Version 2.12.0-29.1.beta

Merge commit '2.12.0-29.0.dev' into beta
diff --git a/.dart_tool/package_config.json b/.dart_tool/package_config.json
index f280248..041bc3f 100644
--- a/.dart_tool/package_config.json
+++ b/.dart_tool/package_config.json
@@ -11,7 +11,7 @@
     "constraint, update this by running tools/generate_package_config.dart."
   ],
   "configVersion": 2,
-  "generated": "2020-10-09T10:15:45.502457",
+  "generated": "2020-10-26T09:42:07.748397",
   "generator": "tools/generate_package_config.dart",
   "packages": [
     {
@@ -124,7 +124,7 @@
       "name": "benchmark_harness",
       "rootUri": "../third_party/pkg/benchmark_harness",
       "packageUri": "lib/",
-      "languageVersion": "2.10"
+      "languageVersion": "2.12"
     },
     {
       "name": "boolean_selector",
@@ -151,6 +151,12 @@
       "languageVersion": "2.0"
     },
     {
+      "name": "clock",
+      "rootUri": "../third_party/pkg/clock",
+      "packageUri": "lib/",
+      "languageVersion": "2.10"
+    },
+    {
       "name": "collection",
       "rootUri": "../third_party/pkg/collection",
       "packageUri": "lib/",
@@ -223,12 +229,6 @@
       "languageVersion": "2.10"
     },
     {
-      "name": "dartfix",
-      "rootUri": "../pkg/dartfix",
-      "packageUri": "lib/",
-      "languageVersion": "2.8"
-    },
-    {
       "name": "dds",
       "rootUri": "../pkg/dds",
       "packageUri": "lib/",
@@ -254,7 +254,8 @@
     {
       "name": "ffi",
       "rootUri": "../third_party/pkg/ffi",
-      "packageUri": "lib/"
+      "packageUri": "lib/",
+      "languageVersion": "2.12"
     },
     {
       "name": "fixnum",
@@ -295,7 +296,7 @@
       "name": "http",
       "rootUri": "../third_party/pkg/http",
       "packageUri": "lib/",
-      "languageVersion": "2.4"
+      "languageVersion": "2.10"
     },
     {
       "name": "http_io",
@@ -313,7 +314,7 @@
       "name": "http_parser",
       "rootUri": "../third_party/pkg/http_parser",
       "packageUri": "lib/",
-      "languageVersion": "2.3"
+      "languageVersion": "2.11"
     },
     {
       "name": "http_retry",
@@ -331,7 +332,7 @@
       "name": "intl",
       "rootUri": "../third_party/pkg/intl",
       "packageUri": "lib/",
-      "languageVersion": "2.5"
+      "languageVersion": "2.11"
     },
     {
       "name": "js",
@@ -377,7 +378,7 @@
       "name": "logging",
       "rootUri": "../third_party/pkg/logging",
       "packageUri": "lib/",
-      "languageVersion": "2.0"
+      "languageVersion": "2.10"
     },
     {
       "name": "markdown",
@@ -443,7 +444,7 @@
       "name": "observatory",
       "rootUri": "../runtime/observatory",
       "packageUri": "lib/",
-      "languageVersion": "2.2"
+      "languageVersion": "2.10"
     },
     {
       "name": "observatory_2",
@@ -454,7 +455,7 @@
     {
       "name": "observatory_test_package",
       "rootUri": "../runtime/observatory/tests/service/observatory_test_package",
-      "languageVersion": "2.7"
+      "languageVersion": "2.9"
     },
     {
       "name": "observatory_test_package_2",
@@ -468,6 +469,11 @@
       "languageVersion": "2.7"
     },
     {
+      "name": "package_deps",
+      "rootUri": "../tools/package_deps",
+      "languageVersion": "2.8"
+    },
+    {
       "name": "path",
       "rootUri": "../third_party/pkg/path",
       "packageUri": "lib/",
@@ -495,7 +501,7 @@
       "name": "pub",
       "rootUri": "../third_party/pkg/pub",
       "packageUri": "lib/",
-      "languageVersion": "2.9"
+      "languageVersion": "2.11"
     },
     {
       "name": "pub_semver",
@@ -504,18 +510,18 @@
       "languageVersion": "2.0"
     },
     {
-      "name": "quiver",
-      "rootUri": "../third_party/pkg/quiver",
-      "packageUri": "lib/",
-      "languageVersion": "2.0"
-    },
-    {
       "name": "resource",
       "rootUri": "../third_party/pkg/resource",
       "packageUri": "lib/",
       "languageVersion": "2.0"
     },
     {
+      "name": "scrape",
+      "rootUri": "../pkg/scrape",
+      "packageUri": "lib/",
+      "languageVersion": "2.10"
+    },
+    {
       "name": "sdk_library_metadata",
       "rootUri": "../sdk/lib/_internal/sdk_library_metadata",
       "packageUri": "lib/"
diff --git a/.gitignore b/.gitignore
index 0ad331e..d7864e2 100644
--- a/.gitignore
+++ b/.gitignore
@@ -103,3 +103,11 @@
 /generated/
 /crash_logs/
 /build/config/gclient_args.gni
+/pkg/front_end/testcases/old_dills/
+/logs.json
+/results.json
+/async_lazy_debug.so
+/dwarf.so
+/dwarf_obfuscate.so
+/il_tmp.txt
+
diff --git a/.packages b/.packages
index ebac358..22dab41 100644
--- a/.packages
+++ b/.packages
@@ -35,7 +35,6 @@
 dart_style:third_party/pkg_tested/dart_style/lib
 dartdev:pkg/dartdev/lib
 dartdoc:third_party/pkg/dartdoc/lib
-dartfix:pkg/dartfix/lib
 dds:pkg/dds/lib
 dev_compiler:pkg/dev_compiler/lib
 diagnostic:pkg/diagnostic/lib
@@ -79,7 +78,6 @@
 protobuf:third_party/pkg/protobuf/protobuf/lib
 pub:third_party/pkg/pub/lib
 pub_semver:third_party/pkg/pub_semver/lib
-quiver:third_party/pkg/quiver/lib
 resource:third_party/pkg/resource/lib
 sdk_library_metadata:sdk/lib/_internal/sdk_library_metadata/lib
 shelf:third_party/pkg/shelf/lib
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 01c6f7a..c1ed2a0 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,14 +1,42 @@
-## 2.11.0
+## 2.12.0
+
+### Language
+
+**Breaking Change** [Null
+Safety](https://dart.dev/null-safety/understanding-null-safety) is now enabled
+by default in all packages with a lower sdk constraint of 2.12.0 or greater.
+Files that are not subject to language versioning (whether because they are not
+contained in a pub package, or because the package that they are contained in
+has no lower sdk constraint) are treated as opted into to null safety by default
+and may report new errors.  Pub packages may be opted out of null safety by
+setting a min sdk constraint in pubspec.yaml of 2.9.0 or less.  Files may be
+opted out of null safety by adding `// @dart=2.9` to the beginning of the file.
 
 ### Core libraries
 
 #### `dart:io`
 
-*   `HttpRequest` will now correctly follow HTTP 308 redirects
-    (`HttpStatus.permanentRedirect`).
+* `HttpRequest` will now correctly follow HTTP 308 redirects
+  (`HttpStatus.permanentRedirect`).
+
+#### `dart:isolate`
+
+* Added `debugName` positional parameter to `ReceivePort` and `RawReceivePort`
+  constructors, a name which can be associated with the port and displayed in
+  tooling.
 
 ### Dart VM
 
+*   **Breaking Change** [#42312][]: `Dart_WeakPersistentHandle`s will no longer
+    auto-delete themselves when the referenced object is garbage collected to
+    avoid race conditions, but they are still automatically deleted when the
+    isolate group shuts down.
+*   **Breaking Change** [#42312][]: `Dart_WeakPersistentHandleFinalizer`
+    is renamed to `Dart_HandleFinalizer` and had its `handle` argument removed.
+    All api functions using that type have been updated.
+
+[#42312]: https://github.com/dart-lang/sdk/issues/42312
+
 ### Dart2JS
 
 * Removed `--no-defer-class-types` and `--no-new-deferred-split`.
@@ -21,13 +49,29 @@
   `--enable-assert-initializers` command line options. These options haven't
   been supported in a while and were no-ops.
 
+#### dartfmt
+
+* Don't duplicate comments on chained if elements.
+* Preserve `?` in initializing formal function-typed parameters.
+
 #### Linter
 
-Updated the Linter to `0.1.121`, which includes:
+Updated the Linter to `0.1.124`, which includes:
 
-# 0.1.121
-
-* Performance improvements to `always_use_package_imports`, 
+* Fixed false positives in `prefer_constructors_over_static_methods`.
+* Updates to `package_names` to allow leading underscores.
+* Fixed NPEs in `unnecessary_null_checks`.
+* A fixed NPE in `missing_whitespace_between_adjacent_strings`.
+* Updates to `void_checks` for NNBD.
+* A fixed range error in `unnecessary_string_escapes`.
+* A fixed false positives in `unnecessary_null_types`.
+* Fixes to `prefer_constructors_over_static_methods` to respect type parameters.
+* Updates to `always_require_non_null_named_parameters` to be NNBD-aware.
+* Updates tp `unnecessary_nullable_for_final_variable_declarations` to allow dynamic.
+* Updates `overridden_fields` to not report on abstract parent fields.
+* Fixes to `unrelated_type_equality_checks` for NNBD.
+* Improvements to `type_init_formals`to allow types not equal to the field type.
+* Performance improvements to `always_use_package_imports`,
   `avoid_renaming_method_parameters`, `prefer_relative_imports` and
   `public_member_api_docs`.
 * (internal): updates to analyzer `0.40.4` APIs
@@ -41,6 +85,61 @@
 * Fixed `unawaited_futures` to handle `Future` subtypes.
 * New lint: `avoid_type_to_string`.
 
+#### Pub
+
+* **Breaking**: The Dart SDK constraint is now **required** in `pubspec.yaml`.
+
+  You now have to include a section like:
+
+  ```yaml
+  environment:
+    sdk: '>=2.10.0 <3.0.0'
+  ```
+
+  See [#44072][].
+* The top level `pub` executable has been deprecated. Use `dart pub` instead.
+  See [dart tool][].
+* New command `dart pub add` that adds  new dependencies to your `pubspec.yaml`.
+  
+  And a corresponding `dart pub remove` that removes dependencies.
+* New option `dart pub outdated --mode=null-safety` that will analyze your
+  dependencies for null-safety.
+* `dart pub publish` will now check your pubspec keys for likely typos.
+* New command `dart pub login` that logs in to pub.dev.
+* The `--server` option to `dart pub publish` and `dart pub uploader` have been
+  deprecated. Use `publish_to` in your `pubspec.yaml` or set the 
+  `$PUB_HOSTED_URL` environment variable.
+
+[#44072]: https://github.com/dart-lang/sdk/issues/44072
+[dart tool]: https://dart.dev/tools/dart-tool
+
+## 2.10.3 - 2020-10-29
+
+This is a patch release that fixes the following issues:
+* breaking changes in Chrome 86 that affect DDC (issues [#43750][] and
+  [#43193][]).
+* compiler error causing incorrect use of positional parameters when named
+  parameters should be used instead (issues [flutter/flutter#65324][] and
+  [flutter/flutter#68092][]).
+* crashes and/or undefined behavor in AOT compiled code (issues [#43770][] and
+  [#43786][]).
+* AOT compilation of classes with more than 64 unboxed fields
+  (issue [flutter/flutter#67803][]).
+
+[#43750]: https://github.com/dart-lang/sdk/issues/43750
+[#43193]: https://github.com/dart-lang/sdk/issues/43193
+[flutter/flutter#65324]: https://github.com/flutter/flutter/issues/65324
+[flutter/flutter#68092]: https://github.com/flutter/flutter/issues/68092
+[#43770]: https://github.com/dart-lang/sdk/issues/43770
+[#43786]: https://github.com/dart-lang/sdk/issues/43786
+[flutter/flutter#67803]: https://github.com/flutter/flutter/issues/67803
+
+## 2.10.2 - 2020-10-15
+
+This is a patch release that fixes a DDC compiler crash (issue [#43589]).
+
+[#43589]: https://github.com/dart-lang/sdk/issues/43589
+
 ## 2.10.1 - 2020-10-06
 
 This is a patch release that fixes the following issues:
diff --git a/DEPS b/DEPS
index 8d44494..51d9353 100644
--- a/DEPS
+++ b/DEPS
@@ -39,18 +39,21 @@
 
   # Checked-in SDK version. The checked-in SDK is a Dart SDK distribution in a
   # cipd package used to run Dart scripts in the build and test infrastructure.
-  "sdk_tag": "version:2.11.0-190.0.dev",
+  "sdk_tag": "version:2.12.0-0.0.dev",
 
   # co19 is a cipd package. Use update.sh in tests/co19[_2] to update these
   # hashes. It requires access to the dart-build-access group, which EngProd
   # has.
-  "co19_rev": "0d84277b464e91f09326292b2943381dfa6056ed",
+  "co19_rev": "de1f3498dff1091b7ca715eb7f831e24ec1a8c64",
   "co19_2_rev": "e48b3090826cf40b8037648f19d211e8eab1b4b6",
 
   # The internal benchmarks to use. See go/dart-benchmarks-internal
-  "benchmarks_internal_rev": "7030a669aa70e2558cdebb3a89b6d11a34d09051",
+  "benchmarks_internal_rev": "354c978979c57e4a76f62e22cf644ed0804f4421",
   "checkout_benchmarks_internal": False,
 
+  # Checkout Android dependencies only on Mac and Linux.
+  "download_android_deps": 'host_os == "mac" or host_os == "linux"',
+
   # As Flutter does, we use Fuchsia's GN and Clang toolchain. These revision
   # should be kept up to date with the revisions pulled by the Flutter engine.
   # The list of revisions for these tools comes from Fuchsia, here:
@@ -66,18 +69,19 @@
 
   # Revisions of /third_party/* dependencies.
   "args_tag": "1.6.0",
-  "async_rev": "38ace5fa83697928d5f29911e346e6311dd00857",
+  "async_rev": "695b3ac280f107c84adf7488743abfdfaaeea68f",
   "bazel_worker_rev": "26680d5e249b249c7216ab2fed0ac8ed4ee285c5",
   "benchmark_harness_rev": "ec6b646f5443faa871e126ac1ba248c94ca06257",
   "boolean_selector_rev": "665e6921ab246569420376f827bff4585dff0b14",
   "boringssl_gen_rev": "429ccb1877f7987a6f3988228bc2440e61293499",
   "boringssl_rev" : "4dfd5af70191b068aebe567b8e29ce108cee85ce",
   "browser-compat-data_tag": "v1.0.22",
-  "charcode_rev": "4a685faba42d86ebd9d661eadd1e79d0a1c34c43",
+  "charcode_rev": "bcd8a12c315b7a83390e4865ad847ecd9344cba2",
   "chrome_rev" : "19997",
-  "cli_util_tag" : "0.2.0",
-  "collection_rev": "52e219581f72a3eac013d6f5550c580962677425",
-  "convert_rev": "c1b01f832835d3d8a06b0b246a361c0eaab35d3c",
+  "cli_util_rev" : "335ed165887d0ec97c2a09173ebf22dcf56a6c4e",
+  "clock_rev" : "a494269254ba978e7ef8f192c5f7fec3fc05b9d3",
+  "collection_rev": "e4bb038ce2d8e66fb15818aa40685c68d53692ab",
+  "convert_rev": "dd3bd28f63be7cb8ab961f38bc73229e4473b555",
   "crypto_rev": "f7c48b334b1386bc5ab0f706fbcd6df8496a87fc",
   "csslib_rev": "6f77b3dcee957d3e2d5083f666221a220e9ed1f1",
   "dart2js_info_rev" : "0632a623b08e1f601c7eba99e0186a581ae799e9",
@@ -94,29 +98,29 @@
   #     and land the review.
   #
   # For more details, see https://github.com/dart-lang/sdk/issues/30164
-  "dart_style_tag": "1.3.7",  # Please see the note above before updating.
+"dart_style_tag": "1.3.9",  # Please see the note above before updating.
 
   "chromedriver_tag": "83.0.4103.39",
-  "dartdoc_rev" : "8f5f30e58bbc0f11f104888ee87f11cbd6b82cc7",
-  "ffi_rev": "454ab0f9ea6bd06942a983238d8a6818b1357edb",
+  "dartdoc_rev" : "6935dcd8f2d78cf1797e6365b4b71505e6579659",
+  "ffi_rev": "a90bd424116fb6f416337db67425171f2dc4c98f",
   "fixnum_rev": "16d3890c6dc82ca629659da1934e412292508bba",
   "glob_rev": "e9f4e6b7ae8abe5071461cf8f47191bb19cf7ef6",
   "html_rev": "22f17e97fedeacaa1e945cf84d8016284eed33a6",
   "http_io_rev": "2fa188caf7937e313026557713f7feffedd4978b",
   "http_multi_server_rev" : "ea269f79321d659208402088f3297e8920a88ee6",
-  "http_parser_rev": "6e63a97b5aaa2b4d1215fe01683e51fb73258e54",
+  "http_parser_rev": "5dd4d16693242049dfb43b5efa429fedbf932e98",
   "http_retry_tag": "0.1.1",
-  "http_rev": "ca418355b5fc60cf981de3bd7364ec0dd943fa8f",
+  "http_rev": "a8efbef05a58919dc7aa2dab42198334f2459ffb",
   "http_throttle_tag" : "1.0.2",
   "icu_rev" : "79326efe26e5440f530963704c3c0ff965b3a4ac",
   "idl_parser_rev": "5fb1ebf49d235b5a70c9f49047e83b0654031eb7",
-  "intl_tag": "0.16.1",
+  "intl_tag": "0.17.0-nullsafety",
   "jinja2_rev": "2222b31554f03e62600cd7e383376a7c187967a1",
   "json_rpc_2_rev": "8f189db8f0c299187a0e8fa959dba7e9b0254be5",
-  "linter_tag": "0.1.121",
-  "logging_rev": "1590ba0b648a51e7eb3895c612e4b72f72623b6f",
+  "linter_tag": "0.1.124",
+  "logging_rev": "9d2a7fdd05b09bc06474881152b5baaf38fd1329",
   "markupsafe_rev": "8f45f5cfa0009d2a70589bcda0349b8cb2b72783",
-  "markdown_rev": "dbeafd47759e7dd0a167602153bb9c49fb5e5fe7",
+  "markdown_rev": "6f89681d59541ddb1cf3a58efbdaa2304ffc3f51",
   "matcher_rev": "9cae8faa7868bf3a88a7ba45eb0bd128e66ac515",
   "mime_tag": "0.9.7",
   "mockito_rev": "d39ac507483b9891165e422ec98d9fb480037c8b",
@@ -128,12 +132,11 @@
   "ply_rev": "604b32590ffad5cbb82e4afef1d305512d06ae93",
   "pool_rev": "eedbd5fde84f9a1a8da643b475305a81841da599",
   "protobuf_rev": "3746c8fd3f2b0147623a8e3db89c3ff4330de760",
-  "pub_rev": "04e237f78b2302d7f20d0b362554425e8deb8add",
+  "pub_rev": "b10966c6a8ad7d95c2023b7842fa2697001d2fdf",
   "pub_semver_tag": "v1.4.4",
-  "quiver-dart_tag": "246e754fe45cecb6aa5f3f13b4ed61037ff0d784",
-  "resource_rev": "f8e37558a1c4f54550aa463b88a6a831e3e33cd6",
+  "resource_rev": "6b79867d0becf5395e5819a75720963b8298e9a7",
   "root_certificates_rev": "7e5ec82c99677a2e5b95ce296c4d68b0d3378ed8",
-  "rust_revision": "cbe7c5ce705896d4e22bf6096590bc1f17993b78",
+  "rust_revision": "b7856f695d65a8ebc846754f97d15814bcb1c244",
   "shelf_static_rev": "v0.2.8",
   "shelf_packages_handler_tag": "2.0.0",
   "shelf_proxy_tag": "0.1.0+7",
@@ -142,11 +145,11 @@
   "source_map_stack_trace_rev": "1c3026f69d9771acf2f8c176a1ab750463309cce",
   "source_maps-0.9.4_rev": "38524",
   "source_maps_rev": "53eb92ccfe6e64924054f83038a534b959b12b3e",
-  "source_span_rev": "cc7c4288a83f71ecef3414199947b52a8c112c65",
+  "source_span_rev": "49ff31eabebed0da0ae6634124f8ba5c6fbf57f1",
   "sse_tag": "e5cf68975e8e87171a3dc297577aa073454a91dc",
-  "stack_trace_tag": "45319bfd2a6da228d8c32b06e1da02ad199373c7",
+  "stack_trace_tag": "6788afc61875079b71b3d1c3e65aeaa6a25cbc2f",
   "stagehand_tag": "v3.3.9",
-  "stream_channel_tag": "c446774fd077c9bdbd6235a7aadc661ef60a9727",
+  "stream_channel_tag": "d7251e61253ec389ee6e045ee1042311bced8f1d",
   "string_scanner_rev": "1b63e6e5db5933d7be0a45da6e1129fe00262734",
   "sync_http_rev": "a85d7ec764ea485cbbc49f3f3e7f1b43f87a1c74",
   "test_descriptor_tag": "1.1.1",
@@ -158,7 +161,7 @@
   "typed_data_tag": "f94fc57b8e8c0e4fe4ff6cfd8290b94af52d3719",
   "usage_tag": "3.4.0",
   "vector_math_rev": "0c9f5d68c047813a6dcdeb88ba7a42daddf25025",
-  "watcher_rev": "fc3c9aae5d31d707b3013b42634dde8d8a1161b4",
+  "watcher_rev": "64e254eba16f56d41f10d72c0b1cb24e130e1f8b",
   "webdriver_rev": "5a8d6805d9cf8a3cbb4fcd64849b538b7491e50e",
   "web_components_rev": "8f57dac273412a7172c8ade6f361b407e2e4ed02",
   "web_socket_channel_rev": "490061ef0e22d3c8460ad2802f9948219365ad6b",
@@ -312,7 +315,9 @@
   Var("dart_root") + "/third_party/pkg/charcode":
       Var("dart_git") + "charcode.git" + "@" + Var("charcode_rev"),
   Var("dart_root") + "/third_party/pkg/cli_util":
-      Var("dart_git") + "cli_util.git" + "@" + Var("cli_util_tag"),
+      Var("dart_git") + "cli_util.git" + "@" + Var("cli_util_rev"),
+  Var("dart_root") + "/third_party/pkg/clock":
+      Var("dart_git") + "clock.git" + "@" + Var("clock_rev"),
   Var("dart_root") + "/third_party/pkg/collection":
       Var("dart_git") + "collection.git" + "@" + Var("collection_rev"),
   Var("dart_root") + "/third_party/pkg/convert":
@@ -387,10 +392,6 @@
       Var("dart_git") + "pub_semver.git" + "@" + Var("pub_semver_tag"),
   Var("dart_root") + "/third_party/pkg/pub":
       Var("dart_git") + "pub.git" + "@" + Var("pub_rev"),
-  Var("dart_root") + "/third_party/pkg/quiver":
-      Var("chromium_git")
-      + "/external/github.com/google/quiver-dart.git"
-      + "@" + Var("quiver-dart_tag"),
   Var("dart_root") + "/third_party/pkg/resource":
       Var("dart_git") + "resource.git" + "@" + Var("resource_rev"),
   Var("dart_root") + "/third_party/pkg/shelf":
@@ -493,6 +494,61 @@
       "dep_type": "cipd",
   },
 
+  Var("dart_root") + "/third_party/android_tools/ndk": {
+      "packages": [
+          {
+            "package": "flutter/android/ndk/${{platform}}",
+            "version": "version:r21.0.6113669"
+          }
+      ],
+      "condition": "download_android_deps",
+      "dep_type": "cipd",
+  },
+
+  Var("dart_root") + "/third_party/android_tools/sdk/build-tools": {
+      "packages": [
+          {
+            "package": "flutter/android/sdk/build-tools/${{platform}}",
+            "version": "version:30.0.1"
+          }
+      ],
+      "condition": "download_android_deps",
+      "dep_type": "cipd",
+  },
+
+  Var("dart_root") + "/third_party/android_tools/sdk/platform-tools": {
+     "packages": [
+          {
+            "package": "flutter/android/sdk/platform-tools/${{platform}}",
+            "version": "version:29.0.2"
+          }
+      ],
+      "condition": "download_android_deps",
+      "dep_type": "cipd",
+  },
+
+  Var("dart_root") + "/third_party/android_tools/sdk/platforms": {
+      "packages": [
+          {
+            "package": "flutter/android/sdk/platforms",
+            "version": "version:30r3"
+          }
+      ],
+      "condition": "download_android_deps",
+      "dep_type": "cipd",
+  },
+
+  Var("dart_root") + "/third_party/android_tools/sdk/tools": {
+      "packages": [
+          {
+            "package": "flutter/android/sdk/tools/${{platform}}",
+            "version": "version:26.1.1"
+          }
+      ],
+      "condition": "download_android_deps",
+      "dep_type": "cipd",
+  },
+
   Var("dart_root") + "/buildtools/" + Var("host_os") + "-" + Var("host_cpu") + "/rust": {
       "packages": [
           {
@@ -642,11 +698,6 @@
                '--arch', 'arm64'],
   },
   {
-    'name': 'download_android_tools',
-    'pattern': '.',
-    'action': ['python', 'sdk/tools/android/download_android_tools.py'],
-  },
-  {
     'name': 'buildtools',
     'pattern': '.',
     'action': ['python', 'sdk/tools/buildtools/update.py'],
diff --git a/benchmarks/BigIntParsePrint/dart2/BigIntParsePrint.dart b/benchmarks/BigIntParsePrint/dart2/BigIntParsePrint.dart
index f9e05e7..26a796f 100644
--- a/benchmarks/BigIntParsePrint/dart2/BigIntParsePrint.dart
+++ b/benchmarks/BigIntParsePrint/dart2/BigIntParsePrint.dart
@@ -4,6 +4,8 @@
 
 // ignore_for_file: avoid_function_literals_in_foreach_calls
 
+// @dart=2.9
+
 import 'package:benchmark_harness/benchmark_harness.dart';
 import 'package:fixnum/fixnum.dart';
 
diff --git a/benchmarks/BigIntParsePrint/dart2/native_version.dart b/benchmarks/BigIntParsePrint/dart2/native_version.dart
index cfc64fa..9ca0fa0 100644
--- a/benchmarks/BigIntParsePrint/dart2/native_version.dart
+++ b/benchmarks/BigIntParsePrint/dart2/native_version.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart=2.9
+
 abstract class NativeBigIntMethods {
   bool get enabled;
 
diff --git a/benchmarks/BigIntParsePrint/dart2/native_version_dummy.dart b/benchmarks/BigIntParsePrint/dart2/native_version_dummy.dart
index b3b83ecf..9fb7ee6 100644
--- a/benchmarks/BigIntParsePrint/dart2/native_version_dummy.dart
+++ b/benchmarks/BigIntParsePrint/dart2/native_version_dummy.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart=2.9
+
 import 'native_version.dart';
 
 const NativeBigIntMethods nativeBigInt = _DummyMethods();
diff --git a/benchmarks/BigIntParsePrint/dart2/native_version_javascript.dart b/benchmarks/BigIntParsePrint/dart2/native_version_javascript.dart
index e8a6bae..37c1eb9 100644
--- a/benchmarks/BigIntParsePrint/dart2/native_version_javascript.dart
+++ b/benchmarks/BigIntParsePrint/dart2/native_version_javascript.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart=2.9
+
 @JS()
 library native_version_javascript;
 
diff --git a/benchmarks/Calls/dart2/Calls.dart b/benchmarks/Calls/dart2/Calls.dart
index 5b94b2a..32cc0dd 100644
--- a/benchmarks/Calls/dart2/Calls.dart
+++ b/benchmarks/Calls/dart2/Calls.dart
@@ -4,6 +4,8 @@
 
 // Micro-benchmarks for sync/sync*/async/async* functionality.
 
+// @dart=2.9
+
 import 'dart:async';
 
 const int iterationLimitAsync = 200;
diff --git a/benchmarks/Dynamic/dart2/Dynamic.dart b/benchmarks/Dynamic/dart2/Dynamic.dart
index d296f62..c91658d 100644
--- a/benchmarks/Dynamic/dart2/Dynamic.dart
+++ b/benchmarks/Dynamic/dart2/Dynamic.dart
@@ -8,6 +8,8 @@
 // similarly defined functions and closures except that the parameters and
 // return types are all dynamic.
 
+// @dart=2.9
+
 import 'package:benchmark_harness/benchmark_harness.dart';
 
 const int kRepeat = 100;
diff --git a/benchmarks/EventLoopLatencyJson/dart/latency.dart b/benchmarks/EventLoopLatencyJson/dart/latency.dart
index c368802..5da9f4e 100644
--- a/benchmarks/EventLoopLatencyJson/dart/latency.dart
+++ b/benchmarks/EventLoopLatencyJson/dart/latency.dart
@@ -83,13 +83,13 @@
       this.maxRss);
 
   void report(String name) {
-    print('$name.Min(RunTime): $minLatency ms.');
-    print('$name.Avg(RunTime): $avgLatency ms.');
-    print('$name.Percentile50(RunTime): $percentile50th ms.');
-    print('$name.Percentile90(RunTime): $percentile90th ms.');
-    print('$name.Percentile95(RunTime): $percentile95th ms.');
-    print('$name.Percentile99(RunTime): $percentile99th ms.');
-    print('$name.Max(RunTime): $maxLatency ms.');
+    print('$name.Min(RunTimeRaw): $minLatency ms.');
+    print('$name.Avg(RunTimeRaw): $avgLatency ms.');
+    print('$name.Percentile50(RunTimeRaw): $percentile50th ms.');
+    print('$name.Percentile90(RunTimeRaw): $percentile90th ms.');
+    print('$name.Percentile95(RunTimeRaw): $percentile95th ms.');
+    print('$name.Percentile99(RunTimeRaw): $percentile99th ms.');
+    print('$name.Max(RunTimeRaw): $maxLatency ms.');
     print('$name.MaxRss(MemoryUse): $maxRss');
   }
 }
diff --git a/benchmarks/EventLoopLatencyJson/dart2/EventLoopLatencyJson.dart b/benchmarks/EventLoopLatencyJson/dart2/EventLoopLatencyJson.dart
index 7a8c5ee..ff187a2 100644
--- a/benchmarks/EventLoopLatencyJson/dart2/EventLoopLatencyJson.dart
+++ b/benchmarks/EventLoopLatencyJson/dart2/EventLoopLatencyJson.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart=2.9
+
 import 'dart:isolate';
 
 import 'json_benchmark.dart';
diff --git a/benchmarks/EventLoopLatencyJson/dart2/json_benchmark.dart b/benchmarks/EventLoopLatencyJson/dart2/json_benchmark.dart
index c29a5b5..e31c534 100644
--- a/benchmarks/EventLoopLatencyJson/dart2/json_benchmark.dart
+++ b/benchmarks/EventLoopLatencyJson/dart2/json_benchmark.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart=2.9
+
 import 'dart:math';
 import 'dart:convert';
 
diff --git a/benchmarks/EventLoopLatencyJson/dart2/latency.dart b/benchmarks/EventLoopLatencyJson/dart2/latency.dart
index c368802..44ecae6 100644
--- a/benchmarks/EventLoopLatencyJson/dart2/latency.dart
+++ b/benchmarks/EventLoopLatencyJson/dart2/latency.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart=2.9
+
 import 'dart:async';
 import 'dart:io';
 import 'dart:math' as math;
@@ -83,13 +85,13 @@
       this.maxRss);
 
   void report(String name) {
-    print('$name.Min(RunTime): $minLatency ms.');
-    print('$name.Avg(RunTime): $avgLatency ms.');
-    print('$name.Percentile50(RunTime): $percentile50th ms.');
-    print('$name.Percentile90(RunTime): $percentile90th ms.');
-    print('$name.Percentile95(RunTime): $percentile95th ms.');
-    print('$name.Percentile99(RunTime): $percentile99th ms.');
-    print('$name.Max(RunTime): $maxLatency ms.');
+    print('$name.Min(RunTimeRaw): $minLatency ms.');
+    print('$name.Avg(RunTimeRaw): $avgLatency ms.');
+    print('$name.Percentile50(RunTimeRaw): $percentile50th ms.');
+    print('$name.Percentile90(RunTimeRaw): $percentile90th ms.');
+    print('$name.Percentile95(RunTimeRaw): $percentile95th ms.');
+    print('$name.Percentile99(RunTimeRaw): $percentile99th ms.');
+    print('$name.Max(RunTimeRaw): $maxLatency ms.');
     print('$name.MaxRss(MemoryUse): $maxRss');
   }
 }
diff --git a/benchmarks/EventLoopLatencyJson350KB/dart/EventLoopLatencyJson350KB.dart b/benchmarks/EventLoopLatencyJson350KB/dart/EventLoopLatencyJson350KB.dart
new file mode 100644
index 0000000..8ee78dd
--- /dev/null
+++ b/benchmarks/EventLoopLatencyJson350KB/dart/EventLoopLatencyJson350KB.dart
@@ -0,0 +1,34 @@
+// Copyright (c) 2020, 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:isolate';
+
+import 'json_benchmark.dart';
+import 'latency.dart';
+
+main() async {
+  // Start GC pressure from helper isolate.
+  final exitPort = ReceivePort();
+  final exitFuture = exitPort.first;
+  final isolate = await Isolate.spawn(run, null, onExit: exitPort.sendPort);
+
+  // Measure event loop latency.
+  const tickDuration = const Duration(milliseconds: 1);
+  const numberOfTicks = 8 * 1000; // min 8 seconds.
+  final EventLoopLatencyStats stats =
+      await measureEventLoopLatency(tickDuration, numberOfTicks);
+
+  // Kill isolate & wait until it's dead.
+  isolate.kill(priority: Isolate.immediate);
+  await exitFuture;
+
+  // Report event loop latency statistics.
+  stats.report('EventLoopLatencyJson350KB');
+}
+
+void run(dynamic msg) {
+  while (true) {
+    JsonRoundTripBenchmark().run();
+  }
+}
diff --git a/benchmarks/EventLoopLatencyJson350KB/dart/json_benchmark.dart b/benchmarks/EventLoopLatencyJson350KB/dart/json_benchmark.dart
new file mode 100644
index 0000000..5b819ba
--- /dev/null
+++ b/benchmarks/EventLoopLatencyJson350KB/dart/json_benchmark.dart
@@ -0,0 +1,47 @@
+// Copyright (c) 2020, 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:math';
+import 'dart:convert';
+
+class JsonRoundTripBenchmark {
+  void run() {
+    final res = json.decode(jsonData);
+    final out = json.encode(res);
+    if (out[0] != jsonData[0]) {
+      throw 'json conversion error';
+    }
+  }
+}
+
+// Builds around 350 KB of json data - small enough so the decoded object graph
+// fits into new space.
+final String jsonData = () {
+  final rnd = Random(42);
+  dynamic buildTree(int depth) {
+    final int coin = rnd.nextInt(1000);
+    if (depth == 0) {
+      if (coin % 2 == 0) return coin;
+      return 'foo-$coin';
+    }
+
+    if (coin % 2 == 0) {
+      final map = <String, dynamic>{};
+      final int length = rnd.nextInt(19);
+      for (int i = 0; i < length; ++i) {
+        map['bar-$i'] = buildTree(depth - 1);
+      }
+      return map;
+    } else {
+      final list = <dynamic>[];
+      final int length = rnd.nextInt(18);
+      for (int i = 0; i < length; ++i) {
+        list.add(buildTree(depth - 1));
+      }
+      return list;
+    }
+  }
+
+  return json.encode({'data': buildTree(5)});
+}();
diff --git a/benchmarks/EventLoopLatencyJson350KB/dart/latency.dart b/benchmarks/EventLoopLatencyJson350KB/dart/latency.dart
new file mode 100644
index 0000000..5da9f4e
--- /dev/null
+++ b/benchmarks/EventLoopLatencyJson350KB/dart/latency.dart
@@ -0,0 +1,135 @@
+// Copyright (c) 2020, 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:async';
+import 'dart:io';
+import 'dart:math' as math;
+import 'dart:typed_data';
+
+/// Measures event loop responsiveness.
+///
+/// Schedules new timer events, [tickDuration] in the future, and measures how
+/// long it takes for these events to actually arrive.
+///
+/// Runs [numberOfTicks] times before completing with [EventLoopLatencyStats].
+Future<EventLoopLatencyStats> measureEventLoopLatency(
+    Duration tickDuration, int numberOfTicks) {
+  final completer = Completer<EventLoopLatencyStats>();
+
+  final tickDurationInUs = tickDuration.inMicroseconds;
+  final buffer = _TickLatencies(numberOfTicks);
+  final sw = Stopwatch()..start();
+  int lastTimestamp = 0;
+
+  void trigger() {
+    final int currentTimestamp = sw.elapsedMicroseconds;
+
+    // Every tick we missed to schedule we'll add with difference to when we
+    // would've scheduled it and when we became responsive again.
+    bool done = false;
+    while (!done && lastTimestamp < (currentTimestamp - tickDurationInUs)) {
+      done = !buffer.add(currentTimestamp - lastTimestamp - tickDurationInUs);
+      lastTimestamp += tickDurationInUs;
+    }
+
+    if (!done) {
+      lastTimestamp = currentTimestamp;
+      Timer(tickDuration, trigger);
+    } else {
+      completer.complete(buffer.makeStats());
+    }
+  }
+
+  Timer(tickDuration, trigger);
+
+  return completer.future;
+}
+
+/// Result of the event loop latency measurement.
+class EventLoopLatencyStats {
+  /// Minimum latency between scheduling a tick and it's arrival (in ms).
+  final double minLatency;
+
+  /// Average latency between scheduling a tick and it's arrival (in ms).
+  final double avgLatency;
+
+  /// Maximum latency between scheduling a tick and it's arrival (in ms).
+  final double maxLatency;
+
+  /// The 50th percentile (median) (in ms).
+  final double percentile50th;
+
+  /// The 90th percentile (in ms).
+  final double percentile90th;
+
+  /// The 95th percentile (in ms).
+  final double percentile95th;
+
+  /// The 99th percentile (in ms).
+  final double percentile99th;
+
+  /// The maximum RSS of the process.
+  final int maxRss;
+
+  EventLoopLatencyStats(
+      this.minLatency,
+      this.avgLatency,
+      this.maxLatency,
+      this.percentile50th,
+      this.percentile90th,
+      this.percentile95th,
+      this.percentile99th,
+      this.maxRss);
+
+  void report(String name) {
+    print('$name.Min(RunTimeRaw): $minLatency ms.');
+    print('$name.Avg(RunTimeRaw): $avgLatency ms.');
+    print('$name.Percentile50(RunTimeRaw): $percentile50th ms.');
+    print('$name.Percentile90(RunTimeRaw): $percentile90th ms.');
+    print('$name.Percentile95(RunTimeRaw): $percentile95th ms.');
+    print('$name.Percentile99(RunTimeRaw): $percentile99th ms.');
+    print('$name.Max(RunTimeRaw): $maxLatency ms.');
+    print('$name.MaxRss(MemoryUse): $maxRss');
+  }
+}
+
+/// Accumulates tick latencies and makes statistics for it.
+class _TickLatencies {
+  final Uint64List _timestamps;
+  int _index = 0;
+
+  _TickLatencies(int numberOfTicks) : _timestamps = Uint64List(numberOfTicks);
+
+  /// Returns `true` while the buffer has not been filled yet.
+  bool add(int latencyInUs) {
+    _timestamps[_index++] = latencyInUs;
+    return _index < _timestamps.length;
+  }
+
+  EventLoopLatencyStats makeStats() {
+    if (_index != _timestamps.length) {
+      throw 'Buffer has not been fully filled yet.';
+    }
+
+    _timestamps.sort();
+    final length = _timestamps.length;
+    final double avg = _timestamps.fold(0, (int a, int b) => a + b) / length;
+    final int min = _timestamps.fold(0x7fffffffffffffff, math.min);
+    final int max = _timestamps.fold(0, math.max);
+    final percentile50th = _timestamps[50 * length ~/ 100];
+    final percentile90th = _timestamps[90 * length ~/ 100];
+    final percentile95th = _timestamps[95 * length ~/ 100];
+    final percentile99th = _timestamps[99 * length ~/ 100];
+
+    return EventLoopLatencyStats(
+        min / 1000,
+        avg / 1000,
+        max / 1000,
+        percentile50th / 1000,
+        percentile90th / 1000,
+        percentile95th / 1000,
+        percentile99th / 1000,
+        ProcessInfo.maxRss);
+  }
+}
diff --git a/benchmarks/EventLoopLatencyJson350KB/dart2/EventLoopLatencyJson350KB.dart b/benchmarks/EventLoopLatencyJson350KB/dart2/EventLoopLatencyJson350KB.dart
new file mode 100644
index 0000000..64e6721
--- /dev/null
+++ b/benchmarks/EventLoopLatencyJson350KB/dart2/EventLoopLatencyJson350KB.dart
@@ -0,0 +1,36 @@
+// Copyright (c) 2020, 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.
+
+// @dart=2.9
+
+import 'dart:isolate';
+
+import 'json_benchmark.dart';
+import 'latency.dart';
+
+main() async {
+  // Start GC pressure from helper isolate.
+  final exitPort = ReceivePort();
+  final exitFuture = exitPort.first;
+  final isolate = await Isolate.spawn(run, null, onExit: exitPort.sendPort);
+
+  // Measure event loop latency.
+  const tickDuration = const Duration(milliseconds: 1);
+  const numberOfTicks = 8 * 1000; // min 8 seconds.
+  final EventLoopLatencyStats stats =
+      await measureEventLoopLatency(tickDuration, numberOfTicks);
+
+  // Kill isolate & wait until it's dead.
+  isolate.kill(priority: Isolate.immediate);
+  await exitFuture;
+
+  // Report event loop latency statistics.
+  stats.report('EventLoopLatencyJson350KB');
+}
+
+void run(dynamic msg) {
+  while (true) {
+    JsonRoundTripBenchmark().run();
+  }
+}
diff --git a/benchmarks/EventLoopLatencyJson350KB/dart2/json_benchmark.dart b/benchmarks/EventLoopLatencyJson350KB/dart2/json_benchmark.dart
new file mode 100644
index 0000000..ba09949
--- /dev/null
+++ b/benchmarks/EventLoopLatencyJson350KB/dart2/json_benchmark.dart
@@ -0,0 +1,49 @@
+// Copyright (c) 2020, 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.
+
+// @dart=2.9
+
+import 'dart:math';
+import 'dart:convert';
+
+class JsonRoundTripBenchmark {
+  void run() {
+    final res = json.decode(jsonData);
+    final out = json.encode(res);
+    if (out[0] != jsonData[0]) {
+      throw 'json conversion error';
+    }
+  }
+}
+
+// Builds around 350 KB of json data - small enough so the decoded object graph
+// fits into new space.
+final String jsonData = () {
+  final rnd = Random(42);
+  dynamic buildTree(int depth) {
+    final int coin = rnd.nextInt(1000);
+    if (depth == 0) {
+      if (coin % 2 == 0) return coin;
+      return 'foo-$coin';
+    }
+
+    if (coin % 2 == 0) {
+      final map = <String, dynamic>{};
+      final int length = rnd.nextInt(19);
+      for (int i = 0; i < length; ++i) {
+        map['bar-$i'] = buildTree(depth - 1);
+      }
+      return map;
+    } else {
+      final list = <dynamic>[];
+      final int length = rnd.nextInt(18);
+      for (int i = 0; i < length; ++i) {
+        list.add(buildTree(depth - 1));
+      }
+      return list;
+    }
+  }
+
+  return json.encode({'data': buildTree(5)});
+}();
diff --git a/benchmarks/EventLoopLatencyJson350KB/dart2/latency.dart b/benchmarks/EventLoopLatencyJson350KB/dart2/latency.dart
new file mode 100644
index 0000000..44ecae6
--- /dev/null
+++ b/benchmarks/EventLoopLatencyJson350KB/dart2/latency.dart
@@ -0,0 +1,137 @@
+// Copyright (c) 2020, 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.
+
+// @dart=2.9
+
+import 'dart:async';
+import 'dart:io';
+import 'dart:math' as math;
+import 'dart:typed_data';
+
+/// Measures event loop responsiveness.
+///
+/// Schedules new timer events, [tickDuration] in the future, and measures how
+/// long it takes for these events to actually arrive.
+///
+/// Runs [numberOfTicks] times before completing with [EventLoopLatencyStats].
+Future<EventLoopLatencyStats> measureEventLoopLatency(
+    Duration tickDuration, int numberOfTicks) {
+  final completer = Completer<EventLoopLatencyStats>();
+
+  final tickDurationInUs = tickDuration.inMicroseconds;
+  final buffer = _TickLatencies(numberOfTicks);
+  final sw = Stopwatch()..start();
+  int lastTimestamp = 0;
+
+  void trigger() {
+    final int currentTimestamp = sw.elapsedMicroseconds;
+
+    // Every tick we missed to schedule we'll add with difference to when we
+    // would've scheduled it and when we became responsive again.
+    bool done = false;
+    while (!done && lastTimestamp < (currentTimestamp - tickDurationInUs)) {
+      done = !buffer.add(currentTimestamp - lastTimestamp - tickDurationInUs);
+      lastTimestamp += tickDurationInUs;
+    }
+
+    if (!done) {
+      lastTimestamp = currentTimestamp;
+      Timer(tickDuration, trigger);
+    } else {
+      completer.complete(buffer.makeStats());
+    }
+  }
+
+  Timer(tickDuration, trigger);
+
+  return completer.future;
+}
+
+/// Result of the event loop latency measurement.
+class EventLoopLatencyStats {
+  /// Minimum latency between scheduling a tick and it's arrival (in ms).
+  final double minLatency;
+
+  /// Average latency between scheduling a tick and it's arrival (in ms).
+  final double avgLatency;
+
+  /// Maximum latency between scheduling a tick and it's arrival (in ms).
+  final double maxLatency;
+
+  /// The 50th percentile (median) (in ms).
+  final double percentile50th;
+
+  /// The 90th percentile (in ms).
+  final double percentile90th;
+
+  /// The 95th percentile (in ms).
+  final double percentile95th;
+
+  /// The 99th percentile (in ms).
+  final double percentile99th;
+
+  /// The maximum RSS of the process.
+  final int maxRss;
+
+  EventLoopLatencyStats(
+      this.minLatency,
+      this.avgLatency,
+      this.maxLatency,
+      this.percentile50th,
+      this.percentile90th,
+      this.percentile95th,
+      this.percentile99th,
+      this.maxRss);
+
+  void report(String name) {
+    print('$name.Min(RunTimeRaw): $minLatency ms.');
+    print('$name.Avg(RunTimeRaw): $avgLatency ms.');
+    print('$name.Percentile50(RunTimeRaw): $percentile50th ms.');
+    print('$name.Percentile90(RunTimeRaw): $percentile90th ms.');
+    print('$name.Percentile95(RunTimeRaw): $percentile95th ms.');
+    print('$name.Percentile99(RunTimeRaw): $percentile99th ms.');
+    print('$name.Max(RunTimeRaw): $maxLatency ms.');
+    print('$name.MaxRss(MemoryUse): $maxRss');
+  }
+}
+
+/// Accumulates tick latencies and makes statistics for it.
+class _TickLatencies {
+  final Uint64List _timestamps;
+  int _index = 0;
+
+  _TickLatencies(int numberOfTicks) : _timestamps = Uint64List(numberOfTicks);
+
+  /// Returns `true` while the buffer has not been filled yet.
+  bool add(int latencyInUs) {
+    _timestamps[_index++] = latencyInUs;
+    return _index < _timestamps.length;
+  }
+
+  EventLoopLatencyStats makeStats() {
+    if (_index != _timestamps.length) {
+      throw 'Buffer has not been fully filled yet.';
+    }
+
+    _timestamps.sort();
+    final length = _timestamps.length;
+    final double avg = _timestamps.fold(0, (int a, int b) => a + b) / length;
+    final int min = _timestamps.fold(0x7fffffffffffffff, math.min);
+    final int max = _timestamps.fold(0, math.max);
+    final percentile50th = _timestamps[50 * length ~/ 100];
+    final percentile90th = _timestamps[90 * length ~/ 100];
+    final percentile95th = _timestamps[95 * length ~/ 100];
+    final percentile99th = _timestamps[99 * length ~/ 100];
+
+    return EventLoopLatencyStats(
+        min / 1000,
+        avg / 1000,
+        max / 1000,
+        percentile50th / 1000,
+        percentile90th / 1000,
+        percentile95th / 1000,
+        percentile99th / 1000,
+        ProcessInfo.maxRss);
+  }
+}
diff --git a/benchmarks/Example/dart2/Example.dart b/benchmarks/Example/dart2/Example.dart
index bf0f06f..cd5219e 100644
--- a/benchmarks/Example/dart2/Example.dart
+++ b/benchmarks/Example/dart2/Example.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart=2.9
+
 import 'package:benchmark_harness/benchmark_harness.dart';
 
 class Example extends BenchmarkBase {
diff --git a/benchmarks/FfiBoringssl/dart2/FfiBoringssl.dart b/benchmarks/FfiBoringssl/dart2/FfiBoringssl.dart
index 1e12b3d..7db1f91 100644
--- a/benchmarks/FfiBoringssl/dart2/FfiBoringssl.dart
+++ b/benchmarks/FfiBoringssl/dart2/FfiBoringssl.dart
@@ -4,6 +4,8 @@
 
 // Macro-benchmark for ffi with boringssl.
 
+// @dart=2.9
+
 import 'dart:convert';
 import 'dart:ffi';
 import 'dart:typed_data';
diff --git a/benchmarks/FfiBoringssl/dart2/digest.dart b/benchmarks/FfiBoringssl/dart2/digest.dart
index 9af7617..290df60 100644
--- a/benchmarks/FfiBoringssl/dart2/digest.dart
+++ b/benchmarks/FfiBoringssl/dart2/digest.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart=2.9
+
 import 'dart:ffi';
 import 'dart:io';
 
diff --git a/benchmarks/FfiBoringssl/dart2/dlopen_helper.dart b/benchmarks/FfiBoringssl/dart2/dlopen_helper.dart
index 726c181..128bff7 100644
--- a/benchmarks/FfiBoringssl/dart2/dlopen_helper.dart
+++ b/benchmarks/FfiBoringssl/dart2/dlopen_helper.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart=2.9
+
 import 'dart:ffi';
 import 'dart:io';
 
diff --git a/benchmarks/FfiBoringssl/dart2/types.dart b/benchmarks/FfiBoringssl/dart2/types.dart
index 2dd5f76..2c1923b 100644
--- a/benchmarks/FfiBoringssl/dart2/types.dart
+++ b/benchmarks/FfiBoringssl/dart2/types.dart
@@ -4,6 +4,8 @@
 
 // ignore_for_file: camel_case_types
 
+// @dart=2.9
+
 import 'dart:ffi';
 
 /// digest algorithm.
diff --git a/benchmarks/FfiCall/dart2/FfiCall.dart b/benchmarks/FfiCall/dart2/FfiCall.dart
index 1c34bc9..fa67dce 100644
--- a/benchmarks/FfiCall/dart2/FfiCall.dart
+++ b/benchmarks/FfiCall/dart2/FfiCall.dart
@@ -7,6 +7,8 @@
 // These micro benchmarks track the speed of reading and writing C memory from
 // Dart with a specific marshalling and unmarshalling of data.
 
+// @dart=2.9
+
 import 'dart:ffi';
 import 'dart:io';
 
diff --git a/benchmarks/FfiCall/dart2/dlopen_helper.dart b/benchmarks/FfiCall/dart2/dlopen_helper.dart
index 726c181..128bff7 100644
--- a/benchmarks/FfiCall/dart2/dlopen_helper.dart
+++ b/benchmarks/FfiCall/dart2/dlopen_helper.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart=2.9
+
 import 'dart:ffi';
 import 'dart:io';
 
diff --git a/benchmarks/FfiMemory/dart2/FfiMemory.dart b/benchmarks/FfiMemory/dart2/FfiMemory.dart
index 18a510e..11fbea2 100644
--- a/benchmarks/FfiMemory/dart2/FfiMemory.dart
+++ b/benchmarks/FfiMemory/dart2/FfiMemory.dart
@@ -9,6 +9,8 @@
 // These micro benchmarks track the speed of reading and writing C memory from
 // Dart with a specific marshalling and unmarshalling of data.
 
+// @dart=2.9
+
 import 'dart:ffi';
 
 import 'package:ffi/ffi.dart';
diff --git a/benchmarks/FfiStruct/dart2/FfiStruct.dart b/benchmarks/FfiStruct/dart2/FfiStruct.dart
index 6e7e90d..a11e8ab 100644
--- a/benchmarks/FfiStruct/dart2/FfiStruct.dart
+++ b/benchmarks/FfiStruct/dart2/FfiStruct.dart
@@ -7,6 +7,8 @@
 // Only tests a single field because the FfiMemory benchmark already tests loads
 // and stores of different field sizes.
 
+// @dart=2.9
+
 import 'dart:ffi';
 
 import 'package:ffi/ffi.dart';
diff --git a/benchmarks/Isolate/dart2/Isolate.dart b/benchmarks/Isolate/dart2/Isolate.dart
index aba6224..24e102b 100644
--- a/benchmarks/Isolate/dart2/Isolate.dart
+++ b/benchmarks/Isolate/dart2/Isolate.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart=2.9
+
 import 'dart:async';
 import 'dart:isolate';
 import 'dart:typed_data';
diff --git a/benchmarks/IsolateJson/dart2/IsolateJson.dart b/benchmarks/IsolateJson/dart2/IsolateJson.dart
index 4e64477..46ac6ca 100644
--- a/benchmarks/IsolateJson/dart2/IsolateJson.dart
+++ b/benchmarks/IsolateJson/dart2/IsolateJson.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart=2.9
+
 import 'dart:async';
 import 'dart:convert';
 import 'dart:io';
diff --git a/benchmarks/IsolateSpawn/dart2/IsolateSpawn.dart b/benchmarks/IsolateSpawn/dart2/IsolateSpawn.dart
index a754441..96ebfc4 100644
--- a/benchmarks/IsolateSpawn/dart2/IsolateSpawn.dart
+++ b/benchmarks/IsolateSpawn/dart2/IsolateSpawn.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart=2.9
+
 import 'dart:async';
 import 'dart:isolate';
 import 'dart:math';
diff --git a/benchmarks/IsolateSpawn/dart2/helloworld.dart b/benchmarks/IsolateSpawn/dart2/helloworld.dart
index 01af7fa..6b0f191 100644
--- a/benchmarks/IsolateSpawn/dart2/helloworld.dart
+++ b/benchmarks/IsolateSpawn/dart2/helloworld.dart
@@ -1,3 +1,5 @@
+// @dart=2.9
+
 void main() {
   print('Hello, world!');
 }
diff --git a/benchmarks/IsolateSpawnMemory/dart2/IsolateSpawnMemory.dart b/benchmarks/IsolateSpawnMemory/dart2/IsolateSpawnMemory.dart
index 5a13d96..115e705 100644
--- a/benchmarks/IsolateSpawnMemory/dart2/IsolateSpawnMemory.dart
+++ b/benchmarks/IsolateSpawnMemory/dart2/IsolateSpawnMemory.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart=2.9
+
 import 'dart:async';
 import 'dart:developer';
 import 'dart:io';
diff --git a/benchmarks/IsolateSpawnMemory/dart2/helloworld.dart b/benchmarks/IsolateSpawnMemory/dart2/helloworld.dart
index 01af7fa..6b0f191 100644
--- a/benchmarks/IsolateSpawnMemory/dart2/helloworld.dart
+++ b/benchmarks/IsolateSpawnMemory/dart2/helloworld.dart
@@ -1,3 +1,5 @@
+// @dart=2.9
+
 void main() {
   print('Hello, world!');
 }
diff --git a/benchmarks/ListCopy/dart2/ListCopy.dart b/benchmarks/ListCopy/dart2/ListCopy.dart
index acbb5a1..34da1eb 100644
--- a/benchmarks/ListCopy/dart2/ListCopy.dart
+++ b/benchmarks/ListCopy/dart2/ListCopy.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart=2.9
+
 import 'dart:collection';
 import 'dart:typed_data';
 import 'package:benchmark_harness/benchmark_harness.dart';
diff --git a/benchmarks/MD5/dart2/md5.dart b/benchmarks/MD5/dart2/md5.dart
index a65803d..ab0e2d2 100644
--- a/benchmarks/MD5/dart2/md5.dart
+++ b/benchmarks/MD5/dart2/md5.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart=2.9
+
 import 'package:benchmark_harness/benchmark_harness.dart';
 import 'package:convert/convert.dart';
 import 'package:crypto/crypto.dart';
diff --git a/benchmarks/RuntimeType/dart2/RuntimeType.dart b/benchmarks/RuntimeType/dart2/RuntimeType.dart
index fe21b30..1a7b6d6 100644
--- a/benchmarks/RuntimeType/dart2/RuntimeType.dart
+++ b/benchmarks/RuntimeType/dart2/RuntimeType.dart
@@ -7,6 +7,8 @@
 // ignore_for_file: prefer_const_constructors
 // ignore_for_file: avoid_function_literals_in_foreach_calls
 
+// @dart=2.9
+
 import 'dart:typed_data';
 
 import 'package:benchmark_harness/benchmark_harness.dart';
diff --git a/benchmarks/SHA1/dart2/sha1.dart b/benchmarks/SHA1/dart2/sha1.dart
index 4ce65f5..6c5c95a 100644
--- a/benchmarks/SHA1/dart2/sha1.dart
+++ b/benchmarks/SHA1/dart2/sha1.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart=2.9
+
 import 'package:benchmark_harness/benchmark_harness.dart';
 import 'package:convert/convert.dart';
 import 'package:crypto/crypto.dart';
diff --git a/benchmarks/SHA256/dart2/sha256.dart b/benchmarks/SHA256/dart2/sha256.dart
index c138387..dd3cae6 100644
--- a/benchmarks/SHA256/dart2/sha256.dart
+++ b/benchmarks/SHA256/dart2/sha256.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart=2.9
+
 import 'package:benchmark_harness/benchmark_harness.dart';
 import 'package:convert/convert.dart';
 import 'package:crypto/crypto.dart';
diff --git a/benchmarks/SkeletalAnimation/dart2/SkeletalAnimation.dart b/benchmarks/SkeletalAnimation/dart2/SkeletalAnimation.dart
index adda3d3..878993c 100644
--- a/benchmarks/SkeletalAnimation/dart2/SkeletalAnimation.dart
+++ b/benchmarks/SkeletalAnimation/dart2/SkeletalAnimation.dart
@@ -5,6 +5,8 @@
 /// A Dart implementation of two computation kernels used for skeletal
 /// animation.
 
+// @dart=2.9
+
 import 'dart:typed_data';
 
 import 'package:benchmark_harness/benchmark_harness.dart';
diff --git a/benchmarks/SkeletalAnimationSIMD/dart2/SkeletalAnimationSIMD.dart b/benchmarks/SkeletalAnimationSIMD/dart2/SkeletalAnimationSIMD.dart
index fc7727e..5cf3f42 100644
--- a/benchmarks/SkeletalAnimationSIMD/dart2/SkeletalAnimationSIMD.dart
+++ b/benchmarks/SkeletalAnimationSIMD/dart2/SkeletalAnimationSIMD.dart
@@ -5,6 +5,8 @@
 /// A Dart implementation of two computation kernels used for skeletal
 /// animation. SIMD version.
 
+// @dart=2.9
+
 import 'dart:typed_data';
 
 import 'package:benchmark_harness/benchmark_harness.dart';
diff --git a/benchmarks/SoundSplayTreeSieve/dart2/SoundSplayTreeSieve.dart b/benchmarks/SoundSplayTreeSieve/dart2/SoundSplayTreeSieve.dart
index dfed86c..5c672d4 100644
--- a/benchmarks/SoundSplayTreeSieve/dart2/SoundSplayTreeSieve.dart
+++ b/benchmarks/SoundSplayTreeSieve/dart2/SoundSplayTreeSieve.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart=2.9
+
 import 'dart:collection';
 import 'dart:typed_data';
 
diff --git a/benchmarks/SoundSplayTreeSieve/dart2/iterable.dart b/benchmarks/SoundSplayTreeSieve/dart2/iterable.dart
index 6870a3b..3bbdcfa6 100644
--- a/benchmarks/SoundSplayTreeSieve/dart2/iterable.dart
+++ b/benchmarks/SoundSplayTreeSieve/dart2/iterable.dart
@@ -1,5 +1,8 @@
 /// Marker interface for [Iterable] subclasses that have an efficient
 /// [length] implementation.
+
+// @dart=2.9
+
 abstract class EfficientLengthIterable<T> extends Iterable<T> {
   const EfficientLengthIterable();
 
diff --git a/benchmarks/SoundSplayTreeSieve/dart2/sound_splay_tree.dart b/benchmarks/SoundSplayTreeSieve/dart2/sound_splay_tree.dart
index dd952f3..6494a14 100644
--- a/benchmarks/SoundSplayTreeSieve/dart2/sound_splay_tree.dart
+++ b/benchmarks/SoundSplayTreeSieve/dart2/sound_splay_tree.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart=2.9
+
 import 'dart:collection';
 import 'iterable.dart';
 
diff --git a/benchmarks/TypedDataDuplicate/dart2/TypedDataDuplicate.dart b/benchmarks/TypedDataDuplicate/dart2/TypedDataDuplicate.dart
index d9fb31a..6fc2068 100644
--- a/benchmarks/TypedDataDuplicate/dart2/TypedDataDuplicate.dart
+++ b/benchmarks/TypedDataDuplicate/dart2/TypedDataDuplicate.dart
@@ -4,6 +4,8 @@
 
 // Micro-benchmarks for copying typed data lists.
 
+// @dart=2.9
+
 import 'dart:typed_data';
 
 import 'package:benchmark_harness/benchmark_harness.dart';
diff --git a/benchmarks/Utf8Decode/dart2/Utf8Decode.dart b/benchmarks/Utf8Decode/dart2/Utf8Decode.dart
index 7be3a8f..03c87ed 100644
--- a/benchmarks/Utf8Decode/dart2/Utf8Decode.dart
+++ b/benchmarks/Utf8Decode/dart2/Utf8Decode.dart
@@ -4,6 +4,8 @@
 //
 // Benchmark for UTF-8 decoding
 
+// @dart=2.9
+
 import 'dart:convert';
 import 'dart:typed_data';
 
diff --git a/benchmarks/Utf8Decode/dart2/datext_latin1_10k.dart b/benchmarks/Utf8Decode/dart2/datext_latin1_10k.dart
index bce6c80..4e13b7e 100644
--- a/benchmarks/Utf8Decode/dart2/datext_latin1_10k.dart
+++ b/benchmarks/Utf8Decode/dart2/datext_latin1_10k.dart
@@ -7,6 +7,8 @@
 // The material is licensed under the Creative Commons Attribution-Share-Alike
 // License 3.0: https://creativecommons.org/licenses/by-sa/3.0/
 
+// @dart=2.9
+
 const String da = '''
 Anders And
 
diff --git a/benchmarks/Utf8Decode/dart2/entext_ascii_10k.dart b/benchmarks/Utf8Decode/dart2/entext_ascii_10k.dart
index 82cb721..d7da461 100644
--- a/benchmarks/Utf8Decode/dart2/entext_ascii_10k.dart
+++ b/benchmarks/Utf8Decode/dart2/entext_ascii_10k.dart
@@ -7,6 +7,8 @@
 // The material is licensed under the Creative Commons Attribution-Share-Alike
 // License 3.0: https://creativecommons.org/licenses/by-sa/3.0/
 
+// @dart=2.9
+
 const String en = '''
 Anarchism
 
diff --git a/benchmarks/Utf8Decode/dart2/netext_3_10k.dart b/benchmarks/Utf8Decode/dart2/netext_3_10k.dart
index 8fce550..1538945d 100644
--- a/benchmarks/Utf8Decode/dart2/netext_3_10k.dart
+++ b/benchmarks/Utf8Decode/dart2/netext_3_10k.dart
@@ -7,6 +7,8 @@
 // The material is licensed under the Creative Commons Attribution-Share-Alike
 // License 3.0: https://creativecommons.org/licenses/by-sa/3.0/
 
+// @dart=2.9
+
 const String ne = '''
 नेपाल
 
diff --git a/benchmarks/Utf8Decode/dart2/rutext_2_10k.dart b/benchmarks/Utf8Decode/dart2/rutext_2_10k.dart
index c61a665..55295d7 100644
--- a/benchmarks/Utf8Decode/dart2/rutext_2_10k.dart
+++ b/benchmarks/Utf8Decode/dart2/rutext_2_10k.dart
@@ -7,6 +7,8 @@
 // The material is licensed under the Creative Commons Attribution-Share-Alike
 // License 3.0: https://creativecommons.org/licenses/by-sa/3.0/
 
+// @dart=2.9
+
 const String ru = '''
 Литва
 
diff --git a/benchmarks/Utf8Decode/dart2/sktext_10k.dart b/benchmarks/Utf8Decode/dart2/sktext_10k.dart
index 7dc2d13..198c274 100644
--- a/benchmarks/Utf8Decode/dart2/sktext_10k.dart
+++ b/benchmarks/Utf8Decode/dart2/sktext_10k.dart
@@ -7,6 +7,8 @@
 // The material is licensed under the Creative Commons Attribution-Share-Alike
 // License 3.0: https://creativecommons.org/licenses/by-sa/3.0/
 
+// @dart=2.9
+
 const String sk = '''
 Esperanto (pôvodne Lingvo Internacia – „medzinárodný jazyk“) je najrozšírenejší medzinárodný plánový jazyk. Názov je odvodený od pseudonymu, pod ktorým v roku 1887 zverejnil lekár L. L. Zamenhof základy tohto jazyka. Zámerom tvorcu bolo vytvoriť ľahko naučiteľný a použiteľný neutrálny jazyk, vhodný na použitie v medzinárodnej komunikácii. Cieľom nebolo nahradiť národné jazyky, čo bolo neskôr aj deklarované v Boulonskej deklarácii.
 
diff --git a/benchmarks/Utf8Decode/dart2/zhtext_10k.dart b/benchmarks/Utf8Decode/dart2/zhtext_10k.dart
index b5e2a54..20e50d9 100644
--- a/benchmarks/Utf8Decode/dart2/zhtext_10k.dart
+++ b/benchmarks/Utf8Decode/dart2/zhtext_10k.dart
@@ -7,6 +7,8 @@
 // The material is licensed under the Creative Commons Attribution-Share-Alike
 // License 3.0: https://creativecommons.org/licenses/by-sa/3.0/
 
+// @dart=2.9
+
 const String zh = '''
 最簡單的漢字只有一笔画,但卻不止一個字:除了「一」字以外,「乙」、「〇」、「丶」、「丨」、「亅」、「丿」、「乀」、「乁」、「𠄌」、「𠃋」、「𠃉」、「𠃊」、「乚」等都是漢字,而且都有各自的讀音。
 
diff --git a/benchmarks/Utf8Encode/dart2/Utf8Encode.dart b/benchmarks/Utf8Encode/dart2/Utf8Encode.dart
index 71ca4c9..1d6e35a 100644
--- a/benchmarks/Utf8Encode/dart2/Utf8Encode.dart
+++ b/benchmarks/Utf8Encode/dart2/Utf8Encode.dart
@@ -4,6 +4,8 @@
 //
 // Benchmark for UTF-8 encoding
 
+// @dart=2.9
+
 import 'dart:convert';
 
 import 'package:benchmark_harness/benchmark_harness.dart';
diff --git a/benchmarks/Utf8Encode/dart2/datext_latin1_10k.dart b/benchmarks/Utf8Encode/dart2/datext_latin1_10k.dart
index bce6c80..4e13b7e 100644
--- a/benchmarks/Utf8Encode/dart2/datext_latin1_10k.dart
+++ b/benchmarks/Utf8Encode/dart2/datext_latin1_10k.dart
@@ -7,6 +7,8 @@
 // The material is licensed under the Creative Commons Attribution-Share-Alike
 // License 3.0: https://creativecommons.org/licenses/by-sa/3.0/
 
+// @dart=2.9
+
 const String da = '''
 Anders And
 
diff --git a/benchmarks/Utf8Encode/dart2/entext_ascii_10k.dart b/benchmarks/Utf8Encode/dart2/entext_ascii_10k.dart
index 82cb721..d7da461 100644
--- a/benchmarks/Utf8Encode/dart2/entext_ascii_10k.dart
+++ b/benchmarks/Utf8Encode/dart2/entext_ascii_10k.dart
@@ -7,6 +7,8 @@
 // The material is licensed under the Creative Commons Attribution-Share-Alike
 // License 3.0: https://creativecommons.org/licenses/by-sa/3.0/
 
+// @dart=2.9
+
 const String en = '''
 Anarchism
 
diff --git a/benchmarks/Utf8Encode/dart2/netext_3_10k.dart b/benchmarks/Utf8Encode/dart2/netext_3_10k.dart
index 8fce550..1538945d 100644
--- a/benchmarks/Utf8Encode/dart2/netext_3_10k.dart
+++ b/benchmarks/Utf8Encode/dart2/netext_3_10k.dart
@@ -7,6 +7,8 @@
 // The material is licensed under the Creative Commons Attribution-Share-Alike
 // License 3.0: https://creativecommons.org/licenses/by-sa/3.0/
 
+// @dart=2.9
+
 const String ne = '''
 नेपाल
 
diff --git a/benchmarks/Utf8Encode/dart2/rutext_2_10k.dart b/benchmarks/Utf8Encode/dart2/rutext_2_10k.dart
index c61a665..55295d7 100644
--- a/benchmarks/Utf8Encode/dart2/rutext_2_10k.dart
+++ b/benchmarks/Utf8Encode/dart2/rutext_2_10k.dart
@@ -7,6 +7,8 @@
 // The material is licensed under the Creative Commons Attribution-Share-Alike
 // License 3.0: https://creativecommons.org/licenses/by-sa/3.0/
 
+// @dart=2.9
+
 const String ru = '''
 Литва
 
diff --git a/benchmarks/Utf8Encode/dart2/sktext_10k.dart b/benchmarks/Utf8Encode/dart2/sktext_10k.dart
index 7dc2d13..198c274 100644
--- a/benchmarks/Utf8Encode/dart2/sktext_10k.dart
+++ b/benchmarks/Utf8Encode/dart2/sktext_10k.dart
@@ -7,6 +7,8 @@
 // The material is licensed under the Creative Commons Attribution-Share-Alike
 // License 3.0: https://creativecommons.org/licenses/by-sa/3.0/
 
+// @dart=2.9
+
 const String sk = '''
 Esperanto (pôvodne Lingvo Internacia – „medzinárodný jazyk“) je najrozšírenejší medzinárodný plánový jazyk. Názov je odvodený od pseudonymu, pod ktorým v roku 1887 zverejnil lekár L. L. Zamenhof základy tohto jazyka. Zámerom tvorcu bolo vytvoriť ľahko naučiteľný a použiteľný neutrálny jazyk, vhodný na použitie v medzinárodnej komunikácii. Cieľom nebolo nahradiť národné jazyky, čo bolo neskôr aj deklarované v Boulonskej deklarácii.
 
diff --git a/benchmarks/Utf8Encode/dart2/zhtext_10k.dart b/benchmarks/Utf8Encode/dart2/zhtext_10k.dart
index b5e2a54..20e50d9 100644
--- a/benchmarks/Utf8Encode/dart2/zhtext_10k.dart
+++ b/benchmarks/Utf8Encode/dart2/zhtext_10k.dart
@@ -7,6 +7,8 @@
 // The material is licensed under the Creative Commons Attribution-Share-Alike
 // License 3.0: https://creativecommons.org/licenses/by-sa/3.0/
 
+// @dart=2.9
+
 const String zh = '''
 最簡單的漢字只有一笔画,但卻不止一個字:除了「一」字以外,「乙」、「〇」、「丶」、「丨」、「亅」、「丿」、「乀」、「乁」、「𠄌」、「𠃋」、「𠃉」、「𠃊」、「乚」等都是漢字,而且都有各自的讀音。
 
diff --git a/build/mac/find_sdk.py b/build/mac/find_sdk.py
index a53ba28..01d0673 100755
--- a/build/mac/find_sdk.py
+++ b/build/mac/find_sdk.py
@@ -107,7 +107,7 @@
     else:
         sdk_dir = os.path.join(out.rstrip(), 'SDKs')
     sdks = [
-        re.findall('^MacOSX(10\.\d+)\.sdk$', s) for s in os.listdir(sdk_dir)
+        re.findall('^MacOSX(1[01]\.\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 = [
diff --git a/docs/process/experimental-flags.md b/docs/process/experimental-flags.md
index 7512875..7f336ce 100644
--- a/docs/process/experimental-flags.md
+++ b/docs/process/experimental-flags.md
@@ -60,9 +60,9 @@
 comma-separated flags. Examples:
 
 ```
-dart --enable-experiment super-mixins
-dart --enable-experiment super-mixins,no-slow-checks,preview-dart3
-dart --enable-experiment super-mixins --enable-experiment no-slow-checks --enable-experiment preview-dart3
+dart --enable-experiment=super-mixins
+dart --enable-experiment=super-mixins,no-slow-checks,preview-dart3
+dart --enable-experiment=super-mixins --enable-experiment no-slow-checks --enable-experiment preview-dart3
 ```
 
 If the user passes a flag that is not recognized (for example, when the flag is
diff --git a/pkg/_fe_analyzer_shared/analysis_options_no_lints.yaml b/pkg/_fe_analyzer_shared/analysis_options_no_lints.yaml
index 583344a..bba3f74 100644
--- a/pkg/_fe_analyzer_shared/analysis_options_no_lints.yaml
+++ b/pkg/_fe_analyzer_shared/analysis_options_no_lints.yaml
@@ -8,6 +8,7 @@
     todo: ignore
   exclude:
     - test/constants/data/**
+    - test/constants/data_2/**
     - test/flow_analysis/assigned_variables/data/**
     - test/flow_analysis/definite_assignment/data/**
     - test/flow_analysis/definite_unassignment/data/**
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 f809b87..e7603a2 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
@@ -389,16 +389,7 @@
   void doStatement_end(Expression condition);
 
   /// Call this method just after visiting a binary `==` or `!=` expression.
-  ///
-  /// Return value indicates whether flow analysis believes that a successful
-  /// equality check is reachable.  If `false` is returned, the client should
-  /// ensure that the `==` test behaves like `x == y && throw ...`.
-  ///
-  /// Note that if `notEqual` is `true`, then the return value describes the
-  /// behavior of the underlying `==` test.  So if `notEqual` is `true` and
-  /// `false` is returned, the client should ensure that the `!=` test behaves
-  /// like `!(x == y && throw ...)`.
-  bool equalityOp_end(Expression wholeExpression, Expression rightOperand,
+  void equalityOp_end(Expression wholeExpression, Expression rightOperand,
       Type rightOperandType,
       {bool notEqual = false});
 
@@ -531,12 +522,7 @@
 
   /// Call this method after visiting the LHS of an if-null expression ("??")
   /// or if-null assignment ("??=").
-  ///
-  /// Return value indicates whether flow analysis believes that the right hand
-  /// side is reachable.  If `false` is returned, the client should ensure that
-  /// `x ?? y` behaves like `x ?? throw ...` (or, correspondingly, that
-  /// `x ??= y` behaves like `x ??= throw ...`).
-  bool ifNullExpression_rightBegin(
+  void ifNullExpression_rightBegin(
       Expression leftHandSide, Type leftHandSideType);
 
   /// Call this method before visiting the condition part of an if statement.
@@ -578,16 +564,7 @@
   /// be the expression to which the "is" check was applied.  [isNot] should be
   /// a boolean indicating whether this is an "is" or an "is!" expression.
   /// [type] should be the type being checked.
-  ///
-  /// Return value indicates whether flow analysis believes that a failure of
-  /// the `is` test is reachable.  If `false` is returned, the client should
-  /// ensure that the `is` test behaves like `x is T || throw ...`.
-  ///
-  /// Note that if `isNot` is `true`, then the return value describes the
-  /// behavior of the underlying `if` test.  So if `isNot` is `true` and `false`
-  /// is returned, the client should ensure that the `is!` test behaves like
-  /// `!(x is T || throw ...)`.
-  bool isExpression_end(
+  void isExpression_end(
       Expression isExpression, Expression subExpression, bool isNot, Type type);
 
   /// Return whether the [variable] is definitely unassigned in the current
@@ -653,13 +630,7 @@
   /// code being analyzed is `x?.y?.z(x)`, [nullAwareAccess_rightBegin] should
   /// be called once upon reaching each `?.`, but [nullAwareAccess_end] should
   /// not be called until after processing the method call to `z(x)`.
-  ///
-  /// Return value indicates whether flow analysis believes that a null target
-  /// is reachable.  If `false` is returned, the client should ensure that
-  /// `x?.y` behaves like `x!.y`.  (Note that this is necessary even if `y`
-  /// exists on `Object`--see
-  /// https://github.com/dart-lang/language/issues/1143#issuecomment-682096575.)
-  bool nullAwareAccess_rightBegin(Expression target, Type targetType);
+  void nullAwareAccess_rightBegin(Expression target, Type targetType);
 
   /// Call this method when encountering an expression that is a `null` literal.
   void nullLiteral(Expression expression);
@@ -923,17 +894,15 @@
   }
 
   @override
-  bool equalityOp_end(Expression wholeExpression, Expression rightOperand,
+  void equalityOp_end(Expression wholeExpression, Expression rightOperand,
       Type rightOperandType,
       {bool notEqual = false}) {
-    return _wrap(
+    _wrap(
         'equalityOp_end($wholeExpression, $rightOperand, $rightOperandType, '
         'notEqual: $notEqual)',
         () => _wrapped.equalityOp_end(
             wholeExpression, rightOperand, rightOperandType,
-            notEqual: notEqual),
-        isQuery: true,
-        isPure: false);
+            notEqual: notEqual));
   }
 
   @override
@@ -1022,14 +991,12 @@
   }
 
   @override
-  bool ifNullExpression_rightBegin(
+  void ifNullExpression_rightBegin(
       Expression leftHandSide, Type leftHandSideType) {
-    return _wrap(
+    _wrap(
         'ifNullExpression_rightBegin($leftHandSide, $leftHandSideType)',
         () => _wrapped.ifNullExpression_rightBegin(
-            leftHandSide, leftHandSideType),
-        isQuery: true,
-        isPure: false);
+            leftHandSide, leftHandSideType));
   }
 
   @override
@@ -1062,14 +1029,12 @@
   }
 
   @override
-  bool isExpression_end(Expression isExpression, Expression subExpression,
+  void isExpression_end(Expression isExpression, Expression subExpression,
       bool isNot, Type type) {
-    return _wrap(
+    _wrap(
         'isExpression_end($isExpression, $subExpression, $isNot, $type)',
-        () =>
-            _wrapped.isExpression_end(isExpression, subExpression, isNot, type),
-        isQuery: true,
-        isPure: false);
+        () => _wrapped.isExpression_end(
+            isExpression, subExpression, isNot, type));
   }
 
   @override
@@ -1141,10 +1106,9 @@
   }
 
   @override
-  bool nullAwareAccess_rightBegin(Expression target, Type targetType) {
-    return _wrap('nullAwareAccess_rightBegin($target, $targetType)',
-        () => _wrapped.nullAwareAccess_rightBegin(target, targetType),
-        isQuery: true, isPure: false);
+  void nullAwareAccess_rightBegin(Expression target, Type targetType) {
+    _wrap('nullAwareAccess_rightBegin($target, $targetType)',
+        () => _wrapped.nullAwareAccess_rightBegin(target, targetType));
   }
 
   @override
@@ -2816,7 +2780,7 @@
   }
 
   @override
-  bool equalityOp_end(Expression wholeExpression, Expression rightOperand,
+  void equalityOp_end(Expression wholeExpression, Expression rightOperand,
       Type rightOperandType,
       {bool notEqual = false}) {
     _EqualityOpContext<Variable, Type> context =
@@ -2824,7 +2788,6 @@
     ExpressionInfo<Variable, Type> lhsInfo = context._conditionInfo;
     Type leftOperandType = context._leftOperandType;
     ExpressionInfo<Variable, Type> rhsInfo = _getExpressionInfo(rightOperand);
-    ExpressionInfo<Variable, Type> equalityInfo;
     TypeClassification leftOperandTypeClassification =
         typeOperations.classifyType(leftOperandType);
     TypeClassification rightOperandTypeClassification =
@@ -2832,7 +2795,6 @@
     if (leftOperandTypeClassification == TypeClassification.nullOrEquivalent &&
         rightOperandTypeClassification == TypeClassification.nullOrEquivalent) {
       booleanLiteral(wholeExpression, !notEqual);
-      return true;
     } else if ((leftOperandTypeClassification ==
                 TypeClassification.nullOrEquivalent &&
             rightOperandTypeClassification == TypeClassification.nonNullable) ||
@@ -2843,23 +2805,21 @@
       // but weak mode it might produce an "equal" result.  We don't want flow
       // analysis behavior to depend on mode, so we conservatively assume that
       // either result is possible.
-      return true;
     } else if (lhsInfo is _NullInfo<Variable, Type> &&
         rhsInfo is _VariableReadInfo<Variable, Type>) {
       assert(
           leftOperandTypeClassification == TypeClassification.nullOrEquivalent);
-      equalityInfo =
+      ExpressionInfo<Variable, Type> equalityInfo =
           _current.tryMarkNonNullable(typeOperations, rhsInfo._variable);
+      _storeExpressionInfo(wholeExpression,
+          notEqual ? equalityInfo : ExpressionInfo.invert(equalityInfo));
     } else if (rhsInfo is _NullInfo<Variable, Type> &&
         lhsInfo is _VariableReadInfo<Variable, Type>) {
-      equalityInfo =
+      ExpressionInfo<Variable, Type> equalityInfo =
           _current.tryMarkNonNullable(typeOperations, lhsInfo._variable);
-    } else {
-      return true;
+      _storeExpressionInfo(wholeExpression,
+          notEqual ? equalityInfo : ExpressionInfo.invert(equalityInfo));
     }
-    _storeExpressionInfo(wholeExpression,
-        notEqual ? equalityInfo : ExpressionInfo.invert(equalityInfo));
-    return true;
   }
 
   @override
@@ -2998,7 +2958,7 @@
   }
 
   @override
-  bool ifNullExpression_rightBegin(
+  void ifNullExpression_rightBegin(
       Expression leftHandSide, Type leftHandSideType) {
     ExpressionInfo<Variable, Type> lhsInfo = _getExpressionInfo(leftHandSide);
     FlowModel<Variable, Type> promoted;
@@ -3012,7 +2972,6 @@
       promoted = _current;
     }
     _stack.add(new _IfNullExpressionContext<Variable, Type>(promoted));
-    return true;
   }
 
   @override
@@ -3057,21 +3016,17 @@
   }
 
   @override
-  bool isExpression_end(Expression isExpression, Expression subExpression,
+  void isExpression_end(Expression isExpression, Expression subExpression,
       bool isNot, Type type) {
     ExpressionInfo<Variable, Type> subExpressionInfo =
         _getExpressionInfo(subExpression);
-    Variable variable;
     if (subExpressionInfo is _VariableReadInfo<Variable, Type>) {
-      variable = subExpressionInfo._variable;
-    } else {
-      return true;
+      ExpressionInfo<Variable, Type> expressionInfo =
+          _current.tryPromoteForTypeCheck(
+              typeOperations, subExpressionInfo._variable, type);
+      _storeExpressionInfo(isExpression,
+          isNot ? ExpressionInfo.invert(expressionInfo) : expressionInfo);
     }
-    ExpressionInfo<Variable, Type> expressionInfo =
-        _current.tryPromoteForTypeCheck(typeOperations, variable, type);
-    _storeExpressionInfo(isExpression,
-        isNot ? ExpressionInfo.invert(expressionInfo) : expressionInfo);
-    return true;
   }
 
   @override
@@ -3177,7 +3132,7 @@
   }
 
   @override
-  bool nullAwareAccess_rightBegin(Expression target, Type targetType) {
+  void nullAwareAccess_rightBegin(Expression target, Type targetType) {
     assert(targetType != null);
     _current = _current.split();
     _stack.add(new _NullAwareAccessContext<Variable, Type>(_current));
@@ -3189,7 +3144,6 @@
             .ifTrue;
       }
     }
-    return true;
   }
 
   @override
diff --git a/pkg/_fe_analyzer_shared/lib/src/messages/codes.dart b/pkg/_fe_analyzer_shared/lib/src/messages/codes.dart
index ddece0f..5d95d3b 100644
--- a/pkg/_fe_analyzer_shared/lib/src/messages/codes.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/messages/codes.dart
@@ -131,9 +131,11 @@
   }
 
   FormattedMessage withFormatting(String formatted, int line, int column,
-      Severity severity, List<FormattedMessage> relatedInformation) {
+      Severity severity, List<FormattedMessage> relatedInformation,
+      {List<Uri> involvedFiles}) {
     return new FormattedMessage(
-        this, formatted, line, column, severity, relatedInformation);
+        this, formatted, line, column, severity, relatedInformation,
+        involvedFiles: involvedFiles);
   }
 
   @override
@@ -173,11 +175,16 @@
 
   final List<FormattedMessage> relatedInformation;
 
+  final List<Uri> involvedFiles;
+
   const FormattedMessage(this.locatedMessage, this.formatted, this.line,
-      this.column, this.severity, this.relatedInformation);
+      this.column, this.severity, this.relatedInformation,
+      {this.involvedFiles});
 
   Code<dynamic> get code => locatedMessage.code;
 
+  String get codeName => code.name;
+
   String get message => locatedMessage.message;
 
   String get tip => locatedMessage.tip;
@@ -212,7 +219,9 @@
       "ansiFormatted": ansiFormatted.toList(),
       "plainTextFormatted": plainTextFormatted.toList(),
       "severity": severity.index,
-      "uri": uri.toString(),
+      "uri": uri?.toString(),
+      "involvedFiles": involvedFiles?.map((u) => u.toString())?.toList(),
+      "codeName": code.name,
     };
   }
 
@@ -234,8 +243,12 @@
 
   final Uri uri;
 
-  DiagnosticMessageFromJson(
-      this.ansiFormatted, this.plainTextFormatted, this.severity, this.uri);
+  final List<Uri> involvedFiles;
+
+  final String codeName;
+
+  DiagnosticMessageFromJson(this.ansiFormatted, this.plainTextFormatted,
+      this.severity, this.uri, this.involvedFiles, this.codeName);
 
   factory DiagnosticMessageFromJson.fromJson(String jsonString) {
     Map<String, Object> decoded = json.decode(jsonString);
@@ -244,10 +257,16 @@
     List<String> plainTextFormatted =
         new List<String>.from(decoded["plainTextFormatted"]);
     Severity severity = Severity.values[decoded["severity"]];
-    Uri uri = Uri.parse(decoded["uri"]);
+    Uri uri = decoded["uri"] == null ? null : Uri.parse(decoded["uri"]);
+    List<Uri> involvedFiles = decoded["involvedFiles"] == null
+        ? null
+        : new List<String>.from(decoded["involvedFiles"])
+            .map((e) => Uri.parse(e))
+            .toList();
+    String codeName = decoded["codeName"];
 
-    return new DiagnosticMessageFromJson(
-        ansiFormatted, plainTextFormatted, severity, uri);
+    return new DiagnosticMessageFromJson(ansiFormatted, plainTextFormatted,
+        severity, uri, involvedFiles, codeName);
   }
 
   Map<String, Object> toJson() {
@@ -256,7 +275,9 @@
       "ansiFormatted": ansiFormatted.toList(),
       "plainTextFormatted": plainTextFormatted.toList(),
       "severity": severity.index,
-      "uri": uri.toString(),
+      "uri": uri?.toString(),
+      "involvedFiles": involvedFiles?.map((u) => u.toString())?.toList(),
+      "codeName": codeName,
     };
   }
 
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 a7d67b8..6bce0eb 100644
--- a/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
@@ -162,6 +162,26 @@
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeAgnosticWithStrongDillLibrary =
+    messageAgnosticWithStrongDillLibrary;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageAgnosticWithStrongDillLibrary = const MessageCode(
+    "AgnosticWithStrongDillLibrary",
+    message:
+        r"""Loaded library is compiled with sound null safety and cannot be used in compilation for agnostic null safety.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeAgnosticWithWeakDillLibrary =
+    messageAgnosticWithWeakDillLibrary;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageAgnosticWithWeakDillLibrary = const MessageCode(
+    "AgnosticWithWeakDillLibrary",
+    message:
+        r"""Loaded library is compiled with unsound null safety and cannot be used in compilation for agnostic null safety.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeAmbiguousExtensionCause = messageAmbiguousExtensionCause;
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -491,15 +511,6 @@
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Null> codeBytecodeLimitExceededTooManyArguments =
-    messageBytecodeLimitExceededTooManyArguments;
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const MessageCode messageBytecodeLimitExceededTooManyArguments =
-    const MessageCode("BytecodeLimitExceededTooManyArguments",
-        message: r"""Dart bytecode limit exceeded: too many arguments.""");
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeCandidateFound = messageCandidateFound;
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -960,6 +971,29 @@
     tip: r"""Try moving the class to the top-level.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<Message Function(String name)> templateClassInNullAwareReceiver =
+    const Template<Message Function(String name)>(
+        messageTemplate: r"""The class '#name' cannot be null.""",
+        tipTemplate: r"""Try replacing '?.' with '.'""",
+        withArguments: _withArgumentsClassInNullAwareReceiver);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String name)> codeClassInNullAwareReceiver =
+    const Code<Message Function(String name)>(
+        "ClassInNullAwareReceiver", templateClassInNullAwareReceiver,
+        severity: Severity.warning);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsClassInNullAwareReceiver(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
+  return new Message(codeClassInNullAwareReceiver,
+      message: """The class '${name}' cannot be null.""",
+      tip: """Try replacing '?.' with '.'""",
+      arguments: {'name': name});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeColonInPlaceOfIn = messageColonInPlaceOfIn;
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -3069,6 +3103,60 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
     Message Function(
+        String
+            string)> templateExperimentDisabled = const Template<
+        Message Function(String string)>(
+    messageTemplate:
+        r"""This requires the '#string' language feature to be enabled.""",
+    tipTemplate:
+        r"""The feature is on by default but is currently disabled, maybe because the '--enable-experiment=no-#string' command line option is passed.""",
+    withArguments: _withArgumentsExperimentDisabled);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String string)> codeExperimentDisabled =
+    const Code<Message Function(String string)>(
+        "ExperimentDisabled", templateExperimentDisabled,
+        analyzerCodes: <String>["ParserErrorCode.EXPERIMENT_NOT_ENABLED"]);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsExperimentDisabled(String string) {
+  if (string.isEmpty) throw 'No string provided';
+  return new Message(codeExperimentDisabled,
+      message:
+          """This requires the '${string}' language feature to be enabled.""",
+      tip:
+          """The feature is on by default but is currently disabled, maybe because the '--enable-experiment=no-${string}' command line option is passed.""",
+      arguments: {'string': string});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<Message Function(String string2)>
+    templateExperimentDisabledInvalidLanguageVersion =
+    const Template<Message Function(String string2)>(
+        messageTemplate:
+            r"""This requires the null safety language feature, which requires language version of #string2 or higher.""",
+        withArguments: _withArgumentsExperimentDisabledInvalidLanguageVersion);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String string2)>
+    codeExperimentDisabledInvalidLanguageVersion =
+    const Code<Message Function(String string2)>(
+        "ExperimentDisabledInvalidLanguageVersion",
+        templateExperimentDisabledInvalidLanguageVersion,
+        analyzerCodes: <String>["ParserErrorCode.EXPERIMENT_NOT_ENABLED"]);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsExperimentDisabledInvalidLanguageVersion(String string2) {
+  if (string2.isEmpty) throw 'No string provided';
+  return new Message(codeExperimentDisabledInvalidLanguageVersion,
+      message:
+          """This requires the null safety language feature, which requires language version of ${string2} or higher.""",
+      arguments: {'string2': string2});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+    Message Function(
         String string,
         String
             string2)> templateExperimentNotEnabled = const Template<
@@ -3667,9 +3755,6 @@
   --omit-platform
     Exclude the platform from the serialized dill file.
 
-  --bytecode
-    Generate bytecode. Supported only for SDK platform compilation.
-
   --exclude-source
     Do not include source code in the dill file.
 
@@ -4585,6 +4670,58 @@
     message: r"""This is the type variable whose bound isn't conformed to.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+    Message Function(
+        String
+            string)> templateIncrementalCompilerIllegalParameter = const Template<
+        Message Function(String string)>(
+    messageTemplate:
+        r"""Illegal parameter name '#string' found during expression compilation.""",
+    withArguments: _withArgumentsIncrementalCompilerIllegalParameter);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String string)>
+    codeIncrementalCompilerIllegalParameter =
+    const Code<Message Function(String string)>(
+  "IncrementalCompilerIllegalParameter",
+  templateIncrementalCompilerIllegalParameter,
+);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsIncrementalCompilerIllegalParameter(String string) {
+  if (string.isEmpty) throw 'No string provided';
+  return new Message(codeIncrementalCompilerIllegalParameter,
+      message:
+          """Illegal parameter name '${string}' found during expression compilation.""",
+      arguments: {'string': string});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<Message Function(String string)>
+    templateIncrementalCompilerIllegalTypeParameter =
+    const Template<Message Function(String string)>(
+        messageTemplate:
+            r"""Illegal type parameter name '#string' found during expression compilation.""",
+        withArguments: _withArgumentsIncrementalCompilerIllegalTypeParameter);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String string)>
+    codeIncrementalCompilerIllegalTypeParameter =
+    const Code<Message Function(String string)>(
+  "IncrementalCompilerIllegalTypeParameter",
+  templateIncrementalCompilerIllegalTypeParameter,
+);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsIncrementalCompilerIllegalTypeParameter(String string) {
+  if (string.isEmpty) throw 'No string provided';
+  return new Message(codeIncrementalCompilerIllegalTypeParameter,
+      message:
+          """Illegal type parameter name '${string}' found during expression compilation.""",
+      arguments: {'string': string});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(Uri uri_)> templateInferredPackageUri =
     const Template<Message Function(Uri uri_)>(
         messageTemplate: r"""Interpreting this as package URI, '#uri'.""",
@@ -5506,6 +5643,14 @@
         r"""Try changing the inline function type (as in 'int f()') to a prefixed function type using the `Function` keyword (as in 'int Function() f').""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeInvalidNnbdDillLibrary = messageInvalidNnbdDillLibrary;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageInvalidNnbdDillLibrary = const MessageCode(
+    "InvalidNnbdDillLibrary",
+    message: r"""Trying to use library with invalid null safety.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(Token token)> templateInvalidOperator =
     const Template<Message Function(Token token)>(
         messageTemplate:
@@ -5785,6 +5930,42 @@
         tip: r"""Try replacing them with named parameters instead.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+    Message Function(
+        String name,
+        String
+            name2)> templateJsInteropDartClassExtendsJSClass = const Template<
+        Message Function(String name, String name2)>(
+    messageTemplate:
+        r"""Dart class '#name' cannot extend JS interop class '#name2'.""",
+    tipTemplate:
+        r"""Try adding the JS interop annotation or removing it from the parent class.""",
+    withArguments: _withArgumentsJsInteropDartClassExtendsJSClass);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String name, String name2)>
+    codeJsInteropDartClassExtendsJSClass =
+    const Code<Message Function(String name, String name2)>(
+  "JsInteropDartClassExtendsJSClass",
+  templateJsInteropDartClassExtendsJSClass,
+);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsJsInteropDartClassExtendsJSClass(
+    String name, String name2) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
+  if (name2.isEmpty) throw 'No name provided';
+  name2 = demangleMixinApplicationName(name2);
+  return new Message(codeJsInteropDartClassExtendsJSClass,
+      message:
+          """Dart class '${name}' cannot extend JS interop class '${name2}'.""",
+      tip:
+          """Try adding the JS interop annotation or removing it from the parent class.""",
+      arguments: {'name': name, 'name2': name2});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeJsInteropEnclosingClassJSAnnotation =
     messageJsInteropEnclosingClassJSAnnotation;
 
@@ -5817,6 +5998,42 @@
     tip: r"""Try replacing with a normal method.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+    Message Function(
+        String name,
+        String
+            name2)> templateJsInteropJSClassExtendsDartClass = const Template<
+        Message Function(String name, String name2)>(
+    messageTemplate:
+        r"""JS interop class '#name' cannot extend Dart class '#name2'.""",
+    tipTemplate:
+        r"""Try removing the JS interop annotation or adding it to the parent class.""",
+    withArguments: _withArgumentsJsInteropJSClassExtendsDartClass);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String name, String name2)>
+    codeJsInteropJSClassExtendsDartClass =
+    const Code<Message Function(String name, String name2)>(
+  "JsInteropJSClassExtendsDartClass",
+  templateJsInteropJSClassExtendsDartClass,
+);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsJsInteropJSClassExtendsDartClass(
+    String name, String name2) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
+  if (name2.isEmpty) throw 'No name provided';
+  name2 = demangleMixinApplicationName(name2);
+  return new Message(codeJsInteropJSClassExtendsDartClass,
+      message:
+          """JS interop class '${name}' cannot extend Dart class '${name2}'.""",
+      tip:
+          """Try removing the JS interop annotation or adding it to the parent class.""",
+      arguments: {'name': name, 'name2': name2});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeJsInteropNamedParameters = messageJsInteropNamedParameters;
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -8497,7 +8714,7 @@
             _names)> templateStrongModeNNBDPackageOptOut = const Template<
         Message Function(List<String> _names)>(
     messageTemplate:
-        r"""Cannot run with sound null safety as one or more dependencies do not
+        r"""This project cannot run with sound null safety, because one or more project dependencies do not
 support null safety:
 
 #names
@@ -8520,7 +8737,7 @@
   String names = itemizeNames(_names);
   return new Message(codeStrongModeNNBDPackageOptOut,
       message:
-          """Cannot run with sound null safety as one or more dependencies do not
+          """This project cannot run with sound null safety, because one or more project dependencies do not
 support null safety:
 
 ${names}
@@ -8531,6 +8748,16 @@
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeStrongWithWeakDillLibrary =
+    messageStrongWithWeakDillLibrary;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageStrongWithWeakDillLibrary = const MessageCode(
+    "StrongWithWeakDillLibrary",
+    message:
+        r"""Loaded library is compiled with unsound null safety and cannot be used in compilation for sound null safety.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeSuperAsExpression = messageSuperAsExpression;
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -8846,6 +9073,16 @@
     message: r"""Expected identifier, but got 'this'.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeThisInNullAwareReceiver = messageThisInNullAwareReceiver;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageThisInNullAwareReceiver = const MessageCode(
+    "ThisInNullAwareReceiver",
+    severity: Severity.warning,
+    message: r"""The receiver 'this' cannot be null.""",
+    tip: r"""Try replacing '?.' with '.'""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String string)>
     templateThisOrSuperAccessInFieldInitializer =
     const Template<Message Function(String string)>(
@@ -9490,6 +9727,16 @@
     tip: r"""Try removing the type arguments.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeWeakWithStrongDillLibrary =
+    messageWeakWithStrongDillLibrary;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageWeakWithStrongDillLibrary = const MessageCode(
+    "WeakWithStrongDillLibrary",
+    message:
+        r"""Loaded library is compiled with sound null safety and cannot be used in compilation for unsound null safety.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
     Message Function(
         String string,
diff --git a/pkg/_fe_analyzer_shared/lib/src/messages/diagnostic_message.dart b/pkg/_fe_analyzer_shared/lib/src/messages/diagnostic_message.dart
index a1d5838..7146258 100644
--- a/pkg/_fe_analyzer_shared/lib/src/messages/diagnostic_message.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/messages/diagnostic_message.dart
@@ -34,13 +34,19 @@
   Iterable<String> get plainTextFormatted;
 
   Severity get severity;
+
+  Iterable<Uri> get involvedFiles;
+
+  String get codeName;
 }
 
 /// This method is subject to change.
 Uri getMessageUri(DiagnosticMessage message) {
   return message is FormattedMessage
       ? message.uri
-      : message is DiagnosticMessageFromJson ? message.uri : null;
+      : message is DiagnosticMessageFromJson
+          ? message.uri
+          : null;
 }
 
 /// This method is subject to change.
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/modifier_context.dart b/pkg/_fe_analyzer_shared/lib/src/parser/modifier_context.dart
index 904871b..3ef7898 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/modifier_context.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/modifier_context.dart
@@ -220,6 +220,12 @@
     assert(optional('abstract', next));
     if (abstractToken == null) {
       abstractToken = next;
+
+      if (varFinalOrConst != null) {
+        reportModifierOutOfOrder(next, varFinalOrConst.lexeme);
+      } else if (covariantToken != null) {
+        reportModifierOutOfOrder(next, covariantToken.lexeme);
+      }
       return next;
     }
 
@@ -308,6 +314,10 @@
         reportModifierOutOfOrder(next, staticToken.lexeme);
       } else if (lateToken != null) {
         reportModifierOutOfOrder(next, lateToken.lexeme);
+      } else if (varFinalOrConst != null) {
+        reportModifierOutOfOrder(next, varFinalOrConst.lexeme);
+      } else if (covariantToken != null) {
+        reportModifierOutOfOrder(next, covariantToken.lexeme);
       }
       return next;
     }
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 9c829d4..6b2b389 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart
@@ -6201,7 +6201,7 @@
       // identifier, then allow ensureIdentifier to report an error
       // and don't report errors here.
       if (varFinalOrConst == null) {
-        if (typeInfo == noType && lateToken == null) {
+        if (typeInfo == noType) {
           reportRecoverableError(next, codes.messageMissingConstFinalVarOrType);
         }
       } else if (optional('var', varFinalOrConst)) {
diff --git a/pkg/_fe_analyzer_shared/pubspec.yaml b/pkg/_fe_analyzer_shared/pubspec.yaml
index 7d75dfd..23f68a1 100644
--- a/pkg/_fe_analyzer_shared/pubspec.yaml
+++ b/pkg/_fe_analyzer_shared/pubspec.yaml
@@ -1,5 +1,5 @@
 name: _fe_analyzer_shared
-version: 11.0.0
+version: 12.0.0
 description: Logic that is shared between the front_end and analyzer packages.
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/_fe_analyzer_shared
 
diff --git a/pkg/_fe_analyzer_shared/test/constants/data/basic.dart b/pkg/_fe_analyzer_shared/test/constants/data/basic.dart
index ec98279..49749ff 100644
--- a/pkg/_fe_analyzer_shared/test/constants/data/basic.dart
+++ b/pkg/_fe_analyzer_shared/test/constants/data/basic.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 const null0 = /*cfe.Null()*/ null;
 const bool0 = /*cfe.Bool(true)*/ true;
 const bool1 = /*cfe.Bool(false)*/ false;
diff --git a/pkg/_fe_analyzer_shared/test/constants/data/errors.dart b/pkg/_fe_analyzer_shared/test/constants/data/errors.dart
index b2026dc..bfd5e95 100644
--- a/pkg/_fe_analyzer_shared/test/constants/data/errors.dart
+++ b/pkg/_fe_analyzer_shared/test/constants/data/errors.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 String method() => 'foo';
 
 const String string0 =
diff --git a/pkg/_fe_analyzer_shared/test/constants/data/function.dart b/pkg/_fe_analyzer_shared/test/constants/data/function.dart
index 296f250..5e1d35d 100644
--- a/pkg/_fe_analyzer_shared/test/constants/data/function.dart
+++ b/pkg/_fe_analyzer_shared/test/constants/data/function.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 T method1<T>(T t) => t;
 Map<T, S> method2<T, S>(T t, S s) => {t: s};
 
diff --git a/pkg/_fe_analyzer_shared/test/constants/data/list.dart b/pkg/_fe_analyzer_shared/test/constants/data/list.dart
index b31cfb5..6af31a0 100644
--- a/pkg/_fe_analyzer_shared/test/constants/data/list.dart
+++ b/pkg/_fe_analyzer_shared/test/constants/data/list.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 const list0 = /*cfe.List<dynamic>()*/ [];
 
 // TODO(johnniwinther): This seems like an odd offset for the constant. It
diff --git a/pkg/_fe_analyzer_shared/test/constants/data/map.dart b/pkg/_fe_analyzer_shared/test/constants/data/map.dart
index c9aafc63..cb84ad3 100644
--- a/pkg/_fe_analyzer_shared/test/constants/data/map.dart
+++ b/pkg/_fe_analyzer_shared/test/constants/data/map.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 const map0 = /*cfe.Map<dynamic,dynamic>()*/ {};
 
 // TODO(johnniwinther): This seems like an odd offset for the constant. It
diff --git a/pkg/_fe_analyzer_shared/test/constants/data/set.dart b/pkg/_fe_analyzer_shared/test/constants/data/set.dart
index 5b4a84d..1e5ecb9 100644
--- a/pkg/_fe_analyzer_shared/test/constants/data/set.dart
+++ b/pkg/_fe_analyzer_shared/test/constants/data/set.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 // ignore: sdk_version_set_literal
 const Set set0 = /*cfe.Set<dynamic>()*/ {};
 
diff --git a/pkg/_fe_analyzer_shared/test/constants/data/type_literals.dart b/pkg/_fe_analyzer_shared/test/constants/data/type_literals.dart
index 7d003ae..f3f9390 100644
--- a/pkg/_fe_analyzer_shared/test/constants/data/type_literals.dart
+++ b/pkg/_fe_analyzer_shared/test/constants/data/type_literals.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 import 'dart:async';
 
 typedef Typedef();
diff --git a/pkg/_fe_analyzer_shared/test/constants/data_2/basic.dart b/pkg/_fe_analyzer_shared/test/constants/data_2/basic.dart
new file mode 100644
index 0000000..73cf78d
--- /dev/null
+++ b/pkg/_fe_analyzer_shared/test/constants/data_2/basic.dart
@@ -0,0 +1,31 @@
+// 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.
+
+// @dart = 2.7
+
+const null0 = /*cfe.Null()*/ null;
+const bool0 = /*cfe.Bool(true)*/ true;
+const bool1 = /*cfe.Bool(false)*/ false;
+const string0 = /*cfe.String(foo)*/ 'foo';
+const int0 = /*cfe.Int(0)*/ 0;
+const double0 = /*cfe.Double(0.5)*/ 0.5;
+const symbol0 = /*cfe.Symbol(foo)*/ #foo;
+const symbol1 = const /*cfe.Symbol(foo)*/ Symbol('foo');
+
+main() {
+  print(/*Null()*/ null0);
+  print(/*Bool(true)*/ bool0);
+  print(/*Bool(false)*/ bool1);
+  print(/*String(foo)*/ string0);
+  print(/*Int(0)*/ int0);
+  print(/*Double(0.5)*/ double0);
+  print(
+      /*cfe|analyzer.Symbol(foo)*/
+      /*dart2js.Instance(Symbol,{_name:String(foo))*/
+      symbol0);
+  print(
+      /*cfe|analyzer.Symbol(foo)*/
+      /*dart2js.Instance(Symbol,{_name:String(foo))*/
+      symbol1);
+}
diff --git a/pkg/_fe_analyzer_shared/test/constants/data_2/errors.dart b/pkg/_fe_analyzer_shared/test/constants/data_2/errors.dart
new file mode 100644
index 0000000..a2c10241
--- /dev/null
+++ b/pkg/_fe_analyzer_shared/test/constants/data_2/errors.dart
@@ -0,0 +1,15 @@
+// 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.
+
+// @dart = 2.7
+
+String method() => 'foo';
+
+const String string0 =
+    /*cfe|dart2js.error: Method invocation is not a constant expression.*/
+    method();
+
+main() {
+  print(string0);
+}
diff --git a/pkg/_fe_analyzer_shared/test/constants/data_2/function.dart b/pkg/_fe_analyzer_shared/test/constants/data_2/function.dart
new file mode 100644
index 0000000..cb18ecf
--- /dev/null
+++ b/pkg/_fe_analyzer_shared/test/constants/data_2/function.dart
@@ -0,0 +1,33 @@
+// 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.
+
+// @dart = 2.7
+
+T method1<T>(T t) => t;
+Map<T, S> method2<T, S>(T t, S s) => {t: s};
+
+const function0 = /*cfe.Function(method1)*/ method1;
+
+const int Function(int) instantiation0 =
+    /*cfe.Instantiation(method1<int>)*/ method1;
+
+const Map<String, int> Function(String, int) instantiation1 =
+    /*cfe.Instantiation(method2<String,int>)*/ method2;
+
+main() {
+  print(
+      /*cfe|dart2js.Function(method1)*/
+      /*analyzer.Function(method1,type=T* Function<T>(T*)*)*/
+      function0);
+  print(
+      /*cfe.Instantiation(method1<int>)*/
+      /*dart2js.Instantiation(method1<int*>)*/
+      /*analyzer.Function(method1,type=int* Function(int*)*)*/
+      instantiation0);
+  print(
+      /*cfe.Instantiation(method2<String,int>)*/
+      /*dart2js.Instantiation(method2<String*,int*>)*/
+      /*analyzer.Function(method2,type=Map<String*, int*>* Function(String*, int*)*)*/
+      instantiation1);
+}
diff --git a/pkg/_fe_analyzer_shared/test/constants/data_2/list.dart b/pkg/_fe_analyzer_shared/test/constants/data_2/list.dart
new file mode 100644
index 0000000..aec2913
--- /dev/null
+++ b/pkg/_fe_analyzer_shared/test/constants/data_2/list.dart
@@ -0,0 +1,29 @@
+// 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.
+
+// @dart = 2.7
+
+const list0 = /*cfe.List<dynamic>()*/ [];
+
+// TODO(johnniwinther): This seems like an odd offset for the constant. It
+// should probably be at the start of the type arguments.
+const list1 = <int> /*cfe.List<int>()*/ [];
+
+const List<int> list2 = /*cfe.List<int>()*/ [];
+
+const list3 = /*cfe.List<int>(Int(42))*/ [42];
+
+const list4 = /*cfe.List<int>(Int(42),Int(87))*/ [42, 87];
+
+main() {
+  print(/*analyzer.List<dynamic>*()*/ /*cfe|dart2js.List<dynamic>()*/ list0);
+  print(
+      /*analyzer.List<int*>*()*/ /*cfe.List<int>()*/ /*dart2js.List<int*>()*/ list1);
+  print(
+      /*analyzer.List<int*>*()*/ /*cfe.List<int>()*/ /*dart2js.List<int*>()*/ list2);
+  print(
+      /*analyzer.List<int*>*(Int(42))*/ /*cfe.List<int>(Int(42))*/ /*dart2js.List<int*>(Int(42))*/ list3);
+  print(
+      /*analyzer.List<int*>*(Int(42),Int(87))*/ /*cfe.List<int>(Int(42),Int(87))*/ /*dart2js.List<int*>(Int(42),Int(87))*/ list4);
+}
diff --git a/pkg/_fe_analyzer_shared/test/constants/data_2/map.dart b/pkg/_fe_analyzer_shared/test/constants/data_2/map.dart
new file mode 100644
index 0000000..b3b762e
--- /dev/null
+++ b/pkg/_fe_analyzer_shared/test/constants/data_2/map.dart
@@ -0,0 +1,31 @@
+// 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.
+
+// @dart = 2.7
+
+const map0 = /*cfe.Map<dynamic,dynamic>()*/ {};
+
+// TODO(johnniwinther): This seems like an odd offset for the constant. It
+// should probably be at the start of the type arguments.
+const map1 = <String, int> /*cfe.Map<String,int>()*/ {};
+
+const Map<String, int> map2 = /*cfe.Map<String,int>()*/ {};
+
+const map3 = /*cfe.Map<String,int>(String(foo):Int(42))*/ {'foo': 42};
+
+const map4 = /*cfe.Map<String,int>(String(foo):Int(42),String(bar):Int(87))*/
+    {'foo': 42, 'bar': 87};
+
+main() {
+  print(
+      /*analyzer.Map<dynamic, dynamic>*()*/ /*cfe|dart2js.Map<dynamic,dynamic>()*/ map0);
+  print(
+      /*analyzer.Map<String*, int*>*()*/ /*cfe.Map<String,int>()*/ /*dart2js.Map<String*,int*>()*/ map1);
+  print(
+      /*analyzer.Map<String*, int*>*()*/ /*cfe.Map<String,int>()*/ /*dart2js.Map<String*,int*>()*/ map2);
+  print(
+      /*analyzer.Map<String*, int*>*(String(foo):Int(42))*/ /*cfe.Map<String,int>(String(foo):Int(42))*/ /*dart2js.Map<String*,int*>(String(foo):Int(42))*/ map3);
+  print(
+      /*analyzer.Map<String*, int*>*(String(foo):Int(42),String(bar):Int(87))*/ /*cfe.Map<String,int>(String(foo):Int(42),String(bar):Int(87))*/ /*dart2js.Map<String*,int*>(String(foo):Int(42),String(bar):Int(87))*/ map4);
+}
diff --git a/pkg/_fe_analyzer_shared/test/constants/data_2/marker.options b/pkg/_fe_analyzer_shared/test/constants/data_2/marker.options
new file mode 100644
index 0000000..96fd026
--- /dev/null
+++ b/pkg/_fe_analyzer_shared/test/constants/data_2/marker.options
@@ -0,0 +1,3 @@
+cfe=pkg/front_end/test/id_tests/constant_test.dart
+analyzer=pkg/analyzer/test/id_tests/constant_test.dart
+dart2js=pkg/compiler/test/model/cfe_constant_test.dart
diff --git a/pkg/_fe_analyzer_shared/test/constants/data_2/set.dart b/pkg/_fe_analyzer_shared/test/constants/data_2/set.dart
new file mode 100644
index 0000000..7c4eed7
--- /dev/null
+++ b/pkg/_fe_analyzer_shared/test/constants/data_2/set.dart
@@ -0,0 +1,34 @@
+// 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.
+
+// @dart = 2.7
+
+// ignore: sdk_version_set_literal
+const Set set0 = /*cfe.Set<dynamic>()*/ {};
+
+// TODO(johnniwinther): This seems like an odd offset for the constant. It
+// should probably be at the start of the type arguments.
+// ignore: sdk_version_set_literal
+const set1 = <int> /*cfe.Set<int>()*/ {};
+
+// ignore: sdk_version_set_literal
+const Set<int> set2 = /*cfe.Set<int>()*/ {};
+
+// ignore: sdk_version_set_literal
+const set3 = /*cfe.Set<int>(Int(42))*/ {42};
+
+// ignore: sdk_version_set_literal
+const set4 = /*cfe.Set<int>(Int(42),Int(87))*/ {42, 87};
+
+main() {
+  print(/*analyzer.Set<dynamic>*()*/ /*cfe|dart2js.Set<dynamic>()*/ set0);
+  print(
+      /*analyzer.Set<int*>*()*/ /*cfe.Set<int>()*/ /*dart2js.Set<int*>()*/ set1);
+  print(
+      /*analyzer.Set<int*>*()*/ /*cfe.Set<int>()*/ /*dart2js.Set<int*>()*/ set2);
+  print(
+      /*analyzer.Set<int*>*(Int(42))*/ /*cfe.Set<int>(Int(42))*/ /*dart2js.Set<int*>(Int(42))*/ set3);
+  print(
+      /*analyzer.Set<int*>*(Int(42),Int(87))*/ /*cfe.Set<int>(Int(42),Int(87))*/ /*dart2js.Set<int*>(Int(42),Int(87))*/ set4);
+}
diff --git a/pkg/_fe_analyzer_shared/test/constants/data_2/type_literals.dart b/pkg/_fe_analyzer_shared/test/constants/data_2/type_literals.dart
new file mode 100644
index 0000000..6754f1c
--- /dev/null
+++ b/pkg/_fe_analyzer_shared/test/constants/data_2/type_literals.dart
@@ -0,0 +1,59 @@
+// 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.
+
+// @dart = 2.7
+
+import 'dart:async';
+
+typedef Typedef();
+typedef GenericTypedef<T> = void Function(T);
+typedef GenericFunctionTypedef = void Function<T>(T);
+typedef TypedefWithFutureOr = void Function<T>(FutureOr<T>);
+
+const typedef = /*cfe.TypeLiteral(dynamic Function())*/ Typedef;
+const genericTypedef =
+    /*cfe.TypeLiteral(void Function(dynamic))*/ GenericTypedef;
+const genericFunctionTypedef =
+    /*cfe.TypeLiteral(void Function<T>(T))*/ GenericFunctionTypedef;
+const typedefWithFutureOr =
+    /*cfe.TypeLiteral(void Function<T>(FutureOr<T>))*/ TypedefWithFutureOr;
+const futureOr = /*cfe.TypeLiteral(FutureOr<dynamic>)*/ FutureOr;
+const null_ = /*cfe.TypeLiteral(Null)*/ Null;
+
+main() {
+  print(
+      /*analyzer.TypeLiteral(dynamic Function()*)*/
+      /*cfe.TypeLiteral(dynamic Function())*/
+      /*dart2js.TypeLiteral(()->dynamic)*/
+      typedef);
+
+  print(
+      /*analyzer.TypeLiteral(void Function(dynamic)*)*/
+      /*cfe.TypeLiteral(void Function(dynamic))*/
+      /*dart2js.TypeLiteral((dynamic)->void)*/
+      genericTypedef);
+
+  print(
+      /*analyzer.TypeLiteral(void Function<T>(T*)*)*/
+      /*cfe.TypeLiteral(void Function<T>(T))*/
+      /*dart2js.TypeLiteral((0)->void)*/
+      genericFunctionTypedef);
+
+  print(
+      /*analyzer.TypeLiteral(void Function<T>(FutureOr<T*>*)*)*/
+      /*cfe.TypeLiteral(void Function<T>(FutureOr<T>))*/
+      /*dart2js.TypeLiteral((FutureOr<0>)->void)*/
+      typedefWithFutureOr);
+
+  print(
+      /*analyzer.TypeLiteral(FutureOr<dynamic>*)*/
+      /*cfe.TypeLiteral(FutureOr<dynamic>)*/
+      /*dart2js.TypeLiteral(dynamic)*/
+      futureOr);
+
+  print(
+      /*analyzer.TypeLiteral(Null*)*/
+      /*cfe|dart2js.TypeLiteral(Null)*/
+      null_);
+}
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 8b5ee79..02d3307 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
@@ -189,9 +189,7 @@
         var nullExpr = _Expression();
         flow.nullLiteral(nullExpr);
         var expr = _Expression();
-        var successIsReachable =
-            flow.equalityOp_end(expr, nullExpr, _Type('Null'), notEqual: true);
-        expect(successIsReachable, true);
+        flow.equalityOp_end(expr, nullExpr, _Type('Null'), notEqual: true);
         flow.ifStatement_thenBegin(expr);
         expect(flow.isReachable, true);
         expect(flow.promotedType(x).type, 'int');
@@ -214,11 +212,7 @@
         var nullExpr = _Expression();
         flow.nullLiteral(nullExpr);
         var expr = _Expression();
-        var successIsReachable =
-            flow.equalityOp_end(expr, nullExpr, _Type('Null'), notEqual: true);
-        // The `== null` case is considered reachable due to mixed mode
-        // unsoundness
-        expect(successIsReachable, true);
+        flow.equalityOp_end(expr, nullExpr, _Type('Null'), notEqual: true);
         flow.ifStatement_thenBegin(expr);
         expect(flow.isReachable, true);
         expect(flow.promotedType(x), isNull);
@@ -235,10 +229,8 @@
         flow.ifStatement_conditionBegin();
         flow.equalityOp_rightBegin(_Expression(), _Type('int?'));
         var expr = _Expression();
-        var successIsReachable = flow.equalityOp_end(
-            expr, _Expression(), _Type('int?'),
+        flow.equalityOp_end(expr, _Expression(), _Type('int?'),
             notEqual: false);
-        expect(successIsReachable, true);
         flow.ifStatement_thenBegin(expr);
         expect(flow.isReachable, true);
         flow.ifStatement_elseBegin();
@@ -253,9 +245,7 @@
         flow.ifStatement_conditionBegin();
         flow.equalityOp_rightBegin(_Expression(), _Type('int?'));
         var expr = _Expression();
-        var successIsReachable = flow
-            .equalityOp_end(expr, _Expression(), _Type('int?'), notEqual: true);
-        expect(successIsReachable, true);
+        flow.equalityOp_end(expr, _Expression(), _Type('int?'), notEqual: true);
         flow.ifStatement_thenBegin(expr);
         expect(flow.isReachable, true);
         flow.ifStatement_elseBegin();
@@ -296,9 +286,7 @@
         var nullExpr = _Expression();
         flow.nullLiteral(nullExpr);
         var expr = _Expression();
-        var successIsReachable =
-            flow.equalityOp_end(expr, nullExpr, _Type('Null'), notEqual: false);
-        expect(successIsReachable, true);
+        flow.equalityOp_end(expr, nullExpr, _Type('Null'), notEqual: false);
         flow.ifStatement_thenBegin(expr);
         expect(flow.isReachable, true);
         expect(flow.promotedType(x), isNull);
@@ -321,11 +309,7 @@
         var nullExpr = _Expression();
         flow.nullLiteral(nullExpr);
         var expr = _Expression();
-        var successIsReachable =
-            flow.equalityOp_end(expr, nullExpr, _Type('Null'), notEqual: false);
-        // The `== null` case is considered reachable due to mixed mode
-        // unsoundness
-        expect(successIsReachable, true);
+        flow.equalityOp_end(expr, nullExpr, _Type('Null'), notEqual: false);
         flow.ifStatement_thenBegin(expr);
         expect(flow.isReachable, true);
         expect(flow.promotedType(x), isNull);
@@ -406,9 +390,7 @@
         flow.equalityOp_rightBegin(null1, _Type('Null'));
         var null2 = _Expression();
         var expr = _Expression();
-        var successIsReachable =
-            flow.equalityOp_end(expr, null2, _Type('Null'));
-        expect(successIsReachable, true);
+        flow.equalityOp_end(expr, null2, _Type('Null'));
         flow.ifStatement_thenBegin(expr);
         expect(flow.isReachable, true);
         flow.ifStatement_elseBegin();
@@ -425,9 +407,7 @@
         flow.equalityOp_rightBegin(null1, _Type('Null'));
         var null2 = _Expression();
         var expr = _Expression();
-        var successIsReachable =
-            flow.equalityOp_end(expr, null2, _Type('Null'), notEqual: true);
-        expect(successIsReachable, true);
+        flow.equalityOp_end(expr, null2, _Type('Null'), notEqual: true);
         flow.ifStatement_thenBegin(expr);
         expect(flow.isReachable, false);
         flow.ifStatement_elseBegin();
@@ -444,10 +424,7 @@
         flow.equalityOp_rightBegin(null1, _Type('Null'));
         var null2 = _Expression();
         var expr = _Expression();
-        var successIsReachable = flow.equalityOp_end(expr, null2, _Type('int'));
-        // The `== null` case is considered reachable due to mixed mode
-        // unsoundness
-        expect(successIsReachable, true);
+        flow.equalityOp_end(expr, null2, _Type('int'));
         flow.ifStatement_thenBegin(expr);
         expect(flow.isReachable, true);
         flow.ifStatement_elseBegin();
@@ -464,11 +441,7 @@
         flow.equalityOp_rightBegin(null1, _Type('Null'));
         var null2 = _Expression();
         var expr = _Expression();
-        var successIsReachable =
-            flow.equalityOp_end(expr, null2, _Type('int'), notEqual: true);
-        // The `== null` case is considered reachable due to mixed mode
-        // unsoundness
-        expect(successIsReachable, true);
+        flow.equalityOp_end(expr, null2, _Type('int'), notEqual: true);
         flow.ifStatement_thenBegin(expr);
         expect(flow.isReachable, true);
         flow.ifStatement_elseBegin();
@@ -485,11 +458,7 @@
         flow.equalityOp_rightBegin(null1, _Type('int'));
         var null2 = _Expression();
         var expr = _Expression();
-        var successIsReachable =
-            flow.equalityOp_end(expr, null2, _Type('Null'));
-        // The `== null` case is considered reachable due to mixed mode
-        // unsoundness
-        expect(successIsReachable, true);
+        flow.equalityOp_end(expr, null2, _Type('Null'));
         flow.ifStatement_thenBegin(expr);
         expect(flow.isReachable, true);
         flow.ifStatement_elseBegin();
@@ -506,11 +475,7 @@
         flow.equalityOp_rightBegin(null1, _Type('int'));
         var null2 = _Expression();
         var expr = _Expression();
-        var successIsReachable =
-            flow.equalityOp_end(expr, null2, _Type('Null'), notEqual: true);
-        // The `== null` case is considered reachable due to mixed mode
-        // unsoundness
-        expect(successIsReachable, true);
+        flow.equalityOp_end(expr, null2, _Type('Null'), notEqual: true);
         flow.ifStatement_thenBegin(expr);
         expect(flow.isReachable, true);
         flow.ifStatement_elseBegin();
@@ -1154,9 +1119,7 @@
       h.assignedVariables((vars) => vars.write(x));
       h.run((flow) {
         h.declare(x, initialized: true);
-        var rhsIsReachable = flow.ifNullExpression_rightBegin(
-            h.variableRead(x)(), _Type('int?'));
-        expect(rhsIsReachable, true);
+        flow.ifNullExpression_rightBegin(h.variableRead(x)(), _Type('int?'));
         expect(flow.isReachable, true);
         flow.write(x, _Type('int'));
         expect(flow.promotedType(x).type, 'int');
@@ -1171,9 +1134,7 @@
       var x = h.addVar('x', 'int?');
       h.run((flow) {
         h.declare(x, initialized: true);
-        var rhsIsReachable = flow.ifNullExpression_rightBegin(
-            h.variableRead(x)(), _Type('int?'));
-        expect(rhsIsReachable, true);
+        flow.ifNullExpression_rightBegin(h.variableRead(x)(), _Type('int?'));
         expect(flow.isReachable, true);
         h.promote(x, 'int');
         expect(flow.promotedType(x).type, 'int');
@@ -1188,9 +1149,7 @@
       var x = h.addVar('x', 'int?');
       h.run((flow) {
         h.declare(x, initialized: true);
-        var rhsIsReachable =
-            flow.ifNullExpression_rightBegin(h.expr(), _Type('int?'));
-        expect(rhsIsReachable, true);
+        flow.ifNullExpression_rightBegin(h.expr(), _Type('int?'));
         expect(flow.isReachable, true);
         h.promote(x, 'int');
         expect(flow.promotedType(x).type, 'int');
@@ -1203,11 +1162,7 @@
     test('ifNullExpression does not detect when RHS is unreachable', () {
       var h = _Harness();
       h.run((flow) {
-        var rhsIsReachable =
-            flow.ifNullExpression_rightBegin(h.expr(), _Type('int'));
-        // We can't treat the RHS as unreachable because of mixed mode
-        // unsoundness
-        expect(rhsIsReachable, true);
+        flow.ifNullExpression_rightBegin(h.expr(), _Type('int'));
         expect(flow.isReachable, true);
         flow.ifNullExpression_end();
         expect(flow.isReachable, true);
@@ -1218,9 +1173,7 @@
         () {
       var h = _Harness();
       h.run((flow) {
-        var rhsIsReachable =
-            flow.ifNullExpression_rightBegin(h.expr(), _Type('Null'));
-        expect(rhsIsReachable, true);
+        flow.ifNullExpression_rightBegin(h.expr(), _Type('Null'));
         expect(flow.isReachable, true);
         flow.ifNullExpression_end();
         expect(flow.isReachable, true);
@@ -1267,9 +1220,7 @@
         var read = _Expression();
         flow.variableRead(read, x);
         var expr = _Expression();
-        var failureReachable =
-            flow.isExpression_end(expr, read, inverted, _Type(tryPromoteType));
-        expect(failureReachable, true);
+        flow.isExpression_end(expr, read, inverted, _Type(tryPromoteType));
         flow.ifStatement_thenBegin(expr);
         expect(flow.isReachable, true);
         if (expectedPromotedTypeThen == null) {
@@ -1319,9 +1270,7 @@
         flow.ifStatement_conditionBegin();
         var subExpr = _Expression();
         var expr = _Expression();
-        var failureReachable =
-            flow.isExpression_end(expr, subExpr, false, _Type('int'));
-        expect(failureReachable, true);
+        flow.isExpression_end(expr, subExpr, false, _Type('int'));
         flow.ifStatement_thenBegin(expr);
         expect(flow.isReachable, true);
         flow.ifStatement_elseBegin();
@@ -1337,9 +1286,7 @@
         flow.ifStatement_conditionBegin();
         var subExpr = _Expression();
         var expr = _Expression();
-        var failureReachable =
-            flow.isExpression_end(expr, subExpr, true, _Type('int'));
-        expect(failureReachable, true);
+        flow.isExpression_end(expr, subExpr, true, _Type('int'));
         flow.ifStatement_thenBegin(expr);
         expect(flow.isReachable, true);
         flow.ifStatement_elseBegin();
@@ -1534,9 +1481,7 @@
         h.declare(x, initialized: true);
         var varExpr = _Expression();
         flow.variableRead(varExpr, x);
-        var shortIsReachable =
-            flow.nullAwareAccess_rightBegin(varExpr, _Type('int?'));
-        expect(shortIsReachable, true);
+        flow.nullAwareAccess_rightBegin(varExpr, _Type('int?'));
         expect(flow.isReachable, true);
         expect(flow.promotedType(x).type, 'int');
         flow.nullAwareAccess_end();
@@ -1551,9 +1496,7 @@
         h.declare(x, initialized: true);
         var varExpr = _Expression();
         flow.variableRead(varExpr, x);
-        var shortIsReachable =
-            flow.nullAwareAccess_rightBegin(null, _Type('int?'));
-        expect(shortIsReachable, true);
+        flow.nullAwareAccess_rightBegin(null, _Type('int?'));
         expect(flow.isReachable, true);
         expect(flow.promotedType(x), isNull);
         flow.nullAwareAccess_end();
@@ -1568,11 +1511,7 @@
         h.declare(x, initialized: true);
         h.promote(x, 'int');
         var lhs = _Expression();
-        var shortIsReachable =
-            flow.nullAwareAccess_rightBegin(lhs, _Type('int'));
-        // We can't treat the short as unreachable because of mixed mode
-        // unsoundness
-        expect(shortIsReachable, true);
+        flow.nullAwareAccess_rightBegin(lhs, _Type('int'));
         expect(flow.isReachable, true);
         expect(flow.promotedType(x).type, 'int');
         flow.write(x, _Type('int?'));
@@ -1587,11 +1526,7 @@
       var x = h.addVar('x', 'int?');
       h.run((flow) {
         h.declare(x, initialized: true);
-        var shortIsReachable =
-            flow.nullAwareAccess_rightBegin(_Expression(), _Type('int'));
-        // We can't treat the RHS as unreachable because of mixed mode
-        // unsoundness
-        expect(shortIsReachable, true);
+        flow.nullAwareAccess_rightBegin(_Expression(), _Type('int'));
         expect(flow.isReachable, true);
         h.promote(x, 'int');
         expect(flow.promotedType(x).type, 'int');
diff --git a/pkg/_js_interop_checks/lib/js_interop_checks.dart b/pkg/_js_interop_checks/lib/js_interop_checks.dart
index 922d458..260937a 100644
--- a/pkg/_js_interop_checks/lib/js_interop_checks.dart
+++ b/pkg/_js_interop_checks/lib/js_interop_checks.dart
@@ -2,6 +2,7 @@
 // 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:kernel/core_types.dart';
 import 'package:kernel/kernel.dart';
 import 'package:kernel/target/targets.dart';
 import 'package:_fe_analyzer_shared/src/messages/codes.dart'
@@ -14,16 +15,19 @@
         messageJsInteropIndexNotSupported,
         messageJsInteropNamedParameters,
         messageJsInteropNonExternalConstructor,
-        messageJsInteropNonExternalMember;
+        messageJsInteropNonExternalMember,
+        templateJsInteropDartClassExtendsJSClass,
+        templateJsInteropJSClassExtendsDartClass;
 
 import 'src/js_interop.dart';
 
 class JsInteropChecks extends RecursiveVisitor<void> {
+  final CoreTypes _coreTypes;
   final DiagnosticReporter<Message, LocatedMessage> _diagnosticsReporter;
   bool _classHasJSAnnotation = false;
   bool _libraryHasJSAnnotation = false;
 
-  JsInteropChecks(this._diagnosticsReporter);
+  JsInteropChecks(this._coreTypes, this._diagnosticsReporter);
 
   @override
   void defaultMember(Member member) {
@@ -36,6 +40,25 @@
   @override
   void visitClass(Class cls) {
     _classHasJSAnnotation = hasJSInteropAnnotation(cls);
+    var superclass = cls.superclass;
+    if (superclass != null && superclass != _coreTypes.objectClass) {
+      var superHasJSAnnotation = hasJSInteropAnnotation(superclass);
+      if (_classHasJSAnnotation && !superHasJSAnnotation) {
+        _diagnosticsReporter.report(
+            templateJsInteropJSClassExtendsDartClass.withArguments(
+                cls.name, superclass.name),
+            cls.fileOffset,
+            cls.name.length,
+            cls.location.file);
+      } else if (!_classHasJSAnnotation && superHasJSAnnotation) {
+        _diagnosticsReporter.report(
+            templateJsInteropDartClassExtendsJSClass.withArguments(
+                cls.name, superclass.name),
+            cls.fileOffset,
+            cls.name.length,
+            cls.location.file);
+      }
+    }
     super.visitClass(cls);
     _classHasJSAnnotation = false;
   }
diff --git a/pkg/analysis_server/lib/plugin/protocol/protocol_dart.dart b/pkg/analysis_server/lib/plugin/protocol/protocol_dart.dart
index 3e44f4c..f62b233 100644
--- a/pkg/analysis_server/lib/plugin/protocol/protocol_dart.dart
+++ b/pkg/analysis_server/lib/plugin/protocol/protocol_dart.dart
@@ -6,7 +6,6 @@
 /// entities.
 import 'package:analysis_server/src/protocol_server.dart';
 import 'package:analyzer/dart/element/element.dart' as engine;
-import 'package:analyzer/src/generated/utilities_dart.dart' as engine;
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 import 'package:path/path.dart' as pathos;
 
diff --git a/pkg/analysis_server/lib/src/analysis_server.dart b/pkg/analysis_server/lib/src/analysis_server.dart
index 2c9e1e4..ce3c063 100644
--- a/pkg/analysis_server/lib/src/analysis_server.dart
+++ b/pkg/analysis_server/lib/src/analysis_server.dart
@@ -51,7 +51,6 @@
 import 'package:analyzer/src/context/builder.dart';
 import 'package:analyzer/src/context/context_root.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart' as nd;
-import 'package:analyzer/src/dart/analysis/file_state.dart' as nd;
 import 'package:analyzer/src/dart/analysis/status.dart' as nd;
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/sdk.dart';
@@ -627,10 +626,6 @@
   /// generally used in specific SDKs (like the internal google3 one).
   SdkConfiguration configurationOverrides;
 
-  /// The list of the names of the experiments that should be enabled by
-  /// default, unless the analysis options file of a context overrides it.
-  List<String> enabledExperiments = const <String>[];
-
   /// Whether to use the Language Server Protocol.
   bool useLanguageServerProtocol = false;
 
@@ -660,9 +655,8 @@
       analysisServer.notificationManager;
 
   @override
-  nd.AnalysisDriver addAnalysisDriver(
-      Folder folder, ContextRoot contextRoot, AnalysisOptions options) {
-    var builder = createContextBuilder(folder, options);
+  nd.AnalysisDriver addAnalysisDriver(Folder folder, ContextRoot contextRoot) {
+    var builder = createContextBuilder(folder);
     var analysisDriver = builder.buildDriver(contextRoot);
     analysisDriver.results.listen((result) {
       var notificationManager = analysisServer.notificationManager;
@@ -815,9 +809,8 @@
   }
 
   @override
-  ContextBuilder createContextBuilder(Folder folder, AnalysisOptions options) {
+  ContextBuilder createContextBuilder(Folder folder) {
     var builderOptions = ContextBuilderOptions();
-    builderOptions.defaultOptions = options;
     var builder = ContextBuilder(
         resourceProvider, analysisServer.sdkManager, null,
         options: builderOptions);
diff --git a/pkg/analysis_server/lib/src/analysis_server_abstract.dart b/pkg/analysis_server/lib/src/analysis_server_abstract.dart
index e18292c..f0db479 100644
--- a/pkg/analysis_server/lib/src/analysis_server_abstract.dart
+++ b/pkg/analysis_server/lib/src/analysis_server_abstract.dart
@@ -22,7 +22,6 @@
 import 'package:analysis_server/src/utilities/null_string_sink.dart';
 import 'package:analysis_server/src/utilities/request_statistics.dart';
 import 'package:analysis_server/src/utilities/tee_string_sink.dart';
-import 'package:analyzer/dart/analysis/features.dart' as analyzer_features;
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/analysis/session.dart';
 import 'package:analyzer/dart/ast/ast.dart';
@@ -34,13 +33,9 @@
 import 'package:analyzer/instrumentation/instrumentation.dart';
 import 'package:analyzer/src/dart/analysis/byte_store.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart' as nd;
-import 'package:analyzer/src/dart/analysis/experiments.dart'
-    as analyzer_features;
 import 'package:analyzer/src/dart/analysis/file_byte_store.dart'
     show EvictingFileByteStore;
-import 'package:analyzer/src/dart/analysis/file_state.dart' as nd;
 import 'package:analyzer/src/dart/analysis/performance_logger.dart';
-import 'package:analyzer/src/dart/analysis/status.dart' as nd;
 import 'package:analyzer/src/dart/ast/element_locator.dart';
 import 'package:analyzer/src/dart/ast/utilities.dart';
 import 'package:analyzer/src/dartdoc/dartdoc_directive_info.dart';
@@ -62,10 +57,6 @@
   /// context directories.
   ContextManager contextManager;
 
-  /// The default options used to create new analysis contexts. This object is
-  /// also referenced by the ContextManager.
-  final AnalysisOptionsImpl defaultContextOptions = AnalysisOptionsImpl();
-
   /// The object used to manage sending a subset of notifications to the client.
   /// The subset of notifications are those to which plugins may contribute.
   /// This field is `null` when the new plugin support is disabled.
@@ -157,12 +148,6 @@
         instrumentationService);
     var pluginWatcher = PluginWatcher(resourceProvider, pluginManager);
 
-    defaultContextOptions.contextFeatures =
-        analyzer_features.FeatureSet.fromEnableFlags2(
-      sdkLanguageVersion: analyzer_features.ExperimentStatus.currentVersion,
-      flags: options.enabledExperiments,
-    );
-
     {
       var name = options.newAnalysisDriverLog;
       StringSink sink = NullStringSink();
@@ -194,7 +179,7 @@
     }
 
     contextManager = ContextManagerImpl(resourceProvider, sdkManager,
-        analyzedFilesGlobs, instrumentationService, defaultContextOptions);
+        analyzedFilesGlobs, instrumentationService);
     searchEngine = SearchEngineImpl(driverMap.values);
   }
 
diff --git a/pkg/analysis_server/lib/src/computer/computer_highlights.dart b/pkg/analysis_server/lib/src/computer/computer_highlights.dart
index a3860dc..3c280ff 100644
--- a/pkg/analysis_server/lib/src/computer/computer_highlights.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_highlights.dart
@@ -6,6 +6,7 @@
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/src/dart/ast/extensions.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart' hide Element;
 
 /// A computer for [HighlightRegion]s in a Dart [CompilationUnit].
@@ -111,7 +112,7 @@
   }
 
   bool _addIdentifierRegion_class(SimpleIdentifier node) {
-    var element = node.staticElement;
+    var element = node.writeOrReadElement;
     if (element is! ClassElement) {
       return false;
     }
@@ -133,7 +134,7 @@
   }
 
   bool _addIdentifierRegion_constructor(SimpleIdentifier node) {
-    var element = node.staticElement;
+    var element = node.writeOrReadElement;
     if (element is! ConstructorElement) {
       return false;
     }
@@ -141,7 +142,7 @@
   }
 
   bool _addIdentifierRegion_dynamicType(SimpleIdentifier node) {
-    var element = node.staticElement;
+    var element = node.writeOrReadElement;
     if (element is VariableElement) {
       var staticType = element.type;
       if (staticType == null || !staticType.isDynamic) {
@@ -153,7 +154,7 @@
   }
 
   bool _addIdentifierRegion_field(SimpleIdentifier node) {
-    var element = node.staticElement;
+    var element = node.writeOrReadElement;
     if (element is FieldFormalParameterElement) {
       element = (element as FieldFormalParameterElement).field;
     }
@@ -182,7 +183,7 @@
   }
 
   bool _addIdentifierRegion_function(SimpleIdentifier node) {
-    var element = node.staticElement;
+    var element = node.writeOrReadElement;
     if (element is! FunctionElement) {
       return false;
     }
@@ -196,7 +197,7 @@
   }
 
   bool _addIdentifierRegion_functionTypeAlias(SimpleIdentifier node) {
-    var element = node.staticElement;
+    var element = node.writeOrReadElement;
     if (element is! FunctionTypeAliasElement) {
       return false;
     }
@@ -210,7 +211,7 @@
       return false;
     }
     // should be property accessor
-    var element = node.staticElement;
+    var element = node.writeOrReadElement;
     if (element is! PropertyAccessorElement) {
       return false;
     }
@@ -224,7 +225,7 @@
   }
 
   bool _addIdentifierRegion_importPrefix(SimpleIdentifier node) {
-    var element = node.staticElement;
+    var element = node.writeOrReadElement;
     if (element is! PrefixElement) {
       return false;
     }
@@ -240,7 +241,7 @@
   }
 
   bool _addIdentifierRegion_label(SimpleIdentifier node) {
-    var element = node.staticElement;
+    var element = node.writeOrReadElement;
     if (element is! LabelElement) {
       return false;
     }
@@ -248,7 +249,7 @@
   }
 
   bool _addIdentifierRegion_localVariable(SimpleIdentifier node) {
-    var element = node.staticElement;
+    var element = node.writeOrReadElement;
     if (element is! LocalVariableElement) {
       return false;
     }
@@ -263,7 +264,7 @@
   }
 
   bool _addIdentifierRegion_method(SimpleIdentifier node) {
-    var element = node.staticElement;
+    var element = node.writeOrReadElement;
     if (element is! MethodElement) {
       return false;
     }
@@ -288,7 +289,7 @@
   }
 
   bool _addIdentifierRegion_parameter(SimpleIdentifier node) {
-    var element = node.staticElement;
+    var element = node.writeOrReadElement;
     if (element is! ParameterElement) {
       return false;
     }
@@ -296,7 +297,7 @@
   }
 
   bool _addIdentifierRegion_typeParameter(SimpleIdentifier node) {
-    var element = node.staticElement;
+    var element = node.writeOrReadElement;
     if (element is! TypeParameterElement) {
       return false;
     }
diff --git a/pkg/analysis_server/lib/src/computer/computer_highlights2.dart b/pkg/analysis_server/lib/src/computer/computer_highlights2.dart
index 2c677c7..70489fe 100644
--- a/pkg/analysis_server/lib/src/computer/computer_highlights2.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_highlights2.dart
@@ -6,6 +6,7 @@
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/src/dart/ast/extensions.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart' hide Element;
 
 /// A computer for [HighlightRegion]s in a Dart [CompilationUnit].
@@ -114,7 +115,7 @@
   }
 
   bool _addIdentifierRegion_class(SimpleIdentifier node) {
-    var element = node.staticElement;
+    var element = node.writeOrReadElement;
     if (element is! ClassElement) {
       return false;
     }
@@ -136,7 +137,7 @@
   }
 
   bool _addIdentifierRegion_constructor(SimpleIdentifier node) {
-    var element = node.staticElement;
+    var element = node.writeOrReadElement;
     if (element is! ConstructorElement) {
       return false;
     }
@@ -144,7 +145,7 @@
   }
 
   bool _addIdentifierRegion_dynamicLocal(SimpleIdentifier node) {
-    var element = node.staticElement;
+    var element = node.writeOrReadElement;
     if (element is LocalVariableElement) {
       var elementType = element.type;
       if (elementType?.isDynamic == true) {
@@ -167,7 +168,7 @@
   }
 
   bool _addIdentifierRegion_field(SimpleIdentifier node) {
-    var element = node.staticElement;
+    var element = node.writeOrReadElement;
     if (element is FieldFormalParameterElement) {
       if (node.parent is FieldFormalParameter) {
         element = (element as FieldFormalParameterElement).field;
@@ -216,7 +217,7 @@
   }
 
   bool _addIdentifierRegion_function(SimpleIdentifier node) {
-    var element = node.staticElement;
+    var element = node.writeOrReadElement;
     if (element is! FunctionElement) {
       return false;
     }
@@ -235,7 +236,7 @@
   }
 
   bool _addIdentifierRegion_functionTypeAlias(SimpleIdentifier node) {
-    var element = node.staticElement;
+    var element = node.writeOrReadElement;
     if (element is! FunctionTypeAliasElement) {
       return false;
     }
@@ -249,7 +250,7 @@
       return false;
     }
     // should be property accessor
-    var element = node.staticElement;
+    var element = node.writeOrReadElement;
     if (element is! PropertyAccessorElement) {
       return false;
     }
@@ -278,7 +279,7 @@
   }
 
   bool _addIdentifierRegion_importPrefix(SimpleIdentifier node) {
-    var element = node.staticElement;
+    var element = node.writeOrReadElement;
     if (element is! PrefixElement) {
       return false;
     }
@@ -294,7 +295,7 @@
   }
 
   bool _addIdentifierRegion_label(SimpleIdentifier node) {
-    var element = node.staticElement;
+    var element = node.writeOrReadElement;
     if (element is! LabelElement) {
       return false;
     }
@@ -302,7 +303,7 @@
   }
 
   bool _addIdentifierRegion_localVariable(SimpleIdentifier node) {
-    var element = node.staticElement;
+    var element = node.writeOrReadElement;
     if (element is! LocalVariableElement) {
       return false;
     }
@@ -314,7 +315,7 @@
   }
 
   bool _addIdentifierRegion_method(SimpleIdentifier node) {
-    var element = node.staticElement;
+    var element = node.writeOrReadElement;
     if (element is! MethodElement) {
       return false;
     }
@@ -339,7 +340,7 @@
   }
 
   bool _addIdentifierRegion_parameter(SimpleIdentifier node) {
-    var element = node.staticElement;
+    var element = node.writeOrReadElement;
     if (element is! ParameterElement) {
       return false;
     }
@@ -350,7 +351,7 @@
   }
 
   bool _addIdentifierRegion_typeParameter(SimpleIdentifier node) {
-    var element = node.staticElement;
+    var element = node.writeOrReadElement;
     if (element is! TypeParameterElement) {
       return false;
     }
@@ -360,7 +361,7 @@
   bool _addIdentifierRegion_unresolvedInstanceMemberReference(
       SimpleIdentifier node) {
     // unresolved
-    var element = node.staticElement;
+    var element = node.writeOrReadElement;
     if (element != null) {
       return false;
     }
diff --git a/pkg/analysis_server/lib/src/computer/computer_outline.dart b/pkg/analysis_server/lib/src/computer/computer_outline.dart
index b1abe78..e36aed7 100644
--- a/pkg/analysis_server/lib/src/computer/computer_outline.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_outline.dart
@@ -8,7 +8,6 @@
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart' as engine;
-import 'package:analyzer/dart/element/type.dart' as engine;
 import 'package:analyzer/source/line_info.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 
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 8dc38a7..7f5a9a4 100644
--- a/pkg/analysis_server/lib/src/computer/import_elements_computer.dart
+++ b/pkg/analysis_server/lib/src/computer/import_elements_computer.dart
@@ -325,7 +325,7 @@
     var scope = libraryResult.libraryElement.scope;
 
     if (prefix.isNotEmpty) {
-      var prefixElement = scope.lookup2(prefix).getter;
+      var prefixElement = scope.lookup(prefix).getter;
       if (prefixElement is PrefixElement) {
         scope = prefixElement.scope;
       } else {
@@ -333,7 +333,7 @@
       }
     }
 
-    var lookupResult = scope.lookup2(name);
+    var lookupResult = scope.lookup(name);
     return lookupResult.getter != null || lookupResult.setter != null;
   }
 
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 8d9ac7b..e30c41a 100644
--- a/pkg/analysis_server/lib/src/computer/imported_elements_computer.dart
+++ b/pkg/analysis_server/lib/src/computer/imported_elements_computer.dart
@@ -6,6 +6,7 @@
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/src/dart/ast/extensions.dart';
 
 /// An object used to compute the list of elements referenced within a given
 /// region of a compilation unit that are imported into the compilation unit's
@@ -83,7 +84,7 @@
         node.offset <= endOffset &&
         node.end >= startOffset &&
         !_isConstructorDeclarationReturnType(node)) {
-      var nodeElement = node.staticElement;
+      var nodeElement = node.writeOrReadElement;
       if (nodeElement != null &&
           nodeElement.enclosingElement is CompilationUnitElement) {
         var nodeLibrary = nodeElement.library;
diff --git a/pkg/analysis_server/lib/src/context_manager.dart b/pkg/analysis_server/lib/src/context_manager.dart
index 1d527b0..5c09be3 100644
--- a/pkg/analysis_server/lib/src/context_manager.dart
+++ b/pkg/analysis_server/lib/src/context_manager.dart
@@ -294,10 +294,8 @@
   /// Return the notification manager associated with the server.
   AbstractNotificationManager get notificationManager;
 
-  /// Create and return a new analysis driver rooted at the given [folder], with
-  /// the given analysis [options].
-  AnalysisDriver addAnalysisDriver(
-      Folder folder, ContextRoot contextRoot, AnalysisOptions options);
+  /// Create and return a new analysis driver rooted at the given [folder].
+  AnalysisDriver addAnalysisDriver(Folder folder, ContextRoot contextRoot);
 
   /// An [event] was processed, so analysis state might be different now.
   void afterWatchEvent(WatchEvent event);
@@ -318,9 +316,8 @@
   void broadcastWatchEvent(WatchEvent event);
 
   /// Create and return a context builder that can be used to create a context
-  /// for the files in the given [folder] when analyzed using the given
-  /// [options].
-  ContextBuilder createContextBuilder(Folder folder, AnalysisOptions options);
+  /// for the files in the given [folder].
+  ContextBuilder createContextBuilder(Folder folder);
 
   /// Remove the context associated with the given [folder].  [flushedFiles] is
   /// a list of the files which will be "orphaned" by removing this context
@@ -377,9 +374,6 @@
   /// A list of the globs used to determine which files should be analyzed.
   final List<Glob> analyzedFilesGlobs;
 
-  /// The default options used to create new analysis contexts.
-  final AnalysisOptionsImpl defaultContextOptions;
-
   /// The instrumentation service used to report instrumentation data.
   final InstrumentationService _instrumentationService;
 
@@ -400,11 +394,11 @@
       <Folder, StreamSubscription<WatchEvent>>{};
 
   ContextManagerImpl(
-      this.resourceProvider,
-      this.sdkManager,
-      this.analyzedFilesGlobs,
-      this._instrumentationService,
-      this.defaultContextOptions) {
+    this.resourceProvider,
+    this.sdkManager,
+    this.analyzedFilesGlobs,
+    this._instrumentationService,
+  ) {
     pathContext = resourceProvider.pathContext;
   }
 
@@ -818,29 +812,27 @@
               }
             }
           }
-          // todo (pq): re-enable once `sort_pub_dependencies` is fixed
-          // see: https://github.com/dart-lang/linter/issues/2271
-          // see: See: https://github.com/dart-lang/sdk/issues/43529
-          //   if (visitors.isNotEmpty) {
-          //     var sourceUri = resourceProvider.pathContext.toUri(path);
-          //     var pubspecAst = Pubspec.parse(content,
-          //         sourceUrl: sourceUri, resourceProvider: resourceProvider);
-          //     var listener = RecordingErrorListener();
-          //     var reporter = ErrorReporter(listener,
-          //         resourceProvider.getFile(path).createSource(sourceUri),
-          //         isNonNullableByDefault: false);
-          //     for (var entry in visitors.entries) {
-          //       entry.key.reporter = reporter;
-          //       pubspecAst.accept(entry.value);
-          //     }
-          //     if (listener.errors.isNotEmpty) {
-          //       convertedErrors ??= <protocol.AnalysisError>[];
-          //       convertedErrors.addAll(converter.convertAnalysisErrors(
-          //           listener.errors,
-          //           lineInfo: lineInfo,
-          //           options: driver.analysisOptions));
-          //     }
-          //   }
+
+          if (visitors.isNotEmpty) {
+            var sourceUri = resourceProvider.pathContext.toUri(path);
+            var pubspecAst = Pubspec.parse(content,
+                sourceUrl: sourceUri, resourceProvider: resourceProvider);
+            var listener = RecordingErrorListener();
+            var reporter = ErrorReporter(listener,
+                resourceProvider.getFile(path).createSource(sourceUri),
+                isNonNullableByDefault: false);
+            for (var entry in visitors.entries) {
+              entry.key.reporter = reporter;
+              pubspecAst.accept(entry.value);
+            }
+            if (listener.errors.isNotEmpty) {
+              convertedErrors ??= <protocol.AnalysisError>[];
+              convertedErrors.addAll(converter.convertAnalysisErrors(
+                  listener.errors,
+                  lineInfo: lineInfo,
+                  options: driver.analysisOptions));
+            }
+          }
         }
       }
     } catch (exception) {
@@ -1008,7 +1000,7 @@
     } catch (_) {
       // Parse errors are reported elsewhere.
     }
-    AnalysisOptions options = AnalysisOptionsImpl.from(defaultContextOptions);
+    var options = AnalysisOptionsImpl();
     applyToAnalysisOptions(options, optionMap);
 
     info.setDependencies(dependencies);
@@ -1023,8 +1015,7 @@
     if (optionsFile != null) {
       contextRoot.optionsFilePath = optionsFile.path;
     }
-    info.analysisDriver =
-        callbacks.addAnalysisDriver(folder, contextRoot, options);
+    info.analysisDriver = callbacks.addAnalysisDriver(folder, contextRoot);
     if (optionsFile != null) {
       _analyzeAnalysisOptionsFile(info.analysisDriver, optionsFile.path);
     }
@@ -1117,8 +1108,8 @@
 
   /// Set up a [SourceFactory] that resolves packages as appropriate for the
   /// given [folder].
-  SourceFactory _createSourceFactory(AnalysisOptions options, Folder folder) {
-    var builder = callbacks.createContextBuilder(folder, options);
+  SourceFactory _createSourceFactory(Folder folder) {
+    var builder = callbacks.createContextBuilder(folder);
     return builder.createSourceFactory(folder.path);
   }
 
@@ -1483,8 +1474,7 @@
   void _updateAnalysisOptions(ContextInfo info) {
     var driver = info.analysisDriver;
     var contextRoot = info.folder.path;
-    var builder =
-        callbacks.createContextBuilder(info.folder, defaultContextOptions);
+    var builder = callbacks.createContextBuilder(info.folder);
     var options = builder.getAnalysisOptions(contextRoot,
         contextRoot: driver.contextRoot);
     var factory = builder.createSourceFactory(contextRoot);
@@ -1495,8 +1485,7 @@
   void _updateContextPackageUriResolver(Folder contextFolder) {
     var info = getContextInfoFor(contextFolder);
     var driver = info.analysisDriver;
-    var sourceFactory =
-        _createSourceFactory(driver.analysisOptions, contextFolder);
+    var sourceFactory = _createSourceFactory(contextFolder);
     driver.configure(sourceFactory: sourceFactory);
   }
 
diff --git a/pkg/analysis_server/lib/src/domain_abstract.dart b/pkg/analysis_server/lib/src/domain_abstract.dart
index a2c28e2..3d168d5 100644
--- a/pkg/analysis_server/lib/src/domain_abstract.dart
+++ b/pkg/analysis_server/lib/src/domain_abstract.dart
@@ -11,8 +11,6 @@
 import 'package:analysis_server/src/plugin/plugin_manager.dart';
 import 'package:analysis_server/src/protocol_server.dart' hide Element;
 import 'package:analyzer_plugin/protocol/protocol.dart' as plugin;
-import 'package:analyzer_plugin/protocol/protocol_constants.dart' as plugin;
-import 'package:analyzer_plugin/protocol/protocol_generated.dart' as plugin;
 import 'package:analyzer_plugin/src/protocol/protocol_internal.dart' as plugin;
 
 /// An abstract implementation of a request handler.
diff --git a/pkg/analysis_server/lib/src/domain_analysis.dart b/pkg/analysis_server/lib/src/domain_analysis.dart
index 35f6911..9d90b64 100644
--- a/pkg/analysis_server/lib/src/domain_analysis.dart
+++ b/pkg/analysis_server/lib/src/domain_analysis.dart
@@ -15,11 +15,8 @@
 import 'package:analysis_server/src/protocol/protocol_internal.dart';
 import 'package:analysis_server/src/protocol_server.dart';
 import 'package:analyzer/dart/analysis/results.dart';
-import 'package:analyzer/error/error.dart' as engine;
 import 'package:analyzer/src/generated/engine.dart' as engine;
-import 'package:analyzer_plugin/protocol/protocol.dart' as plugin;
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
-import 'package:analyzer_plugin/protocol/protocol_constants.dart' as plugin;
 import 'package:analyzer_plugin/protocol/protocol_generated.dart' as plugin;
 import 'package:analyzer_plugin/src/utilities/navigation/navigation.dart';
 import 'package:analyzer_plugin/utilities/navigation/navigation_dart.dart';
diff --git a/pkg/analysis_server/lib/src/domain_completion.dart b/pkg/analysis_server/lib/src/domain_completion.dart
index 2d0f0b1..7ba35cd 100644
--- a/pkg/analysis_server/lib/src/domain_completion.dart
+++ b/pkg/analysis_server/lib/src/domain_completion.dart
@@ -24,7 +24,6 @@
 import 'package:analyzer/src/util/performance/operation_performance.dart';
 import 'package:analyzer_plugin/protocol/protocol.dart' as plugin;
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
-import 'package:analyzer_plugin/protocol/protocol_constants.dart' as plugin;
 import 'package:analyzer_plugin/protocol/protocol_generated.dart' as plugin;
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
 
diff --git a/pkg/analysis_server/lib/src/domain_kythe.dart b/pkg/analysis_server/lib/src/domain_kythe.dart
index 565c6cd..a67e02a 100644
--- a/pkg/analysis_server/lib/src/domain_kythe.dart
+++ b/pkg/analysis_server/lib/src/domain_kythe.dart
@@ -13,9 +13,7 @@
 import 'package:analysis_server/src/services/kythe/kythe_visitors.dart';
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/src/dart/element/inheritance_manager3.dart';
-import 'package:analyzer_plugin/protocol/protocol.dart' as plugin;
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
-import 'package:analyzer_plugin/protocol/protocol_constants.dart' as plugin;
 import 'package:analyzer_plugin/protocol/protocol_generated.dart' as plugin;
 
 /// Instances of the class [KytheDomainHandler] implement a [RequestHandler]
diff --git a/pkg/analysis_server/lib/src/domains/analysis/occurrences_dart.dart b/pkg/analysis_server/lib/src/domains/analysis/occurrences_dart.dart
index f09a65d..f263e74 100644
--- a/pkg/analysis_server/lib/src/domains/analysis/occurrences_dart.dart
+++ b/pkg/analysis_server/lib/src/domains/analysis/occurrences_dart.dart
@@ -7,6 +7,7 @@
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/src/dart/ast/extensions.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 
 void addDartOccurrences(OccurrencesCollector collector, CompilationUnit unit) {
@@ -25,7 +26,7 @@
 
   @override
   void visitSimpleIdentifier(SimpleIdentifier node) {
-    var element = node.staticElement;
+    var element = node.writeOrReadElement;
     if (element != null) {
       _addOccurrence(element, node.offset);
     }
diff --git a/pkg/analysis_server/lib/src/edit/edit_domain.dart b/pkg/analysis_server/lib/src/edit/edit_domain.dart
index b702179..e2fc729 100644
--- a/pkg/analysis_server/lib/src/edit/edit_domain.dart
+++ b/pkg/analysis_server/lib/src/edit/edit_domain.dart
@@ -47,7 +47,6 @@
 import 'package:analyzer/src/dart/ast/utilities.dart';
 import 'package:analyzer/src/dart/scanner/scanner.dart' as engine;
 import 'package:analyzer/src/dart/sdk/sdk.dart';
-import 'package:analyzer/src/error/codes.dart' as engine;
 import 'package:analyzer/src/exception/exception.dart';
 import 'package:analyzer/src/generated/engine.dart' as engine;
 import 'package:analyzer/src/generated/engine.dart';
@@ -58,7 +57,6 @@
 import 'package:analyzer/src/pubspec/pubspec_validator.dart';
 import 'package:analyzer/src/task/options.dart';
 import 'package:analyzer_plugin/protocol/protocol.dart' as plugin;
-import 'package:analyzer_plugin/protocol/protocol_constants.dart' as plugin;
 import 'package:analyzer_plugin/protocol/protocol_generated.dart' as plugin;
 import 'package:dart_style/dart_style.dart';
 import 'package:html/parser.dart';
diff --git a/pkg/analysis_server/lib/src/lsp/constants.dart b/pkg/analysis_server/lib/src/lsp/constants.dart
index 27abeb9..8ee02fc 100644
--- a/pkg/analysis_server/lib/src/lsp/constants.dart
+++ b/pkg/analysis_server/lib/src/lsp/constants.dart
@@ -16,7 +16,11 @@
 ///
 ///     myLongFunctionName();
 ///     print(myLong^)
-const dartCompletionCommitCharacters = ['.', '('];
+///
+/// The `.` is not included because it falsely triggers whenver typing a
+/// cascade (`..`), inserting the very first completion instead of just a second
+/// period.
+const dartCompletionCommitCharacters = ['('];
 
 /// Set the characters that will cause the editor to automatically
 /// trigger completion.
@@ -52,6 +56,8 @@
 /// A [ProgressToken] used for reporting progress when the server is analyzing.
 final analyzingProgressToken = Either2<num, String>.t2('ANALYZING');
 
+final emptyWorkspaceEdit = WorkspaceEdit();
+
 /// Constants for command IDs that are exchanged between LSP client/server.
 abstract class Commands {
   /// A list of all commands IDs that can be sent to the client to inform which
@@ -93,6 +99,7 @@
     CodeActionKind.SourceOrganizeImports,
     SortMembers,
     CodeActionKind.QuickFix,
+    CodeActionKind.Refactor,
   ];
   static const SortMembers = CodeActionKind('source.sortMembers');
 }
@@ -127,3 +134,9 @@
   ///   if it crashes 5 times in the last 180 seconds."
   static const ClientServerInconsistentState = ErrorCodes(-32099);
 }
+
+/// Strings used in user prompts (window/showMessageRequest).
+abstract class UserPromptActions {
+  static const String cancel = 'Cancel';
+  static const String renameAnyway = 'Rename Anyway';
+}
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/commands/simple_edit_handler.dart b/pkg/analysis_server/lib/src/lsp/handlers/commands/simple_edit_handler.dart
index 1dd999b..559c54e 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/commands/simple_edit_handler.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/commands/simple_edit_handler.dart
@@ -12,8 +12,6 @@
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/error/error.dart' as engine;
 import 'package:analyzer/src/dart/scanner/scanner.dart' as engine;
-import 'package:analyzer/src/error/codes.dart' as engine;
-import 'package:analyzer/src/generated/engine.dart' as engine;
 import 'package:analyzer/src/generated/parser.dart' as engine;
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_completion.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_completion.dart
index 8d75c98..430489a 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_completion.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_completion.dart
@@ -231,6 +231,14 @@
                 item,
                 completionRequest.replacementOffset,
                 completionRequest.replacementLength,
+                // TODO(dantup): Including commit characters in every completion
+                // increases the payload size. The LSP spec is ambigious
+                // about how this should be handled (and VS Code requires it) but
+                // this should be removed (or made conditional based on a capability)
+                // depending on how the spec is updated.
+                // https://github.com/microsoft/vscode-languageserver-node/issues/673
+                includeCommitCharacters:
+                    server.clientConfiguration.previewCommitCharacters,
               ),
             )
             .toList();
@@ -315,6 +323,14 @@
                     item,
                     completionRequest.replacementOffset,
                     completionRequest.replacementLength,
+                    // TODO(dantup): Including commit characters in every completion
+                    // increases the payload size. The LSP spec is ambigious
+                    // about how this should be handled (and VS Code requires it) but
+                    // this should be removed (or made conditional based on a capability)
+                    // depending on how the spec is updated.
+                    // https://github.com/microsoft/vscode-languageserver-node/issues/673
+                    includeCommitCharacters:
+                        server.clientConfiguration.previewCommitCharacters,
                   ));
           results.addAll(setResults);
         });
@@ -352,6 +368,10 @@
           item,
           result.replacementOffset,
           result.replacementLength,
+          // Plugins cannot currently contribute commit characters and we should
+          // not assume that the Dart ones would be correct for all of their
+          // completions.
+          includeCommitCharacters: false,
         ),
       );
     });
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_rename.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_rename.dart
index a0daa67..7375cc2 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_rename.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_rename.dart
@@ -126,7 +126,7 @@
       if (token.isCancellationRequested) {
         return cancelled();
       }
-      if (initStatus.hasError) {
+      if (initStatus.hasFatalError) {
         return error(
             ServerErrorCodes.RenameNotValid, initStatus.problem.message, null);
       }
@@ -144,9 +144,30 @@
       if (token.isCancellationRequested) {
         return cancelled();
       }
-      if (finalStatus.hasError) {
+      if (finalStatus.hasFatalError) {
         return error(
             ServerErrorCodes.RenameNotValid, finalStatus.problem.message, null);
+      } else if (finalStatus.hasError || finalStatus.hasWarning) {
+        // Ask the user whether to proceed with the rename.
+        final userChoice = await server.showUserPrompt(
+          MessageType.Warning,
+          finalStatus.message,
+          [
+            MessageActionItem(title: UserPromptActions.renameAnyway),
+            MessageActionItem(title: UserPromptActions.cancel),
+          ],
+        );
+
+        if (token.isCancellationRequested) {
+          return cancelled();
+        }
+
+        if (userChoice.title != UserPromptActions.renameAnyway) {
+          // Return an empty workspace edit response so we do not perform any
+          // rename, but also so we do not cause the client to show the user an
+          // error after they clicked cancel.
+          return success(emptyWorkspaceEdit);
+        }
       }
 
       // Compute the actual change.
diff --git a/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart b/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart
index 85debf8..c8acbe8 100644
--- a/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart
+++ b/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart
@@ -42,9 +42,7 @@
 import 'package:analyzer/src/context/builder.dart';
 import 'package:analyzer/src/context/context_root.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart' as nd;
-import 'package:analyzer/src/dart/analysis/file_state.dart' as nd;
 import 'package:analyzer/src/dart/analysis/status.dart' as nd;
-import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/sdk.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart' as plugin;
 import 'package:analyzer_plugin/protocol/protocol_generated.dart' as plugin;
@@ -599,6 +597,17 @@
     ));
   }
 
+  /// Shows the user a prompt with some actions to select using ShowMessageRequest.
+  Future<MessageActionItem> showUserPrompt(
+      MessageType type, String message, List<MessageActionItem> actions) async {
+    final response = await sendRequest(
+      Method.window_showMessageRequest,
+      ShowMessageRequestParams(type: type, message: message, actions: actions),
+    );
+
+    return MessageActionItem.fromJson(response.result);
+  }
+
   Future<void> shutdown() {
     // Defer closing the channel so that the shutdown response can be sent and
     // logged.
@@ -731,9 +740,8 @@
       analysisServer.notificationManager;
 
   @override
-  nd.AnalysisDriver addAnalysisDriver(
-      Folder folder, ContextRoot contextRoot, AnalysisOptions options) {
-    var builder = createContextBuilder(folder, options);
+  nd.AnalysisDriver addAnalysisDriver(Folder folder, ContextRoot contextRoot) {
+    var builder = createContextBuilder(folder);
     var analysisDriver = builder.buildDriver(contextRoot);
     final textDocumentCapabilities =
         analysisServer.clientCapabilities?.textDocument;
@@ -828,9 +836,8 @@
   }
 
   @override
-  ContextBuilder createContextBuilder(Folder folder, AnalysisOptions options) {
+  ContextBuilder createContextBuilder(Folder folder) {
     var builderOptions = ContextBuilderOptions();
-    builderOptions.defaultOptions = options;
     var builder = ContextBuilder(
         resourceProvider, analysisServer.sdkManager, null,
         options: builderOptions);
diff --git a/pkg/analysis_server/lib/src/lsp/mapping.dart b/pkg/analysis_server/lib/src/lsp/mapping.dart
index f710272..717b6cd 100644
--- a/pkg/analysis_server/lib/src/lsp/mapping.dart
+++ b/pkg/analysis_server/lib/src/lsp/mapping.dart
@@ -17,6 +17,7 @@
     show ErrorOr, Either2, Either4;
 import 'package:analysis_server/protocol/protocol_generated.dart';
 import 'package:analysis_server/src/lsp/constants.dart' as lsp;
+import 'package:analysis_server/src/lsp/constants.dart';
 import 'package:analysis_server/src/lsp/dartdoc.dart';
 import 'package:analysis_server/src/lsp/lsp_analysis_server.dart' as lsp;
 import 'package:analysis_server/src/lsp/source_edits.dart';
@@ -33,9 +34,6 @@
 import 'package:analyzer/src/services/available_declarations.dart';
 import 'package:analyzer/src/services/available_declarations.dart' as dec;
 import 'package:analyzer_plugin/protocol/protocol_common.dart' as plugin;
-import 'package:analyzer_plugin/src/utilities/navigation/navigation.dart'
-    as server;
-import 'package:analyzer_plugin/utilities/fixes/fixes.dart' as server;
 import 'package:meta/meta.dart';
 
 const diagnosticTagsForErrorCode = <server.ErrorCode, List<lsp.DiagnosticTag>>{
@@ -201,8 +199,9 @@
   server.LineInfo lineInfo,
   dec.Declaration declaration,
   int replacementOffset,
-  int replacementLength,
-) {
+  int replacementLength, {
+  @required bool includeCommitCharacters,
+}) {
   // Build display labels and text to insert. insertText and filterText may
   // differ from label (for ex. if the label includes things like (…)). If
   // either are missing then label will be used by the client.
@@ -269,6 +268,8 @@
               lsp.CompletionItemTag.Deprecated
           ]
         : null,
+    commitCharacters:
+        includeCommitCharacters ? lsp.dartCompletionCommitCharacters : null,
     detail: getDeclarationCompletionDetail(declaration, completionKind,
         supportsDeprecatedFlag || supportsDeprecatedTag),
     deprecated:
@@ -764,8 +765,9 @@
   server.LineInfo lineInfo,
   server.CompletionSuggestion suggestion,
   int replacementOffset,
-  int replacementLength,
-) {
+  int replacementLength, {
+  @required bool includeCommitCharacters,
+}) {
   // Build display labels and text to insert. insertText and filterText may
   // differ from label (for ex. if the label includes things like (…)). If
   // either are missing then label will be used by the client.
@@ -826,6 +828,8 @@
               lsp.CompletionItemTag.Deprecated
           ]
         : null,
+    commitCharacters:
+        includeCommitCharacters ? dartCompletionCommitCharacters : null,
     detail: getCompletionDetail(suggestion, completionKind,
         supportsDeprecatedFlag || supportsDeprecatedTag),
     documentation:
diff --git a/pkg/analysis_server/lib/src/plugin/request_converter.dart b/pkg/analysis_server/lib/src/plugin/request_converter.dart
index a08bc7b..82b2bf4 100644
--- a/pkg/analysis_server/lib/src/plugin/request_converter.dart
+++ b/pkg/analysis_server/lib/src/plugin/request_converter.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/protocol/protocol_generated.dart' as server;
-import 'package:analysis_server/src/protocol/protocol_internal.dart' as server;
 import 'package:analyzer_plugin/protocol/protocol_generated.dart' as plugin;
 
 /// An object used to convert between similar objects defined by both the plugin
diff --git a/pkg/analysis_server/lib/src/protocol_server.dart b/pkg/analysis_server/lib/src/protocol_server.dart
index 1e68c39..ba01e37 100644
--- a/pkg/analysis_server/lib/src/protocol_server.dart
+++ b/pkg/analysis_server/lib/src/protocol_server.dart
@@ -9,19 +9,13 @@
     as engine;
 import 'package:analyzer/dart/analysis/results.dart' as engine;
 import 'package:analyzer/dart/ast/ast.dart' as engine;
-import 'package:analyzer/dart/ast/visitor.dart' as engine;
 import 'package:analyzer/dart/element/element.dart' as engine;
-import 'package:analyzer/dart/element/type.dart' as engine;
 import 'package:analyzer/diagnostic/diagnostic.dart' as engine;
 import 'package:analyzer/error/error.dart' as engine;
 import 'package:analyzer/exception/exception.dart';
 import 'package:analyzer/source/error_processor.dart';
 import 'package:analyzer/source/line_info.dart';
-import 'package:analyzer/src/dart/ast/utilities.dart' as engine;
-import 'package:analyzer/src/error/codes.dart' as engine;
-import 'package:analyzer/src/generated/engine.dart' as engine;
 import 'package:analyzer/src/generated/source.dart' as engine;
-import 'package:analyzer/src/generated/utilities_dart.dart' as engine;
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 
 export 'package:analysis_server/plugin/protocol/protocol_dart.dart';
diff --git a/pkg/analysis_server/lib/src/server/driver.dart b/pkg/analysis_server/lib/src/server/driver.dart
index 298fd30..8e7af39 100644
--- a/pkg/analysis_server/lib/src/server/driver.dart
+++ b/pkg/analysis_server/lib/src/server/driver.dart
@@ -25,8 +25,6 @@
 import 'package:analysis_server/src/server/sdk_configuration.dart';
 import 'package:analysis_server/src/server/stdio_server.dart';
 import 'package:analysis_server/src/services/completion/dart/completion_ranking.dart';
-import 'package:analysis_server/src/services/completion/dart/uri_contributor.dart'
-    show UriContributor;
 import 'package:analysis_server/src/socket_server.dart';
 import 'package:analysis_server/src/utilities/request_statistics.dart';
 import 'package:analysis_server/starter.dart';
@@ -219,9 +217,6 @@
   /// The name of the option used to set the version for the client.
   static const String CLIENT_VERSION = 'client-version';
 
-  /// The name of the option used to enable DartPad specific functionality.
-  static const String DARTPAD_OPTION = 'dartpad';
-
   /// The name of the option used to disable exception handling.
   static const String DISABLE_SERVER_EXCEPTION_HANDLING =
       'disable-server-exception-handling';
@@ -234,12 +229,6 @@
   static const String DISABLE_SERVER_FEATURE_SEARCH =
       'disable-server-feature-search';
 
-  /// The name of the option used to enable experiments.
-  static const String ENABLE_EXPERIMENT_OPTION = 'enable-experiment';
-
-  /// The name of the option used to enable instrumentation.
-  static const String ENABLE_INSTRUMENTATION_OPTION = 'enable-instrumentation';
-
   /// The name of the option used to set the file read mode.
   static const String FILE_READ_MODE = 'file-read-mode';
 
@@ -336,10 +325,6 @@
 
     analysisServerOptions.clientVersion = results[CLIENT_VERSION];
     analysisServerOptions.cacheFolder = results[CACHE_FOLDER];
-    if (results.wasParsed(ENABLE_EXPERIMENT_OPTION)) {
-      analysisServerOptions.enabledExperiments =
-          (results[ENABLE_EXPERIMENT_OPTION] as List).cast<String>().toList();
-    }
     analysisServerOptions.useNewRelevance = results[USE_NEW_RELEVANCE];
 
     // Read in any per-SDK overrides specified in <sdk>/config/settings.json.
@@ -426,10 +411,6 @@
       }
     }
 
-    if (results[DARTPAD_OPTION]) {
-      UriContributor.suggestFilePaths = false;
-    }
-
     {
       bool disableCompletion = results[DISABLE_SERVER_FEATURE_COMPLETION];
       bool disableSearch = results[DISABLE_SERVER_FEATURE_SEARCH];
@@ -754,10 +735,6 @@
         valueHelp: 'name', help: 'an identifier used to identify the client');
     parser.addOption(CLIENT_VERSION,
         valueHelp: 'version', help: 'the version of the client');
-    parser.addFlag(DARTPAD_OPTION,
-        help: 'enable DartPad specific functionality',
-        defaultsTo: false,
-        hide: true);
     parser.addFlag(DISABLE_SERVER_EXCEPTION_HANDLING,
         // TODO(jcollins-g): Pipeline option through and apply to all
         // exception-nullifying runZoned() calls.
@@ -769,15 +746,6 @@
         help: 'disable all completion features', defaultsTo: false, hide: true);
     parser.addFlag(DISABLE_SERVER_FEATURE_SEARCH,
         help: 'disable all search features', defaultsTo: false, hide: true);
-    parser.addMultiOption(ENABLE_EXPERIMENT_OPTION,
-        help: 'Enable one or more experimental features. If multiple features '
-            'are being added, they should be comma separated.',
-        hide: true,
-        splitCommas: true);
-    parser.addFlag(ENABLE_INSTRUMENTATION_OPTION,
-        help: 'enable sending instrumentation information to a server',
-        defaultsTo: false,
-        negatable: false);
     parser.addOption(INSTRUMENTATION_LOG_FILE,
         valueHelp: 'file path',
         help: 'write instrumentation data to the given file');
@@ -843,8 +811,17 @@
     //
     // Deprecated options - no longer read from.
     //
-    parser.addFlag('use-fasta-parser', defaultsTo: true, hide: true);
+
+    // Removed 11/8/2020.
+    parser.addFlag('dartpad', hide: true);
+    // Removed 10/30/2020.
+    parser.addMultiOption('enable-experiment', hide: true);
+    // Removed 9/23/2020.
+    parser.addFlag('enable-instrumentation', hide: true);
+    // Removed 11/8/2020.
     parser.addFlag('preview-dart-2', hide: true);
+    // Removed 9/23/2020.
+    parser.addFlag('use-fasta-parser', hide: true);
 
     return parser;
   }
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/feature_computer.dart b/pkg/analysis_server/lib/src/services/completion/dart/feature_computer.dart
index 6f1e545..bb8262f 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/feature_computer.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/feature_computer.dart
@@ -525,7 +525,7 @@
     if (node.operator.end <= offset) {
       // RHS
       if (node.operator.type == TokenType.EQ) {
-        return node.leftHandSide.staticType;
+        return node.writeType;
       }
       var method = node.staticElement;
       if (method != null) {
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/uri_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/uri_contributor.dart
index b832581..6e53137 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/uri_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/uri_contributor.dart
@@ -14,13 +14,6 @@
 /// A contributor that produces suggestions based on the content of the file
 /// system to complete within URIs in import, export and part directives.
 class UriContributor extends DartCompletionContributor {
-  /// A flag indicating whether file: and package: URI suggestions should
-  /// be included in the list of completion suggestions.
-  // TODO(danrubel): remove this flag and related functionality
-  // once the UriContributor limits file: and package: URI suggestions
-  // to only those paths within context roots.
-  static bool suggestFilePaths = true;
-
   @override
   Future<void> computeSuggestions(
       DartCompletionRequest request, SuggestionBuilder builder) async {
@@ -93,17 +86,13 @@
       var partialUri = _extractPartialUri(node);
       if (partialUri != null) {
         _addDartSuggestions();
-        if (UriContributor.suggestFilePaths) {
-          _addPackageSuggestions(partialUri);
-          _addFileSuggestions(partialUri);
-        }
+        _addPackageSuggestions(partialUri);
+        _addFileSuggestions(partialUri);
       }
     } else if (parent is PartDirective && parent.uri == node) {
       var partialUri = _extractPartialUri(node);
       if (partialUri != null) {
-        if (UriContributor.suggestFilePaths) {
-          _addFileSuggestions(partialUri);
-        }
+        _addFileSuggestions(partialUri);
       }
     }
   }
diff --git a/pkg/analysis_server/lib/src/services/correction/bulk_fix_processor.dart b/pkg/analysis_server/lib/src/services/correction/bulk_fix_processor.dart
index 0de1a9d..dfece89 100644
--- a/pkg/analysis_server/lib/src/services/correction/bulk_fix_processor.dart
+++ b/pkg/analysis_server/lib/src/services/correction/bulk_fix_processor.dart
@@ -41,6 +41,7 @@
 import 'package:analysis_server/src/services/correction/dart/remove_initializer.dart';
 import 'package:analysis_server/src/services/correction/dart/remove_interpolation_braces.dart';
 import 'package:analysis_server/src/services/correction/dart/remove_method_declaration.dart';
+import 'package:analysis_server/src/services/correction/dart/remove_non_null_assertion.dart';
 import 'package:analysis_server/src/services/correction/dart/remove_operator.dart';
 import 'package:analysis_server/src/services/correction/dart/remove_this_expression.dart';
 import 'package:analysis_server/src/services/correction/dart/remove_type_annotation.dart';
@@ -64,6 +65,7 @@
 import 'package:analyzer/dart/analysis/analysis_context.dart';
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/error/error.dart';
+import 'package:analyzer/exception/exception.dart';
 import 'package:analyzer/source/error_processor.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/engine.dart' show AnalysisEngine;
@@ -123,7 +125,9 @@
     LintNames.empty_statements: [
       RemoveEmptyStatement.newInstance,
     ],
-    LintNames.hash_and_equals: [CreateMethod.equalsOrHashCode],
+    LintNames.hash_and_equals: [
+      CreateMethod.equalsOrHashCode,
+    ],
     LintNames.no_duplicate_case_values: [
       RemoveDuplicateCase.newInstance,
     ],
@@ -297,6 +301,9 @@
     CompileTimeErrorCode.UNDEFINED_METHOD: [
       DataDriven.newInstance,
     ],
+    CompileTimeErrorCode.UNDEFINED_NAMED_PARAMETER: [
+      DataDriven.newInstance,
+    ],
     CompileTimeErrorCode.UNDEFINED_SETTER: [
       DataDriven.newInstance,
     ],
@@ -326,7 +333,10 @@
   /// A map from an error code to a generator used to create the correction
   /// producer used to build a fix for that diagnostic. The generators used for
   /// lint rules are in the [lintProducerMap].
-  static const Map<ErrorCode, ProducerGenerator> nonLintProducerMap = {};
+  static const Map<ErrorCode, ProducerGenerator> nonLintProducerMap = {
+    StaticWarningCode.UNNECESSARY_NON_NULL_ASSERTION:
+        RemoveNonNullAssertion.newInstance,
+  };
 
   /// Information about the workspace containing the libraries in which changes
   /// will be produced.
@@ -389,6 +399,7 @@
   Future<void> _fixSingleError(DartFixContext fixContext,
       ResolvedUnitResult result, AnalysisError diagnostic) async {
     var context = CorrectionProducerContext(
+      applyingBulkFixes: true,
       dartFixContext: fixContext,
       diagnostic: diagnostic,
       resolvedResult: result,
@@ -408,28 +419,35 @@
     }
 
     var errorCode = diagnostic.errorCode;
-    if (errorCode is LintCode) {
-      var generators = lintProducerMap[errorCode.name];
-      if (generators != null) {
-        for (var generator in generators) {
+    try {
+      if (errorCode is LintCode) {
+        var generators = lintProducerMap[errorCode.name];
+        if (generators != null) {
+          for (var generator in generators) {
+            await compute(generator());
+          }
+        }
+      } else {
+        var generator = nonLintProducerMap[errorCode];
+        if (generator != null) {
           await compute(generator());
         }
-      }
-    } else {
-      var generator = nonLintProducerMap[errorCode];
-      if (generator != null) {
-        await compute(generator());
-      }
-      var multiGenerators = nonLintMultiProducerMap[errorCode];
-      if (multiGenerators != null) {
-        for (var multiGenerator in multiGenerators) {
-          var multiProducer = multiGenerator();
-          multiProducer.configure(context);
-          for (var producer in multiProducer.producers) {
-            await compute(producer);
+        var multiGenerators = nonLintMultiProducerMap[errorCode];
+        if (multiGenerators != null) {
+          for (var multiGenerator in multiGenerators) {
+            var multiProducer = multiGenerator();
+            multiProducer.configure(context);
+            for (var producer in multiProducer.producers) {
+              await compute(producer);
+            }
           }
         }
       }
+    } catch (e, s) {
+      throw CaughtException.withMessage(
+          'Exception generating fix for ${errorCode.name} in ${result.path}',
+          e,
+          s);
     }
   }
 }
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/abstract_producer.dart b/pkg/analysis_server/lib/src/services/correction/dart/abstract_producer.dart
index cb91e3b..66bd219 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/abstract_producer.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/abstract_producer.dart
@@ -129,10 +129,7 @@
       if (assignment.rightHandSide == expression) {
         if (assignment.operator.type == TokenType.EQ) {
           // v = myFunction();
-          var lhs = assignment.leftHandSide;
-          if (lhs != null) {
-            return lhs.staticType;
-          }
+          return assignment.writeType;
         } else {
           // v += myFunction();
           var method = assignment.staticElement;
@@ -230,6 +227,10 @@
   final ChangeWorkspace workspace;
   final DartFixContext dartFixContext;
 
+  /// A flag indicating whether the correction producers will be run in the
+  /// context of applying bulk fixes.
+  final bool applyingBulkFixes;
+
   final Diagnostic diagnostic;
 
   AstNode _node;
@@ -237,6 +238,7 @@
   CorrectionProducerContext({
     @required this.resolvedResult,
     @required this.workspace,
+    this.applyingBulkFixes = false,
     this.dartFixContext,
     this.diagnostic,
     this.selectionOffset = -1,
@@ -318,6 +320,8 @@
   /// Initialize a newly created producer.
   _AbstractCorrectionProducer();
 
+  bool get applyingBulkFixes => _context.applyingBulkFixes;
+
   /// The most deeply nested node that completely covers the highlight region of
   /// the diagnostic, or `null` if there is no diagnostic or if such a node does
   /// not exist.
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/add_explicit_cast.dart b/pkg/analysis_server/lib/src/services/correction/dart/add_explicit_cast.dart
index 2af769a..f66b06f 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/add_explicit_cast.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/add_explicit_cast.dart
@@ -37,7 +37,7 @@
       parent = target.parent;
     }
     if (parent is AssignmentExpression && target == parent.rightHandSide) {
-      toType = parent.leftHandSide.staticType;
+      toType = parent.writeType;
     } else if (parent is VariableDeclaration && target == parent.initializer) {
       toType = parent.declaredElement.type;
     } else {
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/add_null_check.dart b/pkg/analysis_server/lib/src/services/correction/dart/add_null_check.dart
index c66d036..7fcb556 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/add_null_check.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/add_null_check.dart
@@ -36,7 +36,7 @@
     DartType toType;
     var parent = target.parent;
     if (parent is AssignmentExpression && target == parent.rightHandSide) {
-      toType = parent.leftHandSide.staticType;
+      toType = parent.writeType;
     } else if (parent is VariableDeclaration && target == parent.initializer) {
       toType = parent.declaredElement.type;
     } else if (parent is ArgumentList) {
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/create_method.dart b/pkg/analysis_server/lib/src/services/correction/dart/create_method.dart
index 17509ff..dd39818 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/create_method.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/create_method.dart
@@ -36,13 +36,18 @@
   }
 
   Future<void> createEqualsOrHashCode(ChangeBuilder builder) async {
-    final methodDecl = node.thisOrAncestorOfType<MethodDeclaration>();
-    final classDecl = methodDecl.thisOrAncestorOfType<ClassDeclaration>();
-    if (methodDecl != null && classDecl != null) {
+    final memberDecl = node.thisOrAncestorOfType<ClassMember>();
+    if (memberDecl == null) {
+      return;
+    }
+    final classDecl = memberDecl.thisOrAncestorOfType<ClassDeclaration>();
+    if (classDecl != null) {
       final classElement = classDecl.declaredElement;
 
+      var missingEquals = memberDecl is FieldDeclaration ||
+          (memberDecl as MethodDeclaration).name.name == 'hashCode';
       ExecutableElement element;
-      if (methodDecl.name.name == 'hashCode') {
+      if (missingEquals) {
         _memberName = '==';
         element = classElement.lookUpInheritedMethod(
             _memberName, classElement.library);
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/data_driven.dart b/pkg/analysis_server/lib/src/services/correction/dart/data_driven.dart
index 176d2c6..d9d82b5 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/data_driven.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/data_driven.dart
@@ -35,59 +35,16 @@
         importedUris.add(Uri.parse(uri));
       }
     }
-    var matcher =
-        ElementMatcher(importedUris: importedUris, name: name, kinds: _kinds);
+    var matcher = ElementMatcher(
+        importedUris: importedUris, name: name, kinds: _kindsForNode(node));
     for (var set in _availableTransformSetsForLibrary(library)) {
-      for (var transform in set.transformsFor(matcher)) {
+      for (var transform
+          in set.transformsFor(matcher, applyingBulkFixes: applyingBulkFixes)) {
         yield DataDrivenFix(transform);
       }
     }
   }
 
-  List<ElementKind> get _kinds {
-    AstNode child;
-    var node = this.node;
-    while (node != null) {
-      if (node is ConstructorName) {
-        return const [ElementKind.constructorKind];
-      } else if (node is ExtensionOverride) {
-        return const [ElementKind.extensionKind];
-      } else if (node is InstanceCreationExpression) {
-        return const [ElementKind.constructorKind];
-      } else if (node is MethodInvocation) {
-        if (node.target == child) {
-          return const [
-            ElementKind.classKind,
-            ElementKind.enumKind,
-            ElementKind.mixinKind
-          ];
-        } else if (node.realTarget != null) {
-          return const [ElementKind.constructorKind, ElementKind.methodKind];
-        }
-        return const [
-          ElementKind.classKind,
-          ElementKind.extensionKind,
-          ElementKind.functionKind,
-          ElementKind.methodKind
-        ];
-      } else if (node is NamedType) {
-        var parent = node.parent;
-        if (parent is ConstructorName && parent.name == null) {
-          return const [ElementKind.classKind, ElementKind.constructorKind];
-        }
-        return const [
-          ElementKind.classKind,
-          ElementKind.enumKind,
-          ElementKind.mixinKind,
-          ElementKind.typedefKind
-        ];
-      }
-      child = node;
-      node = node.parent;
-    }
-    return null;
-  }
-
   /// Return the name of the element that was changed.
   String get _name {
     String nameFromParent(AstNode node) {
@@ -137,6 +94,67 @@
     return TransformSetManager.instance.forLibrary(library);
   }
 
+  List<ElementKind> _kindsForNode(AstNode node, {AstNode child}) {
+    if (node is ConstructorName) {
+      return const [ElementKind.constructorKind];
+    } else if (node is ExtensionOverride) {
+      return const [ElementKind.extensionKind];
+    } else if (node is InstanceCreationExpression) {
+      return const [ElementKind.constructorKind];
+    } else if (node is Label) {
+      var argumentList = node.parent.parent;
+      return _kindsForNode(argumentList.parent, child: argumentList);
+    } else if (node is MethodInvocation) {
+      assert(child != null);
+      if (node.target == child) {
+        return const [
+          ElementKind.classKind,
+          ElementKind.enumKind,
+          ElementKind.mixinKind
+        ];
+      } else if (node.realTarget != null) {
+        return const [ElementKind.constructorKind, ElementKind.methodKind];
+      }
+      return const [
+        ElementKind.classKind,
+        ElementKind.extensionKind,
+        ElementKind.functionKind,
+        ElementKind.methodKind
+      ];
+    } else if (node is NamedType) {
+      var parent = node.parent;
+      if (parent is ConstructorName && parent.name == null) {
+        return const [ElementKind.classKind, ElementKind.constructorKind];
+      }
+      return const [
+        ElementKind.classKind,
+        ElementKind.enumKind,
+        ElementKind.mixinKind,
+        ElementKind.typedefKind
+      ];
+    } else if (node is PrefixedIdentifier) {
+      if (node.prefix == child) {
+        return const [
+          ElementKind.classKind,
+          ElementKind.enumKind,
+          ElementKind.extensionKind,
+          ElementKind.mixinKind,
+          ElementKind.typedefKind
+        ];
+      }
+      return const [
+        ElementKind.fieldKind,
+        ElementKind.getterKind,
+        ElementKind.setterKind
+      ];
+    } else if (node is PropertyAccess) {
+      return const [ElementKind.getterKind, ElementKind.setterKind];
+    } else if (node is SimpleIdentifier) {
+      return _kindsForNode(node.parent, child: node);
+    }
+    return null;
+  }
+
   /// Return an instance of this class. Used as a tear-off in `FixProcessor`.
   static DataDriven newInstance() => DataDriven();
 }
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/flutter_convert_to_stateful_widget.dart b/pkg/analysis_server/lib/src/services/correction/dart/flutter_convert_to_stateful_widget.dart
index 21325d1..80aa9ae 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/flutter_convert_to_stateful_widget.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/flutter_convert_to_stateful_widget.dart
@@ -9,6 +9,7 @@
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/source/source_range.dart';
+import 'package:analyzer/src/dart/ast/extensions.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart' hide Element;
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
@@ -257,7 +258,7 @@
       }
     }
     if (node.inSetterContext()) {
-      var element = node.staticElement;
+      var element = node.writeOrReadElement;
       if (element is PropertyAccessorElement) {
         var field = element.variable;
         if (field is FieldElement) {
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/import_add_show.dart b/pkg/analysis_server/lib/src/services/correction/dart/import_add_show.dart
index b667ed8..306312f 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/import_add_show.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/import_add_show.dart
@@ -10,6 +10,7 @@
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/src/dart/ast/extensions.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
 
@@ -61,7 +62,7 @@
 
   @override
   void visitSimpleIdentifier(SimpleIdentifier node) {
-    var element = node.staticElement;
+    var element = node.writeOrReadElement;
     if (element != null &&
         (namespace[node.name] == element ||
             (node.name != element.name &&
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/make_field_not_final.dart b/pkg/analysis_server/lib/src/services/correction/dart/make_field_not_final.dart
index 59e8499..b8db161 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/make_field_not_final.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/make_field_not_final.dart
@@ -7,6 +7,7 @@
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/src/dart/ast/extensions.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
 import 'package:analyzer_plugin/utilities/range_factory.dart';
@@ -24,8 +25,8 @@
   Future<void> compute(ChangeBuilder builder) async {
     var node = this.node;
     if (node is SimpleIdentifier &&
-        node.staticElement is PropertyAccessorElement) {
-      PropertyAccessorElement getter = node.staticElement;
+        node.writeOrReadElement is PropertyAccessorElement) {
+      PropertyAccessorElement getter = node.writeOrReadElement;
       if (getter.isGetter &&
           getter.isSynthetic &&
           !getter.variable.isSynthetic &&
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/make_variable_nullable.dart b/pkg/analysis_server/lib/src/services/correction/dart/make_variable_nullable.dart
index 5a4d2ec..acd8708 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/make_variable_nullable.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/make_variable_nullable.dart
@@ -28,47 +28,17 @@
   Future<void> compute(ChangeBuilder builder) async {
     var node = coveredNode;
     var parent = node?.parent;
-    if (unit.featureSet.isEnabled(Feature.non_nullable) &&
-        parent is AssignmentExpression &&
-        parent.rightHandSide == node) {
-      var leftHandSide = parent.leftHandSide;
-      if (leftHandSide is SimpleIdentifier) {
-        var element = leftHandSide.staticElement;
-        if (element is LocalVariableElement) {
-          var oldType = element.type;
-          var newType = (node as Expression).staticType;
-          if (node is NullLiteral) {
-            newType = (oldType as InterfaceTypeImpl)
-                .withNullability(NullabilitySuffix.question);
-          } else if (!typeSystem.isAssignableTo(
-              oldType, typeSystem.promoteToNonNull(newType))) {
-            return;
-          }
-          var declarationList =
-              _findDeclaration(element, parent.thisOrAncestorOfType<Block>());
-          if (declarationList == null || declarationList.variables.length > 1) {
-            return;
-          }
-          var variable = declarationList.variables[0];
-          _variableName = variable.name.name;
-          await builder.addDartFileEdit(file, (builder) {
-            var keyword = declarationList.keyword;
-            if (keyword != null && keyword.type == Keyword.VAR) {
-              builder.addReplacement(range.token(keyword), (builder) {
-                builder.writeType(newType);
-              });
-            } else if (keyword == null) {
-              if (declarationList.type == null) {
-                builder.addInsertion(variable.offset, (builder) {
-                  builder.writeType(newType);
-                  builder.write(' ');
-                });
-              } else {
-                builder.addSimpleInsertion(declarationList.type.end, '?');
-              }
-            }
-          });
-        }
+    if (unit.featureSet.isEnabled(Feature.non_nullable)) {
+      if (node is SimpleIdentifier && parent is SimpleFormalParameter) {
+        await _forSimpleFormalParameter(builder, node, parent);
+      } else if (node is SimpleIdentifier &&
+          parent is FunctionTypedFormalParameter) {
+        await _forFunctionTypedFormalParameter(builder, node, parent);
+      } else if (node is SimpleIdentifier && parent is FieldFormalParameter) {
+        await _forFieldFormalParameter(builder, node, parent);
+      } else if (parent is AssignmentExpression &&
+          parent.rightHandSide == node) {
+        await _forVariableDeclaration(builder, node, parent);
       }
     }
   }
@@ -101,6 +71,108 @@
     return null;
   }
 
+  /// Makes [parameter] nullable if possible.
+  Future<void> _forFieldFormalParameter(ChangeBuilder builder,
+      SimpleIdentifier name, FieldFormalParameter parameter) async {
+    if (parameter.parameters != null) {
+      // A function-typed field formal parameter.
+      if (parameter.question != null) {
+        return;
+      }
+      _variableName = parameter.identifier.name;
+      await builder.addDartFileEdit(file, (builder) {
+        // Add '?' after `)`.
+        builder.addSimpleInsertion(parameter.endToken.end, '?');
+      });
+    } else {
+      if (!_typeCanBeMadeNullable(parameter.type)) {
+        return;
+      }
+      _variableName = parameter.identifier.name;
+      await builder.addDartFileEdit(file, (builder) {
+        builder.addSimpleInsertion(parameter.type.end, '?');
+      });
+    }
+  }
+
+  /// Makes [parameter] nullable if possible.
+  Future<void> _forFunctionTypedFormalParameter(ChangeBuilder builder,
+      SimpleIdentifier name, FunctionTypedFormalParameter parameter) async {
+    if (parameter.question != null) {
+      return;
+    }
+    _variableName = parameter.identifier.name;
+    await builder.addDartFileEdit(file, (builder) {
+      // Add '?' after `)`.
+      builder.addSimpleInsertion(parameter.endToken.end, '?');
+    });
+  }
+
+  Future<void> _forSimpleFormalParameter(ChangeBuilder builder,
+      SimpleIdentifier name, SimpleFormalParameter parameter) async {
+    if (!_typeCanBeMadeNullable(parameter.type)) {
+      return;
+    }
+    _variableName = parameter.identifier.name;
+    await builder.addDartFileEdit(file, (builder) {
+      builder.addSimpleInsertion(parameter.type.end, '?');
+    });
+  }
+
+  Future<void> _forVariableDeclaration(
+      ChangeBuilder builder, AstNode node, AssignmentExpression parent) async {
+    var leftHandSide = parent.leftHandSide;
+    if (leftHandSide is SimpleIdentifier) {
+      var element = leftHandSide.staticElement;
+      if (element is LocalVariableElement) {
+        var oldType = element.type;
+        var newType = (node as Expression).staticType;
+        if (node is NullLiteral) {
+          newType = (oldType as InterfaceTypeImpl)
+              .withNullability(NullabilitySuffix.question);
+        } else if (!typeSystem.isAssignableTo(
+            oldType, typeSystem.promoteToNonNull(newType))) {
+          return;
+        }
+        var declarationList =
+            _findDeclaration(element, parent.thisOrAncestorOfType<Block>());
+        if (declarationList == null || declarationList.variables.length > 1) {
+          return;
+        }
+        var variable = declarationList.variables[0];
+        _variableName = variable.name.name;
+        await builder.addDartFileEdit(file, (builder) {
+          var keyword = declarationList.keyword;
+          if (keyword != null && keyword.type == Keyword.VAR) {
+            builder.addReplacement(range.token(keyword), (builder) {
+              builder.writeType(newType);
+            });
+          } else if (keyword == null) {
+            if (declarationList.type == null) {
+              builder.addInsertion(variable.offset, (builder) {
+                builder.writeType(newType);
+                builder.write(' ');
+              });
+            } else {
+              builder.addSimpleInsertion(declarationList.type.end, '?');
+            }
+          }
+        });
+      }
+    }
+  }
+
+  bool _typeCanBeMadeNullable(TypeAnnotation typeAnnotation) {
+    // Ensure that there is a type annotation.
+    if (typeAnnotation == null) {
+      return false;
+    }
+    if (typeSystem.isNullable(typeAnnotation.type)) {
+      return false;
+    }
+    return true;
+  }
+
   /// Return an instance of this class. Used as a tear-off in `FixProcessor`.
   static MakeVariableNullable newInstance() => MakeVariableNullable();
 }
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/remove_dead_if_null.dart b/pkg/analysis_server/lib/src/services/correction/dart/remove_dead_if_null.dart
index bf576ec..17e9a2d 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/remove_dead_if_null.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/remove_dead_if_null.dart
@@ -6,6 +6,8 @@
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/token.dart';
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/source/source_range.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
 import 'package:analyzer_plugin/utilities/range_factory.dart';
@@ -16,41 +18,44 @@
 
   @override
   Future<void> compute(ChangeBuilder builder) async {
-    //
-    // Find the dead if-null expression.
-    //
-    BinaryExpression findIfNull() {
-      var child = node;
-      var parent = node.parent;
-      while (parent != null) {
-        if (parent is BinaryExpression &&
-            parent.operator.type == TokenType.QUESTION_QUESTION &&
-            parent.rightOperand == child) {
-          return parent;
-        }
-        child = parent;
-        parent = parent.parent;
-      }
-      return null;
-    }
-
-    var expression = findIfNull();
-    if (expression == null) {
+    var sourceRange = findIfNull();
+    if (sourceRange == null) {
       return;
     }
-    //
-    // Extract the information needed to build the edit.
-    //
-    var sourceRange =
-        range.endEnd(expression.leftOperand, expression.rightOperand);
-    //
-    // Build the edit.
-    //
+
     await builder.addDartFileEdit(file, (builder) {
       builder.addDeletion(sourceRange);
     });
   }
 
-  /// Return an instance of this class. Used as a tear-off in `FixProcessor`.
+  /// Finds the dead if-null expression above [node].
+  SourceRange findIfNull() {
+    var child = node;
+    var parent = node.parent;
+    while (parent != null) {
+      if (parent is BinaryExpression &&
+          parent.operator.type == TokenType.QUESTION_QUESTION &&
+          parent.rightOperand == child) {
+        return range.endEnd(parent.leftOperand, parent.rightOperand);
+      }
+      if (parent is AssignmentExpression &&
+          parent.operator.type == TokenType.QUESTION_QUESTION_EQ &&
+          parent.rightHandSide == child) {
+        var assignee = parent.leftHandSide;
+        if (parent.parent is ExpressionStatement &&
+            assignee is SimpleIdentifier &&
+            assignee.staticElement is PromotableElement) {
+          return utils.getLinesRange(range.node(parent.parent));
+        } else {
+          return range.endEnd(parent.leftHandSide, parent.rightHandSide);
+        }
+      }
+      child = parent;
+      parent = parent.parent;
+    }
+    return null;
+  }
+
+  /// Returns an instance of this class. Used as a tear-off in `FixProcessor`.
   static RemoveDeadIfNull newInstance() => RemoveDeadIfNull();
 }
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/remove_non_null_assertion.dart b/pkg/analysis_server/lib/src/services/correction/dart/remove_non_null_assertion.dart
new file mode 100644
index 0000000..ff01bf5
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/dart/remove_non_null_assertion.dart
@@ -0,0 +1,33 @@
+// Copyright (c) 2020, 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/src/services/correction/dart/abstract_producer.dart';
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/token.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:analyzer_plugin/utilities/range_factory.dart';
+
+class RemoveNonNullAssertion extends CorrectionProducer {
+  @override
+  FixKind get fixKind => DartFixKind.REMOVE_NON_NULL_ASSERTION;
+
+  @override
+  Future<void> compute(ChangeBuilder builder) async {
+    final expression = node;
+
+    if (expression is PostfixExpression &&
+        expression.operator.type == TokenType.BANG) {
+      var bangToken = expression.operator;
+
+      await builder.addDartFileEdit(file, (builder) {
+        builder.addDeletion(range.startStart(bangToken, bangToken.next));
+      });
+    }
+  }
+
+  /// Return an instance of this class. Used as a tear-off in `FixProcessor`.
+  static RemoveNonNullAssertion newInstance() => RemoveNonNullAssertion();
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/remove_unused.dart b/pkg/analysis_server/lib/src/services/correction/dart/remove_unused.dart
index 790b766..156be05 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/remove_unused.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/remove_unused.dart
@@ -9,6 +9,7 @@
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/source/source_range.dart';
+import 'package:analyzer/src/dart/ast/extensions.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
 import 'package:analyzer_plugin/utilities/range_factory.dart';
@@ -177,7 +178,7 @@
 
   @override
   void visitSimpleIdentifier(SimpleIdentifier node) {
-    final staticElement = node.staticElement;
+    final staticElement = node.writeOrReadElement;
     if (staticElement == element) {
       references.add(node);
     } else if (staticElement is PropertyAccessorElement) {
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/replace_with_var.dart b/pkg/analysis_server/lib/src/services/correction/dart/replace_with_var.dart
index 270bb86..cd226a8 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/replace_with_var.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/replace_with_var.dart
@@ -45,7 +45,11 @@
         if (initializer is TypedLiteral) {
           if (initializer.typeArguments == null) {
             typeArgumentsText = utils.getNodeText(type.typeArguments);
-            typeArgumentsOffset = initializer.offset;
+            if (initializer is ListLiteral) {
+              typeArgumentsOffset = initializer.leftBracket.offset;
+            } else if (initializer is SetOrMapLiteral) {
+              typeArgumentsOffset = initializer.leftBracket.offset;
+            }
           }
         } else if (initializer is InstanceCreationExpression) {
           if (initializer.constructorName.type.typeArguments == null) {
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/shadow_field.dart b/pkg/analysis_server/lib/src/services/correction/dart/shadow_field.dart
index 07a33dc..2f96ebb 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/shadow_field.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/shadow_field.dart
@@ -8,6 +8,7 @@
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/src/dart/ast/extensions.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
 
@@ -20,7 +21,7 @@
     if (node is! SimpleIdentifier) {
       return;
     }
-    var element = (node as SimpleIdentifier).staticElement;
+    var element = (node as SimpleIdentifier).writeOrReadElement;
     if (element is! PropertyAccessorElement) {
       return;
     }
@@ -119,7 +120,7 @@
 
   @override
   void visitSimpleIdentifier(SimpleIdentifier node) {
-    if (node.staticElement == setter) {
+    if (node.writeOrReadElement == setter) {
       hasSetterReference = true;
     }
   }
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/surround_with.dart b/pkg/analysis_server/lib/src/services/correction/dart/surround_with.dart
index 90a50c5..be324d4 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/surround_with.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/surround_with.dart
@@ -13,6 +13,12 @@
 class SurroundWith extends MultiCorrectionProducer {
   @override
   Iterable<CorrectionProducer> get producers sync* {
+    // If the node is the CompilationUnit, the selected statements must span multiple
+    // top level items and cannot be surrounded with anything.
+    if (node is CompilationUnit) {
+      return;
+    }
+
     // prepare selected statements
     var selectionAnalyzer = StatementAnalyzer(
         resolvedResult, SourceRange(selectionOffset, selectionLength));
diff --git a/pkg/analysis_server/lib/src/services/correction/fix.dart b/pkg/analysis_server/lib/src/services/correction/fix.dart
index 534d910..fe6cbc4 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix.dart
@@ -365,6 +365,8 @@
       'dart.fix.remove.methodDeclaration', 50, 'Remove method declaration');
   static const REMOVE_NAME_FROM_COMBINATOR = FixKind(
       'dart.fix.remove.nameFromCombinator', 50, "Remove name from '{0}'");
+  static const REMOVE_NON_NULL_ASSERTION =
+      FixKind('dart.fix.remove.nonNullAssertion', 50, "Remove the '!'");
   static const REMOVE_OPERATOR =
       FixKind('dart.fix.remove.operator', 50, 'Remove the operator');
   static const REMOVE_PARAMETERS_IN_GETTER_DECLARATION = FixKind(
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/accessor.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/accessor.dart
new file mode 100644
index 0000000..0d17244
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/accessor.dart
@@ -0,0 +1,136 @@
+// Copyright (c) 2020, 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/src/services/correction/fix/data_driven/parameter_reference.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+
+/// A class that can be used to access a value from a target.
+abstract class Accessor {
+  /// Return the result of using this accessor to access a value from the
+  /// [target].
+  AccessorResult getValue(Object target);
+}
+
+/// The result of using an accessor to get a result.
+abstract class AccessorResult {
+  /// Initialize a newly created result.
+  const AccessorResult();
+
+  /// Return `true` if the accessor returned a valid result.
+  bool get isValid;
+
+  /// Return the result of the accessor if it was valid.
+  ///
+  /// Throws a `StateError` if the accessor did not return a valid result.
+  Object get result;
+}
+
+/// An accessor that returns a specific argument from an argument list.
+class ArgumentAccessor extends Accessor {
+  /// The parameter corresponding to the argument from the original invocation.
+  final ParameterReference parameter;
+
+  /// Initialize a newly created accessor to access the argument that
+  /// corresponds to the given [parameter].
+  ArgumentAccessor(this.parameter) : assert(parameter != null);
+
+  @override
+  AccessorResult getValue(Object target) {
+    if (target is AstNode) {
+      var argumentList = _getArgumentList(target);
+      if (argumentList != null) {
+        var argument = parameter.argumentFrom(argumentList);
+        if (argument != null) {
+          return ValidResult(argument);
+        }
+      }
+    }
+    return const InvalidResult();
+  }
+
+  /// Return the argument list associated with the [node].
+  ArgumentList _getArgumentList(AstNode node) {
+    if (node is Annotation) {
+      return node.arguments;
+    } else if (node is ExtensionOverride) {
+      return node.argumentList;
+    } else if (node is InstanceCreationExpression) {
+      return node.argumentList;
+    } else if (node is InvocationExpression) {
+      return node.argumentList;
+    } else if (node is RedirectingConstructorInvocation) {
+      return node.argumentList;
+    } else if (node is SuperConstructorInvocation) {
+      return node.argumentList;
+    }
+    return null;
+  }
+}
+
+/// A representation of an invalid result.
+class InvalidResult implements AccessorResult {
+  /// Initialize a newly created invalid result.
+  const InvalidResult();
+
+  @override
+  bool get isValid => false;
+
+  @override
+  Object get result => throw StateError('Cannot access an invalid result');
+}
+
+/// An accessor that returns a specific type argument from a type argument list.
+class TypeArgumentAccessor extends Accessor {
+  /// The index of the type argument.
+  final int index;
+
+  /// Initialize a newly created accessor to access the type argument at the
+  /// given [index].
+  TypeArgumentAccessor(this.index) : assert(index != null);
+
+  @override
+  AccessorResult getValue(Object target) {
+    if (target is AstNode) {
+      var typeArgumentList = _getTypeArgumentList(target);
+      if (typeArgumentList != null) {
+        var arguments = typeArgumentList.arguments;
+        if (arguments.length > index) {
+          var argument = arguments[index];
+          if (argument != null) {
+            return ValidResult(argument);
+          }
+        }
+      }
+    }
+    return const InvalidResult();
+  }
+
+  /// Return the type argument list associated with the [node].
+  TypeArgumentList _getTypeArgumentList(AstNode node) {
+    if (node is ExtensionOverride) {
+      return node.typeArguments;
+    } else if (node is InstanceCreationExpression) {
+      return node.constructorName.type.typeArguments;
+    } else if (node is InvocationExpression) {
+      return node.typeArguments;
+    } else if (node is NamedType) {
+      return node.typeArguments;
+    } else if (node is TypedLiteral) {
+      return node.typeArguments;
+    }
+    return null;
+  }
+}
+
+/// A representation of a valid result.
+class ValidResult implements AccessorResult {
+  @override
+  final Object result;
+
+  /// Initialize a newly created valid result.
+  ValidResult(this.result);
+
+  @override
+  bool get isValid => true;
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/add_type_parameter.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/add_type_parameter.dart
index 936237a..6fbcad4 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/add_type_parameter.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/add_type_parameter.dart
@@ -50,7 +50,7 @@
   @override
   _Data validate(DataDrivenFix fix) {
     var node = fix.node;
-    var context = TemplateContext(node, fix.utils);
+    var context = TemplateContext(getInvocation(node), fix.utils);
     if (node is NamedType) {
       // wrong_number_of_type_arguments
       // wrong_number_of_type_arguments_constructor
@@ -101,7 +101,7 @@
 
   void _applyToTypeArguments(
       DartFileEditBuilder builder, DataDrivenFix fix, _TypeArgumentData data) {
-    var context = TemplateContext(fix.node, fix.utils);
+    var context = TemplateContext(getInvocation(fix.node), fix.utils);
     var typeArguments = data.typeArguments;
     if (typeArguments == null) {
       // Adding the first type argument.
@@ -130,7 +130,7 @@
 
   void _applyToTypeParameters(
       DartFileEditBuilder builder, DataDrivenFix fix, _TypeParameterData data) {
-    var context = TemplateContext(fix.node, fix.utils);
+    var context = TemplateContext(getInvocation(fix.node), fix.utils);
 
     void writeParameter(DartEditBuilder builder) {
       builder.write(name);
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/change.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/change.dart
index f73f6ae..39b5db6 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/change.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/change.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/src/services/correction/dart/data_driven.dart';
+import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
 
 /// The behavior common to all of the changes used to construct a transform.
@@ -12,6 +13,36 @@
   /// [validate] method.
   void apply(DartFileEditBuilder builder, DataDrivenFix fix, D data);
 
+  /// Return the invocation containing the given [node]. The invocation will be
+  /// either an instance creation expression, function invocation, method
+  /// invocation, or an extension override.
+  AstNode getInvocation(AstNode node) {
+    if (node is ArgumentList) {
+      return node.parent;
+    } else if (node is InstanceCreationExpression ||
+        node is InvocationExpression) {
+      return node;
+    } else if (node is SimpleIdentifier) {
+      var parent = node.parent;
+      if (parent is ConstructorName) {
+        var grandparent = parent.parent;
+        if (grandparent is InstanceCreationExpression) {
+          return grandparent;
+        }
+      } else if (parent is MethodInvocation && parent.methodName == node) {
+        return parent;
+      }
+    } else if (node is TypeArgumentList) {
+      var parent = node.parent;
+      if (parent is InvocationExpression) {
+        return parent;
+      } else if (parent is ExtensionOverride) {
+        return parent;
+      }
+    }
+    return null;
+  }
+
   /// Validate that this change can be applied. Return the data to be passed to
   /// [apply] if the change can be applied, or `null` if it can't be applied.
   D validate(DataDrivenFix fix);
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/code_fragment_parser.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/code_fragment_parser.dart
new file mode 100644
index 0000000..649597a
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/code_fragment_parser.dart
@@ -0,0 +1,310 @@
+// Copyright (c) 2020, 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/src/services/correction/fix/data_driven/accessor.dart';
+import 'package:analysis_server/src/services/correction/fix/data_driven/parameter_reference.dart';
+import 'package:analysis_server/src/services/correction/fix/data_driven/transform_set_error_code.dart';
+import 'package:analyzer/error/listener.dart';
+
+/// A parser for the textual representation of a code fragment.
+class CodeFragmentParser {
+  /// The error reporter to which diagnostics will be reported.
+  final ErrorReporter errorReporter;
+
+  /// The amount to be added to translate from offsets within the content to
+  /// offsets within the file.
+  int delta;
+
+  /// The tokens being parsed.
+  List<_Token> tokens;
+
+  /// The accessors that have been parsed.
+  List<Accessor> accessors = [];
+
+  /// Initialize a newly created parser to report errors to the [errorReporter].
+  CodeFragmentParser(this.errorReporter);
+
+  /// Parse the [content] into a list of accessors. Add the [delta] to translate
+  /// from offsets within the content to offsets within the file.
+  ///
+  /// <content> ::=
+  ///   <accessor> ('.' <accessor>)*
+  List<Accessor> parse(String content, int delta) {
+    this.delta = delta;
+    tokens = _CodeFragmentScanner(content, delta, errorReporter).scan();
+    if (tokens == null) {
+      // The error has already been reported.
+      return null;
+    }
+    var index = _parseAccessor(0);
+    while (index < tokens.length) {
+      var token = tokens[index];
+      if (token.kind == _TokenKind.period) {
+        index = _parseAccessor(index + 1);
+      } else {
+        errorReporter.reportErrorForOffset(TransformSetErrorCode.wrongToken,
+            token.offset + delta, token.length, ['.', token.kind.displayName]);
+        return null;
+      }
+    }
+    return accessors;
+  }
+
+  /// Return the token at the given [index] if it exists and if it has one of
+  /// the [validKinds]. Report an error and return `null` if those conditions
+  /// aren't met.
+  _Token _expect(int index, List<_TokenKind> validKinds) {
+    String validKindsDisplayString() {
+      var buffer = StringBuffer();
+      for (var i = 0; i < validKinds.length; i++) {
+        if (i > 0) {
+          if (i == validKinds.length - 1) {
+            buffer.write(' or ');
+          } else {
+            buffer.write(', ');
+          }
+        }
+        buffer.write(validKinds[i].displayName);
+      }
+      return buffer.toString();
+    }
+
+    if (index >= tokens.length) {
+      var offset = 0;
+      var length = 0;
+      if (tokens.isNotEmpty) {
+        var last = tokens.last;
+        offset = last.offset;
+        length = last.length;
+      }
+      errorReporter.reportErrorForOffset(TransformSetErrorCode.missingToken,
+          offset + delta, length, [validKindsDisplayString()]);
+      return null;
+    }
+    var token = tokens[index];
+    if (!validKinds.contains(token.kind)) {
+      errorReporter.reportErrorForOffset(
+          TransformSetErrorCode.wrongToken,
+          token.offset + delta,
+          token.length,
+          [validKindsDisplayString(), token.kind.displayName]);
+      return null;
+    }
+    return token;
+  }
+
+  /// Parse an accessor.
+  ///
+  /// <accessor> ::=
+  ///   <identifier> '[' (<integer> | <identifier>) ']'
+  int _parseAccessor(int index) {
+    var token = _expect(index, const [_TokenKind.identifier]);
+    if (token == null) {
+      // The error has already been reported.
+      return tokens.length;
+    }
+    var identifier = token.lexeme;
+    if (identifier == 'arguments') {
+      token = _expect(index + 1, const [_TokenKind.openSquareBracket]);
+      if (token == null) {
+        // The error has already been reported.
+        return tokens.length;
+      }
+      token = _expect(index + 2, [_TokenKind.identifier, _TokenKind.integer]);
+      if (token == null) {
+        // The error has already been reported.
+        return tokens.length;
+      }
+      ParameterReference reference;
+      if (token.kind == _TokenKind.identifier) {
+        reference = NamedParameterReference(token.lexeme);
+      } else {
+        var argumentIndex = int.parse(token.lexeme);
+        reference = PositionalParameterReference(argumentIndex);
+      }
+      token = _expect(index + 3, [_TokenKind.closeSquareBracket]);
+      if (token == null) {
+        // The error has already been reported.
+        return tokens.length;
+      }
+      accessors.add(ArgumentAccessor(reference));
+      return index + 4;
+    } else if (identifier == 'typeArguments') {
+      token = _expect(index + 1, const [_TokenKind.openSquareBracket]);
+      if (token == null) {
+        // The error has already been reported.
+        return tokens.length;
+      }
+      token = _expect(index + 2, [_TokenKind.integer]);
+      if (token == null) {
+        // The error has already been reported.
+        return tokens.length;
+      }
+      var argumentIndex = int.parse(token.lexeme);
+      token = _expect(index + 3, [_TokenKind.closeSquareBracket]);
+      if (token == null) {
+        // The error has already been reported.
+        return tokens.length;
+      }
+      accessors.add(TypeArgumentAccessor(argumentIndex));
+      return index + 4;
+    } else {
+      errorReporter.reportErrorForOffset(TransformSetErrorCode.unknownAccessor,
+          token.offset + delta, token.length, [identifier]);
+      return tokens.length;
+    }
+  }
+}
+
+/// A scanner for the textual representation of a code fragment.
+class _CodeFragmentScanner {
+  static final int $0 = '0'.codeUnitAt(0);
+
+  static final int $9 = '9'.codeUnitAt(0);
+
+  static final int $a = 'a'.codeUnitAt(0);
+
+  static final int $z = 'z'.codeUnitAt(0);
+
+  static final int $A = 'A'.codeUnitAt(0);
+  static final int $Z = 'Z'.codeUnitAt(0);
+  static final int closeSquareBracket = ']'.codeUnitAt(0);
+  static final int carriageReturn = '\r'.codeUnitAt(0);
+  static final int newline = '\n'.codeUnitAt(0);
+  static final int openSquareBracket = '['.codeUnitAt(0);
+  static final int period = '.'.codeUnitAt(0);
+  static final int space = ' '.codeUnitAt(0);
+
+  /// The string being scanned.
+  final String content;
+
+  /// The length of the string being scanned.
+  final int length;
+
+  /// The offset in the file of the first character in the string being scanned.
+  final int delta;
+
+  /// The error reporter to which diagnostics will be reported.
+  final ErrorReporter errorReporter;
+
+  /// Initialize a newly created scanner to scan the given [content].
+  _CodeFragmentScanner(this.content, this.delta, this.errorReporter)
+      : length = content.length;
+
+  /// Return the tokens in the content, or `null` if there is an error in the
+  /// content that prevents it from being scanned.
+  List<_Token> scan() {
+    if (content.isEmpty) {}
+    var length = content.length;
+    var offset = _skipWhitespace(0);
+    var tokens = <_Token>[];
+    while (offset < length) {
+      var char = content.codeUnitAt(offset);
+      if (char == closeSquareBracket) {
+        tokens.add(_Token(offset, _TokenKind.closeSquareBracket, ']'));
+        offset++;
+      } else if (char == openSquareBracket) {
+        tokens.add(_Token(offset, _TokenKind.openSquareBracket, '['));
+        offset++;
+      } else if (char == period) {
+        tokens.add(_Token(offset, _TokenKind.period, '.'));
+        offset++;
+      } else if (_isLetter(char)) {
+        var start = offset;
+        offset++;
+        while (offset < length && _isLetter(content.codeUnitAt(offset))) {
+          offset++;
+        }
+        tokens.add(_Token(
+            start, _TokenKind.identifier, content.substring(start, offset)));
+      } else if (_isDigit(char)) {
+        var start = offset;
+        offset++;
+        while (offset < length && _isDigit(content.codeUnitAt(offset))) {
+          offset++;
+        }
+        tokens.add(_Token(
+            start, _TokenKind.integer, content.substring(start, offset)));
+      } else {
+        errorReporter.reportErrorForOffset(
+            TransformSetErrorCode.invalidCharacter,
+            offset + delta,
+            1,
+            [content.substring(offset, offset + 1)]);
+        return null;
+      }
+      offset = _skipWhitespace(offset);
+    }
+    return tokens;
+  }
+
+  /// Return `true` if the [char] is a digit.
+  bool _isDigit(int char) => (char >= $0 && char <= $9);
+
+  /// Return `true` if the [char] is a letter.
+  bool _isLetter(int char) =>
+      (char >= $a && char <= $z) || (char >= $A && char <= $Z);
+
+  /// Return `true` if the [char] is a whitespace character.
+  bool _isWhitespace(int char) =>
+      char == space || char == newline || char == carriageReturn;
+
+  /// Return the index of the first character at or after the given [offset]
+  /// that isn't a whitespace character.
+  int _skipWhitespace(int offset) {
+    while (offset < length) {
+      var char = content.codeUnitAt(offset);
+      if (!_isWhitespace(char)) {
+        return offset;
+      }
+      offset++;
+    }
+    return offset;
+  }
+}
+
+/// A token in a code fragment's string representation.
+class _Token {
+  /// The offset of the token.
+  final int offset;
+
+  /// The kind of the token.
+  final _TokenKind kind;
+
+  /// The lexeme of the token.
+  final String lexeme;
+
+  /// Initialize a newly created token.
+  _Token(this.offset, this.kind, this.lexeme);
+
+  /// Return the length of this token.
+  int get length => lexeme.length;
+}
+
+/// An indication of the kind of a token.
+enum _TokenKind {
+  closeSquareBracket,
+  identifier,
+  integer,
+  openSquareBracket,
+  period,
+}
+
+extension on _TokenKind {
+  String get displayName {
+    switch (this) {
+      case _TokenKind.closeSquareBracket:
+        return "']'";
+      case _TokenKind.identifier:
+        return 'an identifier';
+      case _TokenKind.integer:
+        return 'an integer';
+      case _TokenKind.openSquareBracket:
+        return "'['";
+      case _TokenKind.period:
+        return "'.'";
+    }
+    return '';
+  }
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/element_descriptor.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/element_descriptor.dart
index 7fb93d9..2520805 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/element_descriptor.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/element_descriptor.dart
@@ -3,6 +3,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/src/services/correction/fix/data_driven/element_kind.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/element/element.dart' show ClassElement;
+import 'package:analyzer/dart/element/type.dart';
 import 'package:meta/meta.dart';
 
 /// The path to an element.
@@ -27,4 +30,128 @@
 
   /// Return `true` if the described element is a constructor.
   bool get isConstructor => kind == ElementKind.constructorKind;
+
+  /// Return `true` if the given [node] appears to be consistent with this kind
+  /// of element.
+  bool matches(AstNode node) {
+    // TODO(brianwilkerson) Check the resolved element if one exists for more
+    //  accurate results.
+    switch (kind) {
+      case ElementKind.classKind:
+        // TODO: Handle this case.
+        return false;
+      case ElementKind.constantKind:
+        // TODO: Handle this case.
+        return false;
+      case ElementKind.constructorKind:
+        if (node is Annotation) {
+          var className = _nameFromIdentifier(node.name);
+          var constructorName = node.constructorName ?? '';
+          if (components[0] == className && components[1] == constructorName) {
+            return true;
+          }
+        } else if (node is InstanceCreationExpression) {
+          var name = node.constructorName;
+          var className = _nameFromIdentifier(name.type.name);
+          var constructorName = name.name?.name ?? '';
+          if (components[0] == className && components[1] == constructorName) {
+            return true;
+          }
+        } else if (node is MethodInvocation) {
+          var target = node.target;
+          if (target == null) {
+            if (components[0] == node.methodName.name && components[1] == '') {
+              return true;
+            }
+          } else if (target is Identifier) {
+            var className = _nameFromIdentifier(target);
+            var constructorName = node.methodName.name;
+            if (components[0] == className &&
+                components[1] == constructorName) {
+              return true;
+            }
+          }
+        }
+        return false;
+      case ElementKind.enumKind:
+        // TODO: Handle this case.
+        return false;
+      case ElementKind.extensionKind:
+        // TODO: Handle this case.
+        return false;
+      case ElementKind.fieldKind:
+        // TODO: Handle this case.
+        return false;
+      case ElementKind.functionKind:
+        if (node is MethodInvocation) {
+          if (node.realTarget == null &&
+              components[0] == node.methodName.name) {
+            return true;
+          }
+        }
+        return false;
+      case ElementKind.getterKind:
+        // TODO: Handle this case.
+        return false;
+      case ElementKind.methodKind:
+        if (node is MethodInvocation) {
+          if (components[1] == node.methodName.name) {
+            var target = node.realTarget;
+            if (target == null) {
+              // TODO(brianwilkerson) If `node.target == null` then the invocation
+              //  should be in a subclass of the element's class.
+              return true;
+            } else {
+              var type = target.staticType;
+              if (type == null && target is SimpleIdentifier) {
+                var element = target.staticElement;
+                // TODO(brianwilkerson) Handle more than `ClassElement`.
+                if (element is ClassElement) {
+                  type = element.thisType;
+                }
+              }
+              if (type == null) {
+                // We can't get more specific type information, so we assume
+                // that the method might have been in the element's class.
+                return true;
+              }
+              if (components[0] == type.element.name) {
+                return true;
+              }
+              if (type is InterfaceType) {
+                for (var supertype in type.allSupertypes) {
+                  if (components[0] == supertype.element.name) {
+                    return true;
+                  }
+                }
+              }
+            }
+          }
+        }
+        return false;
+      case ElementKind.mixinKind:
+        // TODO: Handle this case.
+        return false;
+      case ElementKind.setterKind:
+        // TODO: Handle this case.
+        return false;
+      case ElementKind.typedefKind:
+        // TODO: Handle this case.
+        return false;
+      case ElementKind.variableKind:
+        // TODO: Handle this case.
+        return false;
+    }
+    return false;
+  }
+
+  String _nameFromIdentifier(Identifier identifier) {
+    if (identifier is SimpleIdentifier) {
+      return identifier.name;
+    } else if (identifier is PrefixedIdentifier) {
+      return identifier.identifier.name;
+    }
+    throw StateError(
+        'Unexpected class of identifier: ${identifier.runtimeType}');
+  }
 }
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/modify_parameters.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/modify_parameters.dart
index 3cd6143..78ae593 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/modify_parameters.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/modify_parameters.dart
@@ -96,7 +96,7 @@
         builder.write(': ');
       }
       parameter.argumentValue
-          .writeOn(builder, TemplateContext(argumentList, fix.utils));
+          .writeOn(builder, TemplateContext(argumentList.parent, fix.utils));
     }
 
     var insertionRanges = argumentsToInsert.contiguousSubRanges.toList();
@@ -195,7 +195,7 @@
     if (newNamed.isNotEmpty) {
       int offset;
       var needsInitialComma = false;
-      if (arguments.isEmpty) {
+      if (remainingArguments.isEmpty && argumentsToInsert.isEmpty) {
         offset = argumentList.rightParenthesis.offset;
       } else {
         offset = arguments[arguments.length - 1].end;
@@ -226,6 +226,11 @@
     if (parent is InvocationExpression) {
       var argumentList = parent.argumentList;
       return _Data(argumentList);
+    } else if (parent is Label) {
+      var argumentList = parent.parent.parent;
+      if (argumentList is ArgumentList) {
+        return _Data(argumentList);
+      }
     }
     return null;
   }
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/rename_parameter.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/rename_parameter.dart
new file mode 100644
index 0000000..97065b7
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/rename_parameter.dart
@@ -0,0 +1,145 @@
+// Copyright (c) 2020, 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/src/services/correction/dart/data_driven.dart';
+import 'package:analysis_server/src/services/correction/fix/data_driven/change.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/src/dart/element/inheritance_manager3.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
+import 'package:analyzer_plugin/utilities/range_factory.dart';
+import 'package:meta/meta.dart';
+
+/// The data related to a parameter that has been renamed.
+class RenameParameter extends Change<_Data> {
+  /// The old name of the parameter.
+  final String oldName;
+
+  /// The new name of the parameter.
+  final String newName;
+
+  /// Initialize a newly created transform to describe a renaming of a parameter
+  /// from the [oldName] to the [newName].
+  RenameParameter({@required this.newName, @required this.oldName});
+
+  @override
+  void apply(DartFileEditBuilder builder, DataDrivenFix fix, _Data data) {
+    if (data is _InvocationData) {
+      builder.addSimpleReplacement(range.node(data.nameNode), newName);
+    } else if (data is _OverrideData) {
+      var declaration = data.methodDeclaration;
+      var parameter = declaration.parameterNamed(oldName);
+      if (parameter != null) {
+        var overriddenMethod = declaration.overriddenElement();
+        var overriddenParameter = overriddenMethod?.parameterNamed(oldName);
+        if (overriddenParameter == null) {
+          // If the overridden parameter has already been removed, then just
+          // rename the old parameter to have the new name.
+          builder.addSimpleReplacement(
+              range.node(parameter.identifier), newName);
+        } else {
+          // If the overridden parameter still exists, then mark it as
+          // deprecated (if it isn't already) and add a declaration of the new
+          // parameter.
+          builder.addInsertion(parameter.offset, (builder) {
+            var parameterElement = parameter.declaredElement;
+            builder.writeParameter(newName,
+                isCovariant: parameterElement.isCovariant,
+                isRequiredNamed: parameterElement.isRequiredNamed,
+                type: parameterElement.type);
+            builder.write(', ');
+            if (!parameterElement.hasDeprecated) {
+              builder.write('@deprecated ');
+            }
+          });
+        }
+      }
+    }
+  }
+
+  @override
+  _Data validate(DataDrivenFix fix) {
+    var node = fix.node;
+    if (node is SimpleIdentifier) {
+      var parent = node.parent;
+      if (node.name == oldName &&
+          parent is Label &&
+          parent.parent is NamedExpression) {
+        var invocation = parent.parent.parent.parent;
+        if (fix.element.matches(invocation)) {
+          return _InvocationData(node);
+        }
+      } else if (parent is MethodDeclaration) {
+        return _OverrideData(parent);
+      }
+    }
+    return const _IgnoredData();
+  }
+}
+
+/// The data returned from `validate`.
+abstract class _Data {
+  const _Data();
+}
+
+/// The data returned when the change doesn't apply.
+class _IgnoredData extends _Data {
+  const _IgnoredData();
+}
+
+/// The data returned when updating an invocation site.
+class _InvocationData extends _Data {
+  /// The node representing the name to be replaced.
+  final SimpleIdentifier nameNode;
+
+  /// Initialize newly created data about an invocation site.
+  _InvocationData(this.nameNode);
+}
+
+/// The data returned when updating an override site.
+class _OverrideData extends _Data {
+  /// The node representing the overriding method.
+  final MethodDeclaration methodDeclaration;
+
+  /// Initialize newly created data about an override site.
+  _OverrideData(this.methodDeclaration);
+}
+
+extension on MethodDeclaration {
+  /// Return the parameter of this method whose name matches the given [name],
+  /// or `null` if there is no such parameter.
+  FormalParameter parameterNamed(String name) {
+    for (var parameter in parameters.parameters) {
+      if (parameter.declaredElement.name == name) {
+        return parameter;
+      }
+    }
+    return null;
+  }
+
+  /// Return the element that this method overrides, or `null` if this method
+  /// doesn't override any inherited member.
+  ExecutableElement overriddenElement() {
+    var element = declaredElement;
+    var enclosingElement = element.enclosingElement;
+    if (enclosingElement is ClassElement) {
+      var name = Name(enclosingElement.library.source.uri, element.name);
+      return InheritanceManager3().getInherited2(enclosingElement, name);
+    }
+    return null;
+  }
+}
+
+extension on ExecutableElement {
+  /// Return the parameter of this executable element whose name matches the
+  /// given [name], or `null` if there is no such parameter.
+  ParameterElement parameterNamed(String name) {
+    for (var parameter in parameters) {
+      if (parameter.name == name) {
+        return parameter;
+      }
+    }
+    return null;
+  }
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform.dart
index cae363d..2cda293 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform.dart
@@ -15,6 +15,10 @@
   /// The date on which the API was changed.
   final DateTime date;
 
+  /// A flag indicating whether this transform can be used when applying bulk
+  /// fixes.
+  final bool bulkApply;
+
   /// The element being transformed.
   final ElementDescriptor element;
 
@@ -26,12 +30,18 @@
   Transform(
       {@required this.title,
       this.date,
+      @required this.bulkApply,
       @required this.element,
       @required this.changes});
 
   /// Return `true` if this transform can be applied to fix an issue related to
-  /// an element that matches the given [matcher].
-  bool appliesTo(ElementMatcher matcher) {
+  /// an element that matches the given [matcher]. The flag [applyingBulkFixes]
+  /// indicates whether the transforms are being applied in the context of a
+  /// bulk fix.
+  bool appliesTo(ElementMatcher matcher, {@required bool applyingBulkFixes}) {
+    if (applyingBulkFixes && !bulkApply) {
+      return false;
+    }
     return matcher.matches(element);
   }
 }
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set.dart
index df26be6..bbf0976 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set.dart
@@ -4,6 +4,7 @@
 
 import 'package:analysis_server/src/services/correction/fix/data_driven/element_matcher.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/transform.dart';
+import 'package:meta/meta.dart';
 
 /// A set of transforms used to aid in the construction of fixes for issues
 /// related to some body of code. Typically there is one set of transforms for
@@ -17,11 +18,14 @@
     _transforms.add(transform);
   }
 
-  /// Return a list of the transforms that match the [matcher].
-  List<Transform> transformsFor(ElementMatcher matcher) {
+  /// Return a list of the transforms that match the [matcher]. The flag
+  /// [applyingBulkFixes] indicates whether the transforms are being applied in
+  /// the context of a bulk fix.
+  List<Transform> transformsFor(ElementMatcher matcher,
+      {@required bool applyingBulkFixes}) {
     var result = <Transform>[];
     for (var transform in _transforms) {
-      if (transform.appliesTo(matcher)) {
+      if (transform.appliesTo(matcher, applyingBulkFixes: applyingBulkFixes)) {
         result.add(transform);
       }
     }
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set_error_code.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set_error_code.dart
index 8394acd..7ea8635 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set_error_code.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set_error_code.dart
@@ -10,9 +10,32 @@
 class TransformSetErrorCode extends ErrorCode {
   /**
    * Parameters:
+   * 0: the conflicting key
+   * 1: the key that it conflicts with
+   */
+  static const TransformSetErrorCode conflictingKey = TransformSetErrorCode(
+      'conflicting_key',
+      "The key '{0}' can't be used when '{1}' is also used.");
+
+  /**
+   * Parameters:
+   * 0: the character that is invalid
+   */
+  static const TransformSetErrorCode invalidCharacter =
+      TransformSetErrorCode('invalid_character', "Invalid character '{0}'.");
+
+  /**
+   * Parameters:
+   * 0: the actual type of the key
+   */
+  static const TransformSetErrorCode invalidKey = TransformSetErrorCode(
+      'invalid_key', "Keys must be of type 'String' but found the type '{0}'.");
+
+  /**
+   * Parameters:
    * 0: the key with which the value is associated
    * 1: the expected type of the value
-   * 0: the actual type of the value
+   * 2: the actual type of the value
    */
   static const TransformSetErrorCode invalidValue = TransformSetErrorCode(
       'invalid_value',
@@ -20,6 +43,14 @@
 
   /**
    * Parameters:
+   * 0: the list of valid parameter styles
+   */
+  static const TransformSetErrorCode invalidParameterStyle =
+      TransformSetErrorCode('invalid_parameter_style',
+          "The parameter style must be one of the following: {0}.");
+
+  /**
+   * Parameters:
    * 0: the key with which the value is associated
    * 1: the allowed values as a comma-separated list
    */
@@ -35,6 +66,14 @@
       TransformSetErrorCode('missing_key', "Missing the required key '{0}'.");
 
   /**
+   * Parameters:
+   * 0: the list of valid keys
+   */
+  static const TransformSetErrorCode missingOneOfMultipleKeys =
+      TransformSetErrorCode('missing_one_of_multiple_keys',
+          "Exactly one of the following keys must be provided: {0}.");
+
+  /**
    * No parameters.
    */
   static const TransformSetErrorCode missingTemplateEnd = TransformSetErrorCode(
@@ -42,6 +81,19 @@
 
   /**
    * Parameters:
+   * 0: a description of the expected kinds of tokens
+   */
+  static const TransformSetErrorCode missingToken =
+      TransformSetErrorCode('missing_token', "Expected to find {0}.");
+
+  /**
+   * No parameters.
+   */
+  static const TransformSetErrorCode missingUri = TransformSetErrorCode(
+      'missing_uri', "At least one URI must be provided.");
+
+  /**
+   * Parameters:
    * 0: the missing key
    */
   static const TransformSetErrorCode undefinedVariable = TransformSetErrorCode(
@@ -49,12 +101,33 @@
 
   /**
    * Parameters:
+   * 0: a description of the expected kind of token
+   */
+  static const TransformSetErrorCode unknownAccessor = TransformSetErrorCode(
+      'unknown_accessor', "The accessor '{0}' is invalid.");
+
+  /**
+   * Parameters:
    * 0: the unsupported key
    */
   static const TransformSetErrorCode unsupportedKey = TransformSetErrorCode(
       'unsupported_key', "The key '{0}' isn't supported.");
 
   /**
+   * No parameters.
+   */
+  static const TransformSetErrorCode unsupportedVersion = TransformSetErrorCode(
+      'unsupported_version', "Only version '1' is supported at this time.");
+
+  /**
+   * Parameters:
+   * 0: a description of the expected kind of token
+   * 1: a description of the actial kind of token
+   */
+  static const TransformSetErrorCode wrongToken = TransformSetErrorCode(
+      'wrong_token', "Expected to find {0}, but found {1}.");
+
+  /**
    * Parameters:
    * 0: the message produced by the YAML parser
    */
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set_parser.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set_parser.dart
index 30d05a2..ef73836 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set_parser.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set_parser.dart
@@ -4,12 +4,14 @@
 
 import 'package:analysis_server/src/services/correction/fix/data_driven/add_type_parameter.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/change.dart';
+import 'package:analysis_server/src/services/correction/fix/data_driven/code_fragment_parser.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/code_template.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/element_descriptor.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/element_kind.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/modify_parameters.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/parameter_reference.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/rename.dart';
+import 'package:analysis_server/src/services/correction/fix/data_driven/rename_parameter.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/transform.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/transform_set.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/transform_set_error_code.dart';
@@ -36,6 +38,7 @@
 /// A parser used to read a transform set from a file.
 class TransformSetParser {
   static const String _argumentValueKey = 'argumentValue';
+  static const String _bulkApplyKey = 'bulkApply';
   static const String _changesKey = 'changes';
   static const String _classKey = 'class';
   static const String _constantKey = 'constant';
@@ -59,6 +62,7 @@
   static const String _mixinKey = 'mixin';
   static const String _nameKey = 'name';
   static const String _newNameKey = 'newName';
+  static const String _oldNameKey = 'oldName';
   static const String _setterKey = 'setter';
   static const String _statementsKey = 'statements';
   static const String _styleKey = 'style';
@@ -66,6 +70,7 @@
   static const String _transformsKey = 'transforms';
   static const String _typedefKey = 'typedef';
   static const String _urisKey = 'uris';
+  static const String _valueKey = 'value';
   static const String _variableKey = 'variable';
   static const String _variablesKey = 'variables';
   static const String _versionKey = 'version';
@@ -83,10 +88,11 @@
 
   static const String _addParameterKind = 'addParameter';
   static const String _addTypeParameterKind = 'addTypeParameter';
-  static const String _argumentKind = 'argument';
+  static const String _fragmentKind = 'fragment';
   static const String _importKind = 'import';
   static const String _removeParameterKind = 'removeParameter';
   static const String _renameKind = 'rename';
+  static const String _renameParameterKind = 'renameParameter';
 
   /// The valid values for the [_styleKey] in an [_addParameterKind] change.
   static const List<String> validStyles = [
@@ -99,6 +105,9 @@
   static const String _openComponent = '{%';
   static const String _closeComponent = '%}';
 
+  /// The lowest file version supported by this parser.
+  static const int oldestVersion = 1;
+
   /// The highest file version supported by this parser. The version needs to be
   /// incremented any time the parser is updated to disallow input that would
   /// have been valid in the most recently published version of server. This
@@ -190,6 +199,15 @@
     return node.runtimeType.toString();
   }
 
+  /// Return the offset of the first character in the [string], exclusive of any
+  /// surrounding quotes.
+  int _offsetOfString(YamlScalar string) {
+    if (string.style == ScalarStyle.PLAIN) {
+      return string.span.start.offset;
+    }
+    return string.span.start.offset + 1;
+  }
+
   /// Return the result of parsing the file [content] into a YAML node.
   YamlNode _parseYaml(String content) {
     try {
@@ -248,10 +266,12 @@
     }
   }
 
-  /// Given a [map] and a set of [validKeys], ensure that only one of those keys
-  /// is in the map and return it. If more than one of the keys is in the map,
-  /// report a diagnostic.
-  String _singleKey(YamlMap map, List<String> validKeys) {
+  /// Given a [map] and a set of [validKeys], ensure that exactly one of those
+  /// keys is in the map and return it. If more than one of the keys is in the
+  /// map, report a diagnostic for each extra key. If [required] is `true` and
+  /// none of the keys is in the map, report a diagnostic at the [errorNode].
+  String _singleKey(YamlMap map, List<String> validKeys, YamlNode errorNode,
+      {bool required = true}) {
     assert(validKeys != null);
     var foundKeys = <String>[];
     var keyToNodeMap = <String, YamlNode>{};
@@ -265,14 +285,21 @@
       }
     }
     if (foundKeys.isEmpty) {
-      // TODO(brianwilkerson) Report the problem.
+      if (required) {
+        var validKeysList = validKeys.map((key) => "'$key'").join(', ');
+        _reportError(TransformSetErrorCode.missingOneOfMultipleKeys, errorNode,
+            [validKeysList]);
+      }
       return null;
     }
+    var firstKey = foundKeys[0];
     for (var i = 1; i < foundKeys.length; i++) {
-      // var invalidNode = keyToNodeMap[foundKeys[i]];
-      // TODO(brianwilkerson) Report the problem.
+      var foundKey = foundKeys[i];
+      var invalidNode = keyToNodeMap[foundKey];
+      _reportError(TransformSetErrorCode.conflictingKey, invalidNode,
+          [foundKey, firstKey]);
     }
-    return foundKeys[0];
+    return firstKey;
   }
 
   /// Translate the [node] into a add-parameter modification.
@@ -282,19 +309,26 @@
     var index = _translateInteger(node.valueAt(_indexKey),
         ErrorContext(key: _indexKey, parentNode: node));
     if (index == null) {
+      // The error has already been reported.
       return;
     }
     var name = _translateString(
         node.valueAt(_nameKey), ErrorContext(key: _nameKey, parentNode: node));
     if (name == null) {
+      // The error has already been reported.
       return;
     }
-    var style = _translateString(node.valueAt(_styleKey),
-        ErrorContext(key: _styleKey, parentNode: node));
+    var styleNode = node.valueAt(_styleKey);
+    var style = _translateString(
+        styleNode, ErrorContext(key: _styleKey, parentNode: node));
     if (style == null) {
+      // The error has already been reported.
       return;
-    } else if (!validStyles.contains(style)) {
-      // TODO(brianwilkerson) Report the invalid style.
+    }
+    if (!validStyles.contains(style)) {
+      var validStylesList = validStyles.map((style) => "'$style'").join(', ');
+      _reportError(TransformSetErrorCode.invalidParameterStyle, styleNode,
+          [validStylesList]);
       return;
     }
     var isRequired = style.startsWith('required_');
@@ -321,8 +355,8 @@
   /// resulting change, or `null` if the [node] does not represent a valid
   /// add-type-parameter change.
   AddTypeParameter _translateAddTypeParameterChange(YamlMap node) {
-    _reportUnsupportedKeys(
-        node, const {_indexKey, _kindKey, _nameKey, _argumentValueKey});
+    _reportUnsupportedKeys(node,
+        const {_extendsKey, _indexKey, _kindKey, _nameKey, _argumentValueKey});
     var index = _translateInteger(node.valueAt(_indexKey),
         ErrorContext(key: _indexKey, parentNode: node));
     var name = _translateString(
@@ -336,10 +370,10 @@
       // The error has already been reported.
       return null;
     }
-    // TODO(brianwilkerson) In order to support adding multiple type parameters
-    //  we might need to introduce a `TypeParameterModification` change, similar
-    //  to `ParameterModification`. That becomes more likely if we add support
-    //  for removing type parameters.
+    // In order to support adding multiple type parameters we might need to
+    // introduce a `TypeParameterModification` change, similar to
+    // `ParameterModification`. That becomes more likely if we add support for
+    // removing type parameters.
     return AddTypeParameter(
         index: index,
         name: name,
@@ -347,34 +381,25 @@
         argumentValue: argumentValue);
   }
 
-  /// Translate the [node] into a value extractor. Return the resulting
-  /// extractor, or `null` if the [node] does not represent a valid value
-  /// extractor.
-  ValueGenerator _translateArgumentExtractor(YamlMap node) {
-    var indexNode = node.valueAt(_indexKey);
-    if (indexNode != null) {
-      _reportUnsupportedKeys(node, const {_indexKey, _kindKey});
-      var index = _translateInteger(
-          indexNode, ErrorContext(key: _indexKey, parentNode: node));
-      if (index == null) {
-        // The error has already been reported.
-        return null;
+  /// Translate the [node] into a bool. Return the resulting bool, or `null`
+  /// if the [node] does not represent a valid bool. If the [node] is not
+  /// valid, use the [context] to report the error.
+  bool _translateBool(YamlNode node, ErrorContext context,
+      {bool required = true}) {
+    if (node is YamlScalar) {
+      var value = node.value;
+      if (value is bool) {
+        return value;
       }
-      return ArgumentExpression(PositionalParameterReference(index));
-    }
-    var nameNode = node.valueAt(_nameKey);
-    if (nameNode != null) {
-      _reportUnsupportedKeys(node, const {_nameKey, _kindKey});
-      var name = _translateString(
-          nameNode, ErrorContext(key: _nameKey, parentNode: node));
-      if (name == null) {
-        // The error has already been reported.
-        return null;
+      return _reportInvalidValue(node, context, 'boolean');
+    } else if (node == null) {
+      if (required) {
+        return _reportMissingKey(context);
       }
-      return ArgumentExpression(NamedParameterReference(name));
+      return null;
+    } else {
+      return _reportInvalidValue(node, context, 'boolean');
     }
-    // TODO(brianwilkerson) Report the missing YAML.
-    return null;
   }
 
   /// Translate the [node] into a change. Return the resulting change, or `null`
@@ -383,8 +408,9 @@
   Change _translateChange(YamlNode node, ErrorContext context) {
     assert(node != null);
     if (node is YamlMap) {
-      var kind = _translateString(node.valueAt(_kindKey),
-          ErrorContext(key: _kindKey, parentNode: node));
+      var kindNode = node.valueAt(_kindKey);
+      var kindContext = ErrorContext(key: _kindKey, parentNode: node);
+      var kind = _translateString(kindNode, kindContext);
       if (kind == null) {
         return null;
       } else if (kind == _addParameterKind) {
@@ -397,18 +423,42 @@
         return null;
       } else if (kind == _renameKind) {
         return _translateRenameChange(node);
+      } else if (kind == _renameParameterKind) {
+        return _translateRenameParameterChange(node);
       }
-      return _reportInvalidValueOneOf(node, context, [
+      return _reportInvalidValueOneOf(kindNode, kindContext, [
         _addParameterKind,
         _addTypeParameterKind,
         _removeParameterKind,
         _renameKind,
+        _renameParameterKind,
       ]);
     } else {
       return _reportInvalidValue(node, context, 'Map');
     }
   }
 
+  /// Translate the [node] into a value generator. Return the resulting
+  /// generator, or `null` if the [node] does not represent a valid value
+  /// extractor.
+  ValueGenerator _translateCodeFragment(YamlMap node) {
+    _reportUnsupportedKeys(node, const {_kindKey, _valueKey});
+    var valueNode = node.valueAt(_valueKey);
+    var value = _translateString(
+        valueNode, ErrorContext(key: _valueKey, parentNode: node));
+    if (value == null) {
+      // The error has already been reported.
+      return null;
+    }
+    var accessors = CodeFragmentParser(errorReporter)
+        .parse(value, _offsetOfString(valueNode));
+    if (accessors == null) {
+      // The error has already been reported.
+      return null;
+    }
+    return CodeFragment(accessors);
+  }
+
   /// Translate the [node] into a code template. Return the resulting template,
   /// or `null` if the [node] does not represent a valid code template. If the
   /// [node] is not valid, use the [context] to report the error.
@@ -422,10 +472,7 @@
       if (expressionNode != null) {
         _reportUnsupportedKeys(node, const {_expressionKey, _variablesKey});
         kind = CodeTemplateKind.expression;
-        // TODO(brianwilkerson) We add 1 to account for the quotes around the
-        //  string, but quotes aren't required, so we need to find out what
-        //  style of node [expressionNode] is to get the right offset.
-        templateOffset = expressionNode.span.start.offset + 1;
+        templateOffset = _offsetOfString(expressionNode);
         template = _translateString(expressionNode,
             ErrorContext(key: _expressionKey, parentNode: node));
       } else {
@@ -433,14 +480,12 @@
         if (statementsNode != null) {
           _reportUnsupportedKeys(node, const {_statementsKey, _variablesKey});
           kind = CodeTemplateKind.statements;
-          // TODO(brianwilkerson) We add 1 to account for the quotes around the
-          //  string, but quotes aren't required, so we need to find out what
-          //  style of node [expressionNode] is to get the right offset.
-          templateOffset = statementsNode.span.start.offset + 1;
+          templateOffset = _offsetOfString(statementsNode);
           template = _translateString(statementsNode,
               ErrorContext(key: _statementsKey, parentNode: node));
         } else {
-          // TODO(brianwilkerson) Report the missing key.
+          _reportError(TransformSetErrorCode.missingOneOfMultipleKeys, node,
+              ["'$_expressionKey' or '$_statementsKey'"]);
           return null;
         }
       }
@@ -487,23 +532,27 @@
   /// error.
   ElementDescriptor _translateElement(YamlNode node, ErrorContext context) {
     if (node is YamlMap) {
-      var uris = _translateList(node.valueAt(_urisKey),
+      var urisNode = node.valueAt(_urisKey);
+      var uris = _translateList(urisNode,
           ErrorContext(key: _urisKey, parentNode: node), _translateUri);
-      var elementKey = _singleKey(node, const [
-        _classKey,
-        _constantKey,
-        _constructorKey,
-        _enumKey,
-        _extensionKey,
-        _fieldKey,
-        _functionKey,
-        _getterKey,
-        _methodKey,
-        _mixinKey,
-        _setterKey,
-        _typedefKey,
-        _variableKey
-      ]);
+      var elementKey = _singleKey(
+          node,
+          const [
+            _classKey,
+            _constantKey,
+            _constructorKey,
+            _enumKey,
+            _extensionKey,
+            _fieldKey,
+            _functionKey,
+            _getterKey,
+            _methodKey,
+            _mixinKey,
+            _setterKey,
+            _typedefKey,
+            _variableKey
+          ],
+          node);
       if (elementKey == null) {
         // The error has already been reported.
         return null;
@@ -516,14 +565,19 @@
       }
       var components = [elementName];
       if (_containerKeyMap.containsKey(elementKey)) {
-        var containerKey = _singleKey(node, _containerKeyMap[elementKey]);
+        var validContainerKeys = _containerKeyMap[elementKey];
+        var containerKey =
+            _singleKey(node, validContainerKeys, node, required: false);
         var containerName = _translateString(node.valueAt(containerKey),
             ErrorContext(key: containerKey, parentNode: node),
             required: false);
         if (containerName == null) {
           if ([_constructorKey, _constantKey, _methodKey, _fieldKey]
               .contains(elementKey)) {
-            // TODO(brianwilkerson) Report that no container was found.
+            var validKeysList =
+                validContainerKeys.map((key) => "'$key'").join(', ');
+            _reportError(TransformSetErrorCode.missingOneOfMultipleKeys, node,
+                [validKeysList]);
             return null;
           }
         } else {
@@ -534,6 +588,12 @@
         // The error has already been reported.
         return null;
       }
+      if (uris.isEmpty) {
+        if ((urisNode as YamlList).isEmpty) {
+          _reportError(TransformSetErrorCode.missingUri, urisNode);
+        }
+        return null;
+      }
       return ElementDescriptor(
           libraryUris: uris,
           kind: ElementKindUtilities.fromName(elementKey),
@@ -545,13 +605,14 @@
     }
   }
 
-  /// Translate the [node] into a value extractor. Return the resulting
-  /// extractor, or `null` if the [node] does not represent a valid value
+  /// Translate the [node] into a value generator. Return the resulting
+  /// generator, or `null` if the [node] does not represent a valid value
   /// extractor.
   ValueGenerator _translateImportValue(YamlMap node) {
     _reportUnsupportedKeys(node, const {_kindKey, _nameKey, _urisKey});
-    var uris = _translateList(node.valueAt(_urisKey),
-        ErrorContext(key: _urisKey, parentNode: node), _translateUri);
+    var urisNode = node.valueAt(_urisKey);
+    var uris = _translateList(
+        urisNode, ErrorContext(key: _urisKey, parentNode: node), _translateUri);
     var name = _translateString(
         node.valueAt(_nameKey), ErrorContext(key: _nameKey, parentNode: node));
     if (uris == null || name == null) {
@@ -559,9 +620,9 @@
       return null;
     }
     if (uris.isEmpty) {
-      // TODO(brianwilkerson) Report an empty list unless it's only empty
-      //  because the elements generated errors. This probably needs to be done
-      //  in [_translateList].
+      if ((urisNode as YamlList).isEmpty) {
+        _reportError(TransformSetErrorCode.missingUri, urisNode);
+      }
       return null;
     }
     return ImportedName(uris, name);
@@ -586,11 +647,20 @@
 
   /// Translate the given [node] as a key.
   String _translateKey(YamlNode node) {
-    if (node is YamlScalar && node.value is String) {
-      return node.value as String;
+    String type;
+    if (node is YamlScalar) {
+      if (node.value is String) {
+        return node.value as String;
+      }
+      type = node.value.runtimeType.toString();
+    } else if (node is YamlList) {
+      type = 'List';
+    } else if (node is YamlMap) {
+      type = 'Map';
+    } else {
+      type = node.runtimeType.toString();
     }
-    // TODO(brianwilkerson) Report the invalidKey.
-    //  "Keys must be of type 'String' but found the type '{0}'."
+    _reportError(TransformSetErrorCode.invalidKey, node, [type]);
     return null;
   }
 
@@ -620,12 +690,12 @@
   /// Translate the [node] into a remove-parameter modification.
   void _translateRemoveParameterChange(YamlMap node) {
     _reportUnsupportedKeys(node, const {_indexKey, _kindKey, _nameKey});
-    ParameterReference reference;
-    var parameterSpecKey = _singleKey(node, const [_nameKey, _indexKey]);
+    var parameterSpecKey = _singleKey(node, const [_nameKey, _indexKey], node);
     if (parameterSpecKey == null) {
       // The error has already been reported.
       return null;
     }
+    ParameterReference reference;
     if (parameterSpecKey == _indexKey) {
       var index = _translateInteger(node.valueAt(_indexKey),
           ErrorContext(key: _indexKey, parentNode: node));
@@ -654,11 +724,27 @@
     var newName = _translateString(node.valueAt(_newNameKey),
         ErrorContext(key: _newNameKey, parentNode: node));
     if (newName == null) {
+      // The error has already been reported.
       return null;
     }
     return Rename(newName: newName);
   }
 
+  /// Translate the [node] into a rename parameter change. Return the resulting
+  /// change, or `null` if the [node] does not represent a valid rename change.
+  RenameParameter _translateRenameParameterChange(YamlMap node) {
+    _reportUnsupportedKeys(node, const {_kindKey, _newNameKey, _oldNameKey});
+    var oldName = _translateString(node.valueAt(_oldNameKey),
+        ErrorContext(key: _oldNameKey, parentNode: node));
+    var newName = _translateString(node.valueAt(_newNameKey),
+        ErrorContext(key: _newNameKey, parentNode: node));
+    if (oldName == null || newName == null) {
+      // The error has already been reported.
+      return null;
+    }
+    return RenameParameter(newName: newName, oldName: oldName);
+  }
+
   /// Translate the [node] into a string. Return the resulting string, or `null`
   /// if the [node] does not represent a valid string. If the [node] is not
   /// valid, use the [context] to report the error.
@@ -712,12 +798,16 @@
   Transform _translateTransform(YamlNode node, ErrorContext context) {
     assert(node != null);
     if (node is YamlMap) {
-      _reportUnsupportedKeys(
-          node, const {_changesKey, _dateKey, _elementKey, _titleKey});
+      _reportUnsupportedKeys(node,
+          const {_bulkApplyKey, _changesKey, _dateKey, _elementKey, _titleKey});
       var title = _translateString(node.valueAt(_titleKey),
           ErrorContext(key: _titleKey, parentNode: node));
       var date = _translateDate(node.valueAt(_dateKey),
           ErrorContext(key: _dateKey, parentNode: node));
+      var bulkApply = _translateBool(node.valueAt(_bulkApplyKey),
+              ErrorContext(key: _bulkApplyKey, parentNode: node),
+              required: false) ??
+          true;
       var element = _translateElement(node.valueAt(_elementKey),
           ErrorContext(key: _elementKey, parentNode: node));
       var changes = _translateList(node.valueAt(_changesKey),
@@ -731,7 +821,11 @@
         _parameterModifications = null;
       }
       return Transform(
-          title: title, date: date, element: element, changes: changes);
+          title: title,
+          date: date,
+          bulkApply: bulkApply,
+          element: element,
+          changes: changes);
     } else {
       return _reportInvalidValue(node, context, 'Map');
     }
@@ -743,13 +837,14 @@
     assert(node != null);
     if (node is YamlMap) {
       _reportUnsupportedKeys(node, const {_transformsKey, _versionKey});
-      var version = _translateInteger(node.valueAt(_versionKey),
-          ErrorContext(key: _versionKey, parentNode: node));
+      var versionNode = node.valueAt(_versionKey);
+      var version = _translateInteger(
+          versionNode, ErrorContext(key: _versionKey, parentNode: node));
       if (version == null) {
         // The error has already been reported.
         return null;
-      } else if (version > currentVersion) {
-        // TODO(brianwilkerson) Report that the version is unsupported.
+      } else if (version < 1 || version > currentVersion) {
+        _reportError(TransformSetErrorCode.unsupportedVersion, versionNode);
         return null;
       }
       // TODO(brianwilkerson) Version information is currently being ignored,
@@ -807,17 +902,18 @@
   /// error.
   ValueGenerator _translateValueGenerator(YamlNode node, ErrorContext context) {
     if (node is YamlMap) {
-      var kind = _translateString(node.valueAt(_kindKey),
-          ErrorContext(key: _kindKey, parentNode: node));
+      var kindNode = node.valueAt(_kindKey);
+      var kindContext = ErrorContext(key: _kindKey, parentNode: node);
+      var kind = _translateString(kindNode, kindContext);
       if (kind == null) {
         return null;
-      } else if (kind == _argumentKind) {
-        return _translateArgumentExtractor(node);
+      } else if (kind == _fragmentKind) {
+        return _translateCodeFragment(node);
       } else if (kind == _importKind) {
         return _translateImportValue(node);
       }
-      return _reportInvalidValueOneOf(node, context, [
-        _argumentKind,
+      return _reportInvalidValueOneOf(kindNode, kindContext, [
+        _fragmentKind,
         _importKind,
       ]);
     } else if (node == null) {
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/value_generator.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/value_generator.dart
index 1214e8b..659bb47 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/value_generator.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/value_generator.dart
@@ -2,64 +2,48 @@
 // 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/src/services/correction/fix/data_driven/accessor.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/code_template.dart';
-import 'package:analysis_server/src/services/correction/fix/data_driven/parameter_reference.dart';
 import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
+import 'package:analyzer_plugin/utilities/range_factory.dart';
 
 /// Use a specified argument from an invocation as the value of a template
 /// variable.
-class ArgumentExpression extends ValueGenerator {
-  /// The parameter corresponding to the argument from the original invocation,
-  /// or `null` if the value of the argument can't be taken from the original
-  /// invocation.
-  final ParameterReference parameter;
+class CodeFragment extends ValueGenerator {
+  /// The accessor used to access the code fragment.
+  final List<Accessor> accessors;
 
-  /// Initialize a newly created extractor to extract the argument that
-  /// corresponds to the given [parameter].
-  ArgumentExpression(this.parameter) : assert(parameter != null);
+  /// Initialize a newly created extractor to extract a code fragment.
+  CodeFragment(this.accessors);
 
   @override
   bool validate(TemplateContext context) {
-    var argumentList = _getArgumentList(context.node);
-    if (argumentList == null) {
-      return false;
-    }
-    var expression = parameter.argumentFrom(argumentList);
-    if (expression != null) {
-      return false;
+    Object target = context.node;
+    for (var accessor in accessors) {
+      var result = accessor.getValue(target);
+      if (!result.isValid) {
+        return false;
+      }
+      target = result.result;
     }
     return true;
   }
 
   @override
   void writeOn(DartEditBuilder builder, TemplateContext context) {
-    var argumentList = _getArgumentList(context.node);
-    if (argumentList != null) {
-      var expression = parameter.argumentFrom(argumentList);
-      if (expression != null) {
-        builder.write(context.utils.getNodeText(expression));
-      }
+    Object target = context.node;
+    for (var accessor in accessors) {
+      target = accessor.getValue(target).result;
     }
-  }
-
-  /// Return the argument list associated with the given [node].
-  ArgumentList _getArgumentList(AstNode node) {
-    if (node is ArgumentList) {
-      return node;
-    } else if (node is InvocationExpression) {
-      return node.argumentList;
-    } else if (node is InstanceCreationExpression) {
-      return node.argumentList;
-    } else if (node is TypeArgumentList) {
-      var parent = node.parent;
-      if (parent is InvocationExpression) {
-        return parent.argumentList;
-      } else if (parent is ExtensionOverride) {
-        return parent.argumentList;
-      }
+    if (target is AstNode) {
+      builder.write(context.utils.getRangeText(range.node(target)));
+    } else if (target is DartType) {
+      builder.writeType(target);
+    } else {
+      throw UnsupportedError('Unexpected result of ${target.runtimeType}');
     }
-    return null;
   }
 }
 
diff --git a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
index d04d443..30ab805 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
@@ -101,6 +101,7 @@
 import 'package:analysis_server/src/services/correction/dart/remove_interpolation_braces.dart';
 import 'package:analysis_server/src/services/correction/dart/remove_method_declaration.dart';
 import 'package:analysis_server/src/services/correction/dart/remove_name_from_combinator.dart';
+import 'package:analysis_server/src/services/correction/dart/remove_non_null_assertion.dart';
 import 'package:analysis_server/src/services/correction/dart/remove_operator.dart';
 import 'package:analysis_server/src/services/correction/dart/remove_parameters_in_getter_declaration.dart';
 import 'package:analysis_server/src/services/correction/dart/remove_parentheses_in_getter_invocation.dart';
@@ -591,6 +592,7 @@
     ],
     CompileTimeErrorCode.UNDEFINED_NAMED_PARAMETER: [
       ChangeArgumentName.newInstance,
+      DataDriven.newInstance,
     ],
     CompileTimeErrorCode.UNDEFINED_SETTER: [
       DataDriven.newInstance,
@@ -725,6 +727,7 @@
     ],
     CompileTimeErrorCode.MISSING_DEFAULT_VALUE_FOR_PARAMETER: [
       AddRequiredKeyword.newInstance,
+      MakeVariableNullable.newInstance,
     ],
     CompileTimeErrorCode.MISSING_REQUIRED_ARGUMENT: [
       AddMissingRequiredArgument.newInstance,
@@ -1073,6 +1076,9 @@
     StaticWarningCode.MISSING_ENUM_CONSTANT_IN_SWITCH: [
       AddMissingEnumCaseClauses.newInstance,
     ],
+    StaticWarningCode.UNNECESSARY_NON_NULL_ASSERTION: [
+      RemoveNonNullAssertion.newInstance,
+    ],
   };
 
   final DartFixContext fixContext;
diff --git a/pkg/analysis_server/lib/src/services/correction/util.dart b/pkg/analysis_server/lib/src/services/correction/util.dart
index cbd971b..59dca74 100644
--- a/pkg/analysis_server/lib/src/services/correction/util.dart
+++ b/pkg/analysis_server/lib/src/services/correction/util.dart
@@ -831,10 +831,10 @@
 
     var element = type.element;
 
-    // Typedef(s) are represented as GenericFunctionTypeElement(s).
+    // Typedef(s) are represented as FunctionTypeAliasElement(s).
     if (element is GenericFunctionTypeElement &&
         element.typeParameters.isEmpty &&
-        element.enclosingElement is GenericTypeAliasElement) {
+        element.enclosingElement is FunctionTypeAliasElement) {
       element = element.enclosingElement;
     }
 
diff --git a/pkg/analysis_server/lib/src/services/flutter/property.dart b/pkg/analysis_server/lib/src/services/flutter/property.dart
index 740ff85..ba6509a 100644
--- a/pkg/analysis_server/lib/src/services/flutter/property.dart
+++ b/pkg/analysis_server/lib/src/services/flutter/property.dart
@@ -24,7 +24,7 @@
 
 String getParameterDocumentation(ParameterElement parameter) {
   if (parameter is FieldFormalParameterElement) {
-    var rawComment = parameter.field.documentationComment;
+    var rawComment = parameter.field?.documentationComment;
     return getDartDocPlainText(rawComment);
   }
   return null;
diff --git a/pkg/analysis_server/lib/src/services/flutter/widget_descriptions.dart b/pkg/analysis_server/lib/src/services/flutter/widget_descriptions.dart
index 6476f46..7e66c3c 100644
--- a/pkg/analysis_server/lib/src/services/flutter/widget_descriptions.dart
+++ b/pkg/analysis_server/lib/src/services/flutter/widget_descriptions.dart
@@ -273,7 +273,7 @@
     var classElement = constructorElement.enclosingElement;
     if (!classesBeingProcessed.add(classElement)) return;
 
-    var existingNamed = <ParameterElement>{};
+    var existingNamed = <String>{};
     if (instanceCreation != null) {
       for (var argumentExpression in instanceCreation.argumentList.arguments) {
         var parameter = argumentExpression.staticParameterElement;
@@ -282,7 +282,7 @@
         Expression valueExpression;
         if (argumentExpression is NamedExpression) {
           valueExpression = argumentExpression.expression;
-          existingNamed.add(parameter);
+          existingNamed.add(parameter.name);
         } else {
           valueExpression = argumentExpression;
         }
@@ -301,7 +301,7 @@
 
     for (var parameter in constructorElement.parameters) {
       if (!parameter.isNamed) continue;
-      if (existingNamed.contains(parameter)) continue;
+      if (existingNamed.contains(parameter.name)) continue;
 
       _addProperty(
         properties: properties,
diff --git a/pkg/analysis_server/lib/src/services/refactoring/extract_method.dart b/pkg/analysis_server/lib/src/services/refactoring/extract_method.dart
index d626bd2..4370af4 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/extract_method.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/extract_method.dart
@@ -23,6 +23,7 @@
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/dart/element/type_system.dart';
 import 'package:analyzer/src/dart/analysis/session_helper.dart';
+import 'package:analyzer/src/dart/ast/extensions.dart';
 import 'package:analyzer/src/dart/ast/utilities.dart';
 import 'package:analyzer/src/dart/resolver/exit_detector.dart';
 import 'package:analyzer/src/generated/java_core.dart';
@@ -32,7 +33,7 @@
 const String _TOKEN_SEPARATOR = '\uFFFF';
 
 Element _getLocalElement(SimpleIdentifier node) {
-  var element = node.staticElement;
+  var element = node.writeOrReadElement;
   if (element is LocalVariableElement ||
       element is ParameterElement ||
       element is FunctionElement &&
@@ -964,7 +965,7 @@
         invalidSelection('Cannot extract the name part of a declaration.');
       }
       // method name
-      var element = node.staticElement;
+      var element = node.writeOrReadElement;
       if (element is FunctionElement || element is MethodElement) {
         invalidSelection('Cannot extract a single method name.');
       }
@@ -1215,7 +1216,7 @@
         // add parameter
         var parameter = ref._parametersMap[name];
         if (parameter == null) {
-          var parameterType = node.staticType;
+          var parameterType = node.writeOrReadType;
           var parametersBuffer = StringBuffer();
           var parameterTypeCode = ref.utils.getTypeSource(
               parameterType, ref.librariesToImport,
@@ -1263,7 +1264,7 @@
 
   @override
   void visitSimpleIdentifier(SimpleIdentifier node) {
-    var nodeElement = node.staticElement;
+    var nodeElement = node.writeOrReadElement;
     if (identical(nodeElement, element)) {
       var nodeOffset = node.offset;
       if (nodeOffset > ref.selectionRange.end) {
diff --git a/pkg/analysis_server/lib/src/services/refactoring/extract_widget.dart b/pkg/analysis_server/lib/src/services/refactoring/extract_widget.dart
index 09b73f8..389b739 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/extract_widget.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/extract_widget.dart
@@ -19,6 +19,7 @@
 import 'package:analyzer/dart/element/nullability_suffix.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/dart/analysis/session_helper.dart';
+import 'package:analyzer/src/dart/ast/extensions.dart';
 import 'package:analyzer/src/dart/ast/utilities.dart';
 import 'package:analyzer/src/generated/java_core.dart';
 import 'package:analyzer/src/generated/source.dart' show SourceRange;
@@ -591,7 +592,7 @@
 
   @override
   void visitSimpleIdentifier(SimpleIdentifier node) {
-    var element = node.staticElement;
+    var element = node.writeOrReadElement;
     if (element == null) {
       return;
     }
diff --git a/pkg/analysis_server/lib/src/services/refactoring/inline_method.dart b/pkg/analysis_server/lib/src/services/refactoring/inline_method.dart
index 74b8751..1489cd7 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/inline_method.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/inline_method.dart
@@ -17,6 +17,7 @@
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/src/dart/analysis/session_helper.dart';
+import 'package:analyzer/src/dart/ast/extensions.dart';
 import 'package:analyzer/src/dart/ast/utilities.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer_plugin/utilities/range_factory.dart';
@@ -322,7 +323,7 @@
     }
     var identifier = node as SimpleIdentifier;
     // prepare selected ExecutableElement
-    var element = identifier.staticElement;
+    var element = identifier.writeOrReadElement;
     if (element is! ExecutableElement) {
       return fatalStatus;
     }
@@ -768,7 +769,7 @@
       return;
     }
     // should be a method or field reference
-    var element = node.staticElement;
+    var element = node.writeOrReadElement;
     if (!(element is MethodElement || element is PropertyAccessorElement)) {
       return;
     }
diff --git a/pkg/analysis_server/test/abstract_context.dart b/pkg/analysis_server/test/abstract_context.dart
index 7a99a5e..7d5e49a 100644
--- a/pkg/analysis_server/test/abstract_context.dart
+++ b/pkg/analysis_server/test/abstract_context.dart
@@ -4,18 +4,20 @@
 
 import 'package:analyzer/dart/analysis/analysis_context.dart';
 import 'package:analyzer/dart/analysis/analysis_context_collection.dart';
+import 'package:analyzer/dart/analysis/features.dart';
+import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/analysis/session.dart';
-import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/visitor.dart';
 import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/file_system/overlay_file_system.dart';
 import 'package:analyzer/src/dart/analysis/analysis_context_collection.dart';
+import 'package:analyzer/src/dart/analysis/byte_store.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/dart/analysis/driver_based_analysis_context.dart';
+import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/generated/engine.dart' show AnalysisEngine;
-import 'package:analyzer/src/generated/source_io.dart';
 import 'package:analyzer/src/test_utilities/mock_sdk.dart';
+import 'package:analyzer/src/test_utilities/package_config_file_builder.dart';
 import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:linter/src/rules.dart';
 import 'package:meta/meta.dart';
@@ -41,92 +43,63 @@
 typedef _ElementVisitorFunction = void Function(Element element);
 
 class AbstractContextTest with ResourceProviderMixin {
-  OverlayResourceProvider overlayResourceProvider;
+  static bool _lintRulesAreRegistered = false;
 
+  final ByteStore _byteStore = MemoryByteStore();
+
+  final Map<String, String> _declaredVariables = {};
   AnalysisContextCollection _analysisContextCollection;
-  AnalysisDriver _driver;
 
   /// The file system specific `/home/test/analysis_options.yaml` path.
   String get analysisOptionsPath =>
       convertPath('/home/test/analysis_options.yaml');
 
-  AnalysisDriver get driver => _driver;
+  List<String> get collectionIncludedPaths => [workspaceRootPath];
 
-  AnalysisSession get session => driver.currentSession;
+  @deprecated
+  AnalysisDriver get driver {
+    throw 0;
+  }
+
+  String get latestLanguageVersion =>
+      '${ExperimentStatus.currentVersion.major}.'
+      '${ExperimentStatus.currentVersion.minor}';
+
+  AnalysisSession get session => contextFor('/home/test').currentSession;
+
+  String get testPackageLanguageVersion => '2.9';
+
+  String get testPackageLibPath => '$testPackageRootPath/lib';
+
+  String get testPackageRootPath => '$workspaceRootPath/test';
 
   /// The file system specific `/home/test/pubspec.yaml` path.
   String get testPubspecPath => convertPath('/home/test/pubspec.yaml');
 
-  void addFlutterPackage() {
-    addMetaPackage();
+  String get workspaceRootPath => '/home';
 
-    addTestPackageDependency(
-      'ui',
-      MockPackages.instance.addUI(resourceProvider).parent.path,
-    );
-
-    addTestPackageDependency(
-      'flutter',
-      MockPackages.instance.addFlutter(resourceProvider).parent.path,
-    );
+  void addSource(String path, String content) {
+    newFile(path, content: content);
   }
 
-  void addMetaPackage() {
-    var libFolder = MockPackages.instance.addMeta(resourceProvider);
-    addTestPackageDependency('meta', libFolder.parent.path);
-  }
-
-  /// Add a new file with the given [pathInLib] to the package with the
-  /// given [packageName].  Then ensure that the test package depends on the
-  /// [packageName].
-  File addPackageFile(String packageName, String pathInLib, String content) {
-    var packagePath = '/.pub-cache/$packageName';
-    addTestPackageDependency(packageName, packagePath);
-    return newFile('$packagePath/lib/$pathInLib', content: content);
-  }
-
-  Source addSource(String path, String content, [Uri uri]) {
-    var file = newFile(path, content: content);
-    var source = file.createSource(uri);
-    driver.addFile(file.path);
-    driver.changeFile(file.path);
-    return source;
-  }
-
-  void addTestPackageDependency(String name, String rootPath) {
-    var packagesFile = getFile('/home/test/.packages');
-    var packagesContent =
-        packagesFile.exists ? packagesFile.readAsStringSync() : '';
-
-    // Ignore if there is already the same package dependency.
-    if (packagesContent.contains('$name:file://')) {
-      return;
+  Future<void> analyzeTestPackageFiles() async {
+    var analysisContext = contextFor(testPackageRootPath);
+    var files = analysisContext.contextRoot.analyzedFiles().toList();
+    for (var path in files) {
+      await analysisContext.currentSession.getResolvedUnit(path);
     }
-
-    rootPath = convertPath(rootPath);
-    packagesContent += '$name:${toUri('$rootPath/lib')}\n';
-
-    packagesFile.writeAsStringSync(packagesContent);
-
-    createAnalysisContexts();
   }
 
-  void addVectorMathPackage() {
-    var libFolder = MockPackages.instance.addVectorMath(resourceProvider);
-    addTestPackageDependency('vector_math', libFolder.parent.path);
+  void changeFile(String path) {
+    path = convertPath(path);
+    driverFor(path).changeFile(path);
   }
 
-  /// Create all analysis contexts in `/home`.
-  void createAnalysisContexts() {
-    _analysisContextCollection = AnalysisContextCollectionImpl(
-      includedPaths: [convertPath('/home')],
-      enableIndex: true,
-      resourceProvider: overlayResourceProvider,
-      sdkPath: convertPath('/sdk'),
-    );
+  AnalysisContext contextFor(String path) {
+    _createAnalysisContexts();
 
-    var testPath = convertPath('/home/test');
-    _driver = getDriver(testPath);
+    path = convertPath(path);
+    return _analysisContextCollection.contextFor(path);
   }
 
   /// Create an analysis options file based on the given arguments.
@@ -162,9 +135,11 @@
     }
 
     newFile(analysisOptionsPath, content: buffer.toString());
-    if (_driver != null) {
-      createAnalysisContexts();
-    }
+  }
+
+  AnalysisDriver driverFor(String path) {
+    var context = contextFor(path) as DriverBasedAnalysisContext;
+    return context.driver;
   }
 
   /// Return the existing analysis context that should be used to analyze the
@@ -183,26 +158,34 @@
     return context.driver;
   }
 
-  Future<CompilationUnit> resolveLibraryUnit(Source source) async {
-    var resolveResult = await session.getResolvedUnit(source.fullName);
-    return resolveResult.unit;
+  @override
+  File newFile(String path, {String content = ''}) {
+    if (_analysisContextCollection != null && !path.endsWith('.dart')) {
+      throw StateError('Only dart files can be changed after analysis.');
+    }
+
+    return super.newFile(path, content: content);
+  }
+
+  Future<ResolvedUnitResult> resolveFile(String path) async {
+    path = convertPath(path);
+    return contextFor(path).currentSession.getResolvedUnit(path);
   }
 
   @mustCallSuper
   void setUp() {
-    registerLintRules();
+    if (!_lintRulesAreRegistered) {
+      registerLintRules();
+      _lintRulesAreRegistered = true;
+    }
 
     setupResourceProvider();
-    overlayResourceProvider = OverlayResourceProvider(resourceProvider);
 
-    MockSdk(resourceProvider: resourceProvider);
+    MockSdk(
+      resourceProvider: resourceProvider,
+    );
 
-    newFolder('/home/test');
-    newFile('/home/test/.packages', content: '''
-test:${toUriStr('/home/test/lib')}
-''');
-
-    createAnalysisContexts();
+    writeTestPackageConfig();
   }
 
   void setupResourceProvider() {}
@@ -214,7 +197,95 @@
   /// Update `/home/test/pubspec.yaml` and create the driver.
   void updateTestPubspecFile(String content) {
     newFile(testPubspecPath, content: content);
-    createAnalysisContexts();
+  }
+
+  void verifyCreatedCollection() {}
+
+  void writePackageConfig(String path, PackageConfigFileBuilder config) {
+    newFile(path, content: config.toContent(toUriStr: toUriStr));
+  }
+
+  void writeTestPackageConfig({
+    PackageConfigFileBuilder config,
+    String languageVersion,
+    bool flutter = false,
+    bool meta = false,
+    bool vector_math = false,
+  }) {
+    if (config == null) {
+      config = PackageConfigFileBuilder();
+    } else {
+      config = config.copy();
+    }
+
+    config.add(
+      name: 'test',
+      rootPath: testPackageRootPath,
+      languageVersion: languageVersion ?? testPackageLanguageVersion,
+    );
+
+    if (meta || flutter) {
+      var libFolder = MockPackages.instance.addMeta(resourceProvider);
+      config.add(name: 'meta', rootPath: libFolder.parent.path);
+    }
+
+    if (flutter) {
+      {
+        var libFolder = MockPackages.instance.addUI(resourceProvider);
+        config.add(name: 'ui', rootPath: libFolder.parent.path);
+      }
+      {
+        var libFolder = MockPackages.instance.addFlutter(resourceProvider);
+        config.add(name: 'flutter', rootPath: libFolder.parent.path);
+      }
+    }
+
+    if (vector_math) {
+      var libFolder = MockPackages.instance.addVectorMath(resourceProvider);
+      config.add(name: 'vector_math', rootPath: libFolder.parent.path);
+    }
+
+    var path = '$testPackageRootPath/.dart_tool/package_config.json';
+    writePackageConfig(path, config);
+  }
+
+  /// Create all analysis contexts in [collectionIncludedPaths].
+  void _createAnalysisContexts() {
+    if (_analysisContextCollection != null) {
+      return;
+    }
+
+    _analysisContextCollection = AnalysisContextCollectionImpl(
+      byteStore: _byteStore,
+      declaredVariables: _declaredVariables,
+      enableIndex: true,
+      includedPaths: collectionIncludedPaths.map(convertPath).toList(),
+      resourceProvider: resourceProvider,
+      sdkPath: convertPath('/sdk'),
+    );
+
+    verifyCreatedCollection();
+  }
+}
+
+mixin WithNullSafetyMixin on AbstractContextTest {
+  @override
+  String get testPackageLanguageVersion =>
+      Feature.non_nullable.isEnabledByDefault ? '2.12' : '2.11';
+
+  bool get withPackageMeta => false;
+
+  /// TODO(scheglov) https://github.com/dart-lang/sdk/issues/43837
+  /// Remove when Null Safety is enabled by default.
+  @nonVirtual
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(
+      languageVersion: testPackageLanguageVersion,
+      meta: withPackageMeta,
+    );
+    createAnalysisOptionsFile(experiments: [EnableString.non_nullable]);
   }
 }
 
diff --git a/pkg/analysis_server/test/abstract_single_unit.dart b/pkg/analysis_server/test/abstract_single_unit.dart
index d40c389..504662a 100644
--- a/pkg/analysis_server/test/abstract_single_unit.dart
+++ b/pkg/analysis_server/test/abstract_single_unit.dart
@@ -12,7 +12,6 @@
 import 'package:analyzer/src/dart/ast/utilities.dart';
 import 'package:analyzer/src/dart/error/hint_codes.dart';
 import 'package:analyzer/src/generated/java_engine.dart';
-import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/test_utilities/find_node.dart';
 import 'package:analyzer/src/test_utilities/platform.dart';
 import 'package:test/test.dart';
@@ -27,7 +26,6 @@
 
   String testCode;
   String testFile;
-  Source testSource;
   ResolvedUnitResult testAnalysisResult;
   CompilationUnit testUnit;
   CompilationUnitElement testUnitElement;
@@ -35,16 +33,19 @@
   FindNode findNode;
 
   @override
-  Source addSource(String path, String content, [Uri uri]) {
+  void addSource(String path, String content) {
     if (useLineEndingsForPlatform) {
       content = normalizeNewlinesForPlatform(content);
     }
-    return super.addSource(path, content, uri);
+    super.addSource(path, content);
   }
 
-  void addTestSource(String code, [Uri uri]) {
+  void addTestSource(String code) {
+    if (useLineEndingsForPlatform) {
+      code = normalizeNewlinesForPlatform(code);
+    }
     testCode = code;
-    testSource = addSource(testFile, code, uri);
+    addSource(testFile, code);
   }
 
   Element findElement(String name, [ElementKind kind]) {
@@ -127,11 +128,12 @@
     return super.newFile(path, content: content);
   }
 
-  Future<void> resolveTestUnit(String code) async {
-    if (useLineEndingsForPlatform) {
-      code = normalizeNewlinesForPlatform(code);
-    }
+  Future<void> resolveTestCode(String code) async {
     addTestSource(code);
+    await resolveTestFile();
+  }
+
+  Future<void> resolveTestFile() async {
     testAnalysisResult = await session.getResolvedUnit(testFile);
     testUnit = testAnalysisResult.unit;
     if (verifyNoTestUnitErrors) {
@@ -147,7 +149,7 @@
     }
     testUnitElement = testUnit.declaredElement;
     testLibraryElement = testUnitElement.library;
-    findNode = FindNode(code, testUnit);
+    findNode = FindNode(testCode, testUnit);
   }
 
   @override
diff --git a/pkg/analysis_server/test/analysis/get_navigation_test.dart b/pkg/analysis_server/test/analysis/get_navigation_test.dart
index 4dbe557..9e2b5d6 100644
--- a/pkg/analysis_server/test/analysis/get_navigation_test.dart
+++ b/pkg/analysis_server/test/analysis/get_navigation_test.dart
@@ -190,13 +190,13 @@
   Future<void> test_operator_index() async {
     addTestFile('''
 class A {
-  A operator [](index) => null;
-  operator []=(index, A value) {}
+  operator [](index) => 0;
+  operator []=(index, int value) {}
 }
-main() {
-  var a = new A();
-  a[0] // [];
-  a[1] = 1; // []=;
+
+void f(A a) {
+  a[0]; // []
+  a[1] = 1; // []=
   a[2] += 2;
 }
 ''');
@@ -207,7 +207,7 @@
       assertHasOperatorRegion(search, 1, '[](index)', 2);
     }
     {
-      var search = '] // []';
+      var search = ']; // []';
       await _getNavigation(testFile, testCode.indexOf(search), 1);
       assertHasOperatorRegion(search, 1, '[](index)', 2);
     }
diff --git a/pkg/analysis_server/test/analysis/notification_errors_test.dart b/pkg/analysis_server/test/analysis/notification_errors_test.dart
index 3e49eab..865288d 100644
--- a/pkg/analysis_server/test/analysis/notification_errors_test.dart
+++ b/pkg/analysis_server/test/analysis/notification_errors_test.dart
@@ -482,10 +482,6 @@
     expect(errors, hasLength(0));
   }
 
-  /// Re-enable once `sort_pub_dependencies` is fixed
-  /// See: https://github.com/dart-lang/sdk/issues/43529
-  /// See: https://github.com/dart-lang/linter/issues/2271
-  @failingTest
   Future<void> test_pubspecFile_lint() async {
     var optionsPath = join(projectPath, 'analysis_options.yaml');
     newFile(optionsPath, content: '''
@@ -497,7 +493,7 @@
     var filePath = join(projectPath, 'pubspec.yaml');
     var pubspecFile = newFile(filePath, content: '''
 name: sample
-    
+
 dependencies:
   b: any
   a: any
@@ -522,7 +518,7 @@
     //
     modifyFile(pubspecFile, '''
 name: sample
-    
+
 dependencies:
   a: any
   b: any
diff --git a/pkg/analysis_server/test/analysis/notification_navigation_test.dart b/pkg/analysis_server/test/analysis/notification_navigation_test.dart
index 90b007e..5dae7245 100644
--- a/pkg/analysis_server/test/analysis/notification_navigation_test.dart
+++ b/pkg/analysis_server/test/analysis/notification_navigation_test.dart
@@ -779,6 +779,34 @@
     assertHasFileTarget(libFile, libCode.indexOf('lib;'), 'lib'.length);
   }
 
+  Future<void> test_propertyAccess_propertyName_read() async {
+    addTestFile('''
+class A {
+  var f = 0;
+}
+
+void f(A a) {
+  a.f;
+}
+''');
+    await prepareNavigation();
+    assertHasRegionTarget('f;', 'f = 0');
+  }
+
+  Future<void> test_propertyAccess_propertyName_write() async {
+    addTestFile('''
+class A {
+  var f = 0;
+}
+
+void f(A a) {
+  a.f = 1;
+}
+''');
+    await prepareNavigation();
+    assertHasRegionTarget('f = 1', 'f = 0');
+  }
+
   Future<void> test_redirectingConstructorInvocation() async {
     addTestFile('''
 class A {
diff --git a/pkg/analysis_server/test/analysis/reanalyze_test.dart b/pkg/analysis_server/test/analysis/reanalyze_test.dart
index a5c4aff..358df55 100644
--- a/pkg/analysis_server/test/analysis/reanalyze_test.dart
+++ b/pkg/analysis_server/test/analysis/reanalyze_test.dart
@@ -35,7 +35,7 @@
     newFile(testFile, content: r'''
 import '../../other/b.dart';
 
-B b;
+var b = B();
 ''');
     createProject();
 
diff --git a/pkg/analysis_server/test/client/completion_driver_test.dart b/pkg/analysis_server/test/client/completion_driver_test.dart
index 5ee0b8a..d80900b 100644
--- a/pkg/analysis_server/test/client/completion_driver_test.dart
+++ b/pkg/analysis_server/test/client/completion_driver_test.dart
@@ -351,7 +351,7 @@
 extension Ex on A {}
 mixin M { }
 typedef T = Function(Object);
-int v;
+var v = 0;
 ''');
 
     await addTestFile('''
diff --git a/pkg/analysis_server/test/context_manager_test.dart b/pkg/analysis_server/test/context_manager_test.dart
index 0669678..28ba464 100644
--- a/pkg/analysis_server/test/context_manager_test.dart
+++ b/pkg/analysis_server/test/context_manager_test.dart
@@ -1591,11 +1591,11 @@
     MockSdk(resourceProvider: resourceProvider);
     var sdkManager = DartSdkManager(convertPath(sdkRoot));
     manager = ContextManagerImpl(
-        resourceProvider,
-        sdkManager,
-        analysisFilesGlobs,
-        InstrumentationService.NULL_SERVICE,
-        AnalysisOptionsImpl());
+      resourceProvider,
+      sdkManager,
+      analysisFilesGlobs,
+      InstrumentationService.NULL_SERVICE,
+    );
     var logger = PerformanceLog(NullStringSink());
     var scheduler = AnalysisDriverScheduler(logger);
     callbacks = TestContextManagerCallbacks(
@@ -2280,15 +2280,14 @@
   SourceFactory get sourceFactory => currentDriver?.sourceFactory;
 
   @override
-  AnalysisDriver addAnalysisDriver(
-      Folder folder, ContextRoot contextRoot, AnalysisOptions options) {
+  AnalysisDriver addAnalysisDriver(Folder folder, ContextRoot contextRoot) {
     var path = folder.path;
     expect(currentContextRoots, isNot(contains(path)));
     expect(contextRoot, isNotNull);
     expect(contextRoot.root, path);
     currentContextTimestamps[path] = now;
 
-    var builder = createContextBuilder(folder, options);
+    var builder = createContextBuilder(folder);
     builder.analysisDriverScheduler = scheduler;
     builder.byteStore = MemoryByteStore();
     builder.performanceLog = logger;
@@ -2345,9 +2344,8 @@
   }
 
   @override
-  ContextBuilder createContextBuilder(Folder folder, AnalysisOptions options) {
+  ContextBuilder createContextBuilder(Folder folder) {
     var builderOptions = ContextBuilderOptions();
-    builderOptions.defaultOptions = options;
     var builder = ContextBuilder(resourceProvider, sdkManager, null,
         options: builderOptions);
     return builder;
diff --git a/pkg/analysis_server/test/domain_analysis_test.dart b/pkg/analysis_server/test/domain_analysis_test.dart
index 45b57b3..9b966d2 100644
--- a/pkg/analysis_server/test/domain_analysis_test.dart
+++ b/pkg/analysis_server/test/domain_analysis_test.dart
@@ -323,7 +323,7 @@
         content: 'pkgA:${toUriStr('/packages/pkgA')}');
     addTestFile('''
 import 'package:pkgA/libA.dart';
-main(A a) {
+void f(A a) {
 }
 ''');
     // create project and wait for analysis
diff --git a/pkg/analysis_server/test/edit/bulk_fixes_test.dart b/pkg/analysis_server/test/edit/bulk_fixes_test.dart
index 18f2356..7f22771 100644
--- a/pkg/analysis_server/test/edit/bulk_fixes_test.dart
+++ b/pkg/analysis_server/test/edit/bulk_fixes_test.dart
@@ -42,6 +42,28 @@
     createProject();
   }
 
+  Future<void> test_annotateOverrides_excludedFile() async {
+    addAnalysisOptionsFile('''
+analyzer:
+  exclude:
+    - test/**
+linter:
+  rules:
+    - annotate_overrides
+''');
+
+    newFile('$projectPath/test/test.dart', content: '''
+class A {
+  void f() {}
+}
+class B extends A {
+  void f() {}
+}
+''');
+
+    await assertNoEdits();
+  }
+
   Future<void> test_annotateOverrides_excludedSubProject() async {
     // Root project.
     addAnalysisOptionsFile('''
@@ -126,6 +148,30 @@
 ''');
   }
 
+  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/44080')
+  Future<void> test_unnecessaryNew_collectionLiteral_overlap() async {
+    addAnalysisOptionsFile('''
+linter:
+  rules:
+    - prefer_collection_literals
+    - unnecessary_new
+''');
+
+    addTestFile('''
+class A {
+  Map<String, Object> _map = {};
+  Set<String> _set = new Set<String>();
+}
+''');
+
+    await assertEditEquals('''
+class A {
+  Map<String, Object> _map = {};
+  Set<String> _set = <String>{};
+}
+''');
+  }
+
   Future<void> test_unnecessaryNew_ignoredInOptions() async {
     addAnalysisOptionsFile('''
 analyzer:
diff --git a/pkg/analysis_server/test/edit/refactoring_test.dart b/pkg/analysis_server/test/edit/refactoring_test.dart
index 6da76ec..015b081 100644
--- a/pkg/analysis_server/test/edit/refactoring_test.dart
+++ b/pkg/analysis_server/test/edit/refactoring_test.dart
@@ -631,7 +631,7 @@
 ''');
   }
 
-  Future<void> test_expression_updateParameters() {
+  Future<void> test_expression_updateParameters() async {
     addTestFile('''
 main() {
   int a = 1;
@@ -641,15 +641,15 @@
 }
 ''');
     _setOffsetLengthForString('a + b');
-    return getRefactoringResult(_computeChange).then((result) {
-      ExtractMethodFeedback feedback = result.feedback;
-      var parameters = feedback.parameters;
-      parameters[0].name = 'aaa';
-      parameters[1].name = 'bbb';
-      parameters[1].type = 'num';
-      parameters.insert(0, parameters.removeLast());
-      options.parameters = parameters;
-      return assertSuccessfulRefactoring(_sendExtractRequest, '''
+    var result = await getRefactoringResult(_computeChange);
+    ExtractMethodFeedback feedback = result.feedback;
+    var parameters = feedback.parameters;
+    parameters[0].name = 'aaa';
+    parameters[1].name = 'bbb';
+    parameters[1].type = 'num';
+    parameters.insert(0, parameters.removeLast());
+    options.parameters = parameters;
+    return assertSuccessfulRefactoring(_sendExtractRequest, '''
 main() {
   int a = 1;
   int b = 2;
@@ -659,7 +659,6 @@
 
 int res(num bbb, int aaa) => aaa + bbb;
 ''');
-    });
   }
 
   Future<void> test_init_fatalError_invalidStatement() {
diff --git a/pkg/analysis_server/test/integration/analysis/get_hover_test.dart b/pkg/analysis_server/test/integration/analysis/get_hover_test.dart
index 18b3976..385d923 100644
--- a/pkg/analysis_server/test/integration/analysis/get_hover_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/get_hover_test.dart
@@ -131,53 +131,62 @@
     });
   }
 
-  Future<void> test_getHover() {
+  Future<void> test_getHover() async {
     writeFile(pathname, text);
     standardAnalysisSetup();
 
     // Note: analysis.getHover doesn't wait for analysis to complete--it simply
     // returns the latest results that are available at the time that the
     // request is made.  So wait for analysis to finish before testing anything.
-    return analysisFinished.then((_) {
-      var tests = <Future>[];
-      tests.add(checkHover('topLevelVar;', 11, ['List', 'topLevelVar'],
-          'top level variable', ['List']));
-      tests.add(checkHover(
-          'func(', 4, ['func', 'int', 'param'], 'function', null,
-          docRegexp: 'Documentation for func'));
-      tests.add(checkHover('int param', 3, ['int'], 'class', null,
-          isCore: true, docRegexp: '.*'));
-      tests.add(checkHover('param)', 5, ['int', 'param'], 'parameter', ['int'],
-          isLocal: true, docRegexp: 'Documentation for func'));
-      tests.add(checkHover('num localVar', 3, ['num'], 'class', null,
-          isCore: true, docRegexp: '.*'));
-      tests.add(checkHover(
-          'localVar =', 8, ['num', 'localVar'], 'local variable', ['num'],
-          isLocal: true));
-      tests.add(checkHover('topLevelVar.length;', 11, ['List', 'topLevelVar'],
-          'top level variable', ['List']));
-      tests.add(checkHover(
-          'length;', 6, ['get', 'length', 'int'], 'getter', null,
-          isCore: true, docRegexp: '.*'));
-      tests.add(checkHover(
-          'length =', 6, ['set', 'length', 'int'], 'setter', null,
-          isCore: true, docRegexp: '.*'));
-      tests.add(checkHover('param;', 5, ['int', 'param'], 'parameter', ['int'],
-          isLocal: true,
-          docRegexp: 'Documentation for func',
-          parameterRegexps: ['.*']));
-      tests.add(checkHover('add(', 3, ['add'], 'method', ['dynamic', 'void'],
-          isCore: true, docRegexp: '.*'));
-      tests.add(checkHover(
-          'localVar)', 8, ['num', 'localVar'], 'local variable', ['num'],
-          isLocal: true, parameterRegexps: ['.*']));
-      tests.add(checkHover(
-          'func(35', 4, ['func', 'int', 'param'], 'function', ['int', 'void'],
-          docRegexp: 'Documentation for func'));
-      tests.add(checkHover('35', 2, null, null, ['int'],
-          isLiteral: true, parameterRegexps: ['int', 'param']));
-      tests.add(checkNoHover('comment'));
-      return Future.wait(tests);
-    });
+    await analysisFinished;
+
+    await checkHover('topLevelVar;', 11, ['List', 'topLevelVar'],
+        'top level variable', ['List']);
+
+    await checkHover('func(', 4, ['func', 'int', 'param'], 'function', null,
+        docRegexp: 'Documentation for func');
+
+    await checkHover('int param', 3, ['int'], 'class', null,
+        isCore: true, docRegexp: '.*');
+
+    await checkHover('param)', 5, ['int', 'param'], 'parameter', ['int'],
+        isLocal: true, docRegexp: 'Documentation for func');
+
+    await checkHover('num localVar', 3, ['num'], 'class', null,
+        isCore: true, docRegexp: '.*');
+
+    await checkHover(
+        'localVar =', 8, ['num', 'localVar'], 'local variable', ['num'],
+        isLocal: true);
+
+    await checkHover('topLevelVar.length;', 11, ['List', 'topLevelVar'],
+        'top level variable', ['List']);
+
+    await checkHover('length;', 6, ['get', 'length', 'int'], 'getter', null,
+        isCore: true, docRegexp: '.*');
+
+    await checkHover('length =', 6, ['set', 'length', 'int'], 'setter', null,
+        isCore: true, docRegexp: '.*');
+
+    await checkHover('param;', 5, ['int', 'param'], 'parameter', ['int'],
+        isLocal: true,
+        docRegexp: 'Documentation for func',
+        parameterRegexps: ['.*']);
+
+    await checkHover('add(', 3, ['add'], 'method', ['dynamic', 'void'],
+        isCore: true, docRegexp: '.*');
+
+    await checkHover(
+        'localVar)', 8, ['num', 'localVar'], 'local variable', ['num'],
+        isLocal: true, parameterRegexps: ['.*']);
+
+    await checkHover(
+        'func(35', 4, ['func', 'int', 'param'], 'function', ['int', 'void'],
+        docRegexp: 'Documentation for func');
+
+    await checkHover('35', 2, null, null, ['int'],
+        isLiteral: true, parameterRegexps: ['int', 'param']);
+
+    await checkNoHover('comment');
   }
 }
diff --git a/pkg/analysis_server/test/integration/analysis/highlights2_test.dart b/pkg/analysis_server/test/integration/analysis/highlights2_test.dart
index 0e1da88..9dfcaf7 100644
--- a/pkg/analysis_server/test/integration/analysis/highlights2_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/highlights2_test.dart
@@ -77,8 +77,8 @@
     field = {2: local};
   }
 
-  Map field;
-  static int staticField;
+  Map field = {3: 4};
+  static int staticField = 0;
 
   method() {
     // End of line comment
@@ -110,7 +110,7 @@
   return async.Future.wait([]);
 }
 
-int topLevelVariable;
+int topLevelVariable = 0;
 ''';
     await computeHighlights(pathname, text);
     // There should be 1 error due to the fact that unresolvedIdentifier is
@@ -141,10 +141,10 @@
     check(HighlightRegionType.KEYWORD, ['class', 'extends', 'true', 'return']);
     check(HighlightRegionType.LITERAL_BOOLEAN, ['true']);
     check(HighlightRegionType.LITERAL_DOUBLE, ['1.0']);
-    check(HighlightRegionType.LITERAL_INTEGER, ['2', '42']);
+    check(HighlightRegionType.LITERAL_INTEGER, ['2', '3', '4', '0', '42']);
     check(HighlightRegionType.LITERAL_LIST, ['[]']);
-    check(
-        HighlightRegionType.LITERAL_MAP, ['{1.0: [].toList()}', '{2: local}']);
+    check(HighlightRegionType.LITERAL_MAP,
+        ['{1.0: [].toList()}', '{2: local}', '{3: 4}']);
     check(HighlightRegionType.LITERAL_STRING, ["'dart:async'", "'string'"]);
     check(HighlightRegionType.DYNAMIC_LOCAL_VARIABLE_DECLARATION, ['local']);
     check(HighlightRegionType.DYNAMIC_LOCAL_VARIABLE_REFERENCE, ['local']);
diff --git a/pkg/analysis_server/test/integration/analysis/highlights_test.dart b/pkg/analysis_server/test/integration/analysis/highlights_test.dart
index c7bce82..63f668b 100644
--- a/pkg/analysis_server/test/integration/analysis/highlights_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/highlights_test.dart
@@ -66,8 +66,8 @@
     field = {2: local};
   }
 
-  Map field;
-  static int staticField;
+  Map field = {3: 4};
+  static int staticField = 0;
 
   method() {
     // End of line comment
@@ -98,7 +98,7 @@
   return async.Future.wait([]);
 }
 
-int topLevelVariable;
+int topLevelVariable = 0;
 ''';
     await computeHighlights(pathname, text);
     // There should be 1 error due to the fact that unresolvedIdentifier is
@@ -128,10 +128,10 @@
     check(HighlightRegionType.KEYWORD, ['class', 'extends', 'true', 'return']);
     check(HighlightRegionType.LITERAL_BOOLEAN, ['true']);
     check(HighlightRegionType.LITERAL_DOUBLE, ['1.0']);
-    check(HighlightRegionType.LITERAL_INTEGER, ['2', '42']);
+    check(HighlightRegionType.LITERAL_INTEGER, ['2', '3', '4', '0', '42']);
     check(HighlightRegionType.LITERAL_LIST, ['[]']);
-    check(
-        HighlightRegionType.LITERAL_MAP, ['{1.0: [].toList()}', '{2: local}']);
+    check(HighlightRegionType.LITERAL_MAP,
+        ['{1.0: [].toList()}', '{2: local}', '{3: 4}']);
     check(HighlightRegionType.LITERAL_STRING, ["'dart:async'", "'string'"]);
     //check(HighlightRegionType.LOCAL_VARIABLE, ['local']);
     //check(HighlightRegionType.LOCAL_VARIABLE_DECLARATION, ['local']);
diff --git a/pkg/analysis_server/test/integration/analysis/navigation_test.dart b/pkg/analysis_server/test/integration/analysis/navigation_test.dart
index 9ba891d..b913d75 100644
--- a/pkg/analysis_server/test/integration/analysis/navigation_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/navigation_test.dart
@@ -28,7 +28,7 @@
 class Class<TypeParameter> {
   Class.constructor(); /* constructor declaration */
 
-  TypeParameter field;
+  TypeParameter field = (throw 0);
 
   method() {}
 }
@@ -39,7 +39,7 @@
   print(parameter());
 }
 
-int topLevelVariable;
+int topLevelVariable = 0;
 
 main() {
   Class<int> localVariable = new Class<int>.constructor(); // usage
@@ -115,21 +115,21 @@
         'constructor(); // usage',
         'constructor(); /* constructor declaration */',
         ElementKind.CONSTRUCTOR);
-    checkLocal('field;', 'field;', ElementKind.FIELD);
+    checkLocal('field = (', 'field = (', ElementKind.FIELD);
     checkLocal('function(() => localVariable.field)',
         'function(FunctionTypeAlias parameter)', ElementKind.FUNCTION);
     checkLocal('FunctionTypeAlias parameter', 'FunctionTypeAlias();',
         ElementKind.FUNCTION_TYPE_ALIAS);
-    checkLocal('field)', 'field;', ElementKind.GETTER);
+    checkLocal('field)', 'field = (', ElementKind.GETTER);
     checkRemote("'dart:async'", r'async\.dart$', ElementKind.LIBRARY);
     checkLocal(
         'localVariable.field', 'localVariable =', ElementKind.LOCAL_VARIABLE);
     checkLocal('method();', 'method() {', ElementKind.METHOD);
     checkLocal('parameter());', 'parameter) {', ElementKind.PARAMETER);
-    checkLocal('field = 1', 'field;', ElementKind.SETTER);
-    checkLocal('topLevelVariable;', 'topLevelVariable;',
+    checkLocal('field = 1', 'field = (', ElementKind.SETTER);
+    checkLocal('topLevelVariable = 0;', 'topLevelVariable = 0;',
         ElementKind.TOP_LEVEL_VARIABLE);
-    checkLocal(
-        'TypeParameter field;', 'TypeParameter>', ElementKind.TYPE_PARAMETER);
+    checkLocal('TypeParameter field = (', 'TypeParameter>',
+        ElementKind.TYPE_PARAMETER);
   }
 }
diff --git a/pkg/analysis_server/test/integration/edit/get_assists_test.dart b/pkg/analysis_server/test/integration/edit/get_assists_test.dart
index b500903..015a385 100644
--- a/pkg/analysis_server/test/integration/edit/get_assists_test.dart
+++ b/pkg/analysis_server/test/integration/edit/get_assists_test.dart
@@ -21,7 +21,7 @@
     var text = r'''
 import 'dart:async';
 
-Completer c;
+var c = Completer();
 ''';
     writeFile(pathname, text);
     standardAnalysisSetup();
diff --git a/pkg/analysis_server/test/integration/server/set_subscriptions_test.dart b/pkg/analysis_server/test/integration/server/set_subscriptions_test.dart
index 20f1d5f..9a7078b 100644
--- a/pkg/analysis_server/test/integration/server/set_subscriptions_test.dart
+++ b/pkg/analysis_server/test/integration/server/set_subscriptions_test.dart
@@ -28,7 +28,7 @@
 @reflectiveTest
 class SetSubscriptionsTest extends AbstractAnalysisServerIntegrationTest {
   @failingTest
-  Future<void> test_setSubscriptions() {
+  Future<void> test_setSubscriptions() async {
     // This test times out on the bots and has been disabled to keep them green.
     // We need to discover the cause and re-enable it.
 
@@ -46,28 +46,28 @@
         analysisBegun.complete();
       }
     });
-    return sendServerSetSubscriptions([]).then((_) {
-      var pathname = sourcePath('test.dart');
-      writeFile(pathname, '''
+    await sendServerSetSubscriptions([]);
+
+    var pathname = sourcePath('test.dart');
+    writeFile(pathname, '''
 main() {
   var x;
 }''');
-      standardAnalysisSetup(subscribeStatus: false);
-      // Analysis should begin, but no server.status notification should be
-      // received.
-      return analysisBegun.future.then((_) {
-        expect(statusReceived, isFalse);
-        return sendServerSetSubscriptions([ServerService.STATUS]).then((_) {
-          // Tickle test.dart just in case analysis has already completed.
-          writeFile(pathname, '''
+    standardAnalysisSetup(subscribeStatus: false);
+    // Analysis should begin, but no server.status notification should be
+    // received.
+    await analysisBegun.future;
+
+    expect(statusReceived, isFalse);
+    await sendServerSetSubscriptions([ServerService.STATUS]);
+
+    // Tickle test.dart just in case analysis has already completed.
+    writeFile(pathname, '''
 main() {
   var y;
 }''');
-          // Analysis should eventually complete, and we should be notified
-          // about it.
-          return analysisFinished;
-        });
-      });
-    });
+    // Analysis should eventually complete, and we should be notified
+    // about it.
+    await analysisFinished;
   }
 }
diff --git a/pkg/analysis_server/test/integration/server/status_test.dart b/pkg/analysis_server/test/integration/server/status_test.dart
index 48c7013..1fdf46b 100644
--- a/pkg/analysis_server/test/integration/server/status_test.dart
+++ b/pkg/analysis_server/test/integration/server/status_test.dart
@@ -18,7 +18,7 @@
 
 @reflectiveTest
 class StatusTest extends AbstractAnalysisServerIntegrationTest {
-  Future<void> test_status() {
+  Future<void> test_status() async {
     // After we kick off analysis, we should get one server.status message with
     // analyzing=true, and another server.status message after that with
     // analyzing=false.
@@ -42,9 +42,9 @@
     standardAnalysisSetup();
     expect(analysisBegun.isCompleted, isFalse);
     expect(analysisFinished.isCompleted, isFalse);
-    return analysisBegun.future.then((_) {
-      expect(analysisFinished.isCompleted, isFalse);
-      return analysisFinished.future;
-    });
+    await analysisBegun.future;
+
+    expect(analysisFinished.isCompleted, isFalse);
+    await analysisFinished.future;
   }
 }
diff --git a/pkg/analysis_server/test/lsp/code_actions_refactor_test.dart b/pkg/analysis_server/test/lsp/code_actions_refactor_test.dart
index 07d6afb3..f797e2b 100644
--- a/pkg/analysis_server/test/lsp/code_actions_refactor_test.dart
+++ b/pkg/analysis_server/test/lsp/code_actions_refactor_test.dart
@@ -10,7 +10,6 @@
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../src/utilities/mock_packages.dart';
 import '../tool/lsp_spec/matchers.dart';
 import 'code_actions_abstract.dart';
 
@@ -304,14 +303,10 @@
   @override
   void setUp() {
     super.setUp();
-
-    final flutterLibFolder = MockPackages.instance.addFlutter(resourceProvider);
-    final metaLibFolder = MockPackages.instance.addMeta(resourceProvider);
-    // Create .packages in the project.
-    newFile(join(projectFolderPath, '.packages'), content: '''
-flutter:${flutterLibFolder.toUri()}
-meta:${metaLibFolder.toUri()}
-''');
+    writePackageConfig(
+      projectFolderPath,
+      flutter: true,
+    );
   }
 
   Future<void> test_appliesCorrectEdits() async {
diff --git a/pkg/analysis_server/test/lsp/completion_test.dart b/pkg/analysis_server/test/lsp/completion_test.dart
index 07446e9..cdecc6f 100644
--- a/pkg/analysis_server/test/lsp/completion_test.dart
+++ b/pkg/analysis_server/test/lsp/completion_test.dart
@@ -30,6 +30,30 @@
     );
   }
 
+  Future<void> test_commitCharacter_completionItem() async {
+    await provideConfig(
+      () => initialize(
+        textDocumentCapabilities: withAllSupportedDynamicRegistrations(
+            emptyTextDocumentClientCapabilities),
+        workspaceCapabilities:
+            withConfigurationSupport(emptyWorkspaceClientCapabilities),
+      ),
+      {'previewCommitCharacters': true},
+    );
+
+    final content = '''
+main() {
+  pri^
+}
+    ''';
+
+    await openFile(mainFileUri, withoutMarkers(content));
+    final res = await getCompletion(mainFileUri, positionFromMarker(content));
+
+    final print = res.singleWhere((c) => c.label == 'print(…)');
+    expect(print.commitCharacters, equals(dartCompletionCommitCharacters));
+  }
+
   Future<void> test_commitCharacter_config() async {
     final registrations = <Registration>[];
     // Provide empty config and collect dynamic registrations during
@@ -744,26 +768,26 @@
 
   Future<void> test_suggestionSets_enumValuesAlreadyImported() async {
     newFile(
-      join(projectFolderPath, 'source_file.dart'),
+      join(projectFolderPath, 'lib', 'source_file.dart'),
       content: '''
       enum MyExportedEnum { One, Two }
       ''',
     );
     newFile(
-      join(projectFolderPath, 'reexport1.dart'),
+      join(projectFolderPath, 'lib', 'reexport1.dart'),
       content: '''
       export 'source_file.dart';
       ''',
     );
     newFile(
-      join(projectFolderPath, 'reexport2.dart'),
+      join(projectFolderPath, 'lib', 'reexport2.dart'),
       content: '''
       export 'source_file.dart';
       ''',
     );
 
     final content = '''
-import '../reexport1.dart';
+import 'reexport1.dart';
 
 main() {
   var a = MyExported^
@@ -788,26 +812,26 @@
 
   Future<void> test_suggestionSets_filtersOutAlreadyImportedSymbols() async {
     newFile(
-      join(projectFolderPath, 'source_file.dart'),
+      join(projectFolderPath, 'lib', 'source_file.dart'),
       content: '''
       class MyExportedClass {}
       ''',
     );
     newFile(
-      join(projectFolderPath, 'reexport1.dart'),
+      join(projectFolderPath, 'lib', 'reexport1.dart'),
       content: '''
       export 'source_file.dart';
       ''',
     );
     newFile(
-      join(projectFolderPath, 'reexport2.dart'),
+      join(projectFolderPath, 'lib', 'reexport2.dart'),
       content: '''
       export 'source_file.dart';
       ''',
     );
 
     final content = '''
-import '../reexport1.dart';
+import 'reexport1.dart';
 
 main() {
   MyExported^
diff --git a/pkg/analysis_server/test/lsp/diagnostic_test.dart b/pkg/analysis_server/test/lsp/diagnostic_test.dart
index 6364bc0..d2555e9 100644
--- a/pkg/analysis_server/test/lsp/diagnostic_test.dart
+++ b/pkg/analysis_server/test/lsp/diagnostic_test.dart
@@ -9,7 +9,6 @@
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../src/utilities/mock_packages.dart';
 import 'server_abstract.dart';
 
 void main() {
@@ -67,12 +66,6 @@
     expect(related.location.range.end.character, equals(16));
   }
 
-  @override
-  void setUp() {
-    super.setUp();
-    pedanticLibFolder = MockPackages.instance.addPedantic(resourceProvider);
-  }
-
   Future<void> test_afterDocumentEdits() async {
     const initialContents = 'int a = 1;';
     newFile(mainFilePath, content: initialContents);
@@ -105,6 +98,7 @@
     expect(initialDiagnostics.first.code, 'undefined_lint_warning');
   }
 
+  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/43926')
   Future<void> test_analysisOptionsFile_packageInclude() async {
     newFile(analysisOptionsPath, content: '''
 include: package:pedantic/analysis_options.yaml
@@ -118,15 +112,16 @@
     expect(initialDiagnostics.first.severity, DiagnosticSeverity.Warning);
     expect(initialDiagnostics.first.code, 'include_file_not_found');
 
-    // Write a package file that allows resolving the include.
-    final secondDiagnosticsUpdate = waitForDiagnostics(analysisOptionsUri);
-    newFile('$projectFolderPath/.packages', content: '''
-pedantic:${pedanticLibFolder.toUri()}
-''');
+    // TODO(scheglov) The server does not handle the file change.
+    throw 'Times out';
 
-    // Ensure the error disappeared.
-    final updatedDiagnostics = await secondDiagnosticsUpdate;
-    expect(updatedDiagnostics, hasLength(0));
+    // // Write a package file that allows resolving the include.
+    // final secondDiagnosticsUpdate = waitForDiagnostics(analysisOptionsUri);
+    // writePackageConfig(projectFolderPath, pedantic: true);
+    //
+    // // Ensure the error disappeared.
+    // final updatedDiagnostics = await secondDiagnosticsUpdate;
+    // expect(updatedDiagnostics, hasLength(0));
   }
 
   Future<void> test_contextMessage() async {
diff --git a/pkg/analysis_server/test/lsp/flutter_outline_test.dart b/pkg/analysis_server/test/lsp/flutter_outline_test.dart
index 8a21287..5ece2b69 100644
--- a/pkg/analysis_server/test/lsp/flutter_outline_test.dart
+++ b/pkg/analysis_server/test/lsp/flutter_outline_test.dart
@@ -6,7 +6,6 @@
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../src/utilities/mock_packages.dart';
 import 'server_abstract.dart';
 
 void main() {
@@ -20,12 +19,7 @@
   @override
   void setUp() {
     super.setUp();
-
-    final flutterLibFolder = MockPackages.instance.addFlutter(resourceProvider);
-    // Create .packages in the project.
-    newFile(join(projectFolderPath, '.packages'), content: '''
-flutter:${flutterLibFolder.toUri()}
-''');
+    writePackageConfig(projectFolderPath, flutter: true);
   }
 
   Future<void> test_afterChange() async {
diff --git a/pkg/analysis_server/test/lsp/hover_test.dart b/pkg/analysis_server/test/lsp/hover_test.dart
index d46f8bb8..de40613 100644
--- a/pkg/analysis_server/test/lsp/hover_test.dart
+++ b/pkg/analysis_server/test/lsp/hover_test.dart
@@ -67,7 +67,7 @@
 ```dart
 String abc
 ```
-*lib/main.dart*
+*package:test/main.dart*
 
 ---
 This is a string.
@@ -182,7 +182,7 @@
 ```dart
 String abc
 ```
-*lib/main.dart*
+*package:test/main.dart*
     '''
         .trim();
 
diff --git a/pkg/analysis_server/test/lsp/rename_test.dart b/pkg/analysis_server/test/lsp/rename_test.dart
index 41469c8..6c14e48 100644
--- a/pkg/analysis_server/test/lsp/rename_test.dart
+++ b/pkg/analysis_server/test/lsp/rename_test.dart
@@ -4,9 +4,11 @@
 
 import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
 import 'package:analysis_server/src/lsp/constants.dart';
+import 'package:meta/meta.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import '../tool/lsp_spec/matchers.dart';
 import 'server_abstract.dart';
 
 void main() {
@@ -130,6 +132,84 @@
         content, 'MyNewClass', expectedContent);
   }
 
+  Future<void> test_rename_duplicateName_applyAfterDocumentChanges() async {
+    // Perform a refactor that results in a prompt to the user, but then modify
+    // the document before accepting/rejecting to make the rename invalid.
+    const content = '''
+    class MyOtherClass {}
+    class MyClass {}
+    final a = n^ew MyClass();
+    ''';
+    final result = await _test_rename_prompt(
+      content,
+      'MyOtherClass',
+      expectedMessage:
+          'Library already declares class with name \'MyOtherClass\'.',
+      action: UserPromptActions.renameAnyway,
+      beforeResponding: () => replaceFile(999, mainFileUri, 'Updated content'),
+    );
+    expect(result.result, isNull);
+    expect(result.error, isNotNull);
+    expect(result.error, isResponseError(ErrorCodes.ContentModified));
+  }
+
+  Future<void> test_rename_duplicateName_applyAnyway() async {
+    const content = '''
+    class MyOtherClass {}
+    class MyClass {}
+    final a = n^ew MyClass();
+    ''';
+    const expectedContent = '''
+    class MyOtherClass {}
+    class MyOtherClass {}
+    final a = new MyOtherClass();
+    ''';
+    final response = await _test_rename_prompt(
+      content,
+      'MyOtherClass',
+      expectedMessage:
+          'Library already declares class with name \'MyOtherClass\'.',
+      action: UserPromptActions.renameAnyway,
+    );
+
+    if (response.error != null) {
+      throw response.error;
+    }
+
+    final result = WorkspaceEdit.fromJson(response.result);
+
+    // Ensure applying the changes will give us the expected content.
+    final contents = {
+      mainFilePath: withoutMarkers(content),
+    };
+    applyDocumentChanges(
+      contents,
+      result.documentChanges,
+    );
+    expect(contents[mainFilePath], equals(expectedContent));
+  }
+
+  Future<void> test_rename_duplicateName_reject() async {
+    const content = '''
+    class MyOtherClass {}
+    class MyClass {}
+    final a = n^ew MyClass();
+    ''';
+    final response = await _test_rename_prompt(
+      content,
+      'MyOtherClass',
+      expectedMessage:
+          'Library already declares class with name \'MyOtherClass\'.',
+      action: UserPromptActions.cancel,
+    );
+    // Expect a successful empty response if cancelled.
+    expect(response.error, isNull);
+    expect(
+      WorkspaceEdit.fromJson(response.result),
+      equals(emptyWorkspaceEdit),
+    );
+  }
+
   Future<void> test_rename_importPrefix() {
     const content = '''
     import 'dart:async' as myPr^efix;
@@ -237,17 +317,6 @@
     expect(error.message, contains('name must not contain'));
   }
 
-  Future<void> test_rename_rejectedForDuplicateName() async {
-    const content = '''
-    class MyOtherClass {}
-    class MyClass {}
-    final a = n^ew MyClass();
-    ''';
-    final error = await _test_rename_failure(content, 'MyOtherClass');
-    expect(error.code, equals(ServerErrorCodes.RenameNotValid));
-    expect(error.message, contains('already declares class with name'));
-  }
-
   Future<void> test_rename_rejectedForSameName() async {
     const content = '''
     class My^Class {}
@@ -413,6 +482,55 @@
     return result.error;
   }
 
+  /// Tests a rename that is expected to cause an error, which will trigger
+  /// a ShowMessageRequest from the server to the client to allow the refactor
+  /// to be continued or rejected.
+  Future<ResponseMessage> _test_rename_prompt(
+    String content,
+    String newName, {
+    @required String expectedMessage,
+    Future<void> Function() beforeResponding,
+    @required String action,
+    int openFileVersion = 222,
+    int renameRequestFileVersion = 222,
+  }) async {
+    await initialize(
+      workspaceCapabilities:
+          withDocumentChangesSupport(emptyWorkspaceClientCapabilities),
+    );
+    await openFile(mainFileUri, withoutMarkers(content),
+        version: openFileVersion);
+
+    // Expect the server to call us back with a ShowMessageRequest prompt about
+    // the errors for us to accept/reject.
+    return handleExpectedRequest(
+      Method.window_showMessageRequest,
+      ShowMessageRequestParams.fromJson,
+      () => renameRaw(
+        mainFileUri,
+        renameRequestFileVersion,
+        positionFromMarker(content),
+        newName,
+      ),
+      handler: (ShowMessageRequestParams params) async {
+        // Ensure the warning prompt is as expected.
+        expect(params.type, equals(MessageType.Warning));
+        expect(params.message, equals(expectedMessage));
+        expect(params.actions, hasLength(2));
+        expect(params.actions[0],
+            equals(MessageActionItem(title: UserPromptActions.renameAnyway)));
+        expect(params.actions[1],
+            equals(MessageActionItem(title: UserPromptActions.cancel)));
+
+        // Allow the test to run some code before we send the response.
+        await beforeResponding?.call();
+
+        // Respond to the request with the required action.
+        return MessageActionItem(title: action);
+      },
+    );
+  }
+
   Future<void> _test_rename_withDocumentChanges(
     String content,
     String newName,
diff --git a/pkg/analysis_server/test/lsp/server_abstract.dart b/pkg/analysis_server/test/lsp/server_abstract.dart
index 4ec3477..a21044d 100644
--- a/pkg/analysis_server/test/lsp/server_abstract.dart
+++ b/pkg/analysis_server/test/lsp/server_abstract.dart
@@ -17,8 +17,10 @@
 import 'package:analysis_server/src/utilities/mocks.dart';
 import 'package:analyzer/instrumentation/instrumentation.dart';
 import 'package:analyzer/source/line_info.dart';
+import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/generated/sdk.dart';
 import 'package:analyzer/src/test_utilities/mock_sdk.dart';
+import 'package:analyzer/src/test_utilities/package_config_file_builder.dart';
 import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:analyzer_plugin/protocol/protocol.dart' as plugin;
 import 'package:analyzer_plugin/protocol/protocol_generated.dart' as plugin;
@@ -28,6 +30,7 @@
 import 'package:test/test.dart';
 
 import '../mocks.dart';
+import '../src/utilities/mock_packages.dart';
 
 const dartLanguageId = 'dart';
 
@@ -43,7 +46,8 @@
     with
         ResourceProviderMixin,
         ClientCapabilitiesHelperMixin,
-        LspAnalysisServerTestMixin {
+        LspAnalysisServerTestMixin,
+        ConfigurationFilesMixin {
   MockLspServerChannel channel;
   TestPluginManager pluginManager;
   LspAnalysisServer server;
@@ -143,6 +147,7 @@
     pubspecFileUri = Uri.file(pubspecFilePath);
     analysisOptionsPath = join(projectFolderPath, 'analysis_options.yaml');
     analysisOptionsUri = Uri.file(analysisOptionsPath);
+    writePackageConfig(projectFolderPath);
   }
 
   Future tearDown() async {
@@ -389,6 +394,66 @@
   }
 }
 
+mixin ConfigurationFilesMixin on ResourceProviderMixin {
+  String get latestLanguageVersion =>
+      '${ExperimentStatus.currentVersion.major}.'
+      '${ExperimentStatus.currentVersion.minor}';
+
+  String get testPackageLanguageVersion => '2.9';
+
+  void writePackageConfig(
+    String projectFolderPath, {
+    PackageConfigFileBuilder config,
+    String languageVersion,
+    bool flutter = false,
+    bool meta = false,
+    bool pedantic = false,
+    bool vector_math = false,
+  }) {
+    if (config == null) {
+      config = PackageConfigFileBuilder();
+    } else {
+      config = config.copy();
+    }
+
+    config.add(
+      name: 'test',
+      rootPath: projectFolderPath,
+      languageVersion: languageVersion ?? testPackageLanguageVersion,
+    );
+
+    if (meta || flutter) {
+      var libFolder = MockPackages.instance.addMeta(resourceProvider);
+      config.add(name: 'meta', rootPath: libFolder.parent.path);
+    }
+
+    if (flutter) {
+      {
+        var libFolder = MockPackages.instance.addUI(resourceProvider);
+        config.add(name: 'ui', rootPath: libFolder.parent.path);
+      }
+      {
+        var libFolder = MockPackages.instance.addFlutter(resourceProvider);
+        config.add(name: 'flutter', rootPath: libFolder.parent.path);
+      }
+    }
+
+    if (pedantic) {
+      var libFolder = MockPackages.instance.addPedantic(resourceProvider);
+      config.add(name: 'pedantic', rootPath: libFolder.parent.path);
+    }
+
+    if (vector_math) {
+      var libFolder = MockPackages.instance.addVectorMath(resourceProvider);
+      config.add(name: 'vector_math', rootPath: libFolder.parent.path);
+    }
+
+    var path = '$projectFolderPath/.dart_tool/package_config.json';
+    var content = config.toContent(toUriStr: toUriStr);
+    newFile(path, content: content);
+  }
+}
+
 mixin LspAnalysisServerTestMixin implements ClientCapabilitiesHelperMixin {
   static const positionMarker = '^';
   static const rangeMarkerStart = '[[';
diff --git a/pkg/analysis_server/test/lsp/signature_help_test.dart b/pkg/analysis_server/test/lsp/signature_help_test.dart
index fbac555..2e6094e 100644
--- a/pkg/analysis_server/test/lsp/signature_help_test.dart
+++ b/pkg/analysis_server/test/lsp/signature_help_test.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
-import 'package:analysis_server/src/analysis_server.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -449,8 +448,7 @@
 class SignatureHelpWithNullSafetyTest extends AbstractLspAnalysisServerTest
     with SignatureHelpMixin {
   @override
-  AnalysisServerOptions get serverOptions =>
-      AnalysisServerOptions()..enabledExperiments = ['non-nullable'];
+  String get testPackageLanguageVersion => latestLanguageVersion;
 
   Future<void> test_params_requiredNamed() async {
     // This test requires support for the "required" keyword.
diff --git a/pkg/analysis_server/test/plugin/protocol_dart_test.dart b/pkg/analysis_server/test/plugin/protocol_dart_test.dart
index c0a13a9..2fdf1c5 100644
--- a/pkg/analysis_server/test/plugin/protocol_dart_test.dart
+++ b/pkg/analysis_server/test/plugin/protocol_dart_test.dart
@@ -17,7 +17,7 @@
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../abstract_context.dart';
+import '../abstract_single_unit.dart';
 
 void main() {
   defineReflectiveSuite(() {
@@ -96,7 +96,7 @@
 }
 
 @reflectiveTest
-class ElementTest extends AbstractContextTest {
+class ElementTest extends AbstractSingleUnitTest {
   engine.Element findElementInUnit(engine.CompilationUnit unit, String name,
       [engine.ElementKind kind]) {
     return findElementsByName(unit, name)
@@ -105,13 +105,12 @@
   }
 
   Future<void> test_fromElement_CLASS() async {
-    var source = addSource('/test.dart', '''
+    await resolveTestCode('''
 @deprecated
 abstract class _A {}
 class B<K, V> {}''');
-    var unit = await resolveLibraryUnit(source);
     {
-      engine.ClassElement engineElement = findElementInUnit(unit, '_A');
+      engine.ClassElement engineElement = findElementInUnit(testUnit, '_A');
       // create notification Element
       var element = convertElement(engineElement);
       expect(element.kind, ElementKind.CLASS);
@@ -119,7 +118,7 @@
       expect(element.typeParameters, isNull);
       {
         var location = element.location;
-        expect(location.file, convertPath('/test.dart'));
+        expect(location.file, testFile);
         expect(location.offset, 27);
         expect(location.length, '_A'.length);
         expect(location.startLine, 2);
@@ -133,7 +132,7 @@
               Element.FLAG_PRIVATE);
     }
     {
-      engine.ClassElement engineElement = findElementInUnit(unit, 'B');
+      engine.ClassElement engineElement = findElementInUnit(testUnit, 'B');
       // create notification Element
       var element = convertElement(engineElement);
       expect(element.kind, ElementKind.CLASS);
@@ -144,13 +143,12 @@
   }
 
   Future<void> test_fromElement_CONSTRUCTOR() async {
-    var source = addSource('/test.dart', '''
+    await resolveTestCode('''
 class A {
   const A.myConstructor(int a, [String b]);
 }''');
-    var unit = await resolveLibraryUnit(source);
     engine.ConstructorElement engineElement =
-        findElementInUnit(unit, 'myConstructor');
+        findElementInUnit(testUnit, 'myConstructor');
     // create notification Element
     var element = convertElement(engineElement);
     expect(element.kind, ElementKind.CONSTRUCTOR);
@@ -158,7 +156,7 @@
     expect(element.typeParameters, isNull);
     {
       var location = element.location;
-      expect(location.file, convertPath('/test.dart'));
+      expect(location.file, testFile);
       expect(location.offset, 20);
       expect(location.length, 'myConstructor'.length);
       expect(location.startLine, 2);
@@ -170,16 +168,15 @@
   }
 
   Future<void> test_fromElement_CONSTRUCTOR_required_parameters_1() async {
-    addMetaPackage();
-    var source = addSource('/test.dart', '''
+    writeTestPackageConfig(meta: true);
+    await resolveTestCode('''
 import 'package:meta/meta.dart';    
 class A {
   const A.myConstructor(int a, {int b, @required int c});
 }''');
 
-    var unit = await resolveLibraryUnit(source);
     engine.ConstructorElement engineElement =
-        findElementInUnit(unit, 'myConstructor');
+        findElementInUnit(testUnit, 'myConstructor');
     // create notification Element
     var element = convertElement(engineElement);
     expect(element.parameters, '(int a, {@required int c, int b})');
@@ -187,16 +184,15 @@
 
   /// Verify parameter re-ordering for required params
   Future<void> test_fromElement_CONSTRUCTOR_required_parameters_2() async {
-    addMetaPackage();
-    var source = addSource('/test.dart', '''
+    writeTestPackageConfig(meta: true);
+    await resolveTestCode('''
 import 'package:meta/meta.dart';    
 class A {
   const A.myConstructor(int a, {int b, @required int d, @required int c});
 }''');
 
-    var unit = await resolveLibraryUnit(source);
     engine.ConstructorElement engineElement =
-        findElementInUnit(unit, 'myConstructor');
+        findElementInUnit(testUnit, 'myConstructor');
     // create notification Element
     var element = convertElement(engineElement);
     expect(element.parameters,
@@ -205,16 +201,16 @@
 
   /// Verify parameter re-ordering for required params
   Future<void> test_fromElement_CONSTRUCTOR_required_parameters_3() async {
-    addMetaPackage();
-    var source = addSource('/test.dart', '''
+    writeTestPackageConfig(meta: true);
+    verifyNoTestUnitErrors = false;
+    await resolveTestCode('''
 import 'package:meta/meta.dart';    
 class A {
   const A.myConstructor(int a, {int b, @required int d, @required int c, int a});
 }''');
 
-    var unit = await resolveLibraryUnit(source);
     engine.ConstructorElement engineElement =
-        findElementInUnit(unit, 'myConstructor');
+        findElementInUnit(testUnit, 'myConstructor');
     // create notification Element
     var element = convertElement(engineElement);
     expect(element.parameters,
@@ -234,13 +230,12 @@
   }
 
   Future<void> test_fromElement_ENUM() async {
-    var source = addSource('/test.dart', '''
+    await resolveTestCode('''
 @deprecated
 enum _E1 { one, two }
 enum E2 { three, four }''');
-    var unit = await resolveLibraryUnit(source);
     {
-      engine.ClassElement engineElement = findElementInUnit(unit, '_E1');
+      engine.ClassElement engineElement = findElementInUnit(testUnit, '_E1');
       expect(engineElement.hasDeprecated, isTrue);
       // create notification Element
       var element = convertElement(engineElement);
@@ -249,7 +244,7 @@
       expect(element.typeParameters, isNull);
       {
         var location = element.location;
-        expect(location.file, convertPath('/test.dart'));
+        expect(location.file, testFile);
         expect(location.offset, 17);
         expect(location.length, '_E1'.length);
         expect(location.startLine, 2);
@@ -262,7 +257,7 @@
               Element.FLAG_PRIVATE);
     }
     {
-      engine.ClassElement engineElement = findElementInUnit(unit, 'E2');
+      engine.ClassElement engineElement = findElementInUnit(testUnit, 'E2');
       // create notification Element
       var element = convertElement(engineElement);
       expect(element.kind, ElementKind.ENUM);
@@ -273,20 +268,19 @@
   }
 
   Future<void> test_fromElement_ENUM_CONSTANT() async {
-    var source = addSource('/test.dart', '''
+    await resolveTestCode('''
 @deprecated
 enum _E1 { one, two }
 enum E2 { three, four }''');
-    var unit = await resolveLibraryUnit(source);
     {
-      engine.FieldElement engineElement = findElementInUnit(unit, 'one');
+      engine.FieldElement engineElement = findElementInUnit(testUnit, 'one');
       // create notification Element
       var element = convertElement(engineElement);
       expect(element.kind, ElementKind.ENUM_CONSTANT);
       expect(element.name, 'one');
       {
         var location = element.location;
-        expect(location.file, convertPath('/test.dart'));
+        expect(location.file, testFile);
         expect(location.offset, 23);
         expect(location.length, 'one'.length);
         expect(location.startLine, 2);
@@ -303,14 +297,14 @@
           Element.FLAG_CONST | Element.FLAG_STATIC);
     }
     {
-      engine.FieldElement engineElement = findElementInUnit(unit, 'three');
+      engine.FieldElement engineElement = findElementInUnit(testUnit, 'three');
       // create notification Element
       var element = convertElement(engineElement);
       expect(element.kind, ElementKind.ENUM_CONSTANT);
       expect(element.name, 'three');
       {
         var location = element.location;
-        expect(location.file, convertPath('/test.dart'));
+        expect(location.file, testFile);
         expect(location.offset, 44);
         expect(location.length, 'three'.length);
         expect(location.startLine, 3);
@@ -321,14 +315,14 @@
       expect(element.flags, Element.FLAG_CONST | Element.FLAG_STATIC);
     }
     {
-      var engineElement = unit.declaredElement.enums[1].getField('index');
+      var engineElement = testUnit.declaredElement.enums[1].getField('index');
       // create notification Element
       var element = convertElement(engineElement);
       expect(element.kind, ElementKind.FIELD);
       expect(element.name, 'index');
       {
         var location = element.location;
-        expect(location.file, convertPath('/test.dart'));
+        expect(location.file, testFile);
         expect(location.offset, -1);
         expect(location.length, 'index'.length);
         expect(location.startLine, 1);
@@ -339,14 +333,14 @@
       expect(element.flags, Element.FLAG_FINAL);
     }
     {
-      var engineElement = unit.declaredElement.enums[1].getField('values');
+      var engineElement = testUnit.declaredElement.enums[1].getField('values');
       // create notification Element
       var element = convertElement(engineElement);
       expect(element.kind, ElementKind.FIELD);
       expect(element.name, 'values');
       {
         var location = element.location;
-        expect(location.file, convertPath('/test.dart'));
+        expect(location.file, testFile);
         expect(location.offset, -1);
         expect(location.length, 'values'.length);
         expect(location.startLine, 1);
@@ -359,19 +353,18 @@
   }
 
   Future<void> test_fromElement_FIELD() async {
-    var source = addSource('/test.dart', '''
+    await resolveTestCode('''
 class A {
   static const myField = 42;
 }''');
-    var unit = await resolveLibraryUnit(source);
-    engine.FieldElement engineElement = findElementInUnit(unit, 'myField');
+    engine.FieldElement engineElement = findElementInUnit(testUnit, 'myField');
     // create notification Element
     var element = convertElement(engineElement);
     expect(element.kind, ElementKind.FIELD);
     expect(element.name, 'myField');
     {
       var location = element.location;
-      expect(location.file, convertPath('/test.dart'));
+      expect(location.file, testFile);
       expect(location.offset, 25);
       expect(location.length, 'myField'.length);
       expect(location.startLine, 2);
@@ -383,12 +376,11 @@
   }
 
   Future<void> test_fromElement_FUNCTION_TYPE_ALIAS() async {
-    var source = addSource('/test.dart', '''
+    await resolveTestCode('''
 typedef int F<T>(String x);
 ''');
-    var unit = await resolveLibraryUnit(source);
     engine.FunctionTypeAliasElement engineElement =
-        findElementInUnit(unit, 'F');
+        findElementInUnit(testUnit, 'F');
     // create notification Element
     var element = convertElement(engineElement);
     expect(element.kind, ElementKind.FUNCTION_TYPE_ALIAS);
@@ -396,7 +388,7 @@
     expect(element.typeParameters, '<T>');
     {
       var location = element.location;
-      expect(location.file, convertPath('/test.dart'));
+      expect(location.file, testFile);
       expect(location.offset, 12);
       expect(location.length, 'F'.length);
       expect(location.startLine, 1);
@@ -408,11 +400,11 @@
   }
 
   Future<void> test_fromElement_FUNCTION_TYPE_ALIAS_genericTypeAlias() async {
-    var source = addSource('/test.dart', '''
+    await resolveTestCode('''
 typedef F<T> = int Function(String x);
 ''');
-    var unit = await resolveLibraryUnit(source);
-    engine.GenericTypeAliasElement engineElement = findElementInUnit(unit, 'F');
+    engine.FunctionTypeAliasElement engineElement =
+        findElementInUnit(testUnit, 'F');
     // create notification Element
     var element = convertElement(engineElement);
     expect(element.kind, ElementKind.FUNCTION_TYPE_ALIAS);
@@ -420,7 +412,7 @@
     expect(element.typeParameters, '<T>');
     {
       var location = element.location;
-      expect(location.file, convertPath('/test.dart'));
+      expect(location.file, testFile);
       expect(location.offset, 8);
       expect(location.length, 'F'.length);
       expect(location.startLine, 1);
@@ -432,20 +424,20 @@
   }
 
   Future<void> test_fromElement_GETTER() async {
-    var source = addSource('/test.dart', '''
+    verifyNoTestUnitErrors = false;
+    await resolveTestCode('''
 class A {
   String get myGetter => 42;
 }''');
-    var unit = await resolveLibraryUnit(source);
     engine.PropertyAccessorElement engineElement =
-        findElementInUnit(unit, 'myGetter', engine.ElementKind.GETTER);
+        findElementInUnit(testUnit, 'myGetter', engine.ElementKind.GETTER);
     // create notification Element
     var element = convertElement(engineElement);
     expect(element.kind, ElementKind.GETTER);
     expect(element.name, 'myGetter');
     {
       var location = element.location;
-      expect(location.file, convertPath('/test.dart'));
+      expect(location.file, testFile);
       expect(location.offset, 23);
       expect(location.length, 'myGetter'.length);
       expect(location.startLine, 2);
@@ -457,22 +449,21 @@
   }
 
   Future<void> test_fromElement_LABEL() async {
-    var source = addSource('/test.dart', '''
+    await resolveTestCode('''
 main() {
 myLabel:
   while (true) {
     break myLabel;
   }
 }''');
-    var unit = await resolveLibraryUnit(source);
-    engine.LabelElement engineElement = findElementInUnit(unit, 'myLabel');
+    engine.LabelElement engineElement = findElementInUnit(testUnit, 'myLabel');
     // create notification Element
     var element = convertElement(engineElement);
     expect(element.kind, ElementKind.LABEL);
     expect(element.name, 'myLabel');
     {
       var location = element.location;
-      expect(location.file, convertPath('/test.dart'));
+      expect(location.file, testFile);
       expect(location.offset, 9);
       expect(location.length, 'myLabel'.length);
       expect(location.startLine, 2);
@@ -484,21 +475,21 @@
   }
 
   Future<void> test_fromElement_METHOD() async {
-    var source = addSource('/test.dart', '''
+    await resolveTestCode('''
 class A {
   static List<String> myMethod(int a, {String b, int c}) {
     return null;
   }
 }''');
-    var unit = await resolveLibraryUnit(source);
-    engine.MethodElement engineElement = findElementInUnit(unit, 'myMethod');
+    engine.MethodElement engineElement =
+        findElementInUnit(testUnit, 'myMethod');
     // create notification Element
     var element = convertElement(engineElement);
     expect(element.kind, ElementKind.METHOD);
     expect(element.name, 'myMethod');
     {
       var location = element.location;
-      expect(location.file, convertPath('/test.dart'));
+      expect(location.file, testFile);
       expect(location.offset, 32);
       expect(location.length, 'myGetter'.length);
       expect(location.startLine, 2);
@@ -510,12 +501,11 @@
   }
 
   Future<void> test_fromElement_MIXIN() async {
-    var source = addSource('/test.dart', '''
+    await resolveTestCode('''
 mixin A {}
 ''');
-    var unit = await resolveLibraryUnit(source);
     {
-      engine.ClassElement engineElement = findElementInUnit(unit, 'A');
+      engine.ClassElement engineElement = findElementInUnit(testUnit, 'A');
       // create notification Element
       var element = convertElement(engineElement);
       expect(element.kind, ElementKind.MIXIN);
@@ -523,7 +513,7 @@
       expect(element.typeParameters, isNull);
       {
         var location = element.location;
-        expect(location.file, convertPath('/test.dart'));
+        expect(location.file, testFile);
         expect(location.offset, 6);
         expect(location.length, 'A'.length);
         expect(location.startLine, 1);
@@ -535,20 +525,19 @@
   }
 
   Future<void> test_fromElement_SETTER() async {
-    var source = addSource('/test.dart', '''
+    await resolveTestCode('''
 class A {
   set mySetter(String x) {}
 }''');
-    var unit = await resolveLibraryUnit(source);
     engine.PropertyAccessorElement engineElement =
-        findElementInUnit(unit, 'mySetter', engine.ElementKind.SETTER);
+        findElementInUnit(testUnit, 'mySetter', engine.ElementKind.SETTER);
     // create notification Element
     var element = convertElement(engineElement);
     expect(element.kind, ElementKind.SETTER);
     expect(element.name, 'mySetter');
     {
       var location = element.location;
-      expect(location.file, convertPath('/test.dart'));
+      expect(location.file, testFile);
       expect(location.offset, 16);
       expect(location.length, 'mySetter'.length);
       expect(location.startLine, 2);
diff --git a/pkg/analysis_server/test/services/completion/dart/arglist_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/arglist_contributor_test.dart
index 197842e..f91b4f7 100644
--- a/pkg/analysis_server/test/services/completion/dart/arglist_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/arglist_contributor_test.dart
@@ -9,16 +9,17 @@
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import '../../../abstract_context.dart';
 import 'completion_contributor_util.dart';
 
 void main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(ArgListContributorTest);
+    defineReflectiveTests(ArgListContributorWithNullSafetyTest);
   });
 }
 
-@reflectiveTest
-class ArgListContributorTest extends DartCompletionContributorTest {
+mixin ArgListContributorMixin on DartCompletionContributorTest {
   void assertNoOtherSuggestions(Iterable<CompletionSuggestion> expected) {
     for (var suggestion in suggestions) {
       if (!expected.contains(suggestion)) {
@@ -111,7 +112,11 @@
   DartCompletionContributor createContributor() {
     return ArgListContributor();
   }
+}
 
+@reflectiveTest
+class ArgListContributorTest extends DartCompletionContributorTest
+    with ArgListContributorMixin {
   Future<void> test_Annotation_imported_constructor_named_param() async {
     addSource('/home/test/lib/a.dart', '''
 library libA; class A { const A({int one, String two: 'defaultValue'}); }''');
@@ -380,7 +385,7 @@
   }
 
   Future<void> test_ArgumentList_Flutter_InstanceCreationExpression_0() async {
-    addFlutterPackage();
+    writeTestPackageConfig(flutter: true);
 
     addTestSource('''
 import 'package:flutter/widgets.dart';
@@ -400,7 +405,7 @@
   }
 
   Future<void> test_ArgumentList_Flutter_InstanceCreationExpression_01() async {
-    addFlutterPackage();
+    writeTestPackageConfig(flutter: true);
 
     addTestSource('''
 import 'package:flutter/material.dart';
@@ -421,7 +426,7 @@
   }
 
   Future<void> test_ArgumentList_Flutter_InstanceCreationExpression_1() async {
-    addFlutterPackage();
+    writeTestPackageConfig(flutter: true);
 
     addTestSource('''
 import 'package:flutter/material.dart';
@@ -442,7 +447,7 @@
   }
 
   Future<void> test_ArgumentList_Flutter_InstanceCreationExpression_2() async {
-    addFlutterPackage();
+    writeTestPackageConfig(flutter: true);
 
     addTestSource('''
 import 'package:flutter/material.dart';
@@ -466,7 +471,7 @@
       test_ArgumentList_Flutter_InstanceCreationExpression_children_dynamic() async {
     // Ensure we don't generate unneeded <dynamic> param if a future API doesn't
     // type it's children.
-    addFlutterPackage();
+    writeTestPackageConfig(flutter: true);
 
     addTestSource('''
 import 'package:flutter/material.dart';
@@ -492,7 +497,7 @@
   Future<void>
       test_ArgumentList_Flutter_InstanceCreationExpression_children_Map() async {
     // Ensure we don't generate Map params for a future API
-    addFlutterPackage();
+    writeTestPackageConfig(flutter: true);
 
     addTestSource('''
 import 'package:flutter/material.dart';
@@ -516,7 +521,7 @@
 
   Future<void>
       test_ArgumentList_Flutter_InstanceCreationExpression_slivers() async {
-    addFlutterPackage();
+    writeTestPackageConfig(flutter: true);
 
     addTestSource('''
 import 'package:flutter/material.dart';
@@ -544,7 +549,7 @@
     // TODO(brianwilkerson) This test has been changed so that it no longer has
     // anything to do with Flutter (by moving the declaration of `foo` out of
     // the 'material' library). Determine whether the test is still valid.
-    addFlutterPackage();
+    writeTestPackageConfig(flutter: true);
 
     addTestSource('''
 import 'package:flutter/material.dart';
@@ -964,7 +969,7 @@
   }
 
   Future<void> test_ArgumentList_local_constructor_required_param_0() async {
-    addMetaPackage();
+    writeTestPackageConfig(meta: true);
     addTestSource('''
 import 'package:meta/meta.dart';
 class A { A({int one, @required String two: 'defaultValue'}) { } }
@@ -1078,8 +1083,27 @@
     assertNoSuggestions();
   }
 
+  Future<void> test_superConstructorInvocation() async {
+    addTestSource('''
+class A {
+  final bool field1;
+  final int field2;
+  A({this.field1, this.field2});
+}
+class B extends A {
+  B() : super(^);
+}
+''');
+    await computeSuggestions();
+    assertSuggestArgumentsAndTypes(
+        namedArgumentsWithTypes: {'field1': 'bool', 'field2': 'int'});
+  }
+}
+
+@reflectiveTest
+class ArgListContributorWithNullSafetyTest extends DartCompletionContributorTest
+    with WithNullSafetyMixin, ArgListContributorMixin {
   Future<void> test_ArgumentList_nnbd_function_named_param() async {
-    createAnalysisOptionsFile(experiments: [EnableString.non_nullable]);
     addTestSource(r'''
 f({int? nullable, int nonnullable}) {}
 main() { f(^);}');
@@ -1092,7 +1116,6 @@
   }
 
   Future<void> test_ArgumentList_nnbd_function_named_param_imported() async {
-    createAnalysisOptionsFile(experiments: [EnableString.non_nullable]);
     addSource('/home/test/lib/a.dart', '''
 f({int? nullable, int nonnullable}) {}''');
     createAnalysisOptionsFile(experiments: [EnableString.non_nullable]);
@@ -1108,7 +1131,6 @@
   }
 
   Future<void> test_ArgumentList_nnbd_function_named_param_legacy() async {
-    createAnalysisOptionsFile(experiments: [EnableString.non_nullable]);
     addSource('/home/test/lib/a.dart', '''
 // @dart = 2.8
 f({int named}) {}''');
@@ -1121,20 +1143,4 @@
       'named': 'int*',
     });
   }
-
-  Future<void> test_superConstructorInvocation() async {
-    addTestSource('''
-class A {
-  final bool field1;
-  final int field2;
-  A({this.field1, this.field2});
-}
-class B extends A {
-  B() : super(^);
-}
-''');
-    await computeSuggestions();
-    assertSuggestArgumentsAndTypes(
-        namedArgumentsWithTypes: {'field1': 'bool', 'field2': 'int'});
-  }
 }
diff --git a/pkg/analysis_server/test/services/completion/dart/completion_contributor_util.dart b/pkg/analysis_server/test/services/completion/dart/completion_contributor_util.dart
index d326ca1..8e22c6a 100644
--- a/pkg/analysis_server/test/services/completion/dart/completion_contributor_util.dart
+++ b/pkg/analysis_server/test/services/completion/dart/completion_contributor_util.dart
@@ -11,6 +11,7 @@
     show DartCompletionRequestImpl;
 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/analysis/results.dart';
 import 'package:analyzer/src/dartdoc/dartdoc_directive_info.dart';
 import 'package:analyzer/src/generated/parser.dart' as analyzer;
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
@@ -75,6 +76,8 @@
   int replacementOffset;
   int replacementLength;
 
+  ResolvedUnitResult result;
+
   /// The Dartdoc information passed to requests.
   final DartdocDirectiveInfo dartdocInfo = DartdocDirectiveInfo();
 
@@ -547,9 +550,9 @@
       DartCompletionRequest request);
 
   Future computeSuggestions({int times = 200}) async {
-    var resolveResult = await session.getResolvedUnit(testFile);
-    var baseRequest = CompletionRequestImpl(resolveResult, completionOffset,
-        useNewRelevance, CompletionPerformance());
+    result = await session.getResolvedUnit(testFile);
+    var baseRequest = CompletionRequestImpl(
+        result, completionOffset, useNewRelevance, CompletionPerformance());
 
     return await baseRequest.performance.runRequestOperation(
       (performance) async {
diff --git a/pkg/analysis_server/test/services/completion/dart/completion_manager_test.dart b/pkg/analysis_server/test/services/completion/dart/completion_manager_test.dart
index c77e7ce..5a3825d 100644
--- a/pkg/analysis_server/test/services/completion/dart/completion_manager_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/completion_manager_test.dart
@@ -30,7 +30,7 @@
   }
 
   Future<void> test_resolveDirectives() async {
-    addSource('/home/test/lib/a.dart', '''
+    newFile('$testPackageLibPath/a.dart', content: '''
 library libA;
 /// My class.
 /// Short description.
@@ -38,13 +38,15 @@
 /// Longer description.
 class A {}
 ''');
-    addSource('/home/test/lib/b.dart', '''
+    newFile('$testPackageLibPath/b.dart', content: '''
 library libB;
 import "a.dart" as foo;
 part 'test.dart';
 ''');
     addTestSource('part of libB; main() {^}');
 
+    await resolveFile('$testPackageLibPath/b.dart');
+
     // Build the request
     var baseRequest = CompletionRequestImpl(
         await session.getResolvedUnit(testFile),
diff --git a/pkg/analysis_server/test/services/completion/dart/imported_reference_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/imported_reference_contributor_test.dart
index 1ae4849..610dded 100644
--- a/pkg/analysis_server/test/services/completion/dart/imported_reference_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/imported_reference_contributor_test.dart
@@ -9,16 +9,17 @@
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import '../../../abstract_context.dart';
 import 'completion_contributor_util.dart';
 
 void main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(ImportedReferenceContributorTest);
+    defineReflectiveTests(ImportedReferenceContributorWithNullSafetyTest);
   });
 }
 
-@reflectiveTest
-class ImportedReferenceContributorTest extends DartCompletionContributorTest {
+mixin ImportedReferenceContributorMixin on DartCompletionContributorTest {
   @override
   bool get isNullExpectedReturnTypeConsideredDynamic => false;
 
@@ -26,10 +27,14 @@
   DartCompletionContributor createContributor() {
     return ImportedReferenceContributor();
   }
+}
 
+@reflectiveTest
+class ImportedReferenceContributorTest extends DartCompletionContributorTest
+    with ImportedReferenceContributorMixin {
   /// Sanity check.  Permutations tested in local_ref_contributor.
   Future<void> test_ArgDefaults_function_with_required_named() async {
-    addMetaPackage();
+    writeTestPackageConfig(meta: true);
 
     resolveSource('/home/test/lib/b.dart', '''
 lib B;
@@ -1192,7 +1197,8 @@
   }
 
   Future<void> test_Block_unimported() async {
-    addPackageFile('aaa', 'a.dart', 'class A {}');
+    newFile('$testPackageLibPath/a.dart', content: 'class A {}');
+
     addTestSource('main() { ^ }');
 
     await computeSuggestions();
@@ -2303,69 +2309,6 @@
     expect(suggestion.hasNamedParameters, true);
   }
 
-  Future<void> test_function_parameters_nnbd_required() async {
-    createAnalysisOptionsFile(experiments: [EnableString.non_nullable]);
-    resolveSource('/home/test/lib/a.dart', '''
-void m(int? nullable, int nonNullable) {}
-''');
-    addTestSource('''
-import 'a.dart';
-
-main() {^}
-''');
-    await computeSuggestions();
-    var suggestion = assertSuggestFunction('m', 'void');
-    expect(suggestion.parameterNames, hasLength(2));
-    expect(suggestion.parameterNames[0], 'nullable');
-    expect(suggestion.parameterTypes[0], 'int?');
-    expect(suggestion.parameterNames[1], 'nonNullable');
-    expect(suggestion.parameterTypes[1], 'int');
-    expect(suggestion.requiredParameterCount, 2);
-    expect(suggestion.hasNamedParameters, false);
-  }
-
-  Future<void> test_function_parameters_nnbd_required_into_legacy() async {
-    createAnalysisOptionsFile(experiments: [EnableString.non_nullable]);
-    resolveSource('/home/test/lib/a.dart', '''
-void m(int? nullable, int nonNullable) {}
-''');
-    addTestSource('''
-// @dart = 2.8
-import 'a.dart';
-
-main() {^}
-''');
-    await computeSuggestions();
-    var suggestion = assertSuggestFunction('m', 'void');
-    expect(suggestion.parameterNames, hasLength(2));
-    expect(suggestion.parameterNames[0], 'nullable');
-    expect(suggestion.parameterTypes[0], 'int');
-    expect(suggestion.parameterNames[1], 'nonNullable');
-    expect(suggestion.parameterTypes[1], 'int');
-    expect(suggestion.requiredParameterCount, 2);
-    expect(suggestion.hasNamedParameters, false);
-  }
-
-  Future<void> test_function_parameters_nnbd_required_legacy() async {
-    createAnalysisOptionsFile(experiments: [EnableString.non_nullable]);
-    resolveSource('/home/test/lib/a.dart', '''
-// @dart = 2.8
-void m(int param) {}
-''');
-    addTestSource('''
-import 'a.dart';
-
-main() {^}
-''');
-    await computeSuggestions();
-    var suggestion = assertSuggestFunction('m', 'void');
-    expect(suggestion.parameterNames, hasLength(1));
-    expect(suggestion.parameterNames[0], 'param');
-    expect(suggestion.parameterTypes[0], 'int*');
-    expect(suggestion.requiredParameterCount, 1);
-    expect(suggestion.hasNamedParameters, false);
-  }
-
   Future<void> test_function_parameters_none() async {
     resolveSource('/home/test/lib/a.dart', '''
 void m() {}
@@ -3776,12 +3719,12 @@
 
   Future<void> test_partFile_TypeName() async {
     // SimpleIdentifier  TypeName  ConstructorName
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         lib B;
         int T1;
         F1() { }
         class X {X.c(); X._d(); z() {}}''');
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         library libA;
         import 'b.dart';
         part "test.dart";
@@ -3792,6 +3735,8 @@
         class B { B.bar(int x); }
         main() {new ^}''');
 
+    await resolveFile('$testPackageLibPath/a.dart');
+
     await computeSuggestions();
     expect(replacementOffset, completionOffset);
     expect(replacementLength, 0);
@@ -4755,3 +4700,71 @@
     assertSuggestClass('Object');
   }
 }
+
+@reflectiveTest
+class ImportedReferenceContributorWithNullSafetyTest
+    extends DartCompletionContributorTest
+    with WithNullSafetyMixin, ImportedReferenceContributorMixin {
+  Future<void> test_function_parameters_nnbd_required() async {
+    createAnalysisOptionsFile(experiments: [EnableString.non_nullable]);
+    resolveSource('/home/test/lib/a.dart', '''
+void m(int? nullable, int nonNullable) {}
+''');
+    addTestSource('''
+import 'a.dart';
+
+main() {^}
+''');
+    await computeSuggestions();
+    var suggestion = assertSuggestFunction('m', 'void');
+    expect(suggestion.parameterNames, hasLength(2));
+    expect(suggestion.parameterNames[0], 'nullable');
+    expect(suggestion.parameterTypes[0], 'int?');
+    expect(suggestion.parameterNames[1], 'nonNullable');
+    expect(suggestion.parameterTypes[1], 'int');
+    expect(suggestion.requiredParameterCount, 2);
+    expect(suggestion.hasNamedParameters, false);
+  }
+
+  Future<void> test_function_parameters_nnbd_required_into_legacy() async {
+    createAnalysisOptionsFile(experiments: [EnableString.non_nullable]);
+    resolveSource('/home/test/lib/a.dart', '''
+void m(int? nullable, int nonNullable) {}
+''');
+    addTestSource('''
+// @dart = 2.8
+import 'a.dart';
+
+main() {^}
+''');
+    await computeSuggestions();
+    var suggestion = assertSuggestFunction('m', 'void');
+    expect(suggestion.parameterNames, hasLength(2));
+    expect(suggestion.parameterNames[0], 'nullable');
+    expect(suggestion.parameterTypes[0], 'int');
+    expect(suggestion.parameterNames[1], 'nonNullable');
+    expect(suggestion.parameterTypes[1], 'int');
+    expect(suggestion.requiredParameterCount, 2);
+    expect(suggestion.hasNamedParameters, false);
+  }
+
+  Future<void> test_function_parameters_nnbd_required_legacy() async {
+    createAnalysisOptionsFile(experiments: [EnableString.non_nullable]);
+    resolveSource('/home/test/lib/a.dart', '''
+// @dart = 2.8
+void m(int param) {}
+''');
+    addTestSource('''
+import 'a.dart';
+
+main() {^}
+''');
+    await computeSuggestions();
+    var suggestion = assertSuggestFunction('m', 'void');
+    expect(suggestion.parameterNames, hasLength(1));
+    expect(suggestion.parameterNames[0], 'param');
+    expect(suggestion.parameterTypes[0], 'int*');
+    expect(suggestion.requiredParameterCount, 1);
+    expect(suggestion.hasNamedParameters, false);
+  }
+}
diff --git a/pkg/analysis_server/test/services/completion/dart/keyword_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/keyword_contributor_test.dart
index 9f3adc4..f5f9774 100644
--- a/pkg/analysis_server/test/services/completion/dart/keyword_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/keyword_contributor_test.dart
@@ -11,6 +11,7 @@
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import '../../../abstract_context.dart';
 import 'completion_contributor_util.dart';
 
 void main() {
@@ -457,7 +458,7 @@
 
   /// Return `true` if the given [feature] is enabled.
   bool isEnabled(Feature feature) =>
-      driver.analysisOptions.contextFeatures.isEnabled(feature);
+      result.libraryElement.featureSet.isEnabled(feature);
 
   Future<void> test_after_class_noPrefix() async {
     addTestSource('class A {} ^');
@@ -2267,10 +2268,5 @@
 }
 
 @reflectiveTest
-class KeywordContributorWithNullSafetyTest extends KeywordContributorTest {
-  @override
-  void setupResourceProvider() {
-    super.setupResourceProvider();
-    createAnalysisOptionsFile(experiments: [EnableString.non_nullable]);
-  }
-}
+class KeywordContributorWithNullSafetyTest extends KeywordContributorTest
+    with WithNullSafetyMixin {}
diff --git a/pkg/analysis_server/test/services/completion/dart/library_member_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/library_member_contributor_test.dart
index 1f1a333..95a7d99 100644
--- a/pkg/analysis_server/test/services/completion/dart/library_member_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/library_member_contributor_test.dart
@@ -99,11 +99,12 @@
 
   Future<void> test_libraryPrefix_deferred_inPart() async {
     // SimpleIdentifier  PrefixedIdentifier  ExpressionStatement
-    addSource('/home/test/lib/a.dart', '''
+    newFile('$testPackageLibPath/a.dart', content: '''
         library testA;
         import "dart:async" deferred as bar;
         part "test.dart";''');
     addTestSource('part of testA; foo() {bar.^}');
+    await resolveFile('$testPackageLibPath/a.dart');
     // Assume that libraries containing has been computed for part files
     await computeSuggestions();
     assertSuggestClass('Future');
@@ -112,8 +113,8 @@
   }
 
   Future<void> test_libraryPrefix_with_exports() async {
-    addSource('/home/test/lib/a.dart', 'library libA; class A { }');
-    addSource('/home/test/lib/b.dart', '''
+    newFile('$testPackageLibPath/a.dart', content: 'library libA; class A { }');
+    newFile('$testPackageLibPath/b.dart', content: '''
         library libB;
         export "a.dart";
         class B { }
@@ -188,12 +189,12 @@
 
   Future<void> test_PrefixedIdentifier_library_inPart() async {
     // SimpleIdentifier  PrefixedIdentifier  ExpressionStatement
-    addSource('/home/test/lib/b.dart', '''
+    newFile('$testPackageLibPath/b.dart', content: '''
         lib B;
         var T1;
         class X { }
         class Y { }''');
-    addSource('/home/test/lib/a.dart', '''
+    newFile('$testPackageLibPath/a.dart', content: '''
         library testA;
         import "b.dart" as b;
         part "test.dart";
@@ -202,6 +203,7 @@
     addTestSource('''
         part of testA;
         main() {b.^}''');
+    await resolveFile('$testPackageLibPath/a.dart');
     // Assume that libraries containing has been computed for part files
     await computeSuggestions();
     expect(replacementOffset, completionOffset);
@@ -218,7 +220,7 @@
 
   Future<void> test_PrefixedIdentifier_library_typesOnly() async {
     // SimpleIdentifier  PrefixedIdentifier  TypeName
-    addSource('/home/test/lib/b.dart', '''
+    newFile('$testPackageLibPath/b.dart', content: '''
         lib B;
         var T1;
         class X { }
@@ -243,7 +245,7 @@
 
   Future<void> test_PrefixedIdentifier_library_typesOnly2() async {
     // SimpleIdentifier  PrefixedIdentifier  TypeName
-    addSource('/home/test/lib/b.dart', '''
+    newFile('$testPackageLibPath/b.dart', content: '''
         lib B;
         var T1;
         class X { }
@@ -268,7 +270,7 @@
 
   Future<void> test_PrefixedIdentifier_parameter() async {
     // SimpleIdentifier  PrefixedIdentifier  ExpressionStatement
-    addSource('/home/test/lib/b.dart', '''
+    newFile('$testPackageLibPath/b.dart', content: '''
         lib B;
         class _W {M y; var _z;}
         class X extends _W {}
@@ -282,7 +284,7 @@
 
   Future<void> test_PrefixedIdentifier_prefix() async {
     // SimpleIdentifier  PrefixedIdentifier  ExpressionStatement
-    addSource('/home/test/lib/a.dart', '''
+    newFile('$testPackageLibPath/a.dart', content: '''
         class A {static int bar = 10;}
         _B() {}''');
     addTestSource('''
diff --git a/pkg/analysis_server/test/services/completion/dart/library_prefix_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/library_prefix_contributor_test.dart
index 0cdcb90..e6e9ec2 100644
--- a/pkg/analysis_server/test/services/completion/dart/library_prefix_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/library_prefix_contributor_test.dart
@@ -303,6 +303,7 @@
     addTestSource('''
 part of testB;
 main() {new ^ String x = "hello";}''');
+    await analyzeTestPackageFiles();
     await computeSuggestions();
     assertSuggestLibraryPrefixes(['math', 't']);
   }
diff --git a/pkg/analysis_server/test/services/completion/dart/local_library_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/local_library_contributor_test.dart
index e6724b6..08f9a72 100644
--- a/pkg/analysis_server/test/services/completion/dart/local_library_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/local_library_contributor_test.dart
@@ -24,12 +24,12 @@
 
   Future<void> test_partFile_Constructor() async {
     // SimpleIdentifier  TypeName  ConstructorName
-    addSource('/home/test/lib/b.dart', '''
+    newFile('$testPackageLibPath/b.dart', content: '''
         lib B;
         int T1;
         F1() { }
         class X {X.c(); X._d(); z() {}}''');
-    addSource('/home/test/lib/a.dart', '''
+    newFile('$testPackageLibPath/a.dart', content: '''
         library libA;
         import "b.dart";
         part "test.dart";
@@ -39,6 +39,7 @@
         part of libA;
         class B { B.bar(int x); }
         main() {new ^}''');
+    await resolveFile('$testPackageLibPath/a.dart');
     await computeSuggestions();
     expect(replacementOffset, completionOffset);
     expect(replacementLength, 0);
@@ -58,12 +59,12 @@
 
   Future<void> test_partFile_Constructor2() async {
     // SimpleIdentifier  TypeName  ConstructorName
-    addSource('/home/test/lib/b.dart', '''
+    newFile('$testPackageLibPath/b.dart', content: '''
         lib B;
         int T1;
         F1() { }
         class X {X.c(); X._d(); z() {}}''');
-    addSource('/home/test/lib/a.dart', '''
+    newFile('$testPackageLibPath/a.dart', content: '''
         part of libA;
         class B { }''');
     addTestSource('''
@@ -91,7 +92,7 @@
   }
 
   Future<void> test_partFile_extension() async {
-    addSource('/home/test/lib/a.dart', '''
+    newFile('$testPackageLibPath/a.dart', content: '''
 part of libA;
 extension E on int {}
 ''');
@@ -109,12 +110,12 @@
   Future<void>
       test_partFile_InstanceCreationExpression_assignment_filter() async {
     // ConstructorName  InstanceCreationExpression  VariableDeclarationList
-    addSource('/home/test/lib/b.dart', '''
+    newFile('$testPackageLibPath/b.dart', content: '''
         lib B;
         int T1;
         F1() { }
         class X {X.c(); X._d(); z() {}}''');
-    addSource('/home/test/lib/a.dart', '''
+    newFile('$testPackageLibPath/a.dart', content: '''
         part of libA;
         class A {} class B extends A {} class C implements A {} class D {}
         ''');
@@ -156,12 +157,12 @@
   Future<void>
       test_partFile_InstanceCreationExpression_variable_declaration_filter() async {
     // ConstructorName  InstanceCreationExpression  VariableDeclarationList
-    addSource('/home/test/lib/b.dart', '''
+    newFile('$testPackageLibPath/b.dart', content: '''
         lib B;
         int T1;
         F1() { }
         class X {X.c(); X._d(); z() {}}''');
-    addSource('/home/test/lib/a.dart', '''
+    newFile('$testPackageLibPath/a.dart', content: '''
         part of libA;
         class A {} class B extends A {} class C implements A {} class D {}
         ''');
@@ -199,12 +200,12 @@
   }
 
   Future<void> test_partFile_TypeName() async {
-    addSource('/home/test/lib/b.dart', '''
+    newFile('$testPackageLibPath/b.dart', content: '''
         lib B;
         int T1;
         F1() { }
         class X {X.c(); X._d(); z() {}}''');
-    addSource('/home/test/lib/a.dart', '''
+    newFile('$testPackageLibPath/a.dart', content: '''
         library libA;
         import "b.dart";
         part "test.dart";
@@ -216,6 +217,7 @@
         part of libA;
         class B { B.bar(int x); }
         main() {^}''');
+    await resolveFile('$testPackageLibPath/a.dart');
     await computeSuggestions();
     expect(replacementOffset, completionOffset);
     expect(replacementLength, 0);
@@ -241,12 +243,12 @@
   }
 
   Future<void> test_partFile_TypeName2() async {
-    addSource('/home/test/lib/b.dart', '''
+    newFile('$testPackageLibPath/b.dart', content: '''
         lib B;
         int T1;
         F1() { }
         class X {X.c(); X._d(); z() {}}''');
-    addSource('/home/test/lib/a.dart', '''
+    newFile('$testPackageLibPath/a.dart', content: '''
         part of libA;
         class B { var b1; b2(){}}
         int bf() => 0;
diff --git a/pkg/analysis_server/test/services/completion/dart/local_reference_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/local_reference_contributor_test.dart
index bb0f9a8..e0268de 100644
--- a/pkg/analysis_server/test/services/completion/dart/local_reference_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/local_reference_contributor_test.dart
@@ -48,7 +48,7 @@
   }
 
   Future<void> test_ArgDefaults_function_with_optional_positional() async {
-    addMetaPackage();
+    writeTestPackageConfig(meta: true);
     addTestSource('''
 import 'package:meta/meta.dart';
 
@@ -61,7 +61,7 @@
   }
 
   Future<void> test_ArgDefaults_function_with_required_named() async {
-    addMetaPackage();
+    writeTestPackageConfig(meta: true);
     addTestSource('''
 import 'package:meta/meta.dart';
 
@@ -75,7 +75,7 @@
   }
 
   Future<void> test_ArgDefaults_inherited_method_with_required_named() async {
-    addMetaPackage();
+    writeTestPackageConfig(meta: true);
     resolveSource('/home/test/lib/b.dart', '''
 import 'package:meta/meta.dart';
 
@@ -96,7 +96,7 @@
   }
 
   Future<void> test_ArgDefaults_method_with_required_named() async {
-    addMetaPackage();
+    writeTestPackageConfig(meta: true);
     addTestSource('''
 import 'package:meta/meta.dart';
 
@@ -1498,7 +1498,7 @@
   }
 
   Future<void> test_Block_unimported() async {
-    addPackageFile('aaa', 'a.dart', 'class A {}');
+    newFile('$testPackageLibPath/a.dart', content: 'class A {}');
     addTestSource('main() { ^ }');
 
     await computeSuggestions();
@@ -3995,7 +3995,7 @@
   }
 
   Future<void> test_localConstructor() async {
-    addMetaPackage();
+    writeTestPackageConfig(meta: true);
     addTestSource('''
 import 'package:meta/meta.dart';
 
@@ -4010,14 +4010,14 @@
   }
 
   Future<void> test_localConstructor2() async {
-    addMetaPackage();
+    writeTestPackageConfig(meta: true);
     addTestSource('''class A {A.named();} main() {^}}''');
     await computeSuggestions();
     assertSuggestConstructor('A.named');
   }
 
   Future<void> test_localConstructor_abstract() async {
-    addMetaPackage();
+    writeTestPackageConfig(meta: true);
     addTestSource('''
 abstract class A {
   A();
@@ -4030,14 +4030,14 @@
   }
 
   Future<void> test_localConstructor_defaultConstructor() async {
-    addMetaPackage();
+    writeTestPackageConfig(meta: true);
     addTestSource('''class A {} main() {^}}''');
     await computeSuggestions();
     assertSuggestConstructor('A');
   }
 
   Future<void> test_localConstructor_factory() async {
-    addMetaPackage();
+    writeTestPackageConfig(meta: true);
     addTestSource('''
 abstract class A {
   factory A();
@@ -4050,7 +4050,7 @@
   }
 
   Future<void> test_localConstructor_optionalNew() async {
-    addMetaPackage();
+    writeTestPackageConfig(meta: true);
     addTestSource('''
 import 'package:meta/meta.dart';
 
@@ -6047,7 +6047,7 @@
 
   Future<void> _check_flutter_setState(
       String line, String completion, int selectionOffset) async {
-    addFlutterPackage();
+    writeTestPackageConfig(flutter: true);
     addTestSource('''
 import 'package:flutter/widgets.dart';
 
diff --git a/pkg/analysis_server/test/services/completion/dart/override_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/override_contributor_test.dart
index 7edebfc..34832e9 100644
--- a/pkg/analysis_server/test/services/completion/dart/override_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/override_contributor_test.dart
@@ -171,6 +171,7 @@
 }
 ''');
     // assume information for context.getLibrariesContaining has been cached
+    await resolveFile('$testPackageLibPath/myLib.dart');
     await computeSuggestions();
     _assertOverride('''
 @override
@@ -405,7 +406,7 @@
   }
 
   Future<void> test_private_otherLibrary() async {
-    addSource('/home/test/lib/a.dart', '''
+    newFile('$testPackageLibPath/a.dart', content: '''
 class A {
   void foo() {}
   void _bar() {}
diff --git a/pkg/analysis_server/test/services/completion/dart/relevance/completion_relevance.dart b/pkg/analysis_server/test/services/completion/dart/relevance/completion_relevance.dart
index 9a363e9..643fec4 100644
--- a/pkg/analysis_server/test/services/completion/dart/relevance/completion_relevance.dart
+++ b/pkg/analysis_server/test/services/completion/dart/relevance/completion_relevance.dart
@@ -9,12 +9,9 @@
 import '../../../../client/completion_driver_test.dart';
 
 class CompletionRelevanceTest extends AbstractCompletionDriverTest {
-  List<String> get enabledExperiments => [];
-
   @override
-  AnalysisServerOptions get serverOptions => AnalysisServerOptions()
-    ..enabledExperiments = enabledExperiments
-    ..useNewRelevance = true;
+  AnalysisServerOptions get serverOptions =>
+      AnalysisServerOptions()..useNewRelevance = true;
 
   @override
   bool get supportsAvailableSuggestions => true;
diff --git a/pkg/analysis_server/test/services/completion/dart/relevance/named_argument_relevance_test.dart b/pkg/analysis_server/test/services/completion/dart/relevance/named_argument_relevance_test.dart
index baaf538..ffe4112 100644
--- a/pkg/analysis_server/test/services/completion/dart/relevance/named_argument_relevance_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/relevance/named_argument_relevance_test.dart
@@ -46,9 +46,6 @@
 @reflectiveTest
 class NamedArgumentRelevanceWithNullSafetyTest
     extends NamedArgumentRelevanceTest {
-  @override
-  List<String> get enabledExperiments => ['non-nullable'];
-
   Future<void> test_required() async {
     await addTestFile('''
 void f({int a = 0, required int b}) {}
diff --git a/pkg/analysis_server/test/services/completion/dart/type_member_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/type_member_contributor_test.dart
index ba212b20..f1fd8f5 100644
--- a/pkg/analysis_server/test/services/completion/dart/type_member_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/type_member_contributor_test.dart
@@ -78,7 +78,7 @@
   }
 
   Future<void> test_ArgDefaults_method_with_optional_positional() async {
-    addMetaPackage();
+    writeTestPackageConfig(meta: true);
     addTestSource('''
 import 'package:meta/meta.dart';
 
@@ -93,7 +93,7 @@
   }
 
   Future<void> test_ArgDefaults_method_with_required_named() async {
-    addMetaPackage();
+    writeTestPackageConfig(meta: true);
     addTestSource('''
 import 'package:meta/meta.dart';
 
@@ -1075,7 +1075,7 @@
   }
 
   Future<void> test_Block_unimported() async {
-    addPackageFile('aaa', 'a.dart', 'class A {}');
+    newFile('$testPackageLibPath/a.dart', content: 'class A {}');
     addTestSource('main() { ^ }');
 
     await computeSuggestions();
diff --git a/pkg/analysis_server/test/services/completion/dart/uri_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/uri_contributor_test.dart
index cf86d79..e19ca34 100644
--- a/pkg/analysis_server/test/services/completion/dart/uri_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/uri_contributor_test.dart
@@ -5,6 +5,7 @@
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
 import 'package:analysis_server/src/services/completion/dart/uri_contributor.dart';
 import 'package:analyzer/file_system/memory_file_system.dart';
+import 'package:analyzer/src/test_utilities/package_config_file_builder.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 import 'package:path/path.dart';
 import 'package:test/test.dart';
@@ -21,6 +22,8 @@
 
 @reflectiveTest
 class UriContributorTest extends DartCompletionContributorTest {
+  String get testPackageTestPath => '$testPackageRootPath/test';
+
   @override
   DartCompletionContributor createContributor() {
     return UriContributor();
@@ -67,29 +70,24 @@
   }
 
   Future<void> test_export_package2() async {
-    addPackageFile('foo', 'foo.dart', 'library foo;');
-    addPackageFile('foo', 'baz/too.dart', 'library too;');
-    addPackageFile('bar', 'bar.dart', 'library bar;');
+    var fooRootPath = '$workspaceRootPath/foo';
+    var barRootPath = '$workspaceRootPath/bar';
+    newFile('$fooRootPath/lib/foo.dart', content: 'library foo;');
+    newFile('$fooRootPath/lib/baz/too.dart', content: 'library too;');
+    newFile('$barRootPath/lib/bar.dart', content: 'library bar;');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'foo', rootPath: fooRootPath)
+        ..add(name: 'bar', rootPath: barRootPath),
+    );
+
     addTestSource('export "package:foo/baz/^" import');
     await computeSuggestions();
     assertSuggest('package:foo/baz/too.dart',
         csKind: CompletionSuggestionKind.IMPORT);
   }
 
-  Future<void> test_export_package2_off() async {
-    try {
-      UriContributor.suggestFilePaths = false;
-      addPackageFile('foo', 'foo.dart', 'library foo;');
-      addPackageFile('foo', 'baz/too.dart', 'library too;');
-      addPackageFile('bar', 'bar.dart', 'library bar;');
-      addTestSource('export "package:foo/baz/^" import');
-      await computeSuggestions();
-      assertNotSuggested('package:foo/baz/too.dart');
-    } finally {
-      UriContributor.suggestFilePaths = true;
-    }
-  }
-
   Future<void> test_import() async {
     addTestSource('import "^"');
     await computeSuggestions();
@@ -142,10 +140,11 @@
   }
 
   Future<void> test_import_file() async {
-    testFile = convertPath('/proj/completion.dart');
-    addSource('/proj/other.dart', 'library other;');
-    addSource('/proj/foo/bar.dart', 'library bar;');
-    addSource('/blat.dart', 'library blat;');
+    testFile = convertPath('$testPackageRootPath/test.dart');
+    newFile('$testPackageRootPath/other.dart');
+    newFile('$testPackageRootPath/foo/bar.dart');
+    newFile('$workspaceRootPath/blat.dart');
+
     addTestSource('import "^" import');
     await computeSuggestions();
     expect(replacementOffset, completionOffset);
@@ -159,10 +158,11 @@
   }
 
   Future<void> test_import_file2() async {
-    testFile = convertPath('/proj/completion.dart');
-    addSource('/proj/other.dart', 'library other;');
-    addSource('/proj/foo/bar.dart', 'library bar;');
-    addSource('/blat.dart', 'library blat;');
+    testFile = convertPath('$testPackageRootPath/test.dart');
+    newFile('$testPackageRootPath/other.dart');
+    newFile('$testPackageRootPath/foo/bar.dart');
+    newFile('$workspaceRootPath/blat.dart');
+
     addTestSource('import "..^" import');
     await computeSuggestions();
     expect(replacementOffset, completionOffset - 2);
@@ -175,33 +175,12 @@
     assertNotSuggested('../blat.dart');
   }
 
-  Future<void> test_import_file2_off() async {
-    try {
-      UriContributor.suggestFilePaths = false;
-      testFile = convertPath('/proj/completion.dart');
-      addSource('/proj/other.dart', 'library other;');
-      addSource('/proj/foo/bar.dart', 'library bar;');
-      addSource('/blat.dart', 'library blat;');
-      addTestSource('import "..^" import');
-      await computeSuggestions();
-      expect(replacementOffset, completionOffset - 2);
-      expect(replacementLength, 2);
-      assertNotSuggested('completion.dart');
-      assertNotSuggested('other.dart');
-      assertNotSuggested('foo');
-      assertNotSuggested('foo/');
-      assertNotSuggested('foo/bar.dart');
-      assertNotSuggested('../blat.dart');
-    } finally {
-      UriContributor.suggestFilePaths = true;
-    }
-  }
-
   Future<void> test_import_file_child() async {
-    testFile = convertPath('/proj/completion.dart');
-    addSource('/proj/other.dart', 'library other;');
-    addSource('/proj/foo/bar.dart', 'library bar;');
-    addSource('/blat.dart', 'library blat;');
+    testFile = convertPath('$testPackageRootPath/test.dart');
+    newFile('$testPackageRootPath/other.dart');
+    newFile('$testPackageRootPath/foo/bar.dart');
+    newFile('$workspaceRootPath/blat.dart');
+
     addTestSource('import "foo/^" import');
     await computeSuggestions();
     expect(replacementOffset, completionOffset - 4);
@@ -215,11 +194,11 @@
   }
 
   Future<void> test_import_file_outside_lib() async {
-    testFile = convertPath('/proj/lib/completion.dart');
-    addSource('/proj/lib/other.dart', 'library other;');
-    addSource('/proj/lib/foo/bar.dart', 'library bar;');
-    addSource('/proj/blat.dart', 'library blat;');
-    addSource('/proj/bin/boo.dart', 'library boo;');
+    newFile('$testPackageLibPath/other.dart');
+    newFile('$testPackageLibPath/foo/bar.dart');
+    newFile('$testPackageRootPath/blat.dart');
+    newFile('$testPackageRootPath/bin/boo.dart');
+
     addTestSource('import "../^" import');
     await computeSuggestions();
     expect(replacementOffset, completionOffset - 3);
@@ -235,11 +214,12 @@
   }
 
   Future<void> test_import_file_parent() async {
-    testFile = convertPath('/proj/completion.dart');
-    addSource('/proj/other.dart', 'library other;');
-    addSource('/proj/foo/bar.dart', 'library bar;');
-    addSource('/blat.dart', 'library blat;');
-    addSource('/proj2/boo.dart', 'library boo;');
+    testFile = convertPath('$testPackageRootPath/test.dart');
+    newFile('$testPackageRootPath/other.dart');
+    newFile('$testPackageRootPath/foo/bar.dart');
+    newFile('$workspaceRootPath/blat.dart');
+    newFile('$workspaceRootPath/aaa/boo.dart');
+
     addTestSource('import "../^" import');
     await computeSuggestions();
     expect(replacementOffset, completionOffset - 3);
@@ -250,14 +230,15 @@
     assertNotSuggested('foo/');
     assertNotSuggested('foo/bar.dart');
     assertSuggest('../blat.dart', csKind: CompletionSuggestionKind.IMPORT);
-    assertSuggest('../proj2/', csKind: CompletionSuggestionKind.IMPORT);
+    assertSuggest('../aaa/', csKind: CompletionSuggestionKind.IMPORT);
   }
 
   Future<void> test_import_file_parent2() async {
-    testFile = convertPath('/proj/completion.dart');
-    addSource('/proj/other.dart', 'library other;');
-    addSource('/proj/foo/bar.dart', 'library bar;');
-    addSource('/blat.dart', 'library blat;');
+    testFile = convertPath('$testPackageRootPath/test.dart');
+    newFile('$testPackageRootPath/other.dart');
+    newFile('$testPackageRootPath/foo/bar.dart');
+    newFile('$workspaceRootPath/blat.dart');
+
     addTestSource('import "../b^" import');
     await computeSuggestions();
     expect(replacementOffset, completionOffset - 4);
@@ -271,27 +252,37 @@
   }
 
   Future<void> test_import_no_dot_folders() async {
-    testFile = convertPath('/proj/completion.dart');
-    addSource('/proj/other.dart', 'library other;');
-    newFolder('/proj/.fooFolder');
+    testFile = convertPath('$testPackageRootPath/test.dart');
+    newFolder('$testPackageRootPath/.foo');
+
     addTestSource('import "package:^";');
     await computeSuggestions();
-    assertNotSuggested('.fooFolder/');
+    assertNotSuggested('.foo/');
   }
 
   Future<void> test_import_only_dart_files() async {
-    testFile = convertPath('/proj/completion.dart');
-    addSource('/proj/other.dart', 'library other;');
-    newFile('/proj/analysis_options.yaml', content: '# analysis options');
+    testFile = convertPath('$testPackageRootPath/test.dart');
+    newFile('$testPackageRootPath/other.dart');
+    newFile('$testPackageRootPath/analysis_options.yaml');
+
     addTestSource('import "package:^";');
     await computeSuggestions();
     assertNotSuggested('analysis_options.yaml');
   }
 
   Future<void> test_import_package() async {
-    addPackageFile('foo', 'foo.dart', 'library foo;');
-    addPackageFile('foo', 'baz/too.dart', 'library too;');
-    addPackageFile('bar', 'bar.dart', 'library bar;');
+    var fooRootPath = '$workspaceRootPath/foo';
+    var barRootPath = '$workspaceRootPath/bar';
+    newFile('$fooRootPath/lib/foo.dart');
+    newFile('$fooRootPath/lib/baz/too.dart');
+    newFile('$barRootPath/lib/bar.dart');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'foo', rootPath: fooRootPath)
+        ..add(name: 'bar', rootPath: barRootPath),
+    );
+
     addTestSource('import "p^" import');
     await computeSuggestions();
     expect(replacementOffset, completionOffset - 1);
@@ -308,33 +299,37 @@
   }
 
   Future<void> test_import_package2() async {
-    addPackageFile('foo', 'foo.dart', 'library foo;');
-    addPackageFile('foo', 'baz/too.dart', 'library too;');
-    addPackageFile('bar', 'bar.dart', 'library bar;');
+    var fooRootPath = '$workspaceRootPath/foo';
+    var barRootPath = '$workspaceRootPath/bar';
+    newFile('$fooRootPath/lib/foo.dart');
+    newFile('$fooRootPath/lib/baz/too.dart');
+    newFile('$barRootPath/lib/bar.dart');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'foo', rootPath: fooRootPath)
+        ..add(name: 'bar', rootPath: barRootPath),
+    );
+
     addTestSource('import "package:foo/baz/^" import');
     await computeSuggestions();
     assertSuggest('package:foo/baz/too.dart',
         csKind: CompletionSuggestionKind.IMPORT);
   }
 
-  Future<void> test_import_package2_off() async {
-    try {
-      UriContributor.suggestFilePaths = false;
-      addPackageFile('foo', 'foo.dart', 'library foo;');
-      addPackageFile('foo', 'baz/too.dart', 'library too;');
-      addPackageFile('bar', 'bar.dart', 'library bar;');
-      addTestSource('import "package:foo/baz/^" import');
-      await computeSuggestions();
-      assertNotSuggested('package:foo/baz/too.dart');
-    } finally {
-      UriContributor.suggestFilePaths = true;
-    }
-  }
-
   Future<void> test_import_package2_raw() async {
-    addPackageFile('foo', 'foo.dart', 'library foo;');
-    addPackageFile('foo', 'baz/too.dart', 'library too;');
-    addPackageFile('bar', 'bar.dart', 'library bar;');
+    var fooRootPath = '$workspaceRootPath/foo';
+    var barRootPath = '$workspaceRootPath/bar';
+    newFile('$fooRootPath/lib/foo.dart');
+    newFile('$fooRootPath/lib/baz/too.dart');
+    newFile('$barRootPath/lib/bar.dart');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'foo', rootPath: fooRootPath)
+        ..add(name: 'bar', rootPath: barRootPath),
+    );
+
     addTestSource('import r"package:foo/baz/^" import');
     await computeSuggestions();
     assertSuggest('package:foo/baz/too.dart',
@@ -342,9 +337,18 @@
   }
 
   Future<void> test_import_package2_with_trailing() async {
-    addPackageFile('foo', 'foo.dart', 'library foo;');
-    addPackageFile('foo', 'baz/too.dart', 'library too;');
-    addPackageFile('bar', 'bar.dart', 'library bar;');
+    var fooRootPath = '$workspaceRootPath/foo';
+    var barRootPath = '$workspaceRootPath/bar';
+    newFile('$fooRootPath/lib/foo.dart');
+    newFile('$fooRootPath/lib/baz/too.dart');
+    newFile('$barRootPath/lib/bar.dart');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'foo', rootPath: fooRootPath)
+        ..add(name: 'bar', rootPath: barRootPath),
+    );
+
     addTestSource('import "package:foo/baz/^.dart" import');
     await computeSuggestions();
     assertSuggest('package:foo/baz/too.dart',
@@ -354,8 +358,12 @@
   }
 
   Future<void> test_import_package_missing_lib() async {
-    var pkgFile = addPackageFile('bar', 'bar.dart', 'library bar;');
-    deleteFolder(pkgFile.parent.path);
+    var barRootPath = '$workspaceRootPath/bar';
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'bar', rootPath: barRootPath),
+    );
+
     addTestSource('import "p^" class');
     await computeSuggestions();
     expect(replacementOffset, completionOffset - 1);
@@ -366,9 +374,18 @@
   }
 
   Future<void> test_import_package_raw() async {
-    addPackageFile('foo', 'foo.dart', 'library foo;');
-    addPackageFile('foo', 'baz/too.dart', 'library too;');
-    addPackageFile('bar', 'bar.dart', 'library bar;');
+    var fooRootPath = '$workspaceRootPath/foo';
+    var barRootPath = '$workspaceRootPath/bar';
+    newFile('$fooRootPath/lib/foo.dart');
+    newFile('$fooRootPath/lib/baz/too.dart');
+    newFile('$barRootPath/lib/bar.dart');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'foo', rootPath: fooRootPath)
+        ..add(name: 'bar', rootPath: barRootPath),
+    );
+
     addTestSource('import r"p^" import');
     await computeSuggestions();
     expect(replacementOffset, completionOffset - 1);
@@ -458,10 +475,11 @@
   }
 
   Future<void> test_part_file() async {
-    testFile = convertPath('/proj/completion.dart');
-    addSource('/proj/other.dart', 'library other;');
-    addSource('/proj/foo/bar.dart', 'library bar;');
-    addSource('/blat.dart', 'library blat;');
+    testFile = convertPath('$testPackageRootPath/test.dart');
+    newFile('$testPackageRootPath/other.dart');
+    newFile('$testPackageRootPath/foo/bar.dart');
+    newFile('$workspaceRootPath/blat.dart');
+
     addTestSource('library x; part "^" import');
     await computeSuggestions();
     expect(replacementOffset, completionOffset);
@@ -475,10 +493,11 @@
   }
 
   Future<void> test_part_file2() async {
-    testFile = convertPath('/proj/completion.dart');
-    addSource('/proj/other.dart', 'library other;');
-    addSource('/proj/foo/bar.dart', 'library bar;');
-    addSource('/blat.dart', 'library blat;');
+    testFile = convertPath('$testPackageRootPath/test.dart');
+    newFile('$testPackageRootPath/other.dart');
+    newFile('$testPackageRootPath/foo/bar.dart');
+    newFile('$workspaceRootPath/blat.dart');
+
     addTestSource('library x; part "..^" import');
     await computeSuggestions();
     expect(replacementOffset, completionOffset - 2);
@@ -492,10 +511,11 @@
   }
 
   Future<void> test_part_file_child() async {
-    testFile = convertPath('/proj/completion.dart');
-    addSource('/proj/other.dart', 'library other;');
-    addSource('/proj/foo/bar.dart', 'library bar;');
-    addSource('/blat.dart', 'library blat;');
+    testFile = convertPath('$testPackageRootPath/test.dart');
+    newFile('$testPackageRootPath/other.dart');
+    newFile('$testPackageRootPath/foo/bar.dart');
+    newFile('$workspaceRootPath/blat.dart');
+
     addTestSource('library x; part "foo/^" import');
     await computeSuggestions();
     expect(replacementOffset, completionOffset - 4);
@@ -509,10 +529,11 @@
   }
 
   Future<void> test_part_file_parent() async {
-    testFile = convertPath('/proj/completion.dart');
-    addSource('/proj/other.dart', 'library other;');
-    addSource('/proj/foo/bar.dart', 'library bar;');
-    addSource('/blat.dart', 'library blat;');
+    testFile = convertPath('$testPackageRootPath/test.dart');
+    newFile('$testPackageRootPath/other.dart');
+    newFile('$testPackageRootPath/foo/bar.dart');
+    newFile('$workspaceRootPath/blat.dart');
+
     addTestSource('library x; part "../^" import');
     await computeSuggestions();
     expect(replacementOffset, completionOffset - 3);
@@ -539,10 +560,11 @@
   }
 
   Future<void> test_import_file() async {
-    testFile = convertPath('\\proj\\completion.dart');
-    addSource('\\proj\\other.dart', 'library other;');
-    addSource('\\proj\\foo\\bar.dart', 'library bar;');
-    addSource('\\blat.dart', 'library blat;');
+    testFile = convertPath('$testPackageRootPath/test.dart');
+    newFile('$testPackageRootPath/other.dart');
+    newFile('$testPackageRootPath/foo/bar.dart');
+    newFile('$workspaceRootPath/blat.dart');
+
     addTestSource('import "^" import');
     await computeSuggestions();
     expect(replacementOffset, completionOffset);
@@ -556,10 +578,11 @@
   }
 
   Future<void> test_import_file2() async {
-    testFile = convertPath('\\proj\\completion.dart');
-    addSource('\\proj\\other.dart', 'library other;');
-    addSource('\\proj\\foo\\bar.dart', 'library bar;');
-    addSource('\\blat.dart', 'library blat;');
+    testFile = convertPath('$testPackageRootPath/test.dart');
+    newFile('$testPackageRootPath/other.dart');
+    newFile('$testPackageRootPath/foo/bar.dart');
+    newFile('$workspaceRootPath/blat.dart');
+
     addTestSource('import "..^" import');
     await computeSuggestions();
     expect(replacementOffset, completionOffset - 2);
@@ -573,10 +596,11 @@
   }
 
   Future<void> test_import_file_child() async {
-    testFile = convertPath('\\proj\\completion.dart');
-    addSource('\\proj\\other.dart', 'library other;');
-    addSource('\\proj\\foo\\bar.dart', 'library bar;');
-    addSource('\\blat.dart', 'library blat;');
+    testFile = convertPath('$testPackageRootPath/test.dart');
+    newFile('$testPackageRootPath/other.dart');
+    newFile('$testPackageRootPath/foo/bar.dart');
+    newFile('$workspaceRootPath/blat.dart');
+
     addTestSource('import "foo/^" import');
     await computeSuggestions();
     expect(replacementOffset, completionOffset - 4);
@@ -590,10 +614,11 @@
   }
 
   Future<void> test_import_file_parent() async {
-    testFile = convertPath('\\proj\\completion.dart');
-    addSource('\\proj\\other.dart', 'library other;');
-    addSource('\\proj\\foo\\bar.dart', 'library bar;');
-    addSource('\\blat.dart', 'library blat;');
+    testFile = convertPath('$testPackageRootPath/test.dart');
+    newFile('$testPackageRootPath/other.dart');
+    newFile('$testPackageRootPath/foo/bar.dart');
+    newFile('$workspaceRootPath/blat.dart');
+
     addTestSource('import "../^" import');
     await computeSuggestions();
     expect(replacementOffset, completionOffset - 3);
@@ -607,10 +632,11 @@
   }
 
   Future<void> test_import_file_parent2() async {
-    testFile = convertPath('\\proj\\completion.dart');
-    addSource('\\proj\\other.dart', 'library other;');
-    addSource('\\proj\\foo\\bar.dart', 'library bar;');
-    addSource('\\blat.dart', 'library blat;');
+    testFile = convertPath('$testPackageRootPath/test.dart');
+    newFile('$testPackageRootPath/other.dart');
+    newFile('$testPackageRootPath/foo/bar.dart');
+    newFile('$workspaceRootPath/blat.dart');
+
     addTestSource('import "../b^" import');
     await computeSuggestions();
     expect(replacementOffset, completionOffset - 4);
@@ -624,10 +650,11 @@
   }
 
   Future<void> test_part_file() async {
-    testFile = convertPath('\\proj\\completion.dart');
-    addSource('\\proj\\other.dart', 'library other;');
-    addSource('\\proj\\foo\\bar.dart', 'library bar;');
-    addSource('\\blat.dart', 'library blat;');
+    testFile = convertPath('$testPackageRootPath/test.dart');
+    newFile('$testPackageRootPath/other.dart');
+    newFile('$testPackageRootPath/foo/bar.dart');
+    newFile('$workspaceRootPath/blat.dart');
+
     addTestSource('library x; part "^" import');
     await computeSuggestions();
     expect(replacementOffset, completionOffset);
@@ -641,10 +668,11 @@
   }
 
   Future<void> test_part_file2() async {
-    testFile = convertPath('\\proj\\completion.dart');
-    addSource('\\proj\\other.dart', 'library other;');
-    addSource('\\proj\\foo\\bar.dart', 'library bar;');
-    addSource('\\blat.dart', 'library blat;');
+    testFile = convertPath('$testPackageRootPath/test.dart');
+    newFile('$testPackageRootPath/other.dart');
+    newFile('$testPackageRootPath/foo/bar.dart');
+    newFile('$workspaceRootPath/blat.dart');
+
     addTestSource('library x; part "..^" import');
     await computeSuggestions();
     expect(replacementOffset, completionOffset - 2);
@@ -658,10 +686,11 @@
   }
 
   Future<void> test_part_file_child() async {
-    testFile = convertPath('\\proj\\completion.dart');
-    addSource('\\proj\\other.dart', 'library other;');
-    addSource('\\proj\\foo\\bar.dart', 'library bar;');
-    addSource('\\blat.dart', 'library blat;');
+    testFile = convertPath('$testPackageRootPath/test.dart');
+    newFile('$testPackageRootPath/other.dart');
+    newFile('$testPackageRootPath/foo/bar.dart');
+    newFile('$workspaceRootPath/blat.dart');
+
     addTestSource('library x; part "foo/^" import');
     await computeSuggestions();
     expect(replacementOffset, completionOffset - 4);
@@ -675,10 +704,11 @@
   }
 
   Future<void> test_part_file_parent() async {
-    testFile = convertPath('\\proj\\completion.dart');
-    addSource('\\proj\\other.dart', 'library other;');
-    addSource('\\proj\\foo\\bar.dart', 'library bar;');
-    addSource('\\blat.dart', 'library blat;');
+    testFile = convertPath('$testPackageRootPath/test.dart');
+    newFile('$testPackageRootPath/other.dart');
+    newFile('$testPackageRootPath/foo/bar.dart');
+    newFile('$workspaceRootPath/blat.dart');
+
     addTestSource('library x; part "../^" import');
     await computeSuggestions();
     expect(replacementOffset, completionOffset - 3);
diff --git a/pkg/analysis_server/test/services/completion/postfix/postfix_completion_test.dart b/pkg/analysis_server/test/services/completion/postfix/postfix_completion_test.dart
index 07d36a2..fe4bbb1 100644
--- a/pkg/analysis_server/test/services/completion/postfix/postfix_completion_test.dart
+++ b/pkg/analysis_server/test/services/completion/postfix/postfix_completion_test.dart
@@ -4,10 +4,10 @@
 
 import 'package:analysis_server/src/protocol_server.dart';
 import 'package:analysis_server/src/services/completion/postfix/postfix_completion.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import '../../../abstract_context.dart';
 import '../../../abstract_single_unit.dart';
 
 void main() {
@@ -76,7 +76,7 @@
     code = code.replaceFirst(key, '', offset);
 
     verifyNoTestUnitErrors = false;
-    await resolveTestUnit(code);
+    await resolveTestCode(code);
 
     var context = PostfixCompletionContext(testAnalysisResult, offset, key);
     processor = PostfixCompletionProcessor(context);
@@ -623,7 +623,7 @@
 }
 
 @reflectiveTest
-class _TryTest extends PostfixCompletionTest {
+class _TryTest extends PostfixCompletionTest with WithNullSafetyMixin {
   Future<void> test_try() async {
     await _prepareCompletion('.try', '''
 f() {
@@ -710,7 +710,6 @@
   }
 
   Future<void> test_tryonThrowStatement_nnbd() async {
-    createAnalysisOptionsFile(experiments: [EnableString.non_nullable]);
     await _prepareCompletion('.tryon', '''
 f() {
   throw 'error';.tryon
@@ -728,7 +727,6 @@
   }
 
   Future<void> test_tryonThrowStatement_nnbd_into_legacy() async {
-    createAnalysisOptionsFile(experiments: [EnableString.non_nullable]);
     newFile('/home/test/lib/a.dart', content: r'''
 String? x;
 ''');
@@ -753,7 +751,6 @@
   }
 
   Future<void> test_tryonThrowStatement_nnbd_into_legacy_nested() async {
-    createAnalysisOptionsFile(experiments: [EnableString.non_nullable]);
     newFile('/home/test/lib/a.dart', content: r'''
 List<String?> x;
 ''');
@@ -778,7 +775,6 @@
   }
 
   Future<void> test_tryonThrowStatement_nnbd_legacy() async {
-    createAnalysisOptionsFile(experiments: [EnableString.non_nullable]);
     newFile('/home/test/lib/a.dart', content: r'''
 // @dart = 2.8
 String x;
@@ -802,7 +798,6 @@
   }
 
   Future<void> test_tryonThrowStatement_nnbd_legacy_nested() async {
-    createAnalysisOptionsFile(experiments: [EnableString.non_nullable]);
     newFile('/home/test/lib/a.dart', content: r'''
 // @dart = 2.8
 List<String> x;
@@ -826,7 +821,6 @@
   }
 
   Future<void> test_tryonThrowStatement_nnbd_nullable() async {
-    createAnalysisOptionsFile(experiments: [EnableString.non_nullable]);
     await _prepareCompletion('.tryon', '''
 f() {
   String? x;
@@ -846,7 +840,6 @@
   }
 
   Future<void> test_tryonThrowStatement_nnbd_nullable_nested() async {
-    createAnalysisOptionsFile(experiments: [EnableString.non_nullable]);
     await _prepareCompletion('.tryon', '''
 f() {
   List<String?>? x;
diff --git a/pkg/analysis_server/test/services/completion/statement/statement_completion_test.dart b/pkg/analysis_server/test/services/completion/statement/statement_completion_test.dart
index 11cbc6b..47f0b08 100644
--- a/pkg/analysis_server/test/services/completion/statement/statement_completion_test.dart
+++ b/pkg/analysis_server/test/services/completion/statement/statement_completion_test.dart
@@ -61,7 +61,6 @@
   }
 
   Future<void> _computeCompletion(int offset) async {
-    driver.changeFile(testFile);
     var result = await session.getResolvedUnit(testFile);
     var context = StatementCompletionContext(result, offset);
     var processor = StatementCompletionProcessor(context);
@@ -81,7 +80,7 @@
 
   Future<void> _prepareCompletionAt(int offset, String sourceCode) async {
     verifyNoTestUnitErrors = false;
-    await resolveTestUnit(sourceCode);
+    await resolveTestCode(sourceCode);
     await _computeCompletion(offset);
   }
 }
diff --git a/pkg/analysis_server/test/services/correction/name_suggestion_test.dart b/pkg/analysis_server/test/services/correction/name_suggestion_test.dart
index c758f82..07e8f81 100644
--- a/pkg/analysis_server/test/services/correction/name_suggestion_test.dart
+++ b/pkg/analysis_server/test/services/correction/name_suggestion_test.dart
@@ -18,7 +18,7 @@
 @reflectiveTest
 class VariableNameSuggestionTest extends AbstractSingleUnitTest {
   Future<void> test_forExpression_cast() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   var sortedNodes;
   var res = sortedNodes as String;
@@ -31,7 +31,7 @@
   }
 
   Future<void> test_forExpression_expectedType() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class TreeNode {}
 main() {
   TreeNode node = null;
@@ -47,7 +47,7 @@
   }
 
   Future<void> test_forExpression_expectedType_double() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   double res = 0.0;
 }
@@ -67,7 +67,7 @@
   }
 
   Future<void> test_forExpression_expectedType_int() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   int res = 0;
 }
@@ -87,7 +87,7 @@
   }
 
   Future<void> test_forExpression_expectedType_String() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   String res = 'abc';
 }
@@ -102,7 +102,7 @@
   }
 
   Future<void> test_forExpression_inBuildMethod() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   void build() {
     List l = new List();
@@ -122,7 +122,7 @@
   }
 
   Future<void> test_forExpression_indexExpression_endsWithE() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   var topNodes = [0, 1, 2];
   print(topNodes[0]);
@@ -136,7 +136,7 @@
 
   Future<void> test_forExpression_instanceCreation() async {
     verifyNoTestUnitErrors = false;
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'dart:math' as p;
 main(p) {
   new NoSuchClass();
@@ -164,7 +164,7 @@
   }
 
   Future<void> test_forExpression_invocationArgument_named() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 foo({a, b, c}) {}
 main() {
   foo(a: 111, c: 333, b: 222);
@@ -189,7 +189,7 @@
   }
 
   Future<void> test_forExpression_invocationArgument_optional() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 foo(a, [b = 2, c = 3]) {}
 main() {
   foo(111, 222, 333);
@@ -214,7 +214,7 @@
   }
 
   Future<void> test_forExpression_invocationArgument_positional() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 foo(a, b) {}
 main() {
   foo(111, 222);
@@ -234,7 +234,7 @@
   }
 
   Future<void> test_forExpression_methodInvocation() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main(p) {
   var res = p.getSortedNodes();
 }
@@ -246,7 +246,7 @@
   }
 
   Future<void> test_forExpression_methodInvocation_noPrefix() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main(p) {
   var res = p.sortedNodes();
 }
@@ -258,7 +258,7 @@
   }
 
   Future<void> test_forExpression_name_get() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main(p) {
   var res = p.get();
 }
@@ -270,7 +270,7 @@
   }
 
   Future<void> test_forExpression_prefixedIdentifier() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main(p) {
   var res = p.sortedNodes;
 }
@@ -285,7 +285,7 @@
   }
 
   Future<void> test_forExpression_privateName() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main(p) {
   p._name;
   p._computeSuffix();
@@ -307,7 +307,7 @@
   }
 
   Future<void> test_forExpression_propertyAccess() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main(p) {
   var res = p.q.sortedNodes;
 }
@@ -320,7 +320,7 @@
   }
 
   Future<void> test_forExpression_simpleName() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main(p) {
   var sortedNodes = null;
   var res = sortedNodes;
@@ -333,7 +333,7 @@
   }
 
   Future<void> test_forExpression_unqualifiedInvocation() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 getSortedNodes() => [];
 main(p) {
   var res = getSortedNodes();
diff --git a/pkg/analysis_server/test/services/correction/organize_directives_test.dart b/pkg/analysis_server/test/services/correction/organize_directives_test.dart
index 9315f3a..4b8aa22 100644
--- a/pkg/analysis_server/test/services/correction/organize_directives_test.dart
+++ b/pkg/analysis_server/test/services/correction/organize_directives_test.dart
@@ -581,7 +581,7 @@
 
   Future<void> _computeUnitAndErrors(String code) async {
     addTestSource(code);
-    var result = await session.getResolvedUnit(testSource.fullName);
+    var result = await session.getResolvedUnit(testFile);
     testUnit = result.unit;
     testErrors = result.errors;
   }
diff --git a/pkg/analysis_server/test/services/correction/sort_members_test.dart b/pkg/analysis_server/test/services/correction/sort_members_test.dart
index 4c50509..88cc25d 100644
--- a/pkg/analysis_server/test/services/correction/sort_members_test.dart
+++ b/pkg/analysis_server/test/services/correction/sort_members_test.dart
@@ -924,7 +924,7 @@
 
   Future<void> _parseTestUnit(String code) async {
     addTestSource(code);
-    var result = session.getParsedUnit(testSource.fullName);
+    var result = session.getParsedUnit(testFile);
     testUnit = result.unit;
   }
 }
diff --git a/pkg/analysis_server/test/services/correction/status_test.dart b/pkg/analysis_server/test/services/correction/status_test.dart
index 8e2582c..957e9cb 100644
--- a/pkg/analysis_server/test/services/correction/status_test.dart
+++ b/pkg/analysis_server/test/services/correction/status_test.dart
@@ -23,7 +23,7 @@
 @reflectiveTest
 class RefactoringLocationTest extends AbstractSingleUnitTest {
   Future<void> test_createLocation_forElement() async {
-    await resolveTestUnit('class MyClass {}');
+    await resolveTestCode('class MyClass {}');
     var element = findElement('MyClass');
     // check
     var location = newLocation_fromElement(element);
@@ -35,7 +35,7 @@
   }
 
   Future<void> test_createLocation_forMatch() async {
-    await resolveTestUnit('class MyClass {}');
+    await resolveTestCode('class MyClass {}');
     var element = findElement('MyClass');
     var sourceRange = range.elementName(element);
     SearchMatch match = SearchMatchImpl(
@@ -56,7 +56,7 @@
   }
 
   Future<void> test_createLocation_forNode() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
 }
 ''');
@@ -69,7 +69,7 @@
   }
 
   Future<void> test_createLocation_forUnit() async {
-    await resolveTestUnit('');
+    await resolveTestCode('');
     var sourceRange = SourceRange(10, 20);
     // check
     var location = newLocation_fromUnit(testUnit, sourceRange);
diff --git a/pkg/analysis_server/test/services/correction/util_test.dart b/pkg/analysis_server/test/services/correction/util_test.dart
index 530c5ea..ad29a506 100644
--- a/pkg/analysis_server/test/services/correction/util_test.dart
+++ b/pkg/analysis_server/test/services/correction/util_test.dart
@@ -11,6 +11,7 @@
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../../abstract_single_unit.dart';
+import '../../src/services/correction/assist/assist_processor.dart';
 
 void main() {
   defineReflectiveSuite(() {
@@ -21,7 +22,7 @@
 @reflectiveTest
 class UtilTest extends AbstractSingleUnitTest {
   Future<void> assert_invertCondition(String expr, String expected) async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   int v1, v2, v3, v4, v5;
   bool b1, b2, b3, b4, b5;
@@ -36,10 +37,13 @@
     var condition = ifStatement.condition;
     var result = CorrectionUtils(testAnalysisResult).invertCondition(condition);
     expect(result, expected);
+    // For compactness we put multiple cases into one test method.
+    // Prepare for resolving the test file one again.
+    changeFile(testFile);
   }
 
   Future<void> test_addLibraryImports_dart_hasImports_between() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'dart:async';
 import 'dart:math';
 ''');
@@ -52,7 +56,7 @@
   }
 
   Future<void> test_addLibraryImports_dart_hasImports_first() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'dart:collection';
 import 'dart:math';
 ''');
@@ -65,7 +69,7 @@
   }
 
   Future<void> test_addLibraryImports_dart_hasImports_last() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'dart:async';
 import 'dart:collection';
 ''');
@@ -78,7 +82,7 @@
   }
 
   Future<void> test_addLibraryImports_dart_hasImports_multiple() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'dart:collection';
 import 'dart:math';
 ''');
@@ -93,7 +97,7 @@
   }
 
   Future<void> test_addLibraryImports_dart_hasImports_multiple_first() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'dart:html';
 import 'dart:math';
 ''');
@@ -108,7 +112,7 @@
   }
 
   Future<void> test_addLibraryImports_dart_hasImports_multiple_last() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'dart:async';
 import 'dart:collection';
 ''');
@@ -123,7 +127,7 @@
   }
 
   Future<void> test_addLibraryImports_dart_hasLibraryDirective() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 library test;
 
 class A {}
@@ -141,7 +145,7 @@
   }
 
   Future<void> test_addLibraryImports_dart_noDirectives_hasComment() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 /// Comment.
 
 class A {}
@@ -159,7 +163,7 @@
   }
 
   Future<void> test_addLibraryImports_dart_noDirectives_hasShebang() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 #!/bin/dart
 
 class A {}
@@ -177,7 +181,7 @@
   }
 
   Future<void> test_addLibraryImports_dart_noDirectives_noShebang() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {}
 ''');
     var newLibrary1 = _getDartSource('dart:math');
@@ -192,8 +196,16 @@
 
   Future<void>
       test_addLibraryImports_package_hasDart_hasPackages_insertAfter() async {
-    addPackageFile('aaa', 'aaa.dart', '');
-    await resolveTestUnit('''
+    newFile('$workspaceRootPath/aaa/lib/aaa.dart');
+    newFile('$workspaceRootPath/bbb/lib/bbb.dart');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'aaa', rootPath: '$workspaceRootPath/aaa')
+        ..add(name: 'bbb', rootPath: '$workspaceRootPath/bbb'),
+    );
+
+    await resolveTestCode('''
 import 'dart:async';
 
 import 'package:aaa/aaa.dart';
@@ -209,8 +221,16 @@
 
   Future<void>
       test_addLibraryImports_package_hasDart_hasPackages_insertBefore() async {
-    addPackageFile('bbb', 'bbb.dart', '');
-    await resolveTestUnit('''
+    newFile('$workspaceRootPath/aaa/lib/aaa.dart');
+    newFile('$workspaceRootPath/bbb/lib/bbb.dart');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'aaa', rootPath: '$workspaceRootPath/aaa')
+        ..add(name: 'bbb', rootPath: '$workspaceRootPath/bbb'),
+    );
+
+    await resolveTestCode('''
 import 'dart:async';
 
 import 'package:bbb/bbb.dart';
@@ -225,9 +245,20 @@
   }
 
   Future<void> test_addLibraryImports_package_hasImports_between() async {
-    addPackageFile('aaa', 'aaa.dart', '');
-    addPackageFile('ddd', 'ddd.dart', '');
-    await resolveTestUnit('''
+    newFile('$workspaceRootPath/aaa/lib/aaa.dart');
+    newFile('$workspaceRootPath/bbb/lib/bbb.dart');
+    newFile('$workspaceRootPath/ccc/lib/ccc.dart');
+    newFile('$workspaceRootPath/ddd/lib/ddd.dart');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'aaa', rootPath: '$workspaceRootPath/aaa')
+        ..add(name: 'bbb', rootPath: '$workspaceRootPath/bbb')
+        ..add(name: 'ccc', rootPath: '$workspaceRootPath/ccc')
+        ..add(name: 'ddd', rootPath: '$workspaceRootPath/ddd'),
+    );
+
+    await resolveTestCode('''
 import 'package:aaa/aaa.dart';
 import 'package:ddd/ddd.dart';
 ''');
diff --git a/pkg/analysis_server/test/services/refactoring/abstract_refactoring.dart b/pkg/analysis_server/test/services/refactoring/abstract_refactoring.dart
index 9f40c52..2338885 100644
--- a/pkg/analysis_server/test/services/refactoring/abstract_refactoring.dart
+++ b/pkg/analysis_server/test/services/refactoring/abstract_refactoring.dart
@@ -128,7 +128,7 @@
   }
 
   Future<void> indexTestUnit(String code) async {
-    await resolveTestUnit(code);
+    await resolveTestCode(code);
   }
 
   Future<void> indexUnit(String file, String code) async {
@@ -136,10 +136,12 @@
   }
 
   @override
-  void setUp() {
-    super.setUp();
+  void verifyCreatedCollection() {
+    super.verifyCreatedCollection();
     // TODO(dantup): Get these tests passing with either line ending and change this to true.
     useLineEndingsForPlatform = false;
-    searchEngine = SearchEngineImpl([driver]);
+    searchEngine = SearchEngineImpl([
+      driverFor(testPackageRootPath),
+    ]);
   }
 }
diff --git a/pkg/analysis_server/test/services/refactoring/abstract_rename.dart b/pkg/analysis_server/test/services/refactoring/abstract_rename.dart
index d1bf07c..7de0635 100644
--- a/pkg/analysis_server/test/services/refactoring/abstract_rename.dart
+++ b/pkg/analysis_server/test/services/refactoring/abstract_rename.dart
@@ -6,11 +6,14 @@
 import 'package:analysis_server/src/services/refactoring/refactoring.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/src/dart/ast/extensions.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart' hide Element;
 import 'package:test/test.dart';
 
 import 'abstract_refactoring.dart';
 
+export 'package:analyzer/src/test_utilities/package_config_file_builder.dart';
+
 /// The base class for all [RenameRefactoring] tests.
 class RenameRefactoringTest extends RefactoringTest {
   @override
@@ -38,7 +41,7 @@
   /// the [SimpleIdentifier] at the given [search] pattern.
   void createRenameRefactoringAtString(String search) {
     var identifier = findIdentifier(search);
-    var element = identifier.staticElement;
+    var element = identifier.writeOrReadElement;
     if (element is PrefixElement) {
       element = getImportElement(identifier);
     }
@@ -48,7 +51,10 @@
   /// Creates a new [RenameRefactoring] in [refactoring] for [element].
   /// Fails if no [RenameRefactoring] can be created.
   void createRenameRefactoringForElement(Element element) {
-    var workspace = RefactoringWorkspace([driver], searchEngine);
+    var workspace = RefactoringWorkspace(
+      [driverFor(testFile)],
+      searchEngine,
+    );
     refactoring = RenameRefactoring(workspace, testAnalysisResult, element);
     expect(refactoring, isNotNull, reason: "No refactoring for '$element'.");
   }
diff --git a/pkg/analysis_server/test/services/refactoring/extract_widget_test.dart b/pkg/analysis_server/test/services/refactoring/extract_widget_test.dart
index 8c1da18..be25023 100644
--- a/pkg/analysis_server/test/services/refactoring/extract_widget_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/extract_widget_test.dart
@@ -21,8 +21,15 @@
   @override
   ExtractWidgetRefactoringImpl refactoring;
 
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(
+      flutter: true,
+    );
+  }
+
   Future<void> test_checkAllConditions_selection() async {
-    addFlutterPackage();
     await indexTestUnit('''
 import 'package:flutter/material.dart';
 class C {}
@@ -34,7 +41,6 @@
   }
 
   Future<void> test_checkName() async {
-    addFlutterPackage();
     await indexTestUnit('''
 import 'package:flutter/material.dart';
 
@@ -65,7 +71,6 @@
   }
 
   Future<void> test_checkName_alreadyDeclared() async {
-    addFlutterPackage();
     await indexTestUnit('''
 import 'package:flutter/material.dart';
 
@@ -87,7 +92,6 @@
   }
 
   Future<void> test_expression() async {
-    addFlutterPackage();
     await indexTestUnit('''
 import 'package:flutter/material.dart';
 
@@ -146,7 +150,6 @@
   }
 
   Future<void> test_expression_localFunction() async {
-    addFlutterPackage();
     await indexTestUnit('''
 import 'package:flutter/material.dart';
 
@@ -193,7 +196,6 @@
   }
 
   Future<void> test_expression_onTypeName() async {
-    addFlutterPackage();
     await indexTestUnit('''
 import 'package:flutter/material.dart';
 
@@ -230,7 +232,6 @@
   }
 
   Future<void> test_expression_selection() async {
-    addFlutterPackage();
     await indexTestUnit('''
 import 'package:flutter/material.dart';
 
@@ -278,7 +279,6 @@
   }
 
   Future<void> test_expression_topFunction() async {
-    addFlutterPackage();
     await indexTestUnit('''
 import 'package:flutter/material.dart';
 
@@ -319,7 +319,6 @@
   }
 
   Future<void> test_invocation_enclosingClass() async {
-    addFlutterPackage();
     await indexTestUnit(r'''
 import 'package:flutter/material.dart';
 
@@ -344,7 +343,6 @@
   }
 
   Future<void> test_invocation_enclosingSuperClass() async {
-    addFlutterPackage();
     await indexTestUnit(r'''
 import 'package:flutter/material.dart';
 
@@ -371,7 +369,6 @@
   }
 
   Future<void> test_invocation_otherClass() async {
-    addFlutterPackage();
     await indexTestUnit(r'''
 import 'package:flutter/material.dart';
 
@@ -433,7 +430,6 @@
   }
 
   Future<void> test_method() async {
-    addFlutterPackage();
     await indexTestUnit('''
 import 'package:flutter/material.dart';
 
@@ -482,7 +478,6 @@
   }
 
   Future<void> test_method_parameters() async {
-    addFlutterPackage();
     await indexTestUnit(r'''
 import 'package:flutter/material.dart';
 
@@ -554,7 +549,6 @@
   }
 
   Future<void> test_method_parameters_named() async {
-    addFlutterPackage();
     await indexTestUnit(r'''
 import 'package:flutter/material.dart';
 
@@ -626,7 +620,6 @@
   }
 
   Future<void> test_parameters_field_read_enclosingClass() async {
-    addFlutterPackage();
     await indexTestUnit(r'''
 import 'package:flutter/material.dart';
 
@@ -670,7 +663,6 @@
   }
 
   Future<void> test_parameters_field_read_otherClass() async {
-    addFlutterPackage();
     await indexTestUnit(r'''
 import 'package:flutter/material.dart';
 
@@ -722,7 +714,6 @@
   }
 
   Future<void> test_parameters_field_read_topLevelVariable() async {
-    addFlutterPackage();
     await indexTestUnit(r'''
 import 'package:flutter/material.dart';
 
@@ -763,7 +754,6 @@
   }
 
   Future<void> test_parameters_field_write_enclosingClass() async {
-    addFlutterPackage();
     await indexTestUnit(r'''
 import 'package:flutter/material.dart';
 
@@ -788,7 +778,6 @@
   }
 
   Future<void> test_parameters_field_write_enclosingSuperClass() async {
-    addFlutterPackage();
     await indexTestUnit(r'''
 import 'package:flutter/material.dart';
 
@@ -815,7 +804,6 @@
   }
 
   Future<void> test_parameters_field_write_otherClass() async {
-    addFlutterPackage();
     await indexTestUnit(r'''
 import 'package:flutter/material.dart';
 
@@ -877,7 +865,6 @@
   }
 
   Future<void> test_parameters_key() async {
-    addFlutterPackage();
     await indexTestUnit(r'''
 import 'package:flutter/material.dart';
 
@@ -896,7 +883,6 @@
   }
 
   Future<void> test_parameters_local_read_enclosingScope() async {
-    addFlutterPackage();
     await indexTestUnit(r'''
 import 'package:flutter/material.dart';
 
@@ -938,7 +924,6 @@
   }
 
   Future<void> test_parameters_local_write_enclosingScope() async {
-    addFlutterPackage();
     await indexTestUnit(r'''
 import 'package:flutter/material.dart';
 
@@ -962,7 +947,6 @@
   }
 
   Future<void> test_parameters_private() async {
-    addFlutterPackage();
     await indexTestUnit(r'''
 import 'package:flutter/material.dart';
 
@@ -1006,7 +990,6 @@
   }
 
   Future<void> test_parameters_private_conflictWithPublic() async {
-    addFlutterPackage();
     await indexTestUnit(r'''
 import 'package:flutter/material.dart';
 
@@ -1054,7 +1037,6 @@
   }
 
   Future<void> test_parameters_readField_readLocal() async {
-    addFlutterPackage();
     await indexTestUnit(r'''
 import 'package:flutter/material.dart';
 
@@ -1112,7 +1094,6 @@
   }
 
   Future<void> test_refactoringName() async {
-    addFlutterPackage();
     await indexTestUnit('''
 import 'package:flutter/material.dart';
 
@@ -1128,7 +1109,6 @@
   }
 
   Future<void> test_statements() async {
-    addFlutterPackage();
     await indexTestUnit(r'''
 import 'package:flutter/material.dart';
 
@@ -1184,7 +1164,6 @@
   }
 
   Future<void> test_statements_BAD_emptySelection() async {
-    addFlutterPackage();
     await indexTestUnit(r'''
 import 'package:flutter/material.dart';
 
@@ -1200,7 +1179,6 @@
   }
 
   Future<void> test_statements_BAD_notReturnStatement() async {
-    addFlutterPackage();
     await indexTestUnit(r'''
 import 'package:flutter/material.dart';
 
diff --git a/pkg/analysis_server/test/services/refactoring/move_file_test.dart b/pkg/analysis_server/test/services/refactoring/move_file_test.dart
index 6fdbfda..fc03973 100644
--- a/pkg/analysis_server/test/services/refactoring/move_file_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/move_file_test.dart
@@ -30,7 +30,7 @@
     addSource(pathB, "import 'test.dart';");
     addSource(pathC, '');
     verifyNoTestUnitErrors = false;
-    await resolveTestUnit('''
+    await resolveTestCode('''
 library lib;
 import 'dart:math';
 import '22/c.dart';
@@ -38,6 +38,7 @@
 part 'a.dart';
 part '${toUriStr('/absolute/uri.dart')}';
 ''');
+    await analyzeTestPackageFiles();
     // perform refactoring
     _createRefactoring('/home/test/000/1111/22/new_name.dart');
     await _assertSuccessfulRefactoring();
@@ -59,6 +60,7 @@
     addTestSource(r'''
 import 'package:test/old_name.dart';
 ''');
+    await analyzeTestPackageFiles();
 
     // Since the file being refactored isn't the test source, we set the
     // testAnalysisResult manually here, the path is referenced through the
@@ -147,6 +149,7 @@
     addTestSource(r'''
 import 'package:test/111/old_name.dart';
 ''');
+    await analyzeTestPackageFiles();
 
     // Since the file being refactored isn't the test source, we set the
     // testAnalysisResult manually here, the path is referenced through the
@@ -166,6 +169,7 @@
     addTestSource(r'''
 import 'package:test/222/old_name.dart';
 ''');
+    await analyzeTestPackageFiles();
 
     // Since the file being refactored isn't the test source, we set the
     // testAnalysisResult manually here, the path is referenced through the
@@ -186,7 +190,8 @@
     addSource(pathA, '''
 import 'test.dart';
 ''');
-    await resolveTestUnit('');
+    await analyzeTestPackageFiles();
+    await resolveTestCode('');
 
     // perform refactoring
     _createRefactoring('/home/test/000/1111/22/new_name.dart');
@@ -204,7 +209,8 @@
     addSource(pathA, '''
 import 'sub/folder/test.dart';
 ''');
-    await resolveTestUnit('');
+    await analyzeTestPackageFiles();
+    await resolveTestCode('');
     // perform refactoring
     _createRefactoring('/home/test/000/new/folder/name/new_name.dart');
     await _assertSuccessfulRefactoring();
@@ -220,7 +226,8 @@
     addSource(pathA, '''
 import '22/test.dart';
 ''');
-    await resolveTestUnit('');
+    await analyzeTestPackageFiles();
+    await resolveTestCode('');
     // perform refactoring
     _createRefactoring('/home/test/000/1111/new_name.dart');
     await _assertSuccessfulRefactoring();
@@ -245,7 +252,7 @@
 library lib;
 part '1111/22/test.dart';
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 part of lib;
 ''');
     // perform refactoring
@@ -269,9 +276,11 @@
 library lib;
 part '22/test.dart';
 ''');
-    await resolveTestUnit('''
+    addTestSource('''
 part of lib;
 ''');
+    await analyzeTestPackageFiles();
+    await resolveTestFile();
     // perform refactoring
     _createRefactoring('/home/test/000/1111/22/new_name.dart');
     await _assertSuccessfulRefactoring();
@@ -328,9 +337,11 @@
 library lib;
 part '22/test.dart';
 ''');
-    await resolveTestUnit('''
+    addTestSource('''
 part of '../a.dart';
 ''');
+    await analyzeTestPackageFiles();
+    await resolveTestFile();
     // perform refactoring
     _createRefactoring('/home/test/000/1111/22/33/test.dart');
     await _assertSuccessfulRefactoring();
@@ -352,7 +363,7 @@
     addSource(pathA, '''
 part of 'test.dart';
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 part 'a.dart';
 ''');
     // perform refactoring
@@ -375,7 +386,7 @@
     addSource(pathA, '''
 part of 'test.dart';
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 part 'a.dart';
 ''');
     // perform refactoring
@@ -398,9 +409,11 @@
     addSource(pathA, '''
 part 'test.dart';
 ''');
-    await resolveTestUnit('''
+    addTestSource('''
 part of 'a.dart';
 ''');
+    await analyzeTestPackageFiles();
+    await resolveTestFile();
     // perform refactoring
     _createRefactoring('/home/test/000/1111/22/test.dart');
     await _assertSuccessfulRefactoring();
@@ -421,9 +434,11 @@
     addSource(pathA, '''
 part 'test.dart';
 ''');
-    await resolveTestUnit('''
+    addTestSource('''
 part of 'a.dart';
 ''');
+    await analyzeTestPackageFiles();
+    await resolveTestFile();
     // perform refactoring
     _createRefactoring('/home/test/000/1111/test2.dart');
     await _assertSuccessfulRefactoring();
@@ -449,10 +464,11 @@
   }
 
   void _createRefactoring(String newFile, {String oldFile}) {
-    var refactoringWorkspace = RefactoringWorkspace([driver], searchEngine);
+    var refactoringWorkspace =
+        RefactoringWorkspace([driverFor(testFile)], searchEngine);
     // Allow passing an oldName for when we don't want to rename testSource,
     // but otherwise fall back to testSource.fullname
-    oldFile = convertPath(oldFile ?? testSource.fullName);
+    oldFile = convertPath(oldFile ?? testFile);
     refactoring = MoveFileRefactoring(
         resourceProvider, refactoringWorkspace, testAnalysisResult, oldFile);
     refactoring.newFile = convertPath(newFile);
diff --git a/pkg/analysis_server/test/services/refactoring/rename_class_member_test.dart b/pkg/analysis_server/test/services/refactoring/rename_class_member_test.dart
index dec50cc..97731a6 100644
--- a/pkg/analysis_server/test/services/refactoring/rename_class_member_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/rename_class_member_test.dart
@@ -748,11 +748,18 @@
   }
 
   Future<void> test_createChange_MethodElement_potential_inPubCache() async {
-    var externalPath = addPackageFile('aaa', 'lib.dart', r'''
+    var externalPath = '/.pub-cache/aaa/lib/lib.dart';
+    newFile(externalPath, content: r'''
 processObj(p) {
   p.test();
 }
-''').path;
+''');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'aaa', rootPath: '/.pub-cache/aaa/'),
+    );
+
     await indexTestUnit('''
 import 'package:aaa/lib.dart';
 
@@ -821,7 +828,7 @@
   }
 
   Future<void> test_createChange_outsideOfProject_declarationInPackage() async {
-    addPackageFile('aaa', 'aaa.dart', r'''
+    newFile('$workspaceRootPath/aaa/lib/aaa.dart', content: r'''
 class A {
   void test() {}
 }
@@ -830,6 +837,12 @@
   a.test();
 }
 ''');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'aaa', rootPath: '$workspaceRootPath/aaa'),
+    );
+
     await indexTestUnit('''
 import 'package:aaa/aaa.dart';
 
diff --git a/pkg/analysis_server/test/services/refactoring/rename_constructor_test.dart b/pkg/analysis_server/test/services/refactoring/rename_constructor_test.dart
index bd45b2f..045a97a 100644
--- a/pkg/analysis_server/test/services/refactoring/rename_constructor_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/rename_constructor_test.dart
@@ -230,7 +230,7 @@
 
   Future<void> test_newInstance_nullElement() async {
     await indexTestUnit('');
-    var workspace = RefactoringWorkspace([driver], searchEngine);
+    var workspace = RefactoringWorkspace([driverFor(testFile)], searchEngine);
     var refactoring = RenameRefactoring(workspace, testAnalysisResult, null);
     expect(refactoring, isNull);
   }
diff --git a/pkg/analysis_server/test/services/refactoring/rename_local_test.dart b/pkg/analysis_server/test/services/refactoring/rename_local_test.dart
index b0d2aff..31993ea 100644
--- a/pkg/analysis_server/test/services/refactoring/rename_local_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/rename_local_test.dart
@@ -463,11 +463,9 @@
   new A(test: 2);
 }
 ''');
-    driver.addFile(a);
-    driver.addFile(b);
+    await analyzeTestPackageFiles();
 
-    var session = driver.currentSession;
-    testAnalysisResult = await session.getResolvedUnit(a);
+    testAnalysisResult = await resolveFile(a);
     testFile = testAnalysisResult.path;
     testCode = testAnalysisResult.content;
     testUnit = testAnalysisResult.unit;
diff --git a/pkg/analysis_server/test/services/refactoring/rename_unit_member_test.dart b/pkg/analysis_server/test/services/refactoring/rename_unit_member_test.dart
index 0e64120..ab7d05d 100644
--- a/pkg/analysis_server/test/services/refactoring/rename_unit_member_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/rename_unit_member_test.dart
@@ -236,11 +236,17 @@
   }
 
   Future<void> test_checkInitialConditions_outsideOfProject() async {
-    addPackageFile('aaa', 'lib.dart', r'''
+    newFile('$workspaceRootPath/aaa/lib/a.dart', content: r'''
 class A {}
 ''');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'aaa', rootPath: '$workspaceRootPath/aaa'),
+    );
+
     await indexTestUnit('''
-import "package:aaa/lib.dart";
+import "package:aaa/a.dart";
 main() {
   A a;
 }
@@ -374,7 +380,7 @@
   }
 
   Future<void> test_createChange_ClassElement_flutterWidget() async {
-    addFlutterPackage();
+    writeTestPackageConfig(flutter: true);
     await indexTestUnit('''
 import 'package:flutter/material.dart';
 
@@ -416,7 +422,7 @@
 
   Future<void>
       test_createChange_ClassElement_flutterWidget_privateBoth() async {
-    addFlutterPackage();
+    writeTestPackageConfig(flutter: true);
     await indexTestUnit('''
 import 'package:flutter/material.dart';
 
@@ -458,7 +464,7 @@
 
   Future<void>
       test_createChange_ClassElement_flutterWidget_privateState() async {
-    addFlutterPackage();
+    writeTestPackageConfig(flutter: true);
     await indexTestUnit('''
 import 'package:flutter/material.dart';
 
diff --git a/pkg/analysis_server/test/services/search/element_visitors_test.dart b/pkg/analysis_server/test/services/search/element_visitors_test.dart
index 11d8bc7..be601d3 100644
--- a/pkg/analysis_server/test/services/search/element_visitors_test.dart
+++ b/pkg/analysis_server/test/services/search/element_visitors_test.dart
@@ -18,7 +18,7 @@
 @reflectiveTest
 class FindElementByNameOffsetTest extends AbstractSingleUnitTest {
   Future<void> test_class() async {
-    await resolveTestUnit(r'''
+    await resolveTestCode(r'''
 class AAA {}
 class BBB {}
 ''');
@@ -27,7 +27,7 @@
   }
 
   Future<void> test_function() async {
-    await resolveTestUnit(r'''
+    await resolveTestCode(r'''
 void aaa() {}
 void bbb() {}
 ''');
@@ -36,7 +36,7 @@
   }
 
   Future<void> test_null() async {
-    await resolveTestUnit(r'''
+    await resolveTestCode(r'''
 class AAA {}
 class BBB {}
 ''');
@@ -50,7 +50,7 @@
   }
 
   Future<void> test_topLevelVariable() async {
-    await resolveTestUnit(r'''
+    await resolveTestCode(r'''
 int aaa, bbb;
 int ccc;
 ''');
diff --git a/pkg/analysis_server/test/services/search/hierarchy_test.dart b/pkg/analysis_server/test/services/search/hierarchy_test.dart
index b74fc20..4dbec50 100644
--- a/pkg/analysis_server/test/services/search/hierarchy_test.dart
+++ b/pkg/analysis_server/test/services/search/hierarchy_test.dart
@@ -23,7 +23,7 @@
   @override
   void setUp() {
     super.setUp();
-    searchEngine = SearchEngineImpl([driver]);
+    searchEngine = SearchEngineImpl([driverFor(testFile)]);
   }
 
   Future<void> test_getClassMembers() async {
@@ -479,6 +479,6 @@
   }
 
   Future<void> _indexTestUnit(String code) async {
-    await resolveTestUnit(code);
+    await resolveTestCode(code);
   }
 }
diff --git a/pkg/analysis_server/test/src/cider/cider_service.dart b/pkg/analysis_server/test/src/cider/cider_service.dart
index 2fe6e3a..ccc8b91 100644
--- a/pkg/analysis_server/test/src/cider/cider_service.dart
+++ b/pkg/analysis_server/test/src/cider/cider_service.dart
@@ -43,7 +43,6 @@
       (String path) => _getDigest(path),
       null,
       workspace: workspace,
-      libraryContextResetTimeout: null,
     );
     fileResolver.testView = FileResolverTestView();
   }
diff --git a/pkg/analysis_server/test/src/cider/completion_test.dart b/pkg/analysis_server/test/src/cider/completion_test.dart
index e6224a3..f37076b 100644
--- a/pkg/analysis_server/test/src/cider/completion_test.dart
+++ b/pkg/analysis_server/test/src/cider/completion_test.dart
@@ -30,11 +30,6 @@
   CiderCompletionResult _completionResult;
   List<CompletionSuggestion> _suggestions;
 
-  @override
-  void setUp() {
-    super.setUp();
-  }
-
   Future<void> test_compute() async {
     await _compute(r'''
 class A {}
@@ -335,6 +330,34 @@
     ]);
   }
 
+  Future<void> test_limitedResolution_class_constructor_body() async {
+    _configureToCheckNotResolved(
+      identifiers: {'print'},
+    );
+
+    await _compute(r'''
+class A<T> {
+  int f = 0;
+
+  A(int a) : f = 1 {
+    ^
+  }
+
+  void foo() {
+    print(0);
+  }
+}
+''');
+
+    _assertHasClass(text: 'A');
+    _assertHasClass(text: 'String');
+    _assertHasConstructor(text: 'A');
+    _assertHasFunction(text: 'print');
+    _assertHasMethod(text: 'foo');
+    _assertHasParameter(text: 'a');
+    _assertHasTypeParameter(text: 'T');
+  }
+
   Future<void> test_limitedResolution_class_field_startWithType() async {
     _configureToCheckNotResolved(
       identifiers: {'print'},
diff --git a/pkg/analysis_server/test/src/computer/import_elements_computer_test.dart b/pkg/analysis_server/test/src/computer/import_elements_computer_test.dart
index af893d6..8b0f30c 100644
--- a/pkg/analysis_server/test/src/computer/import_elements_computer_test.dart
+++ b/pkg/analysis_server/test/src/computer/import_elements_computer_test.dart
@@ -4,6 +4,7 @@
 
 import 'package:analysis_server/protocol/protocol_generated.dart';
 import 'package:analysis_server/src/computer/import_elements_computer.dart';
+import 'package:analyzer/src/test_utilities/package_config_file_builder.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -78,7 +79,13 @@
   }
 
   Future<void> test_createEdits_addImport_noPrefix() async {
-    var fooFile = addPackageFile('pkg', 'foo.dart', '');
+    var fooFile = newFile('$workspaceRootPath/pkg/lib/foo.dart');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'pkg', rootPath: '$workspaceRootPath/pkg'),
+    );
+
     await createBuilder('''
 import 'package:pkg/foo.dart' as foo;
 ''');
@@ -92,7 +99,13 @@
   }
 
   Future<void> test_createEdits_addImport_prefix() async {
-    var fooFile = addPackageFile('pkg', 'foo.dart', '');
+    var fooFile = newFile('$workspaceRootPath/pkg/lib/foo.dart');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'pkg', rootPath: '$workspaceRootPath/pkg'),
+    );
+
     await createBuilder('''
 import 'package:pkg/foo.dart';
 ''');
@@ -106,7 +119,13 @@
   }
 
   Future<void> test_createEdits_addShow_multipleNames() async {
-    var fooFile = addPackageFile('pkg', 'foo.dart', '');
+    var fooFile = newFile('$workspaceRootPath/pkg/lib/foo.dart');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'pkg', rootPath: '$workspaceRootPath/pkg'),
+    );
+
     await createBuilder('''
 import 'package:pkg/foo.dart' show B;
 import 'package:pkg/foo.dart' as foo;
@@ -121,7 +140,13 @@
   }
 
   Future<void> test_createEdits_addShow_removeHide() async {
-    var fooFile = addPackageFile('pkg', 'foo.dart', '');
+    var fooFile = newFile('$workspaceRootPath/pkg/lib/foo.dart');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'pkg', rootPath: '$workspaceRootPath/pkg'),
+    );
+
     await createBuilder('''
 import 'package:pkg/foo.dart' show A, B hide C, D;
 ''');
@@ -134,7 +159,13 @@
   }
 
   Future<void> test_createEdits_addShow_singleName_noPrefix() async {
-    var fooFile = addPackageFile('pkg', 'foo.dart', '');
+    var fooFile = newFile('$workspaceRootPath/pkg/lib/foo.dart');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'pkg', rootPath: '$workspaceRootPath/pkg'),
+    );
+
     await createBuilder('''
 import 'package:pkg/foo.dart' show B;
 ''');
@@ -147,7 +178,13 @@
   }
 
   Future<void> test_createEdits_addShow_singleName_prefix() async {
-    var fooFile = addPackageFile('pkg', 'foo.dart', '');
+    var fooFile = newFile('$workspaceRootPath/pkg/lib/foo.dart');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'pkg', rootPath: '$workspaceRootPath/pkg'),
+    );
+
     await createBuilder('''
 import 'package:pkg/foo.dart' show C;
 import 'package:pkg/foo.dart' as foo show B;
@@ -162,7 +199,13 @@
   }
 
   Future<void> test_createEdits_alreadyImported_noCombinators() async {
-    var fooFile = addPackageFile('pkg', 'foo.dart', '');
+    var fooFile = newFile('$workspaceRootPath/pkg/lib/foo.dart');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'pkg', rootPath: '$workspaceRootPath/pkg'),
+    );
+
     await createBuilder('''
 import 'package:pkg/foo.dart';
 ''');
@@ -173,7 +216,13 @@
   }
 
   Future<void> test_createEdits_alreadyImported_withPrefix() async {
-    var fooFile = addPackageFile('pkg', 'foo.dart', '');
+    var fooFile = newFile('$workspaceRootPath/pkg/lib/foo.dart');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'pkg', rootPath: '$workspaceRootPath/pkg'),
+    );
+
     await createBuilder('''
 import 'package:pkg/foo.dart' as foo;
 ''');
@@ -184,7 +233,13 @@
   }
 
   Future<void> test_createEdits_alreadyImported_withShow() async {
-    var fooFile = addPackageFile('pkg', 'foo.dart', '');
+    var fooFile = newFile('$workspaceRootPath/pkg/lib/foo.dart');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'pkg', rootPath: '$workspaceRootPath/pkg'),
+    );
+
     await createBuilder('''
 import 'package:pkg/foo.dart' show A;
 ''');
@@ -207,7 +262,13 @@
   }
 
   Future<void> test_createEdits_invalidUri() async {
-    var fooFile = addPackageFile('pkg', 'foo.dart', '');
+    var fooFile = newFile('$workspaceRootPath/pkg/lib/foo.dart');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'pkg', rootPath: '$workspaceRootPath/pkg'),
+    );
+
     await createBuilder('''
 import 'pakage:pkg/foo.dart';
 ''');
@@ -227,7 +288,13 @@
   }
 
   Future<void> test_createEdits_removeHide_firstInCombinator() async {
-    var fooFile = addPackageFile('pkg', 'foo.dart', '');
+    var fooFile = newFile('$workspaceRootPath/pkg/lib/foo.dart');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'pkg', rootPath: '$workspaceRootPath/pkg'),
+    );
+
     await createBuilder('''
 import 'package:pkg/foo.dart' hide A, B, C;
 ''');
@@ -240,7 +307,13 @@
   }
 
   Future<void> test_createEdits_removeHide_lastInCombinator() async {
-    var fooFile = addPackageFile('pkg', 'foo.dart', '');
+    var fooFile = newFile('$workspaceRootPath/pkg/lib/foo.dart');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'pkg', rootPath: '$workspaceRootPath/pkg'),
+    );
+
     await createBuilder('''
 import 'package:pkg/foo.dart' hide A, B, C;
 ''');
@@ -253,7 +326,13 @@
   }
 
   Future<void> test_createEdits_removeHide_middleInCombinator() async {
-    var fooFile = addPackageFile('pkg', 'foo.dart', '');
+    var fooFile = newFile('$workspaceRootPath/pkg/lib/foo.dart');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'pkg', rootPath: '$workspaceRootPath/pkg'),
+    );
+
     await createBuilder('''
 import 'package:pkg/foo.dart' hide A, B, C;
 ''');
@@ -266,7 +345,13 @@
   }
 
   Future<void> test_createEdits_removeHide_multipleCombinators() async {
-    var fooFile = addPackageFile('pkg', 'foo.dart', '');
+    var fooFile = newFile('$workspaceRootPath/pkg/lib/foo.dart');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'pkg', rootPath: '$workspaceRootPath/pkg'),
+    );
+
     await createBuilder('''
 import 'package:pkg/foo.dart' hide A, B, C hide A, B, C;
 ''');
@@ -279,7 +364,13 @@
   }
 
   Future<void> test_createEdits_removeHide_multipleNames() async {
-    var fooFile = addPackageFile('pkg', 'foo.dart', '');
+    var fooFile = newFile('$workspaceRootPath/pkg/lib/foo.dart');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'pkg', rootPath: '$workspaceRootPath/pkg'),
+    );
+
     await createBuilder('''
 import 'package:pkg/foo.dart' hide A, B, C hide D, E, F hide G, H, I;
 ''');
@@ -292,7 +383,13 @@
   }
 
   Future<void> test_createEdits_removeHideCombinator_first() async {
-    var fooFile = addPackageFile('pkg', 'foo.dart', '');
+    var fooFile = newFile('$workspaceRootPath/pkg/lib/foo.dart');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'pkg', rootPath: '$workspaceRootPath/pkg'),
+    );
+
     await createBuilder('''
 import 'package:pkg/foo.dart' hide A hide B hide C;
 ''');
@@ -305,7 +402,13 @@
   }
 
   Future<void> test_createEdits_removeHideCombinator_last() async {
-    var fooFile = addPackageFile('pkg', 'foo.dart', '');
+    var fooFile = newFile('$workspaceRootPath/pkg/lib/foo.dart');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'pkg', rootPath: '$workspaceRootPath/pkg'),
+    );
+
     await createBuilder('''
 import 'package:pkg/foo.dart' hide A hide B hide C;
 ''');
@@ -318,7 +421,13 @@
   }
 
   Future<void> test_createEdits_removeHideCombinator_middle() async {
-    var fooFile = addPackageFile('pkg', 'foo.dart', '');
+    var fooFile = newFile('$workspaceRootPath/pkg/lib/foo.dart');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'pkg', rootPath: '$workspaceRootPath/pkg'),
+    );
+
     await createBuilder('''
 import 'package:pkg/foo.dart' hide A hide B hide C;
 ''');
@@ -331,7 +440,13 @@
   }
 
   Future<void> test_createEdits_removeHideCombinator_only() async {
-    var fooFile = addPackageFile('pkg', 'foo.dart', '');
+    var fooFile = newFile('$workspaceRootPath/pkg/lib/foo.dart');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'pkg', rootPath: '$workspaceRootPath/pkg'),
+    );
+
     await createBuilder('''
 import 'package:pkg/foo.dart' hide A;
 ''');
@@ -344,7 +459,13 @@
   }
 
   Future<void> test_createEdits_removeHideCombinator_only_multiple() async {
-    var fooFile = addPackageFile('pkg', 'foo.dart', '');
+    var fooFile = newFile('$workspaceRootPath/pkg/lib/foo.dart');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'pkg', rootPath: '$workspaceRootPath/pkg'),
+    );
+
     await createBuilder('''
 import 'package:pkg/foo.dart' hide A, B;
 ''');
diff --git a/pkg/analysis_server/test/src/computer/imported_elements_computer_test.dart b/pkg/analysis_server/test/src/computer/imported_elements_computer_test.dart
index a00364a..171d627 100644
--- a/pkg/analysis_server/test/src/computer/imported_elements_computer_test.dart
+++ b/pkg/analysis_server/test/src/computer/imported_elements_computer_test.dart
@@ -8,6 +8,7 @@
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../../abstract_context.dart';
+import '../../services/refactoring/abstract_rename.dart';
 
 void main() {
   defineReflectiveSuite(() {
@@ -220,7 +221,8 @@
   }
 
   Future<void> test_package_multipleInSame() async {
-    addPackageFile('foo', 'foo.dart', '''
+    var fooPath = '$workspaceRootPath/foo/lib/foo.dart';
+    newFile(fooPath, content: '''
 class A {
   static String a = '';
 }
@@ -228,6 +230,12 @@
   static String b = '';
 }
 ''');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'foo', rootPath: '$workspaceRootPath/foo'),
+    );
+
     var selection = 'A.a + B.b';
     var content = '''
 import 'package:foo/foo.dart';
@@ -237,16 +245,23 @@
 ''';
     await _computeElements(content, selection);
     assertElements([
-      ImportedElements('/.pub-cache/foo/lib/foo.dart', '', ['A', 'B']),
+      ImportedElements(fooPath, '', ['A', 'B']),
     ]);
   }
 
   Future<void> test_package_noPrefix() async {
-    addPackageFile('foo', 'foo.dart', '''
+    var fooPath = '$workspaceRootPath/foo/lib/foo.dart';
+    newFile(fooPath, content: '''
 class Foo {
   static String first = '';
 }
 ''');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'foo', rootPath: '$workspaceRootPath/foo'),
+    );
+
     var selection = 'Foo.first';
     var content = '''
 import 'package:foo/foo.dart';
@@ -256,16 +271,23 @@
 ''';
     await _computeElements(content, selection);
     assertElements([
-      ImportedElements('/.pub-cache/foo/lib/foo.dart', '', ['Foo']),
+      ImportedElements(fooPath, '', ['Foo']),
     ]);
   }
 
   Future<void> test_package_prefix_selected_class() async {
-    addPackageFile('foo', 'foo.dart', '''
+    var fooPath = '$workspaceRootPath/foo/lib/foo.dart';
+    newFile(fooPath, content: '''
 class Foo {
   static String first = '';
 }
 ''');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'foo', rootPath: '$workspaceRootPath/foo'),
+    );
+
     var selection = 'f.Foo.first';
     var content = '''
 import 'package:foo/foo.dart' as f;
@@ -275,14 +297,21 @@
 ''';
     await _computeElements(content, selection);
     assertElements([
-      ImportedElements('/.pub-cache/foo/lib/foo.dart', 'f', ['Foo']),
+      ImportedElements(fooPath, 'f', ['Foo']),
     ]);
   }
 
   Future<void> test_package_prefix_selected_function() async {
-    addPackageFile('foo', 'foo.dart', '''
+    var fooPath = '$workspaceRootPath/foo/lib/foo.dart';
+    newFile(fooPath, content: '''
 String foo() => '';
 ''');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'foo', rootPath: '$workspaceRootPath/foo'),
+    );
+
     var selection = 'f.foo()';
     var content = '''
 import 'package:foo/foo.dart' as f;
@@ -292,14 +321,21 @@
 ''';
     await _computeElements(content, selection);
     assertElements([
-      ImportedElements('/.pub-cache/foo/lib/foo.dart', 'f', ['foo']),
+      ImportedElements(fooPath, 'f', ['foo']),
     ]);
   }
 
   Future<void> test_package_prefix_selected_getter() async {
-    addPackageFile('foo', 'foo.dart', '''
+    var fooPath = '$workspaceRootPath/foo/lib/foo.dart';
+    newFile(fooPath, content: '''
 String foo = '';
 ''');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'foo', rootPath: '$workspaceRootPath/foo'),
+    );
+
     var selection = 'f.foo';
     var content = '''
 import 'package:foo/foo.dart' as f;
@@ -309,14 +345,21 @@
 ''';
     await _computeElements(content, selection);
     assertElements([
-      ImportedElements('/.pub-cache/foo/lib/foo.dart', 'f', ['foo']),
+      ImportedElements(fooPath, 'f', ['foo']),
     ]);
   }
 
   Future<void> test_package_prefix_selected_setter() async {
-    addPackageFile('foo', 'foo.dart', '''
+    var fooPath = '$workspaceRootPath/foo/lib/foo.dart';
+    newFile(fooPath, content: '''
 String foo = '';
 ''');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'foo', rootPath: '$workspaceRootPath/foo'),
+    );
+
     var selection = 'f.foo';
     var content = '''
 import 'package:foo/foo.dart' as f;
@@ -326,16 +369,23 @@
 ''';
     await _computeElements(content, selection);
     assertElements([
-      ImportedElements('/.pub-cache/foo/lib/foo.dart', 'f', ['foo=']),
+      ImportedElements(fooPath, 'f', ['foo=']),
     ]);
   }
 
   Future<void> test_package_prefix_unselected() async {
-    addPackageFile('foo', 'foo.dart', '''
+    var fooPath = '$workspaceRootPath/foo/lib/foo.dart';
+    newFile(fooPath, content: '''
 class Foo {
   static String first = '';
 }
 ''');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'foo', rootPath: '$workspaceRootPath/foo'),
+    );
+
     var selection = 'Foo.first';
     var content = '''
 import 'package:foo/foo.dart' as f;
@@ -345,17 +395,24 @@
 ''';
     await _computeElements(content, selection);
     assertElements([
-      ImportedElements('/.pub-cache/foo/lib/foo.dart', '', ['Foo']),
+      ImportedElements(fooPath, '', ['Foo']),
     ]);
   }
 
   Future<void> test_package_prefixedAndNot() async {
-    addPackageFile('foo', 'foo.dart', '''
+    var fooPath = '$workspaceRootPath/foo/lib/foo.dart';
+    newFile(fooPath, content: '''
 class Foo {
   static String first = '';
   static String second = '';
 }
 ''');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'foo', rootPath: '$workspaceRootPath/foo'),
+    );
+
     var selection = 'f.Foo.first + Foo.second';
     var content = '''
 import 'package:foo/foo.dart';
@@ -366,8 +423,8 @@
 ''';
     await _computeElements(content, selection);
     assertElements([
-      ImportedElements('/.pub-cache/foo/lib/foo.dart', '', ['Foo']),
-      ImportedElements('/.pub-cache/foo/lib/foo.dart', 'f', ['Foo']),
+      ImportedElements(fooPath, '', ['Foo']),
+      ImportedElements(fooPath, 'f', ['Foo']),
     ]);
   }
 
diff --git a/pkg/analysis_server/test/src/computer/outline_computer_test.dart b/pkg/analysis_server/test/src/computer/outline_computer_test.dart
index 9f38295..6bdeff5 100644
--- a/pkg/analysis_server/test/src/computer/outline_computer_test.dart
+++ b/pkg/analysis_server/test/src/computer/outline_computer_test.dart
@@ -43,7 +43,7 @@
   @override
   void setUp() {
     super.setUp();
-    addFlutterPackage();
+    writeTestPackageConfig(flutter: true);
   }
 
   Future<void> test_columnWithChildren() async {
@@ -671,7 +671,7 @@
   }
 
   Future<void> test_isTest_isTestGroup() async {
-    addMetaPackage();
+    writeTestPackageConfig(meta: true);
     var outline = await _computeOutline('''
 import 'package:meta/meta.dart';
 
diff --git a/pkg/analysis_server/test/src/domains/execution/completion_test.dart b/pkg/analysis_server/test/src/domains/execution/completion_test.dart
index 5e7d02c..b70a9bb 100644
--- a/pkg/analysis_server/test/src/domains/execution/completion_test.dart
+++ b/pkg/analysis_server/test/src/domains/execution/completion_test.dart
@@ -4,6 +4,7 @@
 
 import 'package:analysis_server/src/domains/execution/completion.dart';
 import 'package:analysis_server/src/protocol_server.dart';
+import 'package:analyzer/file_system/overlay_file_system.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -17,6 +18,7 @@
 
 @reflectiveTest
 class RuntimeCompletionComputerTest extends AbstractContextTest {
+  OverlayResourceProvider overlayResourceProvider;
   String contextFile;
   int contextOffset;
 
@@ -57,8 +59,15 @@
     expect(codeOffset, isNonNegative);
     code = code.replaceAll('^', '');
 
-    var computer = RuntimeCompletionComputer(overlayResourceProvider, driver,
-        code, codeOffset, contextFile, contextOffset, variables, expressions);
+    var computer = RuntimeCompletionComputer(
+        overlayResourceProvider,
+        driverFor(contextFile),
+        code,
+        codeOffset,
+        contextFile,
+        contextOffset,
+        variables,
+        expressions);
     result = await computer.compute();
   }
 
@@ -85,6 +94,7 @@
     return null;
   }
 
+  @FailingTest(reason: 'No support for OverlayResourceProvider')
   Future<void> test_class_fields() async {
     addContextFile(r'''
 class A {
@@ -103,6 +113,7 @@
     assertSuggested('c', returnType: 'double');
   }
 
+  @FailingTest(reason: 'No support for OverlayResourceProvider')
   Future<void> test_class_methods() async {
     addContextFile(r'''
 class A {
@@ -120,6 +131,7 @@
     assertSuggested('b', returnType: 'double');
   }
 
+  @FailingTest(reason: 'No support for OverlayResourceProvider')
   Future<void> test_inPart() async {
     addSource('/home/test/lib/a.dart', r'''
 part 'b.dart';
@@ -147,6 +159,7 @@
     assertSuggested('c', returnType: 'String');
   }
 
+  @FailingTest(reason: 'No support for OverlayResourceProvider')
   Future<void> test_locals_block() async {
     addContextFile(r'''
 class A {
@@ -167,6 +180,7 @@
     assertSuggested('foo');
   }
 
+  @FailingTest(reason: 'No support for OverlayResourceProvider')
   Future<void> test_locals_block_codeWithClosure() async {
     addContextFile(r'''
 main() {
@@ -178,6 +192,7 @@
     assertSuggested('toUpperCase');
   }
 
+  @FailingTest(reason: 'No support for OverlayResourceProvider')
   Future<void> test_locals_block_nested() async {
     addContextFile(r'''
 void main() {
@@ -198,6 +213,7 @@
     assertNotSuggested('c');
   }
 
+  @FailingTest(reason: 'No support for OverlayResourceProvider')
   Future<void> test_locals_for() async {
     addContextFile(r'''
 void main(List<int> intItems, List<double> doubleItems) {
@@ -211,6 +227,7 @@
     assertSuggested('b', returnType: 'double');
   }
 
+  @FailingTest(reason: 'No support for OverlayResourceProvider')
   Future<void> test_locals_forEach() async {
     addContextFile(r'''
 void main(List<int> intItems, List<double> doubleItems) {
@@ -226,6 +243,7 @@
     assertSuggested('b', returnType: 'double');
   }
 
+  @FailingTest(reason: 'No support for OverlayResourceProvider')
   Future<void> test_parameters_constructor() async {
     addContextFile(r'''
 class C {
@@ -239,6 +257,7 @@
     assertSuggested('b', returnType: 'double');
   }
 
+  @FailingTest(reason: 'No support for OverlayResourceProvider')
   Future<void> test_parameters_function() async {
     addContextFile(r'''
 void main(int a, double b) {
@@ -250,6 +269,7 @@
     assertSuggested('b', returnType: 'double');
   }
 
+  @FailingTest(reason: 'No support for OverlayResourceProvider')
   Future<void> test_parameters_function_locals() async {
     addContextFile(r'''
 void main(int a, int b) {
@@ -264,6 +284,7 @@
     assertSuggested('c', returnType: 'double');
   }
 
+  @FailingTest(reason: 'No support for OverlayResourceProvider')
   Future<void> test_parameters_function_nested() async {
     addContextFile(r'''
 void foo(int a, double b) {
@@ -278,6 +299,7 @@
     assertSuggested('c', returnType: 'bool');
   }
 
+  @FailingTest(reason: 'No support for OverlayResourceProvider')
   Future<void> test_parameters_functionExpression() async {
     addContextFile(r'''
 void main(List<int> intItems, List<double> doubleItems) {
@@ -293,6 +315,7 @@
     assertSuggested('b', returnType: 'double');
   }
 
+  @FailingTest(reason: 'No support for OverlayResourceProvider')
   Future<void> test_parameters_method() async {
     addContextFile(r'''
 class C {
@@ -306,6 +329,7 @@
     assertSuggested('b', returnType: 'double');
   }
 
+  @FailingTest(reason: 'No support for OverlayResourceProvider')
   Future<void> test_parameters_method_locals() async {
     addContextFile(r'''
 class C {
@@ -322,6 +346,7 @@
     assertSuggested('c', returnType: 'double');
   }
 
+  @FailingTest(reason: 'No support for OverlayResourceProvider')
   Future<void> test_syntheticImportPrefix() async {
     newFile('/test/lib/a.dart', content: 'class A {}');
     newFile('/test/lib/b.dart', content: 'class B {}');
@@ -340,6 +365,7 @@
     }
   }
 
+  @FailingTest(reason: 'No support for OverlayResourceProvider')
   Future<void> test_topLevelFunctions() async {
     addContextFile(r'''
 int a() => null;
@@ -353,6 +379,7 @@
     assertSuggested('b', returnType: 'double');
   }
 
+  @FailingTest(reason: 'No support for OverlayResourceProvider')
   Future<void> test_topLevelVariables() async {
     addContextFile(r'''
 int a;
diff --git a/pkg/analysis_server/test/src/flutter/flutter_correction_test.dart b/pkg/analysis_server/test/src/flutter/flutter_correction_test.dart
index 701dc96..3ab09de 100644
--- a/pkg/analysis_server/test/src/flutter/flutter_correction_test.dart
+++ b/pkg/analysis_server/test/src/flutter/flutter_correction_test.dart
@@ -30,7 +30,7 @@
   @override
   void setUp() {
     super.setUp();
-    addFlutterPackage();
+    writeTestPackageConfig(flutter: true);
   }
 
 //  void _assertChange(SourceChange change, String expectedCode) {
diff --git a/pkg/analysis_server/test/src/flutter/flutter_outline_computer_test.dart b/pkg/analysis_server/test/src/flutter/flutter_outline_computer_test.dart
index 02fff3b..81e43c3 100644
--- a/pkg/analysis_server/test/src/flutter/flutter_outline_computer_test.dart
+++ b/pkg/analysis_server/test/src/flutter/flutter_outline_computer_test.dart
@@ -26,8 +26,8 @@
   @override
   void setUp() {
     super.setUp();
+    writeTestPackageConfig(flutter: true);
     testPath = convertPath('/home/test/lib/test.dart');
-    addFlutterPackage();
   }
 
   Future<void> test_attribute_namedExpression() async {
diff --git a/pkg/analysis_server/test/src/services/completion/dart/feature_computer_test.dart b/pkg/analysis_server/test/src/services/completion/dart/feature_computer_test.dart
index d8b8b06..03c9c87 100644
--- a/pkg/analysis_server/test/src/services/completion/dart/feature_computer_test.dart
+++ b/pkg/analysis_server/test/src/services/completion/dart/feature_computer_test.dart
@@ -26,7 +26,7 @@
       fail('Missing node offset marker (^) in content');
     }
     content = content.substring(0, index) + content.substring(index + 1);
-    await resolveTestUnit(content);
+    await resolveTestCode(content);
     // TODO(jwren) Consider changing this from the NodeLocator to the optype
     // node finding logic to be more consistent with what the user behavior
     // here will be.
diff --git a/pkg/analysis_server/test/src/services/correction/assist/add_diagnostic_property_reference_test.dart b/pkg/analysis_server/test/src/services/correction/assist/add_diagnostic_property_reference_test.dart
index ded7a23..f9b684c 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/add_diagnostic_property_reference_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/add_diagnostic_property_reference_test.dart
@@ -19,10 +19,17 @@
   @override
   AssistKind get kind => DartAssistKind.ADD_DIAGNOSTIC_PROPERTY_REFERENCE;
 
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(
+      flutter: true,
+    );
+  }
+
   /// Full coverage in fix/add_diagnostic_property_reference_test.dart
   Future<void> test_boolField_debugFillProperties() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/foundation.dart';
 import 'package:flutter/widgets.dart';
 
@@ -51,7 +58,7 @@
 
   Future<void> test_notAvailable_mixin() async {
     verifyNoTestUnitErrors = false;
-    await resolveTestUnit('''
+    await resolveTestCode('''
 mixin MyMixin {
   String get foo/*caret*/() {}
 }
@@ -60,8 +67,7 @@
   }
 
   Future<void> test_notAvailable_outsideDiagnosticable() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class C {
   String get f/*caret*/ => null;
 }
diff --git a/pkg/analysis_server/test/src/services/correction/assist/add_not_null_assert_test.dart b/pkg/analysis_server/test/src/services/correction/assist/add_not_null_assert_test.dart
index 92c6865..d100c48 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/add_not_null_assert_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/add_not_null_assert_test.dart
@@ -20,7 +20,7 @@
   AssistKind get kind => DartAssistKind.ADD_NOT_NULL_ASSERT;
 
   Future<void> test_function_expressionBody_noAssert() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 int double(int x) => x * 2;
 ''');
     // todo (pq): support expression bodies.
@@ -28,7 +28,7 @@
   }
 
   Future<void> test_function_noAssert() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 foo(int x) {
 }
 ''');
@@ -40,7 +40,7 @@
   }
 
   Future<void> test_function_withAssert() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 foo(int x) {
   assert(x != null);
 }
@@ -49,7 +49,7 @@
   }
 
   Future<void> test_function_withAssert2() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 foo(int x) {
   print('foo');
   assert(x != null);
@@ -59,7 +59,7 @@
   }
 
   Future<void> test_method_noAssert() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   foo(int x) {
   }
diff --git a/pkg/analysis_server/test/src/services/correction/assist/add_return_type_test.dart b/pkg/analysis_server/test/src/services/correction/assist/add_return_type_test.dart
index 748ec86..c288dd0 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/add_return_type_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/add_return_type_test.dart
@@ -21,7 +21,7 @@
   AssistKind get kind => DartAssistKind.ADD_RETURN_TYPE;
 
   Future<void> test_localFunction_block() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   void m() {
     /*caret*/f() {
@@ -42,7 +42,7 @@
   }
 
   Future<void> test_localFunction_expression() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   void m() {
     /*caret*/f() => '';
@@ -59,7 +59,7 @@
   }
 
   Future<void> test_method_block_noReturn() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   /*caret*/m() {
   }
@@ -69,7 +69,7 @@
   }
 
   Future<void> test_method_block_returnDynamic() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   /*caret*/m(p) {
     return p;
@@ -86,7 +86,7 @@
   }
 
   Future<void> test_method_block_returnNoValue() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   /*caret*/m() {
     return;
@@ -103,7 +103,7 @@
   }
 
   Future<void> test_method_block_singleReturn() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   /*caret*/m() {
     return '';
@@ -120,7 +120,7 @@
   }
 
   Future<void> test_method_expression() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   /*caret*/m() => '';
 }
@@ -133,7 +133,7 @@
   }
 
   Future<void> test_method_getter() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   get /*caret*/foo => 0;
 }
@@ -146,7 +146,7 @@
   }
 
   Future<void> test_method_setter() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   set /*caret*/foo(int a) {
     if (a == 0) return;
@@ -166,7 +166,7 @@
     createAnalysisOptionsFile(lints: [
       LintNames.avoid_return_types_on_setters,
     ]);
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   set /*caret*/foo(int a) {
     if (a == 0) return;
@@ -177,7 +177,7 @@
   }
 
   Future<void> test_topLevelFunction_block() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 /*caret*/f() {
   return '';
 }
@@ -190,7 +190,7 @@
   }
 
   Future<void> test_topLevelFunction_expression() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 /*caret*/f() => '';
 ''');
     await assertHasAssist('''
@@ -201,14 +201,14 @@
   Future<void> test_topLevelFunction_expression_noAssistWithLint() async {
     createAnalysisOptionsFile(lints: [LintNames.always_declare_return_types]);
     verifyNoTestUnitErrors = false;
-    await resolveTestUnit('''
+    await resolveTestCode('''
 /*caret*/f() => '';
 ''');
     await assertNoAssist();
   }
 
   Future<void> test_topLevelFunction_getter() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 get /*caret*/foo => 0;
 ''');
     await assertHasAssist('''
@@ -217,7 +217,7 @@
   }
 
   Future<void> test_topLevelFunction_setter() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 set /*caret*/foo(int a) {
   if (a == 0) return;
 }
@@ -234,7 +234,7 @@
     createAnalysisOptionsFile(lints: [
       LintNames.avoid_return_types_on_setters,
     ]);
-    await resolveTestUnit('''
+    await resolveTestCode('''
 set /*caret*/foo(int a) {
   if (a == 0) return;
 }
diff --git a/pkg/analysis_server/test/src/services/correction/assist/add_type_annotation_test.dart b/pkg/analysis_server/test/src/services/correction/assist/add_type_annotation_test.dart
index d0d30dd..06724fb 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/add_type_annotation_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/add_type_annotation_test.dart
@@ -21,7 +21,7 @@
   AssistKind get kind => DartAssistKind.ADD_TYPE_ANNOTATION;
 
   Future<void> test_classField_final() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   final f = 0;
 }
@@ -36,7 +36,7 @@
   Future<void> test_classField_final_noAssistWithLint() async {
     createAnalysisOptionsFile(lints: [LintNames.always_specify_types]);
     verifyNoTestUnitErrors = false;
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   /*caret*/final f = 0;
 }
@@ -45,7 +45,7 @@
   }
 
   Future<void> test_classField_int() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   var f = 0;
 }
@@ -58,7 +58,7 @@
   }
 
   Future<void> test_declaredIdentifier() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main(List<String> items) {
   for (var item in items) {
   }
@@ -85,7 +85,7 @@
 import 'dart:collection';
 List<HashMap<String, int>> getMap() => null;
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'my_lib.dart';
 main() {
   for (var map in getMap()) {
@@ -104,7 +104,7 @@
   }
 
   Future<void> test_declaredIdentifier_final() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main(List<String> items) {
   for (final item in items) {
   }
@@ -119,7 +119,7 @@
   }
 
   Future<void> test_declaredIdentifier_generic() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A<T> {
   main(List<List<T>> items) {
     for (var item in items) {
@@ -138,7 +138,7 @@
   }
 
   Future<void> test_declaredIdentifier_hasTypeAnnotation() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main(List<String> items) {
   for (String item in items) {
   }
@@ -148,7 +148,7 @@
   }
 
   Future<void> test_declaredIdentifier_inForEachBody() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main(List<String> items) {
   for (var item in items) {
     42;
@@ -160,7 +160,7 @@
 
   Future<void> test_declaredIdentifier_unknownType() async {
     verifyNoTestUnitErrors = false;
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   for (var item in unknownList) {
   }
@@ -174,7 +174,7 @@
 import 'dart:collection';
 HashMap<String, int> getMap() => null;
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'my_lib.dart';
 main() {
   var v = getMap();
@@ -201,17 +201,17 @@
 import 'my_lib.dart';
 part 'test.dart';
 ''';
-    var partCode = r'''
+    addTestSource(r'''
 part of my_app;
 main() {
   var /*caret*/v = getMap();
 }
-''';
+''');
 
     var appPath = convertPath('/home/test/lib/app.dart');
     addSource(appPath, appCode);
-    addSource(testFile, partCode);
-    await resolveTestUnit(partCode);
+    await analyzeTestPackageFiles();
+    await resolveTestFile();
 
     await assertHasAssist('''
 part of my_app;
@@ -241,7 +241,7 @@
 import '../aa/bbb/lib_a.dart';
 MyClass newMyClass() => null;
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'ccc/lib_b.dart';
 main() {
   var v = newMyClass();
@@ -257,7 +257,7 @@
   }
 
   Future<void> test_local_bottom() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   var v = throw 42;
 }
@@ -266,7 +266,7 @@
   }
 
   Future<void> test_local_Function() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   var v = () => 1;
 }
@@ -279,7 +279,7 @@
   }
 
   Future<void> test_local_generic_literal() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   main(List<int> items) {
     var v = items;
@@ -296,7 +296,7 @@
   }
 
   Future<void> test_local_generic_local() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A<T> {
   main(List<T> items) {
     var v = items;
@@ -313,7 +313,7 @@
   }
 
   Future<void> test_local_hasTypeAnnotation() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   int v = 42;
 }
@@ -322,7 +322,7 @@
   }
 
   Future<void> test_local_int() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   var v = 0;
 }
@@ -335,7 +335,7 @@
   }
 
   Future<void> test_local_List() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   var v = <String>[];
 }
@@ -348,7 +348,7 @@
   }
 
   Future<void> test_local_localType() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class C {}
 C f() => null;
 main() {
@@ -365,7 +365,7 @@
   }
 
   Future<void> test_local_multiple() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   var a = 1, b = '';
 }
@@ -375,7 +375,7 @@
 
   Future<void> test_local_noValue() async {
     verifyNoTestUnitErrors = false;
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   var v;
 }
@@ -384,7 +384,7 @@
   }
 
   Future<void> test_local_null() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   var v = null;
 }
@@ -393,7 +393,7 @@
   }
 
   Future<void> test_local_onInitializer() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   var abc = 0;
 }
@@ -402,7 +402,7 @@
   }
 
   Future<void> test_local_onName() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   var abc = 0;
 }
@@ -415,7 +415,7 @@
   }
 
   Future<void> test_local_onVar() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   var v = 0;
 }
@@ -429,7 +429,7 @@
 
   Future<void> test_local_unknown() async {
     verifyNoTestUnitErrors = false;
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   var v = unknownVar;
 }
@@ -438,7 +438,7 @@
   }
 
   Future<void> test_parameter() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 foo(f(int p)) {}
 main() {
   foo((test) {});
@@ -453,7 +453,7 @@
   }
 
   Future<void> test_parameter_hasExplicitType() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 foo(f(int p)) {}
 main() {
   foo((num test) {});
@@ -463,7 +463,7 @@
   }
 
   Future<void> test_parameter_noPropagatedType() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 foo(f(p)) {}
 main() {
   foo((test) {});
@@ -479,7 +479,7 @@
 class _B extends A {}
 foo(f(_B p)) {}
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'my_lib.dart';
 main() {
   foo((test) {});
@@ -495,7 +495,7 @@
 class _B extends A {}
 List<_B> getValues() => [];
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'my_lib.dart';
 class A<T> {
   main() {
@@ -516,7 +516,7 @@
 class _B extends A {}
 List<_B> getValues() => [];
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'my_lib.dart';
 main() {
   var v = getValues();
@@ -531,7 +531,7 @@
   }
 
   Future<void> test_privateType_sameLibrary() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class _A {}
 _A getValue() => _A();
 main() {
@@ -554,7 +554,7 @@
 class _B extends A {}
 _B getValue() => _B();
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'my_lib.dart';
 main() {
   var v = getValue();
@@ -564,7 +564,7 @@
   }
 
   Future<void> test_topLevelField_int() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var V = 0;
 ''');
     await assertHasAssistAt('var ', '''
@@ -573,14 +573,14 @@
   }
 
   Future<void> test_topLevelField_multiple() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var A = 1, V = '';
 ''');
     await assertNoAssistAt('var ');
   }
 
   Future<void> test_topLevelField_noValue() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var V;
 ''');
     await assertNoAssistAt('var ');
diff --git a/pkg/analysis_server/test/src/services/correction/assist/assign_to_local_variable_test.dart b/pkg/analysis_server/test/src/services/correction/assist/assign_to_local_variable_test.dart
index 936b9fa..3fa857a 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/assign_to_local_variable_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/assign_to_local_variable_test.dart
@@ -21,7 +21,7 @@
   AssistKind get kind => DartAssistKind.ASSIGN_TO_LOCAL_VARIABLE;
 
   Future<void> test_alreadyAssignment() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   var vvv;
   vvv = 42;
@@ -31,7 +31,7 @@
   }
 
   Future<void> test_inClosure() async {
-    await resolveTestUnit(r'''
+    await resolveTestCode(r'''
 main() {
   print(() {
     12345;
@@ -48,7 +48,7 @@
   }
 
   Future<void> test_invocation() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   List<int> bytes;
   readBytes();
@@ -70,7 +70,7 @@
   }
 
   Future<void> test_invocationArgument() async {
-    await resolveTestUnit(r'''
+    await resolveTestCode(r'''
 main() {
   f(12345);
 }
@@ -81,7 +81,7 @@
 
   Future<void> test_recovery_splitExpression() async {
     verifyNoTestUnitErrors = false;
-    await resolveTestUnit('''
+    await resolveTestCode('''
 Future<void> _extractDataForSite() async {
   final Map<String, Object> data = {};
   final data['table'][] //marker
@@ -91,7 +91,7 @@
   }
 
   Future<void> test_throw() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   throw 42;
 }
@@ -100,7 +100,7 @@
   }
 
   Future<void> test_void() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   f();
 }
diff --git a/pkg/analysis_server/test/src/services/correction/assist/assist_processor.dart b/pkg/analysis_server/test/src/services/correction/assist/assist_processor.dart
index 478f098..b6ac127 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/assist_processor.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/assist_processor.dart
@@ -16,6 +16,8 @@
 
 import '../../../../abstract_single_unit.dart';
 
+export 'package:analyzer/src/test_utilities/package_config_file_builder.dart';
+
 /// A base class defining support for writing assist processor tests.
 abstract class AssistProcessorTest extends AbstractSingleUnitTest {
   int _offset;
@@ -32,6 +34,36 @@
     return DartChangeWorkspace([session]);
   }
 
+  @override
+  void addTestSource(String code) {
+    if (useLineEndingsForPlatform) {
+      code = normalizeNewlinesForPlatform(code);
+    }
+    final eol = code.contains('\r\n') ? '\r\n' : '\n';
+    var offset = code.indexOf('/*caret*/');
+    if (offset >= 0) {
+      var endOffset = offset + '/*caret*/'.length;
+      code = code.substring(0, offset) + code.substring(endOffset);
+      _offset = offset;
+      _length = 0;
+    } else {
+      var startOffset = code.indexOf('// start$eol');
+      var endOffset = code.indexOf('// end$eol');
+      if (startOffset >= 0 && endOffset >= 0) {
+        var startLength = '// start$eol'.length;
+        code = code.substring(0, startOffset) +
+            code.substring(startOffset + startLength, endOffset) +
+            code.substring(endOffset + '// end$eol'.length);
+        _offset = startOffset;
+        _length = endOffset - startLength - _offset;
+      } else {
+        _offset = 0;
+        _length = 0;
+      }
+    }
+    super.addTestSource(code);
+  }
+
   void assertExitPosition({String before, String after}) {
     var exitPosition = _change.selection;
     expect(exitPosition, isNotNull);
@@ -142,36 +174,6 @@
   }
 
   @override
-  Future<void> resolveTestUnit(String code) async {
-    if (useLineEndingsForPlatform) {
-      code = normalizeNewlinesForPlatform(code);
-    }
-    final eol = code.contains('\r\n') ? '\r\n' : '\n';
-    var offset = code.indexOf('/*caret*/');
-    if (offset >= 0) {
-      var endOffset = offset + '/*caret*/'.length;
-      code = code.substring(0, offset) + code.substring(endOffset);
-      _offset = offset;
-      _length = 0;
-    } else {
-      var startOffset = code.indexOf('// start$eol');
-      var endOffset = code.indexOf('// end$eol');
-      if (startOffset >= 0 && endOffset >= 0) {
-        var startLength = '// start$eol'.length;
-        code = code.substring(0, startOffset) +
-            code.substring(startOffset + startLength, endOffset) +
-            code.substring(endOffset + '// end$eol'.length);
-        _offset = startOffset;
-        _length = endOffset - startLength - _offset;
-      } else {
-        _offset = 0;
-        _length = 0;
-      }
-    }
-    return super.resolveTestUnit(code);
-  }
-
-  @override
   void setUp() {
     super.setUp();
     useLineEndingsForPlatform = true;
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_class_to_mixin_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_class_to_mixin_test.dart
index 14d3271..9ccf27d 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/convert_class_to_mixin_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_class_to_mixin_test.dart
@@ -20,7 +20,7 @@
   AssistKind get kind => DartAssistKind.CONVERT_CLASS_TO_MIXIN;
 
   Future<void> test_abstract() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 abstract class A {}
 ''');
     await assertHasAssistAt('A', '''
@@ -29,7 +29,7 @@
   }
 
   Future<void> test_extends_noSuper() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {}
 class B extends A {}
 ''');
@@ -40,7 +40,7 @@
   }
 
   Future<void> test_extends_super() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   a() {}
 }
@@ -63,7 +63,7 @@
   }
 
   Future<void> test_extends_superSuper() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   a() {}
 }
@@ -88,7 +88,7 @@
   }
 
   Future<void> test_extendsImplements_noSuper() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {}
 class B {}
 class C extends A implements B {}
@@ -101,7 +101,7 @@
   }
 
   Future<void> test_extendsImplements_super_extends() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   a() {}
 }
@@ -126,7 +126,7 @@
   }
 
   Future<void> test_extendsWith_noSuper() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {}
 class B {}
 class C extends A with B {}
@@ -139,7 +139,7 @@
   }
 
   Future<void> test_extendsWith_super_both() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   a() {}
 }
@@ -170,7 +170,7 @@
   }
 
   Future<void> test_extendsWith_super_extends() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   a() {}
 }
@@ -199,7 +199,7 @@
   }
 
   Future<void> test_extendsWith_super_with() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   a() {}
 }
@@ -228,7 +228,7 @@
   }
 
   Future<void> test_extendsWithImplements_noSuper() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {}
 class B {}
 class C {}
@@ -243,7 +243,7 @@
   }
 
   Future<void> test_extendsWithImplements_super_both() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   a() {}
 }
@@ -276,7 +276,7 @@
   }
 
   Future<void> test_extendsWithImplements_super_extends() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   a() {}
 }
@@ -307,7 +307,7 @@
   }
 
   Future<void> test_extendsWithImplements_super_with() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   a() {}
 }
@@ -338,7 +338,7 @@
   }
 
   Future<void> test_implements() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {}
 class B implements A {}
 ''');
@@ -349,14 +349,14 @@
   }
 
   Future<void> test_noClauses_invalidSelection() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {}
 ''');
     await assertNoAssistAt('{}');
   }
 
   Future<void> test_noClauses_selectKeyword() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {}
 ''');
     await assertHasAssistAt('class', '''
@@ -365,7 +365,7 @@
   }
 
   Future<void> test_noClauses_selectName() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {}
 ''');
     await assertHasAssistAt('A', '''
@@ -374,7 +374,7 @@
   }
 
   Future<void> test_typeParameters() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A<T> {}
 ''');
     await assertHasAssistAt('A', '''
@@ -383,7 +383,7 @@
   }
 
   Future<void> test_with_noSuper() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {}
 class B with A {}
 ''');
@@ -394,7 +394,7 @@
   }
 
   Future<void> test_with_super() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   a() {}
 }
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_documentation_into_block_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_documentation_into_block_test.dart
index a253255..9fe4f87 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/convert_documentation_into_block_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_documentation_into_block_test.dart
@@ -20,7 +20,7 @@
   AssistKind get kind => DartAssistKind.CONVERT_DOCUMENTATION_INTO_BLOCK;
 
   Future<void> test_alreadyBlock() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 /**
  * AAAAAAA
  */
@@ -30,7 +30,7 @@
   }
 
   Future<void> test_noSpaceBeforeText() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   /// AAAAA
   ///BBBBB
@@ -53,7 +53,7 @@
   }
 
   Future<void> test_notDocumentation() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 // AAAA
 class A {}
 ''');
@@ -61,7 +61,7 @@
   }
 
   Future<void> test_onReference() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 /// AAAAAAA [int] AAAAAAA
 class A {}
 ''');
@@ -74,7 +74,7 @@
   }
 
   Future<void> test_onText() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   /// AAAAAAA [int] AAAAAAA
   /// BBBBBBBB BBBB BBBB
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_documentation_into_line_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_documentation_into_line_test.dart
index 29c820b..92a8449 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/convert_documentation_into_line_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_documentation_into_line_test.dart
@@ -21,7 +21,7 @@
   AssistKind get kind => DartAssistKind.CONVERT_DOCUMENTATION_INTO_LINE;
 
   Future<void> test_alreadyLine() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 /// AAAAAAA
 class A {}
 ''');
@@ -29,7 +29,7 @@
   }
 
   Future<void> test_hasEmptyLine() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   /**
    * AAAAAAA [int] AAAAAAA
@@ -50,7 +50,7 @@
   }
 
   Future<void> test_notDocumentation() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 /* AAAA */
 class A {}
 ''');
@@ -58,7 +58,7 @@
   }
 
   Future<void> test_onReference() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 /**
  * AAAAAAA [int] AAAAAAA
  */
@@ -71,7 +71,7 @@
   }
 
   Future<void> test_onText() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   /**
    * AAAAAAA [int] AAAAAAA
@@ -92,7 +92,7 @@
   }
 
   Future<void> test_onText_hasFirstLine() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   /** AAAAAAA [int] AAAAAAA
    * BBBBBBBB BBBB BBBB
@@ -114,7 +114,7 @@
   Future<void> test_onText_noAssistWithLint() async {
     createAnalysisOptionsFile(lints: [LintNames.slash_for_doc_comments]);
     verifyNoTestUnitErrors = false;
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   /**
    * AAAAAAA [int] AAAAAAA
@@ -128,7 +128,7 @@
   }
 
   Future<void> test_preserveIndentation() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   /**
    * First line.
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_into_async_body_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_into_async_body_test.dart
index 117edae..0120636 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/convert_into_async_body_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_into_async_body_test.dart
@@ -20,7 +20,7 @@
   AssistKind get kind => DartAssistKind.CONVERT_INTO_ASYNC_BODY;
 
   Future<void> test_async() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'dart:async';
 Future<String> f() async => '';
 ''');
@@ -28,7 +28,7 @@
   }
 
   Future<void> test_asyncStar() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'dart:async';
 Stream<String> f() async* {}
 ''');
@@ -36,7 +36,7 @@
   }
 
   Future<void> test_closure() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   f(() => 123);
 }
@@ -51,7 +51,7 @@
   }
 
   Future<void> test_constructor() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class C {
   C() {}
 }
@@ -60,7 +60,7 @@
   }
 
   Future<void> test_function() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 String f() => '';
 ''');
     await assertHasAssistAt('=>', '''
@@ -69,7 +69,7 @@
   }
 
   Future<void> test_getter_expression_noSpace() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class C {
   int get g=>0;
 }
@@ -82,7 +82,7 @@
   }
 
   Future<void> test_inBody_block() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class C {
   void foo() {
     print(42);
@@ -93,7 +93,7 @@
   }
 
   Future<void> test_inBody_expression() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class C {
   void foo() => print(42);
 }
@@ -102,7 +102,7 @@
   }
 
   Future<void> test_method() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class C {
   int m() { return 0; }
 }
@@ -115,7 +115,7 @@
   }
 
   Future<void> test_method_abstract() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 abstract class C {
   int m();
 }
@@ -124,7 +124,7 @@
   }
 
   Future<void> test_method_noReturnType() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class C {
   m() { return 0; }
 }
@@ -137,7 +137,7 @@
   }
 
   Future<void> test_syncStar() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 Iterable<String> f() sync* {}
 ''');
     await assertNoAssistAt('{}');
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_into_block_body_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_into_block_body_test.dart
index 734b03a..db04588 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/convert_into_block_body_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_into_block_body_test.dart
@@ -20,7 +20,7 @@
   AssistKind get kind => DartAssistKind.CONVERT_INTO_BLOCK_BODY;
 
   Future<void> test_async() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   mmm() async => 123;
 }
@@ -35,7 +35,7 @@
   }
 
   Future<void> test_closure() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 setup(x) {}
 main() {
   setup(() => 42);
@@ -53,7 +53,7 @@
   }
 
   Future<void> test_closure_voidExpression() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 setup(x) {}
 main() {
   setup(() => print('done'));
@@ -71,7 +71,7 @@
   }
 
   Future<void> test_constructor() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   A.named();
 
@@ -90,14 +90,14 @@
   }
 
   Future<void> test_inExpression() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() => 123;
 ''');
     await assertNoAssistAt('123;');
   }
 
   Future<void> test_method() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   mmm() => 123;
 }
@@ -112,14 +112,14 @@
   }
 
   Future<void> test_noEnclosingFunction() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var v = 123;
 ''');
     await assertNoAssistAt('v =');
   }
 
   Future<void> test_notExpressionBlock() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 fff() {
   return 123;
 }
@@ -128,7 +128,7 @@
   }
 
   Future<void> test_onArrow() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 fff() => 123;
 ''');
     await assertHasAssistAt('=>', '''
@@ -139,7 +139,7 @@
   }
 
   Future<void> test_onName() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 fff() => 123;
 ''');
     await assertHasAssistAt('fff()', '''
@@ -150,7 +150,7 @@
   }
 
   Future<void> test_throw() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   mmm() => throw 'error';
 }
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_into_expression_body_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_into_expression_body_test.dart
index cfacc90..6e8152d 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/convert_into_expression_body_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_into_expression_body_test.dart
@@ -21,14 +21,14 @@
   AssistKind get kind => DartAssistKind.CONVERT_INTO_EXPRESSION_BODY;
 
   Future<void> test_already() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 fff() => 42;
 ''');
     await assertNoAssistAt('fff()');
   }
 
   Future<void> test_async() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   mmm() async {
     return 42;
@@ -46,7 +46,7 @@
     createAnalysisOptionsFile(
         lints: [LintNames.prefer_expression_function_bodies]);
     verifyNoTestUnitErrors = false;
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   mmm() async {
     return 42;
@@ -57,7 +57,7 @@
   }
 
   Future<void> test_closure() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 setup(x) {}
 main() {
   setup(() {
@@ -74,7 +74,7 @@
   }
 
   Future<void> test_closure_voidExpression() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 setup(x) {}
 main() {
   setup((_) {
@@ -91,7 +91,7 @@
   }
 
   Future<void> test_constructor() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   A.named();
 
@@ -110,7 +110,7 @@
   }
 
   Future<void> test_function_onBlock() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 fff() {
   return 42;
 }
@@ -121,7 +121,7 @@
   }
 
   Future<void> test_function_onName() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 fff() {
   return 42;
 }
@@ -132,7 +132,7 @@
   }
 
   Future<void> test_inExpression() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   return 42;
 }
@@ -141,7 +141,7 @@
   }
 
   Future<void> test_method_onBlock() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   m() { // marker
     return 42;
@@ -156,7 +156,7 @@
   }
 
   Future<void> test_moreThanOneStatement() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 fff() {
   var v = 42;
   return v;
@@ -166,14 +166,14 @@
   }
 
   Future<void> test_noEnclosingFunction() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var V = 42;
 ''');
     await assertNoAssistAt('V = ');
   }
 
   Future<void> test_noReturn() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 fff() {
   var v = 42;
 }
@@ -182,7 +182,7 @@
   }
 
   Future<void> test_noReturnValue() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 fff() {
   return;
 }
@@ -191,7 +191,7 @@
   }
 
   Future<void> test_topFunction_onReturnStatement() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 fff() {
   return 42;
 }
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_into_final_field_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_into_final_field_test.dart
index b81362d..345eda1 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/convert_into_final_field_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_into_final_field_test.dart
@@ -20,7 +20,7 @@
   AssistKind get kind => DartAssistKind.CONVERT_INTO_FINAL_FIELD;
 
   Future<void> test_blockBody_onlyReturnStatement() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   int get foo {
     return 1 + 2;
@@ -35,7 +35,7 @@
   }
 
   Future<void> test_hasOverride() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 const myAnnotation = const Object();
 class A {
   @myAnnotation
@@ -52,7 +52,7 @@
   }
 
   Future<void> test_hasSetter_inSuper() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   void set foo(_) {}
 }
@@ -71,7 +71,7 @@
   }
 
   Future<void> test_hasSetter_inThisClass() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   int get foo => null;
   void set foo(_) {}
@@ -81,7 +81,7 @@
   }
 
   Future<void> test_noReturnType() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   get foo => 42;
 }
@@ -94,7 +94,7 @@
   }
 
   Future<void> test_noReturnType_static() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   static get foo => 42;
 }
@@ -107,7 +107,7 @@
   }
 
   Future<void> test_notExpressionBody() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   int get foo {
     int v = 1 + 2;
@@ -119,7 +119,7 @@
   }
 
   Future<void> test_notGetter() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   int foo() => 42;
 }
@@ -128,7 +128,7 @@
   }
 
   Future<void> test_notNull() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   int get foo => 1 + 2;
 }
@@ -141,7 +141,7 @@
   }
 
   Future<void> test_null() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   int get foo => null;
 }
@@ -154,7 +154,7 @@
   }
 
   Future<void> test_onName() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   int get foo => 42;
 }
@@ -167,7 +167,7 @@
   }
 
   Future<void> test_onReturnType_parameterized() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   List<int> get foo => null;
 }
@@ -180,7 +180,7 @@
   }
 
   Future<void> test_onReturnType_simple() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   int get foo => 42;
 }
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_into_for_index_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_into_for_index_test.dart
index dc0a9e3..d6aca70 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/convert_into_for_index_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_into_for_index_test.dart
@@ -20,7 +20,7 @@
   AssistKind get kind => DartAssistKind.CONVERT_INTO_FOR_INDEX;
 
   Future<void> test_bodyNotBlock() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main(List<String> items) {
   for (String item in items) print(item);
 }
@@ -29,7 +29,7 @@
   }
 
   Future<void> test_doesNotDeclareVariable() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main(List<String> items) {
   String item;
   for (item in items) {
@@ -41,7 +41,7 @@
   }
 
   Future<void> test_iterableIsNotVariable() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   for (String item in ['a', 'b', 'c']) {
     print(item);
@@ -52,7 +52,7 @@
   }
 
   Future<void> test_iterableNotList() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main(Iterable<String> items) {
   for (String item in items) {
     print(item);
@@ -63,7 +63,7 @@
   }
 
   Future<void> test_onDeclaredIdentifier_name() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main(List<String> items) {
   for (String item in items) {
     print(item);
@@ -81,7 +81,7 @@
   }
 
   Future<void> test_onDeclaredIdentifier_type() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main(List<String> items) {
   for (String item in items) {
     print(item);
@@ -99,7 +99,7 @@
   }
 
   Future<void> test_onFor() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main(List<String> items) {
   for (String item in items) {
     print(item);
@@ -117,7 +117,7 @@
   }
 
   Future<void> test_usesI() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main(List<String> items) {
   for (String item in items) {
     int i = 0;
@@ -135,7 +135,7 @@
   }
 
   Future<void> test_usesIJ() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main(List<String> items) {
   for (String item in items) {
     print(item);
@@ -155,7 +155,7 @@
   }
 
   Future<void> test_usesIJK() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main(List<String> items) {
   for (String item in items) {
     print(item);
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_into_generic_function_syntax_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_into_generic_function_syntax_test.dart
index 8ae79a7..cb80726 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/convert_into_generic_function_syntax_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_into_generic_function_syntax_test.dart
@@ -20,21 +20,21 @@
   AssistKind get kind => DartAssistKind.CONVERT_INTO_GENERIC_FUNCTION_SYNTAX;
 
   Future<void> test_functionTypeAlias_insideParameterList() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 typedef String F(int x, int y);
 ''');
     await assertNoAssistAt('x,');
   }
 
   Future<void> test_functionTypeAlias_noParameterTypes() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 typedef String F(x);
 ''');
     await assertNoAssistAt('def');
   }
 
   Future<void> test_functionTypeAlias_noReturnType_noTypeParameters() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 typedef String F(int x);
 ''');
     await assertHasAssistAt('def', '''
@@ -43,7 +43,7 @@
   }
 
   Future<void> test_functionTypeAlias_noReturnType_typeParameters() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 typedef F<P, R>(P x);
 ''');
     await assertHasAssistAt('def', '''
@@ -52,7 +52,7 @@
   }
 
   Future<void> test_functionTypeAlias_returnType_noTypeParameters() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 typedef String F(int x);
 ''');
     await assertHasAssistAt('def', '''
@@ -61,7 +61,7 @@
   }
 
   Future<void> test_functionTypeAlias_returnType_typeParameters() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 typedef R F<P, R>(P x);
 ''');
     await assertHasAssistAt('def', '''
@@ -70,14 +70,14 @@
   }
 
   Future<void> test_functionTypedParameter_insideParameterList() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 g(String f(int x, int y)) {}
 ''');
     await assertNoAssistAt('x,');
   }
 
   Future<void> test_functionTypedParameter_noParameterTypes() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 g(String f(x)) {}
 ''');
     await assertNoAssistAt('f(');
@@ -85,7 +85,7 @@
 
   Future<void>
       test_functionTypedParameter_noReturnType_noTypeParameters() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 g(f(int x)) {}
 ''');
     await assertHasAssistAt('f(', '''
@@ -94,7 +94,7 @@
   }
 
   Future<void> test_functionTypedParameter_returnType() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 g(String f(int x)) {}
 ''');
     await assertHasAssistAt('f(', '''
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_into_getter_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_into_getter_test.dart
index 48f5200..ffc7664 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/convert_into_getter_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_into_getter_test.dart
@@ -21,7 +21,7 @@
 
   Future<void> test_noInitializer() async {
     verifyNoTestUnitErrors = false;
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   final int foo;
 }
@@ -30,7 +30,7 @@
   }
 
   Future<void> test_notFinal() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   int foo = 1;
 }
@@ -39,7 +39,7 @@
   }
 
   Future<void> test_notSingleField() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   final int foo = 1, bar = 2;
 }
@@ -48,7 +48,7 @@
   }
 
   Future<void> test_noType() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   final foo = 42;
 }
@@ -61,7 +61,7 @@
   }
 
   Future<void> test_type() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 const myAnnotation = const Object();
 class A {
   @myAnnotation
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_into_is_not_empty_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_into_is_not_empty_test.dart
index 18b1e53..ce777b0 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/convert_into_is_not_empty_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_into_is_not_empty_test.dart
@@ -21,7 +21,7 @@
 
   Future<void> test_noBang() async {
     verifyNoTestUnitErrors = false;
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main(String str) {
   ~str.isEmpty;
 }
@@ -30,7 +30,7 @@
   }
 
   Future<void> test_noIsNotEmpty() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   bool get isEmpty => false;
 }
@@ -42,7 +42,7 @@
   }
 
   Future<void> test_notInPrefixExpression() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main(String str) {
   str.isEmpty;
 }
@@ -51,7 +51,7 @@
   }
 
   Future<void> test_notIsEmpty() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main(int p) {
   !p.isEven;
 }
@@ -60,7 +60,7 @@
   }
 
   Future<void> test_on_isEmpty() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main(String str) {
   !str.isEmpty;
 }
@@ -73,7 +73,7 @@
   }
 
   Future<void> test_on_str() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main(String str) {
   !str.isEmpty;
 }
@@ -86,7 +86,7 @@
   }
 
   Future<void> test_propertyAccess() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main(String str) {
   !'text'.isEmpty;
 }
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_into_is_not_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_into_is_not_test.dart
index a729944..5a68942 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/convert_into_is_not_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_into_is_not_test.dart
@@ -20,7 +20,7 @@
   AssistKind get kind => DartAssistKind.CONVERT_INTO_IS_NOT;
 
   Future<void> test_childOfIs_left() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main(p) {
   !(p is String);
 }
@@ -33,7 +33,7 @@
   }
 
   Future<void> test_childOfIs_right() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main(p) {
   !(p is String);
 }
@@ -46,7 +46,7 @@
   }
 
   Future<void> test_is() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main(p) {
   !(p is String);
 }
@@ -59,7 +59,7 @@
   }
 
   Future<void> test_is_alreadyIsNot() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main(p) {
   p is! String;
 }
@@ -68,7 +68,7 @@
   }
 
   Future<void> test_is_higherPrecedencePrefix() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main(p) {
   !!(p is String);
 }
@@ -81,7 +81,7 @@
   }
 
   Future<void> test_is_noEnclosingParenthesis() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main(p) {
   p is String;
 }
@@ -90,7 +90,7 @@
   }
 
   Future<void> test_is_noPrefix() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main(p) {
   (p is String);
 }
@@ -99,7 +99,7 @@
   }
 
   Future<void> test_is_not_higherPrecedencePrefix() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main(p) {
   !!(p is String);
 }
@@ -112,7 +112,7 @@
   }
 
   Future<void> test_is_notIsExpression() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main(p) {
   123 + 456;
 }
@@ -122,7 +122,7 @@
 
   Future<void> test_is_notTheNotOperator() async {
     verifyNoTestUnitErrors = false;
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main(p) {
   ++(p is String);
 }
@@ -131,7 +131,7 @@
   }
 
   Future<void> test_not() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main(p) {
   !(p is String);
 }
@@ -144,7 +144,7 @@
   }
 
   Future<void> test_not_alreadyIsNot() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main(p) {
   !(p is! String);
 }
@@ -153,7 +153,7 @@
   }
 
   Future<void> test_not_noEnclosingParenthesis() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main(p) {
   !p;
 }
@@ -162,7 +162,7 @@
   }
 
   Future<void> test_not_notIsExpression() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main(p) {
   !(p == null);
 }
@@ -172,7 +172,7 @@
 
   Future<void> test_not_notTheNotOperator() async {
     verifyNoTestUnitErrors = false;
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main(p) {
   ++(p is String);
 }
@@ -181,7 +181,7 @@
   }
 
   Future<void> test_parentheses() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main(p) {
   !(p is String);
 }
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_part_of_to_uri_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_part_of_to_uri_test.dart
index b09a195..4f99ef9 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/convert_part_of_to_uri_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_part_of_to_uri_test.dart
@@ -24,10 +24,14 @@
 library foo;
 part 'src/bar.dart';
 ''');
+
     testFile = convertPath('/home/test/lib/src/bar.dart');
-    await resolveTestUnit('''
+    addTestSource('''
 part of foo;
 ''');
+
+    await analyzeTestPackageFiles();
+    await resolveTestFile();
     await assertHasAssistAt('foo', '''
 part of '../foo.dart';
 ''');
@@ -38,10 +42,14 @@
 library foo;
 part 'bar.dart';
 ''');
+
     testFile = convertPath('/home/test/lib/bar.dart');
-    await resolveTestUnit('''
+    addTestSource('''
 part of foo;
 ''');
+
+    await analyzeTestPackageFiles();
+    await resolveTestFile();
     await assertHasAssistAt('foo', '''
 part of 'foo.dart';
 ''');
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_to_double_quoted_string_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_to_double_quoted_string_test.dart
index f031a25..6f8f3d2 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/convert_to_double_quoted_string_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_to_double_quoted_string_test.dart
@@ -20,7 +20,7 @@
   AssistKind get kind => DartAssistKind.CONVERT_TO_DOUBLE_QUOTED_STRING;
 
   Future<void> test_one_embeddedTarget() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   print('a"b"c');
 }
@@ -29,7 +29,7 @@
   }
 
   Future<void> test_one_enclosingTarget() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   print("abc");
 }
@@ -38,7 +38,7 @@
   }
 
   Future<void> test_one_interpolation() async {
-    await resolveTestUnit(r'''
+    await resolveTestCode(r'''
 main() {
   var b = 'b';
   var c = 'c';
@@ -55,7 +55,7 @@
   }
 
   Future<void> test_one_raw() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   print(r'abc');
 }
@@ -68,7 +68,7 @@
   }
 
   Future<void> test_one_simple() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   print('abc');
 }
@@ -81,7 +81,7 @@
   }
 
   Future<void> test_three_embeddedTarget() async {
-    await resolveTestUnit("""
+    await resolveTestCode("""
 main() {
   print('''a""\"c''');
 }
@@ -90,7 +90,7 @@
   }
 
   Future<void> test_three_enclosingTarget() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   print("""abc""");
 }
@@ -99,7 +99,7 @@
   }
 
   Future<void> test_three_interpolation() async {
-    await resolveTestUnit(r"""
+    await resolveTestCode(r"""
 main() {
   var b = 'b';
   var c = 'c';
@@ -116,7 +116,7 @@
   }
 
   Future<void> test_three_raw() async {
-    await resolveTestUnit("""
+    await resolveTestCode("""
 main() {
   print(r'''abc''');
 }
@@ -129,7 +129,7 @@
   }
 
   Future<void> test_three_simple() async {
-    await resolveTestUnit("""
+    await resolveTestCode("""
 main() {
   print('''abc''');
 }
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_to_field_parameter_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_to_field_parameter_test.dart
index 8ff735a..f616eab 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/convert_to_field_parameter_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_to_field_parameter_test.dart
@@ -20,7 +20,7 @@
   AssistKind get kind => DartAssistKind.CONVERT_TO_FIELD_PARAMETER;
 
   Future<void> test_additionalUse() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   int aaa2;
   int bbb2;
@@ -31,7 +31,7 @@
   }
 
   Future<void> test_firstInitializer() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   int aaa2;
   int bbb2;
@@ -48,7 +48,7 @@
   }
 
   Future<void> test_notPureAssignment() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   int aaa2;
   A(int aaa) : aaa2 = aaa * 2;
@@ -58,7 +58,7 @@
   }
 
   Future<void> test_onParameterName_inInitializer() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   int test2;
   A(int test) : test2 = test {
@@ -75,7 +75,7 @@
   }
 
   Future<void> test_onParameterName_inParameters() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   int test;
   A(int test) : test = test {
@@ -92,7 +92,7 @@
   }
 
   Future<void> test_secondInitializer() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   int aaa2;
   int bbb2;
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_to_for_element_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_to_for_element_test.dart
index 6a2da91..80cd6c1 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/convert_to_for_element_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_to_for_element_test.dart
@@ -21,7 +21,7 @@
   AssistKind get kind => DartAssistKind.CONVERT_TO_FOR_ELEMENT;
 
   Future<void> test_mapFromIterable_complexKey() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f(Iterable<int> i) {
   return Map.fromIt/*caret*/erable(i, key: (e) {
     var result = e * 2;
@@ -33,7 +33,7 @@
   }
 
   Future<void> test_mapFromIterable_complexValue() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f(Iterable<int> i) {
   return Map.fromIt/*caret*/erable(i, key: (e) => e * 2, value: (e) {
     var result = e  + 3;
@@ -46,7 +46,7 @@
 
   Future<void>
       test_mapFromIterable_differentParameterNames_usedInKey_conflictInValue() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f(Iterable<int> i) {
   var k = 3;
   return Map.fromIt/*caret*/erable(i, key: (k) => k * 2, value: (v) => k);
@@ -65,7 +65,7 @@
     createAnalysisOptionsFile(
         lints: [LintNames.prefer_for_elements_to_map_fromIterable]);
     verifyNoTestUnitErrors = false;
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f(Iterable<int> i) {
   var k = 3;
   return Map.fromIt/*caret*/erable(i, key: (k) => k * 2, value: (v) => k);
@@ -76,7 +76,7 @@
 
   Future<void>
       test_mapFromIterable_differentParameterNames_usedInKey_noConflictInValue() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f(Iterable<int> i) {
   return Map.fromIt/*caret*/erable(i, key: (k) => k * 2, value: (v) => 0);
 }
@@ -90,7 +90,7 @@
 
   Future<void>
       test_mapFromIterable_differentParameterNames_usedInKeyAndValue_conflictWithDefault() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f(Iterable<int> i) {
   var e = 2;
   return Map.fromIt/*caret*/erable(i, key: (k) => k * e, value: (v) => v + e);
@@ -106,7 +106,7 @@
 
   Future<void>
       test_mapFromIterable_differentParameterNames_usedInKeyAndValue_noConflictWithDefault() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f(Iterable<int> i) {
   return Map.fromIt/*caret*/erable(i, key: (k) => k * 2, value: (v) => v + 3);
 }
@@ -120,7 +120,7 @@
 
   Future<void>
       test_mapFromIterable_differentParameterNames_usedInValue_conflictInKey() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f(Iterable<int> i) {
   int v = 0;
   return Map.fromIt/*caret*/erable(i, key: (k) => v++, value: (v) => v * 10);
@@ -136,7 +136,7 @@
 
   Future<void>
       test_mapFromIterable_differentParameterNames_usedInValue_noConflictInKey() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f(Iterable<int> i) {
   int index = 0;
   return Map.fromIt/*caret*/erable(i, key: (k) => index++, value: (v) => v * 10);
@@ -151,7 +151,7 @@
   }
 
   Future<void> test_mapFromIterable_missingKey() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f(Iterable<int> i) {
   return Map.fromIt/*caret*/erable(i, value: (e) => e + 3);
 }
@@ -160,7 +160,7 @@
   }
 
   Future<void> test_mapFromIterable_missingKeyAndValue() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f(Iterable<int> i) {
   return Map.fromIt/*caret*/erable(i);
 }
@@ -169,7 +169,7 @@
   }
 
   Future<void> test_mapFromIterable_missingValue() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f(Iterable<int> i) {
   return Map.fromIt/*caret*/erable(i, key: (e) => e * 2);
 }
@@ -178,7 +178,7 @@
   }
 
   Future<void> test_mapFromIterable_notMapFromIterable() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f(Iterable<int> i) {
   return A.fromIt/*caret*/erable(i, key: (e) => e * 2, value: (e) => e + 3);
 }
@@ -190,7 +190,7 @@
   }
 
   Future<void> test_mapFromIterable_sameParameterNames() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f(Iterable<int> i) {
   return Map.fromIt/*caret*/erable(i, key: (e) => e * 2, value: (e) => e + 3);
 }
@@ -204,7 +204,7 @@
 
   Future<void> test_undefinedConstructor() async {
     verifyNoTestUnitErrors = false;
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f() {
   return new Unde/*caret*/fined();
 }
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_to_if_element_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_to_if_element_test.dart
index f59eb2a..b277e60 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/convert_to_if_element_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_to_if_element_test.dart
@@ -21,7 +21,7 @@
   AssistKind get kind => DartAssistKind.CONVERT_TO_IF_ELEMENT;
 
   Future<void> test_conditional_list() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f(bool b) {
   return ['a', b /*caret*/? 'c' : 'd', 'e'];
 }
@@ -34,7 +34,7 @@
   }
 
   Future<void> test_conditional_list_caret_at_start_of_expression() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f(bool b) {
   return ['a', /*caret*/b ? 'c' : 'd', 'e'];
 }
@@ -50,7 +50,7 @@
     createAnalysisOptionsFile(
         lints: [LintNames.prefer_if_elements_to_conditional_expressions]);
     verifyNoTestUnitErrors = false;
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f(bool b) {
   return ['a', b /*caret*/? 'c' : 'd', 'e'];
 }
@@ -59,7 +59,7 @@
   }
 
   Future<void> test_conditional_list_withParentheses() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f(bool b) {
   return ['a', (b /*caret*/? 'c' : 'd'), 'e'];
 }
@@ -72,7 +72,7 @@
   }
 
   Future<void> test_conditional_map() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f(bool b) {
   return {'a' : 1, b /*caret*/? 'c' : 'd' : 2, 'e' : 3};
 }
@@ -81,7 +81,7 @@
   }
 
   Future<void> test_conditional_notConditional() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f(bool b) {
   return {'/*caret*/a', b ? 'c' : 'd', 'e'};
 }
@@ -90,7 +90,7 @@
   }
 
   Future<void> test_conditional_notInLiteral() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f(bool b) {
   return b /*caret*/? 'c' : 'd';
 }
@@ -99,7 +99,7 @@
   }
 
   Future<void> test_conditional_set() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f(bool b) {
   return {'a', b /*caret*/? 'c' : 'd', 'e'};
 }
@@ -112,7 +112,7 @@
   }
 
   Future<void> test_conditional_set_withParentheses() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f(bool b) {
   return {'a', ((b /*caret*/? 'c' : 'd')), 'e'};
 }
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_to_int_literal_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_to_int_literal_test.dart
index ae6bb6c..919ab32 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/convert_to_int_literal_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_to_int_literal_test.dart
@@ -21,7 +21,7 @@
   AssistKind get kind => DartAssistKind.CONVERT_TO_INT_LITERAL;
 
   Future<void> test_decimal() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 const double myDouble = /*caret*/42.0;
 ''');
     await assertHasAssist('''
@@ -32,21 +32,21 @@
   Future<void> test_decimal_noAssistWithLint() async {
     createAnalysisOptionsFile(lints: [LintNames.prefer_int_literals]);
     verifyNoTestUnitErrors = false;
-    await resolveTestUnit('''
+    await resolveTestCode('''
 const double myDouble = /*caret*/42.0;
 ''');
     await assertNoAssist();
   }
 
   Future<void> test_notDouble() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 const double myDouble = /*caret*/42;
 ''');
     await assertNoAssist();
   }
 
   Future<void> test_scientific() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 const double myDouble = /*caret*/4.2e1;
 ''');
     await assertHasAssist('''
@@ -55,7 +55,7 @@
   }
 
   Future<void> test_tooBig() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 const double myDouble = /*caret*/4.2e99999;
 ''');
     await assertNoAssist();
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_to_list_literal_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_to_list_literal_test.dart
index 71a49aa..880a6f1 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/convert_to_list_literal_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_to_list_literal_test.dart
@@ -20,7 +20,7 @@
   AssistKind get kind => DartAssistKind.CONVERT_TO_LIST_LITERAL;
 
   Future<void> test_default_declaredType() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 List l = Li/*caret*/st();
 ''');
     await assertHasAssist('''
@@ -29,7 +29,7 @@
   }
 
   Future<void> test_default_minimal() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var l = Li/*caret*/st();
 ''');
     await assertHasAssist('''
@@ -38,7 +38,7 @@
   }
 
   Future<void> test_default_newKeyword() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var l = new Li/*caret*/st();
 ''');
     await assertHasAssist('''
@@ -47,14 +47,14 @@
   }
 
   Future<void> test_default_tooManyArguments() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var l = Li/*caret*/st(5);
 ''');
     await assertNoAssist();
   }
 
   Future<void> test_default_typeArg() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var l = Li/*caret*/st<int>();
 ''');
     await assertHasAssist('''
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_to_map_literal_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_to_map_literal_test.dart
index 22549b0..9b6b24b 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/convert_to_map_literal_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_to_map_literal_test.dart
@@ -20,7 +20,7 @@
   AssistKind get kind => DartAssistKind.CONVERT_TO_MAP_LITERAL;
 
   Future<void> test_default_declaredType() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 Map m = Ma/*caret*/p();
 ''');
     await assertHasAssist('''
@@ -29,7 +29,7 @@
   }
 
   Future<void> test_default_linkedHashMap() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'dart:collection';
 var m = LinkedHashMa/*caret*/p();
 ''');
@@ -40,7 +40,7 @@
   }
 
   Future<void> test_default_minimal() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var m = Ma/*caret*/p();
 ''');
     await assertHasAssist('''
@@ -49,7 +49,7 @@
   }
 
   Future<void> test_default_newKeyword() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var m = new Ma/*caret*/p();
 ''');
     await assertHasAssist('''
@@ -58,7 +58,7 @@
   }
 
   Future<void> test_default_typeArg() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var m = Ma/*caret*/p<String, int>();
 ''');
     await assertHasAssist('''
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_to_multiline_string_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_to_multiline_string_test.dart
index 66fd199..316515d 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/convert_to_multiline_string_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_to_multiline_string_test.dart
@@ -20,7 +20,7 @@
   AssistKind get kind => DartAssistKind.CONVERT_TO_MULTILINE_STRING;
 
   Future<void> test_doubleQuoted() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   print("abc");
 }
@@ -34,7 +34,7 @@
   }
 
   Future<void> test_doubleQuoted_alreadyMultiline() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   print("""abc""");
 }
@@ -43,7 +43,7 @@
   }
 
   Future<void> test_doubleQuoted_interpolation_expressionElement() async {
-    await resolveTestUnit(r"""
+    await resolveTestCode(r"""
 main() {
   var b = 'b';
   var c = 'c';
@@ -54,7 +54,7 @@
   }
 
   Future<void> test_doubleQuoted_interpolation_stringElement_begin() async {
-    await resolveTestUnit(r"""
+    await resolveTestCode(r"""
 main() {
   var b = 'b';
   var c = 'c';
@@ -72,7 +72,7 @@
   }
 
   Future<void> test_doubleQuoted_interpolation_stringElement_middle() async {
-    await resolveTestUnit(r"""
+    await resolveTestCode(r"""
 main() {
   var b = 'b';
   var c = 'c';
@@ -90,7 +90,7 @@
   }
 
   Future<void> test_doubleQuoted_raw() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   print(r"abc");
 }
@@ -104,7 +104,7 @@
   }
 
   Future<void> test_singleQuoted() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   print('abc');
 }
@@ -118,7 +118,7 @@
   }
 
   Future<void> test_singleQuoted_interpolation_expressionElement() async {
-    await resolveTestUnit(r"""
+    await resolveTestCode(r"""
 main() {
   var b = 'b';
   var c = 'c';
@@ -129,7 +129,7 @@
   }
 
   Future<void> test_singleQuoted_interpolation_stringElement_begin() async {
-    await resolveTestUnit(r"""
+    await resolveTestCode(r"""
 main() {
   var b = 'b';
   var c = 'c';
@@ -147,7 +147,7 @@
   }
 
   Future<void> test_singleQuoted_interpolation_stringElement_middle() async {
-    await resolveTestUnit(r"""
+    await resolveTestCode(r"""
 main() {
   var b = 'b';
   var c = 'c';
@@ -165,7 +165,7 @@
   }
 
   Future<void> test_singleQuoted_raw() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   print(r'abc');
 }
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_to_normal_parameter_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_to_normal_parameter_test.dart
index cdbf63e..90973a6 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/convert_to_normal_parameter_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_to_normal_parameter_test.dart
@@ -20,7 +20,7 @@
   AssistKind get kind => DartAssistKind.CONVERT_TO_NORMAL_PARAMETER;
 
   Future<void> test_dynamic() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   var test;
   A(this.test) {
@@ -37,7 +37,7 @@
   }
 
   Future<void> test_firstInitializer() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   int test;
   A(this.test) {
@@ -54,7 +54,7 @@
   }
 
   Future<void> test_secondInitializer() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   double aaa;
   int bbb;
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_to_null_aware_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_to_null_aware_test.dart
index 47027ee..d12dd4c 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/convert_to_null_aware_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_to_null_aware_test.dart
@@ -21,7 +21,7 @@
   AssistKind get kind => DartAssistKind.CONVERT_TO_NULL_AWARE;
 
   Future<void> test_equal_differentTarget() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 abstract class A {
   int m();
 }
@@ -31,7 +31,7 @@
   }
 
   Future<void> test_equal_notComparedToNull() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 abstract class A {
   int m();
 }
@@ -41,7 +41,7 @@
   }
 
   Future<void> test_equal_notIdentifier() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 abstract class A {
   int m();
 }
@@ -51,7 +51,7 @@
   }
 
   Future<void> test_equal_notInvocation() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 abstract class A {
   int m();
   int operator +(A a);
@@ -62,7 +62,7 @@
   }
 
   Future<void> test_equal_notNullPreserving() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 abstract class A {
   int m();
 }
@@ -72,7 +72,7 @@
   }
 
   Future<void> test_equal_notPeriod() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 abstract class A {
   int m();
 }
@@ -82,7 +82,7 @@
   }
 
   Future<void> test_equal_nullOnLeft() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 abstract class A {
   int m();
 }
@@ -99,7 +99,7 @@
   Future<void> test_equal_nullOnLeft_noAssistWithLint() async {
     createAnalysisOptionsFile(lints: [LintNames.prefer_null_aware_operators]);
     verifyNoTestUnitErrors = false;
-    await resolveTestUnit('''
+    await resolveTestCode('''
 abstract class A {
   int m();
 }
@@ -109,7 +109,7 @@
   }
 
   Future<void> test_equal_nullOnRight() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 abstract class A {
   int m();
 }
@@ -124,7 +124,7 @@
   }
 
   Future<void> test_equal_prefixedIdentifier() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   int p;
 }
@@ -139,7 +139,7 @@
   }
 
   Future<void> test_notEqual_notNullPreserving() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 abstract class A {
   int m();
 }
@@ -149,7 +149,7 @@
   }
 
   Future<void> test_notEqual_nullOnLeft() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 abstract class A {
   int m();
 }
@@ -164,7 +164,7 @@
   }
 
   Future<void> test_notEqual_nullOnRight() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 abstract class A {
   int m();
 }
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_to_package_import_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_to_package_import_test.dart
index db35739..95807a2 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/convert_to_package_import_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_to_package_import_test.dart
@@ -23,7 +23,7 @@
   Future<void> test_fileName_onImport() async {
     addSource('/home/test/lib/foo.dart', '');
 
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'foo.dart';
 ''');
     // Validate assist is on import keyword too.
@@ -35,7 +35,7 @@
   Future<void> test_fileName_onUri() async {
     addSource('/home/test/lib/foo.dart', '');
 
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'foo.dart';
 ''');
     await assertHasAssistAt('foo.dart', '''
@@ -45,7 +45,7 @@
 
   Future<void> test_invalidUri() async {
     verifyNoTestUnitErrors = false;
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import ':[invalidUri]';
 ''');
     await assertNoAssistAt('invalid');
@@ -54,7 +54,7 @@
   Future<void> test_nonPackage_Uri() async {
     addSource('/home/test/lib/foo.dart', '');
     testFile = convertPath('/home/test/lib/src/test.dart');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'dart:core';
 ''');
 
@@ -65,7 +65,7 @@
   Future<void> test_packageUri() async {
     addSource('/home/test/lib/foo.dart', '');
 
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:test/foo.dart';
 ''');
     await assertNoAssistAt('foo.dart');
@@ -77,7 +77,7 @@
 
     testFile = convertPath('/home/test/lib/src/test.dart');
 
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '../foo/bar.dart';
 ''');
     await assertHasAssistAt('bar.dart', '''
@@ -90,7 +90,7 @@
     verifyNoTestUnitErrors = false;
     addSource('/home/test/lib/foo.dart', '');
 
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '../lib/foo.dart';
 ''');
     await assertNoAssist();
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_to_set_literal_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_to_set_literal_test.dart
index 1480548..76079f7 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/convert_to_set_literal_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_to_set_literal_test.dart
@@ -20,7 +20,7 @@
   AssistKind get kind => DartAssistKind.CONVERT_TO_SET_LITERAL;
 
   Future<void> test_default_declaredType() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 Set s = S/*caret*/et();
 ''');
     await assertHasAssist('''
@@ -29,7 +29,7 @@
   }
 
   Future<void> test_default_minimal() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var s = S/*caret*/et();
 ''');
     await assertHasAssist('''
@@ -38,7 +38,7 @@
   }
 
   Future<void> test_default_newKeyword() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var s = new S/*caret*/et();
 ''');
     await assertHasAssist('''
@@ -47,7 +47,7 @@
   }
 
   Future<void> test_default_typeArg() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var s = S/*caret*/et<int>();
 ''');
     await assertHasAssist('''
@@ -56,7 +56,7 @@
   }
 
   Future<void> test_from_empty() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var s = S/*caret*/et.from([]);
 ''');
     await assertHasAssist('''
@@ -65,7 +65,7 @@
   }
 
   Future<void> test_from_newKeyword() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var s = new S/*caret*/et.from([2, 3]);
 ''');
     await assertHasAssist('''
@@ -74,7 +74,7 @@
   }
 
   Future<void> test_from_noKeyword_declaredType() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 Set s = S/*caret*/et.from([2, 3]);
 ''');
     await assertHasAssist('''
@@ -83,7 +83,7 @@
   }
 
   Future<void> test_from_noKeyword_typeArg_onConstructor() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var s = S/*caret*/et<int>.from([2, 3]);
 ''');
     await assertHasAssist('''
@@ -92,7 +92,7 @@
   }
 
   Future<void> test_from_noKeyword_typeArg_onConstructorAndLiteral() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var s = S/*caret*/et<int>.from(<num>[2, 3]);
 ''');
     await assertHasAssist('''
@@ -101,7 +101,7 @@
   }
 
   Future<void> test_from_noKeyword_typeArg_onLiteral() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var s = S/*caret*/et.from(<int>[2, 3]);
 ''');
     await assertHasAssist('''
@@ -110,7 +110,7 @@
   }
 
   Future<void> test_from_nonEmpty() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var s = S/*caret*/et.from([2, 3]);
 ''');
     await assertHasAssist('''
@@ -119,7 +119,7 @@
   }
 
   Future<void> test_from_notALiteral() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var l = [1];
 Set s = new S/*caret*/et.from(l);
 ''');
@@ -127,7 +127,7 @@
   }
 
   Future<void> test_from_trailingComma() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var s = S/*caret*/et.from([2, 3,]);
 ''');
     await assertHasAssist('''
@@ -136,7 +136,7 @@
   }
 
   Future<void> test_toSet_empty() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var s = [].to/*caret*/Set();
 ''');
     await assertHasAssist('''
@@ -145,7 +145,7 @@
   }
 
   Future<void> test_toSet_empty_typeArg() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var s = <int>[].to/*caret*/Set();
 ''');
     await assertHasAssist('''
@@ -154,7 +154,7 @@
   }
 
   Future<void> test_toSet_nonEmpty() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var s = [2, 3].to/*caret*/Set();
 ''');
     await assertHasAssist('''
@@ -163,7 +163,7 @@
   }
 
   Future<void> test_toSet_nonEmpty_typeArg() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var s = <int>[2, 3].to/*caret*/Set();
 ''');
     await assertHasAssist('''
@@ -172,7 +172,7 @@
   }
 
   Future<void> test_toSet_notALiteral() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var l = [];
 var s = l.to/*caret*/Set();
 ''');
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_to_single_quoted_string_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_to_single_quoted_string_test.dart
index 35bb812..9e925c0 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/convert_to_single_quoted_string_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_to_single_quoted_string_test.dart
@@ -21,7 +21,7 @@
   AssistKind get kind => DartAssistKind.CONVERT_TO_SINGLE_QUOTED_STRING;
 
   Future<void> test_one_embeddedTarget() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   print("a'b'c");
 }
@@ -30,7 +30,7 @@
   }
 
   Future<void> test_one_enclosingTarget() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   print('abc');
 }
@@ -39,7 +39,7 @@
   }
 
   Future<void> test_one_interpolation() async {
-    await resolveTestUnit(r'''
+    await resolveTestCode(r'''
 main() {
   var b = 'b';
   var c = 'c';
@@ -56,7 +56,7 @@
   }
 
   Future<void> test_one_raw() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   print(r"abc");
 }
@@ -69,7 +69,7 @@
   }
 
   Future<void> test_one_simple() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   print("abc");
 }
@@ -84,7 +84,7 @@
   Future<void> test_one_simple_noAssistWithLint() async {
     createAnalysisOptionsFile(lints: [LintNames.prefer_single_quotes]);
     verifyNoTestUnitErrors = false;
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   print("abc");
 }
@@ -93,7 +93,7 @@
   }
 
   Future<void> test_three_embeddedTarget() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   print("""a''\'bc""");
 }
@@ -102,7 +102,7 @@
   }
 
   Future<void> test_three_enclosingTarget() async {
-    await resolveTestUnit("""
+    await resolveTestCode("""
 main() {
   print('''abc''');
 }
@@ -111,7 +111,7 @@
   }
 
   Future<void> test_three_interpolation() async {
-    await resolveTestUnit(r'''
+    await resolveTestCode(r'''
 main() {
   var b = 'b';
   var c = 'c';
@@ -128,7 +128,7 @@
   }
 
   Future<void> test_three_raw() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   print(r"""abc""");
 }
@@ -141,7 +141,7 @@
   }
 
   Future<void> test_three_simple() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   print("""abc""");
 }
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_to_spread_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_to_spread_test.dart
index e577bef..dc43575 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/convert_to_spread_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_to_spread_test.dart
@@ -21,7 +21,7 @@
   AssistKind get kind => DartAssistKind.CONVERT_TO_SPREAD;
 
   Future<void> test_addAll_condition_const() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 bool condition;
 var things;
 var l = ['a']..add/*caret*/All(condition ? things : const []);
@@ -34,7 +34,7 @@
   }
 
   Future<void> test_addAll_condition_nonConst() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 bool condition;
 var things;
 var l = ['a']..add/*caret*/All(condition ? things : []);
@@ -47,7 +47,7 @@
   }
 
   Future<void> test_addAll_expression() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f() {
   var ints = [1, 2, 3];
   print(['a']..addAl/*caret*/l(ints.map((i) => i.toString()))..addAll(['c']));
@@ -64,7 +64,7 @@
   Future<void> test_addAll_expression_noAssistWithLint() async {
     createAnalysisOptionsFile(lints: [LintNames.prefer_spread_collections]);
     verifyNoTestUnitErrors = false;
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f() {
   var ints = [1, 2, 3];
   print(['a']..addAl/*caret*/l(ints.map((i) => i.toString()))..addAll(['c']));
@@ -74,7 +74,7 @@
   }
 
   Future<void> test_addAll_expression_toEmptyList() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f() {
   var ints = [1, 2, 3];
   print([]..addAl/*caret*/l(ints.map((i) => i.toString()))..addAll(['c']));
@@ -90,14 +90,14 @@
 
   Future<void> test_addAll_literal() async {
     // This case is covered by the INLINE_INVOCATION assist.
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var l = ['a']..add/*caret*/All(['b'])..addAll(['c']);
 ''');
     await assertNoAssist();
   }
 
   Future<void> test_addAll_nonLiteralTarget() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var l1 = [];
 var l2 = l1..addAl/*caret*/l(['b'])..addAll(['c']);
 ''');
@@ -105,14 +105,14 @@
   }
 
   Future<void> test_addAll_notFirst() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var l = ['a']..addAll(['b'])../*caret*/addAll(['c']);
 ''');
     await assertNoAssist();
   }
 
   Future<void> test_addAll_nullAware_const() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var things;
 var l = ['a']..add/*caret*/All(things ?? const []);
 ''');
@@ -123,7 +123,7 @@
   }
 
   Future<void> test_addAll_nullAware_nonConst() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var things;
 var l = ['a']..add/*caret*/All(things ?? []);
 ''');
diff --git a/pkg/analysis_server/test/src/services/correction/assist/encapsulate_field_test.dart b/pkg/analysis_server/test/src/services/correction/assist/encapsulate_field_test.dart
index 55e1bcb..3ab99bf 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/encapsulate_field_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/encapsulate_field_test.dart
@@ -20,7 +20,7 @@
   AssistKind get kind => DartAssistKind.ENCAPSULATE_FIELD;
 
   Future<void> test_alreadyPrivate() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   int _test = 42;
 }
@@ -32,7 +32,7 @@
   }
 
   Future<void> test_documentation() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   /// AAA
   /// BBB
@@ -59,7 +59,7 @@
   }
 
   Future<void> test_final() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   final int test = 42;
 }
@@ -68,7 +68,7 @@
   }
 
   Future<void> test_hasType() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   int test = 42;
   A(this.test);
@@ -95,7 +95,7 @@
   }
 
   Future<void> test_multipleFields() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   int aaa, bbb, ccc;
 }
@@ -107,7 +107,7 @@
   }
 
   Future<void> test_notOnName() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   int test = 1 + 2 + 3;
 }
@@ -116,7 +116,7 @@
   }
 
   Future<void> test_noType() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   var test = 42;
 }
@@ -142,7 +142,7 @@
 
   Future<void> test_parseError() async {
     verifyNoTestUnitErrors = false;
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   int; // marker
 }
@@ -154,7 +154,7 @@
   }
 
   Future<void> test_static() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   static int test = 42;
 }
diff --git a/pkg/analysis_server/test/src/services/correction/assist/exchange_operands_test.dart b/pkg/analysis_server/test/src/services/correction/assist/exchange_operands_test.dart
index dfd234c..c5921f3 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/exchange_operands_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/exchange_operands_test.dart
@@ -25,7 +25,7 @@
     for (var i = 0; i <= 0; i++) {
       var initialOperator = initialOperators[i];
       var resultOperator = resultOperators[i];
-      await resolveTestUnit('''
+      await resolveTestCode('''
 bool main(int a, int b) {
   return a $initialOperator b;
 }
@@ -39,7 +39,7 @@
   }
 
   Future<void> test_extended_mixOperator_1() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   1 * 2 * 3 + 4;
 }
@@ -52,7 +52,7 @@
   }
 
   Future<void> test_extended_mixOperator_2() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   1 + 2 - 3 + 4;
 }
@@ -65,7 +65,7 @@
   }
 
   Future<void> test_extended_sameOperator_afterFirst() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   1 + 2 + 3;
 }
@@ -78,7 +78,7 @@
   }
 
   Future<void> test_extended_sameOperator_afterSecond() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   1 + 2 + 3;
 }
@@ -91,7 +91,7 @@
   }
 
   Future<void> test_extraLength() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   111 + 222;
 }
@@ -100,7 +100,7 @@
   }
 
   Future<void> test_onOperand() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   111 + 222;
 }
@@ -109,7 +109,7 @@
   }
 
   Future<void> test_selectionWithBinary() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   1 + 2 + 3;
 }
@@ -118,7 +118,7 @@
   }
 
   Future<void> test_simple_afterOperator() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   1 + 2;
 }
@@ -131,7 +131,7 @@
   }
 
   Future<void> test_simple_beforeOperator() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   1 + 2;
 }
@@ -144,7 +144,7 @@
   }
 
   Future<void> test_simple_fullSelection() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   1 + 2;
 }
@@ -160,7 +160,7 @@
   }
 
   Future<void> test_simple_withLength() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   1 + 2;
 }
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_convert_to_children_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_convert_to_children_test.dart
index b34b23d..1bac364 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_convert_to_children_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_convert_to_children_test.dart
@@ -19,10 +19,17 @@
   @override
   AssistKind get kind => DartAssistKind.FLUTTER_CONVERT_TO_CHILDREN;
 
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(
+      flutter: true,
+    );
+  }
+
   Future<void> test_childUnresolved() async {
-    addFlutterPackage();
     verifyNoTestUnitErrors = false;
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 build() {
   return Row(
@@ -34,8 +41,7 @@
   }
 
   Future<void> test_multiLine() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 build() {
   return Scaffold(
@@ -69,8 +75,8 @@
 
   Future<void> test_newlineChild() async {
     // This case could occur with deeply nested constructors, common in Flutter.
-    addFlutterPackage();
-    await resolveTestUnit('''
+
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 build() {
   return Scaffold(
@@ -104,8 +110,7 @@
   }
 
   Future<void> test_notOnChild() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 build() {
   return Scaffold(
@@ -119,8 +124,7 @@
   }
 
   Future<void> test_singleLine() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 build() {
   return Scaffold(
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_convert_to_stateful_widget_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_convert_to_stateful_widget_test.dart
index d239e4b..426fa2b 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_convert_to_stateful_widget_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_convert_to_stateful_widget_test.dart
@@ -19,9 +19,16 @@
   @override
   AssistKind get kind => DartAssistKind.FLUTTER_CONVERT_TO_STATEFUL_WIDGET;
 
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(
+      flutter: true,
+    );
+  }
+
   Future<void> test_empty() async {
-    addFlutterPackage();
-    await resolveTestUnit(r'''
+    await resolveTestCode(r'''
 import 'package:flutter/material.dart';
 
 class /*caret*/MyWidget extends StatelessWidget {
@@ -49,8 +56,7 @@
   }
 
   Future<void> test_empty_typeParam() async {
-    addFlutterPackage();
-    await resolveTestUnit(r'''
+    await resolveTestCode(r'''
 import 'package:flutter/material.dart';
 
 class /*caret*/MyWidget<T> extends StatelessWidget {
@@ -78,8 +84,7 @@
   }
 
   Future<void> test_fields() async {
-    addFlutterPackage();
-    await resolveTestUnit(r'''
+    await resolveTestCode(r'''
 import 'package:flutter/material.dart';
 
 class /*caret*/MyWidget extends StatelessWidget {
@@ -159,8 +164,7 @@
   }
 
   Future<void> test_getters() async {
-    addFlutterPackage();
-    await resolveTestUnit(r'''
+    await resolveTestCode(r'''
 import 'package:flutter/material.dart';
 
 class /*caret*/MyWidget extends StatelessWidget {
@@ -218,8 +222,7 @@
   }
 
   Future<void> test_methods() async {
-    addFlutterPackage();
-    await resolveTestUnit(r'''
+    await resolveTestCode(r'''
 import 'package:flutter/material.dart';
 
 class /*caret*/MyWidget extends StatelessWidget {
@@ -308,8 +311,7 @@
   }
 
   Future<void> test_notClass() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 /*caret*/main() {}
 ''');
@@ -317,8 +319,7 @@
   }
 
   Future<void> test_notStatelessWidget() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 class /*caret*/MyWidget extends Text {
   MyWidget() : super('');
@@ -328,8 +329,7 @@
   }
 
   Future<void> test_notWidget() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 class /*caret*/MyWidget {}
 ''');
@@ -337,8 +337,7 @@
   }
 
   Future<void> test_simple() async {
-    addFlutterPackage();
-    await resolveTestUnit(r'''
+    await resolveTestCode(r'''
 import 'package:flutter/material.dart';
 
 class /*caret*/MyWidget extends StatelessWidget {
@@ -390,8 +389,7 @@
   }
 
   Future<void> test_tail() async {
-    addFlutterPackage();
-    await resolveTestUnit(r'''
+    await resolveTestCode(r'''
 import 'package:flutter/material.dart';
 
 class /*caret*/MyWidget extends StatelessWidget {
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_move_down_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_move_down_test.dart
index ee427b0..3ed98b5 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_move_down_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_move_down_test.dart
@@ -19,9 +19,16 @@
   @override
   AssistKind get kind => DartAssistKind.FLUTTER_MOVE_DOWN;
 
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(
+      flutter: true,
+    );
+  }
+
   Future<void> test_first() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 main() {
   Column(
@@ -49,8 +56,7 @@
   }
 
   Future<void> test_last() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 main() {
   Column(
@@ -66,8 +72,7 @@
   }
 
   Future<void> test_notInList() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 main() {
   Center(
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_move_up_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_move_up_test.dart
index a88b498..905d316 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_move_up_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_move_up_test.dart
@@ -19,9 +19,16 @@
   @override
   AssistKind get kind => DartAssistKind.FLUTTER_MOVE_UP;
 
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(
+      flutter: true,
+    );
+  }
+
   Future<void> test_first() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 main() {
   Column(
@@ -37,8 +44,7 @@
   }
 
   Future<void> test_last() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 main() {
   Column(
@@ -66,8 +72,7 @@
   }
 
   Future<void> test_notInList() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 main() {
   Center(
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_remove_widget_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_remove_widget_test.dart
index fce863a..f6ed88f 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_remove_widget_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_remove_widget_test.dart
@@ -19,9 +19,16 @@
   @override
   AssistKind get kind => DartAssistKind.FLUTTER_REMOVE_WIDGET;
 
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(
+      flutter: true,
+    );
+  }
+
   Future<void> test_childIntoChild_multiLine() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 main() {
   Column(
@@ -57,8 +64,7 @@
   }
 
   Future<void> test_childIntoChild_singleLine() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 main() {
   Padding(
@@ -82,8 +88,7 @@
   }
 
   Future<void> test_childIntoChildren() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 main() {
   Column(
@@ -119,8 +124,7 @@
   }
 
   Future<void> test_childrenMultipleIntoChild() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 main() {
   Center(
@@ -137,8 +141,7 @@
   }
 
   Future<void> test_childrenOneIntoChild() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 main() {
   Center(
@@ -161,8 +164,7 @@
   }
 
   Future<void> test_childrenOneIntoReturn() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 main() {
   return /*caret*/Column(
@@ -181,8 +183,7 @@
   }
 
   Future<void> test_intoChildren() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 main() {
   Column(
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_surround_with_set_state_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_surround_with_set_state_test.dart
index 35dac67..d13bb22 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_surround_with_set_state_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_surround_with_set_state_test.dart
@@ -19,15 +19,39 @@
   @override
   AssistKind get kind => DartAssistKind.SURROUND_WITH_SET_STATE;
 
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(
+      flutter: true,
+    );
+  }
+
+  Future<void> test_noParentNode() async {
+    // This code selects the `CompilationUnit` node which has previously
+    // caused errors in code assuming the node would have a parent.
+    await resolveTestCode('''
+main() {
+// start
+  print(0);
+}
+
+other() {
+  print(1);
+// end
+}
+''');
+    await assertNoAssist();
+  }
+
   Future<void> test_outsideState() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/widgets.dart';
 
 class Stateless {
   int _count1;
   int _count2;
-  
+
   void increment() {
 // start
     ++_count1;
@@ -40,8 +64,7 @@
   }
 
   Future<void> test_stateSubclass() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/widgets.dart';
 
 class MyState extends State {
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_swap_with_child_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_swap_with_child_test.dart
index 0228ef0..babc107 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_swap_with_child_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_swap_with_child_test.dart
@@ -19,9 +19,16 @@
   @override
   AssistKind get kind => DartAssistKind.FLUTTER_SWAP_WITH_CHILD;
 
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(
+      flutter: true,
+    );
+  }
+
   Future<void> test_aroundCenter() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 build() {
   return Scaffold(
@@ -60,8 +67,7 @@
   }
 
   Future<void> test_notFormatted() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 
 class Foo extends StatefulWidget {
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_swap_with_parent_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_swap_with_parent_test.dart
index dd3ce14..197470b 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_swap_with_parent_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_swap_with_parent_test.dart
@@ -19,9 +19,16 @@
   @override
   AssistKind get kind => DartAssistKind.FLUTTER_SWAP_WITH_PARENT;
 
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(
+      flutter: true,
+    );
+  }
+
   Future<void> test_inCenter() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 build() {
   return Scaffold(
@@ -60,8 +67,7 @@
   }
 
   Future<void> test_notFormatted() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 
 class Foo extends StatefulWidget {
@@ -111,8 +117,7 @@
   }
 
   Future<void> test_outerIsInChildren() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 main() {
   Column(
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_center_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_center_test.dart
index 752cc43..877ffb7 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_center_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_center_test.dart
@@ -19,9 +19,16 @@
   @override
   AssistKind get kind => DartAssistKind.FLUTTER_WRAP_CENTER;
 
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(
+      flutter: true,
+    );
+  }
+
   Future<void> test_aroundCenter() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/widgets.dart';
 class FakeFlutter {
   main() {
@@ -33,8 +40,7 @@
   }
 
   Future<void> test_aroundContainer() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/widgets.dart';
 class FakeFlutter {
   main() {
@@ -53,8 +59,7 @@
   }
 
   Future<void> test_aroundNamedConstructor() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/widgets.dart';
 
 class MyWidget extends StatelessWidget {
@@ -83,8 +88,7 @@
   }
 
   Future<void> test_assignment() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/widgets.dart';
 
 main() {
@@ -103,8 +107,7 @@
   }
 
   Future<void> test_expressionFunctionBody() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/widgets.dart';
 class FakeFlutter {
   main() => /*caret*/Container();
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_column_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_column_test.dart
index c16385a..fc79cb7 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_column_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_column_test.dart
@@ -19,9 +19,16 @@
   @override
   AssistKind get kind => DartAssistKind.FLUTTER_WRAP_COLUMN;
 
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(
+      flutter: true,
+    );
+  }
+
   Future<void> test_controlFlowCollections_if() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/widgets.dart';
 
 Widget build(bool b) {
@@ -54,8 +61,7 @@
   }
 
   Future<void> test_coveredByWidget() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/widgets.dart';
 
 class FakeFlutter {
@@ -84,8 +90,7 @@
   }
 
   Future<void> test_coversWidgets() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/widgets.dart';
 
 class FakeFlutter {
@@ -122,8 +127,7 @@
   }
 
   Future<void> test_endOfWidgetName() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/widgets.dart';
 
 class FakeFlutter {
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_container_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_container_test.dart
index 26e88f7..04702fa 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_container_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_container_test.dart
@@ -19,9 +19,16 @@
   @override
   AssistKind get kind => DartAssistKind.FLUTTER_WRAP_CONTAINER;
 
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(
+      flutter: true,
+    );
+  }
+
   Future<void> test_aroundContainer() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/widgets.dart';
 main() {
   return /*caret*/Container();
@@ -31,8 +38,7 @@
   }
 
   Future<void> test_aroundText() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/widgets.dart';
 main() {
   /*caret*/Text('a');
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_generic_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_generic_test.dart
index 794cc11..e8df73f 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_generic_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_generic_test.dart
@@ -19,17 +19,23 @@
   @override
   AssistKind get kind => DartAssistKind.FLUTTER_WRAP_GENERIC;
 
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(
+      flutter: true,
+    );
+  }
+
   Future<void> test_minimal() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
+    await resolveTestCode('''
 /*caret*/x(){}
 ''');
     await assertNoAssist();
   }
 
   Future<void> test_multiLine() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/widgets.dart';
 build() {
   return Container(
@@ -65,8 +71,8 @@
 
   Future<void> test_multiLine_inListLiteral() async {
     verifyNoTestUnitErrors = false;
-    addFlutterPackage();
-    await resolveTestUnit('''
+
+    await resolveTestCode('''
 import 'package:flutter/widgets.dart';
 build() {
   return Container(
@@ -86,8 +92,7 @@
   }
 
   Future<void> test_multiLines() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/widgets.dart';
 class FakeFlutter {
   main() {
@@ -126,8 +131,7 @@
   }
 
   Future<void> test_multiLines_eol2() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/widgets.dart';
 class FakeFlutter {\r
   main() {\r
@@ -166,8 +170,7 @@
   }
 
   Future<void> test_prefixedIdentifier_identifier() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/widgets.dart';
 
 abstract class Foo extends Widget {
@@ -192,8 +195,7 @@
   }
 
   Future<void> test_prefixedIdentifier_prefix() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/widgets.dart';
 
 abstract class Foo extends Widget {
@@ -218,8 +220,7 @@
   }
 
   Future<void> test_singleLine() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/widgets.dart';
 class FakeFlutter {
   main() {
@@ -232,8 +233,7 @@
   }
 
   Future<void> test_singleLine1() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/widgets.dart';
 class FakeFlutter {
   main() {
@@ -252,8 +252,7 @@
   }
 
   Future<void> test_singleLine2() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/widgets.dart';
 class FakeFlutter {
   main() {
@@ -272,8 +271,7 @@
   }
 
   Future<void> test_variable() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/widgets.dart';
 class FakeFlutter {
   main() {
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_padding_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_padding_test.dart
index c457ccf..685b2df 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_padding_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_padding_test.dart
@@ -19,9 +19,16 @@
   @override
   AssistKind get kind => DartAssistKind.FLUTTER_WRAP_PADDING;
 
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(
+      flutter: true,
+    );
+  }
+
   Future<void> test_aroundContainer() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/widgets.dart';
 class FakeFlutter {
   main() {
@@ -43,8 +50,7 @@
   }
 
   Future<void> test_aroundPadding() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/widgets.dart';
 class FakeFlutter {
   main() {
@@ -59,8 +65,7 @@
   }
 
   Future<void> test_inConstantContext() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/widgets.dart';
 class FakeFlutter {
   Widget build() {
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_row_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_row_test.dart
index 2325c8c..a9e6554 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_row_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_row_test.dart
@@ -19,9 +19,16 @@
   @override
   AssistKind get kind => DartAssistKind.FLUTTER_WRAP_ROW;
 
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(
+      flutter: true,
+    );
+  }
+
   Future<void> test_twoWidgets() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/widgets.dart';
 
 class FakeFlutter {
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_sized_box.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_sized_box.dart
deleted file mode 100644
index b9b6947..0000000
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_sized_box.dart
+++ /dev/null
@@ -1,122 +0,0 @@
-// Copyright (c) 2020, 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/src/services/correction/assist.dart';
-import 'package:analyzer_plugin/utilities/assist/assist.dart';
-import 'package:test_reflective_loader/test_reflective_loader.dart';
-
-import 'assist_processor.dart';
-
-// todo: update for SizedBox
-
-void main() {
-  defineReflectiveSuite(() {
-    defineReflectiveTests(FlutterWrapSizedBoxTest);
-  });
-}
-
-@reflectiveTest
-class FlutterWrapSizedBoxTest extends AssistProcessorTest {
-  @override
-  AssistKind get kind => DartAssistKind.FLUTTER_WRAP_SIZED_BOX;
-
-  Future<void> test_aroundContainer() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
-import 'package:flutter/widgets.dart';
-class FakeFlutter {
-  main() {
-    return /*caret*/Container();
-  }
-}
-''');
-    await assertHasAssist('''
-import 'package:flutter/widgets.dart';
-class FakeFlutter {
-  main() {
-    return SizedBox(child: Container());
-  }
-}
-''');
-  }
-
-  Future<void> test_aroundNamedConstructor() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
-import 'package:flutter/widgets.dart';
-
-class MyWidget extends StatelessWidget {
-  MyWidget.named();
-
-  Widget build(BuildContext context) => null;
-}
-
-main() {
-  return MyWidget./*caret*/named();
-}
-''');
-    await assertHasAssist('''
-import 'package:flutter/widgets.dart';
-
-class MyWidget extends StatelessWidget {
-  MyWidget.named();
-
-  Widget build(BuildContext context) => null;
-}
-
-main() {
-  return SizedBox(child: MyWidget.named());
-}
-''');
-  }
-
-  Future<void> test_aroundSizedBox() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
-import 'package:flutter/widgets.dart';
-class FakeFlutter {
-  main() {
-    return /*caret*/SizedBox();
-  }
-}
-''');
-    await assertNoAssist();
-  }
-
-  Future<void> test_assignment() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
-import 'package:flutter/widgets.dart';
-
-main() {
-  Widget w;
-  w = /*caret*/Container();
-}
-''');
-    await assertHasAssist('''
-import 'package:flutter/widgets.dart';
-
-main() {
-  Widget w;
-  w = SizedBox(child: Container());
-}
-''');
-  }
-
-  Future<void> test_expressionFunctionBody() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
-import 'package:flutter/widgets.dart';
-class FakeFlutter {
-  main() => /*caret*/Container();
-}
-''');
-    await assertHasAssist('''
-import 'package:flutter/widgets.dart';
-class FakeFlutter {
-  main() => SizedBox(child: Container());
-}
-''');
-  }
-}
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_sized_box_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_sized_box_test.dart
new file mode 100644
index 0000000..74c6918
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_sized_box_test.dart
@@ -0,0 +1,125 @@
+// Copyright (c) 2020, 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/src/services/correction/assist.dart';
+import 'package:analyzer_plugin/utilities/assist/assist.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'assist_processor.dart';
+
+// todo: update for SizedBox
+
+void main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(FlutterWrapSizedBoxTest);
+  });
+}
+
+@reflectiveTest
+class FlutterWrapSizedBoxTest extends AssistProcessorTest {
+  @override
+  AssistKind get kind => DartAssistKind.FLUTTER_WRAP_SIZED_BOX;
+
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(
+      flutter: true,
+    );
+  }
+
+  Future<void> test_aroundContainer() async {
+    await resolveTestCode('''
+import 'package:flutter/widgets.dart';
+class FakeFlutter {
+  main() {
+    return /*caret*/Container();
+  }
+}
+''');
+    await assertHasAssist('''
+import 'package:flutter/widgets.dart';
+class FakeFlutter {
+  main() {
+    return SizedBox(child: Container());
+  }
+}
+''');
+  }
+
+  Future<void> test_aroundNamedConstructor() async {
+    await resolveTestCode('''
+import 'package:flutter/widgets.dart';
+
+class MyWidget extends StatelessWidget {
+  MyWidget.named();
+
+  Widget build(BuildContext context) => null;
+}
+
+main() {
+  return MyWidget./*caret*/named();
+}
+''');
+    await assertHasAssist('''
+import 'package:flutter/widgets.dart';
+
+class MyWidget extends StatelessWidget {
+  MyWidget.named();
+
+  Widget build(BuildContext context) => null;
+}
+
+main() {
+  return SizedBox(child: MyWidget.named());
+}
+''');
+  }
+
+  Future<void> test_aroundSizedBox() async {
+    await resolveTestCode('''
+import 'package:flutter/widgets.dart';
+class FakeFlutter {
+  main() {
+    return /*caret*/SizedBox();
+  }
+}
+''');
+    await assertNoAssist();
+  }
+
+  Future<void> test_assignment() async {
+    await resolveTestCode('''
+import 'package:flutter/widgets.dart';
+
+main() {
+  Widget w;
+  w = /*caret*/Container();
+}
+''');
+    await assertHasAssist('''
+import 'package:flutter/widgets.dart';
+
+main() {
+  Widget w;
+  w = SizedBox(child: Container());
+}
+''');
+  }
+
+  Future<void> test_expressionFunctionBody() async {
+    await resolveTestCode('''
+import 'package:flutter/widgets.dart';
+class FakeFlutter {
+  main() => /*caret*/Container();
+}
+''');
+    await assertHasAssist('''
+import 'package:flutter/widgets.dart';
+class FakeFlutter {
+  main() => SizedBox(child: Container());
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_stream_builder_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_stream_builder_test.dart
index c44049f..4c32342 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_stream_builder_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_stream_builder_test.dart
@@ -19,9 +19,16 @@
   @override
   AssistKind get kind => DartAssistKind.FLUTTER_WRAP_STREAM_BUILDER;
 
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(
+      flutter: true,
+    );
+  }
+
   Future<void> test_aroundStreamBuilder() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/widgets.dart';
 
 main() {
@@ -35,8 +42,7 @@
   }
 
   Future<void> test_aroundText() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/widgets.dart';
 
 main() {
diff --git a/pkg/analysis_server/test/src/services/correction/assist/import_add_show_test.dart b/pkg/analysis_server/test/src/services/correction/assist/import_add_show_test.dart
index bb801c2..e00ee78 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/import_add_show_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/import_add_show_test.dart
@@ -20,7 +20,7 @@
   AssistKind get kind => DartAssistKind.IMPORT_ADD_SHOW;
 
   Future<void> test_hasShow() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'dart:math' show pi;
 main() {
   pi;
@@ -30,7 +30,7 @@
   }
 
   Future<void> test_hasUnresolvedIdentifier() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'dart:math';
 main(x) {
   pi;
@@ -47,7 +47,7 @@
   }
 
   Future<void> test_onDirective() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'dart:math';
 main() {
   pi;
@@ -66,7 +66,7 @@
   }
 
   Future<void> test_onUri() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'dart:math';
 main() {
   pi;
@@ -88,7 +88,7 @@
     addSource('/home/test/lib/a.dart', r'''
 void set setter(int i) {}
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'a.dart';
 
 main() {
@@ -106,14 +106,14 @@
 
   Future<void> test_unresolvedUri() async {
     verifyNoTestUnitErrors = false;
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '/no/such/lib.dart';
 ''');
     await assertNoAssistAt('import ');
   }
 
   Future<void> test_unused() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'dart:math';
 ''');
     await assertNoAssistAt('import ');
diff --git a/pkg/analysis_server/test/src/services/correction/assist/inline_invocation_test.dart b/pkg/analysis_server/test/src/services/correction/assist/inline_invocation_test.dart
index f00cf69..23749ff 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/inline_invocation_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/inline_invocation_test.dart
@@ -21,7 +21,7 @@
   AssistKind get kind => DartAssistKind.INLINE_INVOCATION;
 
   Future<void> test_add_emptyTarget() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var l = []..ad/*caret*/d('a')..add('b');
 ''');
     await assertHasAssist('''
@@ -32,14 +32,14 @@
   Future<void> test_add_emptyTarget_noAssistWithLint() async {
     createAnalysisOptionsFile(lints: [LintNames.prefer_inlined_adds]);
     verifyNoTestUnitErrors = false;
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var l = []..ad/*caret*/d('a')..add('b');
 ''');
     await assertNoAssist();
   }
 
   Future<void> test_add_nonEmptyTarget() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var l = ['a']..ad/*caret*/d('b')..add('c');
 ''');
     await assertHasAssist('''
@@ -48,7 +48,7 @@
   }
 
   Future<void> test_add_nonLiteralArgument() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var e = 'b';
 var l = ['a']..add/*caret*/(e);
 ''');
@@ -59,7 +59,7 @@
   }
 
   Future<void> test_add_nonLiteralTarget() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var l1 = [];
 var l2 = l1..ad/*caret*/d('b')..add('c');
 ''');
@@ -67,14 +67,14 @@
   }
 
   Future<void> test_add_notFirst() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var l = ['a']..add('b')../*caret*/add('c');
 ''');
     await assertNoAssist();
   }
 
   Future<void> test_addAll_emptyTarget() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var l = []..add/*caret*/All(['a'])..addAll(['b']);
 ''');
     await assertHasAssist('''
@@ -85,14 +85,14 @@
   Future<void> test_addAll_emptyTarget_noAssistWithLint() async {
     createAnalysisOptionsFile(lints: [LintNames.prefer_inlined_adds]);
     verifyNoTestUnitErrors = false;
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var l = []..add/*caret*/All(['a'])..addAll(['b']);
 ''');
     await assertNoAssist();
   }
 
   Future<void> test_addAll_nonEmptyTarget() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var l = ['a']..add/*caret*/All(['b'])..addAll(['c']);
 ''');
     await assertHasAssist('''
@@ -101,7 +101,7 @@
   }
 
   Future<void> test_addAll_nonLiteralArgument() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var l1 = <String>[];
 var l2 = ['a']..add/*caret*/All(l1);
 ''');
@@ -109,7 +109,7 @@
   }
 
   Future<void> test_addAll_nonLiteralTarget() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var l1 = [];
 var l2 = l1..addAl/*caret*/l(['b'])..addAll(['c']);
 ''');
@@ -117,7 +117,7 @@
   }
 
   Future<void> test_addAll_notFirst() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var l = ['a']..addAll(['b'])../*caret*/addAll(['c']);
 ''');
     await assertNoAssist();
diff --git a/pkg/analysis_server/test/src/services/correction/assist/introduce_local_cast_type_test.dart b/pkg/analysis_server/test/src/services/correction/assist/introduce_local_cast_type_test.dart
index 33c0c35..784efb9 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/introduce_local_cast_type_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/introduce_local_cast_type_test.dart
@@ -21,7 +21,7 @@
   AssistKind get kind => DartAssistKind.INTRODUCE_LOCAL_CAST_TYPE;
 
   Future<void> test_introduceLocalTestedType_if_is() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class MyTypeName {}
 main(p) {
   if (p is MyTypeName) {
@@ -49,7 +49,7 @@
   }
 
   Future<void> test_introduceLocalTestedType_if_isNot() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class MyTypeName {}
 main(p) {
   if (p is! MyTypeName) {
@@ -77,7 +77,7 @@
   }
 
   Future<void> test_introduceLocalTestedType_notBlock() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main(p) {
   if (p is String)
     print('not a block');
@@ -87,7 +87,7 @@
   }
 
   Future<void> test_introduceLocalTestedType_notIsExpression() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main(p) {
   if (p == null) {
   }
@@ -97,7 +97,7 @@
   }
 
   Future<void> test_introduceLocalTestedType_notStatement() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class C {
   bool b;
   C(v) : b = v is int;
@@ -106,7 +106,7 @@
   }
 
   Future<void> test_introduceLocalTestedType_while() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main(p) {
   while (p is String) {
   }
diff --git a/pkg/analysis_server/test/src/services/correction/assist/invert_if_statement_test.dart b/pkg/analysis_server/test/src/services/correction/assist/invert_if_statement_test.dart
index 81f1950..b86a190 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/invert_if_statement_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/invert_if_statement_test.dart
@@ -20,7 +20,7 @@
   AssistKind get kind => DartAssistKind.INVERT_IF_STATEMENT;
 
   Future<void> test_blocks() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   if (true) {
     0;
@@ -41,7 +41,7 @@
   }
 
   Future<void> test_statements() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   if (true)
     0;
diff --git a/pkg/analysis_server/test/src/services/correction/assist/join_if_with_inner_test.dart b/pkg/analysis_server/test/src/services/correction/assist/join_if_with_inner_test.dart
index bd1cf73..3c19528 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/join_if_with_inner_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/join_if_with_inner_test.dart
@@ -20,7 +20,7 @@
   AssistKind get kind => DartAssistKind.JOIN_IF_WITH_INNER;
 
   Future<void> test_conditionAndOr() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   if (1 == 1) {
     if (2 == 2 || 3 == 3) {
@@ -39,7 +39,7 @@
   }
 
   Future<void> test_conditionInvocation() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   if (isCheck()) {
     if (2 == 2) {
@@ -60,7 +60,7 @@
   }
 
   Future<void> test_conditionOrAnd() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   if (1 == 1 || 2 == 2) {
     if (3 == 3) {
@@ -79,7 +79,7 @@
   }
 
   Future<void> test_innerNotIf() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   if (1 == 1) {
     print(0);
@@ -90,7 +90,7 @@
   }
 
   Future<void> test_innerWithElse() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   if (1 == 1) {
     if (2 == 2) {
@@ -105,7 +105,7 @@
   }
 
   Future<void> test_onCondition() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   if (1 == 1) {
     if (2 == 2) {
@@ -124,7 +124,7 @@
   }
 
   Future<void> test_simpleConditions_block_block() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   if (1 == 1) {
     if (2 == 2) {
@@ -143,7 +143,7 @@
   }
 
   Future<void> test_simpleConditions_block_single() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   if (1 == 1) {
     if (2 == 2)
@@ -161,7 +161,7 @@
   }
 
   Future<void> test_simpleConditions_single_blockMulti() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   if (1 == 1) {
     if (2 == 2) {
@@ -184,7 +184,7 @@
   }
 
   Future<void> test_simpleConditions_single_blockOne() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   if (1 == 1)
     if (2 == 2) {
@@ -202,7 +202,7 @@
   }
 
   Future<void> test_statementAfterInner() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   if (1 == 1) {
     if (2 == 2) {
@@ -216,7 +216,7 @@
   }
 
   Future<void> test_statementBeforeInner() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   if (1 == 1) {
     print(1);
@@ -230,7 +230,7 @@
   }
 
   Future<void> test_targetNotIf() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   print(0);
 }
@@ -239,7 +239,7 @@
   }
 
   Future<void> test_targetWithElse() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   if (1 == 1) {
     if (2 == 2) {
diff --git a/pkg/analysis_server/test/src/services/correction/assist/join_if_with_outer_test.dart b/pkg/analysis_server/test/src/services/correction/assist/join_if_with_outer_test.dart
index 79d87b5..a31c29e 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/join_if_with_outer_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/join_if_with_outer_test.dart
@@ -20,7 +20,7 @@
   AssistKind get kind => DartAssistKind.JOIN_IF_WITH_OUTER;
 
   Future<void> test_conditionAndOr() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   if (1 == 1) {
     if (2 == 2 || 3 == 3) {
@@ -39,7 +39,7 @@
   }
 
   Future<void> test_conditionInvocation() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   if (1 == 1) {
     if (isCheck()) {
@@ -60,7 +60,7 @@
   }
 
   Future<void> test_conditionOrAnd() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   if (1 == 1 || 2 == 2) {
     if (3 == 3) {
@@ -79,7 +79,7 @@
   }
 
   Future<void> test_onCondition() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   if (1 == 1) {
     if (2 == 2) {
@@ -98,7 +98,7 @@
   }
 
   Future<void> test_outerNotIf() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   if (1 == 1) {
     print(0);
@@ -109,7 +109,7 @@
   }
 
   Future<void> test_outerWithElse() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   if (1 == 1) {
     if (2 == 2) {
@@ -124,7 +124,7 @@
   }
 
   Future<void> test_simpleConditions_block_block() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   if (1 == 1) {
     if (2 == 2) {
@@ -143,7 +143,7 @@
   }
 
   Future<void> test_simpleConditions_block_single() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   if (1 == 1) {
     if (2 == 2)
@@ -161,7 +161,7 @@
   }
 
   Future<void> test_simpleConditions_single_blockMulti() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   if (1 == 1) {
     if (2 == 2) {
@@ -184,7 +184,7 @@
   }
 
   Future<void> test_simpleConditions_single_blockOne() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   if (1 == 1)
     if (2 == 2) {
@@ -202,7 +202,7 @@
   }
 
   Future<void> test_statementAfterInner() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   if (1 == 1) {
     if (2 == 2) {
@@ -216,7 +216,7 @@
   }
 
   Future<void> test_statementBeforeInner() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   if (1 == 1) {
     print(1);
@@ -230,7 +230,7 @@
   }
 
   Future<void> test_targetNotIf() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   print(0);
 }
@@ -239,7 +239,7 @@
   }
 
   Future<void> test_targetWithElse() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   if (1 == 1) {
     if (2 == 2) {
diff --git a/pkg/analysis_server/test/src/services/correction/assist/join_variable_declaration_test.dart b/pkg/analysis_server/test/src/services/correction/assist/join_variable_declaration_test.dart
index ac731da..8b885c8 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/join_variable_declaration_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/join_variable_declaration_test.dart
@@ -20,7 +20,7 @@
   AssistKind get kind => DartAssistKind.JOIN_VARIABLE_DECLARATION;
 
   Future<void> test_onAssignment() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   var v;
   v = 1;
@@ -34,7 +34,7 @@
   }
 
   Future<void> test_onAssignment_hasInitializer() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   var v = 1;
   v = 2;
@@ -44,7 +44,7 @@
   }
 
   Future<void> test_onAssignment_notAdjacent() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   var v;
   var bar;
@@ -55,7 +55,7 @@
   }
 
   Future<void> test_onAssignment_notAssignment() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   var v;
   v += 1;
@@ -65,7 +65,7 @@
   }
 
   Future<void> test_onAssignment_notDeclaration() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main(var v) {
   v = 1;
 }
@@ -74,7 +74,7 @@
   }
 
   Future<void> test_onAssignment_notLeftArgument() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   var v;
   1 + v; // marker
@@ -84,7 +84,7 @@
   }
 
   Future<void> test_onAssignment_notOneVariable() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   var v, v2;
   v = 1;
@@ -95,7 +95,7 @@
 
   Future<void> test_onAssignment_notResolved() async {
     verifyNoTestUnitErrors = false;
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   var v;
   x = 1;
@@ -105,7 +105,7 @@
   }
 
   Future<void> test_onAssignment_notSameBlock() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   var v;
   {
@@ -117,7 +117,7 @@
   }
 
   Future<void> test_onDeclaration_hasInitializer() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   var v = 1;
   v = 2;
@@ -127,7 +127,7 @@
   }
 
   Future<void> test_onDeclaration_lastStatement() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   if (true)
     var v;
@@ -137,7 +137,7 @@
   }
 
   Future<void> test_onDeclaration_nextNotAssignmentExpression() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   var v;
   42;
@@ -147,7 +147,7 @@
   }
 
   Future<void> test_onDeclaration_nextNotExpressionStatement() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   var v;
   if (true) return;
@@ -157,7 +157,7 @@
   }
 
   Future<void> test_onDeclaration_nextNotPureAssignment() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   var v;
   v += 1;
@@ -167,7 +167,7 @@
   }
 
   Future<void> test_onDeclaration_notOneVariable() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   var v, v2;
   v = 1;
@@ -177,7 +177,7 @@
   }
 
   Future<void> test_onDeclaration_onName() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   var v;
   v = 1;
@@ -191,7 +191,7 @@
   }
 
   Future<void> test_onDeclaration_onType() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   int v;
   v = 1;
@@ -205,7 +205,7 @@
   }
 
   Future<void> test_onDeclaration_onVar() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   var v;
   v = 1;
diff --git a/pkg/analysis_server/test/src/services/correction/assist/remove_type_annotation_test.dart b/pkg/analysis_server/test/src/services/correction/assist/remove_type_annotation_test.dart
index 0a9f0b2..a1efc00 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/remove_type_annotation_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/remove_type_annotation_test.dart
@@ -20,7 +20,7 @@
   AssistKind get kind => DartAssistKind.REMOVE_TYPE_ANNOTATION;
 
   Future<void> test_classField() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   int v = 1;
 }
@@ -33,7 +33,7 @@
   }
 
   Future<void> test_classField_final() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   final int v = 1;
 }
@@ -46,7 +46,7 @@
   }
 
   Future<void> test_field_noInitializer() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   int v;
 }
@@ -55,7 +55,7 @@
   }
 
   Future<void> test_instanceCreation_freeStanding() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {}
 
 main() {
@@ -66,7 +66,7 @@
   }
 
   Future<void> test_localVariable() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   int a = 1, b = 2;
 }
@@ -79,7 +79,7 @@
   }
 
   Future<void> test_localVariable_const() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   const int v = 1;
 }
@@ -92,7 +92,7 @@
   }
 
   Future<void> test_localVariable_final() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   final int v = 1;
 }
@@ -105,7 +105,7 @@
   }
 
   Future<void> test_localVariable_noInitializer() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   int v;
 }
@@ -114,7 +114,7 @@
   }
 
   Future<void> test_localVariable_onInitializer() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   final int v = 1;
 }
@@ -123,7 +123,7 @@
   }
 
   Future<void> test_loopVariable() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   for(int i = 0; i < 3; i++) {}
 }
@@ -136,7 +136,7 @@
   }
 
   Future<void> test_loopVariable_nested() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   var v = () {
     for (int x in <int>[]) {}
@@ -153,7 +153,7 @@
   }
 
   Future<void> test_loopVariable_noType() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   for(var i = 0; i < 3; i++) {}
 }
@@ -162,7 +162,7 @@
   }
 
   Future<void> test_topLevelVariable() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 int V = 1;
 ''');
     await assertHasAssistAt('int ', '''
@@ -171,7 +171,7 @@
   }
 
   Future<void> test_topLevelVariable_final() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 final int V = 1;
 ''');
     await assertHasAssistAt('int ', '''
@@ -181,7 +181,7 @@
 
   Future<void> test_topLevelVariable_noInitializer() async {
     verifyNoTestUnitErrors = false;
-    await resolveTestUnit('''
+    await resolveTestCode('''
 int v;
 ''');
     await assertNoAssistAt('v;');
@@ -189,7 +189,7 @@
 
   Future<void> test_topLevelVariable_syntheticName() async {
     verifyNoTestUnitErrors = false;
-    await resolveTestUnit('''
+    await resolveTestCode('''
 MyType
 ''');
     await assertNoAssistAt('MyType');
diff --git a/pkg/analysis_server/test/src/services/correction/assist/replace_conditional_with_if_else_test.dart b/pkg/analysis_server/test/src/services/correction/assist/replace_conditional_with_if_else_test.dart
index 2085f59..1e81306 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/replace_conditional_with_if_else_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/replace_conditional_with_if_else_test.dart
@@ -20,7 +20,7 @@
   AssistKind get kind => DartAssistKind.REPLACE_CONDITIONAL_WITH_IF_ELSE;
 
   Future<void> test_assignment() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   var v;
   v = true ? 111 : 222;
@@ -51,14 +51,14 @@
   }
 
   Future<void> test_noEnclosingStatement() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var v = true ? 111 : 222;
 ''');
     await assertNoAssistAt('? 111');
   }
 
   Future<void> test_notConditional() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   var v = 42;
 }
@@ -67,7 +67,7 @@
   }
 
   Future<void> test_return() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   return true ? 111 : 222;
 }
@@ -84,7 +84,7 @@
   }
 
   Future<void> test_variableDeclaration() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   int a = 1, vvv = true ? 111 : 222, b = 2;
 }
diff --git a/pkg/analysis_server/test/src/services/correction/assist/replace_if_else_with_conditional_test.dart b/pkg/analysis_server/test/src/services/correction/assist/replace_if_else_with_conditional_test.dart
index d6139ed..7b8f335 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/replace_if_else_with_conditional_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/replace_if_else_with_conditional_test.dart
@@ -20,7 +20,7 @@
   AssistKind get kind => DartAssistKind.REPLACE_IF_ELSE_WITH_CONDITIONAL;
 
   Future<void> test_assignment() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   int vvv;
   if (true) {
@@ -39,7 +39,7 @@
   }
 
   Future<void> test_expressionVsReturn() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   if (true) {
     print(42);
@@ -52,7 +52,7 @@
   }
 
   Future<void> test_notIfStatement() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   print(0);
 }
@@ -61,7 +61,7 @@
   }
 
   Future<void> test_notSingleStatement() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   int vvv;
   if (true) {
@@ -77,7 +77,7 @@
   }
 
   Future<void> test_return() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   if (true) {
     return 111;
diff --git a/pkg/analysis_server/test/src/services/correction/assist/replace_with_var_test.dart b/pkg/analysis_server/test/src/services/correction/assist/replace_with_var_test.dart
index 19eb57a..6ab4ad8 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/replace_with_var_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/replace_with_var_test.dart
@@ -20,7 +20,7 @@
   AssistKind get kind => DartAssistKind.REPLACE_WITH_VAR;
 
   Future<void> test_for() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void f(List<int> list) {
   for (/*caret*/int i = 0; i < list.length; i++) {
     print(i);
@@ -37,7 +37,7 @@
   }
 
   Future<void> test_forEach() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void f(List<int> list) {
   for (/*caret*/int i in list) {
     print(i);
@@ -54,7 +54,7 @@
   }
 
   Future<void> test_generic_instanceCreation_withArguments() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 C<int> f() {
   /*caret*/C<int> c = C<int>();
   return c;
@@ -71,7 +71,7 @@
   }
 
   Future<void> test_generic_instanceCreation_withoutArguments() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 C<int> f() {
   /*caret*/C<int> c = C();
   return c;
@@ -88,7 +88,7 @@
   }
 
   Future<void> test_generic_listLiteral() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 List f() {
   /*caret*/List<int> l = [];
   return l;
@@ -103,7 +103,7 @@
   }
 
   Future<void> test_generic_mapLiteral() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 Map f() {
   /*caret*/Map<String, int> m = {};
   return m;
@@ -118,7 +118,7 @@
   }
 
   Future<void> test_generic_setLiteral() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 Set f() {
   /*caret*/Set<int> s = {};
   return s;
@@ -133,7 +133,7 @@
   }
 
   Future<void> test_generic_setLiteral_ambiguous() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 Set f() {
   /*caret*/Set s = {};
   return s;
@@ -143,7 +143,7 @@
   }
 
   Future<void> test_moreGeneral() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 num f() {
   /*caret*/num n = 0;
   return n;
@@ -153,7 +153,7 @@
   }
 
   Future<void> test_noInitializer() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 String f() {
   /*caret*/String s;
   s = '';
@@ -164,7 +164,7 @@
   }
 
   Future<void> test_noType() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 String f() {
   /*caret*/var s = '';
   return s;
@@ -174,7 +174,7 @@
   }
 
   Future<void> test_simple() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 String f() {
   /*caret*/String s = '';
   return s;
diff --git a/pkg/analysis_server/test/src/services/correction/assist/shadow_field_test.dart b/pkg/analysis_server/test/src/services/correction/assist/shadow_field_test.dart
index 09acc3d74..f13b966 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/shadow_field_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/shadow_field_test.dart
@@ -3,10 +3,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/src/services/correction/assist.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import '../../../../abstract_context.dart';
 import 'assist_processor.dart';
 
 void main() {
@@ -22,7 +22,7 @@
   AssistKind get kind => DartAssistKind.SHADOW_FIELD;
 
   Future<void> test_is_assigned() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class C {
   num f = 0;
 
@@ -39,7 +39,7 @@
   }
 
   Future<void> test_is_noBlock_while() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class C {
   num f = 0;
 
@@ -55,7 +55,7 @@
   }
 
   Future<void> test_is_referencedViaThis() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class C {
   num f = 0;
 
@@ -81,7 +81,7 @@
   }
 
   Future<void> test_is_simple() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class C {
   num f = 0;
 
@@ -108,15 +108,10 @@
 }
 
 @reflectiveTest
-class ShadowFieldWithNullSafetyTest extends ShadowFieldTest {
-  @override
-  void setUp() {
-    super.setUp();
-    createAnalysisOptionsFile(experiments: [EnableString.non_nullable]);
-  }
-
+class ShadowFieldWithNullSafetyTest extends ShadowFieldTest
+    with WithNullSafetyMixin {
   Future<void> test_notNull() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class C {
   int? f;
 
@@ -142,7 +137,7 @@
   }
 
   Future<void> test_notNull_assigned() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class C {
   int? f;
 
@@ -159,7 +154,7 @@
   }
 
   Future<void> test_notNull_referencedViaThis() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class C {
   int? f;
 
diff --git a/pkg/analysis_server/test/src/services/correction/assist/sort_child_property_last_test.dart b/pkg/analysis_server/test/src/services/correction/assist/sort_child_property_last_test.dart
index 9335cd1..2aea7cc 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/sort_child_property_last_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/sort_child_property_last_test.dart
@@ -20,9 +20,16 @@
   @override
   AssistKind get kind => DartAssistKind.SORT_CHILD_PROPERTY_LAST;
 
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(
+      flutter: true,
+    );
+  }
+
   Future<void> test_already_sorted() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 main() {
   Column(
@@ -39,8 +46,7 @@
   }
 
   Future<void> test_already_sorted_one_prop() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 main() {
   Column(
@@ -56,8 +62,7 @@
   }
 
   Future<void> test_no_children() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 main() {
   Column(
@@ -69,8 +74,7 @@
   }
 
   Future<void> test_sort() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 main() {
   Column(
@@ -100,10 +104,9 @@
   }
 
   Future<void> test_sort_noAssistWithLint() async {
-    addFlutterPackage();
     createAnalysisOptionsFile(lints: [LintNames.sort_child_properties_last]);
     verifyNoTestUnitErrors = false;
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 main() {
   Column(
diff --git a/pkg/analysis_server/test/src/services/correction/assist/split_and_condition_test.dart b/pkg/analysis_server/test/src/services/correction/assist/split_and_condition_test.dart
index 4371672..2e96ea7 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/split_and_condition_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/split_and_condition_test.dart
@@ -20,7 +20,7 @@
   AssistKind get kind => DartAssistKind.SPLIT_AND_CONDITION;
 
   Future<void> test_hasElse() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   if (1 == 1 && 2 == 2) {
     print(1);
@@ -33,7 +33,7 @@
   }
 
   Future<void> test_innerAndExpression() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   if (1 == 1 && 2 == 2 && 3 == 3) {
     print(0);
@@ -52,7 +52,7 @@
   }
 
   Future<void> test_notAnd() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   if (1 == 1 || 2 == 2) {
     print(0);
@@ -63,7 +63,7 @@
   }
 
   Future<void> test_notOnOperator() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   if (1 == 1 && 2 == 2) {
     print(0);
@@ -75,7 +75,7 @@
   }
 
   Future<void> test_notPartOfIf() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   print(1 == 1 && 2 == 2);
 }
@@ -84,7 +84,7 @@
   }
 
   Future<void> test_notTopLevelAnd() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   if (true || (1 == 1 && 2 == 2)) {
     print(0);
@@ -99,7 +99,7 @@
   }
 
   Future<void> test_selectionTooLarge() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   if (1 == 1
 // start
@@ -116,7 +116,7 @@
   }
 
   Future<void> test_thenBlock() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   if (true && false) {
     print(0);
@@ -141,7 +141,7 @@
   }
 
   Future<void> test_thenStatement() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   if (true && false)
     print(0);
diff --git a/pkg/analysis_server/test/src/services/correction/assist/split_variable_declaration_test.dart b/pkg/analysis_server/test/src/services/correction/assist/split_variable_declaration_test.dart
index 07d4997..255f6e5 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/split_variable_declaration_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/split_variable_declaration_test.dart
@@ -20,7 +20,7 @@
   AssistKind get kind => DartAssistKind.SPLIT_VARIABLE_DECLARATION;
 
   Future<void> test_const() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   const v = 1;
 }
@@ -29,7 +29,7 @@
   }
 
   Future<void> test_final() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   final v = 1;
 }
@@ -38,7 +38,7 @@
   }
 
   Future<void> test_notOneVariable() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   var v = 1, v2;
 }
@@ -47,7 +47,7 @@
   }
 
   Future<void> test_onName() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   var v = 1;
 }
@@ -61,7 +61,7 @@
   }
 
   Future<void> test_onName_functionStatement_noType() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f() => 1;
 main() {
   var v = f();
@@ -77,7 +77,7 @@
   }
 
   Future<void> test_onType() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   int v = 1;
 }
@@ -92,7 +92,7 @@
 
   @failingTest
   Future<void> test_onType_prefixedByComment() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   /*comment*/int v = 1;
 }
@@ -106,7 +106,7 @@
   }
 
   Future<void> test_onVar() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   var v = 1;
 }
diff --git a/pkg/analysis_server/test/src/services/correction/assist/surround_with_block_test.dart b/pkg/analysis_server/test/src/services/correction/assist/surround_with_block_test.dart
index 3d35b43..54ef449 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/surround_with_block_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/surround_with_block_test.dart
@@ -20,7 +20,7 @@
   AssistKind get kind => DartAssistKind.SURROUND_WITH_BLOCK;
 
   Future<void> test_notStatementInBlock() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   while (true)
 // start
@@ -32,7 +32,7 @@
   }
 
   Future<void> test_twoStatements() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
 // start
   print(0);
diff --git a/pkg/analysis_server/test/src/services/correction/assist/surround_with_do_while_test.dart b/pkg/analysis_server/test/src/services/correction/assist/surround_with_do_while_test.dart
index 3a1f308..d6ad18f 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/surround_with_do_while_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/surround_with_do_while_test.dart
@@ -20,7 +20,7 @@
   AssistKind get kind => DartAssistKind.SURROUND_WITH_DO_WHILE;
 
   Future<void> test_twoStatements() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
 // start
   print(0);
diff --git a/pkg/analysis_server/test/src/services/correction/assist/surround_with_for_in_test.dart b/pkg/analysis_server/test/src/services/correction/assist/surround_with_for_in_test.dart
index 0dd79ed..6b7ca74 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/surround_with_for_in_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/surround_with_for_in_test.dart
@@ -20,7 +20,7 @@
   AssistKind get kind => DartAssistKind.SURROUND_WITH_FOR_IN;
 
   Future<void> test_twoStatements() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
 // start
   print(0);
diff --git a/pkg/analysis_server/test/src/services/correction/assist/surround_with_for_test.dart b/pkg/analysis_server/test/src/services/correction/assist/surround_with_for_test.dart
index d946e3b..ca39826 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/surround_with_for_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/surround_with_for_test.dart
@@ -20,7 +20,7 @@
   AssistKind get kind => DartAssistKind.SURROUND_WITH_FOR;
 
   Future<void> test_twoStatements() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
 // start
   print(0);
diff --git a/pkg/analysis_server/test/src/services/correction/assist/surround_with_if_test.dart b/pkg/analysis_server/test/src/services/correction/assist/surround_with_if_test.dart
index 288aae5..91ed08c 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/surround_with_if_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/surround_with_if_test.dart
@@ -20,7 +20,7 @@
   AssistKind get kind => DartAssistKind.SURROUND_WITH_IF;
 
   Future<void> test_twoStatements() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
 // start
   print(0);
diff --git a/pkg/analysis_server/test/src/services/correction/assist/surround_with_try_catch_test.dart b/pkg/analysis_server/test/src/services/correction/assist/surround_with_try_catch_test.dart
index 2b3121d..3fa1377 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/surround_with_try_catch_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/surround_with_try_catch_test.dart
@@ -20,7 +20,7 @@
   AssistKind get kind => DartAssistKind.SURROUND_WITH_TRY_CATCH;
 
   Future<void> test_twoStatements() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
 // start
   print(0);
diff --git a/pkg/analysis_server/test/src/services/correction/assist/surround_with_try_finally_test.dart b/pkg/analysis_server/test/src/services/correction/assist/surround_with_try_finally_test.dart
index dc9a109..e6d5010 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/surround_with_try_finally_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/surround_with_try_finally_test.dart
@@ -20,7 +20,7 @@
   AssistKind get kind => DartAssistKind.SURROUND_WITH_TRY_FINALLY;
 
   Future<void> test_twoStatements() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
 // start
   print(0);
diff --git a/pkg/analysis_server/test/src/services/correction/assist/surround_with_while_test.dart b/pkg/analysis_server/test/src/services/correction/assist/surround_with_while_test.dart
index 42502fe..24eb591 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/surround_with_while_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/surround_with_while_test.dart
@@ -20,7 +20,7 @@
   AssistKind get kind => DartAssistKind.SURROUND_WITH_WHILE;
 
   Future<void> test_twoStatements() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
 // start
   print(0);
diff --git a/pkg/analysis_server/test/src/services/correction/assist/test_all.dart b/pkg/analysis_server/test/src/services/correction/assist/test_all.dart
index a521dec..9a0192e 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/test_all.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/test_all.dart
@@ -58,7 +58,7 @@
 import 'flutter_wrap_generic_test.dart' as flutter_wrap_generic;
 import 'flutter_wrap_padding_test.dart' as flutter_wrap_padding;
 import 'flutter_wrap_row_test.dart' as flutter_wrap_row;
-import 'flutter_wrap_sized_box.dart' as flutter_wrap_sized_box;
+import 'flutter_wrap_sized_box_test.dart' as flutter_wrap_sized_box;
 import 'flutter_wrap_stream_builder_test.dart' as flutter_wrap_stream_builder;
 import 'import_add_show_test.dart' as import_add_show;
 import 'inline_invocation_test.dart' as inline_invocation;
diff --git a/pkg/analysis_server/test/src/services/correction/assist/use_curly_braces_test.dart b/pkg/analysis_server/test/src/services/correction/assist/use_curly_braces_test.dart
index 032f5ee..93d28d6 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/use_curly_braces_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/use_curly_braces_test.dart
@@ -21,7 +21,7 @@
   AssistKind get kind => DartAssistKind.USE_CURLY_BRACES;
 
   Future<void> test_do_block() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   /*caret*/do {
     print(0);
@@ -32,7 +32,7 @@
   }
 
   Future<void> test_do_body_middle() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   do print/*caret*/(0); while (true);
 }
@@ -47,7 +47,7 @@
   }
 
   Future<void> test_do_body_start() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   do /*caret*/print(0); while (true);
 }
@@ -62,7 +62,7 @@
   }
 
   Future<void> test_do_condition() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   do print(0); while (/*caret*/true);
 }
@@ -77,7 +77,7 @@
   }
 
   Future<void> test_do_end() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   do print(0); while (true);/*caret*/
 }
@@ -92,7 +92,7 @@
   }
 
   Future<void> test_do_keyword_do() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   /*caret*/do print(0); while (true);
 }
@@ -107,7 +107,7 @@
   }
 
   Future<void> test_do_keyword_while() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   do print(0); /*caret*/while (true);
 }
@@ -122,7 +122,7 @@
   }
 
   Future<void> test_for_body_end() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   for (;;) print(0);/*caret*/
 }
@@ -137,7 +137,7 @@
   }
 
   Future<void> test_for_body_middle() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   for (;;) print/*caret*/(0);
 }
@@ -152,7 +152,7 @@
   }
 
   Future<void> test_for_body_start() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   for (;;) /*caret*/print(0);
 }
@@ -167,7 +167,7 @@
   }
 
   Future<void> test_for_condition() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   for (/*caret*/;;) print(0);
 }
@@ -182,7 +182,7 @@
   }
 
   Future<void> test_for_keyword() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   /*caret*/for (;;) print(0);
 }
@@ -197,7 +197,7 @@
   }
 
   Future<void> test_for_keyword_block() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   /*caret*/for (;;) {
     print(0);
@@ -208,7 +208,7 @@
   }
 
   Future<void> test_if_else_keyword() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main(int a) {
   if (a == 0)
     print(0);
@@ -227,7 +227,7 @@
   }
 
   Future<void> test_if_else_statement() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main(int a) {
   if (a == 0)
     print(0);
@@ -246,7 +246,7 @@
   }
 
   Future<void> test_if_keyword_blockBoth() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main(int a) {
   /*caret*/if (a == 0) {
     print(0);
@@ -259,7 +259,7 @@
   }
 
   Future<void> test_if_keyword_blockElse() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main(int a) {
   /*caret*/if (a == 0) print(0);
   else {
@@ -279,7 +279,7 @@
   }
 
   Future<void> test_if_keyword_blockThen() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main(int a) {
   /*caret*/if (a == 0) {
     print(0);
@@ -290,7 +290,7 @@
   }
 
   Future<void> test_if_keyword_withElse() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main(int a) {
   /*caret*/if (a == 0)
     print(0);
@@ -309,7 +309,7 @@
   }
 
   Future<void> test_if_keyword_withoutElse() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main(int a) {
   /*caret*/if (a == 0)
     print(0);
@@ -325,7 +325,7 @@
   }
 
   Future<void> test_if_then_withElse() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main(int a) {
   if (a == 0)
     /*caret*/print(0);
@@ -342,7 +342,7 @@
   }
 
   Future<void> test_if_then_withoutElse() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main(int a) {
   if (a == 0) /*caret*/print(0);
 }
@@ -360,7 +360,7 @@
     createAnalysisOptionsFile(
         lints: [LintNames.curly_braces_in_flow_control_structures]);
     verifyNoTestUnitErrors = false;
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   do print/*caret*/(0); while (true);
 }
@@ -369,7 +369,7 @@
   }
 
   Future<void> test_while_body_end() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   while (true) print(0);/*caret*/
 }
@@ -384,7 +384,7 @@
   }
 
   Future<void> test_while_body_middle() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   while (true) print/*caret*/(0);
 }
@@ -399,7 +399,7 @@
   }
 
   Future<void> test_while_body_start() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   while (true) /*caret*/print(0);
 }
@@ -414,7 +414,7 @@
   }
 
   Future<void> test_while_condition() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   while (/*caret*/true) print(0);
 }
@@ -429,7 +429,7 @@
   }
 
   Future<void> test_while_keyword() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   /*caret*/while (true) print(0);
 }
@@ -444,7 +444,7 @@
   }
 
   Future<void> test_while_keyword_block() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   /*caret*/while (true) {
     print(0);
diff --git a/pkg/analysis_server/test/src/services/correction/fix/add_async_test.dart b/pkg/analysis_server/test/src/services/correction/fix/add_async_test.dart
index d47cf3a..8047f30 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/add_async_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/add_async_test.dart
@@ -24,7 +24,7 @@
   FixKind get kind => DartFixKind.ADD_ASYNC;
 
   Future<void> test_asyncFor() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void main(Stream<String> names) {
   await for (String name in names) {
     print(name);
@@ -41,7 +41,7 @@
   }
 
   Future<void> test_blockFunctionBody_function() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 foo() {}
 main() {
   await foo();
@@ -56,7 +56,7 @@
   }
 
   Future<void> test_blockFunctionBody_getter() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 int get foo => null;
 int f() {
   await foo;
@@ -75,7 +75,7 @@
   }
 
   Future<void> test_closure() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void takeFutureCallback(Future callback()) {}
 
 void doStuff() => takeFutureCallback(() => await 1);
@@ -90,7 +90,7 @@
   }
 
   Future<void> test_expressionFunctionBody() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 foo() {}
 main() => await foo();
 ''');
@@ -101,14 +101,14 @@
   }
 
   Future<void> test_nullFunctionBody() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var F = await;
 ''');
     await assertNoFix();
   }
 
   Future<void> test_returnFuture_alreadyFuture() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 foo() {}
 Future<int> main() {
   await foo();
@@ -127,7 +127,7 @@
   }
 
   Future<void> test_returnFuture_dynamic() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 foo() {}
 dynamic main() {
   await foo();
@@ -144,7 +144,7 @@
   }
 
   Future<void> test_returnFuture_nonFuture() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 foo() {}
 int main() {
   await foo();
@@ -161,7 +161,7 @@
   }
 
   Future<void> test_returnFuture_noType() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 foo() {}
 main() {
   await foo();
@@ -187,7 +187,7 @@
   String get lintCode => LintNames.avoid_returning_null_for_future;
 
   Future<void> test_asyncFor() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 Future<String> f() {
   return null;
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/add_await_test.dart b/pkg/analysis_server/test/src/services/correction/fix/add_await_test.dart
index b54c20d..31ce0c6 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/add_await_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/add_await_test.dart
@@ -24,7 +24,7 @@
   String get lintCode => LintNames.unawaited_futures;
 
   Future<void> test_intLiteral() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 Future doSomething() => new Future.value('');
 
 void main() async {
diff --git a/pkg/analysis_server/test/src/services/correction/fix/add_const_test.dart b/pkg/analysis_server/test/src/services/correction/fix/add_const_test.dart
index 99c530f..bcb2893 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/add_const_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/add_const_test.dart
@@ -25,7 +25,7 @@
   String get lintCode => LintNames.prefer_const_constructors;
 
   Future<void> test_new() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class C {
   const C();
 }
@@ -39,7 +39,7 @@
   }
 
   Future<void> test_noKeyword() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class C {
   const C();
 }
@@ -68,9 +68,16 @@
   @override
   String get lintCode => LintNames.prefer_const_constructors_in_immutables;
 
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(
+      meta: true,
+    );
+  }
+
   Future<void> test_constConstructor() async {
-    addMetaPackage();
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:meta/meta.dart';
 
 @immutable
@@ -89,8 +96,7 @@
   }
 
   Future<void> test_constConstructorWithComment() async {
-    addMetaPackage();
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:meta/meta.dart';
 
 @immutable
diff --git a/pkg/analysis_server/test/src/services/correction/fix/add_curly_braces_test.dart b/pkg/analysis_server/test/src/services/correction/fix/add_curly_braces_test.dart
index ab16f8e..18da15e 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/add_curly_braces_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/add_curly_braces_test.dart
@@ -26,7 +26,7 @@
   // More coverage in the `use_curly_braces_test.dart` assist test.
 
   Future<void> test_do_block() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   do print(0); while (true);
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/add_diagnostic_property_reference_test.dart b/pkg/analysis_server/test/src/services/correction/fix/add_diagnostic_property_reference_test.dart
index b4fdc40..7df0970 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/add_diagnostic_property_reference_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/add_diagnostic_property_reference_test.dart
@@ -27,12 +27,14 @@
   @override
   void setUp() {
     super.setUp();
-    addFlutterPackage();
+    writeTestPackageConfig(
+      flutter: true,
+    );
   }
 
   Future<void> test_boolField() async {
     // todo(pq): when linter 0.1.118 is integrated, update DiagnosticableMixin to Diagnosticable
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/foundation.dart';
 import 'package:flutter/widgets.dart';
 
@@ -66,7 +68,7 @@
   }
 
   Future<void> test_boolField_empty() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/foundation.dart';
 import 'package:flutter/widgets.dart';
 
@@ -92,7 +94,7 @@
   }
 
   Future<void> test_boolField_empty_customParamName() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/foundation.dart';
 import 'package:flutter/widgets.dart';
 
@@ -118,7 +120,7 @@
   }
 
   Future<void> test_boolGetter() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/foundation.dart';
 import 'package:flutter/widgets.dart';
 
@@ -148,7 +150,7 @@
   }
 
   Future<void> test_colorField() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/foundation.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter/widgets.dart';
@@ -178,7 +180,7 @@
   }
 
   Future<void> test_doubleField() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/foundation.dart';
 import 'package:flutter/widgets.dart';
 
@@ -206,7 +208,7 @@
   }
 
   Future<void> test_dynamicField() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/foundation.dart';
 import 'package:flutter/widgets.dart';
 
@@ -234,7 +236,7 @@
   }
 
   Future<void> test_enumField() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/foundation.dart';
 import 'package:flutter/widgets.dart';
 
@@ -264,7 +266,7 @@
   }
 
   Future<void> test_functionField() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/foundation.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter/widgets.dart';
@@ -296,7 +298,7 @@
   }
 
   Future<void> test_intField() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/foundation.dart';
 import 'package:flutter/widgets.dart';
 
@@ -324,7 +326,7 @@
   }
 
   Future<void> test_iterableField() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/foundation.dart';
 import 'package:flutter/widgets.dart';
 
@@ -352,7 +354,7 @@
   }
 
   Future<void> test_listField() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/foundation.dart';
 import 'package:flutter/widgets.dart';
 
@@ -380,8 +382,11 @@
   }
 
   Future<void> test_matrix4Field() async {
-    addVectorMathPackage();
-    await resolveTestUnit('''
+    writeTestPackageConfig(
+      flutter: true,
+      vector_math: true,
+    );
+    await resolveTestCode('''
 import 'package:flutter/foundation.dart';
 import 'package:flutter/widgets.dart';
 import 'package:vector_math/vector_math_64.dart';
@@ -411,7 +416,7 @@
   }
 
   Future<void> test_objectField() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/foundation.dart';
 import 'package:flutter/widgets.dart';
 
@@ -439,7 +444,7 @@
   }
 
   Future<void> test_stringField() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/foundation.dart';
 import 'package:flutter/widgets.dart';
 
@@ -467,7 +472,7 @@
   }
 
   Future<void> test_stringField_noDebugFillProperties() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/foundation.dart';
 import 'package:flutter/widgets.dart';
 
@@ -491,7 +496,7 @@
   }
 
   Future<void> test_typeOutOfScopeField() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/foundation.dart';
 import 'package:flutter/widgets.dart';
 
@@ -523,7 +528,7 @@
   }
 
   Future<void> test_typeOutOfScopeGetter() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/foundation.dart';
 import 'package:flutter/widgets.dart';
 
@@ -555,7 +560,7 @@
   }
 
   Future<void> test_varField() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/foundation.dart';
 import 'package:flutter/widgets.dart';
 
diff --git a/pkg/analysis_server/test/src/services/correction/fix/add_explicit_cast_test.dart b/pkg/analysis_server/test/src/services/correction/fix/add_explicit_cast_test.dart
index 115d78c..ebf1233 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/add_explicit_cast_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/add_explicit_cast_test.dart
@@ -3,11 +3,11 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/src/services/correction/fix.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import '../../../../abstract_context.dart';
 import 'fix_processor.dart';
 
 void main() {
@@ -23,7 +23,7 @@
   FixKind get kind => DartFixKind.ADD_EXPLICIT_CAST;
 
   Future<void> test_as() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f(A a) {
   C c = a as B;
   print(c);
@@ -36,7 +36,7 @@
   }
 
   Future<void> test_assignment_general() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f(A a) {
   B b;
   b = a;
@@ -57,7 +57,7 @@
   }
 
   Future<void> test_assignment_general_all() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f(A a) {
   B b, b2;
   b = a;
@@ -78,7 +78,7 @@
   }
 
   Future<void> test_assignment_list() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f(List<A> a) {
   List<B> b;
   b = a.where((e) => e is B).toList();
@@ -99,7 +99,7 @@
   }
 
   Future<void> test_assignment_list_all() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f(List<A> a) {
   List<B> b, b2;
   b = a.where((e) => e is B).toList();
@@ -120,7 +120,7 @@
   }
 
   Future<void> test_assignment_map() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f(Map<A, B> a) {
   Map<B, A> b;
   b = a;
@@ -141,7 +141,7 @@
   }
 
   Future<void> test_assignment_map_all() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f(Map<A, B> a) {
   Map<B, A> b, b2;
   b = a;
@@ -162,7 +162,7 @@
   }
 
   Future<void> test_assignment_needsParens() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f(A a) {
   B b;
   b = a..m();
@@ -187,7 +187,7 @@
   }
 
   Future<void> test_assignment_needsParens_all() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f(A a) {
   B b, b2;
   b = a..m();
@@ -212,7 +212,7 @@
   }
 
   Future<void> test_assignment_set() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f(Set<A> a) {
   Set<B> b;
   b = a;
@@ -233,7 +233,7 @@
   }
 
   Future<void> test_assignment_set_all() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f(Set<A> a) {
   Set<B> b, b2;
   b = a;
@@ -254,7 +254,7 @@
   }
 
   Future<void> test_cast() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f(List<A> a) {
   List<B> b = a.cast<A>();
   print(b);
@@ -266,7 +266,7 @@
   }
 
   Future<void> test_declaration_general() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f(A a) {
   B b = a;
   print(b);
@@ -285,7 +285,7 @@
   }
 
   Future<void> test_declaration_general_all() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f(A a) {
   B b = a;
   B b2 = a;
@@ -304,7 +304,7 @@
   }
 
   Future<void> test_declaration_list() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f(List<A> a) {
   List<B> b = a.where((e) => e is B).toList();
   print(b);
@@ -323,7 +323,7 @@
   }
 
   Future<void> test_declaration_list_all() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f(List<A> a) {
   List<B> b = a.where((e) => e is B).toList();
   List<B> b2 = a.where((e) => e is B).toList();
@@ -342,7 +342,7 @@
   }
 
   Future<void> test_declaration_map() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f(Map<A, B> a) {
   Map<B, A> b = a;
   print(b);
@@ -361,7 +361,7 @@
   }
 
   Future<void> test_declaration_map_all() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f(Map<A, B> a) {
   Map<B, A> b = a;
   Map<B, A> b2 = a;
@@ -380,7 +380,7 @@
   }
 
   Future<void> test_declaration_needsParens() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f(A a) {
   B b = a..m();
   print(b);
@@ -403,7 +403,7 @@
   }
 
   Future<void> test_declaration_needsParens_all() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f(A a) {
   B b = a..m();
   B b2 = a..m();
@@ -426,7 +426,7 @@
   }
 
   Future<void> test_declaration_set() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f(Set<A> a) {
   Set<B> b = a;
   print(b);
@@ -445,7 +445,7 @@
   }
 
   Future<void> test_declaration_set_all() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f(Set<A> a) {
   Set<B> b = a;
   Set<B> b2 = a;
@@ -464,7 +464,7 @@
   }
 
   Future<void> test_notExpression_incomplete() async {
-    await resolveTestUnit(r'''
+    await resolveTestCode(r'''
 void foo(int a) {
   a = a < ;
 }
@@ -478,12 +478,10 @@
 }
 
 @reflectiveTest
-class AddExplicitCastWithNullSafetyTest extends AddExplicitCastTest {
-  @override
-  List<String> get experiments => [EnableString.non_nullable];
-
+class AddExplicitCastWithNullSafetyTest extends AddExplicitCastTest
+    with WithNullSafetyMixin {
   Future<void> test_assignment_null() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void f(int x) {
   x = null;
 }
@@ -492,7 +490,7 @@
   }
 
   Future<void> test_assignment_nullable() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void f(int x, int? y) {
   x = y;
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/add_field_formal_parameters_test.dart b/pkg/analysis_server/test/src/services/correction/fix/add_field_formal_parameters_test.dart
index 61a6718..b8dbde7 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/add_field_formal_parameters_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/add_field_formal_parameters_test.dart
@@ -20,8 +20,11 @@
   FixKind get kind => DartFixKind.ADD_FIELD_FORMAL_PARAMETERS;
 
   Future<void> test_flutter() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
+    writeTestPackageConfig(
+      flutter: true,
+    );
+
+    await resolveTestCode('''
 import 'package:flutter/widgets.dart';
 
 class MyWidget extends StatelessWidget {
@@ -46,7 +49,7 @@
   }
 
   Future<void> test_hasRequiredParameter() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class Test {
   final int a;
   final int b;
@@ -65,7 +68,7 @@
   }
 
   Future<void> test_noParameters() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class Test {
   final int a;
   final int b;
@@ -84,7 +87,7 @@
   }
 
   Future<void> test_noRequiredParameter() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class Test {
   final int a;
   final int b;
@@ -103,7 +106,7 @@
   }
 
   Future<void> test_notAllFinal() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class Test {
   final int a;
   int b;
diff --git a/pkg/analysis_server/test/src/services/correction/fix/add_late_test.dart b/pkg/analysis_server/test/src/services/correction/fix/add_late_test.dart
index 9a67e6e..9558f70 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/add_late_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/add_late_test.dart
@@ -3,10 +3,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/src/services/correction/fix.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import '../../../../abstract_context.dart';
 import 'fix_processor.dart';
 
 void main() {
@@ -22,7 +22,7 @@
   FixKind get kind => DartFixKind.ADD_LATE;
 
   Future<void> test_withFinal() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class C {
   final String s;
 }
@@ -32,15 +32,12 @@
 }
 
 @reflectiveTest
-class AddLateTest extends FixProcessorTest {
-  @override
-  List<String> get experiments => [EnableString.non_nullable];
-
+class AddLateTest extends FixProcessorTest with WithNullSafetyMixin {
   @override
   FixKind get kind => DartFixKind.ADD_LATE;
 
   Future<void> test_withFinal() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class C {
   final String s;
 }
@@ -53,7 +50,7 @@
   }
 
   Future<void> test_withLate() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class C {
   late s;
 }
@@ -62,7 +59,7 @@
   }
 
   Future<void> test_withType() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class C {
   String s;
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/add_missing_enum_case_clauses_test.dart b/pkg/analysis_server/test/src/services/correction/fix/add_missing_enum_case_clauses_test.dart
index 09f61ed..f23da1c 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/add_missing_enum_case_clauses_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/add_missing_enum_case_clauses_test.dart
@@ -39,7 +39,7 @@
   }
 
   Future<void> test_empty() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 enum E {a, b, c}
 void f(E e) {
   switch (e) {
@@ -65,7 +65,7 @@
   }
 
   Future<void> test_incomplete_switchStatement() async {
-    await resolveTestUnit(r'''
+    await resolveTestCode(r'''
 enum E {a, b, c}
 
 void f(E e) {
@@ -76,7 +76,7 @@
   }
 
   Future<void> test_nonEmpty() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 enum E {a, b, c}
 void f(E e) {
   switch (e) {
diff --git a/pkg/analysis_server/test/src/services/correction/fix/add_missing_parameter_named_test.dart b/pkg/analysis_server/test/src/services/correction/fix/add_missing_parameter_named_test.dart
index eee9f5c..d1572d6 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/add_missing_parameter_named_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/add_missing_parameter_named_test.dart
@@ -20,7 +20,7 @@
   FixKind get kind => DartFixKind.ADD_MISSING_PARAMETER_NAMED;
 
   Future<void> test_constructor_hasNamed() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   A(int a, {int b}) {}
 }
@@ -41,7 +41,7 @@
   }
 
   Future<void> test_constructor_hasRequired() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   A(int a) {}
 }
@@ -62,7 +62,7 @@
   }
 
   Future<void> test_constructor_noParameters() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   A() {}
 }
@@ -83,7 +83,7 @@
   }
 
   Future<void> test_constructor_noParameters_named() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   A.aaa() {}
 }
@@ -104,7 +104,7 @@
   }
 
   Future<void> test_function_hasNamed() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 test(int a, {int b: 0}) {}
 
 main() {
@@ -121,7 +121,7 @@
   }
 
   Future<void> test_function_hasRequired() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 test(int a) {}
 
 main() {
@@ -138,7 +138,7 @@
   }
 
   Future<void> test_function_noParameters() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 test() {}
 
 main() {
@@ -155,7 +155,7 @@
   }
 
   Future<void> test_method_hasNamed() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   test(int a, {int b: 0}) {}
 
@@ -176,7 +176,7 @@
   }
 
   Future<void> test_method_hasOptionalPositional() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   test(int a, [int b]) {}
 
@@ -189,7 +189,7 @@
   }
 
   Future<void> test_method_hasRequired() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   test(int a) {}
 
@@ -210,7 +210,7 @@
   }
 
   Future<void> test_method_noParameters() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   test() {}
 
diff --git a/pkg/analysis_server/test/src/services/correction/fix/add_missing_parameter_positional_test.dart b/pkg/analysis_server/test/src/services/correction/fix/add_missing_parameter_positional_test.dart
index 757b017..532f7a1 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/add_missing_parameter_positional_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/add_missing_parameter_positional_test.dart
@@ -20,7 +20,7 @@
   FixKind get kind => DartFixKind.ADD_MISSING_PARAMETER_POSITIONAL;
 
   Future<void> test_function_hasNamed() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 test({int a}) {}
 main() {
   test(1);
@@ -30,7 +30,7 @@
   }
 
   Future<void> test_function_hasZero() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 test() {}
 main() {
   test(1);
@@ -45,7 +45,7 @@
   }
 
   Future<void> test_method_hasOne() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   test(int a) {}
   main() {
diff --git a/pkg/analysis_server/test/src/services/correction/fix/add_missing_parameter_required_test.dart b/pkg/analysis_server/test/src/services/correction/fix/add_missing_parameter_required_test.dart
index 293c98a..0f5c502 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/add_missing_parameter_required_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/add_missing_parameter_required_test.dart
@@ -23,7 +23,7 @@
   FixKind get kind => DartFixKind.ADD_MISSING_PARAMETER_REQUIRED;
 
   Future<void> test_constructor_named_hasOne() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   A.named(int a) {}
 }
@@ -42,7 +42,7 @@
   }
 
   Future<void> test_constructor_unnamed_hasOne() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   A(int a) {}
 }
@@ -61,7 +61,7 @@
   }
 
   Future<void> test_function_hasNamed() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 test({int a}) {}
 main() {
   test(1);
@@ -76,7 +76,7 @@
   }
 
   Future<void> test_function_hasOne() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 test(int a) {}
 main() {
   test(1, 2.0);
@@ -91,7 +91,7 @@
   }
 
   Future<void> test_function_hasZero() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 test() {}
 main() {
   test(1);
@@ -106,7 +106,7 @@
   }
 
   Future<void> test_method_hasOne() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   test(int a) {}
   main() {
@@ -125,7 +125,7 @@
   }
 
   Future<void> test_method_hasZero() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   test() {}
   main() {
@@ -156,14 +156,18 @@
 
   Future<void> test_function_inPackage_inWorkspace() async {
     newFile('/home/aaa/lib/a.dart', content: 'void test() {}');
-    addTestPackageDependency('aaa', '/home/aaa');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'aaa', rootPath: '$workspaceRootPath/aaa'),
+    );
 
     _workspace = DartChangeWorkspace([
       session,
       getContext('/home/aaa').currentSession,
     ]);
 
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:aaa/a.dart';
 
 main() {
@@ -178,9 +182,14 @@
   }
 
   Future<void> test_function_inPackage_outsideWorkspace() async {
-    addPackageFile('bbb', 'b.dart', 'void test() {}');
+    newFile('/home/bbb/lib/b.dart', content: 'void test() {}');
 
-    await resolveTestUnit('''
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'bbb', rootPath: '$workspaceRootPath/bbb'),
+    );
+
+    await resolveTestCode('''
 import 'package:bbb/b.dart';
 
 main() {
@@ -191,7 +200,7 @@
   }
 
   Future<void> test_method_inSdk() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   42.abs(true);
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/add_missing_required_argument_test.dart b/pkg/analysis_server/test/src/services/correction/fix/add_missing_required_argument_test.dart
index 2eb4fa8..b29d1e8 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/add_missing_required_argument_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/add_missing_required_argument_test.dart
@@ -3,10 +3,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/src/services/correction/fix.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import '../../../../abstract_context.dart';
 import 'fix_processor.dart';
 
 void main() {
@@ -21,10 +21,16 @@
   @override
   FixKind get kind => DartFixKind.ADD_MISSING_REQUIRED_ARGUMENT;
 
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(
+      flutter: true,
+    );
+  }
+
   Future<void> test_constructor_flutter_children() async {
-    addFlutterPackage();
-    addMetaPackage();
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/widgets.dart';
 import 'package:meta/meta.dart';
 
@@ -51,9 +57,7 @@
   }
 
   Future<void> test_constructor_flutter_hasTrailingComma() async {
-    addFlutterPackage();
-    addMetaPackage();
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/widgets.dart';
 import 'package:meta/meta.dart';
 
@@ -80,8 +84,7 @@
   }
 
   Future<void> test_constructor_named() async {
-    addMetaPackage();
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:meta/meta.dart';
 
 class A {
@@ -108,7 +111,6 @@
   }
 
   Future<void> test_constructor_single() async {
-    addMetaPackage();
     addSource('/home/test/lib/a.dart', r'''
 import 'package:meta/meta.dart';
 
@@ -116,7 +118,7 @@
   A({@required int a}) {}
 }
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:test/a.dart';
 
 main() {
@@ -135,7 +137,6 @@
   }
 
   Future<void> test_constructor_single_closure() async {
-    addMetaPackage();
     addSource('/home/test/lib/a.dart', r'''
 import 'package:meta/meta.dart';
 
@@ -145,7 +146,7 @@
   A({@required VoidCallback onPressed}) {}
 }
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:test/a.dart';
 
 main() {
@@ -164,7 +165,6 @@
   }
 
   Future<void> test_constructor_single_closure2() async {
-    addMetaPackage();
     addSource('/home/test/lib/a.dart', r'''
 import 'package:meta/meta.dart';
 
@@ -174,7 +174,7 @@
   A({@required Callback callback}) {}
 }
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:test/a.dart';
 
 main() {
@@ -193,7 +193,6 @@
   }
 
   Future<void> test_constructor_single_closure3() async {
-    addMetaPackage();
     addSource('/home/test/lib/a.dart', r'''
 import 'package:meta/meta.dart';
 
@@ -203,7 +202,7 @@
   A({@required Callback callback}) {}
 }
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:test/a.dart';
 
 main() {
@@ -222,7 +221,6 @@
   }
 
   Future<void> test_constructor_single_closure4() async {
-    addMetaPackage();
     addSource('/home/test/lib/a.dart', r'''
 import 'package:meta/meta.dart';
 
@@ -232,7 +230,7 @@
   A({@required Callback callback}) {}
 }
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:test/a.dart';
 
 main() {
@@ -250,101 +248,7 @@
 ''');
   }
 
-  Future<void> test_constructor_single_closure_nnbd() async {
-    createAnalysisOptionsFile(experiments: [EnableString.non_nullable]);
-    addMetaPackage();
-    addSource('/home/test/lib/a.dart', r'''
-import 'package:meta/meta.dart';
-
-typedef int Callback(int? a);
-
-class A {
-  A({@required Callback callback}) {}
-}
-''');
-    await resolveTestUnit('''
-import 'package:test/a.dart';
-
-main() {
-  A a = new A();
-  print(a);
-}
-''');
-    await assertHasFix('''
-import 'package:test/a.dart';
-
-main() {
-  A a = new A(callback: (int? a) {  });
-  print(a);
-}
-''');
-  }
-
-  Future<void> test_constructor_single_closure_nnbd_from_legacy() async {
-    createAnalysisOptionsFile(experiments: [EnableString.non_nullable]);
-    addMetaPackage();
-    addSource('/home/test/lib/a.dart', r'''
-// @dart = 2.8
-import 'package:meta/meta.dart';
-
-typedef int Callback(int a);
-
-class A {
-  A({@required Callback callback}) {}
-}
-''');
-    await resolveTestUnit('''
-import 'package:test/a.dart';
-
-main() {
-  A a = new A();
-  print(a);
-}
-''');
-    await assertHasFix('''
-import 'package:test/a.dart';
-
-main() {
-  A a = new A(callback: (int a) {  });
-  print(a);
-}
-''');
-  }
-
-  Future<void> test_constructor_single_closure_nnbd_into_legacy() async {
-    createAnalysisOptionsFile(experiments: [EnableString.non_nullable]);
-    addMetaPackage();
-    addSource('/home/test/lib/a.dart', r'''
-import 'package:meta/meta.dart';
-
-typedef int Callback(int? a);
-
-class A {
-  A({@required Callback callback}) {}
-}
-''');
-    await resolveTestUnit('''
-// @dart = 2.8
-import 'package:test/a.dart';
-
-main() {
-  A a = new A();
-  print(a);
-}
-''');
-    await assertHasFix('''
-// @dart = 2.8
-import 'package:test/a.dart';
-
-main() {
-  A a = new A(callback: (int a) {  });
-  print(a);
-}
-''');
-  }
-
   Future<void> test_constructor_single_list() async {
-    addMetaPackage();
     addSource('/home/test/lib/a.dart', r'''
 import 'package:meta/meta.dart';
 
@@ -352,7 +256,7 @@
   A({@required List<String> names}) {}
 }
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:test/a.dart';
 
 main() {
@@ -371,8 +275,7 @@
   }
 
   Future<void> test_multiple() async {
-    addMetaPackage();
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:meta/meta.dart';
 
 test({@required int a, @required int bcd}) {}
@@ -391,8 +294,7 @@
   }
 
   Future<void> test_multiple_1of2() async {
-    addMetaPackage();
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:meta/meta.dart';
 
 test({@required int a, @required int bcd}) {}
@@ -411,8 +313,7 @@
   }
 
   Future<void> test_multiple_2of2() async {
-    addMetaPackage();
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:meta/meta.dart';
 
 test({@required int a, @required int bcd}) {}
@@ -431,9 +332,7 @@
   }
 
   Future<void> test_param_child() async {
-    addFlutterPackage();
-    addMetaPackage();
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/widgets.dart';
 import 'package:meta/meta.dart';
 
@@ -465,9 +364,7 @@
   }
 
   Future<void> test_param_children() async {
-    addFlutterPackage();
-    addMetaPackage();
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/widgets.dart';
 import 'package:meta/meta.dart';
 
@@ -499,8 +396,7 @@
   }
 
   Future<void> test_single() async {
-    addMetaPackage();
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:meta/meta.dart';
 
 test({@required int abc}) {}
@@ -520,8 +416,7 @@
   }
 
   Future<void> test_single_normal() async {
-    addMetaPackage();
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:meta/meta.dart';
 
 test(String x, {@required int abc}) {}
@@ -540,8 +435,7 @@
   }
 
   Future<void> test_single_with_details() async {
-    addMetaPackage();
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:meta/meta.dart';
 
 test({@Required("Really who doesn't need an abc?") int abc}) {}
@@ -561,15 +455,103 @@
 }
 
 @reflectiveTest
-class AddMissingRequiredArgumentWithNullSafetyTest extends FixProcessorTest {
-  @override
-  List<String> get experiments => [EnableString.non_nullable];
-
+class AddMissingRequiredArgumentWithNullSafetyTest extends FixProcessorTest
+    with WithNullSafetyMixin {
   @override
   FixKind get kind => DartFixKind.ADD_MISSING_REQUIRED_ARGUMENT;
 
+  @override
+  bool get withPackageMeta => true;
+
+  Future<void> test_constructor_single_closure_nnbd() async {
+    addSource('/home/test/lib/a.dart', r'''
+import 'package:meta/meta.dart';
+
+typedef int Callback(int? a);
+
+class A {
+  A({@required Callback callback}) {}
+}
+''');
+    await resolveTestCode('''
+import 'package:test/a.dart';
+
+main() {
+  A a = new A();
+  print(a);
+}
+''');
+    await assertHasFix('''
+import 'package:test/a.dart';
+
+main() {
+  A a = new A(callback: (int? a) {  });
+  print(a);
+}
+''');
+  }
+
+  Future<void> test_constructor_single_closure_nnbd_from_legacy() async {
+    addSource('/home/test/lib/a.dart', r'''
+// @dart = 2.8
+import 'package:meta/meta.dart';
+
+typedef int Callback(int a);
+
+class A {
+  A({@required Callback callback}) {}
+}
+''');
+    await resolveTestCode('''
+import 'package:test/a.dart';
+
+main() {
+  A a = new A();
+  print(a);
+}
+''');
+    await assertHasFix('''
+import 'package:test/a.dart';
+
+main() {
+  A a = new A(callback: (int a) {  });
+  print(a);
+}
+''');
+  }
+
+  Future<void> test_constructor_single_closure_nnbd_into_legacy() async {
+    addSource('/home/test/lib/a.dart', r'''
+import 'package:meta/meta.dart';
+
+typedef int Callback(int? a);
+
+class A {
+  A({@required Callback callback}) {}
+}
+''');
+    await resolveTestCode('''
+// @dart = 2.8
+import 'package:test/a.dart';
+
+main() {
+  A a = new A();
+  print(a);
+}
+''');
+    await assertHasFix('''
+// @dart = 2.8
+import 'package:test/a.dart';
+
+main() {
+  A a = new A(callback: (int a) {  });
+  print(a);
+}
+''');
+  }
+
   Future<void> test_nonNullable() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void f({required int x}) {}
 void g() {
   f();
@@ -584,7 +566,7 @@
   }
 
   Future<void> test_nullable() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void f({required int? x}) {}
 void g() {
   f();
diff --git a/pkg/analysis_server/test/src/services/correction/fix/add_ne_null_test.dart b/pkg/analysis_server/test/src/services/correction/fix/add_ne_null_test.dart
index 657adcc..95302e6 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/add_ne_null_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/add_ne_null_test.dart
@@ -21,7 +21,7 @@
   FixKind get kind => DartFixKind.ADD_NE_NULL;
 
   Future<void> test_nonBoolCondition() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main(String p) {
   if (p) {
     print(p);
@@ -38,7 +38,7 @@
   }
 
   Future<void> test_nonBoolCondition_all() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main(String p, String q) {
   if (p) {
     print(p);
diff --git a/pkg/analysis_server/test/src/services/correction/fix/add_null_check_test.dart b/pkg/analysis_server/test/src/services/correction/fix/add_null_check_test.dart
index 67c35f1..dc640e4 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/add_null_check_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/add_null_check_test.dart
@@ -3,10 +3,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/src/services/correction/fix.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import '../../../../abstract_context.dart';
 import 'fix_processor.dart';
 
 void main() {
@@ -16,15 +16,12 @@
 }
 
 @reflectiveTest
-class AddNullCheckTest extends FixProcessorTest {
-  @override
-  List<String> get experiments => [EnableString.non_nullable];
-
+class AddNullCheckTest extends FixProcessorTest with WithNullSafetyMixin {
   @override
   FixKind get kind => DartFixKind.ADD_NULL_CHECK;
 
   Future<void> test_argument() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void f(int x) {}
 void g(int? y) {
   f(y);
@@ -39,7 +36,7 @@
   }
 
   Future<void> test_argument_differByMoreThanNullability() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void f(int x) {}
 void g(String y) {
   f(y);
@@ -49,7 +46,7 @@
   }
 
   Future<void> test_assignment() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void f(int x, int? y) {
   x = y;
 }
@@ -63,7 +60,7 @@
 
   Future<void>
       test_assignment_differByMoreThanNullability_nonNullableRight() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void f(int x, String y) {
   x = y;
 }
@@ -73,7 +70,7 @@
 
   Future<void>
       test_assignment_differByMoreThanNullability_nullableRight() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void f(int x, String? y) {
   x = y;
 }
@@ -82,7 +79,7 @@
   }
 
   Future<void> test_assignment_needsParens() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void f(A x) {
   x = x + x;
 }
@@ -101,7 +98,7 @@
   }
 
   Future<void> test_initializer() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void f(int? x) {
   int y = x;
   print(y);
@@ -116,7 +113,7 @@
   }
 
   Future<void> test_initializer_differByMoreThanNullability() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void f(String x) {
   int y = x;
   print(y);
diff --git a/pkg/analysis_server/test/src/services/correction/fix/add_override_test.dart b/pkg/analysis_server/test/src/services/correction/fix/add_override_test.dart
index 1205817..7a33711 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/add_override_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/add_override_test.dart
@@ -24,7 +24,7 @@
   String get lintCode => LintNames.annotate_overrides;
 
   Future<void> test_field() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 abstract class Test {
   int get t;
 }
@@ -44,7 +44,7 @@
   }
 
   Future<void> test_getter() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class Test {
   int get t => null;
 }
@@ -64,7 +64,7 @@
   }
 
   Future<void> test_method() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class Test {
   void t() { }
 }
@@ -84,7 +84,7 @@
   }
 
   Future<void> test_method_with_doc_comment() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class Test {
   void t() { }
 }
@@ -106,7 +106,7 @@
   }
 
   Future<void> test_method_with_doc_comment_2() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class Test {
   void t() { }
 }
@@ -132,7 +132,7 @@
   }
 
   Future<void> test_method_with_doc_comment_and_metadata() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class Test {
   void t() { }
 }
@@ -158,7 +158,7 @@
   }
 
   Future<void> test_method_with_non_doc_comment() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class Test {
   void t() { }
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/add_required_test.dart b/pkg/analysis_server/test/src/services/correction/fix/add_required_test.dart
index 9b90123..1f22076 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/add_required_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/add_required_test.dart
@@ -4,10 +4,10 @@
 
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analysis_server/src/services/linter/lint_names.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import '../../../../abstract_context.dart';
 import 'fix_processor.dart';
 
 void main() {
@@ -26,7 +26,7 @@
   String get lintCode => LintNames.always_require_non_null_named_parameters;
 
   Future<void> test_withAssert() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void function({String param}) {
   assert(param != null);
 }
@@ -40,15 +40,13 @@
 }
 
 @reflectiveTest
-class AddRequiredWithNullSafetyTest extends FixProcessorTest {
-  @override
-  List<String> get experiments => [EnableString.non_nullable];
-
+class AddRequiredWithNullSafetyTest extends FixProcessorTest
+    with WithNullSafetyMixin {
   @override
   FixKind get kind => DartFixKind.ADD_REQUIRED2;
 
   Future<void> test_withAssert() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void function({String param}) {}
 ''');
     await assertHasFix('''
diff --git a/pkg/analysis_server/test/src/services/correction/fix/add_return_type_test.dart b/pkg/analysis_server/test/src/services/correction/fix/add_return_type_test.dart
index b3a2423..75a8383 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/add_return_type_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/add_return_type_test.dart
@@ -24,7 +24,7 @@
   String get lintCode => LintNames.always_declare_return_types;
 
   Future<void> test_localFunction_block() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   void m() {
     f() {
@@ -47,7 +47,7 @@
   }
 
   Future<void> test_localFunction_expression() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   void m() {
     f() => '';
@@ -66,7 +66,7 @@
   }
 
   Future<void> test_method_block_noReturn() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   m() {
   }
@@ -76,7 +76,7 @@
   }
 
   Future<void> test_method_block_returnDynamic() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   m(p) {
     return p;
@@ -93,7 +93,7 @@
   }
 
   Future<void> test_method_block_returnNoValue() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   m() {
     return;
@@ -110,7 +110,7 @@
   }
 
   Future<void> test_method_block_singleReturn() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   m() {
     return '';
@@ -127,7 +127,7 @@
   }
 
   Future<void> test_method_expression() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   m() => '';
 }
@@ -140,7 +140,7 @@
   }
 
   Future<void> test_method_getter() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   get foo => 0;
 }
@@ -153,7 +153,7 @@
   }
 
   Future<void> test_topLevelFunction_block() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f() {
   return '';
 }
@@ -166,7 +166,7 @@
   }
 
   Future<void> test_topLevelFunction_expression() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f() => '';
 ''');
     await assertHasFix('''
@@ -175,7 +175,7 @@
   }
 
   Future<void> test_topLevelFunction_getter() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 get foo => 0;
 ''');
     await assertHasFix('''
diff --git a/pkg/analysis_server/test/src/services/correction/fix/add_static_test.dart b/pkg/analysis_server/test/src/services/correction/fix/add_static_test.dart
index d547fbf..7fd378a 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/add_static_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/add_static_test.dart
@@ -20,7 +20,7 @@
   FixKind get kind => DartFixKind.ADD_STATIC;
 
   Future<void> test_multipleFields() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class C {
   const int x = 0, y = 0;
 }
@@ -33,7 +33,7 @@
   }
 
   Future<void> test_oneField() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class C {
   const int x = 0;
 }
@@ -46,7 +46,7 @@
   }
 
   Future<void> test_withAnnotation() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class C {
   @ann
   const int x = 0;
@@ -63,7 +63,7 @@
   }
 
   Future<void> test_withDocComment() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class C {
   /// Doc comment
   const int x = 0;
diff --git a/pkg/analysis_server/test/src/services/correction/fix/add_super_constructor_invocation_test.dart b/pkg/analysis_server/test/src/services/correction/fix/add_super_constructor_invocation_test.dart
index ba495c8..ce129cc 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/add_super_constructor_invocation_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/add_super_constructor_invocation_test.dart
@@ -20,7 +20,7 @@
   FixKind get kind => DartFixKind.ADD_SUPER_CONSTRUCTOR_INVOCATION;
 
   Future<void> test_hasInitializers() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   A(int p);
 }
@@ -41,7 +41,7 @@
   }
 
   Future<void> test_named() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   A.named(int p);
 }
@@ -60,9 +60,9 @@
   }
 
   Future<void> test_named_private() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
-  A._named(int p); // ignore: unused_element
+  A._named(int p);
 }
 class B extends A {
   B() {}
@@ -72,7 +72,7 @@
   }
 
   Future<void> test_requiredAndNamed() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   A(bool p1, int p2, double p3, String p4, {p5});
 }
@@ -91,7 +91,7 @@
   }
 
   Future<void> test_typeArgument() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A<T> {
   A(T p);
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/add_type_annotation_test.dart b/pkg/analysis_server/test/src/services/correction/fix/add_type_annotation_test.dart
index 4322e01..dd375be 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/add_type_annotation_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/add_type_annotation_test.dart
@@ -27,7 +27,7 @@
   // More coverage in the `add_type_annotation_test.dart` assist test.
 
   Future<void> test_do_block() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   final f = 0;
 }
@@ -47,7 +47,7 @@
 
   Future<void> test_missingFieldType() async {
     // MISSING_CONST_FINAL_VAR_OR_TYPE
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   f = 0;
 }
@@ -61,7 +61,7 @@
 
   Future<void> test_missingStaticFieldType() async {
     // MISSING_CONST_FINAL_VAR_OR_TYPE
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   static f = 0;
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/add_await_test.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/add_await_test.dart
index 5ee8044..dc61da4 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/bulk/add_await_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/add_await_test.dart
@@ -19,7 +19,7 @@
   String get lintCode => LintNames.unawaited_futures;
 
   Future<void> test_singleFile() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 Future doSomething() => new Future.value('');
 Future doSomethingElse() => new Future.value('');
 
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/add_const_test.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/add_const_test.dart
index 735e1c5..d20eaf8 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/bulk/add_const_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/add_const_test.dart
@@ -22,8 +22,8 @@
   /// Disabled in BulkFixProcessor.
   @failingTest
   Future<void> test_singleFile() async {
-    addMetaPackage();
-    await resolveTestUnit(r'''
+    writeTestPackageConfig(meta: true);
+    await resolveTestCode(r'''
 class C {
   const C([C c]);
 }
@@ -45,8 +45,8 @@
   String get lintCode => LintNames.prefer_const_constructors_in_immutables;
 
   Future<void> test_singleFile() async {
-    addMetaPackage();
-    await resolveTestUnit('''
+    writeTestPackageConfig(meta: true);
+    await resolveTestCode('''
 import 'package:meta/meta.dart';
 
 @immutable
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/add_diagnostic_property_reference_test.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/add_diagnostic_property_reference_test.dart
index cda5640..0fead9f 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/bulk/add_diagnostic_property_reference_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/add_diagnostic_property_reference_test.dart
@@ -19,8 +19,8 @@
   String get lintCode => LintNames.diagnostic_describe_all_properties;
 
   Future<void> test_singleFile() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
+    writeTestPackageConfig(flutter: true);
+    await resolveTestCode('''
 import 'package:flutter/foundation.dart';
 import 'package:flutter/widgets.dart';
 
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/add_override_test.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/add_override_test.dart
index afd882d..b62d97e 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/bulk/add_override_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/add_override_test.dart
@@ -19,7 +19,7 @@
   String get lintCode => LintNames.annotate_overrides;
 
   Future<void> test_singleFile() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   void a() {}
   void aa() {}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/bulk_fix_processor.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/bulk_fix_processor.dart
index bd51bc3..de7282e 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/bulk/bulk_fix_processor.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/bulk_fix_processor.dart
@@ -46,6 +46,12 @@
     expect(resultCode, expected);
   }
 
+  Future<void> assertNoFix() async {
+    change = await _computeFixes();
+    var fileEdits = change.edits;
+    expect(fileEdits, isEmpty);
+  }
+
   @override
   void setUp() {
     super.setUp();
@@ -56,9 +62,10 @@
   /// Computes fixes for the given [error] in [testUnit].
   Future<SourceChange> _computeFixes() async {
     var tracker = DeclarationsTracker(MemoryByteStore(), resourceProvider);
-    tracker.addContext(driver.analysisContext);
+    var analysisContext = contextFor(testFile);
+    tracker.addContext(analysisContext);
     var changeBuilder =
-        await BulkFixProcessor(workspace).fixErrors([driver.analysisContext]);
+        await BulkFixProcessor(workspace).fixErrors([analysisContext]);
     return changeBuilder.sourceChange;
   }
 
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_documentation_into_line_test.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_documentation_into_line_test.dart
index 5a5d169..2094c37 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_documentation_into_line_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_documentation_into_line_test.dart
@@ -19,7 +19,7 @@
   String get lintCode => LintNames.slash_for_doc_comments;
 
   Future<void> test_singleFile() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 /**
  * C
  */
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_map_from_iterable_to_for_literal_test.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_map_from_iterable_to_for_literal_test.dart
index 151df66..d9e3834 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_map_from_iterable_to_for_literal_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_map_from_iterable_to_for_literal_test.dart
@@ -19,7 +19,7 @@
   String get lintCode => LintNames.prefer_for_elements_to_map_fromIterable;
 
   Future<void> test_singleFile() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f(Iterable<int> i) {
   var k = 3;
   return Map.fromIterable(i, key: (k) => k * 2, value: (v) => k);
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_to_contains_test.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_to_contains_test.dart
index 5e7445b..eacb1cc 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_to_contains_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_to_contains_test.dart
@@ -19,7 +19,7 @@
   String get lintCode => LintNames.prefer_contains;
 
   Future<void> test_singleFile() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 bool f(List<int> list, int value) {
   return -1 != list.indexOf(value);
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_to_generic_function_syntax_test.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_to_generic_function_syntax_test.dart
index 8d55491..af826e2 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_to_generic_function_syntax_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_to_generic_function_syntax_test.dart
@@ -19,7 +19,7 @@
   String get lintCode => LintNames.prefer_generic_function_type_aliases;
 
   Future<void> test_singleFile() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 typedef String F(int x);
 typedef F2<P, R>(P x);
 ''');
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_to_if_element_test.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_to_if_element_test.dart
index 4e3908a..e965e54 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_to_if_element_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_to_if_element_test.dart
@@ -20,7 +20,7 @@
       LintNames.prefer_if_elements_to_conditional_expressions;
 
   Future<void> test_singleFile() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 String f(bool b) {
   return ['a', b ? 'c' : 'd', 'e'];
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_to_if_null_test.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_to_if_null_test.dart
index d587043..5bca56c 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_to_if_null_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_to_if_null_test.dart
@@ -19,7 +19,7 @@
   String get lintCode => LintNames.prefer_if_null_operators;
 
   Future<void> test_singleFile() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void f(String s) {
   print(s == null ? 'default' : s);
   print(s != null ? s : 'default');
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_to_int_literal_test.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_to_int_literal_test.dart
index a86f1f6..32b17ce 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_to_int_literal_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_to_int_literal_test.dart
@@ -19,7 +19,7 @@
   String get lintCode => LintNames.prefer_int_literals;
 
   Future<void> test_singleFile() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 const double d1 = 42.0;
 double d2 = 7.0e2;
 ''');
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_to_list_literal_test.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_to_list_literal_test.dart
index 8810f14..af7f3cb 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_to_list_literal_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_to_list_literal_test.dart
@@ -19,7 +19,7 @@
   String get lintCode => LintNames.prefer_collection_literals;
 
   Future<void> test_singleFile() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 List l = List();
 var l2 = List<int>();
 ''');
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_to_map_literal_test.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_to_map_literal_test.dart
index 066755e..cb02894 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_to_map_literal_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_to_map_literal_test.dart
@@ -19,7 +19,7 @@
   String get lintCode => LintNames.prefer_collection_literals;
 
   Future<void> test_singleFile() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 Map m = Map();
 var m2 = Map<String, int>();
 ''');
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_to_null_aware_test.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_to_null_aware_test.dart
index ed938e6..e30e7d7 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_to_null_aware_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_to_null_aware_test.dart
@@ -19,7 +19,7 @@
   String get lintCode => LintNames.prefer_null_aware_operators;
 
   Future<void> test_singleFile() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   int m(int p) => p;
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_to_relative_import_test.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_to_relative_import_test.dart
index 8319104..40b022f 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_to_relative_import_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_to_relative_import_test.dart
@@ -27,7 +27,7 @@
 ''');
     testFile = convertPath('/home/test/lib/src/test.dart');
 
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:test/bar.dart';
 import 'package:test/foo.dart';
 C c;
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_to_set_literal_test.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_to_set_literal_test.dart
index 526e697..bfcaf1c 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_to_set_literal_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_to_set_literal_test.dart
@@ -19,7 +19,7 @@
   String get lintCode => LintNames.prefer_collection_literals;
 
   Future<void> test_singleFile() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 Set s = Set();
 var s1 = Set<int>();
 ''');
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_to_single_quoted_strings_test.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_to_single_quoted_strings_test.dart
index 7bc1a30..68a54c0 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_to_single_quoted_strings_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_to_single_quoted_strings_test.dart
@@ -19,7 +19,7 @@
   String get lintCode => LintNames.prefer_single_quotes;
 
   Future<void> test_singleFile() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   print("abc");
   print("e" + "f" + "g");
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_to_spread_test.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_to_spread_test.dart
index 59bdc19..ddbdc0a 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_to_spread_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_to_spread_test.dart
@@ -19,7 +19,7 @@
   String get lintCode => LintNames.prefer_spread_collections;
 
   Future<void> test_singleFile() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f() {
   var ints = [1, 2, 3];
   print(['a']..addAll(ints.map((i) => i.toString()))..addAll(['c']));
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_to_where_type_test.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_to_where_type_test.dart
index 12bc2eb..62788ef 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_to_where_type_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_to_where_type_test.dart
@@ -19,7 +19,7 @@
   String get lintCode => LintNames.prefer_iterable_whereType;
 
   Future<void> test_singleFile() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 Iterable<C> f(List<Object> list) {
   return list.where((e) => e is C);
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/create_method_test.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/create_method_test.dart
index 5933dbe..cf17881 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/bulk/create_method_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/create_method_test.dart
@@ -19,7 +19,7 @@
   String get lintCode => LintNames.hash_and_equals;
 
   Future<void> test_singleFile() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class C {
   @override
   int get hashCode => 13;
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/data_driven_test.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/data_driven_test.dart
index 67caf6c..8404c8b 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/bulk/data_driven_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/data_driven_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/src/services/correction/fix/data_driven/transform_set_manager.dart';
+import 'package:analyzer/src/test_utilities/package_config_file_builder.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import 'bulk_fix_processor.dart';
@@ -16,6 +17,7 @@
     defineReflectiveTests(InvalidOverrideTest);
     defineReflectiveTests(MixinOfNonClassTest);
     defineReflectiveTests(NewWithUndefinedConstructorDefaultTest);
+    defineReflectiveTests(NonBulkFixTest);
     defineReflectiveTests(NotEnoughPositionalArgumentsTest);
     defineReflectiveTests(OverrideOnNonOverridingMethodTest);
     defineReflectiveTests(UndefinedClassTest);
@@ -51,7 +53,7 @@
     - kind: 'rename'
       newName: 'New'
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 class A extends Old {}
 class B extends Old {}
@@ -79,7 +81,7 @@
     - kind: 'rename'
       newName: 'New'
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 class A extends Old {}
 class B extends Old {}
@@ -125,7 +127,7 @@
     - kind: 'removeParameter'
       index: 1
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 void g() {
   f(0, f(1, 2));
@@ -162,7 +164,7 @@
     - kind: 'removeParameter'
       index: 1
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 void g() {
   f(0, f(1, 2));
@@ -197,7 +199,7 @@
     - kind: 'rename'
       newName: 'New'
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 class A implements Old {}
 class B implements Old {}
@@ -225,7 +227,7 @@
     - kind: 'rename'
       newName: 'New'
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 class A implements Old {}
 class B implements Old {}
@@ -265,7 +267,7 @@
       argumentValue:
         expression: '0'
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 class A extends C {
   @override
@@ -311,7 +313,7 @@
       argumentValue:
         expression: 'int'
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 class A extends C {
   @override
@@ -356,7 +358,7 @@
     - kind: 'rename'
       newName: 'New'
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 class A with Old {}
 class B with Old {}
@@ -384,7 +386,7 @@
     - kind: 'rename'
       newName: 'New'
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 class A with Old {}
 class B with Old {}
@@ -420,7 +422,7 @@
     - kind: 'rename'
       newName: 'new'
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 C c() => C(C());
 ''');
@@ -449,7 +451,7 @@
     - kind: 'rename'
       newName: 'new'
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 C c() => C(C());
 ''');
@@ -461,6 +463,36 @@
 }
 
 @reflectiveTest
+class NonBulkFixTest extends _DataDrivenTest {
+  Future<void> test_rename_deprecated() async {
+    setPackageContent('''
+@deprecated
+class Old {}
+class New {}
+''');
+    addPackageDataFile('''
+version: 1
+transforms:
+- title: 'Rename to New'
+  date: 2020-09-01
+  bulkApply: false
+  element:
+    uris: ['$importUri']
+    class: 'Old'
+  changes:
+    - kind: 'rename'
+      newName: 'New'
+''');
+    await resolveTestCode('''
+import '$importUri';
+class A extends Old {}
+class B extends Old {}
+''');
+    await assertNoFix();
+  }
+}
+
+@reflectiveTest
 class NotEnoughPositionalArgumentsTest extends _DataDrivenTest {
   Future<void> test_addParameter() async {
     setPackageContent('''
@@ -482,7 +514,7 @@
       argumentValue:
         expression: '0'
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 void g() {
   f(f(0));
@@ -518,7 +550,7 @@
     - kind: 'rename'
       newName: 'new'
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 class D extends C {
   @override
@@ -563,7 +595,7 @@
     - kind: 'rename'
       newName: 'New'
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 void f(Old a, Old b) {}
 ''');
@@ -589,7 +621,7 @@
     - kind: 'rename'
       newName: 'New'
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 void f(Old a, Old b) {}
 ''');
@@ -620,7 +652,7 @@
     - kind: 'rename'
       newName: 'new'
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 void f() {
   old(old(0));
@@ -650,7 +682,7 @@
     - kind: 'rename'
       newName: 'new'
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 void f() {
   old(old(0));
@@ -688,7 +720,7 @@
     - kind: 'rename'
       newName: 'new'
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 void f(C a, C b) {
   a.old + b.old;
@@ -721,7 +753,7 @@
     - kind: 'rename'
       newName: 'new'
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 void f(C a, C b) {
   a.old + b.old;
@@ -756,7 +788,7 @@
     - kind: 'rename'
       newName: 'new'
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 void f() {
   old + old;
@@ -786,7 +818,7 @@
     - kind: 'rename'
       newName: 'new'
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 void f() {
   old + old;
@@ -824,7 +856,7 @@
     - kind: 'rename'
       newName: 'new'
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 void f(C a, C b) {
   a.old(b.old(0));
@@ -857,7 +889,7 @@
     - kind: 'rename'
       newName: 'new'
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 void f(C a, C b) {
   a.old(b.old(0));
@@ -895,7 +927,7 @@
     - kind: 'rename'
       newName: 'new'
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 void f(C a, C b) {
   a.old = b.old = 1;
@@ -928,7 +960,7 @@
     - kind: 'rename'
       newName: 'new'
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 void f(C a, C b) {
   a.old = b.old = 1;
@@ -966,7 +998,7 @@
       argumentValue:
         expression: 'int'
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 C f() => C<String>.c(C<String>.c());
 ''');
@@ -1000,7 +1032,7 @@
       argumentValue:
         expression: 'int'
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 void f(String s) {
   E<String>(s).m(E<String>(s).m(0));
@@ -1039,7 +1071,7 @@
       argumentValue:
         expression: 'int'
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 void f(C c) {
   c.m<String>(c.m<String>(0));
@@ -1075,7 +1107,7 @@
       argumentValue:
         expression: 'int'
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 void f(C<String> c) {}
 ''');
@@ -1106,7 +1138,7 @@
       argumentValue:
         expression: 'int'
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 C f() => C<String>(C<String>());
 ''');
@@ -1124,12 +1156,17 @@
   /// Add the file containing the data used by the data-driven fix with the
   /// given [content].
   void addPackageDataFile(String content) {
-    addPackageFile('p', TransformSetManager.dataFileName, content);
+    newFile('$workspaceRootPath/p/lib/${TransformSetManager.dataFileName}',
+        content: content);
   }
 
   /// Set the content of the library that defines the element referenced by the
   /// data on which this test is based.
   void setPackageContent(String content) {
-    addPackageFile('p', 'lib.dart', content);
+    newFile('$workspaceRootPath/p/lib/lib.dart', content: content);
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'p', rootPath: '$workspaceRootPath/p'),
+    );
   }
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/inline_invocation_test.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/inline_invocation_test.dart
index 2e6ed1b..b34d124 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/bulk/inline_invocation_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/inline_invocation_test.dart
@@ -19,7 +19,7 @@
   String get lintCode => LintNames.prefer_inlined_adds;
 
   Future<void> test_singleFile() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var l = []..add('a')..add('b');
 var l2 = ['a', 'b']..add('c');
 var l3 = ['a']..addAll(['b', 'c']);
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/make_final_test.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/make_final_test.dart
index cae164a..21724f2 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/bulk/make_final_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/make_final_test.dart
@@ -20,7 +20,7 @@
   String get lintCode => LintNames.prefer_final_fields;
 
   Future<void> test_singleFile() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class C {
   int _f = 2;
   var _f2 = 2;
@@ -45,7 +45,7 @@
   String get lintCode => LintNames.prefer_final_locals;
 
   Future<void> test_singleFile() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f() {
   var x = 0;
   var y = x;
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_argument_test.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_argument_test.dart
index d246cd8..7d87ea4 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_argument_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_argument_test.dart
@@ -19,7 +19,7 @@
   String get lintCode => LintNames.avoid_redundant_argument_values;
 
   Future<void> test_singleFile() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void f({bool valWithDefault = true, bool val}) {}
 void f2({bool valWithDefault = true, bool val}) {}
 
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_await_test.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_await_test.dart
index ea4c184..b1c9f97 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_await_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_await_test.dart
@@ -19,7 +19,7 @@
   String get lintCode => LintNames.await_only_futures;
 
   Future<void> test_singleFile() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f() async {
   print(await 23);
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_duplicate_case_test.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_duplicate_case_test.dart
index 0ce557d..76d7a91 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_duplicate_case_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_duplicate_case_test.dart
@@ -19,7 +19,7 @@
   String get lintCode => LintNames.no_duplicate_case_values;
 
   Future<void> test_singleFile() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void switchInt() {
   switch (2) {
     case 1:
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_empty_catch_test.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_empty_catch_test.dart
index 2582a53..a6a0897d 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_empty_catch_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_empty_catch_test.dart
@@ -19,7 +19,7 @@
   String get lintCode => LintNames.empty_catches;
 
   Future<void> test_singleFile() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void f() {
   try {
     try {
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_empty_constructor_body_test.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_empty_constructor_body_test.dart
index 9272e89..9469973 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_empty_constructor_body_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_empty_constructor_body_test.dart
@@ -19,7 +19,7 @@
   String get lintCode => LintNames.empty_constructor_bodies;
 
   Future<void> test_singleFile() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class C {
   C() {}
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_empty_else_test.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_empty_else_test.dart
index faf94fc..5c967e2 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_empty_else_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_empty_else_test.dart
@@ -19,7 +19,7 @@
   String get lintCode => LintNames.avoid_empty_else;
 
   Future<void> test_singleFile() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void f(bool cond) {
   if (cond) {
     //
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_empty_statement_test.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_empty_statement_test.dart
index 42227c9..fbf7b39 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_empty_statement_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_empty_statement_test.dart
@@ -21,7 +21,7 @@
   Future<void> test_singleFile() async {
     // Note that ReplaceWithEmptyBrackets is not supported.
     //   for example: `if (true) ;` ...
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void f() {
   while(true) {
     ;
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_initializer_test.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_initializer_test.dart
index 446ec84..c95ede1 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_initializer_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_initializer_test.dart
@@ -19,7 +19,7 @@
   String get lintCode => LintNames.avoid_init_to_null;
 
   Future<void> test_singleFile() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class T {
   int x = null;
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_interpolation_braces_test.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_interpolation_braces_test.dart
index 5060050..a291bf1 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_interpolation_braces_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_interpolation_braces_test.dart
@@ -19,7 +19,7 @@
   String get lintCode => LintNames.unnecessary_brace_in_string_interps;
 
   Future<void> test_singleFile() async {
-    await resolveTestUnit(r'''
+    await resolveTestCode(r'''
 main() {
   var v = 42;
   print('v: ${ v}, ${ v}');
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_method_declaration_test.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_method_declaration_test.dart
index 6389eaf..65f7918 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_method_declaration_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_method_declaration_test.dart
@@ -19,7 +19,7 @@
   String get lintCode => LintNames.unnecessary_overrides;
 
   Future<void> test_singleFile() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   int foo;
   int bar() => 0;
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_non_null_assertion_test.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_non_null_assertion_test.dart
new file mode 100644
index 0000000..eeacfbc
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_non_null_assertion_test.dart
@@ -0,0 +1,31 @@
+// Copyright (c) 2020, 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:test_reflective_loader/test_reflective_loader.dart';
+
+import '../../../../../abstract_context.dart';
+import 'bulk_fix_processor.dart';
+
+void main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(RemoveNonNullAssertionWithNullSafetyTest);
+  });
+}
+
+@reflectiveTest
+class RemoveNonNullAssertionWithNullSafetyTest extends BulkFixProcessorTest
+    with WithNullSafetyMixin {
+  Future<void> test_singleFile() async {
+    await resolveTestCode('''
+void f(String a) {
+  print(a!!);
+}
+''');
+    await assertHasFix('''
+void f(String a) {
+  print(a);
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_operator_test.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_operator_test.dart
index e8aede6..f876196 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_operator_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_operator_test.dart
@@ -19,7 +19,7 @@
   String get lintCode => LintNames.prefer_adjacent_string_concatenation;
 
   Future<void> test_singleFile() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var s = 'a' + 'b';
 var s1 = 'b' + 'c';
 ''');
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_this_expression_test.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_this_expression_test.dart
index 06f6938..eb9eb5c 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_this_expression_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_this_expression_test.dart
@@ -19,7 +19,7 @@
   String get lintCode => LintNames.unnecessary_this;
 
   Future<void> test_singleFile() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   int x;
   A(int x) : this.x = x;
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_type_annotation_test.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_type_annotation_test.dart
index f164e06..600d12d 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_type_annotation_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_type_annotation_test.dart
@@ -22,7 +22,7 @@
   String get lintCode => LintNames.avoid_annotating_with_dynamic;
 
   Future<void> test_singleFile() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f(void foo(dynamic x)) {
   return null;
 }
@@ -49,7 +49,7 @@
   String get lintCode => LintNames.avoid_return_types_on_setters;
 
   Future<void> test_singleFile() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void set s(int s) {}
 void set s2(int s2) {}
 ''');
@@ -66,7 +66,7 @@
   String get lintCode => LintNames.avoid_types_on_closure_parameters;
 
   Future<void> test_singleFile() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var x = ({Future<int> defaultValue}) => null;
 var y = (Future<int> defaultValue) => null;
 ''');
@@ -83,7 +83,7 @@
   String get lintCode => LintNames.type_init_formals;
 
   Future<void> test_singleFile() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class C {
   int f;
   C(int this.f);
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_unnecessary_const_test.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_unnecessary_const_test.dart
index 5b6811d..eb112f7 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_unnecessary_const_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_unnecessary_const_test.dart
@@ -19,7 +19,7 @@
   String get lintCode => LintNames.unnecessary_const;
 
   Future<void> test_singleFile() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class C { const C(); }
 class D { const D(C c); }
 const c = const C();
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_unnecessary_new_test.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_unnecessary_new_test.dart
index 6f3b5e2..88670c3 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_unnecessary_new_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_unnecessary_new_test.dart
@@ -19,7 +19,7 @@
   String get lintCode => LintNames.unnecessary_new;
 
   Future<void> test_singleFile() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 C f() => new C();
 
 class C {
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/rename_to_camel_case_test.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/rename_to_camel_case_test.dart
index 8e717a0..5248e32 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/bulk/rename_to_camel_case_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/rename_to_camel_case_test.dart
@@ -19,7 +19,7 @@
   String get lintCode => LintNames.non_constant_identifier_names;
 
   Future<void> test_singleFile() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   int my_integer_variable = 42;
   int foo;
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/replace_colon_with_equals_test.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/replace_colon_with_equals_test.dart
index c90d5f7..f057c74 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/bulk/replace_colon_with_equals_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/replace_colon_with_equals_test.dart
@@ -19,7 +19,7 @@
   String get lintCode => LintNames.prefer_equal_for_default_values;
 
   Future<void> test_singleFile() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void f({int a: 1}) => null;
 
 class C {
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/replace_final_with_const_test.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/replace_final_with_const_test.dart
index 1eefe84..d886f78 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/bulk/replace_final_with_const_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/replace_final_with_const_test.dart
@@ -19,7 +19,7 @@
   String get lintCode => LintNames.prefer_const_declarations;
 
   Future<void> test_singleFile() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 final int a = 1;
 final b = 1;
 ''');
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/replace_new_with_const_test.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/replace_new_with_const_test.dart
index a6c5170..f8ba7bd 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/bulk/replace_new_with_const_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/replace_new_with_const_test.dart
@@ -21,7 +21,7 @@
   /// Disabled in BulkFixProcessor.
   @failingTest
   Future<void> test_singleFile() async {
-    await resolveTestUnit(r'''
+    await resolveTestCode(r'''
 class C {
   const C();
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/replace_null_with_closure_test.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/replace_null_with_closure_test.dart
index f647efb..9a686bf 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/bulk/replace_null_with_closure_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/replace_null_with_closure_test.dart
@@ -19,7 +19,7 @@
   String get lintCode => LintNames.null_closures;
 
   Future<void> test_singleFile() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void f(List<int> l) {
   l.firstWhere((e) => e.isEven, orElse: null);
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/replace_with_conditional_assignment_test.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/replace_with_conditional_assignment_test.dart
index 790ff57..77c9615 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/bulk/replace_with_conditional_assignment_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/replace_with_conditional_assignment_test.dart
@@ -19,7 +19,7 @@
   String get lintCode => LintNames.prefer_conditional_assignment;
 
   Future<void> test_singleFile() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class Person {
   String _fullName;
   void foo() {
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/replace_with_is_empty_test.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/replace_with_is_empty_test.dart
index b7475c3..b61ffd7 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/bulk/replace_with_is_empty_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/replace_with_is_empty_test.dart
@@ -19,7 +19,7 @@
   String get lintCode => LintNames.prefer_is_empty;
 
   Future<void> test_singleFile() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void f(List c) {
   if (0 == c.length) {}
   if (1 > c.length) {}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/replace_with_tear_off_test.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/replace_with_tear_off_test.dart
index 5be6f3f..eef575b 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/bulk/replace_with_tear_off_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/replace_with_tear_off_test.dart
@@ -19,7 +19,7 @@
   String get lintCode => LintNames.unnecessary_lambdas;
 
   Future<void> test_singleFile() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 Function f() => (name) {
   print(name);
 };
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/replace_with_var_test.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/replace_with_var_test.dart
index 63c23a5..27367dc 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/bulk/replace_with_var_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/replace_with_var_test.dart
@@ -19,7 +19,7 @@
   String get lintCode => LintNames.omit_local_variable_types;
 
   Future<void> test_singleFile() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 List f() {
   List<int> l = [];
   return l;
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/sort_child_properties_last.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/sort_child_properties_last.dart
deleted file mode 100644
index 80c02dd..0000000
--- a/pkg/analysis_server/test/src/services/correction/fix/bulk/sort_child_properties_last.dart
+++ /dev/null
@@ -1,64 +0,0 @@
-// Copyright (c) 2020, 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/src/services/linter/lint_names.dart';
-import 'package:test_reflective_loader/test_reflective_loader.dart';
-
-import 'bulk_fix_processor.dart';
-
-void main() {
-  defineReflectiveSuite(() {
-    defineReflectiveTests(SortChildPropertyLastTest);
-  });
-}
-
-@reflectiveTest
-class SortChildPropertyLastTest extends BulkFixProcessorTest {
-  @override
-  String get lintCode => LintNames.sort_child_properties_last;
-
-  Future<void> test_singleFile() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
-import 'package:flutter/material.dart';
-main() {
-  Column(
-    children: [
-      Column(
-        children: [
-          Text('a'),
-        ],
-        crossAxisAlignment: CrossAxisAlignment.center,
-      ),
-      Text('b'),
-      Text('c'),
-      Text('d'),
-    ],
-    crossAxisAlignment: CrossAxisAlignment.center,
-  );
-}
-''');
-    // todo (pq): two diagnostics are produced but only the first is fixed.
-    // see: linter/test/rules/sort_child_properties_last.dart:nestedChildren()
-    await assertHasFix('''
-import 'package:flutter/material.dart';
-main() {
-  Column(
-    crossAxisAlignment: CrossAxisAlignment.center,
-    children: [
-      Column(
-        children: [
-          Text('a'),
-        ],
-        crossAxisAlignment: CrossAxisAlignment.center,
-      ),
-      Text('b'),
-      Text('c'),
-      Text('d'),
-    ],
-  );
-}
-''');
-  }
-}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/sort_child_properties_last_test.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/sort_child_properties_last_test.dart
new file mode 100644
index 0000000..3cc5338
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/sort_child_properties_last_test.dart
@@ -0,0 +1,64 @@
+// Copyright (c) 2020, 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/src/services/linter/lint_names.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'bulk_fix_processor.dart';
+
+void main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(SortChildPropertyLastTest);
+  });
+}
+
+@reflectiveTest
+class SortChildPropertyLastTest extends BulkFixProcessorTest {
+  @override
+  String get lintCode => LintNames.sort_child_properties_last;
+
+  Future<void> test_singleFile() async {
+    writeTestPackageConfig(flutter: true);
+    await resolveTestCode('''
+import 'package:flutter/material.dart';
+main() {
+  Column(
+    children: [
+      Column(
+        children: [
+          Text('a'),
+        ],
+        crossAxisAlignment: CrossAxisAlignment.center,
+      ),
+      Text('b'),
+      Text('c'),
+      Text('d'),
+    ],
+    crossAxisAlignment: CrossAxisAlignment.center,
+  );
+}
+''');
+    // todo (pq): two diagnostics are produced but only the first is fixed.
+    // see: linter/test/rules/sort_child_properties_last.dart:nestedChildren()
+    await assertHasFix('''
+import 'package:flutter/material.dart';
+main() {
+  Column(
+    crossAxisAlignment: CrossAxisAlignment.center,
+    children: [
+      Column(
+        children: [
+          Text('a'),
+        ],
+        crossAxisAlignment: CrossAxisAlignment.center,
+      ),
+      Text('b'),
+      Text('c'),
+      Text('d'),
+    ],
+  );
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/test_all.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/test_all.dart
index e2ae5f5..3b98bfd 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/bulk/test_all.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/test_all.dart
@@ -43,6 +43,7 @@
 import 'remove_initializer_test.dart' as remove_initializer;
 import 'remove_interpolation_braces_test.dart' as remove_interpolation_braces;
 import 'remove_method_declaration_test.dart' as remove_method_declaration;
+import 'remove_non_null_assertion_test.dart' as remove_non_null_assertion;
 import 'remove_operator_test.dart' as remove_operator;
 import 'remove_this_expression_test.dart' as remove_this_expression;
 import 'remove_type_annotation_test.dart' as remove_type_annotation;
@@ -58,7 +59,7 @@
 import 'replace_with_is_empty_test.dart' as replace_with_is_empty;
 import 'replace_with_tear_off_test.dart' as replace_with_tear_off;
 import 'replace_with_var_test.dart' as replace_with_var;
-import 'sort_child_properties_last.dart' as sort_child_properties_last;
+import 'sort_child_properties_last_test.dart' as sort_child_properties_last;
 import 'use_curly_braces_test.dart' as use_curly_braces;
 import 'use_is_not_empty_test.dart' as use_is_not_empty;
 import 'use_rethrow_test.dart' as use_rethrow;
@@ -98,6 +99,7 @@
     remove_empty_statement.main();
     remove_interpolation_braces.main();
     remove_method_declaration.main();
+    remove_non_null_assertion.main();
     remove_operator.main();
     remove_this_expression.main();
     remove_type_annotation.main();
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/use_curly_braces_test.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/use_curly_braces_test.dart
index 3bce118..8e1f19a 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/bulk/use_curly_braces_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/use_curly_braces_test.dart
@@ -19,7 +19,7 @@
   String get lintCode => LintNames.curly_braces_in_flow_control_structures;
 
   Future<void> test_singleFile() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f() {
   while (true) if (false) print('');
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/use_is_not_empty_test.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/use_is_not_empty_test.dart
index e9010c7..1f337b8 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/bulk/use_is_not_empty_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/use_is_not_empty_test.dart
@@ -19,7 +19,7 @@
   String get lintCode => LintNames.prefer_is_not_empty;
 
   Future<void> test_singleFile() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void f(List<int> l) {
   if (!l.isEmpty) {}
   if (!l.isEmpty || true) {}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/use_rethrow_test.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/use_rethrow_test.dart
index 967d352..9d4678b 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/bulk/use_rethrow_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/use_rethrow_test.dart
@@ -19,7 +19,7 @@
   String get lintCode => LintNames.use_rethrow_when_possible;
 
   Future<void> test_singleFile() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void f() {
   try {} catch (e) {
     throw e;
diff --git a/pkg/analysis_server/test/src/services/correction/fix/change_argument_name_test.dart b/pkg/analysis_server/test/src/services/correction/fix/change_argument_name_test.dart
index bd4ac94..5bb073d 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/change_argument_name_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/change_argument_name_test.dart
@@ -20,7 +20,7 @@
   FixKind get kind => DartFixKind.CHANGE_ARGUMENT_NAME;
 
   Future<void> test_child_constructor() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f() => new A(children: 2);
 class A {
   A({int child});
@@ -35,7 +35,7 @@
   }
 
   Future<void> test_child_function() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f() {
   g(children: 0);
 }
@@ -50,7 +50,7 @@
   }
 
   Future<void> test_child_method() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f(A a) {
   a.m(children: 0);
 }
@@ -69,7 +69,7 @@
   }
 
   Future<void> test_children_constructor() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f() => new A(child: 2);
 class A {
   A({int children});
@@ -84,7 +84,7 @@
   }
 
   Future<void> test_children_function() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f() {
   g(child: 0);
 }
@@ -99,7 +99,7 @@
   }
 
   Future<void> test_children_method() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f(A a) {
   a.m(child: 0);
 }
@@ -118,7 +118,7 @@
   }
 
   Future<void> test_default_annotation() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 @A(boot: 2)
 f() => null;
 class A {
@@ -135,7 +135,7 @@
   }
 
   Future<void> test_default_constructor() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f() => new A(boot: 2);
 class A {
   A({int boat});
@@ -150,7 +150,7 @@
   }
 
   Future<void> test_default_function() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f() {
   g(boot: 0);
 }
@@ -165,7 +165,7 @@
   }
 
   Future<void> test_default_method() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f(A a) {
   a.m(boot: 0);
 }
@@ -184,7 +184,7 @@
   }
 
   Future<void> test_default_redirectingConstructor() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   A.one() : this.two(boot: 3);
   A.two({int boat});
@@ -199,7 +199,7 @@
   }
 
   Future<void> test_default_superConstructor() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   A.a({int boat});
 }
@@ -218,7 +218,7 @@
   }
 
   Future<void> test_tooDistant_constructor() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f() => new A(bbbbb: 2);
 class A {
   A({int aaaaaaa});
@@ -228,7 +228,7 @@
   }
 
   Future<void> test_tooDistant_function() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f() {
   g(bbbbb: 0);
 }
@@ -238,7 +238,7 @@
   }
 
   Future<void> test_tooDistant_method() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f(A a) {
   a.m(bbbbb: 0);
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/change_to_nearest_precise_value_test.dart b/pkg/analysis_server/test/src/services/correction/fix/change_to_nearest_precise_value_test.dart
index 6a9c074..419a6c1 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/change_to_nearest_precise_value_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/change_to_nearest_precise_value_test.dart
@@ -20,7 +20,7 @@
   FixKind get kind => DartFixKind.CHANGE_TO_NEAREST_PRECISE_VALUE;
 
   Future<void> test_impreciseIntAsDouble() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 double x = 1000000000000000000000000;
 ''');
     await assertHasFix('''
@@ -29,7 +29,7 @@
   }
 
   Future<void> test_impreciseIntAsDouble_asCapitalHex() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 double x = 0X1000000000000000000000001;
 ''');
     await assertHasFix('''
@@ -38,7 +38,7 @@
   }
 
   Future<void> test_impreciseIntAsDouble_asHex() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 double x = 0x1000000000000000000000001;
 ''');
     await assertHasFix('''
@@ -47,7 +47,7 @@
   }
 
   Future<void> test_impreciseIntAsDouble_maxValue() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 double x = 10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000;
 ''');
     await assertHasFix('''
@@ -56,7 +56,7 @@
   }
 
   Future<void> test_impreciseIntAsDouble_maxValue_asHex() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 double x = 0x100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000;
 ''');
     await assertHasFix('''
diff --git a/pkg/analysis_server/test/src/services/correction/fix/change_to_static_access_test.dart b/pkg/analysis_server/test/src/services/correction/fix/change_to_static_access_test.dart
index acc3551..dd985bb 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/change_to_static_access_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/change_to_static_access_test.dart
@@ -20,7 +20,7 @@
   FixKind get kind => DartFixKind.CHANGE_TO_STATIC_ACCESS;
 
   Future<void> test_method() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   static foo() {}
 }
@@ -39,7 +39,7 @@
   }
 
   Future<void> test_method_extension() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 extension E on int {
   static void foo() {}
 }
@@ -68,7 +68,7 @@
 
 class B extends A {}
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:test/b.dart';
 
 main(B b) {
@@ -86,7 +86,7 @@
   }
 
   Future<void> test_method_prefixLibrary() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'dart:async' as pref;
 main(pref.Future f) {
   f.wait([]);
@@ -101,7 +101,7 @@
   }
 
   Future<void> test_property() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   static get foo => 42;
 }
@@ -121,7 +121,7 @@
 
   @failingTest
   Future<void> test_property_extension() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 extension E on int {
   static int get foo => 42;
 }
@@ -150,7 +150,7 @@
 
 class B extends A {}
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:test/b.dart';
 
 main(B b) {
diff --git a/pkg/analysis_server/test/src/services/correction/fix/change_to_test.dart b/pkg/analysis_server/test/src/services/correction/fix/change_to_test.dart
index 7bc4ba2..e3e581b 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/change_to_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/change_to_test.dart
@@ -20,7 +20,7 @@
   FixKind get kind => DartFixKind.CHANGE_TO;
 
   Future<void> test_annotation_constructor() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 @MyCalss()
 void f() {}
 
@@ -42,7 +42,7 @@
   Future<void> test_annotation_variable() async {
     // TODO(brianwilkerson) Add support for suggesting similar top-level
     //  variables.
-    await resolveTestUnit('''
+    await resolveTestCode('''
 const annotation = '';
 @anontation
 void f() {}
@@ -55,7 +55,7 @@
   }
 
   Future<void> test_class_extends() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class MyClass extends BaseClssa {}
 
 class BaseClass {}
@@ -68,7 +68,7 @@
   }
 
   Future<void> test_class_fromImport() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   Stirng s = 'abc';
   print(s);
@@ -83,7 +83,7 @@
   }
 
   Future<void> test_class_fromThisLibrary() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class MyClass {}
 main() {
   MyCalss v = null;
@@ -100,7 +100,7 @@
   }
 
   Future<void> test_class_implements() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class MyClass implements BaseClssa {}
 
 class BaseClass {}
@@ -113,7 +113,7 @@
   }
 
   Future<void> test_class_prefixed() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'dart:async' as c;
 main() {
   c.Fture v = null;
@@ -130,7 +130,7 @@
   }
 
   Future<void> test_class_with() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class MyClass with BaseClssa {}
 
 class BaseClass {}
@@ -143,7 +143,7 @@
   }
 
   Future<void> test_function_fromImport() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   pritn(0);
 }
@@ -156,7 +156,7 @@
   }
 
   Future<void> test_function_prefixed_fromImport() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'dart:core' as c;
 main() {
   c.prnt(42);
@@ -171,7 +171,7 @@
   }
 
   Future<void> test_function_prefixed_ignoreLocal() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'dart:async' as c;
 main() {
   c.main();
@@ -181,7 +181,7 @@
   }
 
   Future<void> test_function_thisLibrary() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 myFunction() {}
 main() {
   myFuntcion();
@@ -196,7 +196,7 @@
   }
 
   Future<void> test_getter_hint() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   int myField;
 }
@@ -217,7 +217,7 @@
   }
 
   Future<void> test_getter_override() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 extension E on int {
   int get myGetter => 0;
 }
@@ -236,7 +236,7 @@
   }
 
   Future<void> test_getter_qualified() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   int myField;
 }
@@ -255,7 +255,7 @@
   }
 
   Future<void> test_getter_qualified_static() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   static int MY_NAME = 1;
 }
@@ -274,7 +274,7 @@
   }
 
   Future<void> test_getter_static() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 extension E on int {
   static int get myGetter => 0;
 }
@@ -293,7 +293,7 @@
   }
 
   Future<void> test_getter_unqualified() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   int myField;
   main() {
@@ -312,7 +312,7 @@
   }
 
   Future<void> test_method_ignoreOperators() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main(Object object) {
   object.then();
 }
@@ -321,7 +321,7 @@
   }
 
   Future<void> test_method_override() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 extension E on int {
   int myMethod() => 0;
 }
@@ -340,7 +340,7 @@
   }
 
   Future<void> test_method_qualified() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   myMethod() {}
 }
@@ -361,7 +361,7 @@
   }
 
   Future<void> test_method_static() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 extension E on int {
   static int myMethod() => 0;
 }
@@ -380,7 +380,7 @@
   }
 
   Future<void> test_method_unqualified_superClass() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   myMethod() {}
 }
@@ -403,7 +403,7 @@
   }
 
   Future<void> test_method_unqualified_thisClass() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   myMethod() {}
   main() {
@@ -422,7 +422,7 @@
   }
 
   Future<void> test_setter_hint() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   int myField;
 }
@@ -443,7 +443,7 @@
   }
 
   Future<void> test_setter_override() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 extension E on int {
   void set mySetter(int i) {}
 }
@@ -462,7 +462,7 @@
   }
 
   Future<void> test_setter_qualified() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   int myField;
 }
@@ -481,7 +481,7 @@
   }
 
   Future<void> test_setter_static() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 extension E on int {
   static void set mySetter(int i) {}
 }
@@ -500,7 +500,7 @@
   }
 
   Future<void> test_setter_unqualified() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   int myField;
   main() {
diff --git a/pkg/analysis_server/test/src/services/correction/fix/change_type_annotation_test.dart b/pkg/analysis_server/test/src/services/correction/fix/change_type_annotation_test.dart
index 91c2321..c848914 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/change_type_annotation_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/change_type_annotation_test.dart
@@ -21,7 +21,7 @@
   FixKind get kind => DartFixKind.CHANGE_TYPE_ANNOTATION;
 
   Future<void> test_generic() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   String v = <int>[];
   print(v);
@@ -36,7 +36,7 @@
   }
 
   Future<void> test_multipleVariables() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   String a, b = 42;
   print('\$a \$b');
@@ -46,7 +46,7 @@
   }
 
   Future<void> test_notVariableDeclaration() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   String v;
   v = 42;
@@ -57,7 +57,7 @@
   }
 
   Future<void> test_simple() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   String v = 'abc'.length;
   print(v);
@@ -73,7 +73,7 @@
 
   Future<void> test_synthetic_implicitCast() async {
     createAnalysisOptionsFile(implicitCasts: false);
-    await resolveTestUnit('''
+    await resolveTestCode('''
 int foo =
 ''');
     await assertNoFix(
diff --git a/pkg/analysis_server/test/src/services/correction/fix/convert_documentation_into_line_test.dart b/pkg/analysis_server/test/src/services/correction/fix/convert_documentation_into_line_test.dart
index 4e8edc0..e68869f 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/convert_documentation_into_line_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/convert_documentation_into_line_test.dart
@@ -25,7 +25,7 @@
 
   /// More coverage in the `convert_to_documentation_line_test.dart` assist test.
   Future<void> test_onText() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   /**
    * AAAAAAA [int] AAAAAAA
diff --git a/pkg/analysis_server/test/src/services/correction/fix/convert_flutter_child_test.dart b/pkg/analysis_server/test/src/services/correction/fix/convert_flutter_child_test.dart
index 3e17f59..7afc732 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/convert_flutter_child_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/convert_flutter_child_test.dart
@@ -19,9 +19,16 @@
   @override
   FixKind get kind => DartFixKind.CONVERT_FLUTTER_CHILD;
 
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(
+      flutter: true,
+    );
+  }
+
   Future<void> test_hasList() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/widgets.dart';
 build() {
   return Container(
@@ -50,8 +57,7 @@
   }
 
   Future<void> test_hasTypedList() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/widgets.dart';
 build() {
   return new Container(
@@ -80,8 +86,7 @@
   }
 
   Future<void> test_listNotWidget() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/widgets.dart';
 build() {
   return new Container(
@@ -98,8 +103,7 @@
   }
 
   Future<void> test_multiLine() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 build() {
   return new Scaffold(
@@ -130,8 +134,7 @@
   }
 
   Future<void> test_widgetVariable() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 build() {
   var text = new Text('foo');
diff --git a/pkg/analysis_server/test/src/services/correction/fix/convert_flutter_children_test.dart b/pkg/analysis_server/test/src/services/correction/fix/convert_flutter_children_test.dart
index 8f71ef6..0d5ae48 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/convert_flutter_children_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/convert_flutter_children_test.dart
@@ -19,9 +19,16 @@
   @override
   FixKind get kind => DartFixKind.CONVERT_FLUTTER_CHILDREN;
 
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(
+      flutter: true,
+    );
+  }
+
   Future<void> test_undefinedParameter_multiLine() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/widgets.dart';
 build() {
   return new Center(
@@ -48,8 +55,7 @@
   }
 
   Future<void> test_undefinedParameter_notWidget() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/widgets.dart';
 build() {
   return new Center(
@@ -63,8 +69,7 @@
   }
 
   Future<void> test_undefinedParameter_singleLine() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/widgets.dart';
 build() {
   return new Center(
@@ -85,8 +90,7 @@
   }
 
   Future<void> test_undefinedParameter_singleLine2() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/widgets.dart';
 build() {
   var text = new Text('foo');
diff --git a/pkg/analysis_server/test/src/services/correction/fix/convert_into_expression_body_test.dart b/pkg/analysis_server/test/src/services/correction/fix/convert_into_expression_body_test.dart
index 97f56dd..5bcdd3e 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/convert_into_expression_body_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/convert_into_expression_body_test.dart
@@ -25,7 +25,7 @@
 
   /// More coverage in the `convert_into_expression_body_test.dart` assist test.
   Future<void> test_async() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   mmm() async { 
     return 42;
diff --git a/pkg/analysis_server/test/src/services/correction/fix/convert_to_contains_test.dart b/pkg/analysis_server/test/src/services/correction/fix/convert_to_contains_test.dart
index f72cb3a..f0edd0b 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/convert_to_contains_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/convert_to_contains_test.dart
@@ -24,7 +24,7 @@
   String get lintCode => LintNames.prefer_contains;
 
   Future<void> test_left_bangEq_minusOne() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 bool f(List<int> list, int value) {
   return -1 != list.indexOf(value);
 }
@@ -37,7 +37,7 @@
   }
 
   Future<void> test_left_eqEq_minusOne() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 bool f(List<int> list, int value) {
   return -1 == list.indexOf(value);
 }
@@ -50,7 +50,7 @@
   }
 
   Future<void> test_left_gt_minusOne() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 bool f(List<int> list, int value) {
   return -1 > list.indexOf(value);
 }
@@ -59,7 +59,7 @@
   }
 
   Future<void> test_left_gt_zero() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 bool f(List<int> list, int value) {
   return 0 > list.indexOf(value);
 }
@@ -72,7 +72,7 @@
   }
 
   Future<void> test_left_gtEq_minusOne() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 bool f(List<int> list, int value) {
   return -1 >= list.indexOf(value);
 }
@@ -85,7 +85,7 @@
   }
 
   Future<void> test_left_lt_minusOne() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 bool f(List<int> list, int value) {
   return -1 < list.indexOf(value);
 }
@@ -98,7 +98,7 @@
   }
 
   Future<void> test_left_ltEq_minusOne() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 bool f(List<int> list, int value) {
   return -1 <= list.indexOf(value);
 }
@@ -107,7 +107,7 @@
   }
 
   Future<void> test_left_ltEq_zero() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 bool f(List<int> list, int value) {
   return 0 <= list.indexOf(value);
 }
@@ -120,7 +120,7 @@
   }
 
   Future<void> test_right_bangEq_minusOne() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 bool f(List<int> list, int value) {
   return list.indexOf(value) != -1;
 }
@@ -133,7 +133,7 @@
   }
 
   Future<void> test_right_eqEq_minusOne() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 bool f(List<int> list, int value) {
   return list.indexOf(value) == -1;
 }
@@ -146,7 +146,7 @@
   }
 
   Future<void> test_right_gt_minusOne() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 bool f(List<int> list, int value) {
   return list.indexOf(value) > -1;
 }
@@ -159,7 +159,7 @@
   }
 
   Future<void> test_right_gtEq_minusOne() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 bool f(List<int> list, int value) {
   return list.indexOf(value) >= -1;
 }
@@ -168,7 +168,7 @@
   }
 
   Future<void> test_right_gtEq_zero() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 bool f(List<int> list, int value) {
   return list.indexOf(value) >= 0;
 }
@@ -181,7 +181,7 @@
   }
 
   Future<void> test_right_lt_minusOne() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 bool f(List<int> list, int value) {
   return list.indexOf(value) < -1;
 }
@@ -190,7 +190,7 @@
   }
 
   Future<void> test_right_lt_zero() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 bool f(List<int> list, int value) {
   return list.indexOf(value) < 0;
 }
@@ -203,7 +203,7 @@
   }
 
   Future<void> test_right_ltEq_minusOne() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 bool f(List<int> list, int value) {
   return list.indexOf(value) <= -1;
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/convert_to_for_element_test.dart b/pkg/analysis_server/test/src/services/correction/fix/convert_to_for_element_test.dart
index 2457d3b..fafbb6e 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/convert_to_for_element_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/convert_to_for_element_test.dart
@@ -26,7 +26,7 @@
   /// More coverage in the `convert_to_for_element_line_test.dart` assist test.
   Future<void>
       test_mapFromIterable_differentParameterNames_usedInKey_conflictInValue() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f(Iterable<int> i) {
   var k = 3;
   return Map.fromIterable(i, key: (k) => k * 2, value: (v) => k);
diff --git a/pkg/analysis_server/test/src/services/correction/fix/convert_to_generic_function_syntax_test.dart b/pkg/analysis_server/test/src/services/correction/fix/convert_to_generic_function_syntax_test.dart
index f56da24..de45575 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/convert_to_generic_function_syntax_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/convert_to_generic_function_syntax_test.dart
@@ -25,14 +25,14 @@
   String get lintCode => LintNames.prefer_generic_function_type_aliases;
 
   Future<void> test_functionTypeAlias_noParameterTypes() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 typedef String F(x);
 ''');
     await assertNoFix();
   }
 
   Future<void> test_functionTypeAlias_noReturnType_noTypeParameters() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 typedef String F(int x);
 ''');
     await assertHasFix('''
@@ -41,7 +41,7 @@
   }
 
   Future<void> test_functionTypeAlias_noReturnType_typeParameters() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 typedef F<P, R>(P x);
 ''');
     await assertHasFix('''
@@ -50,7 +50,7 @@
   }
 
   Future<void> test_functionTypeAlias_returnType_noTypeParameters() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 typedef String F(int x);
 ''');
     await assertHasFix('''
@@ -59,7 +59,7 @@
   }
 
   Future<void> test_functionTypeAlias_returnType_typeParameters() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 typedef R F<P, R>(P x);
 ''');
     await assertHasFix('''
@@ -77,14 +77,14 @@
   String get lintCode => LintNames.use_function_type_syntax_for_parameters;
 
   Future<void> test_functionTypedParameter_noParameterTypes() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 g(String f(x)) {}
 ''');
     await assertNoFix();
   }
 
   Future<void> test_functionTypedParameter_returnType() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 g(String f(int x)) {}
 ''');
     await assertHasFix('''
diff --git a/pkg/analysis_server/test/src/services/correction/fix/convert_to_if_element_test.dart b/pkg/analysis_server/test/src/services/correction/fix/convert_to_if_element_test.dart
index cb36355..ed2c3aa 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/convert_to_if_element_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/convert_to_if_element_test.dart
@@ -26,7 +26,7 @@
 
   // More coverage in the `convert_to_if_element_test.dart` assist test.
   Future<void> test_conditional_list() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f(bool b) {
   return ['a', b ? 'c' : 'd', 'e'];
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/convert_to_if_null_test.dart b/pkg/analysis_server/test/src/services/correction/fix/convert_to_if_null_test.dart
index 81c4960..1a641e7 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/convert_to_if_null_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/convert_to_if_null_test.dart
@@ -25,7 +25,7 @@
   String get lintCode => LintNames.prefer_if_null_operators;
 
   Future<void> test_equalEqual() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void f(String s) {
   print(s == null ? 'default' : s);
 }
@@ -38,7 +38,7 @@
   }
 
   Future<void> test_malformed() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void f(String s, bool b) {
   print(b ? s != null ? s : : null);
 }
@@ -52,7 +52,7 @@
 
   Future<void> test_malformed_parentheses() async {
     // https://github.com/dart-lang/sdk/issues/43432
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void f(String s, bool b) {
   print(b ? (s != null ? s : ) : null);
 }
@@ -65,7 +65,7 @@
   }
 
   Future<void> test_notEqual() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void f(String s) {
   print(s != null ? s : 'default');
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/convert_to_int_literal_test.dart b/pkg/analysis_server/test/src/services/correction/fix/convert_to_int_literal_test.dart
index e451086..154e215 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/convert_to_int_literal_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/convert_to_int_literal_test.dart
@@ -25,7 +25,7 @@
 
   /// More coverage in the `convert_to_int_literal_test.dart` assist test.
   Future<void> test_decimal() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 const double myDouble = 42.0;
 ''');
     await assertHasFix('''
diff --git a/pkg/analysis_server/test/src/services/correction/fix/convert_to_list_literal_test.dart b/pkg/analysis_server/test/src/services/correction/fix/convert_to_list_literal_test.dart
index 65f833c..160c5f4 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/convert_to_list_literal_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/convert_to_list_literal_test.dart
@@ -24,7 +24,7 @@
   String get lintCode => LintNames.prefer_collection_literals;
 
   Future<void> test_default_declaredType() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 List l = List();
 ''');
     await assertHasFix('''
@@ -33,7 +33,7 @@
   }
 
   Future<void> test_default_minimal() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var l = List();
 ''');
     await assertHasFix('''
@@ -42,7 +42,7 @@
   }
 
   Future<void> test_default_newKeyword() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var l = new List();
 ''');
     await assertHasFix('''
@@ -51,7 +51,7 @@
   }
 
   Future<void> test_default_typeArg() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var l = List<int>();
 ''');
     await assertHasFix('''
diff --git a/pkg/analysis_server/test/src/services/correction/fix/convert_to_map_literal_test.dart b/pkg/analysis_server/test/src/services/correction/fix/convert_to_map_literal_test.dart
index 16926a1..3407683 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/convert_to_map_literal_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/convert_to_map_literal_test.dart
@@ -24,7 +24,7 @@
   String get lintCode => LintNames.prefer_collection_literals;
 
   Future<void> test_default_declaredType() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 Map m = Map();
 ''');
     await assertHasFix('''
@@ -33,7 +33,7 @@
   }
 
   Future<void> test_default_linkedHashMap() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'dart:collection';
 var m = LinkedHashMap();
 ''');
@@ -44,7 +44,7 @@
   }
 
   Future<void> test_default_minimal() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var m = Map();
 ''');
     await assertHasFix('''
@@ -53,7 +53,7 @@
   }
 
   Future<void> test_default_newKeyword() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var m = new Map();
 ''');
     await assertHasFix('''
@@ -62,7 +62,7 @@
   }
 
   Future<void> test_default_typeArg() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var m = Map<String, int>();
 ''');
     await assertHasFix('''
diff --git a/pkg/analysis_server/test/src/services/correction/fix/convert_to_named_arguments_test.dart b/pkg/analysis_server/test/src/services/correction/fix/convert_to_named_arguments_test.dart
index 95bcb68..cf35cc7 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/convert_to_named_arguments_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/convert_to_named_arguments_test.dart
@@ -20,7 +20,7 @@
   FixKind get kind => DartFixKind.CONVERT_TO_NAMED_ARGUMENTS;
 
   Future<void> test_ambiguous() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   A({int a, int b});
 }
@@ -33,7 +33,7 @@
   }
 
   Future<void> test_functionExpressionInvocation_getter() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   void Function({int aaa}) get g => null;
 }
@@ -54,7 +54,7 @@
   }
 
   Future<void> test_functionExpressionInvocation_variable() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 typedef F = void Function({int aaa});
 
 main(F f) {
@@ -71,7 +71,7 @@
   }
 
   Future<void> test_instanceCreation() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   A({int a, double b});
 }
@@ -92,7 +92,7 @@
   }
 
   Future<void> test_instanceCreation_hasPositional() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   A(int a, {int b});
 }
@@ -113,7 +113,7 @@
   }
 
   Future<void> test_methodInvocation() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class C {
   void foo({int a}) {}
 }
@@ -134,7 +134,7 @@
   }
 
   Future<void> test_noCompatibleParameter() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   A({String a});
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/convert_to_null_aware_test.dart b/pkg/analysis_server/test/src/services/correction/fix/convert_to_null_aware_test.dart
index a3bca6d..52e07bf 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/convert_to_null_aware_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/convert_to_null_aware_test.dart
@@ -25,7 +25,7 @@
 
   /// More coverage in the `convert_to_null_aware_test.dart` assist test.
   Future<void> test_equal_nullOnLeft() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 abstract class A {
   int m();
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/convert_to_on_type_test.dart b/pkg/analysis_server/test/src/services/correction/fix/convert_to_on_type_test.dart
index 41d23a3..a6daf9b 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/convert_to_on_type_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/convert_to_on_type_test.dart
@@ -24,7 +24,7 @@
   String get lintCode => LintNames.avoid_types_as_parameter_names;
 
   Future<void> test_withOnType() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void f() {
   try {
   } on ArgumentError catch (Object) {
@@ -39,7 +39,7 @@
   }
 
   Future<void> test_withoutStackTrace() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void f() {
   try {
   } catch (ArgumentError) {
@@ -56,7 +56,7 @@
   }
 
   Future<void> test_withStackTrace() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void f() {
   try {
   } catch (ArgumentError, st) {
diff --git a/pkg/analysis_server/test/src/services/correction/fix/convert_to_package_import_test.dart b/pkg/analysis_server/test/src/services/correction/fix/convert_to_package_import_test.dart
index 0f607e6..35b1de0 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/convert_to_package_import_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/convert_to_package_import_test.dart
@@ -32,7 +32,7 @@
     newFile('/home/test/lib/foo/bar.dart', content: '''
 class C {}
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '../lib/foo/bar.dart';
 
 C c;
diff --git a/pkg/analysis_server/test/src/services/correction/fix/convert_to_relative_import_test.dart b/pkg/analysis_server/test/src/services/correction/fix/convert_to_relative_import_test.dart
index 471432f..8e59b5f 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/convert_to_relative_import_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/convert_to_relative_import_test.dart
@@ -29,7 +29,7 @@
 class C {}
 ''');
     testFile = convertPath('/home/test/lib/src/test.dart');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:test/foo.dart';
 C c;
 ''');
@@ -44,7 +44,7 @@
     // Validate we don't get a fix with imports referencing different packages.
     addSource('/home/test1/lib/foo.dart', '');
     testFile = convertPath('/home/test2/lib/bar.dart');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:test1/foo.dart';
 ''');
 
@@ -54,7 +54,7 @@
   Future<void> test_relativeImportGarbledUri() async {
     addSource('/home/test/lib/foo.dart', '');
     testFile = convertPath('/home/test/lib/bar.dart');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:test/foo';
 ''');
 
@@ -70,7 +70,7 @@
 class C {}
 ''');
     testFile = convertPath('/home/test/lib/bar.dart');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import "package:test/foo.dart";
 C c;
 ''');
@@ -86,7 +86,7 @@
 class C {}
 ''');
     testFile = convertPath('/home/test/lib/bar.dart');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:test/foo.dart';
 C c;
 ''');
@@ -102,7 +102,7 @@
 class C {}
 ''');
     testFile = convertPath('/home/test/lib/test.dart');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:test/baz/foo.dart';
 C c;
 ''');
diff --git a/pkg/analysis_server/test/src/services/correction/fix/convert_to_set_literal_test.dart b/pkg/analysis_server/test/src/services/correction/fix/convert_to_set_literal_test.dart
index 3f55c70..f12ee52 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/convert_to_set_literal_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/convert_to_set_literal_test.dart
@@ -24,7 +24,7 @@
   String get lintCode => LintNames.prefer_collection_literals;
 
   Future<void> test_default_declaredType() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 Set s = Set();
 ''');
     await assertHasFix('''
@@ -33,7 +33,7 @@
   }
 
   Future<void> test_default_minimal() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var s = Set();
 ''');
     await assertHasFix('''
@@ -42,7 +42,7 @@
   }
 
   Future<void> test_default_newKeyword() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var s = new Set();
 ''');
     await assertHasFix('''
@@ -51,7 +51,7 @@
   }
 
   Future<void> test_default_typeArg() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var s = Set<int>();
 ''');
     await assertHasFix('''
@@ -62,7 +62,7 @@
   @failingTest
   Future<void> test_default_typeArg_linkedHashSet() async {
     // LinkedHashSet isn't converted even though the lint reports that case.
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'dart:collection';
 
 var s = LinkedHashSet<int>();
@@ -75,7 +75,7 @@
   }
 
   Future<void> test_from_empty() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var s = Set.from([]);
 ''');
     await assertHasFix('''
@@ -87,7 +87,7 @@
   Future<void> test_from_inferred() async {
     // _setWouldBeInferred does not check for inference based on the parameter
     // type.
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void f(Set<int> s) {}
 var s = f(Set.from([]));
 ''');
@@ -98,7 +98,7 @@
   }
 
   Future<void> test_from_newKeyword() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var s = new Set.from([2, 3]);
 ''');
     await assertHasFix('''
@@ -107,7 +107,7 @@
   }
 
   Future<void> test_from_noKeyword_declaredType() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 Set s = Set.from([2, 3]);
 ''');
     await assertHasFix('''
@@ -116,7 +116,7 @@
   }
 
   Future<void> test_from_noKeyword_typeArg_onConstructor() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var s = Set<int>.from([2, 3]);
 ''');
     await assertHasFix('''
@@ -125,7 +125,7 @@
   }
 
   Future<void> test_from_noKeyword_typeArg_onConstructorAndLiteral() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var s = Set<int>.from(<num>[2, 3]);
 ''');
     await assertHasFix('''
@@ -134,7 +134,7 @@
   }
 
   Future<void> test_from_noKeyword_typeArg_onLiteral() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var s = Set.from(<int>[2, 3]);
 ''');
     await assertHasFix('''
@@ -143,7 +143,7 @@
   }
 
   Future<void> test_from_nonEmpty() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var s = Set.from([2, 3]);
 ''');
     await assertHasFix('''
@@ -152,7 +152,7 @@
   }
 
   Future<void> test_from_trailingComma() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var s = Set.from([2, 3,]);
 ''');
     await assertHasFix('''
@@ -161,7 +161,7 @@
   }
 
   Future<void> test_toSet_empty() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var s = [].toSet();
 ''');
     await assertHasFix('''
@@ -170,7 +170,7 @@
   }
 
   Future<void> test_toSet_empty_typeArg() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var s = <int>[].toSet();
 ''');
     await assertHasFix('''
@@ -179,7 +179,7 @@
   }
 
   Future<void> test_toSet_nonEmpty() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var s = [2, 3].toSet();
 ''');
     await assertHasFix('''
@@ -188,7 +188,7 @@
   }
 
   Future<void> test_toSet_nonEmpty_typeArg() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var s = <int>[2, 3].toSet();
 ''');
     await assertHasFix('''
diff --git a/pkg/analysis_server/test/src/services/correction/fix/convert_to_single_quoted_string_test.dart b/pkg/analysis_server/test/src/services/correction/fix/convert_to_single_quoted_string_test.dart
index 9c46609..12f8212 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/convert_to_single_quoted_string_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/convert_to_single_quoted_string_test.dart
@@ -24,7 +24,7 @@
   String get lintCode => LintNames.prefer_single_quotes;
 
   Future<void> test_one_interpolation() async {
-    await resolveTestUnit(r'''
+    await resolveTestCode(r'''
 main() {
   var b = 'b';
   var c = 'c';
@@ -42,7 +42,7 @@
 
   /// More coverage in the `convert_to_single_quoted_string_test.dart` assist test.
   Future<void> test_one_simple() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   print("abc");
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/convert_to_spread_test.dart b/pkg/analysis_server/test/src/services/correction/fix/convert_to_spread_test.dart
index bcf9a8e..bb9b5c8 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/convert_to_spread_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/convert_to_spread_test.dart
@@ -25,7 +25,7 @@
 
   /// More coverage in the `convert_to_spread_test.dart` assist test.
   Future<void> test_addAll_expression() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f() {
   var ints = [1, 2, 3];
   print(['a']..addAll(ints.map((i) => i.toString()))..addAll(['c']));
diff --git a/pkg/analysis_server/test/src/services/correction/fix/convert_to_where_type_test.dart b/pkg/analysis_server/test/src/services/correction/fix/convert_to_where_type_test.dart
index e843e15..7768534 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/convert_to_where_type_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/convert_to_where_type_test.dart
@@ -24,7 +24,7 @@
   String get lintCode => LintNames.prefer_iterable_whereType;
 
   Future<void> test_default_declaredType() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 Iterable<C> f(List<Object> list) {
   return list.where((e) => e is C);
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/create_class_test.dart b/pkg/analysis_server/test/src/services/correction/fix/create_class_test.dart
index 10f5a1a..b81a200 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/create_class_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/create_class_test.dart
@@ -22,7 +22,7 @@
   FixKind get kind => DartFixKind.CREATE_CLASS;
 
   Future<void> test_annotation() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 @Test('a')
 void f() {}
 ''');
@@ -39,7 +39,7 @@
   }
 
   Future<void> test_extends() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class MyClass extends BaseClass {}
 ''');
     await assertHasFix('''
@@ -51,7 +51,7 @@
   }
 
   Future<void> test_hasUnresolvedPrefix() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   prefix.Test v = null;
   print(v);
@@ -61,7 +61,7 @@
   }
 
   Future<void> test_implements() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class MyClass implements BaseClass {}
 ''');
     await assertHasFix('''
@@ -77,7 +77,7 @@
 class A {}
 ''');
 
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'lib.dart' as lib;
 
 main() {
@@ -97,7 +97,7 @@
   }
 
   Future<void> test_innerLocalFunction() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f() {
   g() {
     Test v = null;
@@ -122,7 +122,7 @@
   }
 
   Future<void> test_instanceCreation_withoutNew_fromFunction() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   Test ();
 }
@@ -139,7 +139,7 @@
   }
 
   Future<void> test_instanceCreation_withoutNew_fromMethod() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   main() {
     Test ();
@@ -160,7 +160,7 @@
   }
 
   Future<void> test_itemOfList() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   var a = [Test];
   print(a);
@@ -179,7 +179,7 @@
   }
 
   Future<void> test_itemOfList_inAnnotation() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class MyAnnotation {
   const MyAnnotation(a, b);
 }
@@ -202,7 +202,7 @@
   }
 
   Future<void> test_simple() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   Test v = null;
   print(v);
@@ -221,7 +221,7 @@
   }
 
   Future<void> test_with() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class MyClass with BaseClass {}
 ''');
     await assertHasFix('''
diff --git a/pkg/analysis_server/test/src/services/correction/fix/create_constructor_for_final_fields_test.dart b/pkg/analysis_server/test/src/services/correction/fix/create_constructor_for_final_fields_test.dart
index 4c0a8d0..32efaed 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/create_constructor_for_final_fields_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/create_constructor_for_final_fields_test.dart
@@ -3,10 +3,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/src/services/correction/fix.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import '../../../../abstract_context.dart';
 import 'fix_processor.dart';
 
 void main() {
@@ -22,8 +22,8 @@
   FixKind get kind => DartFixKind.CREATE_CONSTRUCTOR_FOR_FINAL_FIELDS;
 
   Future<void> test_flutter() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
+    writeTestPackageConfig(flutter: true);
+    await resolveTestCode('''
 import 'package:flutter/widgets.dart';
 
 class MyWidget extends StatelessWidget {
@@ -48,8 +48,8 @@
   }
 
   Future<void> test_flutter_childLast() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
+    writeTestPackageConfig(flutter: true);
+    await resolveTestCode('''
 import 'package:flutter/widgets.dart';
 
 class MyWidget extends StatelessWidget {
@@ -74,8 +74,8 @@
   }
 
   Future<void> test_flutter_childrenLast() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
+    writeTestPackageConfig(flutter: true);
+    await resolveTestCode('''
 import 'package:flutter/widgets.dart';
 
 class MyWidget extends StatelessWidget {
@@ -100,7 +100,7 @@
   }
 
   Future<void> test_inTopLevelMethod() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   final int v;
   print(v);
@@ -110,7 +110,7 @@
   }
 
   Future<void> test_simple() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class Test {
   final int a;
   final int b = 2;
@@ -131,7 +131,7 @@
   }
 
   Future<void> test_topLevelField() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 final int v;
 ''');
     await assertNoFix();
@@ -139,16 +139,13 @@
 }
 
 @reflectiveTest
-class CreateConstructorForFinalFieldsWithNullSafetyTest
-    extends FixProcessorTest {
-  @override
-  List<String> get experiments => [EnableString.non_nullable];
-
+class CreateConstructorForFinalFieldsWithNullSafetyTest extends FixProcessorTest
+    with WithNullSafetyMixin {
   @override
   FixKind get kind => DartFixKind.CREATE_CONSTRUCTOR_FOR_FINAL_FIELDS;
 
   Future<void> test_excludesLate() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class Test {
   final int a;
   late final int b;
diff --git a/pkg/analysis_server/test/src/services/correction/fix/create_constructor_super_test.dart b/pkg/analysis_server/test/src/services/correction/fix/create_constructor_super_test.dart
index 77e3e05..19af80e 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/create_constructor_super_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/create_constructor_super_test.dart
@@ -20,7 +20,7 @@
   FixKind get kind => DartFixKind.CREATE_CONSTRUCTOR_SUPER;
 
   Future<void> test_fieldInitializer() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   int _field;
   A(this._field);
@@ -59,7 +59,7 @@
   B(A a);
 }
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:test/b.dart';
 
 class C extends B {
@@ -76,7 +76,7 @@
   }
 
   Future<void> test_named() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   A.named(p1, int p2);
 }
@@ -101,7 +101,7 @@
   }
 
   Future<void> test_optional() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   A(p1, int p2, List<String> p3, [int p4]);
 }
@@ -126,9 +126,9 @@
   }
 
   Future<void> test_private() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
-  A._named(p); // ignore: unused_element
+  A._named(p);
 }
 class B extends A {
 }
@@ -137,7 +137,7 @@
   }
 
   Future<void> test_typeArgument() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class C<T> {
   final T x;
   C(this.x);
diff --git a/pkg/analysis_server/test/src/services/correction/fix/create_constructor_test.dart b/pkg/analysis_server/test/src/services/correction/fix/create_constructor_test.dart
index 0512623..b4a31d8 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/create_constructor_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/create_constructor_test.dart
@@ -22,7 +22,7 @@
   FixKind get kind => DartFixKind.CREATE_CONSTRUCTOR;
 
   Future<void> test_named() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 mixin M {}
 
 main() {
@@ -45,7 +45,7 @@
 /// $_text200
 class A {}
 ''').path;
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'a.dart';
 
 main() {
@@ -65,7 +65,7 @@
 /// $_text200
 class A {}
 ''').path;
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'a.dart';
 
 main() {
@@ -81,7 +81,7 @@
   }
 
   Future<void> test_insteadOfSyntheticDefault() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   int field;
 
@@ -107,7 +107,7 @@
 
   Future<void> test_mixin() async {
     verifyNoTestUnitErrors = false;
-    await resolveTestUnit('''
+    await resolveTestCode('''
 mixin M {}
 void f() {
   new M(3);
@@ -119,7 +119,7 @@
   }
 
   Future<void> test_named() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   method() {}
 }
@@ -141,7 +141,7 @@
   }
 
   Future<void> test_named_emptyClassBody() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {}
 main() {
   new A.named(1);
diff --git a/pkg/analysis_server/test/src/services/correction/fix/create_field_test.dart b/pkg/analysis_server/test/src/services/correction/fix/create_field_test.dart
index df32308..869bda5 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/create_field_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/create_field_test.dart
@@ -22,7 +22,7 @@
   FixKind get kind => DartFixKind.CREATE_FIELD;
 
   Future<void> test_getter_qualified_instance() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 mixin M {
 }
 
@@ -44,7 +44,7 @@
   }
 
   Future<void> test_setter_qualified_instance_hasField() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 mixin M {
   int aaa;
   int zzz;
@@ -79,7 +79,7 @@
   FixKind get kind => DartFixKind.CREATE_FIELD;
 
   Future<void> test_getter_multiLevel() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
 }
 class B {
@@ -111,7 +111,7 @@
   }
 
   Future<void> test_getter_qualified_instance() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
 }
 main(A a) {
@@ -142,7 +142,7 @@
 }
 ''');
 
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:test/other.dart';
 
 main(A a) {
@@ -165,7 +165,7 @@
   }
 
   Future<void> test_getter_qualified_instance_dynamicType() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   B b;
   void f(dynamic context) {
@@ -189,7 +189,7 @@
   }
 
   Future<void> test_getter_qualified_propagatedType() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   A get self => this;
 }
@@ -214,7 +214,7 @@
   }
 
   Future<void> test_getter_unqualified_instance_asInvocationArgument() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   main() {
     f(test);
@@ -235,7 +235,7 @@
   }
 
   Future<void> test_getter_unqualified_instance_assignmentRhs() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   main() {
     int v = test;
@@ -256,7 +256,7 @@
   }
 
   Future<void> test_getter_unqualified_instance_asStatement() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   main() {
     test;
@@ -275,7 +275,7 @@
   }
 
   Future<void> test_hint() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
 }
 main(A a) {
@@ -297,7 +297,7 @@
   }
 
   Future<void> test_hint_setter() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
 }
 main(A a) {
@@ -327,7 +327,7 @@
 A getA() => null;
 ''');
 
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:test/b.dart';
 
 class C {
@@ -353,7 +353,7 @@
   }
 
   Future<void> test_inEnum() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 enum MyEnum {
   AAA, BBB
 }
@@ -370,7 +370,7 @@
 class A {}
 ''');
 
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:test/a.dart';
 
 main(A a) {
@@ -384,7 +384,7 @@
   }
 
   Future<void> test_inPart_self() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 part of lib;
 class A {
 }
@@ -397,7 +397,7 @@
   }
 
   Future<void> test_inSDK() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main(List p) {
   p.foo = 1;
 }
@@ -406,7 +406,7 @@
   }
 
   Future<void> test_invalidInitializer_withoutType() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class C {
   C(this.text);
 }
@@ -421,7 +421,7 @@
   }
 
   Future<void> test_invalidInitializer_withType() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class C {
   C(String this.text);
 }
@@ -436,7 +436,7 @@
   }
 
   Future<void> test_setter_generic_BAD() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
 }
 class B<T> {
@@ -460,7 +460,7 @@
   }
 
   Future<void> test_setter_generic_OK_local() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A<T> {
   List<T> items;
 
@@ -483,7 +483,7 @@
   }
 
   Future<void> test_setter_qualified_instance_hasField() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   int aaa;
   int zzz;
@@ -510,7 +510,7 @@
   }
 
   Future<void> test_setter_qualified_instance_hasMethod() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   existingMethod() {}
 }
@@ -531,7 +531,7 @@
   }
 
   Future<void> test_setter_qualified_static() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
 }
 main() {
@@ -549,7 +549,7 @@
   }
 
   Future<void> test_setter_unqualified_instance() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   main() {
     test = 5;
@@ -568,7 +568,7 @@
   }
 
   Future<void> test_setter_unqualified_static() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   static main() {
     test = 5;
diff --git a/pkg/analysis_server/test/src/services/correction/fix/create_file_test.dart b/pkg/analysis_server/test/src/services/correction/fix/create_file_test.dart
index 0389835..0c156d3 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/create_file_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/create_file_test.dart
@@ -21,7 +21,7 @@
   FixKind get kind => DartFixKind.CREATE_FILE;
 
   Future<void> test_forImport() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'my_file.dart';
 ''');
     await assertHasFixWithoutApplying();
@@ -39,14 +39,14 @@
   }
 
   Future<void> test_forImport_BAD_notDart() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'my_file.txt';
 ''');
     await assertNoFix();
   }
 
   Future<void> test_forImport_inPackage_lib() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'a/bb/my_lib.dart';
 ''');
     await assertHasFixWithoutApplying();
@@ -65,7 +65,7 @@
 
   Future<void> test_forImport_inPackage_test() async {
     testFile = convertPath('/home/test/test/test.dart');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'a/bb/my_lib.dart';
 ''');
     await assertHasFixWithoutApplying();
@@ -83,7 +83,7 @@
   }
 
   Future<void> test_forPart() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 library my.lib;
 part 'my_part.dart';
 ''');
diff --git a/pkg/analysis_server/test/src/services/correction/fix/create_function_test.dart b/pkg/analysis_server/test/src/services/correction/fix/create_function_test.dart
index ca334c7..dff3ac4 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/create_function_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/create_function_test.dart
@@ -21,7 +21,7 @@
   FixKind get kind => DartFixKind.CREATE_FUNCTION;
 
   Future<void> assert_returnType_bool(String lineWithTest) async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   bool b = true;
   $lineWithTest
@@ -41,7 +41,7 @@
   }
 
   Future<void> test_bottomArgument() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   test(throw 42);
 }
@@ -57,7 +57,7 @@
   }
 
   Future<void> test_duplicateArgumentNames() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class C {
   int x;
 }
@@ -81,7 +81,7 @@
   }
 
   Future<void> test_dynamicArgument() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   dynamic v;
   test(v);
@@ -99,7 +99,7 @@
   }
 
   Future<void> test_dynamicReturnType() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   dynamic v = test();
   print(v);
@@ -117,7 +117,7 @@
   }
 
   Future<void> test_fromFunction() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   int v = myUndefinedFunction(1, 2.0, '3');
     print(v);
@@ -135,7 +135,7 @@
   }
 
   Future<void> test_fromMethod() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   main() {
     int v = myUndefinedFunction(1, 2.0, '3');
@@ -157,7 +157,7 @@
   }
 
   Future<void> test_functionType_cascadeSecond() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   B ma() => null;
 }
@@ -189,7 +189,7 @@
   }
 
   Future<void> test_functionType_coreFunction() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   useFunction(g: test);
 }
@@ -207,7 +207,7 @@
   }
 
   Future<void> test_functionType_dynamicArgument() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   useFunction(test);
 }
@@ -225,7 +225,7 @@
   }
 
   Future<void> test_functionType_function() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   useFunction(test);
 }
@@ -243,7 +243,7 @@
   }
 
   Future<void> test_functionType_function_namedArgument() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   useFunction(g: test);
 }
@@ -269,7 +269,7 @@
 
 useFunction(int g(A a)) {}
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:test/b.dart';
 
 main() {
@@ -290,7 +290,7 @@
   }
 
   Future<void> test_functionType_notFunctionType() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main(A a) {
   useFunction(a.test);
 }
@@ -301,7 +301,7 @@
   }
 
   Future<void> test_generic_type() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   List<int> items;
   main() {
@@ -328,7 +328,7 @@
   }
 
   Future<void> test_generic_typeParameter() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A<T> {
   Map<int, T> items;
   main() {
@@ -355,7 +355,7 @@
 import 'dart:async';
 Future getFuture() => null;
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'lib.dart';
 main() {
   test(getFuture());
@@ -373,7 +373,7 @@
   }
 
   Future<void> test_nullArgument() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   test(null);
 }
@@ -389,7 +389,7 @@
   }
 
   Future<void> test_parameterName_fromIndexExpression() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   int operator[](int _) => 0;
 
@@ -449,7 +449,7 @@
   }
 
   Future<void> test_returnType_fromAssignment_eq() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   int v;
   v = myUndefinedFunction();
@@ -469,7 +469,7 @@
   }
 
   Future<void> test_returnType_fromAssignment_plusEq() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   int v;
   v += myUndefinedFunction();
@@ -489,7 +489,7 @@
   }
 
   Future<void> test_returnType_fromBinary_right() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   0 + myUndefinedFunction();
 }
@@ -505,7 +505,7 @@
   }
 
   Future<void> test_returnType_fromInitializer() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   int v = myUndefinedFunction();
   print(v);
@@ -523,7 +523,7 @@
   }
 
   Future<void> test_returnType_fromInvocationArgument() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 foo(int p) {}
 main() {
   foo( myUndefinedFunction() );
@@ -541,7 +541,7 @@
   }
 
   Future<void> test_returnType_fromReturn() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 int main() {
   return myUndefinedFunction();
 }
@@ -557,7 +557,7 @@
   }
 
   Future<void> test_returnType_void() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   myUndefinedFunction();
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/create_getter_test.dart b/pkg/analysis_server/test/src/services/correction/fix/create_getter_test.dart
index c8797e3..af7db0e 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/create_getter_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/create_getter_test.dart
@@ -22,7 +22,7 @@
   FixKind get kind => DartFixKind.CREATE_GETTER;
 
   Future<void> test_qualified_instance() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 mixin M {
 }
 
@@ -44,7 +44,7 @@
   }
 
   Future<void> test_unqualified_instance_assignmentLhs() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 mixin M {
   main() {
     test = 42;
@@ -55,7 +55,7 @@
   }
 
   Future<void> test_unqualified_instance_assignmentRhs() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 mixin M {
   main() {
     int v = test;
@@ -82,7 +82,7 @@
   FixKind get kind => DartFixKind.CREATE_GETTER;
 
   Future<void> test_hint_getter() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
 }
 main(A a) {
@@ -104,7 +104,7 @@
   }
 
   Future<void> test_inSDK() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main(List p) {
   int v = p.foo;
   print(v);
@@ -114,7 +114,7 @@
   }
 
   Future<void> test_internal_instance() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 extension E on String {
   int m()  => g;
 }
@@ -129,7 +129,7 @@
   }
 
   Future<void> test_internal_static() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 extension E on String {
   static int m()  => g;
 }
@@ -144,7 +144,7 @@
   }
 
   Future<void> test_location_afterLastGetter() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   int existingField;
 
@@ -175,7 +175,7 @@
   }
 
   Future<void> test_multiLevel() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
 }
 class B {
@@ -207,7 +207,7 @@
   }
 
   Future<void> test_override() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 extension E on String {
 }
 
@@ -229,7 +229,7 @@
   }
 
   Future<void> test_qualified_instance() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
 }
 main(A a) {
@@ -260,7 +260,7 @@
 }
 ''');
 
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:test/other.dart';
 
 main(A a) {
@@ -283,7 +283,7 @@
   }
 
   Future<void> test_qualified_instance_dynamicType() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   B b;
   void f(dynamic context) {
@@ -313,7 +313,7 @@
 class A {}
 ''');
 
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:test/a.dart';
 
 main(A a) {
@@ -327,7 +327,7 @@
   }
 
   Future<void> test_qualified_instance_inPart_self() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 part of lib;
 
 class A {
@@ -342,7 +342,7 @@
   }
 
   Future<void> test_qualified_propagatedType() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   A get self => this;
 }
@@ -367,7 +367,7 @@
   }
 
   Future<void> test_setterContext() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
 }
 main(A a) {
@@ -378,7 +378,7 @@
   }
 
   Future<void> test_static() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 extension E on String {
 }
 
@@ -400,7 +400,7 @@
   }
 
   Future<void> test_unqualified_instance_asInvocationArgument() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   main() {
     f(test);
@@ -421,7 +421,7 @@
   }
 
   Future<void> test_unqualified_instance_assignmentLhs() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   main() {
     test = 42;
@@ -432,7 +432,7 @@
   }
 
   Future<void> test_unqualified_instance_assignmentRhs() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   main() {
     int v = test;
@@ -453,7 +453,7 @@
   }
 
   Future<void> test_unqualified_instance_asStatement() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   main() {
     test;
diff --git a/pkg/analysis_server/test/src/services/correction/fix/create_local_variable_test.dart b/pkg/analysis_server/test/src/services/correction/fix/create_local_variable_test.dart
index a57a686..2c1d827 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/create_local_variable_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/create_local_variable_test.dart
@@ -28,7 +28,7 @@
   }
 
   Future<void> test_functionType_named() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 typedef MY_FUNCTION(int p);
 foo(MY_FUNCTION f) {}
 main() {
@@ -46,7 +46,7 @@
   }
 
   Future<void> test_functionType_named_generic() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 typedef MY_FUNCTION<T>(T p);
 foo(MY_FUNCTION<int> f) {}
 main() {
@@ -64,7 +64,7 @@
   }
 
   Future<void> test_functionType_synthetic() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 foo(f(int p)) {}
 main() {
   foo(bar);
@@ -80,7 +80,7 @@
   }
 
   Future<void> test_read_typeAssignment() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   int a = test;
   print(a);
@@ -96,7 +96,7 @@
   }
 
   Future<void> test_read_typeCondition() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   if (!test) {
     print(42);
@@ -114,7 +114,7 @@
   }
 
   Future<void> test_read_typeInvocationArgument() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   f(test);
 }
@@ -132,7 +132,7 @@
   }
 
   Future<void> test_read_typeInvocationTarget() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   test.add('hello');
 }
@@ -147,13 +147,13 @@
   }
 
   Future<void> test_withImport() async {
-    addPackageFile('pkg', 'a/a.dart', '''
+    newFile('$workspaceRootPath/pkg/lib/a/a.dart', content: '''
 class A {}
 ''');
-    addPackageFile('pkg', 'b/b.dart', '''
+    newFile('$workspaceRootPath/pkg/lib/b/b.dart', content: '''
 class B {}
 ''');
-    addPackageFile('pkg', 'c/c.dart', '''
+    newFile('$workspaceRootPath/pkg/lib/c/c.dart', content: '''
 import 'package:pkg/a/a.dart';
 import 'package:pkg/b/b.dart';
 
@@ -162,7 +162,12 @@
 }
 ''');
 
-    await resolveTestUnit('''
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'pkg', rootPath: '$workspaceRootPath/pkg'),
+    );
+
+    await resolveTestCode('''
 import 'package:pkg/a/a.dart';
 import 'package:pkg/c/c.dart';
 
@@ -196,7 +201,7 @@
   }
 
   Future<void> test_write_assignment() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   test = 42;
 }
@@ -209,7 +214,7 @@
   }
 
   Future<void> test_write_assignment_compound() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   test += 42;
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/create_method_test.dart b/pkg/analysis_server/test/src/services/correction/fix/create_method_test.dart
index d207559..4549b21 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/create_method_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/create_method_test.dart
@@ -27,7 +27,7 @@
   String get lintCode => LintNames.hash_and_equals;
 
   Future<void> test_equals() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class C {
   @override
   int get hashCode => 13;
@@ -47,8 +47,30 @@
 ''');
   }
 
+  /// See: https://github.com/dart-lang/sdk/issues/43867
+  Future<void> test_equals_fieldHashCode() async {
+    await resolveTestCode('''
+class C {
+  @override
+  int hashCode = 13;
+}
+''');
+    await assertHasFix('''
+class C {
+  @override
+  int hashCode = 13;
+
+  @override
+  bool operator ==(Object other) {
+    // TODO: implement ==
+    return super == other;
+  }
+}
+''');
+  }
+
   Future<void> test_hashCode() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class C {
   @override
   bool operator ==(Object other) => false;
@@ -74,7 +96,7 @@
   FixKind get kind => DartFixKind.CREATE_METHOD;
 
   Future<void> test_createQualified_instance() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 mixin M {}
 
 main(M m) {
@@ -93,7 +115,7 @@
   }
 
   Future<void> test_createQualified_static() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 mixin M {}
 
 main() {
@@ -112,7 +134,7 @@
   }
 
   Future<void> test_createUnqualified() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 mixin M {
   main() {
     myUndefinedMethod();
@@ -131,7 +153,7 @@
   }
 
   Future<void> test_functionType_method_enclosingMixin_static() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 mixin M {
   static foo() {
     useFunction(test);
@@ -155,7 +177,7 @@
   }
 
   Future<void> test_functionType_method_targetMixin() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main(M m) {
   useFunction(m.test);
 }
@@ -186,7 +208,7 @@
   FixKind get kind => DartFixKind.CREATE_METHOD;
 
   Future<void> test_createQualified_emptyClassBody() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {}
 main() {
   A.myUndefinedMethod();
@@ -203,7 +225,7 @@
   }
 
   Future<void> test_createQualified_fromClass() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
 }
 main() {
@@ -221,7 +243,7 @@
   }
 
   Future<void> test_createQualified_fromClass_hasOtherMember() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   foo() {}
 }
@@ -242,7 +264,7 @@
   }
 
   Future<void> test_createQualified_fromInstance() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
 }
 main(A a) {
@@ -260,7 +282,7 @@
   }
 
   Future<void> test_createQualified_targetIsFunctionType() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 typedef A();
 main() {
   A.myUndefinedMethod();
@@ -270,7 +292,7 @@
   }
 
   Future<void> test_createQualified_targetIsUnresolved() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   NoSuchClass.myUndefinedMethod();
 }
@@ -279,7 +301,7 @@
   }
 
   Future<void> test_createUnqualified_duplicateArgumentNames() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class C {
   int x;
 }
@@ -304,7 +326,7 @@
   }
 
   Future<void> test_createUnqualified_parameters() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   main() {
     myUndefinedMethod(0, 1.0, '3');
@@ -347,7 +369,7 @@
   }
 
   Future<void> test_createUnqualified_parameters_named() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   main() {
     myUndefinedMethod(0, bbb: 1.0, ccc: '2');
@@ -388,7 +410,7 @@
   }
 
   Future<void> test_createUnqualified_returnType() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   main() {
     int v = myUndefinedMethod();
@@ -413,7 +435,7 @@
   }
 
   Future<void> test_createUnqualified_staticFromField() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   static var f = myUndefinedMethod();
 }
@@ -428,7 +450,7 @@
   }
 
   Future<void> test_createUnqualified_staticFromMethod() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   static main() {
     myUndefinedMethod();
@@ -447,7 +469,7 @@
   }
 
   Future<void> test_functionType_method_enclosingClass_instance() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class C {
   void m1() {
     m2(m3);
@@ -471,7 +493,7 @@
   }
 
   Future<void> test_functionType_method_enclosingClass_static() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   static foo() {
     useFunction(test);
@@ -493,7 +515,7 @@
   }
 
   Future<void> test_functionType_method_enclosingClass_static2() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   var f;
   A() : f = useFunction(test);
@@ -513,7 +535,7 @@
   }
 
   Future<void> test_functionType_method_targetClass() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main(A a) {
   useFunction(a.test);
 }
@@ -534,7 +556,7 @@
   }
 
   Future<void> test_functionType_method_targetClass_hasOtherMember() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main(A a) {
   useFunction(a.test);
 }
@@ -558,7 +580,7 @@
   }
 
   Future<void> test_functionType_notFunctionType() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main(A a) {
   useFunction(a.test);
 }
@@ -569,7 +591,7 @@
   }
 
   Future<void> test_functionType_unknownTarget() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main(A a) {
   useFunction(a.test);
 }
@@ -581,7 +603,7 @@
   }
 
   Future<void> test_generic_argumentType() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A<T> {
   B b;
   Map<int, T> items;
@@ -609,7 +631,7 @@
   }
 
   Future<void> test_generic_literal() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   B b;
   List<int> items;
@@ -636,7 +658,7 @@
   }
 
   Future<void> test_generic_local() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A<T> {
   List<T> items;
   main() {
@@ -657,7 +679,7 @@
   }
 
   Future<void> test_generic_returnType() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A<T> {
   main() {
     T t = new B().compute();
@@ -683,7 +705,7 @@
   }
 
   Future<void> test_hint_createQualified_fromInstance() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
 }
 main() {
@@ -703,7 +725,7 @@
   }
 
   Future<void> test_inSDK() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   List.foo();
 }
@@ -712,7 +734,7 @@
   }
 
   Future<void> test_internal_instance() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 extension E on String {
   int m() => n();
 }
@@ -727,7 +749,7 @@
   }
 
   Future<void> test_internal_static() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 extension E on String {
   static int m() => n();
 }
@@ -742,7 +764,7 @@
   }
 
   Future<void> test_override() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 extension E on String {}
 
 void f() {
@@ -775,7 +797,7 @@
 class E {}
 ''');
 
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'test2.dart' as aaa;
 
 main(aaa.D d, aaa.E e) {
@@ -801,7 +823,7 @@
 class E {}
 ''');
 
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'test2.dart' as test2;
 
 main(test2.D d, test2.E e) {
@@ -819,7 +841,7 @@
   }
 
   Future<void> test_static() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 extension E on String {}
 
 void f() {
@@ -838,7 +860,7 @@
   }
 
   Future<void> test_targetIsEnum() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 enum MyEnum {A, B}
 main() {
   MyEnum.foo();
diff --git a/pkg/analysis_server/test/src/services/correction/fix/create_missing_overrides_test.dart b/pkg/analysis_server/test/src/services/correction/fix/create_missing_overrides_test.dart
index 1ca73821..300d9aa 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/create_missing_overrides_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/create_missing_overrides_test.dart
@@ -3,11 +3,11 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/src/services/correction/fix.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import '../../../../abstract_context.dart';
 import 'fix_processor.dart';
 
 void main() {
@@ -23,7 +23,7 @@
   FixKind get kind => DartFixKind.CREATE_MISSING_OVERRIDES;
 
   Future<void> test_field_untyped() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   var f;
 }
@@ -44,7 +44,7 @@
   }
 
   Future<void> test_functionTypeAlias() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 typedef int Binary(int left, int right);
 
 abstract class Emulator {
@@ -71,7 +71,7 @@
   }
 
   Future<void> test_functionTypedParameter() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 abstract class A {
   void forEach(int f(double p1, String p2));
 }
@@ -94,7 +94,7 @@
   }
 
   Future<void> test_generics_typeArguments() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class Iterator<T> {
 }
 
@@ -122,7 +122,7 @@
   }
 
   Future<void> test_generics_typeParameters() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 abstract class ItemProvider<T> {
   List<T> getItems();
 }
@@ -146,7 +146,7 @@
   }
 
   Future<void> test_getter() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 abstract class A {
   get g1;
   int get g2;
@@ -174,7 +174,7 @@
   }
 
   Future<void> test_importPrefix() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'dart:async' as aaa;
 abstract class A {
   Map<aaa.Future, List<aaa.Future>> g(aaa.Future p);
@@ -200,7 +200,7 @@
   }
 
   Future<void> test_mergeToField_getterSetter() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   int ma;
   void mb() {}
@@ -233,7 +233,7 @@
   }
 
   Future<void> test_method() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 abstract class A {
   void m1();
   int m2();
@@ -311,7 +311,7 @@
   }
 
   Future<void> test_method_emptyClassBody() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 abstract class A {
   void foo();
 }
@@ -333,7 +333,7 @@
   }
 
   Future<void> test_method_generic() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class C<T> {}
 class V<E> {}
 
@@ -364,7 +364,7 @@
 
   Future<void> test_method_generic_withBounds() async {
     // https://github.com/dart-lang/sdk/issues/31199
-    await resolveTestUnit('''
+    await resolveTestCode('''
 abstract class A<K, V> {
   List<T> foo<T extends V>(K key);
 }
@@ -388,7 +388,7 @@
   }
 
   Future<void> test_method_genericClass2() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A<R> {
   R foo(int a) => null;
 }
@@ -426,7 +426,7 @@
   }
 
   Future<void> test_method_namedParameter() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 abstract class A {
   foo({int i});
 }
@@ -453,7 +453,7 @@
   }
 
   Future<void> test_method_notEmptyClassBody() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 abstract class A {
   void foo();
 }
@@ -482,7 +482,7 @@
   Future<void> test_method_withTypedef() async {
     // This fails because the element representing `Base.closure` has a return
     // type that has forgotten that it was declared using the typedef `Closure`.
-    await resolveTestUnit('''
+    await resolveTestCode('''
 typedef Closure = T Function<T>(T input);
 
 abstract class Base {
@@ -508,7 +508,7 @@
   }
 
   Future<void> test_methods_reverseOrder() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 abstract class A {
   foo(int i);
   bar(String bar);
@@ -542,7 +542,7 @@
   }
 
   Future<void> test_operator() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 abstract class A {
   int operator [](int index);
   void operator []=(int index, String value);
@@ -573,7 +573,7 @@
   }
 
   Future<void> test_setter() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 abstract class A {
   set s1(x);
   set s2(int x);
@@ -592,17 +592,17 @@
 
 class B extends A {
   @override
-  void set s1(x) {
+  set s1(x) {
     // TODO: implement s1
   }
 
   @override
-  void set s2(int x) {
+  set s2(int x) {
     // TODO: implement s2
   }
 
   @override
-  void set s3(String x) {
+  set s3(String x) {
     // TODO: implement s3
   }
 }
@@ -611,16 +611,14 @@
 }
 
 @reflectiveTest
-class CreateMissingOverridesWithNullSafetyTest extends FixProcessorTest {
-  @override
-  List<String> get experiments => [EnableString.non_nullable];
-
+class CreateMissingOverridesWithNullSafetyTest extends FixProcessorTest
+    with WithNullSafetyMixin {
   @override
   FixKind get kind => DartFixKind.CREATE_MISSING_OVERRIDES;
 
   Future<void> test_method_generic_nullable_dynamic() async {
     // https://github.com/dart-lang/sdk/issues/43535
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   void doSomething(Map<String, dynamic>? m) {}
 }
@@ -643,7 +641,7 @@
 
   Future<void> test_method_generic_nullable_Never() async {
     // https://github.com/dart-lang/sdk/issues/43535
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   void doSomething(Map<String, Never>? m) {}
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/create_mixin_test.dart b/pkg/analysis_server/test/src/services/correction/fix/create_mixin_test.dart
index 3945682..024eab8 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/create_mixin_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/create_mixin_test.dart
@@ -22,7 +22,7 @@
   FixKind get kind => DartFixKind.CREATE_MIXIN;
 
   Future<void> test_hasUnresolvedPrefix() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   prefix.Test v = null;
   print(v);
@@ -36,7 +36,7 @@
 class A {}
 ''';
     addSource('/home/test/lib/lib.dart', libCode);
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'lib.dart' as lib;
 
 main() {
@@ -55,7 +55,7 @@
   }
 
   Future<void> test_innerLocalFunction() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f() {
   g() {
     Test v = null;
@@ -80,7 +80,7 @@
   }
 
   Future<void> test_instanceCreation_withNew() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   new Test();
 }
@@ -89,7 +89,7 @@
   }
 
   Future<void> test_instanceCreation_withoutNew() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   Test();
 }
@@ -98,7 +98,7 @@
   }
 
   Future<void> test_itemOfList() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   var a = [Test];
   print(a);
@@ -117,7 +117,7 @@
   }
 
   Future<void> test_itemOfList_inAnnotation() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class MyAnnotation {
   const MyAnnotation(a, b);
 }
@@ -140,7 +140,7 @@
   }
 
   Future<void> test_simple() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   Test v = null;
   print(v);
diff --git a/pkg/analysis_server/test/src/services/correction/fix/create_no_such_method_test.dart b/pkg/analysis_server/test/src/services/correction/fix/create_no_such_method_test.dart
index 9f904f3..19bfb81 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/create_no_such_method_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/create_no_such_method_test.dart
@@ -20,7 +20,7 @@
   FixKind get kind => DartFixKind.CREATE_NO_SUCH_METHOD;
 
   Future<void> test_class() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 abstract class A {
   m1();
   int m2();
@@ -45,7 +45,7 @@
   }
 
   Future<void> test_classTypeAlias() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 abstract class A {
   m();
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/create_setter_test.dart b/pkg/analysis_server/test/src/services/correction/fix/create_setter_test.dart
index 1a984bf..610f7dc 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/create_setter_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/create_setter_test.dart
@@ -22,7 +22,7 @@
   FixKind get kind => DartFixKind.CREATE_SETTER;
 
   Future<void> test_qualified_instance() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 mixin M {
 }
 
@@ -42,7 +42,7 @@
   }
 
   Future<void> test_unqualified_instance_assignmentLhs() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 mixin M {
   main() {
     test = 0;
@@ -61,7 +61,7 @@
   }
 
   Future<void> test_unqualified_instance_assignmentRhs() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 mixin M {
   main() {
     test;
@@ -78,7 +78,7 @@
   FixKind get kind => DartFixKind.CREATE_SETTER;
 
   Future<void> test_getterContext() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
 }
 main(A a) {
@@ -89,7 +89,7 @@
   }
 
   Future<void> test_inferredTargetType() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
 }
 main(A a) {
@@ -109,7 +109,7 @@
   }
 
   Future<void> test_inSDK() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main(List p) {
   p.foo = 0;
 }
@@ -118,7 +118,7 @@
   }
 
   Future<void> test_internal_instance() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 extension E on String {
   int m(int x) => s = x;
 }
@@ -133,7 +133,7 @@
   }
 
   Future<void> test_internal_static() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 extension E on String {
   static int m(int x) => s = x;
 }
@@ -148,7 +148,7 @@
   }
 
   Future<void> test_location_afterLastAccessor() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   int existingField;
 
@@ -177,7 +177,7 @@
   }
 
   Future<void> test_multiLevel() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
 }
 class B {
@@ -207,7 +207,7 @@
   }
 
   Future<void> test_override() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 extension E on String {
 }
 
@@ -227,7 +227,7 @@
   }
 
   Future<void> test_qualified_instance() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
 }
 main(A a) {
@@ -256,7 +256,7 @@
 }
 ''');
 
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:test/other.dart';
 
 main(A a) {
@@ -278,7 +278,7 @@
   }
 
   Future<void> test_qualified_instance_dynamicType() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   B b;
   void f(p) {
@@ -308,7 +308,7 @@
 class A {}
 ''');
 
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:test/a.dart';
 
 main(A a) {
@@ -321,7 +321,7 @@
   }
 
   Future<void> test_qualified_instance_inPart_self() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 part of lib;
 
 class A {
@@ -335,7 +335,7 @@
   }
 
   Future<void> test_qualified_propagatedType() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   A get self => this;
 }
@@ -358,7 +358,7 @@
   }
 
   Future<void> test_static() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 extension E on String {
 }
 
@@ -378,7 +378,7 @@
   }
 
   Future<void> test_unqualified_instance_assignmentLhs() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   main() {
     test = 0;
@@ -397,7 +397,7 @@
   }
 
   Future<void> test_unqualified_instance_assignmentRhs() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   main() {
     test;
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/add_type_parameter_test.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/add_type_parameter_test.dart
index e90178e..6b81786 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/data_driven/add_type_parameter_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/add_type_parameter_test.dart
@@ -33,7 +33,7 @@
 }
 ''');
     setPackageData(_add(0, components: ['C', 'C']));
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 
 C f() {
@@ -54,7 +54,7 @@
 class A<S, T> {}
 ''');
     setPackageData(_add(0, components: ['A']));
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 
 class B extends A<int> {}
@@ -71,7 +71,7 @@
 class A<S, T> {}
 ''');
     setPackageData(_add(0, components: ['A']));
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 
 class B implements A<int> {}
@@ -88,7 +88,7 @@
 class A<S, T> {}
 ''');
     setPackageData(_add(0, components: ['A']));
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 
 extension E on A<int> {}
@@ -105,7 +105,7 @@
 class C<S, T> {}
 ''');
     setPackageData(_add(0, components: ['C']));
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 
 void f(C<int> c) {}
@@ -122,7 +122,7 @@
 class A<S, T> {}
 ''');
     setPackageData(_add(0, components: ['A']));
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 
 class B with A<int> {}
@@ -148,7 +148,7 @@
 }
 ''');
     setPackageData(_add(0, components: ['E']));
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 
 void f(C c) {
@@ -178,7 +178,7 @@
 }
 ''');
     setPackageData(_add(0));
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 
 void f(C c) {
@@ -201,7 +201,7 @@
 }
 ''');
     setPackageData(_add(0));
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 
 void f(C c) {
@@ -225,7 +225,7 @@
 }
 ''');
     setPackageData(_add(2));
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 
 void f(C c) {
@@ -249,7 +249,7 @@
 }
 ''');
     setPackageData(_add(1));
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 
 void f(C c) {
@@ -273,7 +273,7 @@
 }
 ''');
     setPackageData(_add(0));
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 
 void f(C c) {
@@ -296,7 +296,7 @@
 }
 ''');
     setPackageData(_add(0, extendedType: 'num'));
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 
 class D extends C {
@@ -321,7 +321,7 @@
 }
 ''');
     setPackageData(_add(0));
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 
 class D extends C {
@@ -350,7 +350,7 @@
 mixin M<S, T> {}
 ''');
     setPackageData(_add(0, components: ['M']));
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 
 class B with M<int> {}
@@ -374,7 +374,7 @@
 void f() {}
 ''');
     setPackageData(_add(0, components: ['f']));
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 
 void g() {
@@ -409,7 +409,7 @@
 typedef F = T Function<S, T>();
 ''');
     setPackageData(_add(0, components: ['F']));
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 
 void g(F f) {
@@ -430,7 +430,7 @@
 typedef F<S, T> = T Function();
 ''');
     setPackageData(_add(0, components: ['F']));
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 
 void g(F<int> f) {
@@ -455,7 +455,7 @@
 typedef F<T> = T Function();
 ''');
     setPackageData(_add(0, components: ['F']));
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 
 void g(F f) {
@@ -483,6 +483,7 @@
               libraryUris: [Uri.parse(importUri)],
               kind: ElementKindUtilities.fromName(_kind),
               components: components ?? ['C', 'm']),
+          bulkApply: false,
           changes: [
             AddTypeParameter(
                 index: index,
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/code_fragment_parser_test.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/code_fragment_parser_test.dart
new file mode 100644
index 0000000..75e883e
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/code_fragment_parser_test.dart
@@ -0,0 +1,85 @@
+// Copyright (c) 2020, 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:_fe_analyzer_shared/src/base/errors.dart';
+import 'package:analysis_server/src/services/correction/fix/data_driven/accessor.dart';
+import 'package:analysis_server/src/services/correction/fix/data_driven/code_fragment_parser.dart';
+import 'package:analyzer/error/listener.dart';
+import 'package:matcher/matcher.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../../../../../mocks.dart';
+import '../../../../../utils/test_support.dart';
+
+void main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(CodeFragmentParserTest);
+  });
+}
+
+abstract class AbstractCodeFragmentParserTest {
+  List<Accessor> assertErrors(
+      String content, List<ExpectedError> expectedErrors) {
+    var errorListener = GatheringErrorListener();
+    var errorReporter = ErrorReporter(errorListener, MockSource());
+    var accessors = CodeFragmentParser(errorReporter).parse(content, 0);
+    errorListener.assertErrors(expectedErrors);
+    return accessors;
+  }
+
+  List<Accessor> assertNoErrors(String content) {
+    var errorListener = GatheringErrorListener();
+    var errorReporter = ErrorReporter(errorListener, MockSource());
+    var accessors = CodeFragmentParser(errorReporter).parse(content, 0);
+    errorListener.assertNoErrors();
+    return accessors;
+  }
+
+  ExpectedError error(ErrorCode code, int offset, int length,
+          {String message,
+          Pattern messageContains,
+          List<ExpectedContextMessage> contextMessages =
+              const <ExpectedContextMessage>[]}) =>
+      ExpectedError(code, offset, length,
+          message: message,
+          messageContains: messageContains,
+          expectedContextMessages: contextMessages);
+}
+
+@reflectiveTest
+class CodeFragmentParserTest extends AbstractCodeFragmentParserTest {
+  void test_arguments_arguments_arguments() {
+    var accessors = assertNoErrors('arguments[0].arguments[1].arguments[2]');
+    expect(accessors, hasLength(3));
+    expect(accessors[0], isA<ArgumentAccessor>());
+    expect(accessors[1], isA<ArgumentAccessor>());
+    expect(accessors[2], isA<ArgumentAccessor>());
+  }
+
+  void test_arguments_named() {
+    var accessors = assertNoErrors('arguments[foo]');
+    expect(accessors, hasLength(1));
+    expect(accessors[0], isA<ArgumentAccessor>());
+  }
+
+  void test_arguments_positional() {
+    var accessors = assertNoErrors('arguments[0]');
+    expect(accessors, hasLength(1));
+    expect(accessors[0], isA<ArgumentAccessor>());
+  }
+
+  void test_arguments_typeArguments() {
+    var accessors = assertNoErrors('arguments[0].typeArguments[0]');
+    expect(accessors, hasLength(2));
+    expect(accessors[0], isA<ArgumentAccessor>());
+    expect(accessors[1], isA<TypeArgumentAccessor>());
+  }
+
+  void test_typeArguments() {
+    var accessors = assertNoErrors('typeArguments[0]');
+    expect(accessors, hasLength(1));
+    expect(accessors[0], isA<TypeArgumentAccessor>());
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/code_template_test.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/code_template_test.dart
index 4802e4a..ebcdb94 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/data_driven/code_template_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/code_template_test.dart
@@ -2,6 +2,7 @@
 // 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/src/services/correction/fix/data_driven/accessor.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/code_template.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/parameter_reference.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/value_generator.dart';
@@ -65,7 +66,7 @@
 
   Future<void> _assertTemplateResult(
       String expectedResult, List<TemplateComponent> components) async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void f() {
   g(0, 1);
 }
@@ -90,6 +91,6 @@
 
   TemplateText _text(String text) => TemplateText(text);
 
-  TemplateVariable _variable(int index) =>
-      TemplateVariable(ArgumentExpression(PositionalParameterReference(index)));
+  TemplateVariable _variable(int index) => TemplateVariable(
+      CodeFragment([ArgumentAccessor(PositionalParameterReference(index))]));
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/data_driven_test_support.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/data_driven_test_support.dart
index fe452ec..39a4c16 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/data_driven/data_driven_test_support.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/data_driven_test_support.dart
@@ -10,6 +10,7 @@
 import 'package:analysis_server/src/services/correction/fix/data_driven/transform_set_manager.dart';
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/src/dart/error/hint_codes.dart';
+import 'package:analyzer/src/test_utilities/package_config_file_builder.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
 
 import '../fix_processor.dart';
@@ -26,7 +27,8 @@
   /// Add the file containing the data used by the data-driven fix with the
   /// given [content].
   void addPackageDataFile(String content) {
-    addPackageFile('p', TransformSetManager.dataFileName, content);
+    newFile('$workspaceRootPath/p/lib/${TransformSetManager.dataFileName}',
+        content: content);
   }
 
   /// Return a code template that will produce the given [text].
@@ -42,7 +44,11 @@
   /// Set the content of the library that defines the element referenced by the
   /// data on which this test is based.
   void setPackageContent(String content) {
-    addPackageFile('p', 'lib.dart', content);
+    newFile('$workspaceRootPath/p/lib/lib.dart', content: content);
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'p', rootPath: '$workspaceRootPath/p'),
+    );
   }
 
   /// Set the data on which this test is based.
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/conflicting_key_test.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/conflicting_key_test.dart
new file mode 100644
index 0000000..77d6de7
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/conflicting_key_test.dart
@@ -0,0 +1,52 @@
+// Copyright (c) 2020, 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/src/services/correction/fix/data_driven/transform_set_error_code.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../transform_set_parser_test_support.dart';
+
+void main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ConflictingKeyTest);
+  });
+}
+
+@reflectiveTest
+class ConflictingKeyTest extends AbstractTransformSetParserTest {
+  void test_element() {
+    assertErrors('''
+version: 1
+transforms:
+- title: ''
+  date: 2020-09-14
+  element:
+    uris: ['test.dart']
+    method: 'm'
+    class: 'C'
+  changes: []
+''', [
+      error(TransformSetErrorCode.missingOneOfMultipleKeys, 69, 53),
+      error(TransformSetErrorCode.conflictingKey, 109, 5),
+    ]);
+  }
+
+  void test_removeParameterChange() {
+    assertErrors('''
+version: 1
+transforms:
+- title: ''
+  date: 2020-09-14
+  element:
+    uris: ['test.dart']
+    function: 'f'
+  changes:
+    - kind: removeParameter
+      index: 2
+      name: 'p'
+''', [
+      error(TransformSetErrorCode.conflictingKey, 167, 4),
+    ]);
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/invalid_character_test.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/invalid_character_test.dart
new file mode 100644
index 0000000..ab3ece6
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/invalid_character_test.dart
@@ -0,0 +1,29 @@
+// Copyright (c) 2020, 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/src/services/correction/fix/data_driven/transform_set_error_code.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../code_fragment_parser_test.dart';
+
+void main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(InvalidCharacterTest);
+  });
+}
+
+@reflectiveTest
+class InvalidCharacterTest extends AbstractCodeFragmentParserTest {
+  void test_final() {
+    assertErrors('arguments;', [
+      error(TransformSetErrorCode.invalidCharacter, 9, 1),
+    ]);
+  }
+
+  void test_initial() {
+    assertErrors('{ some', [
+      error(TransformSetErrorCode.invalidCharacter, 0, 1),
+    ]);
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/invalid_key_test.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/invalid_key_test.dart
new file mode 100644
index 0000000..0a7c158
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/invalid_key_test.dart
@@ -0,0 +1,47 @@
+// Copyright (c) 2020, 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/src/services/correction/fix/data_driven/transform_set_error_code.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../transform_set_parser_test_support.dart';
+
+void main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(InvalidKeyTest);
+  });
+}
+
+@reflectiveTest
+class InvalidKeyTest extends AbstractTransformSetParserTest {
+  void test_integer() {
+    assertErrors('''
+3: 4
+version: 1
+transforms: []
+''', [
+      error(TransformSetErrorCode.invalidKey, 0, 1),
+    ]);
+  }
+
+  void test_list() {
+    assertErrors('''
+[]: 4
+version: 1
+transforms: []
+''', [
+      error(TransformSetErrorCode.invalidKey, 0, 2),
+    ]);
+  }
+
+  void test_map() {
+    assertErrors('''
+{}: 4
+version: 1
+transforms: []
+''', [
+      error(TransformSetErrorCode.invalidKey, 0, 2),
+    ]);
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/invalid_parameter_style_test.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/invalid_parameter_style_test.dart
new file mode 100644
index 0000000..0fe38db
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/invalid_parameter_style_test.dart
@@ -0,0 +1,39 @@
+// Copyright (c) 2020, 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/src/services/correction/fix/data_driven/transform_set_error_code.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../transform_set_parser_test_support.dart';
+
+void main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(InvalidParameterStyleTest);
+  });
+}
+
+@reflectiveTest
+class InvalidParameterStyleTest extends AbstractTransformSetParserTest {
+  void test_invalid() {
+    assertErrors('''
+version: 1
+transforms:
+- title: ''
+  date: 2020-09-14
+  element:
+    uris: ['test.dart']
+    method: 'm'
+    inClass: 'C'
+  changes:
+    - kind: addParameter
+      style: named
+      index: 0
+      name: 'p'
+      argumentValue:
+        expression: ''
+''', [
+      error(TransformSetErrorCode.invalidParameterStyle, 171, 5),
+    ]);
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/invalid_value_one_of_test.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/invalid_value_one_of_test.dart
index 2e606bb..fa9beb5 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/invalid_value_one_of_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/invalid_value_one_of_test.dart
@@ -27,7 +27,7 @@
   changes:
     - kind: 'invalid'
 ''', [
-      error(TransformSetErrorCode.invalidValueOneOf, 129, 16),
+      error(TransformSetErrorCode.invalidValueOneOf, 135, 9),
     ]);
   }
 
@@ -50,7 +50,7 @@
           x:
             kind: 'invalid'
 ''', [
-      error(TransformSetErrorCode.invalidValueOneOf, 274, 16),
+      error(TransformSetErrorCode.invalidValueOneOf, 280, 9),
     ]);
   }
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/missing_key_test.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/missing_key_test.dart
index 148f8a4..1237ba0 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/missing_key_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/missing_key_test.dart
@@ -128,10 +128,9 @@
     - kind: 'addTypeParameter'
       name: 'a'
       argumentValue:
-        kind: 'argument'
-        index: 0
+        expression: ''
 ''', [
-      error(TransformSetErrorCode.missingKey, 124, 104),
+      error(TransformSetErrorCode.missingKey, 124, 85),
     ]);
   }
 
@@ -148,10 +147,9 @@
     - kind: 'addTypeParameter'
       index: 0
       argumentValue:
-        kind: 'argument'
-        index: 0
+        expression: ''
 ''', [
-      error(TransformSetErrorCode.missingKey, 124, 103),
+      error(TransformSetErrorCode.missingKey, 124, 84),
     ]);
   }
 
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/missing_one_of_multiple_keys_test.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/missing_one_of_multiple_keys_test.dart
new file mode 100644
index 0000000..255767b
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/missing_one_of_multiple_keys_test.dart
@@ -0,0 +1,82 @@
+// Copyright (c) 2020, 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/src/services/correction/fix/data_driven/transform_set_error_code.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../transform_set_parser_test_support.dart';
+
+void main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(MissingOneOfMultipleKeysTest);
+  });
+}
+
+@reflectiveTest
+class MissingOneOfMultipleKeysTest extends AbstractTransformSetParserTest {
+  void test_codeTemplate() {
+    assertErrors('''
+version: 1
+transforms:
+- title: ''
+  date: 2020-09-14
+  element:
+    uris: ['test.dart']
+    function: 'f'
+  changes:
+    - kind: addTypeParameter
+      index: 0
+      name: 'T'
+      argumentValue:
+        variables: []
+''', [
+      error(TransformSetErrorCode.missingOneOfMultipleKeys, 207, 14),
+    ]);
+  }
+
+  void test_element() {
+    assertErrors('''
+version: 1
+transforms:
+- title: ''
+  date: 2020-09-14
+  element:
+    uris: ['test.dart']
+  changes: []
+''', [
+      error(TransformSetErrorCode.missingOneOfMultipleKeys, 69, 22),
+    ]);
+  }
+
+  void test_element_container() {
+    assertErrors('''
+version: 1
+transforms:
+- title: ''
+  date: 2020-09-14
+  element:
+    uris: ['test.dart']
+    method: 'm'
+  changes: []
+''', [
+      error(TransformSetErrorCode.missingOneOfMultipleKeys, 69, 38),
+    ]);
+  }
+
+  void test_removeParameterChange() {
+    assertErrors('''
+version: 1
+transforms:
+- title: ''
+  date: 2020-09-14
+  element:
+    uris: ['test.dart']
+    function: 'f'
+  changes:
+    - kind: removeParameter
+''', [
+      error(TransformSetErrorCode.missingOneOfMultipleKeys, 124, 22),
+    ]);
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/missing_token_test.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/missing_token_test.dart
new file mode 100644
index 0000000..ec8ac42
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/missing_token_test.dart
@@ -0,0 +1,47 @@
+// Copyright (c) 2020, 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/src/services/correction/fix/data_driven/transform_set_error_code.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../code_fragment_parser_test.dart';
+
+void main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(MissingTokenTest);
+  });
+}
+
+@reflectiveTest
+class MissingTokenTest extends AbstractCodeFragmentParserTest {
+  void test_closeBracket() {
+    assertErrors('arguments[2', [
+      error(TransformSetErrorCode.missingToken, 10, 1),
+    ]);
+  }
+
+  void test_identifier_afterPeriod() {
+    assertErrors('arguments[2].', [
+      error(TransformSetErrorCode.missingToken, 12, 1),
+    ]);
+  }
+
+  void test_identifier_initial() {
+    assertErrors('', [
+      error(TransformSetErrorCode.missingToken, 0, 0),
+    ]);
+  }
+
+  void test_index() {
+    assertErrors('arguments[', [
+      error(TransformSetErrorCode.missingToken, 9, 1),
+    ]);
+  }
+
+  void test_openBracket() {
+    assertErrors('arguments', [
+      error(TransformSetErrorCode.missingToken, 0, 9),
+    ]);
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/missing_uri_test.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/missing_uri_test.dart
new file mode 100644
index 0000000..ac21bfc
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/missing_uri_test.dart
@@ -0,0 +1,101 @@
+// Copyright (c) 2020, 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/src/services/correction/fix/data_driven/transform_set_error_code.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../transform_set_parser_test_support.dart';
+
+void main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(MissingUriTest);
+  });
+}
+
+@reflectiveTest
+class MissingUriTest extends AbstractTransformSetParserTest {
+  void test_element_empty() {
+    assertErrors('''
+version: 1
+transforms:
+- title: ''
+  date: 2020-09-14
+  element:
+    uris: []
+    method: 'm'
+    inClass: 'C'
+  changes: []
+''', [
+      error(TransformSetErrorCode.missingUri, 75, 2),
+    ]);
+  }
+
+  void test_element_nonEmpty() {
+    assertErrors('''
+version: 1
+transforms:
+- title: ''
+  date: 2020-09-14
+  element:
+    uris: [3]
+    method: 'm'
+    inClass: 'C'
+  changes: []
+''', [
+      error(TransformSetErrorCode.invalidValue, 76, 1),
+    ]);
+  }
+
+  void test_import_empty() {
+    assertErrors('''
+version: 1
+transforms:
+- title: ''
+  date: 2020-09-14
+  element:
+    uris: ['']
+    method: 'm'
+    inClass: 'C'
+  changes:
+    - kind: 'addTypeParameter'
+      index: 0
+      name: 'T'
+      argumentValue:
+        expression: ''
+        variables:
+          t:
+            kind: 'import'
+            uris: []
+            name: 'String'
+''', [
+      error(TransformSetErrorCode.missingUri, 307, 2),
+    ]);
+  }
+
+  void test_import_nonEmpty() {
+    assertErrors('''
+version: 1
+transforms:
+- title: ''
+  date: 2020-09-14
+  element:
+    uris: ['']
+    method: 'm'
+    inClass: 'C'
+  changes:
+    - kind: 'addTypeParameter'
+      index: 0
+      name: 'T'
+      argumentValue:
+        expression: ''
+        variables:
+          t:
+            kind: 'import'
+            uris: [3]
+            name: 'String'
+''', [
+      error(TransformSetErrorCode.invalidValue, 308, 1),
+    ]);
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/test_all.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/test_all.dart
index e8bbf94..651508b 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/test_all.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/test_all.dart
@@ -4,22 +4,42 @@
 
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import 'conflicting_key_test.dart' as conflicting_key;
+import 'invalid_character_test.dart' as invalid_character;
+import 'invalid_key_test.dart' as invalid_key;
+import 'invalid_parameter_style_test.dart' as invalid_parameter_style;
 import 'invalid_value_one_of_test.dart' as invalid_value_one_of;
 import 'invalid_value_test.dart' as invalid_value;
 import 'missing_key_test.dart' as missing_key;
+import 'missing_one_of_multiple_keys_test.dart' as missing_one_of_multiple_keys;
 import 'missing_template_end_test.dart' as missing_template_end;
+import 'missing_token_test.dart' as missing_token;
+import 'missing_uri_test.dart' as missing_uri;
 import 'undefined_variable_test.dart' as undefined_variable;
+import 'unknown_accessor_test.dart' as unknown_accessor;
 import 'unsupported_key_test.dart' as unsupported_key;
+import 'unsupported_version_test.dart' as unsupported_version;
+import 'wrong_token_test.dart' as wrong_token;
 import 'yaml_syntax_error_test.dart' as yaml_syntax_error;
 
 void main() {
   defineReflectiveSuite(() {
+    conflicting_key.main();
+    invalid_character.main();
+    invalid_key.main();
+    invalid_parameter_style.main();
     invalid_value_one_of.main();
     invalid_value.main();
     missing_key.main();
+    missing_one_of_multiple_keys.main();
     missing_template_end.main();
+    missing_token.main();
+    missing_uri.main();
     undefined_variable.main();
+    unknown_accessor.main();
     unsupported_key.main();
+    unsupported_version.main();
+    wrong_token.main();
     yaml_syntax_error.main();
   });
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/undefined_variable_test.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/undefined_variable_test.dart
index 19334c8..db854a5 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/undefined_variable_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/undefined_variable_test.dart
@@ -33,8 +33,8 @@
         expression: '{%xyz%}'
         variables:
           zyx:
-            kind: 'argument'
-            index: 0
+            kind: 'fragment'
+            value: 'arguments[0]'
 ''', [
       error(TransformSetErrorCode.undefinedVariable, 253, 3),
     ]);
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/unknown_accessor_test.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/unknown_accessor_test.dart
new file mode 100644
index 0000000..205ad42
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/unknown_accessor_test.dart
@@ -0,0 +1,29 @@
+// Copyright (c) 2020, 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/src/services/correction/fix/data_driven/transform_set_error_code.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../code_fragment_parser_test.dart';
+
+void main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(UnknownAccessorTest);
+  });
+}
+
+@reflectiveTest
+class UnknownAccessorTest extends AbstractCodeFragmentParserTest {
+  void test_afterPeriod() {
+    assertErrors('arguments[0].argument[1]', [
+      error(TransformSetErrorCode.unknownAccessor, 13, 8),
+    ]);
+  }
+
+  void test_initial() {
+    assertErrors('argument[0]', [
+      error(TransformSetErrorCode.unknownAccessor, 0, 8),
+    ]);
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/unsupported_version_test.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/unsupported_version_test.dart
new file mode 100644
index 0000000..606341f
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/unsupported_version_test.dart
@@ -0,0 +1,38 @@
+// Copyright (c) 2020, 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/src/services/correction/fix/data_driven/transform_set_error_code.dart';
+import 'package:analysis_server/src/services/correction/fix/data_driven/transform_set_parser.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../transform_set_parser_test_support.dart';
+
+void main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(UnsupportedVersionTest);
+  });
+}
+
+@reflectiveTest
+class UnsupportedVersionTest extends AbstractTransformSetParserTest {
+  void test_tooHigh() {
+    var version = (TransformSetParser.currentVersion + 1).toString();
+    assertErrors('''
+version: $version
+transforms: []
+''', [
+      error(TransformSetErrorCode.unsupportedVersion, 9, version.length),
+    ]);
+  }
+
+  void test_tooLow() {
+    var version = (TransformSetParser.oldestVersion - 1).toString();
+    assertErrors('''
+version: $version
+transforms: []
+''', [
+      error(TransformSetErrorCode.unsupportedVersion, 9, 1),
+    ]);
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/wrong_token_test.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/wrong_token_test.dart
new file mode 100644
index 0000000..a047759
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/wrong_token_test.dart
@@ -0,0 +1,53 @@
+// Copyright (c) 2020, 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/src/services/correction/fix/data_driven/transform_set_error_code.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../code_fragment_parser_test.dart';
+
+void main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(MissingTokenTest);
+  });
+}
+
+@reflectiveTest
+class MissingTokenTest extends AbstractCodeFragmentParserTest {
+  void test_closeBracket() {
+    assertErrors('arguments[2 3', [
+      error(TransformSetErrorCode.wrongToken, 12, 1),
+    ]);
+  }
+
+  void test_identifier_afterPeriod() {
+    assertErrors('arguments[2].1', [
+      error(TransformSetErrorCode.wrongToken, 13, 1),
+    ]);
+  }
+
+  void test_identifier_initial() {
+    assertErrors('1', [
+      error(TransformSetErrorCode.wrongToken, 0, 1),
+    ]);
+  }
+
+  void test_index() {
+    assertErrors('arguments[.', [
+      error(TransformSetErrorCode.wrongToken, 10, 1),
+    ]);
+  }
+
+  void test_openBracket() {
+    assertErrors('arguments.', [
+      error(TransformSetErrorCode.wrongToken, 9, 1),
+    ]);
+  }
+
+  void test_period() {
+    assertErrors('arguments[2] typeArguments', [
+      error(TransformSetErrorCode.wrongToken, 13, 13),
+    ]);
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/end_to_end_test.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/end_to_end_test.dart
index aad57fa..eb13dcf 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/data_driven/end_to_end_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/end_to_end_test.dart
@@ -38,10 +38,10 @@
         expression: '{% y %}'
         variables:
           y:
-            kind: 'argument'
-            index: 0
+            kind: 'fragment'
+            value: 'arguments[0]'
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 
 void f(C c) {
@@ -81,10 +81,10 @@
         expression: '{% t %}'
         variables:
           t:
-            kind: 'argument'
-            index: 0
+            kind: 'fragment'
+            value: 'arguments[0]'
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 
 void f(C c) {
@@ -119,7 +119,7 @@
     - kind: 'removeParameter'
       index: 1
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 
 void f(C c) {
@@ -152,7 +152,7 @@
     - kind: 'rename'
       newName: 'New'
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 
 void f(Old o) {}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/flutter_use_case_test.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/flutter_use_case_test.dart
new file mode 100644
index 0000000..2e53eb1
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/flutter_use_case_test.dart
@@ -0,0 +1,2264 @@
+// Copyright (c) 2020, 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:test_reflective_loader/test_reflective_loader.dart';
+
+import 'data_driven_test_support.dart';
+
+void main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(FlutterUseCaseTest);
+  });
+}
+
+@reflectiveTest
+class FlutterUseCaseTest extends DataDrivenFixProcessorTest {
+  @failingTest
+  Future<void>
+      test_cupertino_CupertinoDialog_toCupertinoAlertDialog_deprecated() async {
+    // This test fails because we don't rename the parameter to the constructor.
+    setPackageContent('''
+@deprecated
+class CupertinoDialog {
+  CupertinoDialog({String child}) {}
+}
+class CupertinoAlertDialog {
+  CupertinoAlertDialog({String content}) {}
+}
+''');
+    addPackageDataFile('''
+version: 1
+transforms:
+  - title:  'Replace with CupertinoAlertDialog'
+    date: 2020-09-24
+    bulkApply: false
+    element:
+      uris: ['$importUri']
+      class: 'CupertinoDialog'
+    changes:
+      - kind: 'rename'
+        newName: 'CupertinoAlertDialog'
+      - kind: 'renameParameter'
+        oldName: 'child'
+        newName: 'content'
+''');
+    await resolveTestCode('''
+import '$importUri';
+
+void f() {
+  CupertinoDialog(child: 'x');
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+
+void f() {
+  CupertinoAlertDialog(content: 'x');
+}
+''');
+  }
+
+  @failingTest
+  Future<void>
+      test_cupertino_CupertinoDialog_toCupertinoAlertDialog_removed() async {
+    // This test fails because we don't rename the parameter to the constructor.
+    setPackageContent('''
+class CupertinoAlertDialog {
+  CupertinoAlertDialog({String content}) {}
+}
+''');
+    addPackageDataFile('''
+version: 1
+transforms:
+  - title:  'Replace with CupertinoAlertDialog'
+    date: 2020-09-24
+    bulkApply: false
+    element:
+      uris: ['$importUri']
+      class: 'CupertinoDialog'
+    changes:
+      - kind: 'rename'
+        newName: 'CupertinoAlertDialog'
+      - kind: 'renameParameter'
+        oldName: 'child'
+        newName: 'content'
+''');
+    await resolveTestCode('''
+import '$importUri';
+
+void f() {
+  CupertinoDialog(child: 'x');
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+
+void f() {
+  CupertinoAlertDialog(content: 'x');
+}
+''', errorFilter: ignoreUnusedImport);
+  }
+
+  Future<void>
+      test_cupertino_CupertinoDialog_toCupertinoPopupSurface_deprecated() async {
+    setPackageContent('''
+@deprecated
+class CupertinoDialog {
+  CupertinoDialog({String child}) {}
+}
+class CupertinoPopupSurface {
+  CupertinoPopupSurface({String content}) {}
+}
+''');
+    addPackageDataFile('''
+version: 1
+transforms:
+  - title: 'Replace with CupertinoPopupSurface'
+    date: 2020-09-24
+    bulkApply: false
+    element:
+      uris: ['$importUri']
+      class: 'CupertinoDialog'
+    changes:
+      - kind: 'rename'
+        newName: 'CupertinoPopupSurface'
+''');
+    await resolveTestCode('''
+import '$importUri';
+
+void f() {
+  CupertinoDialog(child: 'x');
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+
+void f() {
+  CupertinoPopupSurface(child: 'x');
+}
+''');
+  }
+
+  Future<void>
+      test_cupertino_CupertinoDialog_toCupertinoPopupSurface_removed() async {
+    setPackageContent('''
+class CupertinoPopupSurface {
+  CupertinoPopupSurface({String content}) {}
+}
+''');
+    addPackageDataFile('''
+version: 1
+transforms:
+  - title: 'Replace with CupertinoPopupSurface'
+    date: 2020-09-24
+    bulkApply: false
+    element:
+      uris: ['$importUri']
+      class: 'CupertinoDialog'
+    changes:
+      - kind: 'rename'
+        newName: 'CupertinoPopupSurface'
+''');
+    await resolveTestCode('''
+import '$importUri';
+
+void f() {
+  CupertinoDialog(child: 'x');
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+
+void f() {
+  CupertinoPopupSurface(child: 'x');
+}
+''', errorFilter: ignoreUnusedImport);
+  }
+
+  Future<void>
+      test_cupertino_CupertinoTextThemeData_copyWith_deprecated() async {
+    setPackageContent('''
+class CupertinoTextThemeData {
+  copyWith({Color color, @deprecated Brightness brightness}) {}
+}
+class Color {}
+class Colors {
+  static Color blue = Color();
+}
+class Brightness {
+  static Brightness dark = Brightness();
+}
+''');
+    addPackageDataFile('''
+version: 1
+transforms:
+  - title: 'Removed brightness'
+    date: 2020-09-24
+    element:
+      uris: ['$importUri']
+      method: 'copyWith'
+      inClass: 'CupertinoTextThemeData'
+    changes:
+      - kind: 'removeParameter'
+        name: 'brightness'
+''');
+    await resolveTestCode('''
+import '$importUri';
+
+void f(CupertinoTextThemeData data) {
+  data.copyWith(color: Colors.blue, brightness: Brightness.dark);
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+
+void f(CupertinoTextThemeData data) {
+  data.copyWith(color: Colors.blue);
+}
+''');
+  }
+
+  Future<void> test_cupertino_CupertinoTextThemeData_copyWith_removed() async {
+    setPackageContent('''
+class CupertinoTextThemeData {
+  copyWith({Color color}) {}
+}
+class Color {}
+class Colors {
+  static Color blue = Color();
+}
+class Brightness {
+  static Brightness dark = Brightness();
+}
+''');
+    addPackageDataFile('''
+version: 1
+transforms:
+  - title: 'Removed brightness'
+    date: 2020-09-24
+    element:
+      uris: ['$importUri']
+      method: 'copyWith'
+      inClass: 'CupertinoTextThemeData'
+    changes:
+      - kind: 'removeParameter'
+        name: 'brightness'
+''');
+    await resolveTestCode('''
+import '$importUri';
+
+void f(CupertinoTextThemeData data) {
+  data.copyWith(color: Colors.blue, brightness: Brightness.dark);
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+
+void f(CupertinoTextThemeData data) {
+  data.copyWith(color: Colors.blue);
+}
+''');
+  }
+
+  Future<void>
+      test_cupertino_CupertinoTextThemeData_defaultConstructor_deprecated() async {
+    setPackageContent('''
+class CupertinoTextThemeData {
+  CupertinoTextThemeData({Color color, @deprecated Brightness brightness}) {}
+}
+class Color {}
+class Colors {
+  static Color blue = Color();
+}
+class Brightness {
+  static Brightness dark = Brightness();
+}
+''');
+    addPackageDataFile('''
+version: 1
+transforms:
+  - title: 'Removed brightness'
+    date: 2020-09-24
+    element:
+      uris: ['$importUri']
+      constructor: ''
+      inClass: 'CupertinoTextThemeData'
+    changes:
+      - kind: 'removeParameter'
+        name: 'brightness'
+''');
+    await resolveTestCode('''
+import '$importUri';
+
+void f() {
+  CupertinoTextThemeData(color: Colors.blue, brightness: Brightness.dark);
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+
+void f() {
+  CupertinoTextThemeData(color: Colors.blue);
+}
+''');
+  }
+
+  Future<void>
+      test_cupertino_CupertinoTextThemeData_defaultConstructor_removed() async {
+    setPackageContent('''
+class CupertinoTextThemeData {
+  CupertinoTextThemeData({Color color}) {}
+}
+class Color {}
+class Colors {
+  static Color blue = Color();
+}
+class Brightness {
+  static Brightness dark = Brightness();
+}
+''');
+    addPackageDataFile('''
+version: 1
+transforms:
+  - title: 'Removed brightness'
+    date: 2020-09-24
+    element:
+      uris: ['$importUri']
+      constructor: ''
+      inClass: 'CupertinoTextThemeData'
+    changes:
+      - kind: 'removeParameter'
+        name: 'brightness'
+''');
+    await resolveTestCode('''
+import '$importUri';
+
+void f() {
+  CupertinoTextThemeData(color: Colors.blue, brightness: Brightness.dark);
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+
+void f() {
+  CupertinoTextThemeData(color: Colors.blue);
+}
+''');
+  }
+
+  Future<void>
+      test_gestures_PointerEnterEvent_fromHoverEvent_deprecated() async {
+    setPackageContent('''
+class PointerEnterEvent {
+  @deprecated
+  PointerEnterEvent.fromHoverEvent(PointerHoverEvent event);
+  PointerEnterEvent.fromMouseEvent(PointerEvent event);
+}
+class PointerHoverEvent extends PointerEvent {}
+class PointerEvent {}
+''');
+    addPackageDataFile('''
+version: 1
+transforms:
+  - title: 'Rename to fromMouseEvent'
+    date: 2020-09-24
+    element:
+      uris: ['$importUri']
+      constructor: 'fromHoverEvent'
+      inClass: 'PointerEnterEvent'
+    changes:
+      - kind: 'rename'
+        newName: 'fromMouseEvent'
+''');
+    await resolveTestCode('''
+import '$importUri';
+
+void f(PointerHoverEvent event) {
+  PointerEnterEvent.fromHoverEvent(event);
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+
+void f(PointerHoverEvent event) {
+  PointerEnterEvent.fromMouseEvent(event);
+}
+''');
+  }
+
+  Future<void> test_gestures_PointerEnterEvent_fromHoverEvent_removed() async {
+    setPackageContent('''
+class PointerEnterEvent {
+  PointerEnterEvent.fromMouseEvent(PointerEvent event);
+}
+class PointerHoverEvent extends PointerEvent {}
+class PointerEvent {}
+''');
+    addPackageDataFile('''
+version: 1
+transforms:
+  - title: 'Rename to fromMouseEvent'
+    date: 2020-09-24
+    element:
+      uris: ['$importUri']
+      constructor: 'fromHoverEvent'
+      inClass: 'PointerEnterEvent'
+    changes:
+      - kind: 'rename'
+        newName: 'fromMouseEvent'
+''');
+    await resolveTestCode('''
+import '$importUri';
+
+void f(PointerHoverEvent event) {
+  PointerEnterEvent.fromHoverEvent(event);
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+
+void f(PointerHoverEvent event) {
+  PointerEnterEvent.fromMouseEvent(event);
+}
+''');
+  }
+
+  Future<void>
+      test_gestures_PointerExitEvent_fromHoverEvent_deprecated() async {
+    setPackageContent('''
+class PointerExitEvent {
+  @deprecated
+  PointerExitEvent.fromHoverEvent(PointerHoverEvent event);
+  PointerExitEvent.fromMouseEvent(PointerEvent event);
+}
+class PointerHoverEvent extends PointerEvent {}
+class PointerEvent {}
+''');
+    addPackageDataFile('''
+version: 1
+transforms:
+  - title: 'Rename to fromMouseEvent'
+    date: 2020-09-24
+    element:
+      uris: ['$importUri']
+      constructor: 'fromHoverEvent'
+      inClass: 'PointerExitEvent'
+    changes:
+      - kind: 'rename'
+        newName: 'fromMouseEvent'
+''');
+    await resolveTestCode('''
+import '$importUri';
+
+void f(PointerHoverEvent event) {
+  PointerExitEvent.fromHoverEvent(event);
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+
+void f(PointerHoverEvent event) {
+  PointerExitEvent.fromMouseEvent(event);
+}
+''');
+  }
+
+  Future<void> test_gestures_PointerExitEvent_fromHoverEvent_removed() async {
+    setPackageContent('''
+class PointerExitEvent {
+  PointerExitEvent.fromMouseEvent(PointerEvent event);
+}
+class PointerHoverEvent extends PointerEvent {}
+class PointerEvent {}
+''');
+    addPackageDataFile('''
+version: 1
+transforms:
+  - title: 'Rename to fromMouseEvent'
+    date: 2020-09-24
+    element:
+      uris: ['$importUri']
+      constructor: 'fromHoverEvent'
+      inClass: 'PointerExitEvent'
+    changes:
+      - kind: 'rename'
+        newName: 'fromMouseEvent'
+''');
+    await resolveTestCode('''
+import '$importUri';
+
+void f(PointerHoverEvent event) {
+  PointerExitEvent.fromHoverEvent(event);
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+
+void f(PointerHoverEvent event) {
+  PointerExitEvent.fromMouseEvent(event);
+}
+''');
+  }
+
+  Future<void>
+      test_material_BottomNavigationBarItem_unnamedConstructor_deprecated() async {
+    setPackageContent('''
+class BottomNavigationBarItem {
+  BottomNavigationBarItem({String label, @deprecated Text title});
+}
+class Text {
+  Text(String text);
+}
+''');
+    addPackageDataFile('''
+version: 1
+transforms:
+  - title: 'Replaced title with label'
+    date: 2020-09-24
+    element:
+      uris: ['$importUri']
+      constructor: ''
+      inClass: 'BottomNavigationBarItem'
+    changes:
+      - kind: 'addParameter'
+        index: 0
+        name: 'label'
+        style: required_named
+        argumentValue:
+          expression: '{% label %}'
+          variables:
+            label:
+              kind: fragment
+              value: 'arguments[title].arguments[0]'
+      - kind: 'removeParameter'
+        name: 'title'
+''');
+    await resolveTestCode('''
+import '$importUri';
+
+void f() {
+  BottomNavigationBarItem(title: Text('x'));
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+
+void f() {
+  BottomNavigationBarItem(label: 'x');
+}
+''');
+  }
+
+  Future<void>
+      test_material_BottomNavigationBarItem_unnamedConstructor_removed() async {
+    setPackageContent('''
+class BottomNavigationBarItem {
+  BottomNavigationBarItem({String label});
+}
+class Text {
+  Text(String text);
+}
+''');
+    addPackageDataFile('''
+version: 1
+transforms:
+  - title: 'Replaced title with label'
+    date: 2020-09-24
+    element:
+      uris: ['$importUri']
+      constructor: ''
+      inClass: 'BottomNavigationBarItem'
+    changes:
+      - kind: 'addParameter'
+        index: 0
+        name: 'label'
+        style: required_named
+        argumentValue:
+          expression: '{% label %}'
+          variables:
+            label:
+              kind: fragment
+              value: 'arguments[title].arguments[0]'
+      - kind: 'removeParameter'
+        name: 'title'
+''');
+    await resolveTestCode('''
+import '$importUri';
+
+void f() {
+  BottomNavigationBarItem(title: Text('x'));
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+
+void f() {
+  BottomNavigationBarItem(label: 'x');
+}
+''');
+  }
+
+  Future<void>
+      test_material_Scaffold_resizeToAvoidBottomPadding_deprecated() async {
+    setPackageContent('''
+class Scaffold {
+  @deprecated
+  bool resizeToAvoidBottomPadding;
+  bool resizeToAvoidBottomInset;
+}
+''');
+    addPackageDataFile('''
+version: 1
+transforms:
+  - title: 'Rename to resizeToAvoidBottomInset'
+    date: 2020-09-14
+    element:
+      uris: ['$importUri']
+      field: 'resizeToAvoidBottomPadding'
+      inClass: 'Scaffold'
+    changes:
+      - kind: 'rename'
+        newName: 'resizeToAvoidBottomInset'
+''');
+    await resolveTestCode('''
+import '$importUri';
+
+void f(Scaffold scaffold) {
+  scaffold.resizeToAvoidBottomPadding;
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+
+void f(Scaffold scaffold) {
+  scaffold.resizeToAvoidBottomInset;
+}
+''');
+  }
+
+  Future<void>
+      test_material_Scaffold_resizeToAvoidBottomPadding_removed() async {
+    setPackageContent('''
+class Scaffold {
+  bool resizeToAvoidBottomInset;
+}
+''');
+    addPackageDataFile('''
+version: 1
+transforms:
+  - title: 'Rename to resizeToAvoidBottomInset'
+    date: 2020-09-14
+    element:
+      uris: ['$importUri']
+      field: 'resizeToAvoidBottomPadding'
+      inClass: 'Scaffold'
+    changes:
+      - kind: 'rename'
+        newName: 'resizeToAvoidBottomInset'
+''');
+    await resolveTestCode('''
+import '$importUri';
+
+void f(Scaffold scaffold) {
+  scaffold.resizeToAvoidBottomPadding;
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+
+void f(Scaffold scaffold) {
+  scaffold.resizeToAvoidBottomInset;
+}
+''');
+  }
+
+  @failingTest
+  Future<void> test_material_showDialog_deprecated() async {
+    // This test is failing because there is no way to specify that if a `child`
+    // was previously provided that a `builder` should be provided.
+    setPackageContent('''
+void showDialog({
+  @deprecated Widget child,
+  Widget Function(BuildContext) builder}) {}
+
+class Widget {}
+class BuildContext {}
+''');
+    addPackageDataFile('''
+version: 1
+transforms:
+  - title: 'Replace child with builder'
+    date: 2020-09-24
+    element:
+      uris: ['$importUri']
+      function: 'showDialog'
+    changes:
+      - kind: 'addParameter'
+        index: 0
+        name: 'builder'
+        style: optional_named
+        argumentValue:
+          expression: '(context) => {% widget %}'
+          variables:
+            widget:
+              kind: argument
+              name: 'child'
+      - kind: 'removeParameter'
+        name: 'child'
+''');
+    await resolveTestCode('''
+import '$importUri';
+
+void f(Widget widget) {
+  showDialog(child: widget);
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+
+void f(Widget widget) {
+  showDialog(builder: (context) => widget);
+}
+''');
+  }
+
+  @failingTest
+  Future<void> test_material_showDialog_removed() async {
+    // This test is failing because there is no way to specify that if a `child`
+    // was previously provided that a `builder` should be provided.
+    setPackageContent('''
+void showDialog({
+  @deprecated Widget child,
+  Widget Function(BuildContext) builder}) {}
+
+class Widget {}
+class BuildContext {}
+''');
+    addPackageDataFile('''
+version: 1
+transforms:
+  - title: 'Replace child with builder'
+    date: 2020-09-24
+    element:
+      uris: ['$importUri']
+      function: 'showDialog'
+    changes:
+      - kind: 'addParameter'
+        index: 0
+        name: 'builder'
+        style: optional_named
+        argumentValue:
+          expression: '(context) => {% widget %}'
+          variables:
+            widget:
+              kind: argument
+              name: 'child'
+      - kind: 'removeParameter'
+        name: 'child'
+''');
+    await resolveTestCode('''
+import '$importUri';
+
+void f(Widget widget) {
+  showDialog(child: widget);
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+
+void f(Widget widget) {
+  showDialog(builder: (context) => widget);
+}
+''');
+  }
+
+  Future<void> test_material_TextTheme_copyWith_deprecated() async {
+    setPackageContent('''
+class TextTheme {
+  TextTheme copyWith({TextStyle headline1, TextStyle headline2,
+  TextStyle headline3, TextStyle headline4, TextStyle headline5,
+  TextStyle headline6, TextStyle subtitle1, TextStyle subtitle2,
+  TextStyle bodyText1, TextStyle bodyText2, TextStyle caption,
+  TextStyle button, TextStyle overline,
+  @deprecated TextStyle display4, @deprecated TextStyle display3,
+  @deprecated TextStyle display2, @deprecated TextStyle display1,
+  @deprecated TextStyle headline, @deprecated TextStyle title,
+  @deprecated TextStyle subhead, @deprecated TextStyle subtitle,
+  @deprecated TextStyle body2, @deprecated TextStyle body1}) {}
+}
+class TextStyle {}
+''');
+    addPackageDataFile('''
+version: 1
+transforms:
+  - title: 'Rename arguments'
+    date: 2020-09-24
+    element:
+      uris: ['$importUri']
+      method: 'copyWith'
+      inClass: 'TextTheme'
+    changes:
+      - kind: 'renameParameter'
+        oldName: 'display4'
+        newName: 'headline1'
+      - kind: 'renameParameter'
+        oldName: 'display3'
+        newName: 'headline2'
+      - kind: 'renameParameter'
+        oldName: 'display2'
+        newName: 'headline3'
+      - kind: 'renameParameter'
+        oldName: 'display1'
+        newName: 'headline4'
+      - kind: 'renameParameter'
+        oldName: 'headline'
+        newName: 'headline5'
+      - kind: 'renameParameter'
+        oldName: 'title'
+        newName: 'headline6'
+      - kind: 'renameParameter'
+        oldName: 'subhead'
+        newName: 'subtitle1'
+      - kind: 'renameParameter'
+        oldName: 'subtitle'
+        newName: 'subtitle2'
+      - kind: 'renameParameter'
+        oldName: 'body2'
+        newName: 'bodytext1'
+      - kind: 'renameParameter'
+        oldName: 'body1'
+        newName: 'bodytext2'
+''');
+    await resolveTestCode('''
+import '$importUri';
+
+void f(TextTheme t, TextStyle s) {
+  t.copyWith(display2: s);
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+
+void f(TextTheme t, TextStyle s) {
+  t.copyWith(headline3: s);
+}
+''');
+  }
+
+  Future<void> test_material_TextTheme_copyWith_removed() async {
+    setPackageContent('''
+class TextTheme {
+  TextTheme copyWith({TextStyle headline1, TextStyle headline2,
+  TextStyle headline3, TextStyle headline4, TextStyle headline5,
+  TextStyle headline6, TextStyle subtitle1, TextStyle subtitle2,
+  TextStyle bodyText1, TextStyle bodyText2, TextStyle caption,
+  TextStyle button, TextStyle overline}) {}
+}
+class TextStyle {}
+''');
+    addPackageDataFile('''
+version: 1
+transforms:
+  - title: 'Rename arguments'
+    date: 2020-09-24
+    element:
+      uris: ['$importUri']
+      method: 'copyWith'
+      inClass: 'TextTheme'
+    changes:
+      - kind: 'renameParameter'
+        oldName: 'display4'
+        newName: 'headline1'
+      - kind: 'renameParameter'
+        oldName: 'display3'
+        newName: 'headline2'
+      - kind: 'renameParameter'
+        oldName: 'display2'
+        newName: 'headline3'
+      - kind: 'renameParameter'
+        oldName: 'display1'
+        newName: 'headline4'
+      - kind: 'renameParameter'
+        oldName: 'headline'
+        newName: 'headline5'
+      - kind: 'renameParameter'
+        oldName: 'title'
+        newName: 'headline6'
+      - kind: 'renameParameter'
+        oldName: 'subhead'
+        newName: 'subtitle1'
+      - kind: 'renameParameter'
+        oldName: 'subtitle'
+        newName: 'subtitle2'
+      - kind: 'renameParameter'
+        oldName: 'body2'
+        newName: 'bodytext1'
+      - kind: 'renameParameter'
+        oldName: 'body1'
+        newName: 'bodytext2'
+''');
+    await resolveTestCode('''
+import '$importUri';
+
+void f(TextTheme t, TextStyle s) {
+  t.copyWith(subtitle: s);
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+
+void f(TextTheme t, TextStyle s) {
+  t.copyWith(subtitle2: s);
+}
+''');
+  }
+
+  Future<void> test_material_TextTheme_defaultConstructor_deprecated() async {
+    setPackageContent('''
+class TextTheme {
+  TextTheme({TextStyle headline1, TextStyle headline2, TextStyle headline3,
+  TextStyle headline4, TextStyle headline5, TextStyle headline6,
+  TextStyle subtitle1, TextStyle subtitle2, TextStyle bodyText1,
+  TextStyle bodyText2, TextStyle caption, TextStyle button, TextStyle overline,
+  @deprecated TextStyle display4, @deprecated TextStyle display3,
+  @deprecated TextStyle display2, @deprecated TextStyle display1,
+  @deprecated TextStyle headline, @deprecated TextStyle title,
+  @deprecated TextStyle subhead, @deprecated TextStyle subtitle,
+  @deprecated TextStyle body2, @deprecated TextStyle body1}) {}
+}
+class TextStyle {}
+''');
+    addPackageDataFile('''
+version: 1
+transforms:
+  - title: 'Rename arguments'
+    date: 2020-09-24
+    element:
+      uris: ['$importUri']
+      constructor: ''
+      inClass: 'TextTheme'
+    changes:
+      - kind: 'renameParameter'
+        oldName: 'display4'
+        newName: 'headline1'
+      - kind: 'renameParameter'
+        oldName: 'display3'
+        newName: 'headline2'
+      - kind: 'renameParameter'
+        oldName: 'display2'
+        newName: 'headline3'
+      - kind: 'renameParameter'
+        oldName: 'display1'
+        newName: 'headline4'
+      - kind: 'renameParameter'
+        oldName: 'headline'
+        newName: 'headline5'
+      - kind: 'renameParameter'
+        oldName: 'title'
+        newName: 'headline6'
+      - kind: 'renameParameter'
+        oldName: 'subhead'
+        newName: 'subtitle1'
+      - kind: 'renameParameter'
+        oldName: 'subtitle'
+        newName: 'subtitle2'
+      - kind: 'renameParameter'
+        oldName: 'body2'
+        newName: 'bodytext1'
+      - kind: 'renameParameter'
+        oldName: 'body1'
+        newName: 'bodytext2'
+''');
+    await resolveTestCode('''
+import '$importUri';
+
+void f(TextStyle s) {
+  TextTheme(display4: s);
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+
+void f(TextStyle s) {
+  TextTheme(headline1: s);
+}
+''');
+  }
+
+  Future<void> test_material_TextTheme_defaultConstructor_removed() async {
+    setPackageContent('''
+class TextTheme {
+  TextTheme({TextStyle headline1, TextStyle headline2, TextStyle headline3,
+  TextStyle headline4, TextStyle headline5, TextStyle headline6,
+  TextStyle subtitle1, TextStyle subtitle2, TextStyle bodyText1,
+  TextStyle bodyText2, TextStyle caption, TextStyle button, TextStyle overline,
+  }) {}
+}
+class TextStyle {}
+''');
+    addPackageDataFile('''
+version: 1
+transforms:
+  - title: 'Rename arguments'
+    date: 2020-09-24
+    element:
+      uris: ['$importUri']
+      constructor: ''
+      inClass: 'TextTheme'
+    changes:
+      - kind: 'renameParameter'
+        oldName: 'display4'
+        newName: 'headline1'
+      - kind: 'renameParameter'
+        oldName: 'display3'
+        newName: 'headline2'
+      - kind: 'renameParameter'
+        oldName: 'display2'
+        newName: 'headline3'
+      - kind: 'renameParameter'
+        oldName: 'display1'
+        newName: 'headline4'
+      - kind: 'renameParameter'
+        oldName: 'headline'
+        newName: 'headline5'
+      - kind: 'renameParameter'
+        oldName: 'title'
+        newName: 'headline6'
+      - kind: 'renameParameter'
+        oldName: 'subhead'
+        newName: 'subtitle1'
+      - kind: 'renameParameter'
+        oldName: 'subtitle'
+        newName: 'subtitle2'
+      - kind: 'renameParameter'
+        oldName: 'body2'
+        newName: 'bodytext1'
+      - kind: 'renameParameter'
+        oldName: 'body1'
+        newName: 'bodytext2'
+''');
+    await resolveTestCode('''
+import '$importUri';
+
+void f(TextStyle s) {
+  TextTheme(display3: s);
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+
+void f(TextStyle s) {
+  TextTheme(headline2: s);
+}
+''');
+  }
+
+  Future<void> test_material_TextTheme_display4_deprecated() async {
+    setPackageContent('''
+class TextTheme {
+  @deprecated
+  int get display4 => 0;
+  int get headline1 => 0;
+}
+''');
+    addPackageDataFile('''
+version: 1
+transforms:
+  - title: 'Rename to headline1'
+    date: 2020-09-24
+    element:
+      uris: ['$importUri']
+      getter: display4
+      inClass: 'TextTheme'
+    changes:
+      - kind: 'rename'
+        newName: 'headline1'
+''');
+    await resolveTestCode('''
+import '$importUri';
+
+void f(TextTheme theme) {
+  theme.display4;
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+
+void f(TextTheme theme) {
+  theme.headline1;
+}
+''');
+  }
+
+  Future<void> test_material_TextTheme_display4_removed() async {
+    setPackageContent('''
+class TextTheme {
+  int get headline1 => 0;
+}
+''');
+    addPackageDataFile('''
+version: 1
+transforms:
+  - title: 'Rename to headline1'
+    date: 2020-09-24
+    element:
+      uris: ['$importUri']
+      getter: display4
+      inClass: 'TextTheme'
+    changes:
+      - kind: 'rename'
+        newName: 'headline1'
+''');
+    await resolveTestCode('''
+import '$importUri';
+
+void f(TextTheme theme) {
+  theme.display4;
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+
+void f(TextTheme theme) {
+  theme.headline1;
+}
+''');
+  }
+
+  Future<void> test_material_Typography_defaultConstructor_deprecated() async {
+    setPackageContent('''
+class Typography {
+  @deprecated
+  Typography();
+  Typography.material2014();
+}
+''');
+    addPackageDataFile('''
+version: 1
+transforms:
+  - title: 'Use Typography.material2014'
+    date: 2020-09-24
+    element:
+      uris: ['$importUri']
+      constructor: ''
+      inClass: 'Typography'
+    changes:
+      - kind: 'rename'
+        newName: 'material2014'
+''');
+    await resolveTestCode('''
+import '$importUri';
+
+void f() {
+  Typography();
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+
+void f() {
+  Typography.material2014();
+}
+''');
+  }
+
+  Future<void> test_material_Typography_defaultConstructor_removed() async {
+    setPackageContent('''
+class Typography {
+  Typography.material2014();
+}
+''');
+    addPackageDataFile('''
+version: 1
+transforms:
+  - title: 'Use Typography.material2014'
+    date: 2020-09-24
+    element:
+      uris: ['$importUri']
+      constructor: ''
+      inClass: 'Typography'
+    changes:
+      - kind: 'rename'
+        newName: 'material2014'
+''');
+    await resolveTestCode('''
+import '$importUri';
+
+void f() {
+  Typography();
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+
+void f() {
+  Typography.material2014();
+}
+''');
+  }
+
+  Future<void>
+      test_widgets_BuildContext_ancestorInheritedElementForWidgetOfExactType_deprecated() async {
+    setPackageContent('''
+class BuildContext {
+  @deprecated
+  void ancestorInheritedElementForWidgetOfExactType(Type t) {}
+  void getElementForInheritedWidgetOfExactType<T>() {}
+}
+''');
+    addPackageDataFile('''
+version: 1
+transforms:
+  - title: 'Rename to getElementForInheritedWidgetOfExactType'
+    date: 2020-09-14
+    element:
+      uris: ['$importUri']
+      method: 'ancestorInheritedElementForWidgetOfExactType'
+      inClass: 'BuildContext'
+    changes:
+      - kind: 'rename'
+        newName: 'getElementForInheritedWidgetOfExactType'
+      - kind: 'addTypeParameter'
+        index: 0
+        name: 'T'
+        argumentValue:
+          expression: '{% type %}'
+          variables:
+            type:
+              kind: 'fragment'
+              value: 'arguments[0]'
+      - kind: 'removeParameter'
+        index: 0
+''');
+    await resolveTestCode('''
+import '$importUri';
+
+void f(BuildContext context) {
+  context.ancestorInheritedElementForWidgetOfExactType(String);
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+
+void f(BuildContext context) {
+  context.getElementForInheritedWidgetOfExactType<String>();
+}
+''');
+  }
+
+  Future<void>
+      test_widgets_BuildContext_ancestorInheritedElementForWidgetOfExactType_removed() async {
+    setPackageContent('''
+class BuildContext {
+  void getElementForInheritedWidgetOfExactType<T>() {}
+}
+''');
+    addPackageDataFile('''
+version: 1
+transforms:
+  - title: 'Rename to getElementForInheritedWidgetOfExactType'
+    date: 2020-09-14
+    element:
+      uris: ['$importUri']
+      method: 'ancestorInheritedElementForWidgetOfExactType'
+      inClass: 'BuildContext'
+    changes:
+      - kind: 'rename'
+        newName: 'getElementForInheritedWidgetOfExactType'
+      - kind: 'addTypeParameter'
+        index: 0
+        name: 'T'
+        argumentValue:
+          expression: '{% type %}'
+          variables:
+            type:
+              kind: 'fragment'
+              value: 'arguments[0]'
+      - kind: 'removeParameter'
+        index: 0
+''');
+    await resolveTestCode('''
+import '$importUri';
+
+void f(BuildContext context) {
+  context.ancestorInheritedElementForWidgetOfExactType(String);
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+
+void f(BuildContext context) {
+  context.getElementForInheritedWidgetOfExactType<String>();
+}
+''');
+  }
+
+  Future<void>
+      test_widgets_BuildContext_ancestorStateOfType_deprecated() async {
+    setPackageContent('''
+class BuildContext {
+  @deprecated
+  void ancestorStateOfType(TypeMatcher matcher) {}
+  void findAncestorStateOfType<T>() {}
+}
+class TypeMatcher<T> {}
+''');
+    addPackageDataFile('''
+version: 1
+transforms:
+  - title: 'Rename to findAncestorStateOfType'
+    date: 2020-09-14
+    element:
+      uris: ['$importUri']
+      method: 'ancestorStateOfType'
+      inClass: 'BuildContext'
+    changes:
+      - kind: 'rename'
+        newName: 'findAncestorStateOfType'
+      - kind: 'addTypeParameter'
+        index: 0
+        name: 'T'
+        argumentValue:
+          expression: '{% type %}'
+          variables:
+            type:
+              kind: 'fragment'
+              value: 'arguments[0].typeArguments[0]'
+      - kind: 'removeParameter'
+        index: 0
+''');
+    await resolveTestCode('''
+import '$importUri';
+
+void f(BuildContext context) {
+  context.ancestorStateOfType(TypeMatcher<String>());
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+
+void f(BuildContext context) {
+  context.findAncestorStateOfType<String>();
+}
+''');
+  }
+
+  Future<void>
+      test_widgets_BuildContext_ancestorWidgetOfExactType_deprecated() async {
+    setPackageContent('''
+class BuildContext {
+  @deprecated
+  void ancestorWidgetOfExactType(Type t) {}
+  void findAncestorWidgetOfExactType<T>() {}
+}
+''');
+    addPackageDataFile('''
+version: 1
+transforms:
+  - title: 'Rename to getElementForInheritedWidgetOfExactType'
+    date: 2020-09-14
+    element:
+      uris: ['$importUri']
+      method: 'ancestorWidgetOfExactType'
+      inClass: 'BuildContext'
+    changes:
+      - kind: 'rename'
+        newName: 'findAncestorWidgetOfExactType'
+      - kind: 'addTypeParameter'
+        index: 0
+        name: 'T'
+        argumentValue:
+          expression: '{% type %}'
+          variables:
+            type:
+              kind: 'fragment'
+              value: 'arguments[0]'
+      - kind: 'removeParameter'
+        index: 0
+''');
+    await resolveTestCode('''
+import '$importUri';
+
+void f(BuildContext context) {
+  context.ancestorWidgetOfExactType(String);
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+
+void f(BuildContext context) {
+  context.findAncestorWidgetOfExactType<String>();
+}
+''');
+  }
+
+  Future<void>
+      test_widgets_BuildContext_ancestorWidgetOfExactType_removed() async {
+    setPackageContent('''
+class BuildContext {
+  void findAncestorWidgetOfExactType<T>() {}
+}
+''');
+    addPackageDataFile('''
+version: 1
+transforms:
+  - title: 'Rename to getElementForInheritedWidgetOfExactType'
+    date: 2020-09-14
+    element:
+      uris: ['$importUri']
+      method: 'ancestorWidgetOfExactType'
+      inClass: 'BuildContext'
+    changes:
+      - kind: 'rename'
+        newName: 'findAncestorWidgetOfExactType'
+      - kind: 'addTypeParameter'
+        index: 0
+        name: 'T'
+        argumentValue:
+          expression: '{% type %}'
+          variables:
+            type:
+              kind: 'fragment'
+              value: 'arguments[0]'
+      - kind: 'removeParameter'
+        index: 0
+''');
+    await resolveTestCode('''
+import '$importUri';
+
+void f(BuildContext context) {
+  context.ancestorWidgetOfExactType(String);
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+
+void f(BuildContext context) {
+  context.findAncestorWidgetOfExactType<String>();
+}
+''');
+  }
+
+  Future<void> test_widgets_BuildContext_inheritFromElement_deprecated() async {
+    setPackageContent('''
+class BuildContext {
+  @deprecated
+  void inheritFromElement() {}
+  void dependOnInheritedElement() {}
+}
+''');
+    addPackageDataFile('''
+version: 1
+transforms:
+  - title: 'Rename to dependOnInheritedElement'
+    date: 2020-09-24
+    element:
+      uris: ['$importUri']
+      method: 'inheritFromElement'
+      inClass: 'BuildContext'
+    changes:
+      - kind: 'rename'
+        newName: 'dependOnInheritedElement'
+''');
+    await resolveTestCode('''
+import '$importUri';
+
+void f(BuildContext context) {
+  context.inheritFromElement();
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+
+void f(BuildContext context) {
+  context.dependOnInheritedElement();
+}
+''');
+  }
+
+  Future<void> test_widgets_BuildContext_inheritFromElement_removed() async {
+    setPackageContent('''
+class BuildContext {
+  void dependOnInheritedElement() {}
+}
+''');
+    addPackageDataFile('''
+version: 1
+transforms:
+  - title: 'Rename to dependOnInheritedElement'
+    date: 2020-09-24
+    element:
+      uris: ['$importUri']
+      method: 'inheritFromElement'
+      inClass: 'BuildContext'
+    changes:
+      - kind: 'rename'
+        newName: 'dependOnInheritedElement'
+''');
+    await resolveTestCode('''
+import '$importUri';
+
+void f(BuildContext context) {
+  context.inheritFromElement();
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+
+void f(BuildContext context) {
+  context.dependOnInheritedElement();
+}
+''');
+  }
+
+  Future<void>
+      test_widgets_BuildContext_inheritFromWidgetOfExactType_deprecated() async {
+    setPackageContent('''
+class BuildContext {
+  @deprecated
+  void inheritFromWidgetOfExactType(Type t) {}
+  void dependOnInheritedWidgetOfExactType<T>() {}
+}
+''');
+    addPackageDataFile('''
+version: 1
+transforms:
+  - title: 'Rename to dependOnInheritedWidgetOfExactType'
+    date: 2020-09-14
+    element:
+      uris: ['$importUri']
+      method: 'inheritFromWidgetOfExactType'
+      inClass: 'BuildContext'
+    changes:
+      - kind: 'rename'
+        newName: 'dependOnInheritedWidgetOfExactType'
+      - kind: 'addTypeParameter'
+        index: 0
+        name: 'T'
+        argumentValue:
+          expression: '{% type %}'
+          variables:
+            type:
+              kind: 'fragment'
+              value: 'arguments[0]'
+      - kind: 'removeParameter'
+        index: 0
+''');
+    await resolveTestCode('''
+import '$importUri';
+
+void f(BuildContext context) {
+  context.inheritFromWidgetOfExactType(String);
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+
+void f(BuildContext context) {
+  context.dependOnInheritedWidgetOfExactType<String>();
+}
+''');
+  }
+
+  Future<void>
+      test_widgets_BuildContext_inheritFromWidgetOfExactType_removed() async {
+    setPackageContent('''
+class BuildContext {
+  void dependOnInheritedWidgetOfExactType<T>() {}
+}
+''');
+    addPackageDataFile('''
+version: 1
+transforms:
+  - title: 'Rename to dependOnInheritedWidgetOfExactType'
+    date: 2020-09-14
+    element:
+      uris: ['$importUri']
+      method: 'inheritFromWidgetOfExactType'
+      inClass: 'BuildContext'
+    changes:
+      - kind: 'rename'
+        newName: 'dependOnInheritedWidgetOfExactType'
+      - kind: 'addTypeParameter'
+        index: 0
+        name: 'T'
+        argumentValue:
+          expression: '{% type %}'
+          variables:
+            type:
+              kind: 'fragment'
+              value: 'arguments[0]'
+      - kind: 'removeParameter'
+        index: 0
+''');
+    await resolveTestCode('''
+import '$importUri';
+
+void f(BuildContext context) {
+  context.inheritFromWidgetOfExactType(String);
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+
+void f(BuildContext context) {
+  context.dependOnInheritedWidgetOfExactType<String>();
+}
+''');
+  }
+
+  Future<void>
+      test_widgets_Element_ancestorInheritedElementForWidgetOfExactType_deprecated() async {
+    setPackageContent('''
+class Element {
+  @deprecated
+  void ancestorInheritedElementForWidgetOfExactType(Type t) {}
+  void getElementForInheritedWidgetOfExactType<T>() {}
+}
+''');
+    addPackageDataFile('''
+version: 1
+transforms:
+  - title: 'Rename to getElementForInheritedWidgetOfExactType'
+    date: 2020-09-14
+    element:
+      uris: ['$importUri']
+      method: 'ancestorInheritedElementForWidgetOfExactType'
+      inClass: 'Element'
+    changes:
+      - kind: 'rename'
+        newName: 'getElementForInheritedWidgetOfExactType'
+      - kind: 'addTypeParameter'
+        index: 0
+        name: 'T'
+        argumentValue:
+          expression: '{% type %}'
+          variables:
+            type:
+              kind: 'fragment'
+              value: 'arguments[0]'
+      - kind: 'removeParameter'
+        index: 0
+''');
+    await resolveTestCode('''
+import '$importUri';
+
+void f(Element element) {
+  element.ancestorInheritedElementForWidgetOfExactType(String);
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+
+void f(Element element) {
+  element.getElementForInheritedWidgetOfExactType<String>();
+}
+''');
+  }
+
+  Future<void>
+      test_widgets_Element_ancestorInheritedElementForWidgetOfExactType_removed() async {
+    setPackageContent('''
+class Element {
+  void getElementForInheritedWidgetOfExactType<T>() {}
+}
+''');
+    addPackageDataFile('''
+version: 1
+transforms:
+  - title: 'Rename to getElementForInheritedWidgetOfExactType'
+    date: 2020-09-14
+    element:
+      uris: ['$importUri']
+      method: 'ancestorInheritedElementForWidgetOfExactType'
+      inClass: 'Element'
+    changes:
+      - kind: 'rename'
+        newName: 'getElementForInheritedWidgetOfExactType'
+      - kind: 'addTypeParameter'
+        index: 0
+        name: 'T'
+        argumentValue:
+          expression: '{% type %}'
+          variables:
+            type:
+              kind: 'fragment'
+              value: 'arguments[0]'
+      - kind: 'removeParameter'
+        index: 0
+''');
+    await resolveTestCode('''
+import '$importUri';
+
+void f(Element element) {
+  element.ancestorInheritedElementForWidgetOfExactType(String);
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+
+void f(Element element) {
+  element.getElementForInheritedWidgetOfExactType<String>();
+}
+''');
+  }
+
+  Future<void>
+      test_widgets_Element_ancestorWidgetOfExactType_deprecated() async {
+    setPackageContent('''
+class Element {
+  @deprecated
+  void ancestorWidgetOfExactType(Type t) {}
+  void findAncestorWidgetOfExactType<T>() {}
+}
+''');
+    addPackageDataFile('''
+version: 1
+transforms:
+  - title: 'Rename to getElementForInheritedWidgetOfExactType'
+    date: 2020-09-14
+    element:
+      uris: ['$importUri']
+      method: 'ancestorWidgetOfExactType'
+      inClass: 'Element'
+    changes:
+      - kind: 'rename'
+        newName: 'findAncestorWidgetOfExactType'
+      - kind: 'addTypeParameter'
+        index: 0
+        name: 'T'
+        argumentValue:
+          expression: '{% type %}'
+          variables:
+            type:
+              kind: 'fragment'
+              value: 'arguments[0]'
+      - kind: 'removeParameter'
+        index: 0
+''');
+    await resolveTestCode('''
+import '$importUri';
+
+void f(Element element) {
+  element.ancestorWidgetOfExactType(String);
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+
+void f(Element element) {
+  element.findAncestorWidgetOfExactType<String>();
+}
+''');
+  }
+
+  Future<void> test_widgets_Element_ancestorWidgetOfExactType_removed() async {
+    setPackageContent('''
+class Element {
+  void findAncestorWidgetOfExactType<T>() {}
+}
+''');
+    addPackageDataFile('''
+version: 1
+transforms:
+  - title: 'Rename to getElementForInheritedWidgetOfExactType'
+    date: 2020-09-14
+    element:
+      uris: ['$importUri']
+      method: 'ancestorWidgetOfExactType'
+      inClass: 'Element'
+    changes:
+      - kind: 'rename'
+        newName: 'findAncestorWidgetOfExactType'
+      - kind: 'addTypeParameter'
+        index: 0
+        name: 'T'
+        argumentValue:
+          expression: '{% type %}'
+          variables:
+            type:
+              kind: 'fragment'
+              value: 'arguments[0]'
+      - kind: 'removeParameter'
+        index: 0
+''');
+    await resolveTestCode('''
+import '$importUri';
+
+void f(Element element) {
+  element.ancestorWidgetOfExactType(String);
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+
+void f(Element element) {
+  element.findAncestorWidgetOfExactType<String>();
+}
+''');
+  }
+
+  Future<void> test_widgets_Element_inheritFromElement_deprecated() async {
+    setPackageContent('''
+class Element {
+  @deprecated
+  void inheritFromElement() {}
+  void dependOnInheritedElement() {}
+}
+''');
+    addPackageDataFile('''
+version: 1
+transforms:
+  - title: 'Rename to dependOnInheritedElement'
+    date: 2020-09-24
+    element:
+      uris: ['$importUri']
+      method: 'inheritFromElement'
+      inClass: 'Element'
+    changes:
+      - kind: 'rename'
+        newName: 'dependOnInheritedElement'
+''');
+    await resolveTestCode('''
+import '$importUri';
+
+void f(Element element) {
+  element.inheritFromElement();
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+
+void f(Element element) {
+  element.dependOnInheritedElement();
+}
+''');
+  }
+
+  Future<void> test_widgets_Element_inheritFromElement_removed() async {
+    setPackageContent('''
+class Element {
+  void dependOnInheritedElement() {}
+}
+''');
+    addPackageDataFile('''
+version: 1
+transforms:
+  - title: 'Rename to dependOnInheritedElement'
+    date: 2020-09-24
+    element:
+      uris: ['$importUri']
+      method: 'inheritFromElement'
+      inClass: 'Element'
+    changes:
+      - kind: 'rename'
+        newName: 'dependOnInheritedElement'
+''');
+    await resolveTestCode('''
+import '$importUri';
+
+void f(Element element) {
+  element.inheritFromElement();
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+
+void f(Element element) {
+  element.dependOnInheritedElement();
+}
+''');
+  }
+
+  Future<void>
+      test_widgets_Element_inheritFromWidgetOfExactType_deprecated() async {
+    setPackageContent('''
+class Element {
+  @deprecated
+  void inheritFromWidgetOfExactType(Type t) {}
+  void dependOnInheritedWidgetOfExactType<T>() {}
+}
+''');
+    addPackageDataFile('''
+version: 1
+transforms:
+  - title: 'Rename to dependOnInheritedWidgetOfExactType'
+    date: 2020-09-14
+    element:
+      uris: ['$importUri']
+      method: 'inheritFromWidgetOfExactType'
+      inClass: 'Element'
+    changes:
+      - kind: 'rename'
+        newName: 'dependOnInheritedWidgetOfExactType'
+      - kind: 'addTypeParameter'
+        index: 0
+        name: 'T'
+        argumentValue:
+          expression: '{% type %}'
+          variables:
+            type:
+              kind: 'fragment'
+              value: 'arguments[0]'
+      - kind: 'removeParameter'
+        index: 0
+''');
+    await resolveTestCode('''
+import '$importUri';
+
+void f(Element element) {
+  element.inheritFromWidgetOfExactType(String);
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+
+void f(Element element) {
+  element.dependOnInheritedWidgetOfExactType<String>();
+}
+''');
+  }
+
+  Future<void>
+      test_widgets_Element_inheritFromWidgetOfExactType_removed() async {
+    setPackageContent('''
+class Element {
+  void dependOnInheritedWidgetOfExactType<T>() {}
+}
+''');
+    addPackageDataFile('''
+version: 1
+transforms:
+  - title: 'Rename to dependOnInheritedWidgetOfExactType'
+    date: 2020-09-14
+    element:
+      uris: ['$importUri']
+      method: 'inheritFromWidgetOfExactType'
+      inClass: 'Element'
+    changes:
+      - kind: 'rename'
+        newName: 'dependOnInheritedWidgetOfExactType'
+      - kind: 'addTypeParameter'
+        index: 0
+        name: 'T'
+        argumentValue:
+          expression: '{% type %}'
+          variables:
+            type:
+              kind: 'fragment'
+              value: 'arguments[0]'
+      - kind: 'removeParameter'
+        index: 0
+''');
+    await resolveTestCode('''
+import '$importUri';
+
+void f(Element element) {
+  element.inheritFromWidgetOfExactType(String);
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+
+void f(Element element) {
+  element.dependOnInheritedWidgetOfExactType<String>();
+}
+''');
+  }
+
+  Future<void>
+      test_widgets_ScrollPosition_jumpToWithoutSettling_deprecated() async {
+    setPackageContent('''
+class ScrollPosition {
+  @deprecated
+  void jumpToWithoutSettling(double d);
+  void jumpTo(double d);
+}
+''');
+    addPackageDataFile('''
+version: 1
+transforms:
+  - title: 'Rename to jumpTo'
+    date: 2020-09-14
+    element:
+      uris: ['$importUri']
+      method: 'jumpToWithoutSettling'
+      inClass: 'ScrollPosition'
+    changes:
+      - kind: 'rename'
+        newName: 'jumpTo'
+''');
+    await resolveTestCode('''
+import '$importUri';
+
+void f(ScrollPosition position) {
+  position.jumpToWithoutSettling(0.5);
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+
+void f(ScrollPosition position) {
+  position.jumpTo(0.5);
+}
+''');
+  }
+
+  Future<void>
+      test_widgets_ScrollPosition_jumpToWithoutSettling_removed() async {
+    setPackageContent('''
+class ScrollPosition {
+  void jumpTo(double d);
+}
+''');
+    addPackageDataFile('''
+version: 1
+transforms:
+  - title: 'Rename to jumpTo'
+    date: 2020-09-14
+    element:
+      uris: ['$importUri']
+      method: 'jumpToWithoutSettling'
+      inClass: 'ScrollPosition'
+    changes:
+      - kind: 'rename'
+        newName: 'jumpTo'
+''');
+    await resolveTestCode('''
+import '$importUri';
+
+void f(ScrollPosition position) {
+  position.jumpToWithoutSettling(0.5);
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+
+void f(ScrollPosition position) {
+  position.jumpTo(0.5);
+}
+''');
+  }
+
+  Future<void>
+      test_widgets_StatefulElement_inheritFromElement_deprecated() async {
+    setPackageContent('''
+class StatefulElement {
+  @deprecated
+  void inheritFromElement() {}
+  void dependOnInheritedElement() {}
+}
+''');
+    addPackageDataFile('''
+version: 1
+transforms:
+  - title: 'Rename to dependOnInheritedElement'
+    date: 2020-09-24
+    element:
+      uris: ['$importUri']
+      method: 'inheritFromElement'
+      inClass: 'StatefulElement'
+    changes:
+      - kind: 'rename'
+        newName: 'dependOnInheritedElement'
+''');
+    await resolveTestCode('''
+import '$importUri';
+
+void f(StatefulElement element) {
+  element.inheritFromElement();
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+
+void f(StatefulElement element) {
+  element.dependOnInheritedElement();
+}
+''');
+  }
+
+  Future<void> test_widgets_StatefulElement_inheritFromElement_removed() async {
+    setPackageContent('''
+class StatefulElement {
+  void dependOnInheritedElement() {}
+}
+''');
+    addPackageDataFile('''
+version: 1
+transforms:
+  - title: 'Rename to dependOnInheritedElement'
+    date: 2020-09-24
+    element:
+      uris: ['$importUri']
+      method: 'inheritFromElement'
+      inClass: 'StatefulElement'
+    changes:
+      - kind: 'rename'
+        newName: 'dependOnInheritedElement'
+''');
+    await resolveTestCode('''
+import '$importUri';
+
+void f(StatefulElement element) {
+  element.inheritFromElement();
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+
+void f(StatefulElement element) {
+  element.dependOnInheritedElement();
+}
+''');
+  }
+
+  Future<void>
+      test_widgets_WidgetsBinding_allowFirstFrameReport_deprecated() async {
+    setPackageContent('''
+class WidgetsBinding {
+  @deprecated
+  void allowFirstFrameReport() {}
+  void allowFirstFrame() {}
+}
+''');
+    addPackageDataFile('''
+version: 1
+transforms:
+  - title: 'Rename to allowFirstFrame'
+    date: 2020-09-24
+    element:
+      uris: ['$importUri']
+      method: 'allowFirstFrameReport'
+      inClass: 'WidgetsBinding'
+    changes:
+      - kind: 'rename'
+        newName: 'allowFirstFrame'
+''');
+    await resolveTestCode('''
+import '$importUri';
+
+void f(WidgetsBinding binding) {
+  binding.allowFirstFrameReport();
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+
+void f(WidgetsBinding binding) {
+  binding.allowFirstFrame();
+}
+''');
+  }
+
+  Future<void>
+      test_widgets_WidgetsBinding_allowFirstFrameReport_removed() async {
+    setPackageContent('''
+class WidgetsBinding {
+  void allowFirstFrame() {}
+}
+''');
+    addPackageDataFile('''
+version: 1
+transforms:
+  - title: 'Rename to allowFirstFrame'
+    date: 2020-09-24
+    element:
+      uris: ['$importUri']
+      method: 'allowFirstFrameReport'
+      inClass: 'WidgetsBinding'
+    changes:
+      - kind: 'rename'
+        newName: 'allowFirstFrame'
+''');
+    await resolveTestCode('''
+import '$importUri';
+
+void f(WidgetsBinding binding) {
+  binding.allowFirstFrameReport();
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+
+void f(WidgetsBinding binding) {
+  binding.allowFirstFrame();
+}
+''');
+  }
+
+  Future<void>
+      test_widgets_WidgetsBinding_deferFirstFrameReport_deprecated() async {
+    setPackageContent('''
+class WidgetsBinding {
+  @deprecated
+  void deferFirstFrameReport() {}
+  void deferFirstFrame() {}
+}
+''');
+    addPackageDataFile('''
+version: 1
+transforms:
+  - title: 'Rename to deferFirstFrame'
+    date: 2020-09-24
+    element:
+      uris: ['$importUri']
+      method: 'deferFirstFrameReport'
+      inClass: 'WidgetsBinding'
+    changes:
+      - kind: 'rename'
+        newName: 'deferFirstFrame'
+''');
+    await resolveTestCode('''
+import '$importUri';
+
+void f(WidgetsBinding binding) {
+  binding.deferFirstFrameReport();
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+
+void f(WidgetsBinding binding) {
+  binding.deferFirstFrame();
+}
+''');
+  }
+
+  Future<void>
+      test_widgets_WidgetsBinding_deferFirstFrameReport_removed() async {
+    setPackageContent('''
+class WidgetsBinding {
+  void deferFirstFrame() {}
+}
+''');
+    addPackageDataFile('''
+version: 1
+transforms:
+  - title: 'Rename to deferFirstFrame'
+    date: 2020-09-24
+    element:
+      uris: ['$importUri']
+      method: 'deferFirstFrameReport'
+      inClass: 'WidgetsBinding'
+    changes:
+      - kind: 'rename'
+        newName: 'deferFirstFrame'
+''');
+    await resolveTestCode('''
+import '$importUri';
+
+void f(WidgetsBinding binding) {
+  binding.deferFirstFrameReport();
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+
+void f(WidgetsBinding binding) {
+  binding.deferFirstFrame();
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/modify_parameters_test.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/modify_parameters_test.dart
index dd56d2c..028cda4 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/data_driven/modify_parameters_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/modify_parameters_test.dart
@@ -35,7 +35,7 @@
     setPackageData(_modify(
         ['C', 'm'], [AddParameter(0, 'a', false, false, null)],
         newName: 'm2'));
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 
 void f(C c) {
@@ -62,7 +62,7 @@
     setPackageData(_modify(
         ['C', 'm'], [AddParameter(0, 'a', false, true, codeTemplate('0'))],
         newName: 'm2'));
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 
 void f(C c) {
@@ -89,7 +89,7 @@
     setPackageData(_modify(
         ['C', 'm'], [AddParameter(0, 'a', true, false, codeTemplate('0'))],
         newName: 'm2'));
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 
 void f(C c) {
@@ -116,7 +116,7 @@
     setPackageData(_modify(
         ['C', 'm'], [AddParameter(0, 'a', true, true, codeTemplate('0'))],
         newName: 'm2'));
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 
 void f(C c) {
@@ -143,7 +143,7 @@
     setPackageData(_modify(
         ['C', 'm'], [AddParameter(1, 'b', false, false, null)],
         newName: 'm2'));
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 
 void f(C c) {
@@ -170,7 +170,7 @@
     setPackageData(_modify(
         ['C', 'm'], [AddParameter(1, 'b', false, true, codeTemplate('1'))],
         newName: 'm2'));
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 
 void f(C c) {
@@ -197,7 +197,7 @@
     setPackageData(_modify(
         ['C', 'm'], [AddParameter(1, 'b', true, false, codeTemplate('1'))],
         newName: 'm2'));
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 
 void f(C c) {
@@ -224,7 +224,7 @@
     setPackageData(_modify(
         ['C', 'm'], [AddParameter(1, 'b', true, true, codeTemplate('1'))],
         newName: 'm2'));
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 
 void f(C c) {
@@ -256,7 +256,7 @@
       AddParameter(2, 'c', true, true, codeTemplate('2')),
       AddParameter(4, 'e', true, true, codeTemplate('4')),
     ], newName: 'm2'));
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 
 void f(C c) {
@@ -281,7 +281,7 @@
     setPackageData(_modify(
         ['C', 'm'], [AddParameter(0, 'a', true, true, codeTemplate('0'))],
         newName: 'm2'));
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 
 void f(C c) {
@@ -305,7 +305,7 @@
 ''');
     setPackageData(_modify(
         ['C', 'm'], [AddParameter(0, 'a', true, true, codeTemplate('0'))]));
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 
 void f(C c) {
@@ -336,7 +336,7 @@
       RemoveParameter(PositionalParameterReference(0)),
       AddParameter(2, 'c', true, true, codeTemplate('2'))
     ], newName: 'm2'));
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 
 void f(C c) {
@@ -367,7 +367,7 @@
       RemoveParameter(PositionalParameterReference(1)),
       AddParameter(0, 'a', true, true, codeTemplate('0'))
     ], newName: 'm2'));
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 
 void f(C c) {
@@ -399,7 +399,7 @@
       RemoveParameter(PositionalParameterReference(1)),
       AddParameter(0, 'c', true, true, codeTemplate('2')),
     ], newName: 'm2'));
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 
 void f(C c) {
@@ -431,7 +431,7 @@
       RemoveParameter(PositionalParameterReference(2)),
       AddParameter(1, 'd', true, true, codeTemplate('3')),
     ], newName: 'm2'));
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 
 void f(C c) {
@@ -464,7 +464,7 @@
       RemoveParameter(PositionalParameterReference(3)),
       AddParameter(2, 'd', true, true, codeTemplate('3')),
     ], newName: 'm2'));
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 
 void f(C c) {
@@ -480,6 +480,37 @@
 ''');
   }
 
+  Future<void> test_mixed_replaced_deprecated() async {
+    setPackageContent('''
+class C {
+  @deprecated
+  void m1({int a}) {}
+  void m2({int b}) {}
+}
+''');
+    setPackageData(_modify([
+      'C',
+      'm1'
+    ], [
+      AddParameter(0, 'b', true, false, codeTemplate('0')),
+      RemoveParameter(NamedParameterReference('a')),
+    ], newName: 'm2'));
+    await resolveTestCode('''
+import '$importUri';
+
+void f(C c) {
+  c.m1(a: 1);
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+
+void f(C c) {
+  c.m2(b: 0);
+}
+''');
+  }
+
   Future<void> test_remove_first_optionalNamed_deprecated() async {
     setPackageContent('''
 class C {
@@ -491,7 +522,7 @@
     setPackageData(_modify(
         ['C', 'm'], [RemoveParameter(NamedParameterReference('a'))],
         newName: 'm2'));
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 
 void f(C c) {
@@ -518,7 +549,7 @@
     setPackageData(_modify(
         ['C', 'm'], [RemoveParameter(PositionalParameterReference(0))],
         newName: 'm2'));
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 
 void f(C c) {
@@ -545,7 +576,7 @@
     setPackageData(_modify(
         ['C', 'm'], [RemoveParameter(PositionalParameterReference(0))],
         newName: 'm2'));
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 
 void f(C c) {
@@ -572,7 +603,7 @@
     setPackageData(_modify(
         ['C', 'm'], [RemoveParameter(NamedParameterReference('b'))],
         newName: 'm2'));
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 
 void f(C c) {
@@ -599,7 +630,7 @@
     setPackageData(_modify(
         ['C', 'm'], [RemoveParameter(PositionalParameterReference(1))],
         newName: 'm2'));
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 
 void f(C c) {
@@ -626,7 +657,7 @@
     setPackageData(_modify(
         ['C', 'm'], [RemoveParameter(PositionalParameterReference(1))],
         newName: 'm2'));
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 
 void f(C c) {
@@ -642,6 +673,31 @@
 ''');
   }
 
+  Future<void>
+      test_remove_middle_optionalNamed_withArg_notRenamed_deprecated() async {
+    setPackageContent('''
+class C {
+  void m({int a, @deprecated int b, int c}) {}
+}
+''');
+    setPackageData(
+        _modify(['C', 'm'], [RemoveParameter(NamedParameterReference('b'))]));
+    await resolveTestCode('''
+import '$importUri';
+
+void f(C c) {
+  c.m(a: 0, b: 1, c: 2);
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+
+void f(C c) {
+  c.m(a: 0, c: 2);
+}
+''');
+  }
+
   Future<void> test_remove_multiple_deprecated() async {
     setPackageContent('''
 class C {
@@ -658,7 +714,7 @@
       RemoveParameter(PositionalParameterReference(2)),
       RemoveParameter(PositionalParameterReference(3)),
     ], newName: 'm2'));
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 
 void f(C c) {
@@ -685,7 +741,7 @@
     setPackageData(_modify(
         ['C', 'm'], [RemoveParameter(NamedParameterReference('a'))],
         newName: 'm2'));
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 
 void f(C c) {
@@ -712,7 +768,7 @@
     setPackageData(_modify(
         ['C', 'm'], [RemoveParameter(NamedParameterReference('a'))],
         newName: 'm2'));
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 
 void f(C c) {
@@ -739,7 +795,7 @@
     setPackageData(_modify(
         ['C', 'm'], [RemoveParameter(PositionalParameterReference(0))],
         newName: 'm2'));
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 
 void f(C c) {
@@ -767,7 +823,7 @@
     setPackageData(_modify(
         ['C', 'm'], [RemoveParameter(PositionalParameterReference(0))],
         newName: 'm2'));
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 
 void f(C c) {
@@ -794,7 +850,7 @@
     setPackageData(_modify(
         ['C', 'm'], [RemoveParameter(PositionalParameterReference(0))],
         newName: 'm2'));
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 
 void f(C c) {
@@ -835,7 +891,7 @@
     ], [
       AddParameter(0, 'a', true, true, codeTemplate('0')),
     ], newName: 'g'));
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 
 void h() {
@@ -860,7 +916,7 @@
     setPackageData(_modify(
         ['f'], [RemoveParameter(PositionalParameterReference(0))],
         newName: 'g'));
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 
 void h() {
@@ -889,6 +945,7 @@
               libraryUris: [Uri.parse(importUri)],
               kind: ElementKindUtilities.fromName(_kind),
               components: originalComponents),
+          bulkApply: false,
           changes: [
             ModifyParameters(modifications: modifications),
             if (newName != null) Rename(newName: newName),
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/rename_parameter_test.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/rename_parameter_test.dart
new file mode 100644
index 0000000..eca3df1
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/rename_parameter_test.dart
@@ -0,0 +1,341 @@
+// Copyright (c) 2020, 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/src/services/correction/fix/data_driven/element_descriptor.dart';
+import 'package:analysis_server/src/services/correction/fix/data_driven/element_kind.dart';
+import 'package:analysis_server/src/services/correction/fix/data_driven/rename_parameter.dart';
+import 'package:analysis_server/src/services/correction/fix/data_driven/transform.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'data_driven_test_support.dart';
+
+void main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(RenameParameterInConstructorTest);
+    defineReflectiveTests(RenameParameterInMethodTest);
+    defineReflectiveTests(RenameParameterInTopLevelFunctionTest);
+  });
+}
+
+@reflectiveTest
+class RenameParameterInConstructorTest extends _AbstractRenameParameterInTest {
+  @override
+  String get _kind => 'constructor';
+
+  Future<void> test_named_deprecated() async {
+    setPackageContent('''
+class C {
+  C.named({int b, @deprecated int a});
+}
+''');
+    setPackageData(_rename(['C', 'named'], 'a', 'b'));
+    await resolveTestCode('''
+import '$importUri';
+
+void f() {
+  C.named(a: 0);
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+
+void f() {
+  C.named(b: 0);
+}
+''');
+  }
+
+  Future<void> test_named_removed() async {
+    setPackageContent('''
+class C {
+  C.named({int b});
+}
+''');
+    setPackageData(_rename(['C', 'named'], 'a', 'b'));
+    await resolveTestCode('''
+import '$importUri';
+
+void f() {
+  C.named(a: 0);
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+
+void f() {
+  C.named(b: 0);
+}
+''');
+  }
+
+  Future<void> test_unnamed_deprecated() async {
+    setPackageContent('''
+class C {
+  C({int b, @deprecated int a});
+}
+''');
+    setPackageData(_rename(['C', ''], 'a', 'b'));
+    await resolveTestCode('''
+import '$importUri';
+
+void f() {
+  C(a: 0);
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+
+void f() {
+  C(b: 0);
+}
+''');
+  }
+
+  Future<void> test_unnamed_removed() async {
+    setPackageContent('''
+class C {
+  C({int b});
+}
+''');
+    setPackageData(_rename(['C', ''], 'a', 'b'));
+    await resolveTestCode('''
+import '$importUri';
+
+void f() {
+  C(a: 0);
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+
+void f() {
+  C(b: 0);
+}
+''');
+  }
+}
+
+@reflectiveTest
+class RenameParameterInMethodTest extends _AbstractRenameParameterInTest {
+  @override
+  String get _kind => 'method';
+
+  Future<void> test_differentMethod() async {
+    setPackageContent('''
+class C {
+  int m({int b, @deprecated int a}) => 0;
+}
+''');
+    setPackageData(_rename(['D', 'm'], 'a', 'nbew'));
+    await resolveTestCode('''
+import '$importUri';
+
+void f(C c) {
+  c.m(a: 1);
+}
+''');
+    await assertNoFix();
+  }
+
+  Future<void> test_instance_override_deprecated() async {
+    setPackageContent('''
+class C {
+  int m({int b, @deprecated int a}) => 0;
+}
+''');
+    setPackageData(_rename(['C', 'm'], 'a', 'b'));
+    await resolveTestCode('''
+import '$importUri';
+
+class D extends C {
+  @override
+  int m({int a}) => 0;
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+
+class D extends C {
+  @override
+  int m({int b, @deprecated int a}) => 0;
+}
+''');
+  }
+
+  Future<void> test_instance_override_removed() async {
+    setPackageContent('''
+class C {
+  int m({int b}) => 0;
+}
+''');
+    setPackageData(_rename(['C', 'm'], 'a', 'b'));
+    await resolveTestCode('''
+import '$importUri';
+
+class D extends C {
+  @override
+  int m({int a}) => 0;
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+
+class D extends C {
+  @override
+  int m({int b}) => 0;
+}
+''');
+  }
+
+  Future<void> test_instance_reference_deprecated() async {
+    setPackageContent('''
+class C {
+  int m({int b, @deprecated int a}) => 0;
+}
+''');
+    setPackageData(_rename(['C', 'm'], 'a', 'b'));
+    await resolveTestCode('''
+import '$importUri';
+
+void f(C c) {
+  c.m(a: 1);
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+
+void f(C c) {
+  c.m(b: 1);
+}
+''');
+  }
+
+  Future<void> test_instance_reference_removed() async {
+    setPackageContent('''
+class C {
+  int m({int b}) => 0;
+}
+''');
+    setPackageData(_rename(['C', 'm'], 'a', 'b'));
+    await resolveTestCode('''
+import '$importUri';
+
+void f(C c) {
+  c.m(a: 1);
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+
+void f(C c) {
+  c.m(b: 1);
+}
+''');
+  }
+
+  Future<void> test_static_deprecated() async {
+    setPackageContent('''
+class C {
+  static int m({int b, @deprecated int a}) => 0;
+}
+''');
+    setPackageData(_rename(['C', 'm'], 'a', 'b'));
+    await resolveTestCode('''
+import '$importUri';
+
+void f() {
+  C.m(a: 1);
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+
+void f() {
+  C.m(b: 1);
+}
+''');
+  }
+
+  Future<void> test_static_removed() async {
+    setPackageContent('''
+class C {
+  static int m({int b}) => 0;
+}
+''');
+    setPackageData(_rename(['C', 'm'], 'a', 'b'));
+    await resolveTestCode('''
+import '$importUri';
+
+void f() {
+  C.m(a: 1);
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+
+void f() {
+  C.m(b: 1);
+}
+''');
+  }
+}
+
+@reflectiveTest
+class RenameParameterInTopLevelFunctionTest
+    extends _AbstractRenameParameterInTest {
+  @override
+  String get _kind => 'function';
+
+  Future<void> test_deprecated() async {
+    setPackageContent('''
+int f({int b, @deprecated int a}) => 0;
+''');
+    setPackageData(_rename(['f'], 'a', 'b'));
+    await resolveTestCode('''
+import '$importUri';
+
+var x = f(a: 1);
+''');
+    await assertHasFix('''
+import '$importUri';
+
+var x = f(b: 1);
+''');
+  }
+
+  Future<void> test_removed() async {
+    setPackageContent('''
+int f({int b}) => 0;
+''');
+    setPackageData(_rename(['f'], 'a', 'b'));
+    await resolveTestCode('''
+import '$importUri';
+
+var x = f(a: 1);
+''');
+    await assertHasFix('''
+import '$importUri';
+
+var x = f(b: 1);
+''');
+  }
+}
+
+abstract class _AbstractRenameParameterInTest
+    extends DataDrivenFixProcessorTest {
+  /// Return the kind of element containing the parameter being renamed.
+  String get _kind;
+
+  Transform _rename(List<String> components, String oldName, String newName) =>
+      Transform(
+          title: 'title',
+          element: ElementDescriptor(
+              libraryUris: [Uri.parse(importUri)],
+              kind: ElementKindUtilities.fromName(_kind),
+              components: components),
+          bulkApply: false,
+          changes: [
+            RenameParameter(newName: newName, oldName: oldName),
+          ]);
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/rename_test.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/rename_test.dart
index 39fd964..2578b5b 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/data_driven/rename_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/rename_test.dart
@@ -40,7 +40,7 @@
 }
 ''');
     setPackageData(_rename(['Old'], 'New'));
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 
 void f() {
@@ -63,7 +63,7 @@
 }
 ''');
     setPackageData(_rename(['Old'], 'New'));
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 
 void f() {
@@ -90,7 +90,7 @@
 }
 ''');
     setPackageData(_rename(['Old'], 'New'));
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 
 void f() {
@@ -113,7 +113,7 @@
 }
 ''');
     setPackageData(_rename(['Old'], 'New'));
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 
 void f() {
@@ -136,7 +136,7 @@
 class New {}
 ''');
     setPackageData(_rename(['Old'], 'New'));
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 
 class C extends Old {}
@@ -153,7 +153,7 @@
 class New {}
 ''');
     setPackageData(_rename(['Old'], 'New'));
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 
 class C extends Old {}
@@ -172,7 +172,7 @@
 class New {}
 ''');
     setPackageData(_rename(['Old'], 'New'));
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 
 class C implements Old {}
@@ -189,7 +189,7 @@
 class New {}
 ''');
     setPackageData(_rename(['Old'], 'New'));
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 
 class C implements Old {}
@@ -208,7 +208,7 @@
 class New {}
 ''');
     setPackageData(_rename(['Old'], 'New'));
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 
 extension E on Old {}
@@ -225,7 +225,7 @@
 class New {}
 ''');
     setPackageData(_rename(['Old'], 'New'));
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 
 extension E on Old {}
@@ -244,7 +244,7 @@
 class New {}
 ''');
     setPackageData(_rename(['Old'], 'New'));
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 
 void f(Old o) {}
@@ -261,7 +261,7 @@
 class New {}
 ''');
     setPackageData(_rename(['Old'], 'New'));
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 
 void f(Old o) {}
@@ -280,7 +280,7 @@
 class New {}
 ''');
     setPackageData(_rename(['Old'], 'New'));
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 
 class C with Old {}
@@ -297,7 +297,7 @@
 class New {}
 ''');
     setPackageData(_rename(['Old'], 'New'));
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 
 class C with Old {}
@@ -320,7 +320,7 @@
 }
 ''');
     setPackageData(_rename(['Old'], 'New'));
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 
 var s = Old.empty;
@@ -339,7 +339,7 @@
 }
 ''');
     setPackageData(_rename(['Old'], 'New'));
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 
 var s = Old.empty;
@@ -361,23 +361,23 @@
     setPackageContent('''
 class C {
   @deprecated
-  C.old();
-  C.new();
+  C.a();
+  C.b();
 }
 ''');
-    setPackageData(_rename(['C', 'old'], 'new'));
-    await resolveTestUnit('''
+    setPackageData(_rename(['C', 'a'], 'b'));
+    await resolveTestCode('''
 import '$importUri';
 
 void f() {
-  C.old();
+  C.a();
 }
 ''');
     await assertHasFix('''
 import '$importUri';
 
 void f() {
-  C.new();
+  C.b();
 }
 ''');
   }
@@ -385,22 +385,22 @@
   Future<void> test_named_named_removed() async {
     setPackageContent('''
 class C {
-  C.new();
+  C.b();
 }
 ''');
-    setPackageData(_rename(['C', 'old'], 'new'));
-    await resolveTestUnit('''
+    setPackageData(_rename(['C', 'a'], 'b'));
+    await resolveTestCode('''
 import '$importUri';
 
 void f() {
-  C.old();
+  C.a();
 }
 ''');
     await assertHasFix('''
 import '$importUri';
 
 void f() {
-  C.new();
+  C.b();
 }
 ''');
   }
@@ -414,7 +414,7 @@
 }
 ''');
     setPackageData(_rename(['C', 'old'], ''));
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 
 void f() {
@@ -437,7 +437,7 @@
 }
 ''');
     setPackageData(_rename(['C', 'old'], ''));
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 
 void f() {
@@ -458,11 +458,11 @@
 class C {
   @deprecated
   C();
-  C.new();
+  C.a();
 }
 ''');
-    setPackageData(_rename(['C', ''], 'new'));
-    await resolveTestUnit('''
+    setPackageData(_rename(['C', ''], 'a'));
+    await resolveTestCode('''
 import '$importUri';
 
 void f() {
@@ -473,7 +473,7 @@
 import '$importUri';
 
 void f() {
-  C.new();
+  C.a();
 }
 ''');
   }
@@ -481,11 +481,11 @@
   Future<void> test_unnamed_named_removed() async {
     setPackageContent('''
 class C {
-  C.new();
+  C.a();
 }
 ''');
-    setPackageData(_rename(['C', ''], 'new'));
-    await resolveTestUnit('''
+    setPackageData(_rename(['C', ''], 'a'));
+    await resolveTestCode('''
 import '$importUri';
 
 void f() {
@@ -496,7 +496,7 @@
 import '$importUri';
 
 void f() {
-  C.new();
+  C.a();
 }
 ''');
   }
@@ -518,7 +518,7 @@
 }
 ''');
     setPackageData(_rename(['Old'], 'New'));
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 
 var l = Old('a').double;
@@ -537,7 +537,7 @@
 }
 ''');
     setPackageData(_rename(['Old'], 'New'));
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 
 var l = Old('a').double;
@@ -560,7 +560,7 @@
 }
 ''');
     setPackageData(_rename(['Old'], 'New'));
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 
 var s = Old.empty;
@@ -579,7 +579,7 @@
 }
 ''');
     setPackageData(_rename(['Old'], 'New'));
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 
 var s = Old.empty;
@@ -601,23 +601,23 @@
     setPackageContent('''
 class C {
   @deprecated
-  int old;
-  int new;
+  int a;
+  int b;
 }
 ''');
-    setPackageData(_rename(['C', 'old'], 'new'));
-    await resolveTestUnit('''
+    setPackageData(_rename(['C', 'a'], 'b'));
+    await resolveTestCode('''
 import '$importUri';
 
 void f(C c) {
-  c.old;
+  c.a;
 }
 ''');
     await assertHasFix('''
 import '$importUri';
 
 void f(C c) {
-  c.new;
+  c.b;
 }
 ''');
   }
@@ -625,22 +625,22 @@
   Future<void> test_instance_reference_removed() async {
     setPackageContent('''
 class C {
-  int new;
+  int b;
 }
 ''');
-    setPackageData(_rename(['C', 'old'], 'new'));
-    await resolveTestUnit('''
+    setPackageData(_rename(['C', 'a'], 'b'));
+    await resolveTestCode('''
 import '$importUri';
 
 void f(C c) {
-  c.old;
+  c.a;
 }
 ''');
     await assertHasFix('''
 import '$importUri';
 
 void f(C c) {
-  c.new;
+  c.b;
 }
 ''');
   }
@@ -649,23 +649,23 @@
     setPackageContent('''
 class C {
   @deprecated
-  static int old;
-  static int new;
+  static int a;
+  static int b;
 }
 ''');
-    setPackageData(_rename(['C', 'old'], 'new'));
-    await resolveTestUnit('''
+    setPackageData(_rename(['C', 'a'], 'b'));
+    await resolveTestCode('''
 import '$importUri';
 
 void f() {
-  C.old = 0;
+  C.a = 0;
 }
 ''');
     await assertHasFix('''
 import '$importUri';
 
 void f() {
-  C.new = 0;
+  C.b = 0;
 }
 ''');
   }
@@ -673,22 +673,22 @@
   Future<void> test_static_assignment_removed() async {
     setPackageContent('''
 class C {
-  static int new;
+  static int b;
 }
 ''');
-    setPackageData(_rename(['C', 'old'], 'new'));
-    await resolveTestUnit('''
+    setPackageData(_rename(['C', 'a'], 'b'));
+    await resolveTestCode('''
 import '$importUri';
 
 void f() {
-  C.old = 0;
+  C.a = 0;
 }
 ''');
     await assertHasFix('''
 import '$importUri';
 
 void f() {
-  C.new = 0;
+  C.b = 0;
 }
 ''');
   }
@@ -697,23 +697,23 @@
     setPackageContent('''
 class C {
   @deprecated
-  static int old;
-  static int new;
+  static int a;
+  static int b;
 }
 ''');
-    setPackageData(_rename(['C', 'old'], 'new'));
-    await resolveTestUnit('''
+    setPackageData(_rename(['C', 'a'], 'b'));
+    await resolveTestCode('''
 import '$importUri';
 
 void f() {
-  C.old;
+  C.a;
 }
 ''');
     await assertHasFix('''
 import '$importUri';
 
 void f() {
-  C.new;
+  C.b;
 }
 ''');
   }
@@ -721,22 +721,22 @@
   Future<void> test_static_reference_removed() async {
     setPackageContent('''
 class C {
-  static int new;
+  static int b;
 }
 ''');
-    setPackageData(_rename(['C', 'old'], 'new'));
-    await resolveTestUnit('''
+    setPackageData(_rename(['C', 'a'], 'b'));
+    await resolveTestCode('''
 import '$importUri';
 
 void f() {
-  C.old;
+  C.a;
 }
 ''');
     await assertHasFix('''
 import '$importUri';
 
 void f() {
-  C.new;
+  C.b;
 }
 ''');
   }
@@ -760,7 +760,7 @@
 }
 ''');
     setPackageData(_rename(['C', 'a'], 'b'));
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 
 void f(D d) {
@@ -782,7 +782,7 @@
 }
 ''');
     setPackageData(_rename(['C', 'a'], 'b'));
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 
 D d = D(a: 2);
@@ -790,50 +790,104 @@
     await assertNoFix();
   }
 
-  Future<void> test_instance_reference_deprecated() async {
+  Future<void> test_instance_reference_direct_deprecated() async {
     setPackageContent('''
 class C {
   @deprecated
-  int get old => 0;
-  int get new => 1;
+  int get a => 0;
+  int get b => 1;
 }
 ''');
-    setPackageData(_rename(['C', 'old'], 'new'));
-    await resolveTestUnit('''
+    setPackageData(_rename(['C', 'a'], 'b'));
+    await resolveTestCode('''
 import '$importUri';
 
 void f(C c) {
-  c.old;
+  c.a;
 }
 ''');
     await assertHasFix('''
 import '$importUri';
 
 void f(C c) {
-  c.new;
+  c.b;
 }
 ''');
   }
 
-  Future<void> test_instance_reference_removed() async {
+  Future<void> test_instance_reference_direct_removed() async {
     setPackageContent('''
 class C {
-  int get new => 1;
+  int get b => 1;
 }
 ''');
-    setPackageData(_rename(['C', 'old'], 'new'));
-    await resolveTestUnit('''
+    setPackageData(_rename(['C', 'a'], 'b'));
+    await resolveTestCode('''
 import '$importUri';
 
 void f(C c) {
-  c.old;
+  c.a;
 }
 ''');
     await assertHasFix('''
 import '$importUri';
 
 void f(C c) {
-  c.new;
+  c.b;
+}
+''');
+  }
+
+  Future<void> test_instance_reference_indirect_deprecated() async {
+    setPackageContent('''
+class C {
+  @deprecated
+  int get a => 0;
+  int get b => 1;
+}
+class D {
+  C c() => C();
+}
+''');
+    setPackageData(_rename(['C', 'a'], 'b'));
+    await resolveTestCode('''
+import '$importUri';
+
+void f(D d) {
+  print(d.c().a);
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+
+void f(D d) {
+  print(d.c().b);
+}
+''');
+  }
+
+  Future<void> test_instance_reference_indirect_removed() async {
+    setPackageContent('''
+class C {
+  int get b => 1;
+}
+class D {
+  C c() => C();
+}
+''');
+    setPackageData(_rename(['C', 'a'], 'b'));
+    await resolveTestCode('''
+import '$importUri';
+
+void f(D d) {
+  print(d.c().a);
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+
+void f(D d) {
+  print(d.c().b);
 }
 ''');
   }
@@ -841,43 +895,43 @@
   Future<void> test_topLevel_reference_deprecated() async {
     setPackageContent('''
 @deprecated
-int get old => 0;
-int get new => 1;
+int get a => 0;
+int get b => 1;
 ''');
-    setPackageData(_rename(['old'], 'new'));
-    await resolveTestUnit('''
+    setPackageData(_rename(['a'], 'b'));
+    await resolveTestCode('''
 import '$importUri';
 
 void f() {
-  old;
+  a;
 }
 ''');
     await assertHasFix('''
 import '$importUri';
 
 void f() {
-  new;
+  b;
 }
 ''');
   }
 
   Future<void> test_topLevel_reference_removed() async {
     setPackageContent('''
-int get new => 1;
+int get b => 1;
 ''');
-    setPackageData(_rename(['old'], 'new'));
-    await resolveTestUnit('''
+    setPackageData(_rename(['a'], 'b'));
+    await resolveTestCode('''
 import '$importUri';
 
 void f() {
-  old;
+  a;
 }
 ''');
     await assertHasFix('''
 import '$importUri';
 
 void f() {
-  new;
+  b;
 }
 ''', errorFilter: ignoreUnusedImport);
   }
@@ -893,17 +947,17 @@
     setPackageContent('''
 class C {
   @deprecated
-  int old() => 0;
-  int new() => 0;
+  int a() => 0;
+  int b() => 0;
 }
 ''');
-    setPackageData(_rename(['C', 'old'], 'new'));
-    await resolveTestUnit('''
+    setPackageData(_rename(['C', 'a'], 'b'));
+    await resolveTestCode('''
 import '$importUri';
 
 class D extends C {
   @override
-  int old() => 0;
+  int a() => 0;
 }
 ''');
     await assertHasFix('''
@@ -911,7 +965,7 @@
 
 class D extends C {
   @override
-  int new() => 0;
+  int b() => 0;
 }
 ''');
   }
@@ -919,16 +973,16 @@
   Future<void> test_instance_override_removed() async {
     setPackageContent('''
 class C {
-  int new() => 0;
+  int b() => 0;
 }
 ''');
-    setPackageData(_rename(['C', 'old'], 'new'));
-    await resolveTestUnit('''
+    setPackageData(_rename(['C', 'a'], 'b'));
+    await resolveTestCode('''
 import '$importUri';
 
 class D extends C {
   @override
-  int old() => 0;
+  int a() => 0;
 }
 ''');
     await assertHasFix('''
@@ -936,7 +990,7 @@
 
 class D extends C {
   @override
-  int new() => 0;
+  int b() => 0;
 }
 ''');
   }
@@ -945,23 +999,23 @@
     setPackageContent('''
 class C {
   @deprecated
-  int old() {}
-  int new() {}
+  int a() {}
+  int b() {}
 }
 ''');
-    setPackageData(_rename(['C', 'old'], 'new'));
-    await resolveTestUnit('''
+    setPackageData(_rename(['C', 'a'], 'b'));
+    await resolveTestCode('''
 import '$importUri';
 
 void f(C c) {
-  c.old();
+  c.a();
 }
 ''');
     await assertHasFix('''
 import '$importUri';
 
 void f(C c) {
-  c.new();
+  c.b();
 }
 ''');
   }
@@ -969,22 +1023,22 @@
   Future<void> test_instance_reference_removed() async {
     setPackageContent('''
 class C {
-  int new() {}
+  int b() {}
 }
 ''');
-    setPackageData(_rename(['C', 'old'], 'new'));
-    await resolveTestUnit('''
+    setPackageData(_rename(['C', 'a'], 'b'));
+    await resolveTestCode('''
 import '$importUri';
 
 void f(C c) {
-  c.old();
+  c.a();
 }
 ''');
     await assertHasFix('''
 import '$importUri';
 
 void f(C c) {
-  c.new();
+  c.b();
 }
 ''');
   }
@@ -993,23 +1047,23 @@
     setPackageContent('''
 class C {
   @deprecated
-  static int old() {}
-  static int new() {}
+  static int a() {}
+  static int b() {}
 }
 ''');
-    setPackageData(_rename(['C', 'old'], 'new'));
-    await resolveTestUnit('''
+    setPackageData(_rename(['C', 'a'], 'b'));
+    await resolveTestCode('''
 import '$importUri';
 
 void f() {
-  C.old();
+  C.a();
 }
 ''');
     await assertHasFix('''
 import '$importUri';
 
 void f() {
-  C.new();
+  C.b();
 }
 ''');
   }
@@ -1017,22 +1071,22 @@
   Future<void> test_static_reference_removed() async {
     setPackageContent('''
 class C {
-  static int new() {}
+  static int b() {}
 }
 ''');
-    setPackageData(_rename(['C', 'old'], 'new'));
-    await resolveTestUnit('''
+    setPackageData(_rename(['C', 'a'], 'b'));
+    await resolveTestCode('''
 import '$importUri';
 
 void f() {
-  C.old();
+  C.a();
 }
 ''');
     await assertHasFix('''
 import '$importUri';
 
 void f() {
-  C.new();
+  C.b();
 }
 ''');
   }
@@ -1050,7 +1104,7 @@
 mixin New {}
 ''');
     setPackageData(_rename(['Old'], 'New'));
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 
 class C with Old {}
@@ -1067,7 +1121,7 @@
 mixin New {}
 ''');
     setPackageData(_rename(['Old'], 'New'));
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 
 class C with Old {}
@@ -1088,43 +1142,43 @@
   Future<void> test_deprecated() async {
     setPackageContent('''
 @deprecated
-int old() {}
-int new() {}
+int a() {}
+int b() {}
 ''');
-    setPackageData(_rename(['old'], 'new'));
-    await resolveTestUnit('''
+    setPackageData(_rename(['a'], 'b'));
+    await resolveTestCode('''
 import '$importUri';
 
 void f() {
-  old();
+  a();
 }
 ''');
     await assertHasFix('''
 import '$importUri';
 
 void f() {
-  new();
+  b();
 }
 ''');
   }
 
   Future<void> test_removed() async {
     setPackageContent('''
-int new() {}
+int b() {}
 ''');
-    setPackageData(_rename(['old'], 'new'));
-    await resolveTestUnit('''
+    setPackageData(_rename(['a'], 'b'));
+    await resolveTestCode('''
 import '$importUri';
 
 void f() {
-  old();
+  a();
 }
 ''');
     await assertHasFix('''
 import '$importUri';
 
 void f() {
-  new();
+  b();
 }
 ''', errorFilter: ignoreUnusedImport);
   }
@@ -1142,7 +1196,7 @@
 typedef New = int Function(int);
 ''');
     setPackageData(_rename(['Old'], 'New'));
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 
 void f(Old o) {}
@@ -1159,7 +1213,7 @@
 typedef New = int Function(int);
 ''');
     setPackageData(_rename(['Old'], 'New'));
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import '$importUri';
 
 void f(Old o) {}
@@ -1182,6 +1236,7 @@
               libraryUris: [Uri.parse(importUri)],
               kind: ElementKindUtilities.fromName(_kind),
               components: components),
+          bulkApply: false,
           changes: [
             Rename(newName: newName),
           ]);
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/test_all.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/test_all.dart
index bd85ebe..4eb8242 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/data_driven/test_all.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/test_all.dart
@@ -4,23 +4,29 @@
 
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import 'add_type_parameter_test.dart' as add_type_parameter_change;
+import 'add_type_parameter_test.dart' as add_type_parameter;
+import 'code_fragment_parser_test.dart' as code_fragment_parser;
 import 'code_template_test.dart' as code_template;
 import 'diagnostics/test_all.dart' as diagnostics;
 import 'end_to_end_test.dart' as end_to_end;
+import 'flutter_use_case_test.dart' as flutter_use_case;
 import 'modify_parameters_test.dart' as modify_parameters;
-import 'rename_test.dart' as rename_change;
+import 'rename_parameter_test.dart' as rename_parameter;
+import 'rename_test.dart' as rename;
 import 'transform_set_manager_test.dart' as transform_set_manager;
 import 'transform_set_parser_test.dart' as transform_set_parser;
 
 void main() {
   defineReflectiveSuite(() {
-    add_type_parameter_change.main();
+    add_type_parameter.main();
+    code_fragment_parser.main();
     code_template.main();
     diagnostics.main();
     end_to_end.main();
+    flutter_use_case.main();
     modify_parameters.main();
-    rename_change.main();
+    rename_parameter.main();
+    rename.main();
     transform_set_manager.main();
     transform_set_parser.main();
   });
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/transform_set_manager_test.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/transform_set_manager_test.dart
index 1e29672..3420914 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/data_driven/transform_set_manager_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/transform_set_manager_test.dart
@@ -8,6 +8,7 @@
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../../../../../abstract_context.dart';
+import '../../../../../services/refactoring/abstract_rename.dart';
 
 void main() {
   defineReflectiveSuite(() {
@@ -22,25 +23,35 @@
   void test_twoFiles() async {
     _addDataFile('p1');
     _addDataFile('p2');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'p1', rootPath: '$workspaceRootPath/p1')
+        ..add(name: 'p2', rootPath: '$workspaceRootPath/p2'),
+    );
+
     addSource('/home/test/pubspec.yaml', '');
-    var testSource = addSource('/home/test/lib/test.dart', '');
-    var result = await session.getResolvedLibrary(testSource.fullName);
+
+    var testFile = convertPath('/home/test/lib/test.dart');
+    addSource(testFile, '');
+    var result = await session.getResolvedLibrary(testFile);
     var sets = manager.forLibrary(result.element);
     expect(sets, hasLength(2));
   }
 
   void test_zeroFiles() async {
-    addTestPackageDependency('p1', '/.pub-cache/p1');
-    addTestPackageDependency('p2', '/.pub-cache/p2');
+    // addTestPackageDependency('p1', '/.pub-cache/p1');
+    // addTestPackageDependency('p2', '/.pub-cache/p2');
     addSource('/home/test/pubspec.yaml', '');
-    var testSource = addSource('/home/test/lib/test.dart', '');
-    var result = await session.getResolvedLibrary(testSource.fullName);
+    var testFile = convertPath('/home/test/lib/test.dart');
+    addSource(testFile, '');
+    var result = await session.getResolvedLibrary(testFile);
     var sets = manager.forLibrary(result.element);
     expect(sets, hasLength(0));
   }
 
   void _addDataFile(String packageName) {
-    addPackageFile(packageName, 'fix_data.yaml', '''
+    newFile('$workspaceRootPath/$packageName/lib/fix_data.yaml', content: '''
 version: 1
 transforms:
 - title: 'Rename A'
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/transform_set_parser_test.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/transform_set_parser_test.dart
index a1341eb..ac2dccb 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/data_driven/transform_set_parser_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/transform_set_parser_test.dart
@@ -2,6 +2,7 @@
 // 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/src/services/correction/fix/data_driven/accessor.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/add_type_parameter.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/code_template.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/element_matcher.dart';
@@ -45,8 +46,8 @@
         expression: '{% p %}'
         variables:
           p:
-            kind: 'argument'
-            index: 1
+            kind: 'fragment'
+            value: 'arguments[1]'
 ''');
     var transforms = _transforms('f');
     expect(transforms, hasLength(1));
@@ -63,8 +64,7 @@
     expect(modification.isPositional, false);
     var components = modification.argumentValue.components;
     expect(components, hasLength(1));
-    var value =
-        (components[0] as TemplateVariable).generator as ArgumentExpression;
+    var value = _accessor(components[0]) as ArgumentAccessor;
     var parameter = value.parameter as PositionalParameterReference;
     expect(parameter.index, 1);
   }
@@ -117,8 +117,8 @@
         expression: '{% p %}'
         variables:
           p:
-            kind: 'argument'
-            index: 1
+            kind: 'fragment'
+            value: 'arguments[1]'
 ''');
     var transforms = _transforms('f');
     expect(transforms, hasLength(1));
@@ -135,8 +135,7 @@
     expect(modification.isPositional, false);
     var components = modification.argumentValue.components;
     expect(components, hasLength(1));
-    var value =
-        (components[0] as TemplateVariable).generator as ArgumentExpression;
+    var value = _accessor(components[0]) as ArgumentAccessor;
     var parameter = value.parameter as PositionalParameterReference;
     expect(parameter.index, 1);
   }
@@ -159,8 +158,8 @@
         expression: '{% p %}'
         variables:
           p:
-            kind: 'argument'
-            index: 1
+            kind: 'fragment'
+            value: 'arguments[1]'
 ''');
     var transforms = _transforms('f');
     expect(transforms, hasLength(1));
@@ -177,8 +176,7 @@
     expect(modification.isPositional, true);
     var components = modification.argumentValue.components;
     expect(components, hasLength(1));
-    var value =
-        (components[0] as TemplateVariable).generator as ArgumentExpression;
+    var value = _accessor(components[0]) as ArgumentAccessor;
     var parameter = value.parameter as PositionalParameterReference;
     expect(parameter.index, 1);
   }
@@ -201,11 +199,11 @@
         expression: '{% a %}({% b %})'
         variables:
           a:
-            kind: 'argument'
-            index: 1
+            kind: 'fragment'
+            value: 'arguments[1]'
           b:
-            kind: 'argument'
-            index: 2
+            kind: 'fragment'
+            value: 'arguments[2]'
 ''');
     var transforms = _transforms('f');
     expect(transforms, hasLength(1));
@@ -222,13 +220,11 @@
     expect(modification.isPositional, true);
     var components = modification.argumentValue.components;
     expect(components, hasLength(4));
-    var extractorA =
-        (components[0] as TemplateVariable).generator as ArgumentExpression;
+    var extractorA = _accessor(components[0]) as ArgumentAccessor;
     var parameterA = extractorA.parameter as PositionalParameterReference;
     expect(parameterA.index, 1);
     expect((components[1] as TemplateText).text, '(');
-    var extractorB =
-        (components[2] as TemplateVariable).generator as ArgumentExpression;
+    var extractorB = _accessor(components[2]) as ArgumentAccessor;
     var parameterB = extractorB.parameter as PositionalParameterReference;
     expect(parameterB.index, 2);
     expect((components[3] as TemplateText).text, ')');
@@ -289,8 +285,8 @@
         expression: '{% t %}'
         variables:
           t:
-            kind: 'argument'
-            name: 'p'
+            kind: 'fragment'
+            value: 'arguments[p]'
 ''');
     var transforms = _transforms('A');
     expect(transforms, hasLength(1));
@@ -304,8 +300,7 @@
 
     var components = change.argumentValue.components;
     expect(components, hasLength(1));
-    var value =
-        (components[0] as TemplateVariable).generator as ArgumentExpression;
+    var value = _accessor(components[0]) as ArgumentAccessor;
     var parameter = value.parameter as NamedParameterReference;
     expect(parameter.name, 'p');
   }
@@ -330,8 +325,8 @@
         expression: '{% t %}'
         variables:
           t:
-            kind: 'argument'
-            index: 2
+            kind: 'fragment'
+            value: 'arguments[2]'
 ''');
     var transforms = _transforms('A');
     expect(transforms, hasLength(1));
@@ -348,12 +343,58 @@
 
     var argumentComponents = change.argumentValue.components;
     expect(argumentComponents, hasLength(1));
-    var value = (argumentComponents[0] as TemplateVariable).generator
-        as ArgumentExpression;
+    var value = _accessor(argumentComponents[0]) as ArgumentAccessor;
     var parameter = value.parameter as PositionalParameterReference;
     expect(parameter.index, 2);
   }
 
+  void test_bulkApply() {
+    parse('''
+version: 1
+transforms:
+- title: 'Rename g'
+  date: 2020-09-10
+  bulkApply: false
+  element:
+    uris: ['test.dart']
+    getter: 'g'
+  changes: []
+''');
+    var transforms = _transforms('g');
+    expect(transforms, hasLength(1));
+    var transform = transforms[0];
+    expect(transform.title, 'Rename g');
+    expect(transform.bulkApply, false);
+    expect(transform.changes, isEmpty);
+  }
+
+  void test_correctOffsetForPlainStrings() {
+    assertErrors('''
+version: 1
+transforms:
+- title: 'Add'
+  date: 2020-09-03
+  element:
+    uris:
+      - 'test.dart'
+    class: 'A'
+  changes:
+    - kind: 'addTypeParameter'
+      index: 0
+      name: 'T'
+      extends:
+        expression: 'Object'
+      argumentValue:
+        expression: '{% t %}'
+        variables:
+          t:
+            kind: 'fragment'
+            value: args
+''', [
+      error(TransformSetErrorCode.unknownAccessor, 361, 4),
+    ]);
+  }
+
   void test_date() {
     parse('''
 version: 1
@@ -542,9 +583,13 @@
     expect(rename.newName, 'B');
   }
 
+  /// Return the first accessor from the given [component].
+  Accessor _accessor(TemplateComponent component) =>
+      ((component as TemplateVariable).generator as CodeFragment).accessors[0];
+
   ElementMatcher _matcher(String name) =>
       ElementMatcher(importedUris: uris, name: name);
 
   List<Transform> _transforms(String name) =>
-      result.transformsFor(_matcher(name));
+      result.transformsFor(_matcher(name), applyingBulkFixes: false);
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/extend_class_for_mixin_test.dart b/pkg/analysis_server/test/src/services/correction/fix/extend_class_for_mixin_test.dart
index b713d0e..1624c7f 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/extend_class_for_mixin_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/extend_class_for_mixin_test.dart
@@ -20,7 +20,7 @@
   FixKind get kind => DartFixKind.EXTEND_CLASS_FOR_MIXIN;
 
   Future<void> test_missingClass_withExtends() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {}
 class B {}
 mixin M on B {}
@@ -30,7 +30,7 @@
   }
 
   Future<void> test_missingClass_withoutExtends_withImplements() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {}
 class B {}
 mixin M on B {}
@@ -45,7 +45,7 @@
   }
 
   Future<void> test_missingClass_withoutExtends_withoutImplements() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {}
 mixin M on A {}
 class C with M {}
@@ -58,7 +58,7 @@
   }
 
   Future<void> test_missingMixin_withExtends() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {}
 mixin M {}
 mixin N on M {}
@@ -69,7 +69,7 @@
 
   @failingTest
   Future<void> test_missingMixin_withoutExtends() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 mixin M {}
 mixin N on M {}
 class C with N {}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/fix_processor.dart b/pkg/analysis_server/test/src/services/correction/fix/fix_processor.dart
index ca983e6..b474c5a 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/fix_processor.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/fix_processor.dart
@@ -7,8 +7,10 @@
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analysis_server/src/services/correction/fix/dart/top_level_declarations.dart';
 import 'package:analysis_server/src/services/correction/fix_internal.dart';
+import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/src/dart/analysis/byte_store.dart';
+import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/dart/error/lint_codes.dart';
 import 'package:analyzer/src/services/available_declarations.dart';
 import 'package:analyzer/src/test_utilities/platform.dart';
@@ -16,16 +18,17 @@
     hide AnalysisError;
 import 'package:analyzer_plugin/utilities/change_builder/change_workspace.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:meta/meta.dart';
 import 'package:test/test.dart';
 
+import '../../../../abstract_context.dart';
 import '../../../../abstract_single_unit.dart';
 
+export 'package:analyzer/src/test_utilities/package_config_file_builder.dart';
+
 /// A base class defining support for writing fix processor tests that are
 /// specific to fixes associated with lints that use the FixKind.
 abstract class FixProcessorLintTest extends FixProcessorTest {
-  /// The offset of the lint marker in the code being analyzed.
-  int lintOffset = -1;
-
   /// Return the lint code being tested.
   String get lintCode;
 
@@ -39,21 +42,6 @@
   void _createAnalysisOptionsFile() {
     createAnalysisOptionsFile(experiments: experiments, lints: [lintCode]);
   }
-
-  /// Find the error that is to be fixed by computing the errors in the file,
-  /// using the [errorFilter] to filter out errors that should be ignored, and
-  /// expecting that there is a single remaining error. The error filter should
-  /// return `true` if the error should not be ignored.
-  @override
-  Future<AnalysisError> _findErrorToFix(
-      bool Function(AnalysisError) errorFilter,
-      {int length}) async {
-    if (lintOffset < 0) {
-      return super._findErrorToFix(errorFilter, length: 0);
-    }
-    return AnalysisError(
-        testSource, lintOffset, length ?? 0, LintCode(lintCode, '<ignored>'));
-  }
 }
 
 /// A base class defining support for writing fix processor tests.
@@ -283,8 +271,10 @@
 
   /// Computes fixes for the given [error] in [testUnit].
   Future<List<Fix>> _computeFixes(AnalysisError error) async {
+    var analysisContext = contextFor(testFile);
+
     var tracker = DeclarationsTracker(MemoryByteStore(), resourceProvider);
-    tracker.addContext(driver.analysisContext);
+    tracker.addContext(analysisContext);
 
     var context = DartFixContextImpl(
       workspace,
@@ -293,7 +283,7 @@
       (name) {
         var provider = TopLevelDeclarationsProvider(tracker);
         provider.doTrackerWork();
-        return provider.get(driver.analysisContext, testFile, name);
+        return provider.get(analysisContext, testFile, name);
       },
     );
     return await DartFixContributor().computeFixes(context);
@@ -351,3 +341,22 @@
     return positions;
   }
 }
+
+mixin WithNullSafetyLintMixin on AbstractContextTest {
+  /// Return the lint code being tested.
+  String get lintCode;
+
+  @override
+  String get testPackageLanguageVersion =>
+      Feature.non_nullable.isEnabledByDefault ? '2.12' : '2.11';
+
+  /// TODO(scheglov) https://github.com/dart-lang/sdk/issues/43837
+  /// Remove when Null Safety is enabled by default.
+  @nonVirtual
+  @override
+  void setUp() {
+    super.setUp();
+    createAnalysisOptionsFile(
+        experiments: [EnableString.non_nullable], lints: [lintCode]);
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/fix_test.dart b/pkg/analysis_server/test/src/services/correction/fix/fix_test.dart
index 8b2ae57..b66fd12 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/fix_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/fix_test.dart
@@ -20,7 +20,7 @@
   FixKind get kind => fail('kind should not be requested');
 
   Future<void> test_malformedTypeTest() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main(p) {
   p i s Null;
 }''');
diff --git a/pkg/analysis_server/test/src/services/correction/fix/import_async_test.dart b/pkg/analysis_server/test/src/services/correction/fix/import_async_test.dart
index 592952f..5fa217e 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/import_async_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/import_async_test.dart
@@ -24,7 +24,7 @@
 environment:
   sdk: ^2.0.0
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 Future<int> zero() async => 0;
 ''');
     await assertHasFix('''
@@ -39,7 +39,7 @@
 environment:
   sdk: ^2.0.0
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 Stream<int> zero() => null;
 ''');
     await assertHasFix('''
diff --git a/pkg/analysis_server/test/src/services/correction/fix/import_library_prefix_test.dart b/pkg/analysis_server/test/src/services/correction/fix/import_library_prefix_test.dart
index 73e5996..c1ffcce 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/import_library_prefix_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/import_library_prefix_test.dart
@@ -20,7 +20,7 @@
   FixKind get kind => DartFixKind.IMPORT_LIBRARY_PREFIX;
 
   Future<void> test_withClass() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'dart:collection' as pref;
 main() {
   pref.HashMap s = null;
@@ -45,7 +45,7 @@
   static String m() => '';
 }
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'lib.dart' as p;
 void f(p.C c) {
   print(E.m());
@@ -60,7 +60,7 @@
   }
 
   Future<void> test_withTopLevelVariable() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'dart:math' as pref;
 main() {
   print(pref.e);
diff --git a/pkg/analysis_server/test/src/services/correction/fix/import_library_project_test.dart b/pkg/analysis_server/test/src/services/correction/fix/import_library_project_test.dart
index 86dce04..38c113a 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/import_library_project_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/import_library_project_test.dart
@@ -7,6 +7,7 @@
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import '../../../../services/refactoring/abstract_rename.dart';
 import 'fix_processor.dart';
 
 void main() {
@@ -27,7 +28,7 @@
 class A {}
 class B {}
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'lib.dart' show A;
 main() {
   A a;
@@ -44,7 +45,7 @@
   const Test();
 }
 ''');
-    await resolveTestUnit(r'''
+    await resolveTestCode(r'''
 import 'package:$foo/foo.dart';
 
 void f() {
@@ -65,13 +66,19 @@
   }
 
   Future<void> test_lib() async {
-    addPackageFile('my_pkg', 'a.dart', 'class Test {}');
+    newFile('/.pub-cache/my_pkg/lib/a.dart', content: 'class Test {}');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'my_pkg', rootPath: '/.pub-cache/my_pkg'),
+    );
+
     newFile('/home/test/pubspec.yaml', content: r'''
 dependencies:
   my_pkg: any
 ''');
 
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   Test test = null;
   print(test);
@@ -89,17 +96,23 @@
   }
 
   Future<void> test_lib_extension() async {
-    addPackageFile('my_pkg', 'a.dart', '''
+    newFile('/.pub-cache/my_pkg/lib/a.dart', content: '''
 extension E on int {
   static String m() => '';
 }
 ''');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'my_pkg', rootPath: '/.pub-cache/my_pkg'),
+    );
+
     newFile('/home/test/pubspec.yaml', content: r'''
 dependencies:
   my_pkg: any
 ''');
 
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f() {
   print(E.m());
 }
@@ -115,12 +128,18 @@
   }
 
   Future<void> test_lib_src() async {
-    addPackageFile('my_pkg', 'src/a.dart', 'class Test {}');
+    newFile('/.pub-cache/my_pkg/lib/src/a.dart', content: 'class Test {}');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'my_pkg', rootPath: '/.pub-cache/my_pkg'),
+    );
+
     newFile('/home/test/pubspec.yaml', content: r'''
 dependencies:
   my_pkg: any
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   Test test = null;
   print(test);
@@ -131,7 +150,7 @@
 
   Future<void> test_notInLib() async {
     addSource('/home/other/test/lib.dart', 'class Test {}');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   Test t;
   print(t);
@@ -144,7 +163,7 @@
     addSource('/home/test/lib/a.dart', '''
 class Foo {}
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() { new Foo(); }
 ''');
     await assertHasFix('''
@@ -160,7 +179,7 @@
     addSource('/home/test/lib/dir/a.dart', '''
 class Foo {}
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() { new Foo(); }
 ''');
     await assertHasFix('''
@@ -177,7 +196,7 @@
 class Foo {}
 ''');
     testFile = convertPath('/home/test/lib/dir/test.dart');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() { new Foo(); }
 ''');
     await assertHasFix('''
@@ -196,7 +215,7 @@
   const Test(int p);
 }
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 @Test(0)
 main() {
 }
@@ -214,7 +233,7 @@
     addSource('/home/test/lib/lib.dart', '''
 class Test {}
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void f() {
   try {
     print(1);
@@ -246,7 +265,7 @@
 class One {}
 class Two {}
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:test/b.dart' show Two;
 main () {
   new Two();
@@ -269,7 +288,7 @@
 library lib;
 class Test {}
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   Test t = null;
   print(t);
@@ -291,7 +310,7 @@
 library lib;
 class Test {}
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   Test t = null;
   print(t);
@@ -313,7 +332,7 @@
 library lib;
 class Test {}
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   Test t = null;
   print(t);
@@ -335,7 +354,7 @@
   const Test();
 }
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   return const Test();
 }
@@ -355,7 +374,7 @@
   const Test.named();
 }
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   const Test.named();
 }
@@ -375,7 +394,7 @@
   const Test();
 }
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   return Test();
 }
@@ -395,7 +414,7 @@
   const Test();
 }
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   return new Test();
 }
@@ -415,7 +434,7 @@
   Test.named();
 }
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   new Test.named();
 }
@@ -434,7 +453,7 @@
 library lib;
 myFunction() {}
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   myFunction();
 }
@@ -450,7 +469,7 @@
 
   Future<void> test_withFunction_functionTopLevelVariable() async {
     addSource('/home/test/lib/lib.dart', 'var myFunction = () {};');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   myFunction();
 }
@@ -466,7 +485,7 @@
 
   Future<void> test_withFunction_functionTopLevelVariableIdentifier() async {
     addSource('/home/test/lib/lib.dart', 'var myFunction = () {};');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   myFunction;
 }
@@ -485,7 +504,7 @@
 library lib;
 myFunction() {}
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   myFunction;
 }
@@ -502,7 +521,7 @@
   @failingTest
   Future<void> test_withFunction_nonFunctionType() async {
     addSource('/home/test/lib/lib.dart', 'int zero = 0;');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   zero();
 }
@@ -515,7 +534,7 @@
 library lib;
 myFunction() {}
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   main() {
     myFunction();
@@ -538,7 +557,7 @@
 library lib;
 typedef MyFunction();
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   MyFunction t = null;
   print(t);
@@ -558,7 +577,7 @@
     addSource('/home/test/lib/lib.dart', '''
 mixin Test {}
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class X = Object with Test;
 ''');
     await assertHasFix('''
@@ -573,7 +592,7 @@
 library lib;
 int MY_VAR = 42;
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   print(MY_VAR);
 }
@@ -594,13 +613,19 @@
   FixKind get kind => DartFixKind.IMPORT_LIBRARY_PROJECT2;
 
   Future<void> test_lib() async {
-    addPackageFile('my_pkg', 'a.dart', "export 'b.dart';");
-    addPackageFile('my_pkg', 'b.dart', 'class Test {}');
+    newFile('/.pub-cache/my_pkg/lib/a.dart', content: "export 'b.dart';");
+    newFile('/.pub-cache/my_pkg/lib/b.dart', content: 'class Test {}');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'my_pkg', rootPath: '/.pub-cache/my_pkg'),
+    );
+
     newFile('/home/test/pubspec.yaml', content: r'''
 dependencies:
   my_pkg: any
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   Test test = null;
   print(test);
@@ -617,13 +642,19 @@
   }
 
   Future<void> test_lib_src() async {
-    addPackageFile('my_pkg', 'a.dart', "export 'src/b.dart';");
-    addPackageFile('my_pkg', 'src/b.dart', 'class Test {}');
+    newFile('/.pub-cache/my_pkg/lib/a.dart', content: "export 'src/b.dart';");
+    newFile('/.pub-cache/my_pkg/lib/src/b.dart', content: 'class Test {}');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'my_pkg', rootPath: '/.pub-cache/my_pkg'),
+    );
+
     newFile('/home/test/pubspec.yaml', content: r'''
 dependencies:
   my_pkg: any
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   Test test = null;
   print(test);
@@ -640,17 +671,23 @@
   }
 
   Future<void> test_lib_src_extension() async {
-    addPackageFile('my_pkg', 'a.dart', "export 'src/b.dart';");
-    addPackageFile('my_pkg', 'src/b.dart', '''
+    newFile('/.pub-cache/my_pkg/lib/a.dart', content: "export 'src/b.dart';");
+    newFile('/.pub-cache/my_pkg/lib/src/b.dart', content: '''
 extension E on int {
   static String m() => '';
 }
 ''');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'my_pkg', rootPath: '/.pub-cache/my_pkg'),
+    );
+
     newFile('/home/test/pubspec.yaml', content: r'''
 dependencies:
   my_pkg: any
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f() {
   print(E.m());
 }
@@ -671,12 +708,18 @@
   FixKind get kind => DartFixKind.IMPORT_LIBRARY_PROJECT3;
 
   Future<void> test_inLibSrc_differentContextRoot() async {
-    addPackageFile('bbb', 'b1.dart', r'''
+    newFile('/.pub-cache/bbb/lib/b1.dart', content: r'''
 import 'src/b2.dart';
 class A {}
 ''');
-    addPackageFile('bbb', 'src/b2.dart', 'class Test {}');
-    await resolveTestUnit('''
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'bbb', rootPath: '/.pub-cache/bbb'),
+    );
+
+    newFile('/.pub-cache/bbb/lib/src/b2.dart', content: 'class Test {}');
+    await resolveTestCode('''
 import 'package:bbb/b1.dart';
 main() {
   Test t;
@@ -689,7 +732,7 @@
 
   Future<void> test_inLibSrc_thisContextRoot() async {
     addSource('/home/test/lib/src/lib.dart', 'class Test {}');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   Test t;
   print(t);
@@ -711,7 +754,7 @@
   static String m() => '';
 }
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f() {
   print(E.m());
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/import_library_sdk_test.dart b/pkg/analysis_server/test/src/services/correction/fix/import_library_sdk_test.dart
index 600d792..8b0b7e5 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/import_library_sdk_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/import_library_sdk_test.dart
@@ -21,7 +21,7 @@
   FixKind get kind => DartFixKind.IMPORT_LIBRARY_SDK;
 
   Future<void> test_alreadyImported_sdk() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'dart:collection' show HashMap;
 main() {
   HashMap s = null;
@@ -33,7 +33,7 @@
   }
 
   Future<void> test_withClass_asExpression() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main(p) {
   p as HashMap;
 }
@@ -48,7 +48,7 @@
   }
 
   Future<void> test_withClass_extends() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class MyCompleter extends Completer<String> {}
 ''');
     await assertHasFix('''
@@ -59,7 +59,7 @@
   }
 
   Future<void> test_withClass_implements() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class MyCompleter implements Completer<String> {}
 ''');
     await assertHasFix('''
@@ -70,7 +70,7 @@
   }
 
   Future<void> test_withClass_instanceCreation_explicitNew() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class C {
   foo() {
     new HashMap();
@@ -90,7 +90,7 @@
 
   Future<void>
       test_withClass_instanceCreation_explicitNew_namedConstructor() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class C {
   foo() {
     new Completer.sync(0);
@@ -109,7 +109,7 @@
   }
 
   Future<void> test_withClass_instanceCreation_implicitNew() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class C {
   foo() {
     HashMap();
@@ -129,7 +129,7 @@
 
   Future<void>
       test_withClass_instanceCreation_implicitNew_namedConstructor() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class C {
   foo() {
     Completer.sync(0);
@@ -148,7 +148,7 @@
   }
 
   Future<void> test_withClass_invocationTarget() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   Timer.run(null);
 }
@@ -163,7 +163,7 @@
   }
 
   Future<void> test_withClass_IsExpression() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main(p) {
   p is Completer;
 }
@@ -178,7 +178,7 @@
   }
 
   Future<void> test_withClass_itemOfList() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   var a = [Completer];
   print(a);
@@ -195,7 +195,7 @@
   }
 
   Future<void> test_withClass_itemOfList_inAnnotation() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class MyAnnotation {
   const MyAnnotation(a, b);
 }
@@ -216,7 +216,7 @@
   }
 
   Future<void> test_withClass_typeAnnotation() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   Completer f = null;
   print(f);
@@ -233,7 +233,7 @@
   }
 
   Future<void> test_withClass_typeAnnotation_PrefixedIdentifier() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   Timer.run;
 }
@@ -248,7 +248,7 @@
   }
 
   Future<void> test_withClass_typeArgument() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   List<Completer> completers = [];
   print(completers);
@@ -265,7 +265,7 @@
   }
 
   Future<void> test_withClass_with() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class MyCompleter with Completer<String> {}
 ''');
     await assertHasFix('''
@@ -276,7 +276,7 @@
   }
 
   Future<void> test_withTopLevelVariable() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   print(pi);
 }
@@ -291,7 +291,7 @@
   }
 
   Future<void> test_withTopLevelVariable_annotation() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 @pi
 main() {
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/import_library_show_test.dart b/pkg/analysis_server/test/src/services/correction/fix/import_library_show_test.dart
index 5afd7f5..e54adba 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/import_library_show_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/import_library_show_test.dart
@@ -26,7 +26,7 @@
   String m() => '';
 }
 ''');
-    await resolveTestUnit(r'''
+    await resolveTestCode(r'''
 import 'lib.dart' show A;
 void f(A a) {
   print('$a ${E(3).m()}');
@@ -45,7 +45,7 @@
 class A {}
 class B {}
 ''');
-    await resolveTestUnit(r'''
+    await resolveTestCode(r'''
 import 'lib.dart' show A;
 main() {
   A a;
@@ -64,7 +64,7 @@
   }
 
   Future<void> test_sdk() async {
-    await resolveTestUnit(r'''
+    await resolveTestCode(r'''
 import 'dart:collection' show HashMap;
 main() {
   HashMap s = null;
@@ -89,7 +89,7 @@
   static String m() => '';
 }
 ''');
-    await resolveTestUnit(r'''
+    await resolveTestCode(r'''
 import 'lib.dart' show A;
 void f(A a) {
   print('$a ${E.m()}');
diff --git a/pkg/analysis_server/test/src/services/correction/fix/inline_invocation_test.dart b/pkg/analysis_server/test/src/services/correction/fix/inline_invocation_test.dart
index 82168ee..bb8dc37 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/inline_invocation_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/inline_invocation_test.dart
@@ -25,7 +25,7 @@
 
   /// More coverage in the `inline_invocation_test.dart` assist test.
   Future<void> test_add_emptyTarget() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var l = []..add('a')..add('b');
 ''');
     await assertHasFix('''
diff --git a/pkg/analysis_server/test/src/services/correction/fix/inline_typedef_test.dart b/pkg/analysis_server/test/src/services/correction/fix/inline_typedef_test.dart
index 3eeb26c..39d4fdb 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/inline_typedef_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/inline_typedef_test.dart
@@ -4,7 +4,6 @@
 
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analysis_server/src/services/linter/lint_names.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -26,7 +25,7 @@
   String get lintCode => LintNames.avoid_private_typedef_functions;
 
   Future<void> test_generic_parameter_optionalNamed() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 typedef _F = Function({int i});
 void g(_F f) {}
 ''');
@@ -36,7 +35,7 @@
   }
 
   Future<void> test_generic_parameter_optionalPositional_withName() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 typedef _F = Function([int i]);
 void g(_F f) {}
 ''');
@@ -46,7 +45,7 @@
   }
 
   Future<void> test_generic_parameter_optionalPositional_withoutName() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 typedef _F = Function([int]);
 void g(_F f) {}
 ''');
@@ -56,7 +55,7 @@
   }
 
   Future<void> test_generic_parameter_requiredPositional_withName() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 typedef _F = Function(int i);
 void g(_F f) {}
 ''');
@@ -66,7 +65,7 @@
   }
 
   Future<void> test_generic_parameter_requiredPositional_withoutName() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 typedef _F = Function(int);
 void g(_F f) {}
 ''');
@@ -76,7 +75,7 @@
   }
 
   Future<void> test_generic_returnType() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 typedef _F = void Function();
 void g(_F f) {}
 ''');
@@ -86,7 +85,7 @@
   }
 
   Future<void> test_generic_typeParameters() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 typedef _F = Function<T>(T);
 void g(_F f) {}
 ''');
@@ -96,7 +95,7 @@
   }
 
   Future<void> test_nonGeneric_parameter_requiredPositional_typed() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 typedef _F(int i);
 void g(_F f) {}
 ''');
@@ -106,7 +105,7 @@
   }
 
   Future<void> test_nonGeneric_parameter_requiredPositional_untyped() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 typedef _F(i);
 void g(_F f) {}
 ''');
@@ -116,7 +115,7 @@
   }
 
   Future<void> test_nonGeneric_returnType() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 typedef void _F();
 void g(_F f) {}
 ''');
@@ -126,7 +125,7 @@
   }
 
   Future<void> test_nonGeneric_typeParameters() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 typedef _F<T>(T t);
 void g(_F f) {}
 ''');
@@ -137,12 +136,10 @@
 }
 
 @reflectiveTest
-class InlineTypedefWithNullSafetyTest extends InlineTypedefTest {
-  @override
-  List<String> get experiments => [EnableString.non_nullable];
-
+class InlineTypedefWithNullSafetyTest extends InlineTypedefTest
+    with WithNullSafetyLintMixin {
   Future<void> test_generic_parameter_requiredNamed() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 typedef _F = Function({required int i});
 void g(_F f) {}
 ''');
@@ -152,7 +149,7 @@
   }
 
   Future<void> test_nonGeneric_parameter_requiredNamed() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 typedef _F({required int i});
 void g(_F f) {}
 ''');
diff --git a/pkg/analysis_server/test/src/services/correction/fix/insert_semicolon_test.dart b/pkg/analysis_server/test/src/services/correction/fix/insert_semicolon_test.dart
index 3e0fc37..937ff59 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/insert_semicolon_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/insert_semicolon_test.dart
@@ -20,7 +20,7 @@
   FixKind get kind => DartFixKind.INSERT_SEMICOLON;
 
   Future<void> test_expectedToken_semicolon() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   print(0)
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/make_class_abstract_test.dart b/pkg/analysis_server/test/src/services/correction/fix/make_class_abstract_test.dart
index cc90674..f5927f9 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/make_class_abstract_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/make_class_abstract_test.dart
@@ -20,7 +20,7 @@
   FixKind get kind => DartFixKind.MAKE_CLASS_ABSTRACT;
 
   Future<void> test_declaresAbstractMethod() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   m();
 }
@@ -33,7 +33,7 @@
   }
 
   Future<void> test_inheritsAbstractMethod() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 abstract class A {
   m();
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/make_field_not_final_test.dart b/pkg/analysis_server/test/src/services/correction/fix/make_field_not_final_test.dart
index d0b89d3..941643a 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/make_field_not_final_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/make_field_not_final_test.dart
@@ -20,7 +20,7 @@
   FixKind get kind => DartFixKind.MAKE_FIELD_NOT_FINAL;
 
   Future<void> test_hasType() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   final int fff = 1;
   main() {
@@ -39,7 +39,7 @@
   }
 
   Future<void> test_noType() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   final fff = 1;
   main() {
diff --git a/pkg/analysis_server/test/src/services/correction/fix/make_final_test.dart b/pkg/analysis_server/test/src/services/correction/fix/make_final_test.dart
index 7486e14..fbee41d 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/make_final_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/make_final_test.dart
@@ -4,7 +4,6 @@
 
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analysis_server/src/services/linter/lint_names.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -27,7 +26,7 @@
   String get lintCode => LintNames.prefer_final_fields;
 
   Future<void> test_field_type() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class C {
   int _f = 2;
   int get g => _f;
@@ -42,7 +41,7 @@
   }
 
   Future<void> test_field_var() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class C {
   var _f = 2;
   int get g => _f;
@@ -58,10 +57,8 @@
 }
 
 @reflectiveTest
-class PreferFinalFieldsWithNullSafetyTest extends FixProcessorLintTest {
-  @override
-  List<String> get experiments => [EnableString.non_nullable];
-
+class PreferFinalFieldsWithNullSafetyTest extends FixProcessorLintTest
+    with WithNullSafetyLintMixin {
   @override
   FixKind get kind => DartFixKind.MAKE_FINAL;
 
@@ -69,7 +66,7 @@
   String get lintCode => LintNames.prefer_final_fields;
 
   Future<void> test_lateField_type() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class C {
   late int _f = 2;
   int get g => _f;
@@ -84,7 +81,7 @@
   }
 
   Future<void> test_lateField_var() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class C {
   late var _f = 2;
   int get g => _f;
@@ -108,7 +105,7 @@
   String get lintCode => LintNames.prefer_final_in_for_each;
 
   Future<void> test_noType() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void fn() {
   for (var i in [1, 2, 3]) {
     print(i);
@@ -125,7 +122,7 @@
   }
 
   Future<void> test_type() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void fn() {
   for (int i in [1, 2, 3]) {
     print(i);
diff --git a/pkg/analysis_server/test/src/services/correction/fix/make_return_type_nullable_test.dart b/pkg/analysis_server/test/src/services/correction/fix/make_return_type_nullable_test.dart
index 6181ed4..e661f34 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/make_return_type_nullable_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/make_return_type_nullable_test.dart
@@ -3,10 +3,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/src/services/correction/fix.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import '../../../../abstract_context.dart';
 import 'fix_processor.dart';
 
 void main() {
@@ -16,15 +16,13 @@
 }
 
 @reflectiveTest
-class MakeReturnTypeNullableTest extends FixProcessorTest {
-  @override
-  List<String> get experiments => [EnableString.non_nullable];
-
+class MakeReturnTypeNullableTest extends FixProcessorTest
+    with WithNullSafetyMixin {
   @override
   FixKind get kind => DartFixKind.MAKE_RETURN_TYPE_NULLABLE;
 
   Future<void> test_function_async() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 Future<String> f(String? s) async {
   return s;
 }
@@ -37,7 +35,7 @@
   }
 
   Future<void> test_function_asyncStar() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 Stream<String> f(String? s) async* {
   yield s;
 }
@@ -50,7 +48,7 @@
   }
 
   Future<void> test_function_sync() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 String f(String? s) {
   return s;
 }
@@ -63,7 +61,7 @@
   }
 
   Future<void> test_function_syncStar() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 Iterable<String> f(String? s) sync* {
   yield s;
 }
@@ -76,7 +74,7 @@
   }
 
   Future<void> test_getter_sync() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class C {
   String? f;
   String get g => f;
@@ -91,7 +89,7 @@
   }
 
   Future<void> test_incompatibilityIsNotLimitedToNullability() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 int f() {
   return '';
 }
@@ -100,7 +98,7 @@
   }
 
   Future<void> test_localFunction_sync() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void f() {
   String g(String? s) {
     return s;
@@ -119,7 +117,7 @@
   }
 
   Future<void> test_method_sync() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class C {
   String m(String? s) {
     return s;
@@ -136,7 +134,7 @@
   }
 
   Future<void> test_returnTypeHasTypeArguments() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 List<String> f() {
   return null;
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/make_variable_not_final_test.dart b/pkg/analysis_server/test/src/services/correction/fix/make_variable_not_final_test.dart
index 441cbbf..c87fde3 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/make_variable_not_final_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/make_variable_not_final_test.dart
@@ -20,7 +20,7 @@
   FixKind get kind => DartFixKind.MAKE_VARIABLE_NOT_FINAL;
 
   Future<void> test_hasType() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   final int fff = 1;
   fff = 2;
@@ -37,7 +37,7 @@
   }
 
   Future<void> test_noType() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   final fff = 1;
   fff = 2;
diff --git a/pkg/analysis_server/test/src/services/correction/fix/make_variable_nullable_test.dart b/pkg/analysis_server/test/src/services/correction/fix/make_variable_nullable_test.dart
index 133daf5..804f106 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/make_variable_nullable_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/make_variable_nullable_test.dart
@@ -3,10 +3,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/src/services/correction/fix.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import '../../../../abstract_context.dart';
 import 'fix_processor.dart';
 
 void main() {
@@ -16,15 +16,64 @@
 }
 
 @reflectiveTest
-class MakeVariableNullableTest extends FixProcessorTest {
-  @override
-  List<String> get experiments => [EnableString.non_nullable];
-
+class MakeVariableNullableTest extends FixProcessorTest
+    with WithNullSafetyMixin {
   @override
   FixKind get kind => DartFixKind.MAKE_VARIABLE_NULLABLE;
 
+  Future<void> test_fieldFormalParameter() async {
+    await resolveTestCode('''
+class C {
+  String? s;
+  C({String this.s});
+}
+''');
+    // TODO(srawlins): Remove the type if the quick fix as is would use the same
+    // type as the field's type.
+    await assertHasFix('''
+class C {
+  String? s;
+  C({String? this.s});
+}
+''');
+  }
+
+  Future<void> test_fieldFormalParameter_functionTyped() async {
+    await resolveTestCode('''
+class C {
+  String Function()? s;
+  C({String this.s()});
+}
+''');
+    await assertHasFix('''
+class C {
+  String Function()? s;
+  C({String this.s()?});
+}
+''');
+  }
+
+  Future<void> test_fieldFormalParameter_untyped() async {
+    await resolveTestCode('''
+class C {
+  String s;
+  C({this.s});
+}
+''');
+    await assertNoFix();
+  }
+
+  Future<void> test_functionTypedFormalParameter() async {
+    await resolveTestCode('''
+void f({String s()}) {}
+''');
+    await assertHasFix('''
+void f({String s()?}) {}
+''');
+  }
+
   Future<void> test_lhsNotIdentifier() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void f(C c) {
   c.s = null;
 }
@@ -36,7 +85,7 @@
   }
 
   Future<void> test_lhsNotLocalVariable() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var s = '';
 void f() {
   s = null;
@@ -47,7 +96,7 @@
   }
 
   Future<void> test_multipleVariables() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void f() {
   var s = '', t = '';
   s = null;
@@ -59,9 +108,9 @@
   }
 
   Future<void> test_noKeywordOrType() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void f() {
-  late s = '';
+  late var s = '';
   s = null;
   print(s);
 }
@@ -75,8 +124,44 @@
 ''');
   }
 
+  Future<void> test_simpleFormalParameter() async {
+    await resolveTestCode('''
+void f({String s}) {}
+''');
+    await assertHasFix('''
+void f({String? s}) {}
+''');
+  }
+
+  Future<void> test_simpleFormalParameter_final() async {
+    await resolveTestCode('''
+void f({final String s}) {}
+''');
+    await assertHasFix('''
+void f({final String? s}) {}
+''');
+  }
+
+  Future<void> test_simpleFormalParameter_functionType() async {
+    await resolveTestCode('''
+void f({String Function() s}) {}
+''');
+    await assertHasFix('''
+void f({String Function()? s}) {}
+''');
+  }
+
+  Future<void> test_simpleFormalParameter_typeVariable() async {
+    await resolveTestCode('''
+void f<T>({T s}) {}
+''');
+    await assertHasFix('''
+void f<T>({T? s}) {}
+''');
+  }
+
   Future<void> test_type() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void f() {
   String s = '';
   s = null;
@@ -93,7 +178,7 @@
   }
 
   Future<void> test_var() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void f() {
   var s = '';
   s = null;
diff --git a/pkg/analysis_server/test/src/services/correction/fix/move_type_arguments_to_class_test.dart b/pkg/analysis_server/test/src/services/correction/fix/move_type_arguments_to_class_test.dart
index cbbf990..c3b99ff 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/move_type_arguments_to_class_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/move_type_arguments_to_class_test.dart
@@ -20,7 +20,7 @@
   FixKind get kind => DartFixKind.MOVE_TYPE_ARGUMENTS_TO_CLASS;
 
   Future<void> test_explicitConst() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   const C.named<int>();
 }
@@ -39,7 +39,7 @@
   }
 
   Future<void> test_explicitNew() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   new C.named<int>();
 }
@@ -58,7 +58,7 @@
   }
 
   Future<void> test_explicitNew_alreadyThere() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   new C<String>.named<int>();
 }
@@ -70,7 +70,7 @@
   }
 
   Future<void> test_explicitNew_wrongNumber() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   new C.named<int, String>();
 }
@@ -82,7 +82,7 @@
   }
 
   Future<void> test_implicitConst() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   const C c = C.named<int>();
   print(c);
@@ -103,7 +103,7 @@
   }
 
   Future<void> test_implicitNew() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   C.named<int>();
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/organize_imports_test.dart b/pkg/analysis_server/test/src/services/correction/fix/organize_imports_test.dart
index 868dbab..941bdf4 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/organize_imports_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/organize_imports_test.dart
@@ -24,7 +24,7 @@
   String get lintCode => LintNames.directives_ordering;
 
   Future<void> test_organizeImports() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 //ignore_for_file: unused_import
 import 'dart:io';
 
diff --git a/pkg/analysis_server/test/src/services/correction/fix/qualify_reference_test.dart b/pkg/analysis_server/test/src/services/correction/fix/qualify_reference_test.dart
index 9e7d7ec..5c92c08 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/qualify_reference_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/qualify_reference_test.dart
@@ -20,7 +20,7 @@
   FixKind get kind => DartFixKind.QUALIFY_REFERENCE;
 
   Future<void> test_class_direct() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class C {
   static void m() {}
 }
@@ -48,7 +48,7 @@
   static void m() {}
 }
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'a.dart';
 class B extends A {
   void f() {
@@ -65,7 +65,7 @@
   static void m() {}
 }
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'a.dart' as a;
 class B extends a.A {
   void f() {
@@ -77,7 +77,7 @@
   }
 
   Future<void> test_class_indirect() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   static void m() {}
 }
@@ -113,7 +113,7 @@
 import 'a.dart';
 class B extends A {}
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'b.dart';
 class C extends B {
   void f() {
@@ -125,7 +125,7 @@
   }
 
   Future<void> test_extension_direct() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class C {
   static void m() {}
 }
@@ -153,7 +153,7 @@
   static void m() {}
 }
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'a.dart';
 extension E on A {
   void f() {
@@ -170,7 +170,7 @@
   static void m() {}
 }
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'a.dart' as a;
 extension E on a.A {
   void f() {
@@ -182,7 +182,7 @@
   }
 
   Future<void> test_extension_indirect() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   static void m() {}
 }
@@ -218,7 +218,7 @@
 import 'a.dart';
 class B extends A {}
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'b.dart';
 extension E on B {
   void f() {
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_annotation_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_annotation_test.dart
index f69c58b..b693ead 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/remove_annotation_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_annotation_test.dart
@@ -22,11 +22,11 @@
   @override
   void setUp() {
     super.setUp();
-    addMetaPackage();
+    writeTestPackageConfig(meta: true);
   }
 
   Future<void> test_factory() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:meta/meta.dart';
 
 @factory
@@ -40,7 +40,7 @@
   }
 
   Future<void> test_immutable() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:meta/meta.dart';
 
 @immutable
@@ -54,7 +54,7 @@
   }
 
   Future<void> test_literal() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:meta/meta.dart';
 
 @literal
@@ -68,7 +68,7 @@
   }
 
   Future<void> test_override_field() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   @override
   String name;
@@ -82,7 +82,7 @@
   }
 
   Future<void> test_override_getter() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   @override
   int get zero => 0;
@@ -96,7 +96,7 @@
   }
 
   Future<void> test_override_method() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   @override
   void m() {}
@@ -110,7 +110,7 @@
   }
 
   Future<void> test_override_setter() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   @override
   set value(v) {}
@@ -124,7 +124,7 @@
   }
 
   Future<void> test_required_namedWithDefault() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:meta/meta.dart';
 
 f({@required int x = 0}) {}
@@ -137,7 +137,7 @@
   }
 
   Future<void> test_required_positional() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:meta/meta.dart';
 
 f([@required int x]) {}
@@ -150,7 +150,7 @@
   }
 
   Future<void> test_required_required() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:meta/meta.dart';
 
 f(@required int x) {}
@@ -163,7 +163,7 @@
   }
 
   Future<void> test_sealed() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:meta/meta.dart';
 
 @sealed
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_argument_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_argument_test.dart
index f324585..cb1dc00 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/remove_argument_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_argument_test.dart
@@ -24,7 +24,7 @@
   String get lintCode => LintNames.avoid_redundant_argument_values;
 
   Future<void> test_named_param() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void f({bool valWithDefault = true, bool val}) {}
 
 void main() {
@@ -41,7 +41,7 @@
   }
 
   Future<void> test_named_param_2() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void f({bool valWithDefault = true, bool val}) {}
 
 void main() {
@@ -58,7 +58,7 @@
   }
 
   Future<void> test_optional_positional() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void g(int x, [int y = 0]) {}
 
 void main() {
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_await_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_await_test.dart
index a9857ed..97d8bf8 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/remove_await_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_await_test.dart
@@ -24,7 +24,7 @@
   String get lintCode => LintNames.await_only_futures;
 
   Future<void> test_intLiteral() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 bad() async {
   print(await 23);
 }
@@ -37,7 +37,7 @@
   }
 
   Future<void> test_stringLiteral() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 bad() async {
   print(await 'hola');
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_comparison_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_comparison_test.dart
index 67590ce..356d591 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/remove_comparison_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_comparison_test.dart
@@ -3,10 +3,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/src/services/correction/fix.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import '../../../../abstract_context.dart';
 import 'fix_processor.dart';
 
 void main() {
@@ -16,15 +16,12 @@
 }
 
 @reflectiveTest
-class RemoveComparisonTest extends FixProcessorTest {
-  @override
-  List<String> get experiments => [EnableString.non_nullable];
-
+class RemoveComparisonTest extends FixProcessorTest with WithNullSafetyMixin {
   @override
   FixKind get kind => DartFixKind.REMOVE_COMPARISON;
 
   Future<void> test_assertInitializer_first() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class C {
   String t;
   C(String s) : assert(s != null), t = s;
@@ -39,7 +36,7 @@
   }
 
   Future<void> test_assertInitializer_last() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class C {
   String t;
   C(String s) : t = s, assert(s != null);
@@ -54,7 +51,7 @@
   }
 
   Future<void> test_assertInitializer_middle() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class C {
   String t;
   String u;
@@ -71,7 +68,7 @@
   }
 
   Future<void> test_assertInitializer_only() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class C {
   C(String s) : assert(s != null);
 }
@@ -84,7 +81,7 @@
   }
 
   Future<void> test_assertStatement() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void f(String s) {
   assert(s != null);
   print(s);
@@ -98,7 +95,7 @@
   }
 
   Future<void> test_binaryExpression_and_left() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void f(String s) {
   print(s != null && s.isNotEmpty);
 }
@@ -111,7 +108,7 @@
   }
 
   Future<void> test_binaryExpression_and_right() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void f(String s) {
   print(s.isNotEmpty && s != null);
 }
@@ -124,7 +121,7 @@
   }
 
   Future<void> test_binaryExpression_or_left() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void f(String s) {
   print(s == null || s.isEmpty);
 }
@@ -137,7 +134,7 @@
   }
 
   Future<void> test_binaryExpression_or_right() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void f(String s) {
   print(s.isEmpty || s == null);
 }
@@ -150,7 +147,7 @@
   }
 
   Future<void> test_ifStatement() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void f(String s) {
   if (s != null) {
     print(s);
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_const_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_const_test.dart
index 8051ea2..3f347cc3 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/remove_const_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_const_test.dart
@@ -21,7 +21,7 @@
   FixKind get kind => DartFixKind.REMOVE_CONST;
 
   Future<void> test_explicitConst() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   A();
 }
@@ -42,7 +42,7 @@
   }
 
   Future<void> test_implicitConst() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   A();
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_dead_code_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_dead_code_test.dart
index 93bea41..62618ac 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/remove_dead_code_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_dead_code_test.dart
@@ -22,7 +22,7 @@
   FixKind get kind => DartFixKind.REMOVE_DEAD_CODE;
 
   Future<void> test_catch_afterCatchAll_catch() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   try {
   } catch (e) {
@@ -43,7 +43,7 @@
   }
 
   Future<void> test_catch_afterCatchAll_on() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   try {
   } on Object {
@@ -64,7 +64,7 @@
   }
 
   Future<void> test_catch_subtype() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {}
 class B extends A {}
 main() {
@@ -89,7 +89,7 @@
   }
 
   Future<void> test_condition() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main(int p) {
   if (true || p > 5) {
     print(1);
@@ -106,7 +106,7 @@
   }
 
   Future<void> test_statements_one() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 int main() {
   print(0);
   return 42;
@@ -122,7 +122,7 @@
   }
 
   Future<void> test_statements_two() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 int main() {
   print(0);
   return 42;
@@ -150,7 +150,7 @@
   @failingTest
   Future<void> test_do_returnInBody() async {
     // https://github.com/dart-lang/sdk/issues/43511
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void f(bool c) {
   do {
     print(c);
@@ -168,7 +168,7 @@
   @failingTest
   Future<void> test_for_returnInBody() async {
     // https://github.com/dart-lang/sdk/issues/43511
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void f() {
   for (int i = 0; i < 2; i++) {
     print(i);
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_duplicate_case_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_duplicate_case_test.dart
index a010515..0d8a6b1 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/remove_duplicate_case_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_duplicate_case_test.dart
@@ -24,7 +24,7 @@
   String get lintCode => LintNames.no_duplicate_case_values;
 
   Future<void> test_fallThroughFromPrevious() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void switchInt() {
   switch (2) {
     case 1:
@@ -58,7 +58,7 @@
   }
 
   Future<void> test_removeIntCase() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void switchInt() {
   switch (2) {
     case 1:
@@ -86,7 +86,7 @@
   }
 
   Future<void> test_removeStringCase() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void switchString() {
   String v = 'a';
   switch (v) {
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_empty_catch_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_empty_catch_test.dart
index de5aedd..ff75a69 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/remove_empty_catch_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_empty_catch_test.dart
@@ -24,7 +24,7 @@
   String get lintCode => LintNames.empty_catches;
 
   Future<void> test_incompleteCatch() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void foo() {
   try {
     1;
@@ -35,7 +35,7 @@
   }
 
   Future<void> test_singleCatch_finally_newLine() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void foo() {
   try {
     1;
@@ -57,7 +57,7 @@
   }
 
   Future<void> test_singleCatch_finally_sameLine() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void foo() {
   try {} catch (e) {} finally {}
 }
@@ -72,7 +72,7 @@
   Future<void> test_singleCatch_noFinally() async {
     // The catch can't be removed unless we also remove the try, which is more
     // than this fix does at the moment.
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void foo() {
   try {
   } catch (e) {}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_empty_constructor_body_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_empty_constructor_body_test.dart
index 6f1bb5e..3f93785 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/remove_empty_constructor_body_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_empty_constructor_body_test.dart
@@ -25,7 +25,7 @@
   String get lintCode => LintNames.empty_constructor_bodies;
 
   Future<void> test_empty() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class C {
   C() {}
 }
@@ -38,7 +38,7 @@
   }
 
   Future<void> test_incompleteComment() async {
-    await resolveTestUnit(r'''
+    await resolveTestCode(r'''
 class A {
   A() {/*
 ''');
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_empty_else_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_empty_else_test.dart
index 907e83a..b7521b3 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/remove_empty_else_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_empty_else_test.dart
@@ -24,7 +24,7 @@
   String get lintCode => LintNames.avoid_empty_else;
 
   Future<void> test_newLine() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void foo(bool cond) {
   if (cond) {
     //
@@ -42,7 +42,7 @@
   }
 
   Future<void> test_sameLine() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void foo(bool cond) {
   if (cond) {
     //
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_empty_statement_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_empty_statement_test.dart
index c7f0fe8..0b28f0f 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/remove_empty_statement_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_empty_statement_test.dart
@@ -24,7 +24,7 @@
   String get lintCode => LintNames.empty_statements;
 
   Future<void> test_insideBlock() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void foo() {
   while(true) {
     ;
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_if_null_operator_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_if_null_operator_test.dart
index 32b927a..3f86e17 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/remove_if_null_operator_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_if_null_operator_test.dart
@@ -4,29 +4,93 @@
 
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analysis_server/src/services/linter/lint_names.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import '../../../../abstract_context.dart';
 import 'fix_processor.dart';
 
 void main() {
   defineReflectiveSuite(() {
+    defineReflectiveTests(DeadNullAwareAssignmentExpressionTest);
     defineReflectiveTests(DeadNullAwareExpressionTest);
     defineReflectiveTests(UnnecessaryNullInIfNullOperatorsTest);
   });
 }
 
 @reflectiveTest
-class DeadNullAwareExpressionTest extends FixProcessorTest {
+class DeadNullAwareAssignmentExpressionTest extends FixProcessorTest
+    with WithNullSafetyMixin {
   @override
-  List<String> get experiments => [EnableString.non_nullable];
+  FixKind get kind => DartFixKind.REMOVE_IF_NULL_OPERATOR;
 
+  Future<void> test_assignmentExpression_nonPromotable() async {
+    await resolveTestCode('''
+class C {
+  int a = 1;
+  void f(int b) {
+    a ??= b;
+  }
+}
+''');
+    await assertHasFix('''
+class C {
+  int a = 1;
+  void f(int b) {
+    a;
+  }
+}
+''');
+  }
+
+  Future<void> test_assignmentExpression_promotable() async {
+    await resolveTestCode('''
+void f(int a, int b) {
+  a ??= b;
+}
+''');
+    await assertHasFix('''
+void f(int a, int b) {
+}
+''');
+  }
+
+  Future<void> test_immediateChild() async {
+    await resolveTestCode('''
+void f(int a, int b) => a ??= b;
+''');
+    await assertHasFix('''
+void f(int a, int b) => a;
+''');
+  }
+
+  Future<void> test_nestedChild() async {
+    await resolveTestCode('''
+void f(int a, int b) => a ??= b * 2 + 1;
+''');
+    await assertHasFix('''
+void f(int a, int b) => a;
+''');
+  }
+
+  Future<void> test_nestedChild_onRight() async {
+    await resolveTestCode('''
+void f(int a, int b, int c) => a = b ??= c;
+''');
+    await assertHasFix('''
+void f(int a, int b, int c) => a = b;
+''');
+  }
+}
+
+@reflectiveTest
+class DeadNullAwareExpressionTest extends FixProcessorTest
+    with WithNullSafetyMixin {
   @override
   FixKind get kind => DartFixKind.REMOVE_IF_NULL_OPERATOR;
 
   Future<void> test_immediateChild() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 int f(int a, int b) => a ?? b;
 ''');
     await assertHasFix('''
@@ -35,7 +99,7 @@
   }
 
   Future<void> test_nestedChild() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 int f(int a, int b) => a ?? b * 2 + 1;
 ''');
     await assertHasFix('''
@@ -53,7 +117,7 @@
   String get lintCode => LintNames.unnecessary_null_in_if_null_operators;
 
   Future<void> test_left() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var a = '';
 var b = null ?? a;
 ''');
@@ -64,7 +128,7 @@
   }
 
   Future<void> test_right() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var a = '';
 var b = a ?? null;
 ''');
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_initializer_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_initializer_test.dart
index fe01b6d..7127fbd 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/remove_initializer_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_initializer_test.dart
@@ -24,7 +24,7 @@
   String get lintCode => LintNames.avoid_init_to_null;
 
   Future<void> test_field() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class Test {
   int x = null;
 }
@@ -37,7 +37,7 @@
   }
 
   Future<void> test_forLoop() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void f() {
   for (var i = null; i != null; i++) {
   }
@@ -52,7 +52,7 @@
   }
 
   Future<void> test_listOfVariableDeclarations() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 String a = 'a', b = null, c = 'c';
 ''');
     await assertHasFix('''
@@ -61,7 +61,7 @@
   }
 
   Future<void> test_parameter_optionalNamed() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void f({String s = null}) {}
 ''');
     await assertHasFix('''
@@ -70,7 +70,7 @@
   }
 
   Future<void> test_parameter_optionalPositional() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void f([String s = null]) {}
 ''');
     await assertHasFix('''
@@ -79,7 +79,7 @@
   }
 
   Future<void> test_topLevel() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var x = null;
 ''');
     await assertHasFix('''
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_interpolation_braces_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_interpolation_braces_test.dart
index 46cc0ea..eaf6bc0 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/remove_interpolation_braces_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_interpolation_braces_test.dart
@@ -24,7 +24,7 @@
   String get lintCode => LintNames.unnecessary_brace_in_string_interps;
 
   Future<void> test_withSpace() async {
-    await resolveTestUnit(r'''
+    await resolveTestCode(r'''
 main() {
   var v = 42;
   print('v: ${ v}');
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_method_declaration_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_method_declaration_test.dart
index 77b371d..d7d5d74 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/remove_method_declaration_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_method_declaration_test.dart
@@ -25,7 +25,7 @@
   String get lintCode => LintNames.unnecessary_overrides;
 
   Future<void> test_getter() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   int foo;
 }
@@ -46,7 +46,7 @@
   }
 
   Future<void> test_method() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   int foo() => 0;
 }
@@ -68,7 +68,7 @@
 
   @FailingTest(issue: 'https://github.com/dart-lang/linter/issues/1997')
   Future<void> test_method_generic() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A<T> {
   T foo() {
     throw 42;
@@ -92,7 +92,6 @@
 ''');
   }
 
-  @FailingTest(issue: 'https://github.com/dart-lang/linter/issues/1997')
   Future<void> test_method_nullSafety_optIn_fromOptOut() async {
     createAnalysisOptionsFile(
       experiments: [EnableString.non_nullable],
@@ -103,7 +102,7 @@
   int foo() => 0;
 }
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 // @dart = 2.7
 import 'a.dart';
 
@@ -123,7 +122,7 @@
 
   @FailingTest(issue: 'https://github.com/dart-lang/linter/issues/1997')
   Future<void> test_method_toString() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   @override
   String toString() => super.toString();
@@ -138,7 +137,7 @@
   @failingTest
   Future<void> test_setter() async {
     // The lint doesn't catch unnecessary setters.
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   int foo;
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_name_from_combinator_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_name_from_combinator_test.dart
index 3bf7a32..e833910 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/remove_name_from_combinator_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_name_from_combinator_test.dart
@@ -20,7 +20,7 @@
   FixKind get kind => DartFixKind.REMOVE_NAME_FROM_COMBINATOR;
 
   Future<void> test_duplicateHiddenName_last() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'dart:math' hide cos, sin, sin;
 
 main() {
@@ -37,7 +37,7 @@
   }
 
   Future<void> test_duplicateHiddenName_middle() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'dart:math' hide cos, cos, sin;
 
 main() {
@@ -57,7 +57,7 @@
   Future<void> test_duplicateHiddenName_only_last() async {
     // It appears that the hint does not detect names that are duplicated across
     // multiple combinators.
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'dart:math' hide cos, sin hide sin;
 
 main() {
@@ -77,7 +77,7 @@
   Future<void> test_duplicateHiddenName_only_middle() async {
     // It appears that the hint does not detect names that are duplicated across
     // multiple combinators.
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'dart:math' hide cos hide cos hide sin;
 
 main() {
@@ -94,7 +94,7 @@
   }
 
   Future<void> test_duplicateShownName_last() async {
-    await resolveTestUnit(
+    await resolveTestCode(
       '''
 import 'dart:math' show cos, sin, sin;
 
@@ -113,7 +113,7 @@
   }
 
   Future<void> test_duplicateShownName_middle() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'dart:math' show cos, cos, sin;
 
 f(x) {
@@ -130,7 +130,7 @@
   }
 
   Future<void> test_undefinedHiddenName_first() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'dart:math' hide aaa, sin, tan;
 
 f(x) {
@@ -147,7 +147,7 @@
   }
 
   Future<void> test_undefinedHiddenName_last() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'dart:math' hide cos, sin, xxx;
 
 f(x) {
@@ -164,7 +164,7 @@
   }
 
   Future<void> test_undefinedHiddenName_middle() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'dart:math' hide cos, mmm, tan;
 
 f(x) {
@@ -181,7 +181,7 @@
   }
 
   Future<void> test_undefinedHiddenName_only_first() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'dart:math' hide aaa hide cos, sin;
 
 main() {
@@ -198,7 +198,7 @@
   }
 
   Future<void> test_undefinedHiddenName_only_last() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'dart:math' hide cos, sin hide aaa;
 
 main() {
@@ -215,7 +215,7 @@
   }
 
   Future<void> test_undefinedHiddenName_only_middle() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'dart:math' hide cos hide aaa hide sin;
 
 main() {
@@ -232,7 +232,7 @@
   }
 
   Future<void> test_undefinedHiddenName_only_only() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'dart:math' hide aaa;
 var c = sin(0.3);
 ''');
@@ -243,7 +243,7 @@
   }
 
   Future<void> test_undefinedHiddenName_only_only_withAs() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'dart:math' as math hide aaa;
 var c = math.sin(0.3);
 ''');
@@ -254,7 +254,7 @@
   }
 
   Future<void> test_undefinedShownName_first() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'dart:math' show aaa, sin, tan;
 
 f(x) {
@@ -271,7 +271,7 @@
   }
 
   Future<void> test_undefinedShownName_last() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'dart:math' show cos, sin, xxx;
 
 f(x) {
@@ -288,7 +288,7 @@
   }
 
   Future<void> test_undefinedShownName_middle() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'dart:math' show cos, mmm, tan;
 
 f(x) {
@@ -305,7 +305,7 @@
   }
 
   Future<void> test_unusedShownName_first() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'dart:math' show cos, sin, tan;
 
 f(x) {
@@ -322,7 +322,7 @@
   }
 
   Future<void> test_unusedShownName_last() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'dart:math' show cos, sin, tan;
 
 f(x) {
@@ -339,7 +339,7 @@
   }
 
   Future<void> test_unusedShownName_middle() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'dart:math' show cos, sin, tan;
 
 f(x) {
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_non_null_assertion_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_non_null_assertion_test.dart
new file mode 100644
index 0000000..d66f1b8
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_non_null_assertion_test.dart
@@ -0,0 +1,36 @@
+// Copyright (c) 2020, 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/src/services/correction/fix.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../../../../abstract_context.dart';
+import 'fix_processor.dart';
+
+void main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(RemoveNonNullAssertionWithNullSafetyTest);
+  });
+}
+
+@reflectiveTest
+class RemoveNonNullAssertionWithNullSafetyTest extends FixProcessorTest
+    with WithNullSafetyMixin {
+  @override
+  FixKind get kind => DartFixKind.REMOVE_NON_NULL_ASSERTION;
+
+  Future<void> test_nonNullable() async {
+    await resolveTestCode('''
+void f(String a) {
+  print(a!);
+}
+''');
+    await assertHasFix('''
+void f(String a) {
+  print(a);
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_operator_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_operator_test.dart
index 62c35d6..22aa7e5 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/remove_operator_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_operator_test.dart
@@ -24,7 +24,7 @@
   String get lintCode => LintNames.prefer_adjacent_string_concatenation;
 
   Future<void> test_plus() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var s = 'a' + 'b';
 ''');
     await assertHasFix('''
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_parameters_in_getter_declaration_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_parameters_in_getter_declaration_test.dart
index 53a3e6b..8b96c68 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/remove_parameters_in_getter_declaration_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_parameters_in_getter_declaration_test.dart
@@ -20,7 +20,7 @@
   FixKind get kind => DartFixKind.REMOVE_PARAMETERS_IN_GETTER_DECLARATION;
 
   Future<void> test_emptyList() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   int get foo() => 0;
 }
@@ -33,7 +33,7 @@
   }
 
   Future<void> test_nonEmptyList() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   int get foo(int a) => 0;
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_parentheses_in_getter_invocation_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_parentheses_in_getter_invocation_test.dart
index c968a3f..5f0d7e3 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/remove_parentheses_in_getter_invocation_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_parentheses_in_getter_invocation_test.dart
@@ -20,7 +20,7 @@
   FixKind get kind => DartFixKind.REMOVE_PARENTHESIS_IN_GETTER_INVOCATION;
 
   Future<void> test_noArguments() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   int get foo => 0;
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_question_mark_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_question_mark_test.dart
index 69573a2..007b6dc 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/remove_question_mark_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_question_mark_test.dart
@@ -3,10 +3,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/src/services/correction/fix.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import '../../../../abstract_context.dart';
 import 'fix_processor.dart';
 
 void main() {
@@ -16,15 +16,12 @@
 }
 
 @reflectiveTest
-class RemoveQuestionMarkTest extends FixProcessorTest {
-  @override
-  List<String> get experiments => [EnableString.non_nullable];
-
+class RemoveQuestionMarkTest extends FixProcessorTest with WithNullSafetyMixin {
   @override
   FixKind get kind => DartFixKind.REMOVE_QUESTION_MARK;
 
   Future<void> test_catchClause() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {}
 void f() {
   try {
@@ -43,7 +40,7 @@
   }
 
   Future<void> test_extendsClause() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {}
 class B extends A? {}
 ''');
@@ -54,7 +51,7 @@
   }
 
   Future<void> test_implementsClause() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {}
 class B implements A? {}
 ''');
@@ -65,7 +62,7 @@
   }
 
   Future<void> test_onClause_class() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {}
 mixin B on A? {}
 ''');
@@ -76,7 +73,7 @@
   }
 
   Future<void> test_withClause_class() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {}
 class B with A? {}
 ''');
@@ -87,7 +84,7 @@
   }
 
   Future<void> test_withClause_mixin() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 mixin A {}
 class B with A? {}
 ''');
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_this_expression_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_this_expression_test.dart
index 8949517..aa1a132 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/remove_this_expression_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_this_expression_test.dart
@@ -24,7 +24,7 @@
   String get lintCode => LintNames.unnecessary_this;
 
   Future<void> test_constructorInitializer() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   int x;
   A(int x) : this.x = x;
@@ -39,7 +39,7 @@
   }
 
   Future<void> test_methodInvocation_oneCharacterOperator() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   void foo() {
     this.foo();
@@ -56,7 +56,7 @@
   }
 
   Future<void> test_propertyAccess_oneCharacterOperator() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   int x;
   void foo() {
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_type_annotation_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_type_annotation_test.dart
index b83f7d0..d4c97ab 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/remove_type_annotation_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_type_annotation_test.dart
@@ -24,7 +24,7 @@
   String get lintCode => LintNames.avoid_annotating_with_dynamic;
 
   Future<void> test_insideFunctionTypedFormalParameter() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 bad(void foo(dynamic x)) {
   return null;
 }
@@ -37,7 +37,7 @@
   }
 
   Future<void> test_namedParameter() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 bad({dynamic defaultValue}) {
   return null;
 }
@@ -50,7 +50,7 @@
   }
 
   Future<void> test_normalParameter() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 bad(dynamic defaultValue) {
   return null;
 }
@@ -63,7 +63,7 @@
   }
 
   Future<void> test_optionalParameter() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 bad([dynamic defaultValue]) {
   return null;
 }
@@ -82,7 +82,7 @@
   String get lintCode => LintNames.avoid_return_types_on_setters;
 
   Future<void> test_void() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void set speed2(int ms) {}
 ''');
     await assertHasFix('''
@@ -97,7 +97,7 @@
   String get lintCode => LintNames.avoid_types_on_closure_parameters;
 
   Future<void> test_namedParameter() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var x = ({Future<int> defaultValue}) => null;
 ''');
     await assertHasFix('''
@@ -106,7 +106,7 @@
   }
 
   Future<void> test_normalParameter() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var x = (Future<int> defaultValue) => null;
 ''');
     await assertHasFix('''
@@ -115,7 +115,7 @@
   }
 
   Future<void> test_optionalParameter() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var x = ([Future<int> defaultValue]) => null;
 ''');
     await assertHasFix('''
@@ -136,7 +136,7 @@
   String get lintCode => LintNames.type_init_formals;
 
   Future<void> test_void() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class C {
   int f;
   C(int this.f);
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_type_arguments_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_type_arguments_test.dart
index cc3a812..62bf7e6 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/remove_type_arguments_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_type_arguments_test.dart
@@ -20,7 +20,7 @@
   FixKind get kind => DartFixKind.REMOVE_TYPE_ARGUMENTS;
 
   Future<void> test_explicitConst() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   const C.named<int>();
 }
@@ -39,7 +39,7 @@
   }
 
   Future<void> test_explicitNew() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   new C.named<int>();
 }
@@ -58,7 +58,7 @@
   }
 
   Future<void> test_implicitConst() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   const C c = C.named<int>();
   print(c);
@@ -79,7 +79,7 @@
   }
 
   Future<void> test_implicitNew() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   C.named<int>();
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_unnecessary_cast_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_unnecessary_cast_test.dart
index 576f52d..09cfd74 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/remove_unnecessary_cast_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_unnecessary_cast_test.dart
@@ -21,7 +21,7 @@
   FixKind get kind => DartFixKind.REMOVE_UNNECESSARY_CAST;
 
   Future<void> test_assignment() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main(Object p) {
   if (p is String) {
     String v = ((p as String));
@@ -40,7 +40,7 @@
   }
 
   Future<void> test_assignment_all() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main(Object p, Object q) {
   if (p is String) {
     String v = ((p as String));
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_unnecessary_const_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_unnecessary_const_test.dart
index f9a1dbf..1f1e6f2 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/remove_unnecessary_const_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_unnecessary_const_test.dart
@@ -24,7 +24,7 @@
   String get lintCode => LintNames.unnecessary_const;
 
   Future<void> test_instanceCreation() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class C { const C(); }
 const c = const C();
 ''');
@@ -35,7 +35,7 @@
   }
 
   Future<void> test_typedLiteral() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 const list = const [];
 ''');
     await assertHasFix('''
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_unnecessary_new_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_unnecessary_new_test.dart
index c00dcb2..dc6b443 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/remove_unnecessary_new_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_unnecessary_new_test.dart
@@ -24,7 +24,7 @@
   String get lintCode => LintNames.unnecessary_new;
 
   Future<void> test_constructor() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A { A(); }
 f() {
   final a = new A();
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_unused_catch_clause_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_unused_catch_clause_test.dart
index 7f5f40a..d18763d 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/remove_unused_catch_clause_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_unused_catch_clause_test.dart
@@ -20,7 +20,7 @@
   FixKind get kind => DartFixKind.REMOVE_UNUSED_CATCH_CLAUSE;
 
   Future<void> test_removeUnusedCatchClause() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   try {
     throw 42;
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_unused_catch_stack_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_unused_catch_stack_test.dart
index 31fc9a3..730f44e 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/remove_unused_catch_stack_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_unused_catch_stack_test.dart
@@ -20,7 +20,7 @@
   FixKind get kind => DartFixKind.REMOVE_UNUSED_CATCH_STACK;
 
   Future<void> test_removeUnusedCatchStack() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   try {
     throw 42;
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_unused_element_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_unused_element_test.dart
index 12d377c..154a433 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/remove_unused_element_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_unused_element_test.dart
@@ -22,7 +22,7 @@
   FixKind get kind => DartFixKind.REMOVE_UNUSED_ELEMENT;
 
   Future<void> test_class_notUsed_inClassMember() async {
-    await resolveTestUnit(r'''
+    await resolveTestCode(r'''
 class _A {
   staticMethod() {
     new _A();
@@ -35,7 +35,7 @@
   }
 
   Future<void> test_class_notUsed_isExpression() async {
-    await resolveTestUnit(r'''
+    await resolveTestCode(r'''
 class _A {}
 main(p) {
   if (p is _A) {
@@ -47,7 +47,7 @@
   }
 
   Future<void> test_class_notUsed_noReference() async {
-    await resolveTestUnit(r'''
+    await resolveTestCode(r'''
 class _A {
 }
 ''');
@@ -56,7 +56,7 @@
   }
 
   Future<void> test_enum_notUsed_noReference() async {
-    await resolveTestUnit(r'''
+    await resolveTestCode(r'''
 enum _MyEnum {A, B, C}
 ''');
     await assertHasFix(r'''
@@ -66,7 +66,7 @@
   }
 
   Future<void> test_functionLocal_notUsed_noReference() async {
-    await resolveTestUnit(r'''
+    await resolveTestCode(r'''
 main() {
   f() {}
 }
@@ -78,7 +78,7 @@
   }
 
   Future<void> test_functionTop_notUsed_noReference() async {
-    await resolveTestUnit(r'''
+    await resolveTestCode(r'''
 _f() {}
 main() {
 }
@@ -90,7 +90,7 @@
   }
 
   Future<void> test_functionTypeAlias_notUsed_noReference() async {
-    await resolveTestUnit(r'''
+    await resolveTestCode(r'''
 typedef _F(a, b);
 main() {
 }
@@ -102,7 +102,7 @@
   }
 
   Future<void> test_getter_notUsed_noReference() async {
-    await resolveTestUnit(r'''
+    await resolveTestCode(r'''
 class A {
   get _g => null;
 }
@@ -114,7 +114,7 @@
   }
 
   Future<void> test_method_notUsed_noReference() async {
-    await resolveTestUnit(r'''
+    await resolveTestCode(r'''
 class A {
   static _m() {}
 }
@@ -126,7 +126,7 @@
   }
 
   Future<void> test_setter_notUsed_noReference() async {
-    await resolveTestUnit(r'''
+    await resolveTestCode(r'''
 class A {
   set _s(x) {}
 }
@@ -138,7 +138,7 @@
   }
 
   Future<void> test_staticMethod_extension_notUsed_noReference() async {
-    await resolveTestUnit(r'''
+    await resolveTestCode(r'''
 extension _E on String {
   static int m1() => 3;
   int m2() => 7;
@@ -154,7 +154,7 @@
   }
 
   Future<void> test_staticMethod_mixim_notUsed_noReference() async {
-    await resolveTestUnit(r'''
+    await resolveTestCode(r'''
 mixin _M {
   static int m1() => 3;
 }
@@ -170,7 +170,7 @@
   }
 
   Future<void> test_staticMethod_notUsed_noReference() async {
-    await resolveTestUnit(r'''
+    await resolveTestCode(r'''
 class _A {
   static int m() => 7;
 }
@@ -184,7 +184,7 @@
   }
 
   Future<void> test_topLevelVariable_notUsed() async {
-    await resolveTestUnit(r'''
+    await resolveTestCode(r'''
 int _a = 1;
 main() {
   _a = 2;
@@ -195,7 +195,7 @@
   }
 
   Future<void> test_topLevelVariable_notUsed_noReference_first() async {
-    await resolveTestUnit(r'''
+    await resolveTestCode(r'''
 int _a = 1, b = 2;
 ''');
     await assertHasFix(r'''
@@ -204,7 +204,7 @@
   }
 
   Future<void> test_topLevelVariable_notUsed_noReference_last() async {
-    await resolveTestUnit(r'''
+    await resolveTestCode(r'''
 int a = 1, _b = 2;
 ''');
     await assertHasFix(r'''
@@ -213,7 +213,7 @@
   }
 
   Future<void> test_topLevelVariable_notUsed_noReference_only() async {
-    await resolveTestUnit(r'''
+    await resolveTestCode(r'''
 int _a = 1;
 main() {}
 ''');
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_unused_field_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_unused_field_test.dart
index b92f401..8bf054c 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/remove_unused_field_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_unused_field_test.dart
@@ -21,7 +21,7 @@
 
   @FailingTest(reason: 'Unimplemented')
   Future<void> test_enumValue_notUsed_noReference() async {
-    await resolveTestUnit(r'''
+    await resolveTestCode(r'''
 enum _E { a, b, c }
 bool f(_E e) => e == _E.a || e == _E.b;
 ''');
@@ -32,7 +32,7 @@
   }
 
   Future<void> test_parameter_optional_first() async {
-    await resolveTestUnit(r'''
+    await resolveTestCode(r'''
 class A {
   int _f;
   A([this._f, int x]);
@@ -46,7 +46,7 @@
   }
 
   Future<void> test_parameter_optional_first_hasRequired() async {
-    await resolveTestUnit(r'''
+    await resolveTestCode(r'''
 class A {
   int _f;
   A(int x, [this._f, int y]);
@@ -60,7 +60,7 @@
   }
 
   Future<void> test_parameter_optional_last() async {
-    await resolveTestUnit(r'''
+    await resolveTestCode(r'''
 class A {
   int _f;
   A([int x, this._f]);
@@ -74,7 +74,7 @@
   }
 
   Future<void> test_parameter_optional_middle() async {
-    await resolveTestUnit(r'''
+    await resolveTestCode(r'''
 class A {
   int _f;
   A([int x, this._f, int y]);
@@ -88,7 +88,7 @@
   }
 
   Future<void> test_parameter_optional_only() async {
-    await resolveTestUnit(r'''
+    await resolveTestCode(r'''
 class A {
   int _f;
   A([this._f]);
@@ -102,7 +102,7 @@
   }
 
   Future<void> test_parameter_optional_only_hasRequired() async {
-    await resolveTestUnit(r'''
+    await resolveTestCode(r'''
 class A {
   int _f;
   A(int x, [this._f]);
@@ -116,7 +116,7 @@
   }
 
   Future<void> test_parameter_required_beforeOptional() async {
-    await resolveTestUnit(r'''
+    await resolveTestCode(r'''
 class A {
   int _f;
   A(this._f, [int x]);
@@ -130,7 +130,7 @@
   }
 
   Future<void> test_parameter_required_first() async {
-    await resolveTestUnit(r'''
+    await resolveTestCode(r'''
 class A {
   int _f;
   int x;
@@ -146,7 +146,7 @@
   }
 
   Future<void> test_parameter_required_last() async {
-    await resolveTestUnit(r'''
+    await resolveTestCode(r'''
 class A {
   int x;
   int _f;
@@ -162,7 +162,7 @@
   }
 
   Future<void> test_parameter_required_only() async {
-    await resolveTestUnit(r'''
+    await resolveTestCode(r'''
 class A {
   int _f;
   A(this._f);
@@ -176,7 +176,7 @@
   }
 
   Future<void> test_unusedField_notUsed_assign() async {
-    await resolveTestUnit(r'''
+    await resolveTestCode(r'''
 class A {
   int _f;
   main() {
@@ -193,7 +193,7 @@
   }
 
   Future<void> test_unusedField_notUsed_compoundAssign() async {
-    await resolveTestUnit(r'''
+    await resolveTestCode(r'''
 class A {
   int _f;
   main() {
@@ -210,7 +210,7 @@
   }
 
   Future<void> test_unusedField_notUsed_constructorFieldInitializers() async {
-    await resolveTestUnit(r'''
+    await resolveTestCode(r'''
 class A {
   int _f;
   A() : _f = 0;
@@ -224,7 +224,7 @@
   }
 
   Future<void> test_unusedField_notUsed_constructorFieldInitializers1() async {
-    await resolveTestUnit(r'''
+    await resolveTestCode(r'''
 class A {
   int _f;
   int y;
@@ -240,7 +240,7 @@
   }
 
   Future<void> test_unusedField_notUsed_constructorFieldInitializers2() async {
-    await resolveTestUnit(r'''
+    await resolveTestCode(r'''
 class A {
   int _f;
   int y;
@@ -256,7 +256,7 @@
   }
 
   Future<void> test_unusedField_notUsed_declarationList_first() async {
-    await resolveTestUnit(r'''
+    await resolveTestCode(r'''
 class A {
   int _f, x;
   A(this._f) {
@@ -275,7 +275,7 @@
   }
 
   Future<void> test_unusedField_notUsed_declarationList_last() async {
-    await resolveTestUnit(r'''
+    await resolveTestCode(r'''
 class A {
   int x, _f;
   A(this._f) {
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_unused_import_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_unused_import_test.dart
index f54560f..3fb232f 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/remove_unused_import_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_unused_import_test.dart
@@ -28,7 +28,7 @@
   }
 
   Future<void> test_all_diverseImports() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'dart:math';
 import 'dart:math';
 import 'dart:async';
@@ -42,7 +42,7 @@
   }
 
   Future<void> test_all_diverseImports2() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'dart:async';
 import 'dart:math' as math;
 import 'dart:async';
@@ -63,7 +63,7 @@
   }
 
   Future<void> test_all_singleLine() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'dart:math'; import 'dart:math'; import 'dart:math';
 main() {
 }
@@ -75,7 +75,7 @@
   }
 
   Future<void> test_anotherImportOnLine() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'dart:math'; import 'dart:async';
 
 main() {
@@ -94,7 +94,7 @@
   }
 
   Future<void> test_duplicateImport() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'dart:math';
 import 'dart:math';
 
@@ -112,7 +112,7 @@
   }
 
   Future<void> test_multipleOfSame_all() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'dart:math';
 import 'dart:math';
 import 'dart:math';
@@ -126,7 +126,7 @@
   }
 
   Future<void> test_severalLines() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import
   'dart:math';
 main() {
@@ -139,7 +139,7 @@
   }
 
   Future<void> test_single() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'dart:math';
 main() {
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_unused_label_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_unused_label_test.dart
index a709788..df57ba1 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/remove_unused_label_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_unused_label_test.dart
@@ -20,7 +20,7 @@
   FixKind get kind => DartFixKind.REMOVE_UNUSED_LABEL;
 
   Future<void> test_unused_onWhile() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f() {
   x:
   while (true) {
@@ -38,7 +38,7 @@
   }
 
   Future<void> test_unused_onWhile_sameLine() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f() {
   x: while (true) {
     break;
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_unused_local_variable_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_unused_local_variable_test.dart
index 5d6b701..c73b174 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/remove_unused_local_variable_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_unused_local_variable_test.dart
@@ -21,7 +21,7 @@
   FixKind get kind => DartFixKind.REMOVE_UNUSED_LOCAL_VARIABLE;
 
   Future<void> test_inArgumentList() async {
-    await resolveTestUnit(r'''
+    await resolveTestCode(r'''
 main() {
   var v = 1;
   print(v = 2);
@@ -35,7 +35,7 @@
   }
 
   Future<void> test_inArgumentList2() async {
-    await resolveTestUnit(r'''
+    await resolveTestCode(r'''
 main() {
   var v = 1;
   f(v = 1, 2);
@@ -51,7 +51,7 @@
   }
 
   Future<void> test_inArgumentList3() async {
-    await resolveTestUnit(r'''
+    await resolveTestCode(r'''
 main() {
   var v = 1;
   f(v = 1, v = 2);
@@ -67,7 +67,7 @@
   }
 
   Future<void> test_inDeclarationList() async {
-    await resolveTestUnit(r'''
+    await resolveTestCode(r'''
 main() {
   var v = 1, v2 = 3;
   v = 2;
@@ -83,7 +83,7 @@
   }
 
   Future<void> test_inDeclarationList2() async {
-    await resolveTestUnit(r'''
+    await resolveTestCode(r'''
 main() {
   var v = 1, v2 = 3;
   print(v);
@@ -98,14 +98,14 @@
   }
 
   Future<void> test_notInFunctionBody() async {
-    await resolveTestUnit(r'''
+    await resolveTestCode(r'''
 var a = [for (var v = 0;;) 0];
 ''');
     await assertNoFix();
   }
 
   Future<void> test_withReferences() async {
-    await resolveTestUnit(r'''
+    await resolveTestCode(r'''
 main() {
   var v = 1;
   v = 2;
@@ -120,7 +120,7 @@
   Future<void> test_withReferences_beforeDeclaration() async {
     // CompileTimeErrorCode.REFERENCED_BEFORE_DECLARATION
     verifyNoTestUnitErrors = false;
-    await resolveTestUnit(r'''
+    await resolveTestCode(r'''
 main() {
   v = 2;
   var v = 1;
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_unused_parameter_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_unused_parameter_test.dart
index f35360f..fc174a5 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/remove_unused_parameter_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_unused_parameter_test.dart
@@ -24,7 +24,7 @@
   String get lintCode => LintNames.avoid_unused_constructor_parameters;
 
   Future<void> test_first_optionalNamed_second_optionalNamed() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class C {
   int y;
   C({int x = 0, this.y = 0});
@@ -39,7 +39,7 @@
   }
 
   Future<void> test_first_optionalPositional_second_optionalPositional() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class C {
   int y;
   C([int x = 0, this.y = 0]);
@@ -54,7 +54,7 @@
   }
 
   Future<void> test_first_required_second_optionalInvalid() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class C {
   C(int a, int b = 1,);
 }
@@ -67,7 +67,7 @@
   }
 
   Future<void> test_first_requiredPositional_second_optionalNamed() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class C {
   int y;
   C(int x, {this.y = 0});
@@ -82,7 +82,7 @@
   }
 
   Future<void> test_first_requiredPositional_second_optionalPositional() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class C {
   int y;
   C(int x, [this.y = 0]);
@@ -97,7 +97,7 @@
   }
 
   Future<void> test_first_requiredPositional_second_requiredPositional() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class C {
   int y;
   C(int x, this.y);
@@ -112,7 +112,7 @@
   }
 
   Future<void> test_last_optionalNamed_noDefaultValue() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class C {
   C({int x});
 }
@@ -125,7 +125,7 @@
   }
 
   Future<void> test_last_optionalNamed_previous_optionalNamed() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class C {
   int x;
   C({this.x = 0, int y = 0});
@@ -140,7 +140,7 @@
   }
 
   Future<void> test_last_optionalNamed_previous_requiredPositional() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class C {
   int x;
   C(this.x, {int y = 0});
@@ -155,7 +155,7 @@
   }
 
   Future<void> test_last_optionalPositional_noDefaultValue() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class C {
   C([int x]);
 }
@@ -169,7 +169,7 @@
 
   Future<void>
       test_last_optionalPositional_previous_optionalPositional() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class C {
   int x;
   C([this.x = 0, int y = 0]);
@@ -185,7 +185,7 @@
 
   Future<void>
       test_last_optionalPositional_previous_requiredPositional() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class C {
   int x;
   C(this.x, [int y = 0]);
@@ -201,7 +201,7 @@
 
   Future<void>
       test_last_requiredPositional_previous_requiredPositional() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class C {
   int x;
   C(this.x, int y);
@@ -216,7 +216,7 @@
   }
 
   Future<void> test_only_optionalNamed() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class C {
   C({int x = 0});
 }
@@ -229,7 +229,7 @@
   }
 
   Future<void> test_only_optionalPositional() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class C {
   C([int x = 0]);
 }
@@ -242,7 +242,7 @@
   }
 
   Future<void> test_only_requiredPositional() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class C {
   C(int x);
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/rename_to_camel_case_test.dart b/pkg/analysis_server/test/src/services/correction/fix/rename_to_camel_case_test.dart
index e44d68d..9ae1f64 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/rename_to_camel_case_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/rename_to_camel_case_test.dart
@@ -24,7 +24,7 @@
   String get lintCode => LintNames.non_constant_identifier_names;
 
   Future<void> test_localVariable() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   int my_integer_variable = 42;
   int foo;
@@ -43,7 +43,7 @@
   }
 
   Future<void> test_parameter_closure() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   [0, 1, 2].forEach((my_integer_variable) {
     print(my_integer_variable);
@@ -60,7 +60,7 @@
   }
 
   Future<void> test_parameter_function() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main(int my_integer_variable) {
   print(my_integer_variable);
 }
@@ -73,7 +73,7 @@
   }
 
   Future<void> test_parameter_method() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   main(int my_integer_variable) {
     print(my_integer_variable);
@@ -90,7 +90,7 @@
   }
 
   Future<void> test_parameter_optionalNamed() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 foo({int my_integer_variable}) {
   print(my_integer_variable);
 }
@@ -99,7 +99,7 @@
   }
 
   Future<void> test_parameter_optionalPositional() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main([int my_integer_variable]) {
   print(my_integer_variable);
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/replace_boolean_with_bool_test.dart b/pkg/analysis_server/test/src/services/correction/fix/replace_boolean_with_bool_test.dart
index a9ad68a..1e38a6f 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/replace_boolean_with_bool_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/replace_boolean_with_bool_test.dart
@@ -21,7 +21,7 @@
   FixKind get kind => DartFixKind.REPLACE_BOOLEAN_WITH_BOOL;
 
   Future<void> test_all() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   boolean v;
   boolean w;
@@ -36,7 +36,7 @@
   }
 
   Future<void> test_single() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   boolean v;
   print(v);
diff --git a/pkg/analysis_server/test/src/services/correction/fix/replace_cascade_with_dot_test.dart b/pkg/analysis_server/test/src/services/correction/fix/replace_cascade_with_dot_test.dart
index 907e168..8cf92ad 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/replace_cascade_with_dot_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/replace_cascade_with_dot_test.dart
@@ -4,7 +4,6 @@
 
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analysis_server/src/services/linter/lint_names.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -27,7 +26,7 @@
       LintNames.avoid_single_cascade_in_expression_statements;
 
   Future<void> test_assignment_index_normalCascade() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void f(List<int> l) {
   l..[0] = 0;
 }
@@ -40,7 +39,7 @@
   }
 
   Future<void> test_assignment_index_propertyAccess_normalCascade() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   void foo() {
     0..bar[1] = 2;
@@ -60,7 +59,7 @@
   }
 
   Future<void> test_assignment_property_normalCascade() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void f(C c) {
   c..s = 0;
 }
@@ -79,7 +78,7 @@
   }
 
   Future<void> test_getter_normalCascade() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void f(String s) {
   s..length;
 }
@@ -92,7 +91,7 @@
   }
 
   Future<void> test_index_normalCascade() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void f(String s) {
   s..[0];
 }
@@ -105,7 +104,7 @@
   }
 
   Future<void> test_method_normalCascade() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void f(String s) {
   s..substring(0, 3);
 }
@@ -119,13 +118,10 @@
 }
 
 @reflectiveTest
-class ReplaceCascadeWithDotWithNullSafetyTest
-    extends ReplaceCascadeWithDotTest {
-  @override
-  List<String> get experiments => [EnableString.non_nullable];
-
+class ReplaceCascadeWithDotWithNullSafetyTest extends ReplaceCascadeWithDotTest
+    with WithNullSafetyLintMixin {
   Future<void> test_assignment_index_nullAwareCascade() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void f(List<int>? l) {
   l?..[0] = 0;
 }
@@ -138,7 +134,7 @@
   }
 
   Future<void> test_assignment_property_nullAwareCascade() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void f(C? c) {
   c?..s = 0;
 }
@@ -157,7 +153,7 @@
   }
 
   Future<void> test_getter_nullAwareCascade() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void f(String? s) {
   s?..length;
 }
@@ -170,7 +166,7 @@
   }
 
   Future<void> test_index_nullAwareCascade() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void f(String? s) {
   s?..[0];
 }
@@ -183,7 +179,7 @@
   }
 
   Future<void> test_method_nullAwareCascade() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void f(String? s) {
   s?..substring(0, 3);
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/replace_colon_with_equals_test.dart b/pkg/analysis_server/test/src/services/correction/fix/replace_colon_with_equals_test.dart
index 698a9ed..852892b 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/replace_colon_with_equals_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/replace_colon_with_equals_test.dart
@@ -24,7 +24,7 @@
   String get lintCode => LintNames.prefer_equal_for_default_values;
 
   Future<void> test_method() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void f({int a: 1}) => null;
 ''');
     await assertHasFix('''
diff --git a/pkg/analysis_server/test/src/services/correction/fix/replace_final_with_const_test.dart b/pkg/analysis_server/test/src/services/correction/fix/replace_final_with_const_test.dart
index 164990c..e1ffdad 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/replace_final_with_const_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/replace_final_with_const_test.dart
@@ -24,7 +24,7 @@
   String get lintCode => LintNames.prefer_const_declarations;
 
   Future<void> test_method() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 final int a = 1;
 ''');
     await assertHasFix('''
diff --git a/pkg/analysis_server/test/src/services/correction/fix/replace_new_with_const_test.dart b/pkg/analysis_server/test/src/services/correction/fix/replace_new_with_const_test.dart
index 4573b3a..a1607e5 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/replace_new_with_const_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/replace_new_with_const_test.dart
@@ -24,7 +24,7 @@
   String get lintCode => LintNames.prefer_const_constructors;
 
   Future<void> test_new() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class C {
   const C();
 }
@@ -45,7 +45,7 @@
   }
 
   Future<void> test_noKeyword() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class C {
   const C();
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/replace_null_with_closure_test.dart b/pkg/analysis_server/test/src/services/correction/fix/replace_null_with_closure_test.dart
index d553d5f..8c6d3b3 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/replace_null_with_closure_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/replace_null_with_closure_test.dart
@@ -24,7 +24,7 @@
   String get lintCode => LintNames.null_closures;
 
   Future<void> test_named() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void f(List<int> l) {
   l.firstWhere((e) => e.isEven, orElse: null);
 }
@@ -37,7 +37,7 @@
   }
 
   Future<void> test_named_withArgs() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void f(String s) {
   s.splitMapJoin('', onNonMatch: null);
 }
@@ -50,7 +50,7 @@
   }
 
   Future<void> test_required() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void f(List<int> l) {
   l.firstWhere(null);
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/replace_return_type_future_test.dart b/pkg/analysis_server/test/src/services/correction/fix/replace_return_type_future_test.dart
index e40a0b2..0c42514 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/replace_return_type_future_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/replace_return_type_future_test.dart
@@ -21,7 +21,7 @@
   FixKind get kind => DartFixKind.REPLACE_RETURN_TYPE_FUTURE;
 
   Future<void> test_adjacentNodes_withImport() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'dart:async';
 var v;int main() async => 0;
 ''');
@@ -34,7 +34,7 @@
   }
 
   Future<void> test_adjacentNodes_withoutImport() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var v;int main() async => 0;
 ''');
     await assertHasFix('''
@@ -43,7 +43,7 @@
   }
 
   Future<void> test_complexTypeName_withImport() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'dart:async';
 List<int> main() async {
 }
@@ -59,7 +59,7 @@
 
   @failingTest
   Future<void> test_complexTypeName_withoutImport() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 List<int> main() async {
 }
 ''');
@@ -74,7 +74,7 @@
   }
 
   Future<void> test_importedWithPrefix() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'dart:async' as al;
 int main() async {
 }
@@ -89,7 +89,7 @@
   }
 
   Future<void> test_simpleTypeName_withImport() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'dart:async';
 int main() async => 0;
 ''');
@@ -103,7 +103,7 @@
 
   @failingTest
   Future<void> test_simpleTypeName_withoutImport() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 int main() async => 0;
 ''');
     await assertHasFix('''
@@ -116,7 +116,7 @@
   }
 
   Future<void> test_withLibraryDirective_withImport() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 library main;
 import 'dart:async';
 int main() async {
@@ -133,7 +133,7 @@
   }
 
   Future<void> test_withLibraryDirective_withoutImport() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 library main;
 int main() async {
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/replace_var_with_dynamic_test.dart b/pkg/analysis_server/test/src/services/correction/fix/replace_var_with_dynamic_test.dart
index 39f3c9f..02b4eae 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/replace_var_with_dynamic_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/replace_var_with_dynamic_test.dart
@@ -21,7 +21,7 @@
   FixKind get kind => DartFixKind.REPLACE_VAR_WITH_DYNAMIC;
 
   Future<void> test_simple() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   Map<String, var> m;
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/replace_with_brackets_test.dart b/pkg/analysis_server/test/src/services/correction/fix/replace_with_brackets_test.dart
index d265a95..21075fa 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/replace_with_brackets_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/replace_with_brackets_test.dart
@@ -24,7 +24,7 @@
   String get lintCode => LintNames.empty_statements;
 
   Future<void> test_outOfBlock_otherLine() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void f(bool c) {
   while(c)
   ;
@@ -40,7 +40,7 @@
   }
 
   Future<void> test_outOfBlock_sameLine() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void f(bool c) {
   while(c);
   print('hi');
diff --git a/pkg/analysis_server/test/src/services/correction/fix/replace_with_conditional_assignment_test.dart b/pkg/analysis_server/test/src/services/correction/fix/replace_with_conditional_assignment_test.dart
index 881c3c8f..8964e95 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/replace_with_conditional_assignment_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/replace_with_conditional_assignment_test.dart
@@ -24,7 +24,7 @@
   String get lintCode => LintNames.prefer_conditional_assignment;
 
   Future<void> test_withCodeBeforeAndAfter() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class Person {
   String _fullName;
   void foo() {
@@ -51,7 +51,7 @@
   }
 
   Future<void> test_withOneBlock() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class Person {
   String _fullName;
   void foo() {
@@ -74,7 +74,7 @@
   }
 
   Future<void> test_withoutBlock() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class Person {
   String _fullName;
   void foo() {
@@ -96,7 +96,7 @@
   }
 
   Future<void> test_withTwoBlock() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class Person {
   String _fullName;
   void foo() {
diff --git a/pkg/analysis_server/test/src/services/correction/fix/replace_with_eight_digit_hex_test.dart b/pkg/analysis_server/test/src/services/correction/fix/replace_with_eight_digit_hex_test.dart
index 010ae73..bd4e2e1 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/replace_with_eight_digit_hex_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/replace_with_eight_digit_hex_test.dart
@@ -24,7 +24,7 @@
   String get lintCode => LintNames.use_full_hex_values_for_flutter_colors;
 
   Future<void> test_notHex() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 library dart.ui;
 
 var c = Color(1);
@@ -45,7 +45,7 @@
   }
 
   Future<void> test_short() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 library dart.ui;
 
 var c = Color(0x000001);
diff --git a/pkg/analysis_server/test/src/services/correction/fix/replace_with_extension_name_test.dart b/pkg/analysis_server/test/src/services/correction/fix/replace_with_extension_name_test.dart
index cc1fb07..0bf4a84 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/replace_with_extension_name_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/replace_with_extension_name_test.dart
@@ -20,7 +20,7 @@
   FixKind get kind => DartFixKind.REPLACE_WITH_EXTENSION_NAME;
 
   Future<void> test_getter() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 extension E on String {
   static int get g => 0;
 }
@@ -41,7 +41,7 @@
   }
 
   Future<void> test_method() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 extension E on String {
   static int m() => 0;
 }
@@ -67,7 +67,7 @@
   static int m() => 0;
 }
 ''');
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'ext.dart' as ext;
 
 void f() {
@@ -84,7 +84,7 @@
   }
 
   Future<void> test_setter() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 extension E on String {
   static set s(int i) {}
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/replace_with_filled_test.dart b/pkg/analysis_server/test/src/services/correction/fix/replace_with_filled_test.dart
index 5003102..cdfb2bc 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/replace_with_filled_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/replace_with_filled_test.dart
@@ -3,10 +3,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/src/services/correction/fix.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import '../../../../abstract_context.dart';
 import 'fix_processor.dart';
 
 void main() {
@@ -16,29 +16,26 @@
 }
 
 @reflectiveTest
-class ReplaceWithFilledTest extends FixProcessorTest {
-  @override
-  List<String> get experiments => [EnableString.non_nullable];
-
+class ReplaceWithFilledTest extends FixProcessorTest with WithNullSafetyMixin {
   @override
   FixKind get kind => DartFixKind.REPLACE_WITH_FILLED;
 
   Future<void> test_nonNullableElements() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var l = new List<int>(3);
 ''');
     await assertNoFix();
   }
 
   Future<void> test_nonNullableElements_inferred() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 List<int> l = List(3);
 ''');
     await assertNoFix();
   }
 
   Future<void> test_nullableElements() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var l = new List<int?>(3);
 ''');
     await assertHasFix('''
@@ -47,7 +44,7 @@
   }
 
   Future<void> test_nullableElements_inferred() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 List<int?> l = List(5);
 ''');
     await assertHasFix('''
@@ -56,7 +53,7 @@
   }
 
   Future<void> test_trailingComma() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var l = List<int?>(3,);
 ''');
     await assertHasFix('''
diff --git a/pkg/analysis_server/test/src/services/correction/fix/replace_with_identifier_test.dart b/pkg/analysis_server/test/src/services/correction/fix/replace_with_identifier_test.dart
index 259bf0d..ce9487a 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/replace_with_identifier_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/replace_with_identifier_test.dart
@@ -24,7 +24,7 @@
   String get lintCode => LintNames.avoid_types_on_closure_parameters;
 
   Future<void> test_functionTypedFormalParameter() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var functionWithFunction = (int f(int x)) => f(0);
 ''');
     await assertHasFix('''
diff --git a/pkg/analysis_server/test/src/services/correction/fix/replace_with_interpolation_test.dart b/pkg/analysis_server/test/src/services/correction/fix/replace_with_interpolation_test.dart
index 191e1bb..0a630e7 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/replace_with_interpolation_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/replace_with_interpolation_test.dart
@@ -24,7 +24,7 @@
   String get lintCode => LintNames.prefer_interpolation_to_compose_strings;
 
   Future<void> test_stringLiteral_binaryExpression_stringConcatenation() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var b = ['b', 'c'];
 var c = 'a' + b[0] + b[1];
 ''');
@@ -35,7 +35,7 @@
   }
 
   Future<void> test_stringLiteral_expression_toString() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var b = [1];
 var c = 'a' + b[0].toString();
 ''');
@@ -46,7 +46,7 @@
   }
 
   Future<void> test_stringLiteral_indexExpression() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var b = ['b'];
 var c = 'a' + b[0];
 ''');
@@ -57,7 +57,7 @@
   }
 
   Future<void> test_stringLiteral_parenthesizedExpression() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var b = ['b'];
 var c = 'a' + (b[0]);
 ''');
@@ -68,7 +68,7 @@
   }
 
   Future<void> test_stringLiteral_parenthesizedExpression_toString() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var a = 1;
 var b = 2;
 var c = 'a' + (a + b).toString();
@@ -81,7 +81,7 @@
   }
 
   Future<void> test_stringLiteral_variable_notRaw_double_multi() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var b = 'b';
 var c = """a""" + b;
 ''');
@@ -92,7 +92,7 @@
   }
 
   Future<void> test_stringLiteral_variable_notRaw_double_notMulti() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var b = 'b';
 var c = "a" + b;
 ''');
@@ -103,7 +103,7 @@
   }
 
   Future<void> test_stringLiteral_variable_notRaw_single_multi() async {
-    await resolveTestUnit("""
+    await resolveTestCode("""
 var b = 'b';
 var c = '''a''' + b;
 """);
@@ -114,7 +114,7 @@
   }
 
   Future<void> test_stringLiteral_variable_notRaw_single_notMulti() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var b = 'b';
 var c = 'a' + b;
 ''');
@@ -125,7 +125,7 @@
   }
 
   Future<void> test_stringLiteral_variable_raw_single_notMulti() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var b = 'b';
 var c = r'a' + b;
 ''');
@@ -133,7 +133,7 @@
   }
 
   Future<void> test_stringLiteral_variable_withEscapes() async {
-    await resolveTestUnit(r'''
+    await resolveTestCode(r'''
 var b = 'b';
 var c = '\$a' + b;
 ''');
@@ -144,7 +144,7 @@
   }
 
   Future<void> test_variable_adjacentStrings() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var a = 'a';
 var c = a + 'b' 'c';
 ''');
@@ -155,7 +155,7 @@
   }
 
   Future<void> test_variable_stringLiteral_noRuntogther() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var a = 'a';
 var c = a + ' b';
 ''');
@@ -166,7 +166,7 @@
   }
 
   Future<void> test_variable_stringLiteral_runtogther() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var a = 'a';
 var c = a + 'b';
 ''');
@@ -177,7 +177,7 @@
   }
 
   Future<void> test_variable_stringLiteral_variable() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 var a = 'a';
 var z = 'z';
 var c = a + '...' + z;
diff --git a/pkg/analysis_server/test/src/services/correction/fix/replace_with_is_empty_test.dart b/pkg/analysis_server/test/src/services/correction/fix/replace_with_is_empty_test.dart
index 815abe6..ebff731 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/replace_with_is_empty_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/replace_with_is_empty_test.dart
@@ -24,7 +24,7 @@
   String get lintCode => LintNames.prefer_is_empty;
 
   Future<void> test_constantOnLeft_equal() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f(List c) {
   if (0 == c.length) {}
 }
@@ -37,7 +37,7 @@
   }
 
   Future<void> test_constantOnLeft_greaterThan() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f(List c) {
   if (1 > c.length) {}
 }
@@ -50,7 +50,7 @@
   }
 
   Future<void> test_constantOnLeft_greaterThanOrEqual() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f(List c) {
   if (0 >= c.length) {}
 }
@@ -63,7 +63,7 @@
   }
 
   Future<void> test_constantOnRight_equal() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f(List c) {
   if (c.length == 0) {}
 }
@@ -76,7 +76,7 @@
   }
 
   Future<void> test_constantOnRight_lessThan() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f(List c) {
   if (c.length < 1) {}
 }
@@ -89,7 +89,7 @@
   }
 
   Future<void> test_constantOnRight_lessThanOrEqual() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f(List c) {
   if (c.length <= 0) {}
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/replace_with_is_not_empty_test.dart b/pkg/analysis_server/test/src/services/correction/fix/replace_with_is_not_empty_test.dart
index 67d0e67..b7bdd71 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/replace_with_is_not_empty_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/replace_with_is_not_empty_test.dart
@@ -24,7 +24,7 @@
   String get lintCode => LintNames.prefer_is_empty;
 
   Future<void> test_constantOnLeft_lessThanOrEqual() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f(List c) {
   if (1 <= c.length) {}
 }
@@ -37,7 +37,7 @@
   }
 
   Future<void> test_constantOnLeft_notEqual() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f(List c) {
   if (0 != c.length) {}
 }
@@ -50,7 +50,7 @@
   }
 
   Future<void> test_constantOnRight_greaterThanOrEqual() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f(List c) {
   if (c.length >= 1) {}
 }
@@ -63,7 +63,7 @@
   }
 
   Future<void> test_constantOnRight_notEqual() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f(List c) {
   if (c.length != 0) {}
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/replace_with_not_null_aware_test.dart b/pkg/analysis_server/test/src/services/correction/fix/replace_with_not_null_aware_test.dart
index 64b71ef..1009ac6 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/replace_with_not_null_aware_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/replace_with_not_null_aware_test.dart
@@ -6,6 +6,7 @@
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import '../../../../abstract_context.dart';
 import 'fix_processor.dart';
 
 void main() {
@@ -15,15 +16,13 @@
 }
 
 @reflectiveTest
-class ReplaceWithNotNullAwareTest extends FixProcessorTest {
-  @override
-  List<String> get experiments => ['non-nullable'];
-
+class ReplaceWithNotNullAwareTest extends FixProcessorTest
+    with WithNullSafetyMixin {
   @override
   FixKind get kind => DartFixKind.REPLACE_WITH_NOT_NULL_AWARE;
 
   Future<void> test_getter_cascade() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void f(String s) {
   s?..length;
 }
@@ -36,7 +35,7 @@
   }
 
   Future<void> test_getter_simple() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void f(String s) {
   s?.length;
 }
@@ -49,7 +48,7 @@
   }
 
   Future<void> test_index_cascade() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void f(List<int> x) {
   x?..[0];
 }
@@ -62,7 +61,7 @@
   }
 
   Future<void> test_index_simple() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void f(List<int> x) {
   x?[0];
 }
@@ -75,7 +74,7 @@
   }
 
   Future<void> test_method_cascade() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void f(String s) {
   s?..indexOf('a');
 }
@@ -88,7 +87,7 @@
   }
 
   Future<void> test_method_simple() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void f(String s) {
   s?.indexOf('a');
 }
@@ -101,7 +100,7 @@
   }
 
   Future<void> test_setter_cascade() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void f(C c) {
   c?..s = 0;
 }
@@ -120,7 +119,7 @@
   }
 
   Future<void> test_setter_simple() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void f(C c) {
   c?.s = 0;
 }
@@ -139,7 +138,7 @@
   }
 
   Future<void> test_spread() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void f(List<int> x) {
   [...?x];
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/replace_with_null_aware_test.dart b/pkg/analysis_server/test/src/services/correction/fix/replace_with_null_aware_test.dart
index 526cecc..226c4f7 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/replace_with_null_aware_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/replace_with_null_aware_test.dart
@@ -20,7 +20,7 @@
   FixKind get kind => DartFixKind.REPLACE_WITH_NULL_AWARE;
 
   Future<void> test_chain() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main(x) {
   x?.a.b.c;
 }
@@ -33,7 +33,7 @@
   }
 
   Future<void> test_methodInvocation() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main(x) {
   x?.a.b();
 }
@@ -46,7 +46,7 @@
   }
 
   Future<void> test_propertyAccess() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main(x) {
   x?.a().b;
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/replace_with_tear_off_test.dart b/pkg/analysis_server/test/src/services/correction/fix/replace_with_tear_off_test.dart
index cf9cc3d..772ecd7 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/replace_with_tear_off_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/replace_with_tear_off_test.dart
@@ -24,7 +24,7 @@
   String get lintCode => LintNames.unnecessary_lambdas;
 
   Future<void> test_function_oneParameter() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 Function f() => (name) {
   print(name);
 };
@@ -35,7 +35,7 @@
   }
 
   Future<void> test_function_zeroParameters() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void foo(){}
 Function finalVar() {
   return () {
@@ -52,7 +52,7 @@
   }
 
   Future<void> test_lambda_asArgument() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void foo() {
   bool isPair(int a) => a % 2 == 0;
   final finalList = <int>[];
@@ -70,7 +70,7 @@
   }
 
   Future<void> test_method_oneParameter() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 final l = <int>[];
 var a = (x) => l.indexOf(x);
 ''');
@@ -81,7 +81,7 @@
   }
 
   Future<void> test_method_zeroParameter() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 final Object a = '';
 Function finalVar() {
   return () {
diff --git a/pkg/analysis_server/test/src/services/correction/fix/replace_with_var_test.dart b/pkg/analysis_server/test/src/services/correction/fix/replace_with_var_test.dart
index 4d4ad88..d069876 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/replace_with_var_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/replace_with_var_test.dart
@@ -24,7 +24,7 @@
   String get lintCode => LintNames.omit_local_variable_types;
 
   Future<void> test_for() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void f(List<int> list) {
   for (int i = 0; i < list.length; i++) {
     print(i);
@@ -41,7 +41,7 @@
   }
 
   Future<void> test_forEach() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void f(List<int> list) {
   for (int i in list) {
     print(i);
@@ -58,7 +58,7 @@
   }
 
   Future<void> test_forEach_final() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void f(List<int> list) {
   for (final int i in list) {
     print(i);
@@ -75,7 +75,7 @@
   }
 
   Future<void> test_generic_instanceCreation_withArguments() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 C<int> f() {
   C<int> c = C<int>();
   return c;
@@ -92,7 +92,7 @@
   }
 
   Future<void> test_generic_instanceCreation_withoutArguments() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 C<int> f() {
   C<int> c = C();
   return c;
@@ -109,7 +109,7 @@
   }
 
   Future<void> test_generic_listLiteral() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 List f() {
   List<int> l = [];
   return l;
@@ -123,8 +123,23 @@
 ''');
   }
 
+  Future<void> test_generic_listLiteral_const() async {
+    await resolveTestCode('''
+String f() {
+  const List<String> values = const ['a'];
+  return values[0];
+}
+''');
+    await assertHasFix('''
+String f() {
+  const values = const <String>['a'];
+  return values[0];
+}
+''');
+  }
+
   Future<void> test_generic_mapLiteral() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 Map f() {
   Map<String, int> m = {};
   return m;
@@ -138,8 +153,23 @@
 ''');
   }
 
+  Future<void> test_generic_mapLiteral_const() async {
+    await resolveTestCode('''
+Map f() {
+  const Map<String, int> m = const {};
+  return m;
+}
+''');
+    await assertHasFix('''
+Map f() {
+  const m = const <String, int>{};
+  return m;
+}
+''');
+  }
+
   Future<void> test_generic_setLiteral() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 Set f() {
   Set<int> s = {};
   return s;
@@ -154,7 +184,7 @@
   }
 
   Future<void> test_generic_setLiteral_ambiguous() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 Set f() {
   Set s = {};
   return s;
@@ -163,8 +193,23 @@
     await assertNoFix();
   }
 
+  Future<void> test_generic_setLiteral_const() async {
+    await resolveTestCode('''
+String f() {
+  const Set<String> s = const {'a'};
+  return s.first;
+}
+''');
+    await assertHasFix('''
+String f() {
+  const s = const <String>{'a'};
+  return s.first;
+}
+''');
+  }
+
   Future<void> test_simple() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 String f() {
   String s = '';
   return s;
@@ -179,7 +224,7 @@
   }
 
   Future<void> test_simple_const() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 String f() {
   const String s = '';
   return s;
@@ -194,7 +239,7 @@
   }
 
   Future<void> test_simple_final() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 String f() {
   final String s = '';
   return s;
diff --git a/pkg/analysis_server/test/src/services/correction/fix/sort_child_property_last_test.dart b/pkg/analysis_server/test/src/services/correction/fix/sort_child_property_last_test.dart
index 48d2b28..686d8f2 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/sort_child_property_last_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/sort_child_property_last_test.dart
@@ -23,10 +23,17 @@
   @override
   String get lintCode => LintNames.sort_child_properties_last;
 
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(
+      flutter: true,
+    );
+  }
+
   /// More coverage in the `sort_child_properties_last_test.dart` assist test.
   Future<void> test_sort() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 main() {
   Column(
diff --git a/pkg/analysis_server/test/src/services/correction/fix/test_all.dart b/pkg/analysis_server/test/src/services/correction/fix/test_all.dart
index d795e61..6b82811 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/test_all.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/test_all.dart
@@ -115,6 +115,7 @@
 import 'remove_interpolation_braces_test.dart' as remove_interpolation_braces;
 import 'remove_method_declaration_test.dart' as remove_method_declaration;
 import 'remove_name_from_combinator_test.dart' as remove_name_from_combinator;
+import 'remove_non_null_assertion_test.dart' as remove_non_null_assertion_test;
 import 'remove_operator_test.dart' as remove_operator;
 import 'remove_parameters_in_getter_declaration_test.dart'
     as remove_parameters_in_getter_declaration;
@@ -271,6 +272,7 @@
     remove_interpolation_braces.main();
     remove_method_declaration.main();
     remove_name_from_combinator.main();
+    remove_non_null_assertion_test.main();
     remove_operator.main();
     remove_parameters_in_getter_declaration.main();
     remove_parentheses_in_getter_invocation.main();
diff --git a/pkg/analysis_server/test/src/services/correction/fix/update_sdk_constraints_test.dart b/pkg/analysis_server/test/src/services/correction/fix/update_sdk_constraints_test.dart
index 9576a29..d6f6cf6 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/update_sdk_constraints_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/update_sdk_constraints_test.dart
@@ -64,6 +64,7 @@
   }
 
   Future<void> test_gtGtGtOperator() async {
+    writeTestPackageConfig(languageVersion: latestLanguageVersion);
     createAnalysisOptionsFile(experiments: [EnableString.triple_shift]);
     await testUpdate(content: '''
 class C {
@@ -91,7 +92,7 @@
 environment:
   sdk: $from
 ''');
-    await resolveTestUnit(content ??
+    await resolveTestCode(content ??
         '''
 Future<int> zero() async => 0;
 ''');
diff --git a/pkg/analysis_server/test/src/services/correction/fix/use_const_test.dart b/pkg/analysis_server/test/src/services/correction/fix/use_const_test.dart
index fca39ddf..62e0701 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/use_const_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/use_const_test.dart
@@ -20,7 +20,7 @@
   FixKind get kind => DartFixKind.USE_CONST;
 
   Future<void> test_explicitNew() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 class A {
   const A();
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/use_effective_integer_division_test.dart b/pkg/analysis_server/test/src/services/correction/fix/use_effective_integer_division_test.dart
index d47bc80..d8a6c78 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/use_effective_integer_division_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/use_effective_integer_division_test.dart
@@ -20,7 +20,7 @@
   FixKind get kind => DartFixKind.USE_EFFECTIVE_INTEGER_DIVISION;
 
   Future<void> test_normalDivision() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main() {
   var a = 5;
   var b = 2;
diff --git a/pkg/analysis_server/test/src/services/correction/fix/use_eq_eq_null_test.dart b/pkg/analysis_server/test/src/services/correction/fix/use_eq_eq_null_test.dart
index c2203bb..89ecb3f 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/use_eq_eq_null_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/use_eq_eq_null_test.dart
@@ -21,7 +21,7 @@
   FixKind get kind => DartFixKind.USE_EQ_EQ_NULL;
 
   Future<void> test_isNull() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main(p) {
   p is Null;
 }
@@ -34,7 +34,7 @@
   }
 
   Future<void> test_isNull_all() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main(p, q) {
   p is Null;
   q is Null;
diff --git a/pkg/analysis_server/test/src/services/correction/fix/use_is_not_empty_test.dart b/pkg/analysis_server/test/src/services/correction/fix/use_is_not_empty_test.dart
index 14cdc4b..04a82ac 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/use_is_not_empty_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/use_is_not_empty_test.dart
@@ -24,7 +24,7 @@
   String get lintCode => LintNames.prefer_is_not_empty;
 
   Future<void> test_notIsEmpty() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 f(List<int> l) {
   if (!l.isEmpty) {}
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/use_not_eq_null_test.dart b/pkg/analysis_server/test/src/services/correction/fix/use_not_eq_null_test.dart
index f4c8590..a22c3f8 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/use_not_eq_null_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/use_not_eq_null_test.dart
@@ -21,7 +21,7 @@
   FixKind get kind => DartFixKind.USE_NOT_EQ_NULL;
 
   Future<void> test_isNotNull() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main(p) {
   p is! Null;
 }
@@ -34,7 +34,7 @@
   }
 
   Future<void> test_isNotNull_all() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 main(p, q) {
   p is! Null;
   q is! Null;
diff --git a/pkg/analysis_server/test/src/services/correction/fix/use_rethrow_test.dart b/pkg/analysis_server/test/src/services/correction/fix/use_rethrow_test.dart
index 4d8c8a10..6d78eb0 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/use_rethrow_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/use_rethrow_test.dart
@@ -24,7 +24,7 @@
   String get lintCode => LintNames.use_rethrow_when_possible;
 
   Future<void> test_rethrow() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void bad1() {
   try {} catch (e) {
     throw e;
diff --git a/pkg/analysis_server/test/src/services/correction/fix/wrap_in_future_test.dart b/pkg/analysis_server/test/src/services/correction/fix/wrap_in_future_test.dart
index 3736686..b86e482 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/wrap_in_future_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/wrap_in_future_test.dart
@@ -24,7 +24,7 @@
   String get lintCode => LintNames.avoid_returning_null_for_future;
 
   Future<void> test_asyncFor() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 Future<String> f() {
   return null;
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/wrap_in_text_test.dart b/pkg/analysis_server/test/src/services/correction/fix/wrap_in_text_test.dart
index d3b0b24..bca0c26 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/wrap_in_text_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/wrap_in_text_test.dart
@@ -22,11 +22,13 @@
   @override
   void setUp() {
     super.setUp();
-    addFlutterPackage();
+    writeTestPackageConfig(
+      flutter: true,
+    );
   }
 
   Future<void> test_literal() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 Widget f() => Center(child: 'aaa');
 ''');
@@ -37,7 +39,7 @@
   }
 
   Future<void> test_notString() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 Widget center(int i) => Center(child: i);
 ''');
@@ -45,7 +47,7 @@
   }
 
   Future<void> test_parameterType_notClass() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 typedef F = void Function();
 
 void foo({F a}) {}
@@ -58,7 +60,7 @@
   }
 
   Future<void> test_parameterType_notWidget() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void f(int i) {
   f('a');
 }
@@ -67,7 +69,7 @@
   }
 
   Future<void> test_variable() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 Widget center(String s) => Center(child: s);
 ''');
diff --git a/pkg/analysis_server/test/src/services/flutter/container_properties_test.dart b/pkg/analysis_server/test/src/services/flutter/container_properties_test.dart
index 5947dcc..a546043 100644
--- a/pkg/analysis_server/test/src/services/flutter/container_properties_test.dart
+++ b/pkg/analysis_server/test/src/services/flutter/container_properties_test.dart
@@ -20,7 +20,7 @@
 @reflectiveTest
 class ContainerPropertiesTest extends WidgetDescriptionBase {
   Future<void> test_container_existing() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 
 void main() {
@@ -49,7 +49,7 @@
   }
 
   Future<void> test_container_virtual() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 
 void main() {
@@ -82,7 +82,7 @@
 @reflectiveTest
 class ContainerPropertyAlignmentTest extends WidgetDescriptionBase {
   Future<void> test_read_hasAlign_notSimple() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 
 void main() {
@@ -99,7 +99,7 @@
   }
 
   Future<void> test_read_hasAlign_simple() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 
 void main() {
@@ -131,7 +131,7 @@
   }
 
   Future<void> test_read_hasContainer() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 
 void main() {
@@ -163,7 +163,7 @@
   }
 
   Future<void> test_read_hasContainer_directional() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 
 void main() {
@@ -195,7 +195,7 @@
   }
 
   Future<void> test_write_hasAlign_change() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 
 void main() {
@@ -227,7 +227,7 @@
   }
 
   Future<void> test_write_hasAlign_remove() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 
 void main() {
@@ -256,7 +256,7 @@
   }
 
   Future<void> test_write_hasContainer_add() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 
 void main() {
@@ -287,7 +287,7 @@
   }
 
   Future<void> test_write_hasContainer_change() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 
 void main() {
@@ -319,7 +319,7 @@
   }
 
   Future<void> test_write_hasContainer_remove() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 
 void main() {
@@ -348,7 +348,7 @@
   }
 
   Future<void> test_write_hasPadding_add() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 
 void main() {
@@ -381,7 +381,7 @@
   }
 
   Future<void> test_write_noContainer_add() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 
 void main() {
@@ -438,7 +438,7 @@
 @reflectiveTest
 class ContainerPropertyPaddingTest extends WidgetDescriptionBase {
   Future<void> test_read_hasContainer_all() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 
 void main() {
@@ -516,7 +516,7 @@
   }
 
   Future<void> test_read_hasContainer_fromLTRB() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 
 void main() {
@@ -594,7 +594,7 @@
   }
 
   Future<void> test_read_hasContainer_only() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 
 void main() {
@@ -664,7 +664,7 @@
   }
 
   Future<void> test_read_hasContainer_symmetric() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 
 void main() {
@@ -742,7 +742,7 @@
   }
 
   Future<void> test_read_hasPadding_only() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 
 void main() {
@@ -812,7 +812,7 @@
   }
 
   Future<void> test_write_hasAlign_add_only() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 
 void main() {
@@ -846,7 +846,7 @@
   }
 
   Future<void> test_write_hasContainer_add_only() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 
 void main() {
@@ -878,7 +878,7 @@
   }
 
   Future<void> test_write_hasContainer_change_all() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 
 void main() {
@@ -911,7 +911,7 @@
   }
 
   Future<void> test_write_hasContainer_change_only() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 
 void main() {
@@ -944,7 +944,7 @@
   }
 
   Future<void> test_write_hasContainer_change_remove() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 
 void main() {
@@ -976,7 +976,7 @@
   }
 
   Future<void> test_write_hasContainer_change_symmetric_both() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 
 void main() {
@@ -1009,7 +1009,7 @@
   }
 
   Future<void> test_write_hasContainer_change_symmetric_horizontal() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 
 void main() {
@@ -1042,7 +1042,7 @@
   }
 
   Future<void> test_write_hasContainer_change_symmetric_vertical() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 
 void main() {
@@ -1075,7 +1075,7 @@
   }
 
   Future<void> test_write_hasPadding_change_only() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 
 void main() {
@@ -1108,7 +1108,7 @@
   }
 
   Future<void> test_write_noContainer_add_only() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 
 void main() {
diff --git a/pkg/analysis_server/test/src/services/flutter/widget_description.dart b/pkg/analysis_server/test/src/services/flutter/widget_description.dart
index da82d9c..012b925 100644
--- a/pkg/analysis_server/test/src/services/flutter/widget_description.dart
+++ b/pkg/analysis_server/test/src/services/flutter/widget_description.dart
@@ -88,7 +88,9 @@
   @override
   void setUp() {
     super.setUp();
-    addFlutterPackage();
+    writeTestPackageConfig(
+      flutter: true,
+    );
   }
 
   void _removeNotInterestingElements(Map<String, dynamic> json) {
diff --git a/pkg/analysis_server/test/src/services/flutter/widget_descriptions_test.dart b/pkg/analysis_server/test/src/services/flutter/widget_descriptions_test.dart
index 4fcb4b3..a29b993 100644
--- a/pkg/analysis_server/test/src/services/flutter/widget_descriptions_test.dart
+++ b/pkg/analysis_server/test/src/services/flutter/widget_descriptions_test.dart
@@ -17,8 +17,39 @@
 
 @reflectiveTest
 class GetDescriptionTest extends WidgetDescriptionBase {
+  Future<void> test_documentation_fieldFormalParameter() async {
+    await resolveTestCode('''
+class MyWidget {
+  /// my doc
+  final int f;
+  MyWidget(this.f);
+}
+
+void f() {
+  MyWidget(0);
+}
+''');
+    var property = await getWidgetProperty('MyWidget(0', 'f');
+    expect(property.documentation, 'my doc');
+  }
+
+  Future<void> test_documentation_fieldFormalParameter_unresolvedField() async {
+    verifyNoTestUnitErrors = false;
+    await resolveTestCode('''
+class MyWidget {
+  MyWidget(this.f);
+}
+
+void f() {
+  MyWidget(0);
+}
+''');
+    var property = await getWidgetProperty('MyWidget(0', 'f');
+    expect(property.documentation, isNull);
+  }
+
   Future<void> test_kind_named_notSet() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 
 void main() {
@@ -41,7 +72,7 @@
   }
 
   Future<void> test_kind_named_set() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 
 void main() {
@@ -68,7 +99,7 @@
   }
 
   Future<void> test_kind_required() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 
 void main() {
@@ -95,7 +126,7 @@
   }
 
   Future<void> test_nested_notSet() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 
 void main() {
@@ -119,7 +150,7 @@
   }
 
   Future<void> test_nested_set() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 
 void main() {
@@ -172,7 +203,7 @@
   }
 
   Future<void> test_notInstanceCreation() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void main() {
   42;
 }
@@ -182,7 +213,7 @@
   }
 
   Future<void> test_type_double() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 
 void main() {
@@ -204,7 +235,7 @@
   }
 
   Future<void> test_type_enum() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 
 void main() {
@@ -262,7 +293,7 @@
   }
 
   Future<void> test_type_int() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 
 void main() {
@@ -285,7 +316,7 @@
 
   Future<void> test_unresolvedInstanceCreation() async {
     verifyNoTestUnitErrors = false;
-    await resolveTestUnit('''
+    await resolveTestCode('''
 void main() {
   new Foo();
 }
@@ -298,7 +329,7 @@
 @reflectiveTest
 class SetPropertyValueSelfTest extends WidgetDescriptionBase {
   Future<void> test_expression() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 
 void main() {
@@ -322,7 +353,7 @@
   }
 
   Future<void> test_expression_formatError() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 
 void main() {
@@ -345,7 +376,7 @@
   }
 
   Future<void> test_format_dontFormatOther() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 
 void functionbefore() {
@@ -388,7 +419,7 @@
   }
 
   Future<void> test_invalidId() async {
-    await resolveTestUnit('');
+    await resolveTestCode('');
 
     var result = await descriptions.setPropertyValue(42, null);
 
@@ -400,7 +431,7 @@
   }
 
   Future<void> test_named_addValue_beforeChild() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 
 void main() {
@@ -437,7 +468,7 @@
   }
 
   Future<void> test_named_addValue_beforeChildren() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 
 void main() {
@@ -474,7 +505,7 @@
   }
 
   Future<void> test_named_addValue_hasComma() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 
 void main() {
@@ -501,7 +532,7 @@
   }
 
   Future<void> test_named_addValue_noComma() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 
 void main() {
@@ -528,7 +559,7 @@
   }
 
   Future<void> test_named_addValue_sortedByName_first() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 
 void main() {
@@ -565,7 +596,7 @@
   }
 
   Future<void> test_named_addValue_sortedByName_last() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 
 void main() {
@@ -602,7 +633,7 @@
   }
 
   Future<void> test_named_addValue_sortedByName_middle() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 
 void main() {
@@ -641,7 +672,7 @@
   }
 
   Future<void> test_named_changeValue() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 
 void main() {
@@ -665,7 +696,7 @@
   }
 
   Future<void> test_named_removeValue_last() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 
 void main() {
@@ -686,7 +717,7 @@
   }
 
   Future<void> test_named_removeValue_notLast() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 
 void main() {
@@ -707,7 +738,7 @@
   }
 
   Future<void> test_nested_addValue() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 
 void main() {
@@ -738,7 +769,7 @@
   }
 
   Future<void> test_nested_addValue_materialize() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 
 void main() {
@@ -769,7 +800,7 @@
   }
 
   Future<void> test_required_changeValue() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 
 void main() {
@@ -793,7 +824,7 @@
   }
 
   Future<void> test_required_removeValue() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 
 void main() {
@@ -812,7 +843,7 @@
   }
 
   Future<void> test_type_enum_addValue() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 
 void main() {
diff --git a/pkg/analysis_server/test/src/utilities/flutter_test.dart b/pkg/analysis_server/test/src/utilities/flutter_test.dart
index b7d9636..0d8276a 100644
--- a/pkg/analysis_server/test/src/utilities/flutter_test.dart
+++ b/pkg/analysis_server/test/src/utilities/flutter_test.dart
@@ -22,11 +22,13 @@
   @override
   void setUp() {
     super.setUp();
-    addFlutterPackage();
+    writeTestPackageConfig(
+      flutter: true,
+    );
   }
 
   Future<void> test_getWidgetPresentationText_icon() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 var w = const Icon(Icons.book);
 ''');
@@ -36,7 +38,7 @@
 
   Future<void> test_getWidgetPresentationText_icon_withoutArguments() async {
     verifyNoTestUnitErrors = false;
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 var w = const Icon();
 ''');
@@ -45,7 +47,7 @@
   }
 
   Future<void> test_getWidgetPresentationText_notWidget() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 var w = new Object();
 ''');
@@ -54,7 +56,7 @@
   }
 
   Future<void> test_getWidgetPresentationText_text() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 var w = const Text('foo');
 ''');
@@ -63,7 +65,7 @@
   }
 
   Future<void> test_getWidgetPresentationText_text_longText() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 var w = const Text('${'abc' * 100}');
 ''');
@@ -76,7 +78,7 @@
 
   Future<void> test_getWidgetPresentationText_text_withoutArguments() async {
     verifyNoTestUnitErrors = false;
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 var w = const Text();
 ''');
@@ -86,7 +88,7 @@
 
   Future<void> test_getWidgetPresentationText_unresolved() async {
     verifyNoTestUnitErrors = false;
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/material.dart';
 var w = new Foo();
 ''');
@@ -95,7 +97,7 @@
   }
 
   Future<void> test_identifyWidgetExpression_node_instanceCreation() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/widgets.dart';
 
 main() {
@@ -151,7 +153,7 @@
   }
 
   Future<void> test_identifyWidgetExpression_node_invocation() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/widgets.dart';
 
 main() {
@@ -184,7 +186,7 @@
   }
 
   Future<void> test_identifyWidgetExpression_node_namedExpression() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/widgets.dart';
 
 main() {
@@ -199,7 +201,7 @@
 
   Future<void>
       test_identifyWidgetExpression_node_prefixedIdentifier_identifier() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/widgets.dart';
 
 abstract class Foo extends Widget {
@@ -216,7 +218,7 @@
 
   Future<void>
       test_identifyWidgetExpression_node_prefixedIdentifier_prefix() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/widgets.dart';
 
 abstract class Foo extends Widget {
@@ -232,7 +234,7 @@
   }
 
   Future<void> test_identifyWidgetExpression_node_simpleIdentifier() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/widgets.dart';
 
 main(Widget widget) {
@@ -244,7 +246,7 @@
   }
 
   Future<void> test_identifyWidgetExpression_null() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/widgets.dart';
 
 main() {
@@ -267,7 +269,7 @@
   }
 
   Future<void> test_identifyWidgetExpression_parent_argumentList() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/widgets.dart';
 
 main() {
@@ -283,7 +285,7 @@
 
   Future<void>
       test_identifyWidgetExpression_parent_assignmentExpression() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/widgets.dart';
 
 main() {
@@ -314,7 +316,7 @@
 
   Future<void>
       test_identifyWidgetExpression_parent_conditionalExpression() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/widgets.dart';
 
 main(bool condition, Widget w1, Widget w2) {
@@ -330,7 +332,7 @@
 
   Future<void>
       test_identifyWidgetExpression_parent_expressionFunctionBody() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/widgets.dart';
 
 main(Widget widget) => widget; // ref
@@ -341,7 +343,7 @@
 
   Future<void>
       test_identifyWidgetExpression_parent_expressionStatement() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/widgets.dart';
 
 main(Widget widget) {
@@ -353,7 +355,7 @@
   }
 
   Future<void> test_identifyWidgetExpression_parent_forElement() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/widgets.dart';
 
 main(bool b) {
@@ -369,7 +371,7 @@
   }
 
   Future<void> test_identifyWidgetExpression_parent_ifElement() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/widgets.dart';
 
 main(bool b) {
@@ -391,7 +393,7 @@
   }
 
   Future<void> test_identifyWidgetExpression_parent_listLiteral() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/widgets.dart';
 
 main(Widget widget) {
@@ -403,7 +405,7 @@
   }
 
   Future<void> test_identifyWidgetExpression_parent_namedExpression() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/widgets.dart';
 
 main() {
@@ -418,7 +420,7 @@
   }
 
   Future<void> test_identifyWidgetExpression_parent_returnStatement() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/widgets.dart';
 
 main(Widget widget) {
@@ -430,7 +432,7 @@
   }
 
   Future<void> test_isWidget() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/widgets.dart';
 
 class MyStatelessWidget extends StatelessWidget {}
@@ -456,7 +458,7 @@
   }
 
   Future<void> test_isWidgetCreation() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/widgets.dart';
 
 var a = new Object();
@@ -472,7 +474,7 @@
   }
 
   Future<void> test_isWidgetExpression() async {
-    await resolveTestUnit('''
+    await resolveTestCode('''
 import 'package:flutter/widgets.dart';
 
 main() {
diff --git a/pkg/analyzer/CHANGELOG.md b/pkg/analyzer/CHANGELOG.md
index 2a979a6..3fdeadb 100644
--- a/pkg/analyzer/CHANGELOG.md
+++ b/pkg/analyzer/CHANGELOG.md
@@ -1,3 +1,31 @@
+## 0.41.0 (Not yet released - breaking changes)
+* Replaced `Scope.lookup({id, setter})` with `lookup(id)`.
+* Deprecated `Scope.lookup2(id)`, use `lookup()` instead.
+* Removed deprecated `Member.baseElement`.
+* Removed deprecated `package:analyzer/analyzer.dart` library.
+* Removed deprecated `ElementAnnotation.constantValue`.
+* Removed deprecated `VariableElement.constantValue`.
+* Removed deprecated `VariableElement.initializer`.
+* Removed deprecated `auxiliaryElements`.
+* The value of`FunctionType.element` for types created from a `typedef`
+  is now `FunctionTypeAliasElement`, not its function element.
+* Removed deprecated `GenericTypeAliasElement`.
+
+## 0.40.6
+* The non_nullable feature is released in 2.12 language version.
+* Updated the current language version to 2.12.
+* Changed the default language version when the package does not specify one.
+  Instead of the latest known language version, the language version of the
+  SDK (against which analysis is done, not necessary the same as used to run
+  the analyzer) is used.
+
+## 0.40.5
+* Deprecated `GenericTypeAliasElement`. Use `FunctionTypeAliasElement`.
+* Read imports, exports, and parts on demand in `AnalysisDriver`.
+  Specifically, `parseFileSync` will not read any referenced files.
+* Types are not set anymore for classes/constructors/getters of
+  identifiers in metadata (still set in arguments).
+
 ## 0.40.4
 * Deprecated `IndexExpression.auxiliaryElements` and
   `SimpleIdentifier.auxiliaryElements`. Use `CompoundAssignmentExpression`.
diff --git a/pkg/analyzer/lib/analyzer.dart b/pkg/analyzer/lib/analyzer.dart
deleted file mode 100644
index c38b4a3..0000000
--- a/pkg/analyzer/lib/analyzer.dart
+++ /dev/null
@@ -1,191 +0,0 @@
-// Copyright (c) 2013, 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.
-
-/// This library is no longer supported, but most of the functionality it
-/// provides is available through supported analyzer APIs.  See specific methods
-/// below for more information about their supported replacements.
-@Deprecated('See package:analyzer/analyzer.dart file for details')
-library analyzer;
-
-import 'dart:io';
-
-import 'package:analyzer/dart/analysis/features.dart';
-import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/error/error.dart';
-import 'package:analyzer/error/listener.dart';
-import 'package:analyzer/file_system/physical_file_system.dart';
-import 'package:analyzer/src/dart/scanner/reader.dart';
-import 'package:analyzer/src/dart/scanner/scanner.dart';
-import 'package:analyzer/src/error.dart';
-import 'package:analyzer/src/file_system/file_system.dart';
-import 'package:analyzer/src/generated/parser.dart';
-import 'package:analyzer/src/generated/source_io.dart';
-import 'package:analyzer/src/string_source.dart';
-import 'package:path/path.dart' as pathos;
-
-export 'package:analyzer/dart/ast/ast.dart';
-export 'package:analyzer/dart/ast/visitor.dart';
-export 'package:analyzer/error/error.dart';
-export 'package:analyzer/error/listener.dart';
-export 'package:analyzer/src/dart/ast/utilities.dart';
-export 'package:analyzer/src/error.dart';
-export 'package:analyzer/src/error/codes.dart';
-export 'package:analyzer/src/generated/utilities_dart.dart';
-
-/// Parses a string of Dart code into an AST.
-///
-/// If [name] is passed, it's used in error messages as the name of the code
-/// being parsed.
-///
-/// Throws an [AnalyzerErrorGroup] if any errors occurred, unless
-/// [suppressErrors] is `true`, in which case any errors are discarded.
-///
-/// If [parseFunctionBodies] is [false] then only function signatures will be
-/// parsed.  (Currently broken; function bodies are always parsed).
-///
-/// Deprecated - please use the `parseString` function
-/// (from package:analyzer/dart/analysis/utilities.dart) instead.
-///
-/// Note that `parseString` does not support the `parseFunctionBodies` option;
-/// callers that don't require function bodies should simply ignore them.
-@Deprecated('Please use parseString instead')
-CompilationUnit parseCompilationUnit(String contents,
-    {String name,
-    bool suppressErrors = false,
-    bool parseFunctionBodies = true,
-    FeatureSet featureSet}) {
-  // TODO(paulberry): make featureSet a required parameter
-  featureSet ??= FeatureSet.fromEnableFlags([]);
-  Source source = StringSource(contents, name);
-  return _parseSource(contents, source, featureSet,
-      suppressErrors: suppressErrors, parseFunctionBodies: parseFunctionBodies);
-}
-
-/// Parses a Dart file into an AST.
-///
-/// Throws an [AnalyzerErrorGroup] if any errors occurred, unless
-/// [suppressErrors] is `true`, in which case any errors are discarded.
-///
-/// If [parseFunctionBodies] is [false] then only function signatures will be
-/// parsed.  (Currently broken; function bodies are always parsed).
-///
-/// Deprecated - please use the `parseFile` function
-/// (from package:analyzer/dart/analysis/utilities.dart) instead.
-///
-/// Note that `parseFile` does not support the `parseFunctionBodies` option;
-/// callers that don't require function bodies should simply ignore them.
-@Deprecated('Please use parseFile instead')
-CompilationUnit parseDartFile(String path,
-    {bool suppressErrors = false,
-    bool parseFunctionBodies = true,
-    FeatureSet featureSet}) {
-  // TODO(paulberry): Make featureSet a required parameter
-  featureSet ??= FeatureSet.fromEnableFlags([]);
-  String contents = File(path).readAsStringSync();
-  var sourceFactory =
-      SourceFactory([ResourceUriResolver(PhysicalResourceProvider.INSTANCE)]);
-
-  var absolutePath = pathos.absolute(path);
-  var source = sourceFactory.forUri(pathos.toUri(absolutePath).toString());
-  if (source == null) {
-    throw ArgumentError("Can't get source for path $path");
-  }
-  if (!source.exists()) {
-    throw ArgumentError("Source $source doesn't exist");
-  }
-
-  return _parseSource(contents, source, featureSet,
-      suppressErrors: suppressErrors, parseFunctionBodies: parseFunctionBodies);
-}
-
-/// Parses the script tag and directives in a string of Dart code into an AST.
-/// (Currently broken; the entire file is parsed).
-///
-/// Stops parsing when the first non-directive is encountered. The rest of the
-/// string will not be parsed.
-///
-/// If [name] is passed, it's used in error messages as the name of the code
-/// being parsed.
-///
-/// Throws an [AnalyzerErrorGroup] if any errors occurred, unless
-/// [suppressErrors] is `true`, in which case any errors are discarded.
-///
-/// Deprecated - please use the `parseString` function
-/// (from package:analyzer/dart/analysis/utilities.dart) instead.
-///
-/// Note that `parseString` parses the whole file; callers that only require
-/// directives should simply ignore the rest of the parse result.
-@Deprecated('Please use parseString instead')
-CompilationUnit parseDirectives(String contents,
-    {String name, bool suppressErrors = false, FeatureSet featureSet}) {
-  // TODO(paulberry): make featureSet a required parameter.
-  featureSet ??= FeatureSet.fromEnableFlags([]);
-  var source = StringSource(contents, name);
-  var errorCollector = _ErrorCollector();
-  var reader = CharSequenceReader(contents);
-  var scanner = Scanner(source, reader, errorCollector)
-    ..configureFeatures(
-      featureSetForOverriding: featureSet,
-      featureSet: featureSet,
-    );
-  var token = scanner.tokenize();
-  var parser = Parser(
-    source,
-    errorCollector,
-    featureSet: featureSet,
-  );
-  var unit = parser.parseDirectives(token);
-  unit.lineInfo = LineInfo(scanner.lineStarts);
-
-  if (errorCollector.hasErrors && !suppressErrors) throw errorCollector.group;
-
-  return unit;
-}
-
-/// Converts an AST node representing a string literal into a [String].
-@Deprecated('Please use StringLiteral.stringValue instead')
-String stringLiteralToString(StringLiteral literal) {
-  return literal.stringValue;
-}
-
-CompilationUnit _parseSource(
-    String contents, Source source, FeatureSet featureSet,
-    {bool suppressErrors = false, bool parseFunctionBodies = true}) {
-  var reader = CharSequenceReader(contents);
-  var errorCollector = _ErrorCollector();
-  var scanner = Scanner(source, reader, errorCollector)
-    ..configureFeatures(
-      featureSetForOverriding: featureSet,
-      featureSet: featureSet,
-    );
-  var token = scanner.tokenize();
-  var parser = Parser(
-    source,
-    errorCollector,
-    featureSet: featureSet,
-  )..parseFunctionBodies = parseFunctionBodies;
-  var unit = parser.parseCompilationUnit(token)
-    ..lineInfo = LineInfo(scanner.lineStarts);
-
-  if (errorCollector.hasErrors && !suppressErrors) throw errorCollector.group;
-
-  return unit;
-}
-
-/// A simple error listener that collects errors into an [AnalyzerErrorGroup].
-class _ErrorCollector extends AnalysisErrorListener {
-  final _errors = <AnalysisError>[];
-
-  _ErrorCollector();
-
-  /// The group of errors collected.
-  AnalyzerErrorGroup get group =>
-      AnalyzerErrorGroup.fromAnalysisErrors(_errors);
-
-  /// Whether any errors where collected.
-  bool get hasErrors => _errors.isNotEmpty;
-
-  @override
-  void onError(AnalysisError error) => _errors.add(error);
-}
diff --git a/pkg/analyzer/lib/dart/ast/ast.dart b/pkg/analyzer/lib/dart/ast/ast.dart
index aa20e8b..7ee7034 100644
--- a/pkg/analyzer/lib/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/dart/ast/ast.dart
@@ -38,7 +38,6 @@
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
-import 'package:analyzer/src/dart/element/element.dart' show AuxiliaryElements;
 import 'package:analyzer/src/generated/java_engine.dart';
 import 'package:analyzer/src/generated/source.dart' show LineInfo, Source;
 import 'package:analyzer/src/generated/utilities_dart.dart';
@@ -3235,23 +3234,6 @@
 /// Clients may not extend, implement or mix-in this class.
 abstract class IndexExpression
     implements NullShortableExpression, MethodReferenceExpression {
-  /// Return the auxiliary elements associated with this identifier, or `null`
-  /// if this identifier is not in both a getter and setter context.
-  ///
-  /// The auxiliary elements hold the static and propagated elements associated
-  /// with the getter context.
-  // TODO(brianwilkerson) Replace this API.
-  @Deprecated('Use CompoundAssignmentExpression.readElement and/or '
-      'CompoundAssignmentExpression.writeElement')
-  AuxiliaryElements get auxiliaryElements;
-
-  /// Set the auxiliary elements associated with this identifier to the given
-  /// [elements].
-  // TODO(brianwilkerson) Replace this API.
-  @Deprecated('Use CompoundAssignmentExpression.readElement and/or '
-      'CompoundAssignmentExpression.writeElement')
-  set auxiliaryElements(AuxiliaryElements elements);
-
   /// Return the expression used to compute the index.
   Expression get index;
 
@@ -4597,23 +4579,6 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 abstract class SimpleIdentifier implements Identifier {
-  /// Return the auxiliary elements associated with this identifier, or `null`
-  /// if this identifier is not in both a getter and setter context.
-  ///
-  /// The auxiliary elements hold the static and propagated elements associated
-  /// with the getter context.
-  // TODO(brianwilkerson) Replace this API.
-  @Deprecated('Use CompoundAssignmentExpression.readElement and/or '
-      'CompoundAssignmentExpression.writeElement')
-  AuxiliaryElements get auxiliaryElements;
-
-  /// Set the auxiliary elements associated with this identifier to the given
-  /// [elements].
-  // TODO(brianwilkerson) Replace this API.
-  @Deprecated('Use CompoundAssignmentExpression.readElement and/or '
-      'CompoundAssignmentExpression.writeElement')
-  set auxiliaryElements(AuxiliaryElements elements);
-
   /// Return `true` if this identifier is the "name" part of a prefixed
   /// identifier or a method invocation.
   bool get isQualified;
diff --git a/pkg/analyzer/lib/dart/element/element.dart b/pkg/analyzer/lib/dart/element/element.dart
index 9e50585..be7a1eb 100644
--- a/pkg/analyzer/lib/dart/element/element.dart
+++ b/pkg/analyzer/lib/dart/element/element.dart
@@ -691,14 +691,14 @@
   /// produced but no errors were generated, then the list will be empty.
   List<AnalysisError> get constantEvaluationErrors;
 
-  /// Return a representation of the value of this annotation, or `null` if the
-  /// value of this annotation has not been computed or if the value could not
-  /// be computed because of errors.
-  @Deprecated('Use computeConstantValue() instead')
-  DartObject get constantValue;
-
-  /// Return the element representing the field, variable, or const constructor
-  /// being used as an annotation.
+  /// Return the element referenced by this annotation.
+  ///
+  /// In valid code this element can be a [PropertyAccessorElement] getter
+  /// of a constant top-level variable, or a constant static field of a
+  /// class; or a constant [ConstructorElement].
+  ///
+  /// In invalid code this element can be `null`, or a reference to any
+  /// other element.
   Element get element;
 
   /// Return `true` if this annotation marks the associated function as always
@@ -1149,24 +1149,20 @@
 
 /// A function type alias (`typedef`).
 ///
+/// This class models a type alias whose body specifies a function type, as
+/// is the only possible kind of type alias before the generalization that
+/// allows the body to be an arbitrary type.
+///
+/// This class will be deprecated and [TypeAliasElement] will replace it
+/// when non-function type aliases are enabled by default.
+///
 /// Clients may not extend, implement or mix-in this class.
-abstract class FunctionTypeAliasElement
-    implements TypeParameterizedElement, TypeDefiningElement {
-  @override
-  CompilationUnitElement get enclosingElement;
-
+abstract class FunctionTypeAliasElement implements TypeAliasElement {
   /// Return the generic function type element representing the generic function
   /// type on the right side of the equals.
   GenericFunctionTypeElement get function;
 
-  /// Produces the function type resulting from instantiating this typedef with
-  /// the given [typeArguments] and [nullabilitySuffix].
-  ///
-  /// Note that this always instantiates the typedef itself, so for a
-  /// [GenericTypeAliasElement] the returned [FunctionType] might still be a
-  /// generic function, with type formals. For example, if the typedef is:
-  ///     typedef F<T> = void Function<U>(T, U);
-  /// then `F<int>` will produce `void Function<U>(int, U)`.
+  @override
   FunctionType instantiate({
     @required List<DartType> typeArguments,
     @required NullabilitySuffix nullabilitySuffix,
@@ -1197,11 +1193,6 @@
 /// Clients may not extend, implement, or mix-in this class.
 abstract class GenericFunctionTypeElement implements FunctionTypedElement {}
 
-/// A synonym for [FunctionTypeAliasElement].
-///
-/// Clients may not extend, implement, or mix-in this class.
-abstract class GenericTypeAliasElement implements FunctionTypeAliasElement {}
-
 /// A combinator that causes some of the names in a namespace to be hidden when
 /// being imported.
 ///
@@ -1657,6 +1648,28 @@
   bool get isExternal;
 }
 
+/// A type alias (`typedef`).
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class TypeAliasElement
+    implements TypeParameterizedElement, TypeDefiningElement {
+  @override
+  CompilationUnitElement get enclosingElement;
+
+  /// Produces the type resulting from instantiating this typedef with the given
+  /// [typeArguments] and [nullabilitySuffix].
+  ///
+  /// Note that this always instantiates the typedef itself, so for a
+  /// [TypeAliasElement] the returned [DartType] might still be a generic
+  /// type, with type formals. For example, if the typedef is:
+  ///     typedef F<T> = void Function<U>(T, U);
+  /// then `F<int>` will produce `void Function<U>(int, U)`.
+  DartType instantiate({
+    @required List<DartType> typeArguments,
+    @required NullabilitySuffix nullabilitySuffix,
+  });
+}
+
 /// An element that defines a type.
 ///
 /// Clients may not extend, implement or mix-in this class.
@@ -1730,14 +1743,6 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 abstract class VariableElement implements Element, ConstantEvaluationTarget {
-  /// Return a representation of the value of this variable.
-  ///
-  /// Return `null` if either this variable was not declared with the 'const'
-  /// modifier or if the value of this variable could not be computed because of
-  /// errors.
-  @Deprecated('Use computeConstantValue() instead')
-  DartObject get constantValue;
-
   @override
   VariableElement get declaration;
 
@@ -1745,13 +1750,6 @@
   /// specified for it.
   bool get hasImplicitType;
 
-  /// Return a synthetic function representing this variable's initializer, or
-  /// `null` if this variable does not have an initializer. The function will
-  /// have no parameters. The return type of the function will be the
-  /// compile-time type of the initialization expression.
-  @deprecated
-  FunctionElement get initializer;
-
   /// Return `true` if this variable was declared with the 'const' modifier.
   bool get isConst;
 
diff --git a/pkg/analyzer/lib/dart/element/scope.dart b/pkg/analyzer/lib/dart/element/scope.dart
index ee35529..2129a4e 100644
--- a/pkg/analyzer/lib/dart/element/scope.dart
+++ b/pkg/analyzer/lib/dart/element/scope.dart
@@ -3,20 +3,22 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/element/element.dart';
-import 'package:meta/meta.dart';
 
 /// Scopes are used to resolve names to elements.
 abstract class Scope {
-  /// Return the element with the name `id` or `id=` (if [setter] is `true`),
-  /// `null` if the name is not defined within this scope.
-  @Deprecated('Use lookup2() that is closer to the language specification')
-  Element lookup({@required String id, @required bool setter});
+  /// Return the result of lexical lookup for the given [id], not `null`.
+  ///
+  /// Getters and setters are bundled, when we found one or another, we are
+  /// done with the lookup, and return both the getter and the setter, if
+  /// available.
+  ScopeLookupResult lookup(String id);
 
   /// Return the result of lexical lookup for the given [id], not `null`.
   ///
   /// Getters and setters are bundled, when we found one or another, we are
   /// done with the lookup, and return both the getter and the setter, if
   /// available.
+  @Deprecated('Use lookup() instead')
   ScopeLookupResult lookup2(String id);
 }
 
diff --git a/pkg/analyzer/lib/dart/element/type.dart b/pkg/analyzer/lib/dart/element/type.dart
index 326b7a8..e7c04af 100644
--- a/pkg/analyzer/lib/dart/element/type.dart
+++ b/pkg/analyzer/lib/dart/element/type.dart
@@ -29,6 +29,14 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 abstract class DartType {
+  /// If this type is an instantiation of a type alias, return the type
+  /// arguments used for the instantiation. Otherwise return `null`.
+  List<DartType> get aliasArguments;
+
+  /// If this type is an instantiation of a type alias, return it.
+  /// Otherwise return `null`.
+  TypeAliasElement get aliasElement;
+
   /// Return the name of this type as it should appear when presented to users
   /// in contexts such as error messages.
   ///
diff --git a/pkg/analyzer/lib/dart/sdk/build_sdk_summary.dart b/pkg/analyzer/lib/dart/sdk/build_sdk_summary.dart
index 8705915..f3c9a79 100644
--- a/pkg/analyzer/lib/dart/sdk/build_sdk_summary.dart
+++ b/pkg/analyzer/lib/dart/sdk/build_sdk_summary.dart
@@ -12,7 +12,6 @@
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/context/context.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/dart/analysis/session.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/sdk/sdk.dart';
@@ -217,7 +216,7 @@
 
     var unit = result.unit as CompilationUnitImpl;
     unit.languageVersion = LibraryLanguageVersion(
-      package: ExperimentStatus.currentVersion,
+      package: languageVersion,
       override: null,
     );
 
diff --git a/pkg/analyzer/lib/error/error.dart b/pkg/analyzer/lib/error/error.dart
index ab4089c..990feb4 100644
--- a/pkg/analyzer/lib/error/error.dart
+++ b/pkg/analyzer/lib/error/error.dart
@@ -16,6 +16,7 @@
 import 'package:analyzer/src/generated/parser.dart' show ParserErrorCode;
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/manifest/manifest_warning_code.dart';
+import 'package:analyzer/src/pubspec/pubspec_warning_code.dart';
 
 export 'package:_fe_analyzer_shared/src/base/errors.dart'
     show ErrorCode, ErrorSeverity, ErrorType;
@@ -63,7 +64,6 @@
   CompileTimeErrorCode.ABSTRACT_FIELD_CONSTRUCTOR_INITIALIZER,
   CompileTimeErrorCode.ABSTRACT_FIELD_INITIALIZER,
   CompileTimeErrorCode.ABSTRACT_SUPER_MEMBER_REFERENCE,
-  CompileTimeErrorCode.ACCESS_PRIVATE_ENUM_FIELD,
   CompileTimeErrorCode.AMBIGUOUS_EXPORT,
   CompileTimeErrorCode.AMBIGUOUS_EXTENSION_MEMBER_ACCESS,
   CompileTimeErrorCode.AMBIGUOUS_IMPORT,
@@ -123,7 +123,6 @@
   CompileTimeErrorCode.CONST_EVAL_TYPE_NUM,
   CompileTimeErrorCode.CONST_EVAL_TYPE_TYPE,
   CompileTimeErrorCode.CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE,
-  CompileTimeErrorCode.CONST_FORMAL_PARAMETER,
   CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE,
   CompileTimeErrorCode
       .CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE_FROM_DEFERRED_LIBRARY,
@@ -482,6 +481,7 @@
   HintCode.DEPRECATED_MIXIN_FUNCTION,
   HintCode.DIVISION_OPTIMIZATION,
   HintCode.DUPLICATE_HIDDEN_NAME,
+  HintCode.DUPLICATE_IGNORE,
   HintCode.DUPLICATE_IMPORT,
   HintCode.DUPLICATE_SHOWN_NAME,
   HintCode.EQUAL_ELEMENTS_IN_SET,
@@ -535,6 +535,7 @@
   HintCode.NULL_AWARE_BEFORE_OPERATOR,
   HintCode.NULL_AWARE_IN_CONDITION,
   HintCode.NULL_AWARE_IN_LOGICAL_OPERATOR,
+  HintCode.NULL_CHECK_ALWAYS_FAILS,
   HintCode.NULLABLE_TYPE_IN_CATCH_CLAUSE,
   HintCode.OVERRIDE_EQUALS_BUT_NOT_HASH_CODE,
   HintCode.OVERRIDE_ON_NON_OVERRIDING_FIELD,
@@ -561,7 +562,9 @@
   HintCode.TYPE_CHECK_IS_NULL,
   HintCode.UNDEFINED_HIDDEN_NAME,
   HintCode.UNDEFINED_SHOWN_NAME,
+  HintCode.UNIGNORABLE_IGNORE,
   HintCode.UNNECESSARY_CAST,
+  HintCode.UNNECESSARY_IGNORE,
   HintCode.UNNECESSARY_NO_SUCH_METHOD,
   HintCode.UNNECESSARY_NULL_COMPARISON_FALSE,
   HintCode.UNNECESSARY_NULL_COMPARISON_TRUE,
@@ -793,6 +796,9 @@
   ParserErrorCode.WITH_BEFORE_EXTENDS,
   ParserErrorCode.WRONG_SEPARATOR_FOR_POSITIONAL_PARAMETER,
   ParserErrorCode.WRONG_TERMINATOR_FOR_PARAMETER_GROUP,
+  PubspecWarningCode.INVALID_DEPENDENCY,
+  PubspecWarningCode.PATH_DOES_NOT_EXIST,
+  PubspecWarningCode.PATH_PUBSPEC_DOES_NOT_EXIST,
   ScannerErrorCode.EXPECTED_TOKEN,
   ScannerErrorCode.ILLEGAL_CHARACTER,
   ScannerErrorCode.MISSING_DIGIT,
diff --git a/pkg/analyzer/lib/file_system/file_system.dart b/pkg/analyzer/lib/file_system/file_system.dart
index ac8456c..7f6e20e 100644
--- a/pkg/analyzer/lib/file_system/file_system.dart
+++ b/pkg/analyzer/lib/file_system/file_system.dart
@@ -43,7 +43,7 @@
   /// If [newPath] identifies an existing file, that file is replaced.
   /// If [newPath] identifies an existing resource the operation might fail and
   /// an exception is thrown.
-  File renameSync(String newPath);
+  File renameSync(String /*!*/ newPath);
 
   /// Synchronously write the given [bytes] to the file. The new content will
   /// replace any existing content.
@@ -81,12 +81,12 @@
   ///
   /// However, regardless of whether [path] is relative or absolute, normalize
   /// it by removing path components of the form '.' or '..'.
-  String canonicalizePath(String path);
+  String canonicalizePath(String /*!*/ path);
 
   /// Return `true` if the [path] references a resource in this folder.
   ///
   /// The [path] must be absolute and normalized.
-  bool contains(String path);
+  bool contains(String /*!*/ path);
 
   @override
   Folder copyTo(Folder parentFolder);
@@ -96,19 +96,19 @@
 
   /// Return an existing child [Resource] with the given [relPath].
   /// Return a not existing [File] if no such child exist.
-  Resource getChild(String relPath);
+  Resource getChild(String /*!*/ relPath);
 
   /// Return a [File] representing a child [Resource] with the given
   /// [relPath].  This call does not check whether a file with the given name
   /// exists on the filesystem - client must call the [File]'s `exists` getter
   /// to determine whether the folder actually exists.
-  File getChildAssumingFile(String relPath);
+  File getChildAssumingFile(String /*!*/ relPath);
 
   /// Return a [Folder] representing a child [Resource] with the given
   /// [relPath].  This call does not check whether a folder with the given name
   /// exists on the filesystem--client must call the [Folder]'s `exists` getter
   /// to determine whether the folder actually exists.
-  Folder getChildAssumingFolder(String relPath);
+  Folder getChildAssumingFolder(String /*!*/ relPath);
 
   /// Return a list of existing direct children [Resource]s (folders and files)
   /// in this folder, in no particular order.
@@ -145,7 +145,7 @@
   /// Existing files and folders will be overwritten.
   ///
   /// Return the resource corresponding to this resource in the parent folder.
-  Resource copyTo(Folder parentFolder);
+  Resource copyTo(Folder /*!*/ parentFolder);
 
   /// Synchronously deletes this resource and its children.
   ///
@@ -156,7 +156,7 @@
   /// this folder.
   ///
   /// The [path] must be absolute and normalized.
-  bool isOrContains(String path);
+  bool isOrContains(String /*!*/ path);
 
   /// Return a resource that refers to the same resource as this resource, but
   /// whose path does not contain any symbolic links.
@@ -177,14 +177,14 @@
   /// The [path] must be absolute and normalized.
   ///
   /// A file may or may not exist at this location.
-  File getFile(String path);
+  File getFile(String /*!*/ path);
 
   /// Return a [Folder] that corresponds to the given [path].
   ///
   /// The [path] must be absolute and normalized.
   ///
   /// A folder may or may not exist at this location.
-  Folder getFolder(String path);
+  Folder getFolder(String /*!*/ path);
 
   /// Complete with a list of modification times for the given [sources].
   ///
@@ -195,7 +195,7 @@
   /// Return the [Resource] that corresponds to the given [path].
   ///
   /// The [path] must be absolute and normalized.
-  Resource getResource(String path);
+  Resource getResource(String /*!*/ path);
 
   /// Return the folder in which the plugin with the given [pluginId] can store
   /// state that will persist across sessions. The folder returned for a given
diff --git a/pkg/analyzer/lib/file_system/memory_file_system.dart b/pkg/analyzer/lib/file_system/memory_file_system.dart
index d852cb0..caaeae1 100644
--- a/pkg/analyzer/lib/file_system/memory_file_system.dart
+++ b/pkg/analyzer/lib/file_system/memory_file_system.dart
@@ -44,6 +44,7 @@
   /// This is a utility method for testing; paths passed in to other methods in
   /// this class are never converted automatically.
   String convertPath(String path) {
+    assert(path != null);
     if (pathContext.style == pathos.windows.style) {
       if (path.startsWith(pathos.posix.separator)) {
         path = r'C:' + path;
@@ -84,12 +85,14 @@
 
   @override
   File getFile(String path) {
+    assert(path != null);
     _ensureAbsoluteAndNormalized(path);
     return _MemoryFile(this, path);
   }
 
   @override
   Folder getFolder(String path) {
+    assert(path != null);
     _ensureAbsoluteAndNormalized(path);
     return _MemoryFolder(this, path);
   }
@@ -104,6 +107,7 @@
 
   @override
   Resource getResource(String path) {
+    assert(path != null);
     _ensureAbsoluteAndNormalized(path);
     return _pathToResource[path] ?? _MemoryFile(this, path);
   }
@@ -115,6 +119,7 @@
   }
 
   void modifyFile(String path, String content) {
+    assert(content != null);
     _checkFileAtPath(path);
     _pathToBytes[path] = utf8.encode(content) as Uint8List;
     _pathToTimestamp[path] = nextStamp++;
@@ -203,6 +208,7 @@
   }
 
   void _checkFileAtPath(String path) {
+    assert(path != null);
     // TODO(brianwilkerson) Consider throwing a FileSystemException rather than
     // an ArgumentError.
     _MemoryResource resource = _pathToResource[path];
@@ -216,6 +222,7 @@
   }
 
   void _checkFolderAtPath(String path) {
+    assert(path != null);
     // TODO(brianwilkerson) Consider throwing a FileSystemException rather than
     // an ArgumentError.
     _MemoryResource resource = _pathToResource[path];
@@ -228,6 +235,7 @@
   /// The file system abstraction supports only absolute and normalized paths.
   /// This method is used to validate any input paths to prevent errors later.
   void _ensureAbsoluteAndNormalized(String path) {
+    assert(path != null);
     if (!pathContext.isAbsolute(path)) {
       throw ArgumentError("Path must be absolute : $path");
     }
@@ -238,6 +246,7 @@
 
   /// Create a new [_MemoryFile] without any content.
   _MemoryFile _newFile(String path) {
+    assert(path != null);
     String folderPath = pathContext.dirname(path);
     _MemoryResource folder = _pathToResource[folderPath];
     if (folder == null) {
@@ -251,6 +260,7 @@
   }
 
   void _notifyWatchers(String path, ChangeType changeType) {
+    assert(path != null);
     _pathToWatchers.forEach((String watcherPath,
         List<StreamController<WatchEvent>> streamControllers) {
       if (watcherPath == path || pathContext.isWithin(watcherPath, path)) {
@@ -263,6 +273,7 @@
   }
 
   _MemoryFile _renameFileSync(_MemoryFile file, String newPath) {
+    assert(newPath != null);
     String path = file.path;
     if (newPath == path) {
       return file;
@@ -285,6 +296,7 @@
   }
 
   String _resolveLinks(String path) {
+    assert(path != null);
     var linkTarget = _pathToLinkedPath[path];
     if (linkTarget != null) {
       return linkTarget;
@@ -424,6 +436,7 @@
 
   @override
   File copyTo(Folder parentFolder) {
+    assert(parentFolder != null);
     parentFolder.create();
     File destination = parentFolder.getChildAssumingFile(shortName);
     destination.writeAsBytesSync(readAsBytesSync());
@@ -504,6 +517,7 @@
 
   @override
   String canonicalizePath(String relPath) {
+    assert(relPath != null);
     relPath = provider.pathContext.normalize(relPath);
     String childPath = provider.pathContext.join(path, relPath);
     childPath = provider.pathContext.normalize(childPath);
@@ -512,6 +526,7 @@
 
   @override
   bool contains(String path) {
+    assert(path != null);
     return provider.pathContext.isWithin(this.path, path);
   }
 
diff --git a/pkg/analyzer/lib/src/context/source.dart b/pkg/analyzer/lib/src/context/source.dart
index 74a85dc..377fe5e 100644
--- a/pkg/analyzer/lib/src/context/source.dart
+++ b/pkg/analyzer/lib/src/context/source.dart
@@ -13,6 +13,30 @@
 import 'package:analyzer/src/source/package_map_resolver.dart';
 import 'package:analyzer/src/workspace/package_build.dart';
 
+/// Return `true` if the given [source] refers to a file that is assumed to be
+/// generated.
+bool isGeneratedSource(Source source) {
+  if (source == null) {
+    return false;
+  }
+  // TODO(brianwilkerson) Generalize this mechanism.
+  const List<String> suffixes = <String>[
+    '.g.dart',
+    '.pb.dart',
+    '.pbenum.dart',
+    '.pbserver.dart',
+    '.pbjson.dart',
+    '.template.dart'
+  ];
+  String fullName = source.fullName;
+  for (String suffix in suffixes) {
+    if (fullName.endsWith(suffix)) {
+      return true;
+    }
+  }
+  return false;
+}
+
 /// Instances of the class `SourceFactory` resolve possibly relative URI's
 /// against an existing [Source].
 class SourceFactoryImpl implements SourceFactory {
diff --git a/pkg/analyzer/lib/src/dart/analysis/context_locator.dart b/pkg/analyzer/lib/src/dart/analysis/context_locator.dart
index db71f9e..65fdea6 100644
--- a/pkg/analyzer/lib/src/dart/analysis/context_locator.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/context_locator.dart
@@ -101,9 +101,10 @@
       root.packagesFile = defaultPackagesFile ?? _findPackagesFile(folder);
       root.optionsFile = defaultOptionsFile ?? _findOptionsFile(folder);
       root.included.add(folder);
+      root.excludedGlobs = _getExcludedGlobs(root);
       roots.add(root);
       _createContextRootsIn(roots, folder, excludedFolders, root,
-          _getExcludedFiles(root), defaultOptionsFile, defaultPackagesFile);
+          root.excludedGlobs, defaultOptionsFile, defaultPackagesFile);
     }
     Map<Folder, ContextRoot> rootMap = <Folder, ContextRoot>{};
     for (File file in includedFiles) {
@@ -135,14 +136,14 @@
   /// file will be used even if there is a local version of the file.
   ///
   /// For each directory within the given [folder] that is neither in the list
-  /// of [excludedFolders] nor excluded by the [excludedFilePatterns],
-  /// recursively search for nested context roots.
+  /// of [excludedFolders] nor excluded by the [excludedGlobs], recursively
+  /// search for nested context roots.
   void _createContextRoots(
       List<ContextRoot> roots,
       Folder folder,
       List<Folder> excludedFolders,
       ContextRoot containingRoot,
-      List<Glob> excludedFilePatterns,
+      List<Glob> excludedGlobs,
       File optionsFile,
       File packagesFile) {
     //
@@ -175,16 +176,16 @@
       containingRoot.excluded.add(folder);
       roots.add(root);
       containingRoot = root;
-      excludedFilePatterns = _getExcludedFiles(root);
+      excludedGlobs = _getExcludedGlobs(root);
+      root.excludedGlobs = excludedGlobs;
     }
     _createContextRootsIn(roots, folder, excludedFolders, containingRoot,
-        excludedFilePatterns, optionsFile, packagesFile);
+        excludedGlobs, optionsFile, packagesFile);
   }
 
   /// For each directory within the given [folder] that is neither in the list
-  /// of [excludedFolders] nor excluded by the [excludedFilePatterns],
-  /// recursively search for nested context roots and add them to the list of
-  /// [roots].
+  /// of [excludedFolders] nor excluded by the [excludedGlobs], recursively
+  /// search for nested context roots and add them to the list of [roots].
   ///
   /// If either the [optionsFile] or [packagesFile] is non-`null` then the given
   /// file will be used even if there is a local version of the file.
@@ -193,7 +194,7 @@
       Folder folder,
       List<Folder> excludedFolders,
       ContextRoot containingRoot,
-      List<Glob> excludedFilePatterns,
+      List<Glob> excludedGlobs,
       File optionsFile,
       File packagesFile) {
     bool isExcluded(Folder folder) {
@@ -201,7 +202,7 @@
           folder.shortName.startsWith('.')) {
         return true;
       }
-      for (Glob pattern in excludedFilePatterns) {
+      for (Glob pattern in excludedGlobs) {
         if (pattern.matches(folder.path)) {
           return true;
         }
@@ -220,7 +221,7 @@
             containingRoot.excluded.add(child);
           } else {
             _createContextRoots(roots, child, excludedFolders, containingRoot,
-                excludedFilePatterns, optionsFile, packagesFile);
+                excludedGlobs, optionsFile, packagesFile);
           }
         }
       }
@@ -235,9 +236,9 @@
   /// folder or any parent folder.
   File _findOptionsFile(Folder folder) {
     while (folder != null) {
-      File packagesFile = _getOptionsFile(folder);
-      if (packagesFile != null) {
-        return packagesFile;
+      File optionsFile = _getOptionsFile(folder);
+      if (optionsFile != null) {
+        return optionsFile;
       }
       folder = folder.parent;
     }
@@ -263,7 +264,7 @@
   /// file associated with the context root. The list will be empty if there are
   /// no exclusion patterns in the options file, or if there is no options file
   /// associated with the context root.
-  List<Glob> _getExcludedFiles(ContextRootImpl root) {
+  List<Glob> _getExcludedGlobs(ContextRootImpl root) {
     List<Glob> patterns = [];
     File optionsFile = root.optionsFile;
     if (optionsFile != null) {
@@ -281,8 +282,10 @@
                 for (String excludedPath in excludeList) {
                   Context context = resourceProvider.pathContext;
                   if (context.isRelative(excludedPath)) {
-                    excludedPath =
-                        context.join(optionsFile.parent.path, excludedPath);
+                    excludedPath = posix.joinAll([
+                      ...context.split(optionsFile.parent.path),
+                      ...posix.split(excludedPath),
+                    ]);
                   }
                   patterns.add(Glob(excludedPath, context: context));
                 }
diff --git a/pkg/analyzer/lib/src/dart/analysis/context_root.dart b/pkg/analyzer/lib/src/dart/analysis/context_root.dart
index e652710..5888139 100644
--- a/pkg/analyzer/lib/src/dart/analysis/context_root.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/context_root.dart
@@ -4,6 +4,7 @@
 
 import 'package:analyzer/dart/analysis/context_root.dart';
 import 'package:analyzer/file_system/file_system.dart';
+import 'package:glob/glob.dart';
 import 'package:path/path.dart';
 
 /// An implementation of a context root.
@@ -15,10 +16,14 @@
   final Folder root;
 
   @override
-  final List<Resource> included = <Resource>[];
+  final List<Resource> included = [];
 
   @override
-  final List<Resource> excluded = <Resource>[];
+  final List<Resource> excluded = [];
+
+  /// A list of the globs for excluded files that were read from the analysis
+  /// options file.
+  List<Glob> excludedGlobs = [];
 
   @override
   File optionsFile;
@@ -109,6 +114,11 @@
         }
       }
     }
+    for (Glob pattern in excludedGlobs) {
+      if (pattern.matches(path)) {
+        return true;
+      }
+    }
     return false;
   }
 
diff --git a/pkg/analyzer/lib/src/dart/analysis/dependency/reference_collector.dart b/pkg/analyzer/lib/src/dart/analysis/dependency/reference_collector.dart
index 71b4b2e2..74a6b93 100644
--- a/pkg/analyzer/lib/src/dart/analysis/dependency/reference_collector.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/dependency/reference_collector.dart
@@ -213,7 +213,7 @@
         assignmentType != TokenType.QUESTION_QUESTION_EQ) {
       var operatorType = operatorFromCompoundAssignment(assignmentType);
       _recordClassMemberReference(
-        targetType: node.leftHandSide.staticType,
+        targetType: node.readType,
         name: operatorType.lexeme,
       );
     }
@@ -576,12 +576,12 @@
     var operator = node.operator.type;
     if (operator == TokenType.MINUS_MINUS) {
       _recordClassMemberReference(
-        targetType: node.operand.staticType,
+        targetType: node.readType,
         name: '-',
       );
     } else if (operator == TokenType.PLUS_PLUS) {
       _recordClassMemberReference(
-        targetType: node.operand.staticType,
+        targetType: node.readType,
         name: '+',
       );
     } else {
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index 8e30f1f..57c4895 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -85,7 +85,7 @@
 /// TODO(scheglov) Clean up the list of implicitly analyzed files.
 class AnalysisDriver implements AnalysisDriverGeneric {
   /// The version of data format, should be incremented on every format change.
-  static const int DATA_VERSION = 112;
+  static const int DATA_VERSION = 113;
 
   /// The length of the list returned by [_computeDeclaredVariablesSignature].
   static const int _declaredVariablesSignatureLength = 4;
@@ -174,6 +174,14 @@
   /// The list of tasks to compute files referencing a name.
   final _referencingNameTasks = <_FilesReferencingNameTask>[];
 
+  /// The mapping from the files for which errors were requested using
+  /// [getErrors] to the [Completer]s to report the result.
+  final _errorsRequestedFiles = <String, List<Completer<ErrorsResult>>>{};
+
+  /// The requests from [_errorsRequestedFiles] for files which were found to
+  /// be parts without known libraries, so delayed.
+  final _errorsRequestedParts = <String, List<Completer<ErrorsResult>>>{};
+
   /// The mapping from the files for which the index was requested using
   /// [getIndex] to the [Completer]s to report the result.
   final _indexRequestedFiles =
@@ -385,6 +393,9 @@
         _referencingNameTasks.isNotEmpty) {
       return AnalysisDriverPriority.interactive;
     }
+    if (_errorsRequestedFiles.isNotEmpty) {
+      return AnalysisDriverPriority.interactive;
+    }
     if (_indexRequestedFiles.isNotEmpty) {
       return AnalysisDriverPriority.interactive;
     }
@@ -416,7 +427,8 @@
     if (_fileTracker.hasPendingFiles) {
       return AnalysisDriverPriority.general;
     }
-    if (_requestedParts.isNotEmpty ||
+    if (_errorsRequestedParts.isNotEmpty ||
+        _requestedParts.isNotEmpty ||
         _partsToAnalyze.isNotEmpty ||
         _unitElementSignatureParts.isNotEmpty ||
         _unitElementRequestedParts.isNotEmpty) {
@@ -547,19 +559,12 @@
       return null;
     }
 
-    // Ask the analysis result without unit, so return cached errors.
-    // If no cached analysis result, it will be computed.
-    ResolvedUnitResult analysisResult = _computeAnalysisResult(path);
-
-    // If not computed yet, because a part file without a known library,
-    // we have to compute the full analysis result, with the unit.
-    analysisResult ??= await getResult(path);
-    if (analysisResult == null) {
-      return null;
-    }
-
-    return ErrorsResultImpl(currentSession, path, analysisResult.uri,
-        analysisResult.lineInfo, analysisResult.isPart, analysisResult.errors);
+    var completer = Completer<ErrorsResult>();
+    _errorsRequestedFiles
+        .putIfAbsent(path, () => <Completer<ErrorsResult>>[])
+        .add(completer);
+    _scheduler.notify(this);
+    return completer.future;
   }
 
   /// Return a [Future] that completes with the list of added files that
@@ -967,6 +972,21 @@
       return;
     }
 
+    // Process an error request.
+    if (_errorsRequestedFiles.isNotEmpty) {
+      var path = _errorsRequestedFiles.keys.first;
+      var completers = _errorsRequestedFiles.remove(path);
+      var result = _computeErrors(path: path, asIsIfPartWithoutLibrary: false);
+      if (result != null) {
+        completers.forEach((completer) {
+          completer.complete(result);
+        });
+      } else {
+        _errorsRequestedParts.putIfAbsent(path, () => []).addAll(completers);
+      }
+      return;
+    }
+
     // Process an index request.
     if (_indexRequestedFiles.isNotEmpty) {
       String path = _indexRequestedFiles.keys.first;
@@ -1147,6 +1167,17 @@
       });
       return;
     }
+
+    // Compute errors in a part.
+    if (_errorsRequestedParts.isNotEmpty) {
+      var path = _errorsRequestedParts.keys.first;
+      var completers = _errorsRequestedParts.remove(path);
+      var result = _computeErrors(path: path, asIsIfPartWithoutLibrary: true);
+      completers.forEach((completer) {
+        completer.complete(result);
+      });
+      return;
+    }
   }
 
   /// Remove the file with the given [path] from the list of files to analyze.
@@ -1334,6 +1365,21 @@
     return Uint8List.fromList(bytes).buffer.asUint32List();
   }
 
+  ErrorsResult _computeErrors({
+    @required String path,
+    @required bool asIsIfPartWithoutLibrary,
+  }) {
+    ResolvedUnitResult analysisResult = _computeAnalysisResult(path,
+        withUnit: false, asIsIfPartWithoutLibrary: asIsIfPartWithoutLibrary);
+
+    if (analysisResult == null) {
+      return null;
+    }
+
+    return ErrorsResultImpl(currentSession, path, analysisResult.uri,
+        analysisResult.lineInfo, analysisResult.isPart, analysisResult.errors);
+  }
+
   AnalysisDriverUnitIndex _computeIndex(String path) {
     AnalysisResult analysisResult = _computeAnalysisResult(path,
         withUnit: false, asIsIfPartWithoutLibrary: true);
@@ -1343,6 +1389,12 @@
   /// Return the newly computed resolution result of the library with the
   /// given [path].
   ResolvedLibraryResultImpl _computeResolvedLibrary(String path) {
+    return NullSafetyUnderstandingFlag.enableNullSafetyTypes(
+        () => _computeResolvedLibrary2(path));
+  }
+
+  /// Unwrapped implementation of [_computeResolvedLibrary].
+  ResolvedLibraryResultImpl _computeResolvedLibrary2(String path) {
     FileState library = _fsState.getFileForPath(path);
 
     return _logger.run('Compute resolved library $path', () {
@@ -2295,7 +2347,7 @@
     while (timer.elapsedMilliseconds < _MS_WORK_INTERVAL) {
       // Prepare files to check.
       if (filesToCheck.isEmpty) {
-        Set<String> newFiles = driver.addedFiles.difference(checkedFiles);
+        Set<String> newFiles = driver.knownFiles.difference(checkedFiles);
         filesToCheck.addAll(newFiles);
       }
 
diff --git a/pkg/analyzer/lib/src/dart/analysis/experiments.g.dart b/pkg/analyzer/lib/src/dart/analysis/experiments.g.dart
index 9f390a8..9103fc1 100644
--- a/pkg/analyzer/lib/src/dart/analysis/experiments.g.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/experiments.g.dart
@@ -8,7 +8,7 @@
 
 /// The current version of the Dart language (or, for non-stable releases, the
 /// version of the language currently in the process of being developed).
-const _currentVersion = '2.11.0';
+const _currentVersion = '2.12.0';
 
 /// A map containing information about all known experimental flags.
 final _knownFeatures = <String, ExperimentalFeature>{
@@ -98,7 +98,7 @@
     isExpired: IsExpired.non_nullable,
     documentation: 'Non Nullable by default',
     experimentalReleaseVersion: Version.parse('2.10.0'),
-    releaseVersion: null,
+    releaseVersion: Version.parse('2.12.0'),
   );
 
   static final nonfunction_type_aliases = ExperimentalFeature(
@@ -175,7 +175,7 @@
   static const bool extension_methods = true;
 
   /// Default state of the experiment "non-nullable"
-  static const bool non_nullable = false;
+  static const bool non_nullable = true;
 
   /// Default state of the experiment "nonfunction-type-aliases"
   static const bool nonfunction_type_aliases = false;
diff --git a/pkg/analyzer/lib/src/dart/analysis/feature_set_provider.dart b/pkg/analyzer/lib/src/dart/analysis/feature_set_provider.dart
index 16a57bd..32b5d0f 100644
--- a/pkg/analyzer/lib/src/dart/analysis/feature_set_provider.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/feature_set_provider.dart
@@ -6,7 +6,6 @@
 import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/context/packages.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/generated/sdk.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/util/uri.dart';
@@ -85,7 +84,7 @@
   /// be either lower, or higher than the package language version.
   Version getLanguageVersion(String path, Uri uri) {
     if (uri.isScheme('dart')) {
-      return ExperimentStatus.currentVersion;
+      return _sdkLanguageVersion;
     }
     var package = _findPackage(uri, path);
     if (package != null) {
@@ -93,7 +92,7 @@
       if (languageVersion != null) {
         return languageVersion;
       }
-      return ExperimentStatus.currentVersion;
+      return _sdkLanguageVersion;
     }
 
     return _nonPackageDefaultLanguageVersion;
diff --git a/pkg/analyzer/lib/src/dart/analysis/file_state.dart b/pkg/analyzer/lib/src/dart/analysis/file_state.dart
index 0a3dee5..00d6c6f 100644
--- a/pkg/analyzer/lib/src/dart/analysis/file_state.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/file_state.dart
@@ -13,7 +13,6 @@
 import 'package:analyzer/dart/ast/standard_ast_factory.dart';
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/element/element.dart';
-import 'package:analyzer/error/error.dart';
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/dart/analysis/byte_store.dart';
@@ -27,7 +26,6 @@
 import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/scanner/reader.dart';
 import 'package:analyzer/src/dart/scanner/scanner.dart';
-import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/parser.dart';
 import 'package:analyzer/src/generated/source.dart';
@@ -194,23 +192,54 @@
 
   /// Return the set of all directly referenced files - imported, exported or
   /// parted.
-  Set<FileState> get directReferencedFiles => _directReferencedFiles;
+  Set<FileState> get directReferencedFiles {
+    return _directReferencedFiles ??= <FileState>{
+      ...importedFiles,
+      ...exportedFiles,
+      ...partedFiles,
+    };
+  }
 
   /// Return the set of all directly referenced libraries - imported or
   /// exported.
-  Set<FileState> get directReferencedLibraries => _directReferencedLibraries;
+  Set<FileState> get directReferencedLibraries {
+    return _directReferencedLibraries ??= <FileState>{
+      ...importedFiles,
+      ...exportedFiles,
+    };
+  }
 
   /// Return `true` if the file exists.
   bool get exists => _exists;
 
   /// The list of files this file exports.
-  List<FileState> get exportedFiles => _exportedFiles;
+  List<FileState> get exportedFiles {
+    if (_exportedFiles == null) {
+      _exportedFiles = <FileState>[];
+      for (var directive in _unlinked2.exports) {
+        var uri = _selectRelativeUri(directive);
+        var file = _fileForRelativeUri(uri);
+        _exportedFiles.add(file);
+      }
+    }
+    return _exportedFiles;
+  }
 
   @override
   int get hashCode => uri.hashCode;
 
   /// The list of files this file imports.
-  List<FileState> get importedFiles => _importedFiles;
+  List<FileState> get importedFiles {
+    if (_importedFiles == null) {
+      _importedFiles = <FileState>[];
+      for (var directive in _unlinked2.imports) {
+        var uri = _selectRelativeUri(directive);
+        var file = _fileForRelativeUri(uri);
+        _importedFiles.add(file);
+      }
+    }
+    return _importedFiles;
+  }
 
   LibraryCycle get internal_libraryCycle => _libraryCycle;
 
@@ -239,6 +268,7 @@
   /// of. Return `null` if a library is not known, for example because we have
   /// not processed a library file yet.
   FileState get library {
+    _fsState.readPartsForLibraries();
     List<FileState> libraries = _fsState._partToLibraries[this];
     if (libraries == null || libraries.isEmpty) {
       return null;
@@ -266,13 +296,27 @@
 
   /// The list of files files that this library consists of, i.e. this library
   /// file itself and its [partedFiles].
-  List<FileState> get libraryFiles => _libraryFiles;
+  List<FileState> get libraryFiles {
+    return _libraryFiles ??= [this, ...partedFiles];
+  }
 
   /// Return information about line in the file.
   LineInfo get lineInfo => _lineInfo;
 
   /// The list of files this library file references as parts.
-  List<FileState> get partedFiles => _partedFiles;
+  List<FileState> get partedFiles {
+    if (_partedFiles == null) {
+      _partedFiles = <FileState>[];
+      for (var uri in _unlinked2.parts) {
+        var file = _fileForRelativeUri(uri);
+        _partedFiles.add(file);
+        _fsState._partToLibraries
+            .putIfAbsent(file, () => <FileState>[])
+            .add(this);
+      }
+    }
+    return _partedFiles;
+  }
 
   /// The external names referenced by the file.
   Set<String> get referencedNames {
@@ -289,7 +333,7 @@
 
     void appendReferenced(FileState file) {
       if (transitiveFiles.add(file)) {
-        file._directReferencedFiles?.forEach(appendReferenced);
+        file.directReferencedFiles.forEach(appendReferenced);
       }
     }
 
@@ -438,39 +482,16 @@
       }
     }
 
-    // Build the graph.
-    _importedFiles = <FileState>[];
-    _exportedFiles = <FileState>[];
-    _partedFiles = <FileState>[];
-    for (var directive in _unlinked2.imports) {
-      var uri = _selectRelativeUri(directive);
-      var file = _fileForRelativeUri(uri);
-      _importedFiles.add(file);
-    }
-    for (var directive in _unlinked2.exports) {
-      var uri = _selectRelativeUri(directive);
-      var file = _fileForRelativeUri(uri);
-      _exportedFiles.add(file);
-    }
-    for (var uri in _unlinked2.parts) {
-      var file = _fileForRelativeUri(uri);
-      _partedFiles.add(file);
-      _fsState._partToLibraries
-          .putIfAbsent(file, () => <FileState>[])
-          .add(this);
-    }
-    _libraryFiles = [this, ..._partedFiles];
+    // Read imports/exports on demand.
+    _importedFiles = null;
+    _exportedFiles = null;
+    _directReferencedFiles = null;
+    _directReferencedLibraries = null;
 
-    // Compute referenced files.
-    _directReferencedFiles = <FileState>{
-      ..._importedFiles,
-      ..._exportedFiles,
-      ..._partedFiles,
-    };
-    _directReferencedLibraries = <FileState>{
-      ..._importedFiles,
-      ..._exportedFiles,
-    };
+    // Read parts on demand.
+    _fsState._librariesWithoutPartsRead.add(this);
+    _partedFiles = null;
+    _libraryFiles = null;
 
     // Update mapping from subtyped names to files.
     for (var name in _driverUnlinkedUnit.subtypedNames) {
@@ -590,7 +611,11 @@
 ''');
     }
 
-    _setLanguageVersion(unit, scanner.languageVersion, errorListener);
+    var unitImpl = unit as CompilationUnitImpl;
+    unitImpl.languageVersion = LibraryLanguageVersion(
+      package: packageLanguageVersion,
+      override: scanner.overrideVersion,
+    );
 
     // StringToken uses a static instance of StringCanonicalizer, so we need
     // to clear it explicitly once we are done using it for this file.
@@ -613,38 +638,6 @@
     return directive.uri;
   }
 
-  /// Set the language version for the file, from the [versionToken], or from
-  /// the package language version.
-  void _setLanguageVersion(
-    CompilationUnit unit,
-    LanguageVersionToken versionToken,
-    AnalysisErrorListener errorListener,
-  ) {
-    Version overrideVersion;
-    if (versionToken != null) {
-      overrideVersion = Version(versionToken.major, versionToken.minor, 0);
-      var latestVersion = ExperimentStatus.currentVersion;
-      if (overrideVersion > latestVersion) {
-        errorListener.onError(
-          AnalysisError(
-            source,
-            versionToken.offset,
-            versionToken.length,
-            HintCode.INVALID_LANGUAGE_VERSION_OVERRIDE_GREATER,
-            [latestVersion.major, latestVersion.minor],
-          ),
-        );
-        overrideVersion = null;
-      }
-    }
-
-    var unitImpl = unit as CompilationUnitImpl;
-    unitImpl.languageVersion = LibraryLanguageVersion(
-      package: packageLanguageVersion,
-      override: overrideVersion,
-    );
-  }
-
   static UnlinkedUnit2Builder serializeAstUnlinked2(CompilationUnit unit) {
     var exports = <UnlinkedNamespaceDirectiveBuilder>[];
     var imports = <UnlinkedNamespaceDirectiveBuilder>[];
@@ -778,6 +771,11 @@
   /// Mapping from a path to the corresponding canonical [FileState].
   final Map<String, FileState> _pathToCanonicalFile = {};
 
+  /// We don't read parts until requested, but if we need to know the
+  /// library for a file, we need to read parts of every file to know
+  /// which libraries reference this part.
+  final List<FileState> _librariesWithoutPartsRead = [];
+
   /// Mapping from a part to the libraries it is a part of.
   final Map<FileState, List<FileState>> _partToLibraries = {};
 
@@ -847,6 +845,19 @@
     return featureSetProvider.getFeatureSet(path, uri);
   }
 
+  Version contextLanguageVersion(
+    String path,
+    Uri uri,
+    WorkspacePackage workspacePackage,
+  ) {
+    var workspaceLanguageVersion = workspacePackage?.languageVersion;
+    if (workspaceLanguageVersion != null) {
+      return workspaceLanguageVersion;
+    }
+
+    return featureSetProvider.getLanguageVersion(path, uri);
+  }
+
   /// Return the canonical [FileState] for the given absolute [path]. The
   /// returned file has the last known state since if was last refreshed.
   ///
@@ -870,7 +881,7 @@
       WorkspacePackage workspacePackage = _workspace?.findPackageFor(path);
       FeatureSet featureSet = contextFeatureSet(path, uri, workspacePackage);
       Version packageLanguageVersion =
-          featureSetProvider.getLanguageVersion(path, uri);
+          contextLanguageVersion(path, uri, workspacePackage);
       file = FileState._(this, path, uri, uriSource, workspacePackage,
           featureSet, packageLanguageVersion);
       _uriToFile[uri] = file;
@@ -914,7 +925,7 @@
       WorkspacePackage workspacePackage = _workspace?.findPackageFor(path);
       FeatureSet featureSet = contextFeatureSet(path, uri, workspacePackage);
       Version packageLanguageVersion =
-          featureSetProvider.getLanguageVersion(path, uri);
+          contextLanguageVersion(path, uri, workspacePackage);
       file = FileState._(this, path, uri, source, workspacePackage, featureSet,
           packageLanguageVersion);
       _uriToFile[uri] = file;
@@ -967,6 +978,19 @@
     _fileContentCache.remove(path);
   }
 
+  void readPartsForLibraries() {
+    // Make a copy, because reading new files will update it.
+    var libraryToProcess = _librariesWithoutPartsRead.toList();
+
+    // We will process these files, so clear it now.
+    // It will be filled with new files during the loop below.
+    _librariesWithoutPartsRead.clear();
+
+    for (var library in libraryToProcess) {
+      library.partedFiles;
+    }
+  }
+
   /// Remove the file with the given [path].
   void removeFile(String path) {
     markFileForReading(path);
diff --git a/pkg/analyzer/lib/src/dart/analysis/index.dart b/pkg/analyzer/lib/src/dart/analysis/index.dart
index 630e395..c664f80 100644
--- a/pkg/analyzer/lib/src/dart/analysis/index.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/index.dart
@@ -7,6 +7,7 @@
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
+import 'package:analyzer/src/dart/ast/extensions.dart';
 import 'package:analyzer/src/summary/format.dart';
 import 'package:analyzer/src/summary/idl.dart';
 import 'package:meta/meta.dart';
@@ -648,7 +649,7 @@
 
   @override
   void visitIndexExpression(IndexExpression node) {
-    MethodElement element = node.staticElement;
+    MethodElement element = node.writeOrReadElement;
     if (element is MethodElement) {
       Token operator = node.leftBracket;
       recordRelationToken(element, IndexRelationKind.IS_INVOKED_BY, operator);
@@ -737,7 +738,7 @@
       return;
     }
 
-    Element element = node.staticElement;
+    Element element = node.writeOrReadElement;
     if (node is SimpleIdentifier && element is ParameterElement) {
       element = declaredParameterElement(node, element);
     }
diff --git a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
index d49ac6d..e6ca405 100644
--- a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
@@ -6,8 +6,10 @@
 import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/dart/element/null_safety_understanding_flag.dart';
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/error/listener.dart';
+import 'package:analyzer/src/context/source.dart';
 import 'package:analyzer/src/dart/analysis/file_state.dart';
 import 'package:analyzer/src/dart/analysis/testing_data.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
@@ -20,13 +22,13 @@
 import 'package:analyzer/src/dart/element/inheritance_manager3.dart';
 import 'package:analyzer/src/dart/element/type_provider.dart';
 import 'package:analyzer/src/dart/element/type_system.dart';
-import 'package:analyzer/src/dart/error/syntactic_errors.dart';
 import 'package:analyzer/src/dart/resolver/flow_analysis_visitor.dart';
 import 'package:analyzer/src/dart/resolver/legacy_type_asserter.dart';
 import 'package:analyzer/src/dart/resolver/resolution_visitor.dart';
 import 'package:analyzer/src/error/best_practices_verifier.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/error/dead_code_verifier.dart';
+import 'package:analyzer/src/error/ignore_validator.dart';
 import 'package:analyzer/src/error/imports_verifier.dart';
 import 'package:analyzer/src/error/inheritance_override.dart';
 import 'package:analyzer/src/error/language_version_override_verifier.dart';
@@ -107,6 +109,10 @@
 
   /// Compute analysis results for all units of the library.
   Map<FileState, UnitAnalysisResult> analyzeSync() {
+    // Analyzer understands null safety, so it should set
+    // NullSafetyUnderstandingFlag.
+    assert(NullSafetyUnderstandingFlag.isEnabled);
+
     timerLibraryAnalyzer.start();
     Map<FileState, CompilationUnit> units = {};
 
@@ -175,6 +181,16 @@
 
     _checkForInconsistentLanguageVersionOverride(units);
 
+    // This must happen after all other diagnostics have been computed but
+    // before the list of diagnostics has been filtered.
+    for (var file in _library.libraryFiles) {
+      if (file.source != null) {
+        IgnoreValidator(_getErrorReporter(file), _getErrorListener(file).errors,
+                _fileToIgnoreInfo[file], _fileToLineInfo[file])
+            .reportErrors();
+      }
+    }
+
     timerLibraryAnalyzerVerify.stop();
 
     // Return full results.
@@ -422,39 +438,8 @@
     bool isIgnored(AnalysisError error) {
       var code = error.errorCode;
       // Don't allow error severity issues to be ignored.
-      if (!code.isIgnorable) {
-        // The [code] is not ignorable, but we've allowed a few "privileged"
-        // cases. Each is annotated with an issue which represents technical
-        // debt. Once cleaned up, we may remove this notion of "privileged".
-        // In the case of [CompileTimeErrorCode.IMPORT_INTERNAL_LIBRARY], we may
-        // just decide that it happens enough in tests that it can be declared
-        // an ignorable error, and in practice other back ends will prevent
-        // non-internal code from importing internal code.
-        bool privileged = false;
-
-        if (code == CompileTimeErrorCode.UNDEFINED_FUNCTION ||
-            code == CompileTimeErrorCode.UNDEFINED_PREFIXED_NAME) {
-          // Special case a small number of errors in Flutter code which are
-          // ignored. The erroneous code is found in a conditionally imported
-          // library, which uses a special version of the "dart:ui" library
-          // which the Analyzer does not use during analysis. See
-          // https://github.com/flutter/flutter/issues/52899.
-          if (file.path.contains('flutter')) {
-            privileged = true;
-          }
-        }
-
-        if ((code == CompileTimeErrorCode.IMPORT_INTERNAL_LIBRARY ||
-                code == CompileTimeErrorCode.UNDEFINED_ANNOTATION ||
-                code == ParserErrorCode.NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE) &&
-            (file.path.contains('tests/compiler/dart2js') ||
-                file.path.contains('pkg/compiler/test'))) {
-          // Special case the dart2js language tests. Some of these import
-          // various internal libraries.
-          privileged = true;
-        }
-
-        if (!privileged) return false;
+      if (!IgnoreValidator.isIgnorable(file.path, code)) {
+        return false;
       }
 
       int errorLine = lineInfo.getLocation(error.offset).lineNumber;
@@ -824,7 +809,7 @@
     }
     StringLiteral uriLiteral = directive.uri;
     CompileTimeErrorCode errorCode = CompileTimeErrorCode.URI_DOES_NOT_EXIST;
-    if (_isGenerated(source)) {
+    if (isGeneratedSource(source)) {
       errorCode = CompileTimeErrorCode.URI_HAS_NOT_BEEN_GENERATED;
     }
     _getErrorReporter(file)
@@ -840,30 +825,6 @@
       }
     }
   }
-
-  /// Return `true` if the given [source] refers to a file that is assumed to be
-  /// generated.
-  static bool _isGenerated(Source source) {
-    if (source == null) {
-      return false;
-    }
-    // TODO(brianwilkerson) Generalize this mechanism.
-    const List<String> suffixes = <String>[
-      '.g.dart',
-      '.pb.dart',
-      '.pbenum.dart',
-      '.pbserver.dart',
-      '.pbjson.dart',
-      '.template.dart'
-    ];
-    String fullName = source.fullName;
-    for (String suffix in suffixes) {
-      if (fullName.endsWith(suffix)) {
-        return true;
-      }
-    }
-    return false;
-  }
 }
 
 /// Analysis result for single file.
diff --git a/pkg/analyzer/lib/src/dart/analysis/library_context.dart b/pkg/analyzer/lib/src/dart/analysis/library_context.dart
index f28f239..1402523 100644
--- a/pkg/analyzer/lib/src/dart/analysis/library_context.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/library_context.dart
@@ -235,14 +235,6 @@
         librariesLoaded += cycle.libraries.length;
       }
 
-      // We are about to load dart:core, but if we have just linked it, the
-      // linker might have set the type provider. So, clear it, and recreate
-      // the element factory - it is empty anyway.
-      if (!elementFactory.hasDartCore) {
-        analysisContext.clearTypeProvider();
-        _createElementFactory();
-      }
-
       var bundle = LinkedNodeBundle.fromBuffer(bytes);
       inputBundles.add(bundle);
       elementFactory.addBundle(
diff --git a/pkg/analyzer/lib/src/dart/analysis/search.dart b/pkg/analyzer/lib/src/dart/analysis/search.dart
index a2e9ade..d1f7aa3 100644
--- a/pkg/analyzer/lib/src/dart/analysis/search.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/search.dart
@@ -10,6 +10,7 @@
 import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/dart/analysis/file_state.dart';
 import 'package:analyzer/src/dart/analysis/index.dart';
+import 'package:analyzer/src/dart/ast/extensions.dart';
 import 'package:analyzer/src/dart/ast/utilities.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/summary/idl.dart';
@@ -621,7 +622,7 @@
       if (node.staticElement == importElement.prefix) {
         AstNode parent = node.parent;
         if (parent is PrefixedIdentifier && parent.prefix == node) {
-          var element = parent.staticElement?.declaration;
+          var element = parent.writeOrReadElement?.declaration;
           if (importedElements.contains(element)) {
             _addResultForPrefix(node, parent.identifier);
           }
@@ -634,7 +635,7 @@
         }
       }
     } else {
-      var element = node.staticElement?.declaration;
+      var element = node.writeOrReadElement?.declaration;
       if (importedElements.contains(element)) {
         _addResult(node.offset, 0);
       }
diff --git a/pkg/analyzer/lib/src/dart/ast/ast.dart b/pkg/analyzer/lib/src/dart/ast/ast.dart
index fdce821..428ee8a 100644
--- a/pkg/analyzer/lib/src/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/src/dart/ast/ast.dart
@@ -15,7 +15,6 @@
 import 'package:analyzer/exception/exception.dart';
 import 'package:analyzer/src/dart/ast/to_source_visitor.dart';
 import 'package:analyzer/src/dart/ast/token.dart';
-import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/fasta/token_utils.dart' as util show findPrevious;
 import 'package:analyzer/src/generated/engine.dart' show AnalysisEngine;
 import 'package:analyzer/src/generated/engine.dart';
@@ -691,31 +690,25 @@
   /// representing the parameter to which the value of the right operand will be
   /// bound. Otherwise, return `null`.
   ParameterElement get _staticParameterElementForRightHandSide {
-    ExecutableElement executableElement;
-    if (staticElement != null) {
+    Element executableElement;
+    if (operator.type != TokenType.EQ) {
       executableElement = staticElement;
     } else {
-      Expression left = _leftHandSide;
-      if (left is Identifier) {
-        Element leftElement = left.staticElement;
-        if (leftElement is ExecutableElement) {
-          executableElement = leftElement;
-        }
-      } else if (left is PropertyAccess) {
-        Element leftElement = left.propertyName.staticElement;
-        if (leftElement is ExecutableElement) {
-          executableElement = leftElement;
-        }
+      executableElement = writeElement;
+    }
+
+    if (executableElement is ExecutableElement) {
+      List<ParameterElement> parameters = executableElement.parameters;
+      if (parameters.isEmpty) {
+        return null;
       }
+      if (operator.type == TokenType.EQ && leftHandSide is IndexExpression) {
+        return parameters.length == 2 ? parameters[1] : null;
+      }
+      return parameters[0];
     }
-    if (executableElement == null) {
-      return null;
-    }
-    List<ParameterElement> parameters = executableElement.parameters;
-    if (parameters.isEmpty) {
-      return null;
-    }
-    return parameters[0];
+
+    return null;
   }
 
   @override
@@ -5820,14 +5813,6 @@
   @override
   MethodElement staticElement;
 
-  /// If this expression is both in a getter and setter context, the
-  /// [AuxiliaryElements] will be set to hold onto the static element from the
-  /// getter context.
-  @Deprecated('Use CompoundAssignmentExpression.readElement and/or '
-      'CompoundAssignmentExpression.writeElement')
-  @override
-  AuxiliaryElements auxiliaryElements;
-
   /// Initialize a newly created index expression that is a child of a cascade
   /// expression.
   IndexExpressionImpl.forCascade(this.period, this.question, this.leftBracket,
@@ -5926,14 +5911,22 @@
   /// representing the parameter to which the value of the index expression will
   /// be bound. Otherwise, return `null`.
   ParameterElement get _staticParameterElementForIndex {
-    if (staticElement == null) {
-      return null;
+    Element element = staticElement;
+
+    var parent = this.parent;
+    if (parent is CompoundAssignmentExpression) {
+      var assignment = parent as CompoundAssignmentExpression;
+      element = assignment.writeElement ?? assignment.readElement;
     }
-    List<ParameterElement> parameters = staticElement.parameters;
-    if (parameters.isEmpty) {
-      return null;
+
+    if (element is ExecutableElement) {
+      List<ParameterElement> parameters = element.parameters;
+      if (parameters.isEmpty) {
+        return null;
+      }
+      return parameters[0];
     }
-    return parameters[0];
+    return null;
   }
 
   @override
@@ -8832,14 +8825,6 @@
   /// this identifier could not be resolved.
   Element _staticElement;
 
-  /// If this expression is both in a getter and setter context, the
-  /// [AuxiliaryElements] will be set to hold onto the static element from the
-  /// getter context.
-  @Deprecated('Use CompoundAssignmentExpression.readElement and/or '
-      'CompoundAssignmentExpression.writeElement')
-  @override
-  AuxiliaryElements auxiliaryElements;
-
   @override
   List<DartType> tearOffTypeArgumentTypes;
 
diff --git a/pkg/analyzer/lib/src/dart/ast/element_locator.dart b/pkg/analyzer/lib/src/dart/ast/element_locator.dart
index 4d7d81d..e646c4e 100644
--- a/pkg/analyzer/lib/src/dart/ast/element_locator.dart
+++ b/pkg/analyzer/lib/src/dart/ast/element_locator.dart
@@ -5,6 +5,7 @@
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/src/dart/ast/extensions.dart';
 
 /// An object used to locate the [Element] associated with a given [AstNode].
 class ElementLocator {
@@ -93,7 +94,7 @@
         return grandParent.element;
       }
     }
-    return node.staticElement;
+    return node.writeOrReadElement;
   }
 
   @override
diff --git a/pkg/analyzer/lib/src/dart/ast/extensions.dart b/pkg/analyzer/lib/src/dart/ast/extensions.dart
index 0c42457..2063cd9 100644
--- a/pkg/analyzer/lib/src/dart/ast/extensions.dart
+++ b/pkg/analyzer/lib/src/dart/ast/extensions.dart
@@ -3,8 +3,79 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
 
+/// TODO(scheglov) https://github.com/dart-lang/sdk/issues/43608
+Element _readElement(AstNode node) {
+  var parent = node.parent;
+
+  if (parent is AssignmentExpression && parent.leftHandSide == node) {
+    return parent.readElement;
+  }
+  if (parent is PostfixExpression && parent.operand == node) {
+    return parent.readElement;
+  }
+  if (parent is PrefixExpression && parent.operand == node) {
+    return parent.readElement;
+  }
+
+  if (parent is PrefixedIdentifier && parent.identifier == node) {
+    return _readElement(parent);
+  }
+  if (parent is PropertyAccess && parent.propertyName == node) {
+    return _readElement(parent);
+  }
+  return null;
+}
+
+/// TODO(scheglov) https://github.com/dart-lang/sdk/issues/43608
+Element _writeElement(AstNode node) {
+  var parent = node.parent;
+
+  if (parent is AssignmentExpression && parent.leftHandSide == node) {
+    return parent.writeElement;
+  }
+  if (parent is PostfixExpression && parent.operand == node) {
+    return parent.writeElement;
+  }
+  if (parent is PrefixExpression && parent.operand == node) {
+    return parent.writeElement;
+  }
+
+  if (parent is PrefixedIdentifier && parent.identifier == node) {
+    return _writeElement(parent);
+  }
+  if (parent is PropertyAccess && parent.propertyName == node) {
+    return _writeElement(parent);
+  }
+  return null;
+}
+
+/// TODO(scheglov) https://github.com/dart-lang/sdk/issues/43608
+DartType _writeType(AstNode node) {
+  var parent = node.parent;
+
+  if (parent is AssignmentExpression && parent.leftHandSide == node) {
+    return parent.writeType;
+  }
+  if (parent is PostfixExpression && parent.operand == node) {
+    return parent.writeType;
+  }
+  if (parent is PrefixExpression && parent.operand == node) {
+    return parent.writeType;
+  }
+
+  if (parent is PrefixedIdentifier && parent.identifier == node) {
+    return _writeType(parent);
+  }
+  if (parent is PropertyAccess && parent.propertyName == node) {
+    return _writeType(parent);
+  }
+  return null;
+}
+
 extension FormalParameterExtension on FormalParameter {
   FormalParameter get notDefault {
     var self = this;
@@ -23,6 +94,32 @@
   }
 }
 
+/// TODO(scheglov) https://github.com/dart-lang/sdk/issues/43608
+extension IdentifierExtension on Identifier {
+  Element get writeElement {
+    return _writeElement(this);
+  }
+
+  Element get readElement {
+    return _readElement(this);
+  }
+
+  Element get writeOrReadElement {
+    return _writeElement(this) ?? staticElement;
+  }
+
+  DartType get writeOrReadType {
+    return _writeType(this) ?? staticType;
+  }
+}
+
+/// TODO(scheglov) https://github.com/dart-lang/sdk/issues/43608
+extension IndexExpressionExtension on IndexExpression {
+  Element get writeOrReadElement {
+    return _writeElement(this) ?? staticElement;
+  }
+}
+
 extension ListOfFormalParameterExtension on List<FormalParameter> {
   Iterable<FormalParameterImpl> get asImpl {
     return cast<FormalParameterImpl>();
diff --git a/pkg/analyzer/lib/src/dart/ast/utilities.dart b/pkg/analyzer/lib/src/dart/ast/utilities.dart
index 4a4bd24..3648e1e 100644
--- a/pkg/analyzer/lib/src/dart/ast/utilities.dart
+++ b/pkg/analyzer/lib/src/dart/ast/utilities.dart
@@ -4738,8 +4738,6 @@
         _isEqualTokens(node.leftBracket, toNode.leftBracket),
         _isEqualNodes(node.index, toNode.index),
         _isEqualTokens(node.rightBracket, toNode.rightBracket))) {
-      // ignore: deprecated_member_use_from_same_package
-      toNode.auxiliaryElements = node.auxiliaryElements;
       toNode.staticElement = node.staticElement;
       toNode.staticType = node.staticType;
       return true;
@@ -5137,8 +5135,6 @@
     if (_isEqualTokens(node.token, toNode.token)) {
       toNode.staticElement = node.staticElement;
       toNode.staticType = node.staticType;
-      // ignore: deprecated_member_use_from_same_package
-      toNode.auxiliaryElements = node.auxiliaryElements;
       (toNode as SimpleIdentifierImpl).tearOffTypeArgumentTypes =
           node.tearOffTypeArgumentTypes;
       return true;
diff --git a/pkg/analyzer/lib/src/dart/constant/potentially_constant.dart b/pkg/analyzer/lib/src/dart/constant/potentially_constant.dart
index 3060c8f..7b620f3 100644
--- a/pkg/analyzer/lib/src/dart/constant/potentially_constant.dart
+++ b/pkg/analyzer/lib/src/dart/constant/potentially_constant.dart
@@ -39,7 +39,7 @@
 
 bool _isConstantTypeName(Identifier name) {
   var element = name.staticElement;
-  if (element is ClassElement || element is GenericTypeAliasElement) {
+  if (element is ClassElement || element is FunctionTypeAliasElement) {
     if (name is PrefixedIdentifier) {
       if (name.isDeferred) {
         return false;
diff --git a/pkg/analyzer/lib/src/dart/constant/value.dart b/pkg/analyzer/lib/src/dart/constant/value.dart
index 3b51c9d..c2ae7ca 100644
--- a/pkg/analyzer/lib/src/dart/constant/value.dart
+++ b/pkg/analyzer/lib/src/dart/constant/value.dart
@@ -1048,14 +1048,18 @@
         return IntState.UNKNOWN_VALUE;
       }
       double result = value / rightValue.toDouble();
-      return IntState(result.toInt());
+      if (result.isFinite) {
+        return IntState(result.toInt());
+      }
     } else if (rightOperand is DoubleState) {
       double rightValue = rightOperand.value;
       if (rightValue == null) {
         return IntState.UNKNOWN_VALUE;
       }
       double result = value / rightValue;
-      return IntState(result.toInt());
+      if (result.isFinite) {
+        return IntState(result.toInt());
+      }
     }
     throw EvaluationException(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
   }
@@ -1976,7 +1980,9 @@
         return UNKNOWN_VALUE;
       }
       double result = value.toDouble() / rightValue;
-      return IntState(result.toInt());
+      if (result.isFinite) {
+        return IntState(result.toInt());
+      }
     }
     throw EvaluationException(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
   }
diff --git a/pkg/analyzer/lib/src/dart/element/display_string_builder.dart b/pkg/analyzer/lib/src/dart/element/display_string_builder.dart
index 5625a7b..6c7dd55 100644
--- a/pkg/analyzer/lib/src/dart/element/display_string_builder.dart
+++ b/pkg/analyzer/lib/src/dart/element/display_string_builder.dart
@@ -126,14 +126,7 @@
     _writeNullability(type.nullabilitySuffix);
   }
 
-  void writeGenericFunctionTypeElement(GenericFunctionTypeElementImpl element) {
-    _writeType(element.returnType);
-    _write(' Function');
-    _writeTypeParameters(element.typeParameters);
-    _writeFormalParameters(element.parameters, forElement: true);
-  }
-
-  void writeGenericTypeAliasElement(GenericTypeAliasElementImpl element) {
+  void writeFunctionTypeAliasElement(FunctionTypeAliasElementImpl element) {
     _write('typedef ');
     _write(element.displayName);
     _writeTypeParameters(element.typeParameters);
@@ -141,6 +134,13 @@
     element.function?.appendTo(this);
   }
 
+  void writeGenericFunctionTypeElement(GenericFunctionTypeElementImpl element) {
+    _writeType(element.returnType);
+    _write(' Function');
+    _writeTypeParameters(element.typeParameters);
+    _writeFormalParameters(element.parameters, forElement: true);
+  }
+
   void writeImportElement(ImportElementImpl element) {
     _write('import ');
     (element.importedLibrary as LibraryElementImpl).appendTo(this);
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index 09790fa..74cdd53 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -439,17 +439,6 @@
   }
 }
 
-/// For AST nodes that could be in both the getter and setter contexts
-/// ([IndexExpression]s and [SimpleIdentifier]s), the additional resolved
-/// element (getter) is stored in the AST node, in an [AuxiliaryElements].
-class AuxiliaryElements {
-  /// The element based on static type information, or `null` if the AST
-  /// structure has not been resolved or if the node could not be resolved.
-  final ExecutableElement staticElement;
-
-  AuxiliaryElements(this.staticElement);
-}
-
 /// An [AbstractClassElementImpl] which is a class.
 class ClassElementImpl extends AbstractClassElementImpl
     with TypeParameterizedElementMixin {
@@ -1407,9 +1396,9 @@
         }
 
         var reference = containerRef.getChild(name);
-        var element = node.declaredElement as GenericTypeAliasElement;
+        var element = node.declaredElement as FunctionTypeAliasElement;
         element ??=
-            GenericTypeAliasElementImpl.forLinkedNode(this, reference, node);
+            FunctionTypeAliasElementImpl.forLinkedNode(this, reference, node);
         _typeAliases.add(element);
       }
     }
@@ -1435,6 +1424,14 @@
   String get identifier => '${source.uri}';
 
   @override
+  bool get isSynthetic {
+    if (linkedContext != null) {
+      return linkedContext.isSynthetic;
+    }
+    return super.isSynthetic;
+  }
+
+  @override
   ElementKind get kind => ElementKind.COMPILATION_UNIT;
 
   @override
@@ -1578,7 +1575,7 @@
         return functionImpl;
       }
     }
-    for (GenericTypeAliasElementImpl typeAlias in functionTypeAliases) {
+    for (FunctionTypeAliasElementImpl typeAlias in functionTypeAliases) {
       if (typeAlias.identifier == identifier) {
         return typeAlias;
       }
@@ -2391,8 +2388,6 @@
   /// visible for testing.
   static const String _VISIBLE_FOR_TESTING_VARIABLE_NAME = "visibleForTesting";
 
-  /// The element representing the field, variable, or constructor being used as
-  /// an annotation.
   @override
   Element element;
 
@@ -2416,10 +2411,6 @@
   List<AnalysisError> get constantEvaluationErrors =>
       evaluationResult?.errors ?? const <AnalysisError>[];
 
-  @Deprecated('Use computeConstantValue() instead')
-  @override
-  DartObject get constantValue => evaluationResult?.value;
-
   @override
   AnalysisContext get context => compilationUnit.library.context;
 
@@ -3170,7 +3161,7 @@
   void _safelyVisitPossibleChild(DartType type, ElementVisitor visitor) {
     Element element = type?.element;
     if (element is GenericFunctionTypeElementImpl &&
-        element.enclosingElement is! GenericTypeAliasElement) {
+        element.enclosingElement is! FunctionTypeAliasElement) {
       element.accept(visitor);
     }
   }
@@ -4430,6 +4421,212 @@
   T accept<T>(ElementVisitor<T> visitor) => visitor.visitFunctionElement(this);
 }
 
+/// An element that represents [FunctionTypeAlias] or [GenericTypeAlias].
+///
+/// Clients may not extend, implement or mix-in this class.
+class FunctionTypeAliasElementImpl extends ElementImpl
+    with TypeParameterizedElementMixin
+    implements FunctionTypeAliasElement {
+  /// The element representing the generic function type.
+  GenericFunctionTypeElementImpl _function;
+
+  /// Initialize a newly created type alias element to have the given [name].
+  FunctionTypeAliasElementImpl(String name, int offset) : super(name, offset);
+
+  FunctionTypeAliasElementImpl.forLinkedNode(
+      CompilationUnitElementImpl enclosingUnit,
+      Reference reference,
+      AstNode linkedNode)
+      : super.forLinkedNode(enclosingUnit, reference, linkedNode) {
+    if (linkedNode is FunctionTypeAlias) {
+      linkedNode.name.staticElement = this;
+    } else {
+      (linkedNode as GenericTypeAlias).name.staticElement = this;
+    }
+  }
+
+  @override
+  int get codeLength {
+    if (linkedNode != null) {
+      return linkedContext.getCodeLength(linkedNode);
+    }
+    return super.codeLength;
+  }
+
+  @override
+  int get codeOffset {
+    if (linkedNode != null) {
+      return linkedContext.getCodeOffset(linkedNode);
+    }
+    return super.codeOffset;
+  }
+
+  @override
+  String get displayName => name;
+
+  @override
+  String get documentationComment {
+    if (linkedNode != null) {
+      var context = enclosingUnit.linkedContext;
+      var comment = context.getDocumentationComment(linkedNode);
+      return getCommentNodeRawText(comment);
+    }
+    return super.documentationComment;
+  }
+
+  @override
+  CompilationUnitElement get enclosingElement =>
+      super.enclosingElement as CompilationUnitElement;
+
+  @override
+  CompilationUnitElementImpl get enclosingUnit =>
+      _enclosingElement as CompilationUnitElementImpl;
+
+  @override
+  GenericFunctionTypeElementImpl get function {
+    if (_function != null) return _function;
+
+    if (linkedNode != null) {
+      if (linkedNode is GenericTypeAlias) {
+        var context = enclosingUnit.linkedContext;
+        var function = context.getGeneticTypeAliasFunction(linkedNode);
+        if (function != null) {
+          var reference = context.getGenericFunctionTypeReference(function);
+          _function = reference.element;
+          encloseElement(_function);
+          return _function;
+        } else {
+          return _function = GenericFunctionTypeElementImpl.forOffset(-1)
+            ..typeParameters = const <TypeParameterElement>[]
+            ..parameters = const <ParameterElement>[]
+            ..returnType = DynamicTypeImpl.instance;
+        }
+      } else {
+        return _function = GenericFunctionTypeElementImpl.forLinkedNode(
+          this,
+          reference.getChild('@function'),
+          linkedNode,
+        );
+      }
+    }
+
+    return _function;
+  }
+
+  /// Set the function element representing the generic function type on the
+  /// right side of the equals to the given [function].
+  set function(GenericFunctionTypeElementImpl function) {
+    if (function != null) {
+      function.enclosingElement = this;
+    }
+    _function = function;
+  }
+
+  /// Return `true` if the element has direct or indirect reference to itself
+  /// from anywhere except a class element or type parameter bounds.
+  bool get hasSelfReference {
+    if (linkedNode != null) {
+      return linkedContext.getHasTypedefSelfReference(linkedNode);
+    }
+    return false;
+  }
+
+  @override
+  bool get isSimplyBounded {
+    if (linkedNode != null) {
+      return linkedContext.isSimplyBounded(linkedNode);
+    }
+    return super.isSimplyBounded;
+  }
+
+  @override
+  ElementKind get kind => ElementKind.FUNCTION_TYPE_ALIAS;
+
+  @override
+  String get name {
+    if (linkedNode != null) {
+      return reference.name;
+    }
+    return super.name;
+  }
+
+  @override
+  int get nameOffset {
+    if (linkedNode != null) {
+      return enclosingUnit.linkedContext.getNameOffset(linkedNode);
+    }
+
+    return super.nameOffset;
+  }
+
+  /// Set the type parameters defined for this type to the given
+  /// [typeParameters].
+  set typeParameters(List<TypeParameterElement> typeParameters) {
+    for (TypeParameterElement typeParameter in typeParameters) {
+      (typeParameter as TypeParameterElementImpl).enclosingElement = this;
+    }
+    _typeParameterElements = typeParameters;
+  }
+
+  @override
+  T accept<T>(ElementVisitor<T> visitor) =>
+      visitor.visitFunctionTypeAliasElement(this);
+
+  @override
+  void appendTo(ElementDisplayStringBuilder builder) {
+    builder.writeFunctionTypeAliasElement(this);
+  }
+
+  @override
+  ElementImpl getChild(String identifier) {
+    for (TypeParameterElement typeParameter in typeParameters) {
+      TypeParameterElementImpl typeParameterImpl = typeParameter;
+      if (typeParameterImpl.identifier == identifier) {
+        return typeParameterImpl;
+      }
+    }
+    return null;
+  }
+
+  @override
+  FunctionType instantiate({
+    @required List<DartType> typeArguments,
+    @required NullabilitySuffix nullabilitySuffix,
+  }) {
+    if (function == null) {
+      return null;
+    }
+
+    if (typeArguments.length != typeParameters.length) {
+      throw ArgumentError("typeArguments.length (${typeArguments.length}) != "
+          "typeParameters.length (${typeParameters.length})");
+    }
+
+    var substitution = Substitution.fromPairs(typeParameters, typeArguments);
+    var type = substitution.substituteType(function.type) as FunctionType;
+
+    var resultNullability = type.nullabilitySuffix == NullabilitySuffix.question
+        ? NullabilitySuffix.question
+        : nullabilitySuffix;
+
+    return FunctionTypeImpl(
+      typeFormals: type.typeFormals,
+      parameters: type.parameters,
+      returnType: type.returnType,
+      nullabilitySuffix: resultNullability,
+      element: this,
+      typeArguments: typeArguments,
+    );
+  }
+
+  @override
+  void visitChildren(ElementVisitor visitor) {
+    super.visitChildren(visitor);
+    safelyVisitChildren(typeParameters, visitor);
+    function?.accept(visitor);
+  }
+}
+
 /// Common internal interface shared by elements whose type is a function type.
 ///
 /// Clients may not extend, implement or mix-in this class.
@@ -4598,213 +4795,6 @@
   }
 }
 
-/// A function type alias of the form
-///     `typedef` identifier typeParameters = genericFunctionType;
-///
-/// Clients may not extend, implement or mix-in this class.
-class GenericTypeAliasElementImpl extends ElementImpl
-    with TypeParameterizedElementMixin
-    implements GenericTypeAliasElement {
-  /// The element representing the generic function type.
-  GenericFunctionTypeElementImpl _function;
-
-  /// Initialize a newly created type alias element to have the given [name].
-  GenericTypeAliasElementImpl(String name, int offset) : super(name, offset);
-
-  GenericTypeAliasElementImpl.forLinkedNode(
-      CompilationUnitElementImpl enclosingUnit,
-      Reference reference,
-      AstNode linkedNode)
-      : super.forLinkedNode(enclosingUnit, reference, linkedNode) {
-    if (linkedNode is FunctionTypeAlias) {
-      linkedNode.name.staticElement = this;
-    } else {
-      (linkedNode as GenericTypeAlias).name.staticElement = this;
-    }
-  }
-
-  @override
-  int get codeLength {
-    if (linkedNode != null) {
-      return linkedContext.getCodeLength(linkedNode);
-    }
-    return super.codeLength;
-  }
-
-  @override
-  int get codeOffset {
-    if (linkedNode != null) {
-      return linkedContext.getCodeOffset(linkedNode);
-    }
-    return super.codeOffset;
-  }
-
-  @override
-  String get displayName => name;
-
-  @override
-  String get documentationComment {
-    if (linkedNode != null) {
-      var context = enclosingUnit.linkedContext;
-      var comment = context.getDocumentationComment(linkedNode);
-      return getCommentNodeRawText(comment);
-    }
-    return super.documentationComment;
-  }
-
-  @override
-  CompilationUnitElement get enclosingElement =>
-      super.enclosingElement as CompilationUnitElement;
-
-  @override
-  CompilationUnitElementImpl get enclosingUnit =>
-      _enclosingElement as CompilationUnitElementImpl;
-
-  @override
-  GenericFunctionTypeElementImpl get function {
-    if (_function != null) return _function;
-
-    if (linkedNode != null) {
-      if (linkedNode is GenericTypeAlias) {
-        var context = enclosingUnit.linkedContext;
-        var function = context.getGeneticTypeAliasFunction(linkedNode);
-        if (function != null) {
-          var reference = context.getGenericFunctionTypeReference(function);
-          _function = reference.element;
-          encloseElement(_function);
-          return _function;
-        } else {
-          return _function = GenericFunctionTypeElementImpl.forOffset(-1)
-            ..typeParameters = const <TypeParameterElement>[]
-            ..parameters = const <ParameterElement>[]
-            ..returnType = DynamicTypeImpl.instance;
-        }
-      } else {
-        return _function = GenericFunctionTypeElementImpl.forLinkedNode(
-          this,
-          reference.getChild('@function'),
-          linkedNode,
-        );
-      }
-    }
-
-    return _function;
-  }
-
-  /// Set the function element representing the generic function type on the
-  /// right side of the equals to the given [function].
-  set function(GenericFunctionTypeElementImpl function) {
-    if (function != null) {
-      function.enclosingElement = this;
-    }
-    _function = function;
-  }
-
-  /// Return `true` if the element has direct or indirect reference to itself
-  /// from anywhere except a class element or type parameter bounds.
-  bool get hasSelfReference {
-    if (linkedNode != null) {
-      return linkedContext.getHasTypedefSelfReference(linkedNode);
-    }
-    return false;
-  }
-
-  @override
-  bool get isSimplyBounded {
-    if (linkedNode != null) {
-      return linkedContext.isSimplyBounded(linkedNode);
-    }
-    return super.isSimplyBounded;
-  }
-
-  @override
-  ElementKind get kind => ElementKind.FUNCTION_TYPE_ALIAS;
-
-  @override
-  String get name {
-    if (linkedNode != null) {
-      return reference.name;
-    }
-    return super.name;
-  }
-
-  @override
-  int get nameOffset {
-    if (linkedNode != null) {
-      return enclosingUnit.linkedContext.getNameOffset(linkedNode);
-    }
-
-    return super.nameOffset;
-  }
-
-  /// Set the type parameters defined for this type to the given
-  /// [typeParameters].
-  set typeParameters(List<TypeParameterElement> typeParameters) {
-    for (TypeParameterElement typeParameter in typeParameters) {
-      (typeParameter as TypeParameterElementImpl).enclosingElement = this;
-    }
-    _typeParameterElements = typeParameters;
-  }
-
-  @override
-  T accept<T>(ElementVisitor<T> visitor) =>
-      visitor.visitFunctionTypeAliasElement(this);
-
-  @override
-  void appendTo(ElementDisplayStringBuilder builder) {
-    builder.writeGenericTypeAliasElement(this);
-  }
-
-  @override
-  ElementImpl getChild(String identifier) {
-    for (TypeParameterElement typeParameter in typeParameters) {
-      TypeParameterElementImpl typeParameterImpl = typeParameter;
-      if (typeParameterImpl.identifier == identifier) {
-        return typeParameterImpl;
-      }
-    }
-    return null;
-  }
-
-  @override
-  FunctionType instantiate({
-    @required List<DartType> typeArguments,
-    @required NullabilitySuffix nullabilitySuffix,
-  }) {
-    if (function == null) {
-      return null;
-    }
-
-    if (typeArguments.length != typeParameters.length) {
-      throw ArgumentError("typeArguments.length (${typeArguments.length}) != "
-          "typeParameters.length (${typeParameters.length})");
-    }
-
-    var substitution = Substitution.fromPairs(typeParameters, typeArguments);
-    var type = substitution.substituteType(function.type) as FunctionType;
-
-    var resultNullability = type.nullabilitySuffix == NullabilitySuffix.question
-        ? NullabilitySuffix.question
-        : nullabilitySuffix;
-
-    return FunctionTypeImpl(
-      typeFormals: type.typeFormals,
-      parameters: type.parameters,
-      returnType: type.returnType,
-      nullabilitySuffix: resultNullability,
-      element: this,
-      typeArguments: typeArguments,
-    );
-  }
-
-  @override
-  void visitChildren(ElementVisitor visitor) {
-    super.visitChildren(visitor);
-    safelyVisitChildren(typeParameters, visitor);
-    function?.accept(visitor);
-  }
-}
-
 /// A concrete implementation of a [HideElementCombinator].
 class HideElementCombinatorImpl implements HideElementCombinator {
   final LinkedUnitContext linkedContext;
@@ -6276,24 +6266,6 @@
     return linkedNode != null && linkedContext.hasInitializer(linkedNode);
   }
 
-  @deprecated
-  @override
-  FunctionElement get initializer {
-    if (hasInitializer) {
-      return FunctionElementImpl('', -1)
-        ..enclosingElement = this
-        ..isSynthetic = true
-        ..returnType = type
-        .._type = FunctionTypeImpl(
-          typeFormals: const [],
-          parameters: const [],
-          returnType: type,
-          nullabilitySuffix: NullabilitySuffix.star,
-        );
-    }
-    return null;
-  }
-
   @override
   String get name {
     if (linkedNode != null) {
@@ -7526,7 +7498,7 @@
           typeParameters.typeParameters.map<TypeParameterElement>((node) {
         var reference = containerRef.getChild(node.name.name);
         if (reference.hasElementFor(node)) {
-          return reference.element as TypeParameterElement;
+          return reference.element as TypeParameterElement /*!*/;
         }
         return TypeParameterElementImpl.forLinkedNode(this, reference, node);
       }).toList();
@@ -7619,10 +7591,6 @@
   /// initializers.
   Expression get constantInitializer => null;
 
-  @Deprecated('Use computeConstantValue() instead')
-  @override
-  DartObject get constantValue => evaluationResult?.value;
-
   @override
   VariableElement get declaration => this;
 
@@ -7651,10 +7619,6 @@
     setModifier(Modifier.IMPLICIT_TYPE, hasImplicitType);
   }
 
-  @deprecated
-  @override
-  FunctionElement get initializer => null;
-
   @override
   bool get isConst {
     if (linkedNode != null) {
@@ -7710,11 +7674,4 @@
 
   @override
   DartObject computeConstantValue() => null;
-
-  @override
-  void visitChildren(ElementVisitor visitor) {
-    super.visitChildren(visitor);
-    // ignore: deprecated_member_use_from_same_package
-    initializer?.accept(visitor);
-  }
 }
diff --git a/pkg/analyzer/lib/src/dart/element/member.dart b/pkg/analyzer/lib/src/dart/element/member.dart
index db5240f..9816e56 100644
--- a/pkg/analyzer/lib/src/dart/element/member.dart
+++ b/pkg/analyzer/lib/src/dart/element/member.dart
@@ -34,10 +34,6 @@
   ) : super(typeProvider, declaration, substitution, isLegacy,
             const <TypeParameterElement>[]);
 
-  @deprecated
-  @override
-  ConstructorElement get baseElement => declaration;
-
   @override
   ConstructorElement get declaration => super.declaration as ConstructorElement;
 
@@ -152,10 +148,6 @@
     this.typeParameters,
   ) : super(typeProvider, declaration, substitution, isLegacy);
 
-  @deprecated
-  @override
-  ExecutableElement get baseElement => declaration;
-
   @override
   ExecutableElement get declaration => super.declaration as ExecutableElement;
 
@@ -334,10 +326,6 @@
     bool isLegacy,
   ) : super(typeProvider, declaration, substitution, isLegacy);
 
-  @deprecated
-  @override
-  FieldElement get baseElement => declaration;
-
   @override
   FieldElement get declaration => super.declaration as FieldElement;
 
@@ -458,10 +446,6 @@
     }
   }
 
-  /// Return the element on which the parameterized element was created.
-  @Deprecated('Use Element.declaration instead')
-  Element get baseElement => _declaration;
-
   @override
   AnalysisContext get context => _declaration.context;
 
@@ -732,10 +716,6 @@
     List<TypeParameterElement> typeParameters,
   ) : super(typeProvider, declaration, substitution, isLegacy, typeParameters);
 
-  @deprecated
-  @override
-  MethodElement get baseElement => declaration;
-
   @override
   MethodElement get declaration => super.declaration as MethodElement;
 
@@ -813,10 +793,6 @@
     this.typeParameters,
   ) : super(typeProvider, declaration, substitution, isLegacy);
 
-  @deprecated
-  @override
-  ParameterElement get baseElement => declaration;
-
   @override
   ParameterElement get declaration => super.declaration as ParameterElement;
 
@@ -903,10 +879,6 @@
     List<TypeParameterElement> typeParameters,
   ) : super(typeProvider, declaration, substitution, isLegacy, typeParameters);
 
-  @deprecated
-  @override
-  PropertyAccessorElement get baseElement => declaration;
-
   @override
   PropertyAccessorElement get correspondingGetter {
     var baseGetter = declaration.correspondingGetter;
@@ -1044,14 +1016,6 @@
     bool isLegacy,
   ) : super(typeProvider, declaration, substitution, isLegacy);
 
-  @deprecated
-  @override
-  VariableElement get baseElement => declaration;
-
-  @Deprecated('Use computeConstantValue() instead')
-  @override
-  DartObject get constantValue => declaration.constantValue;
-
   @override
   VariableElement get declaration => super.declaration as VariableElement;
 
@@ -1059,16 +1023,6 @@
   bool get hasImplicitType => declaration.hasImplicitType;
 
   @override
-  FunctionElement get initializer {
-    //
-    // Elements within this element should have type parameters substituted,
-    // just like this element.
-    //
-    throw UnsupportedError('initializer');
-    //    return getBaseElement().getInitializer();
-  }
-
-  @override
   bool get isConst => declaration.isConst;
 
   @override
@@ -1099,13 +1053,6 @@
 
   @override
   DartObject computeConstantValue() => declaration.computeConstantValue();
-
-  @override
-  void visitChildren(ElementVisitor visitor) {
-    super.visitChildren(visitor);
-    // ignore: deprecated_member_use_from_same_package
-    declaration.initializer?.accept(visitor);
-  }
 }
 
 class _SubstitutedTypeParameters {
diff --git a/pkg/analyzer/lib/src/dart/element/scope.dart b/pkg/analyzer/lib/src/dart/element/scope.dart
index d04ddfa..2e1daa0 100644
--- a/pkg/analyzer/lib/src/dart/element/scope.dart
+++ b/pkg/analyzer/lib/src/dart/element/scope.dart
@@ -4,6 +4,7 @@
 
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/scope.dart';
+import 'package:analyzer/src/context/source.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/resolver/scope.dart' as impl;
 import 'package:meta/meta.dart';
@@ -34,22 +35,21 @@
 
   Scope get parent => _parent;
 
-  @Deprecated('Use lookup2() that is closer to the language specification')
   @override
-  Element lookup({@required String id, @required bool setter}) {
-    var result = lookup2(id);
-    return setter ? result.setter : result.getter;
-  }
-
-  @override
-  ScopeLookupResult lookup2(String id) {
+  ScopeLookupResult lookup(String id) {
     var getter = _getters[id];
     var setter = _setters[id];
     if (getter != null || setter != null) {
       return ScopeLookupResult(getter, setter);
     }
 
-    return _parent.lookup2(id);
+    return _parent.lookup(id);
+  }
+
+  @Deprecated('Use lookup() instead')
+  @override
+  ScopeLookupResult lookup2(String id) {
+    return lookup(id);
   }
 
   void _addGetter(Element element) {
@@ -148,6 +148,15 @@
           }
         }
       }
+
+      if (name.startsWith(r'_$')) {
+        for (var partElement in _element.parts) {
+          if (partElement.isSynthetic &&
+              isGeneratedSource(partElement.source)) {
+            return true;
+          }
+        }
+      }
     }
 
     return false;
@@ -198,15 +207,8 @@
     }
   }
 
-  @Deprecated('Use lookup2() that is closer to the language specification')
   @override
-  Element lookup({@required String id, @required bool setter}) {
-    var result = lookup2(id);
-    return setter ? result.setter : result.getter;
-  }
-
-  @override
-  ScopeLookupResult lookup2(String id) {
+  ScopeLookupResult lookup(String id) {
     if (_deferredLibrary != null && id == FunctionElement.LOAD_LIBRARY_NAME) {
       return ScopeLookupResult(_deferredLibrary.loadLibraryFunction, null);
     }
@@ -216,6 +218,12 @@
     return ScopeLookupResult(getter, setter);
   }
 
+  @Deprecated('Use lookup() instead')
+  @override
+  ScopeLookupResult lookup2(String id) {
+    return lookup(id);
+  }
+
   void _add(Element element) {
     if (element is PropertyAccessorElement && element.isSetter) {
       _addTo(map: _setters, element: element);
@@ -313,14 +321,14 @@
     }.toList();
   }
 
-  @Deprecated('Use lookup2() that is closer to the language specification')
   @override
-  Element lookup({@required String id, @required bool setter}) {
-    throw UnimplementedError();
+  ScopeLookupResult lookup(String id) {
+    return _nullPrefixScope.lookup(id);
   }
 
+  @Deprecated('Use lookup() instead')
   @override
   ScopeLookupResult lookup2(String id) {
-    return _nullPrefixScope.lookup2(id);
+    return lookup(id);
   }
 }
diff --git a/pkg/analyzer/lib/src/dart/element/type.dart b/pkg/analyzer/lib/src/dart/element/type.dart
index 83c3e77..20211b6 100644
--- a/pkg/analyzer/lib/src/dart/element/type.dart
+++ b/pkg/analyzer/lib/src/dart/element/type.dart
@@ -139,7 +139,7 @@
   FunctionTypedElement get element {
     var element = super.element;
     // TODO(scheglov) Can we just construct it with the right element?
-    if (element is GenericTypeAliasElement) {
+    if (element is FunctionTypeAliasElement) {
       return element.function;
     }
     return element;
@@ -1602,12 +1602,18 @@
 /// The abstract class `TypeImpl` implements the behavior common to objects
 /// representing the declared type of elements in the element model.
 abstract class TypeImpl implements DartType {
+  @override
+  final List<DartType> aliasArguments;
+
+  @override
+  final TypeAliasElement aliasElement;
+
   /// The element representing the declaration of this type, or `null` if the
   /// type has not, or cannot, be associated with an element.
   final Element _element;
 
   /// Initialize a newly created type to be declared by the given [element].
-  TypeImpl(this._element);
+  TypeImpl(this._element, {this.aliasElement, this.aliasArguments});
 
   @deprecated
   @override
diff --git a/pkg/analyzer/lib/src/dart/error/hint_codes.dart b/pkg/analyzer/lib/src/dart/error/hint_codes.dart
index 04450e8..60447c0 100644
--- a/pkg/analyzer/lib/src/dart/error/hint_codes.dart
+++ b/pkg/analyzer/lib/src/dart/error/hint_codes.dart
@@ -19,7 +19,7 @@
    */
   static const HintCode ASSIGNMENT_OF_DO_NOT_STORE = HintCode(
       'ASSIGNMENT_OF_DO_NOT_STORE',
-      "'{0}' is marked 'doNotStore' and shouldn't be assigned to a field.",
+      "'{0}' is marked 'doNotStore' and shouldn't be assigned to a field or top-level variable.",
       correction: "Try removing the assignment.");
 
   /**
@@ -339,6 +339,60 @@
               "members.");
 
   /**
+   * Parameters:
+   * 0: the name of the diagnostic being ignored
+   */
+  // #### Description
+  //
+  // The analyzer produces this diagnostic when a diagnostic name appears in an
+  // `ignore` comment, but the diagnostic is already being ignored, either
+  // because it's already included in the same `ignore` comment or because it
+  // appears in an `ignore-in-file` comment.
+  //
+  // #### Example
+  //
+  // The following code produces this diagnostic because the diagnostic named
+  // `unused_local_variable` is already being ignored for the whole file so it
+  // doesn't need to be ignored on a specific line:
+  //
+  // ```dart
+  // // ignore_for_file: unused_local_variable
+  // void f() {
+  //   // ignore: [!unused_local_variable!]
+  //   var x = 0;
+  // }
+  // ```
+  //
+  // The following code produces this diagnostic because the diagnostic named
+  // `unused_local_variable` is being ignored twice on the same line:
+  //
+  // ```dart
+  // void f() {
+  //   // ignore: unused_local_variable, [!unused_local_variable!]
+  //   var x = 0;
+  // }
+  // ```
+  //
+  // #### Common fixes
+  //
+  // Remove the ignore comment, or remove the unnecessary diagnostic name if the
+  // ignore comment is ignoring more than one diagnostic:
+  //
+  // ```dart
+  // // ignore_for_file: unused_local_variable
+  // void f() {
+  //   var x = 0;
+  // }
+  // ```
+  static const HintCode DUPLICATE_IGNORE = HintCode(
+      'DUPLICATE_IGNORE',
+      "The diagnostic '{0}' doesn't need to be ignored here because it's "
+          "already being ignored.",
+      correction:
+          "Try removing the name from the list, or removing the whole comment "
+          "if this is the only name in the list.");
+
+  /**
    * Duplicate imports.
    *
    * No parameters.
@@ -1423,6 +1477,15 @@
           "as an operand of a logical operator.");
 
   /**
+   * This hint indicates that a null literal is null-checked with `!`, but null
+   * is never not null.
+   */
+  static const HintCode NULL_CHECK_ALWAYS_FAILS = HintCode(
+      'NULL_CHECK_ALWAYS_FAILS',
+      "This null-check will always throw an exception because the expression "
+          "will always evaluate to 'null'.");
+
+  /**
    * No parameters.
    */
   // #### Description
@@ -2018,17 +2081,17 @@
   /**
    * No parameters.
    */
-  /* // #### Description
+  // #### Description
   //
   // The analyzer produces this diagnostic when a reference to the class `Never`
   // is found in code that has an SDK constraint whose lower bound is less than
-  // 2.X.0. This class wasn't defined in earlier versions, so this code won't be
-  // able to run against earlier versions of the SDK.
+  // 2.12.0. This class wasn't defined in earlier versions, so this code won't
+  // be able to run against earlier versions of the SDK.
   //
   // #### Examples
   //
   // Here's an example of a pubspec that defines an SDK constraint with a lower
-  // bound of less than 2.X.0:
+  // bound of less than 2.12.0:
   //
   // ```yaml
   // %uri="pubspec.yaml"
@@ -2050,7 +2113,7 @@
   //
   // ```yaml
   // environment:
-  //   sdk: '>=2.X.0 <2.7.0'
+  //   sdk: '>=2.12.0 <2.13.0'
   // ```
   //
   // If you need to support older versions of the SDK, then rewrite the code to
@@ -2058,14 +2121,12 @@
   //
   // ```dart
   // dynamic x;
-  // ``` */
+  // ```
   static const HintCode SDK_VERSION_NEVER = HintCode(
-      // TODO(brianwilkerson) Replace the message with the following when we know
-      //  when this feature will ship:
-      //    The type 'Never' wasn't supported until version 2.X.0, but this code
-      //    is required to be able to run on earlier versions.
       'SDK_VERSION_NEVER',
-      "The type Never isn't yet supported.");
+      "The type 'Never' wasn't supported until version 2.X.0, but this code is "
+          "required to be able to run on earlier versions.",
+      correction: "Try updating the SDK constraints.");
 
   /**
    * No parameters.
@@ -2350,6 +2411,16 @@
       hasPublishedDocs: true);
 
   /**
+   * Parameters:
+   * 0: the name of the non-diagnostic being ignored
+   */
+  static const HintCode UNIGNORABLE_IGNORE = HintCode(
+      'UNIGNORABLE_IGNORE', "The diagnostic '{0}' can't be ignored.",
+      correction:
+          "Try removing the name from the list, or removing the whole comment "
+          "if this is the only name in the list.");
+
+  /**
    * No parameters.
    */
   // #### Description
@@ -2386,6 +2457,18 @@
       correction: "Try removing the cast.", hasPublishedDocs: true);
 
   /**
+   * Parameters:
+   * 0: the name of the diagnostic being ignored
+   */
+  static const HintCode UNNECESSARY_IGNORE = HintCode(
+      'UNNECESSARY_IGNORE',
+      "The diagnostic '{0}' isn't produced at this location so it doesn't "
+          "need to be ignored.",
+      correction:
+          "Try removing the name from the list, or removing the whole comment "
+          "if this is the only name in the list.");
+
+  /**
    * Unnecessary `noSuchMethod` declaration.
    */
   static const HintCode UNNECESSARY_NO_SUCH_METHOD = HintCode(
diff --git a/pkg/analyzer/lib/src/dart/micro/cider_byte_store.dart b/pkg/analyzer/lib/src/dart/micro/cider_byte_store.dart
index 57531d9..9fd158d 100644
--- a/pkg/analyzer/lib/src/dart/micro/cider_byte_store.dart
+++ b/pkg/analyzer/lib/src/dart/micro/cider_byte_store.dart
@@ -5,6 +5,13 @@
 import 'package:analyzer/src/dart/analysis/cache.dart';
 import 'package:collection/collection.dart';
 
+class CacheData {
+  final int id;
+  final List<int> bytes;
+
+  CacheData(this.id, this.bytes);
+}
+
 /// Store of bytes associated with string keys and a hash.
 ///
 /// Each key must be not longer than 100 characters and consist of only `[a-z]`,
@@ -18,39 +25,52 @@
   /// [signature].
   ///
   /// Return `null` if the association does not exist.
-  List<int> get(String key, List<int> signature);
+  CacheData get(String key, List<int> signature);
 
-  /// Associate the given [bytes] with the [key] and [digest].
-  void put(String key, List<int> signature, List<int> bytes);
+  /// Associate the given [bytes] with the [key] and [signature]. Return the
+  /// [CacheData].
+  CacheData putGet(String key, List<int> signature, List<int> bytes);
+
+  ///  Used to decrement reference count for the given ids, if implemented.
+  void release(Iterable<int> ids);
 }
 
 class CiderCachedByteStore implements CiderByteStore {
   final Cache<String, CiderCacheEntry> _cache;
+  int idCounter = 0;
 
   CiderCachedByteStore(int maxCacheSize)
-      : _cache =
-            Cache<String, CiderCacheEntry>(maxCacheSize, (v) => v.bytes.length);
+      : _cache = Cache<String, CiderCacheEntry>(
+            maxCacheSize, (v) => v.data.bytes.length);
 
   @override
-  List<int> get(String key, List<int> signature) {
+  CacheData get(String key, List<int> signature) {
     var entry = _cache.get(key, () => null);
 
     if (entry != null &&
         const ListEquality<int>().equals(entry.signature, signature)) {
-      return entry.bytes;
+      return entry.data;
     }
     return null;
   }
 
   @override
-  void put(String key, List<int> signature, List<int> bytes) {
-    _cache.put(key, CiderCacheEntry(signature, bytes));
+  CacheData putGet(String key, List<int> signature, List<int> bytes) {
+    idCounter++;
+    var entry = CiderCacheEntry(signature, CacheData(idCounter, bytes));
+    _cache.put(key, entry);
+    return entry.data;
+  }
+
+  @override
+  void release(Iterable<int> ids) {
+    // do nothing
   }
 }
 
 class CiderCacheEntry {
+  final CacheData data;
   final List<int> signature;
-  final List<int> bytes;
 
-  CiderCacheEntry(this.signature, this.bytes);
+  CiderCacheEntry(this.signature, this.data);
 }
diff --git a/pkg/analyzer/lib/src/dart/micro/libraries_log.dart b/pkg/analyzer/lib/src/dart/micro/libraries_log.dart
deleted file mode 100644
index a67988b..0000000
--- a/pkg/analyzer/lib/src/dart/micro/libraries_log.dart
+++ /dev/null
@@ -1,88 +0,0 @@
-// Copyright (c) 2020, 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:meta/meta.dart';
-
-class ChangeFileLoadEntry extends LibrariesLogEntry {
-  /// The path of the file that was reported as changed.
-  final String target;
-
-  /// The files that depend transitively on the [target]. These files are
-  /// removed from the state, and from the element factory.
-  final List<LibrariesLogFile> removed = [];
-
-  ChangeFileLoadEntry._(this.target);
-
-  void addRemoved({
-    @required String path,
-    @required Uri uri,
-  }) {
-    removed.add(
-      LibrariesLogFile._(path, uri),
-    );
-  }
-
-  @override
-  String toString() {
-    return 'Change(target: $target, removed: $removed)';
-  }
-}
-
-class LibrariesLog {
-  final List<LibrariesLogEntry> entries = [];
-
-  ChangeFileLoadEntry changeFile(String path) {
-    var entry = ChangeFileLoadEntry._(path);
-    entries.add(entry);
-    return entry;
-  }
-
-  LoadLibrariesForTargetLogEntry loadForTarget({
-    @required String path,
-    @required Uri uri,
-  }) {
-    var entry = LoadLibrariesForTargetLogEntry._(
-      LibrariesLogFile._(path, uri),
-    );
-    entries.add(entry);
-    return entry;
-  }
-}
-
-abstract class LibrariesLogEntry {
-  final DateTime time = DateTime.now();
-}
-
-class LibrariesLogFile {
-  final String path;
-  final Uri uri;
-
-  LibrariesLogFile._(this.path, this.uri);
-
-  @override
-  String toString() {
-    return '(path: $path, uri: $uri)';
-  }
-}
-
-class LoadLibrariesForTargetLogEntry extends LibrariesLogEntry {
-  final LibrariesLogFile target;
-  final List<LibrariesLogFile> loaded = [];
-
-  LoadLibrariesForTargetLogEntry._(this.target);
-
-  void addLibrary({
-    @required String path,
-    @required Uri uri,
-  }) {
-    loaded.add(
-      LibrariesLogFile._(path, uri),
-    );
-  }
-
-  @override
-  String toString() {
-    return 'Load(target: $target, loaded: $loaded)';
-  }
-}
diff --git a/pkg/analyzer/lib/src/dart/micro/library_analyzer.dart b/pkg/analyzer/lib/src/dart/micro/library_analyzer.dart
index c61b3c9..00352e2 100644
--- a/pkg/analyzer/lib/src/dart/micro/library_analyzer.dart
+++ b/pkg/analyzer/lib/src/dart/micro/library_analyzer.dart
@@ -10,6 +10,7 @@
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/context/builder.dart';
+import 'package:analyzer/src/context/source.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/ast/utilities.dart';
 import 'package:analyzer/src/dart/constant/compute.dart';
@@ -27,6 +28,7 @@
 import 'package:analyzer/src/error/best_practices_verifier.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/error/dead_code_verifier.dart';
+import 'package:analyzer/src/error/ignore_validator.dart';
 import 'package:analyzer/src/error/imports_verifier.dart';
 import 'package:analyzer/src/error/inheritance_override.dart';
 import 'package:analyzer/src/error/override_verifier.dart';
@@ -244,6 +246,16 @@
         }
       });
     }
+
+    // This must happen after all other diagnostics have been computed but
+    // before the list of diagnostics has been filtered.
+    for (var file in _library.libraryFiles) {
+      if (file.source != null) {
+        IgnoreValidator(_getErrorReporter(file), _getErrorListener(file).errors,
+                _fileToIgnoreInfo[file], _fileToLineInfo[file])
+            .reportErrors();
+      }
+    }
   }
 
   void _computeHints(FileState file, CompilationUnit unit) {
@@ -707,7 +719,15 @@
       var enclosingExecutable = node?.thisOrAncestorMatching((e) {
         return e.parent is ClassDeclaration || e.parent is CompilationUnit;
       });
-      enclosingExecutable?.accept(resolverVisitor);
+
+      if (enclosingExecutable != null) {
+        var enclosingClass = enclosingExecutable.parent;
+        if (enclosingClass is ClassDeclaration) {
+          resolverVisitor.enclosingClass = enclosingClass.declaredElement;
+        }
+
+        enclosingExecutable?.accept(resolverVisitor);
+      }
     } else {
       unit.accept(resolverVisitor);
     }
@@ -789,7 +809,7 @@
     }
     StringLiteral uriLiteral = directive.uri;
     CompileTimeErrorCode errorCode = CompileTimeErrorCode.URI_DOES_NOT_EXIST;
-    if (_isGenerated(source)) {
+    if (isGeneratedSource(source)) {
       errorCode = CompileTimeErrorCode.URI_HAS_NOT_BEEN_GENERATED;
     }
     _getErrorReporter(file)
@@ -805,30 +825,6 @@
       }
     }
   }
-
-  /// Return `true` if the given [source] refers to a file that is assumed to be
-  /// generated.
-  static bool _isGenerated(Source source) {
-    if (source == null) {
-      return false;
-    }
-    // TODO(brianwilkerson) Generalize this mechanism.
-    const List<String> suffixes = <String>[
-      '.g.dart',
-      '.pb.dart',
-      '.pbenum.dart',
-      '.pbserver.dart',
-      '.pbjson.dart',
-      '.template.dart'
-    ];
-    String fullName = source.fullName;
-    for (String suffix in suffixes) {
-      if (fullName.endsWith(suffix)) {
-        return true;
-      }
-    }
-    return false;
-  }
 }
 
 /// Analysis result for single file.
diff --git a/pkg/analyzer/lib/src/dart/micro/library_graph.dart b/pkg/analyzer/lib/src/dart/micro/library_graph.dart
index b870957..527a89b 100644
--- a/pkg/analyzer/lib/src/dart/micro/library_graph.dart
+++ b/pkg/analyzer/lib/src/dart/micro/library_graph.dart
@@ -90,6 +90,9 @@
   UnlinkedUnit2 unlinked2;
   LibraryCycle _libraryCycle;
 
+  /// id of the cache entry.
+  int id;
+
   FileState._(
     this._fsState,
     this.path,
@@ -219,7 +222,8 @@
     // Prepare bytes of the unlinked bundle - existing or new.
     List<int> bytes;
     {
-      bytes = _fsState._byteStore.get(unlinkedKey, _digest);
+      var cacheData = _fsState._byteStore.get(unlinkedKey, _digest);
+      bytes = cacheData?.bytes;
 
       if (bytes == null || bytes.isEmpty) {
         var content = performance.run('content', (_) {
@@ -236,7 +240,8 @@
           var unlinkedBuilder = serializeAstCiderUnlinked(_digest, unit);
           bytes = unlinkedBuilder.toBuffer();
           performance.getDataInt('length').add(bytes.length);
-          _fsState._byteStore.put(unlinkedKey, _digest, bytes);
+          cacheData = _fsState._byteStore.putGet(unlinkedKey, _digest, bytes);
+          bytes = cacheData.bytes;
         });
 
         performance.run('prefetch', (_) {
@@ -244,6 +249,7 @@
           _prefetchDirectReferences(unlinked2);
         });
       }
+      id = cacheData.id;
     }
 
     // Read the unlinked bundle.
@@ -515,6 +521,19 @@
     return featureSetProvider.getFeatureSet(path, uri);
   }
 
+  Version contextLanguageVersion(
+    String path,
+    Uri uri,
+    WorkspacePackage workspacePackage,
+  ) {
+    var workspaceLanguageVersion = workspacePackage?.languageVersion;
+    if (workspaceLanguageVersion != null) {
+      return workspaceLanguageVersion;
+    }
+
+    return featureSetProvider.getLanguageVersion(path, uri);
+  }
+
   FileState getFileForPath({
     @required String path,
     @required OperationPerformanceImpl performance,
@@ -530,7 +549,7 @@
       var workspacePackage = _workspace?.findPackageFor(path);
       var featureSet = contextFeatureSet(path, uri, workspacePackage);
       var packageLanguageVersion =
-          featureSetProvider.getLanguageVersion(path, uri);
+          contextLanguageVersion(path, uri, workspacePackage);
       file = FileState._(this, path, uri, source, workspacePackage, featureSet,
           packageLanguageVersion);
 
@@ -561,7 +580,7 @@
       var workspacePackage = _workspace?.findPackageFor(path);
       var featureSet = contextFeatureSet(path, uri, workspacePackage);
       var packageLanguageVersion =
-          featureSetProvider.getLanguageVersion(path, uri);
+          contextLanguageVersion(path, uri, workspacePackage);
 
       file = FileState._(this, path, uri, source, workspacePackage, featureSet,
           packageLanguageVersion);
@@ -645,6 +664,9 @@
   /// The hash of all the paths of the files in this cycle.
   String cyclePathsHash;
 
+  /// id of the cache entry.
+  int id;
+
   LibraryCycle();
 
   String get signatureStr {
diff --git a/pkg/analyzer/lib/src/dart/micro/resolve_file.dart b/pkg/analyzer/lib/src/dart/micro/resolve_file.dart
index 53409d0..b0e1808 100644
--- a/pkg/analyzer/lib/src/dart/micro/resolve_file.dart
+++ b/pkg/analyzer/lib/src/dart/micro/resolve_file.dart
@@ -2,7 +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:async';
 import 'dart:typed_data';
 
 import 'package:analyzer/dart/analysis/results.dart';
@@ -21,7 +20,6 @@
 import 'package:analyzer/src/dart/analysis/results.dart';
 import 'package:analyzer/src/dart/micro/analysis_context.dart';
 import 'package:analyzer/src/dart/micro/cider_byte_store.dart';
-import 'package:analyzer/src/dart/micro/libraries_log.dart';
 import 'package:analyzer/src/dart/micro/library_analyzer.dart';
 import 'package:analyzer/src/dart/micro/library_graph.dart';
 import 'package:analyzer/src/exception/exception.dart';
@@ -70,8 +68,6 @@
 
   final Workspace workspace;
 
-  _LibraryContextReset _libraryContextReset;
-
   /// This field gets value only during testing.
   FileResolverTestView testView;
 
@@ -79,10 +75,13 @@
 
   MicroContextObjects contextObjects;
 
-  final LibrariesLog _librariesLog = LibrariesLog();
-
   _LibraryContext libraryContext;
 
+  /// List of ids for cache elements that are invalidated. Track elements that
+  /// are invalidated during [changeFile]. Used in [releaseAndClearRemovedIds]
+  /// to release the cache items and is then cleared.
+  final Set<int> removedCacheIds = {};
+
   FileResolver(
     PerformanceLog logger,
     ResourceProvider resourceProvider,
@@ -91,7 +90,7 @@
     String Function(String path) getFileDigest,
     void Function(List<String> paths) prefetchFiles, {
     @required Workspace workspace,
-    Duration libraryContextResetTimeout = const Duration(seconds: 60),
+    @deprecated Duration libraryContextResetTimeout,
   }) : this.from(
           logger: logger,
           resourceProvider: resourceProvider,
@@ -99,6 +98,7 @@
           getFileDigest: getFileDigest,
           prefetchFiles: prefetchFiles,
           workspace: workspace,
+          // ignore: deprecated_member_use_from_same_package
           libraryContextResetTimeout: libraryContextResetTimeout,
         );
 
@@ -110,7 +110,7 @@
     @required void Function(List<String> paths) prefetchFiles,
     @required Workspace workspace,
     CiderByteStore byteStore,
-    Duration libraryContextResetTimeout = const Duration(seconds: 60),
+    @deprecated Duration libraryContextResetTimeout,
   })  : logger = logger,
         sourceFactory = sourceFactory,
         resourceProvider = resourceProvider,
@@ -119,20 +119,13 @@
         workspace = workspace {
     byteStore ??= CiderCachedByteStore(memoryCacheSize);
     this.byteStore = byteStore;
-    _libraryContextReset = _LibraryContextReset(
-      fileResolver: this,
-      resetTimeout: libraryContextResetTimeout,
-    );
-  }
-
-  List<LibrariesLogEntry> get librariesLogEntries {
-    return _librariesLog.entries;
   }
 
   /// Update the resolver to reflect the fact that the file with the given
   /// [path] was changed. We need to make sure that when this file, of any file
   /// that directly or indirectly referenced it, is resolved, we used the new
-  /// state of the file.
+  /// state of the file. Updates [removedCacheIds] with the ids of the invalidated
+  /// items, used in [releaseAndClearRemovedIds] to release the cache items.
   void changeFile(String path) {
     if (fsState == null) {
       return;
@@ -142,25 +135,20 @@
     var removedFiles = <FileState>[];
     fsState.changeFile(path, removedFiles);
 
-    // Update the log.
-    var logEntry = _librariesLog.changeFile(path);
+    // Schedule disposing references to cached unlinked data.
     for (var removedFile in removedFiles) {
-      logEntry.addRemoved(
-        path: removedFile.path,
-        uri: removedFile.uri,
-      );
+      removedCacheIds.add(removedFile.id);
     }
 
     // Remove libraries represented by removed files.
     // If we need these libraries later, we will relink and reattach them.
     if (libraryContext != null) {
-      libraryContext.remove(removedFiles);
+      libraryContext.remove(removedFiles, removedCacheIds);
     }
   }
 
-  void dispose() {
-    _libraryContextReset.dispose();
-  }
+  @deprecated
+  void dispose() {}
 
   ErrorsResult getErrors({
     @required String path,
@@ -170,52 +158,50 @@
 
     performance ??= OperationPerformanceImpl('<default>');
 
-    return _withLibraryContextReset(() {
-      return logger.run('Get errors for $path', () {
-        var fileContext = getFileContext(
+    return logger.run('Get errors for $path', () {
+      var fileContext = getFileContext(
+        path: path,
+        performance: performance,
+      );
+      var file = fileContext.file;
+
+      var errorsSignatureBuilder = ApiSignature();
+      errorsSignatureBuilder.addBytes(file.libraryCycle.signature);
+      errorsSignatureBuilder.addBytes(file.digest);
+      var errorsSignature = errorsSignatureBuilder.toByteList();
+
+      var errorsKey = file.path + '.errors';
+      var bytes = byteStore.get(errorsKey, errorsSignature)?.bytes;
+      List<AnalysisError> errors;
+      if (bytes != null) {
+        var data = CiderUnitErrors.fromBuffer(bytes);
+        errors = data.errors.map((error) {
+          return ErrorEncoding.decode(file.source, error);
+        }).toList();
+      }
+
+      if (errors == null) {
+        var unitResult = resolve(
           path: path,
           performance: performance,
         );
-        var file = fileContext.file;
+        errors = unitResult.errors;
 
-        var errorsSignatureBuilder = ApiSignature();
-        errorsSignatureBuilder.addBytes(file.libraryCycle.signature);
-        errorsSignatureBuilder.addBytes(file.digest);
-        var errorsSignature = errorsSignatureBuilder.toByteList();
+        bytes = CiderUnitErrorsBuilder(
+          signature: errorsSignature,
+          errors: errors.map(ErrorEncoding.encode).toList(),
+        ).toBuffer();
+        bytes = byteStore.putGet(errorsKey, errorsSignature, bytes).bytes;
+      }
 
-        var errorsKey = file.path + '.errors';
-        var bytes = byteStore.get(errorsKey, errorsSignature);
-        List<AnalysisError> errors;
-        if (bytes != null) {
-          var data = CiderUnitErrors.fromBuffer(bytes);
-          errors = data.errors.map((error) {
-            return ErrorEncoding.decode(file.source, error);
-          }).toList();
-        }
-
-        if (errors == null) {
-          var unitResult = resolve(
-            path: path,
-            performance: performance,
-          );
-          errors = unitResult.errors;
-
-          bytes = CiderUnitErrorsBuilder(
-            signature: errorsSignature,
-            errors: errors.map(ErrorEncoding.encode).toList(),
-          ).toBuffer();
-          byteStore.put(errorsKey, errorsSignature, bytes);
-        }
-
-        return ErrorsResultImpl(
-          contextObjects.analysisSession,
-          path,
-          file.uri,
-          file.lineInfo,
-          false, // isPart
-          errors,
-        );
-      });
+      return ErrorsResultImpl(
+        contextObjects.analysisSession,
+        path,
+        file.uri,
+        file.lineInfo,
+        false, // isPart
+        errors,
+      );
     });
   }
 
@@ -271,6 +257,53 @@
     return file.libraryCycle.signatureStr;
   }
 
+  /// Ensure that libraries necessary for resolving [path] are linked.
+  ///
+  /// Libraries are linked in library cycles, from the bottom to top, so that
+  /// when we link a cycle, everything it transitively depends is ready. We
+  /// load newly linked libraries from bytes, and when we link a new library
+  /// cycle we partially resynthesize AST and elements from previously
+  /// loaded libraries.
+  ///
+  /// But when we are done linking libraries, and want to resolve just the
+  /// very top library that transitively depends on the whole dependency
+  /// tree, this library will not reference as many elements in the
+  /// dependencies as we needed for linking. Most probably it references
+  /// elements from directly imported libraries, and a couple of layers below.
+  /// So, keeping all previously resynthesized data is usually a waste.
+  ///
+  /// This method ensures that we discard the libraries context, with all its
+  /// partially resynthesized data, and so prepare for loading linked summaries
+  /// from bytes, which will be done by [getErrors]. It is OK for it to
+  /// spend some more time on this.
+  void linkLibraries({
+    @required String path,
+  }) {
+    _throwIfNotAbsoluteNormalizedPath(path);
+
+    var performance = OperationPerformanceImpl('<unused>');
+
+    var fileContext = getFileContext(
+      path: path,
+      performance: performance,
+    );
+    var file = fileContext.file;
+    var libraryFile = file.partOfLibrary ?? file;
+
+    libraryContext.load2(
+      targetLibrary: libraryFile,
+      performance: performance,
+    );
+
+    _resetContextObjects();
+  }
+
+  /// Update the cache with list of invalidated ids and clears [removedCacheIds].
+  void releaseAndClearRemovedIds() {
+    byteStore.release(removedCacheIds);
+    removedCacheIds.clear();
+  }
+
   /// The [completionLine] and [completionColumn] are zero based.
   ResolvedUnitResult resolve({
     int completionLine,
@@ -282,87 +315,85 @@
 
     performance ??= OperationPerformanceImpl('<default>');
 
-    return _withLibraryContextReset(() {
-      return logger.run('Resolve $path', () {
-        var fileContext = getFileContext(
-          path: path,
+    return logger.run('Resolve $path', () {
+      var fileContext = getFileContext(
+        path: path,
+        performance: performance,
+      );
+      var file = fileContext.file;
+      var libraryFile = file.partOfLibrary ?? file;
+
+      int completionOffset;
+      if (completionLine != null && completionColumn != null) {
+        var lineOffset = file.lineInfo.getOffsetOfLine(completionLine);
+        completionOffset = lineOffset + completionColumn;
+      }
+
+      performance.run('libraryContext', (performance) {
+        libraryContext.load2(
+          targetLibrary: libraryFile,
           performance: performance,
         );
-        var file = fileContext.file;
-        var libraryFile = file.partOfLibrary ?? file;
-
-        int completionOffset;
-        if (completionLine != null && completionColumn != null) {
-          var lineOffset = file.lineInfo.getOffsetOfLine(completionLine);
-          completionOffset = lineOffset + completionColumn;
-        }
-
-        performance.run('libraryContext', (performance) {
-          libraryContext.load2(
-            targetLibrary: libraryFile,
-            performance: performance,
-          );
-        });
-
-        testView?.addResolvedFile(path);
-
-        var content = _getFileContent(path);
-        var errorListener = RecordingErrorListener();
-        var unit = file.parse(errorListener, content);
-
-        Map<FileState, UnitAnalysisResult> results;
-
-        logger.run('Compute analysis results', () {
-          var libraryAnalyzer = LibraryAnalyzer(
-            fileContext.analysisOptions,
-            contextObjects.declaredVariables,
-            sourceFactory,
-            (_) => true, // _isLibraryUri
-            contextObjects.analysisContext,
-            libraryContext.elementFactory,
-            contextObjects.inheritanceManager,
-            libraryFile,
-            resourceProvider,
-            (file) => file.getContentWithSameDigest(),
-          );
-
-          try {
-            results = performance.run('analyze', (performance) {
-              return NullSafetyUnderstandingFlag.enableNullSafetyTypes(() {
-                return libraryAnalyzer.analyzeSync(
-                  completionPath: completionOffset != null ? path : null,
-                  completionOffset: completionOffset,
-                  performance: performance,
-                );
-              });
-            });
-          } catch (exception, stackTrace) {
-            var fileContentMap = <String, String>{};
-            for (var file in libraryFile.libraryFiles) {
-              var path = file.path;
-              fileContentMap[path] = _getFileContent(path);
-            }
-            throw CaughtExceptionWithFiles(
-              exception,
-              stackTrace,
-              fileContentMap,
-            );
-          }
-        });
-        UnitAnalysisResult fileResult = results[file];
-
-        return ResolvedUnitResultImpl(
-          contextObjects.analysisSession,
-          path,
-          file.uri,
-          file.exists,
-          content,
-          unit.lineInfo,
-          false, // isPart
-          fileResult.unit,
-          fileResult.errors,
-        );
       });
+
+      testView?.addResolvedFile(path);
+
+      var content = _getFileContent(path);
+      var errorListener = RecordingErrorListener();
+      var unit = file.parse(errorListener, content);
+
+      Map<FileState, UnitAnalysisResult> results;
+
+      logger.run('Compute analysis results', () {
+        var libraryAnalyzer = LibraryAnalyzer(
+          fileContext.analysisOptions,
+          contextObjects.declaredVariables,
+          sourceFactory,
+          (_) => true, // _isLibraryUri
+          contextObjects.analysisContext,
+          libraryContext.elementFactory,
+          contextObjects.inheritanceManager,
+          libraryFile,
+          resourceProvider,
+          (file) => file.getContentWithSameDigest(),
+        );
+
+        try {
+          results = performance.run('analyze', (performance) {
+            return NullSafetyUnderstandingFlag.enableNullSafetyTypes(() {
+              return libraryAnalyzer.analyzeSync(
+                completionPath: completionOffset != null ? path : null,
+                completionOffset: completionOffset,
+                performance: performance,
+              );
+            });
+          });
+        } catch (exception, stackTrace) {
+          var fileContentMap = <String, String>{};
+          for (var file in libraryFile.libraryFiles) {
+            var path = file.path;
+            fileContentMap[path] = _getFileContent(path);
+          }
+          throw CaughtExceptionWithFiles(
+            exception,
+            stackTrace,
+            fileContentMap,
+          );
+        }
+      });
+      UnitAnalysisResult fileResult = results[file];
+
+      return ResolvedUnitResultImpl(
+        contextObjects.analysisSession,
+        path,
+        file.uri,
+        file.exists,
+        content,
+        unit.lineInfo,
+        false, // isPart
+        fileResult.unit,
+        fileResult.errors,
+      );
     });
   }
 
@@ -431,7 +462,6 @@
         resourceProvider,
         byteStore,
         contextObjects,
-        _librariesLog,
       );
     }
   }
@@ -531,6 +561,13 @@
     }
   }
 
+  void _resetContextObjects() {
+    if (libraryContext != null) {
+      contextObjects = null;
+      libraryContext = null;
+    }
+  }
+
   void _throwIfNotAbsoluteNormalizedPath(String path) {
     var pathContext = resourceProvider.pathContext;
     if (pathContext.normalize(path) != path) {
@@ -540,19 +577,6 @@
     }
   }
 
-  /// Run the [operation] that uses the library context, by locking it first,
-  /// so that it is not reset while the operating is still running, and
-  /// unlocking after the operation is done, so that the library context
-  /// will be reset after some timeout.
-  T _withLibraryContextReset<T>(T Function() operation) {
-    _libraryContextReset.lock();
-    try {
-      return operation();
-    } finally {
-      _libraryContextReset.unlock();
-    }
-  }
-
   static File _getFile(Folder directory, String name) {
     Resource resource = directory.getChild(name);
     if (resource is File && resource.exists) {
@@ -578,7 +602,6 @@
   final ResourceProvider resourceProvider;
   final CiderByteStore byteStore;
   final MicroContextObjects contextObjects;
-  final LibrariesLog librariesLog;
 
   LinkedElementFactory elementFactory;
 
@@ -589,7 +612,6 @@
     this.resourceProvider,
     this.byteStore,
     this.contextObjects,
-    this.librariesLog,
   ) {
     elementFactory = LinkedElementFactory(
       contextObjects.analysisContext,
@@ -609,28 +631,17 @@
     var librariesLinkedTimer = Stopwatch();
     var inputsTimer = Stopwatch();
 
-    var logEntry = librariesLog.loadForTarget(
-      path: targetLibrary.path,
-      uri: targetLibrary.uri,
-    );
-
     void loadBundle(LibraryCycle cycle) {
       if (!loadedBundles.add(cycle)) return;
 
-      for (var library in cycle.libraries) {
-        logEntry.addLibrary(
-          path: library.path,
-          uri: library.uri,
-        );
-      }
-
       performance.getDataInt('cycleCount').increment();
       performance.getDataInt('libraryCount').add(cycle.libraries.length);
 
       cycle.directDependencies.forEach(loadBundle);
 
       var key = cycle.cyclePathsHash;
-      var bytes = byteStore.get(key, cycle.signature);
+      var data = byteStore.get(key, cycle.signature);
+      var bytes = data?.bytes;
 
       if (bytes == null) {
         librariesLinkedTimer.start();
@@ -682,7 +693,8 @@
 
         bytes = serializeBundle(cycle.signature, linkResult).toBuffer();
 
-        byteStore.put(key, cycle.signature, bytes);
+        data = byteStore.putGet(key, cycle.signature, bytes);
+        bytes = data.bytes;
         performance.getDataInt('bytesPut').add(bytes.length);
 
         librariesLinkedTimer.stop();
@@ -690,14 +702,7 @@
         performance.getDataInt('bytesGet').add(bytes.length);
         performance.getDataInt('libraryLoadCount').add(cycle.libraries.length);
       }
-
-      // We are about to load dart:core, but if we have just linked it, the
-      // linker might have set the type provider. So, clear it, and recreate
-      // the element factory - it is empty anyway.
-      if (!elementFactory.hasDartCore) {
-        contextObjects.analysisContext.clearTypeProvider();
-        elementFactory.declareDartCoreDynamicNever();
-      }
+      cycle.id = data.id;
 
       var cBundle = CiderLinkedLibraryCycle.fromBuffer(bytes);
       inputBundles.add(cBundle.bundle);
@@ -715,6 +720,9 @@
           );
         }
       }
+
+      // We might have just linked dart:core, ensure the type provider.
+      _createElementFactoryTypeProvider();
     }
 
     logger.run('Prepare linked bundles', () {
@@ -730,17 +738,31 @@
 
   /// Remove libraries represented by the [removed] files.
   /// If we need these libraries later, we will relink and reattach them.
-  void remove(List<FileState> removed) {
+  void remove(List<FileState> removed, Set<int> removedIds) {
     elementFactory.removeLibraries(
-      removed.map((e) => e.uriStr).toList(),
+      removed.map((e) => e.uriStr).toSet(),
     );
 
     var removedSet = removed.toSet();
     loadedBundles.removeWhere((cycle) {
-      return cycle.libraries.any(removedSet.contains);
+      if (cycle.libraries.any(removedSet.contains)) {
+        removedIds.add(cycle.id);
+        return true;
+      }
+      return false;
     });
   }
 
+  /// Ensure that type provider is created.
+  void _createElementFactoryTypeProvider() {
+    var analysisContext = contextObjects.analysisContext;
+    if (analysisContext.typeProviderNonNullableByDefault == null) {
+      var dartCore = elementFactory.libraryOfUri('dart:core');
+      var dartAsync = elementFactory.libraryOfUri('dart:async');
+      elementFactory.createTypeProviders(dartCore, dartAsync);
+    }
+  }
+
   static CiderLinkedLibraryCycleBuilder serializeBundle(
       List<int> signature, link2.LinkResult linkResult) {
     return CiderLinkedLibraryCycleBuilder(
@@ -749,61 +771,3 @@
     );
   }
 }
-
-/// The helper to reset the library context will be reset after the specified
-/// interval of inactivity. Keeping library context with loaded elements
-/// significantly improves performance of resolution, because we don't have
-/// to resynthesize elements, build export scopes for libraries, etc.
-/// However keeping elements that we don't need anymore, or when the user
-/// does not work with files, is wasteful.
-class _LibraryContextReset {
-  final FileResolver fileResolver;
-  final Duration resetTimeout;
-
-  /// The lock level, incremented by [lock], and decremented by [unlock].
-  /// The timeout timer is started when the level reaches zero.
-  int _lockLevel = 0;
-  Timer _timer;
-
-  _LibraryContextReset({
-    @required this.fileResolver,
-    @required this.resetTimeout,
-  });
-
-  void dispose() {
-    _stop();
-  }
-
-  /// Stop the timeout timer, and increment the lock level. The library context
-  /// will be not reset until [unlock] will bring the lock level back to zero.
-  void lock() {
-    _stop();
-    _lockLevel++;
-  }
-
-  /// Unlock the timer, the library context will be reset after the timeout.
-  void unlock() {
-    assert(_lockLevel > 0);
-    _lockLevel--;
-
-    if (_lockLevel == 0) {
-      _stop();
-      if (resetTimeout != null) {
-        _timer = Timer(resetTimeout, () {
-          _timer = null;
-          if (fileResolver.libraryContext != null) {
-            fileResolver.contextObjects = null;
-            fileResolver.libraryContext = null;
-          }
-        });
-      }
-    }
-  }
-
-  void _stop() {
-    if (_timer != null) {
-      _timer.cancel();
-      _timer = null;
-    }
-  }
-}
diff --git a/pkg/analyzer/lib/src/dart/resolver/annotation_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/annotation_resolver.dart
index 92fef68..bd112a8 100644
--- a/pkg/analyzer/lib/src/dart/resolver/annotation_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/annotation_resolver.dart
@@ -76,7 +76,6 @@
         element = _resolver.toLegacyElement(element);
 
         identifier.staticElement = element;
-        identifier.staticType = element?.type ?? DynamicTypeImpl.instance;
         // TODO(scheglov) error?
       } else if (prefixElement is PrefixElement) {
         var resolver = PropertyElementResolver(_resolver);
@@ -108,14 +107,6 @@
 
         var element = result.readElement;
         identifier.staticElement = element;
-
-        DartType type;
-        if (element is PropertyAccessorElement && element.isGetter) {
-          type = element.returnType;
-        } else {
-          type = DynamicTypeImpl.instance;
-        }
-        identifier.staticType = type;
       }
     } else {
       var identifier = nodeName as SimpleIdentifier;
@@ -137,16 +128,6 @@
           [identifier.name],
         );
       }
-
-      DartType type;
-      if (element is ClassElement) {
-        type = _resolver.typeProvider.typeType;
-      } else if (element is PropertyAccessorElement && element.isGetter) {
-        type = element.returnType;
-      } else {
-        type = DynamicTypeImpl.instance;
-      }
-      identifier.staticType = type;
     }
 
     _resolveAnnotationElement(node);
diff --git a/pkg/analyzer/lib/src/dart/resolver/assignment_expression_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/assignment_expression_resolver.dart
index 6fd621d..ebe7c47 100644
--- a/pkg/analyzer/lib/src/dart/resolver/assignment_expression_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/assignment_expression_resolver.dart
@@ -70,12 +70,6 @@
     _resolver.migrationResolutionHooks
         ?.setCompoundAssignmentExpressionTypes(node);
 
-    _resolver.setAssignmentBackwardCompatibility(
-      assignment: node,
-      left: left,
-      hasRead: hasRead,
-    );
-
     _resolveOperator(node);
 
     {
diff --git a/pkg/analyzer/lib/src/dart/resolver/ast_rewrite.dart b/pkg/analyzer/lib/src/dart/resolver/ast_rewrite.dart
index 40f9dcf..9daaea2 100644
--- a/pkg/analyzer/lib/src/dart/resolver/ast_rewrite.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/ast_rewrite.dart
@@ -32,7 +32,7 @@
         // This isn't a constructor invocation because it's in a cascade.
         return node;
       }
-      Element element = nameScope.lookup2(methodName.name).getter;
+      Element element = nameScope.lookup(methodName.name).getter;
       if (element is ClassElement) {
         TypeName typeName = astFactory.typeName(methodName, node.typeArguments);
         ConstructorName constructorName =
@@ -56,7 +56,7 @@
         // This isn't a constructor invocation because a null aware operator is
         // being used.
       }
-      Element element = nameScope.lookup2(target.name).getter;
+      Element element = nameScope.lookup(target.name).getter;
       if (element is ClassElement) {
         // Possible case: C.n()
         var constructorElement = element.getNamedConstructor(methodName.name);
@@ -81,7 +81,7 @@
         }
       } else if (element is PrefixElement) {
         // Possible cases: p.C() or p.C<>()
-        Element prefixedElement = element.scope.lookup2(methodName.name).getter;
+        Element prefixedElement = element.scope.lookup(methodName.name).getter;
         if (prefixedElement is ClassElement) {
           TypeName typeName = astFactory.typeName(
               astFactory.prefixedIdentifier(target, node.operator, methodName),
@@ -106,11 +106,11 @@
       }
     } else if (target is PrefixedIdentifier) {
       // Possible case: p.C.n()
-      Element prefixElement = nameScope.lookup2(target.prefix.name).getter;
+      Element prefixElement = nameScope.lookup(target.prefix.name).getter;
       target.prefix.staticElement = prefixElement;
       if (prefixElement is PrefixElement) {
         Element element =
-            prefixElement.scope.lookup2(target.identifier.name).getter;
+            prefixElement.scope.lookup(target.identifier.name).getter;
         if (element is ClassElement) {
           var constructorElement = element.getNamedConstructor(methodName.name);
           if (constructorElement != null) {
diff --git a/pkg/analyzer/lib/src/dart/resolver/lexical_lookup.dart b/pkg/analyzer/lib/src/dart/resolver/lexical_lookup.dart
index 9e2cd18..6417634 100644
--- a/pkg/analyzer/lib/src/dart/resolver/lexical_lookup.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/lexical_lookup.dart
@@ -18,7 +18,7 @@
     @required bool setter,
   }) {
     var id = node.name;
-    var scopeResult = _resolver.nameScope.lookup2(id);
+    var scopeResult = _resolver.nameScope.lookup(id);
     var scopeGetter = scopeResult.getter;
     var scopeSetter = scopeResult.setter;
     if (scopeGetter != null || scopeSetter != null) {
diff --git a/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart
index 2344a75..32e61ba 100644
--- a/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart
@@ -490,7 +490,7 @@
 
   void _resolveReceiverNull(
       MethodInvocation node, SimpleIdentifier nameNode, String name) {
-    var element = nameScope.lookup2(name).getter;
+    var element = nameScope.lookup(name).getter;
     if (element != null) {
       element = _resolver.toLegacyElement(element);
       nameNode.staticElement = element;
@@ -557,7 +557,7 @@
       }
     }
 
-    var element = prefix.scope.lookup2(name).getter;
+    var element = prefix.scope.lookup(name).getter;
     element = _resolver.toLegacyElement(element);
     nameNode.staticElement = element;
 
diff --git a/pkg/analyzer/lib/src/dart/resolver/postfix_expression_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/postfix_expression_resolver.dart
index dbc01c0..2f7d76f 100644
--- a/pkg/analyzer/lib/src/dart/resolver/postfix_expression_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/postfix_expression_resolver.dart
@@ -65,12 +65,6 @@
     _resolver.migrationResolutionHooks
         ?.setCompoundAssignmentExpressionTypes(node);
 
-    _resolver.setAssignmentBackwardCompatibility(
-      assignment: node,
-      left: operand,
-      hasRead: true,
-    );
-
     // TODO(scheglov) Use VariableElement and do in resolveForWrite() ?
     _assignmentShared.checkFinalAlreadyAssigned(operand);
 
diff --git a/pkg/analyzer/lib/src/dart/resolver/prefix_expression_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/prefix_expression_resolver.dart
index c3c161a..cfaaf15 100644
--- a/pkg/analyzer/lib/src/dart/resolver/prefix_expression_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/prefix_expression_resolver.dart
@@ -68,12 +68,6 @@
       _resolver.migrationResolutionHooks
           ?.setCompoundAssignmentExpressionTypes(node);
 
-      _resolver.setAssignmentBackwardCompatibility(
-        assignment: node,
-        left: operand,
-        hasRead: true,
-      );
-
       _assignmentShared.checkFinalAlreadyAssigned(node.operand);
     } else {
       node.operand.accept(_resolver);
@@ -205,7 +199,7 @@
 
   void _resolve2(PrefixExpressionImpl node) {
     TokenType operator = node.operator.type;
-    if (identical(node.operand.staticType, NeverTypeImpl.instance)) {
+    if (identical(node.readType, NeverTypeImpl.instance)) {
       _recordStaticType(node, NeverTypeImpl.instance);
     } else {
       // The other cases are equivalent to invoking a method.
diff --git a/pkg/analyzer/lib/src/dart/resolver/prefixed_identifier_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/prefixed_identifier_resolver.dart
index 54a67e4..6d65356 100644
--- a/pkg/analyzer/lib/src/dart/resolver/prefixed_identifier_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/prefixed_identifier_resolver.dart
@@ -32,10 +32,60 @@
       hasWrite: false,
     );
 
-    var identifier = node.identifier;
-    identifier.staticElement = result.readElement;
+    var element = result.readElement;
 
-    _resolve2(node);
+    var identifier = node.identifier;
+    identifier.staticElement = element;
+
+    if (element is ExtensionElement) {
+      _setExtensionIdentifierType(node);
+      return;
+    }
+
+    if (identical(node.prefix.staticType, NeverTypeImpl.instance)) {
+      _recordStaticType(identifier, NeverTypeImpl.instance);
+      _recordStaticType(node, NeverTypeImpl.instance);
+      return;
+    }
+
+    DartType type = DynamicTypeImpl.instance;
+    if (element is ClassElement) {
+      if (_isExpressionIdentifier(node)) {
+        var type = _typeProvider.typeType;
+        node.staticType = type;
+        identifier.staticType = type;
+      }
+      return;
+    } else if (element is DynamicElementImpl) {
+      var type = _typeProvider.typeType;
+      node.staticType = type;
+      identifier.staticType = type;
+      return;
+    } else if (element is FunctionTypeAliasElement) {
+      if (node.parent is TypeName) {
+        // no type
+      } else {
+        var type = _typeProvider.typeType;
+        node.staticType = type;
+        identifier.staticType = type;
+      }
+      return;
+    } else if (element is MethodElement) {
+      type = element.type;
+    } else if (element is PropertyAccessorElement) {
+      type = _getTypeOfProperty(element);
+    } else if (element is ExecutableElement) {
+      type = element.type;
+    } else if (element is VariableElement) {
+      type = element.type;
+    } else if (result.functionTypeCallType != null) {
+      type = result.functionTypeCallType;
+    }
+
+    type = _inferenceHelper.inferTearOff(node, identifier, type);
+
+    _recordStaticType(identifier, type);
+    _recordStaticType(node, type);
   }
 
   /// Return the type that should be recorded for a node that resolved to the given accessor.
@@ -103,60 +153,6 @@
     _inferenceHelper.recordStaticType(expression, type);
   }
 
-  void _resolve2(PrefixedIdentifier node) {
-    SimpleIdentifier prefixedIdentifier = node.identifier;
-    Element staticElement = prefixedIdentifier.staticElement;
-
-    if (staticElement is ExtensionElement) {
-      _setExtensionIdentifierType(node);
-      return;
-    }
-
-    if (identical(node.prefix.staticType, NeverTypeImpl.instance)) {
-      _recordStaticType(prefixedIdentifier, NeverTypeImpl.instance);
-      _recordStaticType(node, NeverTypeImpl.instance);
-      return;
-    }
-
-    DartType staticType = DynamicTypeImpl.instance;
-    if (staticElement is ClassElement) {
-      if (_isExpressionIdentifier(node)) {
-        var type = _typeProvider.typeType;
-        node.staticType = type;
-        node.identifier.staticType = type;
-      }
-      return;
-    } else if (staticElement is DynamicElementImpl) {
-      var type = _typeProvider.typeType;
-      node.staticType = type;
-      node.identifier.staticType = type;
-      return;
-    } else if (staticElement is FunctionTypeAliasElement) {
-      if (node.parent is TypeName) {
-        // no type
-      } else {
-        var type = _typeProvider.typeType;
-        node.staticType = type;
-        node.identifier.staticType = type;
-      }
-      return;
-    } else if (staticElement is MethodElement) {
-      staticType = staticElement.type;
-    } else if (staticElement is PropertyAccessorElement) {
-      staticType = _getTypeOfProperty(staticElement);
-    } else if (staticElement is ExecutableElement) {
-      staticType = staticElement.type;
-    } else if (staticElement is VariableElement) {
-      staticType = staticElement.type;
-    }
-
-    staticType =
-        _inferenceHelper.inferTearOff(node, node.identifier, staticType);
-
-    _recordStaticType(prefixedIdentifier, staticType);
-    _recordStaticType(node, staticType);
-  }
-
   /// TODO(scheglov) this is duplicate
   void _setExtensionIdentifierType(Identifier node) {
     if (node is SimpleIdentifier && node.inDeclarationContext()) {
diff --git a/pkg/analyzer/lib/src/dart/resolver/property_element_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/property_element_resolver.dart
index 48c20cd..a271757e 100644
--- a/pkg/analyzer/lib/src/dart/resolver/property_element_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/property_element_resolver.dart
@@ -329,6 +329,12 @@
 
     var targetType = target.staticType;
 
+    if (targetType is FunctionType && propertyName.name == 'call') {
+      return PropertyElementResolverResult(
+        functionTypeCallType: targetType,
+      );
+    }
+
     if (targetType.isVoid) {
       _errorReporter.reportErrorForNode(
         CompileTimeErrorCode.USE_OF_VOID_RESULT,
@@ -547,7 +553,7 @@
     @required bool hasWrite,
     @required bool forAnnotation,
   }) {
-    var lookupResult = target.scope.lookup2(identifier.name);
+    var lookupResult = target.scope.lookup(identifier.name);
 
     var readElement = _resolver.toLegacyElement(lookupResult.getter);
     var writeElement = _resolver.toLegacyElement(lookupResult.setter);
@@ -693,6 +699,7 @@
   final Element readElementRecovery;
   final Element writeElementRequested;
   final Element writeElementRecovery;
+  final FunctionType functionTypeCallType;
 
   /// If [IndexExpression] is resolved, the context type of the index.
   /// Might be `null` if `[]` or `[]=` are not resolved or invalid.
@@ -704,6 +711,7 @@
     this.writeElementRequested,
     this.writeElementRecovery,
     this.indexContextType,
+    this.functionTypeCallType,
   });
 
   Element get readElement {
diff --git a/pkg/analyzer/lib/src/dart/resolver/type_name_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/type_name_resolver.dart
index 29f8498..a880d32 100644
--- a/pkg/analyzer/lib/src/dart/resolver/type_name_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/type_name_resolver.dart
@@ -71,7 +71,7 @@
     if (typeIdentifier is PrefixedIdentifier) {
       var prefix = typeIdentifier.prefix;
       var prefixName = prefix.name;
-      var prefixElement = nameScope.lookup2(prefixName).getter;
+      var prefixElement = nameScope.lookup(prefixName).getter;
       prefix.staticElement = prefixElement;
 
       if (prefixElement == null) {
@@ -88,7 +88,7 @@
         var nameNode = typeIdentifier.identifier;
         var name = nameNode.name;
 
-        var element = prefixElement.scope.lookup2(name).getter;
+        var element = prefixElement.scope.lookup(name).getter;
         nameNode.staticElement = element;
         _resolveToElement(node, element);
         return;
@@ -109,7 +109,7 @@
         return;
       }
 
-      var element = nameScope.lookup2(name).getter;
+      var element = nameScope.lookup(name).getter;
       nameNode.staticElement = element;
       _resolveToElement(node, element);
     }
diff --git a/pkg/analyzer/lib/src/dart/scanner/scanner.dart b/pkg/analyzer/lib/src/dart/scanner/scanner.dart
index 7266b2d..48aab67 100644
--- a/pkg/analyzer/lib/src/dart/scanner/scanner.dart
+++ b/pkg/analyzer/lib/src/dart/scanner/scanner.dart
@@ -10,8 +10,10 @@
 import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/error/listener.dart';
+import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/dart/error/syntactic_errors.dart';
 import 'package:analyzer/src/dart/scanner/reader.dart';
+import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:meta/meta.dart';
 import 'package:pub_semver/pub_semver.dart';
@@ -49,7 +51,7 @@
 
   final List<int> lineStarts = <int>[];
 
-  Token firstToken;
+  /*late final*/ Token firstToken;
 
   /// A flag indicating whether the scanner should recognize the `>>>` operator
   /// and the `>>>=` operator.
@@ -63,7 +65,7 @@
   /// Use [configureFeatures] rather than this field.
   bool enableNonNullable = false;
 
-  fasta.LanguageVersionToken _languageVersion;
+  Version _overrideVersion;
 
   FeatureSet _featureSet;
 
@@ -99,7 +101,7 @@
 
   /// The language version override specified for this compilation unit using a
   /// token like '// @dart = 2.7', or `null` if no override is specified.
-  fasta.LanguageVersionToken get languageVersion => _languageVersion;
+  Version get overrideVersion => _overrideVersion;
 
   set preserveComments(bool preserveComments) {
     _preserveComments = preserveComments;
@@ -186,12 +188,30 @@
   }
 
   void _languageVersionChanged(
-      fasta.Scanner scanner, fasta.LanguageVersionToken languageVersion) {
-    if (languageVersion.major >= 0 && languageVersion.minor >= 0) {
-      _languageVersion = languageVersion;
+      fasta.Scanner scanner, fasta.LanguageVersionToken versionToken) {
+    var overrideMajor = versionToken.major;
+    var overrideMinor = versionToken.minor;
+    if (overrideMajor < 0 || overrideMinor < 0) {
+      return;
+    }
+    _overrideVersion = Version(overrideMajor, overrideMinor, 0);
+
+    var latestVersion = ExperimentStatus.currentVersion;
+    if (overrideVersion > latestVersion) {
+      _errorListener.onError(
+        AnalysisError(
+          source,
+          versionToken.offset,
+          versionToken.length,
+          HintCode.INVALID_LANGUAGE_VERSION_OVERRIDE_GREATER,
+          [latestVersion.major, latestVersion.minor],
+        ),
+      );
+      _overrideVersion = null;
+    } else {
       if (_featureSet != null) {
         _featureSet = _featureSetForOverriding.restrictToVersion(
-          Version(languageVersion.major, languageVersion.minor, 0),
+          _overrideVersion,
         );
         scanner.configuration = buildConfig(_featureSet);
       }
diff --git a/pkg/analyzer/lib/src/error/best_practices_verifier.dart b/pkg/analyzer/lib/src/error/best_practices_verifier.dart
index 7b3407fd..5ee814d 100644
--- a/pkg/analyzer/lib/src/error/best_practices_verifier.dart
+++ b/pkg/analyzer/lib/src/error/best_practices_verifier.dart
@@ -13,6 +13,7 @@
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/dart/element/type_provider.dart';
 import 'package:analyzer/error/listener.dart';
+import 'package:analyzer/src/dart/ast/extensions.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/extensions.dart';
 import 'package:analyzer/src/dart/element/inheritance_manager3.dart';
@@ -23,6 +24,7 @@
 import 'package:analyzer/src/dart/resolver/exit_detector.dart';
 import 'package:analyzer/src/dart/resolver/scope.dart';
 import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/error/deprecated_member_use_verifier.dart';
 import 'package:analyzer/src/error/must_call_super_verifier.dart';
 import 'package:analyzer/src/generated/constant.dart';
 import 'package:analyzer/src/generated/engine.dart';
@@ -45,10 +47,6 @@
   /// in the scope of a class.
   ClassElementImpl _enclosingClass;
 
-  /// A flag indicating whether a surrounding member (compilation unit or class)
-  /// is deprecated.
-  bool _inDeprecatedMember;
-
   /// A flag indicating whether a surrounding member is annotated as
   /// `@doNotStore`.
   bool _inDoNotStoreMember;
@@ -70,6 +68,8 @@
 
   final _InvalidAccessVerifier _invalidAccessVerifier;
 
+  final DeprecatedMemberUseVerifier _deprecatedVerifier;
+
   final MustCallSuperVerifier _mustCallSuperVerifier;
 
   /// The [WorkspacePackage] in which [_currentLibrary] is declared.
@@ -106,9 +106,11 @@
         _inheritanceManager = inheritanceManager,
         _invalidAccessVerifier = _InvalidAccessVerifier(
             _errorReporter, _currentLibrary, workspacePackage),
+        _deprecatedVerifier =
+            DeprecatedMemberUseVerifier(workspacePackage, _errorReporter),
         _mustCallSuperVerifier = MustCallSuperVerifier(_errorReporter),
         _workspacePackage = workspacePackage {
-    _inDeprecatedMember = _currentLibrary.hasDeprecated;
+    _deprecatedVerifier.pushInDeprecatedValue(_currentLibrary.hasDeprecated);
     _inDoNotStoreMember = _currentLibrary.hasDoNotStore;
 
     _linterContext = LinterContextImpl(
@@ -266,17 +268,6 @@
   }
 
   @override
-  void visitArgumentList(ArgumentList node) {
-    for (Expression argument in node.arguments) {
-      ParameterElement parameter = argument.staticParameterElement;
-      if (parameter?.isOptionalPositional == true) {
-        _checkForDeprecatedMemberUse(parameter, argument);
-      }
-    }
-    super.visitArgumentList(node);
-  }
-
-  @override
   void visitAsExpression(AsExpression node) {
     if (isUnnecessaryCast(node, _typeSystem)) {
       _errorReporter.reportErrorForNode(HintCode.UNNECESSARY_CAST, node);
@@ -286,17 +277,14 @@
 
   @override
   void visitAssignmentExpression(AssignmentExpression node) {
-    TokenType operatorType = node.operator.type;
-    if (operatorType != TokenType.EQ) {
-      _checkForDeprecatedMemberUse(node.staticElement, node);
-    }
+    _deprecatedVerifier.assignmentExpression(node);
     super.visitAssignmentExpression(node);
   }
 
   @override
   void visitBinaryExpression(BinaryExpression node) {
     _checkForDivisionOptimizationHint(node);
-    _checkForDeprecatedMemberUse(node.staticElement, node);
+    _deprecatedVerifier.binaryExpression(node);
     _checkForInvariantNullComparison(node);
     super.visitBinaryExpression(node);
   }
@@ -313,11 +301,8 @@
     _enclosingClass = element;
     _invalidAccessVerifier._enclosingClass = element;
 
-    bool wasInDeprecatedMember = _inDeprecatedMember;
     bool wasInDoNotStoreMember = _inDoNotStoreMember;
-    if (element != null && element.hasDeprecated) {
-      _inDeprecatedMember = true;
-    }
+    _deprecatedVerifier.pushInDeprecatedValue(element.hasDeprecated);
     if (element != null && element.hasDoNotStore) {
       _inDoNotStoreMember = true;
     }
@@ -331,7 +316,7 @@
     } finally {
       _enclosingClass = null;
       _invalidAccessVerifier._enclosingClass = null;
-      _inDeprecatedMember = wasInDeprecatedMember;
+      _deprecatedVerifier.popInDeprecated();
       _inDoNotStoreMember = wasInDoNotStoreMember;
     }
   }
@@ -361,13 +346,13 @@
 
   @override
   void visitConstructorName(ConstructorName node) {
-    _checkForDeprecatedMemberUse(node.staticElement, node);
+    _deprecatedVerifier.constructorName(node);
     super.visitConstructorName(node);
   }
 
   @override
   void visitExportDirective(ExportDirective node) {
-    _checkForDeprecatedMemberUse(node.uriElement, node);
+    _deprecatedVerifier.exportDirective(node);
     _checkForInternalExport(node);
     super.visitExportDirective(node);
   }
@@ -380,10 +365,7 @@
 
   @override
   void visitFieldDeclaration(FieldDeclaration node) {
-    bool wasInDeprecatedMember = _inDeprecatedMember;
-    if (_hasDeprecatedAnnotation(node.metadata)) {
-      _inDeprecatedMember = true;
-    }
+    _deprecatedVerifier.pushInDeprecatedMetadata(node.metadata);
 
     try {
       super.visitFieldDeclaration(node);
@@ -417,18 +399,10 @@
               [field.name, overriddenElement.enclosingElement.name]);
         }
 
-        var expressionMap =
-            _getSubExpressionsMarkedDoNotStore(field.initializer);
-        for (var entry in expressionMap.entries) {
-          _errorReporter.reportErrorForNode(
-            HintCode.ASSIGNMENT_OF_DO_NOT_STORE,
-            entry.key,
-            [entry.value.name],
-          );
-        }
+        _checkForAssignmentOfDoNotStore(field.initializer);
       }
     } finally {
-      _inDeprecatedMember = wasInDeprecatedMember;
+      _deprecatedVerifier.popInDeprecated();
     }
   }
 
@@ -440,12 +414,9 @@
 
   @override
   void visitFunctionDeclaration(FunctionDeclaration node) {
-    bool wasInDeprecatedMember = _inDeprecatedMember;
     bool wasInDoNotStoreMember = _inDoNotStoreMember;
     ExecutableElement element = node.declaredElement;
-    if (element != null && element.hasDeprecated) {
-      _inDeprecatedMember = true;
-    }
+    _deprecatedVerifier.pushInDeprecatedValue(element.hasDeprecated);
     if (element != null && element.hasDoNotStore) {
       _inDoNotStoreMember = true;
     }
@@ -461,7 +432,7 @@
           body: node.functionExpression.body);
       super.visitFunctionDeclaration(node);
     } finally {
-      _inDeprecatedMember = wasInDeprecatedMember;
+      _deprecatedVerifier.popInDeprecated();
       _inDoNotStoreMember = wasInDoNotStoreMember;
     }
   }
@@ -487,12 +458,7 @@
 
   @override
   void visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
-    var callElement = node.staticElement;
-    if (callElement is MethodElement &&
-        callElement.name == FunctionElement.CALL_METHOD_NAME) {
-      _checkForDeprecatedMemberUse(callElement, node);
-    }
-
+    _deprecatedVerifier.functionExpressionInvocation(node);
     super.visitFunctionExpressionInvocation(node);
   }
 
@@ -532,7 +498,7 @@
 
   @override
   void visitImportDirective(ImportDirective node) {
-    _checkForDeprecatedMemberUse(node.uriElement, node);
+    _deprecatedVerifier.importDirective(node);
     ImportElement importElement = node.element;
     if (importElement != null && importElement.isDeferred) {
       _checkForLoadLibraryFunction(node, importElement);
@@ -543,12 +509,13 @@
 
   @override
   void visitIndexExpression(IndexExpression node) {
-    _checkForDeprecatedMemberUse(node.staticElement, node);
+    _deprecatedVerifier.indexExpression(node);
     super.visitIndexExpression(node);
   }
 
   @override
   void visitInstanceCreationExpression(InstanceCreationExpression node) {
+    _deprecatedVerifier.instanceCreationExpression(node);
     _checkForLiteralConstructorUse(node);
     super.visitInstanceCreationExpression(node);
   }
@@ -561,7 +528,6 @@
 
   @override
   void visitMethodDeclaration(MethodDeclaration node) {
-    bool wasInDeprecatedMember = _inDeprecatedMember;
     bool wasInDoNotStoreMember = _inDoNotStoreMember;
     ExecutableElement element = node.declaredElement;
     Element enclosingElement = element?.enclosingElement;
@@ -583,9 +549,7 @@
                 forSuper: true)
             : null;
 
-    if (element != null && element.hasDeprecated) {
-      _inDeprecatedMember = true;
-    }
+    _deprecatedVerifier.pushInDeprecatedValue(element.hasDeprecated);
     if (element != null && element.hasDoNotStore) {
       _inDoNotStoreMember = true;
     }
@@ -615,26 +579,25 @@
 
       super.visitMethodDeclaration(node);
     } finally {
-      _inDeprecatedMember = wasInDeprecatedMember;
+      _deprecatedVerifier.popInDeprecated();
       _inDoNotStoreMember = wasInDoNotStoreMember;
     }
   }
 
   @override
   void visitMethodInvocation(MethodInvocation node) {
+    _deprecatedVerifier.methodInvocation(node);
     _checkForNullAwareHints(node, node.operator);
     super.visitMethodInvocation(node);
   }
 
   @override
   void visitMixinDeclaration(MixinDeclaration node) {
-    _enclosingClass = node.declaredElement;
+    var element = node.declaredElement;
+    _enclosingClass = element;
     _invalidAccessVerifier._enclosingClass = _enclosingClass;
 
-    bool wasInDeprecatedMember = _inDeprecatedMember;
-    if (_hasDeprecatedAnnotation(node.metadata)) {
-      _inDeprecatedMember = true;
-    }
+    _deprecatedVerifier.pushInDeprecatedValue(element.hasDeprecated);
 
     try {
       _checkForImmutable(node);
@@ -643,19 +606,23 @@
     } finally {
       _enclosingClass = null;
       _invalidAccessVerifier._enclosingClass = null;
-      _inDeprecatedMember = wasInDeprecatedMember;
+      _deprecatedVerifier.popInDeprecated();
     }
   }
 
   @override
   void visitPostfixExpression(PostfixExpression node) {
-    _checkForDeprecatedMemberUse(node.staticElement, node);
+    _deprecatedVerifier.postfixExpression(node);
+    if (node.operator.type == TokenType.BANG &&
+        node.operand.staticType.isDartCoreNull) {
+      _errorReporter.reportErrorForNode(HintCode.NULL_CHECK_ALWAYS_FAILS, node);
+    }
     super.visitPostfixExpression(node);
   }
 
   @override
   void visitPrefixExpression(PrefixExpression node) {
-    _checkForDeprecatedMemberUse(node.staticElement, node);
+    _deprecatedVerifier.prefixExpression(node);
     super.visitPrefixExpression(node);
   }
 
@@ -668,7 +635,7 @@
   @override
   void visitRedirectingConstructorInvocation(
       RedirectingConstructorInvocation node) {
-    _checkForDeprecatedMemberUse(node.staticElement, node);
+    _deprecatedVerifier.redirectingConstructorInvocation(node);
     super.visitRedirectingConstructorInvocation(node);
   }
 
@@ -686,29 +653,30 @@
 
   @override
   void visitSimpleIdentifier(SimpleIdentifier node) {
-    _checkForDeprecatedMemberUseAtIdentifier(node);
+    _deprecatedVerifier.simpleIdentifier(node);
     _invalidAccessVerifier.verify(node);
     super.visitSimpleIdentifier(node);
   }
 
   @override
   void visitSuperConstructorInvocation(SuperConstructorInvocation node) {
-    _checkForDeprecatedMemberUse(node.staticElement, node);
+    _deprecatedVerifier.superConstructorInvocation(node);
     _invalidAccessVerifier.verifySuperConstructorInvocation(node);
     super.visitSuperConstructorInvocation(node);
   }
 
   @override
   void visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
-    bool wasInDeprecatedMember = _inDeprecatedMember;
-    if (_hasDeprecatedAnnotation(node.metadata)) {
-      _inDeprecatedMember = true;
+    _deprecatedVerifier.pushInDeprecatedMetadata(node.metadata);
+
+    for (var decl in node.variables.variables) {
+      _checkForAssignmentOfDoNotStore(decl.initializer);
     }
 
     try {
       super.visitTopLevelVariableDeclaration(node);
     } finally {
-      _inDeprecatedMember = wasInDeprecatedMember;
+      _deprecatedVerifier.popInDeprecated();
     }
   }
 
@@ -797,112 +765,15 @@
     return false;
   }
 
-  /// Given some [element], look at the associated metadata and report the use
-  /// of the member if it is declared as deprecated. If a diagnostic is reported
-  /// it should be reported at the given [node].
-  void _checkForDeprecatedMemberUse(Element element, AstNode node) {
-    bool isDeprecated(Element element) {
-      if (element is PropertyAccessorElement && element.isSynthetic) {
-        // TODO(brianwilkerson) Why isn't this the implementation for PropertyAccessorElement?
-        Element variable = element.variable;
-        if (variable == null) {
-          return false;
-        }
-        return variable.hasDeprecated;
-      }
-      return element.hasDeprecated;
+  void _checkForAssignmentOfDoNotStore(Expression expression) {
+    var expressionMap = _getSubExpressionsMarkedDoNotStore(expression);
+    for (var entry in expressionMap.entries) {
+      _errorReporter.reportErrorForNode(
+        HintCode.ASSIGNMENT_OF_DO_NOT_STORE,
+        entry.key,
+        [entry.value.name],
+      );
     }
-
-    bool isLocalParameter(Element element, AstNode node) {
-      if (element is ParameterElement) {
-        ExecutableElement definingFunction = element.enclosingElement;
-        FunctionBody body = node.thisOrAncestorOfType<FunctionBody>();
-        while (body != null) {
-          ExecutableElement enclosingFunction;
-          AstNode parent = body.parent;
-          if (parent is ConstructorDeclaration) {
-            enclosingFunction = parent.declaredElement;
-          } else if (parent is FunctionExpression) {
-            enclosingFunction = parent.declaredElement;
-          } else if (parent is MethodDeclaration) {
-            enclosingFunction = parent.declaredElement;
-          }
-          if (enclosingFunction == definingFunction) {
-            return true;
-          }
-          body = parent?.thisOrAncestorOfType<FunctionBody>();
-        }
-      }
-      return false;
-    }
-
-    if (!_inDeprecatedMember &&
-        element != null &&
-        isDeprecated(element) &&
-        !isLocalParameter(element, node)) {
-      String displayName = element.displayName;
-      if (element is ConstructorElement) {
-        // TODO(jwren) We should modify ConstructorElement.getDisplayName(),
-        // or have the logic centralized elsewhere, instead of doing this logic
-        // here.
-        displayName = element.enclosingElement.displayName;
-        if (element.displayName.isNotEmpty) {
-          displayName = "$displayName.${element.displayName}";
-        }
-      } else if (element is LibraryElement) {
-        displayName = element.definingCompilationUnit.source.uri.toString();
-      } else if (node is MethodInvocation &&
-          displayName == FunctionElement.CALL_METHOD_NAME) {
-        var invokeType = node.staticInvokeType as InterfaceType;
-        if (invokeType is InterfaceType) {
-          var invokeClass = invokeType.element;
-          displayName = "${invokeClass.name}.${element.displayName}";
-        }
-      }
-      LibraryElement library =
-          element is LibraryElement ? element : element.library;
-      String message = _deprecatedMessage(element);
-      if (message == null || message.isEmpty) {
-        HintCode hintCode = _isLibraryInWorkspacePackage(library)
-            ? HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE
-            : HintCode.DEPRECATED_MEMBER_USE;
-        _errorReporter.reportErrorForNode(hintCode, node, [displayName]);
-      } else {
-        HintCode hintCode = _isLibraryInWorkspacePackage(library)
-            ? HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE_WITH_MESSAGE
-            : HintCode.DEPRECATED_MEMBER_USE_WITH_MESSAGE;
-        _errorReporter
-            .reportErrorForNode(hintCode, node, [displayName, message]);
-      }
-    }
-  }
-
-  /// For [SimpleIdentifier]s, only call [checkForDeprecatedMemberUse]
-  /// if the node is not in a declaration context.
-  ///
-  /// Also, if the identifier is a constructor name in a constructor invocation,
-  /// then calls to the deprecated constructor will be caught by
-  /// [visitInstanceCreationExpression] and
-  /// [visitSuperConstructorInvocation], and can be ignored by
-  /// this visit method.
-  ///
-  /// @param identifier some simple identifier to check for deprecated use of
-  /// @return `true` if and only if a hint code is generated on the passed node
-  /// See [HintCode.DEPRECATED_MEMBER_USE].
-  void _checkForDeprecatedMemberUseAtIdentifier(SimpleIdentifier identifier) {
-    if (identifier.inDeclarationContext()) {
-      return;
-    }
-    AstNode parent = identifier.parent;
-    if ((parent is ConstructorName && identical(identifier, parent.name)) ||
-        (parent is ConstructorDeclaration &&
-            identical(identifier, parent.returnType)) ||
-        (parent is SuperConstructorInvocation &&
-            identical(identifier, parent.constructorName)) ||
-        parent is HideCombinator) {
-      return;
-    }
-    _checkForDeprecatedMemberUse(identifier.staticElement, identifier);
   }
 
   /// Check for the passed binary expression for the
@@ -1080,7 +951,7 @@
         ];
         for (var type in signatureTypes) {
           var typeElement = type?.element?.enclosingElement;
-          if (typeElement is GenericTypeAliasElement &&
+          if (typeElement is FunctionTypeAliasElement &&
               typeElement.hasInternal) {
             _errorReporter.reportErrorForNode(
                 HintCode.INVALID_EXPORT_OF_INTERNAL_ELEMENT_INDIRECTLY,
@@ -1656,10 +1527,12 @@
   Set<TargetKind> _targetKindsFor(ElementAnnotation annotation) {
     var element = annotation.element;
     ClassElement classElement;
-    if (element is VariableElement) {
-      var type = element.type;
-      if (type is InterfaceType) {
-        classElement = type.element;
+    if (element is PropertyAccessorElement) {
+      if (element.isGetter) {
+        var type = element.returnType;
+        if (type is InterfaceType) {
+          classElement = type.element;
+        }
       }
     } else if (element is ConstructorElement) {
       classElement = element.enclosingElement;
@@ -1737,35 +1610,6 @@
     return true;
   }
 
-  /// Return the message in the deprecated annotation on the given [element], or
-  /// `null` if the element doesn't have a deprecated annotation or if the
-  /// annotation does not have a message.
-  static String _deprecatedMessage(Element element) {
-    // Implicit getters/setters.
-    if (element.isSynthetic && element is PropertyAccessorElement) {
-      element = (element as PropertyAccessorElement).variable;
-    }
-    ElementAnnotationImpl annotation = element.metadata.firstWhere(
-      (e) => e.isDeprecated,
-      orElse: () => null,
-    );
-    if (annotation == null || annotation.element is PropertyAccessorElement) {
-      return null;
-    }
-    DartObject constantValue = annotation.computeConstantValue();
-    return constantValue?.getField('message')?.toStringValue() ??
-        constantValue?.getField('expires')?.toStringValue();
-  }
-
-  static bool _hasDeprecatedAnnotation(List<Annotation> annotations) {
-    for (var i = 0; i < annotations.length; i++) {
-      if (annotations[i].elementAnnotation.isDeprecated) {
-        return true;
-      }
-    }
-    return false;
-  }
-
   static bool _hasNonVirtualAnnotation(ExecutableElement element) {
     if (element == null) {
       return false;
@@ -1798,9 +1642,12 @@
 
 class _InvalidAccessVerifier {
   static final _templateExtension = '.template';
-  static final _testDir = '${path.separator}test${path.separator}';
-  static final _testDriverDir = '${path.separator}test_driver${path.separator}';
-  static final _testingDir = '${path.separator}testing${path.separator}';
+  static final _testDirectories = [
+    '${path.separator}test${path.separator}',
+    '${path.separator}integration_test${path.separator}',
+    '${path.separator}test_driver${path.separator}',
+    '${path.separator}testing${path.separator}',
+  ];
 
   final ErrorReporter _errorReporter;
   final LibraryElement _library;
@@ -1815,9 +1662,7 @@
       this._errorReporter, this._library, this._workspacePackage) {
     var path = _library.source.fullName;
     _inTemplateSource = path.contains(_templateExtension);
-    _inTestDirectory = path.contains(_testDir) ||
-        path.contains(_testDriverDir) ||
-        path.contains(_testingDir);
+    _inTestDirectory = _testDirectories.any(path.contains);
   }
 
   /// Produces a hint if [identifier] is accessed from an invalid location.
@@ -1848,7 +1693,7 @@
 
     var element = grandparent is ConstructorName
         ? grandparent.staticElement
-        : identifier.staticElement;
+        : identifier.writeOrReadElement;
 
     if (element == null || _inCurrentLibrary(element)) {
       return;
@@ -2007,7 +1852,6 @@
       return true;
     }
     if (element is PropertyAccessorElement &&
-        element.enclosingElement is ClassElement &&
         element.variable.hasVisibleForTemplate) {
       return true;
     }
@@ -2022,7 +1866,6 @@
       return true;
     }
     if (element is PropertyAccessorElement &&
-        element.enclosingElement is ClassElement &&
         element.variable.hasVisibleForTesting) {
       return true;
     }
diff --git a/pkg/analyzer/lib/src/error/codes.dart b/pkg/analyzer/lib/src/error/codes.dart
index 1832823..ed2da59 100644
--- a/pkg/analyzer/lib/src/error/codes.dart
+++ b/pkg/analyzer/lib/src/error/codes.dart
@@ -25,6 +25,53 @@
   /**
    * No parameters.
    */
+  // #### Description
+  //
+  // The analyzer produces this diagnostic when a field that has the `abstract`
+  // modifier also has an initializer.
+  //
+  // #### Example
+  //
+  // The following code produces this diagnostic because `f` is marked as
+  // `abstract` and has an initializer:
+  //
+  // ```dart
+  // %experiments=non-nullable
+  // abstract class C {
+  //   abstract int [!f!] = 0;
+  // }
+  // ```
+  //
+  // The following code produces this diagnostic because `f` is marked as
+  // `abstract` and there's an initializer in the constructor:
+  //
+  // ```dart
+  // %experiments=non-nullable
+  // abstract class C {
+  //   abstract int f;
+  //
+  //   C() : [!f!] = 0;
+  // }
+  // ```
+  //
+  // #### Common fixes
+  //
+  // If the field must be abstract, then remove the initializer:
+  //
+  // ```dart
+  // %experiments=non-nullable
+  // abstract class C {
+  //   abstract int f;
+  // }
+  // ```
+  //
+  // If the field isn't required to be abstract, then remove the keyword:
+  //
+  // ```dart
+  // abstract class C {
+  //   int f = 0;
+  // }
+  // ```
   static const CompileTimeErrorCode ABSTRACT_FIELD_CONSTRUCTOR_INITIALIZER =
       CompileTimeErrorCodeWithUniqueName(
           'ABSTRACT_FIELD_INITIALIZER',
@@ -80,26 +127,56 @@
           hasPublishedDocs: true);
 
   /**
-   * Enum proposal: It is also a compile-time error to explicitly instantiate an
-   * enum via 'new' or 'const' or to access its private fields.
-   */
-  static const CompileTimeErrorCode ACCESS_PRIVATE_ENUM_FIELD =
-      CompileTimeErrorCode(
-          'ACCESS_PRIVATE_ENUM_FIELD',
-          "The private fields of an enum can't be accessed, even within the "
-              "same library.");
-
-  /**
-   * 14.2 Exports: It is a compile-time error if a name <i>N</i> is re-exported
-   * by a library <i>L</i> and <i>N</i> is introduced into the export namespace
-   * of <i>L</i> by more than one export, unless each all exports refer to same
-   * declaration for the name N.
-   *
    * Parameters:
    * 0: the name of the ambiguous element
    * 1: the name of the first library in which the type is found
    * 2: the name of the second library in which the type is found
    */
+  // #### Description
+  //
+  // The analyzer produces this diagnostic when two or more export directives
+  // cause the same name to be exported from multiple libraries.
+  //
+  // #### Example
+  //
+  // Given a file named `a.dart` containing
+  //
+  // ```dart
+  // %uri="lib/a.dart"
+  // class C {}
+  // ```
+  //
+  // And a file named `b.dart` containing
+  //
+  // ```dart
+  // %uri="lib/b.dart"
+  // class C {}
+  // ```
+  //
+  // The following code produces this diagnostic because the name `C` is being
+  // exported from both `a.dart` and `b.dart`:
+  //
+  // ```dart
+  // export 'a.dart';
+  // export [!'b.dart'!];
+  // ```
+  //
+  // #### Common fixes
+  //
+  // If none of the names in one of the libraries needs to be exported, then
+  // remove the unnecessary export directives:
+  //
+  // ```dart
+  // export 'a.dart';
+  // ```
+  //
+  // If all of the export directives are needed, then hide the name in all
+  // except one of the directives:
+  //
+  // ```dart
+  // export 'a.dart';
+  // export 'b.dart' hide C;
+  // ```
   static const CompileTimeErrorCode AMBIGUOUS_EXPORT = CompileTimeErrorCode(
       'AMBIGUOUS_EXPORT',
       "The name '{0}' is defined in the libraries '{1}' and '{2}'.",
@@ -482,17 +559,103 @@
               "'{1}'.",
           hasPublishedDocs: true);
 
+  /**
+   * No parameters.
+   */
+  // #### Description
+  //
+  // The analyzer produces this diagnostic when a redirecting constructor (a
+  // constructor that redirects to another constructor in the same class) has an
+  // assert in the initializer list.
+  //
+  // #### Example
+  //
+  // The following code produces this diagnostic because the unnamed constructor
+  // is a redirecting constructor and also has an assert in the initializer
+  // list:
+  //
+  // ```dart
+  // class C {
+  //   C(int x) : [!assert(x > 0)!], this.name();
+  //   C.name() {}
+  // }
+  // ```
+  //
+  // #### Common fixes
+  //
+  // If the assert isn't needed, then remove it:
+  //
+  // ```dart
+  // class C {
+  //   C(int x) : this.name();
+  //   C.name() {}
+  // }
+  // ```
+  //
+  // If the assert is needed, then convert the constructor into a factory
+  // constructor:
+  //
+  // ```dart
+  // class C {
+  //   factory C(int x) {
+  //     assert(x > 0);
+  //     return C.name();
+  //   }
+  //   C.name() {}
+  // }
+  // ```
   static const CompileTimeErrorCode ASSERT_IN_REDIRECTING_CONSTRUCTOR =
       CompileTimeErrorCode('ASSERT_IN_REDIRECTING_CONSTRUCTOR',
           "A redirecting constructor can't have an 'assert' initializer.");
 
   /**
-   * 5 Variables: Attempting to assign to a final variable elsewhere will cause
-   * a NoSuchMethodError to be thrown, because no setter is defined for it. The
-   * assignment will also give rise to a static warning for the same reason.
-   *
-   * A constant variable is always implicitly final.
+   * No parameters.
    */
+  // #### Description
+  //
+  // The analyzer produces this diagnostic when it finds an assignment to a
+  // top-level variable, a static field, or a local variable that has the
+  // `const` modifier. The value of a compile-time constant can't be changed at
+  // runtime.
+  //
+  // #### Example
+  //
+  // The following code produces this diagnostic because `c` is being assigned a
+  // value even though it has the `const` modifier:
+  //
+  // ```dart
+  // const c = 0;
+  //
+  // void f() {
+  //   [!c!] = 1;
+  //   print(c);
+  // }
+  // ```
+  //
+  // #### Common fixes
+  //
+  // If the variable must be assignable, then remove the `const` modifier:
+  //
+  // ```dart
+  // var c = 0;
+  //
+  // void f() {
+  //   c = 1;
+  //   print(c);
+  // }
+  // ```
+  //
+  // If the constant shouldn't be changed, then either remove the assignment or
+  // use a local variable in place of references to the constant:
+  //
+  // ```dart
+  // const c = 0;
+  //
+  // void f() {
+  //   var v = 1;
+  //   print(v);
+  // }
+  // ```
   static const CompileTimeErrorCode ASSIGNMENT_TO_CONST = CompileTimeErrorCode(
       'ASSIGNMENT_TO_CONST', "Constant variables can't be assigned a value.",
       correction: "Try removing the assignment, or "
@@ -720,7 +883,7 @@
   // ```dart
   // %experiments=non-nullable
   // Future<int> f() async {
-  //   late v = [!await!] 42;
+  //   late var v = [!await!] 42;
   //   return v;
   // }
   // ```
@@ -732,7 +895,7 @@
   // ```dart
   // %experiments=non-nullable
   // Future<int> f() async {
-  //   late v = 42;
+  //   late var v = 42;
   //   return v;
   // }
   // ```
@@ -1685,15 +1848,6 @@
           hasPublishedDocs: true);
 
   /**
-   * 6.2 Formal Parameters: It is a compile-time error if a formal parameter is
-   * declared as a constant variable.
-   */
-  static const CompileTimeErrorCode CONST_FORMAL_PARAMETER =
-      CompileTimeErrorCode(
-          'CONST_FORMAL_PARAMETER', "Parameters can't be const.",
-          correction: "Try removing the 'const' keyword.");
-
-  /**
    * No parameters.
    */
   // #### Description
@@ -2020,9 +2174,51 @@
           isUnresolvedIdentifier: true);
 
   /**
-   * 16.12.2 Const: If <i>T</i> is a parameterized type, it is a compile-time
-   * error if <i>T</i> includes a type variable among its type arguments.
+   * No parameters.
    */
+  // #### Description
+  //
+  // The analyzer produces this diagnostic when a type parameter is used as a
+  // type argument in a `const` invocation of a constructor. This isn't allowed
+  // because the value of the type parameter (the actual type that will be used
+  // at runtime) can't be known at compile time.
+  //
+  // #### Example
+  //
+  // The following code produces this diagnostic because the type parameter `T`
+  // is being used as a type argument when creating a constant:
+  //
+  // ```dart
+  // class C<T> {
+  //   const C();
+  // }
+  //
+  // C<T> newC<T>() => const C<[!T!]>();
+  // ```
+  //
+  // #### Common fixes
+  //
+  // If the type that will be used for the type parameter can be known at
+  // compile time, then remove the use of the type parameter:
+  //
+  // ```dart
+  // class C<T> {
+  //   const C();
+  // }
+  //
+  // C<int> newC() => const C<int>();
+  // ```
+  //
+  // If the type that will be used for the type parameter can't be known until
+  // runtime, then remove the keyword `const`:
+  //
+  // ```dart
+  // class C<T> {
+  //   const C();
+  // }
+  //
+  // C<T> newC<T>() => C<T>();
+  // ```
   static const CompileTimeErrorCode CONST_WITH_TYPE_PARAMETERS =
       CompileTimeErrorCode('CONST_WITH_TYPE_PARAMETERS',
           "A constant creation can't use a type parameter as a type argument.",
@@ -2398,17 +2594,47 @@
           hasPublishedDocs: true);
 
   /**
-   * 18.3 Parts: It's a compile-time error if the same library contains two part
-   * directives with the same URI.
-   *
    * Parameters:
    * 0: the URI of the duplicate part
    */
+  // #### Description
+  //
+  // The analyzer produces this diagnostic when a single file is referenced in
+  // multiple part directives.
+  //
+  // #### Example
+  //
+  // Given a file named `part.dart` containing
+  //
+  // ```dart
+  // %uri="lib/part.dart"
+  // part of lib;
+  // ```
+  //
+  // The following code produces this diagnostic because the file `part.dart` is
+  // included multiple times:
+  //
+  // ```dart
+  // library lib;
+  //
+  // part 'part.dart';
+  // part [!'part.dart'!];
+  // ```
+  //
+  // #### Common fixes
+  //
+  // Remove all except the first of the duplicated part directives:
+  //
+  // ```dart
+  // library lib;
+  //
+  // part 'part.dart';
+  // ```
   static const CompileTimeErrorCode DUPLICATE_PART = CompileTimeErrorCode(
       'DUPLICATE_PART',
-      "The library already contains a part with the uri '{0}'.",
+      "The library already contains a part with the URI '{0}'.",
       correction:
-          "Try removing all but one of the duplicated part directives.");
+          "Try removing all except one of the duplicated part directives.");
 
   static const CompileTimeErrorCode ENUM_CONSTANT_SAME_NAME_AS_ENCLOSING =
       CompileTimeErrorCode('ENUM_CONSTANT_SAME_NAME_AS_ENCLOSING',
@@ -2495,42 +2721,93 @@
           hasPublishedDocs: true);
 
   /**
-   * 12.7 Lists: A fresh instance (7.6.1) <i>a</i>, of size <i>n</i>, whose
-   * class implements the built-in class <i>List&lt;E></i> is allocated.
-   *
    * Parameters:
    * 0: the number of provided type arguments
    */
+  // #### Description
+  //
+  // The analyzer produces this diagnostic when a list literal has more than one
+  // type argument.
+  //
+  // #### Example
+  //
+  // The following code produces this diagnostic because the list literal has
+  // two type arguments when it can have at most one:
+  //
+  // ```dart
+  // var l = [!<int, int>!][];
+  // ```
+  //
+  // #### Common fixes
+  //
+  // Remove all except one of the type arguments:
+  //
+  // ```dart
+  // var l = <int>[];
+  // ```
   static const CompileTimeErrorCode EXPECTED_ONE_LIST_TYPE_ARGUMENTS =
-      CompileTimeErrorCode(
-          'EXPECTED_ONE_LIST_TYPE_ARGUMENTS',
-          "List literals require exactly one type argument or none, "
-              "but {0} found.",
+      CompileTimeErrorCode('EXPECTED_ONE_LIST_TYPE_ARGUMENTS',
+          "List literals require one type argument or none, but {0} found.",
           correction: "Try adjusting the number of type arguments.");
 
   /**
    * Parameters:
    * 0: the number of provided type arguments
    */
+  // #### Description
+  //
+  // The analyzer produces this diagnostic when a set literal has more than one
+  // type argument.
+  //
+  // #### Example
+  //
+  // The following code produces this diagnostic because the set literal has
+  // three type arguments when it can have at most one:
+  //
+  // ```dart
+  // var s = [!<int, String, int>!]{0, 'a', 1};
+  // ```
+  //
+  // #### Common fixes
+  //
+  // Remove all except one of the type arguments:
+  //
+  // ```dart
+  // var s = <int>{0, 1};
+  // ```
   static const CompileTimeErrorCode EXPECTED_ONE_SET_TYPE_ARGUMENTS =
-      CompileTimeErrorCode(
-          'EXPECTED_ONE_SET_TYPE_ARGUMENTS',
-          "Set literals require exactly one type argument or none, "
-              "but {0} found.",
+      CompileTimeErrorCode('EXPECTED_ONE_SET_TYPE_ARGUMENTS',
+          "Set literals require one type argument or none, but {0} were found.",
           correction: "Try adjusting the number of type arguments.");
 
   /**
-   * 12.8 Maps: A fresh instance (7.6.1) <i>m</i>, of size <i>n</i>, whose class
-   * implements the built-in class <i>Map&lt;K, V></i> is allocated.
-   *
    * Parameters:
    * 0: the number of provided type arguments
    */
+  // #### Description
+  //
+  // The analyzer produces this diagnostic when a map literal has either one or
+  // more than two type arguments.
+  //
+  // #### Example
+  //
+  // The following code produces this diagnostic because the map literal has
+  // three type arguments when it can have either two or zero:
+  //
+  // ```dart
+  // var m = [!<int, String, int>!]{};
+  // ```
+  //
+  // #### Common fixes
+  //
+  // Remove all except two of the type arguments:
+  //
+  // ```dart
+  // var m = <int, String>{};
+  // ```
   static const CompileTimeErrorCode EXPECTED_TWO_MAP_TYPE_ARGUMENTS =
-      CompileTimeErrorCode(
-          'EXPECTED_TWO_MAP_TYPE_ARGUMENTS',
-          "Map literals require exactly two type arguments or none, "
-              "but {0} found.",
+      CompileTimeErrorCode('EXPECTED_TWO_MAP_TYPE_ARGUMENTS',
+          "Map literals require two type arguments or none, but {0} found.",
           correction: "Try adjusting the number of type arguments.");
 
   /**
@@ -2602,12 +2879,36 @@
       hasPublishedDocs: true);
 
   /**
-   * 14.2 Exports: It is a compile-time error if the compilation unit found at
-   * the specified URI is not a library declaration.
-   *
    * Parameters:
    * 0: the uri pointing to a non-library declaration
    */
+  // #### Description
+  //
+  // The analyzer produces this diagnostic when an export directive references a
+  // part rather than a library.
+  //
+  // #### Example
+  //
+  // Given a file named `part.dart` containing
+  //
+  // ```dart
+  // %uri="lib/part.dart"
+  // part of lib;
+  // ```
+  //
+  // The following code produces this diagnostic because the file `part.dart` is
+  // a part, and only libraries can be exported:
+  //
+  // ```dart
+  // library lib;
+  //
+  // export [!'part.dart'!];
+  // ```
+  //
+  // #### Common fixes
+  //
+  // Either remove the export directive, or change the URI to be the URI of the
+  // library containing the part.
   static const CompileTimeErrorCode EXPORT_OF_NON_LIBRARY =
       CompileTimeErrorCode('EXPORT_OF_NON_LIBRARY',
           "The exported library '{0}' can't have a part-of directive.",
@@ -3762,9 +4063,38 @@
           correction: "Try making the deferred import non-deferred.");
 
   /**
-   * It is a compile-time error if the declared return type of a function marked
-   * 'async*' is not a supertype of 'Stream<T>' for some type 'T'.
+   * No parameters.
    */
+  // #### Description
+  //
+  // The analyzer produces this diagnostic when the body of a function has the
+  // `async*` modifier even though the return type of the function isn't either
+  // `Stream` or a supertype of `Stream`.
+  //
+  // #### Example
+  //
+  // The following code produces this diagnostic because the body of the
+  // function `f` has the 'async*' modifier even though the return type `int`
+  // isn't a supertype of `Stream`:
+  //
+  // ```dart
+  // [!int!] f() async* {}
+  // ```
+  //
+  // #### Common fixes
+  //
+  // If the function should be asynchronous, then change the return type to be
+  // either `Stream` or a supertype of `Stream`:
+  //
+  // ```dart
+  // Stream<int> f() async* {}
+  // ```
+  //
+  // If the function should be synchronous, then remove the `async*` modifier:
+  //
+  // ```dart
+  // int f() => 0;
+  // ```
   static const CompileTimeErrorCode ILLEGAL_ASYNC_GENERATOR_RETURN_TYPE =
       CompileTimeErrorCode(
           'ILLEGAL_ASYNC_GENERATOR_RETURN_TYPE',
@@ -3808,9 +4138,7 @@
   // If the function should be synchronous, then remove the `async` modifier:
   //
   // ```dart
-  // int f() {
-  //   return 0;
-  // }
+  // int f() => 0;
   // ```
   static const CompileTimeErrorCode ILLEGAL_ASYNC_RETURN_TYPE =
       CompileTimeErrorCode(
@@ -3822,9 +4150,39 @@
           hasPublishedDocs: true);
 
   /**
-   * It is a compile-time error if the declared return type of a function marked
-   * 'sync*' is not a supertype of 'Iterable<T>' for some type 'T'.
+   * No parameters.
    */
+  // #### Description
+  //
+  // The analyzer produces this diagnostic when the body of a function has the
+  // `sync*` modifier even though the return type of the function isn't either
+  // `Iterable` or a supertype of `Iterable`.
+  //
+  // #### Example
+  //
+  // The following code produces this diagnostic because the body of the
+  // function `f` has the 'sync*' modifier even though the return type `int`
+  // isn't a supertype of `Iterable`:
+  //
+  // ```dart
+  // [!int!] f() sync* {}
+  // ```
+  //
+  // #### Common fixes
+  //
+  // If the function should return an iterable, then change the return type to
+  // be either `Iterable` or a supertype of `Iterable`:
+  //
+  // ```dart
+  // Iterable<int> f() sync* {}
+  // ```
+  //
+  // If the function should return a single value, then remove the `sync*`
+  // modifier:
+  //
+  // ```dart
+  // int f() => 0;
+  // ```
   static const CompileTimeErrorCode ILLEGAL_SYNC_GENERATOR_RETURN_TYPE =
       CompileTimeErrorCode(
           'ILLEGAL_SYNC_GENERATOR_RETURN_TYPE',
@@ -3934,16 +4292,48 @@
       hasPublishedDocs: true);
 
   /**
-   * 7.10 Superinterfaces: It is a compile-time error if the superclass of a
-   * class <i>C</i> appears in the implements clause of <i>C</i>.
-   *
    * Parameters:
    * 0: the name of the class that appears in both "extends" and "implements"
    *    clauses
    */
+  // #### Description
+  //
+  // The analyzer produces this diagnostic when one class is listed in both the
+  // `extends` and `implements` clauses of another class.
+  //
+  // #### Example
+  //
+  // The following code produces this diagnostic because the class `A` is used
+  // in both the `extends` and `implements` clauses for the class `B`:
+  //
+  // ```dart
+  // class A {}
+  //
+  // class B extends A implements [!A!] {}
+  // ```
+  //
+  // #### Common fixes
+  //
+  // If you want to inherit the implementation from the class, then remove the
+  // class from the `implements` clause:
+  //
+  // ```dart
+  // class A {}
+  //
+  // class B extends A {}
+  // ```
+  //
+  // If you don't want to inherit the implementation from the class, then remove
+  // the `extends` clause:
+  //
+  // ```dart
+  // class A {}
+  //
+  // class B implements A {}
+  // ```
   static const CompileTimeErrorCode IMPLEMENTS_SUPER_CLASS =
       CompileTimeErrorCode('IMPLEMENTS_SUPER_CLASS',
-          "'{0}' can't be used in both 'extends' and 'implements' clauses.",
+          "'{0}' can't be used in both the 'extends' and 'implements' clauses.",
           correction: "Try removing one of the occurrences.");
 
   /**
@@ -4519,11 +4909,37 @@
               "Try using the BigInt class, or switch to the closest valid "
               "double: {1}");
 
+  /**
+   * No parameters.
+   */
+  // #### Description
+  //
+  // The analyzer produces this diagnostic when an integer literal has a value
+  // that is too large (positive) or too small (negative) to be represented in a
+  // 64-bit word.
+  //
+  // #### Example
+  //
+  // The following code produces this diagnostic because the value can't be
+  // represented in 64 bits:
+  //
+  // ```dart
+  // var x = [!9223372036854775810!];
+  // ```
+  //
+  // #### Common fixes
+  //
+  // If you need to represent the current value, then wrap it in an instance of
+  // the class `BigInt`:
+  //
+  // ```dart
+  // var x = BigInt.parse('9223372036854775810');
+  // ```
   static const CompileTimeErrorCode INTEGER_LITERAL_OUT_OF_RANGE =
       CompileTimeErrorCode('INTEGER_LITERAL_OUT_OF_RANGE',
           "The integer literal {0} can't be represented in 64 bits.",
           correction:
-              "Try using the BigInt class if you need an integer larger than "
+              "Try using the 'BigInt' class if you need an integer larger than "
               "9,223,372,036,854,775,807 or less than "
               "-9,223,372,036,854,775,808.");
 
@@ -5037,19 +5453,100 @@
           "Invalid reference to 'this' expression.",
           hasPublishedDocs: true);
 
+  /**
+   * No parameters.
+   */
+  // #### Description
+  //
+  // The analyzer produces this diagnostic when the initializer list of a
+  // constructor contains an invocation of a constructor in the superclass, but
+  // the invocation isn't the last item in the initializer list.
+  //
+  // #### Example
+  //
+  // The following code produces this diagnostic because the invocation of the
+  // superclass' constructor isn't the last item in the initializer list:
+  //
+  // ```dart
+  // class A {
+  //   A(int x);
+  // }
+  //
+  // class B extends A {
+  //   B(int x) : [!super!](x), assert(x >= 0);
+  // }
+  // ```
+  //
+  // #### Common fixes
+  //
+  // Move the invocation of the superclass' constructor to the end of the
+  // initializer list:
+  //
+  // ```dart
+  // class A {
+  //   A(int x);
+  // }
+  //
+  // class B extends A {
+  //   B(int x) : assert(x >= 0), super(x);
+  // }
+  // ```
   static const CompileTimeErrorCode INVALID_SUPER_INVOCATION =
       CompileTimeErrorCode('INVALID_SUPER_INVOCATION',
-          "The super call must be last in an initializer list: '{0}'.");
+          "The superclass call must be last in an initializer list: '{0}'.");
 
   /**
-   * 12.6 Lists: It is a compile time error if the type argument of a constant
-   * list literal includes a type parameter.
-   *
    * Parameters:
    * 0: the name of the type parameter
    */
+  // #### Description
+  //
+  // The analyzer produces this diagnostic when a type parameter is used as a
+  // type argument in a list, map, or set literal that is prefixed by `const`.
+  // This isn't allowed because the value of the type parameter (the actual type
+  // that will be used at runtime) can't be known at compile time.
+  //
+  // #### Example
+  //
+  // The following code produces this diagnostic because the type parameter `T`
+  // is being used as a type argument when creating a constant list:
+  //
+  // ```dart
+  // List<T> newList<T>() => const <[!T!]>[];
+  // ```
+  //
+  // The following code produces this diagnostic because the type parameter `T`
+  // is being used as a type argument when creating a constant map:
+  //
+  // ```dart
+  // Map<String, T> newSet<T>() => const <String, [!T!]>{};
+  // ```
+  //
+  // The following code produces this diagnostic because the type parameter `T`
+  // is being used as a type argument when creating a constant set:
+  //
+  // ```dart
+  // Set<T> newSet<T>() => const <[!T!]>{};
+  // ```
+  //
+  // #### Common fixes
+  //
+  // If the type that will be used for the type parameter can be known at
+  // compile time, then remove the type parameter:
+  //
+  // ```dart
+  // List<int> newList() => const <int>[];
+  // ```
+  //
+  // If the type that will be used for the type parameter can't be known until
+  // runtime, then remove the keyword `const`:
+  //
+  // ```dart
+  // List<T> newList<T>() => <T>[];
+  // ```
   static const CompileTimeErrorCode INVALID_TYPE_ARGUMENT_IN_CONST_LIST =
-      CompileTimeErrorCode(
+      CompileTimeErrorCodeWithUniqueName(
+          'INVALID_TYPE_ARGUMENT_IN_CONST_LITERAL',
           'INVALID_TYPE_ARGUMENT_IN_CONST_LIST',
           "Constant list literals can't include a type parameter as a type "
               "argument, such as '{0}'.",
@@ -5057,22 +5554,25 @@
               "Try replacing the type parameter with a different type.");
 
   /**
-   * 12.7 Maps: It is a compile time error if the type arguments of a constant
-   * map literal include a type parameter.
-   *
    * Parameters:
    * 0: the name of the type parameter
    */
   static const CompileTimeErrorCode INVALID_TYPE_ARGUMENT_IN_CONST_MAP =
-      CompileTimeErrorCode(
+      CompileTimeErrorCodeWithUniqueName(
+          'INVALID_TYPE_ARGUMENT_IN_CONST_LITERAL',
           'INVALID_TYPE_ARGUMENT_IN_CONST_MAP',
           "Constant map literals can't include a type parameter as a type "
               "argument, such as '{0}'.",
           correction:
               "Try replacing the type parameter with a different type.");
 
+  /**
+   * Parameters:
+   * 0: the name of the type parameter
+   */
   static const CompileTimeErrorCode INVALID_TYPE_ARGUMENT_IN_CONST_SET =
-      CompileTimeErrorCode(
+      CompileTimeErrorCodeWithUniqueName(
+          'INVALID_TYPE_ARGUMENT_IN_CONST_LITERAL',
           'INVALID_TYPE_ARGUMENT_IN_CONST_SET',
           "Constant set literals can't include a type parameter as a type "
               "argument, such as '{0}'.",
@@ -5288,17 +5788,67 @@
           hasPublishedDocs: true);
 
   /**
-   * 13.13 Break: It is a compile-time error if no such statement
-   * <i>s<sub>E</sub></i> exists within the innermost function in which
-   * <i>s<sub>b</sub></i> occurs.
-   *
-   * 13.14 Continue: It is a compile-time error if no such statement or case
-   * clause <i>s<sub>E</sub></i> exists within the innermost function in which
-   * <i>s<sub>c</sub></i> occurs.
-   *
    * Parameters:
    * 0: the name of the unresolvable label
    */
+  // #### Description
+  //
+  // The analyzer produces this diagnostic when a `break` or `continue`
+  // statement references a label that is declared in a method or function
+  // containing the function in which the `break` or `continue` statement
+  // appears. The `break` and `continue` statements can't be used to transfer
+  // control outside the function that contains them.
+  //
+  // #### Example
+  //
+  // The following code produces this diagnostic because the label `loop` is
+  // declared outside the local function `g`:
+  //
+  // ```dart
+  // void f() {
+  //   loop:
+  //   while (true) {
+  //     void g() {
+  //       break [!loop!];
+  //     }
+  //
+  //     g();
+  //   }
+  // }
+  // ```
+  //
+  // #### Common fixes
+  //
+  // Try rewriting the code so that it isn't necessary to transfer control
+  // outside the local function, possibly by inlining the local function:
+  //
+  // ```dart
+  // void f() {
+  //   loop:
+  //   while (true) {
+  //     break loop;
+  //   }
+  // }
+  // ```
+  //
+  // If that isn't possible, then try rewriting the local function so that a
+  // value returned by the function can be used to determine whether control is
+  // transferred:
+  //
+  // ```dart
+  // void f() {
+  //   loop:
+  //   while (true) {
+  //     bool g() {
+  //       return true;
+  //     }
+  //
+  //     if (g()) {
+  //       break loop;
+  //     }
+  //   }
+  // }
+  // ```
   static const CompileTimeErrorCode LABEL_IN_OUTER_SCOPE = CompileTimeErrorCode(
       'LABEL_IN_OUTER_SCOPE',
       "Can't reference label '{0}' declared in an outer method.");
@@ -5478,6 +6028,9 @@
           "The element type '{0}' can't be assigned to the list type '{1}'.",
           hasPublishedDocs: true);
 
+  /**
+   * No parameters.
+   */
   static const CompileTimeErrorCode MAIN_FIRST_POSITIONAL_PARAMETER_TYPE =
       CompileTimeErrorCode(
     'MAIN_FIRST_POSITIONAL_PARAMETER_TYPE',
@@ -5486,6 +6039,9 @@
     correction: "Try changing the type of the parameter.",
   );
 
+  /**
+   * No parameters.
+   */
   static const CompileTimeErrorCode MAIN_HAS_REQUIRED_NAMED_PARAMETERS =
       CompileTimeErrorCode(
     'MAIN_HAS_REQUIRED_NAMED_PARAMETERS',
@@ -5494,6 +6050,9 @@
         "or removing the 'required' modifier.",
   );
 
+  /**
+   * No parameters.
+   */
   static const CompileTimeErrorCode
       MAIN_HAS_TOO_MANY_REQUIRED_POSITIONAL_PARAMETERS = CompileTimeErrorCode(
     'MAIN_HAS_TOO_MANY_REQUIRED_POSITIONAL_PARAMETERS',
@@ -5502,6 +6061,32 @@
         "or removing extra parameters.",
   );
 
+  /**
+   * No parameters.
+   */
+  // #### Description
+  //
+  // The analyzer produces this diagnostic when a library contains a declaration
+  // of the name `main` that isn't the declaration of a top-level function.
+  //
+  // #### Example
+  //
+  // The following code produces this diagnostic because the name `main` is
+  // being used to declare a top-level variable:
+  //
+  // ```dart
+  // %experiments=non-nullable
+  // var [!main!] = 3;
+  // ```
+  //
+  // #### Common fixes
+  //
+  // Use a different name for the declaration:
+  //
+  // ```dart
+  // %experiments=non-nullable
+  // var mainIndex = 3;
+  // ```
   static const CompileTimeErrorCode MAIN_IS_NOT_FUNCTION = CompileTimeErrorCode(
     'MAIN_IS_NOT_FUNCTION',
     "The declaration named 'main' must be a function.",
@@ -11076,8 +11661,7 @@
   // `isEven` if `s` is `null`. In other words, if `s` is `null`, then neither
   // `length` nor `isEven` will be invoked, and if `s` is non-`null`, then
   // `length` can't return a `null` value. Either way, `isEven` can't be invoked
-  // on a `null` value, so the null-aware operator is neither necessary nor
-  // allowed. See
+  // on a `null` value, so the null-aware operator is not necessary. See
   // [Understanding null safety](/null-safety/understanding-null-safety#smarter-null-aware-methods)
   // for more details.
   //
@@ -11098,8 +11682,8 @@
   static const StaticWarningCode INVALID_NULL_AWARE_OPERATOR =
       StaticWarningCode(
           'INVALID_NULL_AWARE_OPERATOR',
-          "The receiver can't be null, so the null-aware operator '{0}' can't "
-              "be used.",
+          "The receiver can't be null, so the null-aware operator '{0}' is "
+              "unnecessary.",
           correction: "Try replacing the operator '{0}' with '{1}'.",
           hasPublishedDocs: true);
 
diff --git a/pkg/analyzer/lib/src/error/deprecated_member_use_verifier.dart b/pkg/analyzer/lib/src/error/deprecated_member_use_verifier.dart
new file mode 100644
index 0000000..6bcabc9
--- /dev/null
+++ b/pkg/analyzer/lib/src/error/deprecated_member_use_verifier.dart
@@ -0,0 +1,335 @@
+// Copyright (c) 2020, 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:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/constant/value.dart';
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/dart/element/type.dart';
+import 'package:analyzer/error/listener.dart';
+import 'package:analyzer/src/dart/element/element.dart';
+import 'package:analyzer/src/dart/error/hint_codes.dart';
+import 'package:analyzer/src/workspace/workspace.dart';
+
+class DeprecatedMemberUseVerifier {
+  final WorkspacePackage _workspacePackage;
+  final ErrorReporter _errorReporter;
+
+  /// We push a new value every time when we enter into a scope which
+  /// can be marked as deprecated - a class, a method, fields (multiple).
+  final List<bool> _inDeprecatedMemberStack = [false];
+
+  DeprecatedMemberUseVerifier(this._workspacePackage, this._errorReporter);
+
+  void assignmentExpression(AssignmentExpression node) {
+    _checkForDeprecated(node.readElement, node.leftHandSide);
+    _checkForDeprecated(node.writeElement, node.leftHandSide);
+    _checkForDeprecated(node.staticElement, node);
+  }
+
+  void binaryExpression(BinaryExpression node) {
+    _checkForDeprecated(node.staticElement, node);
+  }
+
+  void constructorName(ConstructorName node) {
+    _checkForDeprecated(node.staticElement, node);
+  }
+
+  void exportDirective(ExportDirective node) {
+    _checkForDeprecated(node.uriElement, node);
+  }
+
+  void functionExpressionInvocation(FunctionExpressionInvocation node) {
+    var callElement = node.staticElement;
+    if (callElement is MethodElement &&
+        callElement.name == FunctionElement.CALL_METHOD_NAME) {
+      _checkForDeprecated(callElement, node);
+    }
+  }
+
+  void importDirective(ImportDirective node) {
+    _checkForDeprecated(node.uriElement, node);
+  }
+
+  void indexExpression(IndexExpression node) {
+    _checkForDeprecated(node.staticElement, node);
+  }
+
+  void instanceCreationExpression(InstanceCreationExpression node) {
+    _invocationArguments(
+      node.constructorName.staticElement,
+      node.argumentList,
+    );
+  }
+
+  void methodInvocation(MethodInvocation node) {
+    _invocationArguments(
+      node.methodName.staticElement,
+      node.argumentList,
+    );
+  }
+
+  void popInDeprecated() {
+    _inDeprecatedMemberStack.removeLast();
+  }
+
+  void postfixExpression(PostfixExpression node) {
+    _checkForDeprecated(node.readElement, node.operand);
+    _checkForDeprecated(node.writeElement, node.operand);
+    _checkForDeprecated(node.staticElement, node);
+  }
+
+  void prefixExpression(PrefixExpression node) {
+    _checkForDeprecated(node.readElement, node.operand);
+    _checkForDeprecated(node.writeElement, node.operand);
+    _checkForDeprecated(node.staticElement, node);
+  }
+
+  void pushInDeprecatedMetadata(List<Annotation> metadata) {
+    var hasDeprecated = _hasDeprecatedAnnotation(metadata);
+    pushInDeprecatedValue(hasDeprecated);
+  }
+
+  void pushInDeprecatedValue(bool value) {
+    var newValue = _inDeprecatedMemberStack.last || value;
+    _inDeprecatedMemberStack.add(newValue);
+  }
+
+  void redirectingConstructorInvocation(RedirectingConstructorInvocation node) {
+    _checkForDeprecated(node.staticElement, node);
+    _invocationArguments(node.staticElement, node.argumentList);
+  }
+
+  void simpleIdentifier(SimpleIdentifier node) {
+    // Don't report declared identifiers.
+    if (node.inDeclarationContext()) {
+      return;
+    }
+
+    // Report full ConstructorName, not just the constructor name.
+    AstNode parent = node.parent;
+    if (parent is ConstructorName && identical(node, parent.name)) {
+      return;
+    }
+
+    // Report full SuperConstructorInvocation, not just the constructor name.
+    if (parent is SuperConstructorInvocation &&
+        identical(node, parent.constructorName)) {
+      return;
+    }
+
+    // HideCombinator is forgiving.
+    if (parent is HideCombinator) {
+      return;
+    }
+
+    _simpleIdentifier(node);
+  }
+
+  void superConstructorInvocation(SuperConstructorInvocation node) {
+    _checkForDeprecated(node.staticElement, node);
+    _invocationArguments(node.staticElement, node.argumentList);
+  }
+
+  /// Given some [element], look at the associated metadata and report the use
+  /// of the member if it is declared as deprecated. If a diagnostic is reported
+  /// it should be reported at the given [node].
+  void _checkForDeprecated(Element element, AstNode node) {
+    if (!_isDeprecated(element)) {
+      return;
+    }
+
+    if (_inDeprecatedMemberStack.last) {
+      return;
+    }
+
+    if (_isLocalParameter(element, node)) {
+      return;
+    }
+
+    var errorNode = node;
+    var parent = node.parent;
+    if (parent is AssignmentExpression && parent.leftHandSide == node) {
+      if (node is SimpleIdentifier) {
+        errorNode = node;
+      } else if (node is PrefixedIdentifier) {
+        errorNode = node.identifier;
+      } else if (node is PropertyAccess) {
+        errorNode = node.propertyName;
+      }
+    } else if (node is NamedExpression) {
+      errorNode = node.name.label;
+    }
+
+    String displayName = element.displayName;
+    if (element is ConstructorElement) {
+      // TODO(jwren) We should modify ConstructorElement.getDisplayName(),
+      // or have the logic centralized elsewhere, instead of doing this logic
+      // here.
+      displayName = element.enclosingElement.displayName;
+      if (element.displayName.isNotEmpty) {
+        displayName = "$displayName.${element.displayName}";
+      }
+    } else if (element is LibraryElement) {
+      displayName = element.definingCompilationUnit.source.uri.toString();
+    } else if (node is MethodInvocation &&
+        displayName == FunctionElement.CALL_METHOD_NAME) {
+      var invokeType = node.staticInvokeType as InterfaceType;
+      if (invokeType is InterfaceType) {
+        var invokeClass = invokeType.element;
+        displayName = "${invokeClass.name}.${element.displayName}";
+      }
+    }
+    LibraryElement library =
+        element is LibraryElement ? element : element.library;
+    String message = _deprecatedMessage(element);
+    if (message == null || message.isEmpty) {
+      _errorReporter.reportErrorForNode(
+        _isLibraryInWorkspacePackage(library)
+            ? HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE
+            : HintCode.DEPRECATED_MEMBER_USE,
+        errorNode,
+        [displayName],
+      );
+    } else {
+      _errorReporter.reportErrorForNode(
+        _isLibraryInWorkspacePackage(library)
+            ? HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE_WITH_MESSAGE
+            : HintCode.DEPRECATED_MEMBER_USE_WITH_MESSAGE,
+        errorNode,
+        [displayName, message],
+      );
+    }
+  }
+
+  void _invocationArguments(Element element, ArgumentList arguments) {
+    element = element?.declaration;
+    if (element is ExecutableElement) {
+      _visitParametersAndArguments(
+        element.parameters,
+        arguments.arguments,
+        (parameter, argument) {
+          if (parameter.isOptional) {
+            _checkForDeprecated(parameter, argument);
+          }
+        },
+      );
+    }
+  }
+
+  bool _isLibraryInWorkspacePackage(LibraryElement library) {
+    // Better to not make a big claim that they _are_ in the same package,
+    // if we were unable to determine what package [_currentLibrary] is in.
+    if (_workspacePackage == null || library == null) {
+      return false;
+    }
+    return _workspacePackage.contains(library.source);
+  }
+
+  void _simpleIdentifier(SimpleIdentifier identifier) {
+    _checkForDeprecated(identifier.staticElement, identifier);
+  }
+
+  /// Return the message in the deprecated annotation on the given [element], or
+  /// `null` if the element doesn't have a deprecated annotation or if the
+  /// annotation does not have a message.
+  static String _deprecatedMessage(Element element) {
+    // Implicit getters/setters.
+    if (element.isSynthetic && element is PropertyAccessorElement) {
+      element = (element as PropertyAccessorElement).variable;
+    }
+    ElementAnnotationImpl annotation = element.metadata.firstWhere(
+      (e) => e.isDeprecated,
+      orElse: () => null,
+    );
+    if (annotation == null || annotation.element is PropertyAccessorElement) {
+      return null;
+    }
+    DartObject constantValue = annotation.computeConstantValue();
+    return constantValue?.getField('message')?.toStringValue() ??
+        constantValue?.getField('expires')?.toStringValue();
+  }
+
+  static bool _hasDeprecatedAnnotation(List<Annotation> annotations) {
+    for (var i = 0; i < annotations.length; i++) {
+      if (annotations[i].elementAnnotation.isDeprecated) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  static bool _isDeprecated(Element element) {
+    if (element == null) {
+      return false;
+    }
+
+    if (element is PropertyAccessorElement && element.isSynthetic) {
+      // TODO(brianwilkerson) Why isn't this the implementation for PropertyAccessorElement?
+      Element variable = element.variable;
+      if (variable == null) {
+        return false;
+      }
+      return variable.hasDeprecated;
+    }
+    return element.hasDeprecated;
+  }
+
+  /// Return `true` if [element] is a [ParameterElement] declared in [node].
+  static bool _isLocalParameter(Element element, AstNode node) {
+    if (element is ParameterElement) {
+      ExecutableElement definingFunction = element.enclosingElement;
+
+      for (; node != null; node = node.parent) {
+        if (node is ConstructorDeclaration) {
+          if (node.declaredElement == definingFunction) {
+            return true;
+          }
+        } else if (node is FunctionExpression) {
+          if (node.declaredElement == definingFunction) {
+            return true;
+          }
+        } else if (node is MethodDeclaration) {
+          if (node.declaredElement == definingFunction) {
+            return true;
+          }
+        }
+      }
+    }
+    return false;
+  }
+
+  static void _visitParametersAndArguments(
+    List<ParameterElement> parameters,
+    List<Expression> arguments,
+    void Function(ParameterElement, Expression) f,
+  ) {
+    Map<String, ParameterElement> namedParameters;
+
+    var positionalIndex = 0;
+    for (var argument in arguments) {
+      if (argument is NamedExpression) {
+        if (namedParameters == null) {
+          namedParameters = {};
+          for (var parameter in parameters) {
+            if (parameter.isNamed) {
+              namedParameters[parameter.name] = parameter;
+            }
+          }
+        }
+        var name = argument.name.label.name;
+        var parameter = namedParameters[name];
+        if (parameter != null) {
+          f(parameter, argument);
+        }
+      } else {
+        if (positionalIndex < parameters.length) {
+          var parameter = parameters[positionalIndex++];
+          if (parameter.isPositional) {
+            f(parameter, argument);
+          }
+        }
+      }
+    }
+  }
+}
diff --git a/pkg/analyzer/lib/src/error/ignore_validator.dart b/pkg/analyzer/lib/src/error/ignore_validator.dart
new file mode 100644
index 0000000..9f81675
--- /dev/null
+++ b/pkg/analyzer/lib/src/error/ignore_validator.dart
@@ -0,0 +1,192 @@
+// Copyright (c) 2020, 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:analyzer/error/error.dart';
+import 'package:analyzer/error/listener.dart';
+import 'package:analyzer/source/line_info.dart';
+import 'package:analyzer/src/dart/error/hint_codes.dart';
+import 'package:analyzer/src/dart/error/syntactic_errors.dart';
+import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/ignore_comments/ignore_info.dart';
+
+/// Used to validate the ignore comments in a single file.
+class IgnoreValidator {
+  /// The error reporter to which errors are to be reported.
+  final ErrorReporter _errorReporter;
+
+  /// The diagnostics that are reported in the file being analyzed.
+  final List<AnalysisError> _reportedErrors;
+
+  /// The information about the ignore comments in the file being analyzed.
+  final IgnoreInfo _ignoreInfo;
+
+  /// The line info for the file being analyzed.
+  final LineInfo _lineInfo;
+
+  /// A list of the names and unique names of all known error codes that can't
+  /// be ignored. Note that this list is incomplete. Plugins might well define
+  /// diagnostics with a severity of `ERROR`, but we won't be able to flag their
+  /// use because we have no visibility of them here.
+  final Set<String> unignorableNames = {};
+
+  /// Initialize a newly created validator to report any issues with ignore
+  /// comments in the file being analyzed. The diagnostics will be reported to
+  /// the [_errorReporter].
+  IgnoreValidator(this._errorReporter, this._reportedErrors, this._ignoreInfo,
+      this._lineInfo) {
+    var filePath = _errorReporter.source.fullName;
+    for (var code in errorCodeValues) {
+      if (!isIgnorable(filePath, code)) {
+        unignorableNames.add(code.name.toLowerCase());
+        unignorableNames.add(code.uniqueName.toLowerCase());
+      }
+    }
+  }
+
+  /// Report any issues with ignore comments in the file being analyzed.
+  void reportErrors() {
+    if (!_ignoreInfo.hasIgnores) {
+      return;
+    }
+    var ignoredOnLineMap = _ignoreInfo.ignoredOnLine;
+    var ignoredForFile = _ignoreInfo.ignoredForFile;
+    //
+    // Report and remove any un-ignorable or duplicated names.
+    //
+    var namesIgnoredForFile = <String>{};
+    var unignorable = <DiagnosticName>[];
+    var duplicated = <DiagnosticName>[];
+    for (var ignoredName in ignoredForFile) {
+      var name = ignoredName.name;
+      if (unignorableNames.contains(name)) {
+        unignorable.add(ignoredName);
+      } else if (!namesIgnoredForFile.add(name)) {
+        duplicated.add(ignoredName);
+      }
+    }
+    _reportUnknownAndDuplicateIgnores(unignorable, duplicated, ignoredForFile);
+    for (var ignoredOnLine in ignoredOnLineMap.values) {
+      var namedIgnoredOnLine = <String>{};
+      var unignorable = <DiagnosticName>[];
+      var duplicated = <DiagnosticName>[];
+      for (var ignoredName in ignoredOnLine) {
+        var name = ignoredName.name;
+        if (unignorableNames.contains(name)) {
+          unignorable.add(ignoredName);
+        } else if (namesIgnoredForFile.contains(name) ||
+            !namedIgnoredOnLine.add(name)) {
+          duplicated.add(ignoredName);
+        }
+      }
+      _reportUnknownAndDuplicateIgnores(unignorable, duplicated, ignoredOnLine);
+    }
+    //
+    // Remove all of the errors that are actually being ignored.
+    //
+    for (var error in _reportedErrors) {
+      var lineNumber = _lineInfo.getLocation(error.offset).lineNumber;
+      var ignoredOnLine = ignoredOnLineMap[lineNumber];
+
+      ignoredForFile.removeByName(error.ignoreName);
+      ignoredForFile.removeByName(error.ignoreUniqueName);
+
+      ignoredOnLine?.removeByName(error.ignoreName);
+      ignoredOnLine?.removeByName(error.ignoreUniqueName);
+    }
+    //
+    // Report any remaining ignored names as being unnecessary.
+    //
+    _reportUnnecessaryIgnores(ignoredForFile);
+    for (var ignoredOnLine in ignoredOnLineMap.values) {
+      _reportUnnecessaryIgnores(ignoredOnLine);
+    }
+  }
+
+  /// Report the names that are [unignorable] or [duplicated] and remove them
+  /// from the [list] of names from which they were extracted.
+  void _reportUnknownAndDuplicateIgnores(List<DiagnosticName> unignorable,
+      List<DiagnosticName> duplicated, List<DiagnosticName> list) {
+    // TODO(brianwilkerson) Uncomment the code below after the unignorable
+    //  ignores in the Flutter code base have been cleaned up.
+    // for (var unignorableName in unignorable) {
+    //   var name = unignorableName.name;
+    //   _errorReporter.reportErrorForOffset(HintCode.UNIGNORABLE_IGNORE,
+    //       unignorableName.offset, name.length, [name]);
+    //   list.remove(unignorableName);
+    // }
+    for (var ignoredName in duplicated) {
+      var name = ignoredName.name;
+      _errorReporter.reportErrorForOffset(
+          HintCode.DUPLICATE_IGNORE, ignoredName.offset, name.length, [name]);
+      list.remove(ignoredName);
+    }
+  }
+
+  /// Report the [ignoredNames] as being unnecessary.
+  void _reportUnnecessaryIgnores(List<DiagnosticName> ignoredNames) {
+    // TODO(brianwilkerson) Uncomment the code below after the unnecessary
+    //  ignores in the Flutter code base have been cleaned up.
+    // for (var ignoredName in ignoredNames) {
+    //   var name = ignoredName.name;
+    //   _errorReporter.reportErrorForOffset(
+    //       HintCode.UNNECESSARY_IGNORE, ignoredName.offset, name.length,
+    //       [name]);
+    // }
+  }
+
+  static bool isIgnorable(String filePath, ErrorCode code) {
+    if (code.isIgnorable) {
+      return true;
+    }
+    // The [code] is not ignorable, but we've allowed a few "privileged"
+    // cases. Each is annotated with an issue which represents technical
+    // debt. Once cleaned up, we may remove this notion of "privileged".
+    // In the case of [CompileTimeErrorCode.IMPORT_INTERNAL_LIBRARY], we may
+    // just decide that it happens enough in tests that it can be declared
+    // an ignorable error, and in practice other back ends will prevent
+    // non-internal code from importing internal code.
+    if (code == CompileTimeErrorCode.UNDEFINED_FUNCTION ||
+        code == CompileTimeErrorCode.UNDEFINED_PREFIXED_NAME) {
+      // Special case a small number of errors in Flutter code which are
+      // ignored. The erroneous code is found in a conditionally imported
+      // library, which uses a special version of the "dart:ui" library
+      // which the Analyzer does not use during analysis. See
+      // https://github.com/flutter/flutter/issues/52899.
+      if (filePath.contains('flutter')) {
+        return true;
+      }
+    }
+
+    if ((code == CompileTimeErrorCode.IMPORT_INTERNAL_LIBRARY ||
+            code == CompileTimeErrorCode.UNDEFINED_ANNOTATION ||
+            code == ParserErrorCode.NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE) &&
+        (filePath.contains('tests/compiler/dart2js') ||
+            filePath.contains('pkg/compiler/test'))) {
+      // Special case the dart2js language tests. Some of these import
+      // various internal libraries.
+      return true;
+    }
+    return false;
+  }
+}
+
+extension on AnalysisError {
+  String get ignoreName => errorCode.name.toLowerCase();
+
+  String get ignoreUniqueName {
+    String uniqueName = errorCode.uniqueName;
+    int period = uniqueName.indexOf('.');
+    if (period >= 0) {
+      uniqueName = uniqueName.substring(period + 1);
+    }
+    return uniqueName.toLowerCase();
+  }
+}
+
+extension on List<DiagnosticName> {
+  void removeByName(String name) {
+    removeWhere((ignoredName) => ignoredName.name == name);
+  }
+}
diff --git a/pkg/analyzer/lib/src/error/imports_verifier.dart b/pkg/analyzer/lib/src/error/imports_verifier.dart
index 6c16e25..674e4f5 100644
--- a/pkg/analyzer/lib/src/error/imports_verifier.dart
+++ b/pkg/analyzer/lib/src/error/imports_verifier.dart
@@ -19,6 +19,12 @@
   GatherUsedImportedElementsVisitor(this.library);
 
   @override
+  visitAssignmentExpression(AssignmentExpression node) {
+    _recordAssignmentTarget(node, node.leftHandSide);
+    return super.visitAssignmentExpression(node);
+  }
+
+  @override
   void visitBinaryExpression(BinaryExpression node) {
     _recordIfExtensionMember(node.staticElement);
     return super.visitBinaryExpression(node);
@@ -52,7 +58,14 @@
   }
 
   @override
+  visitPostfixExpression(PostfixExpression node) {
+    _recordAssignmentTarget(node, node.operand);
+    return super.visitPostfixExpression(node);
+  }
+
+  @override
   void visitPrefixExpression(PrefixExpression node) {
+    _recordAssignmentTarget(node, node.operand);
     _recordIfExtensionMember(node.staticElement);
     return super.visitPrefixExpression(node);
   }
@@ -62,6 +75,22 @@
     _visitIdentifier(node, node.staticElement);
   }
 
+  void _recordAssignmentTarget(
+    CompoundAssignmentExpression node,
+    Expression target,
+  ) {
+    if (target is PrefixedIdentifier) {
+      _visitIdentifier(target.identifier, node.readElement);
+      _visitIdentifier(target.identifier, node.writeElement);
+    } else if (target is PropertyAccess) {
+      _visitIdentifier(target.propertyName, node.readElement);
+      _visitIdentifier(target.propertyName, node.writeElement);
+    } else if (target is SimpleIdentifier) {
+      _visitIdentifier(target, node.readElement);
+      _visitIdentifier(target, node.writeElement);
+    }
+  }
+
   void _recordIfExtensionMember(Element element) {
     if (element != null && element.enclosingElement is ExtensionElement) {
       _recordUsedExtension(element.enclosingElement);
diff --git a/pkg/analyzer/lib/src/error/type_arguments_verifier.dart b/pkg/analyzer/lib/src/error/type_arguments_verifier.dart
index f43fffa..e37d63d 100644
--- a/pkg/analyzer/lib/src/error/type_arguments_verifier.dart
+++ b/pkg/analyzer/lib/src/error/type_arguments_verifier.dart
@@ -196,7 +196,7 @@
     if (type is InterfaceType) {
       typeParameters = type.element.typeParameters;
       typeArguments = type.typeArguments;
-    } else if (element is GenericTypeAliasElement && type is FunctionType) {
+    } else if (element is FunctionTypeAliasElement && type is FunctionType) {
       typeParameters = element.typeParameters;
       typeArguments = type.typeArguments;
     } else {
diff --git a/pkg/analyzer/lib/src/error/unused_local_elements_verifier.dart b/pkg/analyzer/lib/src/error/unused_local_elements_verifier.dart
index fd25c70..c4368cf 100644
--- a/pkg/analyzer/lib/src/error/unused_local_elements_verifier.dart
+++ b/pkg/analyzer/lib/src/error/unused_local_elements_verifier.dart
@@ -10,6 +10,7 @@
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/error/listener.dart';
+import 'package:analyzer/src/dart/ast/extensions.dart';
 import 'package:analyzer/src/dart/element/inheritance_manager3.dart';
 import 'package:analyzer/src/dart/element/member.dart' show ExecutableMember;
 import 'package:analyzer/src/error/codes.dart';
@@ -90,7 +91,7 @@
 
   @override
   void visitIndexExpression(IndexExpression node) {
-    var element = node.staticElement;
+    var element = node.writeOrReadElement;
     usedElements.members.add(element);
     super.visitIndexExpression(node);
   }
@@ -140,7 +141,7 @@
     if (_inCommentReference(node)) {
       return;
     }
-    Element element = node.staticElement;
+    Element element = node.writeOrReadElement;
     // Store un-parameterized members.
     if (element is ExecutableMember) {
       element = element.declaration;
@@ -160,7 +161,9 @@
         usedElements.addElement(element);
       }
     } else {
-      _useIdentifierElement(node);
+      _useIdentifierElement(node, node.readElement);
+      _useIdentifierElement(node, node.writeElement);
+      _useIdentifierElement(node, node.staticElement);
       var parent = node.parent;
       // If [node] is a method tear-off, assume all parameters are used.
       var functionReferenceIsCall =
@@ -215,9 +218,8 @@
     }
   }
 
-  /// Marks an [Element] of [node] as used in the library.
-  void _useIdentifierElement(Identifier node) {
-    Element element = node.staticElement;
+  /// Marks the [element] of [node] as used in the library.
+  void _useIdentifierElement(Identifier node, Element element) {
     if (element == null) {
       return;
     }
diff --git a/pkg/analyzer/lib/src/fasta/ast_builder.dart b/pkg/analyzer/lib/src/fasta/ast_builder.dart
index 4fd12b4..ccfec81 100644
--- a/pkg/analyzer/lib/src/fasta/ast_builder.dart
+++ b/pkg/analyzer/lib/src/fasta/ast_builder.dart
@@ -3677,7 +3677,7 @@
       handleRecoverableError(
         templateExperimentNotEnabled.withArguments(
           feature.enableString,
-          _versionAsString(ExperimentStatus.currentVersion),
+          _versionAsString(feature.releaseVersion),
         ),
         questionMark,
         questionMark,
@@ -3699,7 +3699,7 @@
       handleRecoverableError(
         templateExperimentNotEnabled.withArguments(
           feature.enableString,
-          _versionAsString(ExperimentStatus.currentVersion),
+          _versionAsString(feature.releaseVersion),
         ),
         modifierToken,
         modifierToken,
@@ -3712,7 +3712,7 @@
     handleRecoverableError(
       templateExperimentNotEnabled.withArguments(
         feature.enableString,
-        _versionAsString(ExperimentStatus.currentVersion),
+        _versionAsString(feature.releaseVersion),
       ),
       bang,
       bang,
diff --git a/pkg/analyzer/lib/src/generated/declaration_resolver.dart b/pkg/analyzer/lib/src/generated/declaration_resolver.dart
index 8c9f8b8..fea0326 100644
--- a/pkg/analyzer/lib/src/generated/declaration_resolver.dart
+++ b/pkg/analyzer/lib/src/generated/declaration_resolver.dart
@@ -98,7 +98,7 @@
 
   /// Creates an [ElementWalker] which walks the child elements of a typedef
   /// element.
-  ElementWalker.forTypedef(GenericTypeAliasElementImpl element)
+  ElementWalker.forTypedef(FunctionTypeAliasElementImpl element)
       : element = element,
         _parameters = element.function.parameters,
         _typeParameters = element.typeParameters;
diff --git a/pkg/analyzer/lib/src/generated/element_resolver.dart b/pkg/analyzer/lib/src/generated/element_resolver.dart
index 9939ed4..8a09582 100644
--- a/pkg/analyzer/lib/src/generated/element_resolver.dart
+++ b/pkg/analyzer/lib/src/generated/element_resolver.dart
@@ -176,7 +176,7 @@
 
       if (prefixElement is PrefixElement) {
         var prefixScope = prefixElement.scope;
-        var lookupResult = prefixScope.lookup2(name.name);
+        var lookupResult = prefixScope.lookup(name.name);
         var element = lookupResult.getter ?? lookupResult.setter;
         element = _resolver.toLegacyElement(element);
         name.staticElement = element;
@@ -640,7 +640,7 @@
   /// which it could be resolved, or `null` if it could not be resolved. This
   /// does not record the results of the resolution.
   Element _resolveSimpleIdentifier(SimpleIdentifier identifier) {
-    var lookupResult = _resolver.nameScope.lookup2(identifier.name);
+    var lookupResult = _resolver.nameScope.lookup(identifier.name);
 
     Element element = lookupResult.getter;
     element = _resolver.toLegacyElement(element);
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index dfc4756..98b30f2 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -637,7 +637,6 @@
   @override
   void visitFieldFormalParameter(FieldFormalParameter node) {
     _checkForValidField(node);
-    _checkForConstFormalParameter(node);
     _checkForPrivateOptionalParameter(node);
     _checkForFieldInitializingFormalRedirectingConstructor(node);
     _checkForTypeAnnotationDeferredClass(node.type);
@@ -721,8 +720,6 @@
               identifier, functionExpression.parameters);
         }
         _checkForNonVoidReturnTypeForSetter(returnType);
-        _checkForInvalidModifierOnBody(node.functionExpression.body,
-            CompileTimeErrorCode.INVALID_MODIFIER_ON_SETTER);
       }
       _checkForTypeAnnotationDeferredClass(returnType);
       _returnTypeVerifier.verifyReturnType(returnType);
@@ -916,8 +913,6 @@
         ).checkGetter(node.name, node.declaredElement);
       }
       if (node.isSetter) {
-        _checkForInvalidModifierOnBody(
-            node.body, CompileTimeErrorCode.INVALID_MODIFIER_ON_SETTER);
         _checkForWrongNumberOfParametersForSetter(node.name, node.parameters);
         _checkForNonVoidReturnTypeForSetter(returnType);
       } else if (node.isOperator) {
@@ -1111,7 +1106,6 @@
 
   @override
   void visitSimpleFormalParameter(SimpleFormalParameter node) {
-    _checkForConstFormalParameter(node);
     _checkForPrivateOptionalParameter(node);
     _checkForTypeAnnotationDeferredClass(node.type);
 
@@ -1498,7 +1492,7 @@
       Element prevElement = _exportedElements[name];
       if (element != null && prevElement != null && prevElement != element) {
         _errorReporter.reportErrorForNode(
-            CompileTimeErrorCode.AMBIGUOUS_EXPORT, directive, [
+            CompileTimeErrorCode.AMBIGUOUS_EXPORT, directive.uri, [
           name,
           prevElement.library.definingCompilationUnit.source.uri,
           element.library.definingCompilationUnit.source.uri
@@ -1513,7 +1507,7 @@
   /// Check the given node to see whether it was ambiguous because the name was
   /// imported from two or more imports.
   void _checkForAmbiguousImport(SimpleIdentifier node) {
-    Element element = node.staticElement;
+    Element element = node.writeOrReadElement;
     if (element is MultiplyDefinedElementImpl) {
       String name = element.displayName;
       List<Element> conflictingMembers = element.conflictingElements;
@@ -2115,16 +2109,6 @@
     }
   }
 
-  /// Verify that the given normal formal [parameter] is not 'const'.
-  ///
-  /// See [CompileTimeErrorCode.CONST_FORMAL_PARAMETER].
-  void _checkForConstFormalParameter(NormalFormalParameter parameter) {
-    if (parameter.isConst) {
-      _errorReporter.reportErrorForNode(
-          CompileTimeErrorCode.CONST_FORMAL_PARAMETER, parameter);
-    }
-  }
-
   /// Verify that the given instance creation [expression] is not being invoked
   /// on an abstract class. The [typeName] is the [TypeName] of the
   /// [ConstructorName] from the [InstanceCreationExpression], this is the AST
@@ -2802,7 +2786,7 @@
       return;
     }
     // prepare element
-    Element element = identifier.staticElement;
+    Element element = identifier.writeOrReadElement;
     if (!(element is MethodElement || element is PropertyAccessorElement)) {
       return;
     }
@@ -2895,7 +2879,7 @@
       return;
     }
     // prepare member Element
-    Element element = name.staticElement;
+    Element element = name.writeOrReadElement;
     if (element is ExecutableElement) {
       if (!element.isStatic) {
         // OK, instance member
@@ -4245,7 +4229,7 @@
     AstNode node,
     FunctionTypeAliasElement element,
   ) {
-    if ((element as GenericTypeAliasElementImpl).hasSelfReference) {
+    if ((element as FunctionTypeAliasElementImpl).hasSelfReference) {
       _errorReporter.reportErrorForNode(
         CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF,
         node,
@@ -4490,7 +4474,7 @@
   /// [CompileTimeErrorCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER].
   void _checkForUnqualifiedReferenceToNonLocalStaticMember(
       SimpleIdentifier name) {
-    Element element = name.staticElement;
+    Element element = name.writeOrReadElement;
     if (element == null || element is TypeParameterElement) {
       return;
     }
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index 46728e7..4cbf579 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -658,55 +658,6 @@
     }
   }
 
-  /// TODO(scheglov) This is mostly necessary for backward compatibility.
-  /// Although we also use `staticElement` for `getType(left)` below.
-  void setAssignmentBackwardCompatibility({
-    @required CompoundAssignmentExpression assignment,
-    @required AstNode left,
-    @required bool hasRead,
-  }) {
-    if (left is IndexExpression) {
-      if (hasRead) {
-        left.staticElement = assignment.writeElement;
-        // ignore: deprecated_member_use_from_same_package
-        left.auxiliaryElements = AuxiliaryElements(assignment.readElement);
-      } else {
-        left.staticElement = assignment.writeElement;
-      }
-      inferenceHelper.recordStaticType(left, assignment.writeType);
-      return;
-    }
-
-    SimpleIdentifier leftIdentifier;
-    if (left is PrefixedIdentifier) {
-      leftIdentifier = left.identifier;
-      inferenceHelper.recordStaticType(left, assignment.writeType);
-    } else if (left is PropertyAccess) {
-      leftIdentifier = left.propertyName;
-      inferenceHelper.recordStaticType(left, assignment.writeType);
-    } else if (left is SimpleIdentifier) {
-      leftIdentifier = left;
-    } else {
-      return;
-    }
-
-    if (hasRead) {
-      var readElement = assignment.readElement;
-      if (readElement is PropertyAccessorElement) {
-        // ignore: deprecated_member_use_from_same_package
-        leftIdentifier.auxiliaryElements = AuxiliaryElements(readElement);
-      }
-    }
-
-    leftIdentifier.staticElement = assignment.writeElement;
-    if (assignment.readElement is VariableElement) {
-      var leftType = localVariableTypeProvider.getType(leftIdentifier);
-      inferenceHelper.recordStaticType(leftIdentifier, leftType);
-    } else {
-      inferenceHelper.recordStaticType(leftIdentifier, assignment.writeType);
-    }
-  }
-
   void setReadElement(Expression node, Element element) {
     DartType readType = DynamicTypeImpl.instance;
     if (node is IndexExpression) {
@@ -1029,7 +980,7 @@
     // TODO(scheglov) Change corresponding visiting places to visit comments
     // with name scopes set for correct comments resolution.
     if (parent is GenericTypeAlias) {
-      var element = parent.declaredElement as GenericTypeAliasElement;
+      var element = parent.declaredElement as FunctionTypeAliasElement;
       var outerScope = nameScope;
       try {
         nameScope = TypeParameterScope(nameScope, element.typeParameters);
@@ -1792,6 +1743,8 @@
       type = element.type;
     } else if (element is PropertyAccessorElement && element.isGetter) {
       type = element.returnType;
+    } else if (result.functionTypeCallType != null) {
+      type = result.functionTypeCallType;
     } else {
       type = DynamicTypeImpl.instance;
     }
@@ -2851,7 +2804,7 @@
   void visitGenericTypeAlias(GenericTypeAlias node) {
     Scope outerScope = nameScope;
     try {
-      GenericTypeAliasElement element = node.declaredElement;
+      FunctionTypeAliasElement element = node.declaredElement;
       nameScope = TypeParameterScope(nameScope, element.typeParameters);
       super.visitGenericTypeAlias(node);
 
@@ -3209,7 +3162,7 @@
       return;
     }
     // Prepare VariableElement.
-    Element element = nameScope.lookup2(node.name).getter;
+    Element element = nameScope.lookup(node.name).getter;
     if (element is! VariableElement) {
       return;
     }
diff --git a/pkg/analyzer/lib/src/generated/testing/element_factory.dart b/pkg/analyzer/lib/src/generated/testing/element_factory.dart
index 427d11f..c0c1b6e 100644
--- a/pkg/analyzer/lib/src/generated/testing/element_factory.dart
+++ b/pkg/analyzer/lib/src/generated/testing/element_factory.dart
@@ -261,9 +261,9 @@
     _objectElement = null;
   }
 
-  static GenericTypeAliasElementImpl genericTypeAliasElement(String name,
+  static FunctionTypeAliasElementImpl functionTypeAliasElement(String name,
       {List<ParameterElement> parameters = const [], DartType returnType}) {
-    var element = GenericTypeAliasElementImpl(name, -1);
+    var element = FunctionTypeAliasElementImpl(name, -1);
     element.function = GenericFunctionTypeElementImpl.forOffset(-1)
       ..parameters = parameters
       ..returnType = returnType ?? DynamicTypeImpl.instance;
diff --git a/pkg/analyzer/lib/src/ignore_comments/ignore_info.dart b/pkg/analyzer/lib/src/ignore_comments/ignore_info.dart
index d019194..6d37999 100644
--- a/pkg/analyzer/lib/src/ignore_comments/ignore_info.dart
+++ b/pkg/analyzer/lib/src/ignore_comments/ignore_info.dart
@@ -8,10 +8,27 @@
 import 'package:analyzer/src/dart/ast/token.dart';
 import 'package:analyzer/src/generated/source.dart';
 
+/// The name and location of a diagnostic name in an ignore comment.
+class DiagnosticName {
+  /// The name of the diagnostic being ignored.
+  final String name;
+
+  /// The offset of the diagnostic in the source file.
+  final int offset;
+
+  /// Initialize a newly created diagnostic name to have the given [name] and
+  /// [offset].
+  DiagnosticName(this.name, this.offset);
+
+  /// Return `true` if this diagnostic name matches the given error code.
+  bool matches(String errorCode) => name == errorCode;
+}
+
 /// Information about analysis `//ignore:` and `//ignore_for_file` comments
 /// within a source file.
 class IgnoreInfo {
   ///  Instance shared by all cases without matches.
+  // ignore: deprecated_member_use_from_same_package
   static final IgnoreInfo _EMPTY_INFO = IgnoreInfo();
 
   /// A regular expression for matching 'ignore' comments.  Produces matches
@@ -34,12 +51,13 @@
 
   /// A table mapping line numbers to the diagnostics that are ignored on that
   /// line.
-  final Map<int, List<_DiagnosticName>> _ignoredOnLine = {};
+  final Map<int, List<DiagnosticName>> _ignoredOnLine = {};
 
   /// A list containing all of the diagnostics that are ignored for the whole
   /// file.
-  final List<_DiagnosticName> _ignoredForFile = [];
+  final List<DiagnosticName> _ignoredForFile = [];
 
+  @Deprecated('Use the constructor IgnoreInfo.forDart')
   IgnoreInfo();
 
   /// Initialize a newly created instance of this class to represent the ignore
@@ -73,6 +91,20 @@
   bool get hasIgnores =>
       _ignoredOnLine.isNotEmpty || _ignoredForFile.isNotEmpty;
 
+  /// Return a list containing all of the diagnostics that are ignored for the
+  /// whole file.
+  List<DiagnosticName> get ignoredForFile => _ignoredForFile.toList();
+
+  /// Return a table mapping line numbers to the diagnostics that are ignored on
+  /// that line.
+  Map<int, List<DiagnosticName>> get ignoredOnLine {
+    Map<int, List<DiagnosticName>> ignoredOnLine = {};
+    for (var entry in _ignoredOnLine.entries) {
+      ignoredOnLine[entry.key] = entry.value.toList();
+    }
+    return ignoredOnLine;
+  }
+
   /// Return `true` if the [errorCode] is ignored at the given [line].
   bool ignoredAt(String errorCode, int line) {
     for (var name in _ignoredForFile) {
@@ -92,16 +124,17 @@
   }
 
   /// Ignore these [errorCodes] at [line].
-  void _addAll(int line, Iterable<_DiagnosticName> errorCodes) {
+  void _addAll(int line, Iterable<DiagnosticName> errorCodes) {
     _ignoredOnLine.putIfAbsent(line, () => []).addAll(errorCodes);
   }
 
   /// Ignore these [errorCodes] in the whole file.
-  void _addAllForFile(Iterable<_DiagnosticName> errorCodes) {
+  void _addAllForFile(Iterable<DiagnosticName> errorCodes) {
     _ignoredForFile.addAll(errorCodes);
   }
 
   /// Calculate ignores for the given [content] with line [info].
+  @Deprecated('Use the constructor IgnoreInfo.forDart')
   static IgnoreInfo calculateIgnores(String content, LineInfo info) {
     Iterable<Match> matches = _IGNORE_MATCHER.allMatches(content);
     Iterable<Match> fileMatches = _IGNORE_FOR_FILE_MATCHER.allMatches(content);
@@ -115,10 +148,10 @@
       // Note that the offsets are not being computed here. This shouldn't
       // affect older clients of this class because none of the previous APIs
       // depended on having offsets.
-      Iterable<_DiagnosticName> codes = match
+      Iterable<DiagnosticName> codes = match
           .group(1)
           .split(',')
-          .map((String code) => _DiagnosticName(code.trim().toLowerCase(), -1));
+          .map((String code) => DiagnosticName(code.trim().toLowerCase(), -1));
       CharacterLocation location = info.getLocation(match.start);
       int lineNumber = location.lineNumber;
       String beforeMatch = content.substring(
@@ -137,32 +170,16 @@
     // older clients of this class because none of the previous APIs depended on
     // having offsets.
     for (Match match in fileMatches) {
-      Iterable<_DiagnosticName> codes = match
+      Iterable<DiagnosticName> codes = match
           .group(1)
           .split(',')
-          .map((String code) => _DiagnosticName(code.trim().toLowerCase(), -1));
+          .map((String code) => DiagnosticName(code.trim().toLowerCase(), -1));
       ignoreInfo._addAllForFile(codes);
     }
     return ignoreInfo;
   }
 }
 
-/// The name and location of a diagnostic name in an ignore comment.
-class _DiagnosticName {
-  /// The name of the diagnostic being ignored.
-  final String name;
-
-  /// The offset of the diagnostic in the source file.
-  final int offset;
-
-  /// Initialize a newly created diagnostic name to have the given [name] and
-  /// [offset].
-  _DiagnosticName(this.name, this.offset);
-
-  /// Return `true` if this diagnostic name matches the given error code.
-  bool matches(String errorCode) => name == errorCode;
-}
-
 extension on CompilationUnit {
   /// Return all of the ignore comments in this compilation unit.
   Iterable<CommentToken> get ignoreComments sync* {
@@ -195,12 +212,16 @@
 extension on CommentToken {
   /// Return the diagnostic names contained in this comment, assuming that it is
   /// a correctly formatted ignore comment.
-  Iterable<_DiagnosticName> get diagnosticNames sync* {
+  Iterable<DiagnosticName> get diagnosticNames sync* {
     int offset = lexeme.indexOf(':') + 1;
     var names = lexeme.substring(offset).split(',');
     offset += this.offset;
     for (var name in names) {
-      yield _DiagnosticName(name.trim().toLowerCase(), offset);
+      var trimmedName = name.trim();
+      if (trimmedName.isNotEmpty) {
+        var innerOffset = name.indexOf(trimmedName);
+        yield DiagnosticName(trimmedName.toLowerCase(), offset + innerOffset);
+      }
       offset += name.length + 1;
     }
   }
diff --git a/pkg/analyzer/lib/src/lint/linter.dart b/pkg/analyzer/lib/src/lint/linter.dart
index abd18b1..d28ca62 100644
--- a/pkg/analyzer/lib/src/lint/linter.dart
+++ b/pkg/analyzer/lib/src/lint/linter.dart
@@ -383,7 +383,7 @@
     }
 
     if (scope != null) {
-      var lookupResult = scope.lookup2(id);
+      var lookupResult = scope.lookup(id);
       var idElement = lookupResult.getter;
       var idEqElement = lookupResult.setter;
 
diff --git a/pkg/analyzer/lib/src/manifest/charcodes.dart b/pkg/analyzer/lib/src/manifest/charcodes.dart
new file mode 100644
index 0000000..9507796
--- /dev/null
+++ b/pkg/analyzer/lib/src/manifest/charcodes.dart
@@ -0,0 +1,42 @@
+// Copyright (c) 2020, 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.
+
+/// Character "'".
+const int $apostrophe = 0x27;
+
+/// "Carriage return" control character.
+const int $cr = 0x0d;
+
+/// Character `-`.
+const int $dash = 0x2d;
+
+/// Character `<`.
+const int $equal = 0x3d;
+
+/// Character `!`.
+const int $exclamation = 0x21;
+
+/// Character `>`.
+const int $gt = 0x3e;
+
+/// "Line feed" control character.
+const int $lf = 0x0a;
+
+/// Character `<`.
+const int $lt = 0x3c;
+
+/// Character `?`.
+const int $question = 0x3f;
+
+/// Character `"`, short name.
+const int $quote = 0x22;
+
+/// Character `/`.
+const int $slash = 0x2f;
+
+/// Space character.
+const int $space = 0x20;
+
+/// "Horizontal Tab" control character, common name.
+const int $tab = 0x09;
diff --git a/pkg/analyzer/lib/src/manifest/manifest_validator.dart b/pkg/analyzer/lib/src/manifest/manifest_validator.dart
index 0096f76..65ac833 100644
--- a/pkg/analyzer/lib/src/manifest/manifest_validator.dart
+++ b/pkg/analyzer/lib/src/manifest/manifest_validator.dart
@@ -5,10 +5,10 @@
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/src/generated/source.dart';
-import 'package:charcode/charcode.dart';
 import 'package:meta/meta.dart';
 import 'package:source_span/source_span.dart';
 
+import 'charcodes.dart';
 import 'manifest_values.dart';
 import 'manifest_warning_code.dart';
 
diff --git a/pkg/analyzer/lib/src/pubspec/pubspec_validator.dart b/pkg/analyzer/lib/src/pubspec/pubspec_validator.dart
index d9cb6c6..fd22ea0 100644
--- a/pkg/analyzer/lib/src/pubspec/pubspec_validator.dart
+++ b/pkg/analyzer/lib/src/pubspec/pubspec_validator.dart
@@ -5,8 +5,10 @@
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/pubspec/pubspec_warning_code.dart';
+import 'package:analyzer/src/util/yaml.dart';
 import 'package:path/path.dart' as path;
 import 'package:source_span/src/span.dart';
 import 'package:yaml/yaml.dart';
@@ -26,9 +28,21 @@
   /// configuration data.
   static const String FLUTTER_FIELD = 'flutter';
 
+  /// The name of the field whose value is a git dependency.
+  static const String GIT_FIELD = 'git';
+
   /// The name of the field whose value is the name of the package.
   static const String NAME_FIELD = 'name';
 
+  /// The name of the field whose value is a path to a package dependency.
+  static const String PATH_FIELD = 'path';
+
+  /// The name of the field whose value is the where to publish the package.
+  static const String PUBLISH_TO_FIELD = 'publish_to';
+
+  /// The name of the field whose value is the version of the package.
+  static const String VERSION_FIELD = 'version';
+
   /// The resource provider used to access the file system.
   final ResourceProvider provider;
 
@@ -85,6 +99,16 @@
     return false;
   }
 
+  String _asString(dynamic node) {
+    if (node is String) {
+      return node;
+    }
+    if (node is YamlScalar && node.value is String) {
+      return node.value as String;
+    }
+    return null;
+  }
+
   /// Return a map whose keys are the names of declared dependencies and whose
   /// values are the specifications of those dependencies. The map is extracted
   /// from the given [contents] using the given [key].
@@ -118,11 +142,26 @@
     Map<dynamic, YamlNode> declaredDevDependencies =
         _getDeclaredDependencies(reporter, contents, DEV_DEPENDENCIES_FIELD);
 
-    for (YamlNode packageName in declaredDevDependencies.keys) {
+    bool isPublishablePackage = false;
+    var version = contents[VERSION_FIELD];
+    if (version != null) {
+      var publishTo = _asString(contents[PUBLISH_TO_FIELD]);
+      if (publishTo != 'none') {
+        isPublishablePackage = true;
+      }
+    }
+
+    for (var dependency in declaredDependencies.entries) {
+      _validatePathEntries(reporter, dependency.value, isPublishablePackage);
+    }
+
+    for (var dependency in declaredDevDependencies.entries) {
+      var packageName = dependency.key;
       if (declaredDependencies.containsKey(packageName)) {
         _reportErrorForNode(reporter, packageName,
             PubspecWarningCode.UNNECESSARY_DEV_DEPENDENCY, [packageName.value]);
       }
+      _validatePathEntries(reporter, dependency.value, false);
     }
   }
 
@@ -193,4 +232,52 @@
           reporter, nameField, PubspecWarningCode.NAME_NOT_STRING);
     }
   }
+
+  /// Validate that `path` entries reference valid paths.
+  ///
+  /// Valid paths are directories that:
+  ///
+  /// 1. exist,
+  /// 2. contain a pubspec.yaml file
+  ///
+  /// If [checkForPathAndGitDeps] is true, `git` or `path` dependencies will
+  /// be marked invalid.
+  void _validatePathEntries(ErrorReporter reporter, YamlNode dependency,
+      bool checkForPathAndGitDeps) {
+    if (dependency is YamlMap) {
+      var pathEntry = _asString(dependency[PATH_FIELD]);
+      if (pathEntry != null) {
+        YamlNode pathKey() => getKey(dependency, PATH_FIELD);
+        YamlNode pathValue() => getValue(dependency, PATH_FIELD);
+        var context = provider.pathContext;
+        var normalizedPath = context.joinAll(path.posix.split(pathEntry));
+        var packageRoot = context.dirname(source.fullName);
+        var dependencyPath = context.join(packageRoot, normalizedPath);
+        dependencyPath = context.absolute(dependencyPath);
+        dependencyPath = context.normalize(dependencyPath);
+        var packageFolder = provider.getFolder(dependencyPath);
+        if (!packageFolder.exists) {
+          _reportErrorForNode(reporter, pathValue(),
+              PubspecWarningCode.PATH_DOES_NOT_EXIST, [pathEntry]);
+        } else {
+          if (!packageFolder
+              .getChild(AnalysisEngine.PUBSPEC_YAML_FILE)
+              .exists) {
+            _reportErrorForNode(reporter, pathValue(),
+                PubspecWarningCode.PATH_PUBSPEC_DOES_NOT_EXIST, [pathEntry]);
+          }
+        }
+        if (checkForPathAndGitDeps) {
+          _reportErrorForNode(reporter, pathKey(),
+              PubspecWarningCode.INVALID_DEPENDENCY, [PATH_FIELD]);
+        }
+      }
+
+      var gitEntry = dependency[GIT_FIELD];
+      if (gitEntry != null && checkForPathAndGitDeps) {
+        _reportErrorForNode(reporter, getKey(dependency, GIT_FIELD),
+            PubspecWarningCode.INVALID_DEPENDENCY, [GIT_FIELD]);
+      }
+    }
+  }
 }
diff --git a/pkg/analyzer/lib/src/pubspec/pubspec_warning_code.dart b/pkg/analyzer/lib/src/pubspec/pubspec_warning_code.dart
index 7e03b42..a93cca0 100644
--- a/pkg/analyzer/lib/src/pubspec/pubspec_warning_code.dart
+++ b/pkg/analyzer/lib/src/pubspec/pubspec_warning_code.dart
@@ -52,6 +52,17 @@
       "The value of the 'flutter' field is expected to be a map.",
       correction: "Try converting the value to be a map.");
 
+  /// A code indicating that a versioned package has an invalid dependency (git
+  /// or path).
+  ///
+  /// Parameters:
+  /// 0: the kind of dependency.
+  static const PubspecWarningCode INVALID_DEPENDENCY = PubspecWarningCode(
+      'INVALID_DEPENDENCY', "Publishable packages can't have {0} dependencies.",
+      correction:
+          "Try adding a 'publish_to: none' entry to mark the package as not "
+          "for publishing or remove the {0} dependency.");
+
   /// A code indicating that the name field is missing.
   static const PubspecWarningCode MISSING_NAME = PubspecWarningCode(
       'MISSING_NAME', "The name field is required but missing.",
@@ -63,6 +74,26 @@
       "The value of the name field is expected to be a string.",
       correction: "Try converting the value to be a string.");
 
+  /// A code indicating that a specified path dependency does not exist.
+  ///
+  /// Parameters:
+  /// 0: the path to the dependency as given in the file.
+  static const PubspecWarningCode PATH_DOES_NOT_EXIST = PubspecWarningCode(
+      'PATH_DOES_NOT_EXIST', "The path {0} does not exist.",
+      correction:
+          "Try creating the referenced path or using a path that exists.");
+
+  /// A code indicating that a specified path dependency points to a directory
+  /// that does not contain a pubspec.
+  ///
+  /// Parameters:
+  /// 0: the path to the dependency as given in the file.
+  static const PubspecWarningCode PATH_PUBSPEC_DOES_NOT_EXIST = PubspecWarningCode(
+      'PATH_PUBSPEC_DOES_NOT_EXIST',
+      "The directory {0} does not contain a pubspec.",
+      correction:
+          "Try creating a pubspec in the referenced directory or using a path that has a pubspec.");
+
   /// A code indicating that a package listed as a dev dependency is also listed
   /// as a normal dependency.
   ///
diff --git a/pkg/analyzer/lib/src/summary2/ast_text_printer.dart b/pkg/analyzer/lib/src/summary2/ast_text_printer.dart
index 995916b..9e1b27e 100644
--- a/pkg/analyzer/lib/src/summary2/ast_text_printer.dart
+++ b/pkg/analyzer/lib/src/summary2/ast_text_printer.dart
@@ -510,6 +510,7 @@
     _token(node.functionKeyword);
     node.typeParameters?.accept(this);
     node.parameters.accept(this);
+    _token(node.question);
   }
 
   @override
@@ -931,6 +932,7 @@
   void visitTypeName(TypeName node) {
     node.name.accept(this);
     node.typeArguments?.accept(this);
+    _token(node.question);
   }
 
   @override
diff --git a/pkg/analyzer/lib/src/summary2/default_types_builder.dart b/pkg/analyzer/lib/src/summary2/default_types_builder.dart
index d06952b..4a8d0c5 100644
--- a/pkg/analyzer/lib/src/summary2/default_types_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/default_types_builder.dart
@@ -255,7 +255,7 @@
 
           if (declaration is ClassElement) {
             recurseParameters(declaration.typeParameters);
-          } else if (declaration is GenericTypeAliasElement) {
+          } else if (declaration is FunctionTypeAliasElement) {
             recurseParameters(declaration.typeParameters);
           }
           visited.remove(startType.element);
diff --git a/pkg/analyzer/lib/src/summary2/linked_element_factory.dart b/pkg/analyzer/lib/src/summary2/linked_element_factory.dart
index b074a62..abfaeec 100644
--- a/pkg/analyzer/lib/src/summary2/linked_element_factory.dart
+++ b/pkg/analyzer/lib/src/summary2/linked_element_factory.dart
@@ -28,7 +28,7 @@
   ) {
     ArgumentError.checkNotNull(analysisContext, 'analysisContext');
     ArgumentError.checkNotNull(analysisSession, 'analysisSession');
-    declareDartCoreDynamicNever();
+    _declareDartCoreDynamicNever();
   }
 
   Reference get dynamicRef {
@@ -95,12 +95,6 @@
     }
   }
 
-  void declareDartCoreDynamicNever() {
-    var dartCoreRef = rootReference.getChild('dart:core');
-    dartCoreRef.getChild('dynamic').element = DynamicElementImpl.instance;
-    dartCoreRef.getChild('Never').element = NeverElementImpl.instance;
-  }
-
   Element elementOfReference(Reference reference) {
     if (reference.element != null) {
       return reference.element;
@@ -147,19 +141,38 @@
   /// We have linked the bundle, and need to disconnect its libraries, so
   /// that the client can re-add the bundle, this time read from bytes.
   void removeBundle(LinkedBundleContext context) {
-    var uriStrList = context.libraryMap.keys.toList();
-    removeLibraries(uriStrList);
+    var uriStrSet = context.libraryMap.keys.toSet();
+    removeLibraries(uriStrSet);
+
+    // This is the bundle with dart:core and dart:async, based on full ASTs.
+    // To link them, the linker set the type provider. We are removing these
+    // libraries, and we should also remove the type provider.
+    if (uriStrSet.contains('dart:core')) {
+      if (!uriStrSet.contains('dart:async')) {
+        throw StateError(
+          'Expected to link dart:core and dart:async together: '
+          '${uriStrSet.toList()}',
+        );
+      }
+      if (libraryMap.isNotEmpty) {
+        throw StateError(
+          'Expected to link dart:core and dart:async first: '
+          '${libraryMap.keys.toList()}',
+        );
+      }
+      analysisContext.clearTypeProvider();
+      _declareDartCoreDynamicNever();
+    }
   }
 
   /// Remove libraries with the specified URIs from the reference tree, and
   /// any session level caches.
-  void removeLibraries(List<String> uriStrList) {
-    for (var uriStr in uriStrList) {
+  void removeLibraries(Set<String> uriStrSet) {
+    for (var uriStr in uriStrSet) {
       libraryMap.remove(uriStr);
       rootReference.removeChild(uriStr);
     }
 
-    var uriStrSet = uriStrList.toSet();
     analysisSession.classHierarchy.removeOfLibraries(uriStrSet);
     analysisSession.inheritanceManager.removeOfLibraries(uriStrSet);
   }
@@ -181,6 +194,12 @@
     }
   }
 
+  void _declareDartCoreDynamicNever() {
+    var dartCoreRef = rootReference.getChild('dart:core');
+    dartCoreRef.getChild('dynamic').element = DynamicElementImpl.instance;
+    dartCoreRef.getChild('Never').element = NeverElementImpl.instance;
+  }
+
   void _setLibraryTypeSystem(LibraryElementImpl libraryElement) {
     // During linking we create libraries when typeProvider is not ready.
     // And if we link dart:core and dart:async, we cannot create it.
@@ -299,7 +318,7 @@
 
     if (reference.name == '@function' && parent2.name == '@typeAlias') {
       var parent = reference.parent;
-      GenericTypeAliasElementImpl alias = elementOfReference(parent);
+      FunctionTypeAliasElementImpl alias = elementOfReference(parent);
       return alias.function;
     }
 
@@ -478,13 +497,13 @@
     return reference.element;
   }
 
-  GenericTypeAliasElementImpl _typeAlias(
+  FunctionTypeAliasElementImpl _typeAlias(
       CompilationUnitElementImpl unit, Reference reference) {
     if (reference.node == null) {
       _indexUnitElementDeclarations(unit);
       assert(reference.node != null, '$reference');
     }
-    GenericTypeAliasElementImpl.forLinkedNode(unit, reference, reference.node);
+    FunctionTypeAliasElementImpl.forLinkedNode(unit, reference, reference.node);
     return reference.element;
   }
 
diff --git a/pkg/analyzer/lib/src/summary2/linked_unit_context.dart b/pkg/analyzer/lib/src/summary2/linked_unit_context.dart
index 24a749f..ff54b07 100644
--- a/pkg/analyzer/lib/src/summary2/linked_unit_context.dart
+++ b/pkg/analyzer/lib/src/summary2/linked_unit_context.dart
@@ -973,7 +973,7 @@
         _typeParameters.remove(--_nextSyntheticTypeParameterId);
       }
 
-      GenericTypeAliasElement typedefElement;
+      FunctionTypeAliasElement typedefElement;
       List<DartType> typedefTypeArguments = const <DartType>[];
       if (linkedType.functionTypedef != 0) {
         typedefElement =
diff --git a/pkg/analyzer/lib/src/summary2/linking_bundle_context.dart b/pkg/analyzer/lib/src/summary2/linking_bundle_context.dart
index 72d0e9d..81cf9c2b 100644
--- a/pkg/analyzer/lib/src/summary2/linking_bundle_context.dart
+++ b/pkg/analyzer/lib/src/summary2/linking_bundle_context.dart
@@ -171,13 +171,13 @@
 
     Element typedefElement;
     List<DartType> typedefTypeArguments = const <DartType>[];
-    if (type.element is GenericTypeAliasElement) {
+    if (type.element is FunctionTypeAliasElement) {
       typedefElement = type.element;
       typedefTypeArguments = type.typeArguments;
     }
-    // TODO(scheglov) Cleanup to always use GenericTypeAliasElement.
+    // TODO(scheglov) Cleanup to always use FunctionTypeAliasElement.
     if (type.element is GenericFunctionTypeElement &&
-        type.element.enclosingElement is GenericTypeAliasElement) {
+        type.element.enclosingElement is FunctionTypeAliasElement) {
       typedefElement = type.element.enclosingElement;
       typedefTypeArguments = type.typeArguments;
     }
diff --git a/pkg/analyzer/lib/src/summary2/named_type_builder.dart b/pkg/analyzer/lib/src/summary2/named_type_builder.dart
index 0bc869d..fdf0073 100644
--- a/pkg/analyzer/lib/src/summary2/named_type_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/named_type_builder.dart
@@ -91,7 +91,7 @@
       );
       type = typeSystem.toLegacyType(type);
       _type = type;
-    } else if (element is GenericTypeAliasElement) {
+    } else if (element is FunctionTypeAliasElement) {
       var rawType = _getRawFunctionType(element);
       if (rawType is FunctionType) {
         var parameters = element.typeParameters;
@@ -255,7 +255,7 @@
     }
   }
 
-  DartType _getRawFunctionType(GenericTypeAliasElementImpl element) {
+  DartType _getRawFunctionType(FunctionTypeAliasElementImpl element) {
     // If the element is not being linked, there is no reason (or a way,
     // because the linked node might be read only partially) to go through
     // its node - all its types have already been built.
diff --git a/pkg/analyzer/lib/src/summary2/reference_resolver.dart b/pkg/analyzer/lib/src/summary2/reference_resolver.dart
index 2844249..451dcb1 100644
--- a/pkg/analyzer/lib/src/summary2/reference_resolver.dart
+++ b/pkg/analyzer/lib/src/summary2/reference_resolver.dart
@@ -259,7 +259,7 @@
     var outerScope = scope;
     var outerReference = reference;
 
-    var element = node.declaredElement as GenericTypeAliasElementImpl;
+    var element = node.declaredElement as FunctionTypeAliasElementImpl;
     reference = element.reference;
 
     _createTypeParameterElements(node.typeParameters);
@@ -340,7 +340,7 @@
     var outerScope = scope;
     var outerReference = reference;
 
-    var element = node.declaredElement as GenericTypeAliasElementImpl;
+    var element = node.declaredElement as FunctionTypeAliasElementImpl;
     reference = element.reference;
 
     _createTypeParameterElements(node.typeParameters);
@@ -443,14 +443,14 @@
     if (typeIdentifier is PrefixedIdentifier) {
       var prefix = typeIdentifier.prefix;
       var prefixName = prefix.name;
-      var prefixElement = scope.lookup2(prefixName).getter;
+      var prefixElement = scope.lookup(prefixName).getter;
       prefix.staticElement = prefixElement;
 
       if (prefixElement is PrefixElement) {
         var nameNode = typeIdentifier.identifier;
         var name = nameNode.name;
 
-        element = prefixElement.scope.lookup2(name).getter;
+        element = prefixElement.scope.lookup(name).getter;
         nameNode.staticElement = element;
       }
     } else {
@@ -462,7 +462,7 @@
         return;
       }
 
-      element = scope.lookup2(name).getter;
+      element = scope.lookup(name).getter;
       nameNode.staticElement = element;
     }
 
diff --git a/pkg/analyzer/lib/src/summary2/variance_builder.dart b/pkg/analyzer/lib/src/summary2/variance_builder.dart
index 704bd83..51d0100 100644
--- a/pkg/analyzer/lib/src/summary2/variance_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/variance_builder.dart
@@ -74,7 +74,7 @@
           }
         }
         return result;
-      } else if (element is GenericTypeAliasElementImpl) {
+      } else if (element is FunctionTypeAliasElementImpl) {
         _functionTypeAliasElement(element);
 
         var result = Variance.unrelated;
@@ -178,7 +178,7 @@
     }
   }
 
-  void _functionTypeAliasElement(GenericTypeAliasElementImpl element) {
+  void _functionTypeAliasElement(FunctionTypeAliasElementImpl element) {
     var node = element.linkedNode;
     if (node is GenericTypeAlias) {
       _genericTypeAlias(node);
diff --git a/pkg/analyzer/lib/src/task/strong/checker.dart b/pkg/analyzer/lib/src/task/strong/checker.dart
index a744bab4..7db1cf7 100644
--- a/pkg/analyzer/lib/src/task/strong/checker.dart
+++ b/pkg/analyzer/lib/src/task/strong/checker.dart
@@ -13,6 +13,7 @@
 import 'package:analyzer/dart/element/type_provider.dart';
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/error/listener.dart';
+import 'package:analyzer/src/dart/ast/extensions.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/inheritance_manager3.dart';
 import 'package:analyzer/src/dart/element/type.dart';
@@ -257,14 +258,16 @@
 
     final init = node.initializers;
     for (int i = 0, last = init.length - 1; i < last; i++) {
-      final node = init[i];
-      if (node is SuperConstructorInvocation) {
+      final initializer = init[i];
+      if (initializer is SuperConstructorInvocation) {
         // TODO(srawlins): Don't report this when
         //  [CompileTimeErrorCode.SUPER_IN_REDIRECTING_CONSTRUCTOR] or
         //  [CompileTimeErrorCode.MULTIPLE_SUPER_INITIALIZERS] is reported for
         //  this constructor.
-        _recordMessage(
-            node, CompileTimeErrorCode.INVALID_SUPER_INVOCATION, [node]);
+        var source = (node.root as CompilationUnit).declaredElement.source;
+        var token = initializer.superKeyword;
+        reporter.onError(AnalysisError(source, token.offset, token.length,
+            CompileTimeErrorCode.INVALID_SUPER_INVOCATION, [initializer]));
       }
     }
   }
@@ -346,7 +349,7 @@
 
   @override
   void visitIndexExpression(IndexExpression node) {
-    var element = node.staticElement;
+    var element = node.writeOrReadElement;
     if (element is MethodElement) {
       var type = element.type;
       // Analyzer should enforce number of parameter types, but check in
@@ -926,6 +929,8 @@
   }
 
   void _recordMessage(AstNode node, ErrorCode errorCode, List arguments) {
+    // TODO(brianwilkerson) Convert this class to use an ErrorReporter so that
+    //  the logic for converting types is in one place.
     arguments = arguments.map((argument) {
       if (argument is DartType) {
         return argument.getDisplayString(withNullability: false);
diff --git a/pkg/analyzer/lib/src/task/strong_mode.dart b/pkg/analyzer/lib/src/task/strong_mode.dart
index 2f72a64..e6a5f7c 100644
--- a/pkg/analyzer/lib/src/task/strong_mode.dart
+++ b/pkg/analyzer/lib/src/task/strong_mode.dart
@@ -153,8 +153,11 @@
         name: setterName,
       );
       if (combinedSetter != null) {
-        var type = combinedSetter.parameters[0].type;
-        return typeSystem.nonNullifyLegacy(type);
+        var parameters = combinedSetter.parameters;
+        if (parameters.isNotEmpty) {
+          var type = parameters[0].type;
+          return typeSystem.nonNullifyLegacy(type);
+        }
       }
       return DynamicTypeImpl.instance;
     }
diff --git a/pkg/analyzer/lib/src/test_utilities/find_element.dart b/pkg/analyzer/lib/src/test_utilities/find_element.dart
index 2b1860b..ce24cde 100644
--- a/pkg/analyzer/lib/src/test_utilities/find_element.dart
+++ b/pkg/analyzer/lib/src/test_utilities/find_element.dart
@@ -220,9 +220,7 @@
 
     for (var type in unitElement.functionTypeAliases) {
       findIn(type.typeParameters);
-      if (type is GenericTypeAliasElement) {
-        findIn(type.function.typeParameters);
-      }
+      findIn(type.function.typeParameters);
     }
 
     for (var class_ in unitElement.types) {
@@ -371,7 +369,7 @@
 
   FunctionTypeAliasElement functionTypeAlias(String name) {
     for (var element in unitElement.functionTypeAliases) {
-      if (element is GenericTypeAliasElement && element.name == name) {
+      if (element.name == name) {
         return element;
       }
     }
diff --git a/pkg/analyzer/lib/src/test_utilities/mock_sdk.dart b/pkg/analyzer/lib/src/test_utilities/mock_sdk.dart
index 0d6aca6..cd29202 100644
--- a/pkg/analyzer/lib/src/test_utilities/mock_sdk.dart
+++ b/pkg/analyzer/lib/src/test_utilities/mock_sdk.dart
@@ -2,8 +2,11 @@
 // 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:convert';
+
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/file_system/memory_file_system.dart';
+import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/dart/sdk/sdk.dart';
 import 'package:analyzer/src/generated/sdk.dart';
 import 'package:analyzer/src/generated/source.dart';
@@ -254,6 +257,11 @@
   static T checkNotNull<T>(T argument, [String, name]) => argument;
 }
 
+// In the SDK this is an abstract class.
+class BigInt implements Comparable<BigInt> {
+  static BigInt parse(String source, {int radix}) => BigInt();
+}
+
 abstract class bool extends Object {
   external const factory bool.fromEnvironment(String name,
       {bool defaultValue: false});
@@ -379,8 +387,12 @@
 
   void forEach(void f(E element));
 
+  E lastWhere(bool test(E element), {E orElse()?});
+
   Iterable<R> map<R>(R f(E e));
 
+  E singleWhere(bool test(E element), {E orElse()?});
+
   List<E> toList({bool growable = true});
 
   Set<E> toSet();
@@ -484,6 +496,8 @@
   int toInt();
 }
 
+abstract class Match {}
+
 class Object {
   const Object();
 
@@ -496,7 +510,9 @@
   external dynamic noSuchMethod(Invocation invocation);
 }
 
-abstract class Pattern {}
+abstract class Pattern {
+  Iterable<Match> allMatches(String string, [int start = 0]);
+}
 
 abstract class RegExp implements Pattern {
   external factory RegExp(String source);
@@ -1086,14 +1102,24 @@
 
   /// Optional [additionalLibraries] should have unique URIs, and paths in
   /// their units are relative (will be put into `sdkRoot/lib`).
+  ///
+  /// [nullSafePackages], if supplied, is a list of packages names that should
+  /// be included in the null safety allow list.
+  ///
+  /// [sdkVersion], if supplied will override the version stored in the mock
+  /// SDK's `version` file.
   MockSdk({
     @required this.resourceProvider,
     List<MockSdkLibrary> additionalLibraries = const [],
+    List<String> nullSafePackages = const [],
+    String sdkVersion,
   }) {
+    sdkVersion ??= '${ExperimentStatus.currentVersion.major}.'
+        '${ExperimentStatus.currentVersion.minor}.0';
     _versionFile = resourceProvider
         .getFolder(resourceProvider.convertPath(sdkRoot))
         .getChildAssumingFile('version');
-    _versionFile.writeAsStringSync('2.10.0');
+    _versionFile.writeAsStringSync(sdkVersion);
 
     for (MockSdkLibrary library in _LIBRARIES) {
       var convertedLibrary = library._toProvider(resourceProvider);
@@ -1150,19 +1176,20 @@
       resourceProvider.convertPath(
         '$sdkRoot/lib/_internal/allowed_experiments.json',
       ),
-      r'''
-{
-  "version": 1,
-  "experimentSets": {
-    "nullSafety": ["non-nullable"]
-  },
-  "sdk": {
-    "default": {
-      "experimentSet": "nullSafety"
-    }
-  }
-}
-''',
+      json.encode({
+        'version': 1,
+        'experimentSets': {
+          'nullSafety': ['non-nullable']
+        },
+        'sdk': {
+          'default': {'experimentSet': 'nullSafety'}
+        },
+        if (nullSafePackages.isNotEmpty)
+          'packages': {
+            for (var package in nullSafePackages)
+              package: {'experimentSet': 'nullSafety'}
+          }
+      }),
     );
   }
 
diff --git a/pkg/analyzer/lib/src/test_utilities/package_config_file_builder.dart b/pkg/analyzer/lib/src/test_utilities/package_config_file_builder.dart
new file mode 100644
index 0000000..4f19b2e
--- /dev/null
+++ b/pkg/analyzer/lib/src/test_utilities/package_config_file_builder.dart
@@ -0,0 +1,103 @@
+// Copyright (c) 2020, 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:meta/meta.dart';
+
+/// Helper for building `.dart_tool/package_config.json` files.
+///
+/// See accepted/future-releases/language-versioning/package-config-file-v2.md
+/// in https://github.com/dart-lang/language/
+class PackageConfigFileBuilder {
+  final List<_PackageDescription> _packages = [];
+
+  /// The [rootPath] will be given to `toUriStr` of [toContent] to produce
+  /// the corresponding `file://` URI, normally a POSIX path.
+  ///
+  /// The [packageUri] is optional, a URI reference, resolved against the
+  /// file URI of the [rootPath]. The result must be inside the [rootPath].
+  void add({
+    @required String name,
+    @required String rootPath,
+    String packageUri = 'lib/',
+    String languageVersion,
+  }) {
+    if (_packages.any((e) => e.name == name)) {
+      throw StateError('Already added: $name');
+    }
+    _packages.add(
+      _PackageDescription(
+        name: name,
+        rootPath: rootPath,
+        packageUri: packageUri,
+        languageVersion: languageVersion,
+      ),
+    );
+  }
+
+  PackageConfigFileBuilder copy() {
+    var copy = PackageConfigFileBuilder();
+    copy._packages.addAll(_packages);
+    return copy;
+  }
+
+  String toContent({
+    @required String Function(String) toUriStr,
+  }) {
+    var buffer = StringBuffer();
+
+    buffer.writeln('{');
+
+    var prefix = ' ' * 2;
+    buffer.writeln('$prefix"configVersion": 2,');
+    buffer.writeln('$prefix"packages": [');
+
+    for (var i = 0; i < _packages.length; i++) {
+      var package = _packages[i];
+
+      var prefix = ' ' * 4;
+      buffer.writeln('$prefix{');
+
+      prefix = ' ' * 6;
+      buffer.writeln('$prefix"name": "${package.name}",');
+
+      var rootUri = toUriStr(package.rootPath);
+      buffer.write('$prefix"rootUri": "$rootUri"');
+
+      if (package.packageUri != null) {
+        buffer.writeln(',');
+        buffer.write('$prefix"packageUri": "${package.packageUri}"');
+      }
+
+      if (package.languageVersion != null) {
+        buffer.writeln(',');
+        buffer.write('$prefix"languageVersion": "${package.languageVersion}"');
+      }
+
+      buffer.writeln();
+
+      prefix = ' ' * 4;
+      buffer.write(prefix);
+      buffer.writeln(i < _packages.length - 1 ? '},' : '}');
+    }
+
+    buffer.writeln('  ]');
+    buffer.writeln('}');
+
+    return buffer.toString();
+  }
+}
+
+class _PackageDescription {
+  final String name;
+  final String rootPath;
+  final String packageUri;
+  final String languageVersion;
+
+  _PackageDescription({
+    @required this.name,
+    @required this.rootPath,
+    @required this.packageUri,
+    @required this.languageVersion,
+  });
+}
diff --git a/pkg/analyzer/lib/src/workspace/bazel.dart b/pkg/analyzer/lib/src/workspace/bazel.dart
index 2c474e6..da3cafa 100644
--- a/pkg/analyzer/lib/src/workspace/bazel.dart
+++ b/pkg/analyzer/lib/src/workspace/bazel.dart
@@ -15,6 +15,7 @@
 import 'package:analyzer/src/util/uri.dart';
 import 'package:analyzer/src/workspace/workspace.dart';
 import 'package:path/path.dart' as path;
+import 'package:pub_semver/pub_semver.dart';
 
 /// Instances of the class `BazelFileUriResolver` resolve `file` URI's by first
 /// resolving file uri's in the expected way, and then by looking in the
@@ -267,11 +268,11 @@
     // Handle files which are given with their location in "bazel-bin", etc.
     // This does not typically happen during usual analysis, but it still could,
     // and it can come up in tests.
-    if ([genfiles, ...binPaths]
-        .any((binPath) => context.isWithin(binPath, folder.path))) {
-      var relative = context.relative(filePath, from: root);
-      return findPackageFor(
-          context.joinAll([root, ...context.split(relative).skip(1)]));
+    for (var binPath in [genfiles, ...binPaths]) {
+      if (context.isWithin(binPath, folder.path)) {
+        return findPackageFor(
+            context.join(root, context.relative(filePath, from: binPath)));
+      }
     }
 
     while (true) {
@@ -502,42 +503,26 @@
   @override
   final BazelWorkspace workspace;
 
-  bool _enabledExperimentsReady = false;
+  bool _buildFileReady = false;
   List<String> _enabledExperiments;
+  Version _languageVersion;
 
   BazelWorkspacePackage(String packageName, this.root, this.workspace)
       : _uriPrefix = 'package:$packageName/';
 
   @override
   List<String> get enabledExperiments {
-    if (_enabledExperimentsReady) {
-      return _enabledExperiments;
-    }
-
-    try {
-      _enabledExperimentsReady = true;
-      var buildContent = workspace.provider
-          .getFolder(root)
-          .getChildAssumingFile('BUILD')
-          .readAsStringSync();
-      var hasNonNullableFlag = buildContent
-          .split('\n')
-          .map((e) => e.trim())
-          .where((e) => !e.startsWith('#'))
-          .map((e) => e.replaceAll(' ', ''))
-          .join()
-          .contains('dart_package(null_safety=True');
-      if (hasNonNullableFlag) {
-        _enabledExperiments = [EnableString.non_nullable];
-      }
-    } on FileSystemException {
-      // ignored
-    }
-
+    _readBuildFile();
     return _enabledExperiments;
   }
 
   @override
+  Version get languageVersion {
+    _readBuildFile();
+    return _languageVersion;
+  }
+
+  @override
   bool contains(Source source) {
     if (source.uri.isScheme('package')) {
       return source.uri.toString().startsWith(_uriPrefix);
@@ -599,4 +584,32 @@
 
     return false;
   }
+
+  void _readBuildFile() {
+    if (_buildFileReady) {
+      return;
+    }
+
+    try {
+      _buildFileReady = true;
+      var buildContent = workspace.provider
+          .getFolder(root)
+          .getChildAssumingFile('BUILD')
+          .readAsStringSync();
+      var hasNonNullableFlag = buildContent
+          .split('\n')
+          .map((e) => e.trim())
+          .where((e) => !e.startsWith('#'))
+          .map((e) => e.replaceAll(' ', ''))
+          .join()
+          .contains('dart_package(null_safety=True');
+      if (hasNonNullableFlag) {
+        _enabledExperiments = [EnableString.non_nullable];
+      } else {
+        _languageVersion = Version.parse('2.9.0');
+      }
+    } on FileSystemException {
+      // ignored
+    }
+  }
 }
diff --git a/pkg/analyzer/lib/src/workspace/workspace.dart b/pkg/analyzer/lib/src/workspace/workspace.dart
index 0b83b88..777f116 100644
--- a/pkg/analyzer/lib/src/workspace/workspace.dart
+++ b/pkg/analyzer/lib/src/workspace/workspace.dart
@@ -7,6 +7,7 @@
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/summary/package_bundle_reader.dart';
 import 'package:analyzer/src/workspace/bazel.dart';
+import 'package:pub_semver/pub_semver.dart';
 
 /// Abstract superclass of classes that provide information about the workspace
 /// in which analysis is being performed.
@@ -44,6 +45,15 @@
   /// Return `null` if this package does not have enabled experiments.
   List<String> get enabledExperiments => null;
 
+  /// Return the language version override for all files in the package.
+  ///
+  /// We use [enabledExperiments] to enable Null Safety for selected packages
+  /// when it is not enabled by default in the SDK, and use [languageVersion]
+  /// to disable Null Safety for packages that are not migrated yet.
+  ///
+  /// Return `null` if this package does not have a language version override.
+  Version get languageVersion => null;
+
   String get root;
 
   Workspace get workspace;
diff --git a/pkg/analyzer/pubspec.yaml b/pkg/analyzer/pubspec.yaml
index 6cb8815..0ad2ec6 100644
--- a/pkg/analyzer/pubspec.yaml
+++ b/pkg/analyzer/pubspec.yaml
@@ -1,5 +1,5 @@
 name: analyzer
-version: 0.40.4
+version: 0.41.0
 description: This package provides a library that performs static analysis of Dart code.
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/analyzer
 
@@ -7,9 +7,8 @@
   sdk: '>=2.7.0 <3.0.0'
 
 dependencies:
-  _fe_analyzer_shared: ^11.0.0
+  _fe_analyzer_shared: ^12.0.0
   args: ^1.0.0
-  charcode: ^1.1.2
   cli_util: '>=0.1.4 <0.3.0'
   collection: ^1.10.1
   convert: ^2.0.0
diff --git a/pkg/analyzer/test/dart/analysis/from_environment_evaluator_test.dart b/pkg/analyzer/test/dart/analysis/from_environment_evaluator_test.dart
index 23deeb1..47d6dcb 100644
--- a/pkg/analyzer/test/dart/analysis/from_environment_evaluator_test.dart
+++ b/pkg/analyzer/test/dart/analysis/from_environment_evaluator_test.dart
@@ -22,8 +22,8 @@
 class FromEnvironmentEvaluatorTest {
   static const String _defaultValue = 'defaultValue';
 
-  TypeProvider typeProvider;
-  TypeSystemImpl typeSystem;
+  /*late final*/ TypeProvider typeProvider;
+  /*late final*/ TypeSystemImpl typeSystem;
 
   DartObjectImpl get _boolValueFalse {
     return DartObjectImpl(
diff --git a/pkg/analyzer/test/dart/analysis/utilities_test.dart b/pkg/analyzer/test/dart/analysis/utilities_test.dart
index 745f0fe..0c2dbf0 100644
--- a/pkg/analyzer/test/dart/analysis/utilities_test.dart
+++ b/pkg/analyzer/test/dart/analysis/utilities_test.dart
@@ -59,7 +59,7 @@
     String content = '''
 void main() => print('Hello, world!')
 ''';
-    String expectedPath;
+    /*late*/ String expectedPath;
     ParseStringResult result =
         _withMemoryFile(content, (resourceProvider, path) {
       expectedPath = path;
diff --git a/pkg/analyzer/test/dart/ast/ast_test.dart b/pkg/analyzer/test/dart/ast/ast_test.dart
index bad835b..635d7ff 100644
--- a/pkg/analyzer/test/dart/ast/ast_test.dart
+++ b/pkg/analyzer/test/dart/ast/ast_test.dart
@@ -961,29 +961,29 @@
   }
 
   void test_findPrevious_basic_class() {
-    ClassDeclaration clazz = unit.declarations[0];
+    var clazz = unit.declarations[0] as ClassDeclaration;
     expect(clazz.findPrevious(findToken('A')).lexeme, 'class');
   }
 
   void test_findPrevious_basic_method() {
-    ClassDeclaration clazz = unit.declarations[0];
-    MethodDeclaration method = clazz.members[0];
+    var clazz = unit.declarations[0] as ClassDeclaration;
+    var method = clazz.members[0] as MethodDeclaration;
     expect(method.findPrevious(findToken('foo')).lexeme, 'B');
   }
 
   void test_findPrevious_basic_statement() {
-    ClassDeclaration clazz = unit.declarations[0];
-    MethodDeclaration method = clazz.members[0];
-    BlockFunctionBody body = method.body;
+    var clazz = unit.declarations[0] as ClassDeclaration;
+    var method = clazz.members[0] as MethodDeclaration;
+    var body = method.body as BlockFunctionBody;
     Statement statement = body.block.statements[0];
     expect(statement.findPrevious(findToken('bar')).lexeme, 'return');
     expect(statement.findPrevious(findToken(';')).lexeme, 'bar');
   }
 
   void test_findPrevious_missing() {
-    ClassDeclaration clazz = unit.declarations[0];
-    MethodDeclaration method = clazz.members[0];
-    BlockFunctionBody body = method.body;
+    var clazz = unit.declarations[0] as ClassDeclaration;
+    var method = clazz.members[0] as MethodDeclaration;
+    var body = method.body as BlockFunctionBody;
     Statement statement = body.block.statements[0];
 
     GatheringErrorListener listener = GatheringErrorListener(checkRanges: true);
@@ -1000,15 +1000,15 @@
   }
 
   void test_findPrevious_parent_method() {
-    ClassDeclaration clazz = unit.declarations[0];
-    MethodDeclaration method = clazz.members[0];
+    var clazz = unit.declarations[0] as ClassDeclaration;
+    var method = clazz.members[0] as MethodDeclaration;
     expect(method.findPrevious(findToken('B')).lexeme, '{');
   }
 
   void test_findPrevious_parent_statement() {
-    ClassDeclaration clazz = unit.declarations[0];
-    MethodDeclaration method = clazz.members[0];
-    BlockFunctionBody body = method.body;
+    var clazz = unit.declarations[0] as ClassDeclaration;
+    var method = clazz.members[0] as MethodDeclaration;
+    var body = method.body as BlockFunctionBody;
     Statement statement = body.block.statements[0];
     expect(statement.findPrevious(findToken('return')).lexeme, '{');
   }
@@ -1019,8 +1019,8 @@
   }
 
   void test_findPrevious_sibling_method() {
-    ClassDeclaration clazz = unit.declarations[0];
-    MethodDeclaration method = clazz.members[1];
+    var clazz = unit.declarations[0] as ClassDeclaration;
+    var method = clazz.members[1] as MethodDeclaration;
     expect(method.findPrevious(findToken('D')).lexeme, '}');
   }
 }
diff --git a/pkg/analyzer/test/error/error_test.dart b/pkg/analyzer/test/error/error_test.dart
index d091b8e..2e48e60 100644
--- a/pkg/analyzer/test/error/error_test.dart
+++ b/pkg/analyzer/test/error/error_test.dart
@@ -39,12 +39,13 @@
             extendsClause.superclass.name.name == 'ErrorCode') {
           String className = declaration.name.name;
           for (ClassMember member in declaration.members) {
-            if (member is FieldDeclaration &&
-                member.isStatic &&
-                (member.fields.type == null ? bad() : true) &&
-                member.fields.type.toSource() == className) {
-              String fieldName = member.fields.variables[0].name.name;
-              declaredCodes.add(className + '.' + fieldName);
+            if (member is FieldDeclaration && member.isStatic) {
+              var fields = member.fields;
+              if ((fields.type == null ? bad() : true) &&
+                  fields.type.toSource() == className) {
+                String fieldName = fields.variables[0].name.name;
+                declaredCodes.add(className + '.' + fieldName);
+              }
             }
           }
         }
@@ -57,13 +58,13 @@
     List<String> listedCodes = <String>[];
     CompilationUnit listingUnit = parseFile(['lib', 'error', 'error.dart']);
     TopLevelVariableDeclaration declaration = listingUnit.declarations
+        .whereType<TopLevelVariableDeclaration>()
         .firstWhere(
             (member) =>
-                member is TopLevelVariableDeclaration &&
                 member.variables.variables[0].name.name == 'errorCodeValues',
             orElse: () => null);
     ListLiteral listLiteral = declaration.variables.variables[0].initializer;
-    for (PrefixedIdentifier element in listLiteral.elements) {
+    for (var element in listLiteral.elements.cast<PrefixedIdentifier>()) {
       listedCodes.add(element.name);
     }
     return listedCodes;
diff --git a/pkg/analyzer/test/file_system/file_system_test_support.dart b/pkg/analyzer/test/file_system/file_system_test_support.dart
index fe6b6c9..96db954 100644
--- a/pkg/analyzer/test/file_system/file_system_test_support.dart
+++ b/pkg/analyzer/test/file_system/file_system_test_support.dart
@@ -19,17 +19,17 @@
   String get defaultFileContent;
 
   /// A path to a file within the [defaultFolderPath] that can be used by tests.
-  String get defaultFilePath;
+  String /*!*/ get defaultFilePath;
 
   /// A path to a folder within the [tempPath] that can be used by tests.
-  String get defaultFolderPath;
+  String /*!*/ get defaultFolderPath;
 
   /// Return the resource provider to be used by the tests.
   ResourceProvider get provider;
 
   /// The absolute path to the temporary directory in which all of the tests are
   /// to work.
-  String get tempPath;
+  String /*!*/ get tempPath;
 
   /// Return a file accessed through the resource provider. If [exists] is
   /// `true` then the returned file will exist, otherwise it won't. If [content]
diff --git a/pkg/analyzer/test/file_system/memory_file_system_test.dart b/pkg/analyzer/test/file_system/memory_file_system_test.dart
index 4b25786..c5a929b 100644
--- a/pkg/analyzer/test/file_system/memory_file_system_test.dart
+++ b/pkg/analyzer/test/file_system/memory_file_system_test.dart
@@ -34,15 +34,15 @@
   /// The absolute path to the temporary directory in which all of the tests are
   /// to work.
   @override
-  String tempPath;
+  /*late*/ String tempPath;
 
   /// A path to a folder within the [tempPath] that can be used by tests.
   @override
-  String defaultFolderPath;
+  /*late*/ String defaultFolderPath;
 
   /// A path to a file within the [defaultFolderPath] that can be used by tests.
   @override
-  String defaultFilePath;
+  /*late*/ String defaultFilePath;
 
   /// The content used for the file at the [defaultFilePath] if it is created
   /// and no other content is provided.
@@ -104,8 +104,8 @@
 
 @reflectiveTest
 class MemoryFileSourceExistingTest extends BaseTest {
-  String sourcePath;
-  Source source;
+  /*late*/ String sourcePath;
+  /*late*/ Source source;
 
   @override
   setUp() {
@@ -184,8 +184,8 @@
 
 @reflectiveTest
 class MemoryFileSourceNotExistingTest extends BaseTest {
-  String sourcePath;
-  Source source;
+  /*late*/ String sourcePath;
+  /*late*/ Source source;
 
   @override
   setUp() {
@@ -516,7 +516,7 @@
 
   _watchingFolder(
       String path, Function(List<WatchEvent> changesReceived) test) {
-    Folder folder = provider.getResource(path);
+    var folder = provider.getResource(path) as Folder;
     var changesReceived = <WatchEvent>[];
     folder.changes.listen(changesReceived.add);
     return test(changesReceived);
diff --git a/pkg/analyzer/test/file_system/overlay_file_system_test.dart b/pkg/analyzer/test/file_system/overlay_file_system_test.dart
index 5819681..b93e057 100644
--- a/pkg/analyzer/test/file_system/overlay_file_system_test.dart
+++ b/pkg/analyzer/test/file_system/overlay_file_system_test.dart
@@ -819,11 +819,11 @@
 }
 
 class OverlayTestSupport {
-  MemoryResourceProvider baseProvider;
-  OverlayResourceProvider provider;
+  /*late*/ MemoryResourceProvider baseProvider;
+  /*late*/ OverlayResourceProvider provider;
 
-  String defaultFolderPath;
-  String defaultFilePath;
+  /*late*/ String defaultFolderPath;
+  /*late*/ String defaultFilePath;
 
   void setUp() {
     baseProvider = MemoryResourceProvider();
diff --git a/pkg/analyzer/test/file_system/physical_file_system_test.dart b/pkg/analyzer/test/file_system/physical_file_system_test.dart
index 60e698a..81e3c67 100644
--- a/pkg/analyzer/test/file_system/physical_file_system_test.dart
+++ b/pkg/analyzer/test/file_system/physical_file_system_test.dart
@@ -29,20 +29,20 @@
 
   /// A temporary directory on disk. All files and folders created by the tests
   /// should be inside this directory.
-  io.Directory tempDirectory;
+  /*late*/ io.Directory tempDirectory;
 
   /// The absolute path to the [tempDirectory]. This path will contain a
   /// symbolic link on some operating systems.
   @override
-  String tempPath;
+  /*late*/ String tempPath;
 
   /// A path to a folder within the [tempDirectory] that can be used by tests.
   @override
-  String defaultFolderPath;
+  /*late*/ String defaultFolderPath;
 
   /// A path to a file within the [defaultFolderPath] that can be used by tests.
   @override
-  String defaultFilePath;
+  /*late*/ String defaultFilePath;
 
   /// The content used for the file at the [defaultFilePath] if it is created
   /// and no other content is provided.
diff --git a/pkg/analyzer/test/file_system/physical_resource_provider_watch_test.dart b/pkg/analyzer/test/file_system/physical_resource_provider_watch_test.dart
index 71ab2b6..c08137e 100644
--- a/pkg/analyzer/test/file_system/physical_resource_provider_watch_test.dart
+++ b/pkg/analyzer/test/file_system/physical_resource_provider_watch_test.dart
@@ -143,7 +143,8 @@
     // start watching are sometimes misclassified as happening just after
     // we start watching.
     return _delayed(() {
-      File file = PhysicalResourceProvider.INSTANCE.getResource(filePath);
+      var file =
+          PhysicalResourceProvider.INSTANCE.getResource(filePath) as File;
       var changesReceived = <WatchEvent>[];
       var subscription = file.changes.listen(changesReceived.add);
       // Delay running the rest of the test to allow file.changes propagate.
@@ -160,7 +161,8 @@
     // start watching are sometimes misclassified as happening just after
     // we start watching.
     return _delayed(() {
-      Folder folder = PhysicalResourceProvider.INSTANCE.getResource(filePath);
+      var folder =
+          PhysicalResourceProvider.INSTANCE.getResource(filePath) as Folder;
       var changesReceived = <WatchEvent>[];
       var subscription = folder.changes.listen(changesReceived.add);
       // Delay running the rest of the test to allow folder.changes to
diff --git a/pkg/analyzer/test/file_system/resource_uri_resolver_test.dart b/pkg/analyzer/test/file_system/resource_uri_resolver_test.dart
index 7cab103..657586c 100644
--- a/pkg/analyzer/test/file_system/resource_uri_resolver_test.dart
+++ b/pkg/analyzer/test/file_system/resource_uri_resolver_test.dart
@@ -16,7 +16,7 @@
 
 @reflectiveTest
 class ResourceUriResolverTest with ResourceProviderMixin {
-  ResourceUriResolver resolver;
+  /*late*/ ResourceUriResolver resolver;
 
   void setUp() {
     resolver = ResourceUriResolver(resourceProvider);
diff --git a/pkg/analyzer/test/generated/all_the_rest_test.dart b/pkg/analyzer/test/generated/all_the_rest_test.dart
index 3dbf51c..0706fb6 100644
--- a/pkg/analyzer/test/generated/all_the_rest_test.dart
+++ b/pkg/analyzer/test/generated/all_the_rest_test.dart
@@ -392,7 +392,7 @@
 }
 
 class _SimpleDartSdkTest with ResourceProviderMixin {
-  DartSdk sdk;
+  /*late*/ DartSdk sdk;
 
   void setUp() {
     newFile('/sdk/lib/_internal/sdk_library_metadata/lib/libraries.dart',
diff --git a/pkg/analyzer/test/generated/element_resolver_test.dart b/pkg/analyzer/test/generated/element_resolver_test.dart
index 75588bf..53e2e9a 100644
--- a/pkg/analyzer/test/generated/element_resolver_test.dart
+++ b/pkg/analyzer/test/generated/element_resolver_test.dart
@@ -58,10 +58,10 @@
         SimpleIdentifier name2,
         SimpleIdentifier name3,
         Element annotationElement) {
-      expect(name1, isNotNull);
+      assert(name1 != null);
+      assert(name2 != null);
       expect(name1.staticElement, isClassElement);
       expect(name1.staticElement.displayName, 'A');
-      expect(name2, isNotNull);
       expect(name2.staticElement, isConstructorElement);
       expect(name2.staticElement.displayName, 'named');
       expect(name3, isNull);
@@ -87,13 +87,13 @@
         SimpleIdentifier name2,
         SimpleIdentifier name3,
         Element annotationElement) {
-      expect(name1, isNotNull);
+      assert(name1 != null);
+      assert(name2 != null);
+      assert(name3 != null);
       expect(name1.staticElement, isPrefixElement);
       expect(name1.staticElement.displayName, 'p');
-      expect(name2, isNotNull);
       expect(name2.staticElement, isClassElement);
       expect(name2.staticElement.displayName, 'A');
-      expect(name3, isNotNull);
       expect(name3.staticElement, isConstructorElement);
       expect(name3.staticElement.displayName, 'named');
       if (annotationElement is ConstructorElement) {
@@ -118,13 +118,13 @@
         SimpleIdentifier name2,
         SimpleIdentifier name3,
         Element annotationElement) {
-      expect(name1, isNotNull);
+      assert(name1 != null);
+      assert(name2 != null);
+      assert(name3 != null);
       expect(name1.staticElement, isPrefixElement);
       expect(name1.staticElement.displayName, 'p');
-      expect(name2, isNotNull);
       expect(name2.staticElement, isClassElement);
       expect(name2.staticElement.displayName, 'A');
-      expect(name3, isNotNull);
       expect(name3.staticElement, isPropertyAccessorElement);
       expect(name3.staticElement.displayName, 'V');
       if (annotationElement is PropertyAccessorElement) {
@@ -148,10 +148,10 @@
         SimpleIdentifier name2,
         SimpleIdentifier name3,
         Element annotationElement) {
-      expect(name1, isNotNull);
+      assert(name1 != null);
+      assert(name2 != null);
       expect(name1.staticElement, isPrefixElement);
       expect(name1.staticElement.displayName, 'p');
-      expect(name2, isNotNull);
       expect(name2.staticElement, isClassElement);
       expect(name2.staticElement.displayName, 'A');
       expect(name3, isNull);
@@ -176,10 +176,10 @@
         SimpleIdentifier name2,
         SimpleIdentifier name3,
         Element annotationElement) {
-      expect(name1, isNotNull);
+      assert(name1 != null);
+      assert(name2 != null);
       expect(name1.staticElement, isClassElement);
       expect(name1.staticElement.displayName, 'A');
-      expect(name2, isNotNull);
       expect(name2.staticElement, isPropertyAccessorElement);
       expect(name2.staticElement.displayName, 'V');
       expect(name3, isNull);
@@ -204,7 +204,7 @@
         SimpleIdentifier name2,
         SimpleIdentifier name3,
         Element annotationElement) {
-      expect(name1, isNotNull);
+      assert(name1 != null);
       expect(name1.staticElement, isClassElement);
       expect(name1.staticElement.displayName, 'A');
       expect(name2, isNull);
@@ -228,7 +228,7 @@
         SimpleIdentifier name2,
         SimpleIdentifier name3,
         Element annotationElement) {
-      expect(name1, isNotNull);
+      assert(name1 != null);
       expect(name1.staticElement, isPropertyAccessorElement);
       expect(name1.staticElement.displayName, 'V');
       expect(name2, isNull);
@@ -252,10 +252,10 @@
         SimpleIdentifier name2,
         SimpleIdentifier name3,
         Element annotationElement) {
-      expect(name1, isNotNull);
+      assert(name1 != null);
+      assert(name2 != null);
       expect(name1.staticElement, isPrefixElement);
       expect(name1.staticElement.displayName, 'p');
-      expect(name2, isNotNull);
       expect(name2.staticElement, isPropertyAccessorElement);
       expect(name2.staticElement.displayName, 'V');
       expect(name3, isNull);
@@ -299,19 +299,19 @@
 @reflectiveTest
 class ElementResolverTest with ResourceProviderMixin, ElementsTypesMixin {
   /// The error listener to which errors will be reported.
-  GatheringErrorListener _listener;
+  /*late*/ GatheringErrorListener _listener;
 
   /// The type provider used to access the types.
-  TypeProvider _typeProvider;
+  /*late*/ TypeProvider _typeProvider;
 
   /// The library containing the code being resolved.
-  LibraryElementImpl _definingLibrary;
+  /*late*/ LibraryElementImpl _definingLibrary;
 
   /// The resolver visitor that maintains the state for the resolver.
-  ResolverVisitor _visitor;
+  /*late*/ ResolverVisitor _visitor;
 
   /// The resolver being used to resolve the test cases.
-  ElementResolver _resolver;
+  /*late*/ ElementResolver _resolver;
 
   @override
   TypeProvider get typeProvider => _typeProvider;
diff --git a/pkg/analyzer/test/generated/elements_types_mixin.dart b/pkg/analyzer/test/generated/elements_types_mixin.dart
index b78f503..0476d18 100644
--- a/pkg/analyzer/test/generated/elements_types_mixin.dart
+++ b/pkg/analyzer/test/generated/elements_types_mixin.dart
@@ -91,17 +91,17 @@
 
   InterfaceTypeImpl get nullNone {
     var element = typeProvider.nullType.element;
-    return interfaceTypeNone(element);
+    return interfaceTypeNone(element) as InterfaceTypeImpl;
   }
 
   InterfaceTypeImpl get nullQuestion {
     var element = typeProvider.nullType.element;
-    return interfaceTypeQuestion(element);
+    return interfaceTypeQuestion(element) as InterfaceTypeImpl;
   }
 
   InterfaceTypeImpl get nullStar {
     var element = typeProvider.nullType.element;
-    return interfaceTypeStar(element);
+    return interfaceTypeStar(element) as InterfaceTypeImpl;
   }
 
   InterfaceType get numNone {
@@ -151,7 +151,7 @@
 
   LibraryElementImpl get testLibrary => null;
 
-  TypeProvider get typeProvider;
+  TypeProvider /*!*/ get typeProvider;
 
   VoidTypeImpl get voidNone => VoidTypeImpl.instance;
 
@@ -215,6 +215,16 @@
     );
   }
 
+  FunctionTypeAliasElementImpl functionTypeAlias({
+    @required String name,
+    List<TypeParameterElement> typeParameters = const [],
+    @required GenericFunctionTypeElement function,
+  }) {
+    return FunctionTypeAliasElementImpl(name, 0)
+      ..typeParameters = typeParameters
+      ..function = function as GenericFunctionTypeElementImpl;
+  }
+
   FunctionType functionTypeAliasType(
     FunctionTypeAliasElement element, {
     List<DartType> typeArguments = const [],
@@ -269,42 +279,42 @@
     return typeProvider.futureElement.instantiate(
       typeArguments: [type],
       nullabilitySuffix: NullabilitySuffix.none,
-    );
+    ) as InterfaceTypeImpl;
   }
 
   InterfaceTypeImpl futureOrNone(DartType type) {
     return typeProvider.futureOrElement.instantiate(
       typeArguments: [type],
       nullabilitySuffix: NullabilitySuffix.none,
-    );
+    ) as InterfaceTypeImpl;
   }
 
   InterfaceTypeImpl futureOrQuestion(DartType type) {
     return typeProvider.futureOrElement.instantiate(
       typeArguments: [type],
       nullabilitySuffix: NullabilitySuffix.question,
-    );
+    ) as InterfaceTypeImpl;
   }
 
   InterfaceTypeImpl futureOrStar(DartType type) {
     return typeProvider.futureOrElement.instantiate(
       typeArguments: [type],
       nullabilitySuffix: NullabilitySuffix.star,
-    );
+    ) as InterfaceTypeImpl;
   }
 
   InterfaceTypeImpl futureQuestion(DartType type) {
     return typeProvider.futureElement.instantiate(
       typeArguments: [type],
       nullabilitySuffix: NullabilitySuffix.question,
-    );
+    ) as InterfaceTypeImpl;
   }
 
   InterfaceTypeImpl futureStar(DartType type) {
     return typeProvider.futureElement.instantiate(
       typeArguments: [type],
       nullabilitySuffix: NullabilitySuffix.star,
-    );
+    ) as InterfaceTypeImpl;
   }
 
   DartType futureType(DartType T) {
@@ -324,16 +334,6 @@
     return result;
   }
 
-  GenericTypeAliasElementImpl genericTypeAlias({
-    @required String name,
-    List<TypeParameterElement> typeParameters = const [],
-    @required GenericFunctionTypeElement function,
-  }) {
-    return GenericTypeAliasElementImpl(name, 0)
-      ..typeParameters = typeParameters
-      ..function = function;
-  }
-
   InterfaceType interfaceType(
     ClassElement element, {
     List<DartType> typeArguments = const [],
diff --git a/pkg/analyzer/test/generated/parser_fasta_test.dart b/pkg/analyzer/test/generated/parser_fasta_test.dart
index 3046a23..d054a17 100644
--- a/pkg/analyzer/test/generated/parser_fasta_test.dart
+++ b/pkg/analyzer/test/generated/parser_fasta_test.dart
@@ -61,11 +61,11 @@
       sdkVersion: '2.0.0', additionalFeatures: [Feature.triple_shift]);
 
   void test_parse_member_called_late() {
-    CompilationUnitImpl unit = parseCompilationUnit(
+    var unit = parseCompilationUnit(
         'class C { void late() { new C().late(); } }',
         featureSet: nonNullable);
-    ClassDeclaration declaration = unit.declarations[0];
-    MethodDeclaration method = declaration.members[0];
+    var declaration = unit.declarations[0] as ClassDeclaration;
+    var method = declaration.members[0] as MethodDeclaration;
 
     expect(method.documentationComment, isNull);
     expect(method.externalKeyword, isNull);
@@ -78,9 +78,9 @@
     expect(method.parameters, isNotNull);
     expect(method.body, isNotNull);
 
-    BlockFunctionBody body = method.body;
-    ExpressionStatement statement = body.block.statements[0];
-    MethodInvocation invocation = statement.expression;
+    var body = method.body as BlockFunctionBody;
+    var statement = body.block.statements[0] as ExpressionStatement;
+    var invocation = statement.expression as MethodInvocation;
     expect(invocation.operator.lexeme, '.');
     expect(invocation.toSource(), 'new C().late()');
   }
@@ -98,11 +98,11 @@
   }
 
   void test_parseClassMember_operator_gtgtgt() {
-    CompilationUnitImpl unit = parseCompilationUnit(
+    var unit = parseCompilationUnit(
         'class C { bool operator >>>(other) => false; }',
         featureSet: tripleShift);
-    ClassDeclaration declaration = unit.declarations[0];
-    MethodDeclaration method = declaration.members[0];
+    var declaration = unit.declarations[0] as ClassDeclaration;
+    var method = declaration.members[0] as MethodDeclaration;
 
     expect(method.documentationComment, isNull);
     expect(method.externalKeyword, isNull);
@@ -117,20 +117,20 @@
   }
 
   void test_parseClassMember_operator_gtgtgteq() {
-    CompilationUnitImpl unit = parseCompilationUnit(
+    var unit = parseCompilationUnit(
         'class C { foo(int value) { x >>>= value; } }',
         featureSet: tripleShift);
-    ClassDeclaration declaration = unit.declarations[0];
-    MethodDeclaration method = declaration.members[0];
-    BlockFunctionBody blockFunctionBody = method.body;
+    var declaration = unit.declarations[0] as ClassDeclaration;
+    var method = declaration.members[0] as MethodDeclaration;
+    var blockFunctionBody = method.body as BlockFunctionBody;
     NodeList<Statement> statements = blockFunctionBody.block.statements;
     expect(statements, hasLength(1));
-    ExpressionStatement statement = statements[0];
-    AssignmentExpression assignment = statement.expression;
-    SimpleIdentifier leftHandSide = assignment.leftHandSide;
+    var statement = statements[0] as ExpressionStatement;
+    var assignment = statement.expression as AssignmentExpression;
+    var leftHandSide = assignment.leftHandSide as SimpleIdentifier;
     expect(leftHandSide.name, 'x');
     expect(assignment.operator.lexeme, '>>>=');
-    SimpleIdentifier rightHandSide = assignment.rightHandSide;
+    var rightHandSide = assignment.rightHandSide as SimpleIdentifier;
     expect(rightHandSide.name, 'value');
   }
 
@@ -178,7 +178,7 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isFieldDeclaration);
-    FieldDeclaration field = member;
+    var field = member as FieldDeclaration;
     expect(field.abstractKeyword, isNotNull);
   }
 
@@ -190,7 +190,7 @@
       expectedError(ParserErrorCode.ABSTRACT_EXTERNAL_FIELD, 0, 8),
     ]);
     expect(member, isFieldDeclaration);
-    FieldDeclaration field = member;
+    var field = member as FieldDeclaration;
     expect(field.abstractKeyword, isNotNull);
     expect(field.externalKeyword, isNotNull);
   }
@@ -203,7 +203,7 @@
       expectedError(ParserErrorCode.ABSTRACT_LATE_FIELD, 0, 8),
     ]);
     expect(member, isFieldDeclaration);
-    FieldDeclaration field = member;
+    var field = member as FieldDeclaration;
     expect(field.abstractKeyword, isNotNull);
   }
 
@@ -215,7 +215,7 @@
       expectedError(ParserErrorCode.ABSTRACT_LATE_FIELD, 0, 8),
     ]);
     expect(member, isFieldDeclaration);
-    FieldDeclaration field = member;
+    var field = member as FieldDeclaration;
     expect(field.abstractKeyword, isNotNull);
   }
 
@@ -227,7 +227,7 @@
       expectedError(ParserErrorCode.ABSTRACT_STATIC_FIELD, 0, 8),
     ]);
     expect(member, isFieldDeclaration);
-    FieldDeclaration field = member;
+    var field = member as FieldDeclaration;
     expect(field.abstractKeyword, isNotNull);
   }
 
@@ -239,7 +239,7 @@
       expectedError(ParserErrorCode.CONFLICTING_MODIFIERS, 6, 4),
     ]);
     expect(member, isFieldDeclaration);
-    FieldDeclaration field = member;
+    var field = member as FieldDeclaration;
     expect(field.covariantKeyword, isNull);
     expect(field.documentationComment, isNull);
     expect(field.metadata, hasLength(0));
@@ -263,7 +263,7 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isFieldDeclaration);
-    FieldDeclaration field = member;
+    var field = member as FieldDeclaration;
     expect(field.externalKeyword, isNotNull);
   }
 
@@ -275,7 +275,7 @@
       expectedError(ParserErrorCode.ABSTRACT_EXTERNAL_FIELD, 9, 8),
     ]);
     expect(member, isFieldDeclaration);
-    FieldDeclaration field = member;
+    var field = member as FieldDeclaration;
     expect(field.abstractKeyword, isNotNull);
     expect(field.externalKeyword, isNotNull);
   }
@@ -288,7 +288,7 @@
       expectedError(ParserErrorCode.EXTERNAL_LATE_FIELD, 0, 8),
     ]);
     expect(member, isFieldDeclaration);
-    FieldDeclaration field = member;
+    var field = member as FieldDeclaration;
     expect(field.externalKeyword, isNotNull);
   }
 
@@ -300,7 +300,7 @@
       expectedError(ParserErrorCode.EXTERNAL_LATE_FIELD, 0, 8),
     ]);
     expect(member, isFieldDeclaration);
-    FieldDeclaration field = member;
+    var field = member as FieldDeclaration;
     expect(field.externalKeyword, isNotNull);
   }
 
@@ -310,7 +310,7 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isFieldDeclaration);
-    FieldDeclaration field = member;
+    var field = member as FieldDeclaration;
     expect(field.externalKeyword, isNotNull);
   }
 
@@ -322,7 +322,7 @@
     ]);
     expect(member, isNotNull);
     expect(member, isFieldDeclaration);
-    FieldDeclaration field = member;
+    var field = member as FieldDeclaration;
     expect(field.covariantKeyword, isNull);
     expect(field.documentationComment, isNull);
     expect(field.metadata, hasLength(0));
@@ -346,7 +346,7 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isFieldDeclaration);
-    FieldDeclaration field = member;
+    var field = member as FieldDeclaration;
     expect(field.covariantKeyword, isNull);
     expect(field.documentationComment, isNull);
     expect(field.metadata, hasLength(0));
@@ -372,7 +372,7 @@
       expectedError(ParserErrorCode.CONFLICTING_MODIFIERS, 5, 5),
     ]);
     expect(member, isFieldDeclaration);
-    FieldDeclaration field = member;
+    var field = member as FieldDeclaration;
     expect(field.covariantKeyword, isNull);
     expect(field.documentationComment, isNull);
     expect(field.metadata, hasLength(0));
@@ -396,7 +396,7 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isFieldDeclaration);
-    FieldDeclaration field = member;
+    var field = member as FieldDeclaration;
     expect(field.covariantKeyword, isNull);
     expect(field.documentationComment, isNull);
     expect(field.metadata, hasLength(0));
@@ -419,7 +419,7 @@
     ClassMember member = parser.parseClassMember('C');
     expect(member, isNotNull);
     expect(member, isFieldDeclaration);
-    FieldDeclaration field = member;
+    var field = member as FieldDeclaration;
     expect(field.covariantKeyword, isNull);
     expect(field.documentationComment, isNull);
     expect(field.metadata, hasLength(0));
@@ -443,7 +443,7 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isFieldDeclaration);
-    FieldDeclaration field = member;
+    var field = member as FieldDeclaration;
     expect(field.abstractKeyword, isNull);
   }
 
@@ -453,7 +453,7 @@
     expect(member, isNotNull);
     assertNoErrors();
     expect(member, isFieldDeclaration);
-    FieldDeclaration field = member;
+    var field = member as FieldDeclaration;
     expect(field.externalKeyword, isNull);
   }
 
@@ -465,7 +465,7 @@
       expectedError(ParserErrorCode.MODIFIER_OUT_OF_ORDER, 4, 4),
     ]);
     expect(member, isFieldDeclaration);
-    FieldDeclaration field = member;
+    var field = member as FieldDeclaration;
     expect(field.covariantKeyword, isNull);
     expect(field.documentationComment, isNull);
     expect(field.metadata, hasLength(0));
@@ -506,376 +506,377 @@
   }
 
   void test_listLiteral_for() {
-    ListLiteral list = parseCollectionLiteral(
+    var list = parseCollectionLiteral(
       '[1, await for (var x in list) 2]',
       inAsync: true,
-    );
+    ) as ListLiteral;
     expect(list.elements, hasLength(2));
-    IntegerLiteral first = list.elements[0];
+    var first = list.elements[0] as IntegerLiteral;
     expect(first.value, 1);
 
-    ForElement second = list.elements[1];
+    var second = list.elements[1] as ForElement;
     expect(second.awaitKeyword, isNotNull);
     expect(second.forKeyword.isKeyword, isTrue);
     expect(second.leftParenthesis.lexeme, '(');
     expect(second.rightParenthesis.lexeme, ')');
-    ForEachPartsWithDeclaration forLoopParts = second.forLoopParts;
+    var forLoopParts = second.forLoopParts as ForEachPartsWithDeclaration;
     DeclaredIdentifier forLoopVar = forLoopParts.loopVariable;
     expect(forLoopVar.identifier.name, 'x');
     expect(forLoopParts.inKeyword, isNotNull);
-    SimpleIdentifier iterable = forLoopParts.iterable;
+    var iterable = forLoopParts.iterable as SimpleIdentifier;
     expect(iterable.name, 'list');
   }
 
   void test_listLiteral_forIf() {
-    ListLiteral list = parseCollectionLiteral(
+    var list = parseCollectionLiteral(
       '[1, await for (var x in list) if (c) 2]',
       inAsync: true,
-    );
+    ) as ListLiteral;
     expect(list.elements, hasLength(2));
-    IntegerLiteral first = list.elements[0];
+    var first = list.elements[0] as IntegerLiteral;
     expect(first.value, 1);
 
-    ForElement second = list.elements[1];
+    var second = list.elements[1] as ForElement;
     expect(second.awaitKeyword, isNotNull);
     expect(second.forKeyword.isKeyword, isTrue);
     expect(second.leftParenthesis.lexeme, '(');
     expect(second.rightParenthesis.lexeme, ')');
-    ForEachPartsWithDeclaration forLoopParts = second.forLoopParts;
+    var forLoopParts = second.forLoopParts as ForEachPartsWithDeclaration;
     DeclaredIdentifier forLoopVar = forLoopParts.loopVariable;
     expect(forLoopVar.identifier.name, 'x');
     expect(forLoopParts.inKeyword, isNotNull);
-    SimpleIdentifier iterable = forLoopParts.iterable;
+    var iterable = forLoopParts.iterable as SimpleIdentifier;
     expect(iterable.name, 'list');
 
-    IfElement body = second.body;
-    SimpleIdentifier condition = body.condition;
+    var body = second.body as IfElement;
+    var condition = body.condition as SimpleIdentifier;
     expect(condition.name, 'c');
-    IntegerLiteral thenElement = body.thenElement;
+    var thenElement = body.thenElement as IntegerLiteral;
     expect(thenElement.value, 2);
   }
 
   void test_listLiteral_forSpread() {
-    ListLiteral list =
-        parseCollectionLiteral('[1, for (int x = 0; x < 10; ++x) ...[2]]');
+    var list =
+        parseCollectionLiteral('[1, for (int x = 0; x < 10; ++x) ...[2]]')
+            as ListLiteral;
     expect(list.elements, hasLength(2));
-    IntegerLiteral first = list.elements[0];
+    var first = list.elements[0] as IntegerLiteral;
     expect(first.value, 1);
 
-    ForElement second = list.elements[1];
+    var second = list.elements[1] as ForElement;
     expect(second.awaitKeyword, isNull);
     expect(second.forKeyword.isKeyword, isTrue);
     expect(second.leftParenthesis.lexeme, '(');
     expect(second.rightParenthesis.lexeme, ')');
-    ForPartsWithDeclarations forLoopParts = second.forLoopParts;
+    var forLoopParts = second.forLoopParts as ForPartsWithDeclarations;
     VariableDeclaration forLoopVar = forLoopParts.variables.variables[0];
     expect(forLoopVar.name.name, 'x');
-    BinaryExpression condition = forLoopParts.condition;
-    IntegerLiteral rightOperand = condition.rightOperand;
+    var condition = forLoopParts.condition as BinaryExpression;
+    var rightOperand = condition.rightOperand as IntegerLiteral;
     expect(rightOperand.value, 10);
-    PrefixExpression updater = forLoopParts.updaters[0];
-    SimpleIdentifier updaterOperand = updater.operand;
+    var updater = forLoopParts.updaters[0] as PrefixExpression;
+    var updaterOperand = updater.operand as SimpleIdentifier;
     expect(updaterOperand.name, 'x');
   }
 
   void test_listLiteral_if() {
-    ListLiteral list = parseCollectionLiteral('[1, if (true) 2]');
+    var list = parseCollectionLiteral('[1, if (true) 2]') as ListLiteral;
     expect(list.elements, hasLength(2));
-    IntegerLiteral first = list.elements[0];
+    var first = list.elements[0] as IntegerLiteral;
     expect(first.value, 1);
 
-    IfElement second = list.elements[1];
-    BooleanLiteral condition = second.condition;
+    var second = list.elements[1] as IfElement;
+    var condition = second.condition as BooleanLiteral;
     expect(condition.value, isTrue);
-    IntegerLiteral thenElement = second.thenElement;
+    var thenElement = second.thenElement as IntegerLiteral;
     expect(thenElement.value, 2);
     expect(second.elseElement, isNull);
   }
 
   void test_listLiteral_ifElse() {
-    ListLiteral list = parseCollectionLiteral('[1, if (true) 2 else 5]');
+    var list = parseCollectionLiteral('[1, if (true) 2 else 5]') as ListLiteral;
     expect(list.elements, hasLength(2));
-    IntegerLiteral first = list.elements[0];
+    var first = list.elements[0] as IntegerLiteral;
     expect(first.value, 1);
 
-    IfElement second = list.elements[1];
-    BooleanLiteral condition = second.condition;
+    var second = list.elements[1] as IfElement;
+    var condition = second.condition as BooleanLiteral;
     expect(condition.value, isTrue);
-    IntegerLiteral thenElement = second.thenElement;
+    var thenElement = second.thenElement as IntegerLiteral;
     expect(thenElement.value, 2);
-    IntegerLiteral elseElement = second.elseElement;
+    var elseElement = second.elseElement as IntegerLiteral;
     expect(elseElement.value, 5);
   }
 
   void test_listLiteral_ifElseFor() {
-    ListLiteral list =
-        parseCollectionLiteral('[1, if (true) 2 else for (a in b) 5]');
+    var list = parseCollectionLiteral('[1, if (true) 2 else for (a in b) 5]')
+        as ListLiteral;
     expect(list.elements, hasLength(2));
-    IntegerLiteral first = list.elements[0];
+    var first = list.elements[0] as IntegerLiteral;
     expect(first.value, 1);
 
-    IfElement second = list.elements[1];
-    BooleanLiteral condition = second.condition;
+    var second = list.elements[1] as IfElement;
+    var condition = second.condition as BooleanLiteral;
     expect(condition.value, isTrue);
-    IntegerLiteral thenElement = second.thenElement;
+    var thenElement = second.thenElement as IntegerLiteral;
     expect(thenElement.value, 2);
 
-    ForElement elseElement = second.elseElement;
-    ForEachPartsWithIdentifier forLoopParts = elseElement.forLoopParts;
+    var elseElement = second.elseElement as ForElement;
+    var forLoopParts = elseElement.forLoopParts as ForEachPartsWithIdentifier;
     expect(forLoopParts.identifier.name, 'a');
 
-    IntegerLiteral forValue = elseElement.body;
+    var forValue = elseElement.body as IntegerLiteral;
     expect(forValue.value, 5);
   }
 
   void test_listLiteral_ifElseSpread() {
-    ListLiteral list =
-        parseCollectionLiteral('[1, if (true) ...[2] else ...?[5]]');
+    var list = parseCollectionLiteral('[1, if (true) ...[2] else ...?[5]]')
+        as ListLiteral;
     expect(list.elements, hasLength(2));
-    IntegerLiteral first = list.elements[0];
+    var first = list.elements[0] as IntegerLiteral;
     expect(first.value, 1);
 
-    IfElement second = list.elements[1];
-    BooleanLiteral condition = second.condition;
+    var second = list.elements[1] as IfElement;
+    var condition = second.condition as BooleanLiteral;
     expect(condition.value, isTrue);
-    SpreadElement thenElement = second.thenElement;
+    var thenElement = second.thenElement as SpreadElement;
     expect(thenElement.spreadOperator.lexeme, '...');
-    SpreadElement elseElement = second.elseElement;
+    var elseElement = second.elseElement as SpreadElement;
     expect(elseElement.spreadOperator.lexeme, '...?');
   }
 
   void test_listLiteral_ifFor() {
-    ListLiteral list = parseCollectionLiteral('[1, if (true) for (a in b) 2]');
+    var list =
+        parseCollectionLiteral('[1, if (true) for (a in b) 2]') as ListLiteral;
     expect(list.elements, hasLength(2));
-    IntegerLiteral first = list.elements[0];
+    var first = list.elements[0] as IntegerLiteral;
     expect(first.value, 1);
 
-    IfElement second = list.elements[1];
-    BooleanLiteral condition = second.condition;
+    var second = list.elements[1] as IfElement;
+    var condition = second.condition as BooleanLiteral;
     expect(condition.value, isTrue);
 
-    ForElement thenElement = second.thenElement;
-    ForEachPartsWithIdentifier forLoopParts = thenElement.forLoopParts;
+    var thenElement = second.thenElement as ForElement;
+    var forLoopParts = thenElement.forLoopParts as ForEachPartsWithIdentifier;
     expect(forLoopParts.identifier.name, 'a');
 
-    IntegerLiteral forValue = thenElement.body;
+    var forValue = thenElement.body as IntegerLiteral;
     expect(forValue.value, 2);
     expect(second.elseElement, isNull);
   }
 
   void test_listLiteral_ifSpread() {
-    ListLiteral list = parseCollectionLiteral('[1, if (true) ...[2]]');
+    var list = parseCollectionLiteral('[1, if (true) ...[2]]') as ListLiteral;
     expect(list.elements, hasLength(2));
-    IntegerLiteral first = list.elements[0];
+    var first = list.elements[0] as IntegerLiteral;
     expect(first.value, 1);
 
-    IfElement second = list.elements[1];
-    BooleanLiteral condition = second.condition;
+    var second = list.elements[1] as IfElement;
+    var condition = second.condition as BooleanLiteral;
     expect(condition.value, isTrue);
-    SpreadElement thenElement = second.thenElement;
+    var thenElement = second.thenElement as SpreadElement;
     expect(thenElement.spreadOperator.lexeme, '...');
     expect(second.elseElement, isNull);
   }
 
   void test_listLiteral_spread() {
-    ListLiteral list = parseCollectionLiteral('[1, ...[2]]');
+    var list = parseCollectionLiteral('[1, ...[2]]') as ListLiteral;
     expect(list.elements, hasLength(2));
-    IntegerLiteral first = list.elements[0];
+    var first = list.elements[0] as IntegerLiteral;
     expect(first.value, 1);
 
-    SpreadElement element = list.elements[1];
+    var element = list.elements[1] as SpreadElement;
     expect(element.spreadOperator.lexeme, '...');
-    ListLiteral spreadExpression = element.expression;
+    var spreadExpression = element.expression as ListLiteral;
     expect(spreadExpression.elements, hasLength(1));
   }
 
   void test_listLiteral_spreadQ() {
-    ListLiteral list = parseCollectionLiteral('[1, ...?[2]]');
+    var list = parseCollectionLiteral('[1, ...?[2]]') as ListLiteral;
     expect(list.elements, hasLength(2));
-    IntegerLiteral first = list.elements[0];
+    var first = list.elements[0] as IntegerLiteral;
     expect(first.value, 1);
 
-    SpreadElement element = list.elements[1];
+    var element = list.elements[1] as SpreadElement;
     expect(element.spreadOperator.lexeme, '...?');
-    ListLiteral spreadExpression = element.expression;
+    var spreadExpression = element.expression as ListLiteral;
     expect(spreadExpression.elements, hasLength(1));
   }
 
   void test_mapLiteral_for() {
-    SetOrMapLiteral map = parseCollectionLiteral(
-        '{1:7, await for (y in list) 2:3}',
-        inAsync: true);
+    var map = parseCollectionLiteral('{1:7, await for (y in list) 2:3}',
+        inAsync: true) as SetOrMapLiteral;
     expect(map.elements, hasLength(2));
-    MapLiteralEntry first = map.elements[0];
-    IntegerLiteral firstValue = first.value;
+    var first = map.elements[0] as MapLiteralEntry;
+    var firstValue = first.value as IntegerLiteral;
     expect(firstValue.value, 7);
 
-    ForElement second = map.elements[1];
+    var second = map.elements[1] as ForElement;
     expect(second.awaitKeyword, isNotNull);
     expect(second.forKeyword.isKeyword, isTrue);
     expect(second.leftParenthesis.lexeme, '(');
     expect(second.rightParenthesis.lexeme, ')');
-    ForEachPartsWithIdentifier forLoopParts = second.forLoopParts;
+    var forLoopParts = second.forLoopParts as ForEachPartsWithIdentifier;
     SimpleIdentifier forLoopVar = forLoopParts.identifier;
     expect(forLoopVar.name, 'y');
     expect(forLoopParts.inKeyword, isNotNull);
-    SimpleIdentifier iterable = forLoopParts.iterable;
+    var iterable = forLoopParts.iterable as SimpleIdentifier;
     expect(iterable.name, 'list');
   }
 
   void test_mapLiteral_forIf() {
-    SetOrMapLiteral map = parseCollectionLiteral(
-        '{1:7, await for (y in list) if (c) 2:3}',
-        inAsync: true);
+    var map = parseCollectionLiteral('{1:7, await for (y in list) if (c) 2:3}',
+        inAsync: true) as SetOrMapLiteral;
     expect(map.elements, hasLength(2));
-    MapLiteralEntry first = map.elements[0];
-    IntegerLiteral firstValue = first.value;
+    var first = map.elements[0] as MapLiteralEntry;
+    var firstValue = first.value as IntegerLiteral;
     expect(firstValue.value, 7);
 
-    ForElement second = map.elements[1];
+    var second = map.elements[1] as ForElement;
     expect(second.awaitKeyword, isNotNull);
     expect(second.forKeyword.isKeyword, isTrue);
     expect(second.leftParenthesis.lexeme, '(');
     expect(second.rightParenthesis.lexeme, ')');
-    ForEachPartsWithIdentifier forLoopParts = second.forLoopParts;
+    var forLoopParts = second.forLoopParts as ForEachPartsWithIdentifier;
     SimpleIdentifier forLoopVar = forLoopParts.identifier;
     expect(forLoopVar.name, 'y');
     expect(forLoopParts.inKeyword, isNotNull);
-    SimpleIdentifier iterable = forLoopParts.iterable;
+    var iterable = forLoopParts.iterable as SimpleIdentifier;
     expect(iterable.name, 'list');
 
-    IfElement body = second.body;
-    SimpleIdentifier condition = body.condition;
+    var body = second.body as IfElement;
+    var condition = body.condition as SimpleIdentifier;
     expect(condition.name, 'c');
-    MapLiteralEntry thenElement = body.thenElement;
-    IntegerLiteral thenValue = thenElement.value;
+    var thenElement = body.thenElement as MapLiteralEntry;
+    var thenValue = thenElement.value as IntegerLiteral;
     expect(thenValue.value, 3);
   }
 
   void test_mapLiteral_forSpread() {
-    SetOrMapLiteral map =
-        parseCollectionLiteral('{1:7, for (x = 0; x < 10; ++x) ...{2:3}}');
+    var map = parseCollectionLiteral('{1:7, for (x = 0; x < 10; ++x) ...{2:3}}')
+        as SetOrMapLiteral;
     expect(map.elements, hasLength(2));
-    MapLiteralEntry first = map.elements[0];
-    IntegerLiteral firstValue = first.value;
+    var first = map.elements[0] as MapLiteralEntry;
+    var firstValue = first.value as IntegerLiteral;
     expect(firstValue.value, 7);
 
-    ForElement second = map.elements[1];
+    var second = map.elements[1] as ForElement;
     expect(second.awaitKeyword, isNull);
     expect(second.forKeyword.isKeyword, isTrue);
     expect(second.leftParenthesis.lexeme, '(');
     expect(second.rightParenthesis.lexeme, ')');
-    ForPartsWithExpression forLoopParts = second.forLoopParts;
-    AssignmentExpression forLoopInit = forLoopParts.initialization;
-    SimpleIdentifier forLoopVar = forLoopInit.leftHandSide;
+    var forLoopParts = second.forLoopParts as ForPartsWithExpression;
+    var forLoopInit = forLoopParts.initialization as AssignmentExpression;
+    var forLoopVar = forLoopInit.leftHandSide as SimpleIdentifier;
     expect(forLoopVar.name, 'x');
-    BinaryExpression condition = forLoopParts.condition;
-    IntegerLiteral rightOperand = condition.rightOperand;
+    var condition = forLoopParts.condition as BinaryExpression;
+    var rightOperand = condition.rightOperand as IntegerLiteral;
     expect(rightOperand.value, 10);
-    PrefixExpression updater = forLoopParts.updaters[0];
-    SimpleIdentifier updaterOperand = updater.operand;
+    var updater = forLoopParts.updaters[0] as PrefixExpression;
+    var updaterOperand = updater.operand as SimpleIdentifier;
     expect(updaterOperand.name, 'x');
   }
 
   void test_mapLiteral_if() {
-    SetOrMapLiteral map = parseCollectionLiteral('{1:1, if (true) 2:4}');
+    var map = parseCollectionLiteral('{1:1, if (true) 2:4}') as SetOrMapLiteral;
     expect(map.elements, hasLength(2));
-    MapLiteralEntry first = map.elements[0];
-    IntegerLiteral firstValue = first.value;
+    var first = map.elements[0] as MapLiteralEntry;
+    var firstValue = first.value as IntegerLiteral;
     expect(firstValue.value, 1);
 
-    IfElement second = map.elements[1];
-    BooleanLiteral condition = second.condition;
+    var second = map.elements[1] as IfElement;
+    var condition = second.condition as BooleanLiteral;
     expect(condition.value, isTrue);
-    MapLiteralEntry thenElement = second.thenElement;
-    IntegerLiteral thenElementValue = thenElement.value;
+    var thenElement = second.thenElement as MapLiteralEntry;
+    var thenElementValue = thenElement.value as IntegerLiteral;
     expect(thenElementValue.value, 4);
     expect(second.elseElement, isNull);
   }
 
   void test_mapLiteral_ifElse() {
-    SetOrMapLiteral map =
-        parseCollectionLiteral('{1:1, if (true) 2:4 else 5:6}');
+    var map = parseCollectionLiteral('{1:1, if (true) 2:4 else 5:6}')
+        as SetOrMapLiteral;
     expect(map.elements, hasLength(2));
-    MapLiteralEntry first = map.elements[0];
-    IntegerLiteral firstValue = first.value;
+    var first = map.elements[0] as MapLiteralEntry;
+    var firstValue = first.value as IntegerLiteral;
     expect(firstValue.value, 1);
 
-    IfElement second = map.elements[1];
-    BooleanLiteral condition = second.condition;
+    var second = map.elements[1] as IfElement;
+    var condition = second.condition as BooleanLiteral;
     expect(condition.value, isTrue);
-    MapLiteralEntry thenElement = second.thenElement;
-    IntegerLiteral thenElementValue = thenElement.value;
+    var thenElement = second.thenElement as MapLiteralEntry;
+    var thenElementValue = thenElement.value as IntegerLiteral;
     expect(thenElementValue.value, 4);
-    MapLiteralEntry elseElement = second.elseElement;
-    IntegerLiteral elseElementValue = elseElement.value;
+    var elseElement = second.elseElement as MapLiteralEntry;
+    var elseElementValue = elseElement.value as IntegerLiteral;
     expect(elseElementValue.value, 6);
   }
 
   void test_mapLiteral_ifElseFor() {
-    SetOrMapLiteral map =
-        parseCollectionLiteral('{1:1, if (true) 2:4 else for (c in d) 5:6}');
+    var map =
+        parseCollectionLiteral('{1:1, if (true) 2:4 else for (c in d) 5:6}')
+            as SetOrMapLiteral;
     expect(map.elements, hasLength(2));
-    MapLiteralEntry first = map.elements[0];
-    IntegerLiteral firstValue = first.value;
+    var first = map.elements[0] as MapLiteralEntry;
+    var firstValue = first.value as IntegerLiteral;
     expect(firstValue.value, 1);
 
-    IfElement second = map.elements[1];
-    BooleanLiteral condition = second.condition;
+    var second = map.elements[1] as IfElement;
+    var condition = second.condition as BooleanLiteral;
     expect(condition.value, isTrue);
-    MapLiteralEntry thenElement = second.thenElement;
-    IntegerLiteral thenElementValue = thenElement.value;
+    var thenElement = second.thenElement as MapLiteralEntry;
+    var thenElementValue = thenElement.value as IntegerLiteral;
     expect(thenElementValue.value, 4);
 
-    ForElement elseElement = second.elseElement;
-    ForEachPartsWithIdentifier forLoopParts = elseElement.forLoopParts;
+    var elseElement = second.elseElement as ForElement;
+    var forLoopParts = elseElement.forLoopParts as ForEachPartsWithIdentifier;
     expect(forLoopParts.identifier.name, 'c');
 
-    MapLiteralEntry body = elseElement.body;
-    IntegerLiteral bodyValue = body.value;
+    var body = elseElement.body as MapLiteralEntry;
+    var bodyValue = body.value as IntegerLiteral;
     expect(bodyValue.value, 6);
   }
 
   void test_mapLiteral_ifElseSpread() {
-    SetOrMapLiteral map =
-        parseCollectionLiteral('{1:7, if (true) ...{2:4} else ...?{5:6}}');
+    var map = parseCollectionLiteral('{1:7, if (true) ...{2:4} else ...?{5:6}}')
+        as SetOrMapLiteral;
     expect(map.elements, hasLength(2));
-    MapLiteralEntry first = map.elements[0];
-    IntegerLiteral firstValue = first.value;
+    var first = map.elements[0] as MapLiteralEntry;
+    var firstValue = first.value as IntegerLiteral;
     expect(firstValue.value, 7);
 
-    IfElement second = map.elements[1];
-    BooleanLiteral condition = second.condition;
+    var second = map.elements[1] as IfElement;
+    var condition = second.condition as BooleanLiteral;
     expect(condition.value, isTrue);
-    SpreadElement thenElement = second.thenElement;
+    var thenElement = second.thenElement as SpreadElement;
     expect(thenElement.spreadOperator.lexeme, '...');
-    SpreadElement elseElement = second.elseElement;
+    var elseElement = second.elseElement as SpreadElement;
     expect(elseElement.spreadOperator.lexeme, '...?');
-    SetOrMapLiteral elseElementExpression = elseElement.expression;
+    var elseElementExpression = elseElement.expression as SetOrMapLiteral;
     expect(elseElementExpression.elements, hasLength(1));
-    MapLiteralEntry entry = elseElementExpression.elements[0];
-    IntegerLiteral entryValue = entry.value;
+    var entry = elseElementExpression.elements[0] as MapLiteralEntry;
+    var entryValue = entry.value as IntegerLiteral;
     expect(entryValue.value, 6);
   }
 
   void test_mapLiteral_ifFor() {
-    SetOrMapLiteral map =
-        parseCollectionLiteral('{1:1, if (true) for (a in b) 2:4}');
+    var map = parseCollectionLiteral('{1:1, if (true) for (a in b) 2:4}')
+        as SetOrMapLiteral;
     expect(map.elements, hasLength(2));
-    MapLiteralEntry first = map.elements[0];
-    IntegerLiteral firstValue = first.value;
+    var first = map.elements[0] as MapLiteralEntry;
+    var firstValue = first.value as IntegerLiteral;
     expect(firstValue.value, 1);
 
-    IfElement second = map.elements[1];
-    BooleanLiteral condition = second.condition;
+    var second = map.elements[1] as IfElement;
+    var condition = second.condition as BooleanLiteral;
     expect(condition.value, isTrue);
 
-    ForElement thenElement = second.thenElement;
-    ForEachPartsWithIdentifier forLoopParts = thenElement.forLoopParts;
+    var thenElement = second.thenElement as ForElement;
+    var forLoopParts = thenElement.forLoopParts as ForEachPartsWithIdentifier;
     expect(forLoopParts.identifier.name, 'a');
 
-    MapLiteralEntry body = thenElement.body;
-    IntegerLiteral thenElementValue = body.value;
+    var body = thenElement.body as MapLiteralEntry;
+    var thenElementValue = body.value as IntegerLiteral;
     expect(thenElementValue.value, 4);
     expect(second.elseElement, isNull);
   }
@@ -883,229 +884,234 @@
   void test_mapLiteral_ifSpread() {
     SetOrMapLiteral map = parseCollectionLiteral('{1:1, if (true) ...{2:4}}');
     expect(map.elements, hasLength(2));
-    MapLiteralEntry first = map.elements[0];
-    IntegerLiteral firstValue = first.value;
+    var first = map.elements[0] as MapLiteralEntry;
+    var firstValue = first.value as IntegerLiteral;
     expect(firstValue.value, 1);
 
-    IfElement second = map.elements[1];
-    BooleanLiteral condition = second.condition;
+    var second = map.elements[1] as IfElement;
+    var condition = second.condition as BooleanLiteral;
     expect(condition.value, isTrue);
-    SpreadElement thenElement = second.thenElement;
+    var thenElement = second.thenElement as SpreadElement;
     expect(thenElement.spreadOperator.lexeme, '...');
     expect(second.elseElement, isNull);
   }
 
   void test_mapLiteral_spread() {
-    SetOrMapLiteral map = parseCollectionLiteral('{1: 2, ...{3: 4}}');
+    var map = parseCollectionLiteral('{1: 2, ...{3: 4}}') as SetOrMapLiteral;
     expect(map.constKeyword, isNull);
     expect(map.typeArguments, isNull);
     expect(map.elements, hasLength(2));
 
-    SpreadElement element = map.elements[1];
+    var element = map.elements[1] as SpreadElement;
     expect(element.spreadOperator.lexeme, '...');
-    SetOrMapLiteral spreadExpression = element.expression;
+    var spreadExpression = element.expression as SetOrMapLiteral;
     expect(spreadExpression.elements, hasLength(1));
   }
 
   void test_mapLiteral_spread2_typed() {
-    SetOrMapLiteral map = parseCollectionLiteral('<int, int>{1: 2, ...{3: 4}}');
+    var map = parseCollectionLiteral('<int, int>{1: 2, ...{3: 4}}')
+        as SetOrMapLiteral;
     expect(map.constKeyword, isNull);
     expect(map.typeArguments.arguments, hasLength(2));
     expect(map.elements, hasLength(2));
 
-    SpreadElement element = map.elements[1];
+    var element = map.elements[1] as SpreadElement;
     expect(element.spreadOperator.lexeme, '...');
-    SetOrMapLiteral spreadExpression = element.expression;
+    var spreadExpression = element.expression as SetOrMapLiteral;
     expect(spreadExpression.elements, hasLength(1));
   }
 
   void test_mapLiteral_spread_typed() {
-    SetOrMapLiteral map = parseCollectionLiteral('<int, int>{...{3: 4}}');
+    var map =
+        parseCollectionLiteral('<int, int>{...{3: 4}}') as SetOrMapLiteral;
     expect(map.constKeyword, isNull);
     expect(map.typeArguments.arguments, hasLength(2));
     expect(map.elements, hasLength(1));
 
-    SpreadElement element = map.elements[0];
+    var element = map.elements[0] as SpreadElement;
     expect(element.spreadOperator.lexeme, '...');
-    SetOrMapLiteral spreadExpression = element.expression;
+    var spreadExpression = element.expression as SetOrMapLiteral;
     expect(spreadExpression.elements, hasLength(1));
   }
 
   void test_mapLiteral_spreadQ() {
-    SetOrMapLiteral map = parseCollectionLiteral('{1: 2, ...?{3: 4}}');
+    var map = parseCollectionLiteral('{1: 2, ...?{3: 4}}') as SetOrMapLiteral;
     expect(map.constKeyword, isNull);
     expect(map.typeArguments, isNull);
     expect(map.elements, hasLength(2));
 
-    SpreadElement element = map.elements[1];
+    var element = map.elements[1] as SpreadElement;
     expect(element.spreadOperator.lexeme, '...?');
-    SetOrMapLiteral spreadExpression = element.expression;
+    var spreadExpression = element.expression as SetOrMapLiteral;
     expect(spreadExpression.elements, hasLength(1));
   }
 
   void test_mapLiteral_spreadQ2_typed() {
-    SetOrMapLiteral map =
-        parseCollectionLiteral('<int, int>{1: 2, ...?{3: 4}}');
+    var map = parseCollectionLiteral('<int, int>{1: 2, ...?{3: 4}}')
+        as SetOrMapLiteral;
     expect(map.constKeyword, isNull);
     expect(map.typeArguments.arguments, hasLength(2));
     expect(map.elements, hasLength(2));
 
-    SpreadElement element = map.elements[1];
+    var element = map.elements[1] as SpreadElement;
     expect(element.spreadOperator.lexeme, '...?');
-    SetOrMapLiteral spreadExpression = element.expression;
+    var spreadExpression = element.expression as SetOrMapLiteral;
     expect(spreadExpression.elements, hasLength(1));
   }
 
   void test_mapLiteral_spreadQ_typed() {
-    SetOrMapLiteral map = parseCollectionLiteral('<int, int>{...?{3: 4}}');
+    var map =
+        parseCollectionLiteral('<int, int>{...?{3: 4}}') as SetOrMapLiteral;
     expect(map.constKeyword, isNull);
     expect(map.typeArguments.arguments, hasLength(2));
     expect(map.elements, hasLength(1));
 
-    SpreadElement element = map.elements[0];
+    var element = map.elements[0] as SpreadElement;
     expect(element.spreadOperator.lexeme, '...?');
-    SetOrMapLiteral spreadExpression = element.expression;
+    var spreadExpression = element.expression as SetOrMapLiteral;
     expect(spreadExpression.elements, hasLength(1));
   }
 
   void test_setLiteral_if() {
-    SetOrMapLiteral setLiteral = parseCollectionLiteral('{1, if (true) 2}');
+    var setLiteral =
+        parseCollectionLiteral('{1, if (true) 2}') as SetOrMapLiteral;
     expect(setLiteral.elements, hasLength(2));
-    IntegerLiteral first = setLiteral.elements[0];
+    var first = setLiteral.elements[0] as IntegerLiteral;
     expect(first.value, 1);
 
-    IfElement second = setLiteral.elements[1];
-    BooleanLiteral condition = second.condition;
+    var second = setLiteral.elements[1] as IfElement;
+    var condition = second.condition as BooleanLiteral;
     expect(condition.value, isTrue);
-    IntegerLiteral thenElement = second.thenElement;
+    var thenElement = second.thenElement as IntegerLiteral;
     expect(thenElement.value, 2);
     expect(second.elseElement, isNull);
   }
 
   void test_setLiteral_ifElse() {
-    SetOrMapLiteral setLiteral =
-        parseCollectionLiteral('{1, if (true) 2 else 5}');
+    var setLiteral =
+        parseCollectionLiteral('{1, if (true) 2 else 5}') as SetOrMapLiteral;
     expect(setLiteral.elements, hasLength(2));
-    IntegerLiteral first = setLiteral.elements[0];
+    var first = setLiteral.elements[0] as IntegerLiteral;
     expect(first.value, 1);
 
-    IfElement second = setLiteral.elements[1];
-    BooleanLiteral condition = second.condition;
+    var second = setLiteral.elements[1] as IfElement;
+    var condition = second.condition as BooleanLiteral;
     expect(condition.value, isTrue);
-    IntegerLiteral thenElement = second.thenElement;
+    var thenElement = second.thenElement as IntegerLiteral;
     expect(thenElement.value, 2);
-    IntegerLiteral elseElement = second.elseElement;
+    var elseElement = second.elseElement as IntegerLiteral;
     expect(elseElement.value, 5);
   }
 
   void test_setLiteral_ifElseSpread() {
-    SetOrMapLiteral setLiteral =
-        parseCollectionLiteral('{1, if (true) ...{2} else ...?[5]}');
+    var setLiteral =
+        parseCollectionLiteral('{1, if (true) ...{2} else ...?[5]}')
+            as SetOrMapLiteral;
     expect(setLiteral.elements, hasLength(2));
-    IntegerLiteral first = setLiteral.elements[0];
+    var first = setLiteral.elements[0] as IntegerLiteral;
     expect(first.value, 1);
 
-    IfElement second = setLiteral.elements[1];
-    BooleanLiteral condition = second.condition;
+    var second = setLiteral.elements[1] as IfElement;
+    var condition = second.condition as BooleanLiteral;
     expect(condition.value, isTrue);
-    SpreadElement thenElement = second.thenElement;
+    var thenElement = second.thenElement as SpreadElement;
     expect(thenElement.spreadOperator.lexeme, '...');
-    SetOrMapLiteral theExpression = thenElement.expression;
+    var theExpression = thenElement.expression as SetOrMapLiteral;
     expect(theExpression.elements, hasLength(1));
-    SpreadElement elseElement = second.elseElement;
+    var elseElement = second.elseElement as SpreadElement;
     expect(elseElement.spreadOperator.lexeme, '...?');
-    ListLiteral elseExpression = elseElement.expression;
+    var elseExpression = elseElement.expression as ListLiteral;
     expect(elseExpression.elements, hasLength(1));
   }
 
   void test_setLiteral_ifSpread() {
-    SetOrMapLiteral setLiteral =
-        parseCollectionLiteral('{1, if (true) ...[2]}');
+    var setLiteral =
+        parseCollectionLiteral('{1, if (true) ...[2]}') as SetOrMapLiteral;
     expect(setLiteral.elements, hasLength(2));
-    IntegerLiteral first = setLiteral.elements[0];
+    var first = setLiteral.elements[0] as IntegerLiteral;
     expect(first.value, 1);
 
-    IfElement second = setLiteral.elements[1];
-    BooleanLiteral condition = second.condition;
+    var second = setLiteral.elements[1] as IfElement;
+    var condition = second.condition as BooleanLiteral;
     expect(condition.value, isTrue);
-    SpreadElement thenElement = second.thenElement;
+    var thenElement = second.thenElement as SpreadElement;
     expect(thenElement.spreadOperator.lexeme, '...');
     expect(second.elseElement, isNull);
   }
 
   void test_setLiteral_spread2() {
-    SetOrMapLiteral set = parseCollectionLiteral('{3, ...[4]}');
+    var set = parseCollectionLiteral('{3, ...[4]}') as SetOrMapLiteral;
     expect(set.constKeyword, isNull);
     expect(set.typeArguments, isNull);
     expect(set.elements, hasLength(2));
-    IntegerLiteral value = set.elements[0];
+    var value = set.elements[0] as IntegerLiteral;
     expect(value.value, 3);
 
-    SpreadElement element = set.elements[1];
+    var element = set.elements[1] as SpreadElement;
     expect(element.spreadOperator.lexeme, '...');
-    ListLiteral spreadExpression = element.expression;
+    var spreadExpression = element.expression as ListLiteral;
     expect(spreadExpression.elements, hasLength(1));
   }
 
   void test_setLiteral_spread2Q() {
-    SetOrMapLiteral set = parseCollectionLiteral('{3, ...?[4]}');
+    var set = parseCollectionLiteral('{3, ...?[4]}') as SetOrMapLiteral;
     expect(set.constKeyword, isNull);
     expect(set.typeArguments, isNull);
     expect(set.elements, hasLength(2));
-    IntegerLiteral value = set.elements[0];
+    var value = set.elements[0] as IntegerLiteral;
     expect(value.value, 3);
 
-    SpreadElement element = set.elements[1];
+    var element = set.elements[1] as SpreadElement;
     expect(element.spreadOperator.lexeme, '...?');
-    ListLiteral spreadExpression = element.expression;
+    var spreadExpression = element.expression as ListLiteral;
     expect(spreadExpression.elements, hasLength(1));
   }
 
   void test_setLiteral_spread_typed() {
-    SetOrMapLiteral set = parseCollectionLiteral('<int>{...[3]}');
+    var set = parseCollectionLiteral('<int>{...[3]}') as SetOrMapLiteral;
     expect(set.constKeyword, isNull);
     expect(set.typeArguments, isNotNull);
     expect(set.elements, hasLength(1));
 
-    SpreadElement element = set.elements[0];
+    var element = set.elements[0] as SpreadElement;
     expect(element.spreadOperator.lexeme, '...');
-    ListLiteral spreadExpression = element.expression;
+    var spreadExpression = element.expression as ListLiteral;
     expect(spreadExpression.elements, hasLength(1));
   }
 
   void test_setLiteral_spreadQ_typed() {
-    SetOrMapLiteral set = parseCollectionLiteral('<int>{...?[3]}');
+    var set = parseCollectionLiteral('<int>{...?[3]}') as SetOrMapLiteral;
     expect(set.constKeyword, isNull);
     expect(set.typeArguments, isNotNull);
     expect(set.elements, hasLength(1));
 
-    SpreadElement element = set.elements[0];
+    var element = set.elements[0] as SpreadElement;
     expect(element.spreadOperator.lexeme, '...?');
-    ListLiteral spreadExpression = element.expression;
+    var spreadExpression = element.expression as ListLiteral;
     expect(spreadExpression.elements, hasLength(1));
   }
 
   void test_setOrMapLiteral_spread() {
-    SetOrMapLiteral map = parseCollectionLiteral('{...{3: 4}}');
+    var map = parseCollectionLiteral('{...{3: 4}}') as SetOrMapLiteral;
     expect(map.constKeyword, isNull);
     expect(map.typeArguments, isNull);
     expect(map.elements, hasLength(1));
 
-    SpreadElement element = map.elements[0];
+    var element = map.elements[0] as SpreadElement;
     expect(element.spreadOperator.lexeme, '...');
-    SetOrMapLiteral spreadExpression = element.expression;
+    var spreadExpression = element.expression as SetOrMapLiteral;
     expect(spreadExpression.elements, hasLength(1));
   }
 
   void test_setOrMapLiteral_spreadQ() {
-    SetOrMapLiteral map = parseCollectionLiteral('{...?{3: 4}}');
+    var map = parseCollectionLiteral('{...?{3: 4}}') as SetOrMapLiteral;
     expect(map.constKeyword, isNull);
     expect(map.typeArguments, isNull);
     expect(map.elements, hasLength(1));
 
-    SpreadElement element = map.elements[0];
+    var element = map.elements[0] as SpreadElement;
     expect(element.spreadOperator.lexeme, '...?');
-    SetOrMapLiteral spreadExpression = element.expression;
+    var spreadExpression = element.expression as SetOrMapLiteral;
     expect(spreadExpression.elements, hasLength(1));
   }
 }
@@ -1115,21 +1121,22 @@
 class ComplexParserTest_Fasta extends FastaParserTestCase
     with ComplexParserTestMixin {
   void test_binary_operator_written_out_expression() {
-    BinaryExpression expression = parseExpression('x xor y', errors: [
+    var expression = parseExpression('x xor y', errors: [
       expectedError(ParserErrorCode.BINARY_OPERATOR_WRITTEN_OUT, 2, 3),
-    ]);
-    SimpleIdentifier lhs = expression.leftOperand;
+    ]) as BinaryExpression;
+    var lhs = expression.leftOperand as SimpleIdentifier;
     expect(lhs.name, 'x');
     expect(expression.operator.lexeme, '^');
-    SimpleIdentifier rhs = expression.rightOperand;
+    var rhs = expression.rightOperand as SimpleIdentifier;
     expect(rhs.name, 'y');
   }
 
   void test_conditionalExpression_precedence_nullableType_as2() {
-    ExpressionStatement statement = parseStatement('x as bool? ? (x + y) : z;');
-    ConditionalExpression expression = statement.expression;
-    AsExpression asExpression = expression.condition;
-    TypeName type = asExpression.type;
+    var statement =
+        parseStatement('x as bool? ? (x + y) : z;') as ExpressionStatement;
+    var expression = statement.expression as ConditionalExpression;
+    var asExpression = expression.condition as AsExpression;
+    var type = asExpression.type as TypeName;
     expect(type.question.lexeme, '?');
     Expression thenExpression = expression.thenExpression;
     expect(thenExpression, isParenthesizedExpression);
@@ -1140,12 +1147,12 @@
   }
 
   void test_conditionalExpression_precedence_nullableType_as3() {
-    ExpressionStatement statement =
-        parseStatement('(x as bool?) ? (x + y) : z;');
-    ConditionalExpression expression = statement.expression;
-    ParenthesizedExpression condition = expression.condition;
-    AsExpression asExpression = condition.expression;
-    TypeName type = asExpression.type;
+    var statement =
+        parseStatement('(x as bool?) ? (x + y) : z;') as ExpressionStatement;
+    var expression = statement.expression as ConditionalExpression;
+    var condition = expression.condition as ParenthesizedExpression;
+    var asExpression = condition.expression as AsExpression;
+    var type = asExpression.type as TypeName;
     expect(type.question.lexeme, '?');
     Expression thenExpression = expression.thenExpression;
     expect(thenExpression, isParenthesizedExpression);
@@ -1156,11 +1163,11 @@
   }
 
   void test_conditionalExpression_precedence_nullableType_is2() {
-    ExpressionStatement statement =
-        parseStatement('x is String? ? (x + y) : z;');
-    ConditionalExpression expression = statement.expression;
-    IsExpression isExpression = expression.condition;
-    TypeName type = isExpression.type;
+    var statement =
+        parseStatement('x is String? ? (x + y) : z;') as ExpressionStatement;
+    var expression = statement.expression as ConditionalExpression;
+    var isExpression = expression.condition as IsExpression;
+    var type = isExpression.type as TypeName;
     expect(type.question.lexeme, '?');
     Expression thenExpression = expression.thenExpression;
     expect(thenExpression, isParenthesizedExpression);
@@ -1171,12 +1178,12 @@
   }
 
   void test_conditionalExpression_precedence_nullableType_is3() {
-    ExpressionStatement statement =
-        parseStatement('(x is String?) ? (x + y) : z;');
-    ConditionalExpression expression = statement.expression;
-    ParenthesizedExpression condition = expression.condition;
-    IsExpression isExpression = condition.expression;
-    TypeName type = isExpression.type;
+    var statement =
+        parseStatement('(x is String?) ? (x + y) : z;') as ExpressionStatement;
+    var expression = statement.expression as ConditionalExpression;
+    var condition = expression.condition as ParenthesizedExpression;
+    var isExpression = condition.expression as IsExpression;
+    var type = isExpression.type as TypeName;
     expect(type.question.lexeme, '?');
     Expression thenExpression = expression.thenExpression;
     expect(thenExpression, isParenthesizedExpression);
@@ -1447,53 +1454,53 @@
 
   void test_lt_dot_bracket_quote() {
     // https://github.com/dart-lang/sdk/issues/37674
-    ListLiteral list = parseExpression('<.["', errors: [
+    var list = parseExpression('<.["', errors: [
       expectedError(ParserErrorCode.EXPECTED_TYPE_NAME, 1, 1),
       expectedError(ParserErrorCode.EXPECTED_TYPE_NAME, 2, 1),
       expectedError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 3, 1),
       expectedError(ScannerErrorCode.EXPECTED_TOKEN, 4, 1),
-    ]);
+    ]) as ListLiteral;
     expect(list.elements, hasLength(1));
-    StringLiteral first = list.elements[0];
+    var first = list.elements[0] as StringLiteral;
     expect(first.length, 1);
   }
 
   void test_lt_dot_listLiteral() {
     // https://github.com/dart-lang/sdk/issues/37674
-    ListLiteral list = parseExpression('<.[]', errors: [
+    var list = parseExpression('<.[]', errors: [
       expectedError(ParserErrorCode.EXPECTED_TYPE_NAME, 1, 1),
       expectedError(ParserErrorCode.EXPECTED_TYPE_NAME, 2, 2),
-    ]);
+    ]) as ListLiteral;
     expect(list.elements, hasLength(0));
   }
 
   void test_mapLiteral() {
-    SetOrMapLiteral map = parseExpression('{3: 6}');
+    var map = parseExpression('{3: 6}') as SetOrMapLiteral;
     expect(map.constKeyword, isNull);
     expect(map.typeArguments, isNull);
     expect(map.elements, hasLength(1));
-    MapLiteralEntry entry = map.elements[0];
-    IntegerLiteral key = entry.key;
+    var entry = map.elements[0] as MapLiteralEntry;
+    var key = entry.key as IntegerLiteral;
     expect(key.value, 3);
-    IntegerLiteral value = entry.value;
+    var value = entry.value as IntegerLiteral;
     expect(value.value, 6);
   }
 
   void test_mapLiteral_const() {
-    SetOrMapLiteral map = parseExpression('const {3: 6}');
+    var map = parseExpression('const {3: 6}') as SetOrMapLiteral;
     expect(map.constKeyword, isNotNull);
     expect(map.typeArguments, isNull);
     expect(map.elements, hasLength(1));
-    MapLiteralEntry entry = map.elements[0];
-    IntegerLiteral key = entry.key;
+    var entry = map.elements[0] as MapLiteralEntry;
+    var key = entry.key as IntegerLiteral;
     expect(key.value, 3);
-    IntegerLiteral value = entry.value;
+    var value = entry.value as IntegerLiteral;
     expect(value.value, 6);
   }
 
   @failingTest
   void test_mapLiteral_invalid_too_many_type_arguments1() {
-    SetOrMapLiteral map = parseExpression('<int, int, int>{}', errors: [
+    var map = parseExpression('<int, int, int>{}', errors: [
       // TODO(danrubel): Currently the resolver reports invalid number of
       // type arguments, but the parser could report this.
       expectedError(
@@ -1501,14 +1508,14 @@
           ParserErrorCode.EXPECTED_TOKEN,
           11,
           3),
-    ]);
+    ]) as SetOrMapLiteral;
     expect(map.constKeyword, isNull);
     expect(map.elements, hasLength(0));
   }
 
   @failingTest
   void test_mapLiteral_invalid_too_many_type_arguments2() {
-    SetOrMapLiteral map = parseExpression('<int, int, int>{1}', errors: [
+    var map = parseExpression('<int, int, int>{1}', errors: [
       // TODO(danrubel): Currently the resolver reports invalid number of
       // type arguments, but the parser could report this.
       expectedError(
@@ -1516,7 +1523,7 @@
           ParserErrorCode.EXPECTED_TOKEN,
           11,
           3),
-    ]);
+    ]) as SetOrMapLiteral;
     expect(map.constKeyword, isNull);
     expect(map.elements, hasLength(0));
   }
@@ -1535,7 +1542,7 @@
       expectedError(ParserErrorCode.EXPECTED_IDENTIFIER_BUT_GOT_KEYWORD, 8, 4)
     ]);
     expect(expression, isStringInterpolation);
-    StringInterpolation literal = expression;
+    var literal = expression as StringInterpolation;
     NodeList<InterpolationElement> elements = literal.elements;
     expect(elements, hasLength(3));
     expect(elements[0] is InterpolationString, isTrue);
@@ -3814,7 +3821,9 @@
     var statement = parseStatement('late a;', featureSet: nonNullable)
         as VariableDeclarationStatement;
     var declarationList = statement.variables;
-    assertNoErrors();
+    assertErrors(errors: [
+      expectedError(ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE, 5, 1)
+    ]);
     expect(declarationList.keyword, isNull);
     expect(declarationList.type, isNull);
     expect(declarationList.variables, hasLength(1));
@@ -3834,7 +3843,9 @@
     var statement = parseStatement('late a = 0;', featureSet: nonNullable)
         as VariableDeclarationStatement;
     var declarationList = statement.variables;
-    assertNoErrors();
+    assertErrors(errors: [
+      expectedError(ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE, 5, 1)
+    ]);
     expect(declarationList.keyword, isNull);
     expect(declarationList.type, isNull);
     expect(declarationList.variables, hasLength(1));
@@ -3862,6 +3873,17 @@
     expect(declarationList.variables, hasLength(1));
   }
 
+  void test_parseVariableDeclaration_late_var_init() {
+    var statement = parseStatement('late var a = 0;', featureSet: nonNullable)
+        as VariableDeclarationStatement;
+    var declarationList = statement.variables;
+    assertNoErrors();
+    expect(declarationList.lateKeyword, isNotNull);
+    expect(declarationList.keyword?.lexeme, 'var');
+    expect(declarationList.type, isNull);
+    expect(declarationList.variables, hasLength(1));
+  }
+
   void test_typeAlias_37733() {
     // https://github.com/dart-lang/sdk/issues/37733
     var unit = parseCompilationUnit(r'typedef K=Function(<>($', errors: [
diff --git a/pkg/analyzer/test/generated/resolver_test.dart b/pkg/analyzer/test/generated/resolver_test.dart
index 1e9056d..d1ca7a3 100644
--- a/pkg/analyzer/test/generated/resolver_test.dart
+++ b/pkg/analyzer/test/generated/resolver_test.dart
@@ -458,7 +458,6 @@
     await resolveTestCode(code);
     assertType(findElement.localVar('v').type, 'int');
     assertTypeNull(findNode.simple('v; // declare'));
-    assertType(findNode.simple('v = null;'), 'int');
     assertType(findNode.simple('v; // return'), 'int');
   }
 
diff --git a/pkg/analyzer/test/generated/resolver_test_case.dart b/pkg/analyzer/test/generated/resolver_test_case.dart
index 63b003e..050de16 100644
--- a/pkg/analyzer/test/generated/resolver_test_case.dart
+++ b/pkg/analyzer/test/generated/resolver_test_case.dart
@@ -130,6 +130,10 @@
     if (targetType == null || targetType.isDynamic) {
       return;
     }
+    AstNode parent = node.parent;
+    if (parent is AssignmentExpression && parent.leftHandSide == node) {
+      return;
+    }
     _checkResolved(node, node.staticElement, (node) => node is MethodElement);
   }
 
@@ -199,6 +203,10 @@
     if (targetType == null || targetType.isDynamic) {
       return;
     }
+    AstNode parent = node.parent;
+    if (parent is AssignmentExpression && parent.leftHandSide == node) {
+      return;
+    }
     node.propertyName.accept(this);
   }
 
@@ -213,6 +221,9 @@
       return;
     }
     AstNode parent = node.parent;
+    if (parent is AssignmentExpression && parent.leftHandSide == node) {
+      return;
+    }
     if (parent is MethodInvocation) {
       MethodInvocation invocation = parent;
       if (identical(invocation.methodName, node)) {
diff --git a/pkg/analyzer/test/generated/simple_resolver_test.dart b/pkg/analyzer/test/generated/simple_resolver_test.dart
index 147d0ebd..c26ac85 100644
--- a/pkg/analyzer/test/generated/simple_resolver_test.dart
+++ b/pkg/analyzer/test/generated/simple_resolver_test.dart
@@ -1098,28 +1098,6 @@
     verifyTestResolved();
   }
 
-  test_setter_fromMixins_property_access() async {
-    await assertNoErrorsInCode('''
-class B {}
-class M1 {
-  set x(value) {}
-}
-class M2 {
-  set x(value) {}
-}
-class C extends B with M1, M2 {}
-void main() {
-  new C().x = 1;
-}
-''');
-    verifyTestResolved();
-
-    expect(
-      findNode.simple('x = ').staticElement,
-      findElement.setter('x', of: 'M2'),
-    );
-  }
-
   test_setter_static() async {
     await assertNoErrorsInCode(r'''
 set s(x) {
diff --git a/pkg/analyzer/test/generated/source_factory_test.dart b/pkg/analyzer/test/generated/source_factory_test.dart
index 3f89277..3ec4b21 100644
--- a/pkg/analyzer/test/generated/source_factory_test.dart
+++ b/pkg/analyzer/test/generated/source_factory_test.dart
@@ -40,15 +40,6 @@
   }
 }
 
-class CustomUriResolver extends UriResolver {
-  String uriPath;
-  CustomUriResolver({this.uriPath});
-
-  @override
-  Source resolveAbsolute(Uri uri, [Uri actualUri]) =>
-      createSource(path: uriPath);
-}
-
 @reflectiveTest
 class SourceFactoryTest with ResourceProviderMixin {
   void test_creation() {
diff --git a/pkg/analyzer/test/generated/strong_mode_test.dart b/pkg/analyzer/test/generated/strong_mode_test.dart
index 7f232fc..90c2bb1 100644
--- a/pkg/analyzer/test/generated/strong_mode_test.dart
+++ b/pkg/analyzer/test/generated/strong_mode_test.dart
@@ -4039,7 +4039,11 @@
   v = 3;
   v; // marker
 }''');
-    assertTypeDynamic(findNode.simple('v ='));
+    if (hasAssignmentLeftResolution) {
+      assertTypeDynamic(findNode.simple('v ='));
+    } else {
+      assertTypeNull(findNode.simple('v ='));
+    }
     assertTypeDynamic(findNode.simple('v; // marker'));
   }
 
diff --git a/pkg/analyzer/test/generated/utilities_test.dart b/pkg/analyzer/test/generated/utilities_test.dart
index 78ad197..1bb1df6 100644
--- a/pkg/analyzer/test/generated/utilities_test.dart
+++ b/pkg/analyzer/test/generated/utilities_test.dart
@@ -1165,14 +1165,14 @@
 
   Expression _parseExpression(String code) {
     CompilationUnit unit = _parseUnit('var v = $code;');
-    TopLevelVariableDeclaration decl = unit.declarations.single;
+    var decl = unit.declarations.single as TopLevelVariableDeclaration;
     return decl.variables.variables.single.initializer;
   }
 
   Statement _parseStatement(String code) {
     CompilationUnit unit = _parseUnit('main() async { $code }');
-    FunctionDeclaration main = unit.declarations.single;
-    BlockFunctionBody body = main.functionExpression.body;
+    var main = unit.declarations.single as FunctionDeclaration;
+    var body = main.functionExpression.body as BlockFunctionBody;
     return body.block.statements.single;
   }
 
diff --git a/pkg/analyzer/test/id_tests/type_promotion_test.dart b/pkg/analyzer/test/id_tests/type_promotion_test.dart
index 692be35..54d8d09 100644
--- a/pkg/analyzer/test/id_tests/type_promotion_test.dart
+++ b/pkg/analyzer/test/id_tests/type_promotion_test.dart
@@ -52,9 +52,9 @@
   @override
   DartType computeNodeValue(Id id, AstNode node) {
     if (node is SimpleIdentifier && node.inGetterContext()) {
-      var element = node.staticElement;
+      var element = _readElement(node);
       if (element is LocalVariableElement || element is ParameterElement) {
-        TypeImpl promotedType = node.staticType;
+        TypeImpl promotedType = _readType(node);
         TypeImpl declaredType = (element as VariableElement).type;
         var isPromoted = promotedType != declaredType;
         if (isPromoted) {
@@ -64,6 +64,32 @@
     }
     return null;
   }
+
+  static Element _readElement(SimpleIdentifier node) {
+    var parent = node.parent;
+    if (parent is AssignmentExpression && parent.leftHandSide == node) {
+      return parent.readElement;
+    } else if (parent is PostfixExpression) {
+      return parent.readElement;
+    } else if (parent is PrefixExpression) {
+      return parent.readElement;
+    } else {
+      return node.staticElement;
+    }
+  }
+
+  static DartType _readType(SimpleIdentifier node) {
+    var parent = node.parent;
+    if (parent is AssignmentExpression && parent.leftHandSide == node) {
+      return parent.readType;
+    } else if (parent is PostfixExpression) {
+      return parent.readType;
+    } else if (parent is PrefixExpression) {
+      return parent.readType;
+    } else {
+      return node.staticType;
+    }
+  }
 }
 
 class _TypePromotionDataInterpreter implements DataInterpreter<DartType> {
diff --git a/pkg/analyzer/test/parse_compilation_unit_test.dart b/pkg/analyzer/test/parse_compilation_unit_test.dart
deleted file mode 100644
index 4bb1920..0000000
--- a/pkg/analyzer/test/parse_compilation_unit_test.dart
+++ /dev/null
@@ -1,96 +0,0 @@
-// Copyright (c) 2013, 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.
-
-// ignore: deprecated_member_use_from_same_package
-import 'package:analyzer/analyzer.dart';
-import 'package:test/test.dart';
-
-void main() {
-  test("parses a valid compilation unit successfully", () {
-    // ignore: deprecated_member_use_from_same_package
-    var unit = parseCompilationUnit("void main() => print('Hello, world!');");
-    expect(unit.toString(), equals("void main() => print('Hello, world!');"));
-  });
-
-  group('Supports spread collections', () {
-    var contents = 'var x = [...[]];';
-    void checkCompilationUnit(CompilationUnit unit) {
-      var declaration = unit.declarations.single as TopLevelVariableDeclaration;
-      var listLiteral =
-          declaration.variables.variables.single.initializer as ListLiteral;
-      var spread = listLiteral.elements.single as SpreadElement;
-      expect(spread.expression, TypeMatcher<ListLiteral>());
-    }
-
-    test('with errors suppressed', () {
-      checkCompilationUnit(
-          // ignore: deprecated_member_use_from_same_package
-          parseCompilationUnit(contents, suppressErrors: true));
-    });
-    test('with errors enabled', () {
-      // ignore: deprecated_member_use_from_same_package
-      checkCompilationUnit(parseCompilationUnit(contents));
-    });
-  });
-
-  group('Supports control flow collections', () {
-    var contents = 'var x = [if (true) 0 else "foo"];';
-    void checkCompilationUnit(CompilationUnit unit) {
-      var declaration = unit.declarations.single as TopLevelVariableDeclaration;
-      var listLiteral =
-          declaration.variables.variables.single.initializer as ListLiteral;
-      var ifElement = listLiteral.elements.single as IfElement;
-      expect(ifElement.condition, TypeMatcher<BooleanLiteral>());
-      expect(ifElement.thenElement, TypeMatcher<IntegerLiteral>());
-      expect(ifElement.elseElement, TypeMatcher<StringLiteral>());
-    }
-
-    test('with errors suppressed', () {
-      checkCompilationUnit(
-          // ignore: deprecated_member_use_from_same_package
-          parseCompilationUnit(contents, suppressErrors: true));
-    });
-    test('with errors enabled', () {
-      // ignore: deprecated_member_use_from_same_package
-      checkCompilationUnit(parseCompilationUnit(contents));
-    });
-  });
-
-  test("throws errors for an invalid compilation unit", () {
-    expect(() {
-      // ignore: deprecated_member_use_from_same_package
-      parseCompilationUnit("void main() => print('Hello, world!')",
-          name: 'test.dart');
-    }, throwsA(predicate((error) {
-      return error is AnalyzerErrorGroup &&
-          error.toString().contains("Error in test.dart: Expected to find ';'");
-    })));
-  });
-
-  test("defaults to '<unknown source>' if no name is provided", () {
-    expect(() {
-      // ignore: deprecated_member_use_from_same_package
-      parseCompilationUnit("void main() => print('Hello, world!')");
-    }, throwsA(predicate((error) {
-      return error is AnalyzerErrorGroup &&
-          error
-              .toString()
-              .contains("Error in <unknown source>: Expected to find ';'");
-    })));
-  });
-
-  test("allows you to specify whether or not to parse function bodies", () {
-    // ignore: deprecated_member_use_from_same_package
-    var unit = parseCompilationUnit("void main() => print('Hello, world!');",
-        parseFunctionBodies: false);
-    expect(unit.toString(), equals("void main();"));
-  });
-
-  test("allows you to specify whether or not to parse function bodies 2", () {
-    // ignore: deprecated_member_use_from_same_package
-    var unit = parseCompilationUnit("void main() { print('Hello, world!'); }",
-        parseFunctionBodies: false);
-    expect(unit.toString(), equals("void main();"));
-  });
-}
diff --git a/pkg/analyzer/test/src/dart/analysis/base.dart b/pkg/analyzer/test/src/dart/analysis/base.dart
index 738a807..dc79e24 100644
--- a/pkg/analyzer/test/src/dart/analysis/base.dart
+++ b/pkg/analyzer/test/src/dart/analysis/base.dart
@@ -23,6 +23,7 @@
 import 'package:analyzer/src/summary/package_bundle_reader.dart';
 import 'package:analyzer/src/test_utilities/mock_sdk.dart';
 import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
+import 'package:pub_semver/pub_semver.dart';
 import 'package:test/test.dart';
 
 /// Finds an [Element] with the given [name].
@@ -98,7 +99,26 @@
           ResourceUriResolver(resourceProvider)
         ]),
         createAnalysisOptions(),
-        packages: Packages.empty,
+        packages: Packages({
+          'test': Package(
+            name: 'test',
+            rootFolder: getFolder(testProject),
+            libFolder: getFolder('$testProject/lib'),
+            languageVersion: Version.parse('2.9.0'),
+          ),
+          'aaa': Package(
+            name: 'aaa',
+            rootFolder: getFolder('/aaa'),
+            libFolder: getFolder('/aaa/lib'),
+            languageVersion: Version.parse('2.9.0'),
+          ),
+          'bbb': Package(
+            name: 'bbb',
+            rootFolder: getFolder('/bbb'),
+            libFolder: getFolder('/bbb/lib'),
+            languageVersion: Version.parse('2.9.0'),
+          ),
+        }),
         enableIndex: true,
         externalSummaries: externalSummaries);
   }
diff --git a/pkg/analyzer/test/src/dart/analysis/context_locator_test.dart b/pkg/analyzer/test/src/dart/analysis/context_locator_test.dart
index bed8770..df58649 100644
--- a/pkg/analyzer/test/src/dart/analysis/context_locator_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/context_locator_test.dart
@@ -476,9 +476,7 @@
     expect(outerRoot.packagesFile, outerPackagesFile);
   }
 
-  @failingTest
   void test_locateRoots_options_withExclude() {
-    // https://github.com/dart-lang/sdk/issues/35519
     Folder rootFolder = newFolder('/test/outer');
     newFolder('/test/outer/test/data');
     File dataFile = newFile('/test/outer/test/data/test.dart');
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
index 0476a9b..3ba26a1 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
@@ -151,7 +151,7 @@
 
       SimpleIdentifier identifier_1 = annotation.name;
       expect(identifier_1.staticElement, same(myElement.getter));
-      expect(identifier_1.staticType, typeProvider.intType);
+      expect(identifier_1.staticType, isNull);
     }
 
     {
@@ -202,7 +202,7 @@
 
     SimpleIdentifier aRef = annotation.name;
     assertElement(aRef, findElement.topGet('a'));
-    assertType(aRef, 'int');
+    assertTypeNull(aRef);
   }
 
   test_annotation_onDirective_import() async {
@@ -222,7 +222,7 @@
 
     SimpleIdentifier aRef = annotation.name;
     assertElement(aRef, findElement.topGet('a'));
-    assertType(aRef, 'int');
+    assertTypeNull(aRef);
   }
 
   test_annotation_onDirective_library() async {
@@ -242,7 +242,7 @@
 
     SimpleIdentifier aRef = annotation.name;
     assertElement(aRef, findElement.topGet('a'));
-    assertType(aRef, 'int');
+    assertTypeNull(aRef);
   }
 
   test_annotation_onDirective_part() async {
@@ -265,7 +265,7 @@
 
     SimpleIdentifier aRef = annotation.name;
     assertElement(aRef, findElement.topGet('a'));
-    assertType(aRef, 'int');
+    assertTypeNull(aRef);
   }
 
   test_annotation_onDirective_partOf() async {
@@ -288,7 +288,7 @@
 
     SimpleIdentifier aRef = annotation.name;
     assertElement(aRef, findElement.topGet('a'));
-    assertType(aRef, 'int');
+    assertTypeNull(aRef);
   }
 
   test_annotation_onFormalParameter_redirectingFactory() async {
@@ -310,7 +310,7 @@
 
       SimpleIdentifier ref = annotation.name;
       assertElement(ref, getter);
-      assertType(ref, 'int');
+      assertTypeNull(ref);
     }
 
     {
@@ -386,7 +386,7 @@
 
     SimpleIdentifier identifier_1 = annotation.name;
     expect(identifier_1.staticElement, same(myElement.getter));
-    expect(identifier_1.staticType, typeProvider.intType);
+    assertTypeNull(identifier_1);
   }
 
   test_annotation_prefixed_classField() async {
@@ -570,7 +570,7 @@
     assertTypeNull(prefixed.prefix);
 
     expect(prefixed.identifier.staticElement, same(aGetter));
-    expect(prefixed.identifier.staticType, typeProvider.intType);
+    assertTypeNull(prefixed.identifier);
 
     expect(annotation.constructorName, isNull);
     expect(annotation.arguments, isNull);
@@ -630,7 +630,7 @@
     assertTypeNull(prefixed.prefix);
 
     expect(prefixed.identifier.staticElement, same(constructor));
-    assertType(prefixed.identifier, 'A Function(int, {int b})');
+    assertTypeNull(prefixed.identifier);
 
     expect(annotation.constructorName, isNull);
 
@@ -699,14 +699,14 @@
 
     SimpleIdentifier identifier_1 = annotation_1.name;
     expect(identifier_1.staticElement, same(element_1.getter));
-    expect(identifier_1.staticType, typeProvider.intType);
+    assertTypeNull(identifier_1);
 
     Annotation annotation_2 = main.metadata[1];
     expect(annotation_2.element, same(element_2.getter));
 
     SimpleIdentifier identifier_2 = annotation_2.name;
     expect(identifier_2.staticElement, same(element_2.getter));
-    expect(identifier_2.staticType, typeProvider.intType);
+    assertTypeNull(identifier_2);
   }
 
   test_asExpression() async {
@@ -781,9 +781,20 @@
   }
 
   test_binaryExpression_gtGtGt() async {
+    var latestLanguageVersionStr = '${ExperimentStatus.currentVersion.major}.'
+        '${ExperimentStatus.currentVersion.minor}';
+
+    writeTestPackageConfig(
+      PackageConfigFileBuilder(),
+      languageVersion: latestLanguageVersionStr,
+    );
+
     writeTestPackageAnalysisOptionsFile(
       AnalysisOptionsFileConfig(
-        experiments: [EnableString.triple_shift],
+        experiments: [
+          EnableString.non_nullable,
+          EnableString.triple_shift,
+        ],
       ),
     );
 
@@ -1517,14 +1528,24 @@
 
     {
       var prefixed = findNode.prefixed('a.v = 1;');
-      assertElement(prefixed, v.setter);
-      assertType(prefixed, 'int');
+      if (hasAssignmentLeftResolution) {
+        assertElement(prefixed, v.setter);
+        assertType(prefixed, 'int');
+      } else {
+        assertElementNull(prefixed);
+        assertTypeNull(prefixed);
+      }
 
       assertElement(prefixed.prefix, import.prefix);
       assertType(prefixed.prefix, null);
 
-      assertElement(prefixed.identifier, v.setter);
-      assertType(prefixed.identifier, 'int');
+      if (hasAssignmentLeftResolution) {
+        assertElement(prefixed.identifier, v.setter);
+        assertType(prefixed.identifier, 'int');
+      } else {
+        assertElementNull(prefixed.identifier);
+        assertTypeNull(prefixed.identifier);
+      }
     }
   }
 
@@ -1755,8 +1776,13 @@
 
     {
       var fRef = findNode.simple('f = 1;');
-      assertMember(fRef, findElement.setter('f'), {'T': 'int'});
-      assertType(fRef, 'int');
+      if (hasAssignmentLeftResolution) {
+        assertMember(fRef, findElement.setter('f'), {'T': 'int'});
+        assertType(fRef, 'int');
+      } else {
+        assertElementNull(fRef);
+        assertTypeNull(fRef);
+      }
     }
   }
 
@@ -5958,8 +5984,13 @@
     await resolveTestFile();
 
     var xRef = findNode.simple('x ++');
-    assertType(xRef, 'int');
-    assertElement(xRef, findElement.parameter('x'));
+    if (hasAssignmentLeftResolution) {
+      assertElement(xRef, findElement.parameter('x'));
+      assertType(xRef, 'int');
+    } else {
+      // assertElementNull(xRef);
+      assertTypeNull(xRef);
+    }
   }
 
   test_postfixExpression_local() async {
@@ -5991,8 +6022,13 @@
       expect(postfix.staticType, typeProvider.intType);
 
       SimpleIdentifier operand = postfix.operand;
-      expect(operand.staticElement, same(v));
-      expect(operand.staticType, typeProvider.intType);
+      if (hasAssignmentLeftResolution) {
+        expect(operand.staticElement, same(v));
+        expect(operand.staticType, typeProvider.intType);
+      } else {
+        // expect(operand.staticElement, same(v));
+        expect(operand.staticType, isNull);
+      }
     }
   }
 
@@ -6025,11 +6061,20 @@
       expect(postfix.staticType, typeProvider.intType);
 
       PropertyAccess propertyAccess = postfix.operand;
-      expect(propertyAccess.staticType, typeProvider.intType);
+      if (hasAssignmentLeftResolution) {
+        expect(propertyAccess.staticType, typeProvider.intType);
+      } else {
+        assertTypeNull(propertyAccess);
+      }
 
       SimpleIdentifier propertyName = propertyAccess.propertyName;
-      expect(propertyName.staticElement, same(fElement.setter));
-      expect(propertyName.staticType, typeProvider.intType);
+      if (hasAssignmentLeftResolution) {
+        expect(propertyName.staticElement, same(fElement.setter));
+        expect(propertyName.staticType, typeProvider.intType);
+      } else {
+        assertElementNull(propertyName);
+        assertTypeNull(propertyName);
+      }
     }
   }
 
@@ -6055,8 +6100,13 @@
     await resolveTestFile();
 
     var xRef = findNode.simple('x++');
-    assertType(xRef, 'int');
-    assertElement(xRef, findElement.parameter('x'));
+    if (hasAssignmentLeftResolution) {
+      assertElement(xRef, findElement.parameter('x'));
+      assertType(xRef, 'int');
+    } else {
+      // assertElementNull(xRef);
+      assertTypeNull(xRef);
+    }
   }
 
   test_prefix_increment_of_prefix_increment() async {
@@ -6068,8 +6118,13 @@
     await resolveTestFile();
 
     var xRef = findNode.simple('x;');
-    assertType(xRef, 'int');
-    assertElement(xRef, findElement.parameter('x'));
+    if (hasAssignmentLeftResolution) {
+      assertElement(xRef, findElement.parameter('x'));
+      assertType(xRef, 'int');
+    } else {
+      // assertElementNull(xRef);
+      assertTypeNull(xRef);
+    }
   }
 
   test_prefixedIdentifier_classInstance_instanceField() async {
@@ -6163,7 +6218,7 @@
 
     SimpleIdentifier methodName = prefixed.identifier;
     expect(methodName.staticElement, isNull);
-    expect(methodName.staticType, typeProvider.dynamicType);
+    assertType(methodName.staticType, 'double Function(int)');
   }
 
   test_prefixedIdentifier_importPrefix_className() async {
@@ -6254,8 +6309,13 @@
       PrefixedIdentifier left = assignment.leftHandSide;
       assertPrefix(left.prefix);
 
-      expect(left.identifier.staticElement, same(mySetter));
-      expect(left.identifier.staticType, typeProvider.intType);
+      if (hasAssignmentLeftResolution) {
+        expect(left.identifier.staticElement, same(mySetter));
+        expect(left.identifier.staticType, typeProvider.intType);
+      } else {
+        assertElementNull(left.identifier);
+        assertTypeNull(left.identifier);
+      }
     }
   }
 
@@ -6289,8 +6349,13 @@
       expect(prefix.staticType, typeProvider.intType);
 
       SimpleIdentifier operand = prefix.operand;
-      expect(operand.staticElement, same(v));
-      expect(operand.staticType, typeProvider.intType);
+      if (hasAssignmentLeftResolution) {
+        expect(operand.staticElement, same(v));
+        expect(operand.staticType, typeProvider.intType);
+      } else {
+        // assertElementNull(operand);
+        assertTypeNull(operand);
+      }
     }
 
     {
@@ -6371,11 +6436,20 @@
       expect(prefix.staticType, typeProvider.intType);
 
       PropertyAccess propertyAccess = prefix.operand;
-      expect(propertyAccess.staticType, typeProvider.intType);
+      if (hasAssignmentLeftResolution) {
+        expect(propertyAccess.staticType, typeProvider.intType);
+      } else {
+        assertTypeNull(propertyAccess);
+      }
 
       SimpleIdentifier propertyName = propertyAccess.propertyName;
-      expect(propertyName.staticElement, same(fElement.setter));
-      expect(propertyName.staticType, typeProvider.intType);
+      if (hasAssignmentLeftResolution) {
+        expect(propertyName.staticElement, same(fElement.setter));
+        expect(propertyName.staticType, typeProvider.intType);
+      } else {
+        assertElementNull(propertyName.staticElement);
+        assertTypeNull(propertyName);
+      }
     }
 
     {
@@ -6657,8 +6731,13 @@
       AssignmentExpression assignment = statement.expression;
 
       SimpleIdentifier identifier = assignment.leftHandSide;
-      expect(identifier.staticElement, same(setterElement));
-      expect(identifier.staticType, typeProvider.intType);
+      if (hasAssignmentLeftResolution) {
+        expect(identifier.staticElement, same(setterElement));
+        expect(identifier.staticType, typeProvider.intType);
+      } else {
+        assertElementNull(identifier);
+        assertTypeNull(identifier);
+      }
     }
 
     // this.setter = 4;
@@ -6672,8 +6751,13 @@
       expect(
           target.staticType, interfaceTypeStar(bNode.declaredElement)); // raw
 
-      expect(propertyAccess.propertyName.staticElement, same(setterElement));
-      expect(propertyAccess.propertyName.staticType, typeProvider.intType);
+      if (hasAssignmentLeftResolution) {
+        expect(propertyAccess.propertyName.staticElement, same(setterElement));
+        expect(propertyAccess.propertyName.staticType, typeProvider.intType);
+      } else {
+        assertElementNull(propertyAccess.propertyName);
+        assertTypeNull(propertyAccess.propertyName);
+      }
     }
 
     // super + 5;
@@ -6774,8 +6858,13 @@
       AssignmentExpression assignment = statement.expression;
 
       SimpleIdentifier identifier = assignment.leftHandSide;
-      expect(identifier.staticElement, same(setterElement));
-      expect(identifier.staticType, typeProvider.intType);
+      if (hasAssignmentLeftResolution) {
+        expect(identifier.staticElement, same(setterElement));
+        expect(identifier.staticType, typeProvider.intType);
+      } else {
+        assertElementNull(identifier);
+        assertTypeNull(identifier);
+      }
     }
 
     // this.setter = 4;
@@ -6788,8 +6877,13 @@
       ThisExpression target = propertyAccess.target;
       expect(target.staticType, thisTypeA); // raw
 
-      expect(propertyAccess.propertyName.staticElement, same(setterElement));
-      expect(propertyAccess.propertyName.staticType, typeProvider.intType);
+      if (hasAssignmentLeftResolution) {
+        expect(propertyAccess.propertyName.staticElement, same(setterElement));
+        expect(propertyAccess.propertyName.staticType, typeProvider.intType);
+      } else {
+        assertElementNull(propertyAccess.propertyName);
+        assertTypeNull(propertyAccess.propertyName);
+      }
     }
 
     // this + 5;
@@ -7730,7 +7824,7 @@
     await resolveTestFile();
 
     FunctionTypeAlias alias = findNode.functionTypeAlias('F<T>');
-    GenericTypeAliasElement aliasElement = alias.declaredElement;
+    FunctionTypeAliasElement aliasElement = alias.declaredElement;
 
     FieldDeclaration fDeclaration = findNode.fieldDeclaration('F<int> f');
 
@@ -8204,8 +8298,13 @@
     assertTypeDynamic(postfix);
 
     SimpleIdentifier aRef = postfix.operand;
-    assertElementNull(aRef);
-    assertTypeDynamic(aRef);
+    if (hasAssignmentLeftResolution) {
+      assertElementNull(aRef);
+      assertTypeDynamic(aRef);
+    } else {
+      assertElementNull(aRef);
+      assertTypeNull(aRef);
+    }
   }
 
   test_unresolved_postfix_operator() async {
@@ -8224,8 +8323,13 @@
     assertType(postfix, 'A');
 
     SimpleIdentifier aRef = postfix.operand;
-    assertElement(aRef, findElement.topSet('a'));
-    assertType(aRef, 'A');
+    if (hasAssignmentLeftResolution) {
+      assertElement(aRef, findElement.topSet('a'));
+      assertType(aRef, 'A');
+    } else {
+      assertElementNull(aRef);
+      assertTypeNull(aRef);
+    }
   }
 
   test_unresolved_prefix_operand() async {
@@ -8242,8 +8346,13 @@
     assertTypeDynamic(prefix);
 
     SimpleIdentifier aRef = prefix.operand;
-    assertElementNull(aRef);
-    assertTypeDynamic(aRef);
+    if (hasAssignmentLeftResolution) {
+      assertElementNull(aRef);
+      assertTypeDynamic(aRef);
+    } else {
+      assertElementNull(aRef);
+      assertTypeNull(aRef);
+    }
   }
 
   test_unresolved_prefix_operator() async {
@@ -8262,8 +8371,13 @@
     assertTypeDynamic(prefix);
 
     SimpleIdentifier aRef = prefix.operand;
-    assertElement(aRef, findElement.topSet('a'));
-    assertType(aRef, 'A');
+    if (hasAssignmentLeftResolution) {
+      assertElement(aRef, findElement.topSet('a'));
+      assertType(aRef, 'A');
+    } else {
+      assertElementNull(aRef);
+      assertTypeNull(aRef);
+    }
   }
 
   test_unresolved_prefixedIdentifier_identifier() async {
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
index 0743fd3..16cf839 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
@@ -2349,6 +2349,49 @@
     }
   }
 
+  test_parseFileSync_doesNotReadImportedFiles() async {
+    var a = convertPath('/test/lib/a.dart');
+    var b = convertPath('/test/lib/b.dart');
+
+    newFile(a, content: '');
+    newFile(b, content: r'''
+import 'a.dart';
+''');
+
+    expect(driver.fsState.knownFilePaths, isEmpty);
+
+    // Don't read `a.dart` when parse.
+    driver.parseFileSync(b);
+    expect(driver.fsState.knownFilePaths, unorderedEquals([b]));
+
+    // Still don't read `a.dart` when parse the second time.
+    driver.parseFileSync(b);
+    expect(driver.fsState.knownFilePaths, unorderedEquals([b]));
+  }
+
+  test_parseFileSync_doesNotReadPartedFiles() async {
+    var a = convertPath('/test/lib/a.dart');
+    var b = convertPath('/test/lib/b.dart');
+
+    newFile(a, content: r'''
+part of my;
+''');
+    newFile(b, content: r'''
+library my;
+part 'a.dart';
+''');
+
+    expect(driver.fsState.knownFilePaths, isEmpty);
+
+    // Don't read `a.dart` when parse.
+    driver.parseFileSync(b);
+    expect(driver.fsState.knownFilePaths, unorderedEquals([b]));
+
+    // Still don't read `a.dart` when parse the second time.
+    driver.parseFileSync(b);
+    expect(driver.fsState.knownFilePaths, unorderedEquals([b]));
+  }
+
   test_parseFileSync_languageVersion() async {
     var path = convertPath('/test/lib/test.dart');
 
@@ -2937,7 +2980,7 @@
 
     newFile(a, content: '');
     newFile(b, content: r'''
-import 'package:aaa/a.dart'; // ignore: unused_import
+import 'package:aaa/a.dart';
 A a;
 ''');
 
@@ -2949,7 +2992,7 @@
     await waitForIdleWithoutExceptions();
     expect(allResults, hasLength(1));
     expect(allResults[0].path, b);
-    expect(allResults[0].errors, hasLength(1));
+    expect(allResults[0].errors, hasLength(2));
 
     // Create generated file for `package:aaa/a.dart`.
     var aUri = Uri.parse('package:aaa/a.dart');
diff --git a/pkg/analyzer/test/src/dart/analysis/feature_set_provider_test.dart b/pkg/analyzer/test/src/dart/analysis/feature_set_provider_test.dart
index b304d11..37172b1 100644
--- a/pkg/analyzer/test/src/dart/analysis/feature_set_provider_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/feature_set_provider_test.dart
@@ -7,6 +7,7 @@
 import 'package:analyzer/src/context/packages.dart';
 import 'package:analyzer/src/context/source.dart';
 import 'package:analyzer/src/dart/analysis/experiments.dart';
+import 'package:analyzer/src/dart/analysis/experiments_impl.dart';
 import 'package:analyzer/src/dart/analysis/feature_set_provider.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/source_io.dart';
@@ -260,40 +261,65 @@
   }
 
   test_sdk_allowedExperiments_default() {
+    var feature_a = ExperimentalFeature(
+      index: 0,
+      enableString: 'a',
+      isEnabledByDefault: false,
+      isExpired: false,
+      documentation: 'a',
+      experimentalReleaseVersion: null,
+      releaseVersion: null,
+    );
+
     _newSdkExperimentsFile(r'''
 {
   "version": 1,
   "experimentSets": {
-    "nullSafety": ["non-nullable"]
+    "with_a": ["a"]
   },
   "sdk": {
     "default": {
-      "experimentSet": "nullSafety"
+      "experimentSet": "with_a"
     }
   }
 }
 ''');
 
-    provider = FeatureSetProvider.build(
-      sourceFactory: sourceFactory,
-      resourceProvider: resourceProvider,
-      packages: findPackagesFrom(resourceProvider, getFolder('/test')),
-      packageDefaultFeatureSet: FeatureSet.latestLanguageVersion(),
-      nonPackageDefaultLanguageVersion: ExperimentStatus.currentVersion,
-      nonPackageDefaultFeatureSet: FeatureSet.latestLanguageVersion(),
-    );
+    overrideKnownFeatures({'a': feature_a}, () {
+      provider = FeatureSetProvider.build(
+        sourceFactory: sourceFactory,
+        resourceProvider: resourceProvider,
+        packages: findPackagesFrom(resourceProvider, getFolder('/test')),
+        packageDefaultFeatureSet: FeatureSet.latestLanguageVersion(),
+        nonPackageDefaultLanguageVersion: ExperimentStatus.currentVersion,
+        nonPackageDefaultFeatureSet: FeatureSet.latestLanguageVersion(),
+      );
 
-    var featureSet = _getSdkFeatureSet('dart:math');
-    expect(featureSet.isEnabled(Feature.non_nullable), isTrue);
+      var core_featureSet = _getSdkFeatureSet('dart:core');
+      expect(core_featureSet.isEnabled(feature_a), isTrue);
+
+      var math_featureSet = _getSdkFeatureSet('dart:math');
+      expect(math_featureSet.isEnabled(feature_a), isTrue);
+    });
   }
 
   test_sdk_allowedExperiments_library() {
+    var feature_a = ExperimentalFeature(
+      index: 0,
+      enableString: 'a',
+      isEnabledByDefault: false,
+      isExpired: false,
+      documentation: 'a',
+      experimentalReleaseVersion: null,
+      releaseVersion: null,
+    );
+
     _newSdkExperimentsFile(r'''
 {
   "version": 1,
   "experimentSets": {
     "none": [],
-    "nullSafety": ["non-nullable"]
+    "with_a": ["a"]
   },
   "sdk": {
     "default": {
@@ -301,26 +327,29 @@
     },
     "libraries": {
       "math": {
-        "experimentSet": "nullSafety"
+        "experimentSet": "with_a"
       }
     }
   }
 }
 ''');
-    provider = FeatureSetProvider.build(
-      sourceFactory: sourceFactory,
-      resourceProvider: resourceProvider,
-      packages: findPackagesFrom(resourceProvider, getFolder('/test')),
-      packageDefaultFeatureSet: FeatureSet.latestLanguageVersion(),
-      nonPackageDefaultLanguageVersion: ExperimentStatus.currentVersion,
-      nonPackageDefaultFeatureSet: FeatureSet.latestLanguageVersion(),
-    );
 
-    var core_featureSet = _getSdkFeatureSet('dart:core');
-    expect(core_featureSet.isEnabled(Feature.non_nullable), isFalse);
+    overrideKnownFeatures({'a': feature_a}, () {
+      provider = FeatureSetProvider.build(
+        sourceFactory: sourceFactory,
+        resourceProvider: resourceProvider,
+        packages: findPackagesFrom(resourceProvider, getFolder('/test')),
+        packageDefaultFeatureSet: FeatureSet.latestLanguageVersion(),
+        nonPackageDefaultLanguageVersion: ExperimentStatus.currentVersion,
+        nonPackageDefaultFeatureSet: FeatureSet.latestLanguageVersion(),
+      );
 
-    var math_featureSet = _getSdkFeatureSet('dart:math');
-    expect(math_featureSet.isEnabled(Feature.non_nullable), isTrue);
+      var core_featureSet = _getSdkFeatureSet('dart:core');
+      expect(core_featureSet.isEnabled(feature_a), isFalse);
+
+      var math_featureSet = _getSdkFeatureSet('dart:math');
+      expect(math_featureSet.isEnabled(feature_a), isTrue);
+    });
   }
 
   test_sdk_allowedExperiments_mockDefault() {
diff --git a/pkg/analyzer/test/src/dart/analysis/session_test.dart b/pkg/analyzer/test/src/dart/analysis/session_test.dart
index ed80e60..733f92f 100644
--- a/pkg/analyzer/test/src/dart/analysis/session_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/session_test.dart
@@ -21,15 +21,15 @@
 
 @reflectiveTest
 class AnalysisSessionImplTest with ResourceProviderMixin {
-  AnalysisContextCollection contextCollection;
-  AnalysisContext context;
-  AnalysisSessionImpl session;
+  /*late final*/ AnalysisContextCollection contextCollection;
+  /*late final*/ AnalysisContext context;
+  /*late final*/ AnalysisSessionImpl session;
 
-  String testContextPath;
-  String aaaContextPath;
-  String bbbContextPath;
+  /*late final*/ String testContextPath;
+  /*late final*/ String aaaContextPath;
+  /*late final*/ String bbbContextPath;
 
-  String testPath;
+  /*late final*/ String testPath;
 
   void setUp() {
     MockSdk(resourceProvider: resourceProvider);
diff --git a/pkg/analyzer/test/src/dart/ast/ast_test.dart b/pkg/analyzer/test/src/dart/ast/ast_test.dart
index 8ab94b5..bb96a03 100644
--- a/pkg/analyzer/test/src/dart/ast/ast_test.dart
+++ b/pkg/analyzer/test/src/dart/ast/ast_test.dart
@@ -21,8 +21,8 @@
 
 @reflectiveTest
 class CompilationUnitImplTest extends ParserTestCase {
-  String testSource;
-  CompilationUnitImpl testUnit;
+  /*late*/ String testSource;
+  /*late*/ CompilationUnitImpl testUnit;
 
   parse(String source) {
     testSource = source;
@@ -84,7 +84,7 @@
     int index = testSource.indexOf(snippet);
     expect(index >= 0, isTrue);
     NodeLocator visitor = NodeLocator(index);
-    AstNodeImpl node = visitor.searchWithin(testUnit);
+    var node = visitor.searchWithin(testUnit) as AstNodeImpl;
     expect(node, TypeMatcher<ExpressionImpl>());
     expect((node as ExpressionImpl).inConstantContext,
         isInContext ? isTrue : isFalse);
diff --git a/pkg/analyzer/test/src/dart/ast/constant_evaluator_test.dart b/pkg/analyzer/test/src/dart/ast/constant_evaluator_test.dart
index ac0dc66..dfa42c6 100644
--- a/pkg/analyzer/test/src/dart/ast/constant_evaluator_test.dart
+++ b/pkg/analyzer/test/src/dart/ast/constant_evaluator_test.dart
@@ -18,17 +18,17 @@
 @reflectiveTest
 class ConstantEvaluatorTest extends ParseBase {
   void test_binary_bitAnd() {
-    int value = _getConstantValue("74 & 42");
+    var value = _getConstantValue("74 & 42") as int;
     expect(value, 74 & 42);
   }
 
   void test_binary_bitOr() {
-    int value = _getConstantValue("74 | 42");
+    var value = _getConstantValue("74 | 42") as int;
     expect(value, 74 | 42);
   }
 
   void test_binary_bitXor() {
-    int value = _getConstantValue("74 ^ 42");
+    var value = _getConstantValue("74 ^ 42") as int;
     expect(value, 74 ^ 42);
   }
 
@@ -78,7 +78,7 @@
   }
 
   void test_binary_leftShift() {
-    int value = _getConstantValue("16 << 2");
+    var value = _getConstantValue("16 << 2") as int;
     expect(value, 64);
   }
 
@@ -183,7 +183,7 @@
   }
 
   void test_binary_rightShift() {
-    int value = _getConstantValue("64 >> 2");
+    var value = _getConstantValue("64 >> 2") as int;
     expect(value, 16);
   }
 
@@ -198,12 +198,12 @@
   }
 
   void test_binary_truncatingDivide_double() {
-    int value = _getConstantValue("3.2 ~/ 2.3");
+    var value = _getConstantValue("3.2 ~/ 2.3") as int;
     expect(value, 1);
   }
 
   void test_binary_truncatingDivide_integer() {
-    int value = _getConstantValue("10 ~/ 3");
+    var value = _getConstantValue("10 ~/ 3") as int;
     expect(value, 3);
   }
 
@@ -260,7 +260,7 @@
   }
 
   void test_literal_list() {
-    List value = _getConstantValue("['a', 'b', 'c']");
+    var value = _getConstantValue("['a', 'b', 'c']") as List<Object>;
     expect(value.length, 3);
     expect(value[0], "a");
     expect(value[1], "b");
@@ -268,7 +268,8 @@
   }
 
   void test_literal_map() {
-    Map value = _getConstantValue("{'a' : 'm', 'b' : 'n', 'c' : 'o'}");
+    var value = _getConstantValue("{'a' : 'm', 'b' : 'n', 'c' : 'o'}")
+        as Map<Object, Object>;
     expect(value.length, 3);
     expect(value["a"], "m");
     expect(value["b"], "n");
@@ -316,7 +317,7 @@
   }
 
   void test_unary_bitNot() {
-    int value = _getConstantValue("~42");
+    var value = _getConstantValue("~42") as int;
     expect(value, ~42);
   }
 
diff --git a/pkg/analyzer/test/src/dart/ast/to_source_visitor_test.dart b/pkg/analyzer/test/src/dart/ast/to_source_visitor_test.dart
index 4fe02d3..2898bae 100644
--- a/pkg/analyzer/test/src/dart/ast/to_source_visitor_test.dart
+++ b/pkg/analyzer/test/src/dart/ast/to_source_visitor_test.dart
@@ -987,8 +987,8 @@
   }
 
   void test_visitFieldFormalParameter_type_covariant() {
-    FieldFormalParameterImpl expected = AstTestFactory.fieldFormalParameter(
-        null, AstTestFactory.typeName4("A"), "a");
+    var expected = AstTestFactory.fieldFormalParameter(
+        null, AstTestFactory.typeName4("A"), "a") as FieldFormalParameterImpl;
     expected.covariantKeyword =
         TokenFactory.tokenFromKeyword(Keyword.COVARIANT);
     _assertSource("covariant A this.a", expected);
@@ -1570,9 +1570,8 @@
   }
 
   void test_visitFunctionTypedFormalParameter_type_covariant() {
-    FunctionTypedFormalParameterImpl expected =
-        AstTestFactory.functionTypedFormalParameter(
-            AstTestFactory.typeName4("T"), "f");
+    var expected = AstTestFactory.functionTypedFormalParameter(
+        AstTestFactory.typeName4("T"), "f") as FunctionTypedFormalParameterImpl;
     expected.covariantKeyword =
         TokenFactory.tokenFromKeyword(Keyword.COVARIANT);
     _assertSource("covariant T f()", expected);
@@ -2471,8 +2470,8 @@
   }
 
   void test_visitSimpleFormalParameter_type_covariant() {
-    SimpleFormalParameterImpl expected = AstTestFactory.simpleFormalParameter4(
-        AstTestFactory.typeName4("A"), "a");
+    var expected = AstTestFactory.simpleFormalParameter4(
+        AstTestFactory.typeName4("A"), "a") as SimpleFormalParameterImpl;
     expected.covariantKeyword =
         TokenFactory.tokenFromKeyword(Keyword.COVARIANT);
     _assertSource("covariant A a", expected);
diff --git a/pkg/analyzer/test/src/dart/ast/utilities_test.dart b/pkg/analyzer/test/src/dart/ast/utilities_test.dart
index 0e1dca2..f0b6733 100644
--- a/pkg/analyzer/test/src/dart/ast/utilities_test.dart
+++ b/pkg/analyzer/test/src/dart/ast/utilities_test.dart
@@ -37,7 +37,7 @@
     String code = ' int vv; ';
     //             012345678
     CompilationUnit unit = parseCompilationUnit(code);
-    TopLevelVariableDeclaration declaration = unit.declarations[0];
+    var declaration = unit.declarations[0] as TopLevelVariableDeclaration;
     VariableDeclarationList variableList = declaration.variables;
     Identifier typeName = (variableList.type as TypeName).name;
     SimpleIdentifier varName = variableList.variables[0].name;
@@ -58,7 +58,7 @@
     String code = ' int vv; ';
     //             012345678
     CompilationUnit unit = parseCompilationUnit(code);
-    TopLevelVariableDeclaration declaration = unit.declarations[0];
+    var declaration = unit.declarations[0] as TopLevelVariableDeclaration;
     VariableDeclarationList variableList = declaration.variables;
     Identifier typeName = (variableList.type as TypeName).name;
     SimpleIdentifier varName = variableList.variables[0].name;
@@ -277,11 +277,11 @@
   void test_visitConstructorDeclaration() {
     String className = "A";
     String constructorName = "c";
-    ConstructorDeclarationImpl fromNode = AstTestFactory.constructorDeclaration(
+    var fromNode = AstTestFactory.constructorDeclaration(
         AstTestFactory.identifier3(className),
         constructorName,
         AstTestFactory.formalParameterList(),
-        null);
+        null) as ConstructorDeclarationImpl;
     ConstructorElement element = ElementFactory.constructorElement2(
         ElementFactory.classElement2(className), constructorName);
     fromNode.declaredElement = element;
@@ -472,7 +472,7 @@
     DartType typeC = interfaceTypeStar(ElementFactory.classElement2('C'));
 
     ForStatement fromNode = createNode();
-    ForEachPartsWithIdentifier fromForLoopParts = fromNode.forLoopParts;
+    var fromForLoopParts = fromNode.forLoopParts as ForEachPartsWithIdentifier;
     fromForLoopParts.identifier.staticType = typeA;
     (fromForLoopParts.iterable as SimpleIdentifier).staticType = typeB;
     ((fromNode.body as ExpressionStatement).expression as SimpleIdentifier)
@@ -480,7 +480,7 @@
 
     ForStatement toNode = createNode();
     ResolutionCopier.copyResolutionData(fromNode, toNode);
-    ForEachPartsWithIdentifier toForLoopParts = fromNode.forLoopParts;
+    var toForLoopParts = fromNode.forLoopParts as ForEachPartsWithIdentifier;
     expect(toForLoopParts.identifier.staticType, same(typeA));
     expect(
         (toForLoopParts.iterable as SimpleIdentifier).staticType, same(typeB));
@@ -491,9 +491,9 @@
   }
 
   void test_visitFunctionExpression() {
-    FunctionExpressionImpl fromNode = AstTestFactory.functionExpression2(
+    var fromNode = AstTestFactory.functionExpression2(
         AstTestFactory.formalParameterList(),
-        AstTestFactory.emptyFunctionBody());
+        AstTestFactory.emptyFunctionBody()) as FunctionExpressionImpl;
     MethodElement element = ElementFactory.methodElement(
         "m", interfaceTypeStar(ElementFactory.classElement2('C')));
     fromNode.declaredElement = element;
@@ -567,9 +567,6 @@
     );
     MethodElement staticElement = ElementFactory.methodElement(
         "m", interfaceTypeStar(ElementFactory.classElement2('C')));
-    AuxiliaryElements auxiliaryElements = AuxiliaryElements(staticElement);
-    // ignore: deprecated_member_use_from_same_package
-    fromNode.auxiliaryElements = auxiliaryElements;
     fromNode.staticElement = staticElement;
     DartType staticType = interfaceTypeStar(ElementFactory.classElement2('C'));
     fromNode.staticType = staticType;
@@ -578,8 +575,6 @@
       index: AstTestFactory.integer(0),
     );
     ResolutionCopier.copyResolutionData(fromNode, toNode);
-    // ignore: deprecated_member_use_from_same_package
-    expect(toNode.auxiliaryElements, same(auxiliaryElements));
     expect(toNode.staticElement, same(staticElement));
     expect(toNode.staticType, same(staticType));
   }
@@ -851,16 +846,11 @@
     SimpleIdentifier fromNode = AstTestFactory.identifier3("x");
     MethodElement staticElement = ElementFactory.methodElement(
         "m", interfaceTypeStar(ElementFactory.classElement2('C')));
-    AuxiliaryElements auxiliaryElements = AuxiliaryElements(staticElement);
-    // ignore: deprecated_member_use_from_same_package
-    fromNode.auxiliaryElements = auxiliaryElements;
     fromNode.staticElement = staticElement;
     DartType staticType = interfaceTypeStar(ElementFactory.classElement2('C'));
     fromNode.staticType = staticType;
     SimpleIdentifier toNode = AstTestFactory.identifier3("x");
     ResolutionCopier.copyResolutionData(fromNode, toNode);
-    // ignore: deprecated_member_use_from_same_package
-    expect(toNode.auxiliaryElements, same(auxiliaryElements));
     expect(toNode.staticElement, same(staticElement));
     expect(toNode.staticType, same(staticType));
   }
diff --git a/pkg/analyzer/test/src/dart/constant/evaluation_test.dart b/pkg/analyzer/test/src/dart/constant/evaluation_test.dart
index cb7aa88..a1753b8 100644
--- a/pkg/analyzer/test/src/dart/constant/evaluation_test.dart
+++ b/pkg/analyzer/test/src/dart/constant/evaluation_test.dart
@@ -17,950 +17,17 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(ConstantVisitorTest);
-    defineReflectiveTests(ConstantVisitorWithConstantUpdate2018Test);
-    defineReflectiveTests(
-        ConstantVisitorWithFlowControlAndSpreadCollectionsTest);
+    defineReflectiveTests(ConstantVisitorWithNullSafetyWithTripleShiftTest);
     defineReflectiveTests(ConstantVisitorWithNullSafetyTest);
   });
 }
 
 @reflectiveTest
-class ConstantVisitorTest extends ConstantVisitorTestSupport {
-  test_visitBinaryExpression_questionQuestion_eager_notNull_notNull() async {
-    await resolveTestCode('''
-const c = 'a' ?? 'b';
-''');
-    DartObjectImpl result = _evaluateConstant('c');
-    expect(result.type, typeProvider.stringType);
-    expect(result.toStringValue(), 'a');
-  }
-
-  test_visitBinaryExpression_questionQuestion_eager_null_notNull() async {
-    await resolveTestCode('''
-const c = null ?? 'b';
-''');
-    DartObjectImpl result = _evaluateConstant('c');
-    expect(result.type, typeProvider.stringType);
-    expect(result.toStringValue(), 'b');
-  }
-
-  test_visitBinaryExpression_questionQuestion_eager_null_null() async {
-    await resolveTestCode('''
-const c = null ?? null;
-''');
-    DartObjectImpl result = _evaluateConstant('c');
-    expect(result.isNull, isTrue);
-  }
-
-  test_visitConditionalExpression_eager_false_int_int() async {
-    await resolveTestCode('''
-const c = false ? 1 : 0;
-''');
-    DartObjectImpl result = _evaluateConstant('c');
-    expect(result.type, typeProvider.intType);
-    expect(result.toIntValue(), 0);
-  }
-
-  test_visitConditionalExpression_eager_invalid_int_int() async {
-    await resolveTestCode('''
-const c = null ? 1 : 0;
-''');
-    DartObjectImpl result = _evaluateConstant(
-      'c',
-      errorCodes: [CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL],
-    );
-    expect(result, isNull);
-  }
-
-  test_visitConditionalExpression_eager_true_int_int() async {
-    await resolveTestCode('''
-const c = true ? 1 : 0;
-''');
-    DartObjectImpl result = _evaluateConstant('c');
-    expect(result.type, typeProvider.intType);
-    expect(result.toIntValue(), 1);
-  }
-
-  test_visitConditionalExpression_eager_true_int_invalid() async {
-    await resolveTestCode('''
-const c = true ? 1 : x;
-''');
-    DartObjectImpl result = _evaluateConstant(
-      'c',
-      errorCodes: [CompileTimeErrorCode.INVALID_CONSTANT],
-    );
-    if (analysisOptions.experimentStatus.constant_update_2018) {
-      expect(result.toIntValue(), 1);
-    } else {
-      expect(result, isNull);
-    }
-  }
-
-  test_visitConditionalExpression_eager_true_invalid_int() async {
-    await resolveTestCode('''
-const c = true ? x : 0;
-''');
-    DartObjectImpl result = _evaluateConstant(
-      'c',
-      errorCodes: [CompileTimeErrorCode.INVALID_CONSTANT],
-    );
-    expect(result, isNull);
-  }
-
-  test_visitInstanceCreationExpression_bool_fromEnvironment() async {
-    await resolveTestCode('''
-const a = bool.fromEnvironment('a');
-const b = bool.fromEnvironment('b', defaultValue: true);
-''');
-    expect(
-      _evaluateConstant('a'),
-      _boolValue(false),
-    );
-    expect(
-      _evaluateConstant('a', declaredVariables: {'a': 'true'}),
-      _boolValue(true),
-    );
-
-    expect(
-      _evaluateConstant(
-        'b',
-        declaredVariables: {'b': 'bbb'},
-        lexicalEnvironment: {'defaultValue': _boolValue(true)},
-      ),
-      _boolValue(true),
-    );
-  }
-
-  test_visitInstanceCreationExpression_bool_hasEnvironment() async {
-    await resolveTestCode('''
-const a = bool.hasEnvironment('a');
-''');
-    expect(
-      _evaluateConstant('a'),
-      _boolValue(false),
-    );
-
-    expect(
-      _evaluateConstant('a', declaredVariables: {'a': '42'}),
-      _boolValue(true),
-    );
-  }
-
-  test_visitInstanceCreationExpression_int_fromEnvironment() async {
-    await resolveTestCode('''
-const a = int.fromEnvironment('a');
-const b = int.fromEnvironment('b', defaultValue: 42);
-''');
-    expect(
-      _evaluateConstant('a'),
-      _intValue(0),
-    );
-    expect(
-      _evaluateConstant('a', declaredVariables: {'a': '5'}),
-      _intValue(5),
-    );
-
-    expect(
-      _evaluateConstant(
-        'b',
-        declaredVariables: {'b': 'bbb'},
-        lexicalEnvironment: {'defaultValue': _intValue(42)},
-      ),
-      _intValue(42),
-    );
-  }
-
-  test_visitInstanceCreationExpression_string_fromEnvironment() async {
-    await resolveTestCode('''
-const a = String.fromEnvironment('a');
-''');
-    expect(
-      _evaluateConstant('a'),
-      DartObjectImpl(
-        typeSystem,
-        typeProvider.stringType,
-        StringState(''),
-      ),
-    );
-    expect(
-      _evaluateConstant('a', declaredVariables: {'a': 'test'}),
-      DartObjectImpl(
-        typeSystem,
-        typeProvider.stringType,
-        StringState('test'),
-      ),
-    );
-  }
-
-  test_visitIntegerLiteral() async {
-    await resolveTestCode('''
-const double d = 3;
-''');
-    DartObjectImpl result = _evaluateConstant('d');
-    expect(result.type, typeProvider.doubleType);
-    expect(result.toDoubleValue(), 3.0);
-  }
-
-  test_visitPropertyAccess_fromExtension() async {
-    await resolveTestCode('''
-extension ExtObject on Object {
-  int get length => 4;
-}
-
-class B {
-  final l;
-  const B(Object o) : l = o.length;
-}
-
-const b = B('');
-''');
-    _evaluateConstant('b', errorCodes: [
-      CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION,
-      CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION
-    ]);
-  }
-
-  test_visitSimpleIdentifier_className() async {
-    await resolveTestCode('''
-const a = C;
-class C {}
-''');
-    DartObjectImpl result = _evaluateConstant('a');
-    expect(result.type, typeProvider.typeType);
-    assertType(result.toTypeValue(), 'C');
-  }
-
-  test_visitSimpleIdentifier_dynamic() async {
-    await resolveTestCode('''
-const a = dynamic;
-''');
-    DartObjectImpl result = _evaluateConstant('a');
-    expect(result.type, typeProvider.typeType);
-    expect(result.toTypeValue(), typeProvider.dynamicType);
-  }
-
-  test_visitSimpleIdentifier_inEnvironment() async {
-    await resolveTestCode(r'''
-const a = b;
-const b = 3;''');
-    var environment = <String, DartObjectImpl>{
-      'b': DartObjectImpl(typeSystem, typeProvider.intType, IntState(6)),
-    };
-    var result = _evaluateConstant('a', lexicalEnvironment: environment);
-    expect(result.type, typeProvider.intType);
-    expect(result.toIntValue(), 6);
-  }
-
-  test_visitSimpleIdentifier_notInEnvironment() async {
-    await resolveTestCode(r'''
-const a = b;
-const b = 3;''');
-    var environment = <String, DartObjectImpl>{
-      'c': DartObjectImpl(typeSystem, typeProvider.intType, IntState(6)),
-    };
-    var result = _evaluateConstant('a', lexicalEnvironment: environment);
-    expect(result.type, typeProvider.intType);
-    expect(result.toIntValue(), 3);
-  }
-
-  test_visitSimpleIdentifier_withoutEnvironment() async {
-    await resolveTestCode(r'''
-const a = b;
-const b = 3;''');
-    var result = _evaluateConstant('a');
-    expect(result.type, typeProvider.intType);
-    expect(result.toIntValue(), 3);
-  }
-
-  DartObjectImpl _boolValue(bool value) {
-    if (identical(value, false)) {
-      return DartObjectImpl(
-        typeSystem,
-        typeProvider.boolType,
-        BoolState.FALSE_STATE,
-      );
-    } else if (identical(value, true)) {
-      return DartObjectImpl(
-        typeSystem,
-        typeProvider.boolType,
-        BoolState.TRUE_STATE,
-      );
-    }
-    fail("Invalid boolean value used in test");
-  }
-
-  DartObjectImpl _intValue(int value) {
-    return DartObjectImpl(
-      typeSystem,
-      typeProvider.intType,
-      IntState(value),
-    );
-  }
-}
-
-class ConstantVisitorTestSupport extends PubPackageResolutionTest {
-  DartObjectImpl _evaluateConstant(
-    String name, {
-    List<ErrorCode> errorCodes,
-    Map<String, String> declaredVariables = const {},
-    Map<String, DartObjectImpl> lexicalEnvironment,
-  }) {
-    var expression = findNode.topVariableDeclarationByName(name).initializer;
-
-    var source = this.result.unit.declaredElement.source;
-    var errorListener = GatheringErrorListener();
-    var errorReporter = ErrorReporter(
-      errorListener,
-      source,
-      isNonNullableByDefault: false,
-    );
-
-    DartObjectImpl result = expression.accept(
-      ConstantVisitor(
-        ConstantEvaluationEngine(
-          DeclaredVariables.fromMap(declaredVariables),
-        ),
-        this.result.libraryElement,
-        errorReporter,
-        lexicalEnvironment: lexicalEnvironment,
-      ),
-    );
-    if (errorCodes == null) {
-      errorListener.assertNoErrors();
-    } else {
-      errorListener.assertErrorsWithCodes(errorCodes);
-    }
-    return result;
-  }
-}
+class ConstantVisitorTest extends ConstantVisitorTestSupport
+    with ConstantVisitorTestCases {}
 
 @reflectiveTest
-class ConstantVisitorWithConstantUpdate2018Test
-    extends ConstantVisitorTestSupport {
-  @override
-  void setUp() {
-    super.setUp();
-    writeTestPackageAnalysisOptionsFile(
-      AnalysisOptionsFileConfig(
-        experiments: [EnableString.triple_shift],
-      ),
-    );
-  }
-
-  test_visitAsExpression_instanceOfSameClass() async {
-    await resolveTestCode('''
-const a = const A();
-const b = a as A;
-class A {
-  const A();
-}
-''');
-    DartObjectImpl resultA = _evaluateConstant('a');
-    DartObjectImpl resultB = _evaluateConstant('b');
-    expect(resultB, resultA);
-  }
-
-  test_visitAsExpression_instanceOfSubclass() async {
-    await resolveTestCode('''
-const a = const B();
-const b = a as A;
-class A {
-  const A();
-}
-class B extends A {
-  const B();
-}
-''');
-    DartObjectImpl resultA = _evaluateConstant('a');
-    DartObjectImpl resultB = _evaluateConstant('b');
-    expect(resultB, resultA);
-  }
-
-  test_visitAsExpression_instanceOfSuperclass() async {
-    await resolveTestCode('''
-const a = const A();
-const b = a as B;
-class A {
-  const A();
-}
-class B extends A {
-  const B();
-}
-''');
-    DartObjectImpl result = _evaluateConstant('b',
-        errorCodes: [CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION]);
-    expect(result, isNull);
-  }
-
-  test_visitAsExpression_instanceOfUnrelatedClass() async {
-    await resolveTestCode('''
-const a = const A();
-const b = a as B;
-class A {
-  const A();
-}
-class B {
-  const B();
-}
-''');
-    DartObjectImpl result = _evaluateConstant('b',
-        errorCodes: [CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION]);
-    expect(result, isNull);
-  }
-
-  test_visitAsExpression_null() async {
-    await resolveTestCode('''
-const a = null;
-const b = a as A;
-class A {}
-''');
-    DartObjectImpl result = _evaluateConstant('b');
-    expect(result.type, typeProvider.nullType);
-  }
-
-  test_visitAsExpression_potentialConst() async {
-    await assertNoErrorsInCode('''
-class A {
-  const A();
-}
-
-class MyClass {
-  final A a;
-  const MyClass(Object o) : a = o as A;
-}
-''');
-  }
-
-  test_visitBinaryExpression_and_bool_known_known() async {
-    await resolveTestCode('''
-const c = false & true;
-''');
-    DartObjectImpl result = _evaluateConstant('c');
-    expect(result.type, typeProvider.boolType);
-  }
-
-  test_visitBinaryExpression_and_bool_known_unknown() async {
-    await resolveTestCode('''
-const b = bool.fromEnvironment('y');
-const c = false & b;
-''');
-    DartObjectImpl result = _evaluateConstant('c');
-    expect(result.type, typeProvider.boolType);
-  }
-
-  test_visitBinaryExpression_and_bool_unknown_known() async {
-    await resolveTestCode('''
-const a = bool.fromEnvironment('x');
-const c = a & true;
-''');
-    DartObjectImpl result = _evaluateConstant('c');
-    expect(result.type, typeProvider.boolType);
-  }
-
-  test_visitBinaryExpression_and_bool_unknown_unknown() async {
-    await resolveTestCode('''
-const a = bool.fromEnvironment('x');
-const b = bool.fromEnvironment('y');
-const c = a & b;
-''');
-    DartObjectImpl result = _evaluateConstant('c');
-    expect(result.type, typeProvider.boolType);
-  }
-
-  test_visitBinaryExpression_and_int() async {
-    await resolveTestCode('''
-const c = 3 & 5;
-''');
-    DartObjectImpl result = _evaluateConstant('c');
-    expect(result.type, typeProvider.intType);
-  }
-
-  test_visitBinaryExpression_and_mixed() async {
-    await resolveTestCode('''
-const c = 3 & false;
-''');
-    _evaluateConstant('c',
-        errorCodes: [CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_INT]);
-  }
-
-  test_visitBinaryExpression_gtGtGt_negative_fewerBits() async {
-    await resolveTestCode('''
-const c = 0xFFFFFFFF >>> 8;
-''');
-    DartObjectImpl result = _evaluateConstant('c');
-    expect(result.type, typeProvider.intType);
-    expect(result.toIntValue(), 0xFFFFFF);
-  }
-
-  test_visitBinaryExpression_gtGtGt_negative_moreBits() async {
-    await resolveTestCode('''
-const c = 0xFFFFFFFF >>> 33;
-''');
-    DartObjectImpl result = _evaluateConstant('c');
-    expect(result.type, typeProvider.intType);
-    expect(result.toIntValue(), 0);
-  }
-
-  test_visitBinaryExpression_gtGtGt_negative_moreThan64Bits() async {
-    await resolveTestCode('''
-const c = 0xFFFFFFFF >>> 65;
-''');
-    DartObjectImpl result = _evaluateConstant('c');
-    expect(result.type, typeProvider.intType);
-    expect(result.toIntValue(), 0);
-  }
-
-  test_visitBinaryExpression_gtGtGt_negative_negativeBits() async {
-    await resolveTestCode('''
-const c = 0xFFFFFFFF >>> -2;
-''');
-    _evaluateConstant('c',
-        errorCodes: [CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION]);
-  }
-
-  test_visitBinaryExpression_gtGtGt_negative_zeroBits() async {
-    await resolveTestCode('''
-const c = 0xFFFFFFFF >>> 0;
-''');
-    DartObjectImpl result = _evaluateConstant('c');
-    expect(result.type, typeProvider.intType);
-    expect(result.toIntValue(), 0xFFFFFFFF);
-  }
-
-  test_visitBinaryExpression_gtGtGt_positive_fewerBits() async {
-    await resolveTestCode('''
-const c = 0xFF >>> 3;
-''');
-    DartObjectImpl result = _evaluateConstant('c');
-    expect(result.type, typeProvider.intType);
-    expect(result.toIntValue(), 0x1F);
-  }
-
-  test_visitBinaryExpression_gtGtGt_positive_moreBits() async {
-    await resolveTestCode('''
-const c = 0xFF >>> 9;
-''');
-    DartObjectImpl result = _evaluateConstant('c');
-    expect(result.type, typeProvider.intType);
-    expect(result.toIntValue(), 0);
-  }
-
-  test_visitBinaryExpression_gtGtGt_positive_moreThan64Bits() async {
-    await resolveTestCode('''
-const c = 0xFF >>> 65;
-''');
-    DartObjectImpl result = _evaluateConstant('c');
-    expect(result.type, typeProvider.intType);
-    expect(result.toIntValue(), 0);
-  }
-
-  test_visitBinaryExpression_gtGtGt_positive_negativeBits() async {
-    await resolveTestCode('''
-const c = 0xFF >>> -2;
-''');
-    _evaluateConstant('c',
-        errorCodes: [CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION]);
-  }
-
-  test_visitBinaryExpression_gtGtGt_positive_zeroBits() async {
-    await resolveTestCode('''
-const c = 0xFF >>> 0;
-''');
-    DartObjectImpl result = _evaluateConstant('c');
-    expect(result.type, typeProvider.intType);
-    expect(result.toIntValue(), 0xFF);
-  }
-
-  test_visitBinaryExpression_or_bool_known_known() async {
-    await resolveTestCode('''
-const c = false | true;
-''');
-    DartObjectImpl result = _evaluateConstant('c');
-    expect(result.type, typeProvider.boolType);
-  }
-
-  test_visitBinaryExpression_or_bool_known_unknown() async {
-    await resolveTestCode('''
-const b = bool.fromEnvironment('y');
-const c = false | b;
-''');
-    DartObjectImpl result = _evaluateConstant('c');
-    expect(result.type, typeProvider.boolType);
-  }
-
-  test_visitBinaryExpression_or_bool_unknown_known() async {
-    await resolveTestCode('''
-const a = bool.fromEnvironment('x');
-const c = a | true;
-''');
-    DartObjectImpl result = _evaluateConstant('c');
-    expect(result.type, typeProvider.boolType);
-  }
-
-  test_visitBinaryExpression_or_bool_unknown_unknown() async {
-    await resolveTestCode('''
-const a = bool.fromEnvironment('x');
-const b = bool.fromEnvironment('y');
-const c = a | b;
-''');
-    DartObjectImpl result = _evaluateConstant('c');
-    expect(result.type, typeProvider.boolType);
-  }
-
-  test_visitBinaryExpression_or_int() async {
-    await resolveTestCode('''
-const c = 3 | 5;
-''');
-    DartObjectImpl result = _evaluateConstant('c');
-    expect(result.type, typeProvider.intType);
-  }
-
-  test_visitBinaryExpression_or_mixed() async {
-    await resolveTestCode('''
-const c = 3 | false;
-''');
-    _evaluateConstant('c',
-        errorCodes: [CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_INT]);
-  }
-
-  test_visitBinaryExpression_questionQuestion_lazy_notNull_invalid() async {
-    await resolveTestCode('''
-const c = 'a' ?? new C();
-class C {}
-''');
-    DartObjectImpl result = _evaluateConstant('c');
-    expect(result.type, typeProvider.stringType);
-    expect(result.toStringValue(), 'a');
-  }
-
-  test_visitBinaryExpression_questionQuestion_lazy_notNull_notNull() async {
-    await resolveTestCode('''
-const c = 'a' ?? 'b';
-''');
-    DartObjectImpl result = _evaluateConstant('c');
-    expect(result.type, typeProvider.stringType);
-    expect(result.toStringValue(), 'a');
-  }
-
-  test_visitBinaryExpression_questionQuestion_lazy_null_invalid() async {
-    await resolveTestCode('''
-const c = null ?? new C();
-class C {}
-''');
-    _evaluateConstant('c', errorCodes: [CompileTimeErrorCode.INVALID_CONSTANT]);
-  }
-
-  test_visitBinaryExpression_questionQuestion_lazy_null_notNull() async {
-    await resolveTestCode('''
-const c = null ?? 'b';
-''');
-    DartObjectImpl result = _evaluateConstant('c');
-    expect(result.type, typeProvider.stringType);
-    expect(result.toStringValue(), 'b');
-  }
-
-  test_visitBinaryExpression_questionQuestion_lazy_null_null() async {
-    await resolveTestCode('''
-const c = null ?? null;
-''');
-    DartObjectImpl result = _evaluateConstant('c');
-    expect(result.isNull, isTrue);
-  }
-
-  test_visitBinaryExpression_xor_bool_known_known() async {
-    await resolveTestCode('''
-const c = false ^ true;
-''');
-    DartObjectImpl result = _evaluateConstant('c');
-    expect(result.type, typeProvider.boolType);
-  }
-
-  test_visitBinaryExpression_xor_bool_known_unknown() async {
-    await resolveTestCode('''
-const b = bool.fromEnvironment('y');
-const c = false ^ b;
-''');
-    DartObjectImpl result = _evaluateConstant('c');
-    expect(result.type, typeProvider.boolType);
-  }
-
-  test_visitBinaryExpression_xor_bool_unknown_known() async {
-    await resolveTestCode('''
-const a = bool.fromEnvironment('x');
-const c = a ^ true;
-''');
-    DartObjectImpl result = _evaluateConstant('c');
-    expect(result.type, typeProvider.boolType);
-  }
-
-  test_visitBinaryExpression_xor_bool_unknown_unknown() async {
-    await resolveTestCode('''
-const a = bool.fromEnvironment('x');
-const b = bool.fromEnvironment('y');
-const c = a ^ b;
-''');
-    DartObjectImpl result = _evaluateConstant('c');
-    expect(result.type, typeProvider.boolType);
-  }
-
-  test_visitBinaryExpression_xor_int() async {
-    await resolveTestCode('''
-const c = 3 ^ 5;
-''');
-    DartObjectImpl result = _evaluateConstant('c');
-    expect(result.type, typeProvider.intType);
-  }
-
-  test_visitBinaryExpression_xor_mixed() async {
-    await resolveTestCode('''
-const c = 3 ^ false;
-''');
-    _evaluateConstant('c',
-        errorCodes: [CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_INT]);
-  }
-
-  test_visitConditionalExpression_lazy_false_int_int() async {
-    await resolveTestCode('''
-const c = false ? 1 : 0;
-''');
-    DartObjectImpl result = _evaluateConstant('c');
-    expect(result.type, typeProvider.intType);
-    expect(result.toIntValue(), 0);
-  }
-
-  test_visitConditionalExpression_lazy_false_int_invalid() async {
-    await resolveTestCode('''
-const c = false ? 1 : new C();
-''');
-    _evaluateConstant('c', errorCodes: [CompileTimeErrorCode.INVALID_CONSTANT]);
-  }
-
-  test_visitConditionalExpression_lazy_false_invalid_int() async {
-    await resolveTestCode('''
-const c = false ? new C() : 0;
-''');
-    DartObjectImpl result = _evaluateConstant('c',
-        errorCodes: [CompileTimeErrorCode.INVALID_CONSTANT]);
-    expect(result.type, typeProvider.intType);
-    expect(result.toIntValue(), 0);
-  }
-
-  test_visitConditionalExpression_lazy_invalid_int_int() async {
-    await resolveTestCode('''
-const c = 3 ? 1 : 0;
-''');
-    _evaluateConstant('c',
-        errorCodes: [CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL]);
-  }
-
-  test_visitConditionalExpression_lazy_true_int_int() async {
-    await resolveTestCode('''
-const c = true ? 1 : 0;
-''');
-    DartObjectImpl result = _evaluateConstant('c');
-    expect(result.type, typeProvider.intType);
-    expect(result.toIntValue(), 1);
-  }
-
-  test_visitConditionalExpression_lazy_true_int_invalid() async {
-    await resolveTestCode('''
-const c = true ? 1: new C();
-''');
-    DartObjectImpl result = _evaluateConstant('c',
-        errorCodes: [CompileTimeErrorCode.INVALID_CONSTANT]);
-    expect(result.type, typeProvider.intType);
-    expect(result.toIntValue(), 1);
-  }
-
-  test_visitConditionalExpression_lazy_true_invalid_int() async {
-    await resolveTestCode('''
-const c = true ? new C() : 0;
-class C {}
-''');
-    _evaluateConstant('c', errorCodes: [CompileTimeErrorCode.INVALID_CONSTANT]);
-  }
-
-  test_visitIsExpression_is_instanceOfSameClass() async {
-    await resolveTestCode('''
-const a = const A();
-const b = a is A;
-class A {
-  const A();
-}
-''');
-    DartObjectImpl result = _evaluateConstant('b');
-    expect(result.type, typeProvider.boolType);
-    expect(result.toBoolValue(), true);
-  }
-
-  test_visitIsExpression_is_instanceOfSubclass() async {
-    await resolveTestCode('''
-const a = const B();
-const b = a is A;
-class A {
-  const A();
-}
-class B extends A {
-  const B();
-}
-''');
-    DartObjectImpl result = _evaluateConstant('b');
-    expect(result.type, typeProvider.boolType);
-    expect(result.toBoolValue(), true);
-  }
-
-  test_visitIsExpression_is_instanceOfSuperclass() async {
-    await resolveTestCode('''
-const a = const A();
-const b = a is B;
-class A {
-  const A();
-}
-class B extends A {
-  const B();
-}
-''');
-    DartObjectImpl result = _evaluateConstant('b');
-    expect(result.type, typeProvider.boolType);
-    expect(result.toBoolValue(), false);
-  }
-
-  test_visitIsExpression_is_instanceOfUnrelatedClass() async {
-    await resolveTestCode('''
-const a = const A();
-const b = a is B;
-class A {
-  const A();
-}
-class B {
-  const B();
-}
-''');
-    DartObjectImpl result = _evaluateConstant('b');
-    expect(result.type, typeProvider.boolType);
-    expect(result.toBoolValue(), false);
-  }
-
-  test_visitIsExpression_is_null() async {
-    await resolveTestCode('''
-const a = null;
-const b = a is A;
-class A {}
-''');
-    DartObjectImpl result = _evaluateConstant('b');
-    expect(result.type, typeProvider.boolType);
-    expect(result.toBoolValue(), false);
-  }
-
-  test_visitIsExpression_is_null_dynamic() async {
-    await resolveTestCode('''
-const a = null;
-const b = a is dynamic;
-class A {}
-''');
-    DartObjectImpl result = _evaluateConstant('b');
-    expect(result.type, typeProvider.boolType);
-    expect(result.toBoolValue(), true);
-  }
-
-  test_visitIsExpression_is_null_null() async {
-    await resolveTestCode('''
-const a = null;
-const b = a is Null;
-class A {}
-''');
-    DartObjectImpl result = _evaluateConstant('b');
-    expect(result.type, typeProvider.boolType);
-    expect(result.toBoolValue(), true);
-  }
-
-  test_visitIsExpression_is_null_object() async {
-    await resolveTestCode('''
-const a = null;
-const b = a is Object;
-class A {}
-''');
-    DartObjectImpl result = _evaluateConstant('b');
-    expect(result.type, typeProvider.boolType);
-    expect(result.toBoolValue(), true);
-  }
-
-  test_visitIsExpression_isNot_instanceOfSameClass() async {
-    await resolveTestCode('''
-const a = const A();
-const b = a is! A;
-class A {
-  const A();
-}
-''');
-    DartObjectImpl result = _evaluateConstant('b');
-    expect(result.type, typeProvider.boolType);
-    expect(result.toBoolValue(), false);
-  }
-
-  test_visitIsExpression_isNot_instanceOfSubclass() async {
-    await resolveTestCode('''
-const a = const B();
-const b = a is! A;
-class A {
-  const A();
-}
-class B extends A {
-  const B();
-}
-''');
-    DartObjectImpl result = _evaluateConstant('b');
-    expect(result.type, typeProvider.boolType);
-    expect(result.toBoolValue(), false);
-  }
-
-  test_visitIsExpression_isNot_instanceOfSuperclass() async {
-    await resolveTestCode('''
-const a = const A();
-const b = a is! B;
-class A {
-  const A();
-}
-class B extends A {
-  const B();
-}
-''');
-    DartObjectImpl result = _evaluateConstant('b');
-    expect(result.type, typeProvider.boolType);
-    expect(result.toBoolValue(), true);
-  }
-
-  test_visitIsExpression_isNot_instanceOfUnrelatedClass() async {
-    await resolveTestCode('''
-const a = const A();
-const b = a is! B;
-class A {
-  const A();
-}
-class B {
-  const B();
-}
-''');
-    DartObjectImpl result = _evaluateConstant('b');
-    expect(result.type, typeProvider.boolType);
-    expect(result.toBoolValue(), true);
-  }
-
-  test_visitIsExpression_isNot_null() async {
-    await resolveTestCode('''
-const a = null;
-const b = a is! A;
-class A {}
-''');
-    DartObjectImpl result = _evaluateConstant('b');
-    expect(result.type, typeProvider.boolType);
-    expect(result.toBoolValue(), true);
-  }
-}
-
-@reflectiveTest
-class ConstantVisitorWithFlowControlAndSpreadCollectionsTest
-    extends ConstantVisitorTestSupport {
+mixin ConstantVisitorTestCases on ConstantVisitorTestSupport {
   test_listLiteral_ifElement_false_withElse() async {
     await resolveTestCode('''
 const c = [1, if (1 < 0) 2 else 3, 4];
@@ -1151,6 +218,835 @@
     expect(result.type, typeProvider.setType2(typeProvider.intType));
     expect(result.toSetValue().map((e) => e.toIntValue()), [1, 2, 3, 4]);
   }
+
+  test_visitAsExpression_instanceOfSameClass() async {
+    await resolveTestCode('''
+const a = const A();
+const b = a as A;
+class A {
+  const A();
+}
+''');
+    DartObjectImpl resultA = _evaluateConstant('a');
+    DartObjectImpl resultB = _evaluateConstant('b');
+    expect(resultB, resultA);
+  }
+
+  test_visitAsExpression_instanceOfSubclass() async {
+    await resolveTestCode('''
+const a = const B();
+const b = a as A;
+class A {
+  const A();
+}
+class B extends A {
+  const B();
+}
+''');
+    DartObjectImpl resultA = _evaluateConstant('a');
+    DartObjectImpl resultB = _evaluateConstant('b');
+    expect(resultB, resultA);
+  }
+
+  test_visitAsExpression_instanceOfSuperclass() async {
+    await resolveTestCode('''
+const a = const A();
+const b = a as B;
+class A {
+  const A();
+}
+class B extends A {
+  const B();
+}
+''');
+    DartObjectImpl result = _evaluateConstant('b',
+        errorCodes: [CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION]);
+    expect(result, isNull);
+  }
+
+  test_visitAsExpression_instanceOfUnrelatedClass() async {
+    await resolveTestCode('''
+const a = const A();
+const b = a as B;
+class A {
+  const A();
+}
+class B {
+  const B();
+}
+''');
+    DartObjectImpl result = _evaluateConstant('b',
+        errorCodes: [CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION]);
+    expect(result, isNull);
+  }
+
+  test_visitAsExpression_null() async {
+    await resolveTestCode('''
+const a = null;
+const b = a as A;
+class A {}
+''');
+    DartObjectImpl result = _evaluateConstant('b');
+    expect(result.type, typeProvider.nullType);
+  }
+
+  test_visitAsExpression_potentialConst() async {
+    await assertNoErrorsInCode('''
+class A {
+  const A();
+}
+
+class MyClass {
+  final A a;
+  const MyClass(Object o) : a = o as A;
+}
+''');
+  }
+
+  test_visitBinaryExpression_and_bool_known_known() async {
+    await resolveTestCode('''
+const c = false & true;
+''');
+    DartObjectImpl result = _evaluateConstant('c');
+    expect(result.type, typeProvider.boolType);
+  }
+
+  test_visitBinaryExpression_and_bool_known_unknown() async {
+    await resolveTestCode('''
+const b = bool.fromEnvironment('y');
+const c = false & b;
+''');
+    DartObjectImpl result = _evaluateConstant('c');
+    expect(result.type, typeProvider.boolType);
+  }
+
+  test_visitBinaryExpression_and_bool_unknown_known() async {
+    await resolveTestCode('''
+const a = bool.fromEnvironment('x');
+const c = a & true;
+''');
+    DartObjectImpl result = _evaluateConstant('c');
+    expect(result.type, typeProvider.boolType);
+  }
+
+  test_visitBinaryExpression_and_bool_unknown_unknown() async {
+    await resolveTestCode('''
+const a = bool.fromEnvironment('x');
+const b = bool.fromEnvironment('y');
+const c = a & b;
+''');
+    DartObjectImpl result = _evaluateConstant('c');
+    expect(result.type, typeProvider.boolType);
+  }
+
+  test_visitBinaryExpression_and_int() async {
+    await resolveTestCode('''
+const c = 3 & 5;
+''');
+    DartObjectImpl result = _evaluateConstant('c');
+    expect(result.type, typeProvider.intType);
+  }
+
+  test_visitBinaryExpression_and_mixed() async {
+    await resolveTestCode('''
+const c = 3 & false;
+''');
+    _evaluateConstant('c',
+        errorCodes: [CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_INT]);
+  }
+
+  test_visitBinaryExpression_or_bool_known_known() async {
+    await resolveTestCode('''
+const c = false | true;
+''');
+    DartObjectImpl result = _evaluateConstant('c');
+    expect(result.type, typeProvider.boolType);
+  }
+
+  test_visitBinaryExpression_or_bool_known_unknown() async {
+    await resolveTestCode('''
+const b = bool.fromEnvironment('y');
+const c = false | b;
+''');
+    DartObjectImpl result = _evaluateConstant('c');
+    expect(result.type, typeProvider.boolType);
+  }
+
+  test_visitBinaryExpression_or_bool_unknown_known() async {
+    await resolveTestCode('''
+const a = bool.fromEnvironment('x');
+const c = a | true;
+''');
+    DartObjectImpl result = _evaluateConstant('c');
+    expect(result.type, typeProvider.boolType);
+  }
+
+  test_visitBinaryExpression_or_bool_unknown_unknown() async {
+    await resolveTestCode('''
+const a = bool.fromEnvironment('x');
+const b = bool.fromEnvironment('y');
+const c = a | b;
+''');
+    DartObjectImpl result = _evaluateConstant('c');
+    expect(result.type, typeProvider.boolType);
+  }
+
+  test_visitBinaryExpression_or_int() async {
+    await resolveTestCode('''
+const c = 3 | 5;
+''');
+    DartObjectImpl result = _evaluateConstant('c');
+    expect(result.type, typeProvider.intType);
+  }
+
+  test_visitBinaryExpression_or_mixed() async {
+    await resolveTestCode('''
+const c = 3 | false;
+''');
+    _evaluateConstant('c',
+        errorCodes: [CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_INT]);
+  }
+
+  test_visitBinaryExpression_questionQuestion_eager_notNull_notNull() async {
+    await resolveTestCode('''
+const c = 'a' ?? 'b';
+''');
+    DartObjectImpl result = _evaluateConstant('c');
+    expect(result.type, typeProvider.stringType);
+    expect(result.toStringValue(), 'a');
+  }
+
+  test_visitBinaryExpression_questionQuestion_eager_null_notNull() async {
+    await resolveTestCode('''
+const c = null ?? 'b';
+''');
+    DartObjectImpl result = _evaluateConstant('c');
+    expect(result.type, typeProvider.stringType);
+    expect(result.toStringValue(), 'b');
+  }
+
+  test_visitBinaryExpression_questionQuestion_eager_null_null() async {
+    await resolveTestCode('''
+const c = null ?? null;
+''');
+    DartObjectImpl result = _evaluateConstant('c');
+    expect(result.isNull, isTrue);
+  }
+
+  test_visitBinaryExpression_questionQuestion_lazy_notNull_invalid() async {
+    await resolveTestCode('''
+const c = 'a' ?? new C();
+class C {}
+''');
+    DartObjectImpl result = _evaluateConstant('c');
+    expect(result.type, typeProvider.stringType);
+    expect(result.toStringValue(), 'a');
+  }
+
+  test_visitBinaryExpression_questionQuestion_lazy_notNull_notNull() async {
+    await resolveTestCode('''
+const c = 'a' ?? 'b';
+''');
+    DartObjectImpl result = _evaluateConstant('c');
+    expect(result.type, typeProvider.stringType);
+    expect(result.toStringValue(), 'a');
+  }
+
+  test_visitBinaryExpression_questionQuestion_lazy_null_invalid() async {
+    await resolveTestCode('''
+const c = null ?? new C();
+class C {}
+''');
+    _evaluateConstant('c', errorCodes: [CompileTimeErrorCode.INVALID_CONSTANT]);
+  }
+
+  test_visitBinaryExpression_questionQuestion_lazy_null_notNull() async {
+    await resolveTestCode('''
+const c = null ?? 'b';
+''');
+    DartObjectImpl result = _evaluateConstant('c');
+    expect(result.type, typeProvider.stringType);
+    expect(result.toStringValue(), 'b');
+  }
+
+  test_visitBinaryExpression_questionQuestion_lazy_null_null() async {
+    await resolveTestCode('''
+const c = null ?? null;
+''');
+    DartObjectImpl result = _evaluateConstant('c');
+    expect(result.isNull, isTrue);
+  }
+
+  test_visitBinaryExpression_xor_bool_known_known() async {
+    await resolveTestCode('''
+const c = false ^ true;
+''');
+    DartObjectImpl result = _evaluateConstant('c');
+    expect(result.type, typeProvider.boolType);
+  }
+
+  test_visitBinaryExpression_xor_bool_known_unknown() async {
+    await resolveTestCode('''
+const b = bool.fromEnvironment('y');
+const c = false ^ b;
+''');
+    DartObjectImpl result = _evaluateConstant('c');
+    expect(result.type, typeProvider.boolType);
+  }
+
+  test_visitBinaryExpression_xor_bool_unknown_known() async {
+    await resolveTestCode('''
+const a = bool.fromEnvironment('x');
+const c = a ^ true;
+''');
+    DartObjectImpl result = _evaluateConstant('c');
+    expect(result.type, typeProvider.boolType);
+  }
+
+  test_visitBinaryExpression_xor_bool_unknown_unknown() async {
+    await resolveTestCode('''
+const a = bool.fromEnvironment('x');
+const b = bool.fromEnvironment('y');
+const c = a ^ b;
+''');
+    DartObjectImpl result = _evaluateConstant('c');
+    expect(result.type, typeProvider.boolType);
+  }
+
+  test_visitBinaryExpression_xor_int() async {
+    await resolveTestCode('''
+const c = 3 ^ 5;
+''');
+    DartObjectImpl result = _evaluateConstant('c');
+    expect(result.type, typeProvider.intType);
+  }
+
+  test_visitBinaryExpression_xor_mixed() async {
+    await resolveTestCode('''
+const c = 3 ^ false;
+''');
+    _evaluateConstant('c',
+        errorCodes: [CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_INT]);
+  }
+
+  test_visitConditionalExpression_eager_false_int_int() async {
+    await resolveTestCode('''
+const c = false ? 1 : 0;
+''');
+    DartObjectImpl result = _evaluateConstant('c');
+    expect(result.type, typeProvider.intType);
+    expect(result.toIntValue(), 0);
+  }
+
+  test_visitConditionalExpression_eager_invalid_int_int() async {
+    await resolveTestCode('''
+const c = null ? 1 : 0;
+''');
+    DartObjectImpl result = _evaluateConstant(
+      'c',
+      errorCodes: [CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL],
+    );
+    expect(result, isNull);
+  }
+
+  test_visitConditionalExpression_eager_true_int_int() async {
+    await resolveTestCode('''
+const c = true ? 1 : 0;
+''');
+    DartObjectImpl result = _evaluateConstant('c');
+    expect(result.type, typeProvider.intType);
+    expect(result.toIntValue(), 1);
+  }
+
+  test_visitConditionalExpression_eager_true_int_invalid() async {
+    await resolveTestCode('''
+const c = true ? 1 : x;
+''');
+    DartObjectImpl result = _evaluateConstant(
+      'c',
+      errorCodes: [CompileTimeErrorCode.INVALID_CONSTANT],
+    );
+    if (analysisOptions.experimentStatus.constant_update_2018) {
+      expect(result.toIntValue(), 1);
+    } else {
+      expect(result, isNull);
+    }
+  }
+
+  test_visitConditionalExpression_eager_true_invalid_int() async {
+    await resolveTestCode('''
+const c = true ? x : 0;
+''');
+    DartObjectImpl result = _evaluateConstant(
+      'c',
+      errorCodes: [CompileTimeErrorCode.INVALID_CONSTANT],
+    );
+    expect(result, isNull);
+  }
+
+  test_visitConditionalExpression_lazy_false_int_int() async {
+    await resolveTestCode('''
+const c = false ? 1 : 0;
+''');
+    DartObjectImpl result = _evaluateConstant('c');
+    expect(result.type, typeProvider.intType);
+    expect(result.toIntValue(), 0);
+  }
+
+  test_visitConditionalExpression_lazy_false_int_invalid() async {
+    await resolveTestCode('''
+const c = false ? 1 : new C();
+''');
+    _evaluateConstant('c', errorCodes: [CompileTimeErrorCode.INVALID_CONSTANT]);
+  }
+
+  test_visitConditionalExpression_lazy_false_invalid_int() async {
+    await resolveTestCode('''
+const c = false ? new C() : 0;
+''');
+    DartObjectImpl result = _evaluateConstant('c',
+        errorCodes: [CompileTimeErrorCode.INVALID_CONSTANT]);
+    expect(result.type, typeProvider.intType);
+    expect(result.toIntValue(), 0);
+  }
+
+  test_visitConditionalExpression_lazy_invalid_int_int() async {
+    await resolveTestCode('''
+const c = 3 ? 1 : 0;
+''');
+    _evaluateConstant('c',
+        errorCodes: [CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL]);
+  }
+
+  test_visitConditionalExpression_lazy_true_int_int() async {
+    await resolveTestCode('''
+const c = true ? 1 : 0;
+''');
+    DartObjectImpl result = _evaluateConstant('c');
+    expect(result.type, typeProvider.intType);
+    expect(result.toIntValue(), 1);
+  }
+
+  test_visitConditionalExpression_lazy_true_int_invalid() async {
+    await resolveTestCode('''
+const c = true ? 1: new C();
+''');
+    DartObjectImpl result = _evaluateConstant('c',
+        errorCodes: [CompileTimeErrorCode.INVALID_CONSTANT]);
+    expect(result.type, typeProvider.intType);
+    expect(result.toIntValue(), 1);
+  }
+
+  test_visitConditionalExpression_lazy_true_invalid_int() async {
+    await resolveTestCode('''
+const c = true ? new C() : 0;
+class C {}
+''');
+    _evaluateConstant('c', errorCodes: [CompileTimeErrorCode.INVALID_CONSTANT]);
+  }
+
+  test_visitInstanceCreationExpression_bool_fromEnvironment() async {
+    await resolveTestCode('''
+const a = bool.fromEnvironment('a');
+const b = bool.fromEnvironment('b', defaultValue: true);
+''');
+    expect(
+      _evaluateConstant('a'),
+      _boolValue(false),
+    );
+    expect(
+      _evaluateConstant('a', declaredVariables: {'a': 'true'}),
+      _boolValue(true),
+    );
+
+    expect(
+      _evaluateConstant(
+        'b',
+        declaredVariables: {'b': 'bbb'},
+        lexicalEnvironment: {'defaultValue': _boolValue(true)},
+      ),
+      _boolValue(true),
+    );
+  }
+
+  test_visitInstanceCreationExpression_bool_hasEnvironment() async {
+    await resolveTestCode('''
+const a = bool.hasEnvironment('a');
+''');
+    expect(
+      _evaluateConstant('a'),
+      _boolValue(false),
+    );
+
+    expect(
+      _evaluateConstant('a', declaredVariables: {'a': '42'}),
+      _boolValue(true),
+    );
+  }
+
+  test_visitInstanceCreationExpression_int_fromEnvironment() async {
+    await resolveTestCode('''
+const a = int.fromEnvironment('a');
+const b = int.fromEnvironment('b', defaultValue: 42);
+''');
+    expect(
+      _evaluateConstant('a'),
+      _intValue(0),
+    );
+    expect(
+      _evaluateConstant('a', declaredVariables: {'a': '5'}),
+      _intValue(5),
+    );
+
+    expect(
+      _evaluateConstant(
+        'b',
+        declaredVariables: {'b': 'bbb'},
+        lexicalEnvironment: {'defaultValue': _intValue(42)},
+      ),
+      _intValue(42),
+    );
+  }
+
+  test_visitInstanceCreationExpression_string_fromEnvironment() async {
+    await resolveTestCode('''
+const a = String.fromEnvironment('a');
+''');
+    expect(
+      _evaluateConstant('a'),
+      DartObjectImpl(
+        typeSystem,
+        typeProvider.stringType,
+        StringState(''),
+      ),
+    );
+    expect(
+      _evaluateConstant('a', declaredVariables: {'a': 'test'}),
+      DartObjectImpl(
+        typeSystem,
+        typeProvider.stringType,
+        StringState('test'),
+      ),
+    );
+  }
+
+  test_visitIntegerLiteral() async {
+    await resolveTestCode('''
+const double d = 3;
+''');
+    DartObjectImpl result = _evaluateConstant('d');
+    expect(result.type, typeProvider.doubleType);
+    expect(result.toDoubleValue(), 3.0);
+  }
+
+  test_visitIsExpression_is_instanceOfSameClass() async {
+    await resolveTestCode('''
+const a = const A();
+const b = a is A;
+class A {
+  const A();
+}
+''');
+    DartObjectImpl result = _evaluateConstant('b');
+    expect(result.type, typeProvider.boolType);
+    expect(result.toBoolValue(), true);
+  }
+
+  test_visitIsExpression_is_instanceOfSubclass() async {
+    await resolveTestCode('''
+const a = const B();
+const b = a is A;
+class A {
+  const A();
+}
+class B extends A {
+  const B();
+}
+''');
+    DartObjectImpl result = _evaluateConstant('b');
+    expect(result.type, typeProvider.boolType);
+    expect(result.toBoolValue(), true);
+  }
+
+  test_visitIsExpression_is_instanceOfSuperclass() async {
+    await resolveTestCode('''
+const a = const A();
+const b = a is B;
+class A {
+  const A();
+}
+class B extends A {
+  const B();
+}
+''');
+    DartObjectImpl result = _evaluateConstant('b');
+    expect(result.type, typeProvider.boolType);
+    expect(result.toBoolValue(), false);
+  }
+
+  test_visitIsExpression_is_instanceOfUnrelatedClass() async {
+    await resolveTestCode('''
+const a = const A();
+const b = a is B;
+class A {
+  const A();
+}
+class B {
+  const B();
+}
+''');
+    DartObjectImpl result = _evaluateConstant('b');
+    expect(result.type, typeProvider.boolType);
+    expect(result.toBoolValue(), false);
+  }
+
+  test_visitIsExpression_is_null() async {
+    await resolveTestCode('''
+const a = null;
+const b = a is A;
+class A {}
+''');
+    DartObjectImpl result = _evaluateConstant('b');
+    expect(result.type, typeProvider.boolType);
+    expect(result.toBoolValue(), false);
+  }
+
+  test_visitIsExpression_is_null_dynamic() async {
+    await resolveTestCode('''
+const a = null;
+const b = a is dynamic;
+class A {}
+''');
+    DartObjectImpl result = _evaluateConstant('b');
+    expect(result.type, typeProvider.boolType);
+    expect(result.toBoolValue(), true);
+  }
+
+  test_visitIsExpression_is_null_null() async {
+    await resolveTestCode('''
+const a = null;
+const b = a is Null;
+class A {}
+''');
+    DartObjectImpl result = _evaluateConstant('b');
+    expect(result.type, typeProvider.boolType);
+    expect(result.toBoolValue(), true);
+  }
+
+  test_visitIsExpression_is_null_object() async {
+    await resolveTestCode('''
+const a = null;
+const b = a is Object;
+class A {}
+''');
+    DartObjectImpl result = _evaluateConstant('b');
+    expect(result.type, typeProvider.boolType);
+    expect(result.toBoolValue(), true);
+  }
+
+  test_visitIsExpression_isNot_instanceOfSameClass() async {
+    await resolveTestCode('''
+const a = const A();
+const b = a is! A;
+class A {
+  const A();
+}
+''');
+    DartObjectImpl result = _evaluateConstant('b');
+    expect(result.type, typeProvider.boolType);
+    expect(result.toBoolValue(), false);
+  }
+
+  test_visitIsExpression_isNot_instanceOfSubclass() async {
+    await resolveTestCode('''
+const a = const B();
+const b = a is! A;
+class A {
+  const A();
+}
+class B extends A {
+  const B();
+}
+''');
+    DartObjectImpl result = _evaluateConstant('b');
+    expect(result.type, typeProvider.boolType);
+    expect(result.toBoolValue(), false);
+  }
+
+  test_visitIsExpression_isNot_instanceOfSuperclass() async {
+    await resolveTestCode('''
+const a = const A();
+const b = a is! B;
+class A {
+  const A();
+}
+class B extends A {
+  const B();
+}
+''');
+    DartObjectImpl result = _evaluateConstant('b');
+    expect(result.type, typeProvider.boolType);
+    expect(result.toBoolValue(), true);
+  }
+
+  test_visitIsExpression_isNot_instanceOfUnrelatedClass() async {
+    await resolveTestCode('''
+const a = const A();
+const b = a is! B;
+class A {
+  const A();
+}
+class B {
+  const B();
+}
+''');
+    DartObjectImpl result = _evaluateConstant('b');
+    expect(result.type, typeProvider.boolType);
+    expect(result.toBoolValue(), true);
+  }
+
+  test_visitIsExpression_isNot_null() async {
+    await resolveTestCode('''
+const a = null;
+const b = a is! A;
+class A {}
+''');
+    DartObjectImpl result = _evaluateConstant('b');
+    expect(result.type, typeProvider.boolType);
+    expect(result.toBoolValue(), true);
+  }
+
+  test_visitPropertyAccess_fromExtension() async {
+    await resolveTestCode('''
+extension ExtObject on Object {
+  int get length => 4;
+}
+
+class B {
+  final l;
+  const B(Object o) : l = o.length;
+}
+
+const b = B('');
+''');
+    _evaluateConstant('b', errorCodes: [
+      CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION,
+      CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION
+    ]);
+  }
+
+  test_visitSimpleIdentifier_className() async {
+    await resolveTestCode('''
+const a = C;
+class C {}
+''');
+    DartObjectImpl result = _evaluateConstant('a');
+    expect(result.type, typeProvider.typeType);
+    assertType(result.toTypeValue(), 'C');
+  }
+
+  test_visitSimpleIdentifier_dynamic() async {
+    await resolveTestCode('''
+const a = dynamic;
+''');
+    DartObjectImpl result = _evaluateConstant('a');
+    expect(result.type, typeProvider.typeType);
+    expect(result.toTypeValue(), typeProvider.dynamicType);
+  }
+
+  test_visitSimpleIdentifier_inEnvironment() async {
+    await resolveTestCode(r'''
+const a = b;
+const b = 3;''');
+    var environment = <String, DartObjectImpl>{
+      'b': DartObjectImpl(typeSystem, typeProvider.intType, IntState(6)),
+    };
+    var result = _evaluateConstant('a', lexicalEnvironment: environment);
+    expect(result.type, typeProvider.intType);
+    expect(result.toIntValue(), 6);
+  }
+
+  test_visitSimpleIdentifier_notInEnvironment() async {
+    await resolveTestCode(r'''
+const a = b;
+const b = 3;''');
+    var environment = <String, DartObjectImpl>{
+      'c': DartObjectImpl(typeSystem, typeProvider.intType, IntState(6)),
+    };
+    var result = _evaluateConstant('a', lexicalEnvironment: environment);
+    expect(result.type, typeProvider.intType);
+    expect(result.toIntValue(), 3);
+  }
+
+  test_visitSimpleIdentifier_withoutEnvironment() async {
+    await resolveTestCode(r'''
+const a = b;
+const b = 3;''');
+    var result = _evaluateConstant('a');
+    expect(result.type, typeProvider.intType);
+    expect(result.toIntValue(), 3);
+  }
+
+  DartObjectImpl _boolValue(bool value) {
+    if (identical(value, false)) {
+      return DartObjectImpl(
+        typeSystem,
+        typeProvider.boolType,
+        BoolState.FALSE_STATE,
+      );
+    } else if (identical(value, true)) {
+      return DartObjectImpl(
+        typeSystem,
+        typeProvider.boolType,
+        BoolState.TRUE_STATE,
+      );
+    }
+    fail("Invalid boolean value used in test");
+  }
+
+  DartObjectImpl _intValue(int value) {
+    return DartObjectImpl(
+      typeSystem,
+      typeProvider.intType,
+      IntState(value),
+    );
+  }
+}
+
+class ConstantVisitorTestSupport extends PubPackageResolutionTest {
+  DartObjectImpl _evaluateConstant(
+    String name, {
+    List<ErrorCode> errorCodes,
+    Map<String, String> declaredVariables = const {},
+    Map<String, DartObjectImpl> lexicalEnvironment,
+  }) {
+    var expression = findNode.topVariableDeclarationByName(name).initializer;
+
+    var source = this.result.unit.declaredElement.source;
+    var errorListener = GatheringErrorListener();
+    var errorReporter = ErrorReporter(
+      errorListener,
+      source,
+      isNonNullableByDefault: false,
+    );
+
+    DartObjectImpl result = expression.accept(
+      ConstantVisitor(
+        ConstantEvaluationEngine(
+          DeclaredVariables.fromMap(declaredVariables),
+        ),
+        this.result.libraryElement,
+        errorReporter,
+        lexicalEnvironment: lexicalEnvironment,
+      ),
+    );
+    if (errorCodes == null) {
+      errorListener.assertNoErrors();
+    } else {
+      errorListener.assertErrorsWithCodes(errorCodes);
+    }
+    return result;
+  }
 }
 
 @reflectiveTest
@@ -1171,3 +1067,115 @@
 ''');
   }
 }
+
+@reflectiveTest
+class ConstantVisitorWithNullSafetyWithTripleShiftTest
+    extends ConstantVisitorTestSupport {
+  @override
+  String get testPackageLanguageVersion =>
+      '${ExperimentStatus.currentVersion.major}.'
+      '${ExperimentStatus.currentVersion.minor}';
+
+  @override
+  void setUp() {
+    super.setUp();
+
+    writeTestPackageAnalysisOptionsFile(
+      AnalysisOptionsFileConfig(
+        experiments: [
+          // TODO(scheglov) https://github.com/dart-lang/sdk/issues/43837
+          EnableString.non_nullable,
+          EnableString.triple_shift,
+        ],
+      ),
+    );
+  }
+
+  test_visitBinaryExpression_gtGtGt_negative_fewerBits() async {
+    await resolveTestCode('''
+const c = 0xFFFFFFFF >>> 8;
+''');
+    DartObjectImpl result = _evaluateConstant('c');
+    expect(result.type, typeProvider.intType);
+    expect(result.toIntValue(), 0xFFFFFF);
+  }
+
+  test_visitBinaryExpression_gtGtGt_negative_moreBits() async {
+    await resolveTestCode('''
+const c = 0xFFFFFFFF >>> 33;
+''');
+    DartObjectImpl result = _evaluateConstant('c');
+    expect(result.type, typeProvider.intType);
+    expect(result.toIntValue(), 0);
+  }
+
+  test_visitBinaryExpression_gtGtGt_negative_moreThan64Bits() async {
+    await resolveTestCode('''
+const c = 0xFFFFFFFF >>> 65;
+''');
+    DartObjectImpl result = _evaluateConstant('c');
+    expect(result.type, typeProvider.intType);
+    expect(result.toIntValue(), 0);
+  }
+
+  test_visitBinaryExpression_gtGtGt_negative_negativeBits() async {
+    await resolveTestCode('''
+const c = 0xFFFFFFFF >>> -2;
+''');
+    _evaluateConstant('c',
+        errorCodes: [CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION]);
+  }
+
+  test_visitBinaryExpression_gtGtGt_negative_zeroBits() async {
+    await resolveTestCode('''
+const c = 0xFFFFFFFF >>> 0;
+''');
+    DartObjectImpl result = _evaluateConstant('c');
+    expect(result.type, typeProvider.intType);
+    expect(result.toIntValue(), 0xFFFFFFFF);
+  }
+
+  test_visitBinaryExpression_gtGtGt_positive_fewerBits() async {
+    await resolveTestCode('''
+const c = 0xFF >>> 3;
+''');
+    DartObjectImpl result = _evaluateConstant('c');
+    expect(result.type, typeProvider.intType);
+    expect(result.toIntValue(), 0x1F);
+  }
+
+  test_visitBinaryExpression_gtGtGt_positive_moreBits() async {
+    await resolveTestCode('''
+const c = 0xFF >>> 9;
+''');
+    DartObjectImpl result = _evaluateConstant('c');
+    expect(result.type, typeProvider.intType);
+    expect(result.toIntValue(), 0);
+  }
+
+  test_visitBinaryExpression_gtGtGt_positive_moreThan64Bits() async {
+    await resolveTestCode('''
+const c = 0xFF >>> 65;
+''');
+    DartObjectImpl result = _evaluateConstant('c');
+    expect(result.type, typeProvider.intType);
+    expect(result.toIntValue(), 0);
+  }
+
+  test_visitBinaryExpression_gtGtGt_positive_negativeBits() async {
+    await resolveTestCode('''
+const c = 0xFF >>> -2;
+''');
+    _evaluateConstant('c',
+        errorCodes: [CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION]);
+  }
+
+  test_visitBinaryExpression_gtGtGt_positive_zeroBits() async {
+    await resolveTestCode('''
+const c = 0xFF >>> 0;
+''');
+    DartObjectImpl result = _evaluateConstant('c');
+    expect(result.type, typeProvider.intType);
+    expect(result.toIntValue(), 0xFF);
+  }
+}
diff --git a/pkg/analyzer/test/src/dart/constant/value_test.dart b/pkg/analyzer/test/src/dart/constant/value_test.dart
index 7c3ae1a..f9aa5a8 100644
--- a/pkg/analyzer/test/src/dart/constant/value_test.dart
+++ b/pkg/analyzer/test/src/dart/constant/value_test.dart
@@ -834,6 +834,18 @@
     _assertIdentical(_boolValue(null), _stringValue(null), _stringValue("def"));
   }
 
+  void test_integerDivide_infinity_knownDouble() {
+    _assertIntegerDivide(
+      null,
+      _doubleValue(double.infinity),
+      _doubleValue(2.0),
+    );
+  }
+
+  void test_integerDivide_infinity_knownInt() {
+    _assertIntegerDivide(null, _doubleValue(double.infinity), _intValue(2));
+  }
+
   void test_integerDivide_knownDouble_knownDouble() {
     _assertIntegerDivide(_intValue(3), _doubleValue(6.0), _doubleValue(2.0));
   }
@@ -851,6 +863,10 @@
     _assertIntegerDivide(_intValue(null), _doubleValue(6.0), _intValue(null));
   }
 
+  void test_integerDivide_knownInt_knownDoubleZero() {
+    _assertIntegerDivide(null, _intValue(6), _doubleValue(0.0));
+  }
+
   void test_integerDivide_knownInt_knownInt() {
     _assertIntegerDivide(_intValue(3), _intValue(6), _intValue(2));
   }
@@ -867,10 +883,38 @@
     _assertIntegerDivide(_intValue(null), _intValue(6), _intValue(null));
   }
 
+  void test_integerDivide_knownInt_zero() {
+    _assertIntegerDivide(null, _intValue(2), _intValue(0));
+  }
+
   void test_integerDivide_knownString_knownInt() {
     _assertIntegerDivide(null, _stringValue("6"), _intValue(2));
   }
 
+  void test_integerDivide_NaN_knownDouble() {
+    _assertIntegerDivide(null, _doubleValue(double.nan), _doubleValue(2.0));
+  }
+
+  void test_integerDivide_NaN_knownInt() {
+    _assertIntegerDivide(null, _doubleValue(double.nan), _intValue(2));
+  }
+
+  void test_integerDivide_negativeInfinity_knownDouble() {
+    _assertIntegerDivide(
+      null,
+      _doubleValue(double.negativeInfinity),
+      _doubleValue(2.0),
+    );
+  }
+
+  void test_integerDivide_negativeInfinity_knownInt() {
+    _assertIntegerDivide(
+      null,
+      _doubleValue(double.negativeInfinity),
+      _intValue(2),
+    );
+  }
+
   void test_integerDivide_unknownDouble_knownDouble() {
     _assertIntegerDivide(
         _intValue(null), _doubleValue(null), _doubleValue(2.0));
diff --git a/pkg/analyzer/test/src/dart/element/element_test.dart b/pkg/analyzer/test/src/dart/element/element_test.dart
index c86ea47..5b35e23 100644
--- a/pkg/analyzer/test/src/dart/element/element_test.dart
+++ b/pkg/analyzer/test/src/dart/element/element_test.dart
@@ -1061,10 +1061,10 @@
   }
 
   void test_equality_recursive() {
-    var s = ElementFactory.genericTypeAliasElement('s');
-    var t = ElementFactory.genericTypeAliasElement('t');
-    var u = ElementFactory.genericTypeAliasElement('u');
-    var v = ElementFactory.genericTypeAliasElement('v');
+    var s = ElementFactory.functionTypeAliasElement('s');
+    var t = ElementFactory.functionTypeAliasElement('t');
+    var u = ElementFactory.functionTypeAliasElement('u');
+    var v = ElementFactory.functionTypeAliasElement('v');
     s.function.returnType = functionTypeAliasType(t);
     t.function.returnType = functionTypeAliasType(s);
     u.function.returnType = functionTypeAliasType(v);
@@ -1207,8 +1207,8 @@
   }
 
   void test_toString_recursive() {
-    var t = ElementFactory.genericTypeAliasElement("t");
-    var s = ElementFactory.genericTypeAliasElement("s");
+    var t = ElementFactory.functionTypeAliasElement("t");
+    var s = ElementFactory.functionTypeAliasElement("s");
     t.function.returnType = functionTypeAliasType(s);
     s.function.returnType = functionTypeAliasType(t);
     assertType(
@@ -1218,7 +1218,7 @@
   }
 
   void test_toString_recursive_via_interface_type() {
-    var f = ElementFactory.genericTypeAliasElement('f');
+    var f = ElementFactory.functionTypeAliasElement('f');
     ClassElementImpl c = ElementFactory.classElement2('C', ['T']);
     f.function.returnType = c.instantiate(
       typeArguments: [functionTypeAliasType(f)],
diff --git a/pkg/analyzer/test/src/dart/element/function_type_test.dart b/pkg/analyzer/test/src/dart/element/function_type_test.dart
index 72efa9d..803d055 100644
--- a/pkg/analyzer/test/src/dart/element/function_type_test.dart
+++ b/pkg/analyzer/test/src/dart/element/function_type_test.dart
@@ -75,14 +75,14 @@
     expect(f.typeFormals, typeFormals, reason: 'typeFormals');
   }
 
-  GenericTypeAliasElementImpl genericTypeAliasElement(
+  FunctionTypeAliasElementImpl functionTypeAliasElement(
     String name, {
     List<ParameterElement> parameters = const [],
     DartType returnType,
     List<TypeParameterElement> typeParameters = const [],
     List<TypeParameterElement> innerTypeParameters = const [],
   }) {
-    var aliasElement = GenericTypeAliasElementImpl(name, 0);
+    var aliasElement = FunctionTypeAliasElementImpl(name, 0);
     aliasElement.typeParameters = typeParameters;
 
     var functionElement = GenericFunctionTypeElementImpl.forOffset(0);
diff --git a/pkg/analyzer/test/src/dart/element/nullable_test.dart b/pkg/analyzer/test/src/dart/element/nullable_test.dart
index d690043..a2a8c54 100644
--- a/pkg/analyzer/test/src/dart/element/nullable_test.dart
+++ b/pkg/analyzer/test/src/dart/element/nullable_test.dart
@@ -2,19 +2,15 @@
 // 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:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/nullability_suffix.dart';
 import 'package:analyzer/dart/element/type.dart';
-import 'package:analyzer/dart/element/type_provider.dart';
 import 'package:analyzer/src/dart/element/type.dart';
-import 'package:analyzer/src/dart/element/type_system.dart';
 import 'package:meta/meta.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../../../generated/elements_types_mixin.dart';
-import '../../../generated/test_analysis_context.dart';
+import '../../../generated/type_system_test.dart';
 
 main() {
   defineReflectiveSuite(() {
@@ -28,7 +24,7 @@
 }
 
 @reflectiveTest
-class IsNonNullableTest extends _NullableBase {
+class IsNonNullableTest extends AbstractTypeSystemNullSafetyTest {
   void isNonNullable(DartType type) {
     expect(typeSystem.isNonNullable(type), isTrue);
   }
@@ -193,7 +189,7 @@
 }
 
 @reflectiveTest
-class IsNullableTest extends _NullableBase {
+class IsNullableTest extends AbstractTypeSystemNullSafetyTest {
   void isNotNullable(DartType type) {
     expect(typeSystem.isNullable(type), isFalse);
   }
@@ -358,7 +354,7 @@
 }
 
 @reflectiveTest
-class IsPotentiallyNonNullableTest extends _NullableBase {
+class IsPotentiallyNonNullableTest extends AbstractTypeSystemNullSafetyTest {
   void isNotPotentiallyNonNullable(DartType type) {
     expect(typeSystem.isPotentiallyNonNullable(type), isFalse);
   }
@@ -405,7 +401,7 @@
 }
 
 @reflectiveTest
-class IsPotentiallyNullableTest extends _NullableBase {
+class IsPotentiallyNullableTest extends AbstractTypeSystemNullSafetyTest {
   void isNotPotentiallyNullable(DartType type) {
     expect(typeSystem.isPotentiallyNullable(type), isFalse);
   }
@@ -452,7 +448,7 @@
 }
 
 @reflectiveTest
-class IsStrictlyNonNullableTest extends _NullableBase {
+class IsStrictlyNonNullableTest extends AbstractTypeSystemNullSafetyTest {
   void isNotStrictlyNonNullable(DartType type) {
     expect(typeSystem.isStrictlyNonNullable(type), isFalse);
   }
@@ -599,7 +595,7 @@
 }
 
 @reflectiveTest
-class PromoteToNonNullTest extends _NullableBase {
+class PromoteToNonNullTest extends AbstractTypeSystemNullSafetyTest {
   test_dynamic() {
     _check(dynamicType, dynamicType);
   }
@@ -797,22 +793,3 @@
     expect(actual.nullabilitySuffix, NullabilitySuffix.none);
   }
 }
-
-abstract class _NullableBase with ElementsTypesMixin {
-  @override
-  TypeProvider typeProvider;
-
-  TypeSystemImpl typeSystem;
-
-  FeatureSet get testFeatureSet {
-    return FeatureSet.forTesting();
-  }
-
-  void setUp() {
-    var analysisContext = TestAnalysisContext(
-      featureSet: testFeatureSet,
-    );
-    typeProvider = analysisContext.typeProviderLegacy;
-    typeSystem = analysisContext.typeSystemLegacy;
-  }
-}
diff --git a/pkg/analyzer/test/src/dart/micro/file_resolution.dart b/pkg/analyzer/test/src/dart/micro/file_resolution.dart
index 250b588..b03a488 100644
--- a/pkg/analyzer/test/src/dart/micro/file_resolution.dart
+++ b/pkg/analyzer/test/src/dart/micro/file_resolution.dart
@@ -53,7 +53,6 @@
       getFileDigest: (String path) => _getDigest(path),
       workspace: workspace,
       prefetchFiles: null,
-      libraryContextResetTimeout: null,
     );
     fileResolver.testView = FileResolverTestView();
   }
@@ -83,6 +82,7 @@
     sdk = MockSdk(resourceProvider: resourceProvider);
 
     newFile('/workspace/WORKSPACE', content: '');
+    newFile('/workspace/dart/test/BUILD', content: '');
     createFileResolver();
   }
 
diff --git a/pkg/analyzer/test/src/dart/micro/simple_file_resolver_test.dart b/pkg/analyzer/test/src/dart/micro/simple_file_resolver_test.dart
index 45500b8..549701d 100644
--- a/pkg/analyzer/test/src/dart/micro/simple_file_resolver_test.dart
+++ b/pkg/analyzer/test/src/dart/micro/simple_file_resolver_test.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/src/dart/error/syntactic_errors.dart';
-import 'package:analyzer/src/dart/micro/libraries_log.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/lint/registry.dart';
 import 'package:matcher/matcher.dart';
@@ -25,10 +24,6 @@
   String bPath;
   String cPath;
 
-  String get _asyncLibraryPath => futureElement.library.source.fullName;
-
-  String get _coreLibraryPath => intElement.library.source.fullName;
-
   @override
   void setUp() {
     super.setUp();
@@ -37,57 +32,6 @@
     cPath = convertPath('/workspace/dart/test/lib/c.dart');
   }
 
-  test_changeFile_log() async {
-    newFile(aPath, content: r'''
-class A {}
-''');
-
-    newFile(bPath, content: r'''
-import 'a.dart';
-A a;
-B b;
-''');
-
-    result = await resolveFile(bPath);
-    assertErrorsInResolvedUnit(result, [
-      error(CompileTimeErrorCode.UNDEFINED_CLASS, 22, 1),
-    ]);
-
-    newFile(aPath, content: r'''
-class A {}
-class B {}
-''');
-    fileResolver.changeFile(aPath);
-
-    result = await resolveFile(bPath);
-    assertErrorsInResolvedUnit(result, []);
-
-    // The failure of this check will be reported badly.
-    expect(fileResolver.librariesLogEntries, [
-      predicate((LoadLibrariesForTargetLogEntry entry) {
-        expect(entry.target.path, bPath);
-        var loadedPathSet = entry.loaded.map((f) => f.path).toSet();
-        expect(loadedPathSet, contains(aPath));
-        expect(loadedPathSet, contains(bPath));
-        expect(loadedPathSet, contains(_asyncLibraryPath));
-        expect(loadedPathSet, contains(_coreLibraryPath));
-        return true;
-      }),
-      predicate((ChangeFileLoadEntry entry) {
-        expect(entry.target, aPath);
-        var removedPathSet = entry.removed.map((f) => f.path).toSet();
-        expect(removedPathSet, {aPath, bPath});
-        return true;
-      }),
-      predicate((LoadLibrariesForTargetLogEntry entry) {
-        expect(entry.target.path, bPath);
-        var loadedPathSet = entry.loaded.map((f) => f.path).toSet();
-        expect(loadedPathSet, {aPath, bPath});
-        return true;
-      }),
-    ]);
-  }
-
   test_changeFile_refreshedFiles() async {
     newFile(aPath, content: r'''
 class A {}
@@ -464,6 +408,24 @@
     ]);
   }
 
+  test_linkLibraries_getErrors() {
+    addTestFile(r'''
+var a = b;
+var foo = 0;
+''');
+
+    var path = convertPath('/workspace/dart/test/lib/test.dart');
+    fileResolver.linkLibraries(path: path);
+
+    var result = getTestErrors();
+    expect(result.path, path);
+    expect(result.uri.toString(), 'package:dart.test/test.dart');
+    assertErrorsInList(result.errors, [
+      error(CompileTimeErrorCode.UNDEFINED_IDENTIFIER, 8, 1),
+    ]);
+    expect(result.lineInfo.lineStarts, [0, 11, 24]);
+  }
+
   test_nullSafety_enabled() async {
     typeToStringWithNullability = true;
 
@@ -522,6 +484,9 @@
   }
 
   test_reuse_compatibleOptions() async {
+    newFile('/workspace/dart/aaa/BUILD', content: '');
+    newFile('/workspace/dart/bbb/BUILD', content: '');
+
     var aPath = '/workspace/dart/aaa/lib/a.dart';
     var aResult = await assertErrorsInFile(aPath, r'''
 num a = 0;
@@ -543,12 +508,14 @@
   }
 
   test_reuse_incompatibleOptions_implicitCasts() async {
+    newFile('/workspace/dart/aaa/BUILD', content: '');
     newFile('/workspace/dart/aaa/analysis_options.yaml', content: r'''
 analyzer:
   strong-mode:
     implicit-casts: false
 ''');
 
+    newFile('/workspace/dart/bbb/BUILD', content: '');
     newFile('/workspace/dart/bbb/analysis_options.yaml', content: r'''
 analyzer:
   strong-mode:
diff --git a/pkg/analyzer/test/src/dart/resolution/assignment_test.dart b/pkg/analyzer/test/src/dart/resolution/assignment_test.dart
index 3c5983e..d07c1ac 100644
--- a/pkg/analyzer/test/src/dart/resolution/assignment_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/assignment_test.dart
@@ -634,7 +634,7 @@
       type: 'int',
     );
 
-    assertSimpleIdentifier(
+    assertSimpleIdentifierAssignmentTarget(
       assignment.leftHandSide,
       readElement: null,
       writeElement: matcherC,
@@ -666,7 +666,7 @@
       type: 'int',
     );
 
-    assertSimpleIdentifier(
+    assertSimpleIdentifierAssignmentTarget(
       assignment.leftHandSide,
       readElement: null,
       writeElement: findElement.class_('C'),
@@ -715,7 +715,7 @@
     );
 
     var prefixed = assignment.leftHandSide as PrefixedIdentifier;
-    assertSimpleIdentifier(
+    assertSimpleIdentifierAssignmentTarget(
       prefixed.identifier,
       readElement: findElement.getter('x'),
       writeElement: findElement.setter('x'),
@@ -748,7 +748,7 @@
     );
 
     var prefixed = assignment.leftHandSide as PrefixedIdentifier;
-    assertSimpleIdentifier(
+    assertSimpleIdentifierAssignmentTarget(
       prefixed.identifier,
       readElement: null,
       writeElement: findElement.setter('x'),
@@ -783,7 +783,7 @@
     );
 
     var prefixed = assignment.leftHandSide as PrefixedIdentifier;
-    assertSimpleIdentifier(
+    assertSimpleIdentifierAssignmentTarget(
       prefixed.identifier,
       readElement: null,
       writeElement: findElement.getter('x'),
@@ -816,7 +816,7 @@
     );
 
     var prefixed = assignment.leftHandSide as PrefixedIdentifier;
-    assertSimpleIdentifier(
+    assertSimpleIdentifierAssignmentTarget(
       prefixed.identifier,
       readElement: null,
       writeElement: findElement.setter('x'),
@@ -851,7 +851,7 @@
     );
 
     var prefixed = assignment.leftHandSide as PrefixedIdentifier;
-    assertSimpleIdentifier(
+    assertSimpleIdentifierAssignmentTarget(
       prefixed.identifier,
       readElement: null,
       writeElement: findElement.getter('x'),
@@ -893,7 +893,7 @@
     var prefixed = assignment.leftHandSide as PrefixedIdentifier;
     assertImportPrefix(prefixed.prefix, importFind.prefix);
 
-    assertSimpleIdentifier(
+    assertSimpleIdentifierAssignmentTarget(
       prefixed.identifier,
       readElement: importFind.topGet('x'),
       writeElement: importFind.topSet('x'),
@@ -973,7 +973,7 @@
       type: 'int',
     );
 
-    assertSimpleIdentifier(
+    assertSimpleIdentifierAssignmentTarget(
       findNode.simple('b +='),
       readElement: null,
       writeElement: null,
@@ -1015,7 +1015,7 @@
     );
 
     var propertyAccess = assignment.leftHandSide as PropertyAccess;
-    assertSimpleIdentifier(
+    assertSimpleIdentifierAssignmentTarget(
       propertyAccess.propertyName,
       readElement: findElement.getter('x'),
       writeElement: findElement.setter('x'),
@@ -1026,35 +1026,31 @@
   }
 
   test_propertyAccess_forwardingStub() async {
-    await resolveTestCode(r'''
+    await assertNoErrorsInCode(r'''
 class A {
-  int f;
+  int x = 0;
 }
 abstract class I<T> {
-  T f;
+  T x = throw 0;
 }
 class B extends A implements I<int> {}
 main() {
-  new B().f = 1;
+  new B().x = 1;
 }
 ''');
-    var assignment = findNode.assignment('f = 1');
-    assertElementNull(assignment);
-    assertType(assignment, 'int');
 
-    PropertyAccess left = assignment.leftHandSide;
-    assertType(left, 'int');
+    var assignment = findNode.assignment('x = 1');
+    assertAssignment(
+      assignment,
+      readElement: null,
+      readType: null,
+      writeElement: findElement.setter('x', of: 'A'),
+      writeType: 'int',
+      operatorElement: null,
+      type: 'int',
+    );
 
-    InstanceCreationExpression creation = left.target;
-    assertElement(creation, findElement.unnamedConstructor('B'));
-    assertType(creation, 'B');
-
-    var fRef = left.propertyName;
-    assertElement(fRef, findElement.setter('f', of: 'A'));
-    assertType(fRef, 'int');
-
-    var right = assignment.rightHandSide;
-    assertType(right, 'int');
+    assertType(assignment.rightHandSide, 'int');
   }
 
   test_propertyAccess_instance_compound() async {
@@ -1084,7 +1080,7 @@
     );
 
     var propertyAccess = assignment.leftHandSide as PropertyAccess;
-    assertSimpleIdentifier(
+    assertSimpleIdentifierAssignmentTarget(
       propertyAccess.propertyName,
       readElement: findElement.getter('x'),
       writeElement: findElement.setter('x'),
@@ -1154,7 +1150,7 @@
     );
 
     var propertyAccess = assignment.leftHandSide as PropertyAccess;
-    assertSimpleIdentifier(
+    assertSimpleIdentifierAssignmentTarget(
       propertyAccess.propertyName,
       readElement: null,
       writeElement: findElement.setter('x'),
@@ -1197,7 +1193,7 @@
 
     var propertyAccess = assignment.leftHandSide as PropertyAccess;
     assertSuperExpression(propertyAccess.target);
-    assertSimpleIdentifier(
+    assertSimpleIdentifierAssignmentTarget(
       propertyAccess.propertyName,
       readElement: findElement.getter('x', of: 'A'),
       writeElement: findElement.setter('x', of: 'A'),
@@ -1234,7 +1230,7 @@
     );
 
     var propertyAccess = assignment.leftHandSide as PropertyAccess;
-    assertSimpleIdentifier(
+    assertSimpleIdentifierAssignmentTarget(
       propertyAccess.propertyName,
       readElement: findElement.getter('x'),
       writeElement: findElement.setter('x'),
@@ -1350,7 +1346,7 @@
       type: 'int',
     );
 
-    assertSimpleIdentifier(
+    assertSimpleIdentifierAssignmentTarget(
       assignment.leftHandSide,
       readElement: null,
       writeElement: findElement.setter('x'),
@@ -1382,7 +1378,7 @@
       type: 'int',
     );
 
-    assertSimpleIdentifier(
+    assertSimpleIdentifierAssignmentTarget(
       assignment.leftHandSide,
       readElement: null,
       writeElement: findElement.setter('x'),
@@ -1416,7 +1412,7 @@
       type: 'int',
     );
 
-    assertSimpleIdentifier(
+    assertSimpleIdentifierAssignmentTarget(
       assignment.leftHandSide,
       readElement: null,
       writeElement: findElement.getter('x'),
@@ -1450,7 +1446,7 @@
       type: 'int',
     );
 
-    assertSimpleIdentifier(
+    assertSimpleIdentifierAssignmentTarget(
       assignment.leftHandSide,
       readElement: null,
       writeElement: findElement.getter('x'),
@@ -1482,7 +1478,7 @@
       type: 'int',
     );
 
-    assertSimpleIdentifier(
+    assertSimpleIdentifierAssignmentTarget(
       assignment.leftHandSide,
       readElement: null,
       writeElement: findElement.topGet('x'),
@@ -1521,7 +1517,7 @@
       type: 'int',
     );
 
-    assertSimpleIdentifier(
+    assertSimpleIdentifierAssignmentTarget(
       assignment.leftHandSide,
       readElement: null,
       writeElement: findElement.prefix('x'),
@@ -1551,7 +1547,7 @@
       type: 'int',
     );
 
-    assertSimpleIdentifier(
+    assertSimpleIdentifierAssignmentTarget(
       assignment.leftHandSide,
       readElement: null,
       writeElement: findElement.prefix('x'),
@@ -1584,7 +1580,7 @@
       type: 'num', // num + int = num
     );
 
-    assertSimpleIdentifier(
+    assertSimpleIdentifierAssignmentTarget(
       assignment.leftHandSide,
       readElement: findElement.localVar('x'),
       writeElement: findElement.localVar('x'),
@@ -1707,7 +1703,7 @@
       type: 'num',
     );
 
-    assertSimpleIdentifier(
+    assertSimpleIdentifierAssignmentTarget(
       assignment.leftHandSide,
       readElement: findElement.parameter('x'),
       writeElement: findElement.parameter('x'),
@@ -1743,7 +1739,7 @@
       type: 'A',
     );
 
-    assertSimpleIdentifier(
+    assertSimpleIdentifierAssignmentTarget(
       assignment.leftHandSide,
       readElement: findElement.parameter('x'),
       writeElement: findElement.parameter('x'),
@@ -1775,7 +1771,7 @@
       type: 'num',
     );
 
-    assertSimpleIdentifier(
+    assertSimpleIdentifierAssignmentTarget(
       assignment.leftHandSide,
       readElement: findElement.parameter('a'),
       writeElement: findElement.parameter('a'),
@@ -1979,7 +1975,7 @@
       type: 'int',
     );
 
-    assertSimpleIdentifier(
+    assertSimpleIdentifierAssignmentTarget(
       assignment.leftHandSide,
       readElement: null,
       writeElement: findElement.getter('x', of: 'B'),
@@ -2016,7 +2012,7 @@
       type: 'int',
     );
 
-    assertSimpleIdentifier(
+    assertSimpleIdentifierAssignmentTarget(
       assignment.leftHandSide,
       readElement: null,
       writeElement: findElement.method('x', of: 'B'),
@@ -2048,7 +2044,7 @@
       type: 'int',
     );
 
-    assertSimpleIdentifier(
+    assertSimpleIdentifierAssignmentTarget(
       assignment.leftHandSide,
       readElement: null,
       writeElement: findElement.setter('x'),
@@ -2119,7 +2115,7 @@
       type: 'int',
     );
 
-    assertSimpleIdentifier(
+    assertSimpleIdentifierAssignmentTarget(
       assignment.leftHandSide,
       readElement: null,
       writeElement: findElement.setter('x', of: 'A'),
@@ -2155,7 +2151,7 @@
       type: 'int',
     );
 
-    assertSimpleIdentifier(
+    assertSimpleIdentifierAssignmentTarget(
       assignment.leftHandSide,
       readElement: findElement.getter('x'),
       writeElement: findElement.setter('x'),
@@ -2198,7 +2194,7 @@
       type: 'int',
     );
 
-    assertSimpleIdentifier(
+    assertSimpleIdentifierAssignmentTarget(
       assignment.leftHandSide,
       readElement: findElement.getter('x', of: 'M2'),
       writeElement: findElement.setter('x', of: 'M2'),
@@ -2237,7 +2233,7 @@
       type: 'int',
     );
 
-    assertSimpleIdentifier(
+    assertSimpleIdentifierAssignmentTarget(
       assignment.leftHandSide,
       readElement: null,
       writeElement: findElement.topGet('x'),
@@ -2271,7 +2267,7 @@
       type: 'int',
     );
 
-    assertSimpleIdentifier(
+    assertSimpleIdentifierAssignmentTarget(
       assignment.leftHandSide,
       readElement: findElement.topGet('x'),
       writeElement: findElement.topSet('x'),
@@ -2309,7 +2305,7 @@
       type: 'A',
     );
 
-    assertSimpleIdentifier(
+    assertSimpleIdentifierAssignmentTarget(
       assignment.leftHandSide,
       readElement: findElement.topGet('x'),
       writeElement: findElement.topSet('x'),
@@ -2345,7 +2341,7 @@
       type: 'int',
     );
 
-    assertSimpleIdentifier(
+    assertSimpleIdentifierAssignmentTarget(
       assignment.leftHandSide,
       readElement: findElement.topGet('x'),
       writeElement: findElement.topSet('x'),
@@ -2375,7 +2371,7 @@
       type: 'int',
     );
 
-    assertSimpleIdentifier(
+    assertSimpleIdentifierAssignmentTarget(
       assignment.leftHandSide,
       readElement: null,
       writeElement: findElement.topSet('x'),
@@ -2407,7 +2403,7 @@
       type: 'bool',
     );
 
-    assertSimpleIdentifier(
+    assertSimpleIdentifierAssignmentTarget(
       assignment.leftHandSide,
       readElement: null,
       writeElement: findElement.topSet('x'),
@@ -2439,7 +2435,7 @@
       type: 'int',
     );
 
-    assertSimpleIdentifier(
+    assertSimpleIdentifierAssignmentTarget(
       assignment.leftHandSide,
       readElement: null,
       writeElement: findElement.topGet('x'),
@@ -2469,7 +2465,7 @@
       type: 'dynamic',
     );
 
-    assertSimpleIdentifier(
+    assertSimpleIdentifierAssignmentTarget(
       assignment.leftHandSide,
       readElement: null,
       writeElement: intElement,
@@ -2499,7 +2495,7 @@
       type: 'int',
     );
 
-    assertSimpleIdentifier(
+    assertSimpleIdentifierAssignmentTarget(
       assignment.leftHandSide,
       readElement: null,
       writeElement: intElement,
@@ -2529,7 +2525,7 @@
       type: 'dynamic',
     );
 
-    assertSimpleIdentifier(
+    assertSimpleIdentifierAssignmentTarget(
       assignment.leftHandSide,
       readElement: null,
       writeElement: null,
diff --git a/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart b/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart
index 4c28ad0..16d21b17 100644
--- a/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart
+++ b/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart
@@ -4,6 +4,7 @@
 
 import 'package:analyzer/dart/analysis/analysis_context.dart';
 import 'package:analyzer/dart/analysis/analysis_context_collection.dart';
+import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/dart/analysis/analysis_context_collection.dart';
@@ -14,6 +15,7 @@
 import 'package:analyzer/src/generated/engine.dart' show AnalysisOptionsImpl;
 import 'package:analyzer/src/test_utilities/mock_packages.dart';
 import 'package:analyzer/src/test_utilities/mock_sdk.dart';
+import 'package:analyzer/src/test_utilities/package_config_file_builder.dart';
 import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:analyzer/src/workspace/basic.dart';
 import 'package:analyzer/src/workspace/bazel.dart';
@@ -27,6 +29,8 @@
 import 'context_collection_resolution_caching.dart';
 import 'resolution.dart';
 
+export 'package:analyzer/src/test_utilities/package_config_file_builder.dart';
+
 class AnalysisOptionsFileConfig {
   final List<String> experiments;
   final bool implicitCasts;
@@ -247,79 +251,6 @@
   }
 }
 
-class PackageConfigFileBuilder {
-  final List<_PackageDescription> _packages = [];
-
-  void add({
-    @required String name,
-    @required String rootPath,
-    String packageUri = 'lib/',
-    String languageVersion,
-  }) {
-    if (_packages.any((e) => e.name == name)) {
-      throw StateError('Already added: $name');
-    }
-    _packages.add(
-      _PackageDescription(
-        name: name,
-        rootPath: rootPath,
-        packageUri: packageUri,
-        languageVersion: languageVersion,
-      ),
-    );
-  }
-
-  String toContent(String Function(String) toUriStr) {
-    var buffer = StringBuffer();
-
-    buffer.writeln('{');
-
-    var prefix = ' ' * 2;
-    buffer.writeln('$prefix"configVersion": 2,');
-    buffer.writeln('$prefix"packages": [');
-
-    for (var i = 0; i < _packages.length; i++) {
-      var package = _packages[i];
-
-      var prefix = ' ' * 4;
-      buffer.writeln('$prefix{');
-
-      prefix = ' ' * 6;
-      buffer.writeln('$prefix"name": "${package.name}",');
-
-      var rootUri = toUriStr(package.rootPath);
-      buffer.write('$prefix"rootUri": "$rootUri"');
-
-      if (package.packageUri != null) {
-        buffer.writeln(',');
-        buffer.write('$prefix"packageUri": "${package.packageUri}"');
-      }
-
-      if (package.languageVersion != null) {
-        buffer.writeln(',');
-        buffer.write('$prefix"languageVersion": "${package.languageVersion}"');
-      }
-
-      buffer.writeln();
-
-      prefix = ' ' * 4;
-      buffer.write(prefix);
-      buffer.writeln(i < _packages.length - 1 ? '},' : '}');
-    }
-
-    buffer.writeln('  ]');
-    buffer.writeln('}');
-
-    return buffer.toString();
-  }
-
-  PackageConfigFileBuilder _copy() {
-    var copy = PackageConfigFileBuilder();
-    copy._packages.addAll(_packages);
-    return copy;
-  }
-}
-
 class PubPackageResolutionTest extends ContextResolutionTest {
   AnalysisOptionsImpl get analysisOptions {
     var path = convertPath(testPackageRootPath);
@@ -332,6 +263,9 @@
   @override
   String get testFilePath => '$testPackageLibPath/test.dart';
 
+  /// The language version to use by default for `package:test`.
+  String get testPackageLanguageVersion => '2.9';
+
   String get testPackageLibPath => '$testPackageRootPath/lib';
 
   String get testPackageRootPath => '$workspaceRootPath/test';
@@ -347,7 +281,12 @@
   }
 
   void writePackageConfig(String path, PackageConfigFileBuilder config) {
-    newFile(path, content: config.toContent(toUriStr));
+    newFile(
+      path,
+      content: config.toContent(
+        toUriStr: toUriStr,
+      ),
+    );
   }
 
   void writeTestPackageAnalysisOptionsFile(AnalysisOptionsFileConfig config) {
@@ -363,12 +302,12 @@
     bool js = false,
     bool meta = false,
   }) {
-    config = config._copy();
+    config = config.copy();
 
     config.add(
       name: 'test',
       rootPath: testPackageRootPath,
-      languageVersion: languageVersion,
+      languageVersion: languageVersion ?? testPackageLanguageVersion,
     );
 
     if (js) {
@@ -422,8 +361,14 @@
 
 mixin WithNullSafetyMixin on PubPackageResolutionTest {
   @override
+  String get testPackageLanguageVersion =>
+      Feature.non_nullable.isEnabledByDefault ? '2.12' : '2.11';
+
+  @override
   bool get typeToStringWithNullability => true;
 
+  /// TODO(scheglov) https://github.com/dart-lang/sdk/issues/43837
+  /// Remove when Null Safety is enabled by default.
   @nonVirtual
   @override
   void setUp() {
@@ -436,17 +381,3 @@
     );
   }
 }
-
-class _PackageDescription {
-  final String name;
-  final String rootPath;
-  final String packageUri;
-  final String languageVersion;
-
-  _PackageDescription({
-    @required this.name,
-    @required this.rootPath,
-    @required this.packageUri,
-    @required this.languageVersion,
-  });
-}
diff --git a/pkg/analyzer/test/src/dart/resolution/extension_method_test.dart b/pkg/analyzer/test/src/dart/resolution/extension_method_test.dart
index 6c9b81a..f0ee58d 100644
--- a/pkg/analyzer/test/src/dart/resolution/extension_method_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/extension_method_test.dart
@@ -1011,8 +1011,15 @@
   c[2] = 1;
 }
 ''');
-    var index = findNode.index('c[2]');
-    assertElement(index, findElement.method('[]=', of: 'C'));
+    assertAssignment(
+      findNode.assignment('[2] ='),
+      readElement: null,
+      readType: null,
+      writeElement: findElement.method('[]=', of: 'C'),
+      writeType: 'int',
+      operatorElement: null,
+      type: 'int',
+    );
   }
 
   test_instance_operator_indexEquals_fromExtension_functionType() async {
@@ -1024,8 +1031,15 @@
   f[2] = 3;
 }
 ''');
-    var index = findNode.index('f[2]');
-    assertElement(index, findElement.method('[]=', of: 'E'));
+    assertAssignment(
+      findNode.assignment('f[2]'),
+      readElement: null,
+      readType: null,
+      writeElement: findElement.method('[]=', of: 'E'),
+      writeType: 'int',
+      operatorElement: null,
+      type: 'int',
+    );
   }
 
   test_instance_operator_indexEquals_fromExtension_interfaceType() async {
@@ -1038,8 +1052,15 @@
   c[2] = 3;
 }
 ''');
-    var index = findNode.index('c[2]');
-    assertElement(index, findElement.method('[]=', of: 'E'));
+    assertAssignment(
+      findNode.assignment('c[2]'),
+      readElement: null,
+      readType: null,
+      writeElement: findElement.method('[]=', of: 'E'),
+      writeType: 'int',
+      operatorElement: null,
+      type: 'int',
+    );
   }
 
   test_instance_operator_postfix_fromExtendedType() async {
@@ -1180,8 +1201,15 @@
   f.a = 1;
 }
 ''');
-    var access = findNode.prefixed('f.a');
-    assertElement(access, findElement.setter('a'));
+    assertAssignment(
+      findNode.assignment('a = 1'),
+      readElement: null,
+      readType: null,
+      writeElement: findElement.setter('a'),
+      writeType: 'int',
+      operatorElement: null,
+      type: 'int',
+    );
   }
 
   test_instance_setter_oneMatch() async {
@@ -1196,8 +1224,15 @@
   c.a = 1;
 }
 ''');
-    var access = findNode.prefixed('c.a');
-    assertElement(access, findElement.setter('a'));
+    assertAssignment(
+      findNode.assignment('a = 1'),
+      readElement: null,
+      readType: null,
+      writeElement: findElement.setter('a'),
+      writeType: 'int',
+      operatorElement: null,
+      type: 'int',
+    );
   }
 
   test_instance_tearoff_fromExtension_functionType() async {
@@ -1356,9 +1391,16 @@
   p.E.a = 3;
 }
 ''');
-    var identifier = findNode.simple('a =');
-    var import = findElement.importFind('package:test/lib.dart');
-    assertElement(identifier, import.extension_('E').getSetter('a'));
+    var importFind = findElement.importFind('package:test/lib.dart');
+    assertAssignment(
+      findNode.assignment('a = 3'),
+      readElement: null,
+      readType: null,
+      writeElement: importFind.setter('a'),
+      writeType: 'int',
+      operatorElement: null,
+      type: 'int',
+    );
   }
 
   test_static_setter_local() async {
@@ -1373,8 +1415,15 @@
   E.a = 3;
 }
 ''');
-    var identifier = findNode.simple('a =');
-    assertElement(identifier, findElement.setter('a'));
+    assertAssignment(
+      findNode.assignment('a = 3'),
+      readElement: null,
+      readType: null,
+      writeElement: findElement.setter('a'),
+      writeType: 'int',
+      operatorElement: null,
+      type: 'int',
+    );
   }
 
   test_static_tearoff() async {
@@ -1662,8 +1711,15 @@
   a.foo = 1;
 }
 ''');
-    var access = findNode.prefixed('a.foo');
-    assertElement(access, findElement.setter('foo'));
+    assertAssignment(
+      findNode.assignment('foo = 1'),
+      readElement: null,
+      readType: null,
+      writeElement: findElement.setter('foo'),
+      writeType: 'int',
+      operatorElement: null,
+      type: 'int',
+    );
   }
 
   test_instance_setter_fromInstance_nullAware() async {
@@ -1676,8 +1732,15 @@
   a?.foo = 1;
 }
 ''');
-    var access = findNode.propertyAccess('a?.foo');
-    assertElement(access, findElement.setter('foo'));
+    assertAssignment(
+      findNode.assignment('foo = 1'),
+      readElement: null,
+      readType: null,
+      writeElement: findElement.setter('foo'),
+      writeType: 'int',
+      operatorElement: null,
+      type: 'int?',
+    );
   }
 }
 
@@ -1848,8 +1911,15 @@
   void b() { this[2] = 1; }
 }
 ''');
-    var index = findNode.index('this[2]');
-    assertElement(index, findElement.method('[]=', of: 'C'));
+    assertAssignment(
+      findNode.assignment('this[2]'),
+      readElement: null,
+      readType: null,
+      writeElement: findElement.method('[]=', of: 'C'),
+      writeType: 'int',
+      operatorElement: null,
+      type: 'int',
+    );
   }
 
   test_instance_operator_indexEquals_fromThis_fromExtension() async {
@@ -1860,8 +1930,15 @@
   void b() { this[2] = 3; }
 }
 ''');
-    var index = findNode.index('this[2]');
-    assertElement(index, findElement.method('[]=', of: 'E'));
+    assertAssignment(
+      findNode.assignment('this[2]'),
+      readElement: null,
+      readType: null,
+      writeElement: findElement.method('[]=', of: 'E'),
+      writeType: 'int',
+      operatorElement: null,
+      type: 'int',
+    );
   }
 
   test_instance_operator_unary_fromThis_fromExtendedType() async {
@@ -1893,35 +1970,49 @@
   test_instance_setter_fromInstance() async {
     await assertNoErrorsInCode('''
 class C {
-  set a(int) {}
+  set a(int _) {}
 }
 
 extension E on C {
-  set a(int) {}
+  set a(int _) {}
   void m() {
     a = 3;
   }
 }
 ''');
-    var identifier = findNode.simple('a =');
-    assertElement(identifier, findElement.setter('a', of: 'E'));
+    assertAssignment(
+      findNode.assignment('a = 3'),
+      readElement: null,
+      readType: null,
+      writeElement: findElement.setter('a', of: 'E'),
+      writeType: 'int',
+      operatorElement: null,
+      type: 'int',
+    );
   }
 
   test_instance_setter_fromThis_fromExtendedType() async {
     await assertNoErrorsInCode('''
 class C {
-  set a(int) {}
+  set a(int _) {}
 }
 
 extension E on C {
-  set a(int) {}
+  set a(int _) {}
   void m() {
     this.a = 3;
   }
 }
 ''');
-    var access = findNode.propertyAccess('this.a');
-    assertElement(access, findElement.setter('a', of: 'C'));
+    assertAssignment(
+      findNode.assignment('a = 3'),
+      readElement: null,
+      readType: null,
+      writeElement: findElement.setter('a', of: 'C'),
+      writeType: 'int',
+      operatorElement: null,
+      type: 'int',
+    );
   }
 
   test_instance_setter_fromThis_fromExtension() async {
@@ -1929,14 +2020,21 @@
 class C {}
 
 extension E on C {
-  set a(int) {}
+  set a(int _) {}
   void m() {
     this.a = 3;
   }
 }
 ''');
-    var access = findNode.propertyAccess('this.a');
-    assertElement(access, findElement.setter('a', of: 'E'));
+    assertAssignment(
+      findNode.assignment('a = 3'),
+      readElement: null,
+      readType: null,
+      writeElement: findElement.setter('a', of: 'E'),
+      writeType: 'int',
+      operatorElement: null,
+      type: 'int',
+    );
   }
 
   test_instance_tearoff_fromInstance() async {
@@ -2060,8 +2158,15 @@
   }
 }
 ''');
-    var identifier = findNode.simple('a =');
-    assertElement(identifier, findElement.setter('a'));
+    assertAssignment(
+      findNode.assignment('a = 3'),
+      readElement: null,
+      readType: null,
+      writeElement: findElement.setter('a'),
+      writeType: 'int',
+      operatorElement: null,
+      type: 'int',
+    );
   }
 
   test_static_setter_fromStatic() async {
@@ -2075,8 +2180,15 @@
   }
 }
 ''');
-    var identifier = findNode.simple('a =');
-    assertElement(identifier, findElement.setter('a'));
+    assertAssignment(
+      findNode.assignment('a = 3'),
+      readElement: null,
+      readType: null,
+      writeElement: findElement.setter('a'),
+      writeType: 'int',
+      operatorElement: null,
+      type: 'int',
+    );
   }
 
   test_static_tearoff_fromInstance() async {
@@ -2197,8 +2309,15 @@
   }
 }
 ''');
-    var identifier = findNode.simple('a = 0;');
-    assertElement(identifier, findElement.topSet('a'));
+    assertAssignment(
+      findNode.assignment('a = 0'),
+      readElement: null,
+      readType: null,
+      writeElement: findElement.topSet('a'),
+      writeType: 'int',
+      operatorElement: null,
+      type: 'int',
+    );
   }
 
   test_topLevel_setter_fromStatic() async {
@@ -2215,8 +2334,15 @@
   }
 }
 ''');
-    var identifier = findNode.simple('a = 0;');
-    assertElement(identifier, findElement.topSet('a'));
+    assertAssignment(
+      findNode.assignment('a = 0'),
+      readElement: null,
+      readType: null,
+      writeElement: findElement.topSet('a'),
+      writeType: 'int',
+      operatorElement: null,
+      type: 'int',
+    );
   }
 }
 
diff --git a/pkg/analyzer/test/src/dart/resolution/extension_override_test.dart b/pkg/analyzer/test/src/dart/resolution/extension_override_test.dart
index ddcd447..806ada7 100644
--- a/pkg/analyzer/test/src/dart/resolution/extension_override_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/extension_override_test.dart
@@ -125,7 +125,12 @@
 ''');
     findDeclarationAndOverride(declarationName: 'E ', overrideSearch: 'E(a)');
     validateOverride();
-    validatePropertyAccess();
+
+    assertPropertyAccess2(
+      findNode.propertyAccess('.g'),
+      element: findElement.getter('g'),
+      type: 'int',
+    );
   }
 
   test_getter_noPrefix_noTypeArguments_functionExpressionInvocation() async {
@@ -165,7 +170,15 @@
 ''');
     findDeclarationAndOverride(declarationName: 'E', overrideSearch: 'E<int>');
     validateOverride(typeArguments: [intType]);
-    validatePropertyAccess();
+
+    assertPropertyAccess2(
+      findNode.propertyAccess('.g'),
+      element: elementMatcher(
+        findElement.getter('g'),
+        substitution: {'T': 'int'},
+      ),
+      type: 'int',
+    );
   }
 
   test_getter_prefix_noTypeArguments() async {
@@ -186,7 +199,13 @@
         declarationUri: 'package:test/lib.dart',
         overrideSearch: 'E(a)');
     validateOverride();
-    validatePropertyAccess();
+
+    var importFind = findElement.importFind('package:test/lib.dart');
+    assertPropertyAccess2(
+      findNode.propertyAccess('.g'),
+      element: importFind.getter('g'),
+      type: 'int',
+    );
   }
 
   test_getter_prefix_typeArguments() async {
@@ -207,7 +226,16 @@
         declarationUri: 'package:test/lib.dart',
         overrideSearch: 'E<int>');
     validateOverride(typeArguments: [intType]);
-    validatePropertyAccess();
+
+    var importFind = findElement.importFind('package:test/lib.dart');
+    assertPropertyAccess2(
+      findNode.propertyAccess('.g'),
+      element: elementMatcher(
+        importFind.getter('g'),
+        substitution: {'T': 'int'},
+      ),
+      type: 'int',
+    );
   }
 
   test_method_noPrefix_noTypeArguments() async {
@@ -383,7 +411,16 @@
 ''');
     findDeclarationAndOverride(declarationName: 'E ', overrideSearch: 'E(a)');
     validateOverride();
-    validatePropertyAccess();
+
+    assertAssignment(
+      findNode.assignment('s ='),
+      readElement: null,
+      readType: null,
+      writeElement: findElement.setter('s', of: 'E'),
+      writeType: 'int',
+      operatorElement: null,
+      type: 'int',
+    );
   }
 
   test_setter_noPrefix_typeArguments() async {
@@ -398,7 +435,19 @@
 ''');
     findDeclarationAndOverride(declarationName: 'E', overrideSearch: 'E<int>');
     validateOverride(typeArguments: [intType]);
-    validatePropertyAccess();
+
+    assertAssignment(
+      findNode.assignment('s ='),
+      readElement: null,
+      readType: null,
+      writeElement: elementMatcher(
+        findElement.setter('s', of: 'E'),
+        substitution: {'T': 'int'},
+      ),
+      writeType: 'int',
+      operatorElement: null,
+      type: 'int',
+    );
   }
 
   test_setter_prefix_noTypeArguments() async {
@@ -419,7 +468,17 @@
         declarationUri: 'package:test/lib.dart',
         overrideSearch: 'E(a)');
     validateOverride();
-    validatePropertyAccess();
+
+    var importFind = findElement.importFind('package:test/lib.dart');
+    assertAssignment(
+      findNode.assignment('s ='),
+      readElement: null,
+      readType: null,
+      writeElement: importFind.setter('s', of: 'E'),
+      writeType: 'int',
+      operatorElement: null,
+      type: 'int',
+    );
   }
 
   test_setter_prefix_typeArguments() async {
@@ -440,7 +499,20 @@
         declarationUri: 'package:test/lib.dart',
         overrideSearch: 'E<int>');
     validateOverride(typeArguments: [intType]);
-    validatePropertyAccess();
+
+    var importFind = findElement.importFind('package:test/lib.dart');
+    assertAssignment(
+      findNode.assignment('s ='),
+      readElement: null,
+      readType: null,
+      writeElement: elementMatcher(
+        importFind.setter('s', of: 'E'),
+        substitution: {'T': 'int'},
+      ),
+      writeType: 'int',
+      operatorElement: null,
+      type: 'int',
+    );
   }
 
   test_setterAndGetter_noPrefix_noTypeArguments() async {
@@ -456,7 +528,19 @@
 ''');
     findDeclarationAndOverride(declarationName: 'E ', overrideSearch: 'E(a)');
     validateOverride();
-    validatePropertyAccess();
+
+    assertAssignment(
+      findNode.assignment('s +='),
+      readElement: findElement.getter('s', of: 'E'),
+      readType: 'int',
+      writeElement: findElement.setter('s', of: 'E'),
+      writeType: 'int',
+      operatorElement: elementMatcher(
+        numElement.getMethod('+'),
+        isLegacy: isNullSafetySdkAndLegacyLibrary,
+      ),
+      type: 'int',
+    );
   }
 
   test_setterAndGetter_noPrefix_typeArguments() async {
@@ -472,7 +556,25 @@
 ''');
     findDeclarationAndOverride(declarationName: 'E', overrideSearch: 'E<int>');
     validateOverride(typeArguments: [intType]);
-    validatePropertyAccess();
+
+    assertAssignment(
+      findNode.assignment('s +='),
+      readElement: elementMatcher(
+        findElement.getter('s', of: 'E'),
+        substitution: {'T': 'int'},
+      ),
+      readType: 'int',
+      writeElement: elementMatcher(
+        findElement.setter('s', of: 'E'),
+        substitution: {'T': 'int'},
+      ),
+      writeType: 'int',
+      operatorElement: elementMatcher(
+        numElement.getMethod('+'),
+        isLegacy: isNullSafetySdkAndLegacyLibrary,
+      ),
+      type: 'int',
+    );
   }
 
   test_setterAndGetter_prefix_noTypeArguments() async {
@@ -494,7 +596,20 @@
         declarationUri: 'package:test/lib.dart',
         overrideSearch: 'E(a)');
     validateOverride();
-    validatePropertyAccess();
+
+    var importFind = findElement.importFind('package:test/lib.dart');
+    assertAssignment(
+      findNode.assignment('s +='),
+      readElement: importFind.getter('s', of: 'E'),
+      readType: 'int',
+      writeElement: importFind.setter('s', of: 'E'),
+      writeType: 'int',
+      operatorElement: elementMatcher(
+        numElement.getMethod('+'),
+        isLegacy: isNullSafetySdkAndLegacyLibrary,
+      ),
+      type: 'int',
+    );
   }
 
   test_setterAndGetter_prefix_typeArguments() async {
@@ -516,7 +631,26 @@
         declarationUri: 'package:test/lib.dart',
         overrideSearch: 'E<int>');
     validateOverride(typeArguments: [intType]);
-    validatePropertyAccess();
+
+    var importFind = findElement.importFind('package:test/lib.dart');
+    assertAssignment(
+      findNode.assignment('s +='),
+      readElement: elementMatcher(
+        importFind.getter('s', of: 'E'),
+        substitution: {'T': 'int'},
+      ),
+      readType: 'int',
+      writeElement: elementMatcher(
+        importFind.setter('s', of: 'E'),
+        substitution: {'T': 'int'},
+      ),
+      writeType: 'int',
+      operatorElement: elementMatcher(
+        numElement.getMethod('+'),
+        isLegacy: isNullSafetySdkAndLegacyLibrary,
+      ),
+      type: 'int',
+    );
   }
 
   test_tearOff() async {
@@ -583,25 +717,6 @@
     }
     expect(extensionOverride.argumentList.arguments, hasLength(1));
   }
-
-  void validatePropertyAccess() {
-    PropertyAccess access = extensionOverride.parent as PropertyAccess;
-    Element resolvedElement = access.propertyName.staticElement;
-    PropertyAccessorElement expectedElement;
-    if (access.propertyName.inSetterContext()) {
-      expectedElement = extension.getSetter('s');
-      if (access.propertyName.inGetterContext()) {
-        PropertyAccessorElement expectedGetter = extension.getGetter('s');
-        Element actualGetter =
-            // ignore: deprecated_member_use_from_same_package
-            access.propertyName.auxiliaryElements.staticElement;
-        expect(actualGetter, expectedGetter);
-      }
-    } else {
-      expectedElement = extension.getGetter('g');
-    }
-    expect(resolvedElement, expectedElement);
-  }
 }
 
 @reflectiveTest
@@ -637,10 +752,13 @@
 }
 ''');
 
-    assertIndexExpression(
-      findNode.index('[0]'),
+    assertAssignment(
+      findNode.assignment('[0] ='),
       readElement: null,
+      readType: null,
       writeElement: findElement.method('[]=', of: 'E'),
+      writeType: 'int',
+      operatorElement: null,
       type: 'int?',
     );
   }
diff --git a/pkg/analyzer/test/src/dart/resolution/index_expression_test.dart b/pkg/analyzer/test/src/dart/resolution/index_expression_test.dart
index 77238af..9652773 100644
--- a/pkg/analyzer/test/src/dart/resolution/index_expression_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/index_expression_test.dart
@@ -88,12 +88,14 @@
     var numPlusElement = numElement.getMethod('+');
 
     var indexExpression = findNode.index('a[0]');
-    assertIndexExpression(
-      indexExpression,
-      readElement: indexElement,
-      writeElement: indexEqElement,
-      type: 'num',
-    );
+    if (hasAssignmentLeftResolution) {
+      assertIndexExpression(
+        indexExpression,
+        readElement: indexElement,
+        writeElement: indexEqElement,
+        type: 'num',
+      );
+    }
     assertParameterElement(
       indexExpression.index,
       indexEqElement.parameters[0],
@@ -135,18 +137,20 @@
     var doublePlusElement = doubleElement.getMethod('+');
 
     var indexExpression = findNode.index('a[0]');
-    assertIndexExpression(
-      indexExpression,
-      readElement: elementMatcher(
-        indexElement,
-        substitution: {'T': 'double'},
-      ),
-      writeElement: elementMatcher(
-        indexEqElement,
-        substitution: {'T': 'double'},
-      ),
-      type: 'double',
-    );
+    if (hasAssignmentLeftResolution) {
+      assertIndexExpression(
+        indexExpression,
+        readElement: elementMatcher(
+          indexElement,
+          substitution: {'T': 'double'},
+        ),
+        writeElement: elementMatcher(
+          indexEqElement,
+          substitution: {'T': 'double'},
+        ),
+        type: 'double',
+      );
+    }
     assertParameterElement(
       indexExpression.index,
       indexEqElement.parameters[0],
@@ -191,12 +195,14 @@
     var indexEqElement = findElement.method('[]=');
 
     var indexExpression = findNode.index('a[0]');
-    assertIndexExpression(
-      indexExpression,
-      readElement: null,
-      writeElement: indexEqElement,
-      type: null,
-    );
+    if (hasAssignmentLeftResolution) {
+      assertIndexExpression(
+        indexExpression,
+        readElement: null,
+        writeElement: indexEqElement,
+        type: null,
+      );
+    }
     assertParameterElement(
       indexExpression.index,
       indexEqElement.parameters[0],
@@ -212,7 +218,10 @@
       operatorElement: null,
       type: 'double',
     );
-    assertParameterElement(assignment.rightHandSide, null);
+    assertParameterElement(
+      assignment.rightHandSide,
+      indexEqElement.parameters[1],
+    );
   }
 
   test_write_generic() async {
@@ -229,15 +238,17 @@
     var indexEqElement = findElement.method('[]=');
 
     var indexExpression = findNode.index('a[0]');
-    assertIndexExpression(
-      indexExpression,
-      readElement: null,
-      writeElement: elementMatcher(
-        indexEqElement,
-        substitution: {'T': 'double'},
-      ),
-      type: null,
-    );
+    if (hasAssignmentLeftResolution) {
+      assertIndexExpression(
+        indexExpression,
+        readElement: null,
+        writeElement: elementMatcher(
+          indexEqElement,
+          substitution: {'T': 'double'},
+        ),
+        type: null,
+      );
+    }
     assertParameterElement(
       indexExpression.index,
       indexEqElement.parameters[0],
@@ -256,7 +267,10 @@
       operatorElement: null,
       type: 'double',
     );
-    assertParameterElement(assignment.rightHandSide, null);
+    assertParameterElement(
+      assignment.rightHandSide,
+      indexEqElement.parameters[1],
+    );
   }
 }
 
@@ -332,12 +346,14 @@
     var numPlusElement = numElement.getMethod('+');
 
     var indexExpression = findNode.index('a?[0]');
-    assertIndexExpression(
-      indexExpression,
-      readElement: indexElement,
-      writeElement: indexEqElement,
-      type: 'num',
-    );
+    if (hasAssignmentLeftResolution) {
+      assertIndexExpression(
+        indexExpression,
+        readElement: indexElement,
+        writeElement: indexEqElement,
+        type: 'num',
+      );
+    }
     assertParameterElement(
       indexExpression.index,
       indexEqElement.parameters[0],
@@ -372,20 +388,42 @@
 
     var indexEqElement = findElement.method('[]=');
 
-    assertIndexExpression(
-      findNode.index('..[0]'),
+    assertAssignment(
+      findNode.assignment('[0]'),
       readElement: null,
-      writeElement: indexEqElement,
-      type: null,
+      readType: null,
+      writeElement: findElement.method('[]='),
+      writeType: 'A',
+      operatorElement: null,
+      type: 'A',
     );
 
-    assertIndexExpression(
-      findNode.index('..[1]'),
+    assertAssignment(
+      findNode.assignment('[1]'),
       readElement: null,
-      writeElement: indexEqElement,
-      type: null,
+      readType: null,
+      writeElement: findElement.method('[]='),
+      writeType: 'A',
+      operatorElement: null,
+      type: 'A',
     );
 
+    if (hasAssignmentLeftResolution) {
+      assertIndexExpression(
+        findNode.index('..[0]'),
+        readElement: null,
+        writeElement: indexEqElement,
+        type: null,
+      );
+
+      assertIndexExpression(
+        findNode.index('..[1]'),
+        readElement: null,
+        writeElement: indexEqElement,
+        type: null,
+      );
+    }
+
     assertType(findNode.cascade('a?'), 'A?');
   }
 
@@ -403,12 +441,14 @@
     var indexEqElement = findElement.method('[]=');
 
     var indexExpression = findNode.index('a?[0]');
-    assertIndexExpression(
-      indexExpression,
-      readElement: null,
-      writeElement: indexEqElement,
-      type: null,
-    );
+    if (hasAssignmentLeftResolution) {
+      assertIndexExpression(
+        indexExpression,
+        readElement: null,
+        writeElement: indexEqElement,
+        type: null,
+      );
+    }
     assertParameterElement(
       indexExpression.index,
       indexEqElement.parameters[0],
@@ -424,6 +464,9 @@
       operatorElement: null,
       type: 'double?',
     );
-    assertParameterElement(assignment.rightHandSide, null);
+    assertParameterElement(
+      assignment.rightHandSide,
+      indexEqElement.parameters[1],
+    );
   }
 }
diff --git a/pkg/analyzer/test/src/dart/resolution/instance_member_inference_class_test.dart b/pkg/analyzer/test/src/dart/resolution/instance_member_inference_class_test.dart
index ac4be3b..ad8a1e9 100644
--- a/pkg/analyzer/test/src/dart/resolution/instance_member_inference_class_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/instance_member_inference_class_test.dart
@@ -869,6 +869,19 @@
     _assertSetterTypeDynamic(foo);
   }
 
+  test_setter_single_setter_withoutParameter() async {
+    await resolveTestCode('''
+class A {
+  set foo() {}
+}
+class B implements A {
+  set foo(x) {}
+}
+''');
+    var foo = findElement.setter('foo', of: 'B');
+    _assertSetterType(foo, 'dynamic');
+  }
+
   void _assertFieldType(
     FieldElement field,
     String type, {
diff --git a/pkg/analyzer/test/src/dart/resolution/library_element_test.dart b/pkg/analyzer/test/src/dart/resolution/library_element_test.dart
index 1b4e874..c5edca5 100644
--- a/pkg/analyzer/test/src/dart/resolution/library_element_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/library_element_test.dart
@@ -290,7 +290,7 @@
 
 @reflectiveTest
 class LibraryElementTest_scope extends PubPackageResolutionTest {
-  test_lookup2() async {
+  test_lookup() async {
     await assertNoErrorsInCode(r'''
 int foo;
 ''');
@@ -298,160 +298,37 @@
     var scope = result.libraryElement.scope;
 
     assertElement(
-      scope.lookup2('foo').getter,
+      scope.lookup('foo').getter,
       findElement.topGet('foo'),
     );
     assertElement(
-      scope.lookup2('foo').setter,
+      scope.lookup('foo').setter,
       findElement.topSet('foo'),
     );
   }
 
-  test_lookup2_implicitCoreImport() async {
-    await assertNoErrorsInCode('');
-
-    var scope = result.libraryElement.scope;
-
-    assertElement(
-      scope.lookup2('int').getter,
-      intElement,
-    );
-  }
-
-  test_lookup2_notFound() async {
-    await assertNoErrorsInCode('');
-
-    var scope = result.libraryElement.scope;
-
-    assertElementNull(
-      scope.lookup2('noSuchGetter').getter,
-    );
-
-    assertElementNull(
-      scope.lookup2('noSuchSetter').setter,
-    );
-  }
-
-  test_lookup2_prefersLocal() async {
-    await assertNoErrorsInCode(r'''
-// ignore:unused_import
-import 'dart:math';
-
-int sin() => 3;
-''');
-
-    var scope = result.libraryElement.scope;
-
-    assertElement(
-      scope.lookup2('sin').getter,
-      findElement.topFunction('sin'),
-    );
-
-    assertElement(
-      scope.lookup2('cos').getter,
-      findElement.importFind('dart:math').topFunction('cos'),
-    );
-  }
-
-  test_lookup2_prefix() async {
-    await assertNoErrorsInCode(r'''
-// ignore:unused_import
-import 'dart:math' as math;
-''');
-
-    var scope = result.libraryElement.scope;
-
-    assertElement(
-      scope.lookup2('math').getter,
-      findElement.prefix('math'),
-    );
-  }
-
-  test_lookup2_respectsCombinator_hide() async {
-    await assertNoErrorsInCode(r'''
-// ignore:unused_import
-import 'dart:math' hide sin;
-''');
-
-    var scope = result.libraryElement.scope;
-
-    assertElementNull(
-      scope.lookup2('sin').getter,
-    );
-
-    var mathFind = findElement.importFind('dart:math');
-    assertElement(
-      scope.lookup2('cos').getter,
-      mathFind.topFunction('cos'),
-    );
-    assertElement(
-      scope.lookup2('tan').getter,
-      mathFind.topFunction('tan'),
-    );
-  }
-
-  test_lookup2_respectsCombinator_show() async {
-    await assertNoErrorsInCode(r'''
-// ignore:unused_import
-import 'dart:math' show sin;
-''');
-
-    var scope = result.libraryElement.scope;
-
-    assertElement(
-      scope.lookup2('sin').getter,
-      findElement.importFind('dart:math').topFunction('sin'),
-    );
-
-    assertElementNull(
-      scope.lookup2('cos').getter,
-    );
-  }
-
   test_lookup_implicitCoreImport() async {
     await assertNoErrorsInCode('');
 
     var scope = result.libraryElement.scope;
 
     assertElement(
-      // ignore: deprecated_member_use_from_same_package
-      scope.lookup(id: 'int', setter: false),
+      scope.lookup('int').getter,
       intElement,
     );
   }
 
-  test_lookup_lookup() async {
-    await assertNoErrorsInCode(r'''
-int foo;
-''');
-
-    var scope = result.libraryElement.scope;
-
-    assertElement(
-      // ignore: deprecated_member_use_from_same_package
-      scope.lookup(id: 'foo', setter: false),
-      findElement.topGet('foo'),
-    );
-    assertElement(
-      // ignore: deprecated_member_use_from_same_package
-      scope.lookup(id: 'foo', setter: true),
-      findElement.topSet('foo'),
-    );
-  }
-
   test_lookup_notFound() async {
     await assertNoErrorsInCode('');
 
     var scope = result.libraryElement.scope;
 
     assertElementNull(
-      // ignore: deprecated_member_use_from_same_package
-      scope.lookup(id: 'noSuchGetter', setter: false),
+      scope.lookup('noSuchGetter').getter,
     );
 
     assertElementNull(
-      // ignore: deprecated_member_use_from_same_package
-      scope.lookup(id: 'noSuchSetter', setter: true),
+      scope.lookup('noSuchSetter').setter,
     );
   }
 
@@ -466,14 +343,12 @@
     var scope = result.libraryElement.scope;
 
     assertElement(
-      // ignore: deprecated_member_use_from_same_package
-      scope.lookup(id: 'sin', setter: false),
+      scope.lookup('sin').getter,
       findElement.topFunction('sin'),
     );
 
     assertElement(
-      // ignore: deprecated_member_use_from_same_package
-      scope.lookup(id: 'cos', setter: false),
+      scope.lookup('cos').getter,
       findElement.importFind('dart:math').topFunction('cos'),
     );
   }
@@ -487,8 +362,7 @@
     var scope = result.libraryElement.scope;
 
     assertElement(
-      // ignore: deprecated_member_use_from_same_package
-      scope.lookup(id: 'math', setter: false),
+      scope.lookup('math').getter,
       findElement.prefix('math'),
     );
   }
@@ -502,19 +376,16 @@
     var scope = result.libraryElement.scope;
 
     assertElementNull(
-      // ignore: deprecated_member_use_from_same_package
-      scope.lookup(id: 'sin', setter: false),
+      scope.lookup('sin').getter,
     );
 
     var mathFind = findElement.importFind('dart:math');
     assertElement(
-      // ignore: deprecated_member_use_from_same_package
-      scope.lookup(id: 'cos', setter: false),
+      scope.lookup('cos').getter,
       mathFind.topFunction('cos'),
     );
     assertElement(
-      // ignore: deprecated_member_use_from_same_package
-      scope.lookup(id: 'tan', setter: false),
+      scope.lookup('tan').getter,
       mathFind.topFunction('tan'),
     );
   }
@@ -528,14 +399,12 @@
     var scope = result.libraryElement.scope;
 
     assertElement(
-      // ignore: deprecated_member_use_from_same_package
-      scope.lookup(id: 'sin', setter: false),
+      scope.lookup('sin').getter,
       findElement.importFind('dart:math').topFunction('sin'),
     );
 
     assertElementNull(
-      // ignore: deprecated_member_use_from_same_package
-      scope.lookup(id: 'cos', setter: false),
+      scope.lookup('cos').getter,
     );
   }
 }
diff --git a/pkg/analyzer/test/src/dart/resolution/metadata_test.dart b/pkg/analyzer/test/src/dart/resolution/metadata_test.dart
index 0e2a55e..c325cf2 100644
--- a/pkg/analyzer/test/src/dart/resolution/metadata_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/metadata_test.dart
@@ -22,6 +22,120 @@
 
 @reflectiveTest
 class MetadataResolutionTest extends PubPackageResolutionTest {
+  test_genericClass_instanceGetter() async {
+    await resolveTestCode(r'''
+class A<T> {
+  T get foo {}
+}
+
+@A.foo
+void f() {}
+''');
+
+    _assertResolvedNodeText(findNode.annotation('@A'), r'''
+Annotation
+  element: self::@class::A::@getter::foo
+  name: PrefixedIdentifier
+    identifier: SimpleIdentifier
+      staticElement: self::@class::A::@getter::foo
+      staticType: null
+      token: foo
+    period: .
+    prefix: SimpleIdentifier
+      staticElement: self::@class::A
+      staticType: null
+      token: A
+    staticElement: self::@class::A::@getter::foo
+    staticType: null
+''');
+  }
+
+  test_genericClass_namedConstructor() async {
+    await assertNoErrorsInCode(r'''
+class A<T> {
+  const A.named();
+}
+
+@A.named()
+void f() {}
+''');
+
+    _assertResolvedNodeText(findNode.annotation('@A'), r'''
+Annotation
+  arguments: ArgumentList
+  element: ConstructorMember
+    base: self::@class::A::@constructor::named
+    substitution: {T: dynamic}
+  name: PrefixedIdentifier
+    identifier: SimpleIdentifier
+      staticElement: ConstructorMember
+        base: self::@class::A::@constructor::named
+        substitution: {T: dynamic}
+      staticType: null
+      token: named
+    period: .
+    prefix: SimpleIdentifier
+      staticElement: self::@class::A
+      staticType: null
+      token: A
+    staticElement: ConstructorMember
+      base: self::@class::A::@constructor::named
+      substitution: {T: dynamic}
+    staticType: null
+''');
+  }
+
+  test_genericClass_staticGetter() async {
+    await resolveTestCode(r'''
+class A<T> {
+  static T get foo {}
+}
+
+@A.foo
+void f() {}
+''');
+
+    _assertResolvedNodeText(findNode.annotation('@A'), r'''
+Annotation
+  element: self::@class::A::@getter::foo
+  name: PrefixedIdentifier
+    identifier: SimpleIdentifier
+      staticElement: self::@class::A::@getter::foo
+      staticType: null
+      token: foo
+    period: .
+    prefix: SimpleIdentifier
+      staticElement: self::@class::A
+      staticType: null
+      token: A
+    staticElement: self::@class::A::@getter::foo
+    staticType: null
+''');
+  }
+
+  test_genericClass_unnamedConstructor() async {
+    await assertNoErrorsInCode(r'''
+class A<T> {
+  const A();
+}
+
+@A()
+void f() {}
+''');
+
+    _assertResolvedNodeText(findNode.annotation('@A'), r'''
+Annotation
+  arguments: ArgumentList
+  element: ConstructorMember
+    base: self::@class::A::@constructor::•
+    substitution: {T: dynamic}
+  name: SimpleIdentifier
+    staticElement: self::@class::A
+    staticType: null
+    token: A
+''');
+  }
+
   test_onFieldFormal() async {
     await assertNoErrorsInCode(r'''
 class A {
@@ -55,7 +169,7 @@
   element: self::@class::A::@constructor::•
   name: SimpleIdentifier
     staticElement: self::@class::A
-    staticType: Type
+    staticType: null
     token: A
 ''');
   }
diff --git a/pkg/analyzer/test/src/dart/resolution/mixin_test.dart b/pkg/analyzer/test/src/dart/resolution/mixin_test.dart
index 75bd0f7..bd227a0 100644
--- a/pkg/analyzer/test/src/dart/resolution/mixin_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/mixin_test.dart
@@ -1200,7 +1200,7 @@
   test_superInvocation_setter() async {
     await assertNoErrorsInCode(r'''
 class A {
-  void set foo(_) {}
+  void set foo(int _) {}
 }
 
 mixin M on A {
@@ -1212,9 +1212,14 @@
 class X extends A with M {}
 ''');
 
-    var access = findNode.propertyAccess('super.foo = 0');
-    assertElement(access, findElement.setter('foo'));
-    // Hm... Does it need any type?
-    assertTypeDynamic(access);
+    assertAssignment(
+      findNode.assignment('foo ='),
+      readElement: null,
+      readType: null,
+      writeElement: findElement.setter('foo'),
+      writeType: 'int',
+      operatorElement: null,
+      type: 'int',
+    );
   }
 }
diff --git a/pkg/analyzer/test/src/dart/resolution/non_nullable_bazel_workspace_test.dart b/pkg/analyzer/test/src/dart/resolution/non_nullable_bazel_workspace_test.dart
index 517ad52..1168802 100644
--- a/pkg/analyzer/test/src/dart/resolution/non_nullable_bazel_workspace_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/non_nullable_bazel_workspace_test.dart
@@ -61,14 +61,6 @@
     );
     assertNoErrorsInResult();
     assertType(findNode.typeName('int v'), 'int');
-
-    // Legacy in other package.
-    await resolveFileCode(
-      '$workspaceRootPath/dart/aaa/lib/a.dart',
-      'int v = 0;',
-    );
-    assertNoErrorsInResult();
-    assertType(findNode.typeName('int v'), 'int*');
   }
 
   test_buildFile_nonNullable_oneLine_noComma() async {
diff --git a/pkg/analyzer/test/src/dart/resolution/postfix_expression_test.dart b/pkg/analyzer/test/src/dart/resolution/postfix_expression_test.dart
index 61a0e67..400c242 100644
--- a/pkg/analyzer/test/src/dart/resolution/postfix_expression_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/postfix_expression_test.dart
@@ -179,12 +179,14 @@
       type: 'dynamic',
     );
 
-    assertSimpleIdentifier(
-      postfix.operand,
-      readElement: findElement.typeParameter('T'),
-      writeElement: findElement.typeParameter('T'),
-      type: 'dynamic',
-    );
+    if (hasAssignmentLeftResolution) {
+      assertSimpleIdentifier(
+        postfix.operand,
+        readElement: findElement.typeParameter('T'),
+        writeElement: findElement.typeParameter('T'),
+        type: 'dynamic',
+      );
+    }
   }
 
   test_inc_prefixedIdentifier_instance() async {
@@ -417,12 +419,14 @@
       type: 'int',
     );
 
-    assertSimpleIdentifier(
-      postfix.operand,
-      readElement: findElement.getter('x'),
-      writeElement: findElement.setter('x'),
-      type: 'num',
-    );
+    if (hasAssignmentLeftResolution) {
+      assertSimpleIdentifier(
+        postfix.operand,
+        readElement: findElement.getter('x'),
+        writeElement: findElement.setter('x'),
+        type: 'num',
+      );
+    }
   }
 
   test_inc_simpleIdentifier_topGetter_topSetter() async {
@@ -450,12 +454,14 @@
       type: 'int',
     );
 
-    assertSimpleIdentifier(
-      postfix.operand,
-      readElement: findElement.topGet('x'),
-      writeElement: findElement.topSet('x'),
-      type: 'num',
-    );
+    if (hasAssignmentLeftResolution) {
+      assertSimpleIdentifier(
+        postfix.operand,
+        readElement: findElement.topGet('x'),
+        writeElement: findElement.topSet('x'),
+        type: 'num',
+      );
+    }
   }
 
   test_inc_simpleIdentifier_topGetter_topSetter_fromClass() async {
@@ -485,12 +491,14 @@
       type: 'int',
     );
 
-    assertSimpleIdentifier(
-      postfix.operand,
-      readElement: findElement.topGet('x'),
-      writeElement: findElement.topSet('x'),
-      type: 'num',
-    );
+    if (hasAssignmentLeftResolution) {
+      assertSimpleIdentifier(
+        postfix.operand,
+        readElement: findElement.topGet('x'),
+        writeElement: findElement.topSet('x'),
+        type: 'num',
+      );
+    }
   }
 }
 
@@ -533,7 +541,9 @@
 }
 ''');
 
-    assertType(findNode.simple('x++;'), 'A');
+    if (hasAssignmentLeftResolution) {
+      assertType(findNode.simple('x++;'), 'A');
+    }
 
     assertPostfixExpression(
       findNode.postfix('x++'),
@@ -604,11 +614,13 @@
   }
 
   test_nullCheck_null() async {
-    await assertNoErrorsInCode('''
+    await assertErrorsInCode('''
 void f(Null x) {
   x!;
 }
-''');
+''', [
+      error(HintCode.NULL_CHECK_ALWAYS_FAILS, 19, 2),
+    ]);
 
     assertType(findNode.postfix('x!'), 'Never');
   }
diff --git a/pkg/analyzer/test/src/dart/resolution/prefix_element_test.dart b/pkg/analyzer/test/src/dart/resolution/prefix_element_test.dart
index fbf0c0c..dfdc7a4 100644
--- a/pkg/analyzer/test/src/dart/resolution/prefix_element_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/prefix_element_test.dart
@@ -31,252 +31,16 @@
     var importFind = findElement.importFind('package:test/a.dart');
 
     assertElement(
-      // ignore: deprecated_member_use_from_same_package
-      scope.lookup(id: 'foo', setter: false),
+      scope.lookup('foo').getter,
       importFind.topGet('foo'),
     );
 
     assertElement(
-      // ignore: deprecated_member_use_from_same_package
-      scope.lookup(id: 'foo', setter: true),
+      scope.lookup('foo').setter,
       importFind.topSet('foo'),
     );
   }
 
-  test_scope_lookup2() async {
-    newFile('$testPackageLibPath/a.dart', content: r'''
-var foo = 0;
-''');
-
-    await assertNoErrorsInCode(r'''
-// ignore:unused_import
-import 'a.dart' as prefix;
-''');
-
-    var scope = findElement.prefix('prefix').scope;
-    var importFind = findElement.importFind('package:test/a.dart');
-
-    assertElement(
-      scope.lookup2('foo').getter,
-      importFind.topGet('foo'),
-    );
-
-    assertElement(
-      scope.lookup2('foo').setter,
-      importFind.topSet('foo'),
-    );
-  }
-
-  test_scope_lookup2_ambiguous_notSdk_both() async {
-    newFile('$testPackageLibPath/a.dart', content: r'''
-var foo = 0;
-''');
-
-    newFile('$testPackageLibPath/b.dart', content: r'''
-var foo = 1.2;
-''');
-
-    await assertNoErrorsInCode(r'''
-// ignore:unused_import
-import 'a.dart' as prefix;
-
-// ignore:unused_import
-import 'b.dart' as prefix;
-''');
-
-    var scope = findElement.prefix('prefix').scope;
-
-    var aImport = findElement.importFind('package:test/a.dart');
-    var bImport = findElement.importFind('package:test/b.dart');
-
-    _assertMultiplyDefinedElement(
-      scope.lookup2('foo').getter,
-      [
-        aImport.topGet('foo'),
-        bImport.topGet('foo'),
-      ],
-    );
-
-    _assertMultiplyDefinedElement(
-      scope.lookup2('foo').setter,
-      [
-        aImport.topSet('foo'),
-        bImport.topSet('foo'),
-      ],
-    );
-  }
-
-  test_scope_lookup2_ambiguous_notSdk_first() async {
-    newFile('$testPackageLibPath/a.dart', content: r'''
-var pi = 4;
-''');
-
-    await assertNoErrorsInCode(r'''
-// ignore:unused_import
-import 'a.dart' as prefix;
-
-// ignore:unused_import
-import 'dart:math' as prefix;
-''');
-
-    var scope = findElement.prefix('prefix').scope;
-    var aImport = findElement.importFind('package:test/a.dart');
-
-    assertElement(
-      scope.lookup2('pi').getter,
-      aImport.topGet('pi'),
-    );
-  }
-
-  test_scope_lookup2_ambiguous_notSdk_second() async {
-    newFile('$testPackageLibPath/a.dart', content: r'''
-var pi = 4;
-''');
-
-    await assertNoErrorsInCode(r'''
-// ignore:unused_import
-import 'dart:math' as prefix;
-
-// ignore:unused_import
-import 'a.dart' as prefix;
-''');
-
-    var scope = findElement.prefix('prefix').scope;
-    var aImport = findElement.importFind('package:test/a.dart');
-
-    assertElement(
-      scope.lookup2('pi').getter,
-      aImport.topGet('pi'),
-    );
-  }
-
-  test_scope_lookup2_ambiguous_same() async {
-    newFile('$testPackageLibPath/a.dart', content: r'''
-var foo = 0;
-''');
-
-    newFile('$testPackageLibPath/b.dart', content: r'''
-export 'a.dart';
-''');
-
-    await assertNoErrorsInCode(r'''
-// ignore:unused_import
-import 'a.dart' as prefix;
-
-// ignore:unused_import
-import 'b.dart' as prefix;
-''');
-
-    var scope = findElement.prefix('prefix').scope;
-    var importFind = findElement.importFind('package:test/a.dart');
-
-    assertElement(
-      scope.lookup2('foo').getter,
-      importFind.topGet('foo'),
-    );
-
-    assertElement(
-      scope.lookup2('foo').setter,
-      importFind.topSet('foo'),
-    );
-  }
-
-  test_scope_lookup2_differentPrefix() async {
-    newFile('$testPackageLibPath/a.dart', content: r'''
-var foo = 0;
-''');
-
-    newFile('$testPackageLibPath/b.dart', content: r'''
-var bar = 0;
-''');
-
-    await assertNoErrorsInCode(r'''
-// ignore:unused_import
-import 'a.dart' as prefix;
-
-// ignore:unused_import
-import 'b.dart' as prefix2;
-''');
-
-    var scope = findElement.prefix('prefix').scope;
-    var importFind = findElement.importFind('package:test/a.dart');
-
-    assertElement(
-      scope.lookup2('foo').getter,
-      importFind.topGet('foo'),
-    );
-    assertElement(
-      scope.lookup2('foo').setter,
-      importFind.topSet('foo'),
-    );
-
-    assertElementNull(
-      scope.lookup2('bar').getter,
-    );
-    assertElementNull(
-      scope.lookup2('bar').setter,
-    );
-  }
-
-  test_scope_lookup2_notFound() async {
-    await assertNoErrorsInCode(r'''
-// ignore:unused_import
-import 'dart:math' as math;
-''');
-
-    var scope = findElement.prefix('math').scope;
-
-    assertElementNull(
-      scope.lookup2('noSuchGetter').getter,
-    );
-
-    assertElementNull(
-      scope.lookup2('noSuchSetter').setter,
-    );
-  }
-
-  test_scope_lookup2_respectsCombinator_hide() async {
-    await assertNoErrorsInCode(r'''
-// ignore:unused_import
-import 'dart:math' as math hide sin;
-''');
-
-    var scope = findElement.prefix('math').scope;
-    var mathFind = findElement.importFind('dart:math');
-
-    assertElementNull(
-      scope.lookup2('sin').getter,
-    );
-
-    assertElement(
-      scope.lookup2('cos').getter,
-      mathFind.topFunction('cos'),
-    );
-    assertElement(
-      scope.lookup2('tan').getter,
-      mathFind.topFunction('tan'),
-    );
-  }
-
-  test_scope_lookup2_respectsCombinator_show() async {
-    await assertNoErrorsInCode(r'''
-// ignore:unused_import
-import 'dart:math' as math show sin;
-''');
-
-    var scope = findElement.prefix('math').scope;
-    var mathFind = findElement.importFind('dart:math');
-
-    assertElement(
-      scope.lookup2('sin').getter,
-      mathFind.topFunction('sin'),
-    );
-
-    assertElementNull(
-      scope.lookup2('cos').getter,
-    );
-  }
-
   test_scope_lookup_ambiguous_notSdk_both() async {
     newFile('$testPackageLibPath/a.dart', content: r'''
 var foo = 0;
@@ -300,8 +64,7 @@
     var bImport = findElement.importFind('package:test/b.dart');
 
     _assertMultiplyDefinedElement(
-      // ignore: deprecated_member_use_from_same_package
-      scope.lookup(id: 'foo', setter: false),
+      scope.lookup('foo').getter,
       [
         aImport.topGet('foo'),
         bImport.topGet('foo'),
@@ -309,8 +72,7 @@
     );
 
     _assertMultiplyDefinedElement(
-      // ignore: deprecated_member_use_from_same_package
-      scope.lookup(id: 'foo', setter: true),
+      scope.lookup('foo').setter,
       [
         aImport.topSet('foo'),
         bImport.topSet('foo'),
@@ -335,8 +97,7 @@
     var aImport = findElement.importFind('package:test/a.dart');
 
     assertElement(
-      // ignore: deprecated_member_use_from_same_package
-      scope.lookup(id: 'pi', setter: false),
+      scope.lookup('pi').getter,
       aImport.topGet('pi'),
     );
   }
@@ -358,8 +119,7 @@
     var aImport = findElement.importFind('package:test/a.dart');
 
     assertElement(
-      // ignore: deprecated_member_use_from_same_package
-      scope.lookup(id: 'pi', setter: false),
+      scope.lookup('pi').getter,
       aImport.topGet('pi'),
     );
   }
@@ -385,14 +145,12 @@
     var importFind = findElement.importFind('package:test/a.dart');
 
     assertElement(
-      // ignore: deprecated_member_use_from_same_package
-      scope.lookup(id: 'foo', setter: false),
+      scope.lookup('foo').getter,
       importFind.topGet('foo'),
     );
 
     assertElement(
-      // ignore: deprecated_member_use_from_same_package
-      scope.lookup(id: 'foo', setter: true),
+      scope.lookup('foo').setter,
       importFind.topSet('foo'),
     );
   }
@@ -418,23 +176,19 @@
     var importFind = findElement.importFind('package:test/a.dart');
 
     assertElement(
-      // ignore: deprecated_member_use_from_same_package
-      scope.lookup(id: 'foo', setter: false),
+      scope.lookup('foo').getter,
       importFind.topGet('foo'),
     );
     assertElement(
-      // ignore: deprecated_member_use_from_same_package
-      scope.lookup(id: 'foo', setter: true),
+      scope.lookup('foo').setter,
       importFind.topSet('foo'),
     );
 
     assertElementNull(
-      // ignore: deprecated_member_use_from_same_package
-      scope.lookup(id: 'bar', setter: false),
+      scope.lookup('bar').getter,
     );
     assertElementNull(
-      // ignore: deprecated_member_use_from_same_package
-      scope.lookup(id: 'bar', setter: true),
+      scope.lookup('bar').setter,
     );
   }
 
@@ -447,13 +201,11 @@
     var scope = findElement.prefix('math').scope;
 
     assertElementNull(
-      // ignore: deprecated_member_use_from_same_package
-      scope.lookup(id: 'noSuchGetter', setter: false),
+      scope.lookup('noSuchGetter').getter,
     );
 
     assertElementNull(
-      // ignore: deprecated_member_use_from_same_package
-      scope.lookup(id: 'noSuchSetter', setter: true),
+      scope.lookup('noSuchSetter').setter,
     );
   }
 
@@ -467,18 +219,15 @@
     var mathFind = findElement.importFind('dart:math');
 
     assertElementNull(
-      // ignore: deprecated_member_use_from_same_package
-      scope.lookup(id: 'sin', setter: false),
+      scope.lookup('sin').getter,
     );
 
     assertElement(
-      // ignore: deprecated_member_use_from_same_package
-      scope.lookup(id: 'cos', setter: false),
+      scope.lookup('cos').getter,
       mathFind.topFunction('cos'),
     );
     assertElement(
-      // ignore: deprecated_member_use_from_same_package
-      scope.lookup(id: 'tan', setter: false),
+      scope.lookup('tan').getter,
       mathFind.topFunction('tan'),
     );
   }
@@ -493,14 +242,12 @@
     var mathFind = findElement.importFind('dart:math');
 
     assertElement(
-      // ignore: deprecated_member_use_from_same_package
-      scope.lookup(id: 'sin', setter: false),
+      scope.lookup('sin').getter,
       mathFind.topFunction('sin'),
     );
 
     assertElementNull(
-      // ignore: deprecated_member_use_from_same_package
-      scope.lookup(id: 'cos', setter: false),
+      scope.lookup('cos').getter,
     );
   }
 
diff --git a/pkg/analyzer/test/src/dart/resolution/prefix_expression_test.dart b/pkg/analyzer/test/src/dart/resolution/prefix_expression_test.dart
index b6b4dec..671e345 100644
--- a/pkg/analyzer/test/src/dart/resolution/prefix_expression_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/prefix_expression_test.dart
@@ -491,12 +491,14 @@
       type: 'int',
     );
 
-    assertSimpleIdentifier(
-      prefix.operand,
-      readElement: findElement.getter('x'),
-      writeElement: findElement.setter('x'),
-      type: 'num',
-    );
+    if (hasAssignmentLeftResolution) {
+      assertSimpleIdentifier(
+        prefix.operand,
+        readElement: findElement.getter('x'),
+        writeElement: findElement.setter('x'),
+        type: 'num',
+      );
+    }
   }
 
   test_plusPlus_simpleIdentifier_thisGetter_thisSetter() async {
@@ -524,12 +526,14 @@
       type: 'int',
     );
 
-    assertSimpleIdentifier(
-      prefix.operand,
-      readElement: findElement.getter('x'),
-      writeElement: findElement.setter('x'),
-      type: 'num',
-    );
+    if (hasAssignmentLeftResolution) {
+      assertSimpleIdentifier(
+        prefix.operand,
+        readElement: findElement.getter('x'),
+        writeElement: findElement.setter('x'),
+        type: 'num',
+      );
+    }
   }
 
   test_plusPlus_simpleIdentifier_topGetter_topSetter() async {
@@ -557,12 +561,14 @@
       type: 'int',
     );
 
-    assertSimpleIdentifier(
-      prefix.operand,
-      readElement: findElement.topGet('x'),
-      writeElement: findElement.topSet('x'),
-      type: 'num',
-    );
+    if (hasAssignmentLeftResolution) {
+      assertSimpleIdentifier(
+        prefix.operand,
+        readElement: findElement.topGet('x'),
+        writeElement: findElement.topSet('x'),
+        type: 'num',
+      );
+    }
   }
 
   test_plusPlus_simpleIdentifier_topGetter_topSetter_fromClass() async {
@@ -592,12 +598,14 @@
       type: 'int',
     );
 
-    assertSimpleIdentifier(
-      prefix.operand,
-      readElement: findElement.topGet('x'),
-      writeElement: findElement.topSet('x'),
-      type: 'num',
-    );
+    if (hasAssignmentLeftResolution) {
+      assertSimpleIdentifier(
+        prefix.operand,
+        readElement: findElement.topGet('x'),
+        writeElement: findElement.topSet('x'),
+        type: 'num',
+      );
+    }
   }
 
   /// Verify that we get all necessary types when building the dependencies
@@ -721,7 +729,9 @@
       type: 'Object',
     );
 
-    assertType(findNode.simple('x;'), 'A');
+    if (hasAssignmentLeftResolution) {
+      assertType(findNode.simple('x;'), 'A');
+    }
   }
 
   test_plusPlus_nullShorting() async {
diff --git a/pkg/analyzer/test/src/dart/resolution/prefixed_identifier_test.dart b/pkg/analyzer/test/src/dart/resolution/prefixed_identifier_test.dart
index a6aa5f6..ff8104f 100644
--- a/pkg/analyzer/test/src/dart/resolution/prefixed_identifier_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/prefixed_identifier_test.dart
@@ -33,6 +33,20 @@
     );
   }
 
+  test_functionType_call_read() async {
+    await assertNoErrorsInCode('''
+void f(int Function(String) a) {
+  a.call;
+}
+''');
+
+    assertPrefixedIdentifier(
+      findNode.prefixed('.call;'),
+      element: null,
+      type: 'int Function(String)',
+    );
+  }
+
   test_implicitCall_tearOff() async {
     newFile('$testPackageLibPath/a.dart', content: r'''
 class A {
@@ -116,11 +130,13 @@
     );
 
     var prefixed = assignment.leftHandSide as PrefixedIdentifier;
-    assertPrefixedIdentifier(
-      prefixed,
-      element: findElement.setter('foo'),
-      type: 'int',
-    );
+    if (hasAssignmentLeftResolution) {
+      assertPrefixedIdentifier(
+        prefixed,
+        element: findElement.setter('foo'),
+        type: 'int',
+      );
+    }
 
     assertSimpleIdentifier(
       prefixed.prefix,
@@ -129,12 +145,14 @@
       type: 'A',
     );
 
-    assertSimpleIdentifier(
-      prefixed.identifier,
-      readElement: null,
-      writeElement: findElement.setter('foo'),
-      type: 'int',
-    );
+    if (hasAssignmentLeftResolution) {
+      assertSimpleIdentifier(
+        prefixed.identifier,
+        readElement: null,
+        writeElement: findElement.setter('foo'),
+        type: 'int',
+      );
+    }
   }
 
   test_write() async {
@@ -160,11 +178,13 @@
     );
 
     var prefixed = assignment.leftHandSide as PrefixedIdentifier;
-    assertPrefixedIdentifier(
-      prefixed,
-      element: findElement.setter('foo'),
-      type: 'int',
-    );
+    if (hasAssignmentLeftResolution) {
+      assertPrefixedIdentifier(
+        prefixed,
+        element: findElement.setter('foo'),
+        type: 'int',
+      );
+    }
 
     assertSimpleIdentifier(
       prefixed.prefix,
@@ -173,12 +193,14 @@
       type: 'A',
     );
 
-    assertSimpleIdentifier(
-      prefixed.identifier,
-      readElement: null,
-      writeElement: findElement.setter('foo'),
-      type: 'int',
-    );
+    if (hasAssignmentLeftResolution) {
+      assertSimpleIdentifier(
+        prefixed.identifier,
+        readElement: null,
+        writeElement: findElement.setter('foo'),
+        type: 'int',
+      );
+    }
   }
 }
 
diff --git a/pkg/analyzer/test/src/dart/resolution/property_access_test.dart b/pkg/analyzer/test/src/dart/resolution/property_access_test.dart
index 2d0516f..313cd97 100644
--- a/pkg/analyzer/test/src/dart/resolution/property_access_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/property_access_test.dart
@@ -74,11 +74,13 @@
     );
 
     var propertyAccess = assignment.leftHandSide as PropertyAccess;
-    assertPropertyAccess2(
-      propertyAccess,
-      element: findElement.setter('foo'),
-      type: 'num',
-    );
+    if (hasAssignmentLeftResolution) {
+      assertPropertyAccess2(
+        propertyAccess,
+        element: findElement.setter('foo'),
+        type: 'num',
+      );
+    }
   }
 
   test_extensionOverride_write() async {
@@ -106,17 +108,33 @@
     );
 
     var propertyAccess = assignment.leftHandSide as PropertyAccess;
-    assertPropertyAccess2(
-      propertyAccess,
-      element: findElement.setter('foo'),
-      type: 'int',
-    );
+    if (hasAssignmentLeftResolution) {
+      assertPropertyAccess2(
+        propertyAccess,
+        element: findElement.setter('foo'),
+        type: 'int',
+      );
 
-    assertSimpleIdentifier(
-      propertyAccess.propertyName,
-      readElement: null,
-      writeElement: findElement.setter('foo'),
-      type: 'int',
+      assertSimpleIdentifier(
+        propertyAccess.propertyName,
+        readElement: null,
+        writeElement: findElement.setter('foo'),
+        type: 'int',
+      );
+    }
+  }
+
+  test_functionType_call_read() async {
+    await assertNoErrorsInCode('''
+void f(int Function(String) a) {
+  (a).call;
+}
+''');
+
+    assertPropertyAccess2(
+      findNode.propertyAccess('call;'),
+      element: null,
+      type: 'int Function(String)',
     );
   }
 
@@ -172,11 +190,13 @@
     );
 
     var propertyAccess = assignment.leftHandSide as PropertyAccess;
-    assertPropertyAccess2(
-      propertyAccess,
-      element: findElement.setter('foo'),
-      type: 'int',
-    );
+    if (hasAssignmentLeftResolution) {
+      assertPropertyAccess2(
+        propertyAccess,
+        element: findElement.setter('foo'),
+        type: 'int',
+      );
+    }
   }
 
   test_instanceCreation_write() async {
@@ -202,18 +222,20 @@
     );
 
     var propertyAccess = assignment.leftHandSide as PropertyAccess;
-    assertPropertyAccess2(
-      propertyAccess,
-      element: findElement.setter('foo'),
-      type: 'int',
-    );
+    if (hasAssignmentLeftResolution) {
+      assertPropertyAccess2(
+        propertyAccess,
+        element: findElement.setter('foo'),
+        type: 'int',
+      );
 
-    assertSimpleIdentifier(
-      propertyAccess.propertyName,
-      readElement: null,
-      writeElement: findElement.setter('foo'),
-      type: 'int',
-    );
+      assertSimpleIdentifier(
+        propertyAccess.propertyName,
+        readElement: null,
+        writeElement: findElement.setter('foo'),
+        type: 'int',
+      );
+    }
   }
 
   test_ofExtension_read() async {
@@ -273,11 +295,13 @@
     );
 
     var propertyAccess = assignment.leftHandSide as PropertyAccess;
-    assertPropertyAccess2(
-      propertyAccess,
-      element: findElement.setter('foo'),
-      type: 'num',
-    );
+    if (hasAssignmentLeftResolution) {
+      assertPropertyAccess2(
+        propertyAccess,
+        element: findElement.setter('foo'),
+        type: 'num',
+      );
+    }
   }
 
   test_ofExtension_write() async {
@@ -305,18 +329,20 @@
     );
 
     var propertyAccess = assignment.leftHandSide as PropertyAccess;
-    assertPropertyAccess2(
-      propertyAccess,
-      element: findElement.setter('foo'),
-      type: 'int',
-    );
+    if (hasAssignmentLeftResolution) {
+      assertPropertyAccess2(
+        propertyAccess,
+        element: findElement.setter('foo'),
+        type: 'int',
+      );
 
-    assertSimpleIdentifier(
-      propertyAccess.propertyName,
-      readElement: null,
-      writeElement: findElement.setter('foo'),
-      type: 'int',
-    );
+      assertSimpleIdentifier(
+        propertyAccess.propertyName,
+        readElement: null,
+        writeElement: findElement.setter('foo'),
+        type: 'int',
+      );
+    }
   }
 
   test_super_read() async {
@@ -379,22 +405,26 @@
     );
 
     var propertyAccess = assignment.leftHandSide as PropertyAccess;
-    assertPropertyAccess2(
-      propertyAccess,
-      element: findElement.setter('foo'),
-      type: 'int',
-    );
+    if (hasAssignmentLeftResolution) {
+      assertPropertyAccess2(
+        propertyAccess,
+        element: findElement.setter('foo'),
+        type: 'int',
+      );
+    }
 
     assertSuperExpression(
       propertyAccess.target,
     );
 
-    assertSimpleIdentifier(
-      propertyAccess.propertyName,
-      readElement: findElement.getter('foo'),
-      writeElement: findElement.setter('foo'),
-      type: 'int',
-    );
+    if (hasAssignmentLeftResolution) {
+      assertSimpleIdentifier(
+        propertyAccess.propertyName,
+        readElement: findElement.getter('foo'),
+        writeElement: findElement.setter('foo'),
+        type: 'int',
+      );
+    }
   }
 
   test_super_write() async {
@@ -422,22 +452,26 @@
     );
 
     var propertyAccess = assignment.leftHandSide as PropertyAccess;
-    assertPropertyAccess2(
-      propertyAccess,
-      element: findElement.setter('foo'),
-      type: 'int',
-    );
+    if (hasAssignmentLeftResolution) {
+      assertPropertyAccess2(
+        propertyAccess,
+        element: findElement.setter('foo'),
+        type: 'int',
+      );
+    }
 
     assertSuperExpression(
       propertyAccess.target,
     );
 
-    assertSimpleIdentifier(
-      propertyAccess.propertyName,
-      readElement: null,
-      writeElement: findElement.setter('foo'),
-      type: 'int',
-    );
+    if (hasAssignmentLeftResolution) {
+      assertSimpleIdentifier(
+        propertyAccess.propertyName,
+        readElement: null,
+        writeElement: findElement.setter('foo'),
+        type: 'int',
+      );
+    }
   }
 
   test_targetTypeParameter_dynamicBounded() async {
diff --git a/pkg/analyzer/test/src/dart/resolution/resolution.dart b/pkg/analyzer/test/src/dart/resolution/resolution.dart
index 2fdf8ba..b91cab9 100644
--- a/pkg/analyzer/test/src/dart/resolution/resolution.dart
+++ b/pkg/analyzer/test/src/dart/resolution/resolution.dart
@@ -50,6 +50,9 @@
 
   ClassElement get futureElement => typeProvider.futureElement;
 
+  /// TODO(scheglov) https://github.com/dart-lang/sdk/issues/43608
+  bool get hasAssignmentLeftResolution => false;
+
   ClassElement get intElement => typeProvider.intType.element;
 
   InterfaceType get intType => typeProvider.intType;
@@ -380,8 +383,6 @@
     var isRead = node.inGetterContext();
     var isWrite = node.inSetterContext();
     if (isRead && isWrite) {
-      // ignore: deprecated_member_use_from_same_package
-      assertElement(node.auxiliaryElements?.staticElement, readElement);
       assertElement(node.staticElement, writeElement);
     } else if (isRead) {
       assertElement(node.staticElement, readElement);
@@ -672,6 +673,29 @@
     }
   }
 
+  /// TODO(scheglov) https://github.com/dart-lang/sdk/issues/43608
+  /// TODO(scheglov) rename this method
+  void assertSimpleIdentifierAssignmentTarget(
+    SimpleIdentifier node, {
+    @required Object readElement,
+    @required Object writeElement,
+    @required String type,
+  }) {
+    if (hasAssignmentLeftResolution) {
+      assertSimpleIdentifier(
+        node,
+        readElement: readElement,
+        writeElement: writeElement,
+        type: type,
+      );
+    } else {
+      // TODO(scheglov) Enforce maybe?
+      // Currently VariableResolverVisitor sets it.
+      // expect(node.staticElement, isNull);
+      expect(node.staticType, isNull);
+    }
+  }
+
   void assertSubstitution(
     MapSubstitution substitution,
     Map<String, String> expected,
diff --git a/pkg/analyzer/test/src/dart/resolution/type_inference/extension_methods_test.dart b/pkg/analyzer/test/src/dart/resolution/type_inference/extension_methods_test.dart
index 43c92f8..86b728d 100644
--- a/pkg/analyzer/test/src/dart/resolution/type_inference/extension_methods_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/type_inference/extension_methods_test.dart
@@ -148,11 +148,27 @@
 }
 ''');
     var propertyAccess = findNode.prefixed('.foo =');
-    assertMember(
-      propertyAccess,
-      findElement.setter('foo', of: 'E'),
-      {'T': 'int'},
+
+    assertAssignment(
+      findNode.assignment('foo ='),
+      readElement: null,
+      readType: null,
+      writeElement: elementMatcher(
+        findElement.setter('foo', of: 'E'),
+        substitution: {'T': 'int'},
+      ),
+      writeType: 'int',
+      operatorElement: null,
+      type: 'int',
     );
+
+    if (hasAssignmentLeftResolution) {
+      assertMember(
+        propertyAccess,
+        findElement.setter('foo', of: 'E'),
+        {'T': 'int'},
+      );
+    }
   }
 
   test_implicit_targetTypeParameter_hasBound_methodInvocation() async {
@@ -237,29 +253,59 @@
 ''');
 
     if (result.libraryElement.isNonNullableByDefault) {
-      assertPropertyAccess2(
-        findNode.propertyAccess('.test'),
-        element: elementMatcher(
+      assertAssignment(
+        findNode.assignment('(x).test'),
+        readElement: null,
+        readType: null,
+        writeElement: elementMatcher(
           findElement.setter('test'),
           substitution: {'T': 'S'},
         ),
+        writeType: 'S',
+        operatorElement: null,
         type: 'S',
       );
 
+      if (hasAssignmentLeftResolution) {
+        assertPropertyAccess2(
+          findNode.propertyAccess('.test'),
+          element: elementMatcher(
+            findElement.setter('test'),
+            substitution: {'T': 'S'},
+          ),
+          type: 'S',
+        );
+      }
+
       assertTypeArgumentTypes(
         findNode.methodInvocation('g()'),
         ['S'],
       );
     } else {
-      assertPropertyAccess2(
-        findNode.propertyAccess('.test'),
-        element: elementMatcher(
+      assertAssignment(
+        findNode.assignment('(x).test'),
+        readElement: null,
+        readType: null,
+        writeElement: elementMatcher(
           findElement.setter('test'),
           substitution: {'T': 'num'},
         ),
+        writeType: 'num',
+        operatorElement: null,
         type: 'num',
       );
 
+      if (hasAssignmentLeftResolution) {
+        assertPropertyAccess2(
+          findNode.propertyAccess('.test'),
+          element: elementMatcher(
+            findElement.setter('test'),
+            substitution: {'T': 'num'},
+          ),
+          type: 'num',
+        );
+      }
+
       assertTypeArgumentTypes(
         findNode.methodInvocation('g()'),
         ['num'],
@@ -408,12 +454,27 @@
     assertElementTypeStrings(override.typeArgumentTypes, ['num']);
     assertType(override.extendedType, 'A<num>');
 
-    var propertyAccess = findNode.propertyAccess('.foo =');
-    assertMember(
-      propertyAccess,
-      findElement.setter('foo', of: 'E'),
-      {'T': 'num'},
+    assertAssignment(
+      findNode.assignment('foo ='),
+      readElement: null,
+      readType: null,
+      writeElement: elementMatcher(
+        findElement.setter('foo', of: 'E'),
+        substitution: {'T': 'num'},
+      ),
+      writeType: 'num',
+      operatorElement: null,
+      type: 'double',
     );
+
+    if (hasAssignmentLeftResolution) {
+      var propertyAccess = findNode.propertyAccess('.foo =');
+      assertMember(
+        propertyAccess,
+        findElement.setter('foo', of: 'E'),
+        {'T': 'num'},
+      );
+    }
   }
 
   test_override_inferTypeArguments_error_couldNotInfer() async {
@@ -534,12 +595,27 @@
     assertElementTypeStrings(override.typeArgumentTypes, ['int']);
     assertType(override.extendedType, 'A<int>');
 
-    var propertyAccess = findNode.propertyAccess('.foo =');
-    assertMember(
-      propertyAccess,
-      findElement.setter('foo', of: 'E'),
-      {'T': 'int'},
+    assertAssignment(
+      findNode.assignment('foo ='),
+      readElement: null,
+      readType: null,
+      writeElement: elementMatcher(
+        findElement.setter('foo', of: 'E'),
+        substitution: {'T': 'int'},
+      ),
+      writeType: 'int',
+      operatorElement: null,
+      type: 'int',
     );
+
+    if (hasAssignmentLeftResolution) {
+      var propertyAccess = findNode.propertyAccess('.foo =');
+      assertMember(
+        propertyAccess,
+        findElement.setter('foo', of: 'E'),
+        {'T': 'int'},
+      );
+    }
   }
 }
 
diff --git a/pkg/analyzer/test/src/diagnostics/abstract_super_member_reference_test.dart b/pkg/analyzer/test/src/diagnostics/abstract_super_member_reference_test.dart
index 63131c6..4a78f7c 100644
--- a/pkg/analyzer/test/src/diagnostics/abstract_super_member_reference_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/abstract_super_member_reference_test.dart
@@ -357,11 +357,25 @@
       error(CompileTimeErrorCode.ABSTRACT_SUPER_MEMBER_REFERENCE, 94, 3),
     ]);
 
-    assertPropertyAccess(
-      findNode.propertyAccess('super.foo'),
-      findElement.setter('foo', of: 'A'),
-      'int',
+    assertSuperExpression(findNode.super_('super.foo'));
+
+    assertAssignment(
+      findNode.assignment('foo ='),
+      readElement: null,
+      readType: null,
+      writeElement: findElement.setter('foo'),
+      writeType: 'int',
+      operatorElement: null,
+      type: 'int',
     );
+
+    if (hasAssignmentLeftResolution) {
+      assertPropertyAccess(
+        findNode.propertyAccess('super.foo'),
+        findElement.setter('foo', of: 'A'),
+        'int',
+      );
+    }
   }
 
   test_propertyAccess_setter_mixinHasNoSuchMethod() async {
@@ -379,11 +393,25 @@
       error(CompileTimeErrorCode.ABSTRACT_SUPER_MEMBER_REFERENCE, 111, 3),
     ]);
 
-    assertPropertyAccess(
-      findNode.propertyAccess('super.foo'),
-      findElement.setter('foo', of: 'A'),
-      'int',
+    assertSuperExpression(findNode.super_('super.foo'));
+
+    assertAssignment(
+      findNode.assignment('foo ='),
+      readElement: null,
+      readType: null,
+      writeElement: findElement.setter('foo', of: 'A'),
+      writeType: 'int',
+      operatorElement: null,
+      type: 'int',
     );
+
+    if (hasAssignmentLeftResolution) {
+      assertPropertyAccess(
+        findNode.propertyAccess('super.foo'),
+        findElement.setter('foo', of: 'A'),
+        'int',
+      );
+    }
   }
 
   test_propertyAccess_setter_superHasNoSuchMethod() async {
@@ -399,11 +427,25 @@
 }
 ''');
 
-    assertPropertyAccess(
-      findNode.propertyAccess('super.foo'),
-      findElement.setter('foo', of: 'A'),
-      'int',
+    assertSuperExpression(findNode.super_('super.foo'));
+
+    assertAssignment(
+      findNode.assignment('foo ='),
+      readElement: null,
+      readType: null,
+      writeElement: findElement.setter('foo', of: 'A'),
+      writeType: 'int',
+      operatorElement: null,
+      type: 'int',
     );
+
+    if (hasAssignmentLeftResolution) {
+      assertPropertyAccess(
+        findNode.propertyAccess('super.foo'),
+        findElement.setter('foo', of: 'A'),
+        'int',
+      );
+    }
   }
 
   test_propertyAccess_setter_superSuperHasConcrete() async {
@@ -423,10 +465,24 @@
 }
 ''');
 
-    assertPropertyAccess(
-      findNode.propertyAccess('super.foo'),
-      findElement.setter('foo', of: 'A'),
-      'int',
+    assertSuperExpression(findNode.super_('super.foo'));
+
+    assertAssignment(
+      findNode.assignment('foo ='),
+      readElement: null,
+      readType: null,
+      writeElement: findElement.setter('foo', of: 'A'),
+      writeType: 'int',
+      operatorElement: null,
+      type: 'int',
     );
+
+    if (hasAssignmentLeftResolution) {
+      assertPropertyAccess(
+        findNode.propertyAccess('super.foo'),
+        findElement.setter('foo', of: 'A'),
+        'int',
+      );
+    }
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/access_private_enum_field_test.dart b/pkg/analyzer/test/src/diagnostics/access_private_enum_field_test.dart
deleted file mode 100644
index 3ea6c65..0000000
--- a/pkg/analyzer/test/src/diagnostics/access_private_enum_field_test.dart
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright (c) 2020, 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:analyzer/src/error/codes.dart';
-import 'package:test_reflective_loader/test_reflective_loader.dart';
-
-import '../dart/resolution/context_collection_resolution.dart';
-
-main() {
-  defineReflectiveSuite(() {
-    defineReflectiveTests(AccessPrivateEnumFieldTest);
-  });
-}
-
-@reflectiveTest
-class AccessPrivateEnumFieldTest extends PubPackageResolutionTest {
-  @failingTest
-  test_name() async {
-    await assertErrorsInCode(r'''
-enum E { ONE }
-String name(E e) {
-  return e._name;
-}
-''', [
-      error(CompileTimeErrorCode.ACCESS_PRIVATE_ENUM_FIELD, 45, 5),
-    ]);
-  }
-}
diff --git a/pkg/analyzer/test/src/diagnostics/ambiguous_export_test.dart b/pkg/analyzer/test/src/diagnostics/ambiguous_export_test.dart
index 17142d7..b22efa2 100644
--- a/pkg/analyzer/test/src/diagnostics/ambiguous_export_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/ambiguous_export_test.dart
@@ -26,7 +26,7 @@
 export 'lib1.dart';
 export 'lib2.dart';
 ''', [
-      error(CompileTimeErrorCode.AMBIGUOUS_EXPORT, 20, 19),
+      error(CompileTimeErrorCode.AMBIGUOUS_EXPORT, 27, 11),
     ]);
   }
 
@@ -41,7 +41,7 @@
 export 'lib1.dart';
 export 'lib2.dart';
 ''', [
-      error(CompileTimeErrorCode.AMBIGUOUS_EXPORT, 20, 19),
+      error(CompileTimeErrorCode.AMBIGUOUS_EXPORT, 27, 11),
     ]);
   }
 
diff --git a/pkg/analyzer/test/src/diagnostics/ambiguous_extension_member_access_test.dart b/pkg/analyzer/test/src/diagnostics/ambiguous_extension_member_access_test.dart
index d4bc4a4..eb82661 100644
--- a/pkg/analyzer/test/src/diagnostics/ambiguous_extension_member_access_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/ambiguous_extension_member_access_test.dart
@@ -253,6 +253,8 @@
     ]);
     var access = findNode.propertyAccess('0.a');
     assertElementNull(access);
-    assertTypeDynamic(access);
+    if (hasAssignmentLeftResolution) {
+      assertTypeDynamic(access);
+    }
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/assignment_of_do_not_store_test.dart b/pkg/analyzer/test/src/diagnostics/assignment_of_do_not_store_test.dart
index ccdfcf5..664891c 100644
--- a/pkg/analyzer/test/src/diagnostics/assignment_of_do_not_store_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/assignment_of_do_not_store_test.dart
@@ -178,6 +178,49 @@
     ]);
   }
 
+  test_topLevelVariable_assignment_field() async {
+    await assertErrorsInCode('''
+import 'package:meta/meta.dart';
+
+String top = A().f; 
+
+class A{
+  @doNotStore
+  final f = '';
+}
+''', [
+      error(HintCode.ASSIGNMENT_OF_DO_NOT_STORE, 47, 5, messageContains: "'f'"),
+    ]);
+  }
+
+  test_topLevelVariable_assignment_getter() async {
+    await assertErrorsInCode('''
+import 'package:meta/meta.dart';
+
+String top = v; 
+
+@doNotStore
+String get v => '';
+''', [
+      error(HintCode.ASSIGNMENT_OF_DO_NOT_STORE, 47, 1, messageContains: "'v'"),
+    ]);
+  }
+
+  test_topLevelVariable_assignment_method() async {
+    await assertErrorsInCode('''
+import 'package:meta/meta.dart';
+
+String top = A().v(); 
+
+class A{
+  @doNotStore
+  String v() => '';
+}
+''', [
+      error(HintCode.ASSIGNMENT_OF_DO_NOT_STORE, 47, 7, messageContains: "'v'"),
+    ]);
+  }
+
   test_topLevelVariable_binaryExpression() async {
     await assertErrorsInCode('''
 import 'package:meta/meta.dart';
diff --git a/pkg/analyzer/test/src/diagnostics/await_in_late_local_variable_initializer_test.dart b/pkg/analyzer/test/src/diagnostics/await_in_late_local_variable_initializer_test.dart
index c321778..8a372ff 100644
--- a/pkg/analyzer/test/src/diagnostics/await_in_late_local_variable_initializer_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/await_in_late_local_variable_initializer_test.dart
@@ -23,31 +23,31 @@
     await assertErrorsInCode('''
 main() {
   var v = () async {
-    late v2 = await 42;
+    late var v2 = await 42;
     print(v2);
   };
   print(v);
 }
 ''', [
-      error(_errorCode, 44, 5),
+      error(_errorCode, 48, 5),
     ]);
   }
 
   test_late_await() async {
     await assertErrorsInCode('''
 main() async {
-  late v = await 42;
+  late var v = await 42;
   print(v);
 }
 ''', [
-      error(_errorCode, 26, 5),
+      error(_errorCode, 30, 5),
     ]);
   }
 
   test_late_await_inClosure_blockBody() async {
     await assertNoErrorsInCode('''
 main() async {
-  late v = () async {
+  late var v = () async {
     await 42;
   };
   print(v);
@@ -58,7 +58,7 @@
   test_late_await_inClosure_expressionBody() async {
     await assertNoErrorsInCode('''
 main() async {
-  late v = () async => await 42;
+  late var v = () async => await 42;
   print(v);
 }
 ''');
@@ -67,7 +67,7 @@
   test_no_await() async {
     await assertNoErrorsInCode('''
 main() async {
-  late v = 42;
+  late var v = 42;
   print(v);
 }
 ''');
diff --git a/pkg/analyzer/test/src/diagnostics/const_formal_parameter_test.dart b/pkg/analyzer/test/src/diagnostics/const_formal_parameter_test.dart
deleted file mode 100644
index 79e54ea..0000000
--- a/pkg/analyzer/test/src/diagnostics/const_formal_parameter_test.dart
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright (c) 2020, 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:analyzer/src/error/codes.dart';
-import 'package:analyzer/src/generated/parser.dart' show ParserErrorCode;
-import 'package:test_reflective_loader/test_reflective_loader.dart';
-
-import '../dart/resolution/context_collection_resolution.dart';
-
-main() {
-  defineReflectiveSuite(() {
-    defineReflectiveTests(ConstFormalParameterTest);
-  });
-}
-
-@reflectiveTest
-class ConstFormalParameterTest extends PubPackageResolutionTest {
-  test_fieldFormalParameter() async {
-    await assertErrorsInCode(r'''
-class A {
-  var x;
-  A(const this.x) {}
-}
-''', [
-      error(CompileTimeErrorCode.CONST_FORMAL_PARAMETER, 23, 12),
-      error(ParserErrorCode.EXTRANEOUS_MODIFIER, 23, 5),
-    ]);
-  }
-
-  test_simpleFormalParameter() async {
-    await assertErrorsInCode('''
-f(const x) {}
-''', [
-      error(CompileTimeErrorCode.CONST_FORMAL_PARAMETER, 2, 7),
-      error(ParserErrorCode.EXTRANEOUS_MODIFIER, 2, 5),
-    ]);
-  }
-}
diff --git a/pkg/analyzer/test/src/diagnostics/deprecated_member_use_test.dart b/pkg/analyzer/test/src/diagnostics/deprecated_member_use_test.dart
index f9f9e2e..a2d3d19 100644
--- a/pkg/analyzer/test/src/diagnostics/deprecated_member_use_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/deprecated_member_use_test.dart
@@ -11,6 +11,8 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(DeprecatedMemberUse_BasicWorkspaceTest);
+    defineReflectiveTests(
+        DeprecatedMemberUse_BasicWorkspace_WithNullSafetyTest);
     defineReflectiveTests(DeprecatedMemberUse_BazelWorkspaceTest);
     defineReflectiveTests(DeprecatedMemberUse_GnWorkspaceTest);
     defineReflectiveTests(DeprecatedMemberUse_PackageBuildWorkspaceTest);
@@ -28,7 +30,89 @@
 }
 
 @reflectiveTest
-class DeprecatedMemberUse_BasicWorkspaceTest extends PubPackageResolutionTest {
+class DeprecatedMemberUse_BasicWorkspace_WithNullSafetyTest
+    extends PubPackageResolutionTest
+    with WithNullSafetyMixin, DeprecatedMemberUse_BasicWorkspaceTestCases {
+  test_instanceCreation_namedParameter_fromLegacy() async {
+    newFile('$workspaceRootPath/aaa/lib/a.dart', content: r'''
+class A {
+  A({@deprecated int a}) {}
+}
+''');
+
+    await assertErrorsInCode(r'''
+// @dart = 2.9
+import 'package:aaa/a.dart';
+
+void f() {
+  A(a: 0);
+}
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE, 60, 1),
+    ]);
+  }
+
+  test_methodInvocation_namedParameter_ofFunction_fromLegacy() async {
+    newFile('$workspaceRootPath/aaa/lib/a.dart', content: r'''
+void foo({@deprecated int a}) {}
+''');
+
+    await assertErrorsInCode(r'''
+// @dart = 2.9
+import 'package:aaa/a.dart';
+
+void f() {
+  foo(a: 0);
+}
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE, 62, 1),
+    ]);
+  }
+
+  test_methodInvocation_namedParameter_ofMethod_fromLegacy() async {
+    newFile('$workspaceRootPath/aaa/lib/a.dart', content: r'''
+class A {
+  void foo({@deprecated int a}) {}
+}
+''');
+
+    await assertErrorsInCode(r'''
+// @dart = 2.9
+import 'package:aaa/a.dart';
+
+void f(A a) {
+  a.foo(a: 0);
+}
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE, 67, 1),
+    ]);
+  }
+
+  test_superConstructorInvocation_namedParameter_fromLegacy() async {
+    newFile('$workspaceRootPath/aaa/lib/a.dart', content: r'''
+class A {
+  A({@deprecated int a}) {}
+}
+''');
+
+    await assertErrorsInCode(r'''
+// @dart = 2.9
+import 'package:aaa/a.dart';
+
+class B extends A {
+  B() : super(a: 0);
+}
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE, 79, 1),
+    ]);
+  }
+}
+
+@reflectiveTest
+class DeprecatedMemberUse_BasicWorkspaceTest extends PubPackageResolutionTest
+    with DeprecatedMemberUse_BasicWorkspaceTestCases {}
+
+mixin DeprecatedMemberUse_BasicWorkspaceTestCases on PubPackageResolutionTest {
   @override
   void setUp() {
     super.setUp();
@@ -45,8 +129,6 @@
 library a;
 ''');
 
-    assertBasicWorkspaceFor(testFilePath);
-
     await assertErrorsInCode('''
 export 'package:aaa/a.dart';
 ''', [
@@ -62,8 +144,6 @@
 }
 ''');
 
-    assertBasicWorkspaceFor(testFilePath);
-
     await assertErrorsInCode(r'''
 import 'package:aaa/a.dart';
 
@@ -83,8 +163,6 @@
 }
 ''');
 
-    assertBasicWorkspaceFor(testFilePath);
-
     await assertErrorsInCode(r'''
 import 'package:aaa/a.dart';
 
@@ -102,8 +180,6 @@
 library a;
 ''');
 
-    assertBasicWorkspaceFor(testFilePath);
-
     await assertErrorsInCode(r'''
 // ignore:unused_import
 import 'package:aaa/a.dart';
@@ -121,8 +197,6 @@
 }
 ''');
 
-    assertBasicWorkspaceFor(testFilePath);
-
     await assertErrorsInCode(r'''
 import 'package:aaa/a.dart';
 
@@ -142,8 +216,6 @@
 }
 ''');
 
-    assertBasicWorkspaceFor(testFilePath);
-
     await assertErrorsInCode(r'''
 import 'package:aaa/a.dart';
 
@@ -155,6 +227,40 @@
     ]);
   }
 
+  test_parameter_named_ofFunction() async {
+    newFile('$workspaceRootPath/aaa/lib/a.dart', content: r'''
+void foo({@deprecated int a}) {}
+''');
+
+    await assertErrorsInCode(r'''
+import 'package:aaa/a.dart';
+
+void f() {
+  foo(a: 0);
+}
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE, 47, 1),
+    ]);
+  }
+
+  test_parameter_named_ofMethod() async {
+    newFile('$workspaceRootPath/aaa/lib/a.dart', content: r'''
+class A {
+  void foo({@deprecated int a}) {}
+}
+''');
+
+    await assertErrorsInCode(r'''
+import 'package:aaa/a.dart';
+
+void f(A a) {
+  a.foo(a: 0);
+}
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE, 52, 1),
+    ]);
+  }
+
   test_setterInvocation() async {
     newFile('$workspaceRootPath/aaa/lib/a.dart', content: r'''
 class A {
@@ -163,8 +269,6 @@
 }
 ''');
 
-    assertBasicWorkspaceFor(testFilePath);
-
     await assertErrorsInCode(r'''
 import 'package:aaa/a.dart';
 
@@ -175,6 +279,12 @@
       error(HintCode.DEPRECATED_MEMBER_USE, 48, 3),
     ]);
   }
+
+  @override
+  void verifyCreatedCollection() {
+    super.verifyCreatedCollection();
+    assertBasicWorkspaceFor(testFilePath);
+  }
 }
 
 @reflectiveTest
@@ -354,6 +464,77 @@
 @reflectiveTest
 class DeprecatedMemberUseFromSamePackage_BasicWorkspaceTest
     extends PubPackageResolutionTest {
+  test_assignmentExpression_compound_deprecatedGetter() async {
+    await assertErrorsInCode(r'''
+@deprecated
+int get x => 0;
+
+set x(int _) {}
+
+void f() {
+  x += 2;
+}
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 59, 1),
+    ]);
+  }
+
+  test_assignmentExpression_compound_deprecatedSetter() async {
+    await assertErrorsInCode(r'''
+int get x => 0;
+
+@deprecated
+set x(int _) {}
+
+void f() {
+  x += 2;
+}
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 59, 1),
+    ]);
+  }
+
+  test_assignmentExpression_simple_deprecatedGetter() async {
+    await assertNoErrorsInCode(r'''
+@deprecated
+int get x => 0;
+
+set x(int _) {}
+
+void f() {
+  x = 0;
+}
+''');
+  }
+
+  test_assignmentExpression_simple_deprecatedGetterSetter() async {
+    await assertErrorsInCode(r'''
+@deprecated
+int x = 1;
+
+void f() {
+  x = 0;
+}
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 37, 1),
+    ]);
+  }
+
+  test_assignmentExpression_simple_deprecatedSetter() async {
+    await assertErrorsInCode(r'''
+int get x => 0;
+
+@deprecated
+set x(int _) {}
+
+void f() {
+  x = 0;
+}
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 59, 1),
+    ]);
+  }
+
   test_call() async {
     await assertErrorsInCode(r'''
 class A {
@@ -412,6 +593,21 @@
     ]);
   }
 
+  test_extensionOverride() async {
+    await assertErrorsInCode(r'''
+@deprecated
+extension E on int {
+  int get foo => 0;
+}
+
+void f() {
+  E(0).foo;
+}
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 69, 1),
+    ]);
+  }
+
   test_field() async {
     await assertErrorsInCode(r'''
 class A {
@@ -440,6 +636,18 @@
     ]);
   }
 
+  test_hideCombinator() async {
+    newFile('$testPackageLibPath/a.dart', content: r'''
+@deprecated
+class A {}
+''');
+    await assertErrorsInCode('''
+import 'a.dart' hide A;
+''', [
+      error(HintCode.UNUSED_IMPORT, 7, 8),
+    ]);
+  }
+
   test_import() async {
     newFile('$testPackageLibPath/deprecated_library.dart', content: r'''
 @deprecated
@@ -656,6 +864,48 @@
     ]);
   }
 
+  test_parameter_named_inDefiningConstructor_asFieldFormalParameter() async {
+    await assertNoErrorsInCode(r'''
+class C {
+  int x;
+  C({@deprecated this.x});
+}
+''');
+  }
+
+  test_parameter_named_inDefiningConstructor_assertInitializer() async {
+    await assertNoErrorsInCode(r'''
+class C {
+  C({@deprecated int y}) : assert(y > 0);
+}
+''');
+  }
+
+  test_parameter_named_inDefiningConstructor_fieldInitializer() async {
+    await assertNoErrorsInCode(r'''
+class C {
+  int x;
+  C({@deprecated int y}) : x = y;
+}
+''');
+  }
+
+  test_parameter_named_inDefiningConstructor_inFieldFormalParameter_notName() async {
+    await assertErrorsInCode(r'''
+class A {}
+
+@deprecated
+class B extends A {}
+
+class C {
+  A a;
+  C({B this.a});
+}
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 68, 1),
+    ]);
+  }
+
   test_parameter_named_inDefiningFunction() async {
     await assertNoErrorsInCode(r'''
 f({@deprecated int x}) => x;
@@ -698,14 +948,159 @@
 ''');
   }
 
-  test_parameter_positional() async {
+  test_parameter_positionalOptional() async {
     await assertErrorsInCode(r'''
 class A {
-  m([@deprecated int x]) {}
-  n() {m(1);}
+  void foo([@deprecated int x]) {}
+}
+
+void f(A a) {
+  a.foo(0);
 }
 ''', [
-      error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 47, 1),
+      error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 70, 1),
+    ]);
+  }
+
+  test_parameter_positionalRequired() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  void foo(@deprecated int x) {}
+}
+
+void f(A a) {
+  a.foo(0);
+}
+''');
+  }
+
+  test_postfixExpression_deprecatedGetter() async {
+    await assertErrorsInCode(r'''
+@deprecated
+int get x => 0;
+
+set x(int _) {}
+
+void f() {
+  x++;
+}
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 59, 1),
+    ]);
+  }
+
+  test_postfixExpression_deprecatedNothing() async {
+    await assertNoErrorsInCode(r'''
+int get x => 0;
+
+set x(int _) {}
+
+void f() {
+  x++;
+}
+''');
+  }
+
+  test_postfixExpression_deprecatedSetter() async {
+    await assertErrorsInCode(r'''
+int get x => 0;
+
+@deprecated
+set x(int _) {}
+
+void f() {
+  x++;
+}
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 59, 1),
+    ]);
+  }
+
+  test_prefixedIdentifier_identifier() async {
+    await assertErrorsInCode(r'''
+class A {
+  @deprecated
+  static const foo = 0;
+}
+
+void f() {
+  A.foo;
+}
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 66, 3),
+    ]);
+  }
+
+  test_prefixedIdentifier_prefix() async {
+    await assertErrorsInCode(r'''
+@deprecated
+class A {
+  static const foo = 0;
+}
+
+void f() {
+  A.foo;
+}
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 62, 1),
+    ]);
+  }
+
+  test_prefixExpression_deprecatedGetter() async {
+    await assertErrorsInCode(r'''
+@deprecated
+int get x => 0;
+
+set x(int _) {}
+
+void f() {
+  ++x;
+}
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 61, 1),
+    ]);
+  }
+
+  test_prefixExpression_deprecatedSetter() async {
+    await assertErrorsInCode(r'''
+int get x => 0;
+
+@deprecated
+set x(int _) {}
+
+void f() {
+  ++x;
+}
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 61, 1),
+    ]);
+  }
+
+  test_propertyAccess_super() async {
+    await assertErrorsInCode(r'''
+class A {
+  @deprecated
+  int get foo => 0;
+}
+
+class B extends A {
+  void bar() {
+    super.foo;
+  }
+}
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 92, 3),
+    ]);
+  }
+
+  test_redirectingConstructorInvocation_namedParameter() async {
+    await assertErrorsInCode(r'''
+class A {
+  A({@deprecated int a}) {}
+  A.named() : this(a: 0);
+}
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 57, 1),
     ]);
   }
 
@@ -723,6 +1118,19 @@
     ]);
   }
 
+  test_showCombinator() async {
+    newFile('$testPackageLibPath/a.dart', content: r'''
+@deprecated
+class A {}
+''');
+    await assertErrorsInCode('''
+import 'a.dart' show A;
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 21, 1),
+      error(HintCode.UNUSED_IMPORT, 7, 8),
+    ]);
+  }
+
   test_superConstructor_namedConstructor() async {
     await assertErrorsInCode(r'''
 class A {
@@ -751,7 +1159,178 @@
     ]);
   }
 
-  test_topLevelVariable() async {
+  test_topLevelVariable_argument() async {
+    await assertErrorsInCode(r'''
+@deprecated
+int x = 1;
+
+void f() {
+  print(x);
+}
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 43, 1),
+    ]);
+  }
+
+  test_topLevelVariable_assignment_right() async {
+    await assertErrorsInCode(r'''
+@deprecated
+int x = 1;
+
+void f(int a) {
+  a = x;
+}
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 46, 1),
+    ]);
+  }
+
+  test_topLevelVariable_binaryExpression() async {
+    await assertErrorsInCode(r'''
+@deprecated
+int x = 1;
+
+void f() {
+  x + 1;
+}
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 37, 1),
+    ]);
+  }
+
+  test_topLevelVariable_constructorFieldInitializer() async {
+    await assertErrorsInCode(r'''
+@deprecated
+const int x = 1;
+
+class A {
+  final int f;
+  A() : f = x;
+}
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 67, 1),
+    ]);
+  }
+
+  test_topLevelVariable_expressionFunctionBody() async {
+    await assertErrorsInCode(r'''
+@deprecated
+int x = 1;
+
+int f() => x;
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 35, 1),
+    ]);
+  }
+
+  test_topLevelVariable_expressionStatement() async {
+    await assertErrorsInCode(r'''
+@deprecated
+int x = 1;
+
+void f() {
+  x;
+}
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 37, 1),
+    ]);
+  }
+
+  test_topLevelVariable_forElement_condition() async {
+    await assertErrorsInCode(r'''
+@deprecated
+var x = true;
+
+void f() {
+  [for (;x;) 0];
+}
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 47, 1),
+    ]);
+  }
+
+  test_topLevelVariable_forStatement_condition() async {
+    await assertErrorsInCode(r'''
+@deprecated
+var x = true;
+
+void f() {
+  for (;x;) {}
+}
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 46, 1),
+    ]);
+  }
+
+  test_topLevelVariable_ifElement_condition() async {
+    await assertErrorsInCode(r'''
+@deprecated
+var x = true;
+
+void f() {
+  [if (x) 0];
+}
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 45, 1),
+    ]);
+  }
+
+  test_topLevelVariable_ifStatement_condition() async {
+    await assertErrorsInCode(r'''
+@deprecated
+var x = true;
+
+void f() {
+  if (x) {}
+}
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 44, 1),
+    ]);
+  }
+
+  test_topLevelVariable_listLiteral() async {
+    await assertErrorsInCode(r'''
+@deprecated
+int x = 1;
+
+void f() {
+  [x];
+}
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 38, 1),
+    ]);
+  }
+
+  test_topLevelVariable_mapLiteralEntry() async {
+    await assertErrorsInCode(r'''
+@deprecated
+int x = 1;
+
+void f() {
+  ({0: x, x: 0});
+}
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 42, 1),
+      error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 45, 1),
+    ]);
+  }
+
+  test_topLevelVariable_namedExpression() async {
+    await assertErrorsInCode(r'''
+@deprecated
+int x = 1;
+
+void g({int a = 0}) {}
+
+void f() {
+  g(a: x);
+}
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 66, 1),
+    ]);
+  }
+
+  test_topLevelVariable_returnStatement() async {
     await assertErrorsInCode(r'''
 @deprecated
 int x = 1;
@@ -763,6 +1342,101 @@
       error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 43, 1),
     ]);
   }
+
+  test_topLevelVariable_setLiteral() async {
+    await assertErrorsInCode(r'''
+@deprecated
+int x = 1;
+
+void f() {
+  ({x});
+}
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 39, 1),
+    ]);
+  }
+
+  test_topLevelVariable_spreadElement() async {
+    await assertErrorsInCode(r'''
+@deprecated
+var x = [0];
+
+void f() {
+  [...x];
+}
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 43, 1),
+    ]);
+  }
+
+  test_topLevelVariable_switchCase() async {
+    await assertErrorsInCode(r'''
+@deprecated
+const int x = 1;
+
+void f(int a) {
+  switch (a) {
+    case x:
+      break;
+  }
+}
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 70, 1),
+    ]);
+  }
+
+  test_topLevelVariable_switchStatement() async {
+    await assertErrorsInCode(r'''
+@deprecated
+int x = 1;
+
+void f() {
+  switch (x) {}
+}
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 45, 1),
+    ]);
+  }
+
+  test_topLevelVariable_unaryExpression() async {
+    await assertErrorsInCode(r'''
+@deprecated
+int x = 1;
+
+void f() {
+  -x;
+}
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 38, 1),
+    ]);
+  }
+
+  test_topLevelVariable_variableDeclaration_initializer() async {
+    await assertErrorsInCode(r'''
+@deprecated
+var x = 1;
+
+void f() {
+  // ignore:unused_local_variable
+  var v = x;
+}
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 79, 1),
+    ]);
+  }
+
+  test_topLevelVariable_whileStatement_condition() async {
+    await assertErrorsInCode(r'''
+@deprecated
+var x = true;
+
+void f() {
+  while (x) {}
+}
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 47, 1),
+    ]);
+  }
 }
 
 @reflectiveTest
diff --git a/pkg/analyzer/test/src/diagnostics/duplicate_ignore_test.dart b/pkg/analyzer/test/src/diagnostics/duplicate_ignore_test.dart
new file mode 100644
index 0000000..66d84e5
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/duplicate_ignore_test.dart
@@ -0,0 +1,51 @@
+// Copyright (c) 2020, 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:analyzer/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/context_collection_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(DuplicateIgnoreTest);
+  });
+}
+
+@reflectiveTest
+class DuplicateIgnoreTest extends PubPackageResolutionTest {
+  test_file() async {
+    await assertErrorsInCode(r'''
+// ignore_for_file: unused_local_variable, unused_local_variable
+void f() {
+  var x = 0;
+}
+''', [
+      error(HintCode.DUPLICATE_IGNORE, 43, 21),
+    ]);
+  }
+
+  test_line() async {
+    await assertErrorsInCode(r'''
+void f() {
+  // ignore: unused_local_variable, unused_local_variable
+  var x = 0;
+}
+''', [
+      error(HintCode.DUPLICATE_IGNORE, 47, 21),
+    ]);
+  }
+
+  test_lineAndFile() async {
+    await assertErrorsInCode(r'''
+// ignore_for_file: unused_local_variable
+void f() {
+  // ignore: unused_local_variable
+  var x = 0;
+}
+''', [
+      error(HintCode.DUPLICATE_IGNORE, 66, 21),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/enum_constant_same_name_as_enclosing.dart b/pkg/analyzer/test/src/diagnostics/enum_constant_same_name_as_enclosing_test.dart
similarity index 100%
rename from pkg/analyzer/test/src/diagnostics/enum_constant_same_name_as_enclosing.dart
rename to pkg/analyzer/test/src/diagnostics/enum_constant_same_name_as_enclosing_test.dart
diff --git a/pkg/analyzer/test/src/diagnostics/extends_non_class_test.dart b/pkg/analyzer/test/src/diagnostics/extends_non_class_test.dart
index 2658ff5..5313441 100644
--- a/pkg/analyzer/test/src/diagnostics/extends_non_class_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/extends_non_class_test.dart
@@ -15,7 +15,113 @@
 }
 
 @reflectiveTest
-class ExtendsNonClassTest extends PubPackageResolutionTest {}
+class ExtendsNonClassTest extends PubPackageResolutionTest {
+  test_undefined() async {
+    await assertErrorsInCode(r'''
+class C extends A {}
+''', [
+      error(CompileTimeErrorCode.EXTENDS_NON_CLASS, 16, 1),
+    ]);
+  }
+
+  test_undefined_ignore_import_prefix() async {
+    await assertErrorsInCode(r'''
+import 'a.dart' as p;
+
+class C extends p.A {}
+''', [
+      error(CompileTimeErrorCode.URI_DOES_NOT_EXIST, 7, 8),
+    ]);
+  }
+
+  test_undefined_ignore_import_show_it() async {
+    await assertErrorsInCode(r'''
+import 'a.dart' show A;
+
+class C extends A {}
+''', [
+      error(CompileTimeErrorCode.URI_DOES_NOT_EXIST, 7, 8),
+    ]);
+  }
+
+  test_undefined_ignore_import_show_other() async {
+    await assertErrorsInCode(r'''
+import 'a.dart' show B;
+
+class C extends A {}
+''', [
+      error(CompileTimeErrorCode.URI_DOES_NOT_EXIST, 7, 8),
+      error(CompileTimeErrorCode.EXTENDS_NON_CLASS, 41, 1),
+    ]);
+  }
+
+  test_undefined_ignore_part_exists_uriGenerated_nameIgnorable() async {
+    newFile('$testPackageLibPath/a.g.dart', content: r'''
+part of 'test.dart';
+''');
+
+    await assertErrorsInCode(r'''
+part 'a.g.dart';
+
+class C extends _$A {}
+''', [
+      error(CompileTimeErrorCode.EXTENDS_NON_CLASS, 34, 3),
+    ]);
+  }
+
+  test_undefined_ignore_part_notExist_uriGenerated_nameIgnorable() async {
+    await assertErrorsInCode(r'''
+part 'a.g.dart';
+
+class C extends _$A {}
+''', [
+      error(CompileTimeErrorCode.URI_HAS_NOT_BEEN_GENERATED, 5, 10),
+    ]);
+  }
+
+  test_undefined_ignore_part_notExist_uriGenerated_nameNotIgnorable() async {
+    await assertErrorsInCode(r'''
+part 'a.g.dart';
+
+class C extends A {}
+''', [
+      error(CompileTimeErrorCode.URI_HAS_NOT_BEEN_GENERATED, 5, 10),
+      error(CompileTimeErrorCode.EXTENDS_NON_CLASS, 34, 1),
+    ]);
+  }
+
+  test_undefined_ignore_part_notExist_uriNotGenerated_nameIgnorable() async {
+    await assertErrorsInCode(r'''
+part 'a.dart';
+
+class C extends _$A {}
+''', [
+      error(CompileTimeErrorCode.URI_DOES_NOT_EXIST, 5, 8),
+      error(CompileTimeErrorCode.EXTENDS_NON_CLASS, 32, 3),
+    ]);
+  }
+
+  test_undefined_ignore_part_notExist_uriNotGenerated_nameNotIgnorable() async {
+    await assertErrorsInCode(r'''
+part 'a.dart';
+
+class C extends A {}
+''', [
+      error(CompileTimeErrorCode.URI_DOES_NOT_EXIST, 5, 8),
+      error(CompileTimeErrorCode.EXTENDS_NON_CLASS, 32, 1),
+    ]);
+  }
+
+  test_undefined_import_exists_prefixed() async {
+    await assertErrorsInCode(r'''
+import 'dart:math' as p;
+
+class C extends p.A {}
+''', [
+      error(CompileTimeErrorCode.EXTENDS_NON_CLASS, 42, 3),
+    ]);
+  }
+}
 
 @reflectiveTest
 class ExtendsNonClassWithNullSafetyTest extends ExtendsNonClassTest
diff --git a/pkg/analyzer/test/src/diagnostics/instance_access_to_static_member_test.dart b/pkg/analyzer/test/src/diagnostics/instance_access_to_static_member_test.dart
index 8644b85..a4f47c8 100644
--- a/pkg/analyzer/test/src/diagnostics/instance_access_to_static_member_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/instance_access_to_static_member_test.dart
@@ -61,19 +61,32 @@
 class C {}
 
 extension E on C {
-  static set a(v) {}
+  static set a(int v) {}
 }
 
 f(C c) {
   c.a = 2;
 }
 ''', [
-      error(CompileTimeErrorCode.INSTANCE_ACCESS_TO_STATIC_MEMBER, 68, 1),
+      error(CompileTimeErrorCode.INSTANCE_ACCESS_TO_STATIC_MEMBER, 72, 1),
     ]);
-    assertElement(
-      findNode.simple('a = 2;'),
-      findElement.setter('a'),
+
+    assertAssignment(
+      findNode.assignment('a ='),
+      readElement: null,
+      readType: null,
+      writeElement: findElement.setter('a', of: 'E'),
+      writeType: 'int',
+      operatorElement: null,
+      type: 'int',
     );
+
+    if (hasAssignmentLeftResolution) {
+      assertElement(
+        findNode.simple('a = 2;'),
+        findElement.setter('a'),
+      );
+    }
   }
 
   test_method_reference() async {
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_annotation_target_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_annotation_target_test.dart
index 640f51a..5ca4280 100644
--- a/pkg/analyzer/test/src/diagnostics/invalid_annotation_target_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/invalid_annotation_target_test.dart
@@ -47,7 +47,7 @@
     ]);
   }
 
-  void test_classType_topLevelVariable() async {
+  void test_classType_topLevelVariable_constructor() async {
     writeTestPackageConfigWithMeta();
     await assertErrorsInCode('''
 import 'package:meta/meta_meta.dart';
@@ -64,6 +64,25 @@
     ]);
   }
 
+  void test_classType_topLevelVariable_topLevelConstant() async {
+    writeTestPackageConfigWithMeta();
+    await assertErrorsInCode('''
+import 'package:meta/meta_meta.dart';
+
+@Target({TargetKind.classType})
+class A {
+  const A();
+}
+
+const a = A();
+
+@a
+int x = 0;
+''', [
+      error(HintCode.INVALID_ANNOTATION_TARGET, 114, 1),
+    ]);
+  }
+
   void test_enumType_class() async {
     writeTestPackageConfigWithMeta();
     await assertErrorsInCode('''
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_assignment_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_assignment_test.dart
index 591d171..f24a3ce 100644
--- a/pkg/analyzer/test/src/diagnostics/invalid_assignment_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/invalid_assignment_test.dart
@@ -57,7 +57,7 @@
   x = null;
 }
 ''', [
-      error(HintCode.DEAD_CODE, 24, 5),
+      if (hasAssignmentLeftResolution) error(HintCode.DEAD_CODE, 24, 5),
       error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 24, 4),
     ]);
   }
@@ -70,7 +70,7 @@
   x = null;
 }
 ''', [
-      error(HintCode.DEAD_CODE, 37, 5),
+      if (hasAssignmentLeftResolution) error(HintCode.DEAD_CODE, 37, 5),
       error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 37, 4),
     ]);
   }
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_modifier_on_setter_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_modifier_on_setter_test.dart
index f5fb7e2..58a00af 100644
--- a/pkg/analyzer/test/src/diagnostics/invalid_modifier_on_setter_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/invalid_modifier_on_setter_test.dart
@@ -16,15 +16,12 @@
 @reflectiveTest
 class InvalidModifierOnSetterTest extends PubPackageResolutionTest {
   test_member_async() async {
-    // TODO(danrubel): Investigate why error message is duplicated when
-    // using fasta parser.
     await assertErrorsInCode(r'''
 class A {
   set x(v) async {}
 }
 ''', [
       error(CompileTimeErrorCode.INVALID_MODIFIER_ON_SETTER, 21, 5),
-      error(CompileTimeErrorCode.INVALID_MODIFIER_ON_SETTER, 21, 5),
     ]);
   }
 
@@ -35,7 +32,6 @@
 }
 ''', [
       error(CompileTimeErrorCode.INVALID_MODIFIER_ON_SETTER, 21, 5),
-      error(CompileTimeErrorCode.INVALID_MODIFIER_ON_SETTER, 21, 5),
     ]);
   }
 
@@ -46,7 +42,6 @@
 }
 ''', [
       error(CompileTimeErrorCode.INVALID_MODIFIER_ON_SETTER, 21, 4),
-      error(CompileTimeErrorCode.INVALID_MODIFIER_ON_SETTER, 21, 4),
     ]);
   }
 
@@ -55,7 +50,6 @@
 set x(v) async {}
 ''', [
       error(CompileTimeErrorCode.INVALID_MODIFIER_ON_SETTER, 9, 5),
-      error(CompileTimeErrorCode.INVALID_MODIFIER_ON_SETTER, 9, 5),
     ]);
   }
 
@@ -64,7 +58,6 @@
 set x(v) async* {}
 ''', [
       error(CompileTimeErrorCode.INVALID_MODIFIER_ON_SETTER, 9, 5),
-      error(CompileTimeErrorCode.INVALID_MODIFIER_ON_SETTER, 9, 5),
     ]);
   }
 
@@ -73,7 +66,6 @@
 set x(v) sync* {}
 ''', [
       error(CompileTimeErrorCode.INVALID_MODIFIER_ON_SETTER, 9, 4),
-      error(CompileTimeErrorCode.INVALID_MODIFIER_ON_SETTER, 9, 4),
     ]);
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_super_invocation_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_super_invocation_test.dart
index bf48fa1..68f2839 100644
--- a/pkg/analyzer/test/src/diagnostics/invalid_super_invocation_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/invalid_super_invocation_test.dart
@@ -21,7 +21,7 @@
   A(int x) : super(), assert(x != null);
 }
 ''', [
-      error(CompileTimeErrorCode.INVALID_SUPER_INVOCATION, 23, 7),
+      error(CompileTimeErrorCode.INVALID_SUPER_INVOCATION, 23, 5),
     ]);
   }
 
@@ -32,7 +32,7 @@
   A() : super(), x = 1;
 }
 ''', [
-      error(CompileTimeErrorCode.INVALID_SUPER_INVOCATION, 33, 7),
+      error(CompileTimeErrorCode.INVALID_SUPER_INVOCATION, 33, 5),
     ]);
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_use_of_internal_member_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_use_of_internal_member_test.dart
index ac816b9..2fbaf44 100644
--- a/pkg/analyzer/test/src/diagnostics/invalid_use_of_internal_member_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/invalid_use_of_internal_member_test.dart
@@ -25,9 +25,15 @@
     super.setUp();
     writeTestPackagePubspecYamlFile(PubspecYamlFileConfig());
     writeTestPackageConfig(
-        PackageConfigFileBuilder()
-          ..add(name: 'foo', rootPath: fooPackageRootPath),
-        meta: true);
+      PackageConfigFileBuilder()
+        ..add(
+          name: 'foo',
+          rootPath: fooPackageRootPath,
+          languageVersion: '2.9',
+        ),
+      languageVersion: '2.9',
+      meta: true,
+    );
   }
 
   test_insidePackage() async {
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_use_of_visible_for_template_member_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_use_of_visible_for_template_member_test.dart
index 96eba3d..2e35506 100644
--- a/pkg/analyzer/test/src/diagnostics/invalid_use_of_visible_for_template_member_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/invalid_use_of_visible_for_template_member_test.dart
@@ -252,6 +252,26 @@
     ]);
   }
 
+  test_topLevelVariable() async {
+    newFile('$testPackageLibPath/lib1.dart', content: r'''
+import 'package:angular_meta/angular_meta.dart';
+@visibleForTemplate
+int a = 7;
+''');
+    newFile('$testPackageLibPath/lib2.dart', content: r'''
+import 'lib1.dart';
+
+void main() {
+  a;
+}
+''');
+
+    await _resolveFile('$testPackageLibPath/lib1.dart');
+    await _resolveFile('$testPackageLibPath/lib2.dart', [
+      error(HintCode.INVALID_USE_OF_VISIBLE_FOR_TEMPLATE_MEMBER, 37, 1),
+    ]);
+  }
+
   test_unnamedConstructor() async {
     newFile('$testPackageLibPath/lib1.dart', content: r'''
 import 'package:angular_meta/angular_meta.dart';
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_use_of_visible_for_testing_member_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_use_of_visible_for_testing_member_test.dart
index 80c9b7b..998e775 100644
--- a/pkg/analyzer/test/src/diagnostics/invalid_use_of_visible_for_testing_member_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/invalid_use_of_visible_for_testing_member_test.dart
@@ -39,6 +39,25 @@
     await _resolveFile('$testPackageRootPath/lib2.dart');
   }
 
+  test_fromIntegrationTestDirectory() async {
+    newFile('$testPackageRootPath/lib1.dart', content: r'''
+import 'package:meta/meta.dart';
+class A {
+  @visibleForTesting
+  void a(){ }
+}
+''');
+    newFile('$testPackageRootPath/integration_test/test.dart', content: r'''
+import '../lib1.dart';
+class B {
+  void b() => new A().a();
+}
+''');
+
+    await _resolveFile('$testPackageRootPath/lib1.dart');
+    await _resolveFile('$testPackageRootPath/integration_test/test.dart');
+  }
+
   test_fromTestDirectory() async {
     newFile('$testPackageRootPath/lib1.dart', content: r'''
 import 'package:meta/meta.dart';
@@ -58,6 +77,25 @@
     await _resolveFile('$testPackageRootPath/test/test.dart');
   }
 
+  test_fromTestDriverDirectory() async {
+    newFile('$testPackageRootPath/lib1.dart', content: r'''
+import 'package:meta/meta.dart';
+class A {
+  @visibleForTesting
+  void a(){ }
+}
+''');
+    newFile('$testPackageRootPath/test_driver/test.dart', content: r'''
+import '../lib1.dart';
+class B {
+  void b() => new A().a();
+}
+''');
+
+    await _resolveFile('$testPackageRootPath/lib1.dart');
+    await _resolveFile('$testPackageRootPath/test_driver/test.dart');
+  }
+
   test_fromTestingDirectory() async {
     newFile('$testPackageRootPath/lib1.dart', content: r'''
 import 'package:meta/meta.dart';
@@ -287,6 +325,25 @@
     ]);
   }
 
+  test_topLevelVariable() async {
+    newFile('$testPackageRootPath/lib1.dart', content: r'''
+import 'package:meta/meta.dart';
+@visibleForTesting
+int a = 7;
+''');
+    newFile('$testPackageRootPath/lib2.dart', content: r'''
+import 'lib1.dart';
+void main() {
+  a;
+}
+''');
+
+    await _resolveFile('$testPackageRootPath/lib1.dart');
+    await _resolveFile('$testPackageRootPath/lib2.dart', [
+      error(HintCode.INVALID_USE_OF_VISIBLE_FOR_TESTING_MEMBER, 36, 1),
+    ]);
+  }
+
   test_unnamedConstructor() async {
     newFile('$testPackageRootPath/lib1.dart', content: r'''
 import 'package:meta/meta.dart';
diff --git a/pkg/analyzer/test/src/diagnostics/mixin_of_non_class_test.dart b/pkg/analyzer/test/src/diagnostics/mixin_of_non_class_test.dart
index df4c58b..948a8dd 100644
--- a/pkg/analyzer/test/src/diagnostics/mixin_of_non_class_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/mixin_of_non_class_test.dart
@@ -55,6 +55,112 @@
       error(CompileTimeErrorCode.MIXIN_OF_NON_CLASS, 39, 1),
     ]);
   }
+
+  test_undefined() async {
+    await assertErrorsInCode(r'''
+class C with M {}
+''', [
+      error(CompileTimeErrorCode.MIXIN_OF_NON_CLASS, 13, 1),
+    ]);
+  }
+
+  test_undefined_ignore_import_prefix() async {
+    await assertErrorsInCode(r'''
+import 'a.dart' as p;
+
+class C with p.M {}
+''', [
+      error(CompileTimeErrorCode.URI_DOES_NOT_EXIST, 7, 8),
+    ]);
+  }
+
+  test_undefined_ignore_import_show_it() async {
+    await assertErrorsInCode(r'''
+import 'a.dart' show M;
+
+class C with M {}
+''', [
+      error(CompileTimeErrorCode.URI_DOES_NOT_EXIST, 7, 8),
+    ]);
+  }
+
+  test_undefined_ignore_import_show_other() async {
+    await assertErrorsInCode(r'''
+import 'a.dart' show N;
+
+class C with M {}
+''', [
+      error(CompileTimeErrorCode.URI_DOES_NOT_EXIST, 7, 8),
+      error(CompileTimeErrorCode.MIXIN_OF_NON_CLASS, 38, 1),
+    ]);
+  }
+
+  test_undefined_ignore_part_exists_uriGenerated_nameIgnorable() async {
+    newFile('$testPackageLibPath/a.g.dart', content: r'''
+part of 'test.dart';
+''');
+
+    await assertErrorsInCode(r'''
+part 'a.g.dart';
+
+class C with _$M {}
+''', [
+      error(CompileTimeErrorCode.MIXIN_OF_NON_CLASS, 31, 3),
+    ]);
+  }
+
+  test_undefined_ignore_part_notExist_uriGenerated_nameIgnorable() async {
+    await assertErrorsInCode(r'''
+part 'a.g.dart';
+
+class C with _$M {}
+''', [
+      error(CompileTimeErrorCode.URI_HAS_NOT_BEEN_GENERATED, 5, 10),
+    ]);
+  }
+
+  test_undefined_ignore_part_notExist_uriGenerated_nameNotIgnorable() async {
+    await assertErrorsInCode(r'''
+part 'a.g.dart';
+
+class C with M {}
+''', [
+      error(CompileTimeErrorCode.URI_HAS_NOT_BEEN_GENERATED, 5, 10),
+      error(CompileTimeErrorCode.MIXIN_OF_NON_CLASS, 31, 1),
+    ]);
+  }
+
+  test_undefined_ignore_part_notExist_uriNotGenerated_nameIgnorable() async {
+    await assertErrorsInCode(r'''
+part 'a.dart';
+
+class C with _$M {}
+''', [
+      error(CompileTimeErrorCode.URI_DOES_NOT_EXIST, 5, 8),
+      error(CompileTimeErrorCode.MIXIN_OF_NON_CLASS, 29, 3),
+    ]);
+  }
+
+  test_undefined_ignore_part_notExist_uriNotGenerated_nameNotIgnorable() async {
+    await assertErrorsInCode(r'''
+part 'a.dart';
+
+class C with M {}
+''', [
+      error(CompileTimeErrorCode.URI_DOES_NOT_EXIST, 5, 8),
+      error(CompileTimeErrorCode.MIXIN_OF_NON_CLASS, 29, 1),
+    ]);
+  }
+
+  test_undefined_import_exists_prefixed() async {
+    await assertErrorsInCode(r'''
+import 'dart:math' as p;
+
+class C with p.M {}
+''', [
+      error(CompileTimeErrorCode.MIXIN_OF_NON_CLASS, 39, 3),
+    ]);
+  }
 }
 
 @reflectiveTest
diff --git a/pkg/analyzer/test/src/diagnostics/multiple_super_initializers_test.dart b/pkg/analyzer/test/src/diagnostics/multiple_super_initializers_test.dart
index dea4b59..8147f29 100644
--- a/pkg/analyzer/test/src/diagnostics/multiple_super_initializers_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/multiple_super_initializers_test.dart
@@ -22,7 +22,7 @@
   B() : super(), super() {}
 }
 ''', [
-      error(CompileTimeErrorCode.INVALID_SUPER_INVOCATION, 39, 7),
+      error(CompileTimeErrorCode.INVALID_SUPER_INVOCATION, 39, 5),
       error(CompileTimeErrorCode.MULTIPLE_SUPER_INITIALIZERS, 48, 7),
     ]);
   }
diff --git a/pkg/analyzer/test/src/diagnostics/non_null_opt_out_test.dart b/pkg/analyzer/test/src/diagnostics/non_null_opt_out_test.dart
index 856103c..699a2a5 100644
--- a/pkg/analyzer/test/src/diagnostics/non_null_opt_out_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/non_null_opt_out_test.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 'package:analyzer/src/error/codes.dart';
-import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/member.dart';
 import 'package:analyzer/src/dart/error/syntactic_errors.dart';
@@ -40,14 +38,19 @@
   a[null] = null;
 }
 ''');
-    var assignment = findNode.assignment('= null;');
-    assertType(assignment, 'Null*');
 
-    var indexExpression = assignment.leftHandSide as IndexExpression;
-    assertType(indexExpression, 'int*');
-
-    var element = indexExpression.staticElement;
-    _assertLegacyMember(element, _import_a.method('[]='));
+    assertAssignment(
+      findNode.assignment(' = null;'),
+      readElement: null,
+      readType: null,
+      writeElement: elementMatcher(
+        _import_a.method('[]='),
+        isLegacy: true,
+      ),
+      writeType: 'int*',
+      operatorElement: null,
+      type: 'Null*',
+    );
   }
 
   test_assignment_prefixedIdentifier_instanceTarget_class_field() async {
@@ -64,17 +67,18 @@
   a.foo = 0;
 }
 ''');
-    var assignment = findNode.assignment('foo = 0');
-    assertType(assignment, 'int*');
-
-    PrefixedIdentifier prefixedIdentifier = assignment.leftHandSide;
-    assertType(prefixedIdentifier, 'int*');
-
-    var identifier = prefixedIdentifier.identifier;
-    assertType(identifier, 'int*');
-
-    PropertyAccessorElement setter = identifier.staticElement;
-    _assertLegacyMember(setter, _import_a.setter('foo'));
+    assertAssignment(
+      findNode.assignment('foo ='),
+      readElement: null,
+      readType: null,
+      writeElement: elementMatcher(
+        _import_a.setter('foo'),
+        isLegacy: true,
+      ),
+      writeType: 'int*',
+      operatorElement: null,
+      type: 'int*',
+    );
   }
 
   test_assignment_prefixedIdentifier_instanceTarget_extension_setter() async {
@@ -92,17 +96,18 @@
   a.foo = 0;
 }
 ''');
-    var assignment = findNode.assignment('foo = 0');
-    assertType(assignment, 'int*');
-
-    PrefixedIdentifier prefixedIdentifier = assignment.leftHandSide;
-    assertType(prefixedIdentifier, 'int*');
-
-    var identifier = prefixedIdentifier.identifier;
-    assertType(identifier, 'int*');
-
-    PropertyAccessorElement setter = identifier.staticElement;
-    _assertLegacyMember(setter, _import_a.setter('foo'));
+    assertAssignment(
+      findNode.assignment('foo ='),
+      readElement: null,
+      readType: null,
+      writeElement: elementMatcher(
+        _import_a.setter('foo'),
+        isLegacy: true,
+      ),
+      writeType: 'int*',
+      operatorElement: null,
+      type: 'int*',
+    );
   }
 
   test_assignment_prefixedIdentifier_staticTarget_class_field() async {
@@ -119,17 +124,18 @@
   A.foo = 0;
 }
 ''');
-    var assignment = findNode.assignment('foo = 0');
-    assertType(assignment, 'int*');
-
-    PrefixedIdentifier prefixedIdentifier = assignment.leftHandSide;
-    assertType(prefixedIdentifier, 'int*');
-
-    var identifier = prefixedIdentifier.identifier;
-    assertType(identifier, 'int*');
-
-    PropertyAccessorElement setter = identifier.staticElement;
-    _assertLegacyMember(setter, _import_a.setter('foo'));
+    assertAssignment(
+      findNode.assignment('foo ='),
+      readElement: null,
+      readType: null,
+      writeElement: elementMatcher(
+        _import_a.setter('foo'),
+        isLegacy: true,
+      ),
+      writeType: 'int*',
+      operatorElement: null,
+      type: 'int*',
+    );
   }
 
   test_assignment_prefixedIdentifier_staticTarget_extension_field() async {
@@ -146,17 +152,18 @@
   E.foo = 0;
 }
 ''');
-    var assignment = findNode.assignment('foo = 0');
-    assertType(assignment, 'int*');
-
-    PrefixedIdentifier prefixedIdentifier = assignment.leftHandSide;
-    assertType(prefixedIdentifier, 'int*');
-
-    var identifier = prefixedIdentifier.identifier;
-    assertType(identifier, 'int*');
-
-    PropertyAccessorElement setter = identifier.staticElement;
-    _assertLegacyMember(setter, _import_a.setter('foo'));
+    assertAssignment(
+      findNode.assignment('foo ='),
+      readElement: null,
+      readType: null,
+      writeElement: elementMatcher(
+        _import_a.setter('foo'),
+        isLegacy: true,
+      ),
+      writeType: 'int*',
+      operatorElement: null,
+      type: 'int*',
+    );
   }
 
   test_assignment_prefixedIdentifier_topLevelVariable() async {
@@ -171,14 +178,18 @@
   p.foo = 0;
 }
 ''');
-    var assignment = findNode.assignment('foo = 0');
-    assertType(assignment, 'int*');
-
-    PrefixedIdentifier prefixedIdentifier = assignment.leftHandSide;
-    assertType(prefixedIdentifier, 'int*');
-
-    PropertyAccessorElement setter = prefixedIdentifier.staticElement;
-    _assertLegacyMember(setter, _import_a.topSet('foo'));
+    assertAssignment(
+      findNode.assignment('foo ='),
+      readElement: null,
+      readType: null,
+      writeElement: elementMatcher(
+        _import_a.topSet('foo'),
+        isLegacy: true,
+      ),
+      writeType: 'int*',
+      operatorElement: null,
+      type: 'int*',
+    );
   }
 
   test_assignment_propertyAccess_class_field() async {
@@ -195,14 +206,18 @@
   A().foo = 0;
 }
 ''');
-    var assignment = findNode.assignment('foo = 0');
-    assertType(assignment, 'int*');
-
-    PropertyAccess propertyAccess = assignment.leftHandSide;
-    assertType(propertyAccess, 'int*');
-
-    PropertyAccessorElement setter = propertyAccess.propertyName.staticElement;
-    _assertLegacyMember(setter, _import_a.setter('foo'));
+    assertAssignment(
+      findNode.assignment('foo ='),
+      readElement: null,
+      readType: null,
+      writeElement: elementMatcher(
+        _import_a.setter('foo'),
+        isLegacy: true,
+      ),
+      writeType: 'int*',
+      operatorElement: null,
+      type: 'int*',
+    );
   }
 
   test_assignment_propertyAccess_extension_setter() async {
@@ -220,14 +235,18 @@
   A().foo = 0;
 }
 ''');
-    var assignment = findNode.assignment('foo = 0');
-    assertType(assignment, 'int*');
-
-    PropertyAccess propertyAccess = assignment.leftHandSide;
-    assertType(propertyAccess, 'int*');
-
-    PropertyAccessorElement setter = propertyAccess.propertyName.staticElement;
-    _assertLegacyMember(setter, _import_a.setter('foo'));
+    assertAssignment(
+      findNode.assignment('foo ='),
+      readElement: null,
+      readType: null,
+      writeElement: elementMatcher(
+        _import_a.setter('foo'),
+        isLegacy: true,
+      ),
+      writeType: 'int*',
+      operatorElement: null,
+      type: 'int*',
+    );
   }
 
   test_assignment_propertyAccess_extensionOverride_setter() async {
@@ -245,14 +264,18 @@
   E(a).foo = 0;
 }
 ''');
-    var assignment = findNode.assignment('foo = 0');
-    assertType(assignment, 'int*');
-
-    PropertyAccess propertyAccess = assignment.leftHandSide;
-    assertType(propertyAccess, 'int*');
-
-    PropertyAccessorElement setter = propertyAccess.propertyName.staticElement;
-    _assertLegacyMember(setter, _import_a.setter('foo'));
+    assertAssignment(
+      findNode.assignment('foo ='),
+      readElement: null,
+      readType: null,
+      writeElement: elementMatcher(
+        _import_a.setter('foo'),
+        isLegacy: true,
+      ),
+      writeType: 'int*',
+      operatorElement: null,
+      type: 'int*',
+    );
   }
 
   test_assignment_propertyAccess_superTarget() async {
@@ -271,14 +294,18 @@
   }
 }
 ''');
-    var assignment = findNode.assignment('foo = 0');
-    assertType(assignment, 'int*');
-
-    PropertyAccess propertyAccess = assignment.leftHandSide;
-    assertType(propertyAccess, 'int*');
-
-    PropertyAccessorElement setter = propertyAccess.propertyName.staticElement;
-    _assertLegacyMember(setter, _import_a.setter('foo'));
+    assertAssignment(
+      findNode.assignment('foo ='),
+      readElement: null,
+      readType: null,
+      writeElement: elementMatcher(
+        _import_a.setter('foo'),
+        isLegacy: true,
+      ),
+      writeType: 'int*',
+      operatorElement: null,
+      type: 'int*',
+    );
   }
 
   test_assignment_simpleIdentifier_topLevelVariable() async {
@@ -293,14 +320,18 @@
   foo = null;
 }
 ''');
-    var assignment = findNode.assignment('foo =');
-    assertType(assignment, 'Null*');
-
-    SimpleIdentifier identifier = assignment.leftHandSide;
-    assertType(identifier, 'int*');
-
-    PropertyAccessorElement setter = identifier.staticElement;
-    _assertLegacyMember(setter, _import_a.topSet('foo'));
+    assertAssignment(
+      findNode.assignment('foo ='),
+      readElement: null,
+      readType: null,
+      writeElement: elementMatcher(
+        _import_a.topSet('foo'),
+        isLegacy: true,
+      ),
+      writeType: 'int*',
+      operatorElement: null,
+      type: 'Null*',
+    );
   }
 
   test_binaryExpression() async {
diff --git a/pkg/analyzer/test/src/diagnostics/null_check_always_fails_test.dart b/pkg/analyzer/test/src/diagnostics/null_check_always_fails_test.dart
new file mode 100644
index 0000000..ce1298b
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/null_check_always_fails_test.dart
@@ -0,0 +1,68 @@
+// Copyright (c) 2020, 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:analyzer/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/context_collection_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(NullNeverNotNullTest);
+  });
+}
+
+@reflectiveTest
+class NullNeverNotNullTest extends PubPackageResolutionTest
+    with WithNullSafetyMixin {
+  test_nullable() async {
+    await assertNoErrorsInCode(r'''
+void f(int? i) {
+  i!;
+}
+''');
+  }
+
+  test_nullLiteral() async {
+    await assertErrorsInCode(r'''
+void f() {
+  null!;
+}
+''', [
+      error(HintCode.NULL_CHECK_ALWAYS_FAILS, 13, 5),
+    ]);
+  }
+
+  test_nullLiteral_parenthesized() async {
+    await assertErrorsInCode(r'''
+void f() {
+  (null)!;
+}
+''', [
+      error(HintCode.NULL_CHECK_ALWAYS_FAILS, 13, 7),
+    ]);
+  }
+
+  test_nullType() async {
+    await assertErrorsInCode(r'''
+void f() {
+  g()!;
+}
+Null g() => null;
+''', [
+      error(HintCode.NULL_CHECK_ALWAYS_FAILS, 13, 4),
+    ]);
+  }
+
+  test_nullType_awaited() async {
+    await assertErrorsInCode(r'''
+void f() async {
+  (await g())!;
+}
+Future<Null> g() async => null;
+''', [
+      error(HintCode.NULL_CHECK_ALWAYS_FAILS, 19, 12),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/private_setter_test.dart b/pkg/analyzer/test/src/diagnostics/private_setter_test.dart
index 438630b..a173db7 100644
--- a/pkg/analyzer/test/src/diagnostics/private_setter_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/private_setter_test.dart
@@ -32,10 +32,23 @@
     ]);
 
     var aImport = findElement.importFind('package:test/a.dart');
-    assertElement(
-      findNode.simple('_foo = 0'),
-      aImport.setter('_foo'),
+
+    assertAssignment(
+      findNode.assignment('_foo ='),
+      readElement: null,
+      readType: null,
+      writeElement: aImport.setter('_foo'),
+      writeType: 'int',
+      operatorElement: null,
+      type: 'int',
     );
+
+    if (hasAssignmentLeftResolution) {
+      assertElement(
+        findNode.simple('_foo = 0'),
+        aImport.setter('_foo'),
+      );
+    }
   }
 
   test_typeLiteral_privateField_sameLibrary() async {
@@ -51,18 +64,6 @@
 ''');
   }
 
-  test_typeLiteral_privateSetter__sameLibrary() async {
-    await assertNoErrorsInCode(r'''
-class A {
-  static set _foo(int _) {}
-}
-
-main() {
-  A._foo = 0;
-}
-''');
-  }
-
   test_typeLiteral_privateSetter_differentLibrary_hasGetter() async {
     newFile('$testPackageLibPath/a.dart', content: r'''
 class A {
@@ -82,10 +83,23 @@
     ]);
 
     var aImport = findElement.importFind('package:test/a.dart');
-    assertElement(
-      findNode.simple('_foo = 0'),
-      aImport.setter('_foo'),
+
+    assertAssignment(
+      findNode.assignment('_foo ='),
+      readElement: null,
+      readType: null,
+      writeElement: aImport.setter('_foo'),
+      writeType: 'int',
+      operatorElement: null,
+      type: 'int',
     );
+
+    if (hasAssignmentLeftResolution) {
+      assertElement(
+        findNode.simple('_foo = 0'),
+        aImport.setter('_foo'),
+      );
+    }
   }
 
   test_typeLiteral_privateSetter_differentLibrary_noGetter() async {
@@ -105,9 +119,34 @@
     ]);
 
     var aImport = findElement.importFind('package:test/a.dart');
-    assertElement(
-      findNode.simple('_foo = 0'),
-      aImport.setter('_foo'),
+
+    assertAssignment(
+      findNode.assignment('_foo ='),
+      readElement: null,
+      readType: null,
+      writeElement: aImport.setter('_foo'),
+      writeType: 'int',
+      operatorElement: null,
+      type: 'int',
     );
+
+    if (hasAssignmentLeftResolution) {
+      assertElement(
+        findNode.simple('_foo = 0'),
+        aImport.setter('_foo'),
+      );
+    }
+  }
+
+  test_typeLiteral_privateSetter_sameLibrary() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  static set _foo(int _) {}
+}
+
+main() {
+  A._foo = 0;
+}
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/receiver_of_type_never_test.dart b/pkg/analyzer/test/src/diagnostics/receiver_of_type_never_test.dart
index 3574235..757d377 100644
--- a/pkg/analyzer/test/src/diagnostics/receiver_of_type_never_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/receiver_of_type_never_test.dart
@@ -153,13 +153,25 @@
       error(HintCode.DEAD_CODE, 22, 12),
     ]);
 
-    assertIndexExpression(
-      findNode.index('x[0]'),
+    assertAssignment(
+      findNode.assignment('[0] +='),
       readElement: null,
+      readType: 'dynamic',
       writeElement: null,
+      writeType: 'dynamic',
+      operatorElement: null,
       type: 'dynamic',
     );
 
+    if (hasAssignmentLeftResolution) {
+      assertIndexExpression(
+        findNode.index('x[0]'),
+        readElement: null,
+        writeElement: null,
+        type: 'dynamic',
+      );
+    }
+
     assertType(findNode.binary('1 + 2'), 'int');
   }
 
@@ -209,13 +221,25 @@
       error(CompileTimeErrorCode.UNCHECKED_USE_OF_NULLABLE_VALUE, 21, 1),
     ]);
 
-    assertIndexExpression(
-      findNode.index('x[0]'),
+    assertAssignment(
+      findNode.assignment('[0] +='),
       readElement: null,
+      readType: 'dynamic',
       writeElement: null,
+      writeType: 'dynamic',
+      operatorElement: null,
       type: 'dynamic',
     );
 
+    if (hasAssignmentLeftResolution) {
+      assertIndexExpression(
+        findNode.index('x[0]'),
+        readElement: null,
+        writeElement: null,
+        type: 'dynamic',
+      );
+    }
+
     assertType(findNode.binary('1 + 2'), 'int');
   }
 
@@ -428,12 +452,14 @@
       error(HintCode.DEAD_CODE, 29, 2),
     ]);
 
-    assertSimpleIdentifier(
-      findNode.simple('foo'),
-      readElement: null,
-      writeElement: null,
-      type: 'dynamic',
-    );
+    if (hasAssignmentLeftResolution) {
+      assertSimpleIdentifier(
+        findNode.simple('foo'),
+        readElement: null,
+        writeElement: null,
+        type: 'dynamic',
+      );
+    }
 
     assertAssignment(
       findNode.assignment('foo += 0'),
diff --git a/pkg/analyzer/test/src/diagnostics/sdk_version_gt_gt_gt_operator_test.dart b/pkg/analyzer/test/src/diagnostics/sdk_version_gt_gt_gt_operator_test.dart
index bcdd907..6ea9193 100644
--- a/pkg/analyzer/test/src/diagnostics/sdk_version_gt_gt_gt_operator_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/sdk_version_gt_gt_gt_operator_test.dart
@@ -18,11 +18,20 @@
 @reflectiveTest
 class SdkVersionGtGtGtOperatorTest extends SdkConstraintVerifierTest {
   @override
+  String get testPackageLanguageVersion =>
+      '${ExperimentStatus.currentVersion.major}.'
+      '${ExperimentStatus.currentVersion.minor}';
+
+  @override
   void setUp() {
     super.setUp();
     writeTestPackageAnalysisOptionsFile(
       AnalysisOptionsFileConfig(
-        experiments: [EnableString.triple_shift],
+        experiments: [
+          // TODO(scheglov) https://github.com/dart-lang/sdk/issues/43837
+          EnableString.non_nullable,
+          EnableString.triple_shift,
+        ],
       ),
     );
   }
diff --git a/pkg/analyzer/test/src/diagnostics/super_in_redirecting_constructor_test.dart b/pkg/analyzer/test/src/diagnostics/super_in_redirecting_constructor_test.dart
index cbd6cdd..9fafaa1 100644
--- a/pkg/analyzer/test/src/diagnostics/super_in_redirecting_constructor_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/super_in_redirecting_constructor_test.dart
@@ -33,7 +33,7 @@
   A.name() {}
 }
 ''', [
-      error(CompileTimeErrorCode.INVALID_SUPER_INVOCATION, 18, 7),
+      error(CompileTimeErrorCode.INVALID_SUPER_INVOCATION, 18, 5),
       error(CompileTimeErrorCode.SUPER_IN_REDIRECTING_CONSTRUCTOR, 18, 7),
     ]);
   }
diff --git a/pkg/analyzer/test/src/diagnostics/test_all.dart b/pkg/analyzer/test/src/diagnostics/test_all.dart
index 6d57dca..2498c30 100644
--- a/pkg/analyzer/test/src/diagnostics/test_all.dart
+++ b/pkg/analyzer/test/src/diagnostics/test_all.dart
@@ -10,7 +10,6 @@
 import 'abstract_field_initializer_test.dart' as abstract_field_initializer;
 import 'abstract_super_member_reference_test.dart'
     as abstract_super_member_reference;
-import 'access_private_enum_field_test.dart' as access_private_enum_field;
 import 'ambiguous_export_test.dart' as ambiguous_export;
 import 'ambiguous_extension_member_access_test.dart'
     as ambiguous_extension_member_access;
@@ -87,7 +86,6 @@
 import 'const_eval_type_num_test.dart' as const_eval_type_num;
 import 'const_field_initializer_not_assignable_test.dart'
     as const_field_initializer_not_assignable;
-import 'const_formal_parameter_test.dart' as const_formal_parameter;
 import 'const_initialized_with_non_constant_value_from_deferred_library_test.dart'
     as const_initialized_with_non_constant_value_from_deferred_library;
 import 'const_initialized_with_non_constant_value_test.dart'
@@ -129,11 +127,12 @@
 import 'division_optimization_test.dart' as division_optimization;
 import 'duplicate_definition_test.dart' as duplicate_definition;
 import 'duplicate_hidden_name_test.dart' as duplicate_hidden_name;
+import 'duplicate_ignore_test.dart' as duplicate_ignore;
 import 'duplicate_import_test.dart' as duplicate_import;
 import 'duplicate_named_argument_test.dart' as duplicate_named_argument;
 import 'duplicate_part_test.dart' as duplicate_part;
 import 'duplicate_shown_name_test.dart' as duplicate_shown_name;
-import 'enum_constant_same_name_as_enclosing.dart'
+import 'enum_constant_same_name_as_enclosing_test.dart'
     as enum_constant_same_name_as_enclosing;
 import 'equal_elements_in_const_set_test.dart' as equal_elements_in_const_set;
 import 'equal_elements_in_set_test.dart' as equal_elements_in_set;
@@ -465,6 +464,7 @@
 import 'null_aware_in_condition_test.dart' as null_aware_in_condition;
 import 'null_aware_in_logical_operator_test.dart'
     as null_aware_in_logical_operator;
+import 'null_check_always_fails_test.dart' as null_check_always_fails;
 import 'null_safety_read_write_test.dart' as null_safety_read_write;
 import 'nullable_type_in_catch_clause_test.dart'
     as nullable_type_in_catch_clause;
@@ -614,7 +614,9 @@
 import 'undefined_prefixed_name_test.dart' as undefined_prefixed_name;
 import 'undefined_setter_test.dart' as undefined_setter;
 import 'undefined_shown_name_test.dart' as undefined_shown_name;
+import 'unignorable_ignore_test.dart' as unignorable_ignore;
 import 'unnecessary_cast_test.dart' as unnecessary_cast;
+import 'unnecessary_ignore_test.dart' as unnecessary_ignore;
 import 'unnecessary_no_such_method_test.dart' as unnecessary_no_such_method;
 import 'unnecessary_non_null_assertion_test.dart'
     as unnecessary_non_null_assertion;
@@ -658,7 +660,6 @@
     abstract_field_constructor_initializer.main();
     abstract_field_initializer.main();
     abstract_super_member_reference.main();
-    access_private_enum_field.main();
     ambiguous_export.main();
     ambiguous_extension_member_access.main();
     ambiguous_import.main();
@@ -711,7 +712,6 @@
     const_eval_type_bool.main();
     const_eval_type_num.main();
     const_field_initializer_not_assignable.main();
-    const_formal_parameter.main();
     const_initialized_with_non_constant_value_from_deferred_library.main();
     const_initialized_with_non_constant_value.main();
     const_instance_field.main();
@@ -741,6 +741,7 @@
     division_optimization.main();
     duplicate_definition.main();
     duplicate_hidden_name.main();
+    duplicate_ignore.main();
     duplicate_import.main();
     duplicate_named_argument.main();
     duplicate_part.main();
@@ -963,6 +964,7 @@
     null_aware_before_operator.main();
     null_aware_in_condition.main();
     null_aware_in_logical_operator.main();
+    null_check_always_fails.main();
     null_safety_read_write.main();
     nullable_type_in_catch_clause.main();
     nullable_type_in_extends_clause.main();
@@ -1064,7 +1066,9 @@
     undefined_prefixed_name.main();
     undefined_setter.main();
     undefined_shown_name.main();
+    unignorable_ignore.main();
     unnecessary_cast.main();
+    unnecessary_ignore.main();
     unnecessary_no_such_method.main();
     unnecessary_non_null_assertion.main();
     unnecessary_null_comparison.main();
diff --git a/pkg/analyzer/test/src/diagnostics/undefined_class_test.dart b/pkg/analyzer/test/src/diagnostics/undefined_class_test.dart
index 518e957..025eb5f 100644
--- a/pkg/analyzer/test/src/diagnostics/undefined_class_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/undefined_class_test.dart
@@ -36,6 +36,114 @@
     ]);
   }
 
+  test_ignore_import_prefix() async {
+    await assertErrorsInCode(r'''
+import 'a.dart' as p;
+
+p.A a;
+''', [
+      error(CompileTimeErrorCode.URI_DOES_NOT_EXIST, 7, 8),
+    ]);
+  }
+
+  test_ignore_import_show_it() async {
+    await assertErrorsInCode(r'''
+import 'a.dart' show A;
+
+A a;
+''', [
+      error(CompileTimeErrorCode.URI_DOES_NOT_EXIST, 7, 8),
+    ]);
+  }
+
+  test_ignore_import_show_other() async {
+    await assertErrorsInCode(r'''
+import 'a.dart' show B;
+
+A a;
+''', [
+      error(CompileTimeErrorCode.URI_DOES_NOT_EXIST, 7, 8),
+      error(CompileTimeErrorCode.UNDEFINED_CLASS, 25, 1),
+    ]);
+  }
+
+  test_ignore_part_exists_uriGenerated_nameIgnorable() async {
+    newFile('$testPackageLibPath/a.g.dart', content: r'''
+part of 'test.dart';
+''');
+
+    await assertErrorsInCode(r'''
+part 'a.g.dart';
+
+_$A a;
+''', [
+      error(CompileTimeErrorCode.UNDEFINED_CLASS, 18, 3),
+    ]);
+  }
+
+  test_ignore_part_notExist_uriGenerated2_nameIgnorable() async {
+    await assertErrorsInCode(r'''
+part 'a.template.dart';
+
+_$A a;
+''', [
+      error(CompileTimeErrorCode.URI_HAS_NOT_BEEN_GENERATED, 5, 17),
+    ]);
+  }
+
+  test_ignore_part_notExist_uriGenerated_nameIgnorable() async {
+    await assertErrorsInCode(r'''
+part 'a.g.dart';
+
+_$A a;
+''', [
+      error(CompileTimeErrorCode.URI_HAS_NOT_BEEN_GENERATED, 5, 10),
+    ]);
+  }
+
+  test_ignore_part_notExist_uriGenerated_nameNotIgnorable() async {
+    await assertErrorsInCode(r'''
+part 'a.g.dart';
+
+A a;
+''', [
+      error(CompileTimeErrorCode.URI_HAS_NOT_BEEN_GENERATED, 5, 10),
+      error(CompileTimeErrorCode.UNDEFINED_CLASS, 18, 1),
+    ]);
+  }
+
+  test_ignore_part_notExist_uriNotGenerated_nameIgnorable() async {
+    await assertErrorsInCode(r'''
+part 'a.dart';
+
+_$A a;
+''', [
+      error(CompileTimeErrorCode.URI_DOES_NOT_EXIST, 5, 8),
+      error(CompileTimeErrorCode.UNDEFINED_CLASS, 16, 3),
+    ]);
+  }
+
+  test_ignore_part_notExist_uriNotGenerated_nameNotIgnorable() async {
+    await assertErrorsInCode(r'''
+part 'a.dart';
+
+A a;
+''', [
+      error(CompileTimeErrorCode.URI_DOES_NOT_EXIST, 5, 8),
+      error(CompileTimeErrorCode.UNDEFINED_CLASS, 16, 1),
+    ]);
+  }
+
+  test_import_exists_prefixed() async {
+    await assertErrorsInCode(r'''
+import 'dart:math' as p;
+
+p.A a;
+''', [
+      error(CompileTimeErrorCode.UNDEFINED_CLASS, 26, 3),
+    ]);
+  }
+
   test_instanceCreation() async {
     await assertErrorsInCode('''
 f() { new C(); }
diff --git a/pkg/analyzer/test/src/diagnostics/undefined_getter_test.dart b/pkg/analyzer/test/src/diagnostics/undefined_getter_test.dart
index baf399c..814771c 100644
--- a/pkg/analyzer/test/src/diagnostics/undefined_getter_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/undefined_getter_test.dart
@@ -277,7 +277,7 @@
 }
 
 void f(A a) {
-  return a.staticMethod.call;
+  a.staticMethod.call;
 }
 ''');
   }
diff --git a/pkg/analyzer/test/src/diagnostics/unignorable_ignore_test.dart b/pkg/analyzer/test/src/diagnostics/unignorable_ignore_test.dart
new file mode 100644
index 0000000..33ef317
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/unignorable_ignore_test.dart
@@ -0,0 +1,37 @@
+// Copyright (c) 2020, 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:analyzer/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/context_collection_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(UnignorableIgnoreTest);
+  });
+}
+
+@reflectiveTest
+class UnignorableIgnoreTest extends PubPackageResolutionTest {
+  @failingTest
+  test_file() async {
+    await assertErrorsInCode(r'''
+// ignore_for_file: top_level_cycle
+var x = 0;
+''', [
+      error(HintCode.UNIGNORABLE_IGNORE, 20, 15),
+    ]);
+  }
+
+  @failingTest
+  test_line() async {
+    await assertErrorsInCode(r'''
+// ignore: top_level_cycle
+var x = 0;
+''', [
+      error(HintCode.UNIGNORABLE_IGNORE, 11, 15),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/unnecessary_ignore_test.dart b/pkg/analyzer/test/src/diagnostics/unnecessary_ignore_test.dart
new file mode 100644
index 0000000..f7b3beb
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/unnecessary_ignore_test.dart
@@ -0,0 +1,37 @@
+// Copyright (c) 2020, 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:analyzer/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/context_collection_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(UnnecessaryIgnoreTest);
+  });
+}
+
+@reflectiveTest
+class UnnecessaryIgnoreTest extends PubPackageResolutionTest {
+  @failingTest
+  test_file() async {
+    await assertErrorsInCode(r'''
+// ignore_for_file: unused_local_variable
+void f() {}
+''', [
+      error(HintCode.UNNECESSARY_IGNORE, 20, 21),
+    ]);
+  }
+
+  @failingTest
+  test_line() async {
+    await assertErrorsInCode(r'''
+// ignore: unused_local_variable
+void f() {}
+''', [
+      error(HintCode.UNNECESSARY_IGNORE, 11, 21),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/unqualified_reference_to_non_local_static_member_test.dart b/pkg/analyzer/test/src/diagnostics/unqualified_reference_to_non_local_static_member_test.dart
index 56a6482..dc4b69e 100644
--- a/pkg/analyzer/test/src/diagnostics/unqualified_reference_to_non_local_static_member_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/unqualified_reference_to_non_local_static_member_test.dart
@@ -16,6 +16,9 @@
 @reflectiveTest
 class UnqualifiedReferenceToNonLocalStaticMemberTest
     extends PubPackageResolutionTest {
+  CompileTimeErrorCode get _errorCode =>
+      CompileTimeErrorCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER;
+
   test_getter() async {
     await assertErrorsInCode(r'''
 class A {
@@ -27,10 +30,7 @@
   }
 }
 ''', [
-      error(
-          CompileTimeErrorCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER,
-          80,
-          1),
+      error(_errorCode, 80, 1),
     ]);
   }
 
@@ -46,28 +46,29 @@
   }
 }
 ''', [
-      error(
-          CompileTimeErrorCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER,
-          72,
-          3),
+      error(_errorCode, 72, 3),
     ]);
   }
 
-  test_setter() async {
+  test_readWrite() async {
     await assertErrorsInCode(r'''
 class A {
-  static set a(x) {}
+  static int get x => 0;
+  static set x(int _) {}
 }
 class B extends A {
-  b(y) {
-    a = y;
+  void f() {
+    x = 0;
+    x += 1;
+    ++x;
+    x++;
   }
 }
 ''', [
-      error(
-          CompileTimeErrorCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER,
-          66,
-          1),
+      error(_errorCode, 99, 1),
+      error(_errorCode, 110, 1),
+      error(_errorCode, 124, 1),
+      error(_errorCode, 131, 1),
     ]);
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/unqualified_reference_to_static_member_of_extended_type_test.dart b/pkg/analyzer/test/src/diagnostics/unqualified_reference_to_static_member_of_extended_type_test.dart
index 18a9304..8525aa2 100644
--- a/pkg/analyzer/test/src/diagnostics/unqualified_reference_to_static_member_of_extended_type_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/unqualified_reference_to_static_member_of_extended_type_test.dart
@@ -16,6 +16,11 @@
 @reflectiveTest
 class UnqualifiedReferenceToStaticMemberOfExtendedTypeTest
     extends PubPackageResolutionTest {
+  CompileTimeErrorCode get _errorCode {
+    return CompileTimeErrorCode
+        .UNQUALIFIED_REFERENCE_TO_STATIC_MEMBER_OF_EXTENDED_TYPE;
+  }
+
   test_getter() async {
     await assertErrorsInCode('''
 class MyClass {
@@ -27,11 +32,7 @@
   }
 }
 ''', [
-      error(
-          CompileTimeErrorCode
-              .UNQUALIFIED_REFERENCE_TO_STATIC_MEMBER_OF_EXTENDED_TYPE,
-          98,
-          4),
+      error(_errorCode, 98, 4),
     ]);
   }
 
@@ -46,30 +47,30 @@
   }
 }
 ''', [
-      error(
-          CompileTimeErrorCode
-              .UNQUALIFIED_REFERENCE_TO_STATIC_MEMBER_OF_EXTENDED_TYPE,
-          92,
-          2),
+      error(_errorCode, 92, 2),
     ]);
   }
 
-  test_setter() async {
+  test_readWrite() async {
     await assertErrorsInCode('''
 class MyClass {
-  static set foo(int i) {}
+  static int get x => 0;
+  static set x(int _) {}
 }
+
 extension MyExtension on MyClass {
-  void m() {
-    foo = 3;
+  void f() {
+    x = 0;
+    x += 1;
+    ++x;
+    x++;
   }
 }
 ''', [
-      error(
-          CompileTimeErrorCode
-              .UNQUALIFIED_REFERENCE_TO_STATIC_MEMBER_OF_EXTENDED_TYPE,
-          97,
-          3),
+      error(_errorCode, 121, 1),
+      error(_errorCode, 132, 1),
+      error(_errorCode, 146, 1),
+      error(_errorCode, 153, 1),
     ]);
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/unused_element_test.dart b/pkg/analyzer/test/src/diagnostics/unused_element_test.dart
index 4a1a652..fc48249 100644
--- a/pkg/analyzer/test/src/diagnostics/unused_element_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/unused_element_test.dart
@@ -155,6 +155,31 @@
     ]);
   }
 
+  test_classGetterSetter_isUsed_assignmentExpression_compound() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  int get _foo => 0;
+  set _foo(int _) {}
+
+  void f() {
+    _foo += 2;
+  }
+}
+''');
+  }
+
+  test_classSetter_isUsed_assignmentExpression_simple() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  set _foo(int _) {}
+
+  void f() {
+    _foo = 0;
+  }
+}
+''');
+  }
+
   test_constructor_isUsed_asRedirectee() async {
     await assertNoErrorsInCode(r'''
 class A {
@@ -686,6 +711,17 @@
 ''');
   }
 
+  test_method_isUsed_privateExtension_indexEqOperator() async {
+    await assertNoErrorsInCode(r'''
+extension _A on bool {
+  operator []=(int index, int value) {}
+}
+void main() {
+  false[0] = 1;
+}
+''');
+  }
+
   test_method_isUsed_privateExtension_indexOperator() async {
     await assertNoErrorsInCode(r'''
 extension _A on bool {
@@ -807,8 +843,18 @@
     ]);
   }
 
-  // Postfix operators can only be called, not defined. The "notUsed" sibling to
-  // this test is the test on a binary operator.
+  /// Postfix operators can only be called, not defined. The "notUsed" sibling to
+  /// this test is the test on a binary operator.
+  test_method_notUsed_privateExtension_indexEqOperator() async {
+    await assertErrorsInCode(r'''
+extension _A on bool {
+  operator []=(int index, int value) {}
+}
+''', [
+      error(HintCode.UNUSED_ELEMENT, 34, 3),
+    ]);
+  }
+
   test_method_notUsed_privateExtension_indexOperator() async {
     await assertErrorsInCode(r'''
 extension _A on bool {
@@ -819,8 +865,8 @@
     ]);
   }
 
-  // Assignment operators can only be called, not defined. The "notUsed" sibling
-  // to this test is the test on a binary operator.
+  /// Assignment operators can only be called, not defined. The "notUsed" sibling
+  /// to this test is the test on a binary operator.
   test_method_notUsed_privateExtension_operator() async {
     await assertErrorsInCode(r'''
 extension _A on String {
@@ -1362,6 +1408,57 @@
     ]);
   }
 
+  test_topLevelGetterSetter_isUsed_assignmentExpression_compound() async {
+    await assertNoErrorsInCode(r'''
+int get _foo => 0;
+set _foo(int _) {}
+
+void f() {
+  _foo += 2;
+}
+''');
+  }
+
+  test_topLevelGetterSetter_isUsed_postfixExpression_increment() async {
+    await assertNoErrorsInCode(r'''
+int get _foo => 0;
+set _foo(int _) {}
+
+void f() {
+  _foo++;
+}
+''');
+  }
+
+  test_topLevelGetterSetter_isUsed_prefixExpression_increment() async {
+    await assertNoErrorsInCode(r'''
+int get _foo => 0;
+set _foo(int _) {}
+
+void f() {
+  ++_foo;
+}
+''');
+  }
+
+  test_topLevelSetter_isUsed_assignmentExpression_simple() async {
+    await assertNoErrorsInCode(r'''
+set _foo(int _) {}
+
+void f() {
+  _foo = 0;
+}
+''');
+  }
+
+  test_topLevelSetter_notUsed() async {
+    await assertErrorsInCode(r'''
+set _foo(int _) {}
+''', [
+      error(HintCode.UNUSED_ELEMENT, 4, 4),
+    ]);
+  }
+
   test_topLevelVariable_isUsed() async {
     await assertNoErrorsInCode(r'''
 int _a = 1;
diff --git a/pkg/analyzer/test/src/diagnostics/unused_shown_name_test.dart b/pkg/analyzer/test/src/diagnostics/unused_shown_name_test.dart
index 787c6841..81d5b2c 100644
--- a/pkg/analyzer/test/src/diagnostics/unused_shown_name_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/unused_shown_name_test.dart
@@ -48,6 +48,90 @@
 ''');
   }
 
+  test_referenced_prefixed_assignmentExpression() async {
+    newFile('$testPackageLibPath/a.dart', content: r'''
+var a = 0;
+''');
+
+    await assertNoErrorsInCode(r'''
+import 'a.dart' as p show a;
+
+void f() {
+  p.a = 0;
+}
+''');
+  }
+
+  test_referenced_prefixed_postfixExpression() async {
+    newFile('$testPackageLibPath/a.dart', content: r'''
+var a = 0;
+''');
+
+    await assertNoErrorsInCode(r'''
+import 'a.dart' as p show a;
+
+void f() {
+  p.a++;
+}
+''');
+  }
+
+  test_referenced_prefixed_prefixExpression() async {
+    newFile('$testPackageLibPath/a.dart', content: r'''
+var a = 0;
+''');
+
+    await assertNoErrorsInCode(r'''
+import 'a.dart' as p show a;
+
+void f() {
+  ++p.a;
+}
+''');
+  }
+
+  test_referenced_unprefixed_assignmentExpression() async {
+    newFile('$testPackageLibPath/a.dart', content: r'''
+var a = 0;
+''');
+
+    await assertNoErrorsInCode(r'''
+import 'a.dart' show a;
+
+void f() {
+  a = 0;
+}
+''');
+  }
+
+  test_referenced_unprefixed_postfixExpression() async {
+    newFile('$testPackageLibPath/a.dart', content: r'''
+var a = 0;
+''');
+
+    await assertNoErrorsInCode(r'''
+import 'a.dart' show a;
+
+void f() {
+  a++;
+}
+''');
+  }
+
+  test_referenced_unprefixed_prefixExpression() async {
+    newFile('$testPackageLibPath/a.dart', content: r'''
+var a = 0;
+''');
+
+    await assertNoErrorsInCode(r'''
+import 'a.dart' show a;
+
+void f() {
+  ++a;
+}
+''');
+  }
+
   test_unreferenced() async {
     newFile('$testPackageLibPath/lib1.dart', content: r'''
 class A {}
diff --git a/pkg/analyzer/test/src/diagnostics/use_of_nullable_value_test.dart b/pkg/analyzer/test/src/diagnostics/use_of_nullable_value_test.dart
index a022829..aaa54e9 100644
--- a/pkg/analyzer/test/src/diagnostics/use_of_nullable_value_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/use_of_nullable_value_test.dart
@@ -23,7 +23,7 @@
     await assertNoErrorsInCode(r'''
 m() {
   Null x;
-  x as int; // ignore: unnecessary_cast
+  x as int;
 }
 ''');
   }
@@ -399,12 +399,33 @@
 ''', [
       error(CompileTimeErrorCode.UNCHECKED_USE_OF_NULLABLE_VALUE, 100, 3),
     ]);
-    var assignment1 = findNode.assignment('b.a?.x = 1');
-    var assignment2 = findNode.assignment('b.a.x = 2');
-    assertType(assignment1.leftHandSide, 'int');
-    assertType(assignment2.leftHandSide, 'int');
-    assertType(assignment1, 'int?');
-    assertType(assignment2, 'int');
+
+    assertAssignment(
+      findNode.assignment('x = 1'),
+      readElement: null,
+      readType: null,
+      writeElement: findElement.setter('x'),
+      writeType: 'int',
+      operatorElement: null,
+      type: 'int?',
+    );
+
+    assertAssignment(
+      findNode.assignment('x = 2'),
+      readElement: null,
+      readType: null,
+      writeElement: findElement.setter('x'),
+      writeType: 'int',
+      operatorElement: null,
+      type: 'int',
+    );
+
+    if (hasAssignmentLeftResolution) {
+      var assignment1 = findNode.assignment('b.a?.x = 1');
+      var assignment2 = findNode.assignment('b.a.x = 2');
+      assertType(assignment1.leftHandSide, 'int');
+      assertType(assignment2.leftHandSide, 'int');
+    }
   }
 
   test_assignment_eq_simpleIdentifier() async {
@@ -414,12 +435,33 @@
   y = 0;
 }
 ''');
-    var assignment1 = findNode.assignment('x =');
-    var assignment2 = findNode.assignment('y =');
-    assertType(assignment1.leftHandSide, 'int');
-    assertType(assignment2.leftHandSide, 'int?');
-    assertType(assignment1, 'int');
-    assertType(assignment2, 'int');
+
+    assertAssignment(
+      findNode.assignment('x ='),
+      readElement: null,
+      readType: null,
+      writeElement: findElement.parameter('x'),
+      writeType: 'int',
+      operatorElement: null,
+      type: 'int',
+    );
+
+    assertAssignment(
+      findNode.assignment('y ='),
+      readElement: null,
+      readType: null,
+      writeElement: findElement.parameter('y'),
+      writeType: 'int?',
+      operatorElement: null,
+      type: 'int',
+    );
+
+    if (hasAssignmentLeftResolution) {
+      var assignment1 = findNode.assignment('x =');
+      var assignment2 = findNode.assignment('y =');
+      assertType(assignment1.leftHandSide, 'int');
+      assertType(assignment2.leftHandSide, 'int?');
+    }
   }
 
   test_assignment_plusEq_propertyAccess3() async {
@@ -442,12 +484,39 @@
 ''', [
       error(CompileTimeErrorCode.UNCHECKED_USE_OF_NULLABLE_VALUE, 109, 5),
     ]);
-    var assignment1 = findNode.assignment('b.a.x +=');
-    var assignment2 = findNode.assignment('b.a.y +=');
-    assertType(assignment1.leftHandSide, 'int');
-    assertType(assignment2.leftHandSide, 'int?');
-    assertType(assignment1, 'int');
-    assertType(assignment2, 'int');
+
+    assertAssignment(
+      findNode.assignment('x +='),
+      readElement: findElement.getter('x'),
+      readType: 'int',
+      writeElement: findElement.setter('x'),
+      writeType: 'int',
+      operatorElement: elementMatcher(
+        numElement.getMethod('+'),
+        isLegacy: isNullSafetySdkAndLegacyLibrary,
+      ),
+      type: 'int',
+    );
+
+    assertAssignment(
+      findNode.assignment('y +='),
+      readElement: findElement.getter('y'),
+      readType: 'int?',
+      writeElement: findElement.setter('y'),
+      writeType: 'int?',
+      operatorElement: elementMatcher(
+        numElement.getMethod('+'),
+        isLegacy: isNullSafetySdkAndLegacyLibrary,
+      ),
+      type: 'int',
+    );
+
+    if (hasAssignmentLeftResolution) {
+      var assignment1 = findNode.assignment('b.a.x +=');
+      var assignment2 = findNode.assignment('b.a.y +=');
+      assertType(assignment1.leftHandSide, 'int');
+      assertType(assignment2.leftHandSide, 'int?');
+    }
   }
 
   test_assignment_plusEq_propertyAccess3_short1() async {
@@ -469,12 +538,39 @@
 ''', [
       error(CompileTimeErrorCode.UNCHECKED_USE_OF_NULLABLE_VALUE, 101, 3),
     ]);
-    var assignment1 = findNode.assignment('b.a?.x += 1');
-    var assignment2 = findNode.assignment('b.a.x += 2');
-    assertType(assignment1.leftHandSide, 'int');
-    assertType(assignment2.leftHandSide, 'int');
-    assertType(assignment1, 'int?');
-    assertType(assignment2, 'int');
+
+    assertAssignment(
+      findNode.assignment('x += 1'),
+      readElement: findElement.getter('x'),
+      readType: 'int',
+      writeElement: findElement.setter('x'),
+      writeType: 'int',
+      operatorElement: elementMatcher(
+        numElement.getMethod('+'),
+        isLegacy: isNullSafetySdkAndLegacyLibrary,
+      ),
+      type: 'int?',
+    );
+
+    assertAssignment(
+      findNode.assignment('x += 2'),
+      readElement: findElement.getter('x'),
+      readType: 'int',
+      writeElement: findElement.setter('x'),
+      writeType: 'int',
+      operatorElement: elementMatcher(
+        numElement.getMethod('+'),
+        isLegacy: isNullSafetySdkAndLegacyLibrary,
+      ),
+      type: 'int',
+    );
+
+    if (hasAssignmentLeftResolution) {
+      var assignment1 = findNode.assignment('b.a?.x += 1');
+      var assignment2 = findNode.assignment('b.a.x += 2');
+      assertType(assignment1.leftHandSide, 'int');
+      assertType(assignment2.leftHandSide, 'int');
+    }
   }
 
   test_assignment_plusEq_simpleIdentifier() async {
@@ -488,10 +584,37 @@
     ]);
     var assignment1 = findNode.assignment('x +=');
     var assignment2 = findNode.assignment('y +=');
-    assertType(assignment1.leftHandSide, 'int');
-    assertType(assignment2.leftHandSide, 'int?');
-    assertType(assignment1, 'int');
-    assertType(assignment2, 'int');
+
+    assertAssignment(
+      findNode.assignment('x +='),
+      readElement: findElement.parameter('x'),
+      readType: 'int',
+      writeElement: findElement.parameter('x'),
+      writeType: 'int',
+      operatorElement: elementMatcher(
+        numElement.getMethod('+'),
+        isLegacy: isNullSafetySdkAndLegacyLibrary,
+      ),
+      type: 'int',
+    );
+
+    assertAssignment(
+      findNode.assignment('y +='),
+      readElement: findElement.parameter('y'),
+      readType: 'int?',
+      writeElement: findElement.parameter('y'),
+      writeType: 'int?',
+      operatorElement: elementMatcher(
+        numElement.getMethod('+'),
+        isLegacy: isNullSafetySdkAndLegacyLibrary,
+      ),
+      type: 'int',
+    );
+
+    if (hasAssignmentLeftResolution) {
+      assertType(assignment1.leftHandSide, 'int');
+      assertType(assignment2.leftHandSide, 'int?');
+    }
   }
 
   test_await_nonNullable() async {
diff --git a/pkg/analyzer/test/src/pubspec/pubspec_validator_test.dart b/pkg/analyzer/test/src/pubspec/pubspec_validator_test.dart
index cf3dda7..8e8944a 100644
--- a/pkg/analyzer/test/src/pubspec/pubspec_validator_test.dart
+++ b/pkg/analyzer/test/src/pubspec/pubspec_validator_test.dart
@@ -49,7 +49,7 @@
     validator = PubspecValidator(resourceProvider, source);
   }
 
-  test_assetDirectoryDoesExists_noError() {
+  test_assetDirectoryDoesExist_noError() {
     newFolder('/sample/assets/logos');
     assertNoErrors('''
 name: sample
@@ -196,6 +196,206 @@
 ''');
   }
 
+  test_dependencyGit_malformed_empty() {
+    // todo (pq): consider validating.
+    assertNoErrors('''
+name: sample
+dependencies:
+  foo:
+    git:
+''');
+  }
+
+  test_dependencyGit_malformed_list() {
+    // todo (pq): consider validating.
+    assertNoErrors('''
+name: sample
+dependencies:
+  foo:
+    git:
+      - baz
+''');
+  }
+
+  test_dependencyGit_malformed_scalar() {
+    // todo (pq): consider validating.
+    assertNoErrors('''
+name: sample
+dependencies:
+  foo:
+    git: baz
+''');
+  }
+
+  test_dependencyGit_noVersion_valid() {
+    assertNoErrors('''
+name: sample
+dependencies:
+  foo:
+    git:      
+      url: git@github.com:foo/foo.git
+      path: path/to/foo
+''');
+  }
+
+  test_dependencyGit_version_error() {
+    assertErrors('''
+name: sample
+version: 0.1.0
+dependencies:
+  foo:
+    git:      
+      url: git@github.com:foo/foo.git
+      path: path/to/foo
+''', [PubspecWarningCode.INVALID_DEPENDENCY]);
+  }
+
+  test_dependencyGit_version_valid() {
+    assertNoErrors('''
+name: sample
+version: 0.1.0
+publish_to: none
+dependencies:
+  foo:
+    git:      
+      url: git@github.com:foo/foo.git
+      path: path/to/foo
+''');
+  }
+
+  test_dependencyGitPath() {
+    // git paths are not validated
+    assertNoErrors('''
+name: sample
+dependencies:
+  foo:
+    git:
+      url: git@github.com:foo/foo.git
+      path: path/to/foo
+''');
+  }
+
+  test_dependencyPath_malformed_empty() {
+    // todo (pq): consider validating.
+    assertNoErrors('''
+name: sample
+dependencies:
+  foo:
+    path:
+''');
+  }
+
+  test_dependencyPath_malformed_list() {
+    // todo (pq): consider validating.
+    assertNoErrors('''
+name: sample
+dependencies:
+  foo:
+    path: 
+     - baz
+''');
+  }
+
+  test_dependencyPath_noVersion_valid() {
+    newFolder('/foo');
+    newFile('/foo/pubspec.yaml', content: '''
+name: foo
+''');
+    assertNoErrors('''
+name: sample
+dependencies:
+  foo:
+    path: /foo
+''');
+  }
+
+  test_dependencyPath_pubspecDoesNotExist() {
+    newFolder('/foo');
+    assertErrors('''
+name: sample
+dependencies:
+  foo:
+    path: /foo
+''', [PubspecWarningCode.PATH_PUBSPEC_DOES_NOT_EXIST]);
+  }
+
+  test_dependencyPath_pubspecExists() {
+    newFolder('/foo');
+    newFile('/foo/pubspec.yaml', content: '''
+name: foo
+''');
+    assertNoErrors('''
+name: sample
+dependencies:
+  foo:
+    path: /foo
+''');
+  }
+
+  test_dependencyPath_valid_absolute() {
+    newFolder('/foo');
+    newFile('/foo/pubspec.yaml', content: '''
+name: foo
+''');
+    assertNoErrors('''
+name: sample
+dependencies:
+  foo:
+    path: /foo
+''');
+  }
+
+  test_dependencyPath_valid_relative() {
+    newFolder('/foo');
+    newFile('/foo/pubspec.yaml', content: '''
+name: foo
+''');
+    assertNoErrors('''
+name: sample
+dependencies:
+  foo:
+    path: ../foo
+''');
+  }
+
+  test_dependencyPath_version_error() {
+    newFolder('/foo');
+    newFile('/foo/pubspec.yaml', content: '''
+name: foo
+''');
+    assertErrors('''
+name: sample
+version: 0.1.0
+dependencies:
+  foo:
+    path: /foo
+''', [PubspecWarningCode.INVALID_DEPENDENCY]);
+  }
+
+  test_dependencyPath_version_valid() {
+    newFolder('/foo');
+    newFile('/foo/pubspec.yaml', content: '''
+name: foo
+''');
+    assertNoErrors('''
+name: sample
+version: 0.1.0
+publish_to: none
+dependencies:
+  foo:
+    path: /foo
+''');
+  }
+
+  test_dependencyPathDoesNotExist_path_error() {
+    assertErrors('''
+name: sample
+dependencies:
+  foo:
+    path: does/not/exist
+''', [PubspecWarningCode.PATH_DOES_NOT_EXIST]);
+  }
+
   test_devDependenciesField_empty() {
     assertNoErrors('''
 name: sample
@@ -218,6 +418,41 @@
 ''');
   }
 
+  test_devDependencyGit_version_no_error() {
+    // Git paths are OK in dev_dependencies
+    assertNoErrors('''
+name: sample
+version: 0.1.0
+dev_dependencies:
+  foo:
+    git:      
+      url: git@github.com:foo/foo.git
+      path: path/to/foo
+''');
+  }
+
+  test_devDependencyPathDoesNotExist_path_error() {
+    assertErrors('''
+name: sample
+dev_dependencies:
+  foo:
+    path: does/not/exist
+''', [PubspecWarningCode.PATH_DOES_NOT_EXIST]);
+  }
+
+  test_devDependencyPathExists() {
+    newFolder('/foo');
+    newFile('/foo/pubspec.yaml', content: '''
+name: foo
+''');
+    assertNoErrors('''
+name: sample
+dev_dependencies:
+  foo:
+    path: /foo
+''');
+  }
+
   test_flutterField_empty_noError() {
     assertNoErrors('''
 name: sample
diff --git a/pkg/analyzer/test/src/summary/element_text.dart b/pkg/analyzer/test/src/summary/element_text.dart
index d4fd128..45d46f2 100644
--- a/pkg/analyzer/test/src/summary/element_text.dart
+++ b/pkg/analyzer/test/src/summary/element_text.dart
@@ -418,7 +418,7 @@
     writeMetadata(e, '', '\n');
     writeIf(!e.isSimplyBounded, 'notSimplyBounded ');
 
-    if (e is GenericTypeAliasElement) {
+    if (e is FunctionTypeAliasElement) {
       buffer.write('typedef ');
       writeName(e);
       writeCodeRange(e);
diff --git a/pkg/analyzer/test/src/summary/resynthesize_common.dart b/pkg/analyzer/test/src/summary/resynthesize_common.dart
index 863692f..a3cfc3c 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_common.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_common.dart
@@ -8884,7 +8884,7 @@
         element: self::@class::C::@getter::foo
         name: SimpleIdentifier
           staticElement: self::@class::C::@getter::foo
-          staticType: int
+          staticType: null
           token: foo
 }
   metadata
@@ -8892,7 +8892,7 @@
       element: self::@getter::foo
       name: SimpleIdentifier
         staticElement: self::@getter::foo
-        staticType: int
+        staticType: null
         token: foo
   typeParameters
     T
@@ -8903,7 +8903,7 @@
           element: self::@getter::foo
           name: SimpleIdentifier
             staticElement: self::@getter::foo
-            staticType: int
+            staticType: null
             token: foo
 const int foo;
   constantInitializer
@@ -9121,7 +9121,7 @@
         element: self::@extension::E::@getter::foo
         name: SimpleIdentifier
           staticElement: self::@extension::E::@getter::foo
-          staticType: int
+          staticType: null
           token: foo
 }
   metadata
@@ -9129,7 +9129,7 @@
       element: self::@getter::foo
       name: SimpleIdentifier
         staticElement: self::@getter::foo
-        staticType: int
+        staticType: null
         token: foo
   typeParameters
     T
@@ -9140,7 +9140,7 @@
           element: self::@getter::foo
           name: SimpleIdentifier
             staticElement: self::@getter::foo
-            staticType: int
+            staticType: null
             token: foo
 const int foo;
   constantInitializer
@@ -9430,7 +9430,7 @@
         element: self::@mixin::M::@getter::foo
         name: SimpleIdentifier
           staticElement: self::@mixin::M::@getter::foo
-          staticType: int
+          staticType: null
           token: foo
 }
   metadata
@@ -9438,7 +9438,7 @@
       element: self::@getter::foo
       name: SimpleIdentifier
         staticElement: self::@getter::foo
-        staticType: int
+        staticType: null
         token: foo
   typeParameters
     T
@@ -9449,7 +9449,7 @@
           element: self::@getter::foo
           name: SimpleIdentifier
             staticElement: self::@getter::foo
-            staticType: int
+            staticType: null
             token: foo
 const int foo;
   constantInitializer
@@ -11789,7 +11789,7 @@
       element: <null>
       name: SimpleIdentifier
         staticElement: <null>
-        staticType: dynamic
+        staticType: null
         token: foo
 ''',
         withFullyResolvedAst: true);
@@ -11817,7 +11817,7 @@
       element: <null>
       name: SimpleIdentifier
         staticElement: <null>
-        staticType: dynamic
+        staticType: null
         token: v
 ''',
         withFullyResolvedAst: true);
diff --git a/pkg/analyzer/test/src/summary/top_level_inference_test.dart b/pkg/analyzer/test/src/summary/top_level_inference_test.dart
index 96d5cac..e1a5601 100644
--- a/pkg/analyzer/test/src/summary/top_level_inference_test.dart
+++ b/pkg/analyzer/test/src/summary/top_level_inference_test.dart
@@ -638,7 +638,7 @@
   }
 
   test_initializer_extractProperty_explicitlyTyped_differentLibraryCycle() async {
-    newFile('/a.dart', content: r'''
+    newFile('/test/lib/a.dart', content: r'''
 class C {
   int f = 0;
 }
@@ -648,7 +648,7 @@
 var x = new C().f;
 ''');
     checkElementText(library, r'''
-import 'a.dart';
+import 'package:test/a.dart';
 int x;
 ''');
   }
@@ -669,7 +669,7 @@
   }
 
   test_initializer_extractProperty_explicitlyTyped_sameLibraryCycle() async {
-    newFile('/a.dart', content: r'''
+    newFile('/test/lib/a.dart', content: r'''
 import 'test.dart'; // just do make it part of the library cycle
 class C {
   int f = 0;
@@ -680,13 +680,13 @@
 var x = new C().f;
 ''');
     checkElementText(library, r'''
-import 'a.dart';
+import 'package:test/a.dart';
 int x;
 ''');
   }
 
   test_initializer_extractProperty_implicitlyTyped_differentLibraryCycle() async {
-    newFile('/a.dart', content: r'''
+    newFile('/test/lib/a.dart', content: r'''
 class C {
   var f = 0;
 }
@@ -696,7 +696,7 @@
 var x = new C().f;
 ''');
     checkElementText(library, r'''
-import 'a.dart';
+import 'package:test/a.dart';
 int x;
 ''');
   }
@@ -717,7 +717,7 @@
   }
 
   test_initializer_extractProperty_implicitlyTyped_sameLibraryCycle() async {
-    newFile('/a.dart', content: r'''
+    newFile('/test/lib/a.dart', content: r'''
 import 'test.dart'; // just do make it part of the library cycle
 class C {
   var f = 0;
@@ -728,7 +728,7 @@
 var x = new C().f;
 ''');
     checkElementText(library, r'''
-import 'a.dart';
+import 'package:test/a.dart';
 dynamic x;
 ''');
   }
@@ -2590,7 +2590,7 @@
   }
 
   test_method_OK_single_private_linkThroughOtherLibraryOfCycle() async {
-    newFile('/other.dart', content: r'''
+    newFile('/test/lib/other.dart', content: r'''
 import 'test.dart';
 class B extends A2 {}
 ''');
@@ -2604,7 +2604,7 @@
 }
 ''');
     checkElementText(library, r'''
-import 'other.dart';
+import 'package:test/other.dart';
 class A1 {
   int _foo() {}
 }
@@ -2685,7 +2685,7 @@
   }
 
   Future<LibraryElement> _encodeDecodeLibrary(String text) async {
-    String path = convertPath('/test.dart');
+    String path = convertPath('/test/lib/test.dart');
     newFile(path, content: text);
     UnitElementResult result = await driver.getUnitElement(path);
     return result.element.library;
diff --git a/pkg/analyzer/test/src/summary2/ast_text_printer_test.dart b/pkg/analyzer/test/src/summary2/ast_text_printer_test.dart
index 4adaadd..9fd3a24 100644
--- a/pkg/analyzer/test/src/summary2/ast_text_printer_test.dart
+++ b/pkg/analyzer/test/src/summary2/ast_text_printer_test.dart
@@ -2,6 +2,8 @@
 // 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:analyzer/dart/analysis/features.dart';
+import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/summary2/ast_text_printer.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -11,6 +13,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(AstTextPrinterTest);
+    defineReflectiveTests(AstTextPrinterWithNullSafetyTest);
   });
 }
 
@@ -119,3 +122,23 @@
 ''');
   }
 }
+
+@reflectiveTest
+class AstTextPrinterWithNullSafetyTest extends ParseBase {
+  @override
+  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
+    ..contextFeatures = FeatureSet.forTesting(
+        sdkVersion: '2.10.0', additionalFeatures: [Feature.non_nullable]);
+
+  test_genericFunctionType_question() async {
+    assertParseCodeAndPrintAst(this, '''
+void Function()? a;
+''');
+  }
+
+  test_typeName_question() async {
+    assertParseCodeAndPrintAst(this, '''
+int? a;
+''');
+  }
+}
diff --git a/pkg/analyzer/test/src/task/strong/checker_test.dart b/pkg/analyzer/test/src/task/strong/checker_test.dart
index b71fb4b..c8fda9d 100644
--- a/pkg/analyzer/test/src/task/strong/checker_test.dart
+++ b/pkg/analyzer/test/src/task/strong/checker_test.dart
@@ -4522,7 +4522,7 @@
 
 main() => new Derived();
 ''', [
-      error(CompileTimeErrorCode.INVALID_SUPER_INVOCATION, 170, 7),
+      error(CompileTimeErrorCode.INVALID_SUPER_INVOCATION, 170, 5),
     ]);
   }
 
diff --git a/pkg/analyzer/test/src/workspace/bazel_test.dart b/pkg/analyzer/test/src/workspace/bazel_test.dart
index 0b33c83..2129789 100644
--- a/pkg/analyzer/test/src/workspace/bazel_test.dart
+++ b/pkg/analyzer/test/src/workspace/bazel_test.dart
@@ -776,7 +776,7 @@
   void test_find_hasBlazeBinFolderInOutFolder() {
     _addResources([
       '/workspace/blaze-out/host/bin/',
-      '/workspace/my/module/',
+      '/workspace/my/module/BUILD',
     ]);
     BazelWorkspace workspace = BazelWorkspace.find(
         resourceProvider, convertPath('/workspace/my/module'));
@@ -785,6 +785,12 @@
     expect(workspace.binPaths.single,
         convertPath('/workspace/blaze-out/host/bin'));
     expect(workspace.genfiles, convertPath('/workspace/blaze-genfiles'));
+    expect(
+        workspace
+            .findPackageFor(convertPath(
+                '/workspace/blaze-out/host/bin/my/module/lib/foo.dart'))
+            .root,
+        convertPath('/workspace/my/module'));
   }
 
   void test_find_hasBlazeOutFolder_missingBinFolder() {
diff --git a/pkg/analyzer/test/test_all.dart b/pkg/analyzer/test/test_all.dart
index 1daab29..b62b2e4 100644
--- a/pkg/analyzer/test/test_all.dart
+++ b/pkg/analyzer/test/test_all.dart
@@ -9,7 +9,6 @@
 import 'file_system/test_all.dart' as file_system;
 import 'generated/test_all.dart' as generated;
 import 'instrumentation/test_all.dart' as instrumentation;
-import 'parse_compilation_unit_test.dart' as parse_compilation_unit;
 import 'source/test_all.dart' as source;
 import 'src/test_all.dart' as src;
 import 'verify_diagnostics_test.dart' as verify_diagnostics;
@@ -23,7 +22,6 @@
     file_system.main();
     generated.main();
     instrumentation.main();
-    parse_compilation_unit.main();
     source.main();
     src.main();
     verify_diagnostics.main();
diff --git a/pkg/analyzer/test/util/element_type_matchers.dart b/pkg/analyzer/test/util/element_type_matchers.dart
index 4379510..1ace6dd 100644
--- a/pkg/analyzer/test/util/element_type_matchers.dart
+++ b/pkg/analyzer/test/util/element_type_matchers.dart
@@ -30,8 +30,6 @@
 
 const isGenericFunctionTypeElement = TypeMatcher<GenericFunctionTypeElement>();
 
-const isGenericTypeAliasElement = TypeMatcher<GenericTypeAliasElement>();
-
 const isHideElementCombinator = TypeMatcher<HideElementCombinator>();
 
 const isImportElement = TypeMatcher<ImportElement>();
diff --git a/pkg/analyzer/test/verify_diagnostics_test.dart b/pkg/analyzer/test/verify_diagnostics_test.dart
index 815b3db..de52dc3 100644
--- a/pkg/analyzer/test/verify_diagnostics_test.dart
+++ b/pkg/analyzer/test/verify_diagnostics_test.dart
@@ -407,6 +407,7 @@
 
   /// Initialize a newly created test to test the given [snippet].
   _SnippetTest(this.snippet) {
+    // TODO(scheglov) https://github.com/dart-lang/sdk/issues/43837
     writeTestPackageAnalysisOptionsFile(
       AnalysisOptionsFileConfig(
         experiments: snippet.experiments,
@@ -415,6 +416,12 @@
   }
 
   @override
+  String get testPackageLanguageVersion {
+    // TODO(scheglov) https://github.com/dart-lang/sdk/issues/43837
+    return snippet.experiments == null ? '2.9' : null;
+  }
+
+  @override
   void setUp() {
     super.setUp();
     _createAuxiliaryFiles(snippet.auxiliaryFiles);
diff --git a/pkg/analyzer/test/verify_docs_test.dart b/pkg/analyzer/test/verify_docs_test.dart
index 975bbf2..5107cd6 100644
--- a/pkg/analyzer/test/verify_docs_test.dart
+++ b/pkg/analyzer/test/verify_docs_test.dart
@@ -25,25 +25,28 @@
 }
 
 class SnippetTester {
-  OverlayResourceProvider provider;
-  Folder docFolder;
-  String snippetDirPath;
-  String snippetPath;
+  final OverlayResourceProvider provider;
+  final Folder docFolder;
+  final String snippetDirPath;
+  final String snippetPath;
 
-  StringBuffer output = StringBuffer();
+  final StringBuffer output = StringBuffer();
 
-  SnippetTester() {
-    provider = OverlayResourceProvider(PhysicalResourceProvider.INSTANCE);
-    String packageRoot =
-        provider.pathContext.normalize(package_root.packageRoot);
-    String analyzerPath = provider.pathContext.join(packageRoot, 'analyzer');
-    String docPath = provider.pathContext.join(analyzerPath, 'doc');
-    docFolder = provider.getFolder(docPath);
-    snippetDirPath =
+  factory SnippetTester() {
+    var provider = OverlayResourceProvider(PhysicalResourceProvider.INSTANCE);
+    var packageRoot = provider.pathContext.normalize(package_root.packageRoot);
+    var analyzerPath = provider.pathContext.join(packageRoot, 'analyzer');
+    var docPath = provider.pathContext.join(analyzerPath, 'doc');
+    var docFolder = provider.getFolder(docPath);
+    var snippetDirPath =
         provider.pathContext.join(analyzerPath, 'test', 'snippets');
-    snippetPath = provider.pathContext.join(snippetDirPath, 'snippet.dart');
+    var snippetPath = provider.pathContext.join(snippetDirPath, 'snippet.dart');
+    return SnippetTester._(provider, docFolder, snippetDirPath, snippetPath);
   }
 
+  SnippetTester._(
+      this.provider, this.docFolder, this.snippetDirPath, this.snippetPath);
+
   Future<void> verify() async {
     await verifyFolder(docFolder);
   }
diff --git a/pkg/analyzer/tool/diagnostics/diagnostics.md b/pkg/analyzer/tool/diagnostics/diagnostics.md
index a09ddb7..5b680ce 100644
--- a/pkg/analyzer/tool/diagnostics/diagnostics.md
+++ b/pkg/analyzer/tool/diagnostics/diagnostics.md
@@ -234,6 +234,55 @@
 doesn't conform to the language specification or
 that might work in unexpected ways.
 
+### abstract_field_initializer
+
+_Abstract fields can't have initializers._
+
+#### Description
+
+The analyzer produces this diagnostic when a field that has the `abstract`
+modifier also has an initializer.
+
+#### Example
+
+The following code produces this diagnostic because `f` is marked as
+`abstract` and has an initializer:
+
+{% prettify dart tag=pre+code %}
+abstract class C {
+  abstract int [!f!] = 0;
+}
+{% endprettify %}
+
+The following code produces this diagnostic because `f` is marked as
+`abstract` and there's an initializer in the constructor:
+
+{% prettify dart tag=pre+code %}
+abstract class C {
+  abstract int f;
+
+  C() : [!f!] = 0;
+}
+{% endprettify %}
+
+#### Common fixes
+
+If the field must be abstract, then remove the initializer:
+
+{% prettify dart tag=pre+code %}
+abstract class C {
+  abstract int f;
+}
+{% endprettify %}
+
+If the field isn't required to be abstract, then remove the keyword:
+
+{% prettify dart tag=pre+code %}
+abstract class C {
+  int f = 0;
+}
+{% endprettify %}
+
 ### abstract_super_member_reference
 
 _The {0} '{1}' is always abstract in the supertype._
@@ -263,6 +312,54 @@
 Remove the invocation of the abstract member, possibly replacing it with an
 invocation of a concrete member.
 
+### ambiguous_export
+
+_The name '{0}' is defined in the libraries '{1}' and '{2}'._
+
+#### Description
+
+The analyzer produces this diagnostic when two or more export directives
+cause the same name to be exported from multiple libraries.
+
+#### Example
+
+Given a file named `a.dart` containing
+
+{% prettify dart tag=pre+code %}
+class C {}
+{% endprettify %}
+
+And a file named `b.dart` containing
+
+{% prettify dart tag=pre+code %}
+class C {}
+{% endprettify %}
+
+The following code produces this diagnostic because the name `C` is being
+exported from both `a.dart` and `b.dart`:
+
+{% prettify dart tag=pre+code %}
+export 'a.dart';
+export [!'b.dart'!];
+{% endprettify %}
+
+#### Common fixes
+
+If none of the names in one of the libraries needs to be exported, then
+remove the unnecessary export directives:
+
+{% prettify dart tag=pre+code %}
+export 'a.dart';
+{% endprettify %}
+
+If all of the export directives are needed, then hide the name in all
+except one of the directives:
+
+{% prettify dart tag=pre+code %}
+export 'a.dart';
+export 'b.dart' hide C;
+{% endprettify %}
+
 ### ambiguous_extension_member_access
 
 _A member named '{0}' is defined in extensions '{1}' and '{2}' and neither is
@@ -570,6 +667,103 @@
 String g(num y) => f(y as String);
 {% endprettify %}
 
+### assert_in_redirecting_constructor
+
+_A redirecting constructor can't have an 'assert' initializer._
+
+#### Description
+
+The analyzer produces this diagnostic when a redirecting constructor (a
+constructor that redirects to another constructor in the same class) has an
+assert in the initializer list.
+
+#### Example
+
+The following code produces this diagnostic because the unnamed constructor
+is a redirecting constructor and also has an assert in the initializer
+list:
+
+{% prettify dart tag=pre+code %}
+class C {
+  C(int x) : [!assert(x > 0)!], this.name();
+  C.name() {}
+}
+{% endprettify %}
+
+#### Common fixes
+
+If the assert isn't needed, then remove it:
+
+{% prettify dart tag=pre+code %}
+class C {
+  C(int x) : this.name();
+  C.name() {}
+}
+{% endprettify %}
+
+If the assert is needed, then convert the constructor into a factory
+constructor:
+
+{% prettify dart tag=pre+code %}
+class C {
+  factory C(int x) {
+    assert(x > 0);
+    return C.name();
+  }
+  C.name() {}
+}
+{% endprettify %}
+
+### assignment_to_const
+
+_Constant variables can't be assigned a value._
+
+#### Description
+
+The analyzer produces this diagnostic when it finds an assignment to a
+top-level variable, a static field, or a local variable that has the
+`const` modifier. The value of a compile-time constant can't be changed at
+runtime.
+
+#### Example
+
+The following code produces this diagnostic because `c` is being assigned a
+value even though it has the `const` modifier:
+
+{% prettify dart tag=pre+code %}
+const c = 0;
+
+void f() {
+  [!c!] = 1;
+  print(c);
+}
+{% endprettify %}
+
+#### Common fixes
+
+If the variable must be assignable, then remove the `const` modifier:
+
+{% prettify dart tag=pre+code %}
+var c = 0;
+
+void f() {
+  c = 1;
+  print(c);
+}
+{% endprettify %}
+
+If the constant shouldn't be changed, then either remove the assignment or
+use a local variable in place of references to the constant:
+
+{% prettify dart tag=pre+code %}
+const c = 0;
+
+void f() {
+  var v = 1;
+  print(v);
+}
+{% endprettify %}
+
 ### assignment_to_final
 
 _'{0}' can't be used as a setter because it's final._
@@ -744,7 +938,7 @@
 
 {% prettify dart tag=pre+code %}
 Future<int> f() async {
-  late v = [!await!] 42;
+  late var v = [!await!] 42;
   return v;
 }
 {% endprettify %}
@@ -755,7 +949,7 @@
 
 {% prettify dart tag=pre+code %}
 Future<int> f() async {
-  late v = 42;
+  late var v = 42;
   return v;
 }
 {% endprettify %}
@@ -1433,9 +1627,55 @@
 C f(int i) => C(i);
 {% endprettify %}
 
-### creation_with_non_type
+### const_with_type_parameters
 
-_The name '{0}' isn't a class._
+_A constant creation can't use a type parameter as a type argument._
+
+#### Description
+
+The analyzer produces this diagnostic when a type parameter is used as a
+type argument in a `const` invocation of a constructor. This isn't allowed
+because the value of the type parameter (the actual type that will be used
+at runtime) can't be known at compile time.
+
+#### Example
+
+The following code produces this diagnostic because the type parameter `T`
+is being used as a type argument when creating a constant:
+
+{% prettify dart tag=pre+code %}
+class C<T> {
+  const C();
+}
+
+C<T> newC<T>() => const C<[!T!]>();
+{% endprettify %}
+
+#### Common fixes
+
+If the type that will be used for the type parameter can be known at
+compile time, then remove the use of the type parameter:
+
+{% prettify dart tag=pre+code %}
+class C<T> {
+  const C();
+}
+
+C<int> newC() => const C<int>();
+{% endprettify %}
+
+If the type that will be used for the type parameter can't be known until
+runtime, then remove the keyword `const`:
+
+{% prettify dart tag=pre+code %}
+class C<T> {
+  const C();
+}
+
+C<T> newC<T>() => C<T>();
+{% endprettify %}
+
+### creation_with_non_type
 
 _The name '{0}' isn't a class._
 
@@ -1977,6 +2217,54 @@
 int y = 1;
 {% endprettify %}
 
+### duplicate_ignore
+
+_The diagnostic '{0}' doesn't need to be ignored here because it's already being
+ignored._
+
+#### Description
+
+The analyzer produces this diagnostic when a diagnostic name appears in an
+`ignore` comment, but the diagnostic is already being ignored, either
+because it's already included in the same `ignore` comment or because it
+appears in an `ignore-in-file` comment.
+
+#### Example
+
+The following code produces this diagnostic because the diagnostic named
+`unused_local_variable` is already being ignored for the whole file so it
+doesn't need to be ignored on a specific line:
+
+{% prettify dart tag=pre+code %}
+// ignore_for_file: unused_local_variable
+void f() {
+  // ignore: [!unused_local_variable!]
+  var x = 0;
+}
+{% endprettify %}
+
+The following code produces this diagnostic because the diagnostic named
+`unused_local_variable` is being ignored twice on the same line:
+
+{% prettify dart tag=pre+code %}
+void f() {
+  // ignore: unused_local_variable, [!unused_local_variable!]
+  var x = 0;
+}
+{% endprettify %}
+
+#### Common fixes
+
+Remove the ignore comment, or remove the unnecessary diagnostic name if the
+ignore comment is ignoring more than one diagnostic:
+
+{% prettify dart tag=pre+code %}
+// ignore_for_file: unused_local_variable
+void f() {
+  var x = 0;
+}
+{% endprettify %}
+
 ### duplicate_import
 
 _Duplicate import._
@@ -2058,6 +2346,43 @@
 }
 {% endprettify %}
 
+### duplicate_part
+
+_The library already contains a part with the URI '{0}'._
+
+#### Description
+
+The analyzer produces this diagnostic when a single file is referenced in
+multiple part directives.
+
+#### Example
+
+Given a file named `part.dart` containing
+
+{% prettify dart tag=pre+code %}
+part of lib;
+{% endprettify %}
+
+The following code produces this diagnostic because the file `part.dart` is
+included multiple times:
+
+{% prettify dart tag=pre+code %}
+library lib;
+
+part 'part.dart';
+part [!'part.dart'!];
+{% endprettify %}
+
+#### Common fixes
+
+Remove all except the first of the duplicated part directives:
+
+{% prettify dart tag=pre+code %}
+library lib;
+
+part 'part.dart';
+{% endprettify %}
+
 ### equal_elements_in_const_set
 
 _Two elements in a constant set literal can't be equal._
@@ -2218,6 +2543,84 @@
 of which entry to remove might affect the order in which the keys and
 values are returned by an iterator.
 
+### expected_one_list_type_arguments
+
+_List literals require one type argument or none, but {0} found._
+
+#### Description
+
+The analyzer produces this diagnostic when a list literal has more than one
+type argument.
+
+#### Example
+
+The following code produces this diagnostic because the list literal has
+two type arguments when it can have at most one:
+
+{% prettify dart tag=pre+code %}
+var l = [!<int, int>!][];
+{% endprettify %}
+
+#### Common fixes
+
+Remove all except one of the type arguments:
+
+{% prettify dart tag=pre+code %}
+var l = <int>[];
+{% endprettify %}
+
+### expected_one_set_type_arguments
+
+_Set literals require one type argument or none, but {0} were found._
+
+#### Description
+
+The analyzer produces this diagnostic when a set literal has more than one
+type argument.
+
+#### Example
+
+The following code produces this diagnostic because the set literal has
+three type arguments when it can have at most one:
+
+{% prettify dart tag=pre+code %}
+var s = [!<int, String, int>!]{0, 'a', 1};
+{% endprettify %}
+
+#### Common fixes
+
+Remove all except one of the type arguments:
+
+{% prettify dart tag=pre+code %}
+var s = <int>{0, 1};
+{% endprettify %}
+
+### expected_two_map_type_arguments
+
+_Map literals require two type arguments or none, but {0} found._
+
+#### Description
+
+The analyzer produces this diagnostic when a map literal has either one or
+more than two type arguments.
+
+#### Example
+
+The following code produces this diagnostic because the map literal has
+three type arguments when it can have either two or zero:
+
+{% prettify dart tag=pre+code %}
+var m = [!<int, String, int>!]{};
+{% endprettify %}
+
+#### Common fixes
+
+Remove all except two of the type arguments:
+
+{% prettify dart tag=pre+code %}
+var m = <int, String>{};
+{% endprettify %}
+
 ### export_legacy_symbol
 
 _The symbol '{0}' is defined in a legacy library, and can't be re-exported from
@@ -2268,6 +2671,37 @@
 combinator to the export directive in your library that hides all of the
 names declared in the opted-out library.
 
+### export_of_non_library
+
+_The exported library '{0}' can't have a part-of directive._
+
+#### Description
+
+The analyzer produces this diagnostic when an export directive references a
+part rather than a library.
+
+#### Example
+
+Given a file named `part.dart` containing
+
+{% prettify dart tag=pre+code %}
+part of lib;
+{% endprettify %}
+
+The following code produces this diagnostic because the file `part.dart` is
+a part, and only libraries can be exported:
+
+{% prettify dart tag=pre+code %}
+library lib;
+
+export [!'part.dart'!];
+{% endprettify %}
+
+#### Common fixes
+
+Either remove the export directive, or change the URI to be the URI of the
+library containing the part.
+
 ### expression_in_map
 
 _Expressions can't be used in a map literal._
@@ -3094,6 +3528,42 @@
 }
 {% endprettify %}
 
+### illegal_async_generator_return_type
+
+_Functions marked 'async*' must have a return type that is a supertype of
+'Stream<T>' for some type 'T'._
+
+#### Description
+
+The analyzer produces this diagnostic when the body of a function has the
+`async*` modifier even though the return type of the function isn't either
+`Stream` or a supertype of `Stream`.
+
+#### Example
+
+The following code produces this diagnostic because the body of the
+function `f` has the 'async*' modifier even though the return type `int`
+isn't a supertype of `Stream`:
+
+{% prettify dart tag=pre+code %}
+[!int!] f() async* {}
+{% endprettify %}
+
+#### Common fixes
+
+If the function should be asynchronous, then change the return type to be
+either `Stream` or a supertype of `Stream`:
+
+{% prettify dart tag=pre+code %}
+Stream<int> f() async* {}
+{% endprettify %}
+
+If the function should be synchronous, then remove the `async*` modifier:
+
+{% prettify dart tag=pre+code %}
+int f() => 0;
+{% endprettify %}
+
 ### illegal_async_return_type
 
 _Functions marked 'async' must have a return type assignable to 'Future'._
@@ -3130,9 +3600,44 @@
 If the function should be synchronous, then remove the `async` modifier:
 
 {% prettify dart tag=pre+code %}
-int f() {
-  return 0;
-}
+int f() => 0;
+{% endprettify %}
+
+### illegal_sync_generator_return_type
+
+_Functions marked 'sync*' must have a return type that is a supertype of
+'Iterable<T>' for some type 'T'._
+
+#### Description
+
+The analyzer produces this diagnostic when the body of a function has the
+`sync*` modifier even though the return type of the function isn't either
+`Iterable` or a supertype of `Iterable`.
+
+#### Example
+
+The following code produces this diagnostic because the body of the
+function `f` has the 'sync*' modifier even though the return type `int`
+isn't a supertype of `Iterable`:
+
+{% prettify dart tag=pre+code %}
+[!int!] f() sync* {}
+{% endprettify %}
+
+#### Common fixes
+
+If the function should return an iterable, then change the return type to
+be either `Iterable` or a supertype of `Iterable`:
+
+{% prettify dart tag=pre+code %}
+Iterable<int> f() sync* {}
+{% endprettify %}
+
+If the function should return a single value, then remove the `sync*`
+modifier:
+
+{% prettify dart tag=pre+code %}
+int f() => 0;
 {% endprettify %}
 
 ### implements_non_class
@@ -3197,6 +3702,46 @@
 class B implements A {}
 {% endprettify %}
 
+### implements_super_class
+
+_'{0}' can't be used in both the 'extends' and 'implements' clauses._
+
+#### Description
+
+The analyzer produces this diagnostic when one class is listed in both the
+`extends` and `implements` clauses of another class.
+
+#### Example
+
+The following code produces this diagnostic because the class `A` is used
+in both the `extends` and `implements` clauses for the class `B`:
+
+{% prettify dart tag=pre+code %}
+class A {}
+
+class B extends A implements [!A!] {}
+{% endprettify %}
+
+#### Common fixes
+
+If you want to inherit the implementation from the class, then remove the
+class from the `implements` clause:
+
+{% prettify dart tag=pre+code %}
+class A {}
+
+class B extends A {}
+{% endprettify %}
+
+If you don't want to inherit the implementation from the class, then remove
+the `extends` clause:
+
+{% prettify dart tag=pre+code %}
+class A {}
+
+class B implements A {}
+{% endprettify %}
+
 ### implicit_this_reference_in_initializer
 
 _The instance member '{0}' can't be accessed in an initializer._
@@ -3596,6 +4141,34 @@
 If there's a concrete subclass of the abstract class that can be used, then
 create an instance of the concrete subclass.
 
+### integer_literal_out_of_range
+
+_The integer literal {0} can't be represented in 64 bits._
+
+#### Description
+
+The analyzer produces this diagnostic when an integer literal has a value
+that is too large (positive) or too small (negative) to be represented in a
+64-bit word.
+
+#### Example
+
+The following code produces this diagnostic because the value can't be
+represented in 64 bits:
+
+{% prettify dart tag=pre+code %}
+var x = [!9223372036854775810!];
+{% endprettify %}
+
+#### Common fixes
+
+If you need to represent the current value, then wrap it in an instance of
+the class `BigInt`:
+
+{% prettify dart tag=pre+code %}
+var x = BigInt.parse('9223372036854775810');
+{% endprettify %}
+
 ### invalid_annotation
 
 _Annotation must be either a const variable reference or const constructor
@@ -3886,7 +4459,7 @@
 _The receiver can't be null because of short-circuiting, so the null-aware
 operator '{0}' can't be used._
 
-_The receiver can't be null, so the null-aware operator '{0}' can't be used._
+_The receiver can't be null, so the null-aware operator '{0}' is unnecessary._
 
 #### Description
 
@@ -3925,8 +4498,7 @@
 `isEven` if `s` is `null`. In other words, if `s` is `null`, then neither
 `length` nor `isEven` will be invoked, and if `s` is non-`null`, then
 `length` can't return a `null` value. Either way, `isEven` can't be invoked
-on a `null` value, so the null-aware operator is neither necessary nor
-allowed. See
+on a `null` value, so the null-aware operator is not necessary. See
 [Understanding null safety](/null-safety/understanding-null-safety#smarter-null-aware-methods)
 for more details.
 
@@ -4038,6 +4610,103 @@
 class C {}
 {% endprettify %}
 
+### invalid_super_invocation
+
+_The superclass call must be last in an initializer list: '{0}'._
+
+#### Description
+
+The analyzer produces this diagnostic when the initializer list of a
+constructor contains an invocation of a constructor in the superclass, but
+the invocation isn't the last item in the initializer list.
+
+#### Example
+
+The following code produces this diagnostic because the invocation of the
+superclass' constructor isn't the last item in the initializer list:
+
+{% prettify dart tag=pre+code %}
+class A {
+  A(int x);
+}
+
+class B extends A {
+  B(int x) : [!super!](x), assert(x >= 0);
+}
+{% endprettify %}
+
+#### Common fixes
+
+Move the invocation of the superclass' constructor to the end of the
+initializer list:
+
+{% prettify dart tag=pre+code %}
+class A {
+  A(int x);
+}
+
+class B extends A {
+  B(int x) : assert(x >= 0), super(x);
+}
+{% endprettify %}
+
+### invalid_type_argument_in_const_literal
+
+_Constant list literals can't include a type parameter as a type argument, such
+as '{0}'._
+
+_Constant map literals can't include a type parameter as a type argument, such
+as '{0}'._
+
+_Constant set literals can't include a type parameter as a type argument, such
+as '{0}'._
+
+#### Description
+
+The analyzer produces this diagnostic when a type parameter is used as a
+type argument in a list, map, or set literal that is prefixed by `const`.
+This isn't allowed because the value of the type parameter (the actual type
+that will be used at runtime) can't be known at compile time.
+
+#### Example
+
+The following code produces this diagnostic because the type parameter `T`
+is being used as a type argument when creating a constant list:
+
+{% prettify dart tag=pre+code %}
+List<T> newList<T>() => const <[!T!]>[];
+{% endprettify %}
+
+The following code produces this diagnostic because the type parameter `T`
+is being used as a type argument when creating a constant map:
+
+{% prettify dart tag=pre+code %}
+Map<String, T> newSet<T>() => const <String, [!T!]>{};
+{% endprettify %}
+
+The following code produces this diagnostic because the type parameter `T`
+is being used as a type argument when creating a constant set:
+
+{% prettify dart tag=pre+code %}
+Set<T> newSet<T>() => const <[!T!]>{};
+{% endprettify %}
+
+#### Common fixes
+
+If the type that will be used for the type parameter can be known at
+compile time, then remove the type parameter:
+
+{% prettify dart tag=pre+code %}
+List<int> newList() => const <int>[];
+{% endprettify %}
+
+If the type that will be used for the type parameter can't be known until
+runtime, then remove the keyword `const`:
+
+{% prettify dart tag=pre+code %}
+List<T> newList<T>() => <T>[];
+{% endprettify %}
+
 ### invalid_uri
 
 _Invalid URI syntax: '{0}'._
@@ -4285,6 +4954,69 @@
 var y = f();
 {% endprettify %}
 
+### label_in_outer_scope
+
+_Can't reference label '{0}' declared in an outer method._
+
+#### Description
+
+The analyzer produces this diagnostic when a `break` or `continue`
+statement references a label that is declared in a method or function
+containing the function in which the `break` or `continue` statement
+appears. The `break` and `continue` statements can't be used to transfer
+control outside the function that contains them.
+
+#### Example
+
+The following code produces this diagnostic because the label `loop` is
+declared outside the local function `g`:
+
+{% prettify dart tag=pre+code %}
+void f() {
+  loop:
+  while (true) {
+    void g() {
+      break [!loop!];
+    }
+
+    g();
+  }
+}
+{% endprettify %}
+
+#### Common fixes
+
+Try rewriting the code so that it isn't necessary to transfer control
+outside the local function, possibly by inlining the local function:
+
+{% prettify dart tag=pre+code %}
+void f() {
+  loop:
+  while (true) {
+    break loop;
+  }
+}
+{% endprettify %}
+
+If that isn't possible, then try rewriting the local function so that a
+value returned by the function can be used to determine whether control is
+transferred:
+
+{% prettify dart tag=pre+code %}
+void f() {
+  loop:
+  while (true) {
+    bool g() {
+      return true;
+    }
+
+    if (g()) {
+      break loop;
+    }
+  }
+}
+{% endprettify %}
+
 ### late_final_field_with_const_constructor
 
 _Can't have a late final field in a class with a const constructor._
@@ -4423,6 +5155,32 @@
 List<num> x = [1, 2.5, 3];
 {% endprettify %}
 
+### main_is_not_function
+
+_The declaration named 'main' must be a function._
+
+#### Description
+
+The analyzer produces this diagnostic when a library contains a declaration
+of the name `main` that isn't the declaration of a top-level function.
+
+#### Example
+
+The following code produces this diagnostic because the name `main` is
+being used to declare a top-level variable:
+
+{% prettify dart tag=pre+code %}
+var [!main!] = 3;
+{% endprettify %}
+
+#### Common fixes
+
+Use a different name for the declaration:
+
+{% prettify dart tag=pre+code %}
+var mainIndex = 3;
+{% endprettify %}
+
 ### map_entry_not_in_map
 
 _Map entries can only be used in a map literal._
@@ -5505,9 +6263,6 @@
 _This instance creation must be 'const', because the {0} constructor is marked
 as '@literal'._
 
-_This instance creation must be 'const', because the {0} constructor is marked
-as '@literal'._
-
 #### Description
 
 The analyzer produces this diagnostic when a constructor that has the
@@ -5785,8 +6540,6 @@
 
 _Non-nullable instance field '{0}' must be initialized._
 
-_Non-nullable instance field '{0}' must be initialized._
-
 #### Description
 
 The analyzer produces this diagnostic when a field is declared and has all
@@ -7129,6 +7882,52 @@
 var y = x is int ? 0 : 1;
 {% endprettify %}
 
+### sdk_version_never
+
+_The type 'Never' wasn't supported until version 2.X.0, but this code is
+required to be able to run on earlier versions._
+
+#### Description
+
+The analyzer produces this diagnostic when a reference to the class `Never`
+is found in code that has an SDK constraint whose lower bound is less than
+2.12.0. This class wasn't defined in earlier versions, so this code won't
+be able to run against earlier versions of the SDK.
+
+#### Examples
+
+Here's an example of a pubspec that defines an SDK constraint with a lower
+bound of less than 2.12.0:
+
+```yaml
+environment:
+  sdk: '>=2.5.0 <2.6.0'
+```
+
+In the package that has that pubspec, code like the following produces this
+diagnostic:
+
+{% prettify dart tag=pre+code %}
+[!Never!] n;
+{% endprettify %}
+
+#### Common fixes
+
+If you don't need to support older versions of the SDK, then you can
+increase the SDK constraint to allow the type to be used:
+
+```yaml
+environment:
+  sdk: '>=2.12.0 <2.13.0'
+```
+
+If you need to support older versions of the SDK, then rewrite the code to
+not reference this class:
+
+{% prettify dart tag=pre+code %}
+dynamic x;
+{% endprettify %}
+
 ### sdk_version_set_literal
 
 _Set literals weren't supported until version 2.2, but this code is required to
diff --git a/pkg/analyzer/tool/diagnostics/generate.dart b/pkg/analyzer/tool/diagnostics/generate.dart
index b3401a9..5ed14e0 100644
--- a/pkg/analyzer/tool/diagnostics/generate.dart
+++ b/pkg/analyzer/tool/diagnostics/generate.dart
@@ -102,6 +102,13 @@
   /// Return `true` if this diagnostic has documentation.
   bool get hasDocumentation => documentation != null;
 
+  /// Add the [message] to the list of messages associated with the diagnostic.
+  void addMessage(String message) {
+    if (!messages.contains(message)) {
+      messages.add(message);
+    }
+  }
+
   /// Return the full documentation for this diagnostic.
   void writeOn(StringSink sink) {
     messages.sort();
@@ -170,8 +177,9 @@
     List<String> includedPaths = [];
     for (CodePath codePath in codePaths) {
       includedPaths.add(codePath.documentationPath);
-      if (codePath.declarationPath != null) {
-        includedPaths.add(codePath.declarationPath);
+      var declarationPath = codePath.declarationPath;
+      if (declarationPath != null) {
+        includedPaths.add(declarationPath);
       }
     }
     AnalysisContextCollection collection = AnalysisContextCollection(
@@ -217,7 +225,7 @@
         info = DiagnosticInformation(name, message);
         infoByName[name] = info;
       } else {
-        info.messages.add(message);
+        info.addMessage(message);
       }
       return info;
     }
diff --git a/pkg/analyzer_cli/lib/src/build_mode.dart b/pkg/analyzer_cli/lib/src/build_mode.dart
index df41c5e..3098758 100644
--- a/pkg/analyzer_cli/lib/src/build_mode.dart
+++ b/pkg/analyzer_cli/lib/src/build_mode.dart
@@ -7,7 +7,6 @@
 
 import 'package:analyzer/dart/analysis/context_locator.dart' as api;
 import 'package:analyzer/dart/analysis/declared_variables.dart';
-import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/file_system/file_system.dart';
@@ -179,7 +178,6 @@
 
   PackageBundleAssembler assembler;
 
-  final Map<String, ParsedUnitResult> inputParsedUnitResults = {};
   summary2.LinkedElementFactory elementFactory;
 
   // May be null.
@@ -249,13 +247,6 @@
       assembler = PackageBundleAssembler();
       if (_shouldOutputSummary) {
         await logger.runAsync('Build and write output summary', () async {
-          // Prepare all unlinked units.
-          await logger.runAsync('Prepare unlinked units', () async {
-            for (var src in explicitSources) {
-              await _prepareUnit('${src.uri}');
-            }
-          });
-
           // Build and assemble linked libraries.
           _computeLinkedLibraries2();
 
@@ -298,8 +289,8 @@
     });
   }
 
-  /// Use [elementFactory] filled with input summaries, and link prepared
-  /// [inputParsedUnitResults] to produce linked libraries in [assembler].
+  /// Use [elementFactory] filled with input summaries, and link libraries
+  /// in [explicitSources] to produce linked libraries in [assembler].
   void _computeLinkedLibraries2() {
     logger.run('Link output summary2', () {
       var inputLibraries = <summary2.LinkInputLibrary>[];
@@ -307,7 +298,7 @@
       for (var librarySource in explicitSources) {
         var path = librarySource.fullName;
 
-        var parseResult = inputParsedUnitResults[path];
+        var parseResult = analysisDriver.parseFileSync(path);
         if (parseResult == null) {
           throw ArgumentError('No parsed unit for $path');
         }
@@ -338,7 +329,7 @@
             }
 
             var partPath = partSource.fullName;
-            var partParseResult = inputParsedUnitResults[partPath];
+            var partParseResult = analysisDriver.parseFileSync(partPath);
             if (partParseResult == null) {
               throw ArgumentError('No parsed unit for part $partPath in $path');
             }
@@ -500,22 +491,6 @@
     return Packages.empty;
   }
 
-  /// Ensure that the parsed unit for [absoluteUri] is available.
-  ///
-  /// If the unit is in the input [summaryDataStore], do nothing.
-  Future<void> _prepareUnit(String absoluteUri) async {
-    // Parse the source and serialize its AST.
-    var uri = Uri.parse(absoluteUri);
-    var source = sourceFactory.forUri2(uri);
-    if (!source.exists()) {
-      // TODO(paulberry): we should report a warning/error because DDC
-      // compilations are unlikely to work.
-      return;
-    }
-    var result = await analysisDriver.parseFile(source.fullName);
-    inputParsedUnitResults[result.path] = result;
-  }
-
   /// Print errors for all explicit sources. If [outputPath] is supplied, output
   /// is sent to a new file at that path.
   Future<void> _printErrors({String outputPath}) async {
diff --git a/pkg/analyzer_cli/lib/src/driver.dart b/pkg/analyzer_cli/lib/src/driver.dart
index 3e86667..1115b86 100644
--- a/pkg/analyzer_cli/lib/src/driver.dart
+++ b/pkg/analyzer_cli/lib/src/driver.dart
@@ -8,6 +8,7 @@
 import 'package:analyzer/dart/analysis/context_locator.dart' as api;
 import 'package:analyzer/dart/sdk/build_sdk_summary.dart';
 import 'package:analyzer/error/error.dart';
+import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/file_system/physical_file_system.dart';
 import 'package:analyzer/src/context/builder.dart';
@@ -27,6 +28,8 @@
 import 'package:analyzer/src/generated/java_engine.dart';
 import 'package:analyzer/src/generated/sdk.dart';
 import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/lint/linter.dart';
+import 'package:analyzer/src/lint/pub.dart';
 import 'package:analyzer/src/manifest/manifest_validator.dart';
 import 'package:analyzer/src/pubspec/pubspec_validator.dart';
 import 'package:analyzer/src/source/package_map_resolver.dart';
@@ -284,6 +287,7 @@
             }
           }
         } else if (shortName == AnalysisEngine.PUBSPEC_YAML_FILE) {
+          var errors = <AnalysisError>[];
           try {
             var file = resourceProvider.getFile(path);
             var content = file.readAsStringSync();
@@ -291,17 +295,46 @@
             if (node is YamlMap) {
               var validator =
                   PubspecValidator(resourceProvider, file.createSource());
-              var lineInfo = LineInfo.fromContent(content);
-              var errors = validator.validate(node.nodes);
-              formatter.formatErrors([
-                ErrorsResultImpl(analysisDriver.currentSession, path, null,
-                    lineInfo, false, errors)
-              ]);
+              errors.addAll(validator.validate(node.nodes));
+            }
+
+            if (analysisDriver != null && analysisDriver.analysisOptions.lint) {
+              var visitors = <LintRule, PubspecVisitor>{};
+              for (var linter in analysisDriver.analysisOptions.lintRules) {
+                if (linter is LintRule) {
+                  var visitor = linter.getPubspecVisitor();
+                  if (visitor != null) {
+                    visitors[linter] = visitor;
+                  }
+                }
+              }
+              if (visitors.isNotEmpty) {
+                var sourceUri = resourceProvider.pathContext.toUri(path);
+                var pubspecAst = Pubspec.parse(content,
+                    sourceUrl: sourceUri, resourceProvider: resourceProvider);
+                var listener = RecordingErrorListener();
+                var reporter = ErrorReporter(listener,
+                    resourceProvider.getFile(path).createSource(sourceUri),
+                    isNonNullableByDefault: false);
+                for (var entry in visitors.entries) {
+                  entry.key.reporter = reporter;
+                  pubspecAst.accept(entry.value);
+                }
+                errors.addAll(listener.errors);
+              }
+            }
+
+            if (errors.isNotEmpty) {
               for (var error in errors) {
                 var severity = determineProcessedSeverity(
                     error, options, analysisDriver.analysisOptions);
                 allResult = allResult.max(severity);
               }
+              var lineInfo = LineInfo.fromContent(content);
+              formatter.formatErrors([
+                ErrorsResultImpl(analysisDriver.currentSession, path, null,
+                    lineInfo, false, errors)
+              ]);
             }
           } catch (exception) {
             // If the file cannot be analyzed, ignore it.
diff --git a/pkg/analyzer_cli/pubspec.yaml b/pkg/analyzer_cli/pubspec.yaml
index 7fb1c29..4a8c027 100644
--- a/pkg/analyzer_cli/pubspec.yaml
+++ b/pkg/analyzer_cli/pubspec.yaml
@@ -6,8 +6,9 @@
 
 environment:
   sdk: "^2.7.0"
+
 dependencies:
-  analyzer: ^0.37.0
+  analyzer: any
   args: '>=0.13.0 <2.0.0'
   bazel_worker: ^0.1.0
   collection: ^1.14.1
@@ -17,8 +18,13 @@
   path: any
   pub_semver: ^1.4.2
   yaml: ^2.1.2
+
 dev_dependencies:
   pedantic: ^1.9.0
   protobuf: ^0.13.0
   test_reflective_loader: ^0.1.8
   test: ^1.0.0
+
+dependency_overrides:
+  analyzer:
+    path: ../analyzer
diff --git a/pkg/analyzer_cli/test/data/linter_project/analysis_options.yaml b/pkg/analyzer_cli/test/data/linter_project/analysis_options.yaml
index 6af57a5..50bbbb0 100644
--- a/pkg/analyzer_cli/test/data/linter_project/analysis_options.yaml
+++ b/pkg/analyzer_cli/test/data/linter_project/analysis_options.yaml
@@ -1,3 +1,4 @@
 linter:
   rules:
     - camel_case_types
+    - sort_pub_dependencies
diff --git a/pkg/analyzer_cli/test/data/linter_project/pubspec.yaml b/pkg/analyzer_cli/test/data/linter_project/pubspec.yaml
new file mode 100644
index 0000000..132fb58
--- /dev/null
+++ b/pkg/analyzer_cli/test/data/linter_project/pubspec.yaml
@@ -0,0 +1,5 @@
+name: linter_project
+
+dependencies:
+  test: any
+  async: any
diff --git a/pkg/analyzer_cli/test/data/options_include_directive_tests_project/lib/test_file.dart b/pkg/analyzer_cli/test/data/options_include_directive_tests_project/lib/test_file.dart
index 05bc617..67f7c2a 100644
--- a/pkg/analyzer_cli/test/data/options_include_directive_tests_project/lib/test_file.dart
+++ b/pkg/analyzer_cli/test/data/options_include_directive_tests_project/lib/test_file.dart
@@ -11,5 +11,6 @@
   } else
     ; // Empty else statement
 
-  // Missing return
+  0 as int; // Unnecessary cast
+  return 0;
 }
diff --git a/pkg/analyzer_cli/test/data/options_include_directive_tests_project/pkg/foo/lib/foo_package_options.yaml b/pkg/analyzer_cli/test/data/options_include_directive_tests_project/pkg/foo/lib/foo_package_options.yaml
index 89c0bf6a..a7d39be 100644
--- a/pkg/analyzer_cli/test/data/options_include_directive_tests_project/pkg/foo/lib/foo_package_options.yaml
+++ b/pkg/analyzer_cli/test/data/options_include_directive_tests_project/pkg/foo/lib/foo_package_options.yaml
@@ -2,8 +2,8 @@
   strong-mode: true
   errors:
     unused_local_variable: ignore
-    missing_return: error
     undefined_function: warning
+    unnecessary_cast: error
   language:
     enableSuperMixins: true
 
diff --git a/pkg/analyzer_cli/test/driver_test.dart b/pkg/analyzer_cli/test/driver_test.dart
index 126856d..33f0529 100644
--- a/pkg/analyzer_cli/test/driver_test.dart
+++ b/pkg/analyzer_cli/test/driver_test.dart
@@ -878,9 +878,10 @@
     /// Lints should be enabled.
     expect(analysisOptions.lint, isTrue);
 
-    /// The analysis options file only specifies 'camel_case_types'.
+    /// The analysis options file specifies 'camel_case_types' and 'sort_pub_dependencies'.
     var lintNames = analysisOptions.lintRules.map((r) => r.name);
-    expect(lintNames, orderedEquals(['camel_case_types']));
+    expect(lintNames,
+        orderedEquals(['camel_case_types', 'sort_pub_dependencies']));
   }
 
   Future<void> test_noLints_lintsDisabled() async {
@@ -898,6 +899,12 @@
     expect(analysisOptions.lintRules, isEmpty);
   }
 
+  Future<void> test_pubspec_lintsInOptions_generatedLints() async {
+    await drive('data/linter_project/pubspec.yaml',
+        options: 'data/linter_project/$optionsFileName');
+    expect(bulletToDash(outSink), contains('lint - Sort pub dependencies'));
+  }
+
   YamlMap _parseOptions(String src) =>
       AnalysisOptionsProvider().getOptionsFromString(src);
 
@@ -1065,8 +1072,7 @@
       options: path.join(testDir, 'analysis_options.yaml'),
     );
     expect(exitCode, 3);
-    expect(outSink.toString(),
-        contains('but doesn\'t end with a return statement'));
+    expect(outSink.toString(), contains('Unnecessary cast.'));
     expect(outSink.toString(), contains('isn\'t defined'));
     expect(outSink.toString(), contains('Avoid empty else statements'));
   }
diff --git a/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart b/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart
index 4b00e14..4c68006 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart
@@ -17,12 +17,12 @@
 import 'package:analyzer_plugin/protocol/protocol_common.dart'
     hide Element, ElementKind;
 import 'package:analyzer_plugin/src/utilities/change_builder/change_builder_core.dart';
+import 'package:analyzer_plugin/src/utilities/charcodes.dart';
 import 'package:analyzer_plugin/src/utilities/string_utilities.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_workspace.dart';
 import 'package:analyzer_plugin/utilities/range_factory.dart';
-import 'package:charcode/ascii.dart';
 import 'package:dart_style/dart_style.dart';
 
 /// A [ChangeBuilder] used to build changes in Dart files.
@@ -427,10 +427,12 @@
 
     // return type
     var returnType = element.returnType;
-    var typeWritten = writeType(returnType,
-        groupName: returnTypeGroupName, methodBeingCopied: element);
-    if (typeWritten) {
-      write(' ');
+    if (!isSetter) {
+      var typeWritten = writeType(returnType,
+          groupName: returnTypeGroupName, methodBeingCopied: element);
+      if (typeWritten) {
+        write(' ');
+      }
     }
     if (isGetter) {
       write(Keyword.GET.lexeme);
@@ -1186,7 +1188,7 @@
     // Typedef(s) are represented as GenericFunctionTypeElement(s).
     if (element is GenericFunctionTypeElement &&
         element.typeParameters.isEmpty &&
-        element.enclosingElement is GenericTypeAliasElement) {
+        element.enclosingElement is FunctionTypeAliasElement) {
       element = element.enclosingElement;
     }
 
diff --git a/pkg/analyzer_plugin/lib/src/utilities/charcodes.dart b/pkg/analyzer_plugin/lib/src/utilities/charcodes.dart
new file mode 100644
index 0000000..e17d2be
--- /dev/null
+++ b/pkg/analyzer_plugin/lib/src/utilities/charcodes.dart
@@ -0,0 +1,24 @@
+// Copyright (c) 2020, 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.
+
+/// Character `A`.
+const int $A = 0x41;
+
+/// Character `a`.
+const int $a = 0x61;
+
+/// Character `d`.
+const int $d = 0x64;
+
+/// Character `i`.
+const int $i = 0x69;
+
+/// Character `s`.
+const int $s = 0x73;
+
+/// Character `Z`.
+const int $Z = 0x5a;
+
+/// Character `z`.
+const int $z = 0x7a;
diff --git a/pkg/analyzer_plugin/lib/src/utilities/string_utilities.dart b/pkg/analyzer_plugin/lib/src/utilities/string_utilities.dart
index 32b6807..9575749 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/string_utilities.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/string_utilities.dart
@@ -2,7 +2,7 @@
 // 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:charcode/ascii.dart';
+import 'package:analyzer_plugin/src/utilities/charcodes.dart';
 
 /// Returns a list of the words from which the given camel case [string] is
 /// composed.
diff --git a/pkg/analyzer_plugin/lib/utilities/navigation/navigation_dart.dart b/pkg/analyzer_plugin/lib/utilities/navigation/navigation_dart.dart
index cd05675..b5f2d6c 100644
--- a/pkg/analyzer_plugin/lib/utilities/navigation/navigation_dart.dart
+++ b/pkg/analyzer_plugin/lib/utilities/navigation/navigation_dart.dart
@@ -7,6 +7,7 @@
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/src/dart/ast/extensions.dart';
 import 'package:analyzer/src/dart/ast/utilities.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart' as protocol;
@@ -297,7 +298,7 @@
   @override
   void visitIndexExpression(IndexExpression node) {
     super.visitIndexExpression(node);
-    var element = node.staticElement;
+    var element = node.writeOrReadElement;
     computer._addRegionForToken(node.leftBracket, element);
     computer._addRegionForToken(node.rightBracket, element);
   }
@@ -350,7 +351,7 @@
     if (node.parent is ConstructorDeclaration) {
       return;
     }
-    var element = node.staticElement;
+    var element = node.writeOrReadElement;
     computer._addRegionForNode(node, element);
   }
 
diff --git a/pkg/analyzer_plugin/pubspec.yaml b/pkg/analyzer_plugin/pubspec.yaml
index 1620c64..f763f70 100644
--- a/pkg/analyzer_plugin/pubspec.yaml
+++ b/pkg/analyzer_plugin/pubspec.yaml
@@ -9,7 +9,6 @@
 
 dependencies:
   analyzer: '>=0.39.12 <0.41.0'
-  charcode: '^1.1.0'
   dart_style: '^1.2.0'
   pub_semver: '^1.3.2'
 
@@ -17,6 +16,7 @@
   analysis_tool:
     path: ../analysis_tool
   html: '>=0.13.1 <0.15.0'
+  meta: '^1.1.8'
   path: '^1.4.1'
   test_reflective_loader: ^0.1.8
   test: ^1.0.0
diff --git a/pkg/analyzer_plugin/test/src/utilities/change_builder/change_builder_dart_test.dart b/pkg/analyzer_plugin/test/src/utilities/change_builder/change_builder_dart_test.dart
index 4a5ae22..6d37cfe 100644
--- a/pkg/analyzer_plugin/test/src/utilities/change_builder/change_builder_dart_test.dart
+++ b/pkg/analyzer_plugin/test/src/utilities/change_builder/change_builder_dart_test.dart
@@ -9,6 +9,7 @@
 import 'package:analyzer/src/dart/element/inheritance_manager3.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/test_utilities/find_node.dart';
+import 'package:analyzer/src/test_utilities/package_config_file_builder.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 import 'package:analyzer_plugin/src/utilities/change_builder/change_builder_dart.dart'
     show DartLinkedEditBuilderImpl;
@@ -20,7 +21,8 @@
 
 void main() {
   defineReflectiveSuite(() {
-    defineReflectiveTests(DartEditBuilderImplTest);
+    defineReflectiveTests(DartEditBuilderImpl_PreNullSafetyTest);
+    defineReflectiveTests(DartEditBuilderImpl_WithNullSafetyTest);
     defineReflectiveTests(DartFileEditBuilderImplTest);
     defineReflectiveTests(DartLinkedEditBuilderImplTest);
     defineReflectiveTests(ImportLibraryTest);
@@ -29,10 +31,96 @@
 }
 
 @reflectiveTest
+class DartEditBuilderImpl_PreNullSafetyTest extends DartEditBuilderImplTest {
+  Future<void> test_writeParameter_covariantAndRequired() async {
+    var path = convertPath('$testPackageRootPath/lib/test.dart');
+    var content = 'class A {}';
+    addSource(path, content);
+
+    var builder = newBuilder();
+    await builder.addDartFileEdit(path, (builder) {
+      builder.addInsertion(content.length - 1, (builder) {
+        builder.writeParameter('a', isCovariant: true, isRequiredNamed: true);
+      });
+    });
+    var edits = getEdits(builder);
+    expect(edits, hasLength(2));
+    expect(edits[0].replacement,
+        equalsIgnoringWhitespace('covariant @required a'));
+    expect(edits[1].replacement,
+        equalsIgnoringWhitespace("import 'package:meta/meta.dart';"));
+  }
+
+  Future<void> test_writeParameter_required_addImport() async {
+    var path = convertPath('$testPackageRootPath/lib/test.dart');
+    var content = 'class A {}';
+    addSource(path, content);
+
+    var builder = newBuilder();
+    await builder.addDartFileEdit(path, (builder) {
+      builder.addInsertion(content.length - 1, (builder) {
+        builder.writeParameter('a', isRequiredNamed: true);
+      });
+    });
+    var edits = getEdits(builder);
+    expect(edits, hasLength(2));
+    expect(edits[0].replacement, equalsIgnoringWhitespace('@required a'));
+    expect(edits[1].replacement,
+        equalsIgnoringWhitespace("import 'package:meta/meta.dart';"));
+  }
+
+  Future<void> test_writeParameter_required_existingImport() async {
+    var path = convertPath('$testPackageRootPath/lib/test.dart');
+    var content = '''
+import 'package:meta/meta.dart';
+
+class A {}
+''';
+    addSource(path, content);
+
+    var builder = newBuilder();
+    await builder.addDartFileEdit(path, (builder) {
+      builder.addInsertion(content.length - 1, (builder) {
+        builder.writeParameter('a', isRequiredNamed: true);
+      });
+    });
+    var edit = getEdit(builder);
+    expect(edit.replacement, equalsIgnoringWhitespace('@required a'));
+  }
+}
+
+@reflectiveTest
+class DartEditBuilderImpl_WithNullSafetyTest extends DartEditBuilderImplTest
+    with WithNullSafetyMixin {
+  Future<void> test_writeParameter_required_keyword() async {
+    var path = convertPath('$testPackageRootPath/lib/test.dart');
+    var content = 'class A {}';
+    addSource(path, content);
+
+    var builder = newBuilder();
+    await builder.addDartFileEdit(path, (builder) {
+      builder.addInsertion(content.length - 1, (builder) {
+        builder.writeParameter('a', isRequiredNamed: true);
+      });
+    });
+    var edit = getEdit(builder);
+    expect(edit.replacement, equalsIgnoringWhitespace('required a'));
+  }
+}
+
 class DartEditBuilderImplTest extends AbstractContextTest
     with DartChangeBuilderMixin {
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder(),
+      meta: true,
+    );
+  }
+
   Future<void> test_writeClassDeclaration_interfaces() async {
-    var path = convertPath('/home/test/lib/test.dart');
+    var path = convertPath('$testPackageRootPath/lib/test.dart');
     addSource(path, 'class A {}');
     DartType typeA = await _getType(path, 'A');
 
@@ -604,7 +692,7 @@
 
 }''';
     addSource(path, content);
-    await driver.getResult(path);
+    await resolveFile(path);
 
     var builder = newBuilder();
     await builder.addDartFileEdit(path, (builder) {
@@ -625,7 +713,7 @@
 
 }''';
     addSource(path, content);
-    await driver.getResult(path);
+    await resolveFile(path);
 
     var builder = newBuilder();
     await builder.addDartFileEdit(path, (builder) {
@@ -651,7 +739,7 @@
 
 }''';
     addSource(path, content);
-    await driver.getResult(path);
+    await resolveFile(path);
 
     var builder = newBuilder();
     await builder.addDartFileEdit(path, (builder) {
@@ -671,7 +759,7 @@
 
 }''';
     addSource(path, content);
-    await driver.getResult(path);
+    await resolveFile(path);
 
     var builder = newBuilder();
     await builder.addDartFileEdit(path, (builder) {
@@ -691,7 +779,7 @@
 }
 class MyClass {}''';
     addSource(path, content);
-    var unit = (await driver.getResult(path))?.unit;
+    var unit = (await resolveFile(path))?.unit;
 
     var A = unit.declarations[1] as ClassDeclaration;
 
@@ -722,7 +810,7 @@
 }
 class MyClass {}''';
     addSource(path, content);
-    var unit = (await driver.getResult(path))?.unit;
+    var unit = (await resolveFile(path))?.unit;
 
     var A = unit.declarations[1] as ClassDeclaration;
 
@@ -758,7 +846,7 @@
 }
 class MyClass {}''';
     addSource(path, content);
-    var unit = (await driver.getResult(path))?.unit;
+    var unit = (await resolveFile(path))?.unit;
 
     var A = unit.declarations[1] as ClassDeclaration;
 
@@ -902,79 +990,6 @@
     expect(edit.replacement, equalsIgnoringWhitespace('covariant a'));
   }
 
-  Future<void> test_writeParameter_covariantAndRequired() async {
-    var path = convertPath('/home/test/lib/test.dart');
-    var content = 'class A {}';
-    addSource(path, content);
-
-    var builder = newBuilder();
-    await builder.addDartFileEdit(path, (builder) {
-      builder.addInsertion(content.length - 1, (builder) {
-        builder.writeParameter('a', isCovariant: true, isRequiredNamed: true);
-      });
-    });
-    var edits = getEdits(builder);
-    expect(edits, hasLength(2));
-    expect(edits[0].replacement,
-        equalsIgnoringWhitespace('covariant @required a'));
-    expect(edits[1].replacement,
-        equalsIgnoringWhitespace("import 'package:meta/meta.dart';"));
-  }
-
-  Future<void> test_writeParameter_required_addImport() async {
-    var path = convertPath('/home/test/lib/test.dart');
-    var content = 'class A {}';
-    addSource(path, content);
-
-    var builder = newBuilder();
-    await builder.addDartFileEdit(path, (builder) {
-      builder.addInsertion(content.length - 1, (builder) {
-        builder.writeParameter('a', isRequiredNamed: true);
-      });
-    });
-    var edits = getEdits(builder);
-    expect(edits, hasLength(2));
-    expect(edits[0].replacement, equalsIgnoringWhitespace('@required a'));
-    expect(edits[1].replacement,
-        equalsIgnoringWhitespace("import 'package:meta/meta.dart';"));
-  }
-
-  Future<void> test_writeParameter_required_existingImport() async {
-    addMetaPackage();
-    var path = convertPath('/home/test/lib/test.dart');
-    var content = '''
-import 'package:meta/meta.dart';
-
-class A {}
-''';
-    addSource(path, content);
-
-    var builder = newBuilder();
-    await builder.addDartFileEdit(path, (builder) {
-      builder.addInsertion(content.length - 1, (builder) {
-        builder.writeParameter('a', isRequiredNamed: true);
-      });
-    });
-    var edit = getEdit(builder);
-    expect(edit.replacement, equalsIgnoringWhitespace('@required a'));
-  }
-
-  Future<void> test_writeParameter_required_keyword() async {
-    createAnalysisOptionsFile(experiments: ['non-nullable']);
-    var path = convertPath('/home/test/lib/test.dart');
-    var content = 'class A {}';
-    addSource(path, content);
-
-    var builder = newBuilder();
-    await builder.addDartFileEdit(path, (builder) {
-      builder.addInsertion(content.length - 1, (builder) {
-        builder.writeParameter('a', isRequiredNamed: true);
-      });
-    });
-    var edit = getEdit(builder);
-    expect(edit.replacement, equalsIgnoringWhitespace('required a'));
-  }
-
   Future<void> test_writeParameter_type() async {
     var path = convertPath('/home/test/lib/test.dart');
     var content = 'class A {}';
@@ -1001,7 +1016,7 @@
 class A {}
 ''';
     addSource(path, content);
-    var unit = (await driver.getResult(path))?.unit;
+    var unit = (await resolveFile(path))?.unit;
     var g = unit.declarations[1] as FunctionDeclaration;
     var body = g.functionExpression.body as BlockFunctionBody;
     var statement = body.block.statements[0] as ExpressionStatement;
@@ -1023,7 +1038,7 @@
     var content = 'f(int a, {bool b = false, String c}) {}';
     addSource(path, content);
 
-    var unit = (await driver.getResult(path))?.unit;
+    var unit = (await resolveFile(path))?.unit;
     var f = unit.declarations[0] as FunctionDeclaration;
     var parameters = f.functionExpression.parameters;
     var elements = parameters.parameters.map((p) => p.declaredElement);
@@ -1043,7 +1058,7 @@
     var path = convertPath('/home/test/lib/test.dart');
     var content = 'f(int a, [bool b = false, String c]) {}';
     addSource(path, content);
-    var unit = (await driver.getResult(path))?.unit;
+    var unit = (await resolveFile(path))?.unit;
     var f = unit.declarations[0] as FunctionDeclaration;
     var parameters = f.functionExpression.parameters;
     var elements = parameters.parameters.map((p) => p.declaredElement);
@@ -1063,7 +1078,7 @@
     var path = convertPath('/home/test/lib/test.dart');
     var content = 'f(int i, String s) {}';
     addSource(path, content);
-    var unit = (await driver.getResult(path))?.unit;
+    var unit = (await resolveFile(path))?.unit;
     var f = unit.declarations[0] as FunctionDeclaration;
     var parameters = f.functionExpression.parameters;
     var elements = parameters.parameters.map((p) => p.declaredElement);
@@ -1085,7 +1100,7 @@
   g(s, index: i);
 }''';
     addSource(path, content);
-    var unit = (await driver.getResult(path))?.unit;
+    var unit = (await resolveFile(path))?.unit;
     var f = unit.declarations[0] as FunctionDeclaration;
     var body = f.functionExpression.body as BlockFunctionBody;
     var statement = body.block.statements[0] as ExpressionStatement;
@@ -1108,7 +1123,7 @@
   g(s, i);
 }''';
     addSource(path, content);
-    var unit = (await driver.getResult(path))?.unit;
+    var unit = (await resolveFile(path))?.unit;
     var f = unit.declarations[0] as FunctionDeclaration;
     var body = f.functionExpression.body as BlockFunctionBody;
     var statement = body.block.statements[0] as ExpressionStatement;
@@ -1125,14 +1140,14 @@
   }
 
   Future<void> test_writeReference_method() async {
-    var aPath = convertPath('/a.dart');
+    var aPath = convertPath('$testPackageRootPath/a.dart');
     addSource(aPath, r'''
 class A {
   void foo() {}
 }
 ''');
 
-    var path = convertPath('/home/test/lib/test.dart');
+    var path = convertPath('$testPackageRootPath/lib/test.dart');
     var content = r'''
 import 'a.dart';
 ''';
@@ -1152,10 +1167,10 @@
   }
 
   Future<void> test_writeReference_topLevel_hasImport_noPrefix() async {
-    var aPath = convertPath('/home/test/lib/a.dart');
+    var aPath = convertPath('$testPackageRootPath/lib/a.dart');
     addSource(aPath, 'const a = 42;');
 
-    var path = convertPath('/home/test/lib/test.dart');
+    var path = convertPath('$testPackageRootPath/lib/test.dart');
     var content = r'''
 import 'a.dart';
 ''';
@@ -1301,7 +1316,7 @@
     var path = convertPath('/home/test/lib/test.dart');
     var content = 'class A {}';
     addSource(path, content);
-    var unit = (await driver.getResult(path))?.unit;
+    var unit = (await resolveFile(path))?.unit;
 
     var builder = newBuilder();
     await builder.addDartFileEdit(path, (builder) {
@@ -1514,7 +1529,7 @@
     var path = convertPath('/home/test/lib/test.dart');
     var content = 'class A {}';
     addSource(path, content);
-    var unit = (await driver.getResult(path))?.unit;
+    var unit = (await resolveFile(path))?.unit;
 
     var builder = newBuilder();
     await builder.addDartFileEdit(path, (builder) {
@@ -1665,14 +1680,14 @@
   }
 
   Future<ClassElement> _getClassElement(String path, String name) async {
-    var result = await driver.getUnitElement(path);
-    return result.element.getType(name);
+    var result = (await resolveFile(path))?.unit;
+    return result.declaredElement.getType(name);
   }
 
   Future<PropertyAccessorElement> _getTopLevelAccessorElement(
       String path, String name) async {
-    var result = await driver.getUnitElement(path);
-    return result.element.accessors.firstWhere((v) => v.name == name);
+    var result = (await resolveFile(path))?.unit;
+    return result.declaredElement.accessors.firstWhere((v) => v.name == name);
   }
 
   Future<InterfaceType> _getType(
@@ -1695,7 +1710,7 @@
     var path = convertPath('/home/test/lib/test.dart');
     addSource(path, '''var f = () {}''');
 
-    var resolvedUnit = await driver.getResult(path);
+    var resolvedUnit = await resolveFile(path);
     var findNode = FindNode(resolvedUnit.content, resolvedUnit.unit);
     var body = findNode.functionBody('{}');
 
@@ -1712,7 +1727,7 @@
     var path = convertPath('/home/test/lib/test.dart');
     addSource(path, 'String f() {}');
 
-    var resolvedUnit = await driver.getResult(path);
+    var resolvedUnit = await resolveFile(path);
     var findNode = FindNode(resolvedUnit.content, resolvedUnit.unit);
     var body = findNode.functionBody('{}');
 
@@ -1825,7 +1840,7 @@
     var path = convertPath('/home/test/lib/test.dart');
     addSource(path, 'String f() {}');
 
-    var resolvedUnit = await driver.getResult(path);
+    var resolvedUnit = await resolveFile(path);
     var findNode = FindNode(resolvedUnit.content, resolvedUnit.unit);
     var type = findNode.typeAnnotation('String');
 
@@ -1848,7 +1863,7 @@
 class B extends A {}
 class C extends B {}
 ''');
-    var unit = (await driver.getResult(path))?.unit;
+    var unit = (await resolveFile(path))?.unit;
     var classC = unit.declarations[2] as ClassDeclaration;
     var builder = DartLinkedEditBuilderImpl(null);
     builder.addSuperTypesAsSuggestions(
@@ -2815,12 +2830,12 @@
       nameToOverride: 'value=',
       expected: '''
   @override
-  void set value(int value) {
+  set value(int value) {
     // TODO: implement value
   }
 ''',
       displayText: 'value(int value) { … }',
-      selection: SourceRange(133, 0),
+      selection: SourceRange(128, 0),
     );
   }
 
@@ -2837,13 +2852,13 @@
       invokeSuper: true,
       expected: '''
   @override
-  void set value(int value) {
+  set value(int value) {
     // TODO: implement value
     super.value = value;
   }
 ''',
       displayText: 'value(int value) { … }',
-      selection: SourceRange(131, 20),
+      selection: SourceRange(126, 20),
     );
   }
 
@@ -2869,12 +2884,12 @@
 
     ClassElement targetElement;
     {
-      var unitResult = await driver.getUnitElement(path);
+      var unitResult = (await resolveFile(path))?.unit;
       if (targetMixinName != null) {
-        targetElement = unitResult.element.mixins
+        targetElement = unitResult.declaredElement.mixins
             .firstWhere((e) => e.name == targetMixinName);
       } else {
-        targetElement = unitResult.element.types
+        targetElement = unitResult.declaredElement.types
             .firstWhere((e) => e.name == targetClassName);
       }
     }
diff --git a/pkg/analyzer_plugin/test/src/utilities/completion/completion_target_test.dart b/pkg/analyzer_plugin/test/src/utilities/completion/completion_target_test.dart
index 8b94108..6970a80 100644
--- a/pkg/analyzer_plugin/test/src/utilities/completion/completion_target_test.dart
+++ b/pkg/analyzer_plugin/test/src/utilities/completion/completion_target_test.dart
@@ -676,9 +676,9 @@
 
   Future<void> test_MapLiteral_expression() async {
     super.setUp();
-    final experimentStatus =
-        (driver.analysisOptions as analyzer.AnalysisOptionsImpl)
-            .experimentStatus;
+    final experimentStatus = (driverFor(testPackageRootPath).analysisOptions
+            as analyzer.AnalysisOptionsImpl)
+        .experimentStatus;
     if (experimentStatus.control_flow_collections ||
         experimentStatus.spread_collections) {
       // SimpleIdentifier  MapLiteral  VariableDeclaration
@@ -974,7 +974,7 @@
     var path = convertPath('/home/test/lib/test.dart');
     newFile(path, content: content);
 
-    var result = await driver.getResult(path);
+    var result = await resolveFile(path);
     findElement = FindElement(result.unit);
 
     target = CompletionTarget.forOffset(result.unit, offset);
diff --git a/pkg/analyzer_plugin/test/src/utilities/completion/optype_test.dart b/pkg/analyzer_plugin/test/src/utilities/completion/optype_test.dart
index 7fc0527..4703fda 100644
--- a/pkg/analyzer_plugin/test/src/utilities/completion/optype_test.dart
+++ b/pkg/analyzer_plugin/test/src/utilities/completion/optype_test.dart
@@ -48,7 +48,7 @@
     //
     // Compute the OpType.
     //
-    var resolvedUnit = await driver.getResult(testPath);
+    var resolvedUnit = await resolveFile(testPath);
     var completionTarget =
         CompletionTarget.forOffset(resolvedUnit.unit, completionOffset);
     var opType = OpType.forCompletion(completionTarget, completionOffset);
@@ -102,7 +102,7 @@
   @override
   void setUp() {
     super.setUp();
-    testPath = convertPath('/completionTest.dart');
+    testPath = convertPath('$testPackageRootPath/completionTest.dart');
   }
 }
 
diff --git a/pkg/analyzer_plugin/test/support/abstract_context.dart b/pkg/analyzer_plugin/test/support/abstract_context.dart
index 4421f8c..e2e289b 100644
--- a/pkg/analyzer_plugin/test/support/abstract_context.dart
+++ b/pkg/analyzer_plugin/test/support/abstract_context.dart
@@ -2,19 +2,27 @@
 // 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:analyzer/dart/analysis/analysis_context.dart';
+import 'package:analyzer/dart/analysis/analysis_context_collection.dart';
+import 'package:analyzer/dart/analysis/features.dart';
+import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/analysis/session.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/visitor.dart';
-import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/dart/analysis/analysis_context_collection.dart';
+import 'package:analyzer/src/dart/analysis/byte_store.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/dart/analysis/driver_based_analysis_context.dart';
-import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/dart/analysis/experiments.dart';
+import 'package:analyzer/src/generated/engine.dart' show AnalysisEngine;
 import 'package:analyzer/src/generated/source_io.dart';
 import 'package:analyzer/src/generated/testing/element_search.dart';
+import 'package:analyzer/src/test_utilities/mock_packages.dart';
 import 'package:analyzer/src/test_utilities/mock_sdk.dart';
+import 'package:analyzer/src/test_utilities/package_config_file_builder.dart';
 import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
+import 'package:meta/meta.dart';
 
 /// Finds an [Element] with the given [name].
 Element findChildElement(Element root, String name, [ElementKind kind]) {
@@ -35,49 +43,43 @@
 typedef _ElementVisitorFunction = void Function(Element element);
 
 class AbstractContextTest with ResourceProviderMixin {
-  AnalysisDriver _driver;
+  final ByteStore _byteStore = MemoryByteStore();
 
-  /// The file system specific `/home/test/analysis_options.yaml` path.
-  String get analysisOptionsPath =>
-      convertPath('/home/test/analysis_options.yaml');
+  final Map<String, String> _declaredVariables = {};
 
-  AnalysisDriver get driver => _driver;
+  AnalysisContextCollection _analysisContextCollection;
 
-  AnalysisSession get session => driver.currentSession;
+  List<String> get collectionIncludedPaths => [workspaceRootPath];
 
-  /// The file system specific `/home/test/pubspec.yaml` path.
-  String get testPubspecPath => convertPath('/home/test/pubspec.yaml');
+  AnalysisSession get session => contextFor(testPackageRootPath).currentSession;
 
-  void addMetaPackage() {
-    addPackageFile('meta', 'meta.dart', r'''
-library meta;
+  /// The file system-specific `analysis_options.yaml` path.
+  String get testPackageAnalysisOptionsPath =>
+      convertPath('$testPackageRootPath/analysis_options.yaml');
 
-const Required required = const Required();
+  String get testPackageLanguageVersion => '2.9';
 
-class Required {
-  final String reason;
-  const Required([this.reason]);
-}
-''');
-  }
+  /// The file system-specific `pubspec.yaml` path.
+  String get testPackagePubspecPath =>
+      convertPath('$testPackageRootPath/pubspec.yaml');
 
-  /// Add a new file with the given [pathInLib] to the package with the
-  /// given [packageName]. Then ensure that the test package depends on the
-  /// [packageName].
-  File addPackageFile(String packageName, String pathInLib, String content) {
-    var packagePath = '/.pub-cache/$packageName';
-    _addTestPackageDependency(packageName, packagePath);
-    return newFile('$packagePath/lib/$pathInLib', content: content);
-  }
+  String get testPackageRootPath => convertPath('/home/test');
+
+  String get workspaceRootPath => convertPath('/home');
 
   Source addSource(String path, String content, [Uri uri]) {
     var file = newFile(path, content: content);
     var source = file.createSource(uri);
-    driver.addFile(file.path);
-    driver.changeFile(file.path);
     return source;
   }
 
+  AnalysisContext contextFor(String path) {
+    _createAnalysisContexts();
+
+    path = convertPath(path);
+    return _analysisContextCollection.contextFor(path);
+  }
+
   /// Create an analysis options file based on the given arguments.
   void createAnalysisOptionsFile({List<String> experiments}) {
     var buffer = StringBuffer();
@@ -90,11 +92,12 @@
       }
     }
 
-    newFile(analysisOptionsPath, content: buffer.toString());
+    newFile(testPackageAnalysisOptionsPath, content: buffer.toString());
+  }
 
-    if (_driver != null) {
-      _createDriver();
-    }
+  AnalysisDriver driverFor(String path) {
+    var context = contextFor(path) as DriverBasedAnalysisContext;
+    return context.driver;
   }
 
   Element findElementInUnit(CompilationUnit unit, String name,
@@ -104,53 +107,89 @@
         .single;
   }
 
-  Future<CompilationUnit> resolveLibraryUnit(Source source) async {
-    return (await driver.getResult(source.fullName))?.unit;
+  Future<ResolvedUnitResult> resolveFile(String path) async {
+    return contextFor(path).currentSession.getResolvedUnit(path);
   }
 
   void setUp() {
     MockSdk(resourceProvider: resourceProvider);
 
-    newFolder('/home/test');
-    newFile('/home/test/.packages', content: '''
-test:${toUriStr('/home/test/lib')}
-''');
-
-    _createDriver();
+    newFolder(testPackageRootPath);
+    writeTestPackageConfig();
   }
 
   void tearDown() {
     AnalysisEngine.instance.clearCaches();
   }
 
-  void _addTestPackageDependency(String name, String rootPath) {
-    var packagesFile = getFile('/home/test/.packages');
-    var packagesContent = packagesFile.readAsStringSync();
+  void writePackageConfig(String path, PackageConfigFileBuilder config) {
+    newFile(path, content: config.toContent(toUriStr: toUriStr));
+  }
 
-    // Ignore if there is already the same package dependency.
-    if (packagesContent.contains('$name:file://')) {
+  void writeTestPackageConfig({
+    PackageConfigFileBuilder config,
+    String languageVersion,
+    bool meta = false,
+  }) {
+    if (config == null) {
+      config = PackageConfigFileBuilder();
+    } else {
+      config = config.copy();
+    }
+
+    config.add(
+      name: 'test',
+      rootPath: testPackageRootPath,
+      languageVersion: languageVersion ?? testPackageLanguageVersion,
+    );
+
+    if (meta) {
+      var metaPath = '/packages/meta';
+      MockPackages.addMetaPackageFiles(
+        getFolder(metaPath),
+      );
+      config.add(name: 'meta', rootPath: metaPath);
+    }
+
+    var path = '$testPackageRootPath/.dart_tool/package_config.json';
+    writePackageConfig(path, config);
+  }
+
+  /// Create all analysis contexts in [collectionIncludedPaths].
+  void _createAnalysisContexts() {
+    if (_analysisContextCollection != null) {
       return;
     }
 
-    packagesContent += '$name:${toUri('$rootPath/lib')}\n';
-
-    packagesFile.writeAsStringSync(packagesContent);
-
-    _createDriver();
-  }
-
-  void _createDriver() {
-    var collection = AnalysisContextCollectionImpl(
-      includedPaths: [convertPath('/home')],
+    _analysisContextCollection = AnalysisContextCollectionImpl(
+      byteStore: _byteStore,
+      declaredVariables: _declaredVariables,
       enableIndex: true,
+      includedPaths: collectionIncludedPaths.map(convertPath).toList(),
       resourceProvider: resourceProvider,
       sdkPath: convertPath('/sdk'),
     );
+  }
+}
 
-    var testPath = convertPath('/home/test');
-    var context = collection.contextFor(testPath) as DriverBasedAnalysisContext;
+mixin WithNullSafetyMixin on AbstractContextTest {
+  @override
+  String get testPackageLanguageVersion =>
+      Feature.non_nullable.isEnabledByDefault ? '2.12' : '2.11';
 
-    _driver = context.driver;
+  bool get withPackageMeta => false;
+
+  /// TODO(scheglov) https://github.com/dart-lang/sdk/issues/43837
+  /// Remove when Null Safety is enabled by default.
+  @nonVirtual
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(
+      languageVersion: testPackageLanguageVersion,
+      meta: withPackageMeta,
+    );
+    createAnalysisOptionsFile(experiments: [EnableString.non_nullable]);
   }
 }
 
diff --git a/pkg/analyzer_plugin/test/support/abstract_single_unit.dart b/pkg/analyzer_plugin/test/support/abstract_single_unit.dart
index 94560b0..4a8ea64 100644
--- a/pkg/analyzer_plugin/test/support/abstract_single_unit.dart
+++ b/pkg/analyzer_plugin/test/support/abstract_single_unit.dart
@@ -94,7 +94,7 @@
 
   Future<void> resolveTestUnit(String code) async {
     addTestSource(code);
-    var result = await driver.getResult(testFile);
+    var result = await resolveFile(testFile);
     testUnit = (result).unit;
     if (verifyNoTestUnitErrors) {
       expect(result.errors.where((AnalysisError error) {
@@ -114,6 +114,6 @@
   @override
   void setUp() {
     super.setUp();
-    testFile = convertPath('/test.dart');
+    testFile = convertPath('$testPackageRootPath/test.dart');
   }
 }
diff --git a/pkg/analyzer_plugin/test/utilities/analyzer_converter_test.dart b/pkg/analyzer_plugin/test/utilities/analyzer_converter_test.dart
index b22629a..5d75ed1 100644
--- a/pkg/analyzer_plugin/test/utilities/analyzer_converter_test.dart
+++ b/pkg/analyzer_plugin/test/utilities/analyzer_converter_test.dart
@@ -2,21 +2,15 @@
 // 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:analyzer/dart/ast/ast.dart' as analyzer;
 import 'package:analyzer/dart/element/element.dart' as analyzer;
-import 'package:analyzer/dart/element/type.dart' as analyzer;
 import 'package:analyzer/error/error.dart' as analyzer;
-import 'package:analyzer/exception/exception.dart' as analyzer;
 import 'package:analyzer/source/error_processor.dart' as analyzer;
 import 'package:analyzer/src/dart/element/element.dart' as analyzer;
 import 'package:analyzer/src/diagnostic/diagnostic.dart' as analyzer;
 import 'package:analyzer/src/error/codes.dart' as analyzer;
 import 'package:analyzer/src/generated/engine.dart' as analyzer;
 import 'package:analyzer/src/generated/source.dart' as analyzer;
-import 'package:analyzer/src/generated/utilities_dart.dart' as analyzer;
 import 'package:analyzer_plugin/protocol/protocol_common.dart' as plugin;
-import 'package:analyzer_plugin/protocol/protocol_constants.dart' as plugin;
-import 'package:analyzer_plugin/protocol/protocol_generated.dart' as plugin;
 import 'package:analyzer_plugin/utilities/analyzer_converter.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -78,7 +72,7 @@
   void setUp() {
     super.setUp();
     source = newFile('/foo/bar.dart').createSource();
-    testFile = convertPath('/test.dart');
+    testFile = convertPath('$testPackageRootPath/lib/test.dart');
   }
 
   void test_convertAnalysisError_contextMessages() {
@@ -206,11 +200,11 @@
   }
 
   Future<void> test_convertElement_class() async {
-    var source = addSource(testFile, '''
+    addSource(testFile, '''
 @deprecated
 abstract class _A {}
 class B<K, V> {}''');
-    var unit = await resolveLibraryUnit(source);
+    var unit = (await resolveFile(testFile))?.unit;
     {
       var engineElement =
           findElementInUnit(unit, '_A') as analyzer.ClassElement;
@@ -246,11 +240,11 @@
   }
 
   Future<void> test_convertElement_constructor() async {
-    var source = addSource(testFile, '''
+    addSource(testFile, '''
 class A {
   const A.myConstructor(int a, [String b]);
 }''');
-    var unit = await resolveLibraryUnit(source);
+    var unit = (await resolveFile(testFile))?.unit;
     var engineElement =
         findElementInUnit(unit, 'myConstructor') as analyzer.ConstructorElement;
     // create notification Element
@@ -284,11 +278,11 @@
   }
 
   Future<void> test_convertElement_enum() async {
-    var source = addSource(testFile, '''
+    addSource(testFile, '''
 @deprecated
 enum _E1 { one, two }
 enum E2 { three, four }''');
-    var unit = await resolveLibraryUnit(source);
+    var unit = (await resolveFile(testFile))?.unit;
     {
       var engineElement =
           findElementInUnit(unit, '_E1') as analyzer.ClassElement;
@@ -325,11 +319,11 @@
   }
 
   Future<void> test_convertElement_enumConstant() async {
-    var source = addSource(testFile, '''
+    addSource(testFile, '''
 @deprecated
 enum _E1 { one, two }
 enum E2 { three, four }''');
-    var unit = await resolveLibraryUnit(source);
+    var unit = (await resolveFile(testFile))?.unit;
     {
       var engineElement =
           findElementInUnit(unit, 'one') as analyzer.FieldElement;
@@ -416,11 +410,11 @@
   }
 
   Future<void> test_convertElement_field() async {
-    var source = addSource(testFile, '''
+    addSource(testFile, '''
 class A {
   static const myField = 42;
 }''');
-    var unit = await resolveLibraryUnit(source);
+    var unit = (await resolveFile(testFile))?.unit;
     var engineElement =
         findElementInUnit(unit, 'myField') as analyzer.FieldElement;
     // create notification Element
@@ -442,10 +436,10 @@
   }
 
   Future<void> test_convertElement_functionTypeAlias() async {
-    var source = addSource(testFile, '''
+    addSource(testFile, '''
 typedef int F<T>(String x);
 ''');
-    var unit = await resolveLibraryUnit(source);
+    var unit = (await resolveFile(testFile))?.unit;
     var engineElement =
         findElementInUnit(unit, 'F') as analyzer.FunctionTypeAliasElement;
     // create notification Element
@@ -467,10 +461,10 @@
   }
 
   Future<void> test_convertElement_genericTypeAlias_function() async {
-    var source = addSource(testFile, '''
+    addSource(testFile, '''
 typedef F<T> = int Function(String x);
 ''');
-    var unit = await resolveLibraryUnit(source);
+    var unit = (await resolveFile(testFile))?.unit;
     var engineElement =
         findElementInUnit(unit, 'F') as analyzer.FunctionTypeAliasElement;
     // create notification Element
@@ -492,11 +486,11 @@
   }
 
   Future<void> test_convertElement_getter() async {
-    var source = addSource(testFile, '''
+    addSource(testFile, '''
 class A {
   String get myGetter => 42;
 }''');
-    var unit = await resolveLibraryUnit(source);
+    var unit = (await resolveFile(testFile))?.unit;
     var engineElement =
         findElementInUnit(unit, 'myGetter', analyzer.ElementKind.GETTER)
             as analyzer.PropertyAccessorElement;
@@ -518,13 +512,13 @@
   }
 
   Future<void> test_convertElement_method() async {
-    var source = addSource(testFile, '''
+    addSource(testFile, '''
 class A {
   static List<String> myMethod(int a, {String b, int c}) {
     return null;
   }
 }''');
-    var unit = await resolveLibraryUnit(source);
+    var unit = (await resolveFile(testFile))?.unit;
     var engineElement =
         findElementInUnit(unit, 'myMethod') as analyzer.MethodElement;
     // create notification Element
@@ -545,11 +539,11 @@
   }
 
   Future<void> test_convertElement_setter() async {
-    var source = addSource(testFile, '''
+    addSource(testFile, '''
 class A {
   set mySetter(String x) {}
 }''');
-    var unit = await resolveLibraryUnit(source);
+    var unit = (await resolveFile(testFile))?.unit;
     var engineElement =
         findElementInUnit(unit, 'mySetter', analyzer.ElementKind.SETTER)
             as analyzer.PropertyAccessorElement;
@@ -621,14 +615,14 @@
   }
 
   Future<void> test_fromElement_LABEL() async {
-    var source = addSource(testFile, '''
+    addSource(testFile, '''
 main() {
 myLabel:
   while (true) {
     break myLabel;
   }
 }''');
-    var unit = await resolveLibraryUnit(source);
+    var unit = (await resolveFile(testFile))?.unit;
     var engineElement =
         findElementInUnit(unit, 'myLabel') as analyzer.LabelElement;
     // create notification Element
diff --git a/pkg/analyzer_plugin/test/utilities/completion/completion_contributor_util.dart b/pkg/analyzer_plugin/test/utilities/completion/completion_contributor_util.dart
index f780177..b1992c4 100644
--- a/pkg/analyzer_plugin/test/utilities/completion/completion_contributor_util.dart
+++ b/pkg/analyzer_plugin/test/utilities/completion/completion_contributor_util.dart
@@ -409,11 +409,11 @@
   }
 
   Future<void> computeLibrariesContaining() {
-    return driver.getResult(testFile).then((result) => null);
+    return resolveFile(testFile).then((result) => null);
   }
 
   Future computeSuggestions() async {
-    var result = await driver.getResult(testFile);
+    var result = await resolveFile(testFile);
     testSource = result.unit.declaredElement.source;
     request =
         DartCompletionRequestImpl(resourceProvider, completionOffset, result);
diff --git a/pkg/analyzer_plugin/test/utilities/completion/inherited_reference_contributor_test.dart b/pkg/analyzer_plugin/test/utilities/completion/inherited_reference_contributor_test.dart
index 927b5b3..49d103d 100644
--- a/pkg/analyzer_plugin/test/utilities/completion/inherited_reference_contributor_test.dart
+++ b/pkg/analyzer_plugin/test/utilities/completion/inherited_reference_contributor_test.dart
@@ -2,6 +2,7 @@
 // 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:analyzer/src/test_utilities/package_config_file_builder.dart';
 import 'package:analyzer_plugin/utilities/completion/completion_core.dart';
 import 'package:analyzer_plugin/utilities/completion/inherited_reference_contributor.dart';
 import 'package:test/test.dart';
@@ -25,9 +26,17 @@
     return InheritedReferenceContributor();
   }
 
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder(),
+      meta: true,
+    );
+  }
+
   /// Sanity check. Permutations tested in local_ref_contributor.
   Future<void> test_ArgDefaults_inherited_method_with_required_named() async {
-    addMetaPackage();
     resolveSource('/home/test/lib/b.dart', '''
 import 'package:meta/meta.dart';
 
diff --git a/pkg/analyzer_plugin/test/utilities/completion/type_member_contributor_test.dart b/pkg/analyzer_plugin/test/utilities/completion/type_member_contributor_test.dart
index 186ce86..c268c4e 100644
--- a/pkg/analyzer_plugin/test/utilities/completion/type_member_contributor_test.dart
+++ b/pkg/analyzer_plugin/test/utilities/completion/type_member_contributor_test.dart
@@ -2,6 +2,7 @@
 // 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:analyzer/src/test_utilities/package_config_file_builder.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 import 'package:analyzer_plugin/utilities/completion/completion_core.dart';
 import 'package:analyzer_plugin/utilities/completion/relevance.dart';
@@ -53,6 +54,16 @@
     return TypeMemberContributor();
   }
 
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'myBar', rootPath: '$workspaceRootPath/myBar'),
+      meta: true,
+    );
+  }
+
   Future<void> test_ArgDefaults_method() async {
     addTestSource('''
 class A {
@@ -78,7 +89,6 @@
   }
 
   Future<void> test_ArgDefaults_method_with_optional_positional() async {
-    addMetaPackage();
     addTestSource('''
 import 'package:meta/meta.dart';
 
@@ -93,7 +103,6 @@
   }
 
   Future<void> test_ArgDefaults_method_with_required_named() async {
-    addMetaPackage();
     addTestSource('''
 import 'package:meta/meta.dart';
 
@@ -1075,10 +1084,10 @@
   }
 
   Future<void> test_Block_unimported() async {
-    addPackageFile('myBar', 'bar.dart', 'class Foo2 { Foo2() { } }');
+    newFile('$workspaceRootPath/myBar/bar.dart',
+        content: 'class Foo2 { Foo2() { } }');
     addSource(
         '/proj/testAB.dart', 'import "package:myBar/bar.dart"; class Foo { }');
-    testFile = convertPath('/proj/completionTest.dart');
     addTestSource('class C {foo(){F^}}');
     await computeSuggestions();
     expect(replacementOffset, completionOffset - 1);
diff --git a/pkg/async_helper/pubspec.yaml b/pkg/async_helper/pubspec.yaml
index 817b5fe..202f86b 100644
--- a/pkg/async_helper/pubspec.yaml
+++ b/pkg/async_helper/pubspec.yaml
@@ -1,11 +1,17 @@
 name: async_helper
 # This package is not intended for consumption on pub.dev. DO NOT publish.
 publish_to: none
+
 description: >-
  Async_helper is used for asynchronous tests that do not want to
  make use of the Dart unittest library - for example, the core
  language tests.
  Third parties are discouraged from using this, and should use
  the facilities provided in package:test.
+
+environment:
+  sdk: '>=2.0.0'
+
 dependencies:
-  expect: any
+  expect:
+    path: ../expect
diff --git a/pkg/build_integration/pubspec.yaml b/pkg/build_integration/pubspec.yaml
index 7bef2ba..b741a4b 100644
--- a/pkg/build_integration/pubspec.yaml
+++ b/pkg/build_integration/pubspec.yaml
@@ -9,7 +9,11 @@
   sdk: '>=2.1.0 <3.0.0'
 
 dependencies:
-  front_end: ^0.1.0
+  front_end: any
 
 dev_dependencies:
   test: any
+
+dependency_overrides:
+  front_end:
+    path: ../front_end
diff --git a/pkg/compiler/lib/src/commandline_options.dart b/pkg/compiler/lib/src/commandline_options.dart
index 1c52968..b042613 100644
--- a/pkg/compiler/lib/src/commandline_options.dart
+++ b/pkg/compiler/lib/src/commandline_options.dart
@@ -23,7 +23,6 @@
   static const String enableCheckedMode = '--enable-checked-mode';
   static const String enableAsserts = '--enable-asserts';
   static const String enableNullAssertions = '--null-assertions';
-  static const String enableNativeNullAssertions = '--native-null-assertions';
   static const String enableDiagnosticColors = '--enable-diagnostic-colors';
   static const String experimentalTrackAllocations =
       '--experimental-track-allocations';
@@ -76,6 +75,10 @@
       '--no-frequency-based-minification';
   // Disables minification even if enabled by other options, e.g. '-O2'.
   static const String noMinify = '--no-minify';
+
+  static const String nativeNullAssertions = '--native-null-assertions';
+  static const String noNativeNullAssertions = '--no-native-null-assertions';
+
   static const String noSourceMaps = '--no-source-maps';
   static const String preserveUris = '--preserve-uris';
   static const String printLegacyStars = '--debug-print-legacy-stars';
diff --git a/pkg/compiler/lib/src/dart2js.dart b/pkg/compiler/lib/src/dart2js.dart
index 3bd43ed..7142b49 100644
--- a/pkg/compiler/lib/src/dart2js.dart
+++ b/pkg/compiler/lib/src/dart2js.dart
@@ -444,7 +444,8 @@
         (_) => setCheckedMode(Flags.enableCheckedMode)),
     new OptionHandler(Flags.enableAsserts, passThrough),
     new OptionHandler(Flags.enableNullAssertions, passThrough),
-    new OptionHandler(Flags.enableNativeNullAssertions, passThrough),
+    new OptionHandler(Flags.nativeNullAssertions, passThrough),
+    new OptionHandler(Flags.noNativeNullAssertions, passThrough),
     new OptionHandler(Flags.trustTypeAnnotations, setTrustTypeAnnotations),
     new OptionHandler(Flags.trustPrimitives, passThrough),
     new OptionHandler(Flags.trustJSInteropTypeAnnotations, ignoreOption),
diff --git a/pkg/compiler/lib/src/diagnostics/messages.dart b/pkg/compiler/lib/src/diagnostics/messages.dart
index 0271281..a0be968 100644
--- a/pkg/compiler/lib/src/diagnostics/messages.dart
+++ b/pkg/compiler/lib/src/diagnostics/messages.dart
@@ -73,10 +73,8 @@
   INVALID_PACKAGE_CONFIG,
   INVALID_PACKAGE_URI,
   INVALID_STRING_FROM_ENVIRONMENT_DEFAULT_VALUE_TYPE,
-  JS_INTEROP_CLASS_CANNOT_EXTEND_DART_CLASS,
   JS_INTEROP_FIELD_NOT_SUPPORTED,
   JS_INTEROP_NON_EXTERNAL_MEMBER,
-  JS_INTEROP_METHOD_WITH_NAMED_ARGUMENTS,
   JS_OBJECT_LITERAL_CONSTRUCTOR_WITH_POSITIONAL_ARGUMENTS,
   JS_PLACEHOLDER_CAPTURE,
   LIBRARY_NOT_FOUND,
@@ -174,27 +172,6 @@
           MessageKind.STRING_EXPECTED,
           "Expected a 'String', but got an instance of '#{type}'."),
 
-      MessageKind.JS_INTEROP_CLASS_CANNOT_EXTEND_DART_CLASS:
-          const MessageTemplate(
-              MessageKind.JS_INTEROP_CLASS_CANNOT_EXTEND_DART_CLASS,
-              "Js-interop class '#{cls}' cannot extend from the non js-interop "
-              "class '#{superclass}'.",
-              howToFix: "Annotate the superclass with @JS.",
-              examples: const [
-            """
-              import 'package:js/js.dart';
-
-              class Foo { }
-
-              @JS()
-              class Bar extends Foo { }
-
-              main() {
-                new Bar();
-              }
-              """
-          ]),
-
       MessageKind.JS_INTEROP_NON_EXTERNAL_MEMBER: const MessageTemplate(
           MessageKind.JS_INTEROP_NON_EXTERNAL_MEMBER,
           "Js-interop members must be 'external'."),
diff --git a/pkg/compiler/lib/src/frontend_strategy.dart b/pkg/compiler/lib/src/frontend_strategy.dart
index 5ae38ec..3ea0ee2 100644
--- a/pkg/compiler/lib/src/frontend_strategy.dart
+++ b/pkg/compiler/lib/src/frontend_strategy.dart
@@ -60,9 +60,6 @@
   void extractNativeAnnotations(LibraryEntity library);
 
   void extractJsInteropAnnotations(LibraryEntity library);
-
-  void processJsInteropAnnotations(
-      NativeBasicData nativeBasicData, NativeDataBuilder nativeDataBuilder);
 }
 
 /// Class that deletes the contents of an [WorldImpact] cache.
diff --git a/pkg/compiler/lib/src/inferrer/builder_kernel.dart b/pkg/compiler/lib/src/inferrer/builder_kernel.dart
index f11b3fb..afc24a3 100644
--- a/pkg/compiler/lib/src/inferrer/builder_kernel.dart
+++ b/pkg/compiler/lib/src/inferrer/builder_kernel.dart
@@ -1275,11 +1275,17 @@
     if (commonElements.isNamedListConstructor('generate', constructor)) {
       // We have something like `List.generate(len, generator)`.
       int length = _findLength(arguments);
-      // TODO(sra): What we really want here is the result of calling the
-      // `generator` parameter with a non-negative integer.
-      TypeInformation elementType = _types.dynamicType;
       TypeInformation baseType =
           _listBaseType(arguments, defaultGrowable: true);
+      TypeInformation closureArgumentInfo = argumentsTypes.positional[1];
+      // If the argument is an immediate closure, the element type is that
+      // returned by the closure.
+      TypeInformation elementType;
+      if (closureArgumentInfo is ClosureTypeInformation) {
+        FunctionEntity closure = closureArgumentInfo.closure;
+        elementType = _types.getInferredTypeOfMember(closure);
+      }
+      elementType ??= _types.dynamicType;
       return _inferrer.concreteTypes.putIfAbsent(
           node,
           () => _types.allocateList(
@@ -1300,7 +1306,13 @@
       // We have something like `List.of(elements)`.
       TypeInformation baseType =
           _listBaseType(arguments, defaultGrowable: true);
-      return baseType;
+      // TODO(sra): Use static type to bound the element type, preferably as a
+      // narrowing of all inputs.
+      TypeInformation elementType = _types.dynamicType;
+      return _inferrer.concreteTypes.putIfAbsent(
+          node,
+          () => _types.allocateList(
+              baseType, node, _analyzedMember, elementType));
     }
     if (_isConstructorOfTypedArraySubclass(constructor)) {
       // We have something like `Uint32List(len)`.
diff --git a/pkg/compiler/lib/src/inferrer/types.dart b/pkg/compiler/lib/src/inferrer/types.dart
index bafd5cc3..66d551c 100644
--- a/pkg/compiler/lib/src/inferrer/types.dart
+++ b/pkg/compiler/lib/src/inferrer/types.dart
@@ -139,7 +139,8 @@
   /// check.
   bool isFixedArrayCheckedForGrowable(ir.TreeNode node);
 
-  /// Returns the type of a list new expression [node].
+  /// Returns the type of a list new expression [node].  Returns `null` if
+  /// [node] does not represent the construction of a new list.
   AbstractValue typeOfNewList(ir.TreeNode node);
 
   /// Returns the type of a list literal [node].
diff --git a/pkg/compiler/lib/src/ir/impact.dart b/pkg/compiler/lib/src/ir/impact.dart
index 0dfcc55..cedc8b2 100644
--- a/pkg/compiler/lib/src/ir/impact.dart
+++ b/pkg/compiler/lib/src/ir/impact.dart
@@ -201,9 +201,10 @@
   @override
   final ir.StaticTypeContext staticTypeContext;
 
-  ImpactBuilderBase(this.staticTypeContext, ir.ClassHierarchy classHierarchy,
-      this.variableScopeModel)
-      : super(staticTypeContext.typeEnvironment, classHierarchy);
+  ImpactBuilderBase(this.staticTypeContext, StaticTypeCacheImpl staticTypeCache,
+      ir.ClassHierarchy classHierarchy, this.variableScopeModel)
+      : super(
+            staticTypeContext.typeEnvironment, classHierarchy, staticTypeCache);
 
   @override
   void handleIntLiteral(ir.IntLiteral node) {
@@ -642,10 +643,15 @@
   @override
   final inferEffectivelyFinalVariableTypes;
 
-  ImpactBuilder(ir.StaticTypeContext staticTypeContext,
-      ir.ClassHierarchy classHierarchy, VariableScopeModel variableScopeModel,
-      {this.useAsserts: false, this.inferEffectivelyFinalVariableTypes: true})
-      : super(staticTypeContext, classHierarchy, variableScopeModel);
+  ImpactBuilder(
+      ir.StaticTypeContext staticTypeContext,
+      StaticTypeCacheImpl staticTypeCache,
+      ir.ClassHierarchy classHierarchy,
+      VariableScopeModel variableScopeModel,
+      {this.useAsserts: false,
+      this.inferEffectivelyFinalVariableTypes: true})
+      : super(staticTypeContext, staticTypeCache, classHierarchy,
+            variableScopeModel);
 
   ImpactBuilderData computeImpact(ir.Member node) {
     if (retainDataForTesting) {
diff --git a/pkg/compiler/lib/src/ir/scope_visitor.dart b/pkg/compiler/lib/src/ir/scope_visitor.dart
index 74ac0b9..7806fae 100644
--- a/pkg/compiler/lib/src/ir/scope_visitor.dart
+++ b/pkg/compiler/lib/src/ir/scope_visitor.dart
@@ -701,6 +701,10 @@
       const EvaluationComplexity.lazy();
 
   @override
+  EvaluationComplexity visitNullType(ir.NullType node) =>
+      const EvaluationComplexity.lazy();
+
+  @override
   EvaluationComplexity visitInvalidType(ir.InvalidType node) =>
       const EvaluationComplexity.lazy();
 
diff --git a/pkg/compiler/lib/src/ir/static_type.dart b/pkg/compiler/lib/src/ir/static_type.dart
index 4472ff8..2b6981c 100644
--- a/pkg/compiler/lib/src/ir/static_type.dart
+++ b/pkg/compiler/lib/src/ir/static_type.dart
@@ -39,6 +39,29 @@
   }
 }
 
+class StaticTypeCacheImpl implements ir.StaticTypeCache {
+  final Map<ir.Expression, ir.DartType> _expressionTypes = {};
+  final Map<ir.ForInStatement, ir.DartType> _forInIteratorTypes = {};
+
+  @override
+  ir.DartType getExpressionType(
+      ir.Expression node, ir.StaticTypeContext context) {
+    return _expressionTypes[node] ??= node.getStaticTypeInternal(context);
+  }
+
+  @override
+  ir.DartType getForInIteratorType(
+      ir.ForInStatement node, ir.StaticTypeContext context) {
+    return _forInIteratorTypes[node] ??= node.getElementTypeInternal(context);
+  }
+
+  @override
+  ir.DartType getForInElementType(
+      ir.ForInStatement node, ir.StaticTypeContext context) {
+    throw UnsupportedError('StaticTypeCacheImpl.getForInElementType');
+  }
+}
+
 /// Visitor that computes and caches the static type of expression while
 /// visiting the full tree at expression level.
 ///
@@ -47,8 +70,7 @@
 /// adds 'handleX' hooks for subclasses to handle individual expressions using
 /// the readily compute static types of subexpressions.
 abstract class StaticTypeVisitor extends StaticTypeBase {
-  final Map<ir.Expression, ir.DartType> _expressionTypeCache = {};
-  Map<ir.ForInStatement, ir.DartType> _forInIteratorTypeCache;
+  final StaticTypeCacheImpl _staticTypeCache;
   Map<ir.Expression, TypeMap> typeMapsForTesting;
   Map<ir.PropertyGet, RuntimeTypeUseData> _pendingRuntimeTypeUseData = {};
 
@@ -57,11 +79,13 @@
   ThisInterfaceType _thisType;
   ir.Library _currentLibrary;
 
-  StaticTypeVisitor(ir.TypeEnvironment typeEnvironment, this.hierarchy)
+  StaticTypeVisitor(
+      ir.TypeEnvironment typeEnvironment, this.hierarchy, this._staticTypeCache)
       : super(typeEnvironment);
 
   StaticTypeCache getStaticTypeCache() {
-    return new StaticTypeCache(_expressionTypeCache, _forInIteratorTypeCache);
+    return new StaticTypeCache(_staticTypeCache._expressionTypes,
+        _staticTypeCache._forInIteratorTypes);
   }
 
   /// If `true`, the effect of executing assert statements is taken into account
@@ -171,7 +195,12 @@
     while (type is ir.TypeParameterType) {
       type = (type as ir.TypeParameterType).parameter.bound;
     }
-    return type is ir.InterfaceType ? type : null;
+    if (type is ir.InterfaceType) {
+      return type;
+    } else if (type is ir.NullType) {
+      return typeEnvironment.coreTypes.deprecatedNullType;
+    }
+    return null;
   }
 
   /// Returns the static type of the expression as an instantiation of
@@ -198,7 +227,7 @@
     while (type is ir.TypeParameterType) {
       type = (type as ir.TypeParameterType).parameter.bound;
     }
-    if (type == typeEnvironment.nullType) {
+    if (type is ir.NullType) {
       return typeEnvironment.coreTypes
           .bottomInterfaceType(superclass, currentLibrary.nullable);
     }
@@ -252,7 +281,7 @@
   @override
   ir.DartType visitPropertyGet(ir.PropertyGet node) {
     ir.DartType receiverType = visitNode(node.receiver);
-    ir.DartType resultType = _expressionTypeCache[node] =
+    ir.DartType resultType = _staticTypeCache._expressionTypes[node] =
         _computePropertyGetType(node, receiverType);
     receiverType = _narrowInstanceReceiver(node.interfaceTarget, receiverType);
     handlePropertyGet(node, receiverType, resultType);
@@ -490,7 +519,7 @@
       ir.VariableGet get = new ir.VariableGet(variable)..parent = parent;
       // Visit the newly created variable get.
       handleVariableGet(get, argumentType);
-      _expressionTypeCache[get] = argumentType;
+      _staticTypeCache._expressionTypes[get] = argumentType;
 
       if (checkedParameterType == null) {
         return get;
@@ -672,7 +701,7 @@
             .promote(right.variable, right.variable.type, isTrue: true);
       }
     }
-    _expressionTypeCache[node] = returnType;
+    _staticTypeCache._expressionTypes[node] = returnType;
     handleMethodInvocation(node, receiverType, argumentTypes, returnType);
     return returnType;
   }
@@ -687,13 +716,13 @@
     ir.DartType promotedType = typeMap.typeOf(node, typeEnvironment);
     assert(
         node.promotedType == null ||
-            promotedType == typeEnvironment.nullType ||
+            promotedType is ir.NullType ||
             promotedType is ir.FutureOrType ||
             typeEnvironment.isSubtypeOf(promotedType, node.promotedType,
                 ir.SubtypeCheckMode.ignoringNullabilities),
         "Unexpected promotion of ${node.variable} in ${node.parent}. "
         "Expected ${node.promotedType}, found $promotedType");
-    _expressionTypeCache[node] = promotedType;
+    _staticTypeCache._expressionTypes[node] = promotedType;
     handleVariableGet(node, promotedType);
     return promotedType;
   }
@@ -740,7 +769,7 @@
     ir.DartType returnType = ir.Substitution.fromPairs(
             node.target.function.typeParameters, node.arguments.types)
         .substituteType(node.target.function.returnType);
-    _expressionTypeCache[node] = returnType;
+    _staticTypeCache._expressionTypes[node] = returnType;
     handleStaticInvocation(node, argumentTypes, returnType);
     return returnType;
   }
@@ -756,7 +785,7 @@
             .nonNullableRawType(node.target.enclosingClass))
         : new ExactInterfaceType(node.target.enclosingClass,
             ir.Nullability.nonNullable, node.arguments.types);
-    _expressionTypeCache[node] = resultType;
+    _staticTypeCache._expressionTypes[node] = resultType;
     handleConstructorInvocation(node, argumentTypes, resultType);
     return resultType;
   }
@@ -781,7 +810,7 @@
             .substituteType(node.interfaceTarget.getterType);
       }
     }
-    _expressionTypeCache[node] = resultType;
+    _staticTypeCache._expressionTypes[node] = resultType;
     handleSuperPropertyGet(node, resultType);
     return resultType;
   }
@@ -817,7 +846,7 @@
               node.arguments.types)
           .substituteType(returnType);
     }
-    _expressionTypeCache[node] = returnType;
+    _staticTypeCache._expressionTypes[node] = returnType;
     handleSuperMethodInvocation(node, argumentTypes, returnType);
     return returnType;
   }
@@ -936,7 +965,7 @@
   ir.DartType visitInstantiation(ir.Instantiation node) {
     ir.FunctionType expressionType = visitNode(node.expression);
     ir.DartType resultType = _computeInstantiationType(node, expressionType);
-    _expressionTypeCache[node] = resultType;
+    _staticTypeCache._expressionTypes[node] = resultType;
     handleInstantiation(node, expressionType, resultType);
     return resultType;
   }
@@ -979,10 +1008,10 @@
   ir.DartType visitNullCheck(ir.NullCheck node) {
     ir.DartType operandType = visitNode(node.operand);
     handleNullCheck(node, operandType);
-    ir.DartType resultType = operandType == typeEnvironment.nullType
+    ir.DartType resultType = operandType is ir.NullType
         ? const ir.NeverType(ir.Nullability.nonNullable)
         : operandType.withDeclaredNullability(ir.Nullability.nonNullable);
-    _expressionTypeCache[node] = resultType;
+    _staticTypeCache._expressionTypes[node] = resultType;
     return resultType;
   }
 
@@ -1221,8 +1250,7 @@
             .substituteType(member.getterType);
       }
     }
-    _forInIteratorTypeCache ??= {};
-    _forInIteratorTypeCache[node] = iteratorType;
+    _staticTypeCache._forInIteratorTypes[node] = iteratorType;
     TypeMap beforeLoop = typeMap =
         typeMap.remove(variableScopeModel.getScopeFor(node).assignedVariables);
     visitNode(node.variable);
@@ -1479,13 +1507,13 @@
       for (ir.DartType type in falseTypes) {
         if (typeEnvironment.isSubtypeOf(
             declaredType, type, ir.SubtypeCheckMode.ignoringNullabilities)) {
-          return typeEnvironment.nullType;
+          return const ir.NullType();
         }
       }
     }
     if (trueTypes != null) {
       for (ir.DartType type in trueTypes) {
-        if (type == typeEnvironment.nullType) {
+        if (type is ir.NullType) {
           return type;
         }
         if (typeEnvironment.isSubtypeOf(
@@ -1747,9 +1775,9 @@
       if (candidate == null) {
         candidate = type;
       } else {
-        if (type == typeEnvironment.nullType) {
+        if (type is ir.NullType) {
           // Keep the current candidate.
-        } else if (candidate == typeEnvironment.nullType) {
+        } else if (candidate is ir.NullType) {
           candidate = type;
         } else if (typeEnvironment.isSubtypeOf(
             candidate, type, ir.SubtypeCheckMode.ignoringNullabilities)) {
diff --git a/pkg/compiler/lib/src/ir/static_type_base.dart b/pkg/compiler/lib/src/ir/static_type_base.dart
index a19523e..246ed21 100644
--- a/pkg/compiler/lib/src/ir/static_type_base.dart
+++ b/pkg/compiler/lib/src/ir/static_type_base.dart
@@ -121,7 +121,7 @@
   }
 
   @override
-  ir.DartType visitNullLiteral(ir.NullLiteral node) => typeEnvironment.nullType;
+  ir.DartType visitNullLiteral(ir.NullLiteral node) => const ir.NullType();
 
   @override
   ir.DartType visitIntLiteral(ir.IntLiteral node) =>
diff --git a/pkg/compiler/lib/src/ir/util.dart b/pkg/compiler/lib/src/ir/util.dart
index 15d7550..fc79ee4 100644
--- a/pkg/compiler/lib/src/ir/util.dart
+++ b/pkg/compiler/lib/src/ir/util.dart
@@ -222,6 +222,9 @@
   bool visitNeverType(ir.NeverType node) => false;
 
   @override
+  bool visitNullType(ir.NullType node) => false;
+
+  @override
   bool visitVoidType(ir.VoidType node) => false;
 
   @override
@@ -242,3 +245,29 @@
 /// and function type variables) are considered.
 bool containsFreeVariables(ir.DartType type) =>
     type.accept(const _FreeVariableVisitor());
+
+/// Returns true if [importUri] corresponds to dart:html and related libraries.
+bool _isWebLibrary(Uri importUri) =>
+    importUri.scheme == 'dart' &&
+        (importUri.path == 'html' ||
+            importUri.path == 'svg' ||
+            importUri.path == 'indexed_db' ||
+            importUri.path == 'web_audio' ||
+            importUri.path == 'web_gl' ||
+            importUri.path == 'web_sql' ||
+            importUri.path == 'html_common') ||
+    // Mock web library path for testing.
+    importUri.path
+        .contains('native_null_assertions/web_library_interfaces.dart');
+
+bool nodeIsInWebLibrary(ir.TreeNode node) {
+  if (node == null) return false;
+  if (node is ir.Library) return _isWebLibrary(node.importUri);
+  return nodeIsInWebLibrary(node.parent);
+}
+
+bool memberEntityIsInWebLibrary(MemberEntity entity) {
+  var importUri = entity?.library?.canonicalUri;
+  if (importUri == null) return false;
+  return _isWebLibrary(importUri);
+}
diff --git a/pkg/compiler/lib/src/ir/visitors.dart b/pkg/compiler/lib/src/ir/visitors.dart
index e4a2425..d375fed 100644
--- a/pkg/compiler/lib/src/ir/visitors.dart
+++ b/pkg/compiler/lib/src/ir/visitors.dart
@@ -181,6 +181,11 @@
   DartType visitNeverType(ir.NeverType node) {
     return _convertNullability(_dartTypes.neverType(), node.nullability);
   }
+
+  @override
+  DartType visitNullType(ir.NullType node) {
+    return elementMap.commonElements.nullType;
+  }
 }
 
 class ConstantValuefier extends ir.ComputeOnceConstantVisitor<ConstantValue> {
diff --git a/pkg/compiler/lib/src/js_model/element_map_impl.dart b/pkg/compiler/lib/src/js_model/element_map_impl.dart
index 4c5e0a1..a7ad980 100644
--- a/pkg/compiler/lib/src/js_model/element_map_impl.dart
+++ b/pkg/compiler/lib/src/js_model/element_map_impl.dart
@@ -1182,8 +1182,7 @@
       reportLocatedMessage(reporter, message, context);
     },
         environment: _environment.toMap(),
-        enableTripleShift:
-            options.languageExperiments[ir.ExperimentalFlag.tripleShift],
+        enableTripleShift: options.enableTripleShift,
         evaluationMode: options.useLegacySubtyping
             ? ir.EvaluationMode.weak
             : ir.EvaluationMode.strong);
diff --git a/pkg/compiler/lib/src/js_model/js_strategy.dart b/pkg/compiler/lib/src/js_model/js_strategy.dart
index 42ced5b..bb9ed2b 100644
--- a/pkg/compiler/lib/src/js_model/js_strategy.dart
+++ b/pkg/compiler/lib/src/js_model/js_strategy.dart
@@ -125,6 +125,7 @@
   Map<MemberEntity, WorldImpact> codegenImpactsForTesting;
 
   String getGeneratedCodeForTesting(MemberEntity element) {
+    if (generatedCode[element] == null) return null;
     return js.prettyPrint(generatedCode[element],
         enableMinification: _compiler.options.enableMinification);
   }
diff --git a/pkg/compiler/lib/src/kernel/dart2js_target.dart b/pkg/compiler/lib/src/kernel/dart2js_target.dart
index c93e774..07cb160 100644
--- a/pkg/compiler/lib/src/kernel/dart2js_target.dart
+++ b/pkg/compiler/lib/src/kernel/dart2js_target.dart
@@ -114,6 +114,7 @@
       ChangedStructureNotifier changedStructureNotifier}) {
     for (var library in libraries) {
       JsInteropChecks(
+              coreTypes,
               diagnosticReporter as DiagnosticReporter<Message, LocatedMessage>)
           .visitLibrary(library);
     }
diff --git a/pkg/compiler/lib/src/kernel/element_map_impl.dart b/pkg/compiler/lib/src/kernel/element_map_impl.dart
index d4fba7c..05e5686 100644
--- a/pkg/compiler/lib/src/kernel/element_map_impl.dart
+++ b/pkg/compiler/lib/src/kernel/element_map_impl.dart
@@ -816,8 +816,7 @@
       reportLocatedMessage(reporter, message, context);
     },
         environment: _environment.toMap(),
-        enableTripleShift:
-            options.languageExperiments[ir.ExperimentalFlag.tripleShift],
+        enableTripleShift: options.enableTripleShift,
         evaluationMode: options.useLegacySubtyping
             ? ir.EvaluationMode.weak
             : ir.EvaluationMode.strong);
@@ -1430,12 +1429,15 @@
           new ir.StaticTypeContext(node, typeEnvironment));
       return converter.convert(impactData);
     } else {
+      StaticTypeCacheImpl staticTypeCache = new StaticTypeCacheImpl();
       KernelImpactBuilder builder = new KernelImpactBuilder(
           this,
           member,
           reporter,
           options,
-          new ir.StaticTypeContext(node, typeEnvironment),
+          new ir.StaticTypeContext(node, typeEnvironment,
+              cache: staticTypeCache),
+          staticTypeCache,
           variableScopeModel,
           annotations,
           _constantValuefier);
diff --git a/pkg/compiler/lib/src/kernel/env.dart b/pkg/compiler/lib/src/kernel/env.dart
index 36f4dad..082be52 100644
--- a/pkg/compiler/lib/src/kernel/env.dart
+++ b/pkg/compiler/lib/src/kernel/env.dart
@@ -436,7 +436,7 @@
               typeSubstitution: getSubstitutionMap(cls.mixedInType));
           // TODO(jensj): Provide a "referenceFrom" if we need to support
           // the incremental compiler.
-          cls.addMember(cloneVisitor.cloneField(field, null));
+          cls.addField(cloneVisitor.cloneField(field, null));
           continue;
         }
         addField(field, includeStatic: false);
@@ -448,7 +448,7 @@
               typeSubstitution: getSubstitutionMap(cls.mixedInType));
           // TODO(jensj): Provide a "referenceFrom" if we need to support
           // the incremental compiler.
-          cls.addMember(cloneVisitor.cloneProcedure(procedure, null));
+          cls.addProcedure(cloneVisitor.cloneProcedure(procedure, null));
           continue;
         }
         addProcedure(procedure,
@@ -486,7 +486,7 @@
       for (var superclassConstructor in cls.superclass.constructors) {
         var forwardingConstructor = _buildForwardingConstructor(
             superclassCloner, superclassConstructor);
-        cls.addMember(forwardingConstructor);
+        cls.addConstructor(forwardingConstructor);
         _constructorMap[forwardingConstructor.name.text] =
             forwardingConstructor;
       }
diff --git a/pkg/compiler/lib/src/kernel/kernel_impact.dart b/pkg/compiler/lib/src/kernel/kernel_impact.dart
index 94d96a6..d167042 100644
--- a/pkg/compiler/lib/src/kernel/kernel_impact.dart
+++ b/pkg/compiler/lib/src/kernel/kernel_impact.dart
@@ -55,12 +55,14 @@
       this.reporter,
       this._options,
       ir.StaticTypeContext staticTypeContext,
+      StaticTypeCacheImpl staticTypeCache,
       VariableScopeModel variableScopeModel,
       this._annotations,
       this._constantValuefier)
       : this.impactBuilder = new ResolutionWorldImpactBuilder(
             elementMap.commonElements.dartTypes, currentMember),
-        super(staticTypeContext, elementMap.classHierarchy, variableScopeModel);
+        super(staticTypeContext, staticTypeCache, elementMap.classHierarchy,
+            variableScopeModel);
 
   @override
   CommonElements get commonElements => elementMap.commonElements;
@@ -139,6 +141,12 @@
     if (receiverType is ir.InterfaceType) {
       return new StrongModeConstraint(commonElements, _nativeBasicData,
           elementMap.getClass(receiverType.classNode), relation);
+    } else if (receiverType is ir.NullType) {
+      return new StrongModeConstraint(
+          commonElements,
+          _nativeBasicData,
+          elementMap.getClass(typeEnvironment.coreTypes.deprecatedNullClass),
+          relation);
     }
     return null;
   }
diff --git a/pkg/compiler/lib/src/kernel/kernel_strategy.dart b/pkg/compiler/lib/src/kernel/kernel_strategy.dart
index b8959e9..eb961d7 100644
--- a/pkg/compiler/lib/src/kernel/kernel_strategy.dart
+++ b/pkg/compiler/lib/src/kernel/kernel_strategy.dart
@@ -25,6 +25,7 @@
 import '../ir/impact.dart';
 import '../ir/modular.dart';
 import '../ir/scope.dart' show ScopeModel;
+import '../ir/static_type.dart';
 import '../js_backend/annotations.dart';
 import '../js_backend/backend_impact.dart';
 import '../js_backend/backend_usage.dart';
@@ -223,12 +224,7 @@
   }
 
   @override
-  void onResolutionEnd() {
-    assert(_annotationProcessor != null,
-        "AnnotationProcessor has not been created.");
-    _annotationProcessor.processJsInteropAnnotations(
-        nativeBasicData, nativeDataBuilder);
-  }
+  void onResolutionEnd() {}
 
   @override
   NativeBasicData get nativeBasicData {
@@ -444,8 +440,11 @@
       // depend on metadata, so these parts of the impact data need to be
       // computed during conversion to [ResolutionImpact].
       impactBuilderData = _compilerTask.measureSubtask('worldImpact', () {
+        StaticTypeCacheImpl staticTypeCache = StaticTypeCacheImpl();
         ImpactBuilder builder = ImpactBuilder(
-            ir.StaticTypeContext(node, _elementMap.typeEnvironment),
+            ir.StaticTypeContext(node, _elementMap.typeEnvironment,
+                cache: staticTypeCache),
+            staticTypeCache,
             _elementMap.classHierarchy,
             scopeModel.variableScopeModel,
             useAsserts: _elementMap.options.enableUserAssertions,
diff --git a/pkg/compiler/lib/src/kernel/loader.dart b/pkg/compiler/lib/src/kernel/loader.dart
index 496d69b..d40a061 100644
--- a/pkg/compiler/lib/src/kernel/loader.dart
+++ b/pkg/compiler/lib/src/kernel/loader.dart
@@ -144,7 +144,7 @@
           ..target = target
           ..librariesSpecificationUri = _options.librariesSpecificationUri
           ..packagesFileUri = _options.packageConfig
-          ..experimentalFlags = _options.languageExperiments
+          ..explicitExperimentalFlags = _options.explicitExperimentalFlags
           ..verbose = verbose
           ..fileSystem = fileSystem
           ..onDiagnostic = onDiagnostic;
@@ -167,7 +167,7 @@
             _options.librariesSpecificationUri,
             dependencies,
             _options.packageConfig,
-            experimentalFlags: _options.languageExperiments,
+            explicitExperimentalFlags: _options.explicitExperimentalFlags,
             nnbdMode: _options.useLegacySubtyping
                 ? fe.NnbdMode.Weak
                 : fe.NnbdMode.Strong);
diff --git a/pkg/compiler/lib/src/kernel/native_basic_data.dart b/pkg/compiler/lib/src/kernel/native_basic_data.dart
index 54e0f83..0b83ce2 100644
--- a/pkg/compiler/lib/src/kernel/native_basic_data.dart
+++ b/pkg/compiler/lib/src/kernel/native_basic_data.dart
@@ -178,38 +178,4 @@
           name: libraryName);
     }
   }
-
-  @override
-  void processJsInteropAnnotations(
-      NativeBasicData nativeBasicData, NativeDataBuilder nativeDataBuilder) {
-    DiagnosticReporter reporter = elementMap.reporter;
-    KElementEnvironment elementEnvironment = elementMap.elementEnvironment;
-    KCommonElements commonElements = elementMap.commonElements;
-
-    for (LibraryEntity library in elementEnvironment.libraries) {
-      // Error checking for class inheritance must happen after the first pass
-      // through all the classes because it is possible to declare a subclass
-      // before a superclass that has not yet had "markJsInteropClass" called on
-      // it.
-      elementEnvironment.forEachClass(library, (ClassEntity cls) {
-        ir.Class classNode = elementMap.getClassNode(cls);
-        String className = annotationData.getJsInteropClassName(classNode);
-        if (className != null) {
-          bool implementsJsJavaScriptObjectClass = false;
-          elementEnvironment.forEachSupertype(cls, (InterfaceType supertype) {
-            if (supertype.element == commonElements.jsJavaScriptObjectClass) {
-              implementsJsJavaScriptObjectClass = true;
-            }
-          });
-          if (!implementsJsJavaScriptObjectClass) {
-            reporter.reportErrorMessage(
-                cls, MessageKind.JS_INTEROP_CLASS_CANNOT_EXTEND_DART_CLASS, {
-              'cls': cls.name,
-              'superclass': elementEnvironment.getSuperClass(cls).name
-            });
-          }
-        }
-      });
-    }
-  }
 }
diff --git a/pkg/compiler/lib/src/options.dart b/pkg/compiler/lib/src/options.dart
index 6d336a5..9157cbf 100644
--- a/pkg/compiler/lib/src/options.dart
+++ b/pkg/compiler/lib/src/options.dart
@@ -105,14 +105,22 @@
   Map<String, String> environment = const <String, String>{};
 
   /// Flags enabling language experiments.
-  Map<fe.ExperimentalFlag, bool> languageExperiments = {};
+  Map<fe.ExperimentalFlag, bool> explicitExperimentalFlags = {};
 
   /// `true` if variance is enabled.
-  bool get enableVariance => languageExperiments[fe.ExperimentalFlag.variance];
+  bool get enableVariance =>
+      fe.isExperimentEnabled(fe.ExperimentalFlag.variance,
+          explicitExperimentalFlags: explicitExperimentalFlags);
 
   /// Whether `--enable-experiment=non-nullable` is provided.
   bool get enableNonNullable =>
-      languageExperiments[fe.ExperimentalFlag.nonNullable];
+      fe.isExperimentEnabled(fe.ExperimentalFlag.nonNullable,
+          explicitExperimentalFlags: explicitExperimentalFlags);
+
+  /// Whether `--enable-experiment=triple-shift` is provided.
+  bool get enableTripleShift =>
+      fe.isExperimentEnabled(fe.ExperimentalFlag.tripleShift,
+          explicitExperimentalFlags: explicitExperimentalFlags);
 
   /// A possibly null state object for kernel compilation.
   fe.InitializedCompilerState kernelInitializedCompilerState;
@@ -232,7 +240,9 @@
 
   /// Whether to generate code asserting that non-nullable return values of
   /// `@Native` methods or `JS()` invocations are checked for being non-null.
-  bool enableNativeNullAssertions = false;
+  /// Emits checks only in sound null-safety.
+  bool nativeNullAssertions = false;
+  bool _noNativeNullAssertions = false;
 
   /// Whether to generate a source-map file together with the output program.
   bool generateSourceMap = true;
@@ -399,7 +409,7 @@
       Uri platformBinaries,
       void Function(String) onError,
       void Function(String) onWarning}) {
-    Map<fe.ExperimentalFlag, bool> languageExperiments =
+    Map<fe.ExperimentalFlag, bool> explicitExperimentalFlags =
         _extractExperiments(options, onError: onError, onWarning: onWarning);
 
     // The null safety experiment can result in requiring different experiments
@@ -423,7 +433,7 @@
       ..suppressHints = _hasOption(options, Flags.suppressHints)
       ..shownPackageWarnings =
           _extractOptionalCsvOption(options, Flags.showPackageWarnings)
-      ..languageExperiments = languageExperiments
+      ..explicitExperimentalFlags = explicitExperimentalFlags
       ..disableInlining = _hasOption(options, Flags.disableInlining)
       ..disableProgramSplit = _hasOption(options, Flags.disableProgramSplit)
       ..disableTypeInference = _hasOption(options, Flags.disableTypeInference)
@@ -446,8 +456,9 @@
           _hasOption(options, Flags.enableAsserts)
       ..enableNullAssertions = _hasOption(options, Flags.enableCheckedMode) ||
           _hasOption(options, Flags.enableNullAssertions)
-      ..enableNativeNullAssertions =
-          _hasOption(options, Flags.enableNativeNullAssertions)
+      ..nativeNullAssertions = _hasOption(options, Flags.nativeNullAssertions)
+      .._noNativeNullAssertions =
+          _hasOption(options, Flags.noNativeNullAssertions)
       ..experimentalTrackAllocations =
           _hasOption(options, Flags.experimentalTrackAllocations)
       ..experimentalAllocationsPath = _extractStringOption(
@@ -507,8 +518,11 @@
       throw new ArgumentError(
           "[librariesSpecificationUri] should be a file: $librariesSpecificationUri");
     }
+    Map<fe.ExperimentalFlag, bool> experimentalFlags =
+        new Map.from(fe.defaultExperimentalFlags);
+    experimentalFlags.addAll(explicitExperimentalFlags);
     if (platformBinaries == null &&
-        equalMaps(languageExperiments, fe.defaultExperimentalFlags)) {
+        equalMaps(experimentalFlags, fe.defaultExperimentalFlags)) {
       throw new ArgumentError("Missing required ${Flags.platformBinaries}");
     }
     if (_legacyJavaScript && _noLegacyJavaScript) {
@@ -523,6 +537,10 @@
       throw ArgumentError("'${Flags.soundNullSafety}' requires the "
           "'non-nullable' experiment to be enabled");
     }
+    if (nativeNullAssertions && _noNativeNullAssertions) {
+      throw ArgumentError("'${Flags.nativeNullAssertions}' incompatible with "
+          "'${Flags.noNativeNullAssertions}'");
+    }
   }
 
   void deriveOptions() {
@@ -534,6 +552,7 @@
     if (benchmarkingExperiment) {
       // Set flags implied by '--benchmarking-x'.
       // TODO(sra): Use this for some NNBD variant.
+      useContentSecurityPolicy = true;
     }
 
     if (_noLegacyJavaScript) legacyJavaScript = false;
@@ -580,6 +599,10 @@
     if (_disableMinification) {
       enableMinification = false;
     }
+
+    if (_noNativeNullAssertions || nullSafetyMode != NullSafetyMode.sound) {
+      nativeNullAssertions = false;
+    }
   }
 
   /// Returns `true` if warnings and hints are shown for all packages.
diff --git a/pkg/compiler/lib/src/serialization/abstract_source.dart b/pkg/compiler/lib/src/serialization/abstract_source.dart
index 26f9bc1..b3ad306 100644
--- a/pkg/compiler/lib/src/serialization/abstract_source.dart
+++ b/pkg/compiler/lib/src/serialization/abstract_source.dart
@@ -276,6 +276,8 @@
         ir.Nullability nullability = readEnum(ir.Nullability.values);
         ir.DartType typeArgument = _readDartTypeNode(functionTypeVariables);
         return new ir.FutureOrType(typeArgument, nullability);
+      case DartTypeNodeKind.nullType:
+        return const ir.NullType();
     }
     throw new UnsupportedError("Unexpected DartTypeKind $kind");
   }
diff --git a/pkg/compiler/lib/src/serialization/helpers.dart b/pkg/compiler/lib/src/serialization/helpers.dart
index b2c6d10..25162f0 100644
--- a/pkg/compiler/lib/src/serialization/helpers.dart
+++ b/pkg/compiler/lib/src/serialization/helpers.dart
@@ -120,6 +120,7 @@
   doesNotComplete,
   neverType,
   futureOrType,
+  nullType,
 }
 
 const String functionTypeNodeTag = 'function-type-node';
@@ -181,6 +182,12 @@
   }
 
   @override
+  void visitNullType(
+      ir.NullType node, List<ir.TypeParameter> functionTypeVariables) {
+    _sink.writeEnum(DartTypeNodeKind.nullType);
+  }
+
+  @override
   void visitInterfaceType(
       ir.InterfaceType node, List<ir.TypeParameter> functionTypeVariables) {
     if (node is ThisInterfaceType) {
diff --git a/pkg/compiler/lib/src/ssa/builder_kernel.dart b/pkg/compiler/lib/src/ssa/builder_kernel.dart
index 842d6e6..fb0b04b 100644
--- a/pkg/compiler/lib/src/ssa/builder_kernel.dart
+++ b/pkg/compiler/lib/src/ssa/builder_kernel.dart
@@ -1545,10 +1545,11 @@
           sourceInformation: null));
       HInstruction value = pop();
       // TODO(johnniwinther): Provide source information.
-      if (options.enableNativeNullAssertions) {
+      if (options.nativeNullAssertions) {
         if (_isNonNullableByDefault(functionNode)) {
           DartType type = _getDartTypeIfValid(functionNode.returnType);
-          if (dartTypes.isNonNullableIfSound(type)) {
+          if (dartTypes.isNonNullableIfSound(type) &&
+              nodeIsInWebLibrary(functionNode)) {
             push(HNullCheck(value, _abstractValueDomain.excludeNull(returnType),
                 sticky: true));
             value = pop();
@@ -3794,6 +3795,9 @@
       AbstractValue typeMask,
       List<HInstruction> arguments,
       SourceInformation sourceInformation) {
+    // Recognize e.g. `bool.fromEnvironment('x')`
+    // TODO(sra): Can we delete this code now that the CFE does constant folding
+    // for us during loading?
     if (function.isExternal && function.isFromEnvironmentConstructor) {
       if (invocation.isConst) {
         // Just like all const constructors (see visitConstructorInvocation).
@@ -3810,151 +3814,217 @@
       return;
     }
 
-    bool isFixedList = false; // Any fixed list, e.g. new List(10),  UInt8List.
+    // Recognize `List()` and `List(n)`.
+    if (_commonElements.isUnnamedListConstructor(function)) {
+      if (invocation.arguments.named.isEmpty) {
+        int argumentCount = invocation.arguments.positional.length;
+        if (argumentCount == 0) {
+          // `List()` takes no arguments, `JSArray.list()` takes a sentinel.
+          assert(arguments.length == 0 || arguments.length == 1,
+              '\narguments: $arguments\n');
+          _handleInvokeLegacyGrowableListFactoryConstructor(
+              invocation, function, typeMask, arguments, sourceInformation);
+          return;
+        }
+        if (argumentCount == 1) {
+          assert(arguments.length == 1);
+          _handleInvokeLegacyFixedListFactoryConstructor(
+              invocation, function, typeMask, arguments, sourceInformation);
+          return;
+        }
+      }
+    }
 
-    // Recognize `new List()` and `new List(n)`.
-    bool isFixedListConstructorCall = false;
-    bool isGrowableListConstructorCall = false;
-    if (_commonElements.isUnnamedListConstructor(function) &&
-        invocation.arguments.named.isEmpty) {
-      int argumentCount = invocation.arguments.positional.length;
-      isFixedListConstructorCall = argumentCount == 1;
-      isGrowableListConstructorCall = argumentCount == 0;
-      isFixedList = isFixedListConstructorCall;
+    // Recognize `JSArray<E>.typed(allocation)`.
+    if (function == _commonElements.jsArrayTypedConstructor) {
+      if (invocation.arguments.named.isEmpty) {
+        if (invocation.arguments.positional.length == 1) {
+          assert(arguments.length == 1);
+          _handleInvokeJSArrayTypedConstructor(
+              invocation, function, typeMask, arguments, sourceInformation);
+          return;
+        }
+      }
     }
 
     InterfaceType instanceType = _elementMap.createInterfaceType(
         invocation.target.enclosingClass, invocation.arguments.types);
 
-    AbstractValue resultType = typeMask;
+    // Factory constructors take type parameters.
+    List<DartType> typeArguments =
+        _getConstructorTypeArguments(function, invocation.arguments);
 
-    bool isJSArrayTypedConstructor =
-        function == _commonElements.jsArrayTypedConstructor;
+    // This could be a List factory constructor that returned a fresh list and
+    // we have a call-site-specific type from type inference.
+    var allocatedListType = globalInferenceResults.typeOfNewList(invocation);
+    AbstractValue resultType = allocatedListType ?? typeMask;
 
-    _inferredTypeOfNewList(ir.StaticInvocation node) {
-      return globalInferenceResults.typeOfNewList(node) ??
-          _abstractValueDomain.dynamicType;
+    // TODO(johnniwinther): Remove this when type arguments are passed to
+    // constructors like calling a generic method.
+    _addTypeArguments(
+        arguments,
+        _getClassTypeArguments(function.enclosingClass, invocation.arguments),
+        sourceInformation);
+    instanceType = localsHandler.substInContext(instanceType);
+    _addImplicitInstantiation(instanceType);
+    _pushStaticInvocation(function, arguments, resultType, typeArguments,
+        sourceInformation: sourceInformation, instanceType: instanceType);
+
+    if (allocatedListType != null) {
+      HInstruction newInstance = stack.last.nonCheck();
+      if (newInstance is HInvokeStatic) {
+        newInstance.setAllocation(true);
+      }
+      // Is the constructor call one from which we can extract the length
+      // argument?
+      bool isFixedList = false;
+
+      if (_abstractValueDomain.isFixedArray(resultType).isDefinitelyTrue) {
+        // These constructors all take a length as the first argument.
+        if (_commonElements.isNamedListConstructor('filled', function) ||
+            _commonElements.isNamedListConstructor('generate', function)) {
+          isFixedList = true;
+        }
+      }
+
+      if (_abstractValueDomain.isTypedArray(resultType).isDefinitelyTrue) {
+        // The unnamed constructors of typed arrays take a length as the first
+        // argument.
+        if (function.name == '') isFixedList = true;
+        // TODO(sra): Can this misfire?
+      }
+
+      if (isFixedList) {
+        if (newInstance is HInvokeStatic || newInstance is HForeignCode) {
+          graph.allocatedFixedLists.add(newInstance);
+        }
+      }
+    }
+  }
+
+  /// Handle the `JSArray<E>.typed` constructor, which returns its argument,
+  /// which must be a JSArray, with the JSArray type Rti information added on a
+  /// property.
+  void _handleInvokeJSArrayTypedConstructor(
+      ir.StaticInvocation invocation,
+      ConstructorEntity function,
+      AbstractValue typeMask,
+      List<HInstruction> arguments,
+      SourceInformation sourceInformation) {
+    // TODO(sra): We rely here on inlining the identity-like factory
+    // constructor. Instead simply select the single argument and add the type.
+
+    // Factory constructors take type parameters.
+    List<DartType> typeArguments =
+        _getConstructorTypeArguments(function, invocation.arguments);
+    // TODO(johnniwinther): Remove this when type arguments are passed to
+    // constructors like calling a generic method.
+    _addTypeArguments(
+        arguments,
+        _getClassTypeArguments(function.enclosingClass, invocation.arguments),
+        sourceInformation);
+    _pushStaticInvocation(function, arguments, typeMask, typeArguments,
+        sourceInformation: sourceInformation);
+
+    InterfaceType type = _elementMap.createInterfaceType(
+        invocation.target.enclosingClass, invocation.arguments.types);
+    stack.add(_setListRuntimeTypeInfoIfNeeded(pop(), type, sourceInformation));
+  }
+
+  /// Handle the legacy `List<T>()` constructor.
+  void _handleInvokeLegacyGrowableListFactoryConstructor(
+      ir.StaticInvocation invocation,
+      ConstructorEntity function,
+      AbstractValue typeMask,
+      List<HInstruction> arguments,
+      SourceInformation sourceInformation) {
+    // `List<T>()` is essentially the same as `<T>[]`.
+    push(_buildLiteralList(<HInstruction>[]));
+    HInstruction allocation = pop();
+    var inferredType = globalInferenceResults.typeOfNewList(invocation);
+    if (inferredType != null) {
+      allocation.instructionType = inferredType;
+    }
+    InterfaceType type = _elementMap.createInterfaceType(
+        invocation.target.enclosingClass, invocation.arguments.types);
+    stack.add(
+        _setListRuntimeTypeInfoIfNeeded(allocation, type, sourceInformation));
+  }
+
+  /// Handle the `JSArray<T>.list(length)` and legacy `List<T>(length)`
+  /// constructors.
+  void _handleInvokeLegacyFixedListFactoryConstructor(
+      ir.StaticInvocation invocation,
+      ConstructorEntity function,
+      AbstractValue typeMask,
+      List<HInstruction> arguments,
+      SourceInformation sourceInformation) {
+    assert(
+        // Arguments may include the type.
+        arguments.length == 1 || arguments.length == 2,
+        failedAt(
+            function,
+            "Unexpected arguments. "
+            "Expected 1-2 argument, actual: $arguments."));
+    HInstruction lengthInput = arguments.first;
+    if (lengthInput.isNumber(_abstractValueDomain).isPotentiallyFalse) {
+      HPrimitiveCheck conversion = new HPrimitiveCheck(
+          _commonElements.numType,
+          HPrimitiveCheck.ARGUMENT_TYPE_CHECK,
+          _abstractValueDomain.numType,
+          lengthInput,
+          sourceInformation);
+      add(conversion);
+      lengthInput = conversion;
+    }
+    js.Template code = js.js.parseForeignJS('new Array(#)');
+    var behavior = new NativeBehavior();
+
+    DartType expectedType = _getStaticType(invocation).type;
+    behavior.typesInstantiated.add(expectedType);
+    behavior.typesReturned.add(expectedType);
+
+    // The allocation can throw only if the given length is a double or
+    // outside the unsigned 32 bit range.
+    // TODO(sra): Array allocation should be an instruction so that canThrow
+    // can depend on a length type discovered in optimization.
+    bool canThrow = true;
+    if (lengthInput.isUInt32(_abstractValueDomain).isDefinitelyTrue) {
+      canThrow = false;
     }
 
-    if (isFixedListConstructorCall) {
-      assert(
-          // Arguments may include the type.
-          arguments.length == 1 || arguments.length == 2,
-          failedAt(
-              function,
-              "Unexpected arguments. "
-              "Expected 1-2 argument, actual: $arguments."));
-      HInstruction lengthInput = arguments.first;
-      if (lengthInput.isNumber(_abstractValueDomain).isPotentiallyFalse) {
-        HPrimitiveCheck conversion = new HPrimitiveCheck(
-            _commonElements.numType,
-            HPrimitiveCheck.ARGUMENT_TYPE_CHECK,
-            _abstractValueDomain.numType,
-            lengthInput,
-            sourceInformation);
-        add(conversion);
-        lengthInput = conversion;
-      }
-      js.Template code = js.js.parseForeignJS('new Array(#)');
-      var behavior = new NativeBehavior();
+    var resultType = globalInferenceResults.typeOfNewList(invocation) ??
+        _abstractValueDomain.fixedListType;
 
-      var expectedType =
-          _elementMap.getDartType(invocation.getStaticType(null));
-      behavior.typesInstantiated.add(expectedType);
-      behavior.typesReturned.add(expectedType);
-
-      // The allocation can throw only if the given length is a double or
-      // outside the unsigned 32 bit range.
-      // TODO(sra): Array allocation should be an instruction so that canThrow
-      // can depend on a length type discovered in optimization.
-      bool canThrow = true;
-      if (lengthInput.isUInt32(_abstractValueDomain).isDefinitelyTrue) {
-        canThrow = false;
-      }
-
-      var inferredType = _inferredTypeOfNewList(invocation);
-      resultType =
-          _abstractValueDomain.containsAll(inferredType).isPotentiallyTrue
-              ? _abstractValueDomain.fixedListType
-              : inferredType;
-      HForeignCode foreign = new HForeignCode(
-          code, resultType, <HInstruction>[lengthInput],
-          nativeBehavior: behavior,
-          throwBehavior:
-              canThrow ? NativeThrowBehavior.MAY : NativeThrowBehavior.NEVER)
-        ..sourceInformation = sourceInformation;
-      push(foreign);
-      // TODO(redemption): Global type analysis tracing may have determined that
-      // the fixed-length property is never checked. If so, we can avoid marking
-      // the array.
-      {
-        js.Template code = js.js.parseForeignJS(r'#.fixed$length = Array');
-        // We set the instruction as [canThrow] to avoid it being dead code.
-        // We need a finer grained side effect.
-        add(new HForeignCode(code, _abstractValueDomain.nullType, [stack.last],
-            throwBehavior: NativeThrowBehavior.MAY));
-      }
-    } else if (isGrowableListConstructorCall) {
-      push(_buildLiteralList(<HInstruction>[]));
-      var inferredType = _inferredTypeOfNewList(invocation);
-      resultType =
-          _abstractValueDomain.containsAll(inferredType).isPotentiallyTrue
-              ? _abstractValueDomain.growableListType
-              : inferredType;
-      stack.last.instructionType = resultType;
-    } else if (isJSArrayTypedConstructor) {
-      // TODO(sra): Instead of calling the identity-like factory constructor,
-      // simply select the single argument.
-
-      // Factory constructors take type parameters.
-      List<DartType> typeArguments =
-          _getConstructorTypeArguments(function, invocation.arguments);
-      // TODO(johnniwinther): Remove this when type arguments are passed to
-      // constructors like calling a generic method.
-      _addTypeArguments(
-          arguments,
-          _getClassTypeArguments(function.enclosingClass, invocation.arguments),
-          sourceInformation);
-      _pushStaticInvocation(function, arguments, typeMask, typeArguments,
-          sourceInformation: sourceInformation);
-    } else {
-      // Factory constructors take type parameters.
-      List<DartType> typeArguments =
-          _getConstructorTypeArguments(function, invocation.arguments);
-      // TODO(johnniwinther): Remove this when type arguments are passed to
-      // constructors like calling a generic method.
-      _addTypeArguments(
-          arguments,
-          _getClassTypeArguments(function.enclosingClass, invocation.arguments),
-          sourceInformation);
-      instanceType = localsHandler.substInContext(instanceType);
-      _addImplicitInstantiation(instanceType);
-      _pushStaticInvocation(function, arguments, typeMask, typeArguments,
-          sourceInformation: sourceInformation, instanceType: instanceType);
-
-      // TODO(sra): Special handling of List.filled, List.generate, List.of and
-      // other list constructors where 'growable' is false.
+    HForeignCode foreign = new HForeignCode(
+        code, resultType, <HInstruction>[lengthInput],
+        nativeBehavior: behavior,
+        throwBehavior:
+            canThrow ? NativeThrowBehavior.MAY : NativeThrowBehavior.NEVER)
+      ..sourceInformation = sourceInformation;
+    push(foreign);
+    // TODO(redemption): Global type analysis tracing may have determined that
+    // the fixed-length property is never checked. If so, we can avoid marking
+    // the array.
+    {
+      js.Template code = js.js.parseForeignJS(r'#.fixed$length = Array');
+      // We set the instruction as [canThrow] to avoid it being dead code.
+      // We need a finer grained side effect.
+      add(new HForeignCode(code, _abstractValueDomain.nullType, [stack.last],
+          throwBehavior: NativeThrowBehavior.MAY));
     }
 
     HInstruction newInstance = stack.last;
 
-    if (isFixedList) {
-      // If we inlined a constructor the call-site-specific type from type
-      // inference (e.g. a container type) will not be on the node. Store the
-      // more specialized type on the allocation.
-      newInstance.instructionType = resultType;
-      graph.allocatedFixedLists.add(newInstance);
-    }
+    // If we inlined a constructor the call-site-specific type from type
+    // inference (e.g. a container type) will not be on the node. Store the
+    // more specialized type on the allocation.
+    newInstance.instructionType = resultType;
+    graph.allocatedFixedLists.add(newInstance);
 
-    if (_rtiNeed.classNeedsTypeArguments(_commonElements.listClass) &&
-        (isFixedListConstructorCall ||
-            isGrowableListConstructorCall ||
-            isJSArrayTypedConstructor)) {
-      InterfaceType type = _elementMap.createInterfaceType(
-          invocation.target.enclosingClass, invocation.arguments.types);
-      stack
-          .add(_setListRuntimeTypeInfoIfNeeded(pop(), type, sourceInformation));
-    }
+    InterfaceType type = _elementMap.createInterfaceType(
+        invocation.target.enclosingClass, invocation.arguments.types);
+    stack.add(_setListRuntimeTypeInfoIfNeeded(pop(), type, sourceInformation));
   }
 
   /// Replace calls to `extractTypeArguments` with equivalent code. Returns
@@ -4732,8 +4802,8 @@
   /// If [invocation] is a `JS()` invocation in a web library and the static
   /// type is non-nullable, add a check to make sure it isn't null.
   void _maybeAddNullCheckOnJS(ir.StaticInvocation invocation) {
-    if (options.enableNativeNullAssertions &&
-        _isInWebLibrary(invocation) &&
+    if (options.nativeNullAssertions &&
+        nodeIsInWebLibrary(invocation) &&
         closedWorld.dartTypes
             .isNonNullableIfSound(_getStaticType(invocation).type)) {
       HInstruction code = pop();
@@ -4743,25 +4813,6 @@
     }
   }
 
-  /// Returns true if [node] belongs to dart:html and related libraries.
-  bool _isInWebLibrary(ir.TreeNode node) {
-    if (node == null) return false;
-    bool isWebLibrary(Uri importUri) =>
-        importUri.scheme == 'dart' &&
-            (importUri.path == 'html' ||
-                importUri.path == 'svg' ||
-                importUri.path == 'indexed_db' ||
-                importUri.path == 'web_audio' ||
-                importUri.path == 'web_gl' ||
-                importUri.path == 'web_sql' ||
-                importUri.path == 'html_common') ||
-        // Mock web library path for testing.
-        importUri.path
-            .contains('native_null_assertions/js_invocations_in_web_library');
-    if (node is ir.Library) return isWebLibrary(node.importUri);
-    return _isInWebLibrary(node.parent);
-  }
-
   void _handleJsStringConcat(ir.StaticInvocation invocation) {
     if (_unexpectedForeignArguments(invocation,
         minPositional: 2, maxPositional: 2)) {
diff --git a/pkg/compiler/lib/src/ssa/optimize.dart b/pkg/compiler/lib/src/ssa/optimize.dart
index 3718f17d..aff9860 100644
--- a/pkg/compiler/lib/src/ssa/optimize.dart
+++ b/pkg/compiler/lib/src/ssa/optimize.dart
@@ -13,6 +13,7 @@
 import '../elements/types.dart';
 import '../inferrer/abstract_value_domain.dart';
 import '../inferrer/types.dart';
+import '../ir/util.dart';
 import '../js_backend/field_analysis.dart'
     show FieldAnalysisData, JFieldAnalysis;
 import '../js_backend/backend.dart' show CodegenInputs;
@@ -925,11 +926,12 @@
 
   HInstruction maybeAddNativeReturnNullCheck(
       HInstruction node, HInstruction replacement, FunctionEntity method) {
-    if (_options.enableNativeNullAssertions) {
+    if (_options.nativeNullAssertions) {
       if (method.library.isNonNullableByDefault) {
         FunctionType type =
             _closedWorld.elementEnvironment.getFunctionType(method);
-        if (_closedWorld.dartTypes.isNonNullableIfSound(type.returnType)) {
+        if (_closedWorld.dartTypes.isNonNullableIfSound(type.returnType) &&
+            memberEntityIsInWebLibrary(method)) {
           node.block.addBefore(node, replacement);
           replacement = HNullCheck(replacement,
               _abstractValueDomain.excludeNull(replacement.instructionType),
@@ -1875,16 +1877,17 @@
     if (environment is HInstanceEnvironment) {
       HInstruction instance = environment.inputs.single;
       AbstractValue instanceAbstractValue = instance.instructionType;
-      ClassEntity instanceClass =
-          _abstractValueDomain.getExactClass(instanceAbstractValue);
-      if (instanceClass == null) {
-        // All the subclasses of JSArray are JSArray at runtime.
-        ClassEntity jsArrayClass = _closedWorld.commonElements.jsArrayClass;
-        if (_abstractValueDomain
-            .isInstanceOf(instanceAbstractValue, jsArrayClass)
-            .isDefinitelyTrue) {
-          instanceClass = jsArrayClass;
-        }
+      ClassEntity instanceClass;
+
+      // All the subclasses of JSArray are JSArray at runtime.
+      ClassEntity jsArrayClass = _closedWorld.commonElements.jsArrayClass;
+      if (_abstractValueDomain
+          .isInstanceOf(instanceAbstractValue, jsArrayClass)
+          .isDefinitelyTrue) {
+        instanceClass = jsArrayClass;
+      } else {
+        instanceClass =
+            _abstractValueDomain.getExactClass(instanceAbstractValue);
       }
       if (instanceClass != null) {
         if (_typeRecipeDomain.isReconstruction(
@@ -2054,6 +2057,232 @@
 
     return node;
   }
+
+  @override
+  HInstruction visitBitAnd(HBitAnd node) {
+    HInstruction left = node.left;
+    HInstruction right = node.right;
+
+    if (left is HConstant) {
+      if (right is HConstant) {
+        return foldBinary(node.operation(), left, right) ?? node;
+      }
+      //  c1 & a  -->  a & c1
+      return HBitAnd(right, left, node.instructionType);
+    }
+
+    if (right is HConstant) {
+      ConstantValue constant = right.constant;
+      if (constant.isZero) return right; // a & 0  -->  0
+      if (_isFull32BitMask(constant)) {
+        if (left.isUInt32(_abstractValueDomain).isDefinitelyTrue) {
+          // Mask of all '1's has no effect.
+          return left;
+          // TODO(sra): A more advanced version of this would be to see if the
+          // input might have any bits that would be cleared by the mask.  Thus
+          // `a >> 24 & 255` is a no-op since `a >> 24` can have only the low 8
+          // bits non-zero. If a bit is must-zero, we can remove it from
+          // mask. e.g. if a is Uint31, then `a >> 24 & 0xF0` becomes `a >> 24 &
+          // 0x70`.
+        }
+
+        // Ensure that the result is still canonicalized to an unsigned 32-bit
+        // integer using `left >>> 0`. This shift is often removed or combined
+        // in subsequent optimization.
+        HConstant zero = _graph.addConstantInt(0, _closedWorld);
+        return HShiftRight(left, zero, node.instructionType);
+      }
+
+      if (left is HBitAnd && left.usedBy.length == 1) {
+        HInstruction operand1 = left.left;
+        HInstruction operand2 = left.right;
+        if (operand2 is HConstant) {
+          //  (a & c1) & c2  -->  a & (c1 & c2)
+          HInstruction folded =
+              foldBinary(constant_system.bitAnd, operand2, right);
+          if (folded == null) return node;
+          return HBitAnd(operand1, folded, node.instructionType);
+        }
+        // TODO(sra): We don't rewrite (a & c1) & b --> (a & b) & c1. I suspect
+        // that the JavaScript VM might benefit from reducing the value early
+        // (e.g. to a 'Smi'). We could do that, but we should also consider a
+        // variation of the above rule where:
+        //
+        //     a & c1 & ... & b & c2  -->  a & (c1 & c2) & ... & b
+        //
+        // This would probably be best deferred until after GVN in case (a & c1)
+        // is reused.
+      }
+    }
+
+    return node;
+  }
+
+  bool _isFull32BitMask(ConstantValue constant) {
+    return constant is IntConstantValue && constant.intValue == _mask32;
+  }
+
+  static final _mask32 = BigInt.parse('FFFFFFFF', radix: 16);
+
+  @override
+  HInstruction visitBitOr(HBitOr node) {
+    HInstruction left = node.left;
+    HInstruction right = node.right;
+
+    if (left is HConstant) {
+      if (right is HConstant) {
+        return foldBinary(node.operation(), left, right) ?? node;
+      }
+      //  c1 | a  -->  a | c1
+      return HBitOr(right, left, node.instructionType);
+    }
+
+    //  (a | b) | c
+    if (left is HBitOr && left.usedBy.length == 1) {
+      HInstruction operand1 = left.left;
+      HInstruction operand2 = left.right;
+      if (operand2 is HConstant) {
+        if (right is HConstant) {
+          //  (a | c1) | c2  -->  a | (c1 | c2)
+          HInstruction folded =
+              foldBinary(constant_system.bitOr, operand2, right);
+          if (folded == null) return node;
+          return HBitOr(operand1, folded, node.instructionType);
+        } else {
+          //  (a | c1) | b  -->  (a | b) | c1
+          HInstruction or1 = _makeBitOr(operand1, right)
+            ..sourceInformation = left.sourceInformation;
+          node.block.addBefore(node, or1);
+          // TODO(sra): Restart simplification at 'or1'.
+          return _makeBitOr(or1, operand2);
+        }
+      }
+    }
+
+    //  (a & c1) | (a & c2)  -->  a & (c1 | c2)
+    if (left is HBitAnd &&
+        left.usedBy.length == 1 &&
+        right is HBitAnd &&
+        right.usedBy.length == 1) {
+      HInstruction a1 = left.left;
+      HInstruction a2 = right.left;
+      if (a1 == a2) {
+        HInstruction c1 = left.right;
+        HInstruction c2 = right.right;
+        if (c1 is HConstant && c2 is HConstant) {
+          HInstruction folded = foldBinary(constant_system.bitOr, c1, c2);
+          if (folded != null) {
+            return HBitAnd(a1, folded, node.instructionType);
+          }
+        }
+      }
+    }
+
+    // TODO(sra):
+    //
+    //  (e | (a & c1)) | (a & c2)  -->  e | (a & (c1 | c2))
+
+    return node;
+  }
+
+  HBitOr _makeBitOr(HInstruction operand1, HInstruction operand2) {
+    AbstractValue instructionType = _abstractValueDomainBitOr(
+        operand1.instructionType, operand2.instructionType);
+    return HBitOr(operand1, operand2, instructionType);
+  }
+
+  // TODO(sra): Use a common definition of primitive operations in the
+  // AbstractValueDomain.
+  AbstractValue _abstractValueDomainBitOr(AbstractValue a, AbstractValue b) {
+    return (_abstractValueDomain.isUInt31(a).isDefinitelyTrue &&
+            _abstractValueDomain.isUInt31(b).isDefinitelyTrue)
+        ? _abstractValueDomain.uint31Type
+        : _abstractValueDomain.uint32Type;
+  }
+
+  @override
+  HInstruction visitShiftRight(HShiftRight node) {
+    HInstruction left = node.left;
+    HInstruction count = node.right;
+    if (count is HConstant) {
+      if (left is HConstant) {
+        return foldBinary(node.operation(), left, count) ?? node;
+      }
+      ConstantValue countValue = count.constant;
+      // Shift by zero can convert to 32 bit unsigned, so remove only if no-op.
+      //  a >> 0  -->  a
+      if (countValue.isZero &&
+          left.isUInt32(_abstractValueDomain).isDefinitelyTrue) {
+        return left;
+      }
+      if (left is HBitAnd && left.usedBy.length == 1) {
+        // TODO(sra): Should this be postponed to after GVN?
+        HInstruction operand = left.left;
+        HInstruction mask = left.right;
+        if (mask is HConstant) {
+          // Reduce mask constant size.
+          //  (a & mask) >> count  -->  (a >> count) & (mask >> count)
+          ConstantValue maskValue = mask.constant;
+
+          ConstantValue shiftedMask =
+              constant_system.shiftRight.fold(maskValue, countValue);
+          if (shiftedMask is IntConstantValue && shiftedMask.isUInt32()) {
+            // TODO(sra): The shift type should be available from the abstract
+            // value domain.
+            AbstractValue shiftType = shiftedMask.isZero
+                ? _abstractValueDomain.uint32Type
+                : _abstractValueDomain.uint31Type;
+            var shift = HShiftRight(operand, count, shiftType)
+              ..sourceInformation = node.sourceInformation;
+
+            node.block.addBefore(node, shift);
+            HConstant shiftedMaskInstruction =
+                _graph.addConstant(shiftedMask, _closedWorld);
+            return HBitAnd(shift, shiftedMaskInstruction, node.instructionType);
+          }
+        }
+        return node;
+      }
+    }
+    return node;
+  }
+
+  @override
+  HInstruction visitShiftLeft(HShiftLeft node) {
+    HInstruction left = node.left;
+    HInstruction count = node.right;
+    if (count is HConstant) {
+      if (left is HConstant) {
+        return foldBinary(node.operation(), left, count) ?? node;
+      }
+      // Shift by zero can convert to 32 bit unsigned, so remove only if no-op.
+      //  a << 0  -->  a
+      if (count.constant.isZero &&
+          left.isUInt32(_abstractValueDomain).isDefinitelyTrue) {
+        return left;
+      }
+      // Shift-mask-unshift reduction.
+      //   ((a >> c1) & c2) << c1  -->  a & (c2 << c1);
+      if (left is HBitAnd && left.usedBy.length == 1) {
+        HInstruction operand1 = left.left;
+        HInstruction operand2 = left.right;
+        if (operand2 is HConstant) {
+          if (operand1 is HShiftRight && operand1.usedBy.length == 1) {
+            HInstruction a = operand1.left;
+            HInstruction count2 = operand1.right;
+            if (count2 == count) {
+              HInstruction folded =
+                  foldBinary(constant_system.shiftLeft, operand2, count);
+              if (folded != null) {
+                return HBitAnd(a, folded, node.instructionType);
+              }
+            }
+          }
+        }
+      }
+    }
+    return node;
+  }
 }
 
 class SsaCheckInserter extends HBaseVisitor implements OptimizationPhase {
diff --git a/pkg/compiler/test/analyses/analysis_helper.dart b/pkg/compiler/test/analyses/analysis_helper.dart
index eee894d..06e356a 100644
--- a/pkg/compiler/test/analyses/analysis_helper.dart
+++ b/pkg/compiler/test/analyses/analysis_helper.dart
@@ -86,7 +86,8 @@
       : assert(evaluationMode != null),
         super(
             new ir.TypeEnvironment(new ir.CoreTypes(component), classHierarchy),
-            classHierarchy) {
+            classHierarchy,
+            new StaticTypeCacheImpl()) {
     _constantEvaluator = new Dart2jsConstantEvaluator(
         typeEnvironment, const ir.SimpleErrorReporter().report,
         evaluationMode: evaluationMode);
@@ -310,7 +311,7 @@
     ir.DartType staticType = node?.accept(this);
     assert(
         node is! ir.Expression ||
-            staticType == typeEnvironment.nullType ||
+            staticType is ir.NullType ||
             staticType is ir.FutureOrType ||
             typeEnvironment.isSubtypeOf(
                 staticType,
diff --git a/pkg/compiler/test/codegen/bitops1_test.dart b/pkg/compiler/test/codegen/bitops1_test.dart
new file mode 100644
index 0000000..a77e35d
--- /dev/null
+++ b/pkg/compiler/test/codegen/bitops1_test.dart
@@ -0,0 +1,138 @@
+// Copyright (c) 2015, 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.
+
+// @dart = 2.7
+
+library bitops1_test;
+
+import 'dart:async';
+import 'package:async_helper/async_helper.dart';
+import '../helpers/compiler_helper.dart';
+
+const COMMON = r"""
+int g1 = 0, g2 = 0;
+int sink1 = 0, sink2 = 0;
+
+main() {
+  for (int i = 0; i < 0x100000000; i = i + (i >> 4) + 1) {
+    g1 = g2 = i;
+    sink1 = callFoo(i, 1 - i, i);
+    sink2 = callFoo(2 - i, i, 3 - i);
+  }
+}
+""";
+
+const String TEST1 = r"""
+int foo(int param) {
+  return param & 15;
+  // present: 'return param & 15;'
+}
+""";
+
+const String TEST2 = r"""
+int foo(int param) {
+  return 15 & param;
+  // Constant position canonicalization.
+  // present: 'return param & 15;'
+}
+""";
+
+const String TEST3 = r"""
+int foo(int param) {
+  return param & 0;
+  // present: 'return 0;'
+}
+""";
+
+const String TEST4 = r"""
+int foo(int param) {
+  return param & 12 & 6;
+  // Reassociation and constant folding.
+  // present: 'return param & 4'
+  // absent: '12'
+  // absent: '6'
+}
+""";
+
+const String TEST5 = r"""
+int foo(int param) {
+  return 12 & param & 6;
+  // Reassociation and constant folding.
+  // present: 'return param & 4'
+  // absent: '12'
+  // absent: '6'
+}
+""";
+
+const String TEST6 = r"""
+foo(param) {
+  return 15 | 7 & param;
+  // Constant position canonicalization.
+  // present: 'return param & 7 | 15;'
+}
+""";
+
+const String TEST7 = r"""
+foo(param) {
+  param = toUInt32(param + 1);
+  if (param == 0) return -1;
+  return param & 0xFFFFFFFF | 1;
+  // Removal of identity mask.
+  // present: 'return (param | 1) >>> 0;'
+}
+int toUInt32(int x) => x & 0xFFFFFFFF;
+""";
+
+const String TEST8 = r"""
+int foo(int aaa, int bbb, int ccc) {
+  return 1 | aaa | bbb | 2 | ccc | 4;
+  // Reassociation and constant folding.
+  // present: 'aaa | bbb | ccc | 7'
+}
+int callFoo(int a, int b, int c) => foo(a, b, c);
+""";
+
+const String TEST9 = r"""
+int foo(int aaa, int bbb, int ccc) {
+  return 255 & aaa & bbb & 126 & ccc & 15;
+  // Reassociation and constant folding not yet implemented for '&'.
+  // We want to avoid moving the constants too far right, since masking can
+  // enable a more efficient representation.
+  // TODO(sra): constant-fold later masks into earlier mask.
+  //
+  // present: 'aaa & 255 & bbb & 126 & ccc & 15'
+}
+int callFoo(int a, int b, int c) => foo(a, b, c);
+""";
+
+main() {
+  runTests() async {
+    Future check(String test) {
+      String program = COMMON + '\n\n' + test;
+      if (!test.contains('callFoo')) {
+        program += 'int callFoo(int a, int b, int c) => foo(a);\n';
+      }
+      return compile(program,
+          entry: 'main',
+          methodName: 'foo',
+          disableTypeInference: false,
+          check: checkerForAbsentPresent(test));
+    }
+
+    await check(TEST1);
+    await check(TEST2);
+    await check(TEST3);
+    await check(TEST4);
+    await check(TEST5);
+    await check(TEST6);
+    await check(TEST7);
+    await check(TEST8);
+    await check(TEST9);
+  }
+
+  asyncTest(() async {
+    print('--test from kernel------------------------------------------------');
+    await runTests();
+  });
+}
diff --git a/pkg/compiler/test/codegen/bitops2_test.dart b/pkg/compiler/test/codegen/bitops2_test.dart
new file mode 100644
index 0000000..42ebdf5
--- /dev/null
+++ b/pkg/compiler/test/codegen/bitops2_test.dart
@@ -0,0 +1,98 @@
+// Copyright (c) 2015, 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.
+
+// @dart = 2.7
+
+library bitops2_test;
+
+import 'dart:async';
+import 'package:async_helper/async_helper.dart';
+import '../helpers/compiler_helper.dart';
+
+const COMMON = r"""
+int g1 = 0, g2 = 0;
+int sink1 = 0, sink2 = 0;
+
+main() {
+  for (int i = 0; i < 0x100000000; i = i + (i >> 4) + 1) {
+    g1 = g2 = i;
+    sink1 = callFoo(i, 1 - i, i);
+    sink2 = callFoo(2 - i, i, 3 - i);
+  }
+}
+""";
+
+const String TEST1 = r"""
+int foo(int param) {
+  return (param & 0xFF0000) >> 16;
+  // Shift mask reduction.
+  // present: 'return param >>> 16 & 255;'
+  // absent: 'FF0000'
+  // absent: '16711680'
+}
+""";
+
+const String TEST2 = r"""
+int foo(int param) {
+  param &= 0xFFFFFFFF;
+  if (param == 0) return -1;
+  return param << 0;
+  // Shift-by-zero reduction.
+  // present: 'return param;'
+}
+""";
+
+const String TEST3 = r"""
+int foo(int param) {
+  param &= 0xFFFFFFFF;
+  if (param == 0) return -1;
+  return ((param >> 8) & 7) << 8;
+  // Shift-mask-unshift reduction.
+  // present: 'return param & 1792;'
+}
+""";
+
+const String TEST4 = r"""
+foo(int color) {
+  int alpha = 100;
+  int red = (color & 0xFF0000) >> 16;
+  int green = (color & 0xFF00) >> 8;
+  int blue = (color & 0xFF) >> 0;
+
+  return (alpha & 255) << 24 |
+      (red & 255) << 16 |
+      (green & 255) << 8 |
+      (blue & 255) << 0;
+
+  // present: 'color & 16777215 | 1677721600'
+  // absent: '<<'
+  // absent: '>>'
+}
+""";
+
+main() {
+  runTests() async {
+    Future check(String test) {
+      String program = COMMON + '\n\n' + test;
+      if (!test.contains('callFoo')) {
+        program += 'int callFoo(int a, int b, int c) => foo(a);\n';
+      }
+      return compile(program,
+          entry: 'main',
+          methodName: 'foo',
+          disableTypeInference: false,
+          check: checkerForAbsentPresent(test));
+    }
+
+    await check(TEST1);
+    await check(TEST2);
+    await check(TEST3);
+    await check(TEST4);
+  }
+
+  asyncTest(() async {
+    print('--test from kernel------------------------------------------------');
+    await runTests();
+  });
+}
diff --git a/pkg/compiler/test/codegen/codegen_2_shard0_test.dart b/pkg/compiler/test/codegen/codegen_2_shard0_test.dart
new file mode 100644
index 0000000..8fcc121
--- /dev/null
+++ b/pkg/compiler/test/codegen/codegen_2_shard0_test.dart
@@ -0,0 +1,11 @@
+// Copyright (c) 2020, 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.
+
+// @dart = 2.7
+
+import 'codegen_test_helper.dart';
+
+main(List<String> args) {
+  runTests2(args, 0);
+}
diff --git a/pkg/compiler/test/codegen/codegen_2_shard1_test.dart b/pkg/compiler/test/codegen/codegen_2_shard1_test.dart
new file mode 100644
index 0000000..8e4bca0
--- /dev/null
+++ b/pkg/compiler/test/codegen/codegen_2_shard1_test.dart
@@ -0,0 +1,11 @@
+// Copyright (c) 2020, 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.
+
+// @dart = 2.7
+
+import 'codegen_test_helper.dart';
+
+main(List<String> args) {
+  runTests2(args, 1);
+}
diff --git a/pkg/compiler/test/codegen/codegen_shard0_test.dart b/pkg/compiler/test/codegen/codegen_shard0_test.dart
new file mode 100644
index 0000000..3cea332
--- /dev/null
+++ b/pkg/compiler/test/codegen/codegen_shard0_test.dart
@@ -0,0 +1,11 @@
+// Copyright (c) 2020, 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.
+
+// @dart = 2.7
+
+import 'codegen_test_helper.dart';
+
+main(List<String> args) {
+  runTests(args, 0);
+}
diff --git a/pkg/compiler/test/codegen/codegen_shard1_test.dart b/pkg/compiler/test/codegen/codegen_shard1_test.dart
new file mode 100644
index 0000000..8d838c3
--- /dev/null
+++ b/pkg/compiler/test/codegen/codegen_shard1_test.dart
@@ -0,0 +1,11 @@
+// Copyright (c) 2020, 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.
+
+// @dart = 2.7
+
+import 'codegen_test_helper.dart';
+
+main(List<String> args) {
+  runTests(args, 1);
+}
diff --git a/pkg/compiler/test/codegen/codegen_test_helper.dart b/pkg/compiler/test/codegen/codegen_test_helper.dart
new file mode 100644
index 0000000..b07f28a
--- /dev/null
+++ b/pkg/compiler/test/codegen/codegen_test_helper.dart
@@ -0,0 +1,160 @@
+// Copyright (c) 2020, 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.
+
+// @dart = 2.7
+
+import 'dart:io';
+import 'package:async_helper/async_helper.dart';
+import 'package:compiler/src/closure.dart';
+import 'package:compiler/src/common.dart';
+import 'package:compiler/src/commandline_options.dart';
+import 'package:compiler/src/compiler.dart';
+import 'package:compiler/src/diagnostics/diagnostic_listener.dart';
+import 'package:compiler/src/elements/entities.dart';
+import 'package:compiler/src/js_model/element_map.dart';
+import 'package:compiler/src/js_model/js_strategy.dart';
+import 'package:compiler/src/js_model/js_world.dart';
+import 'package:kernel/ast.dart' as ir;
+import '../equivalence/id_equivalence.dart';
+import '../equivalence/id_equivalence_helper.dart';
+
+const List<String> skip = [];
+const List<String> skip2 = [];
+
+main(List<String> args) {
+  runTests(args);
+  runTests2(args);
+}
+
+runTests(List<String> args, [int shardIndex]) {
+  runTestsCommon(args,
+      shardIndex: shardIndex,
+      shards: 2,
+      directory: 'data',
+      skip: skip,
+      options: ['--enable-experiment=non-nullable', Flags.soundNullSafety]);
+}
+
+runTests2(List<String> args, [int shardIndex]) {
+  runTestsCommon(args,
+      shardIndex: shardIndex,
+      shards: 2,
+      directory: 'data_2',
+      skip: skip2,
+      options: []);
+}
+
+runTestsCommon(List<String> args,
+    {int shardIndex,
+    int shards,
+    String directory,
+    List<String> options,
+    List<String> skip}) {
+  asyncTest(() async {
+    Directory dataDir = Directory.fromUri(Platform.script.resolve(directory));
+    await checkTests(dataDir, const CodegenDataComputer(),
+        forUserLibrariesOnly: true,
+        args: args,
+        options: options,
+        testedConfigs: allInternalConfigs,
+        skip: skip,
+        shardIndex: shardIndex ?? 0,
+        shards: shardIndex == null ? 1 : shards);
+  });
+}
+
+class CodegenDataComputer extends DataComputer<String> {
+  const CodegenDataComputer();
+
+  /// Compute generated code for [member].
+  ///
+  /// Fills [actualMap] with the data.
+  @override
+  void computeMemberData(Compiler compiler, MemberEntity member,
+      Map<Id, ActualData<String>> actualMap,
+      {bool verbose: false}) {
+    JsClosedWorld closedWorld = compiler.backendClosedWorldForTesting;
+    JsToElementMap elementMap = closedWorld.elementMap;
+    MemberDefinition definition = elementMap.getMemberDefinition(member);
+    CodegenIrComputer(compiler.reporter, actualMap, elementMap, member,
+            compiler.backendStrategy, closedWorld.closureDataLookup)
+        .run(definition.node);
+  }
+
+  @override
+  DataInterpreter<String> get dataValidator => const CodeDataInterpreter();
+}
+
+/// AST visitor for computing codegen data for a member.
+class CodegenIrComputer extends IrDataExtractor<String> {
+  final JsBackendStrategy _backendStrategy;
+  final JsToElementMap _elementMap;
+  final ClosureData _closureDataLookup;
+
+  CodegenIrComputer(
+      DiagnosticReporter reporter,
+      Map<Id, ActualData<String>> actualMap,
+      this._elementMap,
+      MemberEntity member,
+      this._backendStrategy,
+      this._closureDataLookup)
+      : super(reporter, actualMap);
+
+  String getMemberValue(MemberEntity member) {
+    if (member is FunctionEntity) {
+      return _backendStrategy.getGeneratedCodeForTesting(member);
+    }
+    return null;
+  }
+
+  @override
+  String computeMemberValue(Id id, ir.Member node) {
+    return getMemberValue(_elementMap.getMember(node));
+  }
+
+  @override
+  String computeNodeValue(Id id, ir.TreeNode node) {
+    if (node is ir.FunctionExpression || node is ir.FunctionDeclaration) {
+      ClosureRepresentationInfo info = _closureDataLookup.getClosureInfo(node);
+      return getMemberValue(info.callMethod);
+    }
+    return null;
+  }
+}
+
+/// Default data interpreter for string data representing compiled JavaScript
+/// code.
+///
+/// The data annotation reader strips out newlines and indentation so the
+/// comparison needs to compensate.
+///
+/// The special data annotation `ignore` always passes, so we don't have to
+/// track uninteresting code like a 'main' program.
+class CodeDataInterpreter implements DataInterpreter<String> {
+  const CodeDataInterpreter();
+
+  String _clean(String code) => code.replaceAll(_re, '');
+  static RegExp _re = RegExp(r'[\n\r]\s*');
+
+  @override
+  String isAsExpected(String actualData, String expectedData) {
+    actualData ??= '';
+    expectedData ??= '';
+    if (expectedData == 'ignore') return null;
+    if (_clean(actualData) != _clean(expectedData)) {
+      return 'Expected $expectedData, found $actualData';
+    }
+    return null;
+  }
+
+  @override
+  bool isEmpty(String actualData) {
+    return _clean(actualData) == '';
+  }
+
+  @override
+  String getText(String actualData, [String indentation]) {
+    return actualData;
+  }
+}
diff --git a/pkg/compiler/test/codegen/data/array_add.dart b/pkg/compiler/test/codegen/data/array_add.dart
new file mode 100644
index 0000000..9f2cb1ad
--- /dev/null
+++ b/pkg/compiler/test/codegen/data/array_add.dart
@@ -0,0 +1,28 @@
+// Copyright (c) 2020, 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.
+
+// In prod mode, List.add is lowered to Array.push.
+//
+// TODO(sra): Lower when type of input does not need a generic covariant check.
+@pragma('dart2js:noInline')
+/*spec.member: test1:function() {
+  var t1 = H.setRuntimeTypeInfo([], type$.JSArray_int);
+  C.JSArray_methods.add$1(t1, 1);
+  return t1;
+}*/
+/*prod.member: test1:function() {
+  var t1 = [];
+  t1.push(1);
+  return t1;
+}*/
+test1() {
+  return <int>[]..add(1);
+}
+
+/*member: main:function() {
+  F.test1();
+}*/
+main() {
+  test1();
+}
diff --git a/pkg/compiler/test/codegen/data/codeUnitAt_folding.dart b/pkg/compiler/test/codegen/data/codeUnitAt_folding.dart
new file mode 100644
index 0000000..f898183
--- /dev/null
+++ b/pkg/compiler/test/codegen/data/codeUnitAt_folding.dart
@@ -0,0 +1,46 @@
+// Copyright (c) 2020, 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.
+
+@pragma('dart2js:noInline')
+/*member: foo1:function() {
+  return 72;
+}*/
+foo1() {
+  var a = 'Hello';
+  var b = 0;
+  return a.codeUnitAt(b);
+  // Constant folds to 'return 72;'
+}
+
+@pragma('dart2js:noInline')
+/*spec.member: foo2:function() {
+  return C.JSString_methods.codeUnitAt$1("Hello", H._asInt(1.5));
+}*/
+/*prod.member: foo2:function() {
+  return C.JSString_methods.codeUnitAt$1("Hello", 1.5);
+}*/
+foo2() {
+  var a = 'Hello';
+  dynamic b = 1.5;
+  return a.codeUnitAt(b);
+  // No folding of index type error.
+}
+
+@pragma('dart2js:noInline')
+/*member: foo3:function() {
+  return C.JSString_methods._codeUnitAt$1("Hello", 55);
+}*/
+foo3() {
+  var a = 'Hello';
+  dynamic b = 55;
+  return a.codeUnitAt(b);
+  // No folding of index range error.
+}
+
+/*member: main:ignore*/
+main() {
+  foo1();
+  foo2();
+  foo3();
+}
diff --git a/pkg/compiler/test/codegen/data/marker.options b/pkg/compiler/test/codegen/data/marker.options
new file mode 100644
index 0000000..a1cab2b
--- /dev/null
+++ b/pkg/compiler/test/codegen/data/marker.options
@@ -0,0 +1,2 @@
+spec=pkg/compiler/test/codegen/codegen_test_helper.dart
+prod=pkg/compiler/test/codegen/codegen_test_helper.dart
diff --git a/pkg/compiler/test/codegen/data/tdiv1.dart b/pkg/compiler/test/codegen/data/tdiv1.dart
new file mode 100644
index 0000000..fb8d4d0b
--- /dev/null
+++ b/pkg/compiler/test/codegen/data/tdiv1.dart
@@ -0,0 +1,98 @@
+// Copyright (c) 2020, 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.
+
+//@dart=2.12
+
+/*member: main:ignore*/
+void main() {
+  for (var a in [false, true]) {
+    sink = foo1(a);
+    sink = foo2(a);
+    sink = foo3(a);
+    sink = foo4(a, 2);
+    sink = foo4(a, 10);
+
+    for (var b in [false, true]) {
+      sink = foo5(a, b);
+      sink = foo_regress_37502(a, b);
+    }
+  }
+}
+
+Object? sink;
+
+@pragma('dart2js:noInline')
+/*member: foo1:function(param) {
+  return (param ? 4294967295 : 1) / 2 | 0;
+}*/
+int foo1(bool param) {
+  var a = param ? 0xFFFFFFFF : 1;
+  return a ~/ 2;
+  // Above can be compiled to division followed by truncate.
+  // present: ' / 2 | 0'
+}
+
+@pragma('dart2js:noInline')
+/*member: foo2:function(param) {
+  return (param ? 4294967295 : 1) / 3 | 0;
+}*/
+int foo2(bool param) {
+  var a = param ? 0xFFFFFFFF : 1;
+  return a ~/ 3;
+  // Above can be compiled to division followed by truncate.
+  // present: ' / 3 | 0'
+}
+
+@pragma('dart2js:noInline')
+/*member: foo3:function(param) {
+  return C.JSInt_methods._tdivFast$1(param ? 4294967295 : -1, 2);
+}*/
+int foo3(bool param) {
+  var a = param ? 0xFFFFFFFF : -1;
+  return a ~/ 2;
+  // Potentially negative inputs go via '_tdivFast' fast helper.
+  // present: '_tdivFast'
+}
+
+@pragma('dart2js:noInline')
+/*member: foo4:function(param1, param2) {
+  return C.JSInt_methods.$tdiv(param1 ? 4294967295 : 0, param2);
+}*/
+int foo4(bool param1, int param2) {
+  var a = param1 ? 0xFFFFFFFF : 0;
+  return a ~/ param2;
+  // Unknown divisor goes via full implementation.
+  // present: '$tdiv'
+  // absent: '/'
+}
+
+@pragma('dart2js:noInline')
+/*member: foo5:function(param1, param2) {
+  var a = param1 ? 4294967295 : 0;
+  return C.JSInt_methods.$tdiv(a, param2 ? 3 : 4);
+}*/
+int foo5(bool param1, bool param2) {
+  var a = param1 ? 0xFFFFFFFF : 0;
+  var b = param2 ? 3 : 4;
+  return a ~/ b;
+  // We could optimize this with range analysis, but type inference summarizes
+  // '3 or 4' to uint31, which is not >= 2.
+  // present: '$tdiv'
+  // absent: '/'
+}
+
+@pragma('dart2js:noInline')
+/*member: foo_regress_37502:function(param1, param2) {
+  var a = param1 ? 1.2 : 12.3;
+  return C.JSInt_methods.gcd$1(C.JSDouble_methods.$tdiv(a, param2 ? 3.14 : 2.81), 2);
+}*/
+foo_regress_37502(param1, param2) {
+  var a = param1 ? 1.2 : 12.3;
+  var b = param2 ? 3.14 : 2.81;
+  return (a ~/ b).gcd(2);
+  // The result of ~/ is int; gcd is defined only on int and is too complex
+  // to be inlined.
+  //
+  // present: 'JSInt_methods.gcd'
+}
diff --git a/pkg/compiler/test/codegen/data/unused_empty_map.dart b/pkg/compiler/test/codegen/data/unused_empty_map.dart
new file mode 100644
index 0000000..d9e0363
--- /dev/null
+++ b/pkg/compiler/test/codegen/data/unused_empty_map.dart
@@ -0,0 +1,58 @@
+// Copyright (c) 2020, 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.
+
+@pragma('dart2js:noInline')
+// No code to construct unused map.
+/*member: foo1:function() {
+  return;
+}*/
+void foo1() {
+  var x = {};
+  return;
+}
+
+@pragma('dart2js:noInline')
+// No code to construct unused maps.
+/*member: foo2:function() {
+  return;
+}*/
+void foo2() {
+  var x = {};
+  var y = <String, String>{};
+  return;
+}
+
+@pragma('dart2js:noInline')
+// No code to construct maps which become unused after list is removed.
+/*member: foo3:function() {
+  return;
+}*/
+void foo3() {
+  var x = [{}, {}];
+  return;
+}
+
+@pragma('dart2js:noInline')
+// Constructor is inlined, allocation is removed, leaving maps unused.
+/*member: foo4:function() {
+  return;
+}*/
+void foo4() {
+  var x = AAA4({});
+  return;
+}
+
+class AAA4 {
+  Map<String, String> field1 = {};
+  Map<String, int> field2;
+  AAA4(this.field2);
+}
+
+/*member: main:ignore*/
+main() {
+  foo1();
+  foo2();
+  foo3();
+  foo4();
+}
diff --git a/pkg/compiler/test/codegen/data_2/marker.options b/pkg/compiler/test/codegen/data_2/marker.options
new file mode 100644
index 0000000..a1cab2b
--- /dev/null
+++ b/pkg/compiler/test/codegen/data_2/marker.options
@@ -0,0 +1,2 @@
+spec=pkg/compiler/test/codegen/codegen_test_helper.dart
+prod=pkg/compiler/test/codegen/codegen_test_helper.dart
diff --git a/pkg/compiler/test/codegen/data_2/tdiv1.dart b/pkg/compiler/test/codegen/data_2/tdiv1.dart
new file mode 100644
index 0000000..d180327
--- /dev/null
+++ b/pkg/compiler/test/codegen/data_2/tdiv1.dart
@@ -0,0 +1,118 @@
+// Copyright (c) 2020, 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.
+
+// @dart = 2.7
+
+/*member: main:ignore*/
+void main() {
+  for (var a in [false, true]) {
+    sink = foo1(a);
+    sink = foo2(a);
+    sink = foo3(a);
+    sink = foo4(a, 2);
+    sink = foo4(a, 10);
+
+    for (var b in [false, true]) {
+      sink = foo5(a, b);
+      sink = foo_regress_37502(a, b);
+    }
+  }
+}
+
+Object sink;
+
+@pragma('dart2js:noInline')
+/*spec.member: foo1:function(param) {
+  return (H.boolConversionCheck(param) ? 4294967295 : 1) / 2 | 0;
+}*/
+/*prod.member: foo1:function(param) {
+  return (param ? 4294967295 : 1) / 2 | 0;
+}*/
+int foo1(bool param) {
+  var a = param ? 0xFFFFFFFF : 1;
+  return a ~/ 2;
+  // Above can be compiled to division followed by truncate.
+  // present: ' / 2 | 0'
+}
+
+@pragma('dart2js:noInline')
+/*spec.member: foo2:function(param) {
+  return (H.boolConversionCheck(param) ? 4294967295 : 1) / 3 | 0;
+}*/
+/*prod.member: foo2:function(param) {
+  return (param ? 4294967295 : 1) / 3 | 0;
+}*/
+int foo2(bool param) {
+  var a = param ? 0xFFFFFFFF : 1;
+  return a ~/ 3;
+  // Above can be compiled to division followed by truncate.
+  // present: ' / 3 | 0'
+}
+
+@pragma('dart2js:noInline')
+/*spec.member: foo3:function(param) {
+  return C.JSInt_methods._tdivFast$1(H.boolConversionCheck(param) ? 4294967295 : -1, 2);
+}*/
+/*prod.member: foo3:function(param) {
+  return C.JSInt_methods._tdivFast$1(param ? 4294967295 : -1, 2);
+}*/
+int foo3(bool param) {
+  var a = param ? 0xFFFFFFFF : -1;
+  return a ~/ 2;
+  // Potentially negative inputs go via '_tdivFast' fast helper.
+  // present: '_tdivFast'
+}
+
+@pragma('dart2js:noInline')
+/*spec.member: foo4:function(param1, param2) {
+  return C.JSInt_methods.$tdiv(H.boolConversionCheck(param1) ? 4294967295 : 0, param2);
+}*/
+/*prod.member: foo4:function(param1, param2) {
+  return C.JSInt_methods.$tdiv(param1 ? 4294967295 : 0, param2);
+}*/
+int foo4(bool param1, int param2) {
+  var a = param1 ? 0xFFFFFFFF : 0;
+  return a ~/ param2;
+  // Unknown divisor goes via full implementation.
+  // present: '$tdiv'
+  // absent: '/'
+}
+
+@pragma('dart2js:noInline')
+/*spec.member: foo5:function(param1, param2) {
+  var a = H.boolConversionCheck(param1) ? 4294967295 : 0;
+  return C.JSInt_methods.$tdiv(a, H.boolConversionCheck(param2) ? 3 : 4);
+}*/
+/*prod.member: foo5:function(param1, param2) {
+  var a = param1 ? 4294967295 : 0;
+  return C.JSInt_methods.$tdiv(a, param2 ? 3 : 4);
+}*/
+int foo5(bool param1, bool param2) {
+  var a = param1 ? 0xFFFFFFFF : 0;
+  var b = param2 ? 3 : 4;
+  return a ~/ b;
+  // We could optimize this with range analysis, but type inference summarizes
+  // '3 or 4' to uint31, which is not >= 2.
+  // present: '$tdiv'
+  // absent: '/'
+}
+
+@pragma('dart2js:noInline')
+/*spec.member: foo_regress_37502:function(param1, param2) {
+  var a = H.boolConversionCheck(param1) ? 1.2 : 12.3;
+  return C.JSInt_methods.gcd$1(C.JSDouble_methods.$tdiv(a, H.boolConversionCheck(param2) ? 3.14 : 2.81), 2);
+}*/
+/*prod.member: foo_regress_37502:function(param1, param2) {
+  var a = param1 ? 1.2 : 12.3;
+  return C.JSInt_methods.gcd$1(C.JSDouble_methods.$tdiv(a, param2 ? 3.14 : 2.81), 2);
+}*/
+foo_regress_37502(param1, param2) {
+  var a = param1 ? 1.2 : 12.3;
+  var b = param2 ? 3.14 : 2.81;
+  return (a ~/ b).gcd(2);
+  // The result of ~/ is int; gcd is defined only on int and is too complex
+  // to be inlined.
+  //
+  // present: 'JSInt_methods.gcd'
+}
diff --git a/pkg/compiler/test/codegen/data_2/unused_empty_map.dart b/pkg/compiler/test/codegen/data_2/unused_empty_map.dart
new file mode 100644
index 0000000..d9e0363
--- /dev/null
+++ b/pkg/compiler/test/codegen/data_2/unused_empty_map.dart
@@ -0,0 +1,58 @@
+// Copyright (c) 2020, 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.
+
+@pragma('dart2js:noInline')
+// No code to construct unused map.
+/*member: foo1:function() {
+  return;
+}*/
+void foo1() {
+  var x = {};
+  return;
+}
+
+@pragma('dart2js:noInline')
+// No code to construct unused maps.
+/*member: foo2:function() {
+  return;
+}*/
+void foo2() {
+  var x = {};
+  var y = <String, String>{};
+  return;
+}
+
+@pragma('dart2js:noInline')
+// No code to construct maps which become unused after list is removed.
+/*member: foo3:function() {
+  return;
+}*/
+void foo3() {
+  var x = [{}, {}];
+  return;
+}
+
+@pragma('dart2js:noInline')
+// Constructor is inlined, allocation is removed, leaving maps unused.
+/*member: foo4:function() {
+  return;
+}*/
+void foo4() {
+  var x = AAA4({});
+  return;
+}
+
+class AAA4 {
+  Map<String, String> field1 = {};
+  Map<String, int> field2;
+  AAA4(this.field2);
+}
+
+/*member: main:ignore*/
+main() {
+  foo1();
+  foo2();
+  foo3();
+  foo4();
+}
diff --git a/pkg/compiler/test/deferred_loading/data/many_parts/lib1.dart b/pkg/compiler/test/deferred_loading/data/many_parts/lib1.dart
new file mode 100644
index 0000000..ed47af6
--- /dev/null
+++ b/pkg/compiler/test/deferred_loading/data/many_parts/lib1.dart
@@ -0,0 +1,11 @@
+// Copyright (c) 2020, 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 'lib_000_01.dart' deferred as b1;
+
+/*member: entryLib1:member_unit=main{}*/
+entryLib1() async {
+  await b1.loadLibrary();
+  b1.g_000_01();
+}
diff --git a/pkg/compiler/test/deferred_loading/data/many_parts/lib2.dart b/pkg/compiler/test/deferred_loading/data/many_parts/lib2.dart
new file mode 100644
index 0000000..6b04665
--- /dev/null
+++ b/pkg/compiler/test/deferred_loading/data/many_parts/lib2.dart
@@ -0,0 +1,11 @@
+// Copyright (c) 2020, 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 'lib_000_10.dart' deferred as b2;
+
+/*member: entryLib2:member_unit=main{}*/
+entryLib2() async {
+  await b2.loadLibrary();
+  b2.g_000_10();
+}
diff --git a/pkg/compiler/test/deferred_loading/data/many_parts/lib3.dart b/pkg/compiler/test/deferred_loading/data/many_parts/lib3.dart
new file mode 100644
index 0000000..5c7b1ff
--- /dev/null
+++ b/pkg/compiler/test/deferred_loading/data/many_parts/lib3.dart
@@ -0,0 +1,11 @@
+// Copyright (c) 2020, 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 'lib_001_00.dart' deferred as b3;
+
+/*member: entryLib3:member_unit=main{}*/
+entryLib3() async {
+  await b3.loadLibrary();
+  b3.g_001_00();
+}
diff --git a/pkg/compiler/test/deferred_loading/data/many_parts/lib4.dart b/pkg/compiler/test/deferred_loading/data/many_parts/lib4.dart
new file mode 100644
index 0000000..909bac0
--- /dev/null
+++ b/pkg/compiler/test/deferred_loading/data/many_parts/lib4.dart
@@ -0,0 +1,11 @@
+// Copyright (c) 2020, 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 'lib_010_00.dart' deferred as b4;
+
+/*member: entryLib4:member_unit=main{}*/
+entryLib4() async {
+  await b4.loadLibrary();
+  b4.g_010_00();
+}
diff --git a/pkg/compiler/test/deferred_loading/data/many_parts/lib5.dart b/pkg/compiler/test/deferred_loading/data/many_parts/lib5.dart
new file mode 100644
index 0000000..c5eff23
--- /dev/null
+++ b/pkg/compiler/test/deferred_loading/data/many_parts/lib5.dart
@@ -0,0 +1,11 @@
+// Copyright (c) 2020, 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 'lib_100_00.dart' deferred as b5;
+
+/*member: entryLib5:member_unit=main{}*/
+entryLib5() async {
+  await b5.loadLibrary();
+  b5.g_100_00();
+}
diff --git a/pkg/compiler/test/deferred_loading/data/many_parts/libB.dart b/pkg/compiler/test/deferred_loading/data/many_parts/libB.dart
new file mode 100644
index 0000000..7f86fc1
--- /dev/null
+++ b/pkg/compiler/test/deferred_loading/data/many_parts/libB.dart
@@ -0,0 +1,135 @@
+// Copyright (c) 2020, 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:expect/expect.dart";
+
+/*member: v:member_unit=1{b1, b2, b3, b4, b5}*/
+void v(Set<String> u, String name, int bit) {
+  Expect.isTrue(u.add(name));
+  Expect.equals(name[bit], '1');
+}
+
+@pragma('dart2js:noInline')
+/*member: f_000_01:member_unit=2{b1}*/
+f_000_01(Set<String> u, int b) => v(u, '00001', b);
+
+@pragma('dart2js:noInline')
+/*member: f_000_11:member_unit=3{b1, b2}*/
+f_000_11(Set<String> u, int b) => v(u, '00011', b);
+
+@pragma('dart2js:noInline')
+/*member: f_001_01:member_unit=4{b1, b3}*/
+f_001_01(Set<String> u, int b) => v(u, '00101', b);
+
+@pragma('dart2js:noInline')
+/*member: f_001_11:member_unit=5{b1, b2, b3}*/
+f_001_11(Set<String> u, int b) => v(u, '00111', b);
+
+@pragma('dart2js:noInline')
+/*member: f_010_01:member_unit=6{b1, b4}*/
+f_010_01(Set<String> u, int b) => v(u, '01001', b);
+
+@pragma('dart2js:noInline')
+/*member: f_010_11:member_unit=7{b1, b2, b4}*/
+f_010_11(Set<String> u, int b) => v(u, '01011', b);
+
+@pragma('dart2js:noInline')
+/*member: f_011_01:member_unit=8{b1, b3, b4}*/
+f_011_01(Set<String> u, int b) => v(u, '01101', b);
+
+@pragma('dart2js:noInline')
+/*member: f_011_11:member_unit=9{b1, b2, b3, b4}*/
+f_011_11(Set<String> u, int b) => v(u, '01111', b);
+
+@pragma('dart2js:noInline')
+/*member: f_100_01:member_unit=10{b1, b5}*/
+f_100_01(Set<String> u, int b) => v(u, '10001', b);
+
+@pragma('dart2js:noInline')
+/*member: f_100_11:member_unit=11{b1, b2, b5}*/
+f_100_11(Set<String> u, int b) => v(u, '10011', b);
+
+@pragma('dart2js:noInline')
+/*member: f_101_01:member_unit=12{b1, b3, b5}*/
+f_101_01(Set<String> u, int b) => v(u, '10101', b);
+
+@pragma('dart2js:noInline')
+/*member: f_101_11:member_unit=13{b1, b2, b3, b5}*/
+f_101_11(Set<String> u, int b) => v(u, '10111', b);
+
+@pragma('dart2js:noInline')
+/*member: f_110_01:member_unit=14{b1, b4, b5}*/
+f_110_01(Set<String> u, int b) => v(u, '11001', b);
+
+@pragma('dart2js:noInline')
+/*member: f_110_11:member_unit=15{b1, b2, b4, b5}*/
+f_110_11(Set<String> u, int b) => v(u, '11011', b);
+
+@pragma('dart2js:noInline')
+/*member: f_111_01:member_unit=16{b1, b3, b4, b5}*/
+f_111_01(Set<String> u, int b) => v(u, '11101', b);
+
+@pragma('dart2js:noInline')
+/*member: f_111_11:member_unit=1{b1, b2, b3, b4, b5}*/
+f_111_11(Set<String> u, int b) => v(u, '11111', b);
+
+@pragma('dart2js:noInline')
+/*member: f_000_10:member_unit=17{b2}*/
+f_000_10(Set<String> u, int b) => v(u, '00010', b);
+
+@pragma('dart2js:noInline')
+/*member: f_001_10:member_unit=18{b2, b3}*/
+f_001_10(Set<String> u, int b) => v(u, '00110', b);
+
+@pragma('dart2js:noInline')
+/*member: f_010_10:member_unit=19{b2, b4}*/
+f_010_10(Set<String> u, int b) => v(u, '01010', b);
+
+@pragma('dart2js:noInline')
+/*member: f_011_10:member_unit=20{b2, b3, b4}*/
+f_011_10(Set<String> u, int b) => v(u, '01110', b);
+
+@pragma('dart2js:noInline')
+/*member: f_100_10:member_unit=21{b2, b5}*/
+f_100_10(Set<String> u, int b) => v(u, '10010', b);
+
+@pragma('dart2js:noInline')
+/*member: f_101_10:member_unit=22{b2, b3, b5}*/
+f_101_10(Set<String> u, int b) => v(u, '10110', b);
+
+@pragma('dart2js:noInline')
+/*member: f_110_10:member_unit=23{b2, b4, b5}*/
+f_110_10(Set<String> u, int b) => v(u, '11010', b);
+
+@pragma('dart2js:noInline')
+/*member: f_111_10:member_unit=24{b2, b3, b4, b5}*/
+f_111_10(Set<String> u, int b) => v(u, '11110', b);
+
+@pragma('dart2js:noInline')
+/*member: f_001_00:member_unit=25{b3}*/
+f_001_00(Set<String> u, int b) => v(u, '00100', b);
+
+@pragma('dart2js:noInline')
+/*member: f_011_00:member_unit=26{b3, b4}*/
+f_011_00(Set<String> u, int b) => v(u, '01100', b);
+
+@pragma('dart2js:noInline')
+/*member: f_101_00:member_unit=27{b3, b5}*/
+f_101_00(Set<String> u, int b) => v(u, '10100', b);
+
+@pragma('dart2js:noInline')
+/*member: f_111_00:member_unit=28{b3, b4, b5}*/
+f_111_00(Set<String> u, int b) => v(u, '11100', b);
+
+@pragma('dart2js:noInline')
+/*member: f_010_00:member_unit=29{b4}*/
+f_010_00(Set<String> u, int b) => v(u, '01000', b);
+
+@pragma('dart2js:noInline')
+/*member: f_110_00:member_unit=30{b4, b5}*/
+f_110_00(Set<String> u, int b) => v(u, '11000', b);
+
+@pragma('dart2js:noInline')
+/*member: f_100_00:member_unit=31{b5}*/
+f_100_00(Set<String> u, int b) => v(u, '10000', b);
diff --git a/pkg/compiler/test/deferred_loading/data/many_parts/lib_000_01.dart b/pkg/compiler/test/deferred_loading/data/many_parts/lib_000_01.dart
new file mode 100644
index 0000000..94e3cf7
--- /dev/null
+++ b/pkg/compiler/test/deferred_loading/data/many_parts/lib_000_01.dart
@@ -0,0 +1,32 @@
+// Copyright (c) 2020, 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:expect/expect.dart";
+
+import 'libB.dart';
+
+@pragma('dart2js:noInline')
+/*member: g_000_01:member_unit=2{b1}*/
+g_000_01() {
+  Set<String> uniques = {};
+
+  // f_***_*1;
+  f_000_01(uniques, 4);
+  f_000_11(uniques, 4);
+  f_001_01(uniques, 4);
+  f_001_11(uniques, 4);
+  f_010_01(uniques, 4);
+  f_010_11(uniques, 4);
+  f_011_01(uniques, 4);
+  f_011_11(uniques, 4);
+  f_100_01(uniques, 4);
+  f_100_11(uniques, 4);
+  f_101_01(uniques, 4);
+  f_101_11(uniques, 4);
+  f_110_01(uniques, 4);
+  f_110_11(uniques, 4);
+  f_111_01(uniques, 4);
+  f_111_11(uniques, 4);
+  Expect.equals(16, uniques.length);
+}
diff --git a/pkg/compiler/test/deferred_loading/data/many_parts/lib_000_10.dart b/pkg/compiler/test/deferred_loading/data/many_parts/lib_000_10.dart
new file mode 100644
index 0000000..c7c8597
--- /dev/null
+++ b/pkg/compiler/test/deferred_loading/data/many_parts/lib_000_10.dart
@@ -0,0 +1,32 @@
+// Copyright (c) 2020, 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:expect/expect.dart";
+
+import 'libB.dart';
+
+@pragma('dart2js:noInline')
+/*member: g_000_10:member_unit=17{b2}*/
+g_000_10() {
+  Set<String> uniques = {};
+
+  // f_***_1*;
+  f_000_10(uniques, 3);
+  f_000_11(uniques, 3);
+  f_001_10(uniques, 3);
+  f_001_11(uniques, 3);
+  f_010_10(uniques, 3);
+  f_010_11(uniques, 3);
+  f_011_10(uniques, 3);
+  f_011_11(uniques, 3);
+  f_100_10(uniques, 3);
+  f_100_11(uniques, 3);
+  f_101_10(uniques, 3);
+  f_101_11(uniques, 3);
+  f_110_10(uniques, 3);
+  f_110_11(uniques, 3);
+  f_111_10(uniques, 3);
+  f_111_11(uniques, 3);
+  Expect.equals(16, uniques.length);
+}
diff --git a/pkg/compiler/test/deferred_loading/data/many_parts/lib_001_00.dart b/pkg/compiler/test/deferred_loading/data/many_parts/lib_001_00.dart
new file mode 100644
index 0000000..1b86845
--- /dev/null
+++ b/pkg/compiler/test/deferred_loading/data/many_parts/lib_001_00.dart
@@ -0,0 +1,32 @@
+// Copyright (c) 2020, 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:expect/expect.dart";
+
+import 'libB.dart';
+
+@pragma('dart2js:noInline')
+/*member: g_001_00:member_unit=25{b3}*/
+g_001_00() {
+  Set<String> uniques = {};
+
+  // f_**1_**;
+  f_001_00(uniques, 2);
+  f_001_01(uniques, 2);
+  f_001_10(uniques, 2);
+  f_001_11(uniques, 2);
+  f_011_00(uniques, 2);
+  f_011_01(uniques, 2);
+  f_011_10(uniques, 2);
+  f_011_11(uniques, 2);
+  f_101_00(uniques, 2);
+  f_101_01(uniques, 2);
+  f_101_10(uniques, 2);
+  f_101_11(uniques, 2);
+  f_111_00(uniques, 2);
+  f_111_01(uniques, 2);
+  f_111_10(uniques, 2);
+  f_111_11(uniques, 2);
+  Expect.equals(16, uniques.length);
+}
diff --git a/pkg/compiler/test/deferred_loading/data/many_parts/lib_010_00.dart b/pkg/compiler/test/deferred_loading/data/many_parts/lib_010_00.dart
new file mode 100644
index 0000000..f23fc51
--- /dev/null
+++ b/pkg/compiler/test/deferred_loading/data/many_parts/lib_010_00.dart
@@ -0,0 +1,32 @@
+// Copyright (c) 2020, 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:expect/expect.dart";
+
+import 'libB.dart';
+
+@pragma('dart2js:noInline')
+/*member: g_010_00:member_unit=29{b4}*/
+g_010_00() {
+  Set<String> uniques = {};
+
+  // f_*1*_**;
+  f_010_00(uniques, 1);
+  f_010_01(uniques, 1);
+  f_010_10(uniques, 1);
+  f_010_11(uniques, 1);
+  f_011_00(uniques, 1);
+  f_011_01(uniques, 1);
+  f_011_10(uniques, 1);
+  f_011_11(uniques, 1);
+  f_110_00(uniques, 1);
+  f_110_01(uniques, 1);
+  f_110_10(uniques, 1);
+  f_110_11(uniques, 1);
+  f_111_00(uniques, 1);
+  f_111_01(uniques, 1);
+  f_111_10(uniques, 1);
+  f_111_11(uniques, 1);
+  Expect.equals(16, uniques.length);
+}
diff --git a/pkg/compiler/test/deferred_loading/data/many_parts/lib_100_00.dart b/pkg/compiler/test/deferred_loading/data/many_parts/lib_100_00.dart
new file mode 100644
index 0000000..b10def2
--- /dev/null
+++ b/pkg/compiler/test/deferred_loading/data/many_parts/lib_100_00.dart
@@ -0,0 +1,32 @@
+// Copyright (c) 2020, 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:expect/expect.dart";
+
+import 'libB.dart';
+
+@pragma('dart2js:noInline')
+/*member: g_100_00:member_unit=31{b5}*/
+g_100_00() {
+  Set<String> uniques = {};
+
+  // f_1**_**;
+  f_100_00(uniques, 0);
+  f_100_01(uniques, 0);
+  f_100_10(uniques, 0);
+  f_100_11(uniques, 0);
+  f_101_00(uniques, 0);
+  f_101_01(uniques, 0);
+  f_101_10(uniques, 0);
+  f_101_11(uniques, 0);
+  f_110_00(uniques, 0);
+  f_110_01(uniques, 0);
+  f_110_10(uniques, 0);
+  f_110_11(uniques, 0);
+  f_111_00(uniques, 0);
+  f_111_01(uniques, 0);
+  f_111_10(uniques, 0);
+  f_111_11(uniques, 0);
+  Expect.equals(16, uniques.length);
+}
diff --git a/pkg/compiler/test/deferred_loading/data/many_parts/main.dart b/pkg/compiler/test/deferred_loading/data/many_parts/main.dart
new file mode 100644
index 0000000..7c057b4
--- /dev/null
+++ b/pkg/compiler/test/deferred_loading/data/many_parts/main.dart
@@ -0,0 +1,18 @@
+// Copyright (c) 2020, 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 'lib1.dart';
+import 'lib2.dart';
+import 'lib3.dart';
+import 'lib4.dart';
+import 'lib5.dart';
+
+/*member: main:member_unit=main{}*/
+main() {
+  entryLib1();
+  entryLib2();
+  entryLib3();
+  entryLib4();
+  entryLib5();
+}
diff --git a/pkg/compiler/test/deferred_loading/data/regress_35311/lib.dart b/pkg/compiler/test/deferred_loading/data/regress_35311/lib.dart
index b7ecf26..3a92bbf 100644
--- a/pkg/compiler/test/deferred_loading/data/regress_35311/lib.dart
+++ b/pkg/compiler/test/deferred_loading/data/regress_35311/lib.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.7
+
 /*class: B:
  class_unit=1{lib},
  type_unit=main{}
diff --git a/pkg/compiler/test/deferred_loading/data/regress_35311/main.dart b/pkg/compiler/test/deferred_loading/data/regress_35311/main.dart
index 9489c7f..d10d45f 100644
--- a/pkg/compiler/test/deferred_loading/data/regress_35311/main.dart
+++ b/pkg/compiler/test/deferred_loading/data/regress_35311/main.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.7
+
 import 'lib.dart' deferred as lib;
 
 /*member: main:member_unit=main{}*/
diff --git a/pkg/compiler/test/end_to_end/modular_loader_test.dart b/pkg/compiler/test/end_to_end/modular_loader_test.dart
index 76afdb2..3dccb70 100644
--- a/pkg/compiler/test/end_to_end/modular_loader_test.dart
+++ b/pkg/compiler/test/end_to_end/modular_loader_test.dart
@@ -83,7 +83,7 @@
     ..fileSystem = new TestFileSystem(fs)
     ..additionalDills = additionalDills
     ..packagesFileUri = toTestUri('.packages')
-    ..experimentalFlags = {ExperimentalFlag.nonNullable: true};
+    ..explicitExperimentalFlags = {ExperimentalFlag.nonNullable: true};
   var inputUris = inputs.map(toTestUri).toList();
   var inputUriSet = inputUris.toSet();
   var component = (await kernelForModule(inputUris, options)).component;
diff --git a/pkg/compiler/test/end_to_end/no_platform_test.dart b/pkg/compiler/test/end_to_end/no_platform_test.dart
index 8c23651..00578fc 100644
--- a/pkg/compiler/test/end_to_end/no_platform_test.dart
+++ b/pkg/compiler/test/end_to_end/no_platform_test.dart
@@ -23,7 +23,7 @@
             sdkLibrariesSpecificationUri,
             [], // additionalDills
             Uri.base.resolve('.packages'), // packagesFileUri
-            experimentalFlags: experimentalFlags,
+            explicitExperimentalFlags: experimentalFlags,
             verify: true);
     ir.Component component = await fe.compile(
         initializedCompilerState, false, fe.StandardFileSystem.instance,
diff --git a/pkg/compiler/test/end_to_end/user_crash_test.dart b/pkg/compiler/test/end_to_end/user_crash_test.dart
index 3154873..ab7f26f 100644
--- a/pkg/compiler/test/end_to_end/user_crash_test.dart
+++ b/pkg/compiler/test/end_to_end/user_crash_test.dart
@@ -74,7 +74,8 @@
       await runCompiler(
           entryPoint: entryPoint,
           memorySourceFiles: memorySourceFiles,
-          diagnosticHandler: diagnostics);
+          diagnosticHandler: diagnostics,
+          unsafeToTouchSourceFiles: true);
     } catch (e) {
       result.exceptions.add(e);
     }
diff --git a/pkg/compiler/test/equivalence/id_equivalence_helper.dart b/pkg/compiler/test/equivalence/id_equivalence_helper.dart
index d25b0db..0a9c8d6 100644
--- a/pkg/compiler/test/equivalence/id_equivalence_helper.dart
+++ b/pkg/compiler/test/equivalence/id_equivalence_helper.dart
@@ -135,7 +135,8 @@
         compiler.stopAfterTypeInference =
             options.contains(stopAfterTypeInference);
       },
-      packageConfig: packageConfig);
+      packageConfig: packageConfig,
+      unsafeToTouchSourceFiles: true);
   if (!result.isSuccess) {
     if (skipFailedCompilations) return null;
     Expect.isTrue(
@@ -453,7 +454,7 @@
 Uri createUriForFileName(String fileName) {
   // Pretend this is a dart2js_native test to allow use of 'native'
   // keyword and import of private libraries.
-  return Uri.parse('memory:sdk/tests/dart2js_2/native/$fileName');
+  return Uri.parse('memory:sdk/tests/dart2js/native/$fileName');
 }
 
 Future<TestResult<T>> runTestForConfiguration<T>(TestConfig testConfiguration,
diff --git a/pkg/compiler/test/helpers/compiler_helper.dart b/pkg/compiler/test/helpers/compiler_helper.dart
index eb7046a..891619f 100644
--- a/pkg/compiler/test/helpers/compiler_helper.dart
+++ b/pkg/compiler/test/helpers/compiler_helper.dart
@@ -26,6 +26,15 @@
 export 'package:compiler/src/util/util.dart';
 export 'output_collector.dart';
 
+String _commonTestPath(bool soundNullSafety) {
+  // Pretend this is a dart2js_native test to allow use of 'native' keyword
+  // and import of private libraries. However, we have to choose the correct
+  // folder to enable / disable  implicit cfe opt out of null safety.
+  return soundNullSafety
+      ? 'sdk/tests/dart2js/native'
+      : 'sdk/tests/dart2js_2/native';
+}
+
 /// Compile [code] and returns either the code for [methodName] or, if
 /// [returnAll] is true, the code for the entire program.
 ///
@@ -63,16 +72,15 @@
   if (enableVariance) {
     options.add('${Flags.enableLanguageExperiments}=variance');
   }
+
   if (soundNullSafety) {
     options.add(Flags.soundNullSafety);
   } else {
     options.add(Flags.noSoundNullSafety);
   }
 
-  // Pretend this is a dart2js_native test to allow use of 'native' keyword
-  // and import of private libraries.
-  String commonTestPath = 'sdk/tests/compiler';
-  Uri entryPoint = Uri.parse('memory:$commonTestPath/dart2js_native/main.dart');
+  String commonTestPath = _commonTestPath(soundNullSafety);
+  Uri entryPoint = Uri.parse('memory:$commonTestPath/main.dart');
 
   Map<String, String> source;
   methodName ??= entry;
@@ -123,10 +131,8 @@
     options.add(Flags.noSoundNullSafety);
   }
 
-  // Pretend this is a dart2js_native test to allow use of 'native' keyword
-  // and import of private libraries.
-  String commonTestPath = 'sdk/tests/compiler';
-  Uri entryPoint = Uri.parse('memory:$commonTestPath/dart2js_native/main.dart');
+  String commonTestPath = _commonTestPath(soundNullSafety);
+  Uri entryPoint = Uri.parse('memory:$commonTestPath/main.dart');
 
   CompilationResult result = await runCompiler(
       entryPoint: entryPoint,
diff --git a/pkg/compiler/test/helpers/ir_types.dart b/pkg/compiler/test/helpers/ir_types.dart
index e5cbaa3..65a87a4 100644
--- a/pkg/compiler/test/helpers/ir_types.dart
+++ b/pkg/compiler/test/helpers/ir_types.dart
@@ -119,6 +119,11 @@
   }
 
   @override
+  void visitNullType(ir.NullType node, StringBuffer sb) {
+    sb.write('Null');
+  }
+
+  @override
   void visitVoidType(ir.VoidType node, StringBuffer sb) {
     sb.write('void');
   }
diff --git a/pkg/compiler/test/helpers/memory_compiler.dart b/pkg/compiler/test/helpers/memory_compiler.dart
index 06ddcd9..3a19a1b 100644
--- a/pkg/compiler/test/helpers/memory_compiler.dart
+++ b/pkg/compiler/test/helpers/memory_compiler.dart
@@ -12,6 +12,7 @@
 import 'package:compiler/compiler_new.dart'
     show CompilationResult, CompilerDiagnostics, CompilerOutput, Diagnostic;
 import 'package:compiler/src/common.dart';
+import 'package:compiler/src/commandline_options.dart';
 import 'package:compiler/src/diagnostics/messages.dart' show Message;
 import 'package:compiler/src/null_compiler_output.dart' show NullCompilerOutput;
 import 'package:compiler/src/options.dart' show CompilerOptions;
@@ -89,7 +90,8 @@
     bool showDiagnostics: true,
     Uri librariesSpecificationUri,
     Uri packageConfig,
-    void beforeRun(CompilerImpl compiler)}) async {
+    void beforeRun(CompilerImpl compiler),
+    bool unsafeToTouchSourceFiles: false}) async {
   if (entryPoint == null) {
     entryPoint = Uri.parse('memory:main.dart');
   }
@@ -101,7 +103,8 @@
       options: options,
       showDiagnostics: showDiagnostics,
       librariesSpecificationUri: librariesSpecificationUri,
-      packageConfig: packageConfig);
+      packageConfig: packageConfig,
+      unsafeToTouchSourceFiles: unsafeToTouchSourceFiles);
   if (beforeRun != null) {
     beforeRun(compiler);
   }
@@ -120,7 +123,8 @@
     List<String> options: const <String>[],
     bool showDiagnostics: true,
     Uri librariesSpecificationUri,
-    Uri packageConfig}) {
+    Uri packageConfig,
+    bool unsafeToTouchSourceFiles: false}) {
   retainDataForTesting = true;
   librariesSpecificationUri ??= sdkLibrariesSpecificationUri;
 
@@ -134,8 +138,27 @@
     }
   }
 
+  // Create a local in case we end up cloning memorySourceFiles.
+  Map<String, dynamic> sources = memorySourceFiles;
+
+  // If soundNullSafety is not requested, then we prepend the opt out string to
+  // the memory files.
+  if (!options.contains(Flags.soundNullSafety) && !unsafeToTouchSourceFiles) {
+    // Map may be immutable so copy.
+    sources = {};
+    memorySourceFiles.forEach((k, v) => sources[k] = v);
+    RegExp optOutStr = RegExp(r"\/\/\s*@dart\s*=\s*2\.\d+");
+    for (var key in sources.keys) {
+      if (sources[key] is String && key.endsWith('.dart')) {
+        if (!optOutStr.hasMatch(sources[key])) {
+          sources[key] = '// @dart=2.7\n' + sources[key];
+        }
+      }
+    }
+  }
+
   MemorySourceFileProvider provider;
-  provider = new MemorySourceFileProvider(memorySourceFiles);
+  provider = new MemorySourceFileProvider(sources);
   diagnosticHandler = createCompilerDiagnostics(diagnosticHandler, provider,
       showDiagnostics: showDiagnostics,
       verbose: options.contains('-v') || options.contains('--verbose'));
diff --git a/pkg/compiler/test/inference/data/list2.dart b/pkg/compiler/test/inference/data/list2.dart
index 40ab257..16b21d8 100644
--- a/pkg/compiler/test/inference/data/list2.dart
+++ b/pkg/compiler/test/inference/data/list2.dart
@@ -71,51 +71,51 @@
 
 // -------- List.generate --------
 
-/*member: listGenerateDefault:Container([exact=JSExtendableArray], element: [null|subclass=Object], length: 8)*/
+/*member: listGenerateDefault:Container([exact=JSExtendableArray], element: [exact=JSString], length: 8)*/
 get listGenerateDefault => List.generate(
     8, /*[exact=JSString]*/ (/*[subclass=JSPositiveInt]*/ i) => 'x$i');
 
-/*member: listGenerateGrowable:Container([exact=JSExtendableArray], element: [null|subclass=Object], length: 8)*/
+/*member: listGenerateGrowable:Container([exact=JSExtendableArray], element: [exact=JSString], length: 8)*/
 get listGenerateGrowable => List.generate(
     8, /*[exact=JSString]*/ (/*[subclass=JSPositiveInt]*/ i) => 'g$i',
     growable: true);
 
-/*member: listGenerateFixed:Container([exact=JSFixedArray], element: [null|subclass=Object], length: 8)*/
+/*member: listGenerateFixed:Container([exact=JSFixedArray], element: [exact=JSString], length: 8)*/
 get listGenerateFixed => List.generate(
     8, /*[exact=JSString]*/ (/*[subclass=JSPositiveInt]*/ i) => 'f$i',
     growable: false);
 
-/*member: listGenerateEither:Container([subclass=JSMutableArray], element: [null|subclass=Object], length: 8)*/
+/*member: listGenerateEither:Container([subclass=JSMutableArray], element: [exact=JSString], length: 8)*/
 get listGenerateEither => List.generate(
     8, /*[exact=JSString]*/ (/*[subclass=JSPositiveInt]*/ i) => 'e$i',
     growable: boolFlag);
 
 // -------- List.of --------
 
-/*member: listOfDefault:[exact=JSExtendableArray]*/
+/*member: listOfDefault:Container([exact=JSExtendableArray], element: [null|subclass=Object], length: null)*/
 get listOfDefault => List.of(data);
 
-/*member: listOfGrowable:[exact=JSExtendableArray]*/
+/*member: listOfGrowable:Container([exact=JSExtendableArray], element: [null|subclass=Object], length: null)*/
 get listOfGrowable => List.of(data, growable: true);
 
-/*member: listOfFixed:[exact=JSFixedArray]*/
+/*member: listOfFixed:Container([exact=JSFixedArray], element: [null|subclass=Object], length: null)*/
 get listOfFixed => List.of(data, growable: false);
 
-/*member: listOfEither:[subclass=JSMutableArray]*/
+/*member: listOfEither:Container([subclass=JSMutableArray], element: [null|subclass=Object], length: null)*/
 get listOfEither => List.of(data, growable: boolFlag);
 
 // -------- List.from --------
 
-/*member: listFromDefault:[exact=JSExtendableArray]*/
+/*member: listFromDefault:Container([exact=JSExtendableArray], element: [null|subclass=Object], length: null)*/
 get listFromDefault => List.from(data);
 
-/*member: listFromGrowable:[exact=JSExtendableArray]*/
+/*member: listFromGrowable:Container([exact=JSExtendableArray], element: [null|subclass=Object], length: null)*/
 get listFromGrowable => List.from(data, growable: true);
 
-/*member: listFromFixed:[exact=JSFixedArray]*/
+/*member: listFromFixed:Container([exact=JSFixedArray], element: [null|subclass=Object], length: null)*/
 get listFromFixed => List.from(data, growable: false);
 
-/*member: listFromEither:[subclass=JSMutableArray]*/
+/*member: listFromEither:Container([subclass=JSMutableArray], element: [null|subclass=Object], length: null)*/
 get listFromEither => List.from(data, growable: boolFlag);
 
 // -------- List.unmodifiable --------
diff --git a/pkg/compiler/test/inference/data/no_such_method.dart b/pkg/compiler/test/inference/data/no_such_method.dart
index 257f5b3..534e0c7 100644
--- a/pkg/compiler/test/inference/data/no_such_method.dart
+++ b/pkg/compiler/test/inference/data/no_such_method.dart
@@ -1,8 +1,12 @@
+// Copyright (c) 2020, 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.
+
+// @dart = 2.7
+
 /*member: main:[null]*/
 main() {
   missingGetter();
-
-// @dart = 2.7
   missingMethod();
   closureThroughMissingMethod();
   closureThroughMissingSetter();
diff --git a/pkg/compiler/test/jsinterop/declaration_test.dart b/pkg/compiler/test/jsinterop/declaration_test.dart
index 5561004..fd61ba4 100644
--- a/pkg/compiler/test/jsinterop/declaration_test.dart
+++ b/pkg/compiler/test/jsinterop/declaration_test.dart
@@ -111,23 +111,6 @@
 ''',
       warnings: const [MessageKind.ABSTRACT_GETTER],
       skipForKernel: true),
-  const Test('Js-interop class that extends a regular class.', '''
-@JS()
-library test;
-
-import 'package:js/js.dart';
-
-abstract class A {
-  method();
-}
-
-@JS()
-class B extends A {
-  external method();
-}
-
-main() => new B();
-''', errors: const [MessageKind.JS_INTEROP_CLASS_CANNOT_EXTEND_DART_CLASS]),
   const Test('Js-interop class that extends a js-interop class.', '''
 @JS()
 library test;
diff --git a/pkg/compiler/test/model/cfe_constant_evaluation_test.dart b/pkg/compiler/test/model/cfe_constant_evaluation_test.dart
index 69fd8bc..b133fd4 100644
--- a/pkg/compiler/test/model/cfe_constant_evaluation_test.dart
+++ b/pkg/compiler/test/model/cfe_constant_evaluation_test.dart
@@ -77,20 +77,21 @@
     ConstantData(r'"${null}"', 'StringConstant("null")'),
     ConstantData('identical', 'FunctionConstant(identical)'),
     ConstantData('true ? 0 : 1', 'IntConstant(0)'),
-    ConstantData('proxy', 'ConstructedConstant(_Proxy())'),
+    ConstantData('deprecated',
+        'ConstructedConstant(Deprecated(message=StringConstant("next release")))'),
     ConstantData('const [] == null', 'BoolConstant(false)'),
-    ConstantData('proxy == null', 'BoolConstant(false)'),
-    ConstantData('proxy != null', 'BoolConstant(true)'),
-    ConstantData('null == proxy', 'BoolConstant(false)'),
-    ConstantData('null != proxy', 'BoolConstant(true)'),
-    ConstantData('true == proxy', 'BoolConstant(false)'),
-    ConstantData('true != proxy', 'BoolConstant(true)'),
-    ConstantData('0 == proxy', 'BoolConstant(false)'),
-    ConstantData('0 != proxy', 'BoolConstant(true)'),
-    ConstantData('0.5 == proxy', 'BoolConstant(false)'),
-    ConstantData('0.5 != proxy', 'BoolConstant(true)'),
-    ConstantData('"" == proxy', 'BoolConstant(false)'),
-    ConstantData('"" != proxy', 'BoolConstant(true)'),
+    ConstantData('deprecated == null', 'BoolConstant(false)'),
+    ConstantData('deprecated != null', 'BoolConstant(true)'),
+    ConstantData('null == deprecated', 'BoolConstant(false)'),
+    ConstantData('null != deprecated', 'BoolConstant(true)'),
+    ConstantData('true == deprecated', 'BoolConstant(false)'),
+    ConstantData('true != deprecated', 'BoolConstant(true)'),
+    ConstantData('0 == deprecated', 'BoolConstant(false)'),
+    ConstantData('0 != deprecated', 'BoolConstant(true)'),
+    ConstantData('0.5 == deprecated', 'BoolConstant(false)'),
+    ConstantData('0.5 != deprecated', 'BoolConstant(true)'),
+    ConstantData('"" == deprecated', 'BoolConstant(false)'),
+    ConstantData('"" != deprecated', 'BoolConstant(true)'),
     ConstantData('Object', 'TypeConstant(Object)'),
     ConstantData('null ?? 0', 'IntConstant(0)'),
     ConstantData('const <int, int>{0: 1, 0: 2}', 'NonConstant',
@@ -320,7 +321,7 @@
         r'"$integer $string $boolean"', 'StringConstant("5 baz false")'),
     ConstantData('integer ? true : false', 'NonConstant',
         expectedErrors: 'ConstEvalInvalidType'),
-    ConstantData(r'"${proxy}"', 'NonConstant',
+    ConstantData(r'"${deprecated}"', 'NonConstant',
         expectedErrors: 'ConstEvalInvalidStringInterpolationOperand'),
     ConstantData('0 + string', 'NonConstant',
         expectedErrors: 'ConstEvalInvalidType'),
diff --git a/pkg/compiler/test/model/cfe_constant_test.dart b/pkg/compiler/test/model/cfe_constant_test.dart
index 160e6491..50abef9 100644
--- a/pkg/compiler/test/model/cfe_constant_test.dart
+++ b/pkg/compiler/test/model/cfe_constant_test.dart
@@ -24,7 +24,7 @@
 main(List<String> args) {
   asyncTest(() async {
     Directory dataDir = new Directory.fromUri(Platform.script
-        .resolve('../../../../pkg/_fe_analyzer_shared/test/constants/data'));
+        .resolve('../../../../pkg/_fe_analyzer_shared/test/constants/data_2'));
     await checkTests<String>(dataDir, new ConstantDataComputer(),
         args: args, testedConfigs: [sharedConfig]);
   });
diff --git a/pkg/compiler/test/sourcemaps/mapping_test.dart b/pkg/compiler/test/sourcemaps/mapping_test.dart
index bbff333..e569599 100644
--- a/pkg/compiler/test/sourcemaps/mapping_test.dart
+++ b/pkg/compiler/test/sourcemaps/mapping_test.dart
@@ -106,7 +106,8 @@
       entryPoint: Uri.parse('memory:main.dart'),
       memorySourceFiles: {'main.dart': test.code},
       outputProvider: collector,
-      options: options);
+      options: options,
+      unsafeToTouchSourceFiles: true);
   Expect.isTrue(compilationResult.isSuccess,
       "Unsuccessful compilation of test:\n${test.code}");
   String sourceMapText = collector.getOutput('', OutputType.sourceMap);
diff --git a/pkg/compiler/test/sourcemaps/stacktrace/sync_throw_in_async.dart b/pkg/compiler/test/sourcemaps/stacktrace/sync_throw_in_async.dart
index f89ba6d..4a615c8 100644
--- a/pkg/compiler/test/sourcemaps/stacktrace/sync_throw_in_async.dart
+++ b/pkg/compiler/test/sourcemaps/stacktrace/sync_throw_in_async.dart
@@ -9,8 +9,7 @@
   /*1:main*/ test();
 }
 
-// TODO(34942): Step 2 should point to the body block.
 @pragma('dart2js:noInline')
-test /*2:test*/ () async {
+test() async /*2:test*/ {
   /*4:test*/ throw '>ExceptionMarker<';
 }
diff --git a/pkg/compiler/test/sourcemaps/stacktrace/sync_throw_in_awaited_async.dart b/pkg/compiler/test/sourcemaps/stacktrace/sync_throw_in_awaited_async.dart
index 8d1ae16..01f5d88 100644
--- a/pkg/compiler/test/sourcemaps/stacktrace/sync_throw_in_awaited_async.dart
+++ b/pkg/compiler/test/sourcemaps/stacktrace/sync_throw_in_awaited_async.dart
@@ -9,15 +9,13 @@
   /*1:main*/ test1();
 }
 
-// TODO(34942): Step 3 should point to the body block.
 @pragma('dart2js:noInline')
-test1 /*3:test1*/ () async {
+test1() async /*3:test1*/ {
   // This call is on the stack when the error is thrown.
   await /*5:test1*/ test2();
 }
 
-// TODO(34942): Step 7 should point to the body block.
 @pragma('dart2js:noInline')
-test2 /*7:test2*/ () async {
+test2() async /*7:test2*/ {
   /*9:test2*/ throw '>ExceptionMarker<';
 }
diff --git a/pkg/compiler/test/sourcemaps/stacktrace/sync_throw_in_top_level_method_from_async.dart b/pkg/compiler/test/sourcemaps/stacktrace/sync_throw_in_top_level_method_from_async.dart
index 23b08e9..9475ce8 100644
--- a/pkg/compiler/test/sourcemaps/stacktrace/sync_throw_in_top_level_method_from_async.dart
+++ b/pkg/compiler/test/sourcemaps/stacktrace/sync_throw_in_top_level_method_from_async.dart
@@ -8,9 +8,8 @@
   /*1:main*/ test1();
 }
 
-// TODO(34942): Step 2 should point to the body block.
 @pragma('dart2js:noInline')
-test1 /*2:test1*/ () async {
+test1() async /*2:test1*/ {
   /*9:test1*/ test2();
 }
 
diff --git a/pkg/compiler/test/static_type/data/issue42281.dart b/pkg/compiler/test/static_type/data/issue42281.dart
index 853da41..c8d8fdf 100644
--- a/pkg/compiler/test/static_type/data/issue42281.dart
+++ b/pkg/compiler/test/static_type/data/issue42281.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.7
+
 class Class {
   final Type componentType;
 
diff --git a/pkg/compiler/test/static_type/type_promotion_data/issue42281.dart b/pkg/compiler/test/static_type/type_promotion_data/issue42281.dart
index 56a8cd0..3d9a9da 100644
--- a/pkg/compiler/test/static_type/type_promotion_data/issue42281.dart
+++ b/pkg/compiler/test/static_type/type_promotion_data/issue42281.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.7
+
 class Class {
   final Type componentType;
 
diff --git a/pkg/compiler/testing.json b/pkg/compiler/testing.json
index 71e5988..df10340 100644
--- a/pkg/compiler/testing.json
+++ b/pkg/compiler/testing.json
@@ -14,6 +14,7 @@
 
     "exclude": [
       "^pkg/compiler/test/.*/data/.*",
+      "^pkg/compiler/test/.*/data_2/.*",
       "^pkg/compiler/test/.*/model_data/.*",
       "^pkg/compiler/test/deferred_loading/libs/.*",
       "^pkg/compiler/test/sourcemaps/stacktrace/extension_method.dart"
diff --git a/pkg/dart2native/lib/generate.dart b/pkg/dart2native/lib/generate.dart
index 7ce1f9a2..eb70dcf 100644
--- a/pkg/dart2native/lib/generate.dart
+++ b/pkg/dart2native/lib/generate.dart
@@ -32,6 +32,9 @@
   final Directory tempDir = Directory.systemTemp.createTempSync();
   try {
     final sourcePath = path.canonicalize(path.normalize(sourceFile));
+    if (packages != null) {
+      packages = path.canonicalize(path.normalize(packages));
+    }
     final Kind outputKind = {
       'aot': Kind.aot,
       'exe': Kind.exe,
diff --git a/pkg/dart_internal/CHANGELOG.md b/pkg/dart_internal/CHANGELOG.md
index d84bdda..8b39127 100644
--- a/pkg/dart_internal/CHANGELOG.md
+++ b/pkg/dart_internal/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 0.1.12-nullsafety.1
+
+- Support the latest Dart SDK.
+
 ## 0.1.10
 
 - Support the latest Dart SDK.
diff --git a/pkg/dart_internal/pubspec.yaml b/pkg/dart_internal/pubspec.yaml
index 191de63..64adb7f 100644
--- a/pkg/dart_internal/pubspec.yaml
+++ b/pkg/dart_internal/pubspec.yaml
@@ -1,7 +1,5 @@
 name: dart_internal
-version: 0.1.12-nullsafety
-author: "Dart Team <misc@dartlang.org>"
-homepage: http://www.dartlang.org
+version: 0.1.12-nullsafety.1
 repository: https://github.com/dart-lang/sdk/tree/master/pkg/dart_internal
 description: >
   This package is not intended for wide use. It provides a temporary API to
@@ -18,4 +16,4 @@
 environment:
   # Restrict the upper bound so that we can remove support for this in a later
   # version of the SDK without it being a breaking change.
-  sdk: ">=2.10.0-0 <2.11.0"
+  sdk: ">=2.10.0-0 <2.12.0"
diff --git a/pkg/dartdev/lib/dartdev.dart b/pkg/dartdev/lib/dartdev.dart
index a6ec4bf..e2229b4 100644
--- a/pkg/dartdev/lib/dartdev.dart
+++ b/pkg/dartdev/lib/dartdev.dart
@@ -2,15 +2,17 @@
 // 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' as io;
+// Do not call exit() directly. Use VmInteropHandler.exit() instead.
+import 'dart:io' as io hide exit;
 import 'dart:isolate';
 
-import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:args/args.dart';
 import 'package:args/command_runner.dart';
 import 'package:cli_util/cli_logging.dart';
 import 'package:dart_style/src/cli/format_command.dart';
 import 'package:nnbd_migration/migration_cli.dart';
+import 'package:pedantic/pedantic.dart';
+import 'package:pub/pub.dart';
 import 'package:usage/usage.dart';
 
 import 'src/analytics.dart';
@@ -18,22 +20,19 @@
 import 'src/commands/compile.dart';
 import 'src/commands/create.dart';
 import 'src/commands/fix.dart';
-import 'src/commands/pub.dart';
 import 'src/commands/run.dart';
 import 'src/commands/test.dart';
 import 'src/core.dart';
 import 'src/events.dart';
 import 'src/experiments.dart';
-import 'src/sdk.dart';
 import 'src/utils.dart';
 import 'src/vm_interop_handler.dart';
 
 /// This is typically called from bin/, but given the length of the method and
-/// analytics logic, it has been moved here. Also note that this method calls
-/// [io.exit(code)] directly.
+/// analytics logic, it has been moved here.
 Future<void> runDartdev(List<String> args, SendPort port) async {
   VmInteropHandler.initialize(port);
-  final stopwatch = Stopwatch();
+
   int result;
 
   // The exit code for the dartdev process; null indicates that it has not been
@@ -46,8 +45,9 @@
 
   // The Analytics instance used to report information back to Google Analytics;
   // see lib/src/analytics.dart.
-  Analytics analytics =
-      createAnalyticsInstance(args.contains('--disable-dartdev-analytics'));
+  final analytics = createAnalyticsInstance(
+    args.contains('--disable-dartdev-analytics'),
+  );
 
   // If we have not printed the analyticsNoticeOnFirstRunMessage to stdout,
   // the user is on a terminal, and the machine is not a bot, then print the
@@ -69,20 +69,19 @@
 
     // Alert the user that analytics has been disabled.
     print(analyticsDisabledNoticeMessage);
-    io.exit(0);
+    VmInteropHandler.exit(0);
+    return;
   } else if (args.contains('--enable-analytics')) {
     analytics.enabled = true;
 
     // Alert the user again that anonymous data will be collected.
     print(analyticsNoticeOnFirstRunMessage);
-    io.exit(0);
+    VmInteropHandler.exit(0);
+    return;
   }
 
-  String commandName;
-
   try {
-    stopwatch.start();
-    final runner = DartdevRunner(args);
+    final runner = DartdevRunner(args, analytics);
 
     // Run can't be called with the '--disable-dartdev-analytics' flag; remove
     // it if it is contained in args.
@@ -90,14 +89,16 @@
       args = List.from(args)..remove('--disable-dartdev-analytics');
     }
 
-    // These flags have a format that can't be handled by package:args, so while
-    // they are valid flags we'll assume the VM has verified them by this point.
-    args = args
-        .where(
-          (element) => !(element.contains('--observe') ||
-              element.contains('--enable-vm-service')),
-        )
-        .toList();
+    if (args.contains('run')) {
+      // These flags have a format that can't be handled by package:args, so while
+      // they are valid flags we'll assume the VM has verified them by this point.
+      args = args
+          .where(
+            (element) => !(element.contains('--observe') ||
+                element.contains('--enable-vm-service')),
+          )
+          .toList();
+    }
 
     // If ... help pub ... is in the args list, remove 'help', and add '--help'
     // to the end of the list. This will make it possible to use the help
@@ -107,16 +108,6 @@
       args = PubUtils.modifyArgs(args);
     }
 
-    // For the commands format and migrate, dartdev itself sends the
-    // sendScreenView notification to analytics; for all other dartdev commands
-    // (instances of DartdevCommand) the commands send it to analytics.
-    commandName = ArgParserUtils.getCommandStr(args);
-    if (analytics.enabled &&
-        (commandName == formatCmdName || commandName == migrateCmdName)) {
-      // ignore: unawaited_futures
-      analytics.sendScreenView(commandName);
-    }
-
     // Finally, call the runner to execute the command; see DartdevRunner.
     result = await runner.run(args);
   } catch (e, st) {
@@ -132,39 +123,18 @@
       exitCode = 1;
     }
   } finally {
-    stopwatch.stop();
-
     // Set the exitCode, if it wasn't set in the catch block above.
     exitCode ??= result ?? 0;
 
     // Send analytics before exiting
     if (analytics.enabled) {
-      // For commands that are not DartdevCommand instances, we manually create
-      // and send the UsageEvent from here:
-      if (commandName == formatCmdName) {
-        // ignore: unawaited_futures
-        FormatUsageEvent(
-          exitCode: exitCode,
-          args: args,
-        ).send(analyticsInstance);
-      } else if (commandName == migrateCmdName) {
-        // ignore: unawaited_futures
-        MigrateUsageEvent(
-          exitCode: exitCode,
-          args: args,
-        ).send(analyticsInstance);
-      }
-
-      // ignore: unawaited_futures
-      analytics.sendTiming(commandName, stopwatch.elapsedMilliseconds,
-          category: 'commands');
-
       // And now send the exceptions and events to Google Analytics:
       if (exception != null) {
-        // ignore: unawaited_futures
-        analytics.sendException(
-            '${exception.runtimeType}\n${sanitizeStacktrace(stackTrace)}',
-            fatal: true);
+        unawaited(
+          analytics.sendException(
+              '${exception.runtimeType}\n${sanitizeStacktrace(stackTrace)}',
+              fatal: true),
+        );
       }
 
       await analytics.waitForLastPing(
@@ -182,7 +152,9 @@
   }
 }
 
-class DartdevRunner<int> extends CommandRunner {
+class DartdevRunner extends CommandRunner<int> {
+  final Analytics analytics;
+
   @override
   final ArgParser argParser =
       ArgParser(usageLineLength: dartdevUsageLineLength);
@@ -190,7 +162,8 @@
   static const String dartdevDescription =
       'A command-line utility for Dart development';
 
-  DartdevRunner(List<String> args) : super('dart', '$dartdevDescription.') {
+  DartdevRunner(List<String> args, this.analytics)
+      : super('dart', '$dartdevDescription.') {
     final bool verbose = args.contains('-v') || args.contains('--verbose');
 
     argParser.addFlag('verbose',
@@ -202,8 +175,6 @@
     argParser.addFlag('disable-analytics',
         negatable: false, help: 'Disable anonymous analytics.');
 
-    addExperimentalFlags(argParser, verbose);
-
     argParser.addFlag('diagnostics',
         negatable: false, help: 'Show tool diagnostic output.', hide: !verbose);
 
@@ -219,14 +190,11 @@
 
     addCommand(AnalyzeCommand());
     addCommand(CreateCommand(verbose: verbose));
-    addCommand(CompileCommand());
+    addCommand(CompileCommand(verbose: verbose));
     addCommand(FixCommand());
     addCommand(FormatCommand(verbose: verbose));
-    addCommand(MigrateCommand(
-      verbose: verbose,
-      hidden: Runtime.runtime.stableChannel,
-    ));
-    addCommand(PubCommand());
+    addCommand(MigrateCommand(verbose: verbose));
+    addCommand(pubCommand());
     addCommand(RunCommand(verbose: verbose));
     addCommand(TestCommand());
   }
@@ -239,28 +207,9 @@
   String get invocation =>
       'dart [<vm-flags>] <command|dart-file> [<arguments>]';
 
-  void addExperimentalFlags(ArgParser argParser, bool verbose) {
-    List<ExperimentalFeature> features = experimentalFeatures;
-
-    Map<String, String> allowedHelp = {};
-    for (ExperimentalFeature feature in features) {
-      String suffix =
-          feature.isEnabledByDefault ? ' (no-op - enabled by default)' : '';
-      allowedHelp[feature.enableString] = '${feature.documentation}$suffix';
-    }
-
-    argParser.addMultiOption(
-      experimentFlagName,
-      valueHelp: 'experiment',
-      allowedHelp: verbose ? allowedHelp : null,
-      help: 'Enable one or more experimental features '
-          '(see dart.dev/go/experiments).',
-      hide: !verbose,
-    );
-  }
-
   @override
   Future<int> runCommand(ArgResults topLevelResults) async {
+    final stopwatch = Stopwatch()..start();
     assert(!topLevelResults.arguments.contains('--disable-dartdev-analytics'));
 
     if (topLevelResults.command == null &&
@@ -282,18 +231,54 @@
         ? Logger.verbose(ansi: ansi)
         : Logger.standard(ansi: ansi);
 
-    if (topLevelResults.wasParsed(experimentFlagName)) {
-      List<String> experimentIds = topLevelResults[experimentFlagName];
-      for (ExperimentalFeature feature in experimentalFeatures) {
-        // We allow default true flags, but complain when they are passed in.
-        if (feature.isEnabledByDefault &&
-            experimentIds.contains(feature.enableString)) {
-          print("'${feature.enableString}' is now enabled by default; this "
-              'flag is no longer required.');
-        }
-      }
+    var command = topLevelResults.command;
+    final commandNames = [];
+    while (command != null) {
+      commandNames.add(command.name);
+      if (command.command == null) break;
+      command = command.command;
     }
 
-    return await super.runCommand(topLevelResults);
+    final path = commandNames.join('/');
+    // Send the screen view to analytics
+    unawaited(
+      analytics.sendScreenView(path),
+    );
+
+    try {
+      final exitCode = await super.runCommand(topLevelResults);
+
+      if (path != null && analytics.enabled) {
+        // Send the event to analytics
+        unawaited(
+          sendUsageEvent(
+            analytics,
+            path,
+            exitCode: exitCode,
+            commandFlags:
+                // This finds the options that where explicitly given to the command
+                // (and not for an eventual subcommand) without including the actual
+                // value.
+                //
+                // Note that this will also conflate short-options and long-options.
+                command?.options?.where(command.wasParsed)?.toList(),
+            specifiedExperiments: topLevelResults.enabledExperiments,
+          ),
+        );
+      }
+
+      return exitCode;
+    } finally {
+      stopwatch.stop();
+      if (analytics.enabled) {
+        unawaited(
+          analytics.sendTiming(
+            path ?? '',
+            stopwatch.elapsedMilliseconds,
+            category: 'commands',
+          ),
+        );
+      }
+    }
   }
 }
diff --git a/pkg/dartdev/lib/src/analytics.dart b/pkg/dartdev/lib/src/analytics.dart
index 595fec0..f8e8ffc 100644
--- a/pkg/dartdev/lib/src/analytics.dart
+++ b/pkg/dartdev/lib/src/analytics.dart
@@ -2,8 +2,10 @@
 // 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:convert';
 import 'dart:io';
 
+import 'package:meta/meta.dart';
 import 'package:path/path.dart' as path;
 import 'package:telemetry/telemetry.dart' as telemetry show isRunningOnBot;
 import 'package:usage/src/usage_impl.dart';
@@ -39,32 +41,30 @@
 const String eventCategory = 'dartdev';
 const String exitCodeParam = 'exitCode';
 
-Analytics _instance;
+/// Disabled [Analytics], exposed for testing only
+@visibleForTesting
+Analytics get disabledAnalytics => DisabledAnalytics(_trackingId, _appName);
 
-Analytics get analyticsInstance => _instance;
-
-/// Create and return an [Analytics] instance, this value is cached and returned
-/// on subsequent calls.
+/// Create and return an [Analytics] instance.
 Analytics createAnalyticsInstance(bool disableAnalytics) {
-  if (_instance != null) {
-    return _instance;
+  if (Platform.environment['_DARTDEV_LOG_ANALYTICS'] != null) {
+    // Used for testing what analytics messages are sent.
+    return _LoggingAnalytics();
   }
 
-  // Dartdev tests pass a hidden 'disable-dartdev-analytics' flag which is
-  // handled here.
-  // Also, stdout.hasTerminal is checked, if there is no terminal we infer that
-  // a machine is running dartdev so we return analytics shouldn't be set.
   if (disableAnalytics) {
-    _instance = DisabledAnalytics(_trackingId, _appName);
-    return _instance;
+    // Dartdev tests pass a hidden 'disable-dartdev-analytics' flag which is
+    // handled here.
+    // Also, stdout.hasTerminal is checked, if there is no terminal we infer that
+    // a machine is running dartdev so we return analytics shouldn't be set.
+    return DisabledAnalytics(_trackingId, _appName);
   }
 
-  var settingsDir = getDartStorageDirectory();
+  final settingsDir = getDartStorageDirectory();
   if (settingsDir == null) {
     // Some systems don't support user home directories; for those, fail
     // gracefully by returning a disabled analytics object.
-    _instance = DisabledAnalytics(_trackingId, _appName);
-    return _instance;
+    return DisabledAnalytics(_trackingId, _appName);
   }
 
   if (!settingsDir.existsSync()) {
@@ -73,21 +73,19 @@
     } catch (e) {
       // If we can't create the directory for the analytics settings, fail
       // gracefully by returning a disabled analytics object.
-      _instance = DisabledAnalytics(_trackingId, _appName);
-      return _instance;
+      return DisabledAnalytics(_trackingId, _appName);
     }
   }
 
-  var readmeFile =
+  final readmeFile =
       File('${settingsDir.absolute.path}${path.separator}$_readmeFileName');
   if (!readmeFile.existsSync()) {
     readmeFile.createSync();
     readmeFile.writeAsStringSync(_readmeFileContents);
   }
 
-  var settingsFile = File(path.join(settingsDir.path, _settingsFileName));
-  _instance = DartdevAnalytics(_trackingId, settingsFile, _appName);
-  return _instance;
+  final settingsFile = File(path.join(settingsDir.path, _settingsFileName));
+  return DartdevAnalytics(_trackingId, settingsFile, _appName);
 }
 
 /// The directory used to store the analytics settings file.
@@ -139,6 +137,7 @@
   }
 }
 
+@visibleForTesting
 class DisabledAnalytics extends AnalyticsMock {
   @override
   final String trackingId;
@@ -153,3 +152,51 @@
   @override
   bool get firstRun => false;
 }
+
+class _LoggingAnalytics extends AnalyticsMock {
+  _LoggingAnalytics() {
+    onSend.listen((event) {
+      stderr.writeln('[analytics]${json.encode(event)}');
+    });
+  }
+
+  @override
+  bool get firstRun => false;
+
+  @override
+  Future sendScreenView(String viewName, {Map<String, String> parameters}) {
+    parameters ??= <String, String>{};
+    parameters['viewName'] = viewName;
+    return _log('screenView', parameters);
+  }
+
+  @override
+  Future sendEvent(String category, String action,
+      {String label, int value, Map<String, String> parameters}) {
+    parameters ??= <String, String>{};
+    return _log(
+        'event',
+        {'category': category, 'action': action, 'label': label, 'value': value}
+          ..addAll(parameters));
+  }
+
+  @override
+  Future sendSocial(String network, String action, String target) =>
+      _log('social', {'network': network, 'action': action, 'target': target});
+
+  @override
+  Future sendTiming(String variableName, int time,
+      {String category, String label}) {
+    return _log('timing', {
+      'variableName': variableName,
+      'time': time,
+      'category': category,
+      'label': label
+    });
+  }
+
+  Future<void> _log(String hitType, Map message) async {
+    final encoded = json.encode({'hitType': hitType, 'message': message});
+    stderr.writeln('[analytics]: $encoded');
+  }
+}
diff --git a/pkg/dartdev/lib/src/commands/analyze.dart b/pkg/dartdev/lib/src/commands/analyze.dart
index 80ef119..554d623 100644
--- a/pkg/dartdev/lib/src/commands/analyze.dart
+++ b/pkg/dartdev/lib/src/commands/analyze.dart
@@ -5,16 +5,14 @@
 import 'dart:async';
 import 'dart:io' as io;
 
-import 'package:meta/meta.dart';
 import 'package:path/path.dart' as path;
 
 import '../analysis_server.dart';
 import '../core.dart';
-import '../events.dart';
 import '../sdk.dart';
 import '../utils.dart';
 
-class AnalyzeCommand extends DartdevCommand<int> {
+class AnalyzeCommand extends DartdevCommand {
   static const String cmdName = 'analyze';
 
   /// The maximum length of any of the existing severity labels.
@@ -36,7 +34,7 @@
   String get invocation => '${super.invocation} [<directory>]';
 
   @override
-  FutureOr<int> runImpl() async {
+  FutureOr<int> run() async {
     if (argResults.rest.length > 1) {
       usageException('Only one directory is expected.');
     }
@@ -154,19 +152,4 @@
       return 0;
     }
   }
-
-  @override
-  UsageEvent createUsageEvent(int exitCode) => AnalyzeUsageEvent(
-        usagePath,
-        exitCode: exitCode,
-        args: argResults.arguments,
-      );
-}
-
-/// The [UsageEvent] for the analyze command.
-class AnalyzeUsageEvent extends UsageEvent {
-  AnalyzeUsageEvent(String usagePath,
-      {String label, @required int exitCode, @required List<String> args})
-      : super(AnalyzeCommand.cmdName, usagePath,
-            label: label, args: args, exitCode: exitCode);
 }
diff --git a/pkg/dartdev/lib/src/commands/compile.dart b/pkg/dartdev/lib/src/commands/compile.dart
index 491d7ae..c0fdea3 100644
--- a/pkg/dartdev/lib/src/commands/compile.dart
+++ b/pkg/dartdev/lib/src/commands/compile.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// 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.
 
@@ -6,11 +6,10 @@
 import 'dart:io';
 
 import 'package:dart2native/generate.dart';
-import 'package:meta/meta.dart';
 import 'package:path/path.dart' as path;
 
 import '../core.dart';
-import '../events.dart';
+import '../experiments.dart';
 import '../sdk.dart';
 import '../vm_interop_handler.dart';
 
@@ -47,7 +46,8 @@
 class CompileJSCommand extends CompileSubcommandCommand {
   static const String cmdName = 'js';
 
-  CompileJSCommand() : super(cmdName, 'Compile Dart to JavaScript.') {
+  CompileJSCommand({bool verbose})
+      : super(cmdName, 'Compile Dart to JavaScript.') {
     argParser
       ..addOption(
         commonOptions['outputFile'].flag,
@@ -60,13 +60,14 @@
         abbr: 'm',
         negatable: false,
       );
+    addExperimentalFlags(argParser, verbose);
   }
 
   @override
   String get invocation => '${super.invocation} <dart entry point>';
 
   @override
-  FutureOr<int> runImpl() async {
+  FutureOr<int> run() async {
     if (!Sdk.checkArtifactExists(sdk.dart2jsSnapshot)) {
       return 255;
     }
@@ -93,6 +94,8 @@
 
     VmInteropHandler.run(sdk.dart2jsSnapshot, [
       '--libraries-spec=$librariesPath',
+      if (argResults.enabledExperiments.isNotEmpty)
+        "--enable-experiment=${argResults.enabledExperiments.join(',')}",
       ...argResults.arguments,
     ]);
 
@@ -114,6 +117,7 @@
     this.help,
     this.fileExt,
     this.formatName,
+    bool verbose,
   }) : super(commandName, 'Compile Dart $help') {
     argParser
       ..addOption(
@@ -121,13 +125,14 @@
         help: commonOptions['outputFile'].help,
         abbr: commonOptions['outputFile'].abbr,
       );
+    addExperimentalFlags(argParser, verbose);
   }
 
   @override
   String get invocation => '${super.invocation} <dart entry point>';
 
   @override
-  FutureOr<int> runImpl() async {
+  FutureOr<int> run() async {
     // We expect a single rest argument; the dart entry point.
     if (argResults.rest.length != 1) {
       // This throws.
@@ -146,10 +151,14 @@
       outputFile = '$inputWithoutDart.$fileExt';
     }
 
+    final enabledExperiments = argResults.enabledExperiments;
     // Build arguments.
     List<String> args = [];
     args.add('--snapshot-kind=$formatName');
     args.add('--snapshot=${path.canonicalize(outputFile)}');
+    if (enabledExperiments.isNotEmpty) {
+      args.add("--enable-experiment=${enabledExperiments.join(',')}");
+    }
     if (verbose) {
       args.add('-v');
     }
@@ -175,6 +184,7 @@
     this.commandName,
     this.format,
     this.help,
+    bool verbose,
   }) : super(commandName, 'Compile Dart $help') {
     argParser
       ..addOption(
@@ -197,13 +207,15 @@
       ..addOption('save-debugging-info', abbr: 'S', valueHelp: 'path', help: '''
 Remove debugging information from the output and save it separately to the specified file.
 <path> can be relative or absolute.''');
+
+    addExperimentalFlags(argParser, verbose);
   }
 
   @override
   String get invocation => '${super.invocation} <dart entry point>';
 
   @override
-  FutureOr<int> runImpl() async {
+  FutureOr<int> run() async {
     if (!Sdk.checkArtifactExists(genKernel) ||
         !Sdk.checkArtifactExists(genSnapshot)) {
       return 255;
@@ -227,6 +239,7 @@
         defines: argResults['define'],
         packages: argResults['packages'],
         enableAsserts: argResults['enable-asserts'],
+        enableExperiment: argResults.enabledExperiments.join(','),
         debugFile: argResults['save-debugging-info'],
         verbose: verbose,
       );
@@ -239,64 +252,44 @@
   }
 }
 
-abstract class CompileSubcommandCommand extends DartdevCommand<int> {
+abstract class CompileSubcommandCommand extends DartdevCommand {
   CompileSubcommandCommand(String name, String description,
       {bool hidden = false})
       : super(name, description, hidden: hidden);
-
-  @override
-  UsageEvent createUsageEvent(int exitCode) => CompileUsageEvent(
-        usagePath,
-        exitCode: exitCode,
-        args: argResults.arguments,
-      );
 }
 
-class CompileCommand extends DartdevCommand<int> {
+class CompileCommand extends DartdevCommand {
   static const String cmdName = 'compile';
-
-  CompileCommand() : super(cmdName, 'Compile Dart to various formats.') {
-    addSubcommand(CompileJSCommand());
+  CompileCommand({bool verbose = false})
+      : super(cmdName, 'Compile Dart to various formats.') {
+    addSubcommand(CompileJSCommand(
+      verbose: verbose,
+    ));
     addSubcommand(CompileSnapshotCommand(
       commandName: CompileSnapshotCommand.jitSnapshotCmdName,
       help: 'to a JIT snapshot.',
       fileExt: 'jit',
       formatName: 'app-jit',
+      verbose: verbose,
     ));
     addSubcommand(CompileSnapshotCommand(
       commandName: CompileSnapshotCommand.kernelCmdName,
       help: 'to a kernel snapshot.',
       fileExt: 'dill',
       formatName: 'kernel',
+      verbose: verbose,
     ));
     addSubcommand(CompileNativeCommand(
       commandName: CompileNativeCommand.exeCmdName,
       help: 'to a self-contained executable.',
       format: 'exe',
+      verbose: verbose,
     ));
     addSubcommand(CompileNativeCommand(
       commandName: CompileNativeCommand.aotSnapshotCmdName,
       help: 'to an AOT snapshot.',
       format: 'aot',
+      verbose: verbose,
     ));
   }
-
-  @override
-  UsageEvent createUsageEvent(int exitCode) => null;
-
-  @override
-  FutureOr<int> runImpl() {
-    // do nothing, this command is never run
-    return 0;
-  }
-}
-
-/// The [UsageEvent] for all compile commands, we could have each compile
-/// event be its own class instance, but for the time being [usagePath] takes
-/// care of the only difference.
-class CompileUsageEvent extends UsageEvent {
-  CompileUsageEvent(String usagePath,
-      {String label, @required int exitCode, @required List<String> args})
-      : super(CompileCommand.cmdName, usagePath,
-            label: label, exitCode: exitCode, args: args);
 }
diff --git a/pkg/dartdev/lib/src/commands/create.dart b/pkg/dartdev/lib/src/commands/create.dart
index 920de13..e8aecd4 100644
--- a/pkg/dartdev/lib/src/commands/create.dart
+++ b/pkg/dartdev/lib/src/commands/create.dart
@@ -7,16 +7,14 @@
 import 'dart:io' as io;
 import 'dart:math' as math;
 
-import 'package:meta/meta.dart';
 import 'package:path/path.dart' as p;
 import 'package:stagehand/stagehand.dart' as stagehand;
 
 import '../core.dart';
-import '../events.dart';
 import '../sdk.dart';
 
 /// A command to create a new project from a set of templates.
-class CreateCommand extends DartdevCommand<int> {
+class CreateCommand extends DartdevCommand {
   static const String cmdName = 'create';
 
   static String defaultTemplateId = 'console-simple';
@@ -64,7 +62,7 @@
   String get invocation => '${super.invocation} <directory>';
 
   @override
-  FutureOr<int> runImpl() async {
+  FutureOr<int> run() async {
     if (argResults['list-templates']) {
       log.stdout(_availableTemplatesJson());
       return 0;
@@ -143,13 +141,6 @@
   }
 
   @override
-  UsageEvent createUsageEvent(int exitCode) => CreateUsageEvent(
-        usagePath,
-        exitCode: exitCode,
-        args: argResults.arguments,
-      );
-
-  @override
   String get usageFooter {
     int width = legalTemplateIds.map((s) => s.length).reduce(math.max);
     String desc = generators.map((g) {
@@ -180,14 +171,6 @@
   }
 }
 
-/// The [UsageEvent] for the create command.
-class CreateUsageEvent extends UsageEvent {
-  CreateUsageEvent(String usagePath,
-      {String label, @required int exitCode, @required List<String> args})
-      : super(CreateCommand.cmdName, usagePath,
-            label: label, exitCode: exitCode, args: args);
-}
-
 class DirectoryGeneratorTarget extends stagehand.GeneratorTarget {
   final stagehand.Generator generator;
   final io.Directory dir;
diff --git a/pkg/dartdev/lib/src/commands/fix.dart b/pkg/dartdev/lib/src/commands/fix.dart
index 990da09..3419c75 100644
--- a/pkg/dartdev/lib/src/commands/fix.dart
+++ b/pkg/dartdev/lib/src/commands/fix.dart
@@ -6,33 +6,31 @@
 import 'dart:io' as io;
 
 import 'package:analysis_server_client/protocol.dart' hide AnalysisError;
-import 'package:meta/meta.dart';
 import 'package:path/path.dart' as path;
 
 import '../analysis_server.dart';
 import '../core.dart';
-import '../events.dart';
 import '../sdk.dart';
+import '../utils.dart';
 
-class FixCommand extends DartdevCommand<int> {
+class FixCommand extends DartdevCommand {
   static const String cmdName = 'fix';
 
   // This command is hidden as its currently experimental.
-  FixCommand() : super(cmdName, 'Fix Dart source code.', hidden: true);
+  FixCommand() : super(cmdName, 'Fix Dart source code.', hidden: true) {
+    argParser.addFlag('dry-run',
+        abbr: 'n',
+        defaultsTo: false,
+        help: 'Show which files would be modified but make no changes.');
+  }
 
   @override
-  UsageEvent createUsageEvent(int exitCode) => FixUsageEvent(
-        usagePath,
-        exitCode: exitCode,
-        args: argResults.arguments,
-      );
-
-  @override
-  FutureOr<int> runImpl() async {
+  FutureOr<int> run() async {
     log.stdout('\n*** The `fix` command is provisional and subject to change '
         'or removal in future releases. ***\n');
 
-    if (argResults.rest.length > 1) {
+    var dryRun = argResults['dry-run'];
+    if (argResults.rest.length - (dryRun ? 1 : 0) > 1) {
       usageException('Only one file or directory is expected.');
     }
 
@@ -43,8 +41,8 @@
       usageException("Directory doesn't exist: ${dir.path}");
     }
 
-    var progress =
-        log.progress('Computing fixes in ${path.basename(dir.path)}');
+    var progress = log.progress(
+        'Computing fixes in ${path.basename(path.canonicalize(dir.path))}');
 
     var server = AnalysisServer(
       io.Directory(sdk.sdkPath),
@@ -72,11 +70,25 @@
     if (edits.isEmpty) {
       log.stdout('Nothing to fix!');
     } else {
-      progress = log.progress('Applying fixes');
-      var fileCount = await _applyFixes(edits);
-      progress.finish(showTiming: true);
-      if (fileCount > 0) {
-        log.stdout('Fixed $fileCount files.');
+      if (dryRun) {
+        log.stdout("Running 'dart fix' without '--dry-run' would apply changes "
+            'in the following files:');
+        var files = <String>{};
+        for (var edit in edits) {
+          var file = edit.file;
+          files.add(path.relative(file, from: dir.path));
+        }
+        var paths = files.toList()..sort();
+        for (var path in paths) {
+          log.stdout(path);
+        }
+      } else {
+        progress = log.progress('Applying fixes');
+        var fileCount = await _applyFixes(edits);
+        progress.finish(showTiming: true);
+        if (fileCount > 0) {
+          log.stdout('Fixed $fileCount ${pluralize("file", fileCount)}.');
+        }
       }
     }
 
@@ -96,11 +108,3 @@
     return files.length;
   }
 }
-
-/// The [UsageEvent] for the fix command.
-class FixUsageEvent extends UsageEvent {
-  FixUsageEvent(String usagePath,
-      {String label, @required int exitCode, @required List<String> args})
-      : super(FixCommand.cmdName, usagePath,
-            label: label, exitCode: exitCode, args: args);
-}
diff --git a/pkg/dartdev/lib/src/commands/pub.dart b/pkg/dartdev/lib/src/commands/pub.dart
index c30bc61..d77dce6 100644
--- a/pkg/dartdev/lib/src/commands/pub.dart
+++ b/pkg/dartdev/lib/src/commands/pub.dart
@@ -5,15 +5,13 @@
 import 'dart:async';
 
 import 'package:args/args.dart';
-import 'package:meta/meta.dart';
 
 import '../core.dart';
-import '../events.dart';
 import '../experiments.dart';
 import '../sdk.dart';
 import '../vm_interop_handler.dart';
 
-class PubCommand extends DartdevCommand<int> {
+class PubCommand extends DartdevCommand {
   static const String cmdName = 'pub';
 
   PubCommand() : super(cmdName, 'Work with packages.');
@@ -57,26 +55,8 @@
     VmInteropHandler.run(command, args);
   }
 
-  /// Since the pub subcommands are not subclasses of DartdevCommand, we
-  /// override [usagePath] here as a special case to cover the first subcommand
-  /// under pub, i.e. we will have the path pub/cache
   @override
-  String get usagePath {
-    if (argResults == null) {
-      return name;
-    }
-    var args = argResults.arguments;
-    var cmdIndex = args.indexOf(name) ?? 0;
-    for (int i = cmdIndex + 1; i < args.length; i++) {
-      if (pubSubcommands.contains(args[i])) {
-        return '$name/${args[i]}';
-      }
-    }
-    return name;
-  }
-
-  @override
-  FutureOr<int> runImpl() async {
+  FutureOr<int> run() async {
     if (!Sdk.checkArtifactExists(sdk.pubSnapshot)) {
       return 255;
     }
@@ -106,26 +86,4 @@
     VmInteropHandler.run(command, args);
     return 0;
   }
-
-  @override
-  UsageEvent createUsageEvent(int exitCode) => PubUsageEvent(
-        usagePath,
-        exitCode: exitCode,
-        specifiedExperiments: specifiedExperiments,
-        args: argResults.arguments,
-      );
-}
-
-/// The [UsageEvent] for the pub command.
-class PubUsageEvent extends UsageEvent {
-  PubUsageEvent(String usagePath,
-      {String label,
-      @required int exitCode,
-      @required List<String> specifiedExperiments,
-      @required List<String> args})
-      : super(PubCommand.cmdName, usagePath,
-            label: label,
-            exitCode: exitCode,
-            specifiedExperiments: specifiedExperiments,
-            args: args);
 }
diff --git a/pkg/dartdev/lib/src/commands/run.dart b/pkg/dartdev/lib/src/commands/run.dart
index ae2ec2a..8d92c83 100644
--- a/pkg/dartdev/lib/src/commands/run.dart
+++ b/pkg/dartdev/lib/src/commands/run.dart
@@ -8,17 +8,16 @@
 import 'dart:io';
 
 import 'package:args/args.dart';
-import 'package:meta/meta.dart';
 import 'package:path/path.dart';
+import 'package:pub/pub.dart';
 
 import '../core.dart';
-import '../events.dart';
 import '../experiments.dart';
 import '../sdk.dart';
 import '../utils.dart';
 import '../vm_interop_handler.dart';
 
-class RunCommand extends DartdevCommand<int> {
+class RunCommand extends DartdevCommand {
   static const String cmdName = 'run';
 
   // kErrorExitCode, as defined in runtime/bin/error_exit.h
@@ -36,10 +35,7 @@
     );
   }
 
-  @override
-  final bool verbose;
-
-  RunCommand({this.verbose = false})
+  RunCommand({bool verbose = false})
       : super(
           cmdName,
           'Run a Dart program.',
@@ -104,6 +100,8 @@
         );
     }
     argParser
+      ..addMultiOption('define',
+          abbr: 'D', help: 'Defines an environment variable', hide: true)
       ..addFlag(
         'disable-service-auth-codes',
         hide: !verbose,
@@ -148,85 +146,35 @@
         negatable: false,
         help: 'Enables tracing of library and script loading.',
       );
+    addExperimentalFlags(argParser, verbose);
   }
 
   @override
   String get invocation => '${super.invocation} <dart file | package target>';
 
   @override
-  FutureOr<int> runImpl() async {
-    // The command line arguments after 'run'
-    var args = argResults.arguments.toList();
+  FutureOr<int> run() async {
+    var mainCommand = '';
+    var runArgs = <String>[];
+    if (argResults.rest.isNotEmpty) {
+      mainCommand = argResults.rest.first;
+      // The command line arguments after the command name.
+      runArgs = argResults.rest.skip(1).toList();
+    }
     // --launch-dds is provided by the VM if the VM service is to be enabled. In
     // that case, we need to launch DDS as well.
-    bool launchDds = false;
+    String launchDdsArg = argResults['launch-dds'];
     String ddsHost = '';
     String ddsPort = '';
-
-    final launchDdsArg = args.singleWhere(
-      (element) => element.startsWith('--launch-dds'),
-      orElse: () => null,
-    );
+    bool launchDds = false;
     if (launchDdsArg != null) {
       launchDds = true;
-      final ddsUrl = (launchDdsArg.split('=')[1]).split(':');
+      final ddsUrl = launchDdsArg.split(':');
       ddsHost = ddsUrl[0];
       ddsPort = ddsUrl[1];
     }
 
-    var argsContainFile = false;
-    for (var arg in args) {
-      // The arg.contains('.') matches a file name pattern, i.e. some 'foo.dart'
-      if (arg.contains('.')) {
-        argsContainFile = true;
-      } else if (!argsContainFile &&
-          (arg == '--help' || arg == '-h' || arg == 'help')) {
-        // Only print usage if a help flag is provided before the script name.
-        printUsage();
-        return 0;
-      }
-    }
-
-    var disableServiceAuthCodes =
-        argResults['disable-service-auth-codes'] ?? false;
-
-    final cwd = Directory.current;
-    if (!argsContainFile && cwd.existsSync()) {
-      var foundImplicitFileToRun = false;
-      var cwdName = cwd.name;
-      for (var entity in cwd.listSync(followLinks: false)) {
-        if (entity is Directory && entity.name == 'bin') {
-          var filesInBin =
-              entity.listSync(followLinks: false).whereType<File>();
-
-          // Search for a dart file in bin/ with the pattern foo/bin/foo.dart
-          for (var fileInBin in filesInBin) {
-            if (fileInBin.isDartFile && fileInBin.name == '$cwdName.dart') {
-              args.add('bin/${fileInBin.name}');
-              foundImplicitFileToRun = true;
-              break;
-            }
-          }
-          // break here, no actions taken on any entities that are not bin/
-          break;
-        }
-      }
-
-      if (!foundImplicitFileToRun) {
-        // This throws.
-        usageException('Could not find the implicit file to run: '
-            'bin$separator$cwdName.dart.');
-      }
-    }
-
-    // Pass any --enable-experiment options along.
-    if (args.isNotEmpty && wereExperimentsSpecified) {
-      List<String> experimentIds = specifiedExperiments;
-      args = [
-        '--$experimentFlagName=${experimentIds.join(',')}',
-        ...args,
-      ];
-    }
+    bool disableServiceAuthCodes = argResults['disable-service-auth-codes'];
 
     // If the user wants to start a debugging session we need to do some extra
     // work and spawn a Dart Development Service (DDS) instance. DDS is a VM
@@ -242,31 +190,17 @@
       }
     }
 
-    var path = args.firstWhere((e) => !e.startsWith('-'));
-    final pathIndex = args.indexOf(path);
-    final runArgs = (pathIndex + 1 == args.length)
-        ? <String>[]
-        : args.sublist(pathIndex + 1);
+    String path;
     try {
-      path = Uri.parse(path).toFilePath();
-    } catch (_) {
-      // Input path will either be a valid path or a file uri
-      // (e.g /directory/file.dart or file:///directory/file.dart). We will try
-      // parsing it as a Uri, but if parsing failed for any reason (likely
-      // because path is not a file Uri), `path` will be passed without
-      // modification to the VM.
+      path = await getExecutableForCommand(mainCommand);
+    } on CommandResolutionFailedException catch (e) {
+      log.stderr(e.message);
+      return errorExitCode;
     }
+
     VmInteropHandler.run(path, runArgs);
     return 0;
   }
-
-  @override
-  UsageEvent createUsageEvent(int exitCode) => RunUsageEvent(
-        usagePath,
-        exitCode: exitCode,
-        specifiedExperiments: specifiedExperiments,
-        args: argResults.arguments,
-      );
 }
 
 class _DebuggingSession {
@@ -315,17 +249,3 @@
     }
   }
 }
-
-/// The [UsageEvent] for the run command.
-class RunUsageEvent extends UsageEvent {
-  RunUsageEvent(String usagePath,
-      {String label,
-      @required int exitCode,
-      @required List<String> specifiedExperiments,
-      @required List<String> args})
-      : super(RunCommand.cmdName, usagePath,
-            label: label,
-            exitCode: exitCode,
-            specifiedExperiments: specifiedExperiments,
-            args: args);
-}
diff --git a/pkg/dartdev/lib/src/commands/test.dart b/pkg/dartdev/lib/src/commands/test.dart
index beba8c8..b4fe29c 100644
--- a/pkg/dartdev/lib/src/commands/test.dart
+++ b/pkg/dartdev/lib/src/commands/test.dart
@@ -5,10 +5,8 @@
 import 'dart:async';
 
 import 'package:args/args.dart';
-import 'package:meta/meta.dart';
 
 import '../core.dart';
-import '../events.dart';
 import '../experiments.dart';
 import '../sdk.dart';
 import '../vm_interop_handler.dart';
@@ -16,7 +14,7 @@
 /// Implement `dart test`.
 ///
 /// This command largely delegates to `pub run test`.
-class TestCommand extends DartdevCommand<int> {
+class TestCommand extends DartdevCommand {
   static const String cmdName = 'test';
 
   TestCommand() : super(cmdName, 'Run tests in this package.');
@@ -30,7 +28,7 @@
   }
 
   @override
-  FutureOr<int> runImpl() async {
+  FutureOr<int> run() async {
     return _runImpl(argResults.arguments.toList());
   }
 
@@ -60,11 +58,14 @@
       _printMissingDepInstructions(isHelpCommand);
       return 65;
     }
-
+    List<String> enabledExperiments = [];
+    if (!(testArgs.length == 1 && testArgs[0] == '-h')) {
+      enabledExperiments = argResults.enabledExperiments;
+    }
     final args = [
       'run',
-      if (wereExperimentsSpecified)
-        '--$experimentFlagName=${specifiedExperiments.join(',')}',
+      if (enabledExperiments.isNotEmpty)
+        '--$experimentFlagName=${enabledExperiments.join(',')}',
       'test',
       ...testArgs,
     ];
@@ -74,14 +75,6 @@
     return 0;
   }
 
-  @override
-  UsageEvent createUsageEvent(int exitCode) => TestUsageEvent(
-        usagePath,
-        exitCode: exitCode,
-        specifiedExperiments: specifiedExperiments,
-        args: argResults.arguments,
-      );
-
   void _printNoPubspecMessage(bool wasHelpCommand) {
     log.stdout('''
 No pubspec.yaml file found; please run this command from the root of your project.
@@ -130,20 +123,6 @@
   }
 }
 
-/// The [UsageEvent] for the test command.
-class TestUsageEvent extends UsageEvent {
-  TestUsageEvent(String usagePath,
-      {String label,
-      @required int exitCode,
-      @required List<String> specifiedExperiments,
-      @required List<String> args})
-      : super(TestCommand.cmdName, usagePath,
-            label: label,
-            exitCode: exitCode,
-            specifiedExperiments: specifiedExperiments,
-            args: args);
-}
-
 const String _terseHelp = 'Run tests in this package.';
 
 const String _usageHelp = 'Usage: dart test [files or directories...]';
diff --git a/pkg/dartdev/lib/src/core.dart b/pkg/dartdev/lib/src/core.dart
index 5694415..9a62f6d 100644
--- a/pkg/dartdev/lib/src/core.dart
+++ b/pkg/dartdev/lib/src/core.dart
@@ -11,8 +11,6 @@
 import 'package:cli_util/cli_logging.dart';
 import 'package:path/path.dart' as path;
 
-import 'analytics.dart';
-import 'events.dart';
 import 'experiments.dart';
 import 'sdk.dart';
 import 'utils.dart';
@@ -20,7 +18,7 @@
 Logger log;
 bool isDiagnostics = false;
 
-abstract class DartdevCommand<int> extends Command {
+abstract class DartdevCommand extends Command<int> {
   final String _name;
   final String _description;
 
@@ -42,55 +40,6 @@
   @override
   ArgParser get argParser => _argParser ??= createArgParser();
 
-  /// This method should not be overridden by subclasses, instead classes should
-  /// override [runImpl] and [createUsageEvent]. If analytics is enabled by this
-  /// command and the user, a [sendScreenView] is called to analytics, and then
-  /// after the command is run, an event is sent to analytics.
-  ///
-  /// If analytics is not enabled by this command or the user, then [runImpl] is
-  /// called and the exitCode value is returned.
-  @override
-  FutureOr<int> run() async {
-    var path = usagePath;
-    if (path != null &&
-        analyticsInstance != null &&
-        analyticsInstance.enabled) {
-      // Send the screen view to analytics
-      // ignore: unawaited_futures
-      analyticsInstance.sendScreenView(path);
-
-      // Run this command
-      var exitCode = await runImpl();
-
-      // Send the event to analytics
-      // ignore: unawaited_futures
-      createUsageEvent(exitCode)?.send(analyticsInstance);
-
-      // Finally return the exit code
-      return exitCode;
-    } else {
-      // Analytics is not enabled, run the command and return the exit code
-      return runImpl();
-    }
-  }
-
-  UsageEvent createUsageEvent(int exitCode);
-
-  FutureOr<int> runImpl();
-
-  /// The command name path to send to Google Analytics. Return null to disable
-  /// tracking of the command.
-  String get usagePath {
-    if (parent is DartdevCommand) {
-      final commandParent = parent as DartdevCommand;
-      final parentPath = commandParent.usagePath;
-      // Don't report for parents that return null for usagePath.
-      return parentPath == null ? null : '$parentPath/$name';
-    } else {
-      return name;
-    }
-  }
-
   /// Create the ArgParser instance for this command.
   ///
   /// Subclasses can override this in order to create a customized ArgParser.
@@ -98,7 +47,9 @@
       ArgParser(usageLineLength: dartdevUsageLineLength);
 
   Project get project => _project ??= Project();
+}
 
+extension DartDevCommand on Command {
   /// Return whether commands should emit verbose output.
   bool get verbose => globalResults['verbose'];
 
@@ -109,7 +60,6 @@
   bool get wereExperimentsSpecified =>
       globalResults?.wasParsed(experimentFlagName) ?? false;
 
-  /// Return the list of Dart experiment flags specified by the user.
   List<String> get specifiedExperiments => globalResults[experimentFlagName];
 }
 
diff --git a/pkg/dartdev/lib/src/events.dart b/pkg/dartdev/lib/src/events.dart
index 6cc5547..b2c936a 100644
--- a/pkg/dartdev/lib/src/events.dart
+++ b/pkg/dartdev/lib/src/events.dart
@@ -5,200 +5,82 @@
 import 'package:meta/meta.dart';
 import 'package:usage/usage.dart';
 
-import 'commands/analyze.dart';
-import 'commands/compile.dart';
-import 'commands/create.dart';
-import 'commands/fix.dart';
-import 'commands/pub.dart';
-import 'commands/run.dart';
-
-/// A list of all commands under dartdev.
-const List<String> allCommands = [
-  'help',
-  AnalyzeCommand.cmdName,
-  CreateCommand.cmdName,
-  CompileCommand.cmdName,
-  FixCommand.cmdName,
-  formatCmdName,
-  migrateCmdName,
-  PubCommand.cmdName,
-  RunCommand.cmdName,
-  'test'
-];
-
 /// The [String] identifier `dartdev`, used as the category in the events sent
 /// to analytics.
 const String _dartdev = 'dartdev';
 
-/// The [String] identifier `format`.
-const String formatCmdName = 'format';
-
-/// The [String] identifier `migrate`.
-const String migrateCmdName = 'migrate';
-
-/// The separator used to for joining the flag sets sent to analytics.
-const String _flagSeparator = ',';
-
-/// When some unknown command is used, for instance `dart foo`, the command is
-/// designated with this identifier.
-const String _unknownCommand = '<unknown>';
-
 /// The collection of custom dimensions understood by the analytics backend.
 /// When adding to this list, first ensure that the custom dimension is
 /// defined in the backend, or will be defined shortly after the relevant PR
 /// lands. The pattern here matches the flutter cli.
-enum CustomDimensions {
+enum _CustomDimensions {
   commandExitCode, // cd1
   enabledExperiments, // cd2
   commandFlags, // cd3
 }
 
-String cdKey(CustomDimensions cd) => 'cd${cd.index + 1}';
+String _cdKey(_CustomDimensions cd) => 'cd${cd.index + 1}';
 
-Map<String, String> _useCdKeys(Map<CustomDimensions, String> parameters) {
+Map<String, String> _useCdKeys(Map<_CustomDimensions, String> parameters) {
   return parameters.map(
-      (CustomDimensions k, String v) => MapEntry<String, String>(cdKey(k), v));
+    (_CustomDimensions k, String v) => MapEntry<String, String>(_cdKey(k), v),
+  );
 }
 
-/// Utilities for parsing arguments passed to dartdev.  These utilities have all
-/// been marked as static to assist with testing, see events_test.dart.
-class ArgParserUtils {
-  /// Return the first member from [args] that occurs in [allCommands],
-  /// otherwise '<unknown>' is returned.
-  ///
-  /// 'help' is special cased to have 'dart analyze help', 'dart help analyze',
-  /// and 'dart analyze --help' all be recorded as a call to 'help' instead of
-  /// 'help' and 'analyze'.
-  static String getCommandStr(List<String> args) {
-    if (args.contains('help') ||
-        args.contains('-h') ||
-        args.contains('--help')) {
-      return 'help';
-    }
-    return args.firstWhere((arg) => allCommands.contains(arg),
-        orElse: () => _unknownCommand);
-  }
-
-  /// Return true if the first character of the passed [String] is '-'.
-  static bool isFlag(String arg) => arg != null && arg.startsWith('-');
-
-  /// Returns true if and only if the passed argument equals 'help', '--help' or
-  /// '-h'.
-  static bool isHelp(String arg) =>
-      arg == 'help' || arg == '--help' || arg == '-h';
-
-  /// Given some command in args, return the set of flags after the command.
-  static List<String> parseCommandFlags(String command, List<String> args) {
-    var result = <String>[];
-    if (args == null || args.isEmpty) {
-      return result;
-    }
-
-    var indexOfCmd = args.indexOf(command);
-    if (indexOfCmd < 0) {
-      return result;
-    }
-
-    for (var i = indexOfCmd + 1; i < args.length; i++) {
-      if (!isHelp(args[i]) && isFlag(args[i])) {
-        result.add(sanitizeFlag(args[i]));
-      }
-    }
-    return result;
-  }
-
-  /// Return the passed flag, only if it is considered a flag, see [isFlag], and
-  /// if '=' is in the flag, return only the contents of the left hand side of
-  /// the '='.
-  static String sanitizeFlag(String arg) {
-    if (isFlag(arg)) {
-      if (arg.contains('=')) {
-        return arg.substring(0, arg.indexOf('='));
-      } else {
-        return arg;
-      }
-    }
-    return '';
-  }
-}
-
-/// The [UsageEvent] for the format command.
-class FormatUsageEvent extends UsageEvent {
-  FormatUsageEvent(
-      {String label, @required int exitCode, @required List<String> args})
-      : super(formatCmdName, formatCmdName,
-            label: label, exitCode: exitCode, args: args);
-}
-
-/// The [UsageEvent] for the migrate command.
-class MigrateUsageEvent extends UsageEvent {
-  MigrateUsageEvent(
-      {String label, @required int exitCode, @required List<String> args})
-      : super(migrateCmdName, migrateCmdName,
-            label: label, exitCode: exitCode, args: args);
-}
-
-/// The superclass for all dartdev events, see the [send] method to see what is
-/// sent to analytics.
-abstract class UsageEvent {
+/// Sends a usage event on [analytics].
+///
+/// [command] is the top-level command name being executed here, 'analyze' and
+/// 'pub' are examples.
+///
+/// [action] is the command, and optionally the subcommand, joined with '/',
+/// an example here is 'pub/get'.
+///
+/// [label] is not used yet used when reporting dartdev analytics, but the API
+/// is included here for possible future use.
+///
+/// [exitCode] is the exit code returned from this invocation of dartdev.
+///
+/// [specifiedExperiements] are the experiments passed into the dartdev
+/// command. If the command doesn't use the experiments, they are not reported.
+///
+/// [commandFlags] are the flags (no values) used to run this command.
+Future<void> sendUsageEvent(
+  Analytics analytics,
+  String action, {
+  String label,
+  List<String> specifiedExperiments,
+  @required int exitCode,
+  @required List<String> commandFlags,
+}) {
   /// The category stores the name of this cli tool, 'dartdev'. This matches the
   /// pattern from the flutter cli tool which always passes 'flutter' as the
   /// category.
-  final String category;
+  final category = _dartdev;
+  commandFlags =
+      commandFlags?.where((e) => e != 'enable-experiment')?.toList() ?? [];
+  specifiedExperiments = specifiedExperiments?.toList() ?? [];
 
-  /// The action is the command, and optionally the subcommand, joined with '/',
-  /// an example here is 'pub/get'. The usagePath getter in each of the
-  final String action;
+  // Sort the flag lists to slightly reduce the explosion of possibilities.
+  commandFlags..sort();
+  specifiedExperiments.sort();
 
-  /// The command name being executed here, 'analyze' and 'pub' are examples.
-  final String command;
+  // Insert a seperator before and after the flags list to make it easier to filter
+  // for a specific flag:
+  final enabledExperimentsString = ' ${specifiedExperiments.join(' ')} ';
+  final commandFlagsString = ' ${commandFlags.join(' ')} ';
 
-  /// Labels are not used yet used when reporting dartdev analytics, but the API
-  /// is included here for possible future use.
-  final String label;
-
-  /// The [String] list of arguments passed to dartdev, the list of args is not
-  /// passed back via analytics itself, but is used to compute other values such
-  /// as the [enabledExperiments] which are passed back as part of analytics.
-  final List<String> args;
-
-  /// The exit code returned from this invocation of dartdev.
-  final int exitCode;
-
-  /// A comma separated list of enabled experiments passed into the dartdev
-  /// command. If the command doesn't use the experiments, they are not reported
-  /// in the [UsageEvent].
-  final String enabledExperiments;
-
-  /// A comma separated list of flags on this commands
-  final String commandFlags;
-
-  UsageEvent(
-    this.command,
-    this.action, {
-    this.label,
-    List<String> specifiedExperiments,
-    @required this.exitCode,
-    @required this.args,
-  })  : category = _dartdev,
-        enabledExperiments = specifiedExperiments?.join(_flagSeparator),
-        commandFlags = ArgParserUtils.parseCommandFlags(command, args)
-            .join(_flagSeparator);
-
-  Future send(Analytics analytics) {
-    final Map<String, String> parameters =
-        _useCdKeys(<CustomDimensions, String>{
-      if (exitCode != null)
-        CustomDimensions.commandExitCode: exitCode.toString(),
-      if (enabledExperiments != null)
-        CustomDimensions.enabledExperiments: enabledExperiments,
-      if (commandFlags != null) CustomDimensions.commandFlags: commandFlags,
-    });
-    return analytics.sendEvent(
-      category,
-      action,
-      label: label,
-      parameters: parameters,
-    );
-  }
+  final Map<String, String> parameters = _useCdKeys(<_CustomDimensions, String>{
+    if (exitCode != null)
+      _CustomDimensions.commandExitCode: exitCode.toString(),
+    if (specifiedExperiments.isNotEmpty)
+      _CustomDimensions.enabledExperiments: enabledExperimentsString,
+    if (commandFlags.isNotEmpty)
+      _CustomDimensions.commandFlags: commandFlagsString,
+  });
+  return analytics.sendEvent(
+    category,
+    action,
+    label: label,
+    parameters: parameters,
+  );
 }
diff --git a/pkg/dartdev/lib/src/experiments.dart b/pkg/dartdev/lib/src/experiments.dart
index 3921900..36d4bd8 100644
--- a/pkg/dartdev/lib/src/experiments.dart
+++ b/pkg/dartdev/lib/src/experiments.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/src/dart/analysis/experiments.dart';
+import 'package:args/args.dart';
 
 const experimentFlagName = 'enable-experiment';
 
@@ -14,3 +15,62 @@
   features.sort((a, b) => a.enableString.compareTo(b.enableString));
   return features;
 }
+
+void addExperimentalFlags(ArgParser argParser, bool verbose) {
+  List<ExperimentalFeature> features = experimentalFeatures;
+
+  Map<String, String> allowedHelp = {};
+  for (ExperimentalFeature feature in features) {
+    String suffix =
+        feature.isEnabledByDefault ? ' (no-op - enabled by default)' : '';
+    allowedHelp[feature.enableString] = '${feature.documentation}$suffix';
+  }
+
+  argParser.addMultiOption(
+    experimentFlagName,
+    valueHelp: 'experiment',
+    allowedHelp: verbose ? allowedHelp : null,
+    help: 'Enable one or more experimental features '
+        '(see dart.dev/go/experiments).',
+    hide: !verbose,
+  );
+}
+
+extension EnabledExperimentsArg on ArgResults {
+  List<String> get enabledExperiments {
+    List<String> enabledExperiments = [];
+    // Check to see if the ArgParser which generated this result accepts
+    // --enable-experiment as an option. If so, return the result if it was
+    // provided.
+    if (options.contains(experimentFlagName)) {
+      if (wasParsed(experimentFlagName)) {
+        enabledExperiments = this[experimentFlagName];
+      }
+    } else {
+      // In the case where a command uses ArgParser.allowAnything() as its
+      // parser the valid set of options for the command isn't specified and
+      // isn't enforced. Instead, we have to manually parse the arguments to
+      // look for --enable-experiment=. Currently, this path is only taken for
+      // the pub and test commands, as well as when we are trying to send
+      // analytics.
+      final String experiments = arguments.firstWhere(
+        (e) => e.startsWith('--enable-experiment='),
+        orElse: () => null,
+      );
+      if (experiments == null) {
+        return [];
+      }
+      enabledExperiments = experiments.split('=')[1].split(',');
+    }
+
+    for (ExperimentalFeature feature in experimentalFeatures) {
+      // We allow default true flags, but complain when they are passed in.
+      if (feature.isEnabledByDefault &&
+          enabledExperiments.contains(feature.enableString)) {
+        print("'${feature.enableString}' is now enabled by default; this "
+            'flag is no longer required.');
+      }
+    }
+    return enabledExperiments;
+  }
+}
diff --git a/pkg/dartdev/pubspec.yaml b/pkg/dartdev/pubspec.yaml
index 511826b..e5b9295 100644
--- a/pkg/dartdev/pubspec.yaml
+++ b/pkg/dartdev/pubspec.yaml
@@ -20,11 +20,13 @@
   nnbd_migration:
     path: ../nnbd_migration
   path: ^1.0.0
+  pedantic: ^1.9.0
+  pub:
+    path: ../../third_party/pkg/pub
   stagehand: 3.3.7
   telemetry:
     path: ../telemetry
   usage: ^3.4.0
 
 dev_dependencies:
-  pedantic: ^1.9.0
   test: ^1.0.0
diff --git a/pkg/dartdev/test/analytics_test.dart b/pkg/dartdev/test/analytics_test.dart
index 31355df7..26d9822 100644
--- a/pkg/dartdev/test/analytics_test.dart
+++ b/pkg/dartdev/test/analytics_test.dart
@@ -2,11 +2,254 @@
 // 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:convert';
+import 'dart:io';
+
 import 'package:dartdev/src/analytics.dart';
 import 'package:test/test.dart';
 
+import 'utils.dart';
+
+List<Map> extractAnalytics(ProcessResult result) {
+  return LineSplitter.split(result.stderr)
+      .where((line) => line.startsWith('[analytics]: '))
+      .map((line) => json.decode(line.substring('[analytics]: '.length)) as Map)
+      .toList();
+}
+
 void main() {
   group('DisabledAnalytics', disabledAnalyticsObject);
+
+  group('Sending analytics', () {
+    test('help', () {
+      final p = project(logAnalytics: true);
+      final result = p.runSync('help', []);
+      expect(extractAnalytics(result), [
+        {
+          'hitType': 'screenView',
+          'message': {'viewName': 'help'}
+        },
+        {
+          'hitType': 'event',
+          'message': {
+            'category': 'dartdev',
+            'action': 'help',
+            'label': null,
+            'value': null
+          }
+        },
+        {
+          'hitType': 'timing',
+          'message': {
+            'variableName': 'help',
+            'time': isA<int>(),
+            'category': 'commands',
+            'label': null
+          }
+        }
+      ]);
+    });
+    test('create', () {
+      final p = project(logAnalytics: true);
+      final result = p.runSync('create', ['-tpackage-simple', 'name']);
+      expect(extractAnalytics(result), [
+        {
+          'hitType': 'screenView',
+          'message': {'viewName': 'create'}
+        },
+        {
+          'hitType': 'event',
+          'message': {
+            'category': 'dartdev',
+            'action': 'create',
+            'label': null,
+            'value': null,
+            'cd1': '0',
+            'cd3': ' template ',
+          }
+        },
+        {
+          'hitType': 'timing',
+          'message': {
+            'variableName': 'create',
+            'time': isA<int>(),
+            'category': 'commands',
+            'label': null
+          }
+        }
+      ]);
+    });
+
+    test('pub get', () {
+      final p = project(logAnalytics: true);
+      final result = p.runSync('pub', ['get', '--dry-run']);
+      expect(extractAnalytics(result), [
+        {
+          'hitType': 'screenView',
+          'message': {'viewName': 'pub/get'}
+        },
+        {
+          'hitType': 'event',
+          'message': {
+            'category': 'dartdev',
+            'action': 'pub/get',
+            'label': null,
+            'value': null,
+            'cd1': '0',
+            'cd3': ' dry-run '
+          }
+        },
+        {
+          'hitType': 'timing',
+          'message': {
+            'variableName': 'pub/get',
+            'time': isA<int>(),
+            'category': 'commands',
+            'label': null
+          }
+        }
+      ]);
+    });
+
+    test('format', () {
+      final p = project(logAnalytics: true);
+      final result = p.runSync('format', ['-l80']);
+      expect(extractAnalytics(result), [
+        {
+          'hitType': 'screenView',
+          'message': {'viewName': 'format'}
+        },
+        {
+          'hitType': 'event',
+          'message': {
+            'category': 'dartdev',
+            'action': 'format',
+            'label': null,
+            'value': null,
+            'cd1': '0',
+            'cd3': ' line-length ',
+          }
+        },
+        {
+          'hitType': 'timing',
+          'message': {
+            'variableName': 'format',
+            'time': isA<int>(),
+            'category': 'commands',
+            'label': null
+          }
+        }
+      ]);
+    });
+
+    test('run', () {
+      final p = project(
+          mainSrc: 'void main(List<String> args) => print(args)',
+          logAnalytics: true);
+      final result = p.runSync('run', [
+        '--no-pause-isolates-on-exit',
+        '--enable-asserts',
+        'lib/main.dart',
+        '--argument'
+      ]);
+      expect(extractAnalytics(result), [
+        {
+          'hitType': 'screenView',
+          'message': {'viewName': 'run'}
+        },
+        {
+          'hitType': 'event',
+          'message': {
+            'category': 'dartdev',
+            'action': 'run',
+            'label': null,
+            'value': null,
+            'cd1': '0',
+            'cd3': ' enable-asserts pause-isolates-on-exit ',
+          }
+        },
+        {
+          'hitType': 'timing',
+          'message': {
+            'variableName': 'run',
+            'time': isA<int>(),
+            'category': 'commands',
+            'label': null
+          }
+        }
+      ]);
+    });
+
+    test('run --enable-experiments', () {
+      final p = project(
+          mainSrc: 'void main(List<String> args) => print(args);',
+          logAnalytics: true);
+      final result = p.runSync('run', [
+        '--enable-experiment=non-nullable',
+        'lib/main.dart',
+      ]);
+      expect(extractAnalytics(result), [
+        {
+          'hitType': 'screenView',
+          'message': {'viewName': 'run'}
+        },
+        {
+          'hitType': 'event',
+          'message': {
+            'category': 'dartdev',
+            'action': 'run',
+            'label': null,
+            'value': null,
+            'cd1': '0',
+            'cd2': ' non-nullable ',
+          }
+        },
+        {
+          'hitType': 'timing',
+          'message': {
+            'variableName': 'run',
+            'time': isA<int>(),
+            'category': 'commands',
+            'label': null
+          }
+        }
+      ]);
+    });
+
+    test('compile', () {
+      final p = project(
+          mainSrc: 'void main(List<String> args) => print(args);',
+          logAnalytics: true);
+      final result = p
+          .runSync('compile', ['kernel', 'lib/main.dart', '-o', 'main.kernel']);
+      expect(extractAnalytics(result), [
+        {
+          'hitType': 'screenView',
+          'message': {'viewName': 'compile/kernel'}
+        },
+        {
+          'hitType': 'event',
+          'message': {
+            'category': 'dartdev',
+            'action': 'compile/kernel',
+            'label': null,
+            'value': null,
+            'cd1': '0',
+            'cd3': ' output ',
+          }
+        },
+        {
+          'hitType': 'timing',
+          'message': {
+            'variableName': 'compile/kernel',
+            'time': isA<int>(),
+            'category': 'commands',
+            'label': null
+          }
+        }
+      ]);
+    });
+  });
 }
 
 void disabledAnalyticsObject() {
diff --git a/pkg/dartdev/test/commands/analyze_test.dart b/pkg/dartdev/test/commands/analyze_test.dart
index f7791c2..2d88b65 100644
--- a/pkg/dartdev/test/commands/analyze_test.dart
+++ b/pkg/dartdev/test/commands/analyze_test.dart
@@ -164,7 +164,7 @@
   });
 
   test('info implicit no --fatal-infos', () {
-    p = project(mainSrc: 'String foo() {}');
+    p = project(mainSrc: dartVersionFilePrefix2_9 + 'String foo() {}');
     var result = p.runSync('analyze', [p.dirPath]);
 
     expect(result.exitCode, 0);
@@ -173,7 +173,7 @@
   });
 
   test('info --fatal-infos', () {
-    p = project(mainSrc: 'String foo() {}');
+    p = project(mainSrc: dartVersionFilePrefix2_9 + 'String foo() {}');
     var result = p.runSync('analyze', ['--fatal-infos', p.dirPath]);
 
     expect(result.exitCode, 1);
diff --git a/pkg/dartdev/test/commands/fix_test.dart b/pkg/dartdev/test/commands/fix_test.dart
index 4da8ddb..5450742 100644
--- a/pkg/dartdev/test/commands/fix_test.dart
+++ b/pkg/dartdev/test/commands/fix_test.dart
@@ -2,6 +2,8 @@
 // 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';
+
 import 'package:test/test.dart';
 
 import '../utils.dart';
@@ -11,5 +13,110 @@
 }
 
 void defineFix() {
-  // todo (pq): add tests when the `fix` command is enabled.
+  TestProject p;
+
+  setUp(() => p = null);
+
+  tearDown(() => p?.dispose());
+
+  test('none', () {
+    p = project(mainSrc: 'int get foo => 1;\n');
+    var result = p.runSync('fix', [p.dirPath]);
+    expect(result.exitCode, 0);
+    expect(result.stderr, isEmpty);
+    expect(result.stdout, contains('Nothing to fix!'));
+  });
+
+  test('no args', () {
+    p = project(
+      mainSrc: '''
+var x = "";
+''',
+      analysisOptions: '''
+linter:
+  rules:
+    - prefer_single_quotes
+''',
+    );
+    var result = p.runSync('fix', [], workingDir: p.dirPath);
+    expect(result.exitCode, 0);
+    expect(result.stderr, isEmpty);
+    expect(result.stdout, contains('Fixed 1 file.'));
+  });
+
+  test('dry-run', () {
+    p = project(
+      mainSrc: '''
+var x = "";
+''',
+      analysisOptions: '''
+linter:
+  rules:
+    - prefer_single_quotes
+''',
+    );
+    var result = p.runSync('fix', ['--dry-run', '.'], workingDir: p.dirPath);
+    expect(result.exitCode, 0);
+    expect(result.stderr, isEmpty);
+    expect(
+        result.stdout,
+        contains("Running 'dart fix' without '--dry-run' "
+            'would apply changes in the following files:'));
+    expect(result.stdout, contains('lib${Platform.pathSeparator}main.dart'));
+  });
+
+  test('.', () {
+    p = project(
+      mainSrc: '''
+var x = "";
+''',
+      analysisOptions: '''
+linter:
+  rules:
+    - prefer_single_quotes
+''',
+    );
+    var result = p.runSync('fix', ['.'], workingDir: p.dirPath);
+    expect(result.exitCode, 0);
+    expect(result.stderr, isEmpty);
+    expect(result.stdout, contains('Fixed 1 file.'));
+  });
+
+  test('excludes', () {
+    p = project(
+      mainSrc: '''
+var x = "";
+''',
+      analysisOptions: '''
+analyzer:
+  exclude:
+    - lib/**
+linter:
+  rules:
+    - prefer_single_quotes
+''',
+    );
+    var result = p.runSync('fix', ['.'], workingDir: p.dirPath);
+    expect(result.exitCode, 0);
+    expect(result.stderr, isEmpty);
+    expect(result.stdout, contains('Nothing to fix!'));
+  });
+
+  test('ignores', () {
+    p = project(
+      mainSrc: '''
+// ignore: prefer_single_quotes
+var x = "";
+''',
+      analysisOptions: '''
+linter:
+  rules:
+    - prefer_single_quotes
+''',
+    );
+    var result = p.runSync('fix', ['.'], workingDir: p.dirPath);
+    expect(result.exitCode, 0);
+    expect(result.stderr, isEmpty);
+    expect(result.stdout, contains('Nothing to fix!'));
+  });
 }
diff --git a/pkg/dartdev/test/commands/flag_test.dart b/pkg/dartdev/test/commands/flag_test.dart
index 1e887b1..6416ffc 100644
--- a/pkg/dartdev/test/commands/flag_test.dart
+++ b/pkg/dartdev/test/commands/flag_test.dart
@@ -4,9 +4,9 @@
 
 import 'dart:io';
 
-import 'package:args/args.dart';
 import 'package:args/command_runner.dart';
 import 'package:dartdev/dartdev.dart';
+import 'package:dartdev/src/analytics.dart' show disabledAnalytics;
 import 'package:test/test.dart';
 
 import '../utils.dart';
@@ -20,7 +20,7 @@
   // For each command description, assert that the values are not empty, don't
   // have trailing white space and end with a period.
   test('description formatting', () {
-    DartdevRunner(['--disable-dartdev-analytics'])
+    DartdevRunner(['--disable-dartdev-analytics'], disabledAnalytics)
         .commands
         .forEach((String commandKey, Command command) {
       expect(commandKey, isNotEmpty);
@@ -32,7 +32,7 @@
 
   // Assert that all found usageLineLengths are the same and null
   test('argParser usageLineLength', () {
-    DartdevRunner(['--disable-dartdev-analytics'])
+    DartdevRunner(['--disable-dartdev-analytics'], disabledAnalytics)
         .commands
         .forEach((String commandKey, Command command) {
       if (command.argParser != null) {
@@ -42,23 +42,17 @@
             command.name != 'pub') {
           expect(command.argParser.usageLineLength,
               stdout.hasTerminal ? stdout.terminalColumns : null);
+        } else if (command.name == 'pub') {
+          // TODO(sigurdm): Avoid special casing here.
+          // https://github.com/dart-lang/pub/issues/2700
+          expect(command.argParser.usageLineLength,
+              stdout.hasTerminal ? stdout.terminalColumns : 80);
         } else {
           expect(command.argParser.usageLineLength, isNull);
         }
       }
     });
   });
-
-  test('enable experiments flag is supported', () {
-    final args = [
-      '--disable-dartdev-analytics',
-      '--enable-experiment=non-nullable'
-    ];
-    final runner = DartdevRunner(args);
-    ArgResults results = runner.parse(args);
-    expect(results['enable-experiment'], isNotEmpty);
-    expect(results['enable-experiment'].first, 'non-nullable');
-  });
 }
 
 void help() {
diff --git a/pkg/dartdev/test/commands/help_test.dart b/pkg/dartdev/test/commands/help_test.dart
index 2cc0bfb..c272e43 100644
--- a/pkg/dartdev/test/commands/help_test.dart
+++ b/pkg/dartdev/test/commands/help_test.dart
@@ -4,6 +4,7 @@
 
 import 'package:args/command_runner.dart';
 import 'package:dartdev/dartdev.dart';
+import 'package:dartdev/src/analytics.dart' show disabledAnalytics;
 import 'package:test/test.dart';
 
 import '../utils.dart';
@@ -21,7 +22,7 @@
   List<String> _commandsNotTested = <String>[
     'help', // `dart help help` is redundant
   ];
-  DartdevRunner(['--disable-dartdev-analytics'])
+  DartdevRunner(['--disable-dartdev-analytics'], disabledAnalytics)
       .commands
       .forEach((String commandKey, Command command) {
     if (!_commandsNotTested.contains(commandKey)) {
@@ -36,17 +37,17 @@
     }
   });
 
-  test('(help pub == pub help)', () {
+  test('(help pub == pub --help)', () {
     p = project();
     var result = p.runSync('help', ['pub']);
-    var pubHelpResult = p.runSync('pub', ['help']);
+    var pubHelpResult = p.runSync('pub', ['--help']);
 
     expect(result.stdout, contains(pubHelpResult.stdout));
     expect(result.stderr, contains(pubHelpResult.stderr));
   });
 
   test('(--help flags also have -h abbr)', () {
-    DartdevRunner(['--disable-dartdev-analytics'])
+    DartdevRunner(['--disable-dartdev-analytics'], disabledAnalytics)
         .commands
         .forEach((String commandKey, Command command) {
       var helpOption = command.argParser.options['help'];
diff --git a/pkg/dartdev/test/commands/migrate_test.dart b/pkg/dartdev/test/commands/migrate_test.dart
index a0df79e..307c85a 100644
--- a/pkg/dartdev/test/commands/migrate_test.dart
+++ b/pkg/dartdev/test/commands/migrate_test.dart
@@ -31,7 +31,7 @@
   });
 
   test('directory implicit', () {
-    p = project(mainSrc: 'int get foo => 1;\n');
+    p = project(mainSrc: dartVersionFilePrefix2_9 + 'int get foo => 1;\n');
     var result =
         p.runSync('migrate', ['--no-web-preview'], workingDir: p.dirPath);
     expect(result.exitCode, 0);
@@ -40,7 +40,7 @@
   });
 
   test('directory explicit', () {
-    p = project(mainSrc: 'int get foo => 1;\n');
+    p = project(mainSrc: dartVersionFilePrefix2_9 + 'int get foo => 1;\n');
     var result = p.runSync('migrate', ['--no-web-preview', p.dirPath]);
     expect(result.exitCode, 0);
     expect(result.stderr, isEmpty);
diff --git a/pkg/dartdev/test/commands/pub_test.dart b/pkg/dartdev/test/commands/pub_test.dart
index 7f2ca78..82f00d0 100644
--- a/pkg/dartdev/test/commands/pub_test.dart
+++ b/pkg/dartdev/test/commands/pub_test.dart
@@ -20,13 +20,18 @@
   void _assertPubHelpInvoked(ProcessResult result) {
     expect(result, isNotNull);
     expect(result.exitCode, 0);
-    expect(result.stdout, contains('Pub is a package manager for Dart'));
-    expect(result.stdout, contains('Available commands:'));
+    expect(result.stdout, contains('Work with packages'));
+    expect(result.stdout, contains('Available subcommands:'));
     expect(result.stderr, isEmpty);
   }
 
   test('implicit --help', () {
-    _assertPubHelpInvoked(project().runSync('pub', []));
+    final result = project().runSync('pub', []);
+    expect(result, isNotNull);
+    expect(result.exitCode, 64);
+    expect(result.stderr, contains('Missing subcommand for "dart pub".'));
+    expect(result.stderr, contains('Available subcommands:'));
+    expect(result.stdout, isEmpty);
   });
 
   test('--help', () {
@@ -39,7 +44,7 @@
 
   test('help cache', () {
     p = project();
-    var result = p.runSync('pub', ['help', 'cache']);
+    var result = p.runSync('help', ['pub', 'cache']);
     var result2 = p.runSync('pub', ['cache', '--help']);
 
     expect(result.exitCode, 0);
@@ -53,7 +58,7 @@
 
   test('help publish', () {
     p = project();
-    var result = p.runSync('pub', ['help', 'publish']);
+    var result = p.runSync('help', ['pub', 'publish']);
     var result2 = p.runSync('pub', ['publish', '--help']);
 
     expect(result.exitCode, 0);
@@ -66,42 +71,24 @@
     expect(result.stderr, result2.stderr);
   });
 
-  test('--enable-experiment pub run', () {
+  test('run --enable-experiment', () {
     p = project();
     p.file('bin/main.dart',
-        "void main() { int a; a = null; print('a is \$a.'); }");
+        "void main() { int? a; a = null; print('a is \$a.'); }");
 
     // run 'pub get'
     p.runSync('pub', ['get']);
 
     var result = p.runSync(
-        '--enable-experiment=non-nullable', ['pub', 'run', 'main.dart']);
+        'pub', ['run', '--enable-experiment=no-non-nullable', 'main.dart']);
 
     expect(result.exitCode, 254);
     expect(result.stdout, isEmpty);
     expect(
         result.stderr,
-        contains("A value of type 'Null' can't be assigned to a variable of "
-            "type 'int'"));
-  });
-
-  test('pub run --enable-experiment', () {
-    p = project();
-    p.file('bin/main.dart',
-        "void main() { int a; a = null; print('a is \$a.'); }");
-
-    // run 'pub get'
-    p.runSync('pub', ['get']);
-
-    var result = p.runSync(
-        'pub', ['run', '--enable-experiment=non-nullable', 'main.dart']);
-
-    expect(result.exitCode, 254);
-    expect(result.stdout, isEmpty);
-    expect(
-        result.stderr,
-        contains("A value of type 'Null' can't be assigned to a variable of "
-            "type 'int'"));
+        contains('bin/main.dart:1:18: Error: This requires the null safety '
+            'language feature, which requires language version of 2.12 or '
+            'higher.\n'));
   });
 
   test('failure', () {
diff --git a/pkg/dartdev/test/commands/run_test.dart b/pkg/dartdev/test/commands/run_test.dart
index fc444ae..e1b441e 100644
--- a/pkg/dartdev/test/commands/run_test.dart
+++ b/pkg/dartdev/test/commands/run_test.dart
@@ -37,20 +37,6 @@
     expect(result.exitCode, 0);
   });
 
-  test('--enable-experiment', () {
-    p = project();
-    p.file('main.dart', "void main() { int a; a = null; print('a is \$a.'); }");
-    var result =
-        p.runSync('--enable-experiment=non-nullable', ['run', 'main.dart']);
-
-    expect(result.exitCode, 254);
-    expect(result.stdout, isEmpty);
-    expect(
-        result.stderr,
-        contains("A value of type 'Null' can't be assigned to a variable of "
-            "type 'int'"));
-  });
-
   test('no such file', () {
     p = project(mainSrc: "void main() { print('Hello World'); }");
     ProcessResult result =
@@ -79,16 +65,18 @@
     ProcessResult result = p.runSync('run', []);
 
     expect(result.stdout, isEmpty);
-    expect(result.stderr,
-        contains('Could not find the implicit file to run: bin'));
-    expect(result.exitCode, 64);
+    expect(
+        result.stderr,
+        contains(
+            'Could not find `bin/dartdev_temp.dart` in package `dartdev_temp`.'));
+    expect(result.exitCode, 255);
   });
 
   test('arguments are properly passed', () {
     p = project();
     p.file('main.dart', 'void main(args) { print(args); }');
     ProcessResult result = p.runSync('run', [
-      '--enable-experiment=non-nullable',
+      '--enable-experiment=triple-shift',
       'main.dart',
       'argument1',
       'argument2',
@@ -106,7 +94,7 @@
     // Test with absolute path
     final name = path.join(p.dirPath, 'main.dart');
     final result = p.runSync('run', [
-      '--enable-experiment=non-nullable',
+      '--enable-experiment=triple-shift',
       name,
       '--argument1',
       'argument2',
@@ -124,7 +112,6 @@
     // Test with File uri
     final name = path.join(p.dirPath, 'main.dart');
     final result = p.runSync('run', [
-      '--enable-experiment=non-nullable',
       Uri.file(name).toString(),
       '--argument1',
       'argument2',
@@ -154,12 +141,13 @@
       '--no-pause-isolates-on-start',
       '--no-pause-isolates-on-exit',
       '--no-pause-isolates-on-unhandled-exceptions',
+      '-Dfoo=bar',
       p.relativeFilePath,
     ]);
     expect(
       result.stdout,
       matches(
-          r'Observatory listening on http://127.0.0.1:8181/[a-zA-Z0-9]+=/\n.*'),
+          r'Observatory listening on http:\/\/127.0.0.1:8181\/[a-zA-Z0-9_-]+=\/\n.*'),
     );
     expect(result.stderr, isEmpty);
     expect(result.exitCode, 0);
@@ -173,6 +161,7 @@
       '--no-pause-isolates-on-exit',
       '--no-pause-isolates-on-unhandled-exceptions',
       '--disable-service-auth-codes',
+      '-Dfoo=bar',
       p.relativeFilePath,
     ]);
 
@@ -234,4 +223,18 @@
     expect(result.stderr, contains('Unhandled exception'));
     expect(result.exitCode, 255);
   });
+
+  test('does not interpret VM flags provided after script', () async {
+    p = project(mainSrc: 'void main() { assert(false); }');
+
+    // Any VM flags passed after the script shouldn't be interpreted by the VM.
+    ProcessResult result = p.runSync('run', [
+      p.relativeFilePath,
+      '--enable-asserts',
+    ]);
+
+    expect(result.stdout, isEmpty);
+    expect(result.stderr, isEmpty);
+    expect(result.exitCode, 0);
+  });
 }
diff --git a/pkg/dartdev/test/commands/test_test.dart b/pkg/dartdev/test/commands/test_test.dart
index ef2ae06..cf7aea9 100644
--- a/pkg/dartdev/test/commands/test_test.dart
+++ b/pkg/dartdev/test/commands/test_test.dart
@@ -69,7 +69,11 @@
 
   test('no package:test dependency', () {
     p = project(mainSrc: 'int get foo => 1;\n');
-    p.file('pubspec.yaml', 'name: ${p.name}\n');
+    p.file('pubspec.yaml', '''
+name: ${p.name}
+environment:
+  sdk: '>=2.10.0 <3.0.0'
+''');
 
     var result = p.runSync('pub', ['get']);
     expect(result.exitCode, 0);
@@ -85,6 +89,8 @@
   test('has package:test dependency', () {
     p = project(mainSrc: 'int get foo => 1;\n');
     p.file('test/foo_test.dart', '''
+$dartVersionFilePrefix2_9
+
 import 'package:test/test.dart';
 
 void main() {
diff --git a/pkg/dartdev/test/core_test.dart b/pkg/dartdev/test/core_test.dart
index 0944f88..5f49133 100644
--- a/pkg/dartdev/test/core_test.dart
+++ b/pkg/dartdev/test/core_test.dart
@@ -9,7 +9,6 @@
 import 'package:dartdev/src/commands/compile.dart';
 import 'package:dartdev/src/commands/create.dart';
 import 'package:dartdev/src/commands/fix.dart';
-import 'package:dartdev/src/commands/pub.dart';
 import 'package:dartdev/src/commands/run.dart';
 import 'package:dartdev/src/commands/test.dart';
 import 'package:dartdev/src/core.dart';
@@ -26,14 +25,13 @@
 
 void _dartdevCommand() {
   void _assertDartdevCommandProperties(
-      DartdevCommand command, String name, String usagePath,
+      DartdevCommand command, String name, String expectedUsagePath,
       [int subcommandCount = 0]) {
     expect(command, isNotNull);
     expect(command.name, name);
     expect(command.description, isNotEmpty);
     expect(command.project, isNotNull);
     expect(command.argParser, isNotNull);
-    expect(command.usagePath, usagePath);
     expect(command.subcommands.length, subcommandCount);
   }
 
@@ -82,12 +80,8 @@
     _assertDartdevCommandProperties(FixCommand(), 'fix', 'fix');
   });
 
-  test('pub', () {
-    _assertDartdevCommandProperties(PubCommand(), 'pub', 'pub');
-  });
-
   test('run', () {
-    _assertDartdevCommandProperties(RunCommand(), 'run', 'run');
+    _assertDartdevCommandProperties(RunCommand(verbose: false), 'run', 'run');
   });
 
   test('test', () {
diff --git a/pkg/dartdev/test/events_test.dart b/pkg/dartdev/test/events_test.dart
deleted file mode 100644
index c39e7c4..0000000
--- a/pkg/dartdev/test/events_test.dart
+++ /dev/null
@@ -1,130 +0,0 @@
-// Copyright (c) 2020, 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:dartdev/dartdev.dart';
-import 'package:dartdev/src/events.dart';
-import 'package:test/test.dart';
-
-void main() {
-  group('ArgParserUtils', _argParserUtils);
-  group('event constant', _constants);
-}
-
-void _argParserUtils() {
-  test('getCommandStr help', () {
-    expect(ArgParserUtils.getCommandStr(['help']), 'help');
-    expect(ArgParserUtils.getCommandStr(['analyze', 'help']), 'help');
-    expect(ArgParserUtils.getCommandStr(['help', 'analyze']), 'help');
-    expect(ArgParserUtils.getCommandStr(['analyze', '-h']), 'help');
-    expect(ArgParserUtils.getCommandStr(['analyze', '--help']), 'help');
-  });
-
-  test('getCommandStr command', () {
-    expect(ArgParserUtils.getCommandStr(['analyze']), 'analyze');
-    expect(ArgParserUtils.getCommandStr(['analyze', 'foo']), 'analyze');
-    expect(ArgParserUtils.getCommandStr(['foo', 'bar']), '<unknown>');
-    expect(ArgParserUtils.getCommandStr([]), '<unknown>');
-    expect(ArgParserUtils.getCommandStr(['']), '<unknown>');
-  });
-
-  test('isHelp false', () {
-    expect(ArgParserUtils.isHelp(null), isFalse);
-    expect(ArgParserUtils.isHelp(''), isFalse);
-    expect(ArgParserUtils.isHelp(' '), isFalse);
-    expect(ArgParserUtils.isHelp('-help'), isFalse);
-    expect(ArgParserUtils.isHelp('--HELP'), isFalse);
-    expect(ArgParserUtils.isHelp('--Help'), isFalse);
-    expect(ArgParserUtils.isHelp('Help'), isFalse);
-    expect(ArgParserUtils.isHelp('HELP'), isFalse);
-    expect(ArgParserUtils.isHelp('foo'), isFalse);
-  });
-
-  test('isHelp true', () {
-    expect(ArgParserUtils.isHelp('help'), isTrue);
-    expect(ArgParserUtils.isHelp('--help'), isTrue);
-    expect(ArgParserUtils.isHelp('-h'), isTrue);
-  });
-
-  test('isFlag false', () {
-    expect(ArgParserUtils.isFlag(null), isFalse);
-    expect(ArgParserUtils.isFlag(''), isFalse);
-    expect(ArgParserUtils.isFlag(' '), isFalse);
-    expect(ArgParserUtils.isFlag('help'), isFalse);
-    expect(ArgParserUtils.isFlag('_flag'), isFalse);
-  });
-
-  test('isFlag true', () {
-    expect(ArgParserUtils.isFlag('-'), isTrue);
-    expect(ArgParserUtils.isFlag('--'), isTrue);
-    expect(ArgParserUtils.isFlag('--flag'), isTrue);
-    expect(ArgParserUtils.isFlag('--help'), isTrue);
-    expect(ArgParserUtils.isFlag('-h'), isTrue);
-  });
-
-  test('parseCommandFlags analyze', () {
-    expect(
-        ArgParserUtils.parseCommandFlags('analyze', [
-          '-g',
-          'analyze',
-        ]),
-        <String>[]);
-    expect(
-        ArgParserUtils.parseCommandFlags('analyze', [
-          '-g',
-          'analyze',
-          '--one',
-          '--two',
-          '--three=bar',
-          '-f',
-          '--fatal-infos',
-          '-h',
-          'five'
-        ]),
-        <String>['--one', '--two', '--three', '-f', '--fatal-infos']);
-  });
-
-  test('parseCommandFlags trivial', () {
-    expect(ArgParserUtils.parseCommandFlags('foo', []), <String>[]);
-    expect(ArgParserUtils.parseCommandFlags('foo', ['']), <String>[]);
-    expect(
-        ArgParserUtils.parseCommandFlags('foo', ['bar', '-flag']), <String>[]);
-    expect(
-        ArgParserUtils.parseCommandFlags('foo', ['--global', 'bar', '-flag']),
-        <String>[]);
-    expect(ArgParserUtils.parseCommandFlags('foo', ['--global', 'fo', '-flag']),
-        <String>[]);
-    expect(
-        ArgParserUtils.parseCommandFlags('foo', ['--global', 'FOO', '-flag']),
-        <String>[]);
-  });
-
-  test('parseCommandFlags exclude help', () {
-    expect(
-        ArgParserUtils.parseCommandFlags(
-            'analyze', ['-g', 'analyze', '--flag', '--help']),
-        <String>['--flag']);
-    expect(
-        ArgParserUtils.parseCommandFlags(
-            'analyze', ['-g', 'analyze', '--flag', '-h']),
-        <String>['--flag']);
-    expect(
-        ArgParserUtils.parseCommandFlags(
-            'analyze', ['-g', 'analyze', '--flag', 'help']),
-        <String>['--flag']);
-  });
-
-  test('sanitizeFlag', () {
-    expect(ArgParserUtils.sanitizeFlag(null), '');
-    expect(ArgParserUtils.sanitizeFlag(''), '');
-    expect(ArgParserUtils.sanitizeFlag('foo'), '');
-    expect(ArgParserUtils.sanitizeFlag('--foo'), '--foo');
-    expect(ArgParserUtils.sanitizeFlag('--foo=bar'), '--foo');
-  });
-}
-
-void _constants() {
-  test('allCommands', () {
-    expect(allCommands, DartdevRunner([]).commands.keys.toList());
-  });
-}
diff --git a/pkg/dartdev/test/smoke/implicit_smoke_test.dart b/pkg/dartdev/test/smoke/implicit_smoke_test.dart
index 95053da..0f58378 100644
--- a/pkg/dartdev/test/smoke/implicit_smoke_test.dart
+++ b/pkg/dartdev/test/smoke/implicit_smoke_test.dart
@@ -24,9 +24,9 @@
               script,
             ],
           );
-          expect(result.exitCode, 0);
-          expect(result.stdout, contains('Smoke test!'));
           expect(result.stderr, isEmpty);
+          expect(result.stdout, contains('Smoke test!'));
+          expect(result.exitCode, 0);
         }
       });
 
@@ -44,9 +44,9 @@
               script,
             ],
           );
-          expect(result.exitCode, 0);
-          expect(result.stdout, contains('Smoke test!'));
           expect(result.stderr, isEmpty);
+          expect(result.stdout, contains('Smoke test!'));
+          expect(result.exitCode, 0);
         }
       });
     },
diff --git a/pkg/dartdev/test/smoke/smoke_test.dart b/pkg/dartdev/test/smoke/smoke_test.dart
index cb07f32..17abdc3 100644
--- a/pkg/dartdev/test/smoke/smoke_test.dart
+++ b/pkg/dartdev/test/smoke/smoke_test.dart
@@ -25,9 +25,9 @@
               script,
             ],
           );
-          expect(result.exitCode, 0);
-          expect(result.stdout, contains('Smoke test!'));
           expect(result.stderr, isEmpty);
+          expect(result.stdout, contains('Smoke test!'));
+          expect(result.exitCode, 0);
         }
       });
 
@@ -45,27 +45,48 @@
               script,
             ],
           );
-          expect(result.exitCode, 0);
-          expect(result.stdout, contains('Smoke test!'));
           expect(result.stderr, isEmpty);
+          expect(result.stdout, contains('Smoke test!'));
+          expect(result.exitCode, 0);
         }
       });
 
+      // This test verifies that an error isn't thrown when a valid experiment
+      // is passed.
+      // Experiments are lists here:
+      // https://github.com/dart-lang/sdk/blob/master/tools/experimental_features.yaml
       test(
-          'dart --sound-null-safety --enable-experiment=non-nullable '
+          'dart --enable-experiment=variance '
           'run smoke.dart', () async {
         final result = await Process.run(
           Platform.executable,
           [
-            '--sound-null-safety',
-            '--enable-experiment=non-nullable',
+            '--enable-experiment=variance',
             'run',
             script,
           ],
         );
-        expect(result.exitCode, 0);
-        expect(result.stdout, contains('Smoke test!'));
         expect(result.stderr, isEmpty);
+        expect(result.stdout, contains('Smoke test!'));
+        expect(result.exitCode, 0);
+      });
+
+      // This test verifies that an error is thrown when an invalid experiment
+      // is passed.
+      test(
+          'dart --enable-experiment=invalid-experiment-name '
+          'run smoke.dart', () async {
+        final result = await Process.run(
+          Platform.executable,
+          [
+            '--enable-experiment=invalid-experiment-name',
+            'run',
+            script,
+          ],
+        );
+        expect(result.stderr, isNotEmpty);
+        expect(result.stdout, isEmpty);
+        expect(result.exitCode, 254);
       });
     },
     timeout: Timeout.none,
diff --git a/pkg/dartdev/test/test_all.dart b/pkg/dartdev/test/test_all.dart
index ca092a4..291bd05 100644
--- a/pkg/dartdev/test/test_all.dart
+++ b/pkg/dartdev/test/test_all.dart
@@ -17,9 +17,11 @@
 import 'commands/run_test.dart' as run;
 import 'commands/test_test.dart' as test;
 import 'core_test.dart' as core;
-import 'events_test.dart' as events;
 import 'experiments_test.dart' as experiments;
 import 'sdk_test.dart' as sdk;
+import 'smoke/implicit_smoke_test.dart' as implicit_smoke;
+import 'smoke/invalid_smoke_test.dart' as invalid_smoke;
+import 'smoke/smoke_test.dart' as smoke;
 import 'utils_test.dart' as utils;
 
 void main() {
@@ -27,12 +29,13 @@
     analytics.main();
     analyze.main();
     create.main();
-    events.main();
     experiments.main();
     fix.main();
     flag.main();
     format.main();
     help.main();
+    implicit_smoke.main();
+    invalid_smoke.main();
     migrate.main();
     pub.main();
     run.main();
@@ -40,6 +43,7 @@
     test.main();
     core.main();
     sdk.main();
+    smoke.main();
     utils.main();
   });
 }
diff --git a/pkg/dartdev/test/utils.dart b/pkg/dartdev/test/utils.dart
index 513f2dc..bbc46df 100644
--- a/pkg/dartdev/test/utils.dart
+++ b/pkg/dartdev/test/utils.dart
@@ -12,8 +12,16 @@
 /// invocation requires the VM to compile the entire dependency graph.
 const Timeout longTimeout = Timeout(Duration(minutes: 5));
 
-TestProject project({String mainSrc, String analysisOptions}) =>
-    TestProject(mainSrc: mainSrc, analysisOptions: analysisOptions);
+/// This version of dart is the last guaranteed pre-null safety language
+/// version:
+const String dartVersionFilePrefix2_9 = '// @dart = 2.9\n';
+
+TestProject project(
+        {String mainSrc, String analysisOptions, bool logAnalytics = false}) =>
+    TestProject(
+        mainSrc: mainSrc,
+        analysisOptions: analysisOptions,
+        logAnalytics: logAnalytics);
 
 class TestProject {
   static String get defaultProjectName => 'dartdev_temp';
@@ -26,9 +34,22 @@
 
   String get relativeFilePath => 'lib/main.dart';
 
-  TestProject({String mainSrc, String analysisOptions}) {
+  final bool logAnalytics;
+
+  TestProject({
+    String mainSrc,
+    String analysisOptions,
+    this.logAnalytics = false,
+  }) {
     dir = Directory.systemTemp.createTempSync('dartdev');
-    file('pubspec.yaml', 'name: $name\ndev_dependencies:\n  test: any\n');
+    file('pubspec.yaml', '''
+name: $name
+environment:
+  sdk: '>=2.10.0 <3.0.0'
+
+dev_dependencies:
+  test: any
+''');
     if (analysisOptions != null) {
       file('analysis_options.yaml', analysisOptions);
     }
@@ -56,18 +77,13 @@
   }) {
     var arguments = [
       command,
-      if (command == 'migrate')
-        // TODO(srawlins): Enable `pub outdated` in tests.
-        '--skip-pub-outdated',
       ...?args,
     ];
 
     arguments.add('--disable-dartdev-analytics');
-    return Process.runSync(
-      Platform.resolvedExecutable,
-      arguments,
-      workingDirectory: workingDir ?? dir.path,
-    );
+    return Process.runSync(Platform.resolvedExecutable, arguments,
+        workingDirectory: workingDir ?? dir.path,
+        environment: {if (logAnalytics) '_DARTDEV_LOG_ANALYTICS': 'true'});
   }
 
   String _sdkRootPath;
diff --git a/pkg/dartfix/.gitignore b/pkg/dartfix/.gitignore
deleted file mode 100644
index 113d783..0000000
--- a/pkg/dartfix/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-*.iml
-.dart_tool
-.packages
-pubspec.lock
diff --git a/pkg/dartfix/CHANGELOG.md b/pkg/dartfix/CHANGELOG.md
deleted file mode 100644
index 99b5795..0000000
--- a/pkg/dartfix/CHANGELOG.md
+++ /dev/null
@@ -1,34 +0,0 @@
-# 0.1.7
-* Improve experimental non-nullable migration support.
-* Extract some nnbd migration implementation components from the dartfix
-  package.
-
-# 0.1.6
-* Improve experimental non-nullable migration support.
-
-# 0.1.5
-* Add command line options for selecting/excluding fixes to apply (`--fix`,
-  `--excludeFix`, and `--required`). Call with `--help` for more details.
-* Add a `--color` option for printing messages with ANSI colors. This defaults
-  to true if the terminal supports ANSI colors.
-* Add a `--pedantic` option for specifying fixes relating to the [pedantic]
-  lints.
-* Add experimental non-nullable migration support.
-
-[pedantic]: https://pub.dev/packages/pedantic
-
-# 0.1.4
- * update protocol version constraints
-
-# 0.1.3
- * update SDK constraints
-
-# 0.1.2
- * update SDK constraints
- * add example.dart showing what can be "fixed"
-
-# 0.1.1
- * Remove reading dartfix version from pubspec
-
-# 0.1.0
- * Initial version
diff --git a/pkg/dartfix/LICENSE b/pkg/dartfix/LICENSE
deleted file mode 100644
index a9ab5f8..0000000
--- a/pkg/dartfix/LICENSE
+++ /dev/null
@@ -1,26 +0,0 @@
-Copyright 2018, the Dart project authors. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
-    * Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above
-      copyright notice, this list of conditions and the following
-      disclaimer in the documentation and/or other materials provided
-      with the distribution.
-    * Neither the name of Google Inc. nor the names of its
-      contributors may be used to endorse or promote products derived
-      from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
\ No newline at end of file
diff --git a/pkg/dartfix/README.md b/pkg/dartfix/README.md
deleted file mode 100644
index a3f0493..0000000
--- a/pkg/dartfix/README.md
+++ /dev/null
@@ -1,82 +0,0 @@
-`dartfix` is a command-line tool for migrating your Dart code
-to use newer syntax styles.
-
-## Usage
-
-> **Important:**
-> Save a copy of your source code before making changes with `dartfix`.
-> Unlike [dartfmt][], which makes only safe changes (usually to whitespace),
-> `dartfix` can make changes that you might need to undo or modify.
-
-Before you can use the `dartfix` tool, you need to
-[install it](#installing-and-updating-dartfix), as described below.
-Then invoke it with the name of the directory that you want to update.
-When you're ready to make the suggested changes,
-add the `--overwrite` option.
-
-```terminal
-$ dartfix examples/misc
-... summary of recommended changes ...
-$ dartfix examples/misc --overwrite
-```
-
-## Features
-`dartfix` applies different types of "fixes" to migrate your Dart code.
-By default, all fixes are applied, but you can select only the specific fixes you
-want. See `dartfix --help` for more about the available command line options.
-
-Some of the fixes that you can apply are "required" in that the Dart language
-is changing and at some point the old syntax will no longer be supported.
-To only apply these changes, pass the `--required` option on the command line.
-The required fixes include:
-
-* Find classes used as mixins, and convert them to use the `mixin` keyword
-    instead of `class`.
-    Mixin support is one of the [features added to Dart in 2.1][].
-    At some point in the future, the Dart team plans
-    to disallow using classes as mixins.
-
-* Move named constructor type arguments from the name to the type. <br>
-  For example, given `class A<T> { A.from(Object obj) { } }`,
-  `dartfix` changes constructor invocations in the following way:
-
-  ```
-  Original code:
-  A.from<String>(anObject) // Invokes the `A.from` named constructor.
-
-  Code produced by dartfix:
-  A<String>.from(anObject) // Same, but the type is directly after `A`.
-  ```
-
-Other changes are recommended but not required. These include:
-
-* Find `double` literals that end in `.0`, and remove the `.0`.
-  Language support for this was [added in Dart in 2.1][].
-
-## Installing and updating dartfix
-
-The easiest way to use `dartfix` is to [globally install][] it,
-so that it can be [in your path][PATH]:
-
-```terminal
-$ pub global activate dartfix
-```
-
-Use the same command to update `dartfix`.
-We recommend updating `dartfix` whenever you update your Dart SDK
-or when a new feature is released.
-
-## Filing issues
-
-If you want a new fix, first look at [dartfix issues][]
-and star the fixes you want.
-If no issue exists for the fix, [create a GitHub issue.][new issue]
-
-[dartfix]: https://pub.dev/packages/dartfix
-[dartfmt]: https://dart.dev/tools/dartfmt
-[added in Dart in 2.1]: https://github.com/dart-lang/sdk/blob/master/CHANGELOG.md#210---2018-11-15
-[features added to Dart in 2.1]: https://github.com/dart-lang/sdk/blob/master/CHANGELOG.md#210---2018-11-15
-[globally install]: https://dart.dev/tools/pub/cmd/pub-global
-[new issue]: https://github.com/dart-lang/sdk/issues/new?title=dartfix%20request%3A%20%3CSUMMARIZE%20REQUEST%20HERE%3E
-[dartfix issues]: https://github.com/dart-lang/sdk/issues?q=is%3Aissue+is%3Aopen+label%3Aanalyzer-dartfix
-[PATH]: https://dart.dev/tools/pub/cmd/pub-global#running-a-script-from-your-path
diff --git a/pkg/dartfix/analysis_options.yaml b/pkg/dartfix/analysis_options.yaml
deleted file mode 100644
index 4be2194..0000000
--- a/pkg/dartfix/analysis_options.yaml
+++ /dev/null
@@ -1,42 +0,0 @@
-include: package:pedantic/analysis_options.1.8.0.yaml
-
-analyzer:
-  strong-mode:
-    implicit-casts: false
-  errors:
-    # Increase the severity of the unused_import hint.
-    unused_import: warning
-    unnecessary_brace_in_string_interps: warning
-    # There are many pre-existing violations; this lint may not work well with
-    # the Analyzer team's style.
-    omit_local_variable_types: ignore
-    # Turn off the prefer_is_empty lint so that it can be used in the example tests
-    # and not be reported during normal package analysis.
-    prefer_is_empty: ignore
-
-linter:
-  rules:
-    - await_only_futures
-    - directives_ordering
-    - empty_statements
-    - unnecessary_brace_in_string_interps
-    #
-    # Delta from pedantic 1.8.0 to 1.9.0
-    #
-    #- always_declare_return_types # 17
-    - always_require_non_null_named_parameters
-    - annotate_overrides
-    - avoid_null_checks_in_equality_operators
-    - camel_case_extensions
-    #- omit_local_variable_types # 44
-    - prefer_adjacent_string_concatenation
-    - prefer_collection_literals
-    - prefer_conditional_assignment
-    #- prefer_final_fields # 1
-    - prefer_for_elements_to_map_fromIterable
-    - prefer_generic_function_type_aliases
-    #- prefer_if_null_operators # 2
-    - prefer_single_quotes
-    - prefer_spread_collections
-    - unnecessary_this
-    - use_function_type_syntax_for_parameters
diff --git a/pkg/dartfix/bin/dartfix.dart b/pkg/dartfix/bin/dartfix.dart
deleted file mode 100644
index d611474..0000000
--- a/pkg/dartfix/bin/dartfix.dart
+++ /dev/null
@@ -1,14 +0,0 @@
-#!/usr/bin/env dart
-// Copyright (c) 2018, 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:dartfix/src/driver.dart';
-
-/// The entry point for dartfix.
-void main(List<String> args) async {
-  Driver starter = Driver();
-
-  // Wait for the starter to complete.
-  await starter.start(args);
-}
diff --git a/pkg/dartfix/example/example.dart b/pkg/dartfix/example/example.dart
deleted file mode 100644
index 6093104..0000000
--- a/pkg/dartfix/example/example.dart
+++ /dev/null
@@ -1,25 +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.
-
-// This file contains code that is modified by running dartfix.
-// After running dartfix, this content matches a file in the "fixed" directory.
-
-// Dart will automatically convert int literals to doubles.
-// Running dartfix converts this double literal to an int
-// if --double-to-int is specified on the command line.
-const double myDouble = 4.0;
-
-// This class is used as a mixin but does not use the new mixin syntax.
-// Running dartfix converts this class to use the new syntax.
-class MyMixin {
-  final someValue = myDouble;
-}
-
-class MyClass with MyMixin {}
-
-void main(List<String> args) {
-  if (args.length == 0) {
-    print('myDouble = ${MyClass().someValue}');
-  }
-}
diff --git a/pkg/dartfix/fixed/example_default.dart b/pkg/dartfix/fixed/example_default.dart
deleted file mode 100644
index 10bd52c..0000000
--- a/pkg/dartfix/fixed/example_default.dart
+++ /dev/null
@@ -1,25 +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.
-
-// This file contains code that has been modified by running dartfix.
-// See example.dart for the original unmodified code.
-
-// Dart will automatically convert int literals to doubles.
-// Running dartfix converts this double literal to an int
-// if --double-to-int is specified on the command line.
-const double myDouble = 4;
-
-// This class is used as a mixin but does not use the new mixin syntax.
-// Running dartfix converts this class to use the new syntax.
-mixin MyMixin {
-  final someValue = myDouble;
-}
-
-class MyClass with MyMixin {}
-
-void main(List<String> args) {
-  if (args.length == 0) {
-    print('myDouble = ${MyClass().someValue}');
-  }
-}
diff --git a/pkg/dartfix/fixed/example_pedantic.dart b/pkg/dartfix/fixed/example_pedantic.dart
deleted file mode 100644
index 5337a5b..0000000
--- a/pkg/dartfix/fixed/example_pedantic.dart
+++ /dev/null
@@ -1,25 +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.
-
-// This file contains code that has been modified by running dartfix.
-// See example.dart for the original unmodified code.
-
-// Dart will automatically convert int literals to doubles.
-// Running dartfix converts this double literal to an int
-// if --double-to-int is specified on the command line.
-const double myDouble = 4.0;
-
-// This class is used as a mixin but does not use the new mixin syntax.
-// Running dartfix converts this class to use the new syntax.
-class MyMixin {
-  final someValue = myDouble;
-}
-
-class MyClass with MyMixin {}
-
-void main(List<String> args) {
-  if (args.isEmpty) {
-    print('myDouble = ${MyClass().someValue}');
-  }
-}
diff --git a/pkg/dartfix/fixed/example_prefer_is_empty.dart b/pkg/dartfix/fixed/example_prefer_is_empty.dart
deleted file mode 100644
index 5337a5b..0000000
--- a/pkg/dartfix/fixed/example_prefer_is_empty.dart
+++ /dev/null
@@ -1,25 +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.
-
-// This file contains code that has been modified by running dartfix.
-// See example.dart for the original unmodified code.
-
-// Dart will automatically convert int literals to doubles.
-// Running dartfix converts this double literal to an int
-// if --double-to-int is specified on the command line.
-const double myDouble = 4.0;
-
-// This class is used as a mixin but does not use the new mixin syntax.
-// Running dartfix converts this class to use the new syntax.
-class MyMixin {
-  final someValue = myDouble;
-}
-
-class MyClass with MyMixin {}
-
-void main(List<String> args) {
-  if (args.isEmpty) {
-    print('myDouble = ${MyClass().someValue}');
-  }
-}
diff --git a/pkg/dartfix/fixed/example_required.dart b/pkg/dartfix/fixed/example_required.dart
deleted file mode 100644
index 9324f22..0000000
--- a/pkg/dartfix/fixed/example_required.dart
+++ /dev/null
@@ -1,25 +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.
-
-// This file contains code that has been modified by running dartfix.
-// See example.dart for the original unmodified code.
-
-// Dart will automatically convert int literals to doubles.
-// Running dartfix converts this double literal to an int
-// if --double-to-int is specified on the command line.
-const double myDouble = 4.0;
-
-// This class is used as a mixin but does not use the new mixin syntax.
-// Running dartfix converts this class to use the new syntax.
-mixin MyMixin {
-  final someValue = myDouble;
-}
-
-class MyClass with MyMixin {}
-
-void main(List<String> args) {
-  if (args.length == 0) {
-    print('myDouble = ${MyClass().someValue}');
-  }
-}
diff --git a/pkg/dartfix/lib/handler/analysis_complete_handler.dart b/pkg/dartfix/lib/handler/analysis_complete_handler.dart
deleted file mode 100644
index e45b8a8..0000000
--- a/pkg/dartfix/lib/handler/analysis_complete_handler.dart
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright (c) 2018, 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.
-//
-// This file has been automatically generated. Please do not edit it manually.
-// To regenerate the file, use the script
-// "pkg/analysis_server/tool/spec/generate_files".
-
-import 'dart:async';
-
-import 'package:analysis_server_client/handler/notification_handler.dart';
-import 'package:analysis_server_client/protocol.dart';
-
-/// [AnalysisCompleteHandler] listens to analysis server notifications
-/// and detects when analysis has finished.
-mixin AnalysisCompleteHandler on NotificationHandler {
-  Completer<void> _analysisComplete;
-
-  @override
-  void onServerStatus(ServerStatusParams params) {
-    if (params.analysis != null && !params.analysis.isAnalyzing) {
-      _analysisComplete?.complete();
-      _analysisComplete = null;
-    }
-  }
-
-  Future<void> analysisComplete() {
-    _analysisComplete ??= Completer<void>();
-    return _analysisComplete.future;
-  }
-}
diff --git a/pkg/dartfix/lib/listener/bad_message_listener.dart b/pkg/dartfix/lib/listener/bad_message_listener.dart
deleted file mode 100644
index 03cb102..0000000
--- a/pkg/dartfix/lib/listener/bad_message_listener.dart
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright (c) 2018, 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_client/listener/server_listener.dart';
-
-/// [BadMessageListener] throws an exception if the [Client] receives bad data.
-mixin BadMessageListener on ServerListener {
-  /// True if we've received bad data from the server.
-  bool _receivedBadDataFromServer = false;
-
-  void throwDelayedException(String prefix, String details) {
-    if (!_receivedBadDataFromServer) {
-      _receivedBadDataFromServer = true;
-      // Give the server 1 second to continue outputting bad data
-      // such as outputting a stacktrace.
-      Future.delayed(Duration(seconds: 1), () {
-        throw '$prefix $details';
-      });
-    }
-  }
-
-  @override
-  void badMessage(String trimmedLine, exception) {
-    super.badMessage(trimmedLine, exception);
-    throwDelayedException('JSON decode failure', '$exception');
-  }
-
-  @override
-  void errorMessage(String line) {
-    super.errorMessage(line);
-    throwDelayedException('ERR:', line);
-  }
-
-  @override
-  void unexpectedMessage(Map<String, dynamic> message) {
-    super.unexpectedMessage(message);
-    throwDelayedException(
-        'BAD DATA FROM SERVER:', 'Unexpected message from server');
-  }
-
-  @override
-  void unexpectedResponse(Map<String, dynamic> message, id) {
-    super.unexpectedResponse(message, id);
-    throw 'Unexpected response from server: id=$id';
-  }
-
-  @override
-  void unexpectedStop(int exitCode) {
-    super.unexpectedStop(exitCode);
-    throwDelayedException('Server terminated with exit code', '$exitCode');
-  }
-}
diff --git a/pkg/dartfix/lib/listener/recording_listener.dart b/pkg/dartfix/lib/listener/recording_listener.dart
deleted file mode 100644
index a97120c..0000000
--- a/pkg/dartfix/lib/listener/recording_listener.dart
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright (c) 2018, 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_client/listener/server_listener.dart';
-import 'package:analysis_server_client/server.dart';
-import 'package:dartfix/listener/bad_message_listener.dart';
-import 'package:dartfix/listener/timed_listener.dart';
-
-/// [RecordingListener] caches all messages exchanged with the server
-/// and print them if a problem occurs.
-///
-/// This is primarily used when testing and debugging the analysis server.
-class RecordingListener with ServerListener, BadMessageListener, TimedListener {
-  /// True if we are currently printing out messages exchanged with the server.
-  bool _echoMessages = false;
-
-  /// Messages which have been exchanged with the server; we buffer these
-  /// up until the test finishes, so that they can be examined in the debugger
-  /// or printed out in response to a call to [echoMessages].
-  final _messages = <String>[];
-
-  /// Print out any messages exchanged with the server.  If some messages have
-  /// already been exchanged with the server, they are printed out immediately.
-  void echoMessages() {
-    if (_echoMessages) {
-      return;
-    }
-    _echoMessages = true;
-    for (String line in _messages) {
-      print(line);
-    }
-  }
-
-  /// Called when the [Server] is terminating the server process
-  /// rather than requesting that the server stop itself.
-  @override
-  void killingServerProcess(String reason) {
-    echoMessages();
-    super.killingServerProcess(reason);
-  }
-
-  /// Log a timed message about interaction with the server.
-  @override
-  void logTimed(double elapseTime, String prefix, String details) {
-    String line = '$elapseTime: $prefix $details';
-    if (_echoMessages) {
-      print(line);
-    }
-    _messages.add(line);
-  }
-
-  @override
-  void throwDelayedException(String prefix, String details) {
-    echoMessages();
-    super.throwDelayedException(prefix, details);
-  }
-}
diff --git a/pkg/dartfix/lib/listener/timed_listener.dart b/pkg/dartfix/lib/listener/timed_listener.dart
deleted file mode 100644
index ab41744..0000000
--- a/pkg/dartfix/lib/listener/timed_listener.dart
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright (c) 2018, 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_client/listener/server_listener.dart';
-
-/// [TimedListener] appends a timestamp (seconds since server startup)
-/// to each logged interaction with the server.
-mixin TimedListener on ServerListener {
-  /// Stopwatch that we use to generate timing information for debug output.
-  final Stopwatch _time = Stopwatch();
-
-  /// The [currentElapseTime] at which the last communication was received from
-  /// the server or `null` if no communication has been received.
-  double lastCommunicationTime;
-
-  /// The current elapse time (seconds) since the server was started.
-  double get currentElapseTime => _time.elapsedTicks / _time.frequency;
-
-  @override
-  void log(String prefix, String details) {
-    logTimed(currentElapseTime, prefix, details);
-  }
-
-  /// Log a timed message about interaction with the server.
-  void logTimed(double elapseTime, String prefix, String details);
-
-  @override
-  void messageReceived(String json) {
-    lastCommunicationTime = currentElapseTime;
-    super.messageReceived(json);
-  }
-
-  @override
-  void startingServer(String dartBinary, List<String> arguments) {
-    _time.start();
-    super.startingServer(dartBinary, arguments);
-  }
-}
diff --git a/pkg/dartfix/lib/src/context.dart b/pkg/dartfix/lib/src/context.dart
deleted file mode 100644
index dd28a47..0000000
--- a/pkg/dartfix/lib/src/context.dart
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright (c) 2018, 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' as io;
-
-/// The context for dartfix.
-class Context {
-  String get workingDir => io.Directory.current.path;
-
-  bool exists(String filePath) {
-    return io.FileSystemEntity.typeSync(filePath) !=
-        io.FileSystemEntityType.notFound;
-  }
-
-  void exit(int code) {
-    io.exit(code);
-  }
-
-  bool isDirectory(String filePath) {
-    return io.FileSystemEntity.typeSync(filePath) ==
-        io.FileSystemEntityType.directory;
-  }
-}
diff --git a/pkg/dartfix/lib/src/driver.dart b/pkg/dartfix/lib/src/driver.dart
deleted file mode 100644
index 26f7ce93..0000000
--- a/pkg/dartfix/lib/src/driver.dart
+++ /dev/null
@@ -1,508 +0,0 @@
-// Copyright (c) 2018, 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' show File, Platform;
-
-import 'package:analysis_server_client/handler/connection_handler.dart';
-import 'package:analysis_server_client/handler/notification_handler.dart';
-import 'package:analysis_server_client/listener/server_listener.dart';
-import 'package:analysis_server_client/protocol.dart';
-import 'package:analysis_server_client/server.dart';
-import 'package:cli_util/cli_logging.dart';
-import 'package:dartfix/handler/analysis_complete_handler.dart';
-import 'package:dartfix/listener/bad_message_listener.dart';
-import 'package:dartfix/src/context.dart';
-import 'package:dartfix/src/options.dart';
-import 'package:dartfix/src/util.dart';
-import 'package:path/path.dart' as path;
-import 'package:pub_semver/pub_semver.dart';
-
-import 'migrate/display.dart';
-import 'util.dart';
-
-class Driver {
-  Context context;
-  _Handler handler;
-  Logger logger;
-  Server server;
-
-  bool force;
-  bool overwrite;
-  List<String> targets;
-  EditDartfixResult result;
-
-  Ansi get ansi => logger.ansi;
-
-  /// Apply the fixes that were computed.
-  void applyFixes() {
-    for (SourceFileEdit fileEdit in result.edits) {
-      final file = File(fileEdit.file);
-      String code = file.existsSync() ? file.readAsStringSync() : '';
-      code = SourceEdit.applySequence(code, fileEdit.edits);
-      file.writeAsStringSync(code);
-    }
-  }
-
-  bool checkIfChangesShouldBeApplied(EditDartfixResult result) {
-    logger.stdout('');
-    if (result.hasErrors) {
-      logger.stdout('WARNING: The analyzed source contains errors'
-          ' that might affect the accuracy of these changes.');
-      logger.stdout('');
-      if (!force) {
-        logger.stdout('Rerun with --$forceOption to apply these changes.');
-        return false;
-      }
-    } else if (!overwrite && !force) {
-      logger.stdout('Rerun with --$overwriteOption to apply these changes.');
-      return false;
-    }
-    return true;
-  }
-
-  /// Check if the specified options is supported by the version of analysis
-  /// server being run and return `true` if they are.
-  /// Display an error message and return `false` if not.
-  bool checkIfSelectedOptionsAreSupported(Options options) {
-    if (handler.serverProtocolVersion.compareTo(Version(1, 27, 2)) >= 0) {
-      return true;
-    }
-    if (options.pedanticFixes) {
-      _unsupportedOption(pedanticOption);
-      return false;
-    }
-    if (handler.serverProtocolVersion.compareTo(Version(1, 22, 2)) >= 0) {
-      return true;
-    }
-    if (options.excludeFixes.isNotEmpty) {
-      _unsupportedOption(excludeFixOption);
-      return false;
-    }
-    if (options.includeFixes.isNotEmpty) {
-      _unsupportedOption(includeFixOption);
-      return false;
-    }
-    if (options.showHelp) {
-      return false;
-    }
-    return true;
-  }
-
-  void printAndApplyFixes() {
-    showDescriptions('Recommended changes that cannot be automatically applied',
-        result.otherSuggestions);
-    showDetails(result.details);
-    if (result.edits.isEmpty) {
-      logger.stdout('');
-      logger.stdout(result.otherSuggestions.isNotEmpty
-          ? 'None of the recommended changes can be automatically applied.'
-          : 'No recommended changes.');
-      return;
-    }
-    logger.stdout('');
-    logger.stdout(ansi.emphasized('Files to be changed:'));
-    for (SourceFileEdit fileEdit in result.edits) {
-      logger.stdout('  ${_relativePath(fileEdit.file)}');
-    }
-    if (checkIfChangesShouldBeApplied(result)) {
-      applyFixes();
-      logger.stdout(ansi.emphasized('Changes have been applied.'));
-    }
-  }
-
-  Future<EditDartfixResult> requestFixes(
-    Options options, {
-    Progress progress,
-  }) async {
-    Future isAnalysisComplete = handler.analysisComplete();
-
-    final params = EditDartfixParams(options.targets);
-    if (options.excludeFixes.isNotEmpty) {
-      params.excludedFixes = options.excludeFixes;
-    }
-    if (options.includeFixes.isNotEmpty) {
-      params.includedFixes = options.includeFixes;
-    }
-    if (options.pedanticFixes) {
-      params.includePedanticFixes = true;
-    }
-    Map<String, dynamic> json =
-        await server.send(EDIT_REQUEST_DARTFIX, params.toJson());
-
-    // TODO(danrubel): This is imprecise signal for determining when all
-    // analysis error notifications have been received. Consider adding a new
-    // notification indicating that the server is idle (all requests processed,
-    // all analysis complete, all notifications sent).
-    await isAnalysisComplete;
-
-    progress.finish(showTiming: true);
-    ResponseDecoder decoder = ResponseDecoder(null);
-    return EditDartfixResult.fromJson(decoder, 'result', json);
-  }
-
-  /// Return `true` if the changes should be applied.
-  bool shouldApplyFixes(EditDartfixResult result) {
-    return overwrite || force;
-  }
-
-  void showDescriptions(String title, List<DartFixSuggestion> suggestions) {
-    if (suggestions.isNotEmpty) {
-      logger.stdout('');
-      logger.stdout(ansi.emphasized('$title:'));
-      List<DartFixSuggestion> sorted = List.from(suggestions)
-        ..sort(compareSuggestions);
-      for (DartFixSuggestion suggestion in sorted) {
-        final msg = StringBuffer();
-        msg.write('  ${toSentenceFragment(suggestion.description)}');
-        final loc = suggestion.location;
-        if (loc != null) {
-          msg.write(' • ${_relativePath(loc.file)}');
-          msg.write(' • ${loc.startLine}:${loc.startColumn}');
-        }
-        logger.stdout(msg.toString());
-      }
-    }
-  }
-
-  void showDetails(List<String> details) {
-    if (details == null || details.isEmpty) {
-      return;
-    }
-    logger.stdout('''
-
-Analysis Details:
-''');
-    for (String detail in details) {
-      logger.stdout('''
- • $detail
-''');
-    }
-  }
-
-  void showFix(DartFix fix) {
-    logger.stdout('''
-
-• ${ansi.emphasized(fix.name)}''');
-    if (fix.description != null) {
-      for (String line in _indentAndWrapDescription(fix.description)) {
-        logger.stdout(line);
-      }
-    }
-  }
-
-  Future<EditGetDartfixInfoResult> showFixes({Progress progress}) async {
-    Map<String, dynamic> json = await server.send(
-        EDIT_REQUEST_GET_DARTFIX_INFO, EditGetDartfixInfoParams().toJson());
-    progress?.finish(showTiming: true);
-    ResponseDecoder decoder = ResponseDecoder(null);
-    final result = EditGetDartfixInfoResult.fromJson(decoder, 'result', json);
-
-    final fixes = List<DartFix>.from(result.fixes)
-      ..sort((f1, f2) => f1.name.compareTo(f2.name));
-
-    logger.stdout('''
-
-These fixes can be enabled using --$includeFixOption:''');
-
-    fixes
-      ..sort(compareFixes)
-      ..forEach(showFix);
-
-    return result;
-  }
-
-  Future start(
-    List<String> args, {
-    Context testContext,
-    Logger testLogger,
-  }) async {
-    final Options options = Options.parse(args, testContext, testLogger);
-
-    force = options.force;
-    overwrite = options.overwrite;
-    targets = options.targets;
-    context = testContext ?? options.context;
-    logger = testLogger ?? options.logger;
-    server = Server(listener: _Listener(logger));
-    handler = _Handler(this, context);
-
-    // Start showing progress before we start the analysis server.
-    Progress progress;
-    if (options.showHelp) {
-      progress = logger.progress('${ansi.emphasized('Listing fixes')}');
-    } else {
-      progress = logger.progress('${ansi.emphasized('Calculating fixes')}');
-    }
-
-    if (!await startServer(options)) {
-      context.exit(16);
-    }
-
-    if (!checkIfSelectedOptionsAreSupported(options)) {
-      await server.stop();
-      context.exit(1);
-    }
-
-    if (options.showHelp) {
-      try {
-        await showFixes(progress: progress);
-      } finally {
-        await server.stop();
-      }
-      context.exit(0);
-    }
-
-    if (options.includeFixes.isEmpty && !options.pedanticFixes) {
-      logger.stdout('No fixes specified.');
-      context.exit(1);
-    }
-
-    Future serverStopped;
-    try {
-      await startServerAnalysis(options);
-      result = await requestFixes(options, progress: progress);
-      var fileEdits = result.edits;
-      var editCount = 0;
-      for (SourceFileEdit fileEdit in fileEdits) {
-        editCount += fileEdit.edits.length;
-      }
-      logger.stdout('Found $editCount changes in ${fileEdits.length} files.');
-
-      previewFixes(logger, result);
-
-      //
-      // Stop the server.
-      //
-      serverStopped = server.stop();
-
-      logger.stdout('');
-
-      // Check if we should apply fixes.
-      if (result.edits.isEmpty) {
-        logger.stdout(result.otherSuggestions.isNotEmpty
-            ? 'None of the recommended changes can be automatically applied.'
-            : 'There are no recommended changes.');
-      } else if (shouldApplyFixes(result)) {
-        applyFixes();
-        logger.stdout('Changes have been applied.');
-      } else {
-        logger.stdout('Re-run with --overwrite to apply the above changes.');
-      }
-      await serverStopped;
-    } finally {
-      // If we didn't already try to stop the server, then stop it now.
-      if (serverStopped == null) {
-        await server.stop();
-      }
-    }
-  }
-
-  Future<bool> startServer(Options options) async {
-    // Automatically run analysis server from source
-    // if this command line tool is being run from source within the SDK repo.
-    String serverPath = options.serverSnapshot ?? findServerPath();
-    if (options.verbose) {
-      logger.trace('''
-Dart SDK version ${Platform.version}
-  ${Platform.resolvedExecutable}
-dartfix
-  ${Platform.script.toFilePath()}
-analysis server
-  $serverPath
-''');
-    }
-    await server.start(
-      clientId: 'dartfix',
-      clientVersion: 'unspecified',
-      sdkPath: options.sdkPath,
-      serverPath: serverPath,
-    );
-    server.listenToOutput(notificationProcessor: handler.handleEvent);
-    return handler.serverConnected(timeLimit: const Duration(seconds: 30));
-  }
-
-  Future<Progress> startServerAnalysis(
-    Options options, {
-    Progress progress,
-  }) async {
-    logger.trace('');
-    logger.trace('Setup analysis');
-    await server.send(SERVER_REQUEST_SET_SUBSCRIPTIONS,
-        ServerSetSubscriptionsParams([ServerService.STATUS]).toJson());
-    await server.send(
-        ANALYSIS_REQUEST_SET_ANALYSIS_ROOTS,
-        AnalysisSetAnalysisRootsParams(
-          options.targets,
-          const [],
-        ).toJson());
-    return progress;
-  }
-
-  List<String> _indentAndWrapDescription(String description) =>
-      description.split('\n').map((line) => '    $line').toList();
-
-  String _relativePath(String filePath) {
-    for (String target in targets) {
-      if (filePath.startsWith(target)) {
-        return filePath.substring(target.length + 1);
-      }
-    }
-    return filePath;
-  }
-
-  void _unsupportedOption(String option) {
-    final version = handler.serverProtocolVersion.toString();
-    logger.stderr('''
-The --$option option is not supported by analysis server version $version.
-Please upgrade to a newer version of the Dart SDK to use this option.''');
-  }
-
-  void previewFixes(
-    Logger logger,
-    EditDartfixResult results,
-  ) {
-    final Ansi ansi = logger.ansi;
-
-    Map<String, List<DartFixSuggestion>> fileSuggestions = {};
-    for (DartFixSuggestion suggestion in results.suggestions) {
-      String file = suggestion.location.file;
-      fileSuggestions.putIfAbsent(file, () => <DartFixSuggestion>[]);
-      fileSuggestions[file].add(suggestion);
-    }
-
-    // present a diff-like view
-    for (SourceFileEdit sourceFileEdit in results.edits) {
-      String file = sourceFileEdit.file;
-      String relPath = path.relative(file);
-      int count = sourceFileEdit.edits.length;
-
-      logger.stdout('');
-      logger.stdout('${ansi.emphasized(relPath)} '
-          '($count ${pluralize('change', count)}):');
-
-      String source;
-      try {
-        source = File(file).readAsStringSync();
-      } catch (_) {}
-
-      if (source == null) {
-        logger.stdout('  (unable to retrieve source for file)');
-      } else {
-        SourcePrinter sourcePrinter = SourcePrinter(source);
-
-        List<SourceEdit> edits = sortEdits(sourceFileEdit);
-
-        // Apply edits.
-        sourcePrinter.applyEdits(edits);
-
-        // Render the changed lines.
-        sourcePrinter.processChangedLines((lineNumber, lineText) {
-          String prefix = '  line ${lineNumber.toString().padRight(3)} •';
-          logger.stdout('$prefix ${lineText.trim()}');
-        });
-      }
-    }
-  }
-}
-
-class _Handler
-    with NotificationHandler, ConnectionHandler, AnalysisCompleteHandler {
-  final Driver driver;
-  final Logger logger;
-  final Context context;
-
-  @override
-  final Server server;
-  Version serverProtocolVersion;
-
-  _Handler(this.driver, this.context)
-      : logger = driver.logger,
-        server = driver.server;
-
-  @override
-  bool checkServerProtocolVersion(Version version) {
-    serverProtocolVersion = version;
-    return super.checkServerProtocolVersion(version);
-  }
-
-  @override
-  void onAnalysisErrors(AnalysisErrorsParams params) {
-    List<AnalysisError> errors = params.errors;
-    bool foundAtLeastOneError = false;
-    for (AnalysisError error in errors) {
-      if (shouldShowError(error)) {
-        if (!foundAtLeastOneError) {
-          foundAtLeastOneError = true;
-          logger.stdout('${driver._relativePath(params.file)}:');
-        }
-        Location loc = error.location;
-        logger.stdout('  ${toSentenceFragment(error.message)}'
-            ' • ${loc.startLine}:${loc.startColumn}');
-      }
-    }
-    super.onAnalysisErrors(params);
-    // Analysis errors are non-fatal; no need to exit.
-  }
-
-  @override
-  void onFailedToConnect() {
-    logger.stderr('Failed to connect to server');
-    super.onFailedToConnect();
-    // Exiting on connection failure is already handled by [Driver.start].
-  }
-
-  @override
-  void onProtocolNotSupported(Version version) {
-    logger.stderr('Expected protocol version $PROTOCOL_VERSION,'
-        ' but found $version');
-    final expectedVersion = Version.parse(PROTOCOL_VERSION);
-    if (version > expectedVersion) {
-      logger.stdout('''
-This version of dartfix is incompatible with the current Dart SDK.
-Try installing a newer version of dartfix by running:
-
-    pub global activate dartfix
-''');
-    } else {
-      logger.stdout('''
-This version of dartfix is too new to be used with the current Dart SDK. Try
-upgrading the Dart SDK to a newer version or installing an older version of
-dartfix using:
-
-    pub global activate dartfix <version>
-''');
-    }
-    super.onProtocolNotSupported(version);
-    // This is handled by the connection failure case; no need to exit here.
-  }
-
-  @override
-  void onServerError(ServerErrorParams params) {
-    if (params.isFatal) {
-      logger.stderr('Fatal Server Error: ${params.message}');
-    } else {
-      logger.stderr('Server Error: ${params.message}');
-    }
-    if (params.stackTrace != null) {
-      logger.stderr(params.stackTrace);
-    }
-    super.onServerError(params);
-    // Server is stopped by super method, so we can safely exit here.
-    context.exit(16);
-  }
-}
-
-class _Listener with ServerListener, BadMessageListener {
-  final Logger logger;
-  final bool verbose;
-
-  _Listener(this.logger) : verbose = logger.isVerbose;
-
-  @override
-  void log(String prefix, String details) {
-    if (verbose) {
-      logger.trace('$prefix $details');
-    }
-  }
-}
diff --git a/pkg/dartfix/lib/src/migrate/apply.dart b/pkg/dartfix/lib/src/migrate/apply.dart
deleted file mode 100644
index b4c7ab2..0000000
--- a/pkg/dartfix/lib/src/migrate/apply.dart
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright (c) 2020, 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_client/protocol.dart';
-
-import '../util.dart';
-
-// TODO(devoncarew): This is only referenced from tests.
-
-/// Perform the indicated source edits to the given source, returning the
-/// resulting transformed text.
-String applyEdits(SourceFileEdit sourceFileEdit, String source) {
-  List<SourceEdit> edits = sortEdits(sourceFileEdit);
-  return SourceEdit.applySequence(source, edits);
-}
diff --git a/pkg/dartfix/lib/src/migrate/display.dart b/pkg/dartfix/lib/src/migrate/display.dart
deleted file mode 100644
index 68561fb..0000000
--- a/pkg/dartfix/lib/src/migrate/display.dart
+++ /dev/null
@@ -1,88 +0,0 @@
-// Copyright (c) 2020, 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_client/protocol.dart';
-import 'package:cli_util/cli_logging.dart';
-import 'package:path/path.dart' as path;
-
-// TODO(devoncarew): This is only referenced from tests.
-
-/// Given a Logger and an analysis issue, render the issue to the logger.
-class IssueRenderer {
-  final Logger logger;
-  final String rootDirectory;
-
-  IssueRenderer(this.logger, this.rootDirectory);
-
-  void render(AnalysisError issue) {
-    // severity • Message ... at foo/bar.dart:6:1 • (error_code)
-
-    final Ansi ansi = logger.ansi;
-
-    logger.stdout(
-      '  ${ansi.error(issue.severity.name.toLowerCase())} • '
-      '${ansi.emphasized(_removePeriod(issue.message))} '
-      'at ${path.relative(issue.location.file, from: rootDirectory)}'
-      ':${issue.location.startLine}:'
-      '${issue.location.startColumn} '
-      '• (${issue.code})',
-    );
-  }
-}
-
-typedef LineProcessor = void Function(int lineNumber, String lineText);
-
-class SourcePrinter {
-  static final String red = '\u001b[31m';
-  static final String bold = '\u001b[1m';
-  static final String reversed = '\u001b[7m';
-  static final String none = '\u001b[0m';
-
-  String source;
-
-  SourcePrinter(this.source);
-
-  void applyEdits(List<SourceEdit> edits) {
-    for (SourceEdit edit in edits) {
-      if (edit.replacement.isNotEmpty) {
-        // an addition
-        insertText(edit.offset + edit.length, edit.replacement);
-      }
-
-      if (edit.length != 0) {
-        // a removal
-        deleteRange(edit.offset, edit.length);
-      }
-    }
-  }
-
-  void deleteRange(int offset, int length) {
-    source = source.substring(0, offset) +
-        red +
-        reversed +
-        source.substring(offset, offset + length) +
-        none +
-        source.substring(offset + length);
-  }
-
-  void insertText(int offset, String text) {
-    text = '$reversed$text$none';
-    source = source.substring(0, offset) + text + source.substring(offset);
-  }
-
-  void processChangedLines(LineProcessor callback) {
-    List<String> lines = source.split('\n');
-    for (int i = 0; i < lines.length; i++) {
-      String line = lines[i];
-
-      if (line.contains(none)) {
-        callback(i + 1, line);
-      }
-    }
-  }
-}
-
-String _removePeriod(String value) {
-  return value.endsWith('.') ? value.substring(0, value.length - 1) : value;
-}
diff --git a/pkg/dartfix/lib/src/migrate/options.dart b/pkg/dartfix/lib/src/migrate/options.dart
deleted file mode 100644
index e3c565e..0000000
--- a/pkg/dartfix/lib/src/migrate/options.dart
+++ /dev/null
@@ -1,96 +0,0 @@
-// Copyright (c) 2020, 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';
-
-import 'package:args/args.dart';
-import 'package:args/src/arg_parser.dart';
-import 'package:path/path.dart' as path;
-
-// TODO(devoncarew): This class is unused.
-
-class MigrateOptions {
-  static const applyChangesOption = 'apply-changes';
-  static const debugOption = 'debug';
-  static const ignoreErrorsOption = 'ignore-errors';
-  static const previewPortOption = 'preview-port';
-  static const sdkPathOption = 'sdk-path';
-  static const serverPathOption = 'server-path';
-  static const webPreviewOption = 'web-preview';
-
-  final bool applyChanges;
-  final bool debug;
-  final String directory;
-  final bool ignoreErrors;
-  final int previewPort;
-  final String serverPath;
-  final String sdkPath;
-  final bool webPreview;
-
-  MigrateOptions(ArgResults argResults, this.directory)
-      : applyChanges = argResults[applyChangesOption] as bool,
-        debug = argResults[debugOption] as bool,
-        ignoreErrors = argResults[ignoreErrorsOption] as bool,
-        previewPort =
-            int.tryParse(argResults[previewPortOption] as String) ?? 0,
-        sdkPath = argResults[sdkPathOption] as String,
-        serverPath = argResults[serverPathOption] as String,
-        webPreview = argResults['web-preview'] as bool;
-
-  String get directoryAbsolute => Directory(path.canonicalize(directory)).path;
-
-  @override
-  String toString() {
-    return '[$directory]';
-  }
-
-  static void defineOptions(ArgParser argParser) {
-    argParser.addFlag(
-      applyChangesOption,
-      defaultsTo: false,
-      negatable: false,
-      help: 'Apply the proposed null safety changes to the files on disk.',
-    );
-    argParser.addFlag(
-      debugOption,
-      defaultsTo: false,
-      hide: true,
-      negatable: true,
-      help: 'Show (very verbose) debugging information to stdout during '
-          'migration',
-    );
-    argParser.addFlag(
-      ignoreErrorsOption,
-      defaultsTo: false,
-      negatable: false,
-      help: 'Attempt to perform null safety analysis even if the package has '
-          'analysis errors.',
-    );
-    argParser.addOption(
-      sdkPathOption,
-      hide: true,
-      help: 'Override the SDK path used for migration.',
-    );
-    argParser.addOption(
-      previewPortOption,
-      defaultsTo: '0',
-      help: 'Run the preview server on the specified port.  If not specified '
-          'or invalid, dynamically allocate a port.',
-    );
-    argParser.addOption(
-      serverPathOption,
-      hide: true,
-      help: 'Override the analysis server path used for migration.',
-    );
-    argParser.addFlag(
-      webPreviewOption,
-      defaultsTo: true,
-      negatable: true,
-      help: 'Show an interactive preview of the proposed null safety changes '
-          'in a browser window.\n'
-          'With --no-web-preview, the proposed changes are instead printed to '
-          'the console.',
-    );
-  }
-}
diff --git a/pkg/dartfix/lib/src/options.dart b/pkg/dartfix/lib/src/options.dart
deleted file mode 100644
index b6d2cbb..0000000
--- a/pkg/dartfix/lib/src/options.dart
+++ /dev/null
@@ -1,210 +0,0 @@
-// Copyright (c) 2018, 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';
-
-import 'package:args/args.dart';
-import 'package:cli_util/cli_logging.dart';
-import 'package:dartfix/src/context.dart';
-import 'package:path/path.dart' as path;
-
-// TODO(brianwilkerson) Deprecate 'excludeFix' and replace it with 'exclude-fix'
-const excludeFixOption = 'excludeFix';
-const forceOption = 'force';
-const includeFixOption = 'fix';
-const overwriteOption = 'overwrite';
-const pedanticOption = 'pedantic';
-const previewDirOption = 'preview-dir';
-const previewPortOption = 'preview-port';
-const sdkOption = 'sdk';
-
-const _binaryName = 'dartfix';
-const _colorOption = 'color';
-
-// options only supported by server 1.22.2 and greater
-const _helpOption = 'help';
-const _serverSnapshot = 'server';
-
-// options not supported yet by any server
-const _verboseOption = 'verbose';
-
-/// Command line options for `dartfix`.
-class Options {
-  final Context context;
-  Logger logger;
-
-  List<String> targets;
-  final String sdkPath;
-  final String serverSnapshot;
-
-  final bool pedanticFixes;
-  final List<String> includeFixes;
-  final List<String> excludeFixes;
-
-  final bool force;
-  final bool showHelp;
-  bool overwrite;
-  final bool useColor;
-  final bool verbose;
-
-  Options._fromArgs(this.context, ArgResults results)
-      : force = results[forceOption] as bool,
-        includeFixes = (results[includeFixOption] as List ?? []).cast<String>(),
-        excludeFixes = (results[excludeFixOption] as List ?? []).cast<String>(),
-        overwrite = results[overwriteOption] as bool,
-        pedanticFixes = results[pedanticOption] as bool,
-        sdkPath = results[sdkOption] as String ?? _getSdkPath(),
-        serverSnapshot = results[_serverSnapshot] as String,
-        showHelp = results[_helpOption] as bool || results.arguments.isEmpty,
-        targets = results.rest,
-        useColor = results.wasParsed(_colorOption)
-            ? results[_colorOption] as bool
-            : null,
-        verbose = results[_verboseOption] as bool;
-
-  String makeAbsoluteAndNormalize(String target) {
-    if (!path.isAbsolute(target)) {
-      target = path.join(context.workingDir, target);
-    }
-    return path.normalize(target);
-  }
-
-  static Options parse(List<String> args, Context context, Logger logger) {
-    final parser = ArgParser(allowTrailingOptions: true)
-      ..addSeparator('Choosing fixes to be applied:')
-      ..addMultiOption(includeFixOption,
-          help: 'Include a specific fix.', valueHelp: 'name-of-fix')
-      ..addMultiOption(excludeFixOption,
-          help: 'Exclude a specific fix.', valueHelp: 'name-of-fix')
-      ..addFlag(pedanticOption,
-          help: 'Apply pedantic fixes.', defaultsTo: false, negatable: false)
-      ..addSeparator('Modifying files:')
-      ..addFlag(overwriteOption,
-          abbr: 'w',
-          help: 'Overwrite files with the changes.',
-          defaultsTo: false,
-          negatable: false)
-      ..addFlag(forceOption,
-          abbr: 'f',
-          help: 'Overwrite files even if there are errors.',
-          defaultsTo: false,
-          negatable: false)
-      ..addSeparator('Miscellaneous:')
-      ..addFlag(_helpOption,
-          abbr: 'h',
-          help: 'Display this help message.',
-          defaultsTo: false,
-          negatable: false)
-      ..addOption(sdkOption,
-          help: 'Path to the SDK to analyze against.',
-          valueHelp: 'path',
-          hide: true)
-      ..addOption(_serverSnapshot,
-          help: 'Path to the analysis server snapshot file.',
-          valueHelp: 'path',
-          hide: true)
-      ..addFlag(_verboseOption,
-          abbr: 'v',
-          help: 'Verbose output.',
-          defaultsTo: false,
-          negatable: false)
-      ..addFlag(_colorOption,
-          help: 'Use ansi colors when printing messages.',
-          defaultsTo: Ansi.terminalSupportsAnsi);
-
-    context ??= Context();
-
-    ArgResults results;
-    try {
-      results = parser.parse(args);
-    } on FormatException catch (e) {
-      logger ??= Logger.standard(ansi: Ansi(Ansi.terminalSupportsAnsi));
-      logger.stderr(e.message);
-      _showUsage(parser, logger);
-      context.exit(17);
-    }
-
-    Options options = Options._fromArgs(context, results);
-
-    if (logger == null) {
-      if (options.verbose) {
-        logger = Logger.verbose();
-      } else {
-        logger = Logger.standard(
-            ansi: Ansi(
-          options.useColor ?? Ansi.terminalSupportsAnsi,
-        ));
-      }
-    }
-    options.logger = logger;
-
-    // For '--help', we short circuit the logic to validate the sdk and project.
-    if (options.showHelp) {
-      _showUsage(parser, logger, showHelpHint: false);
-      return options;
-    }
-
-    // Validate the Dart SDK location
-    String sdkPath = options.sdkPath;
-    if (sdkPath == null) {
-      logger.stderr('No Dart SDK found.');
-      context.exit(18);
-    }
-
-    if (!context.exists(sdkPath)) {
-      logger.stderr('Invalid Dart SDK path: $sdkPath');
-      context.exit(19);
-    }
-
-    // Check for files and/or directories to analyze.
-    if (options.targets == null || options.targets.isEmpty) {
-      logger.stderr('Expected at least one file or directory to analyze.');
-      context.exit(20);
-    }
-
-    // Normalize and verify paths
-    options.targets =
-        options.targets.map<String>(options.makeAbsoluteAndNormalize).toList();
-    for (String target in options.targets) {
-      if (!context.isDirectory(target)) {
-        if (!context.exists(target)) {
-          logger.stderr('Target does not exist: $target');
-        } else {
-          logger.stderr('Expected directory, but found: $target');
-        }
-        context.exit(21);
-      }
-    }
-
-    if (options.verbose) {
-      logger.trace('Targets:');
-      for (String target in options.targets) {
-        logger.trace('  $target');
-      }
-    }
-
-    return options;
-  }
-
-  static String _getSdkPath() {
-    return Platform.environment['DART_SDK'] ??
-        path.dirname(path.dirname(Platform.resolvedExecutable));
-  }
-
-  static void _showUsage(ArgParser parser, Logger logger,
-      {bool showHelpHint = true}) {
-    Function(String message) out = showHelpHint ? logger.stderr : logger.stdout;
-    // show help on stdout when showHelp is true and showHelpHint is false
-    out('''
-Usage: $_binaryName [options...] <directory paths>
-''');
-    out(parser.usage);
-    out(showHelpHint
-        ? '''
-
-Use --$_helpOption to display the fixes that can be specified using either
---$includeFixOption or --$excludeFixOption.'''
-        : '');
-  }
-}
diff --git a/pkg/dartfix/lib/src/util.dart b/pkg/dartfix/lib/src/util.dart
deleted file mode 100644
index 07ad858..0000000
--- a/pkg/dartfix/lib/src/util.dart
+++ /dev/null
@@ -1,69 +0,0 @@
-// Copyright (c) 2018, 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' show File, Platform;
-
-import 'package:analysis_server_client/protocol.dart';
-import 'package:path/path.dart' as path;
-
-int compareSuggestions(DartFixSuggestion s1, DartFixSuggestion s2) {
-  int result = s1.description.compareTo(s2.description);
-  if (result != 0) {
-    return result;
-  }
-  return (s2.location?.offset ?? 0) - (s1.location?.offset ?? 0);
-}
-
-int compareFixes(DartFix s1, DartFix s2) {
-  return s1.name.compareTo(s2.name);
-}
-
-/// Return the analysis_server executable by proceeding upward until finding the
-/// Dart SDK repository root, then returning the analysis_server executable
-/// within the repository.
-///
-/// Return `null` if it cannot be found.
-String findServerPath() {
-  String pathname = Platform.script.toFilePath();
-  while (true) {
-    String parent = path.dirname(pathname);
-    if (parent.length >= pathname.length) {
-      return null;
-    }
-    String serverPath =
-        path.join(parent, 'pkg', 'analysis_server', 'bin', 'server.dart');
-    if (File(serverPath).existsSync()) {
-      return serverPath;
-    }
-    pathname = parent;
-  }
-}
-
-bool shouldShowError(AnalysisError error) {
-  // Only show diagnostics that will affect the fixes.
-  return error.type.name != 'HINT' &&
-      error.type.name != 'LINT' &&
-      error.type.name != 'TODO' &&
-      // TODO(danrubel): Rather than checking the error.code with
-      // specific strings, add something to the error indicating that
-      // it will be automatically fixed by edit.dartfix.
-      error.code != 'wrong_number_of_type_arguments_constructor';
-}
-
-String toSentenceFragment(String message) {
-  return message.endsWith('.')
-      ? message.substring(0, message.length - 1)
-      : message;
-}
-
-String pluralize(String word, int count) => count == 1 ? word : '${word}s';
-
-List<SourceEdit> sortEdits(SourceFileEdit sourceFileEdit) {
-  // Sort edits in reverse offset order.
-  List<SourceEdit> edits = sourceFileEdit.edits.toList();
-  edits.sort((a, b) {
-    return b.offset - a.offset;
-  });
-  return edits;
-}
diff --git a/pkg/dartfix/pubspec.yaml b/pkg/dartfix/pubspec.yaml
deleted file mode 100644
index 8f39796..0000000
--- a/pkg/dartfix/pubspec.yaml
+++ /dev/null
@@ -1,26 +0,0 @@
-name: dartfix
-version: 0.1.7
-description:
-  A tool for migrating Dart source to newer versions of the Dart SDK
-  and fixing common issues.
-homepage: https://github.com/dart-lang/sdk/tree/master/pkg/dartfix
-environment:
-  sdk: '>=2.8.0 <3.0.0'
-
-# Add the bin/dartfix.dart script to the scripts pub installs.
-executables:
-  dartfix:
-
-dependencies:
-  # Pin to an exact version of analysis_server_client because the edit.dartfix
-  # protocol is experimental and will continue to evolve.
-  analysis_server_client: '>=1.1.3 <1.1.4'
-  args: ^1.4.0
-  cli_util: ^0.2.0
-  path: ^1.7.0
-  pub_semver: ^1.4.4
-
-dev_dependencies:
-  analyzer: ^0.39.0
-  pedantic: ^1.8.0
-  test: ^1.14.2
diff --git a/pkg/dartfix/test/src/driver_example_test.dart b/pkg/dartfix/test/src/driver_example_test.dart
deleted file mode 100644
index 4cbb06b..0000000
--- a/pkg/dartfix/test/src/driver_example_test.dart
+++ /dev/null
@@ -1,28 +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';
-
-import 'package:test/test.dart';
-
-import 'test_context.dart';
-
-void main() {
-  test('run original example', () async {
-    File exampleFile = findFile('pkg/dartfix/example/example.dart');
-
-    print('--- launching original example');
-    final futureResult1 =
-        Process.run(Platform.resolvedExecutable, [exampleFile.path]);
-
-    print('--- waiting for original example');
-    final result = await futureResult1;
-
-    print('--- original example output');
-    var text = result.stdout as String;
-    print(text);
-
-    expect(text.trim(), 'myDouble = 4.0');
-  });
-}
diff --git a/pkg/dartfix/test/src/driver_exclude_test.dart b/pkg/dartfix/test/src/driver_exclude_test.dart
deleted file mode 100644
index 3236efa..0000000
--- a/pkg/dartfix/test/src/driver_exclude_test.dart
+++ /dev/null
@@ -1,48 +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';
-
-import 'package:dartfix/src/driver.dart';
-import 'package:test/test.dart';
-
-import 'test_context.dart';
-
-void main() {
-  File exampleFile;
-  Directory exampleDir;
-
-  test('exclude fix', () async {
-    exampleFile = findFile('pkg/dartfix/example/example.dart');
-    exampleDir = exampleFile.parent;
-
-    final driver = Driver();
-    final testContext = TestContext();
-    final testLogger = TestLogger(debug: _debug);
-    String exampleSource = await exampleFile.readAsString();
-
-    try {
-      await driver.start([
-        if (_debug) '-v',
-        '--fix',
-        'convert_class_to_mixin',
-        '--excludeFix',
-        'convert_class_to_mixin',
-        exampleDir.path,
-      ], testContext: testContext, testLogger: testLogger);
-    } finally {
-      if (_debug) {
-        print(testLogger.stderrBuffer.toString());
-        print(testLogger.stdoutBuffer.toString());
-        print('--- original example');
-        print(exampleSource);
-      }
-    }
-
-    final suggestions = driver.result.suggestions;
-    expect(suggestions, hasLength(0));
-  }, timeout: const Timeout(Duration(minutes: 3)));
-}
-
-const _debug = true;
diff --git a/pkg/dartfix/test/src/driver_help_test.dart b/pkg/dartfix/test/src/driver_help_test.dart
deleted file mode 100644
index d8a6330..0000000
--- a/pkg/dartfix/test/src/driver_help_test.dart
+++ /dev/null
@@ -1,55 +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 'package:dartfix/src/driver.dart';
-import 'package:dartfix/src/options.dart';
-import 'package:test/test.dart';
-
-import 'test_context.dart';
-
-void main() {
-  test('help explicit', () async {
-    final driver = Driver();
-    final testContext = TestContext();
-    final testLogger = TestLogger();
-    try {
-      await driver.start(
-        ['--help'], // display help and list fixes
-        testContext: testContext,
-        testLogger: testLogger,
-      );
-      fail('expected exception');
-    } on TestExit catch (e) {
-      expect(e.code, 0);
-    }
-    final errText = testLogger.stderrBuffer.toString();
-    final outText = testLogger.stdoutBuffer.toString();
-    expect(errText, isEmpty);
-    expect(outText, contains('--$excludeFixOption'));
-    expect(outText, isNot(contains('Use --help to display the fixes')));
-  });
-
-  test('help implicit', () async {
-    final driver = Driver();
-    final testContext = TestContext();
-    final testLogger = TestLogger();
-    try {
-      await driver.start(
-        [], // no options or arguments should display help and list fixes
-        testContext: testContext,
-        testLogger: testLogger,
-      );
-      fail('expected exception');
-    } on TestExit catch (e) {
-      expect(e.code, 0);
-    }
-    final errText = testLogger.stderrBuffer.toString();
-    final outText = testLogger.stdoutBuffer.toString();
-    print(errText);
-    print(outText);
-    expect(errText, isEmpty);
-    expect(outText, contains('--$excludeFixOption'));
-    expect(outText, isNot(contains('Use --help to display the fixes')));
-  });
-}
diff --git a/pkg/dartfix/test/src/driver_include_test.dart b/pkg/dartfix/test/src/driver_include_test.dart
deleted file mode 100644
index 7079d5d..0000000
--- a/pkg/dartfix/test/src/driver_include_test.dart
+++ /dev/null
@@ -1,47 +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';
-
-import 'package:dartfix/src/driver.dart';
-import 'package:test/test.dart';
-
-import 'test_context.dart';
-
-void main() {
-  File exampleFile;
-  Directory exampleDir;
-
-  test('include fix', () async {
-    exampleFile = findFile('pkg/dartfix/example/example.dart');
-    exampleDir = exampleFile.parent;
-
-    final driver = Driver();
-    final testContext = TestContext();
-    final testLogger = TestLogger(debug: _debug);
-    String exampleSource = await exampleFile.readAsString();
-
-    try {
-      await driver.start([
-        if (_debug) '-v',
-        '--fix',
-        'prefer_int_literals',
-        exampleDir.path,
-      ], testContext: testContext, testLogger: testLogger);
-    } finally {
-      if (_debug) {
-        print(testLogger.stderrBuffer.toString());
-        print(testLogger.stdoutBuffer.toString());
-        print('--- original example');
-        print(exampleSource);
-      }
-    }
-
-    final suggestions = driver.result.suggestions;
-    expect(suggestions, hasLength(1));
-    expectHasSuggestion(suggestions, 'Convert to an int literal');
-  }, timeout: const Timeout(Duration(minutes: 3)));
-}
-
-const _debug = true;
diff --git a/pkg/dartfix/test/src/driver_pedantic_test.dart b/pkg/dartfix/test/src/driver_pedantic_test.dart
deleted file mode 100644
index 6d4b99c6..0000000
--- a/pkg/dartfix/test/src/driver_pedantic_test.dart
+++ /dev/null
@@ -1,13 +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 'driver_test.dart' show defineDriverTests;
-
-void main() {
-  defineDriverTests(
-    name: 'pedantic',
-    options: ['--pedantic'],
-    expectedSuggestions: ["Replace with 'isEmpty'"],
-  );
-}
diff --git a/pkg/dartfix/test/src/driver_prefer_is_empty_test.dart b/pkg/dartfix/test/src/driver_prefer_is_empty_test.dart
deleted file mode 100644
index db8b4ad..0000000
--- a/pkg/dartfix/test/src/driver_prefer_is_empty_test.dart
+++ /dev/null
@@ -1,13 +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 'driver_test.dart' show defineDriverTests;
-
-void main() {
-  defineDriverTests(
-    name: 'prefer_is_empty',
-    options: ['--fix', 'prefer_is_empty'],
-    expectedSuggestions: ["Replace with 'isEmpty'"],
-  );
-}
diff --git a/pkg/dartfix/test/src/driver_test.dart b/pkg/dartfix/test/src/driver_test.dart
deleted file mode 100644
index 667b723..0000000
--- a/pkg/dartfix/test/src/driver_test.dart
+++ /dev/null
@@ -1,124 +0,0 @@
-// Copyright (c) 2018, 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';
-
-import 'package:analysis_server_client/protocol.dart';
-import 'package:dartfix/src/driver.dart';
-import 'package:test/test.dart';
-
-import 'test_context.dart';
-
-void main() {
-  defineDriverTests(
-    name: 'default',
-    options: [
-      '--fix',
-      'prefer_int_literals',
-      '--fix',
-      'convert_class_to_mixin'
-    ],
-    expectedSuggestions: [
-      'Convert MyMixin to a mixin',
-      'Convert to an int literal',
-    ],
-  );
-}
-
-void defineDriverTests({
-  String name,
-  List<String> options,
-  List<String> expectedSuggestions,
-  bool debug = false,
-  bool updateExample = false,
-}) {
-  var fixFileName = 'example_$name.dart';
-
-  File exampleFile;
-  File exampleFixedFile;
-  Directory exampleDir;
-
-  setUp(() {
-    exampleFile = findFile('pkg/dartfix/example/example.dart');
-    exampleFixedFile = findFile('pkg/dartfix/fixed/$fixFileName');
-    exampleDir = exampleFile.parent;
-  });
-
-  test('fix example - $name', () async {
-    final driver = Driver();
-    final testContext = TestContext();
-    final testLogger = TestLogger(debug: debug);
-    String exampleSource = await exampleFile.readAsString();
-
-    await driver.start([if (debug) '-v', ...options, exampleDir.path],
-        testContext: testContext, testLogger: testLogger);
-    if (debug) {
-      print(testLogger.stderrBuffer.toString());
-      print(testLogger.stdoutBuffer.toString());
-      print('--- original example');
-      print(exampleSource);
-    }
-
-    expect(driver.result.edits, hasLength(1));
-    for (SourceEdit edit in driver.result.edits[0].edits) {
-      exampleSource = edit.apply(exampleSource);
-    }
-    if (debug) {
-      print('--- fixed example');
-      print(exampleSource);
-    }
-
-    final suggestions = driver.result.suggestions;
-    for (var expectedSuggestion in expectedSuggestions) {
-      expectHasSuggestion(suggestions, expectedSuggestion);
-    }
-    expect(suggestions, hasLength(expectedSuggestions.length));
-
-    exampleSource = replaceLeadingComment(exampleSource);
-    if (updateExample) {
-      await exampleFixedFile.writeAsString(exampleSource);
-    } else {
-      final expectedSource = await exampleFixedFile.readAsString();
-      expect(exampleSource, expectedSource);
-    }
-  }, timeout: const Timeout(Duration(minutes: 3)));
-
-  test('run example - $name', () async {
-    if (debug) print('--- launching original example');
-    final futureResult1 =
-        Process.run(Platform.resolvedExecutable, [exampleFile.path]);
-
-    if (debug) print('--- launching fixed example');
-    final futureResult2 =
-        Process.run(Platform.resolvedExecutable, [exampleFixedFile.path]);
-
-    if (debug) print('--- waiting for original example');
-    final result1 = await futureResult1;
-
-    if (debug) print('--- waiting for fixed example');
-    final result2 = await futureResult2;
-
-    final stdout1 = result1.stdout;
-    final stdout2 = result2.stdout;
-    if (debug) {
-      print('--- original example output');
-      print(stdout1);
-      print('--- fixed example output');
-      print(stdout2);
-    }
-    expect(stdout1, stdout2);
-  });
-}
-
-String replaceLeadingComment(String source) => source.replaceAll(
-    '''
-// This file contains code that is modified by running dartfix.
-// After running dartfix, this content matches a file in the "fixed" directory.
-'''
-        .trim(),
-    '''
-// This file contains code that has been modified by running dartfix.
-// See example.dart for the original unmodified code.
-  '''
-        .trim());
diff --git a/pkg/dartfix/test/src/migrate_command_test.dart b/pkg/dartfix/test/src/migrate_command_test.dart
deleted file mode 100644
index a2fcf89..0000000
--- a/pkg/dartfix/test/src/migrate_command_test.dart
+++ /dev/null
@@ -1,200 +0,0 @@
-// Copyright (c) 2020, 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';
-
-import 'package:analysis_server_client/protocol.dart';
-import 'package:cli_util/cli_logging.dart';
-import 'package:dartfix/src/migrate/apply.dart';
-import 'package:dartfix/src/migrate/display.dart';
-import 'package:test/test.dart';
-
-void main() {
-  defineMigrateTests();
-}
-
-void defineMigrateTests() {
-  group('issue render', defineIssueRenderTests);
-  group('SourcePrinter', defineSourcePrinterTests);
-  group('applyEdits', defineApplyEditsTests);
-}
-
-void defineIssueRenderTests() {
-  IssueRenderer renderer;
-  TestLogger logger;
-
-  setUp(() {
-    logger = TestLogger();
-    renderer = IssueRenderer(logger, '.');
-  });
-
-  test('issue1', () {
-    AnalysisError issue = AnalysisError(
-      AnalysisErrorSeverity.ERROR,
-      AnalysisErrorType.COMPILE_TIME_ERROR,
-      Location('foo/bar/baz.dart', 1, 2, 3, 4),
-      'My message.',
-      'my_error_code',
-    );
-
-    renderer.render(issue);
-
-    expect(
-      logger.stdoutText.trim(),
-      contains(platformPath(
-          'error • My message at foo/bar/baz.dart:3:4 • (my_error_code)')),
-    );
-    expect(logger.stderrText, isEmpty);
-  });
-
-  test('issue2', () {
-    AnalysisError issue = AnalysisError(
-      AnalysisErrorSeverity.INFO,
-      AnalysisErrorType.TODO,
-      Location('foo/bar/qux.dart', 1, 2, 3, 4),
-      'todo: My message.',
-      'todo',
-    );
-
-    renderer.render(issue);
-
-    expect(
-        logger.stdoutText,
-        contains(platformPath(
-            'info • todo: My message at foo/bar/qux.dart:3:4 • (todo)')));
-
-    expect(logger.stderrText, isEmpty);
-  });
-}
-
-void defineSourcePrinterTests() {
-  SourcePrinter printer;
-
-  setUp(() {
-    printer = SourcePrinter('''
-void main() {
-  Cat one = Cat('Tabby');
-  print(one);
-}
-
-class Cat {
-  final String name;
-  String color;
-
-  Cat(this.name);
-
-  String toString() {
-    return name?.toString() + ' is ' + color.toString();
-  }
-}
-''');
-  });
-
-  test('add and remove', () {
-    printer.insertText(192, '?');
-    printer.deleteRange(164, 1);
-    printer.insertText(98, '?');
-
-    StringBuffer buf = StringBuffer();
-    printer.processChangedLines((lineNumber, lineText) {
-      buf.writeln('$lineNumber ${lineText.trim()}');
-    });
-
-    expect(buf.toString().trim(), '''
-8 String\x1B[7m?\x1B[0m color;
-13 return name?\x1B[31m\x1B[7m.\x1B[0mtoString() + \' is \' + color\x1B[7m?\x1B[0m.toString();''');
-  });
-}
-
-void defineApplyEditsTests() {
-  test('insert', () {
-    String source = 'one two\nthree four';
-    SourceFileEdit edit = SourceFileEdit('foo.dart', 0, edits: [
-      SourceEdit(0, 0, 'five '),
-    ]);
-
-    String result = applyEdits(edit, source);
-    expect(result, 'five one two\nthree four');
-  });
-
-  test('delete', () {
-    String source = 'one two\nthree four';
-    SourceFileEdit edit = SourceFileEdit('foo.dart', 0, edits: [
-      SourceEdit(0, 4, ''),
-      SourceEdit(8, 6, ''),
-    ]);
-
-    String result = applyEdits(edit, source);
-    expect(result, 'two\nfour');
-  });
-
-  test('insert and delete', () {
-    String source = 'one two\nthree four';
-    SourceFileEdit edit = SourceFileEdit('foo.dart', 0, edits: [
-      SourceEdit(13, 5, ''),
-      SourceEdit(8, 0, 'six '),
-      SourceEdit(7, 1, ' '),
-    ]);
-
-    String result = applyEdits(edit, source);
-    expect(result, 'one two six three');
-  });
-}
-
-class TestLogger implements Logger {
-  final bool debug;
-
-  @override
-  final Ansi ansi;
-  final stdoutBuffer = StringBuffer();
-  final stderrBuffer = StringBuffer();
-
-  TestLogger({this.debug = false}) : ansi = Ansi(false);
-
-  @override
-  void flush() {}
-
-  @override
-  bool get isVerbose => debug;
-
-  @override
-  Progress progress(String message) {
-    return SimpleProgress(this, message);
-  }
-
-  @override
-  void stdout(String message) {
-    stdoutBuffer.writeln(message);
-  }
-
-  @override
-  void write(String message) {
-    stdoutBuffer.write(message);
-  }
-
-  @override
-  void writeCharCode(int charCode) {
-    stdoutBuffer.writeCharCode(charCode);
-  }
-
-  @override
-  void stderr(String message) {
-    stderrBuffer.writeln(message);
-  }
-
-  @override
-  void trace(String message) {
-    if (debug) {
-      stdoutBuffer.writeln(message);
-    }
-  }
-
-  String get stdoutText => stdoutBuffer.toString();
-
-  String get stderrText => stderrBuffer.toString();
-}
-
-String platformPath(String path) {
-  return path.replaceAll('/', Platform.pathSeparator);
-}
diff --git a/pkg/dartfix/test/src/options_test.dart b/pkg/dartfix/test/src/options_test.dart
deleted file mode 100644
index 9843fab..0000000
--- a/pkg/dartfix/test/src/options_test.dart
+++ /dev/null
@@ -1,151 +0,0 @@
-// Copyright (c) 2018, 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:dartfix/src/options.dart';
-import 'package:path/path.dart' as path;
-import 'package:test/test.dart';
-
-import 'test_context.dart';
-
-void main() {
-  TestContext context;
-  TestLogger logger;
-
-  setUp(() {
-    context = TestContext();
-    logger = TestLogger();
-  });
-
-  String p(String filePath) => context.convertPath(filePath);
-
-  Options parse(
-    List<String> args, {
-    String errorOut,
-    int exitCode,
-    bool force = false,
-    List<String> includeFixes = const <String>[],
-    List<String> excludeFixes = const <String>[],
-    bool showHelp = false,
-    String normalOut,
-    bool dependencies = false,
-    bool pedanticFixes = false,
-    bool requiredFixes = false,
-    bool overwrite = false,
-    String serverSnapshot,
-    List<String> targetSuffixes,
-    bool verbose = false,
-  }) {
-    Options options;
-    int actualExitCode;
-    try {
-      options = Options.parse(args, context, logger);
-    } on TestExit catch (e) {
-      actualExitCode = e.code;
-    }
-    expect(logger.stderrBuffer.toString(),
-        errorOut != null ? contains(errorOut) : isEmpty);
-    expect(logger.stdoutBuffer.toString(),
-        normalOut != null ? contains(normalOut) : isEmpty);
-    if (exitCode != null) {
-      expect(actualExitCode, exitCode, reason: 'exit code');
-      return null;
-    } else {
-      expect(actualExitCode, isNull, reason: 'exit code');
-    }
-    expect(options.force, force);
-    expect(options.pedanticFixes, pedanticFixes);
-    expect(options.overwrite, overwrite);
-    expect(options.serverSnapshot, serverSnapshot);
-    expect(options.showHelp, showHelp);
-    expect(options.includeFixes, includeFixes);
-    expect(options.excludeFixes, excludeFixes);
-    expect(options.verbose, verbose);
-    expect(path.isAbsolute(options.sdkPath), isTrue, reason: options.sdkPath);
-    for (String target in options.targets) {
-      expect(target, isNotNull);
-      expect(path.isAbsolute(target), isTrue, reason: '$target');
-    }
-    if (targetSuffixes != null) {
-      for (String suffix in targetSuffixes) {
-        expectContains(options.targets, suffix);
-      }
-    }
-    return options;
-  }
-
-  test('exclude fix', () {
-    parse(['--excludeFix', 'c', '--excludeFix', 'd', 'foo'],
-        excludeFixes: ['c', 'd'], targetSuffixes: ['foo']);
-  });
-
-  test('force', () {
-    parse(['--force', 'foo'], force: true, targetSuffixes: ['foo']);
-  });
-
-  test('help explicit', () {
-    parse(['--help'], normalOut: 'Display this help message', showHelp: true);
-  });
-
-  test('help implicit', () {
-    parse([], normalOut: 'Display this help message', showHelp: true);
-  });
-
-  test('include fix', () {
-    parse(['--fix', 'a', '--fix', 'b', 'foo'],
-        includeFixes: ['a', 'b'], targetSuffixes: ['foo']);
-  });
-
-  test('invalid option', () {
-    parse(['--foo'],
-        errorOut: 'Could not find an option named "foo"', exitCode: 17);
-  });
-
-  test('invalid option no logger', () {
-    try {
-      Options.parse(['--foo'], context, null);
-      fail('Expected exception');
-    } on TestExit catch (e) {
-      expect(e.code, 17, reason: 'exit code');
-    }
-  });
-
-  test('invalid target', () {
-    parse(['foo.dart'],
-        errorOut: 'Expected directory, but found', exitCode: 21);
-  });
-
-  test('overwrite', () {
-    parse(['--overwrite', 'foo'], overwrite: true, targetSuffixes: ['foo']);
-  });
-
-  test('pedantic fixes', () {
-    parse(['--pedantic', 'foo'], pedanticFixes: true);
-  });
-
-  test('server snapshot', () {
-    parse(['--server', 'some/path', 'foo'], serverSnapshot: 'some/path');
-  });
-
-  test('simple', () {
-    parse(['foo'], targetSuffixes: ['foo']);
-  });
-
-  test('two targets', () {
-    parse([p('one/foo'), p('two/bar')],
-        targetSuffixes: [p('one/foo'), p('two/bar')]);
-  });
-
-  test('verbose', () {
-    parse(['--verbose', 'foo'], verbose: true);
-  });
-}
-
-void expectContains(Iterable<String> collection, String suffix) {
-  for (String elem in collection) {
-    if (elem.endsWith(suffix)) {
-      return;
-    }
-  }
-  fail('Expected one of $collection\n  to end with "$suffix"');
-}
diff --git a/pkg/dartfix/test/src/test_context.dart b/pkg/dartfix/test/src/test_context.dart
deleted file mode 100644
index 9e55c3f..0000000
--- a/pkg/dartfix/test/src/test_context.dart
+++ /dev/null
@@ -1,130 +0,0 @@
-// Copyright (c) 2018, 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';
-
-import 'package:analysis_server_client/protocol.dart';
-import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
-import 'package:cli_util/cli_logging.dart';
-import 'package:dartfix/src/context.dart';
-import 'package:test/test.dart';
-
-class TestContext with ResourceProviderMixin implements Context {
-  @override
-  String get workingDir => convertPath('/usr/some/non/existing/directory');
-
-  @override
-  bool exists(String filePath) => true;
-
-  @override
-  void exit(int code) {
-    throw TestExit(code);
-  }
-
-  @override
-  bool isDirectory(String filePath) => !filePath.endsWith('.dart');
-}
-
-class TestExit {
-  final int code;
-
-  TestExit(this.code);
-
-  @override
-  String toString() => 'TestExit($code)';
-}
-
-class TestLogger implements Logger {
-  final bool debug;
-
-  @override
-  final Ansi ansi;
-  final stdoutBuffer = StringBuffer();
-  final stderrBuffer = StringBuffer();
-
-  TestLogger({this.debug = false}) : ansi = Ansi(false);
-
-  @override
-  void flush() {}
-
-  @override
-  bool get isVerbose => debug;
-
-  @override
-  Progress progress(String message) {
-    return SimpleProgress(this, message);
-  }
-
-  @override
-  void stderr(String message) {
-    stderrBuffer.writeln(message);
-  }
-
-  @override
-  void stdout(String message) {
-    stdoutBuffer.writeln(message);
-  }
-
-  @override
-  void write(String message) {
-    stdoutBuffer.write(message);
-  }
-
-  @override
-  void writeCharCode(int charCode) {
-    stdoutBuffer.writeCharCode(charCode);
-  }
-
-  @override
-  void trace(String message) {
-    if (debug) {
-      stdoutBuffer.writeln(message);
-    }
-  }
-}
-
-void expectHasSuggestion(
-    List<DartFixSuggestion> suggestions, String expectedText) {
-  for (DartFixSuggestion suggestion in suggestions) {
-    if (suggestion.description.contains(expectedText)) {
-      return;
-    }
-  }
-  fail('Failed to find suggestion containing: $expectedText\n'
-      'in ${suggestions.map((s) => s.description).toList()}');
-}
-
-void expectDoesNotHaveSuggestion(
-    List<DartFixSuggestion> suggestions, String expectedText) {
-  for (DartFixSuggestion suggestion in suggestions) {
-    if (suggestion.description.contains(expectedText)) {
-      fail('Did not expect to find suggestion containing: $expectedText');
-    }
-  }
-}
-
-File findFile(String relPath) {
-  Directory dir = Directory.current;
-  while (true) {
-    final file = File.fromUri(dir.uri.resolve(relPath));
-    if (file.existsSync()) {
-      return file;
-    }
-    final parent = dir.parent;
-    if (parent.path == dir.path) {
-      fail('Failed to find $relPath');
-    }
-    dir = parent;
-  }
-}
-
-String findValue(File pubspec, String key) {
-  List<String> lines = pubspec.readAsLinesSync();
-  for (String line in lines) {
-    if (line.trim().startsWith('$key:')) {
-      return line.split(':')[1].trim();
-    }
-  }
-  fail('Failed to find $key in ${pubspec.path}');
-}
diff --git a/pkg/dartfix/test/test_all.dart b/pkg/dartfix/test/test_all.dart
deleted file mode 100644
index 0b1908e..0000000
--- a/pkg/dartfix/test/test_all.dart
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright (c) 2018, 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:test/test.dart';
-
-import 'src/driver_example_test.dart' as driver_example;
-import 'src/driver_exclude_test.dart' as driver_exclude;
-import 'src/driver_help_test.dart' as driver_help;
-import 'src/driver_include_test.dart' as driver_include;
-import 'src/driver_pedantic_test.dart' as driver_pedantic;
-import 'src/driver_prefer_is_empty_test.dart' as driver_prefer_is_empty;
-import 'src/driver_test.dart' as driver;
-import 'src/migrate_command_test.dart' as migrate_command_test;
-import 'src/options_test.dart' as options_test;
-
-void main() {
-  group('driver', driver_example.main);
-  group('driver', driver_exclude.main);
-  group('driver', driver_help.main);
-  group('driver', driver_include.main);
-  group('driver', driver_pedantic.main);
-  group('driver', driver_prefer_is_empty.main);
-  group('driver', driver.main);
-  group('migrate', migrate_command_test.main);
-  group('options', options_test.main);
-}
diff --git a/pkg/dds/CHANGELOG.md b/pkg/dds/CHANGELOG.md
index f959b95..32be6a6 100644
--- a/pkg/dds/CHANGELOG.md
+++ b/pkg/dds/CHANGELOG.md
@@ -1,3 +1,8 @@
+# 1.5.0
+- Added event caching for `Stdout`, `Stderr`, and `Extension` streams. When a
+client subscribes to one of these streams, they will be sent up to 10,000
+historical events from the stream.
+
 # 1.4.1
 - Fixed issue where `evaluate` and `evaluateInFrame` requests were not being
   forwarded to the VM service properly when no external compilation service
diff --git a/pkg/dds/dds_protocol.md b/pkg/dds/dds_protocol.md
index be9da7e..253ef99 100644
--- a/pkg/dds/dds_protocol.md
+++ b/pkg/dds/dds_protocol.md
@@ -47,6 +47,22 @@
 
 See the corresponding section in the VM Service protocol [here][service-protocol-ids-and-names].
 
+## Streams
+
+For a list of core VM service streams, see [streamListen][service-protocol-streams].
+
+DDS will keep a history of events on certain streams and send historical events
+when a client first subscribes to a stream with history. These streams currently
+consist of the following:
+
+- `Logging`
+- `Stdout`
+- `Stderr`
+- `Extension`
+
+In addition, subscribing to the `Service` stream will result in a `ServiceRegistered`
+event being sent to the subscribing client for each existing service extension.
+
 ## Public RPCs
 
 The DDS Protocol supports all [public RPCs defined in the VM Service protocol][service-protocol-public-rpcs].
@@ -187,6 +203,7 @@
 [service-protocol]: https://github.com/dart-lang/sdk/blob/master/runtime/vm/service/service.md
 [service-protocol-rpcs-requests-and-responses]: https://github.com/dart-lang/sdk/blob/master/runtime/vm/service/service.md#rpcs-requests-and-responses
 [service-protocol-events]: https://github.com/dart-lang/sdk/blob/master/runtime/vm/service/service.md#events
+[service-protocol-streams]: https://github.com/dart-lang/sdk/blob/master/runtime/vm/service/service.md#streamlisten
 [service-protocol-binary-events]: https://github.com/dart-lang/sdk/blob/master/runtime/vm/service/service.md#binary-events
 [service-protocol-types]: https://github.com/dart-lang/sdk/blob/master/runtime/vm/service/service.md#types
 [service-protocol-ids-and-names]: https://github.com/dart-lang/sdk/blob/master/runtime/vm/service/service.md#ids-and-names
diff --git a/pkg/dds/lib/src/client.dart b/pkg/dds/lib/src/client.dart
index 79e4233..2c85aae 100644
--- a/pkg/dds/lib/src/client.dart
+++ b/pkg/dds/lib/src/client.dart
@@ -140,7 +140,9 @@
         'getLogHistorySize',
         (parameters) => {
               'type': 'Size',
-              'size': dds.loggingRepository.bufferSize,
+              'size': _StreamManager
+                  .loggingRepositories[_StreamManager.kLoggingStream]
+                  .bufferSize,
             });
 
     _clientPeer.registerMethod('setLogHistorySize', (parameters) {
@@ -150,7 +152,8 @@
           "'size' must be greater or equal to zero",
         );
       }
-      dds.loggingRepository.resize(size);
+      _StreamManager.loggingRepositories[_StreamManager.kLoggingStream]
+          .resize(size);
       return _RPCResponses.success;
     });
 
diff --git a/pkg/dds/lib/src/dds_impl.dart b/pkg/dds/lib/src/dds_impl.dart
index 06327a8..d2a6dcb 100644
--- a/pkg/dds/lib/src/dds_impl.dart
+++ b/pkg/dds/lib/src/dds_impl.dart
@@ -10,7 +10,6 @@
     _clientManager = _ClientManager(this);
     _expressionEvaluator = _ExpressionEvaluator(this);
     _isolateManager = _IsolateManager(this);
-    _loggingRepository = _LoggingRepository();
     _streamManager = _StreamManager(this);
     _authCode = _authCodesEnabled ? _makeAuthToken() : '';
   }
@@ -270,9 +269,6 @@
   _IsolateManager get isolateManager => _isolateManager;
   _IsolateManager _isolateManager;
 
-  _LoggingRepository get loggingRepository => _loggingRepository;
-  _LoggingRepository _loggingRepository;
-
   _StreamManager get streamManager => _streamManager;
   _StreamManager _streamManager;
 
diff --git a/pkg/dds/lib/src/stream_manager.dart b/pkg/dds/lib/src/stream_manager.dart
index abb233c..542fe91 100644
--- a/pkg/dds/lib/src/stream_manager.dart
+++ b/pkg/dds/lib/src/stream_manager.dart
@@ -91,7 +91,14 @@
     // The _IsolateManager requires information from both the Debug and
     // Isolate streams, so they must always be subscribed to by DDS.
     for (final stream in ddsCoreStreams) {
-      await streamListen(null, stream);
+      try {
+        await streamListen(null, stream);
+        if (loggingRepositoryStreams.contains(stream)) {
+          loggingRepositories[stream] = _LoggingRepository();
+        }
+      } on json_rpc.RpcException {
+        // Stdout and Stderr streams may not exist.
+      }
     }
     dds._vmServiceClient.registerMethod(
       'streamNotify',
@@ -101,10 +108,10 @@
         if (isolateManagerStreams.contains(streamId)) {
           dds.isolateManager.handleIsolateEvent(parameters);
         }
-        // Keep a history of log messages to send to clients when they first
-        // subscribe to the Logging stream.
-        if (streamId == kLoggingStream) {
-          dds.loggingRepository.add(parameters.asMap);
+        // Keep a history of messages to send to clients when they first
+        // subscribe to a stream with an event history.
+        if (loggingRepositories.containsKey(streamId)) {
+          loggingRepositories[streamId].add(parameters.asMap);
         }
         streamNotify(streamId, parameters.value);
       },
@@ -137,8 +144,8 @@
     }
     if (client != null) {
       streamListeners[stream].add(client);
-      if (stream == kLoggingStream) {
-        dds.loggingRepository.sendHistoricalLogs(client);
+      if (loggingRepositories.containsKey(stream)) {
+        loggingRepositories[stream].sendHistoricalLogs(client);
       } else if (stream == kServiceStream) {
         // Send all previously registered service extensions when a client
         // subscribes to the Service stream.
@@ -223,8 +230,13 @@
   );
 
   static const kDebugStream = 'Debug';
+  static const kExtensionStream = 'Extension';
   static const kIsolateStream = 'Isolate';
   static const kLoggingStream = 'Logging';
+  static const kStderrStream = 'Stderr';
+  static const kStdoutStream = 'Stdout';
+
+  static Map<String, _LoggingRepository> loggingRepositories = {};
 
   // Never cancel the Debug or Isolate stream as `_IsolateManager` requires
   // them for isolate state notifications.
@@ -233,10 +245,13 @@
     kIsolateStream,
   };
 
-  // Never cancel the Logging stream as `_LoggingRepository` requires it to
-  // keep a log history.
+  // Never cancel the logging and extension event streams as `_LoggingRepository`
+  // requires them keep history.
   static const loggingRepositoryStreams = <String>{
+    kExtensionStream,
     kLoggingStream,
+    kStderrStream,
+    kStdoutStream,
   };
 
   // The set of streams that DDS requires to function.
diff --git a/pkg/dds/pubspec.yaml b/pkg/dds/pubspec.yaml
index a7ae669..d2fdbdb 100644
--- a/pkg/dds/pubspec.yaml
+++ b/pkg/dds/pubspec.yaml
@@ -3,7 +3,7 @@
   A library used to spawn the Dart Developer Service, used to communicate with
   a Dart VM Service instance.
 
-version: 1.4.1
+version: 1.5.0
 
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/dds
 
diff --git a/pkg/dev_compiler/README.md b/pkg/dev_compiler/README.md
index ea460c0..1a9e625 100644
--- a/pkg/dev_compiler/README.md
+++ b/pkg/dev_compiler/README.md
@@ -2,9 +2,9 @@
 
 # Soundness and Restrictions
 
-DDC is built upon Dart's [sound](https://www.dartlang.org/guides/language/sound-dart) type system.  It only compiles programs that statically type check (i.e., no strong mode errors).  It leverages static type checking to generate simpler, readable, and more idiomatic code with fewer runtime checks.  In general, DDC is able to provide stronger type guarantees - i.e., *soundness* - than traditional Dart checked mode with significantly fewer runtime checks.
+DDC is built upon Dart's [sound](https://dart.dev/guides/language/type-system) type system.  It only compiles programs that statically type check (i.e., no strong mode errors).  It leverages static type checking to generate simpler, readable, and more idiomatic code with fewer runtime checks.  In general, DDC is able to provide stronger type guarantees - i.e., *soundness* - than traditional Dart checked mode with significantly fewer runtime checks.
 
-With strong mode, DDC is stricter than traditional Dart production mode or checked mode.  Running existing Dart code on DDC will generally require fixing both static and runtime type errors.  
+With strong mode, DDC is stricter than traditional Dart production mode or checked mode.  Running existing Dart code on DDC will generally require fixing both static and runtime type errors.
 
 For example, although the following snippet will run in production or checked mode, it will fail to compile with DDC:
 
diff --git a/pkg/dev_compiler/USAGE.md b/pkg/dev_compiler/USAGE.md
index ccdf8aa..e2f0b69 100644
--- a/pkg/dev_compiler/USAGE.md
+++ b/pkg/dev_compiler/USAGE.md
@@ -79,6 +79,3 @@
 
 Please file issues in our [GitHub issue
 tracker](https://github.com/dart-lang/sdk/issues).
-
-You can also view or join our [mailing
-list](https://groups.google.com/a/dartlang.org/forum/#!forum/dev-compiler).
diff --git a/pkg/dev_compiler/bin/dartdevc.dart b/pkg/dev_compiler/bin/dartdevc.dart
index baf9c9a..87da5bb 100755
--- a/pkg/dev_compiler/bin/dartdevc.dart
+++ b/pkg/dev_compiler/bin/dartdevc.dart
@@ -3,6 +3,8 @@
 // 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.
 
+// @dart = 2.9
+
 /// Command line entry point for Dart Development Compiler (dartdevc), used to
 /// compile a collection of dart libraries into a single JS module
 
diff --git a/pkg/dev_compiler/doc/PUBLISH.md b/pkg/dev_compiler/doc/PUBLISH.md
deleted file mode 100644
index 31eccfa..0000000
--- a/pkg/dev_compiler/doc/PUBLISH.md
+++ /dev/null
@@ -1,53 +0,0 @@
-# Publish instructions for Dart Dev Compiler
-
-There are the steps for developers on the Dart Dev Compiler team to publish a new version to pub.  The edit steps can be done directly on github if preferred.
-
-## Obtain permission
-
-If you have not uploaded before, you may need to ask [an existing uploader](https://pub.dartlang.org/packages/dev_compiler) to grant you permission.  They'll need to run:
-
-```
-> pub uploader add <your-email-address>
-```
-
-## Update the version number
-
-Update the following files with the new version number:
-
-  - [pubspec.yaml](https://github.com/dart-lang/dev_compiler/blob/master/pubspec.yaml)
-  - [package.json](https://github.com/dart-lang/dev_compiler/blob/master/package.json)
-  - [lib/devc.dart](https://github.com/dart-lang/dev_compiler/blob/master/lib/devc.dart) (see the devCompilerVersion constant)
-
-## Update the Changelog
-
-Update [CHANGELOG.md](https://github.com/dart-lang/dev_compiler/blob/master/CHANGELOG.md) with notable changes since the last release.
-
-## Update your local master
-
-Make sure the above is committed to github master.  Make sure you have those updates in your local master:
-
-```
-> git pull
-```
-
-## Tag the new version locally
-
-```
-> git tag <new-version-number> # E.g., git tag 0.1.14
-```
-
-## Push the tag
-
-```
-> git push --tags
-```
-
-Check the [github site](https://github.com/dart-lang/dev_compiler) to make sure the tag appears there under the `Branch` button.
-
-## Publish the new version to pub
-
-```
-> pub lish
-```
-
-Check [pub.dartlang.org](https://pub.dartlang.org/packages/dev_compiler) to ensure the latest DDC is there.
diff --git a/pkg/dev_compiler/doc/STATIC_SAFETY.md b/pkg/dev_compiler/doc/STATIC_SAFETY.md
index 8cddbf5..9201c33 100644
--- a/pkg/dev_compiler/doc/STATIC_SAFETY.md
+++ b/pkg/dev_compiler/doc/STATIC_SAFETY.md
@@ -54,7 +54,7 @@
 
 With strong mode, we want to provide stronger typing while preserving the
 terseness of Dart. [Idiomatic Dart
-code](https://www.dartlang.org/effective-dart/) discourages type annotations
+code](https://dart.dev/guides/language/effective-dart) discourages type annotations
 outside of API boundaries, and user shouldn't have to add more types to get
 better checking. Instead, strong mode uses type inference.
 
@@ -443,7 +443,7 @@
 }
 ```
 
-This option is experimental and may be changed or removed in the future. Feedback is appreciated! Contact us at our [mailing list](https://groups.google.com/a/dartlang.org/forum/#!forum/dev-compiler).
+This option is experimental and may be changed or removed in the future.
 Try it out in your project by editing .analysis_options:
 
 ```yaml
@@ -505,7 +505,7 @@
 
 This feature is to prevent accidental use of `dynamic` in code that does not intend to use it.
 
-This option is experimental and may be changed or removed in the future. Feedback is appreciated! Contact us at our [mailing list](https://groups.google.com/a/dartlang.org/forum/#!forum/dev-compiler).
+This option is experimental and may be changed or removed in the future.
 Try it out in your project by editing .analysis_options:
 
 ```yaml
@@ -527,4 +527,4 @@
 `is` and `as` checks trigger runtime errors.  We are considering introducing static
 errors for these cases.
 
-[dartspec]: https://www.dartlang.org/docs/spec/ "Dart Language Spec"
+[dartspec]: https://dart.dev/guides/language/spec "Dart Language Spec"
diff --git a/pkg/dev_compiler/lib/dev_compiler.dart b/pkg/dev_compiler/lib/dev_compiler.dart
index ca0a8bd..899fd4f 100644
--- a/pkg/dev_compiler/lib/dev_compiler.dart
+++ b/pkg/dev_compiler/lib/dev_compiler.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 // The dev_compiler does not have a publishable public API, instead this is
 // intended for other consumers within the Dart SDK.
 export 'src/compiler/module_builder.dart' show ModuleFormat, parseModuleFormat;
diff --git a/pkg/dev_compiler/lib/js/legacy/dart_library.js b/pkg/dev_compiler/lib/js/legacy/dart_library.js
index 82670a9..609945c 100644
--- a/pkg/dev_compiler/lib/js/legacy/dart_library.js
+++ b/pkg/dev_compiler/lib/js/legacy/dart_library.js
@@ -293,14 +293,18 @@
       if (library.onReloadEnd) {
         library.onReloadEnd();
         return;
-      } else {
-        document.body = _originalBody;
+      } else { 
+        if (dart_sdk.dart.global.document) {
+          dart_sdk.dart.global.document.body = _originalBody;
+        }
       }
     } else {
       // If not a reload then store the initial html to reset it on reload.
-      _originalBody = document.body.cloneNode(true);
+      if (dart_sdk.dart.global.document) {
+        _originalBody = dart_sdk.dart.global.document.body.cloneNode(true);
+      }
     }
-    library.main();
+    library.main([]);
   }
   dart_library.start = start;
 
diff --git a/pkg/dev_compiler/lib/src/compiler/js_metalet.dart b/pkg/dev_compiler/lib/src/compiler/js_metalet.dart
index 8941bb0..d9ff9c1 100644
--- a/pkg/dev_compiler/lib/src/compiler/js_metalet.dart
+++ b/pkg/dev_compiler/lib/src/compiler/js_metalet.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 // TODO(jmesserly): import from its own package
 import '../js_ast/js_ast.dart';
 import 'js_names.dart' show TemporaryId;
diff --git a/pkg/dev_compiler/lib/src/compiler/js_names.dart b/pkg/dev_compiler/lib/src/compiler/js_names.dart
index 647f6fb..7d3ff1e 100644
--- a/pkg/dev_compiler/lib/src/compiler/js_names.dart
+++ b/pkg/dev_compiler/lib/src/compiler/js_names.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 import 'dart:collection';
 
 import '../js_ast/js_ast.dart';
diff --git a/pkg/dev_compiler/lib/src/compiler/js_typerep.dart b/pkg/dev_compiler/lib/src/compiler/js_typerep.dart
index f5e355b..c1291a3 100644
--- a/pkg/dev_compiler/lib/src/compiler/js_typerep.dart
+++ b/pkg/dev_compiler/lib/src/compiler/js_typerep.dart
@@ -1,4 +1,7 @@
 /// An abstraction of the JS types
+
+// @dart = 2.9
+
 abstract class JSType {
   const JSType();
 
diff --git a/pkg/dev_compiler/lib/src/compiler/js_utils.dart b/pkg/dev_compiler/lib/src/compiler/js_utils.dart
index 8b936e7..f6feb7d 100644
--- a/pkg/dev_compiler/lib/src/compiler/js_utils.dart
+++ b/pkg/dev_compiler/lib/src/compiler/js_utils.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 import '../js_ast/js_ast.dart';
 
 /// Simplify `(args) => (() => { ... })()` to `(args) => { ... }`.
diff --git a/pkg/dev_compiler/lib/src/compiler/module_builder.dart b/pkg/dev_compiler/lib/src/compiler/module_builder.dart
index dd1cc90..847185d 100644
--- a/pkg/dev_compiler/lib/src/compiler/module_builder.dart
+++ b/pkg/dev_compiler/lib/src/compiler/module_builder.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 import 'package:args/args.dart' show ArgParser, ArgResults;
 import 'package:dev_compiler/src/compiler/shared_compiler.dart';
 import 'package:path/path.dart' as p;
diff --git a/pkg/dev_compiler/lib/src/compiler/shared_command.dart b/pkg/dev_compiler/lib/src/compiler/shared_command.dart
index 358f238..cf67f91 100644
--- a/pkg/dev_compiler/lib/src/compiler/shared_command.dart
+++ b/pkg/dev_compiler/lib/src/compiler/shared_command.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 import 'dart:async';
 import 'dart:io';
 
diff --git a/pkg/dev_compiler/lib/src/compiler/shared_compiler.dart b/pkg/dev_compiler/lib/src/compiler/shared_compiler.dart
index 542552a..0269dd30 100644
--- a/pkg/dev_compiler/lib/src/compiler/shared_compiler.dart
+++ b/pkg/dev_compiler/lib/src/compiler/shared_compiler.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 import 'dart:collection';
 import 'package:meta/meta.dart';
 
diff --git a/pkg/dev_compiler/lib/src/js_ast/builder.dart b/pkg/dev_compiler/lib/src/js_ast/builder.dart
index cf9c5c2..ed3c8e3 100644
--- a/pkg/dev_compiler/lib/src/js_ast/builder.dart
+++ b/pkg/dev_compiler/lib/src/js_ast/builder.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 // ignore_for_file: slash_for_doc_comments, unnecessary_new
 // ignore_for_file: always_declare_return_types, prefer_single_quotes
 // ignore_for_file: prefer_collection_literals, omit_local_variable_types
diff --git a/pkg/dev_compiler/lib/src/js_ast/characters.dart b/pkg/dev_compiler/lib/src/js_ast/characters.dart
index e3382c3..1ce0d48 100644
--- a/pkg/dev_compiler/lib/src/js_ast/characters.dart
+++ b/pkg/dev_compiler/lib/src/js_ast/characters.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 const int $EOF = 0;
 const int $STX = 2;
 const int $BS = 8;
diff --git a/pkg/dev_compiler/lib/src/js_ast/js_ast.dart b/pkg/dev_compiler/lib/src/js_ast/js_ast.dart
index 6140225..373547e 100644
--- a/pkg/dev_compiler/lib/src/js_ast/js_ast.dart
+++ b/pkg/dev_compiler/lib/src/js_ast/js_ast.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 // ignore_for_file: directives_ordering
 
 library js_ast;
diff --git a/pkg/dev_compiler/lib/src/js_ast/nodes.dart b/pkg/dev_compiler/lib/src/js_ast/nodes.dart
index 14db172..137bfd4 100644
--- a/pkg/dev_compiler/lib/src/js_ast/nodes.dart
+++ b/pkg/dev_compiler/lib/src/js_ast/nodes.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 // ignore_for_file: slash_for_doc_comments, prefer_single_quotes
 // ignore_for_file: always_declare_return_types, prefer_final_fields
 // ignore_for_file: always_require_non_null_named_parameters
diff --git a/pkg/dev_compiler/lib/src/js_ast/precedence.dart b/pkg/dev_compiler/lib/src/js_ast/precedence.dart
index f149dc2..50f69ed 100644
--- a/pkg/dev_compiler/lib/src/js_ast/precedence.dart
+++ b/pkg/dev_compiler/lib/src/js_ast/precedence.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 const EXPRESSION = 0;
 // TODO(nshahan) No longer used for the spread operator.
 // All precedence levels need to be updated to be more accurate.
diff --git a/pkg/dev_compiler/lib/src/js_ast/printer.dart b/pkg/dev_compiler/lib/src/js_ast/printer.dart
index ccf3275..d62126b 100644
--- a/pkg/dev_compiler/lib/src/js_ast/printer.dart
+++ b/pkg/dev_compiler/lib/src/js_ast/printer.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 // ignore_for_file: slash_for_doc_comments, unnecessary_const
 // ignore_for_file: always_declare_return_types, prefer_single_quotes
 // ignore_for_file: prefer_collection_literals, omit_local_variable_types
diff --git a/pkg/dev_compiler/lib/src/js_ast/source_map_printer.dart b/pkg/dev_compiler/lib/src/js_ast/source_map_printer.dart
index 6acee34..e770e99 100644
--- a/pkg/dev_compiler/lib/src/js_ast/source_map_printer.dart
+++ b/pkg/dev_compiler/lib/src/js_ast/source_map_printer.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 // ignore_for_file: always_declare_return_types, omit_local_variable_types
 
 import 'package:source_maps/source_maps.dart' hide Printer;
diff --git a/pkg/dev_compiler/lib/src/js_ast/template.dart b/pkg/dev_compiler/lib/src/js_ast/template.dart
index 73d840b..4cdad6d 100644
--- a/pkg/dev_compiler/lib/src/js_ast/template.dart
+++ b/pkg/dev_compiler/lib/src/js_ast/template.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 // ignore_for_file: slash_for_doc_comments, omit_local_variable_types
 // ignore_for_file: always_declare_return_types, prefer_collection_literals
 // ignore_for_file: prefer_single_quotes, prefer_generic_function_type_aliases
diff --git a/pkg/dev_compiler/lib/src/kernel/command.dart b/pkg/dev_compiler/lib/src/kernel/command.dart
index 6598642..fb3f3c8 100644
--- a/pkg/dev_compiler/lib/src/kernel/command.dart
+++ b/pkg/dev_compiler/lib/src/kernel/command.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 import 'dart:async';
 import 'dart:convert' show json;
 import 'dart:io';
@@ -246,7 +248,7 @@
     fe.printDiagnosticMessage(message, print);
   }
 
-  var experiments = fe.parseExperimentalFlags(options.experiments,
+  var explicitExperimentalFlags = fe.parseExperimentalFlags(options.experiments,
       onError: stderr.writeln, onWarning: print);
 
   var trackWidgetCreation =
@@ -273,7 +275,7 @@
             trackWidgetCreation: trackWidgetCreation,
             enableNullSafety: options.enableNullSafety)),
         fileSystem: fileSystem,
-        experiments: experiments,
+        explicitExperimentalFlags: explicitExperimentalFlags,
         environmentDefines: declaredVariables,
         nnbdMode:
             options.soundNullSafety ? fe.NnbdMode.Strong : fe.NnbdMode.Weak);
@@ -312,7 +314,7 @@
             trackWidgetCreation: trackWidgetCreation,
             enableNullSafety: options.enableNullSafety)),
         fileSystem: fileSystem,
-        experiments: experiments,
+        explicitExperimentalFlags: explicitExperimentalFlags,
         environmentDefines: declaredVariables,
         trackNeededDillLibraries: recordUsedInputs,
         nnbdMode:
@@ -347,7 +349,8 @@
   var component = result.component;
   var librariesFromDill = result.computeLibrariesFromDill();
   var compiledLibraries =
-      Component(nameRoot: component.root, uriToSource: component.uriToSource);
+      Component(nameRoot: component.root, uriToSource: component.uriToSource)
+        ..setMainMethodAndMode(null, false, component.mode);
   for (var lib in component.libraries) {
     if (!librariesFromDill.contains(lib)) compiledLibraries.libraries.add(lib);
   }
diff --git a/pkg/dev_compiler/lib/src/kernel/compiler.dart b/pkg/dev_compiler/lib/src/kernel/compiler.dart
index 153240b..16cd2fe 100644
--- a/pkg/dev_compiler/lib/src/kernel/compiler.dart
+++ b/pkg/dev_compiler/lib/src/kernel/compiler.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 import 'dart:collection';
 import 'dart:convert';
 import 'dart:math' show max, min;
@@ -248,7 +250,7 @@
       types,
       hierarchy,
       jsTypeRep,
-      NullableInference(jsTypeRep, staticTypeContext),
+      NullableInference(jsTypeRep, staticTypeContext, options: options),
       staticTypeContext,
       options,
       importToSummary,
@@ -579,11 +581,8 @@
 
     var finishGenericTypeTest = _emitClassTypeTests(c, className, body);
 
-    // Attach caches on all canonicalized types not in our runtime.
-    // Types in the runtime will have caches attached in their constructors.
-    if (!isSdkInternalRuntime(_currentLibrary)) {
-      body.add(runtimeStatement('addTypeCaches(#)', [className]));
-    }
+    // Attach caches on all canonicalized types.
+    body.add(runtimeStatement('addTypeCaches(#)', [className]));
 
     _emitVirtualFieldSymbols(c, body);
     _emitClassSignature(c, className, body);
@@ -1071,7 +1070,7 @@
             c == _coreTypes.stringClass ||
             c == _coreTypes.functionClass ||
             c == _coreTypes.intClass ||
-            c == _coreTypes.nullClass ||
+            c == _coreTypes.deprecatedNullClass ||
             c == _coreTypes.numClass ||
             c == _coreTypes.doubleClass ||
             c == _coreTypes.boolClass)) {
@@ -1080,29 +1079,8 @@
     }
 
     if (c == _coreTypes.deprecatedFutureOrClass) {
-      // These methods are difficult to place in the runtime or patch files.
-      // * They need to be callable from the class but they can't be static
-      //   methods on the FutureOr class in Dart because they reference the
-      //   generic type parameter.
-      // * There isn't an obvious place in dart:_runtime were we could place a
-      //   method that adds these type tests (similar to addTypeTests()) because
-      //   in the bootstrap ordering the Future class hasn't been defined yet.
-      var typeParam =
-          TypeParameterType(c.typeParameters[0], Nullability.undetermined);
-      var typeT = visitTypeParameterType(typeParam);
-      var futureOfT = visitInterfaceType(InterfaceType(
-          _coreTypes.futureClass, currentLibrary.nonNullable, [typeParam]));
-      body.add(js.statement('''
-          #.is = function is_FutureOr(o) {
-            return #.is(o) || #.is(o);
-          }
-          ''', [className, typeT, futureOfT]));
-      body.add(js.statement('''
-          #.as = function as_FutureOr(o) {
-            if (#.is(o) || #.is(o)) return o;
-            return #.as(o, this);
-          }
-          ''', [className, typeT, futureOfT, runtimeModule]));
+      // Custom type tests for FutureOr types are attached when the type is
+      // constructed in the runtime normalizeFutureOr method.
       return null;
     }
 
@@ -1774,14 +1752,23 @@
   js_ast.Fun _emitNativeFunctionBody(Procedure node) {
     var name = _annotationName(node, isJSAnnotation) ?? node.name.text;
     if (node.isGetter) {
-      return js_ast.Fun([], js.block('{ return this.#; }', [name]));
+      var returnValue = js('this.#', [name]);
+      if (_isNullCheckableNative(node)) {
+        // Add a potential null-check on native getter if type is non-nullable.
+        returnValue = runtimeCall('checkNativeNonNull(#)', [returnValue]);
+      }
+      return js_ast.Fun([], js.block('{ return #; }', [returnValue]));
     } else if (node.isSetter) {
       var params = _emitParameters(node.function);
       return js_ast.Fun(
           params, js.block('{ this.# = #; }', [name, params.last]));
     } else {
-      return js.fun(
-          'function (...args) { return this.#.apply(this, args); }', name);
+      var returnValue = js('this.#.apply(this, args)', [name]);
+      if (_isNullCheckableNative(node)) {
+        // Add a potential null-check on return value if type is non-nullable.
+        returnValue = runtimeCall('checkNativeNonNull(#)', [returnValue]);
+      }
+      return js.fun('function (...args) { return #; }', [returnValue]);
     }
   }
 
@@ -2268,6 +2255,10 @@
       // Fields on a native class are implicitly native.
       // Methods/getters/setters are marked external/native.
       if (member is Field || _isExternal(member)) {
+        // If the native member needs to be null-checked and we're running in
+        // sound null-safety, we require symbolizing it in order to access the
+        // null-check at the member definition.
+        if (_isNullCheckableNative(member)) return true;
         var jsName = _annotationName(member, isJSName);
         return jsName != null && jsName != name;
       } else {
@@ -2576,12 +2567,16 @@
 
   @override
   js_ast.Expression visitBottomType(BottomType type) =>
-      _emitType(_types.nullType);
+      _emitType(const NullType());
+
+  @override
+  js_ast.Expression visitNullType(NullType type) =>
+      _emitInterfaceType(_coreTypes.deprecatedNullType);
 
   @override
   js_ast.Expression visitNeverType(NeverType type) =>
       type.nullability == Nullability.nullable
-          ? visitInterfaceType(_coreTypes.nullType)
+          ? visitNullType(const NullType())
           : _emitNullabilityWrapper(runtimeCall('Never'), type.nullability);
 
   /// Normalizes `FutureOr` types and emits the normalized version.
@@ -2614,8 +2609,7 @@
       // FutureOr<Never> --> Future<Never>
       return _emitInterfaceType(InterfaceType(
           _coreTypes.futureClass, futureOr.nullability, [typeArgument]));
-    } else if (typeArgument is InterfaceType &&
-        typeArgument.classNode == _coreTypes.nullClass) {
+    } else if (typeArgument is NullType) {
       // FutureOr<Null> --> Future<Null>?
       return _emitInterfaceType(InterfaceType(
           _coreTypes.futureClass, Nullability.nullable, [typeArgument]));
@@ -2699,7 +2693,7 @@
     // * The types were written in JS context or as part of the dart:_runtime
     //   library.
     if (!emitNullability ||
-        type == _coreTypes.nullType ||
+        type == _coreTypes.deprecatedNullType ||
         // TODO(38701) Remove these once the SDK has unforked and is running
         // "opted-in"
         !coreLibrary.isNonNullableByDefault &&
@@ -2987,12 +2981,49 @@
     // size on expression evaluation is better.
     // Issue: https://github.com/dart-lang/sdk/issues/43288
     var fun = _emitFunction(functionNode, name);
-    var items = _typeTable?.discharge();
-    var body = js_ast.Block([...?items, ...fun.body.statements]);
 
+    var types = _typeTable.discharge();
+    var constants = _dischargeConstTable();
+
+    var body = js_ast.Block([...?types, ...?constants, ...fun.body.statements]);
     return js_ast.Fun(fun.params, body);
   }
 
+  /// Emit all collected const symbols
+  ///
+  /// This is similar to how constants are emitted during
+  /// initial compilation in emitModule
+  ///
+  /// TODO: unify the code with emitModule.
+  List<js_ast.Statement> _dischargeConstTable() {
+    var items = <js_ast.Statement>[];
+
+    if (_constLazyAccessors.isNotEmpty) {
+      var constTableBody = runtimeStatement(
+          'defineLazy(#, { # }, false)', [_constTable, _constLazyAccessors]);
+      items.add(constTableBody);
+      _constLazyAccessors.clear();
+    }
+
+    _copyAndFlattenBlocks(items, moduleItems);
+    moduleItems.clear();
+    return items;
+  }
+
+  /// Flattens blocks in [items] to a single list.
+  ///
+  /// This will not flatten blocks that are marked as being scopes.
+  void _copyAndFlattenBlocks(
+      List<js_ast.Statement> result, Iterable<js_ast.ModuleItem> items) {
+    for (var item in items) {
+      if (item is js_ast.Block && !item.isScope) {
+        _copyAndFlattenBlocks(result, item.statements);
+      } else {
+        result.add(item as js_ast.Statement);
+      }
+    }
+  }
+
   js_ast.Fun _emitFunction(FunctionNode f, String name) {
     // normal function (sync), vs (sync*, async, async*)
     var isSync = f.asyncMarker == AsyncMarker.Sync;
@@ -4213,14 +4244,8 @@
 
   @override
   js_ast.Expression visitPropertyGet(PropertyGet node) {
-    var propertyGet =
-        _emitPropertyGet(node.receiver, node.interfaceTarget, node.name.text);
-    if (_isCheckableNative(node.interfaceTarget)) {
-      // If target is a native getter with a non-nullable type, add a null check
-      // for soundness.
-      return runtimeCall('checkNativeNonNull(#)', [propertyGet]);
-    }
-    return propertyGet;
+    return _emitPropertyGet(
+        node.receiver, node.interfaceTarget, node.name.text);
   }
 
   @override
@@ -4263,9 +4288,9 @@
 
     if (_reifyTearoff(member)) {
       return runtimeCall('bind(#, #)', [jsReceiver, jsName]);
-    } else if (isJsMember(member) &&
-        member is Procedure &&
-        !member.isAccessor) {
+    } else if (member is Procedure &&
+        !member.isAccessor &&
+        isJsMember(member)) {
       return runtimeCall(
           'tearoffInterop(#)', [js_ast.PropertyAccess(jsReceiver, jsName)]);
     } else {
@@ -4274,14 +4299,18 @@
   }
 
   /// Return whether [member] returns a native object whose type needs to be
-  /// checked.
-  bool _isCheckableNative(Member member) =>
+  /// null-checked in sound null-safety.
+  ///
+  /// This is true for non-nullable native return types.
+  bool _isNullCheckableNative(Member member) =>
+      _options.soundNullSafety &&
       member != null &&
       member.isExternal &&
       _extensionTypes.isNativeClass(member.enclosingClass) &&
       member is Procedure &&
       member.function != null &&
-      member.function.returnType.isPotentiallyNonNullable;
+      member.function.returnType.isPotentiallyNonNullable &&
+      _isWebLibrary(member.enclosingLibrary?.importUri);
 
   // TODO(jmesserly): can we encapsulate REPL name lookups and remove this?
   // _emitMemberName would be a nice place to handle it, but we don't have
@@ -4353,14 +4382,8 @@
 
   @override
   js_ast.Expression visitMethodInvocation(MethodInvocation node) {
-    var methodCall = _emitMethodCall(
+    return _emitMethodCall(
         node.receiver, node.interfaceTarget, node.arguments, node);
-    if (_isCheckableNative(node.interfaceTarget)) {
-      // If target is a native method with a non-nullable type, add a null check
-      // for soundness.
-      return runtimeCall('checkNativeNonNull(#)', [methodCall]);
-    }
-    return methodCall;
   }
 
   js_ast.Expression _emitMethodCall(Expression receiver, Member target,
@@ -4470,7 +4493,9 @@
   }
 
   bool _isDynamicOrFunction(DartType t) =>
-      t == _coreTypes.functionLegacyRawType || t == const DynamicType();
+      DartTypeEquivalence(_coreTypes, ignoreTopLevelNullability: true)
+          .areEqual(t, _coreTypes.functionNonNullableRawType) ||
+      t == const DynamicType();
 
   js_ast.Expression _emitUnaryOperator(
       Expression expr, Member target, InvocationExpression node) {
@@ -5087,8 +5112,8 @@
     var result = js.parseForeignJS(source).instantiate(jsArgs);
 
     // Add a check to make sure any JS() values from a native type are typed
-    // properly.
-    if (_isWebLibrary(_currentLibrary.importUri)) {
+    // properly in sound null-safety.
+    if (_isWebLibrary(_currentLibrary.importUri) && _options.soundNullSafety) {
       var type = node.getStaticType(_staticTypeContext);
       if (type.isPotentiallyNonNullable) {
         result = runtimeCall('checkNativeNonNull(#)', [result]);
@@ -5101,6 +5126,7 @@
   }
 
   bool _isWebLibrary(Uri importUri) =>
+      importUri != null &&
       importUri.scheme == 'dart' &&
       (importUri.path == 'html' ||
           importUri.path == 'svg' ||
@@ -5111,8 +5137,7 @@
           importUri.path == 'html_common');
 
   bool _isNull(Expression expr) =>
-      expr is NullLiteral ||
-      expr.getStaticType(_staticTypeContext) == _coreTypes.nullType;
+      expr is NullLiteral || expr.getStaticType(_staticTypeContext) is NullType;
 
   bool _doubleEqIsIdentity(Expression left, Expression right) {
     // If we statically know LHS or RHS is null we can use ==.
@@ -5327,8 +5352,9 @@
       if (jsExpr is js_ast.LiteralString && jsExpr.valueWithoutQuotes.isEmpty) {
         continue;
       }
-      parts.add(e.getStaticType(_staticTypeContext) ==
-                  _types.coreTypes.stringLegacyRawType &&
+      var type = e.getStaticType(_staticTypeContext);
+      parts.add(DartTypeEquivalence(_coreTypes, ignoreTopLevelNullability: true)
+                  .areEqual(type, _coreTypes.stringNonNullableRawType) &&
               !isNullable(e)
           ? jsExpr
           : runtimeCall('str(#)', [jsExpr]));
diff --git a/pkg/dev_compiler/lib/src/kernel/constants.dart b/pkg/dev_compiler/lib/src/kernel/constants.dart
index 5400577..d5b538f 100644
--- a/pkg/dev_compiler/lib/src/kernel/constants.dart
+++ b/pkg/dev_compiler/lib/src/kernel/constants.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 import 'package:kernel/kernel.dart';
 import 'package:kernel/target/targets.dart';
 
diff --git a/pkg/dev_compiler/lib/src/kernel/expression_compiler.dart b/pkg/dev_compiler/lib/src/kernel/expression_compiler.dart
index e57a2fb..9d8b566 100644
--- a/pkg/dev_compiler/lib/src/kernel/expression_compiler.dart
+++ b/pkg/dev_compiler/lib/src/kernel/expression_compiler.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 import 'dart:async';
 
 import 'package:_fe_analyzer_shared/src/messages/diagnostic_message.dart'
@@ -21,38 +23,52 @@
         Block,
         Class,
         Component,
+        Constructor,
         DartType,
         Field,
         FunctionNode,
         Library,
+        Member,
         Node,
         Procedure,
         PropertyGet,
         PropertySet,
+        RedirectingFactoryConstructor,
+        TreeNode,
         TypeParameter,
         VariableDeclaration,
         Visitor;
 
+DiagnosticMessage _createInternalError(Uri uri, int line, int col, String msg) {
+  return Message(Code<String>('Expression Compiler Internal error', null),
+          message: msg)
+      .withLocation(uri, 0, 0)
+      .withFormatting(
+          'Internal error: $msg', line, col, Severity.internalProblem, []);
+}
+
 /// Dart scope
 ///
 /// Provides information about symbols available inside a dart scope.
 class DartScope {
   final Library library;
   final Class cls;
-  final Procedure procedure;
+  final Member member;
+  final bool isStatic;
   final Map<String, DartType> definitions;
   final List<TypeParameter> typeParameters;
 
-  DartScope(this.library, this.cls, this.procedure, this.definitions,
-      this.typeParameters);
+  DartScope(this.library, this.cls, this.member, this.definitions,
+      this.typeParameters)
+      : isStatic = member is Procedure ? member.isStatic : false;
 
   @override
   String toString() {
     return '''DartScope {
       Library: ${library.importUri},
       Class: ${cls?.name},
-      Procedure: $procedure,
-      isStatic: ${procedure.isStatic},
+      Procedure: $member,
+      isStatic: $isStatic,
       Scope: $definitions,
       typeParameters: $typeParameters
     }
@@ -60,34 +76,49 @@
   }
 }
 
-/// DartScopeBuilder finds dart scope information in
-/// [component] on a given 1-based [line]:
-/// library, class, locals, formals, and any other
-/// avaiable symbols at that location.
-/// TODO(annagrin): Refine scope detection
-/// See [issue 40278](https://github.com/dart-lang/sdk/issues/40278)
+/// DartScopeBuilder finds dart scope information for a location.
+///
+/// Find all definitions in scope at a given 1-based [line] and [column]:
+///
+/// - library
+/// - class
+/// - locals
+/// - formals
+/// - captured variables (for closures)
 class DartScopeBuilder extends Visitor<void> {
   final Component _component;
-  Library _library;
-  Class _cls;
-  Procedure _procedure;
-  final List<FunctionNode> _functions = [];
   final int _line;
   final int _column;
+
+  Library _library;
+  Class _cls;
+  Member _member;
   int _offset;
+
+  DiagnosticMessageHandler onDiagnostic;
+
+  final List<FunctionNode> _functions = [];
   final Map<String, DartType> _definitions = {};
   final List<TypeParameter> _typeParameters = [];
 
-  DartScopeBuilder(this._component, this._line, this._column);
+  DartScopeBuilder._(this._component, this._line, this._column);
+
+  static DartScope findScope(Component component, Library library, int line,
+      int column, DiagnosticMessageHandler onDiagnostic) {
+    var builder = DartScopeBuilder._(component, line, column)
+      ..onDiagnostic = onDiagnostic;
+    library.accept(builder);
+    return builder.build();
+  }
 
   DartScope build() {
-    if (_library == null || _procedure == null) return null;
+    if (_offset == null || _library == null || _member == null) return null;
 
-    return DartScope(_library, _cls, _procedure, _definitions, _typeParameters);
+    return DartScope(_library, _cls, _member, _definitions, _typeParameters);
   }
 
   @override
-  void defaultNode(Node node) {
+  void defaultTreeNode(Node node) {
     node.visitChildren(this);
   }
 
@@ -96,7 +127,10 @@
     _library = library;
     _offset = _component.getOffset(_library.fileUri, _line, _column);
 
-    super.visitLibrary(library);
+    // Exit early if the evaluation offset is not found.
+    // Note: the complete scope is not found in this case,
+    // so the expression compiler will report an error.
+    if (_offset >= 0) super.visitLibrary(library);
   }
 
   @override
@@ -110,61 +144,115 @@
   }
 
   @override
-  void visitProcedure(Procedure p) {
-    if (_scopeContainsOffset(p.fileOffset, p.fileEndOffset, _offset)) {
-      _procedure = p;
+  void defaultMember(Member m) {
+    if (_scopeContainsOffset(m.fileOffset, m.fileEndOffset, _offset)) {
+      _member = m;
 
-      super.visitProcedure(p);
+      super.defaultMember(m);
     }
   }
 
   @override
   void visitFunctionNode(FunctionNode fun) {
     if (_scopeContainsOffset(fun.fileOffset, fun.fileEndOffset, _offset)) {
-      _collectDefinitions(fun);
+      _functions.add(fun);
       _typeParameters.addAll(fun.typeParameters);
 
       super.visitFunctionNode(fun);
     }
   }
 
-  void _collectDefinitions(FunctionNode fun) {
-    _functions.add(fun);
+  @override
+  void visitVariableDeclaration(VariableDeclaration decl) {
+    // collect locals and formals
+    _definitions[decl.name] = decl.type;
+    super.visitVariableDeclaration(decl);
+  }
 
-    // add formals
-    for (var formal in fun.namedParameters) {
-      _definitions[formal.name] = formal.type;
-    }
-
-    for (var formal in fun.positionalParameters) {
-      _definitions[formal.name] = formal.type;
-    }
-
-    // add locals
-    var body = fun.body;
-    if (body is VariableDeclaration) {
-      // local
-      _definitions[body.name] = body.type;
-    }
-    if (body is Block) {
-      for (var stmt in body.statements) {
-        if (stmt is VariableDeclaration) {
-          // local
-          _definitions[stmt.name] = stmt.type;
-        }
-      }
+  @override
+  void visitBlock(Block block) {
+    var fileEndOffset = FileEndOffsetCalculator.calculateEndOffset(block);
+    if (_scopeContainsOffset(block.fileOffset, fileEndOffset, _offset)) {
+      super.visitBlock(block);
     }
   }
 
-  static bool _scopeContainsOffset(int startOffset, int endOffset, int offset) {
-    if (offset < 0) return false;
-    if (startOffset < 0) return false;
-    if (endOffset < 0) return false;
-
+  bool _scopeContainsOffset(int startOffset, int endOffset, int offset) {
+    if (offset < 0 || startOffset < 0 || endOffset < 0) {
+      return false;
+    }
     return startOffset <= offset && offset <= endOffset;
   }
 }
 
+/// File end offset calculator.
+///
+/// Helps calculate file end offsets for nodes with internal scope
+/// that do not have .fileEndOffset field.
+///
+/// For example - [Block]
+class FileEndOffsetCalculator extends Visitor<int> {
+  static const int noOffset = -1;
+
+  final int _startOffset;
+  final TreeNode _root;
+
+  int _endOffset = noOffset;
+
+  /// Create calculator for a scoping node with no .fileEndOffset.
+  ///
+  /// [_root] is the parent of the scoping node.
+  /// [_startOffset] is the start offset of the scoping node.
+  FileEndOffsetCalculator._(this._root, this._startOffset);
+
+  /// Calculate file end offset for a scoping node.
+  ///
+  /// This calculator finds the first node in the ancestor chain that
+  /// can give such information for a given [node], i.e. satisfies one
+  /// of the following conditions:
+  ///
+  /// - a node with with a greater start offset that is a child of the
+  ///   closest ancestor. The start offset of this child is used as a
+  ///   file end offset of the [node].
+  ///
+  /// - the closest ancestor with .fileEndOffset information. The file
+  ///   end offset of the ancestor is used as the file end offset of
+  ///   the [node.]
+  ///
+  /// If none found, return [noOffset].
+  static int calculateEndOffset(TreeNode node) {
+    for (var n = node.parent; n != null; n = n.parent) {
+      var calculator = FileEndOffsetCalculator._(n, node.fileOffset);
+      var offset = n.accept(calculator);
+      if (offset != noOffset) return offset;
+    }
+    return noOffset;
+  }
+
+  @override
+  int defaultTreeNode(TreeNode node) {
+    if (node == _root) {
+      node.visitChildren(this);
+      if (_endOffset != noOffset) return _endOffset;
+      return _endOffsetForNode(node);
+    }
+    if (_endOffset == noOffset && node.fileOffset > _startOffset) {
+      _endOffset = node.fileOffset;
+    }
+    return _endOffset;
+  }
+
+  static int _endOffsetForNode(TreeNode node) {
+    if (node is Class) return node.fileEndOffset;
+    if (node is Constructor) return node.fileEndOffset;
+    if (node is Procedure) return node.fileEndOffset;
+    if (node is Field) return node.fileEndOffset;
+    if (node is RedirectingFactoryConstructor) return node.fileEndOffset;
+    if (node is FunctionNode) return node.fileEndOffset;
+    return noOffset;
+  }
+}
+
 class PrivateFieldsVisitor extends Visitor<void> {
   final Map<String, String> privateFields = {};
 
@@ -176,28 +264,32 @@
   @override
   void visitFieldReference(Field node) {
     if (node.name.isPrivate) {
-      privateFields[node.name.text] = node.name.library.importUri.toString();
+      var library = node.enclosingLibrary?.importUri;
+      privateFields[node.name.text] = library?.toString();
     }
   }
 
   @override
   void visitField(Field node) {
     if (node.name.isPrivate) {
-      privateFields[node.name.text] = node.name.library.importUri.toString();
+      var library = node.enclosingLibrary?.importUri;
+      privateFields[node.name.text] = library?.toString();
     }
   }
 
   @override
   void visitPropertyGet(PropertyGet node) {
     if (node.name.isPrivate) {
-      privateFields[node.name.text] = node.name.library.importUri.toString();
+      var library = node.interfaceTarget?.enclosingLibrary?.importUri;
+      privateFields[node.name.text] = library?.toString();
     }
   }
 
   @override
   void visitPropertySet(PropertySet node) {
     if (node.name.isPrivate) {
-      privateFields[node.name.text] = node.name.library.importUri.toString();
+      var library = node.interfaceTarget?.enclosingLibrary?.importUri;
+      privateFields[node.name.text] = library?.toString();
     }
   }
 }
@@ -258,83 +350,89 @@
       Map<String, String> jsScope,
       String moduleName,
       String expression) async {
-    // 1. find dart scope where debugger is paused
+    try {
+      // 1. find dart scope where debugger is paused
 
-    _log('Compiling expression in $moduleName:\n$expression');
+      _log('Compiling expression in $moduleName:\n$expression');
 
-    var dartScope = await _findScopeAt(Uri.parse(libraryUri), line, column);
-    if (dartScope == null) {
-      _log('Scope not found at $libraryUri:$line:$column');
+      var dartScope = await _findScopeAt(Uri.parse(libraryUri), line, column);
+      if (dartScope == null) {
+        _log('Scope not found at $libraryUri:$line:$column');
+        return null;
+      }
+
+      // 2. perform necessary variable substitutions
+
+      // TODO(annagrin): we only substitute for the same name or a value
+      // currently, need to extend to cases where js variable names are
+      // different from dart.
+      // See [issue 40273](https://github.com/dart-lang/sdk/issues/40273)
+
+      // remove undefined js variables (this allows us to get a reference error
+      // from chrome on evaluation)
+      dartScope.definitions
+          .removeWhere((variable, type) => !jsScope.containsKey(variable));
+
+      // map from values from the stack when available (this allows to evaluate
+      // captured variables optimized away in chrome)
+      var localJsScope =
+          dartScope.definitions.keys.map((variable) => jsScope[variable]);
+
+      _log('Performed scope substitutions for expression');
+
+      // 3. compile dart expression to JS
+
+      var jsExpression = await _compileExpression(
+          dartScope, jsModules, moduleName, expression);
+
+      if (jsExpression == null) {
+        _log('Failed to compile expression in $moduleName:\n$expression');
+        return null;
+      }
+
+      // some adjustments to get proper binding to 'this',
+      // making closure variables available, and catching errors
+
+      // TODO(annagrin): make compiler produce correct expression:
+      // See [issue 40277](https://github.com/dart-lang/sdk/issues/40277)
+      // - evaluate to an expression in function and class context
+      // - allow setting values
+      // See [issue 40273](https://github.com/dart-lang/sdk/issues/40273)
+      // - bind to proper 'this'
+      // - map to correct js names for dart symbols
+
+      // 4. create call the expression
+
+      if (dartScope.cls != null && !dartScope.isStatic) {
+        // bind to correct 'this' instead of 'globalThis'
+        jsExpression = '$jsExpression.bind(this)';
+      }
+
+      // 5. wrap in a try/catch to catch errors
+
+      var args = localJsScope.join(',\n    ');
+      jsExpression = jsExpression.split('\n').join('\n  ');
+      var callExpression = '\ntry {'
+          '\n  ($jsExpression('
+          '\n    $args'
+          '\n  ))'
+          '\n} catch (error) {'
+          '\n  error.name + ": " + error.message;'
+          '\n}';
+
+      _log('Compiled expression \n$expression to $callExpression');
+      return callExpression;
+    } catch (e, s) {
+      onDiagnostic(
+          _createInternalError(Uri.parse(libraryUri), line, column, '$e:$s'));
       return null;
     }
-
-    // 2. perform necessary variable substitutions
-
-    // TODO(annagrin): we only substitute for the same name or a value currently,
-    // need to extend to cases where js variable names are different from dart
-    // See [issue 40273](https://github.com/dart-lang/sdk/issues/40273)
-
-    // remove undefined js variables (this allows us to get a reference error
-    // from chrome on evaluation)
-    dartScope.definitions
-        .removeWhere((variable, type) => !jsScope.containsKey(variable));
-
-    // map from values from the stack when available (this allows to evaluate
-    // captured variables optimized away in chrome)
-    var localJsScope =
-        dartScope.definitions.keys.map((variable) => jsScope[variable]);
-
-    _log('Performed scope substitutions for expression');
-
-    // 3. compile dart expression to JS
-
-    var jsExpression =
-        await _compileExpression(dartScope, jsModules, moduleName, expression);
-
-    if (jsExpression == null) {
-      _log('Failed to compile expression in $moduleName:\n$expression');
-      return null;
-    }
-
-    // some adjustments to get proper binding to 'this',
-    // making closure variables available, and catching errors
-
-    // TODO(annagrin): make compiler produce correct expression:
-    // See [issue 40277](https://github.com/dart-lang/sdk/issues/40277)
-    // - evaluate to an expression in function and class context
-    // - allow setting values
-    // See [issue 40273](https://github.com/dart-lang/sdk/issues/40273)
-    // - bind to proper 'this'
-    // - map to correct js names for dart symbols
-
-    // 4. create call the expression
-
-    if (dartScope.cls != null && !dartScope.procedure.isStatic) {
-      // bind to correct 'this' instead of 'globalThis'
-      jsExpression = '$jsExpression.bind(this)';
-    }
-
-    // 5. wrap in a try/catch to catch errors
-
-    var args = localJsScope.join(', ');
-    var callExpression = '''
-try {
-($jsExpression(
-$args
-))
-} catch (error) {
-error.name + ": " + error.message;
-}''';
-
-    _log(
-        'Compiled expression in $moduleName:\n$expression to \n$callExpression');
-    return callExpression;
   }
 
   Future<DartScope> _findScopeAt(Uri libraryUri, int line, int column) async {
     if (line < 0) {
       onDiagnostic(_createInternalError(
-          libraryUri, line, column, 'invalid source location: $line, $column'));
+          libraryUri, line, column, 'Invalid source location'));
       return null;
     }
 
@@ -345,9 +443,8 @@
       return null;
     }
 
-    var builder = DartScopeBuilder(_component, line, column);
-    library.accept(builder);
-    var scope = builder.build();
+    var scope = DartScopeBuilder.findScope(
+        _component, library, line, column, onDiagnostic);
     if (scope == null) {
       onDiagnostic(_createInternalError(
           libraryUri, line, column, 'Dart scope not found for location'));
@@ -373,40 +470,6 @@
     });
   }
 
-  /// Creates a stament to require a module to bring it back to scope
-  /// example:
-  /// let dart = require('dart_sdk').dart;
-  js_ast.Statement _createRequireModuleStatement(
-      String moduleName, String moduleVariable, String fieldName) {
-    var variableName = moduleVariable.replaceFirst('.dart', '');
-    var rhs = js_ast.PropertyAccess.field(
-        js_ast.Call(js_ast.Identifier('require'),
-            [js_ast.LiteralExpression('\'$moduleName\'')]),
-        '$fieldName');
-
-    return rhs.toVariableDeclaration(js_ast.Identifier('$variableName'));
-  }
-
-  js_ast.Statement _createPrivateField(String field, String library) {
-    var libraryName = library.replaceFirst('.dart', '');
-    var rhs = js_ast.Call(
-        js_ast.PropertyAccess.field(js_ast.Identifier('dart'), 'privateName'), [
-      js_ast.LiteralExpression(libraryName),
-      js_ast.LiteralExpression('"$field"')
-    ]);
-
-    // example:
-    // let _f = dart.privateName(main, "_f");
-    return rhs.toVariableDeclaration(js_ast.Identifier('$field'));
-  }
-
-  DiagnosticMessage _createInternalError(
-      Uri uri, int line, int col, String msg) {
-    return Message(Code<String>('Internal error', null), message: msg)
-        .withLocation(uri, 0, 0)
-        .withFormatting('', line, col, Severity.internalProblem, []);
-  }
-
   /// Return a JS function that returns the evaluated results when called.
   ///
   /// [scope] current dart scope information
@@ -429,7 +492,7 @@
         debugProcedureName,
         scope.library.importUri,
         scope.cls?.name,
-        scope.procedure.isStatic);
+        scope.isStatic);
 
     _log('Compiled expression to kernel');
 
@@ -450,9 +513,29 @@
 
     _log('Generated JavaScript for expression');
 
-    // apply temporary workarounds for what ideally
-    // needs to be done in the compiler
+    var jsFunModified = _addSymbolDefinitions(procedure, jsFun, scope, modules);
 
+    _log('Added symbol definitions to JavaScript');
+
+    // print JS ast to string for evaluation
+
+    var context = js_ast.SimpleJavaScriptPrintingContext();
+    var opts =
+        js_ast.JavaScriptPrintingOptions(allowKeywordsInProperties: true);
+
+    jsFunModified.accept(js_ast.Printer(opts, context));
+    _log('Performed JavaScript adjustments for expression');
+
+    return context.getText();
+  }
+
+  /// Add symbol definitions for all symbols in compiled expression
+  ///
+  /// TODO: this is a temporary workaround to make JavaScript produced
+  /// by the ProgramCompiler self-contained.
+  /// Issue: https://github.com/dart-lang/sdk/issues/41480
+  js_ast.Fun _addSymbolDefinitions(Procedure procedure, js_ast.Fun jsFun,
+      DartScope scope, Map<String, String> modules) {
     // get private fields accessed by the evaluated expression
     var fieldsCollector = PrivateFieldsVisitor();
     procedure.accept(fieldsCollector);
@@ -465,20 +548,22 @@
       var module = modules[variable];
       for (var field in privateFields.keys) {
         var library = privateFields[field];
-        var libraryVariable =
-            library.replaceAll('.dart', '').replaceAll('/', '__');
-        if (libraryVariable.endsWith(variable)) {
-          if (currentLibraries[field] != null) {
-            onDiagnostic(_createInternalError(
-                scope.library.importUri,
-                0,
-                0,
-                'ExpressionCompiler: $field defined in more than one library: '
-                '${currentLibraries[field]}, $variable'));
-            return null;
+        if (library != null) {
+          var libraryVariable =
+              library.replaceAll('.dart', '').replaceAll('/', '__');
+          if (libraryVariable.endsWith(variable)) {
+            if (currentLibraries[field] != null) {
+              onDiagnostic(_createInternalError(
+                  scope.library.importUri,
+                  0,
+                  0,
+                  'ExpressionCompiler: $field defined in more than one library: '
+                  '${currentLibraries[field]}, $variable'));
+              return null;
+            }
+            currentLibraries[field] = variable;
+            currentModules[variable] = module;
           }
-          currentLibraries[field] = variable;
-          currentModules[variable] = module;
         }
       }
     }
@@ -495,17 +580,36 @@
       ...jsFun.body.statements
     ]);
 
-    var jsFunModified = js_ast.Fun(jsFun.params, body);
+    return js_ast.Fun(jsFun.params, body);
+  }
 
-    // print JS ast to string for evaluation
+  /// Creates a library symbol definition
+  ///
+  /// example:
+  /// let dart = require('dart_sdk').dart;
+  js_ast.Statement _createRequireModuleStatement(
+      String moduleName, String moduleVariable, String fieldName) {
+    var variableName = moduleVariable.replaceFirst('.dart', '');
+    var rhs = js_ast.PropertyAccess.field(
+        js_ast.Call(js_ast.Identifier('require'),
+            [js_ast.LiteralExpression('\'$moduleName\'')]),
+        '$fieldName');
 
-    var context = js_ast.SimpleJavaScriptPrintingContext();
-    var opts =
-        js_ast.JavaScriptPrintingOptions(allowKeywordsInProperties: true);
+    return rhs.toVariableDeclaration(js_ast.Identifier('$variableName'));
+  }
 
-    jsFunModified.accept(js_ast.Printer(opts, context));
-    _log('Performed JavaScript adjustments for expression');
+  /// Creates a private symbol definition
+  ///
+  /// example:
+  /// let _f = dart.privateName(main, "_f");
+  js_ast.Statement _createPrivateField(String field, String library) {
+    var libraryName = library.replaceFirst('.dart', '');
+    var rhs = js_ast.Call(
+        js_ast.PropertyAccess.field(js_ast.Identifier('dart'), 'privateName'), [
+      js_ast.LiteralExpression(libraryName),
+      js_ast.LiteralExpression('"$field"')
+    ]);
 
-    return context.getText();
+    return rhs.toVariableDeclaration(js_ast.Identifier('$field'));
   }
 }
diff --git a/pkg/dev_compiler/lib/src/kernel/expression_compiler_worker.dart b/pkg/dev_compiler/lib/src/kernel/expression_compiler_worker.dart
index a1b995c..9e77102 100644
--- a/pkg/dev_compiler/lib/src/kernel/expression_compiler_worker.dart
+++ b/pkg/dev_compiler/lib/src/kernel/expression_compiler_worker.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 import 'dart:async';
 import 'dart:convert';
 import 'dart:io';
@@ -133,7 +135,7 @@
       fileSystem = AssetFileSystem(
           fileSystem, assetServerAddress, assetServerPort ?? '8080');
     }
-    var experimentalFlags = parseExperimentalFlags(
+    var explicitExperimentalFlags = parseExperimentalFlags(
         parseExperimentalArguments(
             parsedArgs['enable-experiment'] as List<String>),
         onError: (e) => throw e);
@@ -144,7 +146,7 @@
       sdkSummary: _argToUri(parsedArgs['dart-sdk-summary'] as String),
       fileSystem: fileSystem,
       environmentDefines: environmentDefines,
-      experimentalFlags: experimentalFlags,
+      explicitExperimentalFlags: explicitExperimentalFlags,
       sdkRoot: _argToUri(parsedArgs['sdk-root'] as String),
       trackWidgetCreation: parsedArgs['track-widget-creation'] as bool,
       soundNullSafety: parsedArgs['sound-null-safety'] as bool,
@@ -164,7 +166,7 @@
     @required FileSystem fileSystem,
     Uri packagesFile,
     Map<String, String> environmentDefines = const {},
-    Map<ExperimentalFlag, bool> experimentalFlags = const {},
+    Map<ExperimentalFlag, bool> explicitExperimentalFlags = const {},
     Uri sdkRoot,
     bool trackWidgetCreation = false,
     bool soundNullSafety = false,
@@ -184,7 +186,7 @@
       ..fileSystem = fileSystem
       ..omitPlatform = true
       ..environmentDefines = environmentDefines
-      ..experimentalFlags = experimentalFlags
+      ..explicitExperimentalFlags = explicitExperimentalFlags
       ..onDiagnostic = _onDiagnosticHandler(errors, warnings)
       ..nnbdMode = soundNullSafety ? NnbdMode.Strong : NnbdMode.Weak
       ..verbose = verbose;
diff --git a/pkg/dev_compiler/lib/src/kernel/js_interop.dart b/pkg/dev_compiler/lib/src/kernel/js_interop.dart
index 9c01d89..ae20b09 100644
--- a/pkg/dev_compiler/lib/src/kernel/js_interop.dart
+++ b/pkg/dev_compiler/lib/src/kernel/js_interop.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 import 'package:kernel/kernel.dart';
 import 'kernel_helpers.dart';
 
diff --git a/pkg/dev_compiler/lib/src/kernel/js_typerep.dart b/pkg/dev_compiler/lib/src/kernel/js_typerep.dart
index 4c4dd95..272b682 100644
--- a/pkg/dev_compiler/lib/src/kernel/js_typerep.dart
+++ b/pkg/dev_compiler/lib/src/kernel/js_typerep.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 import 'package:kernel/class_hierarchy.dart';
 import 'package:kernel/core_types.dart';
 import 'package:kernel/kernel.dart';
@@ -37,10 +39,10 @@
 
     // Note that this should be changed if Dart gets non-nullable types
     if (type == const BottomType()) return JSType.jsNull;
+    if (type == const NullType()) return JSType.jsNull;
 
     if (type is InterfaceType) {
       var c = type.classNode;
-      if (c == coreTypes.nullClass) return JSType.jsNull;
       if (c == coreTypes.numClass ||
           c == coreTypes.intClass ||
           c == coreTypes.doubleClass ||
diff --git a/pkg/dev_compiler/lib/src/kernel/kernel_helpers.dart b/pkg/dev_compiler/lib/src/kernel/kernel_helpers.dart
index a2c50dd..437fcce 100644
--- a/pkg/dev_compiler/lib/src/kernel/kernel_helpers.dart
+++ b/pkg/dev_compiler/lib/src/kernel/kernel_helpers.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 import 'dart:collection';
 import 'package:front_end/src/api_unstable/ddc.dart';
 import 'package:kernel/core_types.dart';
@@ -334,6 +336,7 @@
       t is InterfaceType ||
       t is InvalidType ||
       t is NeverType ||
+      t is NullType ||
       t is TypeParameterType ||
       t is TypedefType ||
       t is VoidType;
diff --git a/pkg/dev_compiler/lib/src/kernel/module_metadata.dart b/pkg/dev_compiler/lib/src/kernel/module_metadata.dart
index 7286843..29496ff 100644
--- a/pkg/dev_compiler/lib/src/kernel/module_metadata.dart
+++ b/pkg/dev_compiler/lib/src/kernel/module_metadata.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 /// Module metadata format version
 ///
 /// Module reader always creates the current version but is able to read
diff --git a/pkg/dev_compiler/lib/src/kernel/native_types.dart b/pkg/dev_compiler/lib/src/kernel/native_types.dart
index bf340b1..2aa3164 100644
--- a/pkg/dev_compiler/lib/src/kernel/native_types.dart
+++ b/pkg/dev_compiler/lib/src/kernel/native_types.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 import 'dart:collection';
 import 'package:kernel/core_types.dart';
 import 'package:kernel/kernel.dart';
diff --git a/pkg/dev_compiler/lib/src/kernel/nullable_inference.dart b/pkg/dev_compiler/lib/src/kernel/nullable_inference.dart
index 32c687f..c8fdf12 100644
--- a/pkg/dev_compiler/lib/src/kernel/nullable_inference.dart
+++ b/pkg/dev_compiler/lib/src/kernel/nullable_inference.dart
@@ -2,10 +2,15 @@
 // 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.
 
+// @dart = 2.9
+
 import 'dart:collection';
+
 import 'package:kernel/core_types.dart';
 import 'package:kernel/kernel.dart';
 import 'package:kernel/type_environment.dart';
+
+import '../compiler/shared_command.dart' show SharedCompilerOptions;
 import 'js_typerep.dart';
 import 'kernel_helpers.dart';
 
@@ -38,8 +43,12 @@
 
   final _variableInference = _NullableVariableInference();
 
-  NullableInference(this.jsTypeRep, this._staticTypeContext)
-      : coreTypes = jsTypeRep.coreTypes {
+  final bool _soundNullSafety;
+
+  NullableInference(this.jsTypeRep, this._staticTypeContext,
+      {SharedCompilerOptions options})
+      : coreTypes = jsTypeRep.coreTypes,
+        _soundNullSafety = options?.soundNullSafety ?? false {
     _variableInference._nullInference = this;
   }
 
@@ -83,38 +92,42 @@
 
   @override
   bool visitPropertyGet(PropertyGet node) =>
-      _getterIsNullable(node.interfaceTarget);
+      _getterIsNullable(node.interfaceTarget, node);
 
   @override
   bool visitPropertySet(PropertySet node) => isNullable(node.value);
 
   @override
   bool visitSuperPropertyGet(SuperPropertyGet node) =>
-      _getterIsNullable(node.interfaceTarget);
+      _getterIsNullable(node.interfaceTarget, node);
 
   @override
   bool visitSuperPropertySet(SuperPropertySet node) => isNullable(node.value);
 
   @override
-  bool visitStaticGet(StaticGet node) => _getterIsNullable(node.target);
+  bool visitStaticGet(StaticGet node) => _getterIsNullable(node.target, node);
 
   @override
   bool visitStaticSet(StaticSet node) => isNullable(node.value);
 
   @override
   bool visitMethodInvocation(MethodInvocation node) => _invocationIsNullable(
-      node.interfaceTarget, node.name.text, node.receiver);
+      node.interfaceTarget, node.name.text, node, node.receiver);
 
   @override
   bool visitSuperMethodInvocation(SuperMethodInvocation node) =>
-      _invocationIsNullable(node.interfaceTarget, node.name.text);
+      _invocationIsNullable(node.interfaceTarget, node.name.text, node);
 
-  bool _invocationIsNullable(Member target, String name,
+  bool _invocationIsNullable(
+      Member target, String name, InvocationExpression node,
       [Expression receiver]) {
     // TODO(jmesserly): this is not a valid assumption for user-defined equality
     // but it is added to match the behavior of the Analyzer backend.
     // https://github.com/dart-lang/sdk/issues/31854
     if (name == '==') return false;
+    if (_staticallyNonNullable(node.getStaticType(_staticTypeContext))) {
+      return false;
+    }
     if (target == null) return true; // dynamic call
     if (target.name.text == 'toString' &&
         receiver != null &&
@@ -122,20 +135,28 @@
             coreTypes.stringLegacyRawType) {
       // TODO(jmesserly): `class String` in dart:core does not explicitly
       // declare `toString`, which results in a target of `Object.toString` even
-      // when the reciever type is known to be `String`. So we work around it.
+      // when the receiver type is known to be `String`. So we work around it.
       // (The Analyzer backend of DDC probably has the same issue.)
       return false;
     }
     return _returnValueIsNullable(target);
   }
 
-  bool _getterIsNullable(Member target) {
+  bool _getterIsNullable(Member target, Expression node) {
+    if (_staticallyNonNullable(node.getStaticType(_staticTypeContext))) {
+      return false;
+    }
     if (target == null) return true;
     // tear-offs are not null
     if (target is Procedure && !target.isAccessor) return false;
     return _returnValueIsNullable(target);
   }
 
+  bool _staticallyNonNullable(DartType type) =>
+      _soundNullSafety &&
+      type != null &&
+      type.nullability == Nullability.nonNullable;
+
   bool _returnValueIsNullable(Member target) {
     var targetClass = target.enclosingClass;
     if (targetClass != null) {
@@ -177,7 +198,7 @@
             typeString.split('|').contains('Null');
       }
     }
-    return _invocationIsNullable(target, node.name.text);
+    return _invocationIsNullable(target, node.name.text, node);
   }
 
   @override
@@ -200,7 +221,10 @@
   bool visitIsExpression(IsExpression node) => false;
 
   @override
-  bool visitAsExpression(AsExpression node) => isNullable(node.operand);
+  bool visitAsExpression(AsExpression node) =>
+      _staticallyNonNullable(node.getStaticType(_staticTypeContext))
+          ? false
+          : isNullable(node.operand);
 
   @override
   bool visitSymbolLiteral(SymbolLiteral node) => false;
@@ -224,7 +248,8 @@
   bool visitMapLiteral(MapLiteral node) => false;
 
   @override
-  bool visitAwaitExpression(AwaitExpression node) => true;
+  bool visitAwaitExpression(AwaitExpression node) =>
+      !_staticallyNonNullable(node.getStaticType(_staticTypeContext));
 
   @override
   bool visitFunctionExpression(FunctionExpression node) => false;
@@ -334,7 +359,8 @@
   @override
   void visitFunctionNode(FunctionNode node) {
     _functions.add(node);
-    if (_nullInference.allowNotNullDeclarations) {
+    if (_nullInference.allowNotNullDeclarations ||
+        _nullInference._soundNullSafety) {
       visitList(node.positionalParameters, this);
       visitList(node.namedParameters, this);
     }
@@ -360,9 +386,14 @@
       }
     }
     var initializer = node.initializer;
-    // A Variable declaration with a FunctionNode as a parent is a function
-    // parameter so we can't trust the initializer as a nullable check.
-    if (node.parent is! FunctionNode) {
+    if (_nullInference._soundNullSafety &&
+        node.type.nullability == Nullability.nonNullable) {
+      // Avoid null checks for variables when the type system guarantees they
+      // can never be null.
+      _notNullLocals.add(node);
+    } else if (node.parent is! FunctionNode) {
+      // A variable declaration with a FunctionNode as a parent is a function
+      // parameter so we can't trust the initializer as a nullable check.
       if (initializer != null) {
         var savedVariable = _variableAssignedTo;
         _variableAssignedTo = node;
diff --git a/pkg/dev_compiler/lib/src/kernel/property_model.dart b/pkg/dev_compiler/lib/src/kernel/property_model.dart
index cee7fb9..ea0eade 100644
--- a/pkg/dev_compiler/lib/src/kernel/property_model.dart
+++ b/pkg/dev_compiler/lib/src/kernel/property_model.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 import 'dart:collection' show HashMap, HashSet, Queue;
 
 import 'package:kernel/core_types.dart';
diff --git a/pkg/dev_compiler/lib/src/kernel/target.dart b/pkg/dev_compiler/lib/src/kernel/target.dart
index 2982b8d..f389110 100644
--- a/pkg/dev_compiler/lib/src/kernel/target.dart
+++ b/pkg/dev_compiler/lib/src/kernel/target.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 import 'dart:collection';
 import 'dart:core' hide MapEntry;
 
@@ -150,6 +152,7 @@
     for (var library in libraries) {
       _CovarianceTransformer(library).transform();
       JsInteropChecks(
+              coreTypes,
               diagnosticReporter as DiagnosticReporter<Message, LocatedMessage>)
           .visitLibrary(library);
     }
@@ -365,7 +368,14 @@
 
   @override
   void visitProcedure(Procedure node) {
-    if (node.name.isPrivate && node.isInstanceMember && node.function != null) {
+    if (node.name.isPrivate &&
+        // The member must be private to this library. Member signatures,
+        // forwarding stubs and noSuchMethod forwarders for private members in
+        // other libraries can be injected.
+        node.name.library == _library &&
+        node.isInstanceMember &&
+        // No need to check abstract methods.
+        node.function.body != null) {
       _privateProcedures.add(node);
     }
     super.visitProcedure(node);
@@ -373,7 +383,14 @@
 
   @override
   void visitField(Field node) {
-    if (node.name.isPrivate && isCovariantField(node)) _privateFields.add(node);
+    if (node.name.isPrivate &&
+        // The member must be private to this library. Member signatures,
+        // forwarding stubs and noSuchMethod forwarders for private members in
+        // other libraries can be injected.
+        node.name.library == _library &&
+        isCovariantField(node)) {
+      _privateFields.add(node);
+    }
     super.visitField(node);
   }
 
diff --git a/pkg/dev_compiler/lib/src/kernel/type_table.dart b/pkg/dev_compiler/lib/src/kernel/type_table.dart
index 8f8a002..ddaf27f 100644
--- a/pkg/dev_compiler/lib/src/kernel/type_table.dart
+++ b/pkg/dev_compiler/lib/src/kernel/type_table.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 import 'package:kernel/kernel.dart';
 
 import '../compiler/js_names.dart' as js_ast;
@@ -117,6 +119,7 @@
     if (type is VoidType) return 'void';
     if (type is NeverType) return 'Never$nullability';
     if (type is BottomType) return 'bottom';
+    if (type is NullType) return 'Null';
     return 'invalid';
   }
 
diff --git a/pkg/dev_compiler/test/expression_compiler/expression_compiler_test.dart b/pkg/dev_compiler/test/expression_compiler/expression_compiler_test.dart
index 4e4068e..ff0b230 100644
--- a/pkg/dev_compiler/test/expression_compiler/expression_compiler_test.dart
+++ b/pkg/dev_compiler/test/expression_compiler/expression_compiler_test.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 import 'dart:io' show Directory, File;
 
 import 'package:cli_util/cli_util.dart';
@@ -220,13 +222,14 @@
         scope: scope,
         expression: expression);
 
-    if (expectedError != null) {
-      expect(result.isSuccess, isFalse);
-      expect(_normalize(result.result), matches(expectedError));
-    } else if (expectedResult != null) {
-      expect(result.isSuccess, isTrue);
-      expect(_normalize(result.result), _matches(expectedResult));
-    }
+    var success = expectedError == null;
+    var message = success ? expectedResult : expectedError;
+
+    expect(
+        result,
+        const TypeMatcher<TestCompilationResult>()
+            .having((r) => _normalize(r.result), 'result', _matches(message))
+            .having((r) => r.isSuccess, 'isSuccess', success));
   }
 
   String _normalize(String text) {
@@ -234,11 +237,8 @@
   }
 
   Matcher _matches(String text) {
-    var indent = text.indexOf(RegExp('[^ ]'));
-    var unindented =
-        text.split('\n').map((line) => line.substring(indent)).join('\n');
-
-    return matches(RegExp(RegExp.escape(unindented), multiLine: true));
+    var unindented = RegExp.escape(text).replaceAll(RegExp('[ ]+'), '[ ]*');
+    return matches(RegExp(unindented, multiLine: true));
   }
 
   int _getEvaluationLine(String source) {
@@ -260,6 +260,7 @@
 
   group('Expression compiler tests in extension method:', () {
     const source = '''
+      // @dart = 2.9
       extension NumberParsing on String {
         int parseInt() {
           var ret = int.parse(this);
@@ -287,7 +288,14 @@
           expectedError: "Error: Getter not found: 'typo'");
     });
 
-    test('local', () async {
+    test('local (trimmed scope)', () async {
+      // Test that current expression evaluation works in extension methods.
+      //
+      // Note: the actual scope is {#this, ret}, but #this is effectively
+      // removed in the expression compilator because it does not exist
+      // in JavaScript code.
+      // See (full scope) tests for what will the evaluation will look like
+      // when the mapping from dart symbols to JavaScipt symbols is added.
       await driver.check(
           scope: <String, String>{'ret': '1234'},
           expression: 'ret',
@@ -295,21 +303,139 @@
           (function(ret) {
             return ret;
           }(
-          1234
+            1234
           ))
           ''');
     });
 
-    test('this', () async {
+    test('local (full scope)', () async {
+      // Test evalution in extension methods in the future when the mapping
+      // from kernel symbols to dartdevc symbols is added.
+      //
+      // Note: this currently fails due to
+      // - incremental compiler not allowing #this as a parameter name
       await driver.check(
-          scope: <String, String>{'ret': '1234'},
+          scope: <String, String>{'ret': '1234', '#this': 'this'},
+          expression: 'ret',
+          expectedError:
+              "Illegal parameter name '#this' found during expression compilation.");
+    });
+
+    test('this (full scope)', () async {
+      // Test evalution in extension methods in the future when the mapping
+      // from kernel symbols to dartdevc symbols is added.
+      //
+      // Note: this currently fails due to
+      // - incremental compiler not allowing #this as a parameter name
+      // - incremental compiler not mapping 'this' from user input to '#this'
+      await driver.check(
+          scope: <String, String>{'ret': '1234', '#this': 'this'},
           expression: 'this',
-          expectedError: "Expected identifier, but got 'this'.");
+          expectedError:
+              "Illegal parameter name '#this' found during expression compilation.");
+    });
+  });
+
+  group('Expression compiler tests in static function:', () {
+    const source = '''
+      // @dart = 2.9
+      int foo(int x, {int y}) {
+        int z = 0;
+        /* evaluation placeholder */
+        return x + y + z;
+      }
+
+      main() => 0;
+      ''';
+
+    TestDriver driver;
+
+    setUp(() {
+      driver = TestDriver(options, source);
+    });
+
+    tearDown(() {
+      driver.delete();
+    });
+
+    test('compilation error', () async {
+      await driver.check(
+          scope: <String, String>{'x': '1', 'y': '2', 'z': '3'},
+          expression: 'typo',
+          expectedError: "Getter not found: \'typo\'");
+    });
+
+    test('local', () async {
+      await driver.check(
+          scope: <String, String>{'x': '1', 'y': '2', 'z': '3'},
+          expression: 'x',
+          expectedResult: '''
+          (function(x, y, z) {
+            return x;
+          }(
+            1,
+            2,
+            3
+          ))
+          ''');
+    });
+
+    test('formal', () async {
+      await driver.check(
+          scope: <String, String>{'x': '1', 'y': '2', 'z': '3'},
+          expression: 'y',
+          expectedResult: '''
+          (function(x, y, z) {
+            return y;
+          }(
+            1,
+            2,
+            3
+          ))
+          ''');
+    });
+
+    test('named formal', () async {
+      await driver.check(
+          scope: <String, String>{'x': '1', 'y': '2', 'z': '3'},
+          expression: 'z',
+          expectedResult: '''
+          (function(x, y, z) {
+            return z;
+          }(
+            1,
+            2,
+            3
+          ))
+          ''');
+    });
+
+    test('function', () async {
+      await driver.check(
+          scope: <String, String>{'x': '1', 'y': '2', 'z': '3'},
+          expression: 'main',
+          expectedResult: '''
+          (function(x, y, z) {
+            var VoidTodynamic = () => (VoidTodynamic = dart.constFn(dart.fnType(dart.dynamic, [])))();
+            dart.defineLazy(CT, {
+              get C0() {
+                return C0 = dart.fn(foo.main, VoidTodynamic());
+              }
+            }, false);
+            var C0;
+            return C0 || CT.C0;
+          }(
+            1,
+            2,
+            3
+          ))
+          ''');
     });
   });
 
   group('Expression compiler tests in method:', () {
     const source = '''
+      // @dart = 2.9
       extension NumberParsing on String {
         int parseInt() {
           return int.parse(this);
@@ -365,7 +491,7 @@
           (function(x) {
             return x;
           }.bind(this)(
-          1
+            1
           ))
           ''');
     });
@@ -378,7 +504,7 @@
           (function(x) {
             return this;
           }.bind(this)(
-          1
+            1
           ))
           ''');
     });
@@ -389,9 +515,9 @@
           expression: 'x + 1',
           expectedResult: '''
           (function(x) {
-            return dart.dsend(x, '+', [1]);
+            return dart.notNull(x) + 1;
           }.bind(this)(
-          1
+            1
           ))
           ''');
     });
@@ -402,9 +528,9 @@
           expression: 'x + staticField',
           expectedResult: '''
           (function(x) {
-            return dart.dsend(x, '+', [foo.C.staticField]);
+            return dart.notNull(x) + dart.notNull(foo.C.staticField);
           }.bind(this)(
-          1
+            1
           ))
           ''');
     });
@@ -417,9 +543,9 @@
           (function(x) {
             let foo = require('foo.dart').foo;
             let _staticField = dart.privateName(foo, "_staticField");
-            return dart.dsend(x, '+', [foo.C._staticField]);
+            return dart.notNull(x) + dart.notNull(foo.C._staticField);
           }.bind(this)(
-          1
+            1
           ))
           ''');
     });
@@ -430,9 +556,9 @@
           expression: 'x + field',
           expectedResult: '''
           (function(x) {
-            return dart.dsend(x, '+', [this.field]);
+            return dart.notNull(x) + dart.notNull(this.field);
           }.bind(this)(
-          1
+            1
           ))
           ''');
     });
@@ -445,9 +571,9 @@
           (function(x) {
             let foo = require('foo.dart').foo;
             let _field = dart.privateName(foo, "_field");
-            return dart.dsend(x, '+', [this[_field]]);
+            return dart.notNull(x) + dart.notNull(this[_field]);
           }.bind(this)(
-          1
+            1
           ))
           ''');
     });
@@ -458,9 +584,9 @@
           expression: 'x + global',
           expectedResult: '''
           (function(x) {
-            return dart.dsend(x, '+', [foo.global]);
+            return dart.notNull(x) + dart.notNull(foo.global);
           }.bind(this)(
-          1
+            1
           ))
           ''');
     });
@@ -473,7 +599,7 @@
           (function(x) {
             return this.methodFieldAccess(2);
           }.bind(this)(
-          1
+            1
           ))
           ''');
     });
@@ -486,7 +612,7 @@
           (function(x) {
             return this.asyncMethod(2);
           }.bind(this)(
-          1
+            1
           ))
           ''');
     });
@@ -496,12 +622,12 @@
           scope: <String, String>{'x': '1'},
           expression: '"1234".parseInt()',
           expectedResult: '''
-        (function(x) {
-          return foo['NumberParsing|parseInt']("1234");
-        }.bind(this)(
-        1
-        ))
-        ''');
+          (function(x) {
+            return foo['NumberParsing|parseInt']("1234");
+          }.bind(this)(
+            1
+          ))
+          ''');
     });
 
     test('private field modification', () async {
@@ -509,14 +635,14 @@
           scope: <String, String>{'x': '1'},
           expression: '_field = 2',
           expectedResult: '''
-        (function(x) {
-          let foo = require('foo.dart').foo;
-          let _field = dart.privateName(foo, "_field");
-          return this[_field] = 2;
-        }.bind(this)(
-        1
-        ))
-        ''');
+          (function(x) {
+            let foo = require('foo.dart').foo;
+            let _field = dart.privateName(foo, "_field");
+            return this[_field] = 2;
+          }.bind(this)(
+            1
+          ))
+          ''');
     });
 
     test('field modification', () async {
@@ -527,7 +653,7 @@
           (function(x) {
             return this.field = 2;
           }.bind(this)(
-          1
+            1
           ))
           ''');
     });
@@ -542,7 +668,7 @@
             let _staticField = dart.privateName(foo, "_staticField");
             return foo.C._staticField = 2;
           }.bind(this)(
-          1
+            1
           ))
           ''');
     });
@@ -555,7 +681,7 @@
           (function(x) {
             return foo.C.staticField = 2;
           }.bind(this)(
-          1
+            1
           ))
           ''');
     });
@@ -563,6 +689,7 @@
 
   group('Expression compiler tests in method with no field access:', () {
     const source = '''
+      // @dart = 2.9
       extension NumberParsing on String {
         int parseInt() {
           return int.parse(this);
@@ -615,9 +742,9 @@
           expression: 'x + staticField',
           expectedResult: '''
           (function(x) {
-            return dart.dsend(x, '+', [foo.C.staticField]);
+            return dart.notNull(x) + dart.notNull(foo.C.staticField);
           }.bind(this)(
-          1
+            1
           ))
           ''');
     });
@@ -630,9 +757,9 @@
           (function(x) {
             let foo = require('foo.dart').foo;
             let _staticField = dart.privateName(foo, "_staticField");
-            return dart.dsend(x, '+', [foo.C._staticField]);
+            return dart.notNull(x) + dart.notNull(foo.C._staticField);
           }.bind(this)(
-          1
+            1
           ))
           ''');
     });
@@ -643,9 +770,9 @@
           expression: 'x + field',
           expectedResult: '''
           (function(x) {
-            return dart.dsend(x, '+', [this.field]);
+            return dart.notNull(x) + dart.notNull(this.field);
           }.bind(this)(
-          1
+            1
           ))
           ''');
     });
@@ -658,7 +785,7 @@
           (function(x) {
             let foo = require('foo.dart').foo;
             let _field = dart.privateName(foo, "_field");
-            return dart.dsend(x, '+', [this[_field]]);
+            return dart.notNull(x) + dart.notNull(this[_field]);
           }.bind(this)(
           1
           ))
@@ -724,6 +851,7 @@
 
   group('Expression compiler tests in async method:', () {
     const source = '''
+      // @dart = 2.9
       class C {
         C(int this.field, int this._field);
 
@@ -784,6 +912,7 @@
 
   group('Expression compiler tests in global function:', () {
     const source = '''
+      // @dart = 2.9
       extension NumberParsing on String {
         int parseInt() {
           return int.parse(this);
@@ -845,7 +974,8 @@
           (function(x, c) {
             return x;
           }(
-          1, null
+            1,
+            null
           ))
           ''');
     });
@@ -858,7 +988,8 @@
           (function(x, c) {
             return c;
           }(
-          1, null
+            1,
+            null
           ))
           ''');
     });
@@ -871,7 +1002,8 @@
             (function(x, c) {
               return new foo.C.new(1, 3);
             }(
-            1, null
+              1,
+              null
             ))
             ''');
     });
@@ -886,7 +1018,8 @@
             let _field = dart.privateName(foo, "_field");
             return new foo.C.new(1, 3)[_field];
           }(
-          1, null
+            1,
+            null
           ))
           ''');
     });
@@ -899,7 +1032,8 @@
           (function(x, c) {
             return foo.C.staticField;
           }(
-          1, null
+            1,
+            null
           ))
           ''');
     });
@@ -917,9 +1051,10 @@
           expression: 'c.field',
           expectedResult: '''
           (function(x, c) {
-            return dart.dloadRepl(c, 'field');
+            return c.field;
           }(
-          1, null
+            1,
+            null
           ))
           ''');
     });
@@ -932,9 +1067,10 @@
           (function(x, c) {
             let foo = require('foo.dart').foo;
             let _field = dart.privateName(foo, "_field");
-            return dart.dloadRepl(c, _field);
+            return c[_field];
           }(
-          1, null
+              1,
+              null
           ))
           ''');
     });
@@ -945,9 +1081,10 @@
           expression: 'c.methodFieldAccess(2)',
           expectedResult: '''
           (function(x, c) {
-            return dart.dsendRepl(c, 'methodFieldAccess', [2]);
+            return c.methodFieldAccess(2);
           }(
-          1, null
+            1,
+            null
           ))
           ''');
     });
@@ -958,9 +1095,10 @@
           expression: 'c.asyncMethod(2)',
           expectedResult: '''
           (function(x, c) {
-            return dart.dsendRepl(c, 'asyncMethod', [2]);
+            return c.asyncMethod(2);
           }(
-          1, null
+            1,
+            null
           ))
           ''');
     });
@@ -970,12 +1108,13 @@
           scope: <String, String>{'x': '1', 'c': 'null'},
           expression: '"1234".parseInt()',
           expectedResult: '''
-        (function(x, c) {
-          return foo['NumberParsing|parseInt']("1234");
-        }(
-        1, null
-        ))
-        ''');
+          (function(x, c) {
+            return foo['NumberParsing|parseInt']("1234");
+          }(
+            1,
+            null
+          ))
+          ''');
     });
 
     test('private field modification', () async {
@@ -986,9 +1125,10 @@
           (function(x, c) {
             let foo = require('foo.dart').foo;
             let _field = dart.privateName(foo, "_field");
-            return dart.dputRepl(c, _field, 2);
+            return c[_field] = 2;
           }(
-          1, null
+            1,
+            null
           ))
           ''');
     });
@@ -999,9 +1139,10 @@
           expression: 'c.field = 2',
           expectedResult: '''
           (function(x, c) {
-            return dart.dputRepl(c, 'field', 2);
+            return c.field = 2;
           }(
-          1, null
+            1,
+            null
           ))
           ''');
     });
@@ -1021,7 +1162,8 @@
           (function(x, c) {
             return foo.C.staticField = 2;
           }(
-          1, null
+            1,
+            null
           ))
           ''');
     });
@@ -1034,7 +1176,8 @@
           (function(x, c) {
             return core.print(x);
           }(
-          1, null
+            1,
+            null
           ))
           ''');
     });
@@ -1042,6 +1185,7 @@
 
   group('Expression compiler tests in closures:', () {
     const source = r'''
+      // @dart = 2.9
       int globalFunction() {
       int x = 15;
       var c = C(1, 2);
@@ -1085,7 +1229,10 @@
           (function(x, c, y, z) {
             return dart.str(x) + "+" + dart.str(y) + "+" + dart.str(z);
           }(
-          1, null, 3, 0
+            1,
+            null,
+            3,
+            0
           ))
           ''');
     });
@@ -1098,7 +1245,10 @@
           (function(x, c, y, z) {
             return dart.str(y) + "+" + dart.str(z);
           }(
-          1, null, 3, 0
+            1,
+            null,
+            3,
+            0
           ))
           ''');
     });
@@ -1106,6 +1256,7 @@
 
   group('Expression compiler tests in method with no type use', () {
     const source = '''
+      // @dart = 2.9
       abstract class Key {
         const factory Key(String value) = ValueKey;
         const Key.empty();
@@ -1128,6 +1279,9 @@
       int bar(int p){
         return p;
       }
+      int baz(String t){
+        return t;
+      }
       void main() {
         var k = Key('t');
         MyClass c = MyClass(0);
@@ -1154,10 +1308,23 @@
           expression: 'bar(p)',
           expectedResult: '''
           (function(p) {
-            var intL = () => (intL = dart.constFn(dart.legacy(core.int)))();
-            return foo.bar(intL().as(p));
+            return foo.bar(p);
           }(
-          1
+            1
+          ))
+          ''');
+    });
+
+    test('call function using type', () async {
+      await driver.check(
+          scope: <String, String>{'p': '0'},
+          expression: 'baz(p as String)',
+          expectedResult: '''
+          (function(p) {
+            var StringL = () => (StringL = dart.constFn(dart.legacy(core.String)))();
+            return foo.baz(StringL().as(p));
+          }(
+          0
           ))
           ''');
     });
@@ -1168,9 +1335,18 @@
           expression: 'const MyClass(1)',
           expectedResult: '''
           (function(p) {
-            return C0 || CT.C0;
+             dart.defineLazy(CT, {
+               get C0() {
+                 return C0 = dart.const({
+                   __proto__: foo.MyClass.prototype,
+                   [_t]: 1
+                 });
+               }
+             }, false);
+             var C0;
+             return C0 || CT.C0;
           }(
-          1
+            1
           ))
           ''');
     });
@@ -1186,8 +1362,8 @@
           ))
           ''');
     },
-        skip:
-            'Cannot compile constants optimized away by the frontend'); // https://github.com/dart-lang/sdk/issues/41999
+        skip: 'Cannot compile constants optimized away by the frontend. '
+            'Issue: https://github.com/dart-lang/sdk/issues/41999');
 
     test('evaluate factory constructor call', () async {
       await driver.check(
@@ -1197,7 +1373,7 @@
           (function(p) {
             return new foo.ValueKey.new("t");
           }(
-          1
+            1
           ))
           ''');
     });
@@ -1208,11 +1384,492 @@
           expression: "const Key('t')",
           expectedResult: '''
           (function(p) {
+            dart.defineLazy(CT, {
+              get C0() {
+                return C0 = dart.const({
+                  __proto__: foo.ValueKey.prototype,
+                  [value]: "t"
+                  });
+                }
+            }, false);
+            var C0;
             return C0 || CT.C0;
           }(
-          1
+            1
           ))
           ''');
     });
   });
+
+  group('Expression compiler tests in constructor:', () {
+    const source = '''
+      // @dart = 2.9
+      extension NumberParsing on String {
+        int parseInt() {
+          return int.parse(this);
+        }
+      }
+
+      int global = 42;
+
+      class C {
+        C(int this.field, int this._field) {
+          int x = 1;
+          /* evaluation placeholder */
+          print(this.field);
+        }
+
+        static int staticField = 0;
+        static int _staticField = 1;
+
+        int _field;
+        int field;
+
+        int methodFieldAccess(int t) {
+          return t + _field + _staticField;
+        }
+
+        Future<int> asyncMethod(int t) async {
+          return t;
+        }
+      }
+
+      main() => 0;
+      ''';
+
+    TestDriver driver;
+
+    setUp(() {
+      driver = TestDriver(options, source);
+    });
+
+    tearDown(() {
+      driver.delete();
+    });
+
+    test('compilation error', () async {
+      await driver.check(
+          scope: <String, String>{'x': '1'},
+          expression: 'typo',
+          expectedError: "The getter 'typo' isn't defined for the class 'C'");
+    });
+
+    test('local', () async {
+      await driver.check(
+          scope: <String, String>{'x': '1'},
+          expression: 'x',
+          expectedResult: '''
+          (function(x) {
+            return x;
+          }.bind(this)(
+            1
+          ))
+          ''');
+    });
+
+    test('this', () async {
+      await driver.check(
+          scope: <String, String>{'x': '1'},
+          expression: 'this',
+          expectedResult: '''
+          (function(x) {
+            return this;
+          }.bind(this)(
+            1
+          ))
+          ''');
+    });
+
+    test('expression using locals', () async {
+      await driver.check(
+          scope: <String, String>{'x': '1'},
+          expression: 'x + 1',
+          expectedResult: '''
+          (function(x) {
+            return dart.notNull(x) + 1;
+          }.bind(this)(
+            1
+          ))
+          ''');
+    });
+
+    test('expression using static fields', () async {
+      await driver.check(
+          scope: <String, String>{'x': '1'},
+          expression: 'x + staticField',
+          expectedResult: '''
+          (function(x) {
+            return dart.notNull(x) + dart.notNull(foo.C.staticField);
+          }.bind(this)(
+            1
+          ))
+          ''');
+    });
+
+    test('expression using private static fields', () async {
+      await driver.check(
+          scope: <String, String>{'x': '1'},
+          expression: 'x + _staticField',
+          expectedResult: '''
+          (function(x) {
+            let foo = require('foo.dart').foo;
+            let _staticField = dart.privateName(foo, "_staticField");
+            return dart.notNull(x) + dart.notNull(foo.C._staticField);
+          }.bind(this)(
+            1
+          ))
+          ''');
+    });
+
+    test('expression using fields', () async {
+      await driver.check(
+          scope: <String, String>{'x': '1'},
+          expression: 'x + field',
+          expectedResult: '''
+          (function(x) {
+            return dart.notNull(x) + dart.notNull(this.field);
+          }.bind(this)(
+            1
+          ))
+          ''');
+    });
+
+    test('expression using private fields', () async {
+      await driver.check(
+          scope: <String, String>{'x': '1'},
+          expression: 'x + _field',
+          expectedResult: '''
+          (function(x) {
+            let foo = require('foo.dart').foo;
+            let _field = dart.privateName(foo, "_field");
+            return dart.notNull(x) + dart.notNull(this[_field]);
+          }.bind(this)(
+              1
+          ))
+          ''');
+    });
+
+    test('expression using globals', () async {
+      await driver.check(
+          scope: <String, String>{'x': '1'},
+          expression: 'x + global',
+          expectedResult: '''
+          (function(x) {
+            return dart.notNull(x) + dart.notNull(foo.global);
+          }.bind(this)(
+            1
+          ))
+          ''');
+    });
+
+    test('method call', () async {
+      await driver.check(
+          scope: <String, String>{'x': '1'},
+          expression: 'methodFieldAccess(2)',
+          expectedResult: '''
+          (function(x) {
+            return this.methodFieldAccess(2);
+          }.bind(this)(
+            1
+          ))
+          ''');
+    });
+
+    test('async method call', () async {
+      await driver.check(
+          scope: <String, String>{'x': '1'},
+          expression: 'asyncMethod(2)',
+          expectedResult: '''
+          (function(x) {
+            return this.asyncMethod(2);
+          }.bind(this)(
+            1
+          ))
+          ''');
+    });
+
+    test('extension method call', () async {
+      await driver.check(
+          scope: <String, String>{'x': '1'},
+          expression: '"1234".parseInt()',
+          expectedResult: '''
+        (function(x) {
+          return foo['NumberParsing|parseInt']("1234");
+        }.bind(this)(
+          1
+        ))
+        ''');
+    });
+
+    test('private field modification', () async {
+      await driver.check(
+          scope: <String, String>{'x': '1'},
+          expression: '_field = 2',
+          expectedResult: '''
+        (function(x) {
+          let foo = require('foo.dart').foo;
+          let _field = dart.privateName(foo, "_field");
+          return this[_field] = 2;
+        }.bind(this)(
+          1
+        ))
+        ''');
+    });
+
+    test('field modification', () async {
+      await driver.check(
+          scope: <String, String>{'x': '1'},
+          expression: 'field = 2',
+          expectedResult: '''
+          (function(x) {
+            return this.field = 2;
+          }.bind(this)(
+            1
+          ))
+          ''');
+    });
+
+    test('private static field modification', () async {
+      await driver.check(
+          scope: <String, String>{'x': '1'},
+          expression: '_staticField = 2',
+          expectedResult: '''
+          (function(x) {
+            let foo = require('foo.dart').foo;
+            let _staticField = dart.privateName(foo, "_staticField");
+            return foo.C._staticField = 2;
+          }.bind(this)(
+            1
+          ))
+          ''');
+    });
+
+    test('static field modification', () async {
+      await driver.check(
+          scope: <String, String>{'x': '1'},
+          expression: 'staticField = 2',
+          expectedResult: '''
+          (function(x) {
+            return foo.C.staticField = 2;
+          }.bind(this)(
+            1
+          ))
+          ''');
+    });
+  });
+
+  group('Expression compiler tests in loops:', () {
+    const source = r'''
+      // @dart = 2.9
+      int globalFunction() {
+        int x = 15;
+        var c = C(1, 2);
+
+        for(int i = 0; i < 10; i++) {
+          /* evaluation placeholder */
+          print('$i+$x');
+        };
+        return 0;
+      }
+
+      main() => 0;
+      ''';
+
+    TestDriver driver;
+    setUp(() {
+      driver = TestDriver(options, source);
+    });
+
+    tearDown(() {
+      driver.delete();
+    });
+
+    test('expression using local', () async {
+      await driver.check(
+          scope: <String, String>{'x': '1', 'c': 'null', 'i': '0'},
+          expression: 'x',
+          expectedResult: '''
+          (function(x, c, i) {
+            return x;
+          }(
+            1,
+            null,
+            0
+          ))
+          ''');
+    });
+
+    test('expression using loop variable', () async {
+      await driver.check(
+          scope: <String, String>{'x': '1', 'c': 'null', 'i': '0'},
+          expression: 'i',
+          expectedResult: '''
+          (function(x, c, i) {
+            return i;
+          }(
+            1,
+            null,
+            0
+          ))
+          ''');
+    });
+  });
+
+  group('Expression compiler tests in conditional (then):', () {
+    const source = r'''
+      // @dart = 2.9
+      int globalFunction() {
+        int x = 1;
+        var c = C(1, 2);
+
+        if (x == 14) {
+          int y = 3;
+          /* evaluation placeholder */
+          print('$y+$x');
+        } else {
+          int z = 3;
+          print('$z+$x');
+        }
+        return 0;
+      }
+
+      main() => 0;
+      ''';
+
+    TestDriver driver;
+    setUp(() {
+      driver = TestDriver(options, source);
+    });
+
+    tearDown(() {
+      driver.delete();
+    });
+
+    test('expression using local', () async {
+      await driver.check(
+          scope: <String, String>{'x': '1', 'c': 'null', 'y': '3'},
+          expression: 'y',
+          expectedResult: '''
+          (function(x, c, y) {
+            return y;
+          }(
+            1,
+            null,
+            3
+          ))
+          ''');
+    });
+
+    test('expression using local out of scope', () async {
+      await driver.check(
+          scope: <String, String>{'x': '1', 'c': 'null', 'y': '3'},
+          expression: 'z',
+          expectedError: "Error: Getter not found: 'z'");
+    });
+  });
+
+  group('Expression compiler tests in conditional (else):', () {
+    const source = r'''
+      // @dart = 2.9
+      int globalFunction() {
+        int x = 1;
+        var c = C(1, 2);
+
+        if (x == 14) {
+          int y = 3;
+          print('$y+$x');
+        } else {
+          int z = 3;
+          /* evaluation placeholder */
+          print('$z+$x');
+        }
+        return 0;
+      }
+
+      main() => 0;
+      ''';
+
+    TestDriver driver;
+    setUp(() {
+      driver = TestDriver(options, source);
+    });
+
+    tearDown(() {
+      driver.delete();
+    });
+
+    test('expression using local', () async {
+      await driver.check(
+          scope: <String, String>{'x': '1', 'c': 'null', 'z': '3'},
+          expression: 'z',
+          expectedResult: '''
+          (function(x, c, z) {
+            return z;
+          }(
+            1,
+            null,
+            3
+          ))
+          ''');
+    });
+
+    test('expression using local out of scope', () async {
+      await driver.check(
+          scope: <String, String>{'x': '1', 'c': 'null', 'z': '3'},
+          expression: 'y',
+          expectedError: "Error: Getter not found: 'y'");
+    });
+  });
+
+  group('Expression compiler tests after conditionals:', () {
+    const source = r'''
+      // @dart = 2.9
+      int globalFunction() {
+        int x = 1;
+        var c = C(1, 2);
+
+        if (x == 14) {
+          int y = 3;
+          print('$y+$x');
+        } else {
+          int z = 3;
+          print('$z+$x');
+        }
+        /* evaluation placeholder */
+        return 0;
+      }
+
+      main() => 0;
+      ''';
+
+    TestDriver driver;
+    setUp(() {
+      driver = TestDriver(options, source);
+    });
+
+    tearDown(() {
+      driver.delete();
+    });
+
+    test('expression using local', () async {
+      await driver.check(
+          scope: <String, String>{'x': '1', 'c': 'null'},
+          expression: 'x',
+          expectedResult: '''
+          (function(x, c) {
+            return x;
+          }(
+            1,
+            null
+          ))
+          ''');
+    });
+
+    test('expression using local out of scope', () async {
+      await driver.check(
+          scope: <String, String>{'x': '1', 'c': 'null'},
+          expression: 'z',
+          expectedError: "Error: Getter not found: 'z'");
+    });
+  });
 }
diff --git a/pkg/dev_compiler/test/expression_compiler/expression_compiler_worker_test.dart b/pkg/dev_compiler/test/expression_compiler/expression_compiler_worker_test.dart
index 25474d0..1735621 100644
--- a/pkg/dev_compiler/test/expression_compiler/expression_compiler_worker_test.dart
+++ b/pkg/dev_compiler/test/expression_compiler/expression_compiler_worker_test.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 import 'dart:async';
 import 'dart:convert';
 import 'dart:io' show Directory, File, Platform, Process, stderr, stdout;
@@ -100,28 +102,38 @@
     File.fromUri(main)
       ..createSync(recursive: true)
       ..writeAsStringSync('''
+// @dart = 2.9
 import 'package:_testPackage/test_library.dart';
 
 var global = 0;
 
 void main() {
   var count = 0;
-  // line 7
+  // line 8
   print('Global is: \${++global}');
   print('Count is: \${++count}');
 
   B b = new B();
 }
+
+extension NumberParsing on String {
+  int parseInt() {
+    var ret = int.parse(this);
+    // line 17
+    return ret;
+  }
+}
 ''');
 
     var testLibrary = root.resolve('lib/test_library.dart');
     File.fromUri(testLibrary)
       ..createSync()
       ..writeAsStringSync('''
+// @dart = 2.9
 import 'package:_testPackage/test_library2.dart';
 
 int testLibraryFunction(int formal) {
-  return formal; // line 4
+  return formal; // line 5
 }
 
 int callLibraryFunction2(int formal) {
@@ -137,8 +149,9 @@
     File.fromUri(testLibrary2)
       ..createSync()
       ..writeAsStringSync('''
+// @dart = 2.9
 int testLibraryFunction2(int formal) {
-  return formal; // line 2
+  return formal; // line 3
 }
 
 class C {
@@ -257,7 +270,7 @@
       requestController.add({
         'command': 'CompileExpression',
         'expression': 'formal',
-        'line': 4,
+        'line': 5,
         'column': 1,
         'jsModules': {},
         'jsScope': {'formal': 'formal'},
@@ -289,7 +302,7 @@
       requestController.add({
         'command': 'CompileExpression',
         'expression': 'count',
-        'line': 7,
+        'line': 8,
         'column': 1,
         'jsModules': {},
         'jsScope': {'count': 'count'},
@@ -312,6 +325,40 @@
           ]));
     });
 
+    test(
+        'can load dependencies and compile expressions in main (extension method)',
+        () async {
+      requestController.add({
+        'command': 'UpdateDeps',
+        'inputs': inputs,
+      });
+
+      requestController.add({
+        'command': 'CompileExpression',
+        'expression': 'ret',
+        'line': 17,
+        'column': 1,
+        'jsModules': {},
+        'jsScope': {'ret': 'ret'},
+        'libraryUri': config.mainModule.libraryUri,
+        'moduleName': config.mainModule.moduleName,
+      });
+
+      expect(
+          responseController.stream,
+          emitsInOrder([
+            equals({
+              'succeeded': true,
+            }),
+            equals({
+              'succeeded': true,
+              'errors': isEmpty,
+              'warnings': isEmpty,
+              'compiledProcedure': contains('return ret;'),
+            })
+          ]));
+    });
+
     test('can load dependencies and compile transitive expressions in main',
         () async {
       requestController.add({
@@ -322,7 +369,7 @@
       requestController.add({
         'command': 'CompileExpression',
         'expression': 'B().c().getNumber()',
-        'line': 7,
+        'line': 8,
         'column': 1,
         'jsModules': {},
         'jsScope': {},
@@ -443,7 +490,7 @@
       requestController.add({
         'command': 'CompileExpression',
         'expression': 'formal',
-        'line': 4,
+        'line': 5,
         'column': 1,
         'jsModules': {},
         'jsScope': {'formal': 'formal'},
@@ -475,7 +522,7 @@
       requestController.add({
         'command': 'CompileExpression',
         'expression': 'count',
-        'line': 7,
+        'line': 8,
         'column': 1,
         'jsModules': {},
         'jsScope': {'count': 'count'},
diff --git a/pkg/dev_compiler/test/expression_compiler/scope_offset_test.dart b/pkg/dev_compiler/test/expression_compiler/scope_offset_test.dart
new file mode 100644
index 0000000..0ee38ea
--- /dev/null
+++ b/pkg/dev_compiler/test/expression_compiler/scope_offset_test.dart
@@ -0,0 +1,138 @@
+// Copyright (c) 2020, 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.
+
+// @dart = 2.9
+
+import 'package:dev_compiler/src/kernel/expression_compiler.dart';
+import 'package:front_end/src/api_prototype/standard_file_system.dart';
+import 'package:front_end/src/api_unstable/ddc.dart';
+import 'package:front_end/src/compute_platform_binaries_location.dart';
+import 'package:kernel/ast.dart';
+import 'package:kernel/binary/ast_from_binary.dart';
+import 'package:kernel/src/printer.dart';
+import 'package:test/test.dart';
+
+/// Verbose mode for debugging
+bool get verbose => false;
+
+Uri get sdkRoot => computePlatformBinariesLocation();
+Uri get sdkSummaryPath => sdkRoot.resolve('ddc_sdk.dill');
+Uri get librariesPath => sdkRoot.resolve('lib/libraries.json');
+
+void main(List<String> args) {
+  test('Offsets are present on scoping nodes in SDK', () async {
+    var entity = StandardFileSystem.instance.entityForUri(sdkSummaryPath);
+    var bytes = await entity.readAsBytes();
+
+    var component = Component();
+    BinaryBuilderWithMetadata(bytes, disableLazyReading: true)
+        .readComponent(component, checkCanonicalNames: true, createView: true);
+
+    for (var lib in component.libraries) {
+      ScopeOffsetValidator.validate(lib);
+    }
+  });
+}
+
+class ScopeOffsetValidator extends Visitor<void> {
+  int classCount = 0;
+  int memberCount = 0;
+  int blockCount = 0;
+
+  ScopeOffsetValidator._();
+
+  static void validate(Library library) {
+    var validator = ScopeOffsetValidator._();
+    validator.visitLibrary(library);
+    expect(validator.classCount + validator.memberCount, greaterThan(0),
+        reason: 'Validation was not empty');
+    expect(validator.blockCount, equals(0),
+        reason: 'SDK dill only contains outlines');
+  }
+
+  @override
+  void defaultTreeNode(Node node) {
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitClass(Class cls) {
+    classCount++;
+    expect(
+        cls,
+        const TypeMatcher<Class>()
+            .having((c) => c.fileOffset, '${cls.name} : fileOffset',
+                isNot(equals(-1)))
+            .having((c) => c.fileEndOffset, '${cls.name} : fileEndOffset',
+                isNot(equals(-1))));
+
+    super.visitClass(cls);
+  }
+
+  @override
+  void defaultMember(Member member) {
+    // exclude code that does not correspond to a dart source
+    // location we can set a breakpoint on.
+    var noBreakPointPossible = (member is Constructor)
+        ? member.isSynthetic
+        : (member is Procedure)
+            ? member.isNoSuchMethodForwarder ||
+                member.isAbstract ||
+                member.isForwardingStub
+            : (member is Field)
+                ? member.name.name.contains(redirectingName)
+                : false;
+
+    if (!noBreakPointPossible) {
+      memberCount++;
+      expect(
+          member,
+          const TypeMatcher<Member>()
+              .having(
+                  (c) => c.fileOffset,
+                  '${member.enclosingClass}.${member.name} : fileOffset',
+                  isNot(equals(-1)))
+              .having(
+                  (c) => c.fileEndOffset,
+                  '${member.enclosingClass}.${member.name} : fileEndOffset',
+                  isNot(equals(-1))));
+
+      super.defaultMember(member);
+    }
+  }
+
+  @override
+  void visitFunctionNode(FunctionNode fun) {
+    expect(
+        fun,
+        const TypeMatcher<FunctionNode>()
+            .having(
+                (c) => c.fileOffset,
+                '${fun.parent.toText(astTextStrategyForTesting)} : fileOffset',
+                isNot(equals(-1)))
+            .having(
+                (c) => c.fileEndOffset,
+                '${fun.parent.toText(astTextStrategyForTesting)} : fileEndOffset',
+                isNot(equals(-1))));
+
+    super.visitFunctionNode(fun);
+  }
+
+  @override
+  void visitBlock(Block block) {
+    blockCount++;
+    expect(
+        block,
+        const TypeMatcher<FunctionNode>().having(
+            (c) => c.fileOffset,
+            '${block.toText(astTextStrategyForTesting)} : fileOffset',
+            isNot(equals(-1))));
+
+    var fileEndOffset = FileEndOffsetCalculator.calculateEndOffset(block);
+    expect(fileEndOffset, isNot(equals(-1)),
+        reason: '${block.toText(astTextStrategyForTesting)} : fileOffset');
+
+    super.visitBlock(block);
+  }
+}
diff --git a/pkg/dev_compiler/test/js/builder_test.dart b/pkg/dev_compiler/test/js/builder_test.dart
index 9a1ac18..acfb55c 100644
--- a/pkg/dev_compiler/test/js/builder_test.dart
+++ b/pkg/dev_compiler/test/js/builder_test.dart
@@ -1,3 +1,5 @@
+// @dart = 2.9
+
 import 'package:dev_compiler/src/js_ast/js_ast.dart';
 import 'package:test/test.dart';
 
diff --git a/pkg/dev_compiler/test/modular_suite.dart b/pkg/dev_compiler/test/modular_suite.dart
index 3d47edc..79181e5 100644
--- a/pkg/dev_compiler/test/modular_suite.dart
+++ b/pkg/dev_compiler/test/modular_suite.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 /// Test the modular compilation pipeline of ddc.
 ///
 /// This is a shell that runs multiple tests, one per folder under `data/`.
diff --git a/pkg/dev_compiler/test/modular_suite_nnbd.dart b/pkg/dev_compiler/test/modular_suite_nnbd.dart
index 6677465..aaf92a3 100644
--- a/pkg/dev_compiler/test/modular_suite_nnbd.dart
+++ b/pkg/dev_compiler/test/modular_suite_nnbd.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 /// Test the modular compilation pipeline of ddc.
 ///
 /// This is a shell that runs multiple tests, one per folder under `data/`.
diff --git a/pkg/dev_compiler/test/module_metadata_test.dart b/pkg/dev_compiler/test/module_metadata_test.dart
index 93f9d7b..2751e94 100644
--- a/pkg/dev_compiler/test/module_metadata_test.dart
+++ b/pkg/dev_compiler/test/module_metadata_test.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 import 'dart:convert';
 import 'dart:io';
 
diff --git a/pkg/dev_compiler/test/nullable_inference_test.dart b/pkg/dev_compiler/test/nullable_inference_test.dart
index bbaefa1..9753c50 100644
--- a/pkg/dev_compiler/test/nullable_inference_test.dart
+++ b/pkg/dev_compiler/test/nullable_inference_test.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 import 'dart:async';
 import 'dart:io';
 import 'package:front_end/src/api_unstable/ddc.dart' as fe;
@@ -50,7 +52,7 @@
     });
     test('Map', () async {
       await expectNotNull('main() { print({"x": null}); }',
-          '<dart.core::String*, dart.core::Null?>{"x": null}, "x"');
+          '<dart.core::String*, Null>{"x": null}, "x"');
     });
 
     test('Symbol', () async {
@@ -256,7 +258,7 @@
 
   test('function expression', () async {
     await expectNotNull(
-        'main() { () => null; f() {}; f; }', 'dart.core::Null? () => null, f');
+        'main() { () => null; f() {}; f; }', 'Null () => null, f');
   });
 
   test('cascades (kernel BlockExpression)', () async {
@@ -397,7 +399,7 @@
       await expectNotNull('''main() {
         var x = () => 42;
         var y = (() => x = null);
-      }''', 'dart.core::int* () => 42, 42, dart.core::Null? () => x = null');
+      }''', 'dart.core::int* () => 42, 42, Null () => x = null');
     });
     test('do not depend on unrelated variables', () async {
       await expectNotNull('''main() {
@@ -495,6 +497,7 @@
 /// to be produced in the set of expressions that cannot be null by DDC's null
 /// inference.
 Future expectNotNull(String code, String expectedNotNull) async {
+  code = '// @dart = 2.9\n$code';
   var result = await kernelCompile(code);
   var collector = NotNullCollector(result.librariesFromDill);
   result.component.accept(collector);
@@ -523,6 +526,7 @@
 
 /// Given the Dart [code], expects all the expressions inferred to be not-null.
 Future expectAllNotNull(String code) async {
+  code = '// @dart = 2.9\n$code';
   var result = (await kernelCompile(code));
   result.component.accept(ExpectAllNotNull(result.librariesFromDill));
 }
@@ -672,7 +676,7 @@
   _compilerState = await fe.initializeCompiler(oldCompilerState, false, null,
       sdkUri, packagesUri, null, [], DevCompilerTarget(TargetFlags()),
       fileSystem: _fileSystem,
-      experiments: const {},
+      explicitExperimentalFlags: const {},
       environmentDefines: const {},
       nnbdMode: fe.NnbdMode.Weak);
   if (!identical(oldCompilerState, _compilerState)) inference = null;
diff --git a/pkg/dev_compiler/test/sdk_source_map_test.dart b/pkg/dev_compiler/test/sdk_source_map_test.dart
index 799c1b1..84e6038 100644
--- a/pkg/dev_compiler/test/sdk_source_map_test.dart
+++ b/pkg/dev_compiler/test/sdk_source_map_test.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 import 'dart:io';
 
 import 'package:expect/expect.dart';
diff --git a/pkg/dev_compiler/test/sourcemap/common.dart b/pkg/dev_compiler/test/sourcemap/common.dart
index d28dc9e..3e9564d 100644
--- a/pkg/dev_compiler/test/sourcemap/common.dart
+++ b/pkg/dev_compiler/test/sourcemap/common.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 import 'dart:async' show Future;
 
 import 'dart:io';
diff --git a/pkg/dev_compiler/test/sourcemap/ddc_common.dart b/pkg/dev_compiler/test/sourcemap/ddc_common.dart
index 37b78f7..b090d76 100644
--- a/pkg/dev_compiler/test/sourcemap/ddc_common.dart
+++ b/pkg/dev_compiler/test/sourcemap/ddc_common.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 library dev_compiler.test.sourcemap.ddc_common;
 
 import 'dart:io';
diff --git a/pkg/dev_compiler/test/sourcemap/sourcemaps_ddk_suite.dart b/pkg/dev_compiler/test/sourcemap/sourcemaps_ddk_suite.dart
index 9a07e32..0a88bc0 100644
--- a/pkg/dev_compiler/test/sourcemap/sourcemaps_ddk_suite.dart
+++ b/pkg/dev_compiler/test/sourcemap/sourcemaps_ddk_suite.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 import 'dart:async';
 import 'dart:io';
 
diff --git a/pkg/dev_compiler/test/sourcemap/stacktrace_ddk_suite.dart b/pkg/dev_compiler/test/sourcemap/stacktrace_ddk_suite.dart
index d7cb571..e93433a 100644
--- a/pkg/dev_compiler/test/sourcemap/stacktrace_ddk_suite.dart
+++ b/pkg/dev_compiler/test/sourcemap/stacktrace_ddk_suite.dart
@@ -1,3 +1,5 @@
+// @dart = 2.9
+
 import 'package:front_end/src/api_unstable/ddc.dart' as fe;
 import 'package:testing/testing.dart';
 
diff --git a/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/null_instance_field.dart b/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/null_instance_field.dart
index 2a36f88..d0ec237 100644
--- a/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/null_instance_field.dart
+++ b/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/null_instance_field.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 void main() {
   /*1:main*/ test(Class());
 }
diff --git a/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/null_interceptor_field.dart b/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/null_interceptor_field.dart
index d43b10b..a7bace6 100644
--- a/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/null_interceptor_field.dart
+++ b/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/null_interceptor_field.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 class MyType {
   int get length => 3; // ensures we build an interceptor for `.length`
 }
diff --git a/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/rethrow.dart b/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/rethrow.dart
index 908eb8f..3bff992 100644
--- a/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/rethrow.dart
+++ b/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/rethrow.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 void main() {
   /*1:main*/ test();
 }
diff --git a/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/throw_in_async.dart b/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/throw_in_async.dart
index e1e10f8..c2357bd 100644
--- a/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/throw_in_async.dart
+++ b/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/throw_in_async.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 void main() {
   /*1:main*/ test();
 }
diff --git a/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/throw_in_awaited_async.dart b/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/throw_in_awaited_async.dart
index 0458fc9..740a9e4 100644
--- a/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/throw_in_awaited_async.dart
+++ b/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/throw_in_awaited_async.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 void main() {
   /*1:main*/ test1();
 }
diff --git a/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/throw_in_constructor.dart b/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/throw_in_constructor.dart
index f57db8f..b610f05 100644
--- a/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/throw_in_constructor.dart
+++ b/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/throw_in_constructor.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 void main() {
   // ignore: UNUSED_LOCAL_VARIABLE
   var /*ddc.1:main*/ c = /*ddk.1:main*/ Class();
diff --git a/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/throw_in_constructor_from_async.dart b/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/throw_in_constructor_from_async.dart
index 37467ae..62f002d 100644
--- a/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/throw_in_constructor_from_async.dart
+++ b/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/throw_in_constructor_from_async.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 void main() {
   // This call is no longer on the stack when the error is thrown.
   /*1:main*/ test();
diff --git a/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/throw_in_instance_method.dart b/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/throw_in_instance_method.dart
index 84dac4e3..ecdfe70 100644
--- a/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/throw_in_instance_method.dart
+++ b/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/throw_in_instance_method.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 void main() {
   var c = Class();
   c. /*1:main*/ test();
diff --git a/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/throw_in_main.dart b/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/throw_in_main.dart
index c7043fe..8548403 100644
--- a/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/throw_in_main.dart
+++ b/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/throw_in_main.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 void main() {
   /*1:main*/ throw '>ExceptionMarker<';
 }
diff --git a/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/throw_in_static_method.dart b/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/throw_in_static_method.dart
index e0b974c..cdd06f4 100644
--- a/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/throw_in_static_method.dart
+++ b/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/throw_in_static_method.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 void main() {
   /*ddc.1:main*/ Class. /*ddk.1:main*/ test();
 }
diff --git a/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/throw_in_top_level_method.dart b/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/throw_in_top_level_method.dart
index 799c9c0..125bc2d 100644
--- a/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/throw_in_top_level_method.dart
+++ b/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/throw_in_top_level_method.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 void main() {
   /*1:main*/ test();
 }
diff --git a/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/throw_in_top_level_method_from_async.dart b/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/throw_in_top_level_method_from_async.dart
index 06ec99f..5dd30d1 100644
--- a/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/throw_in_top_level_method_from_async.dart
+++ b/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/throw_in_top_level_method_from_async.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 void main() {
   /*1:main*/ test1();
 }
diff --git a/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/throw_in_try_catch.dart b/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/throw_in_try_catch.dart
index d02b31b..3c2bd99 100644
--- a/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/throw_in_try_catch.dart
+++ b/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/throw_in_try_catch.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 void main() {
   /*1:main*/ test();
 }
diff --git a/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/throw_in_try_finally.dart b/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/throw_in_try_finally.dart
index 211f9ed..b92875b 100644
--- a/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/throw_in_try_finally.dart
+++ b/pkg/dev_compiler/test/sourcemap/stacktrace_testfiles/throw_in_try_finally.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 void main() {
   /*1:main*/ test();
 }
diff --git a/pkg/dev_compiler/test/sourcemap/testfiles/breakpoint_on_function_line_breaks_in_body.dart b/pkg/dev_compiler/test/sourcemap/testfiles/breakpoint_on_function_line_breaks_in_body.dart
index b38f0821..0748c25 100644
--- a/pkg/dev_compiler/test/sourcemap/testfiles/breakpoint_on_function_line_breaks_in_body.dart
+++ b/pkg/dev_compiler/test/sourcemap/testfiles/breakpoint_on_function_line_breaks_in_body.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 void main() {
   foo();
 }
diff --git a/pkg/dev_compiler/test/sourcemap/testfiles/call_on_field_in_class.dart b/pkg/dev_compiler/test/sourcemap/testfiles/call_on_field_in_class.dart
index 86d5250..51c0dcc 100644
--- a/pkg/dev_compiler/test/sourcemap/testfiles/call_on_field_in_class.dart
+++ b/pkg/dev_compiler/test/sourcemap/testfiles/call_on_field_in_class.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 void main() {
   /* bl */ var foo = /*sl:1*/ Foo();
   foo.foo = foo. /*sl:2*/ fooMethod;
diff --git a/pkg/dev_compiler/test/sourcemap/testfiles/hello_async.dart b/pkg/dev_compiler/test/sourcemap/testfiles/hello_async.dart
index 62fba8c..11023f4 100644
--- a/pkg/dev_compiler/test/sourcemap/testfiles/hello_async.dart
+++ b/pkg/dev_compiler/test/sourcemap/testfiles/hello_async.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 void main() {
   /*bl*/
   /*s:1*/ foo();
diff --git a/pkg/dev_compiler/test/sourcemap/testfiles/hello_call.dart b/pkg/dev_compiler/test/sourcemap/testfiles/hello_call.dart
index 1f28925..6f93981 100644
--- a/pkg/dev_compiler/test/sourcemap/testfiles/hello_call.dart
+++ b/pkg/dev_compiler/test/sourcemap/testfiles/hello_call.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 void main() {
   /*bl*/
   /*s:1*/ foo();
diff --git a/pkg/dev_compiler/test/sourcemap/testfiles/hello_class_call.dart b/pkg/dev_compiler/test/sourcemap/testfiles/hello_class_call.dart
index 05bdd91..a1cc9fd 100644
--- a/pkg/dev_compiler/test/sourcemap/testfiles/hello_class_call.dart
+++ b/pkg/dev_compiler/test/sourcemap/testfiles/hello_class_call.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 void main() {
   /*bl*/
   var foo = Foo();
diff --git a/pkg/dev_compiler/test/sourcemap/testfiles/hello_sane_column_on_print_return_value.dart b/pkg/dev_compiler/test/sourcemap/testfiles/hello_sane_column_on_print_return_value.dart
index 2f1663c..54b020d 100644
--- a/pkg/dev_compiler/test/sourcemap/testfiles/hello_sane_column_on_print_return_value.dart
+++ b/pkg/dev_compiler/test/sourcemap/testfiles/hello_sane_column_on_print_return_value.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 void main() {
   /*bc:3*/ print(/*bc:1*/ foo());
 }
diff --git a/pkg/dev_compiler/test/sourcemap/testfiles/hello_world.dart b/pkg/dev_compiler/test/sourcemap/testfiles/hello_world.dart
index e8181f7..a034e08 100644
--- a/pkg/dev_compiler/test/sourcemap/testfiles/hello_world.dart
+++ b/pkg/dev_compiler/test/sourcemap/testfiles/hello_world.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 void main() {
   /*nb*/ // no break on empty line
   /*bl*/ print('Hello, World!');
diff --git a/pkg/dev_compiler/test/sourcemap/testfiles/method_call_with_named_parameters.dart b/pkg/dev_compiler/test/sourcemap/testfiles/method_call_with_named_parameters.dart
index 2ea7844..cbf1689 100644
--- a/pkg/dev_compiler/test/sourcemap/testfiles/method_call_with_named_parameters.dart
+++ b/pkg/dev_compiler/test/sourcemap/testfiles/method_call_with_named_parameters.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 void main() {
   foo(/*bc:1*/ bar(), baz: /*bc:2*/ baz());
   /*nbb:0:4*/
diff --git a/pkg/dev_compiler/test/sourcemap/testfiles/method_call_with_named_parameters_no_given.dart b/pkg/dev_compiler/test/sourcemap/testfiles/method_call_with_named_parameters_no_given.dart
index 4f5ee7d..a47263d 100644
--- a/pkg/dev_compiler/test/sourcemap/testfiles/method_call_with_named_parameters_no_given.dart
+++ b/pkg/dev_compiler/test/sourcemap/testfiles/method_call_with_named_parameters_no_given.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 void main() {
   foo(/*bc:1*/ bar());
   /*nbb:0:3*/
diff --git a/pkg/dev_compiler/test/sourcemap/testfiles/next_through_assert.dart b/pkg/dev_compiler/test/sourcemap/testfiles/next_through_assert.dart
index eab2e71..478deef 100644
--- a/pkg/dev_compiler/test/sourcemap/testfiles/next_through_assert.dart
+++ b/pkg/dev_compiler/test/sourcemap/testfiles/next_through_assert.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 /*Debugger:stepOver*/
 void main() {
   assert(/*bc:1*/ foo());
diff --git a/pkg/dev_compiler/test/sourcemap/testfiles/next_through_assign_call_test.dart b/pkg/dev_compiler/test/sourcemap/testfiles/next_through_assign_call_test.dart
index b46fd9a..5da999c 100644
--- a/pkg/dev_compiler/test/sourcemap/testfiles/next_through_assign_call_test.dart
+++ b/pkg/dev_compiler/test/sourcemap/testfiles/next_through_assign_call_test.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 /*Debugger:stepOver*/
 void main() {
   /*nb*/ int a;
diff --git a/pkg/dev_compiler/test/sourcemap/testfiles/next_through_assign_int_test.dart b/pkg/dev_compiler/test/sourcemap/testfiles/next_through_assign_int_test.dart
index 7a80ef3..d73151f 100644
--- a/pkg/dev_compiler/test/sourcemap/testfiles/next_through_assign_int_test.dart
+++ b/pkg/dev_compiler/test/sourcemap/testfiles/next_through_assign_int_test.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 /*Debugger:stepOver*/
 void main() {
   /*nb*/ int a;
diff --git a/pkg/dev_compiler/test/sourcemap/testfiles/next_through_catch_test.dart b/pkg/dev_compiler/test/sourcemap/testfiles/next_through_catch_test.dart
index 705a73f..93b9271 100644
--- a/pkg/dev_compiler/test/sourcemap/testfiles/next_through_catch_test.dart
+++ b/pkg/dev_compiler/test/sourcemap/testfiles/next_through_catch_test.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 /*Debugger:stepOver*/
 
 void main() {
diff --git a/pkg/dev_compiler/test/sourcemap/testfiles/next_through_for_each_loop_test.dart b/pkg/dev_compiler/test/sourcemap/testfiles/next_through_for_each_loop_test.dart
index 20c74c1..d9a8a77 100644
--- a/pkg/dev_compiler/test/sourcemap/testfiles/next_through_for_each_loop_test.dart
+++ b/pkg/dev_compiler/test/sourcemap/testfiles/next_through_for_each_loop_test.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 /*Debugger:stepOver*/
 void main() {
   /*bl*/ /*sl:1*/ var data = [1, 2, 3];
diff --git a/pkg/dev_compiler/test/sourcemap/testfiles/next_through_for_loop_with_break_and_continue_test.dart b/pkg/dev_compiler/test/sourcemap/testfiles/next_through_for_loop_with_break_and_continue_test.dart
index a3e6148..962f8fc 100644
--- a/pkg/dev_compiler/test/sourcemap/testfiles/next_through_for_loop_with_break_and_continue_test.dart
+++ b/pkg/dev_compiler/test/sourcemap/testfiles/next_through_for_loop_with_break_and_continue_test.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 /*Debugger:stepOver*/
 void main() {
   /*bl*/ /*sl:1*/ var count = 0;
diff --git a/pkg/dev_compiler/test/sourcemap/testfiles/next_through_is_and_as_test.dart b/pkg/dev_compiler/test/sourcemap/testfiles/next_through_is_and_as_test.dart
index 93c9cde..d984c0d 100644
--- a/pkg/dev_compiler/test/sourcemap/testfiles/next_through_is_and_as_test.dart
+++ b/pkg/dev_compiler/test/sourcemap/testfiles/next_through_is_and_as_test.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 /*Debugger:stepOver*/
 
 void main() {
diff --git a/pkg/dev_compiler/test/sourcemap/testfiles/next_through_map_creation.dart b/pkg/dev_compiler/test/sourcemap/testfiles/next_through_map_creation.dart
index 8d38e83..53eb14d 100644
--- a/pkg/dev_compiler/test/sourcemap/testfiles/next_through_map_creation.dart
+++ b/pkg/dev_compiler/test/sourcemap/testfiles/next_through_map_creation.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 /*Debugger:stepOver*/
 
 void main() {
diff --git a/pkg/dev_compiler/test/sourcemap/testfiles/next_through_multi_catch_test.dart b/pkg/dev_compiler/test/sourcemap/testfiles/next_through_multi_catch_test.dart
index e2990e9..57e1ce9 100644
--- a/pkg/dev_compiler/test/sourcemap/testfiles/next_through_multi_catch_test.dart
+++ b/pkg/dev_compiler/test/sourcemap/testfiles/next_through_multi_catch_test.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 /*Debugger:stepOver*/
 
 void main() {
diff --git a/pkg/dev_compiler/test/sourcemap/testfiles/next_through_operator_bracket_on_super_test.dart b/pkg/dev_compiler/test/sourcemap/testfiles/next_through_operator_bracket_on_super_test.dart
index 4bdda3d..bfd9266c 100644
--- a/pkg/dev_compiler/test/sourcemap/testfiles/next_through_operator_bracket_on_super_test.dart
+++ b/pkg/dev_compiler/test/sourcemap/testfiles/next_through_operator_bracket_on_super_test.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 /*Debugger:stepOver*/
 
 class Class2 {
diff --git a/pkg/dev_compiler/test/sourcemap/testfiles/next_through_operator_bracket_on_this_test.dart b/pkg/dev_compiler/test/sourcemap/testfiles/next_through_operator_bracket_on_this_test.dart
index 30d90f5..7fc64b2 100644
--- a/pkg/dev_compiler/test/sourcemap/testfiles/next_through_operator_bracket_on_this_test.dart
+++ b/pkg/dev_compiler/test/sourcemap/testfiles/next_through_operator_bracket_on_this_test.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 /*Debugger:stepOver*/
 
 class Class2 {
diff --git a/pkg/dev_compiler/test/sourcemap/testfiles/next_through_operator_bracket_test.dart b/pkg/dev_compiler/test/sourcemap/testfiles/next_through_operator_bracket_test.dart
index 3171aba..9351447 100644
--- a/pkg/dev_compiler/test/sourcemap/testfiles/next_through_operator_bracket_test.dart
+++ b/pkg/dev_compiler/test/sourcemap/testfiles/next_through_operator_bracket_test.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 /*Debugger:stepOver*/
 
 class Class2 {
diff --git a/pkg/dev_compiler/test/sourcemap/testfiles/next_through_static_set.dart b/pkg/dev_compiler/test/sourcemap/testfiles/next_through_static_set.dart
index 7bdd6e4..e63b7ff 100644
--- a/pkg/dev_compiler/test/sourcemap/testfiles/next_through_static_set.dart
+++ b/pkg/dev_compiler/test/sourcemap/testfiles/next_through_static_set.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 /*Debugger:stepOver*/
 
 var bar = 0;
diff --git a/pkg/dev_compiler/test/sourcemap/testfiles/next_through_string_concatenation.dart b/pkg/dev_compiler/test/sourcemap/testfiles/next_through_string_concatenation.dart
index a27ac2f..02d4137 100644
--- a/pkg/dev_compiler/test/sourcemap/testfiles/next_through_string_concatenation.dart
+++ b/pkg/dev_compiler/test/sourcemap/testfiles/next_through_string_concatenation.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 /*Debugger:stepOver*/
 
 void main() {
diff --git a/pkg/dev_compiler/test/sourcemap/testfiles/next_through_string_plus.dart b/pkg/dev_compiler/test/sourcemap/testfiles/next_through_string_plus.dart
index 3025bf2..f395f55 100644
--- a/pkg/dev_compiler/test/sourcemap/testfiles/next_through_string_plus.dart
+++ b/pkg/dev_compiler/test/sourcemap/testfiles/next_through_string_plus.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 /*Debugger:stepOver*/
 
 void main() {
diff --git a/pkg/dev_compiler/test/sourcemap/testfiles/next_through_throw.dart b/pkg/dev_compiler/test/sourcemap/testfiles/next_through_throw.dart
index d62bd94..bc00462c 100644
--- a/pkg/dev_compiler/test/sourcemap/testfiles/next_through_throw.dart
+++ b/pkg/dev_compiler/test/sourcemap/testfiles/next_through_throw.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 /*Debugger:stepOver*/
 
 void main() {
diff --git a/pkg/dev_compiler/test/sourcemap/testfiles/next_through_variable_set.dart b/pkg/dev_compiler/test/sourcemap/testfiles/next_through_variable_set.dart
index 54e362b..cce899b 100644
--- a/pkg/dev_compiler/test/sourcemap/testfiles/next_through_variable_set.dart
+++ b/pkg/dev_compiler/test/sourcemap/testfiles/next_through_variable_set.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 /*Debugger:stepOver*/
 
 void main() {
diff --git a/pkg/dev_compiler/test/sourcemap/testfiles/next_through_yield.dart b/pkg/dev_compiler/test/sourcemap/testfiles/next_through_yield.dart
index c141ab5..62694a2 100644
--- a/pkg/dev_compiler/test/sourcemap/testfiles/next_through_yield.dart
+++ b/pkg/dev_compiler/test/sourcemap/testfiles/next_through_yield.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 /*Debugger:stepOver*/
 
 void main() {
diff --git a/pkg/dev_compiler/test/sourcemap/testfiles/no_mapping_on_class_constructor_line.dart b/pkg/dev_compiler/test/sourcemap/testfiles/no_mapping_on_class_constructor_line.dart
index b5d935b..8a143f8 100644
--- a/pkg/dev_compiler/test/sourcemap/testfiles/no_mapping_on_class_constructor_line.dart
+++ b/pkg/dev_compiler/test/sourcemap/testfiles/no_mapping_on_class_constructor_line.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 void main() {
   // ignore: unused_local_variable
   var foo = Foo();
diff --git a/pkg/dev_compiler/test/sourcemap/testfiles/no_mapping_on_class_function_line.dart b/pkg/dev_compiler/test/sourcemap/testfiles/no_mapping_on_class_function_line.dart
index 8b3b281..5c2966b 100644
--- a/pkg/dev_compiler/test/sourcemap/testfiles/no_mapping_on_class_function_line.dart
+++ b/pkg/dev_compiler/test/sourcemap/testfiles/no_mapping_on_class_function_line.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 void main() {
   var foo = Foo();
   foo.foo();
diff --git a/pkg/dev_compiler/test/sourcemap/testfiles/no_mapping_on_class_line.dart b/pkg/dev_compiler/test/sourcemap/testfiles/no_mapping_on_class_line.dart
index f7943d6..92781ce 100644
--- a/pkg/dev_compiler/test/sourcemap/testfiles/no_mapping_on_class_line.dart
+++ b/pkg/dev_compiler/test/sourcemap/testfiles/no_mapping_on_class_line.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 void main() {
   var foo = Foo();
   foo.foo();
diff --git a/pkg/dev_compiler/test/sourcemap/testfiles/no_mapping_on_class_named_constructor_line.dart b/pkg/dev_compiler/test/sourcemap/testfiles/no_mapping_on_class_named_constructor_line.dart
index 9c71302..75e9030 100644
--- a/pkg/dev_compiler/test/sourcemap/testfiles/no_mapping_on_class_named_constructor_line.dart
+++ b/pkg/dev_compiler/test/sourcemap/testfiles/no_mapping_on_class_named_constructor_line.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 void main() {
   // ignore: unused_local_variable
   var foo = Foo.named();
diff --git a/pkg/dev_compiler/test/sourcemap/testfiles/no_mapping_on_function_line.dart b/pkg/dev_compiler/test/sourcemap/testfiles/no_mapping_on_function_line.dart
index 4683e61..eedeb22 100644
--- a/pkg/dev_compiler/test/sourcemap/testfiles/no_mapping_on_function_line.dart
+++ b/pkg/dev_compiler/test/sourcemap/testfiles/no_mapping_on_function_line.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 /*nm*/
 void main() {
   foo();
diff --git a/pkg/dev_compiler/test/sourcemap/testfiles/printing_class_fields.dart b/pkg/dev_compiler/test/sourcemap/testfiles/printing_class_fields.dart
index 58fe7ef..cf27263 100644
--- a/pkg/dev_compiler/test/sourcemap/testfiles/printing_class_fields.dart
+++ b/pkg/dev_compiler/test/sourcemap/testfiles/printing_class_fields.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 /*Debugger:stepOver*/
 void main() {
   /*bl*/
diff --git a/pkg/dev_compiler/test/sourcemap/testfiles/printing_class_fields_step_into.dart b/pkg/dev_compiler/test/sourcemap/testfiles/printing_class_fields_step_into.dart
index 2b7406d..1508da9 100644
--- a/pkg/dev_compiler/test/sourcemap/testfiles/printing_class_fields_step_into.dart
+++ b/pkg/dev_compiler/test/sourcemap/testfiles/printing_class_fields_step_into.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 /*nb*/
 void main() {
   /*bl*/
diff --git a/pkg/dev_compiler/test/sourcemap/testfiles/step_through_async_star_yield.dart b/pkg/dev_compiler/test/sourcemap/testfiles/step_through_async_star_yield.dart
index cef8d5a..82e0be2 100644
--- a/pkg/dev_compiler/test/sourcemap/testfiles/step_through_async_star_yield.dart
+++ b/pkg/dev_compiler/test/sourcemap/testfiles/step_through_async_star_yield.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 void main() async {
   await for (var i in foobar()) {
     print(i);
diff --git a/pkg/dev_compiler/test/sourcemap/testfiles/step_through_await_for.dart b/pkg/dev_compiler/test/sourcemap/testfiles/step_through_await_for.dart
index 20fc828..1dd6548 100644
--- a/pkg/dev_compiler/test/sourcemap/testfiles/step_through_await_for.dart
+++ b/pkg/dev_compiler/test/sourcemap/testfiles/step_through_await_for.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 void main() async {
   /* bl */
   /*sl:1 */ print('About to loop!');
diff --git a/pkg/dev_compiler/test/sourcemap/testfiles/step_through_conditional_expression.dart b/pkg/dev_compiler/test/sourcemap/testfiles/step_through_conditional_expression.dart
index 519529c..fc19ec0 100644
--- a/pkg/dev_compiler/test/sourcemap/testfiles/step_through_conditional_expression.dart
+++ b/pkg/dev_compiler/test/sourcemap/testfiles/step_through_conditional_expression.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 /*Debugger:stepOver*/
 
 void main() {
diff --git a/pkg/dev_compiler/test/sourcemap/testfiles/step_through_if_and_identical.dart b/pkg/dev_compiler/test/sourcemap/testfiles/step_through_if_and_identical.dart
index 33e7273..0e57fda 100644
--- a/pkg/dev_compiler/test/sourcemap/testfiles/step_through_if_and_identical.dart
+++ b/pkg/dev_compiler/test/sourcemap/testfiles/step_through_if_and_identical.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 /*Debugger:stepOver*/
 
 void main() {
diff --git a/pkg/dev_compiler/test/sourcemap/testfiles/step_through_property_get_test.dart b/pkg/dev_compiler/test/sourcemap/testfiles/step_through_property_get_test.dart
index 4bec5db..2e5bcad 100644
--- a/pkg/dev_compiler/test/sourcemap/testfiles/step_through_property_get_test.dart
+++ b/pkg/dev_compiler/test/sourcemap/testfiles/step_through_property_get_test.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 void main() {
   var bar = Bar();
   bar.doStuff();
diff --git a/pkg/dev_compiler/test/sourcemap/testfiles/step_through_sync_star.dart b/pkg/dev_compiler/test/sourcemap/testfiles/step_through_sync_star.dart
index 4ce057b..2aaec15 100644
--- a/pkg/dev_compiler/test/sourcemap/testfiles/step_through_sync_star.dart
+++ b/pkg/dev_compiler/test/sourcemap/testfiles/step_through_sync_star.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 void main() {
   /* bl */
   /*sl:1*/ var iterator = naturalsTo(2);
diff --git a/pkg/dev_compiler/test/sourcemap/testfiles/stops_at_ending_brace.dart b/pkg/dev_compiler/test/sourcemap/testfiles/stops_at_ending_brace.dart
index d322e4c..0e1347d 100644
--- a/pkg/dev_compiler/test/sourcemap/testfiles/stops_at_ending_brace.dart
+++ b/pkg/dev_compiler/test/sourcemap/testfiles/stops_at_ending_brace.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 void main() {
   Foo();
   // Comment to push the ending brace back a bit.
diff --git a/pkg/dev_compiler/test/string_to_uri_test.dart b/pkg/dev_compiler/test/string_to_uri_test.dart
index bac3637..bfd74be 100755
--- a/pkg/dev_compiler/test/string_to_uri_test.dart
+++ b/pkg/dev_compiler/test/string_to_uri_test.dart
@@ -1,3 +1,5 @@
+// @dart = 2.9
+
 import 'dart:io';
 import 'package:dev_compiler/src/compiler/shared_command.dart';
 import 'package:test/test.dart';
diff --git a/pkg/dev_compiler/test/testing.dart b/pkg/dev_compiler/test/testing.dart
index 2f178d1..136b993 100644
--- a/pkg/dev_compiler/test/testing.dart
+++ b/pkg/dev_compiler/test/testing.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 library dev_compiler.src.testing;
 
 import 'dart:mirrors';
diff --git a/pkg/dev_compiler/test/worker/worker_test.dart b/pkg/dev_compiler/test/worker/worker_test.dart
index 4a650da..916f797 100644
--- a/pkg/dev_compiler/test/worker/worker_test.dart
+++ b/pkg/dev_compiler/test/worker/worker_test.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 import 'dart:async';
 import 'dart:convert';
 import 'dart:io';
diff --git a/pkg/dev_compiler/tool/check_nnbd_sdk.dart b/pkg/dev_compiler/tool/check_nnbd_sdk.dart
index 01eddae..80ba657 100644
--- a/pkg/dev_compiler/tool/check_nnbd_sdk.dart
+++ b/pkg/dev_compiler/tool/check_nnbd_sdk.dart
@@ -3,6 +3,8 @@
 // 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.
 
+// @dart = 2.9
+
 /// Command-line tool that runs dartanalyzer on a sdk under the perspective of
 /// one tool.
 // TODO(sigmund): generalize this to support other tools, not just ddc.
diff --git a/pkg/dev_compiler/tool/compile_dartdevc_sdk.dart b/pkg/dev_compiler/tool/compile_dartdevc_sdk.dart
index f24c12e..2fcc44e 100644
--- a/pkg/dev_compiler/tool/compile_dartdevc_sdk.dart
+++ b/pkg/dev_compiler/tool/compile_dartdevc_sdk.dart
@@ -3,6 +3,8 @@
 // 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.
 
+// @dart = 2.9
+
 /// Tool that consumes the .dill file of an entire dart-sdk and produces the
 /// corresponding Javascript module.
 
diff --git a/pkg/dev_compiler/tool/dartdevc_nnbd_sdk_error_golden.txt b/pkg/dev_compiler/tool/dartdevc_nnbd_sdk_error_golden.txt
index b77ed3f..39bf88b 100644
--- a/pkg/dev_compiler/tool/dartdevc_nnbd_sdk_error_golden.txt
+++ b/pkg/dev_compiler/tool/dartdevc_nnbd_sdk_error_golden.txt
@@ -1,11 +1,11 @@
-ERROR|COMPILE_TIME_ERROR|CONST_CONSTRUCTOR_THROWS_EXCEPTION|lib/core/core.dart|3725|5|94|Const constructors can't throw exceptions.
-ERROR|COMPILE_TIME_ERROR|CONST_CONSTRUCTOR_THROWS_EXCEPTION|lib/core/core.dart|7913|5|97|Const constructors can't throw exceptions.
-ERROR|COMPILE_TIME_ERROR|CONST_CONSTRUCTOR_THROWS_EXCEPTION|lib/core/core.dart|939|5|95|Const constructors can't throw exceptions.
-ERROR|COMPILE_TIME_ERROR|CONST_CONSTRUCTOR_THROWS_EXCEPTION|lib/core/core.dart|972|5|94|Const constructors can't throw exceptions.
-ERROR|COMPILE_TIME_ERROR|INVALID_ASSIGNMENT|lib/_internal/js_dev_runtime/private/interceptors.dart|1348|18|27|A value of type 'double' can't be assigned to a variable of type 'int'.
-ERROR|COMPILE_TIME_ERROR|RETURN_OF_INVALID_TYPE|lib/_internal/js_dev_runtime/private/interceptors.dart|1215|14|38|A value of type 'double' can't be returned from method '%' because it has a return type of 'JSNumber'.
-ERROR|COMPILE_TIME_ERROR|RETURN_OF_INVALID_TYPE|lib/_internal/js_dev_runtime/private/interceptors.dart|1217|14|38|A value of type 'double' can't be returned from method '%' because it has a return type of 'JSNumber'.
-ERROR|SYNTACTIC_ERROR|CONST_FACTORY|lib/core/core.dart|3723|3|5|Only redirecting factory constructors can be declared to be 'const'.
-ERROR|SYNTACTIC_ERROR|CONST_FACTORY|lib/core/core.dart|7911|3|5|Only redirecting factory constructors can be declared to be 'const'.
-ERROR|SYNTACTIC_ERROR|CONST_FACTORY|lib/core/core.dart|937|3|5|Only redirecting factory constructors can be declared to be 'const'.
-ERROR|SYNTACTIC_ERROR|CONST_FACTORY|lib/core/core.dart|970|3|5|Only redirecting factory constructors can be declared to be 'const'.
+ERROR|COMPILE_TIME_ERROR|CONST_CONSTRUCTOR_THROWS_EXCEPTION|lib/core/core.dart|3679|5|94|Const constructors can't throw exceptions.
+ERROR|COMPILE_TIME_ERROR|CONST_CONSTRUCTOR_THROWS_EXCEPTION|lib/core/core.dart|7880|5|97|Const constructors can't throw exceptions.
+ERROR|COMPILE_TIME_ERROR|CONST_CONSTRUCTOR_THROWS_EXCEPTION|lib/core/core.dart|893|5|95|Const constructors can't throw exceptions.
+ERROR|COMPILE_TIME_ERROR|CONST_CONSTRUCTOR_THROWS_EXCEPTION|lib/core/core.dart|926|5|94|Const constructors can't throw exceptions.
+ERROR|COMPILE_TIME_ERROR|INVALID_ASSIGNMENT|lib/_internal/js_dev_runtime/private/interceptors.dart|1358|18|27|A value of type 'double' can't be assigned to a variable of type 'int'.
+ERROR|COMPILE_TIME_ERROR|RETURN_OF_INVALID_TYPE|lib/_internal/js_dev_runtime/private/interceptors.dart|1225|14|38|A value of type 'double' can't be returned from method '%' because it has a return type of 'JSNumber'.
+ERROR|COMPILE_TIME_ERROR|RETURN_OF_INVALID_TYPE|lib/_internal/js_dev_runtime/private/interceptors.dart|1227|14|38|A value of type 'double' can't be returned from method '%' because it has a return type of 'JSNumber'.
+ERROR|SYNTACTIC_ERROR|CONST_FACTORY|lib/core/core.dart|3677|3|5|Only redirecting factory constructors can be declared to be 'const'.
+ERROR|SYNTACTIC_ERROR|CONST_FACTORY|lib/core/core.dart|7878|3|5|Only redirecting factory constructors can be declared to be 'const'.
+ERROR|SYNTACTIC_ERROR|CONST_FACTORY|lib/core/core.dart|891|3|5|Only redirecting factory constructors can be declared to be 'const'.
+ERROR|SYNTACTIC_ERROR|CONST_FACTORY|lib/core/core.dart|924|3|5|Only redirecting factory constructors can be declared to be 'const'.
diff --git a/pkg/dev_compiler/tool/ddb b/pkg/dev_compiler/tool/ddb
index 302aa18..65888a8 100755
--- a/pkg/dev_compiler/tool/ddb
+++ b/pkg/dev_compiler/tool/ddb
@@ -3,6 +3,8 @@
 // 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.
 
+// @dart = 2.9
+
 //
 // Compiles code with DDC and runs the resulting code with either node or
 // chrome.
@@ -207,7 +209,7 @@
       break;
     case 'd8':
       d8 = true;
-      mod = 'es6';
+      mod = 'legacy';
       break;
     case 'chrome':
       chrome = true;
@@ -215,24 +217,14 @@
       break;
   }
 
-  String ddcSdk;
-  String sdkJsPath;
-  String requirePath;
+  var sdkRoot = p.dirname(p.dirname(ddcPath));
+  var buildDir =
+      p.join(sdkRoot, Platform.isMacOS ? 'xcodebuild' : 'out', 'ReleaseX64');
+  var requirePath = p.join(sdkRoot, 'third_party', 'requirejs');
+  var sdkOutlineDill = p.join(buildDir,
+      soundNullSafety ? 'ddc_outline_sound.dill' : 'ddc_outline.dill');
   var suffix = soundNullSafety ? p.join('sound', mod) : p.join('kernel', mod);
-  if (debug) {
-    var sdkRoot = p.dirname(p.dirname(ddcPath));
-    var buildDir =
-        p.join(sdkRoot, Platform.isMacOS ? 'xcodebuild' : 'out', 'ReleaseX64');
-    dartSdk = p.join(buildDir, 'dart-sdk');
-    ddcSdk = p.join(buildDir,
-        soundNullSafety ? 'ddc_outline_sound.dill' : 'ddc_outline.dill');
-    sdkJsPath = p.join(buildDir, 'gen', 'utils', 'dartdevc', suffix);
-    requirePath = p.join(sdkRoot, 'third_party', 'requirejs');
-  } else {
-    ddcSdk = p.join(dartSdk, 'lib', '_internal', 'ddc_sdk.dill');
-    sdkJsPath = p.join(dartSdk, 'lib', 'dev_compiler', suffix);
-    requirePath = sdkJsPath;
-  }
+  var sdkJsPath = p.join(buildDir, 'gen', 'utils', 'dartdevc', suffix);
 
   // Print an initial empty line to separate the invocation from the output.
   if (verbose) {
@@ -243,7 +235,7 @@
     var ddcArgs = [
       if (summarizeText) '--summarize-text',
       '--modules=$mod',
-      '--dart-sdk-summary=$ddcSdk',
+      '--dart-sdk-summary=$sdkOutlineDill',
       for (var summary in summaries) '--summary=$summary',
       for (var experiment in experiments) '--enable-experiment=$experiment',
       if (soundNullSafety) '--sound-null-safety',
@@ -350,18 +342,19 @@
       jsFile.writeAsStringSync(jsContents);
 
       var runjs = '''
-import { dart, _isolate_helper } from '$sdkJsPath/dart_sdk.js';
-import { $libname } from '$basename.js';
+load("$ddcPath/lib/js/legacy/dart_library.js");
+load("$sdkJsPath/dart_sdk.js");
+load("$out");
+
+let dart_sdk = dart_library.import('dart_sdk');
 // Create a self reference for JS interop tests that set fields on self.
-dart.global.self = dart.global;
-let main = $libname.main;
+dart_sdk.dart.global.self = dart_sdk.dart.global;
 if ($nnbd) {
-  dart.weakNullSafetyWarnings(!$soundNullSafety);
-  dart.nonNullAsserts($nonNullAsserts);
-  dart.nativeNonNullAsserts($nativeNonNullAsserts);
+  dart_sdk.dart.weakNullSafetyWarnings(!$soundNullSafety);
+  dart_sdk.dart.nonNullAsserts($nonNullAsserts);
+  dart_sdk.dart.nativeNonNullAsserts($nativeNonNullAsserts);
 }
-_isolate_helper.startRootIsolate(() => {}, []);
-main([]);
+dart_library.start('$basename', '$libname');
 ''';
       var d8File = p.setExtension(out, '.d8.js');
       File(d8File).writeAsStringSync(runjs);
diff --git a/pkg/dev_compiler/tool/kernel_sdk.dart b/pkg/dev_compiler/tool/kernel_sdk.dart
index dda7022..64ace35 100755
--- a/pkg/dev_compiler/tool/kernel_sdk.dart
+++ b/pkg/dev_compiler/tool/kernel_sdk.dart
@@ -3,6 +3,8 @@
 // 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.
 
+// @dart = 2.9
+
 import 'dart:async';
 import 'dart:convert' show json;
 import 'dart:io';
diff --git a/pkg/dev_compiler/tool/patch_sdk.dart b/pkg/dev_compiler/tool/patch_sdk.dart
index 143935f..dd83595 100755
--- a/pkg/dev_compiler/tool/patch_sdk.dart
+++ b/pkg/dev_compiler/tool/patch_sdk.dart
@@ -3,6 +3,8 @@
 // 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.
 
+// @dart = 2.9
+
 /// Command line tool to merge the SDK libraries and our patch files.
 /// This is currently designed as an offline tool, but we could automate it.
 
diff --git a/pkg/dev_compiler/web/source_map_stack_trace.dart b/pkg/dev_compiler/web/source_map_stack_trace.dart
index 4617b80..aa9eaa6 100644
--- a/pkg/dev_compiler/web/source_map_stack_trace.dart
+++ b/pkg/dev_compiler/web/source_map_stack_trace.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 import 'package:path/path.dart' as p;
 import 'package:source_maps/source_maps.dart';
 import 'package:stack_trace/stack_trace.dart';
diff --git a/pkg/dev_compiler/web/stack_trace_mapper.dart b/pkg/dev_compiler/web/stack_trace_mapper.dart
index a4daaa9..51df77d 100644
--- a/pkg/dev_compiler/web/stack_trace_mapper.dart
+++ b/pkg/dev_compiler/web/stack_trace_mapper.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 /// Standalone utility that manages loading source maps for all Dart scripts
 /// on the page compiled with DDC.
 ///
diff --git a/pkg/expect/lib/expect.dart b/pkg/expect/lib/expect.dart
index 6e6b8e6..a030354 100644
--- a/pkg/expect/lib/expect.dart
+++ b/pkg/expect/lib/expect.dart
@@ -10,11 +10,11 @@
 
 import 'package:meta/meta.dart';
 
-/// Whether the program is running with weak null safety checking.
-bool get isWeakMode => const <Null>[] is List<Object>;
+/// Whether the program is running without sound null safety.
+bool get hasUnsoundNullSafety => const <Null>[] is List<Object>;
 
-/// Whether the program is running with strong null safety checking.
-bool get isStrongMode => !isWeakMode;
+/// Whether the program is running with sound null safety.
+bool get hasSoundNullSafety => !hasUnsoundNullSafety;
 
 /**
  * Expect is used for tests that do not want to make use of the
@@ -620,11 +620,11 @@
 
   /// Checks that [f] throws an appropriate error on a null argument.
   ///
-  /// In strong mode, this is expected to be a [TypeError] when casting the
-  /// `null` to some non-nullable type. In weak mode, that cast is ignored and
-  /// some later explicit validation should handle it and [ArgumentError].
+  /// With sound null safety, this is expected to be a [TypeError] when casting
+  /// the `null` to some non-nullable type. In weak mode, that cast is ignored
+  /// and some later explicit validation should handle it and [ArgumentError].
   static void throwsNullCheckError(void f()) {
-    if (isStrongMode) {
+    if (hasSoundNullSafety) {
       throwsTypeError(f);
     } else {
       throwsArgumentError(f);
diff --git a/pkg/expect/pubspec.yaml b/pkg/expect/pubspec.yaml
index 60226bb..b1b5bd1 100644
--- a/pkg/expect/pubspec.yaml
+++ b/pkg/expect/pubspec.yaml
@@ -1,11 +1,15 @@
 name: expect
 # This package is not intended for consumption on pub.dev. DO NOT publish.
 publish_to: none
-description: >
+description: >-
  Expect is used for tests that do not want to make use of the
  Dart unit test library - for example, the core language tests.
  Third parties are discouraged from using this, and should use
  the expect() function in the unit test library instead for
  test assertions.
+
+environment:
+  sdk: '>=2.0.0'
+
 dependencies:
   meta: any
diff --git a/pkg/expect/test/nnbd_mode_test.dart b/pkg/expect/test/nnbd_mode_test.dart
index 47fb624..35dd345 100644
--- a/pkg/expect/test/nnbd_mode_test.dart
+++ b/pkg/expect/test/nnbd_mode_test.dart
@@ -14,6 +14,6 @@
 }();
 
 void main() {
-  Expect.equals(strong, isStrongMode);
-  Expect.equals(!strong, isWeakMode);
+  Expect.equals(strong, hasSoundNullSafety);
+  Expect.equals(!strong, hasUnsoundNullSafety);
 }
diff --git a/pkg/front_end/analysis_options_no_lints.yaml b/pkg/front_end/analysis_options_no_lints.yaml
index 6bbd1ac..25f50ec 100644
--- a/pkg/front_end/analysis_options_no_lints.yaml
+++ b/pkg/front_end/analysis_options_no_lints.yaml
@@ -4,16 +4,17 @@
 
 analyzer:
   exclude:
-    - test/analyser_ignored/**
-    - test/extensions/data/**
     - parser_testcases/**
-    - testcases/**
+    - test/analyser_ignored/**
+    - test/enable_non_nullable/data/**
+    - test/extensions/data/**
     - test/id_testing/data/**
     - test/language_versioning/data/**
     - test/patching/data/**
     - test/predicates/data/**
     - test/static_types/data/**
     - test/text_representation/data/**
+    - testcases/**
   errors:
     # Allow having TODOs in the code
     todo: ignore
diff --git a/pkg/front_end/lib/src/api_prototype/compiler_options.dart b/pkg/front_end/lib/src/api_prototype/compiler_options.dart
index 23cf4a1..4b517ca 100644
--- a/pkg/front_end/lib/src/api_prototype/compiler_options.dart
+++ b/pkg/front_end/lib/src/api_prototype/compiler_options.dart
@@ -24,6 +24,12 @@
         expiredExperimentalFlags,
         parseExperimentalFlag;
 
+import 'experimental_flags.dart' as flags
+    show
+        getExperimentEnabledVersionInLibrary,
+        isExperimentEnabled,
+        isExperimentEnabledInLibrary;
+
 import 'file_system.dart' show FileSystem;
 
 import 'standard_file_system.dart' show StandardFileSystem;
@@ -130,8 +136,10 @@
   /// Enable or disable experimental features. Features mapping to `true` are
   /// explicitly enabled. Features mapping to `false` are explicitly disabled.
   /// Features not mentioned in the map will have their default value.
-  Map<ExperimentalFlag, bool> experimentalFlags = <ExperimentalFlag, bool>{};
+  Map<ExperimentalFlag, bool> explicitExperimentalFlags =
+      <ExperimentalFlag, bool>{};
 
+  Map<ExperimentalFlag, bool> defaultExperimentFlagsForTesting;
   AllowedExperimentalFlags allowedExperimentalFlagsForTesting;
   Map<ExperimentalFlag, Version> experimentEnabledVersionForTesting;
   Map<ExperimentalFlag, Version> experimentReleasedVersionForTesting;
@@ -180,6 +188,9 @@
   /// Errors are reported via the [onDiagnostic] callback.
   bool verify = false;
 
+  /// Whether to - if verifying - skip the platform.
+  bool verifySkipPlatform = false;
+
   /// Whether to dump generated components in a text format (also mainly for
   /// debugging).
   ///
@@ -223,9 +234,6 @@
   /// diagnostic, but do not stop the compilation.
   int skipForDebugging = 0;
 
-  /// Whether to generate bytecode.
-  bool bytecode = false;
-
   /// Whether to write a file (e.g. a dill file) when reporting a crash.
   bool writeFileOnCrashReport = true;
 
@@ -248,6 +256,36 @@
   /// compiling the platform dill.
   bool emitDeps = true;
 
+  bool isExperimentEnabledByDefault(ExperimentalFlag flag) {
+    return flags.isExperimentEnabled(flag,
+        defaultExperimentFlagsForTesting: defaultExperimentFlagsForTesting);
+  }
+
+  /// Returns
+  bool isExperimentEnabled(ExperimentalFlag flag) {
+    return flags.isExperimentEnabled(flag,
+        explicitExperimentalFlags: explicitExperimentalFlags,
+        defaultExperimentFlagsForTesting: defaultExperimentFlagsForTesting);
+  }
+
+  bool isExperimentEnabledInLibrary(ExperimentalFlag flag, Uri importUri) {
+    return flags.isExperimentEnabledInLibrary(flag, importUri,
+        defaultExperimentFlagsForTesting: defaultExperimentFlagsForTesting,
+        explicitExperimentalFlags: explicitExperimentalFlags,
+        allowedExperimentalFlags: allowedExperimentalFlagsForTesting);
+  }
+
+  Version getExperimentEnabledVersionInLibrary(
+      ExperimentalFlag flag, Uri importUri) {
+    return flags.getExperimentEnabledVersionInLibrary(
+        flag, importUri, explicitExperimentalFlags,
+        defaultExperimentFlagsForTesting: defaultExperimentFlagsForTesting,
+        allowedExperimentalFlags: allowedExperimentalFlagsForTesting,
+        experimentEnabledVersionForTesting: experimentEnabledVersionForTesting,
+        experimentReleasedVersionForTesting:
+            experimentReleasedVersionForTesting);
+  }
+
   bool equivalent(CompilerOptions other,
       {bool ignoreOnDiagnostic: true,
       bool ignoreVerbose: true,
@@ -268,7 +306,10 @@
     if (compileSdk != compileSdk) return false;
     // chaseDependencies aren't used anywhere, so ignored here.
     // targetPatches aren't used anywhere, so ignored here.
-    if (!equalMaps(experimentalFlags, other.experimentalFlags)) return false;
+    if (!equalMaps(
+        explicitExperimentalFlags, other.explicitExperimentalFlags)) {
+      return false;
+    }
     if (!equalMaps(environmentDefines, other.environmentDefines)) return false;
     if (errorOnUnevaluatedConstant != other.errorOnUnevaluatedConstant) {
       return false;
@@ -284,6 +325,7 @@
     }
     if (!ignoreVerify) {
       if (verify != other.verify) return false;
+      if (verifySkipPlatform != other.verifySkipPlatform) return false;
     }
     if (!ignoreDebugDump) {
       if (debugDump != other.debugDump) return false;
@@ -298,7 +340,6 @@
       return false;
     }
     if (skipForDebugging != other.skipForDebugging) return false;
-    if (bytecode != other.bytecode) return false;
     if (writeFileOnCrashReport != other.writeFileOnCrashReport) return false;
     if (nnbdMode != other.nnbdMode) return false;
     if (currentSdkVersion != other.currentSdkVersion) return false;
@@ -327,9 +368,7 @@
 }
 
 /// Parse a map of experimental flags to values that can be passed to
-/// [CompilerOptions.experimentalFlags].
-/// The returned map is normalized to contain default values for unmentioned
-/// flags.
+/// [CompilerOptions.explicitExperimentalFlags].
 ///
 /// If an unknown flag is mentioned, or a flag is mentioned more than once,
 /// the supplied error handler is called with an error message.
@@ -390,10 +429,5 @@
       }
     }
   }
-  for (ExperimentalFlag flag in ExperimentalFlag.values) {
-    assert(defaultExperimentalFlags.containsKey(flag),
-        "No default value for $flag.");
-    flags[flag] ??= defaultExperimentalFlags[flag];
-  }
   return flags;
 }
diff --git a/pkg/front_end/lib/src/api_prototype/experimental_flags.dart b/pkg/front_end/lib/src/api_prototype/experimental_flags.dart
index 582b79e..d0057f7 100644
--- a/pkg/front_end/lib/src/api_prototype/experimental_flags.dart
+++ b/pkg/front_end/lib/src/api_prototype/experimental_flags.dart
@@ -42,15 +42,17 @@
   }
 }
 
-/// Returns `true` if [flag] is enabled using global [experimentalFlags].
+/// Returns `true` if [flag] is enabled either by default or through
+/// [explicitExperimentalFlags].
 ///
-/// If [experimentalFlags] is `null` or doesn't contain [flag], the default
-/// value from [defaultExperimentalFlags] is returned.
+/// If [explicitExperimentalFlags] is `null` or doesn't contain [flag], the
+/// default value from [defaultExperimentalFlags] is returned.
 ///
 /// If [flag] is marked as expired in [expiredExperimentalFlags], the value from
 /// [defaultExperimentalFlags] is always returned.
 bool isExperimentEnabled(ExperimentalFlag flag,
-    {Map<ExperimentalFlag, bool> experimentalFlags}) {
+    {Map<ExperimentalFlag, bool> explicitExperimentalFlags,
+    Map<ExperimentalFlag, bool> defaultExperimentFlagsForTesting}) {
   assert(defaultExperimentalFlags.containsKey(flag),
       "No default value for $flag.");
   assert(expiredExperimentalFlags.containsKey(flag),
@@ -59,19 +61,22 @@
     return defaultExperimentalFlags[flag];
   }
   bool enabled;
-  if (experimentalFlags != null) {
-    enabled = experimentalFlags[flag];
+  if (explicitExperimentalFlags != null) {
+    enabled = explicitExperimentalFlags[flag];
+  }
+  if (defaultExperimentFlagsForTesting != null) {
+    enabled ??= defaultExperimentFlagsForTesting[flag];
   }
   enabled ??= defaultExperimentalFlags[flag];
   return enabled;
 }
 
 /// Returns `true` if [flag] is enabled in the library with the [canonicalUri]
-/// either globally using [experimentalFlags] or per library using
+/// either globally using [explicitExperimentalFlags] or per library using
 /// [allowedExperimentalFlags].
 ///
-/// If [experimentalFlags] is `null` or doesn't contain [flag], the default
-/// value from [defaultExperimentalFlags] used as the global flag state.
+/// If [explicitExperimentalFlags] is `null` or doesn't contain [flag], the
+/// default value from [defaultExperimentalFlags] used as the global flag state.
 ///
 /// If [allowedExperimentalFlags] is `null` [defaultAllowedExperimentalFlags] is
 /// used for the per library flag state.
@@ -83,7 +88,8 @@
 /// defines the identity of a library, for instance `dart:core`, `package:foo`,
 /// or `file:///path/dir/file.dart`.
 bool isExperimentEnabledInLibrary(ExperimentalFlag flag, Uri canonicalUri,
-    {Map<ExperimentalFlag, bool> experimentalFlags,
+    {Map<ExperimentalFlag, bool> defaultExperimentFlagsForTesting,
+    Map<ExperimentalFlag, bool> explicitExperimentalFlags,
     AllowedExperimentalFlags allowedExperimentalFlags}) {
   assert(defaultExperimentalFlags.containsKey(flag),
       "No default value for $flag.");
@@ -93,8 +99,11 @@
     return defaultExperimentalFlags[flag];
   }
   bool enabled;
-  if (experimentalFlags != null) {
-    enabled = experimentalFlags[flag];
+  if (explicitExperimentalFlags != null) {
+    enabled = explicitExperimentalFlags[flag];
+  }
+  if (defaultExperimentFlagsForTesting != null) {
+    enabled ??= defaultExperimentFlagsForTesting[flag];
   }
   enabled ??= defaultExperimentalFlags[flag];
   if (!enabled) {
@@ -119,13 +128,55 @@
   return enabled;
 }
 
-Version getExperimentEnabledVersion(ExperimentalFlag flag,
-    {Map<ExperimentalFlag, Version> experimentReleasedVersionForTesting}) {
-  Version version;
-  if (experimentReleasedVersionForTesting != null) {
-    version = experimentReleasedVersionForTesting[flag];
+/// Returns the version in which [flag] is enabled for the library with the
+/// [canonicalUri].
+Version getExperimentEnabledVersionInLibrary(ExperimentalFlag flag,
+    Uri canonicalUri, Map<ExperimentalFlag, bool> explicitExperimentalFlags,
+    {AllowedExperimentalFlags allowedExperimentalFlags,
+    Map<ExperimentalFlag, bool> defaultExperimentFlagsForTesting,
+    Map<ExperimentalFlag, Version> experimentEnabledVersionForTesting,
+    Map<ExperimentalFlag, Version> experimentReleasedVersionForTesting}) {
+  allowedExperimentalFlags ??= defaultAllowedExperimentalFlags;
+
+  Set<ExperimentalFlag> allowedFlags;
+  if (canonicalUri.scheme == 'dart') {
+    allowedFlags = allowedExperimentalFlags.forSdkLibrary(canonicalUri.path);
+  } else if (canonicalUri.scheme == 'package') {
+    int index = canonicalUri.path.indexOf('/');
+    String packageName;
+    if (index >= 0) {
+      packageName = canonicalUri.path.substring(0, index);
+    } else {
+      packageName = canonicalUri.path;
+    }
+    allowedFlags = allowedExperimentalFlags.forPackage(packageName);
   }
-  version ??= experimentReleasedVersion[flag];
-  assert(version != null, "No version for enabling $flag.");
+  Version version;
+  bool enabledByDefault;
+  if (defaultExperimentFlagsForTesting != null) {
+    enabledByDefault = defaultExperimentFlagsForTesting[flag];
+  }
+  enabledByDefault ??= defaultExperimentalFlags[flag];
+
+  bool enabledExplicitly = explicitExperimentalFlags[flag] ?? false;
+
+  if (!enabledByDefault ||
+      enabledExplicitly ||
+      (allowedFlags != null && allowedFlags.contains(flag))) {
+    // If the feature is not enabled by default or is enabled by the allowed
+    // list use the experiment release version.
+    if (experimentReleasedVersionForTesting != null) {
+      version = experimentReleasedVersionForTesting[flag];
+    }
+    version ??= experimentReleasedVersion[flag];
+  } else {
+    // If the feature is enabled by default and is not enabled by the allowed
+    // list use the enabled version.
+    if (experimentEnabledVersionForTesting != null) {
+      version = experimentEnabledVersionForTesting[flag];
+    }
+    version ??= experimentEnabledVersion[flag];
+  }
+  assert(version != null, "No version for enabling $flag in $canonicalUri.");
   return version;
 }
diff --git a/pkg/front_end/lib/src/api_prototype/experimental_flags_generated.dart b/pkg/front_end/lib/src/api_prototype/experimental_flags_generated.dart
index c3b0dc7..9be22af 100644
--- a/pkg/front_end/lib/src/api_prototype/experimental_flags_generated.dart
+++ b/pkg/front_end/lib/src/api_prototype/experimental_flags_generated.dart
@@ -24,17 +24,17 @@
 }
 
 const Version enableAlternativeInvalidationStrategyVersion =
-    const Version(2, 11);
+    const Version(2, 12);
 const Version enableConstantUpdate2018Version = const Version(2, 0);
 const Version enableControlFlowCollectionsVersion = const Version(2, 0);
 const Version enableExtensionMethodsVersion = const Version(2, 6);
-const Version enableNonNullableVersion = const Version(2, 11);
-const Version enableNonfunctionTypeAliasesVersion = const Version(2, 11);
+const Version enableNonNullableVersion = const Version(2, 12);
+const Version enableNonfunctionTypeAliasesVersion = const Version(2, 12);
 const Version enableSetLiteralsVersion = const Version(2, 0);
 const Version enableSpreadCollectionsVersion = const Version(2, 0);
-const Version enableTripleShiftVersion = const Version(2, 11);
-const Version enableValueClassVersion = const Version(2, 11);
-const Version enableVarianceVersion = const Version(2, 11);
+const Version enableTripleShiftVersion = const Version(2, 12);
+const Version enableValueClassVersion = const Version(2, 12);
+const Version enableVarianceVersion = const Version(2, 12);
 
 ExperimentalFlag parseExperimentalFlag(String flag) {
   switch (flag) {
@@ -69,7 +69,7 @@
   ExperimentalFlag.constantUpdate2018: true,
   ExperimentalFlag.controlFlowCollections: true,
   ExperimentalFlag.extensionMethods: true,
-  ExperimentalFlag.nonNullable: false,
+  ExperimentalFlag.nonNullable: true,
   ExperimentalFlag.nonfunctionTypeAliases: false,
   ExperimentalFlag.setLiterals: true,
   ExperimentalFlag.spreadCollections: true,
@@ -93,31 +93,31 @@
 };
 
 const Map<ExperimentalFlag, Version> experimentEnabledVersion = {
-  ExperimentalFlag.alternativeInvalidationStrategy: const Version(2, 11),
+  ExperimentalFlag.alternativeInvalidationStrategy: const Version(2, 12),
   ExperimentalFlag.constantUpdate2018: const Version(2, 0),
   ExperimentalFlag.controlFlowCollections: const Version(2, 0),
   ExperimentalFlag.extensionMethods: const Version(2, 6),
-  ExperimentalFlag.nonNullable: const Version(2, 11),
-  ExperimentalFlag.nonfunctionTypeAliases: const Version(2, 11),
+  ExperimentalFlag.nonNullable: const Version(2, 12),
+  ExperimentalFlag.nonfunctionTypeAliases: const Version(2, 12),
   ExperimentalFlag.setLiterals: const Version(2, 0),
   ExperimentalFlag.spreadCollections: const Version(2, 0),
-  ExperimentalFlag.tripleShift: const Version(2, 11),
-  ExperimentalFlag.valueClass: const Version(2, 11),
-  ExperimentalFlag.variance: const Version(2, 11),
+  ExperimentalFlag.tripleShift: const Version(2, 12),
+  ExperimentalFlag.valueClass: const Version(2, 12),
+  ExperimentalFlag.variance: const Version(2, 12),
 };
 
 const Map<ExperimentalFlag, Version> experimentReleasedVersion = {
-  ExperimentalFlag.alternativeInvalidationStrategy: const Version(2, 11),
+  ExperimentalFlag.alternativeInvalidationStrategy: const Version(2, 12),
   ExperimentalFlag.constantUpdate2018: const Version(2, 0),
   ExperimentalFlag.controlFlowCollections: const Version(2, 0),
   ExperimentalFlag.extensionMethods: const Version(2, 6),
   ExperimentalFlag.nonNullable: const Version(2, 10),
-  ExperimentalFlag.nonfunctionTypeAliases: const Version(2, 11),
+  ExperimentalFlag.nonfunctionTypeAliases: const Version(2, 12),
   ExperimentalFlag.setLiterals: const Version(2, 0),
   ExperimentalFlag.spreadCollections: const Version(2, 0),
-  ExperimentalFlag.tripleShift: const Version(2, 11),
-  ExperimentalFlag.valueClass: const Version(2, 11),
-  ExperimentalFlag.variance: const Version(2, 11),
+  ExperimentalFlag.tripleShift: const Version(2, 12),
+  ExperimentalFlag.valueClass: const Version(2, 12),
+  ExperimentalFlag.variance: const Version(2, 12),
 };
 
 const AllowedExperimentalFlags defaultAllowedExperimentalFlags =
@@ -142,6 +142,12 @@
   "collection": {
     ExperimentalFlag.nonNullable,
   },
+  "connectivity": {
+    ExperimentalFlag.nonNullable,
+  },
+  "connectivity_platform_interface": {
+    ExperimentalFlag.nonNullable,
+  },
   "convert": {
     ExperimentalFlag.nonNullable,
   },
@@ -154,6 +160,12 @@
   "dart_internal": {
     ExperimentalFlag.nonNullable,
   },
+  "device_info": {
+    ExperimentalFlag.nonNullable,
+  },
+  "device_info_platform_interface": {
+    ExperimentalFlag.nonNullable,
+  },
   "fake_async": {
     ExperimentalFlag.nonNullable,
   },
@@ -202,6 +214,12 @@
   "native_stack_traces": {
     ExperimentalFlag.nonNullable,
   },
+  "observatory": {
+    ExperimentalFlag.nonNullable,
+  },
+  "observatory_test_package": {
+    ExperimentalFlag.nonNullable,
+  },
   "path": {
     ExperimentalFlag.nonNullable,
   },
@@ -211,6 +229,9 @@
   "platform": {
     ExperimentalFlag.nonNullable,
   },
+  "plugin_platform_interface": {
+    ExperimentalFlag.nonNullable,
+  },
   "pool": {
     ExperimentalFlag.nonNullable,
   },
@@ -256,7 +277,31 @@
   "typed_data": {
     ExperimentalFlag.nonNullable,
   },
+  "url_launcher": {
+    ExperimentalFlag.nonNullable,
+  },
+  "url_launcher_linux": {
+    ExperimentalFlag.nonNullable,
+  },
+  "url_launcher_macos": {
+    ExperimentalFlag.nonNullable,
+  },
+  "url_launcher_platform_interface": {
+    ExperimentalFlag.nonNullable,
+  },
+  "url_launcher_windows": {
+    ExperimentalFlag.nonNullable,
+  },
   "vector_math": {
     ExperimentalFlag.nonNullable,
   },
+  "video_player": {
+    ExperimentalFlag.nonNullable,
+  },
+  "video_player_platform_interface": {
+    ExperimentalFlag.nonNullable,
+  },
+  "video_player_web": {
+    ExperimentalFlag.nonNullable,
+  },
 });
diff --git a/pkg/front_end/lib/src/api_prototype/file_system.dart b/pkg/front_end/lib/src/api_prototype/file_system.dart
index 1306c0c..82b511a 100644
--- a/pkg/front_end/lib/src/api_prototype/file_system.dart
+++ b/pkg/front_end/lib/src/api_prototype/file_system.dart
@@ -4,8 +4,6 @@
 
 library front_end.file_system;
 
-import 'dart:async';
-
 /// Abstract interface to file system operations.
 ///
 /// All front end interaction with the file system goes through this interface;
diff --git a/pkg/front_end/lib/src/api_prototype/incremental_kernel_generator.dart b/pkg/front_end/lib/src/api_prototype/incremental_kernel_generator.dart
index c49c884..e5b1bc2 100644
--- a/pkg/front_end/lib/src/api_prototype/incremental_kernel_generator.dart
+++ b/pkg/front_end/lib/src/api_prototype/incremental_kernel_generator.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:async' show Future;
-
 import 'package:_fe_analyzer_shared/src/scanner/string_scanner.dart'
     show StringScanner;
 
diff --git a/pkg/front_end/lib/src/api_prototype/kernel_generator.dart b/pkg/front_end/lib/src/api_prototype/kernel_generator.dart
index 8519ca0..27857a9 100644
--- a/pkg/front_end/lib/src/api_prototype/kernel_generator.dart
+++ b/pkg/front_end/lib/src/api_prototype/kernel_generator.dart
@@ -5,8 +5,6 @@
 /// Defines the front-end API for converting source code to Dart Kernel objects.
 library front_end.kernel_generator;
 
-import 'dart:async' show Future;
-
 import 'package:_fe_analyzer_shared/src/messages/codes.dart'
     show messageMissingMain, noLength;
 
diff --git a/pkg/front_end/lib/src/api_prototype/language_version.dart b/pkg/front_end/lib/src/api_prototype/language_version.dart
index a77b716..02db78f 100644
--- a/pkg/front_end/lib/src/api_prototype/language_version.dart
+++ b/pkg/front_end/lib/src/api_prototype/language_version.dart
@@ -23,8 +23,7 @@
 
 import 'compiler_options.dart' show CompilerOptions;
 
-import 'experimental_flags.dart'
-    show ExperimentalFlag, experimentReleasedVersion;
+import 'experimental_flags.dart' show ExperimentalFlag;
 import 'file_system.dart' show FileSystem, FileSystemException;
 
 /// Gets the language version for a specific URI.
@@ -34,7 +33,8 @@
 /// specifies a language version that's too high).
 ///
 /// The language version returned is valid though.
-Future<Version> languageVersionForUri(Uri uri, CompilerOptions options) async {
+Future<VersionAndPackageUri> languageVersionForUri(
+    Uri uri, CompilerOptions options) async {
   return await CompilerContext.runWithOptions(
       new ProcessedOptions(options: options, inputs: [uri]), (context) async {
     // Get largest valid version / default version.
@@ -65,6 +65,13 @@
       fileUri = uri;
       package = uriTranslator.packages.packageOf(uri);
     }
+    Uri packageUri = uri;
+    if (packageUri.scheme != 'dart' &&
+        packageUri.scheme != 'package' &&
+        package != null &&
+        package.name != null) {
+      packageUri = new Uri(scheme: 'package', path: package.name);
+    }
 
     // Check file content for @dart annotation.
     int major;
@@ -102,7 +109,7 @@
     }
     if (major != null && minor != null) {
       // The file decided. Return result.
-      return new Version(major, minor);
+      return new VersionAndPackageUri(new Version(major, minor), packageUri);
     }
 
     // Check package.
@@ -119,11 +126,13 @@
     }
     if (major != null && minor != null) {
       // The package decided. Return result.
-      return new Version(major, minor);
+      return new VersionAndPackageUri(new Version(major, minor), packageUri);
     }
 
     // Return default.
-    return new Version(currentSdkVersionMajor, currentSdkVersionMinor);
+    return new VersionAndPackageUri(
+        new Version(currentSdkVersionMajor, currentSdkVersionMinor),
+        packageUri);
   });
 }
 
@@ -134,6 +143,16 @@
   // This method is here in order to use the opt out hack here for test
   // sources.
   if (SourceLibraryBuilder.isOptOutTest(uri)) return true;
-  Version uriVersion = await languageVersionForUri(uri, options);
-  return (uriVersion < experimentReleasedVersion[ExperimentalFlag.nonNullable]);
+  VersionAndPackageUri versionAndLibraryUri =
+      await languageVersionForUri(uri, options);
+  return (versionAndLibraryUri.version <
+      options.getExperimentEnabledVersionInLibrary(
+          ExperimentalFlag.nonNullable, versionAndLibraryUri.packageUri));
+}
+
+class VersionAndPackageUri {
+  final Version version;
+  final Uri packageUri;
+
+  VersionAndPackageUri(this.version, this.packageUri);
 }
diff --git a/pkg/front_end/lib/src/api_prototype/memory_file_system.dart b/pkg/front_end/lib/src/api_prototype/memory_file_system.dart
index 3618c93..e077d8d 100644
--- a/pkg/front_end/lib/src/api_prototype/memory_file_system.dart
+++ b/pkg/front_end/lib/src/api_prototype/memory_file_system.dart
@@ -4,7 +4,6 @@
 
 library front_end.memory_file_system;
 
-import 'dart:async';
 import 'dart:convert';
 import 'dart:typed_data';
 
diff --git a/pkg/front_end/lib/src/api_prototype/standard_file_system.dart b/pkg/front_end/lib/src/api_prototype/standard_file_system.dart
index bdd78ad..a8bbc0b 100644
--- a/pkg/front_end/lib/src/api_prototype/standard_file_system.dart
+++ b/pkg/front_end/lib/src/api_prototype/standard_file_system.dart
@@ -4,7 +4,6 @@
 
 library front_end.standard_file_system;
 
-import 'dart:async';
 import 'dart:io' as io;
 
 import 'file_system.dart';
diff --git a/pkg/front_end/lib/src/api_prototype/summary_generator.dart b/pkg/front_end/lib/src/api_prototype/summary_generator.dart
index 5385311..d579536 100644
--- a/pkg/front_end/lib/src/api_prototype/summary_generator.dart
+++ b/pkg/front_end/lib/src/api_prototype/summary_generator.dart
@@ -5,7 +5,6 @@
 /// Defines the front-end API for converting source code to summaries.
 library front_end.summary_generator;
 
-import 'dart:async';
 import 'compiler_options.dart';
 
 import '../base/processed_options.dart';
diff --git a/pkg/front_end/lib/src/api_unstable/bazel_worker.dart b/pkg/front_end/lib/src/api_unstable/bazel_worker.dart
index 66f4a23..d4445e4 100644
--- a/pkg/front_end/lib/src/api_unstable/bazel_worker.dart
+++ b/pkg/front_end/lib/src/api_unstable/bazel_worker.dart
@@ -5,8 +5,6 @@
 /// API needed by `utils/front_end/summary_worker.dart`, a tool used to compute
 /// summaries in build systems like bazel, pub-build, and package-build.
 
-import 'dart:async' show Future;
-
 import 'package:_fe_analyzer_shared/src/messages/diagnostic_message.dart'
     show DiagnosticMessageHandler;
 
@@ -94,7 +92,7 @@
       workerInputDigests,
       target,
       fileSystem: fileSystem,
-      experimentalFlags: experimentalFlags,
+      explicitExperimentalFlags: experimentalFlags,
       outlineOnly: outlineOnly,
       omitPlatform: true,
       trackNeededDillLibraries: trackNeededDillLibraries,
@@ -129,7 +127,7 @@
     ..target = target
     ..fileSystem = fileSystem
     ..environmentDefines = environmentDefines
-    ..experimentalFlags = parseExperimentalFlags(
+    ..explicitExperimentalFlags = parseExperimentalFlags(
         parseExperimentalArguments(experiments),
         onError: (e) => throw e)
     ..verbose = verbose
diff --git a/pkg/front_end/lib/src/api_unstable/dart2js.dart b/pkg/front_end/lib/src/api_unstable/dart2js.dart
index 35d49c2..d7fba2e 100644
--- a/pkg/front_end/lib/src/api_unstable/dart2js.dart
+++ b/pkg/front_end/lib/src/api_unstable/dart2js.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:async' show Future;
-
 import 'package:_fe_analyzer_shared/src/messages/codes.dart'
     show messageMissingMain;
 
@@ -102,7 +100,7 @@
     show CompilerOptions, parseExperimentalFlags, parseExperimentalArguments;
 
 export '../api_prototype/experimental_flags.dart'
-    show defaultExperimentalFlags, ExperimentalFlag;
+    show defaultExperimentalFlags, ExperimentalFlag, isExperimentEnabled;
 
 export '../api_prototype/file_system.dart'
     show FileSystem, FileSystemEntity, FileSystemException;
@@ -138,7 +136,7 @@
     Uri librariesSpecificationUri,
     List<Uri> additionalDills,
     Uri packagesFileUri,
-    {Map<ExperimentalFlag, bool> experimentalFlags,
+    {Map<ExperimentalFlag, bool> explicitExperimentalFlags,
     bool verify: false,
     NnbdMode nnbdMode}) {
   additionalDills.sort((a, b) => a.toString().compareTo(b.toString()));
@@ -150,7 +148,8 @@
       oldState.options.packagesFileUri == packagesFileUri &&
       oldState.options.librariesSpecificationUri == librariesSpecificationUri &&
       equalLists(oldState.options.additionalDills, additionalDills) &&
-      equalMaps(oldState.options.experimentalFlags, experimentalFlags) &&
+      equalMaps(oldState.options.explicitExperimentalFlags,
+          explicitExperimentalFlags) &&
       oldState.options.verify == verify &&
       oldState.options.nnbdMode == nnbdMode) {
     return oldState;
@@ -161,7 +160,7 @@
     ..additionalDills = additionalDills
     ..librariesSpecificationUri = librariesSpecificationUri
     ..packagesFileUri = packagesFileUri
-    ..experimentalFlags = experimentalFlags
+    ..explicitExperimentalFlags = explicitExperimentalFlags
     ..verify = verify;
   if (nnbdMode != null) options.nnbdMode = nnbdMode;
 
diff --git a/pkg/front_end/lib/src/api_unstable/ddc.dart b/pkg/front_end/lib/src/api_unstable/ddc.dart
index 3c0befd..b28384f 100644
--- a/pkg/front_end/lib/src/api_unstable/ddc.dart
+++ b/pkg/front_end/lib/src/api_unstable/ddc.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:async' show Future;
-
 import 'package:_fe_analyzer_shared/src/messages/diagnostic_message.dart'
     show DiagnosticMessageHandler;
 
@@ -67,7 +65,7 @@
 export '../fasta/incremental_compiler.dart' show IncrementalCompiler;
 
 export '../fasta/kernel/redirecting_factory_body.dart'
-    show RedirectingFactoryBody, isRedirectingFactoryField;
+    show RedirectingFactoryBody, isRedirectingFactoryField, redirectingName;
 
 export '../fasta/type_inference/type_schema_environment.dart'
     show TypeSchemaEnvironment;
@@ -113,7 +111,7 @@
     List<Uri> additionalDills,
     Target target,
     {FileSystem fileSystem,
-    Map<ExperimentalFlag, bool> experiments,
+    Map<ExperimentalFlag, bool> explicitExperimentalFlags,
     Map<String, String> environmentDefines,
     NnbdMode nnbdMode}) async {
   assert(nnbdMode != null, "No NnbdMode provided.");
@@ -126,7 +124,8 @@
       oldState.options.librariesSpecificationUri == librariesSpecificationUri &&
       oldState.options.nnbdMode == nnbdMode &&
       equalLists(oldState.options.additionalDills, additionalDills) &&
-      equalMaps(oldState.options.experimentalFlags, experiments) &&
+      equalMaps(oldState.options.explicitExperimentalFlags,
+          explicitExperimentalFlags) &&
       equalMaps(oldState.options.environmentDefines, environmentDefines)) {
     // Reuse old state.
     return oldState;
@@ -143,7 +142,9 @@
     ..fileSystem = fileSystem ?? StandardFileSystem.instance
     ..environmentDefines = environmentDefines
     ..nnbdMode = nnbdMode;
-  if (experiments != null) options.experimentalFlags = experiments;
+  if (explicitExperimentalFlags != null) {
+    options.explicitExperimentalFlags = explicitExperimentalFlags;
+  }
 
   ProcessedOptions processedOpts = new ProcessedOptions(options: options);
 
@@ -167,7 +168,7 @@
     Map<Uri, List<int>> workerInputDigests,
     Target target,
     {FileSystem fileSystem,
-    Map<ExperimentalFlag, bool> experiments,
+    Map<ExperimentalFlag, bool> explicitExperimentalFlags,
     Map<String, String> environmentDefines,
     bool trackNeededDillLibraries: false,
     NnbdMode nnbdMode}) async {
@@ -184,7 +185,7 @@
       compileSdk: compileSdk,
       sdkRoot: sdkRoot,
       fileSystem: fileSystem ?? StandardFileSystem.instance,
-      experimentalFlags: experiments,
+      explicitExperimentalFlags: explicitExperimentalFlags,
       environmentDefines:
           environmentDefines ?? const <ExperimentalFlag, bool>{},
       outlineOnly: false,
diff --git a/pkg/front_end/lib/src/api_unstable/modular_incremental_compilation.dart b/pkg/front_end/lib/src/api_unstable/modular_incremental_compilation.dart
index 291a914..691483d 100644
--- a/pkg/front_end/lib/src/api_unstable/modular_incremental_compilation.dart
+++ b/pkg/front_end/lib/src/api_unstable/modular_incremental_compilation.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:async' show Future;
-
 import 'package:kernel/kernel.dart' show Component, CanonicalName, Library;
 
 import 'package:kernel/target/targets.dart' show Target;
@@ -51,7 +49,7 @@
     {bool compileSdk: false,
     Uri sdkRoot: null,
     FileSystem fileSystem,
-    Map<ExperimentalFlag, bool> experimentalFlags,
+    Map<ExperimentalFlag, bool> explicitExperimentalFlags,
     Map<String, String> environmentDefines: const {},
     bool outlineOnly,
     bool omitPlatform: false,
@@ -82,7 +80,8 @@
           oldState.options.compileSdk != compileSdk ||
           oldState.incrementalCompiler.outlineOnly != outlineOnly ||
           oldState.options.nnbdMode != nnbdMode ||
-          !equalMaps(oldState.options.experimentalFlags, experimentalFlags) ||
+          !equalMaps(oldState.options.explicitExperimentalFlags,
+              explicitExperimentalFlags) ||
           !equalMaps(oldState.options.environmentDefines, environmentDefines) ||
           !equalSets(oldState.tags, tags) ||
           cachedSdkInput == null ||
@@ -103,7 +102,7 @@
           ..fileSystem = fileSystem
           ..omitPlatform = omitPlatform
           ..environmentDefines = environmentDefines
-          ..experimentalFlags = experimentalFlags
+          ..explicitExperimentalFlags = explicitExperimentalFlags
           ..verbose = verbose
           ..nnbdMode = nnbdMode;
 
diff --git a/pkg/front_end/lib/src/api_unstable/vm.dart b/pkg/front_end/lib/src/api_unstable/vm.dart
index 49d660d..e0970d7 100644
--- a/pkg/front_end/lib/src/api_unstable/vm.dart
+++ b/pkg/front_end/lib/src/api_unstable/vm.dart
@@ -43,7 +43,6 @@
 export '../fasta/fasta_codes.dart'
     show
         LocatedMessage,
-        messageBytecodeLimitExceededTooManyArguments,
         messageFfiExceptionalReturnNull,
         messageFfiExpectedConstant,
         noLength,
@@ -57,8 +56,7 @@
         templateFfiNotStatic,
         templateFfiStructGeneric,
         templateFfiTypeInvalid,
-        templateFfiTypeMismatch,
-        templateIllegalRecursiveType;
+        templateFfiTypeMismatch;
 
 export '../fasta/hybrid_file_system.dart' show HybridFileSystem;
 
diff --git a/pkg/front_end/lib/src/base/command_line_options.dart b/pkg/front_end/lib/src/base/command_line_options.dart
index 9640a43..a87824f 100644
--- a/pkg/front_end/lib/src/base/command_line_options.dart
+++ b/pkg/front_end/lib/src/base/command_line_options.dart
@@ -20,7 +20,6 @@
 
   static const String linkDependencies = "--link-dependencies";
 
-  static const String bytecode = "--bytecode";
   static const String compileSdk = "--compile-sdk";
   static const String dumpIr = "--dump-ir";
   static const String enableExperiment = "--enable-experiment";
@@ -40,5 +39,6 @@
   static const String singleRootScheme = "--single-root-scheme";
   static const String verbose = "--verbose";
   static const String verify = "--verify";
+  static const String verifySkipPlatform = "--verify-skip-platform";
   static const String warnOnReachabilityCheck = "--warn-on-reachability-check";
 }
diff --git a/pkg/front_end/lib/src/base/processed_options.dart b/pkg/front_end/lib/src/base/processed_options.dart
index 6682c79..baa6b72 100644
--- a/pkg/front_end/lib/src/base/processed_options.dart
+++ b/pkg/front_end/lib/src/base/processed_options.dart
@@ -4,8 +4,6 @@
 
 import 'dart:io' show exitCode;
 
-import 'dart:async' show Future;
-
 import 'dart:typed_data' show Uint8List;
 
 import 'package:_fe_analyzer_shared/src/messages/severity.dart' show Severity;
@@ -165,6 +163,8 @@
 
   bool get verify => _raw.verify;
 
+  bool get verifySkipPlatform => _raw.verifySkipPlatform;
+
   bool get debugDump => _raw.debugDump;
 
   bool get omitPlatform => _raw.omitPlatform;
@@ -207,7 +207,8 @@
         this.ticker = new Ticker(isVerbose: options?.verbose ?? false);
 
   FormattedMessage format(
-      LocatedMessage message, Severity severity, List<LocatedMessage> context) {
+      LocatedMessage message, Severity severity, List<LocatedMessage> context,
+      {List<Uri> involvedFiles}) {
     int offset = message.charOffset;
     Uri uri = message.uri;
     Location location = offset == -1 ? null : getLocation(uri, offset);
@@ -221,11 +222,12 @@
       }
     }
     return message.withFormatting(formatted, location?.line ?? -1,
-        location?.column ?? -1, severity, formattedContext);
+        location?.column ?? -1, severity, formattedContext,
+        involvedFiles: involvedFiles);
   }
 
   void report(LocatedMessage message, Severity severity,
-      {List<LocatedMessage> context}) {
+      {List<LocatedMessage> context, List<Uri> involvedFiles}) {
     if (command_line_reporting.isHidden(severity)) return;
     if (command_line_reporting.isCompileTimeError(severity)) {
       CompilerContext.current.logError(message, severity);
@@ -233,7 +235,8 @@
     if (CompilerContext.current.options.setExitCodeOnProblem) {
       exitCode = 1;
     }
-    reportDiagnosticMessage(format(message, severity, context));
+    reportDiagnosticMessage(
+        format(message, severity, context, involvedFiles: involvedFiles));
     if (command_line_reporting.shouldThrowOn(severity)) {
       if (fatalDiagnosticCount++ < _raw.skipForDebugging) {
         // Skip this one. The interesting one comes later.
@@ -320,9 +323,6 @@
   /// effect.
   void clearFileSystemCache() => _fileSystem = null;
 
-  /// Whether to generate bytecode.
-  bool get bytecode => _raw.bytecode;
-
   /// Whether to write a file (e.g. a dill file) when reporting a crash.
   bool get writeFileOnCrashReport => _raw.writeFileOnCrashReport;
 
@@ -340,9 +340,22 @@
   /// This is `true` either if the [flag] is passed through an explicit
   /// `--enable-experiment` option or if the [flag] is expired and on by
   /// default.
+  bool isExperimentEnabledByDefault(flags.ExperimentalFlag flag) {
+    return flags.isExperimentEnabled(flag,
+        defaultExperimentFlagsForTesting:
+            _raw.defaultExperimentFlagsForTesting);
+  }
+
+  /// Returns `true` if the [flag] is enabled globally.
+  ///
+  /// This is `true` either if the [flag] is passed through an explicit
+  /// `--enable-experiment` option or if the [flag] is expired and on by
+  /// default.
   bool isExperimentEnabledGlobally(flags.ExperimentalFlag flag) {
     return flags.isExperimentEnabled(flag,
-        experimentalFlags: _raw.experimentalFlags);
+        explicitExperimentalFlags: _raw.explicitExperimentalFlags,
+        defaultExperimentFlagsForTesting:
+            _raw.defaultExperimentFlagsForTesting);
   }
 
   /// Returns `true` if the [flag] is enabled in the library with the given
@@ -353,18 +366,21 @@
   /// the 'allowed_experiments.json' file for this library.
   bool isExperimentEnabledInLibrary(
       flags.ExperimentalFlag flag, Uri importUri) {
-    return flags.isExperimentEnabledInLibrary(flag, importUri,
-        experimentalFlags: _raw.experimentalFlags,
-        allowedExperimentalFlags: _raw.allowedExperimentalFlagsForTesting);
+    return _raw.isExperimentEnabledInLibrary(flag, importUri);
   }
 
-  Version getExperimentEnabledVersion(flags.ExperimentalFlag flag) {
-    return flags.getExperimentEnabledVersion(flag,
-        experimentReleasedVersionForTesting:
-            _raw.experimentReleasedVersionForTesting);
+  Version getExperimentEnabledVersionInLibrary(
+      flags.ExperimentalFlag flag, Uri importUri) {
+    return _raw.getExperimentEnabledVersionInLibrary(flag, importUri);
   }
 
   Component _validateNullSafetyMode(Component component) {
+    if (component.mode == NonNullableByDefaultCompiledMode.Invalid) {
+      throw new FormatException(
+          'Provided .dill file for the following libraries has an invalid null '
+          'safety mode and does not support null safety:\n'
+          '${component.libraries.join('\n')}');
+    }
     if (nnbdMode == NnbdMode.Strong &&
         !(component.mode == NonNullableByDefaultCompiledMode.Strong ||
             component.mode == NonNullableByDefaultCompiledMode.Agnostic)) {
diff --git a/pkg/front_end/lib/src/fasta/builder/class_builder.dart b/pkg/front_end/lib/src/fasta/builder/class_builder.dart
index c43ba3b..6b97dd9 100644
--- a/pkg/front_end/lib/src/fasta/builder/class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/class_builder.dart
@@ -6,28 +6,20 @@
 
 import 'package:kernel/ast.dart'
     show
-        Arguments,
-        AsExpression,
-        AsyncMarker,
         Class,
         Constructor,
         DartType,
         DynamicType,
-        Expression,
         FunctionNode,
         FunctionType,
         FutureOrType,
         InterfaceType,
         Member,
-        MethodInvocation,
         Name,
+        NullType,
         Nullability,
-        Procedure,
-        ReturnStatement,
         Supertype,
-        ThisExpression,
         TypeParameter,
-        VoidType,
         getAsTypeArguments;
 
 import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
@@ -43,14 +35,12 @@
 
 import 'package:kernel/src/types.dart' show Types;
 
-import '../dill/dill_member_builder.dart' show DillMemberBuilder;
+import '../dill/dill_member_builder.dart';
 
 import '../fasta_codes.dart';
 
 import '../kernel/redirecting_factory_body.dart' show getRedirectingFactoryBody;
 
-import '../kernel/kernel_target.dart' show KernelTarget;
-
 import '../loader.dart';
 
 import '../modifier.dart';
@@ -549,7 +539,7 @@
       Nullability nullability, List<DartType> arguments) {
     assert(arguments == null || cls.typeParameters.length == arguments.length);
     if (isNullClass) {
-      nullability = Nullability.nullable;
+      return const NullType();
     }
     if (name == "FutureOr") {
       LibraryBuilder parentLibrary = parent;
@@ -773,48 +763,6 @@
     return noSuchMethod != null && noSuchMethod.enclosingClass != objectClass;
   }
 
-  void transformProcedureToNoSuchMethodForwarder(
-      Member noSuchMethodInterface, KernelTarget target, Procedure procedure) {
-    String prefix = procedure.isGetter
-        ? 'get:'
-        : procedure.isSetter
-            ? 'set:'
-            : '';
-    String invocationName = prefix + procedure.name.text;
-    if (procedure.isSetter) invocationName += '=';
-    Expression invocation = target.backendTarget.instantiateInvocation(
-        target.loader.coreTypes,
-        new ThisExpression(),
-        invocationName,
-        new Arguments.forwarded(procedure.function, library.library),
-        procedure.fileOffset,
-        /*isSuper=*/ false);
-    Expression result = new MethodInvocation(new ThisExpression(),
-        noSuchMethodName, new Arguments([invocation]), noSuchMethodInterface)
-      ..fileOffset = procedure.fileOffset;
-    if (procedure.function.returnType is! VoidType) {
-      result = new AsExpression(result, procedure.function.returnType)
-        ..isTypeError = true
-        ..isForDynamic = true
-        ..isForNonNullableByDefault = library.isNonNullableByDefault
-        ..fileOffset = procedure.fileOffset;
-    }
-    procedure.function.body = new ReturnStatement(result)
-      ..fileOffset = procedure.fileOffset;
-    procedure.function.body.parent = procedure.function;
-    procedure.function.asyncMarker = AsyncMarker.Sync;
-    procedure.function.dartAsyncMarker = AsyncMarker.Sync;
-
-    procedure.isAbstract = false;
-    procedure.isNoSuchMethodForwarder = true;
-    procedure.isMemberSignature = false;
-    procedure.isForwardingStub = false;
-    procedure.isForwardingSemiStub = false;
-    procedure.memberSignatureOrigin = null;
-    procedure.forwardingStubInterfaceTarget = null;
-    procedure.forwardingStubSuperTarget = null;
-  }
-
   @override
   String get fullNameForErrors {
     return isMixinApplication && !isNamedMixinApplication
@@ -834,7 +782,7 @@
       InterfaceType requiredInterface =
           substitution.substituteSupertype(constraint).asInterfaceType;
       InterfaceType implementedInterface = hierarchy.getTypeAsInstanceOf(
-          supertype, requiredInterface.classNode, library.library, coreTypes);
+          supertype, requiredInterface.classNode, library.library);
       if (implementedInterface == null ||
           !typeEnvironment.areMutualSubtypes(
               implementedInterface,
@@ -912,10 +860,8 @@
     if (redirectionTarget.target is FunctionBuilder) {
       FunctionBuilder targetBuilder = redirectionTarget.target;
       target = targetBuilder.function;
-    } else if (redirectionTarget.target is DillMemberBuilder &&
-        (redirectionTarget.target.isConstructor ||
-            redirectionTarget.target.isFactory)) {
-      DillMemberBuilder targetBuilder = redirectionTarget.target;
+    } else if (redirectionTarget.target is DillConstructorBuilder) {
+      DillConstructorBuilder targetBuilder = redirectionTarget.target;
       // It seems that the [redirectionTarget.target] is an instance of
       // [DillMemberBuilder] whenever the redirectee is an implicit constructor,
       // e.g.
@@ -925,7 +871,19 @@
       //   }
       //   class B implements A {}
       //
-      target = targetBuilder.member.function;
+      target = targetBuilder.constructor.function;
+    } else if (redirectionTarget.target is DillFactoryBuilder) {
+      DillFactoryBuilder targetBuilder = redirectionTarget.target;
+      // It seems that the [redirectionTarget.target] is an instance of
+      // [DillMemberBuilder] whenever the redirectee is an implicit constructor,
+      // e.g.
+      //
+      //   class A {
+      //     factory A() = B;
+      //   }
+      //   class B implements A {}
+      //
+      target = targetBuilder.procedure.function;
     } else if (redirectionTarget.target is AmbiguousBuilder) {
       // Multiple definitions with the same name: An error has already been
       // issued.
@@ -1206,17 +1164,3 @@
 
   ConstructorRedirection(this.target) : cycleReported = false;
 }
-
-/// Returns `true` if override problems should be overlooked.
-///
-/// This is needed for the current encoding of some JavaScript implementation
-/// classes that are not valid Dart. For instance `JSInt` in
-/// 'dart:_interceptors' that implements both `int` and `double`, and `JsArray`
-/// in `dart:js` that implement both `ListMixin` and `JsObject`.
-bool shouldOverrideProblemBeOverlooked(ClassBuilder classBuilder) {
-  String uri = '${classBuilder.library.importUri}';
-  return uri == 'dart:js' &&
-          classBuilder.fileUri.pathSegments.last == 'js.dart' ||
-      uri == 'dart:_interceptors' &&
-          classBuilder.fileUri.pathSegments.last == 'js_number.dart';
-}
diff --git a/pkg/front_end/lib/src/fasta/builder/constructor_builder.dart b/pkg/front_end/lib/src/fasta/builder/constructor_builder.dart
index ec49e0f..2c0f031 100644
--- a/pkg/front_end/lib/src/fasta/builder/constructor_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/constructor_builder.dart
@@ -160,6 +160,9 @@
   Member get invokeTarget => constructor;
 
   @override
+  Iterable<Member> get exportedMembers => [constructor];
+
+  @override
   ConstructorBuilder get origin => actualOrigin ?? this;
 
   @override
@@ -436,7 +439,7 @@
   }
 }
 
-class SyntheticConstructorBuilder extends DillMemberBuilder {
+class SyntheticConstructorBuilder extends DillConstructorBuilder {
   MemberBuilderImpl _origin;
   ClonedFunctionNode _clonedFunctionNode;
 
diff --git a/pkg/front_end/lib/src/fasta/builder/enum_builder.dart b/pkg/front_end/lib/src/fasta/builder/enum_builder.dart
index 537e376..deb42c7 100644
--- a/pkg/front_end/lib/src/fasta/builder/enum_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/enum_builder.dart
@@ -264,7 +264,8 @@
         charEndOffset,
         toStringReference,
         null,
-        AsyncMarker.Sync);
+        AsyncMarker.Sync,
+        /* isExtensionInstanceMember = */ false);
     members["toString"] = toStringBuilder;
     String className = name;
     if (enumConstantInfos != null) {
diff --git a/pkg/front_end/lib/src/fasta/builder/field_builder.dart b/pkg/front_end/lib/src/fasta/builder/field_builder.dart
index 607bf99..63f82eb 100644
--- a/pkg/front_end/lib/src/fasta/builder/field_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/field_builder.dart
@@ -18,6 +18,7 @@
 import '../kernel/class_hierarchy_builder.dart';
 import '../kernel/kernel_builder.dart' show ImplicitFieldType;
 import '../kernel/late_lowering.dart' as late_lowering;
+import '../kernel/member_covariance.dart';
 
 import '../modifier.dart' show covariantMask, hasInitializerMask, lateMask;
 
@@ -321,12 +322,16 @@
   Member get invokeTarget => readTarget;
 
   @override
+  Iterable<Member> get exportedMembers => _fieldEncoding.exportedMembers;
+
+  @override
   void buildMembers(
       LibraryBuilder library, void Function(Member, BuiltMemberKind) f) {
     build(library);
     _fieldEncoding.registerMembers(library, this, f);
   }
 
+  /// Builds the core AST structures for this field as needed for the outline.
   void build(SourceLibraryBuilder libraryBuilder) {
     if (type != null) {
       // notInstanceContext is set to true for extension fields as they
@@ -538,6 +543,9 @@
   /// Returns the member used to write to the field.
   Member get writeTarget;
 
+  /// Returns the generated members that are visible through exports.
+  Iterable<Member> get exportedMembers;
+
   /// Creates the members necessary for this field encoding.
   ///
   /// This method is called for both outline and full compilation so the created
@@ -569,7 +577,10 @@
 
   RegularFieldEncoding(Uri fileUri, int charOffset, int charEndOffset,
       Field reference, bool isNonNullableByDefault) {
-    _field = new Field(null, fileUri: fileUri, reference: reference?.reference)
+    _field = new Field(null,
+        fileUri: fileUri,
+        getterReference: reference?.getterReference,
+        setterReference: reference?.setterReference)
       ..fileOffset = charOffset
       ..fileEndOffset = charEndOffset
       ..isNonNullableByDefault = isNonNullableByDefault;
@@ -673,6 +684,9 @@
   Member get writeTarget => _field;
 
   @override
+  Iterable<Member> get exportedMembers => [_field];
+
+  @override
   List<ClassMember> getLocalMembers(SourceFieldBuilder fieldBuilder) =>
       <ClassMember>[new SourceFieldMember(fieldBuilder, forSetter: false)];
 
@@ -687,6 +701,8 @@
   @override
   final SourceFieldBuilder memberBuilder;
 
+  Covariance _covariance;
+
   @override
   final bool forSetter;
 
@@ -706,7 +722,14 @@
   @override
   Member getMember(ClassHierarchyBuilder hierarchy) {
     memberBuilder._ensureType(hierarchy);
-    return memberBuilder.member;
+    return memberBuilder.field;
+  }
+
+  @override
+  Covariance getCovariance(ClassHierarchyBuilder hierarchy) {
+    return _covariance ??= forSetter
+        ? new Covariance.fromMember(getMember(hierarchy), forSetter: forSetter)
+        : const Covariance.empty();
   }
 
   @override
@@ -727,6 +750,7 @@
 abstract class AbstractLateFieldEncoding implements FieldEncoding {
   final String name;
   final int fileOffset;
+  final int fileEndOffset;
   DartType _type;
   Field _field;
   Field _lateIsSetField;
@@ -762,15 +786,18 @@
       bool isCovariant,
       late_lowering.IsSetStrategy isSetStrategy)
       : fileOffset = charOffset,
+        fileEndOffset = charEndOffset,
         _isSetStrategy = isSetStrategy,
         _forceIncludeIsSetField =
             isSetStrategy == late_lowering.IsSetStrategy.forceUseIsSetField {
-    _field =
-        new Field(null, fileUri: fileUri, reference: referenceFrom?.reference)
-          ..fileOffset = charOffset
-          ..fileEndOffset = charEndOffset
-          ..isNonNullableByDefault = true
-          ..isInternalImplementation = true;
+    _field = new Field(null,
+        fileUri: fileUri,
+        getterReference: referenceFrom?.getterReference,
+        setterReference: referenceFrom?.setterReference)
+      ..fileOffset = charOffset
+      ..fileEndOffset = charEndOffset
+      ..isNonNullableByDefault = true
+      ..isInternalImplementation = true;
     switch (_isSetStrategy) {
       case late_lowering.IsSetStrategy.useSentinelOrNull:
         // [_lateIsSetField] is never needed.
@@ -778,7 +805,9 @@
       case late_lowering.IsSetStrategy.forceUseIsSetField:
       case late_lowering.IsSetStrategy.useIsSetFieldOrNull:
         _lateIsSetField = new Field(null,
-            fileUri: fileUri, reference: lateIsSetReferenceFrom?.reference)
+            fileUri: fileUri,
+            getterReference: lateIsSetReferenceFrom?.getterReference,
+            setterReference: lateIsSetReferenceFrom?.setterReference)
           ..fileOffset = charOffset
           ..fileEndOffset = charEndOffset
           ..isNonNullableByDefault = true
@@ -786,9 +815,15 @@
         break;
     }
     _lateGetter = new Procedure(
-        null, ProcedureKind.Getter, new FunctionNode(null),
-        fileUri: fileUri, reference: getterReferenceFrom?.reference)
+        null,
+        ProcedureKind.Getter,
+        new FunctionNode(null)
+          ..fileOffset = charOffset
+          ..fileEndOffset = charEndOffset,
+        fileUri: fileUri,
+        reference: getterReferenceFrom?.reference)
       ..fileOffset = charOffset
+      ..fileEndOffset = charEndOffset
       ..isNonNullableByDefault = true;
     _lateSetter = _createSetter(name, fileUri, charOffset, setterReferenceFrom,
         isCovariant: isCovariant);
@@ -903,10 +938,13 @@
         null,
         ProcedureKind.Setter,
         new FunctionNode(null,
-            positionalParameters: [parameter], returnType: const VoidType()),
+            positionalParameters: [parameter], returnType: const VoidType())
+          ..fileOffset = charOffset
+          ..fileEndOffset = fileEndOffset,
         fileUri: fileUri,
         reference: referenceFrom?.reference)
       ..fileOffset = charOffset
+      ..fileEndOffset = fileEndOffset
       ..isNonNullableByDefault = true;
   }
 
@@ -963,6 +1001,14 @@
   Member get writeTarget => _lateSetter;
 
   @override
+  Iterable<Member> get exportedMembers {
+    if (_lateSetter != null) {
+      return [_lateGetter, _lateSetter];
+    }
+    return [_lateGetter];
+  }
+
+  @override
   void build(
       SourceLibraryBuilder libraryBuilder, SourceFieldBuilder fieldBuilder) {
     bool isInstanceMember;
@@ -1124,10 +1170,11 @@
       CoreTypes coreTypes, String name, Expression initializer) {
     assert(_type != null, "Type has not been computed for field $name.");
     return late_lowering.createGetterBodyWithoutInitializer(
-        coreTypes, fileOffset, name, type, 'Field',
+        coreTypes, fileOffset, name, type,
         createVariableRead: _createFieldRead,
         createIsSetRead: () => _createFieldGet(_lateIsSetField),
-        isSetEncoding: isSetEncoding);
+        isSetEncoding: isSetEncoding,
+        forField: true);
   }
 }
 
@@ -1228,7 +1275,7 @@
       CoreTypes coreTypes, String name, VariableDeclaration parameter) {
     assert(_type != null, "Type has not been computed for field $name.");
     return late_lowering.createSetterBodyFinal(
-        coreTypes, fileOffset, name, parameter, type, 'Field',
+        coreTypes, fileOffset, name, parameter, type,
         shouldReturnValue: false,
         createVariableRead: () => _createFieldGet(_field),
         createVariableWrite: (Expression value) =>
@@ -1236,7 +1283,8 @@
         createIsSetRead: () => _createFieldGet(_lateIsSetField),
         createIsSetWrite: (Expression value) =>
             _createFieldSet(_lateIsSetField, value),
-        isSetEncoding: isSetEncoding);
+        isSetEncoding: isSetEncoding,
+        forField: true);
   }
 }
 
@@ -1268,7 +1316,7 @@
       CoreTypes coreTypes, String name, Expression initializer) {
     assert(_type != null, "Type has not been computed for field $name.");
     return late_lowering.createGetterWithInitializerWithRecheck(
-        coreTypes, fileOffset, name, _type, 'Field', initializer,
+        coreTypes, fileOffset, name, _type, initializer,
         createVariableRead: _createFieldRead,
         createVariableWrite: (Expression value) =>
             _createFieldSet(_field, value),
@@ -1296,6 +1344,8 @@
 
   final Member _member;
 
+  Covariance _covariance;
+
   @override
   final bool forSetter;
 
@@ -1312,6 +1362,12 @@
   }
 
   @override
+  Covariance getCovariance(ClassHierarchyBuilder hierarchy) {
+    return _covariance ??=
+        new Covariance.fromMember(getMember(hierarchy), forSetter: forSetter);
+  }
+
+  @override
   void inferType(ClassHierarchyBuilder hierarchy) {
     fieldBuilder._ensureType(hierarchy);
   }
@@ -1428,12 +1484,6 @@
   ClassMember get concrete => this;
 
   @override
-  bool operator ==(Object other) {
-    if (identical(this, other)) return true;
-    return false;
-  }
-
-  @override
   bool isSameDeclaration(ClassMember other) {
     if (identical(this, other)) return true;
     return other is _SynthesizedFieldClassMember &&
@@ -1478,7 +1528,9 @@
           null,
           ProcedureKind.Setter,
           new FunctionNode(null,
-              positionalParameters: [parameter], returnType: const VoidType()),
+              positionalParameters: [parameter], returnType: const VoidType())
+            ..fileOffset = charOffset
+            ..fileEndOffset = charEndOffset,
           fileUri: fileUri,
           reference: setterReference?.reference)
         ..fileOffset = charOffset
@@ -1608,6 +1660,14 @@
   Member get writeTarget => _setter;
 
   @override
+  Iterable<Member> get exportedMembers {
+    if (_setter != null) {
+      return [_getter, _setter];
+    }
+    return [_getter];
+  }
+
+  @override
   List<ClassMember> getLocalMembers(SourceFieldBuilder fieldBuilder) =>
       <ClassMember>[
         new _SynthesizedFieldClassMember(fieldBuilder, _getter,
diff --git a/pkg/front_end/lib/src/fasta/builder/library_builder.dart b/pkg/front_end/lib/src/fasta/builder/library_builder.dart
index 224ecbc..7f80ef3e 100644
--- a/pkg/front_end/lib/src/fasta/builder/library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/library_builder.dart
@@ -157,6 +157,8 @@
 
   void addSyntheticDeclarationOfNever();
 
+  void addSyntheticDeclarationOfNull();
+
   /// Lookups the member [name] declared in this library.
   ///
   /// If [required] is `true` and no member is found an internal problem is
@@ -387,6 +389,9 @@
     if (scope.lookupLocalMember("Never", setter: false) == null) {
       addSyntheticDeclarationOfNever();
     }
+    if (scope.lookupLocalMember("Null", setter: false) == null) {
+      addSyntheticDeclarationOfNull();
+    }
   }
 
   @override
diff --git a/pkg/front_end/lib/src/fasta/builder/member_builder.dart b/pkg/front_end/lib/src/fasta/builder/member_builder.dart
index 05c1bc4..58d5882 100644
--- a/pkg/front_end/lib/src/fasta/builder/member_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/member_builder.dart
@@ -54,6 +54,13 @@
   /// a factory this is the [member] itself. For a setter this is `null`.
   Member get invokeTarget;
 
+  /// The members from this builder that are accessible in exports through
+  /// the name of the builder.
+  ///
+  /// This is used to allow a single builder to create separate members for
+  /// the getter and setter capabilities.
+  Iterable<Member> get exportedMembers;
+
   // TODO(johnniwinther): Remove this and create a [ProcedureBuilder] interface.
   ProcedureKind get kind;
 
@@ -149,6 +156,7 @@
   @override
   void buildOutlineExpressions(LibraryBuilder library, CoreTypes coreTypes) {}
 
+  /// Builds the core AST structures for this member as needed for the outline.
   void buildMembers(
       LibraryBuilder library, void Function(Member, BuiltMemberKind) f);
 
@@ -243,9 +251,6 @@
   bool get isStatic => memberBuilder.isStatic;
 
   @override
-  Member getMember(ClassHierarchyBuilder hierarchy) => memberBuilder.member;
-
-  @override
   bool isObjectMember(ClassBuilder objectClass) {
     return classBuilder == objectClass;
   }
@@ -283,11 +288,5 @@
   ClassMember get concrete => this;
 
   @override
-  bool operator ==(Object other) {
-    if (identical(this, other)) return true;
-    return false;
-  }
-
-  @override
   String toString() => '$runtimeType($fullName,forSetter=${forSetter})';
 }
diff --git a/pkg/front_end/lib/src/fasta/builder/named_type_builder.dart b/pkg/front_end/lib/src/fasta/builder/named_type_builder.dart
index dec0428..e09e091 100644
--- a/pkg/front_end/lib/src/fasta/builder/named_type_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/named_type_builder.dart
@@ -6,17 +6,7 @@
 
 import 'package:_fe_analyzer_shared/src/messages/severity.dart' show Severity;
 
-import 'package:kernel/ast.dart'
-    show
-        Class,
-        DartType,
-        Extension,
-        InterfaceType,
-        InvalidType,
-        Supertype,
-        TreeNode,
-        TypeParameter,
-        TypedefType;
+import 'package:kernel/ast.dart' hide MapEntry;
 
 import '../fasta_codes.dart'
     show
@@ -262,7 +252,6 @@
       TypeVariableBuilder typeParameterBuilder = declaration;
       TypeParameter typeParameter = typeParameterBuilder.parameter;
       if (typeParameter.parent is Class || typeParameter.parent is Extension) {
-        messageTypeVariableInStaticContext;
         library.addProblem(
             messageTypeVariableInStaticContext,
             charOffset ?? TreeNode.noOffset,
@@ -295,6 +284,50 @@
           declaration.buildType(library, library.nonNullableBuilder, arguments);
       if (type is InterfaceType) {
         return new Supertype(type.classNode, type.typeArguments);
+      } else if (type is NullType) {
+        // Even though Null is disallowed as a supertype, ClassHierarchyBuilder
+        // still expects it to be built to the respective InterfaceType
+        // referencing the deprecated class.
+        // TODO(dmitryas): Remove the dependency on the deprecated Null class
+        // from ClassHierarchyBuilder.
+        TypeDeclarationBuilder unaliasedDeclaration = this.declaration;
+        // The following code assumes that the declaration is a TypeAliasBuilder
+        // that through a chain of other TypeAliasBuilders (possibly, the chian
+        // length is 0) references a ClassBuilder of the Null class.  Otherwise,
+        // it won't produce the NullType on the output.
+        while (unaliasedDeclaration is TypeAliasBuilder) {
+          unaliasedDeclaration =
+              (unaliasedDeclaration as TypeAliasBuilder).type.declaration;
+          assert(unaliasedDeclaration != null);
+        }
+        assert(unaliasedDeclaration is ClassBuilder &&
+            unaliasedDeclaration.name == "Null");
+        return new Supertype(
+            (unaliasedDeclaration as ClassBuilder).cls, const <DartType>[]);
+      } else if (type is FutureOrType) {
+        // Even though FutureOr is disallowed as a supertype,
+        // ClassHierarchyBuilder still expects it to be built to the respective
+        // InterfaceType referencing the deprecated class.  In contrast with
+        // Null, it doesn't surface as an error due to FutureOr class not having
+        // any inheritable members.
+        // TODO(dmitryas): Remove the dependency on the deprecated FutureOr
+        // class from ClassHierarchyBuilder.
+        TypeDeclarationBuilder unaliasedDeclaration = this.declaration;
+        // The following code assumes that the declaration is a TypeAliasBuilder
+        // that through a chain of other TypeAliasBuilders (possibly, the chian
+        // length is 0) references a ClassBuilder of the FutureOr class.
+        // Otherwise, it won't produce the FutureOrType on the output.
+        while (unaliasedDeclaration is TypeAliasBuilder) {
+          unaliasedDeclaration =
+              (unaliasedDeclaration as TypeAliasBuilder).type.declaration;
+          assert(unaliasedDeclaration != null);
+        }
+        assert(unaliasedDeclaration is ClassBuilder &&
+            unaliasedDeclaration.name == "FutureOr");
+        return new Supertype((unaliasedDeclaration as ClassBuilder).cls,
+            <DartType>[type.typeArgument]);
+      } else {
+        // Do nothing: handleInvalidSuper below will handle the erroneous case.
       }
     } else if (declaration is InvalidTypeDeclarationBuilder) {
       library.addProblem(
diff --git a/pkg/front_end/lib/src/fasta/builder/never_type_declaration_builder.dart b/pkg/front_end/lib/src/fasta/builder/never_type_declaration_builder.dart
index f8700b1..509dd32 100644
--- a/pkg/front_end/lib/src/fasta/builder/never_type_declaration_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/never_type_declaration_builder.dart
@@ -4,17 +4,15 @@
 
 library fasta.never_type_builder;
 
-import 'package:kernel/ast.dart' show DartType, InterfaceType, Nullability;
+import 'package:kernel/ast.dart' show DartType, NullType, Nullability;
 
 import 'builtin_type_declaration_builder.dart';
-import 'class_builder.dart';
 import 'library_builder.dart';
 import 'nullability_builder.dart';
 import 'type_builder.dart';
 
 class NeverTypeDeclarationBuilder extends BuiltinTypeDeclarationBuilder {
   final LibraryBuilder coreLibrary;
-  DartType _nullType;
 
   NeverTypeDeclarationBuilder(DartType type, this.coreLibrary, int charOffset)
       : super("Never", type, coreLibrary, charOffset) {
@@ -23,19 +21,11 @@
 
   String get debugName => "NeverTypeDeclarationBuilder";
 
-  DartType get nullType {
-    if (_nullType == null) {
-      ClassBuilder nullClass = coreLibrary.lookupLocalMember('Null');
-      _nullType = new InterfaceType(nullClass.cls, Nullability.nullable, []);
-    }
-    return _nullType;
-  }
-
   DartType buildType(LibraryBuilder library,
       NullabilityBuilder nullabilityBuilder, List<TypeBuilder> arguments,
       [bool notInstanceContext]) {
     if (!library.isNonNullableByDefault) {
-      return nullType;
+      return const NullType();
     }
     return type.withDeclaredNullability(nullabilityBuilder.build(library));
   }
@@ -43,7 +33,7 @@
   DartType buildTypesWithBuiltArguments(LibraryBuilder library,
       Nullability nullability, List<DartType> arguments) {
     if (!library.isNonNullableByDefault) {
-      return nullType;
+      return const NullType();
     }
     return type.withDeclaredNullability(nullability);
   }
diff --git a/pkg/front_end/lib/src/fasta/builder/null_type_declaration_builder.dart b/pkg/front_end/lib/src/fasta/builder/null_type_declaration_builder.dart
new file mode 100644
index 0000000..cbfd853
--- /dev/null
+++ b/pkg/front_end/lib/src/fasta/builder/null_type_declaration_builder.dart
@@ -0,0 +1,31 @@
+// Copyright (c) 2020, 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.
+
+library fasta.null_type_declaration_builder;
+
+import 'package:kernel/ast.dart' show DartType, Nullability;
+
+import 'builtin_type_declaration_builder.dart';
+import 'library_builder.dart';
+import 'nullability_builder.dart';
+import 'type_builder.dart';
+
+class NullTypeDeclarationBuilder extends BuiltinTypeDeclarationBuilder {
+  NullTypeDeclarationBuilder(
+      DartType type, LibraryBuilder compilationUnit, int charOffset)
+      : super("Null", type, compilationUnit, charOffset);
+
+  String get debugName => "NullTypeBuilder";
+
+  DartType buildType(LibraryBuilder library,
+      NullabilityBuilder nullabilityBuilder, List<TypeBuilder> arguments,
+      [bool notInstanceContext]) {
+    return type;
+  }
+
+  DartType buildTypesWithBuiltArguments(LibraryBuilder library,
+      Nullability nullability, List<DartType> arguments) {
+    return type;
+  }
+}
diff --git a/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart b/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart
index 54a738b..d1c7d3b 100644
--- a/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart
@@ -13,6 +13,7 @@
 import '../kernel/class_hierarchy_builder.dart';
 import '../kernel/forest.dart';
 import '../kernel/internal_ast.dart';
+import '../kernel/member_covariance.dart';
 import '../kernel/redirecting_factory_body.dart' show RedirectingFactoryBody;
 
 import '../loader.dart' show Loader;
@@ -81,6 +82,8 @@
   @override
   Procedure get actualProcedure => _procedure;
 
+  final bool isExtensionInstanceMember;
+
   ProcedureBuilderImpl(
       List<MetadataBuilder> metadata,
       int modifiers,
@@ -95,8 +98,10 @@
       this.charOpenParenOffset,
       int charEndOffset,
       Procedure referenceFrom,
+      this.isExtensionInstanceMember,
       [String nativeMethodName])
-      : _procedure = new Procedure(null, kind, null,
+      : _procedure = new Procedure(
+            null, isExtensionInstanceMember ? ProcedureKind.Method : kind, null,
             fileUri: compilationUnit.fileUri,
             reference: referenceFrom?.reference)
           ..startFileOffset = startCharOffset
@@ -227,6 +232,7 @@
       Procedure referenceFrom,
       this._tearOffReferenceFrom,
       AsyncMarker asyncModifier,
+      bool isExtensionInstanceMember,
       [String nativeMethodName])
       : super(
             metadata,
@@ -242,6 +248,7 @@
             charOpenParenOffset,
             charEndOffset,
             referenceFrom,
+            isExtensionInstanceMember,
             nativeMethodName) {
     this.asyncModifier = asyncModifier;
   }
@@ -317,6 +324,9 @@
   }
 
   @override
+  Iterable<Member> get exportedMembers => [procedure];
+
+  @override
   void buildMembers(
       LibraryBuilder library, void Function(Member, BuiltMemberKind) f) {
     Member member = build(library);
@@ -362,7 +372,7 @@
         _procedure.isExtensionMember = true;
         _procedure.isStatic = true;
         if (isExtensionInstanceMember) {
-          _procedure.kind = ProcedureKind.Method;
+          assert(_procedure.kind == ProcedureKind.Method);
         }
         _procedure.name = new Name(
             createProcedureName(true, !isExtensionInstanceMember, kind,
@@ -524,24 +534,29 @@
           ..fileOffset = fileOffset)
       ..fileOffset = fileOffset;
 
-    FunctionExpression closure = new FunctionExpression(new FunctionNode(
-        closureBody,
-        typeParameters: closureTypeParameters,
-        positionalParameters: closurePositionalParameters,
-        namedParameters: closureNamedParameters,
-        requiredParameterCount: _procedure.function.requiredParameterCount - 1,
-        returnType: closureReturnType))
+    FunctionExpression closure = new FunctionExpression(
+        new FunctionNode(closureBody,
+            typeParameters: closureTypeParameters,
+            positionalParameters: closurePositionalParameters,
+            namedParameters: closureNamedParameters,
+            requiredParameterCount:
+                _procedure.function.requiredParameterCount - 1,
+            returnType: closureReturnType)
+          ..fileOffset = fileOffset
+          ..fileEndOffset = fileEndOffset)
       ..fileOffset = fileOffset;
 
     _extensionTearOff
       ..name = new Name(
           '${extensionBuilder.name}|get#${name}', libraryBuilder.library)
-      ..function = new FunctionNode(
+      ..function = (new FunctionNode(
           new ReturnStatement(closure)..fileOffset = fileOffset,
           typeParameters: tearOffTypeParameters,
           positionalParameters: [extensionThis],
           requiredParameterCount: 1,
           returnType: closure.function.computeFunctionType(library.nonNullable))
+        ..fileOffset = fileOffset
+        ..fileEndOffset = fileEndOffset)
       ..fileUri = fileUri
       ..fileOffset = fileOffset
       ..fileEndOffset = fileEndOffset;
@@ -585,6 +600,8 @@
   @override
   final SourceProcedureBuilder memberBuilder;
 
+  Covariance _covariance;
+
   SourceProcedureMember(this.memberBuilder);
 
   @override
@@ -607,6 +624,12 @@
   }
 
   @override
+  Covariance getCovariance(ClassHierarchyBuilder hierarchy) {
+    return _covariance ??=
+        new Covariance.fromMember(getMember(hierarchy), forSetter: forSetter);
+  }
+
+  @override
   bool get forSetter => isSetter;
 
   @override
@@ -657,6 +680,7 @@
             charOpenParenOffset,
             charEndOffset,
             referenceFrom,
+            /* isExtensionInstanceMember = */ false,
             nativeMethodName);
 
   @override
@@ -669,6 +693,9 @@
   Member get invokeTarget => procedure;
 
   @override
+  Iterable<Member> get exportedMembers => [procedure];
+
+  @override
   Statement get body => bodyInternal;
 
   @override
@@ -742,7 +769,7 @@
     super.buildOutlineExpressions(library, coreTypes);
     LibraryBuilder thisLibrary = this.library;
     if (thisLibrary is SourceLibraryBuilder) {
-      RedirectingFactoryBody redirectingFactoryBody = member.function.body;
+      RedirectingFactoryBody redirectingFactoryBody = procedure.function.body;
       if (redirectingFactoryBody.typeArguments != null &&
           redirectingFactoryBody.typeArguments.any((t) => t is UnknownType)) {
         TypeInferrerImpl inferrer = thisLibrary.loader.typeInferenceEngine
@@ -766,6 +793,7 @@
           List<Expression> positionalArguments = <Expression>[];
           for (VariableDeclaration parameter
               in member.function.positionalParameters) {
+            inferrer.flowAnalysis?.declare(parameter, true);
             positionalArguments.add(new VariableGetImpl(
                 parameter,
                 inferrer.typePromoter.getFactForAccess(parameter, 0),
@@ -775,6 +803,7 @@
           List<NamedExpression> namedArguments = <NamedExpression>[];
           for (VariableDeclaration parameter
               in member.function.namedParameters) {
+            inferrer.flowAnalysis?.declare(parameter, true);
             namedArguments.add(new NamedExpression(
                 parameter.name,
                 new VariableGetImpl(
diff --git a/pkg/front_end/lib/src/fasta/compiler_context.dart b/pkg/front_end/lib/src/fasta/compiler_context.dart
index 38df523..e64cd29 100644
--- a/pkg/front_end/lib/src/fasta/compiler_context.dart
+++ b/pkg/front_end/lib/src/fasta/compiler_context.dart
@@ -4,7 +4,7 @@
 
 library fasta.compiler_context;
 
-import 'dart:async' show Future, Zone, runZoned;
+import 'dart:async' show Zone, runZoned;
 
 import 'package:_fe_analyzer_shared/src/messages/severity.dart' show Severity;
 
@@ -65,8 +65,9 @@
 
   /// Report [message], for example, by printing it.
   void report(LocatedMessage message, Severity severity,
-      {List<LocatedMessage> context}) {
-    options.report(message, severity, context: context);
+      {List<LocatedMessage> context, List<Uri> involvedFiles}) {
+    options.report(message, severity,
+        context: context, involvedFiles: involvedFiles);
   }
 
   /// Report [message], for example, by printing it.
diff --git a/pkg/front_end/lib/src/fasta/crash.dart b/pkg/front_end/lib/src/fasta/crash.dart
index 8498da9..1ad20fc 100644
--- a/pkg/front_end/lib/src/fasta/crash.dart
+++ b/pkg/front_end/lib/src/fasta/crash.dart
@@ -4,8 +4,6 @@
 
 library fasta.crash;
 
-import 'dart:async' show Future;
-
 import 'dart:convert' show jsonEncode;
 
 import 'dart:io'
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_class_builder.dart b/pkg/front_end/lib/src/fasta/dill/dill_class_builder.dart
index b8afcf7..73c8433 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_class_builder.dart
@@ -4,8 +4,7 @@
 
 library fasta.dill_class_builder;
 
-import 'package:kernel/ast.dart'
-    show Class, DartType, Member, Supertype, TypeParameter;
+import 'package:kernel/ast.dart' hide MapEntry;
 
 import '../builder/class_builder.dart';
 import '../builder/library_builder.dart';
@@ -21,7 +20,7 @@
 
 import 'dill_library_builder.dart' show DillLibraryBuilder;
 
-import 'dill_member_builder.dart' show DillMemberBuilder;
+import 'dill_member_builder.dart';
 
 class DillClassBuilder extends ClassBuilderImpl {
   final Class cls;
@@ -72,14 +71,37 @@
   Class get actualCls => cls;
 
   void addMember(Member member) {
-    DillMemberBuilder builder = new DillMemberBuilder(member, this);
-    String name = member.name.text;
-    if (builder.isConstructor || builder.isFactory) {
-      constructorScopeBuilder.addMember(name, builder);
-    } else if (builder.isSetter) {
-      scopeBuilder.addSetter(name, builder);
-    } else {
+    if (member is Field) {
+      DillFieldBuilder builder = new DillFieldBuilder(member, this);
+      String name = member.name.text;
       scopeBuilder.addMember(name, builder);
+    } else if (member is Procedure) {
+      String name = member.name.text;
+      switch (member.kind) {
+        case ProcedureKind.Factory:
+          constructorScopeBuilder.addMember(
+              name, new DillFactoryBuilder(member, this));
+          break;
+        case ProcedureKind.Setter:
+          scopeBuilder.addSetter(name, new DillSetterBuilder(member, this));
+          break;
+        case ProcedureKind.Getter:
+          scopeBuilder.addMember(name, new DillGetterBuilder(member, this));
+          break;
+        case ProcedureKind.Operator:
+          scopeBuilder.addMember(name, new DillOperatorBuilder(member, this));
+          break;
+        case ProcedureKind.Method:
+          scopeBuilder.addMember(name, new DillMethodBuilder(member, this));
+          break;
+      }
+    } else if (member is Constructor) {
+      DillConstructorBuilder builder = new DillConstructorBuilder(member, this);
+      String name = member.name.text;
+      constructorScopeBuilder.addMember(name, builder);
+    } else {
+      throw new UnsupportedError(
+          "Unexpected class member ${member} (${member.runtimeType})");
     }
   }
 
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_extension_builder.dart b/pkg/front_end/lib/src/fasta/dill/dill_extension_builder.dart
index 86aaa4d..a114dc6 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_extension_builder.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_extension_builder.dart
@@ -43,31 +43,49 @@
       Name name = descriptor.name;
       switch (descriptor.kind) {
         case ExtensionMemberKind.Method:
-          _methods[name] = descriptor;
+          if (descriptor.isStatic) {
+            Procedure procedure = descriptor.member.asProcedure;
+            scopeBuilder.addMember(
+                name.text,
+                new DillExtensionStaticMethodBuilder(
+                    procedure, descriptor, this));
+          } else {
+            _methods[name] = descriptor;
+          }
           break;
         case ExtensionMemberKind.TearOff:
           _tearOffs[name] = descriptor.member.asMember;
           break;
         case ExtensionMemberKind.Getter:
-        case ExtensionMemberKind.Operator:
-        case ExtensionMemberKind.Field:
-          Member member = descriptor.member.asMember;
+          Procedure procedure = descriptor.member.asProcedure;
           scopeBuilder.addMember(name.text,
-              new DillExtensionMemberBuilder(member, descriptor, this));
+              new DillExtensionGetterBuilder(procedure, descriptor, this));
+          break;
+        case ExtensionMemberKind.Field:
+          Field field = descriptor.member.asField;
+          scopeBuilder.addMember(name.text,
+              new DillExtensionFieldBuilder(field, descriptor, this));
           break;
         case ExtensionMemberKind.Setter:
-          Member member = descriptor.member.asMember;
+          Procedure procedure = descriptor.member.asProcedure;
           scopeBuilder.addSetter(name.text,
-              new DillExtensionMemberBuilder(member, descriptor, this));
+              new DillExtensionSetterBuilder(procedure, descriptor, this));
+          break;
+        case ExtensionMemberKind.Operator:
+          Procedure procedure = descriptor.member.asProcedure;
+          scopeBuilder.addMember(name.text,
+              new DillExtensionOperatorBuilder(procedure, descriptor, this));
           break;
       }
     }
     _methods.forEach((Name name, ExtensionMemberDescriptor descriptor) {
-      Member member = descriptor.member.asMember;
+      Procedure procedure = descriptor.member.asProcedure;
+      assert(_tearOffs.containsKey(name),
+          "No tear found for ${descriptor} in ${_tearOffs}");
       scopeBuilder.addMember(
           name.text,
-          new DillExtensionMemberBuilder(
-              member, descriptor, this, _tearOffs[name]));
+          new DillExtensionInstanceMethodBuilder(
+              procedure, descriptor, this, _tearOffs[name]));
     });
   }
 
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_extension_member_builder.dart b/pkg/front_end/lib/src/fasta/dill/dill_extension_member_builder.dart
index 707eea5..02aa055 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_extension_member_builder.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_extension_member_builder.dart
@@ -8,17 +8,12 @@
 
 import '../builder/builder.dart';
 
-import '../problems.dart';
-
 import 'dill_member_builder.dart';
 
-class DillExtensionMemberBuilder extends DillMemberBuilder {
+abstract class DillExtensionMemberBuilder extends DillMemberBuilder {
   final ExtensionMemberDescriptor _descriptor;
 
-  final Member _extensionTearOff;
-
-  DillExtensionMemberBuilder(Member member, this._descriptor, Builder parent,
-      [this._extensionTearOff])
+  DillExtensionMemberBuilder(Member member, this._descriptor, Builder parent)
       : super(member, parent);
 
   @override
@@ -42,59 +37,141 @@
     }
     return null;
   }
+}
+
+class DillExtensionFieldBuilder extends DillExtensionMemberBuilder {
+  final Field field;
+
+  DillExtensionFieldBuilder(
+      this.field, ExtensionMemberDescriptor descriptor, Builder parent)
+      : super(field, descriptor, parent);
+
+  Member get member => field;
 
   @override
-  Member get readTarget {
-    if (isField) {
-      return member;
-    }
-    switch (kind) {
-      case ProcedureKind.Method:
-        return _extensionTearOff ?? member;
-      case ProcedureKind.Getter:
-        return member;
-      case ProcedureKind.Operator:
-      case ProcedureKind.Setter:
-      case ProcedureKind.Factory:
-        return null;
-    }
-    throw unhandled('ProcedureKind', '$kind', charOffset, fileUri);
-  }
+  Member get readTarget => field;
 
   @override
-  Member get writeTarget {
-    if (isField) {
-      return isAssignable ? member : null;
-    }
-    switch (kind) {
-      case ProcedureKind.Setter:
-        return member;
-      case ProcedureKind.Method:
-      case ProcedureKind.Getter:
-      case ProcedureKind.Operator:
-      case ProcedureKind.Factory:
-        return null;
-    }
-    throw unhandled('ProcedureKind', '$kind', charOffset, fileUri);
-  }
+  Member get writeTarget => isAssignable ? field : null;
 
   @override
-  Member get invokeTarget {
-    if (isField) {
-      return member;
-    }
-    switch (kind) {
-      case ProcedureKind.Method:
-      case ProcedureKind.Getter:
-      case ProcedureKind.Operator:
-      case ProcedureKind.Factory:
-        return member;
-      case ProcedureKind.Setter:
-        return null;
-    }
-    throw unhandled('ProcedureKind', '$kind', charOffset, fileUri);
-  }
+  Member get invokeTarget => field;
 
   @override
-  bool get isAssignable => member is Field && member.hasSetter;
+  bool get isField => true;
+
+  @override
+  bool get isAssignable => field.hasSetter;
+}
+
+class DillExtensionSetterBuilder extends DillExtensionMemberBuilder {
+  final Procedure procedure;
+
+  DillExtensionSetterBuilder(
+      this.procedure, ExtensionMemberDescriptor descriptor, Builder parent)
+      : assert(descriptor.kind == ExtensionMemberKind.Setter),
+        super(procedure, descriptor, parent);
+
+  Member get member => procedure;
+
+  @override
+  Member get readTarget => null;
+
+  @override
+  Member get writeTarget => procedure;
+
+  @override
+  Member get invokeTarget => null;
+}
+
+class DillExtensionGetterBuilder extends DillExtensionMemberBuilder {
+  final Procedure procedure;
+
+  DillExtensionGetterBuilder(
+      this.procedure, ExtensionMemberDescriptor descriptor, Builder parent)
+      : assert(descriptor.kind == ExtensionMemberKind.Getter),
+        super(procedure, descriptor, parent);
+
+  Member get member => procedure;
+
+  @override
+  Member get readTarget => procedure;
+
+  @override
+  Member get writeTarget => null;
+
+  @override
+  Member get invokeTarget => procedure;
+}
+
+class DillExtensionOperatorBuilder extends DillExtensionMemberBuilder {
+  final Procedure procedure;
+
+  DillExtensionOperatorBuilder(
+      this.procedure, ExtensionMemberDescriptor descriptor, Builder parent)
+      : assert(descriptor.kind == ExtensionMemberKind.Operator),
+        super(procedure, descriptor, parent);
+
+  Member get member => procedure;
+
+  @override
+  Member get readTarget => null;
+
+  @override
+  Member get writeTarget => null;
+
+  @override
+  Member get invokeTarget => procedure;
+}
+
+class DillExtensionStaticMethodBuilder extends DillExtensionMemberBuilder {
+  final Procedure procedure;
+
+  DillExtensionStaticMethodBuilder(
+      this.procedure, ExtensionMemberDescriptor descriptor, Builder parent)
+      : assert(descriptor.kind == ExtensionMemberKind.Method),
+        assert(descriptor.isStatic),
+        super(procedure, descriptor, parent);
+
+  @override
+  Member get member => procedure;
+
+  @override
+  Member get readTarget => procedure;
+
+  @override
+  Member get writeTarget => null;
+
+  @override
+  Member get invokeTarget => procedure;
+}
+
+class DillExtensionInstanceMethodBuilder extends DillExtensionMemberBuilder {
+  final Procedure procedure;
+
+  final Procedure _extensionTearOff;
+
+  DillExtensionInstanceMethodBuilder(
+      this.procedure,
+      ExtensionMemberDescriptor descriptor,
+      Builder parent,
+      this._extensionTearOff)
+      : assert(descriptor.kind == ExtensionMemberKind.Method),
+        assert(!descriptor.isStatic),
+        super(procedure, descriptor, parent);
+
+  @override
+  Member get member => procedure;
+
+  @override
+  Iterable<Member> get exportedMembers => [procedure, _extensionTearOff];
+
+  @override
+  Member get readTarget => _extensionTearOff;
+
+  @override
+  Member get writeTarget => null;
+
+  @override
+  Member get invokeTarget => procedure;
 }
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_library_builder.dart b/pkg/front_end/lib/src/fasta/dill/dill_library_builder.dart
index e36d001..08d1655 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_library_builder.dart
@@ -22,6 +22,7 @@
         NeverType,
         Nullability,
         Procedure,
+        ProcedureKind,
         Reference,
         StaticGet,
         StringConstant,
@@ -59,7 +60,7 @@
 
 import 'dill_extension_builder.dart';
 
-import 'dill_member_builder.dart' show DillMemberBuilder;
+import 'dill_member_builder.dart';
 
 import 'dill_loader.dart' show DillLoader;
 
@@ -163,6 +164,10 @@
         -1);
   }
 
+  void addSyntheticDeclarationOfNull() {
+    // The name "Null" is declared by the class Null.
+  }
+
   void addClass(Class cls) {
     DillClassBuilder classBulder = new DillClassBuilder(cls, this);
     addBuilder(cls.name, classBulder, cls.fileOffset);
@@ -187,6 +192,9 @@
   }
 
   void addMember(Member member) {
+    if (member.isExtensionMember) {
+      return null;
+    }
     String name = member.name.text;
     if (name == "_exports#") {
       Field field = member;
@@ -203,13 +211,45 @@
       unserializableExports =
           json != null ? new Map<String, String>.from(json) : null;
     } else {
-      addBuilder(name, new DillMemberBuilder(member, this), member.fileOffset);
+      if (member is Field) {
+        addBuilder(name, new DillFieldBuilder(member, this), member.fileOffset);
+      } else if (member is Procedure) {
+        switch (member.kind) {
+          case ProcedureKind.Factory:
+            addBuilder(
+                name, new DillFactoryBuilder(member, this), member.fileOffset);
+            break;
+          case ProcedureKind.Setter:
+            addBuilder(
+                name, new DillSetterBuilder(member, this), member.fileOffset);
+            break;
+          case ProcedureKind.Getter:
+            addBuilder(
+                name, new DillGetterBuilder(member, this), member.fileOffset);
+            break;
+          case ProcedureKind.Operator:
+            addBuilder(
+                name, new DillOperatorBuilder(member, this), member.fileOffset);
+            break;
+          case ProcedureKind.Method:
+            addBuilder(
+                name, new DillMethodBuilder(member, this), member.fileOffset);
+            break;
+          case ProcedureKind.Factory:
+            throw new UnsupportedError(
+                "Unexpected library procedure ${member.kind} for ${member}");
+        }
+      } else {
+        throw new UnsupportedError(
+            "Unexpected library member ${member} (${member.runtimeType})");
+      }
     }
   }
 
   @override
   Builder addBuilder(String name, Builder declaration, int charOffset) {
     if (name == null || name.isEmpty) return null;
+
     bool isSetter = declaration.isSetter;
     if (isSetter) {
       scopeBuilder.addSetter(name, declaration);
@@ -219,7 +259,7 @@
     if (declaration.isExtension) {
       scopeBuilder.addExtension(declaration);
     }
-    if (!name.startsWith("_")) {
+    if (!name.startsWith("_") && !name.contains('#')) {
       if (isSetter) {
         exportScopeBuilder.addSetter(name, declaration);
       } else {
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_loader.dart b/pkg/front_end/lib/src/fasta/dill/dill_loader.dart
index cf98a1f..2ce2498 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_loader.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_loader.dart
@@ -4,8 +4,6 @@
 
 library fasta.dill_loader;
 
-import 'dart:async' show Future;
-
 import 'package:kernel/ast.dart' show Class, Component, DartType, Library;
 
 import '../builder/class_builder.dart';
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_member_builder.dart b/pkg/front_end/lib/src/fasta/dill/dill_member_builder.dart
index d31e6dd..331b581 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_member_builder.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_member_builder.dart
@@ -13,6 +13,7 @@
 
 import '../kernel/class_hierarchy_builder.dart'
     show ClassHierarchyBuilder, ClassMember;
+import '../kernel/member_covariance.dart';
 import '../kernel/kernel_builder.dart'
     show isRedirectingGenerativeConstructorImplementation;
 
@@ -21,16 +22,17 @@
 
 import '../problems.dart' show unhandled;
 
-class DillMemberBuilder extends MemberBuilderImpl {
+abstract class DillMemberBuilder extends MemberBuilderImpl {
   final int modifiers;
 
-  final Member member;
-
   DillMemberBuilder(Member member, Builder parent)
       : modifiers = computeModifiers(member),
-        member = member,
         super(parent, member.fileOffset);
 
+  Member get member;
+
+  Iterable<Member> get exportedMembers => [member];
+
   String get debugName => "DillMemberBuilder";
 
   String get name => member.name.text;
@@ -62,67 +64,8 @@
     return member is Constructor && member.isSynthetic;
   }
 
-  bool get isField => member is Field;
-
   @override
-  bool get isAssignable => member is Field && member.hasSetter;
-
-  @override
-  Member get readTarget {
-    if (isField) {
-      return member;
-    } else if (isConstructor) {
-      return null;
-    }
-    switch (kind) {
-      case ProcedureKind.Method:
-      case ProcedureKind.Getter:
-        return member;
-      case ProcedureKind.Operator:
-      case ProcedureKind.Setter:
-      case ProcedureKind.Factory:
-        return null;
-    }
-    throw unhandled('ProcedureKind', '$kind', charOffset, fileUri);
-  }
-
-  @override
-  Member get writeTarget {
-    if (isField) {
-      return isAssignable ? member : null;
-    } else if (isConstructor) {
-      return null;
-    }
-    switch (kind) {
-      case ProcedureKind.Setter:
-        return member;
-      case ProcedureKind.Method:
-      case ProcedureKind.Getter:
-      case ProcedureKind.Operator:
-      case ProcedureKind.Factory:
-        return null;
-    }
-    throw unhandled('ProcedureKind', '$kind', charOffset, fileUri);
-  }
-
-  @override
-  Member get invokeTarget {
-    if (isField) {
-      return member;
-    } else if (isConstructor) {
-      return member;
-    }
-    switch (kind) {
-      case ProcedureKind.Method:
-      case ProcedureKind.Getter:
-      case ProcedureKind.Operator:
-      case ProcedureKind.Factory:
-        return member;
-      case ProcedureKind.Setter:
-        return null;
-    }
-    throw unhandled('ProcedureKind', '$kind', charOffset, fileUri);
-  }
+  bool get isAssignable => false;
 
   @override
   void buildMembers(
@@ -145,10 +88,145 @@
           : const <ClassMember>[];
 }
 
+class DillFieldBuilder extends DillMemberBuilder {
+  final Field field;
+
+  DillFieldBuilder(this.field, Builder parent) : super(field, parent);
+
+  Member get member => field;
+
+  @override
+  Member get readTarget => field;
+  @override
+  Member get writeTarget => isAssignable ? field : null;
+
+  @override
+  Member get invokeTarget => field;
+
+  bool get isField => true;
+
+  @override
+  bool get isAssignable => field.hasSetter;
+}
+
+class DillGetterBuilder extends DillMemberBuilder {
+  final Procedure procedure;
+
+  DillGetterBuilder(this.procedure, Builder parent)
+      : assert(procedure.kind == ProcedureKind.Getter),
+        super(procedure, parent);
+
+  Member get member => procedure;
+
+  @override
+  Member get readTarget => procedure;
+
+  @override
+  Member get writeTarget => null;
+
+  @override
+  Member get invokeTarget => procedure;
+}
+
+class DillSetterBuilder extends DillMemberBuilder {
+  final Procedure procedure;
+
+  DillSetterBuilder(this.procedure, Builder parent)
+      : assert(procedure.kind == ProcedureKind.Setter),
+        super(procedure, parent);
+
+  Member get member => procedure;
+
+  @override
+  Member get readTarget => null;
+
+  @override
+  Member get writeTarget => procedure;
+
+  @override
+  Member get invokeTarget => null;
+}
+
+class DillMethodBuilder extends DillMemberBuilder {
+  final Procedure procedure;
+
+  DillMethodBuilder(this.procedure, Builder parent)
+      : assert(procedure.kind == ProcedureKind.Method),
+        super(procedure, parent);
+
+  Member get member => procedure;
+
+  @override
+  Member get readTarget => procedure;
+
+  @override
+  Member get writeTarget => null;
+
+  @override
+  Member get invokeTarget => procedure;
+}
+
+class DillOperatorBuilder extends DillMemberBuilder {
+  final Procedure procedure;
+
+  DillOperatorBuilder(this.procedure, Builder parent)
+      : assert(procedure.kind == ProcedureKind.Operator),
+        super(procedure, parent);
+
+  Member get member => procedure;
+
+  @override
+  Member get readTarget => null;
+
+  @override
+  Member get writeTarget => null;
+
+  @override
+  Member get invokeTarget => procedure;
+}
+
+class DillFactoryBuilder extends DillMemberBuilder {
+  final Procedure procedure;
+
+  DillFactoryBuilder(this.procedure, Builder parent) : super(procedure, parent);
+
+  Member get member => procedure;
+
+  @override
+  Member get readTarget => null;
+
+  @override
+  Member get writeTarget => null;
+
+  @override
+  Member get invokeTarget => procedure;
+}
+
+class DillConstructorBuilder extends DillMemberBuilder {
+  final Constructor constructor;
+
+  DillConstructorBuilder(this.constructor, Builder parent)
+      : super(constructor, parent);
+
+  @override
+  Constructor get member => constructor;
+
+  @override
+  Member get readTarget => null;
+
+  @override
+  Member get writeTarget => null;
+
+  @override
+  Constructor get invokeTarget => constructor;
+}
+
 class DillClassMember extends BuilderClassMember {
   @override
   final DillMemberBuilder memberBuilder;
 
+  Covariance _covariance;
+
   @override
   final bool forSetter;
 
@@ -179,6 +257,15 @@
   }
 
   @override
+  Member getMember(ClassHierarchyBuilder hierarchy) => memberBuilder.member;
+
+  @override
+  Covariance getCovariance(ClassHierarchyBuilder hierarchy) {
+    return _covariance ??=
+        new Covariance.fromMember(memberBuilder.member, forSetter: forSetter);
+  }
+
+  @override
   bool get isFunction => !isProperty;
 
   @override
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_target.dart b/pkg/front_end/lib/src/fasta/dill/dill_target.dart
index 717c348..52fa515 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_target.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_target.dart
@@ -4,8 +4,6 @@
 
 library fasta.dill_target;
 
-import 'dart:async' show Future;
-
 import 'package:front_end/src/fasta/builder/library_builder.dart'
     show LibraryBuilder;
 
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_type_alias_builder.dart b/pkg/front_end/lib/src/fasta/dill/dill_type_alias_builder.dart
index 2bbe28c..9cf8bad 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_type_alias_builder.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_type_alias_builder.dart
@@ -4,8 +4,7 @@
 
 library fasta.dill_typedef_builder;
 
-import 'package:kernel/ast.dart'
-    show DartType, InterfaceType, InvalidType, Typedef;
+import 'package:kernel/ast.dart' show DartType, InvalidType, NullType, Typedef;
 
 import '../builder/library_builder.dart';
 import '../builder/metadata_builder.dart';
@@ -90,14 +89,5 @@
   }
 
   @override
-  bool get isNullAlias {
-    DartType dartType = typedef.type;
-    if (dartType is InterfaceType) {
-      Uri importUri = dartType.classNode.enclosingLibrary.importUri;
-      return dartType.classNode.name == "Null" &&
-          importUri.scheme == "dart" &&
-          importUri.path == "core";
-    }
-    return false;
-  }
+  bool get isNullAlias => typedef.type is NullType;
 }
diff --git a/pkg/front_end/lib/src/fasta/fasta_codes_cfe_generated.dart b/pkg/front_end/lib/src/fasta/fasta_codes_cfe_generated.dart
index 3e928df..64581cce 100644
--- a/pkg/front_end/lib/src/fasta/fasta_codes_cfe_generated.dart
+++ b/pkg/front_end/lib/src/fasta/fasta_codes_cfe_generated.dart
@@ -206,6 +206,160 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
+        Message Function(
+            DartType _type, DartType _type2, bool isNonNullableByDefault)>
+    templateArgumentTypeNotAssignableNullability = const Template<
+            Message Function(
+                DartType _type, DartType _type2, bool isNonNullableByDefault)>(
+        messageTemplate:
+            r"""The argument type '#type' can't be assigned to the parameter type '#type2' because '#type' is nullable and '#type2' isn't.""",
+        withArguments: _withArgumentsArgumentTypeNotAssignableNullability);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<
+        Message Function(
+            DartType _type, DartType _type2, bool isNonNullableByDefault)>
+    codeArgumentTypeNotAssignableNullability = const Code<
+            Message Function(
+                DartType _type, DartType _type2, bool isNonNullableByDefault)>(
+        "ArgumentTypeNotAssignableNullability",
+        templateArgumentTypeNotAssignableNullability,
+        analyzerCodes: <String>["ARGUMENT_TYPE_NOT_ASSIGNABLE"]);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsArgumentTypeNotAssignableNullability(
+    DartType _type, DartType _type2, bool isNonNullableByDefault) {
+  TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
+  List<Object> typeParts = labeler.labelType(_type);
+  List<Object> type2Parts = labeler.labelType(_type2);
+  String type = typeParts.join();
+  String type2 = type2Parts.join();
+  return new Message(codeArgumentTypeNotAssignableNullability,
+      message:
+          """The argument type '${type}' can't be assigned to the parameter type '${type2}' because '${type}' is nullable and '${type2}' isn't.""" +
+              labeler.originMessages,
+      arguments: {'type': _type, 'type2': _type2});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<Message Function(DartType _type, bool isNonNullableByDefault)>
+    templateArgumentTypeNotAssignableNullabilityNull = const Template<
+            Message Function(DartType _type, bool isNonNullableByDefault)>(
+        messageTemplate:
+            r"""The value 'null' can't be assigned to the parameter type '#type' because '#type' is not nullable.""",
+        withArguments: _withArgumentsArgumentTypeNotAssignableNullabilityNull);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(DartType _type, bool isNonNullableByDefault)>
+    codeArgumentTypeNotAssignableNullabilityNull =
+    const Code<Message Function(DartType _type, bool isNonNullableByDefault)>(
+        "ArgumentTypeNotAssignableNullabilityNull",
+        templateArgumentTypeNotAssignableNullabilityNull,
+        analyzerCodes: <String>["ARGUMENT_TYPE_NOT_ASSIGNABLE"]);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsArgumentTypeNotAssignableNullabilityNull(
+    DartType _type, bool isNonNullableByDefault) {
+  TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
+  List<Object> typeParts = labeler.labelType(_type);
+  String type = typeParts.join();
+  return new Message(codeArgumentTypeNotAssignableNullabilityNull,
+      message:
+          """The value 'null' can't be assigned to the parameter type '${type}' because '${type}' is not nullable.""" +
+              labeler.originMessages,
+      arguments: {'type': _type});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+        Message Function(
+            DartType _type, DartType _type2, bool isNonNullableByDefault)>
+    templateArgumentTypeNotAssignableNullabilityNullType = const Template<
+            Message Function(
+                DartType _type, DartType _type2, bool isNonNullableByDefault)>(
+        messageTemplate:
+            r"""The argument type '#type' can't be assigned to the parameter type '#type2' because '#type2' is not nullable.""",
+        withArguments:
+            _withArgumentsArgumentTypeNotAssignableNullabilityNullType);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<
+        Message Function(
+            DartType _type, DartType _type2, bool isNonNullableByDefault)>
+    codeArgumentTypeNotAssignableNullabilityNullType = const Code<
+            Message Function(
+                DartType _type, DartType _type2, bool isNonNullableByDefault)>(
+        "ArgumentTypeNotAssignableNullabilityNullType",
+        templateArgumentTypeNotAssignableNullabilityNullType,
+        analyzerCodes: <String>["ARGUMENT_TYPE_NOT_ASSIGNABLE"]);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsArgumentTypeNotAssignableNullabilityNullType(
+    DartType _type, DartType _type2, bool isNonNullableByDefault) {
+  TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
+  List<Object> typeParts = labeler.labelType(_type);
+  List<Object> type2Parts = labeler.labelType(_type2);
+  String type = typeParts.join();
+  String type2 = type2Parts.join();
+  return new Message(codeArgumentTypeNotAssignableNullabilityNullType,
+      message:
+          """The argument type '${type}' can't be assigned to the parameter type '${type2}' because '${type2}' is not nullable.""" +
+              labeler.originMessages,
+      arguments: {'type': _type, 'type2': _type2});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+        Message Function(DartType _type, DartType _type2, DartType _type3,
+            DartType _type4, bool isNonNullableByDefault)>
+    templateArgumentTypeNotAssignablePartNullability = const Template<
+            Message Function(DartType _type, DartType _type2, DartType _type3,
+                DartType _type4, bool isNonNullableByDefault)>(
+        messageTemplate:
+            r"""The argument type '#type' can't be assigned to the parameter type '#type2' because '#type3' is nullable and '#type4' isn't.""",
+        withArguments: _withArgumentsArgumentTypeNotAssignablePartNullability);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<
+        Message Function(DartType _type, DartType _type2, DartType _type3,
+            DartType _type4, bool isNonNullableByDefault)>
+    codeArgumentTypeNotAssignablePartNullability = const Code<
+            Message Function(DartType _type, DartType _type2, DartType _type3,
+                DartType _type4, bool isNonNullableByDefault)>(
+        "ArgumentTypeNotAssignablePartNullability",
+        templateArgumentTypeNotAssignablePartNullability,
+        analyzerCodes: <String>["ARGUMENT_TYPE_NOT_ASSIGNABLE"]);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsArgumentTypeNotAssignablePartNullability(
+    DartType _type,
+    DartType _type2,
+    DartType _type3,
+    DartType _type4,
+    bool isNonNullableByDefault) {
+  TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
+  List<Object> typeParts = labeler.labelType(_type);
+  List<Object> type2Parts = labeler.labelType(_type2);
+  List<Object> type3Parts = labeler.labelType(_type3);
+  List<Object> type4Parts = labeler.labelType(_type4);
+  String type = typeParts.join();
+  String type2 = type2Parts.join();
+  String type3 = type3Parts.join();
+  String type4 = type4Parts.join();
+  return new Message(codeArgumentTypeNotAssignablePartNullability,
+      message:
+          """The argument type '${type}' can't be assigned to the parameter type '${type2}' because '${type3}' is nullable and '${type4}' isn't.""" +
+              labeler.originMessages,
+      arguments: {
+        'type': _type,
+        'type2': _type2,
+        'type3': _type3,
+        'type4': _type4
+      });
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
         Message Function(Constant _constant, bool isNonNullableByDefault)>
     templateConstEvalCaseImplementsEqual = const Template<
             Message Function(Constant _constant, bool isNonNullableByDefault)>(
@@ -967,6 +1121,99 @@
 const Template<
         Message Function(
             DartType _type, DartType _type2, bool isNonNullableByDefault)>
+    templateForInLoopElementTypeNotAssignableNullability = const Template<
+            Message Function(
+                DartType _type, DartType _type2, bool isNonNullableByDefault)>(
+        messageTemplate:
+            r"""A value of type '#type' can't be assigned to a variable of type '#type2' because '#type' is nullable and '#type2' isn't.""",
+        tipTemplate: r"""Try changing the type of the variable.""",
+        withArguments:
+            _withArgumentsForInLoopElementTypeNotAssignableNullability);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<
+        Message Function(
+            DartType _type, DartType _type2, bool isNonNullableByDefault)>
+    codeForInLoopElementTypeNotAssignableNullability = const Code<
+            Message Function(
+                DartType _type, DartType _type2, bool isNonNullableByDefault)>(
+        "ForInLoopElementTypeNotAssignableNullability",
+        templateForInLoopElementTypeNotAssignableNullability,
+        analyzerCodes: <String>["FOR_IN_OF_INVALID_ELEMENT_TYPE"]);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsForInLoopElementTypeNotAssignableNullability(
+    DartType _type, DartType _type2, bool isNonNullableByDefault) {
+  TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
+  List<Object> typeParts = labeler.labelType(_type);
+  List<Object> type2Parts = labeler.labelType(_type2);
+  String type = typeParts.join();
+  String type2 = type2Parts.join();
+  return new Message(codeForInLoopElementTypeNotAssignableNullability,
+      message:
+          """A value of type '${type}' can't be assigned to a variable of type '${type2}' because '${type}' is nullable and '${type2}' isn't.""" +
+              labeler.originMessages,
+      tip: """Try changing the type of the variable.""",
+      arguments: {'type': _type, 'type2': _type2});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+        Message Function(DartType _type, DartType _type2, DartType _type3,
+            DartType _type4, bool isNonNullableByDefault)>
+    templateForInLoopElementTypeNotAssignablePartNullability = const Template<
+            Message Function(DartType _type, DartType _type2, DartType _type3,
+                DartType _type4, bool isNonNullableByDefault)>(
+        messageTemplate:
+            r"""A value of type '#type' can't be assigned to a variable of type '#type2' because '#type3' is nullable and '#type4' isn't.""",
+        tipTemplate: r"""Try changing the type of the variable.""",
+        withArguments:
+            _withArgumentsForInLoopElementTypeNotAssignablePartNullability);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<
+        Message Function(DartType _type, DartType _type2, DartType _type3,
+            DartType _type4, bool isNonNullableByDefault)>
+    codeForInLoopElementTypeNotAssignablePartNullability = const Code<
+            Message Function(DartType _type, DartType _type2, DartType _type3,
+                DartType _type4, bool isNonNullableByDefault)>(
+        "ForInLoopElementTypeNotAssignablePartNullability",
+        templateForInLoopElementTypeNotAssignablePartNullability,
+        analyzerCodes: <String>["FOR_IN_OF_INVALID_ELEMENT_TYPE"]);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsForInLoopElementTypeNotAssignablePartNullability(
+    DartType _type,
+    DartType _type2,
+    DartType _type3,
+    DartType _type4,
+    bool isNonNullableByDefault) {
+  TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
+  List<Object> typeParts = labeler.labelType(_type);
+  List<Object> type2Parts = labeler.labelType(_type2);
+  List<Object> type3Parts = labeler.labelType(_type3);
+  List<Object> type4Parts = labeler.labelType(_type4);
+  String type = typeParts.join();
+  String type2 = type2Parts.join();
+  String type3 = type3Parts.join();
+  String type4 = type4Parts.join();
+  return new Message(codeForInLoopElementTypeNotAssignablePartNullability,
+      message:
+          """A value of type '${type}' can't be assigned to a variable of type '${type2}' because '${type3}' is nullable and '${type4}' isn't.""" +
+              labeler.originMessages,
+      tip: """Try changing the type of the variable.""",
+      arguments: {
+        'type': _type,
+        'type2': _type2,
+        'type3': _type3,
+        'type4': _type4
+      });
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+        Message Function(
+            DartType _type, DartType _type2, bool isNonNullableByDefault)>
     templateForInLoopTypeNotIterable = const Template<
             Message Function(
                 DartType _type, DartType _type2, bool isNonNullableByDefault)>(
@@ -1000,6 +1247,93 @@
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+        Message Function(
+            DartType _type, DartType _type2, bool isNonNullableByDefault)>
+    templateForInLoopTypeNotIterableNullability = const Template<
+            Message Function(
+                DartType _type, DartType _type2, bool isNonNullableByDefault)>(
+        messageTemplate:
+            r"""The type '#type' used in the 'for' loop must implement '#type2' because '#type' is nullable and '#type2' isn't.""",
+        withArguments: _withArgumentsForInLoopTypeNotIterableNullability);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<
+        Message Function(
+            DartType _type, DartType _type2, bool isNonNullableByDefault)>
+    codeForInLoopTypeNotIterableNullability = const Code<
+            Message Function(
+                DartType _type, DartType _type2, bool isNonNullableByDefault)>(
+        "ForInLoopTypeNotIterableNullability",
+        templateForInLoopTypeNotIterableNullability,
+        analyzerCodes: <String>["FOR_IN_OF_INVALID_TYPE"]);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsForInLoopTypeNotIterableNullability(
+    DartType _type, DartType _type2, bool isNonNullableByDefault) {
+  TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
+  List<Object> typeParts = labeler.labelType(_type);
+  List<Object> type2Parts = labeler.labelType(_type2);
+  String type = typeParts.join();
+  String type2 = type2Parts.join();
+  return new Message(codeForInLoopTypeNotIterableNullability,
+      message:
+          """The type '${type}' used in the 'for' loop must implement '${type2}' because '${type}' is nullable and '${type2}' isn't.""" +
+              labeler.originMessages,
+      arguments: {'type': _type, 'type2': _type2});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+        Message Function(DartType _type, DartType _type2, DartType _type3,
+            DartType _type4, bool isNonNullableByDefault)>
+    templateForInLoopTypeNotIterablePartNullability = const Template<
+            Message Function(DartType _type, DartType _type2, DartType _type3,
+                DartType _type4, bool isNonNullableByDefault)>(
+        messageTemplate:
+            r"""The type '#type' used in the 'for' loop must implement '#type2' because '#type3' is nullable and '#type4' isn't.""",
+        withArguments: _withArgumentsForInLoopTypeNotIterablePartNullability);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<
+        Message Function(DartType _type, DartType _type2, DartType _type3,
+            DartType _type4, bool isNonNullableByDefault)>
+    codeForInLoopTypeNotIterablePartNullability = const Code<
+            Message Function(DartType _type, DartType _type2, DartType _type3,
+                DartType _type4, bool isNonNullableByDefault)>(
+        "ForInLoopTypeNotIterablePartNullability",
+        templateForInLoopTypeNotIterablePartNullability,
+        analyzerCodes: <String>["FOR_IN_OF_INVALID_TYPE"]);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsForInLoopTypeNotIterablePartNullability(
+    DartType _type,
+    DartType _type2,
+    DartType _type3,
+    DartType _type4,
+    bool isNonNullableByDefault) {
+  TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
+  List<Object> typeParts = labeler.labelType(_type);
+  List<Object> type2Parts = labeler.labelType(_type2);
+  List<Object> type3Parts = labeler.labelType(_type3);
+  List<Object> type4Parts = labeler.labelType(_type4);
+  String type = typeParts.join();
+  String type2 = type2Parts.join();
+  String type3 = type3Parts.join();
+  String type4 = type4Parts.join();
+  return new Message(codeForInLoopTypeNotIterablePartNullability,
+      message:
+          """The type '${type}' used in the 'for' loop must implement '${type2}' because '${type3}' is nullable and '${type4}' isn't.""" +
+              labeler.originMessages,
+      arguments: {
+        'type': _type,
+        'type2': _type2,
+        'type3': _type3,
+        'type4': _type4
+      });
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(DartType _type, bool isNonNullableByDefault)>
     templateGenericFunctionTypeInferredAsActualTypeArgument = const Template<
             Message Function(DartType _type, bool isNonNullableByDefault)>(
@@ -1034,32 +1368,6 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(DartType _type, bool isNonNullableByDefault)>
-    templateIllegalRecursiveType = const Template<
-            Message Function(DartType _type, bool isNonNullableByDefault)>(
-        messageTemplate: r"""Illegal recursive type '#type'.""",
-        withArguments: _withArgumentsIllegalRecursiveType);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(DartType _type, bool isNonNullableByDefault)>
-    codeIllegalRecursiveType =
-    const Code<Message Function(DartType _type, bool isNonNullableByDefault)>(
-  "IllegalRecursiveType",
-  templateIllegalRecursiveType,
-);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsIllegalRecursiveType(
-    DartType _type, bool isNonNullableByDefault) {
-  TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
-  List<Object> typeParts = labeler.labelType(_type);
-  String type = typeParts.join();
-  return new Message(codeIllegalRecursiveType,
-      message: """Illegal recursive type '${type}'.""" + labeler.originMessages,
-      arguments: {'type': _type});
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<Message Function(DartType _type, bool isNonNullableByDefault)>
     templateImplicitCallOfNonMethod = const Template<
             Message Function(DartType _type, bool isNonNullableByDefault)>(
         messageTemplate:
@@ -1701,6 +2009,159 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
+        Message Function(
+            DartType _type, DartType _type2, bool isNonNullableByDefault)>
+    templateInvalidAssignmentErrorNullability = const Template<
+            Message Function(
+                DartType _type, DartType _type2, bool isNonNullableByDefault)>(
+        messageTemplate:
+            r"""A value of type '#type' can't be assigned to a variable of type '#type2' because '#type' is nullable and '#type2' isn't.""",
+        withArguments: _withArgumentsInvalidAssignmentErrorNullability);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<
+        Message Function(
+            DartType _type, DartType _type2, bool isNonNullableByDefault)>
+    codeInvalidAssignmentErrorNullability = const Code<
+            Message Function(
+                DartType _type, DartType _type2, bool isNonNullableByDefault)>(
+        "InvalidAssignmentErrorNullability",
+        templateInvalidAssignmentErrorNullability,
+        analyzerCodes: <String>["INVALID_ASSIGNMENT"]);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsInvalidAssignmentErrorNullability(
+    DartType _type, DartType _type2, bool isNonNullableByDefault) {
+  TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
+  List<Object> typeParts = labeler.labelType(_type);
+  List<Object> type2Parts = labeler.labelType(_type2);
+  String type = typeParts.join();
+  String type2 = type2Parts.join();
+  return new Message(codeInvalidAssignmentErrorNullability,
+      message:
+          """A value of type '${type}' can't be assigned to a variable of type '${type2}' because '${type}' is nullable and '${type2}' isn't.""" +
+              labeler.originMessages,
+      arguments: {'type': _type, 'type2': _type2});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<Message Function(DartType _type, bool isNonNullableByDefault)>
+    templateInvalidAssignmentErrorNullabilityNull = const Template<
+            Message Function(DartType _type, bool isNonNullableByDefault)>(
+        messageTemplate:
+            r"""The value 'null' can't be assigned to a variable of type '#type' because '#type' is not nullable.""",
+        withArguments: _withArgumentsInvalidAssignmentErrorNullabilityNull);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(DartType _type, bool isNonNullableByDefault)>
+    codeInvalidAssignmentErrorNullabilityNull =
+    const Code<Message Function(DartType _type, bool isNonNullableByDefault)>(
+        "InvalidAssignmentErrorNullabilityNull",
+        templateInvalidAssignmentErrorNullabilityNull,
+        analyzerCodes: <String>["INVALID_ASSIGNMENT"]);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsInvalidAssignmentErrorNullabilityNull(
+    DartType _type, bool isNonNullableByDefault) {
+  TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
+  List<Object> typeParts = labeler.labelType(_type);
+  String type = typeParts.join();
+  return new Message(codeInvalidAssignmentErrorNullabilityNull,
+      message:
+          """The value 'null' can't be assigned to a variable of type '${type}' because '${type}' is not nullable.""" +
+              labeler.originMessages,
+      arguments: {'type': _type});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+        Message Function(
+            DartType _type, DartType _type2, bool isNonNullableByDefault)>
+    templateInvalidAssignmentErrorNullabilityNullType = const Template<
+            Message Function(
+                DartType _type, DartType _type2, bool isNonNullableByDefault)>(
+        messageTemplate:
+            r"""A value of type '#type' can't be assigned to a variable of type '#type2' because '#type2' is not nullable.""",
+        withArguments: _withArgumentsInvalidAssignmentErrorNullabilityNullType);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<
+        Message Function(
+            DartType _type, DartType _type2, bool isNonNullableByDefault)>
+    codeInvalidAssignmentErrorNullabilityNullType = const Code<
+            Message Function(
+                DartType _type, DartType _type2, bool isNonNullableByDefault)>(
+        "InvalidAssignmentErrorNullabilityNullType",
+        templateInvalidAssignmentErrorNullabilityNullType,
+        analyzerCodes: <String>["INVALID_ASSIGNMENT"]);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsInvalidAssignmentErrorNullabilityNullType(
+    DartType _type, DartType _type2, bool isNonNullableByDefault) {
+  TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
+  List<Object> typeParts = labeler.labelType(_type);
+  List<Object> type2Parts = labeler.labelType(_type2);
+  String type = typeParts.join();
+  String type2 = type2Parts.join();
+  return new Message(codeInvalidAssignmentErrorNullabilityNullType,
+      message:
+          """A value of type '${type}' can't be assigned to a variable of type '${type2}' because '${type2}' is not nullable.""" +
+              labeler.originMessages,
+      arguments: {'type': _type, 'type2': _type2});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+        Message Function(DartType _type, DartType _type2, DartType _type3,
+            DartType _type4, bool isNonNullableByDefault)>
+    templateInvalidAssignmentErrorPartNullability = const Template<
+            Message Function(DartType _type, DartType _type2, DartType _type3,
+                DartType _type4, bool isNonNullableByDefault)>(
+        messageTemplate:
+            r"""A value of type '#type' can't be assigned to a variable of type '#type2' because '#type3' is nullable and '#type4' isn't.""",
+        withArguments: _withArgumentsInvalidAssignmentErrorPartNullability);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<
+        Message Function(DartType _type, DartType _type2, DartType _type3,
+            DartType _type4, bool isNonNullableByDefault)>
+    codeInvalidAssignmentErrorPartNullability = const Code<
+            Message Function(DartType _type, DartType _type2, DartType _type3,
+                DartType _type4, bool isNonNullableByDefault)>(
+        "InvalidAssignmentErrorPartNullability",
+        templateInvalidAssignmentErrorPartNullability,
+        analyzerCodes: <String>["INVALID_ASSIGNMENT"]);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsInvalidAssignmentErrorPartNullability(
+    DartType _type,
+    DartType _type2,
+    DartType _type3,
+    DartType _type4,
+    bool isNonNullableByDefault) {
+  TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
+  List<Object> typeParts = labeler.labelType(_type);
+  List<Object> type2Parts = labeler.labelType(_type2);
+  List<Object> type3Parts = labeler.labelType(_type3);
+  List<Object> type4Parts = labeler.labelType(_type4);
+  String type = typeParts.join();
+  String type2 = type2Parts.join();
+  String type3 = type3Parts.join();
+  String type4 = type4Parts.join();
+  return new Message(codeInvalidAssignmentErrorPartNullability,
+      message:
+          """A value of type '${type}' can't be assigned to a variable of type '${type2}' because '${type3}' is nullable and '${type4}' isn't.""" +
+              labeler.originMessages,
+      arguments: {
+        'type': _type,
+        'type2': _type2,
+        'type3': _type3,
+        'type4': _type4
+      });
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
     Message Function(
         DartType _type,
         DartType _type2,
@@ -2806,6 +3267,312 @@
 const Template<
         Message Function(
             DartType _type, DartType _type2, bool isNonNullableByDefault)>
+    templateInvalidReturnAsyncNullability = const Template<
+            Message Function(
+                DartType _type, DartType _type2, bool isNonNullableByDefault)>(
+        messageTemplate:
+            r"""A value of type '#type' can't be returned from an async function with return type '#type2' because '#type' is nullable and '#type2' isn't.""",
+        withArguments: _withArgumentsInvalidReturnAsyncNullability);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<
+        Message Function(
+            DartType _type, DartType _type2, bool isNonNullableByDefault)>
+    codeInvalidReturnAsyncNullability = const Code<
+        Message Function(
+            DartType _type, DartType _type2, bool isNonNullableByDefault)>(
+  "InvalidReturnAsyncNullability",
+  templateInvalidReturnAsyncNullability,
+);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsInvalidReturnAsyncNullability(
+    DartType _type, DartType _type2, bool isNonNullableByDefault) {
+  TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
+  List<Object> typeParts = labeler.labelType(_type);
+  List<Object> type2Parts = labeler.labelType(_type2);
+  String type = typeParts.join();
+  String type2 = type2Parts.join();
+  return new Message(codeInvalidReturnAsyncNullability,
+      message:
+          """A value of type '${type}' can't be returned from an async function with return type '${type2}' because '${type}' is nullable and '${type2}' isn't.""" +
+              labeler.originMessages,
+      arguments: {'type': _type, 'type2': _type2});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<Message Function(DartType _type, bool isNonNullableByDefault)>
+    templateInvalidReturnAsyncNullabilityNull = const Template<
+            Message Function(DartType _type, bool isNonNullableByDefault)>(
+        messageTemplate:
+            r"""The value 'null' can't be returned from an async function with return type '#type' because '#type' is not nullable.""",
+        withArguments: _withArgumentsInvalidReturnAsyncNullabilityNull);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(DartType _type, bool isNonNullableByDefault)>
+    codeInvalidReturnAsyncNullabilityNull =
+    const Code<Message Function(DartType _type, bool isNonNullableByDefault)>(
+  "InvalidReturnAsyncNullabilityNull",
+  templateInvalidReturnAsyncNullabilityNull,
+);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsInvalidReturnAsyncNullabilityNull(
+    DartType _type, bool isNonNullableByDefault) {
+  TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
+  List<Object> typeParts = labeler.labelType(_type);
+  String type = typeParts.join();
+  return new Message(codeInvalidReturnAsyncNullabilityNull,
+      message:
+          """The value 'null' can't be returned from an async function with return type '${type}' because '${type}' is not nullable.""" +
+              labeler.originMessages,
+      arguments: {'type': _type});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+        Message Function(
+            DartType _type, DartType _type2, bool isNonNullableByDefault)>
+    templateInvalidReturnAsyncNullabilityNullType = const Template<
+            Message Function(
+                DartType _type, DartType _type2, bool isNonNullableByDefault)>(
+        messageTemplate:
+            r"""A value of type '#type' can't be returned from an async function with return type '#type2' because '#type2' is not nullable.""",
+        withArguments: _withArgumentsInvalidReturnAsyncNullabilityNullType);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<
+        Message Function(
+            DartType _type, DartType _type2, bool isNonNullableByDefault)>
+    codeInvalidReturnAsyncNullabilityNullType = const Code<
+        Message Function(
+            DartType _type, DartType _type2, bool isNonNullableByDefault)>(
+  "InvalidReturnAsyncNullabilityNullType",
+  templateInvalidReturnAsyncNullabilityNullType,
+);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsInvalidReturnAsyncNullabilityNullType(
+    DartType _type, DartType _type2, bool isNonNullableByDefault) {
+  TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
+  List<Object> typeParts = labeler.labelType(_type);
+  List<Object> type2Parts = labeler.labelType(_type2);
+  String type = typeParts.join();
+  String type2 = type2Parts.join();
+  return new Message(codeInvalidReturnAsyncNullabilityNullType,
+      message:
+          """A value of type '${type}' can't be returned from an async function with return type '${type2}' because '${type2}' is not nullable.""" +
+              labeler.originMessages,
+      arguments: {'type': _type, 'type2': _type2});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+        Message Function(DartType _type, DartType _type2, DartType _type3,
+            DartType _type4, bool isNonNullableByDefault)>
+    templateInvalidReturnAsyncPartNullability = const Template<
+            Message Function(DartType _type, DartType _type2, DartType _type3,
+                DartType _type4, bool isNonNullableByDefault)>(
+        messageTemplate:
+            r"""A value of type '#type' can't be returned from an async function with return type '#type2' because '#type3' is nullable and '#type4' isn't.""",
+        withArguments: _withArgumentsInvalidReturnAsyncPartNullability);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<
+        Message Function(DartType _type, DartType _type2, DartType _type3,
+            DartType _type4, bool isNonNullableByDefault)>
+    codeInvalidReturnAsyncPartNullability = const Code<
+        Message Function(DartType _type, DartType _type2, DartType _type3,
+            DartType _type4, bool isNonNullableByDefault)>(
+  "InvalidReturnAsyncPartNullability",
+  templateInvalidReturnAsyncPartNullability,
+);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsInvalidReturnAsyncPartNullability(
+    DartType _type,
+    DartType _type2,
+    DartType _type3,
+    DartType _type4,
+    bool isNonNullableByDefault) {
+  TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
+  List<Object> typeParts = labeler.labelType(_type);
+  List<Object> type2Parts = labeler.labelType(_type2);
+  List<Object> type3Parts = labeler.labelType(_type3);
+  List<Object> type4Parts = labeler.labelType(_type4);
+  String type = typeParts.join();
+  String type2 = type2Parts.join();
+  String type3 = type3Parts.join();
+  String type4 = type4Parts.join();
+  return new Message(codeInvalidReturnAsyncPartNullability,
+      message:
+          """A value of type '${type}' can't be returned from an async function with return type '${type2}' because '${type3}' is nullable and '${type4}' isn't.""" +
+              labeler.originMessages,
+      arguments: {
+        'type': _type,
+        'type2': _type2,
+        'type3': _type3,
+        'type4': _type4
+      });
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+        Message Function(
+            DartType _type, DartType _type2, bool isNonNullableByDefault)>
+    templateInvalidReturnNullability = const Template<
+            Message Function(
+                DartType _type, DartType _type2, bool isNonNullableByDefault)>(
+        messageTemplate:
+            r"""A value of type '#type' can't be returned from a function with return type '#type2' because '#type' is nullable and '#type2' isn't.""",
+        withArguments: _withArgumentsInvalidReturnNullability);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<
+        Message Function(
+            DartType _type, DartType _type2, bool isNonNullableByDefault)>
+    codeInvalidReturnNullability = const Code<
+        Message Function(
+            DartType _type, DartType _type2, bool isNonNullableByDefault)>(
+  "InvalidReturnNullability",
+  templateInvalidReturnNullability,
+);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsInvalidReturnNullability(
+    DartType _type, DartType _type2, bool isNonNullableByDefault) {
+  TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
+  List<Object> typeParts = labeler.labelType(_type);
+  List<Object> type2Parts = labeler.labelType(_type2);
+  String type = typeParts.join();
+  String type2 = type2Parts.join();
+  return new Message(codeInvalidReturnNullability,
+      message:
+          """A value of type '${type}' can't be returned from a function with return type '${type2}' because '${type}' is nullable and '${type2}' isn't.""" +
+              labeler.originMessages,
+      arguments: {'type': _type, 'type2': _type2});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<Message Function(DartType _type, bool isNonNullableByDefault)>
+    templateInvalidReturnNullabilityNull = const Template<
+            Message Function(DartType _type, bool isNonNullableByDefault)>(
+        messageTemplate:
+            r"""The value 'null' can't be returned from a function with return type '#type' because '#type' is not nullable.""",
+        withArguments: _withArgumentsInvalidReturnNullabilityNull);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(DartType _type, bool isNonNullableByDefault)>
+    codeInvalidReturnNullabilityNull =
+    const Code<Message Function(DartType _type, bool isNonNullableByDefault)>(
+  "InvalidReturnNullabilityNull",
+  templateInvalidReturnNullabilityNull,
+);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsInvalidReturnNullabilityNull(
+    DartType _type, bool isNonNullableByDefault) {
+  TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
+  List<Object> typeParts = labeler.labelType(_type);
+  String type = typeParts.join();
+  return new Message(codeInvalidReturnNullabilityNull,
+      message:
+          """The value 'null' can't be returned from a function with return type '${type}' because '${type}' is not nullable.""" +
+              labeler.originMessages,
+      arguments: {'type': _type});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+        Message Function(
+            DartType _type, DartType _type2, bool isNonNullableByDefault)>
+    templateInvalidReturnNullabilityNullType = const Template<
+            Message Function(
+                DartType _type, DartType _type2, bool isNonNullableByDefault)>(
+        messageTemplate:
+            r"""A value of type '#type' can't be returned from a function with return type '#type2' because '#type2' is not nullable.""",
+        withArguments: _withArgumentsInvalidReturnNullabilityNullType);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<
+        Message Function(
+            DartType _type, DartType _type2, bool isNonNullableByDefault)>
+    codeInvalidReturnNullabilityNullType = const Code<
+        Message Function(
+            DartType _type, DartType _type2, bool isNonNullableByDefault)>(
+  "InvalidReturnNullabilityNullType",
+  templateInvalidReturnNullabilityNullType,
+);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsInvalidReturnNullabilityNullType(
+    DartType _type, DartType _type2, bool isNonNullableByDefault) {
+  TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
+  List<Object> typeParts = labeler.labelType(_type);
+  List<Object> type2Parts = labeler.labelType(_type2);
+  String type = typeParts.join();
+  String type2 = type2Parts.join();
+  return new Message(codeInvalidReturnNullabilityNullType,
+      message:
+          """A value of type '${type}' can't be returned from a function with return type '${type2}' because '${type2}' is not nullable.""" +
+              labeler.originMessages,
+      arguments: {'type': _type, 'type2': _type2});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+        Message Function(DartType _type, DartType _type2, DartType _type3,
+            DartType _type4, bool isNonNullableByDefault)>
+    templateInvalidReturnPartNullability = const Template<
+            Message Function(DartType _type, DartType _type2, DartType _type3,
+                DartType _type4, bool isNonNullableByDefault)>(
+        messageTemplate:
+            r"""A value of type '#type' can't be returned from a function with return type '#type2' because '#type3' is nullable and '#type4' isn't.""",
+        withArguments: _withArgumentsInvalidReturnPartNullability);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<
+        Message Function(DartType _type, DartType _type2, DartType _type3,
+            DartType _type4, bool isNonNullableByDefault)>
+    codeInvalidReturnPartNullability = const Code<
+        Message Function(DartType _type, DartType _type2, DartType _type3,
+            DartType _type4, bool isNonNullableByDefault)>(
+  "InvalidReturnPartNullability",
+  templateInvalidReturnPartNullability,
+);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsInvalidReturnPartNullability(
+    DartType _type,
+    DartType _type2,
+    DartType _type3,
+    DartType _type4,
+    bool isNonNullableByDefault) {
+  TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
+  List<Object> typeParts = labeler.labelType(_type);
+  List<Object> type2Parts = labeler.labelType(_type2);
+  List<Object> type3Parts = labeler.labelType(_type3);
+  List<Object> type4Parts = labeler.labelType(_type4);
+  String type = typeParts.join();
+  String type2 = type2Parts.join();
+  String type3 = type3Parts.join();
+  String type4 = type4Parts.join();
+  return new Message(codeInvalidReturnPartNullability,
+      message:
+          """A value of type '${type}' can't be returned from a function with return type '${type2}' because '${type3}' is nullable and '${type4}' isn't.""" +
+              labeler.originMessages,
+      arguments: {
+        'type': _type,
+        'type2': _type2,
+        'type3': _type3,
+        'type4': _type4
+      });
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+        Message Function(
+            DartType _type, DartType _type2, bool isNonNullableByDefault)>
     templateMainWrongParameterType = const Template<
             Message Function(
                 DartType _type, DartType _type2, bool isNonNullableByDefault)>(
@@ -3484,6 +4251,93 @@
 const Template<
         Message Function(
             DartType _type, DartType _type2, bool isNonNullableByDefault)>
+    templateSpreadElementTypeMismatchNullability = const Template<
+            Message Function(
+                DartType _type, DartType _type2, bool isNonNullableByDefault)>(
+        messageTemplate:
+            r"""Can't assign spread elements of type '#type' to collection elements of type '#type2' because '#type' is nullable and '#type2' isn't.""",
+        withArguments: _withArgumentsSpreadElementTypeMismatchNullability);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<
+        Message Function(
+            DartType _type, DartType _type2, bool isNonNullableByDefault)>
+    codeSpreadElementTypeMismatchNullability = const Code<
+            Message Function(
+                DartType _type, DartType _type2, bool isNonNullableByDefault)>(
+        "SpreadElementTypeMismatchNullability",
+        templateSpreadElementTypeMismatchNullability,
+        analyzerCodes: <String>["LIST_ELEMENT_TYPE_NOT_ASSIGNABLE"]);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsSpreadElementTypeMismatchNullability(
+    DartType _type, DartType _type2, bool isNonNullableByDefault) {
+  TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
+  List<Object> typeParts = labeler.labelType(_type);
+  List<Object> type2Parts = labeler.labelType(_type2);
+  String type = typeParts.join();
+  String type2 = type2Parts.join();
+  return new Message(codeSpreadElementTypeMismatchNullability,
+      message:
+          """Can't assign spread elements of type '${type}' to collection elements of type '${type2}' because '${type}' is nullable and '${type2}' isn't.""" +
+              labeler.originMessages,
+      arguments: {'type': _type, 'type2': _type2});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+        Message Function(DartType _type, DartType _type2, DartType _type3,
+            DartType _type4, bool isNonNullableByDefault)>
+    templateSpreadElementTypeMismatchPartNullability = const Template<
+            Message Function(DartType _type, DartType _type2, DartType _type3,
+                DartType _type4, bool isNonNullableByDefault)>(
+        messageTemplate:
+            r"""Can't assign spread elements of type '#type' to collection elements of type '#type2' because '#type3' is nullable and '#type4' isn't.""",
+        withArguments: _withArgumentsSpreadElementTypeMismatchPartNullability);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<
+        Message Function(DartType _type, DartType _type2, DartType _type3,
+            DartType _type4, bool isNonNullableByDefault)>
+    codeSpreadElementTypeMismatchPartNullability = const Code<
+            Message Function(DartType _type, DartType _type2, DartType _type3,
+                DartType _type4, bool isNonNullableByDefault)>(
+        "SpreadElementTypeMismatchPartNullability",
+        templateSpreadElementTypeMismatchPartNullability,
+        analyzerCodes: <String>["LIST_ELEMENT_TYPE_NOT_ASSIGNABLE"]);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsSpreadElementTypeMismatchPartNullability(
+    DartType _type,
+    DartType _type2,
+    DartType _type3,
+    DartType _type4,
+    bool isNonNullableByDefault) {
+  TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
+  List<Object> typeParts = labeler.labelType(_type);
+  List<Object> type2Parts = labeler.labelType(_type2);
+  List<Object> type3Parts = labeler.labelType(_type3);
+  List<Object> type4Parts = labeler.labelType(_type4);
+  String type = typeParts.join();
+  String type2 = type2Parts.join();
+  String type3 = type3Parts.join();
+  String type4 = type4Parts.join();
+  return new Message(codeSpreadElementTypeMismatchPartNullability,
+      message:
+          """Can't assign spread elements of type '${type}' to collection elements of type '${type2}' because '${type3}' is nullable and '${type4}' isn't.""" +
+              labeler.originMessages,
+      arguments: {
+        'type': _type,
+        'type2': _type2,
+        'type3': _type3,
+        'type4': _type4
+      });
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+        Message Function(
+            DartType _type, DartType _type2, bool isNonNullableByDefault)>
     templateSpreadMapEntryElementKeyTypeMismatch = const Template<
             Message Function(
                 DartType _type, DartType _type2, bool isNonNullableByDefault)>(
@@ -3521,6 +4375,96 @@
 const Template<
         Message Function(
             DartType _type, DartType _type2, bool isNonNullableByDefault)>
+    templateSpreadMapEntryElementKeyTypeMismatchNullability = const Template<
+            Message Function(
+                DartType _type, DartType _type2, bool isNonNullableByDefault)>(
+        messageTemplate:
+            r"""Can't assign spread entry keys of type '#type' to map entry keys of type '#type2' because '#type' is nullable and '#type2' isn't.""",
+        withArguments:
+            _withArgumentsSpreadMapEntryElementKeyTypeMismatchNullability);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<
+        Message Function(
+            DartType _type, DartType _type2, bool isNonNullableByDefault)>
+    codeSpreadMapEntryElementKeyTypeMismatchNullability = const Code<
+            Message Function(
+                DartType _type, DartType _type2, bool isNonNullableByDefault)>(
+        "SpreadMapEntryElementKeyTypeMismatchNullability",
+        templateSpreadMapEntryElementKeyTypeMismatchNullability,
+        analyzerCodes: <String>["MAP_KEY_TYPE_NOT_ASSIGNABLE"]);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsSpreadMapEntryElementKeyTypeMismatchNullability(
+    DartType _type, DartType _type2, bool isNonNullableByDefault) {
+  TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
+  List<Object> typeParts = labeler.labelType(_type);
+  List<Object> type2Parts = labeler.labelType(_type2);
+  String type = typeParts.join();
+  String type2 = type2Parts.join();
+  return new Message(codeSpreadMapEntryElementKeyTypeMismatchNullability,
+      message:
+          """Can't assign spread entry keys of type '${type}' to map entry keys of type '${type2}' because '${type}' is nullable and '${type2}' isn't.""" +
+              labeler.originMessages,
+      arguments: {'type': _type, 'type2': _type2});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+        Message Function(DartType _type, DartType _type2, DartType _type3,
+            DartType _type4, bool isNonNullableByDefault)>
+    templateSpreadMapEntryElementKeyTypeMismatchPartNullability =
+    const Template<
+            Message Function(DartType _type, DartType _type2, DartType _type3,
+                DartType _type4, bool isNonNullableByDefault)>(
+        messageTemplate:
+            r"""Can't assign spread entry keys of type '#type' to map entry keys of type '#type2' because '#type3' is nullable and '#type4' isn't.""",
+        withArguments:
+            _withArgumentsSpreadMapEntryElementKeyTypeMismatchPartNullability);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<
+        Message Function(DartType _type, DartType _type2, DartType _type3,
+            DartType _type4, bool isNonNullableByDefault)>
+    codeSpreadMapEntryElementKeyTypeMismatchPartNullability = const Code<
+            Message Function(DartType _type, DartType _type2, DartType _type3,
+                DartType _type4, bool isNonNullableByDefault)>(
+        "SpreadMapEntryElementKeyTypeMismatchPartNullability",
+        templateSpreadMapEntryElementKeyTypeMismatchPartNullability,
+        analyzerCodes: <String>["MAP_KEY_TYPE_NOT_ASSIGNABLE"]);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsSpreadMapEntryElementKeyTypeMismatchPartNullability(
+    DartType _type,
+    DartType _type2,
+    DartType _type3,
+    DartType _type4,
+    bool isNonNullableByDefault) {
+  TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
+  List<Object> typeParts = labeler.labelType(_type);
+  List<Object> type2Parts = labeler.labelType(_type2);
+  List<Object> type3Parts = labeler.labelType(_type3);
+  List<Object> type4Parts = labeler.labelType(_type4);
+  String type = typeParts.join();
+  String type2 = type2Parts.join();
+  String type3 = type3Parts.join();
+  String type4 = type4Parts.join();
+  return new Message(codeSpreadMapEntryElementKeyTypeMismatchPartNullability,
+      message:
+          """Can't assign spread entry keys of type '${type}' to map entry keys of type '${type2}' because '${type3}' is nullable and '${type4}' isn't.""" +
+              labeler.originMessages,
+      arguments: {
+        'type': _type,
+        'type2': _type2,
+        'type3': _type3,
+        'type4': _type4
+      });
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+        Message Function(
+            DartType _type, DartType _type2, bool isNonNullableByDefault)>
     templateSpreadMapEntryElementValueTypeMismatch = const Template<
             Message Function(
                 DartType _type, DartType _type2, bool isNonNullableByDefault)>(
@@ -3555,6 +4499,96 @@
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+        Message Function(
+            DartType _type, DartType _type2, bool isNonNullableByDefault)>
+    templateSpreadMapEntryElementValueTypeMismatchNullability = const Template<
+            Message Function(
+                DartType _type, DartType _type2, bool isNonNullableByDefault)>(
+        messageTemplate:
+            r"""Can't assign spread entry values of type '#type' to map entry values of type '#type2' because '#type' is nullable and '#type2' isn't.""",
+        withArguments:
+            _withArgumentsSpreadMapEntryElementValueTypeMismatchNullability);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<
+        Message Function(
+            DartType _type, DartType _type2, bool isNonNullableByDefault)>
+    codeSpreadMapEntryElementValueTypeMismatchNullability = const Code<
+            Message Function(
+                DartType _type, DartType _type2, bool isNonNullableByDefault)>(
+        "SpreadMapEntryElementValueTypeMismatchNullability",
+        templateSpreadMapEntryElementValueTypeMismatchNullability,
+        analyzerCodes: <String>["MAP_VALUE_TYPE_NOT_ASSIGNABLE"]);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsSpreadMapEntryElementValueTypeMismatchNullability(
+    DartType _type, DartType _type2, bool isNonNullableByDefault) {
+  TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
+  List<Object> typeParts = labeler.labelType(_type);
+  List<Object> type2Parts = labeler.labelType(_type2);
+  String type = typeParts.join();
+  String type2 = type2Parts.join();
+  return new Message(codeSpreadMapEntryElementValueTypeMismatchNullability,
+      message:
+          """Can't assign spread entry values of type '${type}' to map entry values of type '${type2}' because '${type}' is nullable and '${type2}' isn't.""" +
+              labeler.originMessages,
+      arguments: {'type': _type, 'type2': _type2});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+        Message Function(DartType _type, DartType _type2, DartType _type3,
+            DartType _type4, bool isNonNullableByDefault)>
+    templateSpreadMapEntryElementValueTypeMismatchPartNullability =
+    const Template<
+            Message Function(DartType _type, DartType _type2, DartType _type3,
+                DartType _type4, bool isNonNullableByDefault)>(
+        messageTemplate:
+            r"""Can't assign spread entry values of type '#type' to map entry values of type '#type2' because '#type3' is nullable and '#type4' isn't.""",
+        withArguments:
+            _withArgumentsSpreadMapEntryElementValueTypeMismatchPartNullability);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<
+        Message Function(DartType _type, DartType _type2, DartType _type3,
+            DartType _type4, bool isNonNullableByDefault)>
+    codeSpreadMapEntryElementValueTypeMismatchPartNullability = const Code<
+            Message Function(DartType _type, DartType _type2, DartType _type3,
+                DartType _type4, bool isNonNullableByDefault)>(
+        "SpreadMapEntryElementValueTypeMismatchPartNullability",
+        templateSpreadMapEntryElementValueTypeMismatchPartNullability,
+        analyzerCodes: <String>["MAP_VALUE_TYPE_NOT_ASSIGNABLE"]);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsSpreadMapEntryElementValueTypeMismatchPartNullability(
+    DartType _type,
+    DartType _type2,
+    DartType _type3,
+    DartType _type4,
+    bool isNonNullableByDefault) {
+  TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
+  List<Object> typeParts = labeler.labelType(_type);
+  List<Object> type2Parts = labeler.labelType(_type2);
+  List<Object> type3Parts = labeler.labelType(_type3);
+  List<Object> type4Parts = labeler.labelType(_type4);
+  String type = typeParts.join();
+  String type2 = type2Parts.join();
+  String type3 = type3Parts.join();
+  String type4 = type4Parts.join();
+  return new Message(codeSpreadMapEntryElementValueTypeMismatchPartNullability,
+      message:
+          """Can't assign spread entry values of type '${type}' to map entry values of type '${type2}' because '${type3}' is nullable and '${type4}' isn't.""" +
+              labeler.originMessages,
+      arguments: {
+        'type': _type,
+        'type2': _type2,
+        'type3': _type3,
+        'type4': _type4
+      });
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(DartType _type, bool isNonNullableByDefault)>
     templateSpreadMapEntryTypeMismatch = const Template<
             Message Function(DartType _type, bool isNonNullableByDefault)>(
diff --git a/pkg/front_end/lib/src/fasta/get_dependencies.dart b/pkg/front_end/lib/src/fasta/get_dependencies.dart
index 22b621a..3a23778 100644
--- a/pkg/front_end/lib/src/fasta/get_dependencies.dart
+++ b/pkg/front_end/lib/src/fasta/get_dependencies.dart
@@ -4,8 +4,6 @@
 
 library fasta.get_dependencies;
 
-import 'dart:async' show Future;
-
 import 'package:kernel/kernel.dart' show Component, loadComponentFromBytes;
 
 import 'package:kernel/target/targets.dart' show Target;
diff --git a/pkg/front_end/lib/src/fasta/hybrid_file_system.dart b/pkg/front_end/lib/src/fasta/hybrid_file_system.dart
index 84d1cbd..3a78a1c 100644
--- a/pkg/front_end/lib/src/fasta/hybrid_file_system.dart
+++ b/pkg/front_end/lib/src/fasta/hybrid_file_system.dart
@@ -6,8 +6,6 @@
 /// sdk sources from disk.
 library front_end.src.hybrid_file_system;
 
-import 'dart:async';
-
 import '../api_prototype/file_system.dart';
 import '../api_prototype/memory_file_system.dart';
 import '../api_prototype/standard_file_system.dart';
diff --git a/pkg/front_end/lib/src/fasta/incremental_compiler.dart b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
index 2cfabbe..906d131 100644
--- a/pkg/front_end/lib/src/fasta/incremental_compiler.dart
+++ b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
@@ -4,9 +4,11 @@
 
 library fasta.incremental_compiler;
 
-import 'dart:async' show Future;
-
 import 'package:front_end/src/api_prototype/experimental_flags.dart';
+import 'package:front_end/src/api_prototype/front_end.dart';
+import 'package:front_end/src/base/nnbd_mode.dart';
+import 'package:front_end/src/fasta/fasta_codes.dart';
+import 'package:front_end/src/fasta/source/source_loader.dart';
 import 'package:kernel/binary/ast_from_binary.dart'
     show
         BinaryBuilderWithMetadata,
@@ -15,7 +17,8 @@
         CompilationModeError,
         InvalidKernelSdkVersionError,
         InvalidKernelVersionError,
-        SubComponentView;
+        SubComponentView,
+        mergeCompilationModeOrThrow;
 
 import 'package:kernel/class_hierarchy.dart'
     show ClassHierarchy, ClosedWorldClassHierarchy;
@@ -60,6 +63,8 @@
 
 import 'builder/class_builder.dart' show ClassBuilder;
 
+import 'builder/field_builder.dart' show FieldBuilder;
+
 import 'builder/library_builder.dart' show LibraryBuilder;
 
 import 'builder/name_iterator.dart' show NameIterator;
@@ -388,6 +393,8 @@
       // We suppress finalization errors because they have already been
       // reported.
       await dillLoadedData.buildOutlines(suppressFinalizationErrors: true);
+      assert(_checkEquivalentScopes(
+          userCode.loader.builders, dillLoadedData.loader.builders));
 
       if (experimentalInvalidation != null) {
         /// If doing experimental invalidation that means that some of the old
@@ -432,6 +439,80 @@
     return newDillLibraryBuilders;
   }
 
+  bool _checkEquivalentScopes(Map<Uri, LibraryBuilder> sourceLibraries,
+      Map<Uri, LibraryBuilder> dillLibraries) {
+    sourceLibraries.forEach((Uri uri, LibraryBuilder sourceLibraryBuilder) {
+      if (sourceLibraryBuilder is SourceLibraryBuilder) {
+        DillLibraryBuilder dillLibraryBuilder = dillLibraries[uri];
+        assert(
+            _hasEquivalentScopes(sourceLibraryBuilder, dillLibraryBuilder) ==
+                null,
+            _hasEquivalentScopes(sourceLibraryBuilder, dillLibraryBuilder));
+      }
+    });
+    return true;
+  }
+
+  String _hasEquivalentScopes(SourceLibraryBuilder sourceLibraryBuilder,
+      DillLibraryBuilder dillLibraryBuilder) {
+    bool isEquivalent = true;
+    StringBuffer sb = new StringBuffer();
+    sb.writeln('Mismatch on ${sourceLibraryBuilder.importUri}:');
+    sourceLibraryBuilder.exportScope
+        .forEachLocalMember((String name, Builder sourceBuilder) {
+      Builder dillBuilder =
+          dillLibraryBuilder.exportScope.lookupLocalMember(name, setter: false);
+      if (dillBuilder == null) {
+        if ((name == 'dynamic' || name == 'Never') &&
+            sourceLibraryBuilder.importUri == Uri.parse('dart:core')) {
+          // The source library builder for dart:core has synthetically
+          // injected builders for `dynamic` and `Never` which do not have
+          // corresponding classes in the AST.
+          return;
+        }
+        sb.writeln('No dill builder for ${name}: $sourceBuilder');
+        isEquivalent = false;
+      }
+    });
+    dillLibraryBuilder.exportScope
+        .forEachLocalMember((String name, Builder dillBuilder) {
+      Builder sourceBuilder = sourceLibraryBuilder.exportScope
+          .lookupLocalMember(name, setter: false);
+      if (sourceBuilder == null) {
+        sb.writeln('No source builder for ${name}: $dillBuilder');
+        isEquivalent = false;
+      }
+    });
+    sourceLibraryBuilder.exportScope
+        .forEachLocalSetter((String name, Builder sourceBuilder) {
+      Builder dillBuilder =
+          dillLibraryBuilder.exportScope.lookupLocalMember(name, setter: true);
+      if (dillBuilder == null) {
+        sb.writeln('No dill builder for ${name}=: $sourceBuilder');
+        isEquivalent = false;
+      }
+    });
+    dillLibraryBuilder.exportScope
+        .forEachLocalSetter((String name, Builder dillBuilder) {
+      Builder sourceBuilder = sourceLibraryBuilder.exportScope
+          .lookupLocalMember(name, setter: true);
+      if (sourceBuilder == null) {
+        sourceBuilder = sourceLibraryBuilder.exportScope
+            .lookupLocalMember(name, setter: false);
+        if (sourceBuilder is FieldBuilder && sourceBuilder.isAssignable) {
+          // Assignable fields can be lowered into a getter and setter.
+          return;
+        }
+        sb.writeln('No source builder for ${name}=: $dillBuilder');
+        isEquivalent = false;
+      }
+    });
+    if (isEquivalent) {
+      return null;
+    }
+    return sb.toString();
+  }
+
   /// Compute which libraries to output and which (previous) errors/warnings we
   /// have to reissue. In the process do some cleanup too.
   List<Library> calculateOutputLibrariesAndIssueLibraryProblems(
@@ -703,13 +784,49 @@
     dillLoadedData.loader.currentSourceLoader = userCode.loader;
 
     // Re-use the libraries we've deemed re-usable.
+    List<bool> seenModes = [false, false, false, false];
     for (LibraryBuilder library in reusedLibraries) {
+      seenModes[library.library.nonNullableByDefaultCompiledMode.index] = true;
       userCode.loader.builders[library.importUri] = library;
       if (library.importUri.scheme == "dart" &&
           library.importUri.path == "core") {
         userCode.loader.coreLibrary = library;
       }
     }
+    // Check compilation mode up against what we've seen here and set
+    // `hasInvalidNnbdModeLibrary` accordingly.
+    if (c.options.isExperimentEnabledGlobally(ExperimentalFlag.nonNullable)) {
+      switch (c.options.nnbdMode) {
+        case NnbdMode.Weak:
+          // Don't expect strong or invalid.
+          if (seenModes[NonNullableByDefaultCompiledMode.Strong.index] ||
+              seenModes[NonNullableByDefaultCompiledMode.Invalid.index]) {
+            userCode.loader.hasInvalidNnbdModeLibrary = true;
+          }
+          break;
+        case NnbdMode.Strong:
+          // Don't expect weak or invalid.
+          if (seenModes[NonNullableByDefaultCompiledMode.Weak.index] ||
+              seenModes[NonNullableByDefaultCompiledMode.Invalid.index]) {
+            userCode.loader.hasInvalidNnbdModeLibrary = true;
+          }
+          break;
+        case NnbdMode.Agnostic:
+          // Don't expect strong, weak or invalid.
+          if (seenModes[NonNullableByDefaultCompiledMode.Strong.index] ||
+              seenModes[NonNullableByDefaultCompiledMode.Weak.index] ||
+              seenModes[NonNullableByDefaultCompiledMode.Invalid.index]) {
+            userCode.loader.hasInvalidNnbdModeLibrary = true;
+          }
+          break;
+      }
+    } else {
+      // Don't expect strong or invalid.
+      if (seenModes[NonNullableByDefaultCompiledMode.Strong.index] ||
+          seenModes[NonNullableByDefaultCompiledMode.Invalid.index]) {
+        userCode.loader.hasInvalidNnbdModeLibrary = true;
+      }
+    }
 
     // The entry point(s) has to be set first for loader.first to be setup
     // correctly. If the first one is in the rebuildBodies, we have to add it
@@ -1263,27 +1380,44 @@
     }
 
     // Report old problems that wasn't reported again.
-    for (List<DiagnosticMessageFromJson> messages
-        in remainingComponentProblems.values) {
+    Set<Uri> strongModeNNBDPackageOptOutUris;
+    for (MapEntry<Uri, List<DiagnosticMessageFromJson>> entry
+        in remainingComponentProblems.entries) {
+      List<DiagnosticMessageFromJson> messages = entry.value;
       for (int i = 0; i < messages.length; i++) {
         DiagnosticMessageFromJson message = messages[i];
+        if (message.codeName == "StrongModeNNBDPackageOptOut") {
+          // Special case this: Don't issue them here; instead collect them
+          // to get their uris and re-issue a new error.
+          strongModeNNBDPackageOptOutUris ??= {};
+          strongModeNNBDPackageOptOutUris.add(entry.key);
+          continue;
+        }
         if (issuedProblems.add(message.toJsonString())) {
           context.options.reportDiagnosticMessage(message);
         }
       }
     }
+    if (strongModeNNBDPackageOptOutUris != null) {
+      // Get the builders for these uris; then call
+      // `SourceLoader.giveCombinedErrorForNonStrongLibraries` on them to issue
+      // a new error.
+      Set<LibraryBuilder> builders = {};
+      SourceLoader loader = userCode.loader;
+      for (LibraryBuilder builder in loader.builders.values) {
+        if (strongModeNNBDPackageOptOutUris.contains(builder.fileUri)) {
+          builders.add(builder);
+        }
+      }
+      FormattedMessage message = loader.giveCombinedErrorForNonStrongLibraries(
+          builders,
+          emitNonPackageErrors: false);
+      issuedProblems.add(message.toJsonString());
+      // The problem was issued by the call so don't re-issue it here.
+    }
 
     // Save any new component-problems.
-    if (componentWithDill?.problemsAsJson != null) {
-      for (String jsonString in componentWithDill.problemsAsJson) {
-        DiagnosticMessageFromJson message =
-            new DiagnosticMessageFromJson.fromJson(jsonString);
-        List<DiagnosticMessageFromJson> messages =
-            remainingComponentProblems[message.uri] ??=
-                new List<DiagnosticMessageFromJson>();
-        messages.add(message);
-      }
-    }
+    _addProblemsAsJsonToRemainingProblems(componentWithDill?.problemsAsJson);
     return new List<String>.from(issuedProblems);
   }
 
@@ -1481,8 +1615,28 @@
             .readComponent(data.component,
                 checkCanonicalNames: true, createView: true);
 
+        // Compute "output nnbd mode".
+        NonNullableByDefaultCompiledMode compiledMode;
+        if (c.options
+            .isExperimentEnabledGlobally(ExperimentalFlag.nonNullable)) {
+          switch (c.options.nnbdMode) {
+            case NnbdMode.Weak:
+              compiledMode = NonNullableByDefaultCompiledMode.Weak;
+              break;
+            case NnbdMode.Strong:
+              compiledMode = NonNullableByDefaultCompiledMode.Strong;
+              break;
+            case NnbdMode.Agnostic:
+              compiledMode = NonNullableByDefaultCompiledMode.Agnostic;
+              break;
+          }
+        } else {
+          compiledMode = NonNullableByDefaultCompiledMode.Weak;
+        }
+
         // Check the any package-urls still point to the same file
         // (e.g. the package still exists and hasn't been updated).
+        // Also verify NNBD settings.
         for (Library lib in data.component.libraries) {
           if (lib.importUri.scheme == "package" &&
               uriTranslator.translate(lib.importUri, false) != lib.fileUri) {
@@ -1493,6 +1647,16 @@
             // For now just don't initialize from this dill.
             throw const PackageChangedError();
           }
+          // Note: If a library has a NonNullableByDefaultCompiledMode.invalid
+          // we will throw and we won't initialize from it.
+          // That's wanted behavior.
+          if (compiledMode !=
+              mergeCompilationModeOrThrow(
+                  compiledMode, lib.nonNullableByDefaultCompiledMode)) {
+            throw new CompilationModeError(
+                "Can't compile to $compiledMode with library with mode "
+                "${lib.nonNullableByDefaultCompiledMode}.");
+          }
         }
 
         // Only initialize the incremental serializer when we know we'll
@@ -1511,14 +1675,36 @@
 
   /// Internal method.
   void saveComponentProblems(IncrementalCompilerData data) {
-    if (data.component.problemsAsJson != null) {
-      for (String jsonString in data.component.problemsAsJson) {
+    List<String> problemsAsJson = data.component.problemsAsJson;
+    _addProblemsAsJsonToRemainingProblems(problemsAsJson);
+  }
+
+  void _addProblemsAsJsonToRemainingProblems(List<String> problemsAsJson) {
+    if (problemsAsJson != null) {
+      for (String jsonString in problemsAsJson) {
         DiagnosticMessageFromJson message =
             new DiagnosticMessageFromJson.fromJson(jsonString);
-        List<DiagnosticMessageFromJson> messages =
-            remainingComponentProblems[message.uri] ??=
-                new List<DiagnosticMessageFromJson>();
-        messages.add(message);
+        assert(message.uri != null ||
+            (message.involvedFiles != null &&
+                message.involvedFiles.isNotEmpty));
+        if (message.uri != null) {
+          List<DiagnosticMessageFromJson> messages =
+              remainingComponentProblems[message.uri] ??=
+                  new List<DiagnosticMessageFromJson>();
+          messages.add(message);
+        }
+        if (message.involvedFiles != null) {
+          // This indexes the same message under several uris - this way it will
+          // be issued as long as it's a problem. It will because of
+          // deduplication when we re-issue these (in reissueComponentProblems)
+          // only be reported once.
+          for (Uri uri in message.involvedFiles) {
+            List<DiagnosticMessageFromJson> messages =
+                remainingComponentProblems[uri] ??=
+                    new List<DiagnosticMessageFromJson>();
+            messages.add(message);
+          }
+        }
       }
     }
   }
@@ -1590,10 +1776,27 @@
       userCode.loader.seenMessages.clear();
 
       for (TypeParameter typeParam in typeDefinitions) {
-        if (!isLegalIdentifier(typeParam.name)) return null;
+        if (!isLegalIdentifier(typeParam.name)) {
+          userCode.loader.addProblem(
+              templateIncrementalCompilerIllegalTypeParameter
+                  .withArguments('$typeParam'),
+              typeParam.fileOffset,
+              0,
+              libraryUri);
+          return null;
+        }
       }
       for (String name in definitions.keys) {
-        if (!isLegalIdentifier(name)) return null;
+        if (!isLegalIdentifier(name)) {
+          userCode.loader.addProblem(
+              templateIncrementalCompilerIllegalParameter.withArguments(name),
+              // TODO: pass variable declarations instead of
+              // parameter names for proper location detection.
+              -1,
+              -1,
+              libraryUri);
+          return null;
+        }
       }
 
       SourceLibraryBuilder debugLibrary = new SourceLibraryBuilder(
@@ -1649,7 +1852,8 @@
       FunctionNode parameters = new FunctionNode(null,
           typeParameters: typeDefinitions,
           positionalParameters: definitions.keys
-              .map((name) => new VariableDeclarationImpl(name, 0))
+              .map((name) =>
+                  new VariableDeclarationImpl(name, 0, type: definitions[name]))
               .toList());
 
       debugLibrary.build(userCode.loader.coreLibrary, modifyTarget: false);
diff --git a/pkg/front_end/lib/src/fasta/incremental_serializer.dart b/pkg/front_end/lib/src/fasta/incremental_serializer.dart
index 59d8488..e22b912 100644
--- a/pkg/front_end/lib/src/fasta/incremental_serializer.dart
+++ b/pkg/front_end/lib/src/fasta/incremental_serializer.dart
@@ -302,6 +302,7 @@
         libraries: libraries,
         uriToSource: component.uriToSource,
         nameRoot: component.root);
+    singlePackageLibraries.setMainMethodAndMode(null, false, component.mode);
 
     ByteSink byteSink = new ByteSink();
     final BinaryPrinter printer = new BinaryPrinter(byteSink);
diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
index 73e6525..d65d47e 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -319,13 +319,13 @@
 
   /// List of built type aliased generative constructor invocations that
   /// require unaliasing.
-  final List<ConstructorInvocation> typeAliasedConstructorInvocations =
-      <ConstructorInvocation>[];
+  final List<TypeAliasedConstructorInvocationJudgment>
+      typeAliasedConstructorInvocations = [];
 
   /// List of built type aliased factory constructor invocations that require
   /// unaliasing.
-  final List<StaticInvocation> typeAliasedFactoryInvocations =
-      <StaticInvocation>[];
+  final List<TypeAliasedFactoryInvocationJudgment>
+      typeAliasedFactoryInvocations = [];
 
   /// Variables with metadata.  Their types need to be inferred late, for
   /// example, in [finishFunction].
@@ -507,7 +507,9 @@
   }
 
   Statement popBlock(int count, Token openBrace, Token closeBrace) {
-    return forest.createBlock(offsetForToken(openBrace),
+    return forest.createBlock(
+        offsetForToken(openBrace),
+        offsetForToken(closeBrace),
         const GrowableList<Statement>().pop(stack, count) ?? <Statement>[]);
   }
 
@@ -1015,9 +1017,9 @@
             statements.add(parameter.variable);
           }
           statements.add(body);
-          body = forest.createBlock(charOffset, statements);
+          body = forest.createBlock(charOffset, noLocation, statements);
         }
-        body = forest.createBlock(charOffset, <Statement>[
+        body = forest.createBlock(charOffset, noLocation, <Statement>[
           forest.createExpressionStatement(
               noLocation,
               // This error is added after type inference is done, so we
@@ -1151,6 +1153,74 @@
     _resolveRedirectingFactoryTargets();
   }
 
+  /// Return an [Expression] resolving the argument invocation.
+  ///
+  /// The arguments specify the [StaticInvocation] whose `.target` is
+  /// [target], `.arguments` is [arguments], `.fileOffset` is [fileOffset],
+  /// and `.isConst` is [isConst].
+  Expression _resolveRedirectingFactoryTarget(
+      Procedure target, Arguments arguments, int fileOffset, bool isConst) {
+    Procedure initialTarget = target;
+    Expression replacementNode;
+
+    RedirectionTarget redirectionTarget =
+        getRedirectionTarget(initialTarget, this);
+    Member resolvedTarget = redirectionTarget?.target;
+
+    if (resolvedTarget == null) {
+      String name = constructorNameForDiagnostics(initialTarget.name.text,
+          className: initialTarget.enclosingClass.name);
+      // TODO(dmitryas): Report this error earlier.
+      replacementNode = buildProblem(
+          fasta.templateCyclicRedirectingFactoryConstructors
+              .withArguments(name),
+          initialTarget.fileOffset,
+          name.length);
+    } else if (resolvedTarget is Constructor &&
+        resolvedTarget.enclosingClass.isAbstract) {
+      replacementNode = evaluateArgumentsBefore(
+          forest.createArguments(noLocation, arguments.positional,
+              types: arguments.types, named: arguments.named),
+          buildAbstractClassInstantiationError(
+              fasta.templateAbstractRedirectedClassInstantiation
+                  .withArguments(resolvedTarget.enclosingClass.name),
+              resolvedTarget.enclosingClass.name,
+              initialTarget.fileOffset));
+    } else {
+      RedirectingFactoryBody redirectingFactoryBody =
+          getRedirectingFactoryBody(resolvedTarget);
+      if (redirectingFactoryBody != null) {
+        // If the redirection target is itself a redirecting factory, it means
+        // that it is unresolved.
+        assert(redirectingFactoryBody.isUnresolved);
+        String errorName = redirectingFactoryBody.unresolvedName;
+        replacementNode = buildProblem(
+            fasta.templateMethodNotFound.withArguments(errorName),
+            fileOffset,
+            noLength,
+            suppressMessage: true);
+      } else {
+        Substitution substitution = Substitution.fromPairs(
+            initialTarget.function.typeParameters, arguments.types);
+        arguments.types.clear();
+        arguments.types.length = redirectionTarget.typeArguments.length;
+        for (int i = 0; i < arguments.types.length; i++) {
+          arguments.types[i] =
+              substitution.substituteType(redirectionTarget.typeArguments[i]);
+        }
+
+        replacementNode = buildStaticInvocation(
+            resolvedTarget,
+            forest.createArguments(noLocation, arguments.positional,
+                types: arguments.types, named: arguments.named),
+            constness:
+                isConst ? Constness.explicitConst : Constness.explicitNew,
+            charOffset: fileOffset);
+      }
+    }
+    return replacementNode;
+  }
+
   void _resolveRedirectingFactoryTargets() {
     for (StaticInvocation invocation in redirectingFactoryInvocations) {
       // If the invocation was invalid, it or its parent has already been
@@ -1172,92 +1242,51 @@
         }
         if (parent == null) continue;
       }
-
-      Procedure initialTarget = invocation.target;
-      Expression replacementNode;
-
-      RedirectionTarget redirectionTarget =
-          getRedirectionTarget(initialTarget, this);
-      Member resolvedTarget = redirectionTarget?.target;
-
-      if (resolvedTarget == null) {
-        String name = constructorNameForDiagnostics(initialTarget.name.text,
-            className: initialTarget.enclosingClass.name);
-        // TODO(dmitryas): Report this error earlier.
-        replacementNode = buildProblem(
-            fasta.templateCyclicRedirectingFactoryConstructors
-                .withArguments(name),
-            initialTarget.fileOffset,
-            name.length);
-      } else if (resolvedTarget is Constructor &&
-          resolvedTarget.enclosingClass.isAbstract) {
-        replacementNode = evaluateArgumentsBefore(
-            forest.createArguments(noLocation, invocation.arguments.positional,
-                types: invocation.arguments.types,
-                named: invocation.arguments.named),
-            buildAbstractClassInstantiationError(
-                fasta.templateAbstractRedirectedClassInstantiation
-                    .withArguments(resolvedTarget.enclosingClass.name),
-                resolvedTarget.enclosingClass.name,
-                initialTarget.fileOffset));
-      } else {
-        RedirectingFactoryBody redirectingFactoryBody =
-            getRedirectingFactoryBody(resolvedTarget);
-        if (redirectingFactoryBody != null) {
-          // If the redirection target is itself a redirecting factory, it means
-          // that it is unresolved.
-          assert(redirectingFactoryBody.isUnresolved);
-          String errorName = redirectingFactoryBody.unresolvedName;
-          replacementNode = buildProblem(
-              fasta.templateMethodNotFound.withArguments(errorName),
-              invocation.fileOffset,
-              noLength,
-              suppressMessage: true);
-        } else {
-          Substitution substitution = Substitution.fromPairs(
-              initialTarget.function.typeParameters,
-              invocation.arguments.types);
-          invocation.arguments.types.clear();
-          invocation.arguments.types.length =
-              redirectionTarget.typeArguments.length;
-          for (int i = 0; i < invocation.arguments.types.length; i++) {
-            invocation.arguments.types[i] =
-                substitution.substituteType(redirectionTarget.typeArguments[i]);
-          }
-
-          replacementNode = buildStaticInvocation(
-              resolvedTarget,
-              forest.createArguments(
-                  noLocation, invocation.arguments.positional,
-                  types: invocation.arguments.types,
-                  named: invocation.arguments.named),
-              constness: invocation.isConst
-                  ? Constness.explicitConst
-                  : Constness.explicitNew,
-              charOffset: invocation.fileOffset);
-        }
-      }
-
-      invocation.replaceWith(replacementNode);
+      invocation.replaceWith(_resolveRedirectingFactoryTarget(invocation.target,
+          invocation.arguments, invocation.fileOffset, invocation.isConst));
     }
     redirectingFactoryInvocations.clear();
   }
 
   void _unaliasTypeAliasedConstructorInvocations() {
-    for (ConstructorInvocation invocation
+    for (TypeAliasedConstructorInvocationJudgment invocation
         in typeAliasedConstructorInvocations) {
-      // TODO(eernst): Should replace aliased constructor invocations,
-      // such that back ends don't see instance creations on type aliases.
-      invocation.replaceWith(new NullLiteral());
+      DartType unaliasedType = new TypedefType(
+              invocation.typeAliasBuilder.typedef,
+              Nullability.nonNullable,
+              invocation.arguments.types)
+          .unalias;
+      List<DartType> invocationTypeArguments = null;
+      if (unaliasedType is InterfaceType) {
+        invocationTypeArguments = unaliasedType.typeArguments;
+      }
+      Arguments invocationArguments = forest.createArguments(
+          noLocation, invocation.arguments.positional,
+          types: invocationTypeArguments, named: invocation.arguments.named);
+      invocation.replaceWith(new ConstructorInvocation(
+          invocation.target, invocationArguments,
+          isConst: invocation.isConst));
     }
     typeAliasedConstructorInvocations.clear();
   }
 
   void _unaliasTypeAliasedFactoryInvocations() {
-    for (StaticInvocation invocation in typeAliasedFactoryInvocations) {
-      // TODO(eernst): Should replace aliased factory invocations,
-      // such that back ends don't see instance creations on type aliases.
-      invocation.replaceWith(new NullLiteral());
+    for (TypeAliasedFactoryInvocationJudgment invocation
+        in typeAliasedFactoryInvocations) {
+      DartType unaliasedType = new TypedefType(
+              invocation.typeAliasBuilder.typedef,
+              Nullability.nonNullable,
+              invocation.arguments.types)
+          .unalias;
+      List<DartType> invocationTypeArguments = null;
+      if (unaliasedType is InterfaceType) {
+        invocationTypeArguments = unaliasedType.typeArguments;
+      }
+      Arguments invocationArguments = forest.createArguments(
+          noLocation, invocation.arguments.positional,
+          types: invocationTypeArguments, named: invocation.arguments.named);
+      invocation.replaceWith(_resolveRedirectingFactoryTarget(invocation.target,
+          invocationArguments, invocation.fileOffset, invocation.isConst));
     }
     typeAliasedFactoryInvocations.clear();
   }
@@ -2070,11 +2099,8 @@
       Name n = new Name(name, libraryBuilder.nameOrigin);
       if (!isQualified && isDeclarationInstanceContext) {
         assert(declaration == null);
-        if (inLateFieldInitializer) {
-          // Implicit access on 'this' is allowed in a late field initializer.
-          return new ThisPropertyAccessGenerator(this, token, n);
-        }
-        if (constantContext != ConstantContext.none || member.isField) {
+        if (constantContext != ConstantContext.none ||
+            (inFieldInitializer && !inLateFieldInitializer) && !inInitializer) {
           return new UnresolvedNameGenerator(this, token, n);
         }
         if (extensionThis != null) {
@@ -3753,7 +3779,7 @@
     if (compileTimeErrors == null) {
       push(NullValue.Block);
     } else {
-      push(forest.createBlock(noLocation, compileTimeErrors));
+      push(forest.createBlock(noLocation, noLocation, compileTimeErrors));
     }
   }
 
@@ -3800,7 +3826,7 @@
 
     if (compileTimeErrors != null) {
       compileTimeErrors.add(result);
-      push(forest.createBlock(noLocation, compileTimeErrors));
+      push(forest.createBlock(noLocation, noLocation, compileTimeErrors));
     } else {
       push(result);
     }
@@ -4895,7 +4921,8 @@
           // This must have been a compile-time error.
           assert(isErroneousNode(variable.initializer));
 
-          push(forest.createBlock(declaration.fileOffset, <Statement>[
+          push(forest
+              .createBlock(declaration.fileOffset, noLocation, <Statement>[
             forest.createExpressionStatement(
                 offsetForToken(token), variable.initializer),
             declaration
@@ -5133,6 +5160,7 @@
         if (forest.isVariablesDeclaration(lvalue)) {
           effects = forest.createBlock(
               noLocation,
+              noLocation,
               // New list because the declarations are not a growable list.
               new List<Statement>.from(
                   forest.variablesDeclarationExtractDeclarations(lvalue)));
@@ -6059,7 +6087,7 @@
     if (member.isNative) {
       push(NullValue.FunctionBody);
     } else {
-      push(forest.createBlock(offsetForToken(token), <Statement>[
+      push(forest.createBlock(offsetForToken(token), noLocation, <Statement>[
         buildProblemStatement(
             fasta.templateExpectedFunctionBody.withArguments(token),
             token.charOffset,
diff --git a/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart b/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart
index 7b8b992..5c5223c 100644
--- a/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart
@@ -33,7 +33,6 @@
 import '../builder/type_alias_builder.dart';
 import '../builder/type_builder.dart';
 import '../builder/type_declaration_builder.dart';
-import '../builder/type_variable_builder.dart';
 
 import '../loader.dart' show Loader;
 
@@ -62,8 +61,7 @@
 
 import '../names.dart' show noSuchMethodName;
 
-import '../problems.dart' show unhandled;
-
+import '../problems.dart';
 import '../scope.dart' show Scope;
 
 import '../source/source_class_builder.dart';
@@ -82,6 +80,10 @@
 
 import '../type_inference/type_schema_environment.dart' show TypeConstraint;
 
+import 'combined_member_signature.dart';
+
+import 'member_covariance.dart';
+
 import 'forwarding_node.dart' show ForwardingNode;
 
 import 'kernel_builder.dart' show ImplicitFieldType;
@@ -117,6 +119,8 @@
   final Name name;
   ClassMember declaredMember;
   ClassMember declaredSetter;
+  ClassMember mixedInMember;
+  ClassMember mixedInSetter;
   ClassMember extendedMember;
   ClassMember extendedSetter;
   List<ClassMember> implementedMembers;
@@ -126,6 +130,10 @@
       : assert(!declaredMember.forSetter),
         this.name = declaredMember.name;
 
+  Tuple.mixInMember(this.mixedInMember)
+      : assert(!mixedInMember.forSetter),
+        this.name = mixedInMember.name;
+
   Tuple.extendMember(this.extendedMember)
       : assert(!extendedMember.forSetter),
         this.name = extendedMember.name;
@@ -139,6 +147,10 @@
       : assert(declaredSetter.forSetter),
         this.name = declaredSetter.name;
 
+  Tuple.mixInSetter(this.mixedInSetter)
+      : assert(mixedInSetter.forSetter),
+        this.name = mixedInSetter.name;
+
   Tuple.extendSetter(this.extendedSetter)
       : assert(extendedSetter.forSetter),
         this.name = extendedSetter.name;
@@ -165,6 +177,18 @@
       sb.write(declaredSetter);
       comma = ',';
     }
+    if (mixedInMember != null) {
+      sb.write(comma);
+      sb.write('mixedInMember=');
+      sb.write(mixedInMember);
+      comma = ',';
+    }
+    if (mixedInSetter != null) {
+      sb.write(comma);
+      sb.write('mixedInSetter=');
+      sb.write(mixedInSetter);
+      comma = ',';
+    }
     if (extendedMember != null) {
       sb.write(comma);
       sb.write('extendedMember=');
@@ -212,6 +236,10 @@
   /// Returns `true` if this member is a field, getter or setter.
   bool get isProperty;
   Member getMember(ClassHierarchyBuilder hierarchy);
+
+  /// Returns the member [Covariance] for this class member.
+  Covariance getCovariance(ClassHierarchyBuilder hierarchy);
+
   bool get isDuplicate;
   String get fullName;
   String get fullNameForErrors;
@@ -238,8 +266,6 @@
   ClassMember get abstract;
   ClassMember get concrete;
 
-  bool operator ==(Object other);
-
   void inferType(ClassHierarchyBuilder hierarchy);
   void registerOverrideDependency(Set<ClassMember> overriddenMembers);
 
@@ -326,8 +352,6 @@
 
   final Class functionClass;
 
-  final Class nullClass;
-
   final List<DelayedTypeComputation> _delayedTypeComputations =
       <DelayedTypeComputation>[];
 
@@ -342,8 +366,7 @@
   ClassHierarchyBuilder(this.objectClassBuilder, this.loader, this.coreTypes)
       : objectClass = objectClassBuilder.cls,
         futureClass = coreTypes.futureClass,
-        functionClass = coreTypes.functionClass,
-        nullClass = coreTypes.nullClass {
+        functionClass = coreTypes.functionClass {
     types = new Types(this);
   }
 
@@ -474,23 +497,9 @@
     return null;
   }
 
-  InterfaceType getTypeAsInstanceOf(InterfaceType type, Class superclass,
-      Library clientLibrary, CoreTypes coreTypes) {
-    Class kernelClass = type.classNode;
-    if (kernelClass == superclass) return type;
-    if (kernelClass == nullClass) {
-      if (superclass.typeParameters.isEmpty) {
-        return coreTypes.rawType(superclass, clientLibrary.nullable);
-      } else {
-        // This is a safe fall-back for dealing with `Null`. It will likely be
-        // faster to check for `Null` before calling this method.
-        return new InterfaceType(
-            superclass,
-            clientLibrary.nullable,
-            new List<DartType>.filled(
-                superclass.typeParameters.length, coreTypes.nullType));
-      }
-    }
+  InterfaceType getTypeAsInstanceOf(
+      InterfaceType type, Class superclass, Library clientLibrary) {
+    if (type.classNode == superclass) return type;
     return asSupertypeOf(type, superclass)
         .asInterfaceType
         .withDeclaredNullability(type.nullability);
@@ -498,13 +507,7 @@
 
   List<DartType> getTypeArgumentsAsInstanceOf(
       InterfaceType type, Class superclass) {
-    Class kernelClass = type.classNode;
-    if (kernelClass == superclass) return type.typeArguments;
-    if (kernelClass == nullClass) {
-      if (superclass.typeParameters.isEmpty) return const <DartType>[];
-      return new List<DartType>.filled(
-          superclass.typeParameters.length, coreTypes.nullType);
-    }
+    if (type.classNode == superclass) return type.typeArguments;
     return asSupertypeOf(type, superclass)?.typeArguments;
   }
 
@@ -518,10 +521,10 @@
     // LLUB(Null, List<dynamic>*) = List<dynamic>*.  In opt-out libraries the
     // rules imply that LLUB(Null, List<dynamic>*) = List<dynamic>?.
     if (!clientLibrary.isNonNullableByDefault) {
-      if (type1 is InterfaceType && type1.classNode == nullClass) {
+      if (type1 is NullType) {
         return type2;
       }
-      if (type2 is InterfaceType && type2.classNode == nullClass) {
+      if (type2 is NullType) {
         return type1;
       }
     }
@@ -540,10 +543,10 @@
         continue;
       }
       if (nodes1.contains(node)) {
-        DartType candidate1 = getTypeAsInstanceOf(
-            type1, node.classBuilder.cls, clientLibrary, coreTypes);
-        DartType candidate2 = getTypeAsInstanceOf(
-            type2, node.classBuilder.cls, clientLibrary, coreTypes);
+        DartType candidate1 =
+            getTypeAsInstanceOf(type1, node.classBuilder.cls, clientLibrary);
+        DartType candidate2 =
+            getTypeAsInstanceOf(type2, node.classBuilder.cls, clientLibrary);
         if (candidate1 == candidate2) {
           common.add(node);
         }
@@ -559,8 +562,7 @@
     for (int i = 0; i < common.length - 1; i++) {
       ClassHierarchyNode node = common[i];
       if (node.maxInheritancePath != common[i + 1].maxInheritancePath) {
-        return getTypeAsInstanceOf(
-                type1, node.classBuilder.cls, clientLibrary, coreTypes)
+        return getTypeAsInstanceOf(type1, node.classBuilder.cls, clientLibrary)
             .withDeclaredNullability(
                 uniteNullabilities(type1.nullability, type2.nullability));
       } else {
@@ -580,9 +582,17 @@
   }
 
   Member getDispatchTargetKernel(Class cls, Name name, bool isSetter) {
-    return getNodeFromClass(cls)
-        .getDispatchTarget(name, isSetter)
-        ?.getMember(this);
+    ClassMember classMember =
+        getNodeFromClass(cls).getDispatchTarget(name, isSetter);
+    Member member = classMember?.getMember(this);
+    if (member != null && member.isAbstract) {
+      if (cls.superclass != null) {
+        return getDispatchTargetKernel(cls.superclass, name, isSetter);
+      } else {
+        return null;
+      }
+    }
+    return member;
   }
 
   Member getCombinedMemberSignatureKernel(Class cls, Name name, bool isSetter,
@@ -685,8 +695,8 @@
       Set<ClassMember> overriddenMemberSet =
           toSet(declaredMember.classBuilder, overriddenMembers);
       if (classBuilder.library.isNonNullableByDefault) {
-        CombinedMemberSignature combinedMemberSignature =
-            new CombinedMemberSignature(
+        CombinedClassMemberSignature combinedMemberSignature =
+            new CombinedClassMemberSignature(
                 hierarchy, classBuilder, overriddenMemberSet.toList(),
                 forSetter: false);
         FunctionType combinedMemberSignatureType = combinedMemberSignature
@@ -957,84 +967,10 @@
     assert(!declaredMember.isGetter && !declaredMember.isSetter);
     // Trigger computation of method type.
     Procedure declaredProcedure = declaredMember.getMember(hierarchy);
-    FunctionNode declaredFunction = declaredProcedure.function;
-    List<TypeParameter> declaredTypeParameters =
-        declaredFunction.typeParameters;
-    List<VariableDeclaration> declaredPositional =
-        declaredFunction.positionalParameters;
-    List<VariableDeclaration> declaredNamed = declaredFunction.namedParameters;
     for (ClassMember overriddenMember
         in toSet(declaredMember.classBuilder, overriddenMembers)) {
-      Member bMember = overriddenMember.getMember(hierarchy);
-      if (bMember is! Procedure) {
-        debug?.log("Giving up 1");
-        continue;
-      }
-      Procedure bProcedure = bMember;
-      FunctionNode bFunction = bProcedure.function;
-
-      List<TypeParameter> bTypeParameters = bFunction.typeParameters;
-      int typeParameterCount = declaredTypeParameters.length;
-      if (typeParameterCount != bTypeParameters.length) {
-        debug?.log("Giving up 2");
-        continue;
-      }
-      if (typeParameterCount != 0) {
-        for (int i = 0; i < typeParameterCount; i++) {
-          copyTypeParameterCovariance(declaredMember.classBuilder,
-              declaredTypeParameters[i], bTypeParameters[i]);
-        }
-      }
-
-      if (declaredFunction.requiredParameterCount >
-          bFunction.requiredParameterCount) {
-        debug?.log("Giving up 4");
-        continue;
-      }
-      List<VariableDeclaration> bPositional = bFunction.positionalParameters;
-      if (declaredPositional.length < bPositional.length) {
-        debug?.log("Giving up 5");
-        continue;
-      }
-
-      for (int i = 0; i < bPositional.length; i++) {
-        VariableDeclaration aParameter = declaredPositional[i];
-        VariableDeclaration bParameter = bPositional[i];
-        copyParameterCovariance(
-            declaredMember.classBuilder, aParameter, bParameter);
-      }
-
-      List<VariableDeclaration> bNamed = bFunction.namedParameters;
-      named:
-      if (declaredNamed.isNotEmpty || bNamed.isNotEmpty) {
-        if (declaredPositional.length != bPositional.length) {
-          debug?.log("Giving up 9");
-          break named;
-        }
-        if (declaredFunction.requiredParameterCount !=
-            bFunction.requiredParameterCount) {
-          debug?.log("Giving up 10");
-          break named;
-        }
-
-        declaredNamed = declaredNamed.toList()..sort(compareNamedParameters);
-        bNamed = bNamed.toList()..sort(compareNamedParameters);
-        int aCount = 0;
-        for (int bCount = 0; bCount < bNamed.length; bCount++) {
-          String name = bNamed[bCount].name;
-          for (; aCount < declaredNamed.length; aCount++) {
-            if (declaredNamed[aCount].name == name) break;
-          }
-          if (aCount == declaredNamed.length) {
-            debug?.log("Giving up 11");
-            break named;
-          }
-          VariableDeclaration aParameter = declaredNamed[aCount];
-          VariableDeclaration bParameter = bNamed[bCount];
-          copyParameterCovariance(
-              declaredMember.classBuilder, aParameter, bParameter);
-        }
-      }
+      Covariance covariance = overriddenMember.getCovariance(hierarchy);
+      covariance.applyCovariance(declaredProcedure);
     }
   }
 
@@ -1051,30 +987,10 @@
     assert(declaredMember.isSetter);
     // Trigger computation of the getter type.
     Procedure declaredSetter = declaredMember.getMember(hierarchy);
-    VariableDeclaration setterParameter =
-        declaredSetter.function.positionalParameters.single;
     for (ClassMember overriddenMember
         in toSet(declaredMember.classBuilder, overriddenMembers)) {
-      Member bTarget = overriddenMember.getMember(hierarchy);
-      if (bTarget is Field) {
-        copyParameterCovarianceFromField(
-            declaredMember.classBuilder, setterParameter, bTarget);
-      } else if (bTarget is Procedure) {
-        if (overriddenMember.isSetter) {
-          VariableDeclaration bParameter =
-              bTarget.function.positionalParameters.single;
-          copyParameterCovariance(
-              declaredMember.classBuilder, setterParameter, bParameter);
-        } else if (overriddenMember.isGetter) {
-          // No variance to copy from getter.
-        } else {
-          debug?.log("Giving up (not accessor: ${bTarget.kind})");
-          continue;
-        }
-      } else {
-        debug?.log("Giving up (not field/procedure: ${bTarget.runtimeType})");
-        return;
-      }
+      Covariance covariance = overriddenMember.getCovariance(hierarchy);
+      covariance.applyCovariance(declaredSetter);
     }
   }
 
@@ -1102,8 +1018,8 @@
 
         void inferFrom(List<ClassMember> members, {bool forSetter}) {
           assert(forSetter != null);
-          CombinedMemberSignature combinedMemberSignature =
-              new CombinedMemberSignature(hierarchy, classBuilder, members,
+          CombinedClassMemberSignature combinedMemberSignature =
+              new CombinedClassMemberSignature(hierarchy, classBuilder, members,
                   forSetter: forSetter);
           DartType combinedMemberSignatureType =
               combinedMemberSignature.combinedMemberSignatureType;
@@ -1229,8 +1145,8 @@
 
         void inferFrom(List<ClassMember> members, {bool forSetter}) {
           assert(forSetter != null);
-          CombinedMemberSignature combinedMemberSignature =
-              new CombinedMemberSignature(hierarchy, classBuilder, members,
+          CombinedClassMemberSignature combinedMemberSignature =
+              new CombinedClassMemberSignature(hierarchy, classBuilder, members,
                   forSetter: forSetter);
           DartType combinedMemberSignatureType =
               combinedMemberSignature.combinedMemberSignatureType;
@@ -1393,8 +1309,8 @@
 
         DartType inferFrom(List<ClassMember> members, {bool forSetter}) {
           assert(forSetter != null);
-          CombinedMemberSignature combinedMemberSignature =
-              new CombinedMemberSignature(hierarchy, classBuilder, members,
+          CombinedClassMemberSignature combinedMemberSignature =
+              new CombinedClassMemberSignature(hierarchy, classBuilder, members,
                   forSetter: forSetter);
           return combinedMemberSignature.combinedMemberSignatureType;
         }
@@ -1525,74 +1441,8 @@
     Field declaredField = declaredMember.getMember(hierarchy);
     for (ClassMember overriddenMember
         in toSet(declaredMember.classBuilder, overriddenMembers)) {
-      Member bTarget = overriddenMember.getMember(hierarchy);
-      if (bTarget is Procedure) {
-        if (bTarget.isSetter) {
-          VariableDeclaration parameter =
-              bTarget.function.positionalParameters.single;
-          copyFieldCovarianceFromParameter(
-              declaredMember.classBuilder, declaredField, parameter);
-        }
-      } else if (bTarget is Field) {
-        copyFieldCovariance(
-            declaredMember.classBuilder, declaredField, bTarget);
-      }
-    }
-  }
-
-  void copyParameterCovariance(Builder parent, VariableDeclaration aParameter,
-      VariableDeclaration bParameter) {
-    if (parent == classBuilder) {
-      if (bParameter.isCovariant) {
-        aParameter.isCovariant = true;
-      }
-      if (bParameter.isGenericCovariantImpl) {
-        aParameter.isGenericCovariantImpl = true;
-      }
-    }
-  }
-
-  void copyParameterCovarianceFromField(
-      Builder parent, VariableDeclaration aParameter, Field bField) {
-    if (parent == classBuilder) {
-      if (bField.isCovariant) {
-        aParameter.isCovariant = true;
-      }
-      if (bField.isGenericCovariantImpl) {
-        aParameter.isGenericCovariantImpl = true;
-      }
-    }
-  }
-
-  void copyFieldCovariance(Builder parent, Field aField, Field bField) {
-    if (parent == classBuilder) {
-      if (bField.isCovariant) {
-        aField.isCovariant = true;
-      }
-      if (bField.isGenericCovariantImpl) {
-        aField.isGenericCovariantImpl = true;
-      }
-    }
-  }
-
-  void copyFieldCovarianceFromParameter(
-      Builder parent, Field aField, VariableDeclaration bParameter) {
-    if (parent == classBuilder) {
-      if (bParameter.isCovariant) {
-        aField.isCovariant = true;
-      }
-      if (bParameter.isGenericCovariantImpl) {
-        aField.isGenericCovariantImpl = true;
-      }
-    }
-  }
-
-  void copyTypeParameterCovariance(
-      Builder parent, TypeParameter aParameter, TypeParameter bParameter) {
-    if (parent == classBuilder) {
-      if (bParameter.isGenericCovariantImpl) {
-        aParameter.isGenericCovariantImpl = true;
-      }
+      Covariance covariance = overriddenMember.getCovariance(hierarchy);
+      covariance.applyCovariance(declaredField);
     }
   }
 
@@ -1678,28 +1528,10 @@
       assert(supernode != null);
     }
 
-    Scope scope = classBuilder.scope;
-    if (classBuilder.isMixinApplication) {
-      TypeBuilder mixedInTypeBuilder = classBuilder.mixedInTypeBuilder;
-      TypeDeclarationBuilder mixin = mixedInTypeBuilder.declaration;
-      inferMixinApplication();
-      while (mixin.isNamedMixinApplication) {
-        ClassBuilder named = mixin;
-        mixedInTypeBuilder = named.mixedInTypeBuilder;
-        mixin = mixedInTypeBuilder.declaration;
-      }
-      if (mixin is TypeAliasBuilder) {
-        TypeAliasBuilder aliasBuilder = mixin;
-        NamedTypeBuilder namedBuilder = mixedInTypeBuilder;
-        mixin = aliasBuilder.unaliasDeclaration(namedBuilder.arguments);
-      }
-      if (mixin is ClassBuilder) {
-        scope = mixin.scope.computeMixinScope();
-      }
-    }
-
     Map<Name, Tuple> memberMap = {};
 
+    Scope scope = classBuilder.scope;
+
     for (MemberBuilder memberBuilder in scope.localMembers) {
       for (ClassMember classMember in memberBuilder.localMembers) {
         Tuple tuple = memberMap[classMember.name];
@@ -1738,6 +1570,63 @@
       }
     }
 
+    if (classBuilder.isMixinApplication) {
+      TypeBuilder mixedInTypeBuilder = classBuilder.mixedInTypeBuilder;
+      TypeDeclarationBuilder mixin = mixedInTypeBuilder.declaration;
+      inferMixinApplication();
+      while (mixin.isNamedMixinApplication) {
+        ClassBuilder named = mixin;
+        mixedInTypeBuilder = named.mixedInTypeBuilder;
+        mixin = mixedInTypeBuilder.declaration;
+      }
+      if (mixin is TypeAliasBuilder) {
+        TypeAliasBuilder aliasBuilder = mixin;
+        NamedTypeBuilder namedBuilder = mixedInTypeBuilder;
+        mixin = aliasBuilder.unaliasDeclaration(namedBuilder.arguments);
+      }
+      if (mixin is ClassBuilder) {
+        scope = mixin.scope.computeMixinScope();
+
+        for (MemberBuilder memberBuilder in scope.localMembers) {
+          for (ClassMember classMember in memberBuilder.localMembers) {
+            Tuple tuple = memberMap[classMember.name];
+            if (tuple == null) {
+              memberMap[classMember.name] = new Tuple.mixInMember(classMember);
+            } else {
+              tuple.mixedInMember = classMember;
+            }
+          }
+          for (ClassMember classMember in memberBuilder.localSetters) {
+            Tuple tuple = memberMap[classMember.name];
+            if (tuple == null) {
+              memberMap[classMember.name] = new Tuple.mixInSetter(classMember);
+            } else {
+              tuple.mixedInSetter = classMember;
+            }
+          }
+        }
+
+        for (MemberBuilder memberBuilder in scope.localSetters) {
+          for (ClassMember classMember in memberBuilder.localMembers) {
+            Tuple tuple = memberMap[classMember.name];
+            if (tuple == null) {
+              memberMap[classMember.name] = new Tuple.mixInMember(classMember);
+            } else {
+              tuple.mixedInMember = classMember;
+            }
+          }
+          for (ClassMember classMember in memberBuilder.localSetters) {
+            Tuple tuple = memberMap[classMember.name];
+            if (tuple == null) {
+              memberMap[classMember.name] = new Tuple.mixInSetter(classMember);
+            } else {
+              tuple.mixedInSetter = classMember;
+            }
+          }
+        }
+      }
+    }
+
     List<Supertype> superclasses;
 
     List<Supertype> interfaces;
@@ -1974,8 +1863,16 @@
         }
       }
 
-      ClassMember computeClassMember(ClassMember declaredMember,
-          ClassMember extendedMember, bool forSetter) {
+      ClassMember computeClassMember(
+          ClassMember declaredMember,
+          ClassMember mixedInMember,
+          ClassMember extendedMember,
+          bool forSetter) {
+        if (mixedInMember != null) {
+          // TODO(johnniwinther): Handle members declared in mixin applications
+          // correctly.
+          declaredMember = null;
+        }
         if (declaredMember != null) {
           if (extendedMember != null && !extendedMember.isStatic) {
             if (declaredMember == extendedMember) return declaredMember;
@@ -2022,11 +1919,79 @@
                     concrete.name);
                 hierarchy.registerMemberComputation(result);
               }
-            } else if (classBuilder.isMixinApplication &&
-                declaredMember.classBuilder != classBuilder) {
+            }
+            assert(
+                !(classBuilder.isMixinApplication &&
+                    declaredMember.classBuilder != classBuilder),
+                "Unexpected declared member ${declaredMember} in "
+                "${classBuilder} from foreign class.");
+
+            if (result.name == noSuchMethodName &&
+                !result.isObjectMember(objectClass)) {
+              hasNoSuchMethod = true;
+            }
+            return result;
+          } else {
+            if (declaredMember.isAbstract) {
+              recordAbstractMember(declaredMember);
+            }
+            return declaredMember;
+          }
+        } else if (mixedInMember != null) {
+          if (extendedMember != null && !extendedMember.isStatic) {
+            if (mixedInMember == extendedMember) return mixedInMember;
+            if (mixedInMember.isDuplicate || extendedMember.isDuplicate) {
+              // Don't check overrides involving duplicated members.
+              return mixedInMember;
+            }
+            ClassMember result =
+                checkInheritanceConflict(mixedInMember, extendedMember);
+            if (result != null) return result;
+            assert(
+                mixedInMember.isProperty == extendedMember.isProperty,
+                "Unexpected member combination: "
+                "$mixedInMember vs $extendedMember");
+            result = mixedInMember;
+
+            // [declaredMember] is a method declared in [cls]. This means it
+            // defines the interface of this class regardless if its abstract.
+            if (!mixedInMember.isSynthesized) {
+              registerOverrideDependency(
+                  mixedInMember, extendedMember.abstract);
+              registerOverrideCheck(mixedInMember, extendedMember.abstract);
+            }
+
+            if (mixedInMember.isAbstract) {
+              if (extendedMember.isAbstract) {
+                recordAbstractMember(mixedInMember);
+              } else {
+                if (!classBuilder.isAbstract) {
+                  // The interface of this class is [declaredMember]. But the
+                  // implementation is [extendedMember]. So [extendedMember]
+                  // must implement [declaredMember], unless [cls] is abstract.
+                  registerOverrideCheck(extendedMember, mixedInMember);
+                }
+                ClassMember concrete = extendedMember.concrete;
+                result = new AbstractMemberOverridingImplementation(
+                    classBuilder,
+                    mixedInMember,
+                    concrete,
+                    mixedInMember.isProperty,
+                    forSetter,
+                    shouldModifyKernel,
+                    concrete.isAbstract,
+                    concrete.name);
+                hierarchy.registerMemberComputation(result);
+              }
+            } else {
+              assert(
+                  (classBuilder.isMixinApplication &&
+                      mixedInMember.classBuilder != classBuilder),
+                  "Unexpected mixed in member ${mixedInMember} in "
+                  "${classBuilder} from the current class.");
               result = InheritedImplementationInterfaceConflict.combined(
                   classBuilder,
-                  declaredMember,
+                  mixedInMember,
                   extendedMember,
                   forSetter,
                   shouldModifyKernel,
@@ -2042,10 +2007,10 @@
             }
             return result;
           } else {
-            if (declaredMember.isAbstract) {
-              recordAbstractMember(declaredMember);
+            if (mixedInMember.isAbstract) {
+              recordAbstractMember(mixedInMember);
             }
-            return declaredMember;
+            return mixedInMember;
           }
         } else if (extendedMember != null && !extendedMember.isStatic) {
           if (extendedMember.isAbstract) {
@@ -2236,20 +2201,24 @@
         }
       }
 
-      ClassMember classMember =
-          computeClassMember(tuple.declaredMember, tuple.extendedMember, false);
+      ClassMember classMember = computeClassMember(tuple.declaredMember,
+          tuple.mixedInMember, tuple.extendedMember, false);
       ClassMember interfaceMember =
           computeInterfaceMember(classMember, tuple.implementedMembers, false);
-      ClassMember classSetter =
-          computeClassMember(tuple.declaredSetter, tuple.extendedSetter, true);
+      ClassMember classSetter = computeClassMember(tuple.declaredSetter,
+          tuple.mixedInSetter, tuple.extendedSetter, true);
       ClassMember interfaceSetter =
           computeInterfaceMember(classSetter, tuple.implementedSetters, true);
 
-      if (tuple.declaredMember != null && classSetter != null) {
-        checkMemberVsSetter(tuple.declaredMember, classSetter);
+      if ((tuple.mixedInMember != null || tuple.declaredMember != null) &&
+          classSetter != null) {
+        checkMemberVsSetter(
+            tuple.mixedInMember ?? tuple.declaredMember, classSetter);
       }
-      if (tuple.declaredSetter != null && classMember != null) {
-        checkMemberVsSetter(tuple.declaredSetter, classMember);
+      if ((tuple.mixedInSetter != null || tuple.declaredSetter != null) &&
+          classMember != null) {
+        checkMemberVsSetter(
+            tuple.mixedInSetter ?? tuple.declaredSetter, classMember);
       }
       if (classMember != null && interfaceSetter != null) {
         checkMemberVsSetter(classMember, interfaceSetter);
@@ -2318,8 +2287,10 @@
           }
         }
 
-        registerOverrideDependencies(tuple.declaredMember);
-        registerOverrideDependencies(tuple.declaredSetter);
+        registerOverrideDependencies(
+            tuple.mixedInMember ?? tuple.declaredMember);
+        registerOverrideDependencies(
+            tuple.mixedInSetter ?? tuple.declaredSetter);
       }
     });
 
@@ -2402,29 +2373,6 @@
     return result ?? supertypes;
   }
 
-  List<TypeBuilder> computeDefaultTypeArguments(TypeBuilder type) {
-    TypeDeclarationBuilder decl = type.declaration;
-    List<TypeVariableBuilder> typeVariables;
-    LibraryBuilder library;
-    if (decl is TypeAliasBuilder) {
-      typeVariables = decl.typeVariables;
-      library = decl.library;
-    } else if (decl is ClassBuilder) {
-      typeVariables = decl.typeVariables;
-      library = decl.library;
-    } else {
-      return unhandled("${decl.runtimeType}", "$decl", classBuilder.charOffset,
-          classBuilder.fileUri);
-    }
-    List<TypeBuilder> result = new List<TypeBuilder>(typeVariables.length);
-    for (int i = 0; i < result.length; ++i) {
-      TypeVariableBuilder tv = typeVariables[i];
-      result[i] = tv.defaultType ??
-          library.loader.computeTypeBuilder(tv.parameter.defaultType);
-    }
-    return result;
-  }
-
   void addInterface(List<Supertype> interfaces, List<Supertype> superclasses,
       Supertype type) {
     if (type == null) return null;
@@ -2804,8 +2752,7 @@
   @override
   InterfaceType getTypeAsInstanceOf(InterfaceType type, Class superclass,
       Library clientLibrary, CoreTypes coreTypes) {
-    return hierarchy.getTypeAsInstanceOf(
-        type, superclass, clientLibrary, coreTypes);
+    return hierarchy.getTypeAsInstanceOf(type, superclass, clientLibrary);
   }
 
   @override
@@ -2995,39 +2942,14 @@
   void registerOverrideDependency(Set<ClassMember> overriddenMembers) {
     // Do nothing; this is only for declared members.
   }
-
-  @override
-  int get hashCode {
-    int hash = classBuilder.hashCode * 13 +
-        isSetter.hashCode * 17 +
-        isProperty.hashCode * 19 +
-        modifyKernel.hashCode * 23 +
-        name.hashCode * 29;
-    for (ClassMember declaration in declarations) {
-      hash ^= declaration.hashCode;
-    }
-    return hash;
-  }
-
-  @override
-  bool operator ==(Object other) {
-    if (identical(this, other)) return true;
-    return other is DelayedMember &&
-        classBuilder == other.classBuilder &&
-        isSetter == other.isSetter &&
-        isProperty == other.isProperty &&
-        modifyKernel == other.modifyKernel &&
-        name == other.name &&
-        declarations.length == other.declarations.length &&
-        _equalsList(declarations, other.declarations, declarations.length);
-  }
 }
 
 /// This represents a concrete implementation inherited from a superclass that
 /// has conflicts with methods inherited from an interface. The concrete
 /// implementation is the first element of [declarations].
 class InheritedImplementationInterfaceConflict extends DelayedMember {
-  Member combinedMemberSignatureResult;
+  Member _member;
+  Covariance _covariance;
   final ClassMember concreteMember;
 
   @override
@@ -3059,40 +2981,36 @@
         "[${declarations.join(', ')}])";
   }
 
-  @override
-  int get hashCode =>
-      super.hashCode +
-      concreteMember.hashCode * 11 +
-      isInheritableConflict.hashCode * 13;
-
-  @override
-  bool operator ==(Object other) {
-    if (identical(this, other)) return true;
-    return super == other &&
-        other is InheritedImplementationInterfaceConflict &&
-        concreteMember == other.concreteMember &&
-        isInheritableConflict == other.isInheritableConflict;
+  void _ensureMemberAndCovariance(ClassHierarchyBuilder hierarchy) {
+    if (_member == null) {
+      if (!classBuilder.isAbstract) {
+        if (classBuilder is SourceClassBuilder) {
+          for (int i = 0; i < declarations.length; i++) {
+            if (concreteMember != declarations[i]) {
+              new DelayedOverrideCheck(
+                      classBuilder, concreteMember, declarations[i])
+                  .check(hierarchy);
+            }
+          }
+        }
+      }
+      InterfaceConflict interfaceConflict = new InterfaceConflict(classBuilder,
+          declarations, isProperty, isSetter, modifyKernel, isAbstract, name);
+      _member = interfaceConflict.getMember(hierarchy);
+      _covariance = interfaceConflict.getCovariance(hierarchy);
+    }
   }
 
   @override
   Member getMember(ClassHierarchyBuilder hierarchy) {
-    if (combinedMemberSignatureResult != null) {
-      return combinedMemberSignatureResult;
-    }
-    if (!classBuilder.isAbstract) {
-      if (classBuilder is SourceClassBuilder) {
-        for (int i = 0; i < declarations.length; i++) {
-          if (concreteMember != declarations[i]) {
-            new DelayedOverrideCheck(
-                    classBuilder, concreteMember, declarations[i])
-                .check(hierarchy);
-          }
-        }
-      }
-    }
-    return combinedMemberSignatureResult = new InterfaceConflict(classBuilder,
-            declarations, isProperty, isSetter, modifyKernel, isAbstract, name)
-        .getMember(hierarchy);
+    _ensureMemberAndCovariance(hierarchy);
+    return _member;
+  }
+
+  @override
+  Covariance getCovariance(ClassHierarchyBuilder hierarchy) {
+    _ensureMemberAndCovariance(hierarchy);
+    return _covariance;
   }
 
   @override
@@ -3169,7 +3087,8 @@
   @override
   bool get isAbstract => isExplicitlyAbstract || isImplicitlyAbstract;
 
-  Member combinedMemberSignatureResult;
+  Member _member;
+  Covariance _covariance;
 
   @override
   String toString() {
@@ -3177,39 +3096,21 @@
         "[${declarations.join(', ')}])";
   }
 
-  @override
-  int get hashCode {
-    int hash = super.hashCode;
-    hash ^= isImplicitlyAbstract.hashCode;
-    for (ClassMember declaration in declarations) {
-      hash ^= declaration.hashCode;
-    }
-    return hash;
-  }
-
-  @override
-  bool operator ==(Object other) {
-    if (identical(this, other)) return true;
-    return super == other &&
-        other is InterfaceConflict &&
-        isImplicitlyAbstract == other.isImplicitlyAbstract;
-  }
-
-  @override
-  Member getMember(ClassHierarchyBuilder hierarchy) {
-    if (combinedMemberSignatureResult != null) {
-      return combinedMemberSignatureResult;
+  void _ensureMemberAndCovariance(ClassHierarchyBuilder hierarchy) {
+    if (_member != null) {
+      return;
     }
     if (classBuilder.library is! SourceLibraryBuilder) {
-      return combinedMemberSignatureResult =
-          declarations.first.getMember(hierarchy);
+      _member = declarations.first.getMember(hierarchy);
+      _covariance = declarations.first.getCovariance(hierarchy);
+      return;
     }
 
-    CombinedMemberSignature combinedMemberSignature =
-        new CombinedMemberSignature(hierarchy, classBuilder, declarations,
+    CombinedClassMemberSignature combinedMemberSignature =
+        new CombinedClassMemberSignature(hierarchy, classBuilder, declarations,
             forSetter: isSetter);
 
-    if (combinedMemberSignature.canonicalClassMember == null) {
+    if (combinedMemberSignature.canonicalMember == null) {
       String name = classBuilder.fullNameForErrors;
       int length = classBuilder.isAnonymousMixinApplication ? 1 : name.length;
       List<LocatedMessage> context = declarations.map((ClassMember d) {
@@ -3226,17 +3127,18 @@
           context: context);
       // TODO(johnniwinther): Maybe we should have an invalid marker to avoid
       // cascading errors.
-      return combinedMemberSignatureResult =
-          declarations.first.getMember(hierarchy);
+      _member = declarations.first.getMember(hierarchy);
+      _covariance = declarations.first.getCovariance(hierarchy);
+      return;
     }
     debug?.log("Combined Member Signature of ${fullNameForErrors}: "
-        "${combinedMemberSignature.canonicalClassMember.fullName}");
+        "${combinedMemberSignature.canonicalMember.fullName}");
 
     if (modifyKernel) {
       ProcedureKind kind = ProcedureKind.Method;
       Member bestMemberSoFar =
-          combinedMemberSignature.canonicalClassMember.getMember(hierarchy);
-      if (combinedMemberSignature.canonicalClassMember.isProperty) {
+          combinedMemberSignature.canonicalMember.getMember(hierarchy);
+      if (combinedMemberSignature.canonicalMember.isProperty) {
         kind = isSetter ? ProcedureKind.Setter : ProcedureKind.Getter;
       } else if (bestMemberSoFar is Procedure &&
           bestMemberSoFar.kind == ProcedureKind.Operator) {
@@ -3245,28 +3147,59 @@
 
       debug?.log("Combined Member Signature of ${fullNameForErrors}: new "
           "ForwardingNode($classBuilder, "
-          "${combinedMemberSignature.canonicalClassMember}, "
+          "${combinedMemberSignature.canonicalMember}, "
           "$declarations, $kind)");
       Member stub =
           new ForwardingNode(combinedMemberSignature, kind).finalize();
-      if (classBuilder.cls == stub.enclosingClass) {
-        classBuilder.cls.addMember(stub);
+      if (stub != null && classBuilder.cls == stub.enclosingClass) {
+        if (stub is Procedure) {
+          classBuilder.cls.addProcedure(stub);
+        } else if (stub is Field) {
+          classBuilder.cls.addField(stub);
+        } else if (stub is Constructor) {
+          classBuilder.cls.addConstructor(stub);
+        } else if (stub is RedirectingFactoryConstructor) {
+          classBuilder.cls.addRedirectingFactoryConstructor(stub);
+        } else {
+          unhandled("${stub.runtimeType}", "getMember", stub.fileOffset,
+              stub.fileUri);
+        }
         SourceLibraryBuilder library = classBuilder.library;
         Member bestMemberSoFar =
-            combinedMemberSignature.canonicalClassMember.getMember(hierarchy);
+            combinedMemberSignature.canonicalMember.getMember(hierarchy);
         if (bestMemberSoFar is Procedure) {
           library.forwardersOrigins..add(stub)..add(bestMemberSoFar);
         }
         debug?.log("Combined Member Signature of ${fullNameForErrors}: "
             "added stub $stub");
-        return combinedMemberSignatureResult = stub;
+        _member = stub;
+        _covariance = combinedMemberSignature.combinedMemberSignatureCovariance;
+        assert(
+            _covariance ==
+                new Covariance.fromMember(_member, forSetter: forSetter),
+            "Unexpected covariance for combined members signature "
+            "$_member. Found $_covariance, expected "
+            "${new Covariance.fromMember(_member, forSetter: forSetter)}.");
+        return;
       }
     }
 
     debug?.log(
         "Combined Member Signature of ${fullNameForErrors}: picked bestSoFar");
-    return combinedMemberSignatureResult =
-        combinedMemberSignature.canonicalClassMember.getMember(hierarchy);
+    _member = combinedMemberSignature.canonicalMember.getMember(hierarchy);
+    _covariance = combinedMemberSignature.combinedMemberSignatureCovariance;
+  }
+
+  @override
+  Member getMember(ClassHierarchyBuilder hierarchy) {
+    _ensureMemberAndCovariance(hierarchy);
+    return _member;
+  }
+
+  @override
+  Covariance getCovariance(ClassHierarchyBuilder hierarchy) {
+    _ensureMemberAndCovariance(hierarchy);
+    return _covariance;
   }
 
   @override
@@ -3345,8 +3278,7 @@
 
   bool _isChecked = false;
 
-  @override
-  Member getMember(ClassHierarchyBuilder hierarchy) {
+  void _ensureMemberAndCovariance(ClassHierarchyBuilder hierarchy) {
     if (!_isChecked) {
       _isChecked = true;
       if (!classBuilder.isAbstract &&
@@ -3366,16 +3298,28 @@
         // This call will add a body to the abstract method if needed for
         // isGenericCovariantImpl checks.
         new ForwardingNode(
-                new CombinedMemberSignature.internal(
-                    hierarchy, classBuilder, 1, declarations),
+                new CombinedClassMemberSignature.internal(
+                    hierarchy, classBuilder, 1, declarations,
+                    forSetter: isSetter),
                 kind)
             .finalize();
       }
     }
+  }
+
+  @override
+  Member getMember(ClassHierarchyBuilder hierarchy) {
+    _ensureMemberAndCovariance(hierarchy);
     return abstractMember.getMember(hierarchy);
   }
 
   @override
+  Covariance getCovariance(ClassHierarchyBuilder hierarchy) {
+    _ensureMemberAndCovariance(hierarchy);
+    return abstractMember.getCovariance(hierarchy);
+  }
+
+  @override
   DelayedMember withParent(ClassBuilder parent) {
     return parent == this.classBuilder
         ? this
@@ -3398,12 +3342,6 @@
   }
 
   @override
-  bool operator ==(Object other) {
-    if (identical(this, other)) return true;
-    return super == other && other is AbstractMemberOverridingImplementation;
-  }
-
-  @override
   ClassMember get abstract => abstractMember;
 
   @override
@@ -3570,17 +3508,6 @@
   return declaration is ClassBuilder ? declaration : null;
 }
 
-/// Returns `true` if the first [length] elements of [a] and [b] are the same.
-bool _equalsList<T>(List<T> a, List<T> b, int length) {
-  if (a.length < length || b.length < length) return false;
-  for (int index = 0; index < length; index++) {
-    if (a[index] != b[index]) {
-      return false;
-    }
-  }
-  return true;
-}
-
 Set<ClassMember> toSet(
     ClassBuilder classBuilder, Iterable<ClassMember> members) {
   Set<ClassMember> result = <ClassMember>{};
@@ -3598,300 +3525,3 @@
     }
   }
 }
-
-/// Class used for computing and inspecting the combined member signature for
-/// a set of overridden/inherited members.
-class CombinedMemberSignature {
-  /// The class hierarchy builder used for building this class.
-  final ClassHierarchyBuilder hierarchy;
-
-  /// The target class for the combined member signature.
-  ///
-  /// The [_memberTypes] are computed in terms of each member is inherited into
-  /// [classBuilder].
-  ///
-  /// [classBuilder] is also used for determining whether the combined member
-  /// signature should be computed using nnbd or legacy semantics.
-  final SourceClassBuilder classBuilder;
-
-  /// The list of the members inherited into or overridden in [classBuilder].
-  final List<ClassMember> members;
-
-  /// The index within [members] for the member whose type is the most specific
-  /// among [members]. If `null`, the combined member signature is not defined
-  /// for [members] in [classBuilder].
-  ///
-  /// For the legacy computation, the type of this member defines the combined
-  /// member signature.
-  ///
-  /// For the nnbd computation, this is one of the members whose type define
-  /// the combined member signature, and the indices of the remaining members
-  /// are stored in [_mutualSubtypes].
-  int _canonicalMemberIndex;
-
-  /// For the nnbd computation, this maps each distinct but most specific member
-  /// type to the index of one of the [members] with that type.
-  ///
-  /// If there is only one most specific member type, this is `null`.
-  Map<DartType, int> _mutualSubtypes;
-
-  /// Cache for the types of [members] as inherited into [classBuilder].
-  List<DartType> _memberTypes;
-
-  /// Cache for the this type of [classBuilder].
-  DartType _thisType;
-
-  /// If `true` the combined member signature type has been computed.
-  ///
-  /// Note that the combined member signature type might be undefined in which
-  /// case [_combinedMemberSignatureType] is `null`.
-  bool _isCombinedMemberSignatureTypeComputed = false;
-
-  /// Cache the computed combined member signature type.
-  ///
-  /// If the combined member signature type is undefined this is set to `null`.
-  DartType _combinedMemberSignatureType;
-
-  /// Creates a [CombinedMemberSignature] whose canonical member is already
-  /// defined.
-  CombinedMemberSignature.internal(this.hierarchy, this.classBuilder,
-      this._canonicalMemberIndex, this.members);
-
-  /// Creates a [CombinedMemberSignature] for [members] inherited into
-  /// [classBuilder].
-  ///
-  /// If [forSetter] is `true`, contravariance of the setter types is used to
-  /// compute the most specific member type. Otherwise covariance of the getter
-  /// types or function types is used.
-  CombinedMemberSignature(this.hierarchy, this.classBuilder, this.members,
-      {bool forSetter}) {
-    assert(forSetter != null);
-    ClassMember bestSoFar;
-    int bestSoFarIndex;
-    if (members.length == 1) {
-      bestSoFar = members.first;
-      bestSoFarIndex = 0;
-    } else {
-      bool isNonNullableByDefault = classBuilder.library.isNonNullableByDefault;
-
-      DartType bestTypeSoFar;
-      for (int candidateIndex = members.length - 1;
-          candidateIndex >= 0;
-          candidateIndex--) {
-        ClassMember candidate = members[candidateIndex];
-        DartType candidateType = getMemberType(candidateIndex);
-        if (bestSoFar == null) {
-          bestSoFar = candidate;
-          bestTypeSoFar = candidateType;
-          bestSoFarIndex = candidateIndex;
-        } else {
-          if (_isMoreSpecific(candidateType, bestTypeSoFar, forSetter)) {
-            if (isNonNullableByDefault &&
-                _isMoreSpecific(bestTypeSoFar, candidateType, forSetter)) {
-              if (_mutualSubtypes == null) {
-                _mutualSubtypes = {
-                  bestTypeSoFar: bestSoFarIndex,
-                  candidateType: candidateIndex
-                };
-              } else {
-                _mutualSubtypes[candidateType] = candidateIndex;
-              }
-            } else {
-              _mutualSubtypes = null;
-            }
-            bestSoFarIndex = candidateIndex;
-            bestSoFar = candidate;
-            bestTypeSoFar = candidateType;
-          }
-        }
-      }
-      if (bestSoFar != null) {
-        for (int candidateIndex = 0;
-            candidateIndex < members.length;
-            candidateIndex++) {
-          DartType candidateType = getMemberType(candidateIndex);
-          if (!_isMoreSpecific(bestTypeSoFar, candidateType, forSetter)) {
-            if (!shouldOverrideProblemBeOverlooked(classBuilder)) {
-              bestSoFar = null;
-              bestSoFarIndex = null;
-              bestTypeSoFar = null;
-              _mutualSubtypes = null;
-            }
-            break;
-          }
-        }
-      }
-    }
-
-    _canonicalMemberIndex = bestSoFarIndex;
-  }
-
-  /// The member within [members] type is the most specific among [members].
-  /// If `null`, the combined member signature is not defined for [members] in
-  /// [classBuilder].
-  ///
-  /// For the legacy computation, the type of this member defines the combined
-  /// member signature.
-  ///
-  /// For the nnbd computation, this is one of the members whose type define
-  /// the combined member signature, and the indices of the all members whose
-  /// type define the combined member signature are in [mutualSubtypeIndices].
-  ClassMember get canonicalClassMember =>
-      _canonicalMemberIndex != null ? members[_canonicalMemberIndex] : null;
-
-  /// The index within [members] for the member whose type is the most specific
-  /// among [members]. If `null`, the combined member signature is not defined
-  /// for [members] in [classBuilder].
-  ///
-  /// For the legacy computation, the type of this member defines the combined
-  /// member signature.
-  ///
-  /// For the nnbd computation, this is one of the members whose type define
-  /// the combined member signature, and the indices of the all members whose
-  /// type define the combined member signature are in [mutualSubtypeIndices].
-  int get classMemberIndex => _canonicalMemberIndex;
-
-  /// For the nnbd computation, the indices of the [members] with most specific
-  /// member type.
-  ///
-  /// If there is only one most specific member type, this is `null`.
-  Set<int> get mutualSubtypeIndices => _mutualSubtypes?.values?.toSet();
-
-  /// The this type of [classBuilder].
-  DartType get thisType {
-    return _thisType ??= hierarchy.coreTypes
-        .thisInterfaceType(classBuilder.cls, classBuilder.library.nonNullable);
-  }
-
-  /// Returns type of the [index]th member in [members] as inherited in
-  /// [classBuilder].
-  DartType getMemberType(int index) {
-    _memberTypes ??= new List<DartType>(members.length);
-    DartType candidateType = _memberTypes[index];
-    if (candidateType == null) {
-      ClassMember candidate = members[index];
-      Member target = candidate.getMember(hierarchy);
-      assert(target != null,
-          "No member computed for ${candidate} (${candidate.runtimeType})");
-      candidateType = _computeMemberType(thisType, target);
-      if (!classBuilder.library.isNonNullableByDefault) {
-        candidateType = legacyErasure(hierarchy.coreTypes, candidateType);
-      }
-      _memberTypes[index] = candidateType;
-    }
-    return candidateType;
-  }
-
-  /// Returns the type of the combined member signature, if defined.
-  DartType get combinedMemberSignatureType {
-    if (!_isCombinedMemberSignatureTypeComputed) {
-      _isCombinedMemberSignatureTypeComputed = true;
-      if (_canonicalMemberIndex == null) {
-        return null;
-      }
-      if (classBuilder.library.isNonNullableByDefault) {
-        _combinedMemberSignatureType = getMemberType(_canonicalMemberIndex);
-        if (_mutualSubtypes != null) {
-          _combinedMemberSignatureType =
-              norm(hierarchy.coreTypes, _combinedMemberSignatureType);
-          for (int index in _mutualSubtypes.values) {
-            if (_canonicalMemberIndex != index) {
-              _combinedMemberSignatureType = nnbdTopMerge(
-                  hierarchy.coreTypes,
-                  _combinedMemberSignatureType,
-                  norm(hierarchy.coreTypes, getMemberType(index)));
-            }
-          }
-        }
-      } else {
-        _combinedMemberSignatureType = legacyErasure(
-            hierarchy.coreTypes, getMemberType(_canonicalMemberIndex));
-      }
-    }
-    return _combinedMemberSignatureType;
-  }
-
-  /// Returns the type of the combined member signature, if defined, with
-  /// all method type parameters substituted with [typeParameters].
-  ///
-  /// This is used for inferring types on a declared member from the type of the
-  /// combined member signature.
-  DartType getCombinedSignatureTypeInContext(
-      List<TypeParameter> typeParameters) {
-    DartType type = combinedMemberSignatureType;
-    if (type == null) {
-      return null;
-    }
-    int typeParameterCount = typeParameters.length;
-    if (type is FunctionType) {
-      List<TypeParameter> signatureTypeParameters = type.typeParameters;
-      if (typeParameterCount != signatureTypeParameters.length) {
-        return null;
-      }
-      if (typeParameterCount == 0) {
-        return type;
-      }
-      List<DartType> types = new List<DartType>(typeParameterCount);
-      for (int i = 0; i < typeParameterCount; i++) {
-        types[i] = new TypeParameterType.forAlphaRenaming(
-            signatureTypeParameters[i], typeParameters[i]);
-      }
-      Substitution substitution =
-          Substitution.fromPairs(signatureTypeParameters, types);
-      for (int i = 0; i < typeParameterCount; i++) {
-        DartType typeParameterBound = typeParameters[i].bound;
-        DartType signatureTypeParameterBound =
-            substitution.substituteType(signatureTypeParameters[i].bound);
-        if (!hierarchy.types
-            .performNullabilityAwareMutualSubtypesCheck(
-                typeParameterBound, signatureTypeParameterBound)
-            .isSubtypeWhenUsingNullabilities()) {
-          return null;
-        }
-      }
-      return substitution.substituteType(type.withoutTypeParameters);
-    } else if (typeParameterCount != 0) {
-      return null;
-    }
-    return type;
-  }
-
-  DartType _computeMemberType(DartType thisType, Member member) {
-    DartType type;
-    if (member is Procedure) {
-      if (member.isGetter) {
-        type = member.getterType;
-      } else if (member.isSetter) {
-        type = member.setterType;
-      } else {
-        type = member.function
-            .computeFunctionType(member.enclosingLibrary.nonNullable);
-      }
-    } else if (member is Field) {
-      type = member.type;
-    } else {
-      unhandled("${member.runtimeType}", "$member", classBuilder.charOffset,
-          classBuilder.fileUri);
-    }
-    InterfaceType instance = hierarchy.getTypeAsInstanceOf(
-        thisType,
-        member.enclosingClass,
-        classBuilder.library.library,
-        hierarchy.coreTypes);
-    assert(
-        instance != null,
-        "No instance of $thisType as ${member.enclosingClass} found for "
-        "$member.");
-    return Substitution.fromInterfaceType(instance).substituteType(type);
-  }
-
-  bool _isMoreSpecific(DartType a, DartType b, bool forSetter) {
-    if (forSetter) {
-      return hierarchy.types
-          .isSubtypeOf(b, a, SubtypeCheckMode.withNullabilities);
-    } else {
-      return hierarchy.types
-          .isSubtypeOf(a, b, SubtypeCheckMode.withNullabilities);
-    }
-  }
-}
diff --git a/pkg/front_end/lib/src/fasta/kernel/collections.dart b/pkg/front_end/lib/src/fasta/kernel/collections.dart
index 0a26c3a..79b99c0 100644
--- a/pkg/front_end/lib/src/fasta/kernel/collections.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/collections.dart
@@ -53,6 +53,11 @@
   }
 
   @override
+  DartType getStaticTypeInternal(StaticTypeContext context) {
+    return unsupported("getStaticTypeInternal", fileOffset, getFileUri(this));
+  }
+
+  @override
   R accept<R>(ExpressionVisitor<R> v) => v.defaultExpression(this);
 
   @override
diff --git a/pkg/front_end/lib/src/fasta/kernel/combined_member_signature.dart b/pkg/front_end/lib/src/fasta/kernel/combined_member_signature.dart
new file mode 100644
index 0000000..f89b4e8
--- /dev/null
+++ b/pkg/front_end/lib/src/fasta/kernel/combined_member_signature.dart
@@ -0,0 +1,743 @@
+// Copyright (c) 2018, 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:kernel/ast.dart' hide MapEntry;
+
+import 'package:kernel/class_hierarchy.dart' show ClassHierarchyBase;
+
+import 'package:kernel/core_types.dart' show CoreTypes;
+
+import 'package:kernel/type_algebra.dart' show Substitution;
+import 'package:kernel/type_environment.dart';
+
+import 'package:kernel/src/legacy_erasure.dart';
+import 'package:kernel/src/nnbd_top_merge.dart';
+import 'package:kernel/src/norm.dart';
+import 'package:kernel/src/types.dart' show Types;
+
+import '../problems.dart' show unhandled;
+
+import '../source/source_class_builder.dart';
+
+import 'class_hierarchy_builder.dart';
+import 'member_covariance.dart';
+
+/// Class used for computing and inspecting the combined member signature for
+/// a set of overridden/inherited members.
+abstract class CombinedMemberSignatureBase<T> {
+  ClassHierarchyBase get hierarchy;
+
+  /// The target class for the combined member signature.
+  ///
+  /// The [_memberTypes] are computed in terms of each member is inherited into
+  /// [classBuilder].
+  ///
+  /// [classBuilder] is also used for determining whether the combined member
+  /// signature should be computed using nnbd or legacy semantics.
+  final SourceClassBuilder classBuilder;
+
+  /// The list of members from which the combined member signature is computed.
+  List<T> get members;
+
+  /// If `true` the combined member signature is for the setter aspect of the
+  /// members. Otherwise it is for the getter/method aspect of the members.
+  final bool forSetter;
+
+  /// The index within [members] for the member whose type is the most specific
+  /// among [members]. If `null`, the combined member signature is not defined
+  /// for [members] in [classBuilder].
+  ///
+  /// For the legacy computation, the type of this member defines the combined
+  /// member signature.
+  ///
+  /// For the nnbd computation, this is one of the members whose type define
+  /// the combined member signature, and the indices of the remaining members
+  /// are stored in [_mutualSubtypes].
+  int _canonicalMemberIndex;
+
+  /// For the nnbd computation, this maps each distinct but most specific member
+  /// type to the index of one of the [members] with that type.
+  ///
+  /// If there is only one most specific member type, this is `null`.
+  Map<DartType, int> _mutualSubtypes;
+
+  /// Cache for the types of [members] as inherited into [classBuilder].
+  List<DartType> _memberTypes;
+
+  List<Covariance> _memberCovariances;
+
+  /// Cache for the this type of [classBuilder].
+  DartType _thisType;
+
+  /// If `true` the combined member signature type has been computed.
+  ///
+  /// Note that the combined member signature type might be undefined in which
+  /// case [_combinedMemberSignatureType] is `null`.
+  bool _isCombinedMemberSignatureTypeComputed = false;
+
+  /// Cache the computed combined member signature type.
+  ///
+  /// If the combined member signature type is undefined this is set to `null`.
+  DartType _combinedMemberSignatureType;
+
+  /// The indices for the members whose type needed legacy erasure.
+  ///
+  /// This is fully computed when [combinedMemberSignatureType] has been
+  /// computed.
+  Set<int> _neededLegacyErasureIndices;
+
+  bool _neededNnbdTopMerge = false;
+
+  bool _needsCovarianceMerging = false;
+
+  bool _isCombinedMemberSignatureCovarianceComputed = false;
+
+  Covariance _combinedMemberSignatureCovariance;
+
+  /// Creates a [CombinedClassMemberSignature] whose canonical member is already
+  /// defined.
+  CombinedMemberSignatureBase.internal(
+      this.classBuilder, this._canonicalMemberIndex, this.forSetter)
+      : assert(forSetter != null);
+
+  /// Creates a [CombinedClassMemberSignature] for [members] inherited into
+  /// [classBuilder].
+  ///
+  /// If [forSetter] is `true`, contravariance of the setter types is used to
+  /// compute the most specific member type. Otherwise covariance of the getter
+  /// types or function types is used.
+  CombinedMemberSignatureBase(this.classBuilder, {this.forSetter}) {
+    assert(forSetter != null);
+    int bestSoFarIndex;
+    if (members.length == 1) {
+      bestSoFarIndex = 0;
+    } else {
+      bool isNonNullableByDefault = classBuilder.library.isNonNullableByDefault;
+
+      DartType bestTypeSoFar;
+      for (int candidateIndex = members.length - 1;
+          candidateIndex >= 0;
+          candidateIndex--) {
+        DartType candidateType = getMemberType(candidateIndex);
+        if (bestSoFarIndex == null) {
+          bestTypeSoFar = candidateType;
+          bestSoFarIndex = candidateIndex;
+        } else {
+          if (_isMoreSpecific(candidateType, bestTypeSoFar, forSetter)) {
+            if (isNonNullableByDefault &&
+                _isMoreSpecific(bestTypeSoFar, candidateType, forSetter)) {
+              if (_mutualSubtypes == null) {
+                _mutualSubtypes = {
+                  bestTypeSoFar: bestSoFarIndex,
+                  candidateType: candidateIndex
+                };
+              } else {
+                _mutualSubtypes[candidateType] = candidateIndex;
+              }
+            } else {
+              _mutualSubtypes = null;
+            }
+            bestSoFarIndex = candidateIndex;
+            bestTypeSoFar = candidateType;
+          }
+        }
+      }
+      if (_mutualSubtypes?.length == 1) {
+        /// If all mutual subtypes have the same type, the type should not
+        /// be normalized.
+        _mutualSubtypes = null;
+      }
+      if (bestSoFarIndex != null) {
+        for (int candidateIndex = 0;
+            candidateIndex < members.length;
+            candidateIndex++) {
+          DartType candidateType = getMemberType(candidateIndex);
+          if (!_isMoreSpecific(bestTypeSoFar, candidateType, forSetter)) {
+            if (!shouldOverrideProblemBeOverlooked(classBuilder)) {
+              bestSoFarIndex = null;
+              bestTypeSoFar = null;
+              _mutualSubtypes = null;
+            }
+            break;
+          }
+        }
+      }
+    }
+
+    _canonicalMemberIndex = bestSoFarIndex;
+  }
+
+  /// The member within [members] type is the most specific among [members].
+  /// If `null`, the combined member signature is not defined for [members] in
+  /// [classBuilder].
+  ///
+  /// For the legacy computation, the type of this member defines the combined
+  /// member signature.
+  ///
+  /// For the nnbd computation, this is one of the members whose type define
+  /// the combined member signature, and the indices of the all members whose
+  /// type define the combined member signature are in [mutualSubtypeIndices].
+  T get canonicalMember =>
+      _canonicalMemberIndex != null ? members[_canonicalMemberIndex] : null;
+
+  /// The index within [members] for the member whose type is the most specific
+  /// among [members]. If `null`, the combined member signature is not defined
+  /// for [members] in [classBuilder].
+  ///
+  /// For the legacy computation, the type of this member defines the combined
+  /// member signature.
+  ///
+  /// For the nnbd computation, this is one of the members whose type define
+  /// the combined member signature, and the indices of the all members whose
+  /// type define the combined member signature are in [mutualSubtypeIndices].
+  int get canonicalMemberIndex => _canonicalMemberIndex;
+
+  /// For the nnbd computation, the indices of the [members] with most specific
+  /// member type.
+  ///
+  /// If there is only one most specific member type, this is `null`.
+  Set<int> get mutualSubtypeIndices => _mutualSubtypes?.values?.toSet();
+
+  Member _getMember(int index);
+
+  CoreTypes get _coreTypes => hierarchy.coreTypes;
+
+  Types get _types;
+
+  /// Returns `true` if legacy erasure was needed to compute the combined
+  /// member signature type.
+  ///
+  /// Legacy erasure is considered need of if the used of it resulted in a
+  /// different type.
+  bool get neededLegacyErasure {
+    _ensureCombinedMemberSignatureType();
+    return _neededLegacyErasureIndices?.contains(canonicalMemberIndex) ?? false;
+  }
+
+  /// Returns `true` if nnbd top merge and normalization was needed to compute
+  /// the combined member signature type.
+  bool get neededNnbdTopMerge {
+    _ensureCombinedMemberSignatureType();
+    return _neededNnbdTopMerge;
+  }
+
+  /// Returns `true` if the covariance of the combined member signature is
+  /// different from the covariance of the overridden member in the superclass.
+  ///
+  /// If `true` a concrete forwarding stub that checks the covariance must
+  /// be generated.
+  // TODO(johnniwinther): This is imprecise. It assumes that the 0th member is
+  // from the superclass which might not be the case.
+  bool get needsSuperImpl {
+    return _getMemberCovariance(0) != combinedMemberSignatureCovariance;
+  }
+
+  /// The this type of [classBuilder].
+  DartType get thisType {
+    return _thisType ??= _coreTypes.thisInterfaceType(
+        classBuilder.cls, classBuilder.library.nonNullable);
+  }
+
+  /// Returns `true` if the canonical member is declared in [classBuilder].
+  bool get isCanonicalMemberDeclared {
+    return _canonicalMemberIndex != null &&
+        _getMember(_canonicalMemberIndex).enclosingClass == classBuilder.cls;
+  }
+
+  /// Returns `true` if the canonical member is the 0th.
+  // TODO(johnniwinther): This is currently used under the assumption that the
+  // 0th member is either from the superclass or the one found if looked up
+  // the class hierarchy. This is a very brittle assumption.
+  bool get isCanonicalMemberFirst => _canonicalMemberIndex == 0;
+
+  /// Returns type of the [index]th member in [members] as inherited in
+  /// [classBuilder].
+  DartType getMemberType(int index) {
+    _memberTypes ??= new List<DartType>(members.length);
+    DartType candidateType = _memberTypes[index];
+    if (candidateType == null) {
+      Member target = _getMember(index);
+      assert(target != null,
+          "No member computed for index ${index} in ${members}");
+      candidateType = _computeMemberType(thisType, target);
+      if (!classBuilder.library.isNonNullableByDefault) {
+        DartType legacyErasure = rawLegacyErasure(_coreTypes, candidateType);
+        if (legacyErasure != null) {
+          _neededLegacyErasureIndices ??= {};
+          _neededLegacyErasureIndices.add(index);
+          candidateType = legacyErasure;
+        }
+      }
+      _memberTypes[index] = candidateType;
+    }
+    return candidateType;
+  }
+
+  void _ensureCombinedMemberSignatureType() {
+    if (!_isCombinedMemberSignatureTypeComputed) {
+      _isCombinedMemberSignatureTypeComputed = true;
+      if (_canonicalMemberIndex == null) {
+        return null;
+      }
+      if (classBuilder.library.isNonNullableByDefault) {
+        DartType canonicalMemberType =
+            _combinedMemberSignatureType = getMemberType(_canonicalMemberIndex);
+        if (_mutualSubtypes != null) {
+          _combinedMemberSignatureType =
+              norm(_coreTypes, _combinedMemberSignatureType);
+          for (int index in _mutualSubtypes.values) {
+            if (_canonicalMemberIndex != index) {
+              _combinedMemberSignatureType = nnbdTopMerge(
+                  _coreTypes,
+                  _combinedMemberSignatureType,
+                  norm(_coreTypes, getMemberType(index)));
+            }
+          }
+          _neededNnbdTopMerge =
+              canonicalMemberType != _combinedMemberSignatureType;
+        }
+      } else {
+        _combinedMemberSignatureType = getMemberType(_canonicalMemberIndex);
+      }
+    }
+  }
+
+  /// Returns the type of the combined member signature, if defined.
+  DartType get combinedMemberSignatureType {
+    _ensureCombinedMemberSignatureType();
+    return _combinedMemberSignatureType;
+  }
+
+  Covariance _getMemberCovariance(int index);
+
+  void _ensureCombinedMemberSignatureCovariance() {
+    if (!_isCombinedMemberSignatureCovarianceComputed) {
+      _isCombinedMemberSignatureCovarianceComputed = true;
+      if (canonicalMemberIndex == null) {
+        return;
+      }
+      Covariance canonicalMemberCovariance =
+          _combinedMemberSignatureCovariance =
+              _getMemberCovariance(canonicalMemberIndex);
+      if (members.length == 1) {
+        return;
+      }
+      for (int index = 0; index < members.length; index++) {
+        if (index != canonicalMemberIndex) {
+          _combinedMemberSignatureCovariance =
+              _combinedMemberSignatureCovariance
+                  .merge(_getMemberCovariance(index));
+        }
+      }
+      _needsCovarianceMerging =
+          canonicalMemberCovariance != _combinedMemberSignatureCovariance;
+    }
+  }
+
+  // Returns `true` if the covariance of [members] needs to be merged into
+  // the combined member signature.
+  bool get needsCovarianceMerging {
+    if (members.length != 1) {
+      _ensureCombinedMemberSignatureCovariance();
+    }
+    return _needsCovarianceMerging;
+  }
+
+  /// Returns [Covariance] for the combined member signature.
+  Covariance get combinedMemberSignatureCovariance {
+    _ensureCombinedMemberSignatureCovariance();
+    return _combinedMemberSignatureCovariance;
+  }
+
+  /// Returns the type of the combined member signature, if defined, with
+  /// all method type parameters substituted with [typeParameters].
+  ///
+  /// This is used for inferring types on a declared member from the type of the
+  /// combined member signature.
+  DartType getCombinedSignatureTypeInContext(
+      List<TypeParameter> typeParameters) {
+    DartType type = combinedMemberSignatureType;
+    if (type == null) {
+      return null;
+    }
+    int typeParameterCount = typeParameters.length;
+    if (type is FunctionType) {
+      List<TypeParameter> signatureTypeParameters = type.typeParameters;
+      if (typeParameterCount != signatureTypeParameters.length) {
+        return null;
+      }
+      if (typeParameterCount == 0) {
+        return type;
+      }
+      List<DartType> types = new List<DartType>(typeParameterCount);
+      for (int i = 0; i < typeParameterCount; i++) {
+        types[i] = new TypeParameterType.forAlphaRenaming(
+            signatureTypeParameters[i], typeParameters[i]);
+      }
+      Substitution substitution =
+          Substitution.fromPairs(signatureTypeParameters, types);
+      for (int i = 0; i < typeParameterCount; i++) {
+        DartType typeParameterBound = typeParameters[i].bound;
+        DartType signatureTypeParameterBound =
+            substitution.substituteType(signatureTypeParameters[i].bound);
+        if (!_types
+            .performNullabilityAwareMutualSubtypesCheck(
+                typeParameterBound, signatureTypeParameterBound)
+            .isSubtypeWhenUsingNullabilities()) {
+          return null;
+        }
+      }
+      return substitution.substituteType(type.withoutTypeParameters);
+    } else if (typeParameterCount != 0) {
+      return null;
+    }
+    return type;
+  }
+
+  /// Create a member signature with the [combinedMemberSignatureType] using the
+  /// [canonicalMember] as member signature origin.
+  Procedure createMemberFromSignature({bool copyLocation: true}) {
+    if (canonicalMemberIndex == null) {
+      return null;
+    }
+    Member member = _getMember(canonicalMemberIndex);
+    Procedure combinedMemberSignature;
+    if (member is Procedure) {
+      switch (member.kind) {
+        case ProcedureKind.Getter:
+          combinedMemberSignature = _createGetterMemberSignature(
+              member, combinedMemberSignatureType,
+              copyLocation: copyLocation);
+          break;
+        case ProcedureKind.Setter:
+          VariableDeclaration parameter =
+              member.function.positionalParameters.first;
+          combinedMemberSignature = _createSetterMemberSignature(
+              member, combinedMemberSignatureType,
+              isGenericCovariantImpl: parameter.isGenericCovariantImpl,
+              isCovariant: parameter.isCovariant,
+              parameterName: parameter.name,
+              copyLocation: copyLocation);
+          break;
+        case ProcedureKind.Method:
+        case ProcedureKind.Operator:
+          combinedMemberSignature = _createMethodSignature(
+              member, combinedMemberSignatureType,
+              copyLocation: copyLocation);
+          break;
+        case ProcedureKind.Factory:
+        default:
+          throw new UnsupportedError(
+              'Unexpected canonical member kind ${member.kind} for $member');
+      }
+    } else if (member is Field) {
+      if (forSetter) {
+        combinedMemberSignature = _createSetterMemberSignature(
+            member, combinedMemberSignatureType,
+            isGenericCovariantImpl: member.isGenericCovariantImpl,
+            isCovariant: member.isCovariant,
+            copyLocation: copyLocation);
+      } else {
+        combinedMemberSignature = _createGetterMemberSignature(
+            member, combinedMemberSignatureType,
+            copyLocation: copyLocation);
+      }
+    } else {
+      throw new UnsupportedError(
+          'Unexpected canonical member $member (${member.runtimeType})');
+    }
+    combinedMemberSignatureCovariance.applyCovariance(combinedMemberSignature);
+    return combinedMemberSignature;
+  }
+
+  /// Creates a getter member signature for [member] with the given
+  /// [type].
+  Member _createGetterMemberSignature(Member member, DartType type,
+      {bool copyLocation}) {
+    assert(copyLocation != null);
+    Class enclosingClass = classBuilder.cls;
+    Procedure referenceFrom;
+    if (classBuilder.referencesFromIndexed != null) {
+      referenceFrom = classBuilder.referencesFromIndexed
+          .lookupProcedureNotSetter(member.name.text);
+    }
+    Uri fileUri;
+    int startFileOffset;
+    int fileOffset;
+    if (copyLocation) {
+      fileUri = member.fileUri;
+      startFileOffset =
+          member is Procedure ? member.startFileOffset : member.fileOffset;
+      fileOffset = member.fileOffset;
+    } else {
+      fileUri = enclosingClass.fileUri;
+      fileOffset = startFileOffset = enclosingClass.fileOffset;
+    }
+    return new Procedure(
+      member.name,
+      ProcedureKind.Getter,
+      new FunctionNode(null, returnType: type),
+      isAbstract: true,
+      isMemberSignature: true,
+      fileUri: fileUri,
+      memberSignatureOrigin: member.memberSignatureOrigin ?? member,
+      reference: referenceFrom?.reference,
+    )
+      ..startFileOffset = startFileOffset
+      ..fileOffset = fileOffset
+      ..isNonNullableByDefault =
+          enclosingClass.enclosingLibrary.isNonNullableByDefault
+      ..parent = enclosingClass;
+  }
+
+  /// Creates a setter member signature for [member] with the given
+  /// [type]. The flags of parameter is set according to [isCovariant] and
+  /// [isGenericCovariantImpl] and the [parameterName] is used, if provided.
+  Member _createSetterMemberSignature(Member member, DartType type,
+      {bool isCovariant,
+      bool isGenericCovariantImpl,
+      String parameterName,
+      bool copyLocation}) {
+    assert(isCovariant != null);
+    assert(isGenericCovariantImpl != null);
+    assert(copyLocation != null);
+    Class enclosingClass = classBuilder.cls;
+    Procedure referenceFrom;
+    if (classBuilder.referencesFromIndexed != null) {
+      referenceFrom = classBuilder.referencesFromIndexed
+          .lookupProcedureSetter(member.name.text);
+    }
+    Uri fileUri;
+    int startFileOffset;
+    int fileOffset;
+    if (copyLocation) {
+      fileUri = member.fileUri;
+      startFileOffset =
+          member is Procedure ? member.startFileOffset : member.fileOffset;
+      fileOffset = member.fileOffset;
+    } else {
+      fileUri = enclosingClass.fileUri;
+      fileOffset = startFileOffset = enclosingClass.fileOffset;
+    }
+    return new Procedure(
+        member.name,
+        ProcedureKind.Setter,
+        new FunctionNode(null,
+            returnType: const VoidType(),
+            positionalParameters: [
+              new VariableDeclaration(parameterName ?? 'value',
+                  type: type, isCovariant: isCovariant)
+                ..isGenericCovariantImpl = isGenericCovariantImpl
+            ]),
+        isAbstract: true,
+        isMemberSignature: true,
+        fileUri: fileUri,
+        memberSignatureOrigin: member.memberSignatureOrigin ?? member,
+        reference: referenceFrom?.reference)
+      ..startFileOffset = startFileOffset
+      ..fileOffset = fileOffset
+      ..isNonNullableByDefault =
+          enclosingClass.enclosingLibrary.isNonNullableByDefault
+      ..parent = enclosingClass;
+  }
+
+  Member _createMethodSignature(Procedure procedure, FunctionType functionType,
+      {bool copyLocation}) {
+    assert(copyLocation != null);
+    Class enclosingClass = classBuilder.cls;
+    Procedure referenceFrom;
+    if (classBuilder.referencesFromIndexed != null) {
+      referenceFrom = classBuilder.referencesFromIndexed
+          .lookupProcedureNotSetter(procedure.name.text);
+    }
+    Uri fileUri;
+    int startFileOffset;
+    int fileOffset;
+    if (copyLocation) {
+      fileUri = procedure.fileUri;
+      startFileOffset = procedure.startFileOffset;
+      fileOffset = procedure.fileOffset;
+    } else {
+      fileUri = enclosingClass.fileUri;
+      fileOffset = startFileOffset = enclosingClass.fileOffset;
+    }
+    FunctionNode function = procedure.function;
+    List<VariableDeclaration> positionalParameters = [];
+    for (int i = 0; i < function.positionalParameters.length; i++) {
+      VariableDeclaration parameter = function.positionalParameters[i];
+      DartType parameterType = functionType.positionalParameters[i];
+      if (i == 0 && procedure == hierarchy.coreTypes.objectEquals) {
+        // In legacy code we special case `Object.==` to infer `dynamic`
+        // instead `Object!`.
+        parameterType = const DynamicType();
+      }
+      positionalParameters.add(new VariableDeclaration(parameter.name,
+          type: parameterType, isCovariant: parameter.isCovariant)
+        ..isGenericCovariantImpl = parameter.isGenericCovariantImpl);
+    }
+    List<VariableDeclaration> namedParameters = [];
+    int namedParameterCount = function.namedParameters.length;
+    if (namedParameterCount == 1) {
+      NamedType namedType = functionType.namedParameters.first;
+      VariableDeclaration parameter = function.namedParameters.first;
+      namedParameters.add(new VariableDeclaration(parameter.name,
+          type: namedType.type,
+          isRequired: namedType.isRequired,
+          isCovariant: parameter.isCovariant)
+        ..isGenericCovariantImpl = parameter.isGenericCovariantImpl);
+    } else if (namedParameterCount > 1) {
+      Map<String, NamedType> namedTypes = {};
+      for (NamedType namedType in functionType.namedParameters) {
+        namedTypes[namedType.name] = namedType;
+      }
+      for (int i = 0; i < namedParameterCount; i++) {
+        VariableDeclaration parameter = function.namedParameters[i];
+        NamedType namedParameterType = namedTypes[parameter.name];
+        namedParameters.add(new VariableDeclaration(parameter.name,
+            type: namedParameterType.type,
+            isRequired: namedParameterType.isRequired,
+            isCovariant: parameter.isCovariant)
+          ..isGenericCovariantImpl = parameter.isGenericCovariantImpl);
+      }
+    }
+    return new Procedure(
+        procedure.name,
+        procedure.kind,
+        new FunctionNode(null,
+            typeParameters: functionType.typeParameters,
+            returnType: functionType.returnType,
+            positionalParameters: positionalParameters,
+            namedParameters: namedParameters,
+            requiredParameterCount: function.requiredParameterCount),
+        isAbstract: true,
+        isMemberSignature: true,
+        fileUri: fileUri,
+        memberSignatureOrigin: procedure.memberSignatureOrigin ?? procedure,
+        reference: referenceFrom?.reference)
+      ..startFileOffset = startFileOffset
+      ..fileOffset = fileOffset
+      ..isNonNullableByDefault =
+          enclosingClass.enclosingLibrary.isNonNullableByDefault
+      ..parent = enclosingClass;
+  }
+
+  DartType _computeMemberType(DartType thisType, Member member) {
+    DartType type;
+    if (member is Procedure) {
+      if (member.isGetter) {
+        type = member.getterType;
+      } else if (member.isSetter) {
+        type = member.setterType;
+      } else {
+        type = member.function
+            .computeFunctionType(classBuilder.cls.enclosingLibrary.nonNullable);
+      }
+    } else if (member is Field) {
+      type = member.type;
+    } else {
+      unhandled("${member.runtimeType}", "$member", classBuilder.charOffset,
+          classBuilder.fileUri);
+    }
+    if (member.enclosingClass.typeParameters.isEmpty) {
+      return type;
+    }
+    InterfaceType instance = hierarchy.getTypeAsInstanceOf(
+        thisType, member.enclosingClass, classBuilder.library.library);
+    assert(
+        instance != null,
+        "No instance of $thisType as ${member.enclosingClass} found for "
+        "$member.");
+    return Substitution.fromInterfaceType(instance).substituteType(type);
+  }
+
+  bool _isMoreSpecific(DartType a, DartType b, bool forSetter) {
+    if (forSetter) {
+      return _types.isSubtypeOf(b, a, SubtypeCheckMode.withNullabilities);
+    } else {
+      return _types.isSubtypeOf(a, b, SubtypeCheckMode.withNullabilities);
+    }
+  }
+}
+
+/// Class used for computing and inspecting the combined member signature for
+/// a set of overridden/inherited [ClassMember]s.
+class CombinedClassMemberSignature
+    extends CombinedMemberSignatureBase<ClassMember> {
+  /// The class hierarchy builder used for building this class.
+  final ClassHierarchyBuilder hierarchy;
+
+  /// The list of the members inherited into or overridden in [classBuilder].
+  final List<ClassMember> members;
+
+  /// Creates a [CombinedClassMemberSignature] whose canonical member is already
+  /// defined.
+  CombinedClassMemberSignature.internal(this.hierarchy,
+      SourceClassBuilder classBuilder, int canonicalMemberIndex, this.members,
+      {bool forSetter})
+      : super.internal(classBuilder, canonicalMemberIndex, forSetter);
+
+  /// Creates a [CombinedClassMemberSignature] for [members] inherited into
+  /// [classBuilder].
+  ///
+  /// If [forSetter] is `true`, contravariance of the setter types is used to
+  /// compute the most specific member type. Otherwise covariance of the getter
+  /// types or function types is used.
+  CombinedClassMemberSignature(
+      this.hierarchy, SourceClassBuilder classBuilder, this.members,
+      {bool forSetter})
+      : super(classBuilder, forSetter: forSetter);
+
+  Types get _types => hierarchy.types;
+
+  Member _getMember(int index) {
+    ClassMember candidate = members[index];
+    Member target = candidate.getMember(hierarchy);
+    assert(target != null,
+        "No member computed for ${candidate} (${candidate.runtimeType})");
+    return target;
+  }
+
+  @override
+  Covariance _getMemberCovariance(int index) {
+    ClassMember candidate = members[index];
+    Covariance covariance = candidate.getCovariance(hierarchy);
+    assert(covariance != null,
+        "No covariance computed for ${candidate} (${candidate.runtimeType})");
+    return covariance;
+  }
+}
+
+/// Class used for computing and inspecting the combined member signature for
+/// a set of overridden/inherited [Member]s.
+class CombinedMemberSignatureBuilder
+    extends CombinedMemberSignatureBase<Member> {
+  @override
+  final ClassHierarchyBase hierarchy;
+
+  @override
+  final Types _types;
+
+  @override
+  final List<Member> members;
+
+  CombinedMemberSignatureBuilder(
+      this.hierarchy, SourceClassBuilder classBuilder, this.members,
+      {bool forSetter})
+      : _types = new Types(hierarchy),
+        super(classBuilder, forSetter: forSetter);
+
+  @override
+  Member _getMember(int index) => members[index];
+
+  @override
+  Covariance _getMemberCovariance(int index) {
+    _memberCovariances ??= new List<Covariance>(members.length);
+    Covariance covariance = _memberCovariances[index];
+    if (covariance == null) {
+      _memberCovariances[index] = covariance =
+          new Covariance.fromMember(members[index], forSetter: forSetter);
+    }
+    return covariance;
+  }
+}
diff --git a/pkg/front_end/lib/src/fasta/kernel/constant_collection_builders.dart b/pkg/front_end/lib/src/fasta/kernel/constant_collection_builders.dart
index 5fd43f5..8f0a84bb 100644
--- a/pkg/front_end/lib/src/fasta/kernel/constant_collection_builders.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/constant_collection_builders.dart
@@ -107,6 +107,7 @@
     List<Expression> lists = <Expression>[];
     for (Object part in parts) {
       if (part is List<Constant>) {
+        if (part.isEmpty) continue;
         lists.add(new ConstantExpression(new ListConstant(elementType, part)));
       } else if (part is Constant) {
         lists.add(evaluator.extract(part));
@@ -182,15 +183,15 @@
           mapEntries[i] =
               new ConstantMapEntry(entries[i], evaluator.nullConstant);
         }
-        Constant map = evaluator.lowerMapConstant(new MapConstant(
-            elementType, evaluator.typeEnvironment.nullType, mapEntries));
+        Constant map = evaluator.lowerMapConstant(
+            new MapConstant(elementType, const NullType(), mapEntries));
         return evaluator.lower(
             result,
             new InstanceConstant(
                 evaluator.unmodifiableSetMap.enclosingClass.reference, [
               elementType
             ], <Reference, Constant>{
-              evaluator.unmodifiableSetMap.reference: map
+              evaluator.unmodifiableSetMap.getterReference: map
             }));
       } else {
         return evaluator.lowerSetConstant(result);
@@ -199,6 +200,7 @@
     List<Expression> sets = <Expression>[];
     for (Object part in parts) {
       if (part is List<Constant>) {
+        if (part.isEmpty) continue;
         sets.add(new ConstantExpression(new SetConstant(elementType, part)));
       } else if (part is Constant) {
         sets.add(evaluator.extract(part));
@@ -327,6 +329,7 @@
     List<Expression> maps = <Expression>[];
     for (Object part in parts) {
       if (part is List<ConstantMapEntry>) {
+        if (part.isEmpty) continue;
         maps.add(
             new ConstantExpression(new MapConstant(keyType, valueType, part)));
       } else if (part is Constant) {
diff --git a/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart b/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
index d237dcf..bca4392 100644
--- a/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
@@ -824,7 +824,6 @@
       coreTypes.internalSymbolClass: true,
       coreTypes.listClass: true,
       coreTypes.mapClass: true,
-      coreTypes.nullClass: true,
       coreTypes.objectClass: true,
       coreTypes.setClass: true,
       coreTypes.stringClass: true,
@@ -925,8 +924,8 @@
       if (errorOnUnevaluatedConstant) {
         return createErrorConstant(node, messageConstEvalUnevaluated);
       }
-      return new UnevaluatedConstant(
-          removeRedundantFileUriExpressions(result.expression));
+      return canonicalize(new UnevaluatedConstant(
+          removeRedundantFileUriExpressions(result.expression)));
     }
     return result;
   }
@@ -1142,8 +1141,13 @@
     Constant constant = node.constant;
     Constant result = constant;
     if (constant is UnevaluatedConstant) {
-      result = _evaluateSubexpression(constant.expression);
-      if (result is AbortConstant) return result;
+      if (environmentDefines != null) {
+        result = _evaluateSubexpression(constant.expression);
+        if (result is AbortConstant) return result;
+      } else {
+        // Still no environment. Doing anything is just wasted time.
+        result = constant;
+      }
     }
     // If there were already constants in the AST then we make sure we
     // re-canonicalize them.  After running the transformer we will therefore
@@ -1159,10 +1163,18 @@
     }
     final ListConstantBuilder builder =
         new ListConstantBuilder(node, convertType(node.typeArgument), this);
+    // These expressions are at the same level, so one of them being
+    // unevaluated doesn't mean a sibling is or has an unevaluated child.
+    // We therefore reset it before each call, combine it and set it correctly
+    // at the end.
+    bool wasOrBecameUnevaluated = seenUnevaluatedChild;
     for (Expression element in node.expressions) {
+      seenUnevaluatedChild = false;
       AbortConstant error = builder.add(element);
+      wasOrBecameUnevaluated |= seenUnevaluatedChild;
       if (error != null) return error;
     }
+    seenUnevaluatedChild = wasOrBecameUnevaluated;
     return builder.build();
   }
 
@@ -1184,10 +1196,18 @@
     }
     final SetConstantBuilder builder =
         new SetConstantBuilder(node, convertType(node.typeArgument), this);
+    // These expressions are at the same level, so one of them being
+    // unevaluated doesn't mean a sibling is or has an unevaluated child.
+    // We therefore reset it before each call, combine it and set it correctly
+    // at the end.
+    bool wasOrBecameUnevaluated = seenUnevaluatedChild;
     for (Expression element in node.expressions) {
+      seenUnevaluatedChild = false;
       AbortConstant error = builder.add(element);
+      wasOrBecameUnevaluated |= seenUnevaluatedChild;
       if (error != null) return error;
     }
+    seenUnevaluatedChild = wasOrBecameUnevaluated;
     return builder.build();
   }
 
@@ -1209,10 +1229,18 @@
     }
     final MapConstantBuilder builder = new MapConstantBuilder(
         node, convertType(node.keyType), convertType(node.valueType), this);
+    // These expressions are at the same level, so one of them being
+    // unevaluated doesn't mean a sibling is or has an unevaluated child.
+    // We therefore reset it before each call, combine it and set it correctly
+    // at the end.
+    bool wasOrBecameUnevaluated = seenUnevaluatedChild;
     for (MapEntry element in node.entries) {
+      seenUnevaluatedChild = false;
       AbortConstant error = builder.add(element);
+      wasOrBecameUnevaluated |= seenUnevaluatedChild;
       if (error != null) return error;
     }
+    seenUnevaluatedChild = wasOrBecameUnevaluated;
     return builder.build();
   }
 
@@ -1742,7 +1770,9 @@
       return unevaluated(
           node,
           new MethodInvocation(extract(receiver), node.name,
-              unevaluatedArguments(arguments, {}, node.arguments.types)));
+              unevaluatedArguments(arguments, {}, node.arguments.types))
+            ..fileOffset = node.fileOffset
+            ..flags = node.flags);
     }
 
     final String op = node.name.text;
@@ -2397,13 +2427,13 @@
         if (constant is NullConstant) {
           if (type.nullability == Nullability.legacy) {
             // `null is Null` is handled below.
-            return typeEnvironment.isSubtypeOf(type, typeEnvironment.nullType,
+            return typeEnvironment.isSubtypeOf(type, const NullType(),
                     SubtypeCheckMode.ignoringNullabilities) ||
                 typeEnvironment.isSubtypeOf(typeEnvironment.objectLegacyRawType,
                     type, SubtypeCheckMode.ignoringNullabilities);
           } else {
-            return typeEnvironment.isSubtypeOf(typeEnvironment.nullType, type,
-                SubtypeCheckMode.withNullabilities);
+            return typeEnvironment.isSubtypeOf(
+                const NullType(), type, SubtypeCheckMode.withNullabilities);
           }
         }
         return isSubtype(
@@ -2826,7 +2856,7 @@
     final Map<Reference, Constant> fieldValues = <Reference, Constant>{};
     fields.forEach((Field field, Constant value) {
       assert(value is! UnevaluatedConstant);
-      fieldValues[field.reference] = value;
+      fieldValues[field.getterReference] = value;
     });
     assert(unusedArguments.isEmpty);
     return new InstanceConstant(klass.reference, typeArguments, fieldValues);
@@ -2835,7 +2865,7 @@
   InstanceCreation buildUnevaluatedInstance() {
     final Map<Reference, Expression> fieldValues = <Reference, Expression>{};
     fields.forEach((Field field, Constant value) {
-      fieldValues[field.reference] = evaluator.extract(value);
+      fieldValues[field.getterReference] = evaluator.extract(value);
     });
     return new InstanceCreation(
         klass.reference, typeArguments, fieldValues, asserts, unusedArguments);
@@ -3089,6 +3119,9 @@
   bool visitBottomType(BottomType node) => true;
 
   @override
+  bool visitNullType(NullType node) => true;
+
+  @override
   bool visitTypeParameterType(TypeParameterType node) {
     return _availableVariables.contains(node.parameter);
   }
diff --git a/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart b/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
index 6f9a38e..06237ec 100644
--- a/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
@@ -560,7 +560,8 @@
   static Generator make(ExpressionGeneratorHelper helper, Token token,
       Expression receiver, Name name, bool isNullAware) {
     if (helper.forest.isThisExpression(receiver)) {
-      return new ThisPropertyAccessGenerator(helper, token, name);
+      return new ThisPropertyAccessGenerator(helper, token, name,
+          thisOffset: receiver.fileOffset, isNullAware: isNullAware);
     } else {
       return isNullAware
           ? new NullAwarePropertyAccessGenerator(helper, token, receiver, name)
@@ -603,8 +604,13 @@
   /// documentation.
   final Name name;
 
+  /// The offset of `this` if explicit. Otherwise `null`.
+  final int thisOffset;
+  final bool isNullAware;
+
   ThisPropertyAccessGenerator(
-      ExpressionGeneratorHelper helper, Token token, this.name)
+      ExpressionGeneratorHelper helper, Token token, this.name,
+      {this.thisOffset, this.isNullAware: false})
       : super(helper, token);
 
   @override
@@ -613,18 +619,30 @@
   @override
   String get _plainNameForRead => name.text;
 
+  void _reportNonNullableInNullAwareWarningIfNeeded() {
+    if (isNullAware && _helper.libraryBuilder.isNonNullableByDefault) {
+      _helper.libraryBuilder.addProblem(
+          messageThisInNullAwareReceiver,
+          thisOffset ?? fileOffset,
+          thisOffset != null ? 4 : noLength,
+          _helper.uri);
+    }
+  }
+
   @override
   Expression buildSimpleRead() {
     return _createRead();
   }
 
   Expression _createRead() {
+    _reportNonNullableInNullAwareWarningIfNeeded();
     return _forest.createPropertyGet(
         fileOffset, _forest.createThisExpression(fileOffset), name);
   }
 
   @override
   Expression buildAssignment(Expression value, {bool voidContext: false}) {
+    _reportNonNullableInNullAwareWarningIfNeeded();
     return _createWrite(fileOffset, value, forEffect: voidContext);
   }
 
@@ -649,6 +667,7 @@
       bool voidContext: false,
       bool isPreIncDec: false,
       bool isPostIncDec: false}) {
+    _reportNonNullableInNullAwareWarningIfNeeded();
     _helper.forest.createBinary(
         offset,
         _forest.createPropertyGet(
@@ -672,6 +691,7 @@
       return buildCompoundAssignment(binaryOperator, value,
           offset: offset, voidContext: voidContext, isPostIncDec: true);
     }
+    _reportNonNullableInNullAwareWarningIfNeeded();
     VariableDeclaration read = _helper.forest.createVariableDeclarationForValue(
         _forest.createPropertyGet(
             fileOffset, _forest.createThisExpression(fileOffset), name));
@@ -1096,7 +1116,8 @@
       {bool isNullAware}) {
     assert(isNullAware != null);
     if (helper.forest.isThisExpression(receiver)) {
-      return new ThisIndexedAccessGenerator(helper, token, index);
+      return new ThisIndexedAccessGenerator(helper, token, index,
+          thisOffset: receiver.fileOffset, isNullAware: isNullAware);
     } else {
       return new IndexedAccessGenerator(helper, token, receiver, index,
           isNullAware: isNullAware);
@@ -1109,8 +1130,12 @@
 class ThisIndexedAccessGenerator extends Generator {
   final Expression index;
 
+  final int thisOffset;
+  final bool isNullAware;
+
   ThisIndexedAccessGenerator(
-      ExpressionGeneratorHelper helper, Token token, this.index)
+      ExpressionGeneratorHelper helper, Token token, this.index,
+      {this.thisOffset, this.isNullAware: false})
       : super(helper, token);
 
   @override
@@ -1119,14 +1144,26 @@
   @override
   String get _debugName => "ThisIndexedAccessGenerator";
 
+  void _reportNonNullableInNullAwareWarningIfNeeded() {
+    if (isNullAware && _helper.libraryBuilder.isNonNullableByDefault) {
+      _helper.libraryBuilder.addProblem(
+          messageThisInNullAwareReceiver,
+          thisOffset ?? fileOffset,
+          thisOffset != null ? 4 : noLength,
+          _helper.uri);
+    }
+  }
+
   @override
   Expression buildSimpleRead() {
+    _reportNonNullableInNullAwareWarningIfNeeded();
     Expression receiver = _helper.forest.createThisExpression(fileOffset);
     return _forest.createIndexGet(fileOffset, receiver, index);
   }
 
   @override
   Expression buildAssignment(Expression value, {bool voidContext: false}) {
+    _reportNonNullableInNullAwareWarningIfNeeded();
     Expression receiver = _helper.forest.createThisExpression(fileOffset);
     return _forest.createIndexSet(fileOffset, receiver, index, value,
         forEffect: voidContext, readOnlyReceiver: true);
@@ -1135,6 +1172,7 @@
   @override
   Expression buildIfNullAssignment(Expression value, DartType type, int offset,
       {bool voidContext: false}) {
+    _reportNonNullableInNullAwareWarningIfNeeded();
     Expression receiver = _helper.forest.createThisExpression(fileOffset);
     return new IfNullIndexSet(receiver, index, value,
         readOffset: fileOffset,
@@ -1150,6 +1188,7 @@
       bool voidContext: false,
       bool isPreIncDec: false,
       bool isPostIncDec: false}) {
+    _reportNonNullableInNullAwareWarningIfNeeded();
     Expression receiver = _helper.forest.createThisExpression(fileOffset);
     return new CompoundIndexSet(receiver, index, binaryOperator, value,
         readOffset: fileOffset,
@@ -1348,8 +1387,13 @@
   /// without a corresponding setter.
   final Member writeTarget;
 
+  /// The offset of the type name if explicit. Otherwise `null`.
+  final int typeOffset;
+  final bool isNullAware;
+
   StaticAccessGenerator(ExpressionGeneratorHelper helper, Token token,
-      this.targetName, this.readTarget, this.writeTarget)
+      this.targetName, this.readTarget, this.writeTarget,
+      {this.typeOffset, this.isNullAware: false})
       : assert(targetName != null),
         assert(readTarget != null || writeTarget != null),
         super(helper, token);
@@ -1359,9 +1403,23 @@
       String targetName,
       Token token,
       MemberBuilder getterBuilder,
-      MemberBuilder setterBuilder) {
+      MemberBuilder setterBuilder,
+      {int typeOffset,
+      bool isNullAware: false}) {
     return new StaticAccessGenerator(helper, token, targetName,
-        getterBuilder?.readTarget, setterBuilder?.writeTarget);
+        getterBuilder?.readTarget, setterBuilder?.writeTarget,
+        typeOffset: typeOffset, isNullAware: isNullAware);
+  }
+
+  void _reportNonNullableInNullAwareWarningIfNeeded() {
+    if (isNullAware && _helper.libraryBuilder.isNonNullableByDefault) {
+      String className = (readTarget ?? writeTarget).enclosingClass.name;
+      _helper.libraryBuilder.addProblem(
+          templateClassInNullAwareReceiver.withArguments(className),
+          typeOffset ?? fileOffset,
+          typeOffset != null ? className.length : noLength,
+          _helper.uri);
+    }
   }
 
   @override
@@ -1380,6 +1438,7 @@
     if (readTarget == null) {
       read = _makeInvalidRead();
     } else {
+      _reportNonNullableInNullAwareWarningIfNeeded();
       read = _helper.makeStaticGet(readTarget, token);
     }
     return read;
@@ -1387,6 +1446,7 @@
 
   @override
   Expression buildAssignment(Expression value, {bool voidContext = false}) {
+    _reportNonNullableInNullAwareWarningIfNeeded();
     return _createWrite(fileOffset, value);
   }
 
@@ -1395,6 +1455,7 @@
     if (writeTarget == null) {
       write = _makeInvalidWrite(value);
     } else {
+      _reportNonNullableInNullAwareWarningIfNeeded();
       write = new StaticSet(writeTarget, value)..fileOffset = offset;
     }
     return write;
@@ -3043,10 +3104,6 @@
   @override
   buildPropertyAccess(
       IncompleteSendGenerator send, int operatorOffset, bool isNullAware) {
-    // `SomeType?.toString` is the same as `SomeType.toString`, not
-    // `(SomeType).toString`.
-    isNullAware = false;
-
     Name name = send.name;
     Arguments arguments = send.arguments;
 
@@ -3107,7 +3164,9 @@
             name.text,
             send.token,
             member is MemberBuilder ? member : null,
-            setter is MemberBuilder ? setter : null);
+            setter is MemberBuilder ? setter : null,
+            typeOffset: fileOffset,
+            isNullAware: isNullAware);
       }
 
       return arguments == null
@@ -3116,6 +3175,8 @@
               offsetForToken(send.token), send.typeArguments, arguments,
               isTypeArgumentsInForest: send.isTypeArgumentsInForest);
     } else {
+      // `SomeType?.toString` is the same as `SomeType.toString`, not
+      // `(SomeType).toString`.
       return super.buildPropertyAccess(send, operatorOffset, isNullAware);
     }
   }
@@ -4132,6 +4193,13 @@
     ];
   }
 
+  void _reportNonNullableInNullAwareWarningIfNeeded() {
+    if (_helper.libraryBuilder.isNonNullableByDefault) {
+      _helper.libraryBuilder.addProblem(
+          messageThisInNullAwareReceiver, fileOffset, 4, _helper.uri);
+    }
+  }
+
   buildPropertyAccess(
       IncompleteSendGenerator send, int operatorOffset, bool isNullAware) {
     Name name = send.name;
@@ -4150,6 +4218,9 @@
     if (send is SendAccessGenerator) {
       // Notice that 'this' or 'super' can't be null. So we can ignore the
       // value of [isNullAware].
+      if (isNullAware) {
+        _reportNonNullableInNullAwareWarningIfNeeded();
+      }
       return _helper.buildMethodInvocation(
           _forest.createThisExpression(fileOffset),
           name,
@@ -4173,7 +4244,9 @@
             _helper,
             // TODO(ahe): This is not the 'this' token.
             send.token,
-            name);
+            name,
+            thisOffset: fileOffset,
+            isNullAware: isNullAware);
       }
     }
   }
@@ -4313,7 +4386,8 @@
           _helper.lookupInstanceMember(indexGetName, isSuper: true),
           _helper.lookupInstanceMember(indexSetName, isSuper: true));
     } else {
-      return new ThisIndexedAccessGenerator(_helper, token, index);
+      return new ThisIndexedAccessGenerator(_helper, token, index,
+          thisOffset: fileOffset, isNullAware: isNullAware);
     }
   }
 
diff --git a/pkg/front_end/lib/src/fasta/kernel/forest.dart b/pkg/front_end/lib/src/fasta/kernel/forest.dart
index b683259..273a4e7 100644
--- a/pkg/front_end/lib/src/fasta/kernel/forest.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/forest.dart
@@ -311,7 +311,8 @@
 
   /// Return a representation of a block of [statements] at the given
   /// [fileOffset].
-  Statement createBlock(int fileOffset, List<Statement> statements) {
+  Statement createBlock(
+      int fileOffset, int fileEndOffset, List<Statement> statements) {
     assert(fileOffset != null);
     List<Statement> copy;
     for (int i = 0; i < statements.length; i++) {
@@ -323,7 +324,9 @@
         copy.add(statement);
       }
     }
-    return new Block(copy ?? statements)..fileOffset = fileOffset;
+    return new Block(copy ?? statements)
+      ..fileOffset = fileOffset
+      ..fileEndOffset = fileEndOffset;
   }
 
   /// Return a representation of a break statement.
diff --git a/pkg/front_end/lib/src/fasta/kernel/forwarding_node.dart b/pkg/front_end/lib/src/fasta/kernel/forwarding_node.dart
index 08a6f34..0b4a166 100644
--- a/pkg/front_end/lib/src/fasta/kernel/forwarding_node.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/forwarding_node.dart
@@ -7,280 +7,40 @@
         Arguments,
         Class,
         DartType,
-        DynamicType,
         Expression,
-        Field,
         FunctionNode,
-        FunctionType,
         Member,
         Name,
         NamedExpression,
-        NamedType,
-        Nullability,
         Procedure,
         ProcedureKind,
         ReturnStatement,
         SuperMethodInvocation,
         SuperPropertyGet,
         SuperPropertySet,
-        TypeParameter,
         TypeParameterType,
-        VariableDeclaration,
-        VariableGet,
-        Variance,
-        VoidType;
+        VariableGet;
 
 import 'package:kernel/transformations/flags.dart' show TransformerFlag;
 
-import "package:kernel/type_algebra.dart" show Substitution;
-
-import "package:kernel/src/legacy_erasure.dart";
-import "package:kernel/src/nnbd_top_merge.dart";
-import "package:kernel/src/norm.dart";
-
 import "../source/source_class_builder.dart";
 
 import "../problems.dart" show unhandled;
 
-import "../type_inference/type_inference_engine.dart"
-    show IncludesTypeParametersNonCovariantly;
-
-import "../type_inference/type_inferrer.dart" show getNamedFormal;
-
 import 'class_hierarchy_builder.dart';
+import 'combined_member_signature.dart';
 
 class ForwardingNode {
-  ClassHierarchyBuilder get hierarchy => _combinedMemberSignature.hierarchy;
-
-  SourceClassBuilder get classBuilder => _combinedMemberSignature.classBuilder;
-
-  // TODO(johnniwinther): Use [_combinedMemberSignature] more directly in
-  // the forwarding node computation.
-  final CombinedMemberSignature _combinedMemberSignature;
-
-  ClassMember get combinedMemberSignatureResult =>
-      _combinedMemberSignature.canonicalClassMember;
-
-  /// The index of [combinedMemberSignatureResult] in [_candidates].
-  int get _combinedMemberIndex => _combinedMemberSignature.classMemberIndex;
+  final CombinedClassMemberSignature _combinedMemberSignature;
 
   final ProcedureKind kind;
 
-  /// A list containing the directly implemented and directly inherited
-  /// procedures of the class in question.
-  List<ClassMember> get _candidates => _combinedMemberSignature.members;
-
-  /// The indices of the [_candidates] whose types need to be merged to compute
-  /// the resulting member type.
-  Set<int> get _mergeIndices => _combinedMemberSignature.mutualSubtypeIndices;
-
   ForwardingNode(this._combinedMemberSignature, this.kind);
 
-  Name get name => combinedMemberSignatureResult.name;
-
-  Class get enclosingClass => classBuilder.cls;
-
   /// Finishes handling of this node by propagating covariance and creating
   /// forwarding stubs if necessary.
   Member finalize() => _computeCovarianceFixes();
 
-  /// Creates a getter member signature for [interfaceMember] with the given
-  /// [type].
-  Member _createGetterMemberSignature(Member interfaceMember, DartType type) {
-    Procedure referenceFrom;
-    if (classBuilder.referencesFromIndexed != null) {
-      referenceFrom = classBuilder.referencesFromIndexed
-          .lookupProcedureNotSetter(name.text);
-    }
-    return new Procedure(name, kind, new FunctionNode(null, returnType: type),
-        isAbstract: true,
-        isMemberSignature: true,
-        fileUri: enclosingClass.fileUri,
-        memberSignatureOrigin: interfaceMember,
-        reference: referenceFrom?.reference)
-      ..startFileOffset = enclosingClass.fileOffset
-      ..fileOffset = enclosingClass.fileOffset
-      ..parent = enclosingClass;
-  }
-
-  /// Creates a setter member signature for [interfaceMember] with the given
-  /// [type]. The flags of parameter is set according to [isCovariant] and
-  /// [isGenericCovariantImpl] and the [parameterName] is used, if provided.
-  Member _createSetterMemberSignature(Member interfaceMember, DartType type,
-      {bool isCovariant, bool isGenericCovariantImpl, String parameterName}) {
-    assert(isCovariant != null);
-    assert(isGenericCovariantImpl != null);
-    Procedure referenceFrom;
-    if (classBuilder.referencesFromIndexed != null) {
-      referenceFrom =
-          classBuilder.referencesFromIndexed.lookupProcedureSetter(name.text);
-    }
-    return new Procedure(
-        name,
-        kind,
-        new FunctionNode(null,
-            returnType: const VoidType(),
-            positionalParameters: [
-              new VariableDeclaration(parameterName ?? '_',
-                  type: type, isCovariant: isCovariant)
-                ..isGenericCovariantImpl = isGenericCovariantImpl
-            ]),
-        isAbstract: true,
-        isMemberSignature: true,
-        fileUri: enclosingClass.fileUri,
-        memberSignatureOrigin: interfaceMember,
-        reference: referenceFrom?.reference)
-      ..startFileOffset = enclosingClass.fileOffset
-      ..fileOffset = enclosingClass.fileOffset
-      ..parent = enclosingClass;
-  }
-
-  /// Creates a legacy member signature for the field [interfaceMember] if the
-  /// type of [interfaceMember] contains non-legacy nullabilities.
-  Member _createLegacyMemberSignatureForField(Field interfaceMember) {
-    DartType type = interfaceMember.type;
-    if (interfaceMember.enclosingClass.typeParameters.isNotEmpty) {
-      Substitution substitution =
-          _substitutionFor(null, interfaceMember, enclosingClass);
-      type = substitution.substituteType(type);
-    }
-    DartType legacyType = rawLegacyErasure(hierarchy.coreTypes, type);
-    if (legacyType == null) {
-      return interfaceMember;
-    } else {
-      // We base the decision to add a member signature on whether the legacy
-      // erasure of the declared type is different from the declared type, i.e.
-      // whether the declared type contained non-legacy nullabilities.
-      //
-      // This is slightly different from checking whether the legacy erasure of
-      // the inherited type is different from the
-      if (kind == ProcedureKind.Getter) {
-        return _createGetterMemberSignature(interfaceMember, legacyType);
-      } else {
-        assert(kind == ProcedureKind.Setter);
-        return _createSetterMemberSignature(interfaceMember, legacyType,
-            isCovariant: interfaceMember.isCovariant,
-            isGenericCovariantImpl: interfaceMember.isGenericCovariantImpl);
-      }
-    }
-  }
-
-  /// Creates a legacy member signature for procedure [interfaceMember] if the
-  /// type of [interfaceMember] contains non-legacy nullabilities.
-  Member _createLegacyMemberSignatureForProcedure(Procedure interfaceMember) {
-    if (interfaceMember.kind == ProcedureKind.Getter) {
-      DartType type = interfaceMember.getterType;
-      if (interfaceMember.enclosingClass.typeParameters.isNotEmpty) {
-        Substitution substitution =
-            _substitutionFor(null, interfaceMember, enclosingClass);
-        type = substitution.substituteType(type);
-      }
-      DartType legacyType = rawLegacyErasure(hierarchy.coreTypes, type);
-      if (legacyType == null) {
-        return interfaceMember;
-      } else {
-        return _createGetterMemberSignature(interfaceMember, legacyType);
-      }
-    } else if (interfaceMember.kind == ProcedureKind.Setter) {
-      DartType type = interfaceMember.setterType;
-      if (interfaceMember.enclosingClass.typeParameters.isNotEmpty) {
-        Substitution substitution =
-            _substitutionFor(null, interfaceMember, enclosingClass);
-        type = substitution.substituteType(type);
-      }
-      DartType legacyType = rawLegacyErasure(hierarchy.coreTypes, type);
-      if (legacyType == null) {
-        return interfaceMember;
-      } else {
-        VariableDeclaration parameter =
-            interfaceMember.function.positionalParameters.first;
-        return _createSetterMemberSignature(interfaceMember, legacyType,
-            isCovariant: parameter.isCovariant,
-            isGenericCovariantImpl: parameter.isGenericCovariantImpl,
-            parameterName: parameter.name);
-      }
-    } else {
-      FunctionNode function = interfaceMember.function;
-      FunctionType type = function.computeFunctionType(Nullability.legacy);
-      if (interfaceMember.enclosingClass.typeParameters.isNotEmpty) {
-        Substitution substitution =
-            _substitutionFor(null, interfaceMember, enclosingClass);
-        type = substitution.substituteType(type);
-      }
-      FunctionType legacyType = rawLegacyErasure(hierarchy.coreTypes, type);
-      if (legacyType == null) {
-        return interfaceMember;
-      }
-      Procedure referenceFrom;
-      if (classBuilder.referencesFromIndexed != null) {
-        referenceFrom = classBuilder.referencesFromIndexed
-            .lookupProcedureNotSetter(name.text);
-      }
-      List<VariableDeclaration> positionalParameters = [];
-      for (int i = 0; i < function.positionalParameters.length; i++) {
-        VariableDeclaration parameter = function.positionalParameters[i];
-        DartType parameterType = legacyType.positionalParameters[i];
-        if (i == 0 && interfaceMember == hierarchy.coreTypes.objectEquals) {
-          // In legacy code we special case `Object.==` to infer `dynamic`
-          // instead `Object!`.
-          parameterType = const DynamicType();
-        }
-        positionalParameters.add(new VariableDeclaration(parameter.name,
-            type: parameterType, isCovariant: parameter.isCovariant)
-          ..isGenericCovariantImpl = parameter.isGenericCovariantImpl);
-      }
-      List<VariableDeclaration> namedParameters = [];
-      int namedParameterCount = function.namedParameters.length;
-      if (namedParameterCount == 1) {
-        NamedType namedType = legacyType.namedParameters.first;
-        VariableDeclaration parameter = function.namedParameters.first;
-        namedParameters.add(new VariableDeclaration(parameter.name,
-            type: namedType.type, isCovariant: parameter.isCovariant)
-          ..isGenericCovariantImpl = parameter.isGenericCovariantImpl);
-      } else if (namedParameterCount > 1) {
-        Map<String, DartType> namedTypes = {};
-        for (NamedType namedType in legacyType.namedParameters) {
-          namedTypes[namedType.name] = namedType.type;
-        }
-        for (int i = 0; i < namedParameterCount; i++) {
-          VariableDeclaration parameter = function.namedParameters[i];
-          DartType parameterType = namedTypes[parameter.name];
-          namedParameters.add(new VariableDeclaration(parameter.name,
-              type: parameterType, isCovariant: parameter.isCovariant)
-            ..isGenericCovariantImpl = parameter.isGenericCovariantImpl);
-        }
-      }
-      return new Procedure(
-          name,
-          kind,
-          new FunctionNode(null,
-              typeParameters: legacyType.typeParameters,
-              returnType: legacyType.returnType,
-              positionalParameters: positionalParameters,
-              namedParameters: namedParameters,
-              requiredParameterCount: function.requiredParameterCount),
-          isAbstract: true,
-          isMemberSignature: true,
-          fileUri: enclosingClass.fileUri,
-          memberSignatureOrigin: interfaceMember,
-          reference: referenceFrom?.reference)
-        ..startFileOffset = enclosingClass.fileOffset
-        ..fileOffset = enclosingClass.fileOffset
-        ..parent = enclosingClass;
-    }
-  }
-
-  /// Creates a legacy member signature for [interfaceMember] if the type of
-  /// [interfaceMember] contains non-legacy nullabilities.
-  Member _createLegacyMemberSignature(Member interfaceMember) {
-    if (interfaceMember is Field) {
-      return _createLegacyMemberSignatureForField(interfaceMember);
-    } else {
-      assert(interfaceMember is Procedure);
-      return _createLegacyMemberSignatureForProcedure(interfaceMember);
-    }
-  }
-
   /// Tag the parameters of [interfaceMember] that need type checks
   ///
   /// Parameters can need type checks for calls coming from statically typed
@@ -292,374 +52,73 @@
   /// they would not be checked in an inherited implementation, a forwarding
   /// stub is introduced as a place to put the checks.
   Member _computeCovarianceFixes() {
-    Member interfaceMember = combinedMemberSignatureResult.getMember(hierarchy);
-    if (_candidates.length == 1) {
+    SourceClassBuilder classBuilder = _combinedMemberSignature.classBuilder;
+    ClassMember canonicalMember = _combinedMemberSignature.canonicalMember;
+    Member interfaceMember =
+        canonicalMember.getMember(_combinedMemberSignature.hierarchy);
+
+    if (_combinedMemberSignature.members.length == 1) {
       // Covariance can only come from [interfaceMember] so we never need a
       // forwarding stub.
-      if (interfaceMember.isNonNullableByDefault &&
-          !classBuilder.library.isNonNullableByDefault) {
-        // Create a member signature with the legacy erasure type.
-        return _createLegacyMemberSignature(interfaceMember);
+      if (_combinedMemberSignature.neededLegacyErasure) {
+        return _combinedMemberSignature.createMemberFromSignature(
+            // TODO(johnniwinther): Change member signatures to use location
+            // of origin.
+            copyLocation: false);
       } else {
         // Nothing to do.
         return interfaceMember;
       }
     }
 
-    List<TypeParameter> interfaceMemberTypeParameters =
-        interfaceMember.function?.typeParameters ?? [];
-
-    List<TypeParameter> stubTypeParameters;
-    if (interfaceMember.enclosingClass != enclosingClass &&
-        interfaceMemberTypeParameters.isNotEmpty) {
-      // Create type parameters for the stub up front. These are needed to
-      // ensure the [substitutions] are alpha renamed to the same type
-      // parameters.
-      stubTypeParameters = new List<TypeParameter>.filled(
-          interfaceMemberTypeParameters.length, null);
-      for (int i = 0; i < interfaceMemberTypeParameters.length; i++) {
-        TypeParameter targetTypeParameter = interfaceMemberTypeParameters[i];
-        TypeParameter typeParameter = new TypeParameter(
-            targetTypeParameter.name, null)
-          ..isGenericCovariantImpl = targetTypeParameter.isGenericCovariantImpl;
-        stubTypeParameters[i] = typeParameter;
-      }
-    }
-
-    List<Substitution> substitutions =
-        new List<Substitution>(_candidates.length);
-    Substitution substitution;
-    for (int j = 0; j < _candidates.length; j++) {
-      Member otherMember = getCandidateAt(j);
-      substitutions[j] =
-          _substitutionFor(stubTypeParameters, otherMember, enclosingClass);
-      if (otherMember == interfaceMember) {
-        substitution = substitutions[j];
-      }
-    }
-    // We always create a forwarding stub when we've inherited a member from an
-    // interface other than the first override candidate.  This is to work
-    // around a bug in the Kernel type checker where it chooses the first
-    // override candidate.
-    //
-    // TODO(kmillikin): Fix the Kernel type checker and stop creating these
-    // extra stubs.
-    Member stub = interfaceMember.enclosingClass == enclosingClass ||
-            interfaceMember == getCandidateAt(0)
-        ? interfaceMember
-        : _createForwardingStub(
-            stubTypeParameters, substitution, interfaceMember);
-
-    FunctionNode interfaceFunction = interfaceMember.function;
-    List<VariableDeclaration> interfacePositionalParameters =
-        getPositionalParameters(interfaceMember);
-    List<VariableDeclaration> interfaceNamedParameters =
-        interfaceFunction?.namedParameters ?? [];
-    List<TypeParameter> interfaceTypeParameters =
-        interfaceFunction?.typeParameters ?? [];
-
-    void createStubIfNeeded({bool forMemberSignature: false}) {
-      if (stub != interfaceMember) {
-        Procedure procedure = stub;
-        if (forMemberSignature) {
-          procedure.isMemberSignature = true;
-          procedure.memberSignatureOrigin =
+    bool cannotReuseExistingMember =
+        !(_combinedMemberSignature.isCanonicalMemberFirst ||
+            _combinedMemberSignature.isCanonicalMemberDeclared);
+    bool needsTypeOrCovarianceUpdate =
+        _combinedMemberSignature.neededNnbdTopMerge ||
+            _combinedMemberSignature.neededLegacyErasure ||
+            _combinedMemberSignature.needsCovarianceMerging;
+    bool stubNeeded = cannotReuseExistingMember ||
+        (canonicalMember.classBuilder != classBuilder &&
+            needsTypeOrCovarianceUpdate);
+    if (stubNeeded) {
+      Procedure stub = _combinedMemberSignature.createMemberFromSignature(
+          copyLocation: false);
+      if (_combinedMemberSignature.needsCovarianceMerging ||
+          _combinedMemberSignature.needsSuperImpl) {
+        // This is a forward stub.
+        Member finalTarget;
+        if (interfaceMember is Procedure && interfaceMember.isForwardingStub) {
+          finalTarget = interfaceMember.forwardingStubInterfaceTarget;
+        } else {
+          finalTarget =
               interfaceMember.memberSignatureOrigin ?? interfaceMember;
-        } else {
-          procedure.isForwardingStub = true;
         }
-        return;
+        stub.isMemberSignature = false;
+        stub.memberSignatureOrigin = null;
+        stub.isForwardingStub = true;
+        stub.forwardingStubInterfaceTarget = finalTarget;
+        if (_combinedMemberSignature.needsSuperImpl) {
+          _createForwardingImplIfNeeded(
+              stub.function, stub.name, classBuilder.cls);
+        }
       }
-      if (interfaceMember.enclosingClass == enclosingClass) return;
-      stub = _createForwardingStub(
-          stubTypeParameters, substitution, interfaceMember,
-          memberSignatureTarget: forMemberSignature
-              ? interfaceMember.memberSignatureOrigin ?? interfaceMember
-              : null);
+      return stub;
+    } else {
+      if (_combinedMemberSignature.needsCovarianceMerging) {
+        _combinedMemberSignature.combinedMemberSignatureCovariance
+            .applyCovariance(interfaceMember);
+      }
+      if (_combinedMemberSignature.needsSuperImpl) {
+        _createForwardingImplIfNeeded(
+            interfaceMember.function, interfaceMember.name, classBuilder.cls);
+      }
+      return interfaceMember;
     }
-
-    bool isImplCreated = false;
-    void createImplIfNeeded() {
-      if (isImplCreated) return;
-      createStubIfNeeded();
-      _createForwardingImplIfNeeded(stub.function);
-      isImplCreated = true;
-    }
-
-    IncludesTypeParametersNonCovariantly needsCheckVisitor =
-        enclosingClass.typeParameters.isEmpty
-            ? null
-            // TODO(ahe): It may be necessary to cache this object.
-            : new IncludesTypeParametersNonCovariantly(
-                enclosingClass.typeParameters,
-                // We are checking the parameter types and these are in a
-                // contravariant position.
-                initialVariance: Variance.contravariant);
-    bool needsCheck(DartType type) => needsCheckVisitor == null
-        ? false
-        : substitution.substituteType(type).accept(needsCheckVisitor);
-    bool isNonNullableByDefault = classBuilder.library.isNonNullableByDefault;
-
-    DartType initialType(int candidateIndex, DartType a) {
-      if (isNonNullableByDefault) {
-        if (_mergeIndices != null && _mergeIndices.contains(candidateIndex)) {
-          return norm(hierarchy.coreTypes, a);
-        } else {
-          return a;
-        }
-      } else {
-        return legacyErasure(hierarchy.coreTypes, a);
-      }
-    }
-
-    DartType mergeTypes(int index, DartType a, DartType b) {
-      if (a == null) return null;
-      if (isNonNullableByDefault &&
-          _mergeIndices != null &&
-          _mergeIndices.contains(index)) {
-        return nnbdTopMerge(
-            hierarchy.coreTypes, a, norm(hierarchy.coreTypes, b));
-      } else {
-        return a;
-      }
-    }
-
-    for (int parameterIndex = 0;
-        parameterIndex < interfacePositionalParameters.length;
-        parameterIndex++) {
-      VariableDeclaration parameter =
-          interfacePositionalParameters[parameterIndex];
-      DartType parameterType = substitution.substituteType(parameter.type);
-      DartType type = initialType(_combinedMemberIndex, parameterType);
-      if (parameterIndex == 0 &&
-          hierarchy
-              .coreTypes.objectClass.enclosingLibrary.isNonNullableByDefault &&
-          !classBuilder.library.isNonNullableByDefault &&
-          interfaceMember == hierarchy.coreTypes.objectEquals) {
-        // In legacy code we special case `Object.==` to infer `dynamic`
-        // instead `Object!`.
-        type = const DynamicType();
-      }
-      bool isGenericCovariantImpl =
-          parameter.isGenericCovariantImpl || needsCheck(parameter.type);
-      bool isCovariant = parameter.isCovariant;
-      VariableDeclaration superParameter = parameter;
-      for (int candidateIndex = 0;
-          candidateIndex < _candidates.length;
-          candidateIndex++) {
-        Member otherMember = getCandidateAt(candidateIndex);
-        List<VariableDeclaration> otherPositionalParameters =
-            getPositionalParameters(otherMember);
-        if (otherPositionalParameters.length <= parameterIndex) continue;
-        VariableDeclaration otherParameter =
-            otherPositionalParameters[parameterIndex];
-        if (candidateIndex == 0) superParameter = otherParameter;
-        if (identical(otherMember, interfaceMember)) continue;
-        if (otherParameter.isGenericCovariantImpl) {
-          isGenericCovariantImpl = true;
-        }
-        if (otherParameter.isCovariant) {
-          isCovariant = true;
-        }
-        DartType candidateType =
-            substitutions[candidateIndex].substituteType(otherParameter.type);
-        if (parameterIndex == 0 &&
-            hierarchy.coreTypes.objectClass.enclosingLibrary
-                .isNonNullableByDefault &&
-            !classBuilder.library.isNonNullableByDefault &&
-            otherMember == hierarchy.coreTypes.objectEquals) {
-          // In legacy code we special case `Object.==` to infer `dynamic`
-          // instead `Object!`.
-          candidateType = const DynamicType();
-        }
-
-        type = mergeTypes(candidateIndex, type, candidateType);
-      }
-      if (isGenericCovariantImpl) {
-        if (!superParameter.isGenericCovariantImpl) {
-          createImplIfNeeded();
-        }
-        if (!parameter.isGenericCovariantImpl) {
-          createStubIfNeeded();
-          stub.function.positionalParameters[parameterIndex]
-              .isGenericCovariantImpl = true;
-        }
-      }
-      if (isCovariant) {
-        if (!superParameter.isCovariant) {
-          createImplIfNeeded();
-        }
-        if (!parameter.isCovariant) {
-          createStubIfNeeded();
-          stub.function.positionalParameters[parameterIndex].isCovariant = true;
-        }
-      }
-      if (type != null && type != parameterType) {
-        // TODO(johnniwinther): Report an error when [type] is null; this
-        // means that nnbd-top-merge was not defined.
-        createStubIfNeeded(forMemberSignature: true);
-        stub.function.positionalParameters[parameterIndex].type = type;
-      }
-    }
-    for (int parameterIndex = 0;
-        parameterIndex < interfaceNamedParameters.length;
-        parameterIndex++) {
-      VariableDeclaration parameter = interfaceNamedParameters[parameterIndex];
-      DartType parameterType = substitution.substituteType(parameter.type);
-      DartType type = initialType(_combinedMemberIndex, parameterType);
-      bool isGenericCovariantImpl =
-          parameter.isGenericCovariantImpl || needsCheck(parameter.type);
-      bool isCovariant = parameter.isCovariant;
-      VariableDeclaration superParameter = parameter;
-      for (int candidateIndex = 0;
-          candidateIndex < _candidates.length;
-          candidateIndex++) {
-        Member otherMember = getCandidateAt(candidateIndex);
-        if (otherMember is ForwardingNode) continue;
-        VariableDeclaration otherParameter =
-            getNamedFormal(otherMember.function, parameter.name);
-        if (otherParameter == null) continue;
-        if (candidateIndex == 0) superParameter = otherParameter;
-        if (identical(otherMember, interfaceMember)) continue;
-        if (otherParameter.isGenericCovariantImpl) {
-          isGenericCovariantImpl = true;
-        }
-        if (otherParameter.isCovariant) {
-          isCovariant = true;
-        }
-        type = mergeTypes(candidateIndex, type,
-            substitutions[candidateIndex].substituteType(otherParameter.type));
-      }
-      if (isGenericCovariantImpl) {
-        if (!superParameter.isGenericCovariantImpl) {
-          createImplIfNeeded();
-        }
-        if (!parameter.isGenericCovariantImpl) {
-          createStubIfNeeded();
-          stub.function.namedParameters[parameterIndex].isGenericCovariantImpl =
-              true;
-        }
-      }
-      if (isCovariant) {
-        if (!superParameter.isCovariant) {
-          createImplIfNeeded();
-        }
-        if (!parameter.isCovariant) {
-          createStubIfNeeded();
-          stub.function.namedParameters[parameterIndex].isCovariant = true;
-        }
-      }
-      if (type != null && type != parameterType) {
-        // TODO(johnniwinther): Report an error when [type] is null; this
-        // means that nnbd-top-merge was not defined.
-        createStubIfNeeded(forMemberSignature: true);
-        stub.function.namedParameters[parameterIndex].type = type;
-      }
-    }
-    for (int parameterIndex = 0;
-        parameterIndex < interfaceTypeParameters.length;
-        parameterIndex++) {
-      TypeParameter typeParameter = interfaceTypeParameters[parameterIndex];
-      DartType parameterBound =
-          substitution.substituteType(typeParameter.bound);
-      DartType bound = initialType(_combinedMemberIndex, parameterBound);
-      DartType parameterDefaultType =
-          substitution.substituteType(typeParameter.defaultType);
-      DartType defaultType =
-          initialType(_combinedMemberIndex, parameterDefaultType);
-      bool isGenericCovariantImpl =
-          typeParameter.isGenericCovariantImpl || needsCheck(parameterBound);
-      TypeParameter superTypeParameter = typeParameter;
-      for (int candidateIndex = 0;
-          candidateIndex < _candidates.length;
-          candidateIndex++) {
-        Member otherMember = getCandidateAt(candidateIndex);
-        if (otherMember is ForwardingNode) continue;
-        List<TypeParameter> otherTypeParameters =
-            otherMember.function.typeParameters;
-        if (otherTypeParameters.length <= parameterIndex) continue;
-        TypeParameter otherTypeParameter = otherTypeParameters[parameterIndex];
-        if (candidateIndex == 0) superTypeParameter = otherTypeParameter;
-        if (identical(otherMember, interfaceMember)) continue;
-        if (otherTypeParameter.isGenericCovariantImpl) {
-          isGenericCovariantImpl = true;
-        }
-      }
-      if (isGenericCovariantImpl) {
-        if (!superTypeParameter.isGenericCovariantImpl) {
-          createImplIfNeeded();
-        }
-        if (!typeParameter.isGenericCovariantImpl) {
-          createStubIfNeeded();
-          stub.function.typeParameters[parameterIndex].isGenericCovariantImpl =
-              true;
-        }
-      }
-      if (bound != null && bound != parameterBound) {
-        createStubIfNeeded(forMemberSignature: true);
-        stub.function.typeParameters[parameterIndex].bound = bound;
-      }
-      if (defaultType != null && defaultType != parameterDefaultType) {
-        createStubIfNeeded(forMemberSignature: true);
-        stub.function.typeParameters[parameterIndex].defaultType = defaultType;
-      }
-    }
-    DartType returnType =
-        substitution.substituteType(getReturnType(interfaceMember));
-    DartType type = initialType(_combinedMemberIndex, returnType);
-    for (int candidateIndex = 0;
-        candidateIndex < _candidates.length;
-        candidateIndex++) {
-      Member otherMember = getCandidateAt(candidateIndex);
-      type = mergeTypes(
-          candidateIndex,
-          type,
-          substitutions[candidateIndex]
-              .substituteType(getReturnType(otherMember)));
-    }
-    if (type != null && type != returnType) {
-      // TODO(johnniwinther): Report an error when [type] is null; this
-      // means that nnbd-top-merge was not defined.
-      createStubIfNeeded(forMemberSignature: true);
-      stub.function.returnType = type;
-    }
-    assert(
-        !(stub is Procedure &&
-            (stub as Procedure).isMemberSignature &&
-            stub.memberSignatureOrigin == null),
-        "No member signature origin for member signature $stub.");
-    if (stub != interfaceMember && stub is Procedure) {
-      Procedure procedure = stub;
-      if (procedure.isForwardingStub || procedure.isForwardingSemiStub) {
-        procedure.isMemberSignature = false;
-        procedure.memberSignatureOrigin = null;
-      } else {
-        procedure.forwardingStubInterfaceTarget = null;
-        procedure.forwardingStubSuperTarget = null;
-      }
-      assert(
-          !(procedure.isMemberSignature && procedure.isForwardingStub),
-          "Procedure is both member signature and forwarding stub: "
-          "$procedure.");
-      assert(
-          !(procedure.isMemberSignature && procedure.isForwardingSemiStub),
-          "Procedure is both member signature and forwarding semi stub: "
-          "$procedure.");
-      assert(
-          !(procedure.forwardingStubInterfaceTarget is Procedure &&
-              (procedure.forwardingStubInterfaceTarget as Procedure)
-                  .isMemberSignature),
-          "Forwarding stub interface target is member signature: $procedure.");
-      assert(
-          !(procedure.forwardingStubSuperTarget is Procedure &&
-              (procedure.forwardingStubSuperTarget as Procedure)
-                  .isMemberSignature),
-          "Forwarding stub super target is member signature: $procedure.");
-    }
-    return stub;
   }
 
-  void _createForwardingImplIfNeeded(FunctionNode function) {
+  void _createForwardingImplIfNeeded(
+      FunctionNode function, Name name, Class enclosingClass) {
     if (function.body != null) {
       // There is already an implementation; nothing further needs to be done.
       return;
@@ -670,8 +129,9 @@
     Class superclass = enclosingClass.superclass;
     if (superclass == null) return;
     Procedure procedure = function.parent;
-    Member superTarget = hierarchy.getDispatchTargetKernel(
-        superclass, procedure.name, kind == ProcedureKind.Setter);
+    Member superTarget = _combinedMemberSignature.hierarchy
+        .getDispatchTargetKernel(
+            superclass, procedure.name, kind == ProcedureKind.Setter);
     if (superTarget == null) return;
     if (superTarget is Procedure && superTarget.isForwardingStub) {
       Procedure superProcedure = superTarget;
@@ -702,6 +162,12 @@
     Arguments arguments = new Arguments(positionalArguments,
         types: typeArguments, named: namedArguments);
     Expression superCall;
+    assert(superTarget != null,
+        "No super target found for '${name}' in ${enclosingClass}.");
+    assert(
+        !superTarget.isAbstract,
+        "Abstract super target $superTarget found for '${name}' in "
+        "${enclosingClass}.");
     switch (kind) {
       case ProcedureKind.Method:
       case ProcedureKind.Operator:
@@ -722,144 +188,4 @@
     procedure.transformerFlags |= TransformerFlag.superCalls;
     procedure.forwardingStubSuperTarget = superTarget;
   }
-
-  /// Creates a forwarding stub based on the given [target].
-  Procedure _createForwardingStub(List<TypeParameter> typeParameters,
-      Substitution substitution, Member target,
-      {Member memberSignatureTarget}) {
-    VariableDeclaration copyParameter(VariableDeclaration parameter) {
-      return new VariableDeclaration(parameter.name,
-          type: substitution.substituteType(parameter.type),
-          isCovariant: parameter.isCovariant)
-        ..isGenericCovariantImpl = parameter.isGenericCovariantImpl;
-    }
-
-    List<TypeParameter> targetTypeParameters =
-        target.function?.typeParameters ?? [];
-    if (typeParameters != null) {
-      Map<TypeParameter, DartType> additionalSubstitution =
-          <TypeParameter, DartType>{};
-      for (int i = 0; i < targetTypeParameters.length; i++) {
-        TypeParameter targetTypeParameter = targetTypeParameters[i];
-        additionalSubstitution[targetTypeParameter] =
-            new TypeParameterType.forAlphaRenaming(
-                targetTypeParameter, typeParameters[i]);
-      }
-      substitution = Substitution.combine(
-          substitution, Substitution.fromMap(additionalSubstitution));
-      for (int i = 0; i < typeParameters.length; i++) {
-        typeParameters[i].bound =
-            substitution.substituteType(targetTypeParameters[i].bound);
-        typeParameters[i].defaultType =
-            substitution.substituteType(targetTypeParameters[i].defaultType);
-      }
-    }
-    List<VariableDeclaration> positionalParameters =
-        getPositionalParameters(target).map(copyParameter).toList();
-    List<VariableDeclaration> namedParameters =
-        target.function?.namedParameters?.map(copyParameter)?.toList() ?? [];
-    FunctionNode function = new FunctionNode(null,
-        positionalParameters: positionalParameters,
-        namedParameters: namedParameters,
-        typeParameters: typeParameters,
-        requiredParameterCount: getRequiredParameterCount(target),
-        returnType: substitution.substituteType(getReturnType(target)));
-    Member finalTarget;
-    if (target is Procedure && target.isForwardingStub) {
-      finalTarget = target.forwardingStubInterfaceTarget;
-    } else {
-      finalTarget = target.memberSignatureOrigin ?? target;
-    }
-    Procedure referenceFrom;
-    if (classBuilder.referencesFromIndexed != null) {
-      if (kind == ProcedureKind.Setter) {
-        referenceFrom =
-            classBuilder.referencesFromIndexed.lookupProcedureSetter(name.text);
-      } else {
-        referenceFrom = classBuilder.referencesFromIndexed
-            .lookupProcedureNotSetter(name.text);
-      }
-    }
-    return new Procedure(name, kind, function,
-        isAbstract: true,
-        isForwardingStub: memberSignatureTarget == null,
-        isMemberSignature: memberSignatureTarget != null,
-        fileUri: enclosingClass.fileUri,
-        forwardingStubInterfaceTarget: finalTarget,
-        reference: referenceFrom?.reference,
-        memberSignatureOrigin: memberSignatureTarget)
-      ..startFileOffset = enclosingClass.fileOffset
-      ..fileOffset = enclosingClass.fileOffset
-      ..parent = enclosingClass
-      ..isNonNullableByDefault =
-          enclosingClass.enclosingLibrary.isNonNullableByDefault;
-  }
-
-  /// Returns the [i]th element of [_candidates], finalizing it if necessary.
-  Member getCandidateAt(int i) {
-    ClassMember candidate = _candidates[i];
-    return candidate.getMember(hierarchy);
-  }
-
-  Substitution _substitutionFor(
-      List<TypeParameter> stubTypeParameters, Member candidate, Class class_) {
-    Substitution substitution = Substitution.fromInterfaceType(
-        hierarchy.getTypeAsInstanceOf(
-            hierarchy.coreTypes
-                .thisInterfaceType(class_, class_.enclosingLibrary.nonNullable),
-            candidate.enclosingClass,
-            class_.enclosingLibrary,
-            hierarchy.coreTypes));
-    if (stubTypeParameters != null) {
-      // If the stub is generic ensure that type parameters are alpha renamed
-      // to the [stubTypeParameters].
-      Map<TypeParameter, TypeParameterType> map = {};
-      for (int i = 0; i < stubTypeParameters.length; i++) {
-        TypeParameter typeParameter = candidate.function.typeParameters[i];
-        map[typeParameter] = new TypeParameterType.forAlphaRenaming(
-            typeParameter, stubTypeParameters[i]);
-      }
-      substitution =
-          Substitution.combine(substitution, Substitution.fromMap(map));
-    }
-    return substitution;
-  }
-
-  List<VariableDeclaration> getPositionalParameters(Member member) {
-    if (member is Field) {
-      if (kind == ProcedureKind.Setter) {
-        return <VariableDeclaration>[
-          new VariableDeclaration("_",
-              type: member.type, isCovariant: member.isCovariant)
-            ..isGenericCovariantImpl = member.isGenericCovariantImpl
-        ];
-      } else {
-        return <VariableDeclaration>[];
-      }
-    } else {
-      return member.function.positionalParameters;
-    }
-  }
-
-  int getRequiredParameterCount(Member member) {
-    switch (kind) {
-      case ProcedureKind.Getter:
-        return 0;
-      case ProcedureKind.Setter:
-        return 1;
-      default:
-        return member.function.requiredParameterCount;
-    }
-  }
-
-  DartType getReturnType(Member member) {
-    switch (kind) {
-      case ProcedureKind.Getter:
-        return member is Field ? member.type : member.function.returnType;
-      case ProcedureKind.Setter:
-        return const VoidType();
-      default:
-        return member.function.returnType;
-    }
-  }
 }
diff --git a/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart b/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
index e5d4c71..f64bdf2 100644
--- a/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
@@ -841,7 +841,11 @@
     Expression implicitDowncast = inferrer.ensureAssignable(
         variable.type, inferredType, variableGet,
         fileOffset: parent.fileOffset,
-        errorTemplate: templateForInLoopElementTypeNotAssignable);
+        errorTemplate: templateForInLoopElementTypeNotAssignable,
+        nullabilityErrorTemplate:
+            templateForInLoopElementTypeNotAssignableNullability,
+        nullabilityPartErrorTemplate:
+            templateForInLoopElementTypeNotAssignablePartNullability);
     Statement expressionEffect;
     if (!identical(implicitDowncast, variableGet)) {
       variable.initializer = implicitDowncast..parent = variable;
@@ -884,7 +888,10 @@
             const DynamicType(), iterableClass, inferrer.library.nonNullable),
         inferredExpressionType,
         iterable,
-        errorTemplate: templateForInLoopTypeNotIterable);
+        errorTemplate: templateForInLoopTypeNotIterable,
+        nullabilityErrorTemplate: templateForInLoopTypeNotIterableNullability,
+        nullabilityPartErrorTemplate:
+            templateForInLoopTypeNotIterablePartNullability);
     DartType inferredType;
     if (typeNeeded) {
       inferredType = const DynamicType();
@@ -1165,21 +1172,26 @@
     DartType inferredType = inferrer.typeSchemaEnvironment
         .getStandardUpperBound(nonNullableLhsType, rhsResult.inferredType,
             inferrer.library.library);
-    VariableDeclaration variable =
-        createVariable(lhsResult.expression, lhsResult.inferredType);
-    MethodInvocation equalsNull = createEqualsNull(
-        lhsResult.expression.fileOffset,
-        createVariableGet(variable),
-        equalsMember);
-    VariableGet variableGet = createVariableGet(variable);
-    if (inferrer.library.isNonNullableByDefault &&
-        !identical(nonNullableLhsType, originalLhsType)) {
-      variableGet.promotedType = nonNullableLhsType;
+    Expression replacement;
+    if (lhsResult.expression is ThisExpression) {
+      replacement = lhsResult.expression;
+    } else {
+      VariableDeclaration variable =
+          createVariable(lhsResult.expression, lhsResult.inferredType);
+      MethodInvocation equalsNull = createEqualsNull(
+          lhsResult.expression.fileOffset,
+          createVariableGet(variable),
+          equalsMember);
+      VariableGet variableGet = createVariableGet(variable);
+      if (inferrer.library.isNonNullableByDefault &&
+          !identical(nonNullableLhsType, originalLhsType)) {
+        variableGet.promotedType = nonNullableLhsType;
+      }
+      ConditionalExpression conditional = new ConditionalExpression(
+          equalsNull, rhsResult.expression, variableGet, inferredType);
+      replacement = new Let(variable, conditional)
+        ..fileOffset = node.fileOffset;
     }
-    ConditionalExpression conditional = new ConditionalExpression(
-        equalsNull, rhsResult.expression, variableGet, inferredType);
-    Expression replacement = new Let(variable, conditional)
-      ..fileOffset = node.fileOffset;
     return new ExpressionInferenceResult(inferredType, replacement);
   }
 
@@ -1318,7 +1330,7 @@
       if (inferrer.isNonNullableByDefault) {
         return isNullAware ? const NeverType(Nullability.nonNullable) : null;
       } else {
-        return isNullAware ? inferrer.coreTypes.nullType : null;
+        return isNullAware ? const NullType() : null;
       }
     }
     if (spreadTypeBound is InterfaceType) {
@@ -1377,7 +1389,7 @@
             if (inferrer.isNonNullableByDefault &&
                 spreadType.isPotentiallyNullable &&
                 spreadType is! DynamicType &&
-                spreadType != inferrer.coreTypes.nullType &&
+                spreadType is! NullType &&
                 !element.isNullAware) {
               replacement = inferrer.helper.buildProblem(
                   messageNullableSpreadError, element.expression.fileOffset, 1);
@@ -1391,18 +1403,56 @@
           }
         } else if (spreadTypeBound is InterfaceType) {
           if (!inferrer.isAssignable(inferredTypeArgument, spreadElementType)) {
-            replacement = inferrer.helper.buildProblem(
-                templateSpreadElementTypeMismatch.withArguments(
-                    spreadElementType,
-                    inferredTypeArgument,
-                    inferrer.isNonNullableByDefault),
-                element.expression.fileOffset,
-                1);
+            if (inferrer.isNonNullableByDefault) {
+              IsSubtypeOf subtypeCheckResult = inferrer.typeSchemaEnvironment
+                  .performNullabilityAwareSubtypeCheck(
+                      spreadElementType, inferredTypeArgument);
+              if (subtypeCheckResult.isSubtypeWhenIgnoringNullabilities()) {
+                if (spreadElementType == subtypeCheckResult.subtype &&
+                    inferredTypeArgument == subtypeCheckResult.supertype) {
+                  replacement = inferrer.helper.buildProblem(
+                      templateSpreadElementTypeMismatchNullability
+                          .withArguments(
+                              spreadElementType,
+                              inferredTypeArgument,
+                              inferrer.isNonNullableByDefault),
+                      element.expression.fileOffset,
+                      1);
+                } else {
+                  replacement = inferrer.helper.buildProblem(
+                      templateSpreadElementTypeMismatchPartNullability
+                          .withArguments(
+                              spreadElementType,
+                              inferredTypeArgument,
+                              subtypeCheckResult.subtype,
+                              subtypeCheckResult.supertype,
+                              inferrer.isNonNullableByDefault),
+                      element.expression.fileOffset,
+                      1);
+                }
+              } else {
+                replacement = inferrer.helper.buildProblem(
+                    templateSpreadElementTypeMismatch.withArguments(
+                        spreadElementType,
+                        inferredTypeArgument,
+                        inferrer.isNonNullableByDefault),
+                    element.expression.fileOffset,
+                    1);
+              }
+            } else {
+              replacement = inferrer.helper.buildProblem(
+                  templateSpreadElementTypeMismatch.withArguments(
+                      spreadElementType,
+                      inferredTypeArgument,
+                      inferrer.isNonNullableByDefault),
+                  element.expression.fileOffset,
+                  1);
+            }
           }
           if (inferrer.isNonNullableByDefault &&
               spreadType.isPotentiallyNullable &&
               spreadType is! DynamicType &&
-              spreadType != inferrer.coreTypes.nullType &&
+              spreadType is! NullType &&
               !element.isNullAware) {
             replacement = inferrer.helper.buildProblem(
                 messageNullableSpreadError, element.expression.fileOffset, 1);
@@ -1750,7 +1800,7 @@
           output[offset] =
               output[offset + 1] = const NeverType(Nullability.nonNullable);
         } else {
-          output[offset] = output[offset + 1] = inferrer.coreTypes.nullType;
+          output[offset] = output[offset + 1] = const NullType();
         }
       }
     } else if (typeBound is InterfaceType) {
@@ -1824,7 +1874,7 @@
             if (inferrer.isNonNullableByDefault &&
                 spreadType.isPotentiallyNullable &&
                 spreadType is! DynamicType &&
-                spreadType != inferrer.coreTypes.nullType &&
+                spreadType is! NullType &&
                 !entry.isNullAware) {
               replacement = new SpreadMapEntry(
                   inferrer.helper.buildProblem(messageNullableSpreadError,
@@ -1850,27 +1900,100 @@
           Expression keyError;
           Expression valueError;
           if (!inferrer.isAssignable(inferredKeyType, actualKeyType)) {
-            keyError = inferrer.helper.buildProblem(
-                templateSpreadMapEntryElementKeyTypeMismatch.withArguments(
-                    actualKeyType,
-                    inferredKeyType,
-                    inferrer.isNonNullableByDefault),
-                entry.expression.fileOffset,
-                1);
+            if (inferrer.isNonNullableByDefault) {
+              IsSubtypeOf subtypeCheckResult = inferrer.typeSchemaEnvironment
+                  .performNullabilityAwareSubtypeCheck(
+                      actualKeyType, inferredKeyType);
+              if (subtypeCheckResult.isSubtypeWhenIgnoringNullabilities()) {
+                if (actualKeyType == subtypeCheckResult.subtype &&
+                    inferredKeyType == subtypeCheckResult.supertype) {
+                  keyError = inferrer.helper.buildProblem(
+                      templateSpreadMapEntryElementKeyTypeMismatchNullability
+                          .withArguments(actualKeyType, inferredKeyType,
+                              inferrer.isNonNullableByDefault),
+                      entry.expression.fileOffset,
+                      1);
+                } else {
+                  keyError = inferrer.helper.buildProblem(
+                      // ignore: lines_longer_than_80_chars
+                      templateSpreadMapEntryElementKeyTypeMismatchPartNullability
+                          .withArguments(
+                              actualKeyType,
+                              inferredKeyType,
+                              subtypeCheckResult.subtype,
+                              subtypeCheckResult.supertype,
+                              inferrer.isNonNullableByDefault),
+                      entry.expression.fileOffset,
+                      1);
+                }
+              } else {
+                keyError = inferrer.helper.buildProblem(
+                    templateSpreadMapEntryElementKeyTypeMismatch.withArguments(
+                        actualKeyType,
+                        inferredKeyType,
+                        inferrer.isNonNullableByDefault),
+                    entry.expression.fileOffset,
+                    1);
+              }
+            } else {
+              keyError = inferrer.helper.buildProblem(
+                  templateSpreadMapEntryElementKeyTypeMismatch.withArguments(
+                      actualKeyType,
+                      inferredKeyType,
+                      inferrer.isNonNullableByDefault),
+                  entry.expression.fileOffset,
+                  1);
+            }
           }
           if (!inferrer.isAssignable(inferredValueType, actualValueType)) {
-            valueError = inferrer.helper.buildProblem(
-                templateSpreadMapEntryElementValueTypeMismatch.withArguments(
-                    actualValueType,
-                    inferredValueType,
-                    inferrer.isNonNullableByDefault),
-                entry.expression.fileOffset,
-                1);
+            if (inferrer.isNonNullableByDefault) {
+              IsSubtypeOf subtypeCheckResult = inferrer.typeSchemaEnvironment
+                  .performNullabilityAwareSubtypeCheck(
+                      actualValueType, inferredValueType);
+              if (subtypeCheckResult.isSubtypeWhenIgnoringNullabilities()) {
+                if (actualValueType == subtypeCheckResult.subtype &&
+                    inferredValueType == subtypeCheckResult.supertype) {
+                  valueError = inferrer.helper.buildProblem(
+                      templateSpreadMapEntryElementValueTypeMismatchNullability
+                          .withArguments(actualValueType, inferredValueType,
+                              inferrer.isNonNullableByDefault),
+                      entry.expression.fileOffset,
+                      1);
+                } else {
+                  valueError = inferrer.helper.buildProblem(
+                      // ignore: lines_longer_than_80_chars
+                      templateSpreadMapEntryElementValueTypeMismatchPartNullability
+                          .withArguments(
+                              actualValueType,
+                              inferredValueType,
+                              subtypeCheckResult.subtype,
+                              subtypeCheckResult.supertype,
+                              inferrer.isNonNullableByDefault),
+                      entry.expression.fileOffset,
+                      1);
+                }
+              } else {
+                valueError = inferrer.helper.buildProblem(
+                    templateSpreadMapEntryElementValueTypeMismatch
+                        .withArguments(actualValueType, inferredValueType,
+                            inferrer.isNonNullableByDefault),
+                    entry.expression.fileOffset,
+                    1);
+              }
+            } else {
+              valueError = inferrer.helper.buildProblem(
+                  templateSpreadMapEntryElementValueTypeMismatch.withArguments(
+                      actualValueType,
+                      inferredValueType,
+                      inferrer.isNonNullableByDefault),
+                  entry.expression.fileOffset,
+                  1);
+            }
           }
           if (inferrer.isNonNullableByDefault &&
               spreadType.isPotentiallyNullable &&
               spreadType is! DynamicType &&
-              spreadType != inferrer.coreTypes.nullType &&
+              spreadType is! NullType &&
               !entry.isNullAware) {
             keyError = inferrer.helper.buildProblem(
                 messageNullableSpreadError, entry.expression.fileOffset, 1);
@@ -3616,7 +3739,14 @@
     right = inferrer.ensureAssignableResult(
         rightType.withDeclaredNullability(inferrer.library.nullable),
         rightResult,
-        errorTemplate: templateArgumentTypeNotAssignable);
+        errorTemplate: templateArgumentTypeNotAssignable,
+        nullabilityErrorTemplate: templateArgumentTypeNotAssignableNullability,
+        nullabilityPartErrorTemplate:
+            templateArgumentTypeNotAssignablePartNullability,
+        nullabilityNullErrorTemplate:
+            templateArgumentTypeNotAssignableNullabilityNull,
+        nullabilityNullTypeErrorTemplate:
+            templateArgumentTypeNotAssignableNullabilityNullType);
 
     Expression equals = new MethodInvocation(
         left,
@@ -4876,7 +5006,7 @@
   ExpressionInferenceResult visitNullLiteral(
       NullLiteral node, DartType typeContext) {
     inferrer.flowAnalysis.nullLiteral(node);
-    return new ExpressionInferenceResult(inferrer.coreTypes.nullType, node);
+    return new ExpressionInferenceResult(const NullType(), node);
   }
 
   @override
@@ -5121,7 +5251,7 @@
       node.expression = expressionResult.expression..parent = node;
       inferredType = expressionResult.inferredType;
     } else {
-      inferredType = inferrer.coreTypes.nullType;
+      inferredType = const NullType();
     }
     closureContext.handleReturn(inferrer, node, inferredType, node.isArrow);
     inferrer.flowAnalysis.handleExit();
@@ -5357,8 +5487,7 @@
     DartType receiverType = inferrer.classHierarchy.getTypeAsInstanceOf(
         inferrer.thisType,
         inferrer.thisType.classNode.supertype.classNode,
-        inferrer.library.library,
-        inferrer.coreTypes);
+        inferrer.library.library);
 
     ObjectAccessTarget writeTarget = inferrer.findInterfaceMember(
         receiverType, node.name, node.fileOffset,
@@ -5704,15 +5833,15 @@
         node.isImplicitlyTyped ? const UnknownType() : node.type;
     DartType inferredType;
     ExpressionInferenceResult initializerResult;
-    inferrer.flowAnalysis.declare(node, node.initializer != null);
+    inferrer.flowAnalysis.declare(node, node.hasDeclaredInitializer);
     if (node.initializer != null) {
-      if (node.isLate) {
+      if (node.isLate && node.hasDeclaredInitializer) {
         inferrer.flowAnalysis.lateInitializer_begin(node);
       }
       initializerResult = inferrer.inferExpression(node.initializer,
           declaredType, !inferrer.isTopLevel || node.isImplicitlyTyped,
           isVoidAllowed: true);
-      if (node.isLate) {
+      if (node.isLate && node.hasDeclaredInitializer) {
         inferrer.flowAnalysis.lateInitializer_end();
       }
       inferredType = inferrer.inferDeclarationType(
@@ -5803,14 +5932,11 @@
           new FunctionNode(
               node.initializer == null
                   ? late_lowering.createGetterBodyWithoutInitializer(
-                      inferrer.coreTypes,
-                      fileOffset,
-                      node.name,
-                      node.type,
-                      'Local',
+                      inferrer.coreTypes, fileOffset, node.name, node.type,
                       createVariableRead: createVariableRead,
                       createIsSetRead: createIsSetRead,
-                      isSetEncoding: isSetEncoding)
+                      isSetEncoding: isSetEncoding,
+                      forField: false)
                   : late_lowering.createGetterWithInitializer(
                       inferrer.coreTypes,
                       fileOffset,
@@ -5850,13 +5976,13 @@
                             node.name,
                             setterParameter,
                             node.type,
-                            'Local',
                             shouldReturnValue: true,
                             createVariableRead: createVariableRead,
                             createVariableWrite: createVariableWrite,
                             createIsSetRead: createIsSetRead,
                             createIsSetWrite: createIsSetWrite,
-                            isSetEncoding: isSetEncoding)
+                            isSetEncoding: isSetEncoding,
+                            forField: false)
                         : late_lowering.createSetterBody(inferrer.coreTypes,
                             fileOffset, node.name, setterParameter, node.type,
                             shouldReturnValue: true,
@@ -6228,11 +6354,15 @@
   }
 
   Expression inferAssignment(TypeInferrerImpl inferrer, DartType rhsType) {
+    DartType variableType =
+        inferrer.computeGreatestClosure(variableSet.variable.type);
     Expression rhs = inferrer.ensureAssignable(
-        inferrer.computeGreatestClosure(variableSet.variable.type),
-        rhsType,
-        variableSet.value,
+        variableType, rhsType, variableSet.value,
         errorTemplate: templateForInLoopElementTypeNotAssignable,
+        nullabilityErrorTemplate:
+            templateForInLoopElementTypeNotAssignableNullability,
+        nullabilityPartErrorTemplate:
+            templateForInLoopElementTypeNotAssignablePartNullability,
         isVoidAllowed: true);
 
     variableSet.value = rhs..parent = variableSet;
@@ -6291,6 +6421,10 @@
     Expression rhs = inferrer.ensureAssignable(
         inferrer.computeGreatestClosure(_writeType), rhsType, _rhs,
         errorTemplate: templateForInLoopElementTypeNotAssignable,
+        nullabilityErrorTemplate:
+            templateForInLoopElementTypeNotAssignableNullability,
+        nullabilityPartErrorTemplate:
+            templateForInLoopElementTypeNotAssignablePartNullability,
         isVoidAllowed: true);
 
     propertySet.value = rhs..parent = propertySet;
@@ -6327,6 +6461,10 @@
         rhsType,
         superPropertySet.value,
         errorTemplate: templateForInLoopElementTypeNotAssignable,
+        nullabilityErrorTemplate:
+            templateForInLoopElementTypeNotAssignableNullability,
+        nullabilityPartErrorTemplate:
+            templateForInLoopElementTypeNotAssignablePartNullability,
         isVoidAllowed: true);
     superPropertySet.value = rhs..parent = superPropertySet;
     ExpressionInferenceResult result = inferrer.inferExpression(
@@ -6347,11 +6485,15 @@
 
   @override
   Expression inferAssignment(TypeInferrerImpl inferrer, DartType rhsType) {
+    DartType setterType =
+        inferrer.computeGreatestClosure(staticSet.target.setterType);
     Expression rhs = inferrer.ensureAssignable(
-        inferrer.computeGreatestClosure(staticSet.target.setterType),
-        rhsType,
-        staticSet.value,
+        setterType, rhsType, staticSet.value,
         errorTemplate: templateForInLoopElementTypeNotAssignable,
+        nullabilityErrorTemplate:
+            templateForInLoopElementTypeNotAssignableNullability,
+        nullabilityPartErrorTemplate:
+            templateForInLoopElementTypeNotAssignablePartNullability,
         isVoidAllowed: true);
 
     staticSet.value = rhs..parent = staticSet;
diff --git a/pkg/front_end/lib/src/fasta/kernel/internal_ast.dart b/pkg/front_end/lib/src/fasta/kernel/internal_ast.dart
index 2ed8f56..dc9dfa1 100644
--- a/pkg/front_end/lib/src/fasta/kernel/internal_ast.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/internal_ast.dart
@@ -24,6 +24,7 @@
 import 'package:kernel/text/ast_to_text.dart' show Precedence, Printer;
 import 'package:kernel/src/printer.dart';
 import 'package:kernel/core_types.dart';
+import 'package:kernel/type_environment.dart';
 
 import '../builder/type_alias_builder.dart';
 
@@ -439,7 +440,11 @@
       unsupported("${runtimeType}.accept1", -1, null);
 
   @override
-  DartType getStaticType(types) =>
+  DartType getStaticType(StaticTypeContext context) =>
+      unsupported("${runtimeType}.getStaticType", -1, null);
+
+  @override
+  DartType getStaticTypeInternal(StaticTypeContext context) =>
       unsupported("${runtimeType}.getStaticType", -1, null);
 
   ExpressionInferenceResult acceptInference(
@@ -1378,6 +1383,11 @@
   final bool isImplicitlyTyped;
 
   /// True if the initializer was specified by the programmer.
+  ///
+  /// Note that the variable might have a synthesized initializer expression,
+  /// so `hasDeclaredInitializer == false` doesn't imply `initializer == null`.
+  /// For instance, for duplicate variable names, an invalid expression is set
+  /// as the initializer of the second variable.
   final bool hasDeclaredInitializer;
 
   // TODO(ahe): Remove this field. We can get rid of it by recording closure
diff --git a/pkg/front_end/lib/src/fasta/kernel/invalid_type.dart b/pkg/front_end/lib/src/fasta/kernel/invalid_type.dart
index d6bbd9a..fd05fdb 100644
--- a/pkg/front_end/lib/src/fasta/kernel/invalid_type.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/invalid_type.dart
@@ -57,6 +57,9 @@
       false;
 
   @override
+  bool visitNullType(NullType node, Set<TypedefType> visitedTypedefs) => false;
+
+  @override
   bool visitBottomType(BottomType node, Set<TypedefType> visitedTypedefs) =>
       false;
 
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
index 19f16db..a1167d5 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
@@ -4,9 +4,9 @@
 
 library fasta.kernel_target;
 
-import 'dart:async' show Future;
-
 import 'package:front_end/src/api_prototype/experimental_flags.dart';
+import 'package:front_end/src/fasta/dill/dill_library_builder.dart'
+    show DillLibraryBuilder;
 import 'package:kernel/ast.dart'
     show
         Arguments,
@@ -39,29 +39,20 @@
         TypeParameterType,
         VariableDeclaration,
         VariableGet;
-
 import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
-
 import 'package:kernel/clone.dart' show CloneVisitorNotMembers;
-
 import 'package:kernel/core_types.dart';
-
 import 'package:kernel/reference_from_index.dart' show IndexedClass;
-
-import 'package:kernel/type_algebra.dart' show substitute;
 import 'package:kernel/target/changed_structure_notifier.dart'
     show ChangedStructureNotifier;
 import 'package:kernel/target/targets.dart' show DiagnosticReporter;
-import 'package:kernel/type_environment.dart' show TypeEnvironment;
-import 'package:kernel/verifier.dart' show verifyGetStaticType;
-
 import 'package:kernel/transformations/value_class.dart' as valueClass;
-
+import 'package:kernel/type_algebra.dart' show substitute;
+import 'package:kernel/type_environment.dart' show TypeEnvironment;
 import 'package:package_config/package_config.dart';
 
 import '../../api_prototype/file_system.dart' show FileSystem;
 import '../../base/nnbd_mode.dart';
-
 import '../builder/builder.dart';
 import '../builder/class_builder.dart';
 import '../builder/constructor_builder.dart';
@@ -79,27 +70,25 @@
 import '../builder/type_declaration_builder.dart';
 import '../builder/type_variable_builder.dart';
 import '../builder/void_type_declaration_builder.dart';
-
 import '../compiler_context.dart' show CompilerContext;
-
 import '../crash.dart' show withCrashReporting;
-
-import '../dill/dill_target.dart' show DillTarget;
-
 import '../dill/dill_member_builder.dart' show DillMemberBuilder;
-
-import '../fasta_codes.dart' show Message, LocatedMessage;
-
+import '../dill/dill_target.dart' show DillTarget;
+import '../fasta_codes.dart' show LocatedMessage, Message;
 import '../loader.dart' show Loader;
-
 import '../messages.dart'
     show
         FormattedMessage,
+        messageAgnosticWithStrongDillLibrary,
+        messageAgnosticWithWeakDillLibrary,
         messageConstConstructorLateFinalFieldCause,
         messageConstConstructorLateFinalFieldError,
         messageConstConstructorNonFinalField,
         messageConstConstructorNonFinalFieldCause,
         messageConstConstructorRedirectionToNonConst,
+        messageInvalidNnbdDillLibrary,
+        messageStrongWithWeakDillLibrary,
+        messageWeakWithStrongDillLibrary,
         noLength,
         templateFieldNonNullableNotInitializedByConstructorError,
         templateFieldNonNullableWithoutInitializerError,
@@ -108,29 +97,18 @@
         templateInferredPackageUri,
         templateMissingImplementationCause,
         templateSuperclassHasNoDefaultConstructor;
-
 import '../problems.dart' show unhandled;
-
 import '../scope.dart' show AmbiguousBuilder;
-
 import '../source/source_class_builder.dart' show SourceClassBuilder;
-
 import '../source/source_library_builder.dart' show SourceLibraryBuilder;
-
 import '../source/source_loader.dart' show SourceLoader;
-
 import '../target_implementation.dart' show TargetImplementation;
-
 import '../uri_translator.dart' show UriTranslator;
-
 import 'constant_evaluator.dart' as constants
     show EvaluationMode, transformLibraries, transformProcedure;
-
 import 'kernel_constants.dart' show KernelConstantErrorReporter;
-
 import 'metadata_collector.dart' show MetadataCollector;
-
-import 'verifier.dart' show verifyComponent;
+import 'verifier.dart' show verifyComponent, verifyGetStaticType;
 
 class KernelTarget extends TargetImplementation {
   /// The [FileSystem] which should be used to access files.
@@ -274,10 +252,44 @@
     if (dillTarget.isLoaded) {
       LibraryBuilder builder = dillTarget.loader.builders[uri];
       if (builder != null) {
-        if (loader.nnbdMode == NnbdMode.Strong ||
-            loader.nnbdMode == NnbdMode.Agnostic) {
-          if (!builder.isNonNullableByDefault) {
-            loader.registerStrongOptOutLibrary(builder);
+        if (!builder.isNonNullableByDefault &&
+            (loader.nnbdMode == NnbdMode.Strong ||
+                loader.nnbdMode == NnbdMode.Agnostic)) {
+          loader.registerStrongOptOutLibrary(builder);
+        } else if (builder is DillLibraryBuilder) {
+          NonNullableByDefaultCompiledMode libraryMode =
+              builder.library.nonNullableByDefaultCompiledMode;
+          if (libraryMode == NonNullableByDefaultCompiledMode.Invalid) {
+            loader.registerNnbdMismatchLibrary(
+                builder, messageInvalidNnbdDillLibrary);
+          } else {
+            switch (loader.nnbdMode) {
+              case NnbdMode.Weak:
+                if (libraryMode != NonNullableByDefaultCompiledMode.Agnostic &&
+                    libraryMode != NonNullableByDefaultCompiledMode.Weak) {
+                  loader.registerNnbdMismatchLibrary(
+                      builder, messageWeakWithStrongDillLibrary);
+                }
+                break;
+              case NnbdMode.Strong:
+                if (libraryMode != NonNullableByDefaultCompiledMode.Agnostic &&
+                    libraryMode != NonNullableByDefaultCompiledMode.Strong) {
+                  loader.registerNnbdMismatchLibrary(
+                      builder, messageStrongWithWeakDillLibrary);
+                }
+                break;
+              case NnbdMode.Agnostic:
+                if (libraryMode != NonNullableByDefaultCompiledMode.Agnostic) {
+                  if (libraryMode == NonNullableByDefaultCompiledMode.Strong) {
+                    loader.registerNnbdMismatchLibrary(
+                        builder, messageAgnosticWithStrongDillLibrary);
+                  } else {
+                    loader.registerNnbdMismatchLibrary(
+                        builder, messageAgnosticWithWeakDillLibrary);
+                  }
+                }
+                break;
+            }
           }
         }
         return builder;
@@ -328,10 +340,6 @@
       await loader.buildOutlines();
       loader.createTypeInferenceEngine();
       loader.coreLibrary.becomeCoreLibrary();
-      dynamicType.bind(
-          loader.coreLibrary.lookupLocalMember("dynamic", required: true));
-      bottomType
-          .bind(loader.coreLibrary.lookupLocalMember("Never", required: true));
       loader.resolveParts();
       loader.computeLibraryScopes();
       setupTopAndBottomTypes();
@@ -440,7 +448,10 @@
           break;
       }
     } else {
-      compiledMode = NonNullableByDefaultCompiledMode.Disabled;
+      compiledMode = NonNullableByDefaultCompiledMode.Weak;
+    }
+    if (loader.hasInvalidNnbdModeLibrary) {
+      compiledMode = NonNullableByDefaultCompiledMode.Invalid;
     }
 
     Reference mainReference;
@@ -465,11 +476,88 @@
     if (metadataCollector != null) {
       component.addMetadataRepository(metadataCollector.repository);
     }
+    assert(_getLibraryNnbdModeError(component) == null,
+        "Got error: ${_getLibraryNnbdModeError(component)}");
 
     ticker.logMs("Linked component");
     return component;
   }
 
+  String _getLibraryNnbdModeError(Component component) {
+    if (loader.hasInvalidNnbdModeLibrary) {
+      // At least 1 library should be invalid or there should be a mix of strong
+      // and weak. For libraries we've just compiled it will be marked as
+      // invalid, but for libraries loaded from dill they have their original
+      // value (i.e. either strong or weak).
+      bool foundInvalid = false;
+      bool foundStrong = false;
+      bool foundWeak = false;
+      for (Library library in component.libraries) {
+        if (library.nonNullableByDefaultCompiledMode ==
+            NonNullableByDefaultCompiledMode.Invalid) {
+          foundInvalid = true;
+          break;
+        } else if (!foundWeak &&
+            library.nonNullableByDefaultCompiledMode ==
+                NonNullableByDefaultCompiledMode.Weak) {
+          foundWeak = true;
+          if (foundStrong) break;
+        } else if (!foundStrong &&
+            library.nonNullableByDefaultCompiledMode ==
+                NonNullableByDefaultCompiledMode.Strong) {
+          foundStrong = true;
+          if (foundWeak) break;
+        }
+      }
+      if (!foundInvalid && !(foundStrong && foundWeak)) {
+        return "hasInvalidNnbdModeLibrary is true, but no library was invalid "
+            "and there was no weak/strong mix.";
+      }
+      if (component.mode != NonNullableByDefaultCompiledMode.Invalid) {
+        return "Component mode is not invalid as expected";
+      }
+    } else {
+      // No libraries are allowed to be invalid, and should all be compatible
+      // with the component nnbd mode setting.
+      if (component.mode == NonNullableByDefaultCompiledMode.Invalid) {
+        return "Component mode is invalid which was not expected";
+      }
+      if (component.modeRaw == null) {
+        return "Component mode not set at all";
+      }
+      for (Library library in component.libraries) {
+        if (component.mode == NonNullableByDefaultCompiledMode.Strong) {
+          if (library.nonNullableByDefaultCompiledMode !=
+                  NonNullableByDefaultCompiledMode.Strong &&
+              library.nonNullableByDefaultCompiledMode !=
+                  NonNullableByDefaultCompiledMode.Agnostic) {
+            return "Expected library ${library.importUri} to be strong or "
+                "agnostic, but was ${library.nonNullableByDefaultCompiledMode}";
+          }
+        } else if (component.mode == NonNullableByDefaultCompiledMode.Weak) {
+          if (library.nonNullableByDefaultCompiledMode !=
+                  NonNullableByDefaultCompiledMode.Weak &&
+              library.nonNullableByDefaultCompiledMode !=
+                  NonNullableByDefaultCompiledMode.Agnostic) {
+            return "Expected library ${library.importUri} to be weak or "
+                "agnostic, but was ${library.nonNullableByDefaultCompiledMode}";
+          }
+        } else if (component.mode ==
+            NonNullableByDefaultCompiledMode.Agnostic) {
+          if (library.nonNullableByDefaultCompiledMode !=
+              NonNullableByDefaultCompiledMode.Agnostic) {
+            return "Expected library ${library.importUri} to be agnostic, "
+                "but was ${library.nonNullableByDefaultCompiledMode}";
+          }
+        } else {
+          return "Expected component mode to be either strong, "
+              "weak or agnostic but was ${component.mode}";
+        }
+      }
+    }
+    return null;
+  }
+
   void installDefaultSupertypes() {
     Class objectClass = this.objectClass;
     loader.builders.forEach((Uri uri, LibraryBuilder library) {
@@ -752,11 +840,13 @@
   void setupTopAndBottomTypes() {
     objectType
         .bind(loader.coreLibrary.lookupLocalMember("Object", required: true));
-
+    dynamicType
+        .bind(loader.coreLibrary.lookupLocalMember("dynamic", required: true));
     ClassBuilder nullClassBuilder =
         loader.coreLibrary.lookupLocalMember("Null", required: true);
-    nullClassBuilder.isNullClass = true;
-    nullType.bind(nullClassBuilder);
+    nullType.bind(nullClassBuilder..isNullClass = true);
+    bottomType
+        .bind(loader.coreLibrary.lookupLocalMember("Never", required: true));
   }
 
   void computeCoreTypes() {
@@ -1221,14 +1311,16 @@
 
   void verify() {
     // TODO(ahe): How to handle errors.
-    verifyComponent(component);
+    verifyComponent(component,
+        skipPlatform: context.options.verifySkipPlatform);
     ClassHierarchy hierarchy =
         new ClassHierarchy(component, new CoreTypes(component),
             onAmbiguousSupertypes: (Class cls, Supertype a, Supertype b) {
       // An error has already been reported.
     });
     verifyGetStaticType(
-        new TypeEnvironment(loader.coreTypes, hierarchy), component);
+        new TypeEnvironment(loader.coreTypes, hierarchy), component,
+        skipPlatform: context.options.verifySkipPlatform);
     ticker.logMs("Verified component");
   }
 
diff --git a/pkg/front_end/lib/src/fasta/kernel/late_lowering.dart b/pkg/front_end/lib/src/fasta/kernel/late_lowering.dart
index 3458ee9..f1b548e 100644
--- a/pkg/front_end/lib/src/fasta/kernel/late_lowering.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/late_lowering.dart
@@ -126,28 +126,21 @@
 /// which a `LateInitializationError` should be thrown. Late final locals
 /// cannot have writes during initialization since they are not in scope in
 /// their own initializer.
-Statement createGetterWithInitializerWithRecheck(
-    CoreTypes coreTypes,
-    int fileOffset,
-    String name,
-    DartType type,
-    String variableKindName,
-    Expression initializer,
+Statement createGetterWithInitializerWithRecheck(CoreTypes coreTypes,
+    int fileOffset, String name, DartType type, Expression initializer,
     {Expression createVariableRead({bool needsPromotion}),
     Expression createVariableWrite(Expression value),
     Expression createIsSetRead(),
     Expression createIsSetWrite(Expression value),
     IsSetEncoding isSetEncoding}) {
-  Expression exception = new Throw(new ConstructorInvocation(
-      coreTypes.lateInitializationErrorConstructor,
-      new Arguments(<Expression>[
-        new StringLiteral(
-            "$variableKindName '${name}' has been assigned during "
-            "initialization.")
-          ..fileOffset = fileOffset
-      ])
+  Expression exception = new Throw(
+      new ConstructorInvocation(
+          coreTypes
+              .lateInitializationFieldAssignedDuringInitializationConstructor,
+          new Arguments(
+              <Expression>[new StringLiteral(name)..fileOffset = fileOffset])
+            ..fileOffset = fileOffset)
         ..fileOffset = fileOffset)
-    ..fileOffset = fileOffset)
     ..fileOffset = fileOffset;
   VariableDeclaration temp =
       new VariableDeclaration.forValue(initializer, type: type)
@@ -291,21 +284,23 @@
 
 /// Creates the body for the synthesized getter used to encode the lowering
 /// of a late field or local without an initializer.
-Statement createGetterBodyWithoutInitializer(CoreTypes coreTypes,
-    int fileOffset, String name, DartType type, String variableKindName,
+Statement createGetterBodyWithoutInitializer(
+    CoreTypes coreTypes, int fileOffset, String name, DartType type,
     {Expression createVariableRead({bool needsPromotion}),
     Expression createIsSetRead(),
-    IsSetEncoding isSetEncoding}) {
+    IsSetEncoding isSetEncoding,
+    bool forField}) {
+  assert(forField != null);
   assert(isSetEncoding != null);
-  Expression exception = new Throw(new ConstructorInvocation(
-      coreTypes.lateInitializationErrorConstructor,
-      new Arguments(<Expression>[
-        new StringLiteral(
-            "$variableKindName '${name}' has not been initialized.")
-          ..fileOffset = fileOffset
-      ])
+  Expression exception = new Throw(
+      new ConstructorInvocation(
+          forField
+              ? coreTypes.lateInitializationFieldNotInitializedConstructor
+              : coreTypes.lateInitializationLocalNotInitializedConstructor,
+          new Arguments(
+              <Expression>[new StringLiteral(name)..fileOffset = fileOffset])
+            ..fileOffset = fileOffset)
         ..fileOffset = fileOffset)
-    ..fileOffset = fileOffset)
     ..fileOffset = fileOffset;
   switch (isSetEncoding) {
     case IsSetEncoding.useIsSetField:
@@ -425,29 +420,26 @@
 
 /// Creates the body for the synthesized setter used to encode the lowering
 /// of a final late field or local.
-Statement createSetterBodyFinal(
-    CoreTypes coreTypes,
-    int fileOffset,
-    String name,
-    VariableDeclaration parameter,
-    DartType type,
-    String variableKindName,
+Statement createSetterBodyFinal(CoreTypes coreTypes, int fileOffset,
+    String name, VariableDeclaration parameter, DartType type,
     {bool shouldReturnValue,
     Expression createVariableRead(),
     Expression createVariableWrite(Expression value),
     Expression createIsSetRead(),
     Expression createIsSetWrite(Expression value),
-    IsSetEncoding isSetEncoding}) {
+    IsSetEncoding isSetEncoding,
+    bool forField}) {
+  assert(forField != null);
   assert(isSetEncoding != null);
-  Expression exception = new Throw(new ConstructorInvocation(
-      coreTypes.lateInitializationErrorConstructor,
-      new Arguments(<Expression>[
-        new StringLiteral(
-            "${variableKindName} '${name}' has already been initialized.")
-          ..fileOffset = fileOffset
-      ])
+  Expression exception = new Throw(
+      new ConstructorInvocation(
+          forField
+              ? coreTypes.lateInitializationFieldAlreadyInitializedConstructor
+              : coreTypes.lateInitializationLocalAlreadyInitializedConstructor,
+          new Arguments(
+              <Expression>[new StringLiteral(name)..fileOffset = fileOffset])
+            ..fileOffset = fileOffset)
         ..fileOffset = fileOffset)
-    ..fileOffset = fileOffset)
     ..fileOffset = fileOffset;
 
   Statement createReturn(Expression value) {
diff --git a/pkg/front_end/lib/src/fasta/kernel/member_covariance.dart b/pkg/front_end/lib/src/fasta/kernel/member_covariance.dart
new file mode 100644
index 0000000..5d1d77f
--- /dev/null
+++ b/pkg/front_end/lib/src/fasta/kernel/member_covariance.dart
@@ -0,0 +1,434 @@
+// Copyright (c) 2018, 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:math';
+
+import 'package:kernel/ast.dart' hide MapEntry;
+
+/// Class that holds the covariant and generic-covariant-impl information for
+/// a member.
+// TODO(johnniwinther): Cache this in ClassMember.
+// TODO(johnniwinther): Maybe compact initial positional masks into a single
+//  int.
+class Covariance {
+  static const int GenericCovariantImpl = 1;
+  static const int Covariant = 2;
+
+  /// Returns the covariance mask for [parameter].
+  static int covarianceFromParameter(VariableDeclaration parameter) =>
+      (parameter.isCovariant ? Covariant : 0) |
+      (parameter.isGenericCovariantImpl ? GenericCovariantImpl : 0);
+
+  /// Returns the covariance mask for [field].
+  static int covarianceFromField(Field field) =>
+      (field.isCovariant ? Covariant : 0) |
+      (field.isGenericCovariantImpl ? GenericCovariantImpl : 0);
+
+  /// Applies the [covariance] mask to [parameter].
+  static void covarianceToParameter(
+      int covariance, VariableDeclaration parameter) {
+    if ((covariance & Covariant) != 0) {
+      parameter.isCovariant = true;
+    }
+    if ((covariance & GenericCovariantImpl) != 0) {
+      parameter.isGenericCovariantImpl = true;
+    }
+  }
+
+  /// Applies the [covariance] mask to parameter.
+  static void covarianceToField(int covariance, Field field) {
+    if ((covariance & Covariant) != 0) {
+      field.isCovariant = true;
+    }
+    if ((covariance & GenericCovariantImpl) != 0) {
+      field.isGenericCovariantImpl = true;
+    }
+  }
+
+  /// The covariance mask for the positional parameters.
+  ///
+  /// If no positional parameters have covariance, this is `null`.
+  final List<int> _positionalParameters;
+
+  /// The covariance mask for the named parameters with name covariance.
+  ///
+  /// If no named parameters have covariance, this is `null`.
+  final Map<String, int> _namedParameters;
+
+  /// The generic-covariant-impl state for the type parameters.
+  ///
+  /// If no type parameters are generic-covariant-impl, this is `null`.
+  final List<bool> _typeParameters;
+
+  Covariance.internal(
+      this._positionalParameters, this._namedParameters, this._typeParameters) {
+    assert(_positionalParameters == null ||
+        _positionalParameters.any((element) => element != 0));
+    assert(_namedParameters == null ||
+        _namedParameters.values.isNotEmpty &&
+            _namedParameters.values.every((element) => element != 0));
+    assert(
+        _typeParameters == null || _typeParameters.any((element) => element));
+  }
+
+  /// The empty covariance.
+  ///
+  /// This is used for all members that do not use any covariance, regardless
+  /// of parameter structure.
+  const Covariance.empty()
+      : _positionalParameters = null,
+        _namedParameters = null,
+        _typeParameters = null;
+
+  /// Computes the covariance for the setter aspect of [field].
+  ///
+  /// The getter aspect of a field never uses covariance.
+  factory Covariance.fromField(Field field) {
+    int covariance = covarianceFromField(field);
+    if (covariance == 0) {
+      return const Covariance.empty();
+    }
+    return new Covariance.internal(<int>[covariance], null, null);
+  }
+
+  /// Computes the covariance for the [setter].
+  factory Covariance.fromSetter(Procedure setter) {
+    int covariance =
+        covarianceFromParameter(setter.function.positionalParameters.first);
+    if (covariance == 0) {
+      return const Covariance.empty();
+    }
+    return new Covariance.internal(<int>[covariance], null, null);
+  }
+
+  /// Computes the covariance for the [procedure].
+  factory Covariance.fromMethod(Procedure procedure) {
+    FunctionNode function = procedure.function;
+    List<int> positionalParameters;
+    if (function.positionalParameters.isNotEmpty) {
+      for (int index = 0;
+          index < function.positionalParameters.length;
+          index++) {
+        int covariance =
+            covarianceFromParameter(function.positionalParameters[index]);
+        if (covariance != 0) {
+          positionalParameters ??=
+              new List<int>.filled(function.positionalParameters.length, 0);
+          positionalParameters[index] = covariance;
+        }
+      }
+    }
+    Map<String, int> namedParameters;
+    if (function.namedParameters.isNotEmpty) {
+      for (int index = 0; index < function.namedParameters.length; index++) {
+        VariableDeclaration parameter = function.namedParameters[index];
+        int covariance = covarianceFromParameter(parameter);
+        if (covariance != 0) {
+          namedParameters ??= {};
+          namedParameters[parameter.name] = covariance;
+        }
+      }
+    }
+    List<bool> typeParameters;
+    if (function.typeParameters.isNotEmpty) {
+      for (int index = 0; index < function.typeParameters.length; index++) {
+        if (function.typeParameters[index].isGenericCovariantImpl) {
+          typeParameters ??=
+              new List<bool>.filled(function.typeParameters.length, false);
+          typeParameters[index] = true;
+        }
+      }
+    }
+    if (positionalParameters == null &&
+        namedParameters == null &&
+        typeParameters == null) {
+      return const Covariance.empty();
+    }
+    return new Covariance.internal(
+        positionalParameters, namedParameters, typeParameters);
+  }
+
+  /// Computes the covariance for [member].
+  ///
+  /// If [forSetter] is `true`, the covariance is computed for the setter
+  /// aspect of [member]. Otherwise, the covariance for the getter/method aspect
+  /// of [member] is computed.
+  factory Covariance.fromMember(Member member, {bool forSetter}) {
+    assert(forSetter != null);
+    if (member is Procedure) {
+      if (member.kind == ProcedureKind.Getter) {
+        return const Covariance.empty();
+      } else if (member.kind == ProcedureKind.Setter) {
+        return new Covariance.fromSetter(member);
+      } else {
+        return new Covariance.fromMethod(member);
+      }
+    } else if (member is Field) {
+      if (forSetter) {
+        return new Covariance.fromField(member);
+      } else {
+        return const Covariance.empty();
+      }
+    } else {
+      throw new UnsupportedError(
+          "Unexpected member $member (${member.runtimeType})");
+    }
+  }
+
+  /// Returns `true` if this is the empty covariance.
+  bool get isEmpty =>
+      _positionalParameters == null &&
+      _namedParameters == null &&
+      _typeParameters == null;
+
+  /// Returns the covariance mask for the [index]th positional parameter.
+  int getPositionalVariance(int index) =>
+      _positionalParameters != null && index < _positionalParameters.length
+          ? _positionalParameters[index]
+          : 0;
+
+  /// Returns the covariance mask for the named parameter with the [name].
+  int getNamedVariance(String name) =>
+      _namedParameters != null ? (_namedParameters[name] ?? 0) : 0;
+
+  /// Returns `true` if the [index]th type parameter is generic-covariant-impl.
+  bool isTypeParameterGenericCovariantImpl(int index) =>
+      _typeParameters != null && index < _typeParameters.length
+          ? _typeParameters[index]
+          : false;
+
+  /// Returns the merge of this covariance with [other] in which parameters are
+  /// covariant if they are covariant in either [this] or [other].
+  Covariance merge(Covariance other) {
+    if (identical(this, other)) return this;
+    List<int> positionalParameters;
+    if (_positionalParameters == null) {
+      positionalParameters = other._positionalParameters;
+    } else if (other._positionalParameters == null) {
+      positionalParameters = _positionalParameters;
+    } else {
+      positionalParameters = new List<int>(max(
+          _positionalParameters.length, other._positionalParameters.length));
+      for (int index = 0; index < positionalParameters.length; index++) {
+        positionalParameters[index] =
+            getPositionalVariance(index) | other.getPositionalVariance(index);
+      }
+    }
+    Map<String, int> namedParameters;
+    if (_namedParameters == null) {
+      namedParameters = other._namedParameters;
+    } else if (other._namedParameters == null) {
+      namedParameters = _namedParameters;
+    } else {
+      namedParameters = {};
+      Set<String> names = {
+        ..._namedParameters.keys,
+        ...other._namedParameters.keys
+      };
+      for (String name in names) {
+        namedParameters[name] =
+            getNamedVariance(name) | other.getNamedVariance(name);
+      }
+    }
+    List<bool> typeParameters;
+    if (_typeParameters == null) {
+      typeParameters = other._typeParameters;
+    } else if (other._typeParameters == null) {
+      typeParameters = _typeParameters;
+    } else {
+      typeParameters = new List<bool>(
+          max(_typeParameters.length, other._typeParameters.length));
+      for (int index = 0; index < typeParameters.length; index++) {
+        typeParameters[index] = isTypeParameterGenericCovariantImpl(index) ||
+            other.isTypeParameterGenericCovariantImpl(index);
+      }
+    }
+    if (positionalParameters == null &&
+        namedParameters == null &&
+        typeParameters == null) {
+      return const Covariance.empty();
+    }
+    return new Covariance.internal(
+        positionalParameters, namedParameters, typeParameters);
+  }
+
+  /// Update [member] to have the covariant flags set with the covariance in
+  /// [this].
+  ///
+  /// No covariance bits are removed from [member] during this process.
+  void applyCovariance(Member member) {
+    if (isEmpty) return;
+    if (member is Procedure) {
+      FunctionNode function = member.function;
+      if (_positionalParameters != null) {
+        for (int index = 0; index < _positionalParameters.length; index++) {
+          if (index < function.positionalParameters.length) {
+            covarianceToParameter(_positionalParameters[index],
+                function.positionalParameters[index]);
+          }
+        }
+      }
+      if (_namedParameters != null) {
+        for (VariableDeclaration parameter in function.namedParameters) {
+          covarianceToParameter(getNamedVariance(parameter.name), parameter);
+        }
+      }
+      if (_typeParameters != null) {
+        for (int index = 0; index < _typeParameters.length; index++) {
+          if (index < function.typeParameters.length) {
+            if (_typeParameters[index]) {
+              function.typeParameters[index].isGenericCovariantImpl = true;
+            }
+          }
+        }
+      }
+    } else if (member is Field) {
+      if (_positionalParameters != null) {
+        covarianceToField(getPositionalVariance(0), member);
+      }
+    } else {
+      throw new UnsupportedError(
+          "Unexpected member $member (${member.runtimeType})");
+    }
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    if (_positionalParameters != null) {
+      for (int covariance in _positionalParameters) {
+        hash += covariance.hashCode * 17;
+      }
+    }
+    if (_namedParameters != null) {
+      for (String name in _namedParameters.keys) {
+        hash += name.hashCode * 19 + _namedParameters[name].hashCode * 23;
+      }
+    }
+    if (_typeParameters != null) {
+      for (bool covariance in _typeParameters) {
+        if (covariance) {
+          hash += covariance.hashCode * 31;
+        }
+      }
+    }
+    return hash;
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (identical(this, other)) return true;
+    if (other is Covariance) {
+      if (_positionalParameters != other._positionalParameters) {
+        if (_positionalParameters == null ||
+            other._positionalParameters == null) {
+          return false;
+        }
+        int positionalParameterCount = max(
+            _positionalParameters.length, other._positionalParameters.length);
+        for (int i = 0; i < positionalParameterCount; i++) {
+          if (getPositionalVariance(i) != other.getPositionalVariance(i)) {
+            return false;
+          }
+        }
+      }
+      if (_namedParameters != other._namedParameters) {
+        if (_namedParameters == null || other._namedParameters == null) {
+          return false;
+        }
+        Set<String> names = {
+          ..._namedParameters.keys,
+          ...other._namedParameters.keys
+        };
+        for (String name in names) {
+          if (getNamedVariance(name) != other.getNamedVariance(name)) {
+            return false;
+          }
+        }
+      }
+      if (_typeParameters != other._typeParameters) {
+        if (_typeParameters == null || other._typeParameters == null) {
+          return false;
+        }
+        int typeParameterCount =
+            max(_typeParameters.length, other._typeParameters.length);
+        for (int i = 0; i < typeParameterCount; i++) {
+          if (isTypeParameterGenericCovariantImpl(i) !=
+              other.isTypeParameterGenericCovariantImpl(i)) {
+            return false;
+          }
+        }
+      }
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  String toString() {
+    StringBuffer sb = new StringBuffer();
+    if (isEmpty) {
+      sb.write('Covariance.empty()');
+    } else {
+      sb.write('Covariance(');
+      String comma = '';
+      if (_positionalParameters != null) {
+        for (int index = 0; index < _positionalParameters.length; index++) {
+          if (_positionalParameters[index] != 0) {
+            sb.write(comma);
+            sb.write('$index:');
+            switch (_positionalParameters[index]) {
+              case GenericCovariantImpl:
+                sb.write('GenericCovariantImpl');
+                break;
+              case Covariant:
+                sb.write('Covariant');
+                break;
+              default:
+                sb.write('GenericCovariantImpl+Covariant');
+                break;
+            }
+            comma = ',';
+          }
+        }
+      }
+      if (_namedParameters != null) {
+        for (String name in _namedParameters.keys) {
+          int covariance = _namedParameters[name];
+          if (covariance != 0) {
+            sb.write(comma);
+            sb.write('$name:');
+
+            switch (covariance) {
+              case GenericCovariantImpl:
+                sb.write('GenericCovariantImpl');
+                break;
+              case Covariant:
+                sb.write('Covariant');
+                break;
+              default:
+                sb.write('GenericCovariantImpl+Covariant');
+                break;
+            }
+            comma = ',';
+          }
+        }
+      }
+      if (_typeParameters != null) {
+        sb.write(comma);
+        sb.write('types:');
+        comma = '';
+        for (int index = 0; index < _typeParameters.length; index++) {
+          if (_typeParameters[index]) {
+            sb.write(comma);
+            sb.write('$index');
+            comma = ',';
+          }
+        }
+      }
+      sb.write(')');
+    }
+    return sb.toString();
+  }
+}
diff --git a/pkg/front_end/lib/src/fasta/kernel/transform_collections.dart b/pkg/front_end/lib/src/fasta/kernel/transform_collections.dart
index 2f0811c..0d758a1 100644
--- a/pkg/front_end/lib/src/fasta/kernel/transform_collections.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/transform_collections.dart
@@ -754,7 +754,8 @@
         "No fileOffset on ${argument}.");
     return new MethodInvocation(receiver, new Name('add'),
         new Arguments([argument]), isSet ? setAdd : listAdd)
-      ..fileOffset = argument.fileOffset;
+      ..fileOffset = argument.fileOffset
+      ..isInvariant = true;
   }
 
   Expression _createEqualsNull(Expression expression, {bool notEquals: false}) {
@@ -778,7 +779,8 @@
     assert(fileOffset != TreeNode.noOffset);
     return new MethodInvocation(
         receiver, new Name('[]='), new Arguments([key, value]), mapPut)
-      ..fileOffset = fileOffset;
+      ..fileOffset = fileOffset
+      ..isInvariant = true;
   }
 
   AsExpression _createImplicitAs(
diff --git a/pkg/front_end/lib/src/fasta/kernel/transform_set_literals.dart b/pkg/front_end/lib/src/fasta/kernel/transform_set_literals.dart
index 7b3a8de..67f0898 100644
--- a/pkg/front_end/lib/src/fasta/kernel/transform_set_literals.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/transform_set_literals.dart
@@ -9,14 +9,17 @@
 import 'package:kernel/ast.dart'
     show
         Arguments,
+        Block,
+        BlockExpression,
         Expression,
+        ExpressionStatement,
         InterfaceType,
-        Let,
         Library,
         MethodInvocation,
         Name,
         Procedure,
         SetLiteral,
+        Statement,
         StaticInvocation,
         TreeNode,
         VariableDeclaration,
@@ -60,26 +63,32 @@
   TreeNode visitSetLiteral(SetLiteral node) {
     if (node.isConst) return node;
 
-    // Outermost declaration of let chain: Set<E> setVar = new Set<E>();
+    // Create the set: Set<E> setVar = new Set<E>();
     VariableDeclaration setVar = new VariableDeclaration.forValue(
         new StaticInvocation(
             setFactory, new Arguments([], types: [node.typeArgument])),
         type: new InterfaceType(coreTypes.setClass, _currentLibrary.nonNullable,
             [node.typeArgument]));
-    // Innermost body of let chain: setVar
-    Expression setExp = new VariableGet(setVar);
-    for (int i = node.expressions.length - 1; i >= 0; i--) {
-      // let _ = setVar.add(expression) in rest
+
+    // Now create a list of all statements needed.
+    List<Statement> statements = [setVar];
+    for (int i = 0; i < node.expressions.length; i++) {
       Expression entry = node.expressions[i].accept<TreeNode>(this);
-      setExp = new Let(
-          new VariableDeclaration.forValue(new MethodInvocation(
-              new VariableGet(setVar),
-              new Name("add"),
-              new Arguments([entry]),
-              addMethod)),
-          setExp);
+      MethodInvocation methodInvocation = new MethodInvocation(
+          new VariableGet(setVar),
+          new Name("add"),
+          new Arguments([entry]),
+          addMethod)
+        ..fileOffset = entry.fileOffset
+        ..isInvariant = true;
+      statements.add(new ExpressionStatement(methodInvocation)
+        ..fileOffset = methodInvocation.fileOffset);
     }
-    return new Let(setVar, setExp);
+
+    // Finally, return a BlockExpression with the statements, having the value
+    // of the (now created) set.
+    return new BlockExpression(new Block(statements), new VariableGet(setVar))
+      ..fileOffset = node.fileOffset;
   }
 
   void enterLibrary(Library library) {
diff --git a/pkg/front_end/lib/src/fasta/kernel/type_algorithms.dart b/pkg/front_end/lib/src/fasta/kernel/type_algorithms.dart
index 9143dcb..1fd20cd 100644
--- a/pkg/front_end/lib/src/fasta/kernel/type_algorithms.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/type_algorithms.dart
@@ -14,6 +14,7 @@
         InvalidType,
         NamedType,
         NeverType,
+        NullType,
         TypeParameter,
         TypeParameterType,
         TypedefType,
@@ -1021,6 +1022,8 @@
 
   bool visitNeverType(NeverType node) => false;
 
+  bool visitNullType(NullType node) => false;
+
   bool visitInterfaceType(InterfaceType node) {
     return anyTypeVariables(node.typeArguments);
   }
diff --git a/pkg/front_end/lib/src/fasta/kernel/type_builder_computer.dart b/pkg/front_end/lib/src/fasta/kernel/type_builder_computer.dart
index 28ac4f2..a02abb4 100644
--- a/pkg/front_end/lib/src/fasta/kernel/type_builder_computer.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/type_builder_computer.dart
@@ -21,6 +21,7 @@
         Library,
         NamedType,
         NeverType,
+        NullType,
         TreeNode,
         TypeParameter,
         TypeParameterType,
@@ -36,6 +37,7 @@
 import '../builder/library_builder.dart';
 import '../builder/named_type_builder.dart';
 import '../builder/never_type_declaration_builder.dart';
+import '../builder/null_type_declaration_builder.dart';
 import '../builder/nullability_builder.dart';
 import '../builder/type_builder.dart';
 import '../builder/type_variable_builder.dart';
@@ -101,6 +103,17 @@
   }
 
   @override
+  TypeBuilder visitNullType(NullType node) {
+    return new NamedTypeBuilder(
+        "Null",
+        new NullabilityBuilder.nullable(),
+        /* arguments = */ null,
+        /* fileUri = */ null,
+        /* charOffset = */ null)
+      ..bind(new NullTypeDeclarationBuilder(node, loader.coreLibrary, -1));
+  }
+
+  @override
   TypeBuilder visitInterfaceType(InterfaceType node) {
     ClassBuilder cls =
         loader.computeClassBuilderFromTargetClass(node.classNode);
diff --git a/pkg/front_end/lib/src/fasta/kernel/type_labeler.dart b/pkg/front_end/lib/src/fasta/kernel/type_labeler.dart
index 06556d5..76a901f 100644
--- a/pkg/front_end/lib/src/fasta/kernel/type_labeler.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/type_labeler.dart
@@ -26,6 +26,7 @@
         MapConstant,
         NeverType,
         NullConstant,
+        NullType,
         Nullability,
         PartialInstantiationConstant,
         Procedure,
@@ -158,6 +159,10 @@
     addNullability(node.declaredNullability);
   }
 
+  void visitNullType(NullType node) {
+    result.add("Null");
+  }
+
   void visitDynamicType(DynamicType node) {
     result.add("dynamic");
   }
@@ -255,12 +260,6 @@
       }
       result.add(">");
     }
-    if (classNode.name == 'Null' &&
-        classNode.enclosingLibrary.importUri.scheme == 'dart' &&
-        classNode.enclosingLibrary.importUri.path == 'core') {
-      // Don't print nullability on `Null`.
-      return;
-    }
     addNullability(node.nullability);
   }
 
@@ -309,7 +308,7 @@
       if (field.isStatic) continue;
       if (!first) result.add(", ");
       result.add("${field.name}: ");
-      node.fieldValues[field.reference].accept(this);
+      node.fieldValues[field.getterReference].accept(this);
       first = false;
     }
     result.add("}");
diff --git a/pkg/front_end/lib/src/fasta/kernel/utils.dart b/pkg/front_end/lib/src/fasta/kernel/utils.dart
index ee062fb..1eaf2b3 100644
--- a/pkg/front_end/lib/src/fasta/kernel/utils.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/utils.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:async' show Future;
-
 import 'dart:io' show BytesBuilder, File, IOSink;
 
 import 'dart:typed_data' show Uint8List;
@@ -120,7 +118,10 @@
   }
 
   // TODO(vegorov) find a way to preserve metadata.
-  return new Component(libraries: [fakeLibrary]);
+  Component component = new Component(libraries: [fakeLibrary]);
+  component.setMainMethodAndMode(
+      null, false, fakeLibrary.nonNullableByDefaultCompiledMode);
+  return component;
 }
 
 List<int> serializeProcedure(Procedure procedure) {
diff --git a/pkg/front_end/lib/src/fasta/kernel/verifier.dart b/pkg/front_end/lib/src/fasta/kernel/verifier.dart
index 3f0877b..68fdfc8 100644
--- a/pkg/front_end/lib/src/fasta/kernel/verifier.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/verifier.dart
@@ -12,7 +12,10 @@
 
 import 'package:kernel/transformations/flags.dart' show TransformerFlag;
 
-import 'package:kernel/verifier.dart' show VerifyingVisitor;
+import 'package:kernel/type_environment.dart' show TypeEnvironment;
+
+import 'package:kernel/verifier.dart'
+    show VerifyGetStaticType, VerifyingVisitor;
 
 import '../compiler_context.dart' show CompilerContext;
 
@@ -253,15 +256,7 @@
     exitTreeNode(node);
   }
 
-  bool isNullType(DartType node) {
-    if (node is InterfaceType) {
-      Uri importUri = node.classNode.enclosingLibrary.importUri;
-      return node.classNode.name == "Null" &&
-          importUri.scheme == "dart" &&
-          importUri.path == "core";
-    }
-    return false;
-  }
+  bool isNullType(DartType node) => node is NullType;
 
   bool isObjectClass(Class c) {
     return c.name == "Object" &&
@@ -404,3 +399,23 @@
     exitTreeNode(node);
   }
 }
+
+void verifyGetStaticType(TypeEnvironment env, Component component,
+    {bool skipPlatform: false}) {
+  component.accept(new FastaVerifyGetStaticType(env, skipPlatform));
+}
+
+class FastaVerifyGetStaticType extends VerifyGetStaticType {
+  final bool skipPlatform;
+
+  FastaVerifyGetStaticType(TypeEnvironment env, this.skipPlatform) : super(env);
+
+  @override
+  visitLibrary(Library node) {
+    if (skipPlatform && node.importUri.scheme == 'dart') {
+      return;
+    }
+
+    super.visitLibrary(node);
+  }
+}
diff --git a/pkg/front_end/lib/src/fasta/loader.dart b/pkg/front_end/lib/src/fasta/loader.dart
index 35c5007..cfdb636 100644
--- a/pkg/front_end/lib/src/fasta/loader.dart
+++ b/pkg/front_end/lib/src/fasta/loader.dart
@@ -4,8 +4,6 @@
 
 library fasta.loader;
 
-import 'dart:async' show Future;
-
 import 'dart:collection' show Queue;
 
 import 'package:_fe_analyzer_shared/src/messages/severity.dart' show Severity;
@@ -282,11 +280,13 @@
       {bool wasHandled: false,
       List<LocatedMessage> context,
       Severity severity,
-      bool problemOnLibrary: false}) {
+      bool problemOnLibrary: false,
+      List<Uri> involvedFiles}) {
     return addMessage(message, charOffset, length, fileUri, severity,
         wasHandled: wasHandled,
         context: context,
-        problemOnLibrary: problemOnLibrary);
+        problemOnLibrary: problemOnLibrary,
+        involvedFiles: involvedFiles);
   }
 
   /// All messages reported by the compiler (errors, warnings, etc.) are routed
@@ -304,7 +304,8 @@
       Uri fileUri, Severity severity,
       {bool wasHandled: false,
       List<LocatedMessage> context,
-      bool problemOnLibrary: false}) {
+      bool problemOnLibrary: false,
+      List<Uri> involvedFiles}) {
     severity = target.fixSeverity(severity, message, fileUri);
     if (severity == Severity.ignored) return null;
     String trace = """
@@ -323,13 +324,14 @@
     }
     target.context.report(
         message.withLocation(fileUri, charOffset, length), severity,
-        context: context);
+        context: context, involvedFiles: involvedFiles);
     if (severity == Severity.error) {
       (wasHandled ? handledErrors : unhandledErrors)
           .add(message.withLocation(fileUri, charOffset, length));
     }
     FormattedMessage formattedMessage = target.createFormattedMessage(
-        message, charOffset, length, fileUri, context, severity);
+        message, charOffset, length, fileUri, context, severity,
+        involvedFiles: involvedFiles);
     if (!problemOnLibrary) {
       allComponentProblems.add(formattedMessage);
     }
diff --git a/pkg/front_end/lib/src/fasta/scope.dart b/pkg/front_end/lib/src/fasta/scope.dart
index c222a16..709e438 100644
--- a/pkg/front_end/lib/src/fasta/scope.dart
+++ b/pkg/front_end/lib/src/fasta/scope.dart
@@ -152,16 +152,107 @@
   /// from name to new (replacement) builder.
   void patchUpScope(Map<LibraryBuilder, Map<String, Builder>> replacementMap,
       Map<LibraryBuilder, Map<String, Builder>> replacementMapSetters) {
-    _local.forEach((key, value) {
-      if (replacementMap.containsKey(value.parent)) {
-        _local[key] = replacementMap[value.parent][key];
+    // In the following we refer to non-setters as 'getters' for brevity.
+    //
+    // We have to replace all getters and setters in [_locals] and [_setters]
+    // with the corresponding getters and setters in [replacementMap]
+    // and [replacementMapSetters].
+    //
+    // Since field builders can be replaced by getter and setter builders and
+    // vice versa when going from source to dill builder and back, we might not
+    // have a 1-to-1 relationship between the existing and replacing builders.
+    //
+    // For this reason we start by collecting the names of all getters/setters
+    // that need (some) replacement. Afterwards we go through these names
+    // handling both getters and setters at the same time.
+    Set<String> replacedNames = {};
+    _local.forEach((String name, Builder builder) {
+      if (replacementMap.containsKey(builder.parent)) {
+        replacedNames.add(name);
       }
     });
-    _setters.forEach((key, value) {
-      if (replacementMapSetters.containsKey(value.parent)) {
-        _setters[key] = replacementMapSetters[value.parent][key];
+    _setters.forEach((String name, Builder builder) {
+      if (replacementMapSetters.containsKey(builder.parent)) {
+        replacedNames.add(name);
       }
     });
+    if (replacedNames.isNotEmpty) {
+      for (String name in replacedNames) {
+        // We start be collecting the relation between an existing getter/setter
+        // and the getter/setter that will replace it. This information is used
+        // below to handle all the different cases that can occur.
+        Builder existingGetter = _local[name];
+        LibraryBuilder replacementLibraryBuilderFromGetter;
+        Builder replacementGetterFromGetter;
+        Builder replacementSetterFromGetter;
+        if (existingGetter != null &&
+            replacementMap.containsKey(existingGetter.parent)) {
+          replacementLibraryBuilderFromGetter = existingGetter.parent;
+          replacementGetterFromGetter =
+              replacementMap[replacementLibraryBuilderFromGetter][name];
+          replacementSetterFromGetter =
+              replacementMapSetters[replacementLibraryBuilderFromGetter][name];
+        }
+        Builder existingSetter = _setters[name];
+        LibraryBuilder replacementLibraryBuilderFromSetter;
+        Builder replacementGetterFromSetter;
+        Builder replacementSetterFromSetter;
+        if (existingSetter != null &&
+            replacementMap.containsKey(existingSetter.parent)) {
+          replacementLibraryBuilderFromSetter = existingSetter.parent;
+          replacementGetterFromSetter =
+              replacementMap[replacementLibraryBuilderFromSetter][name];
+          replacementSetterFromSetter =
+              replacementMapSetters[replacementLibraryBuilderFromSetter][name];
+        }
+
+        if (existingGetter == null) {
+          // No existing getter.
+          if (replacementGetterFromSetter != null) {
+            // We might have had one implicitly from the setter. Use it here,
+            // if so. (This is currently not possible, but added to match the
+            // case for setters below.)
+            _local[name] = replacementGetterFromSetter;
+          }
+        } else if (existingGetter.parent ==
+            replacementLibraryBuilderFromGetter) {
+          // The existing getter should be replaced.
+          if (replacementGetterFromGetter != null) {
+            // With a new getter.
+            _local[name] = replacementGetterFromGetter;
+          } else {
+            // With `null`, i.e. removed. This means that the getter is
+            // implicitly available through the setter. (This is currently not
+            // possible, but handled here to match the case for setters below).
+            _local.remove(name);
+          }
+        } else {
+          // Leave the getter in - it wasn't replaced.
+        }
+        if (existingSetter == null) {
+          // No existing setter.
+          if (replacementSetterFromGetter != null) {
+            // We might have had one implicitly from the getter. Use it here,
+            // if so.
+            _setters[name] = replacementSetterFromGetter;
+          }
+        } else if (existingSetter.parent ==
+            replacementLibraryBuilderFromSetter) {
+          // The existing setter should be replaced.
+          if (replacementSetterFromSetter != null) {
+            // With a new setter.
+            _setters[name] = replacementSetterFromSetter;
+          } else {
+            // With `null`, i.e. removed. This means that the setter is
+            // implicitly available through the getter. This happens when the
+            // getter is a field builder for an assignable field.
+            _setters.remove(name);
+          }
+        } else {
+          // Leave the setter in - it wasn't replaced.
+        }
+      }
+    }
     if (_extensions != null) {
       bool needsPatching = false;
       for (ExtensionBuilder extensionBuilder in _extensions) {
@@ -671,6 +762,9 @@
   @override
   Member get invokeTarget => null;
 
+  @override
+  Iterable<Member> get exportedMembers => const [];
+
   bool get isNative => false;
 
   @override
diff --git a/pkg/front_end/lib/src/fasta/source/outline_builder.dart b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
index 6a9bacf..471859f 100644
--- a/pkg/front_end/lib/src/fasta/source/outline_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
@@ -862,7 +862,8 @@
         endToken.charOffset,
         nativeMethodName,
         asyncModifier,
-        isTopLevel: true);
+        isTopLevel: true,
+        isExtensionInstanceMember: false);
     nativeMethodName = null;
   }
 
@@ -950,42 +951,42 @@
   @override
   void endClassMethod(Token getOrSet, Token beginToken, Token beginParam,
       Token beginInitializers, Token endToken) {
-    _endClassMethod(
-        getOrSet, beginToken, beginParam, beginInitializers, endToken, false);
+    _endClassMethod(getOrSet, beginToken, beginParam, beginInitializers,
+        endToken, _MethodKind.classMethod);
   }
 
   void endClassConstructor(Token getOrSet, Token beginToken, Token beginParam,
       Token beginInitializers, Token endToken) {
-    _endClassMethod(
-        getOrSet, beginToken, beginParam, beginInitializers, endToken, true);
+    _endClassMethod(getOrSet, beginToken, beginParam, beginInitializers,
+        endToken, _MethodKind.classConstructor);
   }
 
   void endMixinMethod(Token getOrSet, Token beginToken, Token beginParam,
       Token beginInitializers, Token endToken) {
-    _endClassMethod(
-        getOrSet, beginToken, beginParam, beginInitializers, endToken, false);
+    _endClassMethod(getOrSet, beginToken, beginParam, beginInitializers,
+        endToken, _MethodKind.mixinMethod);
   }
 
   void endExtensionMethod(Token getOrSet, Token beginToken, Token beginParam,
       Token beginInitializers, Token endToken) {
-    _endClassMethod(
-        getOrSet, beginToken, beginParam, beginInitializers, endToken, false);
+    _endClassMethod(getOrSet, beginToken, beginParam, beginInitializers,
+        endToken, _MethodKind.extensionMethod);
   }
 
   void endMixinConstructor(Token getOrSet, Token beginToken, Token beginParam,
       Token beginInitializers, Token endToken) {
-    _endClassMethod(
-        getOrSet, beginToken, beginParam, beginInitializers, endToken, true);
+    _endClassMethod(getOrSet, beginToken, beginParam, beginInitializers,
+        endToken, _MethodKind.mixinConstructor);
   }
 
   void endExtensionConstructor(Token getOrSet, Token beginToken,
       Token beginParam, Token beginInitializers, Token endToken) {
-    _endClassMethod(
-        getOrSet, beginToken, beginParam, beginInitializers, endToken, true);
+    _endClassMethod(getOrSet, beginToken, beginParam, beginInitializers,
+        endToken, _MethodKind.extensionConstructor);
   }
 
   void _endClassMethod(Token getOrSet, Token beginToken, Token beginParam,
-      Token beginInitializers, Token endToken, bool isConstructor) {
+      Token beginInitializers, Token endToken, _MethodKind methodKind) {
     assert(checkState(beginToken, [ValueKinds.MethodBody]));
     debugEvent("Method");
     MethodBody bodyKind = pop();
@@ -1113,12 +1114,23 @@
       return;
     }
 
-    String constructorName = isConstructor
-        ? (libraryBuilder.computeAndValidateConstructorName(name, charOffset) ??
-            name)
-        : null;
+    String constructorName;
+    switch (methodKind) {
+      case _MethodKind.classConstructor:
+      case _MethodKind.mixinConstructor:
+      case _MethodKind.extensionConstructor:
+        constructorName = libraryBuilder.computeAndValidateConstructorName(
+                name, charOffset) ??
+            name;
+        break;
+      case _MethodKind.classMethod:
+      case _MethodKind.mixinMethod:
+      case _MethodKind.extensionMethod:
+        break;
+    }
+    bool isStatic = (modifiers & staticMask) != 0;
     if (constructorName == null &&
-        (modifiers & staticMask) == 0 &&
+        !isStatic &&
         libraryBuilder.currentTypeParameterScopeBuilder.kind ==
             TypeParameterScopeKind.extensionDeclaration) {
       TypeParameterScopeBuilder extension =
@@ -1216,7 +1228,9 @@
           endToken.charOffset,
           nativeMethodName,
           asyncModifier,
-          isTopLevel: false);
+          isTopLevel: false,
+          isExtensionInstanceMember:
+              methodKind == _MethodKind.extensionMethod && !isStatic);
     }
     nativeMethodName = null;
     inConstructor = false;
@@ -2184,3 +2198,12 @@
     // printEvent('OutlineBuilder: $name');
   }
 }
+
+enum _MethodKind {
+  classConstructor,
+  classMethod,
+  mixinConstructor,
+  mixinMethod,
+  extensionConstructor,
+  extensionMethod,
+}
diff --git a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
index 9dbff26..31186d8 100644
--- a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
@@ -4,16 +4,14 @@
 
 library fasta.source_class_builder;
 
+import 'package:front_end/src/fasta/kernel/combined_member_signature.dart';
 import 'package:kernel/ast.dart' hide MapEntry;
 import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
-import 'package:kernel/clone.dart' show CloneProcedureWithoutBody;
 import 'package:kernel/reference_from_index.dart' show IndexedClass;
 import 'package:kernel/src/bounds_checks.dart';
 import 'package:kernel/src/legacy_erasure.dart';
 import 'package:kernel/src/types.dart' show Types;
 import 'package:kernel/type_algebra.dart' show Substitution;
-import 'package:kernel/type_algebra.dart' as type_algebra
-    show getSubstitutionMap;
 import 'package:kernel/type_environment.dart';
 
 import '../builder/builder.dart';
@@ -34,7 +32,7 @@
 import '../builder/type_declaration_builder.dart';
 import '../builder/type_variable_builder.dart';
 
-import '../dill/dill_member_builder.dart' show DillMemberBuilder;
+import '../dill/dill_member_builder.dart';
 
 import '../fasta_codes.dart';
 
@@ -149,7 +147,18 @@
               (Member member, BuiltMemberKind memberKind) {
             member.parent = cls;
             if (!memberBuilder.isPatch && !memberBuilder.isDuplicate) {
-              cls.addMember(member);
+              if (member is Procedure) {
+                cls.addProcedure(member);
+              } else if (member is Field) {
+                cls.addField(member);
+              } else if (member is Constructor) {
+                cls.addConstructor(member);
+              } else if (member is RedirectingFactoryConstructor) {
+                cls.addRedirectingFactoryConstructor(member);
+              } else {
+                unhandled("${member.runtimeType}", "getMember",
+                    member.fileOffset, member.fileUri);
+              }
             }
           });
         } else {
@@ -420,7 +429,7 @@
     Library library = libraryBuilder.library;
     final DartType bottomType = library.isNonNullableByDefault
         ? const NeverType(Nullability.nonNullable)
-        : typeEnvironment.nullType;
+        : const NullType();
 
     Set<TypeArgumentIssue> issues = {};
     issues.addAll(findTypeArgumentIssues(
@@ -519,7 +528,7 @@
             builder.procedure, typeEnvironment, cls.typeParameters);
         library.checkTypesInProcedureBuilder(builder, typeEnvironment);
       } else {
-        assert(builder is DillMemberBuilder && builder.name == redirectingName,
+        assert(builder is DillFieldBuilder && builder.name == redirectingName,
             "Unexpected member: $builder.");
       }
     });
@@ -535,7 +544,7 @@
       } else {
         assert(
             // This is a synthesized constructor.
-            builder is DillMemberBuilder && builder.member is Constructor,
+            builder is DillConstructorBuilder && builder.member is Constructor,
             "Unexpected constructor: $builder.");
       }
     }, includeInjectedConstructors: true);
@@ -547,7 +556,7 @@
     constructorScopeBuilder.addMember(name, constructorBuilder);
     // Synthetic constructors are created after the component has been built
     // so we need to add the constructor to the class.
-    cls.addMember(constructorBuilder.member);
+    cls.addConstructor(constructorBuilder.member);
     if (constructorBuilder.isConst) {
       cls.hasConstConstructor = true;
     }
@@ -634,103 +643,12 @@
     return charOffset.compareTo(other.charOffset);
   }
 
-  void addNoSuchMethodForwarderForProcedure(Member noSuchMethod,
-      KernelTarget target, Procedure procedure, ClassHierarchy hierarchy) {
-    Procedure referenceFrom;
-    if (referencesFromIndexed != null) {
-      if (procedure.isSetter) {
-        referenceFrom =
-            referencesFromIndexed.lookupProcedureSetter(procedure.name.text);
-      } else {
-        referenceFrom =
-            referencesFromIndexed.lookupProcedureNotSetter(procedure.name.text);
-      }
-    }
-
-    CloneProcedureWithoutBody cloner = new CloneProcedureWithoutBody(
-        typeSubstitution: type_algebra.getSubstitutionMap(
-            hierarchy.getClassAsInstanceOf(cls, procedure.enclosingClass)),
-        cloneAnnotations: false);
-    Procedure cloned = cloner.cloneProcedure(procedure, referenceFrom)
-      ..isExternal = false;
-    transformProcedureToNoSuchMethodForwarder(noSuchMethod, target, cloned);
-    cls.procedures.add(cloned);
-    cloned.parent = cls;
-
-    library.forwardersOrigins.add(cloned);
-    library.forwardersOrigins.add(procedure);
-  }
-
-  void addNoSuchMethodForwarderGetterForField(
-      Field field, Member noSuchMethod, KernelTarget target) {
-    ClassHierarchy hierarchy = target.loader.hierarchy;
-    Substitution substitution = Substitution.fromSupertype(
-        hierarchy.getClassAsInstanceOf(cls, field.enclosingClass));
-
-    Procedure referenceFrom;
-    if (referencesFromIndexed != null) {
-      referenceFrom =
-          referencesFromIndexed.lookupProcedureNotSetter(field.name.text);
-    }
-    Procedure getter = new Procedure(
-        field.name,
-        ProcedureKind.Getter,
-        new FunctionNode(null,
-            typeParameters: <TypeParameter>[],
-            positionalParameters: <VariableDeclaration>[],
-            namedParameters: <VariableDeclaration>[],
-            requiredParameterCount: 0,
-            returnType: substitution.substituteType(field.type)),
-        fileUri: field.fileUri,
-        reference: referenceFrom?.reference)
-      ..fileOffset = field.fileOffset
-      ..isNonNullableByDefault = cls.enclosingLibrary.isNonNullableByDefault;
-    transformProcedureToNoSuchMethodForwarder(noSuchMethod, target, getter);
-    cls.procedures.add(getter);
-    getter.parent = cls;
-  }
-
-  void addNoSuchMethodForwarderSetterForField(
-      Field field, Member noSuchMethod, KernelTarget target) {
-    ClassHierarchy hierarchy = target.loader.hierarchy;
-    Substitution substitution = Substitution.fromSupertype(
-        hierarchy.getClassAsInstanceOf(cls, field.enclosingClass));
-
-    Procedure referenceFrom;
-    if (referencesFromIndexed != null) {
-      referenceFrom =
-          referencesFromIndexed.lookupProcedureSetter(field.name.text);
-    }
-
-    Procedure setter = new Procedure(
-        field.name,
-        ProcedureKind.Setter,
-        new FunctionNode(null,
-            typeParameters: <TypeParameter>[],
-            positionalParameters: <VariableDeclaration>[
-              new VariableDeclaration("value",
-                  type: substitution.substituteType(field.type))
-            ],
-            namedParameters: <VariableDeclaration>[],
-            requiredParameterCount: 1,
-            returnType: const VoidType()),
-        fileUri: field.fileUri,
-        reference: referenceFrom?.reference)
-      ..fileOffset = field.fileOffset
-      ..isNonNullableByDefault = cls.enclosingLibrary.isNonNullableByDefault;
-    transformProcedureToNoSuchMethodForwarder(noSuchMethod, target, setter);
-    cls.procedures.add(setter);
-    setter.parent = cls;
-  }
-
   bool _addMissingNoSuchMethodForwarders(
       KernelTarget target, Set<Member> existingForwarders,
       {bool forSetters}) {
     assert(forSetters != null);
 
     ClassHierarchy hierarchy = target.loader.hierarchy;
-    TypeEnvironment typeEnvironment =
-        target.loader.typeInferenceEngine.typeSchemaEnvironment;
 
     List<Member> allMembers =
         hierarchy.getInterfaceMembers(cls, setters: forSetters);
@@ -758,97 +676,35 @@
     for (Name name in sameNameMembers.keys) {
       List<Member> members = sameNameMembers[name];
       assert(members.isNotEmpty);
-      List<DartType> memberTypes = [];
-
-      // The most specific member has the type that is subtype of the types of
-      // all other members.
-      Member bestSoFar = members.first;
-      DartType bestSoFarType =
-          forSetters ? bestSoFar.setterType : bestSoFar.getterType;
-      Supertype supertype =
-          hierarchy.getClassAsInstanceOf(cls, bestSoFar.enclosingClass);
-      assert(
-          supertype != null,
-          "No supertype of enclosing class ${bestSoFar.enclosingClass} for "
-          "$bestSoFar found for $cls.");
-      bestSoFarType =
-          Substitution.fromSupertype(supertype).substituteType(bestSoFarType);
-      for (int i = 1; i < members.length; ++i) {
-        Member candidate = members[i];
-        DartType candidateType =
-            forSetters ? candidate.setterType : candidate.getterType;
-        Supertype supertype =
-            hierarchy.getClassAsInstanceOf(cls, candidate.enclosingClass);
-        assert(
-            supertype != null,
-            "No supertype of enclosing class ${candidate.enclosingClass} for "
-            "$candidate found for $cls.");
-        Substitution substitution = Substitution.fromSupertype(supertype);
-        candidateType = substitution.substituteType(candidateType);
-        memberTypes.add(candidateType);
-        bool isMoreSpecific = forSetters
-            ? typeEnvironment.isSubtypeOf(bestSoFarType, candidateType,
-                SubtypeCheckMode.withNullabilities)
-            : typeEnvironment.isSubtypeOf(candidateType, bestSoFarType,
-                SubtypeCheckMode.withNullabilities);
-        if (isMoreSpecific) {
-          bestSoFar = candidate;
-          bestSoFarType = candidateType;
-        }
-      }
-      // Since isSubtypeOf isn't a linear order on types, we need to check once
-      // again that the found member is indeed the most specific one.
-      bool isActuallyBestSoFar = true;
-      for (DartType memberType in memberTypes) {
-        bool isMoreSpecific = forSetters
-            ? typeEnvironment.isSubtypeOf(
-                memberType, bestSoFarType, SubtypeCheckMode.withNullabilities)
-            : typeEnvironment.isSubtypeOf(
-                bestSoFarType, memberType, SubtypeCheckMode.withNullabilities);
-        if (!isMoreSpecific) {
-          isActuallyBestSoFar = false;
-          break;
-        }
-      }
-      if (!isActuallyBestSoFar) {
-        // It's a member conflict that is reported elsewhere.
-      } else {
-        Member member = bestSoFar;
-
+      CombinedMemberSignatureBuilder combinedMemberSignature =
+          new CombinedMemberSignatureBuilder(hierarchy, this, members,
+              forSetter: forSetters);
+      Member member = combinedMemberSignature.canonicalMember;
+      if (member != null) {
         if (_isForwarderRequired(
                 clsHasUserDefinedNoSuchMethod, member, cls, concreteMembers,
                 isPatch: member.fileUri != member.enclosingClass.fileUri) &&
             !existingForwarders.contains(member)) {
-          if (member is Procedure) {
-            // If there's a declared member with such name, then it's abstract
-            // -- transform it into a noSuchMethod forwarder.
-            if (ClassHierarchy.findMemberByName(declaredMembers, member.name) !=
-                null) {
-              transformProcedureToNoSuchMethodForwarder(
-                  noSuchMethod, target, member);
-            } else {
-              addNoSuchMethodForwarderForProcedure(
-                  noSuchMethod, target, member, hierarchy);
-            }
-            changed = true;
-          } else if (member is Field) {
-            // Current class isn't abstract, so it can't have an abstract field
-            // with the same name -- just insert the forwarder.
-            if (forSetters) {
-              addNoSuchMethodForwarderSetterForField(
-                  member, noSuchMethod, target);
-            } else {
-              addNoSuchMethodForwarderGetterForField(
-                  member, noSuchMethod, target);
-            }
-            changed = true;
+          assert(!combinedMemberSignature.needsCovarianceMerging,
+              "Needed covariant merging for ${members}");
+          if (ClassHierarchy.findMemberByName(declaredMembers, member.name) !=
+              null) {
+            _transformProcedureToNoSuchMethodForwarder(
+                noSuchMethod, target, member);
           } else {
-            return unhandled(
-                "${member.runtimeType}",
-                "addNoSuchMethodForwarders",
-                cls.fileOffset,
-                cls.enclosingLibrary.fileUri);
+            Procedure memberSignature =
+                combinedMemberSignature.createMemberFromSignature();
+            _transformProcedureToNoSuchMethodForwarder(
+                noSuchMethod, target, memberSignature);
+            cls.procedures.add(memberSignature);
+            memberSignature.parent = cls;
+
+            if (member is Procedure) {
+              library.forwardersOrigins.add(memberSignature);
+              library.forwardersOrigins.add(member);
+            }
           }
+          changed = true;
         }
       }
     }
@@ -939,7 +795,49 @@
     return isForwarderRequired;
   }
 
-  void addRedirectingConstructor(ProcedureBuilder constructorBuilder,
+  void _transformProcedureToNoSuchMethodForwarder(
+      Member noSuchMethodInterface, KernelTarget target, Procedure procedure) {
+    String prefix = procedure.isGetter
+        ? 'get:'
+        : procedure.isSetter
+            ? 'set:'
+            : '';
+    String invocationName = prefix + procedure.name.text;
+    if (procedure.isSetter) invocationName += '=';
+    Expression invocation = target.backendTarget.instantiateInvocation(
+        target.loader.coreTypes,
+        new ThisExpression(),
+        invocationName,
+        new Arguments.forwarded(procedure.function, library.library),
+        procedure.fileOffset,
+        /*isSuper=*/ false);
+    Expression result = new MethodInvocation(new ThisExpression(),
+        noSuchMethodName, new Arguments([invocation]), noSuchMethodInterface)
+      ..fileOffset = procedure.fileOffset;
+    if (procedure.function.returnType is! VoidType) {
+      result = new AsExpression(result, procedure.function.returnType)
+        ..isTypeError = true
+        ..isForDynamic = true
+        ..isForNonNullableByDefault = library.isNonNullableByDefault
+        ..fileOffset = procedure.fileOffset;
+    }
+    procedure.function.body = new ReturnStatement(result)
+      ..fileOffset = procedure.fileOffset;
+    procedure.function.body.parent = procedure.function;
+    procedure.function.asyncMarker = AsyncMarker.Sync;
+    procedure.function.dartAsyncMarker = AsyncMarker.Sync;
+
+    procedure.isAbstract = false;
+    procedure.isNoSuchMethodForwarder = true;
+    procedure.isMemberSignature = false;
+    procedure.isForwardingStub = false;
+    procedure.isForwardingSemiStub = false;
+    procedure.memberSignatureOrigin = null;
+    procedure.forwardingStubInterfaceTarget = null;
+    procedure.forwardingStubSuperTarget = null;
+  }
+
+  void _addRedirectingConstructor(ProcedureBuilder constructorBuilder,
       SourceLibraryBuilder library, Field referenceFrom) {
     // Add a new synthetic field to this class for representing factory
     // constructors. This is used to support resolving such constructors in
@@ -953,7 +851,7 @@
     // [constructor.target].
     //
     // TODO(ahe): Add a kernel node to represent redirecting factory bodies.
-    DillMemberBuilder constructorsField =
+    DillFieldBuilder constructorsField =
         origin.scope.lookupLocalMember(redirectingName, setter: false);
     if (constructorsField == null) {
       ListLiteral literal = new ListLiteral(<Expression>[]);
@@ -962,10 +860,11 @@
           isStatic: true,
           initializer: literal,
           fileUri: cls.fileUri,
-          reference: referenceFrom?.reference)
+          getterReference: referenceFrom?.getterReference,
+          setterReference: referenceFrom?.setterReference)
         ..fileOffset = cls.fileOffset;
-      cls.addMember(field);
-      constructorsField = new DillMemberBuilder(field, this);
+      cls.addField(field);
+      constructorsField = new DillFieldBuilder(field, this);
       origin.scope
           .addLocalMember(redirectingName, constructorsField, setter: false);
     }
@@ -1006,7 +905,7 @@
                 // only legal to do to things in the kernel tree.
                 Field referenceFrom =
                     referencesFromIndexed?.lookupField("_redirecting#");
-                addRedirectingConstructor(declaration, library, referenceFrom);
+                _addRedirectingConstructor(declaration, library, referenceFrom);
               }
               if (targetBuilder is FunctionBuilder) {
                 List<DartType> typeArguments = declaration.typeArguments ??
@@ -1845,3 +1744,17 @@
     }
   }
 }
+
+/// Returns `true` if override problems should be overlooked.
+///
+/// This is needed for the current encoding of some JavaScript implementation
+/// classes that are not valid Dart. For instance `JSInt` in
+/// 'dart:_interceptors' that implements both `int` and `double`, and `JsArray`
+/// in `dart:js` that implement both `ListMixin` and `JsObject`.
+bool shouldOverrideProblemBeOverlooked(ClassBuilder classBuilder) {
+  String uri = '${classBuilder.library.importUri}';
+  return uri == 'dart:js' &&
+          classBuilder.fileUri.pathSegments.last == 'js.dart' ||
+      uri == 'dart:_interceptors' &&
+          classBuilder.fileUri.pathSegments.last == 'js_number.dart';
+}
diff --git a/pkg/front_end/lib/src/fasta/source/source_extension_builder.dart b/pkg/front_end/lib/src/fasta/source/source_extension_builder.dart
index 867fb41..f3c9943 100644
--- a/pkg/front_end/lib/src/fasta/source/source_extension_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_extension_builder.dart
@@ -146,10 +146,20 @@
                   break;
               }
               assert(kind != null);
-              libraryBuilder.library.addMember(member);
+              Reference memberReference;
+              if (member is Field) {
+                libraryBuilder.library.addField(member);
+                memberReference = member.getterReference;
+              } else if (member is Procedure) {
+                libraryBuilder.library.addProcedure(member);
+                memberReference = member.reference;
+              } else {
+                unhandled("${member.runtimeType}", "buildBuilders",
+                    member.fileOffset, member.fileUri);
+              }
               extension.members.add(new ExtensionMemberDescriptor(
                   name: new Name(memberBuilder.name, libraryBuilder.library),
-                  member: member.reference,
+                  member: memberReference,
                   isStatic: declaration.isStatic,
                   kind: kind));
             }
diff --git a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
index 0bd7da5..e4d81e4 100644
--- a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
@@ -38,6 +38,7 @@
         Name,
         NeverType,
         NonNullableByDefaultCompiledMode,
+        NullType,
         Nullability,
         Procedure,
         ProcedureKind,
@@ -332,13 +333,12 @@
         importUri.scheme != 'dart' || _packageUri == null,
         "Package uri '$_packageUri' set on dart: library with import uri "
         "'${importUri}'.");
-    updateLibraryNNBDSettings();
   }
 
   bool _enableVarianceInLibrary;
   bool _enableNonfunctionTypeAliasesInLibrary;
   bool _enableNonNullableInLibrary;
-  Version _enableNonNullableVersionCache;
+  Version _enableNonNullableVersionInLibrary;
   bool _enableTripleShiftInLibrary;
   bool _enableExtensionMethodsInLibrary;
 
@@ -358,10 +358,13 @@
   /// a version that is too low for opting in to the experiment.
   bool get enableNonNullableInLibrary => _enableNonNullableInLibrary ??=
       loader.target.isExperimentEnabledInLibrary(
-          ExperimentalFlag.nonNullable, _packageUri ?? importUri);
+              ExperimentalFlag.nonNullable, _packageUri ?? importUri) &&
+          !isOptOutTest(library.importUri);
 
-  Version get _enableNonNullableVersion => _enableNonNullableVersionCache ??=
-      loader.target.getExperimentEnabledVersion(ExperimentalFlag.nonNullable);
+  Version get enableNonNullableVersionInLibrary =>
+      _enableNonNullableVersionInLibrary ??= loader.target
+          .getExperimentEnabledVersionInLibrary(
+              ExperimentalFlag.nonNullable, _packageUri ?? importUri);
 
   bool get enableTripleShiftInLibrary => _enableTripleShiftInLibrary ??=
       loader.target.isExperimentEnabledInLibrary(
@@ -391,7 +394,7 @@
       }
     } else {
       library.nonNullableByDefaultCompiledMode =
-          NonNullableByDefaultCompiledMode.Disabled;
+          NonNullableByDefaultCompiledMode.Weak;
     }
   }
 
@@ -434,11 +437,30 @@
     return type;
   }
 
+  bool _isNonNullableByDefault;
+
   @override
-  bool get isNonNullableByDefault =>
+  bool get isNonNullableByDefault {
+    assert(
+        _isNonNullableByDefault == null ||
+            _isNonNullableByDefault == _computeIsNonNullableByDefault(),
+        "Unstable isNonNullableByDefault property, changed "
+        "from ${_isNonNullableByDefault} to "
+        "${_computeIsNonNullableByDefault()}");
+    return _ensureIsNonNullableByDefault();
+  }
+
+  bool _ensureIsNonNullableByDefault() {
+    if (_isNonNullableByDefault == null) {
+      _isNonNullableByDefault = _computeIsNonNullableByDefault();
+      updateLibraryNNBDSettings();
+    }
+    return _isNonNullableByDefault;
+  }
+
+  bool _computeIsNonNullableByDefault() =>
       enableNonNullableInLibrary &&
-      languageVersion.version >= _enableNonNullableVersion &&
-      !isOptOutTest(library.importUri);
+      languageVersion.version >= enableNonNullableVersionInLibrary;
 
   static bool isOptOutTest(Uri uri) {
     String path = uri.path;
@@ -458,6 +480,7 @@
     'ffi_2',
     'language_2/',
     'lib_2/',
+    'service_2/',
     'standalone_2/',
     'vm/dart_2/', // in runtime/tests
   ];
@@ -465,21 +488,23 @@
   LanguageVersion get languageVersion => _languageVersion;
 
   void markLanguageVersionFinal() {
-    if (enableNonNullableInLibrary &&
+    if (!isNonNullableByDefault &&
         (loader.nnbdMode == NnbdMode.Strong ||
             loader.nnbdMode == NnbdMode.Agnostic)) {
       // In strong and agnostic mode, the language version is not allowed to
       // opt a library out of nnbd.
-      if (!isNonNullableByDefault) {
-        if (_languageVersion.isExplicit) {
-          addPostponedProblem(messageStrongModeNNBDButOptOut,
-              _languageVersion.charOffset, _languageVersion.charCount, fileUri);
-        } else {
-          loader.registerStrongOptOutLibrary(this);
-        }
+      if (_languageVersion.isExplicit) {
+        addPostponedProblem(messageStrongModeNNBDButOptOut,
+            _languageVersion.charOffset, _languageVersion.charCount, fileUri);
+      } else {
+        loader.registerStrongOptOutLibrary(this);
       }
+      library.nonNullableByDefaultCompiledMode =
+          NonNullableByDefaultCompiledMode.Invalid;
+      loader.hasInvalidNnbdModeLibrary = true;
     }
     _languageVersion.isFinal = true;
+    _ensureIsNonNullableByDefault();
   }
 
   @override
@@ -782,15 +807,18 @@
 
   @override
   Builder addBuilder(String name, Builder declaration, int charOffset,
-      {Reference reference}) {
+      {Reference getterReference, Reference setterReference}) {
     // TODO(ahe): Set the parent correctly here. Could then change the
     // implementation of MemberBuilder.isTopLevel to test explicitly for a
     // LibraryBuilder.
     if (name == null) {
       unhandled("null", "name", charOffset, fileUri);
     }
-    if (reference != null) {
-      loader.buildersCreatedWithReferences[reference] = declaration;
+    if (getterReference != null) {
+      loader.buildersCreatedWithReferences[getterReference] = declaration;
+    }
+    if (setterReference != null) {
+      loader.buildersCreatedWithReferences[setterReference] = declaration;
     }
     if (currentTypeParameterScopeBuilder == libraryDeclaration) {
       if (declaration is MemberBuilder) {
@@ -904,6 +932,7 @@
     return true;
   }
 
+  /// Builds the core AST structure of this library as needed for the outline.
   Library build(LibraryBuilder coreLibrary, {bool modifyTarget}) {
     assert(implementationBuilders.isEmpty);
     canAddImplementationBuilders = true;
@@ -948,15 +977,14 @@
 
     if (unserializableExports != null) {
       Field referenceFrom = referencesFromIndexed?.lookupField("_exports#");
-      library.addMember(new Field(new Name("_exports#", library),
+      library.addField(new Field(new Name("_exports#", library),
           initializer: new StringLiteral(jsonEncode(unserializableExports)),
           isStatic: true,
           isConst: true,
-          reference: referenceFrom?.reference));
+          getterReference: referenceFrom?.getterReference,
+          setterReference: referenceFrom?.setterReference));
     }
 
-    // TODO(CFE Team): Is this really needed in two places?
-    updateLibraryNNBDSettings();
     return library;
   }
 
@@ -1234,7 +1262,17 @@
               } else if (memberLast is ExtensionBuilder) {
                 library.additionalExports.add(memberLast.extension.reference);
               } else if (memberLast is MemberBuilder) {
-                library.additionalExports.add(memberLast.member.reference);
+                for (Member member in memberLast.exportedMembers) {
+                  if (member is Field) {
+                    // For fields add both getter and setter references
+                    // so replacing a field with a getter/setter pair still
+                    // exports correctly.
+                    library.additionalExports.add(member.getterReference);
+                    library.additionalExports.add(member.setterReference);
+                  } else {
+                    library.additionalExports.add(member.reference);
+                  }
+                }
               } else {
                 unhandled('member', 'exportScope', memberLast.charOffset,
                     memberLast.fileUri);
@@ -1342,6 +1380,12 @@
         -1);
   }
 
+  void addSyntheticDeclarationOfNull() {
+    // TODO(dmitryas): Uncomment the following when the Null class is removed
+    // from the SDK.
+    //addBuilder("Null", new NullTypeBuilder(const NullType(), this, -1), -1);
+  }
+
   TypeBuilder addNamedType(Object name, NullabilityBuilder nullabilityBuilder,
       List<TypeBuilder> arguments, int charOffset) {
     return addType(
@@ -1569,7 +1613,7 @@
     constructors.forEach(setParentAndCheckConflicts);
     setters.forEach(setParentAndCheckConflicts);
     addBuilder(className, classBuilder, nameOffset,
-        reference: referencesFromClass?.reference);
+        getterReference: referencesFromClass?.reference);
   }
 
   Map<String, TypeVariableBuilder> checkTypeVariables(
@@ -1779,7 +1823,7 @@
     constructors.forEach(setParentAndCheckConflicts);
     setters.forEach(setParentAndCheckConflicts);
     addBuilder(extensionName, extensionBuilder, nameOffset,
-        reference: referenceFrom?.reference);
+        getterReference: referenceFrom?.reference);
   }
 
   TypeBuilder applyMixins(TypeBuilder type, int startCharOffset, int charOffset,
@@ -2020,7 +2064,7 @@
         // handle that :(
         application.cls.isAnonymousMixin = !isNamedMixinApplication;
         addBuilder(fullname, application, charOffset,
-            reference: referencesFromClass?.reference);
+            getterReference: referencesFromClass?.reference);
         supertype = addNamedType(fullname, const NullabilityBuilder.omitted(),
             applicationTypeArguments, charOffset);
       }
@@ -2169,7 +2213,8 @@
         setterReferenceFrom);
     fieldBuilder.constInitializerToken = constInitializerToken;
     addBuilder(name, fieldBuilder, charOffset,
-        reference: referenceFrom?.reference);
+        getterReference: referenceFrom?.getterReference,
+        setterReference: referenceFrom?.setterReference);
     if (type == null && fieldBuilder.next == null) {
       // Only the first one (the last one in the linked list of next pointers)
       // are added to the tree, had parent pointers and can infer correctly.
@@ -2230,7 +2275,7 @@
         constructorBuilder.constructor, name);
     checkTypeVariables(typeVariables, constructorBuilder);
     addBuilder(constructorName, constructorBuilder, charOffset,
-        reference: referenceFrom?.reference);
+        getterReference: referenceFrom?.reference);
     if (nativeMethodName != null) {
       addNativeMethod(constructorBuilder);
     }
@@ -2258,7 +2303,11 @@
       int charEndOffset,
       String nativeMethodName,
       AsyncMarker asyncModifier,
-      {bool isTopLevel}) {
+      {bool isTopLevel,
+      bool isExtensionInstanceMember}) {
+    assert(isTopLevel != null);
+    assert(isExtensionInstanceMember != null);
+
     MetadataCollector metadataCollector = loader.target.metadataCollector;
     if (returnType == null) {
       if (kind == ProcedureKind.Operator &&
@@ -2333,12 +2382,13 @@
         referenceFrom,
         tearOffReferenceFrom,
         asyncModifier,
+        isExtensionInstanceMember,
         nativeMethodName);
     metadataCollector?.setDocumentationComment(
         procedureBuilder.procedure, documentationComment);
     checkTypeVariables(typeVariables, procedureBuilder);
     addBuilder(name, procedureBuilder, charOffset,
-        reference: referenceFrom?.reference);
+        getterReference: referenceFrom?.reference);
     if (nativeMethodName != null) {
       addNativeMethod(procedureBuilder);
     }
@@ -2419,6 +2469,7 @@
           referenceFrom,
           null,
           asyncModifier,
+          /* isExtensionInstanceMember = */ false,
           nativeMethodName);
     }
 
@@ -2440,7 +2491,7 @@
 
     factoryDeclaration.resolveTypes(procedureBuilder.typeVariables, this);
     addBuilder(procedureName, procedureBuilder, charOffset,
-        reference: referenceFrom?.reference);
+        getterReference: referenceFrom?.reference);
     if (nativeMethodName != null) {
       addNativeMethod(procedureBuilder);
     }
@@ -2474,7 +2525,7 @@
         referencesFromClass,
         referencesFromIndexedClass);
     addBuilder(name, builder, charOffset,
-        reference: referencesFromClass?.reference);
+        getterReference: referencesFromClass?.reference);
     metadataCollector?.setDocumentationComment(
         builder.cls, documentationComment);
   }
@@ -2502,7 +2553,7 @@
     endNestedDeclaration(TypeParameterScopeKind.typedef, "#typedef")
         .resolveTypes(typeVariables, this);
     addBuilder(name, typedefBuilder, charOffset,
-        reference: referenceFrom?.reference);
+        getterReference: referenceFrom?.reference);
   }
 
   FunctionTypeBuilder addFunctionType(
@@ -2552,6 +2603,7 @@
     MetadataBuilder.buildAnnotations(library, metadata, this, null, null);
   }
 
+  /// Builds the core AST structures for [declaration] needed for the outline.
   void buildBuilder(Builder declaration, LibraryBuilder coreLibrary) {
     String findDuplicateSuffix(Builder declaration) {
       if (declaration.next != null) {
@@ -2583,11 +2635,17 @@
           (Member member, BuiltMemberKind memberKind) {
         if (member is Field) {
           member.isStatic = true;
+          if (!declaration.isPatch && !declaration.isDuplicate) {
+            library.addField(member);
+          }
         } else if (member is Procedure) {
           member.isStatic = true;
-        }
-        if (!declaration.isPatch && !declaration.isDuplicate) {
-          library.addMember(member);
+          if (!declaration.isPatch && !declaration.isDuplicate) {
+            library.addProcedure(member);
+          }
+        } else {
+          unhandled("${member.runtimeType}:${memberKind}", "buildBuilder",
+              declaration.charOffset, declaration.fileUri);
         }
       });
     } else if (declaration is SourceTypeAliasBuilder) {
@@ -2782,7 +2840,7 @@
     for (Import import in imports) {
       if (import.deferred) {
         Procedure tearoff = import.prefixBuilder.loadLibraryBuilder.tearoff;
-        if (tearoff != null) library.addMember(tearoff);
+        if (tearoff != null) library.addProcedure(tearoff);
         total++;
       }
     }
@@ -3289,7 +3347,7 @@
       List<TypeParameter> typeParameters, Uri fileUri) {
     final DartType bottomType = library.isNonNullableByDefault
         ? const NeverType(Nullability.nonNullable)
-        : typeEnvironment.nullType;
+        : const NullType();
 
     // Check in bounds of own type variables.
     for (TypeParameter parameter in typeParameters) {
@@ -3375,7 +3433,7 @@
     if (returnType != null) {
       final DartType bottomType = isNonNullableByDefault
           ? const NeverType(Nullability.nonNullable)
-          : typeEnvironment.nullType;
+          : const NullType();
       Set<TypeArgumentIssue> issues = {};
       issues.addAll(findTypeArgumentIssues(library, returnType, typeEnvironment,
               SubtypeCheckMode.ignoringNullabilities, bottomType,
@@ -3485,7 +3543,7 @@
       {bool inferred, bool allowSuperBounded = true}) {
     final DartType bottomType = isNonNullableByDefault
         ? const NeverType(Nullability.nonNullable)
-        : typeEnvironment.nullType;
+        : const NullType();
     Set<TypeArgumentIssue> issues = {};
     issues.addAll(findTypeArgumentIssues(library, type, typeEnvironment,
             SubtypeCheckMode.ignoringNullabilities, bottomType,
@@ -3552,7 +3610,7 @@
 
     final DartType bottomType = isNonNullableByDefault
         ? const NeverType(Nullability.nonNullable)
-        : typeEnvironment.nullType;
+        : const NullType();
     Set<TypeArgumentIssue> issues = {};
     issues.addAll(findTypeArgumentIssuesForInvocation(
             library,
@@ -3639,7 +3697,7 @@
 
     final DartType bottomType = isNonNullableByDefault
         ? const NeverType(Nullability.nonNullable)
-        : typeEnvironment.nullType;
+        : const NullType();
     Set<TypeArgumentIssue> issues = {};
     issues.addAll(findTypeArgumentIssuesForInvocation(
             library,
diff --git a/pkg/front_end/lib/src/fasta/source/source_loader.dart b/pkg/front_end/lib/src/fasta/source/source_loader.dart
index 14803dd..16123b0 100644
--- a/pkg/front_end/lib/src/fasta/source/source_loader.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_loader.dart
@@ -4,8 +4,6 @@
 
 library fasta.source_loader;
 
-import 'dart:async' show Future;
-
 import 'dart:convert' show utf8;
 
 import 'dart:typed_data' show Uint8List;
@@ -251,7 +249,7 @@
         configuration: new ScannerConfiguration(
             enableTripleShift: library.enableTripleShiftInLibrary,
             enableExtensionMethods: library.enableExtensionMethodsInLibrary,
-            enableNonNullable: library.isNonNullableByDefault),
+            enableNonNullable: library.enableNonNullableInLibrary),
         languageVersionChanged:
             (Scanner scanner, LanguageVersionToken version) {
       if (!suppressLexicalErrors) {
@@ -323,6 +321,18 @@
   void registerStrongOptOutLibrary(LibraryBuilder libraryBuilder) {
     _strongOptOutLibraries ??= {};
     _strongOptOutLibraries.add(libraryBuilder);
+    hasInvalidNnbdModeLibrary = true;
+  }
+
+  bool hasInvalidNnbdModeLibrary = false;
+
+  Map<LibraryBuilder, Message> _nnbdMismatchLibraries;
+
+  void registerNnbdMismatchLibrary(
+      LibraryBuilder libraryBuilder, Message message) {
+    _nnbdMismatchLibraries ??= {};
+    _nnbdMismatchLibraries[libraryBuilder] = message;
+    hasInvalidNnbdModeLibrary = true;
   }
 
   @override
@@ -345,52 +355,79 @@
       // config we include each library uri in the message. For non-package
       // libraries with no corresponding package config we generate a message
       // per library.
-      Map<String, List<LibraryBuilder>> libraryByPackage = {};
-      Version enableNonNullableVersion =
-          target.getExperimentEnabledVersion(ExperimentalFlag.nonNullable);
-      for (LibraryBuilder libraryBuilder in _strongOptOutLibraries) {
-        Package package =
-            target.uriTranslator.getPackage(libraryBuilder.importUri);
+      giveCombinedErrorForNonStrongLibraries(_strongOptOutLibraries,
+          emitNonPackageErrors: true);
+      _strongOptOutLibraries = null;
+    }
+    if (_nnbdMismatchLibraries != null) {
+      for (MapEntry<LibraryBuilder, Message> entry
+          in _nnbdMismatchLibraries.entries) {
+        addProblem(entry.value, -1, noLength, entry.key.fileUri);
+      }
+      _nnbdMismatchLibraries = null;
+    }
+  }
 
-        if (package != null &&
-            package.languageVersion != null &&
-            package.languageVersion is! InvalidLanguageVersion) {
-          Version version = new Version(
-              package.languageVersion.major, package.languageVersion.minor);
-          if (version < enableNonNullableVersion) {
-            (libraryByPackage[package?.name] ??= []).add(libraryBuilder);
-            continue;
-          }
+  FormattedMessage giveCombinedErrorForNonStrongLibraries(
+      Set<LibraryBuilder> libraries,
+      {bool emitNonPackageErrors}) {
+    Map<String, List<LibraryBuilder>> libraryByPackage = {};
+    Map<Package, Version> enableNonNullableVersionByPackage = {};
+    for (LibraryBuilder libraryBuilder in libraries) {
+      final Package package =
+          target.uriTranslator.getPackage(libraryBuilder.importUri);
+
+      if (package != null &&
+          package.languageVersion != null &&
+          package.languageVersion is! InvalidLanguageVersion) {
+        Version enableNonNullableVersion =
+            enableNonNullableVersionByPackage[package] ??=
+                target.getExperimentEnabledVersionInLibrary(
+                    ExperimentalFlag.nonNullable,
+                    new Uri(scheme: 'package', path: package.name));
+        Version version = new Version(
+            package.languageVersion.major, package.languageVersion.minor);
+        if (version < enableNonNullableVersion) {
+          (libraryByPackage[package.name] ??= []).add(libraryBuilder);
+          continue;
         }
-        if (libraryBuilder.importUri.scheme == 'package') {
-          (libraryByPackage[null] ??= []).add(libraryBuilder);
-        } else {
+      }
+      if (libraryBuilder.importUri.scheme == 'package') {
+        (libraryByPackage[null] ??= []).add(libraryBuilder);
+      } else {
+        if (emitNonPackageErrors) {
           // Emit a message that doesn't mention running 'pub'.
           addProblem(messageStrongModeNNBDButOptOut, -1, noLength,
               libraryBuilder.fileUri);
         }
       }
-      if (libraryByPackage.isNotEmpty) {
-        List<String> dependencies = [];
-        libraryByPackage.forEach((String name, List<LibraryBuilder> libraries) {
-          if (name != null) {
-            dependencies.add('package:$name');
-          } else {
-            for (LibraryBuilder libraryBuilder in libraries) {
-              dependencies.add(libraryBuilder.importUri.toString());
-            }
-          }
-        });
-        // Emit a message that suggests to run 'pub' to check for opted in
-        // versions of the packages.
-        addProblem(
-            templateStrongModeNNBDPackageOptOut.withArguments(dependencies),
-            -1,
-            -1,
-            null);
-        _strongOptOutLibraries = null;
-      }
     }
+    if (libraryByPackage.isNotEmpty) {
+      List<Uri> involvedFiles = [];
+      List<String> dependencies = [];
+      libraryByPackage.forEach((String name, List<LibraryBuilder> libraries) {
+        if (name != null) {
+          dependencies.add('package:$name');
+          for (LibraryBuilder libraryBuilder in libraries) {
+            involvedFiles.add(libraryBuilder.fileUri);
+          }
+        } else {
+          for (LibraryBuilder libraryBuilder in libraries) {
+            dependencies.add(libraryBuilder.importUri.toString());
+            involvedFiles.add(libraryBuilder.fileUri);
+          }
+        }
+      });
+      // Emit a message that suggests to run 'pub' to check for opted in
+      // versions of the packages.
+      return addProblem(
+          templateStrongModeNNBDPackageOptOut.withArguments(dependencies),
+          -1,
+          -1,
+          null,
+          involvedFiles: involvedFiles);
+    }
+    return null;
   }
 
   List<int> getSource(List<int> bytes) {
@@ -470,7 +507,8 @@
         -1,
         null,
         null,
-        AsyncMarker.Sync)
+        AsyncMarker.Sync,
+        /* isExtensionInstanceMember = */ false)
       ..parent = parent;
     BodyBuilder listener = dietListener.createListener(
         builder, dietListener.memberScope,
@@ -908,6 +946,7 @@
     return handleHierarchyCycles(objectClass);
   }
 
+  /// Builds the core AST structure needed for the outline of the component.
   void buildComponent() {
     builders.forEach((Uri uri, LibraryBuilder library) {
       if (library.loader == this) {
@@ -1506,8 +1545,6 @@
 const String defaultDartAsyncSource = """
 _asyncErrorWrapperHelper(continuation) {}
 
-void _asyncStarListenHelper(var object, var awaiter) {}
-
 void _asyncStarMoveNextHelper(var stream) {}
 
 _asyncStackTraceHelper(async_op) {}
@@ -1516,7 +1553,9 @@
 
 _awaitHelper(object, thenCallback, errorCallback, awaiter) {}
 
-_completeOnAsyncReturn(completer, value) {}
+_completeOnAsyncReturn(_future, value, async_jump_var) {}
+
+_completeOnAsyncError(_future, e, st, async_jump_var) {}
 
 class _AsyncStarStreamController {
   add(event) {}
@@ -1547,14 +1586,10 @@
 class FutureOr {
 }
 
-class _AsyncAwaitCompleter implements Completer {
-  get future => null;
+class _Future {
+  void _completeError(Object error, StackTrace stackTrace) {}
 
-  complete([value]) {}
-
-  completeError(error, [stackTrace]) {}
-
-  void start(void Function() f) {}
+  void _asyncCompleteError(Object error, StackTrace stackTrace) {}
 }
 
 class Stream {}
diff --git a/pkg/front_end/lib/src/fasta/source/stack_listener_impl.dart b/pkg/front_end/lib/src/fasta/source/stack_listener_impl.dart
index ba35905..f3af4a5 100644
--- a/pkg/front_end/lib/src/fasta/source/stack_listener_impl.dart
+++ b/pkg/front_end/lib/src/fasta/source/stack_listener_impl.dart
@@ -14,7 +14,7 @@
 import 'package:front_end/src/api_prototype/experimental_flags.dart';
 
 import 'package:kernel/ast.dart'
-    show AsyncMarker, Expression, FunctionNode, TreeNode, Version;
+    show AsyncMarker, Expression, FunctionNode, TreeNode;
 
 import '../fasta_codes.dart';
 
@@ -90,13 +90,11 @@
   void reportMissingNonNullableSupport(Token token) {
     assert(!libraryBuilder.isNonNullableByDefault);
     assert(token != null);
-    Version enableNonNullableVersion = libraryBuilder.loader.target
-        .getExperimentEnabledVersion(ExperimentalFlag.nonNullable);
     if (libraryBuilder.enableNonNullableInLibrary) {
       if (libraryBuilder.languageVersion.isExplicit) {
         addProblem(
-            templateNonNullableOptOutExplicit
-                .withArguments(enableNonNullableVersion.toText()),
+            templateNonNullableOptOutExplicit.withArguments(
+                libraryBuilder.enableNonNullableVersionInLibrary.toText()),
             token.charOffset,
             token.charCount,
             context: <LocatedMessage>[
@@ -107,17 +105,32 @@
             ]);
       } else {
         addProblem(
-            templateNonNullableOptOutImplicit
-                .withArguments(enableNonNullableVersion.toText()),
+            templateNonNullableOptOutImplicit.withArguments(
+                libraryBuilder.enableNonNullableVersionInLibrary.toText()),
             token.charOffset,
             token.charCount);
       }
+    } else if (libraryBuilder.loader.target
+        .isExperimentEnabledByDefault(ExperimentalFlag.nonNullable)) {
+      if (libraryBuilder.languageVersion.version <
+          libraryBuilder.enableNonNullableVersionInLibrary) {
+        addProblem(
+            templateExperimentDisabledInvalidLanguageVersion.withArguments(
+                libraryBuilder.enableNonNullableVersionInLibrary.toText()),
+            token.offset,
+            noLength);
+      } else {
+        addProblem(templateExperimentDisabled.withArguments('non-nullable'),
+            token.offset, noLength);
+      }
     } else if (!libraryBuilder.loader.target
         .isExperimentEnabledGlobally(ExperimentalFlag.nonNullable)) {
-      if (libraryBuilder.languageVersion.version < enableNonNullableVersion) {
+      if (libraryBuilder.languageVersion.version <
+          libraryBuilder.enableNonNullableVersionInLibrary) {
         addProblem(
             templateExperimentNotEnabledNoFlagInvalidLanguageVersion
-                .withArguments(enableNonNullableVersion.toText()),
+                .withArguments(
+                    libraryBuilder.enableNonNullableVersionInLibrary.toText()),
             token.offset,
             noLength);
       } else {
@@ -125,8 +138,8 @@
       }
     } else {
       addProblem(
-          templateExperimentNotEnabled.withArguments(
-              'non-nullable', enableNonNullableVersion.toText()),
+          templateExperimentNotEnabled.withArguments('non-nullable',
+              libraryBuilder.enableNonNullableVersionInLibrary.toText()),
           token.offset,
           noLength);
     }
diff --git a/pkg/front_end/lib/src/fasta/target.dart b/pkg/front_end/lib/src/fasta/target.dart
index 641d55a..8d2efd9 100644
--- a/pkg/front_end/lib/src/fasta/target.dart
+++ b/pkg/front_end/lib/src/fasta/target.dart
@@ -4,8 +4,6 @@
 
 library fasta.target;
 
-import 'dart:async' show Future;
-
 import 'package:kernel/ast.dart' show Component;
 
 import 'ticker.dart' show Ticker;
diff --git a/pkg/front_end/lib/src/fasta/target_implementation.dart b/pkg/front_end/lib/src/fasta/target_implementation.dart
index ebacbfc..264ad8e 100644
--- a/pkg/front_end/lib/src/fasta/target_implementation.dart
+++ b/pkg/front_end/lib/src/fasta/target_implementation.dart
@@ -61,10 +61,21 @@
     return _options.isExperimentEnabledInLibrary(flag, importUri);
   }
 
-  Version getExperimentEnabledVersion(ExperimentalFlag flag) {
-    return _options.getExperimentEnabledVersion(flag);
+  Version getExperimentEnabledVersionInLibrary(
+      ExperimentalFlag flag, Uri importUri) {
+    return _options.getExperimentEnabledVersionInLibrary(flag, importUri);
   }
 
+  /// Returns `true` if the [flag] is enabled by default.
+  bool isExperimentEnabledByDefault(ExperimentalFlag flag) {
+    return _options.isExperimentEnabledByDefault(flag);
+  }
+
+  /// Returns `true` if the [flag] is enabled globally.
+  ///
+  /// This is `true` either if the [flag] is passed through an explicit
+  /// `--enable-experiment` option or if the [flag] is expired and on by
+  /// default.
   bool isExperimentEnabledGlobally(ExperimentalFlag flag) {
     return _options.isExperimentEnabledGlobally(flag);
   }
@@ -169,12 +180,14 @@
       int length,
       Uri fileUri,
       List<LocatedMessage> messageContext,
-      Severity severity) {
+      Severity severity,
+      {List<Uri> involvedFiles}) {
     ProcessedOptions processedOptions = context.options;
     return processedOptions.format(
         message.withLocation(fileUri, charOffset, length),
         severity,
-        messageContext);
+        messageContext,
+        involvedFiles: involvedFiles);
   }
 
   Severity fixSeverity(Severity severity, Message message, Uri fileUri) {
diff --git a/pkg/front_end/lib/src/fasta/type_inference/closure_context.dart b/pkg/front_end/lib/src/fasta/type_inference/closure_context.dart
index 2aad555..4de8315 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/closure_context.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/closure_context.dart
@@ -151,7 +151,7 @@
         // dynamic, or Null.
         if (returnType is VoidType ||
             returnType is DynamicType ||
-            returnType == inferrer.coreTypes.nullType) {
+            returnType is NullType) {
           // Valid return;
         } else {
           statement.expression = inferrer.helper.wrapInProblem(
@@ -172,7 +172,7 @@
         if (returnType is VoidType &&
             !(expressionType is VoidType ||
                 expressionType is DynamicType ||
-                expressionType == inferrer.coreTypes.nullType)) {
+                expressionType is NullType)) {
           // It is a compile-time error if s is `return e;`, T is void, and S is
           // neither void, dynamic, nor Null.
           statement.expression = inferrer.helper.wrapInProblem(
@@ -199,7 +199,14 @@
               _returnContext, expressionType, statement.expression,
               fileOffset: statement.expression.fileOffset,
               isVoidAllowed: true,
-              errorTemplate: templateInvalidReturn);
+              errorTemplate: templateInvalidReturn,
+              nullabilityErrorTemplate: templateInvalidReturnNullability,
+              nullabilityPartErrorTemplate:
+                  templateInvalidReturnPartNullability,
+              nullabilityNullErrorTemplate:
+                  templateInvalidReturnNullabilityNull,
+              nullabilityNullTypeErrorTemplate:
+                  templateInvalidReturnNullabilityNullType);
           statement.expression = expression..parent = statement;
         }
       }
@@ -210,7 +217,7 @@
         // `return;` is a valid return if T is void, dynamic, or Null.
         if (returnType is VoidType ||
             returnType is DynamicType ||
-            returnType == inferrer.coreTypes.nullType) {
+            returnType is NullType) {
           // Valid return;
         } else {
           statement.expression = inferrer.helper.wrapInProblem(
@@ -235,7 +242,7 @@
         } else if (returnType is VoidType &&
             expressionType is! VoidType &&
             expressionType is! DynamicType &&
-            expressionType != inferrer.coreTypes.nullType) {
+            expressionType is! NullType) {
           // Invalid if T is void and S is not void, dynamic, or Null
           statement.expression = inferrer.helper.wrapInProblem(
               statement.expression,
@@ -246,7 +253,7 @@
         } else if (expressionType is VoidType &&
             returnType is! VoidType &&
             returnType is! DynamicType &&
-            returnType != inferrer.coreTypes.nullType) {
+            returnType is! NullType) {
           // Invalid if S is void and T is not void, dynamic, or Null.
           statement.expression = inferrer.helper.wrapInProblem(
               statement.expression,
@@ -294,15 +301,16 @@
       {bool hasImplicitReturn}) {
     assert(_needToInferReturnType);
     assert(hasImplicitReturn != null);
-    DartType inferredType;
+    DartType actualReturnedType;
+    DartType inferredReturnType;
     if (inferrer.isNonNullableByDefault) {
       if (hasImplicitReturn) {
         // No explicit returns we have an implicit `return null`.
-        inferredType = inferrer.typeSchemaEnvironment.nullType;
+        actualReturnedType = const NullType();
       } else {
         // No explicit return and the function doesn't complete normally; that
         // is, it throws.
-        inferredType = new NeverType(inferrer.library.nonNullable);
+        actualReturnedType = new NeverType(inferrer.library.nonNullable);
       }
       // Use the types seen from the explicit return statements.
       for (int i = 0; i < _returnStatements.length; i++) {
@@ -315,13 +323,32 @@
             type = inferrer.computeGreatestClosure(_returnContext);
           }
         }
-        if (inferredType == null) {
-          inferredType = type;
+        if (actualReturnedType == null) {
+          actualReturnedType = type;
         } else {
-          inferredType = inferrer.typeSchemaEnvironment.getStandardUpperBound(
-              inferredType, type, inferrer.library.library);
+          actualReturnedType = inferrer.typeSchemaEnvironment
+              .getStandardUpperBound(
+                  actualReturnedType, type, inferrer.library.library);
         }
       }
+
+      // Let T be the actual returned type of a function literal as computed
+      // above. Let R be the greatest closure of the typing context K as
+      // computed above.
+      DartType returnContext =
+          inferrer.computeGreatestClosure2(_declaredReturnType);
+      if (returnContext is VoidType) {
+        // With null safety: if R is void, or the function literal is marked
+        // async and R is FutureOr<void>, let S be void.
+        inferredReturnType = const VoidType();
+      } else if (inferrer.typeSchemaEnvironment.isSubtypeOf(actualReturnedType,
+          returnContext, SubtypeCheckMode.withNullabilities)) {
+        // Otherwise, if T <: R then let S be T.
+        inferredReturnType = actualReturnedType;
+      } else {
+        // Otherwise, let S be R.
+        inferredReturnType = returnContext;
+      }
     } else {
       if (_returnStatements.isNotEmpty) {
         // Use the types seen from the explicit return statements.
@@ -335,37 +362,41 @@
               type = inferrer.computeGreatestClosure(_returnContext);
             }
           }
-          if (inferredType == null) {
-            inferredType = type;
+          if (actualReturnedType == null) {
+            actualReturnedType = type;
           } else {
-            inferredType = inferrer.typeSchemaEnvironment.getStandardUpperBound(
-                inferredType, type, inferrer.library.library);
+            actualReturnedType = inferrer.typeSchemaEnvironment
+                .getStandardUpperBound(
+                    actualReturnedType, type, inferrer.library.library);
           }
         }
       } else if (hasImplicitReturn) {
         // No explicit returns we have an implicit `return null`.
-        inferredType = inferrer.typeSchemaEnvironment.nullType;
+        actualReturnedType = const NullType();
       } else {
         // No explicit return and the function doesn't complete normally; that
         // is, it throws.
-        inferredType = inferrer.typeSchemaEnvironment.nullType;
+        actualReturnedType = const NullType();
+      }
+
+      if (!inferrer.typeSchemaEnvironment.isSubtypeOf(actualReturnedType,
+          _returnContext, SubtypeCheckMode.withNullabilities)) {
+        // If the inferred return type isn't a subtype of the context, we use
+        // the context.
+        inferredReturnType =
+            inferrer.computeGreatestClosure2(_declaredReturnType);
+      } else {
+        inferredReturnType = actualReturnedType;
       }
     }
 
-    if (!inferrer.typeSchemaEnvironment.isSubtypeOf(
-        inferredType, _returnContext, SubtypeCheckMode.withNullabilities)) {
-      // If the inferred return type isn't a subtype of the context, we use the
-      // context.
-      inferredType = inferrer.computeGreatestClosure2(_declaredReturnType);
-    }
-
     for (int i = 0; i < _returnStatements.length; ++i) {
-      _checkValidReturn(inferrer, inferredType, _returnStatements[i],
+      _checkValidReturn(inferrer, inferredReturnType, _returnStatements[i],
           _returnExpressionTypes[i]);
     }
 
     return _inferredReturnType =
-        demoteTypeInLibrary(inferredType, inferrer.library.library);
+        demoteTypeInLibrary(inferredReturnType, inferrer.library.library);
   }
 
   @override
@@ -466,7 +497,7 @@
         // dynamic, or Null.
         if (futureValueType is VoidType ||
             futureValueType is DynamicType ||
-            futureValueType == inferrer.coreTypes.nullType) {
+            futureValueType is NullType) {
           // Valid return;
         } else {
           statement.expression = inferrer.helper.wrapInProblem(
@@ -491,7 +522,7 @@
         if (futureValueType is VoidType &&
             !(flattenedExpressionType is VoidType ||
                 flattenedExpressionType is DynamicType ||
-                flattenedExpressionType == inferrer.coreTypes.nullType)) {
+                flattenedExpressionType is NullType)) {
           // It is a compile-time error if s is `return e;`, T_v is void, and
           // flatten(S) is neither void, dynamic, Null.
           statement.expression = inferrer.helper.wrapInProblem(
@@ -528,7 +559,14 @@
                   inferrer.computeGreatestClosure2(_returnContext),
               declaredContextType: returnType,
               isVoidAllowed: false,
-              errorTemplate: templateInvalidReturnAsync)
+              errorTemplate: templateInvalidReturnAsync,
+              nullabilityErrorTemplate: templateInvalidReturnAsyncNullability,
+              nullabilityPartErrorTemplate:
+                  templateInvalidReturnAsyncPartNullability,
+              nullabilityNullErrorTemplate:
+                  templateInvalidReturnAsyncNullabilityNull,
+              nullabilityNullTypeErrorTemplate:
+                  templateInvalidReturnAsyncNullabilityNullType)
             ..parent = statement;
         }
       }
@@ -541,7 +579,7 @@
         // `return;` is a valid return if flatten(T) is void, dynamic, or Null.
         if (flattenedReturnType is VoidType ||
             flattenedReturnType is DynamicType ||
-            flattenedReturnType == inferrer.coreTypes.nullType) {
+            flattenedReturnType is NullType) {
           // Valid return;
         } else {
           statement.expression = inferrer.helper.wrapInProblem(
@@ -576,7 +614,7 @@
         } else if (returnType is VoidType &&
             flattenedExpressionType is! VoidType &&
             flattenedExpressionType is! DynamicType &&
-            flattenedExpressionType != inferrer.coreTypes.nullType) {
+            flattenedExpressionType is! NullType) {
           // Invalid if T is void and flatten(S) is not void, dynamic, or Null.
           statement.expression = inferrer.helper.wrapInProblem(
               statement.expression,
@@ -587,7 +625,7 @@
         } else if (flattenedExpressionType is VoidType &&
             flattenedReturnType is! VoidType &&
             flattenedReturnType is! DynamicType &&
-            flattenedReturnType != inferrer.coreTypes.nullType) {
+            flattenedReturnType is! NullType) {
           // Invalid if flatten(S) is void and flatten(T) is not void, dynamic,
           // or Null.
           statement.expression = inferrer.helper.wrapInProblem(
@@ -665,7 +703,7 @@
     if (inferrer.isNonNullableByDefault) {
       if (hasImplicitReturn) {
         // No explicit returns we have an implicit `return null`.
-        inferredType = inferrer.typeSchemaEnvironment.nullType;
+        inferredType = const NullType();
       } else {
         // No explicit return and the function doesn't complete normally; that
         // is, it throws.
@@ -731,11 +769,11 @@
         }
       } else if (hasImplicitReturn) {
         // No explicit returns we have an implicit `return null`.
-        inferredType = inferrer.typeSchemaEnvironment.nullType;
+        inferredType = const NullType();
       } else {
         // No explicit return and the function doesn't complete normally;
         // that is, it throws.
-        inferredType = inferrer.typeSchemaEnvironment.nullType;
+        inferredType = const NullType();
       }
       inferredType =
           inferrer.wrapFutureType(inferredType, inferrer.library.nonNullable);
@@ -890,14 +928,14 @@
       }
     } else if (hasImplicitReturn) {
       // No explicit returns we have an implicit `return null`.
-      inferredElementType = inferrer.typeSchemaEnvironment.nullType;
+      inferredElementType = const NullType();
     } else {
       // No explicit return and the function doesn't complete normally; that is,
       // it throws.
       if (inferrer.isNonNullableByDefault) {
         inferredElementType = new NeverType(inferrer.library.nonNullable);
       } else {
-        inferredElementType = inferrer.typeSchemaEnvironment.nullType;
+        inferredElementType = const NullType();
       }
     }
 
@@ -1015,14 +1053,14 @@
       }
     } else if (hasImplicitReturn) {
       // No explicit returns we have an implicit `return null`.
-      inferredElementType = inferrer.typeSchemaEnvironment.nullType;
+      inferredElementType = const NullType();
     } else {
       // No explicit return and the function doesn't complete normally; that is,
       // it throws.
       if (inferrer.isNonNullableByDefault) {
         inferredElementType = new NeverType(inferrer.library.nonNullable);
       } else {
-        inferredElementType = inferrer.typeSchemaEnvironment.nullType;
+        inferredElementType = const NullType();
       }
     }
 
diff --git a/pkg/front_end/lib/src/fasta/type_inference/factor_type.dart b/pkg/front_end/lib/src/fasta/type_inference/factor_type.dart
index 572423e..8710222 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/factor_type.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/factor_type.dart
@@ -23,7 +23,7 @@
     }
     DartType factor_RS = factorType(typeEnvironment, R, S);
     if (typeEnvironment.isSubtypeOf(
-        typeEnvironment.nullType, S, SubtypeCheckMode.withNullabilities)) {
+        const NullType(), S, SubtypeCheckMode.withNullabilities)) {
       return factor_RS;
     } else {
       return factor_RS.withDeclaredNullability(Nullability.nullable);
@@ -36,7 +36,7 @@
     DartType R = T.withDeclaredNullability(Nullability.nonNullable);
     DartType factor_RS = factorType(typeEnvironment, R, S);
     if (typeEnvironment.isSubtypeOf(
-        typeEnvironment.nullType, S, SubtypeCheckMode.withNullabilities)) {
+        const NullType(), S, SubtypeCheckMode.withNullabilities)) {
       return factor_RS;
     } else {
       return factor_RS.withDeclaredNullability(Nullability.legacy);
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_constraint_gatherer.dart b/pkg/front_end/lib/src/fasta/type_inference/type_constraint_gatherer.dart
index 133297c..4b5d0f8 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_constraint_gatherer.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_constraint_gatherer.dart
@@ -293,7 +293,7 @@
     // it return `true` for both Null and bottom types?  Revisit this once
     // enough functionality is implemented that we can compare the behavior with
     // the old analyzer-based implementation.
-    return type == coreTypes.nullType;
+    return type is NullType;
   }
 
   /// Matches [p] against [q] as a subtype against supertype.
@@ -405,9 +405,7 @@
     // Only if P0 is a subtype match for Q under constraint set C.
     if (isLegacyTypeConstructorApplication(p, _currentLibrary)) {
       return _isNullabilityAwareSubtypeMatch(
-          computeTypeWithoutNullabilityMarker(p, _currentLibrary,
-              nullType: coreTypes.nullType),
-          q,
+          computeTypeWithoutNullabilityMarker(p, _currentLibrary), q,
           constrainSupertype: constrainSupertype);
     }
 
@@ -422,9 +420,7 @@
 
       if ((p is DynamicType || p is VoidType) &&
           _isNullabilityAwareSubtypeMatch(
-              p,
-              computeTypeWithoutNullabilityMarker(q, _currentLibrary,
-                  nullType: coreTypes.nullType),
+              p, computeTypeWithoutNullabilityMarker(q, _currentLibrary),
               constrainSupertype: constrainSupertype)) {
         return true;
       }
@@ -487,17 +483,14 @@
     // Or if P is a subtype match for Q0 under non-empty constraint set C.
     // Or if P is a subtype match for Null under constraint set C.
     // Or if P is a subtype match for Q0 under empty constraint set C.
-    if (isNullableTypeConstructorApplication(q, nullType: coreTypes.nullType)) {
+    if (isNullableTypeConstructorApplication(q)) {
       final int baseConstraintCount = _protoConstraints.length;
-      final DartType rawP = computeTypeWithoutNullabilityMarker(
-          p, _currentLibrary,
-          nullType: coreTypes.nullType);
-      final DartType rawQ = computeTypeWithoutNullabilityMarker(
-          q, _currentLibrary,
-          nullType: coreTypes.nullType);
+      final DartType rawP =
+          computeTypeWithoutNullabilityMarker(p, _currentLibrary);
+      final DartType rawQ =
+          computeTypeWithoutNullabilityMarker(q, _currentLibrary);
 
-      if (isNullableTypeConstructorApplication(p,
-              nullType: coreTypes.nullType) &&
+      if (isNullableTypeConstructorApplication(p) &&
           _isNullabilityAwareSubtypeMatch(rawP, rawQ,
               constrainSupertype: constrainSupertype)) {
         return true;
@@ -521,7 +514,7 @@
       }
       _protoConstraints.length = baseConstraintCount;
 
-      if (_isNullabilityAwareSubtypeMatch(p, coreTypes.nullType,
+      if (_isNullabilityAwareSubtypeMatch(p, const NullType(),
           constrainSupertype: constrainSupertype)) {
         return true;
       }
@@ -553,14 +546,12 @@
     //
     // If P0 is a subtype match for Q under constraint set C1.
     // And if Null is a subtype match for Q under constraint set C2.
-    if (isNullableTypeConstructorApplication(p, nullType: coreTypes.nullType)) {
+    if (isNullableTypeConstructorApplication(p)) {
       final int baseConstraintCount = _protoConstraints.length;
       if (_isNullabilityAwareSubtypeMatch(
-              computeTypeWithoutNullabilityMarker(p, _currentLibrary,
-                  nullType: coreTypes.nullType),
-              q,
+              computeTypeWithoutNullabilityMarker(p, _currentLibrary), q,
               constrainSupertype: constrainSupertype) &&
-          _isNullabilityAwareSubtypeMatch(coreTypes.nullType, q,
+          _isNullabilityAwareSubtypeMatch(const NullType(), q,
               constrainSupertype: constrainSupertype)) {
         return true;
       }
@@ -590,7 +581,7 @@
     // If P is Null, then the match holds under no constraints:
     //
     // Only if Q is nullable.
-    if (p == coreTypes.nullType) {
+    if (p is NullType) {
       return q.nullability == Nullability.nullable;
     }
 
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_inference_engine.dart b/pkg/front_end/lib/src/fasta/type_inference/type_inference_engine.dart
index 7e46518..1a58eb6 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_inference_engine.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_inference_engine.dart
@@ -17,6 +17,7 @@
         Member,
         NamedType,
         NeverType,
+        NullType,
         Nullability,
         Statement,
         TreeNode,
@@ -270,7 +271,7 @@
     } else if (isSubtypeOf(
         type, typeEnvironment.coreTypes.objectNonNullableRawType)) {
       return TypeClassification.nonNullable;
-    } else if (isSubtypeOf(type, typeEnvironment.coreTypes.nullType)) {
+    } else if (isSubtypeOf(type, const NullType())) {
       return TypeClassification.nullOrEquivalent;
     } else {
       return TypeClassification.potentiallyNullable;
@@ -308,7 +309,7 @@
             type.parameter, type.declaredNullability, bound);
       }
       return type;
-    } else if (type == typeEnvironment.nullType) {
+    } else if (type is NullType) {
       return const NeverType(Nullability.nonNullable);
     }
     return type.withDeclaredNullability(Nullability.nonNullable);
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
index 88de58d..d9c7b80 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
@@ -240,7 +240,7 @@
 
   DartType get bottomType => isNonNullableByDefault
       ? const NeverType(Nullability.nonNullable)
-      : engine.coreTypes.nullType;
+      : const NullType();
 
   DartType computeGreatestClosure(DartType type) {
     return greatestClosure(type, const DynamicType(), bottomType);
@@ -256,14 +256,14 @@
   }
 
   DartType computeNullable(DartType type) {
-    if (type == coreTypes.nullType || type is NeverType) {
-      return coreTypes.nullType;
+    if (type is NullType || type is NeverType) {
+      return const NullType();
     }
     return type.withDeclaredNullability(library.nullable);
   }
 
   DartType computeNonNullable(DartType type) {
-    if (type == coreTypes.nullType) {
+    if (type is NullType) {
       return isNonNullableByDefault
           ? const NeverType(Nullability.nonNullable)
           : type;
@@ -392,12 +392,23 @@
       DartType expectedType, ExpressionInferenceResult result,
       {int fileOffset,
       bool isVoidAllowed: false,
-      Template<Message Function(DartType, DartType, bool)> errorTemplate}) {
+      Template<Message Function(DartType, DartType, bool)> errorTemplate,
+      Template<Message Function(DartType, DartType, bool)>
+          nullabilityErrorTemplate,
+      Template<Message Function(DartType, bool)> nullabilityNullErrorTemplate,
+      Template<Message Function(DartType, DartType, bool)>
+          nullabilityNullTypeErrorTemplate,
+      Template<Message Function(DartType, DartType, DartType, DartType, bool)>
+          nullabilityPartErrorTemplate}) {
     return ensureAssignable(
         expectedType, result.inferredType, result.expression,
         fileOffset: fileOffset,
         isVoidAllowed: isVoidAllowed,
-        errorTemplate: errorTemplate);
+        errorTemplate: errorTemplate,
+        nullabilityErrorTemplate: nullabilityErrorTemplate,
+        nullabilityNullErrorTemplate: nullabilityNullErrorTemplate,
+        nullabilityNullTypeErrorTemplate: nullabilityNullTypeErrorTemplate,
+        nullabilityPartErrorTemplate: nullabilityPartErrorTemplate);
   }
 
   /// Ensures that [expressionType] is assignable to [contextType].
@@ -424,9 +435,38 @@
       DartType declaredContextType,
       DartType runtimeCheckedType,
       bool isVoidAllowed: false,
-      Template<Message Function(DartType, DartType, bool)> errorTemplate}) {
+      Template<Message Function(DartType, DartType, bool)> errorTemplate,
+      Template<Message Function(DartType, DartType, bool)>
+          nullabilityErrorTemplate,
+      Template<Message Function(DartType, bool)> nullabilityNullErrorTemplate,
+      Template<Message Function(DartType, DartType, bool)>
+          nullabilityNullTypeErrorTemplate,
+      Template<Message Function(DartType, DartType, DartType, DartType, bool)>
+          nullabilityPartErrorTemplate}) {
     assert(contextType != null);
 
+    // [errorTemplate], [nullabilityErrorTemplate], and
+    // [nullabilityPartErrorTemplate] should be provided together.
+    assert((errorTemplate == null) == (nullabilityErrorTemplate == null) &&
+        (nullabilityErrorTemplate == null) ==
+            (nullabilityPartErrorTemplate == null));
+    // [nullabilityNullErrorTemplate] and [nullabilityNullTypeErrorTemplate]
+    // should be provided together.
+    assert((nullabilityNullErrorTemplate == null) ==
+        (nullabilityNullTypeErrorTemplate == null));
+    errorTemplate ??= templateInvalidAssignmentError;
+    if (nullabilityErrorTemplate == null) {
+      // Use [templateInvalidAssignmentErrorNullabilityNull] only if no
+      // specific [nullabilityErrorTemplate] template was passed.
+      nullabilityNullErrorTemplate ??=
+          templateInvalidAssignmentErrorNullabilityNull;
+    }
+    nullabilityNullTypeErrorTemplate ??= nullabilityErrorTemplate ??
+        templateInvalidAssignmentErrorNullabilityNullType;
+    nullabilityErrorTemplate ??= templateInvalidAssignmentErrorNullability;
+    nullabilityPartErrorTemplate ??=
+        templateInvalidAssignmentErrorPartNullability;
+
     // We don't need to insert assignability checks when doing top level type
     // inference since top level type inference only cares about the type that
     // is inferred (the kernel code is discarded).
@@ -439,14 +479,14 @@
 
     Template<Message Function(DartType, DartType, bool)>
         preciseTypeErrorTemplate = _getPreciseTypeErrorTemplate(expression);
-    AssignabilityKind kind = _computeAssignabilityKind(
+    AssignabilityResult assignabilityResult = _computeAssignabilityKind(
         contextType, expressionType,
         isNonNullableByDefault: isNonNullableByDefault,
         isVoidAllowed: isVoidAllowed,
         isExpressionTypePrecise: preciseTypeErrorTemplate != null);
 
     Expression result;
-    switch (kind) {
+    switch (assignabilityResult.kind) {
       case AssignabilityKind.assignable:
         result = expression;
         break;
@@ -471,8 +511,13 @@
         break;
       case AssignabilityKind.unassignable:
         // Error: not assignable.  Perform error recovery.
-        result = _wrapUnassignableExpression(expression, expressionType,
-            contextType, declaredContextType, errorTemplate);
+        result = _wrapUnassignableExpression(
+            expression,
+            expressionType,
+            contextType,
+            errorTemplate.withArguments(expressionType,
+                declaredContextType ?? contextType, isNonNullableByDefault));
+
         break;
       case AssignabilityKind.unassignableVoid:
         // Error: not assignable.  Perform error recovery.
@@ -496,15 +541,85 @@
             typedTearoff.tearoff,
             typedTearoff.tearoffType,
             contextType,
-            declaredContextType,
-            errorTemplate);
+            errorTemplate.withArguments(typedTearoff.tearoffType,
+                declaredContextType ?? contextType, isNonNullableByDefault));
+
         break;
       case AssignabilityKind.unassignableCantTearoff:
         result = _wrapTearoffErrorExpression(
             expression, contextType, templateNullableTearoffError);
         break;
+      case AssignabilityKind.unassignableNullability:
+        if (expressionType == assignabilityResult.subtype &&
+            contextType == assignabilityResult.supertype) {
+          if (expression is NullLiteral &&
+              nullabilityNullErrorTemplate != null) {
+            result = _wrapUnassignableExpression(
+                expression,
+                expressionType,
+                contextType,
+                nullabilityNullErrorTemplate.withArguments(
+                    declaredContextType ?? contextType,
+                    isNonNullableByDefault));
+          } else if (expressionType is NullType) {
+            result = _wrapUnassignableExpression(
+                expression,
+                expressionType,
+                contextType,
+                nullabilityNullTypeErrorTemplate.withArguments(
+                    expressionType,
+                    declaredContextType ?? contextType,
+                    isNonNullableByDefault));
+          } else {
+            result = _wrapUnassignableExpression(
+                expression,
+                expressionType,
+                contextType,
+                nullabilityErrorTemplate.withArguments(
+                    expressionType,
+                    declaredContextType ?? contextType,
+                    isNonNullableByDefault));
+          }
+        } else {
+          result = _wrapUnassignableExpression(
+              expression,
+              expressionType,
+              contextType,
+              nullabilityPartErrorTemplate.withArguments(
+                  expressionType,
+                  declaredContextType ?? contextType,
+                  assignabilityResult.subtype,
+                  assignabilityResult.supertype,
+                  isNonNullableByDefault));
+        }
+        break;
+      case AssignabilityKind.unassignableNullabilityTearoff:
+        TypedTearoff typedTearoff =
+            _tearOffCall(expression, expressionType, fileOffset);
+        if (expressionType == assignabilityResult.subtype &&
+            contextType == assignabilityResult.supertype) {
+          result = _wrapUnassignableExpression(
+              typedTearoff.tearoff,
+              typedTearoff.tearoffType,
+              contextType,
+              nullabilityErrorTemplate.withArguments(typedTearoff.tearoffType,
+                  declaredContextType ?? contextType, isNonNullableByDefault));
+        } else {
+          result = _wrapUnassignableExpression(
+              typedTearoff.tearoff,
+              typedTearoff.tearoffType,
+              contextType,
+              nullabilityPartErrorTemplate.withArguments(
+                  typedTearoff.tearoffType,
+                  declaredContextType ?? contextType,
+                  assignabilityResult.subtype,
+                  assignabilityResult.supertype,
+                  isNonNullableByDefault));
+        }
+        break;
       default:
-        return unhandled("${kind}", "ensureAssignable", fileOffset, helper.uri);
+        return unhandled("${assignabilityResult}", "ensureAssignable",
+            fileOffset, helper.uri);
     }
 
     return result;
@@ -532,12 +647,8 @@
     return errorNode;
   }
 
-  Expression _wrapUnassignableExpression(
-      Expression expression,
-      DartType expressionType,
-      DartType contextType,
-      DartType declaredContextType,
-      Template<Message Function(DartType, DartType, bool)> template) {
+  Expression _wrapUnassignableExpression(Expression expression,
+      DartType expressionType, DartType contextType, Message message) {
     Expression errorNode = new AsExpression(
         expression,
         // TODO(ahe): The outline phase doesn't correctly remove invalid
@@ -550,13 +661,7 @@
       ..fileOffset = expression.fileOffset;
     if (contextType is! InvalidType && expressionType is! InvalidType) {
       errorNode = helper.wrapInProblem(
-          errorNode,
-          (template ?? templateInvalidAssignmentError).withArguments(
-              expressionType,
-              declaredContextType ?? contextType,
-              isNonNullableByDefault),
-          errorNode.fileOffset,
-          noLength);
+          errorNode, message, errorNode.fileOffset, noLength);
     }
     return errorNode;
   }
@@ -590,7 +695,7 @@
   /// Computes the assignability kind of [expressionType] to [contextType].
   ///
   /// The computation is side-effect free.
-  AssignabilityKind _computeAssignabilityKind(
+  AssignabilityResult _computeAssignabilityKind(
       DartType contextType, DartType expressionType,
       {bool isNonNullableByDefault,
       bool isVoidAllowed,
@@ -611,7 +716,8 @@
         if (_shouldTearOffCall(contextType, expressionType)) {
           needsTearoff = true;
           if (isNonNullableByDefault && expressionType.isPotentiallyNullable) {
-            return AssignabilityKind.unassignableCantTearoff;
+            return const AssignabilityResult(
+                AssignabilityKind.unassignableCantTearoff);
           }
           expressionType =
               getGetterTypeForMemberTarget(callMember, expressionType)
@@ -621,20 +727,18 @@
     }
 
     if (expressionType is VoidType && !isVoidAllowed) {
-      return AssignabilityKind.unassignableVoid;
+      return const AssignabilityResult(AssignabilityKind.unassignableVoid);
     }
 
-    {
-      IsSubtypeOf result = typeSchemaEnvironment
-          .performNullabilityAwareSubtypeCheck(expressionType, contextType);
-      bool isDirectlyAssignable = isNonNullableByDefault
-          ? result.isSubtypeWhenUsingNullabilities()
-          : result.isSubtypeWhenIgnoringNullabilities();
-      if (isDirectlyAssignable) {
-        return needsTearoff
-            ? AssignabilityKind.assignableTearoff
-            : AssignabilityKind.assignable;
-      }
+    IsSubtypeOf isDirectSubtypeResult = typeSchemaEnvironment
+        .performNullabilityAwareSubtypeCheck(expressionType, contextType);
+    bool isDirectlyAssignable = isNonNullableByDefault
+        ? isDirectSubtypeResult.isSubtypeWhenUsingNullabilities()
+        : isDirectSubtypeResult.isSubtypeWhenIgnoringNullabilities();
+    if (isDirectlyAssignable) {
+      return needsTearoff
+          ? const AssignabilityResult(AssignabilityKind.assignableTearoff)
+          : const AssignabilityResult(AssignabilityKind.assignable);
     }
 
     bool isIndirectlyAssignable = isNonNullableByDefault
@@ -643,23 +747,36 @@
             .performNullabilityAwareSubtypeCheck(contextType, expressionType)
             .isSubtypeWhenIgnoringNullabilities();
     if (!isIndirectlyAssignable) {
-      return needsTearoff
-          ? AssignabilityKind.unassignableTearoff
-          : AssignabilityKind.unassignable;
+      if (isNonNullableByDefault &&
+          isDirectSubtypeResult.isSubtypeWhenIgnoringNullabilities()) {
+        return needsTearoff
+            ? new AssignabilityResult.withTypes(
+                AssignabilityKind.unassignableNullabilityTearoff,
+                isDirectSubtypeResult.subtype,
+                isDirectSubtypeResult.supertype)
+            : new AssignabilityResult.withTypes(
+                AssignabilityKind.unassignableNullability,
+                isDirectSubtypeResult.subtype,
+                isDirectSubtypeResult.supertype);
+      } else {
+        return needsTearoff
+            ? const AssignabilityResult(AssignabilityKind.unassignableTearoff)
+            : const AssignabilityResult(AssignabilityKind.unassignable);
+      }
     }
     if (isExpressionTypePrecise) {
       // The type of the expression is known precisely, so an implicit
       // downcast is guaranteed to fail.  Insert a compile-time error.
-      return AssignabilityKind.unassignablePrecise;
+      return const AssignabilityResult(AssignabilityKind.unassignablePrecise);
     }
     // Insert an implicit downcast.
     return needsTearoff
-        ? AssignabilityKind.assignableTearoffCast
-        : AssignabilityKind.assignableCast;
+        ? const AssignabilityResult(AssignabilityKind.assignableTearoffCast)
+        : const AssignabilityResult(AssignabilityKind.assignableCast);
   }
 
   bool isNull(DartType type) {
-    return type is InterfaceType && type.classNode == coreTypes.nullClass;
+    return type is NullType;
   }
 
   /// Computes the type arguments for an access to an extension instance member
@@ -877,9 +994,12 @@
             // potentially nullable access.
             isPotentiallyNullable: false);
       }
-      if (includeExtensionMethods) {
+      if (includeExtensionMethods && receiverBound is! DynamicType) {
         ObjectAccessTarget target = _findExtensionMember(
-            receiverBound, coreTypes.objectClass, name, fileOffset,
+            isNonNullableByDefault ? receiverType : receiverBound,
+            coreTypes.objectClass,
+            name,
+            fileOffset,
             setter: setter);
         if (target != null) {
           return target;
@@ -898,7 +1018,7 @@
         case Nullability.nullable:
         case Nullability.legacy:
           // Never? and Never* are equivalent to Null.
-          return findInterfaceMember(coreTypes.nullType, name, fileOffset);
+          return findInterfaceMember(const NullType(), name, fileOffset);
         case Nullability.undetermined:
           return internalProblem(
               templateInternalProblemUnsupportedNullability.withArguments(
@@ -946,14 +1066,23 @@
         // error message that the extension member exists but that the access is
         // invalid.
         target = _findExtensionMember(
-            computeNonNullable(receiverBound), classNode, name, fileOffset,
+            isNonNullableByDefault
+                ? computeNonNullable(receiverType)
+                : computeNonNullable(receiverBound),
+            classNode,
+            name,
+            fileOffset,
             setter: setter,
             defaultTarget: target,
             isPotentiallyNullableAccess: true);
       } else {
         target = _findExtensionMember(
-            receiverBound, classNode, name, fileOffset,
-            setter: setter, defaultTarget: target);
+            isNonNullableByDefault ? receiverType : receiverBound,
+            classNode,
+            name,
+            fileOffset,
+            setter: setter,
+            defaultTarget: target);
       }
     }
     return target;
@@ -1483,9 +1612,7 @@
       assert(isTopLevel, "No initializer type provided.");
       return null;
     }
-    if (initializerType is BottomType ||
-        (initializerType is InterfaceType &&
-            initializerType.classNode == coreTypes.nullClass)) {
+    if (initializerType is BottomType || initializerType is NullType) {
       // If the initializer type is Null or bottom, the inferred type is
       // dynamic.
       // TODO(paulberry): this rule is inherited from analyzer behavior but is
@@ -2041,7 +2168,15 @@
               isVoidAllowed: expectedType is VoidType,
               // TODO(johnniwinther): Specialize message for operator
               // invocations.
-              errorTemplate: templateArgumentTypeNotAssignable);
+              errorTemplate: templateArgumentTypeNotAssignable,
+              nullabilityErrorTemplate:
+                  templateArgumentTypeNotAssignableNullability,
+              nullabilityPartErrorTemplate:
+                  templateArgumentTypeNotAssignablePartNullability,
+              nullabilityNullErrorTemplate:
+                  templateArgumentTypeNotAssignableNullabilityNull,
+              nullabilityNullTypeErrorTemplate:
+                  templateArgumentTypeNotAssignableNullabilityNullType);
           if (namedExpression == null) {
             arguments.positional[positionalShift + i] = expression
               ..parent = arguments;
@@ -2169,7 +2304,7 @@
               substitution.substituteType(formalTypesFromContext[i]));
           if (typeSchemaEnvironment.isSubtypeOf(
               inferredType,
-              coreTypes.nullType,
+              const NullType(),
               isNonNullableByDefault
                   ? SubtypeCheckMode.withNullabilities
                   : SubtypeCheckMode.ignoringNullabilities)) {
@@ -4229,6 +4364,25 @@
 
   /// Unassignable because the tear-off can't be done on the nullable receiver.
   unassignableCantTearoff,
+
+  /// Unassignable only because of nullability modifiers.
+  unassignableNullability,
+
+  /// Unassignable because of nullability and needs a tearoff of "call" for
+  /// better error reporting.
+  unassignableNullabilityTearoff,
+}
+
+class AssignabilityResult {
+  final AssignabilityKind kind;
+  final DartType subtype; // Can be null.
+  final DartType supertype; // Can be null.
+
+  const AssignabilityResult(this.kind)
+      : subtype = null,
+        supertype = null;
+
+  AssignabilityResult.withTypes(this.kind, this.subtype, this.supertype);
 }
 
 /// Convenient way to return both a tear-off expression and its type.
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_schema_elimination.dart b/pkg/front_end/lib/src/fasta/type_inference/type_schema_elimination.dart
index 6401112..e6338be 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_schema_elimination.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_schema_elimination.dart
@@ -80,10 +80,7 @@
             topType.classNode.enclosingLibrary.importUri.path == "core" &&
             topType.classNode.name == "Object");
     assert(bottomType == const NeverType(Nullability.nonNullable) ||
-        bottomType is InterfaceType &&
-            bottomType.classNode.enclosingLibrary.importUri.scheme == "dart" &&
-            bottomType.classNode.enclosingLibrary.importUri.path == "core" &&
-            bottomType.classNode.name == "Null");
+        bottomType is NullType);
     _TypeSchemaEliminationVisitor visitor =
         new _TypeSchemaEliminationVisitor(isLeastClosure, topType, bottomType);
     DartType result = schema.accept(visitor);
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_schema_environment.dart b/pkg/front_end/lib/src/fasta/type_inference/type_schema_environment.dart
index d467fb7..59cbd3c 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_schema_environment.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_schema_environment.dart
@@ -267,7 +267,7 @@
         returnContextType = new TypeVariableEliminator(
                 clientLibrary.isNonNullableByDefault
                     ? const NeverType(Nullability.nonNullable)
-                    : nullType,
+                    : const NullType(),
                 clientLibrary.isNonNullableByDefault
                     ? objectNullableRawType
                     : objectLegacyRawType)
@@ -431,7 +431,7 @@
       TypeConstraint constraint, DartType topType, DartType bottomType,
       {bool grounded: false, bool isContravariant: false}) {
     assert(bottomType == const NeverType(Nullability.nonNullable) ||
-        bottomType == coreTypes.nullType);
+        bottomType == const NullType());
     if (!isContravariant) {
       // Prefer the known bound, if any.
       if (isKnown(constraint.lower)) return constraint.lower;
@@ -504,7 +504,7 @@
             : const DynamicType(),
         clientLibrary.isNonNullableByDefault
             ? const NeverType(Nullability.nonNullable)
-            : nullType,
+            : const NullType(),
         grounded: true,
         isContravariant: isContravariant);
   }
@@ -518,7 +518,7 @@
             : const DynamicType(),
         clientLibrary.isNonNullableByDefault
             ? const NeverType(Nullability.nonNullable)
-            : nullType);
+            : const NullType());
     if (!isKnown(t)) {
       return t;
     }
@@ -540,7 +540,7 @@
               : const DynamicType(),
           clientLibrary.isNonNullableByDefault
               ? const NeverType(Nullability.nonNullable)
-              : nullType);
+              : const NullType());
     }
     return t;
   }
diff --git a/pkg/front_end/lib/src/kernel_generator_impl.dart b/pkg/front_end/lib/src/kernel_generator_impl.dart
index 76a3697..24b5b55 100644
--- a/pkg/front_end/lib/src/kernel_generator_impl.dart
+++ b/pkg/front_end/lib/src/kernel_generator_impl.dart
@@ -5,8 +5,6 @@
 /// Defines the front-end API for converting source code to Dart Kernel objects.
 library front_end.kernel_generator_impl;
 
-import 'dart:async' show Future;
-
 import 'package:_fe_analyzer_shared/src/messages/severity.dart' show Severity;
 
 import 'package:kernel/kernel.dart'
@@ -126,7 +124,7 @@
       trimmedSummaryComponent.uriToSource.addAll(summaryComponent.uriToSource);
 
       NonNullableByDefaultCompiledMode compiledMode =
-          NonNullableByDefaultCompiledMode.Disabled;
+          NonNullableByDefaultCompiledMode.Weak;
       switch (options.nnbdMode) {
         case NnbdMode.Weak:
           compiledMode = NonNullableByDefaultCompiledMode.Weak;
@@ -138,6 +136,9 @@
           compiledMode = NonNullableByDefaultCompiledMode.Agnostic;
           break;
       }
+      if (kernelTarget.loader.hasInvalidNnbdModeLibrary) {
+        compiledMode = NonNullableByDefaultCompiledMode.Invalid;
+      }
 
       trimmedSummaryComponent.setMainMethodAndMode(
           trimmedSummaryComponent.mainMethodName, false, compiledMode);
diff --git a/pkg/front_end/lib/src/testing/compiler_common.dart b/pkg/front_end/lib/src/testing/compiler_common.dart
index 0f698a84..3164c83 100644
--- a/pkg/front_end/lib/src/testing/compiler_common.dart
+++ b/pkg/front_end/lib/src/testing/compiler_common.dart
@@ -5,8 +5,6 @@
 /// Common compiler options and helper functions used for testing.
 library front_end.testing.compiler_options_common;
 
-import 'dart:async' show Future;
-
 import 'package:kernel/ast.dart' show Library, Component;
 
 import '../api_prototype/front_end.dart'
diff --git a/pkg/front_end/lib/src/testing/id_testing_helper.dart b/pkg/front_end/lib/src/testing/id_testing_helper.dart
index 92502bf..52c8586 100644
--- a/pkg/front_end/lib/src/testing/id_testing_helper.dart
+++ b/pkg/front_end/lib/src/testing/id_testing_helper.dart
@@ -29,21 +29,27 @@
 /// Test configuration used for testing CFE in its default state.
 const TestConfig defaultCfeConfig = const TestConfig(cfeMarker, 'cfe');
 
+/// Test configuration used for testing CFE without nnbd in addition to the
+/// default state.
+const TestConfig cfeNoNonNullableConfig = const TestConfig(
+    cfeMarker, 'cfe without nnbd',
+    explicitExperimentalFlags: const {ExperimentalFlag.nonNullable: false});
+
 /// Test configuration used for testing CFE with nnbd in addition to the
 /// default state.
 const TestConfig cfeNonNullableConfig = const TestConfig(
     cfeWithNnbdMarker, 'cfe with nnbd',
-    experimentalFlags: const {ExperimentalFlag.nonNullable: true});
+    explicitExperimentalFlags: const {ExperimentalFlag.nonNullable: true});
 
 /// Test configuration used for testing CFE with nnbd as the default state.
 const TestConfig cfeNonNullableOnlyConfig = const TestConfig(
     cfeMarker, 'cfe with nnbd',
-    experimentalFlags: const {ExperimentalFlag.nonNullable: true});
+    explicitExperimentalFlags: const {ExperimentalFlag.nonNullable: true});
 
 class TestConfig {
   final String marker;
   final String name;
-  final Map<ExperimentalFlag, bool> experimentalFlags;
+  final Map<ExperimentalFlag, bool> explicitExperimentalFlags;
   final AllowedExperimentalFlags allowedExperimentalFlags;
   final Uri librariesSpecificationUri;
   // TODO(johnniwinther): Tailor support to redefine selected platform
@@ -53,7 +59,7 @@
   final NnbdMode nnbdMode;
 
   const TestConfig(this.marker, this.name,
-      {this.experimentalFlags = const {},
+      {this.explicitExperimentalFlags = const {},
       this.allowedExperimentalFlags,
       this.librariesSpecificationUri,
       this.compileSdk: false,
@@ -300,7 +306,7 @@
   };
   options.debugDump = printCode;
   options.target = new NoneTarget(config.targetFlags);
-  options.experimentalFlags.addAll(config.experimentalFlags);
+  options.explicitExperimentalFlags.addAll(config.explicitExperimentalFlags);
   options.allowedExperimentalFlagsForTesting = config.allowedExperimentalFlags;
   options.nnbdMode = config.nnbdMode;
   if (config.librariesSpecificationUri != null) {
diff --git a/pkg/front_end/lib/src/testing/id_testing_utils.dart b/pkg/front_end/lib/src/testing/id_testing_utils.dart
index 2d8e634..1b71339 100644
--- a/pkg/front_end/lib/src/testing/id_testing_utils.dart
+++ b/pkg/front_end/lib/src/testing/id_testing_utils.dart
@@ -467,6 +467,10 @@
     }
   }
 
+  void visitNullType(NullType node) {
+    sb.write('Null');
+  }
+
   void visitInterfaceType(InterfaceType node) {
     sb.write(node.classNode.name);
     if (node.typeArguments.isNotEmpty) {
@@ -570,11 +574,7 @@
 }
 
 /// Returns `true` if [type] is `Null` from `dart:core`.
-bool isNull(DartType type) {
-  return type is InterfaceType &&
-      type.classNode.name == 'Null' &&
-      '${type.classNode.enclosingLibrary.importUri}' == 'dart:core';
-}
+bool isNull(DartType type) => type is NullType;
 
 /// Returns a textual representation of the [typeParameter] to be used in
 /// testing.
diff --git a/pkg/front_end/lib/widget_cache.dart b/pkg/front_end/lib/widget_cache.dart
index 158125b..5c9f6d3 100644
--- a/pkg/front_end/lib/widget_cache.dart
+++ b/pkg/front_end/lib/widget_cache.dart
@@ -14,7 +14,7 @@
   WidgetCache(Component fullComponent) {
     Library frameworkLibrary;
     for (Library library in fullComponent.libraries) {
-      if (library?.importUri?.path == 'flutter/src/widgets/framework.dart') {
+      if (library?.importUri == _frameworkLibrary) {
         frameworkLibrary = library;
         break;
       }
@@ -22,15 +22,7 @@
     if (frameworkLibrary == null) {
       return;
     }
-    for (Class classDeclaration in frameworkLibrary.classes) {
-      if (classDeclaration.name == _statelessWidgetClassName) {
-        _statelessWidget = classDeclaration;
-      } else if (classDeclaration.name == _statefulWidgetClassName) {
-        _statefulWidget = classDeclaration;
-      } else if (classDeclaration.name == _stateClassName) {
-        _state = classDeclaration;
-      }
-    }
+    _locatedClassDeclarations(frameworkLibrary);
     _frameworkTypesLocated =
         _statefulWidget != null && _state != null && _statelessWidget != null;
   }
@@ -44,6 +36,9 @@
   Class _statefulWidget;
   bool _frameworkTypesLocated = false;
 
+  static final Uri _frameworkLibrary =
+      Uri.parse('package:flutter/src/widgets/framework.dart');
+
   /// Mark [uri] as invalidated.
   void invalidate(Uri uri) {
     _invalidatedLibraries.add(uri);
@@ -126,9 +121,17 @@
       return null;
     }
 
+    // Update the class references to stateless, stateful, and state classes.
+    for (Library library in classHierarchy.knownLibraries) {
+      if (library?.importUri == _frameworkLibrary) {
+        _locatedClassDeclarations(library);
+      }
+    }
+
     if (classHierarchy.isSubclassOf(newClass, _statelessWidget) ||
         classHierarchy.isSubclassOf(newClass, _statefulWidget)) {
-      if (_hasSubClasses(newClass, partialComponent, classHierarchy)) {
+      if (classHierarchy.isExtended(newClass) ||
+          classHierarchy.isUsedAsMixin(newClass)) {
         return null;
       }
       return newClass.name;
@@ -150,8 +153,8 @@
         if (statefulWidgetType.name == _statefulWidgetClassName) {
           return null;
         }
-        if (_hasSubClasses(
-            statefulWidgetType, partialComponent, classHierarchy)) {
+        if (classHierarchy.isExtended(statefulWidgetType) ||
+            classHierarchy.isUsedAsMixin(statefulWidgetType)) {
           return null;
         }
         return statefulWidgetType.name;
@@ -161,22 +164,6 @@
     return null;
   }
 
-  /// Checks whether the class [node] has any subclasses.
-  bool _hasSubClasses(
-      Class node, Component component, ClassHierarchy classHierarchy) {
-    for (Library library in component.libraries) {
-      for (Class otherClass in library.classes) {
-        if (identical(otherClass, node)) {
-          continue;
-        }
-        if (classHierarchy.isSubclassOf(otherClass, node)) {
-          return true;
-        }
-      }
-    }
-    return false;
-  }
-
   // Locate the that fully contains the edit range, or null.
   Class _locateContainingClass(
       Library library, int startOffset, int endOffset) {
@@ -188,4 +175,16 @@
     }
     return null;
   }
+
+  void _locatedClassDeclarations(Library library) {
+    for (Class classDeclaration in library.classes) {
+      if (classDeclaration.name == _statelessWidgetClassName) {
+        _statelessWidget = classDeclaration;
+      } else if (classDeclaration.name == _statefulWidgetClassName) {
+        _statefulWidget = classDeclaration;
+      } else if (classDeclaration.name == _stateClassName) {
+        _state = classDeclaration;
+      }
+    }
+  }
 }
diff --git a/pkg/front_end/messages.status b/pkg/front_end/messages.status
index 5679493..2fe29ec 100644
--- a/pkg/front_end/messages.status
+++ b/pkg/front_end/messages.status
@@ -6,14 +6,19 @@
 # always be fixed by either spelling correctly or updating the dictionary.
 
 AbstractClassInstantiation/example: Fail
-AbstractFieldConstructorInitializer/analyzerCode: Fail
-AbstractFieldInitializer/analyzerCode: Fail
 AbstractExtensionField/analyzerCode: Fail
 AbstractExtensionField/example: Fail
+AbstractFieldConstructorInitializer/analyzerCode: Fail
+AbstractFieldInitializer/analyzerCode: Fail
 AbstractNotSync/example: Fail
 AbstractRedirectedClassInstantiation/example: Fail
 AccessError/analyzerCode: Fail
 AccessError/example: Fail
+AgnosticWithStrongDillLibrary/analyzerCode: Fail
+AgnosticWithStrongDillLibrary/example: Fail
+AgnosticWithWeakDillLibrary/analyzerCode: Fail
+AgnosticWithWeakDillLibrary/example: Fail
+AgnosticWithWeakDillLibrary/spelling: Fail
 AmbiguousExtensionMethod/analyzerCode: Fail
 AmbiguousExtensionOperator/analyzerCode: Fail
 AmbiguousExtensionProperty/analyzerCode: Fail
@@ -24,7 +29,6 @@
 AnonymousBreakTargetOutsideFunction/statement: Fail # Duplicated error as parser also complains.
 AnonymousContinueTargetOutsideFunction/part_wrapped_statement: Fail
 AnonymousContinueTargetOutsideFunction/statement: Fail # Duplicated error as parser also complains.
-ArgumentTypeNotAssignable/example: Fail
 AssertAsExpression/analyzerCode: Fail
 AssertAsExpression/example: Fail
 AssertExtraneousArgument/analyzerCode: Fail
@@ -63,6 +67,7 @@
 CantUsePrefixWithNullAware/part_wrapped_script: Fail # Importing file in the (now) part.
 CantUseSuperBoundedTypeForInstanceCreation/analyzerCode: Fail
 CantUseSuperBoundedTypeForInstanceCreation/example: Fail
+ClassInNullAwareReceiver/analyzerCode: Fail
 ColonInPlaceOfIn/example: Fail
 ConflictingModifiers/part_wrapped_script1: Fail
 ConflictingModifiers/script1: Fail
@@ -117,10 +122,10 @@
 ConstEvalNegativeShift/analyzerCode: Fail # http://dartbug.com/33481
 ConstEvalNegativeShift/example: Fail
 ConstEvalNonConstantVariableGet/example: Fail
-ConstEvalNotListOrSetInSpread/example: Fail
-ConstEvalNotMapInSpread/example: Fail
 ConstEvalNonNull/analyzerCode: Fail
 ConstEvalNonNull/example: Fail
+ConstEvalNotListOrSetInSpread/example: Fail
+ConstEvalNotMapInSpread/example: Fail
 ConstEvalNullValue/example: Fail
 ConstEvalStartingPoint/analyzerCode: Fail # This is just used for displaying the starting point.
 ConstEvalStartingPoint/example: Fail # This is just used for displaying the starting point.
@@ -187,8 +192,6 @@
 DuplicatedNamedArgument/example: Fail
 DuplicatedParameterName/example: Fail
 DuplicatePrefix/example: Fail
-ExceptionReadingFile/analyzerCode: Fail
-ExceptionReadingFile/example: Fail
 Encoding/analyzerCode: Fail
 EnumConstantSameNameAsEnclosing/example: Fail
 EnumInstantiation/example: Fail
@@ -196,6 +199,8 @@
 EqualityCannotBeEqualityOperand/part_wrapped_script2: Fail
 EqualityCannotBeEqualityOperand/script1: Fail
 EqualityCannotBeEqualityOperand/script2: Fail
+ExceptionReadingFile/analyzerCode: Fail
+ExceptionReadingFile/example: Fail
 ExpectedBlock/part_wrapped_script: Fail
 ExpectedBlock/script: Fail
 ExpectedBlockToSkip/part_wrapped_script: Fail
@@ -221,6 +226,8 @@
 ExpectedType/example: Fail
 ExpectedUri/analyzerCode: Fail
 ExpectedUri/example: Fail
+ExperimentDisabled/example: Fail
+ExperimentDisabledInvalidLanguageVersion/example: Fail
 ExperimentNotEnabled/example: Fail
 ExperimentNotEnabledNoFlag/example: Fail
 ExperimentNotEnabledNoFlagInvalidLanguageVersion/example: Fail
@@ -278,6 +285,7 @@
 ExtraneousModifier/part_wrapped_script3: Fail
 ExtraneousModifier/part_wrapped_script4: Fail
 ExtraneousModifier/part_wrapped_script5: Fail
+ExtraneousModifier/part_wrapped_script6: Fail # Fails because two errors are given. Only one should be given though.
 ExtraneousModifier/part_wrapped_script7: Fail
 ExtraneousModifier/part_wrapped_script8: Fail
 ExtraneousModifier/part_wrapped_script9: Fail
@@ -295,6 +303,7 @@
 ExtraneousModifier/script3: Fail
 ExtraneousModifier/script4: Fail
 ExtraneousModifier/script5: Fail
+ExtraneousModifier/script6: Fail # Fails because two errors are given. Only one should be given though.
 ExtraneousModifier/script7: Fail
 ExtraneousModifier/script8: Fail
 ExtraneousModifier/script9: Fail
@@ -334,14 +343,13 @@
 FinalAndCovariant/part_wrapped_script2: Fail
 FinalAndCovariant/script2: Fail
 FinalFieldWithoutInitializer/example: Fail
-ForInLoopElementTypeNotAssignable/example: Fail
 ForInLoopExactlyOneVariable/analyzerCode: Fail # The analyzer doesn't recover well.
 ForInLoopExactlyOneVariable/part_wrapped_statement: Fail
 ForInLoopExactlyOneVariable/statement: Fail # Fasta reports too many errors.
 ForInLoopNotAssignable/analyzerCode: Fail # The analyzer reports a different error.
 ForInLoopNotAssignable/part_wrapped_statement: Fail
 ForInLoopNotAssignable/statement: Fail
-ForInLoopTypeNotIterable/example: Fail
+ForInLoopTypeNotIterablePartNullability/example: Fail # Cannot occur but needed for symmetry with ForInLoopTypeNotIterableNullability
 ForInLoopWithConstVariable/example: Fail
 FunctionTypeDefaultValue/example: Fail
 FunctionTypedParameterVar/part_wrapped_script1: Fail
@@ -393,6 +401,10 @@
 IncorrectTypeArgumentQualifiedInferredWarning/example: Fail
 IncorrectTypeArgumentQualifiedWarning/example: Fail
 IncorrectTypeArgumentWarning/example: Fail
+IncrementalCompilerIllegalParameter/analyzerCode: Fail
+IncrementalCompilerIllegalParameter/example: Fail
+IncrementalCompilerIllegalTypeParameter/analyzerCode: Fail
+IncrementalCompilerIllegalTypeParameter/example: Fail
 InitializerForStaticField/example: Fail
 InitializerOutsideConstructor/example: Fail
 InputFileNotFound/analyzerCode: Fail
@@ -431,10 +443,20 @@
 InvalidGetterSetterTypeSetterInheritedGetter/analyzerCode: Fail
 InvalidGetterSetterTypeSetterInheritedGetterLegacy/analyzerCode: Fail
 InvalidInitializer/example: Fail
+InvalidNnbdDillLibrary/analyzerCode: Fail
+InvalidNnbdDillLibrary/example: Fail
 InvalidPackageUri/analyzerCode: Fail
 InvalidPackageUri/example: Fail
 InvalidReturn/analyzerCode: Fail
 InvalidReturnAsync/analyzerCode: Fail
+InvalidReturnAsyncNullability/analyzerCode: Fail
+InvalidReturnAsyncNullabilityNull/analyzerCode: Fail
+InvalidReturnAsyncNullabilityNullType/analyzerCode: Fail
+InvalidReturnAsyncPartNullability/analyzerCode: Fail
+InvalidReturnNullability/analyzerCode: Fail
+InvalidReturnNullabilityNull/analyzerCode: Fail
+InvalidReturnNullabilityNullType/analyzerCode: Fail
+InvalidReturnPartNullability/analyzerCode: Fail
 InvalidSuperInInitializer/example: Fail
 InvalidThisInInitializer/example: Fail
 InvalidTypeVariableInSupertype/analyzerCode: Fail
@@ -454,10 +476,14 @@
 InvalidVoid/script2: Fail
 JsInteropAnonymousFactoryPositionalParameters/analyzerCode: Fail # Web compiler specific
 JsInteropAnonymousFactoryPositionalParameters/example: Fail # Web compiler specific
+JsInteropDartClassExtendsJSClass/analyzerCode: Fail # Web compiler specific
+JsInteropDartClassExtendsJSClass/example: Fail # Web compiler specific
 JsInteropEnclosingClassJSAnnotation/analyzerCode: Fail # Web compiler specific
 JsInteropEnclosingClassJSAnnotation/example: Fail # Web compiler specific
 JsInteropIndexNotSupported/analyzerCode: Fail # Web compiler specific
 JsInteropIndexNotSupported/example: Fail # Web compiler specific
+JsInteropJSClassExtendsDartClass/analyzerCode: Fail # Web compiler specific
+JsInteropJSClassExtendsDartClass/example: Fail # Web compiler specific
 JsInteropNamedParameters/analyzerCode: Fail # Web compiler specific
 JsInteropNamedParameters/example: Fail # Web compiler specific
 JsInteropNonExternalConstructor/analyzerCode: Fail # Web compiler specific
@@ -690,6 +716,9 @@
 StrongModeNNBDButOptOut/example: Fail
 StrongModeNNBDPackageOptOut/analyzerCode: Fail
 StrongModeNNBDPackageOptOut/example: Fail
+StrongWithWeakDillLibrary/analyzerCode: Fail
+StrongWithWeakDillLibrary/example: Fail
+StrongWithWeakDillLibrary/spelling: Fail
 SuperAsExpression/example: Fail
 SuperAsIdentifier/example: Fail
 SuperclassHasNoDefaultConstructor/example: Fail
@@ -711,6 +740,7 @@
 SyntheticToken/example: Fail # Can't be tested, used to recover from other errors.
 ThisAccessInFieldInitializer/example: Fail
 ThisAsIdentifier/example: Fail
+ThisInNullAwareReceiver/analyzerCode: Fail
 ThisOrSuperAccessInFieldInitializer/example: Fail
 ThrowingNotAssignableToObjectError/analyzerCode: Fail
 ThrowingNotAssignableToObjectError/example: Fail
@@ -759,6 +789,8 @@
 ValueForRequiredParameterNotProvidedWarning/example: Fail
 VarAsTypeName/part_wrapped_script1: Fail
 VarAsTypeName/script1: Fail # Too many problems
+WeakWithStrongDillLibrary/analyzerCode: Fail
+WeakWithStrongDillLibrary/example: Fail
 WebLiteralCannotBeRepresentedExactly/analyzerCode: Fail
 WebLiteralCannotBeRepresentedExactly/example: Fail
 YieldAsIdentifier/example: Fail
diff --git a/pkg/front_end/messages.yaml b/pkg/front_end/messages.yaml
index df50caa..4e6e901 100644
--- a/pkg/front_end/messages.yaml
+++ b/pkg/front_end/messages.yaml
@@ -265,6 +265,15 @@
   tip: "You can enable the experiment using the '--enable-experiment=non-nullable' command line option."
   analyzerCode: ParserErrorCode.EXPERIMENT_NOT_ENABLED
 
+ExperimentDisabled:
+  template: "This requires the '#string' language feature to be enabled."
+  tip: "The feature is on by default but is currently disabled, maybe because the '--enable-experiment=no-#string' command line option is passed."
+  analyzerCode: ParserErrorCode.EXPERIMENT_NOT_ENABLED
+
+ExperimentDisabledInvalidLanguageVersion:
+  template: "This requires the null safety language feature, which requires language version of #string2 or higher."
+  analyzerCode: ParserErrorCode.EXPERIMENT_NOT_ENABLED
+
 EmptyNamedParameterList:
   template: "Named parameter lists cannot be empty."
   tip: "Try adding a named parameter to the list."
@@ -1316,7 +1325,7 @@
 
 StrongModeNNBDPackageOptOut:
   template:  |
-    Cannot run with sound null safety as one or more dependencies do not
+    This project cannot run with sound null safety, because one or more project dependencies do not
     support null safety:
 
     #names
@@ -1324,6 +1333,21 @@
     Run 'pub outdated --mode=null-safety' to determine if versions of your
     dependencies supporting null safety are available.
 
+WeakWithStrongDillLibrary:
+  template: "Loaded library is compiled with sound null safety and cannot be used in compilation for unsound null safety."
+
+StrongWithWeakDillLibrary:
+  template: "Loaded library is compiled with unsound null safety and cannot be used in compilation for sound null safety."
+
+AgnosticWithStrongDillLibrary:
+  template: "Loaded library is compiled with sound null safety and cannot be used in compilation for agnostic null safety."
+
+AgnosticWithWeakDillLibrary:
+  template: "Loaded library is compiled with unsound null safety and cannot be used in compilation for agnostic null safety."
+
+InvalidNnbdDillLibrary:
+  template: "Trying to use library with invalid null safety."
+
 AbstractNotSync:
   template: "Abstract methods can't use 'async', 'async*', or 'sync*'."
   analyzerCode: NON_SYNC_ABSTRACT_METHOD
@@ -1738,9 +1762,6 @@
       --omit-platform
         Exclude the platform from the serialized dill file.
 
-      --bytecode
-        Generate bytecode. Supported only for SDK platform compilation.
-
       --exclude-source
         Do not include source code in the dill file.
 
@@ -1892,6 +1913,12 @@
   template: "Unsupported nullability value '#string' on type '#type'."
   severity: INTERNAL_PROBLEM
 
+IncrementalCompilerIllegalParameter:
+  template: "Illegal parameter name '#string' found during expression compilation."
+  
+IncrementalCompilerIllegalTypeParameter:
+  template: "Illegal type parameter name '#string' found during expression compilation."
+
 LocalDefinitionHidesExport:
   template: "Local definition of '#name' hides export from '#uri'."
   severity: IGNORED
@@ -3263,6 +3290,54 @@
 ArgumentTypeNotAssignable:
   template: "The argument type '#type' can't be assigned to the parameter type '#type2'."
   analyzerCode: ARGUMENT_TYPE_NOT_ASSIGNABLE
+  script: >
+    method(int i) {}
+    main() {
+      method(1.5);
+    }
+
+ArgumentTypeNotAssignableNullability:
+  template: "The argument type '#type' can't be assigned to the parameter type '#type2' because '#type' is nullable and '#type2' isn't."
+  analyzerCode: ARGUMENT_TYPE_NOT_ASSIGNABLE
+  configuration: nnbd-strong
+  script: >
+    method(int i) {}
+    main() {
+      int? j = null;
+      method(j);
+    }
+
+ArgumentTypeNotAssignablePartNullability:
+  template: "The argument type '#type' can't be assigned to the parameter type '#type2' because '#type3' is nullable and '#type4' isn't."
+  analyzerCode: ARGUMENT_TYPE_NOT_ASSIGNABLE
+  configuration: nnbd-strong
+  script: >
+    method(List<int> i) {}
+    main() {
+      List<int?> j = [null];
+      method(j);
+    }
+
+ArgumentTypeNotAssignableNullabilityNull:
+  template: "The value 'null' can't be assigned to the parameter type '#type' because '#type' is not nullable."
+  analyzerCode: ARGUMENT_TYPE_NOT_ASSIGNABLE
+  configuration: nnbd-strong
+  script: >
+    method(int i) {}
+    main() {
+      method(null);
+    }
+
+ArgumentTypeNotAssignableNullabilityNullType:
+  template: "The argument type '#type' can't be assigned to the parameter type '#type2' because '#type2' is not nullable."
+  analyzerCode: ARGUMENT_TYPE_NOT_ASSIGNABLE
+  configuration: nnbd-strong
+  script: >
+    method(int i) {}
+    main() {
+      Null n;
+      method(n);
+    }
 
 InvalidAssignmentError:
   template: "A value of type '#type' can't be assigned to a variable of type '#type2'."
@@ -3273,6 +3348,49 @@
       i = 1.5;
     }
 
+InvalidAssignmentErrorNullability:
+  template: "A value of type '#type' can't be assigned to a variable of type '#type2' because '#type' is nullable and '#type2' isn't."
+  analyzerCode: INVALID_ASSIGNMENT
+  configuration: nnbd-strong
+  script: >
+    main() {
+      int i = 0;
+      int? j;
+      i = j;
+    }
+
+InvalidAssignmentErrorPartNullability:
+  template: "A value of type '#type' can't be assigned to a variable of type '#type2' because '#type3' is nullable and '#type4' isn't."
+  analyzerCode: INVALID_ASSIGNMENT
+  configuration: nnbd-strong
+  script: >
+    main() {
+      List<int> i = [];
+      List<int?> j = [null];
+      i = j;
+    }
+
+InvalidAssignmentErrorNullabilityNull:
+  template: "The value 'null' can't be assigned to a variable of type '#type' because '#type' is not nullable."
+  analyzerCode: INVALID_ASSIGNMENT
+  configuration: nnbd-strong
+  script: >
+    main() {
+      int i = 0;
+      i = null;
+    }
+
+InvalidAssignmentErrorNullabilityNullType:
+  template: "A value of type '#type' can't be assigned to a variable of type '#type2' because '#type2' is not nullable."
+  analyzerCode: INVALID_ASSIGNMENT
+  configuration: nnbd-strong
+  script: >
+    main() {
+      Null n;
+      int i = 0;
+      i = n;
+    }
+
 PatchClassTypeVariablesMismatch:
   template: "A patch class must have the same number of type variables as its origin class."
 
@@ -3528,10 +3646,59 @@
   template: "A value of type '#type' can't be assigned to a variable of type '#type2'."
   tip: "Try changing the type of the variable."
   analyzerCode: FOR_IN_OF_INVALID_ELEMENT_TYPE
+  script: |
+    method() {
+      List<String> list = [];
+      for (int i in list) {}
+    }
+
+ForInLoopElementTypeNotAssignableNullability:
+  template: "A value of type '#type' can't be assigned to a variable of type '#type2' because '#type' is nullable and '#type2' isn't."
+  tip: "Try changing the type of the variable."
+  analyzerCode: FOR_IN_OF_INVALID_ELEMENT_TYPE
+  configuration: nnbd-strong
+  script: |
+    method() {
+      List<int?> list = [];
+      for (int i in list) {}
+    }
+
+ForInLoopElementTypeNotAssignablePartNullability:
+  template: "A value of type '#type' can't be assigned to a variable of type '#type2' because '#type3' is nullable and '#type4' isn't."
+  tip: "Try changing the type of the variable."
+  analyzerCode: FOR_IN_OF_INVALID_ELEMENT_TYPE
+  configuration: nnbd-strong
+  script: |
+    method() {
+      List<List<int?>> list = [[]];
+      for (List<int> i in list) {}
+    }
 
 ForInLoopTypeNotIterable:
   template: "The type '#type' used in the 'for' loop must implement '#type2'."
   analyzerCode: FOR_IN_OF_INVALID_TYPE
+  script: |
+    method() {
+      String list = '';
+      for (int i in list) {}
+    }
+
+ForInLoopTypeNotIterableNullability:
+  template: "The type '#type' used in the 'for' loop must implement '#type2' because '#type' is nullable and '#type2' isn't."
+  analyzerCode: FOR_IN_OF_INVALID_TYPE
+  configuration: nnbd-strong
+  script: |
+    method() {
+      List<int>? list = null;
+      for (int i in list) {}
+    }
+
+# This cannot never occur since the iterable is checked to be assignable to `Iterable<dynamic>` so nullability can
+# only be a problem at the immediate level as in [ForInLoopTypeNotIterableNullability]. The message is needed for
+# symmetry in the call site.
+ForInLoopTypeNotIterablePartNullability:
+  template: "The type '#type' used in the 'for' loop must implement '#type2' because '#type3' is nullable and '#type4' isn't."
+  analyzerCode: FOR_IN_OF_INVALID_TYPE
 
 InitializingFormalTypeMismatch:
   template: "The type of parameter '#name', '#type' is not a subtype of the corresponding field's type, '#type2'."
@@ -3747,11 +3914,51 @@
   configuration: nnbd-strong
   declaration: "int foo() { return true; }"
 
+InvalidReturnNullability:
+  template: "A value of type '#type' can't be returned from a function with return type '#type2' because '#type' is nullable and '#type2' isn't."
+  configuration: nnbd-strong
+  declaration: "int foo(int? i) { return i; }"
+
+InvalidReturnPartNullability:
+  template: "A value of type '#type' can't be returned from a function with return type '#type2' because '#type3' is nullable and '#type4' isn't."
+  configuration: nnbd-strong
+  declaration: "List<int> foo(List<int?> list) { return list; }"
+
+InvalidReturnNullabilityNull:
+  template: "The value 'null' can't be returned from a function with return type '#type' because '#type' is not nullable."
+  configuration: nnbd-strong
+  declaration: "int foo() { return null; }"
+
+InvalidReturnNullabilityNullType:
+  template: "A value of type '#type' can't be returned from a function with return type '#type2' because '#type2' is not nullable."
+  configuration: nnbd-strong
+  declaration: "int foo(Null i) { return i; }"
+
 InvalidReturnAsync:
   template: "A value of type '#type' can't be returned from an async function with return type '#type2'."
   configuration: nnbd-strong
   declaration: "Future<int> foo() async { return true; }"
 
+InvalidReturnAsyncNullability:
+  template: "A value of type '#type' can't be returned from an async function with return type '#type2' because '#type' is nullable and '#type2' isn't."
+  configuration: nnbd-strong
+  declaration: "Future<int> foo(int? i) async { return i; }"
+
+InvalidReturnAsyncPartNullability:
+  template: "A value of type '#type' can't be returned from an async function with return type '#type2' because '#type3' is nullable and '#type4' isn't."
+  configuration: nnbd-strong
+  declaration: "Future<List<int>> foo(List<int?> list) async { return list; }"
+
+InvalidReturnAsyncNullabilityNull:
+  template: "The value 'null' can't be returned from an async function with return type '#type' because '#type' is not nullable."
+  configuration: nnbd-strong
+  declaration: "Future<int> foo() async { return null; }"
+
+InvalidReturnAsyncNullabilityNullType:
+  template: "A value of type '#type' can't be returned from an async function with return type '#type2' because '#type2' is not nullable."
+  configuration: nnbd-strong
+  declaration: "Future<int> foo(Null n) async { return n; }"
+
 ImplicitReturnNull:
   template: "A non-null value must be returned since the return type '#type' doesn't allow null."
   configuration: nnbd-strong
@@ -4107,6 +4314,26 @@
       List<int> b = <int>[...a];
     }
 
+SpreadElementTypeMismatchNullability:
+  template: "Can't assign spread elements of type '#type' to collection elements of type '#type2' because '#type' is nullable and '#type2' isn't."
+  analyzerCode: LIST_ELEMENT_TYPE_NOT_ASSIGNABLE
+  configuration: nnbd-strong
+  script: >
+    main() {
+      List<int?> a = <int?>[0, null];
+      List<int> b = <int>[...a];
+    }
+
+SpreadElementTypeMismatchPartNullability:
+  template: "Can't assign spread elements of type '#type' to collection elements of type '#type2' because '#type3' is nullable and '#type4' isn't."
+  analyzerCode: LIST_ELEMENT_TYPE_NOT_ASSIGNABLE
+  configuration: nnbd-strong
+  script: >
+    main() {
+      List<List<int?>> a = <List<int?>>[[0, null]];
+      List<List<int>> b = <List<int>>[...a];
+    }
+
 SpreadMapEntryTypeMismatch:
   template: "Unexpected type '#type' of a map spread entry.  Expected 'dynamic' or a Map."
   script:
@@ -4130,6 +4357,26 @@
       Map<int, int> b = <int, int>{...a};
     }
 
+SpreadMapEntryElementKeyTypeMismatchNullability:
+  template: "Can't assign spread entry keys of type '#type' to map entry keys of type '#type2' because '#type' is nullable and '#type2' isn't."
+  analyzerCode: MAP_KEY_TYPE_NOT_ASSIGNABLE
+  configuration: nnbd-strong
+  script: >
+    main() {
+      Map<String?, int> a = <String?, int>{"foo": 42, null: 87};
+      Map<String, int> b = <String, int>{...a};
+    }
+
+SpreadMapEntryElementKeyTypeMismatchPartNullability:
+  template: "Can't assign spread entry keys of type '#type' to map entry keys of type '#type2' because '#type3' is nullable and '#type4' isn't."
+  analyzerCode: MAP_KEY_TYPE_NOT_ASSIGNABLE
+  configuration: nnbd-strong
+  script: >
+    main() {
+      Map<List<String?>, int> a = <List<String?>, int>{["foo"]: 42, [null]: 87};
+      Map<List<String>, int> b = <List<String>, int>{...a};
+    }
+
 SpreadMapEntryElementValueTypeMismatch:
   template: "Can't assign spread entry values of type '#type' to map entry values of type '#type2'."
   analyzerCode: MAP_VALUE_TYPE_NOT_ASSIGNABLE
@@ -4139,6 +4386,26 @@
       Map<String, String> b = <String, String>{...a};
     }
 
+SpreadMapEntryElementValueTypeMismatchNullability:
+  template: "Can't assign spread entry values of type '#type' to map entry values of type '#type2' because '#type' is nullable and '#type2' isn't."
+  analyzerCode: MAP_VALUE_TYPE_NOT_ASSIGNABLE
+  configuration: nnbd-strong
+  script: >
+    main() {
+      Map<String, int?> a = <String, int?>{"foo": 42, "bar": null};
+      Map<String, int> b = <String, int>{...a};
+    }
+
+SpreadMapEntryElementValueTypeMismatchPartNullability:
+  template: "Can't assign spread entry values of type '#type' to map entry values of type '#type2' because '#type3' is nullable and '#type4' isn't."
+  analyzerCode: MAP_VALUE_TYPE_NOT_ASSIGNABLE
+  configuration: nnbd-strong
+  script: >
+    main() {
+      Map<String, List<int?>> a = <String, List<int?>>{"foo": [42], "bar": [null]};
+      Map<String, List<int>> b = <String, List<int>>{...a};
+    }
+
 CantDisambiguateNotEnoughInformation:
   template: "Not enough type information to disambiguate between literal set and literal map."
   tip: "Try providing type arguments for the literal explicitly to disambiguate it."
@@ -4197,15 +4464,6 @@
       }
     }
 
-IllegalRecursiveType:
-  template: "Illegal recursive type '#type'."
-  script: >
-    class Base<T> {}
-    class Derived<T> extends Base<Derived<Derived<T>>> {}
-
-BytecodeLimitExceededTooManyArguments:
-  template: "Dart bytecode limit exceeded: too many arguments."
-
 CombinedMemberSignatureFailed:
   template: "Class '#name' inherits multiple members named '#name2' with incompatible signatures."
   tip: "Try adding a declaration of '#name2' to '#name'."
@@ -4368,6 +4626,10 @@
   template: "Factory constructors for @anonymous JS interop classes should not contain any positional parameters."
   tip: "Try replacing them with named parameters instead."
 
+JsInteropDartClassExtendsJSClass:
+  template: "Dart class '#name' cannot extend JS interop class '#name2'."
+  tip: "Try adding the JS interop annotation or removing it from the parent class."
+
 JsInteropEnclosingClassJSAnnotation:
   template: "Member has a JS interop annotation but the enclosing class does not."
   tip: "Try adding the annotation to the enclosing class."
@@ -4380,6 +4642,10 @@
   template: "JS interop classes do not support [] and []= operator methods."
   tip: "Try replacing with a normal method."
 
+JsInteropJSClassExtendsDartClass:
+  template: "JS interop class '#name' cannot extend Dart class '#name2'."
+  tip: "Try removing the JS interop annotation or adding it to the parent class."
+
 JsInteropNamedParameters:
   template: "Named parameters for JS interop functions are only allowed in a factory constructor of an @anonymous JS class."
   tip: "Try replacing them with normal or optional parameters."
@@ -4400,6 +4666,32 @@
   template: "Operand of null-aware operation '#name' has type '#type' which excludes null."
   severity: WARNING
 
+ThisInNullAwareReceiver:
+  template: "The receiver 'this' cannot be null."
+  tip: "Try replacing '?.' with '.'"
+  severity: WARNING
+  configuration: nnbd-strong
+  script: |
+    class C {
+      var field;
+      method() {
+        this?.field;
+      }
+    }
+
+ClassInNullAwareReceiver:
+  template: "The class '#name' cannot be null."
+  tip: "Try replacing '?.' with '.'"
+  severity: WARNING
+  configuration: nnbd-strong
+  script: |
+    class C {
+      static var field;
+    }
+    method() {
+      C?.field;
+    }
+
 NonNullableNotAssignedError:
   template: "Non-nullable variable '#name' must be assigned before it can be used."
   configuration: nnbd-strong
diff --git a/pkg/front_end/parser_testcases/nnbd/error_recovery/abstract_placement.dart b/pkg/front_end/parser_testcases/nnbd/error_recovery/abstract_placement.dart
new file mode 100644
index 0000000..03e4492
--- /dev/null
+++ b/pkg/front_end/parser_testcases/nnbd/error_recovery/abstract_placement.dart
@@ -0,0 +1,21 @@
+// https://github.com/dart-lang/sdk/issues/43855
+// https://github.com/dart-lang/sdk/issues/43856
+// https://github.com/dart-lang/sdk/issues/43857
+
+abstract class C {
+  final abstract int i1;
+  final abstract i2;
+  covariant abstract num i3;
+  covariant abstract var i4;
+  final abstract i5;
+  var abstract i6;
+  C abstract i7;
+}
+
+// This currently give 2 errors which is hardly ideal.
+var abstract foo;
+
+abstract class Bar {
+  // This currently give 2 errors which is hardly ideal.
+  covariant required x;
+}
\ No newline at end of file
diff --git a/pkg/front_end/parser_testcases/nnbd/error_recovery/abstract_placement.dart.expect b/pkg/front_end/parser_testcases/nnbd/error_recovery/abstract_placement.dart.expect
new file mode 100644
index 0000000..12e6b31
--- /dev/null
+++ b/pkg/front_end/parser_testcases/nnbd/error_recovery/abstract_placement.dart.expect
@@ -0,0 +1,195 @@
+Problems reported:
+
+parser/nnbd/error_recovery/abstract_placement:6:9: The modifier 'abstract' should be before the modifier 'final'.
+  final abstract int i1;
+        ^^^^^^^^
+
+parser/nnbd/error_recovery/abstract_placement:7:9: The modifier 'abstract' should be before the modifier 'final'.
+  final abstract i2;
+        ^^^^^^^^
+
+parser/nnbd/error_recovery/abstract_placement:8:13: The modifier 'abstract' should be before the modifier 'covariant'.
+  covariant abstract num i3;
+            ^^^^^^^^
+
+parser/nnbd/error_recovery/abstract_placement:9:13: The modifier 'abstract' should be before the modifier 'covariant'.
+  covariant abstract var i4;
+            ^^^^^^^^
+
+parser/nnbd/error_recovery/abstract_placement:10:9: The modifier 'abstract' should be before the modifier 'final'.
+  final abstract i5;
+        ^^^^^^^^
+
+parser/nnbd/error_recovery/abstract_placement:11:7: The modifier 'abstract' should be before the modifier 'var'.
+  var abstract i6;
+      ^^^^^^^^
+
+parser/nnbd/error_recovery/abstract_placement:12:5: Expected ';' after this.
+  C abstract i7;
+    ^^^^^^^^
+
+parser/nnbd/error_recovery/abstract_placement:12:14: Variables must be declared using the keywords 'const', 'final', 'var' or a type name.
+  C abstract i7;
+             ^^
+
+parser/nnbd/error_recovery/abstract_placement:16:5: The modifier 'abstract' should be before the modifier 'var'.
+var abstract foo;
+    ^^^^^^^^
+
+parser/nnbd/error_recovery/abstract_placement:16:5: Can't have modifier 'abstract' here.
+var abstract foo;
+    ^^^^^^^^
+
+parser/nnbd/error_recovery/abstract_placement:20:13: The modifier 'required' should be before the modifier 'covariant'.
+  covariant required x;
+            ^^^^^^^^
+
+parser/nnbd/error_recovery/abstract_placement:20:13: Can't have modifier 'required' here.
+  covariant required x;
+            ^^^^^^^^
+
+parser/nnbd/error_recovery/abstract_placement:20:22: Variables must be declared using the keywords 'const', 'final', 'var' or a type name.
+  covariant required x;
+                     ^
+
+beginCompilationUnit(abstract)
+  beginMetadataStar(abstract)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(abstract)
+    handleIdentifier(C, classOrMixinDeclaration)
+    handleNoTypeVariables({)
+    beginClassDeclaration(abstract, abstract, C)
+      handleNoType(C)
+      handleClassExtends(null, 1)
+      handleClassNoWithClause()
+      handleClassOrMixinImplements(null, 0)
+      handleClassHeader(abstract, class, null)
+      beginClassOrMixinBody(DeclarationKind.Class, {)
+        beginMetadataStar(final)
+        endMetadataStar(0)
+        handleRecoverableError(Message[ModifierOutOfOrder, The modifier 'abstract' should be before the modifier 'final'., Try re-ordering the modifiers., {string: abstract, string2: final}], abstract, abstract)
+        beginMember()
+          beginFields({)
+            handleIdentifier(int, typeReference)
+            handleNoTypeArguments(i1)
+            handleType(int, null)
+            handleIdentifier(i1, fieldDeclaration)
+            handleNoFieldInitializer(;)
+          endClassFields(abstract, null, null, null, null, final, 1, final, ;)
+        endMember()
+        beginMetadataStar(final)
+        endMetadataStar(0)
+        handleRecoverableError(Message[ModifierOutOfOrder, The modifier 'abstract' should be before the modifier 'final'., Try re-ordering the modifiers., {string: abstract, string2: final}], abstract, abstract)
+        beginMember()
+          beginFields(;)
+            handleNoType(abstract)
+            handleIdentifier(i2, fieldDeclaration)
+            handleNoFieldInitializer(;)
+          endClassFields(abstract, null, null, null, null, final, 1, final, ;)
+        endMember()
+        beginMetadataStar(covariant)
+        endMetadataStar(0)
+        handleRecoverableError(Message[ModifierOutOfOrder, The modifier 'abstract' should be before the modifier 'covariant'., Try re-ordering the modifiers., {string: abstract, string2: covariant}], abstract, abstract)
+        beginMember()
+          beginFields(;)
+            handleIdentifier(num, typeReference)
+            handleNoTypeArguments(i3)
+            handleType(num, null)
+            handleIdentifier(i3, fieldDeclaration)
+            handleNoFieldInitializer(;)
+          endClassFields(abstract, null, null, covariant, null, null, 1, covariant, ;)
+        endMember()
+        beginMetadataStar(covariant)
+        endMetadataStar(0)
+        handleRecoverableError(Message[ModifierOutOfOrder, The modifier 'abstract' should be before the modifier 'covariant'., Try re-ordering the modifiers., {string: abstract, string2: covariant}], abstract, abstract)
+        beginMember()
+          beginFields(;)
+            handleNoType(var)
+            handleIdentifier(i4, fieldDeclaration)
+            handleNoFieldInitializer(;)
+          endClassFields(abstract, null, null, covariant, null, var, 1, covariant, ;)
+        endMember()
+        beginMetadataStar(final)
+        endMetadataStar(0)
+        handleRecoverableError(Message[ModifierOutOfOrder, The modifier 'abstract' should be before the modifier 'final'., Try re-ordering the modifiers., {string: abstract, string2: final}], abstract, abstract)
+        beginMember()
+          beginFields(;)
+            handleNoType(abstract)
+            handleIdentifier(i5, fieldDeclaration)
+            handleNoFieldInitializer(;)
+          endClassFields(abstract, null, null, null, null, final, 1, final, ;)
+        endMember()
+        beginMetadataStar(var)
+        endMetadataStar(0)
+        handleRecoverableError(Message[ModifierOutOfOrder, The modifier 'abstract' should be before the modifier 'var'., Try re-ordering the modifiers., {string: abstract, string2: var}], abstract, abstract)
+        beginMember()
+          beginFields(;)
+            handleNoType(abstract)
+            handleIdentifier(i6, fieldDeclaration)
+            handleNoFieldInitializer(;)
+          endClassFields(abstract, null, null, null, null, var, 1, var, ;)
+        endMember()
+        beginMetadataStar(C)
+        endMetadataStar(0)
+        beginMember()
+          beginFields(;)
+            handleIdentifier(C, typeReference)
+            handleNoTypeArguments(abstract)
+            handleType(C, null)
+            handleIdentifier(abstract, fieldDeclaration)
+            handleNoFieldInitializer(i7)
+            handleRecoverableError(Message[ExpectedAfterButGot, Expected ';' after this., null, {string: ;}], abstract, abstract)
+          endClassFields(null, null, null, null, null, null, 1, C, ;)
+        endMember()
+        beginMetadataStar(i7)
+        endMetadataStar(0)
+        beginMember()
+          beginFields(;)
+            handleRecoverableError(MissingConstFinalVarOrType, i7, i7)
+            handleNoType(;)
+            handleIdentifier(i7, fieldDeclaration)
+            handleNoFieldInitializer(;)
+          endClassFields(null, null, null, null, null, null, 1, i7, ;)
+        endMember()
+      endClassOrMixinBody(DeclarationKind.Class, 8, {, })
+    endClassDeclaration(abstract, })
+  endTopLevelDeclaration(var)
+  beginMetadataStar(var)
+  endMetadataStar(0)
+  beginTopLevelMember(var)
+    handleRecoverableError(Message[ModifierOutOfOrder, The modifier 'abstract' should be before the modifier 'var'., Try re-ordering the modifiers., {string: abstract, string2: var}], abstract, abstract)
+    handleRecoverableError(Message[ExtraneousModifier, Can't have modifier 'abstract' here., Try removing 'abstract'., {token: abstract}], abstract, abstract)
+    beginFields(})
+      handleNoType(abstract)
+      handleIdentifier(foo, topLevelVariableDeclaration)
+      handleNoFieldInitializer(;)
+    endTopLevelFields(null, null, null, null, var, 1, var, ;)
+  endTopLevelDeclaration(abstract)
+  beginMetadataStar(abstract)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(abstract)
+    handleIdentifier(Bar, classOrMixinDeclaration)
+    handleNoTypeVariables({)
+    beginClassDeclaration(abstract, abstract, Bar)
+      handleNoType(Bar)
+      handleClassExtends(null, 1)
+      handleClassNoWithClause()
+      handleClassOrMixinImplements(null, 0)
+      handleClassHeader(abstract, class, null)
+      beginClassOrMixinBody(DeclarationKind.Class, {)
+        beginMetadataStar(covariant)
+        endMetadataStar(0)
+        handleRecoverableError(Message[ModifierOutOfOrder, The modifier 'required' should be before the modifier 'covariant'., Try re-ordering the modifiers., {string: required, string2: covariant}], required, required)
+        handleRecoverableError(Message[ExtraneousModifier, Can't have modifier 'required' here., Try removing 'required'., {token: required}], required, required)
+        beginMember()
+          beginFields({)
+            handleRecoverableError(MissingConstFinalVarOrType, x, x)
+            handleNoType(required)
+            handleIdentifier(x, fieldDeclaration)
+            handleNoFieldInitializer(;)
+          endClassFields(null, null, null, covariant, null, null, 1, covariant, ;)
+        endMember()
+      endClassOrMixinBody(DeclarationKind.Class, 1, {, })
+    endClassDeclaration(abstract, })
+  endTopLevelDeclaration()
+endCompilationUnit(3, )
diff --git a/pkg/front_end/parser_testcases/nnbd/error_recovery/abstract_placement.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/error_recovery/abstract_placement.dart.intertwined.expect
new file mode 100644
index 0000000..0ce64ff
--- /dev/null
+++ b/pkg/front_end/parser_testcases/nnbd/error_recovery/abstract_placement.dart.intertwined.expect
@@ -0,0 +1,250 @@
+parseUnit(abstract)
+  skipErrorTokens(abstract)
+  listener: beginCompilationUnit(abstract)
+  syntheticPreviousToken(abstract)
+  parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+    parseMetadataStar()
+      listener: beginMetadataStar(abstract)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(, class)
+        parseTopLevelKeywordModifiers(abstract, class)
+      parseClassOrNamedMixinApplication(abstract, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(abstract)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          listener: handleIdentifier(C, classOrMixinDeclaration)
+        listener: handleNoTypeVariables({)
+        listener: beginClassDeclaration(abstract, abstract, C)
+        parseClass(C, abstract, class, C)
+          parseClassHeaderOpt(C, abstract, class)
+            parseClassExtendsOpt(C)
+              listener: handleNoType(C)
+              listener: handleClassExtends(null, 1)
+            parseWithClauseOpt(C)
+              listener: handleClassNoWithClause()
+            parseClassOrMixinImplementsOpt(C)
+              listener: handleClassOrMixinImplements(null, 0)
+            listener: handleClassHeader(abstract, class, null)
+          parseClassOrMixinOrExtensionBody(C, DeclarationKind.Class, C)
+            listener: beginClassOrMixinBody(DeclarationKind.Class, {)
+            notEofOrValue(}, final)
+            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, C)
+              parseMetadataStar({)
+                listener: beginMetadataStar(final)
+                listener: endMetadataStar(0)
+              reportRecoverableError(abstract, Message[ModifierOutOfOrder, The modifier 'abstract' should be before the modifier 'final'., Try re-ordering the modifiers., {string: abstract, string2: final}])
+                listener: handleRecoverableError(Message[ModifierOutOfOrder, The modifier 'abstract' should be before the modifier 'final'., Try re-ordering the modifiers., {string: abstract, string2: final}], abstract, abstract)
+              listener: beginMember()
+              parseFields({, abstract, null, null, null, null, final, abstract, Instance of 'SimpleType', i1, DeclarationKind.Class, C, false)
+                listener: beginFields({)
+                listener: handleIdentifier(int, typeReference)
+                listener: handleNoTypeArguments(i1)
+                listener: handleType(int, null)
+                ensureIdentifierPotentiallyRecovered(int, fieldDeclaration, false)
+                  listener: handleIdentifier(i1, fieldDeclaration)
+                parseFieldInitializerOpt(i1, i1, null, abstract, null, final, DeclarationKind.Class, C)
+                  listener: handleNoFieldInitializer(;)
+                listener: endClassFields(abstract, null, null, null, null, final, 1, final, ;)
+              listener: endMember()
+            notEofOrValue(}, final)
+            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, C)
+              parseMetadataStar(;)
+                listener: beginMetadataStar(final)
+                listener: endMetadataStar(0)
+              reportRecoverableError(abstract, Message[ModifierOutOfOrder, The modifier 'abstract' should be before the modifier 'final'., Try re-ordering the modifiers., {string: abstract, string2: final}])
+                listener: handleRecoverableError(Message[ModifierOutOfOrder, The modifier 'abstract' should be before the modifier 'final'., Try re-ordering the modifiers., {string: abstract, string2: final}], abstract, abstract)
+              listener: beginMember()
+              parseFields(;, abstract, null, null, null, null, final, abstract, Instance of 'NoType', i2, DeclarationKind.Class, C, false)
+                listener: beginFields(;)
+                listener: handleNoType(abstract)
+                ensureIdentifierPotentiallyRecovered(abstract, fieldDeclaration, false)
+                  listener: handleIdentifier(i2, fieldDeclaration)
+                parseFieldInitializerOpt(i2, i2, null, abstract, null, final, DeclarationKind.Class, C)
+                  listener: handleNoFieldInitializer(;)
+                listener: endClassFields(abstract, null, null, null, null, final, 1, final, ;)
+              listener: endMember()
+            notEofOrValue(}, covariant)
+            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, C)
+              parseMetadataStar(;)
+                listener: beginMetadataStar(covariant)
+                listener: endMetadataStar(0)
+              reportRecoverableError(abstract, Message[ModifierOutOfOrder, The modifier 'abstract' should be before the modifier 'covariant'., Try re-ordering the modifiers., {string: abstract, string2: covariant}])
+                listener: handleRecoverableError(Message[ModifierOutOfOrder, The modifier 'abstract' should be before the modifier 'covariant'., Try re-ordering the modifiers., {string: abstract, string2: covariant}], abstract, abstract)
+              listener: beginMember()
+              parseFields(;, abstract, null, null, covariant, null, null, abstract, Instance of 'SimpleType', i3, DeclarationKind.Class, C, false)
+                listener: beginFields(;)
+                listener: handleIdentifier(num, typeReference)
+                listener: handleNoTypeArguments(i3)
+                listener: handleType(num, null)
+                ensureIdentifierPotentiallyRecovered(num, fieldDeclaration, false)
+                  listener: handleIdentifier(i3, fieldDeclaration)
+                parseFieldInitializerOpt(i3, i3, null, abstract, null, null, DeclarationKind.Class, C)
+                  listener: handleNoFieldInitializer(;)
+                listener: endClassFields(abstract, null, null, covariant, null, null, 1, covariant, ;)
+              listener: endMember()
+            notEofOrValue(}, covariant)
+            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, C)
+              parseMetadataStar(;)
+                listener: beginMetadataStar(covariant)
+                listener: endMetadataStar(0)
+              reportRecoverableError(abstract, Message[ModifierOutOfOrder, The modifier 'abstract' should be before the modifier 'covariant'., Try re-ordering the modifiers., {string: abstract, string2: covariant}])
+                listener: handleRecoverableError(Message[ModifierOutOfOrder, The modifier 'abstract' should be before the modifier 'covariant'., Try re-ordering the modifiers., {string: abstract, string2: covariant}], abstract, abstract)
+              listener: beginMember()
+              parseFields(;, abstract, null, null, covariant, null, var, var, Instance of 'NoType', i4, DeclarationKind.Class, C, false)
+                listener: beginFields(;)
+                listener: handleNoType(var)
+                ensureIdentifierPotentiallyRecovered(var, fieldDeclaration, false)
+                  listener: handleIdentifier(i4, fieldDeclaration)
+                parseFieldInitializerOpt(i4, i4, null, abstract, null, var, DeclarationKind.Class, C)
+                  listener: handleNoFieldInitializer(;)
+                listener: endClassFields(abstract, null, null, covariant, null, var, 1, covariant, ;)
+              listener: endMember()
+            notEofOrValue(}, final)
+            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, C)
+              parseMetadataStar(;)
+                listener: beginMetadataStar(final)
+                listener: endMetadataStar(0)
+              reportRecoverableError(abstract, Message[ModifierOutOfOrder, The modifier 'abstract' should be before the modifier 'final'., Try re-ordering the modifiers., {string: abstract, string2: final}])
+                listener: handleRecoverableError(Message[ModifierOutOfOrder, The modifier 'abstract' should be before the modifier 'final'., Try re-ordering the modifiers., {string: abstract, string2: final}], abstract, abstract)
+              listener: beginMember()
+              parseFields(;, abstract, null, null, null, null, final, abstract, Instance of 'NoType', i5, DeclarationKind.Class, C, false)
+                listener: beginFields(;)
+                listener: handleNoType(abstract)
+                ensureIdentifierPotentiallyRecovered(abstract, fieldDeclaration, false)
+                  listener: handleIdentifier(i5, fieldDeclaration)
+                parseFieldInitializerOpt(i5, i5, null, abstract, null, final, DeclarationKind.Class, C)
+                  listener: handleNoFieldInitializer(;)
+                listener: endClassFields(abstract, null, null, null, null, final, 1, final, ;)
+              listener: endMember()
+            notEofOrValue(}, var)
+            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, C)
+              parseMetadataStar(;)
+                listener: beginMetadataStar(var)
+                listener: endMetadataStar(0)
+              reportRecoverableError(abstract, Message[ModifierOutOfOrder, The modifier 'abstract' should be before the modifier 'var'., Try re-ordering the modifiers., {string: abstract, string2: var}])
+                listener: handleRecoverableError(Message[ModifierOutOfOrder, The modifier 'abstract' should be before the modifier 'var'., Try re-ordering the modifiers., {string: abstract, string2: var}], abstract, abstract)
+              listener: beginMember()
+              parseFields(;, abstract, null, null, null, null, var, abstract, Instance of 'NoType', i6, DeclarationKind.Class, C, false)
+                listener: beginFields(;)
+                listener: handleNoType(abstract)
+                ensureIdentifierPotentiallyRecovered(abstract, fieldDeclaration, false)
+                  listener: handleIdentifier(i6, fieldDeclaration)
+                parseFieldInitializerOpt(i6, i6, null, abstract, null, var, DeclarationKind.Class, C)
+                  listener: handleNoFieldInitializer(;)
+                listener: endClassFields(abstract, null, null, null, null, var, 1, var, ;)
+              listener: endMember()
+            notEofOrValue(}, C)
+            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, C)
+              parseMetadataStar(;)
+                listener: beginMetadataStar(C)
+                listener: endMetadataStar(0)
+              listener: beginMember()
+              parseFields(;, null, null, null, null, null, null, ;, Instance of 'SimpleType', abstract, DeclarationKind.Class, C, false)
+                listener: beginFields(;)
+                listener: handleIdentifier(C, typeReference)
+                listener: handleNoTypeArguments(abstract)
+                listener: handleType(C, null)
+                ensureIdentifierPotentiallyRecovered(C, fieldDeclaration, false)
+                  listener: handleIdentifier(abstract, fieldDeclaration)
+                parseFieldInitializerOpt(abstract, abstract, null, null, null, null, DeclarationKind.Class, C)
+                  listener: handleNoFieldInitializer(i7)
+                ensureSemicolon(abstract)
+                  reportRecoverableError(abstract, Message[ExpectedAfterButGot, Expected ';' after this., null, {string: ;}])
+                    listener: handleRecoverableError(Message[ExpectedAfterButGot, Expected ';' after this., null, {string: ;}], abstract, abstract)
+                  rewriter()
+                listener: endClassFields(null, null, null, null, null, null, 1, C, ;)
+              listener: endMember()
+            notEofOrValue(}, i7)
+            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, C)
+              parseMetadataStar(;)
+                listener: beginMetadataStar(i7)
+                listener: endMetadataStar(0)
+              listener: beginMember()
+              isReservedKeyword(;)
+              parseFields(;, null, null, null, null, null, null, ;, Instance of 'NoType', i7, DeclarationKind.Class, C, false)
+                listener: beginFields(;)
+                reportRecoverableError(i7, MissingConstFinalVarOrType)
+                  listener: handleRecoverableError(MissingConstFinalVarOrType, i7, i7)
+                listener: handleNoType(;)
+                ensureIdentifierPotentiallyRecovered(;, fieldDeclaration, false)
+                  listener: handleIdentifier(i7, fieldDeclaration)
+                parseFieldInitializerOpt(i7, i7, null, null, null, null, DeclarationKind.Class, C)
+                  listener: handleNoFieldInitializer(;)
+                listener: endClassFields(null, null, null, null, null, null, 1, i7, ;)
+              listener: endMember()
+            notEofOrValue(}, })
+            listener: endClassOrMixinBody(DeclarationKind.Class, 8, {, })
+          listener: endClassDeclaration(abstract, })
+  listener: endTopLevelDeclaration(var)
+  parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+    parseMetadataStar(})
+      listener: beginMetadataStar(var)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl(})
+      listener: beginTopLevelMember(var)
+      reportRecoverableError(abstract, Message[ModifierOutOfOrder, The modifier 'abstract' should be before the modifier 'var'., Try re-ordering the modifiers., {string: abstract, string2: var}])
+        listener: handleRecoverableError(Message[ModifierOutOfOrder, The modifier 'abstract' should be before the modifier 'var'., Try re-ordering the modifiers., {string: abstract, string2: var}], abstract, abstract)
+      reportRecoverableErrorWithToken(abstract, Instance of 'Template<(Token) => Message>')
+        listener: handleRecoverableError(Message[ExtraneousModifier, Can't have modifier 'abstract' here., Try removing 'abstract'., {token: abstract}], abstract, abstract)
+      parseFields(}, null, null, null, null, null, var, abstract, Instance of 'NoType', foo, DeclarationKind.TopLevel, null, false)
+        listener: beginFields(})
+        listener: handleNoType(abstract)
+        ensureIdentifierPotentiallyRecovered(abstract, topLevelVariableDeclaration, false)
+          listener: handleIdentifier(foo, topLevelVariableDeclaration)
+        parseFieldInitializerOpt(foo, foo, null, null, null, var, DeclarationKind.TopLevel, null)
+          listener: handleNoFieldInitializer(;)
+        listener: endTopLevelFields(null, null, null, null, var, 1, var, ;)
+  listener: endTopLevelDeclaration(abstract)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(abstract)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(;, class)
+        parseTopLevelKeywordModifiers(abstract, class)
+      parseClassOrNamedMixinApplication(abstract, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(abstract)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          listener: handleIdentifier(Bar, classOrMixinDeclaration)
+        listener: handleNoTypeVariables({)
+        listener: beginClassDeclaration(abstract, abstract, Bar)
+        parseClass(Bar, abstract, class, Bar)
+          parseClassHeaderOpt(Bar, abstract, class)
+            parseClassExtendsOpt(Bar)
+              listener: handleNoType(Bar)
+              listener: handleClassExtends(null, 1)
+            parseWithClauseOpt(Bar)
+              listener: handleClassNoWithClause()
+            parseClassOrMixinImplementsOpt(Bar)
+              listener: handleClassOrMixinImplements(null, 0)
+            listener: handleClassHeader(abstract, class, null)
+          parseClassOrMixinOrExtensionBody(Bar, DeclarationKind.Class, Bar)
+            listener: beginClassOrMixinBody(DeclarationKind.Class, {)
+            notEofOrValue(}, covariant)
+            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Bar)
+              parseMetadataStar({)
+                listener: beginMetadataStar(covariant)
+                listener: endMetadataStar(0)
+              reportRecoverableError(required, Message[ModifierOutOfOrder, The modifier 'required' should be before the modifier 'covariant'., Try re-ordering the modifiers., {string: required, string2: covariant}])
+                listener: handleRecoverableError(Message[ModifierOutOfOrder, The modifier 'required' should be before the modifier 'covariant'., Try re-ordering the modifiers., {string: required, string2: covariant}], required, required)
+              reportRecoverableErrorWithToken(required, Instance of 'Template<(Token) => Message>')
+                listener: handleRecoverableError(Message[ExtraneousModifier, Can't have modifier 'required' here., Try removing 'required'., {token: required}], required, required)
+              listener: beginMember()
+              isReservedKeyword(;)
+              parseFields({, null, null, null, covariant, null, null, required, Instance of 'NoType', x, DeclarationKind.Class, Bar, false)
+                listener: beginFields({)
+                reportRecoverableError(x, MissingConstFinalVarOrType)
+                  listener: handleRecoverableError(MissingConstFinalVarOrType, x, x)
+                listener: handleNoType(required)
+                ensureIdentifierPotentiallyRecovered(required, fieldDeclaration, false)
+                  listener: handleIdentifier(x, fieldDeclaration)
+                parseFieldInitializerOpt(x, x, null, null, null, null, DeclarationKind.Class, Bar)
+                  listener: handleNoFieldInitializer(;)
+                listener: endClassFields(null, null, null, covariant, null, null, 1, covariant, ;)
+              listener: endMember()
+            notEofOrValue(}, })
+            listener: endClassOrMixinBody(DeclarationKind.Class, 1, {, })
+          listener: endClassDeclaration(abstract, })
+  listener: endTopLevelDeclaration()
+  reportAllErrorTokens(abstract)
+  listener: endCompilationUnit(3, )
diff --git a/pkg/front_end/parser_testcases/nnbd/error_recovery/abstract_placement.dart.parser.expect b/pkg/front_end/parser_testcases/nnbd/error_recovery/abstract_placement.dart.parser.expect
new file mode 100644
index 0000000..3a6fad5
--- /dev/null
+++ b/pkg/front_end/parser_testcases/nnbd/error_recovery/abstract_placement.dart.parser.expect
@@ -0,0 +1,37 @@
+NOTICE: Stream was rewritten by parser!
+
+abstract class C {
+final abstract int i1;
+final abstract i2;
+covariant abstract num i3;
+covariant abstract var i4;
+final abstract i5;
+var abstract i6;
+C abstract ;i7;
+}
+
+
+var abstract foo;
+
+abstract class Bar {
+
+covariant required x;
+}
+
+abstract[KeywordToken] class[KeywordToken] C[StringToken] {[BeginToken]
+final[KeywordToken] abstract[KeywordToken] int[StringToken] i1[StringToken];[SimpleToken]
+final[KeywordToken] abstract[KeywordToken] i2[StringToken];[SimpleToken]
+covariant[KeywordToken] abstract[KeywordToken] num[StringToken] i3[StringToken];[SimpleToken]
+covariant[KeywordToken] abstract[KeywordToken] var[KeywordToken] i4[StringToken];[SimpleToken]
+final[KeywordToken] abstract[KeywordToken] i5[StringToken];[SimpleToken]
+var[KeywordToken] abstract[KeywordToken] i6[StringToken];[SimpleToken]
+C[StringToken] abstract[KeywordToken] ;[SyntheticToken]i7[StringToken];[SimpleToken]
+}[SimpleToken]
+
+
+var[KeywordToken] abstract[KeywordToken] foo[StringToken];[SimpleToken]
+
+abstract[KeywordToken] class[KeywordToken] Bar[StringToken] {[BeginToken]
+
+covariant[KeywordToken] required[KeywordToken] x[StringToken];[SimpleToken]
+}[SimpleToken][SimpleToken]
diff --git a/pkg/front_end/parser_testcases/nnbd/error_recovery/abstract_placement.dart.scanner.expect b/pkg/front_end/parser_testcases/nnbd/error_recovery/abstract_placement.dart.scanner.expect
new file mode 100644
index 0000000..602f1128
--- /dev/null
+++ b/pkg/front_end/parser_testcases/nnbd/error_recovery/abstract_placement.dart.scanner.expect
@@ -0,0 +1,35 @@
+abstract class C {
+final abstract int i1;
+final abstract i2;
+covariant abstract num i3;
+covariant abstract var i4;
+final abstract i5;
+var abstract i6;
+C abstract i7;
+}
+
+
+var abstract foo;
+
+abstract class Bar {
+
+covariant required x;
+}
+
+abstract[KeywordToken] class[KeywordToken] C[StringToken] {[BeginToken]
+final[KeywordToken] abstract[KeywordToken] int[StringToken] i1[StringToken];[SimpleToken]
+final[KeywordToken] abstract[KeywordToken] i2[StringToken];[SimpleToken]
+covariant[KeywordToken] abstract[KeywordToken] num[StringToken] i3[StringToken];[SimpleToken]
+covariant[KeywordToken] abstract[KeywordToken] var[KeywordToken] i4[StringToken];[SimpleToken]
+final[KeywordToken] abstract[KeywordToken] i5[StringToken];[SimpleToken]
+var[KeywordToken] abstract[KeywordToken] i6[StringToken];[SimpleToken]
+C[StringToken] abstract[KeywordToken] i7[StringToken];[SimpleToken]
+}[SimpleToken]
+
+
+var[KeywordToken] abstract[KeywordToken] foo[StringToken];[SimpleToken]
+
+abstract[KeywordToken] class[KeywordToken] Bar[StringToken] {[BeginToken]
+
+covariant[KeywordToken] required[KeywordToken] x[StringToken];[SimpleToken]
+}[SimpleToken][SimpleToken]
diff --git a/pkg/front_end/parser_testcases/nnbd/error_recovery/external_placement.dart b/pkg/front_end/parser_testcases/nnbd/error_recovery/external_placement.dart
new file mode 100644
index 0000000..b1cc0ba
--- /dev/null
+++ b/pkg/front_end/parser_testcases/nnbd/error_recovery/external_placement.dart
@@ -0,0 +1,15 @@
+// https://github.com/dart-lang/sdk/issues/43851
+// https://github.com/dart-lang/sdk/issues/43858
+// https://github.com/dart-lang/sdk/issues/43859
+
+final external int i1;
+var external i2;
+
+class C {
+  covariant external num i3;
+  final external int i4;
+  final external i5;
+  static external final i6;
+  static final external i7;
+  final static external i8;
+}
\ No newline at end of file
diff --git a/pkg/front_end/parser_testcases/nnbd/error_recovery/external_placement.dart.expect b/pkg/front_end/parser_testcases/nnbd/error_recovery/external_placement.dart.expect
new file mode 100644
index 0000000..b26632d
--- /dev/null
+++ b/pkg/front_end/parser_testcases/nnbd/error_recovery/external_placement.dart.expect
@@ -0,0 +1,142 @@
+Problems reported:
+
+parser/nnbd/error_recovery/external_placement:5:7: The modifier 'external' should be before the modifier 'final'.
+final external int i1;
+      ^^^^^^^^
+
+parser/nnbd/error_recovery/external_placement:6:5: The modifier 'external' should be before the modifier 'var'.
+var external i2;
+    ^^^^^^^^
+
+parser/nnbd/error_recovery/external_placement:9:13: The modifier 'external' should be before the modifier 'covariant'.
+  covariant external num i3;
+            ^^^^^^^^
+
+parser/nnbd/error_recovery/external_placement:10:9: The modifier 'external' should be before the modifier 'final'.
+  final external int i4;
+        ^^^^^^^^
+
+parser/nnbd/error_recovery/external_placement:11:9: The modifier 'external' should be before the modifier 'final'.
+  final external i5;
+        ^^^^^^^^
+
+parser/nnbd/error_recovery/external_placement:12:10: The modifier 'external' should be before the modifier 'static'.
+  static external final i6;
+         ^^^^^^^^
+
+parser/nnbd/error_recovery/external_placement:13:16: The modifier 'external' should be before the modifier 'static'.
+  static final external i7;
+               ^^^^^^^^
+
+parser/nnbd/error_recovery/external_placement:14:9: The modifier 'static' should be before the modifier 'final'.
+  final static external i8;
+        ^^^^^^
+
+parser/nnbd/error_recovery/external_placement:14:16: The modifier 'external' should be before the modifier 'static'.
+  final static external i8;
+               ^^^^^^^^
+
+beginCompilationUnit(final)
+  beginMetadataStar(final)
+  endMetadataStar(0)
+  beginTopLevelMember(final)
+    handleRecoverableError(Message[ModifierOutOfOrder, The modifier 'external' should be before the modifier 'final'., Try re-ordering the modifiers., {string: external, string2: final}], external, external)
+    beginFields()
+      handleIdentifier(int, typeReference)
+      handleNoTypeArguments(i1)
+      handleType(int, null)
+      handleIdentifier(i1, topLevelVariableDeclaration)
+      handleNoFieldInitializer(;)
+    endTopLevelFields(external, null, null, null, final, 1, final, ;)
+  endTopLevelDeclaration(var)
+  beginMetadataStar(var)
+  endMetadataStar(0)
+  beginTopLevelMember(var)
+    handleRecoverableError(Message[ModifierOutOfOrder, The modifier 'external' should be before the modifier 'var'., Try re-ordering the modifiers., {string: external, string2: var}], external, external)
+    beginFields(;)
+      handleNoType(external)
+      handleIdentifier(i2, topLevelVariableDeclaration)
+      handleNoFieldInitializer(;)
+    endTopLevelFields(external, null, null, null, var, 1, var, ;)
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleIdentifier(C, classOrMixinDeclaration)
+    handleNoTypeVariables({)
+    beginClassDeclaration(class, null, C)
+      handleNoType(C)
+      handleClassExtends(null, 1)
+      handleClassNoWithClause()
+      handleClassOrMixinImplements(null, 0)
+      handleClassHeader(class, class, null)
+      beginClassOrMixinBody(DeclarationKind.Class, {)
+        beginMetadataStar(covariant)
+        endMetadataStar(0)
+        handleRecoverableError(Message[ModifierOutOfOrder, The modifier 'external' should be before the modifier 'covariant'., Try re-ordering the modifiers., {string: external, string2: covariant}], external, external)
+        beginMember()
+          beginFields({)
+            handleIdentifier(num, typeReference)
+            handleNoTypeArguments(i3)
+            handleType(num, null)
+            handleIdentifier(i3, fieldDeclaration)
+            handleNoFieldInitializer(;)
+          endClassFields(null, external, null, covariant, null, null, 1, covariant, ;)
+        endMember()
+        beginMetadataStar(final)
+        endMetadataStar(0)
+        handleRecoverableError(Message[ModifierOutOfOrder, The modifier 'external' should be before the modifier 'final'., Try re-ordering the modifiers., {string: external, string2: final}], external, external)
+        beginMember()
+          beginFields(;)
+            handleIdentifier(int, typeReference)
+            handleNoTypeArguments(i4)
+            handleType(int, null)
+            handleIdentifier(i4, fieldDeclaration)
+            handleNoFieldInitializer(;)
+          endClassFields(null, external, null, null, null, final, 1, final, ;)
+        endMember()
+        beginMetadataStar(final)
+        endMetadataStar(0)
+        handleRecoverableError(Message[ModifierOutOfOrder, The modifier 'external' should be before the modifier 'final'., Try re-ordering the modifiers., {string: external, string2: final}], external, external)
+        beginMember()
+          beginFields(;)
+            handleNoType(external)
+            handleIdentifier(i5, fieldDeclaration)
+            handleNoFieldInitializer(;)
+          endClassFields(null, external, null, null, null, final, 1, final, ;)
+        endMember()
+        beginMetadataStar(static)
+        endMetadataStar(0)
+        handleRecoverableError(Message[ModifierOutOfOrder, The modifier 'external' should be before the modifier 'static'., Try re-ordering the modifiers., {string: external, string2: static}], external, external)
+        beginMember()
+          beginFields(;)
+            handleNoType(final)
+            handleIdentifier(i6, fieldDeclaration)
+            handleNoFieldInitializer(;)
+          endClassFields(null, external, static, null, null, final, 1, static, ;)
+        endMember()
+        beginMetadataStar(static)
+        endMetadataStar(0)
+        handleRecoverableError(Message[ModifierOutOfOrder, The modifier 'external' should be before the modifier 'static'., Try re-ordering the modifiers., {string: external, string2: static}], external, external)
+        beginMember()
+          beginFields(;)
+            handleNoType(external)
+            handleIdentifier(i7, fieldDeclaration)
+            handleNoFieldInitializer(;)
+          endClassFields(null, external, static, null, null, final, 1, static, ;)
+        endMember()
+        beginMetadataStar(final)
+        endMetadataStar(0)
+        handleRecoverableError(Message[ModifierOutOfOrder, The modifier 'static' should be before the modifier 'final'., Try re-ordering the modifiers., {string: static, string2: final}], static, static)
+        handleRecoverableError(Message[ModifierOutOfOrder, The modifier 'external' should be before the modifier 'static'., Try re-ordering the modifiers., {string: external, string2: static}], external, external)
+        beginMember()
+          beginFields(;)
+            handleNoType(external)
+            handleIdentifier(i8, fieldDeclaration)
+            handleNoFieldInitializer(;)
+          endClassFields(null, external, static, null, null, final, 1, final, ;)
+        endMember()
+      endClassOrMixinBody(DeclarationKind.Class, 6, {, })
+    endClassDeclaration(class, })
+  endTopLevelDeclaration()
+endCompilationUnit(3, )
diff --git a/pkg/front_end/parser_testcases/nnbd/error_recovery/external_placement.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/error_recovery/external_placement.dart.intertwined.expect
new file mode 100644
index 0000000..ec0650f
--- /dev/null
+++ b/pkg/front_end/parser_testcases/nnbd/error_recovery/external_placement.dart.intertwined.expect
@@ -0,0 +1,178 @@
+parseUnit(final)
+  skipErrorTokens(final)
+  listener: beginCompilationUnit(final)
+  syntheticPreviousToken(final)
+  parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+    parseMetadataStar()
+      listener: beginMetadataStar(final)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl()
+      listener: beginTopLevelMember(final)
+      reportRecoverableError(external, Message[ModifierOutOfOrder, The modifier 'external' should be before the modifier 'final'., Try re-ordering the modifiers., {string: external, string2: final}])
+        listener: handleRecoverableError(Message[ModifierOutOfOrder, The modifier 'external' should be before the modifier 'final'., Try re-ordering the modifiers., {string: external, string2: final}], external, external)
+      parseFields(, null, external, null, null, null, final, external, Instance of 'SimpleType', i1, DeclarationKind.TopLevel, null, false)
+        listener: beginFields()
+        listener: handleIdentifier(int, typeReference)
+        listener: handleNoTypeArguments(i1)
+        listener: handleType(int, null)
+        ensureIdentifierPotentiallyRecovered(int, topLevelVariableDeclaration, false)
+          listener: handleIdentifier(i1, topLevelVariableDeclaration)
+        parseFieldInitializerOpt(i1, i1, null, null, external, final, DeclarationKind.TopLevel, null)
+          listener: handleNoFieldInitializer(;)
+        listener: endTopLevelFields(external, null, null, null, final, 1, final, ;)
+  listener: endTopLevelDeclaration(var)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(var)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl(;)
+      listener: beginTopLevelMember(var)
+      reportRecoverableError(external, Message[ModifierOutOfOrder, The modifier 'external' should be before the modifier 'var'., Try re-ordering the modifiers., {string: external, string2: var}])
+        listener: handleRecoverableError(Message[ModifierOutOfOrder, The modifier 'external' should be before the modifier 'var'., Try re-ordering the modifiers., {string: external, string2: var}], external, external)
+      parseFields(;, null, external, null, null, null, var, external, Instance of 'NoType', i2, DeclarationKind.TopLevel, null, false)
+        listener: beginFields(;)
+        listener: handleNoType(external)
+        ensureIdentifierPotentiallyRecovered(external, topLevelVariableDeclaration, false)
+          listener: handleIdentifier(i2, topLevelVariableDeclaration)
+        parseFieldInitializerOpt(i2, i2, null, null, external, var, DeclarationKind.TopLevel, null)
+          listener: handleNoFieldInitializer(;)
+        listener: endTopLevelFields(external, null, null, null, var, 1, var, ;)
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(;, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          listener: handleIdentifier(C, classOrMixinDeclaration)
+        listener: handleNoTypeVariables({)
+        listener: beginClassDeclaration(class, null, C)
+        parseClass(C, class, class, C)
+          parseClassHeaderOpt(C, class, class)
+            parseClassExtendsOpt(C)
+              listener: handleNoType(C)
+              listener: handleClassExtends(null, 1)
+            parseWithClauseOpt(C)
+              listener: handleClassNoWithClause()
+            parseClassOrMixinImplementsOpt(C)
+              listener: handleClassOrMixinImplements(null, 0)
+            listener: handleClassHeader(class, class, null)
+          parseClassOrMixinOrExtensionBody(C, DeclarationKind.Class, C)
+            listener: beginClassOrMixinBody(DeclarationKind.Class, {)
+            notEofOrValue(}, covariant)
+            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, C)
+              parseMetadataStar({)
+                listener: beginMetadataStar(covariant)
+                listener: endMetadataStar(0)
+              reportRecoverableError(external, Message[ModifierOutOfOrder, The modifier 'external' should be before the modifier 'covariant'., Try re-ordering the modifiers., {string: external, string2: covariant}])
+                listener: handleRecoverableError(Message[ModifierOutOfOrder, The modifier 'external' should be before the modifier 'covariant'., Try re-ordering the modifiers., {string: external, string2: covariant}], external, external)
+              listener: beginMember()
+              parseFields({, null, external, null, covariant, null, null, external, Instance of 'SimpleType', i3, DeclarationKind.Class, C, false)
+                listener: beginFields({)
+                listener: handleIdentifier(num, typeReference)
+                listener: handleNoTypeArguments(i3)
+                listener: handleType(num, null)
+                ensureIdentifierPotentiallyRecovered(num, fieldDeclaration, false)
+                  listener: handleIdentifier(i3, fieldDeclaration)
+                parseFieldInitializerOpt(i3, i3, null, null, external, null, DeclarationKind.Class, C)
+                  listener: handleNoFieldInitializer(;)
+                listener: endClassFields(null, external, null, covariant, null, null, 1, covariant, ;)
+              listener: endMember()
+            notEofOrValue(}, final)
+            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, C)
+              parseMetadataStar(;)
+                listener: beginMetadataStar(final)
+                listener: endMetadataStar(0)
+              reportRecoverableError(external, Message[ModifierOutOfOrder, The modifier 'external' should be before the modifier 'final'., Try re-ordering the modifiers., {string: external, string2: final}])
+                listener: handleRecoverableError(Message[ModifierOutOfOrder, The modifier 'external' should be before the modifier 'final'., Try re-ordering the modifiers., {string: external, string2: final}], external, external)
+              listener: beginMember()
+              parseFields(;, null, external, null, null, null, final, external, Instance of 'SimpleType', i4, DeclarationKind.Class, C, false)
+                listener: beginFields(;)
+                listener: handleIdentifier(int, typeReference)
+                listener: handleNoTypeArguments(i4)
+                listener: handleType(int, null)
+                ensureIdentifierPotentiallyRecovered(int, fieldDeclaration, false)
+                  listener: handleIdentifier(i4, fieldDeclaration)
+                parseFieldInitializerOpt(i4, i4, null, null, external, final, DeclarationKind.Class, C)
+                  listener: handleNoFieldInitializer(;)
+                listener: endClassFields(null, external, null, null, null, final, 1, final, ;)
+              listener: endMember()
+            notEofOrValue(}, final)
+            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, C)
+              parseMetadataStar(;)
+                listener: beginMetadataStar(final)
+                listener: endMetadataStar(0)
+              reportRecoverableError(external, Message[ModifierOutOfOrder, The modifier 'external' should be before the modifier 'final'., Try re-ordering the modifiers., {string: external, string2: final}])
+                listener: handleRecoverableError(Message[ModifierOutOfOrder, The modifier 'external' should be before the modifier 'final'., Try re-ordering the modifiers., {string: external, string2: final}], external, external)
+              listener: beginMember()
+              parseFields(;, null, external, null, null, null, final, external, Instance of 'NoType', i5, DeclarationKind.Class, C, false)
+                listener: beginFields(;)
+                listener: handleNoType(external)
+                ensureIdentifierPotentiallyRecovered(external, fieldDeclaration, false)
+                  listener: handleIdentifier(i5, fieldDeclaration)
+                parseFieldInitializerOpt(i5, i5, null, null, external, final, DeclarationKind.Class, C)
+                  listener: handleNoFieldInitializer(;)
+                listener: endClassFields(null, external, null, null, null, final, 1, final, ;)
+              listener: endMember()
+            notEofOrValue(}, static)
+            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, C)
+              parseMetadataStar(;)
+                listener: beginMetadataStar(static)
+                listener: endMetadataStar(0)
+              reportRecoverableError(external, Message[ModifierOutOfOrder, The modifier 'external' should be before the modifier 'static'., Try re-ordering the modifiers., {string: external, string2: static}])
+                listener: handleRecoverableError(Message[ModifierOutOfOrder, The modifier 'external' should be before the modifier 'static'., Try re-ordering the modifiers., {string: external, string2: static}], external, external)
+              listener: beginMember()
+              parseFields(;, null, external, static, null, null, final, final, Instance of 'NoType', i6, DeclarationKind.Class, C, false)
+                listener: beginFields(;)
+                listener: handleNoType(final)
+                ensureIdentifierPotentiallyRecovered(final, fieldDeclaration, false)
+                  listener: handleIdentifier(i6, fieldDeclaration)
+                parseFieldInitializerOpt(i6, i6, null, null, external, final, DeclarationKind.Class, C)
+                  listener: handleNoFieldInitializer(;)
+                listener: endClassFields(null, external, static, null, null, final, 1, static, ;)
+              listener: endMember()
+            notEofOrValue(}, static)
+            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, C)
+              parseMetadataStar(;)
+                listener: beginMetadataStar(static)
+                listener: endMetadataStar(0)
+              reportRecoverableError(external, Message[ModifierOutOfOrder, The modifier 'external' should be before the modifier 'static'., Try re-ordering the modifiers., {string: external, string2: static}])
+                listener: handleRecoverableError(Message[ModifierOutOfOrder, The modifier 'external' should be before the modifier 'static'., Try re-ordering the modifiers., {string: external, string2: static}], external, external)
+              listener: beginMember()
+              parseFields(;, null, external, static, null, null, final, external, Instance of 'NoType', i7, DeclarationKind.Class, C, false)
+                listener: beginFields(;)
+                listener: handleNoType(external)
+                ensureIdentifierPotentiallyRecovered(external, fieldDeclaration, false)
+                  listener: handleIdentifier(i7, fieldDeclaration)
+                parseFieldInitializerOpt(i7, i7, null, null, external, final, DeclarationKind.Class, C)
+                  listener: handleNoFieldInitializer(;)
+                listener: endClassFields(null, external, static, null, null, final, 1, static, ;)
+              listener: endMember()
+            notEofOrValue(}, final)
+            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, C)
+              parseMetadataStar(;)
+                listener: beginMetadataStar(final)
+                listener: endMetadataStar(0)
+              reportRecoverableError(static, Message[ModifierOutOfOrder, The modifier 'static' should be before the modifier 'final'., Try re-ordering the modifiers., {string: static, string2: final}])
+                listener: handleRecoverableError(Message[ModifierOutOfOrder, The modifier 'static' should be before the modifier 'final'., Try re-ordering the modifiers., {string: static, string2: final}], static, static)
+              reportRecoverableError(external, Message[ModifierOutOfOrder, The modifier 'external' should be before the modifier 'static'., Try re-ordering the modifiers., {string: external, string2: static}])
+                listener: handleRecoverableError(Message[ModifierOutOfOrder, The modifier 'external' should be before the modifier 'static'., Try re-ordering the modifiers., {string: external, string2: static}], external, external)
+              listener: beginMember()
+              parseFields(;, null, external, static, null, null, final, external, Instance of 'NoType', i8, DeclarationKind.Class, C, false)
+                listener: beginFields(;)
+                listener: handleNoType(external)
+                ensureIdentifierPotentiallyRecovered(external, fieldDeclaration, false)
+                  listener: handleIdentifier(i8, fieldDeclaration)
+                parseFieldInitializerOpt(i8, i8, null, null, external, final, DeclarationKind.Class, C)
+                  listener: handleNoFieldInitializer(;)
+                listener: endClassFields(null, external, static, null, null, final, 1, final, ;)
+              listener: endMember()
+            notEofOrValue(}, })
+            listener: endClassOrMixinBody(DeclarationKind.Class, 6, {, })
+          listener: endClassDeclaration(class, })
+  listener: endTopLevelDeclaration()
+  reportAllErrorTokens(final)
+  listener: endCompilationUnit(3, )
diff --git a/pkg/front_end/parser_testcases/nnbd/error_recovery/external_placement.dart.parser.expect b/pkg/front_end/parser_testcases/nnbd/error_recovery/external_placement.dart.parser.expect
new file mode 100644
index 0000000..2b628f5
--- /dev/null
+++ b/pkg/front_end/parser_testcases/nnbd/error_recovery/external_placement.dart.parser.expect
@@ -0,0 +1,23 @@
+final external int i1;
+var external i2;
+
+class C {
+covariant external num i3;
+final external int i4;
+final external i5;
+static external final i6;
+static final external i7;
+final static external i8;
+}
+
+final[KeywordToken] external[KeywordToken] int[StringToken] i1[StringToken];[SimpleToken]
+var[KeywordToken] external[KeywordToken] i2[StringToken];[SimpleToken]
+
+class[KeywordToken] C[StringToken] {[BeginToken]
+covariant[KeywordToken] external[KeywordToken] num[StringToken] i3[StringToken];[SimpleToken]
+final[KeywordToken] external[KeywordToken] int[StringToken] i4[StringToken];[SimpleToken]
+final[KeywordToken] external[KeywordToken] i5[StringToken];[SimpleToken]
+static[KeywordToken] external[KeywordToken] final[KeywordToken] i6[StringToken];[SimpleToken]
+static[KeywordToken] final[KeywordToken] external[KeywordToken] i7[StringToken];[SimpleToken]
+final[KeywordToken] static[KeywordToken] external[KeywordToken] i8[StringToken];[SimpleToken]
+}[SimpleToken][SimpleToken]
diff --git a/pkg/front_end/parser_testcases/nnbd/error_recovery/external_placement.dart.scanner.expect b/pkg/front_end/parser_testcases/nnbd/error_recovery/external_placement.dart.scanner.expect
new file mode 100644
index 0000000..2b628f5
--- /dev/null
+++ b/pkg/front_end/parser_testcases/nnbd/error_recovery/external_placement.dart.scanner.expect
@@ -0,0 +1,23 @@
+final external int i1;
+var external i2;
+
+class C {
+covariant external num i3;
+final external int i4;
+final external i5;
+static external final i6;
+static final external i7;
+final static external i8;
+}
+
+final[KeywordToken] external[KeywordToken] int[StringToken] i1[StringToken];[SimpleToken]
+var[KeywordToken] external[KeywordToken] i2[StringToken];[SimpleToken]
+
+class[KeywordToken] C[StringToken] {[BeginToken]
+covariant[KeywordToken] external[KeywordToken] num[StringToken] i3[StringToken];[SimpleToken]
+final[KeywordToken] external[KeywordToken] int[StringToken] i4[StringToken];[SimpleToken]
+final[KeywordToken] external[KeywordToken] i5[StringToken];[SimpleToken]
+static[KeywordToken] external[KeywordToken] final[KeywordToken] i6[StringToken];[SimpleToken]
+static[KeywordToken] final[KeywordToken] external[KeywordToken] i7[StringToken];[SimpleToken]
+final[KeywordToken] static[KeywordToken] external[KeywordToken] i8[StringToken];[SimpleToken]
+}[SimpleToken][SimpleToken]
diff --git a/pkg/front_end/parser_testcases/nnbd/error_recovery/late_without_var_etc.dart b/pkg/front_end/parser_testcases/nnbd/error_recovery/late_without_var_etc.dart
new file mode 100644
index 0000000..b228c24
--- /dev/null
+++ b/pkg/front_end/parser_testcases/nnbd/error_recovery/late_without_var_etc.dart
@@ -0,0 +1,21 @@
+// https://github.com/dart-lang/sdk/issues/43811
+// https://github.com/dart-lang/sdk/issues/43812
+// https://github.com/dart-lang/sdk/issues/43813
+
+void main() {
+  late x;
+}
+
+late y;
+
+class Foo {
+  late z;
+
+  void foo() {
+    late x;
+  }
+
+  static void bar() {
+    late x;
+  }
+}
\ No newline at end of file
diff --git a/pkg/front_end/parser_testcases/nnbd/error_recovery/late_without_var_etc.dart.expect b/pkg/front_end/parser_testcases/nnbd/error_recovery/late_without_var_etc.dart.expect
new file mode 100644
index 0000000..5ec7a5e
--- /dev/null
+++ b/pkg/front_end/parser_testcases/nnbd/error_recovery/late_without_var_etc.dart.expect
@@ -0,0 +1,133 @@
+Problems reported:
+
+parser/nnbd/error_recovery/late_without_var_etc:6:8: Variables must be declared using the keywords 'const', 'final', 'var' or a type name.
+  late x;
+       ^
+
+parser/nnbd/error_recovery/late_without_var_etc:9:6: Variables must be declared using the keywords 'const', 'final', 'var' or a type name.
+late y;
+     ^
+
+parser/nnbd/error_recovery/late_without_var_etc:12:8: Variables must be declared using the keywords 'const', 'final', 'var' or a type name.
+  late z;
+       ^
+
+parser/nnbd/error_recovery/late_without_var_etc:15:10: Variables must be declared using the keywords 'const', 'final', 'var' or a type name.
+    late x;
+         ^
+
+parser/nnbd/error_recovery/late_without_var_etc:19:10: Variables must be declared using the keywords 'const', 'final', 'var' or a type name.
+    late x;
+         ^
+
+beginCompilationUnit(void)
+  beginMetadataStar(void)
+  endMetadataStar(0)
+  beginTopLevelMember(void)
+    beginTopLevelMethod(, null)
+      handleVoidKeyword(void)
+      handleIdentifier(main, topLevelFunctionDeclaration)
+      handleNoTypeVariables(()
+      beginFormalParameters((, MemberKind.TopLevelMethod)
+      endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+      handleAsyncModifier(null, null)
+      beginBlockFunctionBody({)
+        handleRecoverableError(MissingConstFinalVarOrType, x, x)
+        beginMetadataStar(late)
+        endMetadataStar(0)
+        handleNoType(late)
+        beginVariablesDeclaration(x, late, null)
+          handleIdentifier(x, localVariableDeclaration)
+          beginInitializedIdentifier(x)
+            handleNoVariableInitializer(x)
+          endInitializedIdentifier(x)
+        endVariablesDeclaration(1, ;)
+      endBlockFunctionBody(1, {, })
+    endTopLevelMethod(void, null, })
+  endTopLevelDeclaration(late)
+  beginMetadataStar(late)
+  endMetadataStar(0)
+  beginTopLevelMember(late)
+    beginFields(})
+      handleRecoverableError(MissingConstFinalVarOrType, y, y)
+      handleNoType(late)
+      handleIdentifier(y, topLevelVariableDeclaration)
+      handleNoFieldInitializer(;)
+    endTopLevelFields(null, null, null, late, null, 1, late, ;)
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleIdentifier(Foo, classOrMixinDeclaration)
+    handleNoTypeVariables({)
+    beginClassDeclaration(class, null, Foo)
+      handleNoType(Foo)
+      handleClassExtends(null, 1)
+      handleClassNoWithClause()
+      handleClassOrMixinImplements(null, 0)
+      handleClassHeader(class, class, null)
+      beginClassOrMixinBody(DeclarationKind.Class, {)
+        beginMetadataStar(late)
+        endMetadataStar(0)
+        beginMember()
+          beginFields({)
+            handleRecoverableError(MissingConstFinalVarOrType, z, z)
+            handleNoType(late)
+            handleIdentifier(z, fieldDeclaration)
+            handleNoFieldInitializer(;)
+          endClassFields(null, null, null, null, late, null, 1, late, ;)
+        endMember()
+        beginMetadataStar(void)
+        endMetadataStar(0)
+        beginMember()
+          beginMethod(null, null, null, null, null, foo)
+            handleVoidKeyword(void)
+            handleIdentifier(foo, methodDeclaration)
+            handleNoTypeVariables(()
+            beginFormalParameters((, MemberKind.NonStaticMethod)
+            endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
+            handleNoInitializers()
+            handleAsyncModifier(null, null)
+            beginBlockFunctionBody({)
+              handleRecoverableError(MissingConstFinalVarOrType, x, x)
+              beginMetadataStar(late)
+              endMetadataStar(0)
+              handleNoType(late)
+              beginVariablesDeclaration(x, late, null)
+                handleIdentifier(x, localVariableDeclaration)
+                beginInitializedIdentifier(x)
+                  handleNoVariableInitializer(x)
+                endInitializedIdentifier(x)
+              endVariablesDeclaration(1, ;)
+            endBlockFunctionBody(1, {, })
+          endClassMethod(null, void, (, null, })
+        endMember()
+        beginMetadataStar(static)
+        endMetadataStar(0)
+        beginMember()
+          beginMethod(null, static, null, null, null, bar)
+            handleVoidKeyword(void)
+            handleIdentifier(bar, methodDeclaration)
+            handleNoTypeVariables(()
+            beginFormalParameters((, MemberKind.StaticMethod)
+            endFormalParameters(0, (, ), MemberKind.StaticMethod)
+            handleNoInitializers()
+            handleAsyncModifier(null, null)
+            beginBlockFunctionBody({)
+              handleRecoverableError(MissingConstFinalVarOrType, x, x)
+              beginMetadataStar(late)
+              endMetadataStar(0)
+              handleNoType(late)
+              beginVariablesDeclaration(x, late, null)
+                handleIdentifier(x, localVariableDeclaration)
+                beginInitializedIdentifier(x)
+                  handleNoVariableInitializer(x)
+                endInitializedIdentifier(x)
+              endVariablesDeclaration(1, ;)
+            endBlockFunctionBody(1, {, })
+          endClassMethod(null, static, (, null, })
+        endMember()
+      endClassOrMixinBody(DeclarationKind.Class, 3, {, })
+    endClassDeclaration(class, })
+  endTopLevelDeclaration()
+endCompilationUnit(3, )
diff --git a/pkg/front_end/parser_testcases/nnbd/error_recovery/late_without_var_etc.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/error_recovery/late_without_var_etc.dart.intertwined.expect
new file mode 100644
index 0000000..13b0274
--- /dev/null
+++ b/pkg/front_end/parser_testcases/nnbd/error_recovery/late_without_var_etc.dart.intertwined.expect
@@ -0,0 +1,224 @@
+parseUnit(void)
+  skipErrorTokens(void)
+  listener: beginCompilationUnit(void)
+  syntheticPreviousToken(void)
+  parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+    parseMetadataStar()
+      listener: beginMetadataStar(void)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl()
+      listener: beginTopLevelMember(void)
+      parseTopLevelMethod(, null, , Instance of 'VoidType', null, main, false)
+        listener: beginTopLevelMethod(, null)
+        listener: handleVoidKeyword(void)
+        ensureIdentifierPotentiallyRecovered(void, topLevelFunctionDeclaration, false)
+          listener: handleIdentifier(main, topLevelFunctionDeclaration)
+        parseMethodTypeVar(main)
+          listener: handleNoTypeVariables(()
+        parseGetterOrFormalParameters(main, main, false, MemberKind.TopLevelMethod)
+          parseFormalParameters(main, MemberKind.TopLevelMethod)
+            parseFormalParametersRest((, MemberKind.TopLevelMethod)
+              listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+              listener: endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+        parseAsyncModifierOpt())
+          listener: handleAsyncModifier(null, null)
+          inPlainSync()
+        parseFunctionBody(), false, false)
+          listener: beginBlockFunctionBody({)
+          notEofOrValue(}, late)
+          parseStatement({)
+            parseStatementX({)
+              parseExpressionStatementOrDeclaration({, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(late, {, late, null, null, false)
+                  looksLikeLocalFunction(x)
+                  reportRecoverableError(x, MissingConstFinalVarOrType)
+                    listener: handleRecoverableError(MissingConstFinalVarOrType, x, x)
+                  listener: beginMetadataStar(late)
+                  listener: endMetadataStar(0)
+                  listener: handleNoType(late)
+                  listener: beginVariablesDeclaration(x, late, null)
+                  parseVariablesDeclarationRest(late, true)
+                    parseOptionallyInitializedIdentifier(late)
+                      ensureIdentifier(late, localVariableDeclaration)
+                        listener: handleIdentifier(x, localVariableDeclaration)
+                      listener: beginInitializedIdentifier(x)
+                      parseVariableInitializerOpt(x)
+                        listener: handleNoVariableInitializer(x)
+                      listener: endInitializedIdentifier(x)
+                    ensureSemicolon(x)
+                    listener: endVariablesDeclaration(1, ;)
+          notEofOrValue(}, })
+          listener: endBlockFunctionBody(1, {, })
+        listener: endTopLevelMethod(void, null, })
+  listener: endTopLevelDeclaration(late)
+  parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+    parseMetadataStar(})
+      listener: beginMetadataStar(late)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl(})
+      listener: beginTopLevelMember(late)
+      isReservedKeyword(;)
+      parseFields(}, null, null, null, null, late, null, late, Instance of 'NoType', y, DeclarationKind.TopLevel, null, false)
+        listener: beginFields(})
+        reportRecoverableError(y, MissingConstFinalVarOrType)
+          listener: handleRecoverableError(MissingConstFinalVarOrType, y, y)
+        listener: handleNoType(late)
+        ensureIdentifierPotentiallyRecovered(late, topLevelVariableDeclaration, false)
+          listener: handleIdentifier(y, topLevelVariableDeclaration)
+        parseFieldInitializerOpt(y, y, late, null, null, null, DeclarationKind.TopLevel, null)
+          listener: handleNoFieldInitializer(;)
+        listener: endTopLevelFields(null, null, null, late, null, 1, late, ;)
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(;, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          listener: handleIdentifier(Foo, classOrMixinDeclaration)
+        listener: handleNoTypeVariables({)
+        listener: beginClassDeclaration(class, null, Foo)
+        parseClass(Foo, class, class, Foo)
+          parseClassHeaderOpt(Foo, class, class)
+            parseClassExtendsOpt(Foo)
+              listener: handleNoType(Foo)
+              listener: handleClassExtends(null, 1)
+            parseWithClauseOpt(Foo)
+              listener: handleClassNoWithClause()
+            parseClassOrMixinImplementsOpt(Foo)
+              listener: handleClassOrMixinImplements(null, 0)
+            listener: handleClassHeader(class, class, null)
+          parseClassOrMixinOrExtensionBody(Foo, DeclarationKind.Class, Foo)
+            listener: beginClassOrMixinBody(DeclarationKind.Class, {)
+            notEofOrValue(}, late)
+            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Foo)
+              parseMetadataStar({)
+                listener: beginMetadataStar(late)
+                listener: endMetadataStar(0)
+              listener: beginMember()
+              isReservedKeyword(;)
+              parseFields({, null, null, null, null, late, null, late, Instance of 'NoType', z, DeclarationKind.Class, Foo, false)
+                listener: beginFields({)
+                reportRecoverableError(z, MissingConstFinalVarOrType)
+                  listener: handleRecoverableError(MissingConstFinalVarOrType, z, z)
+                listener: handleNoType(late)
+                ensureIdentifierPotentiallyRecovered(late, fieldDeclaration, false)
+                  listener: handleIdentifier(z, fieldDeclaration)
+                parseFieldInitializerOpt(z, z, late, null, null, null, DeclarationKind.Class, Foo)
+                  listener: handleNoFieldInitializer(;)
+                listener: endClassFields(null, null, null, null, late, null, 1, late, ;)
+              listener: endMember()
+            notEofOrValue(}, void)
+            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Foo)
+              parseMetadataStar(;)
+                listener: beginMetadataStar(void)
+                listener: endMetadataStar(0)
+              listener: beginMember()
+              parseMethod(;, null, null, null, null, null, null, ;, Instance of 'VoidType', null, foo, DeclarationKind.Class, Foo, false)
+                listener: beginMethod(null, null, null, null, null, foo)
+                listener: handleVoidKeyword(void)
+                ensureIdentifierPotentiallyRecovered(void, methodDeclaration, false)
+                  listener: handleIdentifier(foo, methodDeclaration)
+                parseQualifiedRestOpt(foo, methodDeclarationContinuation)
+                parseMethodTypeVar(foo)
+                  listener: handleNoTypeVariables(()
+                parseGetterOrFormalParameters(foo, foo, false, MemberKind.NonStaticMethod)
+                  parseFormalParameters(foo, MemberKind.NonStaticMethod)
+                    parseFormalParametersRest((, MemberKind.NonStaticMethod)
+                      listener: beginFormalParameters((, MemberKind.NonStaticMethod)
+                      listener: endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
+                parseInitializersOpt())
+                  listener: handleNoInitializers()
+                parseAsyncModifierOpt())
+                  listener: handleAsyncModifier(null, null)
+                  inPlainSync()
+                inPlainSync()
+                parseFunctionBody(), false, true)
+                  listener: beginBlockFunctionBody({)
+                  notEofOrValue(}, late)
+                  parseStatement({)
+                    parseStatementX({)
+                      parseExpressionStatementOrDeclaration({, false)
+                        parseExpressionStatementOrDeclarationAfterModifiers(late, {, late, null, null, false)
+                          looksLikeLocalFunction(x)
+                          reportRecoverableError(x, MissingConstFinalVarOrType)
+                            listener: handleRecoverableError(MissingConstFinalVarOrType, x, x)
+                          listener: beginMetadataStar(late)
+                          listener: endMetadataStar(0)
+                          listener: handleNoType(late)
+                          listener: beginVariablesDeclaration(x, late, null)
+                          parseVariablesDeclarationRest(late, true)
+                            parseOptionallyInitializedIdentifier(late)
+                              ensureIdentifier(late, localVariableDeclaration)
+                                listener: handleIdentifier(x, localVariableDeclaration)
+                              listener: beginInitializedIdentifier(x)
+                              parseVariableInitializerOpt(x)
+                                listener: handleNoVariableInitializer(x)
+                              listener: endInitializedIdentifier(x)
+                            ensureSemicolon(x)
+                            listener: endVariablesDeclaration(1, ;)
+                  notEofOrValue(}, })
+                  listener: endBlockFunctionBody(1, {, })
+                listener: endClassMethod(null, void, (, null, })
+              listener: endMember()
+            notEofOrValue(}, static)
+            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+              parseMetadataStar(})
+                listener: beginMetadataStar(static)
+                listener: endMetadataStar(0)
+              listener: beginMember()
+              parseMethod(}, null, null, static, null, null, null, static, Instance of 'VoidType', null, bar, DeclarationKind.Class, Foo, false)
+                listener: beginMethod(null, static, null, null, null, bar)
+                listener: handleVoidKeyword(void)
+                ensureIdentifierPotentiallyRecovered(void, methodDeclaration, false)
+                  listener: handleIdentifier(bar, methodDeclaration)
+                parseQualifiedRestOpt(bar, methodDeclarationContinuation)
+                parseMethodTypeVar(bar)
+                  listener: handleNoTypeVariables(()
+                parseGetterOrFormalParameters(bar, bar, false, MemberKind.StaticMethod)
+                  parseFormalParameters(bar, MemberKind.StaticMethod)
+                    parseFormalParametersRest((, MemberKind.StaticMethod)
+                      listener: beginFormalParameters((, MemberKind.StaticMethod)
+                      listener: endFormalParameters(0, (, ), MemberKind.StaticMethod)
+                parseInitializersOpt())
+                  listener: handleNoInitializers()
+                parseAsyncModifierOpt())
+                  listener: handleAsyncModifier(null, null)
+                  inPlainSync()
+                parseFunctionBody(), false, false)
+                  listener: beginBlockFunctionBody({)
+                  notEofOrValue(}, late)
+                  parseStatement({)
+                    parseStatementX({)
+                      parseExpressionStatementOrDeclaration({, false)
+                        parseExpressionStatementOrDeclarationAfterModifiers(late, {, late, null, null, false)
+                          looksLikeLocalFunction(x)
+                          reportRecoverableError(x, MissingConstFinalVarOrType)
+                            listener: handleRecoverableError(MissingConstFinalVarOrType, x, x)
+                          listener: beginMetadataStar(late)
+                          listener: endMetadataStar(0)
+                          listener: handleNoType(late)
+                          listener: beginVariablesDeclaration(x, late, null)
+                          parseVariablesDeclarationRest(late, true)
+                            parseOptionallyInitializedIdentifier(late)
+                              ensureIdentifier(late, localVariableDeclaration)
+                                listener: handleIdentifier(x, localVariableDeclaration)
+                              listener: beginInitializedIdentifier(x)
+                              parseVariableInitializerOpt(x)
+                                listener: handleNoVariableInitializer(x)
+                              listener: endInitializedIdentifier(x)
+                            ensureSemicolon(x)
+                            listener: endVariablesDeclaration(1, ;)
+                  notEofOrValue(}, })
+                  listener: endBlockFunctionBody(1, {, })
+                listener: endClassMethod(null, static, (, null, })
+              listener: endMember()
+            notEofOrValue(}, })
+            listener: endClassOrMixinBody(DeclarationKind.Class, 3, {, })
+          listener: endClassDeclaration(class, })
+  listener: endTopLevelDeclaration()
+  reportAllErrorTokens(void)
+  listener: endCompilationUnit(3, )
diff --git a/pkg/front_end/parser_testcases/nnbd/error_recovery/late_without_var_etc.dart.parser.expect b/pkg/front_end/parser_testcases/nnbd/error_recovery/late_without_var_etc.dart.parser.expect
new file mode 100644
index 0000000..3842dc9
--- /dev/null
+++ b/pkg/front_end/parser_testcases/nnbd/error_recovery/late_without_var_etc.dart.parser.expect
@@ -0,0 +1,35 @@
+void main() {
+late x;
+}
+
+late y;
+
+class Foo {
+late z;
+
+void foo() {
+late x;
+}
+
+static void bar() {
+late x;
+}
+}
+
+void[KeywordToken] main[StringToken]([BeginToken])[SimpleToken] {[BeginToken]
+late[KeywordToken] x[StringToken];[SimpleToken]
+}[SimpleToken]
+
+late[KeywordToken] y[StringToken];[SimpleToken]
+
+class[KeywordToken] Foo[StringToken] {[BeginToken]
+late[KeywordToken] z[StringToken];[SimpleToken]
+
+void[KeywordToken] foo[StringToken]([BeginToken])[SimpleToken] {[BeginToken]
+late[KeywordToken] x[StringToken];[SimpleToken]
+}[SimpleToken]
+
+static[KeywordToken] void[KeywordToken] bar[StringToken]([BeginToken])[SimpleToken] {[BeginToken]
+late[KeywordToken] x[StringToken];[SimpleToken]
+}[SimpleToken]
+}[SimpleToken][SimpleToken]
diff --git a/pkg/front_end/parser_testcases/nnbd/error_recovery/late_without_var_etc.dart.scanner.expect b/pkg/front_end/parser_testcases/nnbd/error_recovery/late_without_var_etc.dart.scanner.expect
new file mode 100644
index 0000000..3842dc9
--- /dev/null
+++ b/pkg/front_end/parser_testcases/nnbd/error_recovery/late_without_var_etc.dart.scanner.expect
@@ -0,0 +1,35 @@
+void main() {
+late x;
+}
+
+late y;
+
+class Foo {
+late z;
+
+void foo() {
+late x;
+}
+
+static void bar() {
+late x;
+}
+}
+
+void[KeywordToken] main[StringToken]([BeginToken])[SimpleToken] {[BeginToken]
+late[KeywordToken] x[StringToken];[SimpleToken]
+}[SimpleToken]
+
+late[KeywordToken] y[StringToken];[SimpleToken]
+
+class[KeywordToken] Foo[StringToken] {[BeginToken]
+late[KeywordToken] z[StringToken];[SimpleToken]
+
+void[KeywordToken] foo[StringToken]([BeginToken])[SimpleToken] {[BeginToken]
+late[KeywordToken] x[StringToken];[SimpleToken]
+}[SimpleToken]
+
+static[KeywordToken] void[KeywordToken] bar[StringToken]([BeginToken])[SimpleToken] {[BeginToken]
+late[KeywordToken] x[StringToken];[SimpleToken]
+}[SimpleToken]
+}[SimpleToken][SimpleToken]
diff --git a/pkg/front_end/pubspec.yaml b/pkg/front_end/pubspec.yaml
index f81b308..3f3905b 100644
--- a/pkg/front_end/pubspec.yaml
+++ b/pkg/front_end/pubspec.yaml
@@ -7,15 +7,14 @@
 
 environment:
   sdk: '>=2.2.2 <3.0.0'
+
 dependencies:
-  _fe_analyzer_shared:
-    path: ../_fe_analyzer_shared/
-  kernel:
-    path: ../kernel/
-  package_config:
-    path: ../../third_party/pkg_tested/package_config/
+  _fe_analyzer_shared: any
+  kernel: any
+  package_config: any
+
 dev_dependencies:
-  analyzer: 0.39.1
+  analyzer: any
   args: '>=0.13.0 <2.0.0'
   async_helper:
     path: ../async_helper
@@ -40,3 +39,13 @@
     path: ../vm_service
   web_socket_channel: ^1.0.4
   yaml: '^2.1.12'
+
+dependency_overrides:
+  _fe_analyzer_shared:
+    path: ../_fe_analyzer_shared/
+  analyzer:
+    path: ../analyzer
+  kernel:
+    path: ../kernel/
+  package_config:
+    path: ../../third_party/pkg_tested/package_config/
diff --git a/pkg/front_end/test/covariance_check/data/field.dart b/pkg/front_end/test/covariance_check/data/field.dart
index caa6ff9..743548d 100644
--- a/pkg/front_end/test/covariance_check/data/field.dart
+++ b/pkg/front_end/test/covariance_check/data/field.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 class Class<T> {
   T direct;
   void Function(T) functionArgument;
diff --git a/pkg/front_end/test/covariance_check/data/getter.dart b/pkg/front_end/test/covariance_check/data/getter.dart
index 50ef2bc..95d8e1a 100644
--- a/pkg/front_end/test/covariance_check/data/getter.dart
+++ b/pkg/front_end/test/covariance_check/data/getter.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 class Class<T> {
   T get direct => null;
   void Function(T) get functionArgument => null;
diff --git a/pkg/front_end/test/covariance_check/data/method.dart b/pkg/front_end/test/covariance_check/data/method.dart
index 34a2331..91bb44f 100644
--- a/pkg/front_end/test/covariance_check/data/method.dart
+++ b/pkg/front_end/test/covariance_check/data/method.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 class Class<T> {
   T direct() => null;
   void Function(T) functionArgument() => null;
diff --git a/pkg/front_end/test/crashing_test_case_minimizer.dart b/pkg/front_end/test/crashing_test_case_minimizer.dart
index c6aca7f..4f043ed 100644
--- a/pkg/front_end/test/crashing_test_case_minimizer.dart
+++ b/pkg/front_end/test/crashing_test_case_minimizer.dart
@@ -550,7 +550,7 @@
   CompilerOptions options = getOptions();
 
   if (nnbd) {
-    options.experimentalFlags = {ExperimentalFlag.nonNullable: true};
+    options.explicitExperimentalFlags = {ExperimentalFlag.nonNullable: true};
   }
 
   TargetFlags targetFlags = new TargetFlags(
diff --git a/pkg/front_end/test/enable_non_nullable/data/.dart_tool/package_config.json b/pkg/front_end/test/enable_non_nullable/data/.dart_tool/package_config.json
new file mode 100644
index 0000000..bc435fb
--- /dev/null
+++ b/pkg/front_end/test/enable_non_nullable/data/.dart_tool/package_config.json
@@ -0,0 +1,18 @@
+{
+  "configVersion": 2,
+  "packages": [
+    {
+      "name": "allowed_package",
+      "rootUri": "../allowed_package/",
+      "packageUri": "lib/",
+      "languageVersion": "2.9"
+    },
+    {
+      "name": "not_allowed_package",
+      "rootUri": "../not_allowed_package/",
+      "packageUri": "lib/",
+      "languageVersion": "2.9"
+    }
+
+  ]
+}
\ No newline at end of file
diff --git a/pkg/front_end/test/enable_non_nullable/data/allowed_package/lib/tests/language_2/implicitly_not_nnbd.dart b/pkg/front_end/test/enable_non_nullable/data/allowed_package/lib/tests/language_2/implicitly_not_nnbd.dart
new file mode 100644
index 0000000..a316359
--- /dev/null
+++ b/pkg/front_end/test/enable_non_nullable/data/allowed_package/lib/tests/language_2/implicitly_not_nnbd.dart
@@ -0,0 +1,18 @@
+// Copyright (c) 2020, 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.
+
+// Partial copy of tests/language_2/syntax/pre_nnbd_modifiers_test.dart.
+
+class late {
+  int get g => 1;
+}
+
+class required {
+  int get g => 2;
+}
+
+class C {
+  late l = late();
+  required r = required();
+}
diff --git a/pkg/front_end/test/enable_non_nullable/data/allowed_package/lib/unversioned_lib.dart b/pkg/front_end/test/enable_non_nullable/data/allowed_package/lib/unversioned_lib.dart
new file mode 100644
index 0000000..a08c72e
--- /dev/null
+++ b/pkg/front_end/test/enable_non_nullable/data/allowed_package/lib/unversioned_lib.dart
@@ -0,0 +1,3 @@
+// Copyright (c) 2020, 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.
diff --git a/pkg/front_end/test/enable_non_nullable/data/allowed_package/lib/versioned_2_10_lib.dart b/pkg/front_end/test/enable_non_nullable/data/allowed_package/lib/versioned_2_10_lib.dart
new file mode 100644
index 0000000..5f60217
--- /dev/null
+++ b/pkg/front_end/test/enable_non_nullable/data/allowed_package/lib/versioned_2_10_lib.dart
@@ -0,0 +1,5 @@
+// Copyright (c) 2020, 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.
+
+// @dart=2.10
diff --git a/pkg/front_end/test/enable_non_nullable/data/allowed_package/lib/versioned_2_11_lib.dart b/pkg/front_end/test/enable_non_nullable/data/allowed_package/lib/versioned_2_11_lib.dart
new file mode 100644
index 0000000..8de228b
--- /dev/null
+++ b/pkg/front_end/test/enable_non_nullable/data/allowed_package/lib/versioned_2_11_lib.dart
@@ -0,0 +1,5 @@
+// Copyright (c) 2020, 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.
+
+// @dart=2.11
diff --git a/pkg/front_end/test/enable_non_nullable/data/allowed_package/lib/versioned_2_8_lib.dart b/pkg/front_end/test/enable_non_nullable/data/allowed_package/lib/versioned_2_8_lib.dart
new file mode 100644
index 0000000..e7d43c5
--- /dev/null
+++ b/pkg/front_end/test/enable_non_nullable/data/allowed_package/lib/versioned_2_8_lib.dart
@@ -0,0 +1,5 @@
+// Copyright (c) 2020, 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.
+
+// @dart=2.8
diff --git a/pkg/front_end/test/enable_non_nullable/data/allowed_package/lib/versioned_2_9_lib.dart b/pkg/front_end/test/enable_non_nullable/data/allowed_package/lib/versioned_2_9_lib.dart
new file mode 100644
index 0000000..c2de893
--- /dev/null
+++ b/pkg/front_end/test/enable_non_nullable/data/allowed_package/lib/versioned_2_9_lib.dart
@@ -0,0 +1,5 @@
+// Copyright (c) 2020, 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.
+
+// @dart=2.9
diff --git a/pkg/front_end/test/enable_non_nullable/data/main.dart b/pkg/front_end/test/enable_non_nullable/data/main.dart
new file mode 100644
index 0000000..5744d19
--- /dev/null
+++ b/pkg/front_end/test/enable_non_nullable/data/main.dart
@@ -0,0 +1,23 @@
+// Copyright (c) 2020, 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:allowed_package/unversioned_lib.dart';
+import 'package:allowed_package/versioned_2_8_lib.dart';
+import 'package:allowed_package/versioned_2_9_lib.dart';
+import 'package:allowed_package/versioned_2_10_lib.dart';
+import 'package:allowed_package/versioned_2_11_lib.dart';
+import 'package:allowed_package/tests/language_2/implicitly_not_nnbd.dart';
+import 'package:not_allowed_package/unversioned_lib.dart';
+import 'package:not_allowed_package/versioned_2_8_lib.dart';
+import 'package:not_allowed_package/versioned_2_9_lib.dart';
+import 'package:not_allowed_package/versioned_2_10_lib.dart';
+import 'package:not_allowed_package/versioned_2_11_lib.dart';
+import 'package:not_allowed_package/tests/language_2/implicitly_not_nnbd.dart';
+import 'unversioned_lib.dart';
+import 'versioned_2_8_lib.dart';
+import 'versioned_2_9_lib.dart';
+import 'versioned_2_10_lib.dart';
+import 'versioned_2_11_lib.dart';
+
+main() {}
diff --git a/pkg/front_end/test/enable_non_nullable/data/not_allowed_package/lib/tests/language_2/implicitly_not_nnbd.dart b/pkg/front_end/test/enable_non_nullable/data/not_allowed_package/lib/tests/language_2/implicitly_not_nnbd.dart
new file mode 100644
index 0000000..a316359
--- /dev/null
+++ b/pkg/front_end/test/enable_non_nullable/data/not_allowed_package/lib/tests/language_2/implicitly_not_nnbd.dart
@@ -0,0 +1,18 @@
+// Copyright (c) 2020, 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.
+
+// Partial copy of tests/language_2/syntax/pre_nnbd_modifiers_test.dart.
+
+class late {
+  int get g => 1;
+}
+
+class required {
+  int get g => 2;
+}
+
+class C {
+  late l = late();
+  required r = required();
+}
diff --git a/pkg/front_end/test/enable_non_nullable/data/not_allowed_package/lib/unversioned_lib.dart b/pkg/front_end/test/enable_non_nullable/data/not_allowed_package/lib/unversioned_lib.dart
new file mode 100644
index 0000000..a08c72e
--- /dev/null
+++ b/pkg/front_end/test/enable_non_nullable/data/not_allowed_package/lib/unversioned_lib.dart
@@ -0,0 +1,3 @@
+// Copyright (c) 2020, 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.
diff --git a/pkg/front_end/test/enable_non_nullable/data/not_allowed_package/lib/versioned_2_10_lib.dart b/pkg/front_end/test/enable_non_nullable/data/not_allowed_package/lib/versioned_2_10_lib.dart
new file mode 100644
index 0000000..5f60217
--- /dev/null
+++ b/pkg/front_end/test/enable_non_nullable/data/not_allowed_package/lib/versioned_2_10_lib.dart
@@ -0,0 +1,5 @@
+// Copyright (c) 2020, 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.
+
+// @dart=2.10
diff --git a/pkg/front_end/test/enable_non_nullable/data/not_allowed_package/lib/versioned_2_11_lib.dart b/pkg/front_end/test/enable_non_nullable/data/not_allowed_package/lib/versioned_2_11_lib.dart
new file mode 100644
index 0000000..8de228b
--- /dev/null
+++ b/pkg/front_end/test/enable_non_nullable/data/not_allowed_package/lib/versioned_2_11_lib.dart
@@ -0,0 +1,5 @@
+// Copyright (c) 2020, 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.
+
+// @dart=2.11
diff --git a/pkg/front_end/test/enable_non_nullable/data/not_allowed_package/lib/versioned_2_8_lib.dart b/pkg/front_end/test/enable_non_nullable/data/not_allowed_package/lib/versioned_2_8_lib.dart
new file mode 100644
index 0000000..e7d43c5
--- /dev/null
+++ b/pkg/front_end/test/enable_non_nullable/data/not_allowed_package/lib/versioned_2_8_lib.dart
@@ -0,0 +1,5 @@
+// Copyright (c) 2020, 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.
+
+// @dart=2.8
diff --git a/pkg/front_end/test/enable_non_nullable/data/not_allowed_package/lib/versioned_2_9_lib.dart b/pkg/front_end/test/enable_non_nullable/data/not_allowed_package/lib/versioned_2_9_lib.dart
new file mode 100644
index 0000000..c2de893
--- /dev/null
+++ b/pkg/front_end/test/enable_non_nullable/data/not_allowed_package/lib/versioned_2_9_lib.dart
@@ -0,0 +1,5 @@
+// Copyright (c) 2020, 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.
+
+// @dart=2.9
diff --git a/pkg/front_end/test/enable_non_nullable/data/unversioned_lib.dart b/pkg/front_end/test/enable_non_nullable/data/unversioned_lib.dart
new file mode 100644
index 0000000..a08c72e
--- /dev/null
+++ b/pkg/front_end/test/enable_non_nullable/data/unversioned_lib.dart
@@ -0,0 +1,3 @@
+// Copyright (c) 2020, 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.
diff --git a/pkg/front_end/test/enable_non_nullable/data/versioned_2_10_lib.dart b/pkg/front_end/test/enable_non_nullable/data/versioned_2_10_lib.dart
new file mode 100644
index 0000000..5f60217
--- /dev/null
+++ b/pkg/front_end/test/enable_non_nullable/data/versioned_2_10_lib.dart
@@ -0,0 +1,5 @@
+// Copyright (c) 2020, 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.
+
+// @dart=2.10
diff --git a/pkg/front_end/test/enable_non_nullable/data/versioned_2_11_lib.dart b/pkg/front_end/test/enable_non_nullable/data/versioned_2_11_lib.dart
new file mode 100644
index 0000000..8de228b
--- /dev/null
+++ b/pkg/front_end/test/enable_non_nullable/data/versioned_2_11_lib.dart
@@ -0,0 +1,5 @@
+// Copyright (c) 2020, 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.
+
+// @dart=2.11
diff --git a/pkg/front_end/test/enable_non_nullable/data/versioned_2_8_lib.dart b/pkg/front_end/test/enable_non_nullable/data/versioned_2_8_lib.dart
new file mode 100644
index 0000000..e7d43c5
--- /dev/null
+++ b/pkg/front_end/test/enable_non_nullable/data/versioned_2_8_lib.dart
@@ -0,0 +1,5 @@
+// Copyright (c) 2020, 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.
+
+// @dart=2.8
diff --git a/pkg/front_end/test/enable_non_nullable/data/versioned_2_9_lib.dart b/pkg/front_end/test/enable_non_nullable/data/versioned_2_9_lib.dart
new file mode 100644
index 0000000..c2de893
--- /dev/null
+++ b/pkg/front_end/test/enable_non_nullable/data/versioned_2_9_lib.dart
@@ -0,0 +1,5 @@
+// Copyright (c) 2020, 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.
+
+// @dart=2.9
diff --git a/pkg/front_end/test/enable_non_nullable/enable_non_nullable_test.dart b/pkg/front_end/test/enable_non_nullable/enable_non_nullable_test.dart
new file mode 100644
index 0000000..8887306
--- /dev/null
+++ b/pkg/front_end/test/enable_non_nullable/enable_non_nullable_test.dart
@@ -0,0 +1,157 @@
+// 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.md file.
+
+import 'dart:io';
+
+import 'package:expect/expect.dart';
+import 'package:front_end/src/api_prototype/compiler_options.dart';
+import 'package:front_end/src/api_prototype/experimental_flags.dart';
+import 'package:front_end/src/api_prototype/kernel_generator.dart';
+import 'package:front_end/src/api_prototype/language_version.dart';
+import 'package:front_end/src/compute_platform_binaries_location.dart';
+import 'package:front_end/src/fasta/source/source_library_builder.dart';
+import 'package:kernel/ast.dart';
+
+/// The version used in this test as the experiment release version.
+const Version experimentReleaseVersion = const Version(2, 9);
+
+/// The version used in this test as the experiment enabled version.
+const Version experimentEnabledVersion = const Version(2, 10);
+
+main() async {
+  print('--------------------------------------------------------------------');
+  print('Test off-by-default with command-line flag');
+  print('--------------------------------------------------------------------');
+  await test(
+      enableNonNullableByDefault: false,
+      enableNonNullableExplicitly: true,
+      // When the flag is off by default, the experiment release version should
+      // be used as the opt-in criterion for all libraries.
+      versionImpliesOptIn: experimentReleaseVersion,
+      versionOptsInAllowed: experimentReleaseVersion);
+
+  print('--------------------------------------------------------------------');
+  print('Test on-by-default');
+  print('--------------------------------------------------------------------');
+  await test(
+      enableNonNullableByDefault: true,
+      enableNonNullableExplicitly: false,
+      // When the flag is on by default, the experiment release version should
+      // be used as the opt-in criterion only for libraries in allowed packages
+      // and the experiment enabled version should be used as the opt-in
+      // criterion for all other libraries.
+      versionImpliesOptIn: experimentEnabledVersion,
+      versionOptsInAllowed: experimentReleaseVersion);
+
+  print('--------------------------------------------------------------------');
+  print('Test on-by-default and explicitly with command-line flag');
+  print('--------------------------------------------------------------------');
+  await test(
+      enableNonNullableByDefault: true,
+      enableNonNullableExplicitly: true,
+      // When the flag is on by default but the experiment is enabled explicitly
+      // the experiment release version should be used as the opt-in criterion
+      // for all libraries.
+      versionImpliesOptIn: experimentReleaseVersion,
+      versionOptsInAllowed: experimentReleaseVersion);
+}
+
+test(
+    {bool enableNonNullableByDefault,
+    bool enableNonNullableExplicitly,
+    Version versionImpliesOptIn,
+    Version versionOptsInAllowed}) async {
+  CompilerOptions options = new CompilerOptions();
+  if (enableNonNullableByDefault) {
+    // Pretend non-nullable is on by default.
+    options.defaultExperimentFlagsForTesting = {
+      ExperimentalFlag.nonNullable: true
+    };
+  } else {
+    // Pretend non-nullable is off by default.
+    options.defaultExperimentFlagsForTesting = {
+      ExperimentalFlag.nonNullable: false
+    };
+  }
+  if (enableNonNullableExplicitly) {
+    // Enable non-nullable explicitly on the command-line.
+    options..explicitExperimentalFlags = {ExperimentalFlag.nonNullable: true};
+  }
+
+  Uri sdkSummary = computePlatformBinariesLocation(forceBuildDir: true)
+      .resolve('vm_platform_strong.dill');
+  options
+    ..sdkSummary = sdkSummary
+    // Pretend current version is 2.11
+    ..currentSdkVersion = '2.11'
+    ..allowedExperimentalFlagsForTesting = new AllowedExperimentalFlags(
+        sdkDefaultExperiments:
+            defaultAllowedExperimentalFlags.sdkDefaultExperiments,
+        sdkLibraryExperiments:
+            defaultAllowedExperimentalFlags.sdkLibraryExperiments,
+        packageExperiments: {
+          ...defaultAllowedExperimentalFlags.packageExperiments,
+          'allowed_package': {ExperimentalFlag.nonNullable}
+        })
+    ..experimentReleasedVersionForTesting = const {
+      // Pretend non-nullable is released in version 2.9.
+      ExperimentalFlag.nonNullable: experimentReleaseVersion
+    }
+    ..experimentEnabledVersionForTesting = const {
+      // Pretend non-nullable is enabled in version 2.10.
+      ExperimentalFlag.nonNullable: experimentEnabledVersion
+    };
+
+  bool hadDiagnostic = false;
+  options.onDiagnostic = (DiagnosticMessage message) {
+    hadDiagnostic = true;
+  };
+
+  Directory directory = new Directory.fromUri(
+      Uri.base.resolve('pkg/front_end/test/enable_non_nullable/data/'));
+  CompilerResult result = await kernelForProgramInternal(
+      directory.uri.resolve('main.dart'), options,
+      retainDataForTesting: true);
+  Expect.isFalse(
+      hadDiagnostic, "Compilation had diagnostics (errors, warnings)!");
+  for (Library library in result.component.libraries) {
+    if (library.importUri.scheme != 'dart') {
+      bool usesLegacy =
+          await uriUsesLegacyLanguageVersion(library.fileUri, options);
+      VersionAndPackageUri versionAndPackageUri =
+          await languageVersionForUri(library.fileUri, options);
+      bool isNonNullableByDefault = library.isNonNullableByDefault;
+      print('${library.fileUri}:');
+      print(' version=${versionAndPackageUri.version}');
+      print(' (package) uri=${versionAndPackageUri.packageUri}');
+      print(' isNonNullableByDefault=${isNonNullableByDefault}');
+      print(' uriUsesLegacyLanguageVersion=${usesLegacy}');
+      Expect.equals(library.languageVersion, versionAndPackageUri.version,
+          "Language version mismatch for ${library.importUri}");
+      Expect.equals(
+          !usesLegacy,
+          isNonNullableByDefault,
+          "Unexpected null-safe state for ${library.importUri}:"
+          " isNonNullableByDefault=$isNonNullableByDefault,"
+          " uriUsesLegacyLanguageVersion=$usesLegacy. "
+          "Computed version=${versionAndPackageUri.version},"
+          " (package) uri=${versionAndPackageUri.packageUri}");
+      Expect.isTrue(
+          library.languageVersion < versionImpliesOptIn ||
+              library.isNonNullableByDefault ||
+              SourceLibraryBuilder.isOptOutTest(library.fileUri),
+          "Expected library ${library.importUri} with version "
+          "${library.languageVersion} to be opted in.");
+      Expect.isTrue(
+          versionAndPackageUri.packageUri.scheme != 'package' ||
+              !versionAndPackageUri.packageUri.path
+                  .startsWith('allowed_package') ||
+              library.languageVersion < versionOptsInAllowed ||
+              library.isNonNullableByDefault ||
+              SourceLibraryBuilder.isOptOutTest(library.fileUri),
+          "Expected allowed library ${library.importUri} with version "
+          "${library.languageVersion} to be opted in.");
+    }
+  }
+}
diff --git a/pkg/front_end/test/extensions/data/ambiguous/lib1.dart b/pkg/front_end/test/extensions/data/ambiguous/lib1.dart
index ae7f7b6..486d104 100644
--- a/pkg/front_end/test/extensions/data/ambiguous/lib1.dart
+++ b/pkg/front_end/test/extensions/data/ambiguous/lib1.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 /*library: scope=[AmbiguousExtension1,AmbiguousExtension2,UnambiguousExtension1]*/
 
 /*class: AmbiguousExtension1:
@@ -50,4 +52,4 @@
    member-name=UnambiguousExtension1|ambiguousStaticMethod2
   */
   static void ambiguousStaticMethod2() {}
-}
\ No newline at end of file
+}
diff --git a/pkg/front_end/test/extensions/data/ambiguous/lib2.dart b/pkg/front_end/test/extensions/data/ambiguous/lib2.dart
index 5958aa2..859fc4c 100644
--- a/pkg/front_end/test/extensions/data/ambiguous/lib2.dart
+++ b/pkg/front_end/test/extensions/data/ambiguous/lib2.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 /*library: scope=[AmbiguousExtension1,AmbiguousExtension2,UnambiguousExtension2]*/
 
 /*class: AmbiguousExtension1:
@@ -50,4 +52,4 @@
    member-name=UnambiguousExtension2|ambiguousStaticMethod2
   */
   static void ambiguousStaticMethod2() {}
-}
\ No newline at end of file
+}
diff --git a/pkg/front_end/test/extensions/data/ambiguous/main.dart b/pkg/front_end/test/extensions/data/ambiguous/main.dart
index f4cef0c..7fda5a5 100644
--- a/pkg/front_end/test/extensions/data/ambiguous/main.dart
+++ b/pkg/front_end/test/extensions/data/ambiguous/main.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 /*library: scope=[
  lib1.dart.AmbiguousExtension1,
  lib1.dart.AmbiguousExtension2,
diff --git a/pkg/front_end/test/extensions/data/as_show/lib.dart b/pkg/front_end/test/extensions/data/as_show/lib.dart
index cfe2924..713c232 100644
--- a/pkg/front_end/test/extensions/data/as_show/lib.dart
+++ b/pkg/front_end/test/extensions/data/as_show/lib.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 /*library: scope=[Extension1]*/
 
 /*class: Extension1:
diff --git a/pkg/front_end/test/extensions/data/as_show/main.dart b/pkg/front_end/test/extensions/data/as_show/main.dart
index a46ead0..f214d01 100644
--- a/pkg/front_end/test/extensions/data/as_show/main.dart
+++ b/pkg/front_end/test/extensions/data/as_show/main.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 /*library: scope=[lib.dart.Extension1,origin.dart.Extension2]*/
 
 import 'lib.dart' as lib1;
diff --git a/pkg/front_end/test/extensions/data/as_show/origin.dart b/pkg/front_end/test/extensions/data/as_show/origin.dart
index 1b36bb9..757fd60 100644
--- a/pkg/front_end/test/extensions/data/as_show/origin.dart
+++ b/pkg/front_end/test/extensions/data/as_show/origin.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 /*library: scope=[Extension2]*/
 
 /*class: Extension2:
@@ -27,4 +29,4 @@
    builder-params=[#this],
    member-name=Extension2|get#method2,
    member-params=[#this]*/
-}
\ No newline at end of file
+}
diff --git a/pkg/front_end/test/extensions/data/explicit_this.dart b/pkg/front_end/test/extensions/data/explicit_this.dart
index 735e7d6..b56b7fc 100644
--- a/pkg/front_end/test/extensions/data/explicit_this.dart
+++ b/pkg/front_end/test/extensions/data/explicit_this.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 /*library: scope=[A2]*/
 
 class A1 {
@@ -72,4 +74,4 @@
 }
 
 main() {
-}
\ No newline at end of file
+}
diff --git a/pkg/front_end/test/extensions/data/export_twice/lib1.dart b/pkg/front_end/test/extensions/data/export_twice/lib1.dart
index 4539cd4..ccfb0b9 100644
--- a/pkg/front_end/test/extensions/data/export_twice/lib1.dart
+++ b/pkg/front_end/test/extensions/data/export_twice/lib1.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 /*library: scope=[E]*/
 
 class A {}
diff --git a/pkg/front_end/test/extensions/data/export_twice/lib2.dart b/pkg/front_end/test/extensions/data/export_twice/lib2.dart
index fee7eac..f52e3cd1 100644
--- a/pkg/front_end/test/extensions/data/export_twice/lib2.dart
+++ b/pkg/front_end/test/extensions/data/export_twice/lib2.dart
@@ -2,4 +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.
 
+// @dart = 2.9
+
 export 'lib1.dart' show E;
diff --git a/pkg/front_end/test/extensions/data/export_twice/main.dart b/pkg/front_end/test/extensions/data/export_twice/main.dart
index 1abeb48..216536b 100644
--- a/pkg/front_end/test/extensions/data/export_twice/main.dart
+++ b/pkg/front_end/test/extensions/data/export_twice/main.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 /*library: scope=[lib1.dart.E]*/
 
 import 'lib1.dart';
diff --git a/pkg/front_end/test/extensions/data/export_unnamed/lib.dart b/pkg/front_end/test/extensions/data/export_unnamed/lib.dart
index 04d4c90..17d6f89 100644
--- a/pkg/front_end/test/extensions/data/export_unnamed/lib.dart
+++ b/pkg/front_end/test/extensions/data/export_unnamed/lib.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 /*library: scope=[NamedExtension,_extension#0]*/
 
 /*class: _extension#0:
diff --git a/pkg/front_end/test/extensions/data/export_unnamed/main.dart b/pkg/front_end/test/extensions/data/export_unnamed/main.dart
index 01ddd37..132f4bb 100644
--- a/pkg/front_end/test/extensions/data/export_unnamed/main.dart
+++ b/pkg/front_end/test/extensions/data/export_unnamed/main.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 /*library: scope=[lib.dart.NamedExtension]*/
 
 import 'lib.dart';
diff --git a/pkg/front_end/test/extensions/data/extension_on_type_variable.dart b/pkg/front_end/test/extensions/data/extension_on_type_variable.dart
index 0c8613f..c4a88ce 100644
--- a/pkg/front_end/test/extensions/data/extension_on_type_variable.dart
+++ b/pkg/front_end/test/extensions/data/extension_on_type_variable.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 /*library: scope=[GeneralGeneric]*/
 
 /*class: GeneralGeneric:
@@ -37,4 +39,4 @@
 }
 
 main() {
-}
\ No newline at end of file
+}
diff --git a/pkg/front_end/test/extensions/data/implicit_this.dart b/pkg/front_end/test/extensions/data/implicit_this.dart
index 95e1fb3..b50862b 100644
--- a/pkg/front_end/test/extensions/data/implicit_this.dart
+++ b/pkg/front_end/test/extensions/data/implicit_this.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 /*library: scope=[A2]*/
 
 class A1 {
@@ -71,4 +73,4 @@
 }
 
 main() {
-}
\ No newline at end of file
+}
diff --git a/pkg/front_end/test/extensions/data/instance_members.dart b/pkg/front_end/test/extensions/data/instance_members.dart
index 1c02c85..3b3f248 100644
--- a/pkg/front_end/test/extensions/data/instance_members.dart
+++ b/pkg/front_end/test/extensions/data/instance_members.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 /*library: scope=[A2,B2]*/
 
 class A1 {}
@@ -169,4 +171,4 @@
   */
 }
 
-main() {}
\ No newline at end of file
+main() {}
diff --git a/pkg/front_end/test/extensions/data/named_declarations.dart b/pkg/front_end/test/extensions/data/named_declarations.dart
index fa16eec..ecde7e2 100644
--- a/pkg/front_end/test/extensions/data/named_declarations.dart
+++ b/pkg/front_end/test/extensions/data/named_declarations.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 /*library: scope=[A2,B2,B3,B4]*/
 
 class A1 {}
diff --git a/pkg/front_end/test/extensions/data/other_kinds.dart b/pkg/front_end/test/extensions/data/other_kinds.dart
index cab0879..289e358 100644
--- a/pkg/front_end/test/extensions/data/other_kinds.dart
+++ b/pkg/front_end/test/extensions/data/other_kinds.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 /*library: scope=[A2]*/
 
 class A1 {
diff --git a/pkg/front_end/test/extensions/data/patching/main.dart b/pkg/front_end/test/extensions/data/patching/main.dart
index 9599059..692cfaa 100644
--- a/pkg/front_end/test/extensions/data/patching/main.dart
+++ b/pkg/front_end/test/extensions/data/patching/main.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 /*library: scope=[origin.dart.Extension,origin.dart.GenericExtension]*/
 
 // ignore: uri_does_not_exist
diff --git a/pkg/front_end/test/extensions/data/patching/origin.dart b/pkg/front_end/test/extensions/data/patching/origin.dart
index 1a5b69e..c1c0176 100644
--- a/pkg/front_end/test/extensions/data/patching/origin.dart
+++ b/pkg/front_end/test/extensions/data/patching/origin.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 /*library: scope=[Extension,GenericExtension]*/
 
 /*class: Extension:
@@ -105,4 +107,4 @@
   external static int get staticProperty;
 
   external static void set staticProperty(int value);
-}
\ No newline at end of file
+}
diff --git a/pkg/front_end/test/extensions/data/patching/patch.dart b/pkg/front_end/test/extensions/data/patching/patch.dart
index 32edfc4..2f929c7 100644
--- a/pkg/front_end/test/extensions/data/patching/patch.dart
+++ b/pkg/front_end/test/extensions/data/patching/patch.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 // ignore: import_internal_library
 import 'dart:_internal';
 
@@ -160,4 +162,4 @@
   */
   @patch
   static void set staticProperty(int value) {}
-}
\ No newline at end of file
+}
diff --git a/pkg/front_end/test/extensions/data/prefix/lib1.dart b/pkg/front_end/test/extensions/data/prefix/lib1.dart
index 61f96cc..3646dda 100644
--- a/pkg/front_end/test/extensions/data/prefix/lib1.dart
+++ b/pkg/front_end/test/extensions/data/prefix/lib1.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 /*library: scope=[HiddenExtension1,ShownExtension1]*/
 
 /*class: ShownExtension1:
diff --git a/pkg/front_end/test/extensions/data/prefix/lib2.dart b/pkg/front_end/test/extensions/data/prefix/lib2.dart
index be8c655..8affe92 100644
--- a/pkg/front_end/test/extensions/data/prefix/lib2.dart
+++ b/pkg/front_end/test/extensions/data/prefix/lib2.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 /*library: scope=[HiddenExtension2,ShownExtension2]*/
 
 /*class: HiddenExtension2:
diff --git a/pkg/front_end/test/extensions/data/prefix/lib3.dart b/pkg/front_end/test/extensions/data/prefix/lib3.dart
index 26d3b8f..80105ee 100644
--- a/pkg/front_end/test/extensions/data/prefix/lib3.dart
+++ b/pkg/front_end/test/extensions/data/prefix/lib3.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 /*library: scope=[ShownExtension3]*/
 
 /*class: ShownExtension3:
diff --git a/pkg/front_end/test/extensions/data/prefix/main.dart b/pkg/front_end/test/extensions/data/prefix/main.dart
index 0090c95..e988aa1 100644
--- a/pkg/front_end/test/extensions/data/prefix/main.dart
+++ b/pkg/front_end/test/extensions/data/prefix/main.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 /*library: scope=[
  lib1.dart.ShownExtension1,
  lib2.dart.ShownExtension2,
diff --git a/pkg/front_end/test/extensions/data/reexport/lib.dart b/pkg/front_end/test/extensions/data/reexport/lib.dart
index f38ec65..b787d79 100644
--- a/pkg/front_end/test/extensions/data/reexport/lib.dart
+++ b/pkg/front_end/test/extensions/data/reexport/lib.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 export 'lib1.dart';
 /*error: errors=['ClashingExtension' is exported from both 'org-dartlang-test:///a/b/c/lib1.dart' and 'org-dartlang-test:///a/b/c/lib2.dart'.]*/
 export 'lib2.dart';
diff --git a/pkg/front_end/test/extensions/data/reexport/lib1.dart b/pkg/front_end/test/extensions/data/reexport/lib1.dart
index d3529cb..da11a1f 100644
--- a/pkg/front_end/test/extensions/data/reexport/lib1.dart
+++ b/pkg/front_end/test/extensions/data/reexport/lib1.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 /*library: scope=[ClashingExtension,UniqueExtension1]*/
 
 /*class: ClashingExtension:
@@ -33,4 +35,4 @@
    member-name=UniqueExtension1|staticMethod
   */
   static staticMethod() {}
-}
\ No newline at end of file
+}
diff --git a/pkg/front_end/test/extensions/data/reexport/lib2.dart b/pkg/front_end/test/extensions/data/reexport/lib2.dart
index b0d9665..e30d364 100644
--- a/pkg/front_end/test/extensions/data/reexport/lib2.dart
+++ b/pkg/front_end/test/extensions/data/reexport/lib2.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 /*library: scope=[ClashingExtension,UniqueExtension2]*/
 
 /*class: ClashingExtension:
@@ -32,4 +34,4 @@
    member-name=UniqueExtension2|staticMethod
   */
   static staticMethod() {}
-}
\ No newline at end of file
+}
diff --git a/pkg/front_end/test/extensions/data/reexport/main.dart b/pkg/front_end/test/extensions/data/reexport/main.dart
index b5c8603..1e06107 100644
--- a/pkg/front_end/test/extensions/data/reexport/main.dart
+++ b/pkg/front_end/test/extensions/data/reexport/main.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 /*library: scope=[lib1.dart.UniqueExtension1,lib2.dart.UniqueExtension2]*/
 
 import 'lib.dart';
diff --git a/pkg/front_end/test/extensions/data/show_hide/lib1.dart b/pkg/front_end/test/extensions/data/show_hide/lib1.dart
index 7790aeb..3646dda 100644
--- a/pkg/front_end/test/extensions/data/show_hide/lib1.dart
+++ b/pkg/front_end/test/extensions/data/show_hide/lib1.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 /*library: scope=[HiddenExtension1,ShownExtension1]*/
 
 /*class: ShownExtension1:
@@ -32,4 +34,4 @@
    member-name=HiddenExtension1|staticMethod
   */
   static void staticMethod() {}
-}
\ No newline at end of file
+}
diff --git a/pkg/front_end/test/extensions/data/show_hide/lib2.dart b/pkg/front_end/test/extensions/data/show_hide/lib2.dart
index 5c9d793..8affe92 100644
--- a/pkg/front_end/test/extensions/data/show_hide/lib2.dart
+++ b/pkg/front_end/test/extensions/data/show_hide/lib2.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 /*library: scope=[HiddenExtension2,ShownExtension2]*/
 
 /*class: HiddenExtension2:
@@ -32,4 +34,4 @@
    member-name=ShownExtension2|staticMethod
   */
   static void staticMethod() {}
-}
\ No newline at end of file
+}
diff --git a/pkg/front_end/test/extensions/data/show_hide/main.dart b/pkg/front_end/test/extensions/data/show_hide/main.dart
index 2e2e978..622bf60 100644
--- a/pkg/front_end/test/extensions/data/show_hide/main.dart
+++ b/pkg/front_end/test/extensions/data/show_hide/main.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 /*library: scope=[lib1.dart.ShownExtension1,lib2.dart.ShownExtension2]*/
 
 import 'lib1.dart' show ShownExtension1;
diff --git a/pkg/front_end/test/extensions/data/static_members.dart b/pkg/front_end/test/extensions/data/static_members.dart
index cd426fa..f11b66d 100644
--- a/pkg/front_end/test/extensions/data/static_members.dart
+++ b/pkg/front_end/test/extensions/data/static_members.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 /*library: scope=[A2,B2]*/
 
 class A1 {}
@@ -67,4 +69,4 @@
   static S method2<S>(S o) => o;
 }
 
-main() {}
\ No newline at end of file
+main() {}
diff --git a/pkg/front_end/test/extensions/data/super.dart b/pkg/front_end/test/extensions/data/super.dart
index a4d838d..0123d92 100644
--- a/pkg/front_end/test/extensions/data/super.dart
+++ b/pkg/front_end/test/extensions/data/super.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 /*library: scope=[A2]*/
 
 class A1 {
@@ -37,4 +39,4 @@
 }
 
 main() {
-}
\ No newline at end of file
+}
diff --git a/pkg/front_end/test/extensions/data/type_variables.dart b/pkg/front_end/test/extensions/data/type_variables.dart
index 5a421a1..e04f82d 100644
--- a/pkg/front_end/test/extensions/data/type_variables.dart
+++ b/pkg/front_end/test/extensions/data/type_variables.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 /*library: scope=[A2,A3,A4]*/
 
 class A1<T> {}
@@ -106,4 +108,4 @@
   */
 }
 
-main() {}
\ No newline at end of file
+main() {}
diff --git a/pkg/front_end/test/extensions/data/unnamed_declarations.dart b/pkg/front_end/test/extensions/data/unnamed_declarations.dart
index eab0143..7577c5f 100644
--- a/pkg/front_end/test/extensions/data/unnamed_declarations.dart
+++ b/pkg/front_end/test/extensions/data/unnamed_declarations.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 /*library: scope=[_extension#0,_extension#1,_extension#2,_extension#3,_extension#4]*/
 
 class A1 {}
diff --git a/pkg/front_end/test/extensions/data/use_as_type.dart b/pkg/front_end/test/extensions/data/use_as_type.dart
index 6f411ab..b928105 100644
--- a/pkg/front_end/test/extensions/data/use_as_type.dart
+++ b/pkg/front_end/test/extensions/data/use_as_type.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 /*library: scope=[A2,B2]*/
 
 class A1 {}
diff --git a/pkg/front_end/test/fasta/ambiguous_export_test.dart b/pkg/front_end/test/fasta/ambiguous_export_test.dart
index d4e1665..a1ac89a 100644
--- a/pkg/front_end/test/fasta/ambiguous_export_test.dart
+++ b/pkg/front_end/test/fasta/ambiguous_export_test.dart
@@ -23,7 +23,7 @@
     Library library = new Library(Uri.parse("org.dartlang.fasta:library"));
     Field field = new Field(new Name("_exports#", library),
         initializer: new StringLiteral('{"main":"Problem with main"}'));
-    library.addMember(field);
+    library.addField(field);
     Component component = new Component(libraries: <Library>[library]);
     await CompilerContext.runWithDefaultOptions((CompilerContext c) async {
       DillTarget target = new DillTarget(c.options.ticker,
diff --git a/pkg/front_end/test/fasta/bootstrap_test.dart b/pkg/front_end/test/fasta/bootstrap_test.dart
index 37dff17..f7ea1bd 100644
--- a/pkg/front_end/test/fasta/bootstrap_test.dart
+++ b/pkg/front_end/test/fasta/bootstrap_test.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:async' show Future;
-
 import 'dart:io' show Directory, File, Platform;
 
 import 'package:async_helper/async_helper.dart' show asyncEnd, asyncStart;
diff --git a/pkg/front_end/test/fasta/expression_suite.dart b/pkg/front_end/test/fasta/expression_suite.dart
index 5234822..2b29aa0 100644
--- a/pkg/front_end/test/fasta/expression_suite.dart
+++ b/pkg/front_end/test/fasta/expression_suite.dart
@@ -4,8 +4,6 @@
 
 library fasta.test.expression_test;
 
-import "dart:async" show Future;
-
 import "dart:convert" show JsonEncoder;
 
 import "dart:io" show File, IOSink;
@@ -413,6 +411,7 @@
       errors.add(message);
     }
     ..environmentDefines = const {}
+    ..explicitExperimentalFlags = {ExperimentalFlag.nonNullable: false}
     ..allowedExperimentalFlagsForTesting = const AllowedExperimentalFlags();
 
   final ProcessedOptions options =
diff --git a/pkg/front_end/test/fasta/fast_strong_suite.dart b/pkg/front_end/test/fasta/fast_strong_suite.dart
index 8269eb9..8a0d844 100644
--- a/pkg/front_end/test/fasta/fast_strong_suite.dart
+++ b/pkg/front_end/test/fasta/fast_strong_suite.dart
@@ -4,8 +4,6 @@
 
 library fasta.test.fast_strong_test;
 
-import 'dart:async' show Future;
-
 import 'dart:io' show Platform;
 
 import 'testing/suite.dart';
diff --git a/pkg/front_end/test/fasta/generator_to_string_test.dart b/pkg/front_end/test/fasta/generator_to_string_test.dart
index 84c4f14..3ebb511 100644
--- a/pkg/front_end/test/fasta/generator_to_string_test.dart
+++ b/pkg/front_end/test/fasta/generator_to_string_test.dart
@@ -18,7 +18,6 @@
         Expression,
         FunctionNode,
         Library,
-        Member,
         Name,
         Procedure,
         ProcedureKind,
@@ -83,11 +82,11 @@
         null);
     LoadLibraryBuilder loadLibraryBuilder =
         new LoadLibraryBuilder(libraryBuilder, null, -1);
-    Member getter = new Procedure(
+    Procedure getter = new Procedure(
         new Name("myGetter"), ProcedureKind.Getter, new FunctionNode(null));
-    Member interfaceTarget = new Procedure(new Name("myInterfaceTarget"),
+    Procedure interfaceTarget = new Procedure(new Name("myInterfaceTarget"),
         ProcedureKind.Method, new FunctionNode(null));
-    Member setter = new Procedure(
+    Procedure setter = new Procedure(
         new Name("mySetter"), ProcedureKind.Setter, new FunctionNode(null));
     Message message = templateUnspecified.withArguments("My Message.");
     Name binaryOperator = new Name("+");
@@ -112,7 +111,7 @@
     library.addClass(cls);
     library.addProcedure(getter);
     library.addProcedure(setter);
-    cls.addMember(interfaceTarget);
+    cls.addProcedure(interfaceTarget);
 
     PrefixUseGenerator prefixUseGenerator =
         new PrefixUseGenerator(helper, token, prefixBuilder);
diff --git a/pkg/front_end/test/fasta/incremental_suite.dart b/pkg/front_end/test/fasta/incremental_suite.dart
index e43a838..46c13e9 100644
--- a/pkg/front_end/test/fasta/incremental_suite.dart
+++ b/pkg/front_end/test/fasta/incremental_suite.dart
@@ -4,13 +4,12 @@
 
 library fasta.test.incremental_test;
 
-import "dart:async" show Future;
-
 import "dart:convert" show JsonEncoder;
 
 import "dart:io" show File;
 
 import 'package:_fe_analyzer_shared/src/messages/severity.dart' show Severity;
+import 'package:front_end/src/api_prototype/experimental_flags.dart';
 
 import "package:kernel/ast.dart" show Component;
 
@@ -223,6 +222,7 @@
     ..verbose = true
     ..fileSystem = fs
     ..sdkSummary = sdkSummary
+    ..explicitExperimentalFlags = {ExperimentalFlag.nonNullable: false}
     ..onDiagnostic = (DiagnosticMessage message) {
       printDiagnosticMessage(message, print);
       if (message.severity == Severity.error) {
diff --git a/pkg/front_end/test/fasta/messages_suite.dart b/pkg/front_end/test/fasta/messages_suite.dart
index 3a3dcd2..aa7aa4870 100644
--- a/pkg/front_end/test/fasta/messages_suite.dart
+++ b/pkg/front_end/test/fasta/messages_suite.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:async" show Future, Stream;
-
 import "dart:convert" show utf8;
 
 import 'dart:io' show File, Platform;
@@ -77,8 +75,10 @@
 
   CompilerOptions apply(CompilerOptions options) {
     if (nnbdMode != null) {
-      options.experimentalFlags[ExperimentalFlag.nonNullable] = true;
+      options.explicitExperimentalFlags[ExperimentalFlag.nonNullable] = true;
       options.nnbdMode = nnbdMode;
+    } else {
+      options.explicitExperimentalFlags[ExperimentalFlag.nonNullable] = false;
     }
     return options;
   }
diff --git a/pkg/front_end/test/fasta/outline_suite.dart b/pkg/front_end/test/fasta/outline_suite.dart
index cc5ec1d..4bb4b58 100644
--- a/pkg/front_end/test/fasta/outline_suite.dart
+++ b/pkg/front_end/test/fasta/outline_suite.dart
@@ -4,8 +4,6 @@
 
 library fasta.test.outline_test;
 
-import 'dart:async' show Future;
-
 import 'testing/suite.dart';
 
 Future<FastaContext> createContext(
diff --git a/pkg/front_end/test/fasta/parser/parser_suite.dart b/pkg/front_end/test/fasta/parser/parser_suite.dart
index 1bcb148..8ea1ada 100644
--- a/pkg/front_end/test/fasta/parser/parser_suite.dart
+++ b/pkg/front_end/test/fasta/parser/parser_suite.dart
@@ -6,7 +6,7 @@
     show ParserError, parse;
 
 import 'package:testing/testing.dart'
-    show Chain, ChainContext, Future, Result, Step, runMe;
+    show Chain, ChainContext, Result, Step, runMe;
 
 import '../../utils/scanner_chain.dart' show Read, Scan, ScannedFile;
 
diff --git a/pkg/front_end/test/fasta/scanner/scanner_suite.dart b/pkg/front_end/test/fasta/scanner/scanner_suite.dart
index 1fb6f442..e71149e 100644
--- a/pkg/front_end/test/fasta/scanner/scanner_suite.dart
+++ b/pkg/front_end/test/fasta/scanner/scanner_suite.dart
@@ -2,8 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE.md file.
 
-import 'package:testing/testing.dart'
-    show Chain, ChainContext, Future, Step, runMe;
+import 'package:testing/testing.dart' show Chain, ChainContext, Step, runMe;
 
 import '../../utils/scanner_chain.dart' show Read, Scan;
 
diff --git a/pkg/front_end/test/fasta/sdk_test.dart b/pkg/front_end/test/fasta/sdk_test.dart
index 6341091..27073c4 100644
--- a/pkg/front_end/test/fasta/sdk_test.dart
+++ b/pkg/front_end/test/fasta/sdk_test.dart
@@ -4,8 +4,6 @@
 
 library fasta.test.sdk_test;
 
-import 'dart:async' show Future;
-
 import 'testing/suite.dart';
 
 Future<FastaContext> createContext(
diff --git a/pkg/front_end/test/fasta/strong_tester.dart b/pkg/front_end/test/fasta/strong_tester.dart
index 402ff57..83d9ab3 100644
--- a/pkg/front_end/test/fasta/strong_tester.dart
+++ b/pkg/front_end/test/fasta/strong_tester.dart
@@ -4,7 +4,6 @@
 
 library fasta.test.strong_test;
 
-import 'dart:async' show Future;
 import 'dart:io' show Platform;
 
 import 'testing/suite.dart';
diff --git a/pkg/front_end/test/fasta/testing/suite.dart b/pkg/front_end/test/fasta/testing/suite.dart
index ed80870..c9d68e8 100644
--- a/pkg/front_end/test/fasta/testing/suite.dart
+++ b/pkg/front_end/test/fasta/testing/suite.dart
@@ -4,8 +4,6 @@
 
 library fasta.testing.suite;
 
-import 'dart:async' show Future;
-
 import 'dart:convert' show jsonDecode;
 
 import 'dart:io' show Directory, File, Platform;
@@ -30,7 +28,6 @@
         AllowedExperimentalFlags,
         ExperimentalFlag,
         defaultAllowedExperimentalFlags,
-        defaultExperimentalFlags,
         isExperimentEnabled;
 
 import 'package:front_end/src/api_prototype/standard_file_system.dart'
@@ -84,6 +81,7 @@
         Library,
         Member,
         Node,
+        NonNullableByDefaultCompiledMode,
         TreeNode,
         UnevaluatedConstant,
         Version,
@@ -206,7 +204,7 @@
 /// This is used for instance for defining target, mode, and experiment specific
 /// test folders.
 class FolderOptions {
-  final Map<ExperimentalFlag, bool> _experimentalFlags;
+  final Map<ExperimentalFlag, bool> _explicitExperimentalFlags;
   final bool forceLateLowering;
   final bool forceLateLoweringSentinel;
   final bool forceStaticFieldLowering;
@@ -217,7 +215,7 @@
   final String target;
   final String overwriteCurrentSdkVersion;
 
-  FolderOptions(this._experimentalFlags,
+  FolderOptions(this._explicitExperimentalFlags,
       {this.forceLateLowering: false,
       this.forceLateLoweringSentinel: false,
       this.forceStaticFieldLowering: false,
@@ -240,10 +238,10 @@
         assert(noVerify != null),
         assert(target != null);
 
-  Map<ExperimentalFlag, bool> computeExperimentalFlags(
+  Map<ExperimentalFlag, bool> computeExplicitExperimentalFlags(
       Map<ExperimentalFlag, bool> forcedExperimentalFlags) {
-    Map<ExperimentalFlag, bool> flags = new Map.from(defaultExperimentalFlags);
-    flags.addAll(_experimentalFlags);
+    Map<ExperimentalFlag, bool> flags = {};
+    flags.addAll(_explicitExperimentalFlags);
     flags.addAll(forcedExperimentalFlags);
     return flags;
   }
@@ -275,7 +273,7 @@
   final List<Step> steps;
   final Uri vm;
   final bool onlyCrashes;
-  final Map<ExperimentalFlag, bool> experimentalFlags;
+  final Map<ExperimentalFlag, bool> explicitExperimentalFlags;
   final bool skipVm;
   final bool verify;
   final bool weak;
@@ -308,7 +306,7 @@
       this.vm,
       this.platformBinaries,
       this.onlyCrashes,
-      this.experimentalFlags,
+      this.explicitExperimentalFlags,
       bool ignoreExpectations,
       this.updateExpectations,
       bool updateComments,
@@ -510,8 +508,8 @@
         ..sdkRoot = sdk
         ..packagesFileUri = uriConfiguration.packageConfigUri ?? packages
         ..environmentDefines = folderOptions.defines
-        ..experimentalFlags =
-            folderOptions.computeExperimentalFlags(experimentalFlags)
+        ..explicitExperimentalFlags = folderOptions
+            .computeExplicitExperimentalFlags(explicitExperimentalFlags)
         ..nnbdMode = weak
             ? NnbdMode.Weak
             : (folderOptions.nnbdAgnosticMode
@@ -734,8 +732,8 @@
   Future<Result<int>> run(ComponentResult result, FastaContext context) async {
     FolderOptions folderOptions =
         context.computeFolderOptions(result.description);
-    Map<ExperimentalFlag, bool> experimentalFlags =
-        folderOptions.computeExperimentalFlags(context.experimentalFlags);
+    Map<ExperimentalFlag, bool> experimentalFlags = folderOptions
+        .computeExplicitExperimentalFlags(context.explicitExperimentalFlags);
     switch (folderOptions.target) {
       case "vm":
         if (context.platformUri == null) {
@@ -757,7 +755,19 @@
         } finally {
           await generated.parent.delete(recursive: true);
         }
-        return process.toResult();
+        Result<int> runResult = process.toResult();
+        if (result.component.mode == NonNullableByDefaultCompiledMode.Invalid) {
+          // In this case we expect and want a runtime error.
+          if (runResult.outcome == ExpectationSet.Default["RuntimeError"]) {
+            // We convert this to pass because that's exactly what we'd expect.
+            return pass(0);
+          } else {
+            // Different outcome - that's a failure!
+            return new Result<int>(runResult.output,
+                ExpectationSet.Default["MissingRuntimeError"], runResult.error);
+          }
+        }
+        return runResult;
       case "none":
       case "noneWithJs":
         return pass(0);
@@ -965,11 +975,11 @@
         context.computeLibrariesSpecificationUri(description);
     TestOptions testOptions = context.computeTestOptions(description);
     FolderOptions folderOptions = context.computeFolderOptions(description);
-    Map<ExperimentalFlag, bool> experimentalFlags =
-        folderOptions.computeExperimentalFlags(context.experimentalFlags);
+    Map<ExperimentalFlag, bool> experimentalFlags = folderOptions
+        .computeExplicitExperimentalFlags(context.explicitExperimentalFlags);
     NnbdMode nnbdMode = context.weak ||
             !isExperimentEnabled(ExperimentalFlag.nonNullable,
-                experimentalFlags: experimentalFlags)
+                explicitExperimentalFlags: experimentalFlags)
         ? NnbdMode.Weak
         : (folderOptions.nnbdAgnosticMode
             ? NnbdMode.Agnostic
@@ -986,7 +996,7 @@
           errors.add(message.plainTextFormatted);
         }
         ..environmentDefines = folderOptions.defines
-        ..experimentalFlags = experimentalFlags
+        ..explicitExperimentalFlags = experimentalFlags
         ..nnbdMode = nnbdMode
         ..librariesSpecificationUri = librariesSpecificationUri
         ..allowedExperimentalFlagsForTesting = allowedExperimentalFlags
@@ -1104,7 +1114,6 @@
                     description, p, userLibraries, options, sourceTarget),
                 context.expectationSet["InstrumentationMismatch"],
                 instrumentation.problemsAsString,
-                null,
                 autoFixCommand: '${UPDATE_COMMENTS}=true');
           }
         }
@@ -1194,8 +1203,7 @@
       return new Result<ComponentResult>(
           result,
           context.expectationSet["TransformVerificationError"],
-          errors.join('\n'),
-          null);
+          errors.join('\n'));
     }
     return pass(result);
   }
@@ -1236,8 +1244,8 @@
       if (messages.isEmpty) {
         return pass(result);
       } else {
-        return new Result<ComponentResult>(null,
-            context.expectationSet["VerificationError"], "$messages", null);
+        return new Result<ComponentResult>(
+            null, context.expectationSet["VerificationError"], "$messages");
       }
     }, errorOnMissingInput: false);
   }
diff --git a/pkg/front_end/test/fasta/text_serialization_tester.dart b/pkg/front_end/test/fasta/text_serialization_tester.dart
index 3a0deda..13ee181 100644
--- a/pkg/front_end/test/fasta/text_serialization_tester.dart
+++ b/pkg/front_end/test/fasta/text_serialization_tester.dart
@@ -4,7 +4,6 @@
 
 library fasta.test.text_serialization_test;
 
-import 'dart:async' show Future;
 import 'dart:io' show Platform;
 
 import 'testing/suite.dart';
diff --git a/pkg/front_end/test/fasta/textual_outline_suite.dart b/pkg/front_end/test/fasta/textual_outline_suite.dart
index aeb3343..702b2fc 100644
--- a/pkg/front_end/test/fasta/textual_outline_suite.dart
+++ b/pkg/front_end/test/fasta/textual_outline_suite.dart
@@ -4,7 +4,6 @@
 
 library fasta.test.textual_outline_test;
 
-import 'dart:async' show Future;
 import 'dart:io';
 
 import 'package:dart_style/dart_style.dart' show DartFormatter;
@@ -81,8 +80,8 @@
           performModelling: modelled,
           addMarkerForUnknownForTest: modelled);
       if (result == null) {
-        return new Result(null, context.expectationSet["EmptyOutput"],
-            description.uri, StackTrace.current);
+        return new Result(
+            null, context.expectationSet["EmptyOutput"], description.uri);
       }
 
       // In an attempt to make it less sensitive to formatting first remove
@@ -122,8 +121,9 @@
       if (expectMatch.outcome != Expectation.Pass) return expectMatch;
 
       if (formatterException != null) {
-        return new Result(null, context.expectationSet["FormatterCrash"],
-            formatterException, formatterExceptionSt);
+        return new Result(
+            null, context.expectationSet["FormatterCrash"], formatterException,
+            trace: formatterExceptionSt);
       }
     }
 
diff --git a/pkg/front_end/test/fasta/type_inference/factor_type_test.dart b/pkg/front_end/test/fasta/type_inference/factor_type_test.dart
index c8ed120..f68d6d5 100644
--- a/pkg/front_end/test/fasta/type_inference/factor_type_test.dart
+++ b/pkg/front_end/test/fasta/type_inference/factor_type_test.dart
@@ -63,7 +63,7 @@
   DartType get intStar => coreTypes.intLegacyRawType;
 
   @override
-  DartType get nullNone => coreTypes.nullType;
+  DartType get nullNone => const NullType();
 
   @override
   DartType get numNone => coreTypes.numNonNullableRawType;
@@ -102,7 +102,7 @@
 
 main() async {
   CompilerOptions options = new CompilerOptions()
-    ..experimentalFlags[ExperimentalFlag.nonNullable] = true;
+    ..explicitExperimentalFlags[ExperimentalFlag.nonNullable] = true;
   InternalCompilerResult result = await compileScript('',
       options: options, requireMain: false, retainDataForTesting: true);
   new FactorTypeTest(
diff --git a/pkg/front_end/test/fasta/type_inference/type_constraint_gatherer_nnbd_test.dart b/pkg/front_end/test/fasta/type_inference/type_constraint_gatherer_nnbd_test.dart
index 884c0ce..d070369 100644
--- a/pkg/front_end/test/fasta/type_inference/type_constraint_gatherer_nnbd_test.dart
+++ b/pkg/front_end/test/fasta/type_inference/type_constraint_gatherer_nnbd_test.dart
@@ -81,8 +81,6 @@
 
   Class get mapClass => coreTypes.mapClass;
 
-  InterfaceType get nullType => coreTypes.nullType;
-
   Class get objectClass => coreTypes.objectClass;
 
   InterfaceType get P => coreTypes.legacyRawType(classP);
@@ -280,8 +278,8 @@
   }
 
   void test_null_subtype_any() {
-    _checkConstraintsLower(T1, nullType, testLib, ['dart.core::Null? <: T1']);
-    _checkConstraintsUpper(nullType, Q, testLib, []);
+    _checkConstraintsLower(T1, new NullType(), testLib, ['Null <: T1']);
+    _checkConstraintsUpper(new NullType(), Q, testLib, []);
   }
 
   void test_parameter_subtype_any() {
diff --git a/pkg/front_end/test/fasta/type_inference/type_constraint_gatherer_test.dart b/pkg/front_end/test/fasta/type_inference/type_constraint_gatherer_test.dart
index cb0ec2f..ebdb227 100644
--- a/pkg/front_end/test/fasta/type_inference/type_constraint_gatherer_test.dart
+++ b/pkg/front_end/test/fasta/type_inference/type_constraint_gatherer_test.dart
@@ -63,8 +63,6 @@
 
   Class get mapClass => coreTypes.mapClass;
 
-  InterfaceType get nullType => coreTypes.nullType;
-
   Class get objectClass => coreTypes.objectClass;
 
   InterfaceType get objectType => coreTypes.objectLegacyRawType;
@@ -218,8 +216,8 @@
   }
 
   void test_null_subtype_any() {
-    _checkConstraintsLower(T1, nullType, testLib, ['dart.core::Null? <: T1']);
-    _checkConstraintsUpper(nullType, Q, testLib, []);
+    _checkConstraintsLower(T1, new NullType(), testLib, ['Null <: T1']);
+    _checkConstraintsUpper(new NullType(), Q, testLib, []);
   }
 
   void test_parameter_subtype_any() {
diff --git a/pkg/front_end/test/fasta/type_inference/type_schema_elimination_nnbd_test.dart b/pkg/front_end/test/fasta/type_inference/type_schema_elimination_nnbd_test.dart
index cc03f2a..dcad472 100644
--- a/pkg/front_end/test/fasta/type_inference/type_schema_elimination_nnbd_test.dart
+++ b/pkg/front_end/test/fasta/type_inference/type_schema_elimination_nnbd_test.dart
@@ -24,7 +24,7 @@
 
   DartType get dynamicType => const DynamicType();
 
-  DartType get nullType => coreTypes.nullType;
+  DartType get nullType => new NullType();
 
   DartType greatestClosure(DartType schema) {
     return typeSchemaElimination.greatestClosure(
@@ -140,19 +140,11 @@
   final Class listClass = new Class(name: 'List');
 
   @override
-  final Class nullClass = new Class(name: 'Null');
-
-  @override
   final Class objectClass = new Class(name: 'Object');
 
-  @override
-  InterfaceType nullType;
-
   _MockCoreTypes() {
-    nullType = new InterfaceType(
-        nullClass, Nullability.nullable, const <DynamicType>[]);
     new Library(Uri.parse('dart:core'),
-        name: 'dart.core', classes: [listClass, nullClass, objectClass]);
+        name: 'dart.core', classes: [listClass, objectClass]);
   }
 
   noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
diff --git a/pkg/front_end/test/fasta/type_inference/type_schema_elimination_test.dart b/pkg/front_end/test/fasta/type_inference/type_schema_elimination_test.dart
index d7cf9e6..a4c8ee3 100644
--- a/pkg/front_end/test/fasta/type_inference/type_schema_elimination_test.dart
+++ b/pkg/front_end/test/fasta/type_inference/type_schema_elimination_test.dart
@@ -24,16 +24,16 @@
 
   DartType get dynamicType => const DynamicType();
 
-  DartType get nullType => coreTypes.nullType;
-
   DartType get objectType => coreTypes.objectLegacyRawType;
 
   DartType greatestClosure(DartType schema) {
-    return typeSchemaElimination.greatestClosure(schema, dynamicType, nullType);
+    return typeSchemaElimination.greatestClosure(
+        schema, dynamicType, const NullType());
   }
 
   DartType leastClosure(DartType schema) {
-    return typeSchemaElimination.leastClosure(schema, dynamicType, nullType);
+    return typeSchemaElimination.leastClosure(
+        schema, dynamicType, const NullType());
   }
 
   void test_greatestClosure_contravariant() {
@@ -41,12 +41,12 @@
         greatestClosure(new FunctionType(
                 [unknownType], dynamicType, Nullability.legacy))
             .leakingDebugToString(),
-        '(dart.core::Null?) →* dynamic');
+        '(Null) →* dynamic');
     expect(
         greatestClosure(new FunctionType([], dynamicType, Nullability.legacy,
                 namedParameters: [new NamedType('foo', unknownType)]))
             .leakingDebugToString(),
-        '({foo: dart.core::Null?}) →* dynamic');
+        '({foo: Null}) →* dynamic');
   }
 
   void test_greatestClosure_contravariant_contravariant() {
@@ -78,8 +78,7 @@
               new NamedType('a', unknownType),
               new NamedType('b', unknownType)
             ])).leakingDebugToString(),
-        '(dart.core::Null?, dart.core::Null?, {a: dart.core::Null?, '
-        'b: dart.core::Null?}) →* dynamic');
+        '(Null, Null, {a: Null, b: Null}) →* dynamic');
   }
 
   void test_greatestClosure_simple() {
@@ -105,19 +104,19 @@
           new FunctionType([unknownType], dynamicType, Nullability.legacy)
         ], dynamicType, Nullability.legacy))
             .leakingDebugToString(),
-        '((dart.core::Null?) →* dynamic) →* dynamic');
+        '((Null) →* dynamic) →* dynamic');
   }
 
   void test_leastClosure_covariant() {
     expect(
         leastClosure(new FunctionType([], unknownType, Nullability.legacy))
             .leakingDebugToString(),
-        '() →* dart.core::Null?');
+        '() →* Null');
     expect(
         leastClosure(new InterfaceType(
                 coreTypes.listClass, Nullability.legacy, [unknownType]))
             .leakingDebugToString(),
-        'dart.core::List<dart.core::Null?>*');
+        'dart.core::List<Null>*');
   }
 
   void test_leastClosure_function_multipleUnknown() {
@@ -128,12 +127,11 @@
               new NamedType('a', unknownType),
               new NamedType('b', unknownType)
             ])).leakingDebugToString(),
-        '(dynamic, dynamic, {a: dynamic, b: dynamic}) →* dart.core::Null?');
+        '(dynamic, dynamic, {a: dynamic, b: dynamic}) →* Null');
   }
 
   void test_leastClosure_simple() {
-    expect(
-        leastClosure(unknownType).leakingDebugToString(), 'dart.core::Null?');
+    expect(leastClosure(unknownType).leakingDebugToString(), 'Null');
   }
 }
 
@@ -142,19 +140,11 @@
   final Class listClass = new Class(name: 'List');
 
   @override
-  final Class nullClass = new Class(name: 'Null');
-
-  @override
   final Class objectClass = new Class(name: 'Object');
 
-  @override
-  InterfaceType nullType;
-
   _MockCoreTypes() {
-    nullType = new InterfaceType(
-        nullClass, Nullability.nullable, const <DynamicType>[]);
     new Library(Uri.parse('dart:core'),
-        name: 'dart.core', classes: [listClass, nullClass, objectClass]);
+        name: 'dart.core', classes: [listClass, objectClass]);
   }
 
   noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
diff --git a/pkg/front_end/test/fasta/type_inference/type_schema_environment_nnbd_test.dart b/pkg/front_end/test/fasta/type_inference/type_schema_environment_nnbd_test.dart
index 5217ca9..9e5df47 100644
--- a/pkg/front_end/test/fasta/type_inference/type_schema_environment_nnbd_test.dart
+++ b/pkg/front_end/test/fasta/type_inference/type_schema_environment_nnbd_test.dart
@@ -386,6 +386,27 @@
     }
   }
 
+  void test_lower_bound_object() {
+    _initialize("");
+
+    testLower("Object", "FutureOr<Null>", "FutureOr<Never>");
+    testLower("FutureOr<Null>", "Object", "FutureOr<Never>");
+
+    // FutureOr<dynamic> is top.
+    testLower("Object", "FutureOr<dynamic>", "Object");
+    testLower("FutureOr<dynamic>", "Object", "Object");
+
+    // FutureOr<X> is not top and cannot be made non-nullable.
+    testLower("Object", "FutureOr<X>", "Never",
+        typeParameters: 'X extends dynamic');
+    testLower("FutureOr<X>", "Object", "Never",
+        typeParameters: 'X extends dynamic');
+
+    // FutureOr<void> is top.
+    testLower("Object", "FutureOr<void>", "Object");
+    testLower("FutureOr<void>", "Object", "Object");
+  }
+
   void test_lower_bound_function() {
     const String testSdk = """
       class A;
@@ -637,7 +658,7 @@
           [
             coreTypes.intNonNullableRawType,
             coreTypes.doubleNonNullableRawType,
-            coreTypes.nullType
+            const NullType()
           ],
           null,
           inferredTypes,
@@ -777,6 +798,13 @@
     testUpper("List<int?>", "List<double>", "List<num?>");
   }
 
+  void test_upper_bound_object() {
+    _initialize("");
+
+    testUpper("Object", "FutureOr<Function?>", "Object?");
+    testUpper("FutureOr<Function?>", "Object", "Object?");
+  }
+
   void test_upper_bound_function() {
     const String testSdk = """
       class A;
diff --git a/pkg/front_end/test/fasta/type_inference/type_schema_environment_test.dart b/pkg/front_end/test/fasta/type_inference/type_schema_environment_test.dart
index aedad18..24ef0a4 100644
--- a/pkg/front_end/test/fasta/type_inference/type_schema_environment_test.dart
+++ b/pkg/front_end/test/fasta/type_inference/type_schema_environment_test.dart
@@ -50,15 +50,13 @@
 
   Class get mapClass => coreTypes.mapClass;
 
-  InterfaceType get nullType => coreTypes.nullType;
-
   InterfaceType get numType => coreTypes.numLegacyRawType;
 
   Class get objectClass => coreTypes.objectClass;
 
   InterfaceType get objectType => coreTypes.objectLegacyRawType;
 
-  DartType get bottomType => nullType;
+  DartType get bottomType => const NullType();
 
   DartType get topType => const DynamicType();
 
@@ -672,7 +670,7 @@
             topType,
             bottomType,
             grounded: true),
-        new InterfaceType(A.classNode, Nullability.legacy, [nullType]));
+        new InterfaceType(A.classNode, Nullability.legacy, [const NullType()]));
     // Solve(? <: T <: A) => A
     expect(
         env.solveTypeConstraint(_makeConstraint(upper: A), topType, bottomType),
@@ -776,7 +774,7 @@
             topType,
             bottomType,
             grounded: true),
-        new InterfaceType(B.classNode, Nullability.legacy, [nullType]));
+        new InterfaceType(B.classNode, Nullability.legacy, [const NullType()]));
   }
 
   void test_typeConstraint_default() {
diff --git a/pkg/front_end/test/fasta/types/fasta_legacy_upper_bound_test.dart b/pkg/front_end/test/fasta/types/fasta_legacy_upper_bound_test.dart
index 0f771da..cf9cfa5 100644
--- a/pkg/front_end/test/fasta/types/fasta_legacy_upper_bound_test.dart
+++ b/pkg/front_end/test/fasta/types/fasta_legacy_upper_bound_test.dart
@@ -44,11 +44,11 @@
         await context.options.getUriTranslator(),
         new NoneTarget(new TargetFlags()));
     final DillLoader loader = target.loader;
-    loader.appendLibraries(component);
+    loader.appendLibraries(env.component);
     await target.buildOutlines();
     ClassBuilder objectClass =
         loader.coreLibrary.lookupLocalMember("Object", required: true);
-    hierarchy = new ClassHierarchyBuilder(objectClass, loader, coreTypes);
+    hierarchy = new ClassHierarchyBuilder(objectClass, loader, env.coreTypes);
   }
 
   @override
diff --git a/pkg/front_end/test/fasta/types/kernel_legacy_upper_bound_test.dart b/pkg/front_end/test/fasta/types/kernel_legacy_upper_bound_test.dart
index 152d8d6..0409fcb 100644
--- a/pkg/front_end/test/fasta/types/kernel_legacy_upper_bound_test.dart
+++ b/pkg/front_end/test/fasta/types/kernel_legacy_upper_bound_test.dart
@@ -14,7 +14,7 @@
   @override
   Future<void> parseComponent(String source) {
     super.parseComponent(source);
-    hierarchy = new ClassHierarchy(component, coreTypes);
+    hierarchy = new ClassHierarchy(env.component, env.coreTypes);
     return null;
   }
 
diff --git a/pkg/front_end/test/fasta/types/legacy_upper_bound_helper.dart b/pkg/front_end/test/fasta/types/legacy_upper_bound_helper.dart
index d316988..f55fe0a 100644
--- a/pkg/front_end/test/fasta/types/legacy_upper_bound_helper.dart
+++ b/pkg/front_end/test/fasta/types/legacy_upper_bound_helper.dart
@@ -6,58 +6,49 @@
 
 import "package:expect/expect.dart" show Expect;
 
-import "package:kernel/ast.dart"
-    show Class, Component, DartType, InterfaceType, Library, Nullability;
+import "package:kernel/ast.dart";
 
-import "package:kernel/core_types.dart";
-
-import "package:kernel/library_index.dart" show LibraryIndex;
-
-import 'package:kernel/testing/type_parser_environment.dart'
-    as kernel_type_parser show parseComponent;
+import 'package:kernel/testing/type_parser_environment.dart' as parser;
 
 final Uri libraryUri = Uri.parse("org-dartlang-test:///library.dart");
 
 abstract class LegacyUpperBoundTest {
-  Component component;
-
-  CoreTypes coreTypes;
-
-  LibraryIndex index;
-
-  DartType get objectType => coreTypes.objectLegacyRawType;
-
-  DartType get intType => coreTypes.intLegacyRawType;
-
-  DartType get stringType => coreTypes.intLegacyRawType;
-
-  DartType get doubleType => coreTypes.doubleLegacyRawType;
-
-  DartType get boolType => coreTypes.boolLegacyRawType;
+  parser.Env env;
+  Library coreLibrary;
+  Library testLibrary;
 
   void parseComponent(String source) {
-    component = kernel_type_parser.parseComponent(source, libraryUri);
-    coreTypes = new CoreTypes(component);
-    index = new LibraryIndex.all(component);
-  }
-
-  Class getClass(String name) {
-    return index.getClass("$libraryUri", name);
-  }
-
-  Class getCoreClass(String name) {
-    return index.getClass("dart:core", name);
+    env = new parser.Env(source);
+    assert(
+        env.component.libraries.length == 2,
+        "The test component is expected to have exactly two libraries: "
+        "the core library and the test library.");
+    Library firstLibrary = env.component.libraries.first;
+    Library secondLibrary = env.component.libraries.last;
+    if (firstLibrary.importUri.scheme == "dart" &&
+        firstLibrary.importUri.path == "core") {
+      coreLibrary = firstLibrary;
+      testLibrary = secondLibrary;
+    } else {
+      coreLibrary = secondLibrary;
+      testLibrary = firstLibrary;
+    }
   }
 
   DartType getLegacyLeastUpperBound(
       DartType a, DartType b, Library clientLibrary);
 
-  void checkGetLegacyLeastUpperBound(
-      DartType a, DartType b, Library clientLibrary, DartType expected) {
+  void checkLegacyUpTypes(
+      DartType a, DartType b, DartType expected, Library clientLibrary) {
     DartType actual = getLegacyLeastUpperBound(a, b, clientLibrary);
     Expect.equals(expected, actual);
   }
 
+  void checkLegacyUp(String type1, String type2, String expectedType) {
+    checkLegacyUpTypes(env.parseType(type1), env.parseType(type2),
+        env.parseType(expectedType), testLibrary);
+  }
+
   Future<void> test() {
     return asyncTest(() async {
       await test_getLegacyLeastUpperBound_expansive();
@@ -74,36 +65,19 @@
 class C2<T> extends N<N<C2<N<C2<T*>*>*>*>*>;
 """);
 
-    Class N = getClass("N");
-    Class C1 = getClass("C1");
-    Class C2 = getClass("C2");
-    Library testLib = N.enclosingLibrary;
-
     // The least upper bound of C1<int> and N<C1<String>> is Object since the
     // supertypes are
     //     {C1<int>, N<N<C1<int>>>, Object} for C1<int> and
     //     {N<C1<String>>, Object} for N<C1<String>> and
     // Object is the most specific type in the intersection of the supertypes.
-    checkGetLegacyLeastUpperBound(
-        new InterfaceType(C1, Nullability.legacy, [intType]),
-        new InterfaceType(N, Nullability.legacy, [
-          new InterfaceType(C1, Nullability.legacy, [stringType])
-        ]),
-        testLib,
-        objectType);
+    checkLegacyUp("C1<int*>*", "N<C1<String*>*>*", "Object*");
 
     // The least upper bound of C2<int> and N<C2<String>> is Object since the
     // supertypes are
     //     {C2<int>, N<N<C2<N<C2<int>>>>>, Object} for C2<int> and
     //     {N<C2<String>>, Object} for N<C2<String>> and
     // Object is the most specific type in the intersection of the supertypes.
-    checkGetLegacyLeastUpperBound(
-        new InterfaceType(C2, Nullability.legacy, [intType]),
-        new InterfaceType(N, Nullability.legacy, [
-          new InterfaceType(C2, Nullability.legacy, [stringType])
-        ]),
-        testLib,
-        objectType);
+    checkLegacyUp("C2<int*>*", "N<C2<String*>*>*", "Object*");
   }
 
   Future<void> test_getLegacyLeastUpperBound_generic() async {
@@ -116,39 +90,12 @@
 class F implements D<int*, bool*>;
 """);
 
-    Class a = getClass("A");
-    Class b = getClass("B");
-    Class c = getClass("C");
-    Class d = getClass("D");
-    Class e = getClass("E");
-    Class f = getClass("F");
-    Library testLib = a.enclosingLibrary;
-
-    checkGetLegacyLeastUpperBound(
-        new InterfaceType(d, Nullability.legacy, [intType, doubleType]),
-        new InterfaceType(d, Nullability.legacy, [intType, doubleType]),
-        testLib,
-        new InterfaceType(d, Nullability.legacy, [intType, doubleType]));
-    checkGetLegacyLeastUpperBound(
-        new InterfaceType(d, Nullability.legacy, [intType, doubleType]),
-        new InterfaceType(d, Nullability.legacy, [intType, boolType]),
-        testLib,
-        new InterfaceType(b, Nullability.legacy, [intType]));
-    checkGetLegacyLeastUpperBound(
-        new InterfaceType(d, Nullability.legacy, [intType, doubleType]),
-        new InterfaceType(d, Nullability.legacy, [boolType, doubleType]),
-        testLib,
-        new InterfaceType(c, Nullability.legacy, [doubleType]));
-    checkGetLegacyLeastUpperBound(
-        new InterfaceType(d, Nullability.legacy, [intType, doubleType]),
-        new InterfaceType(d, Nullability.legacy, [boolType, intType]),
-        testLib,
-        coreTypes.legacyRawType(a));
-    checkGetLegacyLeastUpperBound(
-        coreTypes.legacyRawType(e),
-        coreTypes.legacyRawType(f),
-        testLib,
-        new InterfaceType(b, Nullability.legacy, [intType]));
+    checkLegacyUp(
+        "D<int*, double*>*", "D<int*, double*>*", "D<int*, double*>*");
+    checkLegacyUp("D<int*, double*>*", "D<int*, bool*>*", "B<int*>*");
+    checkLegacyUp("D<int*, double*>*", "D<bool*, double*>*", "C<double*>*");
+    checkLegacyUp("D<int*, double*>*", "D<bool*, int*>*", "A*");
+    checkLegacyUp("E*", "F*", "B<int*>*");
   }
 
   Future<void> test_getLegacyLeastUpperBound_nonGeneric() async {
@@ -164,31 +111,13 @@
 class I implements C, D, E;
 """);
 
-    Class a = getClass("A");
-    Class b = getClass("B");
-    Class c = getClass("C");
-    Class d = getClass("D");
-    Class f = getClass("F");
-    Class g = getClass("G");
-    Class h = getClass("H");
-    Class i = getClass("I");
-    Library testLib = a.enclosingLibrary;
-
-    checkGetLegacyLeastUpperBound(coreTypes.legacyRawType(a),
-        coreTypes.legacyRawType(b), testLib, objectType);
-    checkGetLegacyLeastUpperBound(
-        coreTypes.legacyRawType(a), objectType, testLib, objectType);
-    checkGetLegacyLeastUpperBound(
-        objectType, coreTypes.legacyRawType(b), testLib, objectType);
-    checkGetLegacyLeastUpperBound(coreTypes.legacyRawType(c),
-        coreTypes.legacyRawType(d), testLib, coreTypes.legacyRawType(a));
-    checkGetLegacyLeastUpperBound(coreTypes.legacyRawType(c),
-        coreTypes.legacyRawType(a), testLib, coreTypes.legacyRawType(a));
-    checkGetLegacyLeastUpperBound(coreTypes.legacyRawType(a),
-        coreTypes.legacyRawType(d), testLib, coreTypes.legacyRawType(a));
-    checkGetLegacyLeastUpperBound(coreTypes.legacyRawType(f),
-        coreTypes.legacyRawType(g), testLib, coreTypes.legacyRawType(a));
-    checkGetLegacyLeastUpperBound(coreTypes.legacyRawType(h),
-        coreTypes.legacyRawType(i), testLib, coreTypes.legacyRawType(a));
+    checkLegacyUp("A*", "B*", "Object*");
+    checkLegacyUp("A*", "Object*", "Object*");
+    checkLegacyUp("Object*", "B*", "Object*");
+    checkLegacyUp("C*", "D*", "A*");
+    checkLegacyUp("C*", "A*", "A*");
+    checkLegacyUp("A*", "D*", "A*");
+    checkLegacyUp("F*", "G*", "A*");
+    checkLegacyUp("H*", "I*", "A*");
   }
 }
diff --git a/pkg/front_end/test/fasta/weak_suite.dart b/pkg/front_end/test/fasta/weak_suite.dart
index 6316e60..604a480 100644
--- a/pkg/front_end/test/fasta/weak_suite.dart
+++ b/pkg/front_end/test/fasta/weak_suite.dart
@@ -4,8 +4,6 @@
 
 library fasta.test.weak_test;
 
-import 'dart:async' show Future;
-
 import 'testing/suite.dart';
 
 Future<FastaContext> createContext(
diff --git a/pkg/front_end/test/flutter_gallery_leak_tester.dart b/pkg/front_end/test/flutter_gallery_leak_tester.dart
index b0aacdb..033b59a 100644
--- a/pkg/front_end/test/flutter_gallery_leak_tester.dart
+++ b/pkg/front_end/test/flutter_gallery_leak_tester.dart
@@ -186,9 +186,6 @@
     "$rootPath/gallery/.packages",
     "-Ddart.vm.profile=false",
     "-Ddart.vm.product=false",
-    "--bytecode-options=source-positions,local-var-info,debugger-stops,"
-        "instance-field-initializers,keep-unreachable-code,"
-        "avoid-closure-call-instructions",
     "--enable-asserts",
     "--track-widget-creation",
     "--initialize-from-dill",
diff --git a/pkg/front_end/test/hot_reload_e2e_test.dart b/pkg/front_end/test/hot_reload_e2e_test.dart
index 939d3a0..d64dcd3 100644
--- a/pkg/front_end/test/hot_reload_e2e_test.dart
+++ b/pkg/front_end/test/hot_reload_e2e_test.dart
@@ -7,7 +7,7 @@
 /// reload on the running program.
 library front_end.incremental.hot_reload_e2e_test;
 
-import 'dart:async' show Completer, Future;
+import 'dart:async' show Completer;
 
 import 'dart:convert' show LineSplitter, utf8;
 
diff --git a/pkg/front_end/test/id_testing/data/declarations.dart b/pkg/front_end/test/id_testing/data/declarations.dart
index 8f00ad4..dfe8054 100644
--- a/pkg/front_end/test/id_testing/data/declarations.dart
+++ b/pkg/front_end/test/id_testing/data/declarations.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.7
+
 /*library: file=main.dart*/
 
 /*member: main:main*/
diff --git a/pkg/front_end/test/id_testing/data/errors.dart b/pkg/front_end/test/id_testing/data/errors.dart
index e58d6c4..c2693b3 100644
--- a/pkg/front_end/test/id_testing/data/errors.dart
+++ b/pkg/front_end/test/id_testing/data/errors.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.7
+
 /*cfe.library: file=main.dart*/
 
 /*cfe.member: main:main*/
diff --git a/pkg/front_end/test/id_tests/inheritance_test.dart b/pkg/front_end/test/id_tests/inheritance_test.dart
index 39f382a..f39b8d2 100644
--- a/pkg/front_end/test/id_tests/inheritance_test.dart
+++ b/pkg/front_end/test/id_tests/inheritance_test.dart
@@ -25,11 +25,15 @@
       onFailure: onFailure,
       runTest: runTestFor(const InheritanceDataComputer(), [
         new TestConfig(cfeMarker, 'cfe with nnbd',
-            experimentalFlags: const {ExperimentalFlag.nonNullable: true},
+            explicitExperimentalFlags: const {
+              ExperimentalFlag.nonNullable: true
+            },
             librariesSpecificationUri: createUriForFileName('libraries.json'),
             compileSdk: true),
         new TestConfig(cfeFromBuilderMarker, 'cfe from builder',
-            experimentalFlags: const {ExperimentalFlag.nonNullable: true},
+            explicitExperimentalFlags: const {
+              ExperimentalFlag.nonNullable: true
+            },
             librariesSpecificationUri: createUriForFileName('libraries.json'),
             compileSdk: true)
       ]));
@@ -121,8 +125,7 @@
       InterfaceType supertype = _hierarchy.getTypeAsInstanceOf(
           _coreTypes.thisInterfaceType(node, node.enclosingLibrary.nonNullable),
           member.enclosingClass,
-          node.enclosingLibrary,
-          _coreTypes);
+          node.enclosingLibrary);
       Substitution substitution = Substitution.fromInterfaceType(supertype);
       DartType type;
       if (member is Procedure) {
diff --git a/pkg/front_end/test/incremental_bulk_compiler_full.dart b/pkg/front_end/test/incremental_bulk_compiler_full.dart
index ad1a7f3..03ac980 100644
--- a/pkg/front_end/test/incremental_bulk_compiler_full.dart
+++ b/pkg/front_end/test/incremental_bulk_compiler_full.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:async' show Future;
-
 import 'package:expect/expect.dart' show Expect;
 
 import 'package:front_end/src/api_prototype/compiler_options.dart'
diff --git a/pkg/front_end/test/incremental_bulk_compiler_smoke_suite.dart b/pkg/front_end/test/incremental_bulk_compiler_smoke_suite.dart
index 866104c..28f3352 100644
--- a/pkg/front_end/test/incremental_bulk_compiler_smoke_suite.dart
+++ b/pkg/front_end/test/incremental_bulk_compiler_smoke_suite.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:async' show Future;
-
 import 'package:testing/testing.dart' show Chain, runMe;
 
 import 'incremental_bulk_compiler_full.dart' show Context;
diff --git a/pkg/front_end/test/incremental_compiler_leak_test.dart b/pkg/front_end/test/incremental_compiler_leak_test.dart
index e526d98..7d3fcd7 100644
--- a/pkg/front_end/test/incremental_compiler_leak_test.dart
+++ b/pkg/front_end/test/incremental_compiler_leak_test.dart
@@ -192,6 +192,8 @@
       if (classDetails.name == "ConstructorScope") return true;
       if (classDetails.name == "ScopeBuilder") return true;
       if (classDetails.name == "ConstructorScopeBuilder") return true;
+      if (classDetails.name == "NullTypeDeclarationBuilder") return true;
+      if (classDetails.name == "NullabilityBuilder") return true;
 
       return false;
     } else if (uriString.startsWith("package:kernel/")) {
diff --git a/pkg/front_end/test/incremental_dart2js_load_from_dill_test.dart b/pkg/front_end/test/incremental_dart2js_load_from_dill_test.dart
index 2d7e57c..844ecd5 100644
--- a/pkg/front_end/test/incremental_dart2js_load_from_dill_test.dart
+++ b/pkg/front_end/test/incremental_dart2js_load_from_dill_test.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:async' show Future;
-
 import 'dart:io' show Directory, File;
 
 import 'package:expect/expect.dart' show Expect;
diff --git a/pkg/front_end/test/incremental_dart2js_tester.dart b/pkg/front_end/test/incremental_dart2js_tester.dart
index 28ee1d6..59c95ee 100644
--- a/pkg/front_end/test/incremental_dart2js_tester.dart
+++ b/pkg/front_end/test/incremental_dart2js_tester.dart
@@ -176,7 +176,7 @@
     stopwatch.start();
     Uri input = Platform.script.resolve("../../compiler/bin/dart2js.dart");
     CompilerOptions options = helper.getOptions();
-    options.experimentalFlags[ExperimentalFlag
+    options.explicitExperimentalFlags[ExperimentalFlag
         .alternativeInvalidationStrategy] = useExperimentalInvalidation;
     helper.TestIncrementalCompiler compiler =
         new helper.TestIncrementalCompiler(options, input);
diff --git a/pkg/front_end/test/incremental_flutter_tester.dart b/pkg/front_end/test/incremental_flutter_tester.dart
index 7b292c4..ac3be91 100644
--- a/pkg/front_end/test/incremental_flutter_tester.dart
+++ b/pkg/front_end/test/incremental_flutter_tester.dart
@@ -78,8 +78,8 @@
 
   Stopwatch stopwatch = new Stopwatch()..start();
   CompilerOptions options = getOptions(flutterPatchedSdk.uri);
-  options.experimentalFlags[ExperimentalFlag.alternativeInvalidationStrategy] =
-      useExperimentalInvalidation;
+  options.explicitExperimentalFlags[ExperimentalFlag
+      .alternativeInvalidationStrategy] = useExperimentalInvalidation;
   helper.TestIncrementalCompiler compiler =
       new helper.TestIncrementalCompiler(options, inputFile.uri);
   Component c = await compiler.computeDelta();
diff --git a/pkg/front_end/test/incremental_load_from_dill_suite.dart b/pkg/front_end/test/incremental_load_from_dill_suite.dart
index 768e1ba..a6237db 100644
--- a/pkg/front_end/test/incremental_load_from_dill_suite.dart
+++ b/pkg/front_end/test/incremental_load_from_dill_suite.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:async' show Future;
-
 import 'dart:developer' show debugger;
 
 import 'dart:io' show Directory, File;
@@ -47,6 +45,7 @@
 import 'package:front_end/src/fasta/kernel/kernel_api.dart';
 
 import 'package:front_end/src/fasta/kernel/utils.dart' show ByteSink;
+import 'package:kernel/ast.dart';
 
 import 'package:kernel/binary/ast_from_binary.dart' show BinaryBuilder;
 
@@ -74,7 +73,7 @@
 import 'package:kernel/text/ast_to_text.dart' show Printer, componentToString;
 
 import "package:testing/testing.dart"
-    show Chain, ChainContext, Result, Step, TestDescription, runMe;
+    show Chain, ChainContext, Expectation, Result, Step, TestDescription, runMe;
 
 import "package:vm/target/vm.dart" show VmTarget;
 
@@ -89,6 +88,44 @@
 main([List<String> arguments = const []]) =>
     runMe(arguments, createContext, configurationPath: "../testing.json");
 
+const Expectation ExpectationFileMismatch =
+    const Expectation.fail("ExpectationFileMismatch");
+const Expectation ExpectationFileMissing =
+    const Expectation.fail("ExpectationFileMissing");
+const Expectation MissingErrors = const Expectation.fail("MissingErrors");
+const Expectation UnexpectedErrors = const Expectation.fail("UnexpectedErrors");
+const Expectation MissingWarnings = const Expectation.fail("MissingWarnings");
+const Expectation UnexpectedWarnings =
+    const Expectation.fail("UnexpectedWarnings");
+const Expectation ClassHierarchyError =
+    const Expectation.fail("ClassHierarchyError");
+const Expectation NeededDillMismatch =
+    const Expectation.fail("NeededDillMismatch");
+const Expectation IncrementalSerializationError =
+    const Expectation.fail("IncrementalSerializationError");
+const Expectation ContentDataMismatch =
+    const Expectation.fail("ContentDataMismatch");
+const Expectation MissingInitializationError =
+    const Expectation.fail("MissingInitializationError");
+const Expectation UnexpectedInitializationError =
+    const Expectation.fail("UnexpectedInitializationError");
+const Expectation ReachableLibrariesError =
+    const Expectation.fail("ReachableLibrariesError");
+const Expectation UriToSourceError = const Expectation.fail("UriToSourceError");
+const Expectation MissingPlatformLibraries =
+    const Expectation.fail("MissingPlatformLibraries");
+const Expectation UnexpectedPlatformLibraries =
+    const Expectation.fail("UnexpectedPlatformLibraries");
+const Expectation UnexpectedRebuildBodiesOnly =
+    const Expectation.fail("UnexpectedRebuildBodiesOnly");
+const Expectation UnexpectedEntryToLibraryCount =
+    const Expectation.fail("UnexpectedEntryToLibraryCount");
+const Expectation LibraryCountMismatch =
+    const Expectation.fail("LibraryCountMismatch");
+const Expectation InitializedFromDillMismatch =
+    const Expectation.fail("InitializedFromDillMismatch");
+const Expectation NNBDModeMismatch = const Expectation.fail("NNBDModeMismatch");
+
 Future<Context> createContext(
     Chain suite, Map<String, String> environment) async {
   // Disable colors to ensure that expectation files are the same across
@@ -152,6 +189,7 @@
   String get name => "run compilations";
 
   Future<Result<TestData>> run(TestData data, Context context) async {
+    Result<TestData> result;
     YamlMap map = data.map;
     Set<String> keys = new Set<String>.from(map.keys.cast<String>());
     keys.remove("type");
@@ -175,7 +213,7 @@
           "trackWidgetCreation",
           "incrementalSerialization"
         ]);
-        await new NewWorldTest().newWorldTest(
+        result = await new NewWorldTest().newWorldTest(
           data,
           context,
           map["worlds"],
@@ -192,7 +230,7 @@
     }
 
     if (keys.isNotEmpty) throw "Unknown toplevel keys: $keys";
-    return pass(data);
+    return result ?? pass(data);
   }
 }
 
@@ -315,7 +353,8 @@
     if (wantedLibs.length != moduleSources.length) {
       throw "Module probably not setup right.";
     }
-    Component result = new Component(libraries: wantedLibs);
+    Component result = new Component(libraries: wantedLibs)
+      ..setMainMethodAndMode(null, false, c.mode);
     List<int> resultBytes = util.postProcess(result);
     moduleResult[moduleName] = resultBytes;
   }
@@ -340,7 +379,7 @@
     return output;
   }
 
-  Future<Null> newWorldTest(
+  Future<Result<TestData>> newWorldTest(
       TestData data,
       Context context,
       List worlds,
@@ -469,6 +508,8 @@
         Uri uri = base.resolve(filename);
         if (filename == ".packages") {
           packagesUri = uri;
+        } else if (filename == ".dart_tool/package_config.json") {
+          packagesUri = uri;
         }
         if (world["enableStringReplacement"] == true) {
           data = doStringReplacements(data);
@@ -489,12 +530,21 @@
         }
         options.omitPlatform = omitPlatform != false;
         if (world["experiments"] != null) {
-          Map<ExperimentalFlag, bool> experimentalFlags =
-              parseExperimentalFlags(
-                  parseExperimentalArguments([world["experiments"]]),
+          Map<String, bool> flagsFromOptions =
+              parseExperimentalArguments([world["experiments"]]);
+          // Ensure that we run with non-nullable turned off even when the
+          // flag is on by default.
+          // TODO(johnniwinther,jensj): Update tests to explicitly opt out.
+          flagsFromOptions['non-nullable'] ??= false;
+          Map<ExperimentalFlag, bool> explicitExperimentalFlags =
+              parseExperimentalFlags(flagsFromOptions,
                   onError: (e) =>
                       throw "Error on parsing experiments flags: $e");
-          options.experimentalFlags = experimentalFlags;
+          options.explicitExperimentalFlags = explicitExperimentalFlags;
+        } else {
+          options.explicitExperimentalFlags = {
+            ExperimentalFlag.nonNullable: false
+          };
         }
         if (world["nnbdMode"] != null) {
           String nnbdMode = world["nnbdMode"];
@@ -611,8 +661,9 @@
           }
         }
       }
-      performErrorAndWarningCheck(
-          world, gotError, formattedErrors, gotWarning, formattedWarnings);
+      Result<TestData> result = performErrorAndWarningCheck(world, data,
+          gotError, formattedErrors, gotWarning, formattedWarnings);
+      if (result != null) return result;
       if (world["expectInitializationError"] != null) {
         Set<String> seenInitializationError = seenDiagnosticCodes.intersection({
           "InitializeFromDillNotSelfContainedNoDump",
@@ -622,12 +673,16 @@
         });
         if (world["expectInitializationError"] == true) {
           if (seenInitializationError.isEmpty) {
-            throw "Expected to see an initialization error but didn't.";
+            return new Result<TestData>(data, MissingInitializationError,
+                "Expected to see an initialization error but didn't.");
           }
         } else if (world["expectInitializationError"] == false) {
           if (seenInitializationError.isNotEmpty) {
-            throw "Expected not to see an initialization error but did: "
-                "$seenInitializationError.";
+            return new Result<TestData>(
+                data,
+                UnexpectedInitializationError,
+                "Expected not to see an initialization error but did: "
+                "$seenInitializationError.");
           }
         } else {
           throw "Unsupported value for 'expectInitializationError': "
@@ -639,8 +694,14 @@
           fileSystem: gotError ? null : fs);
       print("Compile took ${stopwatch.elapsedMilliseconds} ms");
 
-      checkExpectedContent(world, component);
-      checkNeededDillLibraries(world, compiler.neededDillLibraries, base);
+      Result contentResult = checkExpectedContent(world, component);
+      if (contentResult != null) return contentResult.copyWithOutput(data);
+      result = checkNeededDillLibraries(
+          world, data, compiler.neededDillLibraries, base);
+      if (result != null) return result;
+
+      Result nnbdCheck = checkNNBDSettings(component);
+      if (nnbdCheck != null) return nnbdCheck.copyWithOutput(data);
 
       if (!noFullComponent) {
         Set<Library> allLibraries = new Set<Library>();
@@ -648,13 +709,19 @@
           computeAllReachableLibrariesFor(lib, allLibraries);
         }
         if (allLibraries.length != component.libraries.length) {
-          Expect.fail("Expected for the reachable stuff to be equal to "
+          return new Result<TestData>(
+              data,
+              ReachableLibrariesError,
+              "Expected for the reachable stuff to be equal to "
               "${component.libraries} but it was $allLibraries");
         }
         Set<Library> tooMany = allLibraries.toSet()
           ..removeAll(component.libraries);
         if (tooMany.isNotEmpty) {
-          Expect.fail("Expected for the reachable stuff to be equal to "
+          return new Result<TestData>(
+              data,
+              ReachableLibrariesError,
+              "Expected for the reachable stuff to be equal to "
               "${component.libraries} but these were there too: $tooMany "
               "(and others were missing)");
         }
@@ -670,8 +737,11 @@
         for (String filename in world["uriToSourcesDoesntInclude"]) {
           Uri uri = base.resolve(filename);
           if (component.uriToSource[uri] != null) {
-            throw "Expected no uriToSource for $uri but found "
-                "${component.uriToSource[uri]}";
+            return new Result<TestData>(
+                data,
+                UriToSourceError,
+                "Expected no uriToSource for $uri but found "
+                "${component.uriToSource[uri]}");
           }
         }
       }
@@ -686,14 +756,22 @@
           // Dart scheme uris too.
           if (uri == null || uri.scheme == "org-dartlang-sdk") continue;
           if (!allowed.contains(uri)) {
-            throw "Expected no uriToSource for $uri but found "
-                "${component.uriToSource[uri]}";
+            return new Result<TestData>(
+                data,
+                UriToSourceError,
+                "Expected no uriToSource for $uri but found "
+                "${component.uriToSource[uri]}");
           }
         }
       }
 
-      checkExpectFile(data, worldNum, "", context, actualSerialized);
-      checkClassHierarchy(compiler, component, data, worldNum, context);
+      result = checkExpectFile(data, worldNum, "", context, actualSerialized);
+      if (result != null) return result;
+      if (world["skipClassHierarchyTest"] != true) {
+        result =
+            checkClassHierarchy(compiler, component, data, worldNum, context);
+        if (result != null) return result;
+      }
 
       int nonSyntheticLibraries = countNonSyntheticLibraries(component);
       int nonSyntheticPlatformLibraries =
@@ -701,36 +779,54 @@
       int syntheticLibraries = countSyntheticLibraries(component);
       if (world["expectsPlatform"] == true) {
         if (nonSyntheticPlatformLibraries < 5) {
-          throw "Expected to have at least 5 platform libraries "
+          return new Result<TestData>(
+              data,
+              MissingPlatformLibraries,
+              "Expected to have at least 5 platform libraries "
               "(actually, the entire sdk), "
-              "but got $nonSyntheticPlatformLibraries.";
+              "but got $nonSyntheticPlatformLibraries.");
         }
       } else {
         if (nonSyntheticPlatformLibraries != 0) {
-          throw "Expected to have 0 platform libraries "
-              "but got $nonSyntheticPlatformLibraries.";
+          return new Result<TestData>(
+              data,
+              UnexpectedPlatformLibraries,
+              "Expected to have 0 platform libraries "
+              "but got $nonSyntheticPlatformLibraries.");
         }
       }
       if (world["expectedLibraryCount"] != null) {
         if (nonSyntheticLibraries - nonSyntheticPlatformLibraries !=
             world["expectedLibraryCount"]) {
-          throw "Expected ${world["expectedLibraryCount"]} non-synthetic "
+          return new Result<TestData>(
+              data,
+              LibraryCountMismatch,
+              "Expected ${world["expectedLibraryCount"]} non-synthetic "
               "libraries, got "
               "${nonSyntheticLibraries - nonSyntheticPlatformLibraries} "
-              "(not counting platform libraries)";
+              "(not counting platform libraries)");
         }
       }
       if (world["expectedSyntheticLibraryCount"] != null) {
         if (syntheticLibraries != world["expectedSyntheticLibraryCount"]) {
-          throw "Expected ${world["expectedSyntheticLibraryCount"]} synthetic "
-              "libraries, got ${syntheticLibraries}";
+          return new Result<TestData>(
+              data,
+              LibraryCountMismatch,
+              "Expected ${world["expectedSyntheticLibraryCount"]} synthetic "
+              "libraries, got ${syntheticLibraries}");
         }
       }
 
       if (world["expectsRebuildBodiesOnly"] != null) {
         bool didRebuildBodiesOnly = compiler.rebuildBodiesCount > 0;
-        Expect.equals(world["expectsRebuildBodiesOnly"], didRebuildBodiesOnly,
-            "Whether we expected to rebuild bodies only.");
+        if (world["expectsRebuildBodiesOnly"] != didRebuildBodiesOnly) {
+          return new Result<TestData>(
+              data,
+              UnexpectedRebuildBodiesOnly,
+              "Expected didRebuildBodiesOnly="
+              "${world["expectsRebuildBodiesOnly"]}, "
+              "didRebuildBodiesOnly=${didRebuildBodiesOnly}.");
+        }
       }
 
       if (!noFullComponent) {
@@ -740,14 +836,21 @@
                 entries.contains(lib.fileUri))
             .toList();
         if (entryLib.length != entries.length) {
-          throw "Expected the entries to become libraries. "
+          return new Result<TestData>(
+              data,
+              UnexpectedEntryToLibraryCount,
+              "Expected the entries to become libraries. "
               "Got ${entryLib.length} libraries for the expected "
-              "${entries.length} entries.";
+              "${entries.length} entries.");
         }
       }
       if (compiler.initializedFromDill != expectInitializeFromDill) {
-        throw "Expected that initializedFromDill would be "
-            "$expectInitializeFromDill but was ${compiler.initializedFromDill}";
+        return new Result<TestData>(
+            data,
+            InitializedFromDillMismatch,
+            "Expected that initializedFromDill would be "
+            "$expectInitializeFromDill but was "
+            "${compiler.initializedFromDill}");
       }
 
       if (incrementalSerialization == true && compiler.initializedFromDill) {
@@ -772,8 +875,12 @@
           Expect.isNull(world["expectedInvalidatedUri"]);
         }
       }
-      List<int> incrementalSerializationBytes = checkIncrementalSerialization(
+      Result<List<int>> serializationResult = checkIncrementalSerialization(
           incrementalSerialization, component, incrementalSerializer, world);
+      if (!serializationResult.isPass) {
+        return serializationResult.copyWithOutput(data);
+      }
+      List<int> incrementalSerializationBytes = serializationResult.output;
 
       Set<String> prevFormattedErrors = formattedErrors.toSet();
       Set<String> prevFormattedWarnings = formattedWarnings.toSet();
@@ -791,8 +898,9 @@
             entryPoints: entries,
             fullComponent: true,
             simulateTransformer: world["simulateTransformer"]);
-        performErrorAndWarningCheck(
-            world, gotError, formattedErrors, gotWarning, formattedWarnings);
+        Result<TestData> result = performErrorAndWarningCheck(world, data,
+            gotError, formattedErrors, gotWarning, formattedWarnings);
+        if (result != null) return result;
         List<int> thisWholeComponent = util.postProcess(component2);
         print("*****\n\ncomponent2:\n"
             "${componentToStringSdkFiltered(component2)}\n\n\n");
@@ -801,16 +909,22 @@
             prevFormattedWarnings, formattedWarnings);
         newestWholeComponent = component2;
 
-        List<int> incrementalSerializationBytes2 =
-            checkIncrementalSerialization(incrementalSerialization, component2,
-                incrementalSerializer, world);
+        Result<List<int>> serializationResult = checkIncrementalSerialization(
+            incrementalSerialization, component2, incrementalSerializer, world);
+        if (!serializationResult.isPass) {
+          return serializationResult.copyWithOutput(data);
+        }
+        List<int> incrementalSerializationBytes2 = serializationResult.output;
 
         if ((incrementalSerializationBytes == null &&
                 incrementalSerializationBytes2 != null) ||
             (incrementalSerializationBytes != null &&
                 incrementalSerializationBytes2 == null)) {
-          throw "Incremental serialization gave results in one instance, "
-              "but not another.";
+          return new Result<TestData>(
+              data,
+              IncrementalSerializationError,
+              "Incremental serialization gave results in one instance, "
+              "but not another.");
         }
 
         if (incrementalSerializationBytes != null) {
@@ -837,22 +951,29 @@
           Procedure procedure = await compiler.compileExpression(
               expression, {}, [], "debugExpr", uri);
           if (gotError && !expectErrors) {
-            throw "Got error(s) on expression compilation: ${formattedErrors}.";
+            return new Result<TestData>(data, UnexpectedErrors,
+                "Got error(s) on expression compilation: ${formattedErrors}.");
           } else if (!gotError && expectErrors) {
-            throw "Didn't get any errors.";
+            return new Result<TestData>(
+                data, MissingErrors, "Didn't get any errors.");
           }
           if (gotWarning && !expectWarnings) {
-            throw "Got warning(s) on expression compilation: "
-                "${formattedWarnings}.";
+            return new Result<TestData>(
+                data,
+                UnexpectedWarnings,
+                "Got warning(s) on expression compilation: "
+                "${formattedWarnings}.");
           } else if (!gotWarning && expectWarnings) {
-            throw "Didn't get any warnings.";
+            return new Result<TestData>(
+                data, MissingWarnings, "Didn't get any warnings.");
           }
-          checkExpectFile(
+          Result<TestData> result = checkExpectFile(
               data,
               worldNum,
               ".expression.$expressionCompilationNum",
               context,
               nodeToString(procedure));
+          if (result != null) return result;
         }
       }
 
@@ -885,8 +1006,9 @@
             entryPoints: entries,
             simulateTransformer: world["simulateTransformer"]);
         compilerFromScratch = null;
-        performErrorAndWarningCheck(
-            world, gotError, formattedErrors, gotWarning, formattedWarnings);
+        Result<TestData> result = performErrorAndWarningCheck(world, data,
+            gotError, formattedErrors, gotWarning, formattedWarnings);
+        if (result != null) return result;
         util.throwOnEmptyMixinBodies(component3);
         await util.throwOnInsufficientUriToSource(component3);
         print("Compile took ${stopwatch.elapsedMilliseconds} ms");
@@ -897,16 +1019,25 @@
         checkErrorsAndWarnings(prevFormattedErrors, formattedErrors,
             prevFormattedWarnings, formattedWarnings);
 
-        List<int> incrementalSerializationBytes3 =
-            checkIncrementalSerialization(incrementalSerialization, component3,
-                incrementalSerializer2, world);
+        Result<List<int>> serializationResult = checkIncrementalSerialization(
+            incrementalSerialization,
+            component3,
+            incrementalSerializer2,
+            world);
+        if (!serializationResult.isPass) {
+          return serializationResult.copyWithOutput(data);
+        }
+        List<int> incrementalSerializationBytes3 = serializationResult.output;
 
         if ((incrementalSerializationBytes == null &&
                 incrementalSerializationBytes3 != null) ||
             (incrementalSerializationBytes != null &&
                 incrementalSerializationBytes3 == null)) {
-          throw "Incremental serialization gave results in one instance, "
-              "but not another.";
+          return new Result<TestData>(
+              data,
+              IncrementalSerializationError,
+              "Incremental serialization gave results in one instance, "
+              "but not another.");
         }
 
         if (incrementalSerializationBytes != null) {
@@ -930,11 +1061,45 @@
         print("Continuing after debug break");
       }
     }
+    return new Result<TestData>.pass(data);
   }
 }
 
-void checkExpectFile(TestData data, int worldNum, String extraUriString,
-    Context context, String actualSerialized) {
+Result checkNNBDSettings(Component component) {
+  NonNullableByDefaultCompiledMode mode = component.mode;
+  if (mode == NonNullableByDefaultCompiledMode.Invalid) return null;
+  for (Library lib in component.libraries) {
+    if (mode == lib.nonNullableByDefaultCompiledMode) continue;
+
+    if (mode == NonNullableByDefaultCompiledMode.Agnostic) {
+      // Component says agnostic but the library isn't => Error!
+      return new Result(
+          null,
+          NNBDModeMismatch,
+          "Component mode was agnostic but ${lib.importUri} had mode "
+          "${lib.nonNullableByDefaultCompiledMode}.");
+    }
+
+    // Agnostic can be mixed with everything.
+    if (lib.nonNullableByDefaultCompiledMode ==
+        NonNullableByDefaultCompiledMode.Agnostic) continue;
+
+    if (mode == NonNullableByDefaultCompiledMode.Strong ||
+        lib.nonNullableByDefaultCompiledMode ==
+            NonNullableByDefaultCompiledMode.Strong) {
+      // Non agnostic and one (but not both) are strong => error.
+      return new Result(
+          null,
+          NNBDModeMismatch,
+          "Component mode was $mode but ${lib.importUri} had mode "
+          "${lib.nonNullableByDefaultCompiledMode}.");
+    }
+  }
+  return null;
+}
+
+Result<TestData> checkExpectFile(TestData data, int worldNum,
+    String extraUriString, Context context, String actualSerialized) {
   Uri uri = data.loadedFrom.resolve(data.loadedFrom.pathSegments.last +
       ".world.$worldNum${extraUriString}.expect");
   String expected;
@@ -948,24 +1113,32 @@
     } else {
       String extra = "";
       if (expected == null) extra = "Expect file did not exist.\n";
-      throw "${extra}Unexpected serialized representation. "
+      return new Result<TestData>(
+          data,
+          expected == null ? ExpectationFileMissing : ExpectationFileMismatch,
+          "${extra}Unexpected serialized representation. "
           "Fix or update $uri to contain the below:\n\n"
-          "$actualSerialized";
+          "$actualSerialized",
+          autoFixCommand: "updateExpectations=true");
     }
   }
+  return null;
 }
 
 /// Check that the class hierarchy is up-to-date with reality.
 ///
 /// This has the option to do expect files, but it's disabled by default
 /// while we're trying to figure out if it's useful or not.
-void checkClassHierarchy(TestIncrementalCompiler compiler, Component component,
-    TestData data, int worldNum, Context context,
+Result<TestData> checkClassHierarchy(TestIncrementalCompiler compiler,
+    Component component, TestData data, int worldNum, Context context,
     {bool checkExpectFile: false}) {
   ClassHierarchy classHierarchy = compiler.getClassHierarchy();
   if (classHierarchy is! ClosedWorldClassHierarchy) {
-    throw "Expected the class hierarchy to be ClosedWorldClassHierarchy "
-        "but it wasn't. It was ${classHierarchy.runtimeType}";
+    return new Result<TestData>(
+        data,
+        ClassHierarchyError,
+        "Expected the class hierarchy to be ClosedWorldClassHierarchy "
+        "but it wasn't. It was ${classHierarchy.runtimeType}");
   }
   List<ForTestingClassInfo> classHierarchyData =
       (classHierarchy as ClosedWorldClassHierarchy).getTestingClassInfo();
@@ -973,7 +1146,8 @@
       new Map<Class, ForTestingClassInfo>();
   for (ForTestingClassInfo info in classHierarchyData) {
     if (classHierarchyMap[info.classNode] != null) {
-      throw "Two entries for ${info.classNode}";
+      return new Result<TestData>(
+          data, ClassHierarchyError, "Two entries for ${info.classNode}");
     }
     classHierarchyMap[info.classNode] = info;
   }
@@ -986,28 +1160,35 @@
       sb.writeln("  - Class ${c.name}");
 
       Set<Class> checkedSupertypes = <Class>{};
-      void checkSupertype(Supertype supertype) {
-        if (supertype == null) return;
+      Result<TestData> checkSupertype(Supertype supertype) {
+        if (supertype == null) return null;
         Class superclass = supertype.classNode;
         if (checkedSupertypes.add(superclass)) {
           Supertype asSuperClass =
               classHierarchy.getClassAsInstanceOf(c, superclass);
           if (asSuperClass == null) {
-            throw "${superclass} not found as a superclass of $c";
+            return new Result<TestData>(data, ClassHierarchyError,
+                "${superclass} not found as a superclass of $c");
           }
-          checkSupertype(superclass.supertype);
-          checkSupertype(superclass.mixedInType);
+          Result<TestData> result = checkSupertype(superclass.supertype);
+          if (result != null) return result;
+          result = checkSupertype(superclass.mixedInType);
+          if (result != null) return result;
           for (Supertype interface in superclass.implementedTypes) {
-            checkSupertype(interface);
+            result = checkSupertype(interface);
+            if (result != null) return result;
           }
         }
+        return null;
       }
 
-      checkSupertype(c.asThisSupertype);
+      Result<TestData> result = checkSupertype(c.asThisSupertype);
+      if (result != null) return result;
 
       ForTestingClassInfo info = classHierarchyMap[c];
       if (info == null) {
-        throw "Didn't find any class hierarchy info for $c";
+        return new Result<TestData>(data, ClassHierarchyError,
+            "Didn't find any class hierarchy info for $c");
       }
 
       if (info.lazyDeclaredGettersAndCalls != null) {
@@ -1022,21 +1203,30 @@
           if (f.isStatic) continue;
           if (!f.hasImplicitGetter) continue;
           if (!members.remove(f)) {
-            throw "Didn't find ${f.name.text} in lazyDeclaredGettersAndCalls "
-                "for ${c.name} in ${library.importUri}";
+            return new Result<TestData>(
+                data,
+                ClassHierarchyError,
+                "Didn't find ${f.name.text} in lazyDeclaredGettersAndCalls "
+                "for ${c.name} in ${library.importUri}");
           }
         }
         for (Procedure p in c.procedures) {
           if (p.isStatic) continue;
           if (p.isSetter) continue;
           if (!members.remove(p)) {
-            throw "Didn't find ${p.name.text} in lazyDeclaredGettersAndCalls "
-                "for ${c.name} in ${library.importUri}";
+            return new Result<TestData>(
+                data,
+                ClassHierarchyError,
+                "Didn't find ${p.name.text} in lazyDeclaredGettersAndCalls "
+                "for ${c.name} in ${library.importUri}");
           }
         }
         if (members.isNotEmpty) {
-          throw "Still have ${members.map((m) => m.name.text)} left "
-              "for ${c.name} in ${library.importUri}";
+          return new Result<TestData>(
+              data,
+              ClassHierarchyError,
+              "Still have ${members.map((m) => m.name.text)} left "
+              "for ${c.name} in ${library.importUri}");
         }
       }
       if (info.lazyDeclaredSetters != null) {
@@ -1051,19 +1241,24 @@
           if (f.isStatic) continue;
           if (!f.hasImplicitSetter) continue;
           if (!members.remove(f)) {
-            throw "Didn't find $f in lazyDeclaredSetters for $c";
+            return new Result<TestData>(data, ClassHierarchyError,
+                "Didn't find $f in lazyDeclaredSetters for $c");
           }
         }
         for (Procedure p in c.procedures) {
           if (p.isStatic) continue;
           if (!p.isSetter) continue;
           if (!members.remove(p)) {
-            throw "Didn't find $p in lazyDeclaredSetters for $c";
+            return new Result<TestData>(data, ClassHierarchyError,
+                "Didn't find $p in lazyDeclaredSetters for $c");
           }
         }
         if (members.isNotEmpty) {
-          throw "Still have ${members.map((m) => m.name.text)} left "
-              "for ${c.name} in ${library.importUri}";
+          return new Result<TestData>(
+              data,
+              ClassHierarchyError,
+              "Still have ${members.map((m) => m.name.text)} left "
+              "for ${c.name} in ${library.importUri}");
         }
       }
       if (info.lazyImplementedGettersAndCalls != null) {
@@ -1107,12 +1302,16 @@
       } else {
         String extra = "";
         if (expected == null) extra = "Expect file did not exist.\n";
-        throw "${extra}Unexpected serialized representation. "
+        return new Result<TestData>(
+            data,
+            ClassHierarchyError,
+            "${extra}Unexpected serialized representation. "
             "Fix or update $uri to contain the below:\n\n"
-            "$actualClassHierarchy";
+            "$actualClassHierarchy");
       }
     }
   }
+  return null;
 }
 
 void checkErrorsAndWarnings(
@@ -1144,13 +1343,14 @@
   }
 }
 
-List<int> checkIncrementalSerialization(
+Result<List<int>> checkIncrementalSerialization(
     bool incrementalSerialization,
     Component component,
     IncrementalSerializer incrementalSerializer,
     YamlMap world) {
   if (incrementalSerialization == true) {
-    Component c = new Component(nameRoot: component.root);
+    Component c = new Component(nameRoot: component.root)
+      ..setMainMethodAndMode(null, false, component.mode);
     c.libraries.addAll(component.libraries);
     c.uriToSource.addAll(component.uriToSource);
     Map<String, Set<String>> originalContent = buildMapOfContent(c);
@@ -1159,18 +1359,26 @@
     incrementalSerializer.writePackagesToSinkAndTrimComponent(c, sink);
     int librariesAfter = c.libraries.length;
     if (librariesAfter > librariesBefore) {
-      throw "Incremental serialization added libraries!";
+      return new Result<List<int>>(null, IncrementalSerializationError,
+          "Incremental serialization added libraries!");
     }
     if (librariesBefore == librariesAfter &&
         world["incrementalSerializationDoesWork"] == true) {
-      throw "Incremental serialization didn't remove any libraries!";
+      return new Result<List<int>>(null, IncrementalSerializationError,
+          "Incremental serialization didn't remove any libraries!");
     }
     if (librariesAfter < librariesBefore && sink.builder.isEmpty) {
-      throw "Incremental serialization didn't output any bytes, "
-          "but did remove libraries";
+      return new Result<List<int>>(
+          null,
+          IncrementalSerializationError,
+          "Incremental serialization didn't output any bytes, "
+          "but did remove libraries");
     } else if (librariesAfter == librariesBefore && !sink.builder.isEmpty) {
-      throw "Incremental serialization did output bytes, "
-          "but didn't remove libraries";
+      return new Result<List<int>>(
+          null,
+          IncrementalSerializationError,
+          "Incremental serialization did output bytes, "
+          "but didn't remove libraries");
     }
     if (librariesAfter < librariesBefore) {
       // If we actually did incrementally serialize anything, check the output!
@@ -1191,8 +1399,11 @@
         for (String uriString in serializationShouldNotInclude) {
           Uri uri = Uri.parse(uriString);
           if (includedImportUris.contains(uri)) {
-            throw "Incremental serialization shouldn't include "
-                "$uriString but did.";
+            return new Result<List<int>>(
+                null,
+                IncrementalSerializationError,
+                "Incremental serialization shouldn't include "
+                "$uriString but did.");
           }
         }
       }
@@ -1207,18 +1418,20 @@
       for (String key in newKeys) {
         afterContent.remove(key);
       }
-      checkExpectedContentData(afterContent, originalContent);
+      Result result = checkExpectedContentData(afterContent, originalContent);
+      if (result != null) return result.copyWithOutput<List<int>>(null);
 
       // Check that the result is self-contained.
-      checkSelfContained(loadedComponent);
+      result = checkSelfContained(loadedComponent);
+      if (result != null) return result.copyWithOutput<List<int>>(null);
 
-      return bytes;
+      return new Result<List<int>>.pass(bytes);
     }
   }
-  return null;
+  return new Result<List<int>>.pass(null);
 }
 
-void checkSelfContained(Component component) {
+Result checkSelfContained(Component component) {
   Set<Library> got = new Set<Library>.from(component.libraries);
   for (Library lib in component.libraries) {
     for (LibraryDependency dependency in lib.dependencies) {
@@ -1229,11 +1442,15 @@
             .startsWith("root::dart:")) {
           continue;
         }
-        throw "Component didn't contain ${dependency.importedLibraryReference} "
-            "and it should have.";
+        return Result(
+            null,
+            IncrementalSerializationError,
+            "Component didn't contain ${dependency.importedLibraryReference} "
+            "and it should have.");
       }
     }
   }
+  return null;
 }
 
 void computeAllReachableLibrariesFor(Library lib, Set<Library> allLibraries) {
@@ -1254,33 +1471,46 @@
   }
 }
 
-void checkExpectedContent(YamlMap world, Component component) {
+Result checkExpectedContent(YamlMap world, Component component) {
   if (world["expectedContent"] != null) {
     Map<String, Set<String>> actualContent = buildMapOfContent(component);
     Map expectedContent = world["expectedContent"];
-    checkExpectedContentData(actualContent, expectedContent);
+    return checkExpectedContentData(actualContent, expectedContent);
   }
+  return null;
 }
 
-void checkExpectedContentData(
+Result checkExpectedContentData(
     Map<String, Set<String>> actualContent, Map expectedContent) {
-  doThrow() {
-    throw "Expected and actual content not the same.\n"
+  Result<TestData> createFailureResult() {
+    return new Result(
+        null,
+        ContentDataMismatch,
+        "Expected and actual content not the same.\n"
         "Expected $expectedContent.\n"
-        "Got $actualContent";
+        "Got $actualContent");
   }
 
-  if (actualContent.length != expectedContent.length) doThrow();
+  if (actualContent.length != expectedContent.length) {
+    return createFailureResult();
+  }
   Set<String> missingKeys = actualContent.keys.toSet()
     ..removeAll(expectedContent.keys);
-  if (missingKeys.isNotEmpty) doThrow();
+  if (missingKeys.isNotEmpty) {
+    return createFailureResult();
+  }
   for (String key in expectedContent.keys) {
     Set<String> expected = new Set<String>.from(expectedContent[key]);
     Set<String> actual = actualContent[key].toSet();
-    if (expected.length != actual.length) doThrow();
+    if (expected.length != actual.length) {
+      return createFailureResult();
+    }
     actual.removeAll(expected);
-    if (actual.isNotEmpty) doThrow();
+    if (actual.isNotEmpty) {
+      return createFailureResult();
+    }
   }
+  return null;
 }
 
 Map<String, Set<String>> buildMapOfContent(Component component) {
@@ -1301,8 +1531,8 @@
   return actualContent;
 }
 
-void checkNeededDillLibraries(
-    YamlMap world, Set<Library> neededDillLibraries, Uri base) {
+Result<TestData> checkNeededDillLibraries(
+    YamlMap world, TestData data, Set<Library> neededDillLibraries, Uri base) {
   if (world["neededDillLibraries"] != null) {
     List<Uri> actualContent = new List<Uri>();
     for (Library lib in neededDillLibraries) {
@@ -1315,20 +1545,30 @@
       expectedContent.add(base.resolve(entry));
     }
 
-    doThrow() {
-      throw "Expected and actual content not the same.\n"
+    Result<TestData> createFailureResult() {
+      return new Result<TestData>(
+          data,
+          NeededDillMismatch,
+          "Expected and actual content not the same.\n"
           "Expected $expectedContent.\n"
-          "Got $actualContent";
+          "Got $actualContent");
     }
 
-    if (actualContent.length != expectedContent.length) doThrow();
+    if (actualContent.length != expectedContent.length) {
+      return createFailureResult();
+    }
     Set<Uri> notInExpected =
         actualContent.toSet().difference(expectedContent.toSet());
     Set<Uri> notInActual =
         expectedContent.toSet().difference(actualContent.toSet());
-    if (notInExpected.isNotEmpty) doThrow();
-    if (notInActual.isNotEmpty) doThrow();
+    if (notInExpected.isNotEmpty) {
+      return createFailureResult();
+    }
+    if (notInActual.isNotEmpty) {
+      return createFailureResult();
+    }
   }
+  return null;
 }
 
 String nodeToString(TreeNode node) {
@@ -1337,16 +1577,18 @@
   return '$buffer';
 }
 
-String componentToStringSdkFiltered(Component node) {
+String componentToStringSdkFiltered(Component component) {
   Component c = new Component();
   List<Uri> dartUris = new List<Uri>();
-  for (Library lib in node.libraries) {
+  for (Library lib in component.libraries) {
     if (lib.importUri.scheme == "dart") {
       dartUris.add(lib.importUri);
     } else {
       c.libraries.add(lib);
     }
   }
+  c.setMainMethodAndMode(component.mainMethodName, true, component.mode);
+  c.problemsAsJson = component.problemsAsJson;
 
   StringBuffer s = new StringBuffer();
   s.write(componentToString(c));
@@ -1386,22 +1628,28 @@
   return result;
 }
 
-void performErrorAndWarningCheck(
+Result<TestData> performErrorAndWarningCheck(
     YamlMap world,
+    TestData data,
     bool gotError,
     Set<String> formattedErrors,
     bool gotWarning,
     Set<String> formattedWarnings) {
   if (world["errors"] == true && !gotError) {
-    throw "Expected error, but didn't get any.";
+    return new Result<TestData>(
+        data, MissingErrors, "Expected error, but didn't get any.");
   } else if (world["errors"] != true && gotError) {
-    throw "Got unexpected error(s): $formattedErrors.";
+    return new Result<TestData>(
+        data, UnexpectedErrors, "Got unexpected error(s): $formattedErrors.");
   }
   if (world["warnings"] == true && !gotWarning) {
-    throw "Expected warning, but didn't get any.";
+    return new Result<TestData>(
+        data, MissingWarnings, "Expected warning, but didn't get any.");
   } else if (world["warnings"] != true && gotWarning) {
-    throw "Got unexpected warnings(s): $formattedWarnings.";
+    return new Result<TestData>(data, UnexpectedWarnings,
+        "Got unexpected warnings(s): $formattedWarnings.");
   }
+  return null;
 }
 
 void checkIsEqual(List<int> a, List<int> b) {
@@ -1663,10 +1911,13 @@
     Name fieldName = new Name("unique_SimulateTransformer");
     Field field = new Field(fieldName,
         isFinal: true,
-        reference: lib.reference.canonicalName
+        getterReference: lib.reference.canonicalName
             ?.getChildFromFieldWithName(fieldName)
+            ?.reference,
+        setterReference: lib.reference.canonicalName
+            ?.getChildFromFieldSetterWithName(fieldName)
             ?.reference);
-    lib.addMember(field);
+    lib.addField(field);
     for (Class c in lib.classes) {
       if (c.fields
           .where((f) => f.name.text == "unique_SimulateTransformer")
@@ -1675,10 +1926,13 @@
       fieldName = new Name("unique_SimulateTransformer");
       field = new Field(fieldName,
           isFinal: true,
-          reference: c.reference.canonicalName
+          getterReference: c.reference.canonicalName
               ?.getChildFromFieldWithName(fieldName)
+              ?.reference,
+          setterReference: c.reference.canonicalName
+              ?.getChildFromFieldSetterWithName(fieldName)
               ?.reference);
-      c.addMember(field);
+      c.addField(field);
     }
   }
 }
diff --git a/pkg/front_end/test/incremental_load_from_invalid_dill_test.dart b/pkg/front_end/test/incremental_load_from_invalid_dill_test.dart
index 62d6624..1f8b19a 100644
--- a/pkg/front_end/test/incremental_load_from_invalid_dill_test.dart
+++ b/pkg/front_end/test/incremental_load_from_invalid_dill_test.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:async' show Future;
-
 import 'dart:io' show File;
 
 import 'package:_fe_analyzer_shared/src/messages/diagnostic_message.dart'
@@ -15,9 +13,11 @@
 
 import 'package:front_end/src/api_prototype/compiler_options.dart'
     show CompilerOptions;
+import 'package:front_end/src/api_prototype/experimental_flags.dart';
 
 import "package:front_end/src/api_prototype/memory_file_system.dart"
     show MemoryFileSystem;
+import 'package:front_end/src/api_unstable/bazel_worker.dart';
 
 import 'package:front_end/src/base/processed_options.dart'
     show ProcessedOptions;
@@ -242,18 +242,36 @@
     // Should be ok, but we shouldn't actually initialize from dill.
     List<int> mixedPart1;
     {
+      // Create a component that is compiled without NNBD.
+      Map<ExperimentalFlag, bool> prevTesting =
+          options.defaultExperimentFlagsForTesting;
+      options.defaultExperimentFlagsForTesting = {
+        ExperimentalFlag.nonNullable: false
+      };
+      NnbdMode prevNnbd = options.nnbdMode;
+      options.nnbdMode = NnbdMode.Weak;
       compiler = new IncrementalCompiler(
           new CompilerContext(
               new ProcessedOptions(options: options, inputs: [helper2File])),
           null);
       Component c = await compiler.computeDelta();
       c.setMainMethodAndMode(
-          null, false, NonNullableByDefaultCompiledMode.Disabled);
+          null, false, NonNullableByDefaultCompiledMode.Weak);
       mixedPart1 = serializeComponent(c);
+      options.defaultExperimentFlagsForTesting = prevTesting;
+      options.nnbdMode = prevNnbd;
     }
 
     List<int> mixedPart2;
     {
+      // Create a component that is compiled with strong NNBD.
+      Map<ExperimentalFlag, bool> prevTesting =
+          options.defaultExperimentFlagsForTesting;
+      options.defaultExperimentFlagsForTesting = {
+        ExperimentalFlag.nonNullable: true
+      };
+      NnbdMode prevNnbd = options.nnbdMode;
+      options.nnbdMode = NnbdMode.Strong;
       compiler = new IncrementalCompiler(
           new CompilerContext(
               new ProcessedOptions(options: options, inputs: [helperFile])),
@@ -262,8 +280,13 @@
       c.setMainMethodAndMode(
           null, false, NonNullableByDefaultCompiledMode.Strong);
       mixedPart2 = serializeComponent(c);
+      options.defaultExperimentFlagsForTesting = prevTesting;
+      options.nnbdMode = prevNnbd;
     }
 
+    // Now mix the two components together and try to initialize from them.
+    // We expect the compilation to be OK but that the dill is not actually
+    // used to initialize from (as it's invalid because of the mixed mode).
     List<int> mixed = [];
     mixed.addAll(mixedPart1);
     mixed.addAll(mixedPart2);
diff --git a/pkg/front_end/test/language_versioning/language_versioning_test.dart b/pkg/front_end/test/language_versioning/language_versioning_test.dart
index 4146239..b44c90d 100644
--- a/pkg/front_end/test/language_versioning/language_versioning_test.dart
+++ b/pkg/front_end/test/language_versioning/language_versioning_test.dart
@@ -87,9 +87,11 @@
     for (Library library in component.libraries) {
       if (library.importUri.scheme == "dart") continue;
       Version lvFile =
-          await lv.languageVersionForUri(library.fileUri, stashedOptions);
+          (await lv.languageVersionForUri(library.fileUri, stashedOptions))
+              .version;
       Version lvImportUri =
-          await lv.languageVersionForUri(library.importUri, stashedOptions);
+          (await lv.languageVersionForUri(library.importUri, stashedOptions))
+              .version;
       if ((lvFile != lvImportUri || lvFile != library.languageVersion)) {
         throw """
 Language version disagreement:
diff --git a/pkg/front_end/test/lint_suite.dart b/pkg/front_end/test/lint_suite.dart
index 2831434..938c1bf 100644
--- a/pkg/front_end/test/lint_suite.dart
+++ b/pkg/front_end/test/lint_suite.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:async' show Future;
-
 import 'dart:io' show Directory, File, FileSystemEntity;
 
 import 'dart:typed_data' show Uint8List;
diff --git a/pkg/front_end/test/lint_test.status b/pkg/front_end/test/lint_test.status
index cc1e0e3..10f7b68 100644
--- a/pkg/front_end/test/lint_test.status
+++ b/pkg/front_end/test/lint_test.status
@@ -8,6 +8,7 @@
 _fe_analyzer_shared/lib/src/scanner/string_scanner/ImportsTwice: Fail
 _fe_analyzer_shared/lib/src/scanner/token_impl/ImportsTwice: Fail
 _fe_analyzer_shared/lib/src/scanner/utf8_bytes_scanner/ImportsTwice: Fail
+front_end/lib/src/api_prototype/compiler_options/ImportsTwice: Fail
 front_end/lib/src/api_prototype/compiler_options/Exports: Fail
 front_end/lib/src/api_prototype/constant_evaluator/Exports: Fail
 front_end/lib/src/api_prototype/front_end/Exports: Fail
diff --git a/pkg/front_end/test/member_covariance_test.dart b/pkg/front_end/test/member_covariance_test.dart
new file mode 100644
index 0000000..6f541df
--- /dev/null
+++ b/pkg/front_end/test/member_covariance_test.dart
@@ -0,0 +1,214 @@
+// Copyright (c) 2020, 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:expect/expect.dart';
+import 'package:front_end/src/fasta/kernel/kernel_ast_api.dart';
+import 'package:front_end/src/fasta/kernel/member_covariance.dart';
+
+main() {
+  void checkEquals(Covariance a, Covariance b) {
+    Expect.equals(a, b);
+    Expect.equals(a.hashCode, b.hashCode);
+  }
+
+  checkEquals(const Covariance.empty(), new Covariance.empty());
+
+  Expect.isTrue(const Covariance.empty().isEmpty);
+  Expect.isTrue(new Covariance.empty().isEmpty);
+  Expect.isTrue(new Covariance.internal(null, null, null).isEmpty);
+
+  checkEquals(
+      const Covariance.empty(), new Covariance.internal(null, null, null));
+
+  Expect.throws(() => new Covariance.internal([], null, null));
+  Expect.throws(() => new Covariance.internal([0], null, null));
+
+  checkEquals(
+      new Covariance.internal([Covariance.GenericCovariantImpl], null, null),
+      new Covariance.internal(
+          [Covariance.GenericCovariantImpl, 0], null, null));
+
+  checkEquals(new Covariance.internal([Covariance.Covariant], null, null),
+      new Covariance.internal([Covariance.Covariant, 0], null, null));
+
+  checkEquals(new Covariance.internal([0, Covariance.Covariant], null, null),
+      new Covariance.internal([0, Covariance.Covariant, 0], null, null));
+
+  Expect.throws(() => new Covariance.internal(null, {}, null));
+  Expect.throws(() => new Covariance.internal(null, {'a': 0}, null));
+
+  checkEquals(new Covariance.internal(null, {'a': Covariance.Covariant}, null),
+      new Covariance.internal(null, {'a': Covariance.Covariant}, null));
+
+  Expect.throws(() => new Covariance.internal(null, null, []));
+
+  Expect.throws(() => new Covariance.internal(null, null, [false]));
+
+  checkEquals(new Covariance.internal(null, null, [true]),
+      new Covariance.internal(null, null, [true, false]));
+
+  Covariance covariance = new Covariance.internal([
+    Covariance.Covariant,
+    Covariance.GenericCovariantImpl,
+    0,
+    Covariance.Covariant | Covariance.GenericCovariantImpl
+  ], {
+    'a': Covariance.Covariant,
+    'b': Covariance.GenericCovariantImpl,
+    'd': Covariance.Covariant | Covariance.GenericCovariantImpl
+  }, [
+    false,
+    true
+  ]);
+
+  Expect.equals(Covariance.Covariant, covariance.getPositionalVariance(0));
+  Expect.equals(
+      Covariance.GenericCovariantImpl, covariance.getPositionalVariance(1));
+  Expect.equals(0, covariance.getPositionalVariance(2));
+  Expect.equals(Covariance.Covariant | Covariance.GenericCovariantImpl,
+      covariance.getPositionalVariance(3));
+  Expect.equals(0, covariance.getPositionalVariance(4));
+
+  Expect.equals(Covariance.Covariant, covariance.getNamedVariance('a'));
+  Expect.equals(
+      Covariance.GenericCovariantImpl, covariance.getNamedVariance('b'));
+  Expect.equals(0, covariance.getNamedVariance('c'));
+  Expect.equals(Covariance.Covariant | Covariance.GenericCovariantImpl,
+      covariance.getNamedVariance('d'));
+  Expect.equals(0, covariance.getNamedVariance('e'));
+
+  Expect.isFalse(covariance.isTypeParameterGenericCovariantImpl(0));
+  Expect.isTrue(covariance.isTypeParameterGenericCovariantImpl(1));
+  Expect.isFalse(covariance.isTypeParameterGenericCovariantImpl(0));
+
+  Expect.stringEquals(
+      'Covariance('
+      '0:Covariant,1:GenericCovariantImpl,3:GenericCovariantImpl+Covariant,'
+      'a:Covariant,b:GenericCovariantImpl,d:GenericCovariantImpl+Covariant,'
+      'types:1)',
+      covariance.toString());
+
+  Procedure noParameterProcedure =
+      new Procedure(null, ProcedureKind.Method, new FunctionNode(null));
+  Covariance noParameterProcedureCovariance =
+      new Covariance.fromMember(noParameterProcedure, forSetter: false);
+  Expect.isTrue(noParameterProcedureCovariance.isEmpty);
+
+  covariance.applyCovariance(noParameterProcedure);
+  noParameterProcedureCovariance =
+      new Covariance.fromMember(noParameterProcedure, forSetter: false);
+  Expect.isTrue(noParameterProcedureCovariance.isEmpty);
+
+  Procedure oneParameterProcedure = new Procedure(
+      null,
+      ProcedureKind.Method,
+      new FunctionNode(null,
+          positionalParameters: [new VariableDeclaration(null)]));
+  Covariance oneParameterProcedureCovariance =
+      new Covariance.fromMember(oneParameterProcedure, forSetter: false);
+  Expect.isTrue(oneParameterProcedureCovariance.isEmpty);
+
+  covariance.applyCovariance(oneParameterProcedure);
+  oneParameterProcedureCovariance =
+      new Covariance.fromMember(oneParameterProcedure, forSetter: false);
+  Expect.isFalse(oneParameterProcedureCovariance.isEmpty);
+  Expect.equals(new Covariance.internal([Covariance.Covariant], null, null),
+      oneParameterProcedureCovariance);
+
+  Procedure positionalParametersProcedure = new Procedure(
+      null,
+      ProcedureKind.Method,
+      new FunctionNode(null, positionalParameters: [
+        new VariableDeclaration(null),
+        new VariableDeclaration(null),
+        new VariableDeclaration(null),
+        new VariableDeclaration(null),
+        new VariableDeclaration(null)
+      ]));
+  Covariance positionalParametersProcedureCovariance =
+      new Covariance.fromMember(positionalParametersProcedure,
+          forSetter: false);
+  Expect.isTrue(positionalParametersProcedureCovariance.isEmpty);
+
+  covariance.applyCovariance(positionalParametersProcedure);
+  positionalParametersProcedureCovariance = new Covariance.fromMember(
+      positionalParametersProcedure,
+      forSetter: false);
+  Expect.isFalse(positionalParametersProcedureCovariance.isEmpty);
+  checkEquals(
+      new Covariance.internal([
+        Covariance.Covariant,
+        Covariance.GenericCovariantImpl,
+        0,
+        Covariance.Covariant | Covariance.GenericCovariantImpl
+      ], null, null),
+      positionalParametersProcedureCovariance);
+
+  Procedure namedParametersProcedure = new Procedure(
+      null,
+      ProcedureKind.Method,
+      new FunctionNode(null, namedParameters: [
+        new VariableDeclaration('a'),
+        new VariableDeclaration('b'),
+        new VariableDeclaration('c'),
+        new VariableDeclaration('d'),
+        new VariableDeclaration('e')
+      ]));
+  Covariance namedParametersProcedureCovariance =
+      new Covariance.fromMember(namedParametersProcedure, forSetter: false);
+  Expect.isTrue(namedParametersProcedureCovariance.isEmpty);
+
+  covariance.applyCovariance(namedParametersProcedure);
+  namedParametersProcedureCovariance =
+      new Covariance.fromMember(namedParametersProcedure, forSetter: false);
+  Expect.isFalse(namedParametersProcedureCovariance.isEmpty);
+  checkEquals(
+      new Covariance.internal(
+          null,
+          {
+            'a': Covariance.Covariant,
+            'b': Covariance.GenericCovariantImpl,
+            'd': Covariance.Covariant | Covariance.GenericCovariantImpl
+          },
+          null),
+      namedParametersProcedureCovariance);
+
+  Procedure typeParametersProcedure = new Procedure(
+      null,
+      ProcedureKind.Method,
+      new FunctionNode(null, typeParameters: [
+        new TypeParameter(null),
+        new TypeParameter(null),
+        new TypeParameter(null),
+      ]));
+  Covariance typeParametersProcedureCovariance =
+      new Covariance.fromMember(typeParametersProcedure, forSetter: false);
+  Expect.isTrue(typeParametersProcedureCovariance.isEmpty);
+
+  covariance.applyCovariance(typeParametersProcedure);
+  typeParametersProcedureCovariance =
+      new Covariance.fromMember(typeParametersProcedure, forSetter: false);
+  Expect.isFalse(typeParametersProcedureCovariance.isEmpty);
+  checkEquals(new Covariance.internal(null, null, [false, true]),
+      typeParametersProcedureCovariance);
+
+  Covariance merged =
+      const Covariance.empty().merge(positionalParametersProcedureCovariance);
+  checkEquals(positionalParametersProcedureCovariance, merged);
+  merged = merged.merge(namedParametersProcedureCovariance);
+  checkEquals(
+      new Covariance.internal([
+        Covariance.Covariant,
+        Covariance.GenericCovariantImpl,
+        0,
+        Covariance.GenericCovariantImpl | Covariance.Covariant
+      ], {
+        'a': Covariance.Covariant,
+        'b': Covariance.GenericCovariantImpl,
+        'd': Covariance.Covariant | Covariance.GenericCovariantImpl
+      }, null),
+      merged);
+  merged = merged.merge(typeParametersProcedureCovariance);
+  checkEquals(covariance, merged);
+}
diff --git a/pkg/front_end/test/messages_json_test.dart b/pkg/front_end/test/messages_json_test.dart
index f2a9cf2..e0f5620 100644
--- a/pkg/front_end/test/messages_json_test.dart
+++ b/pkg/front_end/test/messages_json_test.dart
@@ -8,27 +8,36 @@
 import 'package:_fe_analyzer_shared/src/messages/severity.dart' show Severity;
 
 import 'package:front_end/src/fasta/fasta_codes.dart'
-    show DiagnosticMessageFromJson, FormattedMessage, LocatedMessage;
+    show
+        Code,
+        DiagnosticMessageFromJson,
+        FormattedMessage,
+        LocatedMessage,
+        Message;
 
 /// Test that turning a message into json and back again retains the wanted
 /// information.
 main() {
   for (int i = 0; i < Severity.values.length; i++) {
     Severity severity = Severity.values[i];
+    Code code = new Code("MyCodeName", null);
+    Message message = new Message(code);
     LocatedMessage locatedMessage1 =
-        new LocatedMessage(Uri.parse("what:ever/fun_1.dart"), 117, 2, null);
+        new LocatedMessage(Uri.parse("what:ever/fun_1.dart"), 117, 2, message);
     FormattedMessage formattedMessage2 = new FormattedMessage(
         null, "Formatted string #2", 13, 2, Severity.error, []);
     FormattedMessage formattedMessage3 = new FormattedMessage(
         null, "Formatted string #3", 313, 32, Severity.error, []);
 
     FormattedMessage formattedMessage1 = new FormattedMessage(
-        locatedMessage1,
-        "Formatted string",
-        42,
-        86,
-        severity,
-        [formattedMessage2, formattedMessage3]);
+        locatedMessage1, "Formatted string", 42, 86, severity, [
+      formattedMessage2,
+      formattedMessage3
+    ], involvedFiles: [
+      Uri.parse("what:ever/foo.dart"),
+      Uri.parse("what:ever/bar.dart")
+    ]);
+    expect(formattedMessage1.codeName, "MyCodeName");
 
     DiagnosticMessageFromJson diagnosticMessageFromJson =
         new DiagnosticMessageFromJson.fromJson(
@@ -62,6 +71,19 @@
 
   expect(a.severity, b.severity);
   expect(getMessageUri(a), getMessageUri(b));
+
+  List<Uri> uriList1 = a.involvedFiles?.toList();
+  List<Uri> uriList2 = b.involvedFiles?.toList();
+  expect(uriList1?.length, uriList2?.length);
+  if (uriList1 != null) {
+    for (int i = 0; i < uriList1.length; i++) {
+      expect(uriList1[i], uriList2[i]);
+    }
+  }
+
+  String string1 = a.codeName;
+  String string2 = b.codeName;
+  expect(string1, string2);
 }
 
 void expect(Object actual, Object expect) {
diff --git a/pkg/front_end/test/parser_all_suite.dart b/pkg/front_end/test/parser_all_suite.dart
index 543dbf9..9b60aae 100644
--- a/pkg/front_end/test/parser_all_suite.dart
+++ b/pkg/front_end/test/parser_all_suite.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:async' show Future;
-
 import 'package:testing/testing.dart' show Chain, ChainContext, runMe;
 
 import 'parser_suite.dart';
diff --git a/pkg/front_end/test/parser_suite.dart b/pkg/front_end/test/parser_suite.dart
index 79145fb..da464ac 100644
--- a/pkg/front_end/test/parser_suite.dart
+++ b/pkg/front_end/test/parser_suite.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:async' show Future;
-
 import 'dart:convert' show jsonDecode;
 
 import 'dart:io' show File;
@@ -53,6 +51,8 @@
 
 import 'parser_test_parser.dart' show TestParser;
 
+import 'testing_utils.dart' show checkEnvironment;
+
 const String EXPECTATIONS = '''
 [
   {
@@ -71,8 +71,18 @@
 
 Future<Context> createContext(
     Chain suite, Map<String, String> environment) async {
-  return new Context(suite.name, environment["updateExpectations"] == "true",
-      environment["trace"] == "true", environment["annotateLines"] == "true");
+  const Set<String> knownEnvironmentKeys = {
+    "updateExpectations",
+    "trace",
+    "annotateLines"
+  };
+  checkEnvironment(environment, knownEnvironmentKeys);
+
+  bool updateExpectations = environment["updateExpectations"] == "true";
+  bool trace = environment["trace"] == "true";
+  bool annotateLines = environment["annotateLines"] == "true";
+
+  return new Context(suite.name, updateExpectations, trace, annotateLines);
 }
 
 ScannerConfiguration scannerConfiguration = new ScannerConfiguration(
diff --git a/pkg/front_end/test/patching/patching_test.dart b/pkg/front_end/test/patching/patching_test.dart
index 81210eb..9e5e116 100644
--- a/pkg/front_end/test/patching/patching_test.dart
+++ b/pkg/front_end/test/patching/patching_test.dart
@@ -29,6 +29,7 @@
         new TestConfigWithLanguageVersion(
             cfeMarker, 'cfe with libraries specification',
             librariesSpecificationUri: createUriForFileName('libraries.json'),
+            experimentalFlags: {ExperimentalFlag.nonNullable: false},
             allowedExperimentalFlags: const AllowedExperimentalFlags()),
         new TestConfigWithLanguageVersion(cfeWithNnbdMarker,
             'cfe with libraries specification and non-nullable',
@@ -53,7 +54,7 @@
       AllowedExperimentalFlags allowedExperimentalFlags})
       : super(marker, name,
             librariesSpecificationUri: librariesSpecificationUri,
-            experimentalFlags: experimentalFlags,
+            explicitExperimentalFlags: experimentalFlags,
             allowedExperimentalFlags: allowedExperimentalFlags);
 
   @override
diff --git a/pkg/front_end/test/predicates/predicate_test.dart b/pkg/front_end/test/predicates/predicate_test.dart
index 8320f85..89ddb9f 100644
--- a/pkg/front_end/test/predicates/predicate_test.dart
+++ b/pkg/front_end/test/predicates/predicate_test.dart
@@ -22,7 +22,9 @@
       onFailure: onFailure,
       runTest: runTestFor(const PredicateDataComputer(), [
         const TestConfig(cfeMarker, 'cfe',
-            experimentalFlags: const {ExperimentalFlag.nonNullable: true},
+            explicitExperimentalFlags: const {
+              ExperimentalFlag.nonNullable: true
+            },
             targetFlags: const TargetFlags(forceLateLoweringForTesting: true))
       ]));
 }
diff --git a/pkg/front_end/test/read_dill_from_binary_md_test.dart b/pkg/front_end/test/read_dill_from_binary_md_test.dart
index 4907f4e..2331db5 100644
--- a/pkg/front_end/test/read_dill_from_binary_md_test.dart
+++ b/pkg/front_end/test/read_dill_from_binary_md_test.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:async' show Future;
-
 import 'dart:io' show File, Platform;
 
 import 'package:kernel/target/targets.dart' show NoneTarget, TargetFlags;
diff --git a/pkg/front_end/test/spell_checking_list_code.txt b/pkg/front_end/test/spell_checking_list_code.txt
index 18581dd4..5fd534d 100644
--- a/pkg/front_end/test/spell_checking_list_code.txt
+++ b/pkg/front_end/test/spell_checking_list_code.txt
@@ -20,6 +20,7 @@
 acon
 acov
 across
+adi
 affecting
 afterwards
 agree
@@ -54,6 +55,7 @@
 artificial
 asgerf
 askesc
+aspect
 aspx
 assigning
 assigns
@@ -91,6 +93,7 @@
 baz
 bazel
 bb
+became
 beforehand
 behave
 bellow
@@ -124,6 +127,7 @@
 boundness
 boxed
 breadcrumbs
+brevity
 brianwilkerson
 bs
 bsd
@@ -220,6 +224,7 @@
 config
 configs
 configured
+connectivity
 consideration
 constness
 consult
@@ -238,6 +243,7 @@
 corrections
 cosmetic
 counters
+covariances
 cr
 creator
 criterion
@@ -273,6 +279,7 @@
 decl
 decoupled
 decreases
+deduplication
 deemed
 deepest
 deeply
@@ -300,6 +307,7 @@
 destroy
 deterministic
 dev
+device
 diff
 diffs
 digest
@@ -508,10 +516,12 @@
 imitate
 immutability
 impl
+impl+
 implementers
 imply
 implying
 importantly
+imprecise
 inapplicable
 inc
 incomparable
@@ -586,6 +596,7 @@
 lang
 largest
 lattice
+launcher
 layer
 layout
 lc
@@ -605,6 +616,7 @@
 linearized
 linebreak
 linter
+linux
 lives
 ll
 llub
@@ -627,11 +639,13 @@
 ly
 lz
 m
+macos
 maintaining
 mangled
 manipulation
 markdown
 masking
+masks
 master
 mb
 mc
@@ -787,6 +801,7 @@
 particularly
 patchup
 path
+patterns
 paulberry
 pay
 payload
@@ -800,6 +815,7 @@
 pi
 picking
 pkg
+player
 plugin
 pm
 pn
@@ -1094,6 +1110,7 @@
 tags
 tailor
 taking
+talk
 talks
 tb
 team
@@ -1197,6 +1214,7 @@
 unification
 unifier
 unify
+uninstantiable
 unions
 uniqueness
 unittest
@@ -1245,6 +1263,7 @@
 verbosity
 versa
 vice
+video
 violated
 visit*
 visitors
@@ -1255,6 +1274,7 @@
 vtab
 w
 waste
+wasted
 watch
 watcher
 wb
diff --git a/pkg/front_end/test/spell_checking_list_common.txt b/pkg/front_end/test/spell_checking_list_common.txt
index f3a1c47..5255e56 100644
--- a/pkg/front_end/test/spell_checking_list_common.txt
+++ b/pkg/front_end/test/spell_checking_list_common.txt
@@ -434,6 +434,7 @@
 checking
 checkpoints
 checks
+chian
 child
 children
 choice
@@ -863,6 +864,7 @@
 disable
 disabled
 disabling
+disallowed
 disambiguate
 disambiguated
 disappear
@@ -1861,6 +1863,7 @@
 misleading
 mismatch
 mismatches
+mismatching
 missing
 misused
 mix
@@ -2305,6 +2308,7 @@
 promotion
 promotions
 propagate
+propagated
 propagates
 propagating
 propagation
@@ -2428,6 +2432,7 @@
 refinement
 refinements
 reflecting
+reflects
 regardless
 region
 regions
@@ -2910,6 +2915,7 @@
 suppress
 suppressed
 sure
+surface
 surrogate
 surrogates
 surrounding
diff --git a/pkg/front_end/test/spell_checking_list_messages.txt b/pkg/front_end/test/spell_checking_list_messages.txt
index a0c8cae..324b76d 100644
--- a/pkg/front_end/test/spell_checking_list_messages.txt
+++ b/pkg/front_end/test/spell_checking_list_messages.txt
@@ -62,5 +62,6 @@
 this.x
 type3.#name
 u
+unsound
 v
 x
diff --git a/pkg/front_end/test/spell_checking_list_tests.txt b/pkg/front_end/test/spell_checking_list_tests.txt
index 164bb07..d50f907 100644
--- a/pkg/front_end/test/spell_checking_list_tests.txt
+++ b/pkg/front_end/test/spell_checking_list_tests.txt
@@ -45,6 +45,7 @@
 backed
 background
 bail
+bailing
 bailout
 bash
 bat
@@ -309,6 +310,7 @@
 gulp
 gunk
 hackish
+hardly
 helper2
 hest
 heuristics
@@ -325,6 +327,7 @@
 hurray
 i'm
 ia
+ideal
 idle
 ikg
 illustrate
@@ -545,6 +548,7 @@
 reducer
 referring
 reflectee
+refusing
 regenerate
 regressions
 reify
diff --git a/pkg/front_end/test/spelling_test_base.dart b/pkg/front_end/test/spelling_test_base.dart
index 9bafa38..23d64a5 100644
--- a/pkg/front_end/test/spelling_test_base.dart
+++ b/pkg/front_end/test/spelling_test_base.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:async' show Future;
-
 import 'dart:io' show File, Platform;
 
 import 'dart:typed_data' show Uint8List;
diff --git a/pkg/front_end/test/spelling_test_external_targets.dart b/pkg/front_end/test/spelling_test_external_targets.dart
index 0330b22..79ff96c 100644
--- a/pkg/front_end/test/spelling_test_external_targets.dart
+++ b/pkg/front_end/test/spelling_test_external_targets.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:async' show Future;
-
 import 'dart:io' show Directory, File, FileSystemEntity;
 
 import 'package:testing/testing.dart'
diff --git a/pkg/front_end/test/spelling_test_not_src_suite.dart b/pkg/front_end/test/spelling_test_not_src_suite.dart
index 3259c88..a6205de 100644
--- a/pkg/front_end/test/spelling_test_not_src_suite.dart
+++ b/pkg/front_end/test/spelling_test_not_src_suite.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:async' show Future;
-
 import 'package:testing/testing.dart' show Chain, runMe;
 
 import 'spelling_test_base.dart';
diff --git a/pkg/front_end/test/spelling_test_src_suite.dart b/pkg/front_end/test/spelling_test_src_suite.dart
index afea1e0..dfd1117 100644
--- a/pkg/front_end/test/spelling_test_src_suite.dart
+++ b/pkg/front_end/test/spelling_test_src_suite.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:async' show Future;
-
 import 'package:testing/testing.dart' show Chain, runMe;
 
 import 'spelling_test_base.dart';
diff --git a/pkg/front_end/test/src/base/processed_options_test.dart b/pkg/front_end/test/src/base/processed_options_test.dart
index 5c8d0bf..b004fb1 100644
--- a/pkg/front_end/test/src/base/processed_options_test.dart
+++ b/pkg/front_end/test/src/base/processed_options_test.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:async';
-
 import 'package:front_end/src/api_prototype/compiler_options.dart';
 import 'package:front_end/src/api_prototype/memory_file_system.dart';
 import 'package:front_end/src/base/processed_options.dart';
@@ -12,7 +10,12 @@
 import 'package:front_end/src/fasta/fasta_codes.dart';
 import 'package:kernel/binary/ast_to_binary.dart' show BinaryPrinter;
 import 'package:kernel/kernel.dart'
-    show CanonicalName, Library, Component, loadComponentFromBytes;
+    show
+        CanonicalName,
+        Library,
+        Component,
+        loadComponentFromBytes,
+        NonNullableByDefaultCompiledMode;
 import 'package:package_config/package_config.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -34,7 +37,8 @@
   Component _mockOutline;
 
   Component get mockSummary => _mockOutline ??= new Component(
-      libraries: [new Library(Uri.parse('org-dartlang-test:///a/b.dart'))]);
+      libraries: [new Library(Uri.parse('org-dartlang-test:///a/b.dart'))])
+    ..setMainMethodAndMode(null, false, NonNullableByDefaultCompiledMode.Weak);
 
   test_compileSdk_false() {
     for (var value in [false, true]) {
diff --git a/pkg/front_end/test/standard_file_system_test.dart b/pkg/front_end/test/standard_file_system_test.dart
index 5644c98..5f5fd02 100644
--- a/pkg/front_end/test/standard_file_system_test.dart
+++ b/pkg/front_end/test/standard_file_system_test.dart
@@ -5,7 +5,6 @@
 
 library front_end.test.standard_file_system_test;
 
-import 'dart:async';
 import 'dart:convert';
 import 'dart:io' as io;
 import 'dart:math' show Random;
diff --git a/pkg/front_end/test/static_types/static_type_test.dart b/pkg/front_end/test/static_types/static_type_test.dart
index 0bed0cc..cad8d52 100644
--- a/pkg/front_end/test/static_types/static_type_test.dart
+++ b/pkg/front_end/test/static_types/static_type_test.dart
@@ -20,7 +20,7 @@
       createUriForFileName: createUriForFileName,
       onFailure: onFailure,
       runTest: runTestFor(const StaticTypeDataComputer(),
-          [defaultCfeConfig, cfeNonNullableConfig]),
+          [cfeNoNonNullableConfig, cfeNonNullableConfig]),
       skipMap: {
         defaultCfeConfig.marker: [
           // NNBD-only tests.
diff --git a/pkg/front_end/test/test_generator_test.dart b/pkg/front_end/test/test_generator_test.dart
index 9ce654d..a701999 100644
--- a/pkg/front_end/test/test_generator_test.dart
+++ b/pkg/front_end/test/test_generator_test.dart
@@ -223,6 +223,6 @@
   Generator(this.typeParameters, this.beforePlug, this.afterPlug);
 
   String generate(String plug) {
-    return "${beforePlug}${plug}${afterPlug}";
+    return "// @dart = 2.9\n${beforePlug}${plug}${afterPlug}";
   }
 }
diff --git a/pkg/front_end/test/text_representation/data/types_opt_out.dart b/pkg/front_end/test/text_representation/data/types_opt_out.dart
index b302015..169f717 100644
--- a/pkg/front_end/test/text_representation/data/types_opt_out.dart
+++ b/pkg/front_end/test/text_representation/data/types_opt_out.dart
@@ -24,7 +24,7 @@
     String /*normal|limited.String**/ /*verbose.dart.core::String**/ o) {}
 voidType(void /*void*/ o) {}
 dynamicType(dynamic /*dynamic*/ o) {}
-neverType(Never /*normal|limited.Null?*/ /*verbose.dart.core::Null?*/ o) {}
+neverType(Never /*normal|limited.Null*/ /*verbose.Null*/ o) {}
 objectType(
     Object /*normal|limited.Object**/ /*verbose.dart.core::Object**/ o) {}
 genericType1(
diff --git a/pkg/front_end/test/text_representation/internal_ast_text_representation_test.dart b/pkg/front_end/test/text_representation/internal_ast_text_representation_test.dart
index c577233..17e9ba5 100644
--- a/pkg/front_end/test/text_representation/internal_ast_text_representation_test.dart
+++ b/pkg/front_end/test/text_representation/internal_ast_text_representation_test.dart
@@ -316,7 +316,7 @@
   library.addClass(cls);
   Procedure factoryConstructor = new Procedure(
       new Name(''), ProcedureKind.Factory, new FunctionNode(null));
-  cls.addMember(factoryConstructor);
+  cls.addProcedure(factoryConstructor);
 
   testExpression(
       new FactoryConstructorInvocationJudgment(
diff --git a/pkg/front_end/test/text_representation/text_representation_test.dart b/pkg/front_end/test/text_representation/text_representation_test.dart
index daff068..8d57260 100644
--- a/pkg/front_end/test/text_representation/text_representation_test.dart
+++ b/pkg/front_end/test/text_representation/text_representation_test.dart
@@ -81,7 +81,9 @@
 class TextRepresentationConfig extends TestConfig {
   const TextRepresentationConfig(String marker, String name)
       : super(marker, name,
-            experimentalFlags: const {ExperimentalFlag.nonNullable: true},
+            explicitExperimentalFlags: const {
+              ExperimentalFlag.nonNullable: true
+            },
             nnbdMode: NnbdMode.Strong);
 
   void customizeCompilerOptions(CompilerOptions options, TestData testData) {
diff --git a/pkg/front_end/test/type_labeler_test.dart b/pkg/front_end/test/type_labeler_test.dart
index bab4138..40e862f 100644
--- a/pkg/front_end/test/type_labeler_test.dart
+++ b/pkg/front_end/test/type_labeler_test.dart
@@ -223,22 +223,28 @@
   check({symConst: "#foo", symLibConst: "#dart:core::bar"}, 0);
 
   Constant fooConst = new InstanceConstant(
-      fooClass.reference, [], {booField.reference: trueConst});
+      fooClass.reference, [], {booField.getterReference: trueConst});
   check({fooConst: "Foo {boo: true}"}, 1);
 
-  Constant foo2Const = new InstanceConstant(foo2Class.reference, [],
-      {nextField.reference: nullConst, valueField.reference: intConst});
+  Constant foo2Const = new InstanceConstant(foo2Class.reference, [], {
+    nextField.getterReference: nullConst,
+    valueField.getterReference: intConst
+  });
   check({foo2Const: "Foo {value: 2, next: null}"}, 1);
 
   Constant foo2nConst = new InstanceConstant(foo2Class.reference, [], {
-    valueField.reference: intConst,
-    nextField.reference: new InstanceConstant(foo2Class.reference, [],
-        {valueField.reference: intConst, nextField.reference: nullConst}),
+    valueField.getterReference: intConst,
+    nextField.getterReference: new InstanceConstant(foo2Class.reference, [], {
+      valueField.getterReference: intConst,
+      nextField.getterReference: nullConst
+    }),
   });
   check({foo2nConst: "Foo {value: 2, next: Foo {value: 2, next: null}}"}, 1);
 
-  Constant bazFooFoo2Const = new InstanceConstant(bazClass.reference,
-      [foo, foo2], {xField.reference: fooConst, yField.reference: foo2Const});
+  Constant bazFooFoo2Const = new InstanceConstant(
+      bazClass.reference,
+      [foo, foo2],
+      {xField.getterReference: fooConst, yField.getterReference: foo2Const});
   check({
     bazFooFoo2Const: "Baz<Foo/*1*/, Foo/*2*/> "
         "{x: Foo/*1*/ {boo: true}, y: Foo/*2*/ {value: 2, next: null}}"
diff --git a/pkg/front_end/test/utils/kernel_chain.dart b/pkg/front_end/test/utils/kernel_chain.dart
index 804af3c..81b5e42 100644
--- a/pkg/front_end/test/utils/kernel_chain.dart
+++ b/pkg/front_end/test/utils/kernel_chain.dart
@@ -4,8 +4,6 @@
 
 library fasta.testing.kernel_chain;
 
-import 'dart:async' show Future;
-
 import 'dart:io' show Directory, File, IOSink, Platform;
 
 import 'dart:typed_data' show Uint8List;
@@ -94,8 +92,8 @@
         }
         String diff = await runDiff(expectedFile.uri, actual);
         onMismatch ??= expectationFileMismatch;
-        return new Result<O>(output, onMismatch,
-            "$uri doesn't match ${expectedFile.uri}\n$diff", null,
+        return new Result<O>(
+            output, onMismatch, "$uri doesn't match ${expectedFile.uri}\n$diff",
             autoFixCommand: onMismatch == expectationFileMismatch
                 ? updateExpectationsOption
                 : null);
@@ -113,7 +111,6 @@
           """
 Please create file ${expectedFile.path} with this content:
 $actual""",
-          null,
           autoFixCommand: updateExpectationsOption);
     }
   }
@@ -179,8 +176,7 @@
       return new Result<ComponentResult>(
           null,
           context.expectationSet["TypeCheckError"],
-          '${errorFormatter.numberOfFailures} type errors',
-          null);
+          '${errorFormatter.numberOfFailures} type errors');
     }
   }
 }
@@ -213,7 +209,8 @@
 
       ByteSink sink = new ByteSink();
       Component writeMe = new Component(
-          libraries: component.libraries.where(result.isUserLibrary).toList());
+          libraries: component.libraries.where(result.isUserLibrary).toList())
+        ..setMainMethodAndMode(null, false, component.mode);
       writeMe.uriToSource.addAll(component.uriToSource);
       if (component.problemsAsJson != null) {
         writeMe.problemsAsJson =
@@ -377,11 +374,8 @@
       }
 
       if (failures.isNotEmpty) {
-        return new Result<ComponentResult>(
-            null,
-            context.expectationSet["TextSerializationFailure"],
-            "$messages",
-            null);
+        return new Result<ComponentResult>(null,
+            context.expectationSet["TextSerializationFailure"], "$messages");
       }
       return pass(result);
     });
diff --git a/pkg/front_end/test/utils/scanner_chain.dart b/pkg/front_end/test/utils/scanner_chain.dart
index 7f014e4..1bf5b45 100644
--- a/pkg/front_end/test/utils/scanner_chain.dart
+++ b/pkg/front_end/test/utils/scanner_chain.dart
@@ -10,7 +10,7 @@
 import 'package:_fe_analyzer_shared/src/scanner/io.dart' show readBytesFromFile;
 
 import 'package:testing/testing.dart'
-    show ChainContext, Future, Result, Step, TestDescription;
+    show ChainContext, Result, Step, TestDescription;
 
 class ReadFile {
   final Uri uri;
diff --git a/pkg/front_end/test/utils/validating_instrumentation.dart b/pkg/front_end/test/utils/validating_instrumentation.dart
index 8214637..9680b32 100644
--- a/pkg/front_end/test/utils/validating_instrumentation.dart
+++ b/pkg/front_end/test/utils/validating_instrumentation.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.md file.
 
-import 'dart:async' show Future;
-
 import 'dart:convert' show utf8;
 
 import 'dart:io' show File;
diff --git a/pkg/front_end/testcases/agnostic/as.dart.outline.expect b/pkg/front_end/testcases/agnostic/as.dart.outline.expect
index b6d34a3..7b8b8ac 100644
--- a/pkg/front_end/testcases/agnostic/as.dart.outline.expect
+++ b/pkg/front_end/testcases/agnostic/as.dart.outline.expect
@@ -2,13 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-static const field core::List<core::int> a = const <core::Null?>[] as{ForNonNullableByDefault} core::List<core::int>;
+static const field core::List<core::int> a = const <Null>[] as{ForNonNullableByDefault} core::List<core::int>;
 static const field core::List<core::int> b = const <core::int?>[] as{ForNonNullableByDefault} core::List<core::int>;
 static method main() → void
   ;
 
 
 Extra constant evaluation status:
-Evaluated: ListLiteral @ org-dartlang-testcase:///as.dart:5:17 -> ListConstant(const <Null?>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///as.dart:5:17 -> ListConstant(const <Null>[])
 Evaluated: ListLiteral @ org-dartlang-testcase:///as.dart:6:17 -> ListConstant(const <int?>[])
 Extra constant evaluation: evaluated: 4, effectively constant: 2
diff --git a/pkg/front_end/testcases/agnostic/as.dart.weak.expect b/pkg/front_end/testcases/agnostic/as.dart.weak.expect
index cc4ac88..f28c31a 100644
--- a/pkg/front_end/testcases/agnostic/as.dart.weak.expect
+++ b/pkg/front_end/testcases/agnostic/as.dart.weak.expect
@@ -7,6 +7,6 @@
 static method main() → void {}
 
 constants  {
-  #C1 = <core::Null?>[]
+  #C1 = <Null>[]
   #C2 = <core::int*>[]
 }
diff --git a/pkg/front_end/testcases/agnostic/as.dart.weak.transformed.expect b/pkg/front_end/testcases/agnostic/as.dart.weak.transformed.expect
index cc4ac88..f28c31a 100644
--- a/pkg/front_end/testcases/agnostic/as.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/agnostic/as.dart.weak.transformed.expect
@@ -7,6 +7,6 @@
 static method main() → void {}
 
 constants  {
-  #C1 = <core::Null?>[]
+  #C1 = <Null>[]
   #C2 = <core::int*>[]
 }
diff --git a/pkg/front_end/testcases/agnostic/is.dart.outline.expect b/pkg/front_end/testcases/agnostic/is.dart.outline.expect
index 0046b04..62c76b3 100644
--- a/pkg/front_end/testcases/agnostic/is.dart.outline.expect
+++ b/pkg/front_end/testcases/agnostic/is.dart.outline.expect
@@ -2,13 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-static const field core::bool a = const <core::Null?>[] is{ForNonNullableByDefault} core::List<core::int>;
+static const field core::bool a = const <Null>[] is{ForNonNullableByDefault} core::List<core::int>;
 static const field core::bool b = const <core::int?>[] is{ForNonNullableByDefault} core::List<core::int>;
 static method main() → void
   ;
 
 
 Extra constant evaluation status:
-Evaluated: ListLiteral @ org-dartlang-testcase:///is.dart:5:17 -> ListConstant(const <Null?>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///is.dart:5:17 -> ListConstant(const <Null>[])
 Evaluated: ListLiteral @ org-dartlang-testcase:///is.dart:6:17 -> ListConstant(const <int?>[])
 Extra constant evaluation: evaluated: 4, effectively constant: 2
diff --git a/pkg/front_end/testcases/expression/class_type_param_reference_arg_inferred.expression.yaml.expect b/pkg/front_end/testcases/expression/class_type_param_reference_arg_inferred.expression.yaml.expect
index 4842362..e5b3c04 100644
--- a/pkg/front_end/testcases/expression/class_type_param_reference_arg_inferred.expression.yaml.expect
+++ b/pkg/front_end/testcases/expression/class_type_param_reference_arg_inferred.expression.yaml.expect
@@ -1,6 +1,6 @@
 Errors: {
 }
 method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr(dynamic x) → dynamic
-  return () → dart.core::Null? {
+  return () → Null {
     x = main::id<dynamic>(x);
   };
diff --git a/pkg/front_end/testcases/expression/class_type_param_reference_ctor_inferred.expression.yaml.expect b/pkg/front_end/testcases/expression/class_type_param_reference_ctor_inferred.expression.yaml.expect
index 5d5e32a..bbce9bb 100644
--- a/pkg/front_end/testcases/expression/class_type_param_reference_ctor_inferred.expression.yaml.expect
+++ b/pkg/front_end/testcases/expression/class_type_param_reference_ctor_inferred.expression.yaml.expect
@@ -1,6 +1,6 @@
 Errors: {
 }
 method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr(dynamic x) → dynamic
-  return () → dart.core::Null? {
+  return () → Null {
     x = new main::A::•<dynamic>();
   };
diff --git a/pkg/front_end/testcases/expression/folder.options b/pkg/front_end/testcases/expression/folder.options
new file mode 100644
index 0000000..dbc148e
--- /dev/null
+++ b/pkg/front_end/testcases/expression/folder.options
@@ -0,0 +1 @@
+--enable-experiment=no-non-nullable
\ No newline at end of file
diff --git a/pkg/front_end/testcases/expression/invalid_type_variable.expression.yaml.expect b/pkg/front_end/testcases/expression/invalid_type_variable.expression.yaml.expect
index ba1f145..792e96a 100644
--- a/pkg/front_end/testcases/expression/invalid_type_variable.expression.yaml.expect
+++ b/pkg/front_end/testcases/expression/invalid_type_variable.expression.yaml.expect
@@ -1,3 +1,4 @@
 Errors: {
+  pkg/front_end/testcases/expression/main.dart: Error: Illegal type parameter name 'TypeParameter(a#b)' found during expression compilation.
 }
 <no procedure>
diff --git a/pkg/front_end/testcases/expression/invalid_variable.expression.yaml.expect b/pkg/front_end/testcases/expression/invalid_variable.expression.yaml.expect
index ba1f145..a093fa5 100644
--- a/pkg/front_end/testcases/expression/invalid_variable.expression.yaml.expect
+++ b/pkg/front_end/testcases/expression/invalid_variable.expression.yaml.expect
@@ -1,3 +1,4 @@
 Errors: {
+  pkg/front_end/testcases/expression/main.dart: Error: Illegal parameter name 'a#b' found during expression compilation.
 }
 <no procedure>
diff --git a/pkg/front_end/testcases/expression/lib_ctor.expression.yaml.expect b/pkg/front_end/testcases/expression/lib_ctor.expression.yaml.expect
index 45805ec..5944c43 100644
--- a/pkg/front_end/testcases/expression/lib_ctor.expression.yaml.expect
+++ b/pkg/front_end/testcases/expression/lib_ctor.expression.yaml.expect
@@ -1,7 +1,7 @@
 Errors: {
 }
 method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr() → dynamic
-  return () → dart.core::Null? {
+  return () → Null {
     new main::A::•<dynamic>();
     #C2;
   };
diff --git a/pkg/front_end/testcases/expression/lib_external_ctor.expression.yaml.expect b/pkg/front_end/testcases/expression/lib_external_ctor.expression.yaml.expect
index 4bc18c6..430f437 100644
--- a/pkg/front_end/testcases/expression/lib_external_ctor.expression.yaml.expect
+++ b/pkg/front_end/testcases/expression/lib_external_ctor.expression.yaml.expect
@@ -4,7 +4,7 @@
            ^^^^^^^
 }
 method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr() → dynamic
-  return () → dart.core::Null? {
+  return () → Null {
     throw new dart.core::AbstractClassInstantiationError::•("Process");
     dart.io::File::fromUri(dart.core::Uri::parse("file://test.dart"));
   };
diff --git a/pkg/front_end/testcases/expression/param_capture.expression.yaml.expect b/pkg/front_end/testcases/expression/param_capture.expression.yaml.expect
index 36a812e..ccedccc 100644
--- a/pkg/front_end/testcases/expression/param_capture.expression.yaml.expect
+++ b/pkg/front_end/testcases/expression/param_capture.expression.yaml.expect
@@ -1,6 +1,6 @@
 Errors: {
 }
 method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr(dynamic x, dynamic y) → dynamic
-  return () → dart.core::Null? {
+  return () → Null {
     x = x.+(y);
   };
diff --git a/pkg/front_end/testcases/expression/set_literal.expression.yaml.expect b/pkg/front_end/testcases/expression/set_literal.expression.yaml.expect
index c2c42bc..e622baa 100644
--- a/pkg/front_end/testcases/expression/set_literal.expression.yaml.expect
+++ b/pkg/front_end/testcases/expression/set_literal.expression.yaml.expect
@@ -1,4 +1,7 @@
 Errors: {
 }
 method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr() → dynamic
-  return let final dart.core::Set<dart.core::String*>* #t1 = dart.collection::LinkedHashSet::•<dart.core::String*>() in let final dynamic #t2 = #t1.{dart.core::Set::add}("a") in #t1;
+  return block {
+    final dart.core::Set<dart.core::String*>* #t1 = dart.collection::LinkedHashSet::•<dart.core::String*>();
+    #t1.{dart.core::Set::add}{Invariant}("a");
+  } =>#t1;
diff --git a/pkg/front_end/testcases/expression/spread_element.expression.yaml.expect b/pkg/front_end/testcases/expression/spread_element.expression.yaml.expect
index 1a1c5a8..e34676b 100644
--- a/pkg/front_end/testcases/expression/spread_element.expression.yaml.expect
+++ b/pkg/front_end/testcases/expression/spread_element.expression.yaml.expect
@@ -7,7 +7,7 @@
       dart.core::Iterator<dart.core::String*>* :sync-for-iterator = main::listOfStrings.{dart.core::Iterable::iterator};
       for (; :sync-for-iterator.{dart.core::Iterator::moveNext}(); ) {
         final dart.core::String* #t2 = :sync-for-iterator.{dart.core::Iterator::current};
-        #t1.{dart.core::List::add}(#t2);
+        #t1.{dart.core::List::add}{Invariant}(#t2);
       }
     }
   } =>#t1;
diff --git a/pkg/front_end/testcases/expression/type_param_shadow_arg_ctor_inferred.expression.yaml.expect b/pkg/front_end/testcases/expression/type_param_shadow_arg_ctor_inferred.expression.yaml.expect
index c02e68e..d488d56 100644
--- a/pkg/front_end/testcases/expression/type_param_shadow_arg_ctor_inferred.expression.yaml.expect
+++ b/pkg/front_end/testcases/expression/type_param_shadow_arg_ctor_inferred.expression.yaml.expect
@@ -5,6 +5,6 @@
               ^
 }
 method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr<T extends dynamic>() → dynamic
-  return () → dart.core::Null? {
+  return () → Null {
     main::A::debugExpr::T* k = let final<BottomType> #t1 = invalid-expression "org-dartlang-debug:synthetic_debug_expression:2:13: Error: A value of type 'A<dynamic>' can't be assigned to a variable of type 'T'.\n - 'A' is from 'pkg/front_end/testcases/expression/main.dart'.\n  T k = new A();\n            ^" in new main::A::•<dynamic>() as{TypeError} <BottomType>;
   };
diff --git a/pkg/front_end/testcases/expression/type_param_shadow_arg_inferred.expression.yaml.expect b/pkg/front_end/testcases/expression/type_param_shadow_arg_inferred.expression.yaml.expect
index a7a450a..4e5bdde 100644
--- a/pkg/front_end/testcases/expression/type_param_shadow_arg_inferred.expression.yaml.expect
+++ b/pkg/front_end/testcases/expression/type_param_shadow_arg_inferred.expression.yaml.expect
@@ -1,7 +1,7 @@
 Errors: {
 }
 method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr<T extends dynamic>() → dynamic
-  return () → dart.core::Null? {
+  return () → Null {
     main::A::debugExpr::T* k = null;
     k = main::id<main::A::debugExpr::T*>(k);
   };
diff --git a/pkg/front_end/testcases/expression/type_param_shadow_var.expression.yaml.expect b/pkg/front_end/testcases/expression/type_param_shadow_var.expression.yaml.expect
index 50019f0..a632a3c 100644
--- a/pkg/front_end/testcases/expression/type_param_shadow_var.expression.yaml.expect
+++ b/pkg/front_end/testcases/expression/type_param_shadow_var.expression.yaml.expect
@@ -1,6 +1,6 @@
 Errors: {
 }
 method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr<T extends dynamic>(dynamic x) → dynamic
-  return () → dart.core::Null? {
+  return () → Null {
     main::A::debugExpr::T* x = null;
   };
diff --git a/pkg/front_end/testcases/extensions/async_extensions.dart.strong.transformed.expect b/pkg/front_end/testcases/extensions/async_extensions.dart.strong.transformed.expect
index 1ef6cf1..36fe6ad 100644
--- a/pkg/front_end/testcases/extensions/async_extensions.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/extensions/async_extensions.dart.strong.transformed.expect
@@ -12,20 +12,22 @@
   tearoff asyncStarMethod = self::Extension|get#asyncStarMethod;
 }
 static method Extension|syncStarMethod(final core::int* #this) → dynamic /* originally sync* */ {
-  function :sync_op_gen() → (core::_SyncIterator<dynamic>*) →* core::bool* {
+  function :sync_op_gen() → (core::_SyncIterator<dynamic>*, dynamic, dynamic) →* core::bool* {
     core::int* :await_jump_var = 0;
     dynamic :await_ctx_var;
-    return (core::_SyncIterator<dynamic>* :iterator) → core::bool* yielding {
+    function :sync_op(core::_SyncIterator<dynamic>* :iterator, dynamic :exception, dynamic :stack_trace) → core::bool* yielding {
       {}
       return false;
-    };
+    }
+    return :sync_op;
   }
   return new core::_SyncIterable::•<dynamic>(:sync_op_gen);
 }
 static method Extension|get#syncStarMethod(final core::int* #this) → () →* dynamic
   return () → dynamic => self::Extension|syncStarMethod(#this);
 static method Extension|asyncMethod(final core::int* #this) → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic>* :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -36,17 +38,18 @@
     try {
       #L1:
       {}
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method Extension|get#asyncMethod(final core::int* #this) → () →* dynamic
   return () → dynamic => self::Extension|asyncMethod(#this);
diff --git a/pkg/front_end/testcases/extensions/deferred_explicit_access.dart.strong.transformed.expect b/pkg/front_end/testcases/extensions/deferred_explicit_access.dart.strong.transformed.expect
index c510c9c..580ca3c 100644
--- a/pkg/front_end/testcases/extensions/deferred_explicit_access.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/extensions/deferred_explicit_access.dart.strong.transformed.expect
@@ -15,7 +15,8 @@
 import "org-dartlang-testcase:///deferred_explicit_access_lib.dart" deferred as prefix;
 
 static method main() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic>* :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -38,17 +39,18 @@
         self::expect(87, let final core::Object* #t11 = CheckLibraryIsLoaded(prefix) in def::Extension|staticProperty = 87);
         self::expect(87, let final core::Object* #t12 = CheckLibraryIsLoaded(prefix) in def::Extension|staticMethod());
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
   if(!expected.{core::Object::==}(actual))
@@ -100,4 +102,4 @@
 Evaluated: VariableGet @ org-dartlang-testcase:///deferred_explicit_access.dart:12:31 -> IntConstant(0)
 Evaluated: VariableGet @ org-dartlang-testcase:///deferred_explicit_access.dart:12:45 -> IntConstant(42)
 Evaluated: VariableGet @ org-dartlang-testcase:///deferred_explicit_access.dart:12:45 -> IntConstant(42)
-Extra constant evaluation: evaluated: 95, effectively constant: 3
+Extra constant evaluation: evaluated: 96, effectively constant: 3
diff --git a/pkg/front_end/testcases/extensions/deferred_import_hidden.dart.strong.transformed.expect b/pkg/front_end/testcases/extensions/deferred_import_hidden.dart.strong.transformed.expect
index 25a9778..187e9da 100644
--- a/pkg/front_end/testcases/extensions/deferred_import_hidden.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/extensions/deferred_import_hidden.dart.strong.transformed.expect
@@ -7,7 +7,8 @@
 import "org-dartlang-testcase:///deferred_explicit_access_lib.dart" deferred as prefix hide Extension;
 
 static method main() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic>* :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -29,17 +30,18 @@
         self::expect(87, let final core::Object* #t7 = CheckLibraryIsLoaded(prefix) in def::topLevelProperty);
         self::expect(87, let final core::Object* #t8 = CheckLibraryIsLoaded(prefix) in def::topLevelMethod());
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
   if(!expected.{core::Object::==}(actual))
diff --git a/pkg/front_end/testcases/extensions/export_from_dill/main.dart b/pkg/front_end/testcases/extensions/export_from_dill/main.dart
new file mode 100644
index 0000000..6524b05
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/export_from_dill/main.dart
@@ -0,0 +1,16 @@
+// Copyright (c) 2020, 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 'main_lib1.dart';
+
+main() {
+  0.instanceProperty = 1.instanceProperty;
+  2.instanceMethod();
+  3.instanceMethod;
+  Extension.staticField = Extension.staticConstField;
+  3.instanceProperty = Extension.staticFinalField;
+  Extension.staticProperty = Extension.staticProperty;
+  Extension.staticMethod();
+  Extension.staticMethod;
+}
diff --git a/pkg/front_end/testcases/extensions/export_from_dill/main.dart.outline.expect b/pkg/front_end/testcases/extensions/export_from_dill/main.dart.outline.expect
new file mode 100644
index 0000000..e4074ca
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/export_from_dill/main.dart.outline.expect
@@ -0,0 +1,53 @@
+library;
+import self as self;
+
+import "org-dartlang-testcase:///main_lib1.dart";
+
+static method main() → dynamic
+  ;
+
+library;
+import self as self2;
+import "main_lib2.dart" as mai;
+additionalExports = (mai::Extension)
+
+export "org-dartlang-testcase:///main_lib2.dart";
+
+
+library;
+import self as mai;
+import "dart:core" as core;
+
+extension Extension on core::int* {
+  get instanceProperty = mai::Extension|get#instanceProperty;
+  method instanceMethod = mai::Extension|instanceMethod;
+  tearoff instanceMethod = mai::Extension|get#instanceMethod;
+  static field staticField = mai::Extension|staticField;
+  static field staticFinalField = mai::Extension|staticFinalField;
+  static field staticConstField = mai::Extension|staticConstField;
+  static get staticProperty = get mai::Extension|staticProperty;
+  static method staticMethod = mai::Extension|staticMethod;
+  set instanceProperty = mai::Extension|set#instanceProperty;
+  static set staticProperty = set mai::Extension|staticProperty;
+}
+static field core::int* Extension|staticField;
+static final field core::int* Extension|staticFinalField;
+static const field core::int* Extension|staticConstField = #C1;
+static method Extension|get#instanceProperty(final core::int* #this) → core::int*
+  ;
+static method Extension|set#instanceProperty(final core::int* #this, core::int* value) → void
+  ;
+static method Extension|instanceMethod(final core::int* #this) → void
+  ;
+static method Extension|get#instanceMethod(final core::int* #this) → () →* void
+  return () → void => mai::Extension|instanceMethod(#this);
+static get Extension|staticProperty() → core::int*
+  ;
+static set Extension|staticProperty(core::int* value) → void
+  ;
+static method Extension|staticMethod() → void
+  ;
+
+constants  {
+  #C1 = 42
+}
diff --git a/pkg/front_end/testcases/extensions/export_from_dill/main.dart.strong.expect b/pkg/front_end/testcases/extensions/export_from_dill/main.dart.strong.expect
new file mode 100644
index 0000000..93ed84b
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/export_from_dill/main.dart.strong.expect
@@ -0,0 +1,60 @@
+library;
+import self as self;
+import "main_lib2.dart" as mai;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///main_lib1.dart";
+
+static method main() → dynamic {
+  mai::Extension|set#instanceProperty(0, mai::Extension|get#instanceProperty(1));
+  mai::Extension|instanceMethod(2);
+  mai::Extension|get#instanceMethod(3);
+  mai::Extension|staticField = #C1;
+  mai::Extension|set#instanceProperty(3, mai::Extension|staticFinalField);
+  mai::Extension|staticProperty = mai::Extension|staticProperty;
+  mai::Extension|staticMethod();
+  #C2;
+}
+
+library;
+import self as self2;
+import "main_lib2.dart" as mai;
+additionalExports = (mai::Extension)
+
+export "org-dartlang-testcase:///main_lib2.dart";
+
+
+library;
+import self as mai;
+import "dart:core" as core;
+
+extension Extension on core::int* {
+  get instanceProperty = mai::Extension|get#instanceProperty;
+  method instanceMethod = mai::Extension|instanceMethod;
+  tearoff instanceMethod = mai::Extension|get#instanceMethod;
+  static field staticField = mai::Extension|staticField;
+  static field staticFinalField = mai::Extension|staticFinalField;
+  static field staticConstField = mai::Extension|staticConstField;
+  static get staticProperty = get mai::Extension|staticProperty;
+  static method staticMethod = mai::Extension|staticMethod;
+  set instanceProperty = mai::Extension|set#instanceProperty;
+  static set staticProperty = set mai::Extension|staticProperty;
+}
+static field core::int* Extension|staticField = 42;
+static final field core::int* Extension|staticFinalField = 42;
+static const field core::int* Extension|staticConstField = #C1;
+static method Extension|get#instanceProperty(final core::int* #this) → core::int*
+  return 42;
+static method Extension|set#instanceProperty(final core::int* #this, core::int* value) → void {}
+static method Extension|instanceMethod(final core::int* #this) → void {}
+static method Extension|get#instanceMethod(final core::int* #this) → () →* void
+  return () → void => mai::Extension|instanceMethod(#this);
+static get Extension|staticProperty() → core::int*
+  return 42;
+static set Extension|staticProperty(core::int* value) → void {}
+static method Extension|staticMethod() → void {}
+
+constants  {
+  #C1 = 42
+  #C2 = tearoff mai::Extension|staticMethod
+}
diff --git a/pkg/front_end/testcases/extensions/export_from_dill/main.dart.strong.transformed.expect b/pkg/front_end/testcases/extensions/export_from_dill/main.dart.strong.transformed.expect
new file mode 100644
index 0000000..93ed84b
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/export_from_dill/main.dart.strong.transformed.expect
@@ -0,0 +1,60 @@
+library;
+import self as self;
+import "main_lib2.dart" as mai;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///main_lib1.dart";
+
+static method main() → dynamic {
+  mai::Extension|set#instanceProperty(0, mai::Extension|get#instanceProperty(1));
+  mai::Extension|instanceMethod(2);
+  mai::Extension|get#instanceMethod(3);
+  mai::Extension|staticField = #C1;
+  mai::Extension|set#instanceProperty(3, mai::Extension|staticFinalField);
+  mai::Extension|staticProperty = mai::Extension|staticProperty;
+  mai::Extension|staticMethod();
+  #C2;
+}
+
+library;
+import self as self2;
+import "main_lib2.dart" as mai;
+additionalExports = (mai::Extension)
+
+export "org-dartlang-testcase:///main_lib2.dart";
+
+
+library;
+import self as mai;
+import "dart:core" as core;
+
+extension Extension on core::int* {
+  get instanceProperty = mai::Extension|get#instanceProperty;
+  method instanceMethod = mai::Extension|instanceMethod;
+  tearoff instanceMethod = mai::Extension|get#instanceMethod;
+  static field staticField = mai::Extension|staticField;
+  static field staticFinalField = mai::Extension|staticFinalField;
+  static field staticConstField = mai::Extension|staticConstField;
+  static get staticProperty = get mai::Extension|staticProperty;
+  static method staticMethod = mai::Extension|staticMethod;
+  set instanceProperty = mai::Extension|set#instanceProperty;
+  static set staticProperty = set mai::Extension|staticProperty;
+}
+static field core::int* Extension|staticField = 42;
+static final field core::int* Extension|staticFinalField = 42;
+static const field core::int* Extension|staticConstField = #C1;
+static method Extension|get#instanceProperty(final core::int* #this) → core::int*
+  return 42;
+static method Extension|set#instanceProperty(final core::int* #this, core::int* value) → void {}
+static method Extension|instanceMethod(final core::int* #this) → void {}
+static method Extension|get#instanceMethod(final core::int* #this) → () →* void
+  return () → void => mai::Extension|instanceMethod(#this);
+static get Extension|staticProperty() → core::int*
+  return 42;
+static set Extension|staticProperty(core::int* value) → void {}
+static method Extension|staticMethod() → void {}
+
+constants  {
+  #C1 = 42
+  #C2 = tearoff mai::Extension|staticMethod
+}
diff --git a/pkg/front_end/testcases/extensions/export_from_dill/main.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/export_from_dill/main.dart.textual_outline.expect
new file mode 100644
index 0000000..b27adef
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/export_from_dill/main.dart.textual_outline.expect
@@ -0,0 +1,3 @@
+import 'main_lib1.dart';
+
+main() {}
diff --git a/pkg/front_end/testcases/extensions/export_from_dill/main.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/export_from_dill/main.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..b27adef
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/export_from_dill/main.dart.textual_outline_modelled.expect
@@ -0,0 +1,3 @@
+import 'main_lib1.dart';
+
+main() {}
diff --git a/pkg/front_end/testcases/extensions/export_from_dill/main_lib1.dart b/pkg/front_end/testcases/extensions/export_from_dill/main_lib1.dart
new file mode 100644
index 0000000..6c6153b
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/export_from_dill/main_lib1.dart
@@ -0,0 +1,5 @@
+// Copyright (c) 2020, 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.
+
+export 'main_lib2.dart';
diff --git a/pkg/front_end/testcases/extensions/export_from_dill/main_lib2.dart b/pkg/front_end/testcases/extensions/export_from_dill/main_lib2.dart
new file mode 100644
index 0000000..b08ae03
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/export_from_dill/main_lib2.dart
@@ -0,0 +1,16 @@
+// Copyright (c) 2020, 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.
+
+extension Extension on int {
+  int get instanceProperty => 42;
+  void set instanceProperty(int value) {}
+  void instanceMethod() {}
+
+  static int staticField = 42;
+  static final int staticFinalField = 42;
+  static const int staticConstField = 42;
+  static int get staticProperty => 42;
+  static void set staticProperty(int value) {}
+  static void staticMethod() {}
+}
diff --git a/pkg/front_end/testcases/extensions/export_from_dill/test.options b/pkg/front_end/testcases/extensions/export_from_dill/test.options
new file mode 100644
index 0000000..bddd643
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/export_from_dill/test.options
@@ -0,0 +1,2 @@
+main_lib1.dart
+main_lib2.dart
diff --git a/pkg/front_end/testcases/extensions/extension_field_with_type_parameter_usage.dart.strong.expect b/pkg/front_end/testcases/extensions/extension_field_with_type_parameter_usage.dart.strong.expect
index 69565ac..e1fc1ee 100644
--- a/pkg/front_end/testcases/extensions/extension_field_with_type_parameter_usage.dart.strong.expect
+++ b/pkg/front_end/testcases/extensions/extension_field_with_type_parameter_usage.dart.strong.expect
@@ -82,18 +82,18 @@
   field field7 = self::E|field7;
 }
 static field invalid-type E|field1 = null;
-static field core::int* E|field2 = (() → core::Null? {
+static field core::int* E|field2 = (() → Null {
   invalid-type x = null;
   return null;
 }).call();
 static field core::List<invalid-type>* E|field3 = null;
 static field (invalid-type) →* invalid-type E|field4 = null;
 static field (core::List<invalid-type>*) →* core::List<invalid-type>* E|field5 = null;
-static field core::int* E|field6 = (<E extends core::Object* = dynamic>() → core::Null? {
+static field core::int* E|field6 = (<E extends core::Object* = dynamic>() → Null {
   E* x = null;
   return null;
 }).call<core::String*>();
-static field core::int* E|field7 = (<E extends core::Object* = dynamic>() → core::Null? {
+static field core::int* E|field7 = (<E extends core::Object* = dynamic>() → Null {
   E* x = null;
   return null;
 }).call<invalid-type>();
diff --git a/pkg/front_end/testcases/extensions/extension_field_with_type_parameter_usage.dart.strong.transformed.expect b/pkg/front_end/testcases/extensions/extension_field_with_type_parameter_usage.dart.strong.transformed.expect
index 69565ac..e1fc1ee 100644
--- a/pkg/front_end/testcases/extensions/extension_field_with_type_parameter_usage.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/extensions/extension_field_with_type_parameter_usage.dart.strong.transformed.expect
@@ -82,18 +82,18 @@
   field field7 = self::E|field7;
 }
 static field invalid-type E|field1 = null;
-static field core::int* E|field2 = (() → core::Null? {
+static field core::int* E|field2 = (() → Null {
   invalid-type x = null;
   return null;
 }).call();
 static field core::List<invalid-type>* E|field3 = null;
 static field (invalid-type) →* invalid-type E|field4 = null;
 static field (core::List<invalid-type>*) →* core::List<invalid-type>* E|field5 = null;
-static field core::int* E|field6 = (<E extends core::Object* = dynamic>() → core::Null? {
+static field core::int* E|field6 = (<E extends core::Object* = dynamic>() → Null {
   E* x = null;
   return null;
 }).call<core::String*>();
-static field core::int* E|field7 = (<E extends core::Object* = dynamic>() → core::Null? {
+static field core::int* E|field7 = (<E extends core::Object* = dynamic>() → Null {
   E* x = null;
   return null;
 }).call<invalid-type>();
diff --git a/pkg/front_end/testcases/extensions/extension_setter.dart.strong.expect b/pkg/front_end/testcases/extensions/extension_setter.dart.strong.expect
index 98f08d2..dbe9bc2 100644
--- a/pkg/front_end/testcases/extensions/extension_setter.dart.strong.expect
+++ b/pkg/front_end/testcases/extensions/extension_setter.dart.strong.expect
@@ -206,11 +206,11 @@
   self::expect(1, let final self::Class* #t106 = c in let final core::int* #t107 = self::Extension|get#simpleSetter(#t106) in #t107.{core::num::==}(null) ?{core::int*} let final core::int* #t108 = 2 in let final void #t109 = self::Extension|set#simpleSetter(#t106, #t108) in #t108 : #t107);
   c.{self::Class::field} = null;
   self::expect(2, let final self::Class* #t110 = c in let final core::int* #t111 = self::Extension|get#simpleSetter(#t110) in #t111.{core::num::==}(null) ?{core::int*} let final core::int* #t112 = 2 in let final void #t113 = self::Extension|set#simpleSetter(#t110, #t112) in #t112 : #t111);
-  let final self::Class* #t114 = c in #t114.{self::Class::==}(null) ?{core::Null?} null : #t114.{self::Class::field} = null;
+  let final self::Class* #t114 = c in #t114.{self::Class::==}(null) ?{Null} null : #t114.{self::Class::field} = null;
   let final self::Class* #t115 = c in #t115.{self::Class::==}(null) ?{core::int*} null : self::Extension|get#simpleSetter(#t115).{core::num::==}(null) ?{core::int*} self::Extension|set#simpleSetter(#t115, 1) : null;
   self::expect(1, let final self::Class* #t116 = c in #t116.{self::Class::==}(null) ?{core::int*} null : #t116.{self::Class::field});
   self::expect(1, let final self::Class* #t117 = c in #t117.{self::Class::==}(null) ?{core::int*} null : let final core::int* #t118 = self::Extension|get#simpleSetter(#t117) in #t118.{core::num::==}(null) ?{core::int*} let final core::int* #t119 = 2 in let final void #t120 = self::Extension|set#simpleSetter(#t117, #t119) in #t119 : #t118);
-  let final self::Class* #t121 = c in #t121.{self::Class::==}(null) ?{core::Null?} null : #t121.{self::Class::field} = null;
+  let final self::Class* #t121 = c in #t121.{self::Class::==}(null) ?{Null} null : #t121.{self::Class::field} = null;
   self::expect(2, let final self::Class* #t122 = c in #t122.{self::Class::==}(null) ?{core::int*} null : let final core::int* #t123 = self::Extension|get#simpleSetter(#t122) in #t123.{core::num::==}(null) ?{core::int*} let final core::int* #t124 = 2 in let final void #t125 = self::Extension|set#simpleSetter(#t122, #t124) in #t124 : #t123);
   self::Extension|testInternal(new self::Class::•());
   self::GenericClass<core::int*>* genericClass = new self::GenericClass::•<core::int*>();
diff --git a/pkg/front_end/testcases/extensions/extension_setter.dart.strong.transformed.expect b/pkg/front_end/testcases/extensions/extension_setter.dart.strong.transformed.expect
index 245ead1..cb01579 100644
--- a/pkg/front_end/testcases/extensions/extension_setter.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/extensions/extension_setter.dart.strong.transformed.expect
@@ -206,11 +206,11 @@
   self::expect(1, let final self::Class* #t106 = c in let final core::int* #t107 = self::Extension|get#simpleSetter(#t106) in #t107.{core::num::==}(null) ?{core::int*} let final core::int* #t108 = 2 in let final void #t109 = self::Extension|set#simpleSetter(#t106, #t108) in #t108 : #t107);
   c.{self::Class::field} = null;
   self::expect(2, let final self::Class* #t110 = c in let final core::int* #t111 = self::Extension|get#simpleSetter(#t110) in #t111.{core::num::==}(null) ?{core::int*} let final core::int* #t112 = 2 in let final void #t113 = self::Extension|set#simpleSetter(#t110, #t112) in #t112 : #t111);
-  let final self::Class* #t114 = c in #t114.{self::Class::==}(null) ?{core::Null?} null : #t114.{self::Class::field} = null;
+  let final self::Class* #t114 = c in #t114.{self::Class::==}(null) ?{Null} null : #t114.{self::Class::field} = null;
   let final self::Class* #t115 = c in #t115.{self::Class::==}(null) ?{core::int*} null : self::Extension|get#simpleSetter(#t115).{core::num::==}(null) ?{core::int*} self::Extension|set#simpleSetter(#t115, 1) : null;
   self::expect(1, let final self::Class* #t116 = c in #t116.{self::Class::==}(null) ?{core::int*} null : #t116.{self::Class::field});
   self::expect(1, let final self::Class* #t117 = c in #t117.{self::Class::==}(null) ?{core::int*} null : let final core::int* #t118 = self::Extension|get#simpleSetter(#t117) in #t118.{core::num::==}(null) ?{core::int*} let final core::int* #t119 = 2 in let final void #t120 = self::Extension|set#simpleSetter(#t117, #t119) in #t119 : #t118);
-  let final self::Class* #t121 = c in #t121.{self::Class::==}(null) ?{core::Null?} null : #t121.{self::Class::field} = null;
+  let final self::Class* #t121 = c in #t121.{self::Class::==}(null) ?{Null} null : #t121.{self::Class::field} = null;
   self::expect(2, let final self::Class* #t122 = c in #t122.{self::Class::==}(null) ?{core::int*} null : let final core::int* #t123 = self::Extension|get#simpleSetter(#t122) in #t123.{core::num::==}(null) ?{core::int*} let final core::int* #t124 = 2 in let final void #t125 = self::Extension|set#simpleSetter(#t122, #t124) in #t124 : #t123);
   self::Extension|testInternal(new self::Class::•());
   self::GenericClass<core::int*>* genericClass = new self::GenericClass::•<core::int*>();
diff --git a/pkg/front_end/testcases/extensions/extension_setter_error.dart.strong.expect b/pkg/front_end/testcases/extensions/extension_setter_error.dart.strong.expect
index 917ce53..f0d0e30 100644
--- a/pkg/front_end/testcases/extensions/extension_setter_error.dart.strong.expect
+++ b/pkg/front_end/testcases/extensions/extension_setter_error.dart.strong.expect
@@ -34,7 +34,7 @@
   self::expect(null, let final self::GenericClass<core::int*>* #t1 = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/extensions/extension_setter_error.dart:13:41: Error: A value of type 'GenericClass<int>' can't be assigned to a variable of type 'GenericClass<double>'.
  - 'GenericClass' is from 'pkg/front_end/testcases/extensions/extension_setter_error.dart'.
   expect(null, GenericExtension<double>(genericClass).setter = null);
-                                        ^" in genericClass as{TypeError} self::GenericClass<core::double*>* in let final core::Null? #t3 = null in let final void #t4 = self::GenericExtension|set#setter<core::double*>(#t1, #t3) in #t3);
+                                        ^" in genericClass as{TypeError} self::GenericClass<core::double*>* in let final Null #t3 = null in let final void #t4 = self::GenericExtension|set#setter<core::double*>(#t1, #t3) in #t3);
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
   if(!expected.{core::Object::==}(actual)) {
diff --git a/pkg/front_end/testcases/extensions/folder.options b/pkg/front_end/testcases/extensions/folder.options
index 2624853..77e0400 100644
--- a/pkg/front_end/testcases/extensions/folder.options
+++ b/pkg/front_end/testcases/extensions/folder.options
@@ -1 +1 @@
---enable-experiment=extension-methods
\ No newline at end of file
+--enable-experiment=extension-methods,no-non-nullable
\ No newline at end of file
diff --git a/pkg/front_end/testcases/extensions/import_from_dill/main.dart b/pkg/front_end/testcases/extensions/import_from_dill/main.dart
new file mode 100644
index 0000000..6524b05
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/import_from_dill/main.dart
@@ -0,0 +1,16 @@
+// Copyright (c) 2020, 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 'main_lib1.dart';
+
+main() {
+  0.instanceProperty = 1.instanceProperty;
+  2.instanceMethod();
+  3.instanceMethod;
+  Extension.staticField = Extension.staticConstField;
+  3.instanceProperty = Extension.staticFinalField;
+  Extension.staticProperty = Extension.staticProperty;
+  Extension.staticMethod();
+  Extension.staticMethod;
+}
diff --git a/pkg/front_end/testcases/extensions/import_from_dill/main.dart.outline.expect b/pkg/front_end/testcases/extensions/import_from_dill/main.dart.outline.expect
new file mode 100644
index 0000000..ccc1535
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/import_from_dill/main.dart.outline.expect
@@ -0,0 +1,45 @@
+library;
+import self as self;
+
+import "org-dartlang-testcase:///main_lib1.dart";
+
+static method main() → dynamic
+  ;
+
+library;
+import self as self2;
+import "dart:core" as core;
+
+extension Extension on core::int* {
+  get instanceProperty = self2::Extension|get#instanceProperty;
+  method instanceMethod = self2::Extension|instanceMethod;
+  tearoff instanceMethod = self2::Extension|get#instanceMethod;
+  static field staticField = self2::Extension|staticField;
+  static field staticFinalField = self2::Extension|staticFinalField;
+  static field staticConstField = self2::Extension|staticConstField;
+  static get staticProperty = get self2::Extension|staticProperty;
+  static method staticMethod = self2::Extension|staticMethod;
+  set instanceProperty = self2::Extension|set#instanceProperty;
+  static set staticProperty = set self2::Extension|staticProperty;
+}
+static field core::int* Extension|staticField;
+static final field core::int* Extension|staticFinalField;
+static const field core::int* Extension|staticConstField = #C1;
+static method Extension|get#instanceProperty(final core::int* #this) → core::int*
+  ;
+static method Extension|set#instanceProperty(final core::int* #this, core::int* value) → void
+  ;
+static method Extension|instanceMethod(final core::int* #this) → void
+  ;
+static method Extension|get#instanceMethod(final core::int* #this) → () →* void
+  return () → void => self2::Extension|instanceMethod(#this);
+static get Extension|staticProperty() → core::int*
+  ;
+static set Extension|staticProperty(core::int* value) → void
+  ;
+static method Extension|staticMethod() → void
+  ;
+
+constants  {
+  #C1 = 42
+}
diff --git a/pkg/front_end/testcases/extensions/import_from_dill/main.dart.strong.expect b/pkg/front_end/testcases/extensions/import_from_dill/main.dart.strong.expect
new file mode 100644
index 0000000..1672c049
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/import_from_dill/main.dart.strong.expect
@@ -0,0 +1,52 @@
+library;
+import self as self;
+import "main_lib1.dart" as mai;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///main_lib1.dart";
+
+static method main() → dynamic {
+  mai::Extension|set#instanceProperty(0, mai::Extension|get#instanceProperty(1));
+  mai::Extension|instanceMethod(2);
+  mai::Extension|get#instanceMethod(3);
+  mai::Extension|staticField = #C1;
+  mai::Extension|set#instanceProperty(3, mai::Extension|staticFinalField);
+  mai::Extension|staticProperty = mai::Extension|staticProperty;
+  mai::Extension|staticMethod();
+  #C2;
+}
+
+library;
+import self as mai;
+import "dart:core" as core;
+
+extension Extension on core::int* {
+  get instanceProperty = mai::Extension|get#instanceProperty;
+  method instanceMethod = mai::Extension|instanceMethod;
+  tearoff instanceMethod = mai::Extension|get#instanceMethod;
+  static field staticField = mai::Extension|staticField;
+  static field staticFinalField = mai::Extension|staticFinalField;
+  static field staticConstField = mai::Extension|staticConstField;
+  static get staticProperty = get mai::Extension|staticProperty;
+  static method staticMethod = mai::Extension|staticMethod;
+  set instanceProperty = mai::Extension|set#instanceProperty;
+  static set staticProperty = set mai::Extension|staticProperty;
+}
+static field core::int* Extension|staticField = 42;
+static final field core::int* Extension|staticFinalField = 42;
+static const field core::int* Extension|staticConstField = #C1;
+static method Extension|get#instanceProperty(final core::int* #this) → core::int*
+  return 42;
+static method Extension|set#instanceProperty(final core::int* #this, core::int* value) → void {}
+static method Extension|instanceMethod(final core::int* #this) → void {}
+static method Extension|get#instanceMethod(final core::int* #this) → () →* void
+  return () → void => mai::Extension|instanceMethod(#this);
+static get Extension|staticProperty() → core::int*
+  return 42;
+static set Extension|staticProperty(core::int* value) → void {}
+static method Extension|staticMethod() → void {}
+
+constants  {
+  #C1 = 42
+  #C2 = tearoff mai::Extension|staticMethod
+}
diff --git a/pkg/front_end/testcases/extensions/import_from_dill/main.dart.strong.transformed.expect b/pkg/front_end/testcases/extensions/import_from_dill/main.dart.strong.transformed.expect
new file mode 100644
index 0000000..1672c049
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/import_from_dill/main.dart.strong.transformed.expect
@@ -0,0 +1,52 @@
+library;
+import self as self;
+import "main_lib1.dart" as mai;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///main_lib1.dart";
+
+static method main() → dynamic {
+  mai::Extension|set#instanceProperty(0, mai::Extension|get#instanceProperty(1));
+  mai::Extension|instanceMethod(2);
+  mai::Extension|get#instanceMethod(3);
+  mai::Extension|staticField = #C1;
+  mai::Extension|set#instanceProperty(3, mai::Extension|staticFinalField);
+  mai::Extension|staticProperty = mai::Extension|staticProperty;
+  mai::Extension|staticMethod();
+  #C2;
+}
+
+library;
+import self as mai;
+import "dart:core" as core;
+
+extension Extension on core::int* {
+  get instanceProperty = mai::Extension|get#instanceProperty;
+  method instanceMethod = mai::Extension|instanceMethod;
+  tearoff instanceMethod = mai::Extension|get#instanceMethod;
+  static field staticField = mai::Extension|staticField;
+  static field staticFinalField = mai::Extension|staticFinalField;
+  static field staticConstField = mai::Extension|staticConstField;
+  static get staticProperty = get mai::Extension|staticProperty;
+  static method staticMethod = mai::Extension|staticMethod;
+  set instanceProperty = mai::Extension|set#instanceProperty;
+  static set staticProperty = set mai::Extension|staticProperty;
+}
+static field core::int* Extension|staticField = 42;
+static final field core::int* Extension|staticFinalField = 42;
+static const field core::int* Extension|staticConstField = #C1;
+static method Extension|get#instanceProperty(final core::int* #this) → core::int*
+  return 42;
+static method Extension|set#instanceProperty(final core::int* #this, core::int* value) → void {}
+static method Extension|instanceMethod(final core::int* #this) → void {}
+static method Extension|get#instanceMethod(final core::int* #this) → () →* void
+  return () → void => mai::Extension|instanceMethod(#this);
+static get Extension|staticProperty() → core::int*
+  return 42;
+static set Extension|staticProperty(core::int* value) → void {}
+static method Extension|staticMethod() → void {}
+
+constants  {
+  #C1 = 42
+  #C2 = tearoff mai::Extension|staticMethod
+}
diff --git a/pkg/front_end/testcases/extensions/import_from_dill/main.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/import_from_dill/main.dart.textual_outline.expect
new file mode 100644
index 0000000..b27adef
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/import_from_dill/main.dart.textual_outline.expect
@@ -0,0 +1,3 @@
+import 'main_lib1.dart';
+
+main() {}
diff --git a/pkg/front_end/testcases/extensions/import_from_dill/main.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/import_from_dill/main.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..b27adef
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/import_from_dill/main.dart.textual_outline_modelled.expect
@@ -0,0 +1,3 @@
+import 'main_lib1.dart';
+
+main() {}
diff --git a/pkg/front_end/testcases/extensions/import_from_dill/main_lib1.dart b/pkg/front_end/testcases/extensions/import_from_dill/main_lib1.dart
new file mode 100644
index 0000000..b08ae03
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/import_from_dill/main_lib1.dart
@@ -0,0 +1,16 @@
+// Copyright (c) 2020, 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.
+
+extension Extension on int {
+  int get instanceProperty => 42;
+  void set instanceProperty(int value) {}
+  void instanceMethod() {}
+
+  static int staticField = 42;
+  static final int staticFinalField = 42;
+  static const int staticConstField = 42;
+  static int get staticProperty => 42;
+  static void set staticProperty(int value) {}
+  static void staticMethod() {}
+}
diff --git a/pkg/front_end/testcases/extensions/import_from_dill/test.options b/pkg/front_end/testcases/extensions/import_from_dill/test.options
new file mode 100644
index 0000000..f73dd0f
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/import_from_dill/test.options
@@ -0,0 +1 @@
+main_lib1.dart
diff --git a/pkg/front_end/testcases/extensions/issue40596.dart.strong.expect b/pkg/front_end/testcases/extensions/issue40596.dart.strong.expect
index f26640b..1511135 100644
--- a/pkg/front_end/testcases/extensions/issue40596.dart.strong.expect
+++ b/pkg/front_end/testcases/extensions/issue40596.dart.strong.expect
@@ -11,12 +11,12 @@
 }
 static method main() → void {
   asy::StreamController<core::String*>* controller = asy::StreamController::•<core::String*>();
-  let final asy::StreamController<core::String*>* #t1 = controller in let final (dynamic) →* core::Null? #t2 = (dynamic s) → core::Null? {
+  let final asy::StreamController<core::String*>* #t1 = controller in let final (dynamic) →* Null #t2 = (dynamic s) → Null {
     core::print(s);
   } in self::Extension|call<core::String*>(#t1.{asy::StreamController::stream}, #t2);
 }
 static method Extension|call<T extends core::Object* = dynamic>(final asy::Stream<self::Extension|call::T*>* #this, core::Function* onData) → asy::StreamSubscription<self::Extension|call::T*>* {
-  return #this.{asy::Stream::listen}((self::Extension|call::T* d) → core::Null? {
+  return #this.{asy::Stream::listen}((self::Extension|call::T* d) → Null {
     onData.call(d);
   });
 }
diff --git a/pkg/front_end/testcases/extensions/issue40596.dart.strong.transformed.expect b/pkg/front_end/testcases/extensions/issue40596.dart.strong.transformed.expect
index f26640b..1511135 100644
--- a/pkg/front_end/testcases/extensions/issue40596.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/extensions/issue40596.dart.strong.transformed.expect
@@ -11,12 +11,12 @@
 }
 static method main() → void {
   asy::StreamController<core::String*>* controller = asy::StreamController::•<core::String*>();
-  let final asy::StreamController<core::String*>* #t1 = controller in let final (dynamic) →* core::Null? #t2 = (dynamic s) → core::Null? {
+  let final asy::StreamController<core::String*>* #t1 = controller in let final (dynamic) →* Null #t2 = (dynamic s) → Null {
     core::print(s);
   } in self::Extension|call<core::String*>(#t1.{asy::StreamController::stream}, #t2);
 }
 static method Extension|call<T extends core::Object* = dynamic>(final asy::Stream<self::Extension|call::T*>* #this, core::Function* onData) → asy::StreamSubscription<self::Extension|call::T*>* {
-  return #this.{asy::Stream::listen}((self::Extension|call::T* d) → core::Null? {
+  return #this.{asy::Stream::listen}((self::Extension|call::T* d) → Null {
     onData.call(d);
   });
 }
diff --git a/pkg/front_end/testcases/extensions/language_issue1182.dart b/pkg/front_end/testcases/extensions/language_issue1182.dart
new file mode 100644
index 0000000..c9d46c8
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/language_issue1182.dart
@@ -0,0 +1,15 @@
+// Copyright (c) 2020, 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.
+
+extension Test<T> on T {
+  T Function(T) get test => (a) => this;
+}
+
+class Foo<S extends num> {
+  void test1(S x) {
+    S Function(S) f = x.test;
+  }
+}
+
+void main() {}
diff --git a/pkg/front_end/testcases/extensions/language_issue1182.dart.outline.expect b/pkg/front_end/testcases/extensions/language_issue1182.dart.outline.expect
new file mode 100644
index 0000000..c989ba2
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/language_issue1182.dart.outline.expect
@@ -0,0 +1,27 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Foo<S extends core::num* = core::num*> extends core::Object {
+  synthetic constructor •() → self::Foo<self::Foo::S*>*
+    ;
+  method test1(generic-covariant-impl self::Foo::S* x) → void
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+extension Test<T extends core::Object* = dynamic> on T* {
+  get test = self::Test|get#test;
+}
+static method Test|get#test<T extends core::Object* = dynamic>(final self::Test|get#test::T* #this) → (self::Test|get#test::T*) →* self::Test|get#test::T*
+  ;
+static method main() → void
+  ;
diff --git a/pkg/front_end/testcases/extensions/language_issue1182.dart.strong.expect b/pkg/front_end/testcases/extensions/language_issue1182.dart.strong.expect
new file mode 100644
index 0000000..17bdb9d
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/language_issue1182.dart.strong.expect
@@ -0,0 +1,37 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extensions/language_issue1182.dart:11:25: Error: A value of type 'num Function(num)' can't be assigned to a variable of type 'S Function(S)'.
+//     S Function(S) f = x.test;
+//                         ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Foo<S extends core::num* = core::num*> extends core::Object {
+  synthetic constructor •() → self::Foo<self::Foo::S*>*
+    : super core::Object::•()
+    ;
+  method test1(generic-covariant-impl self::Foo::S* x) → void {
+    (self::Foo::S*) →* self::Foo::S* f = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/extensions/language_issue1182.dart:11:25: Error: A value of type 'num Function(num)' can't be assigned to a variable of type 'S Function(S)'.
+    S Function(S) f = x.test;
+                        ^" in self::Test|get#test<core::num*>(x) as{TypeError} <BottomType>;
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+extension Test<T extends core::Object* = dynamic> on T* {
+  get test = self::Test|get#test;
+}
+static method Test|get#test<T extends core::Object* = dynamic>(final self::Test|get#test::T* #this) → (self::Test|get#test::T*) →* self::Test|get#test::T*
+  return (self::Test|get#test::T* a) → self::Test|get#test::T* => #this;
+static method main() → void {}
diff --git a/pkg/front_end/testcases/extensions/language_issue1182.dart.strong.transformed.expect b/pkg/front_end/testcases/extensions/language_issue1182.dart.strong.transformed.expect
new file mode 100644
index 0000000..17bdb9d
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/language_issue1182.dart.strong.transformed.expect
@@ -0,0 +1,37 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extensions/language_issue1182.dart:11:25: Error: A value of type 'num Function(num)' can't be assigned to a variable of type 'S Function(S)'.
+//     S Function(S) f = x.test;
+//                         ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Foo<S extends core::num* = core::num*> extends core::Object {
+  synthetic constructor •() → self::Foo<self::Foo::S*>*
+    : super core::Object::•()
+    ;
+  method test1(generic-covariant-impl self::Foo::S* x) → void {
+    (self::Foo::S*) →* self::Foo::S* f = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/extensions/language_issue1182.dart:11:25: Error: A value of type 'num Function(num)' can't be assigned to a variable of type 'S Function(S)'.
+    S Function(S) f = x.test;
+                        ^" in self::Test|get#test<core::num*>(x) as{TypeError} <BottomType>;
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+extension Test<T extends core::Object* = dynamic> on T* {
+  get test = self::Test|get#test;
+}
+static method Test|get#test<T extends core::Object* = dynamic>(final self::Test|get#test::T* #this) → (self::Test|get#test::T*) →* self::Test|get#test::T*
+  return (self::Test|get#test::T* a) → self::Test|get#test::T* => #this;
+static method main() → void {}
diff --git a/pkg/front_end/testcases/extensions/language_issue1182.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/language_issue1182.dart.textual_outline.expect
new file mode 100644
index 0000000..2f9718a
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/language_issue1182.dart.textual_outline.expect
@@ -0,0 +1,6 @@
+extension Test<T> (){}
+on T (){}
+class Foo<S extends num> {
+  void test1(S x) {}
+}
+void main() {}
diff --git a/pkg/front_end/testcases/extensions/null_aware.dart.strong.expect b/pkg/front_end/testcases/extensions/null_aware.dart.strong.expect
index 6609124..fb975d6 100644
--- a/pkg/front_end/testcases/extensions/null_aware.dart.strong.expect
+++ b/pkg/front_end/testcases/extensions/null_aware.dart.strong.expect
@@ -56,28 +56,28 @@
   self::expect(null, tearOff.call());
   self::expect(42, let final self::Class* #t20 = c in #t20.{self::Class::==}(null) ?{core::int*} null : let final core::int* #t21 = 42 in let final void #t22 = self::Extension|set#property(#t20, #t21) in #t21);
   self::expect(42, tearOff.call());
-  self::expect(null, let final self::Class* #t23 = c in #t23.{self::Class::==}(null) ?{core::Null?} null : let final core::Null? #t24 = null in let final void #t25 = self::Extension|set#property(#t23, #t24) in #t24);
+  self::expect(null, let final self::Class* #t23 = c in #t23.{self::Class::==}(null) ?{Null} null : let final Null #t24 = null in let final void #t25 = self::Extension|set#property(#t23, #t24) in #t24);
   self::expect(42, let final self::Class* #t26 = c in #t26.{self::Class::==}(null) ?{core::int*} null : let final core::int* #t27 = 42 in let final void #t28 = self::Extension|set#property(#t26, #t27) in #t27);
-  let final self::Class* #t29 = c in #t29.{self::Class::==}(null) ?{core::Null?} null : self::Extension|set#property(#t29, null);
+  let final self::Class* #t29 = c in #t29.{self::Class::==}(null) ?{Null} null : self::Extension|set#property(#t29, null);
   self::expect(null, let final self::Class* #t30 = c in #t30.{self::Class::==}(null) ?{core::int*} null : self::Extension|get#property(#t30));
   self::expect(42, let final self::Class* #t31 = c in let final core::int* #t32 = self::Extension|get#property(#t31) in #t32.{core::num::==}(null) ?{core::int*} let final core::int* #t33 = 42 in let final void #t34 = self::Extension|set#property(#t31, #t33) in #t33 : #t32);
   self::expect(42, let final self::Class* #t35 = c in let final core::int* #t36 = self::Extension|get#property(#t35) in #t36.{core::num::==}(null) ?{core::int*} let final core::int* #t37 = 87 in let final void #t38 = self::Extension|set#property(#t35, #t37) in #t37 : #t36);
-  self::expect(null, let final self::Class* #t39 = c in #t39.{self::Class::==}(null) ?{core::Null?} null : let final core::Null? #t40 = null in let final void #t41 = self::Extension|set#property(#t39, #t40) in #t40);
+  self::expect(null, let final self::Class* #t39 = c in #t39.{self::Class::==}(null) ?{Null} null : let final Null #t40 = null in let final void #t41 = self::Extension|set#property(#t39, #t40) in #t40);
   let final self::Class* #t42 = c in self::Extension|get#property(#t42).{core::num::==}(null) ?{core::int*} self::Extension|set#property(#t42, 42) : null;
   self::expect(42, let final self::Class* #t43 = c in #t43.{self::Class::==}(null) ?{core::int*} null : self::Extension|get#property(#t43));
   let final self::Class* #t44 = c in self::Extension|get#property(#t44).{core::num::==}(null) ?{core::int*} self::Extension|set#property(#t44, 87) : null;
   self::expect(42, let final self::Class* #t45 = c in #t45.{self::Class::==}(null) ?{core::int*} null : self::Extension|get#property(#t45));
-  let final self::Class* #t46 = c in #t46.{self::Class::==}(null) ?{core::Null?} null : self::Extension|set#property(#t46, null);
+  let final self::Class* #t46 = c in #t46.{self::Class::==}(null) ?{Null} null : self::Extension|set#property(#t46, null);
   self::expect(null, let final self::Class* #t47 = c in #t47.{self::Class::==}(null) ?{core::int*} null : self::Extension|get#property(#t47));
   self::expect(42, let final self::Class* #t48 = c in let final core::int* #t49 = self::Extension|get#property(#t48) in #t49.{core::num::==}(null) ?{core::int*} let final core::int* #t50 = 42 in let final void #t51 = self::Extension|set#property(#t48, #t50) in #t50 : #t49);
   self::expect(42, let final self::Class* #t52 = c in let final core::int* #t53 = self::Extension|get#property(#t52) in #t53.{core::num::==}(null) ?{core::int*} let final core::int* #t54 = 87 in let final void #t55 = self::Extension|set#property(#t52, #t54) in #t54 : #t53);
-  let final self::Class* #t56 = c in #t56.{self::Class::==}(null) ?{core::Null?} null : self::Extension|set#property(#t56, null);
+  let final self::Class* #t56 = c in #t56.{self::Class::==}(null) ?{Null} null : self::Extension|set#property(#t56, null);
   self::expect(null, let final self::Class* #t57 = c in #t57.{self::Class::==}(null) ?{core::int*} null : self::Extension|get#property(#t57));
   let final self::Class* #t58 = c in self::Extension|get#property(#t58).{core::num::==}(null) ?{core::int*} self::Extension|set#property(#t58, 42) : null;
   self::expect(42, let final self::Class* #t59 = c in #t59.{self::Class::==}(null) ?{core::int*} null : self::Extension|get#property(#t59));
   let final self::Class* #t60 = c in self::Extension|get#property(#t60).{core::num::==}(null) ?{core::int*} self::Extension|set#property(#t60, 87) : null;
   self::expect(42, let final self::Class* #t61 = c in #t61.{self::Class::==}(null) ?{core::int*} null : self::Extension|get#property(#t61));
-  let final self::Class* #t62 = c in #t62.{self::Class::==}(null) ?{core::Null?} null : self::Extension|set#property(#t62, null);
+  let final self::Class* #t62 = c in #t62.{self::Class::==}(null) ?{Null} null : self::Extension|set#property(#t62, null);
   self::Extension|testImplicitThis(c);
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
diff --git a/pkg/front_end/testcases/extensions/null_aware.dart.strong.transformed.expect b/pkg/front_end/testcases/extensions/null_aware.dart.strong.transformed.expect
index fd2532c..4697d39 100644
--- a/pkg/front_end/testcases/extensions/null_aware.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/extensions/null_aware.dart.strong.transformed.expect
@@ -56,28 +56,28 @@
   self::expect(null, tearOff.call());
   self::expect(42, let final self::Class* #t20 = c in #t20.{self::Class::==}(null) ?{core::int*} null : let final core::int* #t21 = 42 in let final void #t22 = self::Extension|set#property(#t20, #t21) in #t21);
   self::expect(42, tearOff.call());
-  self::expect(null, let final self::Class* #t23 = c in #t23.{self::Class::==}(null) ?{core::Null?} null : let final core::Null? #t24 = null in let final void #t25 = self::Extension|set#property(#t23, #t24) in #t24);
+  self::expect(null, let final self::Class* #t23 = c in #t23.{self::Class::==}(null) ?{Null} null : let final Null #t24 = null in let final void #t25 = self::Extension|set#property(#t23, #t24) in #t24);
   self::expect(42, let final self::Class* #t26 = c in #t26.{self::Class::==}(null) ?{core::int*} null : let final core::int* #t27 = 42 in let final void #t28 = self::Extension|set#property(#t26, #t27) in #t27);
-  let final self::Class* #t29 = c in #t29.{self::Class::==}(null) ?{core::Null?} null : self::Extension|set#property(#t29, null);
+  let final self::Class* #t29 = c in #t29.{self::Class::==}(null) ?{Null} null : self::Extension|set#property(#t29, null);
   self::expect(null, let final self::Class* #t30 = c in #t30.{self::Class::==}(null) ?{core::int*} null : self::Extension|get#property(#t30));
   self::expect(42, let final self::Class* #t31 = c in let final core::int* #t32 = self::Extension|get#property(#t31) in #t32.{core::num::==}(null) ?{core::int*} let final core::int* #t33 = 42 in let final void #t34 = self::Extension|set#property(#t31, #t33) in #t33 : #t32);
   self::expect(42, let final self::Class* #t35 = c in let final core::int* #t36 = self::Extension|get#property(#t35) in #t36.{core::num::==}(null) ?{core::int*} let final core::int* #t37 = 87 in let final void #t38 = self::Extension|set#property(#t35, #t37) in #t37 : #t36);
-  self::expect(null, let final self::Class* #t39 = c in #t39.{self::Class::==}(null) ?{core::Null?} null : let final core::Null? #t40 = null in let final void #t41 = self::Extension|set#property(#t39, #t40) in #t40);
+  self::expect(null, let final self::Class* #t39 = c in #t39.{self::Class::==}(null) ?{Null} null : let final Null #t40 = null in let final void #t41 = self::Extension|set#property(#t39, #t40) in #t40);
   let final self::Class* #t42 = c in self::Extension|get#property(#t42).{core::num::==}(null) ?{core::int*} self::Extension|set#property(#t42, 42) : null;
   self::expect(42, let final self::Class* #t43 = c in #t43.{self::Class::==}(null) ?{core::int*} null : self::Extension|get#property(#t43));
   let final self::Class* #t44 = c in self::Extension|get#property(#t44).{core::num::==}(null) ?{core::int*} self::Extension|set#property(#t44, 87) : null;
   self::expect(42, let final self::Class* #t45 = c in #t45.{self::Class::==}(null) ?{core::int*} null : self::Extension|get#property(#t45));
-  let final self::Class* #t46 = c in #t46.{self::Class::==}(null) ?{core::Null?} null : self::Extension|set#property(#t46, null);
+  let final self::Class* #t46 = c in #t46.{self::Class::==}(null) ?{Null} null : self::Extension|set#property(#t46, null);
   self::expect(null, let final self::Class* #t47 = c in #t47.{self::Class::==}(null) ?{core::int*} null : self::Extension|get#property(#t47));
   self::expect(42, let final self::Class* #t48 = c in let final core::int* #t49 = self::Extension|get#property(#t48) in #t49.{core::num::==}(null) ?{core::int*} let final core::int* #t50 = 42 in let final void #t51 = self::Extension|set#property(#t48, #t50) in #t50 : #t49);
   self::expect(42, let final self::Class* #t52 = c in let final core::int* #t53 = self::Extension|get#property(#t52) in #t53.{core::num::==}(null) ?{core::int*} let final core::int* #t54 = 87 in let final void #t55 = self::Extension|set#property(#t52, #t54) in #t54 : #t53);
-  let final self::Class* #t56 = c in #t56.{self::Class::==}(null) ?{core::Null?} null : self::Extension|set#property(#t56, null);
+  let final self::Class* #t56 = c in #t56.{self::Class::==}(null) ?{Null} null : self::Extension|set#property(#t56, null);
   self::expect(null, let final self::Class* #t57 = c in #t57.{self::Class::==}(null) ?{core::int*} null : self::Extension|get#property(#t57));
   let final self::Class* #t58 = c in self::Extension|get#property(#t58).{core::num::==}(null) ?{core::int*} self::Extension|set#property(#t58, 42) : null;
   self::expect(42, let final self::Class* #t59 = c in #t59.{self::Class::==}(null) ?{core::int*} null : self::Extension|get#property(#t59));
   let final self::Class* #t60 = c in self::Extension|get#property(#t60).{core::num::==}(null) ?{core::int*} self::Extension|set#property(#t60, 87) : null;
   self::expect(42, let final self::Class* #t61 = c in #t61.{self::Class::==}(null) ?{core::int*} null : self::Extension|get#property(#t61));
-  let final self::Class* #t62 = c in #t62.{self::Class::==}(null) ?{core::Null?} null : self::Extension|set#property(#t62, null);
+  let final self::Class* #t62 = c in #t62.{self::Class::==}(null) ?{Null} null : self::Extension|set#property(#t62, null);
   self::Extension|testImplicitThis(c);
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
diff --git a/pkg/front_end/testcases/extensions/type_variable_bound.dart b/pkg/front_end/testcases/extensions/type_variable_bound.dart
new file mode 100644
index 0000000..f547bad
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/type_variable_bound.dart
@@ -0,0 +1,38 @@
+// Copyright (c) 2020, 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.
+
+// @dart=2.8
+
+extension Extension<T> on T {
+  T method1() => this;
+}
+
+extension BoundExtension<T extends Class> on T {
+  T method2() => this;
+}
+
+class Class {}
+
+class SubClass extends Class {}
+
+Class test1<T>(T t1) {
+  if (t1 is SubClass) {
+    return t1.method1();
+  }
+  return new Class();
+}
+
+test2<T extends Class>(T t2) {
+  if (T == SubClass) {
+    SubClass subClass = t2.method2();
+  }
+}
+
+test3<T>(T t3) {
+  if (t3 is SubClass) {
+    SubClass subClass = t3.method2();
+  }
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/extensions/type_variable_bound.dart.outline.expect b/pkg/front_end/testcases/extensions/type_variable_bound.dart.outline.expect
new file mode 100644
index 0000000..6574fb9
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/type_variable_bound.dart.outline.expect
@@ -0,0 +1,46 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  synthetic constructor •() → self::Class*
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class SubClass extends self::Class {
+  synthetic constructor •() → self::SubClass*
+    ;
+}
+extension Extension<T extends core::Object* = dynamic> on T* {
+  method method1 = self::Extension|method1;
+  tearoff method1 = self::Extension|get#method1;
+}
+extension BoundExtension<T extends self::Class* = self::Class*> on T* {
+  method method2 = self::BoundExtension|method2;
+  tearoff method2 = self::BoundExtension|get#method2;
+}
+static method Extension|method1<T extends core::Object* = dynamic>(final self::Extension|method1::T* #this) → self::Extension|method1::T*
+  ;
+static method Extension|get#method1<T extends core::Object* = dynamic>(final self::Extension|get#method1::T* #this) → () →* self::Extension|get#method1::T*
+  return () → self::Extension|get#method1::T* => self::Extension|method1<self::Extension|get#method1::T*>(#this);
+static method BoundExtension|method2<T extends self::Class* = self::Class*>(final self::BoundExtension|method2::T* #this) → self::BoundExtension|method2::T*
+  ;
+static method BoundExtension|get#method2<T extends self::Class* = self::Class*>(final self::BoundExtension|get#method2::T* #this) → () →* self::BoundExtension|get#method2::T*
+  return () → self::BoundExtension|get#method2::T* => self::BoundExtension|method2<self::BoundExtension|get#method2::T*>(#this);
+static method test1<T extends core::Object* = dynamic>(self::test1::T* t1) → self::Class*
+  ;
+static method test2<T extends self::Class* = self::Class*>(self::test2::T* t2) → dynamic
+  ;
+static method test3<T extends core::Object* = dynamic>(self::test3::T* t3) → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/extensions/type_variable_bound.dart.strong.expect b/pkg/front_end/testcases/extensions/type_variable_bound.dart.strong.expect
new file mode 100644
index 0000000..14cb1a6
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/type_variable_bound.dart.strong.expect
@@ -0,0 +1,57 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  synthetic constructor •() → self::Class*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class SubClass extends self::Class {
+  synthetic constructor •() → self::SubClass*
+    : super self::Class::•()
+    ;
+}
+extension Extension<T extends core::Object* = dynamic> on T* {
+  method method1 = self::Extension|method1;
+  tearoff method1 = self::Extension|get#method1;
+}
+extension BoundExtension<T extends self::Class* = self::Class*> on T* {
+  method method2 = self::BoundExtension|method2;
+  tearoff method2 = self::BoundExtension|get#method2;
+}
+static method Extension|method1<T extends core::Object* = dynamic>(final self::Extension|method1::T* #this) → self::Extension|method1::T*
+  return #this;
+static method Extension|get#method1<T extends core::Object* = dynamic>(final self::Extension|get#method1::T* #this) → () →* self::Extension|get#method1::T*
+  return () → self::Extension|get#method1::T* => self::Extension|method1<self::Extension|get#method1::T*>(#this);
+static method BoundExtension|method2<T extends self::Class* = self::Class*>(final self::BoundExtension|method2::T* #this) → self::BoundExtension|method2::T*
+  return #this;
+static method BoundExtension|get#method2<T extends self::Class* = self::Class*>(final self::BoundExtension|get#method2::T* #this) → () →* self::BoundExtension|get#method2::T*
+  return () → self::BoundExtension|get#method2::T* => self::BoundExtension|method2<self::BoundExtension|get#method2::T*>(#this);
+static method test1<T extends core::Object* = dynamic>(self::test1::T* t1) → self::Class* {
+  if(t1 is self::SubClass*) {
+    return self::Extension|method1<self::SubClass*>(t1{self::test1::T* & self::SubClass* /* '*' & '*' = '*' */});
+  }
+  return new self::Class::•();
+}
+static method test2<T extends self::Class* = self::Class*>(self::test2::T* t2) → dynamic {
+  if(self::test2::T*.{core::Type::==}(self::SubClass*)) {
+    self::SubClass* subClass = self::BoundExtension|method2<self::Class*>(t2) as{TypeError} self::SubClass*;
+  }
+}
+static method test3<T extends core::Object* = dynamic>(self::test3::T* t3) → dynamic {
+  if(t3 is self::SubClass*) {
+    self::SubClass* subClass = self::BoundExtension|method2<self::SubClass*>(t3{self::test3::T* & self::SubClass* /* '*' & '*' = '*' */});
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extensions/type_variable_bound.dart.strong.transformed.expect b/pkg/front_end/testcases/extensions/type_variable_bound.dart.strong.transformed.expect
new file mode 100644
index 0000000..0bc41be
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/type_variable_bound.dart.strong.transformed.expect
@@ -0,0 +1,62 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  synthetic constructor •() → self::Class*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class SubClass extends self::Class {
+  synthetic constructor •() → self::SubClass*
+    : super self::Class::•()
+    ;
+}
+extension Extension<T extends core::Object* = dynamic> on T* {
+  method method1 = self::Extension|method1;
+  tearoff method1 = self::Extension|get#method1;
+}
+extension BoundExtension<T extends self::Class* = self::Class*> on T* {
+  method method2 = self::BoundExtension|method2;
+  tearoff method2 = self::BoundExtension|get#method2;
+}
+static method Extension|method1<T extends core::Object* = dynamic>(final self::Extension|method1::T* #this) → self::Extension|method1::T*
+  return #this;
+static method Extension|get#method1<T extends core::Object* = dynamic>(final self::Extension|get#method1::T* #this) → () →* self::Extension|get#method1::T*
+  return () → self::Extension|get#method1::T* => self::Extension|method1<self::Extension|get#method1::T*>(#this);
+static method BoundExtension|method2<T extends self::Class* = self::Class*>(final self::BoundExtension|method2::T* #this) → self::BoundExtension|method2::T*
+  return #this;
+static method BoundExtension|get#method2<T extends self::Class* = self::Class*>(final self::BoundExtension|get#method2::T* #this) → () →* self::BoundExtension|get#method2::T*
+  return () → self::BoundExtension|get#method2::T* => self::BoundExtension|method2<self::BoundExtension|get#method2::T*>(#this);
+static method test1<T extends core::Object* = dynamic>(self::test1::T* t1) → self::Class* {
+  if(t1 is self::SubClass*) {
+    return self::Extension|method1<self::SubClass*>(t1{self::test1::T* & self::SubClass* /* '*' & '*' = '*' */});
+  }
+  return new self::Class::•();
+}
+static method test2<T extends self::Class* = self::Class*>(self::test2::T* t2) → dynamic {
+  if(self::test2::T*.{core::Type::==}(self::SubClass*)) {
+    self::SubClass* subClass = self::BoundExtension|method2<self::Class*>(t2) as{TypeError} self::SubClass*;
+  }
+}
+static method test3<T extends core::Object* = dynamic>(self::test3::T* t3) → dynamic {
+  if(t3 is self::SubClass*) {
+    self::SubClass* subClass = self::BoundExtension|method2<self::SubClass*>(t3{self::test3::T* & self::SubClass* /* '*' & '*' = '*' */});
+  }
+}
+static method main() → dynamic {}
+
+
+Extra constant evaluation status:
+Evaluated: TypeLiteral @ org-dartlang-testcase:///type_variable_bound.dart:27:12 -> TypeLiteralConstant(SubClass*)
+Extra constant evaluation: evaluated: 23, effectively constant: 1
diff --git a/pkg/front_end/testcases/extensions/type_variable_bound.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/type_variable_bound.dart.textual_outline.expect
new file mode 100644
index 0000000..a9b3ce3
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/type_variable_bound.dart.textual_outline.expect
@@ -0,0 +1,11 @@
+// @dart = 2.8
+extension Extension<T> (){}
+on T (){}
+extension BoundExtension<T extends Class> (){}
+on T (){}
+class Class {}
+class SubClass extends Class {}
+Class test1<T>(T t1) {}
+test2<T extends Class>(T t2) {}
+test3<T>(T t3) {}
+main() {}
diff --git a/pkg/front_end/testcases/general/abstract_overrides_concrete.dart.outline.expect b/pkg/front_end/testcases/general/abstract_overrides_concrete.dart.outline.expect
index 8352c73..2f6b693 100644
--- a/pkg/front_end/testcases/general/abstract_overrides_concrete.dart.outline.expect
+++ b/pkg/front_end/testcases/general/abstract_overrides_concrete.dart.outline.expect
@@ -78,12 +78,12 @@
 class D extends self::A implements self::I {
   synthetic constructor •() → self::D*
     ;
-  abstract forwarding-stub method foo([dynamic a]) → void;
+  abstract member-signature method foo([dynamic a]) → void; -> self::I::foo
 }
 abstract class E extends self::A implements self::I {
   synthetic constructor •() → self::E*
     ;
-  abstract forwarding-stub method foo([dynamic a]) → void;
+  abstract member-signature method foo([dynamic a]) → void; -> self::I::foo
 }
 class F extends self::E {
   synthetic constructor •() → self::F*
diff --git a/pkg/front_end/testcases/general/abstract_overrides_concrete.dart.strong.expect b/pkg/front_end/testcases/general/abstract_overrides_concrete.dart.strong.expect
index 50a2d15..0529482 100644
--- a/pkg/front_end/testcases/general/abstract_overrides_concrete.dart.strong.expect
+++ b/pkg/front_end/testcases/general/abstract_overrides_concrete.dart.strong.expect
@@ -82,13 +82,13 @@
   synthetic constructor •() → self::D*
     : super self::A::•()
     ;
-  abstract forwarding-stub method foo([dynamic a = #C1]) → void;
+  abstract member-signature method foo([dynamic a = #C1]) → void; -> self::I::foo
 }
 abstract class E extends self::A implements self::I {
   synthetic constructor •() → self::E*
     : super self::A::•()
     ;
-  abstract forwarding-stub method foo([dynamic a = #C1]) → void;
+  abstract member-signature method foo([dynamic a = #C1]) → void; -> self::I::foo
 }
 class F extends self::E {
   synthetic constructor •() → self::F*
diff --git a/pkg/front_end/testcases/general/abstract_overrides_concrete.dart.strong.transformed.expect b/pkg/front_end/testcases/general/abstract_overrides_concrete.dart.strong.transformed.expect
index 50a2d15..0529482 100644
--- a/pkg/front_end/testcases/general/abstract_overrides_concrete.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/abstract_overrides_concrete.dart.strong.transformed.expect
@@ -82,13 +82,13 @@
   synthetic constructor •() → self::D*
     : super self::A::•()
     ;
-  abstract forwarding-stub method foo([dynamic a = #C1]) → void;
+  abstract member-signature method foo([dynamic a = #C1]) → void; -> self::I::foo
 }
 abstract class E extends self::A implements self::I {
   synthetic constructor •() → self::E*
     : super self::A::•()
     ;
-  abstract forwarding-stub method foo([dynamic a = #C1]) → void;
+  abstract member-signature method foo([dynamic a = #C1]) → void; -> self::I::foo
 }
 class F extends self::E {
   synthetic constructor •() → self::F*
diff --git a/pkg/front_end/testcases/general/annotation_variable_declaration.dart.strong.expect b/pkg/front_end/testcases/general/annotation_variable_declaration.dart.strong.expect
index 0aaa824..4c86065 100644
--- a/pkg/front_end/testcases/general/annotation_variable_declaration.dart.strong.expect
+++ b/pkg/front_end/testcases/general/annotation_variable_declaration.dart.strong.expect
@@ -35,9 +35,9 @@
     @#C1 core::String* localWithInitializer = "hello";
     @#C1 @#C2 dynamic localGroupPart1;
     @#C1 @#C2 dynamic localGroupPart2;
-    function naebdyr(@#C1 dynamic nestedFormal) → core::Null?
+    function naebdyr(@#C1 dynamic nestedFormal) → Null
       return null;
-    (dynamic) →* core::Null? roedmus = (@#C1 dynamic closureFormal) → core::Null? => null;
+    (dynamic) →* Null roedmus = (@#C1 dynamic closureFormal) → Null => null;
   }
   method hest({@#C1 dynamic named = #C3}) → dynamic
     return null;
diff --git a/pkg/front_end/testcases/general/annotation_variable_declaration.dart.strong.transformed.expect b/pkg/front_end/testcases/general/annotation_variable_declaration.dart.strong.transformed.expect
index 0aaa824..4c86065 100644
--- a/pkg/front_end/testcases/general/annotation_variable_declaration.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/annotation_variable_declaration.dart.strong.transformed.expect
@@ -35,9 +35,9 @@
     @#C1 core::String* localWithInitializer = "hello";
     @#C1 @#C2 dynamic localGroupPart1;
     @#C1 @#C2 dynamic localGroupPart2;
-    function naebdyr(@#C1 dynamic nestedFormal) → core::Null?
+    function naebdyr(@#C1 dynamic nestedFormal) → Null
       return null;
-    (dynamic) →* core::Null? roedmus = (@#C1 dynamic closureFormal) → core::Null? => null;
+    (dynamic) →* Null roedmus = (@#C1 dynamic closureFormal) → Null => null;
   }
   method hest({@#C1 dynamic named = #C3}) → dynamic
     return null;
diff --git a/pkg/front_end/testcases/general/assert_super.dart b/pkg/front_end/testcases/general/assert_super.dart
deleted file mode 100644
index 93a32ef..0000000
--- a/pkg/front_end/testcases/general/assert_super.dart
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright (c) 2020, 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.
-
-class Super {
-  bool get property => true;
-}
-
-class Class extends Super {
-  Class() : assert(property);
-}
-
-main() {}
diff --git a/pkg/front_end/testcases/general/assert_super.dart.outline.expect b/pkg/front_end/testcases/general/assert_super.dart.outline.expect
deleted file mode 100644
index 309b5d0..0000000
--- a/pkg/front_end/testcases/general/assert_super.dart.outline.expect
+++ /dev/null
@@ -1,26 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class Super extends core::Object {
-  synthetic constructor •() → self::Super*
-    ;
-  get property() → core::bool*
-    ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
-}
-class Class extends self::Super {
-  constructor •() → self::Class*
-    ;
-}
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/general/assert_super.dart.strong.expect b/pkg/front_end/testcases/general/assert_super.dart.strong.expect
deleted file mode 100644
index 59fd8cc..0000000
--- a/pkg/front_end/testcases/general/assert_super.dart.strong.expect
+++ /dev/null
@@ -1,27 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class Super extends core::Object {
-  synthetic constructor •() → self::Super*
-    : super core::Object::•()
-    ;
-  get property() → core::bool*
-    return true;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
-}
-class Class extends self::Super {
-  constructor •() → self::Class*
-    : assert(this.{self::Super::property}), super self::Super::•()
-    ;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/assert_super.dart.strong.transformed.expect b/pkg/front_end/testcases/general/assert_super.dart.strong.transformed.expect
deleted file mode 100644
index 59fd8cc..0000000
--- a/pkg/front_end/testcases/general/assert_super.dart.strong.transformed.expect
+++ /dev/null
@@ -1,27 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class Super extends core::Object {
-  synthetic constructor •() → self::Super*
-    : super core::Object::•()
-    ;
-  get property() → core::bool*
-    return true;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
-}
-class Class extends self::Super {
-  constructor •() → self::Class*
-    : assert(this.{self::Super::property}), super self::Super::•()
-    ;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/assert_super.dart.textual_outline.expect b/pkg/front_end/testcases/general/assert_super.dart.textual_outline.expect
deleted file mode 100644
index c320010..0000000
--- a/pkg/front_end/testcases/general/assert_super.dart.textual_outline.expect
+++ /dev/null
@@ -1,9 +0,0 @@
-class Super {
-  bool get property => true;
-}
-
-class Class extends Super {
-  Class() : assert(property);
-}
-
-main() {}
diff --git a/pkg/front_end/testcases/general/assert_super.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/assert_super.dart.textual_outline_modelled.expect
deleted file mode 100644
index aa85ac3..0000000
--- a/pkg/front_end/testcases/general/assert_super.dart.textual_outline_modelled.expect
+++ /dev/null
@@ -1,9 +0,0 @@
-class Class extends Super {
-  Class() : assert(property);
-}
-
-class Super {
-  bool get property => true;
-}
-
-main() {}
diff --git a/pkg/front_end/testcases/general/assign_to_initializing_formal.dart.strong.expect b/pkg/front_end/testcases/general/assign_to_initializing_formal.dart.strong.expect
index bd5a601..49729e1 100644
--- a/pkg/front_end/testcases/general/assign_to_initializing_formal.dart.strong.expect
+++ b/pkg/front_end/testcases/general/assign_to_initializing_formal.dart.strong.expect
@@ -15,7 +15,7 @@
   field dynamic x;
   field dynamic y;
   constructor •(dynamic x) → self::A*
-    : self::A::x = x, self::A::y = () → core::Null? {
+    : self::A::x = x, self::A::y = () → Null {
       invalid-expression "pkg/front_end/testcases/general/assign_to_initializing_formal.dart:13:11: Error: Can't assign to the final variable 'x'.
           x = 3;
           ^";
diff --git a/pkg/front_end/testcases/general/assign_to_initializing_formal.dart.strong.transformed.expect b/pkg/front_end/testcases/general/assign_to_initializing_formal.dart.strong.transformed.expect
index bd5a601..49729e1 100644
--- a/pkg/front_end/testcases/general/assign_to_initializing_formal.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/assign_to_initializing_formal.dart.strong.transformed.expect
@@ -15,7 +15,7 @@
   field dynamic x;
   field dynamic y;
   constructor •(dynamic x) → self::A*
-    : self::A::x = x, self::A::y = () → core::Null? {
+    : self::A::x = x, self::A::y = () → Null {
       invalid-expression "pkg/front_end/testcases/general/assign_to_initializing_formal.dart:13:11: Error: Can't assign to the final variable 'x'.
           x = 3;
           ^";
diff --git a/pkg/front_end/testcases/general/async_function.dart.strong.transformed.expect b/pkg/front_end/testcases/general/async_function.dart.strong.transformed.expect
index d341b2a..3382485 100644
--- a/pkg/front_end/testcases/general/async_function.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/async_function.dart.strong.transformed.expect
@@ -8,7 +8,8 @@
 
 static field core::List<core::String*>* stringList = <core::String*>["bar"];
 static method asyncString() → asy::Future<core::String*>* /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::String*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::String*>();
+  final asy::_Future<core::String*>* :async_future = new asy::_Future::•<core::String*>();
+  core::bool* :is_sync = false;
   FutureOr<core::String*>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -22,20 +23,22 @@
         :return_value = "foo";
         break #L1;
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method asyncString2() → asy::Future<core::String*>* /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::String*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::String*>();
+  final asy::_Future<core::String*>* :async_future = new asy::_Future::•<core::String*>();
+  core::bool* :is_sync = false;
   FutureOr<core::String*>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -49,23 +52,24 @@
         :return_value = self::asyncString();
         break #L2;
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method syncStarString() → core::Iterable<core::String*>* /* originally sync* */ {
-  function :sync_op_gen() → (core::_SyncIterator<dynamic>*) →* core::bool* {
+  function :sync_op_gen() → (core::_SyncIterator<dynamic>*, dynamic, dynamic) →* core::bool* {
     core::int* :await_jump_var = 0;
     dynamic :await_ctx_var;
-    return (core::_SyncIterator<dynamic>* :iterator) → core::bool* yielding {
+    function :sync_op(core::_SyncIterator<dynamic>* :iterator, dynamic :exception, dynamic :stack_trace) → core::bool* yielding {
       {
         {
           :iterator.{core::_SyncIterator::_current} = "foo";
@@ -81,15 +85,16 @@
         }
       }
       return false;
-    };
+    }
+    return :sync_op;
   }
   return new core::_SyncIterable::•<core::String*>(:sync_op_gen);
 }
 static method syncStarString2() → core::Iterable<core::String*>* /* originally sync* */ {
-  function :sync_op_gen() → (core::_SyncIterator<dynamic>*) →* core::bool* {
+  function :sync_op_gen() → (core::_SyncIterator<dynamic>*, dynamic, dynamic) →* core::bool* {
     core::int* :await_jump_var = 0;
     dynamic :await_ctx_var;
-    return (core::_SyncIterator<dynamic>* :iterator) → core::bool* yielding {
+    function :sync_op(core::_SyncIterator<dynamic>* :iterator, dynamic :exception, dynamic :stack_trace) → core::bool* yielding {
       {
         {
           :iterator.{core::_SyncIterator::_current} = "foo";
@@ -97,7 +102,8 @@
         }
       }
       return false;
-    };
+    }
+    return :sync_op;
   }
   return new core::_SyncIterable::•<core::String*>(:sync_op_gen);
 }
@@ -181,7 +187,8 @@
   return :controller_stream;
 }
 static method main() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic>* :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -196,15 +203,16 @@
         [yield] let dynamic #t2 = asy::_awaitHelper(self::asyncString(), :async_op_then, :async_op_error, :async_op) in null;
         core::String* str = _in::unsafeCast<core::String*>(:result);
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
diff --git a/pkg/front_end/testcases/general/async_nested.dart.strong.transformed.expect b/pkg/front_end/testcases/general/async_nested.dart.strong.transformed.expect
index 672a96f..772b468 100644
--- a/pkg/front_end/testcases/general/async_nested.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/async_nested.dart.strong.transformed.expect
@@ -28,7 +28,8 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 static method main() → void /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic>* :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -62,17 +63,18 @@
           throw "Expected '${expected}' but got '${actual}'";
         }
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 
 constants  {
diff --git a/pkg/front_end/testcases/general/await.dart.strong.transformed.expect b/pkg/front_end/testcases/general/await.dart.strong.transformed.expect
index 7d6f5ee..9bac1f2 100644
--- a/pkg/front_end/testcases/general/await.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/await.dart.strong.transformed.expect
@@ -5,7 +5,8 @@
 import "dart:_internal" as _in;
 
 static method main() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic>* :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -20,15 +21,16 @@
         [yield] let dynamic #t1 = asy::_awaitHelper("Hello, World!", :async_op_then, :async_op_error, :async_op) in null;
         core::print(_in::unsafeCast<core::String*>(:result));
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
diff --git a/pkg/front_end/testcases/general/await_complex.dart.strong.transformed.expect b/pkg/front_end/testcases/general/await_complex.dart.strong.transformed.expect
index addb806..d6a8b95 100644
--- a/pkg/front_end/testcases/general/await_complex.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/await_complex.dart.strong.transformed.expect
@@ -57,7 +57,8 @@
 static method dummy() → dynamic
   return 1;
 static method staticMembers() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic>* :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -100,20 +101,22 @@
         core::num* e = _in::unsafeCast<core::int*>(:async_temporary_5).{core::num::+}(:result as{TypeError,ForDynamic} core::num);
         self::expect(5, e);
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method topLevelMembers() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic>* :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -151,20 +154,22 @@
         core::num* e = _in::unsafeCast<core::int*>(:async_temporary_4).{core::num::+}(:result as{TypeError,ForDynamic} core::num);
         self::expect(5, e);
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method instanceMembers() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic>* :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -203,20 +208,22 @@
         core::num* e = _in::unsafeCast<core::int*>(:async_temporary_4).{core::num::+}(:result as{TypeError,ForDynamic} core::num);
         self::expect(5, e);
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method others() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic>* :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -255,20 +262,22 @@
         core::num* e = _in::unsafeCast<core::int*>(:async_temporary_4).{core::num::+}(:result as{TypeError,ForDynamic} core::num);
         self::expect(2, e);
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method conditionals() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic>* :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -327,20 +336,22 @@
         on dynamic catch(final dynamic e) {
         }
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method asserts() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic>* :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -400,20 +411,22 @@
           }
         }
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method controlFlow() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic>* :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -546,7 +559,8 @@
                 }
               }
               [yield] let dynamic #t51 = asy::_awaitHelper((() → asy::Future<dynamic>* /* originally async */ {
-                final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+                final asy::_Future<dynamic>* :async_future = new asy::_Future::•<dynamic>();
+                core::bool* :is_sync = false;
                 FutureOr<dynamic>* :return_value;
                 dynamic :async_stack_trace;
                 (dynamic) →* dynamic :async_op_then;
@@ -562,21 +576,23 @@
                       :return_value = :result;
                       break #L13;
                     }
-                    asy::_completeOnAsyncReturn(:async_completer, :return_value);
+                    asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
                     return;
                   }
                   on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-                    :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+                    asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
                   }
                 :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
                 :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
                 :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-                :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-                return :async_completer.{asy::Completer::future};
+                :async_op.call();
+                :is_sync = true;
+                return :async_future;
               }).call(), :async_op_then, :async_op_error, :async_op) in null;
               self::expect(42, :result);
               [yield] let dynamic #t53 = asy::_awaitHelper((() → asy::Future<dynamic>* /* originally async */ {
-                final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+                final asy::_Future<dynamic>* :async_future = new asy::_Future::•<dynamic>();
+                core::bool* :is_sync = false;
                 FutureOr<dynamic>* :return_value;
                 dynamic :async_stack_trace;
                 (dynamic) →* dynamic :async_op_then;
@@ -590,17 +606,18 @@
                       :return_value = func.call<dynamic>(42);
                       break #L14;
                     }
-                    asy::_completeOnAsyncReturn(:async_completer, :return_value);
+                    asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
                     return;
                   }
                   on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-                    :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+                    asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
                   }
                 :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
                 :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
                 :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-                :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-                return :async_completer.{asy::Completer::future};
+                :async_op.call();
+                :is_sync = true;
+                return :async_future;
               }).call(), :async_op_then, :async_op_error, :async_op) in null;
               self::expect(42, :result);
               function testStream1() → asy::Stream<core::int*>* /* originally async* */ {
@@ -685,20 +702,22 @@
           }
         }
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method future<T extends core::Object* = dynamic>(self::future::T* value) → FutureOr<self::future::T*>* /* originally async */ {
-  final asy::_AsyncAwaitCompleter<self::future::T*>* :async_completer = new asy::_AsyncAwaitCompleter::•<self::future::T*>();
+  final asy::_Future<self::future::T*>* :async_future = new asy::_Future::•<self::future::T*>();
+  core::bool* :is_sync = false;
   FutureOr<self::future::T*>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -712,17 +731,18 @@
         :return_value = value;
         break #L17;
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method id<T extends core::Object* = dynamic>(self::id::T* value) → FutureOr<self::id::T*>*
   return value;
@@ -762,7 +782,8 @@
   return :controller_stream;
 }
 static method main() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic>* :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -791,17 +812,18 @@
           :result;
         }
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
   if(!expected.{core::Object::==}(actual))
diff --git a/pkg/front_end/testcases/general/await_in_cascade.dart.strong.transformed.expect b/pkg/front_end/testcases/general/await_in_cascade.dart.strong.transformed.expect
index 7c1f7a3..fe03b1d 100644
--- a/pkg/front_end/testcases/general/await_in_cascade.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/await_in_cascade.dart.strong.transformed.expect
@@ -11,7 +11,8 @@
     : super core::Object::•()
     ;
   method m() → asy::Future<core::List<core::int*>*>* /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::List<core::int*>*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::List<core::int*>*>();
+    final asy::_Future<core::List<core::int*>*>* :async_future = new asy::_Future::•<core::List<core::int*>*>();
+    core::bool* :is_sync = false;
     FutureOr<core::List<core::int*>*>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -29,20 +30,22 @@
           :return_value = block {} =>#t1;
           break #L1;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   }
   method _m() → asy::Future<core::int*>* /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    final asy::_Future<core::int*>* :async_future = new asy::_Future::•<core::int*>();
+    core::bool* :is_sync = false;
     FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -56,17 +59,18 @@
           :return_value = 42;
           break #L2;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   }
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -80,7 +84,8 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 static method main() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic>* :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -95,17 +100,18 @@
         [yield] let dynamic #t3 = asy::_awaitHelper(new self::C::•().{self::C::m}(), :async_op_then, :async_op_error, :async_op) in null;
         self::expect(42, _in::unsafeCast<core::List<core::int*>*>(:result).{core::Iterable::first});
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
   if(!expected.{core::Object::==}(actual))
diff --git a/pkg/front_end/testcases/general/bug33099.dart.strong.expect b/pkg/front_end/testcases/general/bug33099.dart.strong.expect
index e224292..6e4306c 100644
--- a/pkg/front_end/testcases/general/bug33099.dart.strong.expect
+++ b/pkg/front_end/testcases/general/bug33099.dart.strong.expect
@@ -60,7 +60,7 @@
 static const field self::_FailingTest* failingTest = #C1;
 static method main() → dynamic {
   mir::ClassMirror* classMirror = mir::reflectClass(self::MyTest2*);
-  classMirror.{mir::ClassMirror::instanceMembers}.{core::Map::forEach}((core::Symbol* symbol, mir::MethodMirror* memberMirror) → core::Null? {
+  classMirror.{mir::ClassMirror::instanceMembers}.{core::Map::forEach}((core::Symbol* symbol, mir::MethodMirror* memberMirror) → Null {
     if(memberMirror.{mir::DeclarationMirror::simpleName}.{core::Symbol::==}(#C2)) {
       core::print(memberMirror);
       core::print(self::_hasFailingTestAnnotation(memberMirror));
diff --git a/pkg/front_end/testcases/general/bug33099.dart.strong.transformed.expect b/pkg/front_end/testcases/general/bug33099.dart.strong.transformed.expect
index 2f10dab..1c01215 100644
--- a/pkg/front_end/testcases/general/bug33099.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/bug33099.dart.strong.transformed.expect
@@ -62,7 +62,7 @@
 static const field self::_FailingTest* failingTest = #C1;
 static method main() → dynamic {
   mir::ClassMirror* classMirror = mir::reflectClass(self::MyTest2*);
-  classMirror.{mir::ClassMirror::instanceMembers}.{core::Map::forEach}((core::Symbol* symbol, mir::MethodMirror* memberMirror) → core::Null? {
+  classMirror.{mir::ClassMirror::instanceMembers}.{core::Map::forEach}((core::Symbol* symbol, mir::MethodMirror* memberMirror) → Null {
     if(memberMirror.{mir::DeclarationMirror::simpleName}.{core::Symbol::==}(#C2)) {
       core::print(memberMirror);
       core::print(self::_hasFailingTestAnnotation(memberMirror));
diff --git a/pkg/front_end/testcases/general/bug33196.dart.strong.transformed.expect b/pkg/front_end/testcases/general/bug33196.dart.strong.transformed.expect
index 79fa612..fe416ab 100644
--- a/pkg/front_end/testcases/general/bug33196.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/bug33196.dart.strong.transformed.expect
@@ -10,7 +10,8 @@
   core::print(result.{core::Object::runtimeType});
 }
 static method returnsString() → FutureOr<core::String*>* /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::String*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::String*>();
+  final asy::_Future<core::String*>* :async_future = new asy::_Future::•<core::String*>();
+  core::bool* :is_sync = false;
   FutureOr<core::String*>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -24,15 +25,16 @@
         :return_value = "oh no";
         break #L1;
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
diff --git a/pkg/front_end/testcases/general/bug33206.dart.strong.transformed.expect b/pkg/front_end/testcases/general/bug33206.dart.strong.transformed.expect
index a6aaad8..389811c 100644
--- a/pkg/front_end/testcases/general/bug33206.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/bug33206.dart.strong.transformed.expect
@@ -41,7 +41,8 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 static method f1() → asy::Future<core::List<core::Object*>*>* /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::List<core::Object*>*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::List<core::Object*>*>();
+  final asy::_Future<core::List<core::Object*>*>* :async_future = new asy::_Future::•<core::List<core::Object*>*>();
+  core::bool* :is_sync = false;
   FutureOr<core::List<core::Object*>*>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -55,22 +56,24 @@
         :return_value = <core::Object*>[1];
         break #L1;
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method f2() → core::List<core::Object*>*
   return <core::Object*>[2];
 static method f3() → asy::Future<core::Object*>* /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::Object*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::Object*>();
+  final asy::_Future<core::Object*>* :async_future = new asy::_Future::•<core::Object*>();
+  core::bool* :is_sync = false;
   FutureOr<core::Object*>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -84,20 +87,22 @@
         :return_value = 3;
         break #L2;
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method foo() → asy::Future<self::X*>* /* originally async */ {
-  final asy::_AsyncAwaitCompleter<self::X*>* :async_completer = new asy::_AsyncAwaitCompleter::•<self::X*>();
+  final asy::_Future<self::X*>* :async_future = new asy::_Future::•<self::X*>();
+  core::bool* :is_sync = false;
   FutureOr<self::X*>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -120,20 +125,22 @@
         :return_value = new self::X::•(_in::unsafeCast<self::Y*>(:async_temporary_0), _in::unsafeCast<core::Object*>(:result));
         break #L3;
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method main() → asy::Future<void>* /* originally async */ {
-  final asy::_AsyncAwaitCompleter<void>* :async_completer = new asy::_AsyncAwaitCompleter::•<void>();
+  final asy::_Future<void>* :async_future = new asy::_Future::•<void>();
+  core::bool* :is_sync = false;
   FutureOr<void>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -148,15 +155,16 @@
         [yield] let dynamic #t4 = asy::_awaitHelper(self::foo(), :async_op_then, :async_op_error, :async_op) in null;
         core::print(_in::unsafeCast<self::X*>(:result));
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
diff --git a/pkg/front_end/testcases/general/bug37476.dart.strong.expect b/pkg/front_end/testcases/general/bug37476.dart.strong.expect
index cf2e1f7..112e0e4 100644
--- a/pkg/front_end/testcases/general/bug37476.dart.strong.expect
+++ b/pkg/front_end/testcases/general/bug37476.dart.strong.expect
@@ -8,7 +8,7 @@
     ;
   method foo() → <S extends self::A::T* = dynamic>(S*) →* void {
     core::print("foo: T = ${self::A::T*}");
-    return <S extends self::A::T* = self::A::T*>(S* a) → core::Null? {};
+    return <S extends self::A::T* = self::A::T*>(S* a) → Null {};
   }
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -27,7 +27,7 @@
     ;
   method foo() → (self::B::T*) →* void {
     core::print("foo: T = ${self::B::T*}");
-    return (self::B::T* a) → core::Null? {};
+    return (self::B::T* a) → Null {};
   }
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
diff --git a/pkg/front_end/testcases/general/bug37476.dart.strong.transformed.expect b/pkg/front_end/testcases/general/bug37476.dart.strong.transformed.expect
index cf2e1f7..112e0e4 100644
--- a/pkg/front_end/testcases/general/bug37476.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/bug37476.dart.strong.transformed.expect
@@ -8,7 +8,7 @@
     ;
   method foo() → <S extends self::A::T* = dynamic>(S*) →* void {
     core::print("foo: T = ${self::A::T*}");
-    return <S extends self::A::T* = self::A::T*>(S* a) → core::Null? {};
+    return <S extends self::A::T* = self::A::T*>(S* a) → Null {};
   }
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -27,7 +27,7 @@
     ;
   method foo() → (self::B::T*) →* void {
     core::print("foo: T = ${self::B::T*}");
-    return (self::B::T* a) → core::Null? {};
+    return (self::B::T* a) → Null {};
   }
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
diff --git a/pkg/front_end/testcases/general/build_issue_2688.dart b/pkg/front_end/testcases/general/build_issue_2688.dart
new file mode 100644
index 0000000..016f457
--- /dev/null
+++ b/pkg/front_end/testcases/general/build_issue_2688.dart
@@ -0,0 +1,129 @@
+// Copyright (c) 2020, 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.
+
+// Regression test for https://github.com/dart-lang/build/issues/2688
+
+mixin M0 {
+  int get property;
+}
+mixin M1 implements M0 {
+  int get property;
+}
+mixin M2 implements M1 {
+  int get property;
+}
+mixin M3 implements M2 {
+  int get property;
+}
+mixin M4 implements M3 {
+  int get property;
+}
+mixin M5 implements M4 {
+  int get property;
+}
+mixin M6 implements M5 {
+  int get property;
+}
+mixin M7 implements M6 {
+  int get property;
+}
+mixin M8 implements M7 {
+  int get property;
+}
+mixin M9 implements M8 {
+  int get property;
+}
+mixin M10 implements M9 {
+  int get property;
+}
+mixin M11 implements M10 {
+  int get property;
+}
+mixin M12 implements M11 {
+  int get property;
+}
+mixin M13 implements M12 {
+  int get property;
+}
+mixin M14 implements M13 {
+  int get property;
+}
+mixin M15 implements M14 {
+  int get property;
+}
+mixin M16 implements M15 {
+  int get property;
+}
+mixin M17 implements M16 {
+  int get property;
+}
+mixin M18 implements M17 {
+  int get property;
+}
+mixin M19 implements M18 {
+  int get property;
+}
+mixin M20 implements M19 {
+  int get property;
+}
+mixin M21 implements M20 {
+  int get property;
+}
+mixin M22 implements M21 {
+  int get property;
+}
+mixin M23 implements M22 {
+  int get property;
+}
+mixin M24 implements M23 {
+  int get property;
+}
+mixin M25 implements M24 {
+  int get property;
+}
+mixin M26 implements M25 {
+  int get property;
+}
+mixin M27 implements M26 {
+  int get property;
+}
+
+abstract class Super {
+  int get property;
+}
+
+class Class extends Super
+    with
+        M0,
+        M1,
+        M2,
+        M3,
+        M4,
+        M5,
+        M6,
+        M7,
+        M8,
+        M9,
+        M10,
+        M11,
+        M12,
+        M13,
+        M14,
+        M15,
+        M16,
+        M17,
+        M18,
+        M19,
+        M20,
+        M21,
+        M22,
+        M23,
+        M24,
+        M25,
+        M26,
+        M27 {
+  int get property => 0;
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/build_issue_2688.dart.outline.expect b/pkg/front_end/testcases/general/build_issue_2688.dart.outline.expect
new file mode 100644
index 0000000..43701f7
--- /dev/null
+++ b/pkg/front_end/testcases/general/build_issue_2688.dart.outline.expect
@@ -0,0 +1,531 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class M0 extends core::Object /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M1 extends core::Object implements self::M0 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M2 extends core::Object implements self::M1 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M3 extends core::Object implements self::M2 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M4 extends core::Object implements self::M3 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M5 extends core::Object implements self::M4 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M6 extends core::Object implements self::M5 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M7 extends core::Object implements self::M6 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M8 extends core::Object implements self::M7 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M9 extends core::Object implements self::M8 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M10 extends core::Object implements self::M9 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M11 extends core::Object implements self::M10 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M12 extends core::Object implements self::M11 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M13 extends core::Object implements self::M12 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M14 extends core::Object implements self::M13 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M15 extends core::Object implements self::M14 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M16 extends core::Object implements self::M15 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M17 extends core::Object implements self::M16 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M18 extends core::Object implements self::M17 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M19 extends core::Object implements self::M18 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M20 extends core::Object implements self::M19 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M21 extends core::Object implements self::M20 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M22 extends core::Object implements self::M21 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M23 extends core::Object implements self::M22 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M24 extends core::Object implements self::M23 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M25 extends core::Object implements self::M24 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M26 extends core::Object implements self::M25 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M27 extends core::Object implements self::M26 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class Super extends core::Object {
+  synthetic constructor •() → self::Super*
+    ;
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _Class&Super&M0 = self::Super with self::M0 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0*
+    : super self::Super::•()
+    ;
+}
+abstract class _Class&Super&M0&M1 = self::_Class&Super&M0 with self::M1 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1*
+    : super self::_Class&Super&M0::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2 = self::_Class&Super&M0&M1 with self::M2 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2*
+    : super self::_Class&Super&M0&M1::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3 = self::_Class&Super&M0&M1&M2 with self::M3 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3*
+    : super self::_Class&Super&M0&M1&M2::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4 = self::_Class&Super&M0&M1&M2&M3 with self::M4 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4*
+    : super self::_Class&Super&M0&M1&M2&M3::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5 = self::_Class&Super&M0&M1&M2&M3&M4 with self::M5 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5*
+    : super self::_Class&Super&M0&M1&M2&M3&M4::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6 = self::_Class&Super&M0&M1&M2&M3&M4&M5 with self::M6 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6 with self::M7 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7 with self::M8 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8 with self::M9 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9 with self::M10 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10 with self::M11 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11 with self::M12 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12 with self::M13 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13 with self::M14 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14 with self::M15 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15 with self::M16 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16 with self::M17 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17 with self::M18 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18 with self::M19 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19 with self::M20 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20 with self::M21 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21 with self::M22 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22 with self::M23 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23 with self::M24 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24 with self::M25 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25 with self::M26 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26&M27 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26 with self::M27 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26&M27*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26::•()
+    ;
+}
+class Class extends self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26&M27 {
+  synthetic constructor •() → self::Class*
+    ;
+  get property() → core::int*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/build_issue_2688.dart.strong.expect b/pkg/front_end/testcases/general/build_issue_2688.dart.strong.expect
new file mode 100644
index 0000000..eee4f5a
--- /dev/null
+++ b/pkg/front_end/testcases/general/build_issue_2688.dart.strong.expect
@@ -0,0 +1,532 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class M0 extends core::Object /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M1 extends core::Object implements self::M0 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M2 extends core::Object implements self::M1 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M3 extends core::Object implements self::M2 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M4 extends core::Object implements self::M3 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M5 extends core::Object implements self::M4 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M6 extends core::Object implements self::M5 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M7 extends core::Object implements self::M6 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M8 extends core::Object implements self::M7 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M9 extends core::Object implements self::M8 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M10 extends core::Object implements self::M9 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M11 extends core::Object implements self::M10 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M12 extends core::Object implements self::M11 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M13 extends core::Object implements self::M12 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M14 extends core::Object implements self::M13 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M15 extends core::Object implements self::M14 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M16 extends core::Object implements self::M15 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M17 extends core::Object implements self::M16 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M18 extends core::Object implements self::M17 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M19 extends core::Object implements self::M18 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M20 extends core::Object implements self::M19 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M21 extends core::Object implements self::M20 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M22 extends core::Object implements self::M21 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M23 extends core::Object implements self::M22 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M24 extends core::Object implements self::M23 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M25 extends core::Object implements self::M24 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M26 extends core::Object implements self::M25 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M27 extends core::Object implements self::M26 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class Super extends core::Object {
+  synthetic constructor •() → self::Super*
+    : super core::Object::•()
+    ;
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _Class&Super&M0 = self::Super with self::M0 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0*
+    : super self::Super::•()
+    ;
+}
+abstract class _Class&Super&M0&M1 = self::_Class&Super&M0 with self::M1 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1*
+    : super self::_Class&Super&M0::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2 = self::_Class&Super&M0&M1 with self::M2 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2*
+    : super self::_Class&Super&M0&M1::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3 = self::_Class&Super&M0&M1&M2 with self::M3 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3*
+    : super self::_Class&Super&M0&M1&M2::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4 = self::_Class&Super&M0&M1&M2&M3 with self::M4 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4*
+    : super self::_Class&Super&M0&M1&M2&M3::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5 = self::_Class&Super&M0&M1&M2&M3&M4 with self::M5 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5*
+    : super self::_Class&Super&M0&M1&M2&M3&M4::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6 = self::_Class&Super&M0&M1&M2&M3&M4&M5 with self::M6 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6 with self::M7 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7 with self::M8 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8 with self::M9 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9 with self::M10 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10 with self::M11 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11 with self::M12 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12 with self::M13 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13 with self::M14 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14 with self::M15 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15 with self::M16 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16 with self::M17 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17 with self::M18 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18 with self::M19 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19 with self::M20 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20 with self::M21 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21 with self::M22 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22 with self::M23 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23 with self::M24 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24 with self::M25 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25 with self::M26 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26&M27 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26 with self::M27 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26&M27*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26::•()
+    ;
+}
+class Class extends self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26&M27 {
+  synthetic constructor •() → self::Class*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26&M27::•()
+    ;
+  get property() → core::int*
+    return 0;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/build_issue_2688.dart.strong.transformed.expect b/pkg/front_end/testcases/general/build_issue_2688.dart.strong.transformed.expect
new file mode 100644
index 0000000..bce18c0
--- /dev/null
+++ b/pkg/front_end/testcases/general/build_issue_2688.dart.strong.transformed.expect
@@ -0,0 +1,840 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class M0 extends core::Object /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M1 extends core::Object implements self::M0 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M2 extends core::Object implements self::M1 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M3 extends core::Object implements self::M2 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M4 extends core::Object implements self::M3 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M5 extends core::Object implements self::M4 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M6 extends core::Object implements self::M5 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M7 extends core::Object implements self::M6 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M8 extends core::Object implements self::M7 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M9 extends core::Object implements self::M8 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M10 extends core::Object implements self::M9 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M11 extends core::Object implements self::M10 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M12 extends core::Object implements self::M11 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M13 extends core::Object implements self::M12 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M14 extends core::Object implements self::M13 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M15 extends core::Object implements self::M14 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M16 extends core::Object implements self::M15 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M17 extends core::Object implements self::M16 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M18 extends core::Object implements self::M17 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M19 extends core::Object implements self::M18 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M20 extends core::Object implements self::M19 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M21 extends core::Object implements self::M20 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M22 extends core::Object implements self::M21 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M23 extends core::Object implements self::M22 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M24 extends core::Object implements self::M23 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M25 extends core::Object implements self::M24 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M26 extends core::Object implements self::M25 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M27 extends core::Object implements self::M26 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class Super extends core::Object {
+  synthetic constructor •() → self::Super*
+    : super core::Object::•()
+    ;
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _Class&Super&M0 extends self::Super implements self::M0 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0*
+    : super self::Super::•()
+    ;
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _Class&Super&M0&M1 extends self::_Class&Super&M0 implements self::M1 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1*
+    : super self::_Class&Super&M0::•()
+    ;
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _Class&Super&M0&M1&M2 extends self::_Class&Super&M0&M1 implements self::M2 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2*
+    : super self::_Class&Super&M0&M1::•()
+    ;
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _Class&Super&M0&M1&M2&M3 extends self::_Class&Super&M0&M1&M2 implements self::M3 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3*
+    : super self::_Class&Super&M0&M1&M2::•()
+    ;
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4 extends self::_Class&Super&M0&M1&M2&M3 implements self::M4 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4*
+    : super self::_Class&Super&M0&M1&M2&M3::•()
+    ;
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5 extends self::_Class&Super&M0&M1&M2&M3&M4 implements self::M5 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5*
+    : super self::_Class&Super&M0&M1&M2&M3&M4::•()
+    ;
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6 extends self::_Class&Super&M0&M1&M2&M3&M4&M5 implements self::M6 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5::•()
+    ;
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7 extends self::_Class&Super&M0&M1&M2&M3&M4&M5&M6 implements self::M7 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6::•()
+    ;
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8 extends self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7 implements self::M8 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7::•()
+    ;
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9 extends self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8 implements self::M9 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8::•()
+    ;
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10 extends self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9 implements self::M10 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9::•()
+    ;
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11 extends self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10 implements self::M11 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10::•()
+    ;
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12 extends self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11 implements self::M12 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11::•()
+    ;
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13 extends self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12 implements self::M13 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12::•()
+    ;
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14 extends self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13 implements self::M14 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13::•()
+    ;
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15 extends self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14 implements self::M15 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14::•()
+    ;
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16 extends self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15 implements self::M16 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15::•()
+    ;
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17 extends self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16 implements self::M17 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16::•()
+    ;
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18 extends self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17 implements self::M18 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17::•()
+    ;
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19 extends self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18 implements self::M19 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18::•()
+    ;
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20 extends self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19 implements self::M20 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19::•()
+    ;
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21 extends self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20 implements self::M21 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20::•()
+    ;
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22 extends self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21 implements self::M22 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21::•()
+    ;
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23 extends self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22 implements self::M23 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22::•()
+    ;
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24 extends self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23 implements self::M24 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23::•()
+    ;
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25 extends self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24 implements self::M25 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24::•()
+    ;
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26 extends self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25 implements self::M26 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25::•()
+    ;
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26&M27 extends self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26 implements self::M27 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26&M27*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26::•()
+    ;
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Class extends self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26&M27 {
+  synthetic constructor •() → self::Class*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26&M27::•()
+    ;
+  get property() → core::int*
+    return 0;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/build_issue_2688.dart.textual_outline.expect b/pkg/front_end/testcases/general/build_issue_2688.dart.textual_outline.expect
new file mode 100644
index 0000000..ed52349
--- /dev/null
+++ b/pkg/front_end/testcases/general/build_issue_2688.dart.textual_outline.expect
@@ -0,0 +1,123 @@
+mixin M0 {
+  int get property;
+}
+mixin M1 implements M0 {
+  int get property;
+}
+mixin M2 implements M1 {
+  int get property;
+}
+mixin M3 implements M2 {
+  int get property;
+}
+mixin M4 implements M3 {
+  int get property;
+}
+mixin M5 implements M4 {
+  int get property;
+}
+mixin M6 implements M5 {
+  int get property;
+}
+mixin M7 implements M6 {
+  int get property;
+}
+mixin M8 implements M7 {
+  int get property;
+}
+mixin M9 implements M8 {
+  int get property;
+}
+mixin M10 implements M9 {
+  int get property;
+}
+mixin M11 implements M10 {
+  int get property;
+}
+mixin M12 implements M11 {
+  int get property;
+}
+mixin M13 implements M12 {
+  int get property;
+}
+mixin M14 implements M13 {
+  int get property;
+}
+mixin M15 implements M14 {
+  int get property;
+}
+mixin M16 implements M15 {
+  int get property;
+}
+mixin M17 implements M16 {
+  int get property;
+}
+mixin M18 implements M17 {
+  int get property;
+}
+mixin M19 implements M18 {
+  int get property;
+}
+mixin M20 implements M19 {
+  int get property;
+}
+mixin M21 implements M20 {
+  int get property;
+}
+mixin M22 implements M21 {
+  int get property;
+}
+mixin M23 implements M22 {
+  int get property;
+}
+mixin M24 implements M23 {
+  int get property;
+}
+mixin M25 implements M24 {
+  int get property;
+}
+mixin M26 implements M25 {
+  int get property;
+}
+mixin M27 implements M26 {
+  int get property;
+}
+
+abstract class Super {
+  int get property;
+}
+
+class Class extends Super
+    with
+        M0,
+        M1,
+        M2,
+        M3,
+        M4,
+        M5,
+        M6,
+        M7,
+        M8,
+        M9,
+        M10,
+        M11,
+        M12,
+        M13,
+        M14,
+        M15,
+        M16,
+        M17,
+        M18,
+        M19,
+        M20,
+        M21,
+        M22,
+        M23,
+        M24,
+        M25,
+        M26,
+        M27 {
+  int get property => 0;
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/build_issue_2688.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/build_issue_2688.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..d2ec562
--- /dev/null
+++ b/pkg/front_end/testcases/general/build_issue_2688.dart.textual_outline_modelled.expect
@@ -0,0 +1,122 @@
+abstract class Super {
+  int get property;
+}
+
+class Class extends Super
+    with
+        M0,
+        M1,
+        M2,
+        M3,
+        M4,
+        M5,
+        M6,
+        M7,
+        M8,
+        M9,
+        M10,
+        M11,
+        M12,
+        M13,
+        M14,
+        M15,
+        M16,
+        M17,
+        M18,
+        M19,
+        M20,
+        M21,
+        M22,
+        M23,
+        M24,
+        M25,
+        M26,
+        M27 {
+  int get property => 0;
+}
+
+main() {}
+mixin M0 {
+  int get property;
+}
+mixin M1 implements M0 {
+  int get property;
+}
+mixin M10 implements M9 {
+  int get property;
+}
+mixin M11 implements M10 {
+  int get property;
+}
+mixin M12 implements M11 {
+  int get property;
+}
+mixin M13 implements M12 {
+  int get property;
+}
+mixin M14 implements M13 {
+  int get property;
+}
+mixin M15 implements M14 {
+  int get property;
+}
+mixin M16 implements M15 {
+  int get property;
+}
+mixin M17 implements M16 {
+  int get property;
+}
+mixin M18 implements M17 {
+  int get property;
+}
+mixin M19 implements M18 {
+  int get property;
+}
+mixin M2 implements M1 {
+  int get property;
+}
+mixin M20 implements M19 {
+  int get property;
+}
+mixin M21 implements M20 {
+  int get property;
+}
+mixin M22 implements M21 {
+  int get property;
+}
+mixin M23 implements M22 {
+  int get property;
+}
+mixin M24 implements M23 {
+  int get property;
+}
+mixin M25 implements M24 {
+  int get property;
+}
+mixin M26 implements M25 {
+  int get property;
+}
+mixin M27 implements M26 {
+  int get property;
+}
+mixin M3 implements M2 {
+  int get property;
+}
+mixin M4 implements M3 {
+  int get property;
+}
+mixin M5 implements M4 {
+  int get property;
+}
+mixin M6 implements M5 {
+  int get property;
+}
+mixin M7 implements M6 {
+  int get property;
+}
+mixin M8 implements M7 {
+  int get property;
+}
+mixin M9 implements M8 {
+  int get property;
+}
diff --git a/pkg/front_end/testcases/general/check_deferred_before_args2.dart.strong.transformed.expect b/pkg/front_end/testcases/general/check_deferred_before_args2.dart.strong.transformed.expect
index 8df91fe..ad4521b 100644
--- a/pkg/front_end/testcases/general/check_deferred_before_args2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/check_deferred_before_args2.dart.strong.transformed.expect
@@ -8,7 +8,8 @@
 
 static method main() → dynamic {}
 static method test() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic>* :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -24,17 +25,18 @@
         [yield] let dynamic #t2 = asy::_awaitHelper(LoadLibrary(lib), :async_op_then, :async_op_error, :async_op) in null;
         def::m(:result);
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 
 library;
diff --git a/pkg/front_end/testcases/general/constants/const_collections.dart.outline.expect b/pkg/front_end/testcases/general/constants/const_collections.dart.outline.expect
index 04597c0..09b9c11 100644
--- a/pkg/front_end/testcases/general/constants/const_collections.dart.outline.expect
+++ b/pkg/front_end/testcases/general/constants/const_collections.dart.outline.expect
@@ -336,16 +336,16 @@
 Evaluated: StaticGet @ org-dartlang-testcase:///const_collections.dart:32:63 -> InstanceConstant(const CustomIterable{})
 Evaluated: ListLiteral @ org-dartlang-testcase:///const_collections.dart:33:33 -> ListConstant(const <String*>["Hello"])
 Evaluated: ListLiteral @ org-dartlang-testcase:///const_collections.dart:33:45 -> ListConstant(const <String*>["World"])
-Evaluated: SetLiteral @ org-dartlang-testcase:///const_collections.dart:36:25 -> InstanceConstant(const _UnmodifiableSet<String*>{_UnmodifiableSet._map: const _ImmutableMap<String*, Null?>{_ImmutableMap._kvPairs: const <dynamic>["hello", null, "world", null]}})
-Evaluated: SetConcatenation @ org-dartlang-testcase:///const_collections.dart:38:25 -> InstanceConstant(const _UnmodifiableSet<String*>{_UnmodifiableSet._map: const _ImmutableMap<String*, Null?>{_ImmutableMap._kvPairs: const <dynamic>["hello", null, "world", null, "!", null]}})
-Evaluated: StaticGet @ org-dartlang-testcase:///const_collections.dart:40:43 -> InstanceConstant(const _UnmodifiableSet<String*>{_UnmodifiableSet._map: const _ImmutableMap<String*, Null?>{_ImmutableMap._kvPairs: const <dynamic>["hello", null, "world", null]}})
+Evaluated: SetLiteral @ org-dartlang-testcase:///const_collections.dart:36:25 -> InstanceConstant(const _UnmodifiableSet<String*>{_UnmodifiableSet._map: const _ImmutableMap<String*, Null>{_ImmutableMap._kvPairs: const <dynamic>["hello", null, "world", null]}})
+Evaluated: SetConcatenation @ org-dartlang-testcase:///const_collections.dart:38:25 -> InstanceConstant(const _UnmodifiableSet<String*>{_UnmodifiableSet._map: const _ImmutableMap<String*, Null>{_ImmutableMap._kvPairs: const <dynamic>["hello", null, "world", null, "!", null]}})
+Evaluated: StaticGet @ org-dartlang-testcase:///const_collections.dart:40:43 -> InstanceConstant(const _UnmodifiableSet<String*>{_UnmodifiableSet._map: const _ImmutableMap<String*, Null>{_ImmutableMap._kvPairs: const <dynamic>["hello", null, "world", null]}})
 Evaluated: StaticGet @ org-dartlang-testcase:///const_collections.dart:40:51 -> NullConstant(null)
-Evaluated: StaticGet @ org-dartlang-testcase:///const_collections.dart:41:42 -> InstanceConstant(const _UnmodifiableSet<String*>{_UnmodifiableSet._map: const _ImmutableMap<String*, Null?>{_ImmutableMap._kvPairs: const <dynamic>["hello", null, "world", null]}})
-Evaluated: StaticGet @ org-dartlang-testcase:///const_collections.dart:44:6 -> InstanceConstant(const _UnmodifiableSet<String*>{_UnmodifiableSet._map: const _ImmutableMap<String*, Null?>{_ImmutableMap._kvPairs: const <dynamic>["hello", null, "world", null]}})
+Evaluated: StaticGet @ org-dartlang-testcase:///const_collections.dart:41:42 -> InstanceConstant(const _UnmodifiableSet<String*>{_UnmodifiableSet._map: const _ImmutableMap<String*, Null>{_ImmutableMap._kvPairs: const <dynamic>["hello", null, "world", null]}})
+Evaluated: StaticGet @ org-dartlang-testcase:///const_collections.dart:44:6 -> InstanceConstant(const _UnmodifiableSet<String*>{_UnmodifiableSet._map: const _ImmutableMap<String*, Null>{_ImmutableMap._kvPairs: const <dynamic>["hello", null, "world", null]}})
 Evaluated: ConstructorInvocation @ org-dartlang-testcase:///const_collections.dart:45:12 -> InstanceConstant(const CustomIterable{})
-Evaluated: StaticGet @ org-dartlang-testcase:///const_collections.dart:47:54 -> InstanceConstant(const _UnmodifiableSet<String*>{_UnmodifiableSet._map: const _ImmutableMap<String*, Null?>{_ImmutableMap._kvPairs: const <dynamic>["hello", null, "world", null]}})
+Evaluated: StaticGet @ org-dartlang-testcase:///const_collections.dart:47:54 -> InstanceConstant(const _UnmodifiableSet<String*>{_UnmodifiableSet._map: const _ImmutableMap<String*, Null>{_ImmutableMap._kvPairs: const <dynamic>["hello", null, "world", null]}})
 Evaluated: ConstructorInvocation @ org-dartlang-testcase:///const_collections.dart:47:62 -> InstanceConstant(const CustomIterable{})
-Evaluated: StaticGet @ org-dartlang-testcase:///const_collections.dart:48:54 -> InstanceConstant(const _UnmodifiableSet<String*>{_UnmodifiableSet._map: const _ImmutableMap<String*, Null?>{_ImmutableMap._kvPairs: const <dynamic>["hello", null, "world", null]}})
+Evaluated: StaticGet @ org-dartlang-testcase:///const_collections.dart:48:54 -> InstanceConstant(const _UnmodifiableSet<String*>{_UnmodifiableSet._map: const _ImmutableMap<String*, Null>{_ImmutableMap._kvPairs: const <dynamic>["hello", null, "world", null]}})
 Evaluated: StaticGet @ org-dartlang-testcase:///const_collections.dart:48:59 -> InstanceConstant(const CustomIterable{})
 Evaluated: ConstructorInvocation @ org-dartlang-testcase:///const_collections.dart:49:55 -> InstanceConstant(const WithEquals{WithEquals.i: 42})
 Evaluated: MapLiteral @ org-dartlang-testcase:///const_collections.dart:53:34 -> InstanceConstant(const _ImmutableMap<String*, String*>{_ImmutableMap._kvPairs: const <dynamic>["hello", "world"]})
diff --git a/pkg/front_end/testcases/general/constants/const_collections.dart.strong.expect b/pkg/front_end/testcases/general/constants/const_collections.dart.strong.expect
index e193519..b9b41ea 100644
--- a/pkg/front_end/testcases/general/constants/const_collections.dart.strong.expect
+++ b/pkg/front_end/testcases/general/constants/const_collections.dart.strong.expect
@@ -407,8 +407,8 @@
 static field core::List<core::String*>* barAsVar = block {
   final core::List<core::String*>* #t1 = <core::String*>[];
   for (final core::String* #t2 in #C8)
-    #t1.{core::List::add}(#t2);
-  #t1.{core::List::add}("!");
+    #t1.{core::List::add}{Invariant}(#t2);
+  #t1.{core::List::add}{Invariant}("!");
 } =>#t1;
 static const field core::List<core::String*>* barWithNullSpread = invalid-expression "Null value during constant evaluation.";
 static const field core::List<core::String*>* barWithIntSpread = invalid-expression "pkg/front_end/testcases/general/constants/const_collections.dart:23:51: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
@@ -480,7 +480,10 @@
   core::print(#C10);
   core::print(#C17);
   core::print(#C22);
-  core::print(let final core::Set<core::String*>* #t3 = col::LinkedHashSet::•<core::String*>() in let final dynamic #t4 = #t3.{core::Set::add}("hello") in #t3);
+  core::print( block {
+    final core::Set<core::String*>* #t3 = col::LinkedHashSet::•<core::String*>();
+    #t3.{core::Set::add}{Invariant}("hello");
+  } =>#t3);
   core::print(#C26);
 }
 
@@ -497,10 +500,10 @@
   #C10 = <core::String*>[#C6, #C7, #C9]
   #C11 = self::CustomIterable {}
   #C12 = <dynamic>[#C6, #C3, #C7, #C3]
-  #C13 = core::_ImmutableMap<core::String*, core::Null?> {_kvPairs:#C12}
+  #C13 = core::_ImmutableMap<core::String*, Null> {_kvPairs:#C12}
   #C14 = col::_UnmodifiableSet<core::String*> {_map:#C13}
   #C15 = <dynamic>[#C6, #C3, #C7, #C3, #C9, #C3]
-  #C16 = core::_ImmutableMap<core::String*, core::Null?> {_kvPairs:#C15}
+  #C16 = core::_ImmutableMap<core::String*, Null> {_kvPairs:#C15}
   #C17 = col::_UnmodifiableSet<core::String*> {_map:#C16}
   #C18 = <dynamic>[#C6, #C7]
   #C19 = core::_ImmutableMap<core::String*, core::String*> {_kvPairs:#C18}
@@ -509,6 +512,6 @@
   #C22 = core::_ImmutableMap<core::String*, core::String*> {_kvPairs:#C21}
   #C23 = self::CustomMap {}
   #C24 = <dynamic>[#C6, #C3]
-  #C25 = core::_ImmutableMap<core::String*, core::Null?> {_kvPairs:#C24}
+  #C25 = core::_ImmutableMap<core::String*, Null> {_kvPairs:#C24}
   #C26 = col::_UnmodifiableSet<core::String*> {_map:#C25}
 }
diff --git a/pkg/front_end/testcases/general/constants/const_collections.dart.strong.transformed.expect b/pkg/front_end/testcases/general/constants/const_collections.dart.strong.transformed.expect
index 23d8ad3..168f850 100644
--- a/pkg/front_end/testcases/general/constants/const_collections.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/constants/const_collections.dart.strong.transformed.expect
@@ -410,10 +410,10 @@
     core::Iterator<core::String*>* :sync-for-iterator = (#C8).{core::Iterable::iterator};
     for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
       final core::String* #t2 = :sync-for-iterator.{core::Iterator::current};
-      #t1.{core::List::add}(#t2);
+      #t1.{core::List::add}{Invariant}(#t2);
     }
   }
-  #t1.{core::List::add}("!");
+  #t1.{core::List::add}{Invariant}("!");
 } =>#t1;
 static const field core::List<core::String*>* barWithNullSpread = invalid-expression "Null value during constant evaluation.";
 static const field core::List<core::String*>* barWithIntSpread = invalid-expression "pkg/front_end/testcases/general/constants/const_collections.dart:23:51: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
@@ -485,7 +485,10 @@
   core::print(#C10);
   core::print(#C17);
   core::print(#C22);
-  core::print(let final core::Set<core::String*>* #t3 = new col::_CompactLinkedHashSet::•<core::String*>() in let final core::bool #t4 = #t3.{core::Set::add}("hello") in #t3);
+  core::print( block {
+    final core::Set<core::String*>* #t3 = new col::_CompactLinkedHashSet::•<core::String*>();
+    #t3.{core::Set::add}{Invariant}("hello");
+  } =>#t3);
   core::print(#C26);
 }
 
@@ -502,10 +505,10 @@
   #C10 = <core::String*>[#C6, #C7, #C9]
   #C11 = self::CustomIterable {}
   #C12 = <dynamic>[#C6, #C3, #C7, #C3]
-  #C13 = core::_ImmutableMap<core::String*, core::Null?> {_kvPairs:#C12}
+  #C13 = core::_ImmutableMap<core::String*, Null> {_kvPairs:#C12}
   #C14 = col::_UnmodifiableSet<core::String*> {_map:#C13}
   #C15 = <dynamic>[#C6, #C3, #C7, #C3, #C9, #C3]
-  #C16 = core::_ImmutableMap<core::String*, core::Null?> {_kvPairs:#C15}
+  #C16 = core::_ImmutableMap<core::String*, Null> {_kvPairs:#C15}
   #C17 = col::_UnmodifiableSet<core::String*> {_map:#C16}
   #C18 = <dynamic>[#C6, #C7]
   #C19 = core::_ImmutableMap<core::String*, core::String*> {_kvPairs:#C18}
@@ -514,6 +517,6 @@
   #C22 = core::_ImmutableMap<core::String*, core::String*> {_kvPairs:#C21}
   #C23 = self::CustomMap {}
   #C24 = <dynamic>[#C6, #C3]
-  #C25 = core::_ImmutableMap<core::String*, core::Null?> {_kvPairs:#C24}
+  #C25 = core::_ImmutableMap<core::String*, Null> {_kvPairs:#C24}
   #C26 = col::_UnmodifiableSet<core::String*> {_map:#C25}
 }
diff --git a/pkg/front_end/testcases/general/constants/folder.options b/pkg/front_end/testcases/general/constants/folder.options
index 0cbe954..4b2f3da 100644
--- a/pkg/front_end/testcases/general/constants/folder.options
+++ b/pkg/front_end/testcases/general/constants/folder.options
@@ -1,4 +1,4 @@
---enable-experiment=triple-shift
+--enable-experiment=triple-shift,no-non-nullable
 -Dbaz=42
 -DbazTrue=true
 -DbazFalse=false
\ No newline at end of file
diff --git a/pkg/front_end/testcases/general/constants/js_semantics/folder.options b/pkg/front_end/testcases/general/constants/js_semantics/folder.options
index 674c362..71391b1 100644
--- a/pkg/front_end/testcases/general/constants/js_semantics/folder.options
+++ b/pkg/front_end/testcases/general/constants/js_semantics/folder.options
@@ -1,2 +1,2 @@
---enable-experiment=triple-shift
+--enable-experiment=triple-shift,no-non-nullable
 --target=noneWithJs
\ No newline at end of file
diff --git a/pkg/front_end/testcases/general/constants/no_experiments/folder.options b/pkg/front_end/testcases/general/constants/no_experiments/folder.options
index db4ac03..2575f9f 100644
--- a/pkg/front_end/testcases/general/constants/no_experiments/folder.options
+++ b/pkg/front_end/testcases/general/constants/no_experiments/folder.options
@@ -1,3 +1,4 @@
+--enable-experiment=no-non-nullable
 -Dbaz=42
 -DbazTrue=true
 -DbazFalse=false
\ No newline at end of file
diff --git a/pkg/front_end/testcases/general/constants/various.dart.outline.expect b/pkg/front_end/testcases/general/constants/various.dart.outline.expect
index 055199f..919d711 100644
--- a/pkg/front_end/testcases/general/constants/various.dart.outline.expect
+++ b/pkg/front_end/testcases/general/constants/various.dart.outline.expect
@@ -334,7 +334,7 @@
 static const field dynamic function_const = invalid-expression "pkg/front_end/testcases/general/constants/various.dart:140:24: Error: Not a constant expression.
 const function_const = () {};
                        ^^";
-static field () →* core::Null? function_var;
+static field () →* Null function_var;
 static field self::ConstClassWithFailingAssertWithEmptyMessage* failedAssertEmptyMessage;
 static const field self::ClassWithTypeArguments<dynamic, dynamic, dynamic>* classWithTypeArguments1 = const self::ClassWithTypeArguments::•<core::int*, core::int*, core::int*>(42, 42, 42);
 static const field self::ClassWithTypeArguments<dynamic, dynamic, dynamic>* classWithTypeArguments2 = const self::ClassWithTypeArguments::•<dynamic, dynamic, dynamic>(42, 42, 42);
diff --git a/pkg/front_end/testcases/general/constants/various.dart.strong.expect b/pkg/front_end/testcases/general/constants/various.dart.strong.expect
index a6df3e4..e7197ff 100644
--- a/pkg/front_end/testcases/general/constants/various.dart.strong.expect
+++ b/pkg/front_end/testcases/general/constants/various.dart.strong.expect
@@ -562,7 +562,7 @@
 static const field dynamic function_const = invalid-expression "pkg/front_end/testcases/general/constants/various.dart:140:24: Error: Not a constant expression.
 const function_const = () {};
                        ^^";
-static field () →* core::Null? function_var = () → core::Null? {};
+static field () →* Null function_var = () → Null {};
 static field self::ConstClassWithFailingAssertWithEmptyMessage* failedAssertEmptyMessage = invalid-expression "This assertion failed with message: (empty)";
 static const field self::ClassWithTypeArguments<dynamic, dynamic, dynamic>* classWithTypeArguments1 = #C19;
 static const field self::ClassWithTypeArguments<dynamic, dynamic, dynamic>* classWithTypeArguments2 = #C20;
diff --git a/pkg/front_end/testcases/general/constants/various.dart.strong.transformed.expect b/pkg/front_end/testcases/general/constants/various.dart.strong.transformed.expect
index c27c932..077f295 100644
--- a/pkg/front_end/testcases/general/constants/various.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/constants/various.dart.strong.transformed.expect
@@ -562,7 +562,7 @@
 static const field dynamic function_const = invalid-expression "pkg/front_end/testcases/general/constants/various.dart:140:24: Error: Not a constant expression.
 const function_const = () {};
                        ^^";
-static field () →* core::Null? function_var = () → core::Null? {};
+static field () →* Null function_var = () → Null {};
 static field self::ConstClassWithFailingAssertWithEmptyMessage* failedAssertEmptyMessage = invalid-expression "This assertion failed with message: (empty)";
 static const field self::ClassWithTypeArguments<dynamic, dynamic, dynamic>* classWithTypeArguments1 = #C19;
 static const field self::ClassWithTypeArguments<dynamic, dynamic, dynamic>* classWithTypeArguments2 = #C20;
diff --git a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart.strong.expect b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart.strong.expect
index aa75ba9..f4a03a1 100644
--- a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart.strong.expect
+++ b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart.strong.expect
@@ -107,7 +107,7 @@
 static const field self::Bar bar3 = invalid-expression "This assertion failed.";
 static const field self::Bar bar4 = invalid-expression "This assertion failed.";
 static method main() → dynamic {
-  core::print(#C13);
+  core::print(#C9);
 }
 
 constants  {
@@ -123,5 +123,4 @@
   #C10 = 42
   #C11 = "btw foo was "
   #C12 = eval self::Foo{x:#C10, assert(#C7, "${#C11}${const core::bool::fromEnvironment(#C1)}")}
-  #C13 = eval self::Foo{x:#C6, assert(const core::bool::fromEnvironment(#C1).==(#C7), "${#C8}${const core::bool::fromEnvironment(#C1)}"), assert(const core::bool::fromEnvironment(#C1).==(#C7))}
 }
diff --git a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_collections.dart.strong.expect b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_collections.dart.strong.expect
index eadc725..d0164af 100644
--- a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_collections.dart.strong.expect
+++ b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_collections.dart.strong.expect
@@ -29,51 +29,40 @@
 import self as self;
 import "dart:core" as core;
 
-static const field core::List<core::bool> listWithUnevaluated = #C7;
-static const field core::List<core::bool> listWithUnevaluatedSpread = #C11;
-static const field core::Set<core::bool> setWithUnevaluated = #C15;
-static const field core::Set<core::bool> setWithUnevaluatedSpread = #C18;
-static const field core::List<core::int> a = #C19;
-static const field core::List<core::int?> b = #C20;
+static const field core::List<core::bool> listWithUnevaluated = #C5;
+static const field core::List<core::bool> listWithUnevaluatedSpread = #C8;
+static const field core::Set<core::bool> setWithUnevaluated = #C10;
+static const field core::Set<core::bool> setWithUnevaluatedSpread = #C12;
+static const field core::List<core::int> a = #C13;
+static const field core::List<core::int?> b = #C14;
 static const field core::Set<core::List<core::int?>> setNotAgnosticOK = invalid-expression "Constant value is not strong/weak mode agnostic.";
-static const field invalid-type MapWithUnevaluated = #C22;
+static const field invalid-type MapWithUnevaluated = #C15;
 static const field core::Map<core::List<core::int?>, core::int> mapNotAgnosticOK = invalid-expression "Constant value is not strong/weak mode agnostic.";
 static method main() → dynamic {
-  core::print(#C23);
-  core::print(#C24);
-  core::print(#C25);
-  core::print(#C26);
+  core::print(#C5);
+  core::print(#C8);
+  core::print(#C10);
+  core::print(#C12);
   core::print(<core::String>{"hello"});
-  core::print(#C28);
+  core::print(#C17);
 }
 
 constants  {
-  #C1 = <core::bool>[]
-  #C2 = <dynamic>[]
-  #C3 = "foo"
-  #C4 = "bar"
-  #C5 = true
-  #C6 = <dynamic>[#C5]
-  #C7 = eval #C1 + #C2 + const <dynamic>[const core::bool::fromEnvironment(#C3)] + #C2 + const <dynamic>[const core::bool::fromEnvironment(#C4)] + #C6
-  #C8 = <core::bool>[#C5]
-  #C9 = false
-  #C10 = <core::bool>[#C9]
-  #C11 = eval #C8 + #C1 + #C2 + #C2 + const <dynamic>[const core::bool::fromEnvironment(#C3)] + #C2 + #C2 + const <dynamic>[const core::bool::fromEnvironment(#C4)] + #C6 + #C10
-  #C12 = <core::bool>{}
-  #C13 = <dynamic>{}
-  #C14 = <dynamic>{#C5}
-  #C15 = eval #C12 + #C13 + const <dynamic>{const core::bool::fromEnvironment(#C3)} + #C13 + const <dynamic>{const core::bool::fromEnvironment(#C4)} + #C14
-  #C16 = <core::bool>{#C5}
-  #C17 = <core::bool>{#C9}
-  #C18 = eval #C16 + #C12 + #C13 + #C13 + const <dynamic>{const core::bool::fromEnvironment(#C3)} + #C13 + #C13 + const <dynamic>{const core::bool::fromEnvironment(#C4)} + #C14 + #C17
-  #C19 = <core::int>[]
-  #C20 = <core::int?>[]
-  #C21 = <core::bool, core::bool>{)
-  #C22 = eval #C21 + const <dynamic, dynamic>{const core::bool::fromEnvironment(#C3): const core::bool::fromEnvironment(#C4)}
-  #C23 = eval #C1 + #C2 + const <dynamic>[const core::bool::fromEnvironment(#C3)] + #C2 + const <dynamic>[const core::bool::fromEnvironment(#C4)] + #C6
-  #C24 = eval #C8 + #C1 + #C2 + #C2 + const <dynamic>[const core::bool::fromEnvironment(#C3)] + #C2 + #C2 + const <dynamic>[const core::bool::fromEnvironment(#C4)] + #C6 + #C10
-  #C25 = eval #C12 + #C13 + const <dynamic>{const core::bool::fromEnvironment(#C3)} + #C13 + const <dynamic>{const core::bool::fromEnvironment(#C4)} + #C14
-  #C26 = eval #C16 + #C12 + #C13 + #C13 + const <dynamic>{const core::bool::fromEnvironment(#C3)} + #C13 + #C13 + const <dynamic>{const core::bool::fromEnvironment(#C4)} + #C14 + #C17
-  #C27 = "hello"
-  #C28 = <core::String>{#C27}
+  #C1 = "foo"
+  #C2 = "bar"
+  #C3 = true
+  #C4 = <core::bool>[#C3]
+  #C5 = eval const <dynamic>[const core::bool::fromEnvironment(#C1)] + const <dynamic>[const core::bool::fromEnvironment(#C2)] + #C4
+  #C6 = false
+  #C7 = <core::bool>[#C6]
+  #C8 = eval #C4 + const <dynamic>[const core::bool::fromEnvironment(#C1)] + const <dynamic>[const core::bool::fromEnvironment(#C2)] + #C4 + #C7
+  #C9 = <core::bool>{#C3}
+  #C10 = eval const <dynamic>{const core::bool::fromEnvironment(#C1)} + const <dynamic>{const core::bool::fromEnvironment(#C2)} + #C9
+  #C11 = <core::bool>{#C6}
+  #C12 = eval #C9 + const <dynamic>{const core::bool::fromEnvironment(#C1)} + const <dynamic>{const core::bool::fromEnvironment(#C2)} + #C9 + #C11
+  #C13 = <core::int>[]
+  #C14 = <core::int?>[]
+  #C15 = eval const <dynamic, dynamic>{const core::bool::fromEnvironment(#C1): const core::bool::fromEnvironment(#C2)}
+  #C16 = "hello"
+  #C17 = <core::String>{#C16}
 }
diff --git a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_collections.dart.strong.transformed.expect b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_collections.dart.strong.transformed.expect
index 461ccb6..734ed41 100644
--- a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_collections.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_collections.dart.strong.transformed.expect
@@ -29,54 +29,46 @@
 import self as self;
 import "dart:core" as core;
 
-static const field core::List<core::bool> listWithUnevaluated = #C7;
-static const field core::List<core::bool> listWithUnevaluatedSpread = #C11;
-static const field core::Set<core::bool> setWithUnevaluated = #C15;
-static const field core::Set<core::bool> setWithUnevaluatedSpread = #C18;
-static const field core::List<core::int> a = #C19;
-static const field core::List<core::int?> b = #C20;
+static const field core::List<core::bool> listWithUnevaluated = #C5;
+static const field core::List<core::bool> listWithUnevaluatedSpread = #C8;
+static const field core::Set<core::bool> setWithUnevaluated = #C10;
+static const field core::Set<core::bool> setWithUnevaluatedSpread = #C12;
+static const field core::List<core::int> a = #C13;
+static const field core::List<core::int?> b = #C14;
 static const field core::Set<core::List<core::int?>> setNotAgnosticOK = invalid-expression "Constant value is not strong/weak mode agnostic.";
-static const field invalid-type MapWithUnevaluated = #C23;
+static const field invalid-type MapWithUnevaluated = #C15;
 static const field core::Map<core::List<core::int?>, core::int> mapNotAgnosticOK = invalid-expression "Constant value is not strong/weak mode agnostic.";
 static method main() → dynamic {
-  core::print(#C24);
-  core::print(#C25);
-  core::print(#C26);
-  core::print(#C27);
+  core::print(#C16);
+  core::print(#C17);
+  core::print(#C18);
+  core::print(#C19);
   core::print(<core::String>{"hello"});
-  core::print(#C29);
+  core::print(#C21);
 }
 
 constants  {
-  #C1 = <core::bool>[]
-  #C2 = <dynamic>[]
-  #C3 = "foo"
-  #C4 = "bar"
-  #C5 = true
-  #C6 = <dynamic>[#C5]
-  #C7 = eval #C1 + #C2 + #C2 + const <dynamic>[const core::bool::fromEnvironment(#C3)] + #C2 + #C2 + const <dynamic>[const core::bool::fromEnvironment(#C4)] + #C6
-  #C8 = <core::bool>[#C5]
-  #C9 = false
-  #C10 = <core::bool>[#C9]
-  #C11 = eval #C8 + #C1 + #C2 + #C2 + #C2 + const <dynamic>[const core::bool::fromEnvironment(#C3)] + #C2 + #C2 + #C2 + const <dynamic>[const core::bool::fromEnvironment(#C4)] + #C6 + #C10
-  #C12 = <core::bool>{}
-  #C13 = <dynamic>{}
-  #C14 = <dynamic>{#C5}
-  #C15 = eval #C12 + #C13 + #C13 + const <dynamic>{const core::bool::fromEnvironment(#C3)} + #C13 + #C13 + const <dynamic>{const core::bool::fromEnvironment(#C4)} + #C14
-  #C16 = <core::bool>{#C5}
-  #C17 = <core::bool>{#C9}
-  #C18 = eval #C16 + #C12 + #C13 + #C13 + #C13 + const <dynamic>{const core::bool::fromEnvironment(#C3)} + #C13 + #C13 + #C13 + const <dynamic>{const core::bool::fromEnvironment(#C4)} + #C14 + #C17
-  #C19 = <core::int>[]
-  #C20 = <core::int?>[]
-  #C21 = <core::bool, core::bool>{)
-  #C22 = <dynamic, dynamic>{)
-  #C23 = eval #C21 + #C22 + const <dynamic, dynamic>{const core::bool::fromEnvironment(#C3): const core::bool::fromEnvironment(#C4)}
-  #C24 = eval #C1 + #C2 + #C2 + const <dynamic>[const core::bool::fromEnvironment(#C3)] + #C2 + #C2 + const <dynamic>[const core::bool::fromEnvironment(#C4)] + #C6
-  #C25 = eval #C8 + #C1 + #C2 + #C2 + #C2 + const <dynamic>[const core::bool::fromEnvironment(#C3)] + #C2 + #C2 + #C2 + const <dynamic>[const core::bool::fromEnvironment(#C4)] + #C6 + #C10
-  #C26 = eval #C12 + #C13 + #C13 + const <dynamic>{const core::bool::fromEnvironment(#C3)} + #C13 + #C13 + const <dynamic>{const core::bool::fromEnvironment(#C4)} + #C14
-  #C27 = eval #C16 + #C12 + #C13 + #C13 + #C13 + const <dynamic>{const core::bool::fromEnvironment(#C3)} + #C13 + #C13 + #C13 + const <dynamic>{const core::bool::fromEnvironment(#C4)} + #C14 + #C17
-  #C28 = "hello"
-  #C29 = <core::String>{#C28}
+  #C1 = "foo"
+  #C2 = "bar"
+  #C3 = true
+  #C4 = <core::bool>[#C3]
+  #C5 = eval const <dynamic>[const core::bool::fromEnvironment(#C1)] + const <dynamic>[const core::bool::fromEnvironment(#C2)] + #C4
+  #C6 = false
+  #C7 = <core::bool>[#C6]
+  #C8 = eval #C4 + const <dynamic>[const core::bool::fromEnvironment(#C1)] + const <dynamic>[const core::bool::fromEnvironment(#C2)] + #C4 + #C7
+  #C9 = <core::bool>{#C3}
+  #C10 = eval const <dynamic>{const core::bool::fromEnvironment(#C1)} + const <dynamic>{const core::bool::fromEnvironment(#C2)} + #C9
+  #C11 = <core::bool>{#C6}
+  #C12 = eval #C9 + const <dynamic>{const core::bool::fromEnvironment(#C1)} + const <dynamic>{const core::bool::fromEnvironment(#C2)} + #C9 + #C11
+  #C13 = <core::int>[]
+  #C14 = <core::int?>[]
+  #C15 = eval const <dynamic, dynamic>{const core::bool::fromEnvironment(#C1): const core::bool::fromEnvironment(#C2)}
+  #C16 = eval const <dynamic>[const core::bool::fromEnvironment(#C1)] + const <dynamic>[const core::bool::fromEnvironment(#C2)] + #C4
+  #C17 = eval #C4 + const <dynamic>[const core::bool::fromEnvironment(#C1)] + const <dynamic>[const core::bool::fromEnvironment(#C2)] + #C4 + #C7
+  #C18 = eval const <dynamic>{const core::bool::fromEnvironment(#C1)} + const <dynamic>{const core::bool::fromEnvironment(#C2)} + #C9
+  #C19 = eval #C9 + const <dynamic>{const core::bool::fromEnvironment(#C1)} + const <dynamic>{const core::bool::fromEnvironment(#C2)} + #C9 + #C11
+  #C20 = "hello"
+  #C21 = <core::String>{#C20}
 }
 
 Extra constant evaluation status:
diff --git a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_collections_2.dart b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_collections_2.dart
new file mode 100644
index 0000000..050fc23
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_collections_2.dart
@@ -0,0 +1,64 @@
+// Copyright (c) 2020, 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.
+
+const List<String> listWithUnevaluatedUnevaluatedFirst = [
+  String.fromEnvironment("foo"),
+  String.fromEnvironment("bar"),
+  "hello",
+  "world"
+];
+
+const List<String> listWithUnevaluatedUnevaluatedMiddle = [
+  "A",
+  "few",
+  "strings",
+  String.fromEnvironment("foo"),
+  String.fromEnvironment("bar"),
+  "hello",
+  "world",
+  "and",
+  "more"
+];
+
+const Set<String> setWithUnevaluatedUnevaluatedFirst = {
+  // only one or the empty string (when evaluated with an empty environment)
+  // will conflict!
+  String.fromEnvironment("foo"),
+  "hello",
+  "world"
+};
+
+const Set<String> setWithUnevaluatedUnevaluatedMiddle = {
+  "A",
+  "few",
+  "strings",
+  // only one or the empty string (when evaluated with an empty environment)
+  // will conflict!
+  String.fromEnvironment("foo"),
+  "hello",
+  "world",
+  "and",
+  "more"
+};
+
+const Map<String, int> mapWithUnevaluatedUnevaluatedFirst = {
+  // only one or the empty string (when evaluated with an empty environment)
+  // will conflict!
+  String.fromEnvironment("foo"): 42,
+  "hello": 42,
+  "world": 42
+};
+
+const Map<String, int> mapWithUnevaluatedUnevaluatedMiddle = {
+  "A": 42,
+  "few": 42,
+  "strings": 42,
+  // only one or the empty string (when evaluated with an empty environment)
+  // will conflict!
+  String.fromEnvironment("foo"): 42,
+  "hello": 42,
+  "world": 42,
+  "and": 42,
+  "more": 42
+};
diff --git a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_collections_2.dart.outline.expect b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_collections_2.dart.outline.expect
new file mode 100644
index 0000000..fe9dea9
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_collections_2.dart.outline.expect
@@ -0,0 +1,28 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+static const field core::List<core::String> listWithUnevaluatedUnevaluatedFirst = const <core::String>[const core::String::fromEnvironment("foo"), const core::String::fromEnvironment("bar"), "hello", "world"];
+static const field core::List<core::String> listWithUnevaluatedUnevaluatedMiddle = const <core::String>["A", "few", "strings", const core::String::fromEnvironment("foo"), const core::String::fromEnvironment("bar"), "hello", "world", "and", "more"];
+static const field core::Set<core::String> setWithUnevaluatedUnevaluatedFirst = const <core::String>{const core::String::fromEnvironment("foo"), "hello", "world"};
+static const field core::Set<core::String> setWithUnevaluatedUnevaluatedMiddle = const <core::String>{"A", "few", "strings", const core::String::fromEnvironment("foo"), "hello", "world", "and", "more"};
+static const field core::Map<core::String, core::int> mapWithUnevaluatedUnevaluatedFirst = const <core::String, core::int>{const core::String::fromEnvironment("foo"): 42, "hello": 42, "world": 42};
+static const field core::Map<core::String, core::int> mapWithUnevaluatedUnevaluatedMiddle = const <core::String, core::int>{"A": 42, "few": 42, "strings": 42, const core::String::fromEnvironment("foo"): 42, "hello": 42, "world": 42, "and": 42, "more": 42};
+
+
+Extra constant evaluation status:
+Evaluated with empty environment: ListLiteral @ org-dartlang-testcase:///const_collections_2.dart:5:58 -> ListConstant(const <String>["", "", "hello", "world"])
+Evaluated with empty environment: FactoryConstructorInvocationJudgment @ org-dartlang-testcase:///const_collections_2.dart:6:10 -> StringConstant("")
+Evaluated with empty environment: FactoryConstructorInvocationJudgment @ org-dartlang-testcase:///const_collections_2.dart:7:10 -> StringConstant("")
+Evaluated with empty environment: ListLiteral @ org-dartlang-testcase:///const_collections_2.dart:12:59 -> ListConstant(const <String>["A", "few", "strings", "", "", "hello", "world", "and", "more"])
+Evaluated with empty environment: FactoryConstructorInvocationJudgment @ org-dartlang-testcase:///const_collections_2.dart:16:10 -> StringConstant("")
+Evaluated with empty environment: FactoryConstructorInvocationJudgment @ org-dartlang-testcase:///const_collections_2.dart:17:10 -> StringConstant("")
+Evaluated with empty environment: SetLiteral @ org-dartlang-testcase:///const_collections_2.dart:24:56 -> SetConstant(const <String>{"", "hello", "world"})
+Evaluated with empty environment: FactoryConstructorInvocationJudgment @ org-dartlang-testcase:///const_collections_2.dart:27:10 -> StringConstant("")
+Evaluated with empty environment: SetLiteral @ org-dartlang-testcase:///const_collections_2.dart:32:57 -> SetConstant(const <String>{"A", "few", "strings", "", "hello", "world", "and", "more"})
+Evaluated with empty environment: FactoryConstructorInvocationJudgment @ org-dartlang-testcase:///const_collections_2.dart:38:10 -> StringConstant("")
+Evaluated with empty environment: MapLiteral @ org-dartlang-testcase:///const_collections_2.dart:45:61 -> MapConstant(const <String, int>{"": 42, "hello": 42, "world": 42})
+Evaluated with empty environment: FactoryConstructorInvocationJudgment @ org-dartlang-testcase:///const_collections_2.dart:48:10 -> StringConstant("")
+Evaluated with empty environment: MapLiteral @ org-dartlang-testcase:///const_collections_2.dart:53:62 -> MapConstant(const <String, int>{"A": 42, "few": 42, "strings": 42, "": 42, "hello": 42, "world": 42, "and": 42, "more": 42})
+Evaluated with empty environment: FactoryConstructorInvocationJudgment @ org-dartlang-testcase:///const_collections_2.dart:59:10 -> StringConstant("")
+Extra constant evaluation: evaluated: 14, effectively constant: 14
diff --git a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_collections_2.dart.strong.expect b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_collections_2.dart.strong.expect
new file mode 100644
index 0000000..e609799
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_collections_2.dart.strong.expect
@@ -0,0 +1,38 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+static const field core::List<core::String> listWithUnevaluatedUnevaluatedFirst = #C6;
+static const field core::List<core::String> listWithUnevaluatedUnevaluatedMiddle = #C14;
+static const field core::Set<core::String> setWithUnevaluatedUnevaluatedFirst = #C16;
+static const field core::Set<core::String> setWithUnevaluatedUnevaluatedMiddle = #C19;
+static const field core::Map<core::String, core::int> mapWithUnevaluatedUnevaluatedFirst = #C22;
+static const field core::Map<core::String, core::int> mapWithUnevaluatedUnevaluatedMiddle = #C25;
+
+constants  {
+  #C1 = "foo"
+  #C2 = "bar"
+  #C3 = "hello"
+  #C4 = "world"
+  #C5 = <core::String>[#C3, #C4]
+  #C6 = eval const <dynamic>[const core::String::fromEnvironment(#C1)] + const <dynamic>[const core::String::fromEnvironment(#C2)] + #C5
+  #C7 = "A"
+  #C8 = "few"
+  #C9 = "strings"
+  #C10 = <core::String>[#C7, #C8, #C9]
+  #C11 = "and"
+  #C12 = "more"
+  #C13 = <core::String>[#C3, #C4, #C11, #C12]
+  #C14 = eval #C10 + const <dynamic>[const core::String::fromEnvironment(#C1)] + const <dynamic>[const core::String::fromEnvironment(#C2)] + #C13
+  #C15 = <core::String>{#C3, #C4}
+  #C16 = eval const <dynamic>{const core::String::fromEnvironment(#C1)} + #C15
+  #C17 = <core::String>{#C7, #C8, #C9}
+  #C18 = <core::String>{#C3, #C4, #C11, #C12}
+  #C19 = eval #C17 + const <dynamic>{const core::String::fromEnvironment(#C1)} + #C18
+  #C20 = 42
+  #C21 = <core::String, core::int>{#C3:#C20, #C4:#C20)
+  #C22 = eval const <dynamic, dynamic>{const core::String::fromEnvironment(#C1): #C20} + #C21
+  #C23 = <core::String, core::int>{#C7:#C20, #C8:#C20, #C9:#C20)
+  #C24 = <core::String, core::int>{#C3:#C20, #C4:#C20, #C11:#C20, #C12:#C20)
+  #C25 = eval #C23 + const <dynamic, dynamic>{const core::String::fromEnvironment(#C1): #C20} + #C24
+}
diff --git a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_collections_2.dart.strong.transformed.expect b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_collections_2.dart.strong.transformed.expect
new file mode 100644
index 0000000..7214a08
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_collections_2.dart.strong.transformed.expect
@@ -0,0 +1,47 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+static const field core::List<core::String> listWithUnevaluatedUnevaluatedFirst = #C6;
+static const field core::List<core::String> listWithUnevaluatedUnevaluatedMiddle = #C14;
+static const field core::Set<core::String> setWithUnevaluatedUnevaluatedFirst = #C16;
+static const field core::Set<core::String> setWithUnevaluatedUnevaluatedMiddle = #C19;
+static const field core::Map<core::String, core::int> mapWithUnevaluatedUnevaluatedFirst = #C22;
+static const field core::Map<core::String, core::int> mapWithUnevaluatedUnevaluatedMiddle = #C25;
+
+constants  {
+  #C1 = "foo"
+  #C2 = "bar"
+  #C3 = "hello"
+  #C4 = "world"
+  #C5 = <core::String>[#C3, #C4]
+  #C6 = eval const <dynamic>[const core::String::fromEnvironment(#C1)] + const <dynamic>[const core::String::fromEnvironment(#C2)] + #C5
+  #C7 = "A"
+  #C8 = "few"
+  #C9 = "strings"
+  #C10 = <core::String>[#C7, #C8, #C9]
+  #C11 = "and"
+  #C12 = "more"
+  #C13 = <core::String>[#C3, #C4, #C11, #C12]
+  #C14 = eval #C10 + const <dynamic>[const core::String::fromEnvironment(#C1)] + const <dynamic>[const core::String::fromEnvironment(#C2)] + #C13
+  #C15 = <core::String>{#C3, #C4}
+  #C16 = eval const <dynamic>{const core::String::fromEnvironment(#C1)} + #C15
+  #C17 = <core::String>{#C7, #C8, #C9}
+  #C18 = <core::String>{#C3, #C4, #C11, #C12}
+  #C19 = eval #C17 + const <dynamic>{const core::String::fromEnvironment(#C1)} + #C18
+  #C20 = 42
+  #C21 = <core::String, core::int>{#C3:#C20, #C4:#C20)
+  #C22 = eval const <dynamic, dynamic>{const core::String::fromEnvironment(#C1): #C20} + #C21
+  #C23 = <core::String, core::int>{#C7:#C20, #C8:#C20, #C9:#C20)
+  #C24 = <core::String, core::int>{#C3:#C20, #C4:#C20, #C11:#C20, #C12:#C20)
+  #C25 = eval #C23 + const <dynamic, dynamic>{const core::String::fromEnvironment(#C1): #C20} + #C24
+}
+
+Extra constant evaluation status:
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///const_collections_2.dart:5:58 -> ListConstant(const <String>["", "", "hello", "world"])
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///const_collections_2.dart:12:59 -> ListConstant(const <String>["A", "few", "strings", "", "", "hello", "world", "and", "more"])
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///const_collections_2.dart:24:56 -> SetConstant(const <String>{"", "hello", "world"})
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///const_collections_2.dart:32:57 -> SetConstant(const <String>{"A", "few", "strings", "", "hello", "world", "and", "more"})
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///const_collections_2.dart:45:61 -> MapConstant(const <String, int>{"": 42, "hello": 42, "world": 42})
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///const_collections_2.dart:53:62 -> MapConstant(const <String, int>{"A": 42, "few": 42, "strings": 42, "": 42, "hello": 42, "world": 42, "and": 42, "more": 42})
+Extra constant evaluation: evaluated: 6, effectively constant: 6
diff --git a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_collections_2.dart.textual_outline.expect b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_collections_2.dart.textual_outline.expect
new file mode 100644
index 0000000..4695f31
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_collections_2.dart.textual_outline.expect
@@ -0,0 +1,47 @@
+const List<String> listWithUnevaluatedUnevaluatedFirst = [
+  String.fromEnvironment("foo"),
+  String.fromEnvironment("bar"),
+  "hello",
+  "world"
+];
+const List<String> listWithUnevaluatedUnevaluatedMiddle = [
+  "A",
+  "few",
+  "strings",
+  String.fromEnvironment("foo"),
+  String.fromEnvironment("bar"),
+  "hello",
+  "world",
+  "and",
+  "more"
+];
+const Set<String> setWithUnevaluatedUnevaluatedFirst = {
+  String.fromEnvironment("foo"),
+  "hello",
+  "world"
+};
+const Set<String> setWithUnevaluatedUnevaluatedMiddle = {
+  "A",
+  "few",
+  "strings",
+  String.fromEnvironment("foo"),
+  "hello",
+  "world",
+  "and",
+  "more"
+};
+const Map<String, int> mapWithUnevaluatedUnevaluatedFirst = {
+  String.fromEnvironment("foo"): 42,
+  "hello": 42,
+  "world": 42
+};
+const Map<String, int> mapWithUnevaluatedUnevaluatedMiddle = {
+  "A": 42,
+  "few": 42,
+  "strings": 42,
+  String.fromEnvironment("foo"): 42,
+  "hello": 42,
+  "world": 42,
+  "and": 42,
+  "more": 42
+};
diff --git a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_collections_2.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_collections_2.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..bbf6b72
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_collections_2.dart.textual_outline_modelled.expect
@@ -0,0 +1,47 @@
+const List<String> listWithUnevaluatedUnevaluatedFirst = [
+  String.fromEnvironment("foo"),
+  String.fromEnvironment("bar"),
+  "hello",
+  "world"
+];
+const List<String> listWithUnevaluatedUnevaluatedMiddle = [
+  "A",
+  "few",
+  "strings",
+  String.fromEnvironment("foo"),
+  String.fromEnvironment("bar"),
+  "hello",
+  "world",
+  "and",
+  "more"
+];
+const Map<String, int> mapWithUnevaluatedUnevaluatedFirst = {
+  String.fromEnvironment("foo"): 42,
+  "hello": 42,
+  "world": 42
+};
+const Map<String, int> mapWithUnevaluatedUnevaluatedMiddle = {
+  "A": 42,
+  "few": 42,
+  "strings": 42,
+  String.fromEnvironment("foo"): 42,
+  "hello": 42,
+  "world": 42,
+  "and": 42,
+  "more": 42
+};
+const Set<String> setWithUnevaluatedUnevaluatedFirst = {
+  String.fromEnvironment("foo"),
+  "hello",
+  "world"
+};
+const Set<String> setWithUnevaluatedUnevaluatedMiddle = {
+  "A",
+  "few",
+  "strings",
+  String.fromEnvironment("foo"),
+  "hello",
+  "world",
+  "and",
+  "more"
+};
diff --git a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/many_fields_pointing_to_previous_field.dart b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/many_fields_pointing_to_previous_field.dart
new file mode 100644
index 0000000..60f9127
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/many_fields_pointing_to_previous_field.dart
@@ -0,0 +1,60 @@
+const original = [
+  "lots",
+  "of",
+  "strings",
+  String.fromEnvironment("original"),
+  "that",
+  "are",
+  "already",
+  "constants",
+];
+const copy1 = original;
+const copy2 = copy1;
+const copy3 = copy2;
+const copy4 = copy3;
+const copy5 = copy4;
+const copy6 = copy5;
+const copy7 = copy6;
+const copy8 = copy7;
+const copy9 = copy8;
+const copy10 = copy9;
+const copy11 = copy10;
+const copy12 = copy11;
+const copy13 = copy12;
+const copy14 = copy13;
+const copy15 = copy14;
+const copy16 = copy15;
+const copy17 = copy16;
+const copy18 = copy17;
+const copy19 = copy18;
+const copy20 = copy19;
+const copy21 = copy20;
+const copy22 = copy21;
+const copy23 = copy22;
+const copy24 = copy23;
+const copy25 = copy24;
+const copy26 = copy25;
+const copy27 = copy26;
+const copy28 = copy27;
+const copy29 = copy28;
+const copy30 = copy29;
+const copy31 = copy30;
+const copy32 = copy31;
+const copy33 = copy32;
+const copy34 = copy33;
+const copy35 = copy34;
+const copy36 = copy35;
+const copy37 = copy36;
+const copy38 = copy37;
+const copy39 = copy38;
+const copy40 = copy39;
+const copy41 = copy40;
+const copy42 = copy41;
+const copy43 = copy42;
+const copy44 = copy43;
+const copy45 = copy44;
+const copy46 = copy45;
+const copy47 = copy46;
+const copy48 = copy47;
+const copy49 = copy48;
+const copy50 = copy49;
diff --git a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/many_fields_pointing_to_previous_field.dart.outline.expect b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/many_fields_pointing_to_previous_field.dart.outline.expect
new file mode 100644
index 0000000..7bdbe47
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/many_fields_pointing_to_previous_field.dart.outline.expect
@@ -0,0 +1,111 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+static const field core::List<core::String> original = const <core::String>["lots", "of", "strings", const core::String::fromEnvironment("original"), "that", "are", "already", "constants"];
+static const field core::List<core::String> copy1 = self::original;
+static const field core::List<core::String> copy2 = self::copy1;
+static const field core::List<core::String> copy3 = self::copy2;
+static const field core::List<core::String> copy4 = self::copy3;
+static const field core::List<core::String> copy5 = self::copy4;
+static const field core::List<core::String> copy6 = self::copy5;
+static const field core::List<core::String> copy7 = self::copy6;
+static const field core::List<core::String> copy8 = self::copy7;
+static const field core::List<core::String> copy9 = self::copy8;
+static const field core::List<core::String> copy10 = self::copy9;
+static const field core::List<core::String> copy11 = self::copy10;
+static const field core::List<core::String> copy12 = self::copy11;
+static const field core::List<core::String> copy13 = self::copy12;
+static const field core::List<core::String> copy14 = self::copy13;
+static const field core::List<core::String> copy15 = self::copy14;
+static const field core::List<core::String> copy16 = self::copy15;
+static const field core::List<core::String> copy17 = self::copy16;
+static const field core::List<core::String> copy18 = self::copy17;
+static const field core::List<core::String> copy19 = self::copy18;
+static const field core::List<core::String> copy20 = self::copy19;
+static const field core::List<core::String> copy21 = self::copy20;
+static const field core::List<core::String> copy22 = self::copy21;
+static const field core::List<core::String> copy23 = self::copy22;
+static const field core::List<core::String> copy24 = self::copy23;
+static const field core::List<core::String> copy25 = self::copy24;
+static const field core::List<core::String> copy26 = self::copy25;
+static const field core::List<core::String> copy27 = self::copy26;
+static const field core::List<core::String> copy28 = self::copy27;
+static const field core::List<core::String> copy29 = self::copy28;
+static const field core::List<core::String> copy30 = self::copy29;
+static const field core::List<core::String> copy31 = self::copy30;
+static const field core::List<core::String> copy32 = self::copy31;
+static const field core::List<core::String> copy33 = self::copy32;
+static const field core::List<core::String> copy34 = self::copy33;
+static const field core::List<core::String> copy35 = self::copy34;
+static const field core::List<core::String> copy36 = self::copy35;
+static const field core::List<core::String> copy37 = self::copy36;
+static const field core::List<core::String> copy38 = self::copy37;
+static const field core::List<core::String> copy39 = self::copy38;
+static const field core::List<core::String> copy40 = self::copy39;
+static const field core::List<core::String> copy41 = self::copy40;
+static const field core::List<core::String> copy42 = self::copy41;
+static const field core::List<core::String> copy43 = self::copy42;
+static const field core::List<core::String> copy44 = self::copy43;
+static const field core::List<core::String> copy45 = self::copy44;
+static const field core::List<core::String> copy46 = self::copy45;
+static const field core::List<core::String> copy47 = self::copy46;
+static const field core::List<core::String> copy48 = self::copy47;
+static const field core::List<core::String> copy49 = self::copy48;
+static const field core::List<core::String> copy50 = self::copy49;
+
+
+Extra constant evaluation status:
+Evaluated with empty environment: ListLiteral @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:1:18 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: FactoryConstructorInvocationJudgment @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:5:10 -> StringConstant("")
+Evaluated with empty environment: StaticGet @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:11:15 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: StaticGet @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:12:15 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: StaticGet @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:13:15 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: StaticGet @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:14:15 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: StaticGet @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:15:15 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: StaticGet @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:16:15 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: StaticGet @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:17:15 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: StaticGet @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:18:15 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: StaticGet @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:19:15 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: StaticGet @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:20:16 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: StaticGet @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:21:16 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: StaticGet @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:22:16 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: StaticGet @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:23:16 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: StaticGet @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:24:16 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: StaticGet @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:25:16 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: StaticGet @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:26:16 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: StaticGet @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:27:16 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: StaticGet @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:28:16 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: StaticGet @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:29:16 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: StaticGet @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:30:16 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: StaticGet @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:31:16 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: StaticGet @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:32:16 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: StaticGet @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:33:16 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: StaticGet @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:34:16 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: StaticGet @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:35:16 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: StaticGet @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:36:16 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: StaticGet @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:37:16 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: StaticGet @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:38:16 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: StaticGet @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:39:16 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: StaticGet @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:40:16 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: StaticGet @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:41:16 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: StaticGet @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:42:16 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: StaticGet @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:43:16 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: StaticGet @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:44:16 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: StaticGet @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:45:16 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: StaticGet @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:46:16 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: StaticGet @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:47:16 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: StaticGet @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:48:16 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: StaticGet @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:49:16 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: StaticGet @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:50:16 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: StaticGet @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:51:16 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: StaticGet @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:52:16 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: StaticGet @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:53:16 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: StaticGet @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:54:16 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: StaticGet @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:55:16 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: StaticGet @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:56:16 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: StaticGet @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:57:16 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: StaticGet @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:58:16 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: StaticGet @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:59:16 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: StaticGet @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:60:16 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Extra constant evaluation: evaluated: 52, effectively constant: 52
diff --git a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/many_fields_pointing_to_previous_field.dart.strong.expect b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/many_fields_pointing_to_previous_field.dart.strong.expect
new file mode 100644
index 0000000..3e09f70
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/many_fields_pointing_to_previous_field.dart.strong.expect
@@ -0,0 +1,69 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+static const field core::List<core::String> original = #C11;
+static const field core::List<core::String> copy1 = #C11;
+static const field core::List<core::String> copy2 = #C11;
+static const field core::List<core::String> copy3 = #C11;
+static const field core::List<core::String> copy4 = #C11;
+static const field core::List<core::String> copy5 = #C11;
+static const field core::List<core::String> copy6 = #C11;
+static const field core::List<core::String> copy7 = #C11;
+static const field core::List<core::String> copy8 = #C11;
+static const field core::List<core::String> copy9 = #C11;
+static const field core::List<core::String> copy10 = #C11;
+static const field core::List<core::String> copy11 = #C11;
+static const field core::List<core::String> copy12 = #C11;
+static const field core::List<core::String> copy13 = #C11;
+static const field core::List<core::String> copy14 = #C11;
+static const field core::List<core::String> copy15 = #C11;
+static const field core::List<core::String> copy16 = #C11;
+static const field core::List<core::String> copy17 = #C11;
+static const field core::List<core::String> copy18 = #C11;
+static const field core::List<core::String> copy19 = #C11;
+static const field core::List<core::String> copy20 = #C11;
+static const field core::List<core::String> copy21 = #C11;
+static const field core::List<core::String> copy22 = #C11;
+static const field core::List<core::String> copy23 = #C11;
+static const field core::List<core::String> copy24 = #C11;
+static const field core::List<core::String> copy25 = #C11;
+static const field core::List<core::String> copy26 = #C11;
+static const field core::List<core::String> copy27 = #C11;
+static const field core::List<core::String> copy28 = #C11;
+static const field core::List<core::String> copy29 = #C11;
+static const field core::List<core::String> copy30 = #C11;
+static const field core::List<core::String> copy31 = #C11;
+static const field core::List<core::String> copy32 = #C11;
+static const field core::List<core::String> copy33 = #C11;
+static const field core::List<core::String> copy34 = #C11;
+static const field core::List<core::String> copy35 = #C11;
+static const field core::List<core::String> copy36 = #C11;
+static const field core::List<core::String> copy37 = #C11;
+static const field core::List<core::String> copy38 = #C11;
+static const field core::List<core::String> copy39 = #C11;
+static const field core::List<core::String> copy40 = #C11;
+static const field core::List<core::String> copy41 = #C11;
+static const field core::List<core::String> copy42 = #C11;
+static const field core::List<core::String> copy43 = #C11;
+static const field core::List<core::String> copy44 = #C11;
+static const field core::List<core::String> copy45 = #C11;
+static const field core::List<core::String> copy46 = #C11;
+static const field core::List<core::String> copy47 = #C11;
+static const field core::List<core::String> copy48 = #C11;
+static const field core::List<core::String> copy49 = #C11;
+static const field core::List<core::String> copy50 = #C11;
+
+constants  {
+  #C1 = "lots"
+  #C2 = "of"
+  #C3 = "strings"
+  #C4 = <core::String>[#C1, #C2, #C3]
+  #C5 = "original"
+  #C6 = "that"
+  #C7 = "are"
+  #C8 = "already"
+  #C9 = "constants"
+  #C10 = <core::String>[#C6, #C7, #C8, #C9]
+  #C11 = eval #C4 + const <dynamic>[const core::String::fromEnvironment(#C5)] + #C10
+}
diff --git a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/many_fields_pointing_to_previous_field.dart.strong.transformed.expect b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/many_fields_pointing_to_previous_field.dart.strong.transformed.expect
new file mode 100644
index 0000000..d824410
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/many_fields_pointing_to_previous_field.dart.strong.transformed.expect
@@ -0,0 +1,123 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+static const field core::List<core::String> original = #C11;
+static const field core::List<core::String> copy1 = #C11;
+static const field core::List<core::String> copy2 = #C11;
+static const field core::List<core::String> copy3 = #C11;
+static const field core::List<core::String> copy4 = #C11;
+static const field core::List<core::String> copy5 = #C11;
+static const field core::List<core::String> copy6 = #C11;
+static const field core::List<core::String> copy7 = #C11;
+static const field core::List<core::String> copy8 = #C11;
+static const field core::List<core::String> copy9 = #C11;
+static const field core::List<core::String> copy10 = #C11;
+static const field core::List<core::String> copy11 = #C11;
+static const field core::List<core::String> copy12 = #C11;
+static const field core::List<core::String> copy13 = #C11;
+static const field core::List<core::String> copy14 = #C11;
+static const field core::List<core::String> copy15 = #C11;
+static const field core::List<core::String> copy16 = #C11;
+static const field core::List<core::String> copy17 = #C11;
+static const field core::List<core::String> copy18 = #C11;
+static const field core::List<core::String> copy19 = #C11;
+static const field core::List<core::String> copy20 = #C11;
+static const field core::List<core::String> copy21 = #C11;
+static const field core::List<core::String> copy22 = #C11;
+static const field core::List<core::String> copy23 = #C11;
+static const field core::List<core::String> copy24 = #C11;
+static const field core::List<core::String> copy25 = #C11;
+static const field core::List<core::String> copy26 = #C11;
+static const field core::List<core::String> copy27 = #C11;
+static const field core::List<core::String> copy28 = #C11;
+static const field core::List<core::String> copy29 = #C11;
+static const field core::List<core::String> copy30 = #C11;
+static const field core::List<core::String> copy31 = #C11;
+static const field core::List<core::String> copy32 = #C11;
+static const field core::List<core::String> copy33 = #C11;
+static const field core::List<core::String> copy34 = #C11;
+static const field core::List<core::String> copy35 = #C11;
+static const field core::List<core::String> copy36 = #C11;
+static const field core::List<core::String> copy37 = #C11;
+static const field core::List<core::String> copy38 = #C11;
+static const field core::List<core::String> copy39 = #C11;
+static const field core::List<core::String> copy40 = #C11;
+static const field core::List<core::String> copy41 = #C11;
+static const field core::List<core::String> copy42 = #C11;
+static const field core::List<core::String> copy43 = #C11;
+static const field core::List<core::String> copy44 = #C11;
+static const field core::List<core::String> copy45 = #C11;
+static const field core::List<core::String> copy46 = #C11;
+static const field core::List<core::String> copy47 = #C11;
+static const field core::List<core::String> copy48 = #C11;
+static const field core::List<core::String> copy49 = #C11;
+static const field core::List<core::String> copy50 = #C11;
+
+constants  {
+  #C1 = "lots"
+  #C2 = "of"
+  #C3 = "strings"
+  #C4 = <core::String>[#C1, #C2, #C3]
+  #C5 = "original"
+  #C6 = "that"
+  #C7 = "are"
+  #C8 = "already"
+  #C9 = "constants"
+  #C10 = <core::String>[#C6, #C7, #C8, #C9]
+  #C11 = eval #C4 + const <dynamic>[const core::String::fromEnvironment(#C5)] + #C10
+}
+
+Extra constant evaluation status:
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:1:18 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:11:15 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:12:15 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:13:15 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:14:15 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:15:15 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:16:15 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:17:15 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:18:15 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:19:15 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:20:16 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:21:16 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:22:16 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:23:16 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:24:16 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:25:16 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:26:16 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:27:16 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:28:16 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:29:16 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:30:16 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:31:16 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:32:16 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:33:16 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:34:16 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:35:16 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:36:16 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:37:16 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:38:16 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:39:16 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:40:16 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:41:16 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:42:16 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:43:16 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:44:16 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:45:16 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:46:16 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:47:16 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:48:16 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:49:16 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:50:16 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:51:16 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:52:16 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:53:16 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:54:16 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:55:16 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:56:16 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:57:16 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:58:16 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:59:16 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Evaluated with empty environment: ConstantExpression @ org-dartlang-testcase:///many_fields_pointing_to_previous_field.dart:60:16 -> ListConstant(const <String>["lots", "of", "strings", "", "that", "are", "already", "constants"])
+Extra constant evaluation: evaluated: 51, effectively constant: 51
diff --git a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/many_fields_pointing_to_previous_field.dart.textual_outline.expect b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/many_fields_pointing_to_previous_field.dart.textual_outline.expect
new file mode 100644
index 0000000..60f9127
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/many_fields_pointing_to_previous_field.dart.textual_outline.expect
@@ -0,0 +1,60 @@
+const original = [
+  "lots",
+  "of",
+  "strings",
+  String.fromEnvironment("original"),
+  "that",
+  "are",
+  "already",
+  "constants",
+];
+const copy1 = original;
+const copy2 = copy1;
+const copy3 = copy2;
+const copy4 = copy3;
+const copy5 = copy4;
+const copy6 = copy5;
+const copy7 = copy6;
+const copy8 = copy7;
+const copy9 = copy8;
+const copy10 = copy9;
+const copy11 = copy10;
+const copy12 = copy11;
+const copy13 = copy12;
+const copy14 = copy13;
+const copy15 = copy14;
+const copy16 = copy15;
+const copy17 = copy16;
+const copy18 = copy17;
+const copy19 = copy18;
+const copy20 = copy19;
+const copy21 = copy20;
+const copy22 = copy21;
+const copy23 = copy22;
+const copy24 = copy23;
+const copy25 = copy24;
+const copy26 = copy25;
+const copy27 = copy26;
+const copy28 = copy27;
+const copy29 = copy28;
+const copy30 = copy29;
+const copy31 = copy30;
+const copy32 = copy31;
+const copy33 = copy32;
+const copy34 = copy33;
+const copy35 = copy34;
+const copy36 = copy35;
+const copy37 = copy36;
+const copy38 = copy37;
+const copy39 = copy38;
+const copy40 = copy39;
+const copy41 = copy40;
+const copy42 = copy41;
+const copy43 = copy42;
+const copy44 = copy43;
+const copy45 = copy44;
+const copy46 = copy45;
+const copy47 = copy46;
+const copy48 = copy47;
+const copy49 = copy48;
+const copy50 = copy49;
diff --git a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/many_fields_pointing_to_previous_field.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/many_fields_pointing_to_previous_field.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..f4abfb4
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/many_fields_pointing_to_previous_field.dart.textual_outline_modelled.expect
@@ -0,0 +1,60 @@
+const copy1 = original;
+const copy10 = copy9;
+const copy11 = copy10;
+const copy12 = copy11;
+const copy13 = copy12;
+const copy14 = copy13;
+const copy15 = copy14;
+const copy16 = copy15;
+const copy17 = copy16;
+const copy18 = copy17;
+const copy19 = copy18;
+const copy2 = copy1;
+const copy20 = copy19;
+const copy21 = copy20;
+const copy22 = copy21;
+const copy23 = copy22;
+const copy24 = copy23;
+const copy25 = copy24;
+const copy26 = copy25;
+const copy27 = copy26;
+const copy28 = copy27;
+const copy29 = copy28;
+const copy3 = copy2;
+const copy30 = copy29;
+const copy31 = copy30;
+const copy32 = copy31;
+const copy33 = copy32;
+const copy34 = copy33;
+const copy35 = copy34;
+const copy36 = copy35;
+const copy37 = copy36;
+const copy38 = copy37;
+const copy39 = copy38;
+const copy4 = copy3;
+const copy40 = copy39;
+const copy41 = copy40;
+const copy42 = copy41;
+const copy43 = copy42;
+const copy44 = copy43;
+const copy45 = copy44;
+const copy46 = copy45;
+const copy47 = copy46;
+const copy48 = copy47;
+const copy49 = copy48;
+const copy5 = copy4;
+const copy50 = copy49;
+const copy6 = copy5;
+const copy7 = copy6;
+const copy8 = copy7;
+const copy9 = copy8;
+const original = [
+  "lots",
+  "of",
+  "strings",
+  String.fromEnvironment("original"),
+  "that",
+  "are",
+  "already",
+  "constants",
+];
diff --git a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/rudimentary_test_01.dart.strong.expect b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/rudimentary_test_01.dart.strong.expect
index 113d7a2..9505b07 100644
--- a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/rudimentary_test_01.dart.strong.expect
+++ b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/rudimentary_test_01.dart.strong.expect
@@ -9,11 +9,11 @@
 static method main() → dynamic {
   self::_x();
   #C10;
-  core::print(#C11);
+  core::print(#C6);
 }
 static method _x() → void {
   core::print(#C1);
-  core::print(#C12);
+  core::print(#C6);
 }
 
 constants  {
@@ -27,6 +27,4 @@
   #C8 = #org-dartlang-testcase:///rudimentary_test_01.dart::_x
   #C9 = "foo"
   #C10 = eval const core::bool::fromEnvironment(#C9)
-  #C11 = eval "${#C2}${const core::String::fromEnvironment(#C3, defaultValue: #C4)}${#C5}"
-  #C12 = eval "${#C2}${const core::String::fromEnvironment(#C3, defaultValue: #C4)}${#C5}"
 }
diff --git a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/rudimentary_test_01.dart.strong.transformed.expect b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/rudimentary_test_01.dart.strong.transformed.expect
index 6957744..6bce502 100644
--- a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/rudimentary_test_01.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/rudimentary_test_01.dart.strong.transformed.expect
@@ -13,7 +13,7 @@
 }
 static method _x() → void {
   core::print(#C1);
-  core::print(#C12);
+  core::print(#C11);
 }
 
 constants  {
@@ -28,7 +28,6 @@
   #C9 = "foo"
   #C10 = eval const core::bool::fromEnvironment(#C9)
   #C11 = eval "${#C2}${const core::String::fromEnvironment(#C3, defaultValue: #C4)}${#C5}"
-  #C12 = eval "${#C2}${const core::String::fromEnvironment(#C3, defaultValue: #C4)}${#C5}"
 }
 
 Extra constant evaluation status:
diff --git a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart.outline.expect b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart.outline.expect
index 4106544..7171bac 100644
--- a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart.outline.expect
+++ b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart.outline.expect
@@ -112,8 +112,8 @@
 static const field core::bool isItInt2 = self::maybeInt2 is{ForNonNullableByDefault} core::int ?{core::bool} true : false;
 static const field core::int? maybeInt3 = self::z ?{core::int?} 42 : null;
 static const field core::bool isItInt3 = self::maybeInt3 is{ForNonNullableByDefault} core::int ?{core::bool} true : false;
-static const field dynamic listOfNull = const <core::Null?>[null];
-static const field core::bool isListOfNull = self::listOfNull is{ForNonNullableByDefault} core::List<core::Null?>;
+static const field dynamic listOfNull = const <Null>[null];
+static const field core::bool isListOfNull = self::listOfNull is{ForNonNullableByDefault} core::List<Null>;
 static const field dynamic listOfInt = const <core::int>[42];
 static const field core::bool isListOfInt = self::listOfInt is{ForNonNullableByDefault} core::List<core::int>;
 static const field core::bool isList = self::listOfInt is{ForNonNullableByDefault} core::List<dynamic>;
@@ -180,7 +180,7 @@
 Evaluated: ConditionalExpression @ org-dartlang-testcase:///various.dart:45:40 -> BoolConstant(false)
 Evaluated: ConditionalExpression @ org-dartlang-testcase:///various.dart:46:21 -> NullConstant(null)
 Evaluated: ConditionalExpression @ org-dartlang-testcase:///various.dart:47:40 -> BoolConstant(false)
-Evaluated: ListLiteral @ org-dartlang-testcase:///various.dart:49:28 -> ListConstant(const <Null?>[null])
+Evaluated: ListLiteral @ org-dartlang-testcase:///various.dart:49:28 -> ListConstant(const <Null>[null])
 Evaluated: IsExpression @ org-dartlang-testcase:///various.dart:50:38 -> BoolConstant(true)
 Evaluated: ListLiteral @ org-dartlang-testcase:///various.dart:51:27 -> ListConstant(const <int>[42])
 Evaluated: IsExpression @ org-dartlang-testcase:///various.dart:52:36 -> BoolConstant(true)
diff --git a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart.strong.expect b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart.strong.expect
index 3950e82..aa1a131 100644
--- a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart.strong.expect
+++ b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart.strong.expect
@@ -125,80 +125,80 @@
 static const field core::bool conditionalOnNull = #C14;
 static const field core::bool nullAwareOnNull = #C15;
 static const field core::bool andOnNull = #C16;
-static const field core::bool andOnNull2 = #C17;
-static const field core::bool orOnNull = #C18;
-static const field core::bool orOnNull2 = #C19;
+static const field core::bool andOnNull2 = #C11;
+static const field core::bool orOnNull = #C17;
+static const field core::bool orOnNull2 = #C18;
 static const field core::bool orOnNull3 = #C8;
-static const field core::bool orOnNull4 = #C20;
+static const field core::bool orOnNull4 = #C11;
 static const field core::int fromDeferredLib = invalid-expression "'lib' can't be used in a constant expression because it's marked as 'deferred' which means it isn't available until loaded.";
-static const field self::Foo<core::int> x = #C22;
+static const field self::Foo<core::int> x = #C20;
 static const field core::bool? y = #C8;
 static const field core::bool z = #C13;
-static const field core::Object maybeInt = #C23;
-static const field core::bool isItInt = #C24;
+static const field core::Object maybeInt = #C21;
+static const field core::bool isItInt = #C22;
 static const field core::Object maybeInt2 = #C8;
 static const field core::bool isItInt2 = #C13;
 static const field core::int? maybeInt3 = #C9;
 static const field core::bool isItInt3 = #C13;
-static const field dynamic listOfNull = #C25;
+static const field dynamic listOfNull = #C23;
 static const field core::bool isListOfNull = #C8;
-static const field dynamic listOfInt = #C26;
+static const field dynamic listOfInt = #C24;
 static const field core::bool isListOfInt = #C8;
 static const field core::bool isList = #C8;
-static const field dynamic setOfInt = #C27;
+static const field dynamic setOfInt = #C25;
 static const field core::bool isSetOfInt = #C8;
-static const field dynamic mapOfInt = #C28;
+static const field dynamic mapOfInt = #C26;
 static const field core::bool isMapOfInt = #C8;
-static const field dynamic listOfListOfInt = #C29;
+static const field dynamic listOfListOfInt = #C27;
 static const field core::bool isListOfListOfInt = #C8;
-static const field dynamic setOfSetOfInt = #C30;
+static const field dynamic setOfSetOfInt = #C28;
 static const field core::bool isSetOfSetOfInt = #C8;
-static const field dynamic mapOfMapOfInt1 = #C31;
-static const field dynamic mapOfMapOfInt2 = #C32;
+static const field dynamic mapOfMapOfInt1 = #C29;
+static const field dynamic mapOfMapOfInt2 = #C30;
 static const field core::bool isMapOfMapOfInt1 = #C8;
 static const field core::bool isMapOfMapOfInt2 = #C8;
-static const field core::Symbol symbolWithUnevaluatedParameter = #C33;
+static const field core::Symbol symbolWithUnevaluatedParameter = #C31;
 static const field core::Symbol symbolWithInvalidName = invalid-expression "The symbol name must be a valid public Dart member name, public constructor name, or library name, optionally qualified, but was '\"42\"'.";
-static const field self::Class<self::B>? c0 = #C35;
+static const field self::Class<self::B>? c0 = #C33;
 static const field self::Class<self::A>? c1 = invalid-expression "pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart:100:34: Error: The argument type 'A' can't be assigned to the parameter type 'T'.
  - 'A' is from 'pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart'.
   const Class.method(T t) : this(-t);
                                  ^";
-static const field self::Subclass<self::B>? c2 = #C36;
-static const field self::Class<self::A>? c3 = #C37;
-static const field self::Class<self::B>? c4 = #C38;
-static const field self::Subclass<self::A>? c5 = #C39;
-static const field self::Subclass<self::B>? c6 = #C40;
-static const field core::Type f = #C41;
-static field self::ConstClassWithF constClassWithF1 = #C43;
-static const field self::ConstClassWithF constClassWithF2 = #C43;
-static const field core::bool unevaluatedBool = #C44;
-static const field core::bool notUnevaluatedBool = #C45;
-static const field core::bool? unevaluatedBoolOrNull = #C46;
-static const field core::bool unevaluatedBoolNotNull = #C47;
+static const field self::Subclass<self::B>? c2 = #C34;
+static const field self::Class<self::A>? c3 = #C35;
+static const field self::Class<self::B>? c4 = #C36;
+static const field self::Subclass<self::A>? c5 = #C37;
+static const field self::Subclass<self::B>? c6 = #C38;
+static const field core::Type f = #C39;
+static field self::ConstClassWithF constClassWithF1 = #C41;
+static const field self::ConstClassWithF constClassWithF2 = #C41;
+static const field core::bool unevaluatedBool = #C42;
+static const field core::bool notUnevaluatedBool = #C43;
+static const field core::bool? unevaluatedBoolOrNull = #C44;
+static const field core::bool unevaluatedBoolNotNull = #C45;
 static method procedure(core::int i, {core::int named = #C9}) → core::int
   return i;
 static method main() → dynamic {
-  core::print(#C48);
+  core::print(#C33);
   core::print(invalid-expression "pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart:100:34: Error: The argument type 'A' can't be assigned to the parameter type 'T'.
  - 'A' is from 'pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart'.
   const Class.method(T t) : this(-t);
                                  ^");
-  core::print(#C49);
-  core::print(#C50);
-  core::print(#C51);
-  core::print(#C52);
-  core::print(#C53);
-  core::print(#C54);
-  core::print((#C55).{self::Foo::saved});
-  core::print((#C56).{self::Foo::value});
+  core::print(#C34);
+  core::print(#C35);
+  core::print(#C36);
+  core::print(#C37);
+  core::print(#C38);
+  core::print(#C20);
+  core::print((#C20).{self::Foo::saved});
+  core::print((#C20).{self::Foo::value});
 }
 
 library /*isNonNullableByDefault*/;
 import self as self2;
 import "dart:core" as core;
 
-static const field core::int x = #C21;
+static const field core::int x = #C19;
 
 constants  {
   #C1 = "foo"
@@ -217,44 +217,33 @@
   #C14 = eval const core::bool::fromEnvironment(#C2, defaultValue: (const core::bool::fromEnvironment(#C2) ?{core::bool?} #C8 : #C9)!) ?{core::bool} #C8 : #C13
   #C15 = eval const core::bool::fromEnvironment(#C2, defaultValue: (const core::bool::fromEnvironment(#C2) ?{core::bool?} #C8 : #C9)!).==(#C9) ?{core::bool} #C8 : const core::bool::fromEnvironment(#C2, defaultValue: (const core::bool::fromEnvironment(#C2) ?{core::bool?} #C8 : #C9)!)
   #C16 = eval const core::bool::fromEnvironment(#C2, defaultValue: (const core::bool::fromEnvironment(#C2) ?{core::bool?} #C8 : #C9)!) && (#C8)
-  #C17 = eval const core::bool::fromEnvironment(#C2, defaultValue: (const core::bool::fromEnvironment(#C2) ?{core::bool?} #C8 : #C9)!)
-  #C18 = eval const core::bool::fromEnvironment(#C2, defaultValue: (const core::bool::fromEnvironment(#C2) ?{core::bool?} #C8 : #C9)!) || (#C8)
-  #C19 = eval const core::bool::fromEnvironment(#C2, defaultValue: (const core::bool::fromEnvironment(#C2) ?{core::bool?} #C8 : #C9)!) || (#C13)
-  #C20 = eval const core::bool::fromEnvironment(#C2, defaultValue: (const core::bool::fromEnvironment(#C2) ?{core::bool?} #C8 : #C9)!)
-  #C21 = 42
-  #C22 = eval self::Foo<core::int>{saved:const core::bool::fromEnvironment(#C1, defaultValue: const core::bool::fromEnvironment(#C2)), saved2:const core::bool::fromEnvironment(#C1, defaultValue: const core::bool::fromEnvironment(#C2)), initialized:const core::bool::fromEnvironment(#C1, defaultValue: const core::bool::fromEnvironment(#C2)), value:#C21}
-  #C23 = eval const core::bool::fromEnvironment(#C1) ?{core::Object} #C21 : #C8
-  #C24 = eval (const core::bool::fromEnvironment(#C1) ?{core::Object} #C21 : #C8) is{ForNonNullableByDefault} core::int ?{core::bool} #C8 : #C13
-  #C25 = <core::Null?>[#C9]
-  #C26 = <core::int>[#C21]
-  #C27 = <core::int>{#C21}
-  #C28 = <core::int, core::int>{#C21:#C21)
-  #C29 = <core::List<core::int>>[#C26]
-  #C30 = <core::Set<core::int>>{#C27}
-  #C31 = <core::Map<core::int, core::int>, core::int>{#C28:#C21)
-  #C32 = <core::int, core::Map<core::int, core::int>>{#C21:#C28)
-  #C33 = eval const _in::Symbol::•(const core::String::fromEnvironment(#C1))
-  #C34 = "x"
-  #C35 = eval const core::bool::fromEnvironment(#C34) ?{self::Class<self::B>?} #C9 : self::Class<self::B>{(self::C{}) as{ForNonNullableByDefault} self::B}
-  #C36 = eval const core::bool::fromEnvironment(#C34) ?{self::Subclass<self::B>?} #C9 : self::Subclass<self::B>{(self::C{}) as{ForNonNullableByDefault} self::B}
-  #C37 = eval const core::bool::fromEnvironment(#C34) ?{self::Class<self::A>?} #C9 : self::Class<self::A>{self::A{}}
-  #C38 = eval const core::bool::fromEnvironment(#C34) ?{self::Class<self::B>?} #C9 : self::Class<self::B>{(self::B{}) as{ForNonNullableByDefault} self::B}
-  #C39 = eval const core::bool::fromEnvironment(#C34) ?{self::Subclass<self::A>?} #C9 : self::Subclass<self::A>{(self::A{}) as{ForNonNullableByDefault} self::A}
-  #C40 = eval const core::bool::fromEnvironment(#C34) ?{self::Subclass<self::B>?} #C9 : self::Subclass<self::B>{(self::B{}) as{ForNonNullableByDefault} self::B}
-  #C41 = TypeLiteralConstant((core::int, {named: core::int}) → core::int)
-  #C42 = tearoff self::procedure
-  #C43 = self::ConstClassWithF {foo:#C42}
-  #C44 = eval const core::bool::fromEnvironment(#C1)
-  #C45 = eval !const core::bool::fromEnvironment(#C1)
-  #C46 = eval const core::bool::fromEnvironment(#C2) ?{core::bool?} const core::bool::fromEnvironment(#C1) : #C9
-  #C47 = eval (const core::bool::fromEnvironment(#C2) ?{core::bool?} const core::bool::fromEnvironment(#C1) : #C9)!
-  #C48 = eval const core::bool::fromEnvironment(#C34) ?{self::Class<self::B>?} #C9 : self::Class<self::B>{(self::C{}) as{ForNonNullableByDefault} self::B}
-  #C49 = eval const core::bool::fromEnvironment(#C34) ?{self::Subclass<self::B>?} #C9 : self::Subclass<self::B>{(self::C{}) as{ForNonNullableByDefault} self::B}
-  #C50 = eval const core::bool::fromEnvironment(#C34) ?{self::Class<self::A>?} #C9 : self::Class<self::A>{self::A{}}
-  #C51 = eval const core::bool::fromEnvironment(#C34) ?{self::Class<self::B>?} #C9 : self::Class<self::B>{(self::B{}) as{ForNonNullableByDefault} self::B}
-  #C52 = eval const core::bool::fromEnvironment(#C34) ?{self::Subclass<self::A>?} #C9 : self::Subclass<self::A>{(self::A{}) as{ForNonNullableByDefault} self::A}
-  #C53 = eval const core::bool::fromEnvironment(#C34) ?{self::Subclass<self::B>?} #C9 : self::Subclass<self::B>{(self::B{}) as{ForNonNullableByDefault} self::B}
-  #C54 = eval self::Foo<core::int>{saved:const core::bool::fromEnvironment(#C1, defaultValue: const core::bool::fromEnvironment(#C2)), saved2:const core::bool::fromEnvironment(#C1, defaultValue: const core::bool::fromEnvironment(#C2)), initialized:const core::bool::fromEnvironment(#C1, defaultValue: const core::bool::fromEnvironment(#C2)), value:#C21}
-  #C55 = eval self::Foo<core::int>{saved:const core::bool::fromEnvironment(#C1, defaultValue: const core::bool::fromEnvironment(#C2)), saved2:const core::bool::fromEnvironment(#C1, defaultValue: const core::bool::fromEnvironment(#C2)), initialized:const core::bool::fromEnvironment(#C1, defaultValue: const core::bool::fromEnvironment(#C2)), value:#C21}
-  #C56 = eval self::Foo<core::int>{saved:const core::bool::fromEnvironment(#C1, defaultValue: const core::bool::fromEnvironment(#C2)), saved2:const core::bool::fromEnvironment(#C1, defaultValue: const core::bool::fromEnvironment(#C2)), initialized:const core::bool::fromEnvironment(#C1, defaultValue: const core::bool::fromEnvironment(#C2)), value:#C21}
+  #C17 = eval const core::bool::fromEnvironment(#C2, defaultValue: (const core::bool::fromEnvironment(#C2) ?{core::bool?} #C8 : #C9)!) || (#C8)
+  #C18 = eval const core::bool::fromEnvironment(#C2, defaultValue: (const core::bool::fromEnvironment(#C2) ?{core::bool?} #C8 : #C9)!) || (#C13)
+  #C19 = 42
+  #C20 = eval self::Foo<core::int>{saved:const core::bool::fromEnvironment(#C1, defaultValue: const core::bool::fromEnvironment(#C2)), saved2:const core::bool::fromEnvironment(#C1, defaultValue: const core::bool::fromEnvironment(#C2)), initialized:const core::bool::fromEnvironment(#C1, defaultValue: const core::bool::fromEnvironment(#C2)), value:#C19}
+  #C21 = eval const core::bool::fromEnvironment(#C1) ?{core::Object} #C19 : #C8
+  #C22 = eval (const core::bool::fromEnvironment(#C1) ?{core::Object} #C19 : #C8) is{ForNonNullableByDefault} core::int ?{core::bool} #C8 : #C13
+  #C23 = <Null>[#C9]
+  #C24 = <core::int>[#C19]
+  #C25 = <core::int>{#C19}
+  #C26 = <core::int, core::int>{#C19:#C19)
+  #C27 = <core::List<core::int>>[#C24]
+  #C28 = <core::Set<core::int>>{#C25}
+  #C29 = <core::Map<core::int, core::int>, core::int>{#C26:#C19)
+  #C30 = <core::int, core::Map<core::int, core::int>>{#C19:#C26)
+  #C31 = eval const _in::Symbol::•(const core::String::fromEnvironment(#C1))
+  #C32 = "x"
+  #C33 = eval const core::bool::fromEnvironment(#C32) ?{self::Class<self::B>?} #C9 : self::Class<self::B>{(self::C{}) as{ForNonNullableByDefault} self::B}
+  #C34 = eval const core::bool::fromEnvironment(#C32) ?{self::Subclass<self::B>?} #C9 : self::Subclass<self::B>{(self::C{}) as{ForNonNullableByDefault} self::B}
+  #C35 = eval const core::bool::fromEnvironment(#C32) ?{self::Class<self::A>?} #C9 : self::Class<self::A>{self::A{}}
+  #C36 = eval const core::bool::fromEnvironment(#C32) ?{self::Class<self::B>?} #C9 : self::Class<self::B>{(self::B{}) as{ForNonNullableByDefault} self::B}
+  #C37 = eval const core::bool::fromEnvironment(#C32) ?{self::Subclass<self::A>?} #C9 : self::Subclass<self::A>{(self::A{}) as{ForNonNullableByDefault} self::A}
+  #C38 = eval const core::bool::fromEnvironment(#C32) ?{self::Subclass<self::B>?} #C9 : self::Subclass<self::B>{(self::B{}) as{ForNonNullableByDefault} self::B}
+  #C39 = TypeLiteralConstant((core::int, {named: core::int}) → core::int)
+  #C40 = tearoff self::procedure
+  #C41 = self::ConstClassWithF {foo:#C40}
+  #C42 = eval const core::bool::fromEnvironment(#C1)
+  #C43 = eval !const core::bool::fromEnvironment(#C1)
+  #C44 = eval const core::bool::fromEnvironment(#C2) ?{core::bool?} const core::bool::fromEnvironment(#C1) : #C9
+  #C45 = eval (const core::bool::fromEnvironment(#C2) ?{core::bool?} const core::bool::fromEnvironment(#C1) : #C9)!
 }
diff --git a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart.strong.transformed.expect b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart.strong.transformed.expect
index 0d34728..9d5946b 100644
--- a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart.strong.transformed.expect
@@ -125,80 +125,80 @@
 static const field core::bool conditionalOnNull = #C14;
 static const field core::bool nullAwareOnNull = #C15;
 static const field core::bool andOnNull = #C16;
-static const field core::bool andOnNull2 = #C17;
-static const field core::bool orOnNull = #C18;
-static const field core::bool orOnNull2 = #C19;
+static const field core::bool andOnNull2 = #C11;
+static const field core::bool orOnNull = #C17;
+static const field core::bool orOnNull2 = #C18;
 static const field core::bool orOnNull3 = #C8;
-static const field core::bool orOnNull4 = #C20;
+static const field core::bool orOnNull4 = #C11;
 static const field core::int fromDeferredLib = invalid-expression "'lib' can't be used in a constant expression because it's marked as 'deferred' which means it isn't available until loaded.";
-static const field self::Foo<core::int> x = #C22;
+static const field self::Foo<core::int> x = #C20;
 static const field core::bool? y = #C8;
 static const field core::bool z = #C13;
-static const field core::Object maybeInt = #C23;
-static const field core::bool isItInt = #C24;
+static const field core::Object maybeInt = #C21;
+static const field core::bool isItInt = #C22;
 static const field core::Object maybeInt2 = #C8;
 static const field core::bool isItInt2 = #C13;
 static const field core::int? maybeInt3 = #C9;
 static const field core::bool isItInt3 = #C13;
-static const field dynamic listOfNull = #C25;
+static const field dynamic listOfNull = #C23;
 static const field core::bool isListOfNull = #C8;
-static const field dynamic listOfInt = #C26;
+static const field dynamic listOfInt = #C24;
 static const field core::bool isListOfInt = #C8;
 static const field core::bool isList = #C8;
-static const field dynamic setOfInt = #C27;
+static const field dynamic setOfInt = #C25;
 static const field core::bool isSetOfInt = #C8;
-static const field dynamic mapOfInt = #C28;
+static const field dynamic mapOfInt = #C26;
 static const field core::bool isMapOfInt = #C8;
-static const field dynamic listOfListOfInt = #C29;
+static const field dynamic listOfListOfInt = #C27;
 static const field core::bool isListOfListOfInt = #C8;
-static const field dynamic setOfSetOfInt = #C30;
+static const field dynamic setOfSetOfInt = #C28;
 static const field core::bool isSetOfSetOfInt = #C8;
-static const field dynamic mapOfMapOfInt1 = #C31;
-static const field dynamic mapOfMapOfInt2 = #C32;
+static const field dynamic mapOfMapOfInt1 = #C29;
+static const field dynamic mapOfMapOfInt2 = #C30;
 static const field core::bool isMapOfMapOfInt1 = #C8;
 static const field core::bool isMapOfMapOfInt2 = #C8;
-static const field core::Symbol symbolWithUnevaluatedParameter = #C33;
+static const field core::Symbol symbolWithUnevaluatedParameter = #C31;
 static const field core::Symbol symbolWithInvalidName = invalid-expression "The symbol name must be a valid public Dart member name, public constructor name, or library name, optionally qualified, but was '\"42\"'.";
-static const field self::Class<self::B>? c0 = #C35;
+static const field self::Class<self::B>? c0 = #C33;
 static const field self::Class<self::A>? c1 = invalid-expression "pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart:100:34: Error: The argument type 'A' can't be assigned to the parameter type 'T'.
  - 'A' is from 'pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart'.
   const Class.method(T t) : this(-t);
                                  ^";
-static const field self::Subclass<self::B>? c2 = #C36;
-static const field self::Class<self::A>? c3 = #C37;
-static const field self::Class<self::B>? c4 = #C38;
-static const field self::Subclass<self::A>? c5 = #C39;
-static const field self::Subclass<self::B>? c6 = #C40;
-static const field core::Type f = #C41;
-static field self::ConstClassWithF constClassWithF1 = #C43;
-static const field self::ConstClassWithF constClassWithF2 = #C43;
-static const field core::bool unevaluatedBool = #C44;
-static const field core::bool notUnevaluatedBool = #C45;
-static const field core::bool? unevaluatedBoolOrNull = #C46;
-static const field core::bool unevaluatedBoolNotNull = #C47;
+static const field self::Subclass<self::B>? c2 = #C34;
+static const field self::Class<self::A>? c3 = #C35;
+static const field self::Class<self::B>? c4 = #C36;
+static const field self::Subclass<self::A>? c5 = #C37;
+static const field self::Subclass<self::B>? c6 = #C38;
+static const field core::Type f = #C39;
+static field self::ConstClassWithF constClassWithF1 = #C41;
+static const field self::ConstClassWithF constClassWithF2 = #C41;
+static const field core::bool unevaluatedBool = #C42;
+static const field core::bool notUnevaluatedBool = #C43;
+static const field core::bool? unevaluatedBoolOrNull = #C44;
+static const field core::bool unevaluatedBoolNotNull = #C45;
 static method procedure(core::int i, {core::int named = #C9}) → core::int
   return i;
 static method main() → dynamic {
-  core::print(#C48);
+  core::print(#C46);
   core::print(invalid-expression "pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart:100:34: Error: The argument type 'A' can't be assigned to the parameter type 'T'.
  - 'A' is from 'pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart'.
   const Class.method(T t) : this(-t);
                                  ^");
+  core::print(#C47);
+  core::print(#C48);
   core::print(#C49);
   core::print(#C50);
   core::print(#C51);
   core::print(#C52);
-  core::print(#C53);
-  core::print(#C54);
-  core::print((#C55).{self::Foo::saved});
-  core::print((#C56).{self::Foo::value});
+  core::print((#C52).{self::Foo::saved});
+  core::print((#C52).{self::Foo::value});
 }
 
 library /*isNonNullableByDefault*/;
 import self as self2;
 import "dart:core" as core;
 
-static const field core::int x = #C21;
+static const field core::int x = #C19;
 
 constants  {
   #C1 = "foo"
@@ -217,46 +217,42 @@
   #C14 = eval const core::bool::fromEnvironment(#C2, defaultValue: (const core::bool::fromEnvironment(#C2) ?{core::bool?} #C8 : #C9)!) ?{core::bool} #C8 : #C13
   #C15 = eval const core::bool::fromEnvironment(#C2, defaultValue: (const core::bool::fromEnvironment(#C2) ?{core::bool?} #C8 : #C9)!).==(#C9) ?{core::bool} #C8 : const core::bool::fromEnvironment(#C2, defaultValue: (const core::bool::fromEnvironment(#C2) ?{core::bool?} #C8 : #C9)!)
   #C16 = eval const core::bool::fromEnvironment(#C2, defaultValue: (const core::bool::fromEnvironment(#C2) ?{core::bool?} #C8 : #C9)!) && (#C8)
-  #C17 = eval const core::bool::fromEnvironment(#C2, defaultValue: (const core::bool::fromEnvironment(#C2) ?{core::bool?} #C8 : #C9)!)
-  #C18 = eval const core::bool::fromEnvironment(#C2, defaultValue: (const core::bool::fromEnvironment(#C2) ?{core::bool?} #C8 : #C9)!) || (#C8)
-  #C19 = eval const core::bool::fromEnvironment(#C2, defaultValue: (const core::bool::fromEnvironment(#C2) ?{core::bool?} #C8 : #C9)!) || (#C13)
-  #C20 = eval const core::bool::fromEnvironment(#C2, defaultValue: (const core::bool::fromEnvironment(#C2) ?{core::bool?} #C8 : #C9)!)
-  #C21 = 42
-  #C22 = eval self::Foo<core::int>{saved:const core::bool::fromEnvironment(#C1, defaultValue: const core::bool::fromEnvironment(#C2)), saved2:const core::bool::fromEnvironment(#C1, defaultValue: const core::bool::fromEnvironment(#C2)), initialized:const core::bool::fromEnvironment(#C1, defaultValue: const core::bool::fromEnvironment(#C2)), value:#C21}
-  #C23 = eval const core::bool::fromEnvironment(#C1) ?{core::Object} #C21 : #C8
-  #C24 = eval (const core::bool::fromEnvironment(#C1) ?{core::Object} #C21 : #C8) is{ForNonNullableByDefault} core::int ?{core::bool} #C8 : #C13
-  #C25 = <core::Null?>[#C9]
-  #C26 = <core::int>[#C21]
-  #C27 = <core::int>{#C21}
-  #C28 = <core::int, core::int>{#C21:#C21)
-  #C29 = <core::List<core::int>>[#C26]
-  #C30 = <core::Set<core::int>>{#C27}
-  #C31 = <core::Map<core::int, core::int>, core::int>{#C28:#C21)
-  #C32 = <core::int, core::Map<core::int, core::int>>{#C21:#C28)
-  #C33 = eval const _in::Symbol::•(const core::String::fromEnvironment(#C1))
-  #C34 = "x"
-  #C35 = eval const core::bool::fromEnvironment(#C34) ?{self::Class<self::B>?} #C9 : self::Class<self::B>{(self::C{}) as{ForNonNullableByDefault} self::B}
-  #C36 = eval const core::bool::fromEnvironment(#C34) ?{self::Subclass<self::B>?} #C9 : self::Subclass<self::B>{(self::C{}) as{ForNonNullableByDefault} self::B}
-  #C37 = eval const core::bool::fromEnvironment(#C34) ?{self::Class<self::A>?} #C9 : self::Class<self::A>{self::A{}}
-  #C38 = eval const core::bool::fromEnvironment(#C34) ?{self::Class<self::B>?} #C9 : self::Class<self::B>{(self::B{}) as{ForNonNullableByDefault} self::B}
-  #C39 = eval const core::bool::fromEnvironment(#C34) ?{self::Subclass<self::A>?} #C9 : self::Subclass<self::A>{(self::A{}) as{ForNonNullableByDefault} self::A}
-  #C40 = eval const core::bool::fromEnvironment(#C34) ?{self::Subclass<self::B>?} #C9 : self::Subclass<self::B>{(self::B{}) as{ForNonNullableByDefault} self::B}
-  #C41 = TypeLiteralConstant((core::int, {named: core::int}) → core::int)
-  #C42 = tearoff self::procedure
-  #C43 = self::ConstClassWithF {foo:#C42}
-  #C44 = eval const core::bool::fromEnvironment(#C1)
-  #C45 = eval !const core::bool::fromEnvironment(#C1)
-  #C46 = eval const core::bool::fromEnvironment(#C2) ?{core::bool?} const core::bool::fromEnvironment(#C1) : #C9
-  #C47 = eval (const core::bool::fromEnvironment(#C2) ?{core::bool?} const core::bool::fromEnvironment(#C1) : #C9)!
-  #C48 = eval const core::bool::fromEnvironment(#C34) ?{self::Class<self::B>?} #C9 : self::Class<self::B>{(self::C{}) as{ForNonNullableByDefault} self::B}
-  #C49 = eval const core::bool::fromEnvironment(#C34) ?{self::Subclass<self::B>?} #C9 : self::Subclass<self::B>{(self::C{}) as{ForNonNullableByDefault} self::B}
-  #C50 = eval const core::bool::fromEnvironment(#C34) ?{self::Class<self::A>?} #C9 : self::Class<self::A>{self::A{}}
-  #C51 = eval const core::bool::fromEnvironment(#C34) ?{self::Class<self::B>?} #C9 : self::Class<self::B>{(self::B{}) as{ForNonNullableByDefault} self::B}
-  #C52 = eval const core::bool::fromEnvironment(#C34) ?{self::Subclass<self::A>?} #C9 : self::Subclass<self::A>{(self::A{}) as{ForNonNullableByDefault} self::A}
-  #C53 = eval const core::bool::fromEnvironment(#C34) ?{self::Subclass<self::B>?} #C9 : self::Subclass<self::B>{(self::B{}) as{ForNonNullableByDefault} self::B}
-  #C54 = eval self::Foo<core::int>{saved:const core::bool::fromEnvironment(#C1, defaultValue: const core::bool::fromEnvironment(#C2)), saved2:const core::bool::fromEnvironment(#C1, defaultValue: const core::bool::fromEnvironment(#C2)), initialized:const core::bool::fromEnvironment(#C1, defaultValue: const core::bool::fromEnvironment(#C2)), value:#C21}
-  #C55 = eval self::Foo<core::int>{saved:const core::bool::fromEnvironment(#C1, defaultValue: const core::bool::fromEnvironment(#C2)), saved2:const core::bool::fromEnvironment(#C1, defaultValue: const core::bool::fromEnvironment(#C2)), initialized:const core::bool::fromEnvironment(#C1, defaultValue: const core::bool::fromEnvironment(#C2)), value:#C21}
-  #C56 = eval self::Foo<core::int>{saved:const core::bool::fromEnvironment(#C1, defaultValue: const core::bool::fromEnvironment(#C2)), saved2:const core::bool::fromEnvironment(#C1, defaultValue: const core::bool::fromEnvironment(#C2)), initialized:const core::bool::fromEnvironment(#C1, defaultValue: const core::bool::fromEnvironment(#C2)), value:#C21}
+  #C17 = eval const core::bool::fromEnvironment(#C2, defaultValue: (const core::bool::fromEnvironment(#C2) ?{core::bool?} #C8 : #C9)!) || (#C8)
+  #C18 = eval const core::bool::fromEnvironment(#C2, defaultValue: (const core::bool::fromEnvironment(#C2) ?{core::bool?} #C8 : #C9)!) || (#C13)
+  #C19 = 42
+  #C20 = eval self::Foo<core::int>{saved:const core::bool::fromEnvironment(#C1, defaultValue: const core::bool::fromEnvironment(#C2)), saved2:const core::bool::fromEnvironment(#C1, defaultValue: const core::bool::fromEnvironment(#C2)), initialized:const core::bool::fromEnvironment(#C1, defaultValue: const core::bool::fromEnvironment(#C2)), value:#C19}
+  #C21 = eval const core::bool::fromEnvironment(#C1) ?{core::Object} #C19 : #C8
+  #C22 = eval (const core::bool::fromEnvironment(#C1) ?{core::Object} #C19 : #C8) is{ForNonNullableByDefault} core::int ?{core::bool} #C8 : #C13
+  #C23 = <Null>[#C9]
+  #C24 = <core::int>[#C19]
+  #C25 = <core::int>{#C19}
+  #C26 = <core::int, core::int>{#C19:#C19)
+  #C27 = <core::List<core::int>>[#C24]
+  #C28 = <core::Set<core::int>>{#C25}
+  #C29 = <core::Map<core::int, core::int>, core::int>{#C26:#C19)
+  #C30 = <core::int, core::Map<core::int, core::int>>{#C19:#C26)
+  #C31 = eval const _in::Symbol::•(const core::String::fromEnvironment(#C1))
+  #C32 = "x"
+  #C33 = eval const core::bool::fromEnvironment(#C32) ?{self::Class<self::B>?} #C9 : self::Class<self::B>{(self::C{}) as{ForNonNullableByDefault} self::B}
+  #C34 = eval const core::bool::fromEnvironment(#C32) ?{self::Subclass<self::B>?} #C9 : self::Subclass<self::B>{(self::C{}) as{ForNonNullableByDefault} self::B}
+  #C35 = eval const core::bool::fromEnvironment(#C32) ?{self::Class<self::A>?} #C9 : self::Class<self::A>{self::A{}}
+  #C36 = eval const core::bool::fromEnvironment(#C32) ?{self::Class<self::B>?} #C9 : self::Class<self::B>{(self::B{}) as{ForNonNullableByDefault} self::B}
+  #C37 = eval const core::bool::fromEnvironment(#C32) ?{self::Subclass<self::A>?} #C9 : self::Subclass<self::A>{(self::A{}) as{ForNonNullableByDefault} self::A}
+  #C38 = eval const core::bool::fromEnvironment(#C32) ?{self::Subclass<self::B>?} #C9 : self::Subclass<self::B>{(self::B{}) as{ForNonNullableByDefault} self::B}
+  #C39 = TypeLiteralConstant((core::int, {named: core::int}) → core::int)
+  #C40 = tearoff self::procedure
+  #C41 = self::ConstClassWithF {foo:#C40}
+  #C42 = eval const core::bool::fromEnvironment(#C1)
+  #C43 = eval !const core::bool::fromEnvironment(#C1)
+  #C44 = eval const core::bool::fromEnvironment(#C2) ?{core::bool?} const core::bool::fromEnvironment(#C1) : #C9
+  #C45 = eval (const core::bool::fromEnvironment(#C2) ?{core::bool?} const core::bool::fromEnvironment(#C1) : #C9)!
+  #C46 = eval const core::bool::fromEnvironment(#C32) ?{self::Class<self::B>?} #C9 : self::Class<self::B>{(self::C{}) as{ForNonNullableByDefault} self::B}
+  #C47 = eval const core::bool::fromEnvironment(#C32) ?{self::Subclass<self::B>?} #C9 : self::Subclass<self::B>{(self::C{}) as{ForNonNullableByDefault} self::B}
+  #C48 = eval const core::bool::fromEnvironment(#C32) ?{self::Class<self::A>?} #C9 : self::Class<self::A>{self::A{}}
+  #C49 = eval const core::bool::fromEnvironment(#C32) ?{self::Class<self::B>?} #C9 : self::Class<self::B>{(self::B{}) as{ForNonNullableByDefault} self::B}
+  #C50 = eval const core::bool::fromEnvironment(#C32) ?{self::Subclass<self::A>?} #C9 : self::Subclass<self::A>{(self::A{}) as{ForNonNullableByDefault} self::A}
+  #C51 = eval const core::bool::fromEnvironment(#C32) ?{self::Subclass<self::B>?} #C9 : self::Subclass<self::B>{(self::B{}) as{ForNonNullableByDefault} self::B}
+  #C52 = eval self::Foo<core::int>{saved:const core::bool::fromEnvironment(#C1, defaultValue: const core::bool::fromEnvironment(#C2)), saved2:const core::bool::fromEnvironment(#C1, defaultValue: const core::bool::fromEnvironment(#C2)), initialized:const core::bool::fromEnvironment(#C1, defaultValue: const core::bool::fromEnvironment(#C2)), value:#C19}
 }
 
 Extra constant evaluation status:
diff --git a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various_2.dart.strong.expect b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various_2.dart.strong.expect
index 95db2f1..08cdf8e 100644
--- a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various_2.dart.strong.expect
+++ b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various_2.dart.strong.expect
@@ -50,7 +50,7 @@
   self::test(#C13, #C13);
   self::test(#C16, #C16);
   self::test(true, #C19);
-  self::test(true, #C23);
+  self::test(true, #C21);
   self::test(true, #C19);
   self::test(true, #C19);
   self::test(true, #C19);
@@ -81,8 +81,8 @@
     ;
 }
 static const field core::Type objectTypeLiteral = #C1;
-static const field (core::Object?, core::Object?) → core::bool c2 = #C24;
-static const field (core::int) → core::int partialInstantiation = #C25;
+static const field (core::Object?, core::Object?) → core::bool c2 = #C23;
+static const field (core::int) → core::int partialInstantiation = #C22;
 static const field var::Class<core::int> instance = #C5;
 static const field var::Class<dynamic> instance2 = #C8;
 static const field core::Type functionTypeLiteral = #C9;
@@ -124,7 +124,5 @@
   #C20 = tearoff var::id2
   #C21 = eval const core::identical(#C3, const core::bool::fromEnvironment(#C15) ?{(core::int) → core::int} #C2<core::int> : #C20<core::int>)
   #C22 = eval const core::bool::fromEnvironment(#C15) ?{(core::int) → core::int} #C2<core::int> : #C20<core::int>
-  #C23 = eval const core::identical(#C3, const core::bool::fromEnvironment(#C15) ?{(core::int) → core::int} #C2<core::int> : #C20<core::int>)
-  #C24 = tearoff core::identical
-  #C25 = eval const core::bool::fromEnvironment(#C15) ?{(core::int) → core::int} #C2<core::int> : #C20<core::int>
+  #C23 = tearoff core::identical
 }
diff --git a/pkg/front_end/testcases/general/constructor_const_inference.dart.strong.expect b/pkg/front_end/testcases/general/constructor_const_inference.dart.strong.expect
index 8adcafe..5bf2809 100644
--- a/pkg/front_end/testcases/general/constructor_const_inference.dart.strong.expect
+++ b/pkg/front_end/testcases/general/constructor_const_inference.dart.strong.expect
@@ -40,11 +40,11 @@
 }
 static method main() → dynamic {
   dynamic x = new self::B::•<dynamic>().{self::A::x};
-  if(!(x is self::_Y<core::Null?>*)) {
+  if(!(x is self::_Y<Null>*)) {
     throw "Unexpected run-time type: `new B().x` is ${x.{core::Object::runtimeType}}, but `_Y<Null>` expected";
   }
 }
 
 constants  {
-  #C1 = self::_Y<core::Null?> {}
+  #C1 = self::_Y<Null> {}
 }
diff --git a/pkg/front_end/testcases/general/constructor_const_inference.dart.strong.transformed.expect b/pkg/front_end/testcases/general/constructor_const_inference.dart.strong.transformed.expect
index 8adcafe..5bf2809 100644
--- a/pkg/front_end/testcases/general/constructor_const_inference.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/constructor_const_inference.dart.strong.transformed.expect
@@ -40,11 +40,11 @@
 }
 static method main() → dynamic {
   dynamic x = new self::B::•<dynamic>().{self::A::x};
-  if(!(x is self::_Y<core::Null?>*)) {
+  if(!(x is self::_Y<Null>*)) {
     throw "Unexpected run-time type: `new B().x` is ${x.{core::Object::runtimeType}}, but `_Y<Null>` expected";
   }
 }
 
 constants  {
-  #C1 = self::_Y<core::Null?> {}
+  #C1 = self::_Y<Null> {}
 }
diff --git a/pkg/front_end/testcases/general/control_flow_collection.dart.strong.expect b/pkg/front_end/testcases/general/control_flow_collection.dart.strong.expect
index 3044135..dffdbc4 100644
--- a/pkg/front_end/testcases/general/control_flow_collection.dart.strong.expect
+++ b/pkg/front_end/testcases/general/control_flow_collection.dart.strong.expect
@@ -6,63 +6,63 @@
 static method main() → dynamic {
   final core::List<core::int*>* aList = block {
     final core::List<core::int*>* #t1 = <core::int*>[];
-    #t1.{core::List::add}(1);
+    #t1.{core::List::add}{Invariant}(1);
     if(self::oracle() as{TypeError,ForDynamic} core::bool*)
-      #t1.{core::List::add}(2);
+      #t1.{core::List::add}{Invariant}(2);
     if(self::oracle() as{TypeError,ForDynamic} core::bool*)
-      #t1.{core::List::add}(3);
+      #t1.{core::List::add}{Invariant}(3);
     else
-      #t1.{core::List::add}(1.{core::int::unary-}());
+      #t1.{core::List::add}{Invariant}(1.{core::int::unary-}());
     if(self::oracle() as{TypeError,ForDynamic} core::bool*)
       if(self::oracle() as{TypeError,ForDynamic} core::bool*)
-        #t1.{core::List::add}(4);
+        #t1.{core::List::add}{Invariant}(4);
     for (core::int* i in <core::int*>[5, 6, 7])
-      #t1.{core::List::add}(i);
+      #t1.{core::List::add}{Invariant}(i);
     for (core::int* i in <core::int*>[8, 9, 10])
       if(self::oracle() as{TypeError,ForDynamic} core::bool*)
-        #t1.{core::List::add}(i);
+        #t1.{core::List::add}{Invariant}(i);
     for (core::int* i = 11; i.{core::num::<=}(14); i = i.{core::num::+}(1))
-      #t1.{core::List::add}(i);
+      #t1.{core::List::add}{Invariant}(i);
   } =>#t1;
   final core::Set<core::int*>* aSet = block {
     final core::Set<core::int*>* #t2 = col::LinkedHashSet::•<core::int*>();
-    #t2.{core::Set::add}(1);
+    #t2.{core::Set::add}{Invariant}(1);
     if(self::oracle() as{TypeError,ForDynamic} core::bool*)
-      #t2.{core::Set::add}(2);
+      #t2.{core::Set::add}{Invariant}(2);
     if(self::oracle() as{TypeError,ForDynamic} core::bool*)
-      #t2.{core::Set::add}(3);
+      #t2.{core::Set::add}{Invariant}(3);
     else
-      #t2.{core::Set::add}(1.{core::int::unary-}());
+      #t2.{core::Set::add}{Invariant}(1.{core::int::unary-}());
     if(self::oracle() as{TypeError,ForDynamic} core::bool*)
       if(self::oracle() as{TypeError,ForDynamic} core::bool*)
-        #t2.{core::Set::add}(4);
+        #t2.{core::Set::add}{Invariant}(4);
     for (core::int* i in <core::int*>[5, 6, 7])
-      #t2.{core::Set::add}(i);
+      #t2.{core::Set::add}{Invariant}(i);
     for (core::int* i in <core::int*>[8, 9, 10])
       if(self::oracle() as{TypeError,ForDynamic} core::bool*)
-        #t2.{core::Set::add}(i);
+        #t2.{core::Set::add}{Invariant}(i);
     for (core::int* i = 11; i.{core::num::<=}(14); i = i.{core::num::+}(1))
-      #t2.{core::Set::add}(i);
+      #t2.{core::Set::add}{Invariant}(i);
   } =>#t2;
   final core::Map<core::int*, core::int*>* aMap = block {
     final core::Map<core::int*, core::int*>* #t3 = <core::int*, core::int*>{};
-    #t3.{core::Map::[]=}(1, 1);
+    #t3.{core::Map::[]=}{Invariant}(1, 1);
     if(self::oracle() as{TypeError,ForDynamic} core::bool*)
-      #t3.{core::Map::[]=}(2, 2);
+      #t3.{core::Map::[]=}{Invariant}(2, 2);
     if(self::oracle() as{TypeError,ForDynamic} core::bool*)
-      #t3.{core::Map::[]=}(3, 3);
+      #t3.{core::Map::[]=}{Invariant}(3, 3);
     else
-      #t3.{core::Map::[]=}(1.{core::int::unary-}(), 1.{core::int::unary-}());
+      #t3.{core::Map::[]=}{Invariant}(1.{core::int::unary-}(), 1.{core::int::unary-}());
     if(self::oracle() as{TypeError,ForDynamic} core::bool*)
       if(self::oracle() as{TypeError,ForDynamic} core::bool*)
-        #t3.{core::Map::[]=}(4, 4);
+        #t3.{core::Map::[]=}{Invariant}(4, 4);
     for (core::int* i in <core::int*>[5, 6, 7])
-      #t3.{core::Map::[]=}(i, i);
+      #t3.{core::Map::[]=}{Invariant}(i, i);
     for (core::int* i in <core::int*>[8, 9, 10])
       if(self::oracle() as{TypeError,ForDynamic} core::bool*)
-        #t3.{core::Map::[]=}(i, i);
+        #t3.{core::Map::[]=}{Invariant}(i, i);
     for (core::int* i = 11; i.{core::num::<=}(14); i = i.{core::num::+}(1))
-      #t3.{core::Map::[]=}(i, i);
+      #t3.{core::Map::[]=}{Invariant}(i, i);
   } =>#t3;
   core::print(aList);
   core::print(aSet);
diff --git a/pkg/front_end/testcases/general/control_flow_collection.dart.strong.transformed.expect b/pkg/front_end/testcases/general/control_flow_collection.dart.strong.transformed.expect
index 6077536..6041ee9 100644
--- a/pkg/front_end/testcases/general/control_flow_collection.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/control_flow_collection.dart.strong.transformed.expect
@@ -6,21 +6,21 @@
 static method main() → dynamic {
   final core::List<core::int*>* aList = block {
     final core::List<core::int*>* #t1 = <core::int*>[];
-    #t1.{core::List::add}(1);
+    #t1.{core::List::add}{Invariant}(1);
     if(self::oracle() as{TypeError,ForDynamic} core::bool*)
-      #t1.{core::List::add}(2);
+      #t1.{core::List::add}{Invariant}(2);
     if(self::oracle() as{TypeError,ForDynamic} core::bool*)
-      #t1.{core::List::add}(3);
+      #t1.{core::List::add}{Invariant}(3);
     else
-      #t1.{core::List::add}(1.{core::int::unary-}());
+      #t1.{core::List::add}{Invariant}(1.{core::int::unary-}());
     if(self::oracle() as{TypeError,ForDynamic} core::bool*)
       if(self::oracle() as{TypeError,ForDynamic} core::bool*)
-        #t1.{core::List::add}(4);
+        #t1.{core::List::add}{Invariant}(4);
     {
       core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[5, 6, 7].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         core::int* i = :sync-for-iterator.{core::Iterator::current};
-        #t1.{core::List::add}(i);
+        #t1.{core::List::add}{Invariant}(i);
       }
     }
     {
@@ -28,29 +28,29 @@
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         core::int* i = :sync-for-iterator.{core::Iterator::current};
         if(self::oracle() as{TypeError,ForDynamic} core::bool*)
-          #t1.{core::List::add}(i);
+          #t1.{core::List::add}{Invariant}(i);
       }
     }
     for (core::int* i = 11; i.{core::num::<=}(14); i = i.{core::num::+}(1))
-      #t1.{core::List::add}(i);
+      #t1.{core::List::add}{Invariant}(i);
   } =>#t1;
   final core::Set<core::int*>* aSet = block {
     final core::Set<core::int*>* #t2 = new col::_CompactLinkedHashSet::•<core::int*>();
-    #t2.{core::Set::add}(1);
+    #t2.{core::Set::add}{Invariant}(1);
     if(self::oracle() as{TypeError,ForDynamic} core::bool*)
-      #t2.{core::Set::add}(2);
+      #t2.{core::Set::add}{Invariant}(2);
     if(self::oracle() as{TypeError,ForDynamic} core::bool*)
-      #t2.{core::Set::add}(3);
+      #t2.{core::Set::add}{Invariant}(3);
     else
-      #t2.{core::Set::add}(1.{core::int::unary-}());
+      #t2.{core::Set::add}{Invariant}(1.{core::int::unary-}());
     if(self::oracle() as{TypeError,ForDynamic} core::bool*)
       if(self::oracle() as{TypeError,ForDynamic} core::bool*)
-        #t2.{core::Set::add}(4);
+        #t2.{core::Set::add}{Invariant}(4);
     {
       core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[5, 6, 7].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         core::int* i = :sync-for-iterator.{core::Iterator::current};
-        #t2.{core::Set::add}(i);
+        #t2.{core::Set::add}{Invariant}(i);
       }
     }
     {
@@ -58,29 +58,29 @@
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         core::int* i = :sync-for-iterator.{core::Iterator::current};
         if(self::oracle() as{TypeError,ForDynamic} core::bool*)
-          #t2.{core::Set::add}(i);
+          #t2.{core::Set::add}{Invariant}(i);
       }
     }
     for (core::int* i = 11; i.{core::num::<=}(14); i = i.{core::num::+}(1))
-      #t2.{core::Set::add}(i);
+      #t2.{core::Set::add}{Invariant}(i);
   } =>#t2;
   final core::Map<core::int*, core::int*>* aMap = block {
     final core::Map<core::int*, core::int*>* #t3 = <core::int*, core::int*>{};
-    #t3.{core::Map::[]=}(1, 1);
+    #t3.{core::Map::[]=}{Invariant}(1, 1);
     if(self::oracle() as{TypeError,ForDynamic} core::bool*)
-      #t3.{core::Map::[]=}(2, 2);
+      #t3.{core::Map::[]=}{Invariant}(2, 2);
     if(self::oracle() as{TypeError,ForDynamic} core::bool*)
-      #t3.{core::Map::[]=}(3, 3);
+      #t3.{core::Map::[]=}{Invariant}(3, 3);
     else
-      #t3.{core::Map::[]=}(1.{core::int::unary-}(), 1.{core::int::unary-}());
+      #t3.{core::Map::[]=}{Invariant}(1.{core::int::unary-}(), 1.{core::int::unary-}());
     if(self::oracle() as{TypeError,ForDynamic} core::bool*)
       if(self::oracle() as{TypeError,ForDynamic} core::bool*)
-        #t3.{core::Map::[]=}(4, 4);
+        #t3.{core::Map::[]=}{Invariant}(4, 4);
     {
       core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[5, 6, 7].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         core::int* i = :sync-for-iterator.{core::Iterator::current};
-        #t3.{core::Map::[]=}(i, i);
+        #t3.{core::Map::[]=}{Invariant}(i, i);
       }
     }
     {
@@ -88,11 +88,11 @@
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         core::int* i = :sync-for-iterator.{core::Iterator::current};
         if(self::oracle() as{TypeError,ForDynamic} core::bool*)
-          #t3.{core::Map::[]=}(i, i);
+          #t3.{core::Map::[]=}{Invariant}(i, i);
       }
     }
     for (core::int* i = 11; i.{core::num::<=}(14); i = i.{core::num::+}(1))
-      #t3.{core::Map::[]=}(i, i);
+      #t3.{core::Map::[]=}{Invariant}(i, i);
   } =>#t3;
   core::print(aList);
   core::print(aSet);
diff --git a/pkg/front_end/testcases/general/control_flow_collection_inference.dart.strong.expect b/pkg/front_end/testcases/general/control_flow_collection_inference.dart.strong.expect
index 988d86b..4065ab1 100644
--- a/pkg/front_end/testcases/general/control_flow_collection_inference.dart.strong.expect
+++ b/pkg/front_end/testcases/general/control_flow_collection_inference.dart.strong.expect
@@ -454,195 +454,195 @@
   core::List<core::int*>* list10 = block {
     final core::List<core::int*>* #t1 = <core::int*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t1.{core::List::add}(42);
+      #t1.{core::List::add}{Invariant}(42);
   } =>#t1;
   core::Set<core::int*>* set10 = block {
     final core::Set<core::int*>* #t2 = col::LinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t2.{core::Set::add}(42);
-    #t2.{core::Set::add}(null);
+      #t2.{core::Set::add}{Invariant}(42);
+    #t2.{core::Set::add}{Invariant}(null);
   } =>#t2;
   core::Map<core::String*, core::int*>* map10 = block {
     final core::Map<core::String*, core::int*>* #t3 = <core::String*, core::int*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t3.{core::Map::[]=}("bar", 42);
-    #t3.{core::Map::[]=}("baz", null);
+      #t3.{core::Map::[]=}{Invariant}("bar", 42);
+    #t3.{core::Map::[]=}{Invariant}("baz", null);
   } =>#t3;
   core::List<dynamic>* list11 = block {
     final core::List<dynamic>* #t4 = <dynamic>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t4.{core::List::add}(dynVar);
+      #t4.{core::List::add}{Invariant}(dynVar);
   } =>#t4;
   core::Set<dynamic>* set11 = block {
     final core::Set<dynamic>* #t5 = col::LinkedHashSet::•<dynamic>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t5.{core::Set::add}(dynVar);
-    #t5.{core::Set::add}(null);
+      #t5.{core::Set::add}{Invariant}(dynVar);
+    #t5.{core::Set::add}{Invariant}(null);
   } =>#t5;
   core::Map<core::String*, dynamic>* map11 = block {
     final core::Map<core::String*, dynamic>* #t6 = <core::String*, dynamic>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t6.{core::Map::[]=}("bar", dynVar);
-    #t6.{core::Map::[]=}("baz", null);
+      #t6.{core::Map::[]=}{Invariant}("bar", dynVar);
+    #t6.{core::Map::[]=}{Invariant}("baz", null);
   } =>#t6;
   core::List<core::List<core::int*>*>* list12 = block {
     final core::List<core::List<core::int*>*>* #t7 = <core::List<core::int*>*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t7.{core::List::add}(<core::int*>[42]);
+      #t7.{core::List::add}{Invariant}(<core::int*>[42]);
   } =>#t7;
   core::Set<core::List<core::int*>*>* set12 = block {
     final core::Set<core::List<core::int*>*>* #t8 = col::LinkedHashSet::•<core::List<core::int*>*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t8.{core::Set::add}(<core::int*>[42]);
-    #t8.{core::Set::add}(null);
+      #t8.{core::Set::add}{Invariant}(<core::int*>[42]);
+    #t8.{core::Set::add}{Invariant}(null);
   } =>#t8;
   core::Map<core::String*, core::List<core::int*>*>* map12 = block {
     final core::Map<core::String*, core::List<core::int*>*>* #t9 = <core::String*, core::List<core::int*>*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t9.{core::Map::[]=}("bar", <core::int*>[42]);
-    #t9.{core::Map::[]=}("baz", null);
+      #t9.{core::Map::[]=}{Invariant}("bar", <core::int*>[42]);
+    #t9.{core::Map::[]=}{Invariant}("baz", null);
   } =>#t9;
   core::List<core::int*>* list20 = block {
     final core::List<core::int*>* #t10 = <core::int*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       for (final core::int* #t11 in <core::int*>[42])
-        #t10.{core::List::add}(#t11);
+        #t10.{core::List::add}{Invariant}(#t11);
   } =>#t10;
   core::Set<core::int*>* set20 = block {
     final core::Set<core::int*>* #t12 = col::LinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       for (final core::int* #t13 in <core::int*>[42])
-        #t12.{core::Set::add}(#t13);
-    #t12.{core::Set::add}(null);
+        #t12.{core::Set::add}{Invariant}(#t13);
+    #t12.{core::Set::add}{Invariant}(null);
   } =>#t12;
   core::Map<core::String*, core::int*>* map20 = block {
     final core::Map<core::String*, core::int*>* #t14 = <core::String*, core::int*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       for (final core::MapEntry<core::String*, core::int*>* #t15 in <core::String*, core::int*>{"bar": 42}.{core::Map::entries})
-        #t14.{core::Map::[]=}(#t15.{core::MapEntry::key}, #t15.{core::MapEntry::value});
-    #t14.{core::Map::[]=}("baz", null);
+        #t14.{core::Map::[]=}{Invariant}(#t15.{core::MapEntry::key}, #t15.{core::MapEntry::value});
+    #t14.{core::Map::[]=}{Invariant}("baz", null);
   } =>#t14;
   core::List<dynamic>* list21 = block {
     final core::List<dynamic>* #t16 = <dynamic>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       for (final dynamic #t17 in <dynamic>[dynVar])
-        #t16.{core::List::add}(#t17);
+        #t16.{core::List::add}{Invariant}(#t17);
   } =>#t16;
   core::Set<dynamic>* set21 = block {
     final core::Set<dynamic>* #t18 = col::LinkedHashSet::•<dynamic>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       for (final dynamic #t19 in <dynamic>[dynVar])
-        #t18.{core::Set::add}(#t19);
-    #t18.{core::Set::add}(null);
+        #t18.{core::Set::add}{Invariant}(#t19);
+    #t18.{core::Set::add}{Invariant}(null);
   } =>#t18;
   core::Map<core::String*, dynamic>* map21 = block {
     final core::Map<core::String*, dynamic>* #t20 = <core::String*, dynamic>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       for (final core::MapEntry<core::String*, dynamic>* #t21 in <core::String*, dynamic>{"bar": dynVar}.{core::Map::entries})
-        #t20.{core::Map::[]=}(#t21.{core::MapEntry::key}, #t21.{core::MapEntry::value});
-    #t20.{core::Map::[]=}("baz", null);
+        #t20.{core::Map::[]=}{Invariant}(#t21.{core::MapEntry::key}, #t21.{core::MapEntry::value});
+    #t20.{core::Map::[]=}{Invariant}("baz", null);
   } =>#t20;
   core::List<core::List<core::int*>*>* list22 = block {
     final core::List<core::List<core::int*>*>* #t22 = <core::List<core::int*>*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       for (final core::List<core::int*>* #t23 in <core::List<core::int*>*>[<core::int*>[42]])
-        #t22.{core::List::add}(#t23);
+        #t22.{core::List::add}{Invariant}(#t23);
   } =>#t22;
   core::Set<core::List<core::int*>*>* set22 = block {
     final core::Set<core::List<core::int*>*>* #t24 = col::LinkedHashSet::•<core::List<core::int*>*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       for (final core::List<core::int*>* #t25 in <core::List<core::int*>*>[<core::int*>[42]])
-        #t24.{core::Set::add}(#t25);
-    #t24.{core::Set::add}(null);
+        #t24.{core::Set::add}{Invariant}(#t25);
+    #t24.{core::Set::add}{Invariant}(null);
   } =>#t24;
   core::Map<core::String*, core::List<core::int*>*>* map22 = block {
     final core::Map<core::String*, core::List<core::int*>*>* #t26 = <core::String*, core::List<core::int*>*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t27 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[42]}.{core::Map::entries})
-        #t26.{core::Map::[]=}(#t27.{core::MapEntry::key}, #t27.{core::MapEntry::value});
-    #t26.{core::Map::[]=}("baz", null);
+        #t26.{core::Map::[]=}{Invariant}(#t27.{core::MapEntry::key}, #t27.{core::MapEntry::value});
+    #t26.{core::Map::[]=}{Invariant}("baz", null);
   } =>#t26;
   core::List<core::int*>* list30 = block {
     final core::List<core::int*>* #t28 = <core::int*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
         for (final core::int* #t29 in <core::int*>[42])
-          #t28.{core::List::add}(#t29);
+          #t28.{core::List::add}{Invariant}(#t29);
   } =>#t28;
   core::Set<core::int*>* set30 = block {
     final core::Set<core::int*>* #t30 = col::LinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
         for (final core::int* #t31 in <core::int*>[42])
-          #t30.{core::Set::add}(#t31);
-    #t30.{core::Set::add}(null);
+          #t30.{core::Set::add}{Invariant}(#t31);
+    #t30.{core::Set::add}{Invariant}(null);
   } =>#t30;
   core::Map<core::String*, core::int*>* map30 = block {
     final core::Map<core::String*, core::int*>* #t32 = <core::String*, core::int*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
         for (final core::MapEntry<core::String*, core::int*>* #t33 in <core::String*, core::int*>{"bar": 42}.{core::Map::entries})
-          #t32.{core::Map::[]=}(#t33.{core::MapEntry::key}, #t33.{core::MapEntry::value});
-    #t32.{core::Map::[]=}("baz", null);
+          #t32.{core::Map::[]=}{Invariant}(#t33.{core::MapEntry::key}, #t33.{core::MapEntry::value});
+    #t32.{core::Map::[]=}{Invariant}("baz", null);
   } =>#t32;
   core::List<dynamic>* list31 = block {
     final core::List<dynamic>* #t34 = <dynamic>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
         for (final dynamic #t35 in <dynamic>[dynVar])
-          #t34.{core::List::add}(#t35);
+          #t34.{core::List::add}{Invariant}(#t35);
   } =>#t34;
   core::Set<dynamic>* set31 = block {
     final core::Set<dynamic>* #t36 = col::LinkedHashSet::•<dynamic>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
         for (final dynamic #t37 in <dynamic>[dynVar])
-          #t36.{core::Set::add}(#t37);
-    #t36.{core::Set::add}(null);
+          #t36.{core::Set::add}{Invariant}(#t37);
+    #t36.{core::Set::add}{Invariant}(null);
   } =>#t36;
   core::Map<core::String*, dynamic>* map31 = block {
     final core::Map<core::String*, dynamic>* #t38 = <core::String*, dynamic>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
         for (final core::MapEntry<core::String*, dynamic>* #t39 in <core::String*, dynamic>{"bar": dynVar}.{core::Map::entries})
-          #t38.{core::Map::[]=}(#t39.{core::MapEntry::key}, #t39.{core::MapEntry::value});
-    #t38.{core::Map::[]=}("baz", null);
+          #t38.{core::Map::[]=}{Invariant}(#t39.{core::MapEntry::key}, #t39.{core::MapEntry::value});
+    #t38.{core::Map::[]=}{Invariant}("baz", null);
   } =>#t38;
   core::List<core::List<core::int*>*>* list33 = block {
     final core::List<core::List<core::int*>*>* #t40 = <core::List<core::int*>*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
         for (final core::List<core::int*>* #t41 in <core::List<core::int*>*>[<core::int*>[42]])
-          #t40.{core::List::add}(#t41);
+          #t40.{core::List::add}{Invariant}(#t41);
   } =>#t40;
   core::Set<core::List<core::int*>*>* set33 = block {
     final core::Set<core::List<core::int*>*>* #t42 = col::LinkedHashSet::•<core::List<core::int*>*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
         for (final core::List<core::int*>* #t43 in <core::List<core::int*>*>[<core::int*>[42]])
-          #t42.{core::Set::add}(#t43);
-    #t42.{core::Set::add}(null);
+          #t42.{core::Set::add}{Invariant}(#t43);
+    #t42.{core::Set::add}{Invariant}(null);
   } =>#t42;
   core::Map<core::String*, core::List<core::int*>*>* map33 = block {
     final core::Map<core::String*, core::List<core::int*>*>* #t44 = <core::String*, core::List<core::int*>*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
         for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t45 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[42]}.{core::Map::entries})
-          #t44.{core::Map::[]=}(#t45.{core::MapEntry::key}, #t45.{core::MapEntry::value});
-    #t44.{core::Map::[]=}("baz", null);
+          #t44.{core::Map::[]=}{Invariant}(#t45.{core::MapEntry::key}, #t45.{core::MapEntry::value});
+    #t44.{core::Map::[]=}{Invariant}("baz", null);
   } =>#t44;
   core::List<core::List<core::int*>*>* list40 = block {
     final core::List<core::List<core::int*>*>* #t46 = <core::List<core::int*>*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       for (final core::List<core::int*>* #t47 in <core::List<core::int*>*>[<core::int*>[]])
-        #t46.{core::List::add}(#t47);
+        #t46.{core::List::add}{Invariant}(#t47);
   } =>#t46;
   core::Set<core::List<core::int*>*>* set40 = block {
     final core::Set<core::List<core::int*>*>* #t48 = col::LinkedHashSet::•<core::List<core::int*>*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       for (final core::List<core::int*>* #t49 in <core::List<core::int*>*>[<core::int*>[]])
-        #t48.{core::Set::add}(#t49);
-    #t48.{core::Set::add}(null);
+        #t48.{core::Set::add}{Invariant}(#t49);
+    #t48.{core::Set::add}{Invariant}(null);
   } =>#t48;
   core::Map<core::String*, core::List<core::int*>*>* map40 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:39:34: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
   Map<String, List<int>> map40 = {if (oracle(\"foo\")) ...{\"bar\", []}, \"baz\": null};
@@ -650,398 +650,408 @@
   core::List<core::List<core::int*>*>* list41 = block {
     final core::List<core::List<core::int*>*>* #t50 = <core::List<core::int*>*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      for (final core::List<core::int*>* #t51 in let final core::Set<core::List<core::int*>*>* #t52 = col::LinkedHashSet::•<core::List<core::int*>*>() in let final dynamic #t53 = #t52.{core::Set::add}(<core::int*>[]) in #t52)
-        #t50.{core::List::add}(#t51);
+      for (final core::List<core::int*>* #t51 in block {
+        final core::Set<core::List<core::int*>*>* #t52 = col::LinkedHashSet::•<core::List<core::int*>*>();
+        #t52.{core::Set::add}{Invariant}(<core::int*>[]);
+      } =>#t52)
+        #t50.{core::List::add}{Invariant}(#t51);
   } =>#t50;
   core::Set<core::List<core::int*>*>* set41 = block {
-    final core::Set<core::List<core::int*>*>* #t54 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    final core::Set<core::List<core::int*>*>* #t53 = col::LinkedHashSet::•<core::List<core::int*>*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      for (final core::List<core::int*>* #t55 in let final core::Set<core::List<core::int*>*>* #t56 = col::LinkedHashSet::•<core::List<core::int*>*>() in let final dynamic #t57 = #t56.{core::Set::add}(<core::int*>[]) in #t56)
-        #t54.{core::Set::add}(#t55);
-    #t54.{core::Set::add}(null);
-  } =>#t54;
+      for (final core::List<core::int*>* #t54 in block {
+        final core::Set<core::List<core::int*>*>* #t55 = col::LinkedHashSet::•<core::List<core::int*>*>();
+        #t55.{core::Set::add}{Invariant}(<core::int*>[]);
+      } =>#t55)
+        #t53.{core::Set::add}{Invariant}(#t54);
+    #t53.{core::Set::add}{Invariant}(null);
+  } =>#t53;
   core::List<core::List<core::int*>*>* list42 = block {
-    final core::List<core::List<core::int*>*>* #t58 = <core::List<core::int*>*>[];
+    final core::List<core::List<core::int*>*>* #t56 = <core::List<core::int*>*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
+        for (final core::List<core::int*>* #t57 in <core::List<core::int*>*>[<core::int*>[]])
+          #t56.{core::List::add}{Invariant}(#t57);
+  } =>#t56;
+  core::Set<core::List<core::int*>*>* set42 = block {
+    final core::Set<core::List<core::int*>*>* #t58 = col::LinkedHashSet::•<core::List<core::int*>*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
         for (final core::List<core::int*>* #t59 in <core::List<core::int*>*>[<core::int*>[]])
-          #t58.{core::List::add}(#t59);
+          #t58.{core::Set::add}{Invariant}(#t59);
+    #t58.{core::Set::add}{Invariant}(null);
   } =>#t58;
-  core::Set<core::List<core::int*>*>* set42 = block {
-    final core::Set<core::List<core::int*>*>* #t60 = col::LinkedHashSet::•<core::List<core::int*>*>();
-    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        for (final core::List<core::int*>* #t61 in <core::List<core::int*>*>[<core::int*>[]])
-          #t60.{core::Set::add}(#t61);
-    #t60.{core::Set::add}(null);
-  } =>#t60;
   core::Map<core::String*, core::List<core::int*>*>* map42 = block {
-    final core::Map<core::String*, core::List<core::int*>*>* #t62 = <core::String*, core::List<core::int*>*>{};
+    final core::Map<core::String*, core::List<core::int*>*>* #t60 = <core::String*, core::List<core::int*>*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t63 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[]}.{core::Map::entries})
-          #t62.{core::Map::[]=}(#t63.{core::MapEntry::key}, #t63.{core::MapEntry::value});
-    #t62.{core::Map::[]=}("baz", null);
-  } =>#t62;
+        for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t61 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[]}.{core::Map::entries})
+          #t60.{core::Map::[]=}{Invariant}(#t61.{core::MapEntry::key}, #t61.{core::MapEntry::value});
+    #t60.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t60;
   core::List<core::int*>* list50 = block {
-    final core::List<core::int*>* #t64 = <core::int*>[];
+    final core::List<core::int*>* #t62 = <core::int*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      for (final core::int* #t63 in <core::int*>[])
+        #t62.{core::List::add}{Invariant}(#t63);
+  } =>#t62;
+  core::Set<core::int*>* set50 = block {
+    final core::Set<core::int*>* #t64 = col::LinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       for (final core::int* #t65 in <core::int*>[])
-        #t64.{core::List::add}(#t65);
+        #t64.{core::Set::add}{Invariant}(#t65);
+    #t64.{core::Set::add}{Invariant}(null);
   } =>#t64;
-  core::Set<core::int*>* set50 = block {
-    final core::Set<core::int*>* #t66 = col::LinkedHashSet::•<core::int*>();
-    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      for (final core::int* #t67 in <core::int*>[])
-        #t66.{core::Set::add}(#t67);
-    #t66.{core::Set::add}(null);
-  } =>#t66;
   core::Map<core::String*, core::int*>* map50 = block {
-    final core::Map<core::String*, core::int*>* #t68 = <core::String*, core::int*>{};
+    final core::Map<core::String*, core::int*>* #t66 = <core::String*, core::int*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      for (final core::MapEntry<core::String*, core::int*>* #t69 in <core::String*, core::int*>{}.{core::Map::entries})
-        #t68.{core::Map::[]=}(#t69.{core::MapEntry::key}, #t69.{core::MapEntry::value});
-    #t68.{core::Map::[]=}("baz", null);
-  } =>#t68;
+      for (final core::MapEntry<core::String*, core::int*>* #t67 in <core::String*, core::int*>{}.{core::Map::entries})
+        #t66.{core::Map::[]=}{Invariant}(#t67.{core::MapEntry::key}, #t67.{core::MapEntry::value});
+    #t66.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t66;
   core::List<core::int*>* list51 = block {
-    final core::List<core::int*>* #t70 = <core::int*>[];
+    final core::List<core::int*>* #t68 = <core::int*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      for (final core::int* #t71 in let final core::Set<core::int*>* #t72 = col::LinkedHashSet::•<core::int*>() in #t72)
-        #t70.{core::List::add}(#t71);
-  } =>#t70;
+      for (final core::int* #t69 in block {
+        final core::Set<core::int*>* #t70 = col::LinkedHashSet::•<core::int*>();
+      } =>#t70)
+        #t68.{core::List::add}{Invariant}(#t69);
+  } =>#t68;
   core::Set<core::int*>* set51 = block {
-    final core::Set<core::int*>* #t73 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t71 = col::LinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      for (final core::int* #t74 in let final core::Set<core::int*>* #t75 = col::LinkedHashSet::•<core::int*>() in #t75)
-        #t73.{core::Set::add}(#t74);
-    #t73.{core::Set::add}(null);
-  } =>#t73;
+      for (final core::int* #t72 in block {
+        final core::Set<core::int*>* #t73 = col::LinkedHashSet::•<core::int*>();
+      } =>#t73)
+        #t71.{core::Set::add}{Invariant}(#t72);
+    #t71.{core::Set::add}{Invariant}(null);
+  } =>#t71;
   core::List<core::int*>* list52 = block {
-    final core::List<core::int*>* #t76 = <core::int*>[];
+    final core::List<core::int*>* #t74 = <core::int*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
+        for (final core::int* #t75 in <core::int*>[])
+          #t74.{core::List::add}{Invariant}(#t75);
+  } =>#t74;
+  core::Set<core::int*>* set52 = block {
+    final core::Set<core::int*>* #t76 = col::LinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
         for (final core::int* #t77 in <core::int*>[])
-          #t76.{core::List::add}(#t77);
+          #t76.{core::Set::add}{Invariant}(#t77);
+    #t76.{core::Set::add}{Invariant}(null);
   } =>#t76;
-  core::Set<core::int*>* set52 = block {
-    final core::Set<core::int*>* #t78 = col::LinkedHashSet::•<core::int*>();
-    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        for (final core::int* #t79 in <core::int*>[])
-          #t78.{core::Set::add}(#t79);
-    #t78.{core::Set::add}(null);
-  } =>#t78;
   core::Map<core::String*, core::int*>* map52 = block {
-    final core::Map<core::String*, core::int*>* #t80 = <core::String*, core::int*>{};
+    final core::Map<core::String*, core::int*>* #t78 = <core::String*, core::int*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        for (final core::MapEntry<core::String*, core::int*>* #t81 in <core::String*, core::int*>{}.{core::Map::entries})
-          #t80.{core::Map::[]=}(#t81.{core::MapEntry::key}, #t81.{core::MapEntry::value});
-    #t80.{core::Map::[]=}("baz", null);
-  } =>#t80;
+        for (final core::MapEntry<core::String*, core::int*>* #t79 in <core::String*, core::int*>{}.{core::Map::entries})
+          #t78.{core::Map::[]=}{Invariant}(#t79.{core::MapEntry::key}, #t79.{core::MapEntry::value});
+    #t78.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t78;
   core::List<core::List<core::int*>*>* list60 = block {
-    final core::List<core::List<core::int*>*>* #t82 = <core::List<core::int*>*>[];
+    final core::List<core::List<core::int*>*>* #t80 = <core::List<core::int*>*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      for (final core::List<core::int*>* #t81 in <core::List<core::int*>*>[<core::int*>[]])
+        #t80.{core::List::add}{Invariant}(#t81);
+  } =>#t80;
+  core::Set<core::List<core::int*>*>* set60 = block {
+    final core::Set<core::List<core::int*>*>* #t82 = col::LinkedHashSet::•<core::List<core::int*>*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       for (final core::List<core::int*>* #t83 in <core::List<core::int*>*>[<core::int*>[]])
-        #t82.{core::List::add}(#t83);
+        #t82.{core::Set::add}{Invariant}(#t83);
+    #t82.{core::Set::add}{Invariant}(null);
   } =>#t82;
-  core::Set<core::List<core::int*>*>* set60 = block {
-    final core::Set<core::List<core::int*>*>* #t84 = col::LinkedHashSet::•<core::List<core::int*>*>();
-    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      for (final core::List<core::int*>* #t85 in <core::List<core::int*>*>[<core::int*>[]])
-        #t84.{core::Set::add}(#t85);
-    #t84.{core::Set::add}(null);
-  } =>#t84;
   core::Map<core::String*, core::List<core::int*>*>* map60 = block {
-    final core::Map<core::String*, core::List<core::int*>*>* #t86 = <core::String*, core::List<core::int*>*>{};
+    final core::Map<core::String*, core::List<core::int*>*>* #t84 = <core::String*, core::List<core::int*>*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t87 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[]}.{core::Map::entries})
-        #t86.{core::Map::[]=}(#t87.{core::MapEntry::key}, #t87.{core::MapEntry::value});
-    #t86.{core::Map::[]=}("baz", null);
-  } =>#t86;
+      for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t85 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[]}.{core::Map::entries})
+        #t84.{core::Map::[]=}{Invariant}(#t85.{core::MapEntry::key}, #t85.{core::MapEntry::value});
+    #t84.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t84;
   core::List<core::List<core::int*>*>* list61 = block {
-    final core::List<core::List<core::int*>*>* #t88 = <core::List<core::int*>*>[];
+    final core::List<core::List<core::int*>*>* #t86 = <core::List<core::int*>*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
+        for (final core::List<core::int*>* #t87 in <core::List<core::int*>*>[<core::int*>[]])
+          #t86.{core::List::add}{Invariant}(#t87);
+  } =>#t86;
+  core::Set<core::List<core::int*>*>* set61 = block {
+    final core::Set<core::List<core::int*>*>* #t88 = col::LinkedHashSet::•<core::List<core::int*>*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
         for (final core::List<core::int*>* #t89 in <core::List<core::int*>*>[<core::int*>[]])
-          #t88.{core::List::add}(#t89);
+          #t88.{core::Set::add}{Invariant}(#t89);
+    #t88.{core::Set::add}{Invariant}(null);
   } =>#t88;
-  core::Set<core::List<core::int*>*>* set61 = block {
-    final core::Set<core::List<core::int*>*>* #t90 = col::LinkedHashSet::•<core::List<core::int*>*>();
-    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        for (final core::List<core::int*>* #t91 in <core::List<core::int*>*>[<core::int*>[]])
-          #t90.{core::Set::add}(#t91);
-    #t90.{core::Set::add}(null);
-  } =>#t90;
   core::Map<core::String*, core::List<core::int*>*>* map61 = block {
-    final core::Map<core::String*, core::List<core::int*>*>* #t92 = <core::String*, core::List<core::int*>*>{};
+    final core::Map<core::String*, core::List<core::int*>*>* #t90 = <core::String*, core::List<core::int*>*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t93 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[]}.{core::Map::entries})
-          #t92.{core::Map::[]=}(#t93.{core::MapEntry::key}, #t93.{core::MapEntry::value});
-    #t92.{core::Map::[]=}("baz", null);
-  } =>#t92;
+        for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t91 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[]}.{core::Map::entries})
+          #t90.{core::Map::[]=}{Invariant}(#t91.{core::MapEntry::key}, #t91.{core::MapEntry::value});
+    #t90.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t90;
   core::List<core::List<core::int*>*>* list70 = block {
+    final core::List<core::List<core::int*>*>* #t92 = <core::List<core::int*>*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      #t92.{core::List::add}{Invariant}(<core::int*>[]);
+  } =>#t92;
+  core::Set<core::List<core::int*>*>* set70 = block {
+    final core::Set<core::List<core::int*>*>* #t93 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      #t93.{core::Set::add}{Invariant}(<core::int*>[]);
+    #t93.{core::Set::add}{Invariant}(null);
+  } =>#t93;
+  core::List<core::List<core::int*>*>* list71 = block {
     final core::List<core::List<core::int*>*>* #t94 = <core::List<core::int*>*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t94.{core::List::add}(<core::int*>[]);
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
+        #t94.{core::List::add}{Invariant}(<core::int*>[]);
   } =>#t94;
-  core::Set<core::List<core::int*>*>* set70 = block {
+  core::Set<core::List<core::int*>*>* set71 = block {
     final core::Set<core::List<core::int*>*>* #t95 = col::LinkedHashSet::•<core::List<core::int*>*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t95.{core::Set::add}(<core::int*>[]);
-    #t95.{core::Set::add}(null);
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
+        #t95.{core::Set::add}{Invariant}(<core::int*>[]);
+    #t95.{core::Set::add}{Invariant}(null);
   } =>#t95;
-  core::List<core::List<core::int*>*>* list71 = block {
-    final core::List<core::List<core::int*>*>* #t96 = <core::List<core::int*>*>[];
-    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t96.{core::List::add}(<core::int*>[]);
-  } =>#t96;
-  core::Set<core::List<core::int*>*>* set71 = block {
-    final core::Set<core::List<core::int*>*>* #t97 = col::LinkedHashSet::•<core::List<core::int*>*>();
-    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t97.{core::Set::add}(<core::int*>[]);
-    #t97.{core::Set::add}(null);
-  } =>#t97;
   core::List<core::num*>* list80 = block {
-    final core::List<core::num*>* #t98 = <core::num*>[];
+    final core::List<core::num*>* #t96 = <core::num*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t98.{core::List::add}(42);
+      #t96.{core::List::add}{Invariant}(42);
     else
-      #t98.{core::List::add}(3.14);
-  } =>#t98;
+      #t96.{core::List::add}{Invariant}(3.14);
+  } =>#t96;
   core::Set<core::num*>* set80 = block {
-    final core::Set<core::num*>* #t99 = col::LinkedHashSet::•<core::num*>();
+    final core::Set<core::num*>* #t97 = col::LinkedHashSet::•<core::num*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t99.{core::Set::add}(42);
+      #t97.{core::Set::add}{Invariant}(42);
     else
-      #t99.{core::Set::add}(3.14);
-    #t99.{core::Set::add}(null);
-  } =>#t99;
+      #t97.{core::Set::add}{Invariant}(3.14);
+    #t97.{core::Set::add}{Invariant}(null);
+  } =>#t97;
   core::Map<core::String*, core::num*>* map80 = block {
-    final core::Map<core::String*, core::num*>* #t100 = <core::String*, core::num*>{};
+    final core::Map<core::String*, core::num*>* #t98 = <core::String*, core::num*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t100.{core::Map::[]=}("bar", 42);
+      #t98.{core::Map::[]=}{Invariant}("bar", 42);
     else
-      #t100.{core::Map::[]=}("bar", 3.14);
-    #t100.{core::Map::[]=}("baz", null);
-  } =>#t100;
+      #t98.{core::Map::[]=}{Invariant}("bar", 3.14);
+    #t98.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t98;
   core::List<core::num*>* list81 = block {
-    final core::List<core::num*>* #t101 = <core::num*>[];
+    final core::List<core::num*>* #t99 = <core::num*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      for (final core::num* #t102 in listInt)
-        #t101.{core::List::add}(#t102);
+      for (final core::num* #t100 in listInt)
+        #t99.{core::List::add}{Invariant}(#t100);
     else
-      for (final core::num* #t103 in listDouble)
-        #t101.{core::List::add}(#t103);
-  } =>#t101;
+      for (final core::num* #t101 in listDouble)
+        #t99.{core::List::add}{Invariant}(#t101);
+  } =>#t99;
   core::Set<core::num*>* set81 = block {
-    final core::Set<core::num*>* #t104 = col::LinkedHashSet::•<core::num*>();
+    final core::Set<core::num*>* #t102 = col::LinkedHashSet::•<core::num*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      for (final core::num* #t105 in listInt)
-        #t104.{core::Set::add}(#t105);
+      for (final core::num* #t103 in listInt)
+        #t102.{core::Set::add}{Invariant}(#t103);
     else
-      for (final core::num* #t106 in listDouble)
-        #t104.{core::Set::add}(#t106);
-    #t104.{core::Set::add}(null);
-  } =>#t104;
+      for (final core::num* #t104 in listDouble)
+        #t102.{core::Set::add}{Invariant}(#t104);
+    #t102.{core::Set::add}{Invariant}(null);
+  } =>#t102;
   core::Map<core::String*, core::num*>* map81 = block {
-    final core::Map<core::String*, core::num*>* #t107 = <core::String*, core::num*>{};
+    final core::Map<core::String*, core::num*>* #t105 = <core::String*, core::num*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      for (final core::MapEntry<core::String*, core::num*>* #t108 in mapToInt.{core::Map::entries})
-        #t107.{core::Map::[]=}(#t108.{core::MapEntry::key}, #t108.{core::MapEntry::value});
+      for (final core::MapEntry<core::String*, core::num*>* #t106 in mapToInt.{core::Map::entries})
+        #t105.{core::Map::[]=}{Invariant}(#t106.{core::MapEntry::key}, #t106.{core::MapEntry::value});
     else
-      for (final core::MapEntry<core::String*, core::num*>* #t109 in mapToDouble.{core::Map::entries})
-        #t107.{core::Map::[]=}(#t109.{core::MapEntry::key}, #t109.{core::MapEntry::value});
-    #t107.{core::Map::[]=}("baz", null);
-  } =>#t107;
+      for (final core::MapEntry<core::String*, core::num*>* #t107 in mapToDouble.{core::Map::entries})
+        #t105.{core::Map::[]=}{Invariant}(#t107.{core::MapEntry::key}, #t107.{core::MapEntry::value});
+    #t105.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t105;
   core::List<dynamic>* list82 = block {
-    final core::List<dynamic>* #t110 = <dynamic>[];
+    final core::List<dynamic>* #t108 = <dynamic>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      for (final dynamic #t111 in listInt)
-        #t110.{core::List::add}(#t111);
+      for (final dynamic #t109 in listInt)
+        #t108.{core::List::add}{Invariant}(#t109);
     else
-      for (final dynamic #t112 in dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*)
-        #t110.{core::List::add}(#t112);
-  } =>#t110;
+      for (final dynamic #t110 in dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*)
+        #t108.{core::List::add}{Invariant}(#t110);
+  } =>#t108;
   core::Set<dynamic>* set82 = block {
-    final core::Set<dynamic>* #t113 = col::LinkedHashSet::•<dynamic>();
+    final core::Set<dynamic>* #t111 = col::LinkedHashSet::•<dynamic>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      for (final dynamic #t114 in listInt)
-        #t113.{core::Set::add}(#t114);
+      for (final dynamic #t112 in listInt)
+        #t111.{core::Set::add}{Invariant}(#t112);
     else
-      for (final dynamic #t115 in dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*)
-        #t113.{core::Set::add}(#t115);
-    #t113.{core::Set::add}(null);
-  } =>#t113;
+      for (final dynamic #t113 in dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*)
+        #t111.{core::Set::add}{Invariant}(#t113);
+    #t111.{core::Set::add}{Invariant}(null);
+  } =>#t111;
   core::Set<dynamic>* map82 = block {
-    final core::Set<dynamic>* #t116 = col::LinkedHashSet::•<dynamic>();
+    final core::Set<dynamic>* #t114 = col::LinkedHashSet::•<dynamic>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t116.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:71:38: Error: Unexpected type 'Map<String, int>' of a spread.  Expected 'dynamic' or an Iterable.
+      #t114.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:71:38: Error: Unexpected type 'Map<String, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
   var map82 = {if (oracle(\"foo\")) ...mapToInt else ...dynVar, null};
                                      ^");
     else
-      for (final dynamic #t117 in dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*)
-        #t116.{core::Set::add}(#t117);
-    #t116.{core::Set::add}(null);
-  } =>#t116;
+      for (final dynamic #t115 in dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*)
+        #t114.{core::Set::add}{Invariant}(#t115);
+    #t114.{core::Set::add}{Invariant}(null);
+  } =>#t114;
   core::List<core::num*>* list83 = block {
-    final core::List<core::num*>* #t118 = <core::num*>[];
+    final core::List<core::num*>* #t116 = <core::num*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t118.{core::List::add}(42);
+      #t116.{core::List::add}{Invariant}(42);
     else
-      for (final core::num* #t119 in listDouble)
-        #t118.{core::List::add}(#t119);
-  } =>#t118;
+      for (final core::num* #t117 in listDouble)
+        #t116.{core::List::add}{Invariant}(#t117);
+  } =>#t116;
   core::Set<core::num*>* set83 = block {
-    final core::Set<core::num*>* #t120 = col::LinkedHashSet::•<core::num*>();
+    final core::Set<core::num*>* #t118 = col::LinkedHashSet::•<core::num*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      for (final core::num* #t121 in listInt)
-        #t120.{core::Set::add}(#t121);
+      for (final core::num* #t119 in listInt)
+        #t118.{core::Set::add}{Invariant}(#t119);
     else
-      #t120.{core::Set::add}(3.14);
-    #t120.{core::Set::add}(null);
-  } =>#t120;
+      #t118.{core::Set::add}{Invariant}(3.14);
+    #t118.{core::Set::add}{Invariant}(null);
+  } =>#t118;
   core::Map<core::String*, core::num*>* map83 = block {
-    final core::Map<core::String*, core::num*>* #t122 = <core::String*, core::num*>{};
+    final core::Map<core::String*, core::num*>* #t120 = <core::String*, core::num*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      for (final core::MapEntry<core::String*, core::num*>* #t123 in mapToInt.{core::Map::entries})
-        #t122.{core::Map::[]=}(#t123.{core::MapEntry::key}, #t123.{core::MapEntry::value});
+      for (final core::MapEntry<core::String*, core::num*>* #t121 in mapToInt.{core::Map::entries})
+        #t120.{core::Map::[]=}{Invariant}(#t121.{core::MapEntry::key}, #t121.{core::MapEntry::value});
     else
-      #t122.{core::Map::[]=}("bar", 3.14);
-    #t122.{core::Map::[]=}("baz", null);
-  } =>#t122;
+      #t120.{core::Map::[]=}{Invariant}("bar", 3.14);
+    #t120.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t120;
   core::List<core::int*>* list90 = block {
-    final core::List<core::int*>* #t124 = <core::int*>[];
+    final core::List<core::int*>* #t122 = <core::int*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t124.{core::List::add}(dynVar as{TypeError,ForDynamic} core::int*);
-  } =>#t124;
+      #t122.{core::List::add}{Invariant}(dynVar as{TypeError,ForDynamic} core::int*);
+  } =>#t122;
   core::Set<core::int*>* set90 = block {
-    final core::Set<core::int*>* #t125 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t123 = col::LinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t125.{core::Set::add}(dynVar as{TypeError,ForDynamic} core::int*);
-    #t125.{core::Set::add}(null);
-  } =>#t125;
+      #t123.{core::Set::add}{Invariant}(dynVar as{TypeError,ForDynamic} core::int*);
+    #t123.{core::Set::add}{Invariant}(null);
+  } =>#t123;
   core::Map<core::String*, core::int*>* map90 = block {
-    final core::Map<core::String*, core::int*>* #t126 = <core::String*, core::int*>{};
+    final core::Map<core::String*, core::int*>* #t124 = <core::String*, core::int*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t126.{core::Map::[]=}("bar", dynVar as{TypeError,ForDynamic} core::int*);
-    #t126.{core::Map::[]=}("baz", null);
-  } =>#t126;
+      #t124.{core::Map::[]=}{Invariant}("bar", dynVar as{TypeError,ForDynamic} core::int*);
+    #t124.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t124;
   core::List<core::int*>* list91 = block {
-    final core::List<core::int*>* #t127 = <core::int*>[];
+    final core::List<core::int*>* #t125 = <core::int*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      for (final dynamic #t128 in dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*) {
-        final core::int* #t129 = #t128 as{TypeError} core::int*;
-        #t127.{core::List::add}(#t129);
+      for (final dynamic #t126 in dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*) {
+        final core::int* #t127 = #t126 as{TypeError} core::int*;
+        #t125.{core::List::add}{Invariant}(#t127);
       }
-  } =>#t127;
+  } =>#t125;
   core::Set<core::int*>* set91 = block {
-    final core::Set<core::int*>* #t130 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t128 = col::LinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      for (final dynamic #t131 in dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*) {
-        final core::int* #t132 = #t131 as{TypeError} core::int*;
-        #t130.{core::Set::add}(#t132);
+      for (final dynamic #t129 in dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*) {
+        final core::int* #t130 = #t129 as{TypeError} core::int*;
+        #t128.{core::Set::add}{Invariant}(#t130);
       }
-    #t130.{core::Set::add}(null);
-  } =>#t130;
+    #t128.{core::Set::add}{Invariant}(null);
+  } =>#t128;
   core::Map<core::String*, core::int*>* map91 = block {
-    final core::Map<core::String*, core::int*>* #t133 = <core::String*, core::int*>{};
+    final core::Map<core::String*, core::int*>* #t131 = <core::String*, core::int*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      for (final core::MapEntry<dynamic, dynamic>* #t134 in (dynVar as{TypeError,ForDynamic} core::Map<dynamic, dynamic>*).{core::Map::entries}) {
-        final core::String* #t135 = #t134.{core::MapEntry::key} as{TypeError} core::String*;
-        final core::int* #t136 = #t134.{core::MapEntry::value} as{TypeError} core::int*;
-        #t133.{core::Map::[]=}(#t135, #t136);
+      for (final core::MapEntry<dynamic, dynamic>* #t132 in (dynVar as{TypeError,ForDynamic} core::Map<dynamic, dynamic>*).{core::Map::entries}) {
+        final core::String* #t133 = #t132.{core::MapEntry::key} as{TypeError} core::String*;
+        final core::int* #t134 = #t132.{core::MapEntry::value} as{TypeError} core::int*;
+        #t131.{core::Map::[]=}{Invariant}(#t133, #t134);
       }
-    #t133.{core::Map::[]=}("baz", null);
-  } =>#t133;
+    #t131.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t131;
   core::List<core::int*>* list100 = block {
-    final core::List<core::int*>* #t137 = <core::int*>[];
+    final core::List<core::int*>* #t135 = <core::int*>[];
     if(dynVar as{TypeError,ForDynamic} core::bool*)
-      #t137.{core::List::add}(42);
-  } =>#t137;
+      #t135.{core::List::add}{Invariant}(42);
+  } =>#t135;
   core::Set<core::int*>* set100 = block {
-    final core::Set<core::int*>* #t138 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t136 = col::LinkedHashSet::•<core::int*>();
     if(dynVar as{TypeError,ForDynamic} core::bool*)
-      #t138.{core::Set::add}(42);
-  } =>#t138;
+      #t136.{core::Set::add}{Invariant}(42);
+  } =>#t136;
   core::Map<core::int*, core::int*>* map100 = block {
-    final core::Map<core::int*, core::int*>* #t139 = <core::int*, core::int*>{};
+    final core::Map<core::int*, core::int*>* #t137 = <core::int*, core::int*>{};
     if(dynVar as{TypeError,ForDynamic} core::bool*)
-      #t139.{core::Map::[]=}(42, 42);
-  } =>#t139;
+      #t137.{core::Map::[]=}{Invariant}(42, 42);
+  } =>#t137;
 }
 static method testIfElementErrors(core::Map<core::int*, core::int*>* map) → dynamic {
   block {
-    final core::List<core::int*>* #t140 = <core::int*>[];
+    final core::List<core::int*>* #t138 = <core::int*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t140.{core::List::add}(let final<BottomType> #t141 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:87:28: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+      #t138.{core::List::add}{Invariant}(let final<BottomType> #t139 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:87:28: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int>[if (oracle(\"foo\")) \"bar\"];
                            ^" in "bar" as{TypeError} core::int*);
-  } =>#t140;
+  } =>#t138;
   block {
-    final core::Set<core::int*>* #t142 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t140 = col::LinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t142.{core::Set::add}(let final<BottomType> #t143 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:88:28: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+      #t140.{core::Set::add}{Invariant}(let final<BottomType> #t141 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:88:28: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int>{if (oracle(\"foo\")) \"bar\", null};
                            ^" in "bar" as{TypeError} core::int*);
-    #t142.{core::Set::add}(null);
-  } =>#t142;
+    #t140.{core::Set::add}{Invariant}(null);
+  } =>#t140;
   block {
-    final core::Map<core::String*, core::int*>* #t144 = <core::String*, core::int*>{};
+    final core::Map<core::String*, core::int*>* #t142 = <core::String*, core::int*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t144.{core::Map::[]=}("bar", let final<BottomType> #t145 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:89:43: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+      #t142.{core::Map::[]=}{Invariant}("bar", let final<BottomType> #t143 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:89:43: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <String, int>{if (oracle(\"foo\")) \"bar\": \"bar\", \"baz\": null};
                                           ^" in "bar" as{TypeError} core::int*);
-    #t144.{core::Map::[]=}("baz", null);
-  } =>#t144;
+    #t142.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t142;
   block {
-    final core::List<core::int*>* #t146 = <core::int*>[];
+    final core::List<core::int*>* #t144 = <core::int*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      for (final core::int* #t147 in <core::int*>[let final<BottomType> #t148 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:90:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+      for (final core::int* #t145 in <core::int*>[let final<BottomType> #t146 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:90:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int>[if (oracle(\"foo\")) ...[\"bar\"]];
                                ^" in "bar" as{TypeError} core::int*])
-        #t146.{core::List::add}(#t147);
-  } =>#t146;
+        #t144.{core::List::add}{Invariant}(#t145);
+  } =>#t144;
   block {
-    final core::Set<core::int*>* #t149 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t147 = col::LinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      for (final core::int* #t150 in <core::int*>[let final<BottomType> #t151 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:91:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+      for (final core::int* #t148 in <core::int*>[let final<BottomType> #t149 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:91:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int>{if (oracle(\"foo\")) ...[\"bar\"], null};
                                ^" in "bar" as{TypeError} core::int*])
-        #t149.{core::Set::add}(#t150);
-    #t149.{core::Set::add}(null);
-  } =>#t149;
+        #t147.{core::Set::add}{Invariant}(#t148);
+    #t147.{core::Set::add}{Invariant}(null);
+  } =>#t147;
   block {
-    final core::Map<core::String*, core::int*>* #t152 = <core::String*, core::int*>{};
+    final core::Map<core::String*, core::int*>* #t150 = <core::String*, core::int*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      for (final core::MapEntry<core::String*, core::int*>* #t153 in <core::String*, core::int*>{"bar": let final<BottomType> #t154 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:92:47: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+      for (final core::MapEntry<core::String*, core::int*>* #t151 in <core::String*, core::int*>{"bar": let final<BottomType> #t152 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:92:47: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <String, int>{if (oracle(\"foo\")) ...{\"bar\": \"bar\"}, \"baz\": null};
                                               ^" in "bar" as{TypeError} core::int*}.{core::Map::entries})
-        #t152.{core::Map::[]=}(#t153.{core::MapEntry::key}, #t153.{core::MapEntry::value});
-    #t152.{core::Map::[]=}("baz", null);
-  } =>#t152;
+        #t150.{core::Map::[]=}{Invariant}(#t151.{core::MapEntry::key}, #t151.{core::MapEntry::value});
+    #t150.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t150;
   block {
-    final core::List<core::int*>* #t155 = <core::int*>[];
+    final core::List<core::int*>* #t153 = <core::int*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t155.{core::List::add}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:93:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+      #t153.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:93:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
   <int>[if (oracle(\"foo\")) ...map];
                               ^");
-  } =>#t155;
+  } =>#t153;
   block {
-    final core::Set<core::int*>* #t156 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t154 = col::LinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t156.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:94:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+      #t154.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:94:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
   <int>{if (oracle(\"foo\")) ...map, null};
                               ^");
-    #t156.{core::Set::add}(null);
-  } =>#t156;
+    #t154.{core::Set::add}{Invariant}(null);
+  } =>#t154;
   <core::String*, core::int*>{invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:95:39: Error: Unexpected type 'List<String>' of a map spread entry.  Expected 'dynamic' or a Map.
  - 'List' is from 'dart:core'.
   <String, int>{if (oracle(\"foo\")) ...[\"bar\"], \"baz\": null};
@@ -1050,61 +1060,61 @@
   <String, int>{if (oracle(\"foo\")) ...[\"bar\"], \"baz\": null};
                                       ^": null};
   block {
-    final core::List<core::String*>* #t157 = <core::String*>[];
+    final core::List<core::String*>* #t155 = <core::String*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t157.{core::List::add}(let final<BottomType> #t158 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:96:31: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+      #t155.{core::List::add}{Invariant}(let final<BottomType> #t156 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:96:31: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
   <String>[if (oracle(\"foo\")) 42 else 3.14];
                               ^" in 42 as{TypeError} core::String*);
     else
-      #t157.{core::List::add}(let final<BottomType> #t159 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:96:39: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
+      #t155.{core::List::add}{Invariant}(let final<BottomType> #t157 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:96:39: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
   <String>[if (oracle(\"foo\")) 42 else 3.14];
                                       ^" in 3.14 as{TypeError} core::String*);
-  } =>#t157;
+  } =>#t155;
   block {
-    final core::Set<core::String*>* #t160 = col::LinkedHashSet::•<core::String*>();
+    final core::Set<core::String*>* #t158 = col::LinkedHashSet::•<core::String*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t160.{core::Set::add}(let final<BottomType> #t161 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:97:31: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+      #t158.{core::Set::add}{Invariant}(let final<BottomType> #t159 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:97:31: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
   <String>{if (oracle(\"foo\")) 42 else 3.14, null};
                               ^" in 42 as{TypeError} core::String*);
     else
-      #t160.{core::Set::add}(let final<BottomType> #t162 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:97:39: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
+      #t158.{core::Set::add}{Invariant}(let final<BottomType> #t160 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:97:39: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
   <String>{if (oracle(\"foo\")) 42 else 3.14, null};
                                       ^" in 3.14 as{TypeError} core::String*);
-    #t160.{core::Set::add}(null);
-  } =>#t160;
+    #t158.{core::Set::add}{Invariant}(null);
+  } =>#t158;
   block {
-    final core::Map<core::String*, core::String*>* #t163 = <core::String*, core::String*>{};
+    final core::Map<core::String*, core::String*>* #t161 = <core::String*, core::String*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t163.{core::Map::[]=}("bar", let final<BottomType> #t164 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:98:46: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+      #t161.{core::Map::[]=}{Invariant}("bar", let final<BottomType> #t162 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:98:46: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
   <String, String>{if (oracle(\"foo\")) \"bar\": 42 else \"baz\": 3.14, \"baz\": null};
                                              ^" in 42 as{TypeError} core::String*);
     else
-      #t163.{core::Map::[]=}("baz", let final<BottomType> #t165 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:98:61: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
+      #t161.{core::Map::[]=}{Invariant}("baz", let final<BottomType> #t163 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:98:61: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
   <String, String>{if (oracle(\"foo\")) \"bar\": 42 else \"baz\": 3.14, \"baz\": null};
                                                             ^" in 3.14 as{TypeError} core::String*);
-    #t163.{core::Map::[]=}("baz", null);
-  } =>#t163;
+    #t161.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t161;
   block {
-    final core::List<core::int*>* #t166 = <core::int*>[];
+    final core::List<core::int*>* #t164 = <core::int*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t166.{core::List::add}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:99:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+      #t164.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:99:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
   <int>[if (oracle(\"foo\")) ...map else 42];
                               ^");
     else
-      #t166.{core::List::add}(42);
-  } =>#t166;
+      #t164.{core::List::add}{Invariant}(42);
+  } =>#t164;
   block {
-    final core::Set<core::int*>* #t167 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t165 = col::LinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t167.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:100:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+      #t165.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:100:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
   <int>{if (oracle(\"foo\")) ...map else 42, null};
                               ^");
     else
-      #t167.{core::Set::add}(42);
-    #t167.{core::Set::add}(null);
-  } =>#t167;
+      #t165.{core::Set::add}{Invariant}(42);
+    #t165.{core::Set::add}{Invariant}(null);
+  } =>#t165;
   <core::String*, core::int*>{invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:101:39: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
  - 'List' is from 'dart:core'.
   <String, int>{if (oracle(\"foo\")) ...[42] else \"bar\": 42, \"baz\": null};
@@ -1113,26 +1123,26 @@
   <String, int>{if (oracle(\"foo\")) ...[42] else \"bar\": 42, \"baz\": null};
                                       ^": null};
   block {
-    final core::List<core::int*>* #t168 = <core::int*>[];
+    final core::List<core::int*>* #t166 = <core::int*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t168.{core::List::add}(42);
+      #t166.{core::List::add}{Invariant}(42);
     else
-      #t168.{core::List::add}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:102:39: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+      #t166.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:102:39: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
   <int>[if (oracle(\"foo\")) 42 else ...map];
                                       ^");
-  } =>#t168;
+  } =>#t166;
   block {
-    final core::Set<core::int*>* #t169 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t167 = col::LinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t169.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:103:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+      #t167.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:103:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
   <int>{if (oracle(\"foo\")) ...map else 42, null};
                               ^");
     else
-      #t169.{core::Set::add}(42);
-    #t169.{core::Set::add}(null);
-  } =>#t169;
+      #t167.{core::Set::add}{Invariant}(42);
+    #t167.{core::Set::add}{Invariant}(null);
+  } =>#t167;
   <core::String*, core::int*>{invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:104:54: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
  - 'List' is from 'dart:core'.
   <String, int>{if (oracle(\"foo\")) \"bar\": 42 else ...[42], \"baz\": null};
@@ -1152,746 +1162,756 @@
   core::Map<dynamic, dynamic>* map11 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:109:70: Error: Expected ':' after this.
   Map<dynamic, dynamic> map11 = {if (oracle(\"foo\")) \"bar\": 3.14 else 42};
                                                                      ^": null};
-  core::Map<dynamic, core::Null?>* map12 = <dynamic, core::Null?>{invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:110:35: Error: Expected ':' after this.
+  core::Map<dynamic, Null>* map12 = <dynamic, Null>{invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:110:35: Error: Expected ':' after this.
   var map12 = {if (oracle(\"foo\")) 42 else \"bar\": 3.14};
                                   ^": null};
-  core::Map<dynamic, core::Null?>* map13 = <dynamic, core::Null?>{invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:111:52: Error: Expected ':' after this.
+  core::Map<dynamic, Null>* map13 = <dynamic, Null>{invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:111:52: Error: Expected ':' after this.
   var map13 = {if (oracle(\"foo\")) \"bar\": 3.14 else 42};
                                                    ^": null};
   core::List<core::int*>* list20 = block {
-    final core::List<core::int*>* #t170 = <core::int*>[];
-    if(let final<BottomType> #t171 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:112:27: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
+    final core::List<core::int*>* #t168 = <core::int*>[];
+    if(let final<BottomType> #t169 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:112:27: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
   List<int> list20 = [if (42) 42];
                           ^" in 42 as{TypeError} core::bool*)
-      #t170.{core::List::add}(42);
-  } =>#t170;
+      #t168.{core::List::add}{Invariant}(42);
+  } =>#t168;
   core::Set<core::int*>* set20 = block {
-    final core::Set<core::int*>* #t172 = col::LinkedHashSet::•<core::int*>();
-    if(let final<BottomType> #t173 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:113:25: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
+    final core::Set<core::int*>* #t170 = col::LinkedHashSet::•<core::int*>();
+    if(let final<BottomType> #t171 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:113:25: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
   Set<int> set20 = {if (42) 42};
                         ^" in 42 as{TypeError} core::bool*)
-      #t172.{core::Set::add}(42);
-  } =>#t172;
+      #t170.{core::Set::add}{Invariant}(42);
+  } =>#t170;
   core::Map<core::int*, core::int*>* map30 = block {
-    final core::Map<core::int*, core::int*>* #t174 = <core::int*, core::int*>{};
-    if(let final<BottomType> #t175 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:114:30: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
+    final core::Map<core::int*, core::int*>* #t172 = <core::int*, core::int*>{};
+    if(let final<BottomType> #t173 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:114:30: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
   Map<int, int> map30 = {if (42) 42: 42};
                              ^" in 42 as{TypeError} core::bool*)
-      #t174.{core::Map::[]=}(42, 42);
-  } =>#t174;
+      #t172.{core::Map::[]=}{Invariant}(42, 42);
+  } =>#t172;
   core::List<core::String*>* list40 = block {
-    final core::List<core::String*>* #t176 = <core::String*>[];
+    final core::List<core::String*>* #t174 = <core::String*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t176.{core::List::add}(let final<BottomType> #t177 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:115:53: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
+      #t174.{core::List::add}{Invariant}(let final<BottomType> #t175 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:115:53: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
   List<String> list40 = <String>[if (oracle(\"foo\")) true else 42];
                                                     ^" in true as{TypeError} core::String*);
     else
-      #t176.{core::List::add}(let final<BottomType> #t178 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:115:63: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+      #t174.{core::List::add}{Invariant}(let final<BottomType> #t176 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:115:63: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
   List<String> list40 = <String>[if (oracle(\"foo\")) true else 42];
                                                               ^" in 42 as{TypeError} core::String*);
-  } =>#t176;
+  } =>#t174;
   core::Set<core::String*>* set40 = block {
-    final core::Set<core::String*>* #t179 = col::LinkedHashSet::•<core::String*>();
+    final core::Set<core::String*>* #t177 = col::LinkedHashSet::•<core::String*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t179.{core::Set::add}(let final<BottomType> #t180 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:116:51: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
+      #t177.{core::Set::add}{Invariant}(let final<BottomType> #t178 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:116:51: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
   Set<String> set40 = <String>{if (oracle(\"foo\")) true else 42};
                                                   ^" in true as{TypeError} core::String*);
     else
-      #t179.{core::Set::add}(let final<BottomType> #t181 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:116:61: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+      #t177.{core::Set::add}{Invariant}(let final<BottomType> #t179 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:116:61: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
   Set<String> set40 = <String>{if (oracle(\"foo\")) true else 42};
                                                             ^" in 42 as{TypeError} core::String*);
-  } =>#t179;
+  } =>#t177;
   core::Map<core::String*, core::int*>* map40 = block {
-    final core::Map<core::String*, core::int*>* #t182 = <core::String*, core::int*>{};
+    final core::Map<core::String*, core::int*>* #t180 = <core::String*, core::int*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t182.{core::Map::[]=}(let final<BottomType> #t183 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:117:61: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
+      #t180.{core::Map::[]=}{Invariant}(let final<BottomType> #t181 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:117:61: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
   Map<String, int> map40 = <String, int>{if (oracle(\"foo\")) true: 42 else 42: 42};
                                                             ^" in true as{TypeError} core::String*, 42);
     else
-      #t182.{core::Map::[]=}(let final<BottomType> #t184 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:117:75: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+      #t180.{core::Map::[]=}{Invariant}(let final<BottomType> #t182 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:117:75: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
   Map<String, int> map40 = <String, int>{if (oracle(\"foo\")) true: 42 else 42: 42};
                                                                           ^" in 42 as{TypeError} core::String*, 42);
-  } =>#t182;
+  } =>#t180;
   core::Map<core::int*, core::String*>* map41 = block {
-    final core::Map<core::int*, core::String*>* #t185 = <core::int*, core::String*>{};
+    final core::Map<core::int*, core::String*>* #t183 = <core::int*, core::String*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t185.{core::Map::[]=}(42, let final<BottomType> #t186 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:118:65: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
+      #t183.{core::Map::[]=}{Invariant}(42, let final<BottomType> #t184 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:118:65: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
   Map<int, String> map41 = <int, String>{if (oracle(\"foo\")) 42: true else 42: 42};
                                                                 ^" in true as{TypeError} core::String*);
     else
-      #t185.{core::Map::[]=}(42, let final<BottomType> #t187 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:118:79: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+      #t183.{core::Map::[]=}{Invariant}(42, let final<BottomType> #t185 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:118:79: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
   Map<int, String> map41 = <int, String>{if (oracle(\"foo\")) 42: true else 42: 42};
                                                                               ^" in 42 as{TypeError} core::String*);
-  } =>#t185;
+  } =>#t183;
 }
 static method testForElement(dynamic dynVar, core::List<core::int*>* listInt, core::List<core::double*>* listDouble, core::int* index, core::Map<core::String*, core::int*>* mapStringInt, core::Map<core::String*, core::double*>* mapStringDouble) → dynamic {
   core::List<core::int*>* list10 = block {
-    final core::List<core::int*>* #t188 = <core::int*>[];
+    final core::List<core::int*>* #t186 = <core::int*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      #t188.{core::List::add}(42);
-  } =>#t188;
+      #t186.{core::List::add}{Invariant}(42);
+  } =>#t186;
   core::Set<core::int*>* set10 = block {
-    final core::Set<core::int*>* #t189 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t187 = col::LinkedHashSet::•<core::int*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      #t189.{core::Set::add}(42);
-    #t189.{core::Set::add}(null);
-  } =>#t189;
+      #t187.{core::Set::add}{Invariant}(42);
+    #t187.{core::Set::add}{Invariant}(null);
+  } =>#t187;
   core::Map<core::String*, core::int*>* map10 = block {
-    final core::Map<core::String*, core::int*>* #t190 = <core::String*, core::int*>{};
+    final core::Map<core::String*, core::int*>* #t188 = <core::String*, core::int*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      #t190.{core::Map::[]=}("bar", 42);
-    #t190.{core::Map::[]=}("baz", null);
-  } =>#t190;
+      #t188.{core::Map::[]=}{Invariant}("bar", 42);
+    #t188.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t188;
   core::List<dynamic>* list11 = block {
-    final core::List<dynamic>* #t191 = <dynamic>[];
+    final core::List<dynamic>* #t189 = <dynamic>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      #t191.{core::List::add}(dynVar);
-  } =>#t191;
+      #t189.{core::List::add}{Invariant}(dynVar);
+  } =>#t189;
   core::Set<dynamic>* set11 = block {
-    final core::Set<dynamic>* #t192 = col::LinkedHashSet::•<dynamic>();
+    final core::Set<dynamic>* #t190 = col::LinkedHashSet::•<dynamic>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      #t192.{core::Set::add}(dynVar);
-    #t192.{core::Set::add}(null);
-  } =>#t192;
+      #t190.{core::Set::add}{Invariant}(dynVar);
+    #t190.{core::Set::add}{Invariant}(null);
+  } =>#t190;
   core::Map<core::String*, dynamic>* map11 = block {
-    final core::Map<core::String*, dynamic>* #t193 = <core::String*, dynamic>{};
+    final core::Map<core::String*, dynamic>* #t191 = <core::String*, dynamic>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      #t193.{core::Map::[]=}("bar", dynVar);
-    #t193.{core::Map::[]=}("baz", null);
-  } =>#t193;
+      #t191.{core::Map::[]=}{Invariant}("bar", dynVar);
+    #t191.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t191;
   core::List<core::List<core::int*>*>* list12 = block {
-    final core::List<core::List<core::int*>*>* #t194 = <core::List<core::int*>*>[];
+    final core::List<core::List<core::int*>*>* #t192 = <core::List<core::int*>*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      #t194.{core::List::add}(<core::int*>[42]);
-  } =>#t194;
+      #t192.{core::List::add}{Invariant}(<core::int*>[42]);
+  } =>#t192;
   core::Set<core::List<core::int*>*>* set12 = block {
-    final core::Set<core::List<core::int*>*>* #t195 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    final core::Set<core::List<core::int*>*>* #t193 = col::LinkedHashSet::•<core::List<core::int*>*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      #t195.{core::Set::add}(<core::int*>[42]);
-    #t195.{core::Set::add}(null);
-  } =>#t195;
+      #t193.{core::Set::add}{Invariant}(<core::int*>[42]);
+    #t193.{core::Set::add}{Invariant}(null);
+  } =>#t193;
   core::Map<core::String*, core::List<core::int*>*>* map12 = block {
-    final core::Map<core::String*, core::List<core::int*>*>* #t196 = <core::String*, core::List<core::int*>*>{};
+    final core::Map<core::String*, core::List<core::int*>*>* #t194 = <core::String*, core::List<core::int*>*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      #t196.{core::Map::[]=}("bar", <core::int*>[42]);
-    #t196.{core::Map::[]=}("baz", null);
-  } =>#t196;
+      #t194.{core::Map::[]=}{Invariant}("bar", <core::int*>[42]);
+    #t194.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t194;
   core::List<core::int*>* list20 = block {
-    final core::List<core::int*>* #t197 = <core::int*>[];
+    final core::List<core::int*>* #t195 = <core::int*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
+      for (final core::int* #t196 in <core::int*>[42])
+        #t195.{core::List::add}{Invariant}(#t196);
+  } =>#t195;
+  core::Set<core::int*>* set20 = block {
+    final core::Set<core::int*>* #t197 = col::LinkedHashSet::•<core::int*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       for (final core::int* #t198 in <core::int*>[42])
-        #t197.{core::List::add}(#t198);
+        #t197.{core::Set::add}{Invariant}(#t198);
+    #t197.{core::Set::add}{Invariant}(null);
   } =>#t197;
-  core::Set<core::int*>* set20 = block {
-    final core::Set<core::int*>* #t199 = col::LinkedHashSet::•<core::int*>();
-    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      for (final core::int* #t200 in <core::int*>[42])
-        #t199.{core::Set::add}(#t200);
-    #t199.{core::Set::add}(null);
-  } =>#t199;
   core::Map<core::String*, core::int*>* map20 = block {
-    final core::Map<core::String*, core::int*>* #t201 = <core::String*, core::int*>{};
+    final core::Map<core::String*, core::int*>* #t199 = <core::String*, core::int*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      for (final core::MapEntry<core::String*, core::int*>* #t202 in <core::String*, core::int*>{"bar": 42}.{core::Map::entries})
-        #t201.{core::Map::[]=}(#t202.{core::MapEntry::key}, #t202.{core::MapEntry::value});
-    #t201.{core::Map::[]=}("baz", null);
-  } =>#t201;
+      for (final core::MapEntry<core::String*, core::int*>* #t200 in <core::String*, core::int*>{"bar": 42}.{core::Map::entries})
+        #t199.{core::Map::[]=}{Invariant}(#t200.{core::MapEntry::key}, #t200.{core::MapEntry::value});
+    #t199.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t199;
   core::List<dynamic>* list21 = block {
-    final core::List<dynamic>* #t203 = <dynamic>[];
+    final core::List<dynamic>* #t201 = <dynamic>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
+      for (final dynamic #t202 in <dynamic>[dynVar])
+        #t201.{core::List::add}{Invariant}(#t202);
+  } =>#t201;
+  core::Set<dynamic>* set21 = block {
+    final core::Set<dynamic>* #t203 = col::LinkedHashSet::•<dynamic>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       for (final dynamic #t204 in <dynamic>[dynVar])
-        #t203.{core::List::add}(#t204);
+        #t203.{core::Set::add}{Invariant}(#t204);
+    #t203.{core::Set::add}{Invariant}(null);
   } =>#t203;
-  core::Set<dynamic>* set21 = block {
-    final core::Set<dynamic>* #t205 = col::LinkedHashSet::•<dynamic>();
-    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      for (final dynamic #t206 in <dynamic>[dynVar])
-        #t205.{core::Set::add}(#t206);
-    #t205.{core::Set::add}(null);
-  } =>#t205;
   core::Map<core::String*, dynamic>* map21 = block {
-    final core::Map<core::String*, dynamic>* #t207 = <core::String*, dynamic>{};
+    final core::Map<core::String*, dynamic>* #t205 = <core::String*, dynamic>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      for (final core::MapEntry<core::String*, dynamic>* #t208 in <core::String*, dynamic>{"bar": dynVar}.{core::Map::entries})
-        #t207.{core::Map::[]=}(#t208.{core::MapEntry::key}, #t208.{core::MapEntry::value});
-    #t207.{core::Map::[]=}("baz", null);
-  } =>#t207;
+      for (final core::MapEntry<core::String*, dynamic>* #t206 in <core::String*, dynamic>{"bar": dynVar}.{core::Map::entries})
+        #t205.{core::Map::[]=}{Invariant}(#t206.{core::MapEntry::key}, #t206.{core::MapEntry::value});
+    #t205.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t205;
   core::List<core::List<core::int*>*>* list22 = block {
-    final core::List<core::List<core::int*>*>* #t209 = <core::List<core::int*>*>[];
+    final core::List<core::List<core::int*>*>* #t207 = <core::List<core::int*>*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
+      for (final core::List<core::int*>* #t208 in <core::List<core::int*>*>[<core::int*>[42]])
+        #t207.{core::List::add}{Invariant}(#t208);
+  } =>#t207;
+  core::Set<core::List<core::int*>*>* set22 = block {
+    final core::Set<core::List<core::int*>*>* #t209 = col::LinkedHashSet::•<core::List<core::int*>*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       for (final core::List<core::int*>* #t210 in <core::List<core::int*>*>[<core::int*>[42]])
-        #t209.{core::List::add}(#t210);
+        #t209.{core::Set::add}{Invariant}(#t210);
+    #t209.{core::Set::add}{Invariant}(null);
   } =>#t209;
-  core::Set<core::List<core::int*>*>* set22 = block {
-    final core::Set<core::List<core::int*>*>* #t211 = col::LinkedHashSet::•<core::List<core::int*>*>();
-    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      for (final core::List<core::int*>* #t212 in <core::List<core::int*>*>[<core::int*>[42]])
-        #t211.{core::Set::add}(#t212);
-    #t211.{core::Set::add}(null);
-  } =>#t211;
   core::Map<core::String*, core::List<core::int*>*>* map22 = block {
-    final core::Map<core::String*, core::List<core::int*>*>* #t213 = <core::String*, core::List<core::int*>*>{};
+    final core::Map<core::String*, core::List<core::int*>*>* #t211 = <core::String*, core::List<core::int*>*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t214 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[42]}.{core::Map::entries})
-        #t213.{core::Map::[]=}(#t214.{core::MapEntry::key}, #t214.{core::MapEntry::value});
-    #t213.{core::Map::[]=}("baz", null);
-  } =>#t213;
+      for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t212 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[42]}.{core::Map::entries})
+        #t211.{core::Map::[]=}{Invariant}(#t212.{core::MapEntry::key}, #t212.{core::MapEntry::value});
+    #t211.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t211;
   core::List<core::int*>* list30 = block {
-    final core::List<core::int*>* #t215 = <core::int*>[];
+    final core::List<core::int*>* #t213 = <core::int*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
+        for (final core::int* #t214 in <core::int*>[42])
+          #t213.{core::List::add}{Invariant}(#t214);
+  } =>#t213;
+  core::Set<core::int*>* set30 = block {
+    final core::Set<core::int*>* #t215 = col::LinkedHashSet::•<core::int*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
         for (final core::int* #t216 in <core::int*>[42])
-          #t215.{core::List::add}(#t216);
+          #t215.{core::Set::add}{Invariant}(#t216);
+    #t215.{core::Set::add}{Invariant}(null);
   } =>#t215;
-  core::Set<core::int*>* set30 = block {
-    final core::Set<core::int*>* #t217 = col::LinkedHashSet::•<core::int*>();
-    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        for (final core::int* #t218 in <core::int*>[42])
-          #t217.{core::Set::add}(#t218);
-    #t217.{core::Set::add}(null);
-  } =>#t217;
   core::Map<core::String*, core::int*>* map30 = block {
-    final core::Map<core::String*, core::int*>* #t219 = <core::String*, core::int*>{};
+    final core::Map<core::String*, core::int*>* #t217 = <core::String*, core::int*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        for (final core::MapEntry<core::String*, core::int*>* #t220 in <core::String*, core::int*>{"bar": 42}.{core::Map::entries})
-          #t219.{core::Map::[]=}(#t220.{core::MapEntry::key}, #t220.{core::MapEntry::value});
-    #t219.{core::Map::[]=}("baz", null);
-  } =>#t219;
+        for (final core::MapEntry<core::String*, core::int*>* #t218 in <core::String*, core::int*>{"bar": 42}.{core::Map::entries})
+          #t217.{core::Map::[]=}{Invariant}(#t218.{core::MapEntry::key}, #t218.{core::MapEntry::value});
+    #t217.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t217;
   core::List<dynamic>* list31 = block {
-    final core::List<dynamic>* #t221 = <dynamic>[];
+    final core::List<dynamic>* #t219 = <dynamic>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
+        for (final dynamic #t220 in <dynamic>[dynVar])
+          #t219.{core::List::add}{Invariant}(#t220);
+  } =>#t219;
+  core::Set<dynamic>* set31 = block {
+    final core::Set<dynamic>* #t221 = col::LinkedHashSet::•<dynamic>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
         for (final dynamic #t222 in <dynamic>[dynVar])
-          #t221.{core::List::add}(#t222);
+          #t221.{core::Set::add}{Invariant}(#t222);
+    #t221.{core::Set::add}{Invariant}(null);
   } =>#t221;
-  core::Set<dynamic>* set31 = block {
-    final core::Set<dynamic>* #t223 = col::LinkedHashSet::•<dynamic>();
-    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        for (final dynamic #t224 in <dynamic>[dynVar])
-          #t223.{core::Set::add}(#t224);
-    #t223.{core::Set::add}(null);
-  } =>#t223;
   core::Map<core::String*, dynamic>* map31 = block {
-    final core::Map<core::String*, dynamic>* #t225 = <core::String*, dynamic>{};
+    final core::Map<core::String*, dynamic>* #t223 = <core::String*, dynamic>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        for (final core::MapEntry<core::String*, dynamic>* #t226 in <core::String*, dynamic>{"bar": dynVar}.{core::Map::entries})
-          #t225.{core::Map::[]=}(#t226.{core::MapEntry::key}, #t226.{core::MapEntry::value});
-    #t225.{core::Map::[]=}("baz", null);
-  } =>#t225;
+        for (final core::MapEntry<core::String*, dynamic>* #t224 in <core::String*, dynamic>{"bar": dynVar}.{core::Map::entries})
+          #t223.{core::Map::[]=}{Invariant}(#t224.{core::MapEntry::key}, #t224.{core::MapEntry::value});
+    #t223.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t223;
   core::List<core::List<core::int*>*>* list33 = block {
-    final core::List<core::List<core::int*>*>* #t227 = <core::List<core::int*>*>[];
+    final core::List<core::List<core::int*>*>* #t225 = <core::List<core::int*>*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
+        for (final core::List<core::int*>* #t226 in <core::List<core::int*>*>[<core::int*>[42]])
+          #t225.{core::List::add}{Invariant}(#t226);
+  } =>#t225;
+  core::Set<core::List<core::int*>*>* set33 = block {
+    final core::Set<core::List<core::int*>*>* #t227 = col::LinkedHashSet::•<core::List<core::int*>*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
         for (final core::List<core::int*>* #t228 in <core::List<core::int*>*>[<core::int*>[42]])
-          #t227.{core::List::add}(#t228);
+          #t227.{core::Set::add}{Invariant}(#t228);
+    #t227.{core::Set::add}{Invariant}(null);
   } =>#t227;
-  core::Set<core::List<core::int*>*>* set33 = block {
-    final core::Set<core::List<core::int*>*>* #t229 = col::LinkedHashSet::•<core::List<core::int*>*>();
-    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        for (final core::List<core::int*>* #t230 in <core::List<core::int*>*>[<core::int*>[42]])
-          #t229.{core::Set::add}(#t230);
-    #t229.{core::Set::add}(null);
-  } =>#t229;
   core::Map<core::String*, core::List<core::int*>*>* map33 = block {
-    final core::Map<core::String*, core::List<core::int*>*>* #t231 = <core::String*, core::List<core::int*>*>{};
+    final core::Map<core::String*, core::List<core::int*>*>* #t229 = <core::String*, core::List<core::int*>*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t232 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[42]}.{core::Map::entries})
-          #t231.{core::Map::[]=}(#t232.{core::MapEntry::key}, #t232.{core::MapEntry::value});
-    #t231.{core::Map::[]=}("baz", null);
-  } =>#t231;
+        for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t230 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[42]}.{core::Map::entries})
+          #t229.{core::Map::[]=}{Invariant}(#t230.{core::MapEntry::key}, #t230.{core::MapEntry::value});
+    #t229.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t229;
   core::List<core::List<core::int*>*>* list40 = block {
-    final core::List<core::List<core::int*>*>* #t233 = <core::List<core::int*>*>[];
+    final core::List<core::List<core::int*>*>* #t231 = <core::List<core::int*>*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
+      for (final core::List<core::int*>* #t232 in <core::List<core::int*>*>[<core::int*>[]])
+        #t231.{core::List::add}{Invariant}(#t232);
+  } =>#t231;
+  core::Set<core::List<core::int*>*>* set40 = block {
+    final core::Set<core::List<core::int*>*>* #t233 = col::LinkedHashSet::•<core::List<core::int*>*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       for (final core::List<core::int*>* #t234 in <core::List<core::int*>*>[<core::int*>[]])
-        #t233.{core::List::add}(#t234);
+        #t233.{core::Set::add}{Invariant}(#t234);
+    #t233.{core::Set::add}{Invariant}(null);
   } =>#t233;
-  core::Set<core::List<core::int*>*>* set40 = block {
-    final core::Set<core::List<core::int*>*>* #t235 = col::LinkedHashSet::•<core::List<core::int*>*>();
-    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      for (final core::List<core::int*>* #t236 in <core::List<core::int*>*>[<core::int*>[]])
-        #t235.{core::Set::add}(#t236);
-    #t235.{core::Set::add}(null);
-  } =>#t235;
   core::Map<core::String*, core::List<core::int*>*>* map40 = block {
-    final core::Map<core::String*, core::List<core::int*>*>* #t237 = <core::String*, core::List<core::int*>*>{};
+    final core::Map<core::String*, core::List<core::int*>*>* #t235 = <core::String*, core::List<core::int*>*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t238 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[]}.{core::Map::entries})
-        #t237.{core::Map::[]=}(#t238.{core::MapEntry::key}, #t238.{core::MapEntry::value});
-    #t237.{core::Map::[]=}("baz", null);
-  } =>#t237;
+      for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t236 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[]}.{core::Map::entries})
+        #t235.{core::Map::[]=}{Invariant}(#t236.{core::MapEntry::key}, #t236.{core::MapEntry::value});
+    #t235.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t235;
   core::List<core::List<core::int*>*>* list41 = block {
-    final core::List<core::List<core::int*>*>* #t239 = <core::List<core::int*>*>[];
+    final core::List<core::List<core::int*>*>* #t237 = <core::List<core::int*>*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      for (final core::List<core::int*>* #t240 in let final core::Set<core::List<core::int*>*>* #t241 = col::LinkedHashSet::•<core::List<core::int*>*>() in let final dynamic #t242 = #t241.{core::Set::add}(<core::int*>[]) in #t241)
-        #t239.{core::List::add}(#t240);
-  } =>#t239;
+      for (final core::List<core::int*>* #t238 in block {
+        final core::Set<core::List<core::int*>*>* #t239 = col::LinkedHashSet::•<core::List<core::int*>*>();
+        #t239.{core::Set::add}{Invariant}(<core::int*>[]);
+      } =>#t239)
+        #t237.{core::List::add}{Invariant}(#t238);
+  } =>#t237;
   core::Set<core::List<core::int*>*>* set41 = block {
-    final core::Set<core::List<core::int*>*>* #t243 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    final core::Set<core::List<core::int*>*>* #t240 = col::LinkedHashSet::•<core::List<core::int*>*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      for (final core::List<core::int*>* #t244 in let final core::Set<core::List<core::int*>*>* #t245 = col::LinkedHashSet::•<core::List<core::int*>*>() in let final dynamic #t246 = #t245.{core::Set::add}(<core::int*>[]) in #t245)
-        #t243.{core::Set::add}(#t244);
-    #t243.{core::Set::add}(null);
-  } =>#t243;
+      for (final core::List<core::int*>* #t241 in block {
+        final core::Set<core::List<core::int*>*>* #t242 = col::LinkedHashSet::•<core::List<core::int*>*>();
+        #t242.{core::Set::add}{Invariant}(<core::int*>[]);
+      } =>#t242)
+        #t240.{core::Set::add}{Invariant}(#t241);
+    #t240.{core::Set::add}{Invariant}(null);
+  } =>#t240;
   core::List<core::List<core::int*>*>* list42 = block {
-    final core::List<core::List<core::int*>*>* #t247 = <core::List<core::int*>*>[];
+    final core::List<core::List<core::int*>*>* #t243 = <core::List<core::int*>*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        for (final core::List<core::int*>* #t248 in <core::List<core::int*>*>[<core::int*>[]])
-          #t247.{core::List::add}(#t248);
-  } =>#t247;
+        for (final core::List<core::int*>* #t244 in <core::List<core::int*>*>[<core::int*>[]])
+          #t243.{core::List::add}{Invariant}(#t244);
+  } =>#t243;
   core::Set<core::List<core::int*>*>* set42 = block {
-    final core::Set<core::List<core::int*>*>* #t249 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    final core::Set<core::List<core::int*>*>* #t245 = col::LinkedHashSet::•<core::List<core::int*>*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        for (final core::List<core::int*>* #t250 in <core::List<core::int*>*>[<core::int*>[]])
-          #t249.{core::Set::add}(#t250);
-    #t249.{core::Set::add}(null);
-  } =>#t249;
+        for (final core::List<core::int*>* #t246 in <core::List<core::int*>*>[<core::int*>[]])
+          #t245.{core::Set::add}{Invariant}(#t246);
+    #t245.{core::Set::add}{Invariant}(null);
+  } =>#t245;
   core::Map<core::String*, core::List<core::int*>*>* map42 = block {
-    final core::Map<core::String*, core::List<core::int*>*>* #t251 = <core::String*, core::List<core::int*>*>{};
+    final core::Map<core::String*, core::List<core::int*>*>* #t247 = <core::String*, core::List<core::int*>*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t252 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[]}.{core::Map::entries})
-          #t251.{core::Map::[]=}(#t252.{core::MapEntry::key}, #t252.{core::MapEntry::value});
-    #t251.{core::Map::[]=}("baz", null);
-  } =>#t251;
+        for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t248 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[]}.{core::Map::entries})
+          #t247.{core::Map::[]=}{Invariant}(#t248.{core::MapEntry::key}, #t248.{core::MapEntry::value});
+    #t247.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t247;
   core::List<core::int*>* list50 = block {
-    final core::List<core::int*>* #t253 = <core::int*>[];
+    final core::List<core::int*>* #t249 = <core::int*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      for (final core::int* #t254 in <core::int*>[])
-        #t253.{core::List::add}(#t254);
-  } =>#t253;
+      for (final core::int* #t250 in <core::int*>[])
+        #t249.{core::List::add}{Invariant}(#t250);
+  } =>#t249;
   core::Set<core::int*>* set50 = block {
-    final core::Set<core::int*>* #t255 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t251 = col::LinkedHashSet::•<core::int*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      for (final core::int* #t256 in <core::int*>[])
-        #t255.{core::Set::add}(#t256);
-    #t255.{core::Set::add}(null);
-  } =>#t255;
+      for (final core::int* #t252 in <core::int*>[])
+        #t251.{core::Set::add}{Invariant}(#t252);
+    #t251.{core::Set::add}{Invariant}(null);
+  } =>#t251;
   core::Map<core::String*, core::int*>* map50 = block {
-    final core::Map<core::String*, core::int*>* #t257 = <core::String*, core::int*>{};
+    final core::Map<core::String*, core::int*>* #t253 = <core::String*, core::int*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      for (final core::MapEntry<core::String*, core::int*>* #t258 in <core::String*, core::int*>{}.{core::Map::entries})
-        #t257.{core::Map::[]=}(#t258.{core::MapEntry::key}, #t258.{core::MapEntry::value});
-    #t257.{core::Map::[]=}("baz", null);
-  } =>#t257;
+      for (final core::MapEntry<core::String*, core::int*>* #t254 in <core::String*, core::int*>{}.{core::Map::entries})
+        #t253.{core::Map::[]=}{Invariant}(#t254.{core::MapEntry::key}, #t254.{core::MapEntry::value});
+    #t253.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t253;
   core::List<core::int*>* list51 = block {
-    final core::List<core::int*>* #t259 = <core::int*>[];
+    final core::List<core::int*>* #t255 = <core::int*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      for (final core::int* #t260 in let final core::Set<core::int*>* #t261 = col::LinkedHashSet::•<core::int*>() in #t261)
-        #t259.{core::List::add}(#t260);
-  } =>#t259;
+      for (final core::int* #t256 in block {
+        final core::Set<core::int*>* #t257 = col::LinkedHashSet::•<core::int*>();
+      } =>#t257)
+        #t255.{core::List::add}{Invariant}(#t256);
+  } =>#t255;
   core::Set<core::int*>* set51 = block {
-    final core::Set<core::int*>* #t262 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t258 = col::LinkedHashSet::•<core::int*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      for (final core::int* #t263 in let final core::Set<core::int*>* #t264 = col::LinkedHashSet::•<core::int*>() in #t264)
-        #t262.{core::Set::add}(#t263);
-    #t262.{core::Set::add}(null);
-  } =>#t262;
+      for (final core::int* #t259 in block {
+        final core::Set<core::int*>* #t260 = col::LinkedHashSet::•<core::int*>();
+      } =>#t260)
+        #t258.{core::Set::add}{Invariant}(#t259);
+    #t258.{core::Set::add}{Invariant}(null);
+  } =>#t258;
   core::List<core::int*>* list52 = block {
-    final core::List<core::int*>* #t265 = <core::int*>[];
+    final core::List<core::int*>* #t261 = <core::int*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        for (final core::int* #t266 in <core::int*>[])
-          #t265.{core::List::add}(#t266);
-  } =>#t265;
+        for (final core::int* #t262 in <core::int*>[])
+          #t261.{core::List::add}{Invariant}(#t262);
+  } =>#t261;
   core::Set<core::int*>* set52 = block {
-    final core::Set<core::int*>* #t267 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t263 = col::LinkedHashSet::•<core::int*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        for (final core::int* #t268 in <core::int*>[])
-          #t267.{core::Set::add}(#t268);
-    #t267.{core::Set::add}(null);
-  } =>#t267;
+        for (final core::int* #t264 in <core::int*>[])
+          #t263.{core::Set::add}{Invariant}(#t264);
+    #t263.{core::Set::add}{Invariant}(null);
+  } =>#t263;
   core::List<core::List<core::int*>*>* list60 = block {
-    final core::List<core::List<core::int*>*>* #t269 = <core::List<core::int*>*>[];
+    final core::List<core::List<core::int*>*>* #t265 = <core::List<core::int*>*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      for (final core::List<core::int*>* #t270 in <core::List<core::int*>*>[<core::int*>[]])
-        #t269.{core::List::add}(#t270);
-  } =>#t269;
+      for (final core::List<core::int*>* #t266 in <core::List<core::int*>*>[<core::int*>[]])
+        #t265.{core::List::add}{Invariant}(#t266);
+  } =>#t265;
   core::Set<core::List<core::int*>*>* set60 = block {
-    final core::Set<core::List<core::int*>*>* #t271 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    final core::Set<core::List<core::int*>*>* #t267 = col::LinkedHashSet::•<core::List<core::int*>*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      for (final core::List<core::int*>* #t272 in <core::List<core::int*>*>[<core::int*>[]])
-        #t271.{core::Set::add}(#t272);
-    #t271.{core::Set::add}(null);
-  } =>#t271;
+      for (final core::List<core::int*>* #t268 in <core::List<core::int*>*>[<core::int*>[]])
+        #t267.{core::Set::add}{Invariant}(#t268);
+    #t267.{core::Set::add}{Invariant}(null);
+  } =>#t267;
   core::Map<core::String*, core::List<core::int*>*>* map60 = block {
-    final core::Map<core::String*, core::List<core::int*>*>* #t273 = <core::String*, core::List<core::int*>*>{};
+    final core::Map<core::String*, core::List<core::int*>*>* #t269 = <core::String*, core::List<core::int*>*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t274 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[]}.{core::Map::entries})
-        #t273.{core::Map::[]=}(#t274.{core::MapEntry::key}, #t274.{core::MapEntry::value});
-    #t273.{core::Map::[]=}("baz", null);
-  } =>#t273;
+      for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t270 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[]}.{core::Map::entries})
+        #t269.{core::Map::[]=}{Invariant}(#t270.{core::MapEntry::key}, #t270.{core::MapEntry::value});
+    #t269.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t269;
   core::List<core::List<core::int*>*>* list61 = block {
-    final core::List<core::List<core::int*>*>* #t275 = <core::List<core::int*>*>[];
+    final core::List<core::List<core::int*>*>* #t271 = <core::List<core::int*>*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        for (final core::List<core::int*>* #t276 in <core::List<core::int*>*>[<core::int*>[]])
-          #t275.{core::List::add}(#t276);
-  } =>#t275;
+        for (final core::List<core::int*>* #t272 in <core::List<core::int*>*>[<core::int*>[]])
+          #t271.{core::List::add}{Invariant}(#t272);
+  } =>#t271;
   core::Set<core::List<core::int*>*>* set61 = block {
-    final core::Set<core::List<core::int*>*>* #t277 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    final core::Set<core::List<core::int*>*>* #t273 = col::LinkedHashSet::•<core::List<core::int*>*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        for (final core::List<core::int*>* #t278 in <core::List<core::int*>*>[<core::int*>[]])
-          #t277.{core::Set::add}(#t278);
-    #t277.{core::Set::add}(null);
-  } =>#t277;
+        for (final core::List<core::int*>* #t274 in <core::List<core::int*>*>[<core::int*>[]])
+          #t273.{core::Set::add}{Invariant}(#t274);
+    #t273.{core::Set::add}{Invariant}(null);
+  } =>#t273;
   core::Map<core::String*, core::List<core::int*>*>* map61 = block {
+    final core::Map<core::String*, core::List<core::int*>*>* #t275 = <core::String*, core::List<core::int*>*>{};
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
+        for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t276 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[]}.{core::Map::entries})
+          #t275.{core::Map::[]=}{Invariant}(#t276.{core::MapEntry::key}, #t276.{core::MapEntry::value});
+    #t275.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t275;
+  core::List<core::List<core::int*>*>* list70 = block {
+    final core::List<core::List<core::int*>*>* #t277 = <core::List<core::int*>*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
+      #t277.{core::List::add}{Invariant}(<core::int*>[]);
+  } =>#t277;
+  core::Set<core::List<core::int*>*>* set70 = block {
+    final core::Set<core::List<core::int*>*>* #t278 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
+      #t278.{core::Set::add}{Invariant}(<core::int*>[]);
+    #t278.{core::Set::add}{Invariant}(null);
+  } =>#t278;
+  core::Map<core::String*, core::List<core::int*>*>* map70 = block {
     final core::Map<core::String*, core::List<core::int*>*>* #t279 = <core::String*, core::List<core::int*>*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t280 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[]}.{core::Map::entries})
-          #t279.{core::Map::[]=}(#t280.{core::MapEntry::key}, #t280.{core::MapEntry::value});
-    #t279.{core::Map::[]=}("baz", null);
+      #t279.{core::Map::[]=}{Invariant}("bar", <core::int*>[]);
+    #t279.{core::Map::[]=}{Invariant}("baz", null);
   } =>#t279;
-  core::List<core::List<core::int*>*>* list70 = block {
-    final core::List<core::List<core::int*>*>* #t281 = <core::List<core::int*>*>[];
-    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      #t281.{core::List::add}(<core::int*>[]);
-  } =>#t281;
-  core::Set<core::List<core::int*>*>* set70 = block {
-    final core::Set<core::List<core::int*>*>* #t282 = col::LinkedHashSet::•<core::List<core::int*>*>();
-    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      #t282.{core::Set::add}(<core::int*>[]);
-    #t282.{core::Set::add}(null);
-  } =>#t282;
-  core::Map<core::String*, core::List<core::int*>*>* map70 = block {
-    final core::Map<core::String*, core::List<core::int*>*>* #t283 = <core::String*, core::List<core::int*>*>{};
-    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      #t283.{core::Map::[]=}("bar", <core::int*>[]);
-    #t283.{core::Map::[]=}("baz", null);
-  } =>#t283;
   core::List<core::List<core::int*>*>* list71 = block {
-    final core::List<core::List<core::int*>*>* #t284 = <core::List<core::int*>*>[];
+    final core::List<core::List<core::int*>*>* #t280 = <core::List<core::int*>*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t284.{core::List::add}(<core::int*>[]);
-  } =>#t284;
+        #t280.{core::List::add}{Invariant}(<core::int*>[]);
+  } =>#t280;
   core::Set<core::List<core::int*>*>* set71 = block {
-    final core::Set<core::List<core::int*>*>* #t285 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    final core::Set<core::List<core::int*>*>* #t281 = col::LinkedHashSet::•<core::List<core::int*>*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t285.{core::Set::add}(<core::int*>[]);
-    #t285.{core::Set::add}(null);
-  } =>#t285;
+        #t281.{core::Set::add}{Invariant}(<core::int*>[]);
+    #t281.{core::Set::add}{Invariant}(null);
+  } =>#t281;
   core::Map<core::String*, core::List<core::int*>*>* map71 = block {
-    final core::Map<core::String*, core::List<core::int*>*>* #t286 = <core::String*, core::List<core::int*>*>{};
+    final core::Map<core::String*, core::List<core::int*>*>* #t282 = <core::String*, core::List<core::int*>*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t286.{core::Map::[]=}("bar", <core::int*>[]);
-    #t286.{core::Map::[]=}("baz", null);
-  } =>#t286;
+        #t282.{core::Map::[]=}{Invariant}("bar", <core::int*>[]);
+    #t282.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t282;
   core::List<core::num*>* list80 = block {
-    final core::List<core::num*>* #t287 = <core::num*>[];
+    final core::List<core::num*>* #t283 = <core::num*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t287.{core::List::add}(42);
+        #t283.{core::List::add}{Invariant}(42);
       else
-        #t287.{core::List::add}(3.14);
-  } =>#t287;
+        #t283.{core::List::add}{Invariant}(3.14);
+  } =>#t283;
   core::Set<core::num*>* set80 = block {
-    final core::Set<core::num*>* #t288 = col::LinkedHashSet::•<core::num*>();
+    final core::Set<core::num*>* #t284 = col::LinkedHashSet::•<core::num*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t288.{core::Set::add}(42);
+        #t284.{core::Set::add}{Invariant}(42);
       else
-        #t288.{core::Set::add}(3.14);
-    #t288.{core::Set::add}(null);
-  } =>#t288;
+        #t284.{core::Set::add}{Invariant}(3.14);
+    #t284.{core::Set::add}{Invariant}(null);
+  } =>#t284;
   core::Map<core::String*, core::num*>* map80 = block {
-    final core::Map<core::String*, core::num*>* #t289 = <core::String*, core::num*>{};
+    final core::Map<core::String*, core::num*>* #t285 = <core::String*, core::num*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t289.{core::Map::[]=}("bar", 42);
+        #t285.{core::Map::[]=}{Invariant}("bar", 42);
       else
-        #t289.{core::Map::[]=}("bar", 3.14);
-    #t289.{core::Map::[]=}("baz", null);
-  } =>#t289;
+        #t285.{core::Map::[]=}{Invariant}("bar", 3.14);
+    #t285.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t285;
   core::List<core::num*>* list81 = block {
-    final core::List<core::num*>* #t290 = <core::num*>[];
+    final core::List<core::num*>* #t286 = <core::num*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        for (final core::num* #t291 in listInt)
-          #t290.{core::List::add}(#t291);
+        for (final core::num* #t287 in listInt)
+          #t286.{core::List::add}{Invariant}(#t287);
       else
-        for (final core::num* #t292 in listDouble)
-          #t290.{core::List::add}(#t292);
-  } =>#t290;
+        for (final core::num* #t288 in listDouble)
+          #t286.{core::List::add}{Invariant}(#t288);
+  } =>#t286;
   core::Set<core::num*>* set81 = block {
-    final core::Set<core::num*>* #t293 = col::LinkedHashSet::•<core::num*>();
+    final core::Set<core::num*>* #t289 = col::LinkedHashSet::•<core::num*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        for (final core::num* #t294 in listInt)
-          #t293.{core::Set::add}(#t294);
+        for (final core::num* #t290 in listInt)
+          #t289.{core::Set::add}{Invariant}(#t290);
       else
-        for (final core::num* #t295 in listDouble)
-          #t293.{core::Set::add}(#t295);
-    #t293.{core::Set::add}(null);
-  } =>#t293;
+        for (final core::num* #t291 in listDouble)
+          #t289.{core::Set::add}{Invariant}(#t291);
+    #t289.{core::Set::add}{Invariant}(null);
+  } =>#t289;
   core::Map<core::String*, core::num*>* map81 = block {
-    final core::Map<core::String*, core::num*>* #t296 = <core::String*, core::num*>{};
+    final core::Map<core::String*, core::num*>* #t292 = <core::String*, core::num*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        for (final core::MapEntry<core::String*, core::num*>* #t297 in mapStringInt.{core::Map::entries})
-          #t296.{core::Map::[]=}(#t297.{core::MapEntry::key}, #t297.{core::MapEntry::value});
+        for (final core::MapEntry<core::String*, core::num*>* #t293 in mapStringInt.{core::Map::entries})
+          #t292.{core::Map::[]=}{Invariant}(#t293.{core::MapEntry::key}, #t293.{core::MapEntry::value});
       else
-        for (final core::MapEntry<core::String*, core::num*>* #t298 in mapStringDouble.{core::Map::entries})
-          #t296.{core::Map::[]=}(#t298.{core::MapEntry::key}, #t298.{core::MapEntry::value});
-    #t296.{core::Map::[]=}("baz", null);
-  } =>#t296;
+        for (final core::MapEntry<core::String*, core::num*>* #t294 in mapStringDouble.{core::Map::entries})
+          #t292.{core::Map::[]=}{Invariant}(#t294.{core::MapEntry::key}, #t294.{core::MapEntry::value});
+    #t292.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t292;
   core::List<dynamic>* list82 = block {
-    final core::List<dynamic>* #t299 = <dynamic>[];
+    final core::List<dynamic>* #t295 = <dynamic>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        for (final dynamic #t300 in listInt)
-          #t299.{core::List::add}(#t300);
+        for (final dynamic #t296 in listInt)
+          #t295.{core::List::add}{Invariant}(#t296);
       else
-        for (final dynamic #t301 in dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*)
-          #t299.{core::List::add}(#t301);
-  } =>#t299;
+        for (final dynamic #t297 in dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*)
+          #t295.{core::List::add}{Invariant}(#t297);
+  } =>#t295;
   core::Set<dynamic>* set82 = block {
-    final core::Set<dynamic>* #t302 = col::LinkedHashSet::•<dynamic>();
+    final core::Set<dynamic>* #t298 = col::LinkedHashSet::•<dynamic>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        for (final dynamic #t303 in listInt)
-          #t302.{core::Set::add}(#t303);
+        for (final dynamic #t299 in listInt)
+          #t298.{core::Set::add}{Invariant}(#t299);
       else
-        for (final dynamic #t304 in dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*)
-          #t302.{core::Set::add}(#t304);
-    #t302.{core::Set::add}(null);
-  } =>#t302;
+        for (final dynamic #t300 in dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*)
+          #t298.{core::Set::add}{Invariant}(#t300);
+    #t298.{core::Set::add}{Invariant}(null);
+  } =>#t298;
   core::Map<dynamic, dynamic>* map82 = block {
-    final core::Map<dynamic, dynamic>* #t305 = <dynamic, dynamic>{};
+    final core::Map<dynamic, dynamic>* #t301 = <dynamic, dynamic>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        for (final core::MapEntry<dynamic, dynamic>* #t306 in mapStringInt.{core::Map::entries})
-          #t305.{core::Map::[]=}(#t306.{core::MapEntry::key}, #t306.{core::MapEntry::value});
+        for (final core::MapEntry<dynamic, dynamic>* #t302 in mapStringInt.{core::Map::entries})
+          #t301.{core::Map::[]=}{Invariant}(#t302.{core::MapEntry::key}, #t302.{core::MapEntry::value});
       else
-        for (final core::MapEntry<dynamic, dynamic>* #t307 in (dynVar as{TypeError,ForDynamic} core::Map<dynamic, dynamic>*).{core::Map::entries})
-          #t305.{core::Map::[]=}(#t307.{core::MapEntry::key}, #t307.{core::MapEntry::value});
-    #t305.{core::Map::[]=}("baz", null);
-  } =>#t305;
+        for (final core::MapEntry<dynamic, dynamic>* #t303 in (dynVar as{TypeError,ForDynamic} core::Map<dynamic, dynamic>*).{core::Map::entries})
+          #t301.{core::Map::[]=}{Invariant}(#t303.{core::MapEntry::key}, #t303.{core::MapEntry::value});
+    #t301.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t301;
   core::List<core::num*>* list83 = block {
-    final core::List<core::num*>* #t308 = <core::num*>[];
+    final core::List<core::num*>* #t304 = <core::num*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t308.{core::List::add}(42);
+        #t304.{core::List::add}{Invariant}(42);
       else
-        for (final core::num* #t309 in listDouble)
-          #t308.{core::List::add}(#t309);
-  } =>#t308;
+        for (final core::num* #t305 in listDouble)
+          #t304.{core::List::add}{Invariant}(#t305);
+  } =>#t304;
   core::Set<core::num*>* set83 = block {
-    final core::Set<core::num*>* #t310 = col::LinkedHashSet::•<core::num*>();
+    final core::Set<core::num*>* #t306 = col::LinkedHashSet::•<core::num*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        for (final core::num* #t311 in listInt)
-          #t310.{core::Set::add}(#t311);
+        for (final core::num* #t307 in listInt)
+          #t306.{core::Set::add}{Invariant}(#t307);
       else
-        #t310.{core::Set::add}(3.14);
-    #t310.{core::Set::add}(null);
-  } =>#t310;
+        #t306.{core::Set::add}{Invariant}(3.14);
+    #t306.{core::Set::add}{Invariant}(null);
+  } =>#t306;
   core::Map<core::String*, core::num*>* map83 = block {
-    final core::Map<core::String*, core::num*>* #t312 = <core::String*, core::num*>{};
+    final core::Map<core::String*, core::num*>* #t308 = <core::String*, core::num*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        for (final core::MapEntry<core::String*, core::num*>* #t313 in mapStringInt.{core::Map::entries})
-          #t312.{core::Map::[]=}(#t313.{core::MapEntry::key}, #t313.{core::MapEntry::value});
+        for (final core::MapEntry<core::String*, core::num*>* #t309 in mapStringInt.{core::Map::entries})
+          #t308.{core::Map::[]=}{Invariant}(#t309.{core::MapEntry::key}, #t309.{core::MapEntry::value});
       else
-        #t312.{core::Map::[]=}("bar", 3.14);
-    #t312.{core::Map::[]=}("baz", null);
-  } =>#t312;
+        #t308.{core::Map::[]=}{Invariant}("bar", 3.14);
+    #t308.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t308;
   core::List<core::int*>* list90 = block {
-    final core::List<core::int*>* #t314 = <core::int*>[];
+    final core::List<core::int*>* #t310 = <core::int*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      #t314.{core::List::add}(dynVar as{TypeError,ForDynamic} core::int*);
-  } =>#t314;
+      #t310.{core::List::add}{Invariant}(dynVar as{TypeError,ForDynamic} core::int*);
+  } =>#t310;
   core::Set<core::int*>* set90 = block {
-    final core::Set<core::int*>* #t315 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t311 = col::LinkedHashSet::•<core::int*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      #t315.{core::Set::add}(dynVar as{TypeError,ForDynamic} core::int*);
-    #t315.{core::Set::add}(null);
-  } =>#t315;
+      #t311.{core::Set::add}{Invariant}(dynVar as{TypeError,ForDynamic} core::int*);
+    #t311.{core::Set::add}{Invariant}(null);
+  } =>#t311;
   core::Map<core::String*, core::int*>* map90 = block {
-    final core::Map<core::String*, core::int*>* #t316 = <core::String*, core::int*>{};
+    final core::Map<core::String*, core::int*>* #t312 = <core::String*, core::int*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      #t316.{core::Map::[]=}("bar", dynVar as{TypeError,ForDynamic} core::int*);
-    #t316.{core::Map::[]=}("baz", null);
-  } =>#t316;
+      #t312.{core::Map::[]=}{Invariant}("bar", dynVar as{TypeError,ForDynamic} core::int*);
+    #t312.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t312;
   core::List<core::int*>* list91 = block {
-    final core::List<core::int*>* #t317 = <core::int*>[];
+    final core::List<core::int*>* #t313 = <core::int*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      for (final dynamic #t318 in dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*) {
-        final core::int* #t319 = #t318 as{TypeError} core::int*;
-        #t317.{core::List::add}(#t319);
+      for (final dynamic #t314 in dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*) {
+        final core::int* #t315 = #t314 as{TypeError} core::int*;
+        #t313.{core::List::add}{Invariant}(#t315);
       }
-  } =>#t317;
+  } =>#t313;
   core::Set<core::int*>* set91 = block {
-    final core::Set<core::int*>* #t320 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t316 = col::LinkedHashSet::•<core::int*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      for (final dynamic #t321 in dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*) {
-        final core::int* #t322 = #t321 as{TypeError} core::int*;
-        #t320.{core::Set::add}(#t322);
+      for (final dynamic #t317 in dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*) {
+        final core::int* #t318 = #t317 as{TypeError} core::int*;
+        #t316.{core::Set::add}{Invariant}(#t318);
       }
-    #t320.{core::Set::add}(null);
-  } =>#t320;
+    #t316.{core::Set::add}{Invariant}(null);
+  } =>#t316;
   core::Map<core::String*, core::int*>* map91 = block {
-    final core::Map<core::String*, core::int*>* #t323 = <core::String*, core::int*>{};
+    final core::Map<core::String*, core::int*>* #t319 = <core::String*, core::int*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      for (final core::MapEntry<dynamic, dynamic>* #t324 in (dynVar as{TypeError,ForDynamic} core::Map<dynamic, dynamic>*).{core::Map::entries}) {
-        final core::String* #t325 = #t324.{core::MapEntry::key} as{TypeError} core::String*;
-        final core::int* #t326 = #t324.{core::MapEntry::value} as{TypeError} core::int*;
-        #t323.{core::Map::[]=}(#t325, #t326);
+      for (final core::MapEntry<dynamic, dynamic>* #t320 in (dynVar as{TypeError,ForDynamic} core::Map<dynamic, dynamic>*).{core::Map::entries}) {
+        final core::String* #t321 = #t320.{core::MapEntry::key} as{TypeError} core::String*;
+        final core::int* #t322 = #t320.{core::MapEntry::value} as{TypeError} core::int*;
+        #t319.{core::Map::[]=}{Invariant}(#t321, #t322);
       }
-    #t323.{core::Map::[]=}("baz", null);
-  } =>#t323;
+    #t319.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t319;
   core::List<core::int*>* list100 = block {
-    final core::List<core::int*>* #t327 = <core::int*>[];
-    for (final core::int* #t328 = index = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; index = index.{core::num::+}(1))
-      #t327.{core::List::add}(42);
-  } =>#t327;
+    final core::List<core::int*>* #t323 = <core::int*>[];
+    for (final core::int* #t324 = index = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; index = index.{core::num::+}(1))
+      #t323.{core::List::add}{Invariant}(42);
+  } =>#t323;
   core::Set<core::int*>* set100 = block {
-    final core::Set<core::int*>* #t329 = col::LinkedHashSet::•<core::int*>();
-    for (final core::int* #t330 = index = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; index = index.{core::num::+}(1))
-      #t329.{core::Set::add}(42);
-  } =>#t329;
+    final core::Set<core::int*>* #t325 = col::LinkedHashSet::•<core::int*>();
+    for (final core::int* #t326 = index = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; index = index.{core::num::+}(1))
+      #t325.{core::Set::add}{Invariant}(42);
+  } =>#t325;
   core::Map<core::String*, core::int*>* map100 = block {
-    final core::Map<core::String*, core::int*>* #t331 = <core::String*, core::int*>{};
-    for (final core::int* #t332 = index = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; index = index.{core::num::+}(1))
-      #t331.{core::Map::[]=}("bar", 42);
-  } =>#t331;
+    final core::Map<core::String*, core::int*>* #t327 = <core::String*, core::int*>{};
+    for (final core::int* #t328 = index = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; index = index.{core::num::+}(1))
+      #t327.{core::Map::[]=}{Invariant}("bar", 42);
+  } =>#t327;
   core::List<core::int*>* list110 = block {
-    final core::List<core::int*>* #t333 = <core::int*>[];
+    final core::List<core::int*>* #t329 = <core::int*>[];
     for (core::int* i in <core::int*>[1, 2, 3])
-      #t333.{core::List::add}(i);
-  } =>#t333;
+      #t329.{core::List::add}{Invariant}(i);
+  } =>#t329;
   core::Set<core::int*>* set110 = block {
-    final core::Set<core::int*>* #t334 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t330 = col::LinkedHashSet::•<core::int*>();
     for (core::int* i in <core::int*>[1, 2, 3])
-      #t334.{core::Set::add}(i);
-    #t334.{core::Set::add}(null);
-  } =>#t334;
+      #t330.{core::Set::add}{Invariant}(i);
+    #t330.{core::Set::add}{Invariant}(null);
+  } =>#t330;
   core::Map<core::String*, core::int*>* map110 = block {
-    final core::Map<core::String*, core::int*>* #t335 = <core::String*, core::int*>{};
+    final core::Map<core::String*, core::int*>* #t331 = <core::String*, core::int*>{};
     for (core::int* i in <core::int*>[1, 2, 3])
-      #t335.{core::Map::[]=}("bar", i);
-    #t335.{core::Map::[]=}("baz", null);
-  } =>#t335;
+      #t331.{core::Map::[]=}{Invariant}("bar", i);
+    #t331.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t331;
   core::List<core::int*>* list120 = block {
-    final core::List<core::int*>* #t336 = <core::int*>[];
+    final core::List<core::int*>* #t332 = <core::int*>[];
     for (dynamic i in dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*)
-      #t336.{core::List::add}(i as{TypeError,ForDynamic} core::int*);
-  } =>#t336;
+      #t332.{core::List::add}{Invariant}(i as{TypeError,ForDynamic} core::int*);
+  } =>#t332;
   core::Set<core::int*>* set120 = block {
-    final core::Set<core::int*>* #t337 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t333 = col::LinkedHashSet::•<core::int*>();
     for (dynamic i in dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*)
-      #t337.{core::Set::add}(i as{TypeError,ForDynamic} core::int*);
-    #t337.{core::Set::add}(null);
-  } =>#t337;
+      #t333.{core::Set::add}{Invariant}(i as{TypeError,ForDynamic} core::int*);
+    #t333.{core::Set::add}{Invariant}(null);
+  } =>#t333;
   core::Map<core::String*, core::int*>* map120 = block {
-    final core::Map<core::String*, core::int*>* #t338 = <core::String*, core::int*>{};
+    final core::Map<core::String*, core::int*>* #t334 = <core::String*, core::int*>{};
     for (dynamic i in dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*)
-      #t338.{core::Map::[]=}("bar", i as{TypeError,ForDynamic} core::int*);
-    #t338.{core::Map::[]=}("baz", null);
-  } =>#t338;
+      #t334.{core::Map::[]=}{Invariant}("bar", i as{TypeError,ForDynamic} core::int*);
+    #t334.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t334;
   core::List<core::int*>* list130 = block {
-    final core::List<core::int*>* #t339 = <core::int*>[];
+    final core::List<core::int*>* #t335 = <core::int*>[];
     for (core::int* i = 1; i.{core::num::<}(2); i = i.{core::num::+}(1))
-      #t339.{core::List::add}(i);
-  } =>#t339;
+      #t335.{core::List::add}{Invariant}(i);
+  } =>#t335;
   core::Set<core::int*>* set130 = block {
-    final core::Set<core::int*>* #t340 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t336 = col::LinkedHashSet::•<core::int*>();
     for (core::int* i = 1; i.{core::num::<}(2); i = i.{core::num::+}(1))
-      #t340.{core::Set::add}(i);
-  } =>#t340;
+      #t336.{core::Set::add}{Invariant}(i);
+  } =>#t336;
   core::Map<core::int*, core::int*>* map130 = block {
-    final core::Map<core::int*, core::int*>* #t341 = <core::int*, core::int*>{};
+    final core::Map<core::int*, core::int*>* #t337 = <core::int*, core::int*>{};
     for (core::int* i = 1; i.{core::num::<}(2); i = i.{core::num::+}(1))
-      #t341.{core::Map::[]=}(i, i);
-  } =>#t341;
+      #t337.{core::Map::[]=}{Invariant}(i, i);
+  } =>#t337;
 }
 static method testForElementErrors(core::Map<core::int*, core::int*>* map, core::List<core::int*>* list) → dynamic async {
   block {
-    final core::List<core::int*>* #t342 = <core::int*>[];
+    final core::List<core::int*>* #t338 = <core::int*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      #t342.{core::List::add}(let final<BottomType> #t343 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:210:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+      #t338.{core::List::add}{Invariant}(let final<BottomType> #t339 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:210:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int>[for (int i = 0; oracle(\"foo\"); i++) \"bar\"];
                                             ^" in "bar" as{TypeError} core::int*);
-  } =>#t342;
+  } =>#t338;
   block {
-    final core::Set<core::int*>* #t344 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t340 = col::LinkedHashSet::•<core::int*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      #t344.{core::Set::add}(let final<BottomType> #t345 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:211:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+      #t340.{core::Set::add}{Invariant}(let final<BottomType> #t341 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:211:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int>{for (int i = 0; oracle(\"foo\"); i++) \"bar\", null};
                                             ^" in "bar" as{TypeError} core::int*);
-    #t344.{core::Set::add}(null);
-  } =>#t344;
+    #t340.{core::Set::add}{Invariant}(null);
+  } =>#t340;
   block {
-    final core::Map<core::int*, core::int*>* #t346 = <core::int*, core::int*>{};
+    final core::Map<core::int*, core::int*>* #t342 = <core::int*, core::int*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      #t346.{core::Map::[]=}(let final<BottomType> #t347 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:212:50: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+      #t342.{core::Map::[]=}{Invariant}(let final<BottomType> #t343 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:212:50: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int, int>{for (int i = 0; oracle(\"foo\"); i++) \"bar\": \"bar\", \"baz\": null};
-                                                 ^" in "bar" as{TypeError} core::int*, let final<BottomType> #t348 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:212:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+                                                 ^" in "bar" as{TypeError} core::int*, let final<BottomType> #t344 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:212:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int, int>{for (int i = 0; oracle(\"foo\"); i++) \"bar\": \"bar\", \"baz\": null};
                                                         ^" in "bar" as{TypeError} core::int*);
-    #t346.{core::Map::[]=}(let final<BottomType> #t349 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:212:64: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+    #t342.{core::Map::[]=}{Invariant}(let final<BottomType> #t345 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:212:64: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int, int>{for (int i = 0; oracle(\"foo\"); i++) \"bar\": \"bar\", \"baz\": null};
                                                                ^" in "baz" as{TypeError} core::int*, null);
-  } =>#t346;
+  } =>#t342;
   block {
-    final core::List<core::int*>* #t350 = <core::int*>[];
+    final core::List<core::int*>* #t346 = <core::int*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      for (final core::int* #t351 in <core::int*>[let final<BottomType> #t352 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:213:49: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+      for (final core::int* #t347 in <core::int*>[let final<BottomType> #t348 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:213:49: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int>[for (int i = 0; oracle(\"foo\"); i++) ...[\"bar\"]];
                                                 ^" in "bar" as{TypeError} core::int*])
-        #t350.{core::List::add}(#t351);
-  } =>#t350;
+        #t346.{core::List::add}{Invariant}(#t347);
+  } =>#t346;
   block {
-    final core::Set<core::int*>* #t353 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t349 = col::LinkedHashSet::•<core::int*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      for (final core::int* #t354 in <core::int*>[let final<BottomType> #t355 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:214:49: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+      for (final core::int* #t350 in <core::int*>[let final<BottomType> #t351 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:214:49: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int>{for (int i = 0; oracle(\"foo\"); i++) ...[\"bar\"], null};
                                                 ^" in "bar" as{TypeError} core::int*])
-        #t353.{core::Set::add}(#t354);
-    #t353.{core::Set::add}(null);
-  } =>#t353;
+        #t349.{core::Set::add}{Invariant}(#t350);
+    #t349.{core::Set::add}{Invariant}(null);
+  } =>#t349;
   block {
-    final core::Map<core::int*, core::int*>* #t356 = <core::int*, core::int*>{};
+    final core::Map<core::int*, core::int*>* #t352 = <core::int*, core::int*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      for (final core::MapEntry<core::int*, core::int*>* #t357 in <core::int*, core::int*>{let final<BottomType> #t358 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:215:54: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+      for (final core::MapEntry<core::int*, core::int*>* #t353 in <core::int*, core::int*>{let final<BottomType> #t354 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:215:54: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int, int>{for (int i = 0; oracle(\"foo\"); i++) ...{\"bar\": \"bar\"}, \"baz\": null};
-                                                     ^" in "bar" as{TypeError} core::int*: let final<BottomType> #t359 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:215:61: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+                                                     ^" in "bar" as{TypeError} core::int*: let final<BottomType> #t355 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:215:61: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int, int>{for (int i = 0; oracle(\"foo\"); i++) ...{\"bar\": \"bar\"}, \"baz\": null};
                                                             ^" in "bar" as{TypeError} core::int*}.{core::Map::entries})
-        #t356.{core::Map::[]=}(#t357.{core::MapEntry::key}, #t357.{core::MapEntry::value});
-    #t356.{core::Map::[]=}(let final<BottomType> #t360 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:215:69: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+        #t352.{core::Map::[]=}{Invariant}(#t353.{core::MapEntry::key}, #t353.{core::MapEntry::value});
+    #t352.{core::Map::[]=}{Invariant}(let final<BottomType> #t356 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:215:69: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int, int>{for (int i = 0; oracle(\"foo\"); i++) ...{\"bar\": \"bar\"}, \"baz\": null};
                                                                     ^" in "baz" as{TypeError} core::int*, null);
-  } =>#t356;
+  } =>#t352;
   block {
-    final core::List<core::int*>* #t361 = <core::int*>[];
+    final core::List<core::int*>* #t357 = <core::int*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      #t361.{core::List::add}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:216:48: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+      #t357.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:216:48: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
   <int>[for (int i = 0; oracle(\"foo\"); i++) ...map];
                                                ^");
-  } =>#t361;
+  } =>#t357;
   block {
-    final core::Set<core::int*>* #t362 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t358 = col::LinkedHashSet::•<core::int*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      #t362.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:217:48: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+      #t358.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:217:48: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
   <int>{for (int i = 0; oracle(\"foo\"); i++) ...map, null};
                                                ^");
-    #t362.{core::Set::add}(null);
-  } =>#t362;
+    #t358.{core::Set::add}{Invariant}(null);
+  } =>#t358;
   <core::int*, core::int*>{invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:218:53: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
  - 'List' is from 'dart:core'.
   <int, int>{for (int i = 0; oracle(\"foo\"); i++) ...list, 42: null};
@@ -1900,66 +1920,66 @@
   <int, int>{for (int i = 0; oracle(\"foo\"); i++) ...list, 42: null};
                                                     ^": null};
   block {
-    final core::List<core::String*>* #t363 = <core::String*>[];
+    final core::List<core::String*>* #t359 = <core::String*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t363.{core::List::add}(let final<BottomType> #t364 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:219:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+        #t359.{core::List::add}{Invariant}(let final<BottomType> #t360 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:219:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
   <String>[for (int i = 0; oracle(\"foo\"); i++) if (oracle()) 42 else 3.14];
                                                              ^" in 42 as{TypeError} core::String*);
       else
-        #t363.{core::List::add}(let final<BottomType> #t365 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:219:70: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
+        #t359.{core::List::add}{Invariant}(let final<BottomType> #t361 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:219:70: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
   <String>[for (int i = 0; oracle(\"foo\"); i++) if (oracle()) 42 else 3.14];
                                                                      ^" in 3.14 as{TypeError} core::String*);
-  } =>#t363;
+  } =>#t359;
   block {
-    final core::Set<core::String*>* #t366 = col::LinkedHashSet::•<core::String*>();
+    final core::Set<core::String*>* #t362 = col::LinkedHashSet::•<core::String*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t366.{core::Set::add}(let final<BottomType> #t367 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:220:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+        #t362.{core::Set::add}{Invariant}(let final<BottomType> #t363 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:220:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
   <String>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) 42 else 3.14, null};
                                                              ^" in 42 as{TypeError} core::String*);
       else
-        #t366.{core::Set::add}(let final<BottomType> #t368 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:220:70: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
+        #t362.{core::Set::add}{Invariant}(let final<BottomType> #t364 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:220:70: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
   <String>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) 42 else 3.14, null};
                                                                      ^" in 3.14 as{TypeError} core::String*);
-    #t366.{core::Set::add}(null);
-  } =>#t366;
+    #t362.{core::Set::add}{Invariant}(null);
+  } =>#t362;
   block {
-    final core::Map<core::String*, core::String*>* #t369 = <core::String*, core::String*>{};
+    final core::Map<core::String*, core::String*>* #t365 = <core::String*, core::String*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t369.{core::Map::[]=}("bar", let final<BottomType> #t370 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:221:77: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+        #t365.{core::Map::[]=}{Invariant}("bar", let final<BottomType> #t366 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:221:77: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
   <String, String>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) \"bar\": 42 else \"bar\": 3.14, \"baz\": null};
                                                                             ^" in 42 as{TypeError} core::String*);
       else
-        #t369.{core::Map::[]=}("bar", let final<BottomType> #t371 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:221:92: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
+        #t365.{core::Map::[]=}{Invariant}("bar", let final<BottomType> #t367 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:221:92: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
   <String, String>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) \"bar\": 42 else \"bar\": 3.14, \"baz\": null};
                                                                                            ^" in 3.14 as{TypeError} core::String*);
-    #t369.{core::Map::[]=}("baz", null);
-  } =>#t369;
+    #t365.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t365;
   block {
-    final core::List<core::int*>* #t372 = <core::int*>[];
+    final core::List<core::int*>* #t368 = <core::int*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t372.{core::List::add}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:222:62: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+        #t368.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:222:62: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
   <int>[for (int i = 0; oracle(\"foo\"); i++) if (oracle()) ...map else 42];
                                                              ^");
       else
-        #t372.{core::List::add}(42);
-  } =>#t372;
+        #t368.{core::List::add}{Invariant}(42);
+  } =>#t368;
   block {
-    final core::Set<core::int*>* #t373 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t369 = col::LinkedHashSet::•<core::int*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t373.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:223:62: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+        #t369.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:223:62: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
   <int>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) ...map else 42, null};
                                                              ^");
       else
-        #t373.{core::Set::add}(42);
-    #t373.{core::Set::add}(null);
-  } =>#t373;
+        #t369.{core::Set::add}{Invariant}(42);
+    #t369.{core::Set::add}{Invariant}(null);
+  } =>#t369;
   <core::String*, core::int*>{invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:224:70: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
  - 'List' is from 'dart:core'.
   <String, int>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) ...list else \"bar\": 42, \"baz\": null};
@@ -1968,28 +1988,28 @@
   <String, int>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) ...list else \"bar\": 42, \"baz\": null};
                                                                      ^": null};
   block {
-    final core::List<core::int*>* #t374 = <core::int*>[];
+    final core::List<core::int*>* #t370 = <core::int*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t374.{core::List::add}(42);
+        #t370.{core::List::add}{Invariant}(42);
       else
-        #t374.{core::List::add}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:225:70: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+        #t370.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:225:70: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
   <int>[for (int i = 0; oracle(\"foo\"); i++) if (oracle()) 42 else ...map];
                                                                      ^");
-  } =>#t374;
+  } =>#t370;
   block {
-    final core::Set<core::int*>* #t375 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t371 = col::LinkedHashSet::•<core::int*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t375.{core::Set::add}(42);
+        #t371.{core::Set::add}{Invariant}(42);
       else
-        #t375.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:226:70: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+        #t371.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:226:70: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
   <int>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) 42 else ...map, null};
                                                                      ^");
-    #t375.{core::Set::add}(null);
-  } =>#t375;
+    #t371.{core::Set::add}{Invariant}(null);
+  } =>#t371;
   <core::String*, core::int*>{invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:227:85: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
  - 'List' is from 'dart:core'.
   <String, int>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) \"bar\": 42 else ...list, \"baz\": null};
@@ -1999,218 +2019,218 @@
                                                                                     ^": null};
   final core::int* i = 0;
   block {
-    final core::List<core::int*>* #t376 = <core::int*>[];
-    for (final core::int* #t377 in <core::int*>[1]) {
+    final core::List<core::int*>* #t372 = <core::int*>[];
+    for (final core::int* #t373 in <core::int*>[1]) {
       invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:230:14: Error: Can't assign to the final variable 'i'.
   <int>[for (i in <int>[1]) i];
              ^";
-      #t376.{core::List::add}(i);
+      #t372.{core::List::add}{Invariant}(i);
     }
-  } =>#t376;
+  } =>#t372;
   block {
-    final core::Set<core::int*>* #t378 = col::LinkedHashSet::•<core::int*>();
-    for (final core::int* #t379 in <core::int*>[1]) {
+    final core::Set<core::int*>* #t374 = col::LinkedHashSet::•<core::int*>();
+    for (final core::int* #t375 in <core::int*>[1]) {
       invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:231:14: Error: Can't assign to the final variable 'i'.
   <int>{for (i in <int>[1]) i, null};
              ^";
-      #t378.{core::Set::add}(i);
+      #t374.{core::Set::add}{Invariant}(i);
     }
-    #t378.{core::Set::add}(null);
-  } =>#t378;
+    #t374.{core::Set::add}{Invariant}(null);
+  } =>#t374;
   block {
-    final core::Map<core::String*, core::int*>* #t380 = <core::String*, core::int*>{};
-    for (final core::int* #t381 in <core::int*>[1]) {
+    final core::Map<core::String*, core::int*>* #t376 = <core::String*, core::int*>{};
+    for (final core::int* #t377 in <core::int*>[1]) {
       invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:232:21: Error: Can't assign to the final variable 'i'.
 \t<String, int>{for (i in <int>[1]) \"bar\": i, \"baz\": null};
 \t                   ^";
-      #t380.{core::Map::[]=}("bar", i);
+      #t376.{core::Map::[]=}{Invariant}("bar", i);
     }
-    #t380.{core::Map::[]=}("baz", null);
-  } =>#t380;
+    #t376.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t376;
   core::List<dynamic>* list10 = block {
-    final core::List<dynamic>* #t382 = <dynamic>[];
-    for (dynamic i in let final<BottomType> #t383 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:234:31: Error: The type 'String' used in the 'for' loop must implement 'Iterable<dynamic>'.
+    final core::List<dynamic>* #t378 = <dynamic>[];
+    for (dynamic i in let final<BottomType> #t379 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:234:31: Error: The type 'String' used in the 'for' loop must implement 'Iterable<dynamic>'.
  - 'Iterable' is from 'dart:core'.
   var list10 = [for (var i in \"not iterable\") i];
                               ^" in "not iterable" as{TypeError} core::Iterable<dynamic>*)
-      #t382.{core::List::add}(i);
-  } =>#t382;
+      #t378.{core::List::add}{Invariant}(i);
+  } =>#t378;
   core::Set<dynamic>* set10 = block {
-    final core::Set<dynamic>* #t384 = col::LinkedHashSet::•<dynamic>();
-    for (dynamic i in let final<BottomType> #t385 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:235:30: Error: The type 'String' used in the 'for' loop must implement 'Iterable<dynamic>'.
+    final core::Set<dynamic>* #t380 = col::LinkedHashSet::•<dynamic>();
+    for (dynamic i in let final<BottomType> #t381 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:235:30: Error: The type 'String' used in the 'for' loop must implement 'Iterable<dynamic>'.
  - 'Iterable' is from 'dart:core'.
   var set10 = {for (var i in \"not iterable\") i, null};
                              ^" in "not iterable" as{TypeError} core::Iterable<dynamic>*)
-      #t384.{core::Set::add}(i);
-    #t384.{core::Set::add}(null);
-  } =>#t384;
+      #t380.{core::Set::add}{Invariant}(i);
+    #t380.{core::Set::add}{Invariant}(null);
+  } =>#t380;
   core::Map<core::String*, dynamic>* map10 = block {
-    final core::Map<core::String*, dynamic>* #t386 = <core::String*, dynamic>{};
-    for (dynamic i in let final<BottomType> #t387 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:236:30: Error: The type 'String' used in the 'for' loop must implement 'Iterable<dynamic>'.
+    final core::Map<core::String*, dynamic>* #t382 = <core::String*, dynamic>{};
+    for (dynamic i in let final<BottomType> #t383 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:236:30: Error: The type 'String' used in the 'for' loop must implement 'Iterable<dynamic>'.
  - 'Iterable' is from 'dart:core'.
   var map10 = {for (var i in \"not iterable\") \"bar\": i, \"baz\": null};
                              ^" in "not iterable" as{TypeError} core::Iterable<dynamic>*)
-      #t386.{core::Map::[]=}("bar", i);
-    #t386.{core::Map::[]=}("baz", null);
-  } =>#t386;
+      #t382.{core::Map::[]=}{Invariant}("bar", i);
+    #t382.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t382;
   core::List<core::int*>* list20 = block {
-    final core::List<core::int*>* #t388 = <core::int*>[];
-    for (core::int* i in <core::int*>[let final<BottomType> #t389 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:237:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+    final core::List<core::int*>* #t384 = <core::int*>[];
+    for (core::int* i in <core::int*>[let final<BottomType> #t385 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:237:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   var list20 = [for (int i in [\"not\", \"int\"]) i];
-                               ^" in "not" as{TypeError} core::int*, let final<BottomType> #t390 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:237:39: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+                               ^" in "not" as{TypeError} core::int*, let final<BottomType> #t386 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:237:39: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   var list20 = [for (int i in [\"not\", \"int\"]) i];
                                       ^" in "int" as{TypeError} core::int*])
-      #t388.{core::List::add}(i);
-  } =>#t388;
+      #t384.{core::List::add}{Invariant}(i);
+  } =>#t384;
   core::Set<core::int*>* set20 = block {
-    final core::Set<core::int*>* #t391 = col::LinkedHashSet::•<core::int*>();
-    for (core::int* i in <core::int*>[let final<BottomType> #t392 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:238:31: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+    final core::Set<core::int*>* #t387 = col::LinkedHashSet::•<core::int*>();
+    for (core::int* i in <core::int*>[let final<BottomType> #t388 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:238:31: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   var set20 = {for (int i in [\"not\", \"int\"]) i, null};
-                              ^" in "not" as{TypeError} core::int*, let final<BottomType> #t393 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:238:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+                              ^" in "not" as{TypeError} core::int*, let final<BottomType> #t389 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:238:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   var set20 = {for (int i in [\"not\", \"int\"]) i, null};
                                      ^" in "int" as{TypeError} core::int*])
-      #t391.{core::Set::add}(i);
-    #t391.{core::Set::add}(null);
-  } =>#t391;
+      #t387.{core::Set::add}{Invariant}(i);
+    #t387.{core::Set::add}{Invariant}(null);
+  } =>#t387;
   core::Map<core::String*, core::int*>* map20 = block {
-    final core::Map<core::String*, core::int*>* #t394 = <core::String*, core::int*>{};
-    for (core::int* i in <core::int*>[let final<BottomType> #t395 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:239:31: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+    final core::Map<core::String*, core::int*>* #t390 = <core::String*, core::int*>{};
+    for (core::int* i in <core::int*>[let final<BottomType> #t391 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:239:31: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   var map20 = {for (int i in [\"not\", \"int\"]) \"bar\": i, \"baz\": null};
-                              ^" in "not" as{TypeError} core::int*, let final<BottomType> #t396 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:239:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+                              ^" in "not" as{TypeError} core::int*, let final<BottomType> #t392 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:239:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   var map20 = {for (int i in [\"not\", \"int\"]) \"bar\": i, \"baz\": null};
                                      ^" in "int" as{TypeError} core::int*])
-      #t394.{core::Map::[]=}("bar", i);
-    #t394.{core::Map::[]=}("baz", null);
-  } =>#t394;
+      #t390.{core::Map::[]=}{Invariant}("bar", i);
+    #t390.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t390;
   core::List<dynamic>* list30 = block {
-    final core::List<dynamic>* #t397 = <dynamic>[];
-    await for (dynamic i in let final<BottomType> #t398 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:240:37: Error: The type 'String' used in the 'for' loop must implement 'Stream<dynamic>'.
+    final core::List<dynamic>* #t393 = <dynamic>[];
+    await for (dynamic i in let final<BottomType> #t394 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:240:37: Error: The type 'String' used in the 'for' loop must implement 'Stream<dynamic>'.
  - 'Stream' is from 'dart:async'.
   var list30 = [await for (var i in \"not stream\") i];
                                     ^" in "not stream" as{TypeError} asy::Stream<dynamic>*)
-      #t397.{core::List::add}(i);
-  } =>#t397;
+      #t393.{core::List::add}{Invariant}(i);
+  } =>#t393;
   core::Set<dynamic>* set30 = block {
-    final core::Set<dynamic>* #t399 = col::LinkedHashSet::•<dynamic>();
-    await for (dynamic i in let final<BottomType> #t400 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:241:36: Error: The type 'String' used in the 'for' loop must implement 'Stream<dynamic>'.
+    final core::Set<dynamic>* #t395 = col::LinkedHashSet::•<dynamic>();
+    await for (dynamic i in let final<BottomType> #t396 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:241:36: Error: The type 'String' used in the 'for' loop must implement 'Stream<dynamic>'.
  - 'Stream' is from 'dart:async'.
   var set30 = {await for (var i in \"not stream\") i, null};
                                    ^" in "not stream" as{TypeError} asy::Stream<dynamic>*)
-      #t399.{core::Set::add}(i);
-    #t399.{core::Set::add}(null);
-  } =>#t399;
+      #t395.{core::Set::add}{Invariant}(i);
+    #t395.{core::Set::add}{Invariant}(null);
+  } =>#t395;
   core::Map<core::String*, dynamic>* map30 = block {
-    final core::Map<core::String*, dynamic>* #t401 = <core::String*, dynamic>{};
-    await for (dynamic i in let final<BottomType> #t402 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:242:36: Error: The type 'String' used in the 'for' loop must implement 'Stream<dynamic>'.
+    final core::Map<core::String*, dynamic>* #t397 = <core::String*, dynamic>{};
+    await for (dynamic i in let final<BottomType> #t398 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:242:36: Error: The type 'String' used in the 'for' loop must implement 'Stream<dynamic>'.
  - 'Stream' is from 'dart:async'.
   var map30 = {await for (var i in \"not stream\") \"bar\": i, \"baz\": null};
                                    ^" in "not stream" as{TypeError} asy::Stream<dynamic>*)
-      #t401.{core::Map::[]=}("bar", i);
-    #t401.{core::Map::[]=}("baz", null);
-  } =>#t401;
+      #t397.{core::Map::[]=}{Invariant}("bar", i);
+    #t397.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t397;
   core::List<core::int*>* list40 = block {
-    final core::List<core::int*>* #t403 = <core::int*>[];
-    await for (core::int* i in asy::Stream::fromIterable<core::int*>(<core::int*>[let final<BottomType> #t404 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:243:58: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+    final core::List<core::int*>* #t399 = <core::int*>[];
+    await for (core::int* i in asy::Stream::fromIterable<core::int*>(<core::int*>[let final<BottomType> #t400 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:243:58: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   var list40 = [await for (int i in Stream.fromIterable([\"not\", \"int\"])) i];
-                                                         ^" in "not" as{TypeError} core::int*, let final<BottomType> #t405 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:243:65: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+                                                         ^" in "not" as{TypeError} core::int*, let final<BottomType> #t401 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:243:65: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   var list40 = [await for (int i in Stream.fromIterable([\"not\", \"int\"])) i];
                                                                 ^" in "int" as{TypeError} core::int*]))
-      #t403.{core::List::add}(i);
-  } =>#t403;
+      #t399.{core::List::add}{Invariant}(i);
+  } =>#t399;
   core::Set<core::int*>* set40 = block {
-    final core::Set<core::int*>* #t406 = col::LinkedHashSet::•<core::int*>();
-    await for (core::int* i in asy::Stream::fromIterable<core::int*>(<core::int*>[let final<BottomType> #t407 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:244:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+    final core::Set<core::int*>* #t402 = col::LinkedHashSet::•<core::int*>();
+    await for (core::int* i in asy::Stream::fromIterable<core::int*>(<core::int*>[let final<BottomType> #t403 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:244:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   var set40 = {await for (int i in Stream.fromIterable([\"not\", \"int\"])) i, null};
-                                                        ^" in "not" as{TypeError} core::int*, let final<BottomType> #t408 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:244:64: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+                                                        ^" in "not" as{TypeError} core::int*, let final<BottomType> #t404 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:244:64: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   var set40 = {await for (int i in Stream.fromIterable([\"not\", \"int\"])) i, null};
                                                                ^" in "int" as{TypeError} core::int*]))
-      #t406.{core::Set::add}(i);
-    #t406.{core::Set::add}(null);
-  } =>#t406;
+      #t402.{core::Set::add}{Invariant}(i);
+    #t402.{core::Set::add}{Invariant}(null);
+  } =>#t402;
   core::Map<core::String*, core::int*>* map40 = block {
-    final core::Map<core::String*, core::int*>* #t409 = <core::String*, core::int*>{};
-    await for (core::int* i in asy::Stream::fromIterable<core::int*>(<core::int*>[let final<BottomType> #t410 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:245:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+    final core::Map<core::String*, core::int*>* #t405 = <core::String*, core::int*>{};
+    await for (core::int* i in asy::Stream::fromIterable<core::int*>(<core::int*>[let final<BottomType> #t406 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:245:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   var map40 = {await for (int i in Stream.fromIterable([\"not\", \"int\"])) \"bar\": i, \"baz\": null};
-                                                        ^" in "not" as{TypeError} core::int*, let final<BottomType> #t411 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:245:64: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+                                                        ^" in "not" as{TypeError} core::int*, let final<BottomType> #t407 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:245:64: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   var map40 = {await for (int i in Stream.fromIterable([\"not\", \"int\"])) \"bar\": i, \"baz\": null};
                                                                ^" in "int" as{TypeError} core::int*]))
-      #t409.{core::Map::[]=}("bar", i);
-    #t409.{core::Map::[]=}("baz", null);
-  } =>#t409;
+      #t405.{core::Map::[]=}{Invariant}("bar", i);
+    #t405.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t405;
   core::List<core::int*>* list50 = block {
-    final core::List<core::int*>* #t412 = <core::int*>[];
+    final core::List<core::int*>* #t408 = <core::int*>[];
     for (; ; )
-      #t412.{core::List::add}(42);
-  } =>#t412;
+      #t408.{core::List::add}{Invariant}(42);
+  } =>#t408;
   core::Set<core::int*>* set50 = block {
-    final core::Set<core::int*>* #t413 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t409 = col::LinkedHashSet::•<core::int*>();
     for (; ; )
-      #t413.{core::Set::add}(42);
-    #t413.{core::Set::add}(null);
-  } =>#t413;
+      #t409.{core::Set::add}{Invariant}(42);
+    #t409.{core::Set::add}{Invariant}(null);
+  } =>#t409;
   core::Map<core::String*, core::int*>* map50 = block {
-    final core::Map<core::String*, core::int*>* #t414 = <core::String*, core::int*>{};
+    final core::Map<core::String*, core::int*>* #t410 = <core::String*, core::int*>{};
     for (; ; )
-      #t414.{core::Map::[]=}("bar", 42);
-    #t414.{core::Map::[]=}("baz", null);
-  } =>#t414;
+      #t410.{core::Map::[]=}{Invariant}("bar", 42);
+    #t410.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t410;
   core::List<core::int*>* list60 = block {
-    final core::List<core::int*>* #t415 = <core::int*>[];
-    for (; let final<BottomType> #t416 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:249:24: Error: A value of type 'String' can't be assigned to a variable of type 'bool'.
+    final core::List<core::int*>* #t411 = <core::int*>[];
+    for (; let final<BottomType> #t412 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:249:24: Error: A value of type 'String' can't be assigned to a variable of type 'bool'.
   var list60 = [for (; \"not bool\";) 42];
                        ^" in "not bool" as{TypeError} core::bool*; )
-      #t415.{core::List::add}(42);
-  } =>#t415;
+      #t411.{core::List::add}{Invariant}(42);
+  } =>#t411;
   core::Set<core::int*>* set60 = block {
-    final core::Set<core::int*>* #t417 = col::LinkedHashSet::•<core::int*>();
-    for (; let final<BottomType> #t418 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:250:23: Error: A value of type 'String' can't be assigned to a variable of type 'bool'.
+    final core::Set<core::int*>* #t413 = col::LinkedHashSet::•<core::int*>();
+    for (; let final<BottomType> #t414 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:250:23: Error: A value of type 'String' can't be assigned to a variable of type 'bool'.
   var set60 = {for (; \"not bool\";) 42, null};
                       ^" in "not bool" as{TypeError} core::bool*; )
-      #t417.{core::Set::add}(42);
-    #t417.{core::Set::add}(null);
-  } =>#t417;
+      #t413.{core::Set::add}{Invariant}(42);
+    #t413.{core::Set::add}{Invariant}(null);
+  } =>#t413;
   core::Map<core::String*, core::int*>* map60 = block {
-    final core::Map<core::String*, core::int*>* #t419 = <core::String*, core::int*>{};
-    for (; let final<BottomType> #t420 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:251:23: Error: A value of type 'String' can't be assigned to a variable of type 'bool'.
+    final core::Map<core::String*, core::int*>* #t415 = <core::String*, core::int*>{};
+    for (; let final<BottomType> #t416 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:251:23: Error: A value of type 'String' can't be assigned to a variable of type 'bool'.
   var map60 = {for (; \"not bool\";) \"bar\": 42, \"baz\": null};
                       ^" in "not bool" as{TypeError} core::bool*; )
-      #t419.{core::Map::[]=}("bar", 42);
-    #t419.{core::Map::[]=}("baz", null);
-  } =>#t419;
+      #t415.{core::Map::[]=}{Invariant}("bar", 42);
+    #t415.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t415;
 }
 static method testForElementErrorsNotAsync(asy::Stream<core::int*>* stream) → dynamic {
   block {
-    final core::List<core::int*>* #t421 = <core::int*>[];
+    final core::List<core::int*>* #t417 = <core::int*>[];
     await for (core::int* i in stream)
-      #t421.{core::List::add}(i);
-  } =>#t421;
+      #t417.{core::List::add}{Invariant}(i);
+  } =>#t417;
   block {
-    final core::Set<core::int*>* #t422 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t418 = col::LinkedHashSet::•<core::int*>();
     await for (core::int* i in stream)
-      #t422.{core::Set::add}(i);
-  } =>#t422;
+      #t418.{core::Set::add}{Invariant}(i);
+  } =>#t418;
   block {
-    final core::Map<core::String*, core::int*>* #t423 = <core::String*, core::int*>{};
+    final core::Map<core::String*, core::int*>* #t419 = <core::String*, core::int*>{};
     await for (core::int* i in stream)
-      #t423.{core::Map::[]=}("bar", i);
-  } =>#t423;
+      #t419.{core::Map::[]=}{Invariant}("bar", i);
+  } =>#t419;
 }
 static method testPromotion(self::A* a) → dynamic {
   core::List<core::int*>* list10 = block {
-    final core::List<core::int*>* #t424 = <core::int*>[];
+    final core::List<core::int*>* #t420 = <core::int*>[];
     if(a is self::B*)
-      #t424.{core::List::add}(a{self::B*}.{self::B::foo});
-  } =>#t424;
+      #t420.{core::List::add}{Invariant}(a{self::B*}.{self::B::foo});
+  } =>#t420;
   core::Set<core::int*>* set10 = block {
-    final core::Set<core::int*>* #t425 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t421 = col::LinkedHashSet::•<core::int*>();
     if(a is self::B*)
-      #t425.{core::Set::add}(a{self::B*}.{self::B::foo});
-  } =>#t425;
+      #t421.{core::Set::add}{Invariant}(a{self::B*}.{self::B::foo});
+  } =>#t421;
   core::Map<core::int*, core::int*>* map10 = block {
-    final core::Map<core::int*, core::int*>* #t426 = <core::int*, core::int*>{};
+    final core::Map<core::int*, core::int*>* #t422 = <core::int*, core::int*>{};
     if(a is self::B*)
-      #t426.{core::Map::[]=}(a{self::B*}.{self::B::foo}, a{self::B*}.{self::B::foo});
-  } =>#t426;
+      #t422.{core::Map::[]=}{Invariant}(a{self::B*}.{self::B::foo}, a{self::B*}.{self::B::foo});
+  } =>#t422;
 }
 static method main() → dynamic {}
 
diff --git a/pkg/front_end/testcases/general/control_flow_collection_inference.dart.strong.transformed.expect b/pkg/front_end/testcases/general/control_flow_collection_inference.dart.strong.transformed.expect
index 11d9f4d..898ae52 100644
--- a/pkg/front_end/testcases/general/control_flow_collection_inference.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/control_flow_collection_inference.dart.strong.transformed.expect
@@ -455,53 +455,53 @@
   core::List<core::int*>* list10 = block {
     final core::List<core::int*>* #t1 = <core::int*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t1.{core::List::add}(42);
+      #t1.{core::List::add}{Invariant}(42);
   } =>#t1;
   core::Set<core::int*>* set10 = block {
     final core::Set<core::int*>* #t2 = new col::_CompactLinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t2.{core::Set::add}(42);
-    #t2.{core::Set::add}(null);
+      #t2.{core::Set::add}{Invariant}(42);
+    #t2.{core::Set::add}{Invariant}(null);
   } =>#t2;
   core::Map<core::String*, core::int*>* map10 = block {
     final core::Map<core::String*, core::int*>* #t3 = <core::String*, core::int*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t3.{core::Map::[]=}("bar", 42);
-    #t3.{core::Map::[]=}("baz", null);
+      #t3.{core::Map::[]=}{Invariant}("bar", 42);
+    #t3.{core::Map::[]=}{Invariant}("baz", null);
   } =>#t3;
   core::List<dynamic>* list11 = block {
     final core::List<dynamic>* #t4 = <dynamic>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t4.{core::List::add}(dynVar);
+      #t4.{core::List::add}{Invariant}(dynVar);
   } =>#t4;
   core::Set<dynamic>* set11 = block {
     final core::Set<dynamic>* #t5 = new col::_CompactLinkedHashSet::•<dynamic>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t5.{core::Set::add}(dynVar);
-    #t5.{core::Set::add}(null);
+      #t5.{core::Set::add}{Invariant}(dynVar);
+    #t5.{core::Set::add}{Invariant}(null);
   } =>#t5;
   core::Map<core::String*, dynamic>* map11 = block {
     final core::Map<core::String*, dynamic>* #t6 = <core::String*, dynamic>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t6.{core::Map::[]=}("bar", dynVar);
-    #t6.{core::Map::[]=}("baz", null);
+      #t6.{core::Map::[]=}{Invariant}("bar", dynVar);
+    #t6.{core::Map::[]=}{Invariant}("baz", null);
   } =>#t6;
   core::List<core::List<core::int*>*>* list12 = block {
     final core::List<core::List<core::int*>*>* #t7 = <core::List<core::int*>*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t7.{core::List::add}(<core::int*>[42]);
+      #t7.{core::List::add}{Invariant}(<core::int*>[42]);
   } =>#t7;
   core::Set<core::List<core::int*>*>* set12 = block {
     final core::Set<core::List<core::int*>*>* #t8 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t8.{core::Set::add}(<core::int*>[42]);
-    #t8.{core::Set::add}(null);
+      #t8.{core::Set::add}{Invariant}(<core::int*>[42]);
+    #t8.{core::Set::add}{Invariant}(null);
   } =>#t8;
   core::Map<core::String*, core::List<core::int*>*>* map12 = block {
     final core::Map<core::String*, core::List<core::int*>*>* #t9 = <core::String*, core::List<core::int*>*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t9.{core::Map::[]=}("bar", <core::int*>[42]);
-    #t9.{core::Map::[]=}("baz", null);
+      #t9.{core::Map::[]=}{Invariant}("bar", <core::int*>[42]);
+    #t9.{core::Map::[]=}{Invariant}("baz", null);
   } =>#t9;
   core::List<core::int*>* list20 = block {
     final core::List<core::int*>* #t10 = <core::int*>[];
@@ -509,7 +509,7 @@
       core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[42].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::int* #t11 = :sync-for-iterator.{core::Iterator::current};
-        #t10.{core::List::add}(#t11);
+        #t10.{core::List::add}{Invariant}(#t11);
       }
     }
   } =>#t10;
@@ -519,10 +519,10 @@
       core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[42].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::int* #t13 = :sync-for-iterator.{core::Iterator::current};
-        #t12.{core::Set::add}(#t13);
+        #t12.{core::Set::add}{Invariant}(#t13);
       }
     }
-    #t12.{core::Set::add}(null);
+    #t12.{core::Set::add}{Invariant}(null);
   } =>#t12;
   core::Map<core::String*, core::int*>* map20 = block {
     final core::Map<core::String*, core::int*>* #t14 = <core::String*, core::int*>{};
@@ -530,10 +530,10 @@
       core::Iterator<core::MapEntry<core::String*, core::int*>>* :sync-for-iterator = <core::String*, core::int*>{"bar": 42}.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::MapEntry<core::String*, core::int*>* #t15 = :sync-for-iterator.{core::Iterator::current};
-        #t14.{core::Map::[]=}(#t15.{core::MapEntry::key}, #t15.{core::MapEntry::value});
+        #t14.{core::Map::[]=}{Invariant}(#t15.{core::MapEntry::key}, #t15.{core::MapEntry::value});
       }
     }
-    #t14.{core::Map::[]=}("baz", null);
+    #t14.{core::Map::[]=}{Invariant}("baz", null);
   } =>#t14;
   core::List<dynamic>* list21 = block {
     final core::List<dynamic>* #t16 = <dynamic>[];
@@ -541,7 +541,7 @@
       core::Iterator<dynamic>* :sync-for-iterator = <dynamic>[dynVar].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final dynamic #t17 = :sync-for-iterator.{core::Iterator::current};
-        #t16.{core::List::add}(#t17);
+        #t16.{core::List::add}{Invariant}(#t17);
       }
     }
   } =>#t16;
@@ -551,10 +551,10 @@
       core::Iterator<dynamic>* :sync-for-iterator = <dynamic>[dynVar].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final dynamic #t19 = :sync-for-iterator.{core::Iterator::current};
-        #t18.{core::Set::add}(#t19);
+        #t18.{core::Set::add}{Invariant}(#t19);
       }
     }
-    #t18.{core::Set::add}(null);
+    #t18.{core::Set::add}{Invariant}(null);
   } =>#t18;
   core::Map<core::String*, dynamic>* map21 = block {
     final core::Map<core::String*, dynamic>* #t20 = <core::String*, dynamic>{};
@@ -562,10 +562,10 @@
       core::Iterator<core::MapEntry<core::String*, dynamic>>* :sync-for-iterator = <core::String*, dynamic>{"bar": dynVar}.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::MapEntry<core::String*, dynamic>* #t21 = :sync-for-iterator.{core::Iterator::current};
-        #t20.{core::Map::[]=}(#t21.{core::MapEntry::key}, #t21.{core::MapEntry::value});
+        #t20.{core::Map::[]=}{Invariant}(#t21.{core::MapEntry::key}, #t21.{core::MapEntry::value});
       }
     }
-    #t20.{core::Map::[]=}("baz", null);
+    #t20.{core::Map::[]=}{Invariant}("baz", null);
   } =>#t20;
   core::List<core::List<core::int*>*>* list22 = block {
     final core::List<core::List<core::int*>*>* #t22 = <core::List<core::int*>*>[];
@@ -573,7 +573,7 @@
       core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[42]].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::List<core::int*>* #t23 = :sync-for-iterator.{core::Iterator::current};
-        #t22.{core::List::add}(#t23);
+        #t22.{core::List::add}{Invariant}(#t23);
       }
     }
   } =>#t22;
@@ -583,10 +583,10 @@
       core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[42]].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::List<core::int*>* #t25 = :sync-for-iterator.{core::Iterator::current};
-        #t24.{core::Set::add}(#t25);
+        #t24.{core::Set::add}{Invariant}(#t25);
       }
     }
-    #t24.{core::Set::add}(null);
+    #t24.{core::Set::add}{Invariant}(null);
   } =>#t24;
   core::Map<core::String*, core::List<core::int*>*>* map22 = block {
     final core::Map<core::String*, core::List<core::int*>*>* #t26 = <core::String*, core::List<core::int*>*>{};
@@ -594,10 +594,10 @@
       core::Iterator<core::MapEntry<core::String*, core::List<core::int*>*>>* :sync-for-iterator = <core::String*, core::List<core::int*>*>{"bar": <core::int*>[42]}.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::MapEntry<core::String*, core::List<core::int*>*>* #t27 = :sync-for-iterator.{core::Iterator::current};
-        #t26.{core::Map::[]=}(#t27.{core::MapEntry::key}, #t27.{core::MapEntry::value});
+        #t26.{core::Map::[]=}{Invariant}(#t27.{core::MapEntry::key}, #t27.{core::MapEntry::value});
       }
     }
-    #t26.{core::Map::[]=}("baz", null);
+    #t26.{core::Map::[]=}{Invariant}("baz", null);
   } =>#t26;
   core::List<core::int*>* list30 = block {
     final core::List<core::int*>* #t28 = <core::int*>[];
@@ -606,7 +606,7 @@
         core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[42].{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
           final core::int* #t29 = :sync-for-iterator.{core::Iterator::current};
-          #t28.{core::List::add}(#t29);
+          #t28.{core::List::add}{Invariant}(#t29);
         }
       }
   } =>#t28;
@@ -617,10 +617,10 @@
         core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[42].{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
           final core::int* #t31 = :sync-for-iterator.{core::Iterator::current};
-          #t30.{core::Set::add}(#t31);
+          #t30.{core::Set::add}{Invariant}(#t31);
         }
       }
-    #t30.{core::Set::add}(null);
+    #t30.{core::Set::add}{Invariant}(null);
   } =>#t30;
   core::Map<core::String*, core::int*>* map30 = block {
     final core::Map<core::String*, core::int*>* #t32 = <core::String*, core::int*>{};
@@ -629,10 +629,10 @@
         core::Iterator<core::MapEntry<core::String*, core::int*>>* :sync-for-iterator = <core::String*, core::int*>{"bar": 42}.{core::Map::entries}.{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
           final core::MapEntry<core::String*, core::int*>* #t33 = :sync-for-iterator.{core::Iterator::current};
-          #t32.{core::Map::[]=}(#t33.{core::MapEntry::key}, #t33.{core::MapEntry::value});
+          #t32.{core::Map::[]=}{Invariant}(#t33.{core::MapEntry::key}, #t33.{core::MapEntry::value});
         }
       }
-    #t32.{core::Map::[]=}("baz", null);
+    #t32.{core::Map::[]=}{Invariant}("baz", null);
   } =>#t32;
   core::List<dynamic>* list31 = block {
     final core::List<dynamic>* #t34 = <dynamic>[];
@@ -641,7 +641,7 @@
         core::Iterator<dynamic>* :sync-for-iterator = <dynamic>[dynVar].{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
           final dynamic #t35 = :sync-for-iterator.{core::Iterator::current};
-          #t34.{core::List::add}(#t35);
+          #t34.{core::List::add}{Invariant}(#t35);
         }
       }
   } =>#t34;
@@ -652,10 +652,10 @@
         core::Iterator<dynamic>* :sync-for-iterator = <dynamic>[dynVar].{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
           final dynamic #t37 = :sync-for-iterator.{core::Iterator::current};
-          #t36.{core::Set::add}(#t37);
+          #t36.{core::Set::add}{Invariant}(#t37);
         }
       }
-    #t36.{core::Set::add}(null);
+    #t36.{core::Set::add}{Invariant}(null);
   } =>#t36;
   core::Map<core::String*, dynamic>* map31 = block {
     final core::Map<core::String*, dynamic>* #t38 = <core::String*, dynamic>{};
@@ -664,10 +664,10 @@
         core::Iterator<core::MapEntry<core::String*, dynamic>>* :sync-for-iterator = <core::String*, dynamic>{"bar": dynVar}.{core::Map::entries}.{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
           final core::MapEntry<core::String*, dynamic>* #t39 = :sync-for-iterator.{core::Iterator::current};
-          #t38.{core::Map::[]=}(#t39.{core::MapEntry::key}, #t39.{core::MapEntry::value});
+          #t38.{core::Map::[]=}{Invariant}(#t39.{core::MapEntry::key}, #t39.{core::MapEntry::value});
         }
       }
-    #t38.{core::Map::[]=}("baz", null);
+    #t38.{core::Map::[]=}{Invariant}("baz", null);
   } =>#t38;
   core::List<core::List<core::int*>*>* list33 = block {
     final core::List<core::List<core::int*>*>* #t40 = <core::List<core::int*>*>[];
@@ -676,7 +676,7 @@
         core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[42]].{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
           final core::List<core::int*>* #t41 = :sync-for-iterator.{core::Iterator::current};
-          #t40.{core::List::add}(#t41);
+          #t40.{core::List::add}{Invariant}(#t41);
         }
       }
   } =>#t40;
@@ -687,10 +687,10 @@
         core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[42]].{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
           final core::List<core::int*>* #t43 = :sync-for-iterator.{core::Iterator::current};
-          #t42.{core::Set::add}(#t43);
+          #t42.{core::Set::add}{Invariant}(#t43);
         }
       }
-    #t42.{core::Set::add}(null);
+    #t42.{core::Set::add}{Invariant}(null);
   } =>#t42;
   core::Map<core::String*, core::List<core::int*>*>* map33 = block {
     final core::Map<core::String*, core::List<core::int*>*>* #t44 = <core::String*, core::List<core::int*>*>{};
@@ -699,10 +699,10 @@
         core::Iterator<core::MapEntry<core::String*, core::List<core::int*>*>>* :sync-for-iterator = <core::String*, core::List<core::int*>*>{"bar": <core::int*>[42]}.{core::Map::entries}.{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
           final core::MapEntry<core::String*, core::List<core::int*>*>* #t45 = :sync-for-iterator.{core::Iterator::current};
-          #t44.{core::Map::[]=}(#t45.{core::MapEntry::key}, #t45.{core::MapEntry::value});
+          #t44.{core::Map::[]=}{Invariant}(#t45.{core::MapEntry::key}, #t45.{core::MapEntry::value});
         }
       }
-    #t44.{core::Map::[]=}("baz", null);
+    #t44.{core::Map::[]=}{Invariant}("baz", null);
   } =>#t44;
   core::List<core::List<core::int*>*>* list40 = block {
     final core::List<core::List<core::int*>*>* #t46 = <core::List<core::int*>*>[];
@@ -710,7 +710,7 @@
       core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::List<core::int*>* #t47 = :sync-for-iterator.{core::Iterator::current};
-        #t46.{core::List::add}(#t47);
+        #t46.{core::List::add}{Invariant}(#t47);
       }
     }
   } =>#t46;
@@ -720,10 +720,10 @@
       core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::List<core::int*>* #t49 = :sync-for-iterator.{core::Iterator::current};
-        #t48.{core::Set::add}(#t49);
+        #t48.{core::Set::add}{Invariant}(#t49);
       }
     }
-    #t48.{core::Set::add}(null);
+    #t48.{core::Set::add}{Invariant}(null);
   } =>#t48;
   core::Map<core::String*, core::List<core::int*>*>* map40 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:39:34: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
   Map<String, List<int>> map40 = {if (oracle(\"foo\")) ...{\"bar\", []}, \"baz\": null};
@@ -731,557 +731,567 @@
   core::List<core::List<core::int*>*>* list41 = block {
     final core::List<core::List<core::int*>*>* #t50 = <core::List<core::int*>*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
-      core::Iterator<core::List<core::int*>*>* :sync-for-iterator = (let final core::Set<core::List<core::int*>*>* #t51 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>() in let final core::bool #t52 = #t51.{core::Set::add}(<core::int*>[]) in #t51).{core::Iterable::iterator};
+      core::Iterator<core::List<core::int*>*>* :sync-for-iterator = ( block {
+        final core::Set<core::List<core::int*>*>* #t51 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
+        #t51.{core::Set::add}{Invariant}(<core::int*>[]);
+      } =>#t51).{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::List<core::int*>* #t53 = :sync-for-iterator.{core::Iterator::current};
-        #t50.{core::List::add}(#t53);
+        final core::List<core::int*>* #t52 = :sync-for-iterator.{core::Iterator::current};
+        #t50.{core::List::add}{Invariant}(#t52);
       }
     }
   } =>#t50;
   core::Set<core::List<core::int*>*>* set41 = block {
-    final core::Set<core::List<core::int*>*>* #t54 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
+    final core::Set<core::List<core::int*>*>* #t53 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
-      core::Iterator<core::List<core::int*>*>* :sync-for-iterator = (let final core::Set<core::List<core::int*>*>* #t55 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>() in let final core::bool #t56 = #t55.{core::Set::add}(<core::int*>[]) in #t55).{core::Iterable::iterator};
+      core::Iterator<core::List<core::int*>*>* :sync-for-iterator = ( block {
+        final core::Set<core::List<core::int*>*>* #t54 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
+        #t54.{core::Set::add}{Invariant}(<core::int*>[]);
+      } =>#t54).{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::List<core::int*>* #t57 = :sync-for-iterator.{core::Iterator::current};
-        #t54.{core::Set::add}(#t57);
+        final core::List<core::int*>* #t55 = :sync-for-iterator.{core::Iterator::current};
+        #t53.{core::Set::add}{Invariant}(#t55);
       }
     }
-    #t54.{core::Set::add}(null);
-  } =>#t54;
+    #t53.{core::Set::add}{Invariant}(null);
+  } =>#t53;
   core::List<core::List<core::int*>*>* list42 = block {
-    final core::List<core::List<core::int*>*>* #t58 = <core::List<core::int*>*>[];
+    final core::List<core::List<core::int*>*>* #t56 = <core::List<core::int*>*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
+        core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
+        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+          final core::List<core::int*>* #t57 = :sync-for-iterator.{core::Iterator::current};
+          #t56.{core::List::add}{Invariant}(#t57);
+        }
+      }
+  } =>#t56;
+  core::Set<core::List<core::int*>*>* set42 = block {
+    final core::Set<core::List<core::int*>*>* #t58 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
         core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
           final core::List<core::int*>* #t59 = :sync-for-iterator.{core::Iterator::current};
-          #t58.{core::List::add}(#t59);
+          #t58.{core::Set::add}{Invariant}(#t59);
         }
       }
+    #t58.{core::Set::add}{Invariant}(null);
   } =>#t58;
-  core::Set<core::List<core::int*>*>* set42 = block {
-    final core::Set<core::List<core::int*>*>* #t60 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
-    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
-        core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
-        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final core::List<core::int*>* #t61 = :sync-for-iterator.{core::Iterator::current};
-          #t60.{core::Set::add}(#t61);
-        }
-      }
-    #t60.{core::Set::add}(null);
-  } =>#t60;
   core::Map<core::String*, core::List<core::int*>*>* map42 = block {
-    final core::Map<core::String*, core::List<core::int*>*>* #t62 = <core::String*, core::List<core::int*>*>{};
+    final core::Map<core::String*, core::List<core::int*>*>* #t60 = <core::String*, core::List<core::int*>*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
         core::Iterator<core::MapEntry<core::String*, core::List<core::int*>*>>* :sync-for-iterator = <core::String*, core::List<core::int*>*>{"bar": <core::int*>[]}.{core::Map::entries}.{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final core::MapEntry<core::String*, core::List<core::int*>*>* #t63 = :sync-for-iterator.{core::Iterator::current};
-          #t62.{core::Map::[]=}(#t63.{core::MapEntry::key}, #t63.{core::MapEntry::value});
+          final core::MapEntry<core::String*, core::List<core::int*>*>* #t61 = :sync-for-iterator.{core::Iterator::current};
+          #t60.{core::Map::[]=}{Invariant}(#t61.{core::MapEntry::key}, #t61.{core::MapEntry::value});
         }
       }
-    #t62.{core::Map::[]=}("baz", null);
-  } =>#t62;
+    #t60.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t60;
   core::List<core::int*>* list50 = block {
-    final core::List<core::int*>* #t64 = <core::int*>[];
+    final core::List<core::int*>* #t62 = <core::int*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
+      core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[].{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::int* #t63 = :sync-for-iterator.{core::Iterator::current};
+        #t62.{core::List::add}{Invariant}(#t63);
+      }
+    }
+  } =>#t62;
+  core::Set<core::int*>* set50 = block {
+    final core::Set<core::int*>* #t64 = new col::_CompactLinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
       core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::int* #t65 = :sync-for-iterator.{core::Iterator::current};
-        #t64.{core::List::add}(#t65);
+        #t64.{core::Set::add}{Invariant}(#t65);
       }
     }
+    #t64.{core::Set::add}{Invariant}(null);
   } =>#t64;
-  core::Set<core::int*>* set50 = block {
-    final core::Set<core::int*>* #t66 = new col::_CompactLinkedHashSet::•<core::int*>();
-    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
-      core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[].{core::Iterable::iterator};
-      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::int* #t67 = :sync-for-iterator.{core::Iterator::current};
-        #t66.{core::Set::add}(#t67);
-      }
-    }
-    #t66.{core::Set::add}(null);
-  } =>#t66;
   core::Map<core::String*, core::int*>* map50 = block {
-    final core::Map<core::String*, core::int*>* #t68 = <core::String*, core::int*>{};
+    final core::Map<core::String*, core::int*>* #t66 = <core::String*, core::int*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
       core::Iterator<core::MapEntry<core::String*, core::int*>>* :sync-for-iterator = <core::String*, core::int*>{}.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::MapEntry<core::String*, core::int*>* #t69 = :sync-for-iterator.{core::Iterator::current};
-        #t68.{core::Map::[]=}(#t69.{core::MapEntry::key}, #t69.{core::MapEntry::value});
+        final core::MapEntry<core::String*, core::int*>* #t67 = :sync-for-iterator.{core::Iterator::current};
+        #t66.{core::Map::[]=}{Invariant}(#t67.{core::MapEntry::key}, #t67.{core::MapEntry::value});
       }
     }
-    #t68.{core::Map::[]=}("baz", null);
-  } =>#t68;
+    #t66.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t66;
   core::List<core::int*>* list51 = block {
-    final core::List<core::int*>* #t70 = <core::int*>[];
+    final core::List<core::int*>* #t68 = <core::int*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
-      core::Iterator<core::int*>* :sync-for-iterator = (let final core::Set<core::int*>* #t71 = new col::_CompactLinkedHashSet::•<core::int*>() in #t71).{core::Iterable::iterator};
+      core::Iterator<core::int*>* :sync-for-iterator = ( block {
+        final core::Set<core::int*>* #t69 = new col::_CompactLinkedHashSet::•<core::int*>();
+      } =>#t69).{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::int* #t72 = :sync-for-iterator.{core::Iterator::current};
-        #t70.{core::List::add}(#t72);
+        final core::int* #t70 = :sync-for-iterator.{core::Iterator::current};
+        #t68.{core::List::add}{Invariant}(#t70);
       }
     }
-  } =>#t70;
+  } =>#t68;
   core::Set<core::int*>* set51 = block {
-    final core::Set<core::int*>* #t73 = new col::_CompactLinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t71 = new col::_CompactLinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
-      core::Iterator<core::int*>* :sync-for-iterator = (let final core::Set<core::int*>* #t74 = new col::_CompactLinkedHashSet::•<core::int*>() in #t74).{core::Iterable::iterator};
+      core::Iterator<core::int*>* :sync-for-iterator = ( block {
+        final core::Set<core::int*>* #t72 = new col::_CompactLinkedHashSet::•<core::int*>();
+      } =>#t72).{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::int* #t75 = :sync-for-iterator.{core::Iterator::current};
-        #t73.{core::Set::add}(#t75);
+        final core::int* #t73 = :sync-for-iterator.{core::Iterator::current};
+        #t71.{core::Set::add}{Invariant}(#t73);
       }
     }
-    #t73.{core::Set::add}(null);
-  } =>#t73;
+    #t71.{core::Set::add}{Invariant}(null);
+  } =>#t71;
   core::List<core::int*>* list52 = block {
-    final core::List<core::int*>* #t76 = <core::int*>[];
+    final core::List<core::int*>* #t74 = <core::int*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
+        core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[].{core::Iterable::iterator};
+        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+          final core::int* #t75 = :sync-for-iterator.{core::Iterator::current};
+          #t74.{core::List::add}{Invariant}(#t75);
+        }
+      }
+  } =>#t74;
+  core::Set<core::int*>* set52 = block {
+    final core::Set<core::int*>* #t76 = new col::_CompactLinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
         core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[].{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
           final core::int* #t77 = :sync-for-iterator.{core::Iterator::current};
-          #t76.{core::List::add}(#t77);
+          #t76.{core::Set::add}{Invariant}(#t77);
         }
       }
+    #t76.{core::Set::add}{Invariant}(null);
   } =>#t76;
-  core::Set<core::int*>* set52 = block {
-    final core::Set<core::int*>* #t78 = new col::_CompactLinkedHashSet::•<core::int*>();
-    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
-        core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[].{core::Iterable::iterator};
-        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final core::int* #t79 = :sync-for-iterator.{core::Iterator::current};
-          #t78.{core::Set::add}(#t79);
-        }
-      }
-    #t78.{core::Set::add}(null);
-  } =>#t78;
   core::Map<core::String*, core::int*>* map52 = block {
-    final core::Map<core::String*, core::int*>* #t80 = <core::String*, core::int*>{};
+    final core::Map<core::String*, core::int*>* #t78 = <core::String*, core::int*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
         core::Iterator<core::MapEntry<core::String*, core::int*>>* :sync-for-iterator = <core::String*, core::int*>{}.{core::Map::entries}.{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final core::MapEntry<core::String*, core::int*>* #t81 = :sync-for-iterator.{core::Iterator::current};
-          #t80.{core::Map::[]=}(#t81.{core::MapEntry::key}, #t81.{core::MapEntry::value});
+          final core::MapEntry<core::String*, core::int*>* #t79 = :sync-for-iterator.{core::Iterator::current};
+          #t78.{core::Map::[]=}{Invariant}(#t79.{core::MapEntry::key}, #t79.{core::MapEntry::value});
         }
       }
-    #t80.{core::Map::[]=}("baz", null);
-  } =>#t80;
+    #t78.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t78;
   core::List<core::List<core::int*>*>* list60 = block {
-    final core::List<core::List<core::int*>*>* #t82 = <core::List<core::int*>*>[];
+    final core::List<core::List<core::int*>*>* #t80 = <core::List<core::int*>*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
+      core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::List<core::int*>* #t81 = :sync-for-iterator.{core::Iterator::current};
+        #t80.{core::List::add}{Invariant}(#t81);
+      }
+    }
+  } =>#t80;
+  core::Set<core::List<core::int*>*>* set60 = block {
+    final core::Set<core::List<core::int*>*>* #t82 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
       core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::List<core::int*>* #t83 = :sync-for-iterator.{core::Iterator::current};
-        #t82.{core::List::add}(#t83);
+        #t82.{core::Set::add}{Invariant}(#t83);
       }
     }
+    #t82.{core::Set::add}{Invariant}(null);
   } =>#t82;
-  core::Set<core::List<core::int*>*>* set60 = block {
-    final core::Set<core::List<core::int*>*>* #t84 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
-    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
-      core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
-      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::List<core::int*>* #t85 = :sync-for-iterator.{core::Iterator::current};
-        #t84.{core::Set::add}(#t85);
-      }
-    }
-    #t84.{core::Set::add}(null);
-  } =>#t84;
   core::Map<core::String*, core::List<core::int*>*>* map60 = block {
-    final core::Map<core::String*, core::List<core::int*>*>* #t86 = <core::String*, core::List<core::int*>*>{};
+    final core::Map<core::String*, core::List<core::int*>*>* #t84 = <core::String*, core::List<core::int*>*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
       core::Iterator<core::MapEntry<core::String*, core::List<core::int*>*>>* :sync-for-iterator = <core::String*, core::List<core::int*>*>{"bar": <core::int*>[]}.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::MapEntry<core::String*, core::List<core::int*>*>* #t87 = :sync-for-iterator.{core::Iterator::current};
-        #t86.{core::Map::[]=}(#t87.{core::MapEntry::key}, #t87.{core::MapEntry::value});
+        final core::MapEntry<core::String*, core::List<core::int*>*>* #t85 = :sync-for-iterator.{core::Iterator::current};
+        #t84.{core::Map::[]=}{Invariant}(#t85.{core::MapEntry::key}, #t85.{core::MapEntry::value});
       }
     }
-    #t86.{core::Map::[]=}("baz", null);
-  } =>#t86;
+    #t84.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t84;
   core::List<core::List<core::int*>*>* list61 = block {
-    final core::List<core::List<core::int*>*>* #t88 = <core::List<core::int*>*>[];
+    final core::List<core::List<core::int*>*>* #t86 = <core::List<core::int*>*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
+        core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
+        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+          final core::List<core::int*>* #t87 = :sync-for-iterator.{core::Iterator::current};
+          #t86.{core::List::add}{Invariant}(#t87);
+        }
+      }
+  } =>#t86;
+  core::Set<core::List<core::int*>*>* set61 = block {
+    final core::Set<core::List<core::int*>*>* #t88 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
         core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
           final core::List<core::int*>* #t89 = :sync-for-iterator.{core::Iterator::current};
-          #t88.{core::List::add}(#t89);
+          #t88.{core::Set::add}{Invariant}(#t89);
         }
       }
+    #t88.{core::Set::add}{Invariant}(null);
   } =>#t88;
-  core::Set<core::List<core::int*>*>* set61 = block {
-    final core::Set<core::List<core::int*>*>* #t90 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
-    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
-        core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
-        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final core::List<core::int*>* #t91 = :sync-for-iterator.{core::Iterator::current};
-          #t90.{core::Set::add}(#t91);
-        }
-      }
-    #t90.{core::Set::add}(null);
-  } =>#t90;
   core::Map<core::String*, core::List<core::int*>*>* map61 = block {
-    final core::Map<core::String*, core::List<core::int*>*>* #t92 = <core::String*, core::List<core::int*>*>{};
+    final core::Map<core::String*, core::List<core::int*>*>* #t90 = <core::String*, core::List<core::int*>*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
         core::Iterator<core::MapEntry<core::String*, core::List<core::int*>*>>* :sync-for-iterator = <core::String*, core::List<core::int*>*>{"bar": <core::int*>[]}.{core::Map::entries}.{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final core::MapEntry<core::String*, core::List<core::int*>*>* #t93 = :sync-for-iterator.{core::Iterator::current};
-          #t92.{core::Map::[]=}(#t93.{core::MapEntry::key}, #t93.{core::MapEntry::value});
+          final core::MapEntry<core::String*, core::List<core::int*>*>* #t91 = :sync-for-iterator.{core::Iterator::current};
+          #t90.{core::Map::[]=}{Invariant}(#t91.{core::MapEntry::key}, #t91.{core::MapEntry::value});
         }
       }
-    #t92.{core::Map::[]=}("baz", null);
-  } =>#t92;
+    #t90.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t90;
   core::List<core::List<core::int*>*>* list70 = block {
+    final core::List<core::List<core::int*>*>* #t92 = <core::List<core::int*>*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      #t92.{core::List::add}{Invariant}(<core::int*>[]);
+  } =>#t92;
+  core::Set<core::List<core::int*>*>* set70 = block {
+    final core::Set<core::List<core::int*>*>* #t93 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      #t93.{core::Set::add}{Invariant}(<core::int*>[]);
+    #t93.{core::Set::add}{Invariant}(null);
+  } =>#t93;
+  core::List<core::List<core::int*>*>* list71 = block {
     final core::List<core::List<core::int*>*>* #t94 = <core::List<core::int*>*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t94.{core::List::add}(<core::int*>[]);
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
+        #t94.{core::List::add}{Invariant}(<core::int*>[]);
   } =>#t94;
-  core::Set<core::List<core::int*>*>* set70 = block {
+  core::Set<core::List<core::int*>*>* set71 = block {
     final core::Set<core::List<core::int*>*>* #t95 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t95.{core::Set::add}(<core::int*>[]);
-    #t95.{core::Set::add}(null);
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
+        #t95.{core::Set::add}{Invariant}(<core::int*>[]);
+    #t95.{core::Set::add}{Invariant}(null);
   } =>#t95;
-  core::List<core::List<core::int*>*>* list71 = block {
-    final core::List<core::List<core::int*>*>* #t96 = <core::List<core::int*>*>[];
-    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t96.{core::List::add}(<core::int*>[]);
-  } =>#t96;
-  core::Set<core::List<core::int*>*>* set71 = block {
-    final core::Set<core::List<core::int*>*>* #t97 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
-    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t97.{core::Set::add}(<core::int*>[]);
-    #t97.{core::Set::add}(null);
-  } =>#t97;
   core::List<core::num*>* list80 = block {
-    final core::List<core::num*>* #t98 = <core::num*>[];
+    final core::List<core::num*>* #t96 = <core::num*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t98.{core::List::add}(42);
+      #t96.{core::List::add}{Invariant}(42);
     else
-      #t98.{core::List::add}(3.14);
-  } =>#t98;
+      #t96.{core::List::add}{Invariant}(3.14);
+  } =>#t96;
   core::Set<core::num*>* set80 = block {
-    final core::Set<core::num*>* #t99 = new col::_CompactLinkedHashSet::•<core::num*>();
+    final core::Set<core::num*>* #t97 = new col::_CompactLinkedHashSet::•<core::num*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t99.{core::Set::add}(42);
+      #t97.{core::Set::add}{Invariant}(42);
     else
-      #t99.{core::Set::add}(3.14);
-    #t99.{core::Set::add}(null);
-  } =>#t99;
+      #t97.{core::Set::add}{Invariant}(3.14);
+    #t97.{core::Set::add}{Invariant}(null);
+  } =>#t97;
   core::Map<core::String*, core::num*>* map80 = block {
-    final core::Map<core::String*, core::num*>* #t100 = <core::String*, core::num*>{};
+    final core::Map<core::String*, core::num*>* #t98 = <core::String*, core::num*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t100.{core::Map::[]=}("bar", 42);
+      #t98.{core::Map::[]=}{Invariant}("bar", 42);
     else
-      #t100.{core::Map::[]=}("bar", 3.14);
-    #t100.{core::Map::[]=}("baz", null);
-  } =>#t100;
+      #t98.{core::Map::[]=}{Invariant}("bar", 3.14);
+    #t98.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t98;
   core::List<core::num*>* list81 = block {
-    final core::List<core::num*>* #t101 = <core::num*>[];
+    final core::List<core::num*>* #t99 = <core::num*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
       core::Iterator<core::int*>* :sync-for-iterator = listInt.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::num* #t102 = :sync-for-iterator.{core::Iterator::current};
-        #t101.{core::List::add}(#t102);
+        final core::num* #t100 = :sync-for-iterator.{core::Iterator::current};
+        #t99.{core::List::add}{Invariant}(#t100);
       }
     }
     else {
       core::Iterator<core::double*>* :sync-for-iterator = listDouble.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::num* #t101 = :sync-for-iterator.{core::Iterator::current};
+        #t99.{core::List::add}{Invariant}(#t101);
+      }
+    }
+  } =>#t99;
+  core::Set<core::num*>* set81 = block {
+    final core::Set<core::num*>* #t102 = new col::_CompactLinkedHashSet::•<core::num*>();
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
+      core::Iterator<core::int*>* :sync-for-iterator = listInt.{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::num* #t103 = :sync-for-iterator.{core::Iterator::current};
-        #t101.{core::List::add}(#t103);
-      }
-    }
-  } =>#t101;
-  core::Set<core::num*>* set81 = block {
-    final core::Set<core::num*>* #t104 = new col::_CompactLinkedHashSet::•<core::num*>();
-    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
-      core::Iterator<core::int*>* :sync-for-iterator = listInt.{core::Iterable::iterator};
-      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::num* #t105 = :sync-for-iterator.{core::Iterator::current};
-        #t104.{core::Set::add}(#t105);
+        #t102.{core::Set::add}{Invariant}(#t103);
       }
     }
     else {
       core::Iterator<core::double*>* :sync-for-iterator = listDouble.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::num* #t106 = :sync-for-iterator.{core::Iterator::current};
-        #t104.{core::Set::add}(#t106);
+        final core::num* #t104 = :sync-for-iterator.{core::Iterator::current};
+        #t102.{core::Set::add}{Invariant}(#t104);
       }
     }
-    #t104.{core::Set::add}(null);
-  } =>#t104;
+    #t102.{core::Set::add}{Invariant}(null);
+  } =>#t102;
   core::Map<core::String*, core::num*>* map81 = block {
-    final core::Map<core::String*, core::num*>* #t107 = <core::String*, core::num*>{};
+    final core::Map<core::String*, core::num*>* #t105 = <core::String*, core::num*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
       core::Iterator<core::MapEntry<core::String*, core::int*>>* :sync-for-iterator = mapToInt.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::MapEntry<core::String*, core::num*>* #t108 = :sync-for-iterator.{core::Iterator::current};
-        #t107.{core::Map::[]=}(#t108.{core::MapEntry::key}, #t108.{core::MapEntry::value});
+        final core::MapEntry<core::String*, core::num*>* #t106 = :sync-for-iterator.{core::Iterator::current};
+        #t105.{core::Map::[]=}{Invariant}(#t106.{core::MapEntry::key}, #t106.{core::MapEntry::value});
       }
     }
     else {
       core::Iterator<core::MapEntry<core::String*, core::double*>>* :sync-for-iterator = mapToDouble.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::MapEntry<core::String*, core::num*>* #t109 = :sync-for-iterator.{core::Iterator::current};
-        #t107.{core::Map::[]=}(#t109.{core::MapEntry::key}, #t109.{core::MapEntry::value});
+        final core::MapEntry<core::String*, core::num*>* #t107 = :sync-for-iterator.{core::Iterator::current};
+        #t105.{core::Map::[]=}{Invariant}(#t107.{core::MapEntry::key}, #t107.{core::MapEntry::value});
       }
     }
-    #t107.{core::Map::[]=}("baz", null);
-  } =>#t107;
+    #t105.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t105;
   core::List<dynamic>* list82 = block {
-    final core::List<dynamic>* #t110 = <dynamic>[];
+    final core::List<dynamic>* #t108 = <dynamic>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
       core::Iterator<core::int*>* :sync-for-iterator = listInt.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final dynamic #t111 = :sync-for-iterator.{core::Iterator::current};
-        #t110.{core::List::add}(#t111);
+        final dynamic #t109 = :sync-for-iterator.{core::Iterator::current};
+        #t108.{core::List::add}{Invariant}(#t109);
       }
     }
     else {
       core::Iterator<dynamic>* :sync-for-iterator = (dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*).{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final dynamic #t110 = :sync-for-iterator.{core::Iterator::current};
+        #t108.{core::List::add}{Invariant}(#t110);
+      }
+    }
+  } =>#t108;
+  core::Set<dynamic>* set82 = block {
+    final core::Set<dynamic>* #t111 = new col::_CompactLinkedHashSet::•<dynamic>();
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
+      core::Iterator<core::int*>* :sync-for-iterator = listInt.{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final dynamic #t112 = :sync-for-iterator.{core::Iterator::current};
-        #t110.{core::List::add}(#t112);
-      }
-    }
-  } =>#t110;
-  core::Set<dynamic>* set82 = block {
-    final core::Set<dynamic>* #t113 = new col::_CompactLinkedHashSet::•<dynamic>();
-    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
-      core::Iterator<core::int*>* :sync-for-iterator = listInt.{core::Iterable::iterator};
-      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final dynamic #t114 = :sync-for-iterator.{core::Iterator::current};
-        #t113.{core::Set::add}(#t114);
+        #t111.{core::Set::add}{Invariant}(#t112);
       }
     }
     else {
       core::Iterator<dynamic>* :sync-for-iterator = (dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*).{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final dynamic #t115 = :sync-for-iterator.{core::Iterator::current};
-        #t113.{core::Set::add}(#t115);
+        final dynamic #t113 = :sync-for-iterator.{core::Iterator::current};
+        #t111.{core::Set::add}{Invariant}(#t113);
       }
     }
-    #t113.{core::Set::add}(null);
-  } =>#t113;
+    #t111.{core::Set::add}{Invariant}(null);
+  } =>#t111;
   core::Set<dynamic>* map82 = block {
-    final core::Set<dynamic>* #t116 = new col::_CompactLinkedHashSet::•<dynamic>();
+    final core::Set<dynamic>* #t114 = new col::_CompactLinkedHashSet::•<dynamic>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t116.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:71:38: Error: Unexpected type 'Map<String, int>' of a spread.  Expected 'dynamic' or an Iterable.
+      #t114.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:71:38: Error: Unexpected type 'Map<String, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
   var map82 = {if (oracle(\"foo\")) ...mapToInt else ...dynVar, null};
                                      ^");
     else {
       core::Iterator<dynamic>* :sync-for-iterator = (dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*).{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final dynamic #t117 = :sync-for-iterator.{core::Iterator::current};
-        #t116.{core::Set::add}(#t117);
+        final dynamic #t115 = :sync-for-iterator.{core::Iterator::current};
+        #t114.{core::Set::add}{Invariant}(#t115);
       }
     }
-    #t116.{core::Set::add}(null);
-  } =>#t116;
+    #t114.{core::Set::add}{Invariant}(null);
+  } =>#t114;
   core::List<core::num*>* list83 = block {
-    final core::List<core::num*>* #t118 = <core::num*>[];
+    final core::List<core::num*>* #t116 = <core::num*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t118.{core::List::add}(42);
+      #t116.{core::List::add}{Invariant}(42);
     else {
       core::Iterator<core::double*>* :sync-for-iterator = listDouble.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::num* #t119 = :sync-for-iterator.{core::Iterator::current};
-        #t118.{core::List::add}(#t119);
+        final core::num* #t117 = :sync-for-iterator.{core::Iterator::current};
+        #t116.{core::List::add}{Invariant}(#t117);
       }
     }
-  } =>#t118;
+  } =>#t116;
   core::Set<core::num*>* set83 = block {
-    final core::Set<core::num*>* #t120 = new col::_CompactLinkedHashSet::•<core::num*>();
+    final core::Set<core::num*>* #t118 = new col::_CompactLinkedHashSet::•<core::num*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
       core::Iterator<core::int*>* :sync-for-iterator = listInt.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::num* #t121 = :sync-for-iterator.{core::Iterator::current};
-        #t120.{core::Set::add}(#t121);
+        final core::num* #t119 = :sync-for-iterator.{core::Iterator::current};
+        #t118.{core::Set::add}{Invariant}(#t119);
       }
     }
     else
-      #t120.{core::Set::add}(3.14);
-    #t120.{core::Set::add}(null);
-  } =>#t120;
+      #t118.{core::Set::add}{Invariant}(3.14);
+    #t118.{core::Set::add}{Invariant}(null);
+  } =>#t118;
   core::Map<core::String*, core::num*>* map83 = block {
-    final core::Map<core::String*, core::num*>* #t122 = <core::String*, core::num*>{};
+    final core::Map<core::String*, core::num*>* #t120 = <core::String*, core::num*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
       core::Iterator<core::MapEntry<core::String*, core::int*>>* :sync-for-iterator = mapToInt.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::MapEntry<core::String*, core::num*>* #t123 = :sync-for-iterator.{core::Iterator::current};
-        #t122.{core::Map::[]=}(#t123.{core::MapEntry::key}, #t123.{core::MapEntry::value});
+        final core::MapEntry<core::String*, core::num*>* #t121 = :sync-for-iterator.{core::Iterator::current};
+        #t120.{core::Map::[]=}{Invariant}(#t121.{core::MapEntry::key}, #t121.{core::MapEntry::value});
       }
     }
     else
-      #t122.{core::Map::[]=}("bar", 3.14);
-    #t122.{core::Map::[]=}("baz", null);
-  } =>#t122;
+      #t120.{core::Map::[]=}{Invariant}("bar", 3.14);
+    #t120.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t120;
   core::List<core::int*>* list90 = block {
-    final core::List<core::int*>* #t124 = <core::int*>[];
+    final core::List<core::int*>* #t122 = <core::int*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t124.{core::List::add}(dynVar as{TypeError,ForDynamic} core::int*);
-  } =>#t124;
+      #t122.{core::List::add}{Invariant}(dynVar as{TypeError,ForDynamic} core::int*);
+  } =>#t122;
   core::Set<core::int*>* set90 = block {
-    final core::Set<core::int*>* #t125 = new col::_CompactLinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t123 = new col::_CompactLinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t125.{core::Set::add}(dynVar as{TypeError,ForDynamic} core::int*);
-    #t125.{core::Set::add}(null);
-  } =>#t125;
+      #t123.{core::Set::add}{Invariant}(dynVar as{TypeError,ForDynamic} core::int*);
+    #t123.{core::Set::add}{Invariant}(null);
+  } =>#t123;
   core::Map<core::String*, core::int*>* map90 = block {
-    final core::Map<core::String*, core::int*>* #t126 = <core::String*, core::int*>{};
+    final core::Map<core::String*, core::int*>* #t124 = <core::String*, core::int*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t126.{core::Map::[]=}("bar", dynVar as{TypeError,ForDynamic} core::int*);
-    #t126.{core::Map::[]=}("baz", null);
-  } =>#t126;
+      #t124.{core::Map::[]=}{Invariant}("bar", dynVar as{TypeError,ForDynamic} core::int*);
+    #t124.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t124;
   core::List<core::int*>* list91 = block {
-    final core::List<core::int*>* #t127 = <core::int*>[];
+    final core::List<core::int*>* #t125 = <core::int*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
       core::Iterator<dynamic>* :sync-for-iterator = (dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*).{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final dynamic #t128 = :sync-for-iterator.{core::Iterator::current};
+        final dynamic #t126 = :sync-for-iterator.{core::Iterator::current};
         {
-          final core::int* #t129 = #t128 as{TypeError} core::int*;
-          #t127.{core::List::add}(#t129);
+          final core::int* #t127 = #t126 as{TypeError} core::int*;
+          #t125.{core::List::add}{Invariant}(#t127);
         }
       }
     }
-  } =>#t127;
+  } =>#t125;
   core::Set<core::int*>* set91 = block {
-    final core::Set<core::int*>* #t130 = new col::_CompactLinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t128 = new col::_CompactLinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
       core::Iterator<dynamic>* :sync-for-iterator = (dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*).{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final dynamic #t131 = :sync-for-iterator.{core::Iterator::current};
+        final dynamic #t129 = :sync-for-iterator.{core::Iterator::current};
         {
-          final core::int* #t132 = #t131 as{TypeError} core::int*;
-          #t130.{core::Set::add}(#t132);
+          final core::int* #t130 = #t129 as{TypeError} core::int*;
+          #t128.{core::Set::add}{Invariant}(#t130);
         }
       }
     }
-    #t130.{core::Set::add}(null);
-  } =>#t130;
+    #t128.{core::Set::add}{Invariant}(null);
+  } =>#t128;
   core::Map<core::String*, core::int*>* map91 = block {
-    final core::Map<core::String*, core::int*>* #t133 = <core::String*, core::int*>{};
+    final core::Map<core::String*, core::int*>* #t131 = <core::String*, core::int*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
       core::Iterator<core::MapEntry<dynamic, dynamic>>* :sync-for-iterator = (dynVar as{TypeError,ForDynamic} core::Map<dynamic, dynamic>*).{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::MapEntry<dynamic, dynamic>* #t134 = :sync-for-iterator.{core::Iterator::current};
+        final core::MapEntry<dynamic, dynamic>* #t132 = :sync-for-iterator.{core::Iterator::current};
         {
-          final core::String* #t135 = #t134.{core::MapEntry::key} as{TypeError} core::String*;
-          final core::int* #t136 = #t134.{core::MapEntry::value} as{TypeError} core::int*;
-          #t133.{core::Map::[]=}(#t135, #t136);
+          final core::String* #t133 = #t132.{core::MapEntry::key} as{TypeError} core::String*;
+          final core::int* #t134 = #t132.{core::MapEntry::value} as{TypeError} core::int*;
+          #t131.{core::Map::[]=}{Invariant}(#t133, #t134);
         }
       }
     }
-    #t133.{core::Map::[]=}("baz", null);
-  } =>#t133;
+    #t131.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t131;
   core::List<core::int*>* list100 = block {
-    final core::List<core::int*>* #t137 = <core::int*>[];
+    final core::List<core::int*>* #t135 = <core::int*>[];
     if(dynVar as{TypeError,ForDynamic} core::bool*)
-      #t137.{core::List::add}(42);
-  } =>#t137;
+      #t135.{core::List::add}{Invariant}(42);
+  } =>#t135;
   core::Set<core::int*>* set100 = block {
-    final core::Set<core::int*>* #t138 = new col::_CompactLinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t136 = new col::_CompactLinkedHashSet::•<core::int*>();
     if(dynVar as{TypeError,ForDynamic} core::bool*)
-      #t138.{core::Set::add}(42);
-  } =>#t138;
+      #t136.{core::Set::add}{Invariant}(42);
+  } =>#t136;
   core::Map<core::int*, core::int*>* map100 = block {
-    final core::Map<core::int*, core::int*>* #t139 = <core::int*, core::int*>{};
+    final core::Map<core::int*, core::int*>* #t137 = <core::int*, core::int*>{};
     if(dynVar as{TypeError,ForDynamic} core::bool*)
-      #t139.{core::Map::[]=}(42, 42);
-  } =>#t139;
+      #t137.{core::Map::[]=}{Invariant}(42, 42);
+  } =>#t137;
 }
 static method testIfElementErrors(core::Map<core::int*, core::int*>* map) → dynamic {
   block {
-    final core::List<core::int*>* #t140 = <core::int*>[];
+    final core::List<core::int*>* #t138 = <core::int*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t140.{core::List::add}(let final<BottomType> #t141 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:87:28: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+      #t138.{core::List::add}{Invariant}(let final<BottomType> #t139 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:87:28: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int>[if (oracle(\"foo\")) \"bar\"];
                            ^" in "bar" as{TypeError} core::int*);
-  } =>#t140;
+  } =>#t138;
   block {
-    final core::Set<core::int*>* #t142 = new col::_CompactLinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t140 = new col::_CompactLinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t142.{core::Set::add}(let final<BottomType> #t143 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:88:28: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+      #t140.{core::Set::add}{Invariant}(let final<BottomType> #t141 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:88:28: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int>{if (oracle(\"foo\")) \"bar\", null};
                            ^" in "bar" as{TypeError} core::int*);
-    #t142.{core::Set::add}(null);
-  } =>#t142;
+    #t140.{core::Set::add}{Invariant}(null);
+  } =>#t140;
   block {
-    final core::Map<core::String*, core::int*>* #t144 = <core::String*, core::int*>{};
+    final core::Map<core::String*, core::int*>* #t142 = <core::String*, core::int*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t144.{core::Map::[]=}("bar", let final<BottomType> #t145 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:89:43: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+      #t142.{core::Map::[]=}{Invariant}("bar", let final<BottomType> #t143 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:89:43: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <String, int>{if (oracle(\"foo\")) \"bar\": \"bar\", \"baz\": null};
                                           ^" in "bar" as{TypeError} core::int*);
-    #t144.{core::Map::[]=}("baz", null);
-  } =>#t144;
+    #t142.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t142;
   block {
-    final core::List<core::int*>* #t146 = <core::int*>[];
+    final core::List<core::int*>* #t144 = <core::int*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
-      core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[let final<BottomType> #t147 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:90:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+      core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[let final<BottomType> #t145 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:90:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int>[if (oracle(\"foo\")) ...[\"bar\"]];
                                ^" in "bar" as{TypeError} core::int*].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::int* #t148 = :sync-for-iterator.{core::Iterator::current};
-        #t146.{core::List::add}(#t148);
+        final core::int* #t146 = :sync-for-iterator.{core::Iterator::current};
+        #t144.{core::List::add}{Invariant}(#t146);
       }
     }
-  } =>#t146;
+  } =>#t144;
   block {
-    final core::Set<core::int*>* #t149 = new col::_CompactLinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t147 = new col::_CompactLinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
-      core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[let final<BottomType> #t150 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:91:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+      core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[let final<BottomType> #t148 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:91:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int>{if (oracle(\"foo\")) ...[\"bar\"], null};
                                ^" in "bar" as{TypeError} core::int*].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::int* #t151 = :sync-for-iterator.{core::Iterator::current};
-        #t149.{core::Set::add}(#t151);
+        final core::int* #t149 = :sync-for-iterator.{core::Iterator::current};
+        #t147.{core::Set::add}{Invariant}(#t149);
       }
     }
-    #t149.{core::Set::add}(null);
-  } =>#t149;
+    #t147.{core::Set::add}{Invariant}(null);
+  } =>#t147;
   block {
-    final core::Map<core::String*, core::int*>* #t152 = <core::String*, core::int*>{};
+    final core::Map<core::String*, core::int*>* #t150 = <core::String*, core::int*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
-      core::Iterator<core::MapEntry<core::String*, core::int*>>* :sync-for-iterator = <core::String*, core::int*>{"bar": let final<BottomType> #t153 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:92:47: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+      core::Iterator<core::MapEntry<core::String*, core::int*>>* :sync-for-iterator = <core::String*, core::int*>{"bar": let final<BottomType> #t151 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:92:47: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <String, int>{if (oracle(\"foo\")) ...{\"bar\": \"bar\"}, \"baz\": null};
                                               ^" in "bar" as{TypeError} core::int*}.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::MapEntry<core::String*, core::int*>* #t154 = :sync-for-iterator.{core::Iterator::current};
-        #t152.{core::Map::[]=}(#t154.{core::MapEntry::key}, #t154.{core::MapEntry::value});
+        final core::MapEntry<core::String*, core::int*>* #t152 = :sync-for-iterator.{core::Iterator::current};
+        #t150.{core::Map::[]=}{Invariant}(#t152.{core::MapEntry::key}, #t152.{core::MapEntry::value});
       }
     }
-    #t152.{core::Map::[]=}("baz", null);
-  } =>#t152;
+    #t150.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t150;
   block {
-    final core::List<core::int*>* #t155 = <core::int*>[];
+    final core::List<core::int*>* #t153 = <core::int*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t155.{core::List::add}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:93:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+      #t153.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:93:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
   <int>[if (oracle(\"foo\")) ...map];
                               ^");
-  } =>#t155;
+  } =>#t153;
   block {
-    final core::Set<core::int*>* #t156 = new col::_CompactLinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t154 = new col::_CompactLinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t156.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:94:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+      #t154.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:94:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
   <int>{if (oracle(\"foo\")) ...map, null};
                               ^");
-    #t156.{core::Set::add}(null);
-  } =>#t156;
+    #t154.{core::Set::add}{Invariant}(null);
+  } =>#t154;
   <core::String*, core::int*>{invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:95:39: Error: Unexpected type 'List<String>' of a map spread entry.  Expected 'dynamic' or a Map.
  - 'List' is from 'dart:core'.
   <String, int>{if (oracle(\"foo\")) ...[\"bar\"], \"baz\": null};
@@ -1290,61 +1300,61 @@
   <String, int>{if (oracle(\"foo\")) ...[\"bar\"], \"baz\": null};
                                       ^": null};
   block {
-    final core::List<core::String*>* #t157 = <core::String*>[];
+    final core::List<core::String*>* #t155 = <core::String*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t157.{core::List::add}(let final<BottomType> #t158 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:96:31: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+      #t155.{core::List::add}{Invariant}(let final<BottomType> #t156 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:96:31: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
   <String>[if (oracle(\"foo\")) 42 else 3.14];
                               ^" in 42 as{TypeError} core::String*);
     else
-      #t157.{core::List::add}(let final<BottomType> #t159 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:96:39: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
+      #t155.{core::List::add}{Invariant}(let final<BottomType> #t157 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:96:39: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
   <String>[if (oracle(\"foo\")) 42 else 3.14];
                                       ^" in 3.14 as{TypeError} core::String*);
-  } =>#t157;
+  } =>#t155;
   block {
-    final core::Set<core::String*>* #t160 = new col::_CompactLinkedHashSet::•<core::String*>();
+    final core::Set<core::String*>* #t158 = new col::_CompactLinkedHashSet::•<core::String*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t160.{core::Set::add}(let final<BottomType> #t161 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:97:31: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+      #t158.{core::Set::add}{Invariant}(let final<BottomType> #t159 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:97:31: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
   <String>{if (oracle(\"foo\")) 42 else 3.14, null};
                               ^" in 42 as{TypeError} core::String*);
     else
-      #t160.{core::Set::add}(let final<BottomType> #t162 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:97:39: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
+      #t158.{core::Set::add}{Invariant}(let final<BottomType> #t160 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:97:39: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
   <String>{if (oracle(\"foo\")) 42 else 3.14, null};
                                       ^" in 3.14 as{TypeError} core::String*);
-    #t160.{core::Set::add}(null);
-  } =>#t160;
+    #t158.{core::Set::add}{Invariant}(null);
+  } =>#t158;
   block {
-    final core::Map<core::String*, core::String*>* #t163 = <core::String*, core::String*>{};
+    final core::Map<core::String*, core::String*>* #t161 = <core::String*, core::String*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t163.{core::Map::[]=}("bar", let final<BottomType> #t164 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:98:46: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+      #t161.{core::Map::[]=}{Invariant}("bar", let final<BottomType> #t162 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:98:46: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
   <String, String>{if (oracle(\"foo\")) \"bar\": 42 else \"baz\": 3.14, \"baz\": null};
                                              ^" in 42 as{TypeError} core::String*);
     else
-      #t163.{core::Map::[]=}("baz", let final<BottomType> #t165 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:98:61: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
+      #t161.{core::Map::[]=}{Invariant}("baz", let final<BottomType> #t163 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:98:61: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
   <String, String>{if (oracle(\"foo\")) \"bar\": 42 else \"baz\": 3.14, \"baz\": null};
                                                             ^" in 3.14 as{TypeError} core::String*);
-    #t163.{core::Map::[]=}("baz", null);
-  } =>#t163;
+    #t161.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t161;
   block {
-    final core::List<core::int*>* #t166 = <core::int*>[];
+    final core::List<core::int*>* #t164 = <core::int*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t166.{core::List::add}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:99:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+      #t164.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:99:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
   <int>[if (oracle(\"foo\")) ...map else 42];
                               ^");
     else
-      #t166.{core::List::add}(42);
-  } =>#t166;
+      #t164.{core::List::add}{Invariant}(42);
+  } =>#t164;
   block {
-    final core::Set<core::int*>* #t167 = new col::_CompactLinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t165 = new col::_CompactLinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t167.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:100:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+      #t165.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:100:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
   <int>{if (oracle(\"foo\")) ...map else 42, null};
                               ^");
     else
-      #t167.{core::Set::add}(42);
-    #t167.{core::Set::add}(null);
-  } =>#t167;
+      #t165.{core::Set::add}{Invariant}(42);
+    #t165.{core::Set::add}{Invariant}(null);
+  } =>#t165;
   <core::String*, core::int*>{invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:101:39: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
  - 'List' is from 'dart:core'.
   <String, int>{if (oracle(\"foo\")) ...[42] else \"bar\": 42, \"baz\": null};
@@ -1353,26 +1363,26 @@
   <String, int>{if (oracle(\"foo\")) ...[42] else \"bar\": 42, \"baz\": null};
                                       ^": null};
   block {
-    final core::List<core::int*>* #t168 = <core::int*>[];
+    final core::List<core::int*>* #t166 = <core::int*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t168.{core::List::add}(42);
+      #t166.{core::List::add}{Invariant}(42);
     else
-      #t168.{core::List::add}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:102:39: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+      #t166.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:102:39: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
   <int>[if (oracle(\"foo\")) 42 else ...map];
                                       ^");
-  } =>#t168;
+  } =>#t166;
   block {
-    final core::Set<core::int*>* #t169 = new col::_CompactLinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t167 = new col::_CompactLinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t169.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:103:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+      #t167.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:103:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
   <int>{if (oracle(\"foo\")) ...map else 42, null};
                               ^");
     else
-      #t169.{core::Set::add}(42);
-    #t169.{core::Set::add}(null);
-  } =>#t169;
+      #t167.{core::Set::add}{Invariant}(42);
+    #t167.{core::Set::add}{Invariant}(null);
+  } =>#t167;
   <core::String*, core::int*>{invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:104:54: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
  - 'List' is from 'dart:core'.
   <String, int>{if (oracle(\"foo\")) \"bar\": 42 else ...[42], \"baz\": null};
@@ -1392,934 +1402,945 @@
   core::Map<dynamic, dynamic>* map11 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:109:70: Error: Expected ':' after this.
   Map<dynamic, dynamic> map11 = {if (oracle(\"foo\")) \"bar\": 3.14 else 42};
                                                                      ^": null};
-  core::Map<dynamic, core::Null?>* map12 = <dynamic, core::Null?>{invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:110:35: Error: Expected ':' after this.
+  core::Map<dynamic, Null>* map12 = <dynamic, Null>{invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:110:35: Error: Expected ':' after this.
   var map12 = {if (oracle(\"foo\")) 42 else \"bar\": 3.14};
                                   ^": null};
-  core::Map<dynamic, core::Null?>* map13 = <dynamic, core::Null?>{invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:111:52: Error: Expected ':' after this.
+  core::Map<dynamic, Null>* map13 = <dynamic, Null>{invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:111:52: Error: Expected ':' after this.
   var map13 = {if (oracle(\"foo\")) \"bar\": 3.14 else 42};
                                                    ^": null};
   core::List<core::int*>* list20 = block {
-    final core::List<core::int*>* #t170 = <core::int*>[];
-    if(let final<BottomType> #t171 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:112:27: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
+    final core::List<core::int*>* #t168 = <core::int*>[];
+    if(let final<BottomType> #t169 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:112:27: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
   List<int> list20 = [if (42) 42];
                           ^" in 42 as{TypeError} core::bool*)
-      #t170.{core::List::add}(42);
-  } =>#t170;
+      #t168.{core::List::add}{Invariant}(42);
+  } =>#t168;
   core::Set<core::int*>* set20 = block {
-    final core::Set<core::int*>* #t172 = new col::_CompactLinkedHashSet::•<core::int*>();
-    if(let final<BottomType> #t173 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:113:25: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
+    final core::Set<core::int*>* #t170 = new col::_CompactLinkedHashSet::•<core::int*>();
+    if(let final<BottomType> #t171 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:113:25: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
   Set<int> set20 = {if (42) 42};
                         ^" in 42 as{TypeError} core::bool*)
-      #t172.{core::Set::add}(42);
-  } =>#t172;
+      #t170.{core::Set::add}{Invariant}(42);
+  } =>#t170;
   core::Map<core::int*, core::int*>* map30 = block {
-    final core::Map<core::int*, core::int*>* #t174 = <core::int*, core::int*>{};
-    if(let final<BottomType> #t175 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:114:30: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
+    final core::Map<core::int*, core::int*>* #t172 = <core::int*, core::int*>{};
+    if(let final<BottomType> #t173 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:114:30: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
   Map<int, int> map30 = {if (42) 42: 42};
                              ^" in 42 as{TypeError} core::bool*)
-      #t174.{core::Map::[]=}(42, 42);
-  } =>#t174;
+      #t172.{core::Map::[]=}{Invariant}(42, 42);
+  } =>#t172;
   core::List<core::String*>* list40 = block {
-    final core::List<core::String*>* #t176 = <core::String*>[];
+    final core::List<core::String*>* #t174 = <core::String*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t176.{core::List::add}(let final<BottomType> #t177 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:115:53: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
+      #t174.{core::List::add}{Invariant}(let final<BottomType> #t175 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:115:53: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
   List<String> list40 = <String>[if (oracle(\"foo\")) true else 42];
                                                     ^" in true as{TypeError} core::String*);
     else
-      #t176.{core::List::add}(let final<BottomType> #t178 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:115:63: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+      #t174.{core::List::add}{Invariant}(let final<BottomType> #t176 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:115:63: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
   List<String> list40 = <String>[if (oracle(\"foo\")) true else 42];
                                                               ^" in 42 as{TypeError} core::String*);
-  } =>#t176;
+  } =>#t174;
   core::Set<core::String*>* set40 = block {
-    final core::Set<core::String*>* #t179 = new col::_CompactLinkedHashSet::•<core::String*>();
+    final core::Set<core::String*>* #t177 = new col::_CompactLinkedHashSet::•<core::String*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t179.{core::Set::add}(let final<BottomType> #t180 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:116:51: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
+      #t177.{core::Set::add}{Invariant}(let final<BottomType> #t178 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:116:51: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
   Set<String> set40 = <String>{if (oracle(\"foo\")) true else 42};
                                                   ^" in true as{TypeError} core::String*);
     else
-      #t179.{core::Set::add}(let final<BottomType> #t181 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:116:61: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+      #t177.{core::Set::add}{Invariant}(let final<BottomType> #t179 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:116:61: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
   Set<String> set40 = <String>{if (oracle(\"foo\")) true else 42};
                                                             ^" in 42 as{TypeError} core::String*);
-  } =>#t179;
+  } =>#t177;
   core::Map<core::String*, core::int*>* map40 = block {
-    final core::Map<core::String*, core::int*>* #t182 = <core::String*, core::int*>{};
+    final core::Map<core::String*, core::int*>* #t180 = <core::String*, core::int*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t182.{core::Map::[]=}(let final<BottomType> #t183 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:117:61: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
+      #t180.{core::Map::[]=}{Invariant}(let final<BottomType> #t181 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:117:61: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
   Map<String, int> map40 = <String, int>{if (oracle(\"foo\")) true: 42 else 42: 42};
                                                             ^" in true as{TypeError} core::String*, 42);
     else
-      #t182.{core::Map::[]=}(let final<BottomType> #t184 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:117:75: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+      #t180.{core::Map::[]=}{Invariant}(let final<BottomType> #t182 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:117:75: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
   Map<String, int> map40 = <String, int>{if (oracle(\"foo\")) true: 42 else 42: 42};
                                                                           ^" in 42 as{TypeError} core::String*, 42);
-  } =>#t182;
+  } =>#t180;
   core::Map<core::int*, core::String*>* map41 = block {
-    final core::Map<core::int*, core::String*>* #t185 = <core::int*, core::String*>{};
+    final core::Map<core::int*, core::String*>* #t183 = <core::int*, core::String*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t185.{core::Map::[]=}(42, let final<BottomType> #t186 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:118:65: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
+      #t183.{core::Map::[]=}{Invariant}(42, let final<BottomType> #t184 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:118:65: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
   Map<int, String> map41 = <int, String>{if (oracle(\"foo\")) 42: true else 42: 42};
                                                                 ^" in true as{TypeError} core::String*);
     else
-      #t185.{core::Map::[]=}(42, let final<BottomType> #t187 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:118:79: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+      #t183.{core::Map::[]=}{Invariant}(42, let final<BottomType> #t185 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:118:79: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
   Map<int, String> map41 = <int, String>{if (oracle(\"foo\")) 42: true else 42: 42};
                                                                               ^" in 42 as{TypeError} core::String*);
-  } =>#t185;
+  } =>#t183;
 }
 static method testForElement(dynamic dynVar, core::List<core::int*>* listInt, core::List<core::double*>* listDouble, core::int* index, core::Map<core::String*, core::int*>* mapStringInt, core::Map<core::String*, core::double*>* mapStringDouble) → dynamic {
   core::List<core::int*>* list10 = block {
-    final core::List<core::int*>* #t188 = <core::int*>[];
+    final core::List<core::int*>* #t186 = <core::int*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      #t188.{core::List::add}(42);
-  } =>#t188;
+      #t186.{core::List::add}{Invariant}(42);
+  } =>#t186;
   core::Set<core::int*>* set10 = block {
-    final core::Set<core::int*>* #t189 = new col::_CompactLinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t187 = new col::_CompactLinkedHashSet::•<core::int*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      #t189.{core::Set::add}(42);
-    #t189.{core::Set::add}(null);
-  } =>#t189;
+      #t187.{core::Set::add}{Invariant}(42);
+    #t187.{core::Set::add}{Invariant}(null);
+  } =>#t187;
   core::Map<core::String*, core::int*>* map10 = block {
-    final core::Map<core::String*, core::int*>* #t190 = <core::String*, core::int*>{};
+    final core::Map<core::String*, core::int*>* #t188 = <core::String*, core::int*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      #t190.{core::Map::[]=}("bar", 42);
-    #t190.{core::Map::[]=}("baz", null);
-  } =>#t190;
+      #t188.{core::Map::[]=}{Invariant}("bar", 42);
+    #t188.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t188;
   core::List<dynamic>* list11 = block {
-    final core::List<dynamic>* #t191 = <dynamic>[];
+    final core::List<dynamic>* #t189 = <dynamic>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      #t191.{core::List::add}(dynVar);
-  } =>#t191;
+      #t189.{core::List::add}{Invariant}(dynVar);
+  } =>#t189;
   core::Set<dynamic>* set11 = block {
-    final core::Set<dynamic>* #t192 = new col::_CompactLinkedHashSet::•<dynamic>();
+    final core::Set<dynamic>* #t190 = new col::_CompactLinkedHashSet::•<dynamic>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      #t192.{core::Set::add}(dynVar);
-    #t192.{core::Set::add}(null);
-  } =>#t192;
+      #t190.{core::Set::add}{Invariant}(dynVar);
+    #t190.{core::Set::add}{Invariant}(null);
+  } =>#t190;
   core::Map<core::String*, dynamic>* map11 = block {
-    final core::Map<core::String*, dynamic>* #t193 = <core::String*, dynamic>{};
+    final core::Map<core::String*, dynamic>* #t191 = <core::String*, dynamic>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      #t193.{core::Map::[]=}("bar", dynVar);
-    #t193.{core::Map::[]=}("baz", null);
-  } =>#t193;
+      #t191.{core::Map::[]=}{Invariant}("bar", dynVar);
+    #t191.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t191;
   core::List<core::List<core::int*>*>* list12 = block {
-    final core::List<core::List<core::int*>*>* #t194 = <core::List<core::int*>*>[];
+    final core::List<core::List<core::int*>*>* #t192 = <core::List<core::int*>*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      #t194.{core::List::add}(<core::int*>[42]);
-  } =>#t194;
+      #t192.{core::List::add}{Invariant}(<core::int*>[42]);
+  } =>#t192;
   core::Set<core::List<core::int*>*>* set12 = block {
-    final core::Set<core::List<core::int*>*>* #t195 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
+    final core::Set<core::List<core::int*>*>* #t193 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      #t195.{core::Set::add}(<core::int*>[42]);
-    #t195.{core::Set::add}(null);
-  } =>#t195;
+      #t193.{core::Set::add}{Invariant}(<core::int*>[42]);
+    #t193.{core::Set::add}{Invariant}(null);
+  } =>#t193;
   core::Map<core::String*, core::List<core::int*>*>* map12 = block {
-    final core::Map<core::String*, core::List<core::int*>*>* #t196 = <core::String*, core::List<core::int*>*>{};
+    final core::Map<core::String*, core::List<core::int*>*>* #t194 = <core::String*, core::List<core::int*>*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      #t196.{core::Map::[]=}("bar", <core::int*>[42]);
-    #t196.{core::Map::[]=}("baz", null);
-  } =>#t196;
+      #t194.{core::Map::[]=}{Invariant}("bar", <core::int*>[42]);
+    #t194.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t194;
   core::List<core::int*>* list20 = block {
-    final core::List<core::int*>* #t197 = <core::int*>[];
+    final core::List<core::int*>* #t195 = <core::int*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
+      core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[42].{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::int* #t196 = :sync-for-iterator.{core::Iterator::current};
+        #t195.{core::List::add}{Invariant}(#t196);
+      }
+    }
+  } =>#t195;
+  core::Set<core::int*>* set20 = block {
+    final core::Set<core::int*>* #t197 = new col::_CompactLinkedHashSet::•<core::int*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
       core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[42].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::int* #t198 = :sync-for-iterator.{core::Iterator::current};
-        #t197.{core::List::add}(#t198);
+        #t197.{core::Set::add}{Invariant}(#t198);
       }
     }
+    #t197.{core::Set::add}{Invariant}(null);
   } =>#t197;
-  core::Set<core::int*>* set20 = block {
-    final core::Set<core::int*>* #t199 = new col::_CompactLinkedHashSet::•<core::int*>();
-    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
-      core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[42].{core::Iterable::iterator};
-      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::int* #t200 = :sync-for-iterator.{core::Iterator::current};
-        #t199.{core::Set::add}(#t200);
-      }
-    }
-    #t199.{core::Set::add}(null);
-  } =>#t199;
   core::Map<core::String*, core::int*>* map20 = block {
-    final core::Map<core::String*, core::int*>* #t201 = <core::String*, core::int*>{};
+    final core::Map<core::String*, core::int*>* #t199 = <core::String*, core::int*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
       core::Iterator<core::MapEntry<core::String*, core::int*>>* :sync-for-iterator = <core::String*, core::int*>{"bar": 42}.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::MapEntry<core::String*, core::int*>* #t202 = :sync-for-iterator.{core::Iterator::current};
-        #t201.{core::Map::[]=}(#t202.{core::MapEntry::key}, #t202.{core::MapEntry::value});
+        final core::MapEntry<core::String*, core::int*>* #t200 = :sync-for-iterator.{core::Iterator::current};
+        #t199.{core::Map::[]=}{Invariant}(#t200.{core::MapEntry::key}, #t200.{core::MapEntry::value});
       }
     }
-    #t201.{core::Map::[]=}("baz", null);
-  } =>#t201;
+    #t199.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t199;
   core::List<dynamic>* list21 = block {
-    final core::List<dynamic>* #t203 = <dynamic>[];
+    final core::List<dynamic>* #t201 = <dynamic>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
+      core::Iterator<dynamic>* :sync-for-iterator = <dynamic>[dynVar].{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final dynamic #t202 = :sync-for-iterator.{core::Iterator::current};
+        #t201.{core::List::add}{Invariant}(#t202);
+      }
+    }
+  } =>#t201;
+  core::Set<dynamic>* set21 = block {
+    final core::Set<dynamic>* #t203 = new col::_CompactLinkedHashSet::•<dynamic>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
       core::Iterator<dynamic>* :sync-for-iterator = <dynamic>[dynVar].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final dynamic #t204 = :sync-for-iterator.{core::Iterator::current};
-        #t203.{core::List::add}(#t204);
+        #t203.{core::Set::add}{Invariant}(#t204);
       }
     }
+    #t203.{core::Set::add}{Invariant}(null);
   } =>#t203;
-  core::Set<dynamic>* set21 = block {
-    final core::Set<dynamic>* #t205 = new col::_CompactLinkedHashSet::•<dynamic>();
-    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
-      core::Iterator<dynamic>* :sync-for-iterator = <dynamic>[dynVar].{core::Iterable::iterator};
-      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final dynamic #t206 = :sync-for-iterator.{core::Iterator::current};
-        #t205.{core::Set::add}(#t206);
-      }
-    }
-    #t205.{core::Set::add}(null);
-  } =>#t205;
   core::Map<core::String*, dynamic>* map21 = block {
-    final core::Map<core::String*, dynamic>* #t207 = <core::String*, dynamic>{};
+    final core::Map<core::String*, dynamic>* #t205 = <core::String*, dynamic>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
       core::Iterator<core::MapEntry<core::String*, dynamic>>* :sync-for-iterator = <core::String*, dynamic>{"bar": dynVar}.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::MapEntry<core::String*, dynamic>* #t208 = :sync-for-iterator.{core::Iterator::current};
-        #t207.{core::Map::[]=}(#t208.{core::MapEntry::key}, #t208.{core::MapEntry::value});
+        final core::MapEntry<core::String*, dynamic>* #t206 = :sync-for-iterator.{core::Iterator::current};
+        #t205.{core::Map::[]=}{Invariant}(#t206.{core::MapEntry::key}, #t206.{core::MapEntry::value});
       }
     }
-    #t207.{core::Map::[]=}("baz", null);
-  } =>#t207;
+    #t205.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t205;
   core::List<core::List<core::int*>*>* list22 = block {
-    final core::List<core::List<core::int*>*>* #t209 = <core::List<core::int*>*>[];
+    final core::List<core::List<core::int*>*>* #t207 = <core::List<core::int*>*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
+      core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[42]].{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::List<core::int*>* #t208 = :sync-for-iterator.{core::Iterator::current};
+        #t207.{core::List::add}{Invariant}(#t208);
+      }
+    }
+  } =>#t207;
+  core::Set<core::List<core::int*>*>* set22 = block {
+    final core::Set<core::List<core::int*>*>* #t209 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
       core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[42]].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::List<core::int*>* #t210 = :sync-for-iterator.{core::Iterator::current};
-        #t209.{core::List::add}(#t210);
+        #t209.{core::Set::add}{Invariant}(#t210);
       }
     }
+    #t209.{core::Set::add}{Invariant}(null);
   } =>#t209;
-  core::Set<core::List<core::int*>*>* set22 = block {
-    final core::Set<core::List<core::int*>*>* #t211 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
-    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
-      core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[42]].{core::Iterable::iterator};
-      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::List<core::int*>* #t212 = :sync-for-iterator.{core::Iterator::current};
-        #t211.{core::Set::add}(#t212);
-      }
-    }
-    #t211.{core::Set::add}(null);
-  } =>#t211;
   core::Map<core::String*, core::List<core::int*>*>* map22 = block {
-    final core::Map<core::String*, core::List<core::int*>*>* #t213 = <core::String*, core::List<core::int*>*>{};
+    final core::Map<core::String*, core::List<core::int*>*>* #t211 = <core::String*, core::List<core::int*>*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
       core::Iterator<core::MapEntry<core::String*, core::List<core::int*>*>>* :sync-for-iterator = <core::String*, core::List<core::int*>*>{"bar": <core::int*>[42]}.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::MapEntry<core::String*, core::List<core::int*>*>* #t214 = :sync-for-iterator.{core::Iterator::current};
-        #t213.{core::Map::[]=}(#t214.{core::MapEntry::key}, #t214.{core::MapEntry::value});
+        final core::MapEntry<core::String*, core::List<core::int*>*>* #t212 = :sync-for-iterator.{core::Iterator::current};
+        #t211.{core::Map::[]=}{Invariant}(#t212.{core::MapEntry::key}, #t212.{core::MapEntry::value});
       }
     }
-    #t213.{core::Map::[]=}("baz", null);
-  } =>#t213;
+    #t211.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t211;
   core::List<core::int*>* list30 = block {
-    final core::List<core::int*>* #t215 = <core::int*>[];
+    final core::List<core::int*>* #t213 = <core::int*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
+        core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[42].{core::Iterable::iterator};
+        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+          final core::int* #t214 = :sync-for-iterator.{core::Iterator::current};
+          #t213.{core::List::add}{Invariant}(#t214);
+        }
+      }
+  } =>#t213;
+  core::Set<core::int*>* set30 = block {
+    final core::Set<core::int*>* #t215 = new col::_CompactLinkedHashSet::•<core::int*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
         core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[42].{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
           final core::int* #t216 = :sync-for-iterator.{core::Iterator::current};
-          #t215.{core::List::add}(#t216);
+          #t215.{core::Set::add}{Invariant}(#t216);
         }
       }
+    #t215.{core::Set::add}{Invariant}(null);
   } =>#t215;
-  core::Set<core::int*>* set30 = block {
-    final core::Set<core::int*>* #t217 = new col::_CompactLinkedHashSet::•<core::int*>();
-    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
-        core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[42].{core::Iterable::iterator};
-        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final core::int* #t218 = :sync-for-iterator.{core::Iterator::current};
-          #t217.{core::Set::add}(#t218);
-        }
-      }
-    #t217.{core::Set::add}(null);
-  } =>#t217;
   core::Map<core::String*, core::int*>* map30 = block {
-    final core::Map<core::String*, core::int*>* #t219 = <core::String*, core::int*>{};
+    final core::Map<core::String*, core::int*>* #t217 = <core::String*, core::int*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
         core::Iterator<core::MapEntry<core::String*, core::int*>>* :sync-for-iterator = <core::String*, core::int*>{"bar": 42}.{core::Map::entries}.{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final core::MapEntry<core::String*, core::int*>* #t220 = :sync-for-iterator.{core::Iterator::current};
-          #t219.{core::Map::[]=}(#t220.{core::MapEntry::key}, #t220.{core::MapEntry::value});
+          final core::MapEntry<core::String*, core::int*>* #t218 = :sync-for-iterator.{core::Iterator::current};
+          #t217.{core::Map::[]=}{Invariant}(#t218.{core::MapEntry::key}, #t218.{core::MapEntry::value});
         }
       }
-    #t219.{core::Map::[]=}("baz", null);
-  } =>#t219;
+    #t217.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t217;
   core::List<dynamic>* list31 = block {
-    final core::List<dynamic>* #t221 = <dynamic>[];
+    final core::List<dynamic>* #t219 = <dynamic>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
+        core::Iterator<dynamic>* :sync-for-iterator = <dynamic>[dynVar].{core::Iterable::iterator};
+        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+          final dynamic #t220 = :sync-for-iterator.{core::Iterator::current};
+          #t219.{core::List::add}{Invariant}(#t220);
+        }
+      }
+  } =>#t219;
+  core::Set<dynamic>* set31 = block {
+    final core::Set<dynamic>* #t221 = new col::_CompactLinkedHashSet::•<dynamic>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
         core::Iterator<dynamic>* :sync-for-iterator = <dynamic>[dynVar].{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
           final dynamic #t222 = :sync-for-iterator.{core::Iterator::current};
-          #t221.{core::List::add}(#t222);
+          #t221.{core::Set::add}{Invariant}(#t222);
         }
       }
+    #t221.{core::Set::add}{Invariant}(null);
   } =>#t221;
-  core::Set<dynamic>* set31 = block {
-    final core::Set<dynamic>* #t223 = new col::_CompactLinkedHashSet::•<dynamic>();
-    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
-        core::Iterator<dynamic>* :sync-for-iterator = <dynamic>[dynVar].{core::Iterable::iterator};
-        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final dynamic #t224 = :sync-for-iterator.{core::Iterator::current};
-          #t223.{core::Set::add}(#t224);
-        }
-      }
-    #t223.{core::Set::add}(null);
-  } =>#t223;
   core::Map<core::String*, dynamic>* map31 = block {
-    final core::Map<core::String*, dynamic>* #t225 = <core::String*, dynamic>{};
+    final core::Map<core::String*, dynamic>* #t223 = <core::String*, dynamic>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
         core::Iterator<core::MapEntry<core::String*, dynamic>>* :sync-for-iterator = <core::String*, dynamic>{"bar": dynVar}.{core::Map::entries}.{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final core::MapEntry<core::String*, dynamic>* #t226 = :sync-for-iterator.{core::Iterator::current};
-          #t225.{core::Map::[]=}(#t226.{core::MapEntry::key}, #t226.{core::MapEntry::value});
+          final core::MapEntry<core::String*, dynamic>* #t224 = :sync-for-iterator.{core::Iterator::current};
+          #t223.{core::Map::[]=}{Invariant}(#t224.{core::MapEntry::key}, #t224.{core::MapEntry::value});
         }
       }
-    #t225.{core::Map::[]=}("baz", null);
-  } =>#t225;
+    #t223.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t223;
   core::List<core::List<core::int*>*>* list33 = block {
-    final core::List<core::List<core::int*>*>* #t227 = <core::List<core::int*>*>[];
+    final core::List<core::List<core::int*>*>* #t225 = <core::List<core::int*>*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
+        core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[42]].{core::Iterable::iterator};
+        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+          final core::List<core::int*>* #t226 = :sync-for-iterator.{core::Iterator::current};
+          #t225.{core::List::add}{Invariant}(#t226);
+        }
+      }
+  } =>#t225;
+  core::Set<core::List<core::int*>*>* set33 = block {
+    final core::Set<core::List<core::int*>*>* #t227 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
         core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[42]].{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
           final core::List<core::int*>* #t228 = :sync-for-iterator.{core::Iterator::current};
-          #t227.{core::List::add}(#t228);
+          #t227.{core::Set::add}{Invariant}(#t228);
         }
       }
+    #t227.{core::Set::add}{Invariant}(null);
   } =>#t227;
-  core::Set<core::List<core::int*>*>* set33 = block {
-    final core::Set<core::List<core::int*>*>* #t229 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
-    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
-        core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[42]].{core::Iterable::iterator};
-        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final core::List<core::int*>* #t230 = :sync-for-iterator.{core::Iterator::current};
-          #t229.{core::Set::add}(#t230);
-        }
-      }
-    #t229.{core::Set::add}(null);
-  } =>#t229;
   core::Map<core::String*, core::List<core::int*>*>* map33 = block {
-    final core::Map<core::String*, core::List<core::int*>*>* #t231 = <core::String*, core::List<core::int*>*>{};
+    final core::Map<core::String*, core::List<core::int*>*>* #t229 = <core::String*, core::List<core::int*>*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
         core::Iterator<core::MapEntry<core::String*, core::List<core::int*>*>>* :sync-for-iterator = <core::String*, core::List<core::int*>*>{"bar": <core::int*>[42]}.{core::Map::entries}.{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final core::MapEntry<core::String*, core::List<core::int*>*>* #t232 = :sync-for-iterator.{core::Iterator::current};
-          #t231.{core::Map::[]=}(#t232.{core::MapEntry::key}, #t232.{core::MapEntry::value});
+          final core::MapEntry<core::String*, core::List<core::int*>*>* #t230 = :sync-for-iterator.{core::Iterator::current};
+          #t229.{core::Map::[]=}{Invariant}(#t230.{core::MapEntry::key}, #t230.{core::MapEntry::value});
         }
       }
-    #t231.{core::Map::[]=}("baz", null);
-  } =>#t231;
+    #t229.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t229;
   core::List<core::List<core::int*>*>* list40 = block {
-    final core::List<core::List<core::int*>*>* #t233 = <core::List<core::int*>*>[];
+    final core::List<core::List<core::int*>*>* #t231 = <core::List<core::int*>*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
+      core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::List<core::int*>* #t232 = :sync-for-iterator.{core::Iterator::current};
+        #t231.{core::List::add}{Invariant}(#t232);
+      }
+    }
+  } =>#t231;
+  core::Set<core::List<core::int*>*>* set40 = block {
+    final core::Set<core::List<core::int*>*>* #t233 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
       core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::List<core::int*>* #t234 = :sync-for-iterator.{core::Iterator::current};
-        #t233.{core::List::add}(#t234);
+        #t233.{core::Set::add}{Invariant}(#t234);
       }
     }
+    #t233.{core::Set::add}{Invariant}(null);
   } =>#t233;
-  core::Set<core::List<core::int*>*>* set40 = block {
-    final core::Set<core::List<core::int*>*>* #t235 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
-    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
-      core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
-      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::List<core::int*>* #t236 = :sync-for-iterator.{core::Iterator::current};
-        #t235.{core::Set::add}(#t236);
-      }
-    }
-    #t235.{core::Set::add}(null);
-  } =>#t235;
   core::Map<core::String*, core::List<core::int*>*>* map40 = block {
-    final core::Map<core::String*, core::List<core::int*>*>* #t237 = <core::String*, core::List<core::int*>*>{};
+    final core::Map<core::String*, core::List<core::int*>*>* #t235 = <core::String*, core::List<core::int*>*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
       core::Iterator<core::MapEntry<core::String*, core::List<core::int*>*>>* :sync-for-iterator = <core::String*, core::List<core::int*>*>{"bar": <core::int*>[]}.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::MapEntry<core::String*, core::List<core::int*>*>* #t238 = :sync-for-iterator.{core::Iterator::current};
-        #t237.{core::Map::[]=}(#t238.{core::MapEntry::key}, #t238.{core::MapEntry::value});
+        final core::MapEntry<core::String*, core::List<core::int*>*>* #t236 = :sync-for-iterator.{core::Iterator::current};
+        #t235.{core::Map::[]=}{Invariant}(#t236.{core::MapEntry::key}, #t236.{core::MapEntry::value});
       }
     }
-    #t237.{core::Map::[]=}("baz", null);
-  } =>#t237;
+    #t235.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t235;
   core::List<core::List<core::int*>*>* list41 = block {
-    final core::List<core::List<core::int*>*>* #t239 = <core::List<core::int*>*>[];
+    final core::List<core::List<core::int*>*>* #t237 = <core::List<core::int*>*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
-      core::Iterator<core::List<core::int*>*>* :sync-for-iterator = (let final core::Set<core::List<core::int*>*>* #t240 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>() in let final core::bool #t241 = #t240.{core::Set::add}(<core::int*>[]) in #t240).{core::Iterable::iterator};
+      core::Iterator<core::List<core::int*>*>* :sync-for-iterator = ( block {
+        final core::Set<core::List<core::int*>*>* #t238 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
+        #t238.{core::Set::add}{Invariant}(<core::int*>[]);
+      } =>#t238).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::List<core::int*>* #t239 = :sync-for-iterator.{core::Iterator::current};
+        #t237.{core::List::add}{Invariant}(#t239);
+      }
+    }
+  } =>#t237;
+  core::Set<core::List<core::int*>*>* set41 = block {
+    final core::Set<core::List<core::int*>*>* #t240 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
+      core::Iterator<core::List<core::int*>*>* :sync-for-iterator = ( block {
+        final core::Set<core::List<core::int*>*>* #t241 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
+        #t241.{core::Set::add}{Invariant}(<core::int*>[]);
+      } =>#t241).{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::List<core::int*>* #t242 = :sync-for-iterator.{core::Iterator::current};
-        #t239.{core::List::add}(#t242);
+        #t240.{core::Set::add}{Invariant}(#t242);
       }
     }
-  } =>#t239;
-  core::Set<core::List<core::int*>*>* set41 = block {
-    final core::Set<core::List<core::int*>*>* #t243 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
-    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
-      core::Iterator<core::List<core::int*>*>* :sync-for-iterator = (let final core::Set<core::List<core::int*>*>* #t244 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>() in let final core::bool #t245 = #t244.{core::Set::add}(<core::int*>[]) in #t244).{core::Iterable::iterator};
-      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::List<core::int*>* #t246 = :sync-for-iterator.{core::Iterator::current};
-        #t243.{core::Set::add}(#t246);
-      }
-    }
-    #t243.{core::Set::add}(null);
-  } =>#t243;
+    #t240.{core::Set::add}{Invariant}(null);
+  } =>#t240;
   core::List<core::List<core::int*>*>* list42 = block {
-    final core::List<core::List<core::int*>*>* #t247 = <core::List<core::int*>*>[];
+    final core::List<core::List<core::int*>*>* #t243 = <core::List<core::int*>*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
         core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final core::List<core::int*>* #t248 = :sync-for-iterator.{core::Iterator::current};
-          #t247.{core::List::add}(#t248);
+          final core::List<core::int*>* #t244 = :sync-for-iterator.{core::Iterator::current};
+          #t243.{core::List::add}{Invariant}(#t244);
         }
       }
-  } =>#t247;
+  } =>#t243;
   core::Set<core::List<core::int*>*>* set42 = block {
-    final core::Set<core::List<core::int*>*>* #t249 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
+    final core::Set<core::List<core::int*>*>* #t245 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
         core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final core::List<core::int*>* #t250 = :sync-for-iterator.{core::Iterator::current};
-          #t249.{core::Set::add}(#t250);
+          final core::List<core::int*>* #t246 = :sync-for-iterator.{core::Iterator::current};
+          #t245.{core::Set::add}{Invariant}(#t246);
         }
       }
-    #t249.{core::Set::add}(null);
-  } =>#t249;
+    #t245.{core::Set::add}{Invariant}(null);
+  } =>#t245;
   core::Map<core::String*, core::List<core::int*>*>* map42 = block {
-    final core::Map<core::String*, core::List<core::int*>*>* #t251 = <core::String*, core::List<core::int*>*>{};
+    final core::Map<core::String*, core::List<core::int*>*>* #t247 = <core::String*, core::List<core::int*>*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
         core::Iterator<core::MapEntry<core::String*, core::List<core::int*>*>>* :sync-for-iterator = <core::String*, core::List<core::int*>*>{"bar": <core::int*>[]}.{core::Map::entries}.{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final core::MapEntry<core::String*, core::List<core::int*>*>* #t252 = :sync-for-iterator.{core::Iterator::current};
-          #t251.{core::Map::[]=}(#t252.{core::MapEntry::key}, #t252.{core::MapEntry::value});
+          final core::MapEntry<core::String*, core::List<core::int*>*>* #t248 = :sync-for-iterator.{core::Iterator::current};
+          #t247.{core::Map::[]=}{Invariant}(#t248.{core::MapEntry::key}, #t248.{core::MapEntry::value});
         }
       }
-    #t251.{core::Map::[]=}("baz", null);
-  } =>#t251;
+    #t247.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t247;
   core::List<core::int*>* list50 = block {
-    final core::List<core::int*>* #t253 = <core::int*>[];
+    final core::List<core::int*>* #t249 = <core::int*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
       core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::int* #t254 = :sync-for-iterator.{core::Iterator::current};
-        #t253.{core::List::add}(#t254);
+        final core::int* #t250 = :sync-for-iterator.{core::Iterator::current};
+        #t249.{core::List::add}{Invariant}(#t250);
       }
     }
-  } =>#t253;
+  } =>#t249;
   core::Set<core::int*>* set50 = block {
-    final core::Set<core::int*>* #t255 = new col::_CompactLinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t251 = new col::_CompactLinkedHashSet::•<core::int*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
       core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::int* #t256 = :sync-for-iterator.{core::Iterator::current};
-        #t255.{core::Set::add}(#t256);
+        final core::int* #t252 = :sync-for-iterator.{core::Iterator::current};
+        #t251.{core::Set::add}{Invariant}(#t252);
       }
     }
-    #t255.{core::Set::add}(null);
-  } =>#t255;
+    #t251.{core::Set::add}{Invariant}(null);
+  } =>#t251;
   core::Map<core::String*, core::int*>* map50 = block {
-    final core::Map<core::String*, core::int*>* #t257 = <core::String*, core::int*>{};
+    final core::Map<core::String*, core::int*>* #t253 = <core::String*, core::int*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
       core::Iterator<core::MapEntry<core::String*, core::int*>>* :sync-for-iterator = <core::String*, core::int*>{}.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::MapEntry<core::String*, core::int*>* #t258 = :sync-for-iterator.{core::Iterator::current};
-        #t257.{core::Map::[]=}(#t258.{core::MapEntry::key}, #t258.{core::MapEntry::value});
+        final core::MapEntry<core::String*, core::int*>* #t254 = :sync-for-iterator.{core::Iterator::current};
+        #t253.{core::Map::[]=}{Invariant}(#t254.{core::MapEntry::key}, #t254.{core::MapEntry::value});
       }
     }
-    #t257.{core::Map::[]=}("baz", null);
-  } =>#t257;
+    #t253.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t253;
   core::List<core::int*>* list51 = block {
-    final core::List<core::int*>* #t259 = <core::int*>[];
+    final core::List<core::int*>* #t255 = <core::int*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
-      core::Iterator<core::int*>* :sync-for-iterator = (let final core::Set<core::int*>* #t260 = new col::_CompactLinkedHashSet::•<core::int*>() in #t260).{core::Iterable::iterator};
+      core::Iterator<core::int*>* :sync-for-iterator = ( block {
+        final core::Set<core::int*>* #t256 = new col::_CompactLinkedHashSet::•<core::int*>();
+      } =>#t256).{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::int* #t261 = :sync-for-iterator.{core::Iterator::current};
-        #t259.{core::List::add}(#t261);
+        final core::int* #t257 = :sync-for-iterator.{core::Iterator::current};
+        #t255.{core::List::add}{Invariant}(#t257);
       }
     }
-  } =>#t259;
+  } =>#t255;
   core::Set<core::int*>* set51 = block {
-    final core::Set<core::int*>* #t262 = new col::_CompactLinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t258 = new col::_CompactLinkedHashSet::•<core::int*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
-      core::Iterator<core::int*>* :sync-for-iterator = (let final core::Set<core::int*>* #t263 = new col::_CompactLinkedHashSet::•<core::int*>() in #t263).{core::Iterable::iterator};
+      core::Iterator<core::int*>* :sync-for-iterator = ( block {
+        final core::Set<core::int*>* #t259 = new col::_CompactLinkedHashSet::•<core::int*>();
+      } =>#t259).{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::int* #t264 = :sync-for-iterator.{core::Iterator::current};
-        #t262.{core::Set::add}(#t264);
+        final core::int* #t260 = :sync-for-iterator.{core::Iterator::current};
+        #t258.{core::Set::add}{Invariant}(#t260);
       }
     }
-    #t262.{core::Set::add}(null);
-  } =>#t262;
+    #t258.{core::Set::add}{Invariant}(null);
+  } =>#t258;
   core::List<core::int*>* list52 = block {
-    final core::List<core::int*>* #t265 = <core::int*>[];
+    final core::List<core::int*>* #t261 = <core::int*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
         core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[].{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final core::int* #t266 = :sync-for-iterator.{core::Iterator::current};
-          #t265.{core::List::add}(#t266);
+          final core::int* #t262 = :sync-for-iterator.{core::Iterator::current};
+          #t261.{core::List::add}{Invariant}(#t262);
         }
       }
-  } =>#t265;
+  } =>#t261;
   core::Set<core::int*>* set52 = block {
-    final core::Set<core::int*>* #t267 = new col::_CompactLinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t263 = new col::_CompactLinkedHashSet::•<core::int*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
         core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[].{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final core::int* #t268 = :sync-for-iterator.{core::Iterator::current};
-          #t267.{core::Set::add}(#t268);
+          final core::int* #t264 = :sync-for-iterator.{core::Iterator::current};
+          #t263.{core::Set::add}{Invariant}(#t264);
         }
       }
-    #t267.{core::Set::add}(null);
-  } =>#t267;
+    #t263.{core::Set::add}{Invariant}(null);
+  } =>#t263;
   core::List<core::List<core::int*>*>* list60 = block {
-    final core::List<core::List<core::int*>*>* #t269 = <core::List<core::int*>*>[];
+    final core::List<core::List<core::int*>*>* #t265 = <core::List<core::int*>*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
       core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::List<core::int*>* #t270 = :sync-for-iterator.{core::Iterator::current};
-        #t269.{core::List::add}(#t270);
+        final core::List<core::int*>* #t266 = :sync-for-iterator.{core::Iterator::current};
+        #t265.{core::List::add}{Invariant}(#t266);
       }
     }
-  } =>#t269;
+  } =>#t265;
   core::Set<core::List<core::int*>*>* set60 = block {
-    final core::Set<core::List<core::int*>*>* #t271 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
+    final core::Set<core::List<core::int*>*>* #t267 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
       core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::List<core::int*>* #t272 = :sync-for-iterator.{core::Iterator::current};
-        #t271.{core::Set::add}(#t272);
+        final core::List<core::int*>* #t268 = :sync-for-iterator.{core::Iterator::current};
+        #t267.{core::Set::add}{Invariant}(#t268);
       }
     }
-    #t271.{core::Set::add}(null);
-  } =>#t271;
+    #t267.{core::Set::add}{Invariant}(null);
+  } =>#t267;
   core::Map<core::String*, core::List<core::int*>*>* map60 = block {
-    final core::Map<core::String*, core::List<core::int*>*>* #t273 = <core::String*, core::List<core::int*>*>{};
+    final core::Map<core::String*, core::List<core::int*>*>* #t269 = <core::String*, core::List<core::int*>*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
       core::Iterator<core::MapEntry<core::String*, core::List<core::int*>*>>* :sync-for-iterator = <core::String*, core::List<core::int*>*>{"bar": <core::int*>[]}.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::MapEntry<core::String*, core::List<core::int*>*>* #t274 = :sync-for-iterator.{core::Iterator::current};
-        #t273.{core::Map::[]=}(#t274.{core::MapEntry::key}, #t274.{core::MapEntry::value});
+        final core::MapEntry<core::String*, core::List<core::int*>*>* #t270 = :sync-for-iterator.{core::Iterator::current};
+        #t269.{core::Map::[]=}{Invariant}(#t270.{core::MapEntry::key}, #t270.{core::MapEntry::value});
       }
     }
-    #t273.{core::Map::[]=}("baz", null);
-  } =>#t273;
+    #t269.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t269;
   core::List<core::List<core::int*>*>* list61 = block {
-    final core::List<core::List<core::int*>*>* #t275 = <core::List<core::int*>*>[];
+    final core::List<core::List<core::int*>*>* #t271 = <core::List<core::int*>*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
         core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final core::List<core::int*>* #t276 = :sync-for-iterator.{core::Iterator::current};
-          #t275.{core::List::add}(#t276);
+          final core::List<core::int*>* #t272 = :sync-for-iterator.{core::Iterator::current};
+          #t271.{core::List::add}{Invariant}(#t272);
         }
       }
-  } =>#t275;
+  } =>#t271;
   core::Set<core::List<core::int*>*>* set61 = block {
-    final core::Set<core::List<core::int*>*>* #t277 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
+    final core::Set<core::List<core::int*>*>* #t273 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
         core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final core::List<core::int*>* #t278 = :sync-for-iterator.{core::Iterator::current};
-          #t277.{core::Set::add}(#t278);
+          final core::List<core::int*>* #t274 = :sync-for-iterator.{core::Iterator::current};
+          #t273.{core::Set::add}{Invariant}(#t274);
         }
       }
-    #t277.{core::Set::add}(null);
-  } =>#t277;
+    #t273.{core::Set::add}{Invariant}(null);
+  } =>#t273;
   core::Map<core::String*, core::List<core::int*>*>* map61 = block {
-    final core::Map<core::String*, core::List<core::int*>*>* #t279 = <core::String*, core::List<core::int*>*>{};
+    final core::Map<core::String*, core::List<core::int*>*>* #t275 = <core::String*, core::List<core::int*>*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
         core::Iterator<core::MapEntry<core::String*, core::List<core::int*>*>>* :sync-for-iterator = <core::String*, core::List<core::int*>*>{"bar": <core::int*>[]}.{core::Map::entries}.{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final core::MapEntry<core::String*, core::List<core::int*>*>* #t280 = :sync-for-iterator.{core::Iterator::current};
-          #t279.{core::Map::[]=}(#t280.{core::MapEntry::key}, #t280.{core::MapEntry::value});
+          final core::MapEntry<core::String*, core::List<core::int*>*>* #t276 = :sync-for-iterator.{core::Iterator::current};
+          #t275.{core::Map::[]=}{Invariant}(#t276.{core::MapEntry::key}, #t276.{core::MapEntry::value});
         }
       }
-    #t279.{core::Map::[]=}("baz", null);
-  } =>#t279;
+    #t275.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t275;
   core::List<core::List<core::int*>*>* list70 = block {
-    final core::List<core::List<core::int*>*>* #t281 = <core::List<core::int*>*>[];
+    final core::List<core::List<core::int*>*>* #t277 = <core::List<core::int*>*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      #t281.{core::List::add}(<core::int*>[]);
-  } =>#t281;
+      #t277.{core::List::add}{Invariant}(<core::int*>[]);
+  } =>#t277;
   core::Set<core::List<core::int*>*>* set70 = block {
-    final core::Set<core::List<core::int*>*>* #t282 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
+    final core::Set<core::List<core::int*>*>* #t278 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      #t282.{core::Set::add}(<core::int*>[]);
-    #t282.{core::Set::add}(null);
-  } =>#t282;
+      #t278.{core::Set::add}{Invariant}(<core::int*>[]);
+    #t278.{core::Set::add}{Invariant}(null);
+  } =>#t278;
   core::Map<core::String*, core::List<core::int*>*>* map70 = block {
-    final core::Map<core::String*, core::List<core::int*>*>* #t283 = <core::String*, core::List<core::int*>*>{};
+    final core::Map<core::String*, core::List<core::int*>*>* #t279 = <core::String*, core::List<core::int*>*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      #t283.{core::Map::[]=}("bar", <core::int*>[]);
-    #t283.{core::Map::[]=}("baz", null);
-  } =>#t283;
+      #t279.{core::Map::[]=}{Invariant}("bar", <core::int*>[]);
+    #t279.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t279;
   core::List<core::List<core::int*>*>* list71 = block {
-    final core::List<core::List<core::int*>*>* #t284 = <core::List<core::int*>*>[];
+    final core::List<core::List<core::int*>*>* #t280 = <core::List<core::int*>*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t284.{core::List::add}(<core::int*>[]);
-  } =>#t284;
+        #t280.{core::List::add}{Invariant}(<core::int*>[]);
+  } =>#t280;
   core::Set<core::List<core::int*>*>* set71 = block {
-    final core::Set<core::List<core::int*>*>* #t285 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
+    final core::Set<core::List<core::int*>*>* #t281 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t285.{core::Set::add}(<core::int*>[]);
-    #t285.{core::Set::add}(null);
-  } =>#t285;
+        #t281.{core::Set::add}{Invariant}(<core::int*>[]);
+    #t281.{core::Set::add}{Invariant}(null);
+  } =>#t281;
   core::Map<core::String*, core::List<core::int*>*>* map71 = block {
-    final core::Map<core::String*, core::List<core::int*>*>* #t286 = <core::String*, core::List<core::int*>*>{};
+    final core::Map<core::String*, core::List<core::int*>*>* #t282 = <core::String*, core::List<core::int*>*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t286.{core::Map::[]=}("bar", <core::int*>[]);
-    #t286.{core::Map::[]=}("baz", null);
-  } =>#t286;
+        #t282.{core::Map::[]=}{Invariant}("bar", <core::int*>[]);
+    #t282.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t282;
   core::List<core::num*>* list80 = block {
-    final core::List<core::num*>* #t287 = <core::num*>[];
+    final core::List<core::num*>* #t283 = <core::num*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t287.{core::List::add}(42);
+        #t283.{core::List::add}{Invariant}(42);
       else
-        #t287.{core::List::add}(3.14);
-  } =>#t287;
+        #t283.{core::List::add}{Invariant}(3.14);
+  } =>#t283;
   core::Set<core::num*>* set80 = block {
-    final core::Set<core::num*>* #t288 = new col::_CompactLinkedHashSet::•<core::num*>();
+    final core::Set<core::num*>* #t284 = new col::_CompactLinkedHashSet::•<core::num*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t288.{core::Set::add}(42);
+        #t284.{core::Set::add}{Invariant}(42);
       else
-        #t288.{core::Set::add}(3.14);
-    #t288.{core::Set::add}(null);
-  } =>#t288;
+        #t284.{core::Set::add}{Invariant}(3.14);
+    #t284.{core::Set::add}{Invariant}(null);
+  } =>#t284;
   core::Map<core::String*, core::num*>* map80 = block {
-    final core::Map<core::String*, core::num*>* #t289 = <core::String*, core::num*>{};
+    final core::Map<core::String*, core::num*>* #t285 = <core::String*, core::num*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t289.{core::Map::[]=}("bar", 42);
+        #t285.{core::Map::[]=}{Invariant}("bar", 42);
       else
-        #t289.{core::Map::[]=}("bar", 3.14);
-    #t289.{core::Map::[]=}("baz", null);
-  } =>#t289;
+        #t285.{core::Map::[]=}{Invariant}("bar", 3.14);
+    #t285.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t285;
   core::List<core::num*>* list81 = block {
-    final core::List<core::num*>* #t290 = <core::num*>[];
+    final core::List<core::num*>* #t286 = <core::num*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
         core::Iterator<core::int*>* :sync-for-iterator = listInt.{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+          final core::num* #t287 = :sync-for-iterator.{core::Iterator::current};
+          #t286.{core::List::add}{Invariant}(#t287);
+        }
+      }
+      else {
+        core::Iterator<core::double*>* :sync-for-iterator = listDouble.{core::Iterable::iterator};
+        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+          final core::num* #t288 = :sync-for-iterator.{core::Iterator::current};
+          #t286.{core::List::add}{Invariant}(#t288);
+        }
+      }
+  } =>#t286;
+  core::Set<core::num*>* set81 = block {
+    final core::Set<core::num*>* #t289 = new col::_CompactLinkedHashSet::•<core::num*>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
+        core::Iterator<core::int*>* :sync-for-iterator = listInt.{core::Iterable::iterator};
+        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+          final core::num* #t290 = :sync-for-iterator.{core::Iterator::current};
+          #t289.{core::Set::add}{Invariant}(#t290);
+        }
+      }
+      else {
+        core::Iterator<core::double*>* :sync-for-iterator = listDouble.{core::Iterable::iterator};
+        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
           final core::num* #t291 = :sync-for-iterator.{core::Iterator::current};
-          #t290.{core::List::add}(#t291);
+          #t289.{core::Set::add}{Invariant}(#t291);
         }
       }
-      else {
-        core::Iterator<core::double*>* :sync-for-iterator = listDouble.{core::Iterable::iterator};
-        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final core::num* #t292 = :sync-for-iterator.{core::Iterator::current};
-          #t290.{core::List::add}(#t292);
-        }
-      }
-  } =>#t290;
-  core::Set<core::num*>* set81 = block {
-    final core::Set<core::num*>* #t293 = new col::_CompactLinkedHashSet::•<core::num*>();
-    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
-        core::Iterator<core::int*>* :sync-for-iterator = listInt.{core::Iterable::iterator};
-        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final core::num* #t294 = :sync-for-iterator.{core::Iterator::current};
-          #t293.{core::Set::add}(#t294);
-        }
-      }
-      else {
-        core::Iterator<core::double*>* :sync-for-iterator = listDouble.{core::Iterable::iterator};
-        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final core::num* #t295 = :sync-for-iterator.{core::Iterator::current};
-          #t293.{core::Set::add}(#t295);
-        }
-      }
-    #t293.{core::Set::add}(null);
-  } =>#t293;
+    #t289.{core::Set::add}{Invariant}(null);
+  } =>#t289;
   core::Map<core::String*, core::num*>* map81 = block {
-    final core::Map<core::String*, core::num*>* #t296 = <core::String*, core::num*>{};
+    final core::Map<core::String*, core::num*>* #t292 = <core::String*, core::num*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
         core::Iterator<core::MapEntry<core::String*, core::int*>>* :sync-for-iterator = mapStringInt.{core::Map::entries}.{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final core::MapEntry<core::String*, core::num*>* #t297 = :sync-for-iterator.{core::Iterator::current};
-          #t296.{core::Map::[]=}(#t297.{core::MapEntry::key}, #t297.{core::MapEntry::value});
+          final core::MapEntry<core::String*, core::num*>* #t293 = :sync-for-iterator.{core::Iterator::current};
+          #t292.{core::Map::[]=}{Invariant}(#t293.{core::MapEntry::key}, #t293.{core::MapEntry::value});
         }
       }
       else {
         core::Iterator<core::MapEntry<core::String*, core::double*>>* :sync-for-iterator = mapStringDouble.{core::Map::entries}.{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final core::MapEntry<core::String*, core::num*>* #t298 = :sync-for-iterator.{core::Iterator::current};
-          #t296.{core::Map::[]=}(#t298.{core::MapEntry::key}, #t298.{core::MapEntry::value});
+          final core::MapEntry<core::String*, core::num*>* #t294 = :sync-for-iterator.{core::Iterator::current};
+          #t292.{core::Map::[]=}{Invariant}(#t294.{core::MapEntry::key}, #t294.{core::MapEntry::value});
         }
       }
-    #t296.{core::Map::[]=}("baz", null);
-  } =>#t296;
+    #t292.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t292;
   core::List<dynamic>* list82 = block {
-    final core::List<dynamic>* #t299 = <dynamic>[];
+    final core::List<dynamic>* #t295 = <dynamic>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
         core::Iterator<core::int*>* :sync-for-iterator = listInt.{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+          final dynamic #t296 = :sync-for-iterator.{core::Iterator::current};
+          #t295.{core::List::add}{Invariant}(#t296);
+        }
+      }
+      else {
+        core::Iterator<dynamic>* :sync-for-iterator = (dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*).{core::Iterable::iterator};
+        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+          final dynamic #t297 = :sync-for-iterator.{core::Iterator::current};
+          #t295.{core::List::add}{Invariant}(#t297);
+        }
+      }
+  } =>#t295;
+  core::Set<dynamic>* set82 = block {
+    final core::Set<dynamic>* #t298 = new col::_CompactLinkedHashSet::•<dynamic>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
+        core::Iterator<core::int*>* :sync-for-iterator = listInt.{core::Iterable::iterator};
+        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+          final dynamic #t299 = :sync-for-iterator.{core::Iterator::current};
+          #t298.{core::Set::add}{Invariant}(#t299);
+        }
+      }
+      else {
+        core::Iterator<dynamic>* :sync-for-iterator = (dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*).{core::Iterable::iterator};
+        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
           final dynamic #t300 = :sync-for-iterator.{core::Iterator::current};
-          #t299.{core::List::add}(#t300);
+          #t298.{core::Set::add}{Invariant}(#t300);
         }
       }
-      else {
-        core::Iterator<dynamic>* :sync-for-iterator = (dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*).{core::Iterable::iterator};
-        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final dynamic #t301 = :sync-for-iterator.{core::Iterator::current};
-          #t299.{core::List::add}(#t301);
-        }
-      }
-  } =>#t299;
-  core::Set<dynamic>* set82 = block {
-    final core::Set<dynamic>* #t302 = new col::_CompactLinkedHashSet::•<dynamic>();
-    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
-        core::Iterator<core::int*>* :sync-for-iterator = listInt.{core::Iterable::iterator};
-        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final dynamic #t303 = :sync-for-iterator.{core::Iterator::current};
-          #t302.{core::Set::add}(#t303);
-        }
-      }
-      else {
-        core::Iterator<dynamic>* :sync-for-iterator = (dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*).{core::Iterable::iterator};
-        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final dynamic #t304 = :sync-for-iterator.{core::Iterator::current};
-          #t302.{core::Set::add}(#t304);
-        }
-      }
-    #t302.{core::Set::add}(null);
-  } =>#t302;
+    #t298.{core::Set::add}{Invariant}(null);
+  } =>#t298;
   core::Map<dynamic, dynamic>* map82 = block {
-    final core::Map<dynamic, dynamic>* #t305 = <dynamic, dynamic>{};
+    final core::Map<dynamic, dynamic>* #t301 = <dynamic, dynamic>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
         core::Iterator<core::MapEntry<core::String*, core::int*>>* :sync-for-iterator = mapStringInt.{core::Map::entries}.{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final core::MapEntry<dynamic, dynamic>* #t306 = :sync-for-iterator.{core::Iterator::current};
-          #t305.{core::Map::[]=}(#t306.{core::MapEntry::key}, #t306.{core::MapEntry::value});
+          final core::MapEntry<dynamic, dynamic>* #t302 = :sync-for-iterator.{core::Iterator::current};
+          #t301.{core::Map::[]=}{Invariant}(#t302.{core::MapEntry::key}, #t302.{core::MapEntry::value});
         }
       }
       else {
         core::Iterator<core::MapEntry<dynamic, dynamic>>* :sync-for-iterator = (dynVar as{TypeError,ForDynamic} core::Map<dynamic, dynamic>*).{core::Map::entries}.{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final core::MapEntry<dynamic, dynamic>* #t307 = :sync-for-iterator.{core::Iterator::current};
-          #t305.{core::Map::[]=}(#t307.{core::MapEntry::key}, #t307.{core::MapEntry::value});
+          final core::MapEntry<dynamic, dynamic>* #t303 = :sync-for-iterator.{core::Iterator::current};
+          #t301.{core::Map::[]=}{Invariant}(#t303.{core::MapEntry::key}, #t303.{core::MapEntry::value});
         }
       }
-    #t305.{core::Map::[]=}("baz", null);
-  } =>#t305;
+    #t301.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t301;
   core::List<core::num*>* list83 = block {
-    final core::List<core::num*>* #t308 = <core::num*>[];
+    final core::List<core::num*>* #t304 = <core::num*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t308.{core::List::add}(42);
+        #t304.{core::List::add}{Invariant}(42);
       else {
         core::Iterator<core::double*>* :sync-for-iterator = listDouble.{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final core::num* #t309 = :sync-for-iterator.{core::Iterator::current};
-          #t308.{core::List::add}(#t309);
+          final core::num* #t305 = :sync-for-iterator.{core::Iterator::current};
+          #t304.{core::List::add}{Invariant}(#t305);
         }
       }
-  } =>#t308;
+  } =>#t304;
   core::Set<core::num*>* set83 = block {
-    final core::Set<core::num*>* #t310 = new col::_CompactLinkedHashSet::•<core::num*>();
+    final core::Set<core::num*>* #t306 = new col::_CompactLinkedHashSet::•<core::num*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
         core::Iterator<core::int*>* :sync-for-iterator = listInt.{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final core::num* #t311 = :sync-for-iterator.{core::Iterator::current};
-          #t310.{core::Set::add}(#t311);
+          final core::num* #t307 = :sync-for-iterator.{core::Iterator::current};
+          #t306.{core::Set::add}{Invariant}(#t307);
         }
       }
       else
-        #t310.{core::Set::add}(3.14);
-    #t310.{core::Set::add}(null);
-  } =>#t310;
+        #t306.{core::Set::add}{Invariant}(3.14);
+    #t306.{core::Set::add}{Invariant}(null);
+  } =>#t306;
   core::Map<core::String*, core::num*>* map83 = block {
-    final core::Map<core::String*, core::num*>* #t312 = <core::String*, core::num*>{};
+    final core::Map<core::String*, core::num*>* #t308 = <core::String*, core::num*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
         core::Iterator<core::MapEntry<core::String*, core::int*>>* :sync-for-iterator = mapStringInt.{core::Map::entries}.{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final core::MapEntry<core::String*, core::num*>* #t313 = :sync-for-iterator.{core::Iterator::current};
-          #t312.{core::Map::[]=}(#t313.{core::MapEntry::key}, #t313.{core::MapEntry::value});
+          final core::MapEntry<core::String*, core::num*>* #t309 = :sync-for-iterator.{core::Iterator::current};
+          #t308.{core::Map::[]=}{Invariant}(#t309.{core::MapEntry::key}, #t309.{core::MapEntry::value});
         }
       }
       else
-        #t312.{core::Map::[]=}("bar", 3.14);
-    #t312.{core::Map::[]=}("baz", null);
-  } =>#t312;
+        #t308.{core::Map::[]=}{Invariant}("bar", 3.14);
+    #t308.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t308;
   core::List<core::int*>* list90 = block {
-    final core::List<core::int*>* #t314 = <core::int*>[];
+    final core::List<core::int*>* #t310 = <core::int*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      #t314.{core::List::add}(dynVar as{TypeError,ForDynamic} core::int*);
-  } =>#t314;
+      #t310.{core::List::add}{Invariant}(dynVar as{TypeError,ForDynamic} core::int*);
+  } =>#t310;
   core::Set<core::int*>* set90 = block {
-    final core::Set<core::int*>* #t315 = new col::_CompactLinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t311 = new col::_CompactLinkedHashSet::•<core::int*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      #t315.{core::Set::add}(dynVar as{TypeError,ForDynamic} core::int*);
-    #t315.{core::Set::add}(null);
-  } =>#t315;
+      #t311.{core::Set::add}{Invariant}(dynVar as{TypeError,ForDynamic} core::int*);
+    #t311.{core::Set::add}{Invariant}(null);
+  } =>#t311;
   core::Map<core::String*, core::int*>* map90 = block {
-    final core::Map<core::String*, core::int*>* #t316 = <core::String*, core::int*>{};
+    final core::Map<core::String*, core::int*>* #t312 = <core::String*, core::int*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      #t316.{core::Map::[]=}("bar", dynVar as{TypeError,ForDynamic} core::int*);
-    #t316.{core::Map::[]=}("baz", null);
-  } =>#t316;
+      #t312.{core::Map::[]=}{Invariant}("bar", dynVar as{TypeError,ForDynamic} core::int*);
+    #t312.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t312;
   core::List<core::int*>* list91 = block {
-    final core::List<core::int*>* #t317 = <core::int*>[];
+    final core::List<core::int*>* #t313 = <core::int*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
       core::Iterator<dynamic>* :sync-for-iterator = (dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*).{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final dynamic #t318 = :sync-for-iterator.{core::Iterator::current};
+        final dynamic #t314 = :sync-for-iterator.{core::Iterator::current};
         {
-          final core::int* #t319 = #t318 as{TypeError} core::int*;
-          #t317.{core::List::add}(#t319);
+          final core::int* #t315 = #t314 as{TypeError} core::int*;
+          #t313.{core::List::add}{Invariant}(#t315);
         }
       }
     }
-  } =>#t317;
+  } =>#t313;
   core::Set<core::int*>* set91 = block {
-    final core::Set<core::int*>* #t320 = new col::_CompactLinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t316 = new col::_CompactLinkedHashSet::•<core::int*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
       core::Iterator<dynamic>* :sync-for-iterator = (dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*).{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final dynamic #t321 = :sync-for-iterator.{core::Iterator::current};
+        final dynamic #t317 = :sync-for-iterator.{core::Iterator::current};
         {
-          final core::int* #t322 = #t321 as{TypeError} core::int*;
-          #t320.{core::Set::add}(#t322);
+          final core::int* #t318 = #t317 as{TypeError} core::int*;
+          #t316.{core::Set::add}{Invariant}(#t318);
         }
       }
     }
-    #t320.{core::Set::add}(null);
-  } =>#t320;
+    #t316.{core::Set::add}{Invariant}(null);
+  } =>#t316;
   core::Map<core::String*, core::int*>* map91 = block {
-    final core::Map<core::String*, core::int*>* #t323 = <core::String*, core::int*>{};
+    final core::Map<core::String*, core::int*>* #t319 = <core::String*, core::int*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
       core::Iterator<core::MapEntry<dynamic, dynamic>>* :sync-for-iterator = (dynVar as{TypeError,ForDynamic} core::Map<dynamic, dynamic>*).{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::MapEntry<dynamic, dynamic>* #t324 = :sync-for-iterator.{core::Iterator::current};
+        final core::MapEntry<dynamic, dynamic>* #t320 = :sync-for-iterator.{core::Iterator::current};
         {
-          final core::String* #t325 = #t324.{core::MapEntry::key} as{TypeError} core::String*;
-          final core::int* #t326 = #t324.{core::MapEntry::value} as{TypeError} core::int*;
-          #t323.{core::Map::[]=}(#t325, #t326);
+          final core::String* #t321 = #t320.{core::MapEntry::key} as{TypeError} core::String*;
+          final core::int* #t322 = #t320.{core::MapEntry::value} as{TypeError} core::int*;
+          #t319.{core::Map::[]=}{Invariant}(#t321, #t322);
         }
       }
     }
-    #t323.{core::Map::[]=}("baz", null);
-  } =>#t323;
+    #t319.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t319;
   core::List<core::int*>* list100 = block {
-    final core::List<core::int*>* #t327 = <core::int*>[];
-    for (final core::int* #t328 = index = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; index = index.{core::num::+}(1))
-      #t327.{core::List::add}(42);
-  } =>#t327;
+    final core::List<core::int*>* #t323 = <core::int*>[];
+    for (final core::int* #t324 = index = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; index = index.{core::num::+}(1))
+      #t323.{core::List::add}{Invariant}(42);
+  } =>#t323;
   core::Set<core::int*>* set100 = block {
-    final core::Set<core::int*>* #t329 = new col::_CompactLinkedHashSet::•<core::int*>();
-    for (final core::int* #t330 = index = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; index = index.{core::num::+}(1))
-      #t329.{core::Set::add}(42);
-  } =>#t329;
+    final core::Set<core::int*>* #t325 = new col::_CompactLinkedHashSet::•<core::int*>();
+    for (final core::int* #t326 = index = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; index = index.{core::num::+}(1))
+      #t325.{core::Set::add}{Invariant}(42);
+  } =>#t325;
   core::Map<core::String*, core::int*>* map100 = block {
-    final core::Map<core::String*, core::int*>* #t331 = <core::String*, core::int*>{};
-    for (final core::int* #t332 = index = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; index = index.{core::num::+}(1))
-      #t331.{core::Map::[]=}("bar", 42);
-  } =>#t331;
+    final core::Map<core::String*, core::int*>* #t327 = <core::String*, core::int*>{};
+    for (final core::int* #t328 = index = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; index = index.{core::num::+}(1))
+      #t327.{core::Map::[]=}{Invariant}("bar", 42);
+  } =>#t327;
   core::List<core::int*>* list110 = block {
-    final core::List<core::int*>* #t333 = <core::int*>[];
+    final core::List<core::int*>* #t329 = <core::int*>[];
     {
       core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[1, 2, 3].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         core::int* i = :sync-for-iterator.{core::Iterator::current};
-        #t333.{core::List::add}(i);
+        #t329.{core::List::add}{Invariant}(i);
       }
     }
-  } =>#t333;
+  } =>#t329;
   core::Set<core::int*>* set110 = block {
-    final core::Set<core::int*>* #t334 = new col::_CompactLinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t330 = new col::_CompactLinkedHashSet::•<core::int*>();
     {
       core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[1, 2, 3].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         core::int* i = :sync-for-iterator.{core::Iterator::current};
-        #t334.{core::Set::add}(i);
+        #t330.{core::Set::add}{Invariant}(i);
       }
     }
-    #t334.{core::Set::add}(null);
-  } =>#t334;
+    #t330.{core::Set::add}{Invariant}(null);
+  } =>#t330;
   core::Map<core::String*, core::int*>* map110 = block {
-    final core::Map<core::String*, core::int*>* #t335 = <core::String*, core::int*>{};
+    final core::Map<core::String*, core::int*>* #t331 = <core::String*, core::int*>{};
     {
       core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[1, 2, 3].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         core::int* i = :sync-for-iterator.{core::Iterator::current};
-        #t335.{core::Map::[]=}("bar", i);
+        #t331.{core::Map::[]=}{Invariant}("bar", i);
       }
     }
-    #t335.{core::Map::[]=}("baz", null);
-  } =>#t335;
+    #t331.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t331;
   core::List<core::int*>* list120 = block {
-    final core::List<core::int*>* #t336 = <core::int*>[];
+    final core::List<core::int*>* #t332 = <core::int*>[];
     {
       core::Iterator<dynamic>* :sync-for-iterator = (dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*).{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         dynamic i = :sync-for-iterator.{core::Iterator::current};
-        #t336.{core::List::add}(i as{TypeError,ForDynamic} core::int*);
+        #t332.{core::List::add}{Invariant}(i as{TypeError,ForDynamic} core::int*);
       }
     }
-  } =>#t336;
+  } =>#t332;
   core::Set<core::int*>* set120 = block {
-    final core::Set<core::int*>* #t337 = new col::_CompactLinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t333 = new col::_CompactLinkedHashSet::•<core::int*>();
     {
       core::Iterator<dynamic>* :sync-for-iterator = (dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*).{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         dynamic i = :sync-for-iterator.{core::Iterator::current};
-        #t337.{core::Set::add}(i as{TypeError,ForDynamic} core::int*);
+        #t333.{core::Set::add}{Invariant}(i as{TypeError,ForDynamic} core::int*);
       }
     }
-    #t337.{core::Set::add}(null);
-  } =>#t337;
+    #t333.{core::Set::add}{Invariant}(null);
+  } =>#t333;
   core::Map<core::String*, core::int*>* map120 = block {
-    final core::Map<core::String*, core::int*>* #t338 = <core::String*, core::int*>{};
+    final core::Map<core::String*, core::int*>* #t334 = <core::String*, core::int*>{};
     {
       core::Iterator<dynamic>* :sync-for-iterator = (dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*).{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         dynamic i = :sync-for-iterator.{core::Iterator::current};
-        #t338.{core::Map::[]=}("bar", i as{TypeError,ForDynamic} core::int*);
+        #t334.{core::Map::[]=}{Invariant}("bar", i as{TypeError,ForDynamic} core::int*);
       }
     }
-    #t338.{core::Map::[]=}("baz", null);
-  } =>#t338;
+    #t334.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t334;
   core::List<core::int*>* list130 = block {
-    final core::List<core::int*>* #t339 = <core::int*>[];
+    final core::List<core::int*>* #t335 = <core::int*>[];
     for (core::int* i = 1; i.{core::num::<}(2); i = i.{core::num::+}(1))
-      #t339.{core::List::add}(i);
-  } =>#t339;
+      #t335.{core::List::add}{Invariant}(i);
+  } =>#t335;
   core::Set<core::int*>* set130 = block {
-    final core::Set<core::int*>* #t340 = new col::_CompactLinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t336 = new col::_CompactLinkedHashSet::•<core::int*>();
     for (core::int* i = 1; i.{core::num::<}(2); i = i.{core::num::+}(1))
-      #t340.{core::Set::add}(i);
-  } =>#t340;
+      #t336.{core::Set::add}{Invariant}(i);
+  } =>#t336;
   core::Map<core::int*, core::int*>* map130 = block {
-    final core::Map<core::int*, core::int*>* #t341 = <core::int*, core::int*>{};
+    final core::Map<core::int*, core::int*>* #t337 = <core::int*, core::int*>{};
     for (core::int* i = 1; i.{core::num::<}(2); i = i.{core::num::+}(1))
-      #t341.{core::Map::[]=}(i, i);
-  } =>#t341;
+      #t337.{core::Map::[]=}{Invariant}(i, i);
+  } =>#t337;
 }
 static method testForElementErrors(core::Map<core::int*, core::int*>* map, core::List<core::int*>* list) → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic>* :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -2335,91 +2356,91 @@
       #L1:
       {
         block {
-          final core::List<core::int*>* #t342 = <core::int*>[];
+          final core::List<core::int*>* #t338 = <core::int*>[];
           for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-            #t342.{core::List::add}(let final<BottomType> #t343 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:210:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+            #t338.{core::List::add}{Invariant}(let final<BottomType> #t339 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:210:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int>[for (int i = 0; oracle(\"foo\"); i++) \"bar\"];
                                             ^" in "bar" as{TypeError} core::int*);
-        } =>#t342;
+        } =>#t338;
         block {
-          final core::Set<core::int*>* #t344 = new col::_CompactLinkedHashSet::•<core::int*>();
+          final core::Set<core::int*>* #t340 = new col::_CompactLinkedHashSet::•<core::int*>();
           for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-            #t344.{core::Set::add}(let final<BottomType> #t345 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:211:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+            #t340.{core::Set::add}{Invariant}(let final<BottomType> #t341 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:211:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int>{for (int i = 0; oracle(\"foo\"); i++) \"bar\", null};
                                             ^" in "bar" as{TypeError} core::int*);
-          #t344.{core::Set::add}(null);
-        } =>#t344;
+          #t340.{core::Set::add}{Invariant}(null);
+        } =>#t340;
         block {
-          final core::Map<core::int*, core::int*>* #t346 = <core::int*, core::int*>{};
+          final core::Map<core::int*, core::int*>* #t342 = <core::int*, core::int*>{};
           for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-            #t346.{core::Map::[]=}(let final<BottomType> #t347 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:212:50: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+            #t342.{core::Map::[]=}{Invariant}(let final<BottomType> #t343 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:212:50: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int, int>{for (int i = 0; oracle(\"foo\"); i++) \"bar\": \"bar\", \"baz\": null};
-                                                 ^" in "bar" as{TypeError} core::int*, let final<BottomType> #t348 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:212:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+                                                 ^" in "bar" as{TypeError} core::int*, let final<BottomType> #t344 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:212:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int, int>{for (int i = 0; oracle(\"foo\"); i++) \"bar\": \"bar\", \"baz\": null};
                                                         ^" in "bar" as{TypeError} core::int*);
-          #t346.{core::Map::[]=}(let final<BottomType> #t349 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:212:64: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+          #t342.{core::Map::[]=}{Invariant}(let final<BottomType> #t345 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:212:64: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int, int>{for (int i = 0; oracle(\"foo\"); i++) \"bar\": \"bar\", \"baz\": null};
                                                                ^" in "baz" as{TypeError} core::int*, null);
-        } =>#t346;
+        } =>#t342;
         block {
-          final core::List<core::int*>* #t350 = <core::int*>[];
+          final core::List<core::int*>* #t346 = <core::int*>[];
           for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
-            core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[let final<BottomType> #t351 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:213:49: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+            core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[let final<BottomType> #t347 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:213:49: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int>[for (int i = 0; oracle(\"foo\"); i++) ...[\"bar\"]];
                                                 ^" in "bar" as{TypeError} core::int*].{core::Iterable::iterator};
             for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-              final core::int* #t352 = :sync-for-iterator.{core::Iterator::current};
-              #t350.{core::List::add}(#t352);
+              final core::int* #t348 = :sync-for-iterator.{core::Iterator::current};
+              #t346.{core::List::add}{Invariant}(#t348);
             }
           }
-        } =>#t350;
+        } =>#t346;
         block {
-          final core::Set<core::int*>* #t353 = new col::_CompactLinkedHashSet::•<core::int*>();
+          final core::Set<core::int*>* #t349 = new col::_CompactLinkedHashSet::•<core::int*>();
           for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
-            core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[let final<BottomType> #t354 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:214:49: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+            core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[let final<BottomType> #t350 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:214:49: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int>{for (int i = 0; oracle(\"foo\"); i++) ...[\"bar\"], null};
                                                 ^" in "bar" as{TypeError} core::int*].{core::Iterable::iterator};
             for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-              final core::int* #t355 = :sync-for-iterator.{core::Iterator::current};
-              #t353.{core::Set::add}(#t355);
+              final core::int* #t351 = :sync-for-iterator.{core::Iterator::current};
+              #t349.{core::Set::add}{Invariant}(#t351);
             }
           }
-          #t353.{core::Set::add}(null);
-        } =>#t353;
+          #t349.{core::Set::add}{Invariant}(null);
+        } =>#t349;
         block {
-          final core::Map<core::int*, core::int*>* #t356 = <core::int*, core::int*>{};
+          final core::Map<core::int*, core::int*>* #t352 = <core::int*, core::int*>{};
           for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
-            core::Iterator<core::MapEntry<core::int*, core::int*>>* :sync-for-iterator = <core::int*, core::int*>{let final<BottomType> #t357 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:215:54: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+            core::Iterator<core::MapEntry<core::int*, core::int*>>* :sync-for-iterator = <core::int*, core::int*>{let final<BottomType> #t353 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:215:54: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int, int>{for (int i = 0; oracle(\"foo\"); i++) ...{\"bar\": \"bar\"}, \"baz\": null};
-                                                     ^" in "bar" as{TypeError} core::int*: let final<BottomType> #t358 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:215:61: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+                                                     ^" in "bar" as{TypeError} core::int*: let final<BottomType> #t354 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:215:61: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int, int>{for (int i = 0; oracle(\"foo\"); i++) ...{\"bar\": \"bar\"}, \"baz\": null};
                                                             ^" in "bar" as{TypeError} core::int*}.{core::Map::entries}.{core::Iterable::iterator};
             for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-              final core::MapEntry<core::int*, core::int*>* #t359 = :sync-for-iterator.{core::Iterator::current};
-              #t356.{core::Map::[]=}(#t359.{core::MapEntry::key}, #t359.{core::MapEntry::value});
+              final core::MapEntry<core::int*, core::int*>* #t355 = :sync-for-iterator.{core::Iterator::current};
+              #t352.{core::Map::[]=}{Invariant}(#t355.{core::MapEntry::key}, #t355.{core::MapEntry::value});
             }
           }
-          #t356.{core::Map::[]=}(let final<BottomType> #t360 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:215:69: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+          #t352.{core::Map::[]=}{Invariant}(let final<BottomType> #t356 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:215:69: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int, int>{for (int i = 0; oracle(\"foo\"); i++) ...{\"bar\": \"bar\"}, \"baz\": null};
                                                                     ^" in "baz" as{TypeError} core::int*, null);
-        } =>#t356;
+        } =>#t352;
         block {
-          final core::List<core::int*>* #t361 = <core::int*>[];
+          final core::List<core::int*>* #t357 = <core::int*>[];
           for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-            #t361.{core::List::add}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:216:48: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+            #t357.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:216:48: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
   <int>[for (int i = 0; oracle(\"foo\"); i++) ...map];
                                                ^");
-        } =>#t361;
+        } =>#t357;
         block {
-          final core::Set<core::int*>* #t362 = new col::_CompactLinkedHashSet::•<core::int*>();
+          final core::Set<core::int*>* #t358 = new col::_CompactLinkedHashSet::•<core::int*>();
           for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-            #t362.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:217:48: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+            #t358.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:217:48: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
   <int>{for (int i = 0; oracle(\"foo\"); i++) ...map, null};
                                                ^");
-          #t362.{core::Set::add}(null);
-        } =>#t362;
+          #t358.{core::Set::add}{Invariant}(null);
+        } =>#t358;
         <core::int*, core::int*>{invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:218:53: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
  - 'List' is from 'dart:core'.
   <int, int>{for (int i = 0; oracle(\"foo\"); i++) ...list, 42: null};
@@ -2428,66 +2449,66 @@
   <int, int>{for (int i = 0; oracle(\"foo\"); i++) ...list, 42: null};
                                                     ^": null};
         block {
-          final core::List<core::String*>* #t363 = <core::String*>[];
+          final core::List<core::String*>* #t359 = <core::String*>[];
           for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
             if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-              #t363.{core::List::add}(let final<BottomType> #t364 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:219:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+              #t359.{core::List::add}{Invariant}(let final<BottomType> #t360 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:219:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
   <String>[for (int i = 0; oracle(\"foo\"); i++) if (oracle()) 42 else 3.14];
                                                              ^" in 42 as{TypeError} core::String*);
             else
-              #t363.{core::List::add}(let final<BottomType> #t365 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:219:70: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
+              #t359.{core::List::add}{Invariant}(let final<BottomType> #t361 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:219:70: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
   <String>[for (int i = 0; oracle(\"foo\"); i++) if (oracle()) 42 else 3.14];
                                                                      ^" in 3.14 as{TypeError} core::String*);
-        } =>#t363;
+        } =>#t359;
         block {
-          final core::Set<core::String*>* #t366 = new col::_CompactLinkedHashSet::•<core::String*>();
+          final core::Set<core::String*>* #t362 = new col::_CompactLinkedHashSet::•<core::String*>();
           for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
             if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-              #t366.{core::Set::add}(let final<BottomType> #t367 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:220:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+              #t362.{core::Set::add}{Invariant}(let final<BottomType> #t363 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:220:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
   <String>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) 42 else 3.14, null};
                                                              ^" in 42 as{TypeError} core::String*);
             else
-              #t366.{core::Set::add}(let final<BottomType> #t368 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:220:70: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
+              #t362.{core::Set::add}{Invariant}(let final<BottomType> #t364 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:220:70: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
   <String>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) 42 else 3.14, null};
                                                                      ^" in 3.14 as{TypeError} core::String*);
-          #t366.{core::Set::add}(null);
-        } =>#t366;
+          #t362.{core::Set::add}{Invariant}(null);
+        } =>#t362;
         block {
-          final core::Map<core::String*, core::String*>* #t369 = <core::String*, core::String*>{};
+          final core::Map<core::String*, core::String*>* #t365 = <core::String*, core::String*>{};
           for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
             if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-              #t369.{core::Map::[]=}("bar", let final<BottomType> #t370 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:221:77: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+              #t365.{core::Map::[]=}{Invariant}("bar", let final<BottomType> #t366 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:221:77: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
   <String, String>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) \"bar\": 42 else \"bar\": 3.14, \"baz\": null};
                                                                             ^" in 42 as{TypeError} core::String*);
             else
-              #t369.{core::Map::[]=}("bar", let final<BottomType> #t371 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:221:92: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
+              #t365.{core::Map::[]=}{Invariant}("bar", let final<BottomType> #t367 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:221:92: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
   <String, String>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) \"bar\": 42 else \"bar\": 3.14, \"baz\": null};
                                                                                            ^" in 3.14 as{TypeError} core::String*);
-          #t369.{core::Map::[]=}("baz", null);
-        } =>#t369;
+          #t365.{core::Map::[]=}{Invariant}("baz", null);
+        } =>#t365;
         block {
-          final core::List<core::int*>* #t372 = <core::int*>[];
+          final core::List<core::int*>* #t368 = <core::int*>[];
           for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
             if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-              #t372.{core::List::add}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:222:62: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+              #t368.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:222:62: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
   <int>[for (int i = 0; oracle(\"foo\"); i++) if (oracle()) ...map else 42];
                                                              ^");
             else
-              #t372.{core::List::add}(42);
-        } =>#t372;
+              #t368.{core::List::add}{Invariant}(42);
+        } =>#t368;
         block {
-          final core::Set<core::int*>* #t373 = new col::_CompactLinkedHashSet::•<core::int*>();
+          final core::Set<core::int*>* #t369 = new col::_CompactLinkedHashSet::•<core::int*>();
           for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
             if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-              #t373.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:223:62: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+              #t369.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:223:62: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
   <int>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) ...map else 42, null};
                                                              ^");
             else
-              #t373.{core::Set::add}(42);
-          #t373.{core::Set::add}(null);
-        } =>#t373;
+              #t369.{core::Set::add}{Invariant}(42);
+          #t369.{core::Set::add}{Invariant}(null);
+        } =>#t369;
         <core::String*, core::int*>{invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:224:70: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
  - 'List' is from 'dart:core'.
   <String, int>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) ...list else \"bar\": 42, \"baz\": null};
@@ -2496,28 +2517,28 @@
   <String, int>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) ...list else \"bar\": 42, \"baz\": null};
                                                                      ^": null};
         block {
-          final core::List<core::int*>* #t374 = <core::int*>[];
+          final core::List<core::int*>* #t370 = <core::int*>[];
           for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
             if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-              #t374.{core::List::add}(42);
+              #t370.{core::List::add}{Invariant}(42);
             else
-              #t374.{core::List::add}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:225:70: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+              #t370.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:225:70: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
   <int>[for (int i = 0; oracle(\"foo\"); i++) if (oracle()) 42 else ...map];
                                                                      ^");
-        } =>#t374;
+        } =>#t370;
         block {
-          final core::Set<core::int*>* #t375 = new col::_CompactLinkedHashSet::•<core::int*>();
+          final core::Set<core::int*>* #t371 = new col::_CompactLinkedHashSet::•<core::int*>();
           for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
             if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-              #t375.{core::Set::add}(42);
+              #t371.{core::Set::add}{Invariant}(42);
             else
-              #t375.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:226:70: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+              #t371.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:226:70: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
   <int>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) 42 else ...map, null};
                                                                      ^");
-          #t375.{core::Set::add}(null);
-        } =>#t375;
+          #t371.{core::Set::add}{Invariant}(null);
+        } =>#t371;
         <core::String*, core::int*>{invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:227:85: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
  - 'List' is from 'dart:core'.
   <String, int>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) \"bar\": 42 else ...list, \"baz\": null};
@@ -2527,396 +2548,391 @@
                                                                                     ^": null};
         final core::int* i = 0;
         block {
-          final core::List<core::int*>* #t376 = <core::int*>[];
+          final core::List<core::int*>* #t372 = <core::int*>[];
+          {
+            core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[1].{core::Iterable::iterator};
+            for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+              final core::int* #t373 = :sync-for-iterator.{core::Iterator::current};
+              {
+                invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:230:14: Error: Can't assign to the final variable 'i'.
+  <int>[for (i in <int>[1]) i];
+             ^";
+                #t372.{core::List::add}{Invariant}(i);
+              }
+            }
+          }
+        } =>#t372;
+        block {
+          final core::Set<core::int*>* #t374 = new col::_CompactLinkedHashSet::•<core::int*>();
+          {
+            core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[1].{core::Iterable::iterator};
+            for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+              final core::int* #t375 = :sync-for-iterator.{core::Iterator::current};
+              {
+                invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:231:14: Error: Can't assign to the final variable 'i'.
+  <int>{for (i in <int>[1]) i, null};
+             ^";
+                #t374.{core::Set::add}{Invariant}(i);
+              }
+            }
+          }
+          #t374.{core::Set::add}{Invariant}(null);
+        } =>#t374;
+        block {
+          final core::Map<core::String*, core::int*>* #t376 = <core::String*, core::int*>{};
           {
             core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[1].{core::Iterable::iterator};
             for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
               final core::int* #t377 = :sync-for-iterator.{core::Iterator::current};
               {
-                invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:230:14: Error: Can't assign to the final variable 'i'.
-  <int>[for (i in <int>[1]) i];
-             ^";
-                #t376.{core::List::add}(i);
-              }
-            }
-          }
-        } =>#t376;
-        block {
-          final core::Set<core::int*>* #t378 = new col::_CompactLinkedHashSet::•<core::int*>();
-          {
-            core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[1].{core::Iterable::iterator};
-            for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-              final core::int* #t379 = :sync-for-iterator.{core::Iterator::current};
-              {
-                invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:231:14: Error: Can't assign to the final variable 'i'.
-  <int>{for (i in <int>[1]) i, null};
-             ^";
-                #t378.{core::Set::add}(i);
-              }
-            }
-          }
-          #t378.{core::Set::add}(null);
-        } =>#t378;
-        block {
-          final core::Map<core::String*, core::int*>* #t380 = <core::String*, core::int*>{};
-          {
-            core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[1].{core::Iterable::iterator};
-            for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-              final core::int* #t381 = :sync-for-iterator.{core::Iterator::current};
-              {
                 invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:232:21: Error: Can't assign to the final variable 'i'.
 \t<String, int>{for (i in <int>[1]) \"bar\": i, \"baz\": null};
 \t                   ^";
-                #t380.{core::Map::[]=}("bar", i);
+                #t376.{core::Map::[]=}{Invariant}("bar", i);
               }
             }
           }
-          #t380.{core::Map::[]=}("baz", null);
-        } =>#t380;
+          #t376.{core::Map::[]=}{Invariant}("baz", null);
+        } =>#t376;
         core::List<dynamic>* list10 = block {
-          final core::List<dynamic>* #t382 = <dynamic>[];
+          final core::List<dynamic>* #t378 = <dynamic>[];
           {
-            core::Iterator<dynamic>* :sync-for-iterator = (let final<BottomType> #t383 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:234:31: Error: The type 'String' used in the 'for' loop must implement 'Iterable<dynamic>'.
+            core::Iterator<dynamic>* :sync-for-iterator = (let final<BottomType> #t379 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:234:31: Error: The type 'String' used in the 'for' loop must implement 'Iterable<dynamic>'.
  - 'Iterable' is from 'dart:core'.
   var list10 = [for (var i in \"not iterable\") i];
                               ^" in "not iterable" as{TypeError} core::Iterable<dynamic>*).{core::Iterable::iterator};
             for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
               dynamic i = :sync-for-iterator.{core::Iterator::current};
-              #t382.{core::List::add}(i);
+              #t378.{core::List::add}{Invariant}(i);
             }
           }
-        } =>#t382;
+        } =>#t378;
         core::Set<dynamic>* set10 = block {
-          final core::Set<dynamic>* #t384 = new col::_CompactLinkedHashSet::•<dynamic>();
+          final core::Set<dynamic>* #t380 = new col::_CompactLinkedHashSet::•<dynamic>();
           {
-            core::Iterator<dynamic>* :sync-for-iterator = (let final<BottomType> #t385 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:235:30: Error: The type 'String' used in the 'for' loop must implement 'Iterable<dynamic>'.
+            core::Iterator<dynamic>* :sync-for-iterator = (let final<BottomType> #t381 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:235:30: Error: The type 'String' used in the 'for' loop must implement 'Iterable<dynamic>'.
  - 'Iterable' is from 'dart:core'.
   var set10 = {for (var i in \"not iterable\") i, null};
                              ^" in "not iterable" as{TypeError} core::Iterable<dynamic>*).{core::Iterable::iterator};
             for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
               dynamic i = :sync-for-iterator.{core::Iterator::current};
-              #t384.{core::Set::add}(i);
+              #t380.{core::Set::add}{Invariant}(i);
             }
           }
-          #t384.{core::Set::add}(null);
-        } =>#t384;
+          #t380.{core::Set::add}{Invariant}(null);
+        } =>#t380;
         core::Map<core::String*, dynamic>* map10 = block {
-          final core::Map<core::String*, dynamic>* #t386 = <core::String*, dynamic>{};
+          final core::Map<core::String*, dynamic>* #t382 = <core::String*, dynamic>{};
           {
-            core::Iterator<dynamic>* :sync-for-iterator = (let final<BottomType> #t387 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:236:30: Error: The type 'String' used in the 'for' loop must implement 'Iterable<dynamic>'.
+            core::Iterator<dynamic>* :sync-for-iterator = (let final<BottomType> #t383 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:236:30: Error: The type 'String' used in the 'for' loop must implement 'Iterable<dynamic>'.
  - 'Iterable' is from 'dart:core'.
   var map10 = {for (var i in \"not iterable\") \"bar\": i, \"baz\": null};
                              ^" in "not iterable" as{TypeError} core::Iterable<dynamic>*).{core::Iterable::iterator};
             for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
               dynamic i = :sync-for-iterator.{core::Iterator::current};
-              #t386.{core::Map::[]=}("bar", i);
+              #t382.{core::Map::[]=}{Invariant}("bar", i);
             }
           }
-          #t386.{core::Map::[]=}("baz", null);
-        } =>#t386;
+          #t382.{core::Map::[]=}{Invariant}("baz", null);
+        } =>#t382;
         core::List<core::int*>* list20 = block {
-          final core::List<core::int*>* #t388 = <core::int*>[];
+          final core::List<core::int*>* #t384 = <core::int*>[];
           {
-            core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[let final<BottomType> #t389 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:237:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+            core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[let final<BottomType> #t385 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:237:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   var list20 = [for (int i in [\"not\", \"int\"]) i];
-                               ^" in "not" as{TypeError} core::int*, let final<BottomType> #t390 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:237:39: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+                               ^" in "not" as{TypeError} core::int*, let final<BottomType> #t386 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:237:39: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   var list20 = [for (int i in [\"not\", \"int\"]) i];
                                       ^" in "int" as{TypeError} core::int*].{core::Iterable::iterator};
             for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
               core::int* i = :sync-for-iterator.{core::Iterator::current};
-              #t388.{core::List::add}(i);
+              #t384.{core::List::add}{Invariant}(i);
             }
           }
-        } =>#t388;
+        } =>#t384;
         core::Set<core::int*>* set20 = block {
-          final core::Set<core::int*>* #t391 = new col::_CompactLinkedHashSet::•<core::int*>();
+          final core::Set<core::int*>* #t387 = new col::_CompactLinkedHashSet::•<core::int*>();
           {
-            core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[let final<BottomType> #t392 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:238:31: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+            core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[let final<BottomType> #t388 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:238:31: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   var set20 = {for (int i in [\"not\", \"int\"]) i, null};
-                              ^" in "not" as{TypeError} core::int*, let final<BottomType> #t393 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:238:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+                              ^" in "not" as{TypeError} core::int*, let final<BottomType> #t389 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:238:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   var set20 = {for (int i in [\"not\", \"int\"]) i, null};
                                      ^" in "int" as{TypeError} core::int*].{core::Iterable::iterator};
             for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
               core::int* i = :sync-for-iterator.{core::Iterator::current};
-              #t391.{core::Set::add}(i);
+              #t387.{core::Set::add}{Invariant}(i);
             }
           }
-          #t391.{core::Set::add}(null);
-        } =>#t391;
+          #t387.{core::Set::add}{Invariant}(null);
+        } =>#t387;
         core::Map<core::String*, core::int*>* map20 = block {
-          final core::Map<core::String*, core::int*>* #t394 = <core::String*, core::int*>{};
+          final core::Map<core::String*, core::int*>* #t390 = <core::String*, core::int*>{};
           {
-            core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[let final<BottomType> #t395 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:239:31: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+            core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[let final<BottomType> #t391 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:239:31: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   var map20 = {for (int i in [\"not\", \"int\"]) \"bar\": i, \"baz\": null};
-                              ^" in "not" as{TypeError} core::int*, let final<BottomType> #t396 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:239:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+                              ^" in "not" as{TypeError} core::int*, let final<BottomType> #t392 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:239:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   var map20 = {for (int i in [\"not\", \"int\"]) \"bar\": i, \"baz\": null};
                                      ^" in "int" as{TypeError} core::int*].{core::Iterable::iterator};
             for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
               core::int* i = :sync-for-iterator.{core::Iterator::current};
-              #t394.{core::Map::[]=}("bar", i);
+              #t390.{core::Map::[]=}{Invariant}("bar", i);
             }
           }
-          #t394.{core::Map::[]=}("baz", null);
-        } =>#t394;
-        final core::List<dynamic>* #t397 = <dynamic>[];
+          #t390.{core::Map::[]=}{Invariant}("baz", null);
+        } =>#t390;
+        final core::List<dynamic>* #t393 = <dynamic>[];
         {
-          asy::Stream<dynamic>* :stream = let final<BottomType> #t398 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:240:37: Error: The type 'String' used in the 'for' loop must implement 'Stream<dynamic>'.
+          asy::Stream<dynamic>* :stream = let final<BottomType> #t394 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:240:37: Error: The type 'String' used in the 'for' loop must implement 'Stream<dynamic>'.
  - 'Stream' is from 'dart:async'.
   var list30 = [await for (var i in \"not stream\") i];
                                     ^" in "not stream" as{TypeError} asy::Stream<dynamic>*;
-          asy::_asyncStarListenHelper(:stream, :async_op);
           asy::_StreamIterator<dynamic>* :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
           try
             #L2:
             while (true) {
-              dynamic #t399 = asy::_asyncStarMoveNextHelper(:stream);
-              [yield] let dynamic #t400 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
+              dynamic #t395 = asy::_asyncStarMoveNextHelper(:stream);
+              [yield] let dynamic #t396 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
               if(_in::unsafeCast<core::bool>(:result)) {
                 dynamic i = :for-iterator.{asy::_StreamIterator::current};
-                #t397.{core::List::add}(i);
+                #t393.{core::List::add}{Invariant}(i);
               }
               else
                 break #L2;
             }
           finally
             if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
-              [yield] let dynamic #t401 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
+              [yield] let dynamic #t397 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
               :result;
             }
         }
-        core::List<dynamic>* list30 = block {} =>#t397;
-        final core::Set<dynamic>* #t402 = new col::_CompactLinkedHashSet::•<dynamic>();
+        core::List<dynamic>* list30 = block {} =>#t393;
+        final core::Set<dynamic>* #t398 = new col::_CompactLinkedHashSet::•<dynamic>();
         {
-          asy::Stream<dynamic>* :stream = let final<BottomType> #t403 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:241:36: Error: The type 'String' used in the 'for' loop must implement 'Stream<dynamic>'.
+          asy::Stream<dynamic>* :stream = let final<BottomType> #t399 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:241:36: Error: The type 'String' used in the 'for' loop must implement 'Stream<dynamic>'.
  - 'Stream' is from 'dart:async'.
   var set30 = {await for (var i in \"not stream\") i, null};
                                    ^" in "not stream" as{TypeError} asy::Stream<dynamic>*;
-          asy::_asyncStarListenHelper(:stream, :async_op);
           asy::_StreamIterator<dynamic>* :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
           try
             #L3:
             while (true) {
-              dynamic #t404 = asy::_asyncStarMoveNextHelper(:stream);
-              [yield] let dynamic #t405 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
+              dynamic #t400 = asy::_asyncStarMoveNextHelper(:stream);
+              [yield] let dynamic #t401 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
               if(_in::unsafeCast<core::bool>(:result)) {
                 dynamic i = :for-iterator.{asy::_StreamIterator::current};
-                #t402.{core::Set::add}(i);
+                #t398.{core::Set::add}{Invariant}(i);
               }
               else
                 break #L3;
             }
           finally
             if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
-              [yield] let dynamic #t406 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
+              [yield] let dynamic #t402 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
               :result;
             }
         }
         core::Set<dynamic>* set30 = block {
-          #t402.{core::Set::add}(null);
-        } =>#t402;
-        final core::Map<core::String*, dynamic>* #t407 = <core::String*, dynamic>{};
+          #t398.{core::Set::add}{Invariant}(null);
+        } =>#t398;
+        final core::Map<core::String*, dynamic>* #t403 = <core::String*, dynamic>{};
         {
-          asy::Stream<dynamic>* :stream = let final<BottomType> #t408 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:242:36: Error: The type 'String' used in the 'for' loop must implement 'Stream<dynamic>'.
+          asy::Stream<dynamic>* :stream = let final<BottomType> #t404 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:242:36: Error: The type 'String' used in the 'for' loop must implement 'Stream<dynamic>'.
  - 'Stream' is from 'dart:async'.
   var map30 = {await for (var i in \"not stream\") \"bar\": i, \"baz\": null};
                                    ^" in "not stream" as{TypeError} asy::Stream<dynamic>*;
-          asy::_asyncStarListenHelper(:stream, :async_op);
           asy::_StreamIterator<dynamic>* :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
           try
             #L4:
             while (true) {
-              dynamic #t409 = asy::_asyncStarMoveNextHelper(:stream);
-              [yield] let dynamic #t410 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
+              dynamic #t405 = asy::_asyncStarMoveNextHelper(:stream);
+              [yield] let dynamic #t406 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
               if(_in::unsafeCast<core::bool>(:result)) {
                 dynamic i = :for-iterator.{asy::_StreamIterator::current};
-                #t407.{core::Map::[]=}("bar", i);
+                #t403.{core::Map::[]=}{Invariant}("bar", i);
               }
               else
                 break #L4;
             }
           finally
             if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
-              [yield] let dynamic #t411 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
+              [yield] let dynamic #t407 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
               :result;
             }
         }
         core::Map<core::String*, dynamic>* map30 = block {
-          #t407.{core::Map::[]=}("baz", null);
-        } =>#t407;
-        final core::List<core::int*>* #t412 = <core::int*>[];
+          #t403.{core::Map::[]=}{Invariant}("baz", null);
+        } =>#t403;
+        final core::List<core::int*>* #t408 = <core::int*>[];
         {
-          asy::Stream<core::int*> :stream = asy::Stream::fromIterable<core::int*>(<core::int*>[let final<BottomType> #t413 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:243:58: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+          asy::Stream<core::int*> :stream = asy::Stream::fromIterable<core::int*>(<core::int*>[let final<BottomType> #t409 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:243:58: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   var list40 = [await for (int i in Stream.fromIterable([\"not\", \"int\"])) i];
-                                                         ^" in "not" as{TypeError} core::int*, let final<BottomType> #t414 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:243:65: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+                                                         ^" in "not" as{TypeError} core::int*, let final<BottomType> #t410 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:243:65: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   var list40 = [await for (int i in Stream.fromIterable([\"not\", \"int\"])) i];
                                                                 ^" in "int" as{TypeError} core::int*]);
-          asy::_asyncStarListenHelper(:stream, :async_op);
           asy::_StreamIterator<core::int*>* :for-iterator = new asy::_StreamIterator::•<core::int*>(:stream);
           try
             #L5:
             while (true) {
-              dynamic #t415 = asy::_asyncStarMoveNextHelper(:stream);
-              [yield] let dynamic #t416 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
+              dynamic #t411 = asy::_asyncStarMoveNextHelper(:stream);
+              [yield] let dynamic #t412 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
               if(_in::unsafeCast<core::bool>(:result)) {
                 core::int* i = :for-iterator.{asy::_StreamIterator::current};
-                #t412.{core::List::add}(i);
+                #t408.{core::List::add}{Invariant}(i);
               }
               else
                 break #L5;
             }
           finally
             if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
-              [yield] let dynamic #t417 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
+              [yield] let dynamic #t413 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
               :result;
             }
         }
-        core::List<core::int*>* list40 = block {} =>#t412;
-        final core::Set<core::int*>* #t418 = new col::_CompactLinkedHashSet::•<core::int*>();
+        core::List<core::int*>* list40 = block {} =>#t408;
+        final core::Set<core::int*>* #t414 = new col::_CompactLinkedHashSet::•<core::int*>();
         {
-          asy::Stream<core::int*> :stream = asy::Stream::fromIterable<core::int*>(<core::int*>[let final<BottomType> #t419 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:244:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+          asy::Stream<core::int*> :stream = asy::Stream::fromIterable<core::int*>(<core::int*>[let final<BottomType> #t415 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:244:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   var set40 = {await for (int i in Stream.fromIterable([\"not\", \"int\"])) i, null};
-                                                        ^" in "not" as{TypeError} core::int*, let final<BottomType> #t420 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:244:64: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+                                                        ^" in "not" as{TypeError} core::int*, let final<BottomType> #t416 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:244:64: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   var set40 = {await for (int i in Stream.fromIterable([\"not\", \"int\"])) i, null};
                                                                ^" in "int" as{TypeError} core::int*]);
-          asy::_asyncStarListenHelper(:stream, :async_op);
           asy::_StreamIterator<core::int*>* :for-iterator = new asy::_StreamIterator::•<core::int*>(:stream);
           try
             #L6:
             while (true) {
-              dynamic #t421 = asy::_asyncStarMoveNextHelper(:stream);
-              [yield] let dynamic #t422 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
+              dynamic #t417 = asy::_asyncStarMoveNextHelper(:stream);
+              [yield] let dynamic #t418 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
               if(_in::unsafeCast<core::bool>(:result)) {
                 core::int* i = :for-iterator.{asy::_StreamIterator::current};
-                #t418.{core::Set::add}(i);
+                #t414.{core::Set::add}{Invariant}(i);
               }
               else
                 break #L6;
             }
           finally
             if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
-              [yield] let dynamic #t423 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
+              [yield] let dynamic #t419 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
               :result;
             }
         }
         core::Set<core::int*>* set40 = block {
-          #t418.{core::Set::add}(null);
-        } =>#t418;
-        final core::Map<core::String*, core::int*>* #t424 = <core::String*, core::int*>{};
+          #t414.{core::Set::add}{Invariant}(null);
+        } =>#t414;
+        final core::Map<core::String*, core::int*>* #t420 = <core::String*, core::int*>{};
         {
-          asy::Stream<core::int*> :stream = asy::Stream::fromIterable<core::int*>(<core::int*>[let final<BottomType> #t425 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:245:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+          asy::Stream<core::int*> :stream = asy::Stream::fromIterable<core::int*>(<core::int*>[let final<BottomType> #t421 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:245:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   var map40 = {await for (int i in Stream.fromIterable([\"not\", \"int\"])) \"bar\": i, \"baz\": null};
-                                                        ^" in "not" as{TypeError} core::int*, let final<BottomType> #t426 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:245:64: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+                                                        ^" in "not" as{TypeError} core::int*, let final<BottomType> #t422 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:245:64: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   var map40 = {await for (int i in Stream.fromIterable([\"not\", \"int\"])) \"bar\": i, \"baz\": null};
                                                                ^" in "int" as{TypeError} core::int*]);
-          asy::_asyncStarListenHelper(:stream, :async_op);
           asy::_StreamIterator<core::int*>* :for-iterator = new asy::_StreamIterator::•<core::int*>(:stream);
           try
             #L7:
             while (true) {
-              dynamic #t427 = asy::_asyncStarMoveNextHelper(:stream);
-              [yield] let dynamic #t428 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
+              dynamic #t423 = asy::_asyncStarMoveNextHelper(:stream);
+              [yield] let dynamic #t424 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
               if(_in::unsafeCast<core::bool>(:result)) {
                 core::int* i = :for-iterator.{asy::_StreamIterator::current};
-                #t424.{core::Map::[]=}("bar", i);
+                #t420.{core::Map::[]=}{Invariant}("bar", i);
               }
               else
                 break #L7;
             }
           finally
             if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
-              [yield] let dynamic #t429 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
+              [yield] let dynamic #t425 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
               :result;
             }
         }
         core::Map<core::String*, core::int*>* map40 = block {
-          #t424.{core::Map::[]=}("baz", null);
-        } =>#t424;
+          #t420.{core::Map::[]=}{Invariant}("baz", null);
+        } =>#t420;
         core::List<core::int*>* list50 = block {
-          final core::List<core::int*>* #t430 = <core::int*>[];
+          final core::List<core::int*>* #t426 = <core::int*>[];
           for (; ; )
-            #t430.{core::List::add}(42);
-        } =>#t430;
+            #t426.{core::List::add}{Invariant}(42);
+        } =>#t426;
         core::Set<core::int*>* set50 = block {
-          final core::Set<core::int*>* #t431 = new col::_CompactLinkedHashSet::•<core::int*>();
+          final core::Set<core::int*>* #t427 = new col::_CompactLinkedHashSet::•<core::int*>();
           for (; ; )
-            #t431.{core::Set::add}(42);
-          #t431.{core::Set::add}(null);
-        } =>#t431;
+            #t427.{core::Set::add}{Invariant}(42);
+          #t427.{core::Set::add}{Invariant}(null);
+        } =>#t427;
         core::Map<core::String*, core::int*>* map50 = block {
-          final core::Map<core::String*, core::int*>* #t432 = <core::String*, core::int*>{};
+          final core::Map<core::String*, core::int*>* #t428 = <core::String*, core::int*>{};
           for (; ; )
-            #t432.{core::Map::[]=}("bar", 42);
-          #t432.{core::Map::[]=}("baz", null);
-        } =>#t432;
+            #t428.{core::Map::[]=}{Invariant}("bar", 42);
+          #t428.{core::Map::[]=}{Invariant}("baz", null);
+        } =>#t428;
         core::List<core::int*>* list60 = block {
-          final core::List<core::int*>* #t433 = <core::int*>[];
-          for (; let final<BottomType> #t434 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:249:24: Error: A value of type 'String' can't be assigned to a variable of type 'bool'.
+          final core::List<core::int*>* #t429 = <core::int*>[];
+          for (; let final<BottomType> #t430 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:249:24: Error: A value of type 'String' can't be assigned to a variable of type 'bool'.
   var list60 = [for (; \"not bool\";) 42];
                        ^" in "not bool" as{TypeError} core::bool*; )
-            #t433.{core::List::add}(42);
-        } =>#t433;
+            #t429.{core::List::add}{Invariant}(42);
+        } =>#t429;
         core::Set<core::int*>* set60 = block {
-          final core::Set<core::int*>* #t435 = new col::_CompactLinkedHashSet::•<core::int*>();
-          for (; let final<BottomType> #t436 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:250:23: Error: A value of type 'String' can't be assigned to a variable of type 'bool'.
+          final core::Set<core::int*>* #t431 = new col::_CompactLinkedHashSet::•<core::int*>();
+          for (; let final<BottomType> #t432 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:250:23: Error: A value of type 'String' can't be assigned to a variable of type 'bool'.
   var set60 = {for (; \"not bool\";) 42, null};
                       ^" in "not bool" as{TypeError} core::bool*; )
-            #t435.{core::Set::add}(42);
-          #t435.{core::Set::add}(null);
-        } =>#t435;
+            #t431.{core::Set::add}{Invariant}(42);
+          #t431.{core::Set::add}{Invariant}(null);
+        } =>#t431;
         core::Map<core::String*, core::int*>* map60 = block {
-          final core::Map<core::String*, core::int*>* #t437 = <core::String*, core::int*>{};
-          for (; let final<BottomType> #t438 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:251:23: Error: A value of type 'String' can't be assigned to a variable of type 'bool'.
+          final core::Map<core::String*, core::int*>* #t433 = <core::String*, core::int*>{};
+          for (; let final<BottomType> #t434 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:251:23: Error: A value of type 'String' can't be assigned to a variable of type 'bool'.
   var map60 = {for (; \"not bool\";) \"bar\": 42, \"baz\": null};
                       ^" in "not bool" as{TypeError} core::bool*; )
-            #t437.{core::Map::[]=}("bar", 42);
-          #t437.{core::Map::[]=}("baz", null);
-        } =>#t437;
+            #t433.{core::Map::[]=}{Invariant}("bar", 42);
+          #t433.{core::Map::[]=}{Invariant}("baz", null);
+        } =>#t433;
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method testForElementErrorsNotAsync(asy::Stream<core::int*>* stream) → dynamic {
   block {
-    final core::List<core::int*>* #t439 = <core::int*>[];
+    final core::List<core::int*>* #t435 = <core::int*>[];
     await for (core::int* i in stream)
-      #t439.{core::List::add}(i);
-  } =>#t439;
+      #t435.{core::List::add}{Invariant}(i);
+  } =>#t435;
   block {
-    final core::Set<core::int*>* #t440 = new col::_CompactLinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t436 = new col::_CompactLinkedHashSet::•<core::int*>();
     await for (core::int* i in stream)
-      #t440.{core::Set::add}(i);
-  } =>#t440;
+      #t436.{core::Set::add}{Invariant}(i);
+  } =>#t436;
   block {
-    final core::Map<core::String*, core::int*>* #t441 = <core::String*, core::int*>{};
+    final core::Map<core::String*, core::int*>* #t437 = <core::String*, core::int*>{};
     await for (core::int* i in stream)
-      #t441.{core::Map::[]=}("bar", i);
-  } =>#t441;
+      #t437.{core::Map::[]=}{Invariant}("bar", i);
+  } =>#t437;
 }
 static method testPromotion(self::A* a) → dynamic {
   core::List<core::int*>* list10 = block {
-    final core::List<core::int*>* #t442 = <core::int*>[];
+    final core::List<core::int*>* #t438 = <core::int*>[];
     if(a is self::B*)
-      #t442.{core::List::add}(a{self::B*}.{self::B::foo});
-  } =>#t442;
+      #t438.{core::List::add}{Invariant}(a{self::B*}.{self::B::foo});
+  } =>#t438;
   core::Set<core::int*>* set10 = block {
-    final core::Set<core::int*>* #t443 = new col::_CompactLinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t439 = new col::_CompactLinkedHashSet::•<core::int*>();
     if(a is self::B*)
-      #t443.{core::Set::add}(a{self::B*}.{self::B::foo});
-  } =>#t443;
+      #t439.{core::Set::add}{Invariant}(a{self::B*}.{self::B::foo});
+  } =>#t439;
   core::Map<core::int*, core::int*>* map10 = block {
-    final core::Map<core::int*, core::int*>* #t444 = <core::int*, core::int*>{};
+    final core::Map<core::int*, core::int*>* #t440 = <core::int*, core::int*>{};
     if(a is self::B*)
-      #t444.{core::Map::[]=}(a{self::B*}.{self::B::foo}, a{self::B*}.{self::B::foo});
-  } =>#t444;
+      #t440.{core::Map::[]=}{Invariant}(a{self::B*}.{self::B::foo}, a{self::B*}.{self::B::foo});
+  } =>#t440;
 }
 static method main() → dynamic {}
 
diff --git a/pkg/front_end/testcases/general/covariant_field_override.dart b/pkg/front_end/testcases/general/covariant_field_override.dart
new file mode 100644
index 0000000..120fd23
--- /dev/null
+++ b/pkg/front_end/testcases/general/covariant_field_override.dart
@@ -0,0 +1,17 @@
+// Copyright (c) 2020, 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.
+
+class A {
+  num field;
+}
+
+class B {
+  covariant num field;
+}
+
+class C extends A implements B {
+  num field;
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/covariant_field_override.dart.outline.expect b/pkg/front_end/testcases/general/covariant_field_override.dart.outline.expect
new file mode 100644
index 0000000..d5cf801
--- /dev/null
+++ b/pkg/front_end/testcases/general/covariant_field_override.dart.outline.expect
@@ -0,0 +1,41 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field core::num* field;
+  synthetic constructor •() → self::A*
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends core::Object {
+  covariant field core::num* field;
+  synthetic constructor •() → self::B*
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C extends self::A implements self::B {
+  covariant field core::num* field;
+  synthetic constructor •() → self::C*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/covariant_field_override.dart.strong.expect b/pkg/front_end/testcases/general/covariant_field_override.dart.strong.expect
new file mode 100644
index 0000000..22e490c
--- /dev/null
+++ b/pkg/front_end/testcases/general/covariant_field_override.dart.strong.expect
@@ -0,0 +1,43 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field core::num* field = null;
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends core::Object {
+  covariant field core::num* field = null;
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C extends self::A implements self::B {
+  covariant field core::num* field = null;
+  synthetic constructor •() → self::C*
+    : super self::A::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/covariant_field_override.dart.strong.transformed.expect b/pkg/front_end/testcases/general/covariant_field_override.dart.strong.transformed.expect
new file mode 100644
index 0000000..22e490c
--- /dev/null
+++ b/pkg/front_end/testcases/general/covariant_field_override.dart.strong.transformed.expect
@@ -0,0 +1,43 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field core::num* field = null;
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends core::Object {
+  covariant field core::num* field = null;
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C extends self::A implements self::B {
+  covariant field core::num* field = null;
+  synthetic constructor •() → self::C*
+    : super self::A::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/covariant_field_override.dart.textual_outline.expect b/pkg/front_end/testcases/general/covariant_field_override.dart.textual_outline.expect
new file mode 100644
index 0000000..d01b911
--- /dev/null
+++ b/pkg/front_end/testcases/general/covariant_field_override.dart.textual_outline.expect
@@ -0,0 +1,13 @@
+class A {
+  num field;
+}
+
+class B {
+  covariant num field;
+}
+
+class C extends A implements B {
+  num field;
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/covariant_field_override.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/covariant_field_override.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..d01b911
--- /dev/null
+++ b/pkg/front_end/testcases/general/covariant_field_override.dart.textual_outline_modelled.expect
@@ -0,0 +1,13 @@
+class A {
+  num field;
+}
+
+class B {
+  covariant num field;
+}
+
+class C extends A implements B {
+  num field;
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/covariant_generic.dart.strong.expect b/pkg/front_end/testcases/general/covariant_generic.dart.strong.expect
index 7c34544..48b1bf5 100644
--- a/pkg/front_end/testcases/general/covariant_generic.dart.strong.expect
+++ b/pkg/front_end/testcases/general/covariant_generic.dart.strong.expect
@@ -28,22 +28,22 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 static method main() → dynamic {
-  self::Foo<core::int*>* fooInt = new self::Foo::•<core::int*>(1, (core::int* x) → core::Null? {});
+  self::Foo<core::int*>* fooInt = new self::Foo::•<core::int*>(1, (core::int* x) → Null {});
   fooInt.{self::Foo::method}(3);
   fooInt.{self::Foo::setter} = 3;
-  fooInt.{self::Foo::withCallback}((core::int* x) → core::Null? {});
-  fooInt.{self::Foo::withCallback}((core::num* x) → core::Null? {});
+  fooInt.{self::Foo::withCallback}((core::int* x) → Null {});
+  fooInt.{self::Foo::withCallback}((core::num* x) → Null {});
   fooInt.{self::Foo::mutableField} = 3;
-  fooInt.{self::Foo::mutableCallbackField} = (core::int* x) → core::Null? {};
+  fooInt.{self::Foo::mutableCallbackField} = (core::int* x) → Null {};
   self::Foo<core::num*>* fooNum = fooInt;
   fooNum.{self::Foo::method}(3);
   fooNum.{self::Foo::method}(2.5);
   fooNum.{self::Foo::setter} = 3;
   fooNum.{self::Foo::setter} = 2.5;
-  fooNum.{self::Foo::withCallback}((core::num* x) → core::Null? {});
+  fooNum.{self::Foo::withCallback}((core::num* x) → Null {});
   fooNum.{self::Foo::mutableField} = 3;
   fooNum.{self::Foo::mutableField} = 2.5;
   let final self::Foo<core::num*>* #t1 = fooNum in let final core::int* #t2 = 3 in (#t1.{self::Foo::mutableCallbackField} as{TypeError,CovarianceCheck} (core::num*) →* void).call(#t2);
   let final self::Foo<core::num*>* #t3 = fooNum in let final core::double* #t4 = 2.5 in (#t3.{self::Foo::mutableCallbackField} as{TypeError,CovarianceCheck} (core::num*) →* void).call(#t4);
-  fooNum.{self::Foo::mutableCallbackField} = (core::num* x) → core::Null? {};
+  fooNum.{self::Foo::mutableCallbackField} = (core::num* x) → Null {};
 }
diff --git a/pkg/front_end/testcases/general/covariant_generic.dart.strong.transformed.expect b/pkg/front_end/testcases/general/covariant_generic.dart.strong.transformed.expect
index 3d30d4a..5ecd44d 100644
--- a/pkg/front_end/testcases/general/covariant_generic.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/covariant_generic.dart.strong.transformed.expect
@@ -28,24 +28,24 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 static method main() → dynamic {
-  self::Foo<core::int*>* fooInt = new self::Foo::•<core::int*>(1, (core::int* x) → core::Null? {});
+  self::Foo<core::int*>* fooInt = new self::Foo::•<core::int*>(1, (core::int* x) → Null {});
   fooInt.{self::Foo::method}(3);
   fooInt.{self::Foo::setter} = 3;
-  fooInt.{self::Foo::withCallback}((core::int* x) → core::Null? {});
-  fooInt.{self::Foo::withCallback}((core::num* x) → core::Null? {});
+  fooInt.{self::Foo::withCallback}((core::int* x) → Null {});
+  fooInt.{self::Foo::withCallback}((core::num* x) → Null {});
   fooInt.{self::Foo::mutableField} = 3;
-  fooInt.{self::Foo::mutableCallbackField} = (core::int* x) → core::Null? {};
+  fooInt.{self::Foo::mutableCallbackField} = (core::int* x) → Null {};
   self::Foo<core::num*>* fooNum = fooInt;
   fooNum.{self::Foo::method}(3);
   fooNum.{self::Foo::method}(2.5);
   fooNum.{self::Foo::setter} = 3;
   fooNum.{self::Foo::setter} = 2.5;
-  fooNum.{self::Foo::withCallback}((core::num* x) → core::Null? {});
+  fooNum.{self::Foo::withCallback}((core::num* x) → Null {});
   fooNum.{self::Foo::mutableField} = 3;
   fooNum.{self::Foo::mutableField} = 2.5;
   let final self::Foo<core::num*>* #t1 = fooNum in let final core::int* #t2 = 3 in (#t1.{self::Foo::mutableCallbackField} as{TypeError,CovarianceCheck} (core::num*) →* void).call(#t2);
   let final self::Foo<core::num*>* #t3 = fooNum in let final core::double* #t4 = 2.5 in (#t3.{self::Foo::mutableCallbackField} as{TypeError,CovarianceCheck} (core::num*) →* void).call(#t4);
-  fooNum.{self::Foo::mutableCallbackField} = (core::num* x) → core::Null? {};
+  fooNum.{self::Foo::mutableCallbackField} = (core::num* x) → Null {};
 }
 
 
diff --git a/pkg/front_end/testcases/general/covariant_super_check.dart b/pkg/front_end/testcases/general/covariant_super_check.dart
new file mode 100644
index 0000000..1d8e5cc
--- /dev/null
+++ b/pkg/front_end/testcases/general/covariant_super_check.dart
@@ -0,0 +1,19 @@
+// Copyright (c) 2020, 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.
+
+class A {
+  method(num a) {}
+}
+
+class B extends A {
+  // This override is ok.
+  method(dynamic a) {}
+}
+
+class C extends B {
+  // This override is ok against B.method but not against A.method.
+  method(covariant String a) {}
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/covariant_super_check.dart.outline.expect b/pkg/front_end/testcases/general/covariant_super_check.dart.outline.expect
new file mode 100644
index 0000000..e83a1aa
--- /dev/null
+++ b/pkg/front_end/testcases/general/covariant_super_check.dart.outline.expect
@@ -0,0 +1,45 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/covariant_super_check.dart:16:27: Error: The parameter 'a' of the method 'C.method' has type 'String', which does not match the corresponding type, 'num', in the overridden method, 'A.method'.
+// Change to a supertype of 'num', or, for a covariant parameter, a subtype.
+//   method(covariant String a) {}
+//                           ^
+// pkg/front_end/testcases/general/covariant_super_check.dart:6:3: Context: This is the overridden method ('method').
+//   method(num a) {}
+//   ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    ;
+  method method(core::num* a) → dynamic
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends self::A {
+  synthetic constructor •() → self::B*
+    ;
+  method method(dynamic a) → dynamic
+    ;
+}
+class C extends self::B {
+  synthetic constructor •() → self::C*
+    ;
+  method method(covariant core::String* a) → dynamic
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/covariant_super_check.dart.strong.expect b/pkg/front_end/testcases/general/covariant_super_check.dart.strong.expect
new file mode 100644
index 0000000..c51ea4f
--- /dev/null
+++ b/pkg/front_end/testcases/general/covariant_super_check.dart.strong.expect
@@ -0,0 +1,44 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/covariant_super_check.dart:16:27: Error: The parameter 'a' of the method 'C.method' has type 'String', which does not match the corresponding type, 'num', in the overridden method, 'A.method'.
+// Change to a supertype of 'num', or, for a covariant parameter, a subtype.
+//   method(covariant String a) {}
+//                           ^
+// pkg/front_end/testcases/general/covariant_super_check.dart:6:3: Context: This is the overridden method ('method').
+//   method(num a) {}
+//   ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  method method(core::num* a) → dynamic {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends self::A {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+  method method(dynamic a) → dynamic {}
+}
+class C extends self::B {
+  synthetic constructor •() → self::C*
+    : super self::B::•()
+    ;
+  method method(covariant core::String* a) → dynamic {}
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/covariant_super_check.dart.strong.transformed.expect b/pkg/front_end/testcases/general/covariant_super_check.dart.strong.transformed.expect
new file mode 100644
index 0000000..c51ea4f
--- /dev/null
+++ b/pkg/front_end/testcases/general/covariant_super_check.dart.strong.transformed.expect
@@ -0,0 +1,44 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/covariant_super_check.dart:16:27: Error: The parameter 'a' of the method 'C.method' has type 'String', which does not match the corresponding type, 'num', in the overridden method, 'A.method'.
+// Change to a supertype of 'num', or, for a covariant parameter, a subtype.
+//   method(covariant String a) {}
+//                           ^
+// pkg/front_end/testcases/general/covariant_super_check.dart:6:3: Context: This is the overridden method ('method').
+//   method(num a) {}
+//   ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  method method(core::num* a) → dynamic {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends self::A {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+  method method(dynamic a) → dynamic {}
+}
+class C extends self::B {
+  synthetic constructor •() → self::C*
+    : super self::B::•()
+    ;
+  method method(covariant core::String* a) → dynamic {}
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/covariant_super_check.dart.textual_outline.expect b/pkg/front_end/testcases/general/covariant_super_check.dart.textual_outline.expect
new file mode 100644
index 0000000..a1ec327
--- /dev/null
+++ b/pkg/front_end/testcases/general/covariant_super_check.dart.textual_outline.expect
@@ -0,0 +1,13 @@
+class A {
+  method(num a) {}
+}
+
+class B extends A {
+  method(dynamic a) {}
+}
+
+class C extends B {
+  method(covariant String a) {}
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/covariant_super_check.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/covariant_super_check.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..a1ec327
--- /dev/null
+++ b/pkg/front_end/testcases/general/covariant_super_check.dart.textual_outline_modelled.expect
@@ -0,0 +1,13 @@
+class A {
+  method(num a) {}
+}
+
+class B extends A {
+  method(dynamic a) {}
+}
+
+class C extends B {
+  method(covariant String a) {}
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/covariant_type_parameter.dart b/pkg/front_end/testcases/general/covariant_type_parameter.dart
new file mode 100644
index 0000000..07f2186
--- /dev/null
+++ b/pkg/front_end/testcases/general/covariant_type_parameter.dart
@@ -0,0 +1,19 @@
+// Copyright (c) 2020, 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.
+
+class A<S> {
+  void method<T extends S>(S s) {}
+}
+
+class B<S> {
+  void method<T extends S>(covariant S s) {}
+}
+
+class C<S> extends A<S> implements B<S> {
+  void method<T extends S>(S s);
+}
+
+class D<S> extends A<S> implements B<S> {}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/covariant_type_parameter.dart.outline.expect b/pkg/front_end/testcases/general/covariant_type_parameter.dart.outline.expect
new file mode 100644
index 0000000..7b6fa81
--- /dev/null
+++ b/pkg/front_end/testcases/general/covariant_type_parameter.dart.outline.expect
@@ -0,0 +1,50 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<S extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::S*>*
+    ;
+  method method<generic-covariant-impl T extends self::A::S* = self::A::S*>(generic-covariant-impl self::A::S* s) → void
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B<S extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::S*>*
+    ;
+  method method<generic-covariant-impl T extends self::B::S* = self::B::S*>(covariant generic-covariant-impl self::B::S* s) → void
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C<S extends core::Object* = dynamic> extends self::A<self::C::S*> implements self::B<self::C::S*> {
+  synthetic constructor •() → self::C<self::C::S*>*
+    ;
+  forwarding-stub forwarding-semi-stub method method<generic-covariant-impl T extends self::C::S* = self::C::S*>(covariant generic-covariant-impl self::C::S* s) → void
+    return super.{self::A::method}<self::C::method::T*>(s);
+}
+class D<S extends core::Object* = dynamic> extends self::A<self::D::S*> implements self::B<self::D::S*> {
+  synthetic constructor •() → self::D<self::D::S*>*
+    ;
+  forwarding-stub method method<generic-covariant-impl T extends self::D::S* = self::D::S*>(covariant generic-covariant-impl self::D::S* s) → void
+    return super.{self::A::method}<self::D::method::T*>(s);
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/covariant_type_parameter.dart.strong.expect b/pkg/front_end/testcases/general/covariant_type_parameter.dart.strong.expect
new file mode 100644
index 0000000..02336a0
--- /dev/null
+++ b/pkg/front_end/testcases/general/covariant_type_parameter.dart.strong.expect
@@ -0,0 +1,51 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<S extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::S*>*
+    : super core::Object::•()
+    ;
+  method method<generic-covariant-impl T extends self::A::S* = self::A::S*>(generic-covariant-impl self::A::S* s) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B<S extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::S*>*
+    : super core::Object::•()
+    ;
+  method method<generic-covariant-impl T extends self::B::S* = self::B::S*>(covariant generic-covariant-impl self::B::S* s) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C<S extends core::Object* = dynamic> extends self::A<self::C::S*> implements self::B<self::C::S*> {
+  synthetic constructor •() → self::C<self::C::S*>*
+    : super self::A::•()
+    ;
+  forwarding-stub forwarding-semi-stub method method<generic-covariant-impl T extends self::C::S* = self::C::S*>(covariant generic-covariant-impl self::C::S* s) → void
+    return super.{self::A::method}<self::C::method::T*>(s);
+}
+class D<S extends core::Object* = dynamic> extends self::A<self::D::S*> implements self::B<self::D::S*> {
+  synthetic constructor •() → self::D<self::D::S*>*
+    : super self::A::•()
+    ;
+  forwarding-stub method method<generic-covariant-impl T extends self::D::S* = self::D::S*>(covariant generic-covariant-impl self::D::S* s) → void
+    return super.{self::A::method}<self::D::method::T*>(s);
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/covariant_type_parameter.dart.strong.transformed.expect b/pkg/front_end/testcases/general/covariant_type_parameter.dart.strong.transformed.expect
new file mode 100644
index 0000000..02336a0
--- /dev/null
+++ b/pkg/front_end/testcases/general/covariant_type_parameter.dart.strong.transformed.expect
@@ -0,0 +1,51 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<S extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::S*>*
+    : super core::Object::•()
+    ;
+  method method<generic-covariant-impl T extends self::A::S* = self::A::S*>(generic-covariant-impl self::A::S* s) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B<S extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::S*>*
+    : super core::Object::•()
+    ;
+  method method<generic-covariant-impl T extends self::B::S* = self::B::S*>(covariant generic-covariant-impl self::B::S* s) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C<S extends core::Object* = dynamic> extends self::A<self::C::S*> implements self::B<self::C::S*> {
+  synthetic constructor •() → self::C<self::C::S*>*
+    : super self::A::•()
+    ;
+  forwarding-stub forwarding-semi-stub method method<generic-covariant-impl T extends self::C::S* = self::C::S*>(covariant generic-covariant-impl self::C::S* s) → void
+    return super.{self::A::method}<self::C::method::T*>(s);
+}
+class D<S extends core::Object* = dynamic> extends self::A<self::D::S*> implements self::B<self::D::S*> {
+  synthetic constructor •() → self::D<self::D::S*>*
+    : super self::A::•()
+    ;
+  forwarding-stub method method<generic-covariant-impl T extends self::D::S* = self::D::S*>(covariant generic-covariant-impl self::D::S* s) → void
+    return super.{self::A::method}<self::D::method::T*>(s);
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/covariant_type_parameter.dart.textual_outline.expect b/pkg/front_end/testcases/general/covariant_type_parameter.dart.textual_outline.expect
new file mode 100644
index 0000000..c11d77c
--- /dev/null
+++ b/pkg/front_end/testcases/general/covariant_type_parameter.dart.textual_outline.expect
@@ -0,0 +1,15 @@
+class A<S> {
+  void method<T extends S>(S s) {}
+}
+
+class B<S> {
+  void method<T extends S>(covariant S s) {}
+}
+
+class C<S> extends A<S> implements B<S> {
+  void method<T extends S>(S s);
+}
+
+class D<S> extends A<S> implements B<S> {}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/covariant_type_parameter.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/covariant_type_parameter.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..c11d77c
--- /dev/null
+++ b/pkg/front_end/testcases/general/covariant_type_parameter.dart.textual_outline_modelled.expect
@@ -0,0 +1,15 @@
+class A<S> {
+  void method<T extends S>(S s) {}
+}
+
+class B<S> {
+  void method<T extends S>(covariant S s) {}
+}
+
+class C<S> extends A<S> implements B<S> {
+  void method<T extends S>(S s);
+}
+
+class D<S> extends A<S> implements B<S> {}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/error_locations/error_location_05.dart.strong.expect b/pkg/front_end/testcases/general/error_locations/error_location_05.dart.strong.expect
index d9a0e7e..c53238d 100644
--- a/pkg/front_end/testcases/general/error_locations/error_location_05.dart.strong.expect
+++ b/pkg/front_end/testcases/general/error_locations/error_location_05.dart.strong.expect
@@ -17,12 +17,11 @@
 //     ^
 //
 import self as self;
-import "dart:core" as core;
 
 part error_location_05_lib1.dart;
 static method /* from org-dartlang-testcase:///error_location_05_lib1.dart */ x1(dynamic z, {dynamic z = #C1}) → dynamic {}
 static method /* from org-dartlang-testcase:///error_location_05_lib1.dart */ x2() → dynamic {
-  function y(dynamic z, {dynamic z = #C1}) → core::Null? {}
+  function y(dynamic z, {dynamic z = #C1}) → Null {}
 }
 
 constants  {
diff --git a/pkg/front_end/testcases/general/error_locations/error_location_05.dart.strong.transformed.expect b/pkg/front_end/testcases/general/error_locations/error_location_05.dart.strong.transformed.expect
index d9a0e7e..c53238d 100644
--- a/pkg/front_end/testcases/general/error_locations/error_location_05.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/error_locations/error_location_05.dart.strong.transformed.expect
@@ -17,12 +17,11 @@
 //     ^
 //
 import self as self;
-import "dart:core" as core;
 
 part error_location_05_lib1.dart;
 static method /* from org-dartlang-testcase:///error_location_05_lib1.dart */ x1(dynamic z, {dynamic z = #C1}) → dynamic {}
 static method /* from org-dartlang-testcase:///error_location_05_lib1.dart */ x2() → dynamic {
-  function y(dynamic z, {dynamic z = #C1}) → core::Null? {}
+  function y(dynamic z, {dynamic z = #C1}) → Null {}
 }
 
 constants  {
diff --git a/pkg/front_end/testcases/general/error_locations/error_location_06.dart.strong.expect b/pkg/front_end/testcases/general/error_locations/error_location_06.dart.strong.expect
index a8ad767..de18361 100644
--- a/pkg/front_end/testcases/general/error_locations/error_location_06.dart.strong.expect
+++ b/pkg/front_end/testcases/general/error_locations/error_location_06.dart.strong.expect
@@ -17,12 +17,11 @@
 //     ^
 //
 import self as self;
-import "dart:core" as core;
 
 part error_location_06_lib1.dart;
 static method /* from org-dartlang-testcase:///error_location_06_lib1.dart */ x1(dynamic z, {dynamic z = #C1}) → dynamic {}
 static method /* from org-dartlang-testcase:///error_location_06_lib1.dart */ x2() → dynamic {
-  function y(dynamic z, {dynamic z = #C1}) → core::Null? {}
+  function y(dynamic z, {dynamic z = #C1}) → Null {}
 }
 
 constants  {
diff --git a/pkg/front_end/testcases/general/error_locations/error_location_06.dart.strong.transformed.expect b/pkg/front_end/testcases/general/error_locations/error_location_06.dart.strong.transformed.expect
index a8ad767..de18361 100644
--- a/pkg/front_end/testcases/general/error_locations/error_location_06.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/error_locations/error_location_06.dart.strong.transformed.expect
@@ -17,12 +17,11 @@
 //     ^
 //
 import self as self;
-import "dart:core" as core;
 
 part error_location_06_lib1.dart;
 static method /* from org-dartlang-testcase:///error_location_06_lib1.dart */ x1(dynamic z, {dynamic z = #C1}) → dynamic {}
 static method /* from org-dartlang-testcase:///error_location_06_lib1.dart */ x2() → dynamic {
-  function y(dynamic z, {dynamic z = #C1}) → core::Null? {}
+  function y(dynamic z, {dynamic z = #C1}) → Null {}
 }
 
 constants  {
diff --git a/pkg/front_end/testcases/general/error_recovery/empty_await_for.dart.strong.transformed.expect b/pkg/front_end/testcases/general/error_recovery/empty_await_for.dart.strong.transformed.expect
index b35db37..caf60f4 100644
--- a/pkg/front_end/testcases/general/error_recovery/empty_await_for.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/error_recovery/empty_await_for.dart.strong.transformed.expect
@@ -17,7 +17,8 @@
 import "dart:_internal" as _in;
 
 static method main() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic>* :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -36,7 +37,6 @@
           asy::Stream<dynamic>* :stream = invalid-expression "pkg/front_end/testcases/general/error_recovery/empty_await_for.dart:2:14: Error: This couldn't be parsed.
   await for () {}
              ^";
-          asy::_asyncStarListenHelper(:stream, :async_op);
           asy::_StreamIterator<dynamic>* :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
           try
             #L2:
@@ -61,15 +61,16 @@
             }
         }
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
diff --git a/pkg/front_end/testcases/general/error_recovery/issue_26810.dart.strong.expect b/pkg/front_end/testcases/general/error_recovery/issue_26810.dart.strong.expect
index 13cf674..528c1f6 100644
--- a/pkg/front_end/testcases/general/error_recovery/issue_26810.dart.strong.expect
+++ b/pkg/front_end/testcases/general/error_recovery/issue_26810.dart.strong.expect
@@ -87,24 +87,24 @@
     core::print("hello ${x.{core::int::^}(y)}");
   }
   get a() → core::int*
-    return this.{self::Key::runtimeType}.{core::Object::hashCode}.{core::int::^}(null.{core::Null::hashCode});
+    return this.{self::Key::runtimeType}.{core::Type::hashCode}.{core::int::^}(null.{core::Object::hashCode});
   get b() → core::int*
-    return this.{self::Key::runtimeType}.{core::Object::hashCode}.{core::int::^}(null.{core::Null::hashCode});
+    return this.{self::Key::runtimeType}.{core::Type::hashCode}.{core::int::^}(null.{core::Object::hashCode});
   get c() → core::int* {
-    return this.{self::Key::runtimeType}.{core::Object::hashCode}.{core::int::^}(null.{core::Null::hashCode});
+    return this.{self::Key::runtimeType}.{core::Type::hashCode}.{core::int::^}(null.{core::Object::hashCode});
   }
   get d() → core::int* {
-    return this.{self::Key::runtimeType}.{core::Object::hashCode}.{core::int::^}(null.{core::Null::hashCode});
+    return this.{self::Key::runtimeType}.{core::Type::hashCode}.{core::int::^}(null.{core::Object::hashCode});
   }
   get e() → core::int*
-    return 1.{core::num::+}(this.{self::Key::runtimeType}.{core::Object::hashCode}).{core::int::^}(null.{core::Null::hashCode}.{core::num::+}(3));
+    return 1.{core::num::+}(this.{self::Key::runtimeType}.{core::Type::hashCode}).{core::int::^}(null.{core::Object::hashCode}.{core::num::+}(3));
   get f() → core::int*
-    return 1.{core::num::+}(this.{self::Key::runtimeType}.{core::Object::hashCode}).{core::int::^}(null.{core::Null::hashCode}.{core::num::+}(3));
+    return 1.{core::num::+}(this.{self::Key::runtimeType}.{core::Type::hashCode}).{core::int::^}(null.{core::Object::hashCode}.{core::num::+}(3));
   get g() → core::int* {
-    return 1.{core::num::+}(this.{self::Key::runtimeType}.{core::Object::hashCode}).{core::int::^}(null.{core::Null::hashCode}.{core::num::+}(3));
+    return 1.{core::num::+}(this.{self::Key::runtimeType}.{core::Type::hashCode}).{core::int::^}(null.{core::Object::hashCode}.{core::num::+}(3));
   }
   get h() → core::int* {
-    return 1.{core::num::+}(this.{self::Key::runtimeType}.{core::Object::hashCode}).{core::int::^}(null.{core::Null::hashCode}.{core::num::+}(3));
+    return 1.{core::num::+}(this.{self::Key::runtimeType}.{core::Type::hashCode}).{core::int::^}(null.{core::Object::hashCode}.{core::num::+}(3));
   }
   method i(core::int* x, core::int* y) → core::int*
     return x.{core::int::^}(y);
diff --git a/pkg/front_end/testcases/general/error_recovery/issue_26810.dart.strong.transformed.expect b/pkg/front_end/testcases/general/error_recovery/issue_26810.dart.strong.transformed.expect
index 13cf674..528c1f6 100644
--- a/pkg/front_end/testcases/general/error_recovery/issue_26810.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/error_recovery/issue_26810.dart.strong.transformed.expect
@@ -87,24 +87,24 @@
     core::print("hello ${x.{core::int::^}(y)}");
   }
   get a() → core::int*
-    return this.{self::Key::runtimeType}.{core::Object::hashCode}.{core::int::^}(null.{core::Null::hashCode});
+    return this.{self::Key::runtimeType}.{core::Type::hashCode}.{core::int::^}(null.{core::Object::hashCode});
   get b() → core::int*
-    return this.{self::Key::runtimeType}.{core::Object::hashCode}.{core::int::^}(null.{core::Null::hashCode});
+    return this.{self::Key::runtimeType}.{core::Type::hashCode}.{core::int::^}(null.{core::Object::hashCode});
   get c() → core::int* {
-    return this.{self::Key::runtimeType}.{core::Object::hashCode}.{core::int::^}(null.{core::Null::hashCode});
+    return this.{self::Key::runtimeType}.{core::Type::hashCode}.{core::int::^}(null.{core::Object::hashCode});
   }
   get d() → core::int* {
-    return this.{self::Key::runtimeType}.{core::Object::hashCode}.{core::int::^}(null.{core::Null::hashCode});
+    return this.{self::Key::runtimeType}.{core::Type::hashCode}.{core::int::^}(null.{core::Object::hashCode});
   }
   get e() → core::int*
-    return 1.{core::num::+}(this.{self::Key::runtimeType}.{core::Object::hashCode}).{core::int::^}(null.{core::Null::hashCode}.{core::num::+}(3));
+    return 1.{core::num::+}(this.{self::Key::runtimeType}.{core::Type::hashCode}).{core::int::^}(null.{core::Object::hashCode}.{core::num::+}(3));
   get f() → core::int*
-    return 1.{core::num::+}(this.{self::Key::runtimeType}.{core::Object::hashCode}).{core::int::^}(null.{core::Null::hashCode}.{core::num::+}(3));
+    return 1.{core::num::+}(this.{self::Key::runtimeType}.{core::Type::hashCode}).{core::int::^}(null.{core::Object::hashCode}.{core::num::+}(3));
   get g() → core::int* {
-    return 1.{core::num::+}(this.{self::Key::runtimeType}.{core::Object::hashCode}).{core::int::^}(null.{core::Null::hashCode}.{core::num::+}(3));
+    return 1.{core::num::+}(this.{self::Key::runtimeType}.{core::Type::hashCode}).{core::int::^}(null.{core::Object::hashCode}.{core::num::+}(3));
   }
   get h() → core::int* {
-    return 1.{core::num::+}(this.{self::Key::runtimeType}.{core::Object::hashCode}).{core::int::^}(null.{core::Null::hashCode}.{core::num::+}(3));
+    return 1.{core::num::+}(this.{self::Key::runtimeType}.{core::Type::hashCode}).{core::int::^}(null.{core::Object::hashCode}.{core::num::+}(3));
   }
   method i(core::int* x, core::int* y) → core::int*
     return x.{core::int::^}(y);
diff --git a/pkg/front_end/testcases/general/experiment_release_version/main.dart.outline.expect b/pkg/front_end/testcases/general/experiment_release_version/main.dart.outline.expect
index dbdc77e..f56cd1f 100644
--- a/pkg/front_end/testcases/general/experiment_release_version/main.dart.outline.expect
+++ b/pkg/front_end/testcases/general/experiment_release_version/main.dart.outline.expect
@@ -9,23 +9,20 @@
 // // @dart=2.8
 // ^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/general/experiment_release_version/not_allowed_package/lib/unversioned_lib.dart:5:4: Error: This requires the null safety language feature, which is experimental.
-// You can enable the experiment using the '--enable-experiment=non-nullable' command line option.
+// pkg/front_end/testcases/general/experiment_release_version/not_allowed_package/lib/unversioned_lib.dart:5:4: Error: This requires the null safety language feature, which requires language version of 2.10 or higher.
 // int? versionedUnallowedPackage; // error
 //    ^
 //
-// pkg/front_end/testcases/general/experiment_release_version/not_allowed_package/lib/versioned_2_8_lib.dart:7:4: Error: This requires the null safety language feature, which is experimental and requires language version of 2.9 or higher.
-// You can enable the experiment using the '--enable-experiment=non-nullable' command line option.
+// pkg/front_end/testcases/general/experiment_release_version/not_allowed_package/lib/versioned_2_8_lib.dart:7:4: Error: This requires the null safety language feature, which requires language version of 2.10 or higher.
 // int? versioned_2_8_AllowedPackage; // error
 //    ^
 //
-// pkg/front_end/testcases/general/experiment_release_version/not_allowed_package/lib/versioned_2_9_lib.dart:7:4: Error: This requires the null safety language feature, which is experimental.
-// You can enable the experiment using the '--enable-experiment=non-nullable' command line option.
+// pkg/front_end/testcases/general/experiment_release_version/not_allowed_package/lib/versioned_2_9_lib.dart:7:4: Error: This requires the null safety language feature, which requires language version of 2.10 or higher.
 // int? versioned_2_9_AllowedPackage; // error
 //    ^
 //
-// pkg/front_end/testcases/general/experiment_release_version/not_allowed_package/lib/versioned_2_10_lib.dart:7:4: Error: This requires the null safety language feature, which is experimental.
-// You can enable the experiment using the '--enable-experiment=non-nullable' command line option.
+// pkg/front_end/testcases/general/experiment_release_version/not_allowed_package/lib/versioned_2_10_lib.dart:7:4: Error: This requires the 'non-nullable' language feature to be enabled.
+// The feature is on by default but is currently disabled, maybe because the '--enable-experiment=no-non-nullable' command line option is passed.
 // int? versionedAllowedPackage; // error
 //    ^
 //
@@ -52,8 +49,8 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/general/experiment_release_version/unversioned_lib.dart:5:4: Error: This requires the null safety language feature, which is experimental.
-// You can enable the experiment using the '--enable-experiment=non-nullable' command line option.
+// pkg/front_end/testcases/general/experiment_release_version/unversioned_lib.dart:5:4: Error: This requires the 'non-nullable' language feature to be enabled.
+// The feature is on by default but is currently disabled, maybe because the '--enable-experiment=no-non-nullable' command line option is passed.
 // int? unversionedLibrary; // error
 //    ^
 //
@@ -66,8 +63,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/general/experiment_release_version/versioned_2_8_lib.dart:7:4: Error: This requires the null safety language feature, which is experimental and requires language version of 2.9 or higher.
-// You can enable the experiment using the '--enable-experiment=non-nullable' command line option.
+// pkg/front_end/testcases/general/experiment_release_version/versioned_2_8_lib.dart:7:4: Error: This requires the null safety language feature, which requires language version of 2.10 or higher.
 // int? versioned_2_8_Library; // error
 //    ^
 //
@@ -80,8 +76,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/general/experiment_release_version/versioned_2_9_lib.dart:7:4: Error: This requires the null safety language feature, which is experimental.
-// You can enable the experiment using the '--enable-experiment=non-nullable' command line option.
+// pkg/front_end/testcases/general/experiment_release_version/versioned_2_9_lib.dart:7:4: Error: This requires the null safety language feature, which requires language version of 2.10 or higher.
 // int? versioned_2_9_Library; // error
 //    ^
 //
@@ -94,8 +89,8 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/general/experiment_release_version/versioned_2_10_lib.dart:7:4: Error: This requires the null safety language feature, which is experimental.
-// You can enable the experiment using the '--enable-experiment=non-nullable' command line option.
+// pkg/front_end/testcases/general/experiment_release_version/versioned_2_10_lib.dart:7:4: Error: This requires the 'non-nullable' language feature to be enabled.
+// The feature is on by default but is currently disabled, maybe because the '--enable-experiment=no-non-nullable' command line option is passed.
 // int? versioned_2_10_Library; // error
 //    ^
 //
diff --git a/pkg/front_end/testcases/general/experiment_release_version/main.dart.strong.expect b/pkg/front_end/testcases/general/experiment_release_version/main.dart.strong.expect
index 2846fe1..cc7d176 100644
--- a/pkg/front_end/testcases/general/experiment_release_version/main.dart.strong.expect
+++ b/pkg/front_end/testcases/general/experiment_release_version/main.dart.strong.expect
@@ -9,23 +9,20 @@
 // // @dart=2.8
 // ^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/general/experiment_release_version/not_allowed_package/lib/unversioned_lib.dart:5:4: Error: This requires the null safety language feature, which is experimental.
-// You can enable the experiment using the '--enable-experiment=non-nullable' command line option.
+// pkg/front_end/testcases/general/experiment_release_version/not_allowed_package/lib/unversioned_lib.dart:5:4: Error: This requires the null safety language feature, which requires language version of 2.10 or higher.
 // int? versionedUnallowedPackage; // error
 //    ^
 //
-// pkg/front_end/testcases/general/experiment_release_version/not_allowed_package/lib/versioned_2_8_lib.dart:7:4: Error: This requires the null safety language feature, which is experimental and requires language version of 2.9 or higher.
-// You can enable the experiment using the '--enable-experiment=non-nullable' command line option.
+// pkg/front_end/testcases/general/experiment_release_version/not_allowed_package/lib/versioned_2_8_lib.dart:7:4: Error: This requires the null safety language feature, which requires language version of 2.10 or higher.
 // int? versioned_2_8_AllowedPackage; // error
 //    ^
 //
-// pkg/front_end/testcases/general/experiment_release_version/not_allowed_package/lib/versioned_2_9_lib.dart:7:4: Error: This requires the null safety language feature, which is experimental.
-// You can enable the experiment using the '--enable-experiment=non-nullable' command line option.
+// pkg/front_end/testcases/general/experiment_release_version/not_allowed_package/lib/versioned_2_9_lib.dart:7:4: Error: This requires the null safety language feature, which requires language version of 2.10 or higher.
 // int? versioned_2_9_AllowedPackage; // error
 //    ^
 //
-// pkg/front_end/testcases/general/experiment_release_version/not_allowed_package/lib/versioned_2_10_lib.dart:7:4: Error: This requires the null safety language feature, which is experimental.
-// You can enable the experiment using the '--enable-experiment=non-nullable' command line option.
+// pkg/front_end/testcases/general/experiment_release_version/not_allowed_package/lib/versioned_2_10_lib.dart:7:4: Error: This requires the 'non-nullable' language feature to be enabled.
+// The feature is on by default but is currently disabled, maybe because the '--enable-experiment=no-non-nullable' command line option is passed.
 // int? versionedAllowedPackage; // error
 //    ^
 //
@@ -51,8 +48,8 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/general/experiment_release_version/unversioned_lib.dart:5:4: Error: This requires the null safety language feature, which is experimental.
-// You can enable the experiment using the '--enable-experiment=non-nullable' command line option.
+// pkg/front_end/testcases/general/experiment_release_version/unversioned_lib.dart:5:4: Error: This requires the 'non-nullable' language feature to be enabled.
+// The feature is on by default but is currently disabled, maybe because the '--enable-experiment=no-non-nullable' command line option is passed.
 // int? unversionedLibrary; // error
 //    ^
 //
@@ -65,8 +62,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/general/experiment_release_version/versioned_2_8_lib.dart:7:4: Error: This requires the null safety language feature, which is experimental and requires language version of 2.9 or higher.
-// You can enable the experiment using the '--enable-experiment=non-nullable' command line option.
+// pkg/front_end/testcases/general/experiment_release_version/versioned_2_8_lib.dart:7:4: Error: This requires the null safety language feature, which requires language version of 2.10 or higher.
 // int? versioned_2_8_Library; // error
 //    ^
 //
@@ -79,8 +75,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/general/experiment_release_version/versioned_2_9_lib.dart:7:4: Error: This requires the null safety language feature, which is experimental.
-// You can enable the experiment using the '--enable-experiment=non-nullable' command line option.
+// pkg/front_end/testcases/general/experiment_release_version/versioned_2_9_lib.dart:7:4: Error: This requires the null safety language feature, which requires language version of 2.10 or higher.
 // int? versioned_2_9_Library; // error
 //    ^
 //
@@ -93,8 +88,8 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/general/experiment_release_version/versioned_2_10_lib.dart:7:4: Error: This requires the null safety language feature, which is experimental.
-// You can enable the experiment using the '--enable-experiment=non-nullable' command line option.
+// pkg/front_end/testcases/general/experiment_release_version/versioned_2_10_lib.dart:7:4: Error: This requires the 'non-nullable' language feature to be enabled.
+// The feature is on by default but is currently disabled, maybe because the '--enable-experiment=no-non-nullable' command line option is passed.
 // int? versioned_2_10_Library; // error
 //    ^
 //
diff --git a/pkg/front_end/testcases/general/experiment_release_version/main.dart.strong.transformed.expect b/pkg/front_end/testcases/general/experiment_release_version/main.dart.strong.transformed.expect
index 43eedc9..77ecfc9 100644
--- a/pkg/front_end/testcases/general/experiment_release_version/main.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/experiment_release_version/main.dart.strong.transformed.expect
@@ -20,8 +20,8 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/general/experiment_release_version/unversioned_lib.dart:5:4: Error: This requires the null safety language feature, which is experimental.
-// You can enable the experiment using the '--enable-experiment=non-nullable' command line option.
+// pkg/front_end/testcases/general/experiment_release_version/unversioned_lib.dart:5:4: Error: This requires the 'non-nullable' language feature to be enabled.
+// The feature is on by default but is currently disabled, maybe because the '--enable-experiment=no-non-nullable' command line option is passed.
 // int? unversionedLibrary; // error
 //    ^
 //
@@ -34,8 +34,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/general/experiment_release_version/versioned_2_8_lib.dart:7:4: Error: This requires the null safety language feature, which is experimental and requires language version of 2.9 or higher.
-// You can enable the experiment using the '--enable-experiment=non-nullable' command line option.
+// pkg/front_end/testcases/general/experiment_release_version/versioned_2_8_lib.dart:7:4: Error: This requires the null safety language feature, which requires language version of 2.10 or higher.
 // int? versioned_2_8_Library; // error
 //    ^
 //
@@ -48,8 +47,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/general/experiment_release_version/versioned_2_9_lib.dart:7:4: Error: This requires the null safety language feature, which is experimental.
-// You can enable the experiment using the '--enable-experiment=non-nullable' command line option.
+// pkg/front_end/testcases/general/experiment_release_version/versioned_2_9_lib.dart:7:4: Error: This requires the null safety language feature, which requires language version of 2.10 or higher.
 // int? versioned_2_9_Library; // error
 //    ^
 //
@@ -62,8 +60,8 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/general/experiment_release_version/versioned_2_10_lib.dart:7:4: Error: This requires the null safety language feature, which is experimental.
-// You can enable the experiment using the '--enable-experiment=non-nullable' command line option.
+// pkg/front_end/testcases/general/experiment_release_version/versioned_2_10_lib.dart:7:4: Error: This requires the 'non-nullable' language feature to be enabled.
+// The feature is on by default but is currently disabled, maybe because the '--enable-experiment=no-non-nullable' command line option is passed.
 // int? versioned_2_10_Library; // error
 //    ^
 //
diff --git a/pkg/front_end/testcases/general/expressions.dart.strong.expect b/pkg/front_end/testcases/general/expressions.dart.strong.expect
index bc2f8d2..1c9f07b 100644
--- a/pkg/front_end/testcases/general/expressions.dart.strong.expect
+++ b/pkg/front_end/testcases/general/expressions.dart.strong.expect
@@ -51,31 +51,31 @@
   core::print(#C2);
   core::print(core::List::•<core::String*>(2).{core::Object::runtimeType});
   self::foo(fisk: "Blorp gulp");
-  function f() → core::Null? {
+  function f() → Null {
     core::print("f was called");
   }
   self::caller(f);
-  self::caller(() → core::Null? {
+  self::caller(() → Null {
     core::print("<anon> was called");
   });
-  function g([dynamic message = #C1]) → core::Null? {
+  function g([dynamic message = #C1]) → Null {
     core::print(message);
   }
   g.call("Hello, World");
-  self::caller(([dynamic x = #C1]) → core::Null? {
+  self::caller(([dynamic x = #C1]) → Null {
     core::print("<anon> was called with ${x}");
   });
-  function h({dynamic message = #C1}) → core::Null? {
+  function h({dynamic message = #C1}) → Null {
     core::print(message);
   }
   h.call(message: "Hello, World");
-  self::caller(({dynamic x = #C1}) → core::Null? {
+  self::caller(({dynamic x = #C1}) → Null {
     core::print("<anon> was called with ${x}");
   });
-  core::print(core::int*.{core::Object::toString}());
+  core::print(core::int*.{core::Type::toString}());
   core::print(core::int*);
   core::print(let final core::Type* #t5 = core::int* in block {
-    #t5.{core::Object::toString}();
+    #t5.{core::Type::toString}();
   } =>#t5);
   try {
     core::print(invalid-expression "pkg/front_end/testcases/general/expressions.dart:74:16: Error: Method not found: 'int.toString'.
diff --git a/pkg/front_end/testcases/general/expressions.dart.strong.transformed.expect b/pkg/front_end/testcases/general/expressions.dart.strong.transformed.expect
index 04c23db..a1dbb58 100644
--- a/pkg/front_end/testcases/general/expressions.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/expressions.dart.strong.transformed.expect
@@ -51,31 +51,31 @@
   core::print(#C2);
   core::print(core::_List::•<core::String*>(2).{core::Object::runtimeType});
   self::foo(fisk: "Blorp gulp");
-  function f() → core::Null? {
+  function f() → Null {
     core::print("f was called");
   }
   self::caller(f);
-  self::caller(() → core::Null? {
+  self::caller(() → Null {
     core::print("<anon> was called");
   });
-  function g([dynamic message = #C1]) → core::Null? {
+  function g([dynamic message = #C1]) → Null {
     core::print(message);
   }
   g.call("Hello, World");
-  self::caller(([dynamic x = #C1]) → core::Null? {
+  self::caller(([dynamic x = #C1]) → Null {
     core::print("<anon> was called with ${x}");
   });
-  function h({dynamic message = #C1}) → core::Null? {
+  function h({dynamic message = #C1}) → Null {
     core::print(message);
   }
   h.call(message: "Hello, World");
-  self::caller(({dynamic x = #C1}) → core::Null? {
+  self::caller(({dynamic x = #C1}) → Null {
     core::print("<anon> was called with ${x}");
   });
-  core::print(core::int*.{core::Object::toString}());
+  core::print(core::int*.{core::Type::toString}());
   core::print(core::int*);
   core::print(let final core::Type* #t5 = core::int* in block {
-    #t5.{core::Object::toString}();
+    #t5.{core::Type::toString}();
   } =>#t5);
   try {
     core::print(invalid-expression "pkg/front_end/testcases/general/expressions.dart:74:16: Error: Method not found: 'int.toString'.
diff --git a/pkg/front_end/testcases/general/ffi_sample.dart.outline.expect b/pkg/front_end/testcases/general/ffi_sample.dart.outline.expect
index 2a3bf26..c1e27d7 100644
--- a/pkg/front_end/testcases/general/ffi_sample.dart.outline.expect
+++ b/pkg/front_end/testcases/general/ffi_sample.dart.outline.expect
@@ -14,7 +14,7 @@
   field ffi::Pointer<self::Coordinate*>* next;
   static factory allocate(core::double* x, core::double* y, ffi::Pointer<self::Coordinate*>* next) → self::Coordinate*
     ;
-  abstract member-signature get _addressOf() → ffi::Pointer<ffi::Struct*>*; -> ffi::Struct::_addressOf
+  abstract member-signature get _addressOf() → core::Object*; -> ffi::Struct::_addressOf
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/general/ffi_sample.dart.strong.expect b/pkg/front_end/testcases/general/ffi_sample.dart.strong.expect
index 0e669c0..a853421 100644
--- a/pkg/front_end/testcases/general/ffi_sample.dart.strong.expect
+++ b/pkg/front_end/testcases/general/ffi_sample.dart.strong.expect
@@ -20,7 +20,7 @@
       #t1.{self::Coordinate::next} = next;
     } =>#t1;
   }
-  abstract member-signature get _addressOf() → ffi::Pointer<ffi::Struct*>*; -> ffi::Struct::_addressOf
+  abstract member-signature get _addressOf() → core::Object*; -> ffi::Struct::_addressOf
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/general/ffi_sample.dart.strong.transformed.expect b/pkg/front_end/testcases/general/ffi_sample.dart.strong.transformed.expect
index c402dca..324ae5f 100644
--- a/pkg/front_end/testcases/general/ffi_sample.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/ffi_sample.dart.strong.transformed.expect
@@ -8,9 +8,10 @@
 import "package:ffi/ffi.dart";
 
 @#C3
+@#C8
 class Coordinate extends ffi::Struct {
   @#C3
-  static final field core::int* #sizeOf = (#C6).{core::List::[]}(ffi::_abi());
+  static final field core::int* #sizeOf = (#C11).{core::List::[]}(ffi::_abi());
   @#C3
   constructor #fromPointer(dynamic #pointer) → dynamic
     : super ffi::Struct::_fromPointer(#pointer)
@@ -22,7 +23,7 @@
       #t1.{self::Coordinate::next} = next;
     } =>#t1;
   }
-  abstract member-signature get _addressOf() → ffi::Pointer<ffi::Struct*>*; -> ffi::Struct::_addressOf
+  abstract member-signature get _addressOf() → core::Object*; -> ffi::Struct::_addressOf
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -34,17 +35,17 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
   get x() → core::double*
-    return ffi::_loadDouble(this.{ffi::Struct::_addressOf}, (#C8).{core::List::[]}(ffi::_abi()));
+    return ffi::_loadDouble(this.{ffi::Struct::_addressOf}, (#C13).{core::List::[]}(ffi::_abi()));
   set x(core::double* #v) → void
-    return ffi::_storeDouble(this.{ffi::Struct::_addressOf}, (#C8).{core::List::[]}(ffi::_abi()), #v);
+    return ffi::_storeDouble(this.{ffi::Struct::_addressOf}, (#C13).{core::List::[]}(ffi::_abi()), #v);
   get y() → core::double*
-    return ffi::_loadDouble(this.{ffi::Struct::_addressOf}, (#C10).{core::List::[]}(ffi::_abi()));
+    return ffi::_loadDouble(this.{ffi::Struct::_addressOf}, (#C15).{core::List::[]}(ffi::_abi()));
   set y(core::double* #v) → void
-    return ffi::_storeDouble(this.{ffi::Struct::_addressOf}, (#C10).{core::List::[]}(ffi::_abi()), #v);
+    return ffi::_storeDouble(this.{ffi::Struct::_addressOf}, (#C15).{core::List::[]}(ffi::_abi()), #v);
   get next() → ffi::Pointer<self::Coordinate*>*
-    return ffi::_fromAddress<self::Coordinate*>(ffi::_loadIntPtr(this.{ffi::Struct::_addressOf}, (#C12).{core::List::[]}(ffi::_abi())));
+    return ffi::_fromAddress<self::Coordinate*>(ffi::_loadIntPtr(this.{ffi::Struct::_addressOf}, (#C17).{core::List::[]}(ffi::_abi())));
   set next(ffi::Pointer<self::Coordinate*>* #v) → void
-    return ffi::_storeIntPtr(this.{ffi::Struct::_addressOf}, (#C12).{core::List::[]}(ffi::_abi()), #v.{ffi::Pointer::address});
+    return ffi::_storeIntPtr(this.{ffi::Struct::_addressOf}, (#C17).{core::List::[]}(ffi::_abi()), #v.{ffi::Pointer::address});
 }
 static method main() → dynamic {}
 
@@ -52,13 +53,18 @@
   #C1 = "vm:entry-point"
   #C2 = null
   #C3 = core::pragma {name:#C1, options:#C2}
-  #C4 = 24
-  #C5 = 20
-  #C6 = <core::int*>[#C4, #C5, #C4]
-  #C7 = 0
-  #C8 = <core::int*>[#C7, #C7, #C7]
-  #C9 = 8
-  #C10 = <core::int*>[#C9, #C9, #C9]
-  #C11 = 16
-  #C12 = <core::int*>[#C11, #C11, #C11]
+  #C4 = "vm:ffi:struct-fields"
+  #C5 = TypeLiteralConstant(ffi::Double)
+  #C6 = TypeLiteralConstant(ffi::Pointer<ffi::NativeType>)
+  #C7 = <core::Type>[#C5, #C5, #C6]
+  #C8 = core::pragma {name:#C4, options:#C7}
+  #C9 = 24
+  #C10 = 20
+  #C11 = <core::int*>[#C9, #C10, #C9]
+  #C12 = 0
+  #C13 = <core::int*>[#C12, #C12, #C12]
+  #C14 = 8
+  #C15 = <core::int*>[#C14, #C14, #C14]
+  #C16 = 16
+  #C17 = <core::int*>[#C16, #C16, #C16]
 }
diff --git a/pkg/front_end/testcases/general/flutter_issue64155.dart.strong.transformed.expect b/pkg/front_end/testcases/general/flutter_issue64155.dart.strong.transformed.expect
index b2d6c42..23d120e 100644
--- a/pkg/front_end/testcases/general/flutter_issue64155.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/flutter_issue64155.dart.strong.transformed.expect
@@ -6,7 +6,8 @@
 
 abstract class TestMixin<R extends core::Object* = dynamic, T extends core::Object* = dynamic> extends core::Object /*isMixinDeclaration*/  {
   method test(generic-covariant-impl asy::Future<self::TestMixin::R*>* fetch) → asy::Future<self::TestMixin::T*>* /* originally async */ {
-    final asy::_AsyncAwaitCompleter<self::TestMixin::T*>* :async_completer = new asy::_AsyncAwaitCompleter::•<self::TestMixin::T*>();
+    final asy::_Future<self::TestMixin::T*>* :async_future = new asy::_Future::•<self::TestMixin::T*>();
+    core::bool* :is_sync = false;
     FutureOr<self::TestMixin::T*>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -38,17 +39,18 @@
           :return_value = result;
           break #L1;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   }
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -124,7 +126,8 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
   method test(generic-covariant-impl asy::Future<self::Response<core::String*>*>* fetch) → asy::Future<core::String*>* /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::String*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::String*>();
+    final asy::_Future<core::String*>* :async_future = new asy::_Future::•<core::String*>();
+    core::bool* :is_sync = false;
     FutureOr<core::String*>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -156,17 +159,18 @@
           :return_value = result;
           break #L2;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   }
 }
 class Class1 extends self::_Class1&Object&TestMixin {
@@ -193,7 +197,8 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
   method test(generic-covariant-impl asy::Future<self::PagingResponse<core::String*>*>* fetch) → asy::Future<core::String*>* /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::String*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::String*>();
+    final asy::_Future<core::String*>* :async_future = new asy::_Future::•<core::String*>();
+    core::bool* :is_sync = false;
     FutureOr<core::String*>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -225,17 +230,18 @@
           :return_value = result;
           break #L3;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   }
 }
 class Class2 extends self::_Class2&Object&TestMixin {
diff --git a/pkg/front_end/testcases/general/folder.options b/pkg/front_end/testcases/general/folder.options
new file mode 100644
index 0000000..dbc148e
--- /dev/null
+++ b/pkg/front_end/testcases/general/folder.options
@@ -0,0 +1 @@
+--enable-experiment=no-non-nullable
\ No newline at end of file
diff --git a/pkg/front_end/testcases/general/function_type_is_check.dart.strong.expect b/pkg/front_end/testcases/general/function_type_is_check.dart.strong.expect
index 9279097..3e17d2c 100644
--- a/pkg/front_end/testcases/general/function_type_is_check.dart.strong.expect
+++ b/pkg/front_end/testcases/general/function_type_is_check.dart.strong.expect
@@ -14,5 +14,5 @@
     return 100;
 }
 static method main() → dynamic {
-  exp::Expect::equals(111, self::test(() → core::Null? => null).+(self::test((core::Object* o) → core::Null? => null)).+(self::test((core::Object* o, core::StackTrace* t) → core::Null? => null)));
+  exp::Expect::equals(111, self::test(() → Null => null).+(self::test((core::Object* o) → Null => null)).+(self::test((core::Object* o, core::StackTrace* t) → Null => null)));
 }
diff --git a/pkg/front_end/testcases/general/function_type_is_check.dart.strong.transformed.expect b/pkg/front_end/testcases/general/function_type_is_check.dart.strong.transformed.expect
index 9279097..3e17d2c 100644
--- a/pkg/front_end/testcases/general/function_type_is_check.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/function_type_is_check.dart.strong.transformed.expect
@@ -14,5 +14,5 @@
     return 100;
 }
 static method main() → dynamic {
-  exp::Expect::equals(111, self::test(() → core::Null? => null).+(self::test((core::Object* o) → core::Null? => null)).+(self::test((core::Object* o, core::StackTrace* t) → core::Null? => null)));
+  exp::Expect::equals(111, self::test(() → Null => null).+(self::test((core::Object* o) → Null => null)).+(self::test((core::Object* o, core::StackTrace* t) → Null => null)));
 }
diff --git a/pkg/front_end/testcases/general/functions.dart.strong.expect b/pkg/front_end/testcases/general/functions.dart.strong.expect
index f6f35ca..c10936d 100644
--- a/pkg/front_end/testcases/general/functions.dart.strong.expect
+++ b/pkg/front_end/testcases/general/functions.dart.strong.expect
@@ -7,7 +7,7 @@
     f.call(a: "Hello, World");
     f.call();
   }
-  local.call(({dynamic a = #C1}) → core::Null? {
+  local.call(({dynamic a = #C1}) → Null {
     core::print(a);
   });
 }
diff --git a/pkg/front_end/testcases/general/functions.dart.strong.transformed.expect b/pkg/front_end/testcases/general/functions.dart.strong.transformed.expect
index f6f35ca..c10936d 100644
--- a/pkg/front_end/testcases/general/functions.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/functions.dart.strong.transformed.expect
@@ -7,7 +7,7 @@
     f.call(a: "Hello, World");
     f.call();
   }
-  local.call(({dynamic a = #C1}) → core::Null? {
+  local.call(({dynamic a = #C1}) → Null {
     core::print(a);
   });
 }
diff --git a/pkg/front_end/testcases/general/future_or_test.dart.strong.transformed.expect b/pkg/front_end/testcases/general/future_or_test.dart.strong.transformed.expect
index 64daac2..a4ac3f4 100644
--- a/pkg/front_end/testcases/general/future_or_test.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/future_or_test.dart.strong.transformed.expect
@@ -28,7 +28,8 @@
     : super core::Object::•()
     ;
   method bar() → asy::Future<dynamic>* /* originally async */ {
-    final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    final asy::_Future<dynamic>* :async_future = new asy::_Future::•<dynamic>();
+    core::bool* :is_sync = false;
     FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -42,17 +43,18 @@
           :return_value = this.{self::B::a}.{self::A::foo}();
           break #L1;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   }
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -71,7 +73,8 @@
     : super core::Object::•()
     ;
   method baz() → asy::Future<core::int*>* /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    final asy::_Future<core::int*>* :async_future = new asy::_Future::•<core::int*>();
+    core::bool* :is_sync = false;
     FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -85,17 +88,18 @@
           :return_value = this.{self::C::b}.{self::B::bar}() as{TypeError} FutureOr<core::int*>*;
           break #L2;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   }
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
diff --git a/pkg/front_end/testcases/general/future_return.dart.strong.transformed.expect b/pkg/front_end/testcases/general/future_return.dart.strong.transformed.expect
index b739d5b..6f96292 100644
--- a/pkg/front_end/testcases/general/future_return.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/future_return.dart.strong.transformed.expect
@@ -43,7 +43,8 @@
 static method returnDynamic() → dynamic
   return new self::Class::•();
 static method returnClass() → self::Class* /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic>* :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -57,20 +58,22 @@
         :return_value = new self::Class::•();
         break #L1;
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method returnFutureClass() → asy::Future<self::Class*>* /* originally async */ {
-  final asy::_AsyncAwaitCompleter<self::Class*>* :async_completer = new asy::_AsyncAwaitCompleter::•<self::Class*>();
+  final asy::_Future<self::Class*>* :async_future = new asy::_Future::•<self::Class*>();
+  core::bool* :is_sync = false;
   FutureOr<self::Class*>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -84,20 +87,22 @@
         :return_value = new self::Class::•();
         break #L2;
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method returnFutureOrClass() → FutureOr<self::Class*>* /* originally async */ {
-  final asy::_AsyncAwaitCompleter<self::Class*>* :async_completer = new asy::_AsyncAwaitCompleter::•<self::Class*>();
+  final asy::_Future<self::Class*>* :async_future = new asy::_Future::•<self::Class*>();
+  core::bool* :is_sync = false;
   FutureOr<self::Class*>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -111,20 +116,22 @@
         :return_value = new self::Class::•();
         break #L3;
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method returnClassFromDynamic() → self::Class* /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic>* :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -138,20 +145,22 @@
         :return_value = self::returnDynamic() as{TypeError} FutureOr<self::Class*>*;
         break #L4;
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method returnFutureClassDynamic() → asy::Future<self::Class*>* /* originally async */ {
-  final asy::_AsyncAwaitCompleter<self::Class*>* :async_completer = new asy::_AsyncAwaitCompleter::•<self::Class*>();
+  final asy::_Future<self::Class*>* :async_future = new asy::_Future::•<self::Class*>();
+  core::bool* :is_sync = false;
   FutureOr<self::Class*>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -165,20 +174,22 @@
         :return_value = self::returnDynamic() as{TypeError} FutureOr<self::Class*>*;
         break #L5;
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method returnFutureOrClassDynamic() → FutureOr<self::Class*>* /* originally async */ {
-  final asy::_AsyncAwaitCompleter<self::Class*>* :async_completer = new asy::_AsyncAwaitCompleter::•<self::Class*>();
+  final asy::_Future<self::Class*>* :async_future = new asy::_Future::•<self::Class*>();
+  core::bool* :is_sync = false;
   FutureOr<self::Class*>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -192,20 +203,22 @@
         :return_value = self::returnDynamic() as{TypeError} FutureOr<self::Class*>*;
         break #L6;
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method returnClassFromFutureClass() → self::Class* /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic>* :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -219,20 +232,22 @@
         :return_value = self::returnFutureClass();
         break #L7;
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method returnFutureClassFromFutureClass() → asy::Future<self::Class*>* /* originally async */ {
-  final asy::_AsyncAwaitCompleter<self::Class*>* :async_completer = new asy::_AsyncAwaitCompleter::•<self::Class*>();
+  final asy::_Future<self::Class*>* :async_future = new asy::_Future::•<self::Class*>();
+  core::bool* :is_sync = false;
   FutureOr<self::Class*>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -246,20 +261,22 @@
         :return_value = self::returnFutureClass();
         break #L8;
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method returnFutureOrClassFromFutureClass() → FutureOr<self::Class*>* /* originally async */ {
-  final asy::_AsyncAwaitCompleter<self::Class*>* :async_completer = new asy::_AsyncAwaitCompleter::•<self::Class*>();
+  final asy::_Future<self::Class*>* :async_future = new asy::_Future::•<self::Class*>();
+  core::bool* :is_sync = false;
   FutureOr<self::Class*>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -273,20 +290,22 @@
         :return_value = self::returnFutureClass();
         break #L9;
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method returnClassFromFutureOrClass() → self::Class* /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic>* :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -300,20 +319,22 @@
         :return_value = self::returnFutureOrClass();
         break #L10;
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method returnFutureClassFromFutureOrClass() → asy::Future<self::Class*>* /* originally async */ {
-  final asy::_AsyncAwaitCompleter<self::Class*>* :async_completer = new asy::_AsyncAwaitCompleter::•<self::Class*>();
+  final asy::_Future<self::Class*>* :async_future = new asy::_Future::•<self::Class*>();
+  core::bool* :is_sync = false;
   FutureOr<self::Class*>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -327,20 +348,22 @@
         :return_value = self::returnFutureOrClass();
         break #L11;
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method returnFutureOrClassFromFutureOrClass() → FutureOr<self::Class*>* /* originally async */ {
-  final asy::_AsyncAwaitCompleter<self::Class*>* :async_completer = new asy::_AsyncAwaitCompleter::•<self::Class*>();
+  final asy::_Future<self::Class*>* :async_future = new asy::_Future::•<self::Class*>();
+  core::bool* :is_sync = false;
   FutureOr<self::Class*>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -354,20 +377,22 @@
         :return_value = self::returnFutureOrClass();
         break #L12;
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method main() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic>* :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -404,15 +429,16 @@
         [yield] let dynamic #t12 = asy::_awaitHelper(self::returnFutureOrClassFromFutureOrClass(), :async_op_then, :async_op_error, :async_op) in null;
         _in::unsafeCast<self::Class*>(:result);
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
diff --git a/pkg/front_end/testcases/general/if_null_in_set_literal.dart.strong.expect b/pkg/front_end/testcases/general/if_null_in_set_literal.dart.strong.expect
index c644985..bbc6109 100644
--- a/pkg/front_end/testcases/general/if_null_in_set_literal.dart.strong.expect
+++ b/pkg/front_end/testcases/general/if_null_in_set_literal.dart.strong.expect
@@ -6,5 +6,8 @@
 static method main() → dynamic {
   core::Object* a;
   core::Object* b;
-  return let final core::Set<core::Object*>* #t1 = col::LinkedHashSet::•<core::Object*>() in let final dynamic #t2 = #t1.{core::Set::add}(let final core::Object* #t3 = a in #t3.{core::Object::==}(null) ?{core::Object*} b : #t3) in #t1;
+  return block {
+    final core::Set<core::Object*>* #t1 = col::LinkedHashSet::•<core::Object*>();
+    #t1.{core::Set::add}{Invariant}(let final core::Object* #t2 = a in #t2.{core::Object::==}(null) ?{core::Object*} b : #t2);
+  } =>#t1;
 }
diff --git a/pkg/front_end/testcases/general/if_null_in_set_literal.dart.strong.transformed.expect b/pkg/front_end/testcases/general/if_null_in_set_literal.dart.strong.transformed.expect
index ac2c29c..637e41b 100644
--- a/pkg/front_end/testcases/general/if_null_in_set_literal.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/if_null_in_set_literal.dart.strong.transformed.expect
@@ -6,5 +6,8 @@
 static method main() → dynamic {
   core::Object* a;
   core::Object* b;
-  return let final core::Set<core::Object*>* #t1 = new col::_CompactLinkedHashSet::•<core::Object*>() in let final core::bool #t2 = #t1.{core::Set::add}(let final core::Object* #t3 = a in #t3.{core::Object::==}(null) ?{core::Object*} b : #t3) in #t1;
+  return block {
+    final core::Set<core::Object*>* #t1 = new col::_CompactLinkedHashSet::•<core::Object*>();
+    #t1.{core::Set::add}{Invariant}(let final core::Object* #t2 = a in #t2.{core::Object::==}(null) ?{core::Object*} b : #t2);
+  } =>#t1;
 }
diff --git a/pkg/front_end/testcases/general/illegal_named_function_expression.dart.strong.expect b/pkg/front_end/testcases/general/illegal_named_function_expression.dart.strong.expect
index 9284232..cedeb06 100644
--- a/pkg/front_end/testcases/general/illegal_named_function_expression.dart.strong.expect
+++ b/pkg/front_end/testcases/general/illegal_named_function_expression.dart.strong.expect
@@ -14,7 +14,7 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  <T extends core::Object* = dynamic>(T*) →* core::Null? x = let final <T extends core::Object* = dynamic>(T*) →* core::Null? f = <T extends core::Object* = dynamic>(T* t) → core::Null? {} in f;
+  <T extends core::Object* = dynamic>(T*) →* Null x = let final <T extends core::Object* = dynamic>(T*) →* Null f = <T extends core::Object* = dynamic>(T* t) → Null {} in f;
   core::print(x.{core::Object::runtimeType});
-  core::print(let final <T extends core::Object* = dynamic>(T*) →* core::Null? g = <T extends core::Object* = dynamic>(T* t) → core::Null? {} in g);
+  core::print(let final <T extends core::Object* = dynamic>(T*) →* Null g = <T extends core::Object* = dynamic>(T* t) → Null {} in g);
 }
diff --git a/pkg/front_end/testcases/general/illegal_named_function_expression.dart.strong.transformed.expect b/pkg/front_end/testcases/general/illegal_named_function_expression.dart.strong.transformed.expect
index 9284232..cedeb06 100644
--- a/pkg/front_end/testcases/general/illegal_named_function_expression.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/illegal_named_function_expression.dart.strong.transformed.expect
@@ -14,7 +14,7 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  <T extends core::Object* = dynamic>(T*) →* core::Null? x = let final <T extends core::Object* = dynamic>(T*) →* core::Null? f = <T extends core::Object* = dynamic>(T* t) → core::Null? {} in f;
+  <T extends core::Object* = dynamic>(T*) →* Null x = let final <T extends core::Object* = dynamic>(T*) →* Null f = <T extends core::Object* = dynamic>(T* t) → Null {} in f;
   core::print(x.{core::Object::runtimeType});
-  core::print(let final <T extends core::Object* = dynamic>(T*) →* core::Null? g = <T extends core::Object* = dynamic>(T* t) → core::Null? {} in g);
+  core::print(let final <T extends core::Object* = dynamic>(T*) →* Null g = <T extends core::Object* = dynamic>(T* t) → Null {} in g);
 }
diff --git a/pkg/front_end/testcases/general/illegal_named_function_expression_scope.dart.strong.expect b/pkg/front_end/testcases/general/illegal_named_function_expression_scope.dart.strong.expect
index ad827f9..63bcf5a 100644
--- a/pkg/front_end/testcases/general/illegal_named_function_expression_scope.dart.strong.expect
+++ b/pkg/front_end/testcases/general/illegal_named_function_expression_scope.dart.strong.expect
@@ -11,5 +11,5 @@
 
 static method main() → dynamic {
   function f() → void {}
-  core::print(let final () →* core::Null? f = () → core::Null? {} in f);
+  core::print(let final () →* Null f = () → Null {} in f);
 }
diff --git a/pkg/front_end/testcases/general/illegal_named_function_expression_scope.dart.strong.transformed.expect b/pkg/front_end/testcases/general/illegal_named_function_expression_scope.dart.strong.transformed.expect
index ad827f9..63bcf5a 100644
--- a/pkg/front_end/testcases/general/illegal_named_function_expression_scope.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/illegal_named_function_expression_scope.dart.strong.transformed.expect
@@ -11,5 +11,5 @@
 
 static method main() → dynamic {
   function f() → void {}
-  core::print(let final () →* core::Null? f = () → core::Null? {} in f);
+  core::print(let final () →* Null f = () → Null {} in f);
 }
diff --git a/pkg/front_end/testcases/general/infer_map_literal_with_closure.dart.outline.expect b/pkg/front_end/testcases/general/infer_map_literal_with_closure.dart.outline.expect
index 4fd9000..5e88de7 100644
--- a/pkg/front_end/testcases/general/infer_map_literal_with_closure.dart.outline.expect
+++ b/pkg/front_end/testcases/general/infer_map_literal_with_closure.dart.outline.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class Class extends core::Object {
-  field core::Map<core::String*, (core::String*) →* core::Null?>* map;
+  field core::Map<core::String*, (core::String*) →* Null>* map;
   synthetic constructor •() → self::Class*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
diff --git a/pkg/front_end/testcases/general/infer_map_literal_with_closure.dart.strong.expect b/pkg/front_end/testcases/general/infer_map_literal_with_closure.dart.strong.expect
index 500ccc5..cb4d5f5 100644
--- a/pkg/front_end/testcases/general/infer_map_literal_with_closure.dart.strong.expect
+++ b/pkg/front_end/testcases/general/infer_map_literal_with_closure.dart.strong.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class Class extends core::Object {
-  field core::Map<core::String*, (core::String*) →* core::Null?>* map = <core::String*, (core::String*) →* core::Null?>{"foo": (core::String* a) → core::Null? {
+  field core::Map<core::String*, (core::String*) →* Null>* map = <core::String*, (core::String*) →* Null>{"foo": (core::String* a) → Null {
     core::int* c = a.{core::String::length};
   }};
   synthetic constructor •() → self::Class*
diff --git a/pkg/front_end/testcases/general/infer_map_literal_with_closure.dart.strong.transformed.expect b/pkg/front_end/testcases/general/infer_map_literal_with_closure.dart.strong.transformed.expect
index 500ccc5..cb4d5f5 100644
--- a/pkg/front_end/testcases/general/infer_map_literal_with_closure.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/infer_map_literal_with_closure.dart.strong.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class Class extends core::Object {
-  field core::Map<core::String*, (core::String*) →* core::Null?>* map = <core::String*, (core::String*) →* core::Null?>{"foo": (core::String* a) → core::Null? {
+  field core::Map<core::String*, (core::String*) →* Null>* map = <core::String*, (core::String*) →* Null>{"foo": (core::String* a) → Null {
     core::int* c = a.{core::String::length};
   }};
   synthetic constructor •() → self::Class*
diff --git a/pkg/front_end/testcases/general/issue31767.dart b/pkg/front_end/testcases/general/issue31767.dart
new file mode 100644
index 0000000..045dced
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue31767.dart
@@ -0,0 +1,61 @@
+// Copyright (c) 2020, 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.
+
+// @dart=2.9
+
+import 'issue31767_lib.dart';
+
+StringBuffer sb;
+
+class C {
+  final int w;
+  C.foo(int x, [int y = 0, int z = 0]) : w = p("x", x) + p("y", y) + p("z", z);
+}
+
+int p(String name, int value) {
+  sb.write("$name = $value, ");
+  return value;
+}
+
+mixin M on C {
+  int get w2 => w * w;
+}
+
+class D = C with M;
+
+mixin N on A {
+  int get w2 => w * w;
+}
+
+class E = A with N;
+
+main() {
+  sb = new StringBuffer();
+  var a = A.foo(1, 2);
+  expect('x = 1, y = 2, z = 3, ', sb.toString());
+  expect(6, a.w);
+  expect(5, a.a.field);
+
+  sb = new StringBuffer();
+  var c = C.foo(1, 2);
+  expect('x = 1, y = 2, z = 0, ', sb.toString());
+  expect(3, c.w);
+
+  sb = new StringBuffer();
+  var d = D.foo(1, 2);
+  expect('x = 1, y = 2, z = 0, ', sb.toString());
+  expect(3, d.w);
+  expect(9, d.w2);
+
+  sb = new StringBuffer();
+  var e = E.foo(1, 2);
+  expect('x = 1, y = 2, z = 3, ', sb.toString());
+  expect(6, e.w);
+  expect(36, e.w2);
+  expect(5, e.a.field);
+}
+
+expect(expected, actual) {
+  if (expected != actual) throw 'Expected $expected, actual $actual';
+}
diff --git a/pkg/front_end/testcases/general/issue31767.dart.outline.expect b/pkg/front_end/testcases/general/issue31767.dart.outline.expect
new file mode 100644
index 0000000..adbdb2c
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue31767.dart.outline.expect
@@ -0,0 +1,87 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "issue31767_lib.dart" as iss;
+
+import "org-dartlang-testcase:///issue31767_lib.dart";
+
+class C extends core::Object {
+  final field core::int* w;
+  constructor foo(core::int* x, [core::int* y, core::int* z]) → self::C*
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M extends self::C /*isMixinDeclaration*/  {
+  get w2() → core::int*
+    ;
+}
+class D = self::C with self::M {
+  synthetic constructor foo(core::int* x, [core::int* y, core::int* z]) → self::D*
+    : super self::C::foo(x, y, z)
+    ;
+}
+abstract class N extends iss::A /*isMixinDeclaration*/  {
+  get w2() → core::int*
+    ;
+}
+class E = iss::A with self::N {
+  synthetic constructor foo(core::int* x, [core::int* y, core::int* z, iss::_A* a]) → self::E*
+    : super iss::A::foo(x, y, z, a)
+    ;
+}
+static field core::StringBuffer* sb;
+static method p(core::String* name, core::int* value) → core::int*
+  ;
+static method main() → dynamic
+  ;
+static method expect(dynamic expected, dynamic actual) → dynamic
+  ;
+
+library;
+import self as iss;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///issue31767.dart";
+
+class A extends core::Object {
+  final field core::int* w;
+  final field iss::_A* a;
+  constructor foo(core::int* x, [core::int* y, core::int* z, iss::_A* a]) → iss::A*
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class _A extends core::Object /*hasConstConstructor*/  {
+  final field core::int* field;
+  const constructor •(core::int* field) → iss::_A*
+    : iss::_A::field = field, super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static const field core::int* _private = 3;
diff --git a/pkg/front_end/testcases/general/issue31767.dart.strong.expect b/pkg/front_end/testcases/general/issue31767.dart.strong.expect
new file mode 100644
index 0000000..66290c1
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue31767.dart.strong.expect
@@ -0,0 +1,121 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "issue31767_lib.dart" as iss;
+
+import "org-dartlang-testcase:///issue31767_lib.dart";
+
+class C extends core::Object {
+  final field core::int* w;
+  constructor foo(core::int* x, [core::int* y = #C1, core::int* z = #C1]) → self::C*
+    : self::C::w = self::p("x", x).{core::num::+}(self::p("y", y)).{core::num::+}(self::p("z", z)), super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M extends self::C /*isMixinDeclaration*/  {
+  get w2() → core::int*
+    return this.{self::C::w}.{core::num::*}(this.{self::C::w});
+}
+class D = self::C with self::M {
+  synthetic constructor foo(core::int* x, [core::int* y = #C1, core::int* z = #C1]) → self::D*
+    : super self::C::foo(x, y, z)
+    ;
+}
+abstract class N extends iss::A /*isMixinDeclaration*/  {
+  get w2() → core::int*
+    return this.{iss::A::w}.{core::num::*}(this.{iss::A::w});
+}
+class E = iss::A with self::N {
+  synthetic constructor foo(core::int* x, [core::int* y = #C2, core::int* z = #C2, iss::_A* a = #C4]) → self::E*
+    : super iss::A::foo(x, y, z, a)
+    ;
+}
+static field core::StringBuffer* sb;
+static method p(core::String* name, core::int* value) → core::int* {
+  self::sb.{core::StringBuffer::write}("${name} = ${value}, ");
+  return value;
+}
+static method main() → dynamic {
+  self::sb = new core::StringBuffer::•();
+  iss::A* a = new iss::A::foo(1, 2);
+  self::expect("x = 1, y = 2, z = 3, ", self::sb.{core::StringBuffer::toString}());
+  self::expect(6, a.{iss::A::w});
+  self::expect(5, a.{iss::A::a}.{iss::_A::field});
+  self::sb = new core::StringBuffer::•();
+  self::C* c = new self::C::foo(1, 2);
+  self::expect("x = 1, y = 2, z = 0, ", self::sb.{core::StringBuffer::toString}());
+  self::expect(3, c.{self::C::w});
+  self::sb = new core::StringBuffer::•();
+  self::D* d = new self::D::foo(1, 2);
+  self::expect("x = 1, y = 2, z = 0, ", self::sb.{core::StringBuffer::toString}());
+  self::expect(3, d.{self::C::w});
+  self::expect(9, d.{self::M::w2});
+  self::sb = new core::StringBuffer::•();
+  self::E* e = new self::E::foo(1, 2);
+  self::expect("x = 1, y = 2, z = 3, ", self::sb.{core::StringBuffer::toString}());
+  self::expect(6, e.{iss::A::w});
+  self::expect(36, e.{self::N::w2});
+  self::expect(5, e.{iss::A::a}.{iss::_A::field});
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!expected.{core::Object::==}(actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+
+library;
+import self as iss;
+import "dart:core" as core;
+import "issue31767.dart" as self;
+
+import "org-dartlang-testcase:///issue31767.dart";
+
+class A extends core::Object {
+  final field core::int* w;
+  final field iss::_A* a;
+  constructor foo(core::int* x, [core::int* y = #C2, core::int* z = #C2, iss::_A* a = #C4]) → iss::A*
+    : iss::A::a = a, iss::A::w = self::p("x", x).{core::num::+}(self::p("y", y)).{core::num::+}(self::p("z", z)), super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class _A extends core::Object /*hasConstConstructor*/  {
+  final field core::int* field;
+  const constructor •(core::int* field) → iss::_A*
+    : iss::_A::field = field, super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static const field core::int* _private = #C2;
+
+constants  {
+  #C1 = 0
+  #C2 = 3
+  #C3 = 5
+  #C4 = iss::_A {field:#C3}
+}
diff --git a/pkg/front_end/testcases/general/issue31767.dart.strong.transformed.expect b/pkg/front_end/testcases/general/issue31767.dart.strong.transformed.expect
new file mode 100644
index 0000000..19fdcee
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue31767.dart.strong.transformed.expect
@@ -0,0 +1,125 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "issue31767_lib.dart" as iss;
+
+import "org-dartlang-testcase:///issue31767_lib.dart";
+
+class C extends core::Object {
+  final field core::int* w;
+  constructor foo(core::int* x, [core::int* y = #C1, core::int* z = #C1]) → self::C*
+    : self::C::w = self::p("x", x).{core::num::+}(self::p("y", y)).{core::num::+}(self::p("z", z)), super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M extends self::C /*isMixinDeclaration*/  {
+  get w2() → core::int*
+    return this.{self::C::w}.{core::num::*}(this.{self::C::w});
+}
+class D extends self::C implements self::M /*isEliminatedMixin*/  {
+  synthetic constructor foo(core::int* x, [core::int* y = #C1, core::int* z = #C1]) → self::D*
+    : super self::C::foo(x, y, z)
+    ;
+  get w2() → core::int*
+    return this.{self::C::w}.{core::num::*}(this.{self::C::w});
+}
+abstract class N extends iss::A /*isMixinDeclaration*/  {
+  get w2() → core::int*
+    return this.{iss::A::w}.{core::num::*}(this.{iss::A::w});
+}
+class E extends iss::A implements self::N /*isEliminatedMixin*/  {
+  synthetic constructor foo(core::int* x, [core::int* y = #C2, core::int* z = #C2, iss::_A* a = #C4]) → self::E*
+    : super iss::A::foo(x, y, z, a)
+    ;
+  get w2() → core::int*
+    return this.{iss::A::w}.{core::num::*}(this.{iss::A::w});
+}
+static field core::StringBuffer* sb;
+static method p(core::String* name, core::int* value) → core::int* {
+  self::sb.{core::StringBuffer::write}("${name} = ${value}, ");
+  return value;
+}
+static method main() → dynamic {
+  self::sb = new core::StringBuffer::•();
+  iss::A* a = new iss::A::foo(1, 2);
+  self::expect("x = 1, y = 2, z = 3, ", self::sb.{core::StringBuffer::toString}());
+  self::expect(6, a.{iss::A::w});
+  self::expect(5, a.{iss::A::a}.{iss::_A::field});
+  self::sb = new core::StringBuffer::•();
+  self::C* c = new self::C::foo(1, 2);
+  self::expect("x = 1, y = 2, z = 0, ", self::sb.{core::StringBuffer::toString}());
+  self::expect(3, c.{self::C::w});
+  self::sb = new core::StringBuffer::•();
+  self::D* d = new self::D::foo(1, 2);
+  self::expect("x = 1, y = 2, z = 0, ", self::sb.{core::StringBuffer::toString}());
+  self::expect(3, d.{self::C::w});
+  self::expect(9, d.{self::M::w2});
+  self::sb = new core::StringBuffer::•();
+  self::E* e = new self::E::foo(1, 2);
+  self::expect("x = 1, y = 2, z = 3, ", self::sb.{core::StringBuffer::toString}());
+  self::expect(6, e.{iss::A::w});
+  self::expect(36, e.{self::N::w2});
+  self::expect(5, e.{iss::A::a}.{iss::_A::field});
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!expected.{core::Object::==}(actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+
+library;
+import self as iss;
+import "dart:core" as core;
+import "issue31767.dart" as self;
+
+import "org-dartlang-testcase:///issue31767.dart";
+
+class A extends core::Object {
+  final field core::int* w;
+  final field iss::_A* a;
+  constructor foo(core::int* x, [core::int* y = #C2, core::int* z = #C2, iss::_A* a = #C4]) → iss::A*
+    : iss::A::a = a, iss::A::w = self::p("x", x).{core::num::+}(self::p("y", y)).{core::num::+}(self::p("z", z)), super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class _A extends core::Object /*hasConstConstructor*/  {
+  final field core::int* field;
+  const constructor •(core::int* field) → iss::_A*
+    : iss::_A::field = field, super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static const field core::int* _private = #C2;
+
+constants  {
+  #C1 = 0
+  #C2 = 3
+  #C3 = 5
+  #C4 = iss::_A {field:#C3}
+}
diff --git a/pkg/front_end/testcases/general/issue31767.dart.textual_outline.expect b/pkg/front_end/testcases/general/issue31767.dart.textual_outline.expect
new file mode 100644
index 0000000..c0f1050
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue31767.dart.textual_outline.expect
@@ -0,0 +1,21 @@
+// @dart = 2.9
+import 'issue31767_lib.dart';
+
+StringBuffer sb;
+
+class C {
+  final int w;
+  C.foo(int x, [int y = 0, int z = 0]) : w = p("x", x) + p("y", y) + p("z", z);
+}
+
+int p(String name, int value) {}
+mixin M on C {
+  int get w2 => w * w;
+}
+class D = C with M;
+mixin N on A {
+  int get w2 => w * w;
+}
+class E = A with N;
+main() {}
+expect(expected, actual) {}
diff --git a/pkg/front_end/testcases/general/issue31767.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/issue31767.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..e349691
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue31767.dart.textual_outline_modelled.expect
@@ -0,0 +1,21 @@
+// @dart = 2.9
+import 'issue31767_lib.dart';
+
+StringBuffer sb;
+
+class C {
+  C.foo(int x, [int y = 0, int z = 0]) : w = p("x", x) + p("y", y) + p("z", z);
+  final int w;
+}
+
+class D = C with M;
+class E = A with N;
+expect(expected, actual) {}
+int p(String name, int value) {}
+main() {}
+mixin M on C {
+  int get w2 => w * w;
+}
+mixin N on A {
+  int get w2 => w * w;
+}
diff --git a/pkg/front_end/testcases/general/issue31767_lib.dart b/pkg/front_end/testcases/general/issue31767_lib.dart
new file mode 100644
index 0000000..61406fd
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue31767_lib.dart
@@ -0,0 +1,21 @@
+// Copyright (c) 2020, 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.
+
+// @dart=2.9
+
+import 'issue31767.dart';
+
+const int _private = 3;
+
+class A {
+  final int w;
+  final _A a;
+  A.foo(int x, [int y = _private, int z = _private, this.a = const _A(5)])
+      : w = p("x", x) + p("y", y) + p("z", z);
+}
+
+class _A {
+  final int field;
+  const _A(this.field);
+}
diff --git a/pkg/front_end/testcases/general/issue37027.dart.strong.expect b/pkg/front_end/testcases/general/issue37027.dart.strong.expect
index 09fd889..d66702b 100644
--- a/pkg/front_end/testcases/general/issue37027.dart.strong.expect
+++ b/pkg/front_end/testcases/general/issue37027.dart.strong.expect
@@ -10,7 +10,7 @@
       final core::Set<core::int*>* #t1 = col::LinkedHashSet::•<core::int*>();
       for (core::int* e in ell)
         if(e.{core::int::isOdd})
-          #t1.{core::Set::add}(2.{core::num::*}(e));
+          #t1.{core::Set::add}{Invariant}(2.{core::num::*}(e));
     } =>#t1, super core::Object::•()
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
diff --git a/pkg/front_end/testcases/general/issue37027.dart.strong.transformed.expect b/pkg/front_end/testcases/general/issue37027.dart.strong.transformed.expect
index bc72e7f..fa88301 100644
--- a/pkg/front_end/testcases/general/issue37027.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/issue37027.dart.strong.transformed.expect
@@ -13,7 +13,7 @@
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
           core::int* e = :sync-for-iterator.{core::Iterator::current};
           if(e.{core::int::isOdd})
-            #t1.{core::Set::add}(2.{core::num::*}(e));
+            #t1.{core::Set::add}{Invariant}(2.{core::num::*}(e));
         }
       }
     } =>#t1, super core::Object::•()
diff --git a/pkg/front_end/testcases/general/issue39344.dart.strong.expect b/pkg/front_end/testcases/general/issue39344.dart.strong.expect
index 72dd918..c0a0a59 100644
--- a/pkg/front_end/testcases/general/issue39344.dart.strong.expect
+++ b/pkg/front_end/testcases/general/issue39344.dart.strong.expect
@@ -91,11 +91,11 @@
 static field core::List<self::B*>* xs;
 static field core::List<core::List<self::B*>*>* xss;
 static method main() → void {
-  self::throws(() → core::Null? {
+  self::throws(() → Null {
     new self::Class::•<self::A*>().{self::Class::method2a}(new self::B::•());
     core::print(self::xs.{core::Object::runtimeType});
   });
-  self::throws(() → core::Null? {
+  self::throws(() → Null {
     new self::Class::•<self::A*>().{self::Class::method2b}(new self::B::•());
     core::print(self::xs.{core::Object::runtimeType});
   });
diff --git a/pkg/front_end/testcases/general/issue39344.dart.strong.transformed.expect b/pkg/front_end/testcases/general/issue39344.dart.strong.transformed.expect
index 72dd918..c0a0a59 100644
--- a/pkg/front_end/testcases/general/issue39344.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/issue39344.dart.strong.transformed.expect
@@ -91,11 +91,11 @@
 static field core::List<self::B*>* xs;
 static field core::List<core::List<self::B*>*>* xss;
 static method main() → void {
-  self::throws(() → core::Null? {
+  self::throws(() → Null {
     new self::Class::•<self::A*>().{self::Class::method2a}(new self::B::•());
     core::print(self::xs.{core::Object::runtimeType});
   });
-  self::throws(() → core::Null? {
+  self::throws(() → Null {
     new self::Class::•<self::A*>().{self::Class::method2b}(new self::B::•());
     core::print(self::xs.{core::Object::runtimeType});
   });
diff --git a/pkg/front_end/testcases/general/issue39421.dart.outline.expect b/pkg/front_end/testcases/general/issue39421.dart.outline.expect
index bda5699..7f2378b 100644
--- a/pkg/front_end/testcases/general/issue39421.dart.outline.expect
+++ b/pkg/front_end/testcases/general/issue39421.dart.outline.expect
@@ -50,7 +50,7 @@
 class B extends core::Object {
   synthetic constructor •() → self::B*
     ;
-  method foo(core::List<core::Null?>* a) → dynamic
+  method foo(core::List<Null>* a) → dynamic
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
diff --git a/pkg/front_end/testcases/general/issue39421.dart.strong.expect b/pkg/front_end/testcases/general/issue39421.dart.strong.expect
index 2285c0d..cb1d71a 100644
--- a/pkg/front_end/testcases/general/issue39421.dart.strong.expect
+++ b/pkg/front_end/testcases/general/issue39421.dart.strong.expect
@@ -57,7 +57,7 @@
   synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  method foo(core::List<core::Null?>* a) → dynamic {}
+  method foo(core::List<Null>* a) → dynamic {}
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/general/issue39421.dart.strong.transformed.expect b/pkg/front_end/testcases/general/issue39421.dart.strong.transformed.expect
index 2285c0d..cb1d71a 100644
--- a/pkg/front_end/testcases/general/issue39421.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/issue39421.dart.strong.transformed.expect
@@ -57,7 +57,7 @@
   synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  method foo(core::List<core::Null?>* a) → dynamic {}
+  method foo(core::List<Null>* a) → dynamic {}
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/general/issue39817.dart.strong.expect b/pkg/front_end/testcases/general/issue39817.dart.strong.expect
index 217fc5e..cad4f51 100644
--- a/pkg/front_end/testcases/general/issue39817.dart.strong.expect
+++ b/pkg/front_end/testcases/general/issue39817.dart.strong.expect
@@ -1,9 +1,8 @@
 library;
 import self as self;
-import "dart:core" as core;
 
 static method foo() → dynamic {
-  core::Null? _null;
+  Null _null;
   for (dynamic i in _null) {
   }
   ;
diff --git a/pkg/front_end/testcases/general/issue39817.dart.strong.transformed.expect b/pkg/front_end/testcases/general/issue39817.dart.strong.transformed.expect
index da4a799..cad4f51 100644
--- a/pkg/front_end/testcases/general/issue39817.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/issue39817.dart.strong.transformed.expect
@@ -1,15 +1,9 @@
 library;
 import self as self;
-import "dart:core" as core;
 
 static method foo() → dynamic {
-  core::Null? _null;
-  {
-    core::Iterator<core::Null?>* :sync-for-iterator = _null.{core::Iterable::iterator};
-    for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-      dynamic i = :sync-for-iterator.{core::Iterator::current};
-      {}
-    }
+  Null _null;
+  for (dynamic i in _null) {
   }
   ;
 }
diff --git a/pkg/front_end/testcases/general/issue40662.dart.strong.transformed.expect b/pkg/front_end/testcases/general/issue40662.dart.strong.transformed.expect
index 5fe56f9..d7e7eca 100644
--- a/pkg/front_end/testcases/general/issue40662.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/issue40662.dart.strong.transformed.expect
@@ -9,7 +9,8 @@
   self::expect(1.{core::int::unary-}(), b.{core::List::[]}(0).{core::num::-}(2));
 }
 static method foo(core::int* x) → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic>* :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -30,7 +31,7 @@
           :async_temporary_1 = x.{core::num::+}(1);
           :async_temporary_0 = x.{core::num::+}(2);
           [yield] let dynamic #t1 = asy::_awaitHelper(null, :async_op_then, :async_op_error, :async_op) in null;
-          :async_temporary_2 = <core::int*>[_in::unsafeCast<core::int*>(:async_temporary_1), _in::unsafeCast<core::int*>(:async_temporary_0), _in::unsafeCast<core::Null?>(:result)];
+          :async_temporary_2 = <core::int*>[_in::unsafeCast<core::int*>(:async_temporary_1), _in::unsafeCast<core::int*>(:async_temporary_0), _in::unsafeCast<Null>(:result)];
         }
         else {
           :async_temporary_2 = null;
@@ -38,20 +39,22 @@
         :return_value = self::bar(_in::unsafeCast<core::int*>(:async_temporary_3), :async_temporary_2);
         break #L1;
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method main() → void /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic>* :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -67,17 +70,18 @@
         :return_value = :result;
         break #L2;
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
   if(!expected.{core::Object::==}(actual))
@@ -88,4 +92,4 @@
 Extra constant evaluation status:
 Evaluated: MethodInvocation @ org-dartlang-testcase:///issue40662.dart:8:10 -> IntConstant(-1)
 Evaluated: MethodInvocation @ org-dartlang-testcase:///issue40662.dart:9:10 -> IntConstant(-1)
-Extra constant evaluation: evaluated: 99, effectively constant: 2
+Extra constant evaluation: evaluated: 101, effectively constant: 2
diff --git a/pkg/front_end/testcases/general/issue40744.dart.strong.expect b/pkg/front_end/testcases/general/issue40744.dart.strong.expect
index fe38c65..ba04d64 100644
--- a/pkg/front_end/testcases/general/issue40744.dart.strong.expect
+++ b/pkg/front_end/testcases/general/issue40744.dart.strong.expect
@@ -7,7 +7,7 @@
   core::print(input);
 }
 static method main() → void {
-  final core::Map<core::String*, core::Null?>* nullValueMap = core::Map::fromEntries<core::String*, core::Null?>((#C4).{core::Map::entries}.{core::Iterable::map}<core::MapEntry<core::String*, core::Null?>*>((core::MapEntry<core::String*, dynamic>* e) → core::MapEntry<core::String*, core::Null?>* => new core::MapEntry::_<core::String*, core::Null?>(e.{core::MapEntry::key}, null)));
+  final core::Map<core::String*, Null>* nullValueMap = core::Map::fromEntries<core::String*, Null>((#C4).{core::Map::entries}.{core::Iterable::map}<core::MapEntry<core::String*, Null>*>((core::MapEntry<core::String*, dynamic>* e) → core::MapEntry<core::String*, Null>* => new core::MapEntry::_<core::String*, Null>(e.{core::MapEntry::key}, null)));
   self::helper(nullValueMap);
 }
 
diff --git a/pkg/front_end/testcases/general/issue40744.dart.strong.transformed.expect b/pkg/front_end/testcases/general/issue40744.dart.strong.transformed.expect
index fe38c65..ba04d64 100644
--- a/pkg/front_end/testcases/general/issue40744.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/issue40744.dart.strong.transformed.expect
@@ -7,7 +7,7 @@
   core::print(input);
 }
 static method main() → void {
-  final core::Map<core::String*, core::Null?>* nullValueMap = core::Map::fromEntries<core::String*, core::Null?>((#C4).{core::Map::entries}.{core::Iterable::map}<core::MapEntry<core::String*, core::Null?>*>((core::MapEntry<core::String*, dynamic>* e) → core::MapEntry<core::String*, core::Null?>* => new core::MapEntry::_<core::String*, core::Null?>(e.{core::MapEntry::key}, null)));
+  final core::Map<core::String*, Null>* nullValueMap = core::Map::fromEntries<core::String*, Null>((#C4).{core::Map::entries}.{core::Iterable::map}<core::MapEntry<core::String*, Null>*>((core::MapEntry<core::String*, dynamic>* e) → core::MapEntry<core::String*, Null>* => new core::MapEntry::_<core::String*, Null>(e.{core::MapEntry::key}, null)));
   self::helper(nullValueMap);
 }
 
diff --git a/pkg/front_end/testcases/general/issue41210a.dart.outline.expect b/pkg/front_end/testcases/general/issue41210a.dart.outline.expect
index ff689d2..f56ad37 100644
--- a/pkg/front_end/testcases/general/issue41210a.dart.outline.expect
+++ b/pkg/front_end/testcases/general/issue41210a.dart.outline.expect
@@ -93,12 +93,12 @@
   const synthetic constructor •() → self::_C&Object&A&B*
     : super self::_C&Object&A::•()
     ;
-  abstract forwarding-stub method method(core::num* i, {core::String* s}) → core::String*;
+  abstract member-signature method method(core::num* i, {core::String* s}) → core::String*; -> self::A::method
 }
 class C extends self::_C&Object&A&B {
   synthetic constructor •() → self::C*
     ;
-  abstract forwarding-stub method method(core::num* i, {core::String* s}) → core::String*;
+  abstract member-signature method method(core::num* i, {core::String* s}) → core::String*; -> self::A::method
 }
 abstract class D extends core::Object implements self::Interface, self::Interface2 {
   synthetic constructor •() → self::D*
diff --git a/pkg/front_end/testcases/general/issue41210a.dart.strong.expect b/pkg/front_end/testcases/general/issue41210a.dart.strong.expect
index 85cb4c7..024bfb0 100644
--- a/pkg/front_end/testcases/general/issue41210a.dart.strong.expect
+++ b/pkg/front_end/testcases/general/issue41210a.dart.strong.expect
@@ -96,13 +96,13 @@
   const synthetic constructor •() → self::_C&Object&A&B*
     : super self::_C&Object&A::•()
     ;
-  abstract forwarding-stub method method(core::num* i, {core::String* s = #C1}) → core::String*;
+  abstract member-signature method method(core::num* i, {core::String* s = #C1}) → core::String*; -> self::A::method
 }
 class C extends self::_C&Object&A&B {
   synthetic constructor •() → self::C*
     : super self::_C&Object&A&B::•()
     ;
-  abstract forwarding-stub method method(core::num* i, {core::String* s = #C1}) → core::String*;
+  abstract member-signature method method(core::num* i, {core::String* s = #C1}) → core::String*; -> self::A::method
 }
 abstract class D extends core::Object implements self::Interface, self::Interface2 {
   synthetic constructor •() → self::D*
diff --git a/pkg/front_end/testcases/general/issue41210b/issue41210.dart.outline.expect b/pkg/front_end/testcases/general/issue41210b/issue41210.dart.outline.expect
index 10de15c..ac3f13c 100644
--- a/pkg/front_end/testcases/general/issue41210b/issue41210.dart.outline.expect
+++ b/pkg/front_end/testcases/general/issue41210b/issue41210.dart.outline.expect
@@ -27,12 +27,12 @@
   const synthetic constructor •() → self::_C&Object&A&B*
     : super self::_C&Object&A::•()
     ;
-  abstract forwarding-stub method method(core::num* i, {core::String* s}) → core::String*;
+  abstract member-signature method method(core::num* i, {core::String* s}) → core::String*; -> iss::A::method
 }
 class C extends self::_C&Object&A&B {
   synthetic constructor •() → self::C*
     ;
-  abstract forwarding-stub method method(core::num* i, {core::String* s}) → core::String*;
+  abstract member-signature method method(core::num* i, {core::String* s}) → core::String*; -> iss::A::method
 }
 abstract class _E&Object&A = core::Object with iss::A /*isAnonymousMixin,hasConstConstructor*/  {
   const synthetic constructor •() → self::_E&Object&A*
@@ -48,7 +48,7 @@
 class E extends self::_E&Object&A&D {
   synthetic constructor •() → self::E*
     ;
-  abstract forwarding-stub method method(covariant core::num* i, {core::String* s}) → core::String*;
+  abstract member-signature method method(covariant core::num* i, {core::String* s}) → core::String*; -> self::_E&Object&A&D::method
 }
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/general/issue41210b/issue41210.dart.strong.expect b/pkg/front_end/testcases/general/issue41210b/issue41210.dart.strong.expect
index 1bf6467..daad075 100644
--- a/pkg/front_end/testcases/general/issue41210b/issue41210.dart.strong.expect
+++ b/pkg/front_end/testcases/general/issue41210b/issue41210.dart.strong.expect
@@ -27,13 +27,13 @@
   const synthetic constructor •() → self::_C&Object&A&B*
     : super self::_C&Object&A::•()
     ;
-  abstract forwarding-stub method method(core::num* i, {core::String* s = #C1}) → core::String*;
+  abstract member-signature method method(core::num* i, {core::String* s = #C1}) → core::String*; -> iss::A::method
 }
 class C extends self::_C&Object&A&B {
   synthetic constructor •() → self::C*
     : super self::_C&Object&A&B::•()
     ;
-  abstract forwarding-stub method method(core::num* i, {core::String* s = #C1}) → core::String*;
+  abstract member-signature method method(core::num* i, {core::String* s = #C1}) → core::String*; -> iss::A::method
 }
 abstract class _E&Object&A = core::Object with iss::A /*isAnonymousMixin,hasConstConstructor*/  {
   const synthetic constructor •() → self::_E&Object&A*
@@ -50,7 +50,7 @@
   synthetic constructor •() → self::E*
     : super self::_E&Object&A&D::•()
     ;
-  abstract forwarding-stub method method(covariant core::num* i, {core::String* s = #C1}) → core::String*;
+  abstract member-signature method method(covariant core::num* i, {core::String* s = #C1}) → core::String*; -> self::_E&Object&A&D::method
 }
 static method main() → dynamic {
   core::print(new self::C::•().{self::C::method}(0));
diff --git a/pkg/front_end/testcases/general/issue42615.dart.strong.transformed.expect b/pkg/front_end/testcases/general/issue42615.dart.strong.transformed.expect
index 768d8b1..5550a8f 100644
--- a/pkg/front_end/testcases/general/issue42615.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/issue42615.dart.strong.transformed.expect
@@ -24,7 +24,8 @@
   return null;
 static method main() → dynamic {
   new self::Class::•<dynamic>(a: () → FutureOr<core::List<dynamic>*>* /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::List<dynamic>*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::List<dynamic>*>();
+    final asy::_Future<core::List<dynamic>*>* :async_future = new asy::_Future::•<core::List<dynamic>*>();
+    core::bool* :is_sync = false;
     FutureOr<core::List<dynamic>*>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -38,17 +39,18 @@
           :return_value = self::method() as{TypeError} FutureOr<core::List<dynamic>*>*;
           break #L1;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   });
 }
 
diff --git a/pkg/front_end/testcases/general/long_chain_of_typedefs.dart.outline.expect b/pkg/front_end/testcases/general/long_chain_of_typedefs.dart.outline.expect
index 1883ef1..15cb773 100644
--- a/pkg/front_end/testcases/general/long_chain_of_typedefs.dart.outline.expect
+++ b/pkg/front_end/testcases/general/long_chain_of_typedefs.dart.outline.expect
@@ -2,25 +2,25 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Foo01<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (core::Null?) →* void;
-typedef Foo02<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((core::Null?) →* void) →* void;
-typedef Foo03<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((core::Null?) →* void) →* void) →* void;
-typedef Foo04<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((core::Null?) →* void) →* void) →* void) →* void;
-typedef Foo05<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((core::Null?) →* void) →* void) →* void) →* void) →* void;
-typedef Foo06<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo07<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo08<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo09<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo10<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo11<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo12<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo13<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo14<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo15<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo16<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo17<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo18<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo19<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo20<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo01<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (Null) →* void;
+typedef Foo02<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((Null) →* void) →* void;
+typedef Foo03<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((Null) →* void) →* void) →* void;
+typedef Foo04<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((Null) →* void) →* void) →* void) →* void;
+typedef Foo05<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((Null) →* void) →* void) →* void) →* void) →* void;
+typedef Foo06<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((Null) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo07<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo08<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo09<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo10<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo11<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo12<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo13<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo14<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo15<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo16<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo17<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo18<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo19<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo20<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/general/long_chain_of_typedefs.dart.strong.expect b/pkg/front_end/testcases/general/long_chain_of_typedefs.dart.strong.expect
index e62ba24..10636b1 100644
--- a/pkg/front_end/testcases/general/long_chain_of_typedefs.dart.strong.expect
+++ b/pkg/front_end/testcases/general/long_chain_of_typedefs.dart.strong.expect
@@ -2,24 +2,24 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Foo01<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (core::Null?) →* void;
-typedef Foo02<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((core::Null?) →* void) →* void;
-typedef Foo03<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((core::Null?) →* void) →* void) →* void;
-typedef Foo04<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((core::Null?) →* void) →* void) →* void) →* void;
-typedef Foo05<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((core::Null?) →* void) →* void) →* void) →* void) →* void;
-typedef Foo06<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo07<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo08<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo09<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo10<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo11<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo12<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo13<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo14<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo15<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo16<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo17<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo18<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo19<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo20<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo01<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (Null) →* void;
+typedef Foo02<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((Null) →* void) →* void;
+typedef Foo03<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((Null) →* void) →* void) →* void;
+typedef Foo04<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((Null) →* void) →* void) →* void) →* void;
+typedef Foo05<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((Null) →* void) →* void) →* void) →* void) →* void;
+typedef Foo06<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((Null) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo07<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo08<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo09<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo10<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo11<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo12<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo13<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo14<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo15<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo16<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo17<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo18<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo19<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo20<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/long_chain_of_typedefs.dart.strong.transformed.expect b/pkg/front_end/testcases/general/long_chain_of_typedefs.dart.strong.transformed.expect
index e62ba24..10636b1 100644
--- a/pkg/front_end/testcases/general/long_chain_of_typedefs.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/long_chain_of_typedefs.dart.strong.transformed.expect
@@ -2,24 +2,24 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Foo01<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (core::Null?) →* void;
-typedef Foo02<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((core::Null?) →* void) →* void;
-typedef Foo03<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((core::Null?) →* void) →* void) →* void;
-typedef Foo04<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((core::Null?) →* void) →* void) →* void) →* void;
-typedef Foo05<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((core::Null?) →* void) →* void) →* void) →* void) →* void;
-typedef Foo06<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo07<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo08<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo09<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo10<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo11<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo12<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo13<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo14<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo15<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo16<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo17<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo18<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo19<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo20<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo01<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (Null) →* void;
+typedef Foo02<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((Null) →* void) →* void;
+typedef Foo03<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((Null) →* void) →* void) →* void;
+typedef Foo04<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((Null) →* void) →* void) →* void) →* void;
+typedef Foo05<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((Null) →* void) →* void) →* void) →* void) →* void;
+typedef Foo06<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((Null) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo07<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo08<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo09<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo10<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo11<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo12<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo13<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo14<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo15<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo16<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo17<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo18<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo19<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo20<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/mixin_application_override.dart.outline.expect b/pkg/front_end/testcases/general/mixin_application_override.dart.outline.expect
index bb83e39..7ea8f01 100644
--- a/pkg/front_end/testcases/general/mixin_application_override.dart.outline.expect
+++ b/pkg/front_end/testcases/general/mixin_application_override.dart.outline.expect
@@ -203,7 +203,7 @@
   synthetic constructor •() → self::A0*
     : super self::S::•()
     ;
-  abstract forwarding-stub method foo([dynamic x]) → dynamic;
+  abstract member-signature method foo([dynamic x]) → dynamic; -> self::S::foo
 }
 abstract class _A1&S&M1 = self::S with self::M1 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_A1&S&M1*
@@ -214,7 +214,7 @@
   synthetic constructor •() → self::A1*
     : super self::_A1&S&M1::•()
     ;
-  abstract forwarding-stub method foo([dynamic x]) → dynamic;
+  abstract member-signature method foo([dynamic x]) → dynamic; -> self::S::foo
 }
 abstract class _A2&S&M1 = self::S with self::M1 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_A2&S&M1*
@@ -230,13 +230,13 @@
   synthetic constructor •() → self::A2*
     : super self::_A2&S&M1&M2::•()
     ;
-  abstract forwarding-stub method foo([dynamic x]) → dynamic;
+  abstract member-signature method foo([dynamic x]) → dynamic; -> self::S::foo
 }
 abstract class _A0X&S&M = self::S with self::M /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_A0X&S&M*
     : super self::S::•()
     ;
-  abstract forwarding-stub method foo([dynamic x]) → dynamic;
+  abstract member-signature method foo([dynamic x]) → dynamic; -> self::S::foo
 }
 class A0X = self::_A0X&S&M with self::MX {
   synthetic constructor •() → self::A0X*
@@ -252,7 +252,7 @@
   synthetic constructor •() → self::_A1X&S&M1&M*
     : super self::_A1X&S&M1::•()
     ;
-  abstract forwarding-stub method foo([dynamic x]) → dynamic;
+  abstract member-signature method foo([dynamic x]) → dynamic; -> self::S::foo
 }
 class A1X = self::_A1X&S&M1&M with self::MX {
   synthetic constructor •() → self::A1X*
@@ -273,7 +273,7 @@
   synthetic constructor •() → self::_A2X&S&M1&M2&M*
     : super self::_A2X&S&M1&M2::•()
     ;
-  abstract forwarding-stub method foo([dynamic x]) → dynamic;
+  abstract member-signature method foo([dynamic x]) → dynamic; -> self::S::foo
 }
 class A2X = self::_A2X&S&M1&M2&M with self::MX {
   synthetic constructor •() → self::A2X*
@@ -284,7 +284,7 @@
   synthetic constructor •() → self::_B0&S&M*
     : super self::S::•()
     ;
-  abstract forwarding-stub method foo([dynamic x]) → dynamic;
+  abstract member-signature method foo([dynamic x]) → dynamic; -> self::S::foo
 }
 class B0 extends self::_B0&S&M {
   synthetic constructor •() → self::B0*
@@ -299,7 +299,7 @@
   synthetic constructor •() → self::_B1&S&M1&M*
     : super self::_B1&S&M1::•()
     ;
-  abstract forwarding-stub method foo([dynamic x]) → dynamic;
+  abstract member-signature method foo([dynamic x]) → dynamic; -> self::S::foo
 }
 class B1 extends self::_B1&S&M1&M {
   synthetic constructor •() → self::B1*
@@ -319,7 +319,7 @@
   synthetic constructor •() → self::_B2&S&M1&M2&M*
     : super self::_B2&S&M1&M2::•()
     ;
-  abstract forwarding-stub method foo([dynamic x]) → dynamic;
+  abstract member-signature method foo([dynamic x]) → dynamic; -> self::S::foo
 }
 class B2 extends self::_B2&S&M1&M2&M {
   synthetic constructor •() → self::B2*
@@ -329,7 +329,7 @@
   synthetic constructor •() → self::_B0X&S&M*
     : super self::S::•()
     ;
-  abstract forwarding-stub method foo([dynamic x]) → dynamic;
+  abstract member-signature method foo([dynamic x]) → dynamic; -> self::S::foo
 }
 abstract class _B0X&S&M&MX = self::_B0X&S&M with self::MX /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_B0X&S&M&MX*
@@ -349,7 +349,7 @@
   synthetic constructor •() → self::_B1X&S&M1&M*
     : super self::_B1X&S&M1::•()
     ;
-  abstract forwarding-stub method foo([dynamic x]) → dynamic;
+  abstract member-signature method foo([dynamic x]) → dynamic; -> self::S::foo
 }
 abstract class _B1X&S&M1&M&MX = self::_B1X&S&M1&M with self::MX /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_B1X&S&M1&M&MX*
@@ -374,7 +374,7 @@
   synthetic constructor •() → self::_B2X&S&M1&M2&M*
     : super self::_B2X&S&M1&M2::•()
     ;
-  abstract forwarding-stub method foo([dynamic x]) → dynamic;
+  abstract member-signature method foo([dynamic x]) → dynamic; -> self::S::foo
 }
 abstract class _B2X&S&M1&M2&M&MX = self::_B2X&S&M1&M2&M with self::MX /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_B2X&S&M1&M2&M&MX*
diff --git a/pkg/front_end/testcases/general/mixin_application_override.dart.strong.expect b/pkg/front_end/testcases/general/mixin_application_override.dart.strong.expect
index f7fe382..5279085 100644
--- a/pkg/front_end/testcases/general/mixin_application_override.dart.strong.expect
+++ b/pkg/front_end/testcases/general/mixin_application_override.dart.strong.expect
@@ -206,7 +206,7 @@
   synthetic constructor •() → self::A0*
     : super self::S::•()
     ;
-  abstract forwarding-stub method foo([dynamic x = #C1]) → dynamic;
+  abstract member-signature method foo([dynamic x = #C1]) → dynamic; -> self::S::foo
 }
 abstract class _A1&S&M1 = self::S with self::M1 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_A1&S&M1*
@@ -217,7 +217,7 @@
   synthetic constructor •() → self::A1*
     : super self::_A1&S&M1::•()
     ;
-  abstract forwarding-stub method foo([dynamic x = #C1]) → dynamic;
+  abstract member-signature method foo([dynamic x = #C1]) → dynamic; -> self::S::foo
 }
 abstract class _A2&S&M1 = self::S with self::M1 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_A2&S&M1*
@@ -233,13 +233,13 @@
   synthetic constructor •() → self::A2*
     : super self::_A2&S&M1&M2::•()
     ;
-  abstract forwarding-stub method foo([dynamic x = #C1]) → dynamic;
+  abstract member-signature method foo([dynamic x = #C1]) → dynamic; -> self::S::foo
 }
 abstract class _A0X&S&M = self::S with self::M /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_A0X&S&M*
     : super self::S::•()
     ;
-  abstract forwarding-stub method foo([dynamic x = #C1]) → dynamic;
+  abstract member-signature method foo([dynamic x = #C1]) → dynamic; -> self::S::foo
 }
 class A0X = self::_A0X&S&M with self::MX {
   synthetic constructor •() → self::A0X*
@@ -255,7 +255,7 @@
   synthetic constructor •() → self::_A1X&S&M1&M*
     : super self::_A1X&S&M1::•()
     ;
-  abstract forwarding-stub method foo([dynamic x = #C1]) → dynamic;
+  abstract member-signature method foo([dynamic x = #C1]) → dynamic; -> self::S::foo
 }
 class A1X = self::_A1X&S&M1&M with self::MX {
   synthetic constructor •() → self::A1X*
@@ -276,7 +276,7 @@
   synthetic constructor •() → self::_A2X&S&M1&M2&M*
     : super self::_A2X&S&M1&M2::•()
     ;
-  abstract forwarding-stub method foo([dynamic x = #C1]) → dynamic;
+  abstract member-signature method foo([dynamic x = #C1]) → dynamic; -> self::S::foo
 }
 class A2X = self::_A2X&S&M1&M2&M with self::MX {
   synthetic constructor •() → self::A2X*
@@ -287,7 +287,7 @@
   synthetic constructor •() → self::_B0&S&M*
     : super self::S::•()
     ;
-  abstract forwarding-stub method foo([dynamic x = #C1]) → dynamic;
+  abstract member-signature method foo([dynamic x = #C1]) → dynamic; -> self::S::foo
 }
 class B0 extends self::_B0&S&M {
   synthetic constructor •() → self::B0*
@@ -303,7 +303,7 @@
   synthetic constructor •() → self::_B1&S&M1&M*
     : super self::_B1&S&M1::•()
     ;
-  abstract forwarding-stub method foo([dynamic x = #C1]) → dynamic;
+  abstract member-signature method foo([dynamic x = #C1]) → dynamic; -> self::S::foo
 }
 class B1 extends self::_B1&S&M1&M {
   synthetic constructor •() → self::B1*
@@ -324,7 +324,7 @@
   synthetic constructor •() → self::_B2&S&M1&M2&M*
     : super self::_B2&S&M1&M2::•()
     ;
-  abstract forwarding-stub method foo([dynamic x = #C1]) → dynamic;
+  abstract member-signature method foo([dynamic x = #C1]) → dynamic; -> self::S::foo
 }
 class B2 extends self::_B2&S&M1&M2&M {
   synthetic constructor •() → self::B2*
@@ -335,7 +335,7 @@
   synthetic constructor •() → self::_B0X&S&M*
     : super self::S::•()
     ;
-  abstract forwarding-stub method foo([dynamic x = #C1]) → dynamic;
+  abstract member-signature method foo([dynamic x = #C1]) → dynamic; -> self::S::foo
 }
 abstract class _B0X&S&M&MX = self::_B0X&S&M with self::MX /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_B0X&S&M&MX*
@@ -356,7 +356,7 @@
   synthetic constructor •() → self::_B1X&S&M1&M*
     : super self::_B1X&S&M1::•()
     ;
-  abstract forwarding-stub method foo([dynamic x = #C1]) → dynamic;
+  abstract member-signature method foo([dynamic x = #C1]) → dynamic; -> self::S::foo
 }
 abstract class _B1X&S&M1&M&MX = self::_B1X&S&M1&M with self::MX /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_B1X&S&M1&M&MX*
@@ -382,7 +382,7 @@
   synthetic constructor •() → self::_B2X&S&M1&M2&M*
     : super self::_B2X&S&M1&M2::•()
     ;
-  abstract forwarding-stub method foo([dynamic x = #C1]) → dynamic;
+  abstract member-signature method foo([dynamic x = #C1]) → dynamic; -> self::S::foo
 }
 abstract class _B2X&S&M1&M2&M&MX = self::_B2X&S&M1&M2&M with self::MX /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_B2X&S&M1&M2&M&MX*
diff --git a/pkg/front_end/testcases/general/mixin_covariant2.dart b/pkg/front_end/testcases/general/mixin_covariant2.dart
new file mode 100644
index 0000000..8454114
--- /dev/null
+++ b/pkg/front_end/testcases/general/mixin_covariant2.dart
@@ -0,0 +1,53 @@
+// Copyright (c) 2020, 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.
+
+class Superclass {
+  String method1(num argument1, num argument2) => "Superclass";
+  String method2(num argument1, num argument2) => "Superclass";
+  String method3(num argument1, covariant int argument2) => "Superclass";
+  String method4(num argument1, covariant num argument2) => "Superclass";
+}
+
+class Mixin {
+  String method1(num argument1, num argument2) => "Mixin";
+  String method2(covariant int argument1, num argument2) => "Mixin";
+  String method3(num argument1, num argument2) => "Mixin";
+  String method4(covariant int argument1, int argument2) => "Mixin";
+}
+
+class Class extends Superclass with Mixin {}
+
+main() {
+  Class c = new Class();
+  expect("Mixin", c.method1(0, 1));
+  expect("Mixin", c.method2(0, 1));
+  expect("Mixin", c.method3(0, 1));
+  expect("Mixin", c.method4(0, 1));
+
+  Superclass s = c;
+  expect("Mixin", s.method1(0.5, 1.5));
+  throws(() => s.method2(0.5, 1.5));
+  expect("Mixin", s.method3(0.5, 1));
+  throws(() => s.method4(0.5, 1));
+  expect("Mixin", s.method4(1, 0.5));
+
+  Mixin m = c;
+  expect("Mixin", m.method1(0, 1));
+  expect("Mixin", m.method2(0, 1));
+  expect("Mixin", m.method3(0, 1));
+  expect("Mixin", m.method4(0, 1));
+}
+
+void expect(expected, actual) {
+  if (expected != actual) throw 'Expected $expected, actual $actual';
+}
+
+void throws(void Function() f) {
+  try {
+    f();
+  } catch (_) {
+    return;
+  }
+  throw 'Expected exception';
+}
diff --git a/pkg/front_end/testcases/general/mixin_covariant2.dart.outline.expect b/pkg/front_end/testcases/general/mixin_covariant2.dart.outline.expect
new file mode 100644
index 0000000..8a608cb
--- /dev/null
+++ b/pkg/front_end/testcases/general/mixin_covariant2.dart.outline.expect
@@ -0,0 +1,68 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Superclass extends core::Object {
+  synthetic constructor •() → self::Superclass*
+    ;
+  method method1(core::num* argument1, core::num* argument2) → core::String*
+    ;
+  method method2(core::num* argument1, core::num* argument2) → core::String*
+    ;
+  method method3(core::num* argument1, covariant core::int* argument2) → core::String*
+    ;
+  method method4(core::num* argument1, covariant core::num* argument2) → core::String*
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Mixin extends core::Object {
+  synthetic constructor •() → self::Mixin*
+    ;
+  method method1(core::num* argument1, core::num* argument2) → core::String*
+    ;
+  method method2(covariant core::int* argument1, core::num* argument2) → core::String*
+    ;
+  method method3(core::num* argument1, core::num* argument2) → core::String*
+    ;
+  method method4(covariant core::int* argument1, core::int* argument2) → core::String*
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _Class&Superclass&Mixin = self::Superclass with self::Mixin /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Superclass&Mixin*
+    : super self::Superclass::•()
+    ;
+  abstract forwarding-stub method method2(covariant core::num* argument1, core::num* argument2) → core::String*;
+  forwarding-stub method method3(core::num* argument1, covariant core::num* argument2) → core::String*
+    return super.{self::Superclass::method3}(argument1, argument2);
+  forwarding-stub method method4(covariant core::num* argument1, covariant core::num* argument2) → core::String*
+    return super.{self::Superclass::method4}(argument1, argument2);
+}
+class Class extends self::_Class&Superclass&Mixin {
+  synthetic constructor •() → self::Class*
+    ;
+}
+static method main() → dynamic
+  ;
+static method expect(dynamic expected, dynamic actual) → void
+  ;
+static method throws(() →* void f) → void
+  ;
diff --git a/pkg/front_end/testcases/general/mixin_covariant2.dart.strong.expect b/pkg/front_end/testcases/general/mixin_covariant2.dart.strong.expect
new file mode 100644
index 0000000..62e8537
--- /dev/null
+++ b/pkg/front_end/testcases/general/mixin_covariant2.dart.strong.expect
@@ -0,0 +1,96 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Superclass extends core::Object {
+  synthetic constructor •() → self::Superclass*
+    : super core::Object::•()
+    ;
+  method method1(core::num* argument1, core::num* argument2) → core::String*
+    return "Superclass";
+  method method2(core::num* argument1, core::num* argument2) → core::String*
+    return "Superclass";
+  method method3(core::num* argument1, covariant core::int* argument2) → core::String*
+    return "Superclass";
+  method method4(core::num* argument1, covariant core::num* argument2) → core::String*
+    return "Superclass";
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Mixin extends core::Object {
+  synthetic constructor •() → self::Mixin*
+    : super core::Object::•()
+    ;
+  method method1(core::num* argument1, core::num* argument2) → core::String*
+    return "Mixin";
+  method method2(covariant core::int* argument1, core::num* argument2) → core::String*
+    return "Mixin";
+  method method3(core::num* argument1, core::num* argument2) → core::String*
+    return "Mixin";
+  method method4(covariant core::int* argument1, core::int* argument2) → core::String*
+    return "Mixin";
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _Class&Superclass&Mixin = self::Superclass with self::Mixin /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Superclass&Mixin*
+    : super self::Superclass::•()
+    ;
+  abstract forwarding-stub method method2(covariant core::num* argument1, core::num* argument2) → core::String*;
+  forwarding-stub method method3(core::num* argument1, covariant core::num* argument2) → core::String*
+    return super.{self::Superclass::method3}(argument1, argument2);
+  forwarding-stub method method4(covariant core::num* argument1, covariant core::num* argument2) → core::String*
+    return super.{self::Superclass::method4}(argument1, argument2);
+}
+class Class extends self::_Class&Superclass&Mixin {
+  synthetic constructor •() → self::Class*
+    : super self::_Class&Superclass&Mixin::•()
+    ;
+}
+static method main() → dynamic {
+  self::Class* c = new self::Class::•();
+  self::expect("Mixin", c.{self::Mixin::method1}(0, 1));
+  self::expect("Mixin", c.{self::_Class&Superclass&Mixin::method2}(0, 1));
+  self::expect("Mixin", c.{self::_Class&Superclass&Mixin::method3}(0, 1));
+  self::expect("Mixin", c.{self::_Class&Superclass&Mixin::method4}(0, 1));
+  self::Superclass* s = c;
+  self::expect("Mixin", s.{self::Superclass::method1}(0.5, 1.5));
+  self::throws(() → core::String* => s.{self::Superclass::method2}(0.5, 1.5));
+  self::expect("Mixin", s.{self::Superclass::method3}(0.5, 1));
+  self::throws(() → core::String* => s.{self::Superclass::method4}(0.5, 1));
+  self::expect("Mixin", s.{self::Superclass::method4}(1, 0.5));
+  self::Mixin* m = c;
+  self::expect("Mixin", m.{self::Mixin::method1}(0, 1));
+  self::expect("Mixin", m.{self::Mixin::method2}(0, 1));
+  self::expect("Mixin", m.{self::Mixin::method3}(0, 1));
+  self::expect("Mixin", m.{self::Mixin::method4}(0, 1));
+}
+static method expect(dynamic expected, dynamic actual) → void {
+  if(!expected.{core::Object::==}(actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+static method throws(() →* void f) → void {
+  try {
+    f.call();
+  }
+  on dynamic catch(final dynamic _) {
+    return;
+  }
+  throw "Expected exception";
+}
diff --git a/pkg/front_end/testcases/general/mixin_covariant2.dart.textual_outline.expect b/pkg/front_end/testcases/general/mixin_covariant2.dart.textual_outline.expect
new file mode 100644
index 0000000..6f22d96
--- /dev/null
+++ b/pkg/front_end/testcases/general/mixin_covariant2.dart.textual_outline.expect
@@ -0,0 +1,19 @@
+class Superclass {
+  String method1(num argument1, num argument2) => "Superclass";
+  String method2(num argument1, num argument2) => "Superclass";
+  String method3(num argument1, covariant int argument2) => "Superclass";
+  String method4(num argument1, covariant num argument2) => "Superclass";
+}
+
+class Mixin {
+  String method1(num argument1, num argument2) => "Mixin";
+  String method2(covariant int argument1, num argument2) => "Mixin";
+  String method3(num argument1, num argument2) => "Mixin";
+  String method4(covariant int argument1, int argument2) => "Mixin";
+}
+
+class Class extends Superclass with Mixin {}
+
+main() {}
+void expect(expected, actual) {}
+void throws(void Function() f) {}
diff --git a/pkg/front_end/testcases/general/mixin_covariant2.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/mixin_covariant2.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..9f3d0b4
--- /dev/null
+++ b/pkg/front_end/testcases/general/mixin_covariant2.dart.textual_outline_modelled.expect
@@ -0,0 +1,19 @@
+class Class extends Superclass with Mixin {}
+
+class Mixin {
+  String method1(num argument1, num argument2) => "Mixin";
+  String method2(covariant int argument1, num argument2) => "Mixin";
+  String method3(num argument1, num argument2) => "Mixin";
+  String method4(covariant int argument1, int argument2) => "Mixin";
+}
+
+class Superclass {
+  String method1(num argument1, num argument2) => "Superclass";
+  String method2(num argument1, num argument2) => "Superclass";
+  String method3(num argument1, covariant int argument2) => "Superclass";
+  String method4(num argument1, covariant num argument2) => "Superclass";
+}
+
+main() {}
+void expect(expected, actual) {}
+void throws(void Function() f) {}
diff --git a/pkg/front_end/testcases/general/named_function_scope.dart.strong.expect b/pkg/front_end/testcases/general/named_function_scope.dart.strong.expect
index f2faf67..3fc22fe 100644
--- a/pkg/front_end/testcases/general/named_function_scope.dart.strong.expect
+++ b/pkg/front_end/testcases/general/named_function_scope.dart.strong.expect
@@ -118,14 +118,14 @@
   self::T* t;
   self::V* v;
   {
-    function T() → core::Null? {}
+    function T() → Null {}
   }
   {
     dynamic v;
   }
   {
     self::T* t;
-    () →* core::Null? x = let final () →* core::Null? T = () → core::Null? {} in T;
+    () →* Null x = let final () →* Null T = () → Null {} in T;
   }
   {
     self::V* v;
@@ -140,9 +140,9 @@
         ^" in null;
   }
   {
-    () →* core::Null? x = let final dynamic #t2 = invalid-expression "pkg/front_end/testcases/general/named_function_scope.dart:41:15: Error: Can't declare 'T' because it was already used in this scope.
+    () →* Null x = let final dynamic #t2 = invalid-expression "pkg/front_end/testcases/general/named_function_scope.dart:41:15: Error: Can't declare 'T' because it was already used in this scope.
     var x = T T() {};
-              ^" in let final () →* core::Null? T = () → core::Null? {} in T;
+              ^" in let final () →* Null T = () → Null {} in T;
   }
   {
     self::V* V = invalid-expression "pkg/front_end/testcases/general/named_function_scope.dart:47:7: Error: Can't declare 'V' because it was already used in this scope.
@@ -150,9 +150,9 @@
       ^" as{TypeError,ForDynamic} self::V*;
   }
   {
-    <T extends core::Object* = dynamic>() →* core::Null? x = let final dynamic #t3 = invalid-expression "pkg/front_end/testcases/general/named_function_scope.dart:52:13: Error: 'T' is already declared in this scope.
+    <T extends core::Object* = dynamic>() →* Null x = let final dynamic #t3 = invalid-expression "pkg/front_end/testcases/general/named_function_scope.dart:52:13: Error: 'T' is already declared in this scope.
     var x = T<T>() {};
-            ^" in let final <T extends core::Object* = dynamic>() →* core::Null? T = <T extends core::Object* = dynamic>() → core::Null? {} in T;
+            ^" in let final <T extends core::Object* = dynamic>() →* Null T = <T extends core::Object* = dynamic>() → Null {} in T;
   }
   {
     self::T* t;
diff --git a/pkg/front_end/testcases/general/named_function_scope.dart.strong.transformed.expect b/pkg/front_end/testcases/general/named_function_scope.dart.strong.transformed.expect
index 6ec0166..b651183 100644
--- a/pkg/front_end/testcases/general/named_function_scope.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/named_function_scope.dart.strong.transformed.expect
@@ -118,14 +118,14 @@
   self::T* t;
   self::V* v;
   {
-    function T() → core::Null? {}
+    function T() → Null {}
   }
   {
     dynamic v;
   }
   {
     self::T* t;
-    () →* core::Null? x = let final () →* core::Null? T = () → core::Null? {} in T;
+    () →* Null x = let final () →* Null T = () → Null {} in T;
   }
   {
     self::V* v;
@@ -140,9 +140,9 @@
         ^" in null;
   }
   {
-    () →* core::Null? x = let final dynamic #t2 = invalid-expression "pkg/front_end/testcases/general/named_function_scope.dart:41:15: Error: Can't declare 'T' because it was already used in this scope.
+    () →* Null x = let final dynamic #t2 = invalid-expression "pkg/front_end/testcases/general/named_function_scope.dart:41:15: Error: Can't declare 'T' because it was already used in this scope.
     var x = T T() {};
-              ^" in let final () →* core::Null? T = () → core::Null? {} in T;
+              ^" in let final () →* Null T = () → Null {} in T;
   }
   {
     self::V* V = invalid-expression "pkg/front_end/testcases/general/named_function_scope.dart:47:7: Error: Can't declare 'V' because it was already used in this scope.
@@ -150,9 +150,9 @@
       ^";
   }
   {
-    <T extends core::Object* = dynamic>() →* core::Null? x = let final dynamic #t3 = invalid-expression "pkg/front_end/testcases/general/named_function_scope.dart:52:13: Error: 'T' is already declared in this scope.
+    <T extends core::Object* = dynamic>() →* Null x = let final dynamic #t3 = invalid-expression "pkg/front_end/testcases/general/named_function_scope.dart:52:13: Error: 'T' is already declared in this scope.
     var x = T<T>() {};
-            ^" in let final <T extends core::Object* = dynamic>() →* core::Null? T = <T extends core::Object* = dynamic>() → core::Null? {} in T;
+            ^" in let final <T extends core::Object* = dynamic>() →* Null T = <T extends core::Object* = dynamic>() → Null {} in T;
   }
   {
     self::T* t;
diff --git a/pkg/front_end/testcases/general/nested_variance.dart.outline.expect b/pkg/front_end/testcases/general/nested_variance.dart.outline.expect
index 2768327..1172b5e 100644
--- a/pkg/front_end/testcases/general/nested_variance.dart.outline.expect
+++ b/pkg/front_end/testcases/general/nested_variance.dart.outline.expect
@@ -10,9 +10,9 @@
 typedef FconBound<contravariant X extends core::num* = core::num*> = (X*) →* dynamic;
 typedef FinvBound<invariant X extends core::num* = core::num*> = (X*) →* X*;
 typedef FcovCyclicBound<X extends self::A<X*>* = self::A<dynamic>*> = () →* X*;
-typedef FconCyclicBound<contravariant X extends self::A<X*>* = self::A<core::Null?>*> = (X*) →* dynamic;
+typedef FconCyclicBound<contravariant X extends self::A<X*>* = self::A<Null>*> = (X*) →* dynamic;
 typedef FinvCyclicBound<invariant X extends self::A<X*>* = self::A<dynamic>*> = (X*) →* X*;
-typedef FcovCyclicCoBound<X extends (X*) →* dynamic = (core::Null?) →* dynamic> = () →* X*;
+typedef FcovCyclicCoBound<X extends (X*) →* dynamic = (Null) →* dynamic> = () →* X*;
 typedef FconCyclicCoBound<contravariant X extends (X*) →* dynamic = (dynamic) →* dynamic> = (X*) →* dynamic;
 typedef FinvCyclicCoBound<invariant X extends (X*) →* dynamic = (dynamic) →* dynamic> = (X*) →* X*;
 class Acov<X extends () →* self::Acov::Y* = () →* dynamic, Y extends core::Object* = dynamic> extends core::Object {
@@ -29,7 +29,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Acon<X extends (self::Acon::Y*) →* dynamic = (core::Null?) →* dynamic, Y extends core::Object* = dynamic> extends core::Object {
+class Acon<X extends (self::Acon::Y*) →* dynamic = (Null) →* dynamic, Y extends core::Object* = dynamic> extends core::Object {
   synthetic constructor •() → self::Acon<self::Acon::X*, self::Acon::Y*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -71,7 +71,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class AconBound<X extends (self::AconBound::Y*) →* dynamic = (core::Null?) →* dynamic, Y extends core::num* = core::num*> extends core::Object {
+class AconBound<X extends (self::AconBound::Y*) →* dynamic = (Null) →* dynamic, Y extends core::num* = core::num*> extends core::Object {
   synthetic constructor •() → self::AconBound<self::AconBound::X*, self::AconBound::Y*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -127,7 +127,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class AconCyclicBound<X extends (self::AconCyclicBound::Y*) →* dynamic = (core::Null?) →* dynamic, Y extends self::A<self::AconCyclicBound::Y*>* = self::A<dynamic>*> extends core::Object {
+class AconCyclicBound<X extends (self::AconCyclicBound::Y*) →* dynamic = (Null) →* dynamic, Y extends self::A<self::AconCyclicBound::Y*>* = self::A<dynamic>*> extends core::Object {
   synthetic constructor •() → self::AconCyclicBound<self::AconCyclicBound::X*, self::AconCyclicBound::Y*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -155,7 +155,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class AcovCyclicCoBound<X extends () →* self::AcovCyclicCoBound::Y* = () →* (core::Null?) →* dynamic, Y extends (self::AcovCyclicCoBound::Y*) →* dynamic = (core::Null?) →* dynamic> extends core::Object {
+class AcovCyclicCoBound<X extends () →* self::AcovCyclicCoBound::Y* = () →* (Null) →* dynamic, Y extends (self::AcovCyclicCoBound::Y*) →* dynamic = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::AcovCyclicCoBound<self::AcovCyclicCoBound::X*, self::AcovCyclicCoBound::Y*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -169,7 +169,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class AconCyclicCoBound<X extends (self::AconCyclicCoBound::Y*) →* dynamic = (core::Null?) →* dynamic, Y extends (self::AconCyclicCoBound::Y*) →* dynamic = (core::Null?) →* dynamic> extends core::Object {
+class AconCyclicCoBound<X extends (self::AconCyclicCoBound::Y*) →* dynamic = (Null) →* dynamic, Y extends (self::AconCyclicCoBound::Y*) →* dynamic = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::AconCyclicCoBound<self::AconCyclicCoBound::X*, self::AconCyclicCoBound::Y*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -183,7 +183,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class AinvCyclicCoBound<X extends (self::AinvCyclicCoBound::Y*) →* self::AinvCyclicCoBound::Y* = ((core::Null?) →* dynamic) →* (core::Null?) →* dynamic, Y extends (self::AinvCyclicCoBound::Y*) →* dynamic = (core::Null?) →* dynamic> extends core::Object {
+class AinvCyclicCoBound<X extends (self::AinvCyclicCoBound::Y*) →* self::AinvCyclicCoBound::Y* = ((Null) →* dynamic) →* (Null) →* dynamic, Y extends (self::AinvCyclicCoBound::Y*) →* dynamic = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::AinvCyclicCoBound<self::AinvCyclicCoBound::X*, self::AinvCyclicCoBound::Y*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
diff --git a/pkg/front_end/testcases/general/nested_variance.dart.strong.expect b/pkg/front_end/testcases/general/nested_variance.dart.strong.expect
index 722c19a..e1dd3c7 100644
--- a/pkg/front_end/testcases/general/nested_variance.dart.strong.expect
+++ b/pkg/front_end/testcases/general/nested_variance.dart.strong.expect
@@ -10,9 +10,9 @@
 typedef FconBound<contravariant X extends core::num* = core::num*> = (X*) →* dynamic;
 typedef FinvBound<invariant X extends core::num* = core::num*> = (X*) →* X*;
 typedef FcovCyclicBound<X extends self::A<X*>* = self::A<dynamic>*> = () →* X*;
-typedef FconCyclicBound<contravariant X extends self::A<X*>* = self::A<core::Null?>*> = (X*) →* dynamic;
+typedef FconCyclicBound<contravariant X extends self::A<X*>* = self::A<Null>*> = (X*) →* dynamic;
 typedef FinvCyclicBound<invariant X extends self::A<X*>* = self::A<dynamic>*> = (X*) →* X*;
-typedef FcovCyclicCoBound<X extends (X*) →* dynamic = (core::Null?) →* dynamic> = () →* X*;
+typedef FcovCyclicCoBound<X extends (X*) →* dynamic = (Null) →* dynamic> = () →* X*;
 typedef FconCyclicCoBound<contravariant X extends (X*) →* dynamic = (dynamic) →* dynamic> = (X*) →* dynamic;
 typedef FinvCyclicCoBound<invariant X extends (X*) →* dynamic = (dynamic) →* dynamic> = (X*) →* X*;
 class Acov<X extends () →* self::Acov::Y* = () →* dynamic, Y extends core::Object* = dynamic> extends core::Object {
@@ -30,7 +30,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Acon<X extends (self::Acon::Y*) →* dynamic = (core::Null?) →* dynamic, Y extends core::Object* = dynamic> extends core::Object {
+class Acon<X extends (self::Acon::Y*) →* dynamic = (Null) →* dynamic, Y extends core::Object* = dynamic> extends core::Object {
   synthetic constructor •() → self::Acon<self::Acon::X*, self::Acon::Y*>*
     : super core::Object::•()
     ;
@@ -75,7 +75,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class AconBound<X extends (self::AconBound::Y*) →* dynamic = (core::Null?) →* dynamic, Y extends core::num* = core::num*> extends core::Object {
+class AconBound<X extends (self::AconBound::Y*) →* dynamic = (Null) →* dynamic, Y extends core::num* = core::num*> extends core::Object {
   synthetic constructor •() → self::AconBound<self::AconBound::X*, self::AconBound::Y*>*
     : super core::Object::•()
     ;
@@ -135,7 +135,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class AconCyclicBound<X extends (self::AconCyclicBound::Y*) →* dynamic = (core::Null?) →* dynamic, Y extends self::A<self::AconCyclicBound::Y*>* = self::A<dynamic>*> extends core::Object {
+class AconCyclicBound<X extends (self::AconCyclicBound::Y*) →* dynamic = (Null) →* dynamic, Y extends self::A<self::AconCyclicBound::Y*>* = self::A<dynamic>*> extends core::Object {
   synthetic constructor •() → self::AconCyclicBound<self::AconCyclicBound::X*, self::AconCyclicBound::Y*>*
     : super core::Object::•()
     ;
@@ -165,7 +165,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class AcovCyclicCoBound<X extends () →* self::AcovCyclicCoBound::Y* = () →* (core::Null?) →* dynamic, Y extends (self::AcovCyclicCoBound::Y*) →* dynamic = (core::Null?) →* dynamic> extends core::Object {
+class AcovCyclicCoBound<X extends () →* self::AcovCyclicCoBound::Y* = () →* (Null) →* dynamic, Y extends (self::AcovCyclicCoBound::Y*) →* dynamic = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::AcovCyclicCoBound<self::AcovCyclicCoBound::X*, self::AcovCyclicCoBound::Y*>*
     : super core::Object::•()
     ;
@@ -180,7 +180,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class AconCyclicCoBound<X extends (self::AconCyclicCoBound::Y*) →* dynamic = (core::Null?) →* dynamic, Y extends (self::AconCyclicCoBound::Y*) →* dynamic = (core::Null?) →* dynamic> extends core::Object {
+class AconCyclicCoBound<X extends (self::AconCyclicCoBound::Y*) →* dynamic = (Null) →* dynamic, Y extends (self::AconCyclicCoBound::Y*) →* dynamic = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::AconCyclicCoBound<self::AconCyclicCoBound::X*, self::AconCyclicCoBound::Y*>*
     : super core::Object::•()
     ;
@@ -195,7 +195,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class AinvCyclicCoBound<X extends (self::AinvCyclicCoBound::Y*) →* self::AinvCyclicCoBound::Y* = ((core::Null?) →* dynamic) →* (core::Null?) →* dynamic, Y extends (self::AinvCyclicCoBound::Y*) →* dynamic = (core::Null?) →* dynamic> extends core::Object {
+class AinvCyclicCoBound<X extends (self::AinvCyclicCoBound::Y*) →* self::AinvCyclicCoBound::Y* = ((Null) →* dynamic) →* (Null) →* dynamic, Y extends (self::AinvCyclicCoBound::Y*) →* dynamic = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::AinvCyclicCoBound<self::AinvCyclicCoBound::X*, self::AinvCyclicCoBound::Y*>*
     : super core::Object::•()
     ;
@@ -231,69 +231,69 @@
   self::Acov<() →* dynamic, dynamic>* source1;
   <Y extends self::Acov<() →* dynamic, dynamic>* = dynamic>() →* void fsource1 = self::toF<self::Acov<() →* dynamic, dynamic>*>(source1);
   <Y extends self::Acov<() →* dynamic, dynamic>* = dynamic>() →* void target1 = fsource1;
-  self::Acon<(core::Null?) →* dynamic, dynamic>* source2;
-  <Y extends self::Acon<(core::Null?) →* dynamic, dynamic>* = dynamic>() →* void fsource2 = self::toF<self::Acon<(core::Null?) →* dynamic, dynamic>*>(source2);
-  <Y extends self::Acon<(core::Null?) →* dynamic, dynamic>* = dynamic>() →* void target2 = fsource2;
+  self::Acon<(Null) →* dynamic, dynamic>* source2;
+  <Y extends self::Acon<(Null) →* dynamic, dynamic>* = dynamic>() →* void fsource2 = self::toF<self::Acon<(Null) →* dynamic, dynamic>*>(source2);
+  <Y extends self::Acon<(Null) →* dynamic, dynamic>* = dynamic>() →* void target2 = fsource2;
   self::Ainv<(dynamic) →* dynamic, dynamic>* source3;
   <Y extends self::Ainv<(dynamic) →* dynamic, dynamic>* = dynamic>() →* void fsource3 = self::toF<self::Ainv<(dynamic) →* dynamic, dynamic>*>(source3);
   <Y extends self::Ainv<(dynamic) →* dynamic, dynamic>* = dynamic>() →* void target3 = fsource3;
   self::AcovBound<() →* core::num*, core::num*>* source4;
   <Y extends self::AcovBound<() →* core::num*, core::num*>* = dynamic>() →* void fsource4 = self::toF<self::AcovBound<() →* core::num*, core::num*>*>(source4);
   <Y extends self::AcovBound<() →* core::num*, core::num*>* = dynamic>() →* void target4 = fsource4;
-  self::AconBound<(core::Null?) →* dynamic, core::num*>* source5;
-  <Y extends self::AconBound<(core::Null?) →* dynamic, core::num*>* = dynamic>() →* void fsource5 = self::toF<self::AconBound<(core::Null?) →* dynamic, core::num*>*>(source5);
-  <Y extends self::AconBound<(core::Null?) →* dynamic, core::num*>* = dynamic>() →* void target5 = fsource5;
+  self::AconBound<(Null) →* dynamic, core::num*>* source5;
+  <Y extends self::AconBound<(Null) →* dynamic, core::num*>* = dynamic>() →* void fsource5 = self::toF<self::AconBound<(Null) →* dynamic, core::num*>*>(source5);
+  <Y extends self::AconBound<(Null) →* dynamic, core::num*>* = dynamic>() →* void target5 = fsource5;
   self::AinvBound<(core::num*) →* core::num*, core::num*>* source6;
   <Y extends self::AinvBound<(core::num*) →* core::num*, core::num*>* = dynamic>() →* void fsource6 = self::toF<self::AinvBound<(core::num*) →* core::num*, core::num*>*>(source6);
   <Y extends self::AinvBound<(core::num*) →* core::num*, core::num*>* = dynamic>() →* void target6 = fsource6;
   self::AcovCyclicBound<() →* self::A<dynamic>*, self::A<dynamic>*>* source7;
   <Y extends self::AcovCyclicBound<() →* self::A<dynamic>*, self::A<dynamic>*>* = dynamic>() →* void fsource7 = self::toF<self::AcovCyclicBound<() →* self::A<dynamic>*, self::A<dynamic>*>*>(source7);
   <Y extends self::AcovCyclicBound<() →* self::A<dynamic>*, self::A<dynamic>*>* = dynamic>() →* void target7 = fsource7;
-  self::AconCyclicBound<(core::Null?) →* dynamic, self::A<dynamic>*>* source8;
-  <Y extends self::AconCyclicBound<(core::Null?) →* dynamic, self::A<dynamic>*>* = dynamic>() →* void fsource8 = self::toF<self::AconCyclicBound<(core::Null?) →* dynamic, self::A<dynamic>*>*>(source8);
-  <Y extends self::AconCyclicBound<(core::Null?) →* dynamic, self::A<dynamic>*>* = dynamic>() →* void target8 = fsource8;
+  self::AconCyclicBound<(Null) →* dynamic, self::A<dynamic>*>* source8;
+  <Y extends self::AconCyclicBound<(Null) →* dynamic, self::A<dynamic>*>* = dynamic>() →* void fsource8 = self::toF<self::AconCyclicBound<(Null) →* dynamic, self::A<dynamic>*>*>(source8);
+  <Y extends self::AconCyclicBound<(Null) →* dynamic, self::A<dynamic>*>* = dynamic>() →* void target8 = fsource8;
   self::AinvCyclicBound<(self::A<dynamic>*) →* self::A<dynamic>*, self::A<dynamic>*>* source9;
-  self::AcovCyclicCoBound<() →* (core::Null?) →* dynamic, (core::Null?) →* dynamic>* source10;
-  <Y extends self::AcovCyclicCoBound<() →* (core::Null?) →* dynamic, (core::Null?) →* dynamic>* = dynamic>() →* void fsource10 = self::toF<self::AcovCyclicCoBound<() →* (core::Null?) →* dynamic, (core::Null?) →* dynamic>*>(source10);
-  <Y extends self::AcovCyclicCoBound<() →* (core::Null?) →* dynamic, (core::Null?) →* dynamic>* = dynamic>() →* void target10 = fsource10;
-  self::AconCyclicCoBound<(core::Null?) →* dynamic, (core::Null?) →* dynamic>* source11;
-  <Y extends self::AconCyclicCoBound<(core::Null?) →* dynamic, (core::Null?) →* dynamic>* = dynamic>() →* void fsource11 = self::toF<self::AconCyclicCoBound<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*>(source11);
-  <Y extends self::AconCyclicCoBound<(core::Null?) →* dynamic, (core::Null?) →* dynamic>* = dynamic>() →* void target11 = fsource11;
-  self::AinvCyclicCoBound<((core::Null?) →* dynamic) →* (core::Null?) →* dynamic, (core::Null?) →* dynamic>* source12;
+  self::AcovCyclicCoBound<() →* (Null) →* dynamic, (Null) →* dynamic>* source10;
+  <Y extends self::AcovCyclicCoBound<() →* (Null) →* dynamic, (Null) →* dynamic>* = dynamic>() →* void fsource10 = self::toF<self::AcovCyclicCoBound<() →* (Null) →* dynamic, (Null) →* dynamic>*>(source10);
+  <Y extends self::AcovCyclicCoBound<() →* (Null) →* dynamic, (Null) →* dynamic>* = dynamic>() →* void target10 = fsource10;
+  self::AconCyclicCoBound<(Null) →* dynamic, (Null) →* dynamic>* source11;
+  <Y extends self::AconCyclicCoBound<(Null) →* dynamic, (Null) →* dynamic>* = dynamic>() →* void fsource11 = self::toF<self::AconCyclicCoBound<(Null) →* dynamic, (Null) →* dynamic>*>(source11);
+  <Y extends self::AconCyclicCoBound<(Null) →* dynamic, (Null) →* dynamic>* = dynamic>() →* void target11 = fsource11;
+  self::AinvCyclicCoBound<((Null) →* dynamic) →* (Null) →* dynamic, (Null) →* dynamic>* source12;
 }
 static method testNested() → void {
   self::B<self::Acov<() →* dynamic, dynamic>*>* source1;
   <Y extends self::B<self::Acov<() →* dynamic, dynamic>*>* = dynamic>() →* void fsource1 = self::toF<self::B<self::Acov<() →* dynamic, dynamic>*>*>(source1);
   <Y extends self::B<self::Acov<() →* dynamic, dynamic>*>* = dynamic>() →* void target1 = fsource1;
-  self::B<self::Acon<(core::Null?) →* dynamic, dynamic>*>* source2;
-  <Y extends self::B<self::Acon<(core::Null?) →* dynamic, dynamic>*>* = dynamic>() →* void fsource2 = self::toF<self::B<self::Acon<(core::Null?) →* dynamic, dynamic>*>*>(source2);
-  <Y extends self::B<self::Acon<(core::Null?) →* dynamic, dynamic>*>* = dynamic>() →* void target2 = fsource2;
+  self::B<self::Acon<(Null) →* dynamic, dynamic>*>* source2;
+  <Y extends self::B<self::Acon<(Null) →* dynamic, dynamic>*>* = dynamic>() →* void fsource2 = self::toF<self::B<self::Acon<(Null) →* dynamic, dynamic>*>*>(source2);
+  <Y extends self::B<self::Acon<(Null) →* dynamic, dynamic>*>* = dynamic>() →* void target2 = fsource2;
   self::B<self::Ainv<(dynamic) →* dynamic, dynamic>*>* source3;
   <Y extends self::B<self::Ainv<(dynamic) →* dynamic, dynamic>*>* = dynamic>() →* void fsource3 = self::toF<self::B<self::Ainv<(dynamic) →* dynamic, dynamic>*>*>(source3);
   <Y extends self::B<self::Ainv<(dynamic) →* dynamic, dynamic>*>* = dynamic>() →* void target3 = fsource3;
   self::B<self::AcovBound<() →* core::num*, core::num*>*>* source4;
   <Y extends self::B<self::AcovBound<() →* core::num*, core::num*>*>* = dynamic>() →* void fsource4 = self::toF<self::B<self::AcovBound<() →* core::num*, core::num*>*>*>(source4);
   <Y extends self::B<self::AcovBound<() →* core::num*, core::num*>*>* = dynamic>() →* void target4 = fsource4;
-  self::B<self::AconBound<(core::Null?) →* dynamic, core::num*>*>* source5;
-  <Y extends self::B<self::AconBound<(core::Null?) →* dynamic, core::num*>*>* = dynamic>() →* void fsource5 = self::toF<self::B<self::AconBound<(core::Null?) →* dynamic, core::num*>*>*>(source5);
-  <Y extends self::B<self::AconBound<(core::Null?) →* dynamic, core::num*>*>* = dynamic>() →* void target5 = fsource5;
+  self::B<self::AconBound<(Null) →* dynamic, core::num*>*>* source5;
+  <Y extends self::B<self::AconBound<(Null) →* dynamic, core::num*>*>* = dynamic>() →* void fsource5 = self::toF<self::B<self::AconBound<(Null) →* dynamic, core::num*>*>*>(source5);
+  <Y extends self::B<self::AconBound<(Null) →* dynamic, core::num*>*>* = dynamic>() →* void target5 = fsource5;
   self::B<self::AinvBound<(core::num*) →* core::num*, core::num*>*>* source6;
   <Y extends self::B<self::AinvBound<(core::num*) →* core::num*, core::num*>*>* = dynamic>() →* void fsource6 = self::toF<self::B<self::AinvBound<(core::num*) →* core::num*, core::num*>*>*>(source6);
   <Y extends self::B<self::AinvBound<(core::num*) →* core::num*, core::num*>*>* = dynamic>() →* void target6 = fsource6;
   self::B<self::AcovCyclicBound<() →* self::A<dynamic>*, self::A<dynamic>*>*>* source7;
   <Y extends self::B<self::AcovCyclicBound<() →* self::A<dynamic>*, self::A<dynamic>*>*>* = dynamic>() →* void fsource7 = self::toF<self::B<self::AcovCyclicBound<() →* self::A<dynamic>*, self::A<dynamic>*>*>*>(source7);
   <Y extends self::B<self::AcovCyclicBound<() →* self::A<dynamic>*, self::A<dynamic>*>*>* = dynamic>() →* void target7 = fsource7;
-  self::B<self::AconCyclicBound<(core::Null?) →* dynamic, self::A<dynamic>*>*>* source8;
-  <Y extends self::B<self::AconCyclicBound<(core::Null?) →* dynamic, self::A<dynamic>*>*>* = dynamic>() →* void fsource8 = self::toF<self::B<self::AconCyclicBound<(core::Null?) →* dynamic, self::A<dynamic>*>*>*>(source8);
-  <Y extends self::B<self::AconCyclicBound<(core::Null?) →* dynamic, self::A<dynamic>*>*>* = dynamic>() →* void target8 = fsource8;
+  self::B<self::AconCyclicBound<(Null) →* dynamic, self::A<dynamic>*>*>* source8;
+  <Y extends self::B<self::AconCyclicBound<(Null) →* dynamic, self::A<dynamic>*>*>* = dynamic>() →* void fsource8 = self::toF<self::B<self::AconCyclicBound<(Null) →* dynamic, self::A<dynamic>*>*>*>(source8);
+  <Y extends self::B<self::AconCyclicBound<(Null) →* dynamic, self::A<dynamic>*>*>* = dynamic>() →* void target8 = fsource8;
   self::B<self::AinvCyclicBound<(self::A<dynamic>*) →* self::A<dynamic>*, self::A<dynamic>*>*>* source9;
-  self::B<self::AcovCyclicCoBound<() →* (core::Null?) →* dynamic, (core::Null?) →* dynamic>*>* source10;
-  <Y extends self::B<self::AcovCyclicCoBound<() →* (core::Null?) →* dynamic, (core::Null?) →* dynamic>*>* = dynamic>() →* void fsource10 = self::toF<self::B<self::AcovCyclicCoBound<() →* (core::Null?) →* dynamic, (core::Null?) →* dynamic>*>*>(source10);
-  <Y extends self::B<self::AcovCyclicCoBound<() →* (core::Null?) →* dynamic, (core::Null?) →* dynamic>*>* = dynamic>() →* void target10 = fsource10;
-  self::B<self::AconCyclicCoBound<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*>* source11;
-  <Y extends self::B<self::AconCyclicCoBound<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*>* = dynamic>() →* void fsource11 = self::toF<self::B<self::AconCyclicCoBound<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*>*>(source11);
-  <Y extends self::B<self::AconCyclicCoBound<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*>* = dynamic>() →* void target11 = fsource11;
-  self::B<self::AinvCyclicCoBound<((core::Null?) →* dynamic) →* (core::Null?) →* dynamic, (core::Null?) →* dynamic>*>* source12;
+  self::B<self::AcovCyclicCoBound<() →* (Null) →* dynamic, (Null) →* dynamic>*>* source10;
+  <Y extends self::B<self::AcovCyclicCoBound<() →* (Null) →* dynamic, (Null) →* dynamic>*>* = dynamic>() →* void fsource10 = self::toF<self::B<self::AcovCyclicCoBound<() →* (Null) →* dynamic, (Null) →* dynamic>*>*>(source10);
+  <Y extends self::B<self::AcovCyclicCoBound<() →* (Null) →* dynamic, (Null) →* dynamic>*>* = dynamic>() →* void target10 = fsource10;
+  self::B<self::AconCyclicCoBound<(Null) →* dynamic, (Null) →* dynamic>*>* source11;
+  <Y extends self::B<self::AconCyclicCoBound<(Null) →* dynamic, (Null) →* dynamic>*>* = dynamic>() →* void fsource11 = self::toF<self::B<self::AconCyclicCoBound<(Null) →* dynamic, (Null) →* dynamic>*>*>(source11);
+  <Y extends self::B<self::AconCyclicCoBound<(Null) →* dynamic, (Null) →* dynamic>*>* = dynamic>() →* void target11 = fsource11;
+  self::B<self::AinvCyclicCoBound<((Null) →* dynamic) →* (Null) →* dynamic, (Null) →* dynamic>*>* source12;
 }
 static method main() → dynamic {
   self::testTypeAliasAsTypeArgument();
diff --git a/pkg/front_end/testcases/general/nested_variance.dart.strong.transformed.expect b/pkg/front_end/testcases/general/nested_variance.dart.strong.transformed.expect
index 722c19a..e1dd3c7 100644
--- a/pkg/front_end/testcases/general/nested_variance.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/nested_variance.dart.strong.transformed.expect
@@ -10,9 +10,9 @@
 typedef FconBound<contravariant X extends core::num* = core::num*> = (X*) →* dynamic;
 typedef FinvBound<invariant X extends core::num* = core::num*> = (X*) →* X*;
 typedef FcovCyclicBound<X extends self::A<X*>* = self::A<dynamic>*> = () →* X*;
-typedef FconCyclicBound<contravariant X extends self::A<X*>* = self::A<core::Null?>*> = (X*) →* dynamic;
+typedef FconCyclicBound<contravariant X extends self::A<X*>* = self::A<Null>*> = (X*) →* dynamic;
 typedef FinvCyclicBound<invariant X extends self::A<X*>* = self::A<dynamic>*> = (X*) →* X*;
-typedef FcovCyclicCoBound<X extends (X*) →* dynamic = (core::Null?) →* dynamic> = () →* X*;
+typedef FcovCyclicCoBound<X extends (X*) →* dynamic = (Null) →* dynamic> = () →* X*;
 typedef FconCyclicCoBound<contravariant X extends (X*) →* dynamic = (dynamic) →* dynamic> = (X*) →* dynamic;
 typedef FinvCyclicCoBound<invariant X extends (X*) →* dynamic = (dynamic) →* dynamic> = (X*) →* X*;
 class Acov<X extends () →* self::Acov::Y* = () →* dynamic, Y extends core::Object* = dynamic> extends core::Object {
@@ -30,7 +30,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Acon<X extends (self::Acon::Y*) →* dynamic = (core::Null?) →* dynamic, Y extends core::Object* = dynamic> extends core::Object {
+class Acon<X extends (self::Acon::Y*) →* dynamic = (Null) →* dynamic, Y extends core::Object* = dynamic> extends core::Object {
   synthetic constructor •() → self::Acon<self::Acon::X*, self::Acon::Y*>*
     : super core::Object::•()
     ;
@@ -75,7 +75,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class AconBound<X extends (self::AconBound::Y*) →* dynamic = (core::Null?) →* dynamic, Y extends core::num* = core::num*> extends core::Object {
+class AconBound<X extends (self::AconBound::Y*) →* dynamic = (Null) →* dynamic, Y extends core::num* = core::num*> extends core::Object {
   synthetic constructor •() → self::AconBound<self::AconBound::X*, self::AconBound::Y*>*
     : super core::Object::•()
     ;
@@ -135,7 +135,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class AconCyclicBound<X extends (self::AconCyclicBound::Y*) →* dynamic = (core::Null?) →* dynamic, Y extends self::A<self::AconCyclicBound::Y*>* = self::A<dynamic>*> extends core::Object {
+class AconCyclicBound<X extends (self::AconCyclicBound::Y*) →* dynamic = (Null) →* dynamic, Y extends self::A<self::AconCyclicBound::Y*>* = self::A<dynamic>*> extends core::Object {
   synthetic constructor •() → self::AconCyclicBound<self::AconCyclicBound::X*, self::AconCyclicBound::Y*>*
     : super core::Object::•()
     ;
@@ -165,7 +165,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class AcovCyclicCoBound<X extends () →* self::AcovCyclicCoBound::Y* = () →* (core::Null?) →* dynamic, Y extends (self::AcovCyclicCoBound::Y*) →* dynamic = (core::Null?) →* dynamic> extends core::Object {
+class AcovCyclicCoBound<X extends () →* self::AcovCyclicCoBound::Y* = () →* (Null) →* dynamic, Y extends (self::AcovCyclicCoBound::Y*) →* dynamic = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::AcovCyclicCoBound<self::AcovCyclicCoBound::X*, self::AcovCyclicCoBound::Y*>*
     : super core::Object::•()
     ;
@@ -180,7 +180,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class AconCyclicCoBound<X extends (self::AconCyclicCoBound::Y*) →* dynamic = (core::Null?) →* dynamic, Y extends (self::AconCyclicCoBound::Y*) →* dynamic = (core::Null?) →* dynamic> extends core::Object {
+class AconCyclicCoBound<X extends (self::AconCyclicCoBound::Y*) →* dynamic = (Null) →* dynamic, Y extends (self::AconCyclicCoBound::Y*) →* dynamic = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::AconCyclicCoBound<self::AconCyclicCoBound::X*, self::AconCyclicCoBound::Y*>*
     : super core::Object::•()
     ;
@@ -195,7 +195,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class AinvCyclicCoBound<X extends (self::AinvCyclicCoBound::Y*) →* self::AinvCyclicCoBound::Y* = ((core::Null?) →* dynamic) →* (core::Null?) →* dynamic, Y extends (self::AinvCyclicCoBound::Y*) →* dynamic = (core::Null?) →* dynamic> extends core::Object {
+class AinvCyclicCoBound<X extends (self::AinvCyclicCoBound::Y*) →* self::AinvCyclicCoBound::Y* = ((Null) →* dynamic) →* (Null) →* dynamic, Y extends (self::AinvCyclicCoBound::Y*) →* dynamic = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::AinvCyclicCoBound<self::AinvCyclicCoBound::X*, self::AinvCyclicCoBound::Y*>*
     : super core::Object::•()
     ;
@@ -231,69 +231,69 @@
   self::Acov<() →* dynamic, dynamic>* source1;
   <Y extends self::Acov<() →* dynamic, dynamic>* = dynamic>() →* void fsource1 = self::toF<self::Acov<() →* dynamic, dynamic>*>(source1);
   <Y extends self::Acov<() →* dynamic, dynamic>* = dynamic>() →* void target1 = fsource1;
-  self::Acon<(core::Null?) →* dynamic, dynamic>* source2;
-  <Y extends self::Acon<(core::Null?) →* dynamic, dynamic>* = dynamic>() →* void fsource2 = self::toF<self::Acon<(core::Null?) →* dynamic, dynamic>*>(source2);
-  <Y extends self::Acon<(core::Null?) →* dynamic, dynamic>* = dynamic>() →* void target2 = fsource2;
+  self::Acon<(Null) →* dynamic, dynamic>* source2;
+  <Y extends self::Acon<(Null) →* dynamic, dynamic>* = dynamic>() →* void fsource2 = self::toF<self::Acon<(Null) →* dynamic, dynamic>*>(source2);
+  <Y extends self::Acon<(Null) →* dynamic, dynamic>* = dynamic>() →* void target2 = fsource2;
   self::Ainv<(dynamic) →* dynamic, dynamic>* source3;
   <Y extends self::Ainv<(dynamic) →* dynamic, dynamic>* = dynamic>() →* void fsource3 = self::toF<self::Ainv<(dynamic) →* dynamic, dynamic>*>(source3);
   <Y extends self::Ainv<(dynamic) →* dynamic, dynamic>* = dynamic>() →* void target3 = fsource3;
   self::AcovBound<() →* core::num*, core::num*>* source4;
   <Y extends self::AcovBound<() →* core::num*, core::num*>* = dynamic>() →* void fsource4 = self::toF<self::AcovBound<() →* core::num*, core::num*>*>(source4);
   <Y extends self::AcovBound<() →* core::num*, core::num*>* = dynamic>() →* void target4 = fsource4;
-  self::AconBound<(core::Null?) →* dynamic, core::num*>* source5;
-  <Y extends self::AconBound<(core::Null?) →* dynamic, core::num*>* = dynamic>() →* void fsource5 = self::toF<self::AconBound<(core::Null?) →* dynamic, core::num*>*>(source5);
-  <Y extends self::AconBound<(core::Null?) →* dynamic, core::num*>* = dynamic>() →* void target5 = fsource5;
+  self::AconBound<(Null) →* dynamic, core::num*>* source5;
+  <Y extends self::AconBound<(Null) →* dynamic, core::num*>* = dynamic>() →* void fsource5 = self::toF<self::AconBound<(Null) →* dynamic, core::num*>*>(source5);
+  <Y extends self::AconBound<(Null) →* dynamic, core::num*>* = dynamic>() →* void target5 = fsource5;
   self::AinvBound<(core::num*) →* core::num*, core::num*>* source6;
   <Y extends self::AinvBound<(core::num*) →* core::num*, core::num*>* = dynamic>() →* void fsource6 = self::toF<self::AinvBound<(core::num*) →* core::num*, core::num*>*>(source6);
   <Y extends self::AinvBound<(core::num*) →* core::num*, core::num*>* = dynamic>() →* void target6 = fsource6;
   self::AcovCyclicBound<() →* self::A<dynamic>*, self::A<dynamic>*>* source7;
   <Y extends self::AcovCyclicBound<() →* self::A<dynamic>*, self::A<dynamic>*>* = dynamic>() →* void fsource7 = self::toF<self::AcovCyclicBound<() →* self::A<dynamic>*, self::A<dynamic>*>*>(source7);
   <Y extends self::AcovCyclicBound<() →* self::A<dynamic>*, self::A<dynamic>*>* = dynamic>() →* void target7 = fsource7;
-  self::AconCyclicBound<(core::Null?) →* dynamic, self::A<dynamic>*>* source8;
-  <Y extends self::AconCyclicBound<(core::Null?) →* dynamic, self::A<dynamic>*>* = dynamic>() →* void fsource8 = self::toF<self::AconCyclicBound<(core::Null?) →* dynamic, self::A<dynamic>*>*>(source8);
-  <Y extends self::AconCyclicBound<(core::Null?) →* dynamic, self::A<dynamic>*>* = dynamic>() →* void target8 = fsource8;
+  self::AconCyclicBound<(Null) →* dynamic, self::A<dynamic>*>* source8;
+  <Y extends self::AconCyclicBound<(Null) →* dynamic, self::A<dynamic>*>* = dynamic>() →* void fsource8 = self::toF<self::AconCyclicBound<(Null) →* dynamic, self::A<dynamic>*>*>(source8);
+  <Y extends self::AconCyclicBound<(Null) →* dynamic, self::A<dynamic>*>* = dynamic>() →* void target8 = fsource8;
   self::AinvCyclicBound<(self::A<dynamic>*) →* self::A<dynamic>*, self::A<dynamic>*>* source9;
-  self::AcovCyclicCoBound<() →* (core::Null?) →* dynamic, (core::Null?) →* dynamic>* source10;
-  <Y extends self::AcovCyclicCoBound<() →* (core::Null?) →* dynamic, (core::Null?) →* dynamic>* = dynamic>() →* void fsource10 = self::toF<self::AcovCyclicCoBound<() →* (core::Null?) →* dynamic, (core::Null?) →* dynamic>*>(source10);
-  <Y extends self::AcovCyclicCoBound<() →* (core::Null?) →* dynamic, (core::Null?) →* dynamic>* = dynamic>() →* void target10 = fsource10;
-  self::AconCyclicCoBound<(core::Null?) →* dynamic, (core::Null?) →* dynamic>* source11;
-  <Y extends self::AconCyclicCoBound<(core::Null?) →* dynamic, (core::Null?) →* dynamic>* = dynamic>() →* void fsource11 = self::toF<self::AconCyclicCoBound<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*>(source11);
-  <Y extends self::AconCyclicCoBound<(core::Null?) →* dynamic, (core::Null?) →* dynamic>* = dynamic>() →* void target11 = fsource11;
-  self::AinvCyclicCoBound<((core::Null?) →* dynamic) →* (core::Null?) →* dynamic, (core::Null?) →* dynamic>* source12;
+  self::AcovCyclicCoBound<() →* (Null) →* dynamic, (Null) →* dynamic>* source10;
+  <Y extends self::AcovCyclicCoBound<() →* (Null) →* dynamic, (Null) →* dynamic>* = dynamic>() →* void fsource10 = self::toF<self::AcovCyclicCoBound<() →* (Null) →* dynamic, (Null) →* dynamic>*>(source10);
+  <Y extends self::AcovCyclicCoBound<() →* (Null) →* dynamic, (Null) →* dynamic>* = dynamic>() →* void target10 = fsource10;
+  self::AconCyclicCoBound<(Null) →* dynamic, (Null) →* dynamic>* source11;
+  <Y extends self::AconCyclicCoBound<(Null) →* dynamic, (Null) →* dynamic>* = dynamic>() →* void fsource11 = self::toF<self::AconCyclicCoBound<(Null) →* dynamic, (Null) →* dynamic>*>(source11);
+  <Y extends self::AconCyclicCoBound<(Null) →* dynamic, (Null) →* dynamic>* = dynamic>() →* void target11 = fsource11;
+  self::AinvCyclicCoBound<((Null) →* dynamic) →* (Null) →* dynamic, (Null) →* dynamic>* source12;
 }
 static method testNested() → void {
   self::B<self::Acov<() →* dynamic, dynamic>*>* source1;
   <Y extends self::B<self::Acov<() →* dynamic, dynamic>*>* = dynamic>() →* void fsource1 = self::toF<self::B<self::Acov<() →* dynamic, dynamic>*>*>(source1);
   <Y extends self::B<self::Acov<() →* dynamic, dynamic>*>* = dynamic>() →* void target1 = fsource1;
-  self::B<self::Acon<(core::Null?) →* dynamic, dynamic>*>* source2;
-  <Y extends self::B<self::Acon<(core::Null?) →* dynamic, dynamic>*>* = dynamic>() →* void fsource2 = self::toF<self::B<self::Acon<(core::Null?) →* dynamic, dynamic>*>*>(source2);
-  <Y extends self::B<self::Acon<(core::Null?) →* dynamic, dynamic>*>* = dynamic>() →* void target2 = fsource2;
+  self::B<self::Acon<(Null) →* dynamic, dynamic>*>* source2;
+  <Y extends self::B<self::Acon<(Null) →* dynamic, dynamic>*>* = dynamic>() →* void fsource2 = self::toF<self::B<self::Acon<(Null) →* dynamic, dynamic>*>*>(source2);
+  <Y extends self::B<self::Acon<(Null) →* dynamic, dynamic>*>* = dynamic>() →* void target2 = fsource2;
   self::B<self::Ainv<(dynamic) →* dynamic, dynamic>*>* source3;
   <Y extends self::B<self::Ainv<(dynamic) →* dynamic, dynamic>*>* = dynamic>() →* void fsource3 = self::toF<self::B<self::Ainv<(dynamic) →* dynamic, dynamic>*>*>(source3);
   <Y extends self::B<self::Ainv<(dynamic) →* dynamic, dynamic>*>* = dynamic>() →* void target3 = fsource3;
   self::B<self::AcovBound<() →* core::num*, core::num*>*>* source4;
   <Y extends self::B<self::AcovBound<() →* core::num*, core::num*>*>* = dynamic>() →* void fsource4 = self::toF<self::B<self::AcovBound<() →* core::num*, core::num*>*>*>(source4);
   <Y extends self::B<self::AcovBound<() →* core::num*, core::num*>*>* = dynamic>() →* void target4 = fsource4;
-  self::B<self::AconBound<(core::Null?) →* dynamic, core::num*>*>* source5;
-  <Y extends self::B<self::AconBound<(core::Null?) →* dynamic, core::num*>*>* = dynamic>() →* void fsource5 = self::toF<self::B<self::AconBound<(core::Null?) →* dynamic, core::num*>*>*>(source5);
-  <Y extends self::B<self::AconBound<(core::Null?) →* dynamic, core::num*>*>* = dynamic>() →* void target5 = fsource5;
+  self::B<self::AconBound<(Null) →* dynamic, core::num*>*>* source5;
+  <Y extends self::B<self::AconBound<(Null) →* dynamic, core::num*>*>* = dynamic>() →* void fsource5 = self::toF<self::B<self::AconBound<(Null) →* dynamic, core::num*>*>*>(source5);
+  <Y extends self::B<self::AconBound<(Null) →* dynamic, core::num*>*>* = dynamic>() →* void target5 = fsource5;
   self::B<self::AinvBound<(core::num*) →* core::num*, core::num*>*>* source6;
   <Y extends self::B<self::AinvBound<(core::num*) →* core::num*, core::num*>*>* = dynamic>() →* void fsource6 = self::toF<self::B<self::AinvBound<(core::num*) →* core::num*, core::num*>*>*>(source6);
   <Y extends self::B<self::AinvBound<(core::num*) →* core::num*, core::num*>*>* = dynamic>() →* void target6 = fsource6;
   self::B<self::AcovCyclicBound<() →* self::A<dynamic>*, self::A<dynamic>*>*>* source7;
   <Y extends self::B<self::AcovCyclicBound<() →* self::A<dynamic>*, self::A<dynamic>*>*>* = dynamic>() →* void fsource7 = self::toF<self::B<self::AcovCyclicBound<() →* self::A<dynamic>*, self::A<dynamic>*>*>*>(source7);
   <Y extends self::B<self::AcovCyclicBound<() →* self::A<dynamic>*, self::A<dynamic>*>*>* = dynamic>() →* void target7 = fsource7;
-  self::B<self::AconCyclicBound<(core::Null?) →* dynamic, self::A<dynamic>*>*>* source8;
-  <Y extends self::B<self::AconCyclicBound<(core::Null?) →* dynamic, self::A<dynamic>*>*>* = dynamic>() →* void fsource8 = self::toF<self::B<self::AconCyclicBound<(core::Null?) →* dynamic, self::A<dynamic>*>*>*>(source8);
-  <Y extends self::B<self::AconCyclicBound<(core::Null?) →* dynamic, self::A<dynamic>*>*>* = dynamic>() →* void target8 = fsource8;
+  self::B<self::AconCyclicBound<(Null) →* dynamic, self::A<dynamic>*>*>* source8;
+  <Y extends self::B<self::AconCyclicBound<(Null) →* dynamic, self::A<dynamic>*>*>* = dynamic>() →* void fsource8 = self::toF<self::B<self::AconCyclicBound<(Null) →* dynamic, self::A<dynamic>*>*>*>(source8);
+  <Y extends self::B<self::AconCyclicBound<(Null) →* dynamic, self::A<dynamic>*>*>* = dynamic>() →* void target8 = fsource8;
   self::B<self::AinvCyclicBound<(self::A<dynamic>*) →* self::A<dynamic>*, self::A<dynamic>*>*>* source9;
-  self::B<self::AcovCyclicCoBound<() →* (core::Null?) →* dynamic, (core::Null?) →* dynamic>*>* source10;
-  <Y extends self::B<self::AcovCyclicCoBound<() →* (core::Null?) →* dynamic, (core::Null?) →* dynamic>*>* = dynamic>() →* void fsource10 = self::toF<self::B<self::AcovCyclicCoBound<() →* (core::Null?) →* dynamic, (core::Null?) →* dynamic>*>*>(source10);
-  <Y extends self::B<self::AcovCyclicCoBound<() →* (core::Null?) →* dynamic, (core::Null?) →* dynamic>*>* = dynamic>() →* void target10 = fsource10;
-  self::B<self::AconCyclicCoBound<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*>* source11;
-  <Y extends self::B<self::AconCyclicCoBound<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*>* = dynamic>() →* void fsource11 = self::toF<self::B<self::AconCyclicCoBound<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*>*>(source11);
-  <Y extends self::B<self::AconCyclicCoBound<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*>* = dynamic>() →* void target11 = fsource11;
-  self::B<self::AinvCyclicCoBound<((core::Null?) →* dynamic) →* (core::Null?) →* dynamic, (core::Null?) →* dynamic>*>* source12;
+  self::B<self::AcovCyclicCoBound<() →* (Null) →* dynamic, (Null) →* dynamic>*>* source10;
+  <Y extends self::B<self::AcovCyclicCoBound<() →* (Null) →* dynamic, (Null) →* dynamic>*>* = dynamic>() →* void fsource10 = self::toF<self::B<self::AcovCyclicCoBound<() →* (Null) →* dynamic, (Null) →* dynamic>*>*>(source10);
+  <Y extends self::B<self::AcovCyclicCoBound<() →* (Null) →* dynamic, (Null) →* dynamic>*>* = dynamic>() →* void target10 = fsource10;
+  self::B<self::AconCyclicCoBound<(Null) →* dynamic, (Null) →* dynamic>*>* source11;
+  <Y extends self::B<self::AconCyclicCoBound<(Null) →* dynamic, (Null) →* dynamic>*>* = dynamic>() →* void fsource11 = self::toF<self::B<self::AconCyclicCoBound<(Null) →* dynamic, (Null) →* dynamic>*>*>(source11);
+  <Y extends self::B<self::AconCyclicCoBound<(Null) →* dynamic, (Null) →* dynamic>*>* = dynamic>() →* void target11 = fsource11;
+  self::B<self::AinvCyclicCoBound<((Null) →* dynamic) →* (Null) →* dynamic, (Null) →* dynamic>*>* source12;
 }
 static method main() → dynamic {
   self::testTypeAliasAsTypeArgument();
diff --git a/pkg/front_end/testcases/general/no_such_method_forwarder.dart.strong.transformed.expect b/pkg/front_end/testcases/general/no_such_method_forwarder.dart.strong.transformed.expect
index e981ad6..bb66d2f 100644
--- a/pkg/front_end/testcases/general/no_such_method_forwarder.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/no_such_method_forwarder.dart.strong.transformed.expect
@@ -9,7 +9,8 @@
     : super core::Object::•()
     ;
   method _foo() → void /* originally async */ {
-    final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    final asy::_Future<dynamic>* :async_future = new asy::_Future::•<dynamic>();
+    core::bool* :is_sync = false;
     FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -22,20 +23,21 @@
         #L1:
         {
           [yield] let dynamic #t1 = asy::_awaitHelper(null, :async_op_then, :async_op_error, :async_op) in null;
-          _in::unsafeCast<core::Null?>(:result);
+          _in::unsafeCast<Null>(:result);
           core::print("hello");
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   }
   method foo() → void
     return this.{self::X::_foo}();
diff --git a/pkg/front_end/testcases/general/non_covariant_checks.dart.strong.expect b/pkg/front_end/testcases/general/non_covariant_checks.dart.strong.expect
index 039d5b6..39064e3 100644
--- a/pkg/front_end/testcases/general/non_covariant_checks.dart.strong.expect
+++ b/pkg/front_end/testcases/general/non_covariant_checks.dart.strong.expect
@@ -19,7 +19,7 @@
   generic-covariant-impl field <S extends self::C::T* = dynamic>(S*) →* S* field14;
   generic-covariant-impl field (<S extends self::C::T* = dynamic>() →* S*) →* void field15;
   constructor •(self::C::T* field1) → self::C<self::C::T*>*
-    : self::C::field1 = field1, self::C::field2 = () → self::C::T* => field1, self::C::field3 = (self::C::T* t) → core::Null? {}, self::C::field4 = (self::C::T* t) → self::C::T* => t, self::C::field5 = () → () →* self::C::T* => () → self::C::T* => field1, self::C::field6 = (() →* self::C::T* f) → core::Null? {}, self::C::field7 = (() →* self::C::T* f) → self::C::T* => field1, self::C::field8 = ((self::C::T*) →* void f) → core::Null? {}, self::C::field9 = ((self::C::T*) →* void f) → self::C::T* => field1, self::C::field10 = ((self::C::T*) →* self::C::T* f) → core::Null? {}, self::C::field11 = ((self::C::T*) →* self::C::T* f) → self::C::T* => field1, self::C::field12 = <S extends self::C::T* = self::C::T*>() → core::Null? => null, self::C::field13 = <S extends self::C::T* = self::C::T*>(S* s) → core::Null? {}, self::C::field14 = <S extends self::C::T* = self::C::T*>(S* s) → S* => s, self::C::field15 = (<S extends self::C::T* = self::C::T*>() →* S* f) → core::Null? {}, super core::Object::•()
+    : self::C::field1 = field1, self::C::field2 = () → self::C::T* => field1, self::C::field3 = (self::C::T* t) → Null {}, self::C::field4 = (self::C::T* t) → self::C::T* => t, self::C::field5 = () → () →* self::C::T* => () → self::C::T* => field1, self::C::field6 = (() →* self::C::T* f) → Null {}, self::C::field7 = (() →* self::C::T* f) → self::C::T* => field1, self::C::field8 = ((self::C::T*) →* void f) → Null {}, self::C::field9 = ((self::C::T*) →* void f) → self::C::T* => field1, self::C::field10 = ((self::C::T*) →* self::C::T* f) → Null {}, self::C::field11 = ((self::C::T*) →* self::C::T* f) → self::C::T* => field1, self::C::field12 = <S extends self::C::T* = self::C::T*>() → Null => null, self::C::field13 = <S extends self::C::T* = self::C::T*>(S* s) → Null {}, self::C::field14 = <S extends self::C::T* = self::C::T*>(S* s) → S* => s, self::C::field15 = (<S extends self::C::T* = self::C::T*>() →* S* f) → Null {}, super core::Object::•()
     ;
   get getter1() → self::C::T*
     return this.{self::C::field1};
@@ -318,7 +318,7 @@
   on core::TypeError* catch(final core::TypeError* e) {
     core::print(e);
   }
-  c.{self::C::setter3} = (core::num* n) → core::Null? {};
+  c.{self::C::setter3} = (core::num* n) → Null {};
   try {
     c.{self::C::setter4} = (core::num* n) → core::double* => 0.5;
     throw "TypeError expected";
@@ -333,7 +333,7 @@
   on core::TypeError* catch(final core::TypeError* e) {
     core::print(e);
   }
-  c.{self::C::setter6} = (() →* core::num* f) → core::Null? {};
+  c.{self::C::setter6} = (() →* core::num* f) → Null {};
   try {
     c.{self::C::setter7} = (() →* core::num* f) → core::double* => 0.5;
     throw "TypeError expected";
@@ -342,7 +342,7 @@
     core::print(e);
   }
   try {
-    c.{self::C::setter8} = ((core::double*) →* void f) → core::Null? {};
+    c.{self::C::setter8} = ((core::double*) →* void f) → Null {};
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
@@ -356,7 +356,7 @@
     core::print(e);
   }
   try {
-    c.{self::C::setter10} = ((core::double*) →* core::num* f) → core::Null? {};
+    c.{self::C::setter10} = ((core::double*) →* core::num* f) → Null {};
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
@@ -370,14 +370,14 @@
     core::print(e);
   }
   try {
-    c.{self::C::setter12} = <S extends core::num* = core::num*>() → core::Null? => null;
+    c.{self::C::setter12} = <S extends core::num* = core::num*>() → Null => null;
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
     core::print(e);
   }
   try {
-    c.{self::C::setter13} = <S extends core::num* = core::num*>(S* s) → core::Null? {};
+    c.{self::C::setter13} = <S extends core::num* = core::num*>(S* s) → Null {};
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
@@ -391,7 +391,7 @@
     core::print(e);
   }
   try {
-    c.{self::C::setter15} = (<S extends core::num* = core::num*>() →* S* f) → core::Null? {};
+    c.{self::C::setter15} = (<S extends core::num* = core::num*>() →* S* f) → Null {};
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
@@ -411,7 +411,7 @@
   on core::TypeError* catch(final core::TypeError* e) {
     core::print(e);
   }
-  c.{self::C::method3}((core::num* n) → core::Null? {});
+  c.{self::C::method3}((core::num* n) → Null {});
   try {
     c.{self::C::method4}((core::num* n) → core::double* => 0.5);
     throw "TypeError expected";
@@ -426,7 +426,7 @@
   on core::TypeError* catch(final core::TypeError* e) {
     core::print(e);
   }
-  c.{self::C::method6}((() →* core::num* f) → core::Null? {});
+  c.{self::C::method6}((() →* core::num* f) → Null {});
   try {
     c.{self::C::method7}((() →* core::num* f) → core::double* => 0.5);
     throw "TypeError expected";
@@ -435,7 +435,7 @@
     core::print(e);
   }
   try {
-    c.{self::C::method8}(((core::double*) →* void f) → core::Null? {});
+    c.{self::C::method8}(((core::double*) →* void f) → Null {});
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
@@ -449,7 +449,7 @@
     core::print(e);
   }
   try {
-    c.{self::C::method10}(((core::double*) →* core::num* f) → core::Null? {});
+    c.{self::C::method10}(((core::double*) →* core::num* f) → Null {});
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
@@ -463,14 +463,14 @@
     core::print(e);
   }
   try {
-    c.{self::C::method12}(<S extends core::num* = core::num*>() → core::Null? => null);
+    c.{self::C::method12}(<S extends core::num* = core::num*>() → Null => null);
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
     core::print(e);
   }
   try {
-    c.{self::C::method13}(<S extends core::num* = core::num*>(S* s) → core::Null? {});
+    c.{self::C::method13}(<S extends core::num* = core::num*>(S* s) → Null {});
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
@@ -484,7 +484,7 @@
     core::print(e);
   }
   try {
-    c.{self::C::method15}((<S extends core::num* = core::num*>() →* S* f) → core::Null? {});
+    c.{self::C::method15}((<S extends core::num* = core::num*>() →* S* f) → Null {});
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
diff --git a/pkg/front_end/testcases/general/non_covariant_checks.dart.strong.transformed.expect b/pkg/front_end/testcases/general/non_covariant_checks.dart.strong.transformed.expect
index 039d5b6..39064e3 100644
--- a/pkg/front_end/testcases/general/non_covariant_checks.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/non_covariant_checks.dart.strong.transformed.expect
@@ -19,7 +19,7 @@
   generic-covariant-impl field <S extends self::C::T* = dynamic>(S*) →* S* field14;
   generic-covariant-impl field (<S extends self::C::T* = dynamic>() →* S*) →* void field15;
   constructor •(self::C::T* field1) → self::C<self::C::T*>*
-    : self::C::field1 = field1, self::C::field2 = () → self::C::T* => field1, self::C::field3 = (self::C::T* t) → core::Null? {}, self::C::field4 = (self::C::T* t) → self::C::T* => t, self::C::field5 = () → () →* self::C::T* => () → self::C::T* => field1, self::C::field6 = (() →* self::C::T* f) → core::Null? {}, self::C::field7 = (() →* self::C::T* f) → self::C::T* => field1, self::C::field8 = ((self::C::T*) →* void f) → core::Null? {}, self::C::field9 = ((self::C::T*) →* void f) → self::C::T* => field1, self::C::field10 = ((self::C::T*) →* self::C::T* f) → core::Null? {}, self::C::field11 = ((self::C::T*) →* self::C::T* f) → self::C::T* => field1, self::C::field12 = <S extends self::C::T* = self::C::T*>() → core::Null? => null, self::C::field13 = <S extends self::C::T* = self::C::T*>(S* s) → core::Null? {}, self::C::field14 = <S extends self::C::T* = self::C::T*>(S* s) → S* => s, self::C::field15 = (<S extends self::C::T* = self::C::T*>() →* S* f) → core::Null? {}, super core::Object::•()
+    : self::C::field1 = field1, self::C::field2 = () → self::C::T* => field1, self::C::field3 = (self::C::T* t) → Null {}, self::C::field4 = (self::C::T* t) → self::C::T* => t, self::C::field5 = () → () →* self::C::T* => () → self::C::T* => field1, self::C::field6 = (() →* self::C::T* f) → Null {}, self::C::field7 = (() →* self::C::T* f) → self::C::T* => field1, self::C::field8 = ((self::C::T*) →* void f) → Null {}, self::C::field9 = ((self::C::T*) →* void f) → self::C::T* => field1, self::C::field10 = ((self::C::T*) →* self::C::T* f) → Null {}, self::C::field11 = ((self::C::T*) →* self::C::T* f) → self::C::T* => field1, self::C::field12 = <S extends self::C::T* = self::C::T*>() → Null => null, self::C::field13 = <S extends self::C::T* = self::C::T*>(S* s) → Null {}, self::C::field14 = <S extends self::C::T* = self::C::T*>(S* s) → S* => s, self::C::field15 = (<S extends self::C::T* = self::C::T*>() →* S* f) → Null {}, super core::Object::•()
     ;
   get getter1() → self::C::T*
     return this.{self::C::field1};
@@ -318,7 +318,7 @@
   on core::TypeError* catch(final core::TypeError* e) {
     core::print(e);
   }
-  c.{self::C::setter3} = (core::num* n) → core::Null? {};
+  c.{self::C::setter3} = (core::num* n) → Null {};
   try {
     c.{self::C::setter4} = (core::num* n) → core::double* => 0.5;
     throw "TypeError expected";
@@ -333,7 +333,7 @@
   on core::TypeError* catch(final core::TypeError* e) {
     core::print(e);
   }
-  c.{self::C::setter6} = (() →* core::num* f) → core::Null? {};
+  c.{self::C::setter6} = (() →* core::num* f) → Null {};
   try {
     c.{self::C::setter7} = (() →* core::num* f) → core::double* => 0.5;
     throw "TypeError expected";
@@ -342,7 +342,7 @@
     core::print(e);
   }
   try {
-    c.{self::C::setter8} = ((core::double*) →* void f) → core::Null? {};
+    c.{self::C::setter8} = ((core::double*) →* void f) → Null {};
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
@@ -356,7 +356,7 @@
     core::print(e);
   }
   try {
-    c.{self::C::setter10} = ((core::double*) →* core::num* f) → core::Null? {};
+    c.{self::C::setter10} = ((core::double*) →* core::num* f) → Null {};
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
@@ -370,14 +370,14 @@
     core::print(e);
   }
   try {
-    c.{self::C::setter12} = <S extends core::num* = core::num*>() → core::Null? => null;
+    c.{self::C::setter12} = <S extends core::num* = core::num*>() → Null => null;
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
     core::print(e);
   }
   try {
-    c.{self::C::setter13} = <S extends core::num* = core::num*>(S* s) → core::Null? {};
+    c.{self::C::setter13} = <S extends core::num* = core::num*>(S* s) → Null {};
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
@@ -391,7 +391,7 @@
     core::print(e);
   }
   try {
-    c.{self::C::setter15} = (<S extends core::num* = core::num*>() →* S* f) → core::Null? {};
+    c.{self::C::setter15} = (<S extends core::num* = core::num*>() →* S* f) → Null {};
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
@@ -411,7 +411,7 @@
   on core::TypeError* catch(final core::TypeError* e) {
     core::print(e);
   }
-  c.{self::C::method3}((core::num* n) → core::Null? {});
+  c.{self::C::method3}((core::num* n) → Null {});
   try {
     c.{self::C::method4}((core::num* n) → core::double* => 0.5);
     throw "TypeError expected";
@@ -426,7 +426,7 @@
   on core::TypeError* catch(final core::TypeError* e) {
     core::print(e);
   }
-  c.{self::C::method6}((() →* core::num* f) → core::Null? {});
+  c.{self::C::method6}((() →* core::num* f) → Null {});
   try {
     c.{self::C::method7}((() →* core::num* f) → core::double* => 0.5);
     throw "TypeError expected";
@@ -435,7 +435,7 @@
     core::print(e);
   }
   try {
-    c.{self::C::method8}(((core::double*) →* void f) → core::Null? {});
+    c.{self::C::method8}(((core::double*) →* void f) → Null {});
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
@@ -449,7 +449,7 @@
     core::print(e);
   }
   try {
-    c.{self::C::method10}(((core::double*) →* core::num* f) → core::Null? {});
+    c.{self::C::method10}(((core::double*) →* core::num* f) → Null {});
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
@@ -463,14 +463,14 @@
     core::print(e);
   }
   try {
-    c.{self::C::method12}(<S extends core::num* = core::num*>() → core::Null? => null);
+    c.{self::C::method12}(<S extends core::num* = core::num*>() → Null => null);
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
     core::print(e);
   }
   try {
-    c.{self::C::method13}(<S extends core::num* = core::num*>(S* s) → core::Null? {});
+    c.{self::C::method13}(<S extends core::num* = core::num*>(S* s) → Null {});
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
@@ -484,7 +484,7 @@
     core::print(e);
   }
   try {
-    c.{self::C::method15}((<S extends core::num* = core::num*>() →* S* f) → core::Null? {});
+    c.{self::C::method15}((<S extends core::num* = core::num*>() →* S* f) → Null {});
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
diff --git a/pkg/front_end/testcases/general/nsm_covariance.dart b/pkg/front_end/testcases/general/nsm_covariance.dart
new file mode 100644
index 0000000..3ee3063
--- /dev/null
+++ b/pkg/front_end/testcases/general/nsm_covariance.dart
@@ -0,0 +1,21 @@
+// Copyright (c) 2020, 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 'nsm_covariance_lib.dart';
+
+abstract class D1 implements A<int>, B {}
+
+abstract class D2 implements B, A<int> {}
+
+class D3 implements A<int>, B {
+  @override
+  noSuchMethod(Invocation invocation) => null;
+}
+
+class D4 implements B, A<int> {
+  @override
+  noSuchMethod(Invocation invocation) => null;
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/nsm_covariance.dart.outline.expect b/pkg/front_end/testcases/general/nsm_covariance.dart.outline.expect
new file mode 100644
index 0000000..b434cfe
--- /dev/null
+++ b/pkg/front_end/testcases/general/nsm_covariance.dart.outline.expect
@@ -0,0 +1,298 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "nsm_covariance_lib.dart" as nsm;
+
+import "org-dartlang-testcase:///nsm_covariance_lib.dart";
+
+abstract class D1 extends core::Object implements nsm::A<core::int*>, nsm::B {
+  synthetic constructor •() → self::D1*
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  abstract forwarding-stub method _method1(core::int* a, covariant core::int* b, generic-covariant-impl core::int* c, covariant generic-covariant-impl core::int* d) → void;
+  abstract forwarding-stub method _method2({core::int* a, covariant core::int* b, generic-covariant-impl core::int* c, covariant generic-covariant-impl core::int* d}) → void;
+  abstract forwarding-stub method _method3(covariant core::int* a, generic-covariant-impl core::int* b) → void;
+  abstract forwarding-stub method _method4({covariant core::int* a, generic-covariant-impl core::int* b}) → void;
+}
+abstract class D2 extends core::Object implements nsm::B, nsm::A<core::int*> {
+  synthetic constructor •() → self::D2*
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  abstract forwarding-stub method _method1(core::int* x, covariant core::int* y, generic-covariant-impl core::int* z, covariant generic-covariant-impl core::int* w) → void;
+  abstract forwarding-stub method _method2({core::int* a, covariant core::int* b, generic-covariant-impl core::int* c, covariant generic-covariant-impl core::int* d}) → void;
+  abstract forwarding-stub method _method3(covariant core::int* x, generic-covariant-impl core::int* y) → void;
+  abstract forwarding-stub method _method4({covariant core::int* a, generic-covariant-impl core::int* b}) → void;
+}
+class D3 extends core::Object implements nsm::A<core::int*>, nsm::B {
+  synthetic constructor •() → self::D3*
+    ;
+  @core::override
+  method noSuchMethod(core::Invocation* invocation) → dynamic
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  no-such-method-forwarder method _method1(core::int* a, covariant core::int* b, generic-covariant-impl core::int* c, covariant generic-covariant-impl core::int* d) → void
+    return this.{self::D3::noSuchMethod}(new core::_InvocationMirror::_withType(#_method1, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[a, b, c, d]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
+  no-such-method-forwarder method _method2({core::int* a, covariant core::int* b, generic-covariant-impl core::int* c, covariant generic-covariant-impl core::int* d}) → void
+    return this.{self::D3::noSuchMethod}(new core::_InvocationMirror::_withType(#_method2, 0, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#a: a, #b: b, #c: c, #d: d})));
+  no-such-method-forwarder method _method3(covariant core::int* a, generic-covariant-impl core::int* b) → void
+    return this.{self::D3::noSuchMethod}(new core::_InvocationMirror::_withType(#_method3, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[a, b]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
+  no-such-method-forwarder method _method4({covariant core::int* a, generic-covariant-impl core::int* b}) → void
+    return this.{self::D3::noSuchMethod}(new core::_InvocationMirror::_withType(#_method4, 0, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#a: a, #b: b})));
+}
+class D4 extends core::Object implements nsm::B, nsm::A<core::int*> {
+  synthetic constructor •() → self::D4*
+    ;
+  @core::override
+  method noSuchMethod(core::Invocation* invocation) → dynamic
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  no-such-method-forwarder method _method1(core::int* x, covariant core::int* y, generic-covariant-impl core::int* z, covariant generic-covariant-impl core::int* w) → void
+    return this.{self::D4::noSuchMethod}(new core::_InvocationMirror::_withType(#_method1, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[x, y, z, w]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
+  no-such-method-forwarder method _method2({core::int* a, covariant core::int* b, generic-covariant-impl core::int* c, covariant generic-covariant-impl core::int* d}) → void
+    return this.{self::D4::noSuchMethod}(new core::_InvocationMirror::_withType(#_method2, 0, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#a: a, #b: b, #c: c, #d: d})));
+  no-such-method-forwarder method _method3(covariant core::int* x, generic-covariant-impl core::int* y) → void
+    return this.{self::D4::noSuchMethod}(new core::_InvocationMirror::_withType(#_method3, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[x, y]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
+  no-such-method-forwarder method _method4({covariant core::int* a, generic-covariant-impl core::int* b}) → void
+    return this.{self::D4::noSuchMethod}(new core::_InvocationMirror::_withType(#_method4, 0, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#a: a, #b: b})));
+}
+static method main() → dynamic
+  ;
+
+library;
+import self as nsm;
+import "dart:core" as core;
+
+abstract class A<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → nsm::A<nsm::A::T*>*
+    ;
+  abstract method _method1(core::int* a, core::int* b, generic-covariant-impl nsm::A::T* c, generic-covariant-impl nsm::A::T* d) → void;
+  abstract method _method2({core::int* a, core::int* b, generic-covariant-impl nsm::A::T* c, generic-covariant-impl nsm::A::T* d}) → void;
+  abstract method _method3(core::int* a, generic-covariant-impl nsm::A::T* b) → void;
+  abstract method _method4({core::int* a, generic-covariant-impl nsm::A::T* b}) → void;
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class B extends core::Object {
+  synthetic constructor •() → nsm::B*
+    ;
+  abstract method _method1(core::int* x, covariant core::int* y, core::int* z, covariant core::int* w) → void;
+  abstract method _method2({core::int* a, covariant core::int* b, core::int* c, covariant core::int* d}) → void;
+  abstract method _method3(covariant core::int* x, core::int* y) → void;
+  abstract method _method4({covariant core::int* a, core::int* b}) → void;
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class C1 extends core::Object implements nsm::A<core::int*>, nsm::B {
+  synthetic constructor •() → nsm::C1*
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  abstract forwarding-stub method _method1(core::int* a, covariant core::int* b, generic-covariant-impl core::int* c, covariant generic-covariant-impl core::int* d) → void;
+  abstract forwarding-stub method _method2({core::int* a, covariant core::int* b, generic-covariant-impl core::int* c, covariant generic-covariant-impl core::int* d}) → void;
+  abstract forwarding-stub method _method3(covariant core::int* a, generic-covariant-impl core::int* b) → void;
+  abstract forwarding-stub method _method4({covariant core::int* a, generic-covariant-impl core::int* b}) → void;
+}
+abstract class C2 extends core::Object implements nsm::B, nsm::A<core::int*> {
+  synthetic constructor •() → nsm::C2*
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  abstract forwarding-stub method _method1(core::int* x, covariant core::int* y, generic-covariant-impl core::int* z, covariant generic-covariant-impl core::int* w) → void;
+  abstract forwarding-stub method _method2({core::int* a, covariant core::int* b, generic-covariant-impl core::int* c, covariant generic-covariant-impl core::int* d}) → void;
+  abstract forwarding-stub method _method3(covariant core::int* x, generic-covariant-impl core::int* y) → void;
+  abstract forwarding-stub method _method4({covariant core::int* a, generic-covariant-impl core::int* b}) → void;
+}
+class C3 extends core::Object implements nsm::A<core::int*>, nsm::B {
+  synthetic constructor •() → nsm::C3*
+    ;
+  @core::override
+  method noSuchMethod(core::Invocation* invocation) → dynamic
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  no-such-method-forwarder method _method1(core::int* a, covariant core::int* b, generic-covariant-impl core::int* c, covariant generic-covariant-impl core::int* d) → void
+    return this.{nsm::C3::noSuchMethod}(new core::_InvocationMirror::_withType(#_method1, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[a, b, c, d]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
+  no-such-method-forwarder method _method2({core::int* a, covariant core::int* b, generic-covariant-impl core::int* c, covariant generic-covariant-impl core::int* d}) → void
+    return this.{nsm::C3::noSuchMethod}(new core::_InvocationMirror::_withType(#_method2, 0, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#a: a, #b: b, #c: c, #d: d})));
+  no-such-method-forwarder method _method3(covariant core::int* a, generic-covariant-impl core::int* b) → void
+    return this.{nsm::C3::noSuchMethod}(new core::_InvocationMirror::_withType(#_method3, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[a, b]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
+  no-such-method-forwarder method _method4({covariant core::int* a, generic-covariant-impl core::int* b}) → void
+    return this.{nsm::C3::noSuchMethod}(new core::_InvocationMirror::_withType(#_method4, 0, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#a: a, #b: b})));
+}
+class C4 extends core::Object implements nsm::B, nsm::A<core::int*> {
+  synthetic constructor •() → nsm::C4*
+    ;
+  @core::override
+  method noSuchMethod(core::Invocation* invocation) → dynamic
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  no-such-method-forwarder method _method1(core::int* x, covariant core::int* y, generic-covariant-impl core::int* z, covariant generic-covariant-impl core::int* w) → void
+    return this.{nsm::C4::noSuchMethod}(new core::_InvocationMirror::_withType(#_method1, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[x, y, z, w]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
+  no-such-method-forwarder method _method2({core::int* a, covariant core::int* b, generic-covariant-impl core::int* c, covariant generic-covariant-impl core::int* d}) → void
+    return this.{nsm::C4::noSuchMethod}(new core::_InvocationMirror::_withType(#_method2, 0, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#a: a, #b: b, #c: c, #d: d})));
+  no-such-method-forwarder method _method3(covariant core::int* x, generic-covariant-impl core::int* y) → void
+    return this.{nsm::C4::noSuchMethod}(new core::_InvocationMirror::_withType(#_method3, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[x, y]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
+  no-such-method-forwarder method _method4({covariant core::int* a, generic-covariant-impl core::int* b}) → void
+    return this.{nsm::C4::noSuchMethod}(new core::_InvocationMirror::_withType(#_method4, 0, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#a: a, #b: b})));
+}
+
+
+Extra constant evaluation status:
+Evaluated: StaticGet @ org-dartlang-testcase:///nsm_covariance.dart:12:4 -> InstanceConstant(const _Override{})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///nsm_covariance.dart:11:7 -> SymbolConstant(#_method1)
+Evaluated: ListLiteral @ org-dartlang-testcase:///nsm_covariance.dart:11:7 -> ListConstant(const <Type*>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///nsm_covariance.dart:11:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///nsm_covariance.dart:11:7 -> SymbolConstant(#_method2)
+Evaluated: ListLiteral @ org-dartlang-testcase:///nsm_covariance.dart:11:7 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///nsm_covariance.dart:11:7 -> ListConstant(const <dynamic>[])
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///nsm_covariance.dart:11:7 -> SymbolConstant(#a)
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///nsm_covariance.dart:11:7 -> SymbolConstant(#b)
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///nsm_covariance.dart:11:7 -> SymbolConstant(#c)
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///nsm_covariance.dart:11:7 -> SymbolConstant(#d)
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///nsm_covariance.dart:11:7 -> SymbolConstant(#_method3)
+Evaluated: ListLiteral @ org-dartlang-testcase:///nsm_covariance.dart:11:7 -> ListConstant(const <Type*>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///nsm_covariance.dart:11:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///nsm_covariance.dart:11:7 -> SymbolConstant(#_method4)
+Evaluated: ListLiteral @ org-dartlang-testcase:///nsm_covariance.dart:11:7 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///nsm_covariance.dart:11:7 -> ListConstant(const <dynamic>[])
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///nsm_covariance.dart:11:7 -> SymbolConstant(#a)
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///nsm_covariance.dart:11:7 -> SymbolConstant(#b)
+Evaluated: StaticGet @ org-dartlang-testcase:///nsm_covariance.dart:17:4 -> InstanceConstant(const _Override{})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///nsm_covariance.dart:16:7 -> SymbolConstant(#_method1)
+Evaluated: ListLiteral @ org-dartlang-testcase:///nsm_covariance.dart:16:7 -> ListConstant(const <Type*>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///nsm_covariance.dart:16:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///nsm_covariance.dart:16:7 -> SymbolConstant(#_method2)
+Evaluated: ListLiteral @ org-dartlang-testcase:///nsm_covariance.dart:16:7 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///nsm_covariance.dart:16:7 -> ListConstant(const <dynamic>[])
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///nsm_covariance.dart:16:7 -> SymbolConstant(#a)
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///nsm_covariance.dart:16:7 -> SymbolConstant(#b)
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///nsm_covariance.dart:16:7 -> SymbolConstant(#c)
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///nsm_covariance.dart:16:7 -> SymbolConstant(#d)
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///nsm_covariance.dart:16:7 -> SymbolConstant(#_method3)
+Evaluated: ListLiteral @ org-dartlang-testcase:///nsm_covariance.dart:16:7 -> ListConstant(const <Type*>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///nsm_covariance.dart:16:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///nsm_covariance.dart:16:7 -> SymbolConstant(#_method4)
+Evaluated: ListLiteral @ org-dartlang-testcase:///nsm_covariance.dart:16:7 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///nsm_covariance.dart:16:7 -> ListConstant(const <dynamic>[])
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///nsm_covariance.dart:16:7 -> SymbolConstant(#a)
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///nsm_covariance.dart:16:7 -> SymbolConstant(#b)
+Evaluated: StaticGet @ org-dartlang-testcase:///nsm_covariance_lib.dart:24:4 -> InstanceConstant(const _Override{})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///nsm_covariance_lib.dart:23:7 -> SymbolConstant(#_method1)
+Evaluated: ListLiteral @ org-dartlang-testcase:///nsm_covariance_lib.dart:23:7 -> ListConstant(const <Type*>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///nsm_covariance_lib.dart:23:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///nsm_covariance_lib.dart:23:7 -> SymbolConstant(#_method2)
+Evaluated: ListLiteral @ org-dartlang-testcase:///nsm_covariance_lib.dart:23:7 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///nsm_covariance_lib.dart:23:7 -> ListConstant(const <dynamic>[])
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///nsm_covariance_lib.dart:23:7 -> SymbolConstant(#a)
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///nsm_covariance_lib.dart:23:7 -> SymbolConstant(#b)
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///nsm_covariance_lib.dart:23:7 -> SymbolConstant(#c)
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///nsm_covariance_lib.dart:23:7 -> SymbolConstant(#d)
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///nsm_covariance_lib.dart:23:7 -> SymbolConstant(#_method3)
+Evaluated: ListLiteral @ org-dartlang-testcase:///nsm_covariance_lib.dart:23:7 -> ListConstant(const <Type*>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///nsm_covariance_lib.dart:23:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///nsm_covariance_lib.dart:23:7 -> SymbolConstant(#_method4)
+Evaluated: ListLiteral @ org-dartlang-testcase:///nsm_covariance_lib.dart:23:7 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///nsm_covariance_lib.dart:23:7 -> ListConstant(const <dynamic>[])
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///nsm_covariance_lib.dart:23:7 -> SymbolConstant(#a)
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///nsm_covariance_lib.dart:23:7 -> SymbolConstant(#b)
+Evaluated: StaticGet @ org-dartlang-testcase:///nsm_covariance_lib.dart:29:4 -> InstanceConstant(const _Override{})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///nsm_covariance_lib.dart:28:7 -> SymbolConstant(#_method1)
+Evaluated: ListLiteral @ org-dartlang-testcase:///nsm_covariance_lib.dart:28:7 -> ListConstant(const <Type*>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///nsm_covariance_lib.dart:28:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///nsm_covariance_lib.dart:28:7 -> SymbolConstant(#_method2)
+Evaluated: ListLiteral @ org-dartlang-testcase:///nsm_covariance_lib.dart:28:7 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///nsm_covariance_lib.dart:28:7 -> ListConstant(const <dynamic>[])
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///nsm_covariance_lib.dart:28:7 -> SymbolConstant(#a)
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///nsm_covariance_lib.dart:28:7 -> SymbolConstant(#b)
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///nsm_covariance_lib.dart:28:7 -> SymbolConstant(#c)
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///nsm_covariance_lib.dart:28:7 -> SymbolConstant(#d)
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///nsm_covariance_lib.dart:28:7 -> SymbolConstant(#_method3)
+Evaluated: ListLiteral @ org-dartlang-testcase:///nsm_covariance_lib.dart:28:7 -> ListConstant(const <Type*>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///nsm_covariance_lib.dart:28:7 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///nsm_covariance_lib.dart:28:7 -> SymbolConstant(#_method4)
+Evaluated: ListLiteral @ org-dartlang-testcase:///nsm_covariance_lib.dart:28:7 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///nsm_covariance_lib.dart:28:7 -> ListConstant(const <dynamic>[])
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///nsm_covariance_lib.dart:28:7 -> SymbolConstant(#a)
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///nsm_covariance_lib.dart:28:7 -> SymbolConstant(#b)
+Extra constant evaluation: evaluated: 212, effectively constant: 76
diff --git a/pkg/front_end/testcases/general/nsm_covariance.dart.strong.expect b/pkg/front_end/testcases/general/nsm_covariance.dart.strong.expect
new file mode 100644
index 0000000..ee2b26a
--- /dev/null
+++ b/pkg/front_end/testcases/general/nsm_covariance.dart.strong.expect
@@ -0,0 +1,247 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "nsm_covariance_lib.dart" as nsm;
+
+import "org-dartlang-testcase:///nsm_covariance_lib.dart";
+
+abstract class D1 extends core::Object implements nsm::A<core::int*>, nsm::B {
+  synthetic constructor •() → self::D1*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  abstract forwarding-stub method _method1(core::int* a, covariant core::int* b, generic-covariant-impl core::int* c, covariant generic-covariant-impl core::int* d) → void;
+  abstract forwarding-stub method _method2({core::int* a = #C1, covariant core::int* b = #C1, generic-covariant-impl core::int* c = #C1, covariant generic-covariant-impl core::int* d = #C1}) → void;
+  abstract forwarding-stub method _method3(covariant core::int* a, generic-covariant-impl core::int* b) → void;
+  abstract forwarding-stub method _method4({covariant core::int* a = #C1, generic-covariant-impl core::int* b = #C1}) → void;
+}
+abstract class D2 extends core::Object implements nsm::B, nsm::A<core::int*> {
+  synthetic constructor •() → self::D2*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  abstract forwarding-stub method _method1(core::int* x, covariant core::int* y, generic-covariant-impl core::int* z, covariant generic-covariant-impl core::int* w) → void;
+  abstract forwarding-stub method _method2({core::int* a = #C1, covariant core::int* b = #C1, generic-covariant-impl core::int* c = #C1, covariant generic-covariant-impl core::int* d = #C1}) → void;
+  abstract forwarding-stub method _method3(covariant core::int* x, generic-covariant-impl core::int* y) → void;
+  abstract forwarding-stub method _method4({covariant core::int* a = #C1, generic-covariant-impl core::int* b = #C1}) → void;
+}
+class D3 extends core::Object implements nsm::A<core::int*>, nsm::B {
+  synthetic constructor •() → self::D3*
+    : super core::Object::•()
+    ;
+  @#C2
+  method noSuchMethod(core::Invocation* invocation) → dynamic
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  no-such-method-forwarder method _method1(core::int* a, covariant core::int* b, generic-covariant-impl core::int* c, covariant generic-covariant-impl core::int* d) → void
+    return this.{self::D3::noSuchMethod}(new core::_InvocationMirror::_withType(#C3, 0, #C4, core::List::unmodifiable<dynamic>(<dynamic>[a, b, c, d]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6)));
+  no-such-method-forwarder method _method2({core::int* a = #C1, covariant core::int* b = #C1, generic-covariant-impl core::int* c = #C1, covariant generic-covariant-impl core::int* d = #C1}) → void
+    return this.{self::D3::noSuchMethod}(new core::_InvocationMirror::_withType(#C7, 0, #C4, #C5, core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C8: a, #C9: b, #C10: c, #C11: d})));
+  no-such-method-forwarder method _method3(covariant core::int* a, generic-covariant-impl core::int* b) → void
+    return this.{self::D3::noSuchMethod}(new core::_InvocationMirror::_withType(#C12, 0, #C4, core::List::unmodifiable<dynamic>(<dynamic>[a, b]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6)));
+  no-such-method-forwarder method _method4({covariant core::int* a = #C1, generic-covariant-impl core::int* b = #C1}) → void
+    return this.{self::D3::noSuchMethod}(new core::_InvocationMirror::_withType(#C13, 0, #C4, #C5, core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C8: a, #C9: b})));
+}
+class D4 extends core::Object implements nsm::B, nsm::A<core::int*> {
+  synthetic constructor •() → self::D4*
+    : super core::Object::•()
+    ;
+  @#C2
+  method noSuchMethod(core::Invocation* invocation) → dynamic
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  no-such-method-forwarder method _method1(core::int* x, covariant core::int* y, generic-covariant-impl core::int* z, covariant generic-covariant-impl core::int* w) → void
+    return this.{self::D4::noSuchMethod}(new core::_InvocationMirror::_withType(#C3, 0, #C4, core::List::unmodifiable<dynamic>(<dynamic>[x, y, z, w]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6)));
+  no-such-method-forwarder method _method2({core::int* a = #C1, covariant core::int* b = #C1, generic-covariant-impl core::int* c = #C1, covariant generic-covariant-impl core::int* d = #C1}) → void
+    return this.{self::D4::noSuchMethod}(new core::_InvocationMirror::_withType(#C7, 0, #C4, #C5, core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C8: a, #C9: b, #C10: c, #C11: d})));
+  no-such-method-forwarder method _method3(covariant core::int* x, generic-covariant-impl core::int* y) → void
+    return this.{self::D4::noSuchMethod}(new core::_InvocationMirror::_withType(#C12, 0, #C4, core::List::unmodifiable<dynamic>(<dynamic>[x, y]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6)));
+  no-such-method-forwarder method _method4({covariant core::int* a = #C1, generic-covariant-impl core::int* b = #C1}) → void
+    return this.{self::D4::noSuchMethod}(new core::_InvocationMirror::_withType(#C13, 0, #C4, #C5, core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C8: a, #C9: b})));
+}
+static method main() → dynamic {}
+
+library;
+import self as nsm;
+import "dart:core" as core;
+
+abstract class A<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → nsm::A<nsm::A::T*>*
+    : super core::Object::•()
+    ;
+  abstract method _method1(core::int* a, core::int* b, generic-covariant-impl nsm::A::T* c, generic-covariant-impl nsm::A::T* d) → void;
+  abstract method _method2({core::int* a = #C1, core::int* b = #C1, generic-covariant-impl nsm::A::T* c = #C1, generic-covariant-impl nsm::A::T* d = #C1}) → void;
+  abstract method _method3(core::int* a, generic-covariant-impl nsm::A::T* b) → void;
+  abstract method _method4({core::int* a = #C1, generic-covariant-impl nsm::A::T* b = #C1}) → void;
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class B extends core::Object {
+  synthetic constructor •() → nsm::B*
+    : super core::Object::•()
+    ;
+  abstract method _method1(core::int* x, covariant core::int* y, core::int* z, covariant core::int* w) → void;
+  abstract method _method2({core::int* a = #C1, covariant core::int* b = #C1, core::int* c = #C1, covariant core::int* d = #C1}) → void;
+  abstract method _method3(covariant core::int* x, core::int* y) → void;
+  abstract method _method4({covariant core::int* a = #C1, core::int* b = #C1}) → void;
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class C1 extends core::Object implements nsm::A<core::int*>, nsm::B {
+  synthetic constructor •() → nsm::C1*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  abstract forwarding-stub method _method1(core::int* a, covariant core::int* b, generic-covariant-impl core::int* c, covariant generic-covariant-impl core::int* d) → void;
+  abstract forwarding-stub method _method2({core::int* a = #C1, covariant core::int* b = #C1, generic-covariant-impl core::int* c = #C1, covariant generic-covariant-impl core::int* d = #C1}) → void;
+  abstract forwarding-stub method _method3(covariant core::int* a, generic-covariant-impl core::int* b) → void;
+  abstract forwarding-stub method _method4({covariant core::int* a = #C1, generic-covariant-impl core::int* b = #C1}) → void;
+}
+abstract class C2 extends core::Object implements nsm::B, nsm::A<core::int*> {
+  synthetic constructor •() → nsm::C2*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  abstract forwarding-stub method _method1(core::int* x, covariant core::int* y, generic-covariant-impl core::int* z, covariant generic-covariant-impl core::int* w) → void;
+  abstract forwarding-stub method _method2({core::int* a = #C1, covariant core::int* b = #C1, generic-covariant-impl core::int* c = #C1, covariant generic-covariant-impl core::int* d = #C1}) → void;
+  abstract forwarding-stub method _method3(covariant core::int* x, generic-covariant-impl core::int* y) → void;
+  abstract forwarding-stub method _method4({covariant core::int* a = #C1, generic-covariant-impl core::int* b = #C1}) → void;
+}
+class C3 extends core::Object implements nsm::A<core::int*>, nsm::B {
+  synthetic constructor •() → nsm::C3*
+    : super core::Object::•()
+    ;
+  @#C2
+  method noSuchMethod(core::Invocation* invocation) → dynamic
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  no-such-method-forwarder method _method1(core::int* a, covariant core::int* b, generic-covariant-impl core::int* c, covariant generic-covariant-impl core::int* d) → void
+    return this.{nsm::C3::noSuchMethod}(new core::_InvocationMirror::_withType(#C14, 0, #C4, core::List::unmodifiable<dynamic>(<dynamic>[a, b, c, d]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6)));
+  no-such-method-forwarder method _method2({core::int* a = #C1, covariant core::int* b = #C1, generic-covariant-impl core::int* c = #C1, covariant generic-covariant-impl core::int* d = #C1}) → void
+    return this.{nsm::C3::noSuchMethod}(new core::_InvocationMirror::_withType(#C15, 0, #C4, #C5, core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C8: a, #C9: b, #C10: c, #C11: d})));
+  no-such-method-forwarder method _method3(covariant core::int* a, generic-covariant-impl core::int* b) → void
+    return this.{nsm::C3::noSuchMethod}(new core::_InvocationMirror::_withType(#C16, 0, #C4, core::List::unmodifiable<dynamic>(<dynamic>[a, b]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6)));
+  no-such-method-forwarder method _method4({covariant core::int* a = #C1, generic-covariant-impl core::int* b = #C1}) → void
+    return this.{nsm::C3::noSuchMethod}(new core::_InvocationMirror::_withType(#C17, 0, #C4, #C5, core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C8: a, #C9: b})));
+}
+class C4 extends core::Object implements nsm::B, nsm::A<core::int*> {
+  synthetic constructor •() → nsm::C4*
+    : super core::Object::•()
+    ;
+  @#C2
+  method noSuchMethod(core::Invocation* invocation) → dynamic
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  no-such-method-forwarder method _method1(core::int* x, covariant core::int* y, generic-covariant-impl core::int* z, covariant generic-covariant-impl core::int* w) → void
+    return this.{nsm::C4::noSuchMethod}(new core::_InvocationMirror::_withType(#C14, 0, #C4, core::List::unmodifiable<dynamic>(<dynamic>[x, y, z, w]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6)));
+  no-such-method-forwarder method _method2({core::int* a = #C1, covariant core::int* b = #C1, generic-covariant-impl core::int* c = #C1, covariant generic-covariant-impl core::int* d = #C1}) → void
+    return this.{nsm::C4::noSuchMethod}(new core::_InvocationMirror::_withType(#C15, 0, #C4, #C5, core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C8: a, #C9: b, #C10: c, #C11: d})));
+  no-such-method-forwarder method _method3(covariant core::int* x, generic-covariant-impl core::int* y) → void
+    return this.{nsm::C4::noSuchMethod}(new core::_InvocationMirror::_withType(#C16, 0, #C4, core::List::unmodifiable<dynamic>(<dynamic>[x, y]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6)));
+  no-such-method-forwarder method _method4({covariant core::int* a = #C1, generic-covariant-impl core::int* b = #C1}) → void
+    return this.{nsm::C4::noSuchMethod}(new core::_InvocationMirror::_withType(#C17, 0, #C4, #C5, core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C8: a, #C9: b})));
+}
+
+constants  {
+  #C1 = null
+  #C2 = core::_Override {}
+  #C3 = #org-dartlang-testcase:///nsm_covariance.dart::_method1
+  #C4 = <core::Type*>[]
+  #C5 = <dynamic>[]
+  #C6 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C5}
+  #C7 = #org-dartlang-testcase:///nsm_covariance.dart::_method2
+  #C8 = #a
+  #C9 = #b
+  #C10 = #c
+  #C11 = #d
+  #C12 = #org-dartlang-testcase:///nsm_covariance.dart::_method3
+  #C13 = #org-dartlang-testcase:///nsm_covariance.dart::_method4
+  #C14 = #org-dartlang-testcase:///nsm_covariance_lib.dart::_method1
+  #C15 = #org-dartlang-testcase:///nsm_covariance_lib.dart::_method2
+  #C16 = #org-dartlang-testcase:///nsm_covariance_lib.dart::_method3
+  #C17 = #org-dartlang-testcase:///nsm_covariance_lib.dart::_method4
+}
diff --git a/pkg/front_end/testcases/general/nsm_covariance.dart.strong.transformed.expect b/pkg/front_end/testcases/general/nsm_covariance.dart.strong.transformed.expect
new file mode 100644
index 0000000..ee2b26a
--- /dev/null
+++ b/pkg/front_end/testcases/general/nsm_covariance.dart.strong.transformed.expect
@@ -0,0 +1,247 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "nsm_covariance_lib.dart" as nsm;
+
+import "org-dartlang-testcase:///nsm_covariance_lib.dart";
+
+abstract class D1 extends core::Object implements nsm::A<core::int*>, nsm::B {
+  synthetic constructor •() → self::D1*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  abstract forwarding-stub method _method1(core::int* a, covariant core::int* b, generic-covariant-impl core::int* c, covariant generic-covariant-impl core::int* d) → void;
+  abstract forwarding-stub method _method2({core::int* a = #C1, covariant core::int* b = #C1, generic-covariant-impl core::int* c = #C1, covariant generic-covariant-impl core::int* d = #C1}) → void;
+  abstract forwarding-stub method _method3(covariant core::int* a, generic-covariant-impl core::int* b) → void;
+  abstract forwarding-stub method _method4({covariant core::int* a = #C1, generic-covariant-impl core::int* b = #C1}) → void;
+}
+abstract class D2 extends core::Object implements nsm::B, nsm::A<core::int*> {
+  synthetic constructor •() → self::D2*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  abstract forwarding-stub method _method1(core::int* x, covariant core::int* y, generic-covariant-impl core::int* z, covariant generic-covariant-impl core::int* w) → void;
+  abstract forwarding-stub method _method2({core::int* a = #C1, covariant core::int* b = #C1, generic-covariant-impl core::int* c = #C1, covariant generic-covariant-impl core::int* d = #C1}) → void;
+  abstract forwarding-stub method _method3(covariant core::int* x, generic-covariant-impl core::int* y) → void;
+  abstract forwarding-stub method _method4({covariant core::int* a = #C1, generic-covariant-impl core::int* b = #C1}) → void;
+}
+class D3 extends core::Object implements nsm::A<core::int*>, nsm::B {
+  synthetic constructor •() → self::D3*
+    : super core::Object::•()
+    ;
+  @#C2
+  method noSuchMethod(core::Invocation* invocation) → dynamic
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  no-such-method-forwarder method _method1(core::int* a, covariant core::int* b, generic-covariant-impl core::int* c, covariant generic-covariant-impl core::int* d) → void
+    return this.{self::D3::noSuchMethod}(new core::_InvocationMirror::_withType(#C3, 0, #C4, core::List::unmodifiable<dynamic>(<dynamic>[a, b, c, d]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6)));
+  no-such-method-forwarder method _method2({core::int* a = #C1, covariant core::int* b = #C1, generic-covariant-impl core::int* c = #C1, covariant generic-covariant-impl core::int* d = #C1}) → void
+    return this.{self::D3::noSuchMethod}(new core::_InvocationMirror::_withType(#C7, 0, #C4, #C5, core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C8: a, #C9: b, #C10: c, #C11: d})));
+  no-such-method-forwarder method _method3(covariant core::int* a, generic-covariant-impl core::int* b) → void
+    return this.{self::D3::noSuchMethod}(new core::_InvocationMirror::_withType(#C12, 0, #C4, core::List::unmodifiable<dynamic>(<dynamic>[a, b]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6)));
+  no-such-method-forwarder method _method4({covariant core::int* a = #C1, generic-covariant-impl core::int* b = #C1}) → void
+    return this.{self::D3::noSuchMethod}(new core::_InvocationMirror::_withType(#C13, 0, #C4, #C5, core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C8: a, #C9: b})));
+}
+class D4 extends core::Object implements nsm::B, nsm::A<core::int*> {
+  synthetic constructor •() → self::D4*
+    : super core::Object::•()
+    ;
+  @#C2
+  method noSuchMethod(core::Invocation* invocation) → dynamic
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  no-such-method-forwarder method _method1(core::int* x, covariant core::int* y, generic-covariant-impl core::int* z, covariant generic-covariant-impl core::int* w) → void
+    return this.{self::D4::noSuchMethod}(new core::_InvocationMirror::_withType(#C3, 0, #C4, core::List::unmodifiable<dynamic>(<dynamic>[x, y, z, w]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6)));
+  no-such-method-forwarder method _method2({core::int* a = #C1, covariant core::int* b = #C1, generic-covariant-impl core::int* c = #C1, covariant generic-covariant-impl core::int* d = #C1}) → void
+    return this.{self::D4::noSuchMethod}(new core::_InvocationMirror::_withType(#C7, 0, #C4, #C5, core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C8: a, #C9: b, #C10: c, #C11: d})));
+  no-such-method-forwarder method _method3(covariant core::int* x, generic-covariant-impl core::int* y) → void
+    return this.{self::D4::noSuchMethod}(new core::_InvocationMirror::_withType(#C12, 0, #C4, core::List::unmodifiable<dynamic>(<dynamic>[x, y]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6)));
+  no-such-method-forwarder method _method4({covariant core::int* a = #C1, generic-covariant-impl core::int* b = #C1}) → void
+    return this.{self::D4::noSuchMethod}(new core::_InvocationMirror::_withType(#C13, 0, #C4, #C5, core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C8: a, #C9: b})));
+}
+static method main() → dynamic {}
+
+library;
+import self as nsm;
+import "dart:core" as core;
+
+abstract class A<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → nsm::A<nsm::A::T*>*
+    : super core::Object::•()
+    ;
+  abstract method _method1(core::int* a, core::int* b, generic-covariant-impl nsm::A::T* c, generic-covariant-impl nsm::A::T* d) → void;
+  abstract method _method2({core::int* a = #C1, core::int* b = #C1, generic-covariant-impl nsm::A::T* c = #C1, generic-covariant-impl nsm::A::T* d = #C1}) → void;
+  abstract method _method3(core::int* a, generic-covariant-impl nsm::A::T* b) → void;
+  abstract method _method4({core::int* a = #C1, generic-covariant-impl nsm::A::T* b = #C1}) → void;
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class B extends core::Object {
+  synthetic constructor •() → nsm::B*
+    : super core::Object::•()
+    ;
+  abstract method _method1(core::int* x, covariant core::int* y, core::int* z, covariant core::int* w) → void;
+  abstract method _method2({core::int* a = #C1, covariant core::int* b = #C1, core::int* c = #C1, covariant core::int* d = #C1}) → void;
+  abstract method _method3(covariant core::int* x, core::int* y) → void;
+  abstract method _method4({covariant core::int* a = #C1, core::int* b = #C1}) → void;
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class C1 extends core::Object implements nsm::A<core::int*>, nsm::B {
+  synthetic constructor •() → nsm::C1*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  abstract forwarding-stub method _method1(core::int* a, covariant core::int* b, generic-covariant-impl core::int* c, covariant generic-covariant-impl core::int* d) → void;
+  abstract forwarding-stub method _method2({core::int* a = #C1, covariant core::int* b = #C1, generic-covariant-impl core::int* c = #C1, covariant generic-covariant-impl core::int* d = #C1}) → void;
+  abstract forwarding-stub method _method3(covariant core::int* a, generic-covariant-impl core::int* b) → void;
+  abstract forwarding-stub method _method4({covariant core::int* a = #C1, generic-covariant-impl core::int* b = #C1}) → void;
+}
+abstract class C2 extends core::Object implements nsm::B, nsm::A<core::int*> {
+  synthetic constructor •() → nsm::C2*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  abstract forwarding-stub method _method1(core::int* x, covariant core::int* y, generic-covariant-impl core::int* z, covariant generic-covariant-impl core::int* w) → void;
+  abstract forwarding-stub method _method2({core::int* a = #C1, covariant core::int* b = #C1, generic-covariant-impl core::int* c = #C1, covariant generic-covariant-impl core::int* d = #C1}) → void;
+  abstract forwarding-stub method _method3(covariant core::int* x, generic-covariant-impl core::int* y) → void;
+  abstract forwarding-stub method _method4({covariant core::int* a = #C1, generic-covariant-impl core::int* b = #C1}) → void;
+}
+class C3 extends core::Object implements nsm::A<core::int*>, nsm::B {
+  synthetic constructor •() → nsm::C3*
+    : super core::Object::•()
+    ;
+  @#C2
+  method noSuchMethod(core::Invocation* invocation) → dynamic
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  no-such-method-forwarder method _method1(core::int* a, covariant core::int* b, generic-covariant-impl core::int* c, covariant generic-covariant-impl core::int* d) → void
+    return this.{nsm::C3::noSuchMethod}(new core::_InvocationMirror::_withType(#C14, 0, #C4, core::List::unmodifiable<dynamic>(<dynamic>[a, b, c, d]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6)));
+  no-such-method-forwarder method _method2({core::int* a = #C1, covariant core::int* b = #C1, generic-covariant-impl core::int* c = #C1, covariant generic-covariant-impl core::int* d = #C1}) → void
+    return this.{nsm::C3::noSuchMethod}(new core::_InvocationMirror::_withType(#C15, 0, #C4, #C5, core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C8: a, #C9: b, #C10: c, #C11: d})));
+  no-such-method-forwarder method _method3(covariant core::int* a, generic-covariant-impl core::int* b) → void
+    return this.{nsm::C3::noSuchMethod}(new core::_InvocationMirror::_withType(#C16, 0, #C4, core::List::unmodifiable<dynamic>(<dynamic>[a, b]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6)));
+  no-such-method-forwarder method _method4({covariant core::int* a = #C1, generic-covariant-impl core::int* b = #C1}) → void
+    return this.{nsm::C3::noSuchMethod}(new core::_InvocationMirror::_withType(#C17, 0, #C4, #C5, core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C8: a, #C9: b})));
+}
+class C4 extends core::Object implements nsm::B, nsm::A<core::int*> {
+  synthetic constructor •() → nsm::C4*
+    : super core::Object::•()
+    ;
+  @#C2
+  method noSuchMethod(core::Invocation* invocation) → dynamic
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  no-such-method-forwarder method _method1(core::int* x, covariant core::int* y, generic-covariant-impl core::int* z, covariant generic-covariant-impl core::int* w) → void
+    return this.{nsm::C4::noSuchMethod}(new core::_InvocationMirror::_withType(#C14, 0, #C4, core::List::unmodifiable<dynamic>(<dynamic>[x, y, z, w]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6)));
+  no-such-method-forwarder method _method2({core::int* a = #C1, covariant core::int* b = #C1, generic-covariant-impl core::int* c = #C1, covariant generic-covariant-impl core::int* d = #C1}) → void
+    return this.{nsm::C4::noSuchMethod}(new core::_InvocationMirror::_withType(#C15, 0, #C4, #C5, core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C8: a, #C9: b, #C10: c, #C11: d})));
+  no-such-method-forwarder method _method3(covariant core::int* x, generic-covariant-impl core::int* y) → void
+    return this.{nsm::C4::noSuchMethod}(new core::_InvocationMirror::_withType(#C16, 0, #C4, core::List::unmodifiable<dynamic>(<dynamic>[x, y]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6)));
+  no-such-method-forwarder method _method4({covariant core::int* a = #C1, generic-covariant-impl core::int* b = #C1}) → void
+    return this.{nsm::C4::noSuchMethod}(new core::_InvocationMirror::_withType(#C17, 0, #C4, #C5, core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C8: a, #C9: b})));
+}
+
+constants  {
+  #C1 = null
+  #C2 = core::_Override {}
+  #C3 = #org-dartlang-testcase:///nsm_covariance.dart::_method1
+  #C4 = <core::Type*>[]
+  #C5 = <dynamic>[]
+  #C6 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C5}
+  #C7 = #org-dartlang-testcase:///nsm_covariance.dart::_method2
+  #C8 = #a
+  #C9 = #b
+  #C10 = #c
+  #C11 = #d
+  #C12 = #org-dartlang-testcase:///nsm_covariance.dart::_method3
+  #C13 = #org-dartlang-testcase:///nsm_covariance.dart::_method4
+  #C14 = #org-dartlang-testcase:///nsm_covariance_lib.dart::_method1
+  #C15 = #org-dartlang-testcase:///nsm_covariance_lib.dart::_method2
+  #C16 = #org-dartlang-testcase:///nsm_covariance_lib.dart::_method3
+  #C17 = #org-dartlang-testcase:///nsm_covariance_lib.dart::_method4
+}
diff --git a/pkg/front_end/testcases/general/nsm_covariance.dart.textual_outline.expect b/pkg/front_end/testcases/general/nsm_covariance.dart.textual_outline.expect
new file mode 100644
index 0000000..9419fb3
--- /dev/null
+++ b/pkg/front_end/testcases/general/nsm_covariance.dart.textual_outline.expect
@@ -0,0 +1,17 @@
+import 'nsm_covariance_lib.dart';
+
+abstract class D1 implements A<int>, B {}
+
+abstract class D2 implements B, A<int> {}
+
+class D3 implements A<int>, B {
+  @override
+  noSuchMethod(Invocation invocation) => null;
+}
+
+class D4 implements B, A<int> {
+  @override
+  noSuchMethod(Invocation invocation) => null;
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/nsm_covariance.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/nsm_covariance.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..9419fb3
--- /dev/null
+++ b/pkg/front_end/testcases/general/nsm_covariance.dart.textual_outline_modelled.expect
@@ -0,0 +1,17 @@
+import 'nsm_covariance_lib.dart';
+
+abstract class D1 implements A<int>, B {}
+
+abstract class D2 implements B, A<int> {}
+
+class D3 implements A<int>, B {
+  @override
+  noSuchMethod(Invocation invocation) => null;
+}
+
+class D4 implements B, A<int> {
+  @override
+  noSuchMethod(Invocation invocation) => null;
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/nsm_covariance_lib.dart b/pkg/front_end/testcases/general/nsm_covariance_lib.dart
new file mode 100644
index 0000000..1afd545
--- /dev/null
+++ b/pkg/front_end/testcases/general/nsm_covariance_lib.dart
@@ -0,0 +1,31 @@
+// Copyright (c) 2020, 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.
+
+abstract class A<T> {
+  void _method1(int a, int b, T c, T d);
+  void _method2({int a, int b, T c, T d});
+  void _method3(int a, T b);
+  void _method4({int a, T b});
+}
+
+abstract class B {
+  void _method1(int x, covariant int y, int z, covariant int w);
+  void _method2({int a, covariant int b, int c, covariant int d});
+  void _method3(covariant int x, int y);
+  void _method4({covariant int a, int b});
+}
+
+abstract class C1 implements A<int>, B {}
+
+abstract class C2 implements B, A<int> {}
+
+class C3 implements A<int>, B {
+  @override
+  noSuchMethod(Invocation invocation) => null;
+}
+
+class C4 implements B, A<int> {
+  @override
+  noSuchMethod(Invocation invocation) => null;
+}
diff --git a/pkg/front_end/testcases/general/null_aware_spread.dart.strong.expect b/pkg/front_end/testcases/general/null_aware_spread.dart.strong.expect
index b724b3a..bd5bf0d 100644
--- a/pkg/front_end/testcases/general/null_aware_spread.dart.strong.expect
+++ b/pkg/front_end/testcases/general/null_aware_spread.dart.strong.expect
@@ -6,31 +6,31 @@
 static method nullAwareListSpread(core::List<core::String*>* list) → dynamic {
   list = block {
     final core::List<core::String*>* #t1 = <core::String*>[];
-    #t1.{core::List::add}("foo");
+    #t1.{core::List::add}{Invariant}("foo");
     final core::Iterable<core::String*>* #t2 = list;
     if(!#t2.{core::Object::==}(null))
       for (final core::String* #t3 in #t2)
-        #t1.{core::List::add}(#t3);
+        #t1.{core::List::add}{Invariant}(#t3);
   } =>#t1;
 }
 static method nullAwareSetSpread(core::Set<core::String*>* set) → dynamic {
   set = block {
     final core::Set<core::String*>* #t4 = col::LinkedHashSet::•<core::String*>();
-    #t4.{core::Set::add}("foo");
+    #t4.{core::Set::add}{Invariant}("foo");
     final core::Iterable<core::String*>* #t5 = set;
     if(!#t5.{core::Object::==}(null))
       for (final core::String* #t6 in #t5)
-        #t4.{core::Set::add}(#t6);
+        #t4.{core::Set::add}{Invariant}(#t6);
   } =>#t4;
 }
 static method nullAwareMapSpread(core::Map<core::int*, core::String*>* map) → dynamic {
   map = block {
     final core::Map<core::int*, core::String*>* #t7 = <core::int*, core::String*>{};
-    #t7.{core::Map::[]=}(0, "foo");
+    #t7.{core::Map::[]=}{Invariant}(0, "foo");
     final core::Map<core::int*, core::String*>* #t8 = map;
     if(!#t8.{core::Object::==}(null))
       for (final core::MapEntry<core::int*, core::String*>* #t9 in #t8.{core::Map::entries})
-        #t7.{core::Map::[]=}(#t9.{core::MapEntry::key}, #t9.{core::MapEntry::value});
+        #t7.{core::Map::[]=}{Invariant}(#t9.{core::MapEntry::key}, #t9.{core::MapEntry::value});
   } =>#t7;
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/general/null_aware_spread.dart.strong.transformed.expect b/pkg/front_end/testcases/general/null_aware_spread.dart.strong.transformed.expect
index 9ff4788..67a6d44 100644
--- a/pkg/front_end/testcases/general/null_aware_spread.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/null_aware_spread.dart.strong.transformed.expect
@@ -6,13 +6,13 @@
 static method nullAwareListSpread(core::List<core::String*>* list) → dynamic {
   list = block {
     final core::List<core::String*>* #t1 = <core::String*>[];
-    #t1.{core::List::add}("foo");
+    #t1.{core::List::add}{Invariant}("foo");
     final core::Iterable<core::String*>* #t2 = list;
     if(!#t2.{core::Object::==}(null)) {
       core::Iterator<core::String*>* :sync-for-iterator = #t2.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::String* #t3 = :sync-for-iterator.{core::Iterator::current};
-        #t1.{core::List::add}(#t3);
+        #t1.{core::List::add}{Invariant}(#t3);
       }
     }
   } =>#t1;
@@ -20,13 +20,13 @@
 static method nullAwareSetSpread(core::Set<core::String*>* set) → dynamic {
   set = block {
     final core::Set<core::String*>* #t4 = new col::_CompactLinkedHashSet::•<core::String*>();
-    #t4.{core::Set::add}("foo");
+    #t4.{core::Set::add}{Invariant}("foo");
     final core::Iterable<core::String*>* #t5 = set;
     if(!#t5.{core::Object::==}(null)) {
       core::Iterator<core::String*>* :sync-for-iterator = #t5.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::String* #t6 = :sync-for-iterator.{core::Iterator::current};
-        #t4.{core::Set::add}(#t6);
+        #t4.{core::Set::add}{Invariant}(#t6);
       }
     }
   } =>#t4;
@@ -34,13 +34,13 @@
 static method nullAwareMapSpread(core::Map<core::int*, core::String*>* map) → dynamic {
   map = block {
     final core::Map<core::int*, core::String*>* #t7 = <core::int*, core::String*>{};
-    #t7.{core::Map::[]=}(0, "foo");
+    #t7.{core::Map::[]=}{Invariant}(0, "foo");
     final core::Map<core::int*, core::String*>* #t8 = map;
     if(!#t8.{core::Object::==}(null)) {
       core::Iterator<core::MapEntry<core::int*, core::String*>>* :sync-for-iterator = #t8.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::MapEntry<core::int*, core::String*>* #t9 = :sync-for-iterator.{core::Iterator::current};
-        #t7.{core::Map::[]=}(#t9.{core::MapEntry::key}, #t9.{core::MapEntry::value});
+        #t7.{core::Map::[]=}{Invariant}(#t9.{core::MapEntry::key}, #t9.{core::MapEntry::value});
       }
     }
   } =>#t7;
diff --git a/pkg/front_end/testcases/general/null_safety_invalid_experiment.dart.outline.expect b/pkg/front_end/testcases/general/null_safety_invalid_experiment.dart.outline.expect
index 65bed41..08fe734 100644
--- a/pkg/front_end/testcases/general/null_safety_invalid_experiment.dart.outline.expect
+++ b/pkg/front_end/testcases/general/null_safety_invalid_experiment.dart.outline.expect
@@ -2,8 +2,8 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/general/null_safety_invalid_experiment.dart:5:4: Error: This requires the null safety language feature, which is experimental.
-// You can enable the experiment using the '--enable-experiment=non-nullable' command line option.
+// pkg/front_end/testcases/general/null_safety_invalid_experiment.dart:5:4: Error: This requires the 'non-nullable' language feature to be enabled.
+// The feature is on by default but is currently disabled, maybe because the '--enable-experiment=no-non-nullable' command line option is passed.
 // int? i;
 //    ^
 //
diff --git a/pkg/front_end/testcases/general/null_safety_invalid_experiment.dart.strong.expect b/pkg/front_end/testcases/general/null_safety_invalid_experiment.dart.strong.expect
index a2fd43e..cb74741 100644
--- a/pkg/front_end/testcases/general/null_safety_invalid_experiment.dart.strong.expect
+++ b/pkg/front_end/testcases/general/null_safety_invalid_experiment.dart.strong.expect
@@ -2,8 +2,8 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/general/null_safety_invalid_experiment.dart:5:4: Error: This requires the null safety language feature, which is experimental.
-// You can enable the experiment using the '--enable-experiment=non-nullable' command line option.
+// pkg/front_end/testcases/general/null_safety_invalid_experiment.dart:5:4: Error: This requires the 'non-nullable' language feature to be enabled.
+// The feature is on by default but is currently disabled, maybe because the '--enable-experiment=no-non-nullable' command line option is passed.
 // int? i;
 //    ^
 //
diff --git a/pkg/front_end/testcases/general/null_safety_invalid_experiment.dart.strong.transformed.expect b/pkg/front_end/testcases/general/null_safety_invalid_experiment.dart.strong.transformed.expect
index a2fd43e..cb74741 100644
--- a/pkg/front_end/testcases/general/null_safety_invalid_experiment.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/null_safety_invalid_experiment.dart.strong.transformed.expect
@@ -2,8 +2,8 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/general/null_safety_invalid_experiment.dart:5:4: Error: This requires the null safety language feature, which is experimental.
-// You can enable the experiment using the '--enable-experiment=non-nullable' command line option.
+// pkg/front_end/testcases/general/null_safety_invalid_experiment.dart:5:4: Error: This requires the 'non-nullable' language feature to be enabled.
+// The feature is on by default but is currently disabled, maybe because the '--enable-experiment=no-non-nullable' command line option is passed.
 // int? i;
 //    ^
 //
diff --git a/pkg/front_end/testcases/general/null_safety_invalid_experiment_and_language_version.dart.outline.expect b/pkg/front_end/testcases/general/null_safety_invalid_experiment_and_language_version.dart.outline.expect
index e55d2e4..ffc88d6 100644
--- a/pkg/front_end/testcases/general/null_safety_invalid_experiment_and_language_version.dart.outline.expect
+++ b/pkg/front_end/testcases/general/null_safety_invalid_experiment_and_language_version.dart.outline.expect
@@ -2,8 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/general/null_safety_invalid_experiment_and_language_version.dart:7:4: Error: This requires the null safety language feature, which is experimental and requires language version of 2.10 or higher.
-// You can enable the experiment using the '--enable-experiment=non-nullable' command line option.
+// pkg/front_end/testcases/general/null_safety_invalid_experiment_and_language_version.dart:7:4: Error: This requires the null safety language feature, which requires language version of 2.12 or higher.
 // int? i;
 //    ^
 //
diff --git a/pkg/front_end/testcases/general/null_safety_invalid_experiment_and_language_version.dart.strong.expect b/pkg/front_end/testcases/general/null_safety_invalid_experiment_and_language_version.dart.strong.expect
index 9a19627..996501a 100644
--- a/pkg/front_end/testcases/general/null_safety_invalid_experiment_and_language_version.dart.strong.expect
+++ b/pkg/front_end/testcases/general/null_safety_invalid_experiment_and_language_version.dart.strong.expect
@@ -2,8 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/general/null_safety_invalid_experiment_and_language_version.dart:7:4: Error: This requires the null safety language feature, which is experimental and requires language version of 2.10 or higher.
-// You can enable the experiment using the '--enable-experiment=non-nullable' command line option.
+// pkg/front_end/testcases/general/null_safety_invalid_experiment_and_language_version.dart:7:4: Error: This requires the null safety language feature, which requires language version of 2.12 or higher.
 // int? i;
 //    ^
 //
diff --git a/pkg/front_end/testcases/general/null_safety_invalid_experiment_and_language_version.dart.strong.transformed.expect b/pkg/front_end/testcases/general/null_safety_invalid_experiment_and_language_version.dart.strong.transformed.expect
index 9a19627..996501a 100644
--- a/pkg/front_end/testcases/general/null_safety_invalid_experiment_and_language_version.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/null_safety_invalid_experiment_and_language_version.dart.strong.transformed.expect
@@ -2,8 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/general/null_safety_invalid_experiment_and_language_version.dart:7:4: Error: This requires the null safety language feature, which is experimental and requires language version of 2.10 or higher.
-// You can enable the experiment using the '--enable-experiment=non-nullable' command line option.
+// pkg/front_end/testcases/general/null_safety_invalid_experiment_and_language_version.dart:7:4: Error: This requires the null safety language feature, which requires language version of 2.12 or higher.
 // int? i;
 //    ^
 //
diff --git a/pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart.outline.expect b/pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart.outline.expect
index c4a5102..b870822 100644
--- a/pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart.outline.expect
+++ b/pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart.outline.expect
@@ -154,8 +154,8 @@
   abstract set setterFromGetter(invalid-type value) → void;
   abstract get getterFromGetterWithSetterConflict() → core::num*;
   abstract set setterFromSetterWithGetterConflict(dynamic value) → void;
-  abstract forwarding-stub get setterFromGetter() → core::int*;
-  abstract forwarding-stub get setterFromSetterWithGetterConflict() → core::int*;
+  abstract member-signature get setterFromGetter() → core::int*; -> self::B::setterFromGetter
+  abstract member-signature get setterFromSetterWithGetterConflict() → core::int*; -> self::B::setterFromSetterWithGetterConflict
 }
 abstract class E extends core::Object implements self::A {
   synthetic constructor •() → self::E*
@@ -186,8 +186,8 @@
   abstract set setterFromGetter(invalid-type value) → void;
   abstract get getterFromGetterWithSetterConflict() → core::num*;
   abstract set setterFromSetterWithGetterConflict(dynamic value) → void;
-  abstract forwarding-stub get setterFromGetter() → core::int*;
-  abstract forwarding-stub get setterFromSetterWithGetterConflict() → core::int*;
+  abstract member-signature get setterFromGetter() → core::int*; -> self::B::setterFromGetter
+  abstract member-signature get setterFromSetterWithGetterConflict() → core::int*; -> self::B::setterFromSetterWithGetterConflict
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart.strong.expect b/pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart.strong.expect
index 81942f2..1eaabf2 100644
--- a/pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart.strong.expect
+++ b/pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart.strong.expect
@@ -158,8 +158,8 @@
   abstract set setterFromGetter(invalid-type value) → void;
   abstract get getterFromGetterWithSetterConflict() → core::num*;
   abstract set setterFromSetterWithGetterConflict(dynamic value) → void;
-  abstract forwarding-stub get setterFromGetter() → core::int*;
-  abstract forwarding-stub get setterFromSetterWithGetterConflict() → core::int*;
+  abstract member-signature get setterFromGetter() → core::int*; -> self::B::setterFromGetter
+  abstract member-signature get setterFromSetterWithGetterConflict() → core::int*; -> self::B::setterFromSetterWithGetterConflict
 }
 abstract class E extends core::Object implements self::A {
   synthetic constructor •() → self::E*
@@ -192,8 +192,8 @@
   abstract set setterFromGetter(invalid-type value) → void;
   abstract get getterFromGetterWithSetterConflict() → core::num*;
   abstract set setterFromSetterWithGetterConflict(dynamic value) → void;
-  abstract forwarding-stub get setterFromGetter() → core::int*;
-  abstract forwarding-stub get setterFromSetterWithGetterConflict() → core::int*;
+  abstract member-signature get setterFromGetter() → core::int*; -> self::B::setterFromGetter
+  abstract member-signature get setterFromSetterWithGetterConflict() → core::int*; -> self::B::setterFromSetterWithGetterConflict
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart.strong.transformed.expect b/pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart.strong.transformed.expect
index 81942f2..1eaabf2 100644
--- a/pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart.strong.transformed.expect
@@ -158,8 +158,8 @@
   abstract set setterFromGetter(invalid-type value) → void;
   abstract get getterFromGetterWithSetterConflict() → core::num*;
   abstract set setterFromSetterWithGetterConflict(dynamic value) → void;
-  abstract forwarding-stub get setterFromGetter() → core::int*;
-  abstract forwarding-stub get setterFromSetterWithGetterConflict() → core::int*;
+  abstract member-signature get setterFromGetter() → core::int*; -> self::B::setterFromGetter
+  abstract member-signature get setterFromSetterWithGetterConflict() → core::int*; -> self::B::setterFromSetterWithGetterConflict
 }
 abstract class E extends core::Object implements self::A {
   synthetic constructor •() → self::E*
@@ -192,8 +192,8 @@
   abstract set setterFromGetter(invalid-type value) → void;
   abstract get getterFromGetterWithSetterConflict() → core::num*;
   abstract set setterFromSetterWithGetterConflict(dynamic value) → void;
-  abstract forwarding-stub get setterFromGetter() → core::int*;
-  abstract forwarding-stub get setterFromSetterWithGetterConflict() → core::int*;
+  abstract member-signature get setterFromGetter() → core::int*; -> self::B::setterFromGetter
+  abstract member-signature get setterFromSetterWithGetterConflict() → core::int*; -> self::B::setterFromSetterWithGetterConflict
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/general/redirecting_factory_const_inference.dart.strong.expect b/pkg/front_end/testcases/general/redirecting_factory_const_inference.dart.strong.expect
index c69b1b3..27deb54 100644
--- a/pkg/front_end/testcases/general/redirecting_factory_const_inference.dart.strong.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory_const_inference.dart.strong.expect
@@ -55,11 +55,11 @@
 }
 static method main() → dynamic {
   dynamic x = new self::B::•<dynamic>().{self::A::x};
-  if(!(x is self::_Y<core::Null?>*)) {
+  if(!(x is self::_Y<Null>*)) {
     throw "Unexpected run-time type: `new B().x` is ${x.{core::Object::runtimeType}}, but `_Y<Null>` expected";
   }
 }
 
 constants  {
-  #C1 = self::_Y<core::Null?> {}
+  #C1 = self::_Y<Null> {}
 }
diff --git a/pkg/front_end/testcases/general/redirecting_factory_const_inference.dart.strong.transformed.expect b/pkg/front_end/testcases/general/redirecting_factory_const_inference.dart.strong.transformed.expect
index aab1b06..4b6b1c0 100644
--- a/pkg/front_end/testcases/general/redirecting_factory_const_inference.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory_const_inference.dart.strong.transformed.expect
@@ -55,11 +55,11 @@
 }
 static method main() → dynamic {
   dynamic x = new self::B::•<dynamic>().{self::A::x};
-  if(!(x is self::_Y<core::Null?>*)) {
+  if(!(x is self::_Y<Null>*)) {
     throw "Unexpected run-time type: `new B().x` is ${x.{core::Object::runtimeType}}, but `_Y<Null>` expected";
   }
 }
 
 constants  {
-  #C1 = self::_Y<core::Null?> {}
+  #C1 = self::_Y<Null> {}
 }
diff --git a/pkg/front_end/testcases/general/regression_flutter51828.dart.strong.transformed.expect b/pkg/front_end/testcases/general/regression_flutter51828.dart.strong.transformed.expect
index c0ef0a7..30085d7 100644
--- a/pkg/front_end/testcases/general/regression_flutter51828.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/regression_flutter51828.dart.strong.transformed.expect
@@ -9,7 +9,8 @@
     : super core::Object::•()
     ;
   method foo(dynamic x) → asy::Future<void>* /* originally async */ {
-    final asy::_AsyncAwaitCompleter<void>* :async_completer = new asy::_AsyncAwaitCompleter::•<void>();
+    final asy::_Future<void>* :async_future = new asy::_Future::•<void>();
+    core::bool* :is_sync = false;
     FutureOr<void>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -20,17 +21,18 @@
       try {
         #L1:
         {}
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   }
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -48,7 +50,8 @@
     : super core::Object::•()
     ;
   method bar(dynamic x) → asy::Future<void>* /* originally async */ {
-    final asy::_AsyncAwaitCompleter<void>* :async_completer = new asy::_AsyncAwaitCompleter::•<void>();
+    final asy::_Future<void>* :async_future = new asy::_Future::•<void>();
+    core::bool* :is_sync = false;
     FutureOr<void>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -59,17 +62,18 @@
       try {
         #L2:
         {}
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   }
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -83,7 +87,8 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 static method main() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic>* :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -99,21 +104,22 @@
       {
         :async_temporary_1 = new self::A::•();
         [yield] let dynamic #t1 = asy::_awaitHelper(null, :async_op_then, :async_op_error, :async_op) in null;
-        :async_temporary_1 = _in::unsafeCast<self::A*>(:async_temporary_1).{self::A::foo}(_in::unsafeCast<core::Null?>(:result));
+        :async_temporary_1 = _in::unsafeCast<self::A*>(:async_temporary_1).{self::A::foo}(_in::unsafeCast<Null>(:result));
         :async_temporary_0 = new self::B::•();
         [yield] let dynamic #t2 = asy::_awaitHelper(null, :async_op_then, :async_op_error, :async_op) in null;
-        :return_value = <asy::Future<void>*>[_in::unsafeCast<asy::Future<void>*>(:async_temporary_1), _in::unsafeCast<self::B*>(:async_temporary_0).{self::B::bar}(_in::unsafeCast<core::Null?>(:result))];
+        :return_value = <asy::Future<void>*>[_in::unsafeCast<asy::Future<void>*>(:async_temporary_1), _in::unsafeCast<self::B*>(:async_temporary_0).{self::B::bar}(_in::unsafeCast<Null>(:result))];
         break #L3;
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
diff --git a/pkg/front_end/testcases/general/spread_collection.dart.strong.expect b/pkg/front_end/testcases/general/spread_collection.dart.strong.expect
index 08204f6..45566e9 100644
--- a/pkg/front_end/testcases/general/spread_collection.dart.strong.expect
+++ b/pkg/front_end/testcases/general/spread_collection.dart.strong.expect
@@ -14,33 +14,33 @@
 static method main() → dynamic {
   final core::List<core::int*>* aList = block {
     final core::List<core::int*>* #t1 = <core::int*>[];
-    #t1.{core::List::add}(1);
+    #t1.{core::List::add}{Invariant}(1);
     for (final core::int* #t2 in <core::int*>[2])
-      #t1.{core::List::add}(#t2);
+      #t1.{core::List::add}{Invariant}(#t2);
     final core::Iterable<core::int*>* #t3 = <core::int*>[3];
     if(!#t3.{core::Object::==}(null))
       for (final core::int* #t4 in #t3)
-        #t1.{core::List::add}(#t4);
+        #t1.{core::List::add}{Invariant}(#t4);
   } =>#t1;
   final core::Map<core::int*, core::int*>* aMap = block {
     final core::Map<core::int*, core::int*>* #t5 = <core::int*, core::int*>{};
-    #t5.{core::Map::[]=}(1, 1);
+    #t5.{core::Map::[]=}{Invariant}(1, 1);
     for (final core::MapEntry<core::int*, core::int*>* #t6 in <core::int*, core::int*>{2: 2}.{core::Map::entries})
-      #t5.{core::Map::[]=}(#t6.{core::MapEntry::key}, #t6.{core::MapEntry::value});
+      #t5.{core::Map::[]=}{Invariant}(#t6.{core::MapEntry::key}, #t6.{core::MapEntry::value});
     final core::Map<core::int*, core::int*>* #t7 = <core::int*, core::int*>{3: 3};
     if(!#t7.{core::Object::==}(null))
       for (final core::MapEntry<core::int*, core::int*>* #t8 in #t7.{core::Map::entries})
-        #t5.{core::Map::[]=}(#t8.{core::MapEntry::key}, #t8.{core::MapEntry::value});
+        #t5.{core::Map::[]=}{Invariant}(#t8.{core::MapEntry::key}, #t8.{core::MapEntry::value});
   } =>#t5;
   final core::Set<core::int*>* aSet = block {
     final core::Set<core::int*>* #t9 = col::LinkedHashSet::•<core::int*>();
-    #t9.{core::Set::add}(1);
+    #t9.{core::Set::add}{Invariant}(1);
     for (final core::int* #t10 in <core::int*>[2])
-      #t9.{core::Set::add}(#t10);
+      #t9.{core::Set::add}{Invariant}(#t10);
     final core::Iterable<core::int*>* #t11 = <core::int*>[3];
     if(!#t11.{core::Object::==}(null))
       for (final core::int* #t12 in #t11)
-        #t9.{core::Set::add}(#t12);
+        #t9.{core::Set::add}{Invariant}(#t12);
   } =>#t9;
   final dynamic aSetOrMap = invalid-expression "pkg/front_end/testcases/general/spread_collection.dart:21:21: Error: Not enough type information to disambiguate between literal set and literal map.
 Try providing type arguments for the literal explicitly to disambiguate it.
diff --git a/pkg/front_end/testcases/general/spread_collection.dart.strong.transformed.expect b/pkg/front_end/testcases/general/spread_collection.dart.strong.transformed.expect
index 15ed3cf..d6d75a5 100644
--- a/pkg/front_end/testcases/general/spread_collection.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/spread_collection.dart.strong.transformed.expect
@@ -14,12 +14,12 @@
 static method main() → dynamic {
   final core::List<core::int*>* aList = block {
     final core::List<core::int*>* #t1 = <core::int*>[];
-    #t1.{core::List::add}(1);
+    #t1.{core::List::add}{Invariant}(1);
     {
       core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[2].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::int* #t2 = :sync-for-iterator.{core::Iterator::current};
-        #t1.{core::List::add}(#t2);
+        #t1.{core::List::add}{Invariant}(#t2);
       }
     }
     final core::Iterable<core::int*>* #t3 = <core::int*>[3];
@@ -27,18 +27,18 @@
       core::Iterator<core::int*>* :sync-for-iterator = #t3.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::int* #t4 = :sync-for-iterator.{core::Iterator::current};
-        #t1.{core::List::add}(#t4);
+        #t1.{core::List::add}{Invariant}(#t4);
       }
     }
   } =>#t1;
   final core::Map<core::int*, core::int*>* aMap = block {
     final core::Map<core::int*, core::int*>* #t5 = <core::int*, core::int*>{};
-    #t5.{core::Map::[]=}(1, 1);
+    #t5.{core::Map::[]=}{Invariant}(1, 1);
     {
       core::Iterator<core::MapEntry<core::int*, core::int*>>* :sync-for-iterator = <core::int*, core::int*>{2: 2}.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::MapEntry<core::int*, core::int*>* #t6 = :sync-for-iterator.{core::Iterator::current};
-        #t5.{core::Map::[]=}(#t6.{core::MapEntry::key}, #t6.{core::MapEntry::value});
+        #t5.{core::Map::[]=}{Invariant}(#t6.{core::MapEntry::key}, #t6.{core::MapEntry::value});
       }
     }
     final core::Map<core::int*, core::int*>* #t7 = <core::int*, core::int*>{3: 3};
@@ -46,18 +46,18 @@
       core::Iterator<core::MapEntry<core::int*, core::int*>>* :sync-for-iterator = #t7.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::MapEntry<core::int*, core::int*>* #t8 = :sync-for-iterator.{core::Iterator::current};
-        #t5.{core::Map::[]=}(#t8.{core::MapEntry::key}, #t8.{core::MapEntry::value});
+        #t5.{core::Map::[]=}{Invariant}(#t8.{core::MapEntry::key}, #t8.{core::MapEntry::value});
       }
     }
   } =>#t5;
   final core::Set<core::int*>* aSet = block {
     final core::Set<core::int*>* #t9 = new col::_CompactLinkedHashSet::•<core::int*>();
-    #t9.{core::Set::add}(1);
+    #t9.{core::Set::add}{Invariant}(1);
     {
       core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[2].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::int* #t10 = :sync-for-iterator.{core::Iterator::current};
-        #t9.{core::Set::add}(#t10);
+        #t9.{core::Set::add}{Invariant}(#t10);
       }
     }
     final core::Iterable<core::int*>* #t11 = <core::int*>[3];
@@ -65,7 +65,7 @@
       core::Iterator<core::int*>* :sync-for-iterator = #t11.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::int* #t12 = :sync-for-iterator.{core::Iterator::current};
-        #t9.{core::Set::add}(#t12);
+        #t9.{core::Set::add}{Invariant}(#t12);
       }
     }
   } =>#t9;
diff --git a/pkg/front_end/testcases/general/spread_collection_inference.dart.strong.expect b/pkg/front_end/testcases/general/spread_collection_inference.dart.strong.expect
index ae46db2..e2acef4 100644
--- a/pkg/front_end/testcases/general/spread_collection_inference.dart.strong.expect
+++ b/pkg/front_end/testcases/general/spread_collection_inference.dart.strong.expect
@@ -112,68 +112,68 @@
   core::List<dynamic>* lhs10 = block {
     final core::List<dynamic>* #t1 = <dynamic>[];
     for (final dynamic #t2 in <dynamic>[])
-      #t1.{core::List::add}(#t2);
+      #t1.{core::List::add}{Invariant}(#t2);
   } =>#t1;
   core::Set<dynamic>* set10 = block {
     final core::Set<dynamic>* #t3 = col::LinkedHashSet::•<dynamic>();
     for (final dynamic #t4 in <dynamic>[])
-      #t3.{core::Set::add}(#t4);
+      #t3.{core::Set::add}{Invariant}(#t4);
   } =>#t3;
   core::Map<dynamic, dynamic>* map10 = block {
     final core::Map<dynamic, dynamic>* #t5 = <dynamic, dynamic>{};
     for (final core::MapEntry<dynamic, dynamic>* #t6 in <dynamic, dynamic>{}.{core::Map::entries})
-      #t5.{core::Map::[]=}(#t6.{core::MapEntry::key}, #t6.{core::MapEntry::value});
+      #t5.{core::Map::[]=}{Invariant}(#t6.{core::MapEntry::key}, #t6.{core::MapEntry::value});
   } =>#t5;
   core::Map<dynamic, dynamic>* map10ambiguous = block {
     final core::Map<dynamic, dynamic>* #t7 = <dynamic, dynamic>{};
     for (final core::MapEntry<dynamic, dynamic>* #t8 in <dynamic, dynamic>{}.{core::Map::entries})
-      #t7.{core::Map::[]=}(#t8.{core::MapEntry::key}, #t8.{core::MapEntry::value});
+      #t7.{core::Map::[]=}{Invariant}(#t8.{core::MapEntry::key}, #t8.{core::MapEntry::value});
   } =>#t7;
   core::List<core::int*>* lhs20 = block {
     final core::List<core::int*>* #t9 = <core::int*>[];
     for (final core::int* #t10 in spread)
-      #t9.{core::List::add}(#t10);
+      #t9.{core::List::add}{Invariant}(#t10);
   } =>#t9;
   core::Set<core::int*>* set20 = block {
     final core::Set<core::int*>* #t11 = col::LinkedHashSet::•<core::int*>();
     for (final core::int* #t12 in spread)
-      #t11.{core::Set::add}(#t12);
-    #t11.{core::Set::add}(42);
+      #t11.{core::Set::add}{Invariant}(#t12);
+    #t11.{core::Set::add}{Invariant}(42);
   } =>#t11;
   core::Set<core::int*>* set20ambiguous = block {
     final core::Set<core::int*>* #t13 = col::LinkedHashSet::•<core::int*>();
     for (final dynamic #t14 in spread) {
       final core::int* #t15 = #t14 as{TypeError} core::int*;
-      #t13.{core::Set::add}(#t15);
+      #t13.{core::Set::add}{Invariant}(#t15);
     }
   } =>#t13;
   core::Map<core::String*, core::int*>* map20 = block {
     final core::Map<core::String*, core::int*>* #t16 = <core::String*, core::int*>{};
     for (final core::MapEntry<core::String*, core::int*>* #t17 in mapSpread.{core::Map::entries})
-      #t16.{core::Map::[]=}(#t17.{core::MapEntry::key}, #t17.{core::MapEntry::value});
-    #t16.{core::Map::[]=}("baz", 42);
+      #t16.{core::Map::[]=}{Invariant}(#t17.{core::MapEntry::key}, #t17.{core::MapEntry::value});
+    #t16.{core::Map::[]=}{Invariant}("baz", 42);
   } =>#t16;
   core::Map<core::String*, core::int*>* map20ambiguous = block {
     final core::Map<core::String*, core::int*>* #t18 = <core::String*, core::int*>{};
     for (final core::MapEntry<core::String*, core::int*>* #t19 in mapSpread.{core::Map::entries})
-      #t18.{core::Map::[]=}(#t19.{core::MapEntry::key}, #t19.{core::MapEntry::value});
+      #t18.{core::Map::[]=}{Invariant}(#t19.{core::MapEntry::key}, #t19.{core::MapEntry::value});
   } =>#t18;
   core::List<dynamic>* lhs21 = block {
     final core::List<dynamic>* #t20 = <dynamic>[];
     for (final dynamic #t21 in (spread as dynamic) as{TypeError,ForDynamic} core::Iterable<dynamic>*)
-      #t20.{core::List::add}(#t21);
+      #t20.{core::List::add}{Invariant}(#t21);
   } =>#t20;
   core::Set<dynamic>* set21 = block {
     final core::Set<dynamic>* #t22 = col::LinkedHashSet::•<dynamic>();
     for (final dynamic #t23 in (spread as dynamic) as{TypeError,ForDynamic} core::Iterable<dynamic>*)
-      #t22.{core::Set::add}(#t23);
-    #t22.{core::Set::add}(42);
+      #t22.{core::Set::add}{Invariant}(#t23);
+    #t22.{core::Set::add}{Invariant}(42);
   } =>#t22;
   core::Map<dynamic, dynamic>* map21 = block {
     final core::Map<dynamic, dynamic>* #t24 = <dynamic, dynamic>{};
     for (final core::MapEntry<dynamic, dynamic>* #t25 in ((mapSpread as dynamic) as{TypeError,ForDynamic} core::Map<dynamic, dynamic>*).{core::Map::entries})
-      #t24.{core::Map::[]=}(#t25.{core::MapEntry::key}, #t25.{core::MapEntry::value});
-    #t24.{core::Map::[]=}("baz", 42);
+      #t24.{core::Map::[]=}{Invariant}(#t25.{core::MapEntry::key}, #t25.{core::MapEntry::value});
+    #t24.{core::Map::[]=}{Invariant}("baz", 42);
   } =>#t24;
   dynamic map21ambiguous = invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:64:28: Error: Not enough type information to disambiguate between literal set and literal map.
 Try providing type arguments for the literal explicitly to disambiguate it.
@@ -182,48 +182,48 @@
   core::List<core::int*>* lhs22 = block {
     final core::List<core::int*>* #t26 = <core::int*>[];
     for (final core::int* #t27 in <core::int*>[])
-      #t26.{core::List::add}(#t27);
+      #t26.{core::List::add}{Invariant}(#t27);
   } =>#t26;
   core::Set<core::int*>* set22 = block {
     final core::Set<core::int*>* #t28 = col::LinkedHashSet::•<core::int*>();
     for (final core::int* #t29 in <core::int*>[])
-      #t28.{core::Set::add}(#t29);
-    #t28.{core::Set::add}(42);
+      #t28.{core::Set::add}{Invariant}(#t29);
+    #t28.{core::Set::add}{Invariant}(42);
   } =>#t28;
   core::Set<core::int*>* set22ambiguous = block {
     final core::Set<core::int*>* #t30 = col::LinkedHashSet::•<core::int*>();
     for (final dynamic #t31 in <core::int*>[]) {
       final core::int* #t32 = #t31 as{TypeError} core::int*;
-      #t30.{core::Set::add}(#t32);
+      #t30.{core::Set::add}{Invariant}(#t32);
     }
   } =>#t30;
   core::Map<core::String*, core::int*>* map22 = block {
     final core::Map<core::String*, core::int*>* #t33 = <core::String*, core::int*>{};
     for (final core::MapEntry<core::String*, core::int*>* #t34 in <core::String*, core::int*>{}.{core::Map::entries})
-      #t33.{core::Map::[]=}(#t34.{core::MapEntry::key}, #t34.{core::MapEntry::value});
+      #t33.{core::Map::[]=}{Invariant}(#t34.{core::MapEntry::key}, #t34.{core::MapEntry::value});
   } =>#t33;
   core::List<core::List<core::int*>*>* lhs23 = block {
     final core::List<core::List<core::int*>*>* #t35 = <core::List<core::int*>*>[];
     for (final core::List<core::int*>* #t36 in <core::List<core::int*>*>[<core::int*>[]])
-      #t35.{core::List::add}(#t36);
+      #t35.{core::List::add}{Invariant}(#t36);
   } =>#t35;
   core::Set<core::List<core::int*>*>* set23 = block {
     final core::Set<core::List<core::int*>*>* #t37 = col::LinkedHashSet::•<core::List<core::int*>*>();
     for (final core::List<core::int*>* #t38 in <core::List<core::int*>*>[<core::int*>[]])
-      #t37.{core::Set::add}(#t38);
-    #t37.{core::Set::add}(<core::int*>[42]);
+      #t37.{core::Set::add}{Invariant}(#t38);
+    #t37.{core::Set::add}{Invariant}(<core::int*>[42]);
   } =>#t37;
   core::Set<core::List<core::int*>*>* set23ambiguous = block {
     final core::Set<core::List<core::int*>*>* #t39 = col::LinkedHashSet::•<core::List<core::int*>*>();
     for (final dynamic #t40 in <core::List<core::int*>*>[<core::int*>[]]) {
       final core::List<core::int*>* #t41 = #t40 as{TypeError} core::List<core::int*>*;
-      #t39.{core::Set::add}(#t41);
+      #t39.{core::Set::add}{Invariant}(#t41);
     }
   } =>#t39;
   core::Map<core::String*, core::List<core::int*>*>* map23 = block {
     final core::Map<core::String*, core::List<core::int*>*>* #t42 = <core::String*, core::List<core::int*>*>{};
     for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t43 in <core::String*, core::List<core::int*>*>{"baz": <core::int*>[]}.{core::Map::entries})
-      #t42.{core::Map::[]=}(#t43.{core::MapEntry::key}, #t43.{core::MapEntry::value});
+      #t42.{core::Map::[]=}{Invariant}(#t43.{core::MapEntry::key}, #t43.{core::MapEntry::value});
   } =>#t42;
   dynamic map24ambiguous = invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:96:28: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
   dynamic map24ambiguous = {...spread, ...mapSpread};
@@ -234,7 +234,7 @@
                                    ^" in ( block {
     final core::List<core::int*>* #t45 = <core::int*>[];
     for (final core::int* #t46 in spread)
-      #t45.{core::List::add}(#t46);
+      #t45.{core::List::add}{Invariant}(#t46);
   } =>#t45) as{TypeError} core::int*;
   core::int* set30 = let final<BottomType> #t47 = invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:100:36: Error: A value of type 'Set<int>' can't be assigned to a variable of type 'int'.
  - 'Set' is from 'dart:core'.
@@ -242,8 +242,8 @@
                                    ^" in ( block {
     final core::Set<core::int*>* #t48 = col::LinkedHashSet::•<core::int*>();
     for (final core::int* #t49 in spread)
-      #t48.{core::Set::add}(#t49);
-    #t48.{core::Set::add}(42);
+      #t48.{core::Set::add}{Invariant}(#t49);
+    #t48.{core::Set::add}{Invariant}(42);
   } =>#t48) as{TypeError} core::int*;
   core::int* set30ambiguous = let final<BottomType> #t50 = invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:103:7: Error: A value of type 'Set<int>' can't be assigned to a variable of type 'int'.
  - 'Set' is from 'dart:core'.
@@ -252,7 +252,7 @@
     final core::Set<core::int*>* #t51 = col::LinkedHashSet::•<core::int*>();
     for (final dynamic #t52 in spread) {
       final core::int* #t53 = #t52 as{TypeError} core::int*;
-      #t51.{core::Set::add}(#t53);
+      #t51.{core::Set::add}{Invariant}(#t53);
     }
   } =>#t51) as{TypeError} core::int*;
   core::int* map30 = let final<BottomType> #t54 = invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:106:7: Error: A value of type 'Map<String, int>' can't be assigned to a variable of type 'int'.
@@ -261,8 +261,8 @@
       ^" in ( block {
     final core::Map<core::String*, core::int*>* #t55 = <core::String*, core::int*>{};
     for (final core::MapEntry<core::String*, core::int*>* #t56 in mapSpread.{core::Map::entries})
-      #t55.{core::Map::[]=}(#t56.{core::MapEntry::key}, #t56.{core::MapEntry::value});
-    #t55.{core::Map::[]=}("baz", 42);
+      #t55.{core::Map::[]=}{Invariant}(#t56.{core::MapEntry::key}, #t56.{core::MapEntry::value});
+    #t55.{core::Map::[]=}{Invariant}("baz", 42);
   } =>#t55) as{TypeError} core::int*;
   core::int* map30ambiguous = let final<BottomType> #t57 = invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:109:7: Error: A value of type 'Map<String, int>' can't be assigned to a variable of type 'int'.
  - 'Map' is from 'dart:core'.
@@ -270,32 +270,41 @@
       ^" in ( block {
     final core::Map<core::String*, core::int*>* #t58 = <core::String*, core::int*>{};
     for (final core::MapEntry<core::String*, core::int*>* #t59 in mapSpread.{core::Map::entries})
-      #t58.{core::Map::[]=}(#t59.{core::MapEntry::key}, #t59.{core::MapEntry::value});
+      #t58.{core::Map::[]=}{Invariant}(#t59.{core::MapEntry::key}, #t59.{core::MapEntry::value});
   } =>#t58) as{TypeError} core::int*;
   core::List<dynamic>* lhs40 = <dynamic>[invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:111:38: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
   List<dynamic> lhs40 = <dynamic>[...notSpreadInt];
                                      ^"];
-  core::Set<dynamic>* set40 = let final core::Set<dynamic>* #t60 = col::LinkedHashSet::•<dynamic>() in let final dynamic #t61 = #t60.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:113:37: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
+  core::Set<dynamic>* set40 = block {
+    final core::Set<dynamic>* #t60 = col::LinkedHashSet::•<dynamic>();
+    #t60.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:113:37: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
   Set<dynamic> set40 = <dynamic>{...notSpreadInt};
-                                    ^") in #t60;
+                                    ^");
+  } =>#t60;
   core::Map<dynamic, dynamic>* map40 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:115:55: Error: Unexpected type 'int' of a map spread entry.  Expected 'dynamic' or a Map.
   Map<dynamic, dynamic> map40 = <dynamic, dynamic>{...notSpreadInt};
                                                       ^": null};
   core::List<dynamic>* lhs50 = <dynamic>[invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:117:38: Error: Unexpected type 'int Function()' of a spread.  Expected 'dynamic' or an Iterable.
   List<dynamic> lhs50 = <dynamic>[...notSpreadFunction];
                                      ^"];
-  core::Set<dynamic>* set50 = let final core::Set<dynamic>* #t62 = col::LinkedHashSet::•<dynamic>() in let final dynamic #t63 = #t62.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:119:37: Error: Unexpected type 'int Function()' of a spread.  Expected 'dynamic' or an Iterable.
+  core::Set<dynamic>* set50 = block {
+    final core::Set<dynamic>* #t61 = col::LinkedHashSet::•<dynamic>();
+    #t61.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:119:37: Error: Unexpected type 'int Function()' of a spread.  Expected 'dynamic' or an Iterable.
   Set<dynamic> set50 = <dynamic>{...notSpreadFunction};
-                                    ^") in #t62;
+                                    ^");
+  } =>#t61;
   core::Map<dynamic, dynamic>* map50 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:121:55: Error: Unexpected type 'int Function()' of a map spread entry.  Expected 'dynamic' or a Map.
   Map<dynamic, dynamic> map50 = <dynamic, dynamic>{...notSpreadFunction};
                                                       ^": null};
   core::List<core::String*>* lhs60 = <core::String*>[invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:123:36: Error: Can't assign spread elements of type 'int' to collection elements of type 'String'.
   List<String> lhs60 = <String>[...spread];
                                    ^"];
-  core::Set<core::String*>* set60 = let final core::Set<core::String*>* #t64 = col::LinkedHashSet::•<core::String*>() in let final dynamic #t65 = #t64.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:125:35: Error: Can't assign spread elements of type 'int' to collection elements of type 'String'.
+  core::Set<core::String*>* set60 = block {
+    final core::Set<core::String*>* #t62 = col::LinkedHashSet::•<core::String*>();
+    #t62.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:125:35: Error: Can't assign spread elements of type 'int' to collection elements of type 'String'.
   Set<String> set60 = <String>{...spread};
-                                  ^") in #t64;
+                                  ^");
+  } =>#t62;
   core::Map<core::int*, core::int*>* map60 = <core::int*, core::int*>{invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:127:39: Error: Can't assign spread entry keys of type 'String' to map entry keys of type 'int'.
   Map<int, int> map60 = <int, int>{...mapSpread};
                                       ^": null};
@@ -305,90 +314,93 @@
   core::List<core::int*>* lhs70 = <core::int*>[invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:131:30: Error: Can't spread a value with static type 'Null'.
   List<int> lhs70 = <int>[...null];
                              ^"];
-  core::Set<core::int*>* set70 = let final core::Set<core::int*>* #t66 = col::LinkedHashSet::•<core::int*>() in let final dynamic #t67 = #t66.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:133:29: Error: Can't spread a value with static type 'Null'.
+  core::Set<core::int*>* set70 = block {
+    final core::Set<core::int*>* #t63 = col::LinkedHashSet::•<core::int*>();
+    #t63.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:133:29: Error: Can't spread a value with static type 'Null'.
   Set<int> set70 = <int>{...null};
-                            ^") in #t66;
+                            ^");
+  } =>#t63;
   core::Set<dynamic>* set71ambiguous = block {
-    final core::Set<dynamic>* #t68 = col::LinkedHashSet::•<dynamic>();
-    #t68.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:137:8: Error: Expected ',' before this.
+    final core::Set<dynamic>* #t64 = col::LinkedHashSet::•<dynamic>();
+    #t64.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:137:8: Error: Expected ',' before this.
     ...null,
        ^");
-    for (final dynamic #t69 in <dynamic>[]) {
-      final dynamic #t70 = #t69 as{TypeError} dynamic;
-      #t68.{core::Set::add}(#t70);
+    for (final dynamic #t65 in <dynamic>[]) {
+      final dynamic #t66 = #t65 as{TypeError} dynamic;
+      #t64.{core::Set::add}{Invariant}(#t66);
     }
-  } =>#t68;
+  } =>#t64;
   core::Map<core::String*, core::int*>* map70 = <core::String*, core::int*>{invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:142:45: Error: Can't spread a value with static type 'Null'.
   Map<String, int> map70 = <String, int>{...null};
                                             ^": null};
   core::List<core::int*>* lhs80 = block {
-    final core::List<core::int*>* #t71 = <core::int*>[];
-    final core::Iterable<core::int*>* #t72 = null;
-    if(!#t72.{core::Object::==}(null))
-      for (final core::int* #t73 in #t72)
-        #t71.{core::List::add}(#t73);
-  } =>#t71;
+    final core::List<core::int*>* #t67 = <core::int*>[];
+    final core::Iterable<core::int*>* #t68 = null;
+    if(!#t68.{core::Object::==}(null))
+      for (final core::int* #t69 in #t68)
+        #t67.{core::List::add}{Invariant}(#t69);
+  } =>#t67;
   core::Set<core::int*>* set80 = block {
-    final core::Set<core::int*>* #t74 = col::LinkedHashSet::•<core::int*>();
-    final core::Iterable<core::int*>* #t75 = null;
-    if(!#t75.{core::Object::==}(null))
-      for (final core::int* #t76 in #t75)
-        #t74.{core::Set::add}(#t76);
-  } =>#t74;
+    final core::Set<core::int*>* #t70 = col::LinkedHashSet::•<core::int*>();
+    final core::Iterable<core::int*>* #t71 = null;
+    if(!#t71.{core::Object::==}(null))
+      for (final core::int* #t72 in #t71)
+        #t70.{core::Set::add}{Invariant}(#t72);
+  } =>#t70;
   core::Set<dynamic>* set81ambiguous = block {
-    final core::Set<dynamic>* #t77 = col::LinkedHashSet::•<dynamic>();
-    final core::Iterable<dynamic>* #t78 = null;
-    if(!#t78.{core::Object::==}(null))
-      for (final dynamic #t79 in #t78) {
-        final dynamic #t80 = #t79 as{TypeError} dynamic;
-        #t77.{core::Set::add}(#t80);
+    final core::Set<dynamic>* #t73 = col::LinkedHashSet::•<dynamic>();
+    final core::Iterable<dynamic>* #t74 = null;
+    if(!#t74.{core::Object::==}(null))
+      for (final dynamic #t75 in #t74) {
+        final dynamic #t76 = #t75 as{TypeError} dynamic;
+        #t73.{core::Set::add}{Invariant}(#t76);
       }
-    for (final dynamic #t81 in <dynamic>[]) {
-      final dynamic #t82 = #t81 as{TypeError} dynamic;
-      #t77.{core::Set::add}(#t82);
+    for (final dynamic #t77 in <dynamic>[]) {
+      final dynamic #t78 = #t77 as{TypeError} dynamic;
+      #t73.{core::Set::add}{Invariant}(#t78);
     }
-  } =>#t77;
+  } =>#t73;
   core::Map<core::String*, core::int*>* map80 = block {
-    final core::Map<core::String*, core::int*>* #t83 = <core::String*, core::int*>{};
-    final core::Map<core::String*, core::int*>* #t84 = null;
-    if(!#t84.{core::Object::==}(null))
-      for (final core::MapEntry<core::String*, core::int*>* #t85 in #t84.{core::Map::entries})
-        #t83.{core::Map::[]=}(#t85.{core::MapEntry::key}, #t85.{core::MapEntry::value});
-  } =>#t83;
+    final core::Map<core::String*, core::int*>* #t79 = <core::String*, core::int*>{};
+    final core::Map<core::String*, core::int*>* #t80 = null;
+    if(!#t80.{core::Object::==}(null))
+      for (final core::MapEntry<core::String*, core::int*>* #t81 in #t80.{core::Map::entries})
+        #t79.{core::Map::[]=}{Invariant}(#t81.{core::MapEntry::key}, #t81.{core::MapEntry::value});
+  } =>#t79;
   core::Map<core::String*, core::int*>* map90 = block {
-    final core::Map<core::String*, core::int*>* #t86 = <core::String*, core::int*>{};
-    for (final core::MapEntry<core::String*, core::int*>* #t87 in self::bar<core::String*, core::int*>().{core::Map::entries})
-      #t86.{core::Map::[]=}(#t87.{core::MapEntry::key}, #t87.{core::MapEntry::value});
-  } =>#t86;
+    final core::Map<core::String*, core::int*>* #t82 = <core::String*, core::int*>{};
+    for (final core::MapEntry<core::String*, core::int*>* #t83 in self::bar<core::String*, core::int*>().{core::Map::entries})
+      #t82.{core::Map::[]=}{Invariant}(#t83.{core::MapEntry::key}, #t83.{core::MapEntry::value});
+  } =>#t82;
   core::List<core::int*>* list100 = block {
-    final core::List<core::int*>* #t88 = <core::int*>[];
-    for (final dynamic #t89 in listNum) {
-      final core::int* #t90 = #t89 as{TypeError} core::int*;
-      #t88.{core::List::add}(#t90);
+    final core::List<core::int*>* #t84 = <core::int*>[];
+    for (final dynamic #t85 in listNum) {
+      final core::int* #t86 = #t85 as{TypeError} core::int*;
+      #t84.{core::List::add}{Invariant}(#t86);
     }
-  } =>#t88;
+  } =>#t84;
   core::Map<core::num*, core::int*>* map100 = block {
-    final core::Map<core::num*, core::int*>* #t91 = <core::num*, core::int*>{};
-    for (final core::MapEntry<dynamic, dynamic>* #t92 in mapIntNum.{core::Map::entries}) {
-      final core::num* #t93 = #t92.{core::MapEntry::key} as{TypeError} core::num*;
-      final core::int* #t94 = #t92.{core::MapEntry::value} as{TypeError} core::int*;
-      #t91.{core::Map::[]=}(#t93, #t94);
+    final core::Map<core::num*, core::int*>* #t87 = <core::num*, core::int*>{};
+    for (final core::MapEntry<dynamic, dynamic>* #t88 in mapIntNum.{core::Map::entries}) {
+      final core::num* #t89 = #t88.{core::MapEntry::key} as{TypeError} core::num*;
+      final core::int* #t90 = #t88.{core::MapEntry::value} as{TypeError} core::int*;
+      #t87.{core::Map::[]=}{Invariant}(#t89, #t90);
+    }
+  } =>#t87;
+  core::List<core::int*>* list110 = block {
+    final core::List<core::int*>* #t91 = <core::int*>[];
+    for (final dynamic #t92 in dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*) {
+      final core::int* #t93 = #t92 as{TypeError} core::int*;
+      #t91.{core::List::add}{Invariant}(#t93);
     }
   } =>#t91;
-  core::List<core::int*>* list110 = block {
-    final core::List<core::int*>* #t95 = <core::int*>[];
-    for (final dynamic #t96 in dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*) {
-      final core::int* #t97 = #t96 as{TypeError} core::int*;
-      #t95.{core::List::add}(#t97);
-    }
-  } =>#t95;
   core::Map<core::num*, core::int*>* map110 = block {
-    final core::Map<core::num*, core::int*>* #t98 = <core::num*, core::int*>{};
-    for (final core::MapEntry<dynamic, dynamic>* #t99 in (dynVar as{TypeError,ForDynamic} core::Map<dynamic, dynamic>*).{core::Map::entries}) {
-      final core::num* #t100 = #t99.{core::MapEntry::key} as{TypeError} core::num*;
-      final core::int* #t101 = #t99.{core::MapEntry::value} as{TypeError} core::int*;
-      #t98.{core::Map::[]=}(#t100, #t101);
+    final core::Map<core::num*, core::int*>* #t94 = <core::num*, core::int*>{};
+    for (final core::MapEntry<dynamic, dynamic>* #t95 in (dynVar as{TypeError,ForDynamic} core::Map<dynamic, dynamic>*).{core::Map::entries}) {
+      final core::num* #t96 = #t95.{core::MapEntry::key} as{TypeError} core::num*;
+      final core::int* #t97 = #t95.{core::MapEntry::value} as{TypeError} core::int*;
+      #t94.{core::Map::[]=}{Invariant}(#t96, #t97);
     }
-  } =>#t98;
+  } =>#t94;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/spread_collection_inference.dart.strong.transformed.expect b/pkg/front_end/testcases/general/spread_collection_inference.dart.strong.transformed.expect
index 477502d..6ecdd84 100644
--- a/pkg/front_end/testcases/general/spread_collection_inference.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/spread_collection_inference.dart.strong.transformed.expect
@@ -115,7 +115,7 @@
       core::Iterator<dynamic>* :sync-for-iterator = <dynamic>[].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final dynamic #t2 = :sync-for-iterator.{core::Iterator::current};
-        #t1.{core::List::add}(#t2);
+        #t1.{core::List::add}{Invariant}(#t2);
       }
     }
   } =>#t1;
@@ -125,7 +125,7 @@
       core::Iterator<dynamic>* :sync-for-iterator = <dynamic>[].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final dynamic #t4 = :sync-for-iterator.{core::Iterator::current};
-        #t3.{core::Set::add}(#t4);
+        #t3.{core::Set::add}{Invariant}(#t4);
       }
     }
   } =>#t3;
@@ -135,7 +135,7 @@
       core::Iterator<core::MapEntry<dynamic, dynamic>>* :sync-for-iterator = <dynamic, dynamic>{}.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::MapEntry<dynamic, dynamic>* #t6 = :sync-for-iterator.{core::Iterator::current};
-        #t5.{core::Map::[]=}(#t6.{core::MapEntry::key}, #t6.{core::MapEntry::value});
+        #t5.{core::Map::[]=}{Invariant}(#t6.{core::MapEntry::key}, #t6.{core::MapEntry::value});
       }
     }
   } =>#t5;
@@ -145,7 +145,7 @@
       core::Iterator<core::MapEntry<dynamic, dynamic>>* :sync-for-iterator = <dynamic, dynamic>{}.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::MapEntry<dynamic, dynamic>* #t8 = :sync-for-iterator.{core::Iterator::current};
-        #t7.{core::Map::[]=}(#t8.{core::MapEntry::key}, #t8.{core::MapEntry::value});
+        #t7.{core::Map::[]=}{Invariant}(#t8.{core::MapEntry::key}, #t8.{core::MapEntry::value});
       }
     }
   } =>#t7;
@@ -155,7 +155,7 @@
       core::Iterator<core::int*>* :sync-for-iterator = spread.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::int* #t10 = :sync-for-iterator.{core::Iterator::current};
-        #t9.{core::List::add}(#t10);
+        #t9.{core::List::add}{Invariant}(#t10);
       }
     }
   } =>#t9;
@@ -165,10 +165,10 @@
       core::Iterator<core::int*>* :sync-for-iterator = spread.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::int* #t12 = :sync-for-iterator.{core::Iterator::current};
-        #t11.{core::Set::add}(#t12);
+        #t11.{core::Set::add}{Invariant}(#t12);
       }
     }
-    #t11.{core::Set::add}(42);
+    #t11.{core::Set::add}{Invariant}(42);
   } =>#t11;
   core::Set<core::int*>* set20ambiguous = block {
     final core::Set<core::int*>* #t13 = new col::_CompactLinkedHashSet::•<core::int*>();
@@ -178,7 +178,7 @@
         final dynamic #t14 = :sync-for-iterator.{core::Iterator::current};
         {
           final core::int* #t15 = #t14 as{TypeError} core::int*;
-          #t13.{core::Set::add}(#t15);
+          #t13.{core::Set::add}{Invariant}(#t15);
         }
       }
     }
@@ -189,10 +189,10 @@
       core::Iterator<core::MapEntry<core::String*, core::int*>>* :sync-for-iterator = mapSpread.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::MapEntry<core::String*, core::int*>* #t17 = :sync-for-iterator.{core::Iterator::current};
-        #t16.{core::Map::[]=}(#t17.{core::MapEntry::key}, #t17.{core::MapEntry::value});
+        #t16.{core::Map::[]=}{Invariant}(#t17.{core::MapEntry::key}, #t17.{core::MapEntry::value});
       }
     }
-    #t16.{core::Map::[]=}("baz", 42);
+    #t16.{core::Map::[]=}{Invariant}("baz", 42);
   } =>#t16;
   core::Map<core::String*, core::int*>* map20ambiguous = block {
     final core::Map<core::String*, core::int*>* #t18 = <core::String*, core::int*>{};
@@ -200,7 +200,7 @@
       core::Iterator<core::MapEntry<core::String*, core::int*>>* :sync-for-iterator = mapSpread.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::MapEntry<core::String*, core::int*>* #t19 = :sync-for-iterator.{core::Iterator::current};
-        #t18.{core::Map::[]=}(#t19.{core::MapEntry::key}, #t19.{core::MapEntry::value});
+        #t18.{core::Map::[]=}{Invariant}(#t19.{core::MapEntry::key}, #t19.{core::MapEntry::value});
       }
     }
   } =>#t18;
@@ -210,7 +210,7 @@
       core::Iterator<dynamic>* :sync-for-iterator = ((spread as dynamic) as{TypeError,ForDynamic} core::Iterable<dynamic>*).{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final dynamic #t21 = :sync-for-iterator.{core::Iterator::current};
-        #t20.{core::List::add}(#t21);
+        #t20.{core::List::add}{Invariant}(#t21);
       }
     }
   } =>#t20;
@@ -220,10 +220,10 @@
       core::Iterator<dynamic>* :sync-for-iterator = ((spread as dynamic) as{TypeError,ForDynamic} core::Iterable<dynamic>*).{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final dynamic #t23 = :sync-for-iterator.{core::Iterator::current};
-        #t22.{core::Set::add}(#t23);
+        #t22.{core::Set::add}{Invariant}(#t23);
       }
     }
-    #t22.{core::Set::add}(42);
+    #t22.{core::Set::add}{Invariant}(42);
   } =>#t22;
   core::Map<dynamic, dynamic>* map21 = block {
     final core::Map<dynamic, dynamic>* #t24 = <dynamic, dynamic>{};
@@ -231,10 +231,10 @@
       core::Iterator<core::MapEntry<dynamic, dynamic>>* :sync-for-iterator = ((mapSpread as dynamic) as{TypeError,ForDynamic} core::Map<dynamic, dynamic>*).{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::MapEntry<dynamic, dynamic>* #t25 = :sync-for-iterator.{core::Iterator::current};
-        #t24.{core::Map::[]=}(#t25.{core::MapEntry::key}, #t25.{core::MapEntry::value});
+        #t24.{core::Map::[]=}{Invariant}(#t25.{core::MapEntry::key}, #t25.{core::MapEntry::value});
       }
     }
-    #t24.{core::Map::[]=}("baz", 42);
+    #t24.{core::Map::[]=}{Invariant}("baz", 42);
   } =>#t24;
   dynamic map21ambiguous = invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:64:28: Error: Not enough type information to disambiguate between literal set and literal map.
 Try providing type arguments for the literal explicitly to disambiguate it.
@@ -246,7 +246,7 @@
       core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::int* #t27 = :sync-for-iterator.{core::Iterator::current};
-        #t26.{core::List::add}(#t27);
+        #t26.{core::List::add}{Invariant}(#t27);
       }
     }
   } =>#t26;
@@ -256,10 +256,10 @@
       core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::int* #t29 = :sync-for-iterator.{core::Iterator::current};
-        #t28.{core::Set::add}(#t29);
+        #t28.{core::Set::add}{Invariant}(#t29);
       }
     }
-    #t28.{core::Set::add}(42);
+    #t28.{core::Set::add}{Invariant}(42);
   } =>#t28;
   core::Set<core::int*>* set22ambiguous = block {
     final core::Set<core::int*>* #t30 = new col::_CompactLinkedHashSet::•<core::int*>();
@@ -269,7 +269,7 @@
         final dynamic #t31 = :sync-for-iterator.{core::Iterator::current};
         {
           final core::int* #t32 = #t31 as{TypeError} core::int*;
-          #t30.{core::Set::add}(#t32);
+          #t30.{core::Set::add}{Invariant}(#t32);
         }
       }
     }
@@ -280,7 +280,7 @@
       core::Iterator<core::MapEntry<core::String*, core::int*>>* :sync-for-iterator = <core::String*, core::int*>{}.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::MapEntry<core::String*, core::int*>* #t34 = :sync-for-iterator.{core::Iterator::current};
-        #t33.{core::Map::[]=}(#t34.{core::MapEntry::key}, #t34.{core::MapEntry::value});
+        #t33.{core::Map::[]=}{Invariant}(#t34.{core::MapEntry::key}, #t34.{core::MapEntry::value});
       }
     }
   } =>#t33;
@@ -290,7 +290,7 @@
       core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::List<core::int*>* #t36 = :sync-for-iterator.{core::Iterator::current};
-        #t35.{core::List::add}(#t36);
+        #t35.{core::List::add}{Invariant}(#t36);
       }
     }
   } =>#t35;
@@ -300,10 +300,10 @@
       core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::List<core::int*>* #t38 = :sync-for-iterator.{core::Iterator::current};
-        #t37.{core::Set::add}(#t38);
+        #t37.{core::Set::add}{Invariant}(#t38);
       }
     }
-    #t37.{core::Set::add}(<core::int*>[42]);
+    #t37.{core::Set::add}{Invariant}(<core::int*>[42]);
   } =>#t37;
   core::Set<core::List<core::int*>*>* set23ambiguous = block {
     final core::Set<core::List<core::int*>*>* #t39 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
@@ -313,7 +313,7 @@
         final dynamic #t40 = :sync-for-iterator.{core::Iterator::current};
         {
           final core::List<core::int*>* #t41 = #t40 as{TypeError} core::List<core::int*>*;
-          #t39.{core::Set::add}(#t41);
+          #t39.{core::Set::add}{Invariant}(#t41);
         }
       }
     }
@@ -324,7 +324,7 @@
       core::Iterator<core::MapEntry<core::String*, core::List<core::int*>*>>* :sync-for-iterator = <core::String*, core::List<core::int*>*>{"baz": <core::int*>[]}.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::MapEntry<core::String*, core::List<core::int*>*>* #t43 = :sync-for-iterator.{core::Iterator::current};
-        #t42.{core::Map::[]=}(#t43.{core::MapEntry::key}, #t43.{core::MapEntry::value});
+        #t42.{core::Map::[]=}{Invariant}(#t43.{core::MapEntry::key}, #t43.{core::MapEntry::value});
       }
     }
   } =>#t42;
@@ -340,7 +340,7 @@
       core::Iterator<core::int*>* :sync-for-iterator = spread.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::int* #t46 = :sync-for-iterator.{core::Iterator::current};
-        #t45.{core::List::add}(#t46);
+        #t45.{core::List::add}{Invariant}(#t46);
       }
     }
   } =>#t45) as{TypeError} core::int*;
@@ -353,10 +353,10 @@
       core::Iterator<core::int*>* :sync-for-iterator = spread.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::int* #t49 = :sync-for-iterator.{core::Iterator::current};
-        #t48.{core::Set::add}(#t49);
+        #t48.{core::Set::add}{Invariant}(#t49);
       }
     }
-    #t48.{core::Set::add}(42);
+    #t48.{core::Set::add}{Invariant}(42);
   } =>#t48) as{TypeError} core::int*;
   core::int* set30ambiguous = let final<BottomType> #t50 = invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:103:7: Error: A value of type 'Set<int>' can't be assigned to a variable of type 'int'.
  - 'Set' is from 'dart:core'.
@@ -369,7 +369,7 @@
         final dynamic #t52 = :sync-for-iterator.{core::Iterator::current};
         {
           final core::int* #t53 = #t52 as{TypeError} core::int*;
-          #t51.{core::Set::add}(#t53);
+          #t51.{core::Set::add}{Invariant}(#t53);
         }
       }
     }
@@ -383,10 +383,10 @@
       core::Iterator<core::MapEntry<core::String*, core::int*>>* :sync-for-iterator = mapSpread.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::MapEntry<core::String*, core::int*>* #t56 = :sync-for-iterator.{core::Iterator::current};
-        #t55.{core::Map::[]=}(#t56.{core::MapEntry::key}, #t56.{core::MapEntry::value});
+        #t55.{core::Map::[]=}{Invariant}(#t56.{core::MapEntry::key}, #t56.{core::MapEntry::value});
       }
     }
-    #t55.{core::Map::[]=}("baz", 42);
+    #t55.{core::Map::[]=}{Invariant}("baz", 42);
   } =>#t55) as{TypeError} core::int*;
   core::int* map30ambiguous = let final<BottomType> #t57 = invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:109:7: Error: A value of type 'Map<String, int>' can't be assigned to a variable of type 'int'.
  - 'Map' is from 'dart:core'.
@@ -397,34 +397,43 @@
       core::Iterator<core::MapEntry<core::String*, core::int*>>* :sync-for-iterator = mapSpread.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::MapEntry<core::String*, core::int*>* #t59 = :sync-for-iterator.{core::Iterator::current};
-        #t58.{core::Map::[]=}(#t59.{core::MapEntry::key}, #t59.{core::MapEntry::value});
+        #t58.{core::Map::[]=}{Invariant}(#t59.{core::MapEntry::key}, #t59.{core::MapEntry::value});
       }
     }
   } =>#t58) as{TypeError} core::int*;
   core::List<dynamic>* lhs40 = <dynamic>[invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:111:38: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
   List<dynamic> lhs40 = <dynamic>[...notSpreadInt];
                                      ^"];
-  core::Set<dynamic>* set40 = let final core::Set<dynamic>* #t60 = new col::_CompactLinkedHashSet::•<dynamic>() in let final core::bool #t61 = #t60.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:113:37: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
+  core::Set<dynamic>* set40 = block {
+    final core::Set<dynamic>* #t60 = new col::_CompactLinkedHashSet::•<dynamic>();
+    #t60.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:113:37: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
   Set<dynamic> set40 = <dynamic>{...notSpreadInt};
-                                    ^") in #t60;
+                                    ^");
+  } =>#t60;
   core::Map<dynamic, dynamic>* map40 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:115:55: Error: Unexpected type 'int' of a map spread entry.  Expected 'dynamic' or a Map.
   Map<dynamic, dynamic> map40 = <dynamic, dynamic>{...notSpreadInt};
                                                       ^": null};
   core::List<dynamic>* lhs50 = <dynamic>[invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:117:38: Error: Unexpected type 'int Function()' of a spread.  Expected 'dynamic' or an Iterable.
   List<dynamic> lhs50 = <dynamic>[...notSpreadFunction];
                                      ^"];
-  core::Set<dynamic>* set50 = let final core::Set<dynamic>* #t62 = new col::_CompactLinkedHashSet::•<dynamic>() in let final core::bool #t63 = #t62.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:119:37: Error: Unexpected type 'int Function()' of a spread.  Expected 'dynamic' or an Iterable.
+  core::Set<dynamic>* set50 = block {
+    final core::Set<dynamic>* #t61 = new col::_CompactLinkedHashSet::•<dynamic>();
+    #t61.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:119:37: Error: Unexpected type 'int Function()' of a spread.  Expected 'dynamic' or an Iterable.
   Set<dynamic> set50 = <dynamic>{...notSpreadFunction};
-                                    ^") in #t62;
+                                    ^");
+  } =>#t61;
   core::Map<dynamic, dynamic>* map50 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:121:55: Error: Unexpected type 'int Function()' of a map spread entry.  Expected 'dynamic' or a Map.
   Map<dynamic, dynamic> map50 = <dynamic, dynamic>{...notSpreadFunction};
                                                       ^": null};
   core::List<core::String*>* lhs60 = <core::String*>[invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:123:36: Error: Can't assign spread elements of type 'int' to collection elements of type 'String'.
   List<String> lhs60 = <String>[...spread];
                                    ^"];
-  core::Set<core::String*>* set60 = let final core::Set<core::String*>* #t64 = new col::_CompactLinkedHashSet::•<core::String*>() in let final core::bool #t65 = #t64.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:125:35: Error: Can't assign spread elements of type 'int' to collection elements of type 'String'.
+  core::Set<core::String*>* set60 = block {
+    final core::Set<core::String*>* #t62 = new col::_CompactLinkedHashSet::•<core::String*>();
+    #t62.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:125:35: Error: Can't assign spread elements of type 'int' to collection elements of type 'String'.
   Set<String> set60 = <String>{...spread};
-                                  ^") in #t64;
+                                  ^");
+  } =>#t62;
   core::Map<core::int*, core::int*>* map60 = <core::int*, core::int*>{invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:127:39: Error: Can't assign spread entry keys of type 'String' to map entry keys of type 'int'.
   Map<int, int> map60 = <int, int>{...mapSpread};
                                       ^": null};
@@ -434,148 +443,151 @@
   core::List<core::int*>* lhs70 = <core::int*>[invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:131:30: Error: Can't spread a value with static type 'Null'.
   List<int> lhs70 = <int>[...null];
                              ^"];
-  core::Set<core::int*>* set70 = let final core::Set<core::int*>* #t66 = new col::_CompactLinkedHashSet::•<core::int*>() in let final core::bool #t67 = #t66.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:133:29: Error: Can't spread a value with static type 'Null'.
+  core::Set<core::int*>* set70 = block {
+    final core::Set<core::int*>* #t63 = new col::_CompactLinkedHashSet::•<core::int*>();
+    #t63.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:133:29: Error: Can't spread a value with static type 'Null'.
   Set<int> set70 = <int>{...null};
-                            ^") in #t66;
+                            ^");
+  } =>#t63;
   core::Set<dynamic>* set71ambiguous = block {
-    final core::Set<dynamic>* #t68 = new col::_CompactLinkedHashSet::•<dynamic>();
-    #t68.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:137:8: Error: Expected ',' before this.
+    final core::Set<dynamic>* #t64 = new col::_CompactLinkedHashSet::•<dynamic>();
+    #t64.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:137:8: Error: Expected ',' before this.
     ...null,
        ^");
     {
       core::Iterator<dynamic>* :sync-for-iterator = <dynamic>[].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final dynamic #t69 = :sync-for-iterator.{core::Iterator::current};
+        final dynamic #t65 = :sync-for-iterator.{core::Iterator::current};
         {
-          final dynamic #t70 = #t69 as{TypeError} dynamic;
-          #t68.{core::Set::add}(#t70);
+          final dynamic #t66 = #t65 as{TypeError} dynamic;
+          #t64.{core::Set::add}{Invariant}(#t66);
         }
       }
     }
-  } =>#t68;
+  } =>#t64;
   core::Map<core::String*, core::int*>* map70 = <core::String*, core::int*>{invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:142:45: Error: Can't spread a value with static type 'Null'.
   Map<String, int> map70 = <String, int>{...null};
                                             ^": null};
   core::List<core::int*>* lhs80 = block {
-    final core::List<core::int*>* #t71 = <core::int*>[];
-    final core::Iterable<core::int*>* #t72 = null;
-    if(!#t72.{core::Object::==}(null)) {
-      core::Iterator<core::int*>* :sync-for-iterator = #t72.{core::Iterable::iterator};
+    final core::List<core::int*>* #t67 = <core::int*>[];
+    final core::Iterable<core::int*>* #t68 = null;
+    if(!#t68.{core::Object::==}(null)) {
+      core::Iterator<core::int*>* :sync-for-iterator = #t68.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::int* #t73 = :sync-for-iterator.{core::Iterator::current};
-        #t71.{core::List::add}(#t73);
+        final core::int* #t69 = :sync-for-iterator.{core::Iterator::current};
+        #t67.{core::List::add}{Invariant}(#t69);
       }
     }
-  } =>#t71;
+  } =>#t67;
   core::Set<core::int*>* set80 = block {
-    final core::Set<core::int*>* #t74 = new col::_CompactLinkedHashSet::•<core::int*>();
-    final core::Iterable<core::int*>* #t75 = null;
-    if(!#t75.{core::Object::==}(null)) {
-      core::Iterator<core::int*>* :sync-for-iterator = #t75.{core::Iterable::iterator};
+    final core::Set<core::int*>* #t70 = new col::_CompactLinkedHashSet::•<core::int*>();
+    final core::Iterable<core::int*>* #t71 = null;
+    if(!#t71.{core::Object::==}(null)) {
+      core::Iterator<core::int*>* :sync-for-iterator = #t71.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::int* #t76 = :sync-for-iterator.{core::Iterator::current};
-        #t74.{core::Set::add}(#t76);
+        final core::int* #t72 = :sync-for-iterator.{core::Iterator::current};
+        #t70.{core::Set::add}{Invariant}(#t72);
       }
     }
-  } =>#t74;
+  } =>#t70;
   core::Set<dynamic>* set81ambiguous = block {
-    final core::Set<dynamic>* #t77 = new col::_CompactLinkedHashSet::•<dynamic>();
-    final core::Iterable<dynamic>* #t78 = null;
-    if(!#t78.{core::Object::==}(null)) {
-      core::Iterator<dynamic>* :sync-for-iterator = #t78.{core::Iterable::iterator};
+    final core::Set<dynamic>* #t73 = new col::_CompactLinkedHashSet::•<dynamic>();
+    final core::Iterable<dynamic>* #t74 = null;
+    if(!#t74.{core::Object::==}(null)) {
+      core::Iterator<dynamic>* :sync-for-iterator = #t74.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final dynamic #t79 = :sync-for-iterator.{core::Iterator::current};
+        final dynamic #t75 = :sync-for-iterator.{core::Iterator::current};
         {
-          final dynamic #t80 = #t79 as{TypeError} dynamic;
-          #t77.{core::Set::add}(#t80);
+          final dynamic #t76 = #t75 as{TypeError} dynamic;
+          #t73.{core::Set::add}{Invariant}(#t76);
         }
       }
     }
     {
       core::Iterator<dynamic>* :sync-for-iterator = <dynamic>[].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final dynamic #t81 = :sync-for-iterator.{core::Iterator::current};
+        final dynamic #t77 = :sync-for-iterator.{core::Iterator::current};
         {
-          final dynamic #t82 = #t81 as{TypeError} dynamic;
-          #t77.{core::Set::add}(#t82);
+          final dynamic #t78 = #t77 as{TypeError} dynamic;
+          #t73.{core::Set::add}{Invariant}(#t78);
         }
       }
     }
-  } =>#t77;
+  } =>#t73;
   core::Map<core::String*, core::int*>* map80 = block {
-    final core::Map<core::String*, core::int*>* #t83 = <core::String*, core::int*>{};
-    final core::Map<core::String*, core::int*>* #t84 = null;
-    if(!#t84.{core::Object::==}(null)) {
-      core::Iterator<core::MapEntry<core::String*, core::int*>>* :sync-for-iterator = #t84.{core::Map::entries}.{core::Iterable::iterator};
+    final core::Map<core::String*, core::int*>* #t79 = <core::String*, core::int*>{};
+    final core::Map<core::String*, core::int*>* #t80 = null;
+    if(!#t80.{core::Object::==}(null)) {
+      core::Iterator<core::MapEntry<core::String*, core::int*>>* :sync-for-iterator = #t80.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::MapEntry<core::String*, core::int*>* #t85 = :sync-for-iterator.{core::Iterator::current};
-        #t83.{core::Map::[]=}(#t85.{core::MapEntry::key}, #t85.{core::MapEntry::value});
+        final core::MapEntry<core::String*, core::int*>* #t81 = :sync-for-iterator.{core::Iterator::current};
+        #t79.{core::Map::[]=}{Invariant}(#t81.{core::MapEntry::key}, #t81.{core::MapEntry::value});
       }
     }
-  } =>#t83;
+  } =>#t79;
   core::Map<core::String*, core::int*>* map90 = block {
-    final core::Map<core::String*, core::int*>* #t86 = <core::String*, core::int*>{};
+    final core::Map<core::String*, core::int*>* #t82 = <core::String*, core::int*>{};
     {
       core::Iterator<core::MapEntry<core::String*, core::int*>>* :sync-for-iterator = self::bar<core::String*, core::int*>().{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::MapEntry<core::String*, core::int*>* #t87 = :sync-for-iterator.{core::Iterator::current};
-        #t86.{core::Map::[]=}(#t87.{core::MapEntry::key}, #t87.{core::MapEntry::value});
+        final core::MapEntry<core::String*, core::int*>* #t83 = :sync-for-iterator.{core::Iterator::current};
+        #t82.{core::Map::[]=}{Invariant}(#t83.{core::MapEntry::key}, #t83.{core::MapEntry::value});
       }
     }
-  } =>#t86;
+  } =>#t82;
   core::List<core::int*>* list100 = block {
-    final core::List<core::int*>* #t88 = <core::int*>[];
+    final core::List<core::int*>* #t84 = <core::int*>[];
     {
       core::Iterator<core::num*>* :sync-for-iterator = listNum.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final dynamic #t89 = :sync-for-iterator.{core::Iterator::current};
+        final dynamic #t85 = :sync-for-iterator.{core::Iterator::current};
         {
-          final core::int* #t90 = #t89 as{TypeError} core::int*;
-          #t88.{core::List::add}(#t90);
+          final core::int* #t86 = #t85 as{TypeError} core::int*;
+          #t84.{core::List::add}{Invariant}(#t86);
         }
       }
     }
-  } =>#t88;
+  } =>#t84;
   core::Map<core::num*, core::int*>* map100 = block {
-    final core::Map<core::num*, core::int*>* #t91 = <core::num*, core::int*>{};
+    final core::Map<core::num*, core::int*>* #t87 = <core::num*, core::int*>{};
     {
       core::Iterator<core::MapEntry<core::int*, core::num*>>* :sync-for-iterator = mapIntNum.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::MapEntry<dynamic, dynamic>* #t92 = :sync-for-iterator.{core::Iterator::current};
+        final core::MapEntry<dynamic, dynamic>* #t88 = :sync-for-iterator.{core::Iterator::current};
         {
-          final core::num* #t93 = #t92.{core::MapEntry::key} as{TypeError} core::num*;
-          final core::int* #t94 = #t92.{core::MapEntry::value} as{TypeError} core::int*;
-          #t91.{core::Map::[]=}(#t93, #t94);
+          final core::num* #t89 = #t88.{core::MapEntry::key} as{TypeError} core::num*;
+          final core::int* #t90 = #t88.{core::MapEntry::value} as{TypeError} core::int*;
+          #t87.{core::Map::[]=}{Invariant}(#t89, #t90);
+        }
+      }
+    }
+  } =>#t87;
+  core::List<core::int*>* list110 = block {
+    final core::List<core::int*>* #t91 = <core::int*>[];
+    {
+      core::Iterator<dynamic>* :sync-for-iterator = (dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final dynamic #t92 = :sync-for-iterator.{core::Iterator::current};
+        {
+          final core::int* #t93 = #t92 as{TypeError} core::int*;
+          #t91.{core::List::add}{Invariant}(#t93);
         }
       }
     }
   } =>#t91;
-  core::List<core::int*>* list110 = block {
-    final core::List<core::int*>* #t95 = <core::int*>[];
-    {
-      core::Iterator<dynamic>* :sync-for-iterator = (dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*).{core::Iterable::iterator};
-      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final dynamic #t96 = :sync-for-iterator.{core::Iterator::current};
-        {
-          final core::int* #t97 = #t96 as{TypeError} core::int*;
-          #t95.{core::List::add}(#t97);
-        }
-      }
-    }
-  } =>#t95;
   core::Map<core::num*, core::int*>* map110 = block {
-    final core::Map<core::num*, core::int*>* #t98 = <core::num*, core::int*>{};
+    final core::Map<core::num*, core::int*>* #t94 = <core::num*, core::int*>{};
     {
       core::Iterator<core::MapEntry<dynamic, dynamic>>* :sync-for-iterator = (dynVar as{TypeError,ForDynamic} core::Map<dynamic, dynamic>*).{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::MapEntry<dynamic, dynamic>* #t99 = :sync-for-iterator.{core::Iterator::current};
+        final core::MapEntry<dynamic, dynamic>* #t95 = :sync-for-iterator.{core::Iterator::current};
         {
-          final core::num* #t100 = #t99.{core::MapEntry::key} as{TypeError} core::num*;
-          final core::int* #t101 = #t99.{core::MapEntry::value} as{TypeError} core::int*;
-          #t98.{core::Map::[]=}(#t100, #t101);
+          final core::num* #t96 = #t95.{core::MapEntry::key} as{TypeError} core::num*;
+          final core::int* #t97 = #t95.{core::MapEntry::value} as{TypeError} core::int*;
+          #t94.{core::Map::[]=}{Invariant}(#t96, #t97);
         }
       }
     }
-  } =>#t98;
+  } =>#t94;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/statements.dart.strong.transformed.expect b/pkg/front_end/testcases/general/statements.dart.strong.transformed.expect
index 7200685b..a02506d 100644
--- a/pkg/front_end/testcases/general/statements.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/statements.dart.strong.transformed.expect
@@ -32,7 +32,6 @@
         {
           {
             asy::Stream<dynamic>* :stream = d as{TypeError,ForDynamic} asy::Stream<dynamic>*;
-            asy::_asyncStarListenHelper(:stream, :async_op);
             asy::_StreamIterator<dynamic>* :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
             try
               #L2:
diff --git a/pkg/front_end/testcases/general/stream_future.dart.strong.transformed.expect b/pkg/front_end/testcases/general/stream_future.dart.strong.transformed.expect
index 3505854..97bf589 100644
--- a/pkg/front_end/testcases/general/stream_future.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/stream_future.dart.strong.transformed.expect
@@ -35,7 +35,8 @@
 static method returnClass() → self::Class*
   return new self::Class::•();
 static method returnFutureDynamic() → asy::Future<dynamic>* /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic>* :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -49,20 +50,22 @@
         :return_value = new self::Class::•();
         break #L1;
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method returnFutureClass() → asy::Future<self::Class*>* /* originally async */ {
-  final asy::_AsyncAwaitCompleter<self::Class*>* :async_completer = new asy::_AsyncAwaitCompleter::•<self::Class*>();
+  final asy::_Future<self::Class*>* :async_future = new asy::_Future::•<self::Class*>();
+  core::bool* :is_sync = false;
   FutureOr<self::Class*>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -76,17 +79,18 @@
         :return_value = new self::Class::•();
         break #L2;
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method error() → asy::Stream<FutureOr<self::Class*>*>* /* originally async* */ {
   asy::_AsyncStarStreamController<FutureOr<self::Class*>*>* :controller;
@@ -171,7 +175,8 @@
   return :controller_stream;
 }
 static method main() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic>* :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -188,7 +193,6 @@
       {
         {
           asy::Stream<FutureOr<self::Class*>*>* :stream = self::stream();
-          asy::_asyncStarListenHelper(:stream, :async_op);
           asy::_StreamIterator<FutureOr<self::Class*>*>* :for-iterator = new asy::_StreamIterator::•<FutureOr<self::Class*>*>(:stream);
           try
             #L6:
@@ -211,15 +215,16 @@
             }
         }
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
diff --git a/pkg/front_end/testcases/general/super_access_in_initializer.dart b/pkg/front_end/testcases/general/super_access_in_initializer.dart
new file mode 100644
index 0000000..2bab9f4
--- /dev/null
+++ b/pkg/front_end/testcases/general/super_access_in_initializer.dart
@@ -0,0 +1,22 @@
+// Copyright (c) 2020, 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.
+
+class Super {
+  bool get property => true;
+
+  Super(bool value);
+}
+
+class Class extends Super {
+  bool field;
+
+  Class(bool value)
+      : assert(property),
+        this.field = property,
+        super(property);
+
+  Class.redirect() : this(property);
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/super_access_in_initializer.dart.outline.expect b/pkg/front_end/testcases/general/super_access_in_initializer.dart.outline.expect
new file mode 100644
index 0000000..3b22099
--- /dev/null
+++ b/pkg/front_end/testcases/general/super_access_in_initializer.dart.outline.expect
@@ -0,0 +1,29 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Super extends core::Object {
+  constructor •(core::bool* value) → self::Super*
+    ;
+  get property() → core::bool*
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Class extends self::Super {
+  field core::bool* field;
+  constructor •(core::bool* value) → self::Class*
+    ;
+  constructor redirect() → self::Class*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/super_access_in_initializer.dart.strong.expect b/pkg/front_end/testcases/general/super_access_in_initializer.dart.strong.expect
new file mode 100644
index 0000000..690c624
--- /dev/null
+++ b/pkg/front_end/testcases/general/super_access_in_initializer.dart.strong.expect
@@ -0,0 +1,58 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/super_access_in_initializer.dart:15:16: Error: Getter not found: 'property'.
+//       : assert(property),
+//                ^^^^^^^^
+//
+// pkg/front_end/testcases/general/super_access_in_initializer.dart:16:22: Error: Getter not found: 'property'.
+//         this.field = property,
+//                      ^^^^^^^^
+//
+// pkg/front_end/testcases/general/super_access_in_initializer.dart:17:15: Error: Getter not found: 'property'.
+//         super(property);
+//               ^^^^^^^^
+//
+// pkg/front_end/testcases/general/super_access_in_initializer.dart:19:27: Error: Getter not found: 'property'.
+//   Class.redirect() : this(property);
+//                           ^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Super extends core::Object {
+  constructor •(core::bool* value) → self::Super*
+    : super core::Object::•()
+    ;
+  get property() → core::bool*
+    return true;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Class extends self::Super {
+  field core::bool* field;
+  constructor •(core::bool* value) → self::Class*
+    : assert(invalid-expression "pkg/front_end/testcases/general/super_access_in_initializer.dart:15:16: Error: Getter not found: 'property'.
+      : assert(property),
+               ^^^^^^^^" as{TypeError,ForDynamic} core::bool*), self::Class::field = invalid-expression "pkg/front_end/testcases/general/super_access_in_initializer.dart:16:22: Error: Getter not found: 'property'.
+        this.field = property,
+                     ^^^^^^^^" as{TypeError,ForDynamic} core::bool*, super self::Super::•(invalid-expression "pkg/front_end/testcases/general/super_access_in_initializer.dart:17:15: Error: Getter not found: 'property'.
+        super(property);
+              ^^^^^^^^" as{TypeError,ForDynamic} core::bool*)
+    ;
+  constructor redirect() → self::Class*
+    : this self::Class::•(invalid-expression "pkg/front_end/testcases/general/super_access_in_initializer.dart:19:27: Error: Getter not found: 'property'.
+  Class.redirect() : this(property);
+                          ^^^^^^^^" as{TypeError,ForDynamic} core::bool*)
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/super_access_in_initializer.dart.strong.transformed.expect b/pkg/front_end/testcases/general/super_access_in_initializer.dart.strong.transformed.expect
new file mode 100644
index 0000000..57f7ead
--- /dev/null
+++ b/pkg/front_end/testcases/general/super_access_in_initializer.dart.strong.transformed.expect
@@ -0,0 +1,58 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/super_access_in_initializer.dart:15:16: Error: Getter not found: 'property'.
+//       : assert(property),
+//                ^^^^^^^^
+//
+// pkg/front_end/testcases/general/super_access_in_initializer.dart:16:22: Error: Getter not found: 'property'.
+//         this.field = property,
+//                      ^^^^^^^^
+//
+// pkg/front_end/testcases/general/super_access_in_initializer.dart:17:15: Error: Getter not found: 'property'.
+//         super(property);
+//               ^^^^^^^^
+//
+// pkg/front_end/testcases/general/super_access_in_initializer.dart:19:27: Error: Getter not found: 'property'.
+//   Class.redirect() : this(property);
+//                           ^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Super extends core::Object {
+  constructor •(core::bool* value) → self::Super*
+    : super core::Object::•()
+    ;
+  get property() → core::bool*
+    return true;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Class extends self::Super {
+  field core::bool* field;
+  constructor •(core::bool* value) → self::Class*
+    : assert(invalid-expression "pkg/front_end/testcases/general/super_access_in_initializer.dart:15:16: Error: Getter not found: 'property'.
+      : assert(property),
+               ^^^^^^^^"), self::Class::field = invalid-expression "pkg/front_end/testcases/general/super_access_in_initializer.dart:16:22: Error: Getter not found: 'property'.
+        this.field = property,
+                     ^^^^^^^^", super self::Super::•(invalid-expression "pkg/front_end/testcases/general/super_access_in_initializer.dart:17:15: Error: Getter not found: 'property'.
+        super(property);
+              ^^^^^^^^")
+    ;
+  constructor redirect() → self::Class*
+    : this self::Class::•(invalid-expression "pkg/front_end/testcases/general/super_access_in_initializer.dart:19:27: Error: Getter not found: 'property'.
+  Class.redirect() : this(property);
+                          ^^^^^^^^")
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/super_access_in_initializer.dart.textual_outline.expect b/pkg/front_end/testcases/general/super_access_in_initializer.dart.textual_outline.expect
new file mode 100644
index 0000000..5548e99
--- /dev/null
+++ b/pkg/front_end/testcases/general/super_access_in_initializer.dart.textual_outline.expect
@@ -0,0 +1,15 @@
+class Super {
+  bool get property => true;
+  Super(bool value);
+}
+
+class Class extends Super {
+  bool field;
+  Class(bool value)
+      : assert(property),
+        this.field = property,
+        super(property);
+  Class.redirect() : this(property);
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/super_access_in_initializer.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/super_access_in_initializer.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..b009d58
--- /dev/null
+++ b/pkg/front_end/testcases/general/super_access_in_initializer.dart.textual_outline_modelled.expect
@@ -0,0 +1,15 @@
+class Class extends Super {
+  Class(bool value)
+      : assert(property),
+        this.field = property,
+        super(property);
+  Class.redirect() : this(property);
+  bool field;
+}
+
+class Super {
+  Super(bool value);
+  bool get property => true;
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/this_field_call.dart.strong.expect b/pkg/front_end/testcases/general/this_field_call.dart.strong.expect
index 68c19e6..28e7d76 100644
--- a/pkg/front_end/testcases/general/this_field_call.dart.strong.expect
+++ b/pkg/front_end/testcases/general/this_field_call.dart.strong.expect
@@ -21,5 +21,5 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 static method main() → dynamic {
-  new self::A::•<core::int*>((core::int* x) → core::Null? {}).{self::A::foo}(3);
+  new self::A::•<core::int*>((core::int* x) → Null {}).{self::A::foo}(3);
 }
diff --git a/pkg/front_end/testcases/general/this_field_call.dart.strong.transformed.expect b/pkg/front_end/testcases/general/this_field_call.dart.strong.transformed.expect
index 68c19e6..28e7d76 100644
--- a/pkg/front_end/testcases/general/this_field_call.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/this_field_call.dart.strong.transformed.expect
@@ -21,5 +21,5 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 static method main() → dynamic {
-  new self::A::•<core::int*>((core::int* x) → core::Null? {}).{self::A::foo}(3);
+  new self::A::•<core::int*>((core::int* x) → Null {}).{self::A::foo}(3);
 }
diff --git a/pkg/front_end/testcases/top_level_variance_test.dart b/pkg/front_end/testcases/general/top_level_variance_test.dart
similarity index 100%
rename from pkg/front_end/testcases/top_level_variance_test.dart
rename to pkg/front_end/testcases/general/top_level_variance_test.dart
diff --git a/pkg/front_end/testcases/top_level_variance_test.dart.hierarchy.expect b/pkg/front_end/testcases/general/top_level_variance_test.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/top_level_variance_test.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/top_level_variance_test.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/top_level_variance_test.dart.legacy.expect b/pkg/front_end/testcases/general/top_level_variance_test.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/top_level_variance_test.dart.legacy.expect
rename to pkg/front_end/testcases/general/top_level_variance_test.dart.legacy.expect
diff --git a/pkg/front_end/testcases/top_level_variance_test.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/top_level_variance_test.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/top_level_variance_test.dart.legacy.transformed.expect
rename to pkg/front_end/testcases/general/top_level_variance_test.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/general/top_level_variance_test.dart.outline.expect b/pkg/front_end/testcases/general/top_level_variance_test.dart.outline.expect
new file mode 100644
index 0000000..e79bd82
--- /dev/null
+++ b/pkg/front_end/testcases/general/top_level_variance_test.dart.outline.expect
@@ -0,0 +1,53 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef F<invariant X extends core::Object* = dynamic> = <Y extends X* = dynamic>() →* void;
+typedef Fcov<X extends core::Object* = dynamic> = () →* X*;
+typedef Fcon<contravariant X extends core::Object* = dynamic> = (X*) →* dynamic;
+typedef Finv<invariant X extends core::Object* = dynamic> = (X*) →* X*;
+typedef FcovBound<X extends core::num* = core::num*> = () →* X*;
+typedef FconBound<contravariant X extends core::num* = core::num*> = (X*) →* dynamic;
+typedef FinvBound<invariant X extends core::num* = core::num*> = (X*) →* X*;
+typedef FcovCyclicBound<X extends self::A<X*>* = self::A<dynamic>*> = () →* X*;
+typedef FconCyclicBound<contravariant X extends self::A<X*>* = self::A<Null>*> = (X*) →* dynamic;
+typedef FinvCyclicBound<invariant X extends self::A<X*>* = self::A<dynamic>*> = (X*) →* X*;
+typedef FcovCyclicCoBound<X extends (X*) →* dynamic = (Null) →* dynamic> = () →* X*;
+typedef FconCyclicCoBound<contravariant X extends (X*) →* dynamic = (dynamic) →* dynamic> = (X*) →* dynamic;
+typedef FinvCyclicCoBound<invariant X extends (X*) →* dynamic = (dynamic) →* dynamic> = (X*) →* X*;
+class A<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X*>*
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::X*>*
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method toF<X extends core::Object* = dynamic>(self::toF::X* x) → <Y extends self::toF::X* = dynamic>() →* void
+  ;
+static method testTopLevel() → void
+  ;
+static method testNested() → void
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/top_level_variance_test.dart.strong.expect b/pkg/front_end/testcases/general/top_level_variance_test.dart.strong.expect
new file mode 100644
index 0000000..b21e661
--- /dev/null
+++ b/pkg/front_end/testcases/general/top_level_variance_test.dart.strong.expect
@@ -0,0 +1,125 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef F<invariant X extends core::Object* = dynamic> = <Y extends X* = dynamic>() →* void;
+typedef Fcov<X extends core::Object* = dynamic> = () →* X*;
+typedef Fcon<contravariant X extends core::Object* = dynamic> = (X*) →* dynamic;
+typedef Finv<invariant X extends core::Object* = dynamic> = (X*) →* X*;
+typedef FcovBound<X extends core::num* = core::num*> = () →* X*;
+typedef FconBound<contravariant X extends core::num* = core::num*> = (X*) →* dynamic;
+typedef FinvBound<invariant X extends core::num* = core::num*> = (X*) →* X*;
+typedef FcovCyclicBound<X extends self::A<X*>* = self::A<dynamic>*> = () →* X*;
+typedef FconCyclicBound<contravariant X extends self::A<X*>* = self::A<Null>*> = (X*) →* dynamic;
+typedef FinvCyclicBound<invariant X extends self::A<X*>* = self::A<dynamic>*> = (X*) →* X*;
+typedef FcovCyclicCoBound<X extends (X*) →* dynamic = (Null) →* dynamic> = () →* X*;
+typedef FconCyclicCoBound<contravariant X extends (X*) →* dynamic = (dynamic) →* dynamic> = (X*) →* dynamic;
+typedef FinvCyclicCoBound<invariant X extends (X*) →* dynamic = (dynamic) →* dynamic> = (X*) →* X*;
+class A<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::X*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method toF<X extends core::Object* = dynamic>(self::toF::X* x) → <Y extends self::toF::X* = dynamic>() →* void
+  return null;
+static method testTopLevel() → void {
+  () →* dynamic source1;
+  <Y extends () →* dynamic = dynamic>() →* void fsource1 = self::toF<() →* dynamic>(source1);
+  <Y extends () →* dynamic = dynamic>() →* void target1 = fsource1;
+  (dynamic) →* dynamic source2;
+  <Y extends (dynamic) →* dynamic = dynamic>() →* void fsource2 = self::toF<(dynamic) →* dynamic>(source2);
+  <Y extends (dynamic) →* dynamic = dynamic>() →* void target2 = fsource2;
+  (dynamic) →* dynamic source3;
+  <Y extends (dynamic) →* dynamic = dynamic>() →* void fsource3 = self::toF<(dynamic) →* dynamic>(source3);
+  <Y extends (dynamic) →* dynamic = dynamic>() →* void target3 = fsource3;
+  () →* core::num* source4;
+  <Y extends () →* core::num* = dynamic>() →* void fsource4 = self::toF<() →* core::num*>(source4);
+  <Y extends () →* core::num* = dynamic>() →* void target4 = fsource4;
+  (core::num*) →* dynamic source5;
+  <Y extends (core::num*) →* dynamic = dynamic>() →* void fsource5 = self::toF<(core::num*) →* dynamic>(source5);
+  <Y extends (core::num*) →* dynamic = dynamic>() →* void target5 = fsource5;
+  (core::num*) →* core::num* source6;
+  <Y extends (core::num*) →* core::num* = dynamic>() →* void fsource6 = self::toF<(core::num*) →* core::num*>(source6);
+  <Y extends (core::num*) →* core::num* = dynamic>() →* void target6 = fsource6;
+  () →* self::A<dynamic>* source7;
+  <Y extends () →* self::A<dynamic>* = dynamic>() →* void fsource7 = self::toF<() →* self::A<dynamic>*>(source7);
+  <Y extends () →* self::A<dynamic>* = dynamic>() →* void target7 = fsource7;
+  (self::A<Null>*) →* dynamic source8;
+  <Y extends (self::A<Null>*) →* dynamic = dynamic>() →* void fsource8 = self::toF<(self::A<Null>*) →* dynamic>(source8);
+  <Y extends (self::A<Null>*) →* dynamic = dynamic>() →* void target8 = fsource8;
+  (self::A<dynamic>*) →* self::A<dynamic>* source9;
+  () →* (Null) →* dynamic source10;
+  <Y extends () →* (Null) →* dynamic = dynamic>() →* void fsource10 = self::toF<() →* (Null) →* dynamic>(source10);
+  <Y extends () →* (Null) →* dynamic = dynamic>() →* void target10 = fsource10;
+  ((dynamic) →* dynamic) →* dynamic source11;
+  <Y extends ((dynamic) →* dynamic) →* dynamic = dynamic>() →* void fsource11 = self::toF<((dynamic) →* dynamic) →* dynamic>(source11);
+  <Y extends ((dynamic) →* dynamic) →* dynamic = dynamic>() →* void target11 = fsource11;
+  ((dynamic) →* dynamic) →* (dynamic) →* dynamic source12;
+  <Y extends ((dynamic) →* dynamic) →* (dynamic) →* dynamic = dynamic>() →* void fsource12 = self::toF<((dynamic) →* dynamic) →* (dynamic) →* dynamic>(source12);
+  <Y extends ((dynamic) →* dynamic) →* (dynamic) →* dynamic = dynamic>() →* void target12 = fsource12;
+}
+static method testNested() → void {
+  self::B<() →* dynamic>* source1;
+  <Y extends self::B<() →* dynamic>* = dynamic>() →* void fsource1 = self::toF<self::B<() →* dynamic>*>(source1);
+  <Y extends self::B<() →* dynamic>* = dynamic>() →* void target1 = fsource1;
+  self::B<(dynamic) →* dynamic>* source2;
+  <Y extends self::B<(dynamic) →* dynamic>* = dynamic>() →* void fsource2 = self::toF<self::B<(dynamic) →* dynamic>*>(source2);
+  <Y extends self::B<(dynamic) →* dynamic>* = dynamic>() →* void target2 = fsource2;
+  self::B<(dynamic) →* dynamic>* source3;
+  <Y extends self::B<(dynamic) →* dynamic>* = dynamic>() →* void fsource3 = self::toF<self::B<(dynamic) →* dynamic>*>(source3);
+  <Y extends self::B<(dynamic) →* dynamic>* = dynamic>() →* void target3 = fsource3;
+  self::B<() →* core::num*>* source4;
+  <Y extends self::B<() →* core::num*>* = dynamic>() →* void fsource4 = self::toF<self::B<() →* core::num*>*>(source4);
+  <Y extends self::B<() →* core::num*>* = dynamic>() →* void target4 = fsource4;
+  self::B<(core::num*) →* dynamic>* source5;
+  <Y extends self::B<(core::num*) →* dynamic>* = dynamic>() →* void fsource5 = self::toF<self::B<(core::num*) →* dynamic>*>(source5);
+  <Y extends self::B<(core::num*) →* dynamic>* = dynamic>() →* void target5 = fsource5;
+  self::B<(core::num*) →* core::num*>* source6;
+  <Y extends self::B<(core::num*) →* core::num*>* = dynamic>() →* void fsource6 = self::toF<self::B<(core::num*) →* core::num*>*>(source6);
+  <Y extends self::B<(core::num*) →* core::num*>* = dynamic>() →* void target6 = fsource6;
+  self::B<() →* self::A<dynamic>*>* source7;
+  <Y extends self::B<() →* self::A<dynamic>*>* = dynamic>() →* void fsource7 = self::toF<self::B<() →* self::A<dynamic>*>*>(source7);
+  <Y extends self::B<() →* self::A<dynamic>*>* = dynamic>() →* void target7 = fsource7;
+  self::B<(self::A<Null>*) →* dynamic>* source8;
+  <Y extends self::B<(self::A<Null>*) →* dynamic>* = dynamic>() →* void fsource8 = self::toF<self::B<(self::A<Null>*) →* dynamic>*>(source8);
+  <Y extends self::B<(self::A<Null>*) →* dynamic>* = dynamic>() →* void target8 = fsource8;
+  self::B<(self::A<dynamic>*) →* self::A<dynamic>*>* source9;
+  self::B<() →* (Null) →* dynamic>* source10;
+  <Y extends self::B<() →* (Null) →* dynamic>* = dynamic>() →* void fsource10 = self::toF<self::B<() →* (Null) →* dynamic>*>(source10);
+  <Y extends self::B<() →* (Null) →* dynamic>* = dynamic>() →* void target10 = fsource10;
+  self::B<((dynamic) →* dynamic) →* dynamic>* source11;
+  <Y extends self::B<((dynamic) →* dynamic) →* dynamic>* = dynamic>() →* void fsource11 = self::toF<self::B<((dynamic) →* dynamic) →* dynamic>*>(source11);
+  <Y extends self::B<((dynamic) →* dynamic) →* dynamic>* = dynamic>() →* void target11 = fsource11;
+  self::B<((dynamic) →* dynamic) →* (dynamic) →* dynamic>* source12;
+  <Y extends self::B<((dynamic) →* dynamic) →* (dynamic) →* dynamic>* = dynamic>() →* void fsource12 = self::toF<self::B<((dynamic) →* dynamic) →* (dynamic) →* dynamic>*>(source12);
+  <Y extends self::B<((dynamic) →* dynamic) →* (dynamic) →* dynamic>* = dynamic>() →* void target12 = fsource12;
+}
+static method main() → dynamic {
+  self::testTopLevel();
+  self::testNested();
+}
diff --git a/pkg/front_end/testcases/general/top_level_variance_test.dart.strong.transformed.expect b/pkg/front_end/testcases/general/top_level_variance_test.dart.strong.transformed.expect
new file mode 100644
index 0000000..b21e661
--- /dev/null
+++ b/pkg/front_end/testcases/general/top_level_variance_test.dart.strong.transformed.expect
@@ -0,0 +1,125 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef F<invariant X extends core::Object* = dynamic> = <Y extends X* = dynamic>() →* void;
+typedef Fcov<X extends core::Object* = dynamic> = () →* X*;
+typedef Fcon<contravariant X extends core::Object* = dynamic> = (X*) →* dynamic;
+typedef Finv<invariant X extends core::Object* = dynamic> = (X*) →* X*;
+typedef FcovBound<X extends core::num* = core::num*> = () →* X*;
+typedef FconBound<contravariant X extends core::num* = core::num*> = (X*) →* dynamic;
+typedef FinvBound<invariant X extends core::num* = core::num*> = (X*) →* X*;
+typedef FcovCyclicBound<X extends self::A<X*>* = self::A<dynamic>*> = () →* X*;
+typedef FconCyclicBound<contravariant X extends self::A<X*>* = self::A<Null>*> = (X*) →* dynamic;
+typedef FinvCyclicBound<invariant X extends self::A<X*>* = self::A<dynamic>*> = (X*) →* X*;
+typedef FcovCyclicCoBound<X extends (X*) →* dynamic = (Null) →* dynamic> = () →* X*;
+typedef FconCyclicCoBound<contravariant X extends (X*) →* dynamic = (dynamic) →* dynamic> = (X*) →* dynamic;
+typedef FinvCyclicCoBound<invariant X extends (X*) →* dynamic = (dynamic) →* dynamic> = (X*) →* X*;
+class A<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::X*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method toF<X extends core::Object* = dynamic>(self::toF::X* x) → <Y extends self::toF::X* = dynamic>() →* void
+  return null;
+static method testTopLevel() → void {
+  () →* dynamic source1;
+  <Y extends () →* dynamic = dynamic>() →* void fsource1 = self::toF<() →* dynamic>(source1);
+  <Y extends () →* dynamic = dynamic>() →* void target1 = fsource1;
+  (dynamic) →* dynamic source2;
+  <Y extends (dynamic) →* dynamic = dynamic>() →* void fsource2 = self::toF<(dynamic) →* dynamic>(source2);
+  <Y extends (dynamic) →* dynamic = dynamic>() →* void target2 = fsource2;
+  (dynamic) →* dynamic source3;
+  <Y extends (dynamic) →* dynamic = dynamic>() →* void fsource3 = self::toF<(dynamic) →* dynamic>(source3);
+  <Y extends (dynamic) →* dynamic = dynamic>() →* void target3 = fsource3;
+  () →* core::num* source4;
+  <Y extends () →* core::num* = dynamic>() →* void fsource4 = self::toF<() →* core::num*>(source4);
+  <Y extends () →* core::num* = dynamic>() →* void target4 = fsource4;
+  (core::num*) →* dynamic source5;
+  <Y extends (core::num*) →* dynamic = dynamic>() →* void fsource5 = self::toF<(core::num*) →* dynamic>(source5);
+  <Y extends (core::num*) →* dynamic = dynamic>() →* void target5 = fsource5;
+  (core::num*) →* core::num* source6;
+  <Y extends (core::num*) →* core::num* = dynamic>() →* void fsource6 = self::toF<(core::num*) →* core::num*>(source6);
+  <Y extends (core::num*) →* core::num* = dynamic>() →* void target6 = fsource6;
+  () →* self::A<dynamic>* source7;
+  <Y extends () →* self::A<dynamic>* = dynamic>() →* void fsource7 = self::toF<() →* self::A<dynamic>*>(source7);
+  <Y extends () →* self::A<dynamic>* = dynamic>() →* void target7 = fsource7;
+  (self::A<Null>*) →* dynamic source8;
+  <Y extends (self::A<Null>*) →* dynamic = dynamic>() →* void fsource8 = self::toF<(self::A<Null>*) →* dynamic>(source8);
+  <Y extends (self::A<Null>*) →* dynamic = dynamic>() →* void target8 = fsource8;
+  (self::A<dynamic>*) →* self::A<dynamic>* source9;
+  () →* (Null) →* dynamic source10;
+  <Y extends () →* (Null) →* dynamic = dynamic>() →* void fsource10 = self::toF<() →* (Null) →* dynamic>(source10);
+  <Y extends () →* (Null) →* dynamic = dynamic>() →* void target10 = fsource10;
+  ((dynamic) →* dynamic) →* dynamic source11;
+  <Y extends ((dynamic) →* dynamic) →* dynamic = dynamic>() →* void fsource11 = self::toF<((dynamic) →* dynamic) →* dynamic>(source11);
+  <Y extends ((dynamic) →* dynamic) →* dynamic = dynamic>() →* void target11 = fsource11;
+  ((dynamic) →* dynamic) →* (dynamic) →* dynamic source12;
+  <Y extends ((dynamic) →* dynamic) →* (dynamic) →* dynamic = dynamic>() →* void fsource12 = self::toF<((dynamic) →* dynamic) →* (dynamic) →* dynamic>(source12);
+  <Y extends ((dynamic) →* dynamic) →* (dynamic) →* dynamic = dynamic>() →* void target12 = fsource12;
+}
+static method testNested() → void {
+  self::B<() →* dynamic>* source1;
+  <Y extends self::B<() →* dynamic>* = dynamic>() →* void fsource1 = self::toF<self::B<() →* dynamic>*>(source1);
+  <Y extends self::B<() →* dynamic>* = dynamic>() →* void target1 = fsource1;
+  self::B<(dynamic) →* dynamic>* source2;
+  <Y extends self::B<(dynamic) →* dynamic>* = dynamic>() →* void fsource2 = self::toF<self::B<(dynamic) →* dynamic>*>(source2);
+  <Y extends self::B<(dynamic) →* dynamic>* = dynamic>() →* void target2 = fsource2;
+  self::B<(dynamic) →* dynamic>* source3;
+  <Y extends self::B<(dynamic) →* dynamic>* = dynamic>() →* void fsource3 = self::toF<self::B<(dynamic) →* dynamic>*>(source3);
+  <Y extends self::B<(dynamic) →* dynamic>* = dynamic>() →* void target3 = fsource3;
+  self::B<() →* core::num*>* source4;
+  <Y extends self::B<() →* core::num*>* = dynamic>() →* void fsource4 = self::toF<self::B<() →* core::num*>*>(source4);
+  <Y extends self::B<() →* core::num*>* = dynamic>() →* void target4 = fsource4;
+  self::B<(core::num*) →* dynamic>* source5;
+  <Y extends self::B<(core::num*) →* dynamic>* = dynamic>() →* void fsource5 = self::toF<self::B<(core::num*) →* dynamic>*>(source5);
+  <Y extends self::B<(core::num*) →* dynamic>* = dynamic>() →* void target5 = fsource5;
+  self::B<(core::num*) →* core::num*>* source6;
+  <Y extends self::B<(core::num*) →* core::num*>* = dynamic>() →* void fsource6 = self::toF<self::B<(core::num*) →* core::num*>*>(source6);
+  <Y extends self::B<(core::num*) →* core::num*>* = dynamic>() →* void target6 = fsource6;
+  self::B<() →* self::A<dynamic>*>* source7;
+  <Y extends self::B<() →* self::A<dynamic>*>* = dynamic>() →* void fsource7 = self::toF<self::B<() →* self::A<dynamic>*>*>(source7);
+  <Y extends self::B<() →* self::A<dynamic>*>* = dynamic>() →* void target7 = fsource7;
+  self::B<(self::A<Null>*) →* dynamic>* source8;
+  <Y extends self::B<(self::A<Null>*) →* dynamic>* = dynamic>() →* void fsource8 = self::toF<self::B<(self::A<Null>*) →* dynamic>*>(source8);
+  <Y extends self::B<(self::A<Null>*) →* dynamic>* = dynamic>() →* void target8 = fsource8;
+  self::B<(self::A<dynamic>*) →* self::A<dynamic>*>* source9;
+  self::B<() →* (Null) →* dynamic>* source10;
+  <Y extends self::B<() →* (Null) →* dynamic>* = dynamic>() →* void fsource10 = self::toF<self::B<() →* (Null) →* dynamic>*>(source10);
+  <Y extends self::B<() →* (Null) →* dynamic>* = dynamic>() →* void target10 = fsource10;
+  self::B<((dynamic) →* dynamic) →* dynamic>* source11;
+  <Y extends self::B<((dynamic) →* dynamic) →* dynamic>* = dynamic>() →* void fsource11 = self::toF<self::B<((dynamic) →* dynamic) →* dynamic>*>(source11);
+  <Y extends self::B<((dynamic) →* dynamic) →* dynamic>* = dynamic>() →* void target11 = fsource11;
+  self::B<((dynamic) →* dynamic) →* (dynamic) →* dynamic>* source12;
+  <Y extends self::B<((dynamic) →* dynamic) →* (dynamic) →* dynamic>* = dynamic>() →* void fsource12 = self::toF<self::B<((dynamic) →* dynamic) →* (dynamic) →* dynamic>*>(source12);
+  <Y extends self::B<((dynamic) →* dynamic) →* (dynamic) →* dynamic>* = dynamic>() →* void target12 = fsource12;
+}
+static method main() → dynamic {
+  self::testTopLevel();
+  self::testNested();
+}
diff --git a/pkg/front_end/testcases/top_level_variance_test.dart.textual_outline.expect b/pkg/front_end/testcases/general/top_level_variance_test.dart.textual_outline.expect
similarity index 100%
rename from pkg/front_end/testcases/top_level_variance_test.dart.textual_outline.expect
rename to pkg/front_end/testcases/general/top_level_variance_test.dart.textual_outline.expect
diff --git a/pkg/front_end/testcases/top_level_variance_test.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/top_level_variance_test.dart.textual_outline_modelled.expect
similarity index 100%
rename from pkg/front_end/testcases/top_level_variance_test.dart.textual_outline_modelled.expect
rename to pkg/front_end/testcases/general/top_level_variance_test.dart.textual_outline_modelled.expect
diff --git a/pkg/front_end/testcases/top_level_variance_test.dart.weak.expect b/pkg/front_end/testcases/general/top_level_variance_test.dart.weak.expect
similarity index 100%
rename from pkg/front_end/testcases/top_level_variance_test.dart.weak.expect
rename to pkg/front_end/testcases/general/top_level_variance_test.dart.weak.expect
diff --git a/pkg/front_end/testcases/top_level_variance_test.dart.weak.transformed.expect b/pkg/front_end/testcases/general/top_level_variance_test.dart.weak.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/top_level_variance_test.dart.weak.transformed.expect
rename to pkg/front_end/testcases/general/top_level_variance_test.dart.weak.transformed.expect
diff --git a/pkg/front_end/testcases/general/type_of_null.dart b/pkg/front_end/testcases/general/type_of_null.dart
index 70292a1..9e0b34b 100644
--- a/pkg/front_end/testcases/general/type_of_null.dart
+++ b/pkg/front_end/testcases/general/type_of_null.dart
@@ -10,22 +10,22 @@
 Null foo() => null;
 
 main() {
-  /*@ typeArgs=Null? */ map(/*@ returnType=Null? */ () {},
+  /*@ typeArgs=Null */ map(/*@ returnType=Null */ () {},
       /*@ returnType=<BottomType> */ () => throw "hello");
-  /*@ typeArgs=Null? */ map(/*@ returnType=<BottomType> */ () => throw "hello",
-      /*@ returnType=Null? */ () {});
-  Null Function() f = /*@ returnType=Null? */ () {};
-  /*@ typeArgs=Null? */ map(
+  /*@ typeArgs=Null */ map(/*@ returnType=<BottomType> */ () => throw "hello",
+      /*@ returnType=Null */ () {});
+  Null Function() f = /*@ returnType=Null */ () {};
+  /*@ typeArgs=Null */ map(
       foo, /*@ returnType=<BottomType> */ () => throw "hello");
-  /*@ typeArgs=Null? */ map(
+  /*@ typeArgs=Null */ map(
       /*@ returnType=<BottomType> */ () => throw "hello", foo);
-  /*@ typeArgs=Null? */ map(/*@ returnType=Null? */ () {
+  /*@ typeArgs=Null */ map(/*@ returnType=Null */ () {
     return null;
   }, /*@ returnType=<BottomType> */ () => throw "hello");
 
-  /*@ typeArgs=Null? */ map(/*@ returnType=<BottomType> */ () => throw "hello",
-      /*@ returnType=Null? */ () {
+  /*@ typeArgs=Null */ map(/*@ returnType=<BottomType> */ () => throw "hello",
+      /*@ returnType=Null */ () {
     return null;
   });
-  /*@ typeArgs=() ->* Null? */ id(/*@ returnType=Null? */ () {});
+  /*@ typeArgs=() ->* Null */ id(/*@ returnType=Null */ () {});
 }
diff --git a/pkg/front_end/testcases/general/type_of_null.dart.outline.expect b/pkg/front_end/testcases/general/type_of_null.dart.outline.expect
index 3485e02..b7c00566 100644
--- a/pkg/front_end/testcases/general/type_of_null.dart.outline.expect
+++ b/pkg/front_end/testcases/general/type_of_null.dart.outline.expect
@@ -6,7 +6,7 @@
   ;
 static method id<T extends core::Object* = dynamic>(self::id::T* t) → dynamic
   ;
-static method foo() → core::Null?
+static method foo() → Null
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/general/type_of_null.dart.strong.expect b/pkg/front_end/testcases/general/type_of_null.dart.strong.expect
index c0c8997..335ccc5 100644
--- a/pkg/front_end/testcases/general/type_of_null.dart.strong.expect
+++ b/pkg/front_end/testcases/general/type_of_null.dart.strong.expect
@@ -5,21 +5,21 @@
 static method map<T extends core::Object* = dynamic>(() →* self::map::T* f1, () →* self::map::T* f2) → self::map::T* {}
 static method id<T extends core::Object* = dynamic>(self::id::T* t) → dynamic
   return t;
-static method foo() → core::Null?
+static method foo() → Null
   return null;
 static method main() → dynamic {
-  self::map<core::Null?>(() → core::Null? {}, () → <BottomType>=> throw "hello");
-  self::map<core::Null?>(() → <BottomType>=> throw "hello", () → core::Null? {});
-  () →* core::Null? f = () → core::Null? {};
-  self::map<core::Null?>(#C1, () → <BottomType>=> throw "hello");
-  self::map<core::Null?>(() → <BottomType>=> throw "hello", #C1);
-  self::map<core::Null?>(() → core::Null? {
+  self::map<Null>(() → Null {}, () → <BottomType>=> throw "hello");
+  self::map<Null>(() → <BottomType>=> throw "hello", () → Null {});
+  () →* Null f = () → Null {};
+  self::map<Null>(#C1, () → <BottomType>=> throw "hello");
+  self::map<Null>(() → <BottomType>=> throw "hello", #C1);
+  self::map<Null>(() → Null {
     return null;
   }, () → <BottomType>=> throw "hello");
-  self::map<core::Null?>(() → <BottomType>=> throw "hello", () → core::Null? {
+  self::map<Null>(() → <BottomType>=> throw "hello", () → Null {
     return null;
   });
-  self::id<() →* core::Null?>(() → core::Null? {});
+  self::id<() →* Null>(() → Null {});
 }
 
 constants  {
diff --git a/pkg/front_end/testcases/general/type_of_null.dart.strong.transformed.expect b/pkg/front_end/testcases/general/type_of_null.dart.strong.transformed.expect
index c0c8997..335ccc5 100644
--- a/pkg/front_end/testcases/general/type_of_null.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/type_of_null.dart.strong.transformed.expect
@@ -5,21 +5,21 @@
 static method map<T extends core::Object* = dynamic>(() →* self::map::T* f1, () →* self::map::T* f2) → self::map::T* {}
 static method id<T extends core::Object* = dynamic>(self::id::T* t) → dynamic
   return t;
-static method foo() → core::Null?
+static method foo() → Null
   return null;
 static method main() → dynamic {
-  self::map<core::Null?>(() → core::Null? {}, () → <BottomType>=> throw "hello");
-  self::map<core::Null?>(() → <BottomType>=> throw "hello", () → core::Null? {});
-  () →* core::Null? f = () → core::Null? {};
-  self::map<core::Null?>(#C1, () → <BottomType>=> throw "hello");
-  self::map<core::Null?>(() → <BottomType>=> throw "hello", #C1);
-  self::map<core::Null?>(() → core::Null? {
+  self::map<Null>(() → Null {}, () → <BottomType>=> throw "hello");
+  self::map<Null>(() → <BottomType>=> throw "hello", () → Null {});
+  () →* Null f = () → Null {};
+  self::map<Null>(#C1, () → <BottomType>=> throw "hello");
+  self::map<Null>(() → <BottomType>=> throw "hello", #C1);
+  self::map<Null>(() → Null {
     return null;
   }, () → <BottomType>=> throw "hello");
-  self::map<core::Null?>(() → <BottomType>=> throw "hello", () → core::Null? {
+  self::map<Null>(() → <BottomType>=> throw "hello", () → Null {
     return null;
   });
-  self::id<() →* core::Null?>(() → core::Null? {});
+  self::id<() →* Null>(() → Null {});
 }
 
 constants  {
diff --git a/pkg/front_end/testcases/general/type_variable_bound_access.dart.strong.transformed.expect b/pkg/front_end/testcases/general/type_variable_bound_access.dart.strong.transformed.expect
new file mode 100644
index 0000000..dbc33c0
--- /dev/null
+++ b/pkg/front_end/testcases/general/type_variable_bound_access.dart.strong.transformed.expect
@@ -0,0 +1,88 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/type_variable_bound_access.dart:22:36: Error: The getter 'length' isn't defined for the class 'num'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'length'.
+//   num method2() => field1 + field2.length;
+//                                    ^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class DynamicClass<T extends dynamic = dynamic, S extends self::DynamicClass::T* = dynamic> extends core::Object {
+  generic-covariant-impl field self::DynamicClass::T* field1;
+  generic-covariant-impl field self::DynamicClass::T* field2;
+  constructor •(self::DynamicClass::T* field1, self::DynamicClass::T* field2) → self::DynamicClass<self::DynamicClass::T*, self::DynamicClass::S*>*
+    : self::DynamicClass::field1 = field1, self::DynamicClass::field2 = field2, super core::Object::•()
+    ;
+  method method() → dynamic
+    return this.{self::DynamicClass::field1}.*(this.{self::DynamicClass::field2});
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class NumClass<T extends core::num* = core::num*, S extends self::NumClass::T* = core::num*> extends core::Object {
+  generic-covariant-impl field self::NumClass::T* field1;
+  generic-covariant-impl field self::NumClass::S* field2;
+  constructor •(self::NumClass::T* field1, self::NumClass::S* field2) → self::NumClass<self::NumClass::T*, self::NumClass::S*>*
+    : self::NumClass::field1 = field1, self::NumClass::field2 = field2, super core::Object::•()
+    ;
+  method method1() → core::num*
+    return this.{self::NumClass::field1}.{core::num::*}(this.{self::NumClass::field2});
+  method method2() → core::num*
+    return this.{self::NumClass::field1}.{core::num::+}(invalid-expression "pkg/front_end/testcases/general/type_variable_bound_access.dart:22:36: Error: The getter 'length' isn't defined for the class 'num'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'length'.
+  num method2() => field1 + field2.length;
+                                   ^^^^^^");
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Class<X5 extends self::Class::X4* = core::int*, X4 extends self::Class::X3* = core::int*, X3 extends self::Class::X2* = core::int*, X2 extends self::Class::X1* = core::int*, X1 extends self::Class::X0* = core::int*, X0 extends core::int* = core::int*> extends core::Object {
+  generic-covariant-impl field self::Class::X0* field0 = null;
+  generic-covariant-impl field self::Class::X1* field1 = null;
+  generic-covariant-impl field self::Class::X2* field2 = null;
+  generic-covariant-impl field self::Class::X3* field3 = null;
+  generic-covariant-impl field self::Class::X4* field4 = null;
+  generic-covariant-impl field self::Class::X5* field5 = null;
+  synthetic constructor •() → self::Class<self::Class::X5*, self::Class::X4*, self::Class::X3*, self::Class::X2*, self::Class::X1*, self::Class::X0*>*
+    : super core::Object::•()
+    ;
+  method method() → dynamic {
+    this.{self::Class::field0}.{core::int::isEven};
+    this.{self::Class::field1}.{core::int::isEven};
+    this.{self::Class::field2}.{core::int::isEven};
+    this.{self::Class::field3}.{core::int::isEven};
+    this.{self::Class::field4}.{core::int::isEven};
+    this.{self::Class::field5}.{core::int::isEven};
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  new self::DynamicClass::•<core::num*, core::int*>(0.5, 2).{self::DynamicClass::method}();
+  new self::NumClass::•<core::num*, core::double*>(2, 0.5).{self::NumClass::method1}();
+}
diff --git a/pkg/front_end/testcases/general/with_dependencies/stub_or_not/stub_or_not.dart.outline.expect b/pkg/front_end/testcases/general/with_dependencies/stub_or_not/stub_or_not.dart.outline.expect
index b83e3527..c556a30 100644
--- a/pkg/front_end/testcases/general/with_dependencies/stub_or_not/stub_or_not.dart.outline.expect
+++ b/pkg/front_end/testcases/general/with_dependencies/stub_or_not/stub_or_not.dart.outline.expect
@@ -47,7 +47,7 @@
 abstract class Foo extends stu::Baz implements stu::Qux {
   synthetic constructor •() → stu::Foo*
     ;
-  abstract forwarding-stub method handleEvent(covariant stu2::EvenFileB* entry) → void;
+  abstract member-signature method handleEvent(covariant stu2::EvenFileB* entry) → void; -> stu::Qux::handleEvent
 }
 
 library;
diff --git a/pkg/front_end/testcases/general/with_dependencies/stub_or_not/stub_or_not.dart.strong.expect b/pkg/front_end/testcases/general/with_dependencies/stub_or_not/stub_or_not.dart.strong.expect
index bd2e86c..a45bc9f 100644
--- a/pkg/front_end/testcases/general/with_dependencies/stub_or_not/stub_or_not.dart.strong.expect
+++ b/pkg/front_end/testcases/general/with_dependencies/stub_or_not/stub_or_not.dart.strong.expect
@@ -49,7 +49,7 @@
   synthetic constructor •() → stu::Foo*
     : super stu::Baz::•()
     ;
-  abstract forwarding-stub method handleEvent(covariant stu2::EvenFileB* entry) → void;
+  abstract member-signature method handleEvent(covariant stu2::EvenFileB* entry) → void; -> stu::Qux::handleEvent
 }
 
 library;
diff --git a/pkg/front_end/testcases/general/with_dependencies/stub_or_not/stub_or_not.dart.strong.transformed.expect b/pkg/front_end/testcases/general/with_dependencies/stub_or_not/stub_or_not.dart.strong.transformed.expect
index bd2e86c..a45bc9f 100644
--- a/pkg/front_end/testcases/general/with_dependencies/stub_or_not/stub_or_not.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/with_dependencies/stub_or_not/stub_or_not.dart.strong.transformed.expect
@@ -49,7 +49,7 @@
   synthetic constructor •() → stu::Foo*
     : super stu::Baz::•()
     ;
-  abstract forwarding-stub method handleEvent(covariant stu2::EvenFileB* entry) → void;
+  abstract member-signature method handleEvent(covariant stu2::EvenFileB* entry) → void; -> stu::Qux::handleEvent
 }
 
 library;
diff --git a/pkg/front_end/testcases/general/with_dependencies/stub_or_not/stub_or_not.no_link.dart.outline.expect b/pkg/front_end/testcases/general/with_dependencies/stub_or_not/stub_or_not.no_link.dart.outline.expect
index b83e3527..c556a30 100644
--- a/pkg/front_end/testcases/general/with_dependencies/stub_or_not/stub_or_not.no_link.dart.outline.expect
+++ b/pkg/front_end/testcases/general/with_dependencies/stub_or_not/stub_or_not.no_link.dart.outline.expect
@@ -47,7 +47,7 @@
 abstract class Foo extends stu::Baz implements stu::Qux {
   synthetic constructor •() → stu::Foo*
     ;
-  abstract forwarding-stub method handleEvent(covariant stu2::EvenFileB* entry) → void;
+  abstract member-signature method handleEvent(covariant stu2::EvenFileB* entry) → void; -> stu::Qux::handleEvent
 }
 
 library;
diff --git a/pkg/front_end/testcases/general/with_dependencies/stub_or_not/stub_or_not.no_link.dart.strong.expect b/pkg/front_end/testcases/general/with_dependencies/stub_or_not/stub_or_not.no_link.dart.strong.expect
index bd2e86c..a45bc9f 100644
--- a/pkg/front_end/testcases/general/with_dependencies/stub_or_not/stub_or_not.no_link.dart.strong.expect
+++ b/pkg/front_end/testcases/general/with_dependencies/stub_or_not/stub_or_not.no_link.dart.strong.expect
@@ -49,7 +49,7 @@
   synthetic constructor •() → stu::Foo*
     : super stu::Baz::•()
     ;
-  abstract forwarding-stub method handleEvent(covariant stu2::EvenFileB* entry) → void;
+  abstract member-signature method handleEvent(covariant stu2::EvenFileB* entry) → void; -> stu::Qux::handleEvent
 }
 
 library;
diff --git a/pkg/front_end/testcases/general/with_dependencies/stub_or_not/stub_or_not.no_link.dart.strong.transformed.expect b/pkg/front_end/testcases/general/with_dependencies/stub_or_not/stub_or_not.no_link.dart.strong.transformed.expect
index bd2e86c..a45bc9f 100644
--- a/pkg/front_end/testcases/general/with_dependencies/stub_or_not/stub_or_not.no_link.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/with_dependencies/stub_or_not/stub_or_not.no_link.dart.strong.transformed.expect
@@ -49,7 +49,7 @@
   synthetic constructor •() → stu::Foo*
     : super stu::Baz::•()
     ;
-  abstract forwarding-stub method handleEvent(covariant stu2::EvenFileB* entry) → void;
+  abstract member-signature method handleEvent(covariant stu2::EvenFileB* entry) → void; -> stu::Qux::handleEvent
 }
 
 library;
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/annotation_variable_declaration.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/annotation_variable_declaration.dart.weak.expect
index 0aaa824..4c86065 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/annotation_variable_declaration.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/annotation_variable_declaration.dart.weak.expect
@@ -35,9 +35,9 @@
     @#C1 core::String* localWithInitializer = "hello";
     @#C1 @#C2 dynamic localGroupPart1;
     @#C1 @#C2 dynamic localGroupPart2;
-    function naebdyr(@#C1 dynamic nestedFormal) → core::Null?
+    function naebdyr(@#C1 dynamic nestedFormal) → Null
       return null;
-    (dynamic) →* core::Null? roedmus = (@#C1 dynamic closureFormal) → core::Null? => null;
+    (dynamic) →* Null roedmus = (@#C1 dynamic closureFormal) → Null => null;
   }
   method hest({@#C1 dynamic named = #C3}) → dynamic
     return null;
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/annotation_variable_declaration.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/annotation_variable_declaration.dart.weak.transformed.expect
index 0aaa824..4c86065 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/annotation_variable_declaration.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/annotation_variable_declaration.dart.weak.transformed.expect
@@ -35,9 +35,9 @@
     @#C1 core::String* localWithInitializer = "hello";
     @#C1 @#C2 dynamic localGroupPart1;
     @#C1 @#C2 dynamic localGroupPart2;
-    function naebdyr(@#C1 dynamic nestedFormal) → core::Null?
+    function naebdyr(@#C1 dynamic nestedFormal) → Null
       return null;
-    (dynamic) →* core::Null? roedmus = (@#C1 dynamic closureFormal) → core::Null? => null;
+    (dynamic) →* Null roedmus = (@#C1 dynamic closureFormal) → Null => null;
   }
   method hest({@#C1 dynamic named = #C3}) → dynamic
     return null;
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/assign_to_initializing_formal.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/assign_to_initializing_formal.dart.weak.expect
index 7ed1303..c916da3 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/assign_to_initializing_formal.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/assign_to_initializing_formal.dart.weak.expect
@@ -15,7 +15,7 @@
   field dynamic x;
   field dynamic y;
   constructor •(dynamic x) → self::A*
-    : self::A::x = x, self::A::y = () → core::Null? {
+    : self::A::x = x, self::A::y = () → Null {
       invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/assign_to_initializing_formal.dart:15:11: Error: Can't assign to the final variable 'x'.
           x = 3;
           ^";
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/assign_to_initializing_formal.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/assign_to_initializing_formal.dart.weak.transformed.expect
index 7ed1303..c916da3 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/assign_to_initializing_formal.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/assign_to_initializing_formal.dart.weak.transformed.expect
@@ -15,7 +15,7 @@
   field dynamic x;
   field dynamic y;
   constructor •(dynamic x) → self::A*
-    : self::A::x = x, self::A::y = () → core::Null? {
+    : self::A::x = x, self::A::y = () → Null {
       invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/assign_to_initializing_formal.dart:15:11: Error: Can't assign to the final variable 'x'.
           x = 3;
           ^";
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/async_function.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/async_function.dart.weak.transformed.expect
index d341b2a..3382485 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/async_function.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/async_function.dart.weak.transformed.expect
@@ -8,7 +8,8 @@
 
 static field core::List<core::String*>* stringList = <core::String*>["bar"];
 static method asyncString() → asy::Future<core::String*>* /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::String*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::String*>();
+  final asy::_Future<core::String*>* :async_future = new asy::_Future::•<core::String*>();
+  core::bool* :is_sync = false;
   FutureOr<core::String*>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -22,20 +23,22 @@
         :return_value = "foo";
         break #L1;
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method asyncString2() → asy::Future<core::String*>* /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::String*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::String*>();
+  final asy::_Future<core::String*>* :async_future = new asy::_Future::•<core::String*>();
+  core::bool* :is_sync = false;
   FutureOr<core::String*>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -49,23 +52,24 @@
         :return_value = self::asyncString();
         break #L2;
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method syncStarString() → core::Iterable<core::String*>* /* originally sync* */ {
-  function :sync_op_gen() → (core::_SyncIterator<dynamic>*) →* core::bool* {
+  function :sync_op_gen() → (core::_SyncIterator<dynamic>*, dynamic, dynamic) →* core::bool* {
     core::int* :await_jump_var = 0;
     dynamic :await_ctx_var;
-    return (core::_SyncIterator<dynamic>* :iterator) → core::bool* yielding {
+    function :sync_op(core::_SyncIterator<dynamic>* :iterator, dynamic :exception, dynamic :stack_trace) → core::bool* yielding {
       {
         {
           :iterator.{core::_SyncIterator::_current} = "foo";
@@ -81,15 +85,16 @@
         }
       }
       return false;
-    };
+    }
+    return :sync_op;
   }
   return new core::_SyncIterable::•<core::String*>(:sync_op_gen);
 }
 static method syncStarString2() → core::Iterable<core::String*>* /* originally sync* */ {
-  function :sync_op_gen() → (core::_SyncIterator<dynamic>*) →* core::bool* {
+  function :sync_op_gen() → (core::_SyncIterator<dynamic>*, dynamic, dynamic) →* core::bool* {
     core::int* :await_jump_var = 0;
     dynamic :await_ctx_var;
-    return (core::_SyncIterator<dynamic>* :iterator) → core::bool* yielding {
+    function :sync_op(core::_SyncIterator<dynamic>* :iterator, dynamic :exception, dynamic :stack_trace) → core::bool* yielding {
       {
         {
           :iterator.{core::_SyncIterator::_current} = "foo";
@@ -97,7 +102,8 @@
         }
       }
       return false;
-    };
+    }
+    return :sync_op;
   }
   return new core::_SyncIterable::•<core::String*>(:sync_op_gen);
 }
@@ -181,7 +187,8 @@
   return :controller_stream;
 }
 static method main() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic>* :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -196,15 +203,16 @@
         [yield] let dynamic #t2 = asy::_awaitHelper(self::asyncString(), :async_op_then, :async_op_error, :async_op) in null;
         core::String* str = _in::unsafeCast<core::String*>(:result);
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/async_nested.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/async_nested.dart.weak.transformed.expect
index 672a96f..772b468 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/async_nested.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/async_nested.dart.weak.transformed.expect
@@ -28,7 +28,8 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 static method main() → void /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic>* :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -62,17 +63,18 @@
           throw "Expected '${expected}' but got '${actual}'";
         }
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 
 constants  {
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/await.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/await.dart.weak.transformed.expect
index 7d6f5ee..9bac1f2 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/await.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/await.dart.weak.transformed.expect
@@ -5,7 +5,8 @@
 import "dart:_internal" as _in;
 
 static method main() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic>* :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -20,15 +21,16 @@
         [yield] let dynamic #t1 = asy::_awaitHelper("Hello, World!", :async_op_then, :async_op_error, :async_op) in null;
         core::print(_in::unsafeCast<core::String*>(:result));
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/await_complex.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/await_complex.dart.weak.transformed.expect
index addb806..d6a8b95 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/await_complex.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/await_complex.dart.weak.transformed.expect
@@ -57,7 +57,8 @@
 static method dummy() → dynamic
   return 1;
 static method staticMembers() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic>* :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -100,20 +101,22 @@
         core::num* e = _in::unsafeCast<core::int*>(:async_temporary_5).{core::num::+}(:result as{TypeError,ForDynamic} core::num);
         self::expect(5, e);
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method topLevelMembers() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic>* :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -151,20 +154,22 @@
         core::num* e = _in::unsafeCast<core::int*>(:async_temporary_4).{core::num::+}(:result as{TypeError,ForDynamic} core::num);
         self::expect(5, e);
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method instanceMembers() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic>* :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -203,20 +208,22 @@
         core::num* e = _in::unsafeCast<core::int*>(:async_temporary_4).{core::num::+}(:result as{TypeError,ForDynamic} core::num);
         self::expect(5, e);
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method others() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic>* :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -255,20 +262,22 @@
         core::num* e = _in::unsafeCast<core::int*>(:async_temporary_4).{core::num::+}(:result as{TypeError,ForDynamic} core::num);
         self::expect(2, e);
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method conditionals() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic>* :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -327,20 +336,22 @@
         on dynamic catch(final dynamic e) {
         }
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method asserts() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic>* :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -400,20 +411,22 @@
           }
         }
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method controlFlow() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic>* :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -546,7 +559,8 @@
                 }
               }
               [yield] let dynamic #t51 = asy::_awaitHelper((() → asy::Future<dynamic>* /* originally async */ {
-                final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+                final asy::_Future<dynamic>* :async_future = new asy::_Future::•<dynamic>();
+                core::bool* :is_sync = false;
                 FutureOr<dynamic>* :return_value;
                 dynamic :async_stack_trace;
                 (dynamic) →* dynamic :async_op_then;
@@ -562,21 +576,23 @@
                       :return_value = :result;
                       break #L13;
                     }
-                    asy::_completeOnAsyncReturn(:async_completer, :return_value);
+                    asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
                     return;
                   }
                   on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-                    :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+                    asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
                   }
                 :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
                 :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
                 :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-                :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-                return :async_completer.{asy::Completer::future};
+                :async_op.call();
+                :is_sync = true;
+                return :async_future;
               }).call(), :async_op_then, :async_op_error, :async_op) in null;
               self::expect(42, :result);
               [yield] let dynamic #t53 = asy::_awaitHelper((() → asy::Future<dynamic>* /* originally async */ {
-                final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+                final asy::_Future<dynamic>* :async_future = new asy::_Future::•<dynamic>();
+                core::bool* :is_sync = false;
                 FutureOr<dynamic>* :return_value;
                 dynamic :async_stack_trace;
                 (dynamic) →* dynamic :async_op_then;
@@ -590,17 +606,18 @@
                       :return_value = func.call<dynamic>(42);
                       break #L14;
                     }
-                    asy::_completeOnAsyncReturn(:async_completer, :return_value);
+                    asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
                     return;
                   }
                   on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-                    :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+                    asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
                   }
                 :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
                 :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
                 :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-                :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-                return :async_completer.{asy::Completer::future};
+                :async_op.call();
+                :is_sync = true;
+                return :async_future;
               }).call(), :async_op_then, :async_op_error, :async_op) in null;
               self::expect(42, :result);
               function testStream1() → asy::Stream<core::int*>* /* originally async* */ {
@@ -685,20 +702,22 @@
           }
         }
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method future<T extends core::Object* = dynamic>(self::future::T* value) → FutureOr<self::future::T*>* /* originally async */ {
-  final asy::_AsyncAwaitCompleter<self::future::T*>* :async_completer = new asy::_AsyncAwaitCompleter::•<self::future::T*>();
+  final asy::_Future<self::future::T*>* :async_future = new asy::_Future::•<self::future::T*>();
+  core::bool* :is_sync = false;
   FutureOr<self::future::T*>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -712,17 +731,18 @@
         :return_value = value;
         break #L17;
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method id<T extends core::Object* = dynamic>(self::id::T* value) → FutureOr<self::id::T*>*
   return value;
@@ -762,7 +782,8 @@
   return :controller_stream;
 }
 static method main() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic>* :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -791,17 +812,18 @@
           :result;
         }
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
   if(!expected.{core::Object::==}(actual))
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/await_in_cascade.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/await_in_cascade.dart.weak.transformed.expect
index 7c1f7a3..fe03b1d 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/await_in_cascade.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/await_in_cascade.dart.weak.transformed.expect
@@ -11,7 +11,8 @@
     : super core::Object::•()
     ;
   method m() → asy::Future<core::List<core::int*>*>* /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::List<core::int*>*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::List<core::int*>*>();
+    final asy::_Future<core::List<core::int*>*>* :async_future = new asy::_Future::•<core::List<core::int*>*>();
+    core::bool* :is_sync = false;
     FutureOr<core::List<core::int*>*>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -29,20 +30,22 @@
           :return_value = block {} =>#t1;
           break #L1;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   }
   method _m() → asy::Future<core::int*>* /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    final asy::_Future<core::int*>* :async_future = new asy::_Future::•<core::int*>();
+    core::bool* :is_sync = false;
     FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -56,17 +59,18 @@
           :return_value = 42;
           break #L2;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   }
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -80,7 +84,8 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 static method main() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic>* :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -95,17 +100,18 @@
         [yield] let dynamic #t3 = asy::_awaitHelper(new self::C::•().{self::C::m}(), :async_op_then, :async_op_error, :async_op) in null;
         self::expect(42, _in::unsafeCast<core::List<core::int*>*>(:result).{core::Iterable::first});
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
   if(!expected.{core::Object::==}(actual))
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/bug33099.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/bug33099.dart.weak.expect
index e224292..6e4306c 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/bug33099.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/bug33099.dart.weak.expect
@@ -60,7 +60,7 @@
 static const field self::_FailingTest* failingTest = #C1;
 static method main() → dynamic {
   mir::ClassMirror* classMirror = mir::reflectClass(self::MyTest2*);
-  classMirror.{mir::ClassMirror::instanceMembers}.{core::Map::forEach}((core::Symbol* symbol, mir::MethodMirror* memberMirror) → core::Null? {
+  classMirror.{mir::ClassMirror::instanceMembers}.{core::Map::forEach}((core::Symbol* symbol, mir::MethodMirror* memberMirror) → Null {
     if(memberMirror.{mir::DeclarationMirror::simpleName}.{core::Symbol::==}(#C2)) {
       core::print(memberMirror);
       core::print(self::_hasFailingTestAnnotation(memberMirror));
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/bug33099.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/bug33099.dart.weak.transformed.expect
index 5d13162..34304c6 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/bug33099.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/bug33099.dart.weak.transformed.expect
@@ -62,7 +62,7 @@
 static const field self::_FailingTest* failingTest = #C1;
 static method main() → dynamic {
   mir::ClassMirror* classMirror = mir::reflectClass(self::MyTest2*);
-  classMirror.{mir::ClassMirror::instanceMembers}.{core::Map::forEach}((core::Symbol* symbol, mir::MethodMirror* memberMirror) → core::Null? {
+  classMirror.{mir::ClassMirror::instanceMembers}.{core::Map::forEach}((core::Symbol* symbol, mir::MethodMirror* memberMirror) → Null {
     if(memberMirror.{mir::DeclarationMirror::simpleName}.{core::Symbol::==}(#C2)) {
       core::print(memberMirror);
       core::print(self::_hasFailingTestAnnotation(memberMirror));
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/bug33196.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/bug33196.dart.weak.transformed.expect
index 79fa612..fe416ab 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/bug33196.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/bug33196.dart.weak.transformed.expect
@@ -10,7 +10,8 @@
   core::print(result.{core::Object::runtimeType});
 }
 static method returnsString() → FutureOr<core::String*>* /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::String*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::String*>();
+  final asy::_Future<core::String*>* :async_future = new asy::_Future::•<core::String*>();
+  core::bool* :is_sync = false;
   FutureOr<core::String*>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -24,15 +25,16 @@
         :return_value = "oh no";
         break #L1;
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/bug33206.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/bug33206.dart.weak.transformed.expect
index a6aaad8..389811c 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/bug33206.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/bug33206.dart.weak.transformed.expect
@@ -41,7 +41,8 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 static method f1() → asy::Future<core::List<core::Object*>*>* /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::List<core::Object*>*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::List<core::Object*>*>();
+  final asy::_Future<core::List<core::Object*>*>* :async_future = new asy::_Future::•<core::List<core::Object*>*>();
+  core::bool* :is_sync = false;
   FutureOr<core::List<core::Object*>*>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -55,22 +56,24 @@
         :return_value = <core::Object*>[1];
         break #L1;
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method f2() → core::List<core::Object*>*
   return <core::Object*>[2];
 static method f3() → asy::Future<core::Object*>* /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::Object*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::Object*>();
+  final asy::_Future<core::Object*>* :async_future = new asy::_Future::•<core::Object*>();
+  core::bool* :is_sync = false;
   FutureOr<core::Object*>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -84,20 +87,22 @@
         :return_value = 3;
         break #L2;
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method foo() → asy::Future<self::X*>* /* originally async */ {
-  final asy::_AsyncAwaitCompleter<self::X*>* :async_completer = new asy::_AsyncAwaitCompleter::•<self::X*>();
+  final asy::_Future<self::X*>* :async_future = new asy::_Future::•<self::X*>();
+  core::bool* :is_sync = false;
   FutureOr<self::X*>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -120,20 +125,22 @@
         :return_value = new self::X::•(_in::unsafeCast<self::Y*>(:async_temporary_0), _in::unsafeCast<core::Object*>(:result));
         break #L3;
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method main() → asy::Future<void>* /* originally async */ {
-  final asy::_AsyncAwaitCompleter<void>* :async_completer = new asy::_AsyncAwaitCompleter::•<void>();
+  final asy::_Future<void>* :async_future = new asy::_Future::•<void>();
+  core::bool* :is_sync = false;
   FutureOr<void>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -148,15 +155,16 @@
         [yield] let dynamic #t4 = asy::_awaitHelper(self::foo(), :async_op_then, :async_op_error, :async_op) in null;
         core::print(_in::unsafeCast<self::X*>(:result));
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/bug37476.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/bug37476.dart.weak.expect
index cf2e1f7..112e0e4 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/bug37476.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/bug37476.dart.weak.expect
@@ -8,7 +8,7 @@
     ;
   method foo() → <S extends self::A::T* = dynamic>(S*) →* void {
     core::print("foo: T = ${self::A::T*}");
-    return <S extends self::A::T* = self::A::T*>(S* a) → core::Null? {};
+    return <S extends self::A::T* = self::A::T*>(S* a) → Null {};
   }
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -27,7 +27,7 @@
     ;
   method foo() → (self::B::T*) →* void {
     core::print("foo: T = ${self::B::T*}");
-    return (self::B::T* a) → core::Null? {};
+    return (self::B::T* a) → Null {};
   }
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/bug37476.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/bug37476.dart.weak.transformed.expect
index cf2e1f7..112e0e4 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/bug37476.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/bug37476.dart.weak.transformed.expect
@@ -8,7 +8,7 @@
     ;
   method foo() → <S extends self::A::T* = dynamic>(S*) →* void {
     core::print("foo: T = ${self::A::T*}");
-    return <S extends self::A::T* = self::A::T*>(S* a) → core::Null? {};
+    return <S extends self::A::T* = self::A::T*>(S* a) → Null {};
   }
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -27,7 +27,7 @@
     ;
   method foo() → (self::B::T*) →* void {
     core::print("foo: T = ${self::B::T*}");
-    return (self::B::T* a) → core::Null? {};
+    return (self::B::T* a) → Null {};
   }
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/check_deferred_before_args2.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/check_deferred_before_args2.dart.weak.transformed.expect
index 8df91fe..ad4521b 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/check_deferred_before_args2.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/check_deferred_before_args2.dart.weak.transformed.expect
@@ -8,7 +8,8 @@
 
 static method main() → dynamic {}
 static method test() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic>* :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -24,17 +25,18 @@
         [yield] let dynamic #t2 = asy::_awaitHelper(LoadLibrary(lib), :async_op_then, :async_op_error, :async_op) in null;
         def::m(:result);
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 
 library;
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/constructor_const_inference.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/constructor_const_inference.dart.weak.expect
index 8adcafe..5bf2809 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/constructor_const_inference.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/constructor_const_inference.dart.weak.expect
@@ -40,11 +40,11 @@
 }
 static method main() → dynamic {
   dynamic x = new self::B::•<dynamic>().{self::A::x};
-  if(!(x is self::_Y<core::Null?>*)) {
+  if(!(x is self::_Y<Null>*)) {
     throw "Unexpected run-time type: `new B().x` is ${x.{core::Object::runtimeType}}, but `_Y<Null>` expected";
   }
 }
 
 constants  {
-  #C1 = self::_Y<core::Null?> {}
+  #C1 = self::_Y<Null> {}
 }
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/constructor_const_inference.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/constructor_const_inference.dart.weak.transformed.expect
index 8adcafe..5bf2809 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/constructor_const_inference.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/constructor_const_inference.dart.weak.transformed.expect
@@ -40,11 +40,11 @@
 }
 static method main() → dynamic {
   dynamic x = new self::B::•<dynamic>().{self::A::x};
-  if(!(x is self::_Y<core::Null?>*)) {
+  if(!(x is self::_Y<Null>*)) {
     throw "Unexpected run-time type: `new B().x` is ${x.{core::Object::runtimeType}}, but `_Y<Null>` expected";
   }
 }
 
 constants  {
-  #C1 = self::_Y<core::Null?> {}
+  #C1 = self::_Y<Null> {}
 }
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection.dart.weak.expect
index 3044135..dffdbc4 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection.dart.weak.expect
@@ -6,63 +6,63 @@
 static method main() → dynamic {
   final core::List<core::int*>* aList = block {
     final core::List<core::int*>* #t1 = <core::int*>[];
-    #t1.{core::List::add}(1);
+    #t1.{core::List::add}{Invariant}(1);
     if(self::oracle() as{TypeError,ForDynamic} core::bool*)
-      #t1.{core::List::add}(2);
+      #t1.{core::List::add}{Invariant}(2);
     if(self::oracle() as{TypeError,ForDynamic} core::bool*)
-      #t1.{core::List::add}(3);
+      #t1.{core::List::add}{Invariant}(3);
     else
-      #t1.{core::List::add}(1.{core::int::unary-}());
+      #t1.{core::List::add}{Invariant}(1.{core::int::unary-}());
     if(self::oracle() as{TypeError,ForDynamic} core::bool*)
       if(self::oracle() as{TypeError,ForDynamic} core::bool*)
-        #t1.{core::List::add}(4);
+        #t1.{core::List::add}{Invariant}(4);
     for (core::int* i in <core::int*>[5, 6, 7])
-      #t1.{core::List::add}(i);
+      #t1.{core::List::add}{Invariant}(i);
     for (core::int* i in <core::int*>[8, 9, 10])
       if(self::oracle() as{TypeError,ForDynamic} core::bool*)
-        #t1.{core::List::add}(i);
+        #t1.{core::List::add}{Invariant}(i);
     for (core::int* i = 11; i.{core::num::<=}(14); i = i.{core::num::+}(1))
-      #t1.{core::List::add}(i);
+      #t1.{core::List::add}{Invariant}(i);
   } =>#t1;
   final core::Set<core::int*>* aSet = block {
     final core::Set<core::int*>* #t2 = col::LinkedHashSet::•<core::int*>();
-    #t2.{core::Set::add}(1);
+    #t2.{core::Set::add}{Invariant}(1);
     if(self::oracle() as{TypeError,ForDynamic} core::bool*)
-      #t2.{core::Set::add}(2);
+      #t2.{core::Set::add}{Invariant}(2);
     if(self::oracle() as{TypeError,ForDynamic} core::bool*)
-      #t2.{core::Set::add}(3);
+      #t2.{core::Set::add}{Invariant}(3);
     else
-      #t2.{core::Set::add}(1.{core::int::unary-}());
+      #t2.{core::Set::add}{Invariant}(1.{core::int::unary-}());
     if(self::oracle() as{TypeError,ForDynamic} core::bool*)
       if(self::oracle() as{TypeError,ForDynamic} core::bool*)
-        #t2.{core::Set::add}(4);
+        #t2.{core::Set::add}{Invariant}(4);
     for (core::int* i in <core::int*>[5, 6, 7])
-      #t2.{core::Set::add}(i);
+      #t2.{core::Set::add}{Invariant}(i);
     for (core::int* i in <core::int*>[8, 9, 10])
       if(self::oracle() as{TypeError,ForDynamic} core::bool*)
-        #t2.{core::Set::add}(i);
+        #t2.{core::Set::add}{Invariant}(i);
     for (core::int* i = 11; i.{core::num::<=}(14); i = i.{core::num::+}(1))
-      #t2.{core::Set::add}(i);
+      #t2.{core::Set::add}{Invariant}(i);
   } =>#t2;
   final core::Map<core::int*, core::int*>* aMap = block {
     final core::Map<core::int*, core::int*>* #t3 = <core::int*, core::int*>{};
-    #t3.{core::Map::[]=}(1, 1);
+    #t3.{core::Map::[]=}{Invariant}(1, 1);
     if(self::oracle() as{TypeError,ForDynamic} core::bool*)
-      #t3.{core::Map::[]=}(2, 2);
+      #t3.{core::Map::[]=}{Invariant}(2, 2);
     if(self::oracle() as{TypeError,ForDynamic} core::bool*)
-      #t3.{core::Map::[]=}(3, 3);
+      #t3.{core::Map::[]=}{Invariant}(3, 3);
     else
-      #t3.{core::Map::[]=}(1.{core::int::unary-}(), 1.{core::int::unary-}());
+      #t3.{core::Map::[]=}{Invariant}(1.{core::int::unary-}(), 1.{core::int::unary-}());
     if(self::oracle() as{TypeError,ForDynamic} core::bool*)
       if(self::oracle() as{TypeError,ForDynamic} core::bool*)
-        #t3.{core::Map::[]=}(4, 4);
+        #t3.{core::Map::[]=}{Invariant}(4, 4);
     for (core::int* i in <core::int*>[5, 6, 7])
-      #t3.{core::Map::[]=}(i, i);
+      #t3.{core::Map::[]=}{Invariant}(i, i);
     for (core::int* i in <core::int*>[8, 9, 10])
       if(self::oracle() as{TypeError,ForDynamic} core::bool*)
-        #t3.{core::Map::[]=}(i, i);
+        #t3.{core::Map::[]=}{Invariant}(i, i);
     for (core::int* i = 11; i.{core::num::<=}(14); i = i.{core::num::+}(1))
-      #t3.{core::Map::[]=}(i, i);
+      #t3.{core::Map::[]=}{Invariant}(i, i);
   } =>#t3;
   core::print(aList);
   core::print(aSet);
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection.dart.weak.transformed.expect
index fa89fde..c62af95 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection.dart.weak.transformed.expect
@@ -6,21 +6,21 @@
 static method main() → dynamic {
   final core::List<core::int*>* aList = block {
     final core::List<core::int*>* #t1 = <core::int*>[];
-    #t1.{core::List::add}(1);
+    #t1.{core::List::add}{Invariant}(1);
     if(self::oracle() as{TypeError,ForDynamic} core::bool*)
-      #t1.{core::List::add}(2);
+      #t1.{core::List::add}{Invariant}(2);
     if(self::oracle() as{TypeError,ForDynamic} core::bool*)
-      #t1.{core::List::add}(3);
+      #t1.{core::List::add}{Invariant}(3);
     else
-      #t1.{core::List::add}(1.{core::int::unary-}());
+      #t1.{core::List::add}{Invariant}(1.{core::int::unary-}());
     if(self::oracle() as{TypeError,ForDynamic} core::bool*)
       if(self::oracle() as{TypeError,ForDynamic} core::bool*)
-        #t1.{core::List::add}(4);
+        #t1.{core::List::add}{Invariant}(4);
     {
       core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[5, 6, 7].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         core::int* i = :sync-for-iterator.{core::Iterator::current};
-        #t1.{core::List::add}(i);
+        #t1.{core::List::add}{Invariant}(i);
       }
     }
     {
@@ -28,29 +28,29 @@
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         core::int* i = :sync-for-iterator.{core::Iterator::current};
         if(self::oracle() as{TypeError,ForDynamic} core::bool*)
-          #t1.{core::List::add}(i);
+          #t1.{core::List::add}{Invariant}(i);
       }
     }
     for (core::int* i = 11; i.{core::num::<=}(14); i = i.{core::num::+}(1))
-      #t1.{core::List::add}(i);
+      #t1.{core::List::add}{Invariant}(i);
   } =>#t1;
   final core::Set<core::int*>* aSet = block {
     final core::Set<core::int*>* #t2 = new col::_CompactLinkedHashSet::•<core::int*>();
-    #t2.{core::Set::add}(1);
+    #t2.{core::Set::add}{Invariant}(1);
     if(self::oracle() as{TypeError,ForDynamic} core::bool*)
-      #t2.{core::Set::add}(2);
+      #t2.{core::Set::add}{Invariant}(2);
     if(self::oracle() as{TypeError,ForDynamic} core::bool*)
-      #t2.{core::Set::add}(3);
+      #t2.{core::Set::add}{Invariant}(3);
     else
-      #t2.{core::Set::add}(1.{core::int::unary-}());
+      #t2.{core::Set::add}{Invariant}(1.{core::int::unary-}());
     if(self::oracle() as{TypeError,ForDynamic} core::bool*)
       if(self::oracle() as{TypeError,ForDynamic} core::bool*)
-        #t2.{core::Set::add}(4);
+        #t2.{core::Set::add}{Invariant}(4);
     {
       core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[5, 6, 7].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         core::int* i = :sync-for-iterator.{core::Iterator::current};
-        #t2.{core::Set::add}(i);
+        #t2.{core::Set::add}{Invariant}(i);
       }
     }
     {
@@ -58,29 +58,29 @@
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         core::int* i = :sync-for-iterator.{core::Iterator::current};
         if(self::oracle() as{TypeError,ForDynamic} core::bool*)
-          #t2.{core::Set::add}(i);
+          #t2.{core::Set::add}{Invariant}(i);
       }
     }
     for (core::int* i = 11; i.{core::num::<=}(14); i = i.{core::num::+}(1))
-      #t2.{core::Set::add}(i);
+      #t2.{core::Set::add}{Invariant}(i);
   } =>#t2;
   final core::Map<core::int*, core::int*>* aMap = block {
     final core::Map<core::int*, core::int*>* #t3 = <core::int*, core::int*>{};
-    #t3.{core::Map::[]=}(1, 1);
+    #t3.{core::Map::[]=}{Invariant}(1, 1);
     if(self::oracle() as{TypeError,ForDynamic} core::bool*)
-      #t3.{core::Map::[]=}(2, 2);
+      #t3.{core::Map::[]=}{Invariant}(2, 2);
     if(self::oracle() as{TypeError,ForDynamic} core::bool*)
-      #t3.{core::Map::[]=}(3, 3);
+      #t3.{core::Map::[]=}{Invariant}(3, 3);
     else
-      #t3.{core::Map::[]=}(1.{core::int::unary-}(), 1.{core::int::unary-}());
+      #t3.{core::Map::[]=}{Invariant}(1.{core::int::unary-}(), 1.{core::int::unary-}());
     if(self::oracle() as{TypeError,ForDynamic} core::bool*)
       if(self::oracle() as{TypeError,ForDynamic} core::bool*)
-        #t3.{core::Map::[]=}(4, 4);
+        #t3.{core::Map::[]=}{Invariant}(4, 4);
     {
       core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[5, 6, 7].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         core::int* i = :sync-for-iterator.{core::Iterator::current};
-        #t3.{core::Map::[]=}(i, i);
+        #t3.{core::Map::[]=}{Invariant}(i, i);
       }
     }
     {
@@ -88,11 +88,11 @@
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         core::int* i = :sync-for-iterator.{core::Iterator::current};
         if(self::oracle() as{TypeError,ForDynamic} core::bool*)
-          #t3.{core::Map::[]=}(i, i);
+          #t3.{core::Map::[]=}{Invariant}(i, i);
       }
     }
     for (core::int* i = 11; i.{core::num::<=}(14); i = i.{core::num::+}(1))
-      #t3.{core::Map::[]=}(i, i);
+      #t3.{core::Map::[]=}{Invariant}(i, i);
   } =>#t3;
   core::print(aList);
   core::print(aSet);
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart.weak.expect
index 014a02e..9301e7e 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart.weak.expect
@@ -454,195 +454,195 @@
   core::List<core::int*>* list10 = block {
     final core::List<core::int*>* #t1 = <core::int*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t1.{core::List::add}(42);
+      #t1.{core::List::add}{Invariant}(42);
   } =>#t1;
   core::Set<core::int*>* set10 = block {
     final core::Set<core::int*>* #t2 = col::LinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t2.{core::Set::add}(42);
-    #t2.{core::Set::add}(null);
+      #t2.{core::Set::add}{Invariant}(42);
+    #t2.{core::Set::add}{Invariant}(null);
   } =>#t2;
   core::Map<core::String*, core::int*>* map10 = block {
     final core::Map<core::String*, core::int*>* #t3 = <core::String*, core::int*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t3.{core::Map::[]=}("bar", 42);
-    #t3.{core::Map::[]=}("baz", null);
+      #t3.{core::Map::[]=}{Invariant}("bar", 42);
+    #t3.{core::Map::[]=}{Invariant}("baz", null);
   } =>#t3;
   core::List<dynamic>* list11 = block {
     final core::List<dynamic>* #t4 = <dynamic>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t4.{core::List::add}(dynVar);
+      #t4.{core::List::add}{Invariant}(dynVar);
   } =>#t4;
   core::Set<dynamic>* set11 = block {
     final core::Set<dynamic>* #t5 = col::LinkedHashSet::•<dynamic>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t5.{core::Set::add}(dynVar);
-    #t5.{core::Set::add}(null);
+      #t5.{core::Set::add}{Invariant}(dynVar);
+    #t5.{core::Set::add}{Invariant}(null);
   } =>#t5;
   core::Map<core::String*, dynamic>* map11 = block {
     final core::Map<core::String*, dynamic>* #t6 = <core::String*, dynamic>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t6.{core::Map::[]=}("bar", dynVar);
-    #t6.{core::Map::[]=}("baz", null);
+      #t6.{core::Map::[]=}{Invariant}("bar", dynVar);
+    #t6.{core::Map::[]=}{Invariant}("baz", null);
   } =>#t6;
   core::List<core::List<core::int*>*>* list12 = block {
     final core::List<core::List<core::int*>*>* #t7 = <core::List<core::int*>*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t7.{core::List::add}(<core::int*>[42]);
+      #t7.{core::List::add}{Invariant}(<core::int*>[42]);
   } =>#t7;
   core::Set<core::List<core::int*>*>* set12 = block {
     final core::Set<core::List<core::int*>*>* #t8 = col::LinkedHashSet::•<core::List<core::int*>*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t8.{core::Set::add}(<core::int*>[42]);
-    #t8.{core::Set::add}(null);
+      #t8.{core::Set::add}{Invariant}(<core::int*>[42]);
+    #t8.{core::Set::add}{Invariant}(null);
   } =>#t8;
   core::Map<core::String*, core::List<core::int*>*>* map12 = block {
     final core::Map<core::String*, core::List<core::int*>*>* #t9 = <core::String*, core::List<core::int*>*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t9.{core::Map::[]=}("bar", <core::int*>[42]);
-    #t9.{core::Map::[]=}("baz", null);
+      #t9.{core::Map::[]=}{Invariant}("bar", <core::int*>[42]);
+    #t9.{core::Map::[]=}{Invariant}("baz", null);
   } =>#t9;
   core::List<core::int*>* list20 = block {
     final core::List<core::int*>* #t10 = <core::int*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       for (final core::int* #t11 in <core::int*>[42])
-        #t10.{core::List::add}(#t11);
+        #t10.{core::List::add}{Invariant}(#t11);
   } =>#t10;
   core::Set<core::int*>* set20 = block {
     final core::Set<core::int*>* #t12 = col::LinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       for (final core::int* #t13 in <core::int*>[42])
-        #t12.{core::Set::add}(#t13);
-    #t12.{core::Set::add}(null);
+        #t12.{core::Set::add}{Invariant}(#t13);
+    #t12.{core::Set::add}{Invariant}(null);
   } =>#t12;
   core::Map<core::String*, core::int*>* map20 = block {
     final core::Map<core::String*, core::int*>* #t14 = <core::String*, core::int*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       for (final core::MapEntry<core::String*, core::int*>* #t15 in <core::String*, core::int*>{"bar": 42}.{core::Map::entries})
-        #t14.{core::Map::[]=}(#t15.{core::MapEntry::key}, #t15.{core::MapEntry::value});
-    #t14.{core::Map::[]=}("baz", null);
+        #t14.{core::Map::[]=}{Invariant}(#t15.{core::MapEntry::key}, #t15.{core::MapEntry::value});
+    #t14.{core::Map::[]=}{Invariant}("baz", null);
   } =>#t14;
   core::List<dynamic>* list21 = block {
     final core::List<dynamic>* #t16 = <dynamic>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       for (final dynamic #t17 in <dynamic>[dynVar])
-        #t16.{core::List::add}(#t17);
+        #t16.{core::List::add}{Invariant}(#t17);
   } =>#t16;
   core::Set<dynamic>* set21 = block {
     final core::Set<dynamic>* #t18 = col::LinkedHashSet::•<dynamic>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       for (final dynamic #t19 in <dynamic>[dynVar])
-        #t18.{core::Set::add}(#t19);
-    #t18.{core::Set::add}(null);
+        #t18.{core::Set::add}{Invariant}(#t19);
+    #t18.{core::Set::add}{Invariant}(null);
   } =>#t18;
   core::Map<core::String*, dynamic>* map21 = block {
     final core::Map<core::String*, dynamic>* #t20 = <core::String*, dynamic>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       for (final core::MapEntry<core::String*, dynamic>* #t21 in <core::String*, dynamic>{"bar": dynVar}.{core::Map::entries})
-        #t20.{core::Map::[]=}(#t21.{core::MapEntry::key}, #t21.{core::MapEntry::value});
-    #t20.{core::Map::[]=}("baz", null);
+        #t20.{core::Map::[]=}{Invariant}(#t21.{core::MapEntry::key}, #t21.{core::MapEntry::value});
+    #t20.{core::Map::[]=}{Invariant}("baz", null);
   } =>#t20;
   core::List<core::List<core::int*>*>* list22 = block {
     final core::List<core::List<core::int*>*>* #t22 = <core::List<core::int*>*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       for (final core::List<core::int*>* #t23 in <core::List<core::int*>*>[<core::int*>[42]])
-        #t22.{core::List::add}(#t23);
+        #t22.{core::List::add}{Invariant}(#t23);
   } =>#t22;
   core::Set<core::List<core::int*>*>* set22 = block {
     final core::Set<core::List<core::int*>*>* #t24 = col::LinkedHashSet::•<core::List<core::int*>*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       for (final core::List<core::int*>* #t25 in <core::List<core::int*>*>[<core::int*>[42]])
-        #t24.{core::Set::add}(#t25);
-    #t24.{core::Set::add}(null);
+        #t24.{core::Set::add}{Invariant}(#t25);
+    #t24.{core::Set::add}{Invariant}(null);
   } =>#t24;
   core::Map<core::String*, core::List<core::int*>*>* map22 = block {
     final core::Map<core::String*, core::List<core::int*>*>* #t26 = <core::String*, core::List<core::int*>*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t27 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[42]}.{core::Map::entries})
-        #t26.{core::Map::[]=}(#t27.{core::MapEntry::key}, #t27.{core::MapEntry::value});
-    #t26.{core::Map::[]=}("baz", null);
+        #t26.{core::Map::[]=}{Invariant}(#t27.{core::MapEntry::key}, #t27.{core::MapEntry::value});
+    #t26.{core::Map::[]=}{Invariant}("baz", null);
   } =>#t26;
   core::List<core::int*>* list30 = block {
     final core::List<core::int*>* #t28 = <core::int*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
         for (final core::int* #t29 in <core::int*>[42])
-          #t28.{core::List::add}(#t29);
+          #t28.{core::List::add}{Invariant}(#t29);
   } =>#t28;
   core::Set<core::int*>* set30 = block {
     final core::Set<core::int*>* #t30 = col::LinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
         for (final core::int* #t31 in <core::int*>[42])
-          #t30.{core::Set::add}(#t31);
-    #t30.{core::Set::add}(null);
+          #t30.{core::Set::add}{Invariant}(#t31);
+    #t30.{core::Set::add}{Invariant}(null);
   } =>#t30;
   core::Map<core::String*, core::int*>* map30 = block {
     final core::Map<core::String*, core::int*>* #t32 = <core::String*, core::int*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
         for (final core::MapEntry<core::String*, core::int*>* #t33 in <core::String*, core::int*>{"bar": 42}.{core::Map::entries})
-          #t32.{core::Map::[]=}(#t33.{core::MapEntry::key}, #t33.{core::MapEntry::value});
-    #t32.{core::Map::[]=}("baz", null);
+          #t32.{core::Map::[]=}{Invariant}(#t33.{core::MapEntry::key}, #t33.{core::MapEntry::value});
+    #t32.{core::Map::[]=}{Invariant}("baz", null);
   } =>#t32;
   core::List<dynamic>* list31 = block {
     final core::List<dynamic>* #t34 = <dynamic>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
         for (final dynamic #t35 in <dynamic>[dynVar])
-          #t34.{core::List::add}(#t35);
+          #t34.{core::List::add}{Invariant}(#t35);
   } =>#t34;
   core::Set<dynamic>* set31 = block {
     final core::Set<dynamic>* #t36 = col::LinkedHashSet::•<dynamic>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
         for (final dynamic #t37 in <dynamic>[dynVar])
-          #t36.{core::Set::add}(#t37);
-    #t36.{core::Set::add}(null);
+          #t36.{core::Set::add}{Invariant}(#t37);
+    #t36.{core::Set::add}{Invariant}(null);
   } =>#t36;
   core::Map<core::String*, dynamic>* map31 = block {
     final core::Map<core::String*, dynamic>* #t38 = <core::String*, dynamic>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
         for (final core::MapEntry<core::String*, dynamic>* #t39 in <core::String*, dynamic>{"bar": dynVar}.{core::Map::entries})
-          #t38.{core::Map::[]=}(#t39.{core::MapEntry::key}, #t39.{core::MapEntry::value});
-    #t38.{core::Map::[]=}("baz", null);
+          #t38.{core::Map::[]=}{Invariant}(#t39.{core::MapEntry::key}, #t39.{core::MapEntry::value});
+    #t38.{core::Map::[]=}{Invariant}("baz", null);
   } =>#t38;
   core::List<core::List<core::int*>*>* list33 = block {
     final core::List<core::List<core::int*>*>* #t40 = <core::List<core::int*>*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
         for (final core::List<core::int*>* #t41 in <core::List<core::int*>*>[<core::int*>[42]])
-          #t40.{core::List::add}(#t41);
+          #t40.{core::List::add}{Invariant}(#t41);
   } =>#t40;
   core::Set<core::List<core::int*>*>* set33 = block {
     final core::Set<core::List<core::int*>*>* #t42 = col::LinkedHashSet::•<core::List<core::int*>*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
         for (final core::List<core::int*>* #t43 in <core::List<core::int*>*>[<core::int*>[42]])
-          #t42.{core::Set::add}(#t43);
-    #t42.{core::Set::add}(null);
+          #t42.{core::Set::add}{Invariant}(#t43);
+    #t42.{core::Set::add}{Invariant}(null);
   } =>#t42;
   core::Map<core::String*, core::List<core::int*>*>* map33 = block {
     final core::Map<core::String*, core::List<core::int*>*>* #t44 = <core::String*, core::List<core::int*>*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
         for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t45 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[42]}.{core::Map::entries})
-          #t44.{core::Map::[]=}(#t45.{core::MapEntry::key}, #t45.{core::MapEntry::value});
-    #t44.{core::Map::[]=}("baz", null);
+          #t44.{core::Map::[]=}{Invariant}(#t45.{core::MapEntry::key}, #t45.{core::MapEntry::value});
+    #t44.{core::Map::[]=}{Invariant}("baz", null);
   } =>#t44;
   core::List<core::List<core::int*>*>* list40 = block {
     final core::List<core::List<core::int*>*>* #t46 = <core::List<core::int*>*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       for (final core::List<core::int*>* #t47 in <core::List<core::int*>*>[<core::int*>[]])
-        #t46.{core::List::add}(#t47);
+        #t46.{core::List::add}{Invariant}(#t47);
   } =>#t46;
   core::Set<core::List<core::int*>*>* set40 = block {
     final core::Set<core::List<core::int*>*>* #t48 = col::LinkedHashSet::•<core::List<core::int*>*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       for (final core::List<core::int*>* #t49 in <core::List<core::int*>*>[<core::int*>[]])
-        #t48.{core::Set::add}(#t49);
-    #t48.{core::Set::add}(null);
+        #t48.{core::Set::add}{Invariant}(#t49);
+    #t48.{core::Set::add}{Invariant}(null);
   } =>#t48;
   core::Map<core::String*, core::List<core::int*>*>* map40 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:41:34: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
   Map<String, List<int>> map40 = {if (oracle(\"foo\")) ...{\"bar\", []}, \"baz\": null};
@@ -650,398 +650,408 @@
   core::List<core::List<core::int*>*>* list41 = block {
     final core::List<core::List<core::int*>*>* #t50 = <core::List<core::int*>*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      for (final core::List<core::int*>* #t51 in let final core::Set<core::List<core::int*>*>* #t52 = col::LinkedHashSet::•<core::List<core::int*>*>() in let final dynamic #t53 = #t52.{core::Set::add}(<core::int*>[]) in #t52)
-        #t50.{core::List::add}(#t51);
+      for (final core::List<core::int*>* #t51 in block {
+        final core::Set<core::List<core::int*>*>* #t52 = col::LinkedHashSet::•<core::List<core::int*>*>();
+        #t52.{core::Set::add}{Invariant}(<core::int*>[]);
+      } =>#t52)
+        #t50.{core::List::add}{Invariant}(#t51);
   } =>#t50;
   core::Set<core::List<core::int*>*>* set41 = block {
-    final core::Set<core::List<core::int*>*>* #t54 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    final core::Set<core::List<core::int*>*>* #t53 = col::LinkedHashSet::•<core::List<core::int*>*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      for (final core::List<core::int*>* #t55 in let final core::Set<core::List<core::int*>*>* #t56 = col::LinkedHashSet::•<core::List<core::int*>*>() in let final dynamic #t57 = #t56.{core::Set::add}(<core::int*>[]) in #t56)
-        #t54.{core::Set::add}(#t55);
-    #t54.{core::Set::add}(null);
-  } =>#t54;
+      for (final core::List<core::int*>* #t54 in block {
+        final core::Set<core::List<core::int*>*>* #t55 = col::LinkedHashSet::•<core::List<core::int*>*>();
+        #t55.{core::Set::add}{Invariant}(<core::int*>[]);
+      } =>#t55)
+        #t53.{core::Set::add}{Invariant}(#t54);
+    #t53.{core::Set::add}{Invariant}(null);
+  } =>#t53;
   core::List<core::List<core::int*>*>* list42 = block {
-    final core::List<core::List<core::int*>*>* #t58 = <core::List<core::int*>*>[];
+    final core::List<core::List<core::int*>*>* #t56 = <core::List<core::int*>*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
+        for (final core::List<core::int*>* #t57 in <core::List<core::int*>*>[<core::int*>[]])
+          #t56.{core::List::add}{Invariant}(#t57);
+  } =>#t56;
+  core::Set<core::List<core::int*>*>* set42 = block {
+    final core::Set<core::List<core::int*>*>* #t58 = col::LinkedHashSet::•<core::List<core::int*>*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
         for (final core::List<core::int*>* #t59 in <core::List<core::int*>*>[<core::int*>[]])
-          #t58.{core::List::add}(#t59);
+          #t58.{core::Set::add}{Invariant}(#t59);
+    #t58.{core::Set::add}{Invariant}(null);
   } =>#t58;
-  core::Set<core::List<core::int*>*>* set42 = block {
-    final core::Set<core::List<core::int*>*>* #t60 = col::LinkedHashSet::•<core::List<core::int*>*>();
-    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        for (final core::List<core::int*>* #t61 in <core::List<core::int*>*>[<core::int*>[]])
-          #t60.{core::Set::add}(#t61);
-    #t60.{core::Set::add}(null);
-  } =>#t60;
   core::Map<core::String*, core::List<core::int*>*>* map42 = block {
-    final core::Map<core::String*, core::List<core::int*>*>* #t62 = <core::String*, core::List<core::int*>*>{};
+    final core::Map<core::String*, core::List<core::int*>*>* #t60 = <core::String*, core::List<core::int*>*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t63 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[]}.{core::Map::entries})
-          #t62.{core::Map::[]=}(#t63.{core::MapEntry::key}, #t63.{core::MapEntry::value});
-    #t62.{core::Map::[]=}("baz", null);
-  } =>#t62;
+        for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t61 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[]}.{core::Map::entries})
+          #t60.{core::Map::[]=}{Invariant}(#t61.{core::MapEntry::key}, #t61.{core::MapEntry::value});
+    #t60.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t60;
   core::List<core::int*>* list50 = block {
-    final core::List<core::int*>* #t64 = <core::int*>[];
+    final core::List<core::int*>* #t62 = <core::int*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      for (final core::int* #t63 in <core::int*>[])
+        #t62.{core::List::add}{Invariant}(#t63);
+  } =>#t62;
+  core::Set<core::int*>* set50 = block {
+    final core::Set<core::int*>* #t64 = col::LinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       for (final core::int* #t65 in <core::int*>[])
-        #t64.{core::List::add}(#t65);
+        #t64.{core::Set::add}{Invariant}(#t65);
+    #t64.{core::Set::add}{Invariant}(null);
   } =>#t64;
-  core::Set<core::int*>* set50 = block {
-    final core::Set<core::int*>* #t66 = col::LinkedHashSet::•<core::int*>();
-    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      for (final core::int* #t67 in <core::int*>[])
-        #t66.{core::Set::add}(#t67);
-    #t66.{core::Set::add}(null);
-  } =>#t66;
   core::Map<core::String*, core::int*>* map50 = block {
-    final core::Map<core::String*, core::int*>* #t68 = <core::String*, core::int*>{};
+    final core::Map<core::String*, core::int*>* #t66 = <core::String*, core::int*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      for (final core::MapEntry<core::String*, core::int*>* #t69 in <core::String*, core::int*>{}.{core::Map::entries})
-        #t68.{core::Map::[]=}(#t69.{core::MapEntry::key}, #t69.{core::MapEntry::value});
-    #t68.{core::Map::[]=}("baz", null);
-  } =>#t68;
+      for (final core::MapEntry<core::String*, core::int*>* #t67 in <core::String*, core::int*>{}.{core::Map::entries})
+        #t66.{core::Map::[]=}{Invariant}(#t67.{core::MapEntry::key}, #t67.{core::MapEntry::value});
+    #t66.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t66;
   core::List<core::int*>* list51 = block {
-    final core::List<core::int*>* #t70 = <core::int*>[];
+    final core::List<core::int*>* #t68 = <core::int*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      for (final core::int* #t71 in let final core::Set<core::int*>* #t72 = col::LinkedHashSet::•<core::int*>() in #t72)
-        #t70.{core::List::add}(#t71);
-  } =>#t70;
+      for (final core::int* #t69 in block {
+        final core::Set<core::int*>* #t70 = col::LinkedHashSet::•<core::int*>();
+      } =>#t70)
+        #t68.{core::List::add}{Invariant}(#t69);
+  } =>#t68;
   core::Set<core::int*>* set51 = block {
-    final core::Set<core::int*>* #t73 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t71 = col::LinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      for (final core::int* #t74 in let final core::Set<core::int*>* #t75 = col::LinkedHashSet::•<core::int*>() in #t75)
-        #t73.{core::Set::add}(#t74);
-    #t73.{core::Set::add}(null);
-  } =>#t73;
+      for (final core::int* #t72 in block {
+        final core::Set<core::int*>* #t73 = col::LinkedHashSet::•<core::int*>();
+      } =>#t73)
+        #t71.{core::Set::add}{Invariant}(#t72);
+    #t71.{core::Set::add}{Invariant}(null);
+  } =>#t71;
   core::List<core::int*>* list52 = block {
-    final core::List<core::int*>* #t76 = <core::int*>[];
+    final core::List<core::int*>* #t74 = <core::int*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
+        for (final core::int* #t75 in <core::int*>[])
+          #t74.{core::List::add}{Invariant}(#t75);
+  } =>#t74;
+  core::Set<core::int*>* set52 = block {
+    final core::Set<core::int*>* #t76 = col::LinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
         for (final core::int* #t77 in <core::int*>[])
-          #t76.{core::List::add}(#t77);
+          #t76.{core::Set::add}{Invariant}(#t77);
+    #t76.{core::Set::add}{Invariant}(null);
   } =>#t76;
-  core::Set<core::int*>* set52 = block {
-    final core::Set<core::int*>* #t78 = col::LinkedHashSet::•<core::int*>();
-    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        for (final core::int* #t79 in <core::int*>[])
-          #t78.{core::Set::add}(#t79);
-    #t78.{core::Set::add}(null);
-  } =>#t78;
   core::Map<core::String*, core::int*>* map52 = block {
-    final core::Map<core::String*, core::int*>* #t80 = <core::String*, core::int*>{};
+    final core::Map<core::String*, core::int*>* #t78 = <core::String*, core::int*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        for (final core::MapEntry<core::String*, core::int*>* #t81 in <core::String*, core::int*>{}.{core::Map::entries})
-          #t80.{core::Map::[]=}(#t81.{core::MapEntry::key}, #t81.{core::MapEntry::value});
-    #t80.{core::Map::[]=}("baz", null);
-  } =>#t80;
+        for (final core::MapEntry<core::String*, core::int*>* #t79 in <core::String*, core::int*>{}.{core::Map::entries})
+          #t78.{core::Map::[]=}{Invariant}(#t79.{core::MapEntry::key}, #t79.{core::MapEntry::value});
+    #t78.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t78;
   core::List<core::List<core::int*>*>* list60 = block {
-    final core::List<core::List<core::int*>*>* #t82 = <core::List<core::int*>*>[];
+    final core::List<core::List<core::int*>*>* #t80 = <core::List<core::int*>*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      for (final core::List<core::int*>* #t81 in <core::List<core::int*>*>[<core::int*>[]])
+        #t80.{core::List::add}{Invariant}(#t81);
+  } =>#t80;
+  core::Set<core::List<core::int*>*>* set60 = block {
+    final core::Set<core::List<core::int*>*>* #t82 = col::LinkedHashSet::•<core::List<core::int*>*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       for (final core::List<core::int*>* #t83 in <core::List<core::int*>*>[<core::int*>[]])
-        #t82.{core::List::add}(#t83);
+        #t82.{core::Set::add}{Invariant}(#t83);
+    #t82.{core::Set::add}{Invariant}(null);
   } =>#t82;
-  core::Set<core::List<core::int*>*>* set60 = block {
-    final core::Set<core::List<core::int*>*>* #t84 = col::LinkedHashSet::•<core::List<core::int*>*>();
-    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      for (final core::List<core::int*>* #t85 in <core::List<core::int*>*>[<core::int*>[]])
-        #t84.{core::Set::add}(#t85);
-    #t84.{core::Set::add}(null);
-  } =>#t84;
   core::Map<core::String*, core::List<core::int*>*>* map60 = block {
-    final core::Map<core::String*, core::List<core::int*>*>* #t86 = <core::String*, core::List<core::int*>*>{};
+    final core::Map<core::String*, core::List<core::int*>*>* #t84 = <core::String*, core::List<core::int*>*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t87 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[]}.{core::Map::entries})
-        #t86.{core::Map::[]=}(#t87.{core::MapEntry::key}, #t87.{core::MapEntry::value});
-    #t86.{core::Map::[]=}("baz", null);
-  } =>#t86;
+      for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t85 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[]}.{core::Map::entries})
+        #t84.{core::Map::[]=}{Invariant}(#t85.{core::MapEntry::key}, #t85.{core::MapEntry::value});
+    #t84.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t84;
   core::List<core::List<core::int*>*>* list61 = block {
-    final core::List<core::List<core::int*>*>* #t88 = <core::List<core::int*>*>[];
+    final core::List<core::List<core::int*>*>* #t86 = <core::List<core::int*>*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
+        for (final core::List<core::int*>* #t87 in <core::List<core::int*>*>[<core::int*>[]])
+          #t86.{core::List::add}{Invariant}(#t87);
+  } =>#t86;
+  core::Set<core::List<core::int*>*>* set61 = block {
+    final core::Set<core::List<core::int*>*>* #t88 = col::LinkedHashSet::•<core::List<core::int*>*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
         for (final core::List<core::int*>* #t89 in <core::List<core::int*>*>[<core::int*>[]])
-          #t88.{core::List::add}(#t89);
+          #t88.{core::Set::add}{Invariant}(#t89);
+    #t88.{core::Set::add}{Invariant}(null);
   } =>#t88;
-  core::Set<core::List<core::int*>*>* set61 = block {
-    final core::Set<core::List<core::int*>*>* #t90 = col::LinkedHashSet::•<core::List<core::int*>*>();
-    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        for (final core::List<core::int*>* #t91 in <core::List<core::int*>*>[<core::int*>[]])
-          #t90.{core::Set::add}(#t91);
-    #t90.{core::Set::add}(null);
-  } =>#t90;
   core::Map<core::String*, core::List<core::int*>*>* map61 = block {
-    final core::Map<core::String*, core::List<core::int*>*>* #t92 = <core::String*, core::List<core::int*>*>{};
+    final core::Map<core::String*, core::List<core::int*>*>* #t90 = <core::String*, core::List<core::int*>*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t93 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[]}.{core::Map::entries})
-          #t92.{core::Map::[]=}(#t93.{core::MapEntry::key}, #t93.{core::MapEntry::value});
-    #t92.{core::Map::[]=}("baz", null);
-  } =>#t92;
+        for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t91 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[]}.{core::Map::entries})
+          #t90.{core::Map::[]=}{Invariant}(#t91.{core::MapEntry::key}, #t91.{core::MapEntry::value});
+    #t90.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t90;
   core::List<core::List<core::int*>*>* list70 = block {
+    final core::List<core::List<core::int*>*>* #t92 = <core::List<core::int*>*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      #t92.{core::List::add}{Invariant}(<core::int*>[]);
+  } =>#t92;
+  core::Set<core::List<core::int*>*>* set70 = block {
+    final core::Set<core::List<core::int*>*>* #t93 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      #t93.{core::Set::add}{Invariant}(<core::int*>[]);
+    #t93.{core::Set::add}{Invariant}(null);
+  } =>#t93;
+  core::List<core::List<core::int*>*>* list71 = block {
     final core::List<core::List<core::int*>*>* #t94 = <core::List<core::int*>*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t94.{core::List::add}(<core::int*>[]);
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
+        #t94.{core::List::add}{Invariant}(<core::int*>[]);
   } =>#t94;
-  core::Set<core::List<core::int*>*>* set70 = block {
+  core::Set<core::List<core::int*>*>* set71 = block {
     final core::Set<core::List<core::int*>*>* #t95 = col::LinkedHashSet::•<core::List<core::int*>*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t95.{core::Set::add}(<core::int*>[]);
-    #t95.{core::Set::add}(null);
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
+        #t95.{core::Set::add}{Invariant}(<core::int*>[]);
+    #t95.{core::Set::add}{Invariant}(null);
   } =>#t95;
-  core::List<core::List<core::int*>*>* list71 = block {
-    final core::List<core::List<core::int*>*>* #t96 = <core::List<core::int*>*>[];
-    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t96.{core::List::add}(<core::int*>[]);
-  } =>#t96;
-  core::Set<core::List<core::int*>*>* set71 = block {
-    final core::Set<core::List<core::int*>*>* #t97 = col::LinkedHashSet::•<core::List<core::int*>*>();
-    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t97.{core::Set::add}(<core::int*>[]);
-    #t97.{core::Set::add}(null);
-  } =>#t97;
   core::List<core::num*>* list80 = block {
-    final core::List<core::num*>* #t98 = <core::num*>[];
+    final core::List<core::num*>* #t96 = <core::num*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t98.{core::List::add}(42);
+      #t96.{core::List::add}{Invariant}(42);
     else
-      #t98.{core::List::add}(3.14);
-  } =>#t98;
+      #t96.{core::List::add}{Invariant}(3.14);
+  } =>#t96;
   core::Set<core::num*>* set80 = block {
-    final core::Set<core::num*>* #t99 = col::LinkedHashSet::•<core::num*>();
+    final core::Set<core::num*>* #t97 = col::LinkedHashSet::•<core::num*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t99.{core::Set::add}(42);
+      #t97.{core::Set::add}{Invariant}(42);
     else
-      #t99.{core::Set::add}(3.14);
-    #t99.{core::Set::add}(null);
-  } =>#t99;
+      #t97.{core::Set::add}{Invariant}(3.14);
+    #t97.{core::Set::add}{Invariant}(null);
+  } =>#t97;
   core::Map<core::String*, core::num*>* map80 = block {
-    final core::Map<core::String*, core::num*>* #t100 = <core::String*, core::num*>{};
+    final core::Map<core::String*, core::num*>* #t98 = <core::String*, core::num*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t100.{core::Map::[]=}("bar", 42);
+      #t98.{core::Map::[]=}{Invariant}("bar", 42);
     else
-      #t100.{core::Map::[]=}("bar", 3.14);
-    #t100.{core::Map::[]=}("baz", null);
-  } =>#t100;
+      #t98.{core::Map::[]=}{Invariant}("bar", 3.14);
+    #t98.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t98;
   core::List<core::num*>* list81 = block {
-    final core::List<core::num*>* #t101 = <core::num*>[];
+    final core::List<core::num*>* #t99 = <core::num*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      for (final core::num* #t102 in listInt)
-        #t101.{core::List::add}(#t102);
+      for (final core::num* #t100 in listInt)
+        #t99.{core::List::add}{Invariant}(#t100);
     else
-      for (final core::num* #t103 in listDouble)
-        #t101.{core::List::add}(#t103);
-  } =>#t101;
+      for (final core::num* #t101 in listDouble)
+        #t99.{core::List::add}{Invariant}(#t101);
+  } =>#t99;
   core::Set<core::num*>* set81 = block {
-    final core::Set<core::num*>* #t104 = col::LinkedHashSet::•<core::num*>();
+    final core::Set<core::num*>* #t102 = col::LinkedHashSet::•<core::num*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      for (final core::num* #t105 in listInt)
-        #t104.{core::Set::add}(#t105);
+      for (final core::num* #t103 in listInt)
+        #t102.{core::Set::add}{Invariant}(#t103);
     else
-      for (final core::num* #t106 in listDouble)
-        #t104.{core::Set::add}(#t106);
-    #t104.{core::Set::add}(null);
-  } =>#t104;
+      for (final core::num* #t104 in listDouble)
+        #t102.{core::Set::add}{Invariant}(#t104);
+    #t102.{core::Set::add}{Invariant}(null);
+  } =>#t102;
   core::Map<core::String*, core::num*>* map81 = block {
-    final core::Map<core::String*, core::num*>* #t107 = <core::String*, core::num*>{};
+    final core::Map<core::String*, core::num*>* #t105 = <core::String*, core::num*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      for (final core::MapEntry<core::String*, core::num*>* #t108 in mapToInt.{core::Map::entries})
-        #t107.{core::Map::[]=}(#t108.{core::MapEntry::key}, #t108.{core::MapEntry::value});
+      for (final core::MapEntry<core::String*, core::num*>* #t106 in mapToInt.{core::Map::entries})
+        #t105.{core::Map::[]=}{Invariant}(#t106.{core::MapEntry::key}, #t106.{core::MapEntry::value});
     else
-      for (final core::MapEntry<core::String*, core::num*>* #t109 in mapToDouble.{core::Map::entries})
-        #t107.{core::Map::[]=}(#t109.{core::MapEntry::key}, #t109.{core::MapEntry::value});
-    #t107.{core::Map::[]=}("baz", null);
-  } =>#t107;
+      for (final core::MapEntry<core::String*, core::num*>* #t107 in mapToDouble.{core::Map::entries})
+        #t105.{core::Map::[]=}{Invariant}(#t107.{core::MapEntry::key}, #t107.{core::MapEntry::value});
+    #t105.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t105;
   core::List<dynamic>* list82 = block {
-    final core::List<dynamic>* #t110 = <dynamic>[];
+    final core::List<dynamic>* #t108 = <dynamic>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      for (final dynamic #t111 in listInt)
-        #t110.{core::List::add}(#t111);
+      for (final dynamic #t109 in listInt)
+        #t108.{core::List::add}{Invariant}(#t109);
     else
-      for (final dynamic #t112 in dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*)
-        #t110.{core::List::add}(#t112);
-  } =>#t110;
+      for (final dynamic #t110 in dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*)
+        #t108.{core::List::add}{Invariant}(#t110);
+  } =>#t108;
   core::Set<dynamic>* set82 = block {
-    final core::Set<dynamic>* #t113 = col::LinkedHashSet::•<dynamic>();
+    final core::Set<dynamic>* #t111 = col::LinkedHashSet::•<dynamic>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      for (final dynamic #t114 in listInt)
-        #t113.{core::Set::add}(#t114);
+      for (final dynamic #t112 in listInt)
+        #t111.{core::Set::add}{Invariant}(#t112);
     else
-      for (final dynamic #t115 in dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*)
-        #t113.{core::Set::add}(#t115);
-    #t113.{core::Set::add}(null);
-  } =>#t113;
+      for (final dynamic #t113 in dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*)
+        #t111.{core::Set::add}{Invariant}(#t113);
+    #t111.{core::Set::add}{Invariant}(null);
+  } =>#t111;
   core::Set<dynamic>* map82 = block {
-    final core::Set<dynamic>* #t116 = col::LinkedHashSet::•<dynamic>();
+    final core::Set<dynamic>* #t114 = col::LinkedHashSet::•<dynamic>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t116.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:73:38: Error: Unexpected type 'Map<String, int>' of a spread.  Expected 'dynamic' or an Iterable.
+      #t114.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:73:38: Error: Unexpected type 'Map<String, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
   var map82 = {if (oracle(\"foo\")) ...mapToInt else ...dynVar, null};
                                      ^");
     else
-      for (final dynamic #t117 in dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*)
-        #t116.{core::Set::add}(#t117);
-    #t116.{core::Set::add}(null);
-  } =>#t116;
+      for (final dynamic #t115 in dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*)
+        #t114.{core::Set::add}{Invariant}(#t115);
+    #t114.{core::Set::add}{Invariant}(null);
+  } =>#t114;
   core::List<core::num*>* list83 = block {
-    final core::List<core::num*>* #t118 = <core::num*>[];
+    final core::List<core::num*>* #t116 = <core::num*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t118.{core::List::add}(42);
+      #t116.{core::List::add}{Invariant}(42);
     else
-      for (final core::num* #t119 in listDouble)
-        #t118.{core::List::add}(#t119);
-  } =>#t118;
+      for (final core::num* #t117 in listDouble)
+        #t116.{core::List::add}{Invariant}(#t117);
+  } =>#t116;
   core::Set<core::num*>* set83 = block {
-    final core::Set<core::num*>* #t120 = col::LinkedHashSet::•<core::num*>();
+    final core::Set<core::num*>* #t118 = col::LinkedHashSet::•<core::num*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      for (final core::num* #t121 in listInt)
-        #t120.{core::Set::add}(#t121);
+      for (final core::num* #t119 in listInt)
+        #t118.{core::Set::add}{Invariant}(#t119);
     else
-      #t120.{core::Set::add}(3.14);
-    #t120.{core::Set::add}(null);
-  } =>#t120;
+      #t118.{core::Set::add}{Invariant}(3.14);
+    #t118.{core::Set::add}{Invariant}(null);
+  } =>#t118;
   core::Map<core::String*, core::num*>* map83 = block {
-    final core::Map<core::String*, core::num*>* #t122 = <core::String*, core::num*>{};
+    final core::Map<core::String*, core::num*>* #t120 = <core::String*, core::num*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      for (final core::MapEntry<core::String*, core::num*>* #t123 in mapToInt.{core::Map::entries})
-        #t122.{core::Map::[]=}(#t123.{core::MapEntry::key}, #t123.{core::MapEntry::value});
+      for (final core::MapEntry<core::String*, core::num*>* #t121 in mapToInt.{core::Map::entries})
+        #t120.{core::Map::[]=}{Invariant}(#t121.{core::MapEntry::key}, #t121.{core::MapEntry::value});
     else
-      #t122.{core::Map::[]=}("bar", 3.14);
-    #t122.{core::Map::[]=}("baz", null);
-  } =>#t122;
+      #t120.{core::Map::[]=}{Invariant}("bar", 3.14);
+    #t120.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t120;
   core::List<core::int*>* list90 = block {
-    final core::List<core::int*>* #t124 = <core::int*>[];
+    final core::List<core::int*>* #t122 = <core::int*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t124.{core::List::add}(dynVar as{TypeError,ForDynamic} core::int*);
-  } =>#t124;
+      #t122.{core::List::add}{Invariant}(dynVar as{TypeError,ForDynamic} core::int*);
+  } =>#t122;
   core::Set<core::int*>* set90 = block {
-    final core::Set<core::int*>* #t125 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t123 = col::LinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t125.{core::Set::add}(dynVar as{TypeError,ForDynamic} core::int*);
-    #t125.{core::Set::add}(null);
-  } =>#t125;
+      #t123.{core::Set::add}{Invariant}(dynVar as{TypeError,ForDynamic} core::int*);
+    #t123.{core::Set::add}{Invariant}(null);
+  } =>#t123;
   core::Map<core::String*, core::int*>* map90 = block {
-    final core::Map<core::String*, core::int*>* #t126 = <core::String*, core::int*>{};
+    final core::Map<core::String*, core::int*>* #t124 = <core::String*, core::int*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t126.{core::Map::[]=}("bar", dynVar as{TypeError,ForDynamic} core::int*);
-    #t126.{core::Map::[]=}("baz", null);
-  } =>#t126;
+      #t124.{core::Map::[]=}{Invariant}("bar", dynVar as{TypeError,ForDynamic} core::int*);
+    #t124.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t124;
   core::List<core::int*>* list91 = block {
-    final core::List<core::int*>* #t127 = <core::int*>[];
+    final core::List<core::int*>* #t125 = <core::int*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      for (final dynamic #t128 in dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*) {
-        final core::int* #t129 = #t128 as{TypeError} core::int*;
-        #t127.{core::List::add}(#t129);
+      for (final dynamic #t126 in dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*) {
+        final core::int* #t127 = #t126 as{TypeError} core::int*;
+        #t125.{core::List::add}{Invariant}(#t127);
       }
-  } =>#t127;
+  } =>#t125;
   core::Set<core::int*>* set91 = block {
-    final core::Set<core::int*>* #t130 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t128 = col::LinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      for (final dynamic #t131 in dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*) {
-        final core::int* #t132 = #t131 as{TypeError} core::int*;
-        #t130.{core::Set::add}(#t132);
+      for (final dynamic #t129 in dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*) {
+        final core::int* #t130 = #t129 as{TypeError} core::int*;
+        #t128.{core::Set::add}{Invariant}(#t130);
       }
-    #t130.{core::Set::add}(null);
-  } =>#t130;
+    #t128.{core::Set::add}{Invariant}(null);
+  } =>#t128;
   core::Map<core::String*, core::int*>* map91 = block {
-    final core::Map<core::String*, core::int*>* #t133 = <core::String*, core::int*>{};
+    final core::Map<core::String*, core::int*>* #t131 = <core::String*, core::int*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      for (final core::MapEntry<dynamic, dynamic>* #t134 in (dynVar as{TypeError,ForDynamic} core::Map<dynamic, dynamic>*).{core::Map::entries}) {
-        final core::String* #t135 = #t134.{core::MapEntry::key} as{TypeError} core::String*;
-        final core::int* #t136 = #t134.{core::MapEntry::value} as{TypeError} core::int*;
-        #t133.{core::Map::[]=}(#t135, #t136);
+      for (final core::MapEntry<dynamic, dynamic>* #t132 in (dynVar as{TypeError,ForDynamic} core::Map<dynamic, dynamic>*).{core::Map::entries}) {
+        final core::String* #t133 = #t132.{core::MapEntry::key} as{TypeError} core::String*;
+        final core::int* #t134 = #t132.{core::MapEntry::value} as{TypeError} core::int*;
+        #t131.{core::Map::[]=}{Invariant}(#t133, #t134);
       }
-    #t133.{core::Map::[]=}("baz", null);
-  } =>#t133;
+    #t131.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t131;
   core::List<core::int*>* list100 = block {
-    final core::List<core::int*>* #t137 = <core::int*>[];
+    final core::List<core::int*>* #t135 = <core::int*>[];
     if(dynVar as{TypeError,ForDynamic} core::bool*)
-      #t137.{core::List::add}(42);
-  } =>#t137;
+      #t135.{core::List::add}{Invariant}(42);
+  } =>#t135;
   core::Set<core::int*>* set100 = block {
-    final core::Set<core::int*>* #t138 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t136 = col::LinkedHashSet::•<core::int*>();
     if(dynVar as{TypeError,ForDynamic} core::bool*)
-      #t138.{core::Set::add}(42);
-  } =>#t138;
+      #t136.{core::Set::add}{Invariant}(42);
+  } =>#t136;
   core::Map<core::int*, core::int*>* map100 = block {
-    final core::Map<core::int*, core::int*>* #t139 = <core::int*, core::int*>{};
+    final core::Map<core::int*, core::int*>* #t137 = <core::int*, core::int*>{};
     if(dynVar as{TypeError,ForDynamic} core::bool*)
-      #t139.{core::Map::[]=}(42, 42);
-  } =>#t139;
+      #t137.{core::Map::[]=}{Invariant}(42, 42);
+  } =>#t137;
 }
 static method testIfElementErrors(core::Map<core::int*, core::int*>* map) → dynamic {
   block {
-    final core::List<core::int*>* #t140 = <core::int*>[];
+    final core::List<core::int*>* #t138 = <core::int*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t140.{core::List::add}(let final<BottomType> #t141 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:89:28: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+      #t138.{core::List::add}{Invariant}(let final<BottomType> #t139 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:89:28: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int>[if (oracle(\"foo\")) \"bar\"];
                            ^" in "bar" as{TypeError} core::int*);
-  } =>#t140;
+  } =>#t138;
   block {
-    final core::Set<core::int*>* #t142 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t140 = col::LinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t142.{core::Set::add}(let final<BottomType> #t143 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:90:28: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+      #t140.{core::Set::add}{Invariant}(let final<BottomType> #t141 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:90:28: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int>{if (oracle(\"foo\")) \"bar\", null};
                            ^" in "bar" as{TypeError} core::int*);
-    #t142.{core::Set::add}(null);
-  } =>#t142;
+    #t140.{core::Set::add}{Invariant}(null);
+  } =>#t140;
   block {
-    final core::Map<core::String*, core::int*>* #t144 = <core::String*, core::int*>{};
+    final core::Map<core::String*, core::int*>* #t142 = <core::String*, core::int*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t144.{core::Map::[]=}("bar", let final<BottomType> #t145 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:91:43: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+      #t142.{core::Map::[]=}{Invariant}("bar", let final<BottomType> #t143 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:91:43: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <String, int>{if (oracle(\"foo\")) \"bar\": \"bar\", \"baz\": null};
                                           ^" in "bar" as{TypeError} core::int*);
-    #t144.{core::Map::[]=}("baz", null);
-  } =>#t144;
+    #t142.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t142;
   block {
-    final core::List<core::int*>* #t146 = <core::int*>[];
+    final core::List<core::int*>* #t144 = <core::int*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      for (final core::int* #t147 in <core::int*>[let final<BottomType> #t148 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:92:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+      for (final core::int* #t145 in <core::int*>[let final<BottomType> #t146 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:92:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int>[if (oracle(\"foo\")) ...[\"bar\"]];
                                ^" in "bar" as{TypeError} core::int*])
-        #t146.{core::List::add}(#t147);
-  } =>#t146;
+        #t144.{core::List::add}{Invariant}(#t145);
+  } =>#t144;
   block {
-    final core::Set<core::int*>* #t149 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t147 = col::LinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      for (final core::int* #t150 in <core::int*>[let final<BottomType> #t151 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:93:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+      for (final core::int* #t148 in <core::int*>[let final<BottomType> #t149 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:93:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int>{if (oracle(\"foo\")) ...[\"bar\"], null};
                                ^" in "bar" as{TypeError} core::int*])
-        #t149.{core::Set::add}(#t150);
-    #t149.{core::Set::add}(null);
-  } =>#t149;
+        #t147.{core::Set::add}{Invariant}(#t148);
+    #t147.{core::Set::add}{Invariant}(null);
+  } =>#t147;
   block {
-    final core::Map<core::String*, core::int*>* #t152 = <core::String*, core::int*>{};
+    final core::Map<core::String*, core::int*>* #t150 = <core::String*, core::int*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      for (final core::MapEntry<core::String*, core::int*>* #t153 in <core::String*, core::int*>{"bar": let final<BottomType> #t154 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:94:47: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+      for (final core::MapEntry<core::String*, core::int*>* #t151 in <core::String*, core::int*>{"bar": let final<BottomType> #t152 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:94:47: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <String, int>{if (oracle(\"foo\")) ...{\"bar\": \"bar\"}, \"baz\": null};
                                               ^" in "bar" as{TypeError} core::int*}.{core::Map::entries})
-        #t152.{core::Map::[]=}(#t153.{core::MapEntry::key}, #t153.{core::MapEntry::value});
-    #t152.{core::Map::[]=}("baz", null);
-  } =>#t152;
+        #t150.{core::Map::[]=}{Invariant}(#t151.{core::MapEntry::key}, #t151.{core::MapEntry::value});
+    #t150.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t150;
   block {
-    final core::List<core::int*>* #t155 = <core::int*>[];
+    final core::List<core::int*>* #t153 = <core::int*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t155.{core::List::add}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:95:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+      #t153.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:95:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
   <int>[if (oracle(\"foo\")) ...map];
                               ^");
-  } =>#t155;
+  } =>#t153;
   block {
-    final core::Set<core::int*>* #t156 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t154 = col::LinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t156.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:96:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+      #t154.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:96:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
   <int>{if (oracle(\"foo\")) ...map, null};
                               ^");
-    #t156.{core::Set::add}(null);
-  } =>#t156;
+    #t154.{core::Set::add}{Invariant}(null);
+  } =>#t154;
   <core::String*, core::int*>{invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:97:39: Error: Unexpected type 'List<String>' of a map spread entry.  Expected 'dynamic' or a Map.
  - 'List' is from 'dart:core'.
   <String, int>{if (oracle(\"foo\")) ...[\"bar\"], \"baz\": null};
@@ -1050,61 +1060,61 @@
   <String, int>{if (oracle(\"foo\")) ...[\"bar\"], \"baz\": null};
                                       ^": null};
   block {
-    final core::List<core::String*>* #t157 = <core::String*>[];
+    final core::List<core::String*>* #t155 = <core::String*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t157.{core::List::add}(let final<BottomType> #t158 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:98:31: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+      #t155.{core::List::add}{Invariant}(let final<BottomType> #t156 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:98:31: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
   <String>[if (oracle(\"foo\")) 42 else 3.14];
                               ^" in 42 as{TypeError} core::String*);
     else
-      #t157.{core::List::add}(let final<BottomType> #t159 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:98:39: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
+      #t155.{core::List::add}{Invariant}(let final<BottomType> #t157 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:98:39: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
   <String>[if (oracle(\"foo\")) 42 else 3.14];
                                       ^" in 3.14 as{TypeError} core::String*);
-  } =>#t157;
+  } =>#t155;
   block {
-    final core::Set<core::String*>* #t160 = col::LinkedHashSet::•<core::String*>();
+    final core::Set<core::String*>* #t158 = col::LinkedHashSet::•<core::String*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t160.{core::Set::add}(let final<BottomType> #t161 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:99:31: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+      #t158.{core::Set::add}{Invariant}(let final<BottomType> #t159 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:99:31: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
   <String>{if (oracle(\"foo\")) 42 else 3.14, null};
                               ^" in 42 as{TypeError} core::String*);
     else
-      #t160.{core::Set::add}(let final<BottomType> #t162 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:99:39: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
+      #t158.{core::Set::add}{Invariant}(let final<BottomType> #t160 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:99:39: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
   <String>{if (oracle(\"foo\")) 42 else 3.14, null};
                                       ^" in 3.14 as{TypeError} core::String*);
-    #t160.{core::Set::add}(null);
-  } =>#t160;
+    #t158.{core::Set::add}{Invariant}(null);
+  } =>#t158;
   block {
-    final core::Map<core::String*, core::String*>* #t163 = <core::String*, core::String*>{};
+    final core::Map<core::String*, core::String*>* #t161 = <core::String*, core::String*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t163.{core::Map::[]=}("bar", let final<BottomType> #t164 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:100:46: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+      #t161.{core::Map::[]=}{Invariant}("bar", let final<BottomType> #t162 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:100:46: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
   <String, String>{if (oracle(\"foo\")) \"bar\": 42 else \"baz\": 3.14, \"baz\": null};
                                              ^" in 42 as{TypeError} core::String*);
     else
-      #t163.{core::Map::[]=}("baz", let final<BottomType> #t165 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:100:61: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
+      #t161.{core::Map::[]=}{Invariant}("baz", let final<BottomType> #t163 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:100:61: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
   <String, String>{if (oracle(\"foo\")) \"bar\": 42 else \"baz\": 3.14, \"baz\": null};
                                                             ^" in 3.14 as{TypeError} core::String*);
-    #t163.{core::Map::[]=}("baz", null);
-  } =>#t163;
+    #t161.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t161;
   block {
-    final core::List<core::int*>* #t166 = <core::int*>[];
+    final core::List<core::int*>* #t164 = <core::int*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t166.{core::List::add}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:101:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+      #t164.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:101:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
   <int>[if (oracle(\"foo\")) ...map else 42];
                               ^");
     else
-      #t166.{core::List::add}(42);
-  } =>#t166;
+      #t164.{core::List::add}{Invariant}(42);
+  } =>#t164;
   block {
-    final core::Set<core::int*>* #t167 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t165 = col::LinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t167.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:102:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+      #t165.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:102:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
   <int>{if (oracle(\"foo\")) ...map else 42, null};
                               ^");
     else
-      #t167.{core::Set::add}(42);
-    #t167.{core::Set::add}(null);
-  } =>#t167;
+      #t165.{core::Set::add}{Invariant}(42);
+    #t165.{core::Set::add}{Invariant}(null);
+  } =>#t165;
   <core::String*, core::int*>{invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:103:39: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
  - 'List' is from 'dart:core'.
   <String, int>{if (oracle(\"foo\")) ...[42] else \"bar\": 42, \"baz\": null};
@@ -1113,26 +1123,26 @@
   <String, int>{if (oracle(\"foo\")) ...[42] else \"bar\": 42, \"baz\": null};
                                       ^": null};
   block {
-    final core::List<core::int*>* #t168 = <core::int*>[];
+    final core::List<core::int*>* #t166 = <core::int*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t168.{core::List::add}(42);
+      #t166.{core::List::add}{Invariant}(42);
     else
-      #t168.{core::List::add}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:104:39: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+      #t166.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:104:39: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
   <int>[if (oracle(\"foo\")) 42 else ...map];
                                       ^");
-  } =>#t168;
+  } =>#t166;
   block {
-    final core::Set<core::int*>* #t169 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t167 = col::LinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t169.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:105:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+      #t167.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:105:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
   <int>{if (oracle(\"foo\")) ...map else 42, null};
                               ^");
     else
-      #t169.{core::Set::add}(42);
-    #t169.{core::Set::add}(null);
-  } =>#t169;
+      #t167.{core::Set::add}{Invariant}(42);
+    #t167.{core::Set::add}{Invariant}(null);
+  } =>#t167;
   <core::String*, core::int*>{invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:106:54: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
  - 'List' is from 'dart:core'.
   <String, int>{if (oracle(\"foo\")) \"bar\": 42 else ...[42], \"baz\": null};
@@ -1152,746 +1162,756 @@
   core::Map<dynamic, dynamic>* map11 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:111:70: Error: Expected ':' after this.
   Map<dynamic, dynamic> map11 = {if (oracle(\"foo\")) \"bar\": 3.14 else 42};
                                                                      ^": null};
-  core::Map<dynamic, core::Null?>* map12 = <dynamic, core::Null?>{invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:112:35: Error: Expected ':' after this.
+  core::Map<dynamic, Null>* map12 = <dynamic, Null>{invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:112:35: Error: Expected ':' after this.
   var map12 = {if (oracle(\"foo\")) 42 else \"bar\": 3.14};
                                   ^": null};
-  core::Map<dynamic, core::Null?>* map13 = <dynamic, core::Null?>{invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:113:52: Error: Expected ':' after this.
+  core::Map<dynamic, Null>* map13 = <dynamic, Null>{invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:113:52: Error: Expected ':' after this.
   var map13 = {if (oracle(\"foo\")) \"bar\": 3.14 else 42};
                                                    ^": null};
   core::List<core::int*>* list20 = block {
-    final core::List<core::int*>* #t170 = <core::int*>[];
-    if(let final<BottomType> #t171 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:114:27: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
+    final core::List<core::int*>* #t168 = <core::int*>[];
+    if(let final<BottomType> #t169 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:114:27: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
   List<int> list20 = [if (42) 42];
                           ^" in 42 as{TypeError} core::bool*)
-      #t170.{core::List::add}(42);
-  } =>#t170;
+      #t168.{core::List::add}{Invariant}(42);
+  } =>#t168;
   core::Set<core::int*>* set20 = block {
-    final core::Set<core::int*>* #t172 = col::LinkedHashSet::•<core::int*>();
-    if(let final<BottomType> #t173 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:115:25: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
+    final core::Set<core::int*>* #t170 = col::LinkedHashSet::•<core::int*>();
+    if(let final<BottomType> #t171 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:115:25: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
   Set<int> set20 = {if (42) 42};
                         ^" in 42 as{TypeError} core::bool*)
-      #t172.{core::Set::add}(42);
-  } =>#t172;
+      #t170.{core::Set::add}{Invariant}(42);
+  } =>#t170;
   core::Map<core::int*, core::int*>* map30 = block {
-    final core::Map<core::int*, core::int*>* #t174 = <core::int*, core::int*>{};
-    if(let final<BottomType> #t175 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:116:30: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
+    final core::Map<core::int*, core::int*>* #t172 = <core::int*, core::int*>{};
+    if(let final<BottomType> #t173 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:116:30: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
   Map<int, int> map30 = {if (42) 42: 42};
                              ^" in 42 as{TypeError} core::bool*)
-      #t174.{core::Map::[]=}(42, 42);
-  } =>#t174;
+      #t172.{core::Map::[]=}{Invariant}(42, 42);
+  } =>#t172;
   core::List<core::String*>* list40 = block {
-    final core::List<core::String*>* #t176 = <core::String*>[];
+    final core::List<core::String*>* #t174 = <core::String*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t176.{core::List::add}(let final<BottomType> #t177 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:117:53: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
+      #t174.{core::List::add}{Invariant}(let final<BottomType> #t175 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:117:53: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
   List<String> list40 = <String>[if (oracle(\"foo\")) true else 42];
                                                     ^" in true as{TypeError} core::String*);
     else
-      #t176.{core::List::add}(let final<BottomType> #t178 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:117:63: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+      #t174.{core::List::add}{Invariant}(let final<BottomType> #t176 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:117:63: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
   List<String> list40 = <String>[if (oracle(\"foo\")) true else 42];
                                                               ^" in 42 as{TypeError} core::String*);
-  } =>#t176;
+  } =>#t174;
   core::Set<core::String*>* set40 = block {
-    final core::Set<core::String*>* #t179 = col::LinkedHashSet::•<core::String*>();
+    final core::Set<core::String*>* #t177 = col::LinkedHashSet::•<core::String*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t179.{core::Set::add}(let final<BottomType> #t180 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:118:51: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
+      #t177.{core::Set::add}{Invariant}(let final<BottomType> #t178 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:118:51: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
   Set<String> set40 = <String>{if (oracle(\"foo\")) true else 42};
                                                   ^" in true as{TypeError} core::String*);
     else
-      #t179.{core::Set::add}(let final<BottomType> #t181 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:118:61: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+      #t177.{core::Set::add}{Invariant}(let final<BottomType> #t179 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:118:61: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
   Set<String> set40 = <String>{if (oracle(\"foo\")) true else 42};
                                                             ^" in 42 as{TypeError} core::String*);
-  } =>#t179;
+  } =>#t177;
   core::Map<core::String*, core::int*>* map40 = block {
-    final core::Map<core::String*, core::int*>* #t182 = <core::String*, core::int*>{};
+    final core::Map<core::String*, core::int*>* #t180 = <core::String*, core::int*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t182.{core::Map::[]=}(let final<BottomType> #t183 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:119:61: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
+      #t180.{core::Map::[]=}{Invariant}(let final<BottomType> #t181 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:119:61: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
   Map<String, int> map40 = <String, int>{if (oracle(\"foo\")) true: 42 else 42: 42};
                                                             ^" in true as{TypeError} core::String*, 42);
     else
-      #t182.{core::Map::[]=}(let final<BottomType> #t184 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:119:75: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+      #t180.{core::Map::[]=}{Invariant}(let final<BottomType> #t182 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:119:75: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
   Map<String, int> map40 = <String, int>{if (oracle(\"foo\")) true: 42 else 42: 42};
                                                                           ^" in 42 as{TypeError} core::String*, 42);
-  } =>#t182;
+  } =>#t180;
   core::Map<core::int*, core::String*>* map41 = block {
-    final core::Map<core::int*, core::String*>* #t185 = <core::int*, core::String*>{};
+    final core::Map<core::int*, core::String*>* #t183 = <core::int*, core::String*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t185.{core::Map::[]=}(42, let final<BottomType> #t186 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:120:65: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
+      #t183.{core::Map::[]=}{Invariant}(42, let final<BottomType> #t184 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:120:65: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
   Map<int, String> map41 = <int, String>{if (oracle(\"foo\")) 42: true else 42: 42};
                                                                 ^" in true as{TypeError} core::String*);
     else
-      #t185.{core::Map::[]=}(42, let final<BottomType> #t187 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:120:79: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+      #t183.{core::Map::[]=}{Invariant}(42, let final<BottomType> #t185 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:120:79: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
   Map<int, String> map41 = <int, String>{if (oracle(\"foo\")) 42: true else 42: 42};
                                                                               ^" in 42 as{TypeError} core::String*);
-  } =>#t185;
+  } =>#t183;
 }
 static method testForElement(dynamic dynVar, core::List<core::int*>* listInt, core::List<core::double*>* listDouble, core::int* index, core::Map<core::String*, core::int*>* mapStringInt, core::Map<core::String*, core::double*>* mapStringDouble) → dynamic {
   core::List<core::int*>* list10 = block {
-    final core::List<core::int*>* #t188 = <core::int*>[];
+    final core::List<core::int*>* #t186 = <core::int*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      #t188.{core::List::add}(42);
-  } =>#t188;
+      #t186.{core::List::add}{Invariant}(42);
+  } =>#t186;
   core::Set<core::int*>* set10 = block {
-    final core::Set<core::int*>* #t189 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t187 = col::LinkedHashSet::•<core::int*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      #t189.{core::Set::add}(42);
-    #t189.{core::Set::add}(null);
-  } =>#t189;
+      #t187.{core::Set::add}{Invariant}(42);
+    #t187.{core::Set::add}{Invariant}(null);
+  } =>#t187;
   core::Map<core::String*, core::int*>* map10 = block {
-    final core::Map<core::String*, core::int*>* #t190 = <core::String*, core::int*>{};
+    final core::Map<core::String*, core::int*>* #t188 = <core::String*, core::int*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      #t190.{core::Map::[]=}("bar", 42);
-    #t190.{core::Map::[]=}("baz", null);
-  } =>#t190;
+      #t188.{core::Map::[]=}{Invariant}("bar", 42);
+    #t188.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t188;
   core::List<dynamic>* list11 = block {
-    final core::List<dynamic>* #t191 = <dynamic>[];
+    final core::List<dynamic>* #t189 = <dynamic>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      #t191.{core::List::add}(dynVar);
-  } =>#t191;
+      #t189.{core::List::add}{Invariant}(dynVar);
+  } =>#t189;
   core::Set<dynamic>* set11 = block {
-    final core::Set<dynamic>* #t192 = col::LinkedHashSet::•<dynamic>();
+    final core::Set<dynamic>* #t190 = col::LinkedHashSet::•<dynamic>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      #t192.{core::Set::add}(dynVar);
-    #t192.{core::Set::add}(null);
-  } =>#t192;
+      #t190.{core::Set::add}{Invariant}(dynVar);
+    #t190.{core::Set::add}{Invariant}(null);
+  } =>#t190;
   core::Map<core::String*, dynamic>* map11 = block {
-    final core::Map<core::String*, dynamic>* #t193 = <core::String*, dynamic>{};
+    final core::Map<core::String*, dynamic>* #t191 = <core::String*, dynamic>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      #t193.{core::Map::[]=}("bar", dynVar);
-    #t193.{core::Map::[]=}("baz", null);
-  } =>#t193;
+      #t191.{core::Map::[]=}{Invariant}("bar", dynVar);
+    #t191.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t191;
   core::List<core::List<core::int*>*>* list12 = block {
-    final core::List<core::List<core::int*>*>* #t194 = <core::List<core::int*>*>[];
+    final core::List<core::List<core::int*>*>* #t192 = <core::List<core::int*>*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      #t194.{core::List::add}(<core::int*>[42]);
-  } =>#t194;
+      #t192.{core::List::add}{Invariant}(<core::int*>[42]);
+  } =>#t192;
   core::Set<core::List<core::int*>*>* set12 = block {
-    final core::Set<core::List<core::int*>*>* #t195 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    final core::Set<core::List<core::int*>*>* #t193 = col::LinkedHashSet::•<core::List<core::int*>*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      #t195.{core::Set::add}(<core::int*>[42]);
-    #t195.{core::Set::add}(null);
-  } =>#t195;
+      #t193.{core::Set::add}{Invariant}(<core::int*>[42]);
+    #t193.{core::Set::add}{Invariant}(null);
+  } =>#t193;
   core::Map<core::String*, core::List<core::int*>*>* map12 = block {
-    final core::Map<core::String*, core::List<core::int*>*>* #t196 = <core::String*, core::List<core::int*>*>{};
+    final core::Map<core::String*, core::List<core::int*>*>* #t194 = <core::String*, core::List<core::int*>*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      #t196.{core::Map::[]=}("bar", <core::int*>[42]);
-    #t196.{core::Map::[]=}("baz", null);
-  } =>#t196;
+      #t194.{core::Map::[]=}{Invariant}("bar", <core::int*>[42]);
+    #t194.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t194;
   core::List<core::int*>* list20 = block {
-    final core::List<core::int*>* #t197 = <core::int*>[];
+    final core::List<core::int*>* #t195 = <core::int*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
+      for (final core::int* #t196 in <core::int*>[42])
+        #t195.{core::List::add}{Invariant}(#t196);
+  } =>#t195;
+  core::Set<core::int*>* set20 = block {
+    final core::Set<core::int*>* #t197 = col::LinkedHashSet::•<core::int*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       for (final core::int* #t198 in <core::int*>[42])
-        #t197.{core::List::add}(#t198);
+        #t197.{core::Set::add}{Invariant}(#t198);
+    #t197.{core::Set::add}{Invariant}(null);
   } =>#t197;
-  core::Set<core::int*>* set20 = block {
-    final core::Set<core::int*>* #t199 = col::LinkedHashSet::•<core::int*>();
-    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      for (final core::int* #t200 in <core::int*>[42])
-        #t199.{core::Set::add}(#t200);
-    #t199.{core::Set::add}(null);
-  } =>#t199;
   core::Map<core::String*, core::int*>* map20 = block {
-    final core::Map<core::String*, core::int*>* #t201 = <core::String*, core::int*>{};
+    final core::Map<core::String*, core::int*>* #t199 = <core::String*, core::int*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      for (final core::MapEntry<core::String*, core::int*>* #t202 in <core::String*, core::int*>{"bar": 42}.{core::Map::entries})
-        #t201.{core::Map::[]=}(#t202.{core::MapEntry::key}, #t202.{core::MapEntry::value});
-    #t201.{core::Map::[]=}("baz", null);
-  } =>#t201;
+      for (final core::MapEntry<core::String*, core::int*>* #t200 in <core::String*, core::int*>{"bar": 42}.{core::Map::entries})
+        #t199.{core::Map::[]=}{Invariant}(#t200.{core::MapEntry::key}, #t200.{core::MapEntry::value});
+    #t199.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t199;
   core::List<dynamic>* list21 = block {
-    final core::List<dynamic>* #t203 = <dynamic>[];
+    final core::List<dynamic>* #t201 = <dynamic>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
+      for (final dynamic #t202 in <dynamic>[dynVar])
+        #t201.{core::List::add}{Invariant}(#t202);
+  } =>#t201;
+  core::Set<dynamic>* set21 = block {
+    final core::Set<dynamic>* #t203 = col::LinkedHashSet::•<dynamic>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       for (final dynamic #t204 in <dynamic>[dynVar])
-        #t203.{core::List::add}(#t204);
+        #t203.{core::Set::add}{Invariant}(#t204);
+    #t203.{core::Set::add}{Invariant}(null);
   } =>#t203;
-  core::Set<dynamic>* set21 = block {
-    final core::Set<dynamic>* #t205 = col::LinkedHashSet::•<dynamic>();
-    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      for (final dynamic #t206 in <dynamic>[dynVar])
-        #t205.{core::Set::add}(#t206);
-    #t205.{core::Set::add}(null);
-  } =>#t205;
   core::Map<core::String*, dynamic>* map21 = block {
-    final core::Map<core::String*, dynamic>* #t207 = <core::String*, dynamic>{};
+    final core::Map<core::String*, dynamic>* #t205 = <core::String*, dynamic>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      for (final core::MapEntry<core::String*, dynamic>* #t208 in <core::String*, dynamic>{"bar": dynVar}.{core::Map::entries})
-        #t207.{core::Map::[]=}(#t208.{core::MapEntry::key}, #t208.{core::MapEntry::value});
-    #t207.{core::Map::[]=}("baz", null);
-  } =>#t207;
+      for (final core::MapEntry<core::String*, dynamic>* #t206 in <core::String*, dynamic>{"bar": dynVar}.{core::Map::entries})
+        #t205.{core::Map::[]=}{Invariant}(#t206.{core::MapEntry::key}, #t206.{core::MapEntry::value});
+    #t205.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t205;
   core::List<core::List<core::int*>*>* list22 = block {
-    final core::List<core::List<core::int*>*>* #t209 = <core::List<core::int*>*>[];
+    final core::List<core::List<core::int*>*>* #t207 = <core::List<core::int*>*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
+      for (final core::List<core::int*>* #t208 in <core::List<core::int*>*>[<core::int*>[42]])
+        #t207.{core::List::add}{Invariant}(#t208);
+  } =>#t207;
+  core::Set<core::List<core::int*>*>* set22 = block {
+    final core::Set<core::List<core::int*>*>* #t209 = col::LinkedHashSet::•<core::List<core::int*>*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       for (final core::List<core::int*>* #t210 in <core::List<core::int*>*>[<core::int*>[42]])
-        #t209.{core::List::add}(#t210);
+        #t209.{core::Set::add}{Invariant}(#t210);
+    #t209.{core::Set::add}{Invariant}(null);
   } =>#t209;
-  core::Set<core::List<core::int*>*>* set22 = block {
-    final core::Set<core::List<core::int*>*>* #t211 = col::LinkedHashSet::•<core::List<core::int*>*>();
-    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      for (final core::List<core::int*>* #t212 in <core::List<core::int*>*>[<core::int*>[42]])
-        #t211.{core::Set::add}(#t212);
-    #t211.{core::Set::add}(null);
-  } =>#t211;
   core::Map<core::String*, core::List<core::int*>*>* map22 = block {
-    final core::Map<core::String*, core::List<core::int*>*>* #t213 = <core::String*, core::List<core::int*>*>{};
+    final core::Map<core::String*, core::List<core::int*>*>* #t211 = <core::String*, core::List<core::int*>*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t214 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[42]}.{core::Map::entries})
-        #t213.{core::Map::[]=}(#t214.{core::MapEntry::key}, #t214.{core::MapEntry::value});
-    #t213.{core::Map::[]=}("baz", null);
-  } =>#t213;
+      for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t212 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[42]}.{core::Map::entries})
+        #t211.{core::Map::[]=}{Invariant}(#t212.{core::MapEntry::key}, #t212.{core::MapEntry::value});
+    #t211.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t211;
   core::List<core::int*>* list30 = block {
-    final core::List<core::int*>* #t215 = <core::int*>[];
+    final core::List<core::int*>* #t213 = <core::int*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
+        for (final core::int* #t214 in <core::int*>[42])
+          #t213.{core::List::add}{Invariant}(#t214);
+  } =>#t213;
+  core::Set<core::int*>* set30 = block {
+    final core::Set<core::int*>* #t215 = col::LinkedHashSet::•<core::int*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
         for (final core::int* #t216 in <core::int*>[42])
-          #t215.{core::List::add}(#t216);
+          #t215.{core::Set::add}{Invariant}(#t216);
+    #t215.{core::Set::add}{Invariant}(null);
   } =>#t215;
-  core::Set<core::int*>* set30 = block {
-    final core::Set<core::int*>* #t217 = col::LinkedHashSet::•<core::int*>();
-    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        for (final core::int* #t218 in <core::int*>[42])
-          #t217.{core::Set::add}(#t218);
-    #t217.{core::Set::add}(null);
-  } =>#t217;
   core::Map<core::String*, core::int*>* map30 = block {
-    final core::Map<core::String*, core::int*>* #t219 = <core::String*, core::int*>{};
+    final core::Map<core::String*, core::int*>* #t217 = <core::String*, core::int*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        for (final core::MapEntry<core::String*, core::int*>* #t220 in <core::String*, core::int*>{"bar": 42}.{core::Map::entries})
-          #t219.{core::Map::[]=}(#t220.{core::MapEntry::key}, #t220.{core::MapEntry::value});
-    #t219.{core::Map::[]=}("baz", null);
-  } =>#t219;
+        for (final core::MapEntry<core::String*, core::int*>* #t218 in <core::String*, core::int*>{"bar": 42}.{core::Map::entries})
+          #t217.{core::Map::[]=}{Invariant}(#t218.{core::MapEntry::key}, #t218.{core::MapEntry::value});
+    #t217.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t217;
   core::List<dynamic>* list31 = block {
-    final core::List<dynamic>* #t221 = <dynamic>[];
+    final core::List<dynamic>* #t219 = <dynamic>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
+        for (final dynamic #t220 in <dynamic>[dynVar])
+          #t219.{core::List::add}{Invariant}(#t220);
+  } =>#t219;
+  core::Set<dynamic>* set31 = block {
+    final core::Set<dynamic>* #t221 = col::LinkedHashSet::•<dynamic>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
         for (final dynamic #t222 in <dynamic>[dynVar])
-          #t221.{core::List::add}(#t222);
+          #t221.{core::Set::add}{Invariant}(#t222);
+    #t221.{core::Set::add}{Invariant}(null);
   } =>#t221;
-  core::Set<dynamic>* set31 = block {
-    final core::Set<dynamic>* #t223 = col::LinkedHashSet::•<dynamic>();
-    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        for (final dynamic #t224 in <dynamic>[dynVar])
-          #t223.{core::Set::add}(#t224);
-    #t223.{core::Set::add}(null);
-  } =>#t223;
   core::Map<core::String*, dynamic>* map31 = block {
-    final core::Map<core::String*, dynamic>* #t225 = <core::String*, dynamic>{};
+    final core::Map<core::String*, dynamic>* #t223 = <core::String*, dynamic>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        for (final core::MapEntry<core::String*, dynamic>* #t226 in <core::String*, dynamic>{"bar": dynVar}.{core::Map::entries})
-          #t225.{core::Map::[]=}(#t226.{core::MapEntry::key}, #t226.{core::MapEntry::value});
-    #t225.{core::Map::[]=}("baz", null);
-  } =>#t225;
+        for (final core::MapEntry<core::String*, dynamic>* #t224 in <core::String*, dynamic>{"bar": dynVar}.{core::Map::entries})
+          #t223.{core::Map::[]=}{Invariant}(#t224.{core::MapEntry::key}, #t224.{core::MapEntry::value});
+    #t223.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t223;
   core::List<core::List<core::int*>*>* list33 = block {
-    final core::List<core::List<core::int*>*>* #t227 = <core::List<core::int*>*>[];
+    final core::List<core::List<core::int*>*>* #t225 = <core::List<core::int*>*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
+        for (final core::List<core::int*>* #t226 in <core::List<core::int*>*>[<core::int*>[42]])
+          #t225.{core::List::add}{Invariant}(#t226);
+  } =>#t225;
+  core::Set<core::List<core::int*>*>* set33 = block {
+    final core::Set<core::List<core::int*>*>* #t227 = col::LinkedHashSet::•<core::List<core::int*>*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
         for (final core::List<core::int*>* #t228 in <core::List<core::int*>*>[<core::int*>[42]])
-          #t227.{core::List::add}(#t228);
+          #t227.{core::Set::add}{Invariant}(#t228);
+    #t227.{core::Set::add}{Invariant}(null);
   } =>#t227;
-  core::Set<core::List<core::int*>*>* set33 = block {
-    final core::Set<core::List<core::int*>*>* #t229 = col::LinkedHashSet::•<core::List<core::int*>*>();
-    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        for (final core::List<core::int*>* #t230 in <core::List<core::int*>*>[<core::int*>[42]])
-          #t229.{core::Set::add}(#t230);
-    #t229.{core::Set::add}(null);
-  } =>#t229;
   core::Map<core::String*, core::List<core::int*>*>* map33 = block {
-    final core::Map<core::String*, core::List<core::int*>*>* #t231 = <core::String*, core::List<core::int*>*>{};
+    final core::Map<core::String*, core::List<core::int*>*>* #t229 = <core::String*, core::List<core::int*>*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t232 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[42]}.{core::Map::entries})
-          #t231.{core::Map::[]=}(#t232.{core::MapEntry::key}, #t232.{core::MapEntry::value});
-    #t231.{core::Map::[]=}("baz", null);
-  } =>#t231;
+        for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t230 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[42]}.{core::Map::entries})
+          #t229.{core::Map::[]=}{Invariant}(#t230.{core::MapEntry::key}, #t230.{core::MapEntry::value});
+    #t229.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t229;
   core::List<core::List<core::int*>*>* list40 = block {
-    final core::List<core::List<core::int*>*>* #t233 = <core::List<core::int*>*>[];
+    final core::List<core::List<core::int*>*>* #t231 = <core::List<core::int*>*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
+      for (final core::List<core::int*>* #t232 in <core::List<core::int*>*>[<core::int*>[]])
+        #t231.{core::List::add}{Invariant}(#t232);
+  } =>#t231;
+  core::Set<core::List<core::int*>*>* set40 = block {
+    final core::Set<core::List<core::int*>*>* #t233 = col::LinkedHashSet::•<core::List<core::int*>*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       for (final core::List<core::int*>* #t234 in <core::List<core::int*>*>[<core::int*>[]])
-        #t233.{core::List::add}(#t234);
+        #t233.{core::Set::add}{Invariant}(#t234);
+    #t233.{core::Set::add}{Invariant}(null);
   } =>#t233;
-  core::Set<core::List<core::int*>*>* set40 = block {
-    final core::Set<core::List<core::int*>*>* #t235 = col::LinkedHashSet::•<core::List<core::int*>*>();
-    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      for (final core::List<core::int*>* #t236 in <core::List<core::int*>*>[<core::int*>[]])
-        #t235.{core::Set::add}(#t236);
-    #t235.{core::Set::add}(null);
-  } =>#t235;
   core::Map<core::String*, core::List<core::int*>*>* map40 = block {
-    final core::Map<core::String*, core::List<core::int*>*>* #t237 = <core::String*, core::List<core::int*>*>{};
+    final core::Map<core::String*, core::List<core::int*>*>* #t235 = <core::String*, core::List<core::int*>*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t238 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[]}.{core::Map::entries})
-        #t237.{core::Map::[]=}(#t238.{core::MapEntry::key}, #t238.{core::MapEntry::value});
-    #t237.{core::Map::[]=}("baz", null);
-  } =>#t237;
+      for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t236 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[]}.{core::Map::entries})
+        #t235.{core::Map::[]=}{Invariant}(#t236.{core::MapEntry::key}, #t236.{core::MapEntry::value});
+    #t235.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t235;
   core::List<core::List<core::int*>*>* list41 = block {
-    final core::List<core::List<core::int*>*>* #t239 = <core::List<core::int*>*>[];
+    final core::List<core::List<core::int*>*>* #t237 = <core::List<core::int*>*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      for (final core::List<core::int*>* #t240 in let final core::Set<core::List<core::int*>*>* #t241 = col::LinkedHashSet::•<core::List<core::int*>*>() in let final dynamic #t242 = #t241.{core::Set::add}(<core::int*>[]) in #t241)
-        #t239.{core::List::add}(#t240);
-  } =>#t239;
+      for (final core::List<core::int*>* #t238 in block {
+        final core::Set<core::List<core::int*>*>* #t239 = col::LinkedHashSet::•<core::List<core::int*>*>();
+        #t239.{core::Set::add}{Invariant}(<core::int*>[]);
+      } =>#t239)
+        #t237.{core::List::add}{Invariant}(#t238);
+  } =>#t237;
   core::Set<core::List<core::int*>*>* set41 = block {
-    final core::Set<core::List<core::int*>*>* #t243 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    final core::Set<core::List<core::int*>*>* #t240 = col::LinkedHashSet::•<core::List<core::int*>*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      for (final core::List<core::int*>* #t244 in let final core::Set<core::List<core::int*>*>* #t245 = col::LinkedHashSet::•<core::List<core::int*>*>() in let final dynamic #t246 = #t245.{core::Set::add}(<core::int*>[]) in #t245)
-        #t243.{core::Set::add}(#t244);
-    #t243.{core::Set::add}(null);
-  } =>#t243;
+      for (final core::List<core::int*>* #t241 in block {
+        final core::Set<core::List<core::int*>*>* #t242 = col::LinkedHashSet::•<core::List<core::int*>*>();
+        #t242.{core::Set::add}{Invariant}(<core::int*>[]);
+      } =>#t242)
+        #t240.{core::Set::add}{Invariant}(#t241);
+    #t240.{core::Set::add}{Invariant}(null);
+  } =>#t240;
   core::List<core::List<core::int*>*>* list42 = block {
-    final core::List<core::List<core::int*>*>* #t247 = <core::List<core::int*>*>[];
+    final core::List<core::List<core::int*>*>* #t243 = <core::List<core::int*>*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        for (final core::List<core::int*>* #t248 in <core::List<core::int*>*>[<core::int*>[]])
-          #t247.{core::List::add}(#t248);
-  } =>#t247;
+        for (final core::List<core::int*>* #t244 in <core::List<core::int*>*>[<core::int*>[]])
+          #t243.{core::List::add}{Invariant}(#t244);
+  } =>#t243;
   core::Set<core::List<core::int*>*>* set42 = block {
-    final core::Set<core::List<core::int*>*>* #t249 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    final core::Set<core::List<core::int*>*>* #t245 = col::LinkedHashSet::•<core::List<core::int*>*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        for (final core::List<core::int*>* #t250 in <core::List<core::int*>*>[<core::int*>[]])
-          #t249.{core::Set::add}(#t250);
-    #t249.{core::Set::add}(null);
-  } =>#t249;
+        for (final core::List<core::int*>* #t246 in <core::List<core::int*>*>[<core::int*>[]])
+          #t245.{core::Set::add}{Invariant}(#t246);
+    #t245.{core::Set::add}{Invariant}(null);
+  } =>#t245;
   core::Map<core::String*, core::List<core::int*>*>* map42 = block {
-    final core::Map<core::String*, core::List<core::int*>*>* #t251 = <core::String*, core::List<core::int*>*>{};
+    final core::Map<core::String*, core::List<core::int*>*>* #t247 = <core::String*, core::List<core::int*>*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t252 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[]}.{core::Map::entries})
-          #t251.{core::Map::[]=}(#t252.{core::MapEntry::key}, #t252.{core::MapEntry::value});
-    #t251.{core::Map::[]=}("baz", null);
-  } =>#t251;
+        for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t248 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[]}.{core::Map::entries})
+          #t247.{core::Map::[]=}{Invariant}(#t248.{core::MapEntry::key}, #t248.{core::MapEntry::value});
+    #t247.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t247;
   core::List<core::int*>* list50 = block {
-    final core::List<core::int*>* #t253 = <core::int*>[];
+    final core::List<core::int*>* #t249 = <core::int*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      for (final core::int* #t254 in <core::int*>[])
-        #t253.{core::List::add}(#t254);
-  } =>#t253;
+      for (final core::int* #t250 in <core::int*>[])
+        #t249.{core::List::add}{Invariant}(#t250);
+  } =>#t249;
   core::Set<core::int*>* set50 = block {
-    final core::Set<core::int*>* #t255 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t251 = col::LinkedHashSet::•<core::int*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      for (final core::int* #t256 in <core::int*>[])
-        #t255.{core::Set::add}(#t256);
-    #t255.{core::Set::add}(null);
-  } =>#t255;
+      for (final core::int* #t252 in <core::int*>[])
+        #t251.{core::Set::add}{Invariant}(#t252);
+    #t251.{core::Set::add}{Invariant}(null);
+  } =>#t251;
   core::Map<core::String*, core::int*>* map50 = block {
-    final core::Map<core::String*, core::int*>* #t257 = <core::String*, core::int*>{};
+    final core::Map<core::String*, core::int*>* #t253 = <core::String*, core::int*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      for (final core::MapEntry<core::String*, core::int*>* #t258 in <core::String*, core::int*>{}.{core::Map::entries})
-        #t257.{core::Map::[]=}(#t258.{core::MapEntry::key}, #t258.{core::MapEntry::value});
-    #t257.{core::Map::[]=}("baz", null);
-  } =>#t257;
+      for (final core::MapEntry<core::String*, core::int*>* #t254 in <core::String*, core::int*>{}.{core::Map::entries})
+        #t253.{core::Map::[]=}{Invariant}(#t254.{core::MapEntry::key}, #t254.{core::MapEntry::value});
+    #t253.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t253;
   core::List<core::int*>* list51 = block {
-    final core::List<core::int*>* #t259 = <core::int*>[];
+    final core::List<core::int*>* #t255 = <core::int*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      for (final core::int* #t260 in let final core::Set<core::int*>* #t261 = col::LinkedHashSet::•<core::int*>() in #t261)
-        #t259.{core::List::add}(#t260);
-  } =>#t259;
+      for (final core::int* #t256 in block {
+        final core::Set<core::int*>* #t257 = col::LinkedHashSet::•<core::int*>();
+      } =>#t257)
+        #t255.{core::List::add}{Invariant}(#t256);
+  } =>#t255;
   core::Set<core::int*>* set51 = block {
-    final core::Set<core::int*>* #t262 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t258 = col::LinkedHashSet::•<core::int*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      for (final core::int* #t263 in let final core::Set<core::int*>* #t264 = col::LinkedHashSet::•<core::int*>() in #t264)
-        #t262.{core::Set::add}(#t263);
-    #t262.{core::Set::add}(null);
-  } =>#t262;
+      for (final core::int* #t259 in block {
+        final core::Set<core::int*>* #t260 = col::LinkedHashSet::•<core::int*>();
+      } =>#t260)
+        #t258.{core::Set::add}{Invariant}(#t259);
+    #t258.{core::Set::add}{Invariant}(null);
+  } =>#t258;
   core::List<core::int*>* list52 = block {
-    final core::List<core::int*>* #t265 = <core::int*>[];
+    final core::List<core::int*>* #t261 = <core::int*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        for (final core::int* #t266 in <core::int*>[])
-          #t265.{core::List::add}(#t266);
-  } =>#t265;
+        for (final core::int* #t262 in <core::int*>[])
+          #t261.{core::List::add}{Invariant}(#t262);
+  } =>#t261;
   core::Set<core::int*>* set52 = block {
-    final core::Set<core::int*>* #t267 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t263 = col::LinkedHashSet::•<core::int*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        for (final core::int* #t268 in <core::int*>[])
-          #t267.{core::Set::add}(#t268);
-    #t267.{core::Set::add}(null);
-  } =>#t267;
+        for (final core::int* #t264 in <core::int*>[])
+          #t263.{core::Set::add}{Invariant}(#t264);
+    #t263.{core::Set::add}{Invariant}(null);
+  } =>#t263;
   core::List<core::List<core::int*>*>* list60 = block {
-    final core::List<core::List<core::int*>*>* #t269 = <core::List<core::int*>*>[];
+    final core::List<core::List<core::int*>*>* #t265 = <core::List<core::int*>*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      for (final core::List<core::int*>* #t270 in <core::List<core::int*>*>[<core::int*>[]])
-        #t269.{core::List::add}(#t270);
-  } =>#t269;
+      for (final core::List<core::int*>* #t266 in <core::List<core::int*>*>[<core::int*>[]])
+        #t265.{core::List::add}{Invariant}(#t266);
+  } =>#t265;
   core::Set<core::List<core::int*>*>* set60 = block {
-    final core::Set<core::List<core::int*>*>* #t271 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    final core::Set<core::List<core::int*>*>* #t267 = col::LinkedHashSet::•<core::List<core::int*>*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      for (final core::List<core::int*>* #t272 in <core::List<core::int*>*>[<core::int*>[]])
-        #t271.{core::Set::add}(#t272);
-    #t271.{core::Set::add}(null);
-  } =>#t271;
+      for (final core::List<core::int*>* #t268 in <core::List<core::int*>*>[<core::int*>[]])
+        #t267.{core::Set::add}{Invariant}(#t268);
+    #t267.{core::Set::add}{Invariant}(null);
+  } =>#t267;
   core::Map<core::String*, core::List<core::int*>*>* map60 = block {
-    final core::Map<core::String*, core::List<core::int*>*>* #t273 = <core::String*, core::List<core::int*>*>{};
+    final core::Map<core::String*, core::List<core::int*>*>* #t269 = <core::String*, core::List<core::int*>*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t274 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[]}.{core::Map::entries})
-        #t273.{core::Map::[]=}(#t274.{core::MapEntry::key}, #t274.{core::MapEntry::value});
-    #t273.{core::Map::[]=}("baz", null);
-  } =>#t273;
+      for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t270 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[]}.{core::Map::entries})
+        #t269.{core::Map::[]=}{Invariant}(#t270.{core::MapEntry::key}, #t270.{core::MapEntry::value});
+    #t269.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t269;
   core::List<core::List<core::int*>*>* list61 = block {
-    final core::List<core::List<core::int*>*>* #t275 = <core::List<core::int*>*>[];
+    final core::List<core::List<core::int*>*>* #t271 = <core::List<core::int*>*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        for (final core::List<core::int*>* #t276 in <core::List<core::int*>*>[<core::int*>[]])
-          #t275.{core::List::add}(#t276);
-  } =>#t275;
+        for (final core::List<core::int*>* #t272 in <core::List<core::int*>*>[<core::int*>[]])
+          #t271.{core::List::add}{Invariant}(#t272);
+  } =>#t271;
   core::Set<core::List<core::int*>*>* set61 = block {
-    final core::Set<core::List<core::int*>*>* #t277 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    final core::Set<core::List<core::int*>*>* #t273 = col::LinkedHashSet::•<core::List<core::int*>*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        for (final core::List<core::int*>* #t278 in <core::List<core::int*>*>[<core::int*>[]])
-          #t277.{core::Set::add}(#t278);
-    #t277.{core::Set::add}(null);
-  } =>#t277;
+        for (final core::List<core::int*>* #t274 in <core::List<core::int*>*>[<core::int*>[]])
+          #t273.{core::Set::add}{Invariant}(#t274);
+    #t273.{core::Set::add}{Invariant}(null);
+  } =>#t273;
   core::Map<core::String*, core::List<core::int*>*>* map61 = block {
+    final core::Map<core::String*, core::List<core::int*>*>* #t275 = <core::String*, core::List<core::int*>*>{};
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
+        for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t276 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[]}.{core::Map::entries})
+          #t275.{core::Map::[]=}{Invariant}(#t276.{core::MapEntry::key}, #t276.{core::MapEntry::value});
+    #t275.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t275;
+  core::List<core::List<core::int*>*>* list70 = block {
+    final core::List<core::List<core::int*>*>* #t277 = <core::List<core::int*>*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
+      #t277.{core::List::add}{Invariant}(<core::int*>[]);
+  } =>#t277;
+  core::Set<core::List<core::int*>*>* set70 = block {
+    final core::Set<core::List<core::int*>*>* #t278 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
+      #t278.{core::Set::add}{Invariant}(<core::int*>[]);
+    #t278.{core::Set::add}{Invariant}(null);
+  } =>#t278;
+  core::Map<core::String*, core::List<core::int*>*>* map70 = block {
     final core::Map<core::String*, core::List<core::int*>*>* #t279 = <core::String*, core::List<core::int*>*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t280 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[]}.{core::Map::entries})
-          #t279.{core::Map::[]=}(#t280.{core::MapEntry::key}, #t280.{core::MapEntry::value});
-    #t279.{core::Map::[]=}("baz", null);
+      #t279.{core::Map::[]=}{Invariant}("bar", <core::int*>[]);
+    #t279.{core::Map::[]=}{Invariant}("baz", null);
   } =>#t279;
-  core::List<core::List<core::int*>*>* list70 = block {
-    final core::List<core::List<core::int*>*>* #t281 = <core::List<core::int*>*>[];
-    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      #t281.{core::List::add}(<core::int*>[]);
-  } =>#t281;
-  core::Set<core::List<core::int*>*>* set70 = block {
-    final core::Set<core::List<core::int*>*>* #t282 = col::LinkedHashSet::•<core::List<core::int*>*>();
-    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      #t282.{core::Set::add}(<core::int*>[]);
-    #t282.{core::Set::add}(null);
-  } =>#t282;
-  core::Map<core::String*, core::List<core::int*>*>* map70 = block {
-    final core::Map<core::String*, core::List<core::int*>*>* #t283 = <core::String*, core::List<core::int*>*>{};
-    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      #t283.{core::Map::[]=}("bar", <core::int*>[]);
-    #t283.{core::Map::[]=}("baz", null);
-  } =>#t283;
   core::List<core::List<core::int*>*>* list71 = block {
-    final core::List<core::List<core::int*>*>* #t284 = <core::List<core::int*>*>[];
+    final core::List<core::List<core::int*>*>* #t280 = <core::List<core::int*>*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t284.{core::List::add}(<core::int*>[]);
-  } =>#t284;
+        #t280.{core::List::add}{Invariant}(<core::int*>[]);
+  } =>#t280;
   core::Set<core::List<core::int*>*>* set71 = block {
-    final core::Set<core::List<core::int*>*>* #t285 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    final core::Set<core::List<core::int*>*>* #t281 = col::LinkedHashSet::•<core::List<core::int*>*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t285.{core::Set::add}(<core::int*>[]);
-    #t285.{core::Set::add}(null);
-  } =>#t285;
+        #t281.{core::Set::add}{Invariant}(<core::int*>[]);
+    #t281.{core::Set::add}{Invariant}(null);
+  } =>#t281;
   core::Map<core::String*, core::List<core::int*>*>* map71 = block {
-    final core::Map<core::String*, core::List<core::int*>*>* #t286 = <core::String*, core::List<core::int*>*>{};
+    final core::Map<core::String*, core::List<core::int*>*>* #t282 = <core::String*, core::List<core::int*>*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t286.{core::Map::[]=}("bar", <core::int*>[]);
-    #t286.{core::Map::[]=}("baz", null);
-  } =>#t286;
+        #t282.{core::Map::[]=}{Invariant}("bar", <core::int*>[]);
+    #t282.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t282;
   core::List<core::num*>* list80 = block {
-    final core::List<core::num*>* #t287 = <core::num*>[];
+    final core::List<core::num*>* #t283 = <core::num*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t287.{core::List::add}(42);
+        #t283.{core::List::add}{Invariant}(42);
       else
-        #t287.{core::List::add}(3.14);
-  } =>#t287;
+        #t283.{core::List::add}{Invariant}(3.14);
+  } =>#t283;
   core::Set<core::num*>* set80 = block {
-    final core::Set<core::num*>* #t288 = col::LinkedHashSet::•<core::num*>();
+    final core::Set<core::num*>* #t284 = col::LinkedHashSet::•<core::num*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t288.{core::Set::add}(42);
+        #t284.{core::Set::add}{Invariant}(42);
       else
-        #t288.{core::Set::add}(3.14);
-    #t288.{core::Set::add}(null);
-  } =>#t288;
+        #t284.{core::Set::add}{Invariant}(3.14);
+    #t284.{core::Set::add}{Invariant}(null);
+  } =>#t284;
   core::Map<core::String*, core::num*>* map80 = block {
-    final core::Map<core::String*, core::num*>* #t289 = <core::String*, core::num*>{};
+    final core::Map<core::String*, core::num*>* #t285 = <core::String*, core::num*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t289.{core::Map::[]=}("bar", 42);
+        #t285.{core::Map::[]=}{Invariant}("bar", 42);
       else
-        #t289.{core::Map::[]=}("bar", 3.14);
-    #t289.{core::Map::[]=}("baz", null);
-  } =>#t289;
+        #t285.{core::Map::[]=}{Invariant}("bar", 3.14);
+    #t285.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t285;
   core::List<core::num*>* list81 = block {
-    final core::List<core::num*>* #t290 = <core::num*>[];
+    final core::List<core::num*>* #t286 = <core::num*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        for (final core::num* #t291 in listInt)
-          #t290.{core::List::add}(#t291);
+        for (final core::num* #t287 in listInt)
+          #t286.{core::List::add}{Invariant}(#t287);
       else
-        for (final core::num* #t292 in listDouble)
-          #t290.{core::List::add}(#t292);
-  } =>#t290;
+        for (final core::num* #t288 in listDouble)
+          #t286.{core::List::add}{Invariant}(#t288);
+  } =>#t286;
   core::Set<core::num*>* set81 = block {
-    final core::Set<core::num*>* #t293 = col::LinkedHashSet::•<core::num*>();
+    final core::Set<core::num*>* #t289 = col::LinkedHashSet::•<core::num*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        for (final core::num* #t294 in listInt)
-          #t293.{core::Set::add}(#t294);
+        for (final core::num* #t290 in listInt)
+          #t289.{core::Set::add}{Invariant}(#t290);
       else
-        for (final core::num* #t295 in listDouble)
-          #t293.{core::Set::add}(#t295);
-    #t293.{core::Set::add}(null);
-  } =>#t293;
+        for (final core::num* #t291 in listDouble)
+          #t289.{core::Set::add}{Invariant}(#t291);
+    #t289.{core::Set::add}{Invariant}(null);
+  } =>#t289;
   core::Map<core::String*, core::num*>* map81 = block {
-    final core::Map<core::String*, core::num*>* #t296 = <core::String*, core::num*>{};
+    final core::Map<core::String*, core::num*>* #t292 = <core::String*, core::num*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        for (final core::MapEntry<core::String*, core::num*>* #t297 in mapStringInt.{core::Map::entries})
-          #t296.{core::Map::[]=}(#t297.{core::MapEntry::key}, #t297.{core::MapEntry::value});
+        for (final core::MapEntry<core::String*, core::num*>* #t293 in mapStringInt.{core::Map::entries})
+          #t292.{core::Map::[]=}{Invariant}(#t293.{core::MapEntry::key}, #t293.{core::MapEntry::value});
       else
-        for (final core::MapEntry<core::String*, core::num*>* #t298 in mapStringDouble.{core::Map::entries})
-          #t296.{core::Map::[]=}(#t298.{core::MapEntry::key}, #t298.{core::MapEntry::value});
-    #t296.{core::Map::[]=}("baz", null);
-  } =>#t296;
+        for (final core::MapEntry<core::String*, core::num*>* #t294 in mapStringDouble.{core::Map::entries})
+          #t292.{core::Map::[]=}{Invariant}(#t294.{core::MapEntry::key}, #t294.{core::MapEntry::value});
+    #t292.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t292;
   core::List<dynamic>* list82 = block {
-    final core::List<dynamic>* #t299 = <dynamic>[];
+    final core::List<dynamic>* #t295 = <dynamic>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        for (final dynamic #t300 in listInt)
-          #t299.{core::List::add}(#t300);
+        for (final dynamic #t296 in listInt)
+          #t295.{core::List::add}{Invariant}(#t296);
       else
-        for (final dynamic #t301 in dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*)
-          #t299.{core::List::add}(#t301);
-  } =>#t299;
+        for (final dynamic #t297 in dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*)
+          #t295.{core::List::add}{Invariant}(#t297);
+  } =>#t295;
   core::Set<dynamic>* set82 = block {
-    final core::Set<dynamic>* #t302 = col::LinkedHashSet::•<dynamic>();
+    final core::Set<dynamic>* #t298 = col::LinkedHashSet::•<dynamic>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        for (final dynamic #t303 in listInt)
-          #t302.{core::Set::add}(#t303);
+        for (final dynamic #t299 in listInt)
+          #t298.{core::Set::add}{Invariant}(#t299);
       else
-        for (final dynamic #t304 in dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*)
-          #t302.{core::Set::add}(#t304);
-    #t302.{core::Set::add}(null);
-  } =>#t302;
+        for (final dynamic #t300 in dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*)
+          #t298.{core::Set::add}{Invariant}(#t300);
+    #t298.{core::Set::add}{Invariant}(null);
+  } =>#t298;
   core::Map<dynamic, dynamic>* map82 = block {
-    final core::Map<dynamic, dynamic>* #t305 = <dynamic, dynamic>{};
+    final core::Map<dynamic, dynamic>* #t301 = <dynamic, dynamic>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        for (final core::MapEntry<dynamic, dynamic>* #t306 in mapStringInt.{core::Map::entries})
-          #t305.{core::Map::[]=}(#t306.{core::MapEntry::key}, #t306.{core::MapEntry::value});
+        for (final core::MapEntry<dynamic, dynamic>* #t302 in mapStringInt.{core::Map::entries})
+          #t301.{core::Map::[]=}{Invariant}(#t302.{core::MapEntry::key}, #t302.{core::MapEntry::value});
       else
-        for (final core::MapEntry<dynamic, dynamic>* #t307 in (dynVar as{TypeError,ForDynamic} core::Map<dynamic, dynamic>*).{core::Map::entries})
-          #t305.{core::Map::[]=}(#t307.{core::MapEntry::key}, #t307.{core::MapEntry::value});
-    #t305.{core::Map::[]=}("baz", null);
-  } =>#t305;
+        for (final core::MapEntry<dynamic, dynamic>* #t303 in (dynVar as{TypeError,ForDynamic} core::Map<dynamic, dynamic>*).{core::Map::entries})
+          #t301.{core::Map::[]=}{Invariant}(#t303.{core::MapEntry::key}, #t303.{core::MapEntry::value});
+    #t301.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t301;
   core::List<core::num*>* list83 = block {
-    final core::List<core::num*>* #t308 = <core::num*>[];
+    final core::List<core::num*>* #t304 = <core::num*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t308.{core::List::add}(42);
+        #t304.{core::List::add}{Invariant}(42);
       else
-        for (final core::num* #t309 in listDouble)
-          #t308.{core::List::add}(#t309);
-  } =>#t308;
+        for (final core::num* #t305 in listDouble)
+          #t304.{core::List::add}{Invariant}(#t305);
+  } =>#t304;
   core::Set<core::num*>* set83 = block {
-    final core::Set<core::num*>* #t310 = col::LinkedHashSet::•<core::num*>();
+    final core::Set<core::num*>* #t306 = col::LinkedHashSet::•<core::num*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        for (final core::num* #t311 in listInt)
-          #t310.{core::Set::add}(#t311);
+        for (final core::num* #t307 in listInt)
+          #t306.{core::Set::add}{Invariant}(#t307);
       else
-        #t310.{core::Set::add}(3.14);
-    #t310.{core::Set::add}(null);
-  } =>#t310;
+        #t306.{core::Set::add}{Invariant}(3.14);
+    #t306.{core::Set::add}{Invariant}(null);
+  } =>#t306;
   core::Map<core::String*, core::num*>* map83 = block {
-    final core::Map<core::String*, core::num*>* #t312 = <core::String*, core::num*>{};
+    final core::Map<core::String*, core::num*>* #t308 = <core::String*, core::num*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        for (final core::MapEntry<core::String*, core::num*>* #t313 in mapStringInt.{core::Map::entries})
-          #t312.{core::Map::[]=}(#t313.{core::MapEntry::key}, #t313.{core::MapEntry::value});
+        for (final core::MapEntry<core::String*, core::num*>* #t309 in mapStringInt.{core::Map::entries})
+          #t308.{core::Map::[]=}{Invariant}(#t309.{core::MapEntry::key}, #t309.{core::MapEntry::value});
       else
-        #t312.{core::Map::[]=}("bar", 3.14);
-    #t312.{core::Map::[]=}("baz", null);
-  } =>#t312;
+        #t308.{core::Map::[]=}{Invariant}("bar", 3.14);
+    #t308.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t308;
   core::List<core::int*>* list90 = block {
-    final core::List<core::int*>* #t314 = <core::int*>[];
+    final core::List<core::int*>* #t310 = <core::int*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      #t314.{core::List::add}(dynVar as{TypeError,ForDynamic} core::int*);
-  } =>#t314;
+      #t310.{core::List::add}{Invariant}(dynVar as{TypeError,ForDynamic} core::int*);
+  } =>#t310;
   core::Set<core::int*>* set90 = block {
-    final core::Set<core::int*>* #t315 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t311 = col::LinkedHashSet::•<core::int*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      #t315.{core::Set::add}(dynVar as{TypeError,ForDynamic} core::int*);
-    #t315.{core::Set::add}(null);
-  } =>#t315;
+      #t311.{core::Set::add}{Invariant}(dynVar as{TypeError,ForDynamic} core::int*);
+    #t311.{core::Set::add}{Invariant}(null);
+  } =>#t311;
   core::Map<core::String*, core::int*>* map90 = block {
-    final core::Map<core::String*, core::int*>* #t316 = <core::String*, core::int*>{};
+    final core::Map<core::String*, core::int*>* #t312 = <core::String*, core::int*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      #t316.{core::Map::[]=}("bar", dynVar as{TypeError,ForDynamic} core::int*);
-    #t316.{core::Map::[]=}("baz", null);
-  } =>#t316;
+      #t312.{core::Map::[]=}{Invariant}("bar", dynVar as{TypeError,ForDynamic} core::int*);
+    #t312.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t312;
   core::List<core::int*>* list91 = block {
-    final core::List<core::int*>* #t317 = <core::int*>[];
+    final core::List<core::int*>* #t313 = <core::int*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      for (final dynamic #t318 in dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*) {
-        final core::int* #t319 = #t318 as{TypeError} core::int*;
-        #t317.{core::List::add}(#t319);
+      for (final dynamic #t314 in dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*) {
+        final core::int* #t315 = #t314 as{TypeError} core::int*;
+        #t313.{core::List::add}{Invariant}(#t315);
       }
-  } =>#t317;
+  } =>#t313;
   core::Set<core::int*>* set91 = block {
-    final core::Set<core::int*>* #t320 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t316 = col::LinkedHashSet::•<core::int*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      for (final dynamic #t321 in dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*) {
-        final core::int* #t322 = #t321 as{TypeError} core::int*;
-        #t320.{core::Set::add}(#t322);
+      for (final dynamic #t317 in dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*) {
+        final core::int* #t318 = #t317 as{TypeError} core::int*;
+        #t316.{core::Set::add}{Invariant}(#t318);
       }
-    #t320.{core::Set::add}(null);
-  } =>#t320;
+    #t316.{core::Set::add}{Invariant}(null);
+  } =>#t316;
   core::Map<core::String*, core::int*>* map91 = block {
-    final core::Map<core::String*, core::int*>* #t323 = <core::String*, core::int*>{};
+    final core::Map<core::String*, core::int*>* #t319 = <core::String*, core::int*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      for (final core::MapEntry<dynamic, dynamic>* #t324 in (dynVar as{TypeError,ForDynamic} core::Map<dynamic, dynamic>*).{core::Map::entries}) {
-        final core::String* #t325 = #t324.{core::MapEntry::key} as{TypeError} core::String*;
-        final core::int* #t326 = #t324.{core::MapEntry::value} as{TypeError} core::int*;
-        #t323.{core::Map::[]=}(#t325, #t326);
+      for (final core::MapEntry<dynamic, dynamic>* #t320 in (dynVar as{TypeError,ForDynamic} core::Map<dynamic, dynamic>*).{core::Map::entries}) {
+        final core::String* #t321 = #t320.{core::MapEntry::key} as{TypeError} core::String*;
+        final core::int* #t322 = #t320.{core::MapEntry::value} as{TypeError} core::int*;
+        #t319.{core::Map::[]=}{Invariant}(#t321, #t322);
       }
-    #t323.{core::Map::[]=}("baz", null);
-  } =>#t323;
+    #t319.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t319;
   core::List<core::int*>* list100 = block {
-    final core::List<core::int*>* #t327 = <core::int*>[];
-    for (final core::int* #t328 = index = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; index = index.{core::num::+}(1))
-      #t327.{core::List::add}(42);
-  } =>#t327;
+    final core::List<core::int*>* #t323 = <core::int*>[];
+    for (final core::int* #t324 = index = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; index = index.{core::num::+}(1))
+      #t323.{core::List::add}{Invariant}(42);
+  } =>#t323;
   core::Set<core::int*>* set100 = block {
-    final core::Set<core::int*>* #t329 = col::LinkedHashSet::•<core::int*>();
-    for (final core::int* #t330 = index = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; index = index.{core::num::+}(1))
-      #t329.{core::Set::add}(42);
-  } =>#t329;
+    final core::Set<core::int*>* #t325 = col::LinkedHashSet::•<core::int*>();
+    for (final core::int* #t326 = index = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; index = index.{core::num::+}(1))
+      #t325.{core::Set::add}{Invariant}(42);
+  } =>#t325;
   core::Map<core::String*, core::int*>* map100 = block {
-    final core::Map<core::String*, core::int*>* #t331 = <core::String*, core::int*>{};
-    for (final core::int* #t332 = index = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; index = index.{core::num::+}(1))
-      #t331.{core::Map::[]=}("bar", 42);
-  } =>#t331;
+    final core::Map<core::String*, core::int*>* #t327 = <core::String*, core::int*>{};
+    for (final core::int* #t328 = index = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; index = index.{core::num::+}(1))
+      #t327.{core::Map::[]=}{Invariant}("bar", 42);
+  } =>#t327;
   core::List<core::int*>* list110 = block {
-    final core::List<core::int*>* #t333 = <core::int*>[];
+    final core::List<core::int*>* #t329 = <core::int*>[];
     for (core::int* i in <core::int*>[1, 2, 3])
-      #t333.{core::List::add}(i);
-  } =>#t333;
+      #t329.{core::List::add}{Invariant}(i);
+  } =>#t329;
   core::Set<core::int*>* set110 = block {
-    final core::Set<core::int*>* #t334 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t330 = col::LinkedHashSet::•<core::int*>();
     for (core::int* i in <core::int*>[1, 2, 3])
-      #t334.{core::Set::add}(i);
-    #t334.{core::Set::add}(null);
-  } =>#t334;
+      #t330.{core::Set::add}{Invariant}(i);
+    #t330.{core::Set::add}{Invariant}(null);
+  } =>#t330;
   core::Map<core::String*, core::int*>* map110 = block {
-    final core::Map<core::String*, core::int*>* #t335 = <core::String*, core::int*>{};
+    final core::Map<core::String*, core::int*>* #t331 = <core::String*, core::int*>{};
     for (core::int* i in <core::int*>[1, 2, 3])
-      #t335.{core::Map::[]=}("bar", i);
-    #t335.{core::Map::[]=}("baz", null);
-  } =>#t335;
+      #t331.{core::Map::[]=}{Invariant}("bar", i);
+    #t331.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t331;
   core::List<core::int*>* list120 = block {
-    final core::List<core::int*>* #t336 = <core::int*>[];
+    final core::List<core::int*>* #t332 = <core::int*>[];
     for (dynamic i in dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*)
-      #t336.{core::List::add}(i as{TypeError,ForDynamic} core::int*);
-  } =>#t336;
+      #t332.{core::List::add}{Invariant}(i as{TypeError,ForDynamic} core::int*);
+  } =>#t332;
   core::Set<core::int*>* set120 = block {
-    final core::Set<core::int*>* #t337 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t333 = col::LinkedHashSet::•<core::int*>();
     for (dynamic i in dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*)
-      #t337.{core::Set::add}(i as{TypeError,ForDynamic} core::int*);
-    #t337.{core::Set::add}(null);
-  } =>#t337;
+      #t333.{core::Set::add}{Invariant}(i as{TypeError,ForDynamic} core::int*);
+    #t333.{core::Set::add}{Invariant}(null);
+  } =>#t333;
   core::Map<core::String*, core::int*>* map120 = block {
-    final core::Map<core::String*, core::int*>* #t338 = <core::String*, core::int*>{};
+    final core::Map<core::String*, core::int*>* #t334 = <core::String*, core::int*>{};
     for (dynamic i in dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*)
-      #t338.{core::Map::[]=}("bar", i as{TypeError,ForDynamic} core::int*);
-    #t338.{core::Map::[]=}("baz", null);
-  } =>#t338;
+      #t334.{core::Map::[]=}{Invariant}("bar", i as{TypeError,ForDynamic} core::int*);
+    #t334.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t334;
   core::List<core::int*>* list130 = block {
-    final core::List<core::int*>* #t339 = <core::int*>[];
+    final core::List<core::int*>* #t335 = <core::int*>[];
     for (core::int* i = 1; i.{core::num::<}(2); i = i.{core::num::+}(1))
-      #t339.{core::List::add}(i);
-  } =>#t339;
+      #t335.{core::List::add}{Invariant}(i);
+  } =>#t335;
   core::Set<core::int*>* set130 = block {
-    final core::Set<core::int*>* #t340 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t336 = col::LinkedHashSet::•<core::int*>();
     for (core::int* i = 1; i.{core::num::<}(2); i = i.{core::num::+}(1))
-      #t340.{core::Set::add}(i);
-  } =>#t340;
+      #t336.{core::Set::add}{Invariant}(i);
+  } =>#t336;
   core::Map<core::int*, core::int*>* map130 = block {
-    final core::Map<core::int*, core::int*>* #t341 = <core::int*, core::int*>{};
+    final core::Map<core::int*, core::int*>* #t337 = <core::int*, core::int*>{};
     for (core::int* i = 1; i.{core::num::<}(2); i = i.{core::num::+}(1))
-      #t341.{core::Map::[]=}(i, i);
-  } =>#t341;
+      #t337.{core::Map::[]=}{Invariant}(i, i);
+  } =>#t337;
 }
 static method testForElementErrors(core::Map<core::int*, core::int*>* map, core::List<core::int*>* list) → dynamic async {
   block {
-    final core::List<core::int*>* #t342 = <core::int*>[];
+    final core::List<core::int*>* #t338 = <core::int*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      #t342.{core::List::add}(let final<BottomType> #t343 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:212:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+      #t338.{core::List::add}{Invariant}(let final<BottomType> #t339 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:212:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int>[for (int i = 0; oracle(\"foo\"); i++) \"bar\"];
                                             ^" in "bar" as{TypeError} core::int*);
-  } =>#t342;
+  } =>#t338;
   block {
-    final core::Set<core::int*>* #t344 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t340 = col::LinkedHashSet::•<core::int*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      #t344.{core::Set::add}(let final<BottomType> #t345 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:213:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+      #t340.{core::Set::add}{Invariant}(let final<BottomType> #t341 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:213:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int>{for (int i = 0; oracle(\"foo\"); i++) \"bar\", null};
                                             ^" in "bar" as{TypeError} core::int*);
-    #t344.{core::Set::add}(null);
-  } =>#t344;
+    #t340.{core::Set::add}{Invariant}(null);
+  } =>#t340;
   block {
-    final core::Map<core::int*, core::int*>* #t346 = <core::int*, core::int*>{};
+    final core::Map<core::int*, core::int*>* #t342 = <core::int*, core::int*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      #t346.{core::Map::[]=}(let final<BottomType> #t347 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:214:50: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+      #t342.{core::Map::[]=}{Invariant}(let final<BottomType> #t343 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:214:50: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int, int>{for (int i = 0; oracle(\"foo\"); i++) \"bar\": \"bar\", \"baz\": null};
-                                                 ^" in "bar" as{TypeError} core::int*, let final<BottomType> #t348 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:214:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+                                                 ^" in "bar" as{TypeError} core::int*, let final<BottomType> #t344 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:214:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int, int>{for (int i = 0; oracle(\"foo\"); i++) \"bar\": \"bar\", \"baz\": null};
                                                         ^" in "bar" as{TypeError} core::int*);
-    #t346.{core::Map::[]=}(let final<BottomType> #t349 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:214:64: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+    #t342.{core::Map::[]=}{Invariant}(let final<BottomType> #t345 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:214:64: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int, int>{for (int i = 0; oracle(\"foo\"); i++) \"bar\": \"bar\", \"baz\": null};
                                                                ^" in "baz" as{TypeError} core::int*, null);
-  } =>#t346;
+  } =>#t342;
   block {
-    final core::List<core::int*>* #t350 = <core::int*>[];
+    final core::List<core::int*>* #t346 = <core::int*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      for (final core::int* #t351 in <core::int*>[let final<BottomType> #t352 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:215:49: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+      for (final core::int* #t347 in <core::int*>[let final<BottomType> #t348 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:215:49: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int>[for (int i = 0; oracle(\"foo\"); i++) ...[\"bar\"]];
                                                 ^" in "bar" as{TypeError} core::int*])
-        #t350.{core::List::add}(#t351);
-  } =>#t350;
+        #t346.{core::List::add}{Invariant}(#t347);
+  } =>#t346;
   block {
-    final core::Set<core::int*>* #t353 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t349 = col::LinkedHashSet::•<core::int*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      for (final core::int* #t354 in <core::int*>[let final<BottomType> #t355 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:216:49: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+      for (final core::int* #t350 in <core::int*>[let final<BottomType> #t351 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:216:49: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int>{for (int i = 0; oracle(\"foo\"); i++) ...[\"bar\"], null};
                                                 ^" in "bar" as{TypeError} core::int*])
-        #t353.{core::Set::add}(#t354);
-    #t353.{core::Set::add}(null);
-  } =>#t353;
+        #t349.{core::Set::add}{Invariant}(#t350);
+    #t349.{core::Set::add}{Invariant}(null);
+  } =>#t349;
   block {
-    final core::Map<core::int*, core::int*>* #t356 = <core::int*, core::int*>{};
+    final core::Map<core::int*, core::int*>* #t352 = <core::int*, core::int*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      for (final core::MapEntry<core::int*, core::int*>* #t357 in <core::int*, core::int*>{let final<BottomType> #t358 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:217:54: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+      for (final core::MapEntry<core::int*, core::int*>* #t353 in <core::int*, core::int*>{let final<BottomType> #t354 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:217:54: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int, int>{for (int i = 0; oracle(\"foo\"); i++) ...{\"bar\": \"bar\"}, \"baz\": null};
-                                                     ^" in "bar" as{TypeError} core::int*: let final<BottomType> #t359 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:217:61: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+                                                     ^" in "bar" as{TypeError} core::int*: let final<BottomType> #t355 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:217:61: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int, int>{for (int i = 0; oracle(\"foo\"); i++) ...{\"bar\": \"bar\"}, \"baz\": null};
                                                             ^" in "bar" as{TypeError} core::int*}.{core::Map::entries})
-        #t356.{core::Map::[]=}(#t357.{core::MapEntry::key}, #t357.{core::MapEntry::value});
-    #t356.{core::Map::[]=}(let final<BottomType> #t360 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:217:69: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+        #t352.{core::Map::[]=}{Invariant}(#t353.{core::MapEntry::key}, #t353.{core::MapEntry::value});
+    #t352.{core::Map::[]=}{Invariant}(let final<BottomType> #t356 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:217:69: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int, int>{for (int i = 0; oracle(\"foo\"); i++) ...{\"bar\": \"bar\"}, \"baz\": null};
                                                                     ^" in "baz" as{TypeError} core::int*, null);
-  } =>#t356;
+  } =>#t352;
   block {
-    final core::List<core::int*>* #t361 = <core::int*>[];
+    final core::List<core::int*>* #t357 = <core::int*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      #t361.{core::List::add}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:218:48: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+      #t357.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:218:48: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
   <int>[for (int i = 0; oracle(\"foo\"); i++) ...map];
                                                ^");
-  } =>#t361;
+  } =>#t357;
   block {
-    final core::Set<core::int*>* #t362 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t358 = col::LinkedHashSet::•<core::int*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      #t362.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:219:48: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+      #t358.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:219:48: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
   <int>{for (int i = 0; oracle(\"foo\"); i++) ...map, null};
                                                ^");
-    #t362.{core::Set::add}(null);
-  } =>#t362;
+    #t358.{core::Set::add}{Invariant}(null);
+  } =>#t358;
   <core::int*, core::int*>{invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:220:53: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
  - 'List' is from 'dart:core'.
   <int, int>{for (int i = 0; oracle(\"foo\"); i++) ...list, 42: null};
@@ -1900,66 +1920,66 @@
   <int, int>{for (int i = 0; oracle(\"foo\"); i++) ...list, 42: null};
                                                     ^": null};
   block {
-    final core::List<core::String*>* #t363 = <core::String*>[];
+    final core::List<core::String*>* #t359 = <core::String*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t363.{core::List::add}(let final<BottomType> #t364 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:221:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+        #t359.{core::List::add}{Invariant}(let final<BottomType> #t360 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:221:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
   <String>[for (int i = 0; oracle(\"foo\"); i++) if (oracle()) 42 else 3.14];
                                                              ^" in 42 as{TypeError} core::String*);
       else
-        #t363.{core::List::add}(let final<BottomType> #t365 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:221:70: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
+        #t359.{core::List::add}{Invariant}(let final<BottomType> #t361 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:221:70: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
   <String>[for (int i = 0; oracle(\"foo\"); i++) if (oracle()) 42 else 3.14];
                                                                      ^" in 3.14 as{TypeError} core::String*);
-  } =>#t363;
+  } =>#t359;
   block {
-    final core::Set<core::String*>* #t366 = col::LinkedHashSet::•<core::String*>();
+    final core::Set<core::String*>* #t362 = col::LinkedHashSet::•<core::String*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t366.{core::Set::add}(let final<BottomType> #t367 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:222:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+        #t362.{core::Set::add}{Invariant}(let final<BottomType> #t363 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:222:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
   <String>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) 42 else 3.14, null};
                                                              ^" in 42 as{TypeError} core::String*);
       else
-        #t366.{core::Set::add}(let final<BottomType> #t368 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:222:70: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
+        #t362.{core::Set::add}{Invariant}(let final<BottomType> #t364 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:222:70: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
   <String>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) 42 else 3.14, null};
                                                                      ^" in 3.14 as{TypeError} core::String*);
-    #t366.{core::Set::add}(null);
-  } =>#t366;
+    #t362.{core::Set::add}{Invariant}(null);
+  } =>#t362;
   block {
-    final core::Map<core::String*, core::String*>* #t369 = <core::String*, core::String*>{};
+    final core::Map<core::String*, core::String*>* #t365 = <core::String*, core::String*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t369.{core::Map::[]=}("bar", let final<BottomType> #t370 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:223:77: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+        #t365.{core::Map::[]=}{Invariant}("bar", let final<BottomType> #t366 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:223:77: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
   <String, String>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) \"bar\": 42 else \"bar\": 3.14, \"baz\": null};
                                                                             ^" in 42 as{TypeError} core::String*);
       else
-        #t369.{core::Map::[]=}("bar", let final<BottomType> #t371 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:223:92: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
+        #t365.{core::Map::[]=}{Invariant}("bar", let final<BottomType> #t367 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:223:92: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
   <String, String>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) \"bar\": 42 else \"bar\": 3.14, \"baz\": null};
                                                                                            ^" in 3.14 as{TypeError} core::String*);
-    #t369.{core::Map::[]=}("baz", null);
-  } =>#t369;
+    #t365.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t365;
   block {
-    final core::List<core::int*>* #t372 = <core::int*>[];
+    final core::List<core::int*>* #t368 = <core::int*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t372.{core::List::add}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:224:62: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+        #t368.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:224:62: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
   <int>[for (int i = 0; oracle(\"foo\"); i++) if (oracle()) ...map else 42];
                                                              ^");
       else
-        #t372.{core::List::add}(42);
-  } =>#t372;
+        #t368.{core::List::add}{Invariant}(42);
+  } =>#t368;
   block {
-    final core::Set<core::int*>* #t373 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t369 = col::LinkedHashSet::•<core::int*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t373.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:225:62: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+        #t369.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:225:62: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
   <int>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) ...map else 42, null};
                                                              ^");
       else
-        #t373.{core::Set::add}(42);
-    #t373.{core::Set::add}(null);
-  } =>#t373;
+        #t369.{core::Set::add}{Invariant}(42);
+    #t369.{core::Set::add}{Invariant}(null);
+  } =>#t369;
   <core::String*, core::int*>{invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:226:70: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
  - 'List' is from 'dart:core'.
   <String, int>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) ...list else \"bar\": 42, \"baz\": null};
@@ -1968,28 +1988,28 @@
   <String, int>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) ...list else \"bar\": 42, \"baz\": null};
                                                                      ^": null};
   block {
-    final core::List<core::int*>* #t374 = <core::int*>[];
+    final core::List<core::int*>* #t370 = <core::int*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t374.{core::List::add}(42);
+        #t370.{core::List::add}{Invariant}(42);
       else
-        #t374.{core::List::add}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:227:70: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+        #t370.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:227:70: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
   <int>[for (int i = 0; oracle(\"foo\"); i++) if (oracle()) 42 else ...map];
                                                                      ^");
-  } =>#t374;
+  } =>#t370;
   block {
-    final core::Set<core::int*>* #t375 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t371 = col::LinkedHashSet::•<core::int*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t375.{core::Set::add}(42);
+        #t371.{core::Set::add}{Invariant}(42);
       else
-        #t375.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:228:70: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+        #t371.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:228:70: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
   <int>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) 42 else ...map, null};
                                                                      ^");
-    #t375.{core::Set::add}(null);
-  } =>#t375;
+    #t371.{core::Set::add}{Invariant}(null);
+  } =>#t371;
   <core::String*, core::int*>{invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:229:85: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
  - 'List' is from 'dart:core'.
   <String, int>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) \"bar\": 42 else ...list, \"baz\": null};
@@ -1999,218 +2019,218 @@
                                                                                     ^": null};
   final core::int* i = 0;
   block {
-    final core::List<core::int*>* #t376 = <core::int*>[];
-    for (final core::int* #t377 in <core::int*>[1]) {
+    final core::List<core::int*>* #t372 = <core::int*>[];
+    for (final core::int* #t373 in <core::int*>[1]) {
       invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:232:14: Error: Can't assign to the final variable 'i'.
   <int>[for (i in <int>[1]) i];
              ^";
-      #t376.{core::List::add}(i);
+      #t372.{core::List::add}{Invariant}(i);
     }
-  } =>#t376;
+  } =>#t372;
   block {
-    final core::Set<core::int*>* #t378 = col::LinkedHashSet::•<core::int*>();
-    for (final core::int* #t379 in <core::int*>[1]) {
+    final core::Set<core::int*>* #t374 = col::LinkedHashSet::•<core::int*>();
+    for (final core::int* #t375 in <core::int*>[1]) {
       invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:233:14: Error: Can't assign to the final variable 'i'.
   <int>{for (i in <int>[1]) i, null};
              ^";
-      #t378.{core::Set::add}(i);
+      #t374.{core::Set::add}{Invariant}(i);
     }
-    #t378.{core::Set::add}(null);
-  } =>#t378;
+    #t374.{core::Set::add}{Invariant}(null);
+  } =>#t374;
   block {
-    final core::Map<core::String*, core::int*>* #t380 = <core::String*, core::int*>{};
-    for (final core::int* #t381 in <core::int*>[1]) {
+    final core::Map<core::String*, core::int*>* #t376 = <core::String*, core::int*>{};
+    for (final core::int* #t377 in <core::int*>[1]) {
       invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:234:21: Error: Can't assign to the final variable 'i'.
 \t<String, int>{for (i in <int>[1]) \"bar\": i, \"baz\": null};
 \t                   ^";
-      #t380.{core::Map::[]=}("bar", i);
+      #t376.{core::Map::[]=}{Invariant}("bar", i);
     }
-    #t380.{core::Map::[]=}("baz", null);
-  } =>#t380;
+    #t376.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t376;
   core::List<dynamic>* list10 = block {
-    final core::List<dynamic>* #t382 = <dynamic>[];
-    for (dynamic i in let final<BottomType> #t383 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:236:31: Error: The type 'String' used in the 'for' loop must implement 'Iterable<dynamic>'.
+    final core::List<dynamic>* #t378 = <dynamic>[];
+    for (dynamic i in let final<BottomType> #t379 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:236:31: Error: The type 'String' used in the 'for' loop must implement 'Iterable<dynamic>'.
  - 'Iterable' is from 'dart:core'.
   var list10 = [for (var i in \"not iterable\") i];
                               ^" in "not iterable" as{TypeError} core::Iterable<dynamic>*)
-      #t382.{core::List::add}(i);
-  } =>#t382;
+      #t378.{core::List::add}{Invariant}(i);
+  } =>#t378;
   core::Set<dynamic>* set10 = block {
-    final core::Set<dynamic>* #t384 = col::LinkedHashSet::•<dynamic>();
-    for (dynamic i in let final<BottomType> #t385 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:237:30: Error: The type 'String' used in the 'for' loop must implement 'Iterable<dynamic>'.
+    final core::Set<dynamic>* #t380 = col::LinkedHashSet::•<dynamic>();
+    for (dynamic i in let final<BottomType> #t381 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:237:30: Error: The type 'String' used in the 'for' loop must implement 'Iterable<dynamic>'.
  - 'Iterable' is from 'dart:core'.
   var set10 = {for (var i in \"not iterable\") i, null};
                              ^" in "not iterable" as{TypeError} core::Iterable<dynamic>*)
-      #t384.{core::Set::add}(i);
-    #t384.{core::Set::add}(null);
-  } =>#t384;
+      #t380.{core::Set::add}{Invariant}(i);
+    #t380.{core::Set::add}{Invariant}(null);
+  } =>#t380;
   core::Map<core::String*, dynamic>* map10 = block {
-    final core::Map<core::String*, dynamic>* #t386 = <core::String*, dynamic>{};
-    for (dynamic i in let final<BottomType> #t387 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:238:30: Error: The type 'String' used in the 'for' loop must implement 'Iterable<dynamic>'.
+    final core::Map<core::String*, dynamic>* #t382 = <core::String*, dynamic>{};
+    for (dynamic i in let final<BottomType> #t383 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:238:30: Error: The type 'String' used in the 'for' loop must implement 'Iterable<dynamic>'.
  - 'Iterable' is from 'dart:core'.
   var map10 = {for (var i in \"not iterable\") \"bar\": i, \"baz\": null};
                              ^" in "not iterable" as{TypeError} core::Iterable<dynamic>*)
-      #t386.{core::Map::[]=}("bar", i);
-    #t386.{core::Map::[]=}("baz", null);
-  } =>#t386;
+      #t382.{core::Map::[]=}{Invariant}("bar", i);
+    #t382.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t382;
   core::List<core::int*>* list20 = block {
-    final core::List<core::int*>* #t388 = <core::int*>[];
-    for (core::int* i in <core::int*>[let final<BottomType> #t389 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:239:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+    final core::List<core::int*>* #t384 = <core::int*>[];
+    for (core::int* i in <core::int*>[let final<BottomType> #t385 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:239:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   var list20 = [for (int i in [\"not\", \"int\"]) i];
-                               ^" in "not" as{TypeError} core::int*, let final<BottomType> #t390 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:239:39: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+                               ^" in "not" as{TypeError} core::int*, let final<BottomType> #t386 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:239:39: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   var list20 = [for (int i in [\"not\", \"int\"]) i];
                                       ^" in "int" as{TypeError} core::int*])
-      #t388.{core::List::add}(i);
-  } =>#t388;
+      #t384.{core::List::add}{Invariant}(i);
+  } =>#t384;
   core::Set<core::int*>* set20 = block {
-    final core::Set<core::int*>* #t391 = col::LinkedHashSet::•<core::int*>();
-    for (core::int* i in <core::int*>[let final<BottomType> #t392 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:240:31: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+    final core::Set<core::int*>* #t387 = col::LinkedHashSet::•<core::int*>();
+    for (core::int* i in <core::int*>[let final<BottomType> #t388 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:240:31: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   var set20 = {for (int i in [\"not\", \"int\"]) i, null};
-                              ^" in "not" as{TypeError} core::int*, let final<BottomType> #t393 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:240:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+                              ^" in "not" as{TypeError} core::int*, let final<BottomType> #t389 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:240:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   var set20 = {for (int i in [\"not\", \"int\"]) i, null};
                                      ^" in "int" as{TypeError} core::int*])
-      #t391.{core::Set::add}(i);
-    #t391.{core::Set::add}(null);
-  } =>#t391;
+      #t387.{core::Set::add}{Invariant}(i);
+    #t387.{core::Set::add}{Invariant}(null);
+  } =>#t387;
   core::Map<core::String*, core::int*>* map20 = block {
-    final core::Map<core::String*, core::int*>* #t394 = <core::String*, core::int*>{};
-    for (core::int* i in <core::int*>[let final<BottomType> #t395 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:241:31: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+    final core::Map<core::String*, core::int*>* #t390 = <core::String*, core::int*>{};
+    for (core::int* i in <core::int*>[let final<BottomType> #t391 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:241:31: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   var map20 = {for (int i in [\"not\", \"int\"]) \"bar\": i, \"baz\": null};
-                              ^" in "not" as{TypeError} core::int*, let final<BottomType> #t396 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:241:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+                              ^" in "not" as{TypeError} core::int*, let final<BottomType> #t392 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:241:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   var map20 = {for (int i in [\"not\", \"int\"]) \"bar\": i, \"baz\": null};
                                      ^" in "int" as{TypeError} core::int*])
-      #t394.{core::Map::[]=}("bar", i);
-    #t394.{core::Map::[]=}("baz", null);
-  } =>#t394;
+      #t390.{core::Map::[]=}{Invariant}("bar", i);
+    #t390.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t390;
   core::List<dynamic>* list30 = block {
-    final core::List<dynamic>* #t397 = <dynamic>[];
-    await for (dynamic i in let final<BottomType> #t398 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:242:37: Error: The type 'String' used in the 'for' loop must implement 'Stream<dynamic>'.
+    final core::List<dynamic>* #t393 = <dynamic>[];
+    await for (dynamic i in let final<BottomType> #t394 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:242:37: Error: The type 'String' used in the 'for' loop must implement 'Stream<dynamic>'.
  - 'Stream' is from 'dart:async'.
   var list30 = [await for (var i in \"not stream\") i];
                                     ^" in "not stream" as{TypeError} asy::Stream<dynamic>*)
-      #t397.{core::List::add}(i);
-  } =>#t397;
+      #t393.{core::List::add}{Invariant}(i);
+  } =>#t393;
   core::Set<dynamic>* set30 = block {
-    final core::Set<dynamic>* #t399 = col::LinkedHashSet::•<dynamic>();
-    await for (dynamic i in let final<BottomType> #t400 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:243:36: Error: The type 'String' used in the 'for' loop must implement 'Stream<dynamic>'.
+    final core::Set<dynamic>* #t395 = col::LinkedHashSet::•<dynamic>();
+    await for (dynamic i in let final<BottomType> #t396 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:243:36: Error: The type 'String' used in the 'for' loop must implement 'Stream<dynamic>'.
  - 'Stream' is from 'dart:async'.
   var set30 = {await for (var i in \"not stream\") i, null};
                                    ^" in "not stream" as{TypeError} asy::Stream<dynamic>*)
-      #t399.{core::Set::add}(i);
-    #t399.{core::Set::add}(null);
-  } =>#t399;
+      #t395.{core::Set::add}{Invariant}(i);
+    #t395.{core::Set::add}{Invariant}(null);
+  } =>#t395;
   core::Map<core::String*, dynamic>* map30 = block {
-    final core::Map<core::String*, dynamic>* #t401 = <core::String*, dynamic>{};
-    await for (dynamic i in let final<BottomType> #t402 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:244:36: Error: The type 'String' used in the 'for' loop must implement 'Stream<dynamic>'.
+    final core::Map<core::String*, dynamic>* #t397 = <core::String*, dynamic>{};
+    await for (dynamic i in let final<BottomType> #t398 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:244:36: Error: The type 'String' used in the 'for' loop must implement 'Stream<dynamic>'.
  - 'Stream' is from 'dart:async'.
   var map30 = {await for (var i in \"not stream\") \"bar\": i, \"baz\": null};
                                    ^" in "not stream" as{TypeError} asy::Stream<dynamic>*)
-      #t401.{core::Map::[]=}("bar", i);
-    #t401.{core::Map::[]=}("baz", null);
-  } =>#t401;
+      #t397.{core::Map::[]=}{Invariant}("bar", i);
+    #t397.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t397;
   core::List<core::int*>* list40 = block {
-    final core::List<core::int*>* #t403 = <core::int*>[];
-    await for (core::int* i in asy::Stream::fromIterable<core::int*>(<core::int*>[let final<BottomType> #t404 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:245:58: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+    final core::List<core::int*>* #t399 = <core::int*>[];
+    await for (core::int* i in asy::Stream::fromIterable<core::int*>(<core::int*>[let final<BottomType> #t400 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:245:58: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   var list40 = [await for (int i in Stream.fromIterable([\"not\", \"int\"])) i];
-                                                         ^" in "not" as{TypeError} core::int*, let final<BottomType> #t405 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:245:65: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+                                                         ^" in "not" as{TypeError} core::int*, let final<BottomType> #t401 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:245:65: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   var list40 = [await for (int i in Stream.fromIterable([\"not\", \"int\"])) i];
                                                                 ^" in "int" as{TypeError} core::int*]))
-      #t403.{core::List::add}(i);
-  } =>#t403;
+      #t399.{core::List::add}{Invariant}(i);
+  } =>#t399;
   core::Set<core::int*>* set40 = block {
-    final core::Set<core::int*>* #t406 = col::LinkedHashSet::•<core::int*>();
-    await for (core::int* i in asy::Stream::fromIterable<core::int*>(<core::int*>[let final<BottomType> #t407 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:246:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+    final core::Set<core::int*>* #t402 = col::LinkedHashSet::•<core::int*>();
+    await for (core::int* i in asy::Stream::fromIterable<core::int*>(<core::int*>[let final<BottomType> #t403 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:246:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   var set40 = {await for (int i in Stream.fromIterable([\"not\", \"int\"])) i, null};
-                                                        ^" in "not" as{TypeError} core::int*, let final<BottomType> #t408 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:246:64: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+                                                        ^" in "not" as{TypeError} core::int*, let final<BottomType> #t404 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:246:64: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   var set40 = {await for (int i in Stream.fromIterable([\"not\", \"int\"])) i, null};
                                                                ^" in "int" as{TypeError} core::int*]))
-      #t406.{core::Set::add}(i);
-    #t406.{core::Set::add}(null);
-  } =>#t406;
+      #t402.{core::Set::add}{Invariant}(i);
+    #t402.{core::Set::add}{Invariant}(null);
+  } =>#t402;
   core::Map<core::String*, core::int*>* map40 = block {
-    final core::Map<core::String*, core::int*>* #t409 = <core::String*, core::int*>{};
-    await for (core::int* i in asy::Stream::fromIterable<core::int*>(<core::int*>[let final<BottomType> #t410 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:247:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+    final core::Map<core::String*, core::int*>* #t405 = <core::String*, core::int*>{};
+    await for (core::int* i in asy::Stream::fromIterable<core::int*>(<core::int*>[let final<BottomType> #t406 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:247:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   var map40 = {await for (int i in Stream.fromIterable([\"not\", \"int\"])) \"bar\": i, \"baz\": null};
-                                                        ^" in "not" as{TypeError} core::int*, let final<BottomType> #t411 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:247:64: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+                                                        ^" in "not" as{TypeError} core::int*, let final<BottomType> #t407 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:247:64: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   var map40 = {await for (int i in Stream.fromIterable([\"not\", \"int\"])) \"bar\": i, \"baz\": null};
                                                                ^" in "int" as{TypeError} core::int*]))
-      #t409.{core::Map::[]=}("bar", i);
-    #t409.{core::Map::[]=}("baz", null);
-  } =>#t409;
+      #t405.{core::Map::[]=}{Invariant}("bar", i);
+    #t405.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t405;
   core::List<core::int*>* list50 = block {
-    final core::List<core::int*>* #t412 = <core::int*>[];
+    final core::List<core::int*>* #t408 = <core::int*>[];
     for (; ; )
-      #t412.{core::List::add}(42);
-  } =>#t412;
+      #t408.{core::List::add}{Invariant}(42);
+  } =>#t408;
   core::Set<core::int*>* set50 = block {
-    final core::Set<core::int*>* #t413 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t409 = col::LinkedHashSet::•<core::int*>();
     for (; ; )
-      #t413.{core::Set::add}(42);
-    #t413.{core::Set::add}(null);
-  } =>#t413;
+      #t409.{core::Set::add}{Invariant}(42);
+    #t409.{core::Set::add}{Invariant}(null);
+  } =>#t409;
   core::Map<core::String*, core::int*>* map50 = block {
-    final core::Map<core::String*, core::int*>* #t414 = <core::String*, core::int*>{};
+    final core::Map<core::String*, core::int*>* #t410 = <core::String*, core::int*>{};
     for (; ; )
-      #t414.{core::Map::[]=}("bar", 42);
-    #t414.{core::Map::[]=}("baz", null);
-  } =>#t414;
+      #t410.{core::Map::[]=}{Invariant}("bar", 42);
+    #t410.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t410;
   core::List<core::int*>* list60 = block {
-    final core::List<core::int*>* #t415 = <core::int*>[];
-    for (; let final<BottomType> #t416 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:251:24: Error: A value of type 'String' can't be assigned to a variable of type 'bool'.
+    final core::List<core::int*>* #t411 = <core::int*>[];
+    for (; let final<BottomType> #t412 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:251:24: Error: A value of type 'String' can't be assigned to a variable of type 'bool'.
   var list60 = [for (; \"not bool\";) 42];
                        ^" in "not bool" as{TypeError} core::bool*; )
-      #t415.{core::List::add}(42);
-  } =>#t415;
+      #t411.{core::List::add}{Invariant}(42);
+  } =>#t411;
   core::Set<core::int*>* set60 = block {
-    final core::Set<core::int*>* #t417 = col::LinkedHashSet::•<core::int*>();
-    for (; let final<BottomType> #t418 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:252:23: Error: A value of type 'String' can't be assigned to a variable of type 'bool'.
+    final core::Set<core::int*>* #t413 = col::LinkedHashSet::•<core::int*>();
+    for (; let final<BottomType> #t414 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:252:23: Error: A value of type 'String' can't be assigned to a variable of type 'bool'.
   var set60 = {for (; \"not bool\";) 42, null};
                       ^" in "not bool" as{TypeError} core::bool*; )
-      #t417.{core::Set::add}(42);
-    #t417.{core::Set::add}(null);
-  } =>#t417;
+      #t413.{core::Set::add}{Invariant}(42);
+    #t413.{core::Set::add}{Invariant}(null);
+  } =>#t413;
   core::Map<core::String*, core::int*>* map60 = block {
-    final core::Map<core::String*, core::int*>* #t419 = <core::String*, core::int*>{};
-    for (; let final<BottomType> #t420 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:253:23: Error: A value of type 'String' can't be assigned to a variable of type 'bool'.
+    final core::Map<core::String*, core::int*>* #t415 = <core::String*, core::int*>{};
+    for (; let final<BottomType> #t416 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:253:23: Error: A value of type 'String' can't be assigned to a variable of type 'bool'.
   var map60 = {for (; \"not bool\";) \"bar\": 42, \"baz\": null};
                       ^" in "not bool" as{TypeError} core::bool*; )
-      #t419.{core::Map::[]=}("bar", 42);
-    #t419.{core::Map::[]=}("baz", null);
-  } =>#t419;
+      #t415.{core::Map::[]=}{Invariant}("bar", 42);
+    #t415.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t415;
 }
 static method testForElementErrorsNotAsync(asy::Stream<core::int*>* stream) → dynamic {
   block {
-    final core::List<core::int*>* #t421 = <core::int*>[];
+    final core::List<core::int*>* #t417 = <core::int*>[];
     await for (core::int* i in stream)
-      #t421.{core::List::add}(i);
-  } =>#t421;
+      #t417.{core::List::add}{Invariant}(i);
+  } =>#t417;
   block {
-    final core::Set<core::int*>* #t422 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t418 = col::LinkedHashSet::•<core::int*>();
     await for (core::int* i in stream)
-      #t422.{core::Set::add}(i);
-  } =>#t422;
+      #t418.{core::Set::add}{Invariant}(i);
+  } =>#t418;
   block {
-    final core::Map<core::String*, core::int*>* #t423 = <core::String*, core::int*>{};
+    final core::Map<core::String*, core::int*>* #t419 = <core::String*, core::int*>{};
     await for (core::int* i in stream)
-      #t423.{core::Map::[]=}("bar", i);
-  } =>#t423;
+      #t419.{core::Map::[]=}{Invariant}("bar", i);
+  } =>#t419;
 }
 static method testPromotion(self::A* a) → dynamic {
   core::List<core::int*>* list10 = block {
-    final core::List<core::int*>* #t424 = <core::int*>[];
+    final core::List<core::int*>* #t420 = <core::int*>[];
     if(a is self::B*)
-      #t424.{core::List::add}(a{self::B*}.{self::B::foo});
-  } =>#t424;
+      #t420.{core::List::add}{Invariant}(a{self::B*}.{self::B::foo});
+  } =>#t420;
   core::Set<core::int*>* set10 = block {
-    final core::Set<core::int*>* #t425 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t421 = col::LinkedHashSet::•<core::int*>();
     if(a is self::B*)
-      #t425.{core::Set::add}(a{self::B*}.{self::B::foo});
-  } =>#t425;
+      #t421.{core::Set::add}{Invariant}(a{self::B*}.{self::B::foo});
+  } =>#t421;
   core::Map<core::int*, core::int*>* map10 = block {
-    final core::Map<core::int*, core::int*>* #t426 = <core::int*, core::int*>{};
+    final core::Map<core::int*, core::int*>* #t422 = <core::int*, core::int*>{};
     if(a is self::B*)
-      #t426.{core::Map::[]=}(a{self::B*}.{self::B::foo}, a{self::B*}.{self::B::foo});
-  } =>#t426;
+      #t422.{core::Map::[]=}{Invariant}(a{self::B*}.{self::B::foo}, a{self::B*}.{self::B::foo});
+  } =>#t422;
 }
 static method main() → dynamic {}
 
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart.weak.transformed.expect
index 6d5e239..b843b32 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart.weak.transformed.expect
@@ -455,53 +455,53 @@
   core::List<core::int*>* list10 = block {
     final core::List<core::int*>* #t1 = <core::int*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t1.{core::List::add}(42);
+      #t1.{core::List::add}{Invariant}(42);
   } =>#t1;
   core::Set<core::int*>* set10 = block {
     final core::Set<core::int*>* #t2 = new col::_CompactLinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t2.{core::Set::add}(42);
-    #t2.{core::Set::add}(null);
+      #t2.{core::Set::add}{Invariant}(42);
+    #t2.{core::Set::add}{Invariant}(null);
   } =>#t2;
   core::Map<core::String*, core::int*>* map10 = block {
     final core::Map<core::String*, core::int*>* #t3 = <core::String*, core::int*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t3.{core::Map::[]=}("bar", 42);
-    #t3.{core::Map::[]=}("baz", null);
+      #t3.{core::Map::[]=}{Invariant}("bar", 42);
+    #t3.{core::Map::[]=}{Invariant}("baz", null);
   } =>#t3;
   core::List<dynamic>* list11 = block {
     final core::List<dynamic>* #t4 = <dynamic>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t4.{core::List::add}(dynVar);
+      #t4.{core::List::add}{Invariant}(dynVar);
   } =>#t4;
   core::Set<dynamic>* set11 = block {
     final core::Set<dynamic>* #t5 = new col::_CompactLinkedHashSet::•<dynamic>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t5.{core::Set::add}(dynVar);
-    #t5.{core::Set::add}(null);
+      #t5.{core::Set::add}{Invariant}(dynVar);
+    #t5.{core::Set::add}{Invariant}(null);
   } =>#t5;
   core::Map<core::String*, dynamic>* map11 = block {
     final core::Map<core::String*, dynamic>* #t6 = <core::String*, dynamic>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t6.{core::Map::[]=}("bar", dynVar);
-    #t6.{core::Map::[]=}("baz", null);
+      #t6.{core::Map::[]=}{Invariant}("bar", dynVar);
+    #t6.{core::Map::[]=}{Invariant}("baz", null);
   } =>#t6;
   core::List<core::List<core::int*>*>* list12 = block {
     final core::List<core::List<core::int*>*>* #t7 = <core::List<core::int*>*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t7.{core::List::add}(<core::int*>[42]);
+      #t7.{core::List::add}{Invariant}(<core::int*>[42]);
   } =>#t7;
   core::Set<core::List<core::int*>*>* set12 = block {
     final core::Set<core::List<core::int*>*>* #t8 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t8.{core::Set::add}(<core::int*>[42]);
-    #t8.{core::Set::add}(null);
+      #t8.{core::Set::add}{Invariant}(<core::int*>[42]);
+    #t8.{core::Set::add}{Invariant}(null);
   } =>#t8;
   core::Map<core::String*, core::List<core::int*>*>* map12 = block {
     final core::Map<core::String*, core::List<core::int*>*>* #t9 = <core::String*, core::List<core::int*>*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t9.{core::Map::[]=}("bar", <core::int*>[42]);
-    #t9.{core::Map::[]=}("baz", null);
+      #t9.{core::Map::[]=}{Invariant}("bar", <core::int*>[42]);
+    #t9.{core::Map::[]=}{Invariant}("baz", null);
   } =>#t9;
   core::List<core::int*>* list20 = block {
     final core::List<core::int*>* #t10 = <core::int*>[];
@@ -509,7 +509,7 @@
       core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[42].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::int* #t11 = :sync-for-iterator.{core::Iterator::current};
-        #t10.{core::List::add}(#t11);
+        #t10.{core::List::add}{Invariant}(#t11);
       }
     }
   } =>#t10;
@@ -519,10 +519,10 @@
       core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[42].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::int* #t13 = :sync-for-iterator.{core::Iterator::current};
-        #t12.{core::Set::add}(#t13);
+        #t12.{core::Set::add}{Invariant}(#t13);
       }
     }
-    #t12.{core::Set::add}(null);
+    #t12.{core::Set::add}{Invariant}(null);
   } =>#t12;
   core::Map<core::String*, core::int*>* map20 = block {
     final core::Map<core::String*, core::int*>* #t14 = <core::String*, core::int*>{};
@@ -530,10 +530,10 @@
       core::Iterator<core::MapEntry<core::String*, core::int*>>* :sync-for-iterator = <core::String*, core::int*>{"bar": 42}.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::MapEntry<core::String*, core::int*>* #t15 = :sync-for-iterator.{core::Iterator::current};
-        #t14.{core::Map::[]=}(#t15.{core::MapEntry::key}, #t15.{core::MapEntry::value});
+        #t14.{core::Map::[]=}{Invariant}(#t15.{core::MapEntry::key}, #t15.{core::MapEntry::value});
       }
     }
-    #t14.{core::Map::[]=}("baz", null);
+    #t14.{core::Map::[]=}{Invariant}("baz", null);
   } =>#t14;
   core::List<dynamic>* list21 = block {
     final core::List<dynamic>* #t16 = <dynamic>[];
@@ -541,7 +541,7 @@
       core::Iterator<dynamic>* :sync-for-iterator = <dynamic>[dynVar].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final dynamic #t17 = :sync-for-iterator.{core::Iterator::current};
-        #t16.{core::List::add}(#t17);
+        #t16.{core::List::add}{Invariant}(#t17);
       }
     }
   } =>#t16;
@@ -551,10 +551,10 @@
       core::Iterator<dynamic>* :sync-for-iterator = <dynamic>[dynVar].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final dynamic #t19 = :sync-for-iterator.{core::Iterator::current};
-        #t18.{core::Set::add}(#t19);
+        #t18.{core::Set::add}{Invariant}(#t19);
       }
     }
-    #t18.{core::Set::add}(null);
+    #t18.{core::Set::add}{Invariant}(null);
   } =>#t18;
   core::Map<core::String*, dynamic>* map21 = block {
     final core::Map<core::String*, dynamic>* #t20 = <core::String*, dynamic>{};
@@ -562,10 +562,10 @@
       core::Iterator<core::MapEntry<core::String*, dynamic>>* :sync-for-iterator = <core::String*, dynamic>{"bar": dynVar}.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::MapEntry<core::String*, dynamic>* #t21 = :sync-for-iterator.{core::Iterator::current};
-        #t20.{core::Map::[]=}(#t21.{core::MapEntry::key}, #t21.{core::MapEntry::value});
+        #t20.{core::Map::[]=}{Invariant}(#t21.{core::MapEntry::key}, #t21.{core::MapEntry::value});
       }
     }
-    #t20.{core::Map::[]=}("baz", null);
+    #t20.{core::Map::[]=}{Invariant}("baz", null);
   } =>#t20;
   core::List<core::List<core::int*>*>* list22 = block {
     final core::List<core::List<core::int*>*>* #t22 = <core::List<core::int*>*>[];
@@ -573,7 +573,7 @@
       core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[42]].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::List<core::int*>* #t23 = :sync-for-iterator.{core::Iterator::current};
-        #t22.{core::List::add}(#t23);
+        #t22.{core::List::add}{Invariant}(#t23);
       }
     }
   } =>#t22;
@@ -583,10 +583,10 @@
       core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[42]].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::List<core::int*>* #t25 = :sync-for-iterator.{core::Iterator::current};
-        #t24.{core::Set::add}(#t25);
+        #t24.{core::Set::add}{Invariant}(#t25);
       }
     }
-    #t24.{core::Set::add}(null);
+    #t24.{core::Set::add}{Invariant}(null);
   } =>#t24;
   core::Map<core::String*, core::List<core::int*>*>* map22 = block {
     final core::Map<core::String*, core::List<core::int*>*>* #t26 = <core::String*, core::List<core::int*>*>{};
@@ -594,10 +594,10 @@
       core::Iterator<core::MapEntry<core::String*, core::List<core::int*>*>>* :sync-for-iterator = <core::String*, core::List<core::int*>*>{"bar": <core::int*>[42]}.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::MapEntry<core::String*, core::List<core::int*>*>* #t27 = :sync-for-iterator.{core::Iterator::current};
-        #t26.{core::Map::[]=}(#t27.{core::MapEntry::key}, #t27.{core::MapEntry::value});
+        #t26.{core::Map::[]=}{Invariant}(#t27.{core::MapEntry::key}, #t27.{core::MapEntry::value});
       }
     }
-    #t26.{core::Map::[]=}("baz", null);
+    #t26.{core::Map::[]=}{Invariant}("baz", null);
   } =>#t26;
   core::List<core::int*>* list30 = block {
     final core::List<core::int*>* #t28 = <core::int*>[];
@@ -606,7 +606,7 @@
         core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[42].{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
           final core::int* #t29 = :sync-for-iterator.{core::Iterator::current};
-          #t28.{core::List::add}(#t29);
+          #t28.{core::List::add}{Invariant}(#t29);
         }
       }
   } =>#t28;
@@ -617,10 +617,10 @@
         core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[42].{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
           final core::int* #t31 = :sync-for-iterator.{core::Iterator::current};
-          #t30.{core::Set::add}(#t31);
+          #t30.{core::Set::add}{Invariant}(#t31);
         }
       }
-    #t30.{core::Set::add}(null);
+    #t30.{core::Set::add}{Invariant}(null);
   } =>#t30;
   core::Map<core::String*, core::int*>* map30 = block {
     final core::Map<core::String*, core::int*>* #t32 = <core::String*, core::int*>{};
@@ -629,10 +629,10 @@
         core::Iterator<core::MapEntry<core::String*, core::int*>>* :sync-for-iterator = <core::String*, core::int*>{"bar": 42}.{core::Map::entries}.{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
           final core::MapEntry<core::String*, core::int*>* #t33 = :sync-for-iterator.{core::Iterator::current};
-          #t32.{core::Map::[]=}(#t33.{core::MapEntry::key}, #t33.{core::MapEntry::value});
+          #t32.{core::Map::[]=}{Invariant}(#t33.{core::MapEntry::key}, #t33.{core::MapEntry::value});
         }
       }
-    #t32.{core::Map::[]=}("baz", null);
+    #t32.{core::Map::[]=}{Invariant}("baz", null);
   } =>#t32;
   core::List<dynamic>* list31 = block {
     final core::List<dynamic>* #t34 = <dynamic>[];
@@ -641,7 +641,7 @@
         core::Iterator<dynamic>* :sync-for-iterator = <dynamic>[dynVar].{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
           final dynamic #t35 = :sync-for-iterator.{core::Iterator::current};
-          #t34.{core::List::add}(#t35);
+          #t34.{core::List::add}{Invariant}(#t35);
         }
       }
   } =>#t34;
@@ -652,10 +652,10 @@
         core::Iterator<dynamic>* :sync-for-iterator = <dynamic>[dynVar].{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
           final dynamic #t37 = :sync-for-iterator.{core::Iterator::current};
-          #t36.{core::Set::add}(#t37);
+          #t36.{core::Set::add}{Invariant}(#t37);
         }
       }
-    #t36.{core::Set::add}(null);
+    #t36.{core::Set::add}{Invariant}(null);
   } =>#t36;
   core::Map<core::String*, dynamic>* map31 = block {
     final core::Map<core::String*, dynamic>* #t38 = <core::String*, dynamic>{};
@@ -664,10 +664,10 @@
         core::Iterator<core::MapEntry<core::String*, dynamic>>* :sync-for-iterator = <core::String*, dynamic>{"bar": dynVar}.{core::Map::entries}.{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
           final core::MapEntry<core::String*, dynamic>* #t39 = :sync-for-iterator.{core::Iterator::current};
-          #t38.{core::Map::[]=}(#t39.{core::MapEntry::key}, #t39.{core::MapEntry::value});
+          #t38.{core::Map::[]=}{Invariant}(#t39.{core::MapEntry::key}, #t39.{core::MapEntry::value});
         }
       }
-    #t38.{core::Map::[]=}("baz", null);
+    #t38.{core::Map::[]=}{Invariant}("baz", null);
   } =>#t38;
   core::List<core::List<core::int*>*>* list33 = block {
     final core::List<core::List<core::int*>*>* #t40 = <core::List<core::int*>*>[];
@@ -676,7 +676,7 @@
         core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[42]].{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
           final core::List<core::int*>* #t41 = :sync-for-iterator.{core::Iterator::current};
-          #t40.{core::List::add}(#t41);
+          #t40.{core::List::add}{Invariant}(#t41);
         }
       }
   } =>#t40;
@@ -687,10 +687,10 @@
         core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[42]].{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
           final core::List<core::int*>* #t43 = :sync-for-iterator.{core::Iterator::current};
-          #t42.{core::Set::add}(#t43);
+          #t42.{core::Set::add}{Invariant}(#t43);
         }
       }
-    #t42.{core::Set::add}(null);
+    #t42.{core::Set::add}{Invariant}(null);
   } =>#t42;
   core::Map<core::String*, core::List<core::int*>*>* map33 = block {
     final core::Map<core::String*, core::List<core::int*>*>* #t44 = <core::String*, core::List<core::int*>*>{};
@@ -699,10 +699,10 @@
         core::Iterator<core::MapEntry<core::String*, core::List<core::int*>*>>* :sync-for-iterator = <core::String*, core::List<core::int*>*>{"bar": <core::int*>[42]}.{core::Map::entries}.{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
           final core::MapEntry<core::String*, core::List<core::int*>*>* #t45 = :sync-for-iterator.{core::Iterator::current};
-          #t44.{core::Map::[]=}(#t45.{core::MapEntry::key}, #t45.{core::MapEntry::value});
+          #t44.{core::Map::[]=}{Invariant}(#t45.{core::MapEntry::key}, #t45.{core::MapEntry::value});
         }
       }
-    #t44.{core::Map::[]=}("baz", null);
+    #t44.{core::Map::[]=}{Invariant}("baz", null);
   } =>#t44;
   core::List<core::List<core::int*>*>* list40 = block {
     final core::List<core::List<core::int*>*>* #t46 = <core::List<core::int*>*>[];
@@ -710,7 +710,7 @@
       core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::List<core::int*>* #t47 = :sync-for-iterator.{core::Iterator::current};
-        #t46.{core::List::add}(#t47);
+        #t46.{core::List::add}{Invariant}(#t47);
       }
     }
   } =>#t46;
@@ -720,10 +720,10 @@
       core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::List<core::int*>* #t49 = :sync-for-iterator.{core::Iterator::current};
-        #t48.{core::Set::add}(#t49);
+        #t48.{core::Set::add}{Invariant}(#t49);
       }
     }
-    #t48.{core::Set::add}(null);
+    #t48.{core::Set::add}{Invariant}(null);
   } =>#t48;
   core::Map<core::String*, core::List<core::int*>*>* map40 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:41:34: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
   Map<String, List<int>> map40 = {if (oracle(\"foo\")) ...{\"bar\", []}, \"baz\": null};
@@ -731,557 +731,567 @@
   core::List<core::List<core::int*>*>* list41 = block {
     final core::List<core::List<core::int*>*>* #t50 = <core::List<core::int*>*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
-      core::Iterator<core::List<core::int*>*>* :sync-for-iterator = (let final core::Set<core::List<core::int*>*>* #t51 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>() in let final core::bool #t52 = #t51.{core::Set::add}(<core::int*>[]) in #t51).{core::Iterable::iterator};
+      core::Iterator<core::List<core::int*>*>* :sync-for-iterator = ( block {
+        final core::Set<core::List<core::int*>*>* #t51 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
+        #t51.{core::Set::add}{Invariant}(<core::int*>[]);
+      } =>#t51).{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::List<core::int*>* #t53 = :sync-for-iterator.{core::Iterator::current};
-        #t50.{core::List::add}(#t53);
+        final core::List<core::int*>* #t52 = :sync-for-iterator.{core::Iterator::current};
+        #t50.{core::List::add}{Invariant}(#t52);
       }
     }
   } =>#t50;
   core::Set<core::List<core::int*>*>* set41 = block {
-    final core::Set<core::List<core::int*>*>* #t54 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
+    final core::Set<core::List<core::int*>*>* #t53 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
-      core::Iterator<core::List<core::int*>*>* :sync-for-iterator = (let final core::Set<core::List<core::int*>*>* #t55 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>() in let final core::bool #t56 = #t55.{core::Set::add}(<core::int*>[]) in #t55).{core::Iterable::iterator};
+      core::Iterator<core::List<core::int*>*>* :sync-for-iterator = ( block {
+        final core::Set<core::List<core::int*>*>* #t54 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
+        #t54.{core::Set::add}{Invariant}(<core::int*>[]);
+      } =>#t54).{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::List<core::int*>* #t57 = :sync-for-iterator.{core::Iterator::current};
-        #t54.{core::Set::add}(#t57);
+        final core::List<core::int*>* #t55 = :sync-for-iterator.{core::Iterator::current};
+        #t53.{core::Set::add}{Invariant}(#t55);
       }
     }
-    #t54.{core::Set::add}(null);
-  } =>#t54;
+    #t53.{core::Set::add}{Invariant}(null);
+  } =>#t53;
   core::List<core::List<core::int*>*>* list42 = block {
-    final core::List<core::List<core::int*>*>* #t58 = <core::List<core::int*>*>[];
+    final core::List<core::List<core::int*>*>* #t56 = <core::List<core::int*>*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
+        core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
+        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+          final core::List<core::int*>* #t57 = :sync-for-iterator.{core::Iterator::current};
+          #t56.{core::List::add}{Invariant}(#t57);
+        }
+      }
+  } =>#t56;
+  core::Set<core::List<core::int*>*>* set42 = block {
+    final core::Set<core::List<core::int*>*>* #t58 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
         core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
           final core::List<core::int*>* #t59 = :sync-for-iterator.{core::Iterator::current};
-          #t58.{core::List::add}(#t59);
+          #t58.{core::Set::add}{Invariant}(#t59);
         }
       }
+    #t58.{core::Set::add}{Invariant}(null);
   } =>#t58;
-  core::Set<core::List<core::int*>*>* set42 = block {
-    final core::Set<core::List<core::int*>*>* #t60 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
-    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
-        core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
-        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final core::List<core::int*>* #t61 = :sync-for-iterator.{core::Iterator::current};
-          #t60.{core::Set::add}(#t61);
-        }
-      }
-    #t60.{core::Set::add}(null);
-  } =>#t60;
   core::Map<core::String*, core::List<core::int*>*>* map42 = block {
-    final core::Map<core::String*, core::List<core::int*>*>* #t62 = <core::String*, core::List<core::int*>*>{};
+    final core::Map<core::String*, core::List<core::int*>*>* #t60 = <core::String*, core::List<core::int*>*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
         core::Iterator<core::MapEntry<core::String*, core::List<core::int*>*>>* :sync-for-iterator = <core::String*, core::List<core::int*>*>{"bar": <core::int*>[]}.{core::Map::entries}.{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final core::MapEntry<core::String*, core::List<core::int*>*>* #t63 = :sync-for-iterator.{core::Iterator::current};
-          #t62.{core::Map::[]=}(#t63.{core::MapEntry::key}, #t63.{core::MapEntry::value});
+          final core::MapEntry<core::String*, core::List<core::int*>*>* #t61 = :sync-for-iterator.{core::Iterator::current};
+          #t60.{core::Map::[]=}{Invariant}(#t61.{core::MapEntry::key}, #t61.{core::MapEntry::value});
         }
       }
-    #t62.{core::Map::[]=}("baz", null);
-  } =>#t62;
+    #t60.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t60;
   core::List<core::int*>* list50 = block {
-    final core::List<core::int*>* #t64 = <core::int*>[];
+    final core::List<core::int*>* #t62 = <core::int*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
+      core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[].{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::int* #t63 = :sync-for-iterator.{core::Iterator::current};
+        #t62.{core::List::add}{Invariant}(#t63);
+      }
+    }
+  } =>#t62;
+  core::Set<core::int*>* set50 = block {
+    final core::Set<core::int*>* #t64 = new col::_CompactLinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
       core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::int* #t65 = :sync-for-iterator.{core::Iterator::current};
-        #t64.{core::List::add}(#t65);
+        #t64.{core::Set::add}{Invariant}(#t65);
       }
     }
+    #t64.{core::Set::add}{Invariant}(null);
   } =>#t64;
-  core::Set<core::int*>* set50 = block {
-    final core::Set<core::int*>* #t66 = new col::_CompactLinkedHashSet::•<core::int*>();
-    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
-      core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[].{core::Iterable::iterator};
-      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::int* #t67 = :sync-for-iterator.{core::Iterator::current};
-        #t66.{core::Set::add}(#t67);
-      }
-    }
-    #t66.{core::Set::add}(null);
-  } =>#t66;
   core::Map<core::String*, core::int*>* map50 = block {
-    final core::Map<core::String*, core::int*>* #t68 = <core::String*, core::int*>{};
+    final core::Map<core::String*, core::int*>* #t66 = <core::String*, core::int*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
       core::Iterator<core::MapEntry<core::String*, core::int*>>* :sync-for-iterator = <core::String*, core::int*>{}.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::MapEntry<core::String*, core::int*>* #t69 = :sync-for-iterator.{core::Iterator::current};
-        #t68.{core::Map::[]=}(#t69.{core::MapEntry::key}, #t69.{core::MapEntry::value});
+        final core::MapEntry<core::String*, core::int*>* #t67 = :sync-for-iterator.{core::Iterator::current};
+        #t66.{core::Map::[]=}{Invariant}(#t67.{core::MapEntry::key}, #t67.{core::MapEntry::value});
       }
     }
-    #t68.{core::Map::[]=}("baz", null);
-  } =>#t68;
+    #t66.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t66;
   core::List<core::int*>* list51 = block {
-    final core::List<core::int*>* #t70 = <core::int*>[];
+    final core::List<core::int*>* #t68 = <core::int*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
-      core::Iterator<core::int*>* :sync-for-iterator = (let final core::Set<core::int*>* #t71 = new col::_CompactLinkedHashSet::•<core::int*>() in #t71).{core::Iterable::iterator};
+      core::Iterator<core::int*>* :sync-for-iterator = ( block {
+        final core::Set<core::int*>* #t69 = new col::_CompactLinkedHashSet::•<core::int*>();
+      } =>#t69).{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::int* #t72 = :sync-for-iterator.{core::Iterator::current};
-        #t70.{core::List::add}(#t72);
+        final core::int* #t70 = :sync-for-iterator.{core::Iterator::current};
+        #t68.{core::List::add}{Invariant}(#t70);
       }
     }
-  } =>#t70;
+  } =>#t68;
   core::Set<core::int*>* set51 = block {
-    final core::Set<core::int*>* #t73 = new col::_CompactLinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t71 = new col::_CompactLinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
-      core::Iterator<core::int*>* :sync-for-iterator = (let final core::Set<core::int*>* #t74 = new col::_CompactLinkedHashSet::•<core::int*>() in #t74).{core::Iterable::iterator};
+      core::Iterator<core::int*>* :sync-for-iterator = ( block {
+        final core::Set<core::int*>* #t72 = new col::_CompactLinkedHashSet::•<core::int*>();
+      } =>#t72).{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::int* #t75 = :sync-for-iterator.{core::Iterator::current};
-        #t73.{core::Set::add}(#t75);
+        final core::int* #t73 = :sync-for-iterator.{core::Iterator::current};
+        #t71.{core::Set::add}{Invariant}(#t73);
       }
     }
-    #t73.{core::Set::add}(null);
-  } =>#t73;
+    #t71.{core::Set::add}{Invariant}(null);
+  } =>#t71;
   core::List<core::int*>* list52 = block {
-    final core::List<core::int*>* #t76 = <core::int*>[];
+    final core::List<core::int*>* #t74 = <core::int*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
+        core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[].{core::Iterable::iterator};
+        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+          final core::int* #t75 = :sync-for-iterator.{core::Iterator::current};
+          #t74.{core::List::add}{Invariant}(#t75);
+        }
+      }
+  } =>#t74;
+  core::Set<core::int*>* set52 = block {
+    final core::Set<core::int*>* #t76 = new col::_CompactLinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
         core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[].{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
           final core::int* #t77 = :sync-for-iterator.{core::Iterator::current};
-          #t76.{core::List::add}(#t77);
+          #t76.{core::Set::add}{Invariant}(#t77);
         }
       }
+    #t76.{core::Set::add}{Invariant}(null);
   } =>#t76;
-  core::Set<core::int*>* set52 = block {
-    final core::Set<core::int*>* #t78 = new col::_CompactLinkedHashSet::•<core::int*>();
-    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
-        core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[].{core::Iterable::iterator};
-        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final core::int* #t79 = :sync-for-iterator.{core::Iterator::current};
-          #t78.{core::Set::add}(#t79);
-        }
-      }
-    #t78.{core::Set::add}(null);
-  } =>#t78;
   core::Map<core::String*, core::int*>* map52 = block {
-    final core::Map<core::String*, core::int*>* #t80 = <core::String*, core::int*>{};
+    final core::Map<core::String*, core::int*>* #t78 = <core::String*, core::int*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
         core::Iterator<core::MapEntry<core::String*, core::int*>>* :sync-for-iterator = <core::String*, core::int*>{}.{core::Map::entries}.{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final core::MapEntry<core::String*, core::int*>* #t81 = :sync-for-iterator.{core::Iterator::current};
-          #t80.{core::Map::[]=}(#t81.{core::MapEntry::key}, #t81.{core::MapEntry::value});
+          final core::MapEntry<core::String*, core::int*>* #t79 = :sync-for-iterator.{core::Iterator::current};
+          #t78.{core::Map::[]=}{Invariant}(#t79.{core::MapEntry::key}, #t79.{core::MapEntry::value});
         }
       }
-    #t80.{core::Map::[]=}("baz", null);
-  } =>#t80;
+    #t78.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t78;
   core::List<core::List<core::int*>*>* list60 = block {
-    final core::List<core::List<core::int*>*>* #t82 = <core::List<core::int*>*>[];
+    final core::List<core::List<core::int*>*>* #t80 = <core::List<core::int*>*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
+      core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::List<core::int*>* #t81 = :sync-for-iterator.{core::Iterator::current};
+        #t80.{core::List::add}{Invariant}(#t81);
+      }
+    }
+  } =>#t80;
+  core::Set<core::List<core::int*>*>* set60 = block {
+    final core::Set<core::List<core::int*>*>* #t82 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
       core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::List<core::int*>* #t83 = :sync-for-iterator.{core::Iterator::current};
-        #t82.{core::List::add}(#t83);
+        #t82.{core::Set::add}{Invariant}(#t83);
       }
     }
+    #t82.{core::Set::add}{Invariant}(null);
   } =>#t82;
-  core::Set<core::List<core::int*>*>* set60 = block {
-    final core::Set<core::List<core::int*>*>* #t84 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
-    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
-      core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
-      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::List<core::int*>* #t85 = :sync-for-iterator.{core::Iterator::current};
-        #t84.{core::Set::add}(#t85);
-      }
-    }
-    #t84.{core::Set::add}(null);
-  } =>#t84;
   core::Map<core::String*, core::List<core::int*>*>* map60 = block {
-    final core::Map<core::String*, core::List<core::int*>*>* #t86 = <core::String*, core::List<core::int*>*>{};
+    final core::Map<core::String*, core::List<core::int*>*>* #t84 = <core::String*, core::List<core::int*>*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
       core::Iterator<core::MapEntry<core::String*, core::List<core::int*>*>>* :sync-for-iterator = <core::String*, core::List<core::int*>*>{"bar": <core::int*>[]}.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::MapEntry<core::String*, core::List<core::int*>*>* #t87 = :sync-for-iterator.{core::Iterator::current};
-        #t86.{core::Map::[]=}(#t87.{core::MapEntry::key}, #t87.{core::MapEntry::value});
+        final core::MapEntry<core::String*, core::List<core::int*>*>* #t85 = :sync-for-iterator.{core::Iterator::current};
+        #t84.{core::Map::[]=}{Invariant}(#t85.{core::MapEntry::key}, #t85.{core::MapEntry::value});
       }
     }
-    #t86.{core::Map::[]=}("baz", null);
-  } =>#t86;
+    #t84.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t84;
   core::List<core::List<core::int*>*>* list61 = block {
-    final core::List<core::List<core::int*>*>* #t88 = <core::List<core::int*>*>[];
+    final core::List<core::List<core::int*>*>* #t86 = <core::List<core::int*>*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
+        core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
+        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+          final core::List<core::int*>* #t87 = :sync-for-iterator.{core::Iterator::current};
+          #t86.{core::List::add}{Invariant}(#t87);
+        }
+      }
+  } =>#t86;
+  core::Set<core::List<core::int*>*>* set61 = block {
+    final core::Set<core::List<core::int*>*>* #t88 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
         core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
           final core::List<core::int*>* #t89 = :sync-for-iterator.{core::Iterator::current};
-          #t88.{core::List::add}(#t89);
+          #t88.{core::Set::add}{Invariant}(#t89);
         }
       }
+    #t88.{core::Set::add}{Invariant}(null);
   } =>#t88;
-  core::Set<core::List<core::int*>*>* set61 = block {
-    final core::Set<core::List<core::int*>*>* #t90 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
-    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
-        core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
-        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final core::List<core::int*>* #t91 = :sync-for-iterator.{core::Iterator::current};
-          #t90.{core::Set::add}(#t91);
-        }
-      }
-    #t90.{core::Set::add}(null);
-  } =>#t90;
   core::Map<core::String*, core::List<core::int*>*>* map61 = block {
-    final core::Map<core::String*, core::List<core::int*>*>* #t92 = <core::String*, core::List<core::int*>*>{};
+    final core::Map<core::String*, core::List<core::int*>*>* #t90 = <core::String*, core::List<core::int*>*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
         core::Iterator<core::MapEntry<core::String*, core::List<core::int*>*>>* :sync-for-iterator = <core::String*, core::List<core::int*>*>{"bar": <core::int*>[]}.{core::Map::entries}.{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final core::MapEntry<core::String*, core::List<core::int*>*>* #t93 = :sync-for-iterator.{core::Iterator::current};
-          #t92.{core::Map::[]=}(#t93.{core::MapEntry::key}, #t93.{core::MapEntry::value});
+          final core::MapEntry<core::String*, core::List<core::int*>*>* #t91 = :sync-for-iterator.{core::Iterator::current};
+          #t90.{core::Map::[]=}{Invariant}(#t91.{core::MapEntry::key}, #t91.{core::MapEntry::value});
         }
       }
-    #t92.{core::Map::[]=}("baz", null);
-  } =>#t92;
+    #t90.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t90;
   core::List<core::List<core::int*>*>* list70 = block {
+    final core::List<core::List<core::int*>*>* #t92 = <core::List<core::int*>*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      #t92.{core::List::add}{Invariant}(<core::int*>[]);
+  } =>#t92;
+  core::Set<core::List<core::int*>*>* set70 = block {
+    final core::Set<core::List<core::int*>*>* #t93 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      #t93.{core::Set::add}{Invariant}(<core::int*>[]);
+    #t93.{core::Set::add}{Invariant}(null);
+  } =>#t93;
+  core::List<core::List<core::int*>*>* list71 = block {
     final core::List<core::List<core::int*>*>* #t94 = <core::List<core::int*>*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t94.{core::List::add}(<core::int*>[]);
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
+        #t94.{core::List::add}{Invariant}(<core::int*>[]);
   } =>#t94;
-  core::Set<core::List<core::int*>*>* set70 = block {
+  core::Set<core::List<core::int*>*>* set71 = block {
     final core::Set<core::List<core::int*>*>* #t95 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t95.{core::Set::add}(<core::int*>[]);
-    #t95.{core::Set::add}(null);
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
+        #t95.{core::Set::add}{Invariant}(<core::int*>[]);
+    #t95.{core::Set::add}{Invariant}(null);
   } =>#t95;
-  core::List<core::List<core::int*>*>* list71 = block {
-    final core::List<core::List<core::int*>*>* #t96 = <core::List<core::int*>*>[];
-    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t96.{core::List::add}(<core::int*>[]);
-  } =>#t96;
-  core::Set<core::List<core::int*>*>* set71 = block {
-    final core::Set<core::List<core::int*>*>* #t97 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
-    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t97.{core::Set::add}(<core::int*>[]);
-    #t97.{core::Set::add}(null);
-  } =>#t97;
   core::List<core::num*>* list80 = block {
-    final core::List<core::num*>* #t98 = <core::num*>[];
+    final core::List<core::num*>* #t96 = <core::num*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t98.{core::List::add}(42);
+      #t96.{core::List::add}{Invariant}(42);
     else
-      #t98.{core::List::add}(3.14);
-  } =>#t98;
+      #t96.{core::List::add}{Invariant}(3.14);
+  } =>#t96;
   core::Set<core::num*>* set80 = block {
-    final core::Set<core::num*>* #t99 = new col::_CompactLinkedHashSet::•<core::num*>();
+    final core::Set<core::num*>* #t97 = new col::_CompactLinkedHashSet::•<core::num*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t99.{core::Set::add}(42);
+      #t97.{core::Set::add}{Invariant}(42);
     else
-      #t99.{core::Set::add}(3.14);
-    #t99.{core::Set::add}(null);
-  } =>#t99;
+      #t97.{core::Set::add}{Invariant}(3.14);
+    #t97.{core::Set::add}{Invariant}(null);
+  } =>#t97;
   core::Map<core::String*, core::num*>* map80 = block {
-    final core::Map<core::String*, core::num*>* #t100 = <core::String*, core::num*>{};
+    final core::Map<core::String*, core::num*>* #t98 = <core::String*, core::num*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t100.{core::Map::[]=}("bar", 42);
+      #t98.{core::Map::[]=}{Invariant}("bar", 42);
     else
-      #t100.{core::Map::[]=}("bar", 3.14);
-    #t100.{core::Map::[]=}("baz", null);
-  } =>#t100;
+      #t98.{core::Map::[]=}{Invariant}("bar", 3.14);
+    #t98.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t98;
   core::List<core::num*>* list81 = block {
-    final core::List<core::num*>* #t101 = <core::num*>[];
+    final core::List<core::num*>* #t99 = <core::num*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
       core::Iterator<core::int*>* :sync-for-iterator = listInt.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::num* #t102 = :sync-for-iterator.{core::Iterator::current};
-        #t101.{core::List::add}(#t102);
+        final core::num* #t100 = :sync-for-iterator.{core::Iterator::current};
+        #t99.{core::List::add}{Invariant}(#t100);
       }
     }
     else {
       core::Iterator<core::double*>* :sync-for-iterator = listDouble.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::num* #t101 = :sync-for-iterator.{core::Iterator::current};
+        #t99.{core::List::add}{Invariant}(#t101);
+      }
+    }
+  } =>#t99;
+  core::Set<core::num*>* set81 = block {
+    final core::Set<core::num*>* #t102 = new col::_CompactLinkedHashSet::•<core::num*>();
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
+      core::Iterator<core::int*>* :sync-for-iterator = listInt.{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::num* #t103 = :sync-for-iterator.{core::Iterator::current};
-        #t101.{core::List::add}(#t103);
-      }
-    }
-  } =>#t101;
-  core::Set<core::num*>* set81 = block {
-    final core::Set<core::num*>* #t104 = new col::_CompactLinkedHashSet::•<core::num*>();
-    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
-      core::Iterator<core::int*>* :sync-for-iterator = listInt.{core::Iterable::iterator};
-      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::num* #t105 = :sync-for-iterator.{core::Iterator::current};
-        #t104.{core::Set::add}(#t105);
+        #t102.{core::Set::add}{Invariant}(#t103);
       }
     }
     else {
       core::Iterator<core::double*>* :sync-for-iterator = listDouble.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::num* #t106 = :sync-for-iterator.{core::Iterator::current};
-        #t104.{core::Set::add}(#t106);
+        final core::num* #t104 = :sync-for-iterator.{core::Iterator::current};
+        #t102.{core::Set::add}{Invariant}(#t104);
       }
     }
-    #t104.{core::Set::add}(null);
-  } =>#t104;
+    #t102.{core::Set::add}{Invariant}(null);
+  } =>#t102;
   core::Map<core::String*, core::num*>* map81 = block {
-    final core::Map<core::String*, core::num*>* #t107 = <core::String*, core::num*>{};
+    final core::Map<core::String*, core::num*>* #t105 = <core::String*, core::num*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
       core::Iterator<core::MapEntry<core::String*, core::int*>>* :sync-for-iterator = mapToInt.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::MapEntry<core::String*, core::num*>* #t108 = :sync-for-iterator.{core::Iterator::current};
-        #t107.{core::Map::[]=}(#t108.{core::MapEntry::key}, #t108.{core::MapEntry::value});
+        final core::MapEntry<core::String*, core::num*>* #t106 = :sync-for-iterator.{core::Iterator::current};
+        #t105.{core::Map::[]=}{Invariant}(#t106.{core::MapEntry::key}, #t106.{core::MapEntry::value});
       }
     }
     else {
       core::Iterator<core::MapEntry<core::String*, core::double*>>* :sync-for-iterator = mapToDouble.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::MapEntry<core::String*, core::num*>* #t109 = :sync-for-iterator.{core::Iterator::current};
-        #t107.{core::Map::[]=}(#t109.{core::MapEntry::key}, #t109.{core::MapEntry::value});
+        final core::MapEntry<core::String*, core::num*>* #t107 = :sync-for-iterator.{core::Iterator::current};
+        #t105.{core::Map::[]=}{Invariant}(#t107.{core::MapEntry::key}, #t107.{core::MapEntry::value});
       }
     }
-    #t107.{core::Map::[]=}("baz", null);
-  } =>#t107;
+    #t105.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t105;
   core::List<dynamic>* list82 = block {
-    final core::List<dynamic>* #t110 = <dynamic>[];
+    final core::List<dynamic>* #t108 = <dynamic>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
       core::Iterator<core::int*>* :sync-for-iterator = listInt.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final dynamic #t111 = :sync-for-iterator.{core::Iterator::current};
-        #t110.{core::List::add}(#t111);
+        final dynamic #t109 = :sync-for-iterator.{core::Iterator::current};
+        #t108.{core::List::add}{Invariant}(#t109);
       }
     }
     else {
       core::Iterator<dynamic>* :sync-for-iterator = (dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*).{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final dynamic #t110 = :sync-for-iterator.{core::Iterator::current};
+        #t108.{core::List::add}{Invariant}(#t110);
+      }
+    }
+  } =>#t108;
+  core::Set<dynamic>* set82 = block {
+    final core::Set<dynamic>* #t111 = new col::_CompactLinkedHashSet::•<dynamic>();
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
+      core::Iterator<core::int*>* :sync-for-iterator = listInt.{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final dynamic #t112 = :sync-for-iterator.{core::Iterator::current};
-        #t110.{core::List::add}(#t112);
-      }
-    }
-  } =>#t110;
-  core::Set<dynamic>* set82 = block {
-    final core::Set<dynamic>* #t113 = new col::_CompactLinkedHashSet::•<dynamic>();
-    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
-      core::Iterator<core::int*>* :sync-for-iterator = listInt.{core::Iterable::iterator};
-      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final dynamic #t114 = :sync-for-iterator.{core::Iterator::current};
-        #t113.{core::Set::add}(#t114);
+        #t111.{core::Set::add}{Invariant}(#t112);
       }
     }
     else {
       core::Iterator<dynamic>* :sync-for-iterator = (dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*).{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final dynamic #t115 = :sync-for-iterator.{core::Iterator::current};
-        #t113.{core::Set::add}(#t115);
+        final dynamic #t113 = :sync-for-iterator.{core::Iterator::current};
+        #t111.{core::Set::add}{Invariant}(#t113);
       }
     }
-    #t113.{core::Set::add}(null);
-  } =>#t113;
+    #t111.{core::Set::add}{Invariant}(null);
+  } =>#t111;
   core::Set<dynamic>* map82 = block {
-    final core::Set<dynamic>* #t116 = new col::_CompactLinkedHashSet::•<dynamic>();
+    final core::Set<dynamic>* #t114 = new col::_CompactLinkedHashSet::•<dynamic>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t116.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:73:38: Error: Unexpected type 'Map<String, int>' of a spread.  Expected 'dynamic' or an Iterable.
+      #t114.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:73:38: Error: Unexpected type 'Map<String, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
   var map82 = {if (oracle(\"foo\")) ...mapToInt else ...dynVar, null};
                                      ^");
     else {
       core::Iterator<dynamic>* :sync-for-iterator = (dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*).{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final dynamic #t117 = :sync-for-iterator.{core::Iterator::current};
-        #t116.{core::Set::add}(#t117);
+        final dynamic #t115 = :sync-for-iterator.{core::Iterator::current};
+        #t114.{core::Set::add}{Invariant}(#t115);
       }
     }
-    #t116.{core::Set::add}(null);
-  } =>#t116;
+    #t114.{core::Set::add}{Invariant}(null);
+  } =>#t114;
   core::List<core::num*>* list83 = block {
-    final core::List<core::num*>* #t118 = <core::num*>[];
+    final core::List<core::num*>* #t116 = <core::num*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t118.{core::List::add}(42);
+      #t116.{core::List::add}{Invariant}(42);
     else {
       core::Iterator<core::double*>* :sync-for-iterator = listDouble.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::num* #t119 = :sync-for-iterator.{core::Iterator::current};
-        #t118.{core::List::add}(#t119);
+        final core::num* #t117 = :sync-for-iterator.{core::Iterator::current};
+        #t116.{core::List::add}{Invariant}(#t117);
       }
     }
-  } =>#t118;
+  } =>#t116;
   core::Set<core::num*>* set83 = block {
-    final core::Set<core::num*>* #t120 = new col::_CompactLinkedHashSet::•<core::num*>();
+    final core::Set<core::num*>* #t118 = new col::_CompactLinkedHashSet::•<core::num*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
       core::Iterator<core::int*>* :sync-for-iterator = listInt.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::num* #t121 = :sync-for-iterator.{core::Iterator::current};
-        #t120.{core::Set::add}(#t121);
+        final core::num* #t119 = :sync-for-iterator.{core::Iterator::current};
+        #t118.{core::Set::add}{Invariant}(#t119);
       }
     }
     else
-      #t120.{core::Set::add}(3.14);
-    #t120.{core::Set::add}(null);
-  } =>#t120;
+      #t118.{core::Set::add}{Invariant}(3.14);
+    #t118.{core::Set::add}{Invariant}(null);
+  } =>#t118;
   core::Map<core::String*, core::num*>* map83 = block {
-    final core::Map<core::String*, core::num*>* #t122 = <core::String*, core::num*>{};
+    final core::Map<core::String*, core::num*>* #t120 = <core::String*, core::num*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
       core::Iterator<core::MapEntry<core::String*, core::int*>>* :sync-for-iterator = mapToInt.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::MapEntry<core::String*, core::num*>* #t123 = :sync-for-iterator.{core::Iterator::current};
-        #t122.{core::Map::[]=}(#t123.{core::MapEntry::key}, #t123.{core::MapEntry::value});
+        final core::MapEntry<core::String*, core::num*>* #t121 = :sync-for-iterator.{core::Iterator::current};
+        #t120.{core::Map::[]=}{Invariant}(#t121.{core::MapEntry::key}, #t121.{core::MapEntry::value});
       }
     }
     else
-      #t122.{core::Map::[]=}("bar", 3.14);
-    #t122.{core::Map::[]=}("baz", null);
-  } =>#t122;
+      #t120.{core::Map::[]=}{Invariant}("bar", 3.14);
+    #t120.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t120;
   core::List<core::int*>* list90 = block {
-    final core::List<core::int*>* #t124 = <core::int*>[];
+    final core::List<core::int*>* #t122 = <core::int*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t124.{core::List::add}(dynVar as{TypeError,ForDynamic} core::int*);
-  } =>#t124;
+      #t122.{core::List::add}{Invariant}(dynVar as{TypeError,ForDynamic} core::int*);
+  } =>#t122;
   core::Set<core::int*>* set90 = block {
-    final core::Set<core::int*>* #t125 = new col::_CompactLinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t123 = new col::_CompactLinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t125.{core::Set::add}(dynVar as{TypeError,ForDynamic} core::int*);
-    #t125.{core::Set::add}(null);
-  } =>#t125;
+      #t123.{core::Set::add}{Invariant}(dynVar as{TypeError,ForDynamic} core::int*);
+    #t123.{core::Set::add}{Invariant}(null);
+  } =>#t123;
   core::Map<core::String*, core::int*>* map90 = block {
-    final core::Map<core::String*, core::int*>* #t126 = <core::String*, core::int*>{};
+    final core::Map<core::String*, core::int*>* #t124 = <core::String*, core::int*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t126.{core::Map::[]=}("bar", dynVar as{TypeError,ForDynamic} core::int*);
-    #t126.{core::Map::[]=}("baz", null);
-  } =>#t126;
+      #t124.{core::Map::[]=}{Invariant}("bar", dynVar as{TypeError,ForDynamic} core::int*);
+    #t124.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t124;
   core::List<core::int*>* list91 = block {
-    final core::List<core::int*>* #t127 = <core::int*>[];
+    final core::List<core::int*>* #t125 = <core::int*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
       core::Iterator<dynamic>* :sync-for-iterator = (dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*).{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final dynamic #t128 = :sync-for-iterator.{core::Iterator::current};
+        final dynamic #t126 = :sync-for-iterator.{core::Iterator::current};
         {
-          final core::int* #t129 = #t128 as{TypeError} core::int*;
-          #t127.{core::List::add}(#t129);
+          final core::int* #t127 = #t126 as{TypeError} core::int*;
+          #t125.{core::List::add}{Invariant}(#t127);
         }
       }
     }
-  } =>#t127;
+  } =>#t125;
   core::Set<core::int*>* set91 = block {
-    final core::Set<core::int*>* #t130 = new col::_CompactLinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t128 = new col::_CompactLinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
       core::Iterator<dynamic>* :sync-for-iterator = (dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*).{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final dynamic #t131 = :sync-for-iterator.{core::Iterator::current};
+        final dynamic #t129 = :sync-for-iterator.{core::Iterator::current};
         {
-          final core::int* #t132 = #t131 as{TypeError} core::int*;
-          #t130.{core::Set::add}(#t132);
+          final core::int* #t130 = #t129 as{TypeError} core::int*;
+          #t128.{core::Set::add}{Invariant}(#t130);
         }
       }
     }
-    #t130.{core::Set::add}(null);
-  } =>#t130;
+    #t128.{core::Set::add}{Invariant}(null);
+  } =>#t128;
   core::Map<core::String*, core::int*>* map91 = block {
-    final core::Map<core::String*, core::int*>* #t133 = <core::String*, core::int*>{};
+    final core::Map<core::String*, core::int*>* #t131 = <core::String*, core::int*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
       core::Iterator<core::MapEntry<dynamic, dynamic>>* :sync-for-iterator = (dynVar as{TypeError,ForDynamic} core::Map<dynamic, dynamic>*).{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::MapEntry<dynamic, dynamic>* #t134 = :sync-for-iterator.{core::Iterator::current};
+        final core::MapEntry<dynamic, dynamic>* #t132 = :sync-for-iterator.{core::Iterator::current};
         {
-          final core::String* #t135 = #t134.{core::MapEntry::key} as{TypeError} core::String*;
-          final core::int* #t136 = #t134.{core::MapEntry::value} as{TypeError} core::int*;
-          #t133.{core::Map::[]=}(#t135, #t136);
+          final core::String* #t133 = #t132.{core::MapEntry::key} as{TypeError} core::String*;
+          final core::int* #t134 = #t132.{core::MapEntry::value} as{TypeError} core::int*;
+          #t131.{core::Map::[]=}{Invariant}(#t133, #t134);
         }
       }
     }
-    #t133.{core::Map::[]=}("baz", null);
-  } =>#t133;
+    #t131.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t131;
   core::List<core::int*>* list100 = block {
-    final core::List<core::int*>* #t137 = <core::int*>[];
+    final core::List<core::int*>* #t135 = <core::int*>[];
     if(dynVar as{TypeError,ForDynamic} core::bool*)
-      #t137.{core::List::add}(42);
-  } =>#t137;
+      #t135.{core::List::add}{Invariant}(42);
+  } =>#t135;
   core::Set<core::int*>* set100 = block {
-    final core::Set<core::int*>* #t138 = new col::_CompactLinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t136 = new col::_CompactLinkedHashSet::•<core::int*>();
     if(dynVar as{TypeError,ForDynamic} core::bool*)
-      #t138.{core::Set::add}(42);
-  } =>#t138;
+      #t136.{core::Set::add}{Invariant}(42);
+  } =>#t136;
   core::Map<core::int*, core::int*>* map100 = block {
-    final core::Map<core::int*, core::int*>* #t139 = <core::int*, core::int*>{};
+    final core::Map<core::int*, core::int*>* #t137 = <core::int*, core::int*>{};
     if(dynVar as{TypeError,ForDynamic} core::bool*)
-      #t139.{core::Map::[]=}(42, 42);
-  } =>#t139;
+      #t137.{core::Map::[]=}{Invariant}(42, 42);
+  } =>#t137;
 }
 static method testIfElementErrors(core::Map<core::int*, core::int*>* map) → dynamic {
   block {
-    final core::List<core::int*>* #t140 = <core::int*>[];
+    final core::List<core::int*>* #t138 = <core::int*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t140.{core::List::add}(let final<BottomType> #t141 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:89:28: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+      #t138.{core::List::add}{Invariant}(let final<BottomType> #t139 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:89:28: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int>[if (oracle(\"foo\")) \"bar\"];
                            ^" in "bar" as{TypeError} core::int*);
-  } =>#t140;
+  } =>#t138;
   block {
-    final core::Set<core::int*>* #t142 = new col::_CompactLinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t140 = new col::_CompactLinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t142.{core::Set::add}(let final<BottomType> #t143 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:90:28: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+      #t140.{core::Set::add}{Invariant}(let final<BottomType> #t141 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:90:28: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int>{if (oracle(\"foo\")) \"bar\", null};
                            ^" in "bar" as{TypeError} core::int*);
-    #t142.{core::Set::add}(null);
-  } =>#t142;
+    #t140.{core::Set::add}{Invariant}(null);
+  } =>#t140;
   block {
-    final core::Map<core::String*, core::int*>* #t144 = <core::String*, core::int*>{};
+    final core::Map<core::String*, core::int*>* #t142 = <core::String*, core::int*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t144.{core::Map::[]=}("bar", let final<BottomType> #t145 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:91:43: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+      #t142.{core::Map::[]=}{Invariant}("bar", let final<BottomType> #t143 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:91:43: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <String, int>{if (oracle(\"foo\")) \"bar\": \"bar\", \"baz\": null};
                                           ^" in "bar" as{TypeError} core::int*);
-    #t144.{core::Map::[]=}("baz", null);
-  } =>#t144;
+    #t142.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t142;
   block {
-    final core::List<core::int*>* #t146 = <core::int*>[];
+    final core::List<core::int*>* #t144 = <core::int*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
-      core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[let final<BottomType> #t147 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:92:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+      core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[let final<BottomType> #t145 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:92:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int>[if (oracle(\"foo\")) ...[\"bar\"]];
                                ^" in "bar" as{TypeError} core::int*].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::int* #t148 = :sync-for-iterator.{core::Iterator::current};
-        #t146.{core::List::add}(#t148);
+        final core::int* #t146 = :sync-for-iterator.{core::Iterator::current};
+        #t144.{core::List::add}{Invariant}(#t146);
       }
     }
-  } =>#t146;
+  } =>#t144;
   block {
-    final core::Set<core::int*>* #t149 = new col::_CompactLinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t147 = new col::_CompactLinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
-      core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[let final<BottomType> #t150 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:93:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+      core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[let final<BottomType> #t148 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:93:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int>{if (oracle(\"foo\")) ...[\"bar\"], null};
                                ^" in "bar" as{TypeError} core::int*].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::int* #t151 = :sync-for-iterator.{core::Iterator::current};
-        #t149.{core::Set::add}(#t151);
+        final core::int* #t149 = :sync-for-iterator.{core::Iterator::current};
+        #t147.{core::Set::add}{Invariant}(#t149);
       }
     }
-    #t149.{core::Set::add}(null);
-  } =>#t149;
+    #t147.{core::Set::add}{Invariant}(null);
+  } =>#t147;
   block {
-    final core::Map<core::String*, core::int*>* #t152 = <core::String*, core::int*>{};
+    final core::Map<core::String*, core::int*>* #t150 = <core::String*, core::int*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
-      core::Iterator<core::MapEntry<core::String*, core::int*>>* :sync-for-iterator = <core::String*, core::int*>{"bar": let final<BottomType> #t153 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:94:47: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+      core::Iterator<core::MapEntry<core::String*, core::int*>>* :sync-for-iterator = <core::String*, core::int*>{"bar": let final<BottomType> #t151 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:94:47: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <String, int>{if (oracle(\"foo\")) ...{\"bar\": \"bar\"}, \"baz\": null};
                                               ^" in "bar" as{TypeError} core::int*}.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::MapEntry<core::String*, core::int*>* #t154 = :sync-for-iterator.{core::Iterator::current};
-        #t152.{core::Map::[]=}(#t154.{core::MapEntry::key}, #t154.{core::MapEntry::value});
+        final core::MapEntry<core::String*, core::int*>* #t152 = :sync-for-iterator.{core::Iterator::current};
+        #t150.{core::Map::[]=}{Invariant}(#t152.{core::MapEntry::key}, #t152.{core::MapEntry::value});
       }
     }
-    #t152.{core::Map::[]=}("baz", null);
-  } =>#t152;
+    #t150.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t150;
   block {
-    final core::List<core::int*>* #t155 = <core::int*>[];
+    final core::List<core::int*>* #t153 = <core::int*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t155.{core::List::add}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:95:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+      #t153.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:95:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
   <int>[if (oracle(\"foo\")) ...map];
                               ^");
-  } =>#t155;
+  } =>#t153;
   block {
-    final core::Set<core::int*>* #t156 = new col::_CompactLinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t154 = new col::_CompactLinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t156.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:96:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+      #t154.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:96:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
   <int>{if (oracle(\"foo\")) ...map, null};
                               ^");
-    #t156.{core::Set::add}(null);
-  } =>#t156;
+    #t154.{core::Set::add}{Invariant}(null);
+  } =>#t154;
   <core::String*, core::int*>{invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:97:39: Error: Unexpected type 'List<String>' of a map spread entry.  Expected 'dynamic' or a Map.
  - 'List' is from 'dart:core'.
   <String, int>{if (oracle(\"foo\")) ...[\"bar\"], \"baz\": null};
@@ -1290,61 +1300,61 @@
   <String, int>{if (oracle(\"foo\")) ...[\"bar\"], \"baz\": null};
                                       ^": null};
   block {
-    final core::List<core::String*>* #t157 = <core::String*>[];
+    final core::List<core::String*>* #t155 = <core::String*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t157.{core::List::add}(let final<BottomType> #t158 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:98:31: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+      #t155.{core::List::add}{Invariant}(let final<BottomType> #t156 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:98:31: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
   <String>[if (oracle(\"foo\")) 42 else 3.14];
                               ^" in 42 as{TypeError} core::String*);
     else
-      #t157.{core::List::add}(let final<BottomType> #t159 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:98:39: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
+      #t155.{core::List::add}{Invariant}(let final<BottomType> #t157 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:98:39: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
   <String>[if (oracle(\"foo\")) 42 else 3.14];
                                       ^" in 3.14 as{TypeError} core::String*);
-  } =>#t157;
+  } =>#t155;
   block {
-    final core::Set<core::String*>* #t160 = new col::_CompactLinkedHashSet::•<core::String*>();
+    final core::Set<core::String*>* #t158 = new col::_CompactLinkedHashSet::•<core::String*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t160.{core::Set::add}(let final<BottomType> #t161 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:99:31: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+      #t158.{core::Set::add}{Invariant}(let final<BottomType> #t159 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:99:31: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
   <String>{if (oracle(\"foo\")) 42 else 3.14, null};
                               ^" in 42 as{TypeError} core::String*);
     else
-      #t160.{core::Set::add}(let final<BottomType> #t162 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:99:39: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
+      #t158.{core::Set::add}{Invariant}(let final<BottomType> #t160 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:99:39: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
   <String>{if (oracle(\"foo\")) 42 else 3.14, null};
                                       ^" in 3.14 as{TypeError} core::String*);
-    #t160.{core::Set::add}(null);
-  } =>#t160;
+    #t158.{core::Set::add}{Invariant}(null);
+  } =>#t158;
   block {
-    final core::Map<core::String*, core::String*>* #t163 = <core::String*, core::String*>{};
+    final core::Map<core::String*, core::String*>* #t161 = <core::String*, core::String*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t163.{core::Map::[]=}("bar", let final<BottomType> #t164 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:100:46: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+      #t161.{core::Map::[]=}{Invariant}("bar", let final<BottomType> #t162 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:100:46: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
   <String, String>{if (oracle(\"foo\")) \"bar\": 42 else \"baz\": 3.14, \"baz\": null};
                                              ^" in 42 as{TypeError} core::String*);
     else
-      #t163.{core::Map::[]=}("baz", let final<BottomType> #t165 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:100:61: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
+      #t161.{core::Map::[]=}{Invariant}("baz", let final<BottomType> #t163 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:100:61: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
   <String, String>{if (oracle(\"foo\")) \"bar\": 42 else \"baz\": 3.14, \"baz\": null};
                                                             ^" in 3.14 as{TypeError} core::String*);
-    #t163.{core::Map::[]=}("baz", null);
-  } =>#t163;
+    #t161.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t161;
   block {
-    final core::List<core::int*>* #t166 = <core::int*>[];
+    final core::List<core::int*>* #t164 = <core::int*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t166.{core::List::add}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:101:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+      #t164.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:101:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
   <int>[if (oracle(\"foo\")) ...map else 42];
                               ^");
     else
-      #t166.{core::List::add}(42);
-  } =>#t166;
+      #t164.{core::List::add}{Invariant}(42);
+  } =>#t164;
   block {
-    final core::Set<core::int*>* #t167 = new col::_CompactLinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t165 = new col::_CompactLinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t167.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:102:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+      #t165.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:102:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
   <int>{if (oracle(\"foo\")) ...map else 42, null};
                               ^");
     else
-      #t167.{core::Set::add}(42);
-    #t167.{core::Set::add}(null);
-  } =>#t167;
+      #t165.{core::Set::add}{Invariant}(42);
+    #t165.{core::Set::add}{Invariant}(null);
+  } =>#t165;
   <core::String*, core::int*>{invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:103:39: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
  - 'List' is from 'dart:core'.
   <String, int>{if (oracle(\"foo\")) ...[42] else \"bar\": 42, \"baz\": null};
@@ -1353,26 +1363,26 @@
   <String, int>{if (oracle(\"foo\")) ...[42] else \"bar\": 42, \"baz\": null};
                                       ^": null};
   block {
-    final core::List<core::int*>* #t168 = <core::int*>[];
+    final core::List<core::int*>* #t166 = <core::int*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t168.{core::List::add}(42);
+      #t166.{core::List::add}{Invariant}(42);
     else
-      #t168.{core::List::add}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:104:39: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+      #t166.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:104:39: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
   <int>[if (oracle(\"foo\")) 42 else ...map];
                                       ^");
-  } =>#t168;
+  } =>#t166;
   block {
-    final core::Set<core::int*>* #t169 = new col::_CompactLinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t167 = new col::_CompactLinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t169.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:105:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+      #t167.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:105:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
   <int>{if (oracle(\"foo\")) ...map else 42, null};
                               ^");
     else
-      #t169.{core::Set::add}(42);
-    #t169.{core::Set::add}(null);
-  } =>#t169;
+      #t167.{core::Set::add}{Invariant}(42);
+    #t167.{core::Set::add}{Invariant}(null);
+  } =>#t167;
   <core::String*, core::int*>{invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:106:54: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
  - 'List' is from 'dart:core'.
   <String, int>{if (oracle(\"foo\")) \"bar\": 42 else ...[42], \"baz\": null};
@@ -1392,934 +1402,945 @@
   core::Map<dynamic, dynamic>* map11 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:111:70: Error: Expected ':' after this.
   Map<dynamic, dynamic> map11 = {if (oracle(\"foo\")) \"bar\": 3.14 else 42};
                                                                      ^": null};
-  core::Map<dynamic, core::Null?>* map12 = <dynamic, core::Null?>{invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:112:35: Error: Expected ':' after this.
+  core::Map<dynamic, Null>* map12 = <dynamic, Null>{invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:112:35: Error: Expected ':' after this.
   var map12 = {if (oracle(\"foo\")) 42 else \"bar\": 3.14};
                                   ^": null};
-  core::Map<dynamic, core::Null?>* map13 = <dynamic, core::Null?>{invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:113:52: Error: Expected ':' after this.
+  core::Map<dynamic, Null>* map13 = <dynamic, Null>{invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:113:52: Error: Expected ':' after this.
   var map13 = {if (oracle(\"foo\")) \"bar\": 3.14 else 42};
                                                    ^": null};
   core::List<core::int*>* list20 = block {
-    final core::List<core::int*>* #t170 = <core::int*>[];
-    if(let final<BottomType> #t171 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:114:27: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
+    final core::List<core::int*>* #t168 = <core::int*>[];
+    if(let final<BottomType> #t169 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:114:27: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
   List<int> list20 = [if (42) 42];
                           ^" in 42 as{TypeError} core::bool*)
-      #t170.{core::List::add}(42);
-  } =>#t170;
+      #t168.{core::List::add}{Invariant}(42);
+  } =>#t168;
   core::Set<core::int*>* set20 = block {
-    final core::Set<core::int*>* #t172 = new col::_CompactLinkedHashSet::•<core::int*>();
-    if(let final<BottomType> #t173 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:115:25: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
+    final core::Set<core::int*>* #t170 = new col::_CompactLinkedHashSet::•<core::int*>();
+    if(let final<BottomType> #t171 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:115:25: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
   Set<int> set20 = {if (42) 42};
                         ^" in 42 as{TypeError} core::bool*)
-      #t172.{core::Set::add}(42);
-  } =>#t172;
+      #t170.{core::Set::add}{Invariant}(42);
+  } =>#t170;
   core::Map<core::int*, core::int*>* map30 = block {
-    final core::Map<core::int*, core::int*>* #t174 = <core::int*, core::int*>{};
-    if(let final<BottomType> #t175 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:116:30: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
+    final core::Map<core::int*, core::int*>* #t172 = <core::int*, core::int*>{};
+    if(let final<BottomType> #t173 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:116:30: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
   Map<int, int> map30 = {if (42) 42: 42};
                              ^" in 42 as{TypeError} core::bool*)
-      #t174.{core::Map::[]=}(42, 42);
-  } =>#t174;
+      #t172.{core::Map::[]=}{Invariant}(42, 42);
+  } =>#t172;
   core::List<core::String*>* list40 = block {
-    final core::List<core::String*>* #t176 = <core::String*>[];
+    final core::List<core::String*>* #t174 = <core::String*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t176.{core::List::add}(let final<BottomType> #t177 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:117:53: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
+      #t174.{core::List::add}{Invariant}(let final<BottomType> #t175 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:117:53: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
   List<String> list40 = <String>[if (oracle(\"foo\")) true else 42];
                                                     ^" in true as{TypeError} core::String*);
     else
-      #t176.{core::List::add}(let final<BottomType> #t178 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:117:63: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+      #t174.{core::List::add}{Invariant}(let final<BottomType> #t176 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:117:63: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
   List<String> list40 = <String>[if (oracle(\"foo\")) true else 42];
                                                               ^" in 42 as{TypeError} core::String*);
-  } =>#t176;
+  } =>#t174;
   core::Set<core::String*>* set40 = block {
-    final core::Set<core::String*>* #t179 = new col::_CompactLinkedHashSet::•<core::String*>();
+    final core::Set<core::String*>* #t177 = new col::_CompactLinkedHashSet::•<core::String*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t179.{core::Set::add}(let final<BottomType> #t180 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:118:51: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
+      #t177.{core::Set::add}{Invariant}(let final<BottomType> #t178 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:118:51: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
   Set<String> set40 = <String>{if (oracle(\"foo\")) true else 42};
                                                   ^" in true as{TypeError} core::String*);
     else
-      #t179.{core::Set::add}(let final<BottomType> #t181 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:118:61: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+      #t177.{core::Set::add}{Invariant}(let final<BottomType> #t179 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:118:61: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
   Set<String> set40 = <String>{if (oracle(\"foo\")) true else 42};
                                                             ^" in 42 as{TypeError} core::String*);
-  } =>#t179;
+  } =>#t177;
   core::Map<core::String*, core::int*>* map40 = block {
-    final core::Map<core::String*, core::int*>* #t182 = <core::String*, core::int*>{};
+    final core::Map<core::String*, core::int*>* #t180 = <core::String*, core::int*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t182.{core::Map::[]=}(let final<BottomType> #t183 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:119:61: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
+      #t180.{core::Map::[]=}{Invariant}(let final<BottomType> #t181 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:119:61: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
   Map<String, int> map40 = <String, int>{if (oracle(\"foo\")) true: 42 else 42: 42};
                                                             ^" in true as{TypeError} core::String*, 42);
     else
-      #t182.{core::Map::[]=}(let final<BottomType> #t184 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:119:75: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+      #t180.{core::Map::[]=}{Invariant}(let final<BottomType> #t182 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:119:75: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
   Map<String, int> map40 = <String, int>{if (oracle(\"foo\")) true: 42 else 42: 42};
                                                                           ^" in 42 as{TypeError} core::String*, 42);
-  } =>#t182;
+  } =>#t180;
   core::Map<core::int*, core::String*>* map41 = block {
-    final core::Map<core::int*, core::String*>* #t185 = <core::int*, core::String*>{};
+    final core::Map<core::int*, core::String*>* #t183 = <core::int*, core::String*>{};
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
-      #t185.{core::Map::[]=}(42, let final<BottomType> #t186 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:120:65: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
+      #t183.{core::Map::[]=}{Invariant}(42, let final<BottomType> #t184 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:120:65: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
   Map<int, String> map41 = <int, String>{if (oracle(\"foo\")) 42: true else 42: 42};
                                                                 ^" in true as{TypeError} core::String*);
     else
-      #t185.{core::Map::[]=}(42, let final<BottomType> #t187 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:120:79: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+      #t183.{core::Map::[]=}{Invariant}(42, let final<BottomType> #t185 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:120:79: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
   Map<int, String> map41 = <int, String>{if (oracle(\"foo\")) 42: true else 42: 42};
                                                                               ^" in 42 as{TypeError} core::String*);
-  } =>#t185;
+  } =>#t183;
 }
 static method testForElement(dynamic dynVar, core::List<core::int*>* listInt, core::List<core::double*>* listDouble, core::int* index, core::Map<core::String*, core::int*>* mapStringInt, core::Map<core::String*, core::double*>* mapStringDouble) → dynamic {
   core::List<core::int*>* list10 = block {
-    final core::List<core::int*>* #t188 = <core::int*>[];
+    final core::List<core::int*>* #t186 = <core::int*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      #t188.{core::List::add}(42);
-  } =>#t188;
+      #t186.{core::List::add}{Invariant}(42);
+  } =>#t186;
   core::Set<core::int*>* set10 = block {
-    final core::Set<core::int*>* #t189 = new col::_CompactLinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t187 = new col::_CompactLinkedHashSet::•<core::int*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      #t189.{core::Set::add}(42);
-    #t189.{core::Set::add}(null);
-  } =>#t189;
+      #t187.{core::Set::add}{Invariant}(42);
+    #t187.{core::Set::add}{Invariant}(null);
+  } =>#t187;
   core::Map<core::String*, core::int*>* map10 = block {
-    final core::Map<core::String*, core::int*>* #t190 = <core::String*, core::int*>{};
+    final core::Map<core::String*, core::int*>* #t188 = <core::String*, core::int*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      #t190.{core::Map::[]=}("bar", 42);
-    #t190.{core::Map::[]=}("baz", null);
-  } =>#t190;
+      #t188.{core::Map::[]=}{Invariant}("bar", 42);
+    #t188.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t188;
   core::List<dynamic>* list11 = block {
-    final core::List<dynamic>* #t191 = <dynamic>[];
+    final core::List<dynamic>* #t189 = <dynamic>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      #t191.{core::List::add}(dynVar);
-  } =>#t191;
+      #t189.{core::List::add}{Invariant}(dynVar);
+  } =>#t189;
   core::Set<dynamic>* set11 = block {
-    final core::Set<dynamic>* #t192 = new col::_CompactLinkedHashSet::•<dynamic>();
+    final core::Set<dynamic>* #t190 = new col::_CompactLinkedHashSet::•<dynamic>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      #t192.{core::Set::add}(dynVar);
-    #t192.{core::Set::add}(null);
-  } =>#t192;
+      #t190.{core::Set::add}{Invariant}(dynVar);
+    #t190.{core::Set::add}{Invariant}(null);
+  } =>#t190;
   core::Map<core::String*, dynamic>* map11 = block {
-    final core::Map<core::String*, dynamic>* #t193 = <core::String*, dynamic>{};
+    final core::Map<core::String*, dynamic>* #t191 = <core::String*, dynamic>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      #t193.{core::Map::[]=}("bar", dynVar);
-    #t193.{core::Map::[]=}("baz", null);
-  } =>#t193;
+      #t191.{core::Map::[]=}{Invariant}("bar", dynVar);
+    #t191.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t191;
   core::List<core::List<core::int*>*>* list12 = block {
-    final core::List<core::List<core::int*>*>* #t194 = <core::List<core::int*>*>[];
+    final core::List<core::List<core::int*>*>* #t192 = <core::List<core::int*>*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      #t194.{core::List::add}(<core::int*>[42]);
-  } =>#t194;
+      #t192.{core::List::add}{Invariant}(<core::int*>[42]);
+  } =>#t192;
   core::Set<core::List<core::int*>*>* set12 = block {
-    final core::Set<core::List<core::int*>*>* #t195 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
+    final core::Set<core::List<core::int*>*>* #t193 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      #t195.{core::Set::add}(<core::int*>[42]);
-    #t195.{core::Set::add}(null);
-  } =>#t195;
+      #t193.{core::Set::add}{Invariant}(<core::int*>[42]);
+    #t193.{core::Set::add}{Invariant}(null);
+  } =>#t193;
   core::Map<core::String*, core::List<core::int*>*>* map12 = block {
-    final core::Map<core::String*, core::List<core::int*>*>* #t196 = <core::String*, core::List<core::int*>*>{};
+    final core::Map<core::String*, core::List<core::int*>*>* #t194 = <core::String*, core::List<core::int*>*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      #t196.{core::Map::[]=}("bar", <core::int*>[42]);
-    #t196.{core::Map::[]=}("baz", null);
-  } =>#t196;
+      #t194.{core::Map::[]=}{Invariant}("bar", <core::int*>[42]);
+    #t194.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t194;
   core::List<core::int*>* list20 = block {
-    final core::List<core::int*>* #t197 = <core::int*>[];
+    final core::List<core::int*>* #t195 = <core::int*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
+      core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[42].{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::int* #t196 = :sync-for-iterator.{core::Iterator::current};
+        #t195.{core::List::add}{Invariant}(#t196);
+      }
+    }
+  } =>#t195;
+  core::Set<core::int*>* set20 = block {
+    final core::Set<core::int*>* #t197 = new col::_CompactLinkedHashSet::•<core::int*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
       core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[42].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::int* #t198 = :sync-for-iterator.{core::Iterator::current};
-        #t197.{core::List::add}(#t198);
+        #t197.{core::Set::add}{Invariant}(#t198);
       }
     }
+    #t197.{core::Set::add}{Invariant}(null);
   } =>#t197;
-  core::Set<core::int*>* set20 = block {
-    final core::Set<core::int*>* #t199 = new col::_CompactLinkedHashSet::•<core::int*>();
-    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
-      core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[42].{core::Iterable::iterator};
-      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::int* #t200 = :sync-for-iterator.{core::Iterator::current};
-        #t199.{core::Set::add}(#t200);
-      }
-    }
-    #t199.{core::Set::add}(null);
-  } =>#t199;
   core::Map<core::String*, core::int*>* map20 = block {
-    final core::Map<core::String*, core::int*>* #t201 = <core::String*, core::int*>{};
+    final core::Map<core::String*, core::int*>* #t199 = <core::String*, core::int*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
       core::Iterator<core::MapEntry<core::String*, core::int*>>* :sync-for-iterator = <core::String*, core::int*>{"bar": 42}.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::MapEntry<core::String*, core::int*>* #t202 = :sync-for-iterator.{core::Iterator::current};
-        #t201.{core::Map::[]=}(#t202.{core::MapEntry::key}, #t202.{core::MapEntry::value});
+        final core::MapEntry<core::String*, core::int*>* #t200 = :sync-for-iterator.{core::Iterator::current};
+        #t199.{core::Map::[]=}{Invariant}(#t200.{core::MapEntry::key}, #t200.{core::MapEntry::value});
       }
     }
-    #t201.{core::Map::[]=}("baz", null);
-  } =>#t201;
+    #t199.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t199;
   core::List<dynamic>* list21 = block {
-    final core::List<dynamic>* #t203 = <dynamic>[];
+    final core::List<dynamic>* #t201 = <dynamic>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
+      core::Iterator<dynamic>* :sync-for-iterator = <dynamic>[dynVar].{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final dynamic #t202 = :sync-for-iterator.{core::Iterator::current};
+        #t201.{core::List::add}{Invariant}(#t202);
+      }
+    }
+  } =>#t201;
+  core::Set<dynamic>* set21 = block {
+    final core::Set<dynamic>* #t203 = new col::_CompactLinkedHashSet::•<dynamic>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
       core::Iterator<dynamic>* :sync-for-iterator = <dynamic>[dynVar].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final dynamic #t204 = :sync-for-iterator.{core::Iterator::current};
-        #t203.{core::List::add}(#t204);
+        #t203.{core::Set::add}{Invariant}(#t204);
       }
     }
+    #t203.{core::Set::add}{Invariant}(null);
   } =>#t203;
-  core::Set<dynamic>* set21 = block {
-    final core::Set<dynamic>* #t205 = new col::_CompactLinkedHashSet::•<dynamic>();
-    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
-      core::Iterator<dynamic>* :sync-for-iterator = <dynamic>[dynVar].{core::Iterable::iterator};
-      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final dynamic #t206 = :sync-for-iterator.{core::Iterator::current};
-        #t205.{core::Set::add}(#t206);
-      }
-    }
-    #t205.{core::Set::add}(null);
-  } =>#t205;
   core::Map<core::String*, dynamic>* map21 = block {
-    final core::Map<core::String*, dynamic>* #t207 = <core::String*, dynamic>{};
+    final core::Map<core::String*, dynamic>* #t205 = <core::String*, dynamic>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
       core::Iterator<core::MapEntry<core::String*, dynamic>>* :sync-for-iterator = <core::String*, dynamic>{"bar": dynVar}.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::MapEntry<core::String*, dynamic>* #t208 = :sync-for-iterator.{core::Iterator::current};
-        #t207.{core::Map::[]=}(#t208.{core::MapEntry::key}, #t208.{core::MapEntry::value});
+        final core::MapEntry<core::String*, dynamic>* #t206 = :sync-for-iterator.{core::Iterator::current};
+        #t205.{core::Map::[]=}{Invariant}(#t206.{core::MapEntry::key}, #t206.{core::MapEntry::value});
       }
     }
-    #t207.{core::Map::[]=}("baz", null);
-  } =>#t207;
+    #t205.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t205;
   core::List<core::List<core::int*>*>* list22 = block {
-    final core::List<core::List<core::int*>*>* #t209 = <core::List<core::int*>*>[];
+    final core::List<core::List<core::int*>*>* #t207 = <core::List<core::int*>*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
+      core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[42]].{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::List<core::int*>* #t208 = :sync-for-iterator.{core::Iterator::current};
+        #t207.{core::List::add}{Invariant}(#t208);
+      }
+    }
+  } =>#t207;
+  core::Set<core::List<core::int*>*>* set22 = block {
+    final core::Set<core::List<core::int*>*>* #t209 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
       core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[42]].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::List<core::int*>* #t210 = :sync-for-iterator.{core::Iterator::current};
-        #t209.{core::List::add}(#t210);
+        #t209.{core::Set::add}{Invariant}(#t210);
       }
     }
+    #t209.{core::Set::add}{Invariant}(null);
   } =>#t209;
-  core::Set<core::List<core::int*>*>* set22 = block {
-    final core::Set<core::List<core::int*>*>* #t211 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
-    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
-      core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[42]].{core::Iterable::iterator};
-      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::List<core::int*>* #t212 = :sync-for-iterator.{core::Iterator::current};
-        #t211.{core::Set::add}(#t212);
-      }
-    }
-    #t211.{core::Set::add}(null);
-  } =>#t211;
   core::Map<core::String*, core::List<core::int*>*>* map22 = block {
-    final core::Map<core::String*, core::List<core::int*>*>* #t213 = <core::String*, core::List<core::int*>*>{};
+    final core::Map<core::String*, core::List<core::int*>*>* #t211 = <core::String*, core::List<core::int*>*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
       core::Iterator<core::MapEntry<core::String*, core::List<core::int*>*>>* :sync-for-iterator = <core::String*, core::List<core::int*>*>{"bar": <core::int*>[42]}.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::MapEntry<core::String*, core::List<core::int*>*>* #t214 = :sync-for-iterator.{core::Iterator::current};
-        #t213.{core::Map::[]=}(#t214.{core::MapEntry::key}, #t214.{core::MapEntry::value});
+        final core::MapEntry<core::String*, core::List<core::int*>*>* #t212 = :sync-for-iterator.{core::Iterator::current};
+        #t211.{core::Map::[]=}{Invariant}(#t212.{core::MapEntry::key}, #t212.{core::MapEntry::value});
       }
     }
-    #t213.{core::Map::[]=}("baz", null);
-  } =>#t213;
+    #t211.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t211;
   core::List<core::int*>* list30 = block {
-    final core::List<core::int*>* #t215 = <core::int*>[];
+    final core::List<core::int*>* #t213 = <core::int*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
+        core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[42].{core::Iterable::iterator};
+        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+          final core::int* #t214 = :sync-for-iterator.{core::Iterator::current};
+          #t213.{core::List::add}{Invariant}(#t214);
+        }
+      }
+  } =>#t213;
+  core::Set<core::int*>* set30 = block {
+    final core::Set<core::int*>* #t215 = new col::_CompactLinkedHashSet::•<core::int*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
         core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[42].{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
           final core::int* #t216 = :sync-for-iterator.{core::Iterator::current};
-          #t215.{core::List::add}(#t216);
+          #t215.{core::Set::add}{Invariant}(#t216);
         }
       }
+    #t215.{core::Set::add}{Invariant}(null);
   } =>#t215;
-  core::Set<core::int*>* set30 = block {
-    final core::Set<core::int*>* #t217 = new col::_CompactLinkedHashSet::•<core::int*>();
-    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
-        core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[42].{core::Iterable::iterator};
-        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final core::int* #t218 = :sync-for-iterator.{core::Iterator::current};
-          #t217.{core::Set::add}(#t218);
-        }
-      }
-    #t217.{core::Set::add}(null);
-  } =>#t217;
   core::Map<core::String*, core::int*>* map30 = block {
-    final core::Map<core::String*, core::int*>* #t219 = <core::String*, core::int*>{};
+    final core::Map<core::String*, core::int*>* #t217 = <core::String*, core::int*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
         core::Iterator<core::MapEntry<core::String*, core::int*>>* :sync-for-iterator = <core::String*, core::int*>{"bar": 42}.{core::Map::entries}.{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final core::MapEntry<core::String*, core::int*>* #t220 = :sync-for-iterator.{core::Iterator::current};
-          #t219.{core::Map::[]=}(#t220.{core::MapEntry::key}, #t220.{core::MapEntry::value});
+          final core::MapEntry<core::String*, core::int*>* #t218 = :sync-for-iterator.{core::Iterator::current};
+          #t217.{core::Map::[]=}{Invariant}(#t218.{core::MapEntry::key}, #t218.{core::MapEntry::value});
         }
       }
-    #t219.{core::Map::[]=}("baz", null);
-  } =>#t219;
+    #t217.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t217;
   core::List<dynamic>* list31 = block {
-    final core::List<dynamic>* #t221 = <dynamic>[];
+    final core::List<dynamic>* #t219 = <dynamic>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
+        core::Iterator<dynamic>* :sync-for-iterator = <dynamic>[dynVar].{core::Iterable::iterator};
+        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+          final dynamic #t220 = :sync-for-iterator.{core::Iterator::current};
+          #t219.{core::List::add}{Invariant}(#t220);
+        }
+      }
+  } =>#t219;
+  core::Set<dynamic>* set31 = block {
+    final core::Set<dynamic>* #t221 = new col::_CompactLinkedHashSet::•<dynamic>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
         core::Iterator<dynamic>* :sync-for-iterator = <dynamic>[dynVar].{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
           final dynamic #t222 = :sync-for-iterator.{core::Iterator::current};
-          #t221.{core::List::add}(#t222);
+          #t221.{core::Set::add}{Invariant}(#t222);
         }
       }
+    #t221.{core::Set::add}{Invariant}(null);
   } =>#t221;
-  core::Set<dynamic>* set31 = block {
-    final core::Set<dynamic>* #t223 = new col::_CompactLinkedHashSet::•<dynamic>();
-    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
-        core::Iterator<dynamic>* :sync-for-iterator = <dynamic>[dynVar].{core::Iterable::iterator};
-        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final dynamic #t224 = :sync-for-iterator.{core::Iterator::current};
-          #t223.{core::Set::add}(#t224);
-        }
-      }
-    #t223.{core::Set::add}(null);
-  } =>#t223;
   core::Map<core::String*, dynamic>* map31 = block {
-    final core::Map<core::String*, dynamic>* #t225 = <core::String*, dynamic>{};
+    final core::Map<core::String*, dynamic>* #t223 = <core::String*, dynamic>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
         core::Iterator<core::MapEntry<core::String*, dynamic>>* :sync-for-iterator = <core::String*, dynamic>{"bar": dynVar}.{core::Map::entries}.{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final core::MapEntry<core::String*, dynamic>* #t226 = :sync-for-iterator.{core::Iterator::current};
-          #t225.{core::Map::[]=}(#t226.{core::MapEntry::key}, #t226.{core::MapEntry::value});
+          final core::MapEntry<core::String*, dynamic>* #t224 = :sync-for-iterator.{core::Iterator::current};
+          #t223.{core::Map::[]=}{Invariant}(#t224.{core::MapEntry::key}, #t224.{core::MapEntry::value});
         }
       }
-    #t225.{core::Map::[]=}("baz", null);
-  } =>#t225;
+    #t223.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t223;
   core::List<core::List<core::int*>*>* list33 = block {
-    final core::List<core::List<core::int*>*>* #t227 = <core::List<core::int*>*>[];
+    final core::List<core::List<core::int*>*>* #t225 = <core::List<core::int*>*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
+        core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[42]].{core::Iterable::iterator};
+        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+          final core::List<core::int*>* #t226 = :sync-for-iterator.{core::Iterator::current};
+          #t225.{core::List::add}{Invariant}(#t226);
+        }
+      }
+  } =>#t225;
+  core::Set<core::List<core::int*>*>* set33 = block {
+    final core::Set<core::List<core::int*>*>* #t227 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
         core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[42]].{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
           final core::List<core::int*>* #t228 = :sync-for-iterator.{core::Iterator::current};
-          #t227.{core::List::add}(#t228);
+          #t227.{core::Set::add}{Invariant}(#t228);
         }
       }
+    #t227.{core::Set::add}{Invariant}(null);
   } =>#t227;
-  core::Set<core::List<core::int*>*>* set33 = block {
-    final core::Set<core::List<core::int*>*>* #t229 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
-    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
-        core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[42]].{core::Iterable::iterator};
-        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final core::List<core::int*>* #t230 = :sync-for-iterator.{core::Iterator::current};
-          #t229.{core::Set::add}(#t230);
-        }
-      }
-    #t229.{core::Set::add}(null);
-  } =>#t229;
   core::Map<core::String*, core::List<core::int*>*>* map33 = block {
-    final core::Map<core::String*, core::List<core::int*>*>* #t231 = <core::String*, core::List<core::int*>*>{};
+    final core::Map<core::String*, core::List<core::int*>*>* #t229 = <core::String*, core::List<core::int*>*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
         core::Iterator<core::MapEntry<core::String*, core::List<core::int*>*>>* :sync-for-iterator = <core::String*, core::List<core::int*>*>{"bar": <core::int*>[42]}.{core::Map::entries}.{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final core::MapEntry<core::String*, core::List<core::int*>*>* #t232 = :sync-for-iterator.{core::Iterator::current};
-          #t231.{core::Map::[]=}(#t232.{core::MapEntry::key}, #t232.{core::MapEntry::value});
+          final core::MapEntry<core::String*, core::List<core::int*>*>* #t230 = :sync-for-iterator.{core::Iterator::current};
+          #t229.{core::Map::[]=}{Invariant}(#t230.{core::MapEntry::key}, #t230.{core::MapEntry::value});
         }
       }
-    #t231.{core::Map::[]=}("baz", null);
-  } =>#t231;
+    #t229.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t229;
   core::List<core::List<core::int*>*>* list40 = block {
-    final core::List<core::List<core::int*>*>* #t233 = <core::List<core::int*>*>[];
+    final core::List<core::List<core::int*>*>* #t231 = <core::List<core::int*>*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
+      core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::List<core::int*>* #t232 = :sync-for-iterator.{core::Iterator::current};
+        #t231.{core::List::add}{Invariant}(#t232);
+      }
+    }
+  } =>#t231;
+  core::Set<core::List<core::int*>*>* set40 = block {
+    final core::Set<core::List<core::int*>*>* #t233 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
       core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::List<core::int*>* #t234 = :sync-for-iterator.{core::Iterator::current};
-        #t233.{core::List::add}(#t234);
+        #t233.{core::Set::add}{Invariant}(#t234);
       }
     }
+    #t233.{core::Set::add}{Invariant}(null);
   } =>#t233;
-  core::Set<core::List<core::int*>*>* set40 = block {
-    final core::Set<core::List<core::int*>*>* #t235 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
-    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
-      core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
-      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::List<core::int*>* #t236 = :sync-for-iterator.{core::Iterator::current};
-        #t235.{core::Set::add}(#t236);
-      }
-    }
-    #t235.{core::Set::add}(null);
-  } =>#t235;
   core::Map<core::String*, core::List<core::int*>*>* map40 = block {
-    final core::Map<core::String*, core::List<core::int*>*>* #t237 = <core::String*, core::List<core::int*>*>{};
+    final core::Map<core::String*, core::List<core::int*>*>* #t235 = <core::String*, core::List<core::int*>*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
       core::Iterator<core::MapEntry<core::String*, core::List<core::int*>*>>* :sync-for-iterator = <core::String*, core::List<core::int*>*>{"bar": <core::int*>[]}.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::MapEntry<core::String*, core::List<core::int*>*>* #t238 = :sync-for-iterator.{core::Iterator::current};
-        #t237.{core::Map::[]=}(#t238.{core::MapEntry::key}, #t238.{core::MapEntry::value});
+        final core::MapEntry<core::String*, core::List<core::int*>*>* #t236 = :sync-for-iterator.{core::Iterator::current};
+        #t235.{core::Map::[]=}{Invariant}(#t236.{core::MapEntry::key}, #t236.{core::MapEntry::value});
       }
     }
-    #t237.{core::Map::[]=}("baz", null);
-  } =>#t237;
+    #t235.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t235;
   core::List<core::List<core::int*>*>* list41 = block {
-    final core::List<core::List<core::int*>*>* #t239 = <core::List<core::int*>*>[];
+    final core::List<core::List<core::int*>*>* #t237 = <core::List<core::int*>*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
-      core::Iterator<core::List<core::int*>*>* :sync-for-iterator = (let final core::Set<core::List<core::int*>*>* #t240 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>() in let final core::bool #t241 = #t240.{core::Set::add}(<core::int*>[]) in #t240).{core::Iterable::iterator};
+      core::Iterator<core::List<core::int*>*>* :sync-for-iterator = ( block {
+        final core::Set<core::List<core::int*>*>* #t238 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
+        #t238.{core::Set::add}{Invariant}(<core::int*>[]);
+      } =>#t238).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::List<core::int*>* #t239 = :sync-for-iterator.{core::Iterator::current};
+        #t237.{core::List::add}{Invariant}(#t239);
+      }
+    }
+  } =>#t237;
+  core::Set<core::List<core::int*>*>* set41 = block {
+    final core::Set<core::List<core::int*>*>* #t240 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
+      core::Iterator<core::List<core::int*>*>* :sync-for-iterator = ( block {
+        final core::Set<core::List<core::int*>*>* #t241 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
+        #t241.{core::Set::add}{Invariant}(<core::int*>[]);
+      } =>#t241).{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::List<core::int*>* #t242 = :sync-for-iterator.{core::Iterator::current};
-        #t239.{core::List::add}(#t242);
+        #t240.{core::Set::add}{Invariant}(#t242);
       }
     }
-  } =>#t239;
-  core::Set<core::List<core::int*>*>* set41 = block {
-    final core::Set<core::List<core::int*>*>* #t243 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
-    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
-      core::Iterator<core::List<core::int*>*>* :sync-for-iterator = (let final core::Set<core::List<core::int*>*>* #t244 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>() in let final core::bool #t245 = #t244.{core::Set::add}(<core::int*>[]) in #t244).{core::Iterable::iterator};
-      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::List<core::int*>* #t246 = :sync-for-iterator.{core::Iterator::current};
-        #t243.{core::Set::add}(#t246);
-      }
-    }
-    #t243.{core::Set::add}(null);
-  } =>#t243;
+    #t240.{core::Set::add}{Invariant}(null);
+  } =>#t240;
   core::List<core::List<core::int*>*>* list42 = block {
-    final core::List<core::List<core::int*>*>* #t247 = <core::List<core::int*>*>[];
+    final core::List<core::List<core::int*>*>* #t243 = <core::List<core::int*>*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
         core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final core::List<core::int*>* #t248 = :sync-for-iterator.{core::Iterator::current};
-          #t247.{core::List::add}(#t248);
+          final core::List<core::int*>* #t244 = :sync-for-iterator.{core::Iterator::current};
+          #t243.{core::List::add}{Invariant}(#t244);
         }
       }
-  } =>#t247;
+  } =>#t243;
   core::Set<core::List<core::int*>*>* set42 = block {
-    final core::Set<core::List<core::int*>*>* #t249 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
+    final core::Set<core::List<core::int*>*>* #t245 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
         core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final core::List<core::int*>* #t250 = :sync-for-iterator.{core::Iterator::current};
-          #t249.{core::Set::add}(#t250);
+          final core::List<core::int*>* #t246 = :sync-for-iterator.{core::Iterator::current};
+          #t245.{core::Set::add}{Invariant}(#t246);
         }
       }
-    #t249.{core::Set::add}(null);
-  } =>#t249;
+    #t245.{core::Set::add}{Invariant}(null);
+  } =>#t245;
   core::Map<core::String*, core::List<core::int*>*>* map42 = block {
-    final core::Map<core::String*, core::List<core::int*>*>* #t251 = <core::String*, core::List<core::int*>*>{};
+    final core::Map<core::String*, core::List<core::int*>*>* #t247 = <core::String*, core::List<core::int*>*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
         core::Iterator<core::MapEntry<core::String*, core::List<core::int*>*>>* :sync-for-iterator = <core::String*, core::List<core::int*>*>{"bar": <core::int*>[]}.{core::Map::entries}.{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final core::MapEntry<core::String*, core::List<core::int*>*>* #t252 = :sync-for-iterator.{core::Iterator::current};
-          #t251.{core::Map::[]=}(#t252.{core::MapEntry::key}, #t252.{core::MapEntry::value});
+          final core::MapEntry<core::String*, core::List<core::int*>*>* #t248 = :sync-for-iterator.{core::Iterator::current};
+          #t247.{core::Map::[]=}{Invariant}(#t248.{core::MapEntry::key}, #t248.{core::MapEntry::value});
         }
       }
-    #t251.{core::Map::[]=}("baz", null);
-  } =>#t251;
+    #t247.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t247;
   core::List<core::int*>* list50 = block {
-    final core::List<core::int*>* #t253 = <core::int*>[];
+    final core::List<core::int*>* #t249 = <core::int*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
       core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::int* #t254 = :sync-for-iterator.{core::Iterator::current};
-        #t253.{core::List::add}(#t254);
+        final core::int* #t250 = :sync-for-iterator.{core::Iterator::current};
+        #t249.{core::List::add}{Invariant}(#t250);
       }
     }
-  } =>#t253;
+  } =>#t249;
   core::Set<core::int*>* set50 = block {
-    final core::Set<core::int*>* #t255 = new col::_CompactLinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t251 = new col::_CompactLinkedHashSet::•<core::int*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
       core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::int* #t256 = :sync-for-iterator.{core::Iterator::current};
-        #t255.{core::Set::add}(#t256);
+        final core::int* #t252 = :sync-for-iterator.{core::Iterator::current};
+        #t251.{core::Set::add}{Invariant}(#t252);
       }
     }
-    #t255.{core::Set::add}(null);
-  } =>#t255;
+    #t251.{core::Set::add}{Invariant}(null);
+  } =>#t251;
   core::Map<core::String*, core::int*>* map50 = block {
-    final core::Map<core::String*, core::int*>* #t257 = <core::String*, core::int*>{};
+    final core::Map<core::String*, core::int*>* #t253 = <core::String*, core::int*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
       core::Iterator<core::MapEntry<core::String*, core::int*>>* :sync-for-iterator = <core::String*, core::int*>{}.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::MapEntry<core::String*, core::int*>* #t258 = :sync-for-iterator.{core::Iterator::current};
-        #t257.{core::Map::[]=}(#t258.{core::MapEntry::key}, #t258.{core::MapEntry::value});
+        final core::MapEntry<core::String*, core::int*>* #t254 = :sync-for-iterator.{core::Iterator::current};
+        #t253.{core::Map::[]=}{Invariant}(#t254.{core::MapEntry::key}, #t254.{core::MapEntry::value});
       }
     }
-    #t257.{core::Map::[]=}("baz", null);
-  } =>#t257;
+    #t253.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t253;
   core::List<core::int*>* list51 = block {
-    final core::List<core::int*>* #t259 = <core::int*>[];
+    final core::List<core::int*>* #t255 = <core::int*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
-      core::Iterator<core::int*>* :sync-for-iterator = (let final core::Set<core::int*>* #t260 = new col::_CompactLinkedHashSet::•<core::int*>() in #t260).{core::Iterable::iterator};
+      core::Iterator<core::int*>* :sync-for-iterator = ( block {
+        final core::Set<core::int*>* #t256 = new col::_CompactLinkedHashSet::•<core::int*>();
+      } =>#t256).{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::int* #t261 = :sync-for-iterator.{core::Iterator::current};
-        #t259.{core::List::add}(#t261);
+        final core::int* #t257 = :sync-for-iterator.{core::Iterator::current};
+        #t255.{core::List::add}{Invariant}(#t257);
       }
     }
-  } =>#t259;
+  } =>#t255;
   core::Set<core::int*>* set51 = block {
-    final core::Set<core::int*>* #t262 = new col::_CompactLinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t258 = new col::_CompactLinkedHashSet::•<core::int*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
-      core::Iterator<core::int*>* :sync-for-iterator = (let final core::Set<core::int*>* #t263 = new col::_CompactLinkedHashSet::•<core::int*>() in #t263).{core::Iterable::iterator};
+      core::Iterator<core::int*>* :sync-for-iterator = ( block {
+        final core::Set<core::int*>* #t259 = new col::_CompactLinkedHashSet::•<core::int*>();
+      } =>#t259).{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::int* #t264 = :sync-for-iterator.{core::Iterator::current};
-        #t262.{core::Set::add}(#t264);
+        final core::int* #t260 = :sync-for-iterator.{core::Iterator::current};
+        #t258.{core::Set::add}{Invariant}(#t260);
       }
     }
-    #t262.{core::Set::add}(null);
-  } =>#t262;
+    #t258.{core::Set::add}{Invariant}(null);
+  } =>#t258;
   core::List<core::int*>* list52 = block {
-    final core::List<core::int*>* #t265 = <core::int*>[];
+    final core::List<core::int*>* #t261 = <core::int*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
         core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[].{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final core::int* #t266 = :sync-for-iterator.{core::Iterator::current};
-          #t265.{core::List::add}(#t266);
+          final core::int* #t262 = :sync-for-iterator.{core::Iterator::current};
+          #t261.{core::List::add}{Invariant}(#t262);
         }
       }
-  } =>#t265;
+  } =>#t261;
   core::Set<core::int*>* set52 = block {
-    final core::Set<core::int*>* #t267 = new col::_CompactLinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t263 = new col::_CompactLinkedHashSet::•<core::int*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
         core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[].{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final core::int* #t268 = :sync-for-iterator.{core::Iterator::current};
-          #t267.{core::Set::add}(#t268);
+          final core::int* #t264 = :sync-for-iterator.{core::Iterator::current};
+          #t263.{core::Set::add}{Invariant}(#t264);
         }
       }
-    #t267.{core::Set::add}(null);
-  } =>#t267;
+    #t263.{core::Set::add}{Invariant}(null);
+  } =>#t263;
   core::List<core::List<core::int*>*>* list60 = block {
-    final core::List<core::List<core::int*>*>* #t269 = <core::List<core::int*>*>[];
+    final core::List<core::List<core::int*>*>* #t265 = <core::List<core::int*>*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
       core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::List<core::int*>* #t270 = :sync-for-iterator.{core::Iterator::current};
-        #t269.{core::List::add}(#t270);
+        final core::List<core::int*>* #t266 = :sync-for-iterator.{core::Iterator::current};
+        #t265.{core::List::add}{Invariant}(#t266);
       }
     }
-  } =>#t269;
+  } =>#t265;
   core::Set<core::List<core::int*>*>* set60 = block {
-    final core::Set<core::List<core::int*>*>* #t271 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
+    final core::Set<core::List<core::int*>*>* #t267 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
       core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::List<core::int*>* #t272 = :sync-for-iterator.{core::Iterator::current};
-        #t271.{core::Set::add}(#t272);
+        final core::List<core::int*>* #t268 = :sync-for-iterator.{core::Iterator::current};
+        #t267.{core::Set::add}{Invariant}(#t268);
       }
     }
-    #t271.{core::Set::add}(null);
-  } =>#t271;
+    #t267.{core::Set::add}{Invariant}(null);
+  } =>#t267;
   core::Map<core::String*, core::List<core::int*>*>* map60 = block {
-    final core::Map<core::String*, core::List<core::int*>*>* #t273 = <core::String*, core::List<core::int*>*>{};
+    final core::Map<core::String*, core::List<core::int*>*>* #t269 = <core::String*, core::List<core::int*>*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
       core::Iterator<core::MapEntry<core::String*, core::List<core::int*>*>>* :sync-for-iterator = <core::String*, core::List<core::int*>*>{"bar": <core::int*>[]}.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::MapEntry<core::String*, core::List<core::int*>*>* #t274 = :sync-for-iterator.{core::Iterator::current};
-        #t273.{core::Map::[]=}(#t274.{core::MapEntry::key}, #t274.{core::MapEntry::value});
+        final core::MapEntry<core::String*, core::List<core::int*>*>* #t270 = :sync-for-iterator.{core::Iterator::current};
+        #t269.{core::Map::[]=}{Invariant}(#t270.{core::MapEntry::key}, #t270.{core::MapEntry::value});
       }
     }
-    #t273.{core::Map::[]=}("baz", null);
-  } =>#t273;
+    #t269.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t269;
   core::List<core::List<core::int*>*>* list61 = block {
-    final core::List<core::List<core::int*>*>* #t275 = <core::List<core::int*>*>[];
+    final core::List<core::List<core::int*>*>* #t271 = <core::List<core::int*>*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
         core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final core::List<core::int*>* #t276 = :sync-for-iterator.{core::Iterator::current};
-          #t275.{core::List::add}(#t276);
+          final core::List<core::int*>* #t272 = :sync-for-iterator.{core::Iterator::current};
+          #t271.{core::List::add}{Invariant}(#t272);
         }
       }
-  } =>#t275;
+  } =>#t271;
   core::Set<core::List<core::int*>*>* set61 = block {
-    final core::Set<core::List<core::int*>*>* #t277 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
+    final core::Set<core::List<core::int*>*>* #t273 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
         core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final core::List<core::int*>* #t278 = :sync-for-iterator.{core::Iterator::current};
-          #t277.{core::Set::add}(#t278);
+          final core::List<core::int*>* #t274 = :sync-for-iterator.{core::Iterator::current};
+          #t273.{core::Set::add}{Invariant}(#t274);
         }
       }
-    #t277.{core::Set::add}(null);
-  } =>#t277;
+    #t273.{core::Set::add}{Invariant}(null);
+  } =>#t273;
   core::Map<core::String*, core::List<core::int*>*>* map61 = block {
-    final core::Map<core::String*, core::List<core::int*>*>* #t279 = <core::String*, core::List<core::int*>*>{};
+    final core::Map<core::String*, core::List<core::int*>*>* #t275 = <core::String*, core::List<core::int*>*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
         core::Iterator<core::MapEntry<core::String*, core::List<core::int*>*>>* :sync-for-iterator = <core::String*, core::List<core::int*>*>{"bar": <core::int*>[]}.{core::Map::entries}.{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final core::MapEntry<core::String*, core::List<core::int*>*>* #t280 = :sync-for-iterator.{core::Iterator::current};
-          #t279.{core::Map::[]=}(#t280.{core::MapEntry::key}, #t280.{core::MapEntry::value});
+          final core::MapEntry<core::String*, core::List<core::int*>*>* #t276 = :sync-for-iterator.{core::Iterator::current};
+          #t275.{core::Map::[]=}{Invariant}(#t276.{core::MapEntry::key}, #t276.{core::MapEntry::value});
         }
       }
-    #t279.{core::Map::[]=}("baz", null);
-  } =>#t279;
+    #t275.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t275;
   core::List<core::List<core::int*>*>* list70 = block {
-    final core::List<core::List<core::int*>*>* #t281 = <core::List<core::int*>*>[];
+    final core::List<core::List<core::int*>*>* #t277 = <core::List<core::int*>*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      #t281.{core::List::add}(<core::int*>[]);
-  } =>#t281;
+      #t277.{core::List::add}{Invariant}(<core::int*>[]);
+  } =>#t277;
   core::Set<core::List<core::int*>*>* set70 = block {
-    final core::Set<core::List<core::int*>*>* #t282 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
+    final core::Set<core::List<core::int*>*>* #t278 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      #t282.{core::Set::add}(<core::int*>[]);
-    #t282.{core::Set::add}(null);
-  } =>#t282;
+      #t278.{core::Set::add}{Invariant}(<core::int*>[]);
+    #t278.{core::Set::add}{Invariant}(null);
+  } =>#t278;
   core::Map<core::String*, core::List<core::int*>*>* map70 = block {
-    final core::Map<core::String*, core::List<core::int*>*>* #t283 = <core::String*, core::List<core::int*>*>{};
+    final core::Map<core::String*, core::List<core::int*>*>* #t279 = <core::String*, core::List<core::int*>*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      #t283.{core::Map::[]=}("bar", <core::int*>[]);
-    #t283.{core::Map::[]=}("baz", null);
-  } =>#t283;
+      #t279.{core::Map::[]=}{Invariant}("bar", <core::int*>[]);
+    #t279.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t279;
   core::List<core::List<core::int*>*>* list71 = block {
-    final core::List<core::List<core::int*>*>* #t284 = <core::List<core::int*>*>[];
+    final core::List<core::List<core::int*>*>* #t280 = <core::List<core::int*>*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t284.{core::List::add}(<core::int*>[]);
-  } =>#t284;
+        #t280.{core::List::add}{Invariant}(<core::int*>[]);
+  } =>#t280;
   core::Set<core::List<core::int*>*>* set71 = block {
-    final core::Set<core::List<core::int*>*>* #t285 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
+    final core::Set<core::List<core::int*>*>* #t281 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t285.{core::Set::add}(<core::int*>[]);
-    #t285.{core::Set::add}(null);
-  } =>#t285;
+        #t281.{core::Set::add}{Invariant}(<core::int*>[]);
+    #t281.{core::Set::add}{Invariant}(null);
+  } =>#t281;
   core::Map<core::String*, core::List<core::int*>*>* map71 = block {
-    final core::Map<core::String*, core::List<core::int*>*>* #t286 = <core::String*, core::List<core::int*>*>{};
+    final core::Map<core::String*, core::List<core::int*>*>* #t282 = <core::String*, core::List<core::int*>*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t286.{core::Map::[]=}("bar", <core::int*>[]);
-    #t286.{core::Map::[]=}("baz", null);
-  } =>#t286;
+        #t282.{core::Map::[]=}{Invariant}("bar", <core::int*>[]);
+    #t282.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t282;
   core::List<core::num*>* list80 = block {
-    final core::List<core::num*>* #t287 = <core::num*>[];
+    final core::List<core::num*>* #t283 = <core::num*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t287.{core::List::add}(42);
+        #t283.{core::List::add}{Invariant}(42);
       else
-        #t287.{core::List::add}(3.14);
-  } =>#t287;
+        #t283.{core::List::add}{Invariant}(3.14);
+  } =>#t283;
   core::Set<core::num*>* set80 = block {
-    final core::Set<core::num*>* #t288 = new col::_CompactLinkedHashSet::•<core::num*>();
+    final core::Set<core::num*>* #t284 = new col::_CompactLinkedHashSet::•<core::num*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t288.{core::Set::add}(42);
+        #t284.{core::Set::add}{Invariant}(42);
       else
-        #t288.{core::Set::add}(3.14);
-    #t288.{core::Set::add}(null);
-  } =>#t288;
+        #t284.{core::Set::add}{Invariant}(3.14);
+    #t284.{core::Set::add}{Invariant}(null);
+  } =>#t284;
   core::Map<core::String*, core::num*>* map80 = block {
-    final core::Map<core::String*, core::num*>* #t289 = <core::String*, core::num*>{};
+    final core::Map<core::String*, core::num*>* #t285 = <core::String*, core::num*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t289.{core::Map::[]=}("bar", 42);
+        #t285.{core::Map::[]=}{Invariant}("bar", 42);
       else
-        #t289.{core::Map::[]=}("bar", 3.14);
-    #t289.{core::Map::[]=}("baz", null);
-  } =>#t289;
+        #t285.{core::Map::[]=}{Invariant}("bar", 3.14);
+    #t285.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t285;
   core::List<core::num*>* list81 = block {
-    final core::List<core::num*>* #t290 = <core::num*>[];
+    final core::List<core::num*>* #t286 = <core::num*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
         core::Iterator<core::int*>* :sync-for-iterator = listInt.{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+          final core::num* #t287 = :sync-for-iterator.{core::Iterator::current};
+          #t286.{core::List::add}{Invariant}(#t287);
+        }
+      }
+      else {
+        core::Iterator<core::double*>* :sync-for-iterator = listDouble.{core::Iterable::iterator};
+        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+          final core::num* #t288 = :sync-for-iterator.{core::Iterator::current};
+          #t286.{core::List::add}{Invariant}(#t288);
+        }
+      }
+  } =>#t286;
+  core::Set<core::num*>* set81 = block {
+    final core::Set<core::num*>* #t289 = new col::_CompactLinkedHashSet::•<core::num*>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
+        core::Iterator<core::int*>* :sync-for-iterator = listInt.{core::Iterable::iterator};
+        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+          final core::num* #t290 = :sync-for-iterator.{core::Iterator::current};
+          #t289.{core::Set::add}{Invariant}(#t290);
+        }
+      }
+      else {
+        core::Iterator<core::double*>* :sync-for-iterator = listDouble.{core::Iterable::iterator};
+        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
           final core::num* #t291 = :sync-for-iterator.{core::Iterator::current};
-          #t290.{core::List::add}(#t291);
+          #t289.{core::Set::add}{Invariant}(#t291);
         }
       }
-      else {
-        core::Iterator<core::double*>* :sync-for-iterator = listDouble.{core::Iterable::iterator};
-        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final core::num* #t292 = :sync-for-iterator.{core::Iterator::current};
-          #t290.{core::List::add}(#t292);
-        }
-      }
-  } =>#t290;
-  core::Set<core::num*>* set81 = block {
-    final core::Set<core::num*>* #t293 = new col::_CompactLinkedHashSet::•<core::num*>();
-    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
-        core::Iterator<core::int*>* :sync-for-iterator = listInt.{core::Iterable::iterator};
-        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final core::num* #t294 = :sync-for-iterator.{core::Iterator::current};
-          #t293.{core::Set::add}(#t294);
-        }
-      }
-      else {
-        core::Iterator<core::double*>* :sync-for-iterator = listDouble.{core::Iterable::iterator};
-        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final core::num* #t295 = :sync-for-iterator.{core::Iterator::current};
-          #t293.{core::Set::add}(#t295);
-        }
-      }
-    #t293.{core::Set::add}(null);
-  } =>#t293;
+    #t289.{core::Set::add}{Invariant}(null);
+  } =>#t289;
   core::Map<core::String*, core::num*>* map81 = block {
-    final core::Map<core::String*, core::num*>* #t296 = <core::String*, core::num*>{};
+    final core::Map<core::String*, core::num*>* #t292 = <core::String*, core::num*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
         core::Iterator<core::MapEntry<core::String*, core::int*>>* :sync-for-iterator = mapStringInt.{core::Map::entries}.{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final core::MapEntry<core::String*, core::num*>* #t297 = :sync-for-iterator.{core::Iterator::current};
-          #t296.{core::Map::[]=}(#t297.{core::MapEntry::key}, #t297.{core::MapEntry::value});
+          final core::MapEntry<core::String*, core::num*>* #t293 = :sync-for-iterator.{core::Iterator::current};
+          #t292.{core::Map::[]=}{Invariant}(#t293.{core::MapEntry::key}, #t293.{core::MapEntry::value});
         }
       }
       else {
         core::Iterator<core::MapEntry<core::String*, core::double*>>* :sync-for-iterator = mapStringDouble.{core::Map::entries}.{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final core::MapEntry<core::String*, core::num*>* #t298 = :sync-for-iterator.{core::Iterator::current};
-          #t296.{core::Map::[]=}(#t298.{core::MapEntry::key}, #t298.{core::MapEntry::value});
+          final core::MapEntry<core::String*, core::num*>* #t294 = :sync-for-iterator.{core::Iterator::current};
+          #t292.{core::Map::[]=}{Invariant}(#t294.{core::MapEntry::key}, #t294.{core::MapEntry::value});
         }
       }
-    #t296.{core::Map::[]=}("baz", null);
-  } =>#t296;
+    #t292.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t292;
   core::List<dynamic>* list82 = block {
-    final core::List<dynamic>* #t299 = <dynamic>[];
+    final core::List<dynamic>* #t295 = <dynamic>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
         core::Iterator<core::int*>* :sync-for-iterator = listInt.{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+          final dynamic #t296 = :sync-for-iterator.{core::Iterator::current};
+          #t295.{core::List::add}{Invariant}(#t296);
+        }
+      }
+      else {
+        core::Iterator<dynamic>* :sync-for-iterator = (dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*).{core::Iterable::iterator};
+        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+          final dynamic #t297 = :sync-for-iterator.{core::Iterator::current};
+          #t295.{core::List::add}{Invariant}(#t297);
+        }
+      }
+  } =>#t295;
+  core::Set<dynamic>* set82 = block {
+    final core::Set<dynamic>* #t298 = new col::_CompactLinkedHashSet::•<dynamic>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
+        core::Iterator<core::int*>* :sync-for-iterator = listInt.{core::Iterable::iterator};
+        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+          final dynamic #t299 = :sync-for-iterator.{core::Iterator::current};
+          #t298.{core::Set::add}{Invariant}(#t299);
+        }
+      }
+      else {
+        core::Iterator<dynamic>* :sync-for-iterator = (dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*).{core::Iterable::iterator};
+        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
           final dynamic #t300 = :sync-for-iterator.{core::Iterator::current};
-          #t299.{core::List::add}(#t300);
+          #t298.{core::Set::add}{Invariant}(#t300);
         }
       }
-      else {
-        core::Iterator<dynamic>* :sync-for-iterator = (dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*).{core::Iterable::iterator};
-        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final dynamic #t301 = :sync-for-iterator.{core::Iterator::current};
-          #t299.{core::List::add}(#t301);
-        }
-      }
-  } =>#t299;
-  core::Set<dynamic>* set82 = block {
-    final core::Set<dynamic>* #t302 = new col::_CompactLinkedHashSet::•<dynamic>();
-    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
-        core::Iterator<core::int*>* :sync-for-iterator = listInt.{core::Iterable::iterator};
-        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final dynamic #t303 = :sync-for-iterator.{core::Iterator::current};
-          #t302.{core::Set::add}(#t303);
-        }
-      }
-      else {
-        core::Iterator<dynamic>* :sync-for-iterator = (dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*).{core::Iterable::iterator};
-        for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final dynamic #t304 = :sync-for-iterator.{core::Iterator::current};
-          #t302.{core::Set::add}(#t304);
-        }
-      }
-    #t302.{core::Set::add}(null);
-  } =>#t302;
+    #t298.{core::Set::add}{Invariant}(null);
+  } =>#t298;
   core::Map<dynamic, dynamic>* map82 = block {
-    final core::Map<dynamic, dynamic>* #t305 = <dynamic, dynamic>{};
+    final core::Map<dynamic, dynamic>* #t301 = <dynamic, dynamic>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
         core::Iterator<core::MapEntry<core::String*, core::int*>>* :sync-for-iterator = mapStringInt.{core::Map::entries}.{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final core::MapEntry<dynamic, dynamic>* #t306 = :sync-for-iterator.{core::Iterator::current};
-          #t305.{core::Map::[]=}(#t306.{core::MapEntry::key}, #t306.{core::MapEntry::value});
+          final core::MapEntry<dynamic, dynamic>* #t302 = :sync-for-iterator.{core::Iterator::current};
+          #t301.{core::Map::[]=}{Invariant}(#t302.{core::MapEntry::key}, #t302.{core::MapEntry::value});
         }
       }
       else {
         core::Iterator<core::MapEntry<dynamic, dynamic>>* :sync-for-iterator = (dynVar as{TypeError,ForDynamic} core::Map<dynamic, dynamic>*).{core::Map::entries}.{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final core::MapEntry<dynamic, dynamic>* #t307 = :sync-for-iterator.{core::Iterator::current};
-          #t305.{core::Map::[]=}(#t307.{core::MapEntry::key}, #t307.{core::MapEntry::value});
+          final core::MapEntry<dynamic, dynamic>* #t303 = :sync-for-iterator.{core::Iterator::current};
+          #t301.{core::Map::[]=}{Invariant}(#t303.{core::MapEntry::key}, #t303.{core::MapEntry::value});
         }
       }
-    #t305.{core::Map::[]=}("baz", null);
-  } =>#t305;
+    #t301.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t301;
   core::List<core::num*>* list83 = block {
-    final core::List<core::num*>* #t308 = <core::num*>[];
+    final core::List<core::num*>* #t304 = <core::num*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-        #t308.{core::List::add}(42);
+        #t304.{core::List::add}{Invariant}(42);
       else {
         core::Iterator<core::double*>* :sync-for-iterator = listDouble.{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final core::num* #t309 = :sync-for-iterator.{core::Iterator::current};
-          #t308.{core::List::add}(#t309);
+          final core::num* #t305 = :sync-for-iterator.{core::Iterator::current};
+          #t304.{core::List::add}{Invariant}(#t305);
         }
       }
-  } =>#t308;
+  } =>#t304;
   core::Set<core::num*>* set83 = block {
-    final core::Set<core::num*>* #t310 = new col::_CompactLinkedHashSet::•<core::num*>();
+    final core::Set<core::num*>* #t306 = new col::_CompactLinkedHashSet::•<core::num*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
         core::Iterator<core::int*>* :sync-for-iterator = listInt.{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final core::num* #t311 = :sync-for-iterator.{core::Iterator::current};
-          #t310.{core::Set::add}(#t311);
+          final core::num* #t307 = :sync-for-iterator.{core::Iterator::current};
+          #t306.{core::Set::add}{Invariant}(#t307);
         }
       }
       else
-        #t310.{core::Set::add}(3.14);
-    #t310.{core::Set::add}(null);
-  } =>#t310;
+        #t306.{core::Set::add}{Invariant}(3.14);
+    #t306.{core::Set::add}{Invariant}(null);
+  } =>#t306;
   core::Map<core::String*, core::num*>* map83 = block {
-    final core::Map<core::String*, core::num*>* #t312 = <core::String*, core::num*>{};
+    final core::Map<core::String*, core::num*>* #t308 = <core::String*, core::num*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
         core::Iterator<core::MapEntry<core::String*, core::int*>>* :sync-for-iterator = mapStringInt.{core::Map::entries}.{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final core::MapEntry<core::String*, core::num*>* #t313 = :sync-for-iterator.{core::Iterator::current};
-          #t312.{core::Map::[]=}(#t313.{core::MapEntry::key}, #t313.{core::MapEntry::value});
+          final core::MapEntry<core::String*, core::num*>* #t309 = :sync-for-iterator.{core::Iterator::current};
+          #t308.{core::Map::[]=}{Invariant}(#t309.{core::MapEntry::key}, #t309.{core::MapEntry::value});
         }
       }
       else
-        #t312.{core::Map::[]=}("bar", 3.14);
-    #t312.{core::Map::[]=}("baz", null);
-  } =>#t312;
+        #t308.{core::Map::[]=}{Invariant}("bar", 3.14);
+    #t308.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t308;
   core::List<core::int*>* list90 = block {
-    final core::List<core::int*>* #t314 = <core::int*>[];
+    final core::List<core::int*>* #t310 = <core::int*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      #t314.{core::List::add}(dynVar as{TypeError,ForDynamic} core::int*);
-  } =>#t314;
+      #t310.{core::List::add}{Invariant}(dynVar as{TypeError,ForDynamic} core::int*);
+  } =>#t310;
   core::Set<core::int*>* set90 = block {
-    final core::Set<core::int*>* #t315 = new col::_CompactLinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t311 = new col::_CompactLinkedHashSet::•<core::int*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      #t315.{core::Set::add}(dynVar as{TypeError,ForDynamic} core::int*);
-    #t315.{core::Set::add}(null);
-  } =>#t315;
+      #t311.{core::Set::add}{Invariant}(dynVar as{TypeError,ForDynamic} core::int*);
+    #t311.{core::Set::add}{Invariant}(null);
+  } =>#t311;
   core::Map<core::String*, core::int*>* map90 = block {
-    final core::Map<core::String*, core::int*>* #t316 = <core::String*, core::int*>{};
+    final core::Map<core::String*, core::int*>* #t312 = <core::String*, core::int*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-      #t316.{core::Map::[]=}("bar", dynVar as{TypeError,ForDynamic} core::int*);
-    #t316.{core::Map::[]=}("baz", null);
-  } =>#t316;
+      #t312.{core::Map::[]=}{Invariant}("bar", dynVar as{TypeError,ForDynamic} core::int*);
+    #t312.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t312;
   core::List<core::int*>* list91 = block {
-    final core::List<core::int*>* #t317 = <core::int*>[];
+    final core::List<core::int*>* #t313 = <core::int*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
       core::Iterator<dynamic>* :sync-for-iterator = (dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*).{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final dynamic #t318 = :sync-for-iterator.{core::Iterator::current};
+        final dynamic #t314 = :sync-for-iterator.{core::Iterator::current};
         {
-          final core::int* #t319 = #t318 as{TypeError} core::int*;
-          #t317.{core::List::add}(#t319);
+          final core::int* #t315 = #t314 as{TypeError} core::int*;
+          #t313.{core::List::add}{Invariant}(#t315);
         }
       }
     }
-  } =>#t317;
+  } =>#t313;
   core::Set<core::int*>* set91 = block {
-    final core::Set<core::int*>* #t320 = new col::_CompactLinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t316 = new col::_CompactLinkedHashSet::•<core::int*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
       core::Iterator<dynamic>* :sync-for-iterator = (dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*).{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final dynamic #t321 = :sync-for-iterator.{core::Iterator::current};
+        final dynamic #t317 = :sync-for-iterator.{core::Iterator::current};
         {
-          final core::int* #t322 = #t321 as{TypeError} core::int*;
-          #t320.{core::Set::add}(#t322);
+          final core::int* #t318 = #t317 as{TypeError} core::int*;
+          #t316.{core::Set::add}{Invariant}(#t318);
         }
       }
     }
-    #t320.{core::Set::add}(null);
-  } =>#t320;
+    #t316.{core::Set::add}{Invariant}(null);
+  } =>#t316;
   core::Map<core::String*, core::int*>* map91 = block {
-    final core::Map<core::String*, core::int*>* #t323 = <core::String*, core::int*>{};
+    final core::Map<core::String*, core::int*>* #t319 = <core::String*, core::int*>{};
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
       core::Iterator<core::MapEntry<dynamic, dynamic>>* :sync-for-iterator = (dynVar as{TypeError,ForDynamic} core::Map<dynamic, dynamic>*).{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::MapEntry<dynamic, dynamic>* #t324 = :sync-for-iterator.{core::Iterator::current};
+        final core::MapEntry<dynamic, dynamic>* #t320 = :sync-for-iterator.{core::Iterator::current};
         {
-          final core::String* #t325 = #t324.{core::MapEntry::key} as{TypeError} core::String*;
-          final core::int* #t326 = #t324.{core::MapEntry::value} as{TypeError} core::int*;
-          #t323.{core::Map::[]=}(#t325, #t326);
+          final core::String* #t321 = #t320.{core::MapEntry::key} as{TypeError} core::String*;
+          final core::int* #t322 = #t320.{core::MapEntry::value} as{TypeError} core::int*;
+          #t319.{core::Map::[]=}{Invariant}(#t321, #t322);
         }
       }
     }
-    #t323.{core::Map::[]=}("baz", null);
-  } =>#t323;
+    #t319.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t319;
   core::List<core::int*>* list100 = block {
-    final core::List<core::int*>* #t327 = <core::int*>[];
-    for (final core::int* #t328 = index = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; index = index.{core::num::+}(1))
-      #t327.{core::List::add}(42);
-  } =>#t327;
+    final core::List<core::int*>* #t323 = <core::int*>[];
+    for (final core::int* #t324 = index = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; index = index.{core::num::+}(1))
+      #t323.{core::List::add}{Invariant}(42);
+  } =>#t323;
   core::Set<core::int*>* set100 = block {
-    final core::Set<core::int*>* #t329 = new col::_CompactLinkedHashSet::•<core::int*>();
-    for (final core::int* #t330 = index = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; index = index.{core::num::+}(1))
-      #t329.{core::Set::add}(42);
-  } =>#t329;
+    final core::Set<core::int*>* #t325 = new col::_CompactLinkedHashSet::•<core::int*>();
+    for (final core::int* #t326 = index = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; index = index.{core::num::+}(1))
+      #t325.{core::Set::add}{Invariant}(42);
+  } =>#t325;
   core::Map<core::String*, core::int*>* map100 = block {
-    final core::Map<core::String*, core::int*>* #t331 = <core::String*, core::int*>{};
-    for (final core::int* #t332 = index = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; index = index.{core::num::+}(1))
-      #t331.{core::Map::[]=}("bar", 42);
-  } =>#t331;
+    final core::Map<core::String*, core::int*>* #t327 = <core::String*, core::int*>{};
+    for (final core::int* #t328 = index = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; index = index.{core::num::+}(1))
+      #t327.{core::Map::[]=}{Invariant}("bar", 42);
+  } =>#t327;
   core::List<core::int*>* list110 = block {
-    final core::List<core::int*>* #t333 = <core::int*>[];
+    final core::List<core::int*>* #t329 = <core::int*>[];
     {
       core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[1, 2, 3].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         core::int* i = :sync-for-iterator.{core::Iterator::current};
-        #t333.{core::List::add}(i);
+        #t329.{core::List::add}{Invariant}(i);
       }
     }
-  } =>#t333;
+  } =>#t329;
   core::Set<core::int*>* set110 = block {
-    final core::Set<core::int*>* #t334 = new col::_CompactLinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t330 = new col::_CompactLinkedHashSet::•<core::int*>();
     {
       core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[1, 2, 3].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         core::int* i = :sync-for-iterator.{core::Iterator::current};
-        #t334.{core::Set::add}(i);
+        #t330.{core::Set::add}{Invariant}(i);
       }
     }
-    #t334.{core::Set::add}(null);
-  } =>#t334;
+    #t330.{core::Set::add}{Invariant}(null);
+  } =>#t330;
   core::Map<core::String*, core::int*>* map110 = block {
-    final core::Map<core::String*, core::int*>* #t335 = <core::String*, core::int*>{};
+    final core::Map<core::String*, core::int*>* #t331 = <core::String*, core::int*>{};
     {
       core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[1, 2, 3].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         core::int* i = :sync-for-iterator.{core::Iterator::current};
-        #t335.{core::Map::[]=}("bar", i);
+        #t331.{core::Map::[]=}{Invariant}("bar", i);
       }
     }
-    #t335.{core::Map::[]=}("baz", null);
-  } =>#t335;
+    #t331.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t331;
   core::List<core::int*>* list120 = block {
-    final core::List<core::int*>* #t336 = <core::int*>[];
+    final core::List<core::int*>* #t332 = <core::int*>[];
     {
       core::Iterator<dynamic>* :sync-for-iterator = (dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*).{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         dynamic i = :sync-for-iterator.{core::Iterator::current};
-        #t336.{core::List::add}(i as{TypeError,ForDynamic} core::int*);
+        #t332.{core::List::add}{Invariant}(i as{TypeError,ForDynamic} core::int*);
       }
     }
-  } =>#t336;
+  } =>#t332;
   core::Set<core::int*>* set120 = block {
-    final core::Set<core::int*>* #t337 = new col::_CompactLinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t333 = new col::_CompactLinkedHashSet::•<core::int*>();
     {
       core::Iterator<dynamic>* :sync-for-iterator = (dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*).{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         dynamic i = :sync-for-iterator.{core::Iterator::current};
-        #t337.{core::Set::add}(i as{TypeError,ForDynamic} core::int*);
+        #t333.{core::Set::add}{Invariant}(i as{TypeError,ForDynamic} core::int*);
       }
     }
-    #t337.{core::Set::add}(null);
-  } =>#t337;
+    #t333.{core::Set::add}{Invariant}(null);
+  } =>#t333;
   core::Map<core::String*, core::int*>* map120 = block {
-    final core::Map<core::String*, core::int*>* #t338 = <core::String*, core::int*>{};
+    final core::Map<core::String*, core::int*>* #t334 = <core::String*, core::int*>{};
     {
       core::Iterator<dynamic>* :sync-for-iterator = (dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*).{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         dynamic i = :sync-for-iterator.{core::Iterator::current};
-        #t338.{core::Map::[]=}("bar", i as{TypeError,ForDynamic} core::int*);
+        #t334.{core::Map::[]=}{Invariant}("bar", i as{TypeError,ForDynamic} core::int*);
       }
     }
-    #t338.{core::Map::[]=}("baz", null);
-  } =>#t338;
+    #t334.{core::Map::[]=}{Invariant}("baz", null);
+  } =>#t334;
   core::List<core::int*>* list130 = block {
-    final core::List<core::int*>* #t339 = <core::int*>[];
+    final core::List<core::int*>* #t335 = <core::int*>[];
     for (core::int* i = 1; i.{core::num::<}(2); i = i.{core::num::+}(1))
-      #t339.{core::List::add}(i);
-  } =>#t339;
+      #t335.{core::List::add}{Invariant}(i);
+  } =>#t335;
   core::Set<core::int*>* set130 = block {
-    final core::Set<core::int*>* #t340 = new col::_CompactLinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t336 = new col::_CompactLinkedHashSet::•<core::int*>();
     for (core::int* i = 1; i.{core::num::<}(2); i = i.{core::num::+}(1))
-      #t340.{core::Set::add}(i);
-  } =>#t340;
+      #t336.{core::Set::add}{Invariant}(i);
+  } =>#t336;
   core::Map<core::int*, core::int*>* map130 = block {
-    final core::Map<core::int*, core::int*>* #t341 = <core::int*, core::int*>{};
+    final core::Map<core::int*, core::int*>* #t337 = <core::int*, core::int*>{};
     for (core::int* i = 1; i.{core::num::<}(2); i = i.{core::num::+}(1))
-      #t341.{core::Map::[]=}(i, i);
-  } =>#t341;
+      #t337.{core::Map::[]=}{Invariant}(i, i);
+  } =>#t337;
 }
 static method testForElementErrors(core::Map<core::int*, core::int*>* map, core::List<core::int*>* list) → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic>* :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -2335,91 +2356,91 @@
       #L1:
       {
         block {
-          final core::List<core::int*>* #t342 = <core::int*>[];
+          final core::List<core::int*>* #t338 = <core::int*>[];
           for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-            #t342.{core::List::add}(let final<BottomType> #t343 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:212:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+            #t338.{core::List::add}{Invariant}(let final<BottomType> #t339 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:212:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int>[for (int i = 0; oracle(\"foo\"); i++) \"bar\"];
                                             ^" in "bar" as{TypeError} core::int*);
-        } =>#t342;
+        } =>#t338;
         block {
-          final core::Set<core::int*>* #t344 = new col::_CompactLinkedHashSet::•<core::int*>();
+          final core::Set<core::int*>* #t340 = new col::_CompactLinkedHashSet::•<core::int*>();
           for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-            #t344.{core::Set::add}(let final<BottomType> #t345 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:213:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+            #t340.{core::Set::add}{Invariant}(let final<BottomType> #t341 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:213:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int>{for (int i = 0; oracle(\"foo\"); i++) \"bar\", null};
                                             ^" in "bar" as{TypeError} core::int*);
-          #t344.{core::Set::add}(null);
-        } =>#t344;
+          #t340.{core::Set::add}{Invariant}(null);
+        } =>#t340;
         block {
-          final core::Map<core::int*, core::int*>* #t346 = <core::int*, core::int*>{};
+          final core::Map<core::int*, core::int*>* #t342 = <core::int*, core::int*>{};
           for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-            #t346.{core::Map::[]=}(let final<BottomType> #t347 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:214:50: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+            #t342.{core::Map::[]=}{Invariant}(let final<BottomType> #t343 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:214:50: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int, int>{for (int i = 0; oracle(\"foo\"); i++) \"bar\": \"bar\", \"baz\": null};
-                                                 ^" in "bar" as{TypeError} core::int*, let final<BottomType> #t348 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:214:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+                                                 ^" in "bar" as{TypeError} core::int*, let final<BottomType> #t344 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:214:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int, int>{for (int i = 0; oracle(\"foo\"); i++) \"bar\": \"bar\", \"baz\": null};
                                                         ^" in "bar" as{TypeError} core::int*);
-          #t346.{core::Map::[]=}(let final<BottomType> #t349 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:214:64: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+          #t342.{core::Map::[]=}{Invariant}(let final<BottomType> #t345 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:214:64: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int, int>{for (int i = 0; oracle(\"foo\"); i++) \"bar\": \"bar\", \"baz\": null};
                                                                ^" in "baz" as{TypeError} core::int*, null);
-        } =>#t346;
+        } =>#t342;
         block {
-          final core::List<core::int*>* #t350 = <core::int*>[];
+          final core::List<core::int*>* #t346 = <core::int*>[];
           for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
-            core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[let final<BottomType> #t351 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:215:49: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+            core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[let final<BottomType> #t347 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:215:49: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int>[for (int i = 0; oracle(\"foo\"); i++) ...[\"bar\"]];
                                                 ^" in "bar" as{TypeError} core::int*].{core::Iterable::iterator};
             for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-              final core::int* #t352 = :sync-for-iterator.{core::Iterator::current};
-              #t350.{core::List::add}(#t352);
+              final core::int* #t348 = :sync-for-iterator.{core::Iterator::current};
+              #t346.{core::List::add}{Invariant}(#t348);
             }
           }
-        } =>#t350;
+        } =>#t346;
         block {
-          final core::Set<core::int*>* #t353 = new col::_CompactLinkedHashSet::•<core::int*>();
+          final core::Set<core::int*>* #t349 = new col::_CompactLinkedHashSet::•<core::int*>();
           for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
-            core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[let final<BottomType> #t354 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:216:49: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+            core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[let final<BottomType> #t350 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:216:49: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int>{for (int i = 0; oracle(\"foo\"); i++) ...[\"bar\"], null};
                                                 ^" in "bar" as{TypeError} core::int*].{core::Iterable::iterator};
             for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-              final core::int* #t355 = :sync-for-iterator.{core::Iterator::current};
-              #t353.{core::Set::add}(#t355);
+              final core::int* #t351 = :sync-for-iterator.{core::Iterator::current};
+              #t349.{core::Set::add}{Invariant}(#t351);
             }
           }
-          #t353.{core::Set::add}(null);
-        } =>#t353;
+          #t349.{core::Set::add}{Invariant}(null);
+        } =>#t349;
         block {
-          final core::Map<core::int*, core::int*>* #t356 = <core::int*, core::int*>{};
+          final core::Map<core::int*, core::int*>* #t352 = <core::int*, core::int*>{};
           for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
-            core::Iterator<core::MapEntry<core::int*, core::int*>>* :sync-for-iterator = <core::int*, core::int*>{let final<BottomType> #t357 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:217:54: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+            core::Iterator<core::MapEntry<core::int*, core::int*>>* :sync-for-iterator = <core::int*, core::int*>{let final<BottomType> #t353 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:217:54: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int, int>{for (int i = 0; oracle(\"foo\"); i++) ...{\"bar\": \"bar\"}, \"baz\": null};
-                                                     ^" in "bar" as{TypeError} core::int*: let final<BottomType> #t358 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:217:61: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+                                                     ^" in "bar" as{TypeError} core::int*: let final<BottomType> #t354 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:217:61: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int, int>{for (int i = 0; oracle(\"foo\"); i++) ...{\"bar\": \"bar\"}, \"baz\": null};
                                                             ^" in "bar" as{TypeError} core::int*}.{core::Map::entries}.{core::Iterable::iterator};
             for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-              final core::MapEntry<core::int*, core::int*>* #t359 = :sync-for-iterator.{core::Iterator::current};
-              #t356.{core::Map::[]=}(#t359.{core::MapEntry::key}, #t359.{core::MapEntry::value});
+              final core::MapEntry<core::int*, core::int*>* #t355 = :sync-for-iterator.{core::Iterator::current};
+              #t352.{core::Map::[]=}{Invariant}(#t355.{core::MapEntry::key}, #t355.{core::MapEntry::value});
             }
           }
-          #t356.{core::Map::[]=}(let final<BottomType> #t360 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:217:69: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+          #t352.{core::Map::[]=}{Invariant}(let final<BottomType> #t356 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:217:69: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int, int>{for (int i = 0; oracle(\"foo\"); i++) ...{\"bar\": \"bar\"}, \"baz\": null};
                                                                     ^" in "baz" as{TypeError} core::int*, null);
-        } =>#t356;
+        } =>#t352;
         block {
-          final core::List<core::int*>* #t361 = <core::int*>[];
+          final core::List<core::int*>* #t357 = <core::int*>[];
           for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-            #t361.{core::List::add}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:218:48: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+            #t357.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:218:48: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
   <int>[for (int i = 0; oracle(\"foo\"); i++) ...map];
                                                ^");
-        } =>#t361;
+        } =>#t357;
         block {
-          final core::Set<core::int*>* #t362 = new col::_CompactLinkedHashSet::•<core::int*>();
+          final core::Set<core::int*>* #t358 = new col::_CompactLinkedHashSet::•<core::int*>();
           for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
-            #t362.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:219:48: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+            #t358.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:219:48: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
   <int>{for (int i = 0; oracle(\"foo\"); i++) ...map, null};
                                                ^");
-          #t362.{core::Set::add}(null);
-        } =>#t362;
+          #t358.{core::Set::add}{Invariant}(null);
+        } =>#t358;
         <core::int*, core::int*>{invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:220:53: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
  - 'List' is from 'dart:core'.
   <int, int>{for (int i = 0; oracle(\"foo\"); i++) ...list, 42: null};
@@ -2428,66 +2449,66 @@
   <int, int>{for (int i = 0; oracle(\"foo\"); i++) ...list, 42: null};
                                                     ^": null};
         block {
-          final core::List<core::String*>* #t363 = <core::String*>[];
+          final core::List<core::String*>* #t359 = <core::String*>[];
           for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
             if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-              #t363.{core::List::add}(let final<BottomType> #t364 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:221:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+              #t359.{core::List::add}{Invariant}(let final<BottomType> #t360 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:221:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
   <String>[for (int i = 0; oracle(\"foo\"); i++) if (oracle()) 42 else 3.14];
                                                              ^" in 42 as{TypeError} core::String*);
             else
-              #t363.{core::List::add}(let final<BottomType> #t365 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:221:70: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
+              #t359.{core::List::add}{Invariant}(let final<BottomType> #t361 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:221:70: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
   <String>[for (int i = 0; oracle(\"foo\"); i++) if (oracle()) 42 else 3.14];
                                                                      ^" in 3.14 as{TypeError} core::String*);
-        } =>#t363;
+        } =>#t359;
         block {
-          final core::Set<core::String*>* #t366 = new col::_CompactLinkedHashSet::•<core::String*>();
+          final core::Set<core::String*>* #t362 = new col::_CompactLinkedHashSet::•<core::String*>();
           for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
             if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-              #t366.{core::Set::add}(let final<BottomType> #t367 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:222:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+              #t362.{core::Set::add}{Invariant}(let final<BottomType> #t363 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:222:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
   <String>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) 42 else 3.14, null};
                                                              ^" in 42 as{TypeError} core::String*);
             else
-              #t366.{core::Set::add}(let final<BottomType> #t368 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:222:70: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
+              #t362.{core::Set::add}{Invariant}(let final<BottomType> #t364 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:222:70: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
   <String>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) 42 else 3.14, null};
                                                                      ^" in 3.14 as{TypeError} core::String*);
-          #t366.{core::Set::add}(null);
-        } =>#t366;
+          #t362.{core::Set::add}{Invariant}(null);
+        } =>#t362;
         block {
-          final core::Map<core::String*, core::String*>* #t369 = <core::String*, core::String*>{};
+          final core::Map<core::String*, core::String*>* #t365 = <core::String*, core::String*>{};
           for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
             if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-              #t369.{core::Map::[]=}("bar", let final<BottomType> #t370 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:223:77: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+              #t365.{core::Map::[]=}{Invariant}("bar", let final<BottomType> #t366 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:223:77: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
   <String, String>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) \"bar\": 42 else \"bar\": 3.14, \"baz\": null};
                                                                             ^" in 42 as{TypeError} core::String*);
             else
-              #t369.{core::Map::[]=}("bar", let final<BottomType> #t371 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:223:92: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
+              #t365.{core::Map::[]=}{Invariant}("bar", let final<BottomType> #t367 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:223:92: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
   <String, String>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) \"bar\": 42 else \"bar\": 3.14, \"baz\": null};
                                                                                            ^" in 3.14 as{TypeError} core::String*);
-          #t369.{core::Map::[]=}("baz", null);
-        } =>#t369;
+          #t365.{core::Map::[]=}{Invariant}("baz", null);
+        } =>#t365;
         block {
-          final core::List<core::int*>* #t372 = <core::int*>[];
+          final core::List<core::int*>* #t368 = <core::int*>[];
           for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
             if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-              #t372.{core::List::add}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:224:62: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+              #t368.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:224:62: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
   <int>[for (int i = 0; oracle(\"foo\"); i++) if (oracle()) ...map else 42];
                                                              ^");
             else
-              #t372.{core::List::add}(42);
-        } =>#t372;
+              #t368.{core::List::add}{Invariant}(42);
+        } =>#t368;
         block {
-          final core::Set<core::int*>* #t373 = new col::_CompactLinkedHashSet::•<core::int*>();
+          final core::Set<core::int*>* #t369 = new col::_CompactLinkedHashSet::•<core::int*>();
           for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
             if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-              #t373.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:225:62: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+              #t369.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:225:62: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
   <int>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) ...map else 42, null};
                                                              ^");
             else
-              #t373.{core::Set::add}(42);
-          #t373.{core::Set::add}(null);
-        } =>#t373;
+              #t369.{core::Set::add}{Invariant}(42);
+          #t369.{core::Set::add}{Invariant}(null);
+        } =>#t369;
         <core::String*, core::int*>{invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:226:70: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
  - 'List' is from 'dart:core'.
   <String, int>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) ...list else \"bar\": 42, \"baz\": null};
@@ -2496,28 +2517,28 @@
   <String, int>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) ...list else \"bar\": 42, \"baz\": null};
                                                                      ^": null};
         block {
-          final core::List<core::int*>* #t374 = <core::int*>[];
+          final core::List<core::int*>* #t370 = <core::int*>[];
           for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
             if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-              #t374.{core::List::add}(42);
+              #t370.{core::List::add}{Invariant}(42);
             else
-              #t374.{core::List::add}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:227:70: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+              #t370.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:227:70: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
   <int>[for (int i = 0; oracle(\"foo\"); i++) if (oracle()) 42 else ...map];
                                                                      ^");
-        } =>#t374;
+        } =>#t370;
         block {
-          final core::Set<core::int*>* #t375 = new col::_CompactLinkedHashSet::•<core::int*>();
+          final core::Set<core::int*>* #t371 = new col::_CompactLinkedHashSet::•<core::int*>();
           for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
             if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
-              #t375.{core::Set::add}(42);
+              #t371.{core::Set::add}{Invariant}(42);
             else
-              #t375.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:228:70: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+              #t371.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:228:70: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
   <int>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) 42 else ...map, null};
                                                                      ^");
-          #t375.{core::Set::add}(null);
-        } =>#t375;
+          #t371.{core::Set::add}{Invariant}(null);
+        } =>#t371;
         <core::String*, core::int*>{invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:229:85: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
  - 'List' is from 'dart:core'.
   <String, int>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) \"bar\": 42 else ...list, \"baz\": null};
@@ -2527,396 +2548,391 @@
                                                                                     ^": null};
         final core::int* i = 0;
         block {
-          final core::List<core::int*>* #t376 = <core::int*>[];
+          final core::List<core::int*>* #t372 = <core::int*>[];
+          {
+            core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[1].{core::Iterable::iterator};
+            for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+              final core::int* #t373 = :sync-for-iterator.{core::Iterator::current};
+              {
+                invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:232:14: Error: Can't assign to the final variable 'i'.
+  <int>[for (i in <int>[1]) i];
+             ^";
+                #t372.{core::List::add}{Invariant}(i);
+              }
+            }
+          }
+        } =>#t372;
+        block {
+          final core::Set<core::int*>* #t374 = new col::_CompactLinkedHashSet::•<core::int*>();
+          {
+            core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[1].{core::Iterable::iterator};
+            for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+              final core::int* #t375 = :sync-for-iterator.{core::Iterator::current};
+              {
+                invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:233:14: Error: Can't assign to the final variable 'i'.
+  <int>{for (i in <int>[1]) i, null};
+             ^";
+                #t374.{core::Set::add}{Invariant}(i);
+              }
+            }
+          }
+          #t374.{core::Set::add}{Invariant}(null);
+        } =>#t374;
+        block {
+          final core::Map<core::String*, core::int*>* #t376 = <core::String*, core::int*>{};
           {
             core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[1].{core::Iterable::iterator};
             for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
               final core::int* #t377 = :sync-for-iterator.{core::Iterator::current};
               {
-                invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:232:14: Error: Can't assign to the final variable 'i'.
-  <int>[for (i in <int>[1]) i];
-             ^";
-                #t376.{core::List::add}(i);
-              }
-            }
-          }
-        } =>#t376;
-        block {
-          final core::Set<core::int*>* #t378 = new col::_CompactLinkedHashSet::•<core::int*>();
-          {
-            core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[1].{core::Iterable::iterator};
-            for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-              final core::int* #t379 = :sync-for-iterator.{core::Iterator::current};
-              {
-                invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:233:14: Error: Can't assign to the final variable 'i'.
-  <int>{for (i in <int>[1]) i, null};
-             ^";
-                #t378.{core::Set::add}(i);
-              }
-            }
-          }
-          #t378.{core::Set::add}(null);
-        } =>#t378;
-        block {
-          final core::Map<core::String*, core::int*>* #t380 = <core::String*, core::int*>{};
-          {
-            core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[1].{core::Iterable::iterator};
-            for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-              final core::int* #t381 = :sync-for-iterator.{core::Iterator::current};
-              {
                 invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:234:21: Error: Can't assign to the final variable 'i'.
 \t<String, int>{for (i in <int>[1]) \"bar\": i, \"baz\": null};
 \t                   ^";
-                #t380.{core::Map::[]=}("bar", i);
+                #t376.{core::Map::[]=}{Invariant}("bar", i);
               }
             }
           }
-          #t380.{core::Map::[]=}("baz", null);
-        } =>#t380;
+          #t376.{core::Map::[]=}{Invariant}("baz", null);
+        } =>#t376;
         core::List<dynamic>* list10 = block {
-          final core::List<dynamic>* #t382 = <dynamic>[];
+          final core::List<dynamic>* #t378 = <dynamic>[];
           {
-            core::Iterator<dynamic>* :sync-for-iterator = (let final<BottomType> #t383 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:236:31: Error: The type 'String' used in the 'for' loop must implement 'Iterable<dynamic>'.
+            core::Iterator<dynamic>* :sync-for-iterator = (let final<BottomType> #t379 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:236:31: Error: The type 'String' used in the 'for' loop must implement 'Iterable<dynamic>'.
  - 'Iterable' is from 'dart:core'.
   var list10 = [for (var i in \"not iterable\") i];
                               ^" in "not iterable" as{TypeError} core::Iterable<dynamic>*).{core::Iterable::iterator};
             for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
               dynamic i = :sync-for-iterator.{core::Iterator::current};
-              #t382.{core::List::add}(i);
+              #t378.{core::List::add}{Invariant}(i);
             }
           }
-        } =>#t382;
+        } =>#t378;
         core::Set<dynamic>* set10 = block {
-          final core::Set<dynamic>* #t384 = new col::_CompactLinkedHashSet::•<dynamic>();
+          final core::Set<dynamic>* #t380 = new col::_CompactLinkedHashSet::•<dynamic>();
           {
-            core::Iterator<dynamic>* :sync-for-iterator = (let final<BottomType> #t385 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:237:30: Error: The type 'String' used in the 'for' loop must implement 'Iterable<dynamic>'.
+            core::Iterator<dynamic>* :sync-for-iterator = (let final<BottomType> #t381 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:237:30: Error: The type 'String' used in the 'for' loop must implement 'Iterable<dynamic>'.
  - 'Iterable' is from 'dart:core'.
   var set10 = {for (var i in \"not iterable\") i, null};
                              ^" in "not iterable" as{TypeError} core::Iterable<dynamic>*).{core::Iterable::iterator};
             for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
               dynamic i = :sync-for-iterator.{core::Iterator::current};
-              #t384.{core::Set::add}(i);
+              #t380.{core::Set::add}{Invariant}(i);
             }
           }
-          #t384.{core::Set::add}(null);
-        } =>#t384;
+          #t380.{core::Set::add}{Invariant}(null);
+        } =>#t380;
         core::Map<core::String*, dynamic>* map10 = block {
-          final core::Map<core::String*, dynamic>* #t386 = <core::String*, dynamic>{};
+          final core::Map<core::String*, dynamic>* #t382 = <core::String*, dynamic>{};
           {
-            core::Iterator<dynamic>* :sync-for-iterator = (let final<BottomType> #t387 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:238:30: Error: The type 'String' used in the 'for' loop must implement 'Iterable<dynamic>'.
+            core::Iterator<dynamic>* :sync-for-iterator = (let final<BottomType> #t383 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:238:30: Error: The type 'String' used in the 'for' loop must implement 'Iterable<dynamic>'.
  - 'Iterable' is from 'dart:core'.
   var map10 = {for (var i in \"not iterable\") \"bar\": i, \"baz\": null};
                              ^" in "not iterable" as{TypeError} core::Iterable<dynamic>*).{core::Iterable::iterator};
             for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
               dynamic i = :sync-for-iterator.{core::Iterator::current};
-              #t386.{core::Map::[]=}("bar", i);
+              #t382.{core::Map::[]=}{Invariant}("bar", i);
             }
           }
-          #t386.{core::Map::[]=}("baz", null);
-        } =>#t386;
+          #t382.{core::Map::[]=}{Invariant}("baz", null);
+        } =>#t382;
         core::List<core::int*>* list20 = block {
-          final core::List<core::int*>* #t388 = <core::int*>[];
+          final core::List<core::int*>* #t384 = <core::int*>[];
           {
-            core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[let final<BottomType> #t389 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:239:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+            core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[let final<BottomType> #t385 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:239:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   var list20 = [for (int i in [\"not\", \"int\"]) i];
-                               ^" in "not" as{TypeError} core::int*, let final<BottomType> #t390 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:239:39: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+                               ^" in "not" as{TypeError} core::int*, let final<BottomType> #t386 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:239:39: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   var list20 = [for (int i in [\"not\", \"int\"]) i];
                                       ^" in "int" as{TypeError} core::int*].{core::Iterable::iterator};
             for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
               core::int* i = :sync-for-iterator.{core::Iterator::current};
-              #t388.{core::List::add}(i);
+              #t384.{core::List::add}{Invariant}(i);
             }
           }
-        } =>#t388;
+        } =>#t384;
         core::Set<core::int*>* set20 = block {
-          final core::Set<core::int*>* #t391 = new col::_CompactLinkedHashSet::•<core::int*>();
+          final core::Set<core::int*>* #t387 = new col::_CompactLinkedHashSet::•<core::int*>();
           {
-            core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[let final<BottomType> #t392 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:240:31: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+            core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[let final<BottomType> #t388 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:240:31: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   var set20 = {for (int i in [\"not\", \"int\"]) i, null};
-                              ^" in "not" as{TypeError} core::int*, let final<BottomType> #t393 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:240:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+                              ^" in "not" as{TypeError} core::int*, let final<BottomType> #t389 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:240:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   var set20 = {for (int i in [\"not\", \"int\"]) i, null};
                                      ^" in "int" as{TypeError} core::int*].{core::Iterable::iterator};
             for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
               core::int* i = :sync-for-iterator.{core::Iterator::current};
-              #t391.{core::Set::add}(i);
+              #t387.{core::Set::add}{Invariant}(i);
             }
           }
-          #t391.{core::Set::add}(null);
-        } =>#t391;
+          #t387.{core::Set::add}{Invariant}(null);
+        } =>#t387;
         core::Map<core::String*, core::int*>* map20 = block {
-          final core::Map<core::String*, core::int*>* #t394 = <core::String*, core::int*>{};
+          final core::Map<core::String*, core::int*>* #t390 = <core::String*, core::int*>{};
           {
-            core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[let final<BottomType> #t395 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:241:31: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+            core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[let final<BottomType> #t391 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:241:31: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   var map20 = {for (int i in [\"not\", \"int\"]) \"bar\": i, \"baz\": null};
-                              ^" in "not" as{TypeError} core::int*, let final<BottomType> #t396 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:241:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+                              ^" in "not" as{TypeError} core::int*, let final<BottomType> #t392 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:241:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   var map20 = {for (int i in [\"not\", \"int\"]) \"bar\": i, \"baz\": null};
                                      ^" in "int" as{TypeError} core::int*].{core::Iterable::iterator};
             for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
               core::int* i = :sync-for-iterator.{core::Iterator::current};
-              #t394.{core::Map::[]=}("bar", i);
+              #t390.{core::Map::[]=}{Invariant}("bar", i);
             }
           }
-          #t394.{core::Map::[]=}("baz", null);
-        } =>#t394;
-        final core::List<dynamic>* #t397 = <dynamic>[];
+          #t390.{core::Map::[]=}{Invariant}("baz", null);
+        } =>#t390;
+        final core::List<dynamic>* #t393 = <dynamic>[];
         {
-          asy::Stream<dynamic>* :stream = let final<BottomType> #t398 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:242:37: Error: The type 'String' used in the 'for' loop must implement 'Stream<dynamic>'.
+          asy::Stream<dynamic>* :stream = let final<BottomType> #t394 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:242:37: Error: The type 'String' used in the 'for' loop must implement 'Stream<dynamic>'.
  - 'Stream' is from 'dart:async'.
   var list30 = [await for (var i in \"not stream\") i];
                                     ^" in "not stream" as{TypeError} asy::Stream<dynamic>*;
-          asy::_asyncStarListenHelper(:stream, :async_op);
           asy::_StreamIterator<dynamic>* :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
           try
             #L2:
             while (true) {
-              dynamic #t399 = asy::_asyncStarMoveNextHelper(:stream);
-              [yield] let dynamic #t400 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
+              dynamic #t395 = asy::_asyncStarMoveNextHelper(:stream);
+              [yield] let dynamic #t396 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
               if(_in::unsafeCast<core::bool>(:result)) {
                 dynamic i = :for-iterator.{asy::_StreamIterator::current};
-                #t397.{core::List::add}(i);
+                #t393.{core::List::add}{Invariant}(i);
               }
               else
                 break #L2;
             }
           finally
             if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
-              [yield] let dynamic #t401 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
+              [yield] let dynamic #t397 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
               :result;
             }
         }
-        core::List<dynamic>* list30 = block {} =>#t397;
-        final core::Set<dynamic>* #t402 = new col::_CompactLinkedHashSet::•<dynamic>();
+        core::List<dynamic>* list30 = block {} =>#t393;
+        final core::Set<dynamic>* #t398 = new col::_CompactLinkedHashSet::•<dynamic>();
         {
-          asy::Stream<dynamic>* :stream = let final<BottomType> #t403 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:243:36: Error: The type 'String' used in the 'for' loop must implement 'Stream<dynamic>'.
+          asy::Stream<dynamic>* :stream = let final<BottomType> #t399 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:243:36: Error: The type 'String' used in the 'for' loop must implement 'Stream<dynamic>'.
  - 'Stream' is from 'dart:async'.
   var set30 = {await for (var i in \"not stream\") i, null};
                                    ^" in "not stream" as{TypeError} asy::Stream<dynamic>*;
-          asy::_asyncStarListenHelper(:stream, :async_op);
           asy::_StreamIterator<dynamic>* :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
           try
             #L3:
             while (true) {
-              dynamic #t404 = asy::_asyncStarMoveNextHelper(:stream);
-              [yield] let dynamic #t405 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
+              dynamic #t400 = asy::_asyncStarMoveNextHelper(:stream);
+              [yield] let dynamic #t401 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
               if(_in::unsafeCast<core::bool>(:result)) {
                 dynamic i = :for-iterator.{asy::_StreamIterator::current};
-                #t402.{core::Set::add}(i);
+                #t398.{core::Set::add}{Invariant}(i);
               }
               else
                 break #L3;
             }
           finally
             if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
-              [yield] let dynamic #t406 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
+              [yield] let dynamic #t402 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
               :result;
             }
         }
         core::Set<dynamic>* set30 = block {
-          #t402.{core::Set::add}(null);
-        } =>#t402;
-        final core::Map<core::String*, dynamic>* #t407 = <core::String*, dynamic>{};
+          #t398.{core::Set::add}{Invariant}(null);
+        } =>#t398;
+        final core::Map<core::String*, dynamic>* #t403 = <core::String*, dynamic>{};
         {
-          asy::Stream<dynamic>* :stream = let final<BottomType> #t408 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:244:36: Error: The type 'String' used in the 'for' loop must implement 'Stream<dynamic>'.
+          asy::Stream<dynamic>* :stream = let final<BottomType> #t404 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:244:36: Error: The type 'String' used in the 'for' loop must implement 'Stream<dynamic>'.
  - 'Stream' is from 'dart:async'.
   var map30 = {await for (var i in \"not stream\") \"bar\": i, \"baz\": null};
                                    ^" in "not stream" as{TypeError} asy::Stream<dynamic>*;
-          asy::_asyncStarListenHelper(:stream, :async_op);
           asy::_StreamIterator<dynamic>* :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
           try
             #L4:
             while (true) {
-              dynamic #t409 = asy::_asyncStarMoveNextHelper(:stream);
-              [yield] let dynamic #t410 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
+              dynamic #t405 = asy::_asyncStarMoveNextHelper(:stream);
+              [yield] let dynamic #t406 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
               if(_in::unsafeCast<core::bool>(:result)) {
                 dynamic i = :for-iterator.{asy::_StreamIterator::current};
-                #t407.{core::Map::[]=}("bar", i);
+                #t403.{core::Map::[]=}{Invariant}("bar", i);
               }
               else
                 break #L4;
             }
           finally
             if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
-              [yield] let dynamic #t411 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
+              [yield] let dynamic #t407 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
               :result;
             }
         }
         core::Map<core::String*, dynamic>* map30 = block {
-          #t407.{core::Map::[]=}("baz", null);
-        } =>#t407;
-        final core::List<core::int*>* #t412 = <core::int*>[];
+          #t403.{core::Map::[]=}{Invariant}("baz", null);
+        } =>#t403;
+        final core::List<core::int*>* #t408 = <core::int*>[];
         {
-          asy::Stream<core::int*> :stream = asy::Stream::fromIterable<core::int*>(<core::int*>[let final<BottomType> #t413 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:245:58: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+          asy::Stream<core::int*> :stream = asy::Stream::fromIterable<core::int*>(<core::int*>[let final<BottomType> #t409 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:245:58: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   var list40 = [await for (int i in Stream.fromIterable([\"not\", \"int\"])) i];
-                                                         ^" in "not" as{TypeError} core::int*, let final<BottomType> #t414 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:245:65: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+                                                         ^" in "not" as{TypeError} core::int*, let final<BottomType> #t410 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:245:65: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   var list40 = [await for (int i in Stream.fromIterable([\"not\", \"int\"])) i];
                                                                 ^" in "int" as{TypeError} core::int*]);
-          asy::_asyncStarListenHelper(:stream, :async_op);
           asy::_StreamIterator<core::int*>* :for-iterator = new asy::_StreamIterator::•<core::int*>(:stream);
           try
             #L5:
             while (true) {
-              dynamic #t415 = asy::_asyncStarMoveNextHelper(:stream);
-              [yield] let dynamic #t416 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
+              dynamic #t411 = asy::_asyncStarMoveNextHelper(:stream);
+              [yield] let dynamic #t412 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
               if(_in::unsafeCast<core::bool>(:result)) {
                 core::int* i = :for-iterator.{asy::_StreamIterator::current};
-                #t412.{core::List::add}(i);
+                #t408.{core::List::add}{Invariant}(i);
               }
               else
                 break #L5;
             }
           finally
             if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
-              [yield] let dynamic #t417 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
+              [yield] let dynamic #t413 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
               :result;
             }
         }
-        core::List<core::int*>* list40 = block {} =>#t412;
-        final core::Set<core::int*>* #t418 = new col::_CompactLinkedHashSet::•<core::int*>();
+        core::List<core::int*>* list40 = block {} =>#t408;
+        final core::Set<core::int*>* #t414 = new col::_CompactLinkedHashSet::•<core::int*>();
         {
-          asy::Stream<core::int*> :stream = asy::Stream::fromIterable<core::int*>(<core::int*>[let final<BottomType> #t419 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:246:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+          asy::Stream<core::int*> :stream = asy::Stream::fromIterable<core::int*>(<core::int*>[let final<BottomType> #t415 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:246:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   var set40 = {await for (int i in Stream.fromIterable([\"not\", \"int\"])) i, null};
-                                                        ^" in "not" as{TypeError} core::int*, let final<BottomType> #t420 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:246:64: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+                                                        ^" in "not" as{TypeError} core::int*, let final<BottomType> #t416 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:246:64: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   var set40 = {await for (int i in Stream.fromIterable([\"not\", \"int\"])) i, null};
                                                                ^" in "int" as{TypeError} core::int*]);
-          asy::_asyncStarListenHelper(:stream, :async_op);
           asy::_StreamIterator<core::int*>* :for-iterator = new asy::_StreamIterator::•<core::int*>(:stream);
           try
             #L6:
             while (true) {
-              dynamic #t421 = asy::_asyncStarMoveNextHelper(:stream);
-              [yield] let dynamic #t422 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
+              dynamic #t417 = asy::_asyncStarMoveNextHelper(:stream);
+              [yield] let dynamic #t418 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
               if(_in::unsafeCast<core::bool>(:result)) {
                 core::int* i = :for-iterator.{asy::_StreamIterator::current};
-                #t418.{core::Set::add}(i);
+                #t414.{core::Set::add}{Invariant}(i);
               }
               else
                 break #L6;
             }
           finally
             if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
-              [yield] let dynamic #t423 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
+              [yield] let dynamic #t419 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
               :result;
             }
         }
         core::Set<core::int*>* set40 = block {
-          #t418.{core::Set::add}(null);
-        } =>#t418;
-        final core::Map<core::String*, core::int*>* #t424 = <core::String*, core::int*>{};
+          #t414.{core::Set::add}{Invariant}(null);
+        } =>#t414;
+        final core::Map<core::String*, core::int*>* #t420 = <core::String*, core::int*>{};
         {
-          asy::Stream<core::int*> :stream = asy::Stream::fromIterable<core::int*>(<core::int*>[let final<BottomType> #t425 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:247:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+          asy::Stream<core::int*> :stream = asy::Stream::fromIterable<core::int*>(<core::int*>[let final<BottomType> #t421 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:247:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   var map40 = {await for (int i in Stream.fromIterable([\"not\", \"int\"])) \"bar\": i, \"baz\": null};
-                                                        ^" in "not" as{TypeError} core::int*, let final<BottomType> #t426 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:247:64: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+                                                        ^" in "not" as{TypeError} core::int*, let final<BottomType> #t422 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:247:64: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   var map40 = {await for (int i in Stream.fromIterable([\"not\", \"int\"])) \"bar\": i, \"baz\": null};
                                                                ^" in "int" as{TypeError} core::int*]);
-          asy::_asyncStarListenHelper(:stream, :async_op);
           asy::_StreamIterator<core::int*>* :for-iterator = new asy::_StreamIterator::•<core::int*>(:stream);
           try
             #L7:
             while (true) {
-              dynamic #t427 = asy::_asyncStarMoveNextHelper(:stream);
-              [yield] let dynamic #t428 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
+              dynamic #t423 = asy::_asyncStarMoveNextHelper(:stream);
+              [yield] let dynamic #t424 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
               if(_in::unsafeCast<core::bool>(:result)) {
                 core::int* i = :for-iterator.{asy::_StreamIterator::current};
-                #t424.{core::Map::[]=}("bar", i);
+                #t420.{core::Map::[]=}{Invariant}("bar", i);
               }
               else
                 break #L7;
             }
           finally
             if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
-              [yield] let dynamic #t429 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
+              [yield] let dynamic #t425 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
               :result;
             }
         }
         core::Map<core::String*, core::int*>* map40 = block {
-          #t424.{core::Map::[]=}("baz", null);
-        } =>#t424;
+          #t420.{core::Map::[]=}{Invariant}("baz", null);
+        } =>#t420;
         core::List<core::int*>* list50 = block {
-          final core::List<core::int*>* #t430 = <core::int*>[];
+          final core::List<core::int*>* #t426 = <core::int*>[];
           for (; ; )
-            #t430.{core::List::add}(42);
-        } =>#t430;
+            #t426.{core::List::add}{Invariant}(42);
+        } =>#t426;
         core::Set<core::int*>* set50 = block {
-          final core::Set<core::int*>* #t431 = new col::_CompactLinkedHashSet::•<core::int*>();
+          final core::Set<core::int*>* #t427 = new col::_CompactLinkedHashSet::•<core::int*>();
           for (; ; )
-            #t431.{core::Set::add}(42);
-          #t431.{core::Set::add}(null);
-        } =>#t431;
+            #t427.{core::Set::add}{Invariant}(42);
+          #t427.{core::Set::add}{Invariant}(null);
+        } =>#t427;
         core::Map<core::String*, core::int*>* map50 = block {
-          final core::Map<core::String*, core::int*>* #t432 = <core::String*, core::int*>{};
+          final core::Map<core::String*, core::int*>* #t428 = <core::String*, core::int*>{};
           for (; ; )
-            #t432.{core::Map::[]=}("bar", 42);
-          #t432.{core::Map::[]=}("baz", null);
-        } =>#t432;
+            #t428.{core::Map::[]=}{Invariant}("bar", 42);
+          #t428.{core::Map::[]=}{Invariant}("baz", null);
+        } =>#t428;
         core::List<core::int*>* list60 = block {
-          final core::List<core::int*>* #t433 = <core::int*>[];
-          for (; let final<BottomType> #t434 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:251:24: Error: A value of type 'String' can't be assigned to a variable of type 'bool'.
+          final core::List<core::int*>* #t429 = <core::int*>[];
+          for (; let final<BottomType> #t430 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:251:24: Error: A value of type 'String' can't be assigned to a variable of type 'bool'.
   var list60 = [for (; \"not bool\";) 42];
                        ^" in "not bool" as{TypeError} core::bool*; )
-            #t433.{core::List::add}(42);
-        } =>#t433;
+            #t429.{core::List::add}{Invariant}(42);
+        } =>#t429;
         core::Set<core::int*>* set60 = block {
-          final core::Set<core::int*>* #t435 = new col::_CompactLinkedHashSet::•<core::int*>();
-          for (; let final<BottomType> #t436 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:252:23: Error: A value of type 'String' can't be assigned to a variable of type 'bool'.
+          final core::Set<core::int*>* #t431 = new col::_CompactLinkedHashSet::•<core::int*>();
+          for (; let final<BottomType> #t432 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:252:23: Error: A value of type 'String' can't be assigned to a variable of type 'bool'.
   var set60 = {for (; \"not bool\";) 42, null};
                       ^" in "not bool" as{TypeError} core::bool*; )
-            #t435.{core::Set::add}(42);
-          #t435.{core::Set::add}(null);
-        } =>#t435;
+            #t431.{core::Set::add}{Invariant}(42);
+          #t431.{core::Set::add}{Invariant}(null);
+        } =>#t431;
         core::Map<core::String*, core::int*>* map60 = block {
-          final core::Map<core::String*, core::int*>* #t437 = <core::String*, core::int*>{};
-          for (; let final<BottomType> #t438 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:253:23: Error: A value of type 'String' can't be assigned to a variable of type 'bool'.
+          final core::Map<core::String*, core::int*>* #t433 = <core::String*, core::int*>{};
+          for (; let final<BottomType> #t434 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:253:23: Error: A value of type 'String' can't be assigned to a variable of type 'bool'.
   var map60 = {for (; \"not bool\";) \"bar\": 42, \"baz\": null};
                       ^" in "not bool" as{TypeError} core::bool*; )
-            #t437.{core::Map::[]=}("bar", 42);
-          #t437.{core::Map::[]=}("baz", null);
-        } =>#t437;
+            #t433.{core::Map::[]=}{Invariant}("bar", 42);
+          #t433.{core::Map::[]=}{Invariant}("baz", null);
+        } =>#t433;
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method testForElementErrorsNotAsync(asy::Stream<core::int*>* stream) → dynamic {
   block {
-    final core::List<core::int*>* #t439 = <core::int*>[];
+    final core::List<core::int*>* #t435 = <core::int*>[];
     await for (core::int* i in stream)
-      #t439.{core::List::add}(i);
-  } =>#t439;
+      #t435.{core::List::add}{Invariant}(i);
+  } =>#t435;
   block {
-    final core::Set<core::int*>* #t440 = new col::_CompactLinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t436 = new col::_CompactLinkedHashSet::•<core::int*>();
     await for (core::int* i in stream)
-      #t440.{core::Set::add}(i);
-  } =>#t440;
+      #t436.{core::Set::add}{Invariant}(i);
+  } =>#t436;
   block {
-    final core::Map<core::String*, core::int*>* #t441 = <core::String*, core::int*>{};
+    final core::Map<core::String*, core::int*>* #t437 = <core::String*, core::int*>{};
     await for (core::int* i in stream)
-      #t441.{core::Map::[]=}("bar", i);
-  } =>#t441;
+      #t437.{core::Map::[]=}{Invariant}("bar", i);
+  } =>#t437;
 }
 static method testPromotion(self::A* a) → dynamic {
   core::List<core::int*>* list10 = block {
-    final core::List<core::int*>* #t442 = <core::int*>[];
+    final core::List<core::int*>* #t438 = <core::int*>[];
     if(a is self::B*)
-      #t442.{core::List::add}(a{self::B*}.{self::B::foo});
-  } =>#t442;
+      #t438.{core::List::add}{Invariant}(a{self::B*}.{self::B::foo});
+  } =>#t438;
   core::Set<core::int*>* set10 = block {
-    final core::Set<core::int*>* #t443 = new col::_CompactLinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t439 = new col::_CompactLinkedHashSet::•<core::int*>();
     if(a is self::B*)
-      #t443.{core::Set::add}(a{self::B*}.{self::B::foo});
-  } =>#t443;
+      #t439.{core::Set::add}{Invariant}(a{self::B*}.{self::B::foo});
+  } =>#t439;
   core::Map<core::int*, core::int*>* map10 = block {
-    final core::Map<core::int*, core::int*>* #t444 = <core::int*, core::int*>{};
+    final core::Map<core::int*, core::int*>* #t440 = <core::int*, core::int*>{};
     if(a is self::B*)
-      #t444.{core::Map::[]=}(a{self::B*}.{self::B::foo}, a{self::B*}.{self::B::foo});
-  } =>#t444;
+      #t440.{core::Map::[]=}{Invariant}(a{self::B*}.{self::B::foo}, a{self::B*}.{self::B::foo});
+  } =>#t440;
 }
 static method main() → dynamic {}
 
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/covariant_generic.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/covariant_generic.dart.weak.expect
index 7c34544..48b1bf5 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/covariant_generic.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/covariant_generic.dart.weak.expect
@@ -28,22 +28,22 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 static method main() → dynamic {
-  self::Foo<core::int*>* fooInt = new self::Foo::•<core::int*>(1, (core::int* x) → core::Null? {});
+  self::Foo<core::int*>* fooInt = new self::Foo::•<core::int*>(1, (core::int* x) → Null {});
   fooInt.{self::Foo::method}(3);
   fooInt.{self::Foo::setter} = 3;
-  fooInt.{self::Foo::withCallback}((core::int* x) → core::Null? {});
-  fooInt.{self::Foo::withCallback}((core::num* x) → core::Null? {});
+  fooInt.{self::Foo::withCallback}((core::int* x) → Null {});
+  fooInt.{self::Foo::withCallback}((core::num* x) → Null {});
   fooInt.{self::Foo::mutableField} = 3;
-  fooInt.{self::Foo::mutableCallbackField} = (core::int* x) → core::Null? {};
+  fooInt.{self::Foo::mutableCallbackField} = (core::int* x) → Null {};
   self::Foo<core::num*>* fooNum = fooInt;
   fooNum.{self::Foo::method}(3);
   fooNum.{self::Foo::method}(2.5);
   fooNum.{self::Foo::setter} = 3;
   fooNum.{self::Foo::setter} = 2.5;
-  fooNum.{self::Foo::withCallback}((core::num* x) → core::Null? {});
+  fooNum.{self::Foo::withCallback}((core::num* x) → Null {});
   fooNum.{self::Foo::mutableField} = 3;
   fooNum.{self::Foo::mutableField} = 2.5;
   let final self::Foo<core::num*>* #t1 = fooNum in let final core::int* #t2 = 3 in (#t1.{self::Foo::mutableCallbackField} as{TypeError,CovarianceCheck} (core::num*) →* void).call(#t2);
   let final self::Foo<core::num*>* #t3 = fooNum in let final core::double* #t4 = 2.5 in (#t3.{self::Foo::mutableCallbackField} as{TypeError,CovarianceCheck} (core::num*) →* void).call(#t4);
-  fooNum.{self::Foo::mutableCallbackField} = (core::num* x) → core::Null? {};
+  fooNum.{self::Foo::mutableCallbackField} = (core::num* x) → Null {};
 }
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/covariant_generic.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/covariant_generic.dart.weak.transformed.expect
index 5707da5..bcccf29 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/covariant_generic.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/covariant_generic.dart.weak.transformed.expect
@@ -28,24 +28,24 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 static method main() → dynamic {
-  self::Foo<core::int*>* fooInt = new self::Foo::•<core::int*>(1, (core::int* x) → core::Null? {});
+  self::Foo<core::int*>* fooInt = new self::Foo::•<core::int*>(1, (core::int* x) → Null {});
   fooInt.{self::Foo::method}(3);
   fooInt.{self::Foo::setter} = 3;
-  fooInt.{self::Foo::withCallback}((core::int* x) → core::Null? {});
-  fooInt.{self::Foo::withCallback}((core::num* x) → core::Null? {});
+  fooInt.{self::Foo::withCallback}((core::int* x) → Null {});
+  fooInt.{self::Foo::withCallback}((core::num* x) → Null {});
   fooInt.{self::Foo::mutableField} = 3;
-  fooInt.{self::Foo::mutableCallbackField} = (core::int* x) → core::Null? {};
+  fooInt.{self::Foo::mutableCallbackField} = (core::int* x) → Null {};
   self::Foo<core::num*>* fooNum = fooInt;
   fooNum.{self::Foo::method}(3);
   fooNum.{self::Foo::method}(2.5);
   fooNum.{self::Foo::setter} = 3;
   fooNum.{self::Foo::setter} = 2.5;
-  fooNum.{self::Foo::withCallback}((core::num* x) → core::Null? {});
+  fooNum.{self::Foo::withCallback}((core::num* x) → Null {});
   fooNum.{self::Foo::mutableField} = 3;
   fooNum.{self::Foo::mutableField} = 2.5;
   let final self::Foo<core::num*>* #t1 = fooNum in let final core::int* #t2 = 3 in (#t1.{self::Foo::mutableCallbackField} as{TypeError,CovarianceCheck} (core::num*) →* void).call(#t2);
   let final self::Foo<core::num*>* #t3 = fooNum in let final core::double* #t4 = 2.5 in (#t3.{self::Foo::mutableCallbackField} as{TypeError,CovarianceCheck} (core::num*) →* void).call(#t4);
-  fooNum.{self::Foo::mutableCallbackField} = (core::num* x) → core::Null? {};
+  fooNum.{self::Foo::mutableCallbackField} = (core::num* x) → Null {};
 }
 
 
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/error_locations/error_location_05.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/error_locations/error_location_05.dart.weak.expect
index b2251bc..51baa0f 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/error_locations/error_location_05.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/error_locations/error_location_05.dart.weak.expect
@@ -17,12 +17,11 @@
 //     ^
 //
 import self as self;
-import "dart:core" as core;
 
 part error_location_05_lib1.dart;
 static method /* from org-dartlang-testcase:///error_location_05_lib1.dart */ x1(dynamic z, {dynamic z = #C1}) → dynamic {}
 static method /* from org-dartlang-testcase:///error_location_05_lib1.dart */ x2() → dynamic {
-  function y(dynamic z, {dynamic z = #C1}) → core::Null? {}
+  function y(dynamic z, {dynamic z = #C1}) → Null {}
 }
 
 constants  {
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/error_locations/error_location_05.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/error_locations/error_location_05.dart.weak.transformed.expect
index b2251bc..51baa0f 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/error_locations/error_location_05.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/error_locations/error_location_05.dart.weak.transformed.expect
@@ -17,12 +17,11 @@
 //     ^
 //
 import self as self;
-import "dart:core" as core;
 
 part error_location_05_lib1.dart;
 static method /* from org-dartlang-testcase:///error_location_05_lib1.dart */ x1(dynamic z, {dynamic z = #C1}) → dynamic {}
 static method /* from org-dartlang-testcase:///error_location_05_lib1.dart */ x2() → dynamic {
-  function y(dynamic z, {dynamic z = #C1}) → core::Null? {}
+  function y(dynamic z, {dynamic z = #C1}) → Null {}
 }
 
 constants  {
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/error_locations/error_location_06.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/error_locations/error_location_06.dart.weak.expect
index c50067b..eafc70a 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/error_locations/error_location_06.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/error_locations/error_location_06.dart.weak.expect
@@ -17,12 +17,11 @@
 //     ^
 //
 import self as self;
-import "dart:core" as core;
 
 part error_location_06_lib1.dart;
 static method /* from org-dartlang-testcase:///error_location_06_lib1.dart */ x1(dynamic z, {dynamic z = #C1}) → dynamic {}
 static method /* from org-dartlang-testcase:///error_location_06_lib1.dart */ x2() → dynamic {
-  function y(dynamic z, {dynamic z = #C1}) → core::Null? {}
+  function y(dynamic z, {dynamic z = #C1}) → Null {}
 }
 
 constants  {
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/error_locations/error_location_06.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/error_locations/error_location_06.dart.weak.transformed.expect
index c50067b..eafc70a 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/error_locations/error_location_06.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/error_locations/error_location_06.dart.weak.transformed.expect
@@ -17,12 +17,11 @@
 //     ^
 //
 import self as self;
-import "dart:core" as core;
 
 part error_location_06_lib1.dart;
 static method /* from org-dartlang-testcase:///error_location_06_lib1.dart */ x1(dynamic z, {dynamic z = #C1}) → dynamic {}
 static method /* from org-dartlang-testcase:///error_location_06_lib1.dart */ x2() → dynamic {
-  function y(dynamic z, {dynamic z = #C1}) → core::Null? {}
+  function y(dynamic z, {dynamic z = #C1}) → Null {}
 }
 
 constants  {
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/expressions.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/expressions.dart.weak.expect
index 5c1a339..9b072b2 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/expressions.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/expressions.dart.weak.expect
@@ -51,31 +51,31 @@
   core::print(#C2);
   core::print(core::List::•<core::String*>(2).{core::Object::runtimeType});
   self::foo(fisk: "Blorp gulp");
-  function f() → core::Null? {
+  function f() → Null {
     core::print("f was called");
   }
   self::caller(f);
-  self::caller(() → core::Null? {
+  self::caller(() → Null {
     core::print("<anon> was called");
   });
-  function g([dynamic message = #C1]) → core::Null? {
+  function g([dynamic message = #C1]) → Null {
     core::print(message);
   }
   g.call("Hello, World");
-  self::caller(([dynamic x = #C1]) → core::Null? {
+  self::caller(([dynamic x = #C1]) → Null {
     core::print("<anon> was called with ${x}");
   });
-  function h({dynamic message = #C1}) → core::Null? {
+  function h({dynamic message = #C1}) → Null {
     core::print(message);
   }
   h.call(message: "Hello, World");
-  self::caller(({dynamic x = #C1}) → core::Null? {
+  self::caller(({dynamic x = #C1}) → Null {
     core::print("<anon> was called with ${x}");
   });
-  core::print(core::int*.{core::Object::toString}());
+  core::print(core::int*.{core::Type::toString}());
   core::print(core::int*);
   core::print(let final core::Type* #t5 = core::int* in block {
-    #t5.{core::Object::toString}();
+    #t5.{core::Type::toString}();
   } =>#t5);
   try {
     core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/expressions.dart:76:16: Error: Method not found: 'int.toString'.
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/expressions.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/expressions.dart.weak.transformed.expect
index 4796426..e1c2ce2 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/expressions.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/expressions.dart.weak.transformed.expect
@@ -51,31 +51,31 @@
   core::print(#C2);
   core::print(core::_List::•<core::String*>(2).{core::Object::runtimeType});
   self::foo(fisk: "Blorp gulp");
-  function f() → core::Null? {
+  function f() → Null {
     core::print("f was called");
   }
   self::caller(f);
-  self::caller(() → core::Null? {
+  self::caller(() → Null {
     core::print("<anon> was called");
   });
-  function g([dynamic message = #C1]) → core::Null? {
+  function g([dynamic message = #C1]) → Null {
     core::print(message);
   }
   g.call("Hello, World");
-  self::caller(([dynamic x = #C1]) → core::Null? {
+  self::caller(([dynamic x = #C1]) → Null {
     core::print("<anon> was called with ${x}");
   });
-  function h({dynamic message = #C1}) → core::Null? {
+  function h({dynamic message = #C1}) → Null {
     core::print(message);
   }
   h.call(message: "Hello, World");
-  self::caller(({dynamic x = #C1}) → core::Null? {
+  self::caller(({dynamic x = #C1}) → Null {
     core::print("<anon> was called with ${x}");
   });
-  core::print(core::int*.{core::Object::toString}());
+  core::print(core::int*.{core::Type::toString}());
   core::print(core::int*);
   core::print(let final core::Type* #t5 = core::int* in block {
-    #t5.{core::Object::toString}();
+    #t5.{core::Type::toString}();
   } =>#t5);
   try {
     core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/expressions.dart:76:16: Error: Method not found: 'int.toString'.
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/ffi_sample.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/ffi_sample.dart.weak.expect
index 0e669c0..a853421 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/ffi_sample.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/ffi_sample.dart.weak.expect
@@ -20,7 +20,7 @@
       #t1.{self::Coordinate::next} = next;
     } =>#t1;
   }
-  abstract member-signature get _addressOf() → ffi::Pointer<ffi::Struct*>*; -> ffi::Struct::_addressOf
+  abstract member-signature get _addressOf() → core::Object*; -> ffi::Struct::_addressOf
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/ffi_sample.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/ffi_sample.dart.weak.transformed.expect
index c402dca..324ae5f 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/ffi_sample.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/ffi_sample.dart.weak.transformed.expect
@@ -8,9 +8,10 @@
 import "package:ffi/ffi.dart";
 
 @#C3
+@#C8
 class Coordinate extends ffi::Struct {
   @#C3
-  static final field core::int* #sizeOf = (#C6).{core::List::[]}(ffi::_abi());
+  static final field core::int* #sizeOf = (#C11).{core::List::[]}(ffi::_abi());
   @#C3
   constructor #fromPointer(dynamic #pointer) → dynamic
     : super ffi::Struct::_fromPointer(#pointer)
@@ -22,7 +23,7 @@
       #t1.{self::Coordinate::next} = next;
     } =>#t1;
   }
-  abstract member-signature get _addressOf() → ffi::Pointer<ffi::Struct*>*; -> ffi::Struct::_addressOf
+  abstract member-signature get _addressOf() → core::Object*; -> ffi::Struct::_addressOf
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -34,17 +35,17 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
   get x() → core::double*
-    return ffi::_loadDouble(this.{ffi::Struct::_addressOf}, (#C8).{core::List::[]}(ffi::_abi()));
+    return ffi::_loadDouble(this.{ffi::Struct::_addressOf}, (#C13).{core::List::[]}(ffi::_abi()));
   set x(core::double* #v) → void
-    return ffi::_storeDouble(this.{ffi::Struct::_addressOf}, (#C8).{core::List::[]}(ffi::_abi()), #v);
+    return ffi::_storeDouble(this.{ffi::Struct::_addressOf}, (#C13).{core::List::[]}(ffi::_abi()), #v);
   get y() → core::double*
-    return ffi::_loadDouble(this.{ffi::Struct::_addressOf}, (#C10).{core::List::[]}(ffi::_abi()));
+    return ffi::_loadDouble(this.{ffi::Struct::_addressOf}, (#C15).{core::List::[]}(ffi::_abi()));
   set y(core::double* #v) → void
-    return ffi::_storeDouble(this.{ffi::Struct::_addressOf}, (#C10).{core::List::[]}(ffi::_abi()), #v);
+    return ffi::_storeDouble(this.{ffi::Struct::_addressOf}, (#C15).{core::List::[]}(ffi::_abi()), #v);
   get next() → ffi::Pointer<self::Coordinate*>*
-    return ffi::_fromAddress<self::Coordinate*>(ffi::_loadIntPtr(this.{ffi::Struct::_addressOf}, (#C12).{core::List::[]}(ffi::_abi())));
+    return ffi::_fromAddress<self::Coordinate*>(ffi::_loadIntPtr(this.{ffi::Struct::_addressOf}, (#C17).{core::List::[]}(ffi::_abi())));
   set next(ffi::Pointer<self::Coordinate*>* #v) → void
-    return ffi::_storeIntPtr(this.{ffi::Struct::_addressOf}, (#C12).{core::List::[]}(ffi::_abi()), #v.{ffi::Pointer::address});
+    return ffi::_storeIntPtr(this.{ffi::Struct::_addressOf}, (#C17).{core::List::[]}(ffi::_abi()), #v.{ffi::Pointer::address});
 }
 static method main() → dynamic {}
 
@@ -52,13 +53,18 @@
   #C1 = "vm:entry-point"
   #C2 = null
   #C3 = core::pragma {name:#C1, options:#C2}
-  #C4 = 24
-  #C5 = 20
-  #C6 = <core::int*>[#C4, #C5, #C4]
-  #C7 = 0
-  #C8 = <core::int*>[#C7, #C7, #C7]
-  #C9 = 8
-  #C10 = <core::int*>[#C9, #C9, #C9]
-  #C11 = 16
-  #C12 = <core::int*>[#C11, #C11, #C11]
+  #C4 = "vm:ffi:struct-fields"
+  #C5 = TypeLiteralConstant(ffi::Double)
+  #C6 = TypeLiteralConstant(ffi::Pointer<ffi::NativeType>)
+  #C7 = <core::Type>[#C5, #C5, #C6]
+  #C8 = core::pragma {name:#C4, options:#C7}
+  #C9 = 24
+  #C10 = 20
+  #C11 = <core::int*>[#C9, #C10, #C9]
+  #C12 = 0
+  #C13 = <core::int*>[#C12, #C12, #C12]
+  #C14 = 8
+  #C15 = <core::int*>[#C14, #C14, #C14]
+  #C16 = 16
+  #C17 = <core::int*>[#C16, #C16, #C16]
 }
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/function_type_is_check.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/function_type_is_check.dart.weak.expect
index 9279097..3e17d2c 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/function_type_is_check.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/function_type_is_check.dart.weak.expect
@@ -14,5 +14,5 @@
     return 100;
 }
 static method main() → dynamic {
-  exp::Expect::equals(111, self::test(() → core::Null? => null).+(self::test((core::Object* o) → core::Null? => null)).+(self::test((core::Object* o, core::StackTrace* t) → core::Null? => null)));
+  exp::Expect::equals(111, self::test(() → Null => null).+(self::test((core::Object* o) → Null => null)).+(self::test((core::Object* o, core::StackTrace* t) → Null => null)));
 }
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/function_type_is_check.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/function_type_is_check.dart.weak.transformed.expect
index 9279097..3e17d2c 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/function_type_is_check.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/function_type_is_check.dart.weak.transformed.expect
@@ -14,5 +14,5 @@
     return 100;
 }
 static method main() → dynamic {
-  exp::Expect::equals(111, self::test(() → core::Null? => null).+(self::test((core::Object* o) → core::Null? => null)).+(self::test((core::Object* o, core::StackTrace* t) → core::Null? => null)));
+  exp::Expect::equals(111, self::test(() → Null => null).+(self::test((core::Object* o) → Null => null)).+(self::test((core::Object* o, core::StackTrace* t) → Null => null)));
 }
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/functions.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/functions.dart.weak.expect
index f6f35ca..c10936d 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/functions.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/functions.dart.weak.expect
@@ -7,7 +7,7 @@
     f.call(a: "Hello, World");
     f.call();
   }
-  local.call(({dynamic a = #C1}) → core::Null? {
+  local.call(({dynamic a = #C1}) → Null {
     core::print(a);
   });
 }
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/functions.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/functions.dart.weak.transformed.expect
index f6f35ca..c10936d 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/functions.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/functions.dart.weak.transformed.expect
@@ -7,7 +7,7 @@
     f.call(a: "Hello, World");
     f.call();
   }
-  local.call(({dynamic a = #C1}) → core::Null? {
+  local.call(({dynamic a = #C1}) → Null {
     core::print(a);
   });
 }
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/future_or_null_test.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/future_or_null_test.dart.weak.expect
index 9a73a4f..040f77f 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/future_or_null_test.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/future_or_null_test.dart.weak.expect
@@ -1,9 +1,8 @@
 library;
 import self as self;
-import "dart:core" as core;
 
 import "dart:async";
 
-static get foo() → FutureOr<core::Null?>*
+static get foo() → FutureOr<Null>*
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/future_or_null_test.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/future_or_null_test.dart.weak.transformed.expect
index 9a73a4f..040f77f 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/future_or_null_test.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/future_or_null_test.dart.weak.transformed.expect
@@ -1,9 +1,8 @@
 library;
 import self as self;
-import "dart:core" as core;
 
 import "dart:async";
 
-static get foo() → FutureOr<core::Null?>*
+static get foo() → FutureOr<Null>*
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/future_or_test.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/future_or_test.dart.weak.transformed.expect
index 64daac2..a4ac3f4 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/future_or_test.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/future_or_test.dart.weak.transformed.expect
@@ -28,7 +28,8 @@
     : super core::Object::•()
     ;
   method bar() → asy::Future<dynamic>* /* originally async */ {
-    final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    final asy::_Future<dynamic>* :async_future = new asy::_Future::•<dynamic>();
+    core::bool* :is_sync = false;
     FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -42,17 +43,18 @@
           :return_value = this.{self::B::a}.{self::A::foo}();
           break #L1;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   }
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -71,7 +73,8 @@
     : super core::Object::•()
     ;
   method baz() → asy::Future<core::int*>* /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    final asy::_Future<core::int*>* :async_future = new asy::_Future::•<core::int*>();
+    core::bool* :is_sync = false;
     FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -85,17 +88,18 @@
           :return_value = this.{self::C::b}.{self::B::bar}() as{TypeError} FutureOr<core::int*>*;
           break #L2;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   }
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/if_null_in_set_literal.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/if_null_in_set_literal.dart.weak.expect
index c644985..bbc6109 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/if_null_in_set_literal.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/if_null_in_set_literal.dart.weak.expect
@@ -6,5 +6,8 @@
 static method main() → dynamic {
   core::Object* a;
   core::Object* b;
-  return let final core::Set<core::Object*>* #t1 = col::LinkedHashSet::•<core::Object*>() in let final dynamic #t2 = #t1.{core::Set::add}(let final core::Object* #t3 = a in #t3.{core::Object::==}(null) ?{core::Object*} b : #t3) in #t1;
+  return block {
+    final core::Set<core::Object*>* #t1 = col::LinkedHashSet::•<core::Object*>();
+    #t1.{core::Set::add}{Invariant}(let final core::Object* #t2 = a in #t2.{core::Object::==}(null) ?{core::Object*} b : #t2);
+  } =>#t1;
 }
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/if_null_in_set_literal.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/if_null_in_set_literal.dart.weak.transformed.expect
index ac2c29c..637e41b 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/if_null_in_set_literal.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/if_null_in_set_literal.dart.weak.transformed.expect
@@ -6,5 +6,8 @@
 static method main() → dynamic {
   core::Object* a;
   core::Object* b;
-  return let final core::Set<core::Object*>* #t1 = new col::_CompactLinkedHashSet::•<core::Object*>() in let final core::bool #t2 = #t1.{core::Set::add}(let final core::Object* #t3 = a in #t3.{core::Object::==}(null) ?{core::Object*} b : #t3) in #t1;
+  return block {
+    final core::Set<core::Object*>* #t1 = new col::_CompactLinkedHashSet::•<core::Object*>();
+    #t1.{core::Set::add}{Invariant}(let final core::Object* #t2 = a in #t2.{core::Object::==}(null) ?{core::Object*} b : #t2);
+  } =>#t1;
 }
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/illegal_named_function_expression.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/illegal_named_function_expression.dart.weak.expect
index 9951e94..0681005 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/illegal_named_function_expression.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/illegal_named_function_expression.dart.weak.expect
@@ -14,7 +14,7 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  <T extends core::Object* = dynamic>(T*) →* core::Null? x = let final <T extends core::Object* = dynamic>(T*) →* core::Null? f = <T extends core::Object* = dynamic>(T* t) → core::Null? {} in f;
+  <T extends core::Object* = dynamic>(T*) →* Null x = let final <T extends core::Object* = dynamic>(T*) →* Null f = <T extends core::Object* = dynamic>(T* t) → Null {} in f;
   core::print(x.{core::Object::runtimeType});
-  core::print(let final <T extends core::Object* = dynamic>(T*) →* core::Null? g = <T extends core::Object* = dynamic>(T* t) → core::Null? {} in g);
+  core::print(let final <T extends core::Object* = dynamic>(T*) →* Null g = <T extends core::Object* = dynamic>(T* t) → Null {} in g);
 }
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/illegal_named_function_expression.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/illegal_named_function_expression.dart.weak.transformed.expect
index 9951e94..0681005 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/illegal_named_function_expression.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/illegal_named_function_expression.dart.weak.transformed.expect
@@ -14,7 +14,7 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  <T extends core::Object* = dynamic>(T*) →* core::Null? x = let final <T extends core::Object* = dynamic>(T*) →* core::Null? f = <T extends core::Object* = dynamic>(T* t) → core::Null? {} in f;
+  <T extends core::Object* = dynamic>(T*) →* Null x = let final <T extends core::Object* = dynamic>(T*) →* Null f = <T extends core::Object* = dynamic>(T* t) → Null {} in f;
   core::print(x.{core::Object::runtimeType});
-  core::print(let final <T extends core::Object* = dynamic>(T*) →* core::Null? g = <T extends core::Object* = dynamic>(T* t) → core::Null? {} in g);
+  core::print(let final <T extends core::Object* = dynamic>(T*) →* Null g = <T extends core::Object* = dynamic>(T* t) → Null {} in g);
 }
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/illegal_named_function_expression_scope.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/illegal_named_function_expression_scope.dart.weak.expect
index b4e24a2..215b3e3 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/illegal_named_function_expression_scope.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/illegal_named_function_expression_scope.dart.weak.expect
@@ -11,5 +11,5 @@
 
 static method main() → dynamic {
   function f() → void {}
-  core::print(let final () →* core::Null? f = () → core::Null? {} in f);
+  core::print(let final () →* Null f = () → Null {} in f);
 }
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/illegal_named_function_expression_scope.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/illegal_named_function_expression_scope.dart.weak.transformed.expect
index b4e24a2..215b3e3 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/illegal_named_function_expression_scope.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/illegal_named_function_expression_scope.dart.weak.transformed.expect
@@ -11,5 +11,5 @@
 
 static method main() → dynamic {
   function f() → void {}
-  core::print(let final () →* core::Null? f = () → core::Null? {} in f);
+  core::print(let final () →* Null f = () → Null {} in f);
 }
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/issue37027.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/issue37027.dart.weak.expect
index 09fd889..d66702b 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/issue37027.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/issue37027.dart.weak.expect
@@ -10,7 +10,7 @@
       final core::Set<core::int*>* #t1 = col::LinkedHashSet::•<core::int*>();
       for (core::int* e in ell)
         if(e.{core::int::isOdd})
-          #t1.{core::Set::add}(2.{core::num::*}(e));
+          #t1.{core::Set::add}{Invariant}(2.{core::num::*}(e));
     } =>#t1, super core::Object::•()
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/issue37027.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/issue37027.dart.weak.transformed.expect
index bc72e7f..fa88301 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/issue37027.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/issue37027.dart.weak.transformed.expect
@@ -13,7 +13,7 @@
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
           core::int* e = :sync-for-iterator.{core::Iterator::current};
           if(e.{core::int::isOdd})
-            #t1.{core::Set::add}(2.{core::num::*}(e));
+            #t1.{core::Set::add}{Invariant}(2.{core::num::*}(e));
         }
       }
     } =>#t1, super core::Object::•()
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/issue39344.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/issue39344.dart.weak.expect
index d10b917..7874ca5 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/issue39344.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/issue39344.dart.weak.expect
@@ -91,11 +91,11 @@
 static field core::List<self::B*>* xs;
 static field core::List<core::List<self::B*>*>* xss;
 static method main() → void {
-  self::throws(() → core::Null? {
+  self::throws(() → Null {
     new self::Class::•<self::A*>().{self::Class::method2a}(new self::B::•());
     core::print(self::xs.{core::Object::runtimeType});
   });
-  self::throws(() → core::Null? {
+  self::throws(() → Null {
     new self::Class::•<self::A*>().{self::Class::method2b}(new self::B::•());
     core::print(self::xs.{core::Object::runtimeType});
   });
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/issue39344.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/issue39344.dart.weak.transformed.expect
index d10b917..7874ca5 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/issue39344.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/issue39344.dart.weak.transformed.expect
@@ -91,11 +91,11 @@
 static field core::List<self::B*>* xs;
 static field core::List<core::List<self::B*>*>* xss;
 static method main() → void {
-  self::throws(() → core::Null? {
+  self::throws(() → Null {
     new self::Class::•<self::A*>().{self::Class::method2a}(new self::B::•());
     core::print(self::xs.{core::Object::runtimeType});
   });
-  self::throws(() → core::Null? {
+  self::throws(() → Null {
     new self::Class::•<self::A*>().{self::Class::method2b}(new self::B::•());
     core::print(self::xs.{core::Object::runtimeType});
   });
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/issue39421.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/issue39421.dart.weak.expect
index ddd4406..c9cb480 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/issue39421.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/issue39421.dart.weak.expect
@@ -57,7 +57,7 @@
   synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  method foo(core::List<core::Null?>* a) → dynamic {}
+  method foo(core::List<Null>* a) → dynamic {}
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/issue39421.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/issue39421.dart.weak.transformed.expect
index ddd4406..c9cb480 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/issue39421.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/issue39421.dart.weak.transformed.expect
@@ -57,7 +57,7 @@
   synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  method foo(core::List<core::Null?>* a) → dynamic {}
+  method foo(core::List<Null>* a) → dynamic {}
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/issue39817.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/issue39817.dart.weak.expect
index 217fc5e..cad4f51 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/issue39817.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/issue39817.dart.weak.expect
@@ -1,9 +1,8 @@
 library;
 import self as self;
-import "dart:core" as core;
 
 static method foo() → dynamic {
-  core::Null? _null;
+  Null _null;
   for (dynamic i in _null) {
   }
   ;
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/issue39817.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/issue39817.dart.weak.transformed.expect
index da4a799..cad4f51 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/issue39817.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/issue39817.dart.weak.transformed.expect
@@ -1,15 +1,9 @@
 library;
 import self as self;
-import "dart:core" as core;
 
 static method foo() → dynamic {
-  core::Null? _null;
-  {
-    core::Iterator<core::Null?>* :sync-for-iterator = _null.{core::Iterable::iterator};
-    for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-      dynamic i = :sync-for-iterator.{core::Iterator::current};
-      {}
-    }
+  Null _null;
+  for (dynamic i in _null) {
   }
   ;
 }
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/long_chain_of_typedefs.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/long_chain_of_typedefs.dart.weak.expect
index e62ba24..10636b1 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/long_chain_of_typedefs.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/long_chain_of_typedefs.dart.weak.expect
@@ -2,24 +2,24 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Foo01<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (core::Null?) →* void;
-typedef Foo02<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((core::Null?) →* void) →* void;
-typedef Foo03<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((core::Null?) →* void) →* void) →* void;
-typedef Foo04<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((core::Null?) →* void) →* void) →* void) →* void;
-typedef Foo05<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((core::Null?) →* void) →* void) →* void) →* void) →* void;
-typedef Foo06<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo07<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo08<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo09<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo10<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo11<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo12<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo13<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo14<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo15<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo16<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo17<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo18<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo19<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo20<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo01<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (Null) →* void;
+typedef Foo02<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((Null) →* void) →* void;
+typedef Foo03<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((Null) →* void) →* void) →* void;
+typedef Foo04<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((Null) →* void) →* void) →* void) →* void;
+typedef Foo05<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((Null) →* void) →* void) →* void) →* void) →* void;
+typedef Foo06<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((Null) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo07<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo08<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo09<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo10<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo11<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo12<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo13<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo14<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo15<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo16<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo17<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo18<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo19<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo20<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/long_chain_of_typedefs.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/long_chain_of_typedefs.dart.weak.transformed.expect
index e62ba24..10636b1 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/long_chain_of_typedefs.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/long_chain_of_typedefs.dart.weak.transformed.expect
@@ -2,24 +2,24 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Foo01<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (core::Null?) →* void;
-typedef Foo02<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((core::Null?) →* void) →* void;
-typedef Foo03<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((core::Null?) →* void) →* void) →* void;
-typedef Foo04<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((core::Null?) →* void) →* void) →* void) →* void;
-typedef Foo05<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((core::Null?) →* void) →* void) →* void) →* void) →* void;
-typedef Foo06<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo07<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo08<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo09<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo10<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo11<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo12<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo13<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo14<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo15<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo16<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo17<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo18<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo19<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo20<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo01<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (Null) →* void;
+typedef Foo02<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((Null) →* void) →* void;
+typedef Foo03<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((Null) →* void) →* void) →* void;
+typedef Foo04<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((Null) →* void) →* void) →* void) →* void;
+typedef Foo05<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((Null) →* void) →* void) →* void) →* void) →* void;
+typedef Foo06<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((Null) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo07<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo08<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo09<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo10<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo11<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo12<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo13<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo14<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo15<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo16<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo17<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo18<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo19<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo20<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/mixin_application_override.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/mixin_application_override.dart.weak.expect
index dadacc5..67c9729 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/mixin_application_override.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/mixin_application_override.dart.weak.expect
@@ -206,7 +206,7 @@
   synthetic constructor •() → self::A0*
     : super self::S::•()
     ;
-  abstract forwarding-stub method foo([dynamic x = #C1]) → dynamic;
+  abstract member-signature method foo([dynamic x = #C1]) → dynamic; -> self::S::foo
 }
 abstract class _A1&S&M1 = self::S with self::M1 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_A1&S&M1*
@@ -217,7 +217,7 @@
   synthetic constructor •() → self::A1*
     : super self::_A1&S&M1::•()
     ;
-  abstract forwarding-stub method foo([dynamic x = #C1]) → dynamic;
+  abstract member-signature method foo([dynamic x = #C1]) → dynamic; -> self::S::foo
 }
 abstract class _A2&S&M1 = self::S with self::M1 /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_A2&S&M1*
@@ -233,13 +233,13 @@
   synthetic constructor •() → self::A2*
     : super self::_A2&S&M1&M2::•()
     ;
-  abstract forwarding-stub method foo([dynamic x = #C1]) → dynamic;
+  abstract member-signature method foo([dynamic x = #C1]) → dynamic; -> self::S::foo
 }
 abstract class _A0X&S&M = self::S with self::M /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_A0X&S&M*
     : super self::S::•()
     ;
-  abstract forwarding-stub method foo([dynamic x = #C1]) → dynamic;
+  abstract member-signature method foo([dynamic x = #C1]) → dynamic; -> self::S::foo
 }
 class A0X = self::_A0X&S&M with self::MX {
   synthetic constructor •() → self::A0X*
@@ -255,7 +255,7 @@
   synthetic constructor •() → self::_A1X&S&M1&M*
     : super self::_A1X&S&M1::•()
     ;
-  abstract forwarding-stub method foo([dynamic x = #C1]) → dynamic;
+  abstract member-signature method foo([dynamic x = #C1]) → dynamic; -> self::S::foo
 }
 class A1X = self::_A1X&S&M1&M with self::MX {
   synthetic constructor •() → self::A1X*
@@ -276,7 +276,7 @@
   synthetic constructor •() → self::_A2X&S&M1&M2&M*
     : super self::_A2X&S&M1&M2::•()
     ;
-  abstract forwarding-stub method foo([dynamic x = #C1]) → dynamic;
+  abstract member-signature method foo([dynamic x = #C1]) → dynamic; -> self::S::foo
 }
 class A2X = self::_A2X&S&M1&M2&M with self::MX {
   synthetic constructor •() → self::A2X*
@@ -287,7 +287,7 @@
   synthetic constructor •() → self::_B0&S&M*
     : super self::S::•()
     ;
-  abstract forwarding-stub method foo([dynamic x = #C1]) → dynamic;
+  abstract member-signature method foo([dynamic x = #C1]) → dynamic; -> self::S::foo
 }
 class B0 extends self::_B0&S&M {
   synthetic constructor •() → self::B0*
@@ -303,7 +303,7 @@
   synthetic constructor •() → self::_B1&S&M1&M*
     : super self::_B1&S&M1::•()
     ;
-  abstract forwarding-stub method foo([dynamic x = #C1]) → dynamic;
+  abstract member-signature method foo([dynamic x = #C1]) → dynamic; -> self::S::foo
 }
 class B1 extends self::_B1&S&M1&M {
   synthetic constructor •() → self::B1*
@@ -324,7 +324,7 @@
   synthetic constructor •() → self::_B2&S&M1&M2&M*
     : super self::_B2&S&M1&M2::•()
     ;
-  abstract forwarding-stub method foo([dynamic x = #C1]) → dynamic;
+  abstract member-signature method foo([dynamic x = #C1]) → dynamic; -> self::S::foo
 }
 class B2 extends self::_B2&S&M1&M2&M {
   synthetic constructor •() → self::B2*
@@ -335,7 +335,7 @@
   synthetic constructor •() → self::_B0X&S&M*
     : super self::S::•()
     ;
-  abstract forwarding-stub method foo([dynamic x = #C1]) → dynamic;
+  abstract member-signature method foo([dynamic x = #C1]) → dynamic; -> self::S::foo
 }
 abstract class _B0X&S&M&MX = self::_B0X&S&M with self::MX /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_B0X&S&M&MX*
@@ -356,7 +356,7 @@
   synthetic constructor •() → self::_B1X&S&M1&M*
     : super self::_B1X&S&M1::•()
     ;
-  abstract forwarding-stub method foo([dynamic x = #C1]) → dynamic;
+  abstract member-signature method foo([dynamic x = #C1]) → dynamic; -> self::S::foo
 }
 abstract class _B1X&S&M1&M&MX = self::_B1X&S&M1&M with self::MX /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_B1X&S&M1&M&MX*
@@ -382,7 +382,7 @@
   synthetic constructor •() → self::_B2X&S&M1&M2&M*
     : super self::_B2X&S&M1&M2::•()
     ;
-  abstract forwarding-stub method foo([dynamic x = #C1]) → dynamic;
+  abstract member-signature method foo([dynamic x = #C1]) → dynamic; -> self::S::foo
 }
 abstract class _B2X&S&M1&M2&M&MX = self::_B2X&S&M1&M2&M with self::MX /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_B2X&S&M1&M2&M&MX*
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/named_function_scope.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/named_function_scope.dart.weak.expect
index d9e93b7..06487ac 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/named_function_scope.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/named_function_scope.dart.weak.expect
@@ -118,14 +118,14 @@
   self::T* t;
   self::V* v;
   {
-    function T() → core::Null? {}
+    function T() → Null {}
   }
   {
     dynamic v;
   }
   {
     self::T* t;
-    () →* core::Null? x = let final () →* core::Null? T = () → core::Null? {} in T;
+    () →* Null x = let final () →* Null T = () → Null {} in T;
   }
   {
     self::V* v;
@@ -140,9 +140,9 @@
         ^" in null;
   }
   {
-    () →* core::Null? x = let final dynamic #t2 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/named_function_scope.dart:43:15: Error: Can't declare 'T' because it was already used in this scope.
+    () →* Null x = let final dynamic #t2 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/named_function_scope.dart:43:15: Error: Can't declare 'T' because it was already used in this scope.
     var x = T T() {};
-              ^" in let final () →* core::Null? T = () → core::Null? {} in T;
+              ^" in let final () →* Null T = () → Null {} in T;
   }
   {
     self::V* V = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/named_function_scope.dart:49:7: Error: Can't declare 'V' because it was already used in this scope.
@@ -150,9 +150,9 @@
       ^" as{TypeError,ForDynamic} self::V*;
   }
   {
-    <T extends core::Object* = dynamic>() →* core::Null? x = let final dynamic #t3 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/named_function_scope.dart:54:13: Error: 'T' is already declared in this scope.
+    <T extends core::Object* = dynamic>() →* Null x = let final dynamic #t3 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/named_function_scope.dart:54:13: Error: 'T' is already declared in this scope.
     var x = T<T>() {};
-            ^" in let final <T extends core::Object* = dynamic>() →* core::Null? T = <T extends core::Object* = dynamic>() → core::Null? {} in T;
+            ^" in let final <T extends core::Object* = dynamic>() →* Null T = <T extends core::Object* = dynamic>() → Null {} in T;
   }
   {
     self::T* t;
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/named_function_scope.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/named_function_scope.dart.weak.transformed.expect
index ba82dfc..2f063fe 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/named_function_scope.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/named_function_scope.dart.weak.transformed.expect
@@ -118,14 +118,14 @@
   self::T* t;
   self::V* v;
   {
-    function T() → core::Null? {}
+    function T() → Null {}
   }
   {
     dynamic v;
   }
   {
     self::T* t;
-    () →* core::Null? x = let final () →* core::Null? T = () → core::Null? {} in T;
+    () →* Null x = let final () →* Null T = () → Null {} in T;
   }
   {
     self::V* v;
@@ -140,9 +140,9 @@
         ^" in null;
   }
   {
-    () →* core::Null? x = let final dynamic #t2 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/named_function_scope.dart:43:15: Error: Can't declare 'T' because it was already used in this scope.
+    () →* Null x = let final dynamic #t2 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/named_function_scope.dart:43:15: Error: Can't declare 'T' because it was already used in this scope.
     var x = T T() {};
-              ^" in let final () →* core::Null? T = () → core::Null? {} in T;
+              ^" in let final () →* Null T = () → Null {} in T;
   }
   {
     self::V* V = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/named_function_scope.dart:49:7: Error: Can't declare 'V' because it was already used in this scope.
@@ -150,9 +150,9 @@
       ^";
   }
   {
-    <T extends core::Object* = dynamic>() →* core::Null? x = let final dynamic #t3 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/named_function_scope.dart:54:13: Error: 'T' is already declared in this scope.
+    <T extends core::Object* = dynamic>() →* Null x = let final dynamic #t3 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/named_function_scope.dart:54:13: Error: 'T' is already declared in this scope.
     var x = T<T>() {};
-            ^" in let final <T extends core::Object* = dynamic>() →* core::Null? T = <T extends core::Object* = dynamic>() → core::Null? {} in T;
+            ^" in let final <T extends core::Object* = dynamic>() →* Null T = <T extends core::Object* = dynamic>() → Null {} in T;
   }
   {
     self::T* t;
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/nested_variance.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/nested_variance.dart.weak.expect
index 722c19a..e1dd3c7 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/nested_variance.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/nested_variance.dart.weak.expect
@@ -10,9 +10,9 @@
 typedef FconBound<contravariant X extends core::num* = core::num*> = (X*) →* dynamic;
 typedef FinvBound<invariant X extends core::num* = core::num*> = (X*) →* X*;
 typedef FcovCyclicBound<X extends self::A<X*>* = self::A<dynamic>*> = () →* X*;
-typedef FconCyclicBound<contravariant X extends self::A<X*>* = self::A<core::Null?>*> = (X*) →* dynamic;
+typedef FconCyclicBound<contravariant X extends self::A<X*>* = self::A<Null>*> = (X*) →* dynamic;
 typedef FinvCyclicBound<invariant X extends self::A<X*>* = self::A<dynamic>*> = (X*) →* X*;
-typedef FcovCyclicCoBound<X extends (X*) →* dynamic = (core::Null?) →* dynamic> = () →* X*;
+typedef FcovCyclicCoBound<X extends (X*) →* dynamic = (Null) →* dynamic> = () →* X*;
 typedef FconCyclicCoBound<contravariant X extends (X*) →* dynamic = (dynamic) →* dynamic> = (X*) →* dynamic;
 typedef FinvCyclicCoBound<invariant X extends (X*) →* dynamic = (dynamic) →* dynamic> = (X*) →* X*;
 class Acov<X extends () →* self::Acov::Y* = () →* dynamic, Y extends core::Object* = dynamic> extends core::Object {
@@ -30,7 +30,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Acon<X extends (self::Acon::Y*) →* dynamic = (core::Null?) →* dynamic, Y extends core::Object* = dynamic> extends core::Object {
+class Acon<X extends (self::Acon::Y*) →* dynamic = (Null) →* dynamic, Y extends core::Object* = dynamic> extends core::Object {
   synthetic constructor •() → self::Acon<self::Acon::X*, self::Acon::Y*>*
     : super core::Object::•()
     ;
@@ -75,7 +75,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class AconBound<X extends (self::AconBound::Y*) →* dynamic = (core::Null?) →* dynamic, Y extends core::num* = core::num*> extends core::Object {
+class AconBound<X extends (self::AconBound::Y*) →* dynamic = (Null) →* dynamic, Y extends core::num* = core::num*> extends core::Object {
   synthetic constructor •() → self::AconBound<self::AconBound::X*, self::AconBound::Y*>*
     : super core::Object::•()
     ;
@@ -135,7 +135,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class AconCyclicBound<X extends (self::AconCyclicBound::Y*) →* dynamic = (core::Null?) →* dynamic, Y extends self::A<self::AconCyclicBound::Y*>* = self::A<dynamic>*> extends core::Object {
+class AconCyclicBound<X extends (self::AconCyclicBound::Y*) →* dynamic = (Null) →* dynamic, Y extends self::A<self::AconCyclicBound::Y*>* = self::A<dynamic>*> extends core::Object {
   synthetic constructor •() → self::AconCyclicBound<self::AconCyclicBound::X*, self::AconCyclicBound::Y*>*
     : super core::Object::•()
     ;
@@ -165,7 +165,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class AcovCyclicCoBound<X extends () →* self::AcovCyclicCoBound::Y* = () →* (core::Null?) →* dynamic, Y extends (self::AcovCyclicCoBound::Y*) →* dynamic = (core::Null?) →* dynamic> extends core::Object {
+class AcovCyclicCoBound<X extends () →* self::AcovCyclicCoBound::Y* = () →* (Null) →* dynamic, Y extends (self::AcovCyclicCoBound::Y*) →* dynamic = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::AcovCyclicCoBound<self::AcovCyclicCoBound::X*, self::AcovCyclicCoBound::Y*>*
     : super core::Object::•()
     ;
@@ -180,7 +180,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class AconCyclicCoBound<X extends (self::AconCyclicCoBound::Y*) →* dynamic = (core::Null?) →* dynamic, Y extends (self::AconCyclicCoBound::Y*) →* dynamic = (core::Null?) →* dynamic> extends core::Object {
+class AconCyclicCoBound<X extends (self::AconCyclicCoBound::Y*) →* dynamic = (Null) →* dynamic, Y extends (self::AconCyclicCoBound::Y*) →* dynamic = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::AconCyclicCoBound<self::AconCyclicCoBound::X*, self::AconCyclicCoBound::Y*>*
     : super core::Object::•()
     ;
@@ -195,7 +195,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class AinvCyclicCoBound<X extends (self::AinvCyclicCoBound::Y*) →* self::AinvCyclicCoBound::Y* = ((core::Null?) →* dynamic) →* (core::Null?) →* dynamic, Y extends (self::AinvCyclicCoBound::Y*) →* dynamic = (core::Null?) →* dynamic> extends core::Object {
+class AinvCyclicCoBound<X extends (self::AinvCyclicCoBound::Y*) →* self::AinvCyclicCoBound::Y* = ((Null) →* dynamic) →* (Null) →* dynamic, Y extends (self::AinvCyclicCoBound::Y*) →* dynamic = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::AinvCyclicCoBound<self::AinvCyclicCoBound::X*, self::AinvCyclicCoBound::Y*>*
     : super core::Object::•()
     ;
@@ -231,69 +231,69 @@
   self::Acov<() →* dynamic, dynamic>* source1;
   <Y extends self::Acov<() →* dynamic, dynamic>* = dynamic>() →* void fsource1 = self::toF<self::Acov<() →* dynamic, dynamic>*>(source1);
   <Y extends self::Acov<() →* dynamic, dynamic>* = dynamic>() →* void target1 = fsource1;
-  self::Acon<(core::Null?) →* dynamic, dynamic>* source2;
-  <Y extends self::Acon<(core::Null?) →* dynamic, dynamic>* = dynamic>() →* void fsource2 = self::toF<self::Acon<(core::Null?) →* dynamic, dynamic>*>(source2);
-  <Y extends self::Acon<(core::Null?) →* dynamic, dynamic>* = dynamic>() →* void target2 = fsource2;
+  self::Acon<(Null) →* dynamic, dynamic>* source2;
+  <Y extends self::Acon<(Null) →* dynamic, dynamic>* = dynamic>() →* void fsource2 = self::toF<self::Acon<(Null) →* dynamic, dynamic>*>(source2);
+  <Y extends self::Acon<(Null) →* dynamic, dynamic>* = dynamic>() →* void target2 = fsource2;
   self::Ainv<(dynamic) →* dynamic, dynamic>* source3;
   <Y extends self::Ainv<(dynamic) →* dynamic, dynamic>* = dynamic>() →* void fsource3 = self::toF<self::Ainv<(dynamic) →* dynamic, dynamic>*>(source3);
   <Y extends self::Ainv<(dynamic) →* dynamic, dynamic>* = dynamic>() →* void target3 = fsource3;
   self::AcovBound<() →* core::num*, core::num*>* source4;
   <Y extends self::AcovBound<() →* core::num*, core::num*>* = dynamic>() →* void fsource4 = self::toF<self::AcovBound<() →* core::num*, core::num*>*>(source4);
   <Y extends self::AcovBound<() →* core::num*, core::num*>* = dynamic>() →* void target4 = fsource4;
-  self::AconBound<(core::Null?) →* dynamic, core::num*>* source5;
-  <Y extends self::AconBound<(core::Null?) →* dynamic, core::num*>* = dynamic>() →* void fsource5 = self::toF<self::AconBound<(core::Null?) →* dynamic, core::num*>*>(source5);
-  <Y extends self::AconBound<(core::Null?) →* dynamic, core::num*>* = dynamic>() →* void target5 = fsource5;
+  self::AconBound<(Null) →* dynamic, core::num*>* source5;
+  <Y extends self::AconBound<(Null) →* dynamic, core::num*>* = dynamic>() →* void fsource5 = self::toF<self::AconBound<(Null) →* dynamic, core::num*>*>(source5);
+  <Y extends self::AconBound<(Null) →* dynamic, core::num*>* = dynamic>() →* void target5 = fsource5;
   self::AinvBound<(core::num*) →* core::num*, core::num*>* source6;
   <Y extends self::AinvBound<(core::num*) →* core::num*, core::num*>* = dynamic>() →* void fsource6 = self::toF<self::AinvBound<(core::num*) →* core::num*, core::num*>*>(source6);
   <Y extends self::AinvBound<(core::num*) →* core::num*, core::num*>* = dynamic>() →* void target6 = fsource6;
   self::AcovCyclicBound<() →* self::A<dynamic>*, self::A<dynamic>*>* source7;
   <Y extends self::AcovCyclicBound<() →* self::A<dynamic>*, self::A<dynamic>*>* = dynamic>() →* void fsource7 = self::toF<self::AcovCyclicBound<() →* self::A<dynamic>*, self::A<dynamic>*>*>(source7);
   <Y extends self::AcovCyclicBound<() →* self::A<dynamic>*, self::A<dynamic>*>* = dynamic>() →* void target7 = fsource7;
-  self::AconCyclicBound<(core::Null?) →* dynamic, self::A<dynamic>*>* source8;
-  <Y extends self::AconCyclicBound<(core::Null?) →* dynamic, self::A<dynamic>*>* = dynamic>() →* void fsource8 = self::toF<self::AconCyclicBound<(core::Null?) →* dynamic, self::A<dynamic>*>*>(source8);
-  <Y extends self::AconCyclicBound<(core::Null?) →* dynamic, self::A<dynamic>*>* = dynamic>() →* void target8 = fsource8;
+  self::AconCyclicBound<(Null) →* dynamic, self::A<dynamic>*>* source8;
+  <Y extends self::AconCyclicBound<(Null) →* dynamic, self::A<dynamic>*>* = dynamic>() →* void fsource8 = self::toF<self::AconCyclicBound<(Null) →* dynamic, self::A<dynamic>*>*>(source8);
+  <Y extends self::AconCyclicBound<(Null) →* dynamic, self::A<dynamic>*>* = dynamic>() →* void target8 = fsource8;
   self::AinvCyclicBound<(self::A<dynamic>*) →* self::A<dynamic>*, self::A<dynamic>*>* source9;
-  self::AcovCyclicCoBound<() →* (core::Null?) →* dynamic, (core::Null?) →* dynamic>* source10;
-  <Y extends self::AcovCyclicCoBound<() →* (core::Null?) →* dynamic, (core::Null?) →* dynamic>* = dynamic>() →* void fsource10 = self::toF<self::AcovCyclicCoBound<() →* (core::Null?) →* dynamic, (core::Null?) →* dynamic>*>(source10);
-  <Y extends self::AcovCyclicCoBound<() →* (core::Null?) →* dynamic, (core::Null?) →* dynamic>* = dynamic>() →* void target10 = fsource10;
-  self::AconCyclicCoBound<(core::Null?) →* dynamic, (core::Null?) →* dynamic>* source11;
-  <Y extends self::AconCyclicCoBound<(core::Null?) →* dynamic, (core::Null?) →* dynamic>* = dynamic>() →* void fsource11 = self::toF<self::AconCyclicCoBound<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*>(source11);
-  <Y extends self::AconCyclicCoBound<(core::Null?) →* dynamic, (core::Null?) →* dynamic>* = dynamic>() →* void target11 = fsource11;
-  self::AinvCyclicCoBound<((core::Null?) →* dynamic) →* (core::Null?) →* dynamic, (core::Null?) →* dynamic>* source12;
+  self::AcovCyclicCoBound<() →* (Null) →* dynamic, (Null) →* dynamic>* source10;
+  <Y extends self::AcovCyclicCoBound<() →* (Null) →* dynamic, (Null) →* dynamic>* = dynamic>() →* void fsource10 = self::toF<self::AcovCyclicCoBound<() →* (Null) →* dynamic, (Null) →* dynamic>*>(source10);
+  <Y extends self::AcovCyclicCoBound<() →* (Null) →* dynamic, (Null) →* dynamic>* = dynamic>() →* void target10 = fsource10;
+  self::AconCyclicCoBound<(Null) →* dynamic, (Null) →* dynamic>* source11;
+  <Y extends self::AconCyclicCoBound<(Null) →* dynamic, (Null) →* dynamic>* = dynamic>() →* void fsource11 = self::toF<self::AconCyclicCoBound<(Null) →* dynamic, (Null) →* dynamic>*>(source11);
+  <Y extends self::AconCyclicCoBound<(Null) →* dynamic, (Null) →* dynamic>* = dynamic>() →* void target11 = fsource11;
+  self::AinvCyclicCoBound<((Null) →* dynamic) →* (Null) →* dynamic, (Null) →* dynamic>* source12;
 }
 static method testNested() → void {
   self::B<self::Acov<() →* dynamic, dynamic>*>* source1;
   <Y extends self::B<self::Acov<() →* dynamic, dynamic>*>* = dynamic>() →* void fsource1 = self::toF<self::B<self::Acov<() →* dynamic, dynamic>*>*>(source1);
   <Y extends self::B<self::Acov<() →* dynamic, dynamic>*>* = dynamic>() →* void target1 = fsource1;
-  self::B<self::Acon<(core::Null?) →* dynamic, dynamic>*>* source2;
-  <Y extends self::B<self::Acon<(core::Null?) →* dynamic, dynamic>*>* = dynamic>() →* void fsource2 = self::toF<self::B<self::Acon<(core::Null?) →* dynamic, dynamic>*>*>(source2);
-  <Y extends self::B<self::Acon<(core::Null?) →* dynamic, dynamic>*>* = dynamic>() →* void target2 = fsource2;
+  self::B<self::Acon<(Null) →* dynamic, dynamic>*>* source2;
+  <Y extends self::B<self::Acon<(Null) →* dynamic, dynamic>*>* = dynamic>() →* void fsource2 = self::toF<self::B<self::Acon<(Null) →* dynamic, dynamic>*>*>(source2);
+  <Y extends self::B<self::Acon<(Null) →* dynamic, dynamic>*>* = dynamic>() →* void target2 = fsource2;
   self::B<self::Ainv<(dynamic) →* dynamic, dynamic>*>* source3;
   <Y extends self::B<self::Ainv<(dynamic) →* dynamic, dynamic>*>* = dynamic>() →* void fsource3 = self::toF<self::B<self::Ainv<(dynamic) →* dynamic, dynamic>*>*>(source3);
   <Y extends self::B<self::Ainv<(dynamic) →* dynamic, dynamic>*>* = dynamic>() →* void target3 = fsource3;
   self::B<self::AcovBound<() →* core::num*, core::num*>*>* source4;
   <Y extends self::B<self::AcovBound<() →* core::num*, core::num*>*>* = dynamic>() →* void fsource4 = self::toF<self::B<self::AcovBound<() →* core::num*, core::num*>*>*>(source4);
   <Y extends self::B<self::AcovBound<() →* core::num*, core::num*>*>* = dynamic>() →* void target4 = fsource4;
-  self::B<self::AconBound<(core::Null?) →* dynamic, core::num*>*>* source5;
-  <Y extends self::B<self::AconBound<(core::Null?) →* dynamic, core::num*>*>* = dynamic>() →* void fsource5 = self::toF<self::B<self::AconBound<(core::Null?) →* dynamic, core::num*>*>*>(source5);
-  <Y extends self::B<self::AconBound<(core::Null?) →* dynamic, core::num*>*>* = dynamic>() →* void target5 = fsource5;
+  self::B<self::AconBound<(Null) →* dynamic, core::num*>*>* source5;
+  <Y extends self::B<self::AconBound<(Null) →* dynamic, core::num*>*>* = dynamic>() →* void fsource5 = self::toF<self::B<self::AconBound<(Null) →* dynamic, core::num*>*>*>(source5);
+  <Y extends self::B<self::AconBound<(Null) →* dynamic, core::num*>*>* = dynamic>() →* void target5 = fsource5;
   self::B<self::AinvBound<(core::num*) →* core::num*, core::num*>*>* source6;
   <Y extends self::B<self::AinvBound<(core::num*) →* core::num*, core::num*>*>* = dynamic>() →* void fsource6 = self::toF<self::B<self::AinvBound<(core::num*) →* core::num*, core::num*>*>*>(source6);
   <Y extends self::B<self::AinvBound<(core::num*) →* core::num*, core::num*>*>* = dynamic>() →* void target6 = fsource6;
   self::B<self::AcovCyclicBound<() →* self::A<dynamic>*, self::A<dynamic>*>*>* source7;
   <Y extends self::B<self::AcovCyclicBound<() →* self::A<dynamic>*, self::A<dynamic>*>*>* = dynamic>() →* void fsource7 = self::toF<self::B<self::AcovCyclicBound<() →* self::A<dynamic>*, self::A<dynamic>*>*>*>(source7);
   <Y extends self::B<self::AcovCyclicBound<() →* self::A<dynamic>*, self::A<dynamic>*>*>* = dynamic>() →* void target7 = fsource7;
-  self::B<self::AconCyclicBound<(core::Null?) →* dynamic, self::A<dynamic>*>*>* source8;
-  <Y extends self::B<self::AconCyclicBound<(core::Null?) →* dynamic, self::A<dynamic>*>*>* = dynamic>() →* void fsource8 = self::toF<self::B<self::AconCyclicBound<(core::Null?) →* dynamic, self::A<dynamic>*>*>*>(source8);
-  <Y extends self::B<self::AconCyclicBound<(core::Null?) →* dynamic, self::A<dynamic>*>*>* = dynamic>() →* void target8 = fsource8;
+  self::B<self::AconCyclicBound<(Null) →* dynamic, self::A<dynamic>*>*>* source8;
+  <Y extends self::B<self::AconCyclicBound<(Null) →* dynamic, self::A<dynamic>*>*>* = dynamic>() →* void fsource8 = self::toF<self::B<self::AconCyclicBound<(Null) →* dynamic, self::A<dynamic>*>*>*>(source8);
+  <Y extends self::B<self::AconCyclicBound<(Null) →* dynamic, self::A<dynamic>*>*>* = dynamic>() →* void target8 = fsource8;
   self::B<self::AinvCyclicBound<(self::A<dynamic>*) →* self::A<dynamic>*, self::A<dynamic>*>*>* source9;
-  self::B<self::AcovCyclicCoBound<() →* (core::Null?) →* dynamic, (core::Null?) →* dynamic>*>* source10;
-  <Y extends self::B<self::AcovCyclicCoBound<() →* (core::Null?) →* dynamic, (core::Null?) →* dynamic>*>* = dynamic>() →* void fsource10 = self::toF<self::B<self::AcovCyclicCoBound<() →* (core::Null?) →* dynamic, (core::Null?) →* dynamic>*>*>(source10);
-  <Y extends self::B<self::AcovCyclicCoBound<() →* (core::Null?) →* dynamic, (core::Null?) →* dynamic>*>* = dynamic>() →* void target10 = fsource10;
-  self::B<self::AconCyclicCoBound<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*>* source11;
-  <Y extends self::B<self::AconCyclicCoBound<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*>* = dynamic>() →* void fsource11 = self::toF<self::B<self::AconCyclicCoBound<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*>*>(source11);
-  <Y extends self::B<self::AconCyclicCoBound<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*>* = dynamic>() →* void target11 = fsource11;
-  self::B<self::AinvCyclicCoBound<((core::Null?) →* dynamic) →* (core::Null?) →* dynamic, (core::Null?) →* dynamic>*>* source12;
+  self::B<self::AcovCyclicCoBound<() →* (Null) →* dynamic, (Null) →* dynamic>*>* source10;
+  <Y extends self::B<self::AcovCyclicCoBound<() →* (Null) →* dynamic, (Null) →* dynamic>*>* = dynamic>() →* void fsource10 = self::toF<self::B<self::AcovCyclicCoBound<() →* (Null) →* dynamic, (Null) →* dynamic>*>*>(source10);
+  <Y extends self::B<self::AcovCyclicCoBound<() →* (Null) →* dynamic, (Null) →* dynamic>*>* = dynamic>() →* void target10 = fsource10;
+  self::B<self::AconCyclicCoBound<(Null) →* dynamic, (Null) →* dynamic>*>* source11;
+  <Y extends self::B<self::AconCyclicCoBound<(Null) →* dynamic, (Null) →* dynamic>*>* = dynamic>() →* void fsource11 = self::toF<self::B<self::AconCyclicCoBound<(Null) →* dynamic, (Null) →* dynamic>*>*>(source11);
+  <Y extends self::B<self::AconCyclicCoBound<(Null) →* dynamic, (Null) →* dynamic>*>* = dynamic>() →* void target11 = fsource11;
+  self::B<self::AinvCyclicCoBound<((Null) →* dynamic) →* (Null) →* dynamic, (Null) →* dynamic>*>* source12;
 }
 static method main() → dynamic {
   self::testTypeAliasAsTypeArgument();
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/nested_variance.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/nested_variance.dart.weak.transformed.expect
index 722c19a..e1dd3c7 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/nested_variance.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/nested_variance.dart.weak.transformed.expect
@@ -10,9 +10,9 @@
 typedef FconBound<contravariant X extends core::num* = core::num*> = (X*) →* dynamic;
 typedef FinvBound<invariant X extends core::num* = core::num*> = (X*) →* X*;
 typedef FcovCyclicBound<X extends self::A<X*>* = self::A<dynamic>*> = () →* X*;
-typedef FconCyclicBound<contravariant X extends self::A<X*>* = self::A<core::Null?>*> = (X*) →* dynamic;
+typedef FconCyclicBound<contravariant X extends self::A<X*>* = self::A<Null>*> = (X*) →* dynamic;
 typedef FinvCyclicBound<invariant X extends self::A<X*>* = self::A<dynamic>*> = (X*) →* X*;
-typedef FcovCyclicCoBound<X extends (X*) →* dynamic = (core::Null?) →* dynamic> = () →* X*;
+typedef FcovCyclicCoBound<X extends (X*) →* dynamic = (Null) →* dynamic> = () →* X*;
 typedef FconCyclicCoBound<contravariant X extends (X*) →* dynamic = (dynamic) →* dynamic> = (X*) →* dynamic;
 typedef FinvCyclicCoBound<invariant X extends (X*) →* dynamic = (dynamic) →* dynamic> = (X*) →* X*;
 class Acov<X extends () →* self::Acov::Y* = () →* dynamic, Y extends core::Object* = dynamic> extends core::Object {
@@ -30,7 +30,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Acon<X extends (self::Acon::Y*) →* dynamic = (core::Null?) →* dynamic, Y extends core::Object* = dynamic> extends core::Object {
+class Acon<X extends (self::Acon::Y*) →* dynamic = (Null) →* dynamic, Y extends core::Object* = dynamic> extends core::Object {
   synthetic constructor •() → self::Acon<self::Acon::X*, self::Acon::Y*>*
     : super core::Object::•()
     ;
@@ -75,7 +75,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class AconBound<X extends (self::AconBound::Y*) →* dynamic = (core::Null?) →* dynamic, Y extends core::num* = core::num*> extends core::Object {
+class AconBound<X extends (self::AconBound::Y*) →* dynamic = (Null) →* dynamic, Y extends core::num* = core::num*> extends core::Object {
   synthetic constructor •() → self::AconBound<self::AconBound::X*, self::AconBound::Y*>*
     : super core::Object::•()
     ;
@@ -135,7 +135,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class AconCyclicBound<X extends (self::AconCyclicBound::Y*) →* dynamic = (core::Null?) →* dynamic, Y extends self::A<self::AconCyclicBound::Y*>* = self::A<dynamic>*> extends core::Object {
+class AconCyclicBound<X extends (self::AconCyclicBound::Y*) →* dynamic = (Null) →* dynamic, Y extends self::A<self::AconCyclicBound::Y*>* = self::A<dynamic>*> extends core::Object {
   synthetic constructor •() → self::AconCyclicBound<self::AconCyclicBound::X*, self::AconCyclicBound::Y*>*
     : super core::Object::•()
     ;
@@ -165,7 +165,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class AcovCyclicCoBound<X extends () →* self::AcovCyclicCoBound::Y* = () →* (core::Null?) →* dynamic, Y extends (self::AcovCyclicCoBound::Y*) →* dynamic = (core::Null?) →* dynamic> extends core::Object {
+class AcovCyclicCoBound<X extends () →* self::AcovCyclicCoBound::Y* = () →* (Null) →* dynamic, Y extends (self::AcovCyclicCoBound::Y*) →* dynamic = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::AcovCyclicCoBound<self::AcovCyclicCoBound::X*, self::AcovCyclicCoBound::Y*>*
     : super core::Object::•()
     ;
@@ -180,7 +180,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class AconCyclicCoBound<X extends (self::AconCyclicCoBound::Y*) →* dynamic = (core::Null?) →* dynamic, Y extends (self::AconCyclicCoBound::Y*) →* dynamic = (core::Null?) →* dynamic> extends core::Object {
+class AconCyclicCoBound<X extends (self::AconCyclicCoBound::Y*) →* dynamic = (Null) →* dynamic, Y extends (self::AconCyclicCoBound::Y*) →* dynamic = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::AconCyclicCoBound<self::AconCyclicCoBound::X*, self::AconCyclicCoBound::Y*>*
     : super core::Object::•()
     ;
@@ -195,7 +195,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class AinvCyclicCoBound<X extends (self::AinvCyclicCoBound::Y*) →* self::AinvCyclicCoBound::Y* = ((core::Null?) →* dynamic) →* (core::Null?) →* dynamic, Y extends (self::AinvCyclicCoBound::Y*) →* dynamic = (core::Null?) →* dynamic> extends core::Object {
+class AinvCyclicCoBound<X extends (self::AinvCyclicCoBound::Y*) →* self::AinvCyclicCoBound::Y* = ((Null) →* dynamic) →* (Null) →* dynamic, Y extends (self::AinvCyclicCoBound::Y*) →* dynamic = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::AinvCyclicCoBound<self::AinvCyclicCoBound::X*, self::AinvCyclicCoBound::Y*>*
     : super core::Object::•()
     ;
@@ -231,69 +231,69 @@
   self::Acov<() →* dynamic, dynamic>* source1;
   <Y extends self::Acov<() →* dynamic, dynamic>* = dynamic>() →* void fsource1 = self::toF<self::Acov<() →* dynamic, dynamic>*>(source1);
   <Y extends self::Acov<() →* dynamic, dynamic>* = dynamic>() →* void target1 = fsource1;
-  self::Acon<(core::Null?) →* dynamic, dynamic>* source2;
-  <Y extends self::Acon<(core::Null?) →* dynamic, dynamic>* = dynamic>() →* void fsource2 = self::toF<self::Acon<(core::Null?) →* dynamic, dynamic>*>(source2);
-  <Y extends self::Acon<(core::Null?) →* dynamic, dynamic>* = dynamic>() →* void target2 = fsource2;
+  self::Acon<(Null) →* dynamic, dynamic>* source2;
+  <Y extends self::Acon<(Null) →* dynamic, dynamic>* = dynamic>() →* void fsource2 = self::toF<self::Acon<(Null) →* dynamic, dynamic>*>(source2);
+  <Y extends self::Acon<(Null) →* dynamic, dynamic>* = dynamic>() →* void target2 = fsource2;
   self::Ainv<(dynamic) →* dynamic, dynamic>* source3;
   <Y extends self::Ainv<(dynamic) →* dynamic, dynamic>* = dynamic>() →* void fsource3 = self::toF<self::Ainv<(dynamic) →* dynamic, dynamic>*>(source3);
   <Y extends self::Ainv<(dynamic) →* dynamic, dynamic>* = dynamic>() →* void target3 = fsource3;
   self::AcovBound<() →* core::num*, core::num*>* source4;
   <Y extends self::AcovBound<() →* core::num*, core::num*>* = dynamic>() →* void fsource4 = self::toF<self::AcovBound<() →* core::num*, core::num*>*>(source4);
   <Y extends self::AcovBound<() →* core::num*, core::num*>* = dynamic>() →* void target4 = fsource4;
-  self::AconBound<(core::Null?) →* dynamic, core::num*>* source5;
-  <Y extends self::AconBound<(core::Null?) →* dynamic, core::num*>* = dynamic>() →* void fsource5 = self::toF<self::AconBound<(core::Null?) →* dynamic, core::num*>*>(source5);
-  <Y extends self::AconBound<(core::Null?) →* dynamic, core::num*>* = dynamic>() →* void target5 = fsource5;
+  self::AconBound<(Null) →* dynamic, core::num*>* source5;
+  <Y extends self::AconBound<(Null) →* dynamic, core::num*>* = dynamic>() →* void fsource5 = self::toF<self::AconBound<(Null) →* dynamic, core::num*>*>(source5);
+  <Y extends self::AconBound<(Null) →* dynamic, core::num*>* = dynamic>() →* void target5 = fsource5;
   self::AinvBound<(core::num*) →* core::num*, core::num*>* source6;
   <Y extends self::AinvBound<(core::num*) →* core::num*, core::num*>* = dynamic>() →* void fsource6 = self::toF<self::AinvBound<(core::num*) →* core::num*, core::num*>*>(source6);
   <Y extends self::AinvBound<(core::num*) →* core::num*, core::num*>* = dynamic>() →* void target6 = fsource6;
   self::AcovCyclicBound<() →* self::A<dynamic>*, self::A<dynamic>*>* source7;
   <Y extends self::AcovCyclicBound<() →* self::A<dynamic>*, self::A<dynamic>*>* = dynamic>() →* void fsource7 = self::toF<self::AcovCyclicBound<() →* self::A<dynamic>*, self::A<dynamic>*>*>(source7);
   <Y extends self::AcovCyclicBound<() →* self::A<dynamic>*, self::A<dynamic>*>* = dynamic>() →* void target7 = fsource7;
-  self::AconCyclicBound<(core::Null?) →* dynamic, self::A<dynamic>*>* source8;
-  <Y extends self::AconCyclicBound<(core::Null?) →* dynamic, self::A<dynamic>*>* = dynamic>() →* void fsource8 = self::toF<self::AconCyclicBound<(core::Null?) →* dynamic, self::A<dynamic>*>*>(source8);
-  <Y extends self::AconCyclicBound<(core::Null?) →* dynamic, self::A<dynamic>*>* = dynamic>() →* void target8 = fsource8;
+  self::AconCyclicBound<(Null) →* dynamic, self::A<dynamic>*>* source8;
+  <Y extends self::AconCyclicBound<(Null) →* dynamic, self::A<dynamic>*>* = dynamic>() →* void fsource8 = self::toF<self::AconCyclicBound<(Null) →* dynamic, self::A<dynamic>*>*>(source8);
+  <Y extends self::AconCyclicBound<(Null) →* dynamic, self::A<dynamic>*>* = dynamic>() →* void target8 = fsource8;
   self::AinvCyclicBound<(self::A<dynamic>*) →* self::A<dynamic>*, self::A<dynamic>*>* source9;
-  self::AcovCyclicCoBound<() →* (core::Null?) →* dynamic, (core::Null?) →* dynamic>* source10;
-  <Y extends self::AcovCyclicCoBound<() →* (core::Null?) →* dynamic, (core::Null?) →* dynamic>* = dynamic>() →* void fsource10 = self::toF<self::AcovCyclicCoBound<() →* (core::Null?) →* dynamic, (core::Null?) →* dynamic>*>(source10);
-  <Y extends self::AcovCyclicCoBound<() →* (core::Null?) →* dynamic, (core::Null?) →* dynamic>* = dynamic>() →* void target10 = fsource10;
-  self::AconCyclicCoBound<(core::Null?) →* dynamic, (core::Null?) →* dynamic>* source11;
-  <Y extends self::AconCyclicCoBound<(core::Null?) →* dynamic, (core::Null?) →* dynamic>* = dynamic>() →* void fsource11 = self::toF<self::AconCyclicCoBound<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*>(source11);
-  <Y extends self::AconCyclicCoBound<(core::Null?) →* dynamic, (core::Null?) →* dynamic>* = dynamic>() →* void target11 = fsource11;
-  self::AinvCyclicCoBound<((core::Null?) →* dynamic) →* (core::Null?) →* dynamic, (core::Null?) →* dynamic>* source12;
+  self::AcovCyclicCoBound<() →* (Null) →* dynamic, (Null) →* dynamic>* source10;
+  <Y extends self::AcovCyclicCoBound<() →* (Null) →* dynamic, (Null) →* dynamic>* = dynamic>() →* void fsource10 = self::toF<self::AcovCyclicCoBound<() →* (Null) →* dynamic, (Null) →* dynamic>*>(source10);
+  <Y extends self::AcovCyclicCoBound<() →* (Null) →* dynamic, (Null) →* dynamic>* = dynamic>() →* void target10 = fsource10;
+  self::AconCyclicCoBound<(Null) →* dynamic, (Null) →* dynamic>* source11;
+  <Y extends self::AconCyclicCoBound<(Null) →* dynamic, (Null) →* dynamic>* = dynamic>() →* void fsource11 = self::toF<self::AconCyclicCoBound<(Null) →* dynamic, (Null) →* dynamic>*>(source11);
+  <Y extends self::AconCyclicCoBound<(Null) →* dynamic, (Null) →* dynamic>* = dynamic>() →* void target11 = fsource11;
+  self::AinvCyclicCoBound<((Null) →* dynamic) →* (Null) →* dynamic, (Null) →* dynamic>* source12;
 }
 static method testNested() → void {
   self::B<self::Acov<() →* dynamic, dynamic>*>* source1;
   <Y extends self::B<self::Acov<() →* dynamic, dynamic>*>* = dynamic>() →* void fsource1 = self::toF<self::B<self::Acov<() →* dynamic, dynamic>*>*>(source1);
   <Y extends self::B<self::Acov<() →* dynamic, dynamic>*>* = dynamic>() →* void target1 = fsource1;
-  self::B<self::Acon<(core::Null?) →* dynamic, dynamic>*>* source2;
-  <Y extends self::B<self::Acon<(core::Null?) →* dynamic, dynamic>*>* = dynamic>() →* void fsource2 = self::toF<self::B<self::Acon<(core::Null?) →* dynamic, dynamic>*>*>(source2);
-  <Y extends self::B<self::Acon<(core::Null?) →* dynamic, dynamic>*>* = dynamic>() →* void target2 = fsource2;
+  self::B<self::Acon<(Null) →* dynamic, dynamic>*>* source2;
+  <Y extends self::B<self::Acon<(Null) →* dynamic, dynamic>*>* = dynamic>() →* void fsource2 = self::toF<self::B<self::Acon<(Null) →* dynamic, dynamic>*>*>(source2);
+  <Y extends self::B<self::Acon<(Null) →* dynamic, dynamic>*>* = dynamic>() →* void target2 = fsource2;
   self::B<self::Ainv<(dynamic) →* dynamic, dynamic>*>* source3;
   <Y extends self::B<self::Ainv<(dynamic) →* dynamic, dynamic>*>* = dynamic>() →* void fsource3 = self::toF<self::B<self::Ainv<(dynamic) →* dynamic, dynamic>*>*>(source3);
   <Y extends self::B<self::Ainv<(dynamic) →* dynamic, dynamic>*>* = dynamic>() →* void target3 = fsource3;
   self::B<self::AcovBound<() →* core::num*, core::num*>*>* source4;
   <Y extends self::B<self::AcovBound<() →* core::num*, core::num*>*>* = dynamic>() →* void fsource4 = self::toF<self::B<self::AcovBound<() →* core::num*, core::num*>*>*>(source4);
   <Y extends self::B<self::AcovBound<() →* core::num*, core::num*>*>* = dynamic>() →* void target4 = fsource4;
-  self::B<self::AconBound<(core::Null?) →* dynamic, core::num*>*>* source5;
-  <Y extends self::B<self::AconBound<(core::Null?) →* dynamic, core::num*>*>* = dynamic>() →* void fsource5 = self::toF<self::B<self::AconBound<(core::Null?) →* dynamic, core::num*>*>*>(source5);
-  <Y extends self::B<self::AconBound<(core::Null?) →* dynamic, core::num*>*>* = dynamic>() →* void target5 = fsource5;
+  self::B<self::AconBound<(Null) →* dynamic, core::num*>*>* source5;
+  <Y extends self::B<self::AconBound<(Null) →* dynamic, core::num*>*>* = dynamic>() →* void fsource5 = self::toF<self::B<self::AconBound<(Null) →* dynamic, core::num*>*>*>(source5);
+  <Y extends self::B<self::AconBound<(Null) →* dynamic, core::num*>*>* = dynamic>() →* void target5 = fsource5;
   self::B<self::AinvBound<(core::num*) →* core::num*, core::num*>*>* source6;
   <Y extends self::B<self::AinvBound<(core::num*) →* core::num*, core::num*>*>* = dynamic>() →* void fsource6 = self::toF<self::B<self::AinvBound<(core::num*) →* core::num*, core::num*>*>*>(source6);
   <Y extends self::B<self::AinvBound<(core::num*) →* core::num*, core::num*>*>* = dynamic>() →* void target6 = fsource6;
   self::B<self::AcovCyclicBound<() →* self::A<dynamic>*, self::A<dynamic>*>*>* source7;
   <Y extends self::B<self::AcovCyclicBound<() →* self::A<dynamic>*, self::A<dynamic>*>*>* = dynamic>() →* void fsource7 = self::toF<self::B<self::AcovCyclicBound<() →* self::A<dynamic>*, self::A<dynamic>*>*>*>(source7);
   <Y extends self::B<self::AcovCyclicBound<() →* self::A<dynamic>*, self::A<dynamic>*>*>* = dynamic>() →* void target7 = fsource7;
-  self::B<self::AconCyclicBound<(core::Null?) →* dynamic, self::A<dynamic>*>*>* source8;
-  <Y extends self::B<self::AconCyclicBound<(core::Null?) →* dynamic, self::A<dynamic>*>*>* = dynamic>() →* void fsource8 = self::toF<self::B<self::AconCyclicBound<(core::Null?) →* dynamic, self::A<dynamic>*>*>*>(source8);
-  <Y extends self::B<self::AconCyclicBound<(core::Null?) →* dynamic, self::A<dynamic>*>*>* = dynamic>() →* void target8 = fsource8;
+  self::B<self::AconCyclicBound<(Null) →* dynamic, self::A<dynamic>*>*>* source8;
+  <Y extends self::B<self::AconCyclicBound<(Null) →* dynamic, self::A<dynamic>*>*>* = dynamic>() →* void fsource8 = self::toF<self::B<self::AconCyclicBound<(Null) →* dynamic, self::A<dynamic>*>*>*>(source8);
+  <Y extends self::B<self::AconCyclicBound<(Null) →* dynamic, self::A<dynamic>*>*>* = dynamic>() →* void target8 = fsource8;
   self::B<self::AinvCyclicBound<(self::A<dynamic>*) →* self::A<dynamic>*, self::A<dynamic>*>*>* source9;
-  self::B<self::AcovCyclicCoBound<() →* (core::Null?) →* dynamic, (core::Null?) →* dynamic>*>* source10;
-  <Y extends self::B<self::AcovCyclicCoBound<() →* (core::Null?) →* dynamic, (core::Null?) →* dynamic>*>* = dynamic>() →* void fsource10 = self::toF<self::B<self::AcovCyclicCoBound<() →* (core::Null?) →* dynamic, (core::Null?) →* dynamic>*>*>(source10);
-  <Y extends self::B<self::AcovCyclicCoBound<() →* (core::Null?) →* dynamic, (core::Null?) →* dynamic>*>* = dynamic>() →* void target10 = fsource10;
-  self::B<self::AconCyclicCoBound<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*>* source11;
-  <Y extends self::B<self::AconCyclicCoBound<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*>* = dynamic>() →* void fsource11 = self::toF<self::B<self::AconCyclicCoBound<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*>*>(source11);
-  <Y extends self::B<self::AconCyclicCoBound<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*>* = dynamic>() →* void target11 = fsource11;
-  self::B<self::AinvCyclicCoBound<((core::Null?) →* dynamic) →* (core::Null?) →* dynamic, (core::Null?) →* dynamic>*>* source12;
+  self::B<self::AcovCyclicCoBound<() →* (Null) →* dynamic, (Null) →* dynamic>*>* source10;
+  <Y extends self::B<self::AcovCyclicCoBound<() →* (Null) →* dynamic, (Null) →* dynamic>*>* = dynamic>() →* void fsource10 = self::toF<self::B<self::AcovCyclicCoBound<() →* (Null) →* dynamic, (Null) →* dynamic>*>*>(source10);
+  <Y extends self::B<self::AcovCyclicCoBound<() →* (Null) →* dynamic, (Null) →* dynamic>*>* = dynamic>() →* void target10 = fsource10;
+  self::B<self::AconCyclicCoBound<(Null) →* dynamic, (Null) →* dynamic>*>* source11;
+  <Y extends self::B<self::AconCyclicCoBound<(Null) →* dynamic, (Null) →* dynamic>*>* = dynamic>() →* void fsource11 = self::toF<self::B<self::AconCyclicCoBound<(Null) →* dynamic, (Null) →* dynamic>*>*>(source11);
+  <Y extends self::B<self::AconCyclicCoBound<(Null) →* dynamic, (Null) →* dynamic>*>* = dynamic>() →* void target11 = fsource11;
+  self::B<self::AinvCyclicCoBound<((Null) →* dynamic) →* (Null) →* dynamic, (Null) →* dynamic>*>* source12;
 }
 static method main() → dynamic {
   self::testTypeAliasAsTypeArgument();
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/non_covariant_checks.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/non_covariant_checks.dart.weak.expect
index 039d5b6..39064e3 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/non_covariant_checks.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/non_covariant_checks.dart.weak.expect
@@ -19,7 +19,7 @@
   generic-covariant-impl field <S extends self::C::T* = dynamic>(S*) →* S* field14;
   generic-covariant-impl field (<S extends self::C::T* = dynamic>() →* S*) →* void field15;
   constructor •(self::C::T* field1) → self::C<self::C::T*>*
-    : self::C::field1 = field1, self::C::field2 = () → self::C::T* => field1, self::C::field3 = (self::C::T* t) → core::Null? {}, self::C::field4 = (self::C::T* t) → self::C::T* => t, self::C::field5 = () → () →* self::C::T* => () → self::C::T* => field1, self::C::field6 = (() →* self::C::T* f) → core::Null? {}, self::C::field7 = (() →* self::C::T* f) → self::C::T* => field1, self::C::field8 = ((self::C::T*) →* void f) → core::Null? {}, self::C::field9 = ((self::C::T*) →* void f) → self::C::T* => field1, self::C::field10 = ((self::C::T*) →* self::C::T* f) → core::Null? {}, self::C::field11 = ((self::C::T*) →* self::C::T* f) → self::C::T* => field1, self::C::field12 = <S extends self::C::T* = self::C::T*>() → core::Null? => null, self::C::field13 = <S extends self::C::T* = self::C::T*>(S* s) → core::Null? {}, self::C::field14 = <S extends self::C::T* = self::C::T*>(S* s) → S* => s, self::C::field15 = (<S extends self::C::T* = self::C::T*>() →* S* f) → core::Null? {}, super core::Object::•()
+    : self::C::field1 = field1, self::C::field2 = () → self::C::T* => field1, self::C::field3 = (self::C::T* t) → Null {}, self::C::field4 = (self::C::T* t) → self::C::T* => t, self::C::field5 = () → () →* self::C::T* => () → self::C::T* => field1, self::C::field6 = (() →* self::C::T* f) → Null {}, self::C::field7 = (() →* self::C::T* f) → self::C::T* => field1, self::C::field8 = ((self::C::T*) →* void f) → Null {}, self::C::field9 = ((self::C::T*) →* void f) → self::C::T* => field1, self::C::field10 = ((self::C::T*) →* self::C::T* f) → Null {}, self::C::field11 = ((self::C::T*) →* self::C::T* f) → self::C::T* => field1, self::C::field12 = <S extends self::C::T* = self::C::T*>() → Null => null, self::C::field13 = <S extends self::C::T* = self::C::T*>(S* s) → Null {}, self::C::field14 = <S extends self::C::T* = self::C::T*>(S* s) → S* => s, self::C::field15 = (<S extends self::C::T* = self::C::T*>() →* S* f) → Null {}, super core::Object::•()
     ;
   get getter1() → self::C::T*
     return this.{self::C::field1};
@@ -318,7 +318,7 @@
   on core::TypeError* catch(final core::TypeError* e) {
     core::print(e);
   }
-  c.{self::C::setter3} = (core::num* n) → core::Null? {};
+  c.{self::C::setter3} = (core::num* n) → Null {};
   try {
     c.{self::C::setter4} = (core::num* n) → core::double* => 0.5;
     throw "TypeError expected";
@@ -333,7 +333,7 @@
   on core::TypeError* catch(final core::TypeError* e) {
     core::print(e);
   }
-  c.{self::C::setter6} = (() →* core::num* f) → core::Null? {};
+  c.{self::C::setter6} = (() →* core::num* f) → Null {};
   try {
     c.{self::C::setter7} = (() →* core::num* f) → core::double* => 0.5;
     throw "TypeError expected";
@@ -342,7 +342,7 @@
     core::print(e);
   }
   try {
-    c.{self::C::setter8} = ((core::double*) →* void f) → core::Null? {};
+    c.{self::C::setter8} = ((core::double*) →* void f) → Null {};
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
@@ -356,7 +356,7 @@
     core::print(e);
   }
   try {
-    c.{self::C::setter10} = ((core::double*) →* core::num* f) → core::Null? {};
+    c.{self::C::setter10} = ((core::double*) →* core::num* f) → Null {};
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
@@ -370,14 +370,14 @@
     core::print(e);
   }
   try {
-    c.{self::C::setter12} = <S extends core::num* = core::num*>() → core::Null? => null;
+    c.{self::C::setter12} = <S extends core::num* = core::num*>() → Null => null;
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
     core::print(e);
   }
   try {
-    c.{self::C::setter13} = <S extends core::num* = core::num*>(S* s) → core::Null? {};
+    c.{self::C::setter13} = <S extends core::num* = core::num*>(S* s) → Null {};
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
@@ -391,7 +391,7 @@
     core::print(e);
   }
   try {
-    c.{self::C::setter15} = (<S extends core::num* = core::num*>() →* S* f) → core::Null? {};
+    c.{self::C::setter15} = (<S extends core::num* = core::num*>() →* S* f) → Null {};
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
@@ -411,7 +411,7 @@
   on core::TypeError* catch(final core::TypeError* e) {
     core::print(e);
   }
-  c.{self::C::method3}((core::num* n) → core::Null? {});
+  c.{self::C::method3}((core::num* n) → Null {});
   try {
     c.{self::C::method4}((core::num* n) → core::double* => 0.5);
     throw "TypeError expected";
@@ -426,7 +426,7 @@
   on core::TypeError* catch(final core::TypeError* e) {
     core::print(e);
   }
-  c.{self::C::method6}((() →* core::num* f) → core::Null? {});
+  c.{self::C::method6}((() →* core::num* f) → Null {});
   try {
     c.{self::C::method7}((() →* core::num* f) → core::double* => 0.5);
     throw "TypeError expected";
@@ -435,7 +435,7 @@
     core::print(e);
   }
   try {
-    c.{self::C::method8}(((core::double*) →* void f) → core::Null? {});
+    c.{self::C::method8}(((core::double*) →* void f) → Null {});
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
@@ -449,7 +449,7 @@
     core::print(e);
   }
   try {
-    c.{self::C::method10}(((core::double*) →* core::num* f) → core::Null? {});
+    c.{self::C::method10}(((core::double*) →* core::num* f) → Null {});
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
@@ -463,14 +463,14 @@
     core::print(e);
   }
   try {
-    c.{self::C::method12}(<S extends core::num* = core::num*>() → core::Null? => null);
+    c.{self::C::method12}(<S extends core::num* = core::num*>() → Null => null);
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
     core::print(e);
   }
   try {
-    c.{self::C::method13}(<S extends core::num* = core::num*>(S* s) → core::Null? {});
+    c.{self::C::method13}(<S extends core::num* = core::num*>(S* s) → Null {});
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
@@ -484,7 +484,7 @@
     core::print(e);
   }
   try {
-    c.{self::C::method15}((<S extends core::num* = core::num*>() →* S* f) → core::Null? {});
+    c.{self::C::method15}((<S extends core::num* = core::num*>() →* S* f) → Null {});
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/non_covariant_checks.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/non_covariant_checks.dart.weak.transformed.expect
index 039d5b6..39064e3 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/non_covariant_checks.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/non_covariant_checks.dart.weak.transformed.expect
@@ -19,7 +19,7 @@
   generic-covariant-impl field <S extends self::C::T* = dynamic>(S*) →* S* field14;
   generic-covariant-impl field (<S extends self::C::T* = dynamic>() →* S*) →* void field15;
   constructor •(self::C::T* field1) → self::C<self::C::T*>*
-    : self::C::field1 = field1, self::C::field2 = () → self::C::T* => field1, self::C::field3 = (self::C::T* t) → core::Null? {}, self::C::field4 = (self::C::T* t) → self::C::T* => t, self::C::field5 = () → () →* self::C::T* => () → self::C::T* => field1, self::C::field6 = (() →* self::C::T* f) → core::Null? {}, self::C::field7 = (() →* self::C::T* f) → self::C::T* => field1, self::C::field8 = ((self::C::T*) →* void f) → core::Null? {}, self::C::field9 = ((self::C::T*) →* void f) → self::C::T* => field1, self::C::field10 = ((self::C::T*) →* self::C::T* f) → core::Null? {}, self::C::field11 = ((self::C::T*) →* self::C::T* f) → self::C::T* => field1, self::C::field12 = <S extends self::C::T* = self::C::T*>() → core::Null? => null, self::C::field13 = <S extends self::C::T* = self::C::T*>(S* s) → core::Null? {}, self::C::field14 = <S extends self::C::T* = self::C::T*>(S* s) → S* => s, self::C::field15 = (<S extends self::C::T* = self::C::T*>() →* S* f) → core::Null? {}, super core::Object::•()
+    : self::C::field1 = field1, self::C::field2 = () → self::C::T* => field1, self::C::field3 = (self::C::T* t) → Null {}, self::C::field4 = (self::C::T* t) → self::C::T* => t, self::C::field5 = () → () →* self::C::T* => () → self::C::T* => field1, self::C::field6 = (() →* self::C::T* f) → Null {}, self::C::field7 = (() →* self::C::T* f) → self::C::T* => field1, self::C::field8 = ((self::C::T*) →* void f) → Null {}, self::C::field9 = ((self::C::T*) →* void f) → self::C::T* => field1, self::C::field10 = ((self::C::T*) →* self::C::T* f) → Null {}, self::C::field11 = ((self::C::T*) →* self::C::T* f) → self::C::T* => field1, self::C::field12 = <S extends self::C::T* = self::C::T*>() → Null => null, self::C::field13 = <S extends self::C::T* = self::C::T*>(S* s) → Null {}, self::C::field14 = <S extends self::C::T* = self::C::T*>(S* s) → S* => s, self::C::field15 = (<S extends self::C::T* = self::C::T*>() →* S* f) → Null {}, super core::Object::•()
     ;
   get getter1() → self::C::T*
     return this.{self::C::field1};
@@ -318,7 +318,7 @@
   on core::TypeError* catch(final core::TypeError* e) {
     core::print(e);
   }
-  c.{self::C::setter3} = (core::num* n) → core::Null? {};
+  c.{self::C::setter3} = (core::num* n) → Null {};
   try {
     c.{self::C::setter4} = (core::num* n) → core::double* => 0.5;
     throw "TypeError expected";
@@ -333,7 +333,7 @@
   on core::TypeError* catch(final core::TypeError* e) {
     core::print(e);
   }
-  c.{self::C::setter6} = (() →* core::num* f) → core::Null? {};
+  c.{self::C::setter6} = (() →* core::num* f) → Null {};
   try {
     c.{self::C::setter7} = (() →* core::num* f) → core::double* => 0.5;
     throw "TypeError expected";
@@ -342,7 +342,7 @@
     core::print(e);
   }
   try {
-    c.{self::C::setter8} = ((core::double*) →* void f) → core::Null? {};
+    c.{self::C::setter8} = ((core::double*) →* void f) → Null {};
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
@@ -356,7 +356,7 @@
     core::print(e);
   }
   try {
-    c.{self::C::setter10} = ((core::double*) →* core::num* f) → core::Null? {};
+    c.{self::C::setter10} = ((core::double*) →* core::num* f) → Null {};
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
@@ -370,14 +370,14 @@
     core::print(e);
   }
   try {
-    c.{self::C::setter12} = <S extends core::num* = core::num*>() → core::Null? => null;
+    c.{self::C::setter12} = <S extends core::num* = core::num*>() → Null => null;
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
     core::print(e);
   }
   try {
-    c.{self::C::setter13} = <S extends core::num* = core::num*>(S* s) → core::Null? {};
+    c.{self::C::setter13} = <S extends core::num* = core::num*>(S* s) → Null {};
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
@@ -391,7 +391,7 @@
     core::print(e);
   }
   try {
-    c.{self::C::setter15} = (<S extends core::num* = core::num*>() →* S* f) → core::Null? {};
+    c.{self::C::setter15} = (<S extends core::num* = core::num*>() →* S* f) → Null {};
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
@@ -411,7 +411,7 @@
   on core::TypeError* catch(final core::TypeError* e) {
     core::print(e);
   }
-  c.{self::C::method3}((core::num* n) → core::Null? {});
+  c.{self::C::method3}((core::num* n) → Null {});
   try {
     c.{self::C::method4}((core::num* n) → core::double* => 0.5);
     throw "TypeError expected";
@@ -426,7 +426,7 @@
   on core::TypeError* catch(final core::TypeError* e) {
     core::print(e);
   }
-  c.{self::C::method6}((() →* core::num* f) → core::Null? {});
+  c.{self::C::method6}((() →* core::num* f) → Null {});
   try {
     c.{self::C::method7}((() →* core::num* f) → core::double* => 0.5);
     throw "TypeError expected";
@@ -435,7 +435,7 @@
     core::print(e);
   }
   try {
-    c.{self::C::method8}(((core::double*) →* void f) → core::Null? {});
+    c.{self::C::method8}(((core::double*) →* void f) → Null {});
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
@@ -449,7 +449,7 @@
     core::print(e);
   }
   try {
-    c.{self::C::method10}(((core::double*) →* core::num* f) → core::Null? {});
+    c.{self::C::method10}(((core::double*) →* core::num* f) → Null {});
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
@@ -463,14 +463,14 @@
     core::print(e);
   }
   try {
-    c.{self::C::method12}(<S extends core::num* = core::num*>() → core::Null? => null);
+    c.{self::C::method12}(<S extends core::num* = core::num*>() → Null => null);
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
     core::print(e);
   }
   try {
-    c.{self::C::method13}(<S extends core::num* = core::num*>(S* s) → core::Null? {});
+    c.{self::C::method13}(<S extends core::num* = core::num*>(S* s) → Null {});
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
@@ -484,7 +484,7 @@
     core::print(e);
   }
   try {
-    c.{self::C::method15}((<S extends core::num* = core::num*>() →* S* f) → core::Null? {});
+    c.{self::C::method15}((<S extends core::num* = core::num*>() →* S* f) → Null {});
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/null_aware_spread.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/null_aware_spread.dart.weak.expect
index b724b3a..bd5bf0d 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/null_aware_spread.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/null_aware_spread.dart.weak.expect
@@ -6,31 +6,31 @@
 static method nullAwareListSpread(core::List<core::String*>* list) → dynamic {
   list = block {
     final core::List<core::String*>* #t1 = <core::String*>[];
-    #t1.{core::List::add}("foo");
+    #t1.{core::List::add}{Invariant}("foo");
     final core::Iterable<core::String*>* #t2 = list;
     if(!#t2.{core::Object::==}(null))
       for (final core::String* #t3 in #t2)
-        #t1.{core::List::add}(#t3);
+        #t1.{core::List::add}{Invariant}(#t3);
   } =>#t1;
 }
 static method nullAwareSetSpread(core::Set<core::String*>* set) → dynamic {
   set = block {
     final core::Set<core::String*>* #t4 = col::LinkedHashSet::•<core::String*>();
-    #t4.{core::Set::add}("foo");
+    #t4.{core::Set::add}{Invariant}("foo");
     final core::Iterable<core::String*>* #t5 = set;
     if(!#t5.{core::Object::==}(null))
       for (final core::String* #t6 in #t5)
-        #t4.{core::Set::add}(#t6);
+        #t4.{core::Set::add}{Invariant}(#t6);
   } =>#t4;
 }
 static method nullAwareMapSpread(core::Map<core::int*, core::String*>* map) → dynamic {
   map = block {
     final core::Map<core::int*, core::String*>* #t7 = <core::int*, core::String*>{};
-    #t7.{core::Map::[]=}(0, "foo");
+    #t7.{core::Map::[]=}{Invariant}(0, "foo");
     final core::Map<core::int*, core::String*>* #t8 = map;
     if(!#t8.{core::Object::==}(null))
       for (final core::MapEntry<core::int*, core::String*>* #t9 in #t8.{core::Map::entries})
-        #t7.{core::Map::[]=}(#t9.{core::MapEntry::key}, #t9.{core::MapEntry::value});
+        #t7.{core::Map::[]=}{Invariant}(#t9.{core::MapEntry::key}, #t9.{core::MapEntry::value});
   } =>#t7;
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/null_aware_spread.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/null_aware_spread.dart.weak.transformed.expect
index 9ff4788..67a6d44 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/null_aware_spread.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/null_aware_spread.dart.weak.transformed.expect
@@ -6,13 +6,13 @@
 static method nullAwareListSpread(core::List<core::String*>* list) → dynamic {
   list = block {
     final core::List<core::String*>* #t1 = <core::String*>[];
-    #t1.{core::List::add}("foo");
+    #t1.{core::List::add}{Invariant}("foo");
     final core::Iterable<core::String*>* #t2 = list;
     if(!#t2.{core::Object::==}(null)) {
       core::Iterator<core::String*>* :sync-for-iterator = #t2.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::String* #t3 = :sync-for-iterator.{core::Iterator::current};
-        #t1.{core::List::add}(#t3);
+        #t1.{core::List::add}{Invariant}(#t3);
       }
     }
   } =>#t1;
@@ -20,13 +20,13 @@
 static method nullAwareSetSpread(core::Set<core::String*>* set) → dynamic {
   set = block {
     final core::Set<core::String*>* #t4 = new col::_CompactLinkedHashSet::•<core::String*>();
-    #t4.{core::Set::add}("foo");
+    #t4.{core::Set::add}{Invariant}("foo");
     final core::Iterable<core::String*>* #t5 = set;
     if(!#t5.{core::Object::==}(null)) {
       core::Iterator<core::String*>* :sync-for-iterator = #t5.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::String* #t6 = :sync-for-iterator.{core::Iterator::current};
-        #t4.{core::Set::add}(#t6);
+        #t4.{core::Set::add}{Invariant}(#t6);
       }
     }
   } =>#t4;
@@ -34,13 +34,13 @@
 static method nullAwareMapSpread(core::Map<core::int*, core::String*>* map) → dynamic {
   map = block {
     final core::Map<core::int*, core::String*>* #t7 = <core::int*, core::String*>{};
-    #t7.{core::Map::[]=}(0, "foo");
+    #t7.{core::Map::[]=}{Invariant}(0, "foo");
     final core::Map<core::int*, core::String*>* #t8 = map;
     if(!#t8.{core::Object::==}(null)) {
       core::Iterator<core::MapEntry<core::int*, core::String*>>* :sync-for-iterator = #t8.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::MapEntry<core::int*, core::String*>* #t9 = :sync-for-iterator.{core::Iterator::current};
-        #t7.{core::Map::[]=}(#t9.{core::MapEntry::key}, #t9.{core::MapEntry::value});
+        #t7.{core::Map::[]=}{Invariant}(#t9.{core::MapEntry::key}, #t9.{core::MapEntry::value});
       }
     }
   } =>#t7;
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/redirecting_factory_const_inference.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/redirecting_factory_const_inference.dart.weak.expect
index c69b1b3..27deb54 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/redirecting_factory_const_inference.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/redirecting_factory_const_inference.dart.weak.expect
@@ -55,11 +55,11 @@
 }
 static method main() → dynamic {
   dynamic x = new self::B::•<dynamic>().{self::A::x};
-  if(!(x is self::_Y<core::Null?>*)) {
+  if(!(x is self::_Y<Null>*)) {
     throw "Unexpected run-time type: `new B().x` is ${x.{core::Object::runtimeType}}, but `_Y<Null>` expected";
   }
 }
 
 constants  {
-  #C1 = self::_Y<core::Null?> {}
+  #C1 = self::_Y<Null> {}
 }
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/redirecting_factory_const_inference.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/redirecting_factory_const_inference.dart.weak.transformed.expect
index aab1b06..4b6b1c0 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/redirecting_factory_const_inference.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/redirecting_factory_const_inference.dart.weak.transformed.expect
@@ -55,11 +55,11 @@
 }
 static method main() → dynamic {
   dynamic x = new self::B::•<dynamic>().{self::A::x};
-  if(!(x is self::_Y<core::Null?>*)) {
+  if(!(x is self::_Y<Null>*)) {
     throw "Unexpected run-time type: `new B().x` is ${x.{core::Object::runtimeType}}, but `_Y<Null>` expected";
   }
 }
 
 constants  {
-  #C1 = self::_Y<core::Null?> {}
+  #C1 = self::_Y<Null> {}
 }
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/spread_collection.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/spread_collection.dart.weak.expect
index b24bbda..c862e55 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/spread_collection.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/spread_collection.dart.weak.expect
@@ -14,33 +14,33 @@
 static method main() → dynamic {
   final core::List<core::int*>* aList = block {
     final core::List<core::int*>* #t1 = <core::int*>[];
-    #t1.{core::List::add}(1);
+    #t1.{core::List::add}{Invariant}(1);
     for (final core::int* #t2 in <core::int*>[2])
-      #t1.{core::List::add}(#t2);
+      #t1.{core::List::add}{Invariant}(#t2);
     final core::Iterable<core::int*>* #t3 = <core::int*>[3];
     if(!#t3.{core::Object::==}(null))
       for (final core::int* #t4 in #t3)
-        #t1.{core::List::add}(#t4);
+        #t1.{core::List::add}{Invariant}(#t4);
   } =>#t1;
   final core::Map<core::int*, core::int*>* aMap = block {
     final core::Map<core::int*, core::int*>* #t5 = <core::int*, core::int*>{};
-    #t5.{core::Map::[]=}(1, 1);
+    #t5.{core::Map::[]=}{Invariant}(1, 1);
     for (final core::MapEntry<core::int*, core::int*>* #t6 in <core::int*, core::int*>{2: 2}.{core::Map::entries})
-      #t5.{core::Map::[]=}(#t6.{core::MapEntry::key}, #t6.{core::MapEntry::value});
+      #t5.{core::Map::[]=}{Invariant}(#t6.{core::MapEntry::key}, #t6.{core::MapEntry::value});
     final core::Map<core::int*, core::int*>* #t7 = <core::int*, core::int*>{3: 3};
     if(!#t7.{core::Object::==}(null))
       for (final core::MapEntry<core::int*, core::int*>* #t8 in #t7.{core::Map::entries})
-        #t5.{core::Map::[]=}(#t8.{core::MapEntry::key}, #t8.{core::MapEntry::value});
+        #t5.{core::Map::[]=}{Invariant}(#t8.{core::MapEntry::key}, #t8.{core::MapEntry::value});
   } =>#t5;
   final core::Set<core::int*>* aSet = block {
     final core::Set<core::int*>* #t9 = col::LinkedHashSet::•<core::int*>();
-    #t9.{core::Set::add}(1);
+    #t9.{core::Set::add}{Invariant}(1);
     for (final core::int* #t10 in <core::int*>[2])
-      #t9.{core::Set::add}(#t10);
+      #t9.{core::Set::add}{Invariant}(#t10);
     final core::Iterable<core::int*>* #t11 = <core::int*>[3];
     if(!#t11.{core::Object::==}(null))
       for (final core::int* #t12 in #t11)
-        #t9.{core::Set::add}(#t12);
+        #t9.{core::Set::add}{Invariant}(#t12);
   } =>#t9;
   final dynamic aSetOrMap = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection.dart:23:21: Error: Not enough type information to disambiguate between literal set and literal map.
 Try providing type arguments for the literal explicitly to disambiguate it.
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/spread_collection.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/spread_collection.dart.weak.transformed.expect
index f06f6bc..791309b 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/spread_collection.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/spread_collection.dart.weak.transformed.expect
@@ -14,12 +14,12 @@
 static method main() → dynamic {
   final core::List<core::int*>* aList = block {
     final core::List<core::int*>* #t1 = <core::int*>[];
-    #t1.{core::List::add}(1);
+    #t1.{core::List::add}{Invariant}(1);
     {
       core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[2].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::int* #t2 = :sync-for-iterator.{core::Iterator::current};
-        #t1.{core::List::add}(#t2);
+        #t1.{core::List::add}{Invariant}(#t2);
       }
     }
     final core::Iterable<core::int*>* #t3 = <core::int*>[3];
@@ -27,18 +27,18 @@
       core::Iterator<core::int*>* :sync-for-iterator = #t3.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::int* #t4 = :sync-for-iterator.{core::Iterator::current};
-        #t1.{core::List::add}(#t4);
+        #t1.{core::List::add}{Invariant}(#t4);
       }
     }
   } =>#t1;
   final core::Map<core::int*, core::int*>* aMap = block {
     final core::Map<core::int*, core::int*>* #t5 = <core::int*, core::int*>{};
-    #t5.{core::Map::[]=}(1, 1);
+    #t5.{core::Map::[]=}{Invariant}(1, 1);
     {
       core::Iterator<core::MapEntry<core::int*, core::int*>>* :sync-for-iterator = <core::int*, core::int*>{2: 2}.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::MapEntry<core::int*, core::int*>* #t6 = :sync-for-iterator.{core::Iterator::current};
-        #t5.{core::Map::[]=}(#t6.{core::MapEntry::key}, #t6.{core::MapEntry::value});
+        #t5.{core::Map::[]=}{Invariant}(#t6.{core::MapEntry::key}, #t6.{core::MapEntry::value});
       }
     }
     final core::Map<core::int*, core::int*>* #t7 = <core::int*, core::int*>{3: 3};
@@ -46,18 +46,18 @@
       core::Iterator<core::MapEntry<core::int*, core::int*>>* :sync-for-iterator = #t7.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::MapEntry<core::int*, core::int*>* #t8 = :sync-for-iterator.{core::Iterator::current};
-        #t5.{core::Map::[]=}(#t8.{core::MapEntry::key}, #t8.{core::MapEntry::value});
+        #t5.{core::Map::[]=}{Invariant}(#t8.{core::MapEntry::key}, #t8.{core::MapEntry::value});
       }
     }
   } =>#t5;
   final core::Set<core::int*>* aSet = block {
     final core::Set<core::int*>* #t9 = new col::_CompactLinkedHashSet::•<core::int*>();
-    #t9.{core::Set::add}(1);
+    #t9.{core::Set::add}{Invariant}(1);
     {
       core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[2].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::int* #t10 = :sync-for-iterator.{core::Iterator::current};
-        #t9.{core::Set::add}(#t10);
+        #t9.{core::Set::add}{Invariant}(#t10);
       }
     }
     final core::Iterable<core::int*>* #t11 = <core::int*>[3];
@@ -65,7 +65,7 @@
       core::Iterator<core::int*>* :sync-for-iterator = #t11.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::int* #t12 = :sync-for-iterator.{core::Iterator::current};
-        #t9.{core::Set::add}(#t12);
+        #t9.{core::Set::add}{Invariant}(#t12);
       }
     }
   } =>#t9;
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart.weak.expect
index 977c606..6d91849 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart.weak.expect
@@ -112,68 +112,68 @@
   core::List<dynamic>* lhs10 = block {
     final core::List<dynamic>* #t1 = <dynamic>[];
     for (final dynamic #t2 in <dynamic>[])
-      #t1.{core::List::add}(#t2);
+      #t1.{core::List::add}{Invariant}(#t2);
   } =>#t1;
   core::Set<dynamic>* set10 = block {
     final core::Set<dynamic>* #t3 = col::LinkedHashSet::•<dynamic>();
     for (final dynamic #t4 in <dynamic>[])
-      #t3.{core::Set::add}(#t4);
+      #t3.{core::Set::add}{Invariant}(#t4);
   } =>#t3;
   core::Map<dynamic, dynamic>* map10 = block {
     final core::Map<dynamic, dynamic>* #t5 = <dynamic, dynamic>{};
     for (final core::MapEntry<dynamic, dynamic>* #t6 in <dynamic, dynamic>{}.{core::Map::entries})
-      #t5.{core::Map::[]=}(#t6.{core::MapEntry::key}, #t6.{core::MapEntry::value});
+      #t5.{core::Map::[]=}{Invariant}(#t6.{core::MapEntry::key}, #t6.{core::MapEntry::value});
   } =>#t5;
   core::Map<dynamic, dynamic>* map10ambiguous = block {
     final core::Map<dynamic, dynamic>* #t7 = <dynamic, dynamic>{};
     for (final core::MapEntry<dynamic, dynamic>* #t8 in <dynamic, dynamic>{}.{core::Map::entries})
-      #t7.{core::Map::[]=}(#t8.{core::MapEntry::key}, #t8.{core::MapEntry::value});
+      #t7.{core::Map::[]=}{Invariant}(#t8.{core::MapEntry::key}, #t8.{core::MapEntry::value});
   } =>#t7;
   core::List<core::int*>* lhs20 = block {
     final core::List<core::int*>* #t9 = <core::int*>[];
     for (final core::int* #t10 in spread)
-      #t9.{core::List::add}(#t10);
+      #t9.{core::List::add}{Invariant}(#t10);
   } =>#t9;
   core::Set<core::int*>* set20 = block {
     final core::Set<core::int*>* #t11 = col::LinkedHashSet::•<core::int*>();
     for (final core::int* #t12 in spread)
-      #t11.{core::Set::add}(#t12);
-    #t11.{core::Set::add}(42);
+      #t11.{core::Set::add}{Invariant}(#t12);
+    #t11.{core::Set::add}{Invariant}(42);
   } =>#t11;
   core::Set<core::int*>* set20ambiguous = block {
     final core::Set<core::int*>* #t13 = col::LinkedHashSet::•<core::int*>();
     for (final dynamic #t14 in spread) {
       final core::int* #t15 = #t14 as{TypeError} core::int*;
-      #t13.{core::Set::add}(#t15);
+      #t13.{core::Set::add}{Invariant}(#t15);
     }
   } =>#t13;
   core::Map<core::String*, core::int*>* map20 = block {
     final core::Map<core::String*, core::int*>* #t16 = <core::String*, core::int*>{};
     for (final core::MapEntry<core::String*, core::int*>* #t17 in mapSpread.{core::Map::entries})
-      #t16.{core::Map::[]=}(#t17.{core::MapEntry::key}, #t17.{core::MapEntry::value});
-    #t16.{core::Map::[]=}("baz", 42);
+      #t16.{core::Map::[]=}{Invariant}(#t17.{core::MapEntry::key}, #t17.{core::MapEntry::value});
+    #t16.{core::Map::[]=}{Invariant}("baz", 42);
   } =>#t16;
   core::Map<core::String*, core::int*>* map20ambiguous = block {
     final core::Map<core::String*, core::int*>* #t18 = <core::String*, core::int*>{};
     for (final core::MapEntry<core::String*, core::int*>* #t19 in mapSpread.{core::Map::entries})
-      #t18.{core::Map::[]=}(#t19.{core::MapEntry::key}, #t19.{core::MapEntry::value});
+      #t18.{core::Map::[]=}{Invariant}(#t19.{core::MapEntry::key}, #t19.{core::MapEntry::value});
   } =>#t18;
   core::List<dynamic>* lhs21 = block {
     final core::List<dynamic>* #t20 = <dynamic>[];
     for (final dynamic #t21 in (spread as dynamic) as{TypeError,ForDynamic} core::Iterable<dynamic>*)
-      #t20.{core::List::add}(#t21);
+      #t20.{core::List::add}{Invariant}(#t21);
   } =>#t20;
   core::Set<dynamic>* set21 = block {
     final core::Set<dynamic>* #t22 = col::LinkedHashSet::•<dynamic>();
     for (final dynamic #t23 in (spread as dynamic) as{TypeError,ForDynamic} core::Iterable<dynamic>*)
-      #t22.{core::Set::add}(#t23);
-    #t22.{core::Set::add}(42);
+      #t22.{core::Set::add}{Invariant}(#t23);
+    #t22.{core::Set::add}{Invariant}(42);
   } =>#t22;
   core::Map<dynamic, dynamic>* map21 = block {
     final core::Map<dynamic, dynamic>* #t24 = <dynamic, dynamic>{};
     for (final core::MapEntry<dynamic, dynamic>* #t25 in ((mapSpread as dynamic) as{TypeError,ForDynamic} core::Map<dynamic, dynamic>*).{core::Map::entries})
-      #t24.{core::Map::[]=}(#t25.{core::MapEntry::key}, #t25.{core::MapEntry::value});
-    #t24.{core::Map::[]=}("baz", 42);
+      #t24.{core::Map::[]=}{Invariant}(#t25.{core::MapEntry::key}, #t25.{core::MapEntry::value});
+    #t24.{core::Map::[]=}{Invariant}("baz", 42);
   } =>#t24;
   dynamic map21ambiguous = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:66:28: Error: Not enough type information to disambiguate between literal set and literal map.
 Try providing type arguments for the literal explicitly to disambiguate it.
@@ -182,48 +182,48 @@
   core::List<core::int*>* lhs22 = block {
     final core::List<core::int*>* #t26 = <core::int*>[];
     for (final core::int* #t27 in <core::int*>[])
-      #t26.{core::List::add}(#t27);
+      #t26.{core::List::add}{Invariant}(#t27);
   } =>#t26;
   core::Set<core::int*>* set22 = block {
     final core::Set<core::int*>* #t28 = col::LinkedHashSet::•<core::int*>();
     for (final core::int* #t29 in <core::int*>[])
-      #t28.{core::Set::add}(#t29);
-    #t28.{core::Set::add}(42);
+      #t28.{core::Set::add}{Invariant}(#t29);
+    #t28.{core::Set::add}{Invariant}(42);
   } =>#t28;
   core::Set<core::int*>* set22ambiguous = block {
     final core::Set<core::int*>* #t30 = col::LinkedHashSet::•<core::int*>();
     for (final dynamic #t31 in <core::int*>[]) {
       final core::int* #t32 = #t31 as{TypeError} core::int*;
-      #t30.{core::Set::add}(#t32);
+      #t30.{core::Set::add}{Invariant}(#t32);
     }
   } =>#t30;
   core::Map<core::String*, core::int*>* map22 = block {
     final core::Map<core::String*, core::int*>* #t33 = <core::String*, core::int*>{};
     for (final core::MapEntry<core::String*, core::int*>* #t34 in <core::String*, core::int*>{}.{core::Map::entries})
-      #t33.{core::Map::[]=}(#t34.{core::MapEntry::key}, #t34.{core::MapEntry::value});
+      #t33.{core::Map::[]=}{Invariant}(#t34.{core::MapEntry::key}, #t34.{core::MapEntry::value});
   } =>#t33;
   core::List<core::List<core::int*>*>* lhs23 = block {
     final core::List<core::List<core::int*>*>* #t35 = <core::List<core::int*>*>[];
     for (final core::List<core::int*>* #t36 in <core::List<core::int*>*>[<core::int*>[]])
-      #t35.{core::List::add}(#t36);
+      #t35.{core::List::add}{Invariant}(#t36);
   } =>#t35;
   core::Set<core::List<core::int*>*>* set23 = block {
     final core::Set<core::List<core::int*>*>* #t37 = col::LinkedHashSet::•<core::List<core::int*>*>();
     for (final core::List<core::int*>* #t38 in <core::List<core::int*>*>[<core::int*>[]])
-      #t37.{core::Set::add}(#t38);
-    #t37.{core::Set::add}(<core::int*>[42]);
+      #t37.{core::Set::add}{Invariant}(#t38);
+    #t37.{core::Set::add}{Invariant}(<core::int*>[42]);
   } =>#t37;
   core::Set<core::List<core::int*>*>* set23ambiguous = block {
     final core::Set<core::List<core::int*>*>* #t39 = col::LinkedHashSet::•<core::List<core::int*>*>();
     for (final dynamic #t40 in <core::List<core::int*>*>[<core::int*>[]]) {
       final core::List<core::int*>* #t41 = #t40 as{TypeError} core::List<core::int*>*;
-      #t39.{core::Set::add}(#t41);
+      #t39.{core::Set::add}{Invariant}(#t41);
     }
   } =>#t39;
   core::Map<core::String*, core::List<core::int*>*>* map23 = block {
     final core::Map<core::String*, core::List<core::int*>*>* #t42 = <core::String*, core::List<core::int*>*>{};
     for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t43 in <core::String*, core::List<core::int*>*>{"baz": <core::int*>[]}.{core::Map::entries})
-      #t42.{core::Map::[]=}(#t43.{core::MapEntry::key}, #t43.{core::MapEntry::value});
+      #t42.{core::Map::[]=}{Invariant}(#t43.{core::MapEntry::key}, #t43.{core::MapEntry::value});
   } =>#t42;
   dynamic map24ambiguous = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:98:28: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
   dynamic map24ambiguous = {...spread, ...mapSpread};
@@ -234,7 +234,7 @@
                                    ^" in ( block {
     final core::List<core::int*>* #t45 = <core::int*>[];
     for (final core::int* #t46 in spread)
-      #t45.{core::List::add}(#t46);
+      #t45.{core::List::add}{Invariant}(#t46);
   } =>#t45) as{TypeError} core::int*;
   core::int* set30 = let final<BottomType> #t47 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:102:36: Error: A value of type 'Set<int>' can't be assigned to a variable of type 'int'.
  - 'Set' is from 'dart:core'.
@@ -242,8 +242,8 @@
                                    ^" in ( block {
     final core::Set<core::int*>* #t48 = col::LinkedHashSet::•<core::int*>();
     for (final core::int* #t49 in spread)
-      #t48.{core::Set::add}(#t49);
-    #t48.{core::Set::add}(42);
+      #t48.{core::Set::add}{Invariant}(#t49);
+    #t48.{core::Set::add}{Invariant}(42);
   } =>#t48) as{TypeError} core::int*;
   core::int* set30ambiguous = let final<BottomType> #t50 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:105:7: Error: A value of type 'Set<int>' can't be assigned to a variable of type 'int'.
  - 'Set' is from 'dart:core'.
@@ -252,7 +252,7 @@
     final core::Set<core::int*>* #t51 = col::LinkedHashSet::•<core::int*>();
     for (final dynamic #t52 in spread) {
       final core::int* #t53 = #t52 as{TypeError} core::int*;
-      #t51.{core::Set::add}(#t53);
+      #t51.{core::Set::add}{Invariant}(#t53);
     }
   } =>#t51) as{TypeError} core::int*;
   core::int* map30 = let final<BottomType> #t54 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:108:7: Error: A value of type 'Map<String, int>' can't be assigned to a variable of type 'int'.
@@ -261,8 +261,8 @@
       ^" in ( block {
     final core::Map<core::String*, core::int*>* #t55 = <core::String*, core::int*>{};
     for (final core::MapEntry<core::String*, core::int*>* #t56 in mapSpread.{core::Map::entries})
-      #t55.{core::Map::[]=}(#t56.{core::MapEntry::key}, #t56.{core::MapEntry::value});
-    #t55.{core::Map::[]=}("baz", 42);
+      #t55.{core::Map::[]=}{Invariant}(#t56.{core::MapEntry::key}, #t56.{core::MapEntry::value});
+    #t55.{core::Map::[]=}{Invariant}("baz", 42);
   } =>#t55) as{TypeError} core::int*;
   core::int* map30ambiguous = let final<BottomType> #t57 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:111:7: Error: A value of type 'Map<String, int>' can't be assigned to a variable of type 'int'.
  - 'Map' is from 'dart:core'.
@@ -270,32 +270,41 @@
       ^" in ( block {
     final core::Map<core::String*, core::int*>* #t58 = <core::String*, core::int*>{};
     for (final core::MapEntry<core::String*, core::int*>* #t59 in mapSpread.{core::Map::entries})
-      #t58.{core::Map::[]=}(#t59.{core::MapEntry::key}, #t59.{core::MapEntry::value});
+      #t58.{core::Map::[]=}{Invariant}(#t59.{core::MapEntry::key}, #t59.{core::MapEntry::value});
   } =>#t58) as{TypeError} core::int*;
   core::List<dynamic>* lhs40 = <dynamic>[invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:113:38: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
   List<dynamic> lhs40 = <dynamic>[...notSpreadInt];
                                      ^"];
-  core::Set<dynamic>* set40 = let final core::Set<dynamic>* #t60 = col::LinkedHashSet::•<dynamic>() in let final dynamic #t61 = #t60.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:115:37: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
+  core::Set<dynamic>* set40 = block {
+    final core::Set<dynamic>* #t60 = col::LinkedHashSet::•<dynamic>();
+    #t60.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:115:37: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
   Set<dynamic> set40 = <dynamic>{...notSpreadInt};
-                                    ^") in #t60;
+                                    ^");
+  } =>#t60;
   core::Map<dynamic, dynamic>* map40 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:117:55: Error: Unexpected type 'int' of a map spread entry.  Expected 'dynamic' or a Map.
   Map<dynamic, dynamic> map40 = <dynamic, dynamic>{...notSpreadInt};
                                                       ^": null};
   core::List<dynamic>* lhs50 = <dynamic>[invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:119:38: Error: Unexpected type 'int Function()' of a spread.  Expected 'dynamic' or an Iterable.
   List<dynamic> lhs50 = <dynamic>[...notSpreadFunction];
                                      ^"];
-  core::Set<dynamic>* set50 = let final core::Set<dynamic>* #t62 = col::LinkedHashSet::•<dynamic>() in let final dynamic #t63 = #t62.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:121:37: Error: Unexpected type 'int Function()' of a spread.  Expected 'dynamic' or an Iterable.
+  core::Set<dynamic>* set50 = block {
+    final core::Set<dynamic>* #t61 = col::LinkedHashSet::•<dynamic>();
+    #t61.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:121:37: Error: Unexpected type 'int Function()' of a spread.  Expected 'dynamic' or an Iterable.
   Set<dynamic> set50 = <dynamic>{...notSpreadFunction};
-                                    ^") in #t62;
+                                    ^");
+  } =>#t61;
   core::Map<dynamic, dynamic>* map50 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:123:55: Error: Unexpected type 'int Function()' of a map spread entry.  Expected 'dynamic' or a Map.
   Map<dynamic, dynamic> map50 = <dynamic, dynamic>{...notSpreadFunction};
                                                       ^": null};
   core::List<core::String*>* lhs60 = <core::String*>[invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:125:36: Error: Can't assign spread elements of type 'int' to collection elements of type 'String'.
   List<String> lhs60 = <String>[...spread];
                                    ^"];
-  core::Set<core::String*>* set60 = let final core::Set<core::String*>* #t64 = col::LinkedHashSet::•<core::String*>() in let final dynamic #t65 = #t64.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:127:35: Error: Can't assign spread elements of type 'int' to collection elements of type 'String'.
+  core::Set<core::String*>* set60 = block {
+    final core::Set<core::String*>* #t62 = col::LinkedHashSet::•<core::String*>();
+    #t62.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:127:35: Error: Can't assign spread elements of type 'int' to collection elements of type 'String'.
   Set<String> set60 = <String>{...spread};
-                                  ^") in #t64;
+                                  ^");
+  } =>#t62;
   core::Map<core::int*, core::int*>* map60 = <core::int*, core::int*>{invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:129:39: Error: Can't assign spread entry keys of type 'String' to map entry keys of type 'int'.
   Map<int, int> map60 = <int, int>{...mapSpread};
                                       ^": null};
@@ -305,90 +314,93 @@
   core::List<core::int*>* lhs70 = <core::int*>[invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:133:30: Error: Can't spread a value with static type 'Null'.
   List<int> lhs70 = <int>[...null];
                              ^"];
-  core::Set<core::int*>* set70 = let final core::Set<core::int*>* #t66 = col::LinkedHashSet::•<core::int*>() in let final dynamic #t67 = #t66.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:135:29: Error: Can't spread a value with static type 'Null'.
+  core::Set<core::int*>* set70 = block {
+    final core::Set<core::int*>* #t63 = col::LinkedHashSet::•<core::int*>();
+    #t63.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:135:29: Error: Can't spread a value with static type 'Null'.
   Set<int> set70 = <int>{...null};
-                            ^") in #t66;
+                            ^");
+  } =>#t63;
   core::Set<dynamic>* set71ambiguous = block {
-    final core::Set<dynamic>* #t68 = col::LinkedHashSet::•<dynamic>();
-    #t68.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:139:8: Error: Expected ',' before this.
+    final core::Set<dynamic>* #t64 = col::LinkedHashSet::•<dynamic>();
+    #t64.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:139:8: Error: Expected ',' before this.
     ...null,
        ^");
-    for (final dynamic #t69 in <dynamic>[]) {
-      final dynamic #t70 = #t69 as{TypeError} dynamic;
-      #t68.{core::Set::add}(#t70);
+    for (final dynamic #t65 in <dynamic>[]) {
+      final dynamic #t66 = #t65 as{TypeError} dynamic;
+      #t64.{core::Set::add}{Invariant}(#t66);
     }
-  } =>#t68;
+  } =>#t64;
   core::Map<core::String*, core::int*>* map70 = <core::String*, core::int*>{invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:144:45: Error: Can't spread a value with static type 'Null'.
   Map<String, int> map70 = <String, int>{...null};
                                             ^": null};
   core::List<core::int*>* lhs80 = block {
-    final core::List<core::int*>* #t71 = <core::int*>[];
-    final core::Iterable<core::int*>* #t72 = null;
-    if(!#t72.{core::Object::==}(null))
-      for (final core::int* #t73 in #t72)
-        #t71.{core::List::add}(#t73);
-  } =>#t71;
+    final core::List<core::int*>* #t67 = <core::int*>[];
+    final core::Iterable<core::int*>* #t68 = null;
+    if(!#t68.{core::Object::==}(null))
+      for (final core::int* #t69 in #t68)
+        #t67.{core::List::add}{Invariant}(#t69);
+  } =>#t67;
   core::Set<core::int*>* set80 = block {
-    final core::Set<core::int*>* #t74 = col::LinkedHashSet::•<core::int*>();
-    final core::Iterable<core::int*>* #t75 = null;
-    if(!#t75.{core::Object::==}(null))
-      for (final core::int* #t76 in #t75)
-        #t74.{core::Set::add}(#t76);
-  } =>#t74;
+    final core::Set<core::int*>* #t70 = col::LinkedHashSet::•<core::int*>();
+    final core::Iterable<core::int*>* #t71 = null;
+    if(!#t71.{core::Object::==}(null))
+      for (final core::int* #t72 in #t71)
+        #t70.{core::Set::add}{Invariant}(#t72);
+  } =>#t70;
   core::Set<dynamic>* set81ambiguous = block {
-    final core::Set<dynamic>* #t77 = col::LinkedHashSet::•<dynamic>();
-    final core::Iterable<dynamic>* #t78 = null;
-    if(!#t78.{core::Object::==}(null))
-      for (final dynamic #t79 in #t78) {
-        final dynamic #t80 = #t79 as{TypeError} dynamic;
-        #t77.{core::Set::add}(#t80);
+    final core::Set<dynamic>* #t73 = col::LinkedHashSet::•<dynamic>();
+    final core::Iterable<dynamic>* #t74 = null;
+    if(!#t74.{core::Object::==}(null))
+      for (final dynamic #t75 in #t74) {
+        final dynamic #t76 = #t75 as{TypeError} dynamic;
+        #t73.{core::Set::add}{Invariant}(#t76);
       }
-    for (final dynamic #t81 in <dynamic>[]) {
-      final dynamic #t82 = #t81 as{TypeError} dynamic;
-      #t77.{core::Set::add}(#t82);
+    for (final dynamic #t77 in <dynamic>[]) {
+      final dynamic #t78 = #t77 as{TypeError} dynamic;
+      #t73.{core::Set::add}{Invariant}(#t78);
     }
-  } =>#t77;
+  } =>#t73;
   core::Map<core::String*, core::int*>* map80 = block {
-    final core::Map<core::String*, core::int*>* #t83 = <core::String*, core::int*>{};
-    final core::Map<core::String*, core::int*>* #t84 = null;
-    if(!#t84.{core::Object::==}(null))
-      for (final core::MapEntry<core::String*, core::int*>* #t85 in #t84.{core::Map::entries})
-        #t83.{core::Map::[]=}(#t85.{core::MapEntry::key}, #t85.{core::MapEntry::value});
-  } =>#t83;
+    final core::Map<core::String*, core::int*>* #t79 = <core::String*, core::int*>{};
+    final core::Map<core::String*, core::int*>* #t80 = null;
+    if(!#t80.{core::Object::==}(null))
+      for (final core::MapEntry<core::String*, core::int*>* #t81 in #t80.{core::Map::entries})
+        #t79.{core::Map::[]=}{Invariant}(#t81.{core::MapEntry::key}, #t81.{core::MapEntry::value});
+  } =>#t79;
   core::Map<core::String*, core::int*>* map90 = block {
-    final core::Map<core::String*, core::int*>* #t86 = <core::String*, core::int*>{};
-    for (final core::MapEntry<core::String*, core::int*>* #t87 in self::bar<core::String*, core::int*>().{core::Map::entries})
-      #t86.{core::Map::[]=}(#t87.{core::MapEntry::key}, #t87.{core::MapEntry::value});
-  } =>#t86;
+    final core::Map<core::String*, core::int*>* #t82 = <core::String*, core::int*>{};
+    for (final core::MapEntry<core::String*, core::int*>* #t83 in self::bar<core::String*, core::int*>().{core::Map::entries})
+      #t82.{core::Map::[]=}{Invariant}(#t83.{core::MapEntry::key}, #t83.{core::MapEntry::value});
+  } =>#t82;
   core::List<core::int*>* list100 = block {
-    final core::List<core::int*>* #t88 = <core::int*>[];
-    for (final dynamic #t89 in listNum) {
-      final core::int* #t90 = #t89 as{TypeError} core::int*;
-      #t88.{core::List::add}(#t90);
+    final core::List<core::int*>* #t84 = <core::int*>[];
+    for (final dynamic #t85 in listNum) {
+      final core::int* #t86 = #t85 as{TypeError} core::int*;
+      #t84.{core::List::add}{Invariant}(#t86);
     }
-  } =>#t88;
+  } =>#t84;
   core::Map<core::num*, core::int*>* map100 = block {
-    final core::Map<core::num*, core::int*>* #t91 = <core::num*, core::int*>{};
-    for (final core::MapEntry<dynamic, dynamic>* #t92 in mapIntNum.{core::Map::entries}) {
-      final core::num* #t93 = #t92.{core::MapEntry::key} as{TypeError} core::num*;
-      final core::int* #t94 = #t92.{core::MapEntry::value} as{TypeError} core::int*;
-      #t91.{core::Map::[]=}(#t93, #t94);
+    final core::Map<core::num*, core::int*>* #t87 = <core::num*, core::int*>{};
+    for (final core::MapEntry<dynamic, dynamic>* #t88 in mapIntNum.{core::Map::entries}) {
+      final core::num* #t89 = #t88.{core::MapEntry::key} as{TypeError} core::num*;
+      final core::int* #t90 = #t88.{core::MapEntry::value} as{TypeError} core::int*;
+      #t87.{core::Map::[]=}{Invariant}(#t89, #t90);
+    }
+  } =>#t87;
+  core::List<core::int*>* list110 = block {
+    final core::List<core::int*>* #t91 = <core::int*>[];
+    for (final dynamic #t92 in dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*) {
+      final core::int* #t93 = #t92 as{TypeError} core::int*;
+      #t91.{core::List::add}{Invariant}(#t93);
     }
   } =>#t91;
-  core::List<core::int*>* list110 = block {
-    final core::List<core::int*>* #t95 = <core::int*>[];
-    for (final dynamic #t96 in dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*) {
-      final core::int* #t97 = #t96 as{TypeError} core::int*;
-      #t95.{core::List::add}(#t97);
-    }
-  } =>#t95;
   core::Map<core::num*, core::int*>* map110 = block {
-    final core::Map<core::num*, core::int*>* #t98 = <core::num*, core::int*>{};
-    for (final core::MapEntry<dynamic, dynamic>* #t99 in (dynVar as{TypeError,ForDynamic} core::Map<dynamic, dynamic>*).{core::Map::entries}) {
-      final core::num* #t100 = #t99.{core::MapEntry::key} as{TypeError} core::num*;
-      final core::int* #t101 = #t99.{core::MapEntry::value} as{TypeError} core::int*;
-      #t98.{core::Map::[]=}(#t100, #t101);
+    final core::Map<core::num*, core::int*>* #t94 = <core::num*, core::int*>{};
+    for (final core::MapEntry<dynamic, dynamic>* #t95 in (dynVar as{TypeError,ForDynamic} core::Map<dynamic, dynamic>*).{core::Map::entries}) {
+      final core::num* #t96 = #t95.{core::MapEntry::key} as{TypeError} core::num*;
+      final core::int* #t97 = #t95.{core::MapEntry::value} as{TypeError} core::int*;
+      #t94.{core::Map::[]=}{Invariant}(#t96, #t97);
     }
-  } =>#t98;
+  } =>#t94;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart.weak.transformed.expect
index 7a37a6f..4cafcc2 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart.weak.transformed.expect
@@ -115,7 +115,7 @@
       core::Iterator<dynamic>* :sync-for-iterator = <dynamic>[].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final dynamic #t2 = :sync-for-iterator.{core::Iterator::current};
-        #t1.{core::List::add}(#t2);
+        #t1.{core::List::add}{Invariant}(#t2);
       }
     }
   } =>#t1;
@@ -125,7 +125,7 @@
       core::Iterator<dynamic>* :sync-for-iterator = <dynamic>[].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final dynamic #t4 = :sync-for-iterator.{core::Iterator::current};
-        #t3.{core::Set::add}(#t4);
+        #t3.{core::Set::add}{Invariant}(#t4);
       }
     }
   } =>#t3;
@@ -135,7 +135,7 @@
       core::Iterator<core::MapEntry<dynamic, dynamic>>* :sync-for-iterator = <dynamic, dynamic>{}.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::MapEntry<dynamic, dynamic>* #t6 = :sync-for-iterator.{core::Iterator::current};
-        #t5.{core::Map::[]=}(#t6.{core::MapEntry::key}, #t6.{core::MapEntry::value});
+        #t5.{core::Map::[]=}{Invariant}(#t6.{core::MapEntry::key}, #t6.{core::MapEntry::value});
       }
     }
   } =>#t5;
@@ -145,7 +145,7 @@
       core::Iterator<core::MapEntry<dynamic, dynamic>>* :sync-for-iterator = <dynamic, dynamic>{}.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::MapEntry<dynamic, dynamic>* #t8 = :sync-for-iterator.{core::Iterator::current};
-        #t7.{core::Map::[]=}(#t8.{core::MapEntry::key}, #t8.{core::MapEntry::value});
+        #t7.{core::Map::[]=}{Invariant}(#t8.{core::MapEntry::key}, #t8.{core::MapEntry::value});
       }
     }
   } =>#t7;
@@ -155,7 +155,7 @@
       core::Iterator<core::int*>* :sync-for-iterator = spread.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::int* #t10 = :sync-for-iterator.{core::Iterator::current};
-        #t9.{core::List::add}(#t10);
+        #t9.{core::List::add}{Invariant}(#t10);
       }
     }
   } =>#t9;
@@ -165,10 +165,10 @@
       core::Iterator<core::int*>* :sync-for-iterator = spread.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::int* #t12 = :sync-for-iterator.{core::Iterator::current};
-        #t11.{core::Set::add}(#t12);
+        #t11.{core::Set::add}{Invariant}(#t12);
       }
     }
-    #t11.{core::Set::add}(42);
+    #t11.{core::Set::add}{Invariant}(42);
   } =>#t11;
   core::Set<core::int*>* set20ambiguous = block {
     final core::Set<core::int*>* #t13 = new col::_CompactLinkedHashSet::•<core::int*>();
@@ -178,7 +178,7 @@
         final dynamic #t14 = :sync-for-iterator.{core::Iterator::current};
         {
           final core::int* #t15 = #t14 as{TypeError} core::int*;
-          #t13.{core::Set::add}(#t15);
+          #t13.{core::Set::add}{Invariant}(#t15);
         }
       }
     }
@@ -189,10 +189,10 @@
       core::Iterator<core::MapEntry<core::String*, core::int*>>* :sync-for-iterator = mapSpread.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::MapEntry<core::String*, core::int*>* #t17 = :sync-for-iterator.{core::Iterator::current};
-        #t16.{core::Map::[]=}(#t17.{core::MapEntry::key}, #t17.{core::MapEntry::value});
+        #t16.{core::Map::[]=}{Invariant}(#t17.{core::MapEntry::key}, #t17.{core::MapEntry::value});
       }
     }
-    #t16.{core::Map::[]=}("baz", 42);
+    #t16.{core::Map::[]=}{Invariant}("baz", 42);
   } =>#t16;
   core::Map<core::String*, core::int*>* map20ambiguous = block {
     final core::Map<core::String*, core::int*>* #t18 = <core::String*, core::int*>{};
@@ -200,7 +200,7 @@
       core::Iterator<core::MapEntry<core::String*, core::int*>>* :sync-for-iterator = mapSpread.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::MapEntry<core::String*, core::int*>* #t19 = :sync-for-iterator.{core::Iterator::current};
-        #t18.{core::Map::[]=}(#t19.{core::MapEntry::key}, #t19.{core::MapEntry::value});
+        #t18.{core::Map::[]=}{Invariant}(#t19.{core::MapEntry::key}, #t19.{core::MapEntry::value});
       }
     }
   } =>#t18;
@@ -210,7 +210,7 @@
       core::Iterator<dynamic>* :sync-for-iterator = ((spread as dynamic) as{TypeError,ForDynamic} core::Iterable<dynamic>*).{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final dynamic #t21 = :sync-for-iterator.{core::Iterator::current};
-        #t20.{core::List::add}(#t21);
+        #t20.{core::List::add}{Invariant}(#t21);
       }
     }
   } =>#t20;
@@ -220,10 +220,10 @@
       core::Iterator<dynamic>* :sync-for-iterator = ((spread as dynamic) as{TypeError,ForDynamic} core::Iterable<dynamic>*).{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final dynamic #t23 = :sync-for-iterator.{core::Iterator::current};
-        #t22.{core::Set::add}(#t23);
+        #t22.{core::Set::add}{Invariant}(#t23);
       }
     }
-    #t22.{core::Set::add}(42);
+    #t22.{core::Set::add}{Invariant}(42);
   } =>#t22;
   core::Map<dynamic, dynamic>* map21 = block {
     final core::Map<dynamic, dynamic>* #t24 = <dynamic, dynamic>{};
@@ -231,10 +231,10 @@
       core::Iterator<core::MapEntry<dynamic, dynamic>>* :sync-for-iterator = ((mapSpread as dynamic) as{TypeError,ForDynamic} core::Map<dynamic, dynamic>*).{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::MapEntry<dynamic, dynamic>* #t25 = :sync-for-iterator.{core::Iterator::current};
-        #t24.{core::Map::[]=}(#t25.{core::MapEntry::key}, #t25.{core::MapEntry::value});
+        #t24.{core::Map::[]=}{Invariant}(#t25.{core::MapEntry::key}, #t25.{core::MapEntry::value});
       }
     }
-    #t24.{core::Map::[]=}("baz", 42);
+    #t24.{core::Map::[]=}{Invariant}("baz", 42);
   } =>#t24;
   dynamic map21ambiguous = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:66:28: Error: Not enough type information to disambiguate between literal set and literal map.
 Try providing type arguments for the literal explicitly to disambiguate it.
@@ -246,7 +246,7 @@
       core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::int* #t27 = :sync-for-iterator.{core::Iterator::current};
-        #t26.{core::List::add}(#t27);
+        #t26.{core::List::add}{Invariant}(#t27);
       }
     }
   } =>#t26;
@@ -256,10 +256,10 @@
       core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::int* #t29 = :sync-for-iterator.{core::Iterator::current};
-        #t28.{core::Set::add}(#t29);
+        #t28.{core::Set::add}{Invariant}(#t29);
       }
     }
-    #t28.{core::Set::add}(42);
+    #t28.{core::Set::add}{Invariant}(42);
   } =>#t28;
   core::Set<core::int*>* set22ambiguous = block {
     final core::Set<core::int*>* #t30 = new col::_CompactLinkedHashSet::•<core::int*>();
@@ -269,7 +269,7 @@
         final dynamic #t31 = :sync-for-iterator.{core::Iterator::current};
         {
           final core::int* #t32 = #t31 as{TypeError} core::int*;
-          #t30.{core::Set::add}(#t32);
+          #t30.{core::Set::add}{Invariant}(#t32);
         }
       }
     }
@@ -280,7 +280,7 @@
       core::Iterator<core::MapEntry<core::String*, core::int*>>* :sync-for-iterator = <core::String*, core::int*>{}.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::MapEntry<core::String*, core::int*>* #t34 = :sync-for-iterator.{core::Iterator::current};
-        #t33.{core::Map::[]=}(#t34.{core::MapEntry::key}, #t34.{core::MapEntry::value});
+        #t33.{core::Map::[]=}{Invariant}(#t34.{core::MapEntry::key}, #t34.{core::MapEntry::value});
       }
     }
   } =>#t33;
@@ -290,7 +290,7 @@
       core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::List<core::int*>* #t36 = :sync-for-iterator.{core::Iterator::current};
-        #t35.{core::List::add}(#t36);
+        #t35.{core::List::add}{Invariant}(#t36);
       }
     }
   } =>#t35;
@@ -300,10 +300,10 @@
       core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::List<core::int*>* #t38 = :sync-for-iterator.{core::Iterator::current};
-        #t37.{core::Set::add}(#t38);
+        #t37.{core::Set::add}{Invariant}(#t38);
       }
     }
-    #t37.{core::Set::add}(<core::int*>[42]);
+    #t37.{core::Set::add}{Invariant}(<core::int*>[42]);
   } =>#t37;
   core::Set<core::List<core::int*>*>* set23ambiguous = block {
     final core::Set<core::List<core::int*>*>* #t39 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
@@ -313,7 +313,7 @@
         final dynamic #t40 = :sync-for-iterator.{core::Iterator::current};
         {
           final core::List<core::int*>* #t41 = #t40 as{TypeError} core::List<core::int*>*;
-          #t39.{core::Set::add}(#t41);
+          #t39.{core::Set::add}{Invariant}(#t41);
         }
       }
     }
@@ -324,7 +324,7 @@
       core::Iterator<core::MapEntry<core::String*, core::List<core::int*>*>>* :sync-for-iterator = <core::String*, core::List<core::int*>*>{"baz": <core::int*>[]}.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::MapEntry<core::String*, core::List<core::int*>*>* #t43 = :sync-for-iterator.{core::Iterator::current};
-        #t42.{core::Map::[]=}(#t43.{core::MapEntry::key}, #t43.{core::MapEntry::value});
+        #t42.{core::Map::[]=}{Invariant}(#t43.{core::MapEntry::key}, #t43.{core::MapEntry::value});
       }
     }
   } =>#t42;
@@ -340,7 +340,7 @@
       core::Iterator<core::int*>* :sync-for-iterator = spread.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::int* #t46 = :sync-for-iterator.{core::Iterator::current};
-        #t45.{core::List::add}(#t46);
+        #t45.{core::List::add}{Invariant}(#t46);
       }
     }
   } =>#t45) as{TypeError} core::int*;
@@ -353,10 +353,10 @@
       core::Iterator<core::int*>* :sync-for-iterator = spread.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::int* #t49 = :sync-for-iterator.{core::Iterator::current};
-        #t48.{core::Set::add}(#t49);
+        #t48.{core::Set::add}{Invariant}(#t49);
       }
     }
-    #t48.{core::Set::add}(42);
+    #t48.{core::Set::add}{Invariant}(42);
   } =>#t48) as{TypeError} core::int*;
   core::int* set30ambiguous = let final<BottomType> #t50 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:105:7: Error: A value of type 'Set<int>' can't be assigned to a variable of type 'int'.
  - 'Set' is from 'dart:core'.
@@ -369,7 +369,7 @@
         final dynamic #t52 = :sync-for-iterator.{core::Iterator::current};
         {
           final core::int* #t53 = #t52 as{TypeError} core::int*;
-          #t51.{core::Set::add}(#t53);
+          #t51.{core::Set::add}{Invariant}(#t53);
         }
       }
     }
@@ -383,10 +383,10 @@
       core::Iterator<core::MapEntry<core::String*, core::int*>>* :sync-for-iterator = mapSpread.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::MapEntry<core::String*, core::int*>* #t56 = :sync-for-iterator.{core::Iterator::current};
-        #t55.{core::Map::[]=}(#t56.{core::MapEntry::key}, #t56.{core::MapEntry::value});
+        #t55.{core::Map::[]=}{Invariant}(#t56.{core::MapEntry::key}, #t56.{core::MapEntry::value});
       }
     }
-    #t55.{core::Map::[]=}("baz", 42);
+    #t55.{core::Map::[]=}{Invariant}("baz", 42);
   } =>#t55) as{TypeError} core::int*;
   core::int* map30ambiguous = let final<BottomType> #t57 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:111:7: Error: A value of type 'Map<String, int>' can't be assigned to a variable of type 'int'.
  - 'Map' is from 'dart:core'.
@@ -397,34 +397,43 @@
       core::Iterator<core::MapEntry<core::String*, core::int*>>* :sync-for-iterator = mapSpread.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::MapEntry<core::String*, core::int*>* #t59 = :sync-for-iterator.{core::Iterator::current};
-        #t58.{core::Map::[]=}(#t59.{core::MapEntry::key}, #t59.{core::MapEntry::value});
+        #t58.{core::Map::[]=}{Invariant}(#t59.{core::MapEntry::key}, #t59.{core::MapEntry::value});
       }
     }
   } =>#t58) as{TypeError} core::int*;
   core::List<dynamic>* lhs40 = <dynamic>[invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:113:38: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
   List<dynamic> lhs40 = <dynamic>[...notSpreadInt];
                                      ^"];
-  core::Set<dynamic>* set40 = let final core::Set<dynamic>* #t60 = new col::_CompactLinkedHashSet::•<dynamic>() in let final core::bool #t61 = #t60.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:115:37: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
+  core::Set<dynamic>* set40 = block {
+    final core::Set<dynamic>* #t60 = new col::_CompactLinkedHashSet::•<dynamic>();
+    #t60.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:115:37: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
   Set<dynamic> set40 = <dynamic>{...notSpreadInt};
-                                    ^") in #t60;
+                                    ^");
+  } =>#t60;
   core::Map<dynamic, dynamic>* map40 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:117:55: Error: Unexpected type 'int' of a map spread entry.  Expected 'dynamic' or a Map.
   Map<dynamic, dynamic> map40 = <dynamic, dynamic>{...notSpreadInt};
                                                       ^": null};
   core::List<dynamic>* lhs50 = <dynamic>[invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:119:38: Error: Unexpected type 'int Function()' of a spread.  Expected 'dynamic' or an Iterable.
   List<dynamic> lhs50 = <dynamic>[...notSpreadFunction];
                                      ^"];
-  core::Set<dynamic>* set50 = let final core::Set<dynamic>* #t62 = new col::_CompactLinkedHashSet::•<dynamic>() in let final core::bool #t63 = #t62.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:121:37: Error: Unexpected type 'int Function()' of a spread.  Expected 'dynamic' or an Iterable.
+  core::Set<dynamic>* set50 = block {
+    final core::Set<dynamic>* #t61 = new col::_CompactLinkedHashSet::•<dynamic>();
+    #t61.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:121:37: Error: Unexpected type 'int Function()' of a spread.  Expected 'dynamic' or an Iterable.
   Set<dynamic> set50 = <dynamic>{...notSpreadFunction};
-                                    ^") in #t62;
+                                    ^");
+  } =>#t61;
   core::Map<dynamic, dynamic>* map50 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:123:55: Error: Unexpected type 'int Function()' of a map spread entry.  Expected 'dynamic' or a Map.
   Map<dynamic, dynamic> map50 = <dynamic, dynamic>{...notSpreadFunction};
                                                       ^": null};
   core::List<core::String*>* lhs60 = <core::String*>[invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:125:36: Error: Can't assign spread elements of type 'int' to collection elements of type 'String'.
   List<String> lhs60 = <String>[...spread];
                                    ^"];
-  core::Set<core::String*>* set60 = let final core::Set<core::String*>* #t64 = new col::_CompactLinkedHashSet::•<core::String*>() in let final core::bool #t65 = #t64.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:127:35: Error: Can't assign spread elements of type 'int' to collection elements of type 'String'.
+  core::Set<core::String*>* set60 = block {
+    final core::Set<core::String*>* #t62 = new col::_CompactLinkedHashSet::•<core::String*>();
+    #t62.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:127:35: Error: Can't assign spread elements of type 'int' to collection elements of type 'String'.
   Set<String> set60 = <String>{...spread};
-                                  ^") in #t64;
+                                  ^");
+  } =>#t62;
   core::Map<core::int*, core::int*>* map60 = <core::int*, core::int*>{invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:129:39: Error: Can't assign spread entry keys of type 'String' to map entry keys of type 'int'.
   Map<int, int> map60 = <int, int>{...mapSpread};
                                       ^": null};
@@ -434,148 +443,151 @@
   core::List<core::int*>* lhs70 = <core::int*>[invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:133:30: Error: Can't spread a value with static type 'Null'.
   List<int> lhs70 = <int>[...null];
                              ^"];
-  core::Set<core::int*>* set70 = let final core::Set<core::int*>* #t66 = new col::_CompactLinkedHashSet::•<core::int*>() in let final core::bool #t67 = #t66.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:135:29: Error: Can't spread a value with static type 'Null'.
+  core::Set<core::int*>* set70 = block {
+    final core::Set<core::int*>* #t63 = new col::_CompactLinkedHashSet::•<core::int*>();
+    #t63.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:135:29: Error: Can't spread a value with static type 'Null'.
   Set<int> set70 = <int>{...null};
-                            ^") in #t66;
+                            ^");
+  } =>#t63;
   core::Set<dynamic>* set71ambiguous = block {
-    final core::Set<dynamic>* #t68 = new col::_CompactLinkedHashSet::•<dynamic>();
-    #t68.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:139:8: Error: Expected ',' before this.
+    final core::Set<dynamic>* #t64 = new col::_CompactLinkedHashSet::•<dynamic>();
+    #t64.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:139:8: Error: Expected ',' before this.
     ...null,
        ^");
     {
       core::Iterator<dynamic>* :sync-for-iterator = <dynamic>[].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final dynamic #t69 = :sync-for-iterator.{core::Iterator::current};
+        final dynamic #t65 = :sync-for-iterator.{core::Iterator::current};
         {
-          final dynamic #t70 = #t69 as{TypeError} dynamic;
-          #t68.{core::Set::add}(#t70);
+          final dynamic #t66 = #t65 as{TypeError} dynamic;
+          #t64.{core::Set::add}{Invariant}(#t66);
         }
       }
     }
-  } =>#t68;
+  } =>#t64;
   core::Map<core::String*, core::int*>* map70 = <core::String*, core::int*>{invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:144:45: Error: Can't spread a value with static type 'Null'.
   Map<String, int> map70 = <String, int>{...null};
                                             ^": null};
   core::List<core::int*>* lhs80 = block {
-    final core::List<core::int*>* #t71 = <core::int*>[];
-    final core::Iterable<core::int*>* #t72 = null;
-    if(!#t72.{core::Object::==}(null)) {
-      core::Iterator<core::int*>* :sync-for-iterator = #t72.{core::Iterable::iterator};
+    final core::List<core::int*>* #t67 = <core::int*>[];
+    final core::Iterable<core::int*>* #t68 = null;
+    if(!#t68.{core::Object::==}(null)) {
+      core::Iterator<core::int*>* :sync-for-iterator = #t68.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::int* #t73 = :sync-for-iterator.{core::Iterator::current};
-        #t71.{core::List::add}(#t73);
+        final core::int* #t69 = :sync-for-iterator.{core::Iterator::current};
+        #t67.{core::List::add}{Invariant}(#t69);
       }
     }
-  } =>#t71;
+  } =>#t67;
   core::Set<core::int*>* set80 = block {
-    final core::Set<core::int*>* #t74 = new col::_CompactLinkedHashSet::•<core::int*>();
-    final core::Iterable<core::int*>* #t75 = null;
-    if(!#t75.{core::Object::==}(null)) {
-      core::Iterator<core::int*>* :sync-for-iterator = #t75.{core::Iterable::iterator};
+    final core::Set<core::int*>* #t70 = new col::_CompactLinkedHashSet::•<core::int*>();
+    final core::Iterable<core::int*>* #t71 = null;
+    if(!#t71.{core::Object::==}(null)) {
+      core::Iterator<core::int*>* :sync-for-iterator = #t71.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::int* #t76 = :sync-for-iterator.{core::Iterator::current};
-        #t74.{core::Set::add}(#t76);
+        final core::int* #t72 = :sync-for-iterator.{core::Iterator::current};
+        #t70.{core::Set::add}{Invariant}(#t72);
       }
     }
-  } =>#t74;
+  } =>#t70;
   core::Set<dynamic>* set81ambiguous = block {
-    final core::Set<dynamic>* #t77 = new col::_CompactLinkedHashSet::•<dynamic>();
-    final core::Iterable<dynamic>* #t78 = null;
-    if(!#t78.{core::Object::==}(null)) {
-      core::Iterator<dynamic>* :sync-for-iterator = #t78.{core::Iterable::iterator};
+    final core::Set<dynamic>* #t73 = new col::_CompactLinkedHashSet::•<dynamic>();
+    final core::Iterable<dynamic>* #t74 = null;
+    if(!#t74.{core::Object::==}(null)) {
+      core::Iterator<dynamic>* :sync-for-iterator = #t74.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final dynamic #t79 = :sync-for-iterator.{core::Iterator::current};
+        final dynamic #t75 = :sync-for-iterator.{core::Iterator::current};
         {
-          final dynamic #t80 = #t79 as{TypeError} dynamic;
-          #t77.{core::Set::add}(#t80);
+          final dynamic #t76 = #t75 as{TypeError} dynamic;
+          #t73.{core::Set::add}{Invariant}(#t76);
         }
       }
     }
     {
       core::Iterator<dynamic>* :sync-for-iterator = <dynamic>[].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final dynamic #t81 = :sync-for-iterator.{core::Iterator::current};
+        final dynamic #t77 = :sync-for-iterator.{core::Iterator::current};
         {
-          final dynamic #t82 = #t81 as{TypeError} dynamic;
-          #t77.{core::Set::add}(#t82);
+          final dynamic #t78 = #t77 as{TypeError} dynamic;
+          #t73.{core::Set::add}{Invariant}(#t78);
         }
       }
     }
-  } =>#t77;
+  } =>#t73;
   core::Map<core::String*, core::int*>* map80 = block {
-    final core::Map<core::String*, core::int*>* #t83 = <core::String*, core::int*>{};
-    final core::Map<core::String*, core::int*>* #t84 = null;
-    if(!#t84.{core::Object::==}(null)) {
-      core::Iterator<core::MapEntry<core::String*, core::int*>>* :sync-for-iterator = #t84.{core::Map::entries}.{core::Iterable::iterator};
+    final core::Map<core::String*, core::int*>* #t79 = <core::String*, core::int*>{};
+    final core::Map<core::String*, core::int*>* #t80 = null;
+    if(!#t80.{core::Object::==}(null)) {
+      core::Iterator<core::MapEntry<core::String*, core::int*>>* :sync-for-iterator = #t80.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::MapEntry<core::String*, core::int*>* #t85 = :sync-for-iterator.{core::Iterator::current};
-        #t83.{core::Map::[]=}(#t85.{core::MapEntry::key}, #t85.{core::MapEntry::value});
+        final core::MapEntry<core::String*, core::int*>* #t81 = :sync-for-iterator.{core::Iterator::current};
+        #t79.{core::Map::[]=}{Invariant}(#t81.{core::MapEntry::key}, #t81.{core::MapEntry::value});
       }
     }
-  } =>#t83;
+  } =>#t79;
   core::Map<core::String*, core::int*>* map90 = block {
-    final core::Map<core::String*, core::int*>* #t86 = <core::String*, core::int*>{};
+    final core::Map<core::String*, core::int*>* #t82 = <core::String*, core::int*>{};
     {
       core::Iterator<core::MapEntry<core::String*, core::int*>>* :sync-for-iterator = self::bar<core::String*, core::int*>().{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::MapEntry<core::String*, core::int*>* #t87 = :sync-for-iterator.{core::Iterator::current};
-        #t86.{core::Map::[]=}(#t87.{core::MapEntry::key}, #t87.{core::MapEntry::value});
+        final core::MapEntry<core::String*, core::int*>* #t83 = :sync-for-iterator.{core::Iterator::current};
+        #t82.{core::Map::[]=}{Invariant}(#t83.{core::MapEntry::key}, #t83.{core::MapEntry::value});
       }
     }
-  } =>#t86;
+  } =>#t82;
   core::List<core::int*>* list100 = block {
-    final core::List<core::int*>* #t88 = <core::int*>[];
+    final core::List<core::int*>* #t84 = <core::int*>[];
     {
       core::Iterator<core::num*>* :sync-for-iterator = listNum.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final dynamic #t89 = :sync-for-iterator.{core::Iterator::current};
+        final dynamic #t85 = :sync-for-iterator.{core::Iterator::current};
         {
-          final core::int* #t90 = #t89 as{TypeError} core::int*;
-          #t88.{core::List::add}(#t90);
+          final core::int* #t86 = #t85 as{TypeError} core::int*;
+          #t84.{core::List::add}{Invariant}(#t86);
         }
       }
     }
-  } =>#t88;
+  } =>#t84;
   core::Map<core::num*, core::int*>* map100 = block {
-    final core::Map<core::num*, core::int*>* #t91 = <core::num*, core::int*>{};
+    final core::Map<core::num*, core::int*>* #t87 = <core::num*, core::int*>{};
     {
       core::Iterator<core::MapEntry<core::int*, core::num*>>* :sync-for-iterator = mapIntNum.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::MapEntry<dynamic, dynamic>* #t92 = :sync-for-iterator.{core::Iterator::current};
+        final core::MapEntry<dynamic, dynamic>* #t88 = :sync-for-iterator.{core::Iterator::current};
         {
-          final core::num* #t93 = #t92.{core::MapEntry::key} as{TypeError} core::num*;
-          final core::int* #t94 = #t92.{core::MapEntry::value} as{TypeError} core::int*;
-          #t91.{core::Map::[]=}(#t93, #t94);
+          final core::num* #t89 = #t88.{core::MapEntry::key} as{TypeError} core::num*;
+          final core::int* #t90 = #t88.{core::MapEntry::value} as{TypeError} core::int*;
+          #t87.{core::Map::[]=}{Invariant}(#t89, #t90);
+        }
+      }
+    }
+  } =>#t87;
+  core::List<core::int*>* list110 = block {
+    final core::List<core::int*>* #t91 = <core::int*>[];
+    {
+      core::Iterator<dynamic>* :sync-for-iterator = (dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final dynamic #t92 = :sync-for-iterator.{core::Iterator::current};
+        {
+          final core::int* #t93 = #t92 as{TypeError} core::int*;
+          #t91.{core::List::add}{Invariant}(#t93);
         }
       }
     }
   } =>#t91;
-  core::List<core::int*>* list110 = block {
-    final core::List<core::int*>* #t95 = <core::int*>[];
-    {
-      core::Iterator<dynamic>* :sync-for-iterator = (dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*).{core::Iterable::iterator};
-      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final dynamic #t96 = :sync-for-iterator.{core::Iterator::current};
-        {
-          final core::int* #t97 = #t96 as{TypeError} core::int*;
-          #t95.{core::List::add}(#t97);
-        }
-      }
-    }
-  } =>#t95;
   core::Map<core::num*, core::int*>* map110 = block {
-    final core::Map<core::num*, core::int*>* #t98 = <core::num*, core::int*>{};
+    final core::Map<core::num*, core::int*>* #t94 = <core::num*, core::int*>{};
     {
       core::Iterator<core::MapEntry<dynamic, dynamic>>* :sync-for-iterator = (dynVar as{TypeError,ForDynamic} core::Map<dynamic, dynamic>*).{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::MapEntry<dynamic, dynamic>* #t99 = :sync-for-iterator.{core::Iterator::current};
+        final core::MapEntry<dynamic, dynamic>* #t95 = :sync-for-iterator.{core::Iterator::current};
         {
-          final core::num* #t100 = #t99.{core::MapEntry::key} as{TypeError} core::num*;
-          final core::int* #t101 = #t99.{core::MapEntry::value} as{TypeError} core::int*;
-          #t98.{core::Map::[]=}(#t100, #t101);
+          final core::num* #t96 = #t95.{core::MapEntry::key} as{TypeError} core::num*;
+          final core::int* #t97 = #t95.{core::MapEntry::value} as{TypeError} core::int*;
+          #t94.{core::Map::[]=}{Invariant}(#t96, #t97);
         }
       }
     }
-  } =>#t98;
+  } =>#t94;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/statements.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/statements.dart.weak.transformed.expect
index 7200685b..a02506d 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/statements.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/statements.dart.weak.transformed.expect
@@ -32,7 +32,6 @@
         {
           {
             asy::Stream<dynamic>* :stream = d as{TypeError,ForDynamic} asy::Stream<dynamic>*;
-            asy::_asyncStarListenHelper(:stream, :async_op);
             asy::_StreamIterator<dynamic>* :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
             try
               #L2:
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/type_of_null.dart b/pkg/front_end/testcases/general_nnbd_opt_out/type_of_null.dart
index b7bd527..71a7a5b 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/type_of_null.dart
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/type_of_null.dart
@@ -12,22 +12,22 @@
 Null foo() => null;
 
 main() {
-  /*@ typeArgs=Null? */ map(/*@ returnType=Null? */ () {},
+  /*@ typeArgs=Null */ map(/*@ returnType=Null */ () {},
       /*@ returnType=<BottomType> */ () => throw "hello");
-  /*@ typeArgs=Null? */ map(/*@ returnType=<BottomType> */ () => throw "hello",
-      /*@ returnType=Null? */ () {});
-  Null Function() f = /*@ returnType=Null? */ () {};
-  /*@ typeArgs=Null? */ map(
+  /*@ typeArgs=Null */ map(/*@ returnType=<BottomType> */ () => throw "hello",
+      /*@ returnType=Null */ () {});
+  Null Function() f = /*@ returnType=Null */ () {};
+  /*@ typeArgs=Null */ map(
       foo, /*@ returnType=<BottomType> */ () => throw "hello");
-  /*@ typeArgs=Null? */ map(
+  /*@ typeArgs=Null */ map(
       /*@ returnType=<BottomType> */ () => throw "hello", foo);
-  /*@ typeArgs=Null? */ map(/*@ returnType=Null? */ () {
+  /*@ typeArgs=Null */ map(/*@ returnType=Null */ () {
     return null;
   }, /*@ returnType=<BottomType> */ () => throw "hello");
 
-  /*@ typeArgs=Null? */ map(/*@ returnType=<BottomType> */ () => throw "hello",
-      /*@ returnType=Null? */ () {
+  /*@ typeArgs=Null */ map(/*@ returnType=<BottomType> */ () => throw "hello",
+      /*@ returnType=Null */ () {
     return null;
   });
-  /*@ typeArgs=() ->* Null? */ id(/*@ returnType=Null? */ () {});
+  /*@ typeArgs=() ->* Null */ id(/*@ returnType=Null */ () {});
 }
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/type_of_null.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/type_of_null.dart.weak.expect
index c0c8997..335ccc5 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/type_of_null.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/type_of_null.dart.weak.expect
@@ -5,21 +5,21 @@
 static method map<T extends core::Object* = dynamic>(() →* self::map::T* f1, () →* self::map::T* f2) → self::map::T* {}
 static method id<T extends core::Object* = dynamic>(self::id::T* t) → dynamic
   return t;
-static method foo() → core::Null?
+static method foo() → Null
   return null;
 static method main() → dynamic {
-  self::map<core::Null?>(() → core::Null? {}, () → <BottomType>=> throw "hello");
-  self::map<core::Null?>(() → <BottomType>=> throw "hello", () → core::Null? {});
-  () →* core::Null? f = () → core::Null? {};
-  self::map<core::Null?>(#C1, () → <BottomType>=> throw "hello");
-  self::map<core::Null?>(() → <BottomType>=> throw "hello", #C1);
-  self::map<core::Null?>(() → core::Null? {
+  self::map<Null>(() → Null {}, () → <BottomType>=> throw "hello");
+  self::map<Null>(() → <BottomType>=> throw "hello", () → Null {});
+  () →* Null f = () → Null {};
+  self::map<Null>(#C1, () → <BottomType>=> throw "hello");
+  self::map<Null>(() → <BottomType>=> throw "hello", #C1);
+  self::map<Null>(() → Null {
     return null;
   }, () → <BottomType>=> throw "hello");
-  self::map<core::Null?>(() → <BottomType>=> throw "hello", () → core::Null? {
+  self::map<Null>(() → <BottomType>=> throw "hello", () → Null {
     return null;
   });
-  self::id<() →* core::Null?>(() → core::Null? {});
+  self::id<() →* Null>(() → Null {});
 }
 
 constants  {
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/type_of_null.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/type_of_null.dart.weak.transformed.expect
index c0c8997..335ccc5 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/type_of_null.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/type_of_null.dart.weak.transformed.expect
@@ -5,21 +5,21 @@
 static method map<T extends core::Object* = dynamic>(() →* self::map::T* f1, () →* self::map::T* f2) → self::map::T* {}
 static method id<T extends core::Object* = dynamic>(self::id::T* t) → dynamic
   return t;
-static method foo() → core::Null?
+static method foo() → Null
   return null;
 static method main() → dynamic {
-  self::map<core::Null?>(() → core::Null? {}, () → <BottomType>=> throw "hello");
-  self::map<core::Null?>(() → <BottomType>=> throw "hello", () → core::Null? {});
-  () →* core::Null? f = () → core::Null? {};
-  self::map<core::Null?>(#C1, () → <BottomType>=> throw "hello");
-  self::map<core::Null?>(() → <BottomType>=> throw "hello", #C1);
-  self::map<core::Null?>(() → core::Null? {
+  self::map<Null>(() → Null {}, () → <BottomType>=> throw "hello");
+  self::map<Null>(() → <BottomType>=> throw "hello", () → Null {});
+  () →* Null f = () → Null {};
+  self::map<Null>(#C1, () → <BottomType>=> throw "hello");
+  self::map<Null>(() → <BottomType>=> throw "hello", #C1);
+  self::map<Null>(() → Null {
     return null;
   }, () → <BottomType>=> throw "hello");
-  self::map<core::Null?>(() → <BottomType>=> throw "hello", () → core::Null? {
+  self::map<Null>(() → <BottomType>=> throw "hello", () → Null {
     return null;
   });
-  self::id<() →* core::Null?>(() → core::Null? {});
+  self::id<() →* Null>(() → Null {});
 }
 
 constants  {
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/type_variable_bound_access.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/type_variable_bound_access.dart.weak.expect
index 080ff9e..dec49a6 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/type_variable_bound_access.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/type_variable_bound_access.dart.weak.expect
@@ -13,7 +13,7 @@
 class DynamicClass<T extends dynamic = dynamic, S extends self::DynamicClass::T* = dynamic> extends core::Object {
   generic-covariant-impl field self::DynamicClass::T* field1;
   generic-covariant-impl field self::DynamicClass::T* field2;
-  constructor •(self::DynamicClass::T* field1, self::DynamicClass::T* field2) → self::DynamicClass<self::DynamicClass::T%, self::DynamicClass::S*>*
+  constructor •(self::DynamicClass::T* field1, self::DynamicClass::T* field2) → self::DynamicClass<self::DynamicClass::T*, self::DynamicClass::S*>*
     : self::DynamicClass::field1 = field1, self::DynamicClass::field2 = field2, super core::Object::•()
     ;
   method method() → dynamic
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/type_variable_bound_access.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/type_variable_bound_access.dart.weak.transformed.expect
new file mode 100644
index 0000000..a7cabde
--- /dev/null
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/type_variable_bound_access.dart.weak.transformed.expect
@@ -0,0 +1,59 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general_nnbd_opt_out/type_variable_bound_access.dart:24:36: Error: The getter 'length' isn't defined for the class 'num'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'length'.
+//   num method2() => field1 + field2.length;
+//                                    ^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class DynamicClass<T extends dynamic = dynamic, S extends self::DynamicClass::T* = dynamic> extends core::Object {
+  generic-covariant-impl field self::DynamicClass::T* field1;
+  generic-covariant-impl field self::DynamicClass::T* field2;
+  constructor •(self::DynamicClass::T* field1, self::DynamicClass::T* field2) → self::DynamicClass<self::DynamicClass::T*, self::DynamicClass::S*>*
+    : self::DynamicClass::field1 = field1, self::DynamicClass::field2 = field2, super core::Object::•()
+    ;
+  method method() → dynamic
+    return this.{self::DynamicClass::field1}.*(this.{self::DynamicClass::field2});
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class NumClass<T extends core::num* = core::num*, S extends self::NumClass::T* = core::num*> extends core::Object {
+  generic-covariant-impl field self::NumClass::T* field1;
+  generic-covariant-impl field self::NumClass::S* field2;
+  constructor •(self::NumClass::T* field1, self::NumClass::S* field2) → self::NumClass<self::NumClass::T*, self::NumClass::S*>*
+    : self::NumClass::field1 = field1, self::NumClass::field2 = field2, super core::Object::•()
+    ;
+  method method1() → core::num*
+    return this.{self::NumClass::field1}.{core::num::*}(this.{self::NumClass::field2});
+  method method2() → core::num*
+    return this.{self::NumClass::field1}.{core::num::+}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/type_variable_bound_access.dart:24:36: Error: The getter 'length' isn't defined for the class 'num'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'length'.
+  num method2() => field1 + field2.length;
+                                   ^^^^^^");
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  new self::DynamicClass::•<core::num*, core::int*>(0.5, 2).{self::DynamicClass::method}();
+  new self::NumClass::•<core::num*, core::double*>(2, 0.5).{self::NumClass::method1}();
+}
diff --git a/pkg/front_end/testcases/implicit_getter_calls/folder.options b/pkg/front_end/testcases/implicit_getter_calls/folder.options
index fe39d71..3244fd8 100644
--- a/pkg/front_end/testcases/implicit_getter_calls/folder.options
+++ b/pkg/front_end/testcases/implicit_getter_calls/folder.options
@@ -1,2 +1,3 @@
 --force-no-explicit-getter-calls
+--enable-experiment=no-non-nullable
 --target=none
diff --git a/pkg/front_end/testcases/implicit_getter_calls/this_field_call.dart.strong.expect b/pkg/front_end/testcases/implicit_getter_calls/this_field_call.dart.strong.expect
index 3d44037..3c9883b 100644
--- a/pkg/front_end/testcases/implicit_getter_calls/this_field_call.dart.strong.expect
+++ b/pkg/front_end/testcases/implicit_getter_calls/this_field_call.dart.strong.expect
@@ -21,5 +21,5 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 static method main() → dynamic {
-  new self::A::•<core::int*>((core::int* x) → core::Null? {}).{self::A::foo}(3);
+  new self::A::•<core::int*>((core::int* x) → Null {}).{self::A::foo}(3);
 }
diff --git a/pkg/front_end/testcases/implicit_getter_calls/this_field_call.dart.strong.transformed.expect b/pkg/front_end/testcases/implicit_getter_calls/this_field_call.dart.strong.transformed.expect
index 3d44037..3c9883b 100644
--- a/pkg/front_end/testcases/implicit_getter_calls/this_field_call.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/implicit_getter_calls/this_field_call.dart.strong.transformed.expect
@@ -21,5 +21,5 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 static method main() → dynamic {
-  new self::A::•<core::int*>((core::int* x) → core::Null? {}).{self::A::foo}(3);
+  new self::A::•<core::int*>((core::int* x) → Null {}).{self::A::foo}(3);
 }
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/await_in_non_async.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/await_in_non_async.yaml.world.1.expect
index 30e56b1..a871263 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/await_in_non_async.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/await_in_non_async.yaml.world.1.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///main.dart" as main {
 
   static method main() → dynamic {
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/await_in_non_async.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/await_in_non_async.yaml.world.2.expect
index 5d64fb9..42ee856 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/await_in_non_async.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/await_in_non_async.yaml.world.2.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///main.dart" as main {
 //
 // Problems in library:
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/can_get_rid_of_nnbd_issue_error.yaml b/pkg/front_end/testcases/incremental_initialize_from_dill/can_get_rid_of_nnbd_issue_error.yaml
new file mode 100644
index 0000000..e20ec17
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/can_get_rid_of_nnbd_issue_error.yaml
@@ -0,0 +1,150 @@
+# Copyright (c) 2020, 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.md file.
+
+# If issuing a "compiling with strong mode but [...]" error, we should be able
+# to get rid of it if the error is fixed.
+
+type: newworld
+worlds:
+  - entry: package:baz/main.dart
+    experiments: non-nullable
+    nnbdMode: strong
+    errors: true
+    sources:
+      .dart_tool/package_config.json: |
+        {
+          "configVersion": 2,
+          "packages": [
+            {
+              "name": "foo",
+              "rootUri": "../foo",
+              "packageUri": "lib/",
+              "languageVersion": "2.8"
+            },
+            {
+              "name": "bar",
+              "rootUri": "../bar",
+              "packageUri": "lib/",
+              "languageVersion": "2.8"
+            },
+            {
+              "name": "baz",
+              "rootUri": "../baz",
+              "packageUri": ""
+            }
+          ]
+        }
+      foo/lib/foo.dart: |
+        // This file is in weak mode.
+        int x = null;
+      bar/lib/bar.dart: |
+        // This file is in weak mode.
+        int y = null;
+      baz/main.dart: |
+        // This file wants to be strong.
+        import "package:foo/foo.dart" as foo;
+        import "package:bar/bar.dart" as bar;
+        main() {
+          print(foo.x);
+          print(bar.y);
+        }
+    expectedLibraryCount: 3
+
+  # Update "nothing" so we still want the error.
+  - entry: package:baz/main.dart
+    experiments: non-nullable
+    nnbdMode: strong
+    worldType: updated
+    expectInitializeFromDill: false
+    errors: true
+    invalidate:
+      - baz/main.dart
+    sources:
+      baz/main.dart: |
+        // This file wants to be strong.
+        import "package:foo/foo.dart" as foo;
+        import "package:bar/bar.dart" as bar;
+        main() {
+          print(foo.x);
+          print(bar.y);
+          print("done");
+        }
+    expectedLibraryCount: 3
+
+
+  # Update ONE package to be strong.
+  - entry: package:baz/main.dart
+    experiments: non-nullable
+    nnbdMode: strong
+    worldType: updated
+    expectInitializeFromDill: false
+    errors: true
+    invalidate:
+      # .dart_tool/package_config.json is invalidated implicitly.
+      - foo/lib/foo.dart
+    sources:
+      .dart_tool/package_config.json: |
+        {
+          "configVersion": 2,
+          "packages": [
+            {
+              "name": "foo",
+              "rootUri": "../foo",
+              "packageUri": "lib/"
+            },
+            {
+              "name": "bar",
+              "rootUri": "../bar",
+              "packageUri": "lib/",
+              "languageVersion": "2.8"
+            },
+            {
+              "name": "baz",
+              "rootUri": "../baz",
+              "packageUri": ""
+            }
+          ]
+        }
+      foo/lib/foo.dart: |
+        // This file is in strong mode.
+        int x = 42;
+    expectedLibraryCount: 3
+
+  # Update the last package to be strong.
+  - entry: package:baz/main.dart
+    experiments: non-nullable
+    nnbdMode: strong
+    worldType: updated
+    expectInitializeFromDill: false
+    errors: false
+    invalidate:
+      # .dart_tool/package_config.json is invalidated implicitly.
+      - bar/lib/bar.dart
+    sources:
+      .dart_tool/package_config.json: |
+        {
+          "configVersion": 2,
+          "packages": [
+            {
+              "name": "foo",
+              "rootUri": "../foo",
+              "packageUri": "lib/"
+            },
+            {
+              "name": "bar",
+              "rootUri": "../bar",
+              "packageUri": "lib/"
+            },
+            {
+              "name": "baz",
+              "rootUri": "../baz",
+              "packageUri": ""
+            }
+          ]
+        }
+      bar/lib/bar.dart: |
+        // This file is in strong mode.
+        int y = 42;
+    expectedLibraryCount: 3
+
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/can_get_rid_of_nnbd_issue_error.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/can_get_rid_of_nnbd_issue_error.yaml.world.1.expect
new file mode 100644
index 0000000..cdbc8c9
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/can_get_rid_of_nnbd_issue_error.yaml.world.1.expect
@@ -0,0 +1,31 @@
+main = main::main;
+//
+// Problems in component:
+//
+// Error: This project cannot run with sound null safety, because one or more project dependencies do not
+// support null safety:
+//
+//  - package:foo
+//  - package:bar
+//
+// Run 'pub outdated --mode=null-safety' to determine if versions of your
+// dependencies supporting null safety are available.
+//
+library from "package:bar/bar.dart" as bar {
+
+  static field dart.core::int* y = null;
+}
+library from "package:baz/main.dart" as main {
+
+  import "package:foo/foo.dart" as foo;
+  import "package:bar/bar.dart" as bar;
+
+  static method main() → dynamic {
+    dart.core::print(foo::x);
+    dart.core::print(bar::y);
+  }
+}
+library from "package:foo/foo.dart" as foo {
+
+  static field dart.core::int* x = null;
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/can_get_rid_of_nnbd_issue_error.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/can_get_rid_of_nnbd_issue_error.yaml.world.2.expect
new file mode 100644
index 0000000..d574728
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/can_get_rid_of_nnbd_issue_error.yaml.world.2.expect
@@ -0,0 +1,32 @@
+main = main::main;
+//
+// Problems in component:
+//
+// Error: This project cannot run with sound null safety, because one or more project dependencies do not
+// support null safety:
+//
+//  - package:foo
+//  - package:bar
+//
+// Run 'pub outdated --mode=null-safety' to determine if versions of your
+// dependencies supporting null safety are available.
+//
+library from "package:bar/bar.dart" as bar {
+
+  static field dart.core::int* y = null;
+}
+library from "package:baz/main.dart" as main {
+
+  import "package:foo/foo.dart" as foo;
+  import "package:bar/bar.dart" as bar;
+
+  static method main() → dynamic {
+    dart.core::print(foo::x);
+    dart.core::print(bar::y);
+    dart.core::print("done");
+  }
+}
+library from "package:foo/foo.dart" as foo {
+
+  static field dart.core::int* x = null;
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/can_get_rid_of_nnbd_issue_error.yaml.world.3.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/can_get_rid_of_nnbd_issue_error.yaml.world.3.expect
new file mode 100644
index 0000000..caa2322
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/can_get_rid_of_nnbd_issue_error.yaml.world.3.expect
@@ -0,0 +1,31 @@
+main = main::main;
+//
+// Problems in component:
+//
+// Error: This project cannot run with sound null safety, because one or more project dependencies do not
+// support null safety:
+//
+//  - package:bar
+//
+// Run 'pub outdated --mode=null-safety' to determine if versions of your
+// dependencies supporting null safety are available.
+//
+library from "package:bar/bar.dart" as bar {
+
+  static field dart.core::int* y = null;
+}
+library from "package:baz/main.dart" as main {
+
+  import "package:foo/foo.dart" as foo;
+  import "package:bar/bar.dart" as bar;
+
+  static method main() → dynamic {
+    dart.core::print(foo::x);
+    dart.core::print(bar::y);
+    dart.core::print("done");
+  }
+}
+library from "package:foo/foo.dart" as foo {
+
+  static field dart.core::int x = 42;
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/can_get_rid_of_nnbd_issue_error.yaml.world.4.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/can_get_rid_of_nnbd_issue_error.yaml.world.4.expect
new file mode 100644
index 0000000..d960f32
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/can_get_rid_of_nnbd_issue_error.yaml.world.4.expect
@@ -0,0 +1,20 @@
+main = main::main;
+library from "package:bar/bar.dart" as bar {
+
+  static field dart.core::int y = 42;
+}
+library from "package:baz/main.dart" as main {
+
+  import "package:foo/foo.dart" as foo;
+  import "package:bar/bar.dart" as bar;
+
+  static method main() → dynamic {
+    dart.core::print(foo::x);
+    dart.core::print(bar::y);
+    dart.core::print("done");
+  }
+}
+library from "package:foo/foo.dart" as foo {
+
+  static field dart.core::int x = 42;
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/change_between_no_nnbd_and_nnbd.yaml b/pkg/front_end/testcases/incremental_initialize_from_dill/change_between_no_nnbd_and_nnbd.yaml
new file mode 100644
index 0000000..a1cc178
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/change_between_no_nnbd_and_nnbd.yaml
@@ -0,0 +1,38 @@
+# Copyright (c) 2020, 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.md file.
+
+# Compile without NNBD. Compile with (strong) NNBD (trying to load from dill).
+# Loading from dill should not complete (and all output libraries should be
+# strong or agnostic).
+
+type: newworld
+worlds:
+  - entry: main.dart
+    sources:
+      main.dart: |
+        import 'lib.dart';
+        main() {
+          libMethod();
+        }
+      lib.dart: |
+        void libMethod() {}
+    expectedLibraryCount: 2
+
+  - entry: main.dart
+    experiments: non-nullable
+    nnbdMode: strong
+    expectInitializeFromDill: false # loading the dill should fail because of mismatching NNBD settings
+    checkInvalidatedFiles: false
+    invalidate:
+      - main.dart
+    sources:
+      main.dart: |
+        import 'lib.dart';
+        main() {
+          libMethod();
+          print("done");
+        }
+      lib.dart: |
+        void libMethod() {}
+    expectedLibraryCount: 2
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/change_between_no_nnbd_and_nnbd.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/change_between_no_nnbd_and_nnbd.yaml.world.1.expect
new file mode 100644
index 0000000..90a873f
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/change_between_no_nnbd_and_nnbd.yaml.world.1.expect
@@ -0,0 +1,13 @@
+main = main::main;
+library from "org-dartlang-test:///lib.dart" as lib {
+
+  static method libMethod() → void {}
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///lib.dart";
+
+  static method main() → dynamic {
+    lib::libMethod();
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/change_between_no_nnbd_and_nnbd.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/change_between_no_nnbd_and_nnbd.yaml.world.2.expect
new file mode 100644
index 0000000..bf97124
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/change_between_no_nnbd_and_nnbd.yaml.world.2.expect
@@ -0,0 +1,14 @@
+main = main::main;
+library from "org-dartlang-test:///lib.dart" as lib {
+
+  static method libMethod() → void {}
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///lib.dart";
+
+  static method main() → dynamic {
+    lib::libMethod();
+    dart.core::print("done");
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules.yaml.world.1.expect
index f620098..8172d05 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules.yaml.world.1.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "package:example/a.dart" as a {
 
   static method a() → dynamic {
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules.yaml.world.2.expect
index fd564fa..5e9ae23 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules.yaml.world.2.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "package:example/a.dart" as a {
 
   static method a() → dynamic {
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules.yaml.world.3.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules.yaml.world.3.expect
index 36a808a..6fe58fb 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules.yaml.world.3.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules.yaml.world.3.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "package:example/b.dart" as b {
 
   static field dart.core::bool* example011 = true;
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_2.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_2.yaml.world.1.expect
index df74ba9c..ad8a087 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_2.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_2.yaml.world.1.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "package:example/a.dart" as a {
 
   static field dart.core::bool* example = true;
@@ -6,6 +6,7 @@
 }
 library from "package:foo/foo.dart" as foo {
 additionalExports = (a::example,
+  a::example,
   a::a)
 
   export "package:example/a.dart";
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_2.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_2.yaml.world.2.expect
index df74ba9c..ad8a087 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_2.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_2.yaml.world.2.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "package:example/a.dart" as a {
 
   static field dart.core::bool* example = true;
@@ -6,6 +6,7 @@
 }
 library from "package:foo/foo.dart" as foo {
 additionalExports = (a::example,
+  a::example,
   a::a)
 
   export "package:example/a.dart";
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_3.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_3.yaml.world.1.expect
index 6ece7a5..5a2b2fe 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_3.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_3.yaml.world.1.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "package:foo/foo.dart" as foo {
 
   static field dart.core::bool* foo = true;
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_3.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_3.yaml.world.2.expect
index 90090ad..404cb39 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_3.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_3.yaml.world.2.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "package:foo/foo.dart" as foo {
 
   static field dart.core::bool* foo2 = true;
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_4.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_4.yaml.world.1.expect
index b716fc7..4f177a0 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_4.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_4.yaml.world.1.expect
@@ -7,7 +7,8 @@
   static field dart.core::int* x = b::mya2.{b::A2::bar};
 }
 library from "package:moduleB/b.dart" as b {
-additionalExports = (c::baz)
+additionalExports = (c::baz,
+  c::baz)
 
   import "package:moduleC/c.dart";
   export "package:moduleC/c.dart" show baz;
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_7.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_7.yaml.world.1.expect
index 508aac1..00db382 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_7.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_7.yaml.world.1.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = com::main;
 library from "org-dartlang-test:///compileme.dart" as com {
 
   import "package:module/lib1.dart";
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_7.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_7.yaml.world.2.expect
index 4dcfd43..c677c51 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_7.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_7.yaml.world.2.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = com::main;
 library from "org-dartlang-test:///compileme.dart" as com {
 
   import "package:module/lib1.dart";
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_8.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_8.yaml.world.1.expect
index eedf573..309dfe4 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_8.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_8.yaml.world.1.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = com::main;
 library from "org-dartlang-test:///compileme.dart" as com {
 
   import "package:module/lib1.dart";
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_9.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_9.yaml.world.1.expect
index 7a4c790..8b5f7a9 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_9.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_9.yaml.world.1.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///main.dart" as main {
 
   import "package:moduleA/a.dart";
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_9.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_9.yaml.world.2.expect
index 7a4c790..8b5f7a9 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_9.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_9.yaml.world.2.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///main.dart" as main {
 
   import "package:moduleA/a.dart";
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/cleans_up_uritosource_non_package_part.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/cleans_up_uritosource_non_package_part.yaml.world.1.expect
index bb6b7ad..90010d8 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/cleans_up_uritosource_non_package_part.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/cleans_up_uritosource_non_package_part.yaml.world.1.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///b.dart" as b {
 
   part c.dart;
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/cleans_up_uritosource_non_package_part.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/cleans_up_uritosource_non_package_part.yaml.world.2.expect
index 27d1567..3118afd 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/cleans_up_uritosource_non_package_part.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/cleans_up_uritosource_non_package_part.yaml.world.2.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///b.dart" as b {
 
   static method b() → dynamic {}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/cleans_up_uritosource_non_package_part_if_unused.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/cleans_up_uritosource_non_package_part_if_unused.yaml.world.1.expect
index 4ed9953..ded43bc 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/cleans_up_uritosource_non_package_part_if_unused.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/cleans_up_uritosource_non_package_part_if_unused.yaml.world.1.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library libFoo from "org-dartlang-test:///b.dart" as lib {
 
   part e.dart;
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/cleans_up_uritosource_non_package_part_if_unused.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/cleans_up_uritosource_non_package_part_if_unused.yaml.world.2.expect
index a9622d3..060de03 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/cleans_up_uritosource_non_package_part_if_unused.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/cleans_up_uritosource_non_package_part_if_unused.yaml.world.2.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = lib::main;
 library libFoo from "org-dartlang-test:///main.dart" as lib {
 
   part c.dart;
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/cleans_up_uritosource_non_package_unreferenced_libraries.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/cleans_up_uritosource_non_package_unreferenced_libraries.yaml.world.1.expect
index bb6b7ad..90010d8 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/cleans_up_uritosource_non_package_unreferenced_libraries.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/cleans_up_uritosource_non_package_unreferenced_libraries.yaml.world.1.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///b.dart" as b {
 
   part c.dart;
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/cleans_up_uritosource_non_package_unreferenced_libraries.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/cleans_up_uritosource_non_package_unreferenced_libraries.yaml.world.2.expect
index 1a14625..c741e2c 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/cleans_up_uritosource_non_package_unreferenced_libraries.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/cleans_up_uritosource_non_package_unreferenced_libraries.yaml.world.2.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///main.dart" as main {
 
   static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/cleans_up_uritosource_non_package_unreferenced_libraries.yaml.world.3.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/cleans_up_uritosource_non_package_unreferenced_libraries.yaml.world.3.expect
index 1a14625..c741e2c 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/cleans_up_uritosource_non_package_unreferenced_libraries.yaml.world.3.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/cleans_up_uritosource_non_package_unreferenced_libraries.yaml.world.3.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///main.dart" as main {
 
   static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/cleans_up_uritosource_unreferenced_package_library.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/cleans_up_uritosource_unreferenced_package_library.yaml.world.1.expect
index 7d83543..0dc56e2 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/cleans_up_uritosource_unreferenced_package_library.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/cleans_up_uritosource_unreferenced_package_library.yaml.world.1.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///main.dart" as main {
 
   import "package:example/b.dart";
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/cleans_up_uritosource_unreferenced_package_library.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/cleans_up_uritosource_unreferenced_package_library.yaml.world.2.expect
index 1a14625..c741e2c 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/cleans_up_uritosource_unreferenced_package_library.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/cleans_up_uritosource_unreferenced_package_library.yaml.world.2.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///main.dart" as main {
 
   static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/constant_exports_hash.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/constant_exports_hash.yaml.world.1.expect
index 1ae755a..98debfd 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/constant_exports_hash.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/constant_exports_hash.yaml.world.1.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///lib1.dart" as lib1 {
 
   static method x() → dynamic {
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/constant_exports_hash.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/constant_exports_hash.yaml.world.2.expect
index 0b5ae77..6d8b798 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/constant_exports_hash.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/constant_exports_hash.yaml.world.2.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///lib1.dart" as lib1 {
 
   static method x() → dynamic {
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/constant_set_literal.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/constant_set_literal.yaml.world.1.expect
index b2256ee..98a923f 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/constant_set_literal.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/constant_set_literal.yaml.world.1.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///lib.dart" as lib {
 
   static const field dart.core::Set<dart.core::String*>* bar = #C6;
@@ -18,9 +18,9 @@
   #C2 = null
   #C3 = "world"
   #C4 = <dynamic>[#C1, #C2, #C3, #C2]
-  #C5 = dart.core::_ImmutableMap<dart.core::String*, dart.core::Null?> {_kvPairs:#C4}
+  #C5 = dart.core::_ImmutableMap<dart.core::String*, Null> {_kvPairs:#C4}
   #C6 = dart.collection::_UnmodifiableSet<dart.core::String*> {_map:#C5}
   #C7 = <dynamic>[]
-  #C8 = dart.core::_ImmutableMap<dart.core::String*, dart.core::Null?> {_kvPairs:#C7}
+  #C8 = dart.core::_ImmutableMap<dart.core::String*, Null> {_kvPairs:#C7}
   #C9 = dart.collection::_UnmodifiableSet<dart.core::String*> {_map:#C8}
 }
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/constant_set_literal.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/constant_set_literal.yaml.world.2.expect
index 264f105..3e1ca84 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/constant_set_literal.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/constant_set_literal.yaml.world.2.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///lib.dart" as lib {
 
   static const field dart.core::Set<dart.core::int*>* bar = #C5;
@@ -17,9 +17,9 @@
   #C1 = 42
   #C2 = null
   #C3 = <dynamic>[#C1, #C2]
-  #C4 = dart.core::_ImmutableMap<dart.core::int*, dart.core::Null?> {_kvPairs:#C3}
+  #C4 = dart.core::_ImmutableMap<dart.core::int*, Null> {_kvPairs:#C3}
   #C5 = dart.collection::_UnmodifiableSet<dart.core::int*> {_map:#C4}
   #C6 = <dynamic>[]
-  #C7 = dart.core::_ImmutableMap<dart.core::String*, dart.core::Null?> {_kvPairs:#C6}
+  #C7 = dart.core::_ImmutableMap<dart.core::String*, Null> {_kvPairs:#C6}
   #C8 = dart.collection::_UnmodifiableSet<dart.core::String*> {_map:#C7}
 }
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/crash_test_1.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/crash_test_1.yaml.world.1.expect
index b80e9c3..223e672 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/crash_test_1.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/crash_test_1.yaml.world.1.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///lib.dart" as lib {
 //
 // Problems in library:
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/crash_test_1.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/crash_test_1.yaml.world.2.expect
index 8a05ced..cb55d11 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/crash_test_1.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/crash_test_1.yaml.world.2.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///lib.dart" as lib {
 //
 // Problems in library:
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/deleting_file.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/deleting_file.yaml.world.1.expect
index 7e2a45a..3ae0cee 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/deleting_file.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/deleting_file.yaml.world.1.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///b.dart" as b {
 
   static method b() → dynamic {
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/deleting_file.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/deleting_file.yaml.world.2.expect
index 77f97dd..65c08c4c 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/deleting_file.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/deleting_file.yaml.world.2.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///b.dart" as b {
 //
 // Problems in library:
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/deleting_file.yaml.world.3.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/deleting_file.yaml.world.3.expect
index 78ff159..2fff4ef 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/deleting_file.yaml.world.3.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/deleting_file.yaml.world.3.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///b.dart" as b {
 //
 // Problems in library:
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/deleting_file.yaml.world.4.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/deleting_file.yaml.world.4.expect
index 78ff159..2fff4ef 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/deleting_file.yaml.world.4.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/deleting_file.yaml.world.4.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///b.dart" as b {
 //
 // Problems in library:
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/disappearing_library.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/disappearing_library.yaml.world.1.expect
index 510b8a9..bcc6c44 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/disappearing_library.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/disappearing_library.yaml.world.1.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = mai::main;
 library bLibrary from "org-dartlang-test:///b.dart" as bLi {
 
   static method foo() → dynamic {
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/disappearing_library.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/disappearing_library.yaml.world.2.expect
index cae5df6..3742474 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/disappearing_library.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/disappearing_library.yaml.world.2.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = bLi::main;
 library bLibrary from "org-dartlang-test:///b.dart" as bLi {
 
   static method main() → dynamic {
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/disappearing_package.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/disappearing_package.yaml.world.1.expect
index a6e8b36..234631e 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/disappearing_package.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/disappearing_package.yaml.world.1.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///main.dart" as main {
 
   import "package:example/b.dart";
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/disappearing_package.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/disappearing_package.yaml.world.2.expect
index 118bd73..95c9846 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/disappearing_package.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/disappearing_package.yaml.world.2.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///main.dart" as main {
 
   static method main() → dynamic {
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/entry_not_package_url_main.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/entry_not_package_url_main.yaml.world.1.expect
index 4c3e6ae..aa34750 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/entry_not_package_url_main.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/entry_not_package_url_main.yaml.world.1.expect
@@ -1,4 +1,9 @@
-main = <No Member>;
+main = main::main;
+//
+// Problems in component:
+//
+// org-dartlang-test:///main.dart: Warning: Interpreting this as package URI, 'package:untitled/main.dart'.
+//
 library from "package:untitled/main.dart" as main {
 
   static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/entry_not_package_url_main_with_errors.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/entry_not_package_url_main_with_errors.yaml.world.1.expect
index b188792..2c0a19b 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/entry_not_package_url_main_with_errors.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/entry_not_package_url_main_with_errors.yaml.world.1.expect
@@ -1,4 +1,9 @@
-main = <No Member>;
+main = main::main;
+//
+// Problems in component:
+//
+// org-dartlang-test:///main.dart: Warning: Interpreting this as package URI, 'package:untitled/main.dart'.
+//
 library from "package:untitled/main.dart" as main {
 //
 // Problems in library:
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/entry_not_package_url_no_main.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/entry_not_package_url_no_main.yaml.world.1.expect
index b1df83d..6ee484d 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/entry_not_package_url_no_main.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/entry_not_package_url_no_main.yaml.world.1.expect
@@ -1,4 +1,9 @@
 main = <No Member>;
+//
+// Problems in component:
+//
+// org-dartlang-test:///main.dart: Warning: Interpreting this as package URI, 'package:untitled/main.dart'.
+//
 library from "package:untitled/main.dart" as main {
 
   static method notMain() → dynamic {}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/experiments_enabled_1.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/experiments_enabled_1.yaml.world.1.expect
index 26a90cf..2542952 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/experiments_enabled_1.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/experiments_enabled_1.yaml.world.1.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///main.dart" as main {
 
   class Class extends dart.core::Object {
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/expression_calculation_with_error.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/expression_calculation_with_error.yaml.world.1.expect
index 118bd73..95c9846 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/expression_calculation_with_error.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/expression_calculation_with_error.yaml.world.1.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///main.dart" as main {
 
   static method main() → dynamic {
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/expression_calculation_with_error.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/expression_calculation_with_error.yaml.world.2.expect
index 118bd73..95c9846 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/expression_calculation_with_error.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/expression_calculation_with_error.yaml.world.2.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///main.dart" as main {
 
   static method main() → dynamic {
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/extension_usage_from_dill.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/extension_usage_from_dill.yaml.world.1.expect
index 874b7c7..58648d5 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/extension_usage_from_dill.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/extension_usage_from_dill.yaml.world.1.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///lib1.dart" as lib1 {
 
   extension NumberParsing on dart.core::String* {
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/extension_usage_from_dill.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/extension_usage_from_dill.yaml.world.2.expect
index 874b7c7..58648d5 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/extension_usage_from_dill.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/extension_usage_from_dill.yaml.world.2.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///lib1.dart" as lib1 {
 
   extension NumberParsing on dart.core::String* {
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/ffi_01.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/ffi_01.yaml.world.1.expect
index 07b6c80..6ad0475 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/ffi_01.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/ffi_01.yaml.world.1.expect
@@ -1,12 +1,13 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///lib.dart" as lib {
 
   import "dart:ffi";
 
   @#C3
+  @#C8
   class Coordinate extends dart.ffi::Struct {
     @#C3
-    static final field dart.core::int* #sizeOf = (#C6).{dart.core::List::[]}(dart.ffi::_abi());
+    static final field dart.core::int* #sizeOf = (#C11).{dart.core::List::[]}(dart.ffi::_abi());
     @#C3
     constructor #fromPointer(dynamic #pointer) → dynamic
       : super dart.ffi::Struct::_fromPointer(#pointer)
@@ -14,7 +15,7 @@
     static factory allocate(dart.core::double* x, dart.core::double* y, dart.ffi::Pointer<lib::Coordinate*>* next) → lib::Coordinate* {
       return null;
     }
-    abstract member-signature get _addressOf() → dart.ffi::Pointer<dart.ffi::Struct*>*; -> dart.ffi::Struct::_addressOf
+    abstract member-signature get _addressOf() → dart.core::Object*; -> dart.ffi::Struct::_addressOf
     abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
     abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
     abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
@@ -26,17 +27,17 @@
     abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
     abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
     get x() → dart.core::double*
-      return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_addressOf}, (#C8).{dart.core::List::[]}(dart.ffi::_abi()));
+      return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_addressOf}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()));
     set x(dart.core::double* #v) → void
-      return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_addressOf}, (#C8).{dart.core::List::[]}(dart.ffi::_abi()), #v);
+      return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_addressOf}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()), #v);
     get y() → dart.core::double*
-      return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_addressOf}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()));
+      return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_addressOf}, (#C15).{dart.core::List::[]}(dart.ffi::_abi()));
     set y(dart.core::double* #v) → void
-      return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_addressOf}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()), #v);
+      return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_addressOf}, (#C15).{dart.core::List::[]}(dart.ffi::_abi()), #v);
     get next() → dart.ffi::Pointer<lib::Coordinate*>*
-      return dart.ffi::_fromAddress<lib::Coordinate*>(dart.ffi::_loadIntPtr(this.{dart.ffi::Struct::_addressOf}, (#C12).{dart.core::List::[]}(dart.ffi::_abi())));
+      return dart.ffi::_fromAddress<lib::Coordinate*>(dart.ffi::_loadIntPtr(this.{dart.ffi::Struct::_addressOf}, (#C17).{dart.core::List::[]}(dart.ffi::_abi())));
     set next(dart.ffi::Pointer<lib::Coordinate*>* #v) → void
-      return dart.ffi::_storeIntPtr(this.{dart.ffi::Struct::_addressOf}, (#C12).{dart.core::List::[]}(dart.ffi::_abi()), #v.{dart.ffi::Pointer::address});
+      return dart.ffi::_storeIntPtr(this.{dart.ffi::Struct::_addressOf}, (#C17).{dart.core::List::[]}(dart.ffi::_abi()), #v.{dart.ffi::Pointer::address});
   }
 }
 library from "org-dartlang-test:///main.dart" as main {
@@ -54,13 +55,18 @@
   #C1 = "vm:entry-point"
   #C2 = null
   #C3 = dart.core::pragma {name:#C1, options:#C2}
-  #C4 = 24
-  #C5 = 20
-  #C6 = <dart.core::int*>[#C4, #C5, #C4]
-  #C7 = 0
-  #C8 = <dart.core::int*>[#C7, #C7, #C7]
-  #C9 = 8
-  #C10 = <dart.core::int*>[#C9, #C9, #C9]
-  #C11 = 16
-  #C12 = <dart.core::int*>[#C11, #C11, #C11]
+  #C4 = "vm:ffi:struct-fields"
+  #C5 = TypeLiteralConstant(dart.ffi::Double)
+  #C6 = TypeLiteralConstant(dart.ffi::Pointer<dart.ffi::NativeType>)
+  #C7 = <dart.core::Type>[#C5, #C5, #C6]
+  #C8 = dart.core::pragma {name:#C4, options:#C7}
+  #C9 = 24
+  #C10 = 20
+  #C11 = <dart.core::int*>[#C9, #C10, #C9]
+  #C12 = 0
+  #C13 = <dart.core::int*>[#C12, #C12, #C12]
+  #C14 = 8
+  #C15 = <dart.core::int*>[#C14, #C14, #C14]
+  #C16 = 16
+  #C17 = <dart.core::int*>[#C16, #C16, #C16]
 }
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/ffi_01.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/ffi_01.yaml.world.2.expect
index c592dbf..0baac00 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/ffi_01.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/ffi_01.yaml.world.2.expect
@@ -1,12 +1,13 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///lib.dart" as lib {
 
   import "dart:ffi";
 
   @#C3
+  @#C8
   class Coordinate extends dart.ffi::Struct {
     @#C3
-    static final field dart.core::int* #sizeOf = (#C6).{dart.core::List::[]}(dart.ffi::_abi());
+    static final field dart.core::int* #sizeOf = (#C11).{dart.core::List::[]}(dart.ffi::_abi());
     @#C3
     constructor #fromPointer(dynamic #pointer) → dynamic
       : super dart.ffi::Struct::_fromPointer(#pointer)
@@ -14,7 +15,7 @@
     static factory allocate(dart.core::double* x, dart.core::double* y, dart.ffi::Pointer<lib::Coordinate*>* next) → lib::Coordinate* {
       return null;
     }
-    abstract member-signature get _addressOf() → dart.ffi::Pointer<dart.ffi::Struct*>*; -> dart.ffi::Struct::_addressOf
+    abstract member-signature get _addressOf() → dart.core::Object*; -> dart.ffi::Struct::_addressOf
     abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
     abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
     abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
@@ -26,17 +27,17 @@
     abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
     abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
     get x() → dart.core::double*
-      return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_addressOf}, (#C8).{dart.core::List::[]}(dart.ffi::_abi()));
+      return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_addressOf}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()));
     set x(dart.core::double* #v) → void
-      return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_addressOf}, (#C8).{dart.core::List::[]}(dart.ffi::_abi()), #v);
+      return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_addressOf}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()), #v);
     get y() → dart.core::double*
-      return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_addressOf}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()));
+      return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_addressOf}, (#C15).{dart.core::List::[]}(dart.ffi::_abi()));
     set y(dart.core::double* #v) → void
-      return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_addressOf}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()), #v);
+      return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_addressOf}, (#C15).{dart.core::List::[]}(dart.ffi::_abi()), #v);
     get next() → dart.ffi::Pointer<lib::Coordinate*>*
-      return dart.ffi::_fromAddress<lib::Coordinate*>(dart.ffi::_loadIntPtr(this.{dart.ffi::Struct::_addressOf}, (#C12).{dart.core::List::[]}(dart.ffi::_abi())));
+      return dart.ffi::_fromAddress<lib::Coordinate*>(dart.ffi::_loadIntPtr(this.{dart.ffi::Struct::_addressOf}, (#C17).{dart.core::List::[]}(dart.ffi::_abi())));
     set next(dart.ffi::Pointer<lib::Coordinate*>* #v) → void
-      return dart.ffi::_storeIntPtr(this.{dart.ffi::Struct::_addressOf}, (#C12).{dart.core::List::[]}(dart.ffi::_abi()), #v.{dart.ffi::Pointer::address});
+      return dart.ffi::_storeIntPtr(this.{dart.ffi::Struct::_addressOf}, (#C17).{dart.core::List::[]}(dart.ffi::_abi()), #v.{dart.ffi::Pointer::address});
   }
 }
 library from "org-dartlang-test:///main.dart" as main {
@@ -58,13 +59,18 @@
   #C1 = "vm:entry-point"
   #C2 = null
   #C3 = dart.core::pragma {name:#C1, options:#C2}
-  #C4 = 24
-  #C5 = 20
-  #C6 = <dart.core::int*>[#C4, #C5, #C4]
-  #C7 = 0
-  #C8 = <dart.core::int*>[#C7, #C7, #C7]
-  #C9 = 8
-  #C10 = <dart.core::int*>[#C9, #C9, #C9]
-  #C11 = 16
-  #C12 = <dart.core::int*>[#C11, #C11, #C11]
+  #C4 = "vm:ffi:struct-fields"
+  #C5 = TypeLiteralConstant(dart.ffi::Double)
+  #C6 = TypeLiteralConstant(dart.ffi::Pointer<dart.ffi::NativeType>)
+  #C7 = <dart.core::Type>[#C5, #C5, #C6]
+  #C8 = dart.core::pragma {name:#C4, options:#C7}
+  #C9 = 24
+  #C10 = 20
+  #C11 = <dart.core::int*>[#C9, #C10, #C9]
+  #C12 = 0
+  #C13 = <dart.core::int*>[#C12, #C12, #C12]
+  #C14 = 8
+  #C15 = <dart.core::int*>[#C14, #C14, #C14]
+  #C16 = 16
+  #C17 = <dart.core::int*>[#C16, #C16, #C16]
 }
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/ffi_02.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/ffi_02.yaml.world.1.expect
index fae41df..a3cbec1 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/ffi_02.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/ffi_02.yaml.world.1.expect
@@ -1,12 +1,13 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///lib.dart" as lib {
 
   import "dart:ffi";
 
   @#C3
+  @#C8
   class Coordinate extends dart.ffi::Struct {
     @#C3
-    static final field dart.core::int* #sizeOf = (#C6).{dart.core::List::[]}(dart.ffi::_abi());
+    static final field dart.core::int* #sizeOf = (#C11).{dart.core::List::[]}(dart.ffi::_abi());
     @#C3
     constructor #fromPointer(dynamic #pointer) → dynamic
       : super dart.ffi::Struct::_fromPointer(#pointer)
@@ -14,7 +15,7 @@
     static factory allocate(dart.core::double* x, dart.core::double* y, dart.ffi::Pointer<lib::Coordinate*>* next) → lib::Coordinate* {
       return null;
     }
-    abstract member-signature get _addressOf() → dart.ffi::Pointer<dart.ffi::Struct*>*; -> dart.ffi::Struct::_addressOf
+    abstract member-signature get _addressOf() → dart.core::Object*; -> dart.ffi::Struct::_addressOf
     abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
     abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
     abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
@@ -26,17 +27,17 @@
     abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
     abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
     get x() → dart.core::double*
-      return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_addressOf}, (#C8).{dart.core::List::[]}(dart.ffi::_abi()));
+      return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_addressOf}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()));
     set x(dart.core::double* #v) → void
-      return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_addressOf}, (#C8).{dart.core::List::[]}(dart.ffi::_abi()), #v);
+      return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_addressOf}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()), #v);
     get y() → dart.core::double*
-      return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_addressOf}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()));
+      return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_addressOf}, (#C15).{dart.core::List::[]}(dart.ffi::_abi()));
     set y(dart.core::double* #v) → void
-      return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_addressOf}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()), #v);
+      return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_addressOf}, (#C15).{dart.core::List::[]}(dart.ffi::_abi()), #v);
     get next() → dart.ffi::Pointer<lib::Coordinate*>*
-      return dart.ffi::_fromAddress<lib::Coordinate*>(dart.ffi::_loadIntPtr(this.{dart.ffi::Struct::_addressOf}, (#C12).{dart.core::List::[]}(dart.ffi::_abi())));
+      return dart.ffi::_fromAddress<lib::Coordinate*>(dart.ffi::_loadIntPtr(this.{dart.ffi::Struct::_addressOf}, (#C17).{dart.core::List::[]}(dart.ffi::_abi())));
     set next(dart.ffi::Pointer<lib::Coordinate*>* #v) → void
-      return dart.ffi::_storeIntPtr(this.{dart.ffi::Struct::_addressOf}, (#C12).{dart.core::List::[]}(dart.ffi::_abi()), #v.{dart.ffi::Pointer::address});
+      return dart.ffi::_storeIntPtr(this.{dart.ffi::Struct::_addressOf}, (#C17).{dart.core::List::[]}(dart.ffi::_abi()), #v.{dart.ffi::Pointer::address});
   }
 }
 library from "org-dartlang-test:///main.dart" as main {
@@ -55,13 +56,18 @@
   #C1 = "vm:entry-point"
   #C2 = null
   #C3 = dart.core::pragma {name:#C1, options:#C2}
-  #C4 = 24
-  #C5 = 20
-  #C6 = <dart.core::int*>[#C4, #C5, #C4]
-  #C7 = 0
-  #C8 = <dart.core::int*>[#C7, #C7, #C7]
-  #C9 = 8
-  #C10 = <dart.core::int*>[#C9, #C9, #C9]
-  #C11 = 16
-  #C12 = <dart.core::int*>[#C11, #C11, #C11]
+  #C4 = "vm:ffi:struct-fields"
+  #C5 = TypeLiteralConstant(dart.ffi::Double)
+  #C6 = TypeLiteralConstant(dart.ffi::Pointer<dart.ffi::NativeType>)
+  #C7 = <dart.core::Type>[#C5, #C5, #C6]
+  #C8 = dart.core::pragma {name:#C4, options:#C7}
+  #C9 = 24
+  #C10 = 20
+  #C11 = <dart.core::int*>[#C9, #C10, #C9]
+  #C12 = 0
+  #C13 = <dart.core::int*>[#C12, #C12, #C12]
+  #C14 = 8
+  #C15 = <dart.core::int*>[#C14, #C14, #C14]
+  #C16 = 16
+  #C17 = <dart.core::int*>[#C16, #C16, #C16]
 }
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_issue_66122.yaml b/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_issue_66122.yaml
new file mode 100644
index 0000000..60fdac4
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_issue_66122.yaml
@@ -0,0 +1,64 @@
+# Copyright (c) 2020, 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.md file.
+
+# Reproduce weirdness with abstract member-signatures and forwarding stubs from
+# https://github.com/flutter/flutter/issues/66122
+
+type: newworld
+target: DDC
+trackWidgetCreation: true
+worlds:
+  - entry: main.dart
+    skipClassHierarchyTest: true
+    sources:
+      main.dart: |
+        import 'package:flutter/framework.dart';
+        import 'after_layout.dart';
+        class _HotReloadIssueState extends State<HotReloadIssue>
+            with AfterLayoutMixin<HotReloadIssue> {
+          Widget build(BuildContext context) {}
+          void afterFirstLayout(BuildContext context) {}
+        }
+        class HotReloadIssue extends StatefulWidget {}
+
+      after_layout.dart:
+        import 'package:flutter/framework.dart';
+        mixin AfterLayoutMixin<T extends StatefulWidget> on State<T> {}
+
+      flutter/lib/framework.dart: |
+        mixin Diagnosticable {
+          String toString() {
+            return "foo";
+          }
+        }
+        abstract class State<T extends StatefulWidget> with Diagnosticable {
+          T? _widget;
+        }
+        class State2 extends State {}
+        class StatefulWidget {}
+        class Widget {}
+        class BuildContext {}
+        final State<StatefulWidget> state = new State2();
+        void foo() {
+          state._widget = null;
+        }
+      .dart_tool/package_config.json: |
+        {
+          "configVersion": 2,
+          "packages": [
+            {
+              "name": "flutter",
+              "rootUri": "../flutter",
+              "packageUri": "lib/"
+            }
+          ]
+        }
+    expectedLibraryCount: 3
+  - entry: main.dart
+    skipClassHierarchyTest: true
+    worldType: updated
+    invalidate:
+      - main.dart
+    expectInitializeFromDill: false
+    expectedLibraryCount: 3
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_issue_66122.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_issue_66122.yaml.world.1.expect
new file mode 100644
index 0000000..04687de
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_issue_66122.yaml.world.1.expect
@@ -0,0 +1,91 @@
+main = <No Member>;
+library from "org-dartlang-test:///after_layout.dart" as aft {
+
+  import "package:flutter/framework.dart";
+
+  abstract class AfterLayoutMixin<T extends fra::StatefulWidget* = fra::StatefulWidget*> extends fra::State<aft::AfterLayoutMixin::T*> /*isMixinDeclaration*/  {
+    abstract member-signature get _widget() → aft::AfterLayoutMixin::T*; -> fra::State::_widget
+    abstract member-signature set _widget(generic-covariant-impl aft::AfterLayoutMixin::T* value) → void; -> fra::State::_widget
+    abstract member-signature operator ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
+    abstract member-signature get hashCode() → dart.core::int*; -> dart.core::Object::hashCode
+    abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
+    abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
+  }
+}
+library from "package:flutter/framework.dart" as fra {
+
+  abstract class Diagnosticable extends dart.core::Object /*isMixinDeclaration*/  {
+    method toString() → dart.core::String {
+      return "foo";
+    }
+  }
+  abstract class _State&Object&Diagnosticable = dart.core::Object with fra::Diagnosticable /*isAnonymousMixin,hasConstConstructor*/  {
+    const synthetic constructor •() → fra::_State&Object&Diagnosticable
+      : super dart.core::Object::•()
+      ;
+  }
+  abstract class State<T extends fra::StatefulWidget = fra::StatefulWidget> extends fra::_State&Object&Diagnosticable {
+    generic-covariant-impl field fra::State::T? _widget = null;
+    synthetic constructor •() → fra::State<fra::State::T>
+      : super fra::_State&Object&Diagnosticable::•()
+      ;
+  }
+  class State2 extends fra::State<fra::StatefulWidget> {
+    synthetic constructor •() → fra::State2
+      : super fra::State::•()
+      ;
+  }
+  class StatefulWidget extends dart.core::Object {
+    synthetic constructor •() → fra::StatefulWidget
+      : super dart.core::Object::•()
+      ;
+  }
+  class Widget extends dart.core::Object {
+    synthetic constructor •() → fra::Widget
+      : super dart.core::Object::•()
+      ;
+  }
+  class BuildContext extends dart.core::Object {
+    synthetic constructor •() → fra::BuildContext
+      : super dart.core::Object::•()
+      ;
+  }
+  static final field fra::State<fra::StatefulWidget> state = new fra::State2::•();
+  static method foo() → void {
+    fra::state.{fra::State::_widget} = null;
+  }
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "package:flutter/framework.dart";
+  import "org-dartlang-test:///after_layout.dart";
+
+  abstract class __HotReloadIssueState&State&AfterLayoutMixin = fra::State<main::HotReloadIssue*> with aft::AfterLayoutMixin<main::HotReloadIssue*> /*isAnonymousMixin*/  {
+    synthetic constructor •() → main::__HotReloadIssueState&State&AfterLayoutMixin*
+      : super fra::State::•()
+      ;
+    abstract member-signature get _widget() → main::HotReloadIssue*; -> fra::State::_widget
+    abstract member-signature set _widget(generic-covariant-impl main::HotReloadIssue* value) → void; -> fra::State::_widget
+    abstract member-signature operator ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
+    abstract member-signature get hashCode() → dart.core::int*; -> dart.core::Object::hashCode
+    abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
+    abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
+  }
+  class _HotReloadIssueState extends main::__HotReloadIssueState&State&AfterLayoutMixin {
+    synthetic constructor •() → main::_HotReloadIssueState*
+      : super main::__HotReloadIssueState&State&AfterLayoutMixin::•()
+      ;
+    method build(fra::BuildContext* context) → fra::Widget* {}
+    method afterFirstLayout(fra::BuildContext* context) → void {}
+  }
+  class HotReloadIssue extends fra::StatefulWidget {
+    synthetic constructor •() → main::HotReloadIssue*
+      : super fra::StatefulWidget::•()
+      ;
+    abstract member-signature operator ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
+    abstract member-signature get hashCode() → dart.core::int*; -> dart.core::Object::hashCode
+    abstract member-signature method toString() → dart.core::String*; -> dart.core::Object::toString
+    abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
+    abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_issue_66122.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_issue_66122.yaml.world.2.expect
new file mode 100644
index 0000000..f4a141b
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_issue_66122.yaml.world.2.expect
@@ -0,0 +1,85 @@
+main = <No Member>;
+library from "org-dartlang-test:///after_layout.dart" as aft {
+
+  import "package:flutter/framework.dart";
+
+  abstract class AfterLayoutMixin<T extends fra::StatefulWidget* = fra::StatefulWidget*> extends fra::State<aft::AfterLayoutMixin::T*> /*isMixinDeclaration*/  {
+    abstract member-signature get _widget() → aft::AfterLayoutMixin::T*; -> fra::State::_widget
+    abstract member-signature set _widget(generic-covariant-impl aft::AfterLayoutMixin::T* value) → void; -> fra::State::_widget
+    abstract member-signature operator ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
+    abstract member-signature get hashCode() → dart.core::int*; -> dart.core::Object::hashCode
+    abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
+    abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
+  }
+}
+library from "package:flutter/framework.dart" as fra {
+
+  abstract class Diagnosticable extends dart.core::Object /*isMixinDeclaration*/  {
+    method toString() → dart.core::String {
+      return "foo";
+    }
+  }
+  abstract class _State&Object&Diagnosticable = dart.core::Object with fra::Diagnosticable /*isAnonymousMixin,hasConstConstructor*/  {
+    const synthetic constructor •() → fra::_State&Object&Diagnosticable
+      : super dart.core::Object::•()
+      ;
+  }
+  abstract class State<T extends fra::StatefulWidget = fra::StatefulWidget> extends fra::_State&Object&Diagnosticable {
+    generic-covariant-impl field fra::State::T? _widget = null;
+    synthetic constructor •() → fra::State<fra::State::T>
+      : super fra::_State&Object&Diagnosticable::•()
+      ;
+  }
+  class State2 extends fra::State<fra::StatefulWidget> {
+    synthetic constructor •() → fra::State2
+      : super fra::State::•()
+      ;
+  }
+  class StatefulWidget extends dart.core::Object {
+    synthetic constructor •() → fra::StatefulWidget
+      : super dart.core::Object::•()
+      ;
+  }
+  class Widget extends dart.core::Object {
+    synthetic constructor •() → fra::Widget
+      : super dart.core::Object::•()
+      ;
+  }
+  class BuildContext extends dart.core::Object {
+    synthetic constructor •() → fra::BuildContext
+      : super dart.core::Object::•()
+      ;
+  }
+  static final field fra::State<fra::StatefulWidget> state = new fra::State2::•();
+  static method foo() → void {
+    fra::state.{fra::State::_widget} = null;
+  }
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "package:flutter/framework.dart";
+  import "org-dartlang-test:///after_layout.dart";
+
+  abstract class __HotReloadIssueState&State&AfterLayoutMixin = fra::State<main::HotReloadIssue*> with aft::AfterLayoutMixin<main::HotReloadIssue*> /*isAnonymousMixin*/  {
+    synthetic constructor •() → main::__HotReloadIssueState&State&AfterLayoutMixin*
+      : super fra::State::•()
+      ;
+  }
+  class _HotReloadIssueState extends main::__HotReloadIssueState&State&AfterLayoutMixin {
+    synthetic constructor •() → main::_HotReloadIssueState*
+      : super main::__HotReloadIssueState&State&AfterLayoutMixin::•()
+      ;
+    method build(fra::BuildContext* context) → fra::Widget* {}
+    method afterFirstLayout(fra::BuildContext* context) → void {}
+  }
+  class HotReloadIssue extends fra::StatefulWidget {
+    synthetic constructor •() → main::HotReloadIssue*
+      : super fra::StatefulWidget::•()
+      ;
+    abstract member-signature operator ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
+    abstract member-signature get hashCode() → dart.core::int*; -> dart.core::Object::hashCode
+    abstract member-signature method toString() → dart.core::String*; -> dart.core::Object::toString
+    abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
+    abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_mixin_failure_1.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_mixin_failure_1.yaml.world.1.expect
index 0f97f6e..2c5d2fd 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_mixin_failure_1.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_mixin_failure_1.yaml.world.1.expect
@@ -65,7 +65,7 @@
     synthetic constructor •() → lib::_Quux&Qux&MyMixin*
       : super lib::Qux::•()
       ;
-    abstract forwarding-stub method hello(covariant lib::FooEntry* entry) → void;
+    abstract member-signature method hello(covariant lib::FooEntry* entry) → void; -> lib::Baz::hello
   }
   class Quux extends lib::_Quux&Qux&MyMixin {
     synthetic constructor •() → lib::Quux*
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_mixin_failure_1.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_mixin_failure_1.yaml.world.2.expect
index 8e8e3ac2..8d427f03 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_mixin_failure_1.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_mixin_failure_1.yaml.world.2.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///lib.dart" as lib {
 
   class FooEntry extends dart.core::Object {
@@ -65,7 +65,7 @@
     synthetic constructor •() → lib::_Quux&Qux&MyMixin*
       : super lib::Qux::•()
       ;
-    abstract forwarding-stub method hello(covariant lib::FooEntry* entry) → void;
+    abstract member-signature method hello(covariant lib::FooEntry* entry) → void; -> lib::Baz::hello
   }
   class Quux extends lib::_Quux&Qux&MyMixin {
     synthetic constructor •() → lib::Quux*
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/incremental_serialization_1.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/incremental_serialization_1.yaml.world.1.expect
index 6ef7b8a..6fbc1e7 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/incremental_serialization_1.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/incremental_serialization_1.yaml.world.1.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///main.dart" as main {
 
   import "dart:core";
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/incremental_serialization_1.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/incremental_serialization_1.yaml.world.2.expect
index 20882e7..aa562b0 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/incremental_serialization_1.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/incremental_serialization_1.yaml.world.2.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///main.dart" as main {
 
   import "package:package1/lib1.dart";
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/incremental_serialization_1.yaml.world.3.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/incremental_serialization_1.yaml.world.3.expect
index 5087f50..4877d99 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/incremental_serialization_1.yaml.world.3.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/incremental_serialization_1.yaml.world.3.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///main.dart" as main {
 
   import "package:package2/lib2.dart";
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/incremental_serialization_1.yaml.world.4.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/incremental_serialization_1.yaml.world.4.expect
index 5087f50..4877d99 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/incremental_serialization_1.yaml.world.4.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/incremental_serialization_1.yaml.world.4.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///main.dart" as main {
 
   import "package:package2/lib2.dart";
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/incremental_serialization_2.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/incremental_serialization_2.yaml.world.1.expect
index 91a004a..e0f72d2 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/incremental_serialization_2.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/incremental_serialization_2.yaml.world.1.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///main.dart" as main {
 
   import "package:package1/lib1.dart";
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/incremental_serialization_2.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/incremental_serialization_2.yaml.world.2.expect
index 4a62ec6..3e80c34 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/incremental_serialization_2.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/incremental_serialization_2.yaml.world.2.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///main.dart" as main {
 
   import "package:package1/lib1.dart";
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/incremental_serialization_3.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/incremental_serialization_3.yaml.world.1.expect
index 1671bdc..6aaedcc 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/incremental_serialization_3.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/incremental_serialization_3.yaml.world.1.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///main.dart" as main {
 
   import "dart:core";
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/incremental_serialization_3.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/incremental_serialization_3.yaml.world.2.expect
index 1671bdc..6aaedcc 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/incremental_serialization_3.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/incremental_serialization_3.yaml.world.2.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///main.dart" as main {
 
   import "dart:core";
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/incremental_serialization_4.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/incremental_serialization_4.yaml.world.1.expect
index c041e93..ee179e8 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/incremental_serialization_4.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/incremental_serialization_4.yaml.world.1.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///main.dart" as main {
 
   import "package:package1/p1.dart";
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/incremental_serialization_4.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/incremental_serialization_4.yaml.world.2.expect
index 12abe32..d3cf67e 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/incremental_serialization_4.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/incremental_serialization_4.yaml.world.2.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///main.dart" as main {
 
   import "package:package1/p1.dart";
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/initialize_with_file_then_use_type.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/initialize_with_file_then_use_type.yaml.world.1.expect
index 591a3d2..559b247 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/initialize_with_file_then_use_type.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/initialize_with_file_then_use_type.yaml.world.1.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///foo.dart" as foo {
 
   class Foo extends dart.core::Object {
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/initialize_with_file_then_use_type.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/initialize_with_file_then_use_type.yaml.world.2.expect
index e1510d4..ad52a60 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/initialize_with_file_then_use_type.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/initialize_with_file_then_use_type.yaml.world.2.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///main.dart" as main {
 
   static method main() → dynamic {
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/initialize_with_file_then_use_type.yaml.world.3.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/initialize_with_file_then_use_type.yaml.world.3.expect
index 591a3d2..559b247 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/initialize_with_file_then_use_type.yaml.world.3.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/initialize_with_file_then_use_type.yaml.world.3.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///foo.dart" as foo {
 
   class Foo extends dart.core::Object {
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/initialize_with_unused_package_then_use_type.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/initialize_with_unused_package_then_use_type.yaml.world.1.expect
index 91ca9e6..ba7de5d 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/initialize_with_unused_package_then_use_type.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/initialize_with_unused_package_then_use_type.yaml.world.1.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///main.dart" as main {
 
   import "package:mypackage/foo.dart";
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/initialize_with_unused_package_then_use_type.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/initialize_with_unused_package_then_use_type.yaml.world.2.expect
index e1510d4..ad52a60 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/initialize_with_unused_package_then_use_type.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/initialize_with_unused_package_then_use_type.yaml.world.2.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///main.dart" as main {
 
   static method main() → dynamic {
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/initialize_with_unused_package_then_use_type.yaml.world.3.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/initialize_with_unused_package_then_use_type.yaml.world.3.expect
index 91ca9e6..ba7de5d 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/initialize_with_unused_package_then_use_type.yaml.world.3.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/initialize_with_unused_package_then_use_type.yaml.world.3.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///main.dart" as main {
 
   import "package:mypackage/foo.dart";
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/invalid_part_uri_01.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/invalid_part_uri_01.yaml.world.2.expect
index 1a14625..c741e2c 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/invalid_part_uri_01.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/invalid_part_uri_01.yaml.world.2.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///main.dart" as main {
 
   static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/invalidate_package_part.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/invalidate_package_part.yaml.world.1.expect
index 63174bf..527b651 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/invalidate_package_part.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/invalidate_package_part.yaml.world.1.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "package:example/main.dart" as main {
 
   part b.dart;
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/invalidate_package_part.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/invalidate_package_part.yaml.world.2.expect
index 5ddb0bf..143d78f 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/invalidate_package_part.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/invalidate_package_part.yaml.world.2.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "package:example/main.dart" as main {
 
   part b.dart;
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/invalidate_package_part.yaml.world.3.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/invalidate_package_part.yaml.world.3.expect
index 231c540..fcea24a 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/invalidate_package_part.yaml.world.3.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/invalidate_package_part.yaml.world.3.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "package:example/main.dart" as main {
 
   part b.dart;
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/invalidate_package_part_2.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/invalidate_package_part_2.yaml.world.1.expect
index 63174bf..527b651 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/invalidate_package_part_2.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/invalidate_package_part_2.yaml.world.1.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "package:example/main.dart" as main {
 
   part b.dart;
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/invalidate_package_part_2.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/invalidate_package_part_2.yaml.world.2.expect
index 5ddb0bf..143d78f 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/invalidate_package_part_2.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/invalidate_package_part_2.yaml.world.2.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "package:example/main.dart" as main {
 
   part b.dart;
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/invalidate_package_part_2.yaml.world.3.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/invalidate_package_part_2.yaml.world.3.expect
index 231c540..fcea24a 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/invalidate_package_part_2.yaml.world.3.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/invalidate_package_part_2.yaml.world.3.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "package:example/main.dart" as main {
 
   part b.dart;
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/invalidation_across_compile_time_error.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/invalidation_across_compile_time_error.yaml.world.1.expect
index 5d55e04..53240f3 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/invalidation_across_compile_time_error.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/invalidation_across_compile_time_error.yaml.world.1.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///b.dart" as b {
 
   static method b() → dynamic {
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/invalidation_across_compile_time_error.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/invalidation_across_compile_time_error.yaml.world.2.expect
index d52d5b0..8f72034 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/invalidation_across_compile_time_error.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/invalidation_across_compile_time_error.yaml.world.2.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///b.dart" as b {
 
   import "org-dartlang-test:///c.dart";
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/invalidation_across_compile_time_error.yaml.world.3.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/invalidation_across_compile_time_error.yaml.world.3.expect
index 7002b6b..6ae3151 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/invalidation_across_compile_time_error.yaml.world.3.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/invalidation_across_compile_time_error.yaml.world.3.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///b.dart" as b {
 
   import "org-dartlang-test:///c.dart";
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/issue_32366.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/issue_32366.yaml.world.1.expect
index 886b31c..4ebbef1 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/issue_32366.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/issue_32366.yaml.world.1.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///main.dart" as main {
 
   abstract class AIterator extends dart.core::Iterator<dynamic> {
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/issue_32366.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/issue_32366.yaml.world.2.expect
index ef7453c..f8aea1f 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/issue_32366.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/issue_32366.yaml.world.2.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///main.dart" as main {
 //
 // Problems in library:
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/issue_41976.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/issue_41976.yaml.world.1.expect
index c2ade5d..aca5281 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/issue_41976.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/issue_41976.yaml.world.1.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = foo::main;
 library from "org-dartlang-test:///foo.dart" as foo {
 
   abstract class Key extends dart.core::Object /*hasConstConstructor*/  {
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/issue_42323.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/issue_42323.yaml.world.1.expect
index 6176fb2..5f7c656 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/issue_42323.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/issue_42323.yaml.world.1.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = run::main;
 library from "org-dartlang-test:///bin/runMe.dart" as run {
 
   static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/issue_42323_prime.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/issue_42323_prime.yaml.world.1.expect
index 6c8e984..f2880ca 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/issue_42323_prime.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/issue_42323_prime.yaml.world.1.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = run::main;
 library from "org-dartlang-test:///bin/runMe.dart" as run {
 //
 // Problems in library:
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/load_from_component_explicitly_import_dart_core.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/load_from_component_explicitly_import_dart_core.yaml.world.1.expect
index 9605a7f..5a49451 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/load_from_component_explicitly_import_dart_core.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/load_from_component_explicitly_import_dart_core.yaml.world.1.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///b.dart" as b {
 
   import "dart:core";
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/load_from_component_explicitly_import_dart_core.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/load_from_component_explicitly_import_dart_core.yaml.world.2.expect
index 9605a7f..5a49451 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/load_from_component_explicitly_import_dart_core.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/load_from_component_explicitly_import_dart_core.yaml.world.2.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///b.dart" as b {
 
   import "dart:core";
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/mixin_application_declares.yaml b/pkg/front_end/testcases/incremental_initialize_from_dill/mixin_application_declares.yaml
new file mode 100644
index 0000000..81b1aa1
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/mixin_application_declares.yaml
@@ -0,0 +1,64 @@
+# Copyright (c) 2020, 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.md file.
+
+type: newworld
+target: None
+worlds:
+  - entry: main.dart
+    experiments: alternative-invalidation-strategy
+    sources:
+      main_lib1.dart: |
+        class SuperClass {
+          void method(covariant int i) {}
+        }
+
+        class Mixin {
+          void method(num i) {}
+        }
+
+        class Class extends SuperClass with Mixin {}
+      main_lib2.dart: |
+        import 'main_lib1.dart';
+
+        class SubClass extends Class {}
+
+        method() => new SubClass().method(0);
+      main.dart: |
+        import 'main_lib2.dart';
+
+        main() {
+          method();
+        }
+    expectedLibraryCount: 3
+  - entry: main.dart
+    experiments: alternative-invalidation-strategy
+    worldType: updated
+    expectInitializeFromDill: false
+    invalidate:
+      - main.dart
+    sources:
+      main.dart: |
+        import 'main_lib2.dart';
+
+        main() {
+          method();
+          method();
+        }
+    expectedLibraryCount: 3
+    expectsRebuildBodiesOnly: true
+  - entry: main.dart
+    experiments: alternative-invalidation-strategy
+    worldType: updated
+    expectInitializeFromDill: false
+    invalidate:
+      - main.dart
+    sources:
+      main.dart: |
+        import 'main_lib2.dart';
+
+        main() {
+          method();
+        }
+    expectedLibraryCount: 3
+    expectsRebuildBodiesOnly: true
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/mixin_application_declares.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/mixin_application_declares.yaml.world.1.expect
new file mode 100644
index 0000000..7648024
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/mixin_application_declares.yaml.world.1.expect
@@ -0,0 +1,68 @@
+main = main::main;
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///main_lib2.dart";
+
+  static method main() → dynamic {
+    mai::method();
+  }
+}
+library from "org-dartlang-test:///main_lib1.dart" as mai2 {
+
+  class SuperClass extends dart.core::Object {
+    synthetic constructor •() → mai2::SuperClass*
+      : super dart.core::Object::•()
+      ;
+    method method(covariant dart.core::int* i) → void {}
+    abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
+    abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
+    abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
+    abstract member-signature method _simpleInstanceOfTrue(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfTrue
+    abstract member-signature method _simpleInstanceOfFalse(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfFalse
+    abstract member-signature operator ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
+    abstract member-signature get hashCode() → dart.core::int*; -> dart.core::Object::hashCode
+    abstract member-signature method toString() → dart.core::String*; -> dart.core::Object::toString
+    abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
+    abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
+  }
+  class Mixin extends dart.core::Object {
+    synthetic constructor •() → mai2::Mixin*
+      : super dart.core::Object::•()
+      ;
+    method method(dart.core::num* i) → void {}
+    abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
+    abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
+    abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
+    abstract member-signature method _simpleInstanceOfTrue(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfTrue
+    abstract member-signature method _simpleInstanceOfFalse(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfFalse
+    abstract member-signature operator ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
+    abstract member-signature get hashCode() → dart.core::int*; -> dart.core::Object::hashCode
+    abstract member-signature method toString() → dart.core::String*; -> dart.core::Object::toString
+    abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
+    abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
+  }
+  abstract class _Class&SuperClass&Mixin = mai2::SuperClass with mai2::Mixin /*isAnonymousMixin*/  {
+    synthetic constructor •() → mai2::_Class&SuperClass&Mixin*
+      : super mai2::SuperClass::•()
+      ;
+    forwarding-stub method method(covariant dart.core::num* i) → void
+      return super.{mai2::SuperClass::method}(i);
+  }
+  class Class extends mai2::_Class&SuperClass&Mixin {
+    synthetic constructor •() → mai2::Class*
+      : super mai2::_Class&SuperClass&Mixin::•()
+      ;
+  }
+}
+library from "org-dartlang-test:///main_lib2.dart" as mai {
+
+  import "org-dartlang-test:///main_lib1.dart";
+
+  class SubClass extends mai2::Class {
+    synthetic constructor •() → mai::SubClass*
+      : super mai2::Class::•()
+      ;
+  }
+  static method method() → dynamic
+    return new mai::SubClass::•().{mai2::_Class&SuperClass&Mixin::method}(0);
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/mixin_application_declares.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/mixin_application_declares.yaml.world.2.expect
new file mode 100644
index 0000000..1fdd7b3
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/mixin_application_declares.yaml.world.2.expect
@@ -0,0 +1,69 @@
+main = main::main;
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///main_lib2.dart";
+
+  static method main() → dynamic {
+    mai::method();
+    mai::method();
+  }
+}
+library from "org-dartlang-test:///main_lib1.dart" as mai2 {
+
+  class SuperClass extends dart.core::Object {
+    synthetic constructor •() → mai2::SuperClass*
+      : super dart.core::Object::•()
+      ;
+    method method(covariant dart.core::int* i) → void {}
+    abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
+    abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
+    abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
+    abstract member-signature method _simpleInstanceOfTrue(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfTrue
+    abstract member-signature method _simpleInstanceOfFalse(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfFalse
+    abstract member-signature operator ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
+    abstract member-signature get hashCode() → dart.core::int*; -> dart.core::Object::hashCode
+    abstract member-signature method toString() → dart.core::String*; -> dart.core::Object::toString
+    abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
+    abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
+  }
+  class Mixin extends dart.core::Object {
+    synthetic constructor •() → mai2::Mixin*
+      : super dart.core::Object::•()
+      ;
+    method method(dart.core::num* i) → void {}
+    abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
+    abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
+    abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
+    abstract member-signature method _simpleInstanceOfTrue(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfTrue
+    abstract member-signature method _simpleInstanceOfFalse(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfFalse
+    abstract member-signature operator ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
+    abstract member-signature get hashCode() → dart.core::int*; -> dart.core::Object::hashCode
+    abstract member-signature method toString() → dart.core::String*; -> dart.core::Object::toString
+    abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
+    abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
+  }
+  abstract class _Class&SuperClass&Mixin = mai2::SuperClass with mai2::Mixin /*isAnonymousMixin*/  {
+    synthetic constructor •() → mai2::_Class&SuperClass&Mixin*
+      : super mai2::SuperClass::•()
+      ;
+    forwarding-stub method method(covariant dart.core::num* i) → void
+      return super.{mai2::SuperClass::method}(i);
+  }
+  class Class extends mai2::_Class&SuperClass&Mixin {
+    synthetic constructor •() → mai2::Class*
+      : super mai2::_Class&SuperClass&Mixin::•()
+      ;
+  }
+}
+library from "org-dartlang-test:///main_lib2.dart" as mai {
+
+  import "org-dartlang-test:///main_lib1.dart";
+
+  class SubClass extends mai2::Class {
+    synthetic constructor •() → mai::SubClass*
+      : super mai2::Class::•()
+      ;
+  }
+  static method method() → dynamic
+    return new mai::SubClass::•().{mai2::_Class&SuperClass&Mixin::method}(0);
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/mixin_application_declares.yaml.world.3.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/mixin_application_declares.yaml.world.3.expect
new file mode 100644
index 0000000..7648024
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/mixin_application_declares.yaml.world.3.expect
@@ -0,0 +1,68 @@
+main = main::main;
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///main_lib2.dart";
+
+  static method main() → dynamic {
+    mai::method();
+  }
+}
+library from "org-dartlang-test:///main_lib1.dart" as mai2 {
+
+  class SuperClass extends dart.core::Object {
+    synthetic constructor •() → mai2::SuperClass*
+      : super dart.core::Object::•()
+      ;
+    method method(covariant dart.core::int* i) → void {}
+    abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
+    abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
+    abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
+    abstract member-signature method _simpleInstanceOfTrue(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfTrue
+    abstract member-signature method _simpleInstanceOfFalse(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfFalse
+    abstract member-signature operator ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
+    abstract member-signature get hashCode() → dart.core::int*; -> dart.core::Object::hashCode
+    abstract member-signature method toString() → dart.core::String*; -> dart.core::Object::toString
+    abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
+    abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
+  }
+  class Mixin extends dart.core::Object {
+    synthetic constructor •() → mai2::Mixin*
+      : super dart.core::Object::•()
+      ;
+    method method(dart.core::num* i) → void {}
+    abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
+    abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
+    abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
+    abstract member-signature method _simpleInstanceOfTrue(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfTrue
+    abstract member-signature method _simpleInstanceOfFalse(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfFalse
+    abstract member-signature operator ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
+    abstract member-signature get hashCode() → dart.core::int*; -> dart.core::Object::hashCode
+    abstract member-signature method toString() → dart.core::String*; -> dart.core::Object::toString
+    abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
+    abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
+  }
+  abstract class _Class&SuperClass&Mixin = mai2::SuperClass with mai2::Mixin /*isAnonymousMixin*/  {
+    synthetic constructor •() → mai2::_Class&SuperClass&Mixin*
+      : super mai2::SuperClass::•()
+      ;
+    forwarding-stub method method(covariant dart.core::num* i) → void
+      return super.{mai2::SuperClass::method}(i);
+  }
+  class Class extends mai2::_Class&SuperClass&Mixin {
+    synthetic constructor •() → mai2::Class*
+      : super mai2::_Class&SuperClass&Mixin::•()
+      ;
+  }
+}
+library from "org-dartlang-test:///main_lib2.dart" as mai {
+
+  import "org-dartlang-test:///main_lib1.dart";
+
+  class SubClass extends mai2::Class {
+    synthetic constructor •() → mai::SubClass*
+      : super mai2::Class::•()
+      ;
+  }
+  static method method() → dynamic
+    return new mai::SubClass::•().{mai2::_Class&SuperClass&Mixin::method}(0);
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_1.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_1.yaml.world.1.expect
index 0a9adbf..be26f7c 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_1.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_1.yaml.world.1.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = act::main;
 library from "org-dartlang-test:///actualMain.dart" as act {
 
   import "org-dartlang-test:///main.dart" as m;
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_1.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_1.yaml.world.2.expect
index b4a3c69..bf98757 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_1.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_1.yaml.world.2.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = act::main;
 library from "org-dartlang-test:///actualMain.dart" as act {
 
   import "org-dartlang-test:///main.dart" as m;
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_10.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_10.yaml.world.1.expect
index 265e925..b05ab6a 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_10.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_10.yaml.world.1.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///lib1.dart" as lib1 {
 
   class Foo extends dart.core::Object {
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_10.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_10.yaml.world.2.expect
index 3131314..1039ffd 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_10.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_10.yaml.world.2.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///lib1.dart" as lib1 {
 
   class Foo extends dart.core::Object {
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_10.yaml.world.3.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_10.yaml.world.3.expect
index bd80f67..aa0d21e 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_10.yaml.world.3.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_10.yaml.world.3.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///lib1.dart" as lib1 {
 
   class Foo extends dart.core::Object {
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_11.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_11.yaml.world.1.expect
index 45b8341..34e3fcb 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_11.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_11.yaml.world.1.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///lib1.dart" as lib1 {
 
   import "org-dartlang-test:///lib2.dart";
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_11.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_11.yaml.world.2.expect
index 25fb6e4..eda724f 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_11.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_11.yaml.world.2.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///lib1.dart" as lib1 {
 
   import "org-dartlang-test:///lib2.dart";
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_12.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_12.yaml.world.1.expect
index a3e602c..3746e52 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_12.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_12.yaml.world.1.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///lib1.dart" as lib1 {
 additionalExports = (lib2::Bar)
 
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_12.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_12.yaml.world.2.expect
index aca89a6..96ec3d6 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_12.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_12.yaml.world.2.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///lib1.dart" as lib1 {
 additionalExports = (lib2::Bar)
 
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_12.yaml.world.3.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_12.yaml.world.3.expect
index 0a39b64..533cf21 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_12.yaml.world.3.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_12.yaml.world.3.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///lib1.dart" as lib1 {
 additionalExports = (lib2::Bar)
 
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_12.yaml.world.4.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_12.yaml.world.4.expect
index e094142..b32b613 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_12.yaml.world.4.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_12.yaml.world.4.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///lib1.dart" as lib1 {
 additionalExports = (lib2::Bar)
 
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_13.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_13.yaml.world.1.expect
index 4a4a746..b41916b 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_13.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_13.yaml.world.1.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///lib1.dart" as lib1 {
 additionalExports = (lib2::Foo)
 
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_13.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_13.yaml.world.2.expect
index 50f5bf9..6e5e4a9 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_13.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_13.yaml.world.2.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///lib1.dart" as lib1 {
 additionalExports = (lib2::Foo)
 
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_15.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_15.yaml.world.1.expect
index a4bb844..36909df 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_15.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_15.yaml.world.1.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///lib1.dart" as lib1 {
 
   class A<T extends dart.core::Object* = dynamic> extends dart.core::Object {
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_15.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_15.yaml.world.2.expect
index 011bdc2..ad37dd1 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_15.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_15.yaml.world.2.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///lib1.dart" as lib1 {
 
   class A<T extends dart.core::Object* = dynamic> extends dart.core::Object {
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_17.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_17.yaml.world.1.expect
index fb5936c..c8ec18e 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_17.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_17.yaml.world.1.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///lib.dart" as lib {
 
   static method foo() → dynamic {
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_17.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_17.yaml.world.2.expect
index f65b824..54f989f 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_17.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_17.yaml.world.2.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///lib.dart" as lib {
 
   static method foo() → dynamic {
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_18.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_18.yaml.world.1.expect
index ab18cd4..baa6de2 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_18.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_18.yaml.world.1.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///lib1.dart" as lib1 {
 
   static method x() → dynamic {
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_18.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_18.yaml.world.2.expect
index 5bf4d8d..d40f10d 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_18.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_18.yaml.world.2.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///lib1.dart" as lib1 {
 
   static method x() → dynamic {
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_2.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_2.yaml.world.1.expect
index 36d467b..ecaf0eb 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_2.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_2.yaml.world.1.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///libA.dart" as libA {
 
   import "org-dartlang-test:///main.dart";
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_2.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_2.yaml.world.2.expect
index cb6ad9d..3610c0e 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_2.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_2.yaml.world.2.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///libA.dart" as libA {
 
   import "org-dartlang-test:///main.dart";
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_22.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_22.yaml.world.1.expect
index 93245f5..994228a 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_22.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_22.yaml.world.1.expect
@@ -322,14 +322,14 @@
           dart.core::Iterator<dart.core::int*> :sync-for-iterator = this.{dart.core::Iterable::iterator};
           for (; :sync-for-iterator.{dart.core::Iterator::moveNext}(); ) {
             final dart.core::int* #t6 = :sync-for-iterator.{dart.core::Iterator::current};
-            #t5.{dart.core::List::add}(#t6);
+            #t5.{dart.core::List::add}{Invariant}(#t6);
           }
         }
         {
           dart.core::Iterator<dart.core::int*> :sync-for-iterator = other.{dart.core::Iterable::iterator};
           for (; :sync-for-iterator.{dart.core::Iterator::moveNext}(); ) {
             final dart.core::int* #t7 = :sync-for-iterator.{dart.core::Iterator::current};
-            #t5.{dart.core::List::add}(#t7);
+            #t5.{dart.core::List::add}{Invariant}(#t7);
           }
         }
       } =>#t5;
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_22.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_22.yaml.world.2.expect
index 93245f5..994228a 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_22.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_22.yaml.world.2.expect
@@ -322,14 +322,14 @@
           dart.core::Iterator<dart.core::int*> :sync-for-iterator = this.{dart.core::Iterable::iterator};
           for (; :sync-for-iterator.{dart.core::Iterator::moveNext}(); ) {
             final dart.core::int* #t6 = :sync-for-iterator.{dart.core::Iterator::current};
-            #t5.{dart.core::List::add}(#t6);
+            #t5.{dart.core::List::add}{Invariant}(#t6);
           }
         }
         {
           dart.core::Iterator<dart.core::int*> :sync-for-iterator = other.{dart.core::Iterable::iterator};
           for (; :sync-for-iterator.{dart.core::Iterator::moveNext}(); ) {
             final dart.core::int* #t7 = :sync-for-iterator.{dart.core::Iterator::current};
-            #t5.{dart.core::List::add}(#t7);
+            #t5.{dart.core::List::add}{Invariant}(#t7);
           }
         }
       } =>#t5;
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_26.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_26.yaml.world.1.expect
index c218052..22db75d 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_26.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_26.yaml.world.1.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///main.dart" as main {
 //
 // Problems in library:
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_26.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_26.yaml.world.2.expect
index c218052..22db75d 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_26.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_26.yaml.world.2.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///main.dart" as main {
 //
 // Problems in library:
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_27.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_27.yaml.world.1.expect
index e203f48..be30c89 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_27.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_27.yaml.world.1.expect
@@ -1,4 +1,9 @@
-main = <No Member>;
+main = main::main;
+//
+// Problems in component:
+//
+// org-dartlang-test:///main.dart: Warning: Interpreting this as package URI, 'package:foo/main.dart'.
+//
 library from "package:foo/lib.dart" as lib {
 
   static method libMethod() → dynamic {
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_27.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_27.yaml.world.2.expect
index 8521889..e6183a8 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_27.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_27.yaml.world.2.expect
@@ -1,4 +1,9 @@
-main = <No Member>;
+main = main::main;
+//
+// Problems in component:
+//
+// org-dartlang-test:///main.dart: Warning: Interpreting this as package URI, 'package:foo/main.dart'.
+//
 library from "package:foo/lib.dart" as lib {
 
   static method libMethod() → dynamic {
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_27.yaml.world.3.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_27.yaml.world.3.expect
index 7090545..bfa1434 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_27.yaml.world.3.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_27.yaml.world.3.expect
@@ -1,4 +1,9 @@
-main = <No Member>;
+main = main::main;
+//
+// Problems in component:
+//
+// org-dartlang-test:///main.dart: Warning: Interpreting this as package URI, 'package:foo/main.dart'.
+//
 library from "package:foo/lib.dart" as lib {
 
   static method libMethod() → dynamic {
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_29.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_29.yaml.world.1.expect
index 317d3e2..f687cd9 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_29.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_29.yaml.world.1.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///main.dart" as main {
 
   class C extends dart.core::Object {
@@ -33,7 +33,7 @@
       this.{main::C::_#C#field5} = #t1;
     }
     get field6() → dart.core::int?
-      return this.{main::C::_#C#field6#isSet} ?{dart.core::int?} this.{main::C::_#C#field6} : throw new dart._internal::LateInitializationErrorImpl::•("Field 'field6' has not been initialized.");
+      return this.{main::C::_#C#field6#isSet} ?{dart.core::int?} this.{main::C::_#C#field6} : throw new dart._internal::LateError::fieldNI("field6");
     set field6(dart.core::int? #t2) → void {
       this.{main::C::_#C#field6#isSet} = true;
       this.{main::C::_#C#field6} = #t2;
@@ -42,17 +42,17 @@
       if(!this.{main::C::_#C#field7#isSet}) {
         final dart.core::int? #t3 = 42;
         if(this.{main::C::_#C#field7#isSet})
-          throw new dart._internal::LateInitializationErrorImpl::•("Field 'field7' has been assigned during initialization.");
+          throw new dart._internal::LateError::fieldADI("field7");
         this.{main::C::_#C#field7} = #t3;
         this.{main::C::_#C#field7#isSet} = true;
       }
       return this.{main::C::_#C#field7};
     }
     get field8() → dart.core::int?
-      return this.{main::C::_#C#field8#isSet} ?{dart.core::int?} this.{main::C::_#C#field8} : throw new dart._internal::LateInitializationErrorImpl::•("Field 'field8' has not been initialized.");
+      return this.{main::C::_#C#field8#isSet} ?{dart.core::int?} this.{main::C::_#C#field8} : throw new dart._internal::LateError::fieldNI("field8");
     set field8(dart.core::int? #t4) → void
       if(this.{main::C::_#C#field8#isSet})
-        throw new dart._internal::LateInitializationErrorImpl::•("Field 'field8' has already been initialized.");
+        throw new dart._internal::LateError::fieldAI("field8");
       else {
         this.{main::C::_#C#field8#isSet} = true;
         this.{main::C::_#C#field8} = #t4;
@@ -69,7 +69,7 @@
       main::C::_#field9 = #t5;
     }
     static get field10() → dart.core::int?
-      return main::C::_#field10#isSet ?{dart.core::int?} main::C::_#field10 : throw new dart._internal::LateInitializationErrorImpl::•("Field 'field10' has not been initialized.");
+      return main::C::_#field10#isSet ?{dart.core::int?} main::C::_#field10 : throw new dart._internal::LateError::fieldNI("field10");
     static set field10(dart.core::int? #t6) → void {
       main::C::_#field10#isSet = true;
       main::C::_#field10 = #t6;
@@ -78,17 +78,17 @@
       if(!main::C::_#field11#isSet) {
         final dart.core::int? #t7 = 42;
         if(main::C::_#field11#isSet)
-          throw new dart._internal::LateInitializationErrorImpl::•("Field 'field11' has been assigned during initialization.");
+          throw new dart._internal::LateError::fieldADI("field11");
         main::C::_#field11 = #t7;
         main::C::_#field11#isSet = true;
       }
       return main::C::_#field11;
     }
     static get field12() → dart.core::int?
-      return main::C::_#field12#isSet ?{dart.core::int?} main::C::_#field12 : throw new dart._internal::LateInitializationErrorImpl::•("Field 'field12' has not been initialized.");
+      return main::C::_#field12#isSet ?{dart.core::int?} main::C::_#field12 : throw new dart._internal::LateError::fieldNI("field12");
     static set field12(dart.core::int? #t8) → void
       if(main::C::_#field12#isSet)
-        throw new dart._internal::LateInitializationErrorImpl::•("Field 'field12' has already been initialized.");
+        throw new dart._internal::LateError::fieldAI("field12");
       else {
         main::C::_#field12#isSet = true;
         main::C::_#field12 = #t8;
@@ -114,7 +114,7 @@
     main::_#field1 = #t9;
   }
   static get field2() → dart.core::int?
-    return main::_#field2#isSet ?{dart.core::int?} main::_#field2 : throw new dart._internal::LateInitializationErrorImpl::•("Field 'field2' has not been initialized.");
+    return main::_#field2#isSet ?{dart.core::int?} main::_#field2 : throw new dart._internal::LateError::fieldNI("field2");
   static set field2(dart.core::int? #t10) → void {
     main::_#field2#isSet = true;
     main::_#field2 = #t10;
@@ -123,17 +123,17 @@
     if(!main::_#field3#isSet) {
       final dart.core::int? #t11 = 42;
       if(main::_#field3#isSet)
-        throw new dart._internal::LateInitializationErrorImpl::•("Field 'field3' has been assigned during initialization.");
+        throw new dart._internal::LateError::fieldADI("field3");
       main::_#field3 = #t11;
       main::_#field3#isSet = true;
     }
     return main::_#field3;
   }
   static get field4() → dart.core::int?
-    return main::_#field4#isSet ?{dart.core::int?} main::_#field4 : throw new dart._internal::LateInitializationErrorImpl::•("Field 'field4' has not been initialized.");
+    return main::_#field4#isSet ?{dart.core::int?} main::_#field4 : throw new dart._internal::LateError::fieldNI("field4");
   static set field4(dart.core::int? #t12) → void
     if(main::_#field4#isSet)
-      throw new dart._internal::LateInitializationErrorImpl::•("Field 'field4' has already been initialized.");
+      throw new dart._internal::LateError::fieldAI("field4");
     else {
       main::_#field4#isSet = true;
       main::_#field4 = #t12;
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_29.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_29.yaml.world.2.expect
index 4e90b8f..672f9b9 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_29.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_29.yaml.world.2.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///main.dart" as main {
 
   class C extends dart.core::Object {
@@ -33,7 +33,7 @@
       this.{main::C::_#C#field5} = #t1;
     }
     get field6() → dart.core::int?
-      return this.{main::C::_#C#field6#isSet} ?{dart.core::int?} this.{main::C::_#C#field6} : throw new dart._internal::LateInitializationErrorImpl::•("Field 'field6' has not been initialized.");
+      return this.{main::C::_#C#field6#isSet} ?{dart.core::int?} this.{main::C::_#C#field6} : throw new dart._internal::LateError::fieldNI("field6");
     set field6(dart.core::int? #t2) → void {
       this.{main::C::_#C#field6#isSet} = true;
       this.{main::C::_#C#field6} = #t2;
@@ -42,17 +42,17 @@
       if(!this.{main::C::_#C#field7#isSet}) {
         final dart.core::int? #t3 = 42;
         if(this.{main::C::_#C#field7#isSet})
-          throw new dart._internal::LateInitializationErrorImpl::•("Field 'field7' has been assigned during initialization.");
+          throw new dart._internal::LateError::fieldADI("field7");
         this.{main::C::_#C#field7} = #t3;
         this.{main::C::_#C#field7#isSet} = true;
       }
       return this.{main::C::_#C#field7};
     }
     get field8() → dart.core::int?
-      return this.{main::C::_#C#field8#isSet} ?{dart.core::int?} this.{main::C::_#C#field8} : throw new dart._internal::LateInitializationErrorImpl::•("Field 'field8' has not been initialized.");
+      return this.{main::C::_#C#field8#isSet} ?{dart.core::int?} this.{main::C::_#C#field8} : throw new dart._internal::LateError::fieldNI("field8");
     set field8(dart.core::int? #t4) → void
       if(this.{main::C::_#C#field8#isSet})
-        throw new dart._internal::LateInitializationErrorImpl::•("Field 'field8' has already been initialized.");
+        throw new dart._internal::LateError::fieldAI("field8");
       else {
         this.{main::C::_#C#field8#isSet} = true;
         this.{main::C::_#C#field8} = #t4;
@@ -69,7 +69,7 @@
       main::C::_#field9 = #t5;
     }
     static get field10() → dart.core::int?
-      return main::C::_#field10#isSet ?{dart.core::int?} main::C::_#field10 : throw new dart._internal::LateInitializationErrorImpl::•("Field 'field10' has not been initialized.");
+      return main::C::_#field10#isSet ?{dart.core::int?} main::C::_#field10 : throw new dart._internal::LateError::fieldNI("field10");
     static set field10(dart.core::int? #t6) → void {
       main::C::_#field10#isSet = true;
       main::C::_#field10 = #t6;
@@ -78,17 +78,17 @@
       if(!main::C::_#field11#isSet) {
         final dart.core::int? #t7 = 42;
         if(main::C::_#field11#isSet)
-          throw new dart._internal::LateInitializationErrorImpl::•("Field 'field11' has been assigned during initialization.");
+          throw new dart._internal::LateError::fieldADI("field11");
         main::C::_#field11 = #t7;
         main::C::_#field11#isSet = true;
       }
       return main::C::_#field11;
     }
     static get field12() → dart.core::int?
-      return main::C::_#field12#isSet ?{dart.core::int?} main::C::_#field12 : throw new dart._internal::LateInitializationErrorImpl::•("Field 'field12' has not been initialized.");
+      return main::C::_#field12#isSet ?{dart.core::int?} main::C::_#field12 : throw new dart._internal::LateError::fieldNI("field12");
     static set field12(dart.core::int? #t8) → void
       if(main::C::_#field12#isSet)
-        throw new dart._internal::LateInitializationErrorImpl::•("Field 'field12' has already been initialized.");
+        throw new dart._internal::LateError::fieldAI("field12");
       else {
         main::C::_#field12#isSet = true;
         main::C::_#field12 = #t8;
@@ -114,7 +114,7 @@
     main::_#field1 = #t9;
   }
   static get field2() → dart.core::int?
-    return main::_#field2#isSet ?{dart.core::int?} main::_#field2 : throw new dart._internal::LateInitializationErrorImpl::•("Field 'field2' has not been initialized.");
+    return main::_#field2#isSet ?{dart.core::int?} main::_#field2 : throw new dart._internal::LateError::fieldNI("field2");
   static set field2(dart.core::int? #t10) → void {
     main::_#field2#isSet = true;
     main::_#field2 = #t10;
@@ -123,17 +123,17 @@
     if(!main::_#field3#isSet) {
       final dart.core::int? #t11 = 42;
       if(main::_#field3#isSet)
-        throw new dart._internal::LateInitializationErrorImpl::•("Field 'field3' has been assigned during initialization.");
+        throw new dart._internal::LateError::fieldADI("field3");
       main::_#field3 = #t11;
       main::_#field3#isSet = true;
     }
     return main::_#field3;
   }
   static get field4() → dart.core::int?
-    return main::_#field4#isSet ?{dart.core::int?} main::_#field4 : throw new dart._internal::LateInitializationErrorImpl::•("Field 'field4' has not been initialized.");
+    return main::_#field4#isSet ?{dart.core::int?} main::_#field4 : throw new dart._internal::LateError::fieldNI("field4");
   static set field4(dart.core::int? #t12) → void
     if(main::_#field4#isSet)
-      throw new dart._internal::LateInitializationErrorImpl::•("Field 'field4' has already been initialized.");
+      throw new dart._internal::LateError::fieldAI("field4");
     else {
       main::_#field4#isSet = true;
       main::_#field4 = #t12;
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_3.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_3.yaml.world.1.expect
index d0be967..32da763 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_3.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_3.yaml.world.1.expect
@@ -1,8 +1,9 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///libA.dart" as libA {
 
   static method whatever() → dynamic /* originally async */ {
-    final dart.async::_AsyncAwaitCompleter<dynamic>* :async_completer = new dart.async::_AsyncAwaitCompleter::•<dynamic>();
+    final dart.async::_Future<dynamic>* :async_future = new dart.async::_Future::•<dynamic>();
+    dart.core::bool* :is_sync = false;
     FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -15,21 +16,22 @@
         #L1:
         {
           [yield] let dynamic #t1 = dart.async::_awaitHelper(null, :async_op_then, :async_op_error, :async_op) in null;
-          dart._internal::unsafeCast<dart.core::Null?>(:result);
+          dart._internal::unsafeCast<Null>(:result);
           :return_value = "hello";
           break #L1;
         }
-        dart.async::_completeOnAsyncReturn(:async_completer, :return_value);
+        dart.async::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, dart.core::StackTrace* stack_trace) {
-        :async_completer.{dart.async::Completer::completeError}(exception, stack_trace);
+        dart.async::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = dart.async::_asyncStackTraceHelper(:async_op);
     :async_op_then = dart.async::_asyncThenWrapperHelper(:async_op);
     :async_op_error = dart.async::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{dart.async::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{dart.async::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   }
 }
 library from "org-dartlang-test:///main.dart" as main {
@@ -54,7 +56,8 @@
     abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
   }
   static method main() → dynamic /* originally async */ {
-    final dart.async::_AsyncAwaitCompleter<dynamic>* :async_completer = new dart.async::_AsyncAwaitCompleter::•<dynamic>();
+    final dart.async::_Future<dynamic>* :async_future = new dart.async::_Future::•<dynamic>();
+    dart.core::bool* :is_sync = false;
     FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -70,17 +73,18 @@
           :result;
           dart.core::print(#C2);
         }
-        dart.async::_completeOnAsyncReturn(:async_completer, :return_value);
+        dart.async::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, dart.core::StackTrace* stack_trace) {
-        :async_completer.{dart.async::Completer::completeError}(exception, stack_trace);
+        dart.async::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = dart.async::_asyncStackTraceHelper(:async_op);
     :async_op_then = dart.async::_asyncThenWrapperHelper(:async_op);
     :async_op_error = dart.async::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{dart.async::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{dart.async::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   }
 }
 constants  {
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_3.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_3.yaml.world.2.expect
index d2bcb27..0fabe89 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_3.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_3.yaml.world.2.expect
@@ -1,8 +1,9 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///libA.dart" as libA {
 
   static method whatever() → dynamic /* originally async */ {
-    final dart.async::_AsyncAwaitCompleter<dynamic>* :async_completer = new dart.async::_AsyncAwaitCompleter::•<dynamic>();
+    final dart.async::_Future<dynamic>* :async_future = new dart.async::_Future::•<dynamic>();
+    dart.core::bool* :is_sync = false;
     FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -15,21 +16,22 @@
         #L1:
         {
           [yield] let dynamic #t1 = dart.async::_awaitHelper(null, :async_op_then, :async_op_error, :async_op) in null;
-          dart._internal::unsafeCast<dart.core::Null?>(:result);
+          dart._internal::unsafeCast<Null>(:result);
           :return_value = "hello";
           break #L1;
         }
-        dart.async::_completeOnAsyncReturn(:async_completer, :return_value);
+        dart.async::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, dart.core::StackTrace* stack_trace) {
-        :async_completer.{dart.async::Completer::completeError}(exception, stack_trace);
+        dart.async::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = dart.async::_asyncStackTraceHelper(:async_op);
     :async_op_then = dart.async::_asyncThenWrapperHelper(:async_op);
     :async_op_error = dart.async::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{dart.async::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{dart.async::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   }
 }
 library from "org-dartlang-test:///main.dart" as main {
@@ -54,7 +56,8 @@
     abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
   }
   static method main() → dynamic /* originally async */ {
-    final dart.async::_AsyncAwaitCompleter<dynamic>* :async_completer = new dart.async::_AsyncAwaitCompleter::•<dynamic>();
+    final dart.async::_Future<dynamic>* :async_future = new dart.async::_Future::•<dynamic>();
+    dart.core::bool* :is_sync = false;
     FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -71,17 +74,18 @@
           dart.core::print(#C2);
           dart.core::print("Done");
         }
-        dart.async::_completeOnAsyncReturn(:async_completer, :return_value);
+        dart.async::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, dart.core::StackTrace* stack_trace) {
-        :async_completer.{dart.async::Completer::completeError}(exception, stack_trace);
+        dart.async::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = dart.async::_asyncStackTraceHelper(:async_op);
     :async_op_then = dart.async::_asyncThenWrapperHelper(:async_op);
     :async_op_error = dart.async::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{dart.async::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{dart.async::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   }
 }
 constants  {
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_30.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_30.yaml.world.1.expect
index 2d01211..58431c8 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_30.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_30.yaml.world.1.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///main.dart" as main {
 
   class C extends dart.core::Object {
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_30.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_30.yaml.world.2.expect
index 65977cb..f93a253 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_30.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_30.yaml.world.2.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///main.dart" as main {
 
   class C extends dart.core::Object {
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_31.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_31.yaml.world.1.expect
index a34308e..e94d83d 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_31.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_31.yaml.world.1.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///main.dart" as main {
 
   class C extends dart.core::Object {
@@ -51,7 +51,7 @@
     main::_#field1 = #t1;
   }
   static get field2() → dart.core::int?
-    return main::_#field2#isSet ?{dart.core::int?} main::_#field2 : throw new dart._internal::LateInitializationErrorImpl::•("Field 'field2' has not been initialized.");
+    return main::_#field2#isSet ?{dart.core::int?} main::_#field2 : throw new dart._internal::LateError::fieldNI("field2");
   static set field2(dart.core::int? #t2) → void {
     main::_#field2#isSet = true;
     main::_#field2 = #t2;
@@ -60,17 +60,17 @@
     if(!main::_#field3#isSet) {
       final dart.core::int? #t3 = 42;
       if(main::_#field3#isSet)
-        throw new dart._internal::LateInitializationErrorImpl::•("Field 'field3' has been assigned during initialization.");
+        throw new dart._internal::LateError::fieldADI("field3");
       main::_#field3 = #t3;
       main::_#field3#isSet = true;
     }
     return main::_#field3;
   }
   static get field4() → dart.core::int?
-    return main::_#field4#isSet ?{dart.core::int?} main::_#field4 : throw new dart._internal::LateInitializationErrorImpl::•("Field 'field4' has not been initialized.");
+    return main::_#field4#isSet ?{dart.core::int?} main::_#field4 : throw new dart._internal::LateError::fieldNI("field4");
   static set field4(dart.core::int? #t4) → void
     if(main::_#field4#isSet)
-      throw new dart._internal::LateInitializationErrorImpl::•("Field 'field4' has already been initialized.");
+      throw new dart._internal::LateError::fieldAI("field4");
     else {
       main::_#field4#isSet = true;
       main::_#field4 = #t4;
@@ -87,7 +87,7 @@
     main::_#_extension#0|field5 = #t5;
   }
   static get _extension#0|field6() → dart.core::int?
-    return main::_#_extension#0|field6#isSet ?{dart.core::int?} main::_#_extension#0|field6 : throw new dart._internal::LateInitializationErrorImpl::•("Field 'field6' has not been initialized.");
+    return main::_#_extension#0|field6#isSet ?{dart.core::int?} main::_#_extension#0|field6 : throw new dart._internal::LateError::fieldNI("field6");
   static set _extension#0|field6(dart.core::int? #t6) → void {
     main::_#_extension#0|field6#isSet = true;
     main::_#_extension#0|field6 = #t6;
@@ -96,17 +96,17 @@
     if(!main::_#_extension#0|field7#isSet) {
       final dart.core::int? #t7 = 42;
       if(main::_#_extension#0|field7#isSet)
-        throw new dart._internal::LateInitializationErrorImpl::•("Field 'field7' has been assigned during initialization.");
+        throw new dart._internal::LateError::fieldADI("field7");
       main::_#_extension#0|field7 = #t7;
       main::_#_extension#0|field7#isSet = true;
     }
     return main::_#_extension#0|field7;
   }
   static get _extension#0|field8() → dart.core::int?
-    return main::_#_extension#0|field8#isSet ?{dart.core::int?} main::_#_extension#0|field8 : throw new dart._internal::LateInitializationErrorImpl::•("Field 'field8' has not been initialized.");
+    return main::_#_extension#0|field8#isSet ?{dart.core::int?} main::_#_extension#0|field8 : throw new dart._internal::LateError::fieldNI("field8");
   static set _extension#0|field8(dart.core::int? #t8) → void
     if(main::_#_extension#0|field8#isSet)
-      throw new dart._internal::LateInitializationErrorImpl::•("Field 'field8' has already been initialized.");
+      throw new dart._internal::LateError::fieldAI("field8");
     else {
       main::_#_extension#0|field8#isSet = true;
       main::_#_extension#0|field8 = #t8;
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_31.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_31.yaml.world.2.expect
index 246b57d..94a763e 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_31.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_31.yaml.world.2.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///main.dart" as main {
 
   class C extends dart.core::Object {
@@ -51,7 +51,7 @@
     main::_#field1 = #t1;
   }
   static get field2() → dart.core::int?
-    return main::_#field2#isSet ?{dart.core::int?} main::_#field2 : throw new dart._internal::LateInitializationErrorImpl::•("Field 'field2' has not been initialized.");
+    return main::_#field2#isSet ?{dart.core::int?} main::_#field2 : throw new dart._internal::LateError::fieldNI("field2");
   static set field2(dart.core::int? #t2) → void {
     main::_#field2#isSet = true;
     main::_#field2 = #t2;
@@ -60,17 +60,17 @@
     if(!main::_#field3#isSet) {
       final dart.core::int? #t3 = 42;
       if(main::_#field3#isSet)
-        throw new dart._internal::LateInitializationErrorImpl::•("Field 'field3' has been assigned during initialization.");
+        throw new dart._internal::LateError::fieldADI("field3");
       main::_#field3 = #t3;
       main::_#field3#isSet = true;
     }
     return main::_#field3;
   }
   static get field4() → dart.core::int?
-    return main::_#field4#isSet ?{dart.core::int?} main::_#field4 : throw new dart._internal::LateInitializationErrorImpl::•("Field 'field4' has not been initialized.");
+    return main::_#field4#isSet ?{dart.core::int?} main::_#field4 : throw new dart._internal::LateError::fieldNI("field4");
   static set field4(dart.core::int? #t4) → void
     if(main::_#field4#isSet)
-      throw new dart._internal::LateInitializationErrorImpl::•("Field 'field4' has already been initialized.");
+      throw new dart._internal::LateError::fieldAI("field4");
     else {
       main::_#field4#isSet = true;
       main::_#field4 = #t4;
@@ -87,7 +87,7 @@
     main::_#_extension#0|field5 = #t5;
   }
   static get _extension#0|field6() → dart.core::int?
-    return main::_#_extension#0|field6#isSet ?{dart.core::int?} main::_#_extension#0|field6 : throw new dart._internal::LateInitializationErrorImpl::•("Field 'field6' has not been initialized.");
+    return main::_#_extension#0|field6#isSet ?{dart.core::int?} main::_#_extension#0|field6 : throw new dart._internal::LateError::fieldNI("field6");
   static set _extension#0|field6(dart.core::int? #t6) → void {
     main::_#_extension#0|field6#isSet = true;
     main::_#_extension#0|field6 = #t6;
@@ -96,17 +96,17 @@
     if(!main::_#_extension#0|field7#isSet) {
       final dart.core::int? #t7 = 42;
       if(main::_#_extension#0|field7#isSet)
-        throw new dart._internal::LateInitializationErrorImpl::•("Field 'field7' has been assigned during initialization.");
+        throw new dart._internal::LateError::fieldADI("field7");
       main::_#_extension#0|field7 = #t7;
       main::_#_extension#0|field7#isSet = true;
     }
     return main::_#_extension#0|field7;
   }
   static get _extension#0|field8() → dart.core::int?
-    return main::_#_extension#0|field8#isSet ?{dart.core::int?} main::_#_extension#0|field8 : throw new dart._internal::LateInitializationErrorImpl::•("Field 'field8' has not been initialized.");
+    return main::_#_extension#0|field8#isSet ?{dart.core::int?} main::_#_extension#0|field8 : throw new dart._internal::LateError::fieldNI("field8");
   static set _extension#0|field8(dart.core::int? #t8) → void
     if(main::_#_extension#0|field8#isSet)
-      throw new dart._internal::LateInitializationErrorImpl::•("Field 'field8' has already been initialized.");
+      throw new dart._internal::LateError::fieldAI("field8");
     else {
       main::_#_extension#0|field8#isSet = true;
       main::_#_extension#0|field8 = #t8;
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_32.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_32.yaml.world.1.expect
index 7d8771c..4758b1b 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_32.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_32.yaml.world.1.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///main.dart" as main {
 
   class C extends dart.core::Object {
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_32.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_32.yaml.world.2.expect
index 354efa3..a6ebd95 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_32.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_32.yaml.world.2.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///main.dart" as main {
 
   class C extends dart.core::Object {
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_33.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_33.yaml.world.1.expect
index 6292ffe..d1a27b8 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_33.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_33.yaml.world.1.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///lib1.dart" as lib1 {
 additionalExports = (lib2::getter,
   lib2::method,
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_33.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_33.yaml.world.2.expect
index 4c90325..c983226 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_33.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_33.yaml.world.2.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///lib1.dart" as lib1 {
 additionalExports = (lib2::getter,
   lib2::method,
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_33.yaml.world.3.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_33.yaml.world.3.expect
index 9f587ac..d408f4d 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_33.yaml.world.3.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_33.yaml.world.3.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///lib1.dart" as lib1 {
 additionalExports = (lib2::getter,
   lib2::method,
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_33.yaml.world.4.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_33.yaml.world.4.expect
index 566f811..49eb8f41 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_33.yaml.world.4.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_33.yaml.world.4.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///lib1.dart" as lib1 {
 additionalExports = (lib2::getter,
   lib2::method,
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_34.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_34.yaml.world.1.expect
index 4ec41b3c..6a509d9 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_34.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_34.yaml.world.1.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///lib1.dart" as lib1 {
 additionalExports = (main::main,
   main::Class,
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_34.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_34.yaml.world.2.expect
index b70006b..2ffd6f9 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_34.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_34.yaml.world.2.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///lib1.dart" as lib1 {
 additionalExports = (main::main,
   main::Class,
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_34.yaml.world.3.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_34.yaml.world.3.expect
index f751e2a..9287c32 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_34.yaml.world.3.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_34.yaml.world.3.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///lib1.dart" as lib1 {
 additionalExports = (main::main,
   main::Class,
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_34.yaml.world.4.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_34.yaml.world.4.expect
index 22ff40c..2e9599f 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_34.yaml.world.4.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_34.yaml.world.4.expect
@@ -1,8 +1,6 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///lib1.dart" as lib1 {
-additionalExports = (main::Extension|get#method,
-  main::Extension|method,
-  main::main,
+additionalExports = (main::main,
   main::Class,
   main::Extension)
 
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_35.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_35.yaml.world.1.expect
index 07b6c80..6ad0475 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_35.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_35.yaml.world.1.expect
@@ -1,12 +1,13 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///lib.dart" as lib {
 
   import "dart:ffi";
 
   @#C3
+  @#C8
   class Coordinate extends dart.ffi::Struct {
     @#C3
-    static final field dart.core::int* #sizeOf = (#C6).{dart.core::List::[]}(dart.ffi::_abi());
+    static final field dart.core::int* #sizeOf = (#C11).{dart.core::List::[]}(dart.ffi::_abi());
     @#C3
     constructor #fromPointer(dynamic #pointer) → dynamic
       : super dart.ffi::Struct::_fromPointer(#pointer)
@@ -14,7 +15,7 @@
     static factory allocate(dart.core::double* x, dart.core::double* y, dart.ffi::Pointer<lib::Coordinate*>* next) → lib::Coordinate* {
       return null;
     }
-    abstract member-signature get _addressOf() → dart.ffi::Pointer<dart.ffi::Struct*>*; -> dart.ffi::Struct::_addressOf
+    abstract member-signature get _addressOf() → dart.core::Object*; -> dart.ffi::Struct::_addressOf
     abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
     abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
     abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
@@ -26,17 +27,17 @@
     abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
     abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
     get x() → dart.core::double*
-      return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_addressOf}, (#C8).{dart.core::List::[]}(dart.ffi::_abi()));
+      return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_addressOf}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()));
     set x(dart.core::double* #v) → void
-      return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_addressOf}, (#C8).{dart.core::List::[]}(dart.ffi::_abi()), #v);
+      return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_addressOf}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()), #v);
     get y() → dart.core::double*
-      return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_addressOf}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()));
+      return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_addressOf}, (#C15).{dart.core::List::[]}(dart.ffi::_abi()));
     set y(dart.core::double* #v) → void
-      return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_addressOf}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()), #v);
+      return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_addressOf}, (#C15).{dart.core::List::[]}(dart.ffi::_abi()), #v);
     get next() → dart.ffi::Pointer<lib::Coordinate*>*
-      return dart.ffi::_fromAddress<lib::Coordinate*>(dart.ffi::_loadIntPtr(this.{dart.ffi::Struct::_addressOf}, (#C12).{dart.core::List::[]}(dart.ffi::_abi())));
+      return dart.ffi::_fromAddress<lib::Coordinate*>(dart.ffi::_loadIntPtr(this.{dart.ffi::Struct::_addressOf}, (#C17).{dart.core::List::[]}(dart.ffi::_abi())));
     set next(dart.ffi::Pointer<lib::Coordinate*>* #v) → void
-      return dart.ffi::_storeIntPtr(this.{dart.ffi::Struct::_addressOf}, (#C12).{dart.core::List::[]}(dart.ffi::_abi()), #v.{dart.ffi::Pointer::address});
+      return dart.ffi::_storeIntPtr(this.{dart.ffi::Struct::_addressOf}, (#C17).{dart.core::List::[]}(dart.ffi::_abi()), #v.{dart.ffi::Pointer::address});
   }
 }
 library from "org-dartlang-test:///main.dart" as main {
@@ -54,13 +55,18 @@
   #C1 = "vm:entry-point"
   #C2 = null
   #C3 = dart.core::pragma {name:#C1, options:#C2}
-  #C4 = 24
-  #C5 = 20
-  #C6 = <dart.core::int*>[#C4, #C5, #C4]
-  #C7 = 0
-  #C8 = <dart.core::int*>[#C7, #C7, #C7]
-  #C9 = 8
-  #C10 = <dart.core::int*>[#C9, #C9, #C9]
-  #C11 = 16
-  #C12 = <dart.core::int*>[#C11, #C11, #C11]
+  #C4 = "vm:ffi:struct-fields"
+  #C5 = TypeLiteralConstant(dart.ffi::Double)
+  #C6 = TypeLiteralConstant(dart.ffi::Pointer<dart.ffi::NativeType>)
+  #C7 = <dart.core::Type>[#C5, #C5, #C6]
+  #C8 = dart.core::pragma {name:#C4, options:#C7}
+  #C9 = 24
+  #C10 = 20
+  #C11 = <dart.core::int*>[#C9, #C10, #C9]
+  #C12 = 0
+  #C13 = <dart.core::int*>[#C12, #C12, #C12]
+  #C14 = 8
+  #C15 = <dart.core::int*>[#C14, #C14, #C14]
+  #C16 = 16
+  #C17 = <dart.core::int*>[#C16, #C16, #C16]
 }
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_35.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_35.yaml.world.2.expect
index 879c497..05ed4f7 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_35.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_35.yaml.world.2.expect
@@ -1,12 +1,13 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///lib.dart" as lib {
 
   import "dart:ffi";
 
   @#C3
+  @#C8
   class Coordinate extends dart.ffi::Struct {
     @#C3
-    static final field dart.core::int* #sizeOf = (#C6).{dart.core::List::[]}(dart.ffi::_abi());
+    static final field dart.core::int* #sizeOf = (#C11).{dart.core::List::[]}(dart.ffi::_abi());
     @#C3
     constructor #fromPointer(dynamic #pointer) → dynamic
       : super dart.ffi::Struct::_fromPointer(#pointer)
@@ -14,7 +15,7 @@
     static factory allocate(dart.core::double* x, dart.core::double* y, dart.ffi::Pointer<lib::Coordinate*>* next) → lib::Coordinate* {
       return null;
     }
-    abstract member-signature get _addressOf() → dart.ffi::Pointer<dart.ffi::Struct*>*; -> dart.ffi::Struct::_addressOf
+    abstract member-signature get _addressOf() → dart.core::Object*; -> dart.ffi::Struct::_addressOf
     abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
     abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
     abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
@@ -26,17 +27,17 @@
     abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
     abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
     get x() → dart.core::double*
-      return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_addressOf}, (#C8).{dart.core::List::[]}(dart.ffi::_abi()));
+      return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_addressOf}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()));
     set x(dart.core::double* #v) → void
-      return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_addressOf}, (#C8).{dart.core::List::[]}(dart.ffi::_abi()), #v);
+      return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_addressOf}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()), #v);
     get y() → dart.core::double*
-      return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_addressOf}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()));
+      return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_addressOf}, (#C15).{dart.core::List::[]}(dart.ffi::_abi()));
     set y(dart.core::double* #v) → void
-      return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_addressOf}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()), #v);
+      return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_addressOf}, (#C15).{dart.core::List::[]}(dart.ffi::_abi()), #v);
     get next() → dart.ffi::Pointer<lib::Coordinate*>*
-      return dart.ffi::_fromAddress<lib::Coordinate*>(dart.ffi::_loadIntPtr(this.{dart.ffi::Struct::_addressOf}, (#C12).{dart.core::List::[]}(dart.ffi::_abi())));
+      return dart.ffi::_fromAddress<lib::Coordinate*>(dart.ffi::_loadIntPtr(this.{dart.ffi::Struct::_addressOf}, (#C17).{dart.core::List::[]}(dart.ffi::_abi())));
     set next(dart.ffi::Pointer<lib::Coordinate*>* #v) → void
-      return dart.ffi::_storeIntPtr(this.{dart.ffi::Struct::_addressOf}, (#C12).{dart.core::List::[]}(dart.ffi::_abi()), #v.{dart.ffi::Pointer::address});
+      return dart.ffi::_storeIntPtr(this.{dart.ffi::Struct::_addressOf}, (#C17).{dart.core::List::[]}(dart.ffi::_abi()), #v.{dart.ffi::Pointer::address});
   }
 }
 library from "org-dartlang-test:///main.dart" as main {
@@ -55,13 +56,18 @@
   #C1 = "vm:entry-point"
   #C2 = null
   #C3 = dart.core::pragma {name:#C1, options:#C2}
-  #C4 = 24
-  #C5 = 20
-  #C6 = <dart.core::int*>[#C4, #C5, #C4]
-  #C7 = 0
-  #C8 = <dart.core::int*>[#C7, #C7, #C7]
-  #C9 = 8
-  #C10 = <dart.core::int*>[#C9, #C9, #C9]
-  #C11 = 16
-  #C12 = <dart.core::int*>[#C11, #C11, #C11]
+  #C4 = "vm:ffi:struct-fields"
+  #C5 = TypeLiteralConstant(dart.ffi::Double)
+  #C6 = TypeLiteralConstant(dart.ffi::Pointer<dart.ffi::NativeType>)
+  #C7 = <dart.core::Type>[#C5, #C5, #C6]
+  #C8 = dart.core::pragma {name:#C4, options:#C7}
+  #C9 = 24
+  #C10 = 20
+  #C11 = <dart.core::int*>[#C9, #C10, #C9]
+  #C12 = 0
+  #C13 = <dart.core::int*>[#C12, #C12, #C12]
+  #C14 = 8
+  #C15 = <dart.core::int*>[#C14, #C14, #C14]
+  #C16 = 16
+  #C17 = <dart.core::int*>[#C16, #C16, #C16]
 }
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_35.yaml.world.3.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_35.yaml.world.3.expect
index c31f270..b1b1bda 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_35.yaml.world.3.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_35.yaml.world.3.expect
@@ -1,12 +1,13 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///lib.dart" as lib {
 
   import "dart:ffi";
 
   @#C3
+  @#C8
   class Coordinate extends dart.ffi::Struct {
     @#C3
-    static final field dart.core::int* #sizeOf = (#C6).{dart.core::List::[]}(dart.ffi::_abi());
+    static final field dart.core::int* #sizeOf = (#C11).{dart.core::List::[]}(dart.ffi::_abi());
     @#C3
     constructor #fromPointer(dynamic #pointer) → dynamic
       : super dart.ffi::Struct::_fromPointer(#pointer)
@@ -15,7 +16,7 @@
       dart.core::print("hello");
       return null;
     }
-    abstract member-signature get _addressOf() → dart.ffi::Pointer<dart.ffi::Struct*>*; -> dart.ffi::Struct::_addressOf
+    abstract member-signature get _addressOf() → dart.core::Object*; -> dart.ffi::Struct::_addressOf
     abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
     abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
     abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
@@ -27,17 +28,17 @@
     abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
     abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
     get x() → dart.core::double*
-      return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_addressOf}, (#C8).{dart.core::List::[]}(dart.ffi::_abi()));
+      return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_addressOf}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()));
     set x(dart.core::double* #v) → void
-      return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_addressOf}, (#C8).{dart.core::List::[]}(dart.ffi::_abi()), #v);
+      return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_addressOf}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()), #v);
     get y() → dart.core::double*
-      return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_addressOf}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()));
+      return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_addressOf}, (#C15).{dart.core::List::[]}(dart.ffi::_abi()));
     set y(dart.core::double* #v) → void
-      return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_addressOf}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()), #v);
+      return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_addressOf}, (#C15).{dart.core::List::[]}(dart.ffi::_abi()), #v);
     get next() → dart.ffi::Pointer<lib::Coordinate*>*
-      return dart.ffi::_fromAddress<lib::Coordinate*>(dart.ffi::_loadIntPtr(this.{dart.ffi::Struct::_addressOf}, (#C12).{dart.core::List::[]}(dart.ffi::_abi())));
+      return dart.ffi::_fromAddress<lib::Coordinate*>(dart.ffi::_loadIntPtr(this.{dart.ffi::Struct::_addressOf}, (#C17).{dart.core::List::[]}(dart.ffi::_abi())));
     set next(dart.ffi::Pointer<lib::Coordinate*>* #v) → void
-      return dart.ffi::_storeIntPtr(this.{dart.ffi::Struct::_addressOf}, (#C12).{dart.core::List::[]}(dart.ffi::_abi()), #v.{dart.ffi::Pointer::address});
+      return dart.ffi::_storeIntPtr(this.{dart.ffi::Struct::_addressOf}, (#C17).{dart.core::List::[]}(dart.ffi::_abi()), #v.{dart.ffi::Pointer::address});
   }
 }
 library from "org-dartlang-test:///main.dart" as main {
@@ -56,13 +57,18 @@
   #C1 = "vm:entry-point"
   #C2 = null
   #C3 = dart.core::pragma {name:#C1, options:#C2}
-  #C4 = 24
-  #C5 = 20
-  #C6 = <dart.core::int*>[#C4, #C5, #C4]
-  #C7 = 0
-  #C8 = <dart.core::int*>[#C7, #C7, #C7]
-  #C9 = 8
-  #C10 = <dart.core::int*>[#C9, #C9, #C9]
-  #C11 = 16
-  #C12 = <dart.core::int*>[#C11, #C11, #C11]
+  #C4 = "vm:ffi:struct-fields"
+  #C5 = TypeLiteralConstant(dart.ffi::Double)
+  #C6 = TypeLiteralConstant(dart.ffi::Pointer<dart.ffi::NativeType>)
+  #C7 = <dart.core::Type>[#C5, #C5, #C6]
+  #C8 = dart.core::pragma {name:#C4, options:#C7}
+  #C9 = 24
+  #C10 = 20
+  #C11 = <dart.core::int*>[#C9, #C10, #C9]
+  #C12 = 0
+  #C13 = <dart.core::int*>[#C12, #C12, #C12]
+  #C14 = 8
+  #C15 = <dart.core::int*>[#C14, #C14, #C14]
+  #C16 = 16
+  #C17 = <dart.core::int*>[#C16, #C16, #C16]
 }
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_40.yaml b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_40.yaml
new file mode 100644
index 0000000..df6b22b
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_40.yaml
@@ -0,0 +1,80 @@
+# 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.md file.
+
+# Compile an application, change a file, but don't change the outline.
+# Mixin something from the same file.
+
+type: newworld
+worlds:
+  - entry: main.dart
+    experiments: alternative-invalidation-strategy
+    sources:
+      lib1.dart: |
+        import 'main.dart';
+        extension Extension1 on A {
+          baz() => 42;
+        }
+      lib2.dart: |
+        import 'main.dart';
+        import 'lib1.dart';
+        export 'main.dart';
+        export 'lib1.dart';
+        method(A a) {
+          a.baz();
+          a.boz();
+        }
+      main.dart: |
+        import 'lib1.dart';
+        import 'lib2.dart';
+        class A {
+          foo() {}
+        }
+        main() {
+          method(new A());
+        }
+        extension Extension2 on A {
+          boz() => 87;
+        }
+    expectedLibraryCount: 3
+  - entry: main.dart
+    experiments: alternative-invalidation-strategy
+    worldType: updated
+    expectInitializeFromDill: false
+    invalidate:
+      - lib2.dart
+    sources:
+      lib2.dart: |
+        import 'main.dart';
+        import 'lib1.dart';
+        export 'main.dart';
+        export 'lib1.dart';
+        method(A a) {
+          a.baz();
+          a.boz();
+          a.baz();
+        }
+    expectedLibraryCount: 3
+    expectsRebuildBodiesOnly: true
+  - entry: main.dart
+    experiments: alternative-invalidation-strategy
+    worldType: updated
+    expectInitializeFromDill: false
+    invalidate:
+      - main.dart
+    sources:
+      main.dart: |
+        import 'lib1.dart';
+        import 'lib2.dart';
+        class A {
+          foo() {}
+        }
+        main() {
+          method(new A());
+        }
+        extension Extension2 on A {
+          boz() => 123;
+        }
+    expectedLibraryCount: 3
+    expectsRebuildBodiesOnly: true
+
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_40.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_40.yaml.world.1.expect
new file mode 100644
index 0000000..7c7bff1
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_40.yaml.world.1.expect
@@ -0,0 +1,63 @@
+main = main::main;
+library from "org-dartlang-test:///lib1.dart" as lib1 {
+
+  import "org-dartlang-test:///main.dart";
+
+  extension Extension1 on main::A* {
+    method baz = lib1::Extension1|baz;
+    tearoff baz = lib1::Extension1|get#baz;
+  }
+  static method Extension1|baz(final main::A* #this) → dynamic
+    return 42;
+  static method Extension1|get#baz(final main::A* #this) → () →* dynamic
+    return () → dynamic => lib1::Extension1|baz(#this);
+}
+library from "org-dartlang-test:///lib2.dart" as lib2 {
+additionalExports = (lib1::Extension1,
+  main::main,
+  main::A,
+  main::Extension2)
+
+  import "org-dartlang-test:///main.dart";
+  import "org-dartlang-test:///lib1.dart";
+  export "org-dartlang-test:///main.dart";
+  export "org-dartlang-test:///lib1.dart";
+
+  static method method(main::A* a) → dynamic {
+    lib1::Extension1|baz(a);
+    main::Extension2|boz(a);
+  }
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///lib1.dart";
+  import "org-dartlang-test:///lib2.dart";
+
+  class A extends dart.core::Object {
+    synthetic constructor •() → main::A*
+      : super dart.core::Object::•()
+      ;
+    method foo() → dynamic {}
+    abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
+    abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
+    abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
+    abstract member-signature method _simpleInstanceOfTrue(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfTrue
+    abstract member-signature method _simpleInstanceOfFalse(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfFalse
+    abstract member-signature operator ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
+    abstract member-signature get hashCode() → dart.core::int*; -> dart.core::Object::hashCode
+    abstract member-signature method toString() → dart.core::String*; -> dart.core::Object::toString
+    abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
+    abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
+  }
+  extension Extension2 on main::A* {
+    method boz = main::Extension2|boz;
+    tearoff boz = main::Extension2|get#boz;
+  }
+  static method main() → dynamic {
+    lib2::method(new main::A::•());
+  }
+  static method Extension2|boz(final main::A* #this) → dynamic
+    return 87;
+  static method Extension2|get#boz(final main::A* #this) → () →* dynamic
+    return () → dynamic => main::Extension2|boz(#this);
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_40.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_40.yaml.world.2.expect
new file mode 100644
index 0000000..3b56dcd
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_40.yaml.world.2.expect
@@ -0,0 +1,64 @@
+main = main::main;
+library from "org-dartlang-test:///lib1.dart" as lib1 {
+
+  import "org-dartlang-test:///main.dart";
+
+  extension Extension1 on main::A* {
+    method baz = lib1::Extension1|baz;
+    tearoff baz = lib1::Extension1|get#baz;
+  }
+  static method Extension1|baz(final main::A* #this) → dynamic
+    return 42;
+  static method Extension1|get#baz(final main::A* #this) → () →* dynamic
+    return () → dynamic => lib1::Extension1|baz(#this);
+}
+library from "org-dartlang-test:///lib2.dart" as lib2 {
+additionalExports = (lib1::Extension1,
+  main::main,
+  main::A,
+  main::Extension2)
+
+  import "org-dartlang-test:///main.dart";
+  import "org-dartlang-test:///lib1.dart";
+  export "org-dartlang-test:///main.dart";
+  export "org-dartlang-test:///lib1.dart";
+
+  static method method(main::A* a) → dynamic {
+    lib1::Extension1|baz(a);
+    main::Extension2|boz(a);
+    lib1::Extension1|baz(a);
+  }
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///lib1.dart";
+  import "org-dartlang-test:///lib2.dart";
+
+  class A extends dart.core::Object {
+    synthetic constructor •() → main::A*
+      : super dart.core::Object::•()
+      ;
+    method foo() → dynamic {}
+    abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
+    abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
+    abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
+    abstract member-signature method _simpleInstanceOfTrue(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfTrue
+    abstract member-signature method _simpleInstanceOfFalse(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfFalse
+    abstract member-signature operator ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
+    abstract member-signature get hashCode() → dart.core::int*; -> dart.core::Object::hashCode
+    abstract member-signature method toString() → dart.core::String*; -> dart.core::Object::toString
+    abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
+    abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
+  }
+  extension Extension2 on main::A* {
+    method boz = main::Extension2|boz;
+    tearoff boz = main::Extension2|get#boz;
+  }
+  static method main() → dynamic {
+    lib2::method(new main::A::•());
+  }
+  static method Extension2|boz(final main::A* #this) → dynamic
+    return 87;
+  static method Extension2|get#boz(final main::A* #this) → () →* dynamic
+    return () → dynamic => main::Extension2|boz(#this);
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_40.yaml.world.3.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_40.yaml.world.3.expect
new file mode 100644
index 0000000..0958b1c
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_40.yaml.world.3.expect
@@ -0,0 +1,64 @@
+main = main::main;
+library from "org-dartlang-test:///lib1.dart" as lib1 {
+
+  import "org-dartlang-test:///main.dart";
+
+  extension Extension1 on main::A* {
+    method baz = lib1::Extension1|baz;
+    tearoff baz = lib1::Extension1|get#baz;
+  }
+  static method Extension1|baz(final main::A* #this) → dynamic
+    return 42;
+  static method Extension1|get#baz(final main::A* #this) → () →* dynamic
+    return () → dynamic => lib1::Extension1|baz(#this);
+}
+library from "org-dartlang-test:///lib2.dart" as lib2 {
+additionalExports = (lib1::Extension1,
+  main::main,
+  main::A,
+  main::Extension2)
+
+  import "org-dartlang-test:///main.dart";
+  import "org-dartlang-test:///lib1.dart";
+  export "org-dartlang-test:///main.dart";
+  export "org-dartlang-test:///lib1.dart";
+
+  static method method(main::A* a) → dynamic {
+    lib1::Extension1|baz(a);
+    main::Extension2|boz(a);
+    lib1::Extension1|baz(a);
+  }
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///lib1.dart";
+  import "org-dartlang-test:///lib2.dart";
+
+  class A extends dart.core::Object {
+    synthetic constructor •() → main::A*
+      : super dart.core::Object::•()
+      ;
+    method foo() → dynamic {}
+    abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
+    abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
+    abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
+    abstract member-signature method _simpleInstanceOfTrue(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfTrue
+    abstract member-signature method _simpleInstanceOfFalse(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfFalse
+    abstract member-signature operator ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
+    abstract member-signature get hashCode() → dart.core::int*; -> dart.core::Object::hashCode
+    abstract member-signature method toString() → dart.core::String*; -> dart.core::Object::toString
+    abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
+    abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
+  }
+  extension Extension2 on main::A* {
+    method boz = main::Extension2|boz;
+    tearoff boz = main::Extension2|get#boz;
+  }
+  static method main() → dynamic {
+    lib2::method(new main::A::•());
+  }
+  static method Extension2|boz(final main::A* #this) → dynamic
+    return 123;
+  static method Extension2|get#boz(final main::A* #this) → () →* dynamic
+    return () → dynamic => main::Extension2|boz(#this);
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_41.yaml b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_41.yaml
new file mode 100644
index 0000000..48225c0
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_41.yaml
@@ -0,0 +1,54 @@
+# 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.md file.
+
+# Compile an application, change a file, but don't change the outline.
+# Mixin something from the same file.
+
+type: newworld
+forceLateLoweringForTesting: true
+worlds:
+  - entry: main.dart
+    experiments: non-nullable,alternative-invalidation-strategy
+    sources:
+      lib1.dart: |
+        late int field;
+        method() {
+          print('foo');
+        }
+      lib2.dart: |
+        export 'lib1.dart';
+      main.dart: |
+        import 'lib2.dart';
+        main() {
+          field = 42;
+        }
+    expectedLibraryCount: 3
+  - entry: main.dart
+    experiments: alternative-invalidation-strategy
+    worldType: updated
+    expectInitializeFromDill: false
+    invalidate:
+      - main.dart
+    sources:
+      main.dart: |
+        import 'lib2.dart';
+        main() {
+          field = 87;
+        }
+    expectedLibraryCount: 3
+    expectsRebuildBodiesOnly: true
+  - entry: main.dart
+    experiments: alternative-invalidation-strategy
+    worldType: updated
+    expectInitializeFromDill: false
+    invalidate:
+      - lib1.dart
+    sources:
+      lib1.dart: |
+        late int field;
+        method() {
+          print('bar');
+        }
+    expectedLibraryCount: 3
+    expectsRebuildBodiesOnly: true
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_41.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_41.yaml.world.1.expect
new file mode 100644
index 0000000..bfa9c36
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_41.yaml.world.1.expect
@@ -0,0 +1,31 @@
+main = main::main;
+library from "org-dartlang-test:///lib1.dart" as lib1 {
+
+  static field dart.core::int? _#field = null;
+  static field dart.core::bool _#field#isSet = false;
+  static get field() → dart.core::int
+    return lib1::_#field#isSet ?{dart.core::int} let final dart.core::int? #t1 = lib1::_#field in #t1{dart.core::int} : throw new dart._internal::LateError::fieldNI("field");
+  static set field(dart.core::int #t2) → void {
+    lib1::_#field#isSet = true;
+    lib1::_#field = #t2;
+  }
+  static method method() → dynamic {
+    dart.core::print("foo");
+  }
+}
+library from "org-dartlang-test:///lib2.dart" as lib2 {
+additionalExports = (lib1::field,
+  lib1::method,
+  lib1::field)
+
+  export "org-dartlang-test:///lib1.dart";
+
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///lib2.dart";
+
+  static method main() → dynamic {
+    lib1::field = 42;
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_41.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_41.yaml.world.2.expect
new file mode 100644
index 0000000..20aeb39
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_41.yaml.world.2.expect
@@ -0,0 +1,31 @@
+main = main::main;
+library from "org-dartlang-test:///lib1.dart" as lib1 {
+
+  static field dart.core::int? _#field = null;
+  static field dart.core::bool _#field#isSet = false;
+  static get field() → dart.core::int
+    return lib1::_#field#isSet ?{dart.core::int} let final dart.core::int? #t1 = lib1::_#field in #t1{dart.core::int} : throw new dart._internal::LateError::fieldNI("field");
+  static set field(dart.core::int #t2) → void {
+    lib1::_#field#isSet = true;
+    lib1::_#field = #t2;
+  }
+  static method method() → dynamic {
+    dart.core::print("foo");
+  }
+}
+library from "org-dartlang-test:///lib2.dart" as lib2 {
+additionalExports = (lib1::field,
+  lib1::method,
+  lib1::field)
+
+  export "org-dartlang-test:///lib1.dart";
+
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///lib2.dart";
+
+  static method main() → dynamic {
+    lib1::field = 87;
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_41.yaml.world.3.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_41.yaml.world.3.expect
new file mode 100644
index 0000000..c5f9982
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_41.yaml.world.3.expect
@@ -0,0 +1,31 @@
+main = main::main;
+library from "org-dartlang-test:///lib1.dart" as lib1 {
+
+  static field dart.core::int? _#field = null;
+  static field dart.core::bool _#field#isSet = false;
+  static get field() → dart.core::int
+    return lib1::_#field#isSet ?{dart.core::int} let final dart.core::int? #t1 = lib1::_#field in #t1{dart.core::int} : throw new dart._internal::LateError::fieldNI("field");
+  static set field(dart.core::int #t2) → void {
+    lib1::_#field#isSet = true;
+    lib1::_#field = #t2;
+  }
+  static method method() → dynamic {
+    dart.core::print("bar");
+  }
+}
+library from "org-dartlang-test:///lib2.dart" as lib2 {
+additionalExports = (lib1::field,
+  lib1::method,
+  lib1::field)
+
+  export "org-dartlang-test:///lib1.dart";
+
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///lib2.dart";
+
+  static method main() → dynamic {
+    lib1::field = 87;
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_42.yaml b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_42.yaml
new file mode 100644
index 0000000..cd88790
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_42.yaml
@@ -0,0 +1,67 @@
+# 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.md file.
+
+# Compile an application, change a file, but don't change the outline.
+# Mixin something from the same file.
+
+type: newworld
+forceLateLoweringForTesting: true
+worlds:
+  - entry: main.dart
+    experiments: non-nullable,alternative-invalidation-strategy
+    sources:
+      lib1.dart: |
+        void set property(int value) {}
+      lib2.dart: |
+        int get property => 87;
+      lib3.dart: |
+        export 'lib1.dart';
+        export 'lib2.dart';
+      main.dart: |
+        import 'lib3.dart';
+        main() {
+          property = 42;
+        }
+    expectedLibraryCount: 4
+  - entry: main.dart
+    experiments: alternative-invalidation-strategy
+    worldType: updated
+    expectInitializeFromDill: false
+    invalidate:
+      - main.dart
+    sources:
+      main.dart: |
+        import 'lib3.dart';
+        main() {
+          property = 87;
+        }
+    expectedLibraryCount: 4
+    expectsRebuildBodiesOnly: true
+  - entry: main.dart
+    experiments: alternative-invalidation-strategy
+    worldType: updated
+    expectInitializeFromDill: false
+    invalidate:
+      - lib1.dart
+    sources:
+      lib1.dart: |
+        void set property(int value) {
+          print(123);
+        }
+    expectedLibraryCount: 4
+    expectsRebuildBodiesOnly: true
+  - entry: main.dart
+    experiments: alternative-invalidation-strategy
+    worldType: updated
+    expectInitializeFromDill: false
+    invalidate:
+      - main.dart
+    sources:
+      main.dart: |
+        import 'lib3.dart';
+        main() {
+          property = property;
+        }
+    expectedLibraryCount: 4
+    expectsRebuildBodiesOnly: true
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_42.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_42.yaml.world.1.expect
new file mode 100644
index 0000000..24a8d4b
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_42.yaml.world.1.expect
@@ -0,0 +1,26 @@
+main = main::main;
+library from "org-dartlang-test:///lib1.dart" as lib1 {
+
+  static set property(dart.core::int value) → void {}
+}
+library from "org-dartlang-test:///lib2.dart" as lib2 {
+
+  static get property() → dart.core::int
+    return 87;
+}
+library from "org-dartlang-test:///lib3.dart" as lib3 {
+additionalExports = (lib1::property,
+  lib2::property)
+
+  export "org-dartlang-test:///lib1.dart";
+  export "org-dartlang-test:///lib2.dart";
+
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///lib3.dart";
+
+  static method main() → dynamic {
+    lib1::property = 42;
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_42.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_42.yaml.world.2.expect
new file mode 100644
index 0000000..6e7a633
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_42.yaml.world.2.expect
@@ -0,0 +1,26 @@
+main = main::main;
+library from "org-dartlang-test:///lib1.dart" as lib1 {
+
+  static set property(dart.core::int value) → void {}
+}
+library from "org-dartlang-test:///lib2.dart" as lib2 {
+
+  static get property() → dart.core::int
+    return 87;
+}
+library from "org-dartlang-test:///lib3.dart" as lib3 {
+additionalExports = (lib1::property,
+  lib2::property)
+
+  export "org-dartlang-test:///lib1.dart";
+  export "org-dartlang-test:///lib2.dart";
+
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///lib3.dart";
+
+  static method main() → dynamic {
+    lib1::property = 87;
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_42.yaml.world.3.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_42.yaml.world.3.expect
new file mode 100644
index 0000000..d53cedb
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_42.yaml.world.3.expect
@@ -0,0 +1,28 @@
+main = main::main;
+library from "org-dartlang-test:///lib1.dart" as lib1 {
+
+  static set property(dart.core::int value) → void {
+    dart.core::print(123);
+  }
+}
+library from "org-dartlang-test:///lib2.dart" as lib2 {
+
+  static get property() → dart.core::int
+    return 87;
+}
+library from "org-dartlang-test:///lib3.dart" as lib3 {
+additionalExports = (lib1::property,
+  lib2::property)
+
+  export "org-dartlang-test:///lib1.dart";
+  export "org-dartlang-test:///lib2.dart";
+
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///lib3.dart";
+
+  static method main() → dynamic {
+    lib1::property = 87;
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_42.yaml.world.4.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_42.yaml.world.4.expect
new file mode 100644
index 0000000..10e63b3
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_42.yaml.world.4.expect
@@ -0,0 +1,28 @@
+main = main::main;
+library from "org-dartlang-test:///lib1.dart" as lib1 {
+
+  static set property(dart.core::int value) → void {
+    dart.core::print(123);
+  }
+}
+library from "org-dartlang-test:///lib2.dart" as lib2 {
+
+  static get property() → dart.core::int
+    return 87;
+}
+library from "org-dartlang-test:///lib3.dart" as lib3 {
+additionalExports = (lib1::property,
+  lib2::property)
+
+  export "org-dartlang-test:///lib1.dart";
+  export "org-dartlang-test:///lib2.dart";
+
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///lib3.dart";
+
+  static method main() → dynamic {
+    lib1::property = lib2::property;
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_43.yaml b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_43.yaml
new file mode 100644
index 0000000..8fb3d4f
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_43.yaml
@@ -0,0 +1,58 @@
+# Copyright (c) 2020, 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.md file.
+
+# A field has 2 references. Both should be passed when creating a new field
+# for references to both set and get to work. And both should be put in the
+# `buildersCreatedWithReferences` map so - when lazy-loading a dill library
+# with additional exports to a library that we're currently recompiling
+# those will get setup correctly too.
+
+type: newworld
+worlds:
+  - entry: main.dart
+    experiments: alternative-invalidation-strategy
+    sources:
+      main.dart: |
+        import 'libExporter.dart';
+        void foo() {
+          int value = libField;
+          libField = value+1;
+        }
+      libExporter.dart: |
+        export "lib.dart";
+        String fromLibExporter = "hello";
+      lib.dart: |
+        import "libExporter.dart";
+        int libField = 42;
+        void requireStuffFromLibExporter() {
+          print(fromLibExporter);
+        }
+    expectedLibraryCount: 3
+
+  - entry: main.dart
+    experiments: alternative-invalidation-strategy
+    worldType: updated
+    expectInitializeFromDill: false
+    invalidate:
+      - lib.dart
+    expectedLibraryCount: 3
+    expectsRebuildBodiesOnly: true
+
+  - entry: main.dart
+    experiments: alternative-invalidation-strategy
+    worldType: updated
+    expectInitializeFromDill: false
+    invalidate:
+      - libExporter.dart
+    expectedLibraryCount: 3
+    expectsRebuildBodiesOnly: true
+
+  - entry: main.dart
+    experiments: alternative-invalidation-strategy
+    worldType: updated
+    expectInitializeFromDill: false
+    invalidate:
+      - main.dart
+    expectedLibraryCount: 3
+    expectsRebuildBodiesOnly: true
\ No newline at end of file
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_43.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_43.yaml.world.1.expect
new file mode 100644
index 0000000..cc2970c
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_43.yaml.world.1.expect
@@ -0,0 +1,28 @@
+main = <No Member>;
+library from "org-dartlang-test:///lib.dart" as lib {
+
+  import "org-dartlang-test:///libExporter.dart";
+
+  static field dart.core::int* libField = 42;
+  static method requireStuffFromLibExporter() → void {
+    dart.core::print(lib2::fromLibExporter);
+  }
+}
+library from "org-dartlang-test:///libExporter.dart" as lib2 {
+additionalExports = (lib::libField,
+  lib::libField,
+  lib::requireStuffFromLibExporter)
+
+  export "org-dartlang-test:///lib.dart";
+
+  static field dart.core::String* fromLibExporter = "hello";
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///libExporter.dart";
+
+  static method foo() → void {
+    dart.core::int* value = lib::libField;
+    lib::libField = value.{dart.core::num::+}(1);
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_43.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_43.yaml.world.2.expect
new file mode 100644
index 0000000..cc2970c
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_43.yaml.world.2.expect
@@ -0,0 +1,28 @@
+main = <No Member>;
+library from "org-dartlang-test:///lib.dart" as lib {
+
+  import "org-dartlang-test:///libExporter.dart";
+
+  static field dart.core::int* libField = 42;
+  static method requireStuffFromLibExporter() → void {
+    dart.core::print(lib2::fromLibExporter);
+  }
+}
+library from "org-dartlang-test:///libExporter.dart" as lib2 {
+additionalExports = (lib::libField,
+  lib::libField,
+  lib::requireStuffFromLibExporter)
+
+  export "org-dartlang-test:///lib.dart";
+
+  static field dart.core::String* fromLibExporter = "hello";
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///libExporter.dart";
+
+  static method foo() → void {
+    dart.core::int* value = lib::libField;
+    lib::libField = value.{dart.core::num::+}(1);
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_43.yaml.world.3.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_43.yaml.world.3.expect
new file mode 100644
index 0000000..cc2970c
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_43.yaml.world.3.expect
@@ -0,0 +1,28 @@
+main = <No Member>;
+library from "org-dartlang-test:///lib.dart" as lib {
+
+  import "org-dartlang-test:///libExporter.dart";
+
+  static field dart.core::int* libField = 42;
+  static method requireStuffFromLibExporter() → void {
+    dart.core::print(lib2::fromLibExporter);
+  }
+}
+library from "org-dartlang-test:///libExporter.dart" as lib2 {
+additionalExports = (lib::libField,
+  lib::libField,
+  lib::requireStuffFromLibExporter)
+
+  export "org-dartlang-test:///lib.dart";
+
+  static field dart.core::String* fromLibExporter = "hello";
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///libExporter.dart";
+
+  static method foo() → void {
+    dart.core::int* value = lib::libField;
+    lib::libField = value.{dart.core::num::+}(1);
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_43.yaml.world.4.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_43.yaml.world.4.expect
new file mode 100644
index 0000000..cc2970c
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_43.yaml.world.4.expect
@@ -0,0 +1,28 @@
+main = <No Member>;
+library from "org-dartlang-test:///lib.dart" as lib {
+
+  import "org-dartlang-test:///libExporter.dart";
+
+  static field dart.core::int* libField = 42;
+  static method requireStuffFromLibExporter() → void {
+    dart.core::print(lib2::fromLibExporter);
+  }
+}
+library from "org-dartlang-test:///libExporter.dart" as lib2 {
+additionalExports = (lib::libField,
+  lib::libField,
+  lib::requireStuffFromLibExporter)
+
+  export "org-dartlang-test:///lib.dart";
+
+  static field dart.core::String* fromLibExporter = "hello";
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "org-dartlang-test:///libExporter.dart";
+
+  static method foo() → void {
+    dart.core::int* value = lib::libField;
+    lib::libField = value.{dart.core::num::+}(1);
+  }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_5.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_5.yaml.world.1.expect
index 8ef0906..e8c7c9a 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_5.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_5.yaml.world.1.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///main.dart" as main {
 
   part myPart.dart;
@@ -20,7 +20,8 @@
     abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
   }
   static method main() → dynamic /* originally async */ {
-    final dart.async::_AsyncAwaitCompleter<dynamic>* :async_completer = new dart.async::_AsyncAwaitCompleter::•<dynamic>();
+    final dart.async::_Future<dynamic>* :async_future = new dart.async::_Future::•<dynamic>();
+    dart.core::bool* :is_sync = false;
     FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -36,20 +37,22 @@
           :result;
           dart.core::print(#C2);
         }
-        dart.async::_completeOnAsyncReturn(:async_completer, :return_value);
+        dart.async::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, dart.core::StackTrace* stack_trace) {
-        :async_completer.{dart.async::Completer::completeError}(exception, stack_trace);
+        dart.async::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = dart.async::_asyncStackTraceHelper(:async_op);
     :async_op_then = dart.async::_asyncThenWrapperHelper(:async_op);
     :async_op_error = dart.async::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{dart.async::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{dart.async::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   }
   static method /* from org-dartlang-test:///myPart.dart */ whatever() → dynamic /* originally async */ {
-    final dart.async::_AsyncAwaitCompleter<dynamic>* :async_completer = new dart.async::_AsyncAwaitCompleter::•<dynamic>();
+    final dart.async::_Future<dynamic>* :async_future = new dart.async::_Future::•<dynamic>();
+    dart.core::bool* :is_sync = false;
     FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -62,21 +65,22 @@
         #L2:
         {
           [yield] let dynamic #t2 = dart.async::_awaitHelper(null, :async_op_then, :async_op_error, :async_op) in null;
-          dart._internal::unsafeCast<dart.core::Null?>(:result);
+          dart._internal::unsafeCast<Null>(:result);
           :return_value = "hello";
           break #L2;
         }
-        dart.async::_completeOnAsyncReturn(:async_completer, :return_value);
+        dart.async::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, dart.core::StackTrace* stack_trace) {
-        :async_completer.{dart.async::Completer::completeError}(exception, stack_trace);
+        dart.async::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = dart.async::_asyncStackTraceHelper(:async_op);
     :async_op_then = dart.async::_asyncThenWrapperHelper(:async_op);
     :async_op_error = dart.async::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{dart.async::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{dart.async::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   }
 }
 constants  {
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_5.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_5.yaml.world.2.expect
index 0c459db..af9c5da 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_5.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_5.yaml.world.2.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///main.dart" as main {
 
   part myPart.dart;
@@ -20,7 +20,8 @@
     abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
   }
   static method main() → dynamic /* originally async */ {
-    final dart.async::_AsyncAwaitCompleter<dynamic>* :async_completer = new dart.async::_AsyncAwaitCompleter::•<dynamic>();
+    final dart.async::_Future<dynamic>* :async_future = new dart.async::_Future::•<dynamic>();
+    dart.core::bool* :is_sync = false;
     FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -36,20 +37,22 @@
           :result;
           dart.core::print(#C2);
         }
-        dart.async::_completeOnAsyncReturn(:async_completer, :return_value);
+        dart.async::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, dart.core::StackTrace* stack_trace) {
-        :async_completer.{dart.async::Completer::completeError}(exception, stack_trace);
+        dart.async::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = dart.async::_asyncStackTraceHelper(:async_op);
     :async_op_then = dart.async::_asyncThenWrapperHelper(:async_op);
     :async_op_error = dart.async::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{dart.async::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{dart.async::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   }
   static method /* from org-dartlang-test:///myPart.dart */ whatever() → dynamic /* originally async */ {
-    final dart.async::_AsyncAwaitCompleter<dynamic>* :async_completer = new dart.async::_AsyncAwaitCompleter::•<dynamic>();
+    final dart.async::_Future<dynamic>* :async_future = new dart.async::_Future::•<dynamic>();
+    dart.core::bool* :is_sync = false;
     FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -62,21 +65,22 @@
         #L2:
         {
           [yield] let dynamic #t2 = dart.async::_awaitHelper(null, :async_op_then, :async_op_error, :async_op) in null;
-          dart._internal::unsafeCast<dart.core::Null?>(:result);
+          dart._internal::unsafeCast<Null>(:result);
           :return_value = "hello!!!";
           break #L2;
         }
-        dart.async::_completeOnAsyncReturn(:async_completer, :return_value);
+        dart.async::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, dart.core::StackTrace* stack_trace) {
-        :async_completer.{dart.async::Completer::completeError}(exception, stack_trace);
+        dart.async::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = dart.async::_asyncStackTraceHelper(:async_op);
     :async_op_then = dart.async::_asyncThenWrapperHelper(:async_op);
     :async_op_error = dart.async::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{dart.async::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{dart.async::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   }
 }
 constants  {
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_5.yaml.world.3.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_5.yaml.world.3.expect
index 9e8f42a..abf2025 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_5.yaml.world.3.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_5.yaml.world.3.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///main.dart" as main {
 
   part myPart.dart;
@@ -20,7 +20,8 @@
     abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
   }
   static method main() → dynamic /* originally async */ {
-    final dart.async::_AsyncAwaitCompleter<dynamic>* :async_completer = new dart.async::_AsyncAwaitCompleter::•<dynamic>();
+    final dart.async::_Future<dynamic>* :async_future = new dart.async::_Future::•<dynamic>();
+    dart.core::bool* :is_sync = false;
     FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -37,20 +38,22 @@
           dart.core::print(#C2);
           dart.core::print("Done!");
         }
-        dart.async::_completeOnAsyncReturn(:async_completer, :return_value);
+        dart.async::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, dart.core::StackTrace* stack_trace) {
-        :async_completer.{dart.async::Completer::completeError}(exception, stack_trace);
+        dart.async::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = dart.async::_asyncStackTraceHelper(:async_op);
     :async_op_then = dart.async::_asyncThenWrapperHelper(:async_op);
     :async_op_error = dart.async::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{dart.async::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{dart.async::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   }
   static method /* from org-dartlang-test:///myPart.dart */ whatever() → dynamic /* originally async */ {
-    final dart.async::_AsyncAwaitCompleter<dynamic>* :async_completer = new dart.async::_AsyncAwaitCompleter::•<dynamic>();
+    final dart.async::_Future<dynamic>* :async_future = new dart.async::_Future::•<dynamic>();
+    dart.core::bool* :is_sync = false;
     FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -63,21 +66,22 @@
         #L2:
         {
           [yield] let dynamic #t2 = dart.async::_awaitHelper(null, :async_op_then, :async_op_error, :async_op) in null;
-          dart._internal::unsafeCast<dart.core::Null?>(:result);
+          dart._internal::unsafeCast<Null>(:result);
           :return_value = "hello!!!";
           break #L2;
         }
-        dart.async::_completeOnAsyncReturn(:async_completer, :return_value);
+        dart.async::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, dart.core::StackTrace* stack_trace) {
-        :async_completer.{dart.async::Completer::completeError}(exception, stack_trace);
+        dart.async::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = dart.async::_asyncStackTraceHelper(:async_op);
     :async_op_then = dart.async::_asyncThenWrapperHelper(:async_op);
     :async_op_error = dart.async::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{dart.async::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{dart.async::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   }
 }
 constants  {
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_6.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_6.yaml.world.1.expect
index 6ef80fe..9091dbc 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_6.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_6.yaml.world.1.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///libA.dart" as libA {
 
   import "org-dartlang-test:///main.dart";
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_6.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_6.yaml.world.2.expect
index edb6241..f6720c8 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_6.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_6.yaml.world.2.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///libA.dart" as libA {
 
   import "org-dartlang-test:///main.dart";
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_6.yaml.world.3.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_6.yaml.world.3.expect
index 13a7716..f8e3bb3 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_6.yaml.world.3.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_6.yaml.world.3.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///libA.dart" as libA {
 
   import "org-dartlang-test:///main.dart";
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_7.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_7.yaml.world.1.expect
index 4ef6430..9514f9c 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_7.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_7.yaml.world.1.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///libA.dart" as libA {
 
   import "org-dartlang-test:///main.dart";
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_7.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_7.yaml.world.2.expect
index 4ef6430..9514f9c 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_7.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_7.yaml.world.2.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///libA.dart" as libA {
 
   import "org-dartlang-test:///main.dart";
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_8.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_8.yaml.world.1.expect
index 49f3e27..4871eff 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_8.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_8.yaml.world.1.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///main.dart" as main {
 
   class Foo extends dart.core::Object {
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_8.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_8.yaml.world.2.expect
index 0a4ed60..6de6baf 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_8.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_8.yaml.world.2.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///main.dart" as main {
 
   class Foo extends dart.core::Object {
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_9.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_9.yaml.world.1.expect
index 81f2672..29af040 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_9.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_9.yaml.world.1.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///lib.dart" as lib {
 
   part libpart.dart;
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_9.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_9.yaml.world.2.expect
index eb49048..65aedb7 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_9.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_9.yaml.world.2.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///lib.dart" as lib {
 
   part libpart.dart;
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/omit_platform_works_1.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/omit_platform_works_1.yaml.world.1.expect
index 7efd651..3d6222e 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/omit_platform_works_1.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/omit_platform_works_1.yaml.world.1.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///main.dart" as main {
 
   static method main() → dynamic {
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/omit_platform_works_1.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/omit_platform_works_1.yaml.world.2.expect
index ff56e2e..3b84e5d 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/omit_platform_works_1.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/omit_platform_works_1.yaml.world.2.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///main.dart" as main {
 
   static method main() → dynamic {
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/omit_platform_works_2.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/omit_platform_works_2.yaml.world.1.expect
index 7efd651..3d6222e 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/omit_platform_works_2.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/omit_platform_works_2.yaml.world.1.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///main.dart" as main {
 
   static method main() → dynamic {
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/omit_platform_works_2.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/omit_platform_works_2.yaml.world.2.expect
index ff56e2e..3b84e5d 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/omit_platform_works_2.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/omit_platform_works_2.yaml.world.2.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///main.dart" as main {
 
   static method main() → dynamic {
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/omit_platform_works_3.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/omit_platform_works_3.yaml.world.1.expect
index 6c58888..aa1db3e 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/omit_platform_works_3.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/omit_platform_works_3.yaml.world.1.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///main.dart" as main {
 
   static method main() → dynamic {
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/omit_platform_works_3.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/omit_platform_works_3.yaml.world.2.expect
index 98d8a29..8615250 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/omit_platform_works_3.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/omit_platform_works_3.yaml.world.2.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///lib.dart" as lib {
 
   static method lib() → dynamic {
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/omit_platform_works_3.yaml.world.3.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/omit_platform_works_3.yaml.world.3.expect
index ad8c78c..eb9a3f3 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/omit_platform_works_3.yaml.world.3.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/omit_platform_works_3.yaml.world.3.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///main.dart" as main {
 
   import "org-dartlang-test:///lib.dart";
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/omit_platform_works_3.yaml.world.4.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/omit_platform_works_3.yaml.world.4.expect
index ee707d8..c0b1b18 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/omit_platform_works_3.yaml.world.4.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/omit_platform_works_3.yaml.world.4.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///lib.dart" as lib {
 
   static method lib() → dynamic {
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/omit_platform_works_3.yaml.world.5.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/omit_platform_works_3.yaml.world.5.expect
index b397a3b..6afed6a 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/omit_platform_works_3.yaml.world.5.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/omit_platform_works_3.yaml.world.5.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///lib.dart" as lib {
 
   static method lib() → dynamic {
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/outline_only.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/outline_only.yaml.world.1.expect
index 112da80..7c503e8 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/outline_only.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/outline_only.yaml.world.1.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///main.dart" as main {
 
   static method main() → dynamic
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/regress_35215.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/regress_35215.yaml.world.1.expect
index 7b14759..a4a6372 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/regress_35215.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/regress_35215.yaml.world.1.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///b.dart" as b {
 
   static method b({dart.core::int* named = #C1}) → dynamic {
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/regress_35215.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/regress_35215.yaml.world.2.expect
index c214ed4..355f0aa 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/regress_35215.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/regress_35215.yaml.world.2.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///b.dart" as b {
 
   static method b({dart.core::int* named = #C1}) → dynamic {
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_10.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_10.yaml.world.1.expect
index 495f313..72e701a 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_10.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_10.yaml.world.1.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///lib.dart" as lib {
 
   class Foo extends dart.core::Object /*hasConstConstructor*/  {
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_10.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_10.yaml.world.2.expect
index d5f5815..678510c 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_10.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_10.yaml.world.2.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///lib.dart" as lib {
 
   class Foo extends dart.core::Object /*hasConstConstructor*/  {
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_10.yaml.world.3.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_10.yaml.world.3.expect
index b78ad6f..1f5c8b7 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_10.yaml.world.3.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_10.yaml.world.3.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///lib.dart" as lib {
 
   class Foo extends dart.core::Object /*hasConstConstructor*/  {
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_10.yaml.world.4.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_10.yaml.world.4.expect
index b991c2c..989f313 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_10.yaml.world.4.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_10.yaml.world.4.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///lib.dart" as lib {
 
   class Foo extends dart.core::Object /*hasConstConstructor*/  {
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_10.yaml.world.5.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_10.yaml.world.5.expect
index aaab7d3..28f7969 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_10.yaml.world.5.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_10.yaml.world.5.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///lib.dart" as lib {
 
   class Foo extends dart.core::Object /*hasConstConstructor*/  {
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_11.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_11.yaml.world.1.expect
index 495f313..72e701a 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_11.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_11.yaml.world.1.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///lib.dart" as lib {
 
   class Foo extends dart.core::Object /*hasConstConstructor*/  {
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_11.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_11.yaml.world.2.expect
index 0749995..14ebe65 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_11.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_11.yaml.world.2.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///lib.dart" as lib {
 
   class Foo extends dart.core::Object /*hasConstConstructor*/  {
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_11.yaml.world.3.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_11.yaml.world.3.expect
index 3aebb85..27a3ce0 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_11.yaml.world.3.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_11.yaml.world.3.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///lib.dart" as lib {
 
   class Foo extends dart.core::Object /*hasConstConstructor*/  {
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_3.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_3.yaml.world.1.expect
index f1394e6..cc82408 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_3.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_3.yaml.world.1.expect
@@ -1,4 +1,12 @@
 main = <No Member>;
+//
+// Problems in component:
+//
+// org-dartlang-test:///mypackage/b.dart:3:7: Error: 'Baz' can't implement both 'Foo<int>' and 'Foo<String>'
+//  - 'Foo' is from 'package:mypackage/a.dart' ('org-dartlang-test:///mypackage/a.dart').
+// class Baz extends Bar<int> implements Foo<String> {}
+//       ^
+//
 library from "org-dartlang-test:///main.dart" as main {
 
   import "package:mypackage/a.dart";
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_3.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_3.yaml.world.2.expect
index f1394e6..cc82408 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_3.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_3.yaml.world.2.expect
@@ -1,4 +1,12 @@
 main = <No Member>;
+//
+// Problems in component:
+//
+// org-dartlang-test:///mypackage/b.dart:3:7: Error: 'Baz' can't implement both 'Foo<int>' and 'Foo<String>'
+//  - 'Foo' is from 'package:mypackage/a.dart' ('org-dartlang-test:///mypackage/a.dart').
+// class Baz extends Bar<int> implements Foo<String> {}
+//       ^
+//
 library from "org-dartlang-test:///main.dart" as main {
 
   import "package:mypackage/a.dart";
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_3.yaml.world.3.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_3.yaml.world.3.expect
index f1394e6..cc82408 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_3.yaml.world.3.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_3.yaml.world.3.expect
@@ -1,4 +1,12 @@
 main = <No Member>;
+//
+// Problems in component:
+//
+// org-dartlang-test:///mypackage/b.dart:3:7: Error: 'Baz' can't implement both 'Foo<int>' and 'Foo<String>'
+//  - 'Foo' is from 'package:mypackage/a.dart' ('org-dartlang-test:///mypackage/a.dart').
+// class Baz extends Bar<int> implements Foo<String> {}
+//       ^
+//
 library from "org-dartlang-test:///main.dart" as main {
 
   import "package:mypackage/a.dart";
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_3.yaml.world.4.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_3.yaml.world.4.expect
index f1394e6..cc82408 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_3.yaml.world.4.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_3.yaml.world.4.expect
@@ -1,4 +1,12 @@
 main = <No Member>;
+//
+// Problems in component:
+//
+// org-dartlang-test:///mypackage/b.dart:3:7: Error: 'Baz' can't implement both 'Foo<int>' and 'Foo<String>'
+//  - 'Foo' is from 'package:mypackage/a.dart' ('org-dartlang-test:///mypackage/a.dart').
+// class Baz extends Bar<int> implements Foo<String> {}
+//       ^
+//
 library from "org-dartlang-test:///main.dart" as main {
 
   import "package:mypackage/a.dart";
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_4.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_4.yaml.world.1.expect
index 996ccac..dcdc78a 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_4.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_4.yaml.world.1.expect
@@ -1,4 +1,12 @@
 main = <No Member>;
+//
+// Problems in component:
+//
+// org-dartlang-test:///mypackage/c.dart:3:7: Error: 'Baz' can't implement both 'Foo<int>' and 'Foo<String>'
+//  - 'Foo' is from 'package:mypackage/a.dart' ('org-dartlang-test:///mypackage/a.dart').
+// class Baz extends Bar<int> implements Foo<String> {}
+//       ^
+//
 library from "org-dartlang-test:///main.dart" as main {
 
   import "package:mypackage/a.dart";
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_4.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_4.yaml.world.2.expect
index 996ccac..dcdc78a 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_4.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_4.yaml.world.2.expect
@@ -1,4 +1,12 @@
 main = <No Member>;
+//
+// Problems in component:
+//
+// org-dartlang-test:///mypackage/c.dart:3:7: Error: 'Baz' can't implement both 'Foo<int>' and 'Foo<String>'
+//  - 'Foo' is from 'package:mypackage/a.dart' ('org-dartlang-test:///mypackage/a.dart').
+// class Baz extends Bar<int> implements Foo<String> {}
+//       ^
+//
 library from "org-dartlang-test:///main.dart" as main {
 
   import "package:mypackage/a.dart";
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_4.yaml.world.3.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_4.yaml.world.3.expect
index 996ccac..dcdc78a 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_4.yaml.world.3.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_4.yaml.world.3.expect
@@ -1,4 +1,12 @@
 main = <No Member>;
+//
+// Problems in component:
+//
+// org-dartlang-test:///mypackage/c.dart:3:7: Error: 'Baz' can't implement both 'Foo<int>' and 'Foo<String>'
+//  - 'Foo' is from 'package:mypackage/a.dart' ('org-dartlang-test:///mypackage/a.dart').
+// class Baz extends Bar<int> implements Foo<String> {}
+//       ^
+//
 library from "org-dartlang-test:///main.dart" as main {
 
   import "package:mypackage/a.dart";
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_4.yaml.world.4.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_4.yaml.world.4.expect
index 996ccac..dcdc78a 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_4.yaml.world.4.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_4.yaml.world.4.expect
@@ -1,4 +1,12 @@
 main = <No Member>;
+//
+// Problems in component:
+//
+// org-dartlang-test:///mypackage/c.dart:3:7: Error: 'Baz' can't implement both 'Foo<int>' and 'Foo<String>'
+//  - 'Foo' is from 'package:mypackage/a.dart' ('org-dartlang-test:///mypackage/a.dart').
+// class Baz extends Bar<int> implements Foo<String> {}
+//       ^
+//
 library from "org-dartlang-test:///main.dart" as main {
 
   import "package:mypackage/a.dart";
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_5.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_5.yaml.world.1.expect
index 336b536..8c28bf9 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_5.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_5.yaml.world.1.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///main.dart" as main {
 
   import "package:mypackage/a.dart" as a;
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_5.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_5.yaml.world.2.expect
index 336b536..8c28bf9 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_5.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_5.yaml.world.2.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///main.dart" as main {
 
   import "package:mypackage/a.dart" as a;
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_5.yaml.world.3.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_5.yaml.world.3.expect
index 11d08c5..3cd7e09 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_5.yaml.world.3.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_5.yaml.world.3.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///main.dart" as main {
 
   import "package:mypackage/a.dart" as a;
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_5.yaml.world.4.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_5.yaml.world.4.expect
index 0165c50..180791b 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_5.yaml.world.4.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_5.yaml.world.4.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///main.dart" as main {
 
   import "package:mypackage/a.dart" as a;
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_6.yaml.world.3.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_6.yaml.world.3.expect
index 9cd7e48..fab0774 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_6.yaml.world.3.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_6.yaml.world.3.expect
@@ -3,7 +3,7 @@
 
   import "org-dartlang-test:///main.dart";
 
-  class Bar<X extends main::Foo<dart.core::Null?>* = main::Foo<dart.core::Null?>*> extends dart.core::Object {
+  class Bar<X extends main::Foo<Null>* = main::Foo<Null>*> extends dart.core::Object {
     synthetic constructor •() → lib::Bar<lib::Bar::X*>*
       : super dart.core::Object::•()
       ;
@@ -23,7 +23,7 @@
 
   import "org-dartlang-test:///lib.dart";
 
-  class Foo<X extends lib::Bar<main::Foo<dart.core::Null?>*>* = lib::Bar<main::Foo<dart.core::Null?>*>*> extends dart.core::Object {
+  class Foo<X extends lib::Bar<main::Foo<Null>*>* = lib::Bar<main::Foo<Null>*>*> extends dart.core::Object {
     synthetic constructor •() → main::Foo<main::Foo::X*>*
       : super dart.core::Object::•()
       ;
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_7.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_7.yaml.world.1.expect
index add2ad8..2e97886 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_7.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_7.yaml.world.1.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///lib.dart" as lib {
 
   import "org-dartlang-test:///nonexisting.dart";
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_7.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_7.yaml.world.2.expect
index 901f5bc..65648e6 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_7.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_7.yaml.world.2.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///lib.dart" as lib {
 
   import "org-dartlang-test:///nonexisting.dart";
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_7.yaml.world.3.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_7.yaml.world.3.expect
index f9c00f1..061945a 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_7.yaml.world.3.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_7.yaml.world.3.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///lib.dart" as lib {
 
   import "org-dartlang-test:///nonexisting.dart";
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_7.yaml.world.4.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_7.yaml.world.4.expect
index a737d73..48606d6 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_7.yaml.world.4.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_7.yaml.world.4.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///lib.dart" as lib {
 
   import "org-dartlang-test:///nonexisting.dart";
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_7.yaml.world.5.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_7.yaml.world.5.expect
index 9a5acc1..39130bc 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_7.yaml.world.5.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_7.yaml.world.5.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///lib.dart" as lib {
 
   static method foo() → dynamic {}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_8.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_8.yaml.world.1.expect
index 495f313..72e701a 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_8.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_8.yaml.world.1.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///lib.dart" as lib {
 
   class Foo extends dart.core::Object /*hasConstConstructor*/  {
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_8.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_8.yaml.world.2.expect
index a3c1c19..b0e7394 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_8.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_8.yaml.world.2.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///lib.dart" as lib {
 
   class Foo extends dart.core::Object /*hasConstConstructor*/  {
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_8.yaml.world.3.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_8.yaml.world.3.expect
index 495f313..72e701a 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_8.yaml.world.3.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_8.yaml.world.3.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///lib.dart" as lib {
 
   class Foo extends dart.core::Object /*hasConstConstructor*/  {
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_9.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_9.yaml.world.1.expect
index 495f313..72e701a 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_9.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_9.yaml.world.1.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///lib.dart" as lib {
 
   class Foo extends dart.core::Object /*hasConstConstructor*/  {
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_9.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_9.yaml.world.2.expect
index 20b5e7e..d892035 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_9.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_9.yaml.world.2.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///lib.dart" as lib {
 
   class Foo extends dart.core::Object /*hasConstConstructor*/  {
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_9.yaml.world.3.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_9.yaml.world.3.expect
index d328c8e..51df21a 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_9.yaml.world.3.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_9.yaml.world.3.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///lib.dart" as lib {
 
   class Foo extends dart.core::Object /*hasConstConstructor*/  {
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/remove_import_with_error.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/remove_import_with_error.yaml.world.1.expect
index 6ff875b..4f98801 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/remove_import_with_error.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/remove_import_with_error.yaml.world.1.expect
@@ -1,4 +1,12 @@
-main = <No Member>;
+main = mai::main;
+//
+// Problems in component:
+//
+// org-dartlang-test:///b.dart:14:7: Error: 'C' can't implement both 'I<int>' and 'I<String>'
+//  - 'I' is from 'org-dartlang-test:///b.dart'.
+// class C extends A implements B {}
+//       ^
+//
 library bLibrary from "org-dartlang-test:///b.dart" as bLi {
 
   class I<T extends dart.core::Object* = dynamic> extends dart.core::Object {
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/remove_import_with_error.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/remove_import_with_error.yaml.world.2.expect
index 468dd2a..2f2262e 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/remove_import_with_error.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/remove_import_with_error.yaml.world.2.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = mai::main;
 library mainLibrary from "org-dartlang-test:///main.dart" as mai {
 
   static method main() → dynamic {
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/typedef_crash_01.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/typedef_crash_01.yaml.world.2.expect
index 30c96c7..d7c037a 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/typedef_crash_01.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/typedef_crash_01.yaml.world.2.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///lib.dart" as lib {
 
   typedef F<unrelated T extends dart.core::Object* = dynamic> = () →* dynamic;
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/unused_file.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/unused_file.yaml.world.1.expect
index a5961e3..16359cc 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/unused_file.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/unused_file.yaml.world.1.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///b.dart" as b {
 
   static method b() → dynamic {
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/unused_file.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/unused_file.yaml.world.2.expect
index 118bd73..95c9846 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/unused_file.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/unused_file.yaml.world.2.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///main.dart" as main {
 
   static method main() → dynamic {
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_1.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_1.yaml.world.1.expect
index 5f4155b..b562766 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_1.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_1.yaml.world.1.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///main.dart" as main {
 
   import "package:example/b.dart";
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_1.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_1.yaml.world.2.expect
index 1ac0905..5c955da 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_1.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_1.yaml.world.2.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///main.dart" as main {
 
   import "package:example/b.dart";
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_2.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_2.yaml.world.1.expect
index 5f4155b..b562766 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_2.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_2.yaml.world.1.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///main.dart" as main {
 
   import "package:example/b.dart";
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_2.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_2.yaml.world.2.expect
index 1ac0905..5c955da 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_2.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_2.yaml.world.2.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///main.dart" as main {
 
   import "package:example/b.dart";
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_3.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_3.yaml.world.1.expect
index 5f4155b..b562766 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_3.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_3.yaml.world.1.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///main.dart" as main {
 
   import "package:example/b.dart";
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_3.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_3.yaml.world.2.expect
index 1ac0905..5c955da 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_3.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_3.yaml.world.2.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///main.dart" as main {
 
   import "package:example/b.dart";
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_4.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_4.yaml.world.1.expect
index 79c4fd3..ddf4c9f 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_4.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_4.yaml.world.1.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///main.dart" as main {
 
   import "package:example/b.dart";
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_4.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_4.yaml.world.2.expect
index 9ca4da6..8607a05 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_4.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_4.yaml.world.2.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///main.dart" as main {
 //
 // Problems in library:
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_uri.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_uri.yaml.world.1.expect
index 5f4155b..b562766 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_uri.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_uri.yaml.world.1.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///main.dart" as main {
 
   import "package:example/b.dart";
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_uri.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_uri.yaml.world.2.expect
index 1ac0905..5c955da 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_uri.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/updated_package_uri.yaml.world.2.expect
@@ -1,4 +1,4 @@
-main = <No Member>;
+main = main::main;
 library from "org-dartlang-test:///main.dart" as main {
 
   import "package:example/b.dart";
diff --git a/pkg/front_end/testcases/inference/async_await.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/async_await.dart.strong.transformed.expect
index 0903294..487e430 100644
--- a/pkg/front_end/testcases/inference/async_await.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/async_await.dart.strong.transformed.expect
@@ -27,7 +27,8 @@
   abstract member-signature method timeout(core::Duration* timeLimit, {generic-covariant-impl () →* FutureOr<core::int*>* onTimeout = #C1}) → asy::Future<core::int*>*; -> asy::Future::timeout
 }
 static method test() → void /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic>* :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -50,7 +51,8 @@
         FutureOr<self::MyFuture*>* x8;
         self::MyFuture* x9;
         function test0() → asy::Future<core::int*>* /* originally async */ {
-          final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+          final asy::_Future<core::int*>* :async_future = new asy::_Future::•<core::int*>();
+          core::bool* :is_sync = false;
           FutureOr<core::int*>* :return_value;
           dynamic :async_stack_trace;
           (dynamic) →* dynamic :async_op_then;
@@ -64,20 +66,22 @@
                 :return_value = x0;
                 break #L2;
               }
-              asy::_completeOnAsyncReturn(:async_completer, :return_value);
+              asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
               return;
             }
             on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-              :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+              asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
             }
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-          :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-          return :async_completer.{asy::Completer::future};
+          :async_op.call();
+          :is_sync = true;
+          return :async_future;
         }
         function test1() → asy::Future<core::int*>* /* originally async */ {
-          final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+          final asy::_Future<core::int*>* :async_future = new asy::_Future::•<core::int*>();
+          core::bool* :is_sync = false;
           FutureOr<core::int*>* :return_value;
           dynamic :async_stack_trace;
           (dynamic) →* dynamic :async_op_then;
@@ -91,20 +95,22 @@
                 :return_value = x1;
                 break #L3;
               }
-              asy::_completeOnAsyncReturn(:async_completer, :return_value);
+              asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
               return;
             }
             on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-              :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+              asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
             }
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-          :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-          return :async_completer.{asy::Completer::future};
+          :async_op.call();
+          :is_sync = true;
+          return :async_future;
         }
         function test2() → asy::Future<asy::Future<core::int*>*>* /* originally async */ {
-          final asy::_AsyncAwaitCompleter<asy::Future<core::int*>*>* :async_completer = new asy::_AsyncAwaitCompleter::•<asy::Future<core::int*>*>();
+          final asy::_Future<asy::Future<core::int*>*>* :async_future = new asy::_Future::•<asy::Future<core::int*>*>();
+          core::bool* :is_sync = false;
           FutureOr<asy::Future<core::int*>*>* :return_value;
           dynamic :async_stack_trace;
           (dynamic) →* dynamic :async_op_then;
@@ -118,20 +124,22 @@
                 :return_value = x2;
                 break #L4;
               }
-              asy::_completeOnAsyncReturn(:async_completer, :return_value);
+              asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
               return;
             }
             on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-              :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+              asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
             }
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-          :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-          return :async_completer.{asy::Completer::future};
+          :async_op.call();
+          :is_sync = true;
+          return :async_future;
         }
         function test3() → asy::Future<FutureOr<core::int*>*>* /* originally async */ {
-          final asy::_AsyncAwaitCompleter<FutureOr<core::int*>*>* :async_completer = new asy::_AsyncAwaitCompleter::•<FutureOr<core::int*>*>();
+          final asy::_Future<FutureOr<core::int*>*>* :async_future = new asy::_Future::•<FutureOr<core::int*>*>();
+          core::bool* :is_sync = false;
           FutureOr<FutureOr<core::int*>*>* :return_value;
           dynamic :async_stack_trace;
           (dynamic) →* dynamic :async_op_then;
@@ -145,20 +153,22 @@
                 :return_value = x3;
                 break #L5;
               }
-              asy::_completeOnAsyncReturn(:async_completer, :return_value);
+              asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
               return;
             }
             on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-              :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+              asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
             }
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-          :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-          return :async_completer.{asy::Completer::future};
+          :async_op.call();
+          :is_sync = true;
+          return :async_future;
         }
         function test4() → asy::Future<self::MyFuture*>* /* originally async */ {
-          final asy::_AsyncAwaitCompleter<self::MyFuture*>* :async_completer = new asy::_AsyncAwaitCompleter::•<self::MyFuture*>();
+          final asy::_Future<self::MyFuture*>* :async_future = new asy::_Future::•<self::MyFuture*>();
+          core::bool* :is_sync = false;
           FutureOr<self::MyFuture*>* :return_value;
           dynamic :async_stack_trace;
           (dynamic) →* dynamic :async_op_then;
@@ -172,20 +182,22 @@
                 :return_value = x4;
                 break #L6;
               }
-              asy::_completeOnAsyncReturn(:async_completer, :return_value);
+              asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
               return;
             }
             on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-              :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+              asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
             }
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-          :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-          return :async_completer.{asy::Completer::future};
+          :async_op.call();
+          :is_sync = true;
+          return :async_future;
         }
         function test5() → asy::Future<core::int*>* /* originally async */ {
-          final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+          final asy::_Future<core::int*>* :async_future = new asy::_Future::•<core::int*>();
+          core::bool* :is_sync = false;
           FutureOr<core::int*>* :return_value;
           dynamic :async_stack_trace;
           (dynamic) →* dynamic :async_op_then;
@@ -199,20 +211,22 @@
                 :return_value = x5;
                 break #L7;
               }
-              asy::_completeOnAsyncReturn(:async_completer, :return_value);
+              asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
               return;
             }
             on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-              :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+              asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
             }
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-          :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-          return :async_completer.{asy::Completer::future};
+          :async_op.call();
+          :is_sync = true;
+          return :async_future;
         }
         function test6() → asy::Future<asy::Future<core::int*>*>* /* originally async */ {
-          final asy::_AsyncAwaitCompleter<asy::Future<core::int*>*>* :async_completer = new asy::_AsyncAwaitCompleter::•<asy::Future<core::int*>*>();
+          final asy::_Future<asy::Future<core::int*>*>* :async_future = new asy::_Future::•<asy::Future<core::int*>*>();
+          core::bool* :is_sync = false;
           FutureOr<asy::Future<core::int*>*>* :return_value;
           dynamic :async_stack_trace;
           (dynamic) →* dynamic :async_op_then;
@@ -226,20 +240,22 @@
                 :return_value = x6;
                 break #L8;
               }
-              asy::_completeOnAsyncReturn(:async_completer, :return_value);
+              asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
               return;
             }
             on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-              :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+              asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
             }
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-          :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-          return :async_completer.{asy::Completer::future};
+          :async_op.call();
+          :is_sync = true;
+          return :async_future;
         }
         function test7() → asy::Future<FutureOr<core::int*>*>* /* originally async */ {
-          final asy::_AsyncAwaitCompleter<FutureOr<core::int*>*>* :async_completer = new asy::_AsyncAwaitCompleter::•<FutureOr<core::int*>*>();
+          final asy::_Future<FutureOr<core::int*>*>* :async_future = new asy::_Future::•<FutureOr<core::int*>*>();
+          core::bool* :is_sync = false;
           FutureOr<FutureOr<core::int*>*>* :return_value;
           dynamic :async_stack_trace;
           (dynamic) →* dynamic :async_op_then;
@@ -253,20 +269,22 @@
                 :return_value = x7;
                 break #L9;
               }
-              asy::_completeOnAsyncReturn(:async_completer, :return_value);
+              asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
               return;
             }
             on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-              :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+              asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
             }
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-          :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-          return :async_completer.{asy::Completer::future};
+          :async_op.call();
+          :is_sync = true;
+          return :async_future;
         }
         function test8() → asy::Future<self::MyFuture*>* /* originally async */ {
-          final asy::_AsyncAwaitCompleter<self::MyFuture*>* :async_completer = new asy::_AsyncAwaitCompleter::•<self::MyFuture*>();
+          final asy::_Future<self::MyFuture*>* :async_future = new asy::_Future::•<self::MyFuture*>();
+          core::bool* :is_sync = false;
           FutureOr<self::MyFuture*>* :return_value;
           dynamic :async_stack_trace;
           (dynamic) →* dynamic :async_op_then;
@@ -280,20 +298,22 @@
                 :return_value = x8;
                 break #L10;
               }
-              asy::_completeOnAsyncReturn(:async_completer, :return_value);
+              asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
               return;
             }
             on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-              :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+              asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
             }
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-          :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-          return :async_completer.{asy::Completer::future};
+          :async_op.call();
+          :is_sync = true;
+          return :async_future;
         }
         function test9() → asy::Future<core::int*>* /* originally async */ {
-          final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+          final asy::_Future<core::int*>* :async_future = new asy::_Future::•<core::int*>();
+          core::bool* :is_sync = false;
           FutureOr<core::int*>* :return_value;
           dynamic :async_stack_trace;
           (dynamic) →* dynamic :async_op_then;
@@ -307,17 +327,18 @@
                 :return_value = x9;
                 break #L11;
               }
-              asy::_completeOnAsyncReturn(:async_completer, :return_value);
+              asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
               return;
             }
             on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-              :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+              asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
             }
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-          :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-          return :async_completer.{asy::Completer::future};
+          :async_op.call();
+          :is_sync = true;
+          return :async_future;
         }
         [yield] let dynamic #t1 = asy::_awaitHelper(x0, :async_op_then, :async_op_error, :async_op) in null;
         core::int* y0 = _in::unsafeCast<core::int*>(:result);
@@ -340,17 +361,18 @@
         [yield] let dynamic #t10 = asy::_awaitHelper(x9, :async_op_then, :async_op_error, :async_op) in null;
         core::int* y9 = _in::unsafeCast<core::int*>(:result);
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method main() → dynamic {}
 
diff --git a/pkg/front_end/testcases/inference/async_closure_return_type_flatten.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/async_closure_return_type_flatten.dart.strong.transformed.expect
index bcf04f1..e19b6bd 100644
--- a/pkg/front_end/testcases/inference/async_closure_return_type_flatten.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/async_closure_return_type_flatten.dart.strong.transformed.expect
@@ -8,7 +8,8 @@
 static field asy::Future<core::int*>* futureInt = null;
 static field () →* asy::Future<core::int*>* f = () → asy::Future<core::int*>* => self::futureInt;
 static field () →* asy::Future<core::int*>* g = () → asy::Future<core::int*>* /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+  final asy::_Future<core::int*>* :async_future = new asy::_Future::•<core::int*>();
+  core::bool* :is_sync = false;
   FutureOr<core::int*>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -22,17 +23,18 @@
         :return_value = self::futureInt;
         break #L1;
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 };
 static method main() → dynamic {
   self::f;
diff --git a/pkg/front_end/testcases/inference/async_closure_return_type_future.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/async_closure_return_type_future.dart.strong.transformed.expect
index 8aa532e..e7ca87d 100644
--- a/pkg/front_end/testcases/inference/async_closure_return_type_future.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/async_closure_return_type_future.dart.strong.transformed.expect
@@ -4,7 +4,8 @@
 import "dart:core" as core;
 
 static field () →* asy::Future<core::int*>* f = () → asy::Future<core::int*>* /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+  final asy::_Future<core::int*>* :async_future = new asy::_Future::•<core::int*>();
+  core::bool* :is_sync = false;
   FutureOr<core::int*>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -18,17 +19,18 @@
         :return_value = 0;
         break #L1;
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 };
 static method main() → dynamic {
   self::f;
diff --git a/pkg/front_end/testcases/inference/async_closure_return_type_future_or.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/async_closure_return_type_future_or.dart.strong.transformed.expect
index 5aaec68..191fffb 100644
--- a/pkg/front_end/testcases/inference/async_closure_return_type_future_or.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/async_closure_return_type_future_or.dart.strong.transformed.expect
@@ -8,7 +8,8 @@
 static field FutureOr<core::int*>* futureOrInt = null;
 static field () →* FutureOr<core::int*>* f = () → FutureOr<core::int*>* => self::futureOrInt;
 static field () →* asy::Future<core::int*>* g = () → asy::Future<core::int*>* /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+  final asy::_Future<core::int*>* :async_future = new asy::_Future::•<core::int*>();
+  core::bool* :is_sync = false;
   FutureOr<core::int*>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -22,17 +23,18 @@
         :return_value = self::futureOrInt;
         break #L1;
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 };
 static method main() → dynamic {
   self::f;
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_futures.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_futures.dart.strong.transformed.expect
index f140096..04cb4b4 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_futures.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_futures.dart.strong.transformed.expect
@@ -9,7 +9,8 @@
 
 static method test() → dynamic {
   () →* asy::Future<core::num*>* f = () → asy::Future<core::num*>* /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::num*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::num*>();
+    final asy::_Future<core::num*>* :async_future = new asy::_Future::•<core::num*>();
+    core::bool* :is_sync = false;
     FutureOr<core::num*>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -29,17 +30,18 @@
             break #L1;
           }
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   };
   asy::Future<core::num*>* g = f.call();
   asy::Future<core::int*>* h = f.call() as{TypeError} asy::Future<core::int*>*;
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_values.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_values.dart.strong.transformed.expect
index 50d95e7..a7b9b3d 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_values.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_values.dart.strong.transformed.expect
@@ -9,7 +9,8 @@
 
 static method test() → dynamic {
   () →* asy::Future<core::num*>* f = () → asy::Future<core::num*>* /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::num*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::num*>();
+    final asy::_Future<core::num*>* :async_future = new asy::_Future::•<core::num*>();
+    core::bool* :is_sync = false;
     FutureOr<core::num*>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -29,17 +30,18 @@
             break #L1;
           }
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   };
   asy::Future<core::num*>* g = f.call();
   asy::Future<core::int*>* h = f.call() as{TypeError} asy::Future<core::int*>*;
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_mix_of_values_and_futures.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_mix_of_values_and_futures.dart.strong.transformed.expect
index d86bf2b..398dba4 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_mix_of_values_and_futures.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_mix_of_values_and_futures.dart.strong.transformed.expect
@@ -9,7 +9,8 @@
 
 static method test() → dynamic {
   () →* asy::Future<core::num*>* f = () → asy::Future<core::num*>* /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::num*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::num*>();
+    final asy::_Future<core::num*>* :async_future = new asy::_Future::•<core::num*>();
+    core::bool* :is_sync = false;
     FutureOr<core::num*>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -29,17 +30,18 @@
             break #L1;
           }
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   };
   asy::Future<core::num*>* g = f.call();
   asy::Future<core::int*>* h = f.call() as{TypeError} asy::Future<core::int*>*;
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart
index 5e47a90..b40afa5 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart
@@ -8,7 +8,7 @@
 import 'dart:async';
 
 main() async {
-  var /*@ type=() ->* Future<Null?>* */ f = /*@ returnType=Future<Null?>* */ () async {
+  var /*@ type=() ->* Future<Null>* */ f = /*@ returnType=Future<Null>* */ () async {
     return null;
   };
   Future y = f();
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart.strong.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart.strong.expect
index e0504e6..1b41da7 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart.strong.expect
@@ -6,7 +6,7 @@
 import "dart:async";
 
 static method main() → dynamic async {
-  () →* asy::Future<core::Null?>* f = () → asy::Future<core::Null?>* async {
+  () →* asy::Future<Null>* f = () → asy::Future<Null>* async {
     return null;
   };
   asy::Future<dynamic>* y = f.call();
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart.strong.transformed.expect
index 2c79978..6215f3a 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart.strong.transformed.expect
@@ -7,7 +7,8 @@
 import "dart:async";
 
 static method main() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic>* :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -19,9 +20,10 @@
     try {
       #L1:
       {
-        () →* asy::Future<core::Null?>* f = () → asy::Future<core::Null?>* /* originally async */ {
-          final asy::_AsyncAwaitCompleter<core::Null?>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::Null?>();
-          FutureOr<core::Null?>* :return_value;
+        () →* asy::Future<Null>* f = () → asy::Future<Null>* /* originally async */ {
+          final asy::_Future<Null>* :async_future = new asy::_Future::•<Null>();
+          core::bool* :is_sync = false;
+          FutureOr<Null>* :return_value;
           dynamic :async_stack_trace;
           (dynamic) →* dynamic :async_op_then;
           (core::Object*, core::StackTrace*) →* dynamic :async_op_error;
@@ -34,32 +36,34 @@
                 :return_value = null;
                 break #L2;
               }
-              asy::_completeOnAsyncReturn(:async_completer, :return_value);
+              asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
               return;
             }
             on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-              :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+              asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
             }
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-          :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-          return :async_completer.{asy::Completer::future};
+          :async_op.call();
+          :is_sync = true;
+          return :async_future;
         };
         asy::Future<dynamic>* y = f.call();
         asy::Future<core::String*>* z = f.call();
         [yield] let dynamic #t1 = asy::_awaitHelper(f.call(), :async_op_then, :async_op_error, :async_op) in null;
-        core::String* s = _in::unsafeCast<core::Null?>(:result);
+        core::String* s = _in::unsafeCast<Null>(:result);
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart
index 1eabccf..440f561 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart
@@ -8,7 +8,7 @@
 import 'dart:async';
 
 main() async {
-  var /*@ type=() ->* Stream<Null?>* */ f = /*@ returnType=Stream<Null?>* */ () async* {
+  var /*@ type=() ->* Stream<Null>* */ f = /*@ returnType=Stream<Null>* */ () async* {
     yield null;
   };
   Stream y = f();
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart.strong.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart.strong.expect
index 3bfdf39..4f2a9bc 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart.strong.expect
@@ -6,7 +6,7 @@
 import "dart:async";
 
 static method main() → dynamic async {
-  () →* asy::Stream<core::Null?>* f = () → asy::Stream<core::Null?>* async* {
+  () →* asy::Stream<Null>* f = () → asy::Stream<Null>* async* {
     yield null;
   };
   asy::Stream<dynamic>* y = f.call();
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart.strong.transformed.expect
index 4f7a9d4..a83d5ab 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart.strong.transformed.expect
@@ -7,7 +7,8 @@
 import "dart:async";
 
 static method main() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic>* :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -19,8 +20,8 @@
     try {
       #L1:
       {
-        () →* asy::Stream<core::Null?>* f = () → asy::Stream<core::Null?>* /* originally async* */ {
-          asy::_AsyncStarStreamController<core::Null?>* :controller;
+        () →* asy::Stream<Null>* f = () → asy::Stream<Null>* /* originally async* */ {
+          asy::_AsyncStarStreamController<Null>* :controller;
           dynamic :controller_stream;
           dynamic :async_stack_trace;
           (dynamic) →* dynamic :async_op_then;
@@ -50,24 +51,25 @@
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-          :controller = new asy::_AsyncStarStreamController::•<core::Null?>(:async_op);
+          :controller = new asy::_AsyncStarStreamController::•<Null>(:async_op);
           :controller_stream = :controller.{asy::_AsyncStarStreamController::stream};
           return :controller_stream;
         };
         asy::Stream<dynamic>* y = f.call();
         asy::Stream<core::String*>* z = f.call();
         [yield] let dynamic #t1 = asy::_awaitHelper(f.call().{asy::Stream::first}, :async_op_then, :async_op_error, :async_op) in null;
-        core::String* s = _in::unsafeCast<core::Null?>(:result);
+        core::String* s = _in::unsafeCast<Null>(:result);
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync.dart b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync.dart
index ff64ba7..4c33394 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync.dart
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync.dart
@@ -9,18 +9,18 @@
 void foo(int f(Object _)) {}
 
 test() {
-  var /*@ type=(Object*) ->* Null? */ f = /*@ returnType=Null? */ (Object x) {
+  var /*@ type=(Object*) ->* Null */ f = /*@ returnType=Null */ (Object x) {
     return null;
   };
   String y = f(42);
 
-  f = /*error:INVALID_CAST_FUNCTION_EXPR*/ /*@ returnType=Null? */ (/*@ type=Object* */ x) =>
+  f = /*error:INVALID_CAST_FUNCTION_EXPR*/ /*@ returnType=Null */ (/*@ type=Object* */ x) =>
       'hello';
 
-  foo(/*@ returnType=Null? */ (/*@ type=Object* */ x) {
+  foo(/*@ returnType=Null */ (/*@ type=Object* */ x) {
     return null;
   });
-  foo(/*@ returnType=Null? */ (/*@ type=Object* */ x) {
+  foo(/*@ returnType=Null */ (/*@ type=Object* */ x) {
     throw "not implemented";
   });
 }
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync.dart.strong.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync.dart.strong.expect
index c1bf65f..cdf3f6a 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync.dart.strong.expect
@@ -5,15 +5,15 @@
 static field dynamic h = null;
 static method foo((core::Object*) →* core::int* f) → void {}
 static method test() → dynamic {
-  (core::Object*) →* core::Null? f = (core::Object* x) → core::Null? {
+  (core::Object*) →* Null f = (core::Object* x) → Null {
     return null;
   };
   core::String* y = f.call(42);
-  f = (core::Object* x) → core::Null? => "hello" as{TypeError} core::Null?;
-  self::foo((core::Object* x) → core::Null? {
+  f = (core::Object* x) → Null => "hello" as{TypeError} Null;
+  self::foo((core::Object* x) → Null {
     return null;
   });
-  self::foo((core::Object* x) → core::Null? {
+  self::foo((core::Object* x) → Null {
     throw "not implemented";
   });
 }
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync.dart.strong.transformed.expect
index c1bf65f..cdf3f6a 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync.dart.strong.transformed.expect
@@ -5,15 +5,15 @@
 static field dynamic h = null;
 static method foo((core::Object*) →* core::int* f) → void {}
 static method test() → dynamic {
-  (core::Object*) →* core::Null? f = (core::Object* x) → core::Null? {
+  (core::Object*) →* Null f = (core::Object* x) → Null {
     return null;
   };
   core::String* y = f.call(42);
-  f = (core::Object* x) → core::Null? => "hello" as{TypeError} core::Null?;
-  self::foo((core::Object* x) → core::Null? {
+  f = (core::Object* x) → Null => "hello" as{TypeError} Null;
+  self::foo((core::Object* x) → Null {
     return null;
   });
-  self::foo((core::Object* x) → core::Null? {
+  self::foo((core::Object* x) → Null {
     throw "not implemented";
   });
 }
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync_star.dart b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync_star.dart
index 6d0a4af..c774479 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync_star.dart
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync_star.dart
@@ -6,7 +6,7 @@
 library test;
 
 main() {
-  var /*@ type=() ->* Iterable<Null?>* */ f = /*@ returnType=Iterable<Null?>* */ () sync* {
+  var /*@ type=() ->* Iterable<Null>* */ f = /*@ returnType=Iterable<Null>* */ () sync* {
     yield null;
   };
   Iterable y = f();
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync_star.dart.strong.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync_star.dart.strong.expect
index 96ec582..58702d6 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync_star.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync_star.dart.strong.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  () →* core::Iterable<core::Null?>* f = () → core::Iterable<core::Null?>* sync* {
+  () →* core::Iterable<Null>* f = () → core::Iterable<Null>* sync* {
     yield null;
   };
   core::Iterable<dynamic>* y = f.call();
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync_star.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync_star.dart.strong.transformed.expect
index 8ef54ea..a73b655 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync_star.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync_star.dart.strong.transformed.expect
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  () →* core::Iterable<core::Null?>* f = () → core::Iterable<core::Null?>* /* originally sync* */ {
-    function :sync_op_gen() → (core::_SyncIterator<dynamic>*) →* core::bool* {
+  () →* core::Iterable<Null>* f = () → core::Iterable<Null>* /* originally sync* */ {
+    function :sync_op_gen() → (core::_SyncIterator<dynamic>*, dynamic, dynamic) →* core::bool* {
       core::int* :await_jump_var = 0;
       dynamic :await_ctx_var;
-      return (core::_SyncIterator<dynamic>* :iterator) → core::bool* yielding {
+      function :sync_op(core::_SyncIterator<dynamic>* :iterator, dynamic :exception, dynamic :stack_trace) → core::bool* yielding {
         {
           {
             :iterator.{core::_SyncIterator::_current} = null;
@@ -15,9 +15,10 @@
           }
         }
         return false;
-      };
+      }
+      return :sync_op;
     }
-    return new core::_SyncIterable::•<core::Null?>(:sync_op_gen);
+    return new core::_SyncIterable::•<Null>(:sync_op_gen);
   };
   core::Iterable<dynamic>* y = f.call();
   core::Iterable<core::String*>* z = f.call();
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_no_return.dart b/pkg/front_end/testcases/inference/block_bodied_lambdas_no_return.dart
index 0c6ada5..531bf49 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_no_return.dart
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_no_return.dart
@@ -7,9 +7,9 @@
 
 test1() {
   List<int> o;
-  var /*@ type=Iterable<Null?>* */ y =
-      o. /*@ typeArgs=Null? */ /*@target=Iterable.map*/ map(
-          /*@ returnType=Null? */ (/*@ type=int* */ x) {});
+  var /*@ type=Iterable<Null>* */ y =
+      o. /*@ typeArgs=Null */ /*@target=Iterable.map*/ map(
+          /*@ returnType=Null */ (/*@ type=int* */ x) {});
   Iterable<int> z = y;
 }
 
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_no_return.dart.strong.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_no_return.dart.strong.expect
index ae81c76..6a55e9b 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_no_return.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_no_return.dart.strong.expect
@@ -4,7 +4,7 @@
 
 static method test1() → dynamic {
   core::List<core::int*>* o;
-  core::Iterable<core::Null?>* y = o.{core::Iterable::map}<core::Null?>((core::int* x) → core::Null? {});
+  core::Iterable<Null>* y = o.{core::Iterable::map}<Null>((core::int* x) → Null {});
   core::Iterable<core::int*>* z = y;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_no_return.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_no_return.dart.strong.transformed.expect
index ae81c76..6a55e9b 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_no_return.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_no_return.dart.strong.transformed.expect
@@ -4,7 +4,7 @@
 
 static method test1() → dynamic {
   core::List<core::int*>* o;
-  core::Iterable<core::Null?>* y = o.{core::Iterable::map}<core::Null?>((core::int* x) → core::Null? {});
+  core::Iterable<Null>* y = o.{core::Iterable::map}<Null>((core::int* x) → Null {});
   core::Iterable<core::int*>* z = y;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_returns.dart b/pkg/front_end/testcases/inference/block_bodied_lambdas_returns.dart
index 30d096e..86e4e26 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_returns.dart
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_returns.dart
@@ -6,24 +6,24 @@
 library test;
 
 main() {
-  var /*@ type=() ->* Null? */ a = /*@ returnType=Null? */ () {};
-  var /*@ type=() ->* Null? */ b = /*@ returnType=Null? */ () {
+  var /*@ type=() ->* Null */ a = /*@ returnType=Null */ () {};
+  var /*@ type=() ->* Null */ b = /*@ returnType=Null */ () {
     return;
   };
-  var /*@ type=() ->* Null? */ c = /*@ returnType=Null? */ () {
+  var /*@ type=() ->* Null */ c = /*@ returnType=Null */ () {
     return null;
   };
   var /*@ type=() ->* int* */ d = /*@ returnType=int* */ () {
     return 0;
   };
-  var /*@ type=(bool*) ->* Null? */ e = /*@ returnType=Null? */ (bool b) {
+  var /*@ type=(bool*) ->* Null */ e = /*@ returnType=Null */ (bool b) {
     if (b) {
       return;
     } else {
       return;
     }
   };
-  var /*@ type=(bool*) ->* Null? */ f = /*@ returnType=Null? */ (bool b) {
+  var /*@ type=(bool*) ->* Null */ f = /*@ returnType=Null */ (bool b) {
     if (b) {
       return;
     } else {
@@ -37,14 +37,14 @@
       return 0;
     }
   };
-  var /*@ type=(bool*) ->* Null? */ h = /*@ returnType=Null? */ (bool b) {
+  var /*@ type=(bool*) ->* Null */ h = /*@ returnType=Null */ (bool b) {
     if (b) {
       return null;
     } else {
       return;
     }
   };
-  var /*@ type=(bool*) ->* Null? */ i = /*@ returnType=Null? */ (bool b) {
+  var /*@ type=(bool*) ->* Null */ i = /*@ returnType=Null */ (bool b) {
     if (b) {
       return null;
     } else {
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_returns.dart.strong.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_returns.dart.strong.expect
index 3ccb306..39b321c 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_returns.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_returns.dart.strong.expect
@@ -14,17 +14,17 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  () →* core::Null? a = () → core::Null? {};
-  () →* core::Null? b = () → core::Null? {
+  () →* Null a = () → Null {};
+  () →* Null b = () → Null {
     return;
   };
-  () →* core::Null? c = () → core::Null? {
+  () →* Null c = () → Null {
     return null;
   };
   () →* core::int* d = () → core::int* {
     return 0;
   };
-  (core::bool*) →* core::Null? e = (core::bool* b) → core::Null? {
+  (core::bool*) →* Null e = (core::bool* b) → Null {
     if(b) {
       return;
     }
@@ -32,7 +32,7 @@
       return;
     }
   };
-  (core::bool*) →* core::Null? f = (core::bool* b) → core::Null? {
+  (core::bool*) →* Null f = (core::bool* b) → Null {
     if(b) {
       return;
     }
@@ -48,7 +48,7 @@
       return 0;
     }
   };
-  (core::bool*) →* core::Null? h = (core::bool* b) → core::Null? {
+  (core::bool*) →* Null h = (core::bool* b) → Null {
     if(b) {
       return null;
     }
@@ -56,7 +56,7 @@
       return;
     }
   };
-  (core::bool*) →* core::Null? i = (core::bool* b) → core::Null? {
+  (core::bool*) →* Null i = (core::bool* b) → Null {
     if(b) {
       return null;
     }
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_returns.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_returns.dart.strong.transformed.expect
index 3ccb306..39b321c 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_returns.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_returns.dart.strong.transformed.expect
@@ -14,17 +14,17 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  () →* core::Null? a = () → core::Null? {};
-  () →* core::Null? b = () → core::Null? {
+  () →* Null a = () → Null {};
+  () →* Null b = () → Null {
     return;
   };
-  () →* core::Null? c = () → core::Null? {
+  () →* Null c = () → Null {
     return null;
   };
   () →* core::int* d = () → core::int* {
     return 0;
   };
-  (core::bool*) →* core::Null? e = (core::bool* b) → core::Null? {
+  (core::bool*) →* Null e = (core::bool* b) → Null {
     if(b) {
       return;
     }
@@ -32,7 +32,7 @@
       return;
     }
   };
-  (core::bool*) →* core::Null? f = (core::bool* b) → core::Null? {
+  (core::bool*) →* Null f = (core::bool* b) → Null {
     if(b) {
       return;
     }
@@ -48,7 +48,7 @@
       return 0;
     }
   };
-  (core::bool*) →* core::Null? h = (core::bool* b) → core::Null? {
+  (core::bool*) →* Null h = (core::bool* b) → Null {
     if(b) {
       return null;
     }
@@ -56,7 +56,7 @@
       return;
     }
   };
-  (core::bool*) →* core::Null? i = (core::bool* b) → core::Null? {
+  (core::bool*) →* Null i = (core::bool* b) → Null {
     if(b) {
       return null;
     }
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_sync_star.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_sync_star.dart.strong.transformed.expect
index 8ba245d..6dba553 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_sync_star.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_sync_star.dart.strong.transformed.expect
@@ -4,10 +4,10 @@
 
 static method test() → dynamic {
   () →* core::Iterable<core::num*>* f = () → core::Iterable<core::num*>* /* originally sync* */ {
-    function :sync_op_gen() → (core::_SyncIterator<dynamic>*) →* core::bool* {
+    function :sync_op_gen() → (core::_SyncIterator<dynamic>*, dynamic, dynamic) →* core::bool* {
       core::int* :await_jump_var = 0;
       dynamic :await_ctx_var;
-      return (core::_SyncIterator<dynamic>* :iterator) → core::bool* yielding {
+      function :sync_op(core::_SyncIterator<dynamic>* :iterator, dynamic :exception, dynamic :stack_trace) → core::bool* yielding {
         {
           {
             :iterator.{core::_SyncIterator::_current} = 1;
@@ -19,7 +19,8 @@
           }
         }
         return false;
-      };
+      }
+      return :sync_op;
     }
     return new core::_SyncIterable::•<core::num*>(:sync_op_gen);
   };
diff --git a/pkg/front_end/testcases/inference/bottom_in_closure.dart b/pkg/front_end/testcases/inference/bottom_in_closure.dart
index b05f476..9084f25 100644
--- a/pkg/front_end/testcases/inference/bottom_in_closure.dart
+++ b/pkg/front_end/testcases/inference/bottom_in_closure.dart
@@ -5,7 +5,7 @@
 /*@testedFeatures=inference*/
 library test;
 
-var v = /*@ returnType=Null? */ () => null;
+var v = /*@ returnType=Null */ () => null;
 
 main() {
   v;
diff --git a/pkg/front_end/testcases/inference/bottom_in_closure.dart.outline.expect b/pkg/front_end/testcases/inference/bottom_in_closure.dart.outline.expect
index 0eb1af7..9f65784 100644
--- a/pkg/front_end/testcases/inference/bottom_in_closure.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/bottom_in_closure.dart.outline.expect
@@ -1,7 +1,6 @@
 library test;
 import self as self;
-import "dart:core" as core;
 
-static field () →* core::Null? v;
+static field () →* Null v;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/bottom_in_closure.dart.strong.expect b/pkg/front_end/testcases/inference/bottom_in_closure.dart.strong.expect
index 8325cbb..63cbd26 100644
--- a/pkg/front_end/testcases/inference/bottom_in_closure.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/bottom_in_closure.dart.strong.expect
@@ -1,8 +1,7 @@
 library test;
 import self as self;
-import "dart:core" as core;
 
-static field () →* core::Null? v = () → core::Null? => null;
+static field () →* Null v = () → Null => null;
 static method main() → dynamic {
   self::v;
 }
diff --git a/pkg/front_end/testcases/inference/bottom_in_closure.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/bottom_in_closure.dart.strong.transformed.expect
index 8325cbb..63cbd26 100644
--- a/pkg/front_end/testcases/inference/bottom_in_closure.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/bottom_in_closure.dart.strong.transformed.expect
@@ -1,8 +1,7 @@
 library test;
 import self as self;
-import "dart:core" as core;
 
-static field () →* core::Null? v = () → core::Null? => null;
+static field () →* Null v = () → Null => null;
 static method main() → dynamic {
   self::v;
 }
diff --git a/pkg/front_end/testcases/inference/closure_param_null_to_object.dart.strong.expect b/pkg/front_end/testcases/inference/closure_param_null_to_object.dart.strong.expect
index e4b0faf..1937cae 100644
--- a/pkg/front_end/testcases/inference/closure_param_null_to_object.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/closure_param_null_to_object.dart.strong.expect
@@ -3,6 +3,6 @@
 import "dart:core" as core;
 
 static method test() → void {
-  (core::Null?) →* core::int* f = (core::Object* x) → core::int* => 1;
+  (Null) →* core::int* f = (core::Object* x) → core::int* => 1;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/closure_param_null_to_object.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/closure_param_null_to_object.dart.strong.transformed.expect
index e4b0faf..1937cae 100644
--- a/pkg/front_end/testcases/inference/closure_param_null_to_object.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/closure_param_null_to_object.dart.strong.transformed.expect
@@ -3,6 +3,6 @@
 import "dart:core" as core;
 
 static method test() → void {
-  (core::Null?) →* core::int* f = (core::Object* x) → core::int* => 1;
+  (Null) →* core::int* f = (core::Object* x) → core::int* => 1;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/coerce_bottom_and_null_types.dart b/pkg/front_end/testcases/inference/coerce_bottom_and_null_types.dart
index da3d184..03c50b9 100644
--- a/pkg/front_end/testcases/inference/coerce_bottom_and_null_types.dart
+++ b/pkg/front_end/testcases/inference/coerce_bottom_and_null_types.dart
@@ -10,13 +10,13 @@
   var /*@ type=dynamic */ b = null;
   var /*@ type=dynamic */ c = throw 'foo';
   var /*@ type=() ->* int* */ d = /*@ returnType=int* */ () => 0;
-  var /*@ type=() ->* Null? */ e = /*@ returnType=Null? */ () => null;
+  var /*@ type=() ->* Null */ e = /*@ returnType=Null */ () => null;
   var /*@ type=() ->* <BottomType> */ f = /*@ returnType=<BottomType> */ () =>
       throw 'foo';
   var /*@ type=() ->* int* */ g = /*@ returnType=int* */ () {
     return 0;
   };
-  var /*@ type=() ->* Null? */ h = /*@ returnType=Null? */ () {
+  var /*@ type=() ->* Null */ h = /*@ returnType=Null */ () {
     return null;
   };
   var /*@ type=() ->* <BottomType> */ i = /*@ returnType=<BottomType> */ () {
diff --git a/pkg/front_end/testcases/inference/coerce_bottom_and_null_types.dart.strong.expect b/pkg/front_end/testcases/inference/coerce_bottom_and_null_types.dart.strong.expect
index 6d3a4af..6dd3514 100644
--- a/pkg/front_end/testcases/inference/coerce_bottom_and_null_types.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/coerce_bottom_and_null_types.dart.strong.expect
@@ -7,12 +7,12 @@
   dynamic b = null;
   dynamic c = throw "foo";
   () →* core::int* d = () → core::int* => 0;
-  () →* core::Null? e = () → core::Null? => null;
+  () →* Null e = () → Null => null;
   () →* <BottomType>f = () → <BottomType>=> throw "foo";
   () →* core::int* g = () → core::int* {
     return 0;
   };
-  () →* core::Null? h = () → core::Null? {
+  () →* Null h = () → Null {
     return null;
   };
   () →* <BottomType>i = () → <BottomType>{
diff --git a/pkg/front_end/testcases/inference/coerce_bottom_and_null_types.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/coerce_bottom_and_null_types.dart.strong.transformed.expect
index 6d3a4af..6dd3514 100644
--- a/pkg/front_end/testcases/inference/coerce_bottom_and_null_types.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/coerce_bottom_and_null_types.dart.strong.transformed.expect
@@ -7,12 +7,12 @@
   dynamic b = null;
   dynamic c = throw "foo";
   () →* core::int* d = () → core::int* => 0;
-  () →* core::Null? e = () → core::Null? => null;
+  () →* Null e = () → Null => null;
   () →* <BottomType>f = () → <BottomType>=> throw "foo";
   () →* core::int* g = () → core::int* {
     return 0;
   };
-  () →* core::Null? h = () → core::Null? {
+  () →* Null h = () → Null {
     return null;
   };
   () →* <BottomType>i = () → <BottomType>{
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter_local.dart b/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter_local.dart
index 1d09fe8..fef6699 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter_local.dart
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter_local.dart
@@ -11,7 +11,7 @@
 
 void test() {
   void f(@Foo(/*@ typeArgs=String* */ const []) /*@ type=dynamic */ x) {}
-  var /*@ type=(dynamic) ->* Null? */ x = /*@ returnType=Null? */ (@Foo(/*@ typeArgs=String* */ const []) /*@ type=dynamic */
+  var /*@ type=(dynamic) ->* Null */ x = /*@ returnType=Null */ (@Foo(/*@ typeArgs=String* */ const []) /*@ type=dynamic */
       x) {};
 }
 
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter_local.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter_local.dart.strong.expect
index 3dff8eb..2bd8ed8 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter_local.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter_local.dart.strong.expect
@@ -19,7 +19,7 @@
 }
 static method test() → void {
   function f(@#C1 dynamic x) → void {}
-  (dynamic) →* core::Null? x = (@#C1 dynamic x) → core::Null? {};
+  (dynamic) →* Null x = (@#C1 dynamic x) → Null {};
 }
 static method main() → dynamic {}
 
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter_local.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter_local.dart.strong.transformed.expect
index 3dff8eb..2bd8ed8 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter_local.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter_local.dart.strong.transformed.expect
@@ -19,7 +19,7 @@
 }
 static method test() → void {
   function f(@#C1 dynamic x) → void {}
-  (dynamic) →* core::Null? x = (@#C1 dynamic x) → core::Null? {};
+  (dynamic) →* Null x = (@#C1 dynamic x) → Null {};
 }
 static method main() → dynamic {}
 
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable_local.dart b/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable_local.dart
index a81e330..011f07f 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable_local.dart
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable_local.dart
@@ -11,8 +11,8 @@
 
 void test() {
   void f<@Foo(/*@ typeArgs=String* */ const []) T>() {}
-  var /*@ type=<T extends Object* = dynamic>() ->* Null? */ x =
-      <@Foo(/*@ typeArgs=String* */ const []) T> /*@ returnType=Null? */ () {};
+  var /*@ type=<T extends Object* = dynamic>() ->* Null */ x =
+      <@Foo(/*@ typeArgs=String* */ const []) T> /*@ returnType=Null */ () {};
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable_local.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable_local.dart.strong.expect
index f4ed260..ebb93a8 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable_local.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable_local.dart.strong.expect
@@ -19,7 +19,7 @@
 }
 static method test() → void {
   function f<@#C1 T extends core::Object* = dynamic>() → void {}
-  <T extends core::Object* = dynamic>() →* core::Null? x = <@#C1 T extends core::Object* = dynamic>() → core::Null? {};
+  <T extends core::Object* = dynamic>() →* Null x = <@#C1 T extends core::Object* = dynamic>() → Null {};
 }
 static method main() → dynamic {}
 
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable_local.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable_local.dart.strong.transformed.expect
index f4ed260..ebb93a8 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable_local.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable_local.dart.strong.transformed.expect
@@ -19,7 +19,7 @@
 }
 static method test() → void {
   function f<@#C1 T extends core::Object* = dynamic>() → void {}
-  <T extends core::Object* = dynamic>() →* core::Null? x = <@#C1 T extends core::Object* = dynamic>() → core::Null? {};
+  <T extends core::Object* = dynamic>() →* Null x = <@#C1 T extends core::Object* = dynamic>() → Null {};
 }
 static method main() → dynamic {}
 
diff --git a/pkg/front_end/testcases/inference/downwards_inference_async_await.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_async_await.dart.strong.transformed.expect
index 07cc11f..c861eee 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_async_await.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_async_await.dart.strong.transformed.expect
@@ -7,7 +7,8 @@
 import "dart:async";
 
 static method main() → asy::Future<dynamic>* /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic>* :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -25,15 +26,16 @@
         [yield] let dynamic #t2 = asy::_awaitHelper(asy::Future::value<core::List<core::int*>*>(<core::int*>[d as{TypeError,ForDynamic} core::int*]), :async_op_then, :async_op_error, :async_op) in null;
         core::List<core::int*>* l1 = _in::unsafeCast<core::List<core::int*>*>(:result);
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
diff --git a/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.strong.transformed.expect
index d0d77500..30e4086 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.strong.transformed.expect
@@ -60,7 +60,8 @@
 static method F<T extends core::Object* = dynamic>() → self::F::T*
   return null;
 static method f() → asy::Future<dynamic>* /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic>* :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -118,7 +119,6 @@
         }
         {
           asy::Stream<dynamic>* :stream = self::F<asy::Stream<dynamic>*>();
-          asy::_asyncStarListenHelper(:stream, :async_op);
           asy::_StreamIterator<dynamic>* :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
           try
             #L2:
@@ -140,7 +140,6 @@
         }
         {
           asy::Stream<dynamic>* :stream = self::F<asy::Stream<dynamic>*>();
-          asy::_asyncStarListenHelper(:stream, :async_op);
           asy::_StreamIterator<dynamic>* :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
           try
             #L3:
@@ -162,7 +161,6 @@
         }
         {
           asy::Stream<core::Object*>* :stream = self::F<asy::Stream<core::Object*>*>();
-          asy::_asyncStarListenHelper(:stream, :async_op);
           asy::_StreamIterator<core::Object*>* :for-iterator = new asy::_StreamIterator::•<core::Object*>(:stream);
           try
             #L4:
@@ -184,7 +182,6 @@
         }
         {
           asy::Stream<dynamic>* :stream = self::F<asy::Stream<dynamic>*>();
-          asy::_asyncStarListenHelper(:stream, :async_op);
           asy::_StreamIterator<dynamic>* :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
           try
             #L5:
@@ -208,7 +205,6 @@
         }
         {
           asy::Stream<core::Object*>* :stream = self::F<asy::Stream<core::Object*>*>();
-          asy::_asyncStarListenHelper(:stream, :async_op);
           asy::_StreamIterator<core::Object*>* :for-iterator = new asy::_StreamIterator::•<core::Object*>(:stream);
           try
             #L6:
@@ -231,20 +227,22 @@
             }
         }
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method main() → asy::Future<dynamic>* /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic>* :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -282,7 +280,6 @@
         }
         {
           self::MyStream<core::int*>* :stream = self::MyStream::•<core::int*>();
-          asy::_asyncStarListenHelper(:stream, :async_op);
           asy::_StreamIterator<core::int*>* :for-iterator = new asy::_StreamIterator::•<core::int*>(:stream);
           try
             #L8:
@@ -304,7 +301,6 @@
         }
         {
           self::MyStream<core::int*>* :stream = self::MyStream::•<core::int*>();
-          asy::_asyncStarListenHelper(:stream, :async_op);
           asy::_StreamIterator<core::int*>* :for-iterator = new asy::_StreamIterator::•<core::int*>(:stream);
           try
             #L9:
@@ -325,17 +321,18 @@
             }
         }
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 
 constants  {
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart b/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart
index 2085ac4..4f6fc11 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart
@@ -9,7 +9,7 @@
 
 void test() {
   {
-    Function2<int, String> l0 = /*@ returnType=Null? */ (int x) => null;
+    Function2<int, String> l0 = /*@ returnType=Null */ (int x) => null;
     Function2<int, String> l1 = /*@ returnType=String* */ (int x) => "hello";
     Function2<int, String>
         l2 = /*error:INVALID_ASSIGNMENT*/ /*@ returnType=String* */ (String x) =>
@@ -21,7 +21,7 @@
     };
   }
   {
-    Function2<int, String> l0 = /*@ returnType=Null? */ (/*@ type=int* */ x) => null;
+    Function2<int, String> l0 = /*@ returnType=Null */ (/*@ type=int* */ x) => null;
     Function2<int, String> l1 = /*@ returnType=String* */ (/*@ type=int* */ x) =>
         "hello";
     Function2<int, String>
@@ -35,7 +35,7 @@
     };
   }
   {
-    Function2<int, List<String>> l0 = /*@ returnType=Null? */ (int x) => null;
+    Function2<int, List<String>> l0 = /*@ returnType=Null */ (int x) => null;
     Function2<int, List<String>> l1 = /*@ returnType=List<String*>* */ (int
         x) => /*@ typeArgs=String* */ ["hello"];
     Function2<int, List<String>>
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.strong.expect
index 55385e0..edd0868 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.strong.expect
@@ -54,7 +54,7 @@
 typedef Function2<contravariant S extends core::Object* = dynamic, T extends core::Object* = dynamic> = (S*) →* T*;
 static method test() → void {
   {
-    (core::int*) →* core::String* l0 = (core::int* x) → core::Null? => null;
+    (core::int*) →* core::String* l0 = (core::int* x) → Null => null;
     (core::int*) →* core::String* l1 = (core::int* x) → core::String* => "hello";
     (core::int*) →* core::String* l2 = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:15:69: Error: A value of type 'String Function(String)' can't be assigned to a variable of type 'String Function(int)'.
         l2 = /*error:INVALID_ASSIGNMENT*/ /*@ returnType=String* */ (String x) =>
@@ -69,7 +69,7 @@
     };
   }
   {
-    (core::int*) →* core::String* l0 = (core::int* x) → core::Null? => null;
+    (core::int*) →* core::String* l0 = (core::int* x) → Null => null;
     (core::int*) →* core::String* l1 = (core::int* x) → core::String* => "hello";
     (core::int*) →* core::String* l2 = (core::int* x) → core::String* => let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:29:13: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
             3;
@@ -86,7 +86,7 @@
     };
   }
   {
-    (core::int*) →* core::List<core::String*>* l0 = (core::int* x) → core::Null? => null;
+    (core::int*) →* core::List<core::String*>* l0 = (core::int* x) → Null => null;
     (core::int*) →* core::List<core::String*>* l1 = (core::int* x) → core::List<core::String*>* => <core::String*>["hello"];
     (core::int*) →* core::List<core::String*>* l2 = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:42:76: Error: A value of type 'List<String> Function(String)' can't be assigned to a variable of type 'List<String> Function(int)'.
  - 'List' is from 'dart:core'.
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.strong.transformed.expect
index 46f24ee..4e084a6 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.strong.transformed.expect
@@ -54,7 +54,7 @@
 typedef Function2<contravariant S extends core::Object* = dynamic, T extends core::Object* = dynamic> = (S*) →* T*;
 static method test() → void {
   {
-    (core::int*) →* core::String* l0 = (core::int* x) → core::Null? => null;
+    (core::int*) →* core::String* l0 = (core::int* x) → Null => null;
     (core::int*) →* core::String* l1 = (core::int* x) → core::String* => "hello";
     (core::int*) →* core::String* l2 = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:15:69: Error: A value of type 'String Function(String)' can't be assigned to a variable of type 'String Function(int)'.
         l2 = /*error:INVALID_ASSIGNMENT*/ /*@ returnType=String* */ (String x) =>
@@ -69,7 +69,7 @@
     };
   }
   {
-    (core::int*) →* core::String* l0 = (core::int* x) → core::Null? => null;
+    (core::int*) →* core::String* l0 = (core::int* x) → Null => null;
     (core::int*) →* core::String* l1 = (core::int* x) → core::String* => "hello";
     (core::int*) →* core::String* l2 = (core::int* x) → core::String* => let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:29:13: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
             3;
@@ -86,7 +86,7 @@
     };
   }
   {
-    (core::int*) →* core::List<core::String*>* l0 = (core::int* x) → core::Null? => null;
+    (core::int*) →* core::List<core::String*>* l0 = (core::int* x) → Null => null;
     (core::int*) →* core::List<core::String*>* l1 = (core::int* x) → core::List<core::String*>* => <core::String*>["hello"];
     (core::int*) →* core::List<core::String*>* l2 = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:42:76: Error: A value of type 'List<String> Function(String)' can't be assigned to a variable of type 'List<String> Function(int)'.
  - 'List' is from 'dart:core'.
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart b/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart
index 557c38e..11313d5 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart
@@ -9,7 +9,7 @@
   {
     String f<S>(int x) => null;
     var /*@ type=<S extends Object* = dynamic>(int*) ->* String* */ v = f;
-    v = <T> /*@ returnType=Null? */ (int x) => null;
+    v = <T> /*@ returnType=Null */ (int x) => null;
     v = <T> /*@ returnType=String* */ (int x) => "hello";
     v = /*error:INVALID_ASSIGNMENT*/ <T> /*@ returnType=String* */ (String x) =>
         "hello";
@@ -21,7 +21,7 @@
   {
     String f<S>(int x) => null;
     var /*@ type=<S extends Object* = dynamic>(int*) ->* String* */ v = f;
-    v = <T> /*@ returnType=Null? */ (/*@ type=int* */ x) => null;
+    v = <T> /*@ returnType=Null */ (/*@ type=int* */ x) => null;
     v = <T> /*@ returnType=String* */ (/*@ type=int* */ x) => "hello";
     v = /*info:INFERRED_TYPE_CLOSURE, error:INVALID_ASSIGNMENT*/ <
             T> /*@ returnType=String* */ (/*@ type=int* */ x) =>
@@ -36,7 +36,7 @@
   {
     List<String> f<S>(int x) => null;
     var /*@ type=<S extends Object* = dynamic>(int*) ->* List<String*>* */ v = f;
-    v = <T> /*@ returnType=Null? */ (int x) => null;
+    v = <T> /*@ returnType=Null */ (int x) => null;
     v = <T> /*@ returnType=List<String*>* */ (int x) => /*@ typeArgs=String* */ [
           "hello"
         ];
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.strong.expect
index ee90542..b3f94c4 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.strong.expect
@@ -56,7 +56,7 @@
     function f<S extends core::Object* = dynamic>(core::int* x) → core::String*
       return null;
     <S extends core::Object* = dynamic>(core::int*) →* core::String* v = f;
-    v = <T extends core::Object* = dynamic>(core::int* x) → core::Null? => null;
+    v = <T extends core::Object* = dynamic>(core::int* x) → Null => null;
     v = <T extends core::Object* = dynamic>(core::int* x) → core::String* => "hello";
     v = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:14:68: Error: A value of type 'String Function<T>(String)' can't be assigned to a variable of type 'String Function<S>(int)'.
     v = /*error:INVALID_ASSIGNMENT*/ <T> /*@ returnType=String* */ (String x) =>
@@ -74,7 +74,7 @@
     function f<S extends core::Object* = dynamic>(core::int* x) → core::String*
       return null;
     <S extends core::Object* = dynamic>(core::int*) →* core::String* v = f;
-    v = <T extends core::Object* = dynamic>(core::int* x) → core::Null? => null;
+    v = <T extends core::Object* = dynamic>(core::int* x) → Null => null;
     v = <T extends core::Object* = dynamic>(core::int* x) → core::String* => "hello";
     v = <T extends core::Object* = dynamic>(core::int* x) → core::String* => let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:28:9: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
         3;
@@ -94,7 +94,7 @@
     function f<S extends core::Object* = dynamic>(core::int* x) → core::List<core::String*>*
       return null;
     <S extends core::Object* = dynamic>(core::int*) →* core::List<core::String*>* v = f;
-    v = <T extends core::Object* = dynamic>(core::int* x) → core::Null? => null;
+    v = <T extends core::Object* = dynamic>(core::int* x) → Null => null;
     v = <T extends core::Object* = dynamic>(core::int* x) → core::List<core::String*>* => <core::String*>["hello"];
     v = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:43:75: Error: A value of type 'List<String> Function<T>(String)' can't be assigned to a variable of type 'List<String> Function<S>(int)'.
  - 'List' is from 'dart:core'.
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.strong.transformed.expect
index dfcc1ab..5fa06c8 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.strong.transformed.expect
@@ -56,7 +56,7 @@
     function f<S extends core::Object* = dynamic>(core::int* x) → core::String*
       return null;
     <S extends core::Object* = dynamic>(core::int*) →* core::String* v = f;
-    v = <T extends core::Object* = dynamic>(core::int* x) → core::Null? => null;
+    v = <T extends core::Object* = dynamic>(core::int* x) → Null => null;
     v = <T extends core::Object* = dynamic>(core::int* x) → core::String* => "hello";
     v = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:14:68: Error: A value of type 'String Function<T>(String)' can't be assigned to a variable of type 'String Function<S>(int)'.
     v = /*error:INVALID_ASSIGNMENT*/ <T> /*@ returnType=String* */ (String x) =>
@@ -74,7 +74,7 @@
     function f<S extends core::Object* = dynamic>(core::int* x) → core::String*
       return null;
     <S extends core::Object* = dynamic>(core::int*) →* core::String* v = f;
-    v = <T extends core::Object* = dynamic>(core::int* x) → core::Null? => null;
+    v = <T extends core::Object* = dynamic>(core::int* x) → Null => null;
     v = <T extends core::Object* = dynamic>(core::int* x) → core::String* => "hello";
     v = <T extends core::Object* = dynamic>(core::int* x) → core::String* => let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:28:9: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
         3;
@@ -94,7 +94,7 @@
     function f<S extends core::Object* = dynamic>(core::int* x) → core::List<core::String*>*
       return null;
     <S extends core::Object* = dynamic>(core::int*) →* core::List<core::String*>* v = f;
-    v = <T extends core::Object* = dynamic>(core::int* x) → core::Null? => null;
+    v = <T extends core::Object* = dynamic>(core::int* x) → Null => null;
     v = <T extends core::Object* = dynamic>(core::int* x) → core::List<core::String*>* => <core::String*>["hello"];
     v = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:43:75: Error: A value of type 'List<String> Function<T>(String)' can't be assigned to a variable of type 'List<String> Function<S>(int)'.
  - 'List' is from 'dart:core'.
diff --git a/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.strong.transformed.expect
index 2cef8c5..91c8102 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.strong.transformed.expect
@@ -139,10 +139,10 @@
   return :controller_stream;
 }
 static method bar() → core::Iterable<core::Map<core::int*, core::int*>*>* /* originally sync* */ {
-  function :sync_op_gen() → (core::_SyncIterator<dynamic>*) →* core::bool* {
+  function :sync_op_gen() → (core::_SyncIterator<dynamic>*, dynamic, dynamic) →* core::bool* {
     core::int* :await_jump_var = 0;
     dynamic :await_ctx_var;
-    return (core::_SyncIterator<dynamic>* :iterator) → core::bool* yielding {
+    function :sync_op(core::_SyncIterator<dynamic>* :iterator, dynamic :exception, dynamic :stack_trace) → core::bool* yielding {
       {
         {
           :iterator.{core::_SyncIterator::_current} = core::Map::•<core::int*, core::int*>();
@@ -170,7 +170,8 @@
         }
       }
       return false;
-    };
+    }
+    return :sync_op;
   }
   return new core::_SyncIterable::•<core::Map<core::int*, core::int*>*>(:sync_op_gen);
 }
diff --git a/pkg/front_end/testcases/inference/folder.options b/pkg/front_end/testcases/inference/folder.options
new file mode 100644
index 0000000..dbc148e
--- /dev/null
+++ b/pkg/front_end/testcases/inference/folder.options
@@ -0,0 +1 @@
+--enable-experiment=no-non-nullable
\ No newline at end of file
diff --git a/pkg/front_end/testcases/inference/for_each_downcast_iterable.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/for_each_downcast_iterable.dart.strong.transformed.expect
index 15e7182..7e9c9e0 100644
--- a/pkg/front_end/testcases/inference/for_each_downcast_iterable.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/for_each_downcast_iterable.dart.strong.transformed.expect
@@ -5,7 +5,8 @@
 import "dart:_internal" as _in;
 
 static method test() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic>* :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -30,7 +31,6 @@
         }
         {
           asy::Stream<dynamic>* :stream = o as{TypeError} asy::Stream<dynamic>*;
-          asy::_asyncStarListenHelper(:stream, :async_op);
           asy::_StreamIterator<dynamic>* :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
           try
             #L2:
@@ -62,7 +62,6 @@
         }
         {
           asy::Stream<dynamic>* :stream = o as{TypeError} asy::Stream<dynamic>*;
-          asy::_asyncStarListenHelper(:stream, :async_op);
           asy::_StreamIterator<dynamic>* :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
           try
             #L3:
@@ -85,16 +84,17 @@
             }
         }
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then.dart.strong.transformed.expect
index 15b315a..d5ab080 100644
--- a/pkg/front_end/testcases/inference/future_then.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then.dart.strong.transformed.expect
@@ -36,7 +36,8 @@
 static method test() → void {
   self::MyFuture<dynamic>* f;
   asy::Future<core::int*>* t1 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    final asy::_Future<core::int*>* :async_future = new asy::_Future::•<core::int*>();
+    core::bool* :is_sync = false;
     FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -52,20 +53,22 @@
           :return_value = _in::unsafeCast<core::int*>(:result);
           break #L1;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   });
   asy::Future<core::int*>* t2 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    final asy::_Future<core::int*>* :async_future = new asy::_Future::•<core::int*>();
+    core::bool* :is_sync = false;
     FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -81,20 +84,22 @@
           :return_value = _in::unsafeCast<core::int*>(:result);
           break #L2;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   });
   asy::Future<core::int*>* t3 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    final asy::_Future<core::int*>* :async_future = new asy::_Future::•<core::int*>();
+    core::bool* :is_sync = false;
     FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -108,20 +113,22 @@
           :return_value = 3;
           break #L3;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   });
   asy::Future<core::int*>* t4 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    final asy::_Future<core::int*>* :async_future = new asy::_Future::•<core::int*>();
+    core::bool* :is_sync = false;
     FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -135,24 +142,26 @@
           :return_value = 3;
           break #L4;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   });
   asy::Future<core::int*>* t5 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* => asy::Future::value<core::int*>(3));
   asy::Future<core::int*>* t6 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* {
     return asy::Future::value<core::int*>(3);
   });
   asy::Future<core::int*>* t7 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    final asy::_Future<core::int*>* :async_future = new asy::_Future::•<core::int*>();
+    core::bool* :is_sync = false;
     FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -166,20 +175,22 @@
           :return_value = asy::Future::value<core::int*>(3);
           break #L5;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   });
   asy::Future<core::int*>* t8 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    final asy::_Future<core::int*>* :async_future = new asy::_Future::•<core::int*>();
+    core::bool* :is_sync = false;
     FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -193,17 +204,18 @@
           :return_value = asy::Future::value<core::int*>(3);
           break #L6;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   });
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then_2.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_2.dart.strong.transformed.expect
index e5e7002..4e59f53 100644
--- a/pkg/front_end/testcases/inference/future_then_2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_2.dart.strong.transformed.expect
@@ -36,7 +36,8 @@
 static method test() → void {
   self::MyFuture<dynamic>* f;
   asy::Future<core::int*>* t1 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    final asy::_Future<core::int*>* :async_future = new asy::_Future::•<core::int*>();
+    core::bool* :is_sync = false;
     FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -52,20 +53,22 @@
           :return_value = _in::unsafeCast<core::int*>(:result);
           break #L1;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   });
   asy::Future<core::int*>* t2 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    final asy::_Future<core::int*>* :async_future = new asy::_Future::•<core::int*>();
+    core::bool* :is_sync = false;
     FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -81,20 +84,22 @@
           :return_value = _in::unsafeCast<core::int*>(:result);
           break #L2;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   });
   asy::Future<core::int*>* t3 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    final asy::_Future<core::int*>* :async_future = new asy::_Future::•<core::int*>();
+    core::bool* :is_sync = false;
     FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -108,20 +113,22 @@
           :return_value = 3;
           break #L3;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   });
   asy::Future<core::int*>* t4 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    final asy::_Future<core::int*>* :async_future = new asy::_Future::•<core::int*>();
+    core::bool* :is_sync = false;
     FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -135,24 +142,26 @@
           :return_value = 3;
           break #L4;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   });
   asy::Future<core::int*>* t5 = f.{self::MyFuture::then}<core::int*>((dynamic _) → self::MyFuture<core::int*>* => new self::MyFuture::value<core::int*>(3));
   asy::Future<core::int*>* t6 = f.{self::MyFuture::then}<core::int*>((dynamic _) → self::MyFuture<core::int*>* {
     return new self::MyFuture::value<core::int*>(3);
   });
   asy::Future<core::int*>* t7 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    final asy::_Future<core::int*>* :async_future = new asy::_Future::•<core::int*>();
+    core::bool* :is_sync = false;
     FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -166,20 +175,22 @@
           :return_value = new self::MyFuture::value<core::int*>(3);
           break #L5;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   });
   asy::Future<core::int*>* t8 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    final asy::_Future<core::int*>* :async_future = new asy::_Future::•<core::int*>();
+    core::bool* :is_sync = false;
     FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -193,17 +204,18 @@
           :return_value = new self::MyFuture::value<core::int*>(3);
           break #L6;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   });
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then_3.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_3.dart.strong.transformed.expect
index 9e2db60..d64e850 100644
--- a/pkg/front_end/testcases/inference/future_then_3.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_3.dart.strong.transformed.expect
@@ -36,7 +36,8 @@
 static method test() → void {
   self::MyFuture<dynamic>* f;
   self::MyFuture<core::int*>* t1 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    final asy::_Future<core::int*>* :async_future = new asy::_Future::•<core::int*>();
+    core::bool* :is_sync = false;
     FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -52,20 +53,22 @@
           :return_value = _in::unsafeCast<core::int*>(:result);
           break #L1;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   });
   self::MyFuture<core::int*>* t2 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    final asy::_Future<core::int*>* :async_future = new asy::_Future::•<core::int*>();
+    core::bool* :is_sync = false;
     FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -81,20 +84,22 @@
           :return_value = _in::unsafeCast<core::int*>(:result);
           break #L2;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   });
   self::MyFuture<core::int*>* t3 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    final asy::_Future<core::int*>* :async_future = new asy::_Future::•<core::int*>();
+    core::bool* :is_sync = false;
     FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -108,20 +113,22 @@
           :return_value = 3;
           break #L3;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   });
   self::MyFuture<core::int*>* t4 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    final asy::_Future<core::int*>* :async_future = new asy::_Future::•<core::int*>();
+    core::bool* :is_sync = false;
     FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -135,24 +142,26 @@
           :return_value = 3;
           break #L4;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   });
   self::MyFuture<core::int*>* t5 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* => asy::Future::value<core::int*>(3));
   self::MyFuture<core::int*>* t6 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* {
     return asy::Future::value<core::int*>(3);
   });
   self::MyFuture<core::int*>* t7 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    final asy::_Future<core::int*>* :async_future = new asy::_Future::•<core::int*>();
+    core::bool* :is_sync = false;
     FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -166,20 +175,22 @@
           :return_value = asy::Future::value<core::int*>(3);
           break #L5;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   });
   self::MyFuture<core::int*>* t8 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    final asy::_Future<core::int*>* :async_future = new asy::_Future::•<core::int*>();
+    core::bool* :is_sync = false;
     FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -193,17 +204,18 @@
           :return_value = asy::Future::value<core::int*>(3);
           break #L6;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   });
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then_4.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_4.dart.strong.transformed.expect
index c37addd..656e9a7 100644
--- a/pkg/front_end/testcases/inference/future_then_4.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_4.dart.strong.transformed.expect
@@ -36,7 +36,8 @@
 static method test() → void {
   self::MyFuture<dynamic>* f;
   self::MyFuture<core::int*>* t1 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    final asy::_Future<core::int*>* :async_future = new asy::_Future::•<core::int*>();
+    core::bool* :is_sync = false;
     FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -52,20 +53,22 @@
           :return_value = _in::unsafeCast<core::int*>(:result);
           break #L1;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   });
   self::MyFuture<core::int*>* t2 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    final asy::_Future<core::int*>* :async_future = new asy::_Future::•<core::int*>();
+    core::bool* :is_sync = false;
     FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -81,20 +84,22 @@
           :return_value = _in::unsafeCast<core::int*>(:result);
           break #L2;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   });
   self::MyFuture<core::int*>* t3 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    final asy::_Future<core::int*>* :async_future = new asy::_Future::•<core::int*>();
+    core::bool* :is_sync = false;
     FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -108,20 +113,22 @@
           :return_value = 3;
           break #L3;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   });
   self::MyFuture<core::int*>* t4 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    final asy::_Future<core::int*>* :async_future = new asy::_Future::•<core::int*>();
+    core::bool* :is_sync = false;
     FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -135,24 +142,26 @@
           :return_value = 3;
           break #L4;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   });
   self::MyFuture<core::int*>* t5 = f.{self::MyFuture::then}<core::int*>((dynamic _) → self::MyFuture<core::int*>* => new self::MyFuture::value<core::int*>(3));
   self::MyFuture<core::int*>* t6 = f.{self::MyFuture::then}<core::int*>((dynamic _) → self::MyFuture<core::int*>* {
     return new self::MyFuture::value<core::int*>(3);
   });
   self::MyFuture<core::int*>* t7 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    final asy::_Future<core::int*>* :async_future = new asy::_Future::•<core::int*>();
+    core::bool* :is_sync = false;
     FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -166,20 +175,22 @@
           :return_value = new self::MyFuture::value<core::int*>(3);
           break #L5;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   });
   self::MyFuture<core::int*>* t8 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    final asy::_Future<core::int*>* :async_future = new asy::_Future::•<core::int*>();
+    core::bool* :is_sync = false;
     FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -193,17 +204,18 @@
           :return_value = new self::MyFuture::value<core::int*>(3);
           break #L6;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   });
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then_5.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_5.dart.strong.transformed.expect
index 27c8361..5f08a16 100644
--- a/pkg/front_end/testcases/inference/future_then_5.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_5.dart.strong.transformed.expect
@@ -36,7 +36,8 @@
 static method test() → void {
   asy::Future<dynamic>* f;
   asy::Future<core::int*>* t1 = f.{asy::Future::then}<core::int*>((dynamic _) → asy::Future<core::int*>* /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    final asy::_Future<core::int*>* :async_future = new asy::_Future::•<core::int*>();
+    core::bool* :is_sync = false;
     FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -52,20 +53,22 @@
           :return_value = _in::unsafeCast<core::int*>(:result);
           break #L1;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   });
   asy::Future<core::int*>* t2 = f.{asy::Future::then}<core::int*>((dynamic _) → asy::Future<core::int*>* /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    final asy::_Future<core::int*>* :async_future = new asy::_Future::•<core::int*>();
+    core::bool* :is_sync = false;
     FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -81,20 +84,22 @@
           :return_value = _in::unsafeCast<core::int*>(:result);
           break #L2;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   });
   asy::Future<core::int*>* t3 = f.{asy::Future::then}<core::int*>((dynamic _) → asy::Future<core::int*>* /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    final asy::_Future<core::int*>* :async_future = new asy::_Future::•<core::int*>();
+    core::bool* :is_sync = false;
     FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -108,20 +113,22 @@
           :return_value = 3;
           break #L3;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   });
   asy::Future<core::int*>* t4 = f.{asy::Future::then}<core::int*>((dynamic _) → asy::Future<core::int*>* /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    final asy::_Future<core::int*>* :async_future = new asy::_Future::•<core::int*>();
+    core::bool* :is_sync = false;
     FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -135,24 +142,26 @@
           :return_value = 3;
           break #L4;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   });
   asy::Future<core::int*>* t5 = f.{asy::Future::then}<core::int*>((dynamic _) → self::MyFuture<core::int*>* => new self::MyFuture::value<core::int*>(3));
   asy::Future<core::int*>* t6 = f.{asy::Future::then}<core::int*>((dynamic _) → self::MyFuture<core::int*>* {
     return new self::MyFuture::value<core::int*>(3);
   });
   asy::Future<core::int*>* t7 = f.{asy::Future::then}<core::int*>((dynamic _) → asy::Future<core::int*>* /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    final asy::_Future<core::int*>* :async_future = new asy::_Future::•<core::int*>();
+    core::bool* :is_sync = false;
     FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -166,20 +175,22 @@
           :return_value = new self::MyFuture::value<core::int*>(3);
           break #L5;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   });
   asy::Future<core::int*>* t8 = f.{asy::Future::then}<core::int*>((dynamic _) → asy::Future<core::int*>* /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    final asy::_Future<core::int*>* :async_future = new asy::_Future::•<core::int*>();
+    core::bool* :is_sync = false;
     FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -193,17 +204,18 @@
           :return_value = new self::MyFuture::value<core::int*>(3);
           break #L6;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   });
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then_6.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_6.dart.strong.transformed.expect
index 25b8d87..6e05d10 100644
--- a/pkg/front_end/testcases/inference/future_then_6.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_6.dart.strong.transformed.expect
@@ -36,7 +36,8 @@
 static method test() → void {
   asy::Future<dynamic>* f;
   asy::Future<core::int*>* t1 = f.{asy::Future::then}<core::int*>((dynamic _) → asy::Future<core::int*>* /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    final asy::_Future<core::int*>* :async_future = new asy::_Future::•<core::int*>();
+    core::bool* :is_sync = false;
     FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -52,20 +53,22 @@
           :return_value = _in::unsafeCast<core::int*>(:result);
           break #L1;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   });
   asy::Future<core::int*>* t2 = f.{asy::Future::then}<core::int*>((dynamic _) → asy::Future<core::int*>* /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    final asy::_Future<core::int*>* :async_future = new asy::_Future::•<core::int*>();
+    core::bool* :is_sync = false;
     FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -81,20 +84,22 @@
           :return_value = _in::unsafeCast<core::int*>(:result);
           break #L2;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   });
   asy::Future<core::int*>* t3 = f.{asy::Future::then}<core::int*>((dynamic _) → asy::Future<core::int*>* /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    final asy::_Future<core::int*>* :async_future = new asy::_Future::•<core::int*>();
+    core::bool* :is_sync = false;
     FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -108,20 +113,22 @@
           :return_value = 3;
           break #L3;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   });
   asy::Future<core::int*>* t4 = f.{asy::Future::then}<core::int*>((dynamic _) → asy::Future<core::int*>* /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    final asy::_Future<core::int*>* :async_future = new asy::_Future::•<core::int*>();
+    core::bool* :is_sync = false;
     FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -135,24 +142,26 @@
           :return_value = 3;
           break #L4;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   });
   asy::Future<core::int*>* t5 = f.{asy::Future::then}<core::int*>((dynamic _) → asy::Future<core::int*>* => asy::Future::value<core::int*>(3));
   asy::Future<core::int*>* t6 = f.{asy::Future::then}<core::int*>((dynamic _) → asy::Future<core::int*>* {
     return asy::Future::value<core::int*>(3);
   });
   asy::Future<core::int*>* t7 = f.{asy::Future::then}<core::int*>((dynamic _) → asy::Future<core::int*>* /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    final asy::_Future<core::int*>* :async_future = new asy::_Future::•<core::int*>();
+    core::bool* :is_sync = false;
     FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -166,20 +175,22 @@
           :return_value = asy::Future::value<core::int*>(3);
           break #L5;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   });
   asy::Future<core::int*>* t8 = f.{asy::Future::then}<core::int*>((dynamic _) → asy::Future<core::int*>* /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    final asy::_Future<core::int*>* :async_future = new asy::_Future::•<core::int*>();
+    core::bool* :is_sync = false;
     FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -193,17 +204,18 @@
           :return_value = asy::Future::value<core::int*>(3);
           break #L6;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   });
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then_conditional.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional.dart.strong.transformed.expect
index 9be32a1..97390dc 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional.dart.strong.transformed.expect
@@ -36,7 +36,8 @@
 static method test() → void {
   self::MyFuture<core::bool*>* f;
   asy::Future<core::int*>* t1 = f.{self::MyFuture::then}<core::int*>((core::bool* x) → asy::Future<core::int*>* /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    final asy::_Future<core::int*>* :async_future = new asy::_Future::•<core::int*>();
+    core::bool* :is_sync = false;
     FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -59,20 +60,22 @@
           :return_value = :async_temporary_0;
           break #L1;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   });
   asy::Future<core::int*>* t2 = f.{self::MyFuture::then}<core::int*>((core::bool* x) → FutureOr<core::int*>* /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    final asy::_Future<core::int*>* :async_future = new asy::_Future::•<core::int*>();
+    core::bool* :is_sync = false;
     FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -88,17 +91,18 @@
           :return_value = (_in::unsafeCast<core::bool*>(:result) ?{core::Object*} 2 : asy::Future::value<core::int*>(3)) as{TypeError} FutureOr<core::int*>*;
           break #L2;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   });
   asy::Future<core::int*>* t5 = f.{self::MyFuture::then}<core::int*>((core::bool* x) → FutureOr<core::int*>* => (x ?{core::Object*} 2 : asy::Future::value<core::int*>(3)) as{TypeError} FutureOr<core::int*>*);
   asy::Future<core::int*>* t6 = f.{self::MyFuture::then}<core::int*>((core::bool* x) → FutureOr<core::int*>* {
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_2.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional_2.dart.strong.transformed.expect
index 4067e3e..7e7583e 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_2.dart.strong.transformed.expect
@@ -36,7 +36,8 @@
 static method test() → void {
   self::MyFuture<core::bool*>* f;
   asy::Future<core::int*>* t1 = f.{self::MyFuture::then}<core::int*>((core::bool* x) → asy::Future<core::int*>* /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    final asy::_Future<core::int*>* :async_future = new asy::_Future::•<core::int*>();
+    core::bool* :is_sync = false;
     FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -59,20 +60,22 @@
           :return_value = :async_temporary_0;
           break #L1;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   });
   asy::Future<core::int*>* t2 = f.{self::MyFuture::then}<core::int*>((core::bool* x) → FutureOr<core::int*>* /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    final asy::_Future<core::int*>* :async_future = new asy::_Future::•<core::int*>();
+    core::bool* :is_sync = false;
     FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -88,17 +91,18 @@
           :return_value = (_in::unsafeCast<core::bool*>(:result) ?{core::Object*} 2 : new self::MyFuture::value<core::int*>(3)) as{TypeError} FutureOr<core::int*>*;
           break #L2;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   });
   asy::Future<core::int*>* t5 = f.{self::MyFuture::then}<core::int*>((core::bool* x) → FutureOr<core::int*>* => (x ?{core::Object*} 2 : new self::MyFuture::value<core::int*>(3)) as{TypeError} FutureOr<core::int*>*);
   asy::Future<core::int*>* t6 = f.{self::MyFuture::then}<core::int*>((core::bool* x) → FutureOr<core::int*>* {
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_3.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional_3.dart.strong.transformed.expect
index 63fe450..b8e8643 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_3.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_3.dart.strong.transformed.expect
@@ -36,7 +36,8 @@
 static method test() → void {
   self::MyFuture<core::bool*>* f;
   self::MyFuture<core::int*>* t1 = f.{self::MyFuture::then}<core::int*>((core::bool* x) → asy::Future<core::int*>* /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    final asy::_Future<core::int*>* :async_future = new asy::_Future::•<core::int*>();
+    core::bool* :is_sync = false;
     FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -59,20 +60,22 @@
           :return_value = :async_temporary_0;
           break #L1;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   });
   self::MyFuture<core::int*>* t2 = f.{self::MyFuture::then}<core::int*>((core::bool* x) → FutureOr<core::int*>* /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    final asy::_Future<core::int*>* :async_future = new asy::_Future::•<core::int*>();
+    core::bool* :is_sync = false;
     FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -88,17 +91,18 @@
           :return_value = (_in::unsafeCast<core::bool*>(:result) ?{core::Object*} 2 : asy::Future::value<core::int*>(3)) as{TypeError} FutureOr<core::int*>*;
           break #L2;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   });
   self::MyFuture<core::int*>* t5 = f.{self::MyFuture::then}<core::int*>((core::bool* x) → FutureOr<core::int*>* => (x ?{core::Object*} 2 : asy::Future::value<core::int*>(3)) as{TypeError} FutureOr<core::int*>*);
   self::MyFuture<core::int*>* t6 = f.{self::MyFuture::then}<core::int*>((core::bool* x) → FutureOr<core::int*>* {
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_4.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional_4.dart.strong.transformed.expect
index a51edd8..dbf053f 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_4.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_4.dart.strong.transformed.expect
@@ -36,7 +36,8 @@
 static method test() → void {
   self::MyFuture<core::bool*>* f;
   self::MyFuture<core::int*>* t1 = f.{self::MyFuture::then}<core::int*>((core::bool* x) → asy::Future<core::int*>* /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    final asy::_Future<core::int*>* :async_future = new asy::_Future::•<core::int*>();
+    core::bool* :is_sync = false;
     FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -59,20 +60,22 @@
           :return_value = :async_temporary_0;
           break #L1;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   });
   self::MyFuture<core::int*>* t2 = f.{self::MyFuture::then}<core::int*>((core::bool* x) → FutureOr<core::int*>* /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    final asy::_Future<core::int*>* :async_future = new asy::_Future::•<core::int*>();
+    core::bool* :is_sync = false;
     FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -88,17 +91,18 @@
           :return_value = (_in::unsafeCast<core::bool*>(:result) ?{core::Object*} 2 : new self::MyFuture::value<core::int*>(3)) as{TypeError} FutureOr<core::int*>*;
           break #L2;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   });
   self::MyFuture<core::int*>* t5 = f.{self::MyFuture::then}<core::int*>((core::bool* x) → FutureOr<core::int*>* => (x ?{core::Object*} 2 : new self::MyFuture::value<core::int*>(3)) as{TypeError} FutureOr<core::int*>*);
   self::MyFuture<core::int*>* t6 = f.{self::MyFuture::then}<core::int*>((core::bool* x) → FutureOr<core::int*>* {
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_5.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional_5.dart.strong.transformed.expect
index 584f94a..f0ab4cd 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_5.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_5.dart.strong.transformed.expect
@@ -36,7 +36,8 @@
 static method test() → void {
   asy::Future<core::bool*>* f;
   asy::Future<core::int*>* t1 = f.{asy::Future::then}<core::int*>((core::bool* x) → asy::Future<core::int*>* /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    final asy::_Future<core::int*>* :async_future = new asy::_Future::•<core::int*>();
+    core::bool* :is_sync = false;
     FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -59,20 +60,22 @@
           :return_value = :async_temporary_0;
           break #L1;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   });
   asy::Future<core::int*>* t2 = f.{asy::Future::then}<core::int*>((core::bool* x) → FutureOr<core::int*>* /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    final asy::_Future<core::int*>* :async_future = new asy::_Future::•<core::int*>();
+    core::bool* :is_sync = false;
     FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -88,17 +91,18 @@
           :return_value = (_in::unsafeCast<core::bool*>(:result) ?{core::Object*} 2 : new self::MyFuture::value<core::int*>(3)) as{TypeError} FutureOr<core::int*>*;
           break #L2;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   });
   asy::Future<core::int*>* t5 = f.{asy::Future::then}<core::int*>((core::bool* x) → FutureOr<core::int*>* => (x ?{core::Object*} 2 : new self::MyFuture::value<core::int*>(3)) as{TypeError} FutureOr<core::int*>*);
   asy::Future<core::int*>* t6 = f.{asy::Future::then}<core::int*>((core::bool* x) → FutureOr<core::int*>* {
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_6.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional_6.dart.strong.transformed.expect
index e7d7fe7..27e32cf 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_6.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_6.dart.strong.transformed.expect
@@ -36,7 +36,8 @@
 static method test() → void {
   asy::Future<core::bool*>* f;
   asy::Future<core::int*>* t1 = f.{asy::Future::then}<core::int*>((core::bool* x) → asy::Future<core::int*>* /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    final asy::_Future<core::int*>* :async_future = new asy::_Future::•<core::int*>();
+    core::bool* :is_sync = false;
     FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -59,20 +60,22 @@
           :return_value = :async_temporary_0;
           break #L1;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   });
   asy::Future<core::int*>* t2 = f.{asy::Future::then}<core::int*>((core::bool* x) → FutureOr<core::int*>* /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    final asy::_Future<core::int*>* :async_future = new asy::_Future::•<core::int*>();
+    core::bool* :is_sync = false;
     FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -88,17 +91,18 @@
           :return_value = (_in::unsafeCast<core::bool*>(:result) ?{core::Object*} 2 : asy::Future::value<core::int*>(3)) as{TypeError} FutureOr<core::int*>*;
           break #L2;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   });
   asy::Future<core::int*>* t5 = f.{asy::Future::then}<core::int*>((core::bool* x) → FutureOr<core::int*>* => (x ?{core::Object*} 2 : asy::Future::value<core::int*>(3)) as{TypeError} FutureOr<core::int*>*);
   asy::Future<core::int*>* t6 = f.{asy::Future::then}<core::int*>((core::bool* x) → FutureOr<core::int*>* {
diff --git a/pkg/front_end/testcases/inference/future_then_downwards_method_target.dart b/pkg/front_end/testcases/inference/future_then_downwards_method_target.dart
index ecf97aa..93827b6 100644
--- a/pkg/front_end/testcases/inference/future_then_downwards_method_target.dart
+++ b/pkg/front_end/testcases/inference/future_then_downwards_method_target.dart
@@ -13,7 +13,7 @@
       . /*@ typeArgs=List<dynamic>* */ /*@target=Future.then*/ then(
           /*@ returnType=List<dynamic>* */ (/*@ type=int* */ x) => /*@ typeArgs=dynamic */ [])
       . /*@target=Future.whenComplete*/ whenComplete(
-          /*@ returnType=Null? */ () {});
+          /*@ returnType=Null */ () {});
   b = f. /*@ typeArgs=List<int*>* */ /*@target=Future.then*/ then(
       /*@ returnType=List<int*>* */ (/*@ type=int* */ x) => /*@ typeArgs=int* */ []);
 }
diff --git a/pkg/front_end/testcases/inference/future_then_downwards_method_target.dart.strong.expect b/pkg/front_end/testcases/inference/future_then_downwards_method_target.dart.strong.expect
index e129de8..fb4af0a 100644
--- a/pkg/front_end/testcases/inference/future_then_downwards_method_target.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_then_downwards_method_target.dart.strong.expect
@@ -7,7 +7,7 @@
 
 static method test() → dynamic {
   asy::Future<core::int*>* f;
-  asy::Future<core::List<core::int*>*>* b = f.{asy::Future::then}<core::List<dynamic>*>((core::int* x) → core::List<dynamic>* => <dynamic>[]).{asy::Future::whenComplete}(() → core::Null? {}) as{TypeError} asy::Future<core::List<core::int*>*>*;
+  asy::Future<core::List<core::int*>*>* b = f.{asy::Future::then}<core::List<dynamic>*>((core::int* x) → core::List<dynamic>* => <dynamic>[]).{asy::Future::whenComplete}(() → Null {}) as{TypeError} asy::Future<core::List<core::int*>*>*;
   b = f.{asy::Future::then}<core::List<core::int*>*>((core::int* x) → core::List<core::int*>* => <core::int*>[]);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then_downwards_method_target.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_downwards_method_target.dart.strong.transformed.expect
index e129de8..fb4af0a 100644
--- a/pkg/front_end/testcases/inference/future_then_downwards_method_target.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_downwards_method_target.dart.strong.transformed.expect
@@ -7,7 +7,7 @@
 
 static method test() → dynamic {
   asy::Future<core::int*>* f;
-  asy::Future<core::List<core::int*>*>* b = f.{asy::Future::then}<core::List<dynamic>*>((core::int* x) → core::List<dynamic>* => <dynamic>[]).{asy::Future::whenComplete}(() → core::Null? {}) as{TypeError} asy::Future<core::List<core::int*>*>*;
+  asy::Future<core::List<core::int*>*>* b = f.{asy::Future::then}<core::List<dynamic>*>((core::int* x) → core::List<dynamic>* => <dynamic>[]).{asy::Future::whenComplete}(() → Null {}) as{TypeError} asy::Future<core::List<core::int*>*>*;
   b = f.{asy::Future::then}<core::List<core::int*>*>((core::int* x) → core::List<core::int*>* => <core::int*>[]);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then_ifNull.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_ifNull.dart.strong.transformed.expect
index debc669..0ffe085 100644
--- a/pkg/front_end/testcases/inference/future_then_ifNull.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_ifNull.dart.strong.transformed.expect
@@ -36,7 +36,8 @@
 static method test() → void {
   self::MyFuture<core::int*>* f;
   asy::Future<core::int*>* t1 = f.{self::MyFuture::then}<core::int*>((core::int* x) → asy::Future<core::int*>* /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    final asy::_Future<core::int*>* :async_future = new asy::_Future::•<core::int*>();
+    core::bool* :is_sync = false;
     FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -60,20 +61,22 @@
           :return_value = :async_temporary_0;
           break #L1;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   });
   asy::Future<core::int*>* t2 = f.{self::MyFuture::then}<core::int*>((core::int* x) → FutureOr<core::int*>* /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    final asy::_Future<core::int*>* :async_future = new asy::_Future::•<core::int*>();
+    core::bool* :is_sync = false;
     FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -89,17 +92,18 @@
           :return_value = (let final core::int* #t4 = _in::unsafeCast<core::int*>(:result) in #t4.{core::num::==}(null) ?{core::Object*} asy::Future::value<core::int*>(3) : #t4) as{TypeError} FutureOr<core::int*>*;
           break #L2;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   });
   asy::Future<core::int*>* t5 = f.{self::MyFuture::then}<core::int*>((core::int* x) → FutureOr<core::int*>* => (let final core::int* #t5 = x in #t5.{core::num::==}(null) ?{core::Object*} asy::Future::value<core::int*>(3) : #t5) as{TypeError} FutureOr<core::int*>*);
   asy::Future<core::int*>* t6 = f.{self::MyFuture::then}<core::int*>((core::int* x) → FutureOr<core::int*>* {
diff --git a/pkg/front_end/testcases/inference/future_union_async_conditional.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_union_async_conditional.dart.strong.transformed.expect
index 19d7f5e..cf08d88 100644
--- a/pkg/front_end/testcases/inference/future_union_async_conditional.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_async_conditional.dart.strong.transformed.expect
@@ -33,7 +33,8 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C9, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C10: onTimeout}))) as{TypeError,ForDynamic} asy::Future<self::MyFuture::T*>*;
 }
 static method g1(core::bool* x) → asy::Future<core::int*>* /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+  final asy::_Future<core::int*>* :async_future = new asy::_Future::•<core::int*>();
+  core::bool* :is_sync = false;
   FutureOr<core::int*>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -47,20 +48,22 @@
         :return_value = (x ?{core::Object*} 42 : asy::Future::value<core::int*>(42)) as{TypeError} FutureOr<core::int*>*;
         break #L1;
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method g2(core::bool* x) → asy::Future<core::int*>* /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+  final asy::_Future<core::int*>* :async_future = new asy::_Future::•<core::int*>();
+  core::bool* :is_sync = false;
   FutureOr<core::int*>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -74,20 +77,22 @@
         :return_value = (x ?{core::Object*} 42 : asy::Future::value<core::int*>(42)) as{TypeError} FutureOr<core::int*>*;
         break #L2;
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method g3(core::bool* x) → asy::Future<core::int*>* /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+  final asy::_Future<core::int*>* :async_future = new asy::_Future::•<core::int*>();
+  core::bool* :is_sync = false;
   FutureOr<core::int*>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -102,17 +107,18 @@
         :return_value = y as{TypeError} FutureOr<core::int*>*;
         break #L3;
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method main() → dynamic {}
 
diff --git a/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.strong.transformed.expect
index fac7441..eae9737 100644
--- a/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.strong.transformed.expect
@@ -33,7 +33,8 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C9, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C10: onTimeout}))) as{TypeError,ForDynamic} asy::Future<self::MyFuture::T*>*;
 }
 static method g1(core::bool* x) → asy::Future<core::int*>* /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+  final asy::_Future<core::int*>* :async_future = new asy::_Future::•<core::int*>();
+  core::bool* :is_sync = false;
   FutureOr<core::int*>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -47,20 +48,22 @@
         :return_value = (x ?{core::Object*} 42 : new self::MyFuture::value<core::int*>(42)) as{TypeError} FutureOr<core::int*>*;
         break #L1;
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method g2(core::bool* x) → asy::Future<core::int*>* /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+  final asy::_Future<core::int*>* :async_future = new asy::_Future::•<core::int*>();
+  core::bool* :is_sync = false;
   FutureOr<core::int*>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -74,20 +77,22 @@
         :return_value = (x ?{core::Object*} 42 : new self::MyFuture::value<core::int*>(42)) as{TypeError} FutureOr<core::int*>*;
         break #L2;
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method g3(core::bool* x) → asy::Future<core::int*>* /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+  final asy::_Future<core::int*>* :async_future = new asy::_Future::•<core::int*>();
+  core::bool* :is_sync = false;
   FutureOr<core::int*>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -102,17 +107,18 @@
         :return_value = y as{TypeError} FutureOr<core::int*>*;
         break #L3;
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method main() → dynamic {}
 
diff --git a/pkg/front_end/testcases/inference/future_union_downwards.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards.dart.strong.transformed.expect
index b3b21ee..b26d359 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards.dart.strong.transformed.expect
@@ -45,7 +45,8 @@
                                               ^" in "hi" as{TypeError} FutureOr<core::int*>?));
 static field asy::Future<core::List<core::int*>*>* t2 = self::f.{self::MyFuture::then}<core::List<core::int*>*>((dynamic _) → core::List<core::int*>* => <core::int*>[3]);
 static method g2() → asy::Future<core::List<core::int*>*>* /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::List<core::int*>*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::List<core::int*>*>();
+  final asy::_Future<core::List<core::int*>*>* :async_future = new asy::_Future::•<core::List<core::int*>*>();
+  core::bool* :is_sync = false;
   FutureOr<core::List<core::int*>*>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -59,20 +60,22 @@
         :return_value = <core::int*>[3];
         break #L1;
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method g3() → asy::Future<core::List<core::int*>*>* /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::List<core::int*>*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::List<core::int*>*>();
+  final asy::_Future<core::List<core::int*>*>* :async_future = new asy::_Future::•<core::List<core::int*>*>();
+  core::bool* :is_sync = false;
   FutureOr<core::List<core::int*>*>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -86,17 +89,18 @@
         :return_value = asy::Future::value<core::List<core::int*>*>(<core::int*>[3]);
         break #L2;
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method main() → dynamic {}
 
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_2.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards_2.dart.strong.transformed.expect
index 08408e4..223a03e 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_2.dart.strong.transformed.expect
@@ -36,7 +36,8 @@
 static field asy::Future<core::int*>* t1 = self::f.{self::MyFuture::then}<core::int*>((dynamic _) → self::MyFuture<core::int*>* => new self::MyFuture::value<core::int*>("hi"));
 static field asy::Future<core::List<core::int*>*>* t2 = self::f.{self::MyFuture::then}<core::List<core::int*>*>((dynamic _) → core::List<core::int*>* => <core::int*>[3]);
 static method g2() → asy::Future<core::List<core::int*>*>* /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::List<core::int*>*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::List<core::int*>*>();
+  final asy::_Future<core::List<core::int*>*>* :async_future = new asy::_Future::•<core::List<core::int*>*>();
+  core::bool* :is_sync = false;
   FutureOr<core::List<core::int*>*>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -50,20 +51,22 @@
         :return_value = <core::int*>[3];
         break #L1;
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method g3() → asy::Future<core::List<core::int*>*>* /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::List<core::int*>*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::List<core::int*>*>();
+  final asy::_Future<core::List<core::int*>*>* :async_future = new asy::_Future::•<core::List<core::int*>*>();
+  core::bool* :is_sync = false;
   FutureOr<core::List<core::int*>*>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -77,17 +80,18 @@
         :return_value = new self::MyFuture::value<core::List<core::int*>*>(<core::int*>[3]);
         break #L2;
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method main() → dynamic {}
 
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_3.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards_3.dart.strong.transformed.expect
index 1a3f92b..083d7a2 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_3.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_3.dart.strong.transformed.expect
@@ -45,7 +45,8 @@
                                               ^" in "hi" as{TypeError} FutureOr<core::int*>?));
 static field asy::Future<core::List<core::int*>*>* t2 = self::f.{asy::Future::then}<core::List<core::int*>*>((dynamic _) → core::List<core::int*>* => <core::int*>[3]);
 static method g2() → asy::Future<core::List<core::int*>*>* /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::List<core::int*>*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::List<core::int*>*>();
+  final asy::_Future<core::List<core::int*>*>* :async_future = new asy::_Future::•<core::List<core::int*>*>();
+  core::bool* :is_sync = false;
   FutureOr<core::List<core::int*>*>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -59,20 +60,22 @@
         :return_value = <core::int*>[3];
         break #L1;
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method g3() → asy::Future<core::List<core::int*>*>* /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::List<core::int*>*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::List<core::int*>*>();
+  final asy::_Future<core::List<core::int*>*>* :async_future = new asy::_Future::•<core::List<core::int*>*>();
+  core::bool* :is_sync = false;
   FutureOr<core::List<core::int*>*>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -86,17 +89,18 @@
         :return_value = asy::Future::value<core::List<core::int*>*>(<core::int*>[3]);
         break #L2;
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method main() → dynamic {}
 
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_4.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards_4.dart.strong.transformed.expect
index 578bc3b..31ccfda 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_4.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_4.dart.strong.transformed.expect
@@ -36,7 +36,8 @@
 static field asy::Future<core::int*>* t1 = self::f.{asy::Future::then}<core::int*>((dynamic _) → self::MyFuture<core::int*>* => new self::MyFuture::value<core::int*>("hi"));
 static field asy::Future<core::List<core::int*>*>* t2 = self::f.{asy::Future::then}<core::List<core::int*>*>((dynamic _) → core::List<core::int*>* => <core::int*>[3]);
 static method g2() → asy::Future<core::List<core::int*>*>* /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::List<core::int*>*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::List<core::int*>*>();
+  final asy::_Future<core::List<core::int*>*>* :async_future = new asy::_Future::•<core::List<core::int*>*>();
+  core::bool* :is_sync = false;
   FutureOr<core::List<core::int*>*>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -50,20 +51,22 @@
         :return_value = <core::int*>[3];
         break #L1;
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method g3() → asy::Future<core::List<core::int*>*>* /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::List<core::int*>*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::List<core::int*>*>();
+  final asy::_Future<core::List<core::int*>*>* :async_future = new asy::_Future::•<core::List<core::int*>*>();
+  core::bool* :is_sync = false;
   FutureOr<core::List<core::int*>*>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -77,17 +80,18 @@
         :return_value = new self::MyFuture::value<core::List<core::int*>*>(<core::int*>[3]);
         break #L2;
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method main() → dynamic {}
 
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_future_return.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_future_return.dart.strong.transformed.expect
index a3dd074..9eb7030 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_future_return.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_future_return.dart.strong.transformed.expect
@@ -22,7 +22,8 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 static method foo() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic>* :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -39,16 +40,17 @@
         [yield] let dynamic #t1 = asy::_awaitHelper(asy::Future::wait<core::List<self::A*>*>(<asy::Future<core::List<self::A*>*>*>[f1, f2]), :async_op_then, :async_op_error, :async_op) in null;
         core::List<core::List<self::A*>*>* merged = _in::unsafeCast<core::List<core::List<self::A*>*>>(:result);
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.strong.transformed.expect
index 3529676..b214c57 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.strong.transformed.expect
@@ -9,7 +9,8 @@
 static method id<T extends core::Object* = dynamic>(self::id::T* x) → self::id::T*
   return x;
 static method test() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic>* :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -25,16 +26,17 @@
         [yield] let dynamic #t1 = asy::_awaitHelper(self::id<FutureOr<core::String*>*>(f), :async_op_then, :async_op_error, :async_op) in null;
         core::String* s = _in::unsafeCast<core::String*>(:result);
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.strong.transformed.expect
index 129197b..fee2dcd 100644
--- a/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.strong.transformed.expect
@@ -32,7 +32,8 @@
     ;
 }
 static method main() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic>* :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -54,15 +55,16 @@
         core::List<self::A*>* list = result;
         list = result2;
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
diff --git a/pkg/front_end/testcases/inference/generic_methods_uses_greatest_lower_bound.dart b/pkg/front_end/testcases/inference/generic_methods_uses_greatest_lower_bound.dart
index 34aede8..a68f5bd 100644
--- a/pkg/front_end/testcases/inference/generic_methods_uses_greatest_lower_bound.dart
+++ b/pkg/front_end/testcases/inference/generic_methods_uses_greatest_lower_bound.dart
@@ -12,6 +12,6 @@
 
 main() {
   var /*@ type=(num*) ->* List<int*>* */ v = /*@ typeArgs=(num*) ->* List<int*>* */ generic(
-      /*@ returnType=Null? */ (F f) => null,
-      /*@ returnType=Null? */ (G g) => null);
+      /*@ returnType=Null */ (F f) => null,
+      /*@ returnType=Null */ (G g) => null);
 }
diff --git a/pkg/front_end/testcases/inference/generic_methods_uses_greatest_lower_bound.dart.strong.expect b/pkg/front_end/testcases/inference/generic_methods_uses_greatest_lower_bound.dart.strong.expect
index 4a105fb..868f419 100644
--- a/pkg/front_end/testcases/inference/generic_methods_uses_greatest_lower_bound.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_uses_greatest_lower_bound.dart.strong.expect
@@ -7,5 +7,5 @@
 static method generic<T extends core::Object* = dynamic>((self::generic::T*) →* dynamic a, (self::generic::T*) →* dynamic b) → self::generic::T*
   return null;
 static method main() → dynamic {
-  (core::num*) →* core::List<core::int*>* v = self::generic<(core::num*) →* core::List<core::int*>*>(((core::int*) →* core::Iterable<core::num*>* f) → core::Null? => null, ((core::double*) →* core::List<core::int*>* g) → core::Null? => null);
+  (core::num*) →* core::List<core::int*>* v = self::generic<(core::num*) →* core::List<core::int*>*>(((core::int*) →* core::Iterable<core::num*>* f) → Null => null, ((core::double*) →* core::List<core::int*>* g) → Null => null);
 }
diff --git a/pkg/front_end/testcases/inference/generic_methods_uses_greatest_lower_bound.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_uses_greatest_lower_bound.dart.strong.transformed.expect
index 4a105fb..868f419 100644
--- a/pkg/front_end/testcases/inference/generic_methods_uses_greatest_lower_bound.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_uses_greatest_lower_bound.dart.strong.transformed.expect
@@ -7,5 +7,5 @@
 static method generic<T extends core::Object* = dynamic>((self::generic::T*) →* dynamic a, (self::generic::T*) →* dynamic b) → self::generic::T*
   return null;
 static method main() → dynamic {
-  (core::num*) →* core::List<core::int*>* v = self::generic<(core::num*) →* core::List<core::int*>*>(((core::int*) →* core::Iterable<core::num*>* f) → core::Null? => null, ((core::double*) →* core::List<core::int*>* g) → core::Null? => null);
+  (core::num*) →* core::List<core::int*>* v = self::generic<(core::num*) →* core::List<core::int*>*>(((core::int*) →* core::Iterable<core::num*>* f) → Null => null, ((core::double*) →* core::List<core::int*>* g) → Null => null);
 }
diff --git a/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.expect b/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.expect
index f090cb7..9e8e6e1 100644
--- a/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.expect
@@ -137,13 +137,17 @@
  - 'Set' is from 'dart:core'.
  - 'List' is from 'dart:core'.
   c1 = /*error:INVALID_ASSIGNMENT*/ /*@typeArgs=dynamic*/ {};
-                                                          ^" in (let final core::Set<dynamic>* #t5 = col::LinkedHashSet::•<dynamic>() in #t5) as{TypeError} core::List<dynamic>*;
+                                                          ^" in ( block {
+    final core::Set<dynamic>* #t5 = col::LinkedHashSet::•<dynamic>();
+  } =>#t5) as{TypeError} core::List<dynamic>*;
   self::c2 = <dynamic>[];
   self::c2 = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:43:59: Error: A value of type 'Set<dynamic>' can't be assigned to a variable of type 'List<dynamic>'.
  - 'Set' is from 'dart:core'.
  - 'List' is from 'dart:core'.
   c2 = /*error:INVALID_ASSIGNMENT*/ /*@typeArgs=dynamic*/ {};
-                                                          ^" in (let final core::Set<dynamic>* #t7 = col::LinkedHashSet::•<dynamic>() in #t7) as{TypeError} core::List<dynamic>*;
+                                                          ^" in ( block {
+    final core::Set<dynamic>* #t7 = col::LinkedHashSet::•<dynamic>();
+  } =>#t7) as{TypeError} core::List<dynamic>*;
   self::d = <dynamic, dynamic>{};
   self::d = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:45:36: Error: A value of type 'int' can't be assigned to a variable of type 'Map<dynamic, dynamic>'.
  - 'Map' is from 'dart:core'.
diff --git a/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.transformed.expect
index 544c4cb..1879718 100644
--- a/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.transformed.expect
@@ -137,13 +137,17 @@
  - 'Set' is from 'dart:core'.
  - 'List' is from 'dart:core'.
   c1 = /*error:INVALID_ASSIGNMENT*/ /*@typeArgs=dynamic*/ {};
-                                                          ^" in (let final core::Set<dynamic>* #t5 = new col::_CompactLinkedHashSet::•<dynamic>() in #t5) as{TypeError} core::List<dynamic>*;
+                                                          ^" in ( block {
+    final core::Set<dynamic>* #t5 = new col::_CompactLinkedHashSet::•<dynamic>();
+  } =>#t5) as{TypeError} core::List<dynamic>*;
   self::c2 = <dynamic>[];
   self::c2 = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:43:59: Error: A value of type 'Set<dynamic>' can't be assigned to a variable of type 'List<dynamic>'.
  - 'Set' is from 'dart:core'.
  - 'List' is from 'dart:core'.
   c2 = /*error:INVALID_ASSIGNMENT*/ /*@typeArgs=dynamic*/ {};
-                                                          ^" in (let final core::Set<dynamic>* #t7 = new col::_CompactLinkedHashSet::•<dynamic>() in #t7) as{TypeError} core::List<dynamic>*;
+                                                          ^" in ( block {
+    final core::Set<dynamic>* #t7 = new col::_CompactLinkedHashSet::•<dynamic>();
+  } =>#t7) as{TypeError} core::List<dynamic>*;
   self::d = <dynamic, dynamic>{};
   self::d = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:45:36: Error: A value of type 'int' can't be assigned to a variable of type 'Map<dynamic, dynamic>'.
  - 'Map' is from 'dart:core'.
diff --git a/pkg/front_end/testcases/inference/infer_local_function_return_type.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_local_function_return_type.dart.strong.transformed.expect
index f330a82..c1b45ec 100644
--- a/pkg/front_end/testcases/inference/infer_local_function_return_type.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_local_function_return_type.dart.strong.transformed.expect
@@ -7,7 +7,8 @@
   function f0() → core::int*
     return 42;
   function f1() → asy::Future<core::int*>* /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    final asy::_Future<core::int*>* :async_future = new asy::_Future::•<core::int*>();
+    core::bool* :is_sync = false;
     FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -21,23 +22,25 @@
           :return_value = 42;
           break #L1;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   }
   function f2() → core::int* {
     return 42;
   }
   function f3() → asy::Future<core::int*>* /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    final asy::_Future<core::int*>* :async_future = new asy::_Future::•<core::int*>();
+    core::bool* :is_sync = false;
     FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -51,23 +54,24 @@
           :return_value = 42;
           break #L2;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   }
   function f4() → core::Iterable<core::int*>* /* originally sync* */ {
-    function :sync_op_gen() → (core::_SyncIterator<dynamic>*) →* core::bool* {
+    function :sync_op_gen() → (core::_SyncIterator<dynamic>*, dynamic, dynamic) →* core::bool* {
       core::int* :await_jump_var = 0;
       dynamic :await_ctx_var;
-      return (core::_SyncIterator<dynamic>* :iterator) → core::bool* yielding {
+      function :sync_op(core::_SyncIterator<dynamic>* :iterator, dynamic :exception, dynamic :stack_trace) → core::bool* yielding {
         {
           {
             :iterator.{core::_SyncIterator::_current} = 42;
@@ -75,7 +79,8 @@
           }
         }
         return false;
-      };
+      }
+      return :sync_op;
     }
     return new core::_SyncIterable::•<core::int*>(:sync_op_gen);
   }
diff --git a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.strong.transformed.expect
index 85200d2..7ef736b 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.strong.transformed.expect
@@ -56,7 +56,8 @@
     : super core::Object::•()
     ;
   method foo(generic-covariant-impl self::Bar::T* t) → dynamic /* originally async */ {
-    final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    final asy::_Future<dynamic>* :async_future = new asy::_Future::•<dynamic>();
+    core::bool* :is_sync = false;
     FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -73,7 +74,6 @@
         {
           {
             self::Bar::T* :stream = t;
-            asy::_asyncStarListenHelper(:stream, :async_op);
             asy::_StreamIterator<core::String*>* :for-iterator = new asy::_StreamIterator::•<core::String*>(:stream);
             try
               #L2:
@@ -98,17 +98,18 @@
               }
           }
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   }
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -126,7 +127,8 @@
     : super core::Object::•()
     ;
   method foo(generic-covariant-impl self::Baz::S* t) → dynamic /* originally async */ {
-    final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    final asy::_Future<dynamic>* :async_future = new asy::_Future::•<dynamic>();
+    core::bool* :is_sync = false;
     FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -143,7 +145,6 @@
         {
           {
             self::Baz::S* :stream = t;
-            asy::_asyncStarListenHelper(:stream, :async_op);
             asy::_StreamIterator<self::Baz::T*>* :for-iterator = new asy::_StreamIterator::•<self::Baz::T*>(:stream);
             try
               #L4:
@@ -169,17 +170,18 @@
               }
           }
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   }
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -244,7 +246,8 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 static method test() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic>* :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -262,7 +265,6 @@
         self::MyStream<self::Foo*>* myStream = self::MyStream::•<self::Foo*>();
         {
           self::MyStream<self::Foo*>* :stream = myStream;
-          asy::_asyncStarListenHelper(:stream, :async_op);
           asy::_StreamIterator<self::Foo*>* :for-iterator = new asy::_StreamIterator::•<self::Foo*>(:stream);
           try
             #L6:
@@ -289,7 +291,6 @@
         }
         {
           self::MyStream<self::Foo*>* :stream = myStream;
-          asy::_asyncStarListenHelper(:stream, :async_op);
           asy::_StreamIterator<dynamic>* :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
           try
             #L7:
@@ -313,7 +314,6 @@
         }
         {
           self::MyStream<self::Foo*>* :stream = myStream;
-          asy::_asyncStarListenHelper(:stream, :async_op);
           asy::_StreamIterator<self::Foo*>* :for-iterator = new asy::_StreamIterator::•<self::Foo*>(:stream);
           try
             #L8:
@@ -343,7 +343,6 @@
         dynamic z;
         {
           self::MyStream<self::Foo*>* :stream = myStream;
-          asy::_asyncStarListenHelper(:stream, :async_op);
           asy::_StreamIterator<self::Foo*>* :for-iterator = new asy::_StreamIterator::•<self::Foo*>(:stream);
           try
             #L9:
@@ -369,7 +368,6 @@
         asy::Stream<dynamic>* stream = myStream;
         {
           asy::Stream<dynamic>* :stream = stream;
-          asy::_asyncStarListenHelper(:stream, :async_op);
           asy::_StreamIterator<dynamic>* :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
           try
             #L10:
@@ -395,7 +393,6 @@
         dynamic stream2 = myStream;
         {
           asy::Stream<dynamic>* :stream = stream2 as{TypeError,ForDynamic} asy::Stream<dynamic>*;
-          asy::_asyncStarListenHelper(:stream, :async_op);
           asy::_StreamIterator<dynamic>* :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
           try
             #L11:
@@ -426,7 +423,6 @@
  - 'Stream' is from 'dart:async'.
   await for (var /*@ type=dynamic */ x in /*error:FOR_IN_OF_INVALID_TYPE*/ map) {
                                                                            ^" in map as{TypeError} asy::Stream<dynamic>*;
-          asy::_asyncStarListenHelper(:stream, :async_op);
           asy::_StreamIterator<dynamic>* :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
           try
             #L12:
@@ -449,17 +445,18 @@
             }
         }
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method main() → dynamic {}
 
diff --git a/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return.dart b/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return.dart
index f1fd89e..23dc5b6 100644
--- a/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return.dart
+++ b/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return.dart
@@ -6,5 +6,5 @@
 library test;
 
 main() {
-  var /*@ type=() ->* Null? */ f = /*@ returnType=Null? */ () {};
+  var /*@ type=() ->* Null */ f = /*@ returnType=Null */ () {};
 }
diff --git a/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return.dart.strong.expect b/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return.dart.strong.expect
index 64040c7..8ee4d33 100644
--- a/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return.dart.strong.expect
@@ -1,7 +1,6 @@
 library test;
 import self as self;
-import "dart:core" as core;
 
 static method main() → dynamic {
-  () →* core::Null? f = () → core::Null? {};
+  () →* Null f = () → Null {};
 }
diff --git a/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return.dart.strong.transformed.expect
index 64040c7..8ee4d33 100644
--- a/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return.dart.strong.transformed.expect
@@ -1,7 +1,6 @@
 library test;
 import self as self;
-import "dart:core" as core;
 
 static method main() → dynamic {
-  () →* core::Null? f = () → core::Null? {};
+  () →* Null f = () → Null {};
 }
diff --git a/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return_void_context.dart b/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return_void_context.dart
index 0d24e42..ffe8964 100644
--- a/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return_void_context.dart
+++ b/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return_void_context.dart
@@ -10,5 +10,5 @@
 }
 
 main() {
-  var /*@ type=C* */ c = new C(/*@ returnType=Null? */ () {});
+  var /*@ type=C* */ c = new C(/*@ returnType=Null */ () {});
 }
diff --git a/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return_void_context.dart.strong.expect b/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return_void_context.dart.strong.expect
index 9bda853..21efe4c 100644
--- a/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return_void_context.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return_void_context.dart.strong.expect
@@ -17,5 +17,5 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 static method main() → dynamic {
-  self::C* c = new self::C::•(() → core::Null? {});
+  self::C* c = new self::C::•(() → Null {});
 }
diff --git a/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return_void_context.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return_void_context.dart.strong.transformed.expect
index 9bda853..21efe4c 100644
--- a/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return_void_context.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return_void_context.dart.strong.transformed.expect
@@ -17,5 +17,5 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 static method main() → dynamic {
-  self::C* c = new self::C::•(() → core::Null? {});
+  self::C* c = new self::C::•(() → Null {});
 }
diff --git a/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart b/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart
index d4a8217..c332b1a 100644
--- a/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart
+++ b/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart
@@ -6,7 +6,7 @@
 library test;
 
 class C<T> {
-  void Function(T) f<U>(U x) => /*@ returnType=Null? */ (/*@ type=C::T* */ y) {};
+  void Function(T) f<U>(U x) => /*@ returnType=Null */ (/*@ type=C::T* */ y) {};
 }
 
 void test(C<String> c) {
diff --git a/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.strong.expect b/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.strong.expect
index dcd0fc2..eb193d3 100644
--- a/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.strong.expect
@@ -7,7 +7,7 @@
     : super core::Object::•()
     ;
   method f<U extends core::Object* = dynamic>(self::C::f::U* x) → (self::C::T*) →* void
-    return (self::C::T* y) → core::Null? {};
+    return (self::C::T* y) → Null {};
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.strong.transformed.expect
index dcd0fc2..eb193d3 100644
--- a/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.strong.transformed.expect
@@ -7,7 +7,7 @@
     : super core::Object::•()
     ;
   method f<U extends core::Object* = dynamic>(self::C::f::U* x) → (self::C::T*) →* void
-    return (self::C::T* y) → core::Null? {};
+    return (self::C::T* y) → Null {};
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/inference/list_literals_can_infer_null_bottom.dart b/pkg/front_end/testcases/inference/list_literals_can_infer_null_bottom.dart
index 405c751..5358324 100644
--- a/pkg/front_end/testcases/inference/list_literals_can_infer_null_bottom.dart
+++ b/pkg/front_end/testcases/inference/list_literals_can_infer_null_bottom.dart
@@ -6,7 +6,7 @@
 library test;
 
 test1() {
-  var /*@ type=List<Null?>* */ x = /*@ typeArgs=Null? */ [null];
+  var /*@ type=List<Null>* */ x = /*@ typeArgs=Null */ [null];
   x. /*@target=List.add*/ add(/*error:INVALID_CAST_LITERAL*/ 42);
 }
 
diff --git a/pkg/front_end/testcases/inference/list_literals_can_infer_null_bottom.dart.strong.expect b/pkg/front_end/testcases/inference/list_literals_can_infer_null_bottom.dart.strong.expect
index dafc04b..56e22ce 100644
--- a/pkg/front_end/testcases/inference/list_literals_can_infer_null_bottom.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/list_literals_can_infer_null_bottom.dart.strong.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static method test1() → dynamic {
-  core::List<core::Null?>* x = <core::Null?>[null];
-  x.{core::List::add}(42 as{TypeError} core::Null?);
+  core::List<Null>* x = <Null>[null];
+  x.{core::List::add}(42 as{TypeError} Null);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/list_literals_can_infer_null_bottom.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/list_literals_can_infer_null_bottom.dart.strong.transformed.expect
index dafc04b..56e22ce 100644
--- a/pkg/front_end/testcases/inference/list_literals_can_infer_null_bottom.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/list_literals_can_infer_null_bottom.dart.strong.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static method test1() → dynamic {
-  core::List<core::Null?>* x = <core::Null?>[null];
-  x.{core::List::add}(42 as{TypeError} core::Null?);
+  core::List<Null>* x = <Null>[null];
+  x.{core::List::add}(42 as{TypeError} Null);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/local_return_and_yield.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/local_return_and_yield.dart.strong.transformed.expect
index 61d7ab7..273bbbe 100644
--- a/pkg/front_end/testcases/inference/local_return_and_yield.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/local_return_and_yield.dart.strong.transformed.expect
@@ -19,7 +19,8 @@
     return (core::int* x) → core::int* => x;
   }
   function b() → asy::Future<(core::int*) →* core::int*>* /* originally async */ {
-    final asy::_AsyncAwaitCompleter<(core::int*) →* core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<(core::int*) →* core::int*>();
+    final asy::_Future<(core::int*) →* core::int*>* :async_future = new asy::_Future::•<(core::int*) →* core::int*>();
+    core::bool* :is_sync = false;
     FutureOr<(core::int*) →* core::int*>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -36,23 +37,24 @@
                                      ^" in ((dynamic x) → dynamic => x) as{TypeError} FutureOr<(core::int*) →* core::int*>*;
           break #L1;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   }
   function c() → core::Iterable<(core::int*) →* core::int*>* /* originally sync* */ {
-    function :sync_op_gen() → (core::_SyncIterator<dynamic>*) →* core::bool* {
+    function :sync_op_gen() → (core::_SyncIterator<dynamic>*, dynamic, dynamic) →* core::bool* {
       core::int* :await_jump_var = 0;
       dynamic :await_ctx_var;
-      return (core::_SyncIterator<dynamic>* :iterator) → core::bool* yielding {
+      function :sync_op(core::_SyncIterator<dynamic>* :iterator, dynamic :exception, dynamic :stack_trace) → core::bool* yielding {
         {
           {
             :iterator.{core::_SyncIterator::_current} = (core::int* x) → core::int* => x;
@@ -60,15 +62,16 @@
           }
         }
         return false;
-      };
+      }
+      return :sync_op;
     }
     return new core::_SyncIterable::•<(core::int*) →* core::int*>(:sync_op_gen);
   }
   function d() → core::Iterable<(core::int*) →* core::int*>* /* originally sync* */ {
-    function :sync_op_gen() → (core::_SyncIterator<dynamic>*) →* core::bool* {
+    function :sync_op_gen() → (core::_SyncIterator<dynamic>*, dynamic, dynamic) →* core::bool* {
       core::int* :await_jump_var = 0;
       dynamic :await_ctx_var;
-      return (core::_SyncIterator<dynamic>* :iterator) → core::bool* yielding {
+      function :sync_op(core::_SyncIterator<dynamic>* :iterator, dynamic :exception, dynamic :stack_trace) → core::bool* yielding {
         {
           {
             :iterator.{core::_SyncIterator::_yieldEachIterable} = <(core::int*) →* core::int*>[(core::int* x) → core::int* => x];
@@ -76,7 +79,8 @@
           }
         }
         return false;
-      };
+      }
+      return :sync_op;
     }
     return new core::_SyncIterable::•<(core::int*) →* core::int*>(:sync_op_gen);
   }
diff --git a/pkg/front_end/testcases/inference/map_literals_can_infer_null.dart b/pkg/front_end/testcases/inference/map_literals_can_infer_null.dart
index 744f9e2..e98f54e 100644
--- a/pkg/front_end/testcases/inference/map_literals_can_infer_null.dart
+++ b/pkg/front_end/testcases/inference/map_literals_can_infer_null.dart
@@ -6,7 +6,7 @@
 library test;
 
 test1() {
-  var /*@ type=Map<Null?, Null?>* */ x = /*@ typeArgs=Null?, Null? */ {null: null};
+  var /*@ type=Map<Null, Null>* */ x = /*@ typeArgs=Null, Null */ {null: null};
   x /*@target=Map.[]=*/ [
       /*error:INVALID_CAST_LITERAL*/ 3] = /*error:INVALID_CAST_LITERAL*/ 'z';
 }
diff --git a/pkg/front_end/testcases/inference/map_literals_can_infer_null.dart.strong.expect b/pkg/front_end/testcases/inference/map_literals_can_infer_null.dart.strong.expect
index 38d6f76..a14b93f 100644
--- a/pkg/front_end/testcases/inference/map_literals_can_infer_null.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/map_literals_can_infer_null.dart.strong.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static method test1() → dynamic {
-  core::Map<core::Null?, core::Null?>* x = <core::Null?, core::Null?>{null: null};
-  x.{core::Map::[]=}(3 as{TypeError} core::Null?, "z" as{TypeError} core::Null?);
+  core::Map<Null, Null>* x = <Null, Null>{null: null};
+  x.{core::Map::[]=}(3 as{TypeError} Null, "z" as{TypeError} Null);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/map_literals_can_infer_null.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/map_literals_can_infer_null.dart.strong.transformed.expect
index 38d6f76..a14b93f 100644
--- a/pkg/front_end/testcases/inference/map_literals_can_infer_null.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/map_literals_can_infer_null.dart.strong.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static method test1() → dynamic {
-  core::Map<core::Null?, core::Null?>* x = <core::Null?, core::Null?>{null: null};
-  x.{core::Map::[]=}(3 as{TypeError} core::Null?, "z" as{TypeError} core::Null?);
+  core::Map<Null, Null>* x = <Null, Null>{null: null};
+  x.{core::Map::[]=}(3 as{TypeError} Null, "z" as{TypeError} Null);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_4.dart b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_4.dart
new file mode 100644
index 0000000..a24f92f
--- /dev/null
+++ b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_4.dart
@@ -0,0 +1,14 @@
+// Copyright (c) 2020, 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.
+
+class I<X> {}
+
+class M0<X, Y extends void Function({String name})> extends I<X> {}
+
+class M1 implements I<int> {}
+
+// M0 is inferred as M0<int, void Function({String name})>
+class A extends M1 with M0 {}
+
+main() {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_4.dart.outline.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_4.dart.outline.expect
new file mode 100644
index 0000000..a94c66e
--- /dev/null
+++ b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_4.dart.outline.expect
@@ -0,0 +1,47 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class I<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::X*>*
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class M0<X extends core::Object* = dynamic, Y extends ({name: core::String*}) →* void = ({name: core::String*}) →* void> extends self::I<self::M0::X*> {
+  synthetic constructor •() → self::M0<self::M0::X*, self::M0::Y*>*
+    ;
+}
+class M1 extends core::Object implements self::I<core::int*> {
+  synthetic constructor •() → self::M1*
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _A&M1&M0 = self::M1 with self::M0<core::int*, ({name: core::String*}) →* void> /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_A&M1&M0*
+    : super self::M1::•()
+    ;
+}
+class A extends self::_A&M1&M0 {
+  synthetic constructor •() → self::A*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_4.dart.strong.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_4.dart.strong.expect
new file mode 100644
index 0000000..f7381da
--- /dev/null
+++ b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_4.dart.strong.expect
@@ -0,0 +1,50 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class I<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::X*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class M0<X extends core::Object* = dynamic, Y extends ({name: core::String*}) →* void = ({name: core::String*}) →* void> extends self::I<self::M0::X*> {
+  synthetic constructor •() → self::M0<self::M0::X*, self::M0::Y*>*
+    : super self::I::•()
+    ;
+}
+class M1 extends core::Object implements self::I<core::int*> {
+  synthetic constructor •() → self::M1*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _A&M1&M0 = self::M1 with self::M0<core::int*, ({name: core::String*}) →* void> /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_A&M1&M0*
+    : super self::M1::•()
+    ;
+}
+class A extends self::_A&M1&M0 {
+  synthetic constructor •() → self::A*
+    : super self::_A&M1&M0::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_4.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_4.dart.strong.transformed.expect
new file mode 100644
index 0000000..5237b52
--- /dev/null
+++ b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_4.dart.strong.transformed.expect
@@ -0,0 +1,50 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class I<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::X*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class M0<X extends core::Object* = dynamic, Y extends ({name: core::String*}) →* void = ({name: core::String*}) →* void> extends self::I<self::M0::X*> {
+  synthetic constructor •() → self::M0<self::M0::X*, self::M0::Y*>*
+    : super self::I::•()
+    ;
+}
+class M1 extends core::Object implements self::I<core::int*> {
+  synthetic constructor •() → self::M1*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _A&M1&M0 extends self::M1 implements self::M0<core::int*, ({name: core::String*}) →* void> /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_A&M1&M0*
+    : super self::M1::•()
+    ;
+}
+class A extends self::_A&M1&M0 {
+  synthetic constructor •() → self::A*
+    : super self::_A&M1&M0::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_4.dart.textual_outline.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_4.dart.textual_outline.expect
new file mode 100644
index 0000000..01ac810
--- /dev/null
+++ b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_4.dart.textual_outline.expect
@@ -0,0 +1,9 @@
+class I<X> {}
+
+class M0<X, Y extends void Function({String name})> extends I<X> {}
+
+class M1 implements I<int> {}
+
+class A extends M1 with M0 {}
+
+main() {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_4.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_4.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..761ffaf
--- /dev/null
+++ b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_4.dart.textual_outline_modelled.expect
@@ -0,0 +1,9 @@
+class A extends M1 with M0 {}
+
+class I<X> {}
+
+class M0<X, Y extends void Function({String name})> extends I<X> {}
+
+class M1 implements I<int> {}
+
+main() {}
diff --git a/pkg/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart b/pkg/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart
index 42550db..4ee6f9f 100644
--- a/pkg/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart
+++ b/pkg/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart
@@ -9,10 +9,10 @@
 void foo(int f(Object _)) {}
 
 test() {
-  var /*@ type=(Object*) ->* Null? */ f = /*@ returnType=Null? */ (Object x) => null;
+  var /*@ type=(Object*) ->* Null */ f = /*@ returnType=Null */ (Object x) => null;
   String y = /*info:DYNAMIC_CAST*/ f(42);
 
-  f = /*@ returnType=Null? */ (/*@ type=Object* */ x) => 'hello';
+  f = /*@ returnType=Null */ (/*@ type=Object* */ x) => 'hello';
 
   var /*@ type=dynamic */ g = null;
   g = 'hello';
@@ -21,7 +21,7 @@
   h = 'hello';
   (/*info:DYNAMIC_INVOKE*/ h.foo());
 
-  foo(/*@ returnType=Null? */ (/*@ type=Object* */ x) => null);
+  foo(/*@ returnType=Null */ (/*@ type=Object* */ x) => null);
   foo(/*@ returnType=<BottomType> */ (/*@ type=Object* */ x) =>
       throw "not implemented");
 }
diff --git a/pkg/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart.strong.expect b/pkg/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart.strong.expect
index 20b5208..adf4727 100644
--- a/pkg/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart.strong.expect
@@ -5,15 +5,15 @@
 static field dynamic h = null;
 static method foo((core::Object*) →* core::int* f) → void {}
 static method test() → dynamic {
-  (core::Object*) →* core::Null? f = (core::Object* x) → core::Null? => null;
+  (core::Object*) →* Null f = (core::Object* x) → Null => null;
   core::String* y = f.call(42);
-  f = (core::Object* x) → core::Null? => "hello" as{TypeError} core::Null?;
+  f = (core::Object* x) → Null => "hello" as{TypeError} Null;
   dynamic g = null;
   g = "hello";
   g.foo();
   self::h = "hello";
   self::h.foo();
-  self::foo((core::Object* x) → core::Null? => null);
+  self::foo((core::Object* x) → Null => null);
   self::foo((core::Object* x) → <BottomType>=> throw "not implemented");
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart.strong.transformed.expect
index 20b5208..adf4727 100644
--- a/pkg/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart.strong.transformed.expect
@@ -5,15 +5,15 @@
 static field dynamic h = null;
 static method foo((core::Object*) →* core::int* f) → void {}
 static method test() → dynamic {
-  (core::Object*) →* core::Null? f = (core::Object* x) → core::Null? => null;
+  (core::Object*) →* Null f = (core::Object* x) → Null => null;
   core::String* y = f.call(42);
-  f = (core::Object* x) → core::Null? => "hello" as{TypeError} core::Null?;
+  f = (core::Object* x) → Null => "hello" as{TypeError} Null;
   dynamic g = null;
   g = "hello";
   g.foo();
   self::h = "hello";
   self::h.foo();
-  self::foo((core::Object* x) → core::Null? => null);
+  self::foo((core::Object* x) → Null => null);
   self::foo((core::Object* x) → <BottomType>=> throw "not implemented");
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/override_equals.dart.outline.expect b/pkg/front_end/testcases/inference/override_equals.dart.outline.expect
index f4c4777..cf84f5e 100644
--- a/pkg/front_end/testcases/inference/override_equals.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/override_equals.dart.outline.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → self::NullEquality*
     ;
   @core::override
-  operator ==(core::Object* other) → core::Null?
+  operator ==(core::Object* other) → Null
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
diff --git a/pkg/front_end/testcases/inference/override_equals.dart.strong.expect b/pkg/front_end/testcases/inference/override_equals.dart.strong.expect
index 6ebf410..6f3dcc4 100644
--- a/pkg/front_end/testcases/inference/override_equals.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/override_equals.dart.strong.expect
@@ -7,7 +7,7 @@
     : super core::Object::•()
     ;
   @#C1
-  operator ==(core::Object* other) → core::Null?
+  operator ==(core::Object* other) → Null
     return null;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
diff --git a/pkg/front_end/testcases/inference/override_equals.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/override_equals.dart.strong.transformed.expect
index 6ebf410..6f3dcc4 100644
--- a/pkg/front_end/testcases/inference/override_equals.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/override_equals.dart.strong.transformed.expect
@@ -7,7 +7,7 @@
     : super core::Object::•()
     ;
   @#C1
-  operator ==(core::Object* other) → core::Null?
+  operator ==(core::Object* other) → Null
     return null;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
diff --git a/pkg/front_end/testcases/inference/parameter_defaults_downwards.dart b/pkg/front_end/testcases/inference/parameter_defaults_downwards.dart
index b0671b2..0cfa3ae 100644
--- a/pkg/front_end/testcases/inference/parameter_defaults_downwards.dart
+++ b/pkg/front_end/testcases/inference/parameter_defaults_downwards.dart
@@ -12,8 +12,8 @@
 main() {
   void optional_local([List<int> x = /*@ typeArgs=int* */ const []]) {}
   void named_local({List<int> x: /*@ typeArgs=int* */ const []}) {}
-  var /*@ type=([List<int*>*]) ->* Null? */ optional_closure = /*@ returnType=Null? */ (
+  var /*@ type=([List<int*>*]) ->* Null */ optional_closure = /*@ returnType=Null */ (
       [List<int> x = /*@ typeArgs=int* */ const []]) {};
-  var /*@ type=({x: List<int*>*}) ->* Null? */ name_closure = /*@ returnType=Null? */ (
+  var /*@ type=({x: List<int*>*}) ->* Null */ name_closure = /*@ returnType=Null */ (
       {List<int> x: /*@ typeArgs=int* */ const []}) {};
 }
diff --git a/pkg/front_end/testcases/inference/parameter_defaults_downwards.dart.strong.expect b/pkg/front_end/testcases/inference/parameter_defaults_downwards.dart.strong.expect
index 0c97dce..b20f8c7 100644
--- a/pkg/front_end/testcases/inference/parameter_defaults_downwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/parameter_defaults_downwards.dart.strong.expect
@@ -7,8 +7,8 @@
 static method main() → dynamic {
   function optional_local([core::List<core::int*>* x = #C1]) → void {}
   function named_local({core::List<core::int*>* x = #C1}) → void {}
-  ([core::List<core::int*>*]) →* core::Null? optional_closure = ([core::List<core::int*>* x = #C1]) → core::Null? {};
-  ({x: core::List<core::int*>*}) →* core::Null? name_closure = ({core::List<core::int*>* x = #C1}) → core::Null? {};
+  ([core::List<core::int*>*]) →* Null optional_closure = ([core::List<core::int*>* x = #C1]) → Null {};
+  ({x: core::List<core::int*>*}) →* Null name_closure = ({core::List<core::int*>* x = #C1}) → Null {};
 }
 
 constants  {
diff --git a/pkg/front_end/testcases/inference/parameter_defaults_downwards.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/parameter_defaults_downwards.dart.strong.transformed.expect
index 0c97dce..b20f8c7 100644
--- a/pkg/front_end/testcases/inference/parameter_defaults_downwards.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/parameter_defaults_downwards.dart.strong.transformed.expect
@@ -7,8 +7,8 @@
 static method main() → dynamic {
   function optional_local([core::List<core::int*>* x = #C1]) → void {}
   function named_local({core::List<core::int*>* x = #C1}) → void {}
-  ([core::List<core::int*>*]) →* core::Null? optional_closure = ([core::List<core::int*>* x = #C1]) → core::Null? {};
-  ({x: core::List<core::int*>*}) →* core::Null? name_closure = ({core::List<core::int*>* x = #C1}) → core::Null? {};
+  ([core::List<core::int*>*]) →* Null optional_closure = ([core::List<core::int*>* x = #C1]) → Null {};
+  ({x: core::List<core::int*>*}) →* Null name_closure = ({core::List<core::int*>* x = #C1}) → Null {};
 }
 
 constants  {
diff --git a/pkg/front_end/testcases/inference/parameter_defaults_upwards.dart b/pkg/front_end/testcases/inference/parameter_defaults_upwards.dart
index ce97e95..ece9a42 100644
--- a/pkg/front_end/testcases/inference/parameter_defaults_upwards.dart
+++ b/pkg/front_end/testcases/inference/parameter_defaults_upwards.dart
@@ -26,9 +26,9 @@
   var /*@ type=C<dynamic>* */ c_named_local =
       new /*@ typeArgs=dynamic */ C.named(named_local);
   var /*@ type=C<dynamic>* */ c_optional_closure =
-      new /*@ typeArgs=dynamic */ C.optional(/*@ returnType=Null? */ (
+      new /*@ typeArgs=dynamic */ C.optional(/*@ returnType=Null */ (
           [/*@ type=dynamic */ x = /*@ typeArgs=int* */ const [0]]) {});
   var /*@ type=C<dynamic>* */ c_named_closure = new /*@ typeArgs=dynamic */ C.named(
-      /*@ returnType=Null? */ (
+      /*@ returnType=Null */ (
           {/*@ type=dynamic */ x: /*@ typeArgs=int* */ const [0]}) {});
 }
diff --git a/pkg/front_end/testcases/inference/parameter_defaults_upwards.dart.strong.expect b/pkg/front_end/testcases/inference/parameter_defaults_upwards.dart.strong.expect
index 3526aad..af395c5 100644
--- a/pkg/front_end/testcases/inference/parameter_defaults_upwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/parameter_defaults_upwards.dart.strong.expect
@@ -27,8 +27,8 @@
   self::C<dynamic>* c_named_toplevel = new self::C::named<dynamic>(#C4);
   self::C<dynamic>* c_optional_local = new self::C::optional<dynamic>(optional_local);
   self::C<dynamic>* c_named_local = new self::C::named<dynamic>(named_local);
-  self::C<dynamic>* c_optional_closure = new self::C::optional<dynamic>(([dynamic x = #C2]) → core::Null? {});
-  self::C<dynamic>* c_named_closure = new self::C::named<dynamic>(({dynamic x = #C2}) → core::Null? {});
+  self::C<dynamic>* c_optional_closure = new self::C::optional<dynamic>(([dynamic x = #C2]) → Null {});
+  self::C<dynamic>* c_named_closure = new self::C::named<dynamic>(({dynamic x = #C2}) → Null {});
 }
 
 constants  {
diff --git a/pkg/front_end/testcases/inference/parameter_defaults_upwards.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/parameter_defaults_upwards.dart.strong.transformed.expect
index 3526aad..af395c5 100644
--- a/pkg/front_end/testcases/inference/parameter_defaults_upwards.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/parameter_defaults_upwards.dart.strong.transformed.expect
@@ -27,8 +27,8 @@
   self::C<dynamic>* c_named_toplevel = new self::C::named<dynamic>(#C4);
   self::C<dynamic>* c_optional_local = new self::C::optional<dynamic>(optional_local);
   self::C<dynamic>* c_named_local = new self::C::named<dynamic>(named_local);
-  self::C<dynamic>* c_optional_closure = new self::C::optional<dynamic>(([dynamic x = #C2]) → core::Null? {});
-  self::C<dynamic>* c_named_closure = new self::C::named<dynamic>(({dynamic x = #C2}) → core::Null? {});
+  self::C<dynamic>* c_optional_closure = new self::C::optional<dynamic>(([dynamic x = #C2]) → Null {});
+  self::C<dynamic>* c_named_closure = new self::C::named<dynamic>(({dynamic x = #C2}) → Null {});
 }
 
 constants  {
diff --git a/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.strong.transformed.expect
index e58866d..0028ef6 100644
--- a/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.strong.transformed.expect
@@ -18,7 +18,8 @@
   return (core::int* x) → core::int* => x;
 }
 static method b() → asy::Future<(core::int*) →* core::int*>* /* originally async */ {
-  final asy::_AsyncAwaitCompleter<(core::int*) →* core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<(core::int*) →* core::int*>();
+  final asy::_Future<(core::int*) →* core::int*>* :async_future = new asy::_Future::•<(core::int*) →* core::int*>();
+  core::bool* :is_sync = false;
   FutureOr<(core::int*) →* core::int*>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -35,23 +36,24 @@
                                    ^" in ((dynamic x) → dynamic => x) as{TypeError} FutureOr<(core::int*) →* core::int*>*;
         break #L1;
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method c() → core::Iterable<(core::int*) →* core::int*>* /* originally sync* */ {
-  function :sync_op_gen() → (core::_SyncIterator<dynamic>*) →* core::bool* {
+  function :sync_op_gen() → (core::_SyncIterator<dynamic>*, dynamic, dynamic) →* core::bool* {
     core::int* :await_jump_var = 0;
     dynamic :await_ctx_var;
-    return (core::_SyncIterator<dynamic>* :iterator) → core::bool* yielding {
+    function :sync_op(core::_SyncIterator<dynamic>* :iterator, dynamic :exception, dynamic :stack_trace) → core::bool* yielding {
       {
         {
           :iterator.{core::_SyncIterator::_current} = (core::int* x) → core::int* => x;
@@ -59,15 +61,16 @@
         }
       }
       return false;
-    };
+    }
+    return :sync_op;
   }
   return new core::_SyncIterable::•<(core::int*) →* core::int*>(:sync_op_gen);
 }
 static method d() → core::Iterable<(core::int*) →* core::int*>* /* originally sync* */ {
-  function :sync_op_gen() → (core::_SyncIterator<dynamic>*) →* core::bool* {
+  function :sync_op_gen() → (core::_SyncIterator<dynamic>*, dynamic, dynamic) →* core::bool* {
     core::int* :await_jump_var = 0;
     dynamic :await_ctx_var;
-    return (core::_SyncIterator<dynamic>* :iterator) → core::bool* yielding {
+    function :sync_op(core::_SyncIterator<dynamic>* :iterator, dynamic :exception, dynamic :stack_trace) → core::bool* yielding {
       {
         {
           :iterator.{core::_SyncIterator::_yieldEachIterable} = <(core::int*) →* core::int*>[(core::int* x) → core::int* => x];
@@ -75,7 +78,8 @@
         }
       }
       return false;
-    };
+    }
+    return :sync_op;
   }
   return new core::_SyncIterable::•<(core::int*) →* core::int*>(:sync_op_gen);
 }
diff --git a/pkg/front_end/testcases/inference/type_promotion_stopped_by_access_in_a_closure.dart b/pkg/front_end/testcases/inference/type_promotion_stopped_by_access_in_a_closure.dart
index 747ad06..fab3f55 100644
--- a/pkg/front_end/testcases/inference/type_promotion_stopped_by_access_in_a_closure.dart
+++ b/pkg/front_end/testcases/inference/type_promotion_stopped_by_access_in_a_closure.dart
@@ -9,7 +9,7 @@
   num n = null;
   if (n is int) {
     var /*@ type=num* */ i = n;
-    /*@ returnType=Null? */ () {
+    /*@ returnType=Null */ () {
       n;
     };
   }
diff --git a/pkg/front_end/testcases/inference/type_promotion_stopped_by_access_in_a_closure.dart.strong.expect b/pkg/front_end/testcases/inference/type_promotion_stopped_by_access_in_a_closure.dart.strong.expect
index 830f06e..db5f0ef 100644
--- a/pkg/front_end/testcases/inference/type_promotion_stopped_by_access_in_a_closure.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/type_promotion_stopped_by_access_in_a_closure.dart.strong.expect
@@ -6,7 +6,7 @@
   core::num* n = null;
   if(n is core::int*) {
     core::num* i = n;
-    () → core::Null? {
+    () → Null {
       n;
     };
   }
diff --git a/pkg/front_end/testcases/inference/type_promotion_stopped_by_access_in_a_closure.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/type_promotion_stopped_by_access_in_a_closure.dart.strong.transformed.expect
index 830f06e..db5f0ef 100644
--- a/pkg/front_end/testcases/inference/type_promotion_stopped_by_access_in_a_closure.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/type_promotion_stopped_by_access_in_a_closure.dart.strong.transformed.expect
@@ -6,7 +6,7 @@
   core::num* n = null;
   if(n is core::int*) {
     core::num* i = n;
-    () → core::Null? {
+    () → Null {
       n;
     };
   }
diff --git a/pkg/front_end/testcases/inference/type_promotion_stopped_by_mutation_in_a_closure.dart b/pkg/front_end/testcases/inference/type_promotion_stopped_by_mutation_in_a_closure.dart
index dbbc0b1..ee7c1e7 100644
--- a/pkg/front_end/testcases/inference/type_promotion_stopped_by_mutation_in_a_closure.dart
+++ b/pkg/front_end/testcases/inference/type_promotion_stopped_by_mutation_in_a_closure.dart
@@ -10,7 +10,7 @@
   if (n is int) {
     var /*@ type=num* */ i = n;
   }
-  /*@ returnType=Null? */ () {
+  /*@ returnType=Null */ () {
     n = null;
   };
 }
diff --git a/pkg/front_end/testcases/inference/type_promotion_stopped_by_mutation_in_a_closure.dart.strong.expect b/pkg/front_end/testcases/inference/type_promotion_stopped_by_mutation_in_a_closure.dart.strong.expect
index 41ec7b8..d377034 100644
--- a/pkg/front_end/testcases/inference/type_promotion_stopped_by_mutation_in_a_closure.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/type_promotion_stopped_by_mutation_in_a_closure.dart.strong.expect
@@ -7,7 +7,7 @@
   if(n is core::int*) {
     core::num* i = n;
   }
-  () → core::Null? {
+  () → Null {
     n = null;
   };
 }
diff --git a/pkg/front_end/testcases/inference/type_promotion_stopped_by_mutation_in_a_closure.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/type_promotion_stopped_by_mutation_in_a_closure.dart.strong.transformed.expect
index 41ec7b8..d377034 100644
--- a/pkg/front_end/testcases/inference/type_promotion_stopped_by_mutation_in_a_closure.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/type_promotion_stopped_by_mutation_in_a_closure.dart.strong.transformed.expect
@@ -7,7 +7,7 @@
   if(n is core::int*) {
     core::num* i = n;
   }
-  () → core::Null? {
+  () → Null {
     n = null;
   };
 }
diff --git a/pkg/front_end/testcases/inference_new/const_invocation.dart b/pkg/front_end/testcases/inference_new/const_invocation.dart
index 4e58d44..2bb0320 100644
--- a/pkg/front_end/testcases/inference_new/const_invocation.dart
+++ b/pkg/front_end/testcases/inference_new/const_invocation.dart
@@ -8,16 +8,16 @@
 typedef V F<U, V>(U u);
 
 class Foo<T> {
-  Bar<T> get v1 => const /*@typeArgs=Null?*/ Bar();
-  Bar<List<T>> get v2 => const /*@ typeArgs=List<Null?>* */ Bar();
-  Bar<F<T, T>> get v3 => const /*@ typeArgs=(Object*) ->* Null? */ Bar();
+  Bar<T> get v1 => const /*@ typeArgs=Null */ Bar();
+  Bar<List<T>> get v2 => const /*@ typeArgs=List<Null>* */ Bar();
+  Bar<F<T, T>> get v3 => const /*@ typeArgs=(Object*) ->* Null */ Bar();
   Bar<F<F<T, T>, T>> get v4 =>
-      const /*@ typeArgs=((Null?) ->* Object*) ->* Null? */ Bar();
-  List<T> get v5 => /*@ typeArgs=Null? */ const [];
-  List<F<T, T>> get v6 => /*@ typeArgs=(Object*) ->* Null? */ const [];
-  Map<T, T> get v7 => /*@ typeArgs=Null?, Null? */ const {};
-  Map<F<T, T>, T> get v8 => /*@ typeArgs=(Object*) ->* Null?, Null? */ const {};
-  Map<T, F<T, T>> get v9 => /*@ typeArgs=Null?, (Object*) ->* Null? */ const {};
+      const /*@ typeArgs=((Null) ->* Object*) ->* Null */ Bar();
+  List<T> get v5 => /*@ typeArgs=Null */ const [];
+  List<F<T, T>> get v6 => /*@ typeArgs=(Object*) ->* Null */ const [];
+  Map<T, T> get v7 => /*@ typeArgs=Null, Null */ const {};
+  Map<F<T, T>, T> get v8 => /*@ typeArgs=(Object*) ->* Null, Null */ const {};
+  Map<T, F<T, T>> get v9 => /*@ typeArgs=Null, (Object*) ->* Null */ const {};
 }
 
 class Bar<T> {
diff --git a/pkg/front_end/testcases/inference_new/const_invocation.dart.strong.expect b/pkg/front_end/testcases/inference_new/const_invocation.dart.strong.expect
index f4ffe78..fbcc92b 100644
--- a/pkg/front_end/testcases/inference_new/const_invocation.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/const_invocation.dart.strong.expect
@@ -54,14 +54,14 @@
 static method main() → dynamic {}
 
 constants  {
-  #C1 = self::Bar<core::Null?> {}
-  #C2 = self::Bar<core::List<core::Null?>*> {}
-  #C3 = self::Bar<(core::Object*) →* core::Null?> {}
-  #C4 = self::Bar<((core::Null?) →* core::Object*) →* core::Null?> {}
-  #C5 = <core::Null?>[]
-  #C6 = <(core::Object*) →* core::Null?>[]
+  #C1 = self::Bar<Null> {}
+  #C2 = self::Bar<core::List<Null>*> {}
+  #C3 = self::Bar<(core::Object*) →* Null> {}
+  #C4 = self::Bar<((Null) →* core::Object*) →* Null> {}
+  #C5 = <Null>[]
+  #C6 = <(core::Object*) →* Null>[]
   #C7 = <dynamic>[]
-  #C8 = core::_ImmutableMap<core::Null?, core::Null?> {_kvPairs:#C7}
-  #C9 = core::_ImmutableMap<(core::Object*) →* core::Null?, core::Null?> {_kvPairs:#C7}
-  #C10 = core::_ImmutableMap<core::Null?, (core::Object*) →* core::Null?> {_kvPairs:#C7}
+  #C8 = core::_ImmutableMap<Null, Null> {_kvPairs:#C7}
+  #C9 = core::_ImmutableMap<(core::Object*) →* Null, Null> {_kvPairs:#C7}
+  #C10 = core::_ImmutableMap<Null, (core::Object*) →* Null> {_kvPairs:#C7}
 }
diff --git a/pkg/front_end/testcases/inference_new/const_invocation.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/const_invocation.dart.strong.transformed.expect
index f4ffe78..fbcc92b 100644
--- a/pkg/front_end/testcases/inference_new/const_invocation.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/const_invocation.dart.strong.transformed.expect
@@ -54,14 +54,14 @@
 static method main() → dynamic {}
 
 constants  {
-  #C1 = self::Bar<core::Null?> {}
-  #C2 = self::Bar<core::List<core::Null?>*> {}
-  #C3 = self::Bar<(core::Object*) →* core::Null?> {}
-  #C4 = self::Bar<((core::Null?) →* core::Object*) →* core::Null?> {}
-  #C5 = <core::Null?>[]
-  #C6 = <(core::Object*) →* core::Null?>[]
+  #C1 = self::Bar<Null> {}
+  #C2 = self::Bar<core::List<Null>*> {}
+  #C3 = self::Bar<(core::Object*) →* Null> {}
+  #C4 = self::Bar<((Null) →* core::Object*) →* Null> {}
+  #C5 = <Null>[]
+  #C6 = <(core::Object*) →* Null>[]
   #C7 = <dynamic>[]
-  #C8 = core::_ImmutableMap<core::Null?, core::Null?> {_kvPairs:#C7}
-  #C9 = core::_ImmutableMap<(core::Object*) →* core::Null?, core::Null?> {_kvPairs:#C7}
-  #C10 = core::_ImmutableMap<core::Null?, (core::Object*) →* core::Null?> {_kvPairs:#C7}
+  #C8 = core::_ImmutableMap<Null, Null> {_kvPairs:#C7}
+  #C9 = core::_ImmutableMap<(core::Object*) →* Null, Null> {_kvPairs:#C7}
+  #C10 = core::_ImmutableMap<Null, (core::Object*) →* Null> {_kvPairs:#C7}
 }
diff --git a/pkg/front_end/testcases/inference_new/folder.options b/pkg/front_end/testcases/inference_new/folder.options
new file mode 100644
index 0000000..dbc148e
--- /dev/null
+++ b/pkg/front_end/testcases/inference_new/folder.options
@@ -0,0 +1 @@
+--enable-experiment=no-non-nullable
\ No newline at end of file
diff --git a/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.strong.transformed.expect
index 2941922..1af0a51 100644
--- a/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.strong.transformed.expect
@@ -28,7 +28,8 @@
 import "dart:_internal" as _in;
 
 static method test() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic>* :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -61,7 +62,6 @@
  - 'Stream' is from 'dart:async'.
   await for (int x in s) {}
                       ^" in s as{TypeError} asy::Stream<dynamic>*;
-          asy::_asyncStarListenHelper(:stream, :async_op);
           asy::_StreamIterator<dynamic>* :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
           try
             #L2:
@@ -101,7 +101,6 @@
  - 'Stream' is from 'dart:async'.
   await for (y in s) {}
                   ^" in s as{TypeError} asy::Stream<dynamic>*;
-          asy::_asyncStarListenHelper(:stream, :async_op);
           asy::_StreamIterator<dynamic>* :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
           try
             #L3:
@@ -124,16 +123,17 @@
             }
         }
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.strong.transformed.expect
index 73ce80f..0d9cdbd 100644
--- a/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.strong.transformed.expect
@@ -44,7 +44,8 @@
 static method f<T extends core::Object* = dynamic>() → self::f::T*
   return null;
 static method test() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic>* :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -75,7 +76,6 @@
         }
         {
           asy::Stream<self::A*>* :stream = stream;
-          asy::_asyncStarListenHelper(:stream, :async_op);
           asy::_StreamIterator<self::A*>* :for-iterator = new asy::_StreamIterator::•<self::A*>(:stream);
           try
             #L2:
@@ -108,7 +108,6 @@
         }
         {
           asy::Stream<self::A*>* :stream = stream;
-          asy::_asyncStarListenHelper(:stream, :async_op);
           asy::_StreamIterator<self::A*>* :for-iterator = new asy::_StreamIterator::•<self::A*>(:stream);
           try
             #L3:
@@ -145,7 +144,6 @@
         }
         {
           asy::Stream<self::A*>* :stream = stream;
-          asy::_asyncStarListenHelper(:stream, :async_op);
           asy::_StreamIterator<self::A*>* :for-iterator = new asy::_StreamIterator::•<self::A*>(:stream);
           try
             #L4:
@@ -182,7 +180,6 @@
         }
         {
           asy::Stream<self::A*>* :stream = self::f<asy::Stream<self::A*>*>();
-          asy::_asyncStarListenHelper(:stream, :async_op);
           asy::_StreamIterator<self::A*>* :for-iterator = new asy::_StreamIterator::•<self::A*>(:stream);
           try
             #L5:
@@ -205,16 +202,17 @@
             }
         }
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/list_literals_can_infer_null_top_level.dart b/pkg/front_end/testcases/inference_new/list_literals_can_infer_null_top_level.dart
index f8811d5..95a8a3b 100644
--- a/pkg/front_end/testcases/inference_new/list_literals_can_infer_null_top_level.dart
+++ b/pkg/front_end/testcases/inference_new/list_literals_can_infer_null_top_level.dart
@@ -5,7 +5,7 @@
 /*@testedFeatures=inference*/
 library test;
 
-var x = /*@ typeArgs=Null? */ [null];
+var x = /*@ typeArgs=Null */ [null];
 
 main() {
   x;
diff --git a/pkg/front_end/testcases/inference_new/list_literals_can_infer_null_top_level.dart.outline.expect b/pkg/front_end/testcases/inference_new/list_literals_can_infer_null_top_level.dart.outline.expect
index e4f67d0..d051539 100644
--- a/pkg/front_end/testcases/inference_new/list_literals_can_infer_null_top_level.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/list_literals_can_infer_null_top_level.dart.outline.expect
@@ -2,6 +2,6 @@
 import self as self;
 import "dart:core" as core;
 
-static field core::List<core::Null?>* x;
+static field core::List<Null>* x;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference_new/list_literals_can_infer_null_top_level.dart.strong.expect b/pkg/front_end/testcases/inference_new/list_literals_can_infer_null_top_level.dart.strong.expect
index aa63d12..30af47a 100644
--- a/pkg/front_end/testcases/inference_new/list_literals_can_infer_null_top_level.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/list_literals_can_infer_null_top_level.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static field core::List<core::Null?>* x = <core::Null?>[null];
+static field core::List<Null>* x = <Null>[null];
 static method main() → dynamic {
   self::x;
 }
diff --git a/pkg/front_end/testcases/inference_new/list_literals_can_infer_null_top_level.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/list_literals_can_infer_null_top_level.dart.strong.transformed.expect
index aa63d12..30af47a 100644
--- a/pkg/front_end/testcases/inference_new/list_literals_can_infer_null_top_level.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/list_literals_can_infer_null_top_level.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static field core::List<core::Null?>* x = <core::Null?>[null];
+static field core::List<Null>* x = <Null>[null];
 static method main() → dynamic {
   self::x;
 }
diff --git a/pkg/front_end/testcases/inference_new/map_literals_can_infer_null_top_level.dart b/pkg/front_end/testcases/inference_new/map_literals_can_infer_null_top_level.dart
index 03f228f..4acd9c4 100644
--- a/pkg/front_end/testcases/inference_new/map_literals_can_infer_null_top_level.dart
+++ b/pkg/front_end/testcases/inference_new/map_literals_can_infer_null_top_level.dart
@@ -5,7 +5,7 @@
 /*@testedFeatures=inference*/
 library test;
 
-var x = /*@ typeArgs=Null?, Null? */ {null: null};
+var x = /*@ typeArgs=Null, Null */ {null: null};
 
 main() {
   x;
diff --git a/pkg/front_end/testcases/inference_new/map_literals_can_infer_null_top_level.dart.outline.expect b/pkg/front_end/testcases/inference_new/map_literals_can_infer_null_top_level.dart.outline.expect
index f7f9db3..3a23ea0 100644
--- a/pkg/front_end/testcases/inference_new/map_literals_can_infer_null_top_level.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/map_literals_can_infer_null_top_level.dart.outline.expect
@@ -2,6 +2,6 @@
 import self as self;
 import "dart:core" as core;
 
-static field core::Map<core::Null?, core::Null?>* x;
+static field core::Map<Null, Null>* x;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference_new/map_literals_can_infer_null_top_level.dart.strong.expect b/pkg/front_end/testcases/inference_new/map_literals_can_infer_null_top_level.dart.strong.expect
index 4f1d6de..c5b6db9 100644
--- a/pkg/front_end/testcases/inference_new/map_literals_can_infer_null_top_level.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/map_literals_can_infer_null_top_level.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static field core::Map<core::Null?, core::Null?>* x = <core::Null?, core::Null?>{null: null};
+static field core::Map<Null, Null>* x = <Null, Null>{null: null};
 static method main() → dynamic {
   self::x;
 }
diff --git a/pkg/front_end/testcases/inference_new/map_literals_can_infer_null_top_level.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/map_literals_can_infer_null_top_level.dart.strong.transformed.expect
index 4f1d6de..c5b6db9 100644
--- a/pkg/front_end/testcases/inference_new/map_literals_can_infer_null_top_level.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/map_literals_can_infer_null_top_level.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static field core::Map<core::Null?, core::Null?>* x = <core::Null?, core::Null?>{null: null};
+static field core::Map<Null, Null>* x = <Null, Null>{null: null};
 static method main() → dynamic {
   self::x;
 }
diff --git a/pkg/front_end/testcases/inference_new/multiple_interface_inheritance.dart.outline.expect b/pkg/front_end/testcases/inference_new/multiple_interface_inheritance.dart.outline.expect
index e5919b6..f0b94c5 100644
--- a/pkg/front_end/testcases/inference_new/multiple_interface_inheritance.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/multiple_interface_inheritance.dart.outline.expect
@@ -35,7 +35,7 @@
 abstract class C extends core::Object implements self::I1, self::I2 {
   synthetic constructor •() → self::C*
     ;
-  abstract forwarding-stub method f(core::Object* o) → void;
+  abstract member-signature method f(core::Object* o) → void; -> self::I2::f
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/inference_new/multiple_interface_inheritance.dart.strong.expect b/pkg/front_end/testcases/inference_new/multiple_interface_inheritance.dart.strong.expect
index 1bba772..fa1ffe6 100644
--- a/pkg/front_end/testcases/inference_new/multiple_interface_inheritance.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/multiple_interface_inheritance.dart.strong.expect
@@ -38,7 +38,7 @@
   synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  abstract forwarding-stub method f(core::Object* o) → void;
+  abstract member-signature method f(core::Object* o) → void; -> self::I2::f
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/inference_new/multiple_interface_inheritance.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/multiple_interface_inheritance.dart.strong.transformed.expect
index 1bba772..fa1ffe6 100644
--- a/pkg/front_end/testcases/inference_new/multiple_interface_inheritance.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/multiple_interface_inheritance.dart.strong.transformed.expect
@@ -38,7 +38,7 @@
   synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  abstract forwarding-stub method f(core::Object* o) → void;
+  abstract member-signature method f(core::Object* o) → void; -> self::I2::f
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/inference_new/top_level_field_depends_on_multiple_inheritance.dart.outline.expect b/pkg/front_end/testcases/inference_new/top_level_field_depends_on_multiple_inheritance.dart.outline.expect
index 9eb5b34..b2a5eac 100644
--- a/pkg/front_end/testcases/inference_new/top_level_field_depends_on_multiple_inheritance.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/top_level_field_depends_on_multiple_inheritance.dart.outline.expect
@@ -72,7 +72,7 @@
 abstract class G extends core::Object implements self::D, self::E, self::F {
   synthetic constructor •() → self::G*
     ;
-  abstract forwarding-stub method foo() → self::B*;
+  abstract member-signature method foo() → self::B*; -> self::E::foo
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/inference_new/top_level_field_depends_on_multiple_inheritance.dart.strong.expect b/pkg/front_end/testcases/inference_new/top_level_field_depends_on_multiple_inheritance.dart.strong.expect
index 9b6fa53..8be3350 100644
--- a/pkg/front_end/testcases/inference_new/top_level_field_depends_on_multiple_inheritance.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/top_level_field_depends_on_multiple_inheritance.dart.strong.expect
@@ -79,7 +79,7 @@
   synthetic constructor •() → self::G*
     : super core::Object::•()
     ;
-  abstract forwarding-stub method foo() → self::B*;
+  abstract member-signature method foo() → self::B*; -> self::E::foo
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/inference_new/top_level_field_depends_on_multiple_inheritance.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/top_level_field_depends_on_multiple_inheritance.dart.strong.transformed.expect
index 9b6fa53..8be3350 100644
--- a/pkg/front_end/testcases/inference_new/top_level_field_depends_on_multiple_inheritance.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/top_level_field_depends_on_multiple_inheritance.dart.strong.transformed.expect
@@ -79,7 +79,7 @@
   synthetic constructor •() → self::G*
     : super core::Object::•()
     ;
-  abstract forwarding-stub method foo() → self::B*;
+  abstract member-signature method foo() → self::B*; -> self::E::foo
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.outline.expect
index 432f2f8..939b47e 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.outline.expect
@@ -30,7 +30,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class D<X extends self::B<self::D::X*, self::D::Y*>* = self::B<dynamic, dynamic>*, Y extends self::C<self::D::X*, self::D::Y*>* = self::C<dynamic, dynamic>*, Z extends (self::D::Y*) →* self::D::X* = (core::Null?) →* self::B<dynamic, dynamic>*, W extends core::num* = core::num*> extends core::Object {
+class D<X extends self::B<self::D::X*, self::D::Y*>* = self::B<dynamic, dynamic>*, Y extends self::C<self::D::X*, self::D::Y*>* = self::C<dynamic, dynamic>*, Z extends (self::D::Y*) →* self::D::X* = (Null) →* self::B<dynamic, dynamic>*, W extends core::num* = core::num*> extends core::Object {
   synthetic constructor •() → self::D<self::D::X*, self::D::Y*, self::D::Z*, self::D::W*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
diff --git a/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.strong.expect
index 0b96aa5..b96266f 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.strong.expect
@@ -32,7 +32,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class D<X extends self::B<self::D::X*, self::D::Y*>* = self::B<dynamic, dynamic>*, Y extends self::C<self::D::X*, self::D::Y*>* = self::C<dynamic, dynamic>*, Z extends (self::D::Y*) →* self::D::X* = (core::Null?) →* self::B<dynamic, dynamic>*, W extends core::num* = core::num*> extends core::Object {
+class D<X extends self::B<self::D::X*, self::D::Y*>* = self::B<dynamic, dynamic>*, Y extends self::C<self::D::X*, self::D::Y*>* = self::C<dynamic, dynamic>*, Z extends (self::D::Y*) →* self::D::X* = (Null) →* self::B<dynamic, dynamic>*, W extends core::num* = core::num*> extends core::Object {
   synthetic constructor •() → self::D<self::D::X*, self::D::Y*, self::D::Z*, self::D::W*>*
     : super core::Object::•()
     ;
@@ -48,5 +48,5 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 static method main() → dynamic {
-  self::D<self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*, (core::Null?) →* self::B<dynamic, dynamic>*, core::num*>* d;
+  self::D<self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*, (Null) →* self::B<dynamic, dynamic>*, core::num*>* d;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.strong.transformed.expect
index 0b96aa5..b96266f 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.strong.transformed.expect
@@ -32,7 +32,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class D<X extends self::B<self::D::X*, self::D::Y*>* = self::B<dynamic, dynamic>*, Y extends self::C<self::D::X*, self::D::Y*>* = self::C<dynamic, dynamic>*, Z extends (self::D::Y*) →* self::D::X* = (core::Null?) →* self::B<dynamic, dynamic>*, W extends core::num* = core::num*> extends core::Object {
+class D<X extends self::B<self::D::X*, self::D::Y*>* = self::B<dynamic, dynamic>*, Y extends self::C<self::D::X*, self::D::Y*>* = self::C<dynamic, dynamic>*, Z extends (self::D::Y*) →* self::D::X* = (Null) →* self::B<dynamic, dynamic>*, W extends core::num* = core::num*> extends core::Object {
   synthetic constructor •() → self::D<self::D::X*, self::D::Y*, self::D::Z*, self::D::W*>*
     : super core::Object::•()
     ;
@@ -48,5 +48,5 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 static method main() → dynamic {
-  self::D<self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*, (core::Null?) →* self::B<dynamic, dynamic>*, core::num*>* d;
+  self::D<self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*, (Null) →* self::B<dynamic, dynamic>*, core::num*>* d;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.outline.expect
index 368e3fc..d6d83e0 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<X extends core::num* = core::num*, Y extends (self::C::X*) →* void = (core::Null?) →* void> extends core::Object {
+class C<X extends core::num* = core::num*, Y extends (self::C::X*) →* void = (Null) →* void> extends core::Object {
   synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -16,6 +16,6 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-static field self::C<core::num*, (core::Null?) →* void>* c;
+static field self::C<core::num*, (Null) →* void>* c;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.strong.expect
index 9ccc7a3..c86f6b2 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<X extends core::num* = core::num*, Y extends (self::C::X*) →* void = (core::Null?) →* void> extends core::Object {
+class C<X extends core::num* = core::num*, Y extends (self::C::X*) →* void = (Null) →* void> extends core::Object {
   synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
     : super core::Object::•()
     ;
@@ -17,5 +17,5 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-static field self::C<core::num*, (core::Null?) →* void>* c;
+static field self::C<core::num*, (Null) →* void>* c;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.strong.transformed.expect
index 9ccc7a3..c86f6b2 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<X extends core::num* = core::num*, Y extends (self::C::X*) →* void = (core::Null?) →* void> extends core::Object {
+class C<X extends core::num* = core::num*, Y extends (self::C::X*) →* void = (Null) →* void> extends core::Object {
   synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
     : super core::Object::•()
     ;
@@ -17,5 +17,5 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-static field self::C<core::num*, (core::Null?) →* void>* c;
+static field self::C<core::num*, (Null) →* void>* c;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.outline.expect
index bb09bc8..84e4164 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<X extends core::num* = core::num*, Y extends (self::C::X*) →* void = (core::Null?) →* void> extends core::Object {
+class C<X extends core::num* = core::num*, Y extends (self::C::X*) →* void = (Null) →* void> extends core::Object {
   synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -16,7 +16,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-static field core::List<self::C<core::num*, (core::Null?) →* void>*>* lc;
-static field core::Map<self::C<core::num*, (core::Null?) →* void>*, self::C<core::num*, (core::Null?) →* void>*>* mc;
+static field core::List<self::C<core::num*, (Null) →* void>*>* lc;
+static field core::Map<self::C<core::num*, (Null) →* void>*, self::C<core::num*, (Null) →* void>*>* mc;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.strong.expect
index 2064da3..52cdb64 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<X extends core::num* = core::num*, Y extends (self::C::X*) →* void = (core::Null?) →* void> extends core::Object {
+class C<X extends core::num* = core::num*, Y extends (self::C::X*) →* void = (Null) →* void> extends core::Object {
   synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
     : super core::Object::•()
     ;
@@ -17,6 +17,6 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-static field core::List<self::C<core::num*, (core::Null?) →* void>*>* lc = <self::C<core::num*, (core::Null?) →* void>*>[];
-static field core::Map<self::C<core::num*, (core::Null?) →* void>*, self::C<core::num*, (core::Null?) →* void>*>* mc = <self::C<core::num*, (core::Null?) →* void>*, self::C<core::num*, (core::Null?) →* void>*>{};
+static field core::List<self::C<core::num*, (Null) →* void>*>* lc = <self::C<core::num*, (Null) →* void>*>[];
+static field core::Map<self::C<core::num*, (Null) →* void>*, self::C<core::num*, (Null) →* void>*>* mc = <self::C<core::num*, (Null) →* void>*, self::C<core::num*, (Null) →* void>*>{};
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.strong.transformed.expect
index 2064da3..52cdb64 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<X extends core::num* = core::num*, Y extends (self::C::X*) →* void = (core::Null?) →* void> extends core::Object {
+class C<X extends core::num* = core::num*, Y extends (self::C::X*) →* void = (Null) →* void> extends core::Object {
   synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
     : super core::Object::•()
     ;
@@ -17,6 +17,6 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-static field core::List<self::C<core::num*, (core::Null?) →* void>*>* lc = <self::C<core::num*, (core::Null?) →* void>*>[];
-static field core::Map<self::C<core::num*, (core::Null?) →* void>*, self::C<core::num*, (core::Null?) →* void>*>* mc = <self::C<core::num*, (core::Null?) →* void>*, self::C<core::num*, (core::Null?) →* void>*>{};
+static field core::List<self::C<core::num*, (Null) →* void>*>* lc = <self::C<core::num*, (Null) →* void>*>[];
+static field core::Map<self::C<core::num*, (Null) →* void>*, self::C<core::num*, (Null) →* void>*>* mc = <self::C<core::num*, (Null) →* void>*, self::C<core::num*, (Null) →* void>*>{};
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.outline.expect
index 66c369f..e4a28c9 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class D<X extends (self::D::X*, self::D::Y*) →* void = (core::Null?, core::Null?) →* void, Y extends (self::D::X*, self::D::Y*) →* void = (core::Null?, core::Null?) →* void> extends core::Object {
+class D<X extends (self::D::X*, self::D::Y*) →* void = (Null, Null) →* void, Y extends (self::D::X*, self::D::Y*) →* void = (Null, Null) →* void> extends core::Object {
   synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -16,7 +16,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class E<X extends (self::E::X*) →* void = (core::Null?) →* void> extends core::Object {
+class E<X extends (self::E::X*) →* void = (Null) →* void> extends core::Object {
   synthetic constructor •() → self::E<self::E::X*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -30,7 +30,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-static field self::D<(core::Null?, core::Null?) →* void, (core::Null?, core::Null?) →* void>* d;
-static field self::E<(core::Null?) →* void>* e;
+static field self::D<(Null, Null) →* void, (Null, Null) →* void>* d;
+static field self::E<(Null) →* void>* e;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.strong.expect
index 718920a..e4ecd94 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class D<X extends (self::D::X*, self::D::Y*) →* void = (core::Null?, core::Null?) →* void, Y extends (self::D::X*, self::D::Y*) →* void = (core::Null?, core::Null?) →* void> extends core::Object {
+class D<X extends (self::D::X*, self::D::Y*) →* void = (Null, Null) →* void, Y extends (self::D::X*, self::D::Y*) →* void = (Null, Null) →* void> extends core::Object {
   synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
     : super core::Object::•()
     ;
@@ -17,7 +17,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class E<X extends (self::E::X*) →* void = (core::Null?) →* void> extends core::Object {
+class E<X extends (self::E::X*) →* void = (Null) →* void> extends core::Object {
   synthetic constructor •() → self::E<self::E::X*>*
     : super core::Object::•()
     ;
@@ -32,6 +32,6 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-static field self::D<(core::Null?, core::Null?) →* void, (core::Null?, core::Null?) →* void>* d;
-static field self::E<(core::Null?) →* void>* e;
+static field self::D<(Null, Null) →* void, (Null, Null) →* void>* d;
+static field self::E<(Null) →* void>* e;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.strong.transformed.expect
index 718920a..e4ecd94 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class D<X extends (self::D::X*, self::D::Y*) →* void = (core::Null?, core::Null?) →* void, Y extends (self::D::X*, self::D::Y*) →* void = (core::Null?, core::Null?) →* void> extends core::Object {
+class D<X extends (self::D::X*, self::D::Y*) →* void = (Null, Null) →* void, Y extends (self::D::X*, self::D::Y*) →* void = (Null, Null) →* void> extends core::Object {
   synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
     : super core::Object::•()
     ;
@@ -17,7 +17,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class E<X extends (self::E::X*) →* void = (core::Null?) →* void> extends core::Object {
+class E<X extends (self::E::X*) →* void = (Null) →* void> extends core::Object {
   synthetic constructor •() → self::E<self::E::X*>*
     : super core::Object::•()
     ;
@@ -32,6 +32,6 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-static field self::D<(core::Null?, core::Null?) →* void, (core::Null?, core::Null?) →* void>* d;
-static field self::E<(core::Null?) →* void>* e;
+static field self::D<(Null, Null) →* void, (Null, Null) →* void>* d;
+static field self::E<(Null) →* void>* e;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.outline.expect
index 4090043..40367c2 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class D<X extends (self::D::X*, self::D::Y*) →* void = (core::Null?, core::Null?) →* void, Y extends (self::D::X*, self::D::Y*) →* void = (core::Null?, core::Null?) →* void> extends core::Object {
+class D<X extends (self::D::X*, self::D::Y*) →* void = (Null, Null) →* void, Y extends (self::D::X*, self::D::Y*) →* void = (Null, Null) →* void> extends core::Object {
   synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -16,7 +16,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class E<X extends (self::E::X*) →* void = (core::Null?) →* void> extends core::Object {
+class E<X extends (self::E::X*) →* void = (Null) →* void> extends core::Object {
   synthetic constructor •() → self::E<self::E::X*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -30,9 +30,9 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-static field core::List<self::D<(core::Null?, core::Null?) →* void, (core::Null?, core::Null?) →* void>*>* ld;
-static field core::Map<self::D<(core::Null?, core::Null?) →* void, (core::Null?, core::Null?) →* void>*, self::D<(core::Null?, core::Null?) →* void, (core::Null?, core::Null?) →* void>*>* md;
-static field core::List<self::E<(core::Null?) →* void>*>* le;
-static field core::Map<self::E<(core::Null?) →* void>*, self::E<(core::Null?) →* void>*>* me;
+static field core::List<self::D<(Null, Null) →* void, (Null, Null) →* void>*>* ld;
+static field core::Map<self::D<(Null, Null) →* void, (Null, Null) →* void>*, self::D<(Null, Null) →* void, (Null, Null) →* void>*>* md;
+static field core::List<self::E<(Null) →* void>*>* le;
+static field core::Map<self::E<(Null) →* void>*, self::E<(Null) →* void>*>* me;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.strong.expect
index 5013f6a2..eaaf4d5 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class D<X extends (self::D::X*, self::D::Y*) →* void = (core::Null?, core::Null?) →* void, Y extends (self::D::X*, self::D::Y*) →* void = (core::Null?, core::Null?) →* void> extends core::Object {
+class D<X extends (self::D::X*, self::D::Y*) →* void = (Null, Null) →* void, Y extends (self::D::X*, self::D::Y*) →* void = (Null, Null) →* void> extends core::Object {
   synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
     : super core::Object::•()
     ;
@@ -17,7 +17,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class E<X extends (self::E::X*) →* void = (core::Null?) →* void> extends core::Object {
+class E<X extends (self::E::X*) →* void = (Null) →* void> extends core::Object {
   synthetic constructor •() → self::E<self::E::X*>*
     : super core::Object::•()
     ;
@@ -32,8 +32,8 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-static field core::List<self::D<(core::Null?, core::Null?) →* void, (core::Null?, core::Null?) →* void>*>* ld = <self::D<(core::Null?, core::Null?) →* void, (core::Null?, core::Null?) →* void>*>[];
-static field core::Map<self::D<(core::Null?, core::Null?) →* void, (core::Null?, core::Null?) →* void>*, self::D<(core::Null?, core::Null?) →* void, (core::Null?, core::Null?) →* void>*>* md = <self::D<(core::Null?, core::Null?) →* void, (core::Null?, core::Null?) →* void>*, self::D<(core::Null?, core::Null?) →* void, (core::Null?, core::Null?) →* void>*>{};
-static field core::List<self::E<(core::Null?) →* void>*>* le = <self::E<(core::Null?) →* void>*>[];
-static field core::Map<self::E<(core::Null?) →* void>*, self::E<(core::Null?) →* void>*>* me = <self::E<(core::Null?) →* void>*, self::E<(core::Null?) →* void>*>{};
+static field core::List<self::D<(Null, Null) →* void, (Null, Null) →* void>*>* ld = <self::D<(Null, Null) →* void, (Null, Null) →* void>*>[];
+static field core::Map<self::D<(Null, Null) →* void, (Null, Null) →* void>*, self::D<(Null, Null) →* void, (Null, Null) →* void>*>* md = <self::D<(Null, Null) →* void, (Null, Null) →* void>*, self::D<(Null, Null) →* void, (Null, Null) →* void>*>{};
+static field core::List<self::E<(Null) →* void>*>* le = <self::E<(Null) →* void>*>[];
+static field core::Map<self::E<(Null) →* void>*, self::E<(Null) →* void>*>* me = <self::E<(Null) →* void>*, self::E<(Null) →* void>*>{};
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.strong.transformed.expect
index 5013f6a2..eaaf4d5 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class D<X extends (self::D::X*, self::D::Y*) →* void = (core::Null?, core::Null?) →* void, Y extends (self::D::X*, self::D::Y*) →* void = (core::Null?, core::Null?) →* void> extends core::Object {
+class D<X extends (self::D::X*, self::D::Y*) →* void = (Null, Null) →* void, Y extends (self::D::X*, self::D::Y*) →* void = (Null, Null) →* void> extends core::Object {
   synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
     : super core::Object::•()
     ;
@@ -17,7 +17,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class E<X extends (self::E::X*) →* void = (core::Null?) →* void> extends core::Object {
+class E<X extends (self::E::X*) →* void = (Null) →* void> extends core::Object {
   synthetic constructor •() → self::E<self::E::X*>*
     : super core::Object::•()
     ;
@@ -32,8 +32,8 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-static field core::List<self::D<(core::Null?, core::Null?) →* void, (core::Null?, core::Null?) →* void>*>* ld = <self::D<(core::Null?, core::Null?) →* void, (core::Null?, core::Null?) →* void>*>[];
-static field core::Map<self::D<(core::Null?, core::Null?) →* void, (core::Null?, core::Null?) →* void>*, self::D<(core::Null?, core::Null?) →* void, (core::Null?, core::Null?) →* void>*>* md = <self::D<(core::Null?, core::Null?) →* void, (core::Null?, core::Null?) →* void>*, self::D<(core::Null?, core::Null?) →* void, (core::Null?, core::Null?) →* void>*>{};
-static field core::List<self::E<(core::Null?) →* void>*>* le = <self::E<(core::Null?) →* void>*>[];
-static field core::Map<self::E<(core::Null?) →* void>*, self::E<(core::Null?) →* void>*>* me = <self::E<(core::Null?) →* void>*, self::E<(core::Null?) →* void>*>{};
+static field core::List<self::D<(Null, Null) →* void, (Null, Null) →* void>*>* ld = <self::D<(Null, Null) →* void, (Null, Null) →* void>*>[];
+static field core::Map<self::D<(Null, Null) →* void, (Null, Null) →* void>*, self::D<(Null, Null) →* void, (Null, Null) →* void>*>* md = <self::D<(Null, Null) →* void, (Null, Null) →* void>*, self::D<(Null, Null) →* void, (Null, Null) →* void>*>{};
+static field core::List<self::E<(Null) →* void>*>* le = <self::E<(Null) →* void>*>[];
+static field core::Map<self::E<(Null) →* void>*, self::E<(Null) →* void>*>* me = <self::E<(Null) →* void>*, self::E<(Null) →* void>*>{};
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.outline.expect
index ee773ec..7d85a42 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.outline.expect
@@ -16,7 +16,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class C<X extends core::Object* = dynamic, Y extends (self::C::X*) →* self::C::X* = (core::Null?) →* dynamic> extends core::Object {
+class C<X extends core::Object* = dynamic, Y extends (self::C::X*) →* self::C::X* = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -30,7 +30,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class D<X extends core::num* = core::num*, Y extends (self::D::X*) →* self::D::X* = (core::Null?) →* core::num*> extends core::Object {
+class D<X extends core::num* = core::num*, Y extends (self::D::X*) →* self::D::X* = (Null) →* core::num*> extends core::Object {
   synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -44,7 +44,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-static field self::C<dynamic, (core::Null?) →* dynamic>* c;
-static field self::D<core::num*, (core::Null?) →* core::num*>* d;
+static field self::C<dynamic, (Null) →* dynamic>* c;
+static field self::D<core::num*, (Null) →* core::num*>* d;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.strong.expect
index cf12e75..1586c3d 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.strong.expect
@@ -17,7 +17,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class C<X extends core::Object* = dynamic, Y extends (self::C::X*) →* self::C::X* = (core::Null?) →* dynamic> extends core::Object {
+class C<X extends core::Object* = dynamic, Y extends (self::C::X*) →* self::C::X* = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
     : super core::Object::•()
     ;
@@ -32,7 +32,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class D<X extends core::num* = core::num*, Y extends (self::D::X*) →* self::D::X* = (core::Null?) →* core::num*> extends core::Object {
+class D<X extends core::num* = core::num*, Y extends (self::D::X*) →* self::D::X* = (Null) →* core::num*> extends core::Object {
   synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
     : super core::Object::•()
     ;
@@ -47,6 +47,6 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-static field self::C<dynamic, (core::Null?) →* dynamic>* c;
-static field self::D<core::num*, (core::Null?) →* core::num*>* d;
+static field self::C<dynamic, (Null) →* dynamic>* c;
+static field self::D<core::num*, (Null) →* core::num*>* d;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.strong.transformed.expect
index cf12e75..1586c3d 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.strong.transformed.expect
@@ -17,7 +17,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class C<X extends core::Object* = dynamic, Y extends (self::C::X*) →* self::C::X* = (core::Null?) →* dynamic> extends core::Object {
+class C<X extends core::Object* = dynamic, Y extends (self::C::X*) →* self::C::X* = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
     : super core::Object::•()
     ;
@@ -32,7 +32,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class D<X extends core::num* = core::num*, Y extends (self::D::X*) →* self::D::X* = (core::Null?) →* core::num*> extends core::Object {
+class D<X extends core::num* = core::num*, Y extends (self::D::X*) →* self::D::X* = (Null) →* core::num*> extends core::Object {
   synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
     : super core::Object::•()
     ;
@@ -47,6 +47,6 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-static field self::C<dynamic, (core::Null?) →* dynamic>* c;
-static field self::D<core::num*, (core::Null?) →* core::num*>* d;
+static field self::C<dynamic, (Null) →* dynamic>* c;
+static field self::D<core::num*, (Null) →* core::num*>* d;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.outline.expect
index c483e76..e2d5490 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.outline.expect
@@ -16,7 +16,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class C<X extends core::Object* = dynamic, Y extends (self::C::X*) →* self::C::X* = (core::Null?) →* dynamic> extends core::Object {
+class C<X extends core::Object* = dynamic, Y extends (self::C::X*) →* self::C::X* = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -30,7 +30,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class D<X extends core::num* = core::num*, Y extends (self::D::X*) →* self::D::X* = (core::Null?) →* core::num*> extends core::Object {
+class D<X extends core::num* = core::num*, Y extends (self::D::X*) →* self::D::X* = (Null) →* core::num*> extends core::Object {
   synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -44,9 +44,9 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-static field core::List<self::C<dynamic, (core::Null?) →* dynamic>*>* lc;
-static field core::Map<self::C<dynamic, (core::Null?) →* dynamic>*, self::C<dynamic, (core::Null?) →* dynamic>*>* mc;
-static field core::List<self::D<core::num*, (core::Null?) →* core::num*>*>* ld;
-static field core::Map<self::D<core::num*, (core::Null?) →* core::num*>*, self::D<core::num*, (core::Null?) →* core::num*>*>* md;
+static field core::List<self::C<dynamic, (Null) →* dynamic>*>* lc;
+static field core::Map<self::C<dynamic, (Null) →* dynamic>*, self::C<dynamic, (Null) →* dynamic>*>* mc;
+static field core::List<self::D<core::num*, (Null) →* core::num*>*>* ld;
+static field core::Map<self::D<core::num*, (Null) →* core::num*>*, self::D<core::num*, (Null) →* core::num*>*>* md;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.strong.expect
index 760dbc6..edf4bbf 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.strong.expect
@@ -17,7 +17,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class C<X extends core::Object* = dynamic, Y extends (self::C::X*) →* self::C::X* = (core::Null?) →* dynamic> extends core::Object {
+class C<X extends core::Object* = dynamic, Y extends (self::C::X*) →* self::C::X* = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
     : super core::Object::•()
     ;
@@ -32,7 +32,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class D<X extends core::num* = core::num*, Y extends (self::D::X*) →* self::D::X* = (core::Null?) →* core::num*> extends core::Object {
+class D<X extends core::num* = core::num*, Y extends (self::D::X*) →* self::D::X* = (Null) →* core::num*> extends core::Object {
   synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
     : super core::Object::•()
     ;
@@ -47,8 +47,8 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-static field core::List<self::C<dynamic, (core::Null?) →* dynamic>*>* lc = <self::C<dynamic, (core::Null?) →* dynamic>*>[];
-static field core::Map<self::C<dynamic, (core::Null?) →* dynamic>*, self::C<dynamic, (core::Null?) →* dynamic>*>* mc = <self::C<dynamic, (core::Null?) →* dynamic>*, self::C<dynamic, (core::Null?) →* dynamic>*>{};
-static field core::List<self::D<core::num*, (core::Null?) →* core::num*>*>* ld = <self::D<core::num*, (core::Null?) →* core::num*>*>[];
-static field core::Map<self::D<core::num*, (core::Null?) →* core::num*>*, self::D<core::num*, (core::Null?) →* core::num*>*>* md = <self::D<core::num*, (core::Null?) →* core::num*>*, self::D<core::num*, (core::Null?) →* core::num*>*>{};
+static field core::List<self::C<dynamic, (Null) →* dynamic>*>* lc = <self::C<dynamic, (Null) →* dynamic>*>[];
+static field core::Map<self::C<dynamic, (Null) →* dynamic>*, self::C<dynamic, (Null) →* dynamic>*>* mc = <self::C<dynamic, (Null) →* dynamic>*, self::C<dynamic, (Null) →* dynamic>*>{};
+static field core::List<self::D<core::num*, (Null) →* core::num*>*>* ld = <self::D<core::num*, (Null) →* core::num*>*>[];
+static field core::Map<self::D<core::num*, (Null) →* core::num*>*, self::D<core::num*, (Null) →* core::num*>*>* md = <self::D<core::num*, (Null) →* core::num*>*, self::D<core::num*, (Null) →* core::num*>*>{};
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.strong.transformed.expect
index 760dbc6..edf4bbf 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.strong.transformed.expect
@@ -17,7 +17,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class C<X extends core::Object* = dynamic, Y extends (self::C::X*) →* self::C::X* = (core::Null?) →* dynamic> extends core::Object {
+class C<X extends core::Object* = dynamic, Y extends (self::C::X*) →* self::C::X* = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
     : super core::Object::•()
     ;
@@ -32,7 +32,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class D<X extends core::num* = core::num*, Y extends (self::D::X*) →* self::D::X* = (core::Null?) →* core::num*> extends core::Object {
+class D<X extends core::num* = core::num*, Y extends (self::D::X*) →* self::D::X* = (Null) →* core::num*> extends core::Object {
   synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
     : super core::Object::•()
     ;
@@ -47,8 +47,8 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-static field core::List<self::C<dynamic, (core::Null?) →* dynamic>*>* lc = <self::C<dynamic, (core::Null?) →* dynamic>*>[];
-static field core::Map<self::C<dynamic, (core::Null?) →* dynamic>*, self::C<dynamic, (core::Null?) →* dynamic>*>* mc = <self::C<dynamic, (core::Null?) →* dynamic>*, self::C<dynamic, (core::Null?) →* dynamic>*>{};
-static field core::List<self::D<core::num*, (core::Null?) →* core::num*>*>* ld = <self::D<core::num*, (core::Null?) →* core::num*>*>[];
-static field core::Map<self::D<core::num*, (core::Null?) →* core::num*>*, self::D<core::num*, (core::Null?) →* core::num*>*>* md = <self::D<core::num*, (core::Null?) →* core::num*>*, self::D<core::num*, (core::Null?) →* core::num*>*>{};
+static field core::List<self::C<dynamic, (Null) →* dynamic>*>* lc = <self::C<dynamic, (Null) →* dynamic>*>[];
+static field core::Map<self::C<dynamic, (Null) →* dynamic>*, self::C<dynamic, (Null) →* dynamic>*>* mc = <self::C<dynamic, (Null) →* dynamic>*, self::C<dynamic, (Null) →* dynamic>*>{};
+static field core::List<self::D<core::num*, (Null) →* core::num*>*>* ld = <self::D<core::num*, (Null) →* core::num*>*>[];
+static field core::Map<self::D<core::num*, (Null) →* core::num*>*, self::D<core::num*, (Null) →* core::num*>*>* md = <self::D<core::num*, (Null) →* core::num*>*, self::D<core::num*, (Null) →* core::num*>*>{};
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/folder.options b/pkg/front_end/testcases/instantiate_to_bound/folder.options
new file mode 100644
index 0000000..dbc148e
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/folder.options
@@ -0,0 +1 @@
+--enable-experiment=no-non-nullable
\ No newline at end of file
diff --git a/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.outline.expect
index 0a70645..df65afc 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.outline.expect
@@ -122,7 +122,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class I<T extends invalid-type = invalid-type, U extends self::I::Y* = invalid-type, V extends (self::I::W*) →* dynamic = (core::Null?) →* dynamic, W extends (self::I::X*) →* dynamic = (core::Null?) →* dynamic, X extends (self::I::V*) →* dynamic = (core::Null?) →* dynamic, Y extends self::I::Z* = invalid-type, Z extends self::I::T* = invalid-type> extends core::Object {
+class I<T extends invalid-type = invalid-type, U extends self::I::Y* = invalid-type, V extends (self::I::W*) →* dynamic = (Null) →* dynamic, W extends (self::I::X*) →* dynamic = (Null) →* dynamic, X extends (self::I::V*) →* dynamic = (Null) →* dynamic, Y extends self::I::Z* = invalid-type, Z extends self::I::T* = invalid-type> extends core::Object {
   synthetic constructor •() → self::I<self::I::T*, self::I::U*, self::I::V*, self::I::W*, self::I::X*, self::I::Y*, self::I::Z*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -136,7 +136,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class J<S extends (self::J::U*) →* self::J::T* = (core::Null?) →* dynamic, T extends (self::J::S*) →* self::J::U* = (core::Null?) →* dynamic, U extends (self::J::T*) →* self::J::S* = (core::Null?) →* dynamic, V extends self::J::W* = dynamic, W extends self::J::X* = dynamic, X extends (self::J::V*) →* self::J::Y* = (core::Null?) →* dynamic, Y extends self::J::Z* = dynamic, Z extends self::J::X* = dynamic> extends core::Object {
+class J<S extends (self::J::U*) →* self::J::T* = (Null) →* dynamic, T extends (self::J::S*) →* self::J::U* = (Null) →* dynamic, U extends (self::J::T*) →* self::J::S* = (Null) →* dynamic, V extends self::J::W* = dynamic, W extends self::J::X* = dynamic, X extends (self::J::V*) →* self::J::Y* = (Null) →* dynamic, Y extends self::J::Z* = dynamic, Z extends self::J::X* = dynamic> extends core::Object {
   synthetic constructor •() → self::J<self::J::S*, self::J::T*, self::J::U*, self::J::V*, self::J::W*, self::J::X*, self::J::Y*, self::J::Z*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -155,7 +155,7 @@
 static field self::F<core::num*, self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*, self::B<self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*>*, self::C<self::B<self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*>*, dynamic>*>* f;
 static field self::G<core::num*, self::B<core::num*, dynamic>*, self::C<dynamic, core::num*>*, self::B<self::B<core::num*, dynamic>*, self::C<dynamic, core::num*>*>*, self::C<self::B<self::B<core::num*, dynamic>*, self::C<dynamic, core::num*>*>*, dynamic>*>* g;
 static field self::H<self::A<dynamic>*, self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*, self::A<dynamic>*, self::A<dynamic>*, self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*, self::A<dynamic>*>* h;
-static field self::I<invalid-type, invalid-type, (core::Null?) →* dynamic, (core::Null?) →* dynamic, (core::Null?) →* dynamic, invalid-type, invalid-type>* i;
-static field self::J<(core::Null?) →* dynamic, (core::Null?) →* dynamic, (core::Null?) →* dynamic, dynamic, dynamic, (core::Null?) →* dynamic, dynamic, dynamic>* j;
+static field self::I<invalid-type, invalid-type, (Null) →* dynamic, (Null) →* dynamic, (Null) →* dynamic, invalid-type, invalid-type>* i;
+static field self::J<(Null) →* dynamic, (Null) →* dynamic, (Null) →* dynamic, dynamic, dynamic, (Null) →* dynamic, dynamic, dynamic>* j;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.strong.expect
index a739066..d8cb6c1 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.strong.expect
@@ -130,7 +130,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class I<T extends invalid-type = invalid-type, U extends self::I::Y* = invalid-type, V extends (self::I::W*) →* dynamic = (core::Null?) →* dynamic, W extends (self::I::X*) →* dynamic = (core::Null?) →* dynamic, X extends (self::I::V*) →* dynamic = (core::Null?) →* dynamic, Y extends self::I::Z* = invalid-type, Z extends self::I::T* = invalid-type> extends core::Object {
+class I<T extends invalid-type = invalid-type, U extends self::I::Y* = invalid-type, V extends (self::I::W*) →* dynamic = (Null) →* dynamic, W extends (self::I::X*) →* dynamic = (Null) →* dynamic, X extends (self::I::V*) →* dynamic = (Null) →* dynamic, Y extends self::I::Z* = invalid-type, Z extends self::I::T* = invalid-type> extends core::Object {
   synthetic constructor •() → self::I<self::I::T*, self::I::U*, self::I::V*, self::I::W*, self::I::X*, self::I::Y*, self::I::Z*>*
     : super core::Object::•()
     ;
@@ -145,7 +145,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class J<S extends (self::J::U*) →* self::J::T* = (core::Null?) →* dynamic, T extends (self::J::S*) →* self::J::U* = (core::Null?) →* dynamic, U extends (self::J::T*) →* self::J::S* = (core::Null?) →* dynamic, V extends self::J::W* = dynamic, W extends self::J::X* = dynamic, X extends (self::J::V*) →* self::J::Y* = (core::Null?) →* dynamic, Y extends self::J::Z* = dynamic, Z extends self::J::X* = dynamic> extends core::Object {
+class J<S extends (self::J::U*) →* self::J::T* = (Null) →* dynamic, T extends (self::J::S*) →* self::J::U* = (Null) →* dynamic, U extends (self::J::T*) →* self::J::S* = (Null) →* dynamic, V extends self::J::W* = dynamic, W extends self::J::X* = dynamic, X extends (self::J::V*) →* self::J::Y* = (Null) →* dynamic, Y extends self::J::Z* = dynamic, Z extends self::J::X* = dynamic> extends core::Object {
   synthetic constructor •() → self::J<self::J::S*, self::J::T*, self::J::U*, self::J::V*, self::J::W*, self::J::X*, self::J::Y*, self::J::Z*>*
     : super core::Object::•()
     ;
@@ -165,6 +165,6 @@
 static field self::F<core::num*, self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*, self::B<self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*>*, self::C<self::B<self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*>*, dynamic>*>* f;
 static field self::G<core::num*, self::B<core::num*, dynamic>*, self::C<dynamic, core::num*>*, self::B<self::B<core::num*, dynamic>*, self::C<dynamic, core::num*>*>*, self::C<self::B<self::B<core::num*, dynamic>*, self::C<dynamic, core::num*>*>*, dynamic>*>* g;
 static field self::H<self::A<dynamic>*, self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*, self::A<dynamic>*, self::A<dynamic>*, self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*, self::A<dynamic>*>* h;
-static field self::I<invalid-type, invalid-type, (core::Null?) →* dynamic, (core::Null?) →* dynamic, (core::Null?) →* dynamic, invalid-type, invalid-type>* i;
-static field self::J<(core::Null?) →* dynamic, (core::Null?) →* dynamic, (core::Null?) →* dynamic, dynamic, dynamic, (core::Null?) →* dynamic, dynamic, dynamic>* j;
+static field self::I<invalid-type, invalid-type, (Null) →* dynamic, (Null) →* dynamic, (Null) →* dynamic, invalid-type, invalid-type>* i;
+static field self::J<(Null) →* dynamic, (Null) →* dynamic, (Null) →* dynamic, dynamic, dynamic, (Null) →* dynamic, dynamic, dynamic>* j;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.strong.transformed.expect
index a739066..d8cb6c1 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.strong.transformed.expect
@@ -130,7 +130,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class I<T extends invalid-type = invalid-type, U extends self::I::Y* = invalid-type, V extends (self::I::W*) →* dynamic = (core::Null?) →* dynamic, W extends (self::I::X*) →* dynamic = (core::Null?) →* dynamic, X extends (self::I::V*) →* dynamic = (core::Null?) →* dynamic, Y extends self::I::Z* = invalid-type, Z extends self::I::T* = invalid-type> extends core::Object {
+class I<T extends invalid-type = invalid-type, U extends self::I::Y* = invalid-type, V extends (self::I::W*) →* dynamic = (Null) →* dynamic, W extends (self::I::X*) →* dynamic = (Null) →* dynamic, X extends (self::I::V*) →* dynamic = (Null) →* dynamic, Y extends self::I::Z* = invalid-type, Z extends self::I::T* = invalid-type> extends core::Object {
   synthetic constructor •() → self::I<self::I::T*, self::I::U*, self::I::V*, self::I::W*, self::I::X*, self::I::Y*, self::I::Z*>*
     : super core::Object::•()
     ;
@@ -145,7 +145,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class J<S extends (self::J::U*) →* self::J::T* = (core::Null?) →* dynamic, T extends (self::J::S*) →* self::J::U* = (core::Null?) →* dynamic, U extends (self::J::T*) →* self::J::S* = (core::Null?) →* dynamic, V extends self::J::W* = dynamic, W extends self::J::X* = dynamic, X extends (self::J::V*) →* self::J::Y* = (core::Null?) →* dynamic, Y extends self::J::Z* = dynamic, Z extends self::J::X* = dynamic> extends core::Object {
+class J<S extends (self::J::U*) →* self::J::T* = (Null) →* dynamic, T extends (self::J::S*) →* self::J::U* = (Null) →* dynamic, U extends (self::J::T*) →* self::J::S* = (Null) →* dynamic, V extends self::J::W* = dynamic, W extends self::J::X* = dynamic, X extends (self::J::V*) →* self::J::Y* = (Null) →* dynamic, Y extends self::J::Z* = dynamic, Z extends self::J::X* = dynamic> extends core::Object {
   synthetic constructor •() → self::J<self::J::S*, self::J::T*, self::J::U*, self::J::V*, self::J::W*, self::J::X*, self::J::Y*, self::J::Z*>*
     : super core::Object::•()
     ;
@@ -165,6 +165,6 @@
 static field self::F<core::num*, self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*, self::B<self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*>*, self::C<self::B<self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*>*, dynamic>*>* f;
 static field self::G<core::num*, self::B<core::num*, dynamic>*, self::C<dynamic, core::num*>*, self::B<self::B<core::num*, dynamic>*, self::C<dynamic, core::num*>*>*, self::C<self::B<self::B<core::num*, dynamic>*, self::C<dynamic, core::num*>*>*, dynamic>*>* g;
 static field self::H<self::A<dynamic>*, self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*, self::A<dynamic>*, self::A<dynamic>*, self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*, self::A<dynamic>*>* h;
-static field self::I<invalid-type, invalid-type, (core::Null?) →* dynamic, (core::Null?) →* dynamic, (core::Null?) →* dynamic, invalid-type, invalid-type>* i;
-static field self::J<(core::Null?) →* dynamic, (core::Null?) →* dynamic, (core::Null?) →* dynamic, dynamic, dynamic, (core::Null?) →* dynamic, dynamic, dynamic>* j;
+static field self::I<invalid-type, invalid-type, (Null) →* dynamic, (Null) →* dynamic, (Null) →* dynamic, invalid-type, invalid-type>* i;
+static field self::J<(Null) →* dynamic, (Null) →* dynamic, (Null) →* dynamic, dynamic, dynamic, (Null) →* dynamic, dynamic, dynamic>* j;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.outline.expect
index e79c974..b47cdbb 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.outline.expect
@@ -16,7 +16,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class C1<X extends (self::C1::Y*) →* self::C1::X* = (core::Null?) →* dynamic, Y extends (self::C1::Y*) →* self::C1::X* = (core::Null?) →* dynamic> extends core::Object {
+class C1<X extends (self::C1::Y*) →* self::C1::X* = (Null) →* dynamic, Y extends (self::C1::Y*) →* self::C1::X* = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::C1<self::C1::X*, self::C1::Y*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -30,7 +30,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class C2<X extends (self::C2::Y*) →* self::C2::X* = (core::Null?) →* dynamic, Y extends (self::C2::X*) →* self::C2::Y* = (core::Null?) →* dynamic> extends core::Object {
+class C2<X extends (self::C2::Y*) →* self::C2::X* = (Null) →* dynamic, Y extends (self::C2::X*) →* self::C2::Y* = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::C2<self::C2::X*, self::C2::Y*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -44,7 +44,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class C3<X extends (self::C3::X*, self::C3::Y*) →* self::C3::X* = (core::Null?, core::Null?) →* dynamic, Y extends (self::C3::X*, self::C3::Y*) →* self::C3::X* = (core::Null?, core::Null?) →* dynamic> extends core::Object {
+class C3<X extends (self::C3::X*, self::C3::Y*) →* self::C3::X* = (Null, Null) →* dynamic, Y extends (self::C3::X*, self::C3::Y*) →* self::C3::X* = (Null, Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::C3<self::C3::X*, self::C3::Y*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -58,7 +58,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class C4<X extends (self::C4::X*, self::C4::Y*) →* self::C4::X* = (core::Null?, core::Null?) →* dynamic, Y extends (self::C4::X*, self::C4::Y*) →* self::C4::Y* = (core::Null?, core::Null?) →* dynamic> extends core::Object {
+class C4<X extends (self::C4::X*, self::C4::Y*) →* self::C4::X* = (Null, Null) →* dynamic, Y extends (self::C4::X*, self::C4::Y*) →* self::C4::Y* = (Null, Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::C4<self::C4::X*, self::C4::Y*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -72,7 +72,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class D1<X extends self::B<self::D1::X*, self::D1::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D1::Y*) →* self::D1::X* = (core::Null?) →* dynamic> extends core::Object {
+class D1<X extends self::B<self::D1::X*, self::D1::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D1::Y*) →* self::D1::X* = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::D1<self::D1::X*, self::D1::Y*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -86,7 +86,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class D2<X extends self::B<self::D2::X*, self::D2::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D2::X*) →* self::D2::Y* = (core::Null?) →* dynamic> extends core::Object {
+class D2<X extends self::B<self::D2::X*, self::D2::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D2::X*) →* self::D2::Y* = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::D2<self::D2::X*, self::D2::Y*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -100,7 +100,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class D3<X extends self::B<self::D3::X*, self::D3::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D3::X*, self::D3::Y*) →* self::D3::X* = (core::Null?, core::Null?) →* dynamic> extends core::Object {
+class D3<X extends self::B<self::D3::X*, self::D3::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D3::X*, self::D3::Y*) →* self::D3::X* = (Null, Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::D3<self::D3::X*, self::D3::Y*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -114,7 +114,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class D4<X extends self::B<self::D4::X*, self::D4::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D4::X*, self::D4::Y*) →* self::D4::Y* = (core::Null?, core::Null?) →* dynamic> extends core::Object {
+class D4<X extends self::B<self::D4::X*, self::D4::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D4::X*, self::D4::Y*) →* self::D4::Y* = (Null, Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::D4<self::D4::X*, self::D4::Y*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -128,7 +128,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class E<X extends (self::E::X*) →* self::E::X* = (core::Null?) →* dynamic> extends core::Object {
+class E<X extends (self::E::X*) →* self::E::X* = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::E<self::E::X*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -142,14 +142,14 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-static field self::C1<(core::Null?) →* dynamic, (core::Null?) →* dynamic>* c1;
-static field self::C2<(core::Null?) →* dynamic, (core::Null?) →* dynamic>* c2;
-static field self::C3<(core::Null?, core::Null?) →* dynamic, (core::Null?, core::Null?) →* dynamic>* c3;
-static field self::C4<(core::Null?, core::Null?) →* dynamic, (core::Null?, core::Null?) →* dynamic>* c4;
-static field self::D1<self::B<dynamic, dynamic>*, (core::Null?) →* dynamic>* d1;
-static field self::D2<self::B<dynamic, dynamic>*, (core::Null?) →* dynamic>* d2;
-static field self::D3<self::B<dynamic, dynamic>*, (core::Null?, core::Null?) →* dynamic>* d3;
-static field self::D4<self::B<dynamic, dynamic>*, (core::Null?, core::Null?) →* dynamic>* d4;
-static field self::E<(core::Null?) →* dynamic>* e;
+static field self::C1<(Null) →* dynamic, (Null) →* dynamic>* c1;
+static field self::C2<(Null) →* dynamic, (Null) →* dynamic>* c2;
+static field self::C3<(Null, Null) →* dynamic, (Null, Null) →* dynamic>* c3;
+static field self::C4<(Null, Null) →* dynamic, (Null, Null) →* dynamic>* c4;
+static field self::D1<self::B<dynamic, dynamic>*, (Null) →* dynamic>* d1;
+static field self::D2<self::B<dynamic, dynamic>*, (Null) →* dynamic>* d2;
+static field self::D3<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>* d3;
+static field self::D4<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>* d4;
+static field self::E<(Null) →* dynamic>* e;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.strong.expect
index 6e8653f..381fd70 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.strong.expect
@@ -17,7 +17,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class C1<X extends (self::C1::Y*) →* self::C1::X* = (core::Null?) →* dynamic, Y extends (self::C1::Y*) →* self::C1::X* = (core::Null?) →* dynamic> extends core::Object {
+class C1<X extends (self::C1::Y*) →* self::C1::X* = (Null) →* dynamic, Y extends (self::C1::Y*) →* self::C1::X* = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::C1<self::C1::X*, self::C1::Y*>*
     : super core::Object::•()
     ;
@@ -32,7 +32,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class C2<X extends (self::C2::Y*) →* self::C2::X* = (core::Null?) →* dynamic, Y extends (self::C2::X*) →* self::C2::Y* = (core::Null?) →* dynamic> extends core::Object {
+class C2<X extends (self::C2::Y*) →* self::C2::X* = (Null) →* dynamic, Y extends (self::C2::X*) →* self::C2::Y* = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::C2<self::C2::X*, self::C2::Y*>*
     : super core::Object::•()
     ;
@@ -47,7 +47,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class C3<X extends (self::C3::X*, self::C3::Y*) →* self::C3::X* = (core::Null?, core::Null?) →* dynamic, Y extends (self::C3::X*, self::C3::Y*) →* self::C3::X* = (core::Null?, core::Null?) →* dynamic> extends core::Object {
+class C3<X extends (self::C3::X*, self::C3::Y*) →* self::C3::X* = (Null, Null) →* dynamic, Y extends (self::C3::X*, self::C3::Y*) →* self::C3::X* = (Null, Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::C3<self::C3::X*, self::C3::Y*>*
     : super core::Object::•()
     ;
@@ -62,7 +62,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class C4<X extends (self::C4::X*, self::C4::Y*) →* self::C4::X* = (core::Null?, core::Null?) →* dynamic, Y extends (self::C4::X*, self::C4::Y*) →* self::C4::Y* = (core::Null?, core::Null?) →* dynamic> extends core::Object {
+class C4<X extends (self::C4::X*, self::C4::Y*) →* self::C4::X* = (Null, Null) →* dynamic, Y extends (self::C4::X*, self::C4::Y*) →* self::C4::Y* = (Null, Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::C4<self::C4::X*, self::C4::Y*>*
     : super core::Object::•()
     ;
@@ -77,7 +77,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class D1<X extends self::B<self::D1::X*, self::D1::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D1::Y*) →* self::D1::X* = (core::Null?) →* dynamic> extends core::Object {
+class D1<X extends self::B<self::D1::X*, self::D1::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D1::Y*) →* self::D1::X* = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::D1<self::D1::X*, self::D1::Y*>*
     : super core::Object::•()
     ;
@@ -92,7 +92,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class D2<X extends self::B<self::D2::X*, self::D2::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D2::X*) →* self::D2::Y* = (core::Null?) →* dynamic> extends core::Object {
+class D2<X extends self::B<self::D2::X*, self::D2::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D2::X*) →* self::D2::Y* = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::D2<self::D2::X*, self::D2::Y*>*
     : super core::Object::•()
     ;
@@ -107,7 +107,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class D3<X extends self::B<self::D3::X*, self::D3::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D3::X*, self::D3::Y*) →* self::D3::X* = (core::Null?, core::Null?) →* dynamic> extends core::Object {
+class D3<X extends self::B<self::D3::X*, self::D3::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D3::X*, self::D3::Y*) →* self::D3::X* = (Null, Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::D3<self::D3::X*, self::D3::Y*>*
     : super core::Object::•()
     ;
@@ -122,7 +122,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class D4<X extends self::B<self::D4::X*, self::D4::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D4::X*, self::D4::Y*) →* self::D4::Y* = (core::Null?, core::Null?) →* dynamic> extends core::Object {
+class D4<X extends self::B<self::D4::X*, self::D4::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D4::X*, self::D4::Y*) →* self::D4::Y* = (Null, Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::D4<self::D4::X*, self::D4::Y*>*
     : super core::Object::•()
     ;
@@ -137,7 +137,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class E<X extends (self::E::X*) →* self::E::X* = (core::Null?) →* dynamic> extends core::Object {
+class E<X extends (self::E::X*) →* self::E::X* = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::E<self::E::X*>*
     : super core::Object::•()
     ;
@@ -152,13 +152,13 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-static field self::C1<(core::Null?) →* dynamic, (core::Null?) →* dynamic>* c1;
-static field self::C2<(core::Null?) →* dynamic, (core::Null?) →* dynamic>* c2;
-static field self::C3<(core::Null?, core::Null?) →* dynamic, (core::Null?, core::Null?) →* dynamic>* c3;
-static field self::C4<(core::Null?, core::Null?) →* dynamic, (core::Null?, core::Null?) →* dynamic>* c4;
-static field self::D1<self::B<dynamic, dynamic>*, (core::Null?) →* dynamic>* d1;
-static field self::D2<self::B<dynamic, dynamic>*, (core::Null?) →* dynamic>* d2;
-static field self::D3<self::B<dynamic, dynamic>*, (core::Null?, core::Null?) →* dynamic>* d3;
-static field self::D4<self::B<dynamic, dynamic>*, (core::Null?, core::Null?) →* dynamic>* d4;
-static field self::E<(core::Null?) →* dynamic>* e;
+static field self::C1<(Null) →* dynamic, (Null) →* dynamic>* c1;
+static field self::C2<(Null) →* dynamic, (Null) →* dynamic>* c2;
+static field self::C3<(Null, Null) →* dynamic, (Null, Null) →* dynamic>* c3;
+static field self::C4<(Null, Null) →* dynamic, (Null, Null) →* dynamic>* c4;
+static field self::D1<self::B<dynamic, dynamic>*, (Null) →* dynamic>* d1;
+static field self::D2<self::B<dynamic, dynamic>*, (Null) →* dynamic>* d2;
+static field self::D3<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>* d3;
+static field self::D4<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>* d4;
+static field self::E<(Null) →* dynamic>* e;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.strong.transformed.expect
index 6e8653f..381fd70 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.strong.transformed.expect
@@ -17,7 +17,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class C1<X extends (self::C1::Y*) →* self::C1::X* = (core::Null?) →* dynamic, Y extends (self::C1::Y*) →* self::C1::X* = (core::Null?) →* dynamic> extends core::Object {
+class C1<X extends (self::C1::Y*) →* self::C1::X* = (Null) →* dynamic, Y extends (self::C1::Y*) →* self::C1::X* = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::C1<self::C1::X*, self::C1::Y*>*
     : super core::Object::•()
     ;
@@ -32,7 +32,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class C2<X extends (self::C2::Y*) →* self::C2::X* = (core::Null?) →* dynamic, Y extends (self::C2::X*) →* self::C2::Y* = (core::Null?) →* dynamic> extends core::Object {
+class C2<X extends (self::C2::Y*) →* self::C2::X* = (Null) →* dynamic, Y extends (self::C2::X*) →* self::C2::Y* = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::C2<self::C2::X*, self::C2::Y*>*
     : super core::Object::•()
     ;
@@ -47,7 +47,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class C3<X extends (self::C3::X*, self::C3::Y*) →* self::C3::X* = (core::Null?, core::Null?) →* dynamic, Y extends (self::C3::X*, self::C3::Y*) →* self::C3::X* = (core::Null?, core::Null?) →* dynamic> extends core::Object {
+class C3<X extends (self::C3::X*, self::C3::Y*) →* self::C3::X* = (Null, Null) →* dynamic, Y extends (self::C3::X*, self::C3::Y*) →* self::C3::X* = (Null, Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::C3<self::C3::X*, self::C3::Y*>*
     : super core::Object::•()
     ;
@@ -62,7 +62,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class C4<X extends (self::C4::X*, self::C4::Y*) →* self::C4::X* = (core::Null?, core::Null?) →* dynamic, Y extends (self::C4::X*, self::C4::Y*) →* self::C4::Y* = (core::Null?, core::Null?) →* dynamic> extends core::Object {
+class C4<X extends (self::C4::X*, self::C4::Y*) →* self::C4::X* = (Null, Null) →* dynamic, Y extends (self::C4::X*, self::C4::Y*) →* self::C4::Y* = (Null, Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::C4<self::C4::X*, self::C4::Y*>*
     : super core::Object::•()
     ;
@@ -77,7 +77,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class D1<X extends self::B<self::D1::X*, self::D1::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D1::Y*) →* self::D1::X* = (core::Null?) →* dynamic> extends core::Object {
+class D1<X extends self::B<self::D1::X*, self::D1::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D1::Y*) →* self::D1::X* = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::D1<self::D1::X*, self::D1::Y*>*
     : super core::Object::•()
     ;
@@ -92,7 +92,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class D2<X extends self::B<self::D2::X*, self::D2::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D2::X*) →* self::D2::Y* = (core::Null?) →* dynamic> extends core::Object {
+class D2<X extends self::B<self::D2::X*, self::D2::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D2::X*) →* self::D2::Y* = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::D2<self::D2::X*, self::D2::Y*>*
     : super core::Object::•()
     ;
@@ -107,7 +107,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class D3<X extends self::B<self::D3::X*, self::D3::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D3::X*, self::D3::Y*) →* self::D3::X* = (core::Null?, core::Null?) →* dynamic> extends core::Object {
+class D3<X extends self::B<self::D3::X*, self::D3::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D3::X*, self::D3::Y*) →* self::D3::X* = (Null, Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::D3<self::D3::X*, self::D3::Y*>*
     : super core::Object::•()
     ;
@@ -122,7 +122,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class D4<X extends self::B<self::D4::X*, self::D4::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D4::X*, self::D4::Y*) →* self::D4::Y* = (core::Null?, core::Null?) →* dynamic> extends core::Object {
+class D4<X extends self::B<self::D4::X*, self::D4::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D4::X*, self::D4::Y*) →* self::D4::Y* = (Null, Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::D4<self::D4::X*, self::D4::Y*>*
     : super core::Object::•()
     ;
@@ -137,7 +137,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class E<X extends (self::E::X*) →* self::E::X* = (core::Null?) →* dynamic> extends core::Object {
+class E<X extends (self::E::X*) →* self::E::X* = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::E<self::E::X*>*
     : super core::Object::•()
     ;
@@ -152,13 +152,13 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-static field self::C1<(core::Null?) →* dynamic, (core::Null?) →* dynamic>* c1;
-static field self::C2<(core::Null?) →* dynamic, (core::Null?) →* dynamic>* c2;
-static field self::C3<(core::Null?, core::Null?) →* dynamic, (core::Null?, core::Null?) →* dynamic>* c3;
-static field self::C4<(core::Null?, core::Null?) →* dynamic, (core::Null?, core::Null?) →* dynamic>* c4;
-static field self::D1<self::B<dynamic, dynamic>*, (core::Null?) →* dynamic>* d1;
-static field self::D2<self::B<dynamic, dynamic>*, (core::Null?) →* dynamic>* d2;
-static field self::D3<self::B<dynamic, dynamic>*, (core::Null?, core::Null?) →* dynamic>* d3;
-static field self::D4<self::B<dynamic, dynamic>*, (core::Null?, core::Null?) →* dynamic>* d4;
-static field self::E<(core::Null?) →* dynamic>* e;
+static field self::C1<(Null) →* dynamic, (Null) →* dynamic>* c1;
+static field self::C2<(Null) →* dynamic, (Null) →* dynamic>* c2;
+static field self::C3<(Null, Null) →* dynamic, (Null, Null) →* dynamic>* c3;
+static field self::C4<(Null, Null) →* dynamic, (Null, Null) →* dynamic>* c4;
+static field self::D1<self::B<dynamic, dynamic>*, (Null) →* dynamic>* d1;
+static field self::D2<self::B<dynamic, dynamic>*, (Null) →* dynamic>* d2;
+static field self::D3<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>* d3;
+static field self::D4<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>* d4;
+static field self::E<(Null) →* dynamic>* e;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.outline.expect
index c0655e7..eee0aab 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.outline.expect
@@ -16,7 +16,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class C1<X extends (self::C1::Y*) →* self::C1::X* = (core::Null?) →* dynamic, Y extends (self::C1::Y*) →* self::C1::X* = (core::Null?) →* dynamic> extends core::Object {
+class C1<X extends (self::C1::Y*) →* self::C1::X* = (Null) →* dynamic, Y extends (self::C1::Y*) →* self::C1::X* = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::C1<self::C1::X*, self::C1::Y*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -30,7 +30,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class C2<X extends (self::C2::Y*) →* self::C2::X* = (core::Null?) →* dynamic, Y extends (self::C2::X*) →* self::C2::Y* = (core::Null?) →* dynamic> extends core::Object {
+class C2<X extends (self::C2::Y*) →* self::C2::X* = (Null) →* dynamic, Y extends (self::C2::X*) →* self::C2::Y* = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::C2<self::C2::X*, self::C2::Y*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -44,7 +44,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class C3<X extends (self::C3::X*, self::C3::Y*) →* self::C3::X* = (core::Null?, core::Null?) →* dynamic, Y extends (self::C3::X*, self::C3::Y*) →* self::C3::X* = (core::Null?, core::Null?) →* dynamic> extends core::Object {
+class C3<X extends (self::C3::X*, self::C3::Y*) →* self::C3::X* = (Null, Null) →* dynamic, Y extends (self::C3::X*, self::C3::Y*) →* self::C3::X* = (Null, Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::C3<self::C3::X*, self::C3::Y*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -58,7 +58,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class C4<X extends (self::C4::X*, self::C4::Y*) →* self::C4::X* = (core::Null?, core::Null?) →* dynamic, Y extends (self::C4::X*, self::C4::Y*) →* self::C4::Y* = (core::Null?, core::Null?) →* dynamic> extends core::Object {
+class C4<X extends (self::C4::X*, self::C4::Y*) →* self::C4::X* = (Null, Null) →* dynamic, Y extends (self::C4::X*, self::C4::Y*) →* self::C4::Y* = (Null, Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::C4<self::C4::X*, self::C4::Y*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -72,7 +72,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class D1<X extends self::B<self::D1::X*, self::D1::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D1::Y*) →* self::D1::X* = (core::Null?) →* dynamic> extends core::Object {
+class D1<X extends self::B<self::D1::X*, self::D1::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D1::Y*) →* self::D1::X* = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::D1<self::D1::X*, self::D1::Y*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -86,7 +86,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class D2<X extends self::B<self::D2::X*, self::D2::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D2::X*) →* self::D2::Y* = (core::Null?) →* dynamic> extends core::Object {
+class D2<X extends self::B<self::D2::X*, self::D2::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D2::X*) →* self::D2::Y* = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::D2<self::D2::X*, self::D2::Y*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -100,7 +100,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class D3<X extends self::B<self::D3::X*, self::D3::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D3::X*, self::D3::Y*) →* self::D3::X* = (core::Null?, core::Null?) →* dynamic> extends core::Object {
+class D3<X extends self::B<self::D3::X*, self::D3::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D3::X*, self::D3::Y*) →* self::D3::X* = (Null, Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::D3<self::D3::X*, self::D3::Y*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -114,7 +114,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class D4<X extends self::B<self::D4::X*, self::D4::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D4::X*, self::D4::Y*) →* self::D4::Y* = (core::Null?, core::Null?) →* dynamic> extends core::Object {
+class D4<X extends self::B<self::D4::X*, self::D4::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D4::X*, self::D4::Y*) →* self::D4::Y* = (Null, Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::D4<self::D4::X*, self::D4::Y*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -128,7 +128,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class E<X extends (self::E::X*) →* self::E::X* = (core::Null?) →* dynamic> extends core::Object {
+class E<X extends (self::E::X*) →* self::E::X* = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::E<self::E::X*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -142,23 +142,23 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-static field core::List<self::C1<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*>* lc1;
-static field core::Map<self::C1<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*, self::C1<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*>* mc1;
-static field core::List<self::C2<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*>* lc2;
-static field core::Map<self::C2<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*, self::C2<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*>* mc2;
-static field core::List<self::C3<(core::Null?, core::Null?) →* dynamic, (core::Null?, core::Null?) →* dynamic>*>* lc3;
-static field core::Map<self::C3<(core::Null?, core::Null?) →* dynamic, (core::Null?, core::Null?) →* dynamic>*, self::C3<(core::Null?, core::Null?) →* dynamic, (core::Null?, core::Null?) →* dynamic>*>* mc3;
-static field core::List<self::C4<(core::Null?, core::Null?) →* dynamic, (core::Null?, core::Null?) →* dynamic>*>* lc4;
-static field core::Map<self::C4<(core::Null?, core::Null?) →* dynamic, (core::Null?, core::Null?) →* dynamic>*, self::C4<(core::Null?, core::Null?) →* dynamic, (core::Null?, core::Null?) →* dynamic>*>* mc4;
-static field core::List<self::D1<self::B<dynamic, dynamic>*, (core::Null?) →* dynamic>*>* ld1;
-static field core::Map<self::D1<self::B<dynamic, dynamic>*, (core::Null?) →* dynamic>*, self::D1<self::B<dynamic, dynamic>*, (core::Null?) →* dynamic>*>* md1;
-static field core::List<self::D2<self::B<dynamic, dynamic>*, (core::Null?) →* dynamic>*>* ld2;
-static field core::Map<self::D2<self::B<dynamic, dynamic>*, (core::Null?) →* dynamic>*, self::D2<self::B<dynamic, dynamic>*, (core::Null?) →* dynamic>*>* md2;
-static field core::List<self::D3<self::B<dynamic, dynamic>*, (core::Null?, core::Null?) →* dynamic>*>* ld3;
-static field core::Map<self::D3<self::B<dynamic, dynamic>*, (core::Null?, core::Null?) →* dynamic>*, self::D3<self::B<dynamic, dynamic>*, (core::Null?, core::Null?) →* dynamic>*>* md3;
-static field core::List<self::D4<self::B<dynamic, dynamic>*, (core::Null?, core::Null?) →* dynamic>*>* ld4;
-static field core::Map<self::D4<self::B<dynamic, dynamic>*, (core::Null?, core::Null?) →* dynamic>*, self::D4<self::B<dynamic, dynamic>*, (core::Null?, core::Null?) →* dynamic>*>* md4;
-static field core::List<self::E<(core::Null?) →* dynamic>*>* le;
-static field core::Map<self::E<(core::Null?) →* dynamic>*, self::E<(core::Null?) →* dynamic>*>* me;
+static field core::List<self::C1<(Null) →* dynamic, (Null) →* dynamic>*>* lc1;
+static field core::Map<self::C1<(Null) →* dynamic, (Null) →* dynamic>*, self::C1<(Null) →* dynamic, (Null) →* dynamic>*>* mc1;
+static field core::List<self::C2<(Null) →* dynamic, (Null) →* dynamic>*>* lc2;
+static field core::Map<self::C2<(Null) →* dynamic, (Null) →* dynamic>*, self::C2<(Null) →* dynamic, (Null) →* dynamic>*>* mc2;
+static field core::List<self::C3<(Null, Null) →* dynamic, (Null, Null) →* dynamic>*>* lc3;
+static field core::Map<self::C3<(Null, Null) →* dynamic, (Null, Null) →* dynamic>*, self::C3<(Null, Null) →* dynamic, (Null, Null) →* dynamic>*>* mc3;
+static field core::List<self::C4<(Null, Null) →* dynamic, (Null, Null) →* dynamic>*>* lc4;
+static field core::Map<self::C4<(Null, Null) →* dynamic, (Null, Null) →* dynamic>*, self::C4<(Null, Null) →* dynamic, (Null, Null) →* dynamic>*>* mc4;
+static field core::List<self::D1<self::B<dynamic, dynamic>*, (Null) →* dynamic>*>* ld1;
+static field core::Map<self::D1<self::B<dynamic, dynamic>*, (Null) →* dynamic>*, self::D1<self::B<dynamic, dynamic>*, (Null) →* dynamic>*>* md1;
+static field core::List<self::D2<self::B<dynamic, dynamic>*, (Null) →* dynamic>*>* ld2;
+static field core::Map<self::D2<self::B<dynamic, dynamic>*, (Null) →* dynamic>*, self::D2<self::B<dynamic, dynamic>*, (Null) →* dynamic>*>* md2;
+static field core::List<self::D3<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>*>* ld3;
+static field core::Map<self::D3<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>*, self::D3<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>*>* md3;
+static field core::List<self::D4<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>*>* ld4;
+static field core::Map<self::D4<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>*, self::D4<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>*>* md4;
+static field core::List<self::E<(Null) →* dynamic>*>* le;
+static field core::Map<self::E<(Null) →* dynamic>*, self::E<(Null) →* dynamic>*>* me;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.strong.expect
index 24668cb..57e2111 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.strong.expect
@@ -17,7 +17,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class C1<X extends (self::C1::Y*) →* self::C1::X* = (core::Null?) →* dynamic, Y extends (self::C1::Y*) →* self::C1::X* = (core::Null?) →* dynamic> extends core::Object {
+class C1<X extends (self::C1::Y*) →* self::C1::X* = (Null) →* dynamic, Y extends (self::C1::Y*) →* self::C1::X* = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::C1<self::C1::X*, self::C1::Y*>*
     : super core::Object::•()
     ;
@@ -32,7 +32,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class C2<X extends (self::C2::Y*) →* self::C2::X* = (core::Null?) →* dynamic, Y extends (self::C2::X*) →* self::C2::Y* = (core::Null?) →* dynamic> extends core::Object {
+class C2<X extends (self::C2::Y*) →* self::C2::X* = (Null) →* dynamic, Y extends (self::C2::X*) →* self::C2::Y* = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::C2<self::C2::X*, self::C2::Y*>*
     : super core::Object::•()
     ;
@@ -47,7 +47,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class C3<X extends (self::C3::X*, self::C3::Y*) →* self::C3::X* = (core::Null?, core::Null?) →* dynamic, Y extends (self::C3::X*, self::C3::Y*) →* self::C3::X* = (core::Null?, core::Null?) →* dynamic> extends core::Object {
+class C3<X extends (self::C3::X*, self::C3::Y*) →* self::C3::X* = (Null, Null) →* dynamic, Y extends (self::C3::X*, self::C3::Y*) →* self::C3::X* = (Null, Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::C3<self::C3::X*, self::C3::Y*>*
     : super core::Object::•()
     ;
@@ -62,7 +62,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class C4<X extends (self::C4::X*, self::C4::Y*) →* self::C4::X* = (core::Null?, core::Null?) →* dynamic, Y extends (self::C4::X*, self::C4::Y*) →* self::C4::Y* = (core::Null?, core::Null?) →* dynamic> extends core::Object {
+class C4<X extends (self::C4::X*, self::C4::Y*) →* self::C4::X* = (Null, Null) →* dynamic, Y extends (self::C4::X*, self::C4::Y*) →* self::C4::Y* = (Null, Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::C4<self::C4::X*, self::C4::Y*>*
     : super core::Object::•()
     ;
@@ -77,7 +77,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class D1<X extends self::B<self::D1::X*, self::D1::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D1::Y*) →* self::D1::X* = (core::Null?) →* dynamic> extends core::Object {
+class D1<X extends self::B<self::D1::X*, self::D1::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D1::Y*) →* self::D1::X* = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::D1<self::D1::X*, self::D1::Y*>*
     : super core::Object::•()
     ;
@@ -92,7 +92,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class D2<X extends self::B<self::D2::X*, self::D2::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D2::X*) →* self::D2::Y* = (core::Null?) →* dynamic> extends core::Object {
+class D2<X extends self::B<self::D2::X*, self::D2::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D2::X*) →* self::D2::Y* = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::D2<self::D2::X*, self::D2::Y*>*
     : super core::Object::•()
     ;
@@ -107,7 +107,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class D3<X extends self::B<self::D3::X*, self::D3::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D3::X*, self::D3::Y*) →* self::D3::X* = (core::Null?, core::Null?) →* dynamic> extends core::Object {
+class D3<X extends self::B<self::D3::X*, self::D3::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D3::X*, self::D3::Y*) →* self::D3::X* = (Null, Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::D3<self::D3::X*, self::D3::Y*>*
     : super core::Object::•()
     ;
@@ -122,7 +122,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class D4<X extends self::B<self::D4::X*, self::D4::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D4::X*, self::D4::Y*) →* self::D4::Y* = (core::Null?, core::Null?) →* dynamic> extends core::Object {
+class D4<X extends self::B<self::D4::X*, self::D4::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D4::X*, self::D4::Y*) →* self::D4::Y* = (Null, Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::D4<self::D4::X*, self::D4::Y*>*
     : super core::Object::•()
     ;
@@ -137,7 +137,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class E<X extends (self::E::X*) →* self::E::X* = (core::Null?) →* dynamic> extends core::Object {
+class E<X extends (self::E::X*) →* self::E::X* = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::E<self::E::X*>*
     : super core::Object::•()
     ;
@@ -152,22 +152,22 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-static field core::List<self::C1<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*>* lc1 = <self::C1<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*>[];
-static field core::Map<self::C1<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*, self::C1<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*>* mc1 = <self::C1<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*, self::C1<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*>{};
-static field core::List<self::C2<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*>* lc2 = <self::C2<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*>[];
-static field core::Map<self::C2<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*, self::C2<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*>* mc2 = <self::C2<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*, self::C2<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*>{};
-static field core::List<self::C3<(core::Null?, core::Null?) →* dynamic, (core::Null?, core::Null?) →* dynamic>*>* lc3 = <self::C3<(core::Null?, core::Null?) →* dynamic, (core::Null?, core::Null?) →* dynamic>*>[];
-static field core::Map<self::C3<(core::Null?, core::Null?) →* dynamic, (core::Null?, core::Null?) →* dynamic>*, self::C3<(core::Null?, core::Null?) →* dynamic, (core::Null?, core::Null?) →* dynamic>*>* mc3 = <self::C3<(core::Null?, core::Null?) →* dynamic, (core::Null?, core::Null?) →* dynamic>*, self::C3<(core::Null?, core::Null?) →* dynamic, (core::Null?, core::Null?) →* dynamic>*>{};
-static field core::List<self::C4<(core::Null?, core::Null?) →* dynamic, (core::Null?, core::Null?) →* dynamic>*>* lc4 = <self::C4<(core::Null?, core::Null?) →* dynamic, (core::Null?, core::Null?) →* dynamic>*>[];
-static field core::Map<self::C4<(core::Null?, core::Null?) →* dynamic, (core::Null?, core::Null?) →* dynamic>*, self::C4<(core::Null?, core::Null?) →* dynamic, (core::Null?, core::Null?) →* dynamic>*>* mc4 = <self::C4<(core::Null?, core::Null?) →* dynamic, (core::Null?, core::Null?) →* dynamic>*, self::C4<(core::Null?, core::Null?) →* dynamic, (core::Null?, core::Null?) →* dynamic>*>{};
-static field core::List<self::D1<self::B<dynamic, dynamic>*, (core::Null?) →* dynamic>*>* ld1 = <self::D1<self::B<dynamic, dynamic>*, (core::Null?) →* dynamic>*>[];
-static field core::Map<self::D1<self::B<dynamic, dynamic>*, (core::Null?) →* dynamic>*, self::D1<self::B<dynamic, dynamic>*, (core::Null?) →* dynamic>*>* md1 = <self::D1<self::B<dynamic, dynamic>*, (core::Null?) →* dynamic>*, self::D1<self::B<dynamic, dynamic>*, (core::Null?) →* dynamic>*>{};
-static field core::List<self::D2<self::B<dynamic, dynamic>*, (core::Null?) →* dynamic>*>* ld2 = <self::D2<self::B<dynamic, dynamic>*, (core::Null?) →* dynamic>*>[];
-static field core::Map<self::D2<self::B<dynamic, dynamic>*, (core::Null?) →* dynamic>*, self::D2<self::B<dynamic, dynamic>*, (core::Null?) →* dynamic>*>* md2 = <self::D2<self::B<dynamic, dynamic>*, (core::Null?) →* dynamic>*, self::D2<self::B<dynamic, dynamic>*, (core::Null?) →* dynamic>*>{};
-static field core::List<self::D3<self::B<dynamic, dynamic>*, (core::Null?, core::Null?) →* dynamic>*>* ld3 = <self::D3<self::B<dynamic, dynamic>*, (core::Null?, core::Null?) →* dynamic>*>[];
-static field core::Map<self::D3<self::B<dynamic, dynamic>*, (core::Null?, core::Null?) →* dynamic>*, self::D3<self::B<dynamic, dynamic>*, (core::Null?, core::Null?) →* dynamic>*>* md3 = <self::D3<self::B<dynamic, dynamic>*, (core::Null?, core::Null?) →* dynamic>*, self::D3<self::B<dynamic, dynamic>*, (core::Null?, core::Null?) →* dynamic>*>{};
-static field core::List<self::D4<self::B<dynamic, dynamic>*, (core::Null?, core::Null?) →* dynamic>*>* ld4 = <self::D4<self::B<dynamic, dynamic>*, (core::Null?, core::Null?) →* dynamic>*>[];
-static field core::Map<self::D4<self::B<dynamic, dynamic>*, (core::Null?, core::Null?) →* dynamic>*, self::D4<self::B<dynamic, dynamic>*, (core::Null?, core::Null?) →* dynamic>*>* md4 = <self::D4<self::B<dynamic, dynamic>*, (core::Null?, core::Null?) →* dynamic>*, self::D4<self::B<dynamic, dynamic>*, (core::Null?, core::Null?) →* dynamic>*>{};
-static field core::List<self::E<(core::Null?) →* dynamic>*>* le = <self::E<(core::Null?) →* dynamic>*>[];
-static field core::Map<self::E<(core::Null?) →* dynamic>*, self::E<(core::Null?) →* dynamic>*>* me = <self::E<(core::Null?) →* dynamic>*, self::E<(core::Null?) →* dynamic>*>{};
+static field core::List<self::C1<(Null) →* dynamic, (Null) →* dynamic>*>* lc1 = <self::C1<(Null) →* dynamic, (Null) →* dynamic>*>[];
+static field core::Map<self::C1<(Null) →* dynamic, (Null) →* dynamic>*, self::C1<(Null) →* dynamic, (Null) →* dynamic>*>* mc1 = <self::C1<(Null) →* dynamic, (Null) →* dynamic>*, self::C1<(Null) →* dynamic, (Null) →* dynamic>*>{};
+static field core::List<self::C2<(Null) →* dynamic, (Null) →* dynamic>*>* lc2 = <self::C2<(Null) →* dynamic, (Null) →* dynamic>*>[];
+static field core::Map<self::C2<(Null) →* dynamic, (Null) →* dynamic>*, self::C2<(Null) →* dynamic, (Null) →* dynamic>*>* mc2 = <self::C2<(Null) →* dynamic, (Null) →* dynamic>*, self::C2<(Null) →* dynamic, (Null) →* dynamic>*>{};
+static field core::List<self::C3<(Null, Null) →* dynamic, (Null, Null) →* dynamic>*>* lc3 = <self::C3<(Null, Null) →* dynamic, (Null, Null) →* dynamic>*>[];
+static field core::Map<self::C3<(Null, Null) →* dynamic, (Null, Null) →* dynamic>*, self::C3<(Null, Null) →* dynamic, (Null, Null) →* dynamic>*>* mc3 = <self::C3<(Null, Null) →* dynamic, (Null, Null) →* dynamic>*, self::C3<(Null, Null) →* dynamic, (Null, Null) →* dynamic>*>{};
+static field core::List<self::C4<(Null, Null) →* dynamic, (Null, Null) →* dynamic>*>* lc4 = <self::C4<(Null, Null) →* dynamic, (Null, Null) →* dynamic>*>[];
+static field core::Map<self::C4<(Null, Null) →* dynamic, (Null, Null) →* dynamic>*, self::C4<(Null, Null) →* dynamic, (Null, Null) →* dynamic>*>* mc4 = <self::C4<(Null, Null) →* dynamic, (Null, Null) →* dynamic>*, self::C4<(Null, Null) →* dynamic, (Null, Null) →* dynamic>*>{};
+static field core::List<self::D1<self::B<dynamic, dynamic>*, (Null) →* dynamic>*>* ld1 = <self::D1<self::B<dynamic, dynamic>*, (Null) →* dynamic>*>[];
+static field core::Map<self::D1<self::B<dynamic, dynamic>*, (Null) →* dynamic>*, self::D1<self::B<dynamic, dynamic>*, (Null) →* dynamic>*>* md1 = <self::D1<self::B<dynamic, dynamic>*, (Null) →* dynamic>*, self::D1<self::B<dynamic, dynamic>*, (Null) →* dynamic>*>{};
+static field core::List<self::D2<self::B<dynamic, dynamic>*, (Null) →* dynamic>*>* ld2 = <self::D2<self::B<dynamic, dynamic>*, (Null) →* dynamic>*>[];
+static field core::Map<self::D2<self::B<dynamic, dynamic>*, (Null) →* dynamic>*, self::D2<self::B<dynamic, dynamic>*, (Null) →* dynamic>*>* md2 = <self::D2<self::B<dynamic, dynamic>*, (Null) →* dynamic>*, self::D2<self::B<dynamic, dynamic>*, (Null) →* dynamic>*>{};
+static field core::List<self::D3<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>*>* ld3 = <self::D3<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>*>[];
+static field core::Map<self::D3<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>*, self::D3<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>*>* md3 = <self::D3<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>*, self::D3<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>*>{};
+static field core::List<self::D4<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>*>* ld4 = <self::D4<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>*>[];
+static field core::Map<self::D4<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>*, self::D4<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>*>* md4 = <self::D4<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>*, self::D4<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>*>{};
+static field core::List<self::E<(Null) →* dynamic>*>* le = <self::E<(Null) →* dynamic>*>[];
+static field core::Map<self::E<(Null) →* dynamic>*, self::E<(Null) →* dynamic>*>* me = <self::E<(Null) →* dynamic>*, self::E<(Null) →* dynamic>*>{};
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.strong.transformed.expect
index 24668cb..57e2111 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.strong.transformed.expect
@@ -17,7 +17,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class C1<X extends (self::C1::Y*) →* self::C1::X* = (core::Null?) →* dynamic, Y extends (self::C1::Y*) →* self::C1::X* = (core::Null?) →* dynamic> extends core::Object {
+class C1<X extends (self::C1::Y*) →* self::C1::X* = (Null) →* dynamic, Y extends (self::C1::Y*) →* self::C1::X* = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::C1<self::C1::X*, self::C1::Y*>*
     : super core::Object::•()
     ;
@@ -32,7 +32,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class C2<X extends (self::C2::Y*) →* self::C2::X* = (core::Null?) →* dynamic, Y extends (self::C2::X*) →* self::C2::Y* = (core::Null?) →* dynamic> extends core::Object {
+class C2<X extends (self::C2::Y*) →* self::C2::X* = (Null) →* dynamic, Y extends (self::C2::X*) →* self::C2::Y* = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::C2<self::C2::X*, self::C2::Y*>*
     : super core::Object::•()
     ;
@@ -47,7 +47,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class C3<X extends (self::C3::X*, self::C3::Y*) →* self::C3::X* = (core::Null?, core::Null?) →* dynamic, Y extends (self::C3::X*, self::C3::Y*) →* self::C3::X* = (core::Null?, core::Null?) →* dynamic> extends core::Object {
+class C3<X extends (self::C3::X*, self::C3::Y*) →* self::C3::X* = (Null, Null) →* dynamic, Y extends (self::C3::X*, self::C3::Y*) →* self::C3::X* = (Null, Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::C3<self::C3::X*, self::C3::Y*>*
     : super core::Object::•()
     ;
@@ -62,7 +62,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class C4<X extends (self::C4::X*, self::C4::Y*) →* self::C4::X* = (core::Null?, core::Null?) →* dynamic, Y extends (self::C4::X*, self::C4::Y*) →* self::C4::Y* = (core::Null?, core::Null?) →* dynamic> extends core::Object {
+class C4<X extends (self::C4::X*, self::C4::Y*) →* self::C4::X* = (Null, Null) →* dynamic, Y extends (self::C4::X*, self::C4::Y*) →* self::C4::Y* = (Null, Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::C4<self::C4::X*, self::C4::Y*>*
     : super core::Object::•()
     ;
@@ -77,7 +77,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class D1<X extends self::B<self::D1::X*, self::D1::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D1::Y*) →* self::D1::X* = (core::Null?) →* dynamic> extends core::Object {
+class D1<X extends self::B<self::D1::X*, self::D1::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D1::Y*) →* self::D1::X* = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::D1<self::D1::X*, self::D1::Y*>*
     : super core::Object::•()
     ;
@@ -92,7 +92,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class D2<X extends self::B<self::D2::X*, self::D2::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D2::X*) →* self::D2::Y* = (core::Null?) →* dynamic> extends core::Object {
+class D2<X extends self::B<self::D2::X*, self::D2::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D2::X*) →* self::D2::Y* = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::D2<self::D2::X*, self::D2::Y*>*
     : super core::Object::•()
     ;
@@ -107,7 +107,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class D3<X extends self::B<self::D3::X*, self::D3::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D3::X*, self::D3::Y*) →* self::D3::X* = (core::Null?, core::Null?) →* dynamic> extends core::Object {
+class D3<X extends self::B<self::D3::X*, self::D3::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D3::X*, self::D3::Y*) →* self::D3::X* = (Null, Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::D3<self::D3::X*, self::D3::Y*>*
     : super core::Object::•()
     ;
@@ -122,7 +122,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class D4<X extends self::B<self::D4::X*, self::D4::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D4::X*, self::D4::Y*) →* self::D4::Y* = (core::Null?, core::Null?) →* dynamic> extends core::Object {
+class D4<X extends self::B<self::D4::X*, self::D4::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D4::X*, self::D4::Y*) →* self::D4::Y* = (Null, Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::D4<self::D4::X*, self::D4::Y*>*
     : super core::Object::•()
     ;
@@ -137,7 +137,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class E<X extends (self::E::X*) →* self::E::X* = (core::Null?) →* dynamic> extends core::Object {
+class E<X extends (self::E::X*) →* self::E::X* = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::E<self::E::X*>*
     : super core::Object::•()
     ;
@@ -152,22 +152,22 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-static field core::List<self::C1<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*>* lc1 = <self::C1<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*>[];
-static field core::Map<self::C1<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*, self::C1<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*>* mc1 = <self::C1<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*, self::C1<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*>{};
-static field core::List<self::C2<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*>* lc2 = <self::C2<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*>[];
-static field core::Map<self::C2<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*, self::C2<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*>* mc2 = <self::C2<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*, self::C2<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*>{};
-static field core::List<self::C3<(core::Null?, core::Null?) →* dynamic, (core::Null?, core::Null?) →* dynamic>*>* lc3 = <self::C3<(core::Null?, core::Null?) →* dynamic, (core::Null?, core::Null?) →* dynamic>*>[];
-static field core::Map<self::C3<(core::Null?, core::Null?) →* dynamic, (core::Null?, core::Null?) →* dynamic>*, self::C3<(core::Null?, core::Null?) →* dynamic, (core::Null?, core::Null?) →* dynamic>*>* mc3 = <self::C3<(core::Null?, core::Null?) →* dynamic, (core::Null?, core::Null?) →* dynamic>*, self::C3<(core::Null?, core::Null?) →* dynamic, (core::Null?, core::Null?) →* dynamic>*>{};
-static field core::List<self::C4<(core::Null?, core::Null?) →* dynamic, (core::Null?, core::Null?) →* dynamic>*>* lc4 = <self::C4<(core::Null?, core::Null?) →* dynamic, (core::Null?, core::Null?) →* dynamic>*>[];
-static field core::Map<self::C4<(core::Null?, core::Null?) →* dynamic, (core::Null?, core::Null?) →* dynamic>*, self::C4<(core::Null?, core::Null?) →* dynamic, (core::Null?, core::Null?) →* dynamic>*>* mc4 = <self::C4<(core::Null?, core::Null?) →* dynamic, (core::Null?, core::Null?) →* dynamic>*, self::C4<(core::Null?, core::Null?) →* dynamic, (core::Null?, core::Null?) →* dynamic>*>{};
-static field core::List<self::D1<self::B<dynamic, dynamic>*, (core::Null?) →* dynamic>*>* ld1 = <self::D1<self::B<dynamic, dynamic>*, (core::Null?) →* dynamic>*>[];
-static field core::Map<self::D1<self::B<dynamic, dynamic>*, (core::Null?) →* dynamic>*, self::D1<self::B<dynamic, dynamic>*, (core::Null?) →* dynamic>*>* md1 = <self::D1<self::B<dynamic, dynamic>*, (core::Null?) →* dynamic>*, self::D1<self::B<dynamic, dynamic>*, (core::Null?) →* dynamic>*>{};
-static field core::List<self::D2<self::B<dynamic, dynamic>*, (core::Null?) →* dynamic>*>* ld2 = <self::D2<self::B<dynamic, dynamic>*, (core::Null?) →* dynamic>*>[];
-static field core::Map<self::D2<self::B<dynamic, dynamic>*, (core::Null?) →* dynamic>*, self::D2<self::B<dynamic, dynamic>*, (core::Null?) →* dynamic>*>* md2 = <self::D2<self::B<dynamic, dynamic>*, (core::Null?) →* dynamic>*, self::D2<self::B<dynamic, dynamic>*, (core::Null?) →* dynamic>*>{};
-static field core::List<self::D3<self::B<dynamic, dynamic>*, (core::Null?, core::Null?) →* dynamic>*>* ld3 = <self::D3<self::B<dynamic, dynamic>*, (core::Null?, core::Null?) →* dynamic>*>[];
-static field core::Map<self::D3<self::B<dynamic, dynamic>*, (core::Null?, core::Null?) →* dynamic>*, self::D3<self::B<dynamic, dynamic>*, (core::Null?, core::Null?) →* dynamic>*>* md3 = <self::D3<self::B<dynamic, dynamic>*, (core::Null?, core::Null?) →* dynamic>*, self::D3<self::B<dynamic, dynamic>*, (core::Null?, core::Null?) →* dynamic>*>{};
-static field core::List<self::D4<self::B<dynamic, dynamic>*, (core::Null?, core::Null?) →* dynamic>*>* ld4 = <self::D4<self::B<dynamic, dynamic>*, (core::Null?, core::Null?) →* dynamic>*>[];
-static field core::Map<self::D4<self::B<dynamic, dynamic>*, (core::Null?, core::Null?) →* dynamic>*, self::D4<self::B<dynamic, dynamic>*, (core::Null?, core::Null?) →* dynamic>*>* md4 = <self::D4<self::B<dynamic, dynamic>*, (core::Null?, core::Null?) →* dynamic>*, self::D4<self::B<dynamic, dynamic>*, (core::Null?, core::Null?) →* dynamic>*>{};
-static field core::List<self::E<(core::Null?) →* dynamic>*>* le = <self::E<(core::Null?) →* dynamic>*>[];
-static field core::Map<self::E<(core::Null?) →* dynamic>*, self::E<(core::Null?) →* dynamic>*>* me = <self::E<(core::Null?) →* dynamic>*, self::E<(core::Null?) →* dynamic>*>{};
+static field core::List<self::C1<(Null) →* dynamic, (Null) →* dynamic>*>* lc1 = <self::C1<(Null) →* dynamic, (Null) →* dynamic>*>[];
+static field core::Map<self::C1<(Null) →* dynamic, (Null) →* dynamic>*, self::C1<(Null) →* dynamic, (Null) →* dynamic>*>* mc1 = <self::C1<(Null) →* dynamic, (Null) →* dynamic>*, self::C1<(Null) →* dynamic, (Null) →* dynamic>*>{};
+static field core::List<self::C2<(Null) →* dynamic, (Null) →* dynamic>*>* lc2 = <self::C2<(Null) →* dynamic, (Null) →* dynamic>*>[];
+static field core::Map<self::C2<(Null) →* dynamic, (Null) →* dynamic>*, self::C2<(Null) →* dynamic, (Null) →* dynamic>*>* mc2 = <self::C2<(Null) →* dynamic, (Null) →* dynamic>*, self::C2<(Null) →* dynamic, (Null) →* dynamic>*>{};
+static field core::List<self::C3<(Null, Null) →* dynamic, (Null, Null) →* dynamic>*>* lc3 = <self::C3<(Null, Null) →* dynamic, (Null, Null) →* dynamic>*>[];
+static field core::Map<self::C3<(Null, Null) →* dynamic, (Null, Null) →* dynamic>*, self::C3<(Null, Null) →* dynamic, (Null, Null) →* dynamic>*>* mc3 = <self::C3<(Null, Null) →* dynamic, (Null, Null) →* dynamic>*, self::C3<(Null, Null) →* dynamic, (Null, Null) →* dynamic>*>{};
+static field core::List<self::C4<(Null, Null) →* dynamic, (Null, Null) →* dynamic>*>* lc4 = <self::C4<(Null, Null) →* dynamic, (Null, Null) →* dynamic>*>[];
+static field core::Map<self::C4<(Null, Null) →* dynamic, (Null, Null) →* dynamic>*, self::C4<(Null, Null) →* dynamic, (Null, Null) →* dynamic>*>* mc4 = <self::C4<(Null, Null) →* dynamic, (Null, Null) →* dynamic>*, self::C4<(Null, Null) →* dynamic, (Null, Null) →* dynamic>*>{};
+static field core::List<self::D1<self::B<dynamic, dynamic>*, (Null) →* dynamic>*>* ld1 = <self::D1<self::B<dynamic, dynamic>*, (Null) →* dynamic>*>[];
+static field core::Map<self::D1<self::B<dynamic, dynamic>*, (Null) →* dynamic>*, self::D1<self::B<dynamic, dynamic>*, (Null) →* dynamic>*>* md1 = <self::D1<self::B<dynamic, dynamic>*, (Null) →* dynamic>*, self::D1<self::B<dynamic, dynamic>*, (Null) →* dynamic>*>{};
+static field core::List<self::D2<self::B<dynamic, dynamic>*, (Null) →* dynamic>*>* ld2 = <self::D2<self::B<dynamic, dynamic>*, (Null) →* dynamic>*>[];
+static field core::Map<self::D2<self::B<dynamic, dynamic>*, (Null) →* dynamic>*, self::D2<self::B<dynamic, dynamic>*, (Null) →* dynamic>*>* md2 = <self::D2<self::B<dynamic, dynamic>*, (Null) →* dynamic>*, self::D2<self::B<dynamic, dynamic>*, (Null) →* dynamic>*>{};
+static field core::List<self::D3<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>*>* ld3 = <self::D3<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>*>[];
+static field core::Map<self::D3<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>*, self::D3<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>*>* md3 = <self::D3<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>*, self::D3<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>*>{};
+static field core::List<self::D4<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>*>* ld4 = <self::D4<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>*>[];
+static field core::Map<self::D4<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>*, self::D4<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>*>* md4 = <self::D4<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>*, self::D4<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>*>{};
+static field core::List<self::E<(Null) →* dynamic>*>* le = <self::E<(Null) →* dynamic>*>[];
+static field core::Map<self::E<(Null) →* dynamic>*, self::E<(Null) →* dynamic>*>* me = <self::E<(Null) →* dynamic>*, self::E<(Null) →* dynamic>*>{};
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.outline.expect
index 3fb9073..fd3806b 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.outline.expect
@@ -23,7 +23,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Fisk<TypeY extends <TypeZ extends self::Hest<core::Null?>* = dynamic>(TypeZ*) →* dynamic = dynamic> extends core::Object {
+class Fisk<TypeY extends <TypeZ extends self::Hest<Null>* = dynamic>(TypeZ*) →* dynamic = dynamic> extends core::Object {
   synthetic constructor •() → self::Fisk<self::Fisk::TypeY*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.strong.expect
index b37cf28..74416db 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.strong.expect
@@ -24,7 +24,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Fisk<TypeY extends <TypeZ extends self::Hest<core::Null?>* = dynamic>(TypeZ*) →* dynamic = dynamic> extends core::Object {
+class Fisk<TypeY extends <TypeZ extends self::Hest<Null>* = dynamic>(TypeZ*) →* dynamic = dynamic> extends core::Object {
   synthetic constructor •() → self::Fisk<self::Fisk::TypeY*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.strong.transformed.expect
index b37cf28..74416db 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.strong.transformed.expect
@@ -24,7 +24,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Fisk<TypeY extends <TypeZ extends self::Hest<core::Null?>* = dynamic>(TypeZ*) →* dynamic = dynamic> extends core::Object {
+class Fisk<TypeY extends <TypeZ extends self::Hest<Null>* = dynamic>(TypeZ*) →* dynamic = dynamic> extends core::Object {
   synthetic constructor •() → self::Fisk<self::Fisk::TypeY*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/late_lowering/compound.dart.strong.expect b/pkg/front_end/testcases/late_lowering/compound.dart.strong.expect
index 5940e75..43cd6f1 100644
--- a/pkg/front_end/testcases/late_lowering/compound.dart.strong.expect
+++ b/pkg/front_end/testcases/late_lowering/compound.dart.strong.expect
@@ -13,7 +13,7 @@
 static method main() → dynamic {
   core::int? local1;
   function #local1#get() → core::int
-    return let final core::int? #t1 = local1 in #t1.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local1' has not been initialized.") : #t1{core::int};
+    return let final core::int? #t1 = local1 in #t1.==(null) ?{core::int} throw new _in::LateError::localNI("local1") : #t1{core::int};
   function #local1#set(core::int #t2) → dynamic
     return local1 = #t2;
   #local1#set.call(0);
@@ -32,12 +32,12 @@
 static method error() → dynamic {
   final core::int? local;
   function #local#get() → core::int
-    return let final core::int? #t5 = local in #t5.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local' has not been initialized.") : #t5{core::int};
+    return let final core::int? #t5 = local in #t5.==(null) ?{core::int} throw new _in::LateError::localNI("local") : #t5{core::int};
   function #local#set(core::int #t6) → dynamic
     if(local.==(null))
       return local = #t6;
     else
-      throw new _in::LateInitializationErrorImpl::•("Local 'local' has already been initialized.");
+      throw new _in::LateError::localAI("local");
   #local#set.call((let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/late_lowering/compound.dart:20:3: Error: Late variable 'local' without initializer is definitely unassigned.
   local += 0;
   ^^^^^" in #local#get.call()).{core::num::+}(0));
diff --git a/pkg/front_end/testcases/late_lowering/compound.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/compound.dart.strong.transformed.expect
index 5940e75..43cd6f1 100644
--- a/pkg/front_end/testcases/late_lowering/compound.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/compound.dart.strong.transformed.expect
@@ -13,7 +13,7 @@
 static method main() → dynamic {
   core::int? local1;
   function #local1#get() → core::int
-    return let final core::int? #t1 = local1 in #t1.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local1' has not been initialized.") : #t1{core::int};
+    return let final core::int? #t1 = local1 in #t1.==(null) ?{core::int} throw new _in::LateError::localNI("local1") : #t1{core::int};
   function #local1#set(core::int #t2) → dynamic
     return local1 = #t2;
   #local1#set.call(0);
@@ -32,12 +32,12 @@
 static method error() → dynamic {
   final core::int? local;
   function #local#get() → core::int
-    return let final core::int? #t5 = local in #t5.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local' has not been initialized.") : #t5{core::int};
+    return let final core::int? #t5 = local in #t5.==(null) ?{core::int} throw new _in::LateError::localNI("local") : #t5{core::int};
   function #local#set(core::int #t6) → dynamic
     if(local.==(null))
       return local = #t6;
     else
-      throw new _in::LateInitializationErrorImpl::•("Local 'local' has already been initialized.");
+      throw new _in::LateError::localAI("local");
   #local#set.call((let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/late_lowering/compound.dart:20:3: Error: Late variable 'local' without initializer is definitely unassigned.
   local += 0;
   ^^^^^" in #local#get.call()).{core::num::+}(0));
diff --git a/pkg/front_end/testcases/late_lowering/compound.dart.weak.expect b/pkg/front_end/testcases/late_lowering/compound.dart.weak.expect
index b568136..991bc7a 100644
--- a/pkg/front_end/testcases/late_lowering/compound.dart.weak.expect
+++ b/pkg/front_end/testcases/late_lowering/compound.dart.weak.expect
@@ -14,7 +14,7 @@
   core::int? local1;
   core::bool #local1#isSet = false;
   function #local1#get() → core::int
-    return #local1#isSet ?{core::int} local1{core::int} : throw new _in::LateInitializationErrorImpl::•("Local 'local1' has not been initialized.");
+    return #local1#isSet ?{core::int} local1{core::int} : throw new _in::LateError::localNI("local1");
   function #local1#set(core::int #t1) → dynamic {
     #local1#isSet = true;
     return local1 = #t1;
@@ -44,10 +44,10 @@
   final core::int? local;
   core::bool #local#isSet = false;
   function #local#get() → core::int
-    return #local#isSet ?{core::int} local{core::int} : throw new _in::LateInitializationErrorImpl::•("Local 'local' has not been initialized.");
+    return #local#isSet ?{core::int} local{core::int} : throw new _in::LateError::localNI("local");
   function #local#set(core::int #t3) → dynamic
     if(#local#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Local 'local' has already been initialized.");
+      throw new _in::LateError::localAI("local");
     else {
       #local#isSet = true;
       return local = #t3;
diff --git a/pkg/front_end/testcases/late_lowering/compound.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/compound.dart.weak.transformed.expect
index b568136..991bc7a 100644
--- a/pkg/front_end/testcases/late_lowering/compound.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/compound.dart.weak.transformed.expect
@@ -14,7 +14,7 @@
   core::int? local1;
   core::bool #local1#isSet = false;
   function #local1#get() → core::int
-    return #local1#isSet ?{core::int} local1{core::int} : throw new _in::LateInitializationErrorImpl::•("Local 'local1' has not been initialized.");
+    return #local1#isSet ?{core::int} local1{core::int} : throw new _in::LateError::localNI("local1");
   function #local1#set(core::int #t1) → dynamic {
     #local1#isSet = true;
     return local1 = #t1;
@@ -44,10 +44,10 @@
   final core::int? local;
   core::bool #local#isSet = false;
   function #local#get() → core::int
-    return #local#isSet ?{core::int} local{core::int} : throw new _in::LateInitializationErrorImpl::•("Local 'local' has not been initialized.");
+    return #local#isSet ?{core::int} local{core::int} : throw new _in::LateError::localNI("local");
   function #local#set(core::int #t3) → dynamic
     if(#local#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Local 'local' has already been initialized.");
+      throw new _in::LateError::localAI("local");
     else {
       #local#isSet = true;
       return local = #t3;
diff --git a/pkg/front_end/testcases/late_lowering/covariant_late_field.dart.strong.expect b/pkg/front_end/testcases/late_lowering/covariant_late_field.dart.strong.expect
index 0d317bf..4a03bd6 100644
--- a/pkg/front_end/testcases/late_lowering/covariant_late_field.dart.strong.expect
+++ b/pkg/front_end/testcases/late_lowering/covariant_late_field.dart.strong.expect
@@ -21,11 +21,11 @@
     : super core::Object::•()
     ;
   get invariantField() → core::num
-    return let final core::num? #t1 = this.{self::A::_#A#invariantField} in #t1.==(null) ?{core::num} throw new _in::LateInitializationErrorImpl::•("Field 'invariantField' has not been initialized.") : #t1{core::num};
+    return let final core::num? #t1 = this.{self::A::_#A#invariantField} in #t1.==(null) ?{core::num} throw new _in::LateError::fieldNI("invariantField") : #t1{core::num};
   set invariantField(core::num #t2) → void
     this.{self::A::_#A#invariantField} = #t2;
   get covariantField() → core::num
-    return let final core::num? #t3 = this.{self::A::_#A#covariantField} in #t3.==(null) ?{core::num} throw new _in::LateInitializationErrorImpl::•("Field 'covariantField' has not been initialized.") : #t3{core::num};
+    return let final core::num? #t3 = this.{self::A::_#A#covariantField} in #t3.==(null) ?{core::num} throw new _in::LateError::fieldNI("covariantField") : #t3{core::num};
   set covariantField(covariant core::num #t4) → void
     this.{self::A::_#A#covariantField} = #t4;
 }
diff --git a/pkg/front_end/testcases/late_lowering/covariant_late_field.dart.weak.expect b/pkg/front_end/testcases/late_lowering/covariant_late_field.dart.weak.expect
index 6bf2ce0..1ef4b89 100644
--- a/pkg/front_end/testcases/late_lowering/covariant_late_field.dart.weak.expect
+++ b/pkg/front_end/testcases/late_lowering/covariant_late_field.dart.weak.expect
@@ -23,13 +23,13 @@
     : super core::Object::•()
     ;
   get invariantField() → core::num
-    return this.{self::A::_#A#invariantField#isSet} ?{core::num} let final core::num? #t1 = this.{self::A::_#A#invariantField} in #t1{core::num} : throw new _in::LateInitializationErrorImpl::•("Field 'invariantField' has not been initialized.");
+    return this.{self::A::_#A#invariantField#isSet} ?{core::num} let final core::num? #t1 = this.{self::A::_#A#invariantField} in #t1{core::num} : throw new _in::LateError::fieldNI("invariantField");
   set invariantField(core::num #t2) → void {
     this.{self::A::_#A#invariantField#isSet} = true;
     this.{self::A::_#A#invariantField} = #t2;
   }
   get covariantField() → core::num
-    return this.{self::A::_#A#covariantField#isSet} ?{core::num} let final core::num? #t3 = this.{self::A::_#A#covariantField} in #t3{core::num} : throw new _in::LateInitializationErrorImpl::•("Field 'covariantField' has not been initialized.");
+    return this.{self::A::_#A#covariantField#isSet} ?{core::num} let final core::num? #t3 = this.{self::A::_#A#covariantField} in #t3{core::num} : throw new _in::LateError::fieldNI("covariantField");
   set covariantField(covariant core::num #t4) → void {
     this.{self::A::_#A#covariantField#isSet} = true;
     this.{self::A::_#A#covariantField} = #t4;
diff --git a/pkg/front_end/testcases/late_lowering/definitely_assigned.dart.outline.expect b/pkg/front_end/testcases/late_lowering/definitely_assigned.dart.outline.expect
index 1a5e8e7..4078e3a 100644
--- a/pkg/front_end/testcases/late_lowering/definitely_assigned.dart.outline.expect
+++ b/pkg/front_end/testcases/late_lowering/definitely_assigned.dart.outline.expect
@@ -4,9 +4,9 @@
 
 import "dart:async";
 
-static field <T extends core::Object? = dynamic>(T%) → core::Null? fieldDirect;
-static field <T extends core::Object? = dynamic>(core::bool, T%) → core::Null? fieldConditional;
-static field () → core::Null? fieldCompound;
+static field <T extends core::Object? = dynamic>(T%) → Null fieldDirect;
+static field <T extends core::Object? = dynamic>(core::bool, T%) → Null fieldConditional;
+static field () → Null fieldCompound;
 static method methodDirect<T extends core::Object? = dynamic>(self::methodDirect::T% value) → dynamic
   ;
 static method methodConditional<T extends core::Object? = dynamic>(core::bool b, self::methodConditional::T% value) → dynamic
diff --git a/pkg/front_end/testcases/late_lowering/definitely_assigned.dart.strong.expect b/pkg/front_end/testcases/late_lowering/definitely_assigned.dart.strong.expect
index 7c2c33b..ec6a51e 100644
--- a/pkg/front_end/testcases/late_lowering/definitely_assigned.dart.strong.expect
+++ b/pkg/front_end/testcases/late_lowering/definitely_assigned.dart.strong.expect
@@ -64,34 +64,34 @@
 
 import "dart:async";
 
-static field <T extends core::Object? = dynamic>(T%) → core::Null? fieldDirect = <T extends core::Object? = dynamic>(T% value) → core::Null? {
+static field <T extends core::Object? = dynamic>(T%) → Null fieldDirect = <T extends core::Object? = dynamic>(T% value) → Null {
   final T? local2;
   core::bool #local2#isSet = false;
   function #local2#get() → T%
-    return #local2#isSet ?{T%} local2{T%} : throw new _in::LateInitializationErrorImpl::•("Local 'local2' has not been initialized.");
+    return #local2#isSet ?{T%} local2{T%} : throw new _in::LateError::localNI("local2");
   function #local2#set(T% #t1) → dynamic
     if(#local2#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Local 'local2' has already been initialized.");
+      throw new _in::LateError::localAI("local2");
     else {
       #local2#isSet = true;
       return local2 = #t1;
     }
   final core::int? local4;
   function #local4#get() → core::int
-    return let final core::int? #t2 = local4 in #t2.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.") : #t2{core::int};
+    return let final core::int? #t2 = local4 in #t2.==(null) ?{core::int} throw new _in::LateError::localNI("local4") : #t2{core::int};
   function #local4#set(core::int #t3) → dynamic
     if(local4.==(null))
       return local4 = #t3;
     else
-      throw new _in::LateInitializationErrorImpl::•("Local 'local4' has already been initialized.");
+      throw new _in::LateError::localAI("local4");
   final FutureOr<core::int>? local6;
   function #local6#get() → FutureOr<core::int>
-    return let final FutureOr<core::int>? #t4 = local6 in #t4.==(null) ?{FutureOr<core::int>} throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.") : #t4{FutureOr<core::int>};
+    return let final FutureOr<core::int>? #t4 = local6 in #t4.==(null) ?{FutureOr<core::int>} throw new _in::LateError::localNI("local6") : #t4{FutureOr<core::int>};
   function #local6#set(FutureOr<core::int>#t5) → dynamic
     if(local6.==(null))
       return local6 = #t5;
     else
-      throw new _in::LateInitializationErrorImpl::•("Local 'local6' has already been initialized.");
+      throw new _in::LateError::localAI("local6");
   #local2#set.call(value);
   #local4#set.call(0);
   #local6#set.call(0);
@@ -105,34 +105,34 @@
   local6 = 0; // error
   ^^^^^^" in #local6#set.call(0);
 };
-static field <T extends core::Object? = dynamic>(core::bool, T%) → core::Null? fieldConditional = <T extends core::Object? = dynamic>(core::bool b, T% value) → core::Null? {
+static field <T extends core::Object? = dynamic>(core::bool, T%) → Null fieldConditional = <T extends core::Object? = dynamic>(core::bool b, T% value) → Null {
   final T? local2;
   core::bool #local2#isSet = false;
   function #local2#get() → T%
-    return #local2#isSet ?{T%} local2{T%} : throw new _in::LateInitializationErrorImpl::•("Local 'local2' has not been initialized.");
+    return #local2#isSet ?{T%} local2{T%} : throw new _in::LateError::localNI("local2");
   function #local2#set(T% #t9) → dynamic
     if(#local2#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Local 'local2' has already been initialized.");
+      throw new _in::LateError::localAI("local2");
     else {
       #local2#isSet = true;
       return local2 = #t9;
     }
   final core::int? local4;
   function #local4#get() → core::int
-    return let final core::int? #t10 = local4 in #t10.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.") : #t10{core::int};
+    return let final core::int? #t10 = local4 in #t10.==(null) ?{core::int} throw new _in::LateError::localNI("local4") : #t10{core::int};
   function #local4#set(core::int #t11) → dynamic
     if(local4.==(null))
       return local4 = #t11;
     else
-      throw new _in::LateInitializationErrorImpl::•("Local 'local4' has already been initialized.");
+      throw new _in::LateError::localAI("local4");
   final FutureOr<core::int>? local6;
   function #local6#get() → FutureOr<core::int>
-    return let final FutureOr<core::int>? #t12 = local6 in #t12.==(null) ?{FutureOr<core::int>} throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.") : #t12{FutureOr<core::int>};
+    return let final FutureOr<core::int>? #t12 = local6 in #t12.==(null) ?{FutureOr<core::int>} throw new _in::LateError::localNI("local6") : #t12{FutureOr<core::int>};
   function #local6#set(FutureOr<core::int>#t13) → dynamic
     if(local6.==(null))
       return local6 = #t13;
     else
-      throw new _in::LateInitializationErrorImpl::•("Local 'local6' has already been initialized.");
+      throw new _in::LateError::localAI("local6");
   if(b) {
     #local2#set.call(value);
     #local4#set.call(0);
@@ -151,15 +151,15 @@
   local6 = 0; // error
   ^^^^^^" in #local6#set.call(0);
 };
-static field () → core::Null? fieldCompound = () → core::Null? {
+static field () → Null fieldCompound = () → Null {
   final core::int? local4;
   function #local4#get() → core::int
-    return let final core::int? #t17 = local4 in #t17.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.") : #t17{core::int};
+    return let final core::int? #t17 = local4 in #t17.==(null) ?{core::int} throw new _in::LateError::localNI("local4") : #t17{core::int};
   function #local4#set(core::int #t18) → dynamic
     if(local4.==(null))
       return local4 = #t18;
     else
-      throw new _in::LateInitializationErrorImpl::•("Local 'local4' has already been initialized.");
+      throw new _in::LateError::localAI("local4");
   #local4#set.call(0);
   let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:88:3: Error: Late final variable 'local4' definitely assigned.
   local4 += 0; // error
@@ -169,30 +169,30 @@
   final self::methodDirect::T? local2;
   core::bool #local2#isSet = false;
   function #local2#get() → self::methodDirect::T%
-    return #local2#isSet ?{self::methodDirect::T%} local2{self::methodDirect::T%} : throw new _in::LateInitializationErrorImpl::•("Local 'local2' has not been initialized.");
+    return #local2#isSet ?{self::methodDirect::T%} local2{self::methodDirect::T%} : throw new _in::LateError::localNI("local2");
   function #local2#set(self::methodDirect::T% #t20) → dynamic
     if(#local2#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Local 'local2' has already been initialized.");
+      throw new _in::LateError::localAI("local2");
     else {
       #local2#isSet = true;
       return local2 = #t20;
     }
   final core::int? local4;
   function #local4#get() → core::int
-    return let final core::int? #t21 = local4 in #t21.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.") : #t21{core::int};
+    return let final core::int? #t21 = local4 in #t21.==(null) ?{core::int} throw new _in::LateError::localNI("local4") : #t21{core::int};
   function #local4#set(core::int #t22) → dynamic
     if(local4.==(null))
       return local4 = #t22;
     else
-      throw new _in::LateInitializationErrorImpl::•("Local 'local4' has already been initialized.");
+      throw new _in::LateError::localAI("local4");
   final FutureOr<core::int>? local6;
   function #local6#get() → FutureOr<core::int>
-    return let final FutureOr<core::int>? #t23 = local6 in #t23.==(null) ?{FutureOr<core::int>} throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.") : #t23{FutureOr<core::int>};
+    return let final FutureOr<core::int>? #t23 = local6 in #t23.==(null) ?{FutureOr<core::int>} throw new _in::LateError::localNI("local6") : #t23{FutureOr<core::int>};
   function #local6#set(FutureOr<core::int>#t24) → dynamic
     if(local6.==(null))
       return local6 = #t24;
     else
-      throw new _in::LateInitializationErrorImpl::•("Local 'local6' has already been initialized.");
+      throw new _in::LateError::localAI("local6");
   #local2#set.call(value);
   #local4#set.call(0);
   #local6#set.call(0);
@@ -210,30 +210,30 @@
   final self::methodConditional::T? local2;
   core::bool #local2#isSet = false;
   function #local2#get() → self::methodConditional::T%
-    return #local2#isSet ?{self::methodConditional::T%} local2{self::methodConditional::T%} : throw new _in::LateInitializationErrorImpl::•("Local 'local2' has not been initialized.");
+    return #local2#isSet ?{self::methodConditional::T%} local2{self::methodConditional::T%} : throw new _in::LateError::localNI("local2");
   function #local2#set(self::methodConditional::T% #t28) → dynamic
     if(#local2#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Local 'local2' has already been initialized.");
+      throw new _in::LateError::localAI("local2");
     else {
       #local2#isSet = true;
       return local2 = #t28;
     }
   final core::int? local4;
   function #local4#get() → core::int
-    return let final core::int? #t29 = local4 in #t29.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.") : #t29{core::int};
+    return let final core::int? #t29 = local4 in #t29.==(null) ?{core::int} throw new _in::LateError::localNI("local4") : #t29{core::int};
   function #local4#set(core::int #t30) → dynamic
     if(local4.==(null))
       return local4 = #t30;
     else
-      throw new _in::LateInitializationErrorImpl::•("Local 'local4' has already been initialized.");
+      throw new _in::LateError::localAI("local4");
   final FutureOr<core::int>? local6;
   function #local6#get() → FutureOr<core::int>
-    return let final FutureOr<core::int>? #t31 = local6 in #t31.==(null) ?{FutureOr<core::int>} throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.") : #t31{FutureOr<core::int>};
+    return let final FutureOr<core::int>? #t31 = local6 in #t31.==(null) ?{FutureOr<core::int>} throw new _in::LateError::localNI("local6") : #t31{FutureOr<core::int>};
   function #local6#set(FutureOr<core::int>#t32) → dynamic
     if(local6.==(null))
       return local6 = #t32;
     else
-      throw new _in::LateInitializationErrorImpl::•("Local 'local6' has already been initialized.");
+      throw new _in::LateError::localAI("local6");
   if(b) {
     #local2#set.call(value);
     #local4#set.call(0);
@@ -255,12 +255,12 @@
 static method methodCompound() → dynamic {
   final core::int? local4;
   function #local4#get() → core::int
-    return let final core::int? #t36 = local4 in #t36.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.") : #t36{core::int};
+    return let final core::int? #t36 = local4 in #t36.==(null) ?{core::int} throw new _in::LateError::localNI("local4") : #t36{core::int};
   function #local4#set(core::int #t37) → dynamic
     if(local4.==(null))
       return local4 = #t37;
     else
-      throw new _in::LateInitializationErrorImpl::•("Local 'local4' has already been initialized.");
+      throw new _in::LateError::localAI("local4");
   #local4#set.call(0);
   let final<BottomType> #t38 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:80:3: Error: Late final variable 'local4' definitely assigned.
   local4 += 0; // error
diff --git a/pkg/front_end/testcases/late_lowering/definitely_assigned.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/definitely_assigned.dart.strong.transformed.expect
index 7c2c33b..ec6a51e 100644
--- a/pkg/front_end/testcases/late_lowering/definitely_assigned.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/definitely_assigned.dart.strong.transformed.expect
@@ -64,34 +64,34 @@
 
 import "dart:async";
 
-static field <T extends core::Object? = dynamic>(T%) → core::Null? fieldDirect = <T extends core::Object? = dynamic>(T% value) → core::Null? {
+static field <T extends core::Object? = dynamic>(T%) → Null fieldDirect = <T extends core::Object? = dynamic>(T% value) → Null {
   final T? local2;
   core::bool #local2#isSet = false;
   function #local2#get() → T%
-    return #local2#isSet ?{T%} local2{T%} : throw new _in::LateInitializationErrorImpl::•("Local 'local2' has not been initialized.");
+    return #local2#isSet ?{T%} local2{T%} : throw new _in::LateError::localNI("local2");
   function #local2#set(T% #t1) → dynamic
     if(#local2#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Local 'local2' has already been initialized.");
+      throw new _in::LateError::localAI("local2");
     else {
       #local2#isSet = true;
       return local2 = #t1;
     }
   final core::int? local4;
   function #local4#get() → core::int
-    return let final core::int? #t2 = local4 in #t2.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.") : #t2{core::int};
+    return let final core::int? #t2 = local4 in #t2.==(null) ?{core::int} throw new _in::LateError::localNI("local4") : #t2{core::int};
   function #local4#set(core::int #t3) → dynamic
     if(local4.==(null))
       return local4 = #t3;
     else
-      throw new _in::LateInitializationErrorImpl::•("Local 'local4' has already been initialized.");
+      throw new _in::LateError::localAI("local4");
   final FutureOr<core::int>? local6;
   function #local6#get() → FutureOr<core::int>
-    return let final FutureOr<core::int>? #t4 = local6 in #t4.==(null) ?{FutureOr<core::int>} throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.") : #t4{FutureOr<core::int>};
+    return let final FutureOr<core::int>? #t4 = local6 in #t4.==(null) ?{FutureOr<core::int>} throw new _in::LateError::localNI("local6") : #t4{FutureOr<core::int>};
   function #local6#set(FutureOr<core::int>#t5) → dynamic
     if(local6.==(null))
       return local6 = #t5;
     else
-      throw new _in::LateInitializationErrorImpl::•("Local 'local6' has already been initialized.");
+      throw new _in::LateError::localAI("local6");
   #local2#set.call(value);
   #local4#set.call(0);
   #local6#set.call(0);
@@ -105,34 +105,34 @@
   local6 = 0; // error
   ^^^^^^" in #local6#set.call(0);
 };
-static field <T extends core::Object? = dynamic>(core::bool, T%) → core::Null? fieldConditional = <T extends core::Object? = dynamic>(core::bool b, T% value) → core::Null? {
+static field <T extends core::Object? = dynamic>(core::bool, T%) → Null fieldConditional = <T extends core::Object? = dynamic>(core::bool b, T% value) → Null {
   final T? local2;
   core::bool #local2#isSet = false;
   function #local2#get() → T%
-    return #local2#isSet ?{T%} local2{T%} : throw new _in::LateInitializationErrorImpl::•("Local 'local2' has not been initialized.");
+    return #local2#isSet ?{T%} local2{T%} : throw new _in::LateError::localNI("local2");
   function #local2#set(T% #t9) → dynamic
     if(#local2#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Local 'local2' has already been initialized.");
+      throw new _in::LateError::localAI("local2");
     else {
       #local2#isSet = true;
       return local2 = #t9;
     }
   final core::int? local4;
   function #local4#get() → core::int
-    return let final core::int? #t10 = local4 in #t10.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.") : #t10{core::int};
+    return let final core::int? #t10 = local4 in #t10.==(null) ?{core::int} throw new _in::LateError::localNI("local4") : #t10{core::int};
   function #local4#set(core::int #t11) → dynamic
     if(local4.==(null))
       return local4 = #t11;
     else
-      throw new _in::LateInitializationErrorImpl::•("Local 'local4' has already been initialized.");
+      throw new _in::LateError::localAI("local4");
   final FutureOr<core::int>? local6;
   function #local6#get() → FutureOr<core::int>
-    return let final FutureOr<core::int>? #t12 = local6 in #t12.==(null) ?{FutureOr<core::int>} throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.") : #t12{FutureOr<core::int>};
+    return let final FutureOr<core::int>? #t12 = local6 in #t12.==(null) ?{FutureOr<core::int>} throw new _in::LateError::localNI("local6") : #t12{FutureOr<core::int>};
   function #local6#set(FutureOr<core::int>#t13) → dynamic
     if(local6.==(null))
       return local6 = #t13;
     else
-      throw new _in::LateInitializationErrorImpl::•("Local 'local6' has already been initialized.");
+      throw new _in::LateError::localAI("local6");
   if(b) {
     #local2#set.call(value);
     #local4#set.call(0);
@@ -151,15 +151,15 @@
   local6 = 0; // error
   ^^^^^^" in #local6#set.call(0);
 };
-static field () → core::Null? fieldCompound = () → core::Null? {
+static field () → Null fieldCompound = () → Null {
   final core::int? local4;
   function #local4#get() → core::int
-    return let final core::int? #t17 = local4 in #t17.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.") : #t17{core::int};
+    return let final core::int? #t17 = local4 in #t17.==(null) ?{core::int} throw new _in::LateError::localNI("local4") : #t17{core::int};
   function #local4#set(core::int #t18) → dynamic
     if(local4.==(null))
       return local4 = #t18;
     else
-      throw new _in::LateInitializationErrorImpl::•("Local 'local4' has already been initialized.");
+      throw new _in::LateError::localAI("local4");
   #local4#set.call(0);
   let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:88:3: Error: Late final variable 'local4' definitely assigned.
   local4 += 0; // error
@@ -169,30 +169,30 @@
   final self::methodDirect::T? local2;
   core::bool #local2#isSet = false;
   function #local2#get() → self::methodDirect::T%
-    return #local2#isSet ?{self::methodDirect::T%} local2{self::methodDirect::T%} : throw new _in::LateInitializationErrorImpl::•("Local 'local2' has not been initialized.");
+    return #local2#isSet ?{self::methodDirect::T%} local2{self::methodDirect::T%} : throw new _in::LateError::localNI("local2");
   function #local2#set(self::methodDirect::T% #t20) → dynamic
     if(#local2#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Local 'local2' has already been initialized.");
+      throw new _in::LateError::localAI("local2");
     else {
       #local2#isSet = true;
       return local2 = #t20;
     }
   final core::int? local4;
   function #local4#get() → core::int
-    return let final core::int? #t21 = local4 in #t21.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.") : #t21{core::int};
+    return let final core::int? #t21 = local4 in #t21.==(null) ?{core::int} throw new _in::LateError::localNI("local4") : #t21{core::int};
   function #local4#set(core::int #t22) → dynamic
     if(local4.==(null))
       return local4 = #t22;
     else
-      throw new _in::LateInitializationErrorImpl::•("Local 'local4' has already been initialized.");
+      throw new _in::LateError::localAI("local4");
   final FutureOr<core::int>? local6;
   function #local6#get() → FutureOr<core::int>
-    return let final FutureOr<core::int>? #t23 = local6 in #t23.==(null) ?{FutureOr<core::int>} throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.") : #t23{FutureOr<core::int>};
+    return let final FutureOr<core::int>? #t23 = local6 in #t23.==(null) ?{FutureOr<core::int>} throw new _in::LateError::localNI("local6") : #t23{FutureOr<core::int>};
   function #local6#set(FutureOr<core::int>#t24) → dynamic
     if(local6.==(null))
       return local6 = #t24;
     else
-      throw new _in::LateInitializationErrorImpl::•("Local 'local6' has already been initialized.");
+      throw new _in::LateError::localAI("local6");
   #local2#set.call(value);
   #local4#set.call(0);
   #local6#set.call(0);
@@ -210,30 +210,30 @@
   final self::methodConditional::T? local2;
   core::bool #local2#isSet = false;
   function #local2#get() → self::methodConditional::T%
-    return #local2#isSet ?{self::methodConditional::T%} local2{self::methodConditional::T%} : throw new _in::LateInitializationErrorImpl::•("Local 'local2' has not been initialized.");
+    return #local2#isSet ?{self::methodConditional::T%} local2{self::methodConditional::T%} : throw new _in::LateError::localNI("local2");
   function #local2#set(self::methodConditional::T% #t28) → dynamic
     if(#local2#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Local 'local2' has already been initialized.");
+      throw new _in::LateError::localAI("local2");
     else {
       #local2#isSet = true;
       return local2 = #t28;
     }
   final core::int? local4;
   function #local4#get() → core::int
-    return let final core::int? #t29 = local4 in #t29.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.") : #t29{core::int};
+    return let final core::int? #t29 = local4 in #t29.==(null) ?{core::int} throw new _in::LateError::localNI("local4") : #t29{core::int};
   function #local4#set(core::int #t30) → dynamic
     if(local4.==(null))
       return local4 = #t30;
     else
-      throw new _in::LateInitializationErrorImpl::•("Local 'local4' has already been initialized.");
+      throw new _in::LateError::localAI("local4");
   final FutureOr<core::int>? local6;
   function #local6#get() → FutureOr<core::int>
-    return let final FutureOr<core::int>? #t31 = local6 in #t31.==(null) ?{FutureOr<core::int>} throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.") : #t31{FutureOr<core::int>};
+    return let final FutureOr<core::int>? #t31 = local6 in #t31.==(null) ?{FutureOr<core::int>} throw new _in::LateError::localNI("local6") : #t31{FutureOr<core::int>};
   function #local6#set(FutureOr<core::int>#t32) → dynamic
     if(local6.==(null))
       return local6 = #t32;
     else
-      throw new _in::LateInitializationErrorImpl::•("Local 'local6' has already been initialized.");
+      throw new _in::LateError::localAI("local6");
   if(b) {
     #local2#set.call(value);
     #local4#set.call(0);
@@ -255,12 +255,12 @@
 static method methodCompound() → dynamic {
   final core::int? local4;
   function #local4#get() → core::int
-    return let final core::int? #t36 = local4 in #t36.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.") : #t36{core::int};
+    return let final core::int? #t36 = local4 in #t36.==(null) ?{core::int} throw new _in::LateError::localNI("local4") : #t36{core::int};
   function #local4#set(core::int #t37) → dynamic
     if(local4.==(null))
       return local4 = #t37;
     else
-      throw new _in::LateInitializationErrorImpl::•("Local 'local4' has already been initialized.");
+      throw new _in::LateError::localAI("local4");
   #local4#set.call(0);
   let final<BottomType> #t38 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:80:3: Error: Late final variable 'local4' definitely assigned.
   local4 += 0; // error
diff --git a/pkg/front_end/testcases/late_lowering/definitely_assigned.dart.weak.expect b/pkg/front_end/testcases/late_lowering/definitely_assigned.dart.weak.expect
index fcbfeb4..0b4576c 100644
--- a/pkg/front_end/testcases/late_lowering/definitely_assigned.dart.weak.expect
+++ b/pkg/front_end/testcases/late_lowering/definitely_assigned.dart.weak.expect
@@ -64,14 +64,14 @@
 
 import "dart:async";
 
-static field <T extends core::Object? = dynamic>(T%) → core::Null? fieldDirect = <T extends core::Object? = dynamic>(T% value) → core::Null? {
+static field <T extends core::Object? = dynamic>(T%) → Null fieldDirect = <T extends core::Object? = dynamic>(T% value) → Null {
   final T? local2;
   core::bool #local2#isSet = false;
   function #local2#get() → T%
-    return #local2#isSet ?{T%} local2{T%} : throw new _in::LateInitializationErrorImpl::•("Local 'local2' has not been initialized.");
+    return #local2#isSet ?{T%} local2{T%} : throw new _in::LateError::localNI("local2");
   function #local2#set(T% #t1) → dynamic
     if(#local2#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Local 'local2' has already been initialized.");
+      throw new _in::LateError::localAI("local2");
     else {
       #local2#isSet = true;
       return local2 = #t1;
@@ -79,10 +79,10 @@
   final core::int? local4;
   core::bool #local4#isSet = false;
   function #local4#get() → core::int
-    return #local4#isSet ?{core::int} local4{core::int} : throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.");
+    return #local4#isSet ?{core::int} local4{core::int} : throw new _in::LateError::localNI("local4");
   function #local4#set(core::int #t2) → dynamic
     if(#local4#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Local 'local4' has already been initialized.");
+      throw new _in::LateError::localAI("local4");
     else {
       #local4#isSet = true;
       return local4 = #t2;
@@ -90,10 +90,10 @@
   final FutureOr<core::int>? local6;
   core::bool #local6#isSet = false;
   function #local6#get() → FutureOr<core::int>
-    return #local6#isSet ?{FutureOr<core::int>} local6{FutureOr<core::int>} : throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.");
+    return #local6#isSet ?{FutureOr<core::int>} local6{FutureOr<core::int>} : throw new _in::LateError::localNI("local6");
   function #local6#set(FutureOr<core::int>#t3) → dynamic
     if(#local6#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Local 'local6' has already been initialized.");
+      throw new _in::LateError::localAI("local6");
     else {
       #local6#isSet = true;
       return local6 = #t3;
@@ -111,14 +111,14 @@
   local6 = 0; // error
   ^^^^^^" in #local6#set.call(0);
 };
-static field <T extends core::Object? = dynamic>(core::bool, T%) → core::Null? fieldConditional = <T extends core::Object? = dynamic>(core::bool b, T% value) → core::Null? {
+static field <T extends core::Object? = dynamic>(core::bool, T%) → Null fieldConditional = <T extends core::Object? = dynamic>(core::bool b, T% value) → Null {
   final T? local2;
   core::bool #local2#isSet = false;
   function #local2#get() → T%
-    return #local2#isSet ?{T%} local2{T%} : throw new _in::LateInitializationErrorImpl::•("Local 'local2' has not been initialized.");
+    return #local2#isSet ?{T%} local2{T%} : throw new _in::LateError::localNI("local2");
   function #local2#set(T% #t7) → dynamic
     if(#local2#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Local 'local2' has already been initialized.");
+      throw new _in::LateError::localAI("local2");
     else {
       #local2#isSet = true;
       return local2 = #t7;
@@ -126,10 +126,10 @@
   final core::int? local4;
   core::bool #local4#isSet = false;
   function #local4#get() → core::int
-    return #local4#isSet ?{core::int} local4{core::int} : throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.");
+    return #local4#isSet ?{core::int} local4{core::int} : throw new _in::LateError::localNI("local4");
   function #local4#set(core::int #t8) → dynamic
     if(#local4#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Local 'local4' has already been initialized.");
+      throw new _in::LateError::localAI("local4");
     else {
       #local4#isSet = true;
       return local4 = #t8;
@@ -137,10 +137,10 @@
   final FutureOr<core::int>? local6;
   core::bool #local6#isSet = false;
   function #local6#get() → FutureOr<core::int>
-    return #local6#isSet ?{FutureOr<core::int>} local6{FutureOr<core::int>} : throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.");
+    return #local6#isSet ?{FutureOr<core::int>} local6{FutureOr<core::int>} : throw new _in::LateError::localNI("local6");
   function #local6#set(FutureOr<core::int>#t9) → dynamic
     if(#local6#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Local 'local6' has already been initialized.");
+      throw new _in::LateError::localAI("local6");
     else {
       #local6#isSet = true;
       return local6 = #t9;
@@ -163,14 +163,14 @@
   local6 = 0; // error
   ^^^^^^" in #local6#set.call(0);
 };
-static field () → core::Null? fieldCompound = () → core::Null? {
+static field () → Null fieldCompound = () → Null {
   final core::int? local4;
   core::bool #local4#isSet = false;
   function #local4#get() → core::int
-    return #local4#isSet ?{core::int} local4{core::int} : throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.");
+    return #local4#isSet ?{core::int} local4{core::int} : throw new _in::LateError::localNI("local4");
   function #local4#set(core::int #t13) → dynamic
     if(#local4#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Local 'local4' has already been initialized.");
+      throw new _in::LateError::localAI("local4");
     else {
       #local4#isSet = true;
       return local4 = #t13;
@@ -184,10 +184,10 @@
   final self::methodDirect::T? local2;
   core::bool #local2#isSet = false;
   function #local2#get() → self::methodDirect::T%
-    return #local2#isSet ?{self::methodDirect::T%} local2{self::methodDirect::T%} : throw new _in::LateInitializationErrorImpl::•("Local 'local2' has not been initialized.");
+    return #local2#isSet ?{self::methodDirect::T%} local2{self::methodDirect::T%} : throw new _in::LateError::localNI("local2");
   function #local2#set(self::methodDirect::T% #t15) → dynamic
     if(#local2#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Local 'local2' has already been initialized.");
+      throw new _in::LateError::localAI("local2");
     else {
       #local2#isSet = true;
       return local2 = #t15;
@@ -195,10 +195,10 @@
   final core::int? local4;
   core::bool #local4#isSet = false;
   function #local4#get() → core::int
-    return #local4#isSet ?{core::int} local4{core::int} : throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.");
+    return #local4#isSet ?{core::int} local4{core::int} : throw new _in::LateError::localNI("local4");
   function #local4#set(core::int #t16) → dynamic
     if(#local4#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Local 'local4' has already been initialized.");
+      throw new _in::LateError::localAI("local4");
     else {
       #local4#isSet = true;
       return local4 = #t16;
@@ -206,10 +206,10 @@
   final FutureOr<core::int>? local6;
   core::bool #local6#isSet = false;
   function #local6#get() → FutureOr<core::int>
-    return #local6#isSet ?{FutureOr<core::int>} local6{FutureOr<core::int>} : throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.");
+    return #local6#isSet ?{FutureOr<core::int>} local6{FutureOr<core::int>} : throw new _in::LateError::localNI("local6");
   function #local6#set(FutureOr<core::int>#t17) → dynamic
     if(#local6#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Local 'local6' has already been initialized.");
+      throw new _in::LateError::localAI("local6");
     else {
       #local6#isSet = true;
       return local6 = #t17;
@@ -231,10 +231,10 @@
   final self::methodConditional::T? local2;
   core::bool #local2#isSet = false;
   function #local2#get() → self::methodConditional::T%
-    return #local2#isSet ?{self::methodConditional::T%} local2{self::methodConditional::T%} : throw new _in::LateInitializationErrorImpl::•("Local 'local2' has not been initialized.");
+    return #local2#isSet ?{self::methodConditional::T%} local2{self::methodConditional::T%} : throw new _in::LateError::localNI("local2");
   function #local2#set(self::methodConditional::T% #t21) → dynamic
     if(#local2#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Local 'local2' has already been initialized.");
+      throw new _in::LateError::localAI("local2");
     else {
       #local2#isSet = true;
       return local2 = #t21;
@@ -242,10 +242,10 @@
   final core::int? local4;
   core::bool #local4#isSet = false;
   function #local4#get() → core::int
-    return #local4#isSet ?{core::int} local4{core::int} : throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.");
+    return #local4#isSet ?{core::int} local4{core::int} : throw new _in::LateError::localNI("local4");
   function #local4#set(core::int #t22) → dynamic
     if(#local4#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Local 'local4' has already been initialized.");
+      throw new _in::LateError::localAI("local4");
     else {
       #local4#isSet = true;
       return local4 = #t22;
@@ -253,10 +253,10 @@
   final FutureOr<core::int>? local6;
   core::bool #local6#isSet = false;
   function #local6#get() → FutureOr<core::int>
-    return #local6#isSet ?{FutureOr<core::int>} local6{FutureOr<core::int>} : throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.");
+    return #local6#isSet ?{FutureOr<core::int>} local6{FutureOr<core::int>} : throw new _in::LateError::localNI("local6");
   function #local6#set(FutureOr<core::int>#t23) → dynamic
     if(#local6#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Local 'local6' has already been initialized.");
+      throw new _in::LateError::localAI("local6");
     else {
       #local6#isSet = true;
       return local6 = #t23;
@@ -283,10 +283,10 @@
   final core::int? local4;
   core::bool #local4#isSet = false;
   function #local4#get() → core::int
-    return #local4#isSet ?{core::int} local4{core::int} : throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.");
+    return #local4#isSet ?{core::int} local4{core::int} : throw new _in::LateError::localNI("local4");
   function #local4#set(core::int #t27) → dynamic
     if(#local4#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Local 'local4' has already been initialized.");
+      throw new _in::LateError::localAI("local4");
     else {
       #local4#isSet = true;
       return local4 = #t27;
diff --git a/pkg/front_end/testcases/late_lowering/definitely_assigned.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/definitely_assigned.dart.weak.transformed.expect
index fcbfeb4..0b4576c 100644
--- a/pkg/front_end/testcases/late_lowering/definitely_assigned.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/definitely_assigned.dart.weak.transformed.expect
@@ -64,14 +64,14 @@
 
 import "dart:async";
 
-static field <T extends core::Object? = dynamic>(T%) → core::Null? fieldDirect = <T extends core::Object? = dynamic>(T% value) → core::Null? {
+static field <T extends core::Object? = dynamic>(T%) → Null fieldDirect = <T extends core::Object? = dynamic>(T% value) → Null {
   final T? local2;
   core::bool #local2#isSet = false;
   function #local2#get() → T%
-    return #local2#isSet ?{T%} local2{T%} : throw new _in::LateInitializationErrorImpl::•("Local 'local2' has not been initialized.");
+    return #local2#isSet ?{T%} local2{T%} : throw new _in::LateError::localNI("local2");
   function #local2#set(T% #t1) → dynamic
     if(#local2#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Local 'local2' has already been initialized.");
+      throw new _in::LateError::localAI("local2");
     else {
       #local2#isSet = true;
       return local2 = #t1;
@@ -79,10 +79,10 @@
   final core::int? local4;
   core::bool #local4#isSet = false;
   function #local4#get() → core::int
-    return #local4#isSet ?{core::int} local4{core::int} : throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.");
+    return #local4#isSet ?{core::int} local4{core::int} : throw new _in::LateError::localNI("local4");
   function #local4#set(core::int #t2) → dynamic
     if(#local4#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Local 'local4' has already been initialized.");
+      throw new _in::LateError::localAI("local4");
     else {
       #local4#isSet = true;
       return local4 = #t2;
@@ -90,10 +90,10 @@
   final FutureOr<core::int>? local6;
   core::bool #local6#isSet = false;
   function #local6#get() → FutureOr<core::int>
-    return #local6#isSet ?{FutureOr<core::int>} local6{FutureOr<core::int>} : throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.");
+    return #local6#isSet ?{FutureOr<core::int>} local6{FutureOr<core::int>} : throw new _in::LateError::localNI("local6");
   function #local6#set(FutureOr<core::int>#t3) → dynamic
     if(#local6#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Local 'local6' has already been initialized.");
+      throw new _in::LateError::localAI("local6");
     else {
       #local6#isSet = true;
       return local6 = #t3;
@@ -111,14 +111,14 @@
   local6 = 0; // error
   ^^^^^^" in #local6#set.call(0);
 };
-static field <T extends core::Object? = dynamic>(core::bool, T%) → core::Null? fieldConditional = <T extends core::Object? = dynamic>(core::bool b, T% value) → core::Null? {
+static field <T extends core::Object? = dynamic>(core::bool, T%) → Null fieldConditional = <T extends core::Object? = dynamic>(core::bool b, T% value) → Null {
   final T? local2;
   core::bool #local2#isSet = false;
   function #local2#get() → T%
-    return #local2#isSet ?{T%} local2{T%} : throw new _in::LateInitializationErrorImpl::•("Local 'local2' has not been initialized.");
+    return #local2#isSet ?{T%} local2{T%} : throw new _in::LateError::localNI("local2");
   function #local2#set(T% #t7) → dynamic
     if(#local2#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Local 'local2' has already been initialized.");
+      throw new _in::LateError::localAI("local2");
     else {
       #local2#isSet = true;
       return local2 = #t7;
@@ -126,10 +126,10 @@
   final core::int? local4;
   core::bool #local4#isSet = false;
   function #local4#get() → core::int
-    return #local4#isSet ?{core::int} local4{core::int} : throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.");
+    return #local4#isSet ?{core::int} local4{core::int} : throw new _in::LateError::localNI("local4");
   function #local4#set(core::int #t8) → dynamic
     if(#local4#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Local 'local4' has already been initialized.");
+      throw new _in::LateError::localAI("local4");
     else {
       #local4#isSet = true;
       return local4 = #t8;
@@ -137,10 +137,10 @@
   final FutureOr<core::int>? local6;
   core::bool #local6#isSet = false;
   function #local6#get() → FutureOr<core::int>
-    return #local6#isSet ?{FutureOr<core::int>} local6{FutureOr<core::int>} : throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.");
+    return #local6#isSet ?{FutureOr<core::int>} local6{FutureOr<core::int>} : throw new _in::LateError::localNI("local6");
   function #local6#set(FutureOr<core::int>#t9) → dynamic
     if(#local6#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Local 'local6' has already been initialized.");
+      throw new _in::LateError::localAI("local6");
     else {
       #local6#isSet = true;
       return local6 = #t9;
@@ -163,14 +163,14 @@
   local6 = 0; // error
   ^^^^^^" in #local6#set.call(0);
 };
-static field () → core::Null? fieldCompound = () → core::Null? {
+static field () → Null fieldCompound = () → Null {
   final core::int? local4;
   core::bool #local4#isSet = false;
   function #local4#get() → core::int
-    return #local4#isSet ?{core::int} local4{core::int} : throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.");
+    return #local4#isSet ?{core::int} local4{core::int} : throw new _in::LateError::localNI("local4");
   function #local4#set(core::int #t13) → dynamic
     if(#local4#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Local 'local4' has already been initialized.");
+      throw new _in::LateError::localAI("local4");
     else {
       #local4#isSet = true;
       return local4 = #t13;
@@ -184,10 +184,10 @@
   final self::methodDirect::T? local2;
   core::bool #local2#isSet = false;
   function #local2#get() → self::methodDirect::T%
-    return #local2#isSet ?{self::methodDirect::T%} local2{self::methodDirect::T%} : throw new _in::LateInitializationErrorImpl::•("Local 'local2' has not been initialized.");
+    return #local2#isSet ?{self::methodDirect::T%} local2{self::methodDirect::T%} : throw new _in::LateError::localNI("local2");
   function #local2#set(self::methodDirect::T% #t15) → dynamic
     if(#local2#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Local 'local2' has already been initialized.");
+      throw new _in::LateError::localAI("local2");
     else {
       #local2#isSet = true;
       return local2 = #t15;
@@ -195,10 +195,10 @@
   final core::int? local4;
   core::bool #local4#isSet = false;
   function #local4#get() → core::int
-    return #local4#isSet ?{core::int} local4{core::int} : throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.");
+    return #local4#isSet ?{core::int} local4{core::int} : throw new _in::LateError::localNI("local4");
   function #local4#set(core::int #t16) → dynamic
     if(#local4#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Local 'local4' has already been initialized.");
+      throw new _in::LateError::localAI("local4");
     else {
       #local4#isSet = true;
       return local4 = #t16;
@@ -206,10 +206,10 @@
   final FutureOr<core::int>? local6;
   core::bool #local6#isSet = false;
   function #local6#get() → FutureOr<core::int>
-    return #local6#isSet ?{FutureOr<core::int>} local6{FutureOr<core::int>} : throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.");
+    return #local6#isSet ?{FutureOr<core::int>} local6{FutureOr<core::int>} : throw new _in::LateError::localNI("local6");
   function #local6#set(FutureOr<core::int>#t17) → dynamic
     if(#local6#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Local 'local6' has already been initialized.");
+      throw new _in::LateError::localAI("local6");
     else {
       #local6#isSet = true;
       return local6 = #t17;
@@ -231,10 +231,10 @@
   final self::methodConditional::T? local2;
   core::bool #local2#isSet = false;
   function #local2#get() → self::methodConditional::T%
-    return #local2#isSet ?{self::methodConditional::T%} local2{self::methodConditional::T%} : throw new _in::LateInitializationErrorImpl::•("Local 'local2' has not been initialized.");
+    return #local2#isSet ?{self::methodConditional::T%} local2{self::methodConditional::T%} : throw new _in::LateError::localNI("local2");
   function #local2#set(self::methodConditional::T% #t21) → dynamic
     if(#local2#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Local 'local2' has already been initialized.");
+      throw new _in::LateError::localAI("local2");
     else {
       #local2#isSet = true;
       return local2 = #t21;
@@ -242,10 +242,10 @@
   final core::int? local4;
   core::bool #local4#isSet = false;
   function #local4#get() → core::int
-    return #local4#isSet ?{core::int} local4{core::int} : throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.");
+    return #local4#isSet ?{core::int} local4{core::int} : throw new _in::LateError::localNI("local4");
   function #local4#set(core::int #t22) → dynamic
     if(#local4#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Local 'local4' has already been initialized.");
+      throw new _in::LateError::localAI("local4");
     else {
       #local4#isSet = true;
       return local4 = #t22;
@@ -253,10 +253,10 @@
   final FutureOr<core::int>? local6;
   core::bool #local6#isSet = false;
   function #local6#get() → FutureOr<core::int>
-    return #local6#isSet ?{FutureOr<core::int>} local6{FutureOr<core::int>} : throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.");
+    return #local6#isSet ?{FutureOr<core::int>} local6{FutureOr<core::int>} : throw new _in::LateError::localNI("local6");
   function #local6#set(FutureOr<core::int>#t23) → dynamic
     if(#local6#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Local 'local6' has already been initialized.");
+      throw new _in::LateError::localAI("local6");
     else {
       #local6#isSet = true;
       return local6 = #t23;
@@ -283,10 +283,10 @@
   final core::int? local4;
   core::bool #local4#isSet = false;
   function #local4#get() → core::int
-    return #local4#isSet ?{core::int} local4{core::int} : throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.");
+    return #local4#isSet ?{core::int} local4{core::int} : throw new _in::LateError::localNI("local4");
   function #local4#set(core::int #t27) → dynamic
     if(#local4#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Local 'local4' has already been initialized.");
+      throw new _in::LateError::localAI("local4");
     else {
       #local4#isSet = true;
       return local4 = #t27;
diff --git a/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart.outline.expect b/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart.outline.expect
index 1a5e8e7..4078e3a 100644
--- a/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart.outline.expect
+++ b/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart.outline.expect
@@ -4,9 +4,9 @@
 
 import "dart:async";
 
-static field <T extends core::Object? = dynamic>(T%) → core::Null? fieldDirect;
-static field <T extends core::Object? = dynamic>(core::bool, T%) → core::Null? fieldConditional;
-static field () → core::Null? fieldCompound;
+static field <T extends core::Object? = dynamic>(T%) → Null fieldDirect;
+static field <T extends core::Object? = dynamic>(core::bool, T%) → Null fieldConditional;
+static field () → Null fieldCompound;
 static method methodDirect<T extends core::Object? = dynamic>(self::methodDirect::T% value) → dynamic
   ;
 static method methodConditional<T extends core::Object? = dynamic>(core::bool b, self::methodConditional::T% value) → dynamic
diff --git a/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart.strong.expect b/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart.strong.expect
index 2ebcbaf..9fd2c07 100644
--- a/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart.strong.expect
+++ b/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart.strong.expect
@@ -96,12 +96,12 @@
 
 import "dart:async";
 
-static field <T extends core::Object? = dynamic>(T%) → core::Null? fieldDirect = <T extends core::Object? = dynamic>(T% value) → core::Null? {
+static field <T extends core::Object? = dynamic>(T%) → Null fieldDirect = <T extends core::Object? = dynamic>(T% value) → Null {
   T% local1;
   T? local2;
   core::bool #local2#isSet = false;
   function #local2#get() → T%
-    return #local2#isSet ?{T%} local2{T%} : throw new _in::LateInitializationErrorImpl::•("Local 'local2' has not been initialized.");
+    return #local2#isSet ?{T%} local2{T%} : throw new _in::LateError::localNI("local2");
   function #local2#set(T% #t1) → dynamic {
     #local2#isSet = true;
     return local2 = #t1;
@@ -109,13 +109,13 @@
   core::int local3;
   core::int? local4;
   function #local4#get() → core::int
-    return let final core::int? #t2 = local4 in #t2.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.") : #t2{core::int};
+    return let final core::int? #t2 = local4 in #t2.==(null) ?{core::int} throw new _in::LateError::localNI("local4") : #t2{core::int};
   function #local4#set(core::int #t3) → dynamic
     return local4 = #t3;
   FutureOr<core::int>local5;
   FutureOr<core::int>? local6;
   function #local6#get() → FutureOr<core::int>
-    return let final FutureOr<core::int>? #t4 = local6 in #t4.==(null) ?{FutureOr<core::int>} throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.") : #t4{FutureOr<core::int>};
+    return let final FutureOr<core::int>? #t4 = local6 in #t4.==(null) ?{FutureOr<core::int>} throw new _in::LateError::localNI("local6") : #t4{FutureOr<core::int>};
   function #local6#set(FutureOr<core::int>#t5) → dynamic
     return local6 = #t5;
   T? local7;
@@ -151,12 +151,12 @@
   ^^^^^^" in #local6#get.call();
   #local7#get.call();
 };
-static field <T extends core::Object? = dynamic>(core::bool, T%) → core::Null? fieldConditional = <T extends core::Object? = dynamic>(core::bool b, T% value) → core::Null? {
+static field <T extends core::Object? = dynamic>(core::bool, T%) → Null fieldConditional = <T extends core::Object? = dynamic>(core::bool b, T% value) → Null {
   T% local1;
   T? local2;
   core::bool #local2#isSet = false;
   function #local2#get() → T%
-    return #local2#isSet ?{T%} local2{T%} : throw new _in::LateInitializationErrorImpl::•("Local 'local2' has not been initialized.");
+    return #local2#isSet ?{T%} local2{T%} : throw new _in::LateError::localNI("local2");
   function #local2#set(T% #t13) → dynamic {
     #local2#isSet = true;
     return local2 = #t13;
@@ -164,13 +164,13 @@
   core::int local3;
   core::int? local4;
   function #local4#get() → core::int
-    return let final core::int? #t14 = local4 in #t14.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.") : #t14{core::int};
+    return let final core::int? #t14 = local4 in #t14.==(null) ?{core::int} throw new _in::LateError::localNI("local4") : #t14{core::int};
   function #local4#set(core::int #t15) → dynamic
     return local4 = #t15;
   FutureOr<core::int>local5;
   FutureOr<core::int>? local6;
   function #local6#get() → FutureOr<core::int>
-    return let final FutureOr<core::int>? #t16 = local6 in #t16.==(null) ?{FutureOr<core::int>} throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.") : #t16{FutureOr<core::int>};
+    return let final FutureOr<core::int>? #t16 = local6 in #t16.==(null) ?{FutureOr<core::int>} throw new _in::LateError::localNI("local6") : #t16{FutureOr<core::int>};
   function #local6#set(FutureOr<core::int>#t17) → dynamic
     return local6 = #t17;
   T? local7;
@@ -209,11 +209,11 @@
   #local6#get.call();
   #local7#get.call();
 };
-static field () → core::Null? fieldCompound = () → core::Null? {
+static field () → Null fieldCompound = () → Null {
   core::int local3;
   core::int? local4;
   function #local4#get() → core::int
-    return let final core::int? #t22 = local4 in #t22.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.") : #t22{core::int};
+    return let final core::int? #t22 = local4 in #t22.==(null) ?{core::int} throw new _in::LateError::localNI("local4") : #t22{core::int};
   function #local4#set(core::int #t23) → dynamic
     return local4 = #t23;
   local3 = (let final<BottomType> #t24 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:111:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
@@ -228,7 +228,7 @@
   self::methodDirect::T? local2;
   core::bool #local2#isSet = false;
   function #local2#get() → self::methodDirect::T%
-    return #local2#isSet ?{self::methodDirect::T%} local2{self::methodDirect::T%} : throw new _in::LateInitializationErrorImpl::•("Local 'local2' has not been initialized.");
+    return #local2#isSet ?{self::methodDirect::T%} local2{self::methodDirect::T%} : throw new _in::LateError::localNI("local2");
   function #local2#set(self::methodDirect::T% #t26) → dynamic {
     #local2#isSet = true;
     return local2 = #t26;
@@ -236,13 +236,13 @@
   core::int local3;
   core::int? local4;
   function #local4#get() → core::int
-    return let final core::int? #t27 = local4 in #t27.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.") : #t27{core::int};
+    return let final core::int? #t27 = local4 in #t27.==(null) ?{core::int} throw new _in::LateError::localNI("local4") : #t27{core::int};
   function #local4#set(core::int #t28) → dynamic
     return local4 = #t28;
   FutureOr<core::int>local5;
   FutureOr<core::int>? local6;
   function #local6#get() → FutureOr<core::int>
-    return let final FutureOr<core::int>? #t29 = local6 in #t29.==(null) ?{FutureOr<core::int>} throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.") : #t29{FutureOr<core::int>};
+    return let final FutureOr<core::int>? #t29 = local6 in #t29.==(null) ?{FutureOr<core::int>} throw new _in::LateError::localNI("local6") : #t29{FutureOr<core::int>};
   function #local6#set(FutureOr<core::int>#t30) → dynamic
     return local6 = #t30;
   self::methodDirect::T? local7;
@@ -283,7 +283,7 @@
   self::methodConditional::T? local2;
   core::bool #local2#isSet = false;
   function #local2#get() → self::methodConditional::T%
-    return #local2#isSet ?{self::methodConditional::T%} local2{self::methodConditional::T%} : throw new _in::LateInitializationErrorImpl::•("Local 'local2' has not been initialized.");
+    return #local2#isSet ?{self::methodConditional::T%} local2{self::methodConditional::T%} : throw new _in::LateError::localNI("local2");
   function #local2#set(self::methodConditional::T% #t38) → dynamic {
     #local2#isSet = true;
     return local2 = #t38;
@@ -291,13 +291,13 @@
   core::int local3;
   core::int? local4;
   function #local4#get() → core::int
-    return let final core::int? #t39 = local4 in #t39.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.") : #t39{core::int};
+    return let final core::int? #t39 = local4 in #t39.==(null) ?{core::int} throw new _in::LateError::localNI("local4") : #t39{core::int};
   function #local4#set(core::int #t40) → dynamic
     return local4 = #t40;
   FutureOr<core::int>local5;
   FutureOr<core::int>? local6;
   function #local6#get() → FutureOr<core::int>
-    return let final FutureOr<core::int>? #t41 = local6 in #t41.==(null) ?{FutureOr<core::int>} throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.") : #t41{FutureOr<core::int>};
+    return let final FutureOr<core::int>? #t41 = local6 in #t41.==(null) ?{FutureOr<core::int>} throw new _in::LateError::localNI("local6") : #t41{FutureOr<core::int>};
   function #local6#set(FutureOr<core::int>#t42) → dynamic
     return local6 = #t42;
   self::methodConditional::T? local7;
@@ -340,7 +340,7 @@
   core::int local3;
   core::int? local4;
   function #local4#get() → core::int
-    return let final core::int? #t47 = local4 in #t47.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.") : #t47{core::int};
+    return let final core::int? #t47 = local4 in #t47.==(null) ?{core::int} throw new _in::LateError::localNI("local4") : #t47{core::int};
   function #local4#set(core::int #t48) → dynamic
     return local4 = #t48;
   local3 = (let final<BottomType> #t49 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:103:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
diff --git a/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart.strong.transformed.expect
index 2ebcbaf..9fd2c07 100644
--- a/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart.strong.transformed.expect
@@ -96,12 +96,12 @@
 
 import "dart:async";
 
-static field <T extends core::Object? = dynamic>(T%) → core::Null? fieldDirect = <T extends core::Object? = dynamic>(T% value) → core::Null? {
+static field <T extends core::Object? = dynamic>(T%) → Null fieldDirect = <T extends core::Object? = dynamic>(T% value) → Null {
   T% local1;
   T? local2;
   core::bool #local2#isSet = false;
   function #local2#get() → T%
-    return #local2#isSet ?{T%} local2{T%} : throw new _in::LateInitializationErrorImpl::•("Local 'local2' has not been initialized.");
+    return #local2#isSet ?{T%} local2{T%} : throw new _in::LateError::localNI("local2");
   function #local2#set(T% #t1) → dynamic {
     #local2#isSet = true;
     return local2 = #t1;
@@ -109,13 +109,13 @@
   core::int local3;
   core::int? local4;
   function #local4#get() → core::int
-    return let final core::int? #t2 = local4 in #t2.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.") : #t2{core::int};
+    return let final core::int? #t2 = local4 in #t2.==(null) ?{core::int} throw new _in::LateError::localNI("local4") : #t2{core::int};
   function #local4#set(core::int #t3) → dynamic
     return local4 = #t3;
   FutureOr<core::int>local5;
   FutureOr<core::int>? local6;
   function #local6#get() → FutureOr<core::int>
-    return let final FutureOr<core::int>? #t4 = local6 in #t4.==(null) ?{FutureOr<core::int>} throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.") : #t4{FutureOr<core::int>};
+    return let final FutureOr<core::int>? #t4 = local6 in #t4.==(null) ?{FutureOr<core::int>} throw new _in::LateError::localNI("local6") : #t4{FutureOr<core::int>};
   function #local6#set(FutureOr<core::int>#t5) → dynamic
     return local6 = #t5;
   T? local7;
@@ -151,12 +151,12 @@
   ^^^^^^" in #local6#get.call();
   #local7#get.call();
 };
-static field <T extends core::Object? = dynamic>(core::bool, T%) → core::Null? fieldConditional = <T extends core::Object? = dynamic>(core::bool b, T% value) → core::Null? {
+static field <T extends core::Object? = dynamic>(core::bool, T%) → Null fieldConditional = <T extends core::Object? = dynamic>(core::bool b, T% value) → Null {
   T% local1;
   T? local2;
   core::bool #local2#isSet = false;
   function #local2#get() → T%
-    return #local2#isSet ?{T%} local2{T%} : throw new _in::LateInitializationErrorImpl::•("Local 'local2' has not been initialized.");
+    return #local2#isSet ?{T%} local2{T%} : throw new _in::LateError::localNI("local2");
   function #local2#set(T% #t13) → dynamic {
     #local2#isSet = true;
     return local2 = #t13;
@@ -164,13 +164,13 @@
   core::int local3;
   core::int? local4;
   function #local4#get() → core::int
-    return let final core::int? #t14 = local4 in #t14.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.") : #t14{core::int};
+    return let final core::int? #t14 = local4 in #t14.==(null) ?{core::int} throw new _in::LateError::localNI("local4") : #t14{core::int};
   function #local4#set(core::int #t15) → dynamic
     return local4 = #t15;
   FutureOr<core::int>local5;
   FutureOr<core::int>? local6;
   function #local6#get() → FutureOr<core::int>
-    return let final FutureOr<core::int>? #t16 = local6 in #t16.==(null) ?{FutureOr<core::int>} throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.") : #t16{FutureOr<core::int>};
+    return let final FutureOr<core::int>? #t16 = local6 in #t16.==(null) ?{FutureOr<core::int>} throw new _in::LateError::localNI("local6") : #t16{FutureOr<core::int>};
   function #local6#set(FutureOr<core::int>#t17) → dynamic
     return local6 = #t17;
   T? local7;
@@ -209,11 +209,11 @@
   #local6#get.call();
   #local7#get.call();
 };
-static field () → core::Null? fieldCompound = () → core::Null? {
+static field () → Null fieldCompound = () → Null {
   core::int local3;
   core::int? local4;
   function #local4#get() → core::int
-    return let final core::int? #t22 = local4 in #t22.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.") : #t22{core::int};
+    return let final core::int? #t22 = local4 in #t22.==(null) ?{core::int} throw new _in::LateError::localNI("local4") : #t22{core::int};
   function #local4#set(core::int #t23) → dynamic
     return local4 = #t23;
   local3 = (let final<BottomType> #t24 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:111:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
@@ -228,7 +228,7 @@
   self::methodDirect::T? local2;
   core::bool #local2#isSet = false;
   function #local2#get() → self::methodDirect::T%
-    return #local2#isSet ?{self::methodDirect::T%} local2{self::methodDirect::T%} : throw new _in::LateInitializationErrorImpl::•("Local 'local2' has not been initialized.");
+    return #local2#isSet ?{self::methodDirect::T%} local2{self::methodDirect::T%} : throw new _in::LateError::localNI("local2");
   function #local2#set(self::methodDirect::T% #t26) → dynamic {
     #local2#isSet = true;
     return local2 = #t26;
@@ -236,13 +236,13 @@
   core::int local3;
   core::int? local4;
   function #local4#get() → core::int
-    return let final core::int? #t27 = local4 in #t27.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.") : #t27{core::int};
+    return let final core::int? #t27 = local4 in #t27.==(null) ?{core::int} throw new _in::LateError::localNI("local4") : #t27{core::int};
   function #local4#set(core::int #t28) → dynamic
     return local4 = #t28;
   FutureOr<core::int>local5;
   FutureOr<core::int>? local6;
   function #local6#get() → FutureOr<core::int>
-    return let final FutureOr<core::int>? #t29 = local6 in #t29.==(null) ?{FutureOr<core::int>} throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.") : #t29{FutureOr<core::int>};
+    return let final FutureOr<core::int>? #t29 = local6 in #t29.==(null) ?{FutureOr<core::int>} throw new _in::LateError::localNI("local6") : #t29{FutureOr<core::int>};
   function #local6#set(FutureOr<core::int>#t30) → dynamic
     return local6 = #t30;
   self::methodDirect::T? local7;
@@ -283,7 +283,7 @@
   self::methodConditional::T? local2;
   core::bool #local2#isSet = false;
   function #local2#get() → self::methodConditional::T%
-    return #local2#isSet ?{self::methodConditional::T%} local2{self::methodConditional::T%} : throw new _in::LateInitializationErrorImpl::•("Local 'local2' has not been initialized.");
+    return #local2#isSet ?{self::methodConditional::T%} local2{self::methodConditional::T%} : throw new _in::LateError::localNI("local2");
   function #local2#set(self::methodConditional::T% #t38) → dynamic {
     #local2#isSet = true;
     return local2 = #t38;
@@ -291,13 +291,13 @@
   core::int local3;
   core::int? local4;
   function #local4#get() → core::int
-    return let final core::int? #t39 = local4 in #t39.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.") : #t39{core::int};
+    return let final core::int? #t39 = local4 in #t39.==(null) ?{core::int} throw new _in::LateError::localNI("local4") : #t39{core::int};
   function #local4#set(core::int #t40) → dynamic
     return local4 = #t40;
   FutureOr<core::int>local5;
   FutureOr<core::int>? local6;
   function #local6#get() → FutureOr<core::int>
-    return let final FutureOr<core::int>? #t41 = local6 in #t41.==(null) ?{FutureOr<core::int>} throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.") : #t41{FutureOr<core::int>};
+    return let final FutureOr<core::int>? #t41 = local6 in #t41.==(null) ?{FutureOr<core::int>} throw new _in::LateError::localNI("local6") : #t41{FutureOr<core::int>};
   function #local6#set(FutureOr<core::int>#t42) → dynamic
     return local6 = #t42;
   self::methodConditional::T? local7;
@@ -340,7 +340,7 @@
   core::int local3;
   core::int? local4;
   function #local4#get() → core::int
-    return let final core::int? #t47 = local4 in #t47.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.") : #t47{core::int};
+    return let final core::int? #t47 = local4 in #t47.==(null) ?{core::int} throw new _in::LateError::localNI("local4") : #t47{core::int};
   function #local4#set(core::int #t48) → dynamic
     return local4 = #t48;
   local3 = (let final<BottomType> #t49 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:103:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
diff --git a/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart.textual_outline.expect b/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart.textual_outline.expect
index f27c6c0..8b2d8e6 100644
--- a/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart.textual_outline.expect
@@ -1,64 +1,8 @@
 import 'dart:async';
-
 methodDirect<T>(T value) {}
-var fieldDirect = <T>(T value) {
-  T local1;
-  late T;
-  local2;
-  int local3;
-  late int;
-  local4;
-  FutureOr<int> local5;
-  late FutureOr;
-  <int>[];
-  local6;
-  late T;
-  local7 = value;
-  local1;
-  local2;
-  local3;
-  local4;
-  local5;
-  local6;
-  local7;
-};
+var fieldDirect = <T>(T value) { T local1; late T ;local2; int local3; late int ;local4; FutureOr<int> local5; late FutureOr;<int> [];local6; late T ;local7 = value; local1; local2; local3; local4; local5; local6; local7; };
 methodConditional<T>(bool b, T value) {}
-var fieldConditional = <T>(bool b, T value) {
-  T local1;
-  late T;
-  local2;
-  int local3;
-  late int;
-  local4;
-  FutureOr<int> local5;
-  late FutureOr;
-  <int>[];
-  local6;
-  late T;
-  local7 = value;
-  if (b) {
-    local1 = value;
-    local2 = value;
-    local3 = 0;
-    local4 = 0;
-    local5 = 0;
-    local6 = 0;
-    local7;
-  }
-  local1;
-  local2;
-  local3;
-  local4;
-  local5;
-  local6;
-  local7;
-};
+var fieldConditional = <T>(bool b, T value) { T local1; late T ;local2; int local3; late int ;local4; FutureOr<int> local5; late FutureOr;<int> [];local6; late T ;local7 = value; if (b) { local1 = value; local2 = value; local3 = 0; local4 = 0; local5 = 0; local6 = 0; local7; } local1; local2; local3; local4; local5; local6; local7; };
 methodCompound() {}
-var fieldCompound = () {
-  int local3;
-  late int;
-  local4;
-  local3 += 0;
-  local4 += 0;
-};
+var fieldCompound = () { int local3; late int ;local4; local3 += 0; local4 += 0; };
 main() {}
diff --git a/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart.weak.expect b/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart.weak.expect
index bc917d2..be1e0a1 100644
--- a/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart.weak.expect
+++ b/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart.weak.expect
@@ -96,12 +96,12 @@
 
 import "dart:async";
 
-static field <T extends core::Object? = dynamic>(T%) → core::Null? fieldDirect = <T extends core::Object? = dynamic>(T% value) → core::Null? {
+static field <T extends core::Object? = dynamic>(T%) → Null fieldDirect = <T extends core::Object? = dynamic>(T% value) → Null {
   T% local1;
   T? local2;
   core::bool #local2#isSet = false;
   function #local2#get() → T%
-    return #local2#isSet ?{T%} local2{T%} : throw new _in::LateInitializationErrorImpl::•("Local 'local2' has not been initialized.");
+    return #local2#isSet ?{T%} local2{T%} : throw new _in::LateError::localNI("local2");
   function #local2#set(T% #t1) → dynamic {
     #local2#isSet = true;
     return local2 = #t1;
@@ -110,7 +110,7 @@
   core::int? local4;
   core::bool #local4#isSet = false;
   function #local4#get() → core::int
-    return #local4#isSet ?{core::int} local4{core::int} : throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.");
+    return #local4#isSet ?{core::int} local4{core::int} : throw new _in::LateError::localNI("local4");
   function #local4#set(core::int #t2) → dynamic {
     #local4#isSet = true;
     return local4 = #t2;
@@ -119,7 +119,7 @@
   FutureOr<core::int>? local6;
   core::bool #local6#isSet = false;
   function #local6#get() → FutureOr<core::int>
-    return #local6#isSet ?{FutureOr<core::int>} local6{FutureOr<core::int>} : throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.");
+    return #local6#isSet ?{FutureOr<core::int>} local6{FutureOr<core::int>} : throw new _in::LateError::localNI("local6");
   function #local6#set(FutureOr<core::int>#t3) → dynamic {
     #local6#isSet = true;
     return local6 = #t3;
@@ -157,12 +157,12 @@
   ^^^^^^" in #local6#get.call();
   #local7#get.call();
 };
-static field <T extends core::Object? = dynamic>(core::bool, T%) → core::Null? fieldConditional = <T extends core::Object? = dynamic>(core::bool b, T% value) → core::Null? {
+static field <T extends core::Object? = dynamic>(core::bool, T%) → Null fieldConditional = <T extends core::Object? = dynamic>(core::bool b, T% value) → Null {
   T% local1;
   T? local2;
   core::bool #local2#isSet = false;
   function #local2#get() → T%
-    return #local2#isSet ?{T%} local2{T%} : throw new _in::LateInitializationErrorImpl::•("Local 'local2' has not been initialized.");
+    return #local2#isSet ?{T%} local2{T%} : throw new _in::LateError::localNI("local2");
   function #local2#set(T% #t11) → dynamic {
     #local2#isSet = true;
     return local2 = #t11;
@@ -171,7 +171,7 @@
   core::int? local4;
   core::bool #local4#isSet = false;
   function #local4#get() → core::int
-    return #local4#isSet ?{core::int} local4{core::int} : throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.");
+    return #local4#isSet ?{core::int} local4{core::int} : throw new _in::LateError::localNI("local4");
   function #local4#set(core::int #t12) → dynamic {
     #local4#isSet = true;
     return local4 = #t12;
@@ -180,7 +180,7 @@
   FutureOr<core::int>? local6;
   core::bool #local6#isSet = false;
   function #local6#get() → FutureOr<core::int>
-    return #local6#isSet ?{FutureOr<core::int>} local6{FutureOr<core::int>} : throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.");
+    return #local6#isSet ?{FutureOr<core::int>} local6{FutureOr<core::int>} : throw new _in::LateError::localNI("local6");
   function #local6#set(FutureOr<core::int>#t13) → dynamic {
     #local6#isSet = true;
     return local6 = #t13;
@@ -221,12 +221,12 @@
   #local6#get.call();
   #local7#get.call();
 };
-static field () → core::Null? fieldCompound = () → core::Null? {
+static field () → Null fieldCompound = () → Null {
   core::int local3;
   core::int? local4;
   core::bool #local4#isSet = false;
   function #local4#get() → core::int
-    return #local4#isSet ?{core::int} local4{core::int} : throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.");
+    return #local4#isSet ?{core::int} local4{core::int} : throw new _in::LateError::localNI("local4");
   function #local4#set(core::int #t18) → dynamic {
     #local4#isSet = true;
     return local4 = #t18;
@@ -243,7 +243,7 @@
   self::methodDirect::T? local2;
   core::bool #local2#isSet = false;
   function #local2#get() → self::methodDirect::T%
-    return #local2#isSet ?{self::methodDirect::T%} local2{self::methodDirect::T%} : throw new _in::LateInitializationErrorImpl::•("Local 'local2' has not been initialized.");
+    return #local2#isSet ?{self::methodDirect::T%} local2{self::methodDirect::T%} : throw new _in::LateError::localNI("local2");
   function #local2#set(self::methodDirect::T% #t21) → dynamic {
     #local2#isSet = true;
     return local2 = #t21;
@@ -252,7 +252,7 @@
   core::int? local4;
   core::bool #local4#isSet = false;
   function #local4#get() → core::int
-    return #local4#isSet ?{core::int} local4{core::int} : throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.");
+    return #local4#isSet ?{core::int} local4{core::int} : throw new _in::LateError::localNI("local4");
   function #local4#set(core::int #t22) → dynamic {
     #local4#isSet = true;
     return local4 = #t22;
@@ -261,7 +261,7 @@
   FutureOr<core::int>? local6;
   core::bool #local6#isSet = false;
   function #local6#get() → FutureOr<core::int>
-    return #local6#isSet ?{FutureOr<core::int>} local6{FutureOr<core::int>} : throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.");
+    return #local6#isSet ?{FutureOr<core::int>} local6{FutureOr<core::int>} : throw new _in::LateError::localNI("local6");
   function #local6#set(FutureOr<core::int>#t23) → dynamic {
     #local6#isSet = true;
     return local6 = #t23;
@@ -304,7 +304,7 @@
   self::methodConditional::T? local2;
   core::bool #local2#isSet = false;
   function #local2#get() → self::methodConditional::T%
-    return #local2#isSet ?{self::methodConditional::T%} local2{self::methodConditional::T%} : throw new _in::LateInitializationErrorImpl::•("Local 'local2' has not been initialized.");
+    return #local2#isSet ?{self::methodConditional::T%} local2{self::methodConditional::T%} : throw new _in::LateError::localNI("local2");
   function #local2#set(self::methodConditional::T% #t31) → dynamic {
     #local2#isSet = true;
     return local2 = #t31;
@@ -313,7 +313,7 @@
   core::int? local4;
   core::bool #local4#isSet = false;
   function #local4#get() → core::int
-    return #local4#isSet ?{core::int} local4{core::int} : throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.");
+    return #local4#isSet ?{core::int} local4{core::int} : throw new _in::LateError::localNI("local4");
   function #local4#set(core::int #t32) → dynamic {
     #local4#isSet = true;
     return local4 = #t32;
@@ -322,7 +322,7 @@
   FutureOr<core::int>? local6;
   core::bool #local6#isSet = false;
   function #local6#get() → FutureOr<core::int>
-    return #local6#isSet ?{FutureOr<core::int>} local6{FutureOr<core::int>} : throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.");
+    return #local6#isSet ?{FutureOr<core::int>} local6{FutureOr<core::int>} : throw new _in::LateError::localNI("local6");
   function #local6#set(FutureOr<core::int>#t33) → dynamic {
     #local6#isSet = true;
     return local6 = #t33;
@@ -368,7 +368,7 @@
   core::int? local4;
   core::bool #local4#isSet = false;
   function #local4#get() → core::int
-    return #local4#isSet ?{core::int} local4{core::int} : throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.");
+    return #local4#isSet ?{core::int} local4{core::int} : throw new _in::LateError::localNI("local4");
   function #local4#set(core::int #t38) → dynamic {
     #local4#isSet = true;
     return local4 = #t38;
diff --git a/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart.weak.transformed.expect
index bc917d2..be1e0a1 100644
--- a/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart.weak.transformed.expect
@@ -96,12 +96,12 @@
 
 import "dart:async";
 
-static field <T extends core::Object? = dynamic>(T%) → core::Null? fieldDirect = <T extends core::Object? = dynamic>(T% value) → core::Null? {
+static field <T extends core::Object? = dynamic>(T%) → Null fieldDirect = <T extends core::Object? = dynamic>(T% value) → Null {
   T% local1;
   T? local2;
   core::bool #local2#isSet = false;
   function #local2#get() → T%
-    return #local2#isSet ?{T%} local2{T%} : throw new _in::LateInitializationErrorImpl::•("Local 'local2' has not been initialized.");
+    return #local2#isSet ?{T%} local2{T%} : throw new _in::LateError::localNI("local2");
   function #local2#set(T% #t1) → dynamic {
     #local2#isSet = true;
     return local2 = #t1;
@@ -110,7 +110,7 @@
   core::int? local4;
   core::bool #local4#isSet = false;
   function #local4#get() → core::int
-    return #local4#isSet ?{core::int} local4{core::int} : throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.");
+    return #local4#isSet ?{core::int} local4{core::int} : throw new _in::LateError::localNI("local4");
   function #local4#set(core::int #t2) → dynamic {
     #local4#isSet = true;
     return local4 = #t2;
@@ -119,7 +119,7 @@
   FutureOr<core::int>? local6;
   core::bool #local6#isSet = false;
   function #local6#get() → FutureOr<core::int>
-    return #local6#isSet ?{FutureOr<core::int>} local6{FutureOr<core::int>} : throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.");
+    return #local6#isSet ?{FutureOr<core::int>} local6{FutureOr<core::int>} : throw new _in::LateError::localNI("local6");
   function #local6#set(FutureOr<core::int>#t3) → dynamic {
     #local6#isSet = true;
     return local6 = #t3;
@@ -157,12 +157,12 @@
   ^^^^^^" in #local6#get.call();
   #local7#get.call();
 };
-static field <T extends core::Object? = dynamic>(core::bool, T%) → core::Null? fieldConditional = <T extends core::Object? = dynamic>(core::bool b, T% value) → core::Null? {
+static field <T extends core::Object? = dynamic>(core::bool, T%) → Null fieldConditional = <T extends core::Object? = dynamic>(core::bool b, T% value) → Null {
   T% local1;
   T? local2;
   core::bool #local2#isSet = false;
   function #local2#get() → T%
-    return #local2#isSet ?{T%} local2{T%} : throw new _in::LateInitializationErrorImpl::•("Local 'local2' has not been initialized.");
+    return #local2#isSet ?{T%} local2{T%} : throw new _in::LateError::localNI("local2");
   function #local2#set(T% #t11) → dynamic {
     #local2#isSet = true;
     return local2 = #t11;
@@ -171,7 +171,7 @@
   core::int? local4;
   core::bool #local4#isSet = false;
   function #local4#get() → core::int
-    return #local4#isSet ?{core::int} local4{core::int} : throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.");
+    return #local4#isSet ?{core::int} local4{core::int} : throw new _in::LateError::localNI("local4");
   function #local4#set(core::int #t12) → dynamic {
     #local4#isSet = true;
     return local4 = #t12;
@@ -180,7 +180,7 @@
   FutureOr<core::int>? local6;
   core::bool #local6#isSet = false;
   function #local6#get() → FutureOr<core::int>
-    return #local6#isSet ?{FutureOr<core::int>} local6{FutureOr<core::int>} : throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.");
+    return #local6#isSet ?{FutureOr<core::int>} local6{FutureOr<core::int>} : throw new _in::LateError::localNI("local6");
   function #local6#set(FutureOr<core::int>#t13) → dynamic {
     #local6#isSet = true;
     return local6 = #t13;
@@ -221,12 +221,12 @@
   #local6#get.call();
   #local7#get.call();
 };
-static field () → core::Null? fieldCompound = () → core::Null? {
+static field () → Null fieldCompound = () → Null {
   core::int local3;
   core::int? local4;
   core::bool #local4#isSet = false;
   function #local4#get() → core::int
-    return #local4#isSet ?{core::int} local4{core::int} : throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.");
+    return #local4#isSet ?{core::int} local4{core::int} : throw new _in::LateError::localNI("local4");
   function #local4#set(core::int #t18) → dynamic {
     #local4#isSet = true;
     return local4 = #t18;
@@ -243,7 +243,7 @@
   self::methodDirect::T? local2;
   core::bool #local2#isSet = false;
   function #local2#get() → self::methodDirect::T%
-    return #local2#isSet ?{self::methodDirect::T%} local2{self::methodDirect::T%} : throw new _in::LateInitializationErrorImpl::•("Local 'local2' has not been initialized.");
+    return #local2#isSet ?{self::methodDirect::T%} local2{self::methodDirect::T%} : throw new _in::LateError::localNI("local2");
   function #local2#set(self::methodDirect::T% #t21) → dynamic {
     #local2#isSet = true;
     return local2 = #t21;
@@ -252,7 +252,7 @@
   core::int? local4;
   core::bool #local4#isSet = false;
   function #local4#get() → core::int
-    return #local4#isSet ?{core::int} local4{core::int} : throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.");
+    return #local4#isSet ?{core::int} local4{core::int} : throw new _in::LateError::localNI("local4");
   function #local4#set(core::int #t22) → dynamic {
     #local4#isSet = true;
     return local4 = #t22;
@@ -261,7 +261,7 @@
   FutureOr<core::int>? local6;
   core::bool #local6#isSet = false;
   function #local6#get() → FutureOr<core::int>
-    return #local6#isSet ?{FutureOr<core::int>} local6{FutureOr<core::int>} : throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.");
+    return #local6#isSet ?{FutureOr<core::int>} local6{FutureOr<core::int>} : throw new _in::LateError::localNI("local6");
   function #local6#set(FutureOr<core::int>#t23) → dynamic {
     #local6#isSet = true;
     return local6 = #t23;
@@ -304,7 +304,7 @@
   self::methodConditional::T? local2;
   core::bool #local2#isSet = false;
   function #local2#get() → self::methodConditional::T%
-    return #local2#isSet ?{self::methodConditional::T%} local2{self::methodConditional::T%} : throw new _in::LateInitializationErrorImpl::•("Local 'local2' has not been initialized.");
+    return #local2#isSet ?{self::methodConditional::T%} local2{self::methodConditional::T%} : throw new _in::LateError::localNI("local2");
   function #local2#set(self::methodConditional::T% #t31) → dynamic {
     #local2#isSet = true;
     return local2 = #t31;
@@ -313,7 +313,7 @@
   core::int? local4;
   core::bool #local4#isSet = false;
   function #local4#get() → core::int
-    return #local4#isSet ?{core::int} local4{core::int} : throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.");
+    return #local4#isSet ?{core::int} local4{core::int} : throw new _in::LateError::localNI("local4");
   function #local4#set(core::int #t32) → dynamic {
     #local4#isSet = true;
     return local4 = #t32;
@@ -322,7 +322,7 @@
   FutureOr<core::int>? local6;
   core::bool #local6#isSet = false;
   function #local6#get() → FutureOr<core::int>
-    return #local6#isSet ?{FutureOr<core::int>} local6{FutureOr<core::int>} : throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.");
+    return #local6#isSet ?{FutureOr<core::int>} local6{FutureOr<core::int>} : throw new _in::LateError::localNI("local6");
   function #local6#set(FutureOr<core::int>#t33) → dynamic {
     #local6#isSet = true;
     return local6 = #t33;
@@ -368,7 +368,7 @@
   core::int? local4;
   core::bool #local4#isSet = false;
   function #local4#get() → core::int
-    return #local4#isSet ?{core::int} local4{core::int} : throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.");
+    return #local4#isSet ?{core::int} local4{core::int} : throw new _in::LateError::localNI("local4");
   function #local4#set(core::int #t38) → dynamic {
     #local4#isSet = true;
     return local4 = #t38;
diff --git a/pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart.strong.expect b/pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart.strong.expect
index 9248820..1e3b9c1 100644
--- a/pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart.strong.expect
+++ b/pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart.strong.expect
@@ -45,17 +45,17 @@
     : self::A::_#A#property4 = property4, self::A::_#A#property5#isSet = true, self::A::_#A#property5 = property5, self::A::_#A#property6 = property6, super core::Object::•()
     ;
   get property4() → core::int
-    return let final core::int? #t1 = this.{self::A::_#A#property4} in #t1.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'property4' has not been initialized.") : #t1{core::int};
+    return let final core::int? #t1 = this.{self::A::_#A#property4} in #t1.==(null) ?{core::int} throw new _in::LateError::fieldNI("property4") : #t1{core::int};
   set property4(core::int #t2) → void
     this.{self::A::_#A#property4} = #t2;
   get property5() → core::int?
-    return this.{self::A::_#A#property5#isSet} ?{core::int?} this.{self::A::_#A#property5} : throw new _in::LateInitializationErrorImpl::•("Field 'property5' has not been initialized.");
+    return this.{self::A::_#A#property5#isSet} ?{core::int?} this.{self::A::_#A#property5} : throw new _in::LateError::fieldNI("property5");
   set property5(core::int? #t3) → void {
     this.{self::A::_#A#property5#isSet} = true;
     this.{self::A::_#A#property5} = #t3;
   }
   get property6() → core::int
-    return let final core::int? #t4 = this.{self::A::_#A#property6} in #t4.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'property6' has not been initialized.") : #t4{core::int};
+    return let final core::int? #t4 = this.{self::A::_#A#property6} in #t4.==(null) ?{core::int} throw new _in::LateError::fieldNI("property6") : #t4{core::int};
   set property6(covariant core::int #t5) → void
     this.{self::A::_#A#property6} = #t5;
 }
@@ -68,24 +68,24 @@
     : self::B1::_#B1#property4 = property4, self::B1::_#B1#property5 = property5, self::B1::_#B1#property6#isSet = true, self::B1::_#B1#property6 = property6, super core::Object::•()
     ;
   get property4() → core::int
-    return let final core::int? #t6 = this.{self::B1::_#B1#property4} in #t6.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'property4' has not been initialized.") : #t6{core::int};
+    return let final core::int? #t6 = this.{self::B1::_#B1#property4} in #t6.==(null) ?{core::int} throw new _in::LateError::fieldNI("property4") : #t6{core::int};
   set property4(core::int #t7) → void
     if(this.{self::B1::_#B1#property4}.==(null))
       this.{self::B1::_#B1#property4} = #t7;
     else
-      throw new _in::LateInitializationErrorImpl::•("Field 'property4' has already been initialized.");
+      throw new _in::LateError::fieldAI("property4");
   get property5() → core::int
-    return let final core::int? #t8 = this.{self::B1::_#B1#property5} in #t8.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'property5' has not been initialized.") : #t8{core::int};
+    return let final core::int? #t8 = this.{self::B1::_#B1#property5} in #t8.==(null) ?{core::int} throw new _in::LateError::fieldNI("property5") : #t8{core::int};
   set property5(core::int #t9) → void
     if(this.{self::B1::_#B1#property5}.==(null))
       this.{self::B1::_#B1#property5} = #t9;
     else
-      throw new _in::LateInitializationErrorImpl::•("Field 'property5' has already been initialized.");
+      throw new _in::LateError::fieldAI("property5");
   get property6() → core::int?
-    return this.{self::B1::_#B1#property6#isSet} ?{core::int?} this.{self::B1::_#B1#property6} : throw new _in::LateInitializationErrorImpl::•("Field 'property6' has not been initialized.");
+    return this.{self::B1::_#B1#property6#isSet} ?{core::int?} this.{self::B1::_#B1#property6} : throw new _in::LateError::fieldNI("property6");
   set property6(core::int? #t10) → void
     if(this.{self::B1::_#B1#property6#isSet})
-      throw new _in::LateInitializationErrorImpl::•("Field 'property6' has already been initialized.");
+      throw new _in::LateError::fieldAI("property6");
     else {
       this.{self::B1::_#B1#property6#isSet} = true;
       this.{self::B1::_#B1#property6} = #t10;
@@ -107,15 +107,15 @@
     : self::C1::_#C1#property4 = property4, self::C1::_#C1#property5 = property5, self::C1::_#C1#property6 = property6, super core::Object::•()
     ;
   get property4() → core::int
-    return let final core::int? #t11 = this.{self::C1::_#C1#property4} in #t11.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'property4' has not been initialized.") : #t11{core::int};
+    return let final core::int? #t11 = this.{self::C1::_#C1#property4} in #t11.==(null) ?{core::int} throw new _in::LateError::fieldNI("property4") : #t11{core::int};
   set property4(core::int #t12) → void
     this.{self::C1::_#C1#property4} = #t12;
   get property5() → core::int
-    return let final core::int? #t13 = this.{self::C1::_#C1#property5} in #t13.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'property5' has not been initialized.") : #t13{core::int};
+    return let final core::int? #t13 = this.{self::C1::_#C1#property5} in #t13.==(null) ?{core::int} throw new _in::LateError::fieldNI("property5") : #t13{core::int};
   set property5(core::int #t14) → void
     this.{self::C1::_#C1#property5} = #t14;
   get property6() → core::int
-    return let final core::int? #t15 = this.{self::C1::_#C1#property6} in #t15.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'property6' has not been initialized.") : #t15{core::int};
+    return let final core::int? #t15 = this.{self::C1::_#C1#property6} in #t15.==(null) ?{core::int} throw new _in::LateError::fieldNI("property6") : #t15{core::int};
   set property6(core::int #t16) → void
     this.{self::C1::_#C1#property6} = #t16;
 }
diff --git a/pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart.strong.transformed.expect
index 9248820..1e3b9c1 100644
--- a/pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart.strong.transformed.expect
@@ -45,17 +45,17 @@
     : self::A::_#A#property4 = property4, self::A::_#A#property5#isSet = true, self::A::_#A#property5 = property5, self::A::_#A#property6 = property6, super core::Object::•()
     ;
   get property4() → core::int
-    return let final core::int? #t1 = this.{self::A::_#A#property4} in #t1.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'property4' has not been initialized.") : #t1{core::int};
+    return let final core::int? #t1 = this.{self::A::_#A#property4} in #t1.==(null) ?{core::int} throw new _in::LateError::fieldNI("property4") : #t1{core::int};
   set property4(core::int #t2) → void
     this.{self::A::_#A#property4} = #t2;
   get property5() → core::int?
-    return this.{self::A::_#A#property5#isSet} ?{core::int?} this.{self::A::_#A#property5} : throw new _in::LateInitializationErrorImpl::•("Field 'property5' has not been initialized.");
+    return this.{self::A::_#A#property5#isSet} ?{core::int?} this.{self::A::_#A#property5} : throw new _in::LateError::fieldNI("property5");
   set property5(core::int? #t3) → void {
     this.{self::A::_#A#property5#isSet} = true;
     this.{self::A::_#A#property5} = #t3;
   }
   get property6() → core::int
-    return let final core::int? #t4 = this.{self::A::_#A#property6} in #t4.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'property6' has not been initialized.") : #t4{core::int};
+    return let final core::int? #t4 = this.{self::A::_#A#property6} in #t4.==(null) ?{core::int} throw new _in::LateError::fieldNI("property6") : #t4{core::int};
   set property6(covariant core::int #t5) → void
     this.{self::A::_#A#property6} = #t5;
 }
@@ -68,24 +68,24 @@
     : self::B1::_#B1#property4 = property4, self::B1::_#B1#property5 = property5, self::B1::_#B1#property6#isSet = true, self::B1::_#B1#property6 = property6, super core::Object::•()
     ;
   get property4() → core::int
-    return let final core::int? #t6 = this.{self::B1::_#B1#property4} in #t6.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'property4' has not been initialized.") : #t6{core::int};
+    return let final core::int? #t6 = this.{self::B1::_#B1#property4} in #t6.==(null) ?{core::int} throw new _in::LateError::fieldNI("property4") : #t6{core::int};
   set property4(core::int #t7) → void
     if(this.{self::B1::_#B1#property4}.==(null))
       this.{self::B1::_#B1#property4} = #t7;
     else
-      throw new _in::LateInitializationErrorImpl::•("Field 'property4' has already been initialized.");
+      throw new _in::LateError::fieldAI("property4");
   get property5() → core::int
-    return let final core::int? #t8 = this.{self::B1::_#B1#property5} in #t8.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'property5' has not been initialized.") : #t8{core::int};
+    return let final core::int? #t8 = this.{self::B1::_#B1#property5} in #t8.==(null) ?{core::int} throw new _in::LateError::fieldNI("property5") : #t8{core::int};
   set property5(core::int #t9) → void
     if(this.{self::B1::_#B1#property5}.==(null))
       this.{self::B1::_#B1#property5} = #t9;
     else
-      throw new _in::LateInitializationErrorImpl::•("Field 'property5' has already been initialized.");
+      throw new _in::LateError::fieldAI("property5");
   get property6() → core::int?
-    return this.{self::B1::_#B1#property6#isSet} ?{core::int?} this.{self::B1::_#B1#property6} : throw new _in::LateInitializationErrorImpl::•("Field 'property6' has not been initialized.");
+    return this.{self::B1::_#B1#property6#isSet} ?{core::int?} this.{self::B1::_#B1#property6} : throw new _in::LateError::fieldNI("property6");
   set property6(core::int? #t10) → void
     if(this.{self::B1::_#B1#property6#isSet})
-      throw new _in::LateInitializationErrorImpl::•("Field 'property6' has already been initialized.");
+      throw new _in::LateError::fieldAI("property6");
     else {
       this.{self::B1::_#B1#property6#isSet} = true;
       this.{self::B1::_#B1#property6} = #t10;
@@ -107,15 +107,15 @@
     : self::C1::_#C1#property4 = property4, self::C1::_#C1#property5 = property5, self::C1::_#C1#property6 = property6, super core::Object::•()
     ;
   get property4() → core::int
-    return let final core::int? #t11 = this.{self::C1::_#C1#property4} in #t11.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'property4' has not been initialized.") : #t11{core::int};
+    return let final core::int? #t11 = this.{self::C1::_#C1#property4} in #t11.==(null) ?{core::int} throw new _in::LateError::fieldNI("property4") : #t11{core::int};
   set property4(core::int #t12) → void
     this.{self::C1::_#C1#property4} = #t12;
   get property5() → core::int
-    return let final core::int? #t13 = this.{self::C1::_#C1#property5} in #t13.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'property5' has not been initialized.") : #t13{core::int};
+    return let final core::int? #t13 = this.{self::C1::_#C1#property5} in #t13.==(null) ?{core::int} throw new _in::LateError::fieldNI("property5") : #t13{core::int};
   set property5(core::int #t14) → void
     this.{self::C1::_#C1#property5} = #t14;
   get property6() → core::int
-    return let final core::int? #t15 = this.{self::C1::_#C1#property6} in #t15.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'property6' has not been initialized.") : #t15{core::int};
+    return let final core::int? #t15 = this.{self::C1::_#C1#property6} in #t15.==(null) ?{core::int} throw new _in::LateError::fieldNI("property6") : #t15{core::int};
   set property6(core::int #t16) → void
     this.{self::C1::_#C1#property6} = #t16;
 }
diff --git a/pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart.weak.expect b/pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart.weak.expect
index 7dd79a4..f3ffff6 100644
--- a/pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart.weak.expect
+++ b/pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart.weak.expect
@@ -47,19 +47,19 @@
     : self::A::_#A#property4#isSet = true, self::A::_#A#property4 = property4, self::A::_#A#property5#isSet = true, self::A::_#A#property5 = property5, self::A::_#A#property6#isSet = true, self::A::_#A#property6 = property6, super core::Object::•()
     ;
   get property4() → core::int
-    return this.{self::A::_#A#property4#isSet} ?{core::int} let final core::int? #t1 = this.{self::A::_#A#property4} in #t1{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'property4' has not been initialized.");
+    return this.{self::A::_#A#property4#isSet} ?{core::int} let final core::int? #t1 = this.{self::A::_#A#property4} in #t1{core::int} : throw new _in::LateError::fieldNI("property4");
   set property4(core::int #t2) → void {
     this.{self::A::_#A#property4#isSet} = true;
     this.{self::A::_#A#property4} = #t2;
   }
   get property5() → core::int?
-    return this.{self::A::_#A#property5#isSet} ?{core::int?} this.{self::A::_#A#property5} : throw new _in::LateInitializationErrorImpl::•("Field 'property5' has not been initialized.");
+    return this.{self::A::_#A#property5#isSet} ?{core::int?} this.{self::A::_#A#property5} : throw new _in::LateError::fieldNI("property5");
   set property5(core::int? #t3) → void {
     this.{self::A::_#A#property5#isSet} = true;
     this.{self::A::_#A#property5} = #t3;
   }
   get property6() → core::int
-    return this.{self::A::_#A#property6#isSet} ?{core::int} let final core::int? #t4 = this.{self::A::_#A#property6} in #t4{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'property6' has not been initialized.");
+    return this.{self::A::_#A#property6#isSet} ?{core::int} let final core::int? #t4 = this.{self::A::_#A#property6} in #t4{core::int} : throw new _in::LateError::fieldNI("property6");
   set property6(covariant core::int #t5) → void {
     this.{self::A::_#A#property6#isSet} = true;
     this.{self::A::_#A#property6} = #t5;
@@ -76,28 +76,28 @@
     : self::B1::_#B1#property4#isSet = true, self::B1::_#B1#property4 = property4, self::B1::_#B1#property5#isSet = true, self::B1::_#B1#property5 = property5, self::B1::_#B1#property6#isSet = true, self::B1::_#B1#property6 = property6, super core::Object::•()
     ;
   get property4() → core::int
-    return this.{self::B1::_#B1#property4#isSet} ?{core::int} let final core::int? #t6 = this.{self::B1::_#B1#property4} in #t6{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'property4' has not been initialized.");
+    return this.{self::B1::_#B1#property4#isSet} ?{core::int} let final core::int? #t6 = this.{self::B1::_#B1#property4} in #t6{core::int} : throw new _in::LateError::fieldNI("property4");
   set property4(core::int #t7) → void
     if(this.{self::B1::_#B1#property4#isSet})
-      throw new _in::LateInitializationErrorImpl::•("Field 'property4' has already been initialized.");
+      throw new _in::LateError::fieldAI("property4");
     else {
       this.{self::B1::_#B1#property4#isSet} = true;
       this.{self::B1::_#B1#property4} = #t7;
     }
   get property5() → core::int
-    return this.{self::B1::_#B1#property5#isSet} ?{core::int} let final core::int? #t8 = this.{self::B1::_#B1#property5} in #t8{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'property5' has not been initialized.");
+    return this.{self::B1::_#B1#property5#isSet} ?{core::int} let final core::int? #t8 = this.{self::B1::_#B1#property5} in #t8{core::int} : throw new _in::LateError::fieldNI("property5");
   set property5(core::int #t9) → void
     if(this.{self::B1::_#B1#property5#isSet})
-      throw new _in::LateInitializationErrorImpl::•("Field 'property5' has already been initialized.");
+      throw new _in::LateError::fieldAI("property5");
     else {
       this.{self::B1::_#B1#property5#isSet} = true;
       this.{self::B1::_#B1#property5} = #t9;
     }
   get property6() → core::int?
-    return this.{self::B1::_#B1#property6#isSet} ?{core::int?} this.{self::B1::_#B1#property6} : throw new _in::LateInitializationErrorImpl::•("Field 'property6' has not been initialized.");
+    return this.{self::B1::_#B1#property6#isSet} ?{core::int?} this.{self::B1::_#B1#property6} : throw new _in::LateError::fieldNI("property6");
   set property6(core::int? #t10) → void
     if(this.{self::B1::_#B1#property6#isSet})
-      throw new _in::LateInitializationErrorImpl::•("Field 'property6' has already been initialized.");
+      throw new _in::LateError::fieldAI("property6");
     else {
       this.{self::B1::_#B1#property6#isSet} = true;
       this.{self::B1::_#B1#property6} = #t10;
@@ -122,19 +122,19 @@
     : self::C1::_#C1#property4#isSet = true, self::C1::_#C1#property4 = property4, self::C1::_#C1#property5#isSet = true, self::C1::_#C1#property5 = property5, self::C1::_#C1#property6#isSet = true, self::C1::_#C1#property6 = property6, super core::Object::•()
     ;
   get property4() → core::int
-    return this.{self::C1::_#C1#property4#isSet} ?{core::int} let final core::int? #t11 = this.{self::C1::_#C1#property4} in #t11{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'property4' has not been initialized.");
+    return this.{self::C1::_#C1#property4#isSet} ?{core::int} let final core::int? #t11 = this.{self::C1::_#C1#property4} in #t11{core::int} : throw new _in::LateError::fieldNI("property4");
   set property4(core::int #t12) → void {
     this.{self::C1::_#C1#property4#isSet} = true;
     this.{self::C1::_#C1#property4} = #t12;
   }
   get property5() → core::int
-    return this.{self::C1::_#C1#property5#isSet} ?{core::int} let final core::int? #t13 = this.{self::C1::_#C1#property5} in #t13{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'property5' has not been initialized.");
+    return this.{self::C1::_#C1#property5#isSet} ?{core::int} let final core::int? #t13 = this.{self::C1::_#C1#property5} in #t13{core::int} : throw new _in::LateError::fieldNI("property5");
   set property5(core::int #t14) → void {
     this.{self::C1::_#C1#property5#isSet} = true;
     this.{self::C1::_#C1#property5} = #t14;
   }
   get property6() → core::int
-    return this.{self::C1::_#C1#property6#isSet} ?{core::int} let final core::int? #t15 = this.{self::C1::_#C1#property6} in #t15{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'property6' has not been initialized.");
+    return this.{self::C1::_#C1#property6#isSet} ?{core::int} let final core::int? #t15 = this.{self::C1::_#C1#property6} in #t15{core::int} : throw new _in::LateError::fieldNI("property6");
   set property6(core::int #t16) → void {
     this.{self::C1::_#C1#property6#isSet} = true;
     this.{self::C1::_#C1#property6} = #t16;
diff --git a/pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart.weak.transformed.expect
index 7dd79a4..f3ffff6 100644
--- a/pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart.weak.transformed.expect
@@ -47,19 +47,19 @@
     : self::A::_#A#property4#isSet = true, self::A::_#A#property4 = property4, self::A::_#A#property5#isSet = true, self::A::_#A#property5 = property5, self::A::_#A#property6#isSet = true, self::A::_#A#property6 = property6, super core::Object::•()
     ;
   get property4() → core::int
-    return this.{self::A::_#A#property4#isSet} ?{core::int} let final core::int? #t1 = this.{self::A::_#A#property4} in #t1{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'property4' has not been initialized.");
+    return this.{self::A::_#A#property4#isSet} ?{core::int} let final core::int? #t1 = this.{self::A::_#A#property4} in #t1{core::int} : throw new _in::LateError::fieldNI("property4");
   set property4(core::int #t2) → void {
     this.{self::A::_#A#property4#isSet} = true;
     this.{self::A::_#A#property4} = #t2;
   }
   get property5() → core::int?
-    return this.{self::A::_#A#property5#isSet} ?{core::int?} this.{self::A::_#A#property5} : throw new _in::LateInitializationErrorImpl::•("Field 'property5' has not been initialized.");
+    return this.{self::A::_#A#property5#isSet} ?{core::int?} this.{self::A::_#A#property5} : throw new _in::LateError::fieldNI("property5");
   set property5(core::int? #t3) → void {
     this.{self::A::_#A#property5#isSet} = true;
     this.{self::A::_#A#property5} = #t3;
   }
   get property6() → core::int
-    return this.{self::A::_#A#property6#isSet} ?{core::int} let final core::int? #t4 = this.{self::A::_#A#property6} in #t4{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'property6' has not been initialized.");
+    return this.{self::A::_#A#property6#isSet} ?{core::int} let final core::int? #t4 = this.{self::A::_#A#property6} in #t4{core::int} : throw new _in::LateError::fieldNI("property6");
   set property6(covariant core::int #t5) → void {
     this.{self::A::_#A#property6#isSet} = true;
     this.{self::A::_#A#property6} = #t5;
@@ -76,28 +76,28 @@
     : self::B1::_#B1#property4#isSet = true, self::B1::_#B1#property4 = property4, self::B1::_#B1#property5#isSet = true, self::B1::_#B1#property5 = property5, self::B1::_#B1#property6#isSet = true, self::B1::_#B1#property6 = property6, super core::Object::•()
     ;
   get property4() → core::int
-    return this.{self::B1::_#B1#property4#isSet} ?{core::int} let final core::int? #t6 = this.{self::B1::_#B1#property4} in #t6{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'property4' has not been initialized.");
+    return this.{self::B1::_#B1#property4#isSet} ?{core::int} let final core::int? #t6 = this.{self::B1::_#B1#property4} in #t6{core::int} : throw new _in::LateError::fieldNI("property4");
   set property4(core::int #t7) → void
     if(this.{self::B1::_#B1#property4#isSet})
-      throw new _in::LateInitializationErrorImpl::•("Field 'property4' has already been initialized.");
+      throw new _in::LateError::fieldAI("property4");
     else {
       this.{self::B1::_#B1#property4#isSet} = true;
       this.{self::B1::_#B1#property4} = #t7;
     }
   get property5() → core::int
-    return this.{self::B1::_#B1#property5#isSet} ?{core::int} let final core::int? #t8 = this.{self::B1::_#B1#property5} in #t8{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'property5' has not been initialized.");
+    return this.{self::B1::_#B1#property5#isSet} ?{core::int} let final core::int? #t8 = this.{self::B1::_#B1#property5} in #t8{core::int} : throw new _in::LateError::fieldNI("property5");
   set property5(core::int #t9) → void
     if(this.{self::B1::_#B1#property5#isSet})
-      throw new _in::LateInitializationErrorImpl::•("Field 'property5' has already been initialized.");
+      throw new _in::LateError::fieldAI("property5");
     else {
       this.{self::B1::_#B1#property5#isSet} = true;
       this.{self::B1::_#B1#property5} = #t9;
     }
   get property6() → core::int?
-    return this.{self::B1::_#B1#property6#isSet} ?{core::int?} this.{self::B1::_#B1#property6} : throw new _in::LateInitializationErrorImpl::•("Field 'property6' has not been initialized.");
+    return this.{self::B1::_#B1#property6#isSet} ?{core::int?} this.{self::B1::_#B1#property6} : throw new _in::LateError::fieldNI("property6");
   set property6(core::int? #t10) → void
     if(this.{self::B1::_#B1#property6#isSet})
-      throw new _in::LateInitializationErrorImpl::•("Field 'property6' has already been initialized.");
+      throw new _in::LateError::fieldAI("property6");
     else {
       this.{self::B1::_#B1#property6#isSet} = true;
       this.{self::B1::_#B1#property6} = #t10;
@@ -122,19 +122,19 @@
     : self::C1::_#C1#property4#isSet = true, self::C1::_#C1#property4 = property4, self::C1::_#C1#property5#isSet = true, self::C1::_#C1#property5 = property5, self::C1::_#C1#property6#isSet = true, self::C1::_#C1#property6 = property6, super core::Object::•()
     ;
   get property4() → core::int
-    return this.{self::C1::_#C1#property4#isSet} ?{core::int} let final core::int? #t11 = this.{self::C1::_#C1#property4} in #t11{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'property4' has not been initialized.");
+    return this.{self::C1::_#C1#property4#isSet} ?{core::int} let final core::int? #t11 = this.{self::C1::_#C1#property4} in #t11{core::int} : throw new _in::LateError::fieldNI("property4");
   set property4(core::int #t12) → void {
     this.{self::C1::_#C1#property4#isSet} = true;
     this.{self::C1::_#C1#property4} = #t12;
   }
   get property5() → core::int
-    return this.{self::C1::_#C1#property5#isSet} ?{core::int} let final core::int? #t13 = this.{self::C1::_#C1#property5} in #t13{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'property5' has not been initialized.");
+    return this.{self::C1::_#C1#property5#isSet} ?{core::int} let final core::int? #t13 = this.{self::C1::_#C1#property5} in #t13{core::int} : throw new _in::LateError::fieldNI("property5");
   set property5(core::int #t14) → void {
     this.{self::C1::_#C1#property5#isSet} = true;
     this.{self::C1::_#C1#property5} = #t14;
   }
   get property6() → core::int
-    return this.{self::C1::_#C1#property6#isSet} ?{core::int} let final core::int? #t15 = this.{self::C1::_#C1#property6} in #t15{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'property6' has not been initialized.");
+    return this.{self::C1::_#C1#property6#isSet} ?{core::int} let final core::int? #t15 = this.{self::C1::_#C1#property6} in #t15{core::int} : throw new _in::LateError::fieldNI("property6");
   set property6(core::int #t16) → void {
     this.{self::C1::_#C1#property6#isSet} = true;
     this.{self::C1::_#C1#property6} = #t16;
diff --git a/pkg/front_end/testcases/late_lowering/infer_from_late_variable.dart.strong.expect b/pkg/front_end/testcases/late_lowering/infer_from_late_variable.dart.strong.expect
index 4c0d317..18df179 100644
--- a/pkg/front_end/testcases/late_lowering/infer_from_late_variable.dart.strong.expect
+++ b/pkg/front_end/testcases/late_lowering/infer_from_late_variable.dart.strong.expect
@@ -8,7 +8,7 @@
 static method main() → dynamic {
   core::int? local;
   function #local#get() → core::int
-    return let final core::int? #t1 = local in #t1.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local' has not been initialized.") : #t1{core::int};
+    return let final core::int? #t1 = local in #t1.==(null) ?{core::int} throw new _in::LateError::localNI("local") : #t1{core::int};
   function #local#set(core::int #t2) → dynamic
     return local = #t2;
   #local#set.call(self::f<core::int>(0));
diff --git a/pkg/front_end/testcases/late_lowering/infer_from_late_variable.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/infer_from_late_variable.dart.strong.transformed.expect
index 4c0d317..18df179 100644
--- a/pkg/front_end/testcases/late_lowering/infer_from_late_variable.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/infer_from_late_variable.dart.strong.transformed.expect
@@ -8,7 +8,7 @@
 static method main() → dynamic {
   core::int? local;
   function #local#get() → core::int
-    return let final core::int? #t1 = local in #t1.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local' has not been initialized.") : #t1{core::int};
+    return let final core::int? #t1 = local in #t1.==(null) ?{core::int} throw new _in::LateError::localNI("local") : #t1{core::int};
   function #local#set(core::int #t2) → dynamic
     return local = #t2;
   #local#set.call(self::f<core::int>(0));
diff --git a/pkg/front_end/testcases/late_lowering/infer_from_late_variable.dart.weak.expect b/pkg/front_end/testcases/late_lowering/infer_from_late_variable.dart.weak.expect
index 6dffe96..a9eee6d 100644
--- a/pkg/front_end/testcases/late_lowering/infer_from_late_variable.dart.weak.expect
+++ b/pkg/front_end/testcases/late_lowering/infer_from_late_variable.dart.weak.expect
@@ -9,7 +9,7 @@
   core::int? local;
   core::bool #local#isSet = false;
   function #local#get() → core::int
-    return #local#isSet ?{core::int} local{core::int} : throw new _in::LateInitializationErrorImpl::•("Local 'local' has not been initialized.");
+    return #local#isSet ?{core::int} local{core::int} : throw new _in::LateError::localNI("local");
   function #local#set(core::int #t1) → dynamic {
     #local#isSet = true;
     return local = #t1;
diff --git a/pkg/front_end/testcases/late_lowering/infer_from_late_variable.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/infer_from_late_variable.dart.weak.transformed.expect
index 6dffe96..a9eee6d 100644
--- a/pkg/front_end/testcases/late_lowering/infer_from_late_variable.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/infer_from_late_variable.dart.weak.transformed.expect
@@ -9,7 +9,7 @@
   core::int? local;
   core::bool #local#isSet = false;
   function #local#get() → core::int
-    return #local#isSet ?{core::int} local{core::int} : throw new _in::LateInitializationErrorImpl::•("Local 'local' has not been initialized.");
+    return #local#isSet ?{core::int} local{core::int} : throw new _in::LateError::localNI("local");
   function #local#set(core::int #t1) → dynamic {
     #local#isSet = true;
     return local = #t1;
diff --git a/pkg/front_end/testcases/late_lowering/infer_late_field_type.dart.strong.expect b/pkg/front_end/testcases/late_lowering/infer_late_field_type.dart.strong.expect
index 0cb82625..4055b4c 100644
--- a/pkg/front_end/testcases/late_lowering/infer_late_field_type.dart.strong.expect
+++ b/pkg/front_end/testcases/late_lowering/infer_late_field_type.dart.strong.expect
@@ -16,7 +16,7 @@
     : super core::Object::•()
     ;
   get field() → core::int?
-    return this.{self::B::_#B#field#isSet} ?{core::int?} this.{self::B::_#B#field} : throw new _in::LateInitializationErrorImpl::•("Field 'field' has not been initialized.");
+    return this.{self::B::_#B#field#isSet} ?{core::int?} this.{self::B::_#B#field} : throw new _in::LateError::fieldNI("field");
   set field(core::int? #t1) → void {
     this.{self::B::_#B#field#isSet} = true;
     this.{self::B::_#B#field} = #t1;
diff --git a/pkg/front_end/testcases/late_lowering/infer_late_field_type.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/infer_late_field_type.dart.strong.transformed.expect
index 0cb82625..4055b4c 100644
--- a/pkg/front_end/testcases/late_lowering/infer_late_field_type.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/infer_late_field_type.dart.strong.transformed.expect
@@ -16,7 +16,7 @@
     : super core::Object::•()
     ;
   get field() → core::int?
-    return this.{self::B::_#B#field#isSet} ?{core::int?} this.{self::B::_#B#field} : throw new _in::LateInitializationErrorImpl::•("Field 'field' has not been initialized.");
+    return this.{self::B::_#B#field#isSet} ?{core::int?} this.{self::B::_#B#field} : throw new _in::LateError::fieldNI("field");
   set field(core::int? #t1) → void {
     this.{self::B::_#B#field#isSet} = true;
     this.{self::B::_#B#field} = #t1;
diff --git a/pkg/front_end/testcases/late_lowering/infer_late_field_type.dart.weak.expect b/pkg/front_end/testcases/late_lowering/infer_late_field_type.dart.weak.expect
index 0cb82625..4055b4c 100644
--- a/pkg/front_end/testcases/late_lowering/infer_late_field_type.dart.weak.expect
+++ b/pkg/front_end/testcases/late_lowering/infer_late_field_type.dart.weak.expect
@@ -16,7 +16,7 @@
     : super core::Object::•()
     ;
   get field() → core::int?
-    return this.{self::B::_#B#field#isSet} ?{core::int?} this.{self::B::_#B#field} : throw new _in::LateInitializationErrorImpl::•("Field 'field' has not been initialized.");
+    return this.{self::B::_#B#field#isSet} ?{core::int?} this.{self::B::_#B#field} : throw new _in::LateError::fieldNI("field");
   set field(core::int? #t1) → void {
     this.{self::B::_#B#field#isSet} = true;
     this.{self::B::_#B#field} = #t1;
diff --git a/pkg/front_end/testcases/late_lowering/infer_late_field_type.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/infer_late_field_type.dart.weak.transformed.expect
index 0cb82625..4055b4c 100644
--- a/pkg/front_end/testcases/late_lowering/infer_late_field_type.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/infer_late_field_type.dart.weak.transformed.expect
@@ -16,7 +16,7 @@
     : super core::Object::•()
     ;
   get field() → core::int?
-    return this.{self::B::_#B#field#isSet} ?{core::int?} this.{self::B::_#B#field} : throw new _in::LateInitializationErrorImpl::•("Field 'field' has not been initialized.");
+    return this.{self::B::_#B#field#isSet} ?{core::int?} this.{self::B::_#B#field} : throw new _in::LateError::fieldNI("field");
   set field(core::int? #t1) → void {
     this.{self::B::_#B#field#isSet} = true;
     this.{self::B::_#B#field} = #t1;
diff --git a/pkg/front_end/testcases/late_lowering/initializer_rewrite.dart.strong.expect b/pkg/front_end/testcases/late_lowering/initializer_rewrite.dart.strong.expect
index 1edfa3c..16fa8e0 100644
--- a/pkg/front_end/testcases/late_lowering/initializer_rewrite.dart.strong.expect
+++ b/pkg/front_end/testcases/late_lowering/initializer_rewrite.dart.strong.expect
@@ -18,24 +18,24 @@
     : super core::Object::•()
     ;
   static get nonNullableStaticField() → core::int
-    return let final core::int? #t1 = self::Class::_#nonNullableStaticField in #t1.==(null) ?{core::int} let final core::int #t2 = (let final core::int #t3 = self::Class::nonNullableStaticFieldReads in let final core::int #t4 = self::Class::nonNullableStaticFieldReads = #t3.{core::num::+}(1) in #t3).{core::num::==}(0) ?{core::int} self::Class::nonNullableStaticField.{core::num::+}(1) : 0 in self::Class::_#nonNullableStaticField.==(null) ?{core::int} self::Class::_#nonNullableStaticField = #t2 : throw new _in::LateInitializationErrorImpl::•("Field 'nonNullableStaticField' has been assigned during initialization.") : #t1{core::int};
+    return let final core::int? #t1 = self::Class::_#nonNullableStaticField in #t1.==(null) ?{core::int} let final core::int #t2 = (let final core::int #t3 = self::Class::nonNullableStaticFieldReads in let final core::int #t4 = self::Class::nonNullableStaticFieldReads = #t3.{core::num::+}(1) in #t3).{core::num::==}(0) ?{core::int} self::Class::nonNullableStaticField.{core::num::+}(1) : 0 in self::Class::_#nonNullableStaticField.==(null) ?{core::int} self::Class::_#nonNullableStaticField = #t2 : throw new _in::LateError::fieldADI("nonNullableStaticField") : #t1{core::int};
   static get nullableStaticField() → core::int? {
     if(!self::Class::_#nullableStaticField#isSet) {
       final core::int? #t5 = (let final core::int #t6 = self::Class::nullableStaticFieldReads in let final core::int #t7 = self::Class::nullableStaticFieldReads = #t6.{core::num::+}(1) in #t6).{core::num::==}(0) ?{core::int} self::Class::nullableStaticField.{core::Object::hashCode} : 0;
       if(self::Class::_#nullableStaticField#isSet)
-        throw new _in::LateInitializationErrorImpl::•("Field 'nullableStaticField' has been assigned during initialization.");
+        throw new _in::LateError::fieldADI("nullableStaticField");
       self::Class::_#nullableStaticField = #t5;
       self::Class::_#nullableStaticField#isSet = true;
     }
     return self::Class::_#nullableStaticField;
   }
   get nonNullableInstanceField() → core::int
-    return let final core::int? #t8 = this.{self::Class::_#Class#nonNullableInstanceField} in #t8.==(null) ?{core::int} let final core::int #t9 = (let final core::int #t10 = this.{self::Class::nonNullableInstanceFieldReads} in let final core::int #t11 = this.{self::Class::nonNullableInstanceFieldReads} = #t10.{core::num::+}(1) in #t10).{core::num::==}(0) ?{core::int} this.{self::Class::nonNullableInstanceField}.{core::num::+}(1) : 0 in this.{self::Class::_#Class#nonNullableInstanceField}.==(null) ?{core::int} this.{self::Class::_#Class#nonNullableInstanceField} = #t9 : throw new _in::LateInitializationErrorImpl::•("Field 'nonNullableInstanceField' has been assigned during initialization.") : #t8{core::int};
+    return let final core::int? #t8 = this.{self::Class::_#Class#nonNullableInstanceField} in #t8.==(null) ?{core::int} let final core::int #t9 = (let final core::int #t10 = this.{self::Class::nonNullableInstanceFieldReads} in let final core::int #t11 = this.{self::Class::nonNullableInstanceFieldReads} = #t10.{core::num::+}(1) in #t10).{core::num::==}(0) ?{core::int} this.{self::Class::nonNullableInstanceField}.{core::num::+}(1) : 0 in this.{self::Class::_#Class#nonNullableInstanceField}.==(null) ?{core::int} this.{self::Class::_#Class#nonNullableInstanceField} = #t9 : throw new _in::LateError::fieldADI("nonNullableInstanceField") : #t8{core::int};
   get nullableInstanceField() → core::int? {
     if(!this.{self::Class::_#Class#nullableInstanceField#isSet}) {
       final core::int? #t12 = (let final core::int #t13 = this.{self::Class::nullableInstanceFieldReads} in let final core::int #t14 = this.{self::Class::nullableInstanceFieldReads} = #t13.{core::num::+}(1) in #t13).{core::num::==}(0) ?{core::int} this.{self::Class::nullableInstanceField}.{core::Object::hashCode} : 0;
       if(this.{self::Class::_#Class#nullableInstanceField#isSet})
-        throw new _in::LateInitializationErrorImpl::•("Field 'nullableInstanceField' has been assigned during initialization.");
+        throw new _in::LateError::fieldADI("nullableInstanceField");
       this.{self::Class::_#Class#nullableInstanceField} = #t12;
       this.{self::Class::_#Class#nullableInstanceField#isSet} = true;
     }
@@ -48,12 +48,12 @@
 static field core::int? _#nullableTopLevelField = null;
 static field core::bool _#nullableTopLevelField#isSet = false;
 static get nonNullableTopLevelField() → core::int
-  return let final core::int? #t15 = self::_#nonNullableTopLevelField in #t15.==(null) ?{core::int} let final core::int #t16 = (let final core::int #t17 = self::nonNullableTopLevelFieldReads in let final core::int #t18 = self::nonNullableTopLevelFieldReads = #t17.{core::num::+}(1) in #t17).{core::num::==}(0) ?{core::int} self::nonNullableTopLevelField.{core::num::+}(1) : 0 in self::_#nonNullableTopLevelField.==(null) ?{core::int} self::_#nonNullableTopLevelField = #t16 : throw new _in::LateInitializationErrorImpl::•("Field 'nonNullableTopLevelField' has been assigned during initialization.") : #t15{core::int};
+  return let final core::int? #t15 = self::_#nonNullableTopLevelField in #t15.==(null) ?{core::int} let final core::int #t16 = (let final core::int #t17 = self::nonNullableTopLevelFieldReads in let final core::int #t18 = self::nonNullableTopLevelFieldReads = #t17.{core::num::+}(1) in #t17).{core::num::==}(0) ?{core::int} self::nonNullableTopLevelField.{core::num::+}(1) : 0 in self::_#nonNullableTopLevelField.==(null) ?{core::int} self::_#nonNullableTopLevelField = #t16 : throw new _in::LateError::fieldADI("nonNullableTopLevelField") : #t15{core::int};
 static get nullableTopLevelField() → core::int? {
   if(!self::_#nullableTopLevelField#isSet) {
     final core::int? #t19 = (let final core::int #t20 = self::nullableTopLevelFieldReads in let final core::int #t21 = self::nullableTopLevelFieldReads = #t20.{core::num::+}(1) in #t20).{core::num::==}(0) ?{core::int} self::nullableTopLevelField.{core::Object::hashCode} : 0;
     if(self::_#nullableTopLevelField#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Field 'nullableTopLevelField' has been assigned during initialization.");
+      throw new _in::LateError::fieldADI("nullableTopLevelField");
     self::_#nullableTopLevelField = #t19;
     self::_#nullableTopLevelField#isSet = true;
   }
diff --git a/pkg/front_end/testcases/late_lowering/initializer_rewrite.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/initializer_rewrite.dart.strong.transformed.expect
index 1edfa3c..16fa8e0 100644
--- a/pkg/front_end/testcases/late_lowering/initializer_rewrite.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/initializer_rewrite.dart.strong.transformed.expect
@@ -18,24 +18,24 @@
     : super core::Object::•()
     ;
   static get nonNullableStaticField() → core::int
-    return let final core::int? #t1 = self::Class::_#nonNullableStaticField in #t1.==(null) ?{core::int} let final core::int #t2 = (let final core::int #t3 = self::Class::nonNullableStaticFieldReads in let final core::int #t4 = self::Class::nonNullableStaticFieldReads = #t3.{core::num::+}(1) in #t3).{core::num::==}(0) ?{core::int} self::Class::nonNullableStaticField.{core::num::+}(1) : 0 in self::Class::_#nonNullableStaticField.==(null) ?{core::int} self::Class::_#nonNullableStaticField = #t2 : throw new _in::LateInitializationErrorImpl::•("Field 'nonNullableStaticField' has been assigned during initialization.") : #t1{core::int};
+    return let final core::int? #t1 = self::Class::_#nonNullableStaticField in #t1.==(null) ?{core::int} let final core::int #t2 = (let final core::int #t3 = self::Class::nonNullableStaticFieldReads in let final core::int #t4 = self::Class::nonNullableStaticFieldReads = #t3.{core::num::+}(1) in #t3).{core::num::==}(0) ?{core::int} self::Class::nonNullableStaticField.{core::num::+}(1) : 0 in self::Class::_#nonNullableStaticField.==(null) ?{core::int} self::Class::_#nonNullableStaticField = #t2 : throw new _in::LateError::fieldADI("nonNullableStaticField") : #t1{core::int};
   static get nullableStaticField() → core::int? {
     if(!self::Class::_#nullableStaticField#isSet) {
       final core::int? #t5 = (let final core::int #t6 = self::Class::nullableStaticFieldReads in let final core::int #t7 = self::Class::nullableStaticFieldReads = #t6.{core::num::+}(1) in #t6).{core::num::==}(0) ?{core::int} self::Class::nullableStaticField.{core::Object::hashCode} : 0;
       if(self::Class::_#nullableStaticField#isSet)
-        throw new _in::LateInitializationErrorImpl::•("Field 'nullableStaticField' has been assigned during initialization.");
+        throw new _in::LateError::fieldADI("nullableStaticField");
       self::Class::_#nullableStaticField = #t5;
       self::Class::_#nullableStaticField#isSet = true;
     }
     return self::Class::_#nullableStaticField;
   }
   get nonNullableInstanceField() → core::int
-    return let final core::int? #t8 = this.{self::Class::_#Class#nonNullableInstanceField} in #t8.==(null) ?{core::int} let final core::int #t9 = (let final core::int #t10 = this.{self::Class::nonNullableInstanceFieldReads} in let final core::int #t11 = this.{self::Class::nonNullableInstanceFieldReads} = #t10.{core::num::+}(1) in #t10).{core::num::==}(0) ?{core::int} this.{self::Class::nonNullableInstanceField}.{core::num::+}(1) : 0 in this.{self::Class::_#Class#nonNullableInstanceField}.==(null) ?{core::int} this.{self::Class::_#Class#nonNullableInstanceField} = #t9 : throw new _in::LateInitializationErrorImpl::•("Field 'nonNullableInstanceField' has been assigned during initialization.") : #t8{core::int};
+    return let final core::int? #t8 = this.{self::Class::_#Class#nonNullableInstanceField} in #t8.==(null) ?{core::int} let final core::int #t9 = (let final core::int #t10 = this.{self::Class::nonNullableInstanceFieldReads} in let final core::int #t11 = this.{self::Class::nonNullableInstanceFieldReads} = #t10.{core::num::+}(1) in #t10).{core::num::==}(0) ?{core::int} this.{self::Class::nonNullableInstanceField}.{core::num::+}(1) : 0 in this.{self::Class::_#Class#nonNullableInstanceField}.==(null) ?{core::int} this.{self::Class::_#Class#nonNullableInstanceField} = #t9 : throw new _in::LateError::fieldADI("nonNullableInstanceField") : #t8{core::int};
   get nullableInstanceField() → core::int? {
     if(!this.{self::Class::_#Class#nullableInstanceField#isSet}) {
       final core::int? #t12 = (let final core::int #t13 = this.{self::Class::nullableInstanceFieldReads} in let final core::int #t14 = this.{self::Class::nullableInstanceFieldReads} = #t13.{core::num::+}(1) in #t13).{core::num::==}(0) ?{core::int} this.{self::Class::nullableInstanceField}.{core::Object::hashCode} : 0;
       if(this.{self::Class::_#Class#nullableInstanceField#isSet})
-        throw new _in::LateInitializationErrorImpl::•("Field 'nullableInstanceField' has been assigned during initialization.");
+        throw new _in::LateError::fieldADI("nullableInstanceField");
       this.{self::Class::_#Class#nullableInstanceField} = #t12;
       this.{self::Class::_#Class#nullableInstanceField#isSet} = true;
     }
@@ -48,12 +48,12 @@
 static field core::int? _#nullableTopLevelField = null;
 static field core::bool _#nullableTopLevelField#isSet = false;
 static get nonNullableTopLevelField() → core::int
-  return let final core::int? #t15 = self::_#nonNullableTopLevelField in #t15.==(null) ?{core::int} let final core::int #t16 = (let final core::int #t17 = self::nonNullableTopLevelFieldReads in let final core::int #t18 = self::nonNullableTopLevelFieldReads = #t17.{core::num::+}(1) in #t17).{core::num::==}(0) ?{core::int} self::nonNullableTopLevelField.{core::num::+}(1) : 0 in self::_#nonNullableTopLevelField.==(null) ?{core::int} self::_#nonNullableTopLevelField = #t16 : throw new _in::LateInitializationErrorImpl::•("Field 'nonNullableTopLevelField' has been assigned during initialization.") : #t15{core::int};
+  return let final core::int? #t15 = self::_#nonNullableTopLevelField in #t15.==(null) ?{core::int} let final core::int #t16 = (let final core::int #t17 = self::nonNullableTopLevelFieldReads in let final core::int #t18 = self::nonNullableTopLevelFieldReads = #t17.{core::num::+}(1) in #t17).{core::num::==}(0) ?{core::int} self::nonNullableTopLevelField.{core::num::+}(1) : 0 in self::_#nonNullableTopLevelField.==(null) ?{core::int} self::_#nonNullableTopLevelField = #t16 : throw new _in::LateError::fieldADI("nonNullableTopLevelField") : #t15{core::int};
 static get nullableTopLevelField() → core::int? {
   if(!self::_#nullableTopLevelField#isSet) {
     final core::int? #t19 = (let final core::int #t20 = self::nullableTopLevelFieldReads in let final core::int #t21 = self::nullableTopLevelFieldReads = #t20.{core::num::+}(1) in #t20).{core::num::==}(0) ?{core::int} self::nullableTopLevelField.{core::Object::hashCode} : 0;
     if(self::_#nullableTopLevelField#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Field 'nullableTopLevelField' has been assigned during initialization.");
+      throw new _in::LateError::fieldADI("nullableTopLevelField");
     self::_#nullableTopLevelField = #t19;
     self::_#nullableTopLevelField#isSet = true;
   }
diff --git a/pkg/front_end/testcases/late_lowering/initializer_rewrite.dart.weak.expect b/pkg/front_end/testcases/late_lowering/initializer_rewrite.dart.weak.expect
index 8784442..ad9e30d 100644
--- a/pkg/front_end/testcases/late_lowering/initializer_rewrite.dart.weak.expect
+++ b/pkg/front_end/testcases/late_lowering/initializer_rewrite.dart.weak.expect
@@ -23,7 +23,7 @@
     if(!self::Class::_#nonNullableStaticField#isSet) {
       final core::int #t1 = (let final core::int #t2 = self::Class::nonNullableStaticFieldReads in let final core::int #t3 = self::Class::nonNullableStaticFieldReads = #t2.{core::num::+}(1) in #t2).{core::num::==}(0) ?{core::int} self::Class::nonNullableStaticField.{core::num::+}(1) : 0;
       if(self::Class::_#nonNullableStaticField#isSet)
-        throw new _in::LateInitializationErrorImpl::•("Field 'nonNullableStaticField' has been assigned during initialization.");
+        throw new _in::LateError::fieldADI("nonNullableStaticField");
       self::Class::_#nonNullableStaticField = #t1;
       self::Class::_#nonNullableStaticField#isSet = true;
     }
@@ -33,7 +33,7 @@
     if(!self::Class::_#nullableStaticField#isSet) {
       final core::int? #t5 = (let final core::int #t6 = self::Class::nullableStaticFieldReads in let final core::int #t7 = self::Class::nullableStaticFieldReads = #t6.{core::num::+}(1) in #t6).{core::num::==}(0) ?{core::int} self::Class::nullableStaticField.{core::Object::hashCode} : 0;
       if(self::Class::_#nullableStaticField#isSet)
-        throw new _in::LateInitializationErrorImpl::•("Field 'nullableStaticField' has been assigned during initialization.");
+        throw new _in::LateError::fieldADI("nullableStaticField");
       self::Class::_#nullableStaticField = #t5;
       self::Class::_#nullableStaticField#isSet = true;
     }
@@ -43,7 +43,7 @@
     if(!this.{self::Class::_#Class#nonNullableInstanceField#isSet}) {
       final core::int #t8 = (let final core::int #t9 = this.{self::Class::nonNullableInstanceFieldReads} in let final core::int #t10 = this.{self::Class::nonNullableInstanceFieldReads} = #t9.{core::num::+}(1) in #t9).{core::num::==}(0) ?{core::int} this.{self::Class::nonNullableInstanceField}.{core::num::+}(1) : 0;
       if(this.{self::Class::_#Class#nonNullableInstanceField#isSet})
-        throw new _in::LateInitializationErrorImpl::•("Field 'nonNullableInstanceField' has been assigned during initialization.");
+        throw new _in::LateError::fieldADI("nonNullableInstanceField");
       this.{self::Class::_#Class#nonNullableInstanceField} = #t8;
       this.{self::Class::_#Class#nonNullableInstanceField#isSet} = true;
     }
@@ -53,7 +53,7 @@
     if(!this.{self::Class::_#Class#nullableInstanceField#isSet}) {
       final core::int? #t12 = (let final core::int #t13 = this.{self::Class::nullableInstanceFieldReads} in let final core::int #t14 = this.{self::Class::nullableInstanceFieldReads} = #t13.{core::num::+}(1) in #t13).{core::num::==}(0) ?{core::int} this.{self::Class::nullableInstanceField}.{core::Object::hashCode} : 0;
       if(this.{self::Class::_#Class#nullableInstanceField#isSet})
-        throw new _in::LateInitializationErrorImpl::•("Field 'nullableInstanceField' has been assigned during initialization.");
+        throw new _in::LateError::fieldADI("nullableInstanceField");
       this.{self::Class::_#Class#nullableInstanceField} = #t12;
       this.{self::Class::_#Class#nullableInstanceField#isSet} = true;
     }
@@ -70,7 +70,7 @@
   if(!self::_#nonNullableTopLevelField#isSet) {
     final core::int #t15 = (let final core::int #t16 = self::nonNullableTopLevelFieldReads in let final core::int #t17 = self::nonNullableTopLevelFieldReads = #t16.{core::num::+}(1) in #t16).{core::num::==}(0) ?{core::int} self::nonNullableTopLevelField.{core::num::+}(1) : 0;
     if(self::_#nonNullableTopLevelField#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Field 'nonNullableTopLevelField' has been assigned during initialization.");
+      throw new _in::LateError::fieldADI("nonNullableTopLevelField");
     self::_#nonNullableTopLevelField = #t15;
     self::_#nonNullableTopLevelField#isSet = true;
   }
@@ -80,7 +80,7 @@
   if(!self::_#nullableTopLevelField#isSet) {
     final core::int? #t19 = (let final core::int #t20 = self::nullableTopLevelFieldReads in let final core::int #t21 = self::nullableTopLevelFieldReads = #t20.{core::num::+}(1) in #t20).{core::num::==}(0) ?{core::int} self::nullableTopLevelField.{core::Object::hashCode} : 0;
     if(self::_#nullableTopLevelField#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Field 'nullableTopLevelField' has been assigned during initialization.");
+      throw new _in::LateError::fieldADI("nullableTopLevelField");
     self::_#nullableTopLevelField = #t19;
     self::_#nullableTopLevelField#isSet = true;
   }
diff --git a/pkg/front_end/testcases/late_lowering/initializer_rewrite.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/initializer_rewrite.dart.weak.transformed.expect
index 8784442..ad9e30d 100644
--- a/pkg/front_end/testcases/late_lowering/initializer_rewrite.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/initializer_rewrite.dart.weak.transformed.expect
@@ -23,7 +23,7 @@
     if(!self::Class::_#nonNullableStaticField#isSet) {
       final core::int #t1 = (let final core::int #t2 = self::Class::nonNullableStaticFieldReads in let final core::int #t3 = self::Class::nonNullableStaticFieldReads = #t2.{core::num::+}(1) in #t2).{core::num::==}(0) ?{core::int} self::Class::nonNullableStaticField.{core::num::+}(1) : 0;
       if(self::Class::_#nonNullableStaticField#isSet)
-        throw new _in::LateInitializationErrorImpl::•("Field 'nonNullableStaticField' has been assigned during initialization.");
+        throw new _in::LateError::fieldADI("nonNullableStaticField");
       self::Class::_#nonNullableStaticField = #t1;
       self::Class::_#nonNullableStaticField#isSet = true;
     }
@@ -33,7 +33,7 @@
     if(!self::Class::_#nullableStaticField#isSet) {
       final core::int? #t5 = (let final core::int #t6 = self::Class::nullableStaticFieldReads in let final core::int #t7 = self::Class::nullableStaticFieldReads = #t6.{core::num::+}(1) in #t6).{core::num::==}(0) ?{core::int} self::Class::nullableStaticField.{core::Object::hashCode} : 0;
       if(self::Class::_#nullableStaticField#isSet)
-        throw new _in::LateInitializationErrorImpl::•("Field 'nullableStaticField' has been assigned during initialization.");
+        throw new _in::LateError::fieldADI("nullableStaticField");
       self::Class::_#nullableStaticField = #t5;
       self::Class::_#nullableStaticField#isSet = true;
     }
@@ -43,7 +43,7 @@
     if(!this.{self::Class::_#Class#nonNullableInstanceField#isSet}) {
       final core::int #t8 = (let final core::int #t9 = this.{self::Class::nonNullableInstanceFieldReads} in let final core::int #t10 = this.{self::Class::nonNullableInstanceFieldReads} = #t9.{core::num::+}(1) in #t9).{core::num::==}(0) ?{core::int} this.{self::Class::nonNullableInstanceField}.{core::num::+}(1) : 0;
       if(this.{self::Class::_#Class#nonNullableInstanceField#isSet})
-        throw new _in::LateInitializationErrorImpl::•("Field 'nonNullableInstanceField' has been assigned during initialization.");
+        throw new _in::LateError::fieldADI("nonNullableInstanceField");
       this.{self::Class::_#Class#nonNullableInstanceField} = #t8;
       this.{self::Class::_#Class#nonNullableInstanceField#isSet} = true;
     }
@@ -53,7 +53,7 @@
     if(!this.{self::Class::_#Class#nullableInstanceField#isSet}) {
       final core::int? #t12 = (let final core::int #t13 = this.{self::Class::nullableInstanceFieldReads} in let final core::int #t14 = this.{self::Class::nullableInstanceFieldReads} = #t13.{core::num::+}(1) in #t13).{core::num::==}(0) ?{core::int} this.{self::Class::nullableInstanceField}.{core::Object::hashCode} : 0;
       if(this.{self::Class::_#Class#nullableInstanceField#isSet})
-        throw new _in::LateInitializationErrorImpl::•("Field 'nullableInstanceField' has been assigned during initialization.");
+        throw new _in::LateError::fieldADI("nullableInstanceField");
       this.{self::Class::_#Class#nullableInstanceField} = #t12;
       this.{self::Class::_#Class#nullableInstanceField#isSet} = true;
     }
@@ -70,7 +70,7 @@
   if(!self::_#nonNullableTopLevelField#isSet) {
     final core::int #t15 = (let final core::int #t16 = self::nonNullableTopLevelFieldReads in let final core::int #t17 = self::nonNullableTopLevelFieldReads = #t16.{core::num::+}(1) in #t16).{core::num::==}(0) ?{core::int} self::nonNullableTopLevelField.{core::num::+}(1) : 0;
     if(self::_#nonNullableTopLevelField#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Field 'nonNullableTopLevelField' has been assigned during initialization.");
+      throw new _in::LateError::fieldADI("nonNullableTopLevelField");
     self::_#nonNullableTopLevelField = #t15;
     self::_#nonNullableTopLevelField#isSet = true;
   }
@@ -80,7 +80,7 @@
   if(!self::_#nullableTopLevelField#isSet) {
     final core::int? #t19 = (let final core::int #t20 = self::nullableTopLevelFieldReads in let final core::int #t21 = self::nullableTopLevelFieldReads = #t20.{core::num::+}(1) in #t20).{core::num::==}(0) ?{core::int} self::nullableTopLevelField.{core::Object::hashCode} : 0;
     if(self::_#nullableTopLevelField#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Field 'nullableTopLevelField' has been assigned during initialization.");
+      throw new _in::LateError::fieldADI("nullableTopLevelField");
     self::_#nullableTopLevelField = #t19;
     self::_#nullableTopLevelField#isSet = true;
   }
diff --git a/pkg/front_end/testcases/late_lowering/initializer_rewrite_from_opt_out.dart.strong.expect b/pkg/front_end/testcases/late_lowering/initializer_rewrite_from_opt_out.dart.strong.expect
index cc020ed..df72516 100644
--- a/pkg/front_end/testcases/late_lowering/initializer_rewrite_from_opt_out.dart.strong.expect
+++ b/pkg/front_end/testcases/late_lowering/initializer_rewrite_from_opt_out.dart.strong.expect
@@ -21,24 +21,24 @@
     : super core::Object::•()
     ;
   static get nonNullableStaticField() → core::int
-    return let final core::int? #t1 = self::Class::_#nonNullableStaticField in #t1.==(null) ?{core::int} let final core::int #t2 = (let final core::int #t3 = self::Class::nonNullableStaticFieldReads in let final core::int #t4 = self::Class::nonNullableStaticFieldReads = #t3.{core::num::+}(1) in #t3).{core::num::==}(0) ?{core::int*} self::Class::nonNullableStaticField : ini::computeInitialValue() in self::Class::_#nonNullableStaticField.==(null) ?{core::int} self::Class::_#nonNullableStaticField = #t2 : throw new _in::LateInitializationErrorImpl::•("Field 'nonNullableStaticField' has been assigned during initialization.") : #t1{core::int};
+    return let final core::int? #t1 = self::Class::_#nonNullableStaticField in #t1.==(null) ?{core::int} let final core::int #t2 = (let final core::int #t3 = self::Class::nonNullableStaticFieldReads in let final core::int #t4 = self::Class::nonNullableStaticFieldReads = #t3.{core::num::+}(1) in #t3).{core::num::==}(0) ?{core::int*} self::Class::nonNullableStaticField : ini::computeInitialValue() in self::Class::_#nonNullableStaticField.==(null) ?{core::int} self::Class::_#nonNullableStaticField = #t2 : throw new _in::LateError::fieldADI("nonNullableStaticField") : #t1{core::int};
   static get nullableStaticField() → core::int? {
     if(!self::Class::_#nullableStaticField#isSet) {
       final core::int? #t5 = (let final core::int #t6 = self::Class::nullableStaticFieldReads in let final core::int #t7 = self::Class::nullableStaticFieldReads = #t6.{core::num::+}(1) in #t6).{core::num::==}(0) ?{core::int?} self::Class::nullableStaticField : ini::computeInitialValue();
       if(self::Class::_#nullableStaticField#isSet)
-        throw new _in::LateInitializationErrorImpl::•("Field 'nullableStaticField' has been assigned during initialization.");
+        throw new _in::LateError::fieldADI("nullableStaticField");
       self::Class::_#nullableStaticField = #t5;
       self::Class::_#nullableStaticField#isSet = true;
     }
     return self::Class::_#nullableStaticField;
   }
   get nonNullableInstanceField() → core::int
-    return let final core::int? #t8 = this.{self::Class::_#Class#nonNullableInstanceField} in #t8.==(null) ?{core::int} let final core::int #t9 = (let final core::int #t10 = this.{self::Class::nonNullableInstanceFieldReads} in let final core::int #t11 = this.{self::Class::nonNullableInstanceFieldReads} = #t10.{core::num::+}(1) in #t10).{core::num::==}(0) ?{core::int*} this.{self::Class::nonNullableInstanceField} : ini::computeInitialValue() in this.{self::Class::_#Class#nonNullableInstanceField}.==(null) ?{core::int} this.{self::Class::_#Class#nonNullableInstanceField} = #t9 : throw new _in::LateInitializationErrorImpl::•("Field 'nonNullableInstanceField' has been assigned during initialization.") : #t8{core::int};
+    return let final core::int? #t8 = this.{self::Class::_#Class#nonNullableInstanceField} in #t8.==(null) ?{core::int} let final core::int #t9 = (let final core::int #t10 = this.{self::Class::nonNullableInstanceFieldReads} in let final core::int #t11 = this.{self::Class::nonNullableInstanceFieldReads} = #t10.{core::num::+}(1) in #t10).{core::num::==}(0) ?{core::int*} this.{self::Class::nonNullableInstanceField} : ini::computeInitialValue() in this.{self::Class::_#Class#nonNullableInstanceField}.==(null) ?{core::int} this.{self::Class::_#Class#nonNullableInstanceField} = #t9 : throw new _in::LateError::fieldADI("nonNullableInstanceField") : #t8{core::int};
   get nullableInstanceField() → core::int? {
     if(!this.{self::Class::_#Class#nullableInstanceField#isSet}) {
       final core::int? #t12 = (let final core::int #t13 = this.{self::Class::nullableInstanceFieldReads} in let final core::int #t14 = this.{self::Class::nullableInstanceFieldReads} = #t13.{core::num::+}(1) in #t13).{core::num::==}(0) ?{core::int?} this.{self::Class::nullableInstanceField} : ini::computeInitialValue();
       if(this.{self::Class::_#Class#nullableInstanceField#isSet})
-        throw new _in::LateInitializationErrorImpl::•("Field 'nullableInstanceField' has been assigned during initialization.");
+        throw new _in::LateError::fieldADI("nullableInstanceField");
       this.{self::Class::_#Class#nullableInstanceField} = #t12;
       this.{self::Class::_#Class#nullableInstanceField#isSet} = true;
     }
@@ -51,12 +51,12 @@
 static field core::int? _#nullableTopLevelField = null;
 static field core::bool _#nullableTopLevelField#isSet = false;
 static get nonNullableTopLevelField() → core::int
-  return let final core::int? #t15 = self::_#nonNullableTopLevelField in #t15.==(null) ?{core::int} let final core::int #t16 = (let final core::int #t17 = self::nonNullableTopLevelFieldReads in let final core::int #t18 = self::nonNullableTopLevelFieldReads = #t17.{core::num::+}(1) in #t17).{core::num::==}(0) ?{core::int*} self::nonNullableTopLevelField : ini::computeInitialValue() in self::_#nonNullableTopLevelField.==(null) ?{core::int} self::_#nonNullableTopLevelField = #t16 : throw new _in::LateInitializationErrorImpl::•("Field 'nonNullableTopLevelField' has been assigned during initialization.") : #t15{core::int};
+  return let final core::int? #t15 = self::_#nonNullableTopLevelField in #t15.==(null) ?{core::int} let final core::int #t16 = (let final core::int #t17 = self::nonNullableTopLevelFieldReads in let final core::int #t18 = self::nonNullableTopLevelFieldReads = #t17.{core::num::+}(1) in #t17).{core::num::==}(0) ?{core::int*} self::nonNullableTopLevelField : ini::computeInitialValue() in self::_#nonNullableTopLevelField.==(null) ?{core::int} self::_#nonNullableTopLevelField = #t16 : throw new _in::LateError::fieldADI("nonNullableTopLevelField") : #t15{core::int};
 static get nullableTopLevelField() → core::int? {
   if(!self::_#nullableTopLevelField#isSet) {
     final core::int? #t19 = (let final core::int #t20 = self::nullableTopLevelFieldReads in let final core::int #t21 = self::nullableTopLevelFieldReads = #t20.{core::num::+}(1) in #t20).{core::num::==}(0) ?{core::int?} self::nullableTopLevelField : ini::computeInitialValue();
     if(self::_#nullableTopLevelField#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Field 'nullableTopLevelField' has been assigned during initialization.");
+      throw new _in::LateError::fieldADI("nullableTopLevelField");
     self::_#nullableTopLevelField = #t19;
     self::_#nullableTopLevelField#isSet = true;
   }
diff --git a/pkg/front_end/testcases/late_lowering/initializer_rewrite_from_opt_out.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/initializer_rewrite_from_opt_out.dart.strong.transformed.expect
index cc020ed..df72516 100644
--- a/pkg/front_end/testcases/late_lowering/initializer_rewrite_from_opt_out.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/initializer_rewrite_from_opt_out.dart.strong.transformed.expect
@@ -21,24 +21,24 @@
     : super core::Object::•()
     ;
   static get nonNullableStaticField() → core::int
-    return let final core::int? #t1 = self::Class::_#nonNullableStaticField in #t1.==(null) ?{core::int} let final core::int #t2 = (let final core::int #t3 = self::Class::nonNullableStaticFieldReads in let final core::int #t4 = self::Class::nonNullableStaticFieldReads = #t3.{core::num::+}(1) in #t3).{core::num::==}(0) ?{core::int*} self::Class::nonNullableStaticField : ini::computeInitialValue() in self::Class::_#nonNullableStaticField.==(null) ?{core::int} self::Class::_#nonNullableStaticField = #t2 : throw new _in::LateInitializationErrorImpl::•("Field 'nonNullableStaticField' has been assigned during initialization.") : #t1{core::int};
+    return let final core::int? #t1 = self::Class::_#nonNullableStaticField in #t1.==(null) ?{core::int} let final core::int #t2 = (let final core::int #t3 = self::Class::nonNullableStaticFieldReads in let final core::int #t4 = self::Class::nonNullableStaticFieldReads = #t3.{core::num::+}(1) in #t3).{core::num::==}(0) ?{core::int*} self::Class::nonNullableStaticField : ini::computeInitialValue() in self::Class::_#nonNullableStaticField.==(null) ?{core::int} self::Class::_#nonNullableStaticField = #t2 : throw new _in::LateError::fieldADI("nonNullableStaticField") : #t1{core::int};
   static get nullableStaticField() → core::int? {
     if(!self::Class::_#nullableStaticField#isSet) {
       final core::int? #t5 = (let final core::int #t6 = self::Class::nullableStaticFieldReads in let final core::int #t7 = self::Class::nullableStaticFieldReads = #t6.{core::num::+}(1) in #t6).{core::num::==}(0) ?{core::int?} self::Class::nullableStaticField : ini::computeInitialValue();
       if(self::Class::_#nullableStaticField#isSet)
-        throw new _in::LateInitializationErrorImpl::•("Field 'nullableStaticField' has been assigned during initialization.");
+        throw new _in::LateError::fieldADI("nullableStaticField");
       self::Class::_#nullableStaticField = #t5;
       self::Class::_#nullableStaticField#isSet = true;
     }
     return self::Class::_#nullableStaticField;
   }
   get nonNullableInstanceField() → core::int
-    return let final core::int? #t8 = this.{self::Class::_#Class#nonNullableInstanceField} in #t8.==(null) ?{core::int} let final core::int #t9 = (let final core::int #t10 = this.{self::Class::nonNullableInstanceFieldReads} in let final core::int #t11 = this.{self::Class::nonNullableInstanceFieldReads} = #t10.{core::num::+}(1) in #t10).{core::num::==}(0) ?{core::int*} this.{self::Class::nonNullableInstanceField} : ini::computeInitialValue() in this.{self::Class::_#Class#nonNullableInstanceField}.==(null) ?{core::int} this.{self::Class::_#Class#nonNullableInstanceField} = #t9 : throw new _in::LateInitializationErrorImpl::•("Field 'nonNullableInstanceField' has been assigned during initialization.") : #t8{core::int};
+    return let final core::int? #t8 = this.{self::Class::_#Class#nonNullableInstanceField} in #t8.==(null) ?{core::int} let final core::int #t9 = (let final core::int #t10 = this.{self::Class::nonNullableInstanceFieldReads} in let final core::int #t11 = this.{self::Class::nonNullableInstanceFieldReads} = #t10.{core::num::+}(1) in #t10).{core::num::==}(0) ?{core::int*} this.{self::Class::nonNullableInstanceField} : ini::computeInitialValue() in this.{self::Class::_#Class#nonNullableInstanceField}.==(null) ?{core::int} this.{self::Class::_#Class#nonNullableInstanceField} = #t9 : throw new _in::LateError::fieldADI("nonNullableInstanceField") : #t8{core::int};
   get nullableInstanceField() → core::int? {
     if(!this.{self::Class::_#Class#nullableInstanceField#isSet}) {
       final core::int? #t12 = (let final core::int #t13 = this.{self::Class::nullableInstanceFieldReads} in let final core::int #t14 = this.{self::Class::nullableInstanceFieldReads} = #t13.{core::num::+}(1) in #t13).{core::num::==}(0) ?{core::int?} this.{self::Class::nullableInstanceField} : ini::computeInitialValue();
       if(this.{self::Class::_#Class#nullableInstanceField#isSet})
-        throw new _in::LateInitializationErrorImpl::•("Field 'nullableInstanceField' has been assigned during initialization.");
+        throw new _in::LateError::fieldADI("nullableInstanceField");
       this.{self::Class::_#Class#nullableInstanceField} = #t12;
       this.{self::Class::_#Class#nullableInstanceField#isSet} = true;
     }
@@ -51,12 +51,12 @@
 static field core::int? _#nullableTopLevelField = null;
 static field core::bool _#nullableTopLevelField#isSet = false;
 static get nonNullableTopLevelField() → core::int
-  return let final core::int? #t15 = self::_#nonNullableTopLevelField in #t15.==(null) ?{core::int} let final core::int #t16 = (let final core::int #t17 = self::nonNullableTopLevelFieldReads in let final core::int #t18 = self::nonNullableTopLevelFieldReads = #t17.{core::num::+}(1) in #t17).{core::num::==}(0) ?{core::int*} self::nonNullableTopLevelField : ini::computeInitialValue() in self::_#nonNullableTopLevelField.==(null) ?{core::int} self::_#nonNullableTopLevelField = #t16 : throw new _in::LateInitializationErrorImpl::•("Field 'nonNullableTopLevelField' has been assigned during initialization.") : #t15{core::int};
+  return let final core::int? #t15 = self::_#nonNullableTopLevelField in #t15.==(null) ?{core::int} let final core::int #t16 = (let final core::int #t17 = self::nonNullableTopLevelFieldReads in let final core::int #t18 = self::nonNullableTopLevelFieldReads = #t17.{core::num::+}(1) in #t17).{core::num::==}(0) ?{core::int*} self::nonNullableTopLevelField : ini::computeInitialValue() in self::_#nonNullableTopLevelField.==(null) ?{core::int} self::_#nonNullableTopLevelField = #t16 : throw new _in::LateError::fieldADI("nonNullableTopLevelField") : #t15{core::int};
 static get nullableTopLevelField() → core::int? {
   if(!self::_#nullableTopLevelField#isSet) {
     final core::int? #t19 = (let final core::int #t20 = self::nullableTopLevelFieldReads in let final core::int #t21 = self::nullableTopLevelFieldReads = #t20.{core::num::+}(1) in #t20).{core::num::==}(0) ?{core::int?} self::nullableTopLevelField : ini::computeInitialValue();
     if(self::_#nullableTopLevelField#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Field 'nullableTopLevelField' has been assigned during initialization.");
+      throw new _in::LateError::fieldADI("nullableTopLevelField");
     self::_#nullableTopLevelField = #t19;
     self::_#nullableTopLevelField#isSet = true;
   }
diff --git a/pkg/front_end/testcases/late_lowering/initializer_rewrite_from_opt_out.dart.weak.expect b/pkg/front_end/testcases/late_lowering/initializer_rewrite_from_opt_out.dart.weak.expect
index d58daaa..fc0e98b 100644
--- a/pkg/front_end/testcases/late_lowering/initializer_rewrite_from_opt_out.dart.weak.expect
+++ b/pkg/front_end/testcases/late_lowering/initializer_rewrite_from_opt_out.dart.weak.expect
@@ -26,7 +26,7 @@
     if(!self::Class::_#nonNullableStaticField#isSet) {
       final core::int #t1 = (let final core::int #t2 = self::Class::nonNullableStaticFieldReads in let final core::int #t3 = self::Class::nonNullableStaticFieldReads = #t2.{core::num::+}(1) in #t2).{core::num::==}(0) ?{core::int*} self::Class::nonNullableStaticField : ini::computeInitialValue();
       if(self::Class::_#nonNullableStaticField#isSet)
-        throw new _in::LateInitializationErrorImpl::•("Field 'nonNullableStaticField' has been assigned during initialization.");
+        throw new _in::LateError::fieldADI("nonNullableStaticField");
       self::Class::_#nonNullableStaticField = #t1;
       self::Class::_#nonNullableStaticField#isSet = true;
     }
@@ -36,7 +36,7 @@
     if(!self::Class::_#nullableStaticField#isSet) {
       final core::int? #t5 = (let final core::int #t6 = self::Class::nullableStaticFieldReads in let final core::int #t7 = self::Class::nullableStaticFieldReads = #t6.{core::num::+}(1) in #t6).{core::num::==}(0) ?{core::int?} self::Class::nullableStaticField : ini::computeInitialValue();
       if(self::Class::_#nullableStaticField#isSet)
-        throw new _in::LateInitializationErrorImpl::•("Field 'nullableStaticField' has been assigned during initialization.");
+        throw new _in::LateError::fieldADI("nullableStaticField");
       self::Class::_#nullableStaticField = #t5;
       self::Class::_#nullableStaticField#isSet = true;
     }
@@ -46,7 +46,7 @@
     if(!this.{self::Class::_#Class#nonNullableInstanceField#isSet}) {
       final core::int #t8 = (let final core::int #t9 = this.{self::Class::nonNullableInstanceFieldReads} in let final core::int #t10 = this.{self::Class::nonNullableInstanceFieldReads} = #t9.{core::num::+}(1) in #t9).{core::num::==}(0) ?{core::int*} this.{self::Class::nonNullableInstanceField} : ini::computeInitialValue();
       if(this.{self::Class::_#Class#nonNullableInstanceField#isSet})
-        throw new _in::LateInitializationErrorImpl::•("Field 'nonNullableInstanceField' has been assigned during initialization.");
+        throw new _in::LateError::fieldADI("nonNullableInstanceField");
       this.{self::Class::_#Class#nonNullableInstanceField} = #t8;
       this.{self::Class::_#Class#nonNullableInstanceField#isSet} = true;
     }
@@ -56,7 +56,7 @@
     if(!this.{self::Class::_#Class#nullableInstanceField#isSet}) {
       final core::int? #t12 = (let final core::int #t13 = this.{self::Class::nullableInstanceFieldReads} in let final core::int #t14 = this.{self::Class::nullableInstanceFieldReads} = #t13.{core::num::+}(1) in #t13).{core::num::==}(0) ?{core::int?} this.{self::Class::nullableInstanceField} : ini::computeInitialValue();
       if(this.{self::Class::_#Class#nullableInstanceField#isSet})
-        throw new _in::LateInitializationErrorImpl::•("Field 'nullableInstanceField' has been assigned during initialization.");
+        throw new _in::LateError::fieldADI("nullableInstanceField");
       this.{self::Class::_#Class#nullableInstanceField} = #t12;
       this.{self::Class::_#Class#nullableInstanceField#isSet} = true;
     }
@@ -73,7 +73,7 @@
   if(!self::_#nonNullableTopLevelField#isSet) {
     final core::int #t15 = (let final core::int #t16 = self::nonNullableTopLevelFieldReads in let final core::int #t17 = self::nonNullableTopLevelFieldReads = #t16.{core::num::+}(1) in #t16).{core::num::==}(0) ?{core::int*} self::nonNullableTopLevelField : ini::computeInitialValue();
     if(self::_#nonNullableTopLevelField#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Field 'nonNullableTopLevelField' has been assigned during initialization.");
+      throw new _in::LateError::fieldADI("nonNullableTopLevelField");
     self::_#nonNullableTopLevelField = #t15;
     self::_#nonNullableTopLevelField#isSet = true;
   }
@@ -83,7 +83,7 @@
   if(!self::_#nullableTopLevelField#isSet) {
     final core::int? #t19 = (let final core::int #t20 = self::nullableTopLevelFieldReads in let final core::int #t21 = self::nullableTopLevelFieldReads = #t20.{core::num::+}(1) in #t20).{core::num::==}(0) ?{core::int?} self::nullableTopLevelField : ini::computeInitialValue();
     if(self::_#nullableTopLevelField#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Field 'nullableTopLevelField' has been assigned during initialization.");
+      throw new _in::LateError::fieldADI("nullableTopLevelField");
     self::_#nullableTopLevelField = #t19;
     self::_#nullableTopLevelField#isSet = true;
   }
diff --git a/pkg/front_end/testcases/late_lowering/initializer_rewrite_from_opt_out.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/initializer_rewrite_from_opt_out.dart.weak.transformed.expect
index d58daaa..fc0e98b 100644
--- a/pkg/front_end/testcases/late_lowering/initializer_rewrite_from_opt_out.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/initializer_rewrite_from_opt_out.dart.weak.transformed.expect
@@ -26,7 +26,7 @@
     if(!self::Class::_#nonNullableStaticField#isSet) {
       final core::int #t1 = (let final core::int #t2 = self::Class::nonNullableStaticFieldReads in let final core::int #t3 = self::Class::nonNullableStaticFieldReads = #t2.{core::num::+}(1) in #t2).{core::num::==}(0) ?{core::int*} self::Class::nonNullableStaticField : ini::computeInitialValue();
       if(self::Class::_#nonNullableStaticField#isSet)
-        throw new _in::LateInitializationErrorImpl::•("Field 'nonNullableStaticField' has been assigned during initialization.");
+        throw new _in::LateError::fieldADI("nonNullableStaticField");
       self::Class::_#nonNullableStaticField = #t1;
       self::Class::_#nonNullableStaticField#isSet = true;
     }
@@ -36,7 +36,7 @@
     if(!self::Class::_#nullableStaticField#isSet) {
       final core::int? #t5 = (let final core::int #t6 = self::Class::nullableStaticFieldReads in let final core::int #t7 = self::Class::nullableStaticFieldReads = #t6.{core::num::+}(1) in #t6).{core::num::==}(0) ?{core::int?} self::Class::nullableStaticField : ini::computeInitialValue();
       if(self::Class::_#nullableStaticField#isSet)
-        throw new _in::LateInitializationErrorImpl::•("Field 'nullableStaticField' has been assigned during initialization.");
+        throw new _in::LateError::fieldADI("nullableStaticField");
       self::Class::_#nullableStaticField = #t5;
       self::Class::_#nullableStaticField#isSet = true;
     }
@@ -46,7 +46,7 @@
     if(!this.{self::Class::_#Class#nonNullableInstanceField#isSet}) {
       final core::int #t8 = (let final core::int #t9 = this.{self::Class::nonNullableInstanceFieldReads} in let final core::int #t10 = this.{self::Class::nonNullableInstanceFieldReads} = #t9.{core::num::+}(1) in #t9).{core::num::==}(0) ?{core::int*} this.{self::Class::nonNullableInstanceField} : ini::computeInitialValue();
       if(this.{self::Class::_#Class#nonNullableInstanceField#isSet})
-        throw new _in::LateInitializationErrorImpl::•("Field 'nonNullableInstanceField' has been assigned during initialization.");
+        throw new _in::LateError::fieldADI("nonNullableInstanceField");
       this.{self::Class::_#Class#nonNullableInstanceField} = #t8;
       this.{self::Class::_#Class#nonNullableInstanceField#isSet} = true;
     }
@@ -56,7 +56,7 @@
     if(!this.{self::Class::_#Class#nullableInstanceField#isSet}) {
       final core::int? #t12 = (let final core::int #t13 = this.{self::Class::nullableInstanceFieldReads} in let final core::int #t14 = this.{self::Class::nullableInstanceFieldReads} = #t13.{core::num::+}(1) in #t13).{core::num::==}(0) ?{core::int?} this.{self::Class::nullableInstanceField} : ini::computeInitialValue();
       if(this.{self::Class::_#Class#nullableInstanceField#isSet})
-        throw new _in::LateInitializationErrorImpl::•("Field 'nullableInstanceField' has been assigned during initialization.");
+        throw new _in::LateError::fieldADI("nullableInstanceField");
       this.{self::Class::_#Class#nullableInstanceField} = #t12;
       this.{self::Class::_#Class#nullableInstanceField#isSet} = true;
     }
@@ -73,7 +73,7 @@
   if(!self::_#nonNullableTopLevelField#isSet) {
     final core::int #t15 = (let final core::int #t16 = self::nonNullableTopLevelFieldReads in let final core::int #t17 = self::nonNullableTopLevelFieldReads = #t16.{core::num::+}(1) in #t16).{core::num::==}(0) ?{core::int*} self::nonNullableTopLevelField : ini::computeInitialValue();
     if(self::_#nonNullableTopLevelField#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Field 'nonNullableTopLevelField' has been assigned during initialization.");
+      throw new _in::LateError::fieldADI("nonNullableTopLevelField");
     self::_#nonNullableTopLevelField = #t15;
     self::_#nonNullableTopLevelField#isSet = true;
   }
@@ -83,7 +83,7 @@
   if(!self::_#nullableTopLevelField#isSet) {
     final core::int? #t19 = (let final core::int #t20 = self::nullableTopLevelFieldReads in let final core::int #t21 = self::nullableTopLevelFieldReads = #t20.{core::num::+}(1) in #t20).{core::num::==}(0) ?{core::int?} self::nullableTopLevelField : ini::computeInitialValue();
     if(self::_#nullableTopLevelField#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Field 'nullableTopLevelField' has been assigned during initialization.");
+      throw new _in::LateError::fieldADI("nullableTopLevelField");
     self::_#nullableTopLevelField = #t19;
     self::_#nullableTopLevelField#isSet = true;
   }
diff --git a/pkg/front_end/testcases/late_lowering/injected_late_field_checks/main.dart.strong.expect b/pkg/front_end/testcases/late_lowering/injected_late_field_checks/main.dart.strong.expect
index ea024bb..3ed20f7 100644
--- a/pkg/front_end/testcases/late_lowering/injected_late_field_checks/main.dart.strong.expect
+++ b/pkg/front_end/testcases/late_lowering/injected_late_field_checks/main.dart.strong.expect
@@ -22,7 +22,7 @@
     : self2::Class::_#Class#foo = foo, super core::Object::•()
     ;
   get /* from org-dartlang-testcase:///patch_lib.dart */ foo() → core::int
-    return let final core::int? #t1 = this.{self2::Class::_#Class#foo} in #t1.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'foo' has not been initialized.") : #t1{core::int};
+    return let final core::int? #t1 = this.{self2::Class::_#Class#foo} in #t1.==(null) ?{core::int} throw new _in::LateError::fieldNI("foo") : #t1{core::int};
   set /* from org-dartlang-testcase:///patch_lib.dart */ foo(core::int #t2) → void
     this.{self2::Class::_#Class#foo} = #t2;
 }
diff --git a/pkg/front_end/testcases/late_lowering/injected_late_field_checks/main.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/injected_late_field_checks/main.dart.strong.transformed.expect
index ea024bb..3ed20f7 100644
--- a/pkg/front_end/testcases/late_lowering/injected_late_field_checks/main.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/injected_late_field_checks/main.dart.strong.transformed.expect
@@ -22,7 +22,7 @@
     : self2::Class::_#Class#foo = foo, super core::Object::•()
     ;
   get /* from org-dartlang-testcase:///patch_lib.dart */ foo() → core::int
-    return let final core::int? #t1 = this.{self2::Class::_#Class#foo} in #t1.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'foo' has not been initialized.") : #t1{core::int};
+    return let final core::int? #t1 = this.{self2::Class::_#Class#foo} in #t1.==(null) ?{core::int} throw new _in::LateError::fieldNI("foo") : #t1{core::int};
   set /* from org-dartlang-testcase:///patch_lib.dart */ foo(core::int #t2) → void
     this.{self2::Class::_#Class#foo} = #t2;
 }
diff --git a/pkg/front_end/testcases/late_lowering/injected_late_field_checks/main.dart.weak.expect b/pkg/front_end/testcases/late_lowering/injected_late_field_checks/main.dart.weak.expect
index e2b0019..7458102 100644
--- a/pkg/front_end/testcases/late_lowering/injected_late_field_checks/main.dart.weak.expect
+++ b/pkg/front_end/testcases/late_lowering/injected_late_field_checks/main.dart.weak.expect
@@ -23,7 +23,7 @@
     : self2::Class::_#Class#foo#isSet = true, self2::Class::_#Class#foo = foo, super core::Object::•()
     ;
   get /* from org-dartlang-testcase:///patch_lib.dart */ foo() → core::int
-    return this.{self2::Class::_#Class#foo#isSet} ?{core::int} let final core::int? #t1 = this.{self2::Class::_#Class#foo} in #t1{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'foo' has not been initialized.");
+    return this.{self2::Class::_#Class#foo#isSet} ?{core::int} let final core::int? #t1 = this.{self2::Class::_#Class#foo} in #t1{core::int} : throw new _in::LateError::fieldNI("foo");
   set /* from org-dartlang-testcase:///patch_lib.dart */ foo(core::int #t2) → void {
     this.{self2::Class::_#Class#foo#isSet} = true;
     this.{self2::Class::_#Class#foo} = #t2;
diff --git a/pkg/front_end/testcases/late_lowering/injected_late_field_checks/main.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/injected_late_field_checks/main.dart.weak.transformed.expect
index e2b0019..7458102 100644
--- a/pkg/front_end/testcases/late_lowering/injected_late_field_checks/main.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/injected_late_field_checks/main.dart.weak.transformed.expect
@@ -23,7 +23,7 @@
     : self2::Class::_#Class#foo#isSet = true, self2::Class::_#Class#foo = foo, super core::Object::•()
     ;
   get /* from org-dartlang-testcase:///patch_lib.dart */ foo() → core::int
-    return this.{self2::Class::_#Class#foo#isSet} ?{core::int} let final core::int? #t1 = this.{self2::Class::_#Class#foo} in #t1{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'foo' has not been initialized.");
+    return this.{self2::Class::_#Class#foo#isSet} ?{core::int} let final core::int? #t1 = this.{self2::Class::_#Class#foo} in #t1{core::int} : throw new _in::LateError::fieldNI("foo");
   set /* from org-dartlang-testcase:///patch_lib.dart */ foo(core::int #t2) → void {
     this.{self2::Class::_#Class#foo#isSet} = true;
     this.{self2::Class::_#Class#foo} = #t2;
diff --git a/pkg/front_end/testcases/late_lowering/instance_field_without_initializer.dart.strong.expect b/pkg/front_end/testcases/late_lowering/instance_field_without_initializer.dart.strong.expect
index 2a32553..7fe4159 100644
--- a/pkg/front_end/testcases/late_lowering/instance_field_without_initializer.dart.strong.expect
+++ b/pkg/front_end/testcases/late_lowering/instance_field_without_initializer.dart.strong.expect
@@ -18,7 +18,7 @@
     : self::Class::_#Class#field = field, super core::Object::•()
     ;
   get field() → core::int
-    return let final core::int? #t1 = this.{self::Class::_#Class#field} in #t1.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'field' has not been initialized.") : #t1{core::int};
+    return let final core::int? #t1 = this.{self::Class::_#Class#field} in #t1.==(null) ?{core::int} throw new _in::LateError::fieldNI("field") : #t1{core::int};
   set field(core::int #t2) → void
     this.{self::Class::_#Class#field} = #t2;
 }
diff --git a/pkg/front_end/testcases/late_lowering/instance_field_without_initializer.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/instance_field_without_initializer.dart.strong.transformed.expect
index 2a32553..7fe4159 100644
--- a/pkg/front_end/testcases/late_lowering/instance_field_without_initializer.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/instance_field_without_initializer.dart.strong.transformed.expect
@@ -18,7 +18,7 @@
     : self::Class::_#Class#field = field, super core::Object::•()
     ;
   get field() → core::int
-    return let final core::int? #t1 = this.{self::Class::_#Class#field} in #t1.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'field' has not been initialized.") : #t1{core::int};
+    return let final core::int? #t1 = this.{self::Class::_#Class#field} in #t1.==(null) ?{core::int} throw new _in::LateError::fieldNI("field") : #t1{core::int};
   set field(core::int #t2) → void
     this.{self::Class::_#Class#field} = #t2;
 }
diff --git a/pkg/front_end/testcases/late_lowering/instance_field_without_initializer.dart.weak.expect b/pkg/front_end/testcases/late_lowering/instance_field_without_initializer.dart.weak.expect
index 1fa0843..1710036 100644
--- a/pkg/front_end/testcases/late_lowering/instance_field_without_initializer.dart.weak.expect
+++ b/pkg/front_end/testcases/late_lowering/instance_field_without_initializer.dart.weak.expect
@@ -19,7 +19,7 @@
     : self::Class::_#Class#field#isSet = true, self::Class::_#Class#field = field, super core::Object::•()
     ;
   get field() → core::int
-    return this.{self::Class::_#Class#field#isSet} ?{core::int} let final core::int? #t1 = this.{self::Class::_#Class#field} in #t1{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'field' has not been initialized.");
+    return this.{self::Class::_#Class#field#isSet} ?{core::int} let final core::int? #t1 = this.{self::Class::_#Class#field} in #t1{core::int} : throw new _in::LateError::fieldNI("field");
   set field(core::int #t2) → void {
     this.{self::Class::_#Class#field#isSet} = true;
     this.{self::Class::_#Class#field} = #t2;
diff --git a/pkg/front_end/testcases/late_lowering/instance_field_without_initializer.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/instance_field_without_initializer.dart.weak.transformed.expect
index 1fa0843..1710036 100644
--- a/pkg/front_end/testcases/late_lowering/instance_field_without_initializer.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/instance_field_without_initializer.dart.weak.transformed.expect
@@ -19,7 +19,7 @@
     : self::Class::_#Class#field#isSet = true, self::Class::_#Class#field = field, super core::Object::•()
     ;
   get field() → core::int
-    return this.{self::Class::_#Class#field#isSet} ?{core::int} let final core::int? #t1 = this.{self::Class::_#Class#field} in #t1{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'field' has not been initialized.");
+    return this.{self::Class::_#Class#field#isSet} ?{core::int} let final core::int? #t1 = this.{self::Class::_#Class#field} in #t1{core::int} : throw new _in::LateError::fieldNI("field");
   set field(core::int #t2) → void {
     this.{self::Class::_#Class#field#isSet} = true;
     this.{self::Class::_#Class#field} = #t2;
diff --git a/pkg/front_end/testcases/late_lowering/instance_final_field_without_initializer.dart.strong.expect b/pkg/front_end/testcases/late_lowering/instance_final_field_without_initializer.dart.strong.expect
index cdd56ea..d212088 100644
--- a/pkg/front_end/testcases/late_lowering/instance_final_field_without_initializer.dart.strong.expect
+++ b/pkg/front_end/testcases/late_lowering/instance_final_field_without_initializer.dart.strong.expect
@@ -18,12 +18,12 @@
     : self::Class::_#Class#field = field, super core::Object::•()
     ;
   get field() → core::int
-    return let final core::int? #t1 = this.{self::Class::_#Class#field} in #t1.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'field' has not been initialized.") : #t1{core::int};
+    return let final core::int? #t1 = this.{self::Class::_#Class#field} in #t1.==(null) ?{core::int} throw new _in::LateError::fieldNI("field") : #t1{core::int};
   set field(core::int #t2) → void
     if(this.{self::Class::_#Class#field}.==(null))
       this.{self::Class::_#Class#field} = #t2;
     else
-      throw new _in::LateInitializationErrorImpl::•("Field 'field' has already been initialized.");
+      throw new _in::LateError::fieldAI("field");
 }
 class Subclass extends self::Class {
   constructor constructor1() → self::Subclass
diff --git a/pkg/front_end/testcases/late_lowering/instance_final_field_without_initializer.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/instance_final_field_without_initializer.dart.strong.transformed.expect
index cdd56ea..d212088 100644
--- a/pkg/front_end/testcases/late_lowering/instance_final_field_without_initializer.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/instance_final_field_without_initializer.dart.strong.transformed.expect
@@ -18,12 +18,12 @@
     : self::Class::_#Class#field = field, super core::Object::•()
     ;
   get field() → core::int
-    return let final core::int? #t1 = this.{self::Class::_#Class#field} in #t1.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'field' has not been initialized.") : #t1{core::int};
+    return let final core::int? #t1 = this.{self::Class::_#Class#field} in #t1.==(null) ?{core::int} throw new _in::LateError::fieldNI("field") : #t1{core::int};
   set field(core::int #t2) → void
     if(this.{self::Class::_#Class#field}.==(null))
       this.{self::Class::_#Class#field} = #t2;
     else
-      throw new _in::LateInitializationErrorImpl::•("Field 'field' has already been initialized.");
+      throw new _in::LateError::fieldAI("field");
 }
 class Subclass extends self::Class {
   constructor constructor1() → self::Subclass
diff --git a/pkg/front_end/testcases/late_lowering/instance_final_field_without_initializer.dart.weak.expect b/pkg/front_end/testcases/late_lowering/instance_final_field_without_initializer.dart.weak.expect
index 180d337..effd7a1 100644
--- a/pkg/front_end/testcases/late_lowering/instance_final_field_without_initializer.dart.weak.expect
+++ b/pkg/front_end/testcases/late_lowering/instance_final_field_without_initializer.dart.weak.expect
@@ -19,10 +19,10 @@
     : self::Class::_#Class#field#isSet = true, self::Class::_#Class#field = field, super core::Object::•()
     ;
   get field() → core::int
-    return this.{self::Class::_#Class#field#isSet} ?{core::int} let final core::int? #t1 = this.{self::Class::_#Class#field} in #t1{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'field' has not been initialized.");
+    return this.{self::Class::_#Class#field#isSet} ?{core::int} let final core::int? #t1 = this.{self::Class::_#Class#field} in #t1{core::int} : throw new _in::LateError::fieldNI("field");
   set field(core::int #t2) → void
     if(this.{self::Class::_#Class#field#isSet})
-      throw new _in::LateInitializationErrorImpl::•("Field 'field' has already been initialized.");
+      throw new _in::LateError::fieldAI("field");
     else {
       this.{self::Class::_#Class#field#isSet} = true;
       this.{self::Class::_#Class#field} = #t2;
diff --git a/pkg/front_end/testcases/late_lowering/instance_final_field_without_initializer.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/instance_final_field_without_initializer.dart.weak.transformed.expect
index 180d337..effd7a1 100644
--- a/pkg/front_end/testcases/late_lowering/instance_final_field_without_initializer.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/instance_final_field_without_initializer.dart.weak.transformed.expect
@@ -19,10 +19,10 @@
     : self::Class::_#Class#field#isSet = true, self::Class::_#Class#field = field, super core::Object::•()
     ;
   get field() → core::int
-    return this.{self::Class::_#Class#field#isSet} ?{core::int} let final core::int? #t1 = this.{self::Class::_#Class#field} in #t1{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'field' has not been initialized.");
+    return this.{self::Class::_#Class#field#isSet} ?{core::int} let final core::int? #t1 = this.{self::Class::_#Class#field} in #t1{core::int} : throw new _in::LateError::fieldNI("field");
   set field(core::int #t2) → void
     if(this.{self::Class::_#Class#field#isSet})
-      throw new _in::LateInitializationErrorImpl::•("Field 'field' has already been initialized.");
+      throw new _in::LateError::fieldAI("field");
     else {
       this.{self::Class::_#Class#field#isSet} = true;
       this.{self::Class::_#Class#field} = #t2;
diff --git a/pkg/front_end/testcases/late_lowering/instance_nullable_field_without_initializer.dart.strong.expect b/pkg/front_end/testcases/late_lowering/instance_nullable_field_without_initializer.dart.strong.expect
index 3bea7e0..76deb58 100644
--- a/pkg/front_end/testcases/late_lowering/instance_nullable_field_without_initializer.dart.strong.expect
+++ b/pkg/front_end/testcases/late_lowering/instance_nullable_field_without_initializer.dart.strong.expect
@@ -19,7 +19,7 @@
     : self::Class::_#Class#field#isSet = true, self::Class::_#Class#field = field, super core::Object::•()
     ;
   get field() → core::int?
-    return this.{self::Class::_#Class#field#isSet} ?{core::int?} this.{self::Class::_#Class#field} : throw new _in::LateInitializationErrorImpl::•("Field 'field' has not been initialized.");
+    return this.{self::Class::_#Class#field#isSet} ?{core::int?} this.{self::Class::_#Class#field} : throw new _in::LateError::fieldNI("field");
   set field(core::int? #t1) → void {
     this.{self::Class::_#Class#field#isSet} = true;
     this.{self::Class::_#Class#field} = #t1;
diff --git a/pkg/front_end/testcases/late_lowering/instance_nullable_field_without_initializer.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/instance_nullable_field_without_initializer.dart.strong.transformed.expect
index 3bea7e0..76deb58 100644
--- a/pkg/front_end/testcases/late_lowering/instance_nullable_field_without_initializer.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/instance_nullable_field_without_initializer.dart.strong.transformed.expect
@@ -19,7 +19,7 @@
     : self::Class::_#Class#field#isSet = true, self::Class::_#Class#field = field, super core::Object::•()
     ;
   get field() → core::int?
-    return this.{self::Class::_#Class#field#isSet} ?{core::int?} this.{self::Class::_#Class#field} : throw new _in::LateInitializationErrorImpl::•("Field 'field' has not been initialized.");
+    return this.{self::Class::_#Class#field#isSet} ?{core::int?} this.{self::Class::_#Class#field} : throw new _in::LateError::fieldNI("field");
   set field(core::int? #t1) → void {
     this.{self::Class::_#Class#field#isSet} = true;
     this.{self::Class::_#Class#field} = #t1;
diff --git a/pkg/front_end/testcases/late_lowering/instance_nullable_field_without_initializer.dart.weak.expect b/pkg/front_end/testcases/late_lowering/instance_nullable_field_without_initializer.dart.weak.expect
index 3bea7e0..76deb58 100644
--- a/pkg/front_end/testcases/late_lowering/instance_nullable_field_without_initializer.dart.weak.expect
+++ b/pkg/front_end/testcases/late_lowering/instance_nullable_field_without_initializer.dart.weak.expect
@@ -19,7 +19,7 @@
     : self::Class::_#Class#field#isSet = true, self::Class::_#Class#field = field, super core::Object::•()
     ;
   get field() → core::int?
-    return this.{self::Class::_#Class#field#isSet} ?{core::int?} this.{self::Class::_#Class#field} : throw new _in::LateInitializationErrorImpl::•("Field 'field' has not been initialized.");
+    return this.{self::Class::_#Class#field#isSet} ?{core::int?} this.{self::Class::_#Class#field} : throw new _in::LateError::fieldNI("field");
   set field(core::int? #t1) → void {
     this.{self::Class::_#Class#field#isSet} = true;
     this.{self::Class::_#Class#field} = #t1;
diff --git a/pkg/front_end/testcases/late_lowering/instance_nullable_field_without_initializer.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/instance_nullable_field_without_initializer.dart.weak.transformed.expect
index 3bea7e0..76deb58 100644
--- a/pkg/front_end/testcases/late_lowering/instance_nullable_field_without_initializer.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/instance_nullable_field_without_initializer.dart.weak.transformed.expect
@@ -19,7 +19,7 @@
     : self::Class::_#Class#field#isSet = true, self::Class::_#Class#field = field, super core::Object::•()
     ;
   get field() → core::int?
-    return this.{self::Class::_#Class#field#isSet} ?{core::int?} this.{self::Class::_#Class#field} : throw new _in::LateInitializationErrorImpl::•("Field 'field' has not been initialized.");
+    return this.{self::Class::_#Class#field#isSet} ?{core::int?} this.{self::Class::_#Class#field} : throw new _in::LateError::fieldNI("field");
   set field(core::int? #t1) → void {
     this.{self::Class::_#Class#field#isSet} = true;
     this.{self::Class::_#Class#field} = #t1;
diff --git a/pkg/front_end/testcases/late_lowering/instance_nullable_final_field_without_initializer.dart.strong.expect b/pkg/front_end/testcases/late_lowering/instance_nullable_final_field_without_initializer.dart.strong.expect
index 26f06e0..310cc22 100644
--- a/pkg/front_end/testcases/late_lowering/instance_nullable_final_field_without_initializer.dart.strong.expect
+++ b/pkg/front_end/testcases/late_lowering/instance_nullable_final_field_without_initializer.dart.strong.expect
@@ -19,10 +19,10 @@
     : self::Class::_#Class#field#isSet = true, self::Class::_#Class#field = field, super core::Object::•()
     ;
   get field() → core::int?
-    return this.{self::Class::_#Class#field#isSet} ?{core::int?} this.{self::Class::_#Class#field} : throw new _in::LateInitializationErrorImpl::•("Field 'field' has not been initialized.");
+    return this.{self::Class::_#Class#field#isSet} ?{core::int?} this.{self::Class::_#Class#field} : throw new _in::LateError::fieldNI("field");
   set field(core::int? #t1) → void
     if(this.{self::Class::_#Class#field#isSet})
-      throw new _in::LateInitializationErrorImpl::•("Field 'field' has already been initialized.");
+      throw new _in::LateError::fieldAI("field");
     else {
       this.{self::Class::_#Class#field#isSet} = true;
       this.{self::Class::_#Class#field} = #t1;
diff --git a/pkg/front_end/testcases/late_lowering/instance_nullable_final_field_without_initializer.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/instance_nullable_final_field_without_initializer.dart.strong.transformed.expect
index 26f06e0..310cc22 100644
--- a/pkg/front_end/testcases/late_lowering/instance_nullable_final_field_without_initializer.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/instance_nullable_final_field_without_initializer.dart.strong.transformed.expect
@@ -19,10 +19,10 @@
     : self::Class::_#Class#field#isSet = true, self::Class::_#Class#field = field, super core::Object::•()
     ;
   get field() → core::int?
-    return this.{self::Class::_#Class#field#isSet} ?{core::int?} this.{self::Class::_#Class#field} : throw new _in::LateInitializationErrorImpl::•("Field 'field' has not been initialized.");
+    return this.{self::Class::_#Class#field#isSet} ?{core::int?} this.{self::Class::_#Class#field} : throw new _in::LateError::fieldNI("field");
   set field(core::int? #t1) → void
     if(this.{self::Class::_#Class#field#isSet})
-      throw new _in::LateInitializationErrorImpl::•("Field 'field' has already been initialized.");
+      throw new _in::LateError::fieldAI("field");
     else {
       this.{self::Class::_#Class#field#isSet} = true;
       this.{self::Class::_#Class#field} = #t1;
diff --git a/pkg/front_end/testcases/late_lowering/instance_nullable_final_field_without_initializer.dart.weak.expect b/pkg/front_end/testcases/late_lowering/instance_nullable_final_field_without_initializer.dart.weak.expect
index 26f06e0..310cc22 100644
--- a/pkg/front_end/testcases/late_lowering/instance_nullable_final_field_without_initializer.dart.weak.expect
+++ b/pkg/front_end/testcases/late_lowering/instance_nullable_final_field_without_initializer.dart.weak.expect
@@ -19,10 +19,10 @@
     : self::Class::_#Class#field#isSet = true, self::Class::_#Class#field = field, super core::Object::•()
     ;
   get field() → core::int?
-    return this.{self::Class::_#Class#field#isSet} ?{core::int?} this.{self::Class::_#Class#field} : throw new _in::LateInitializationErrorImpl::•("Field 'field' has not been initialized.");
+    return this.{self::Class::_#Class#field#isSet} ?{core::int?} this.{self::Class::_#Class#field} : throw new _in::LateError::fieldNI("field");
   set field(core::int? #t1) → void
     if(this.{self::Class::_#Class#field#isSet})
-      throw new _in::LateInitializationErrorImpl::•("Field 'field' has already been initialized.");
+      throw new _in::LateError::fieldAI("field");
     else {
       this.{self::Class::_#Class#field#isSet} = true;
       this.{self::Class::_#Class#field} = #t1;
diff --git a/pkg/front_end/testcases/late_lowering/instance_nullable_final_field_without_initializer.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/instance_nullable_final_field_without_initializer.dart.weak.transformed.expect
index 26f06e0..310cc22 100644
--- a/pkg/front_end/testcases/late_lowering/instance_nullable_final_field_without_initializer.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/instance_nullable_final_field_without_initializer.dart.weak.transformed.expect
@@ -19,10 +19,10 @@
     : self::Class::_#Class#field#isSet = true, self::Class::_#Class#field = field, super core::Object::•()
     ;
   get field() → core::int?
-    return this.{self::Class::_#Class#field#isSet} ?{core::int?} this.{self::Class::_#Class#field} : throw new _in::LateInitializationErrorImpl::•("Field 'field' has not been initialized.");
+    return this.{self::Class::_#Class#field#isSet} ?{core::int?} this.{self::Class::_#Class#field} : throw new _in::LateError::fieldNI("field");
   set field(core::int? #t1) → void
     if(this.{self::Class::_#Class#field#isSet})
-      throw new _in::LateInitializationErrorImpl::•("Field 'field' has already been initialized.");
+      throw new _in::LateError::fieldAI("field");
     else {
       this.{self::Class::_#Class#field#isSet} = true;
       this.{self::Class::_#Class#field} = #t1;
diff --git a/pkg/front_end/testcases/late_lowering/issue40373.dart.strong.expect b/pkg/front_end/testcases/late_lowering/issue40373.dart.strong.expect
index ecf82f3..b7c4bbf 100644
--- a/pkg/front_end/testcases/late_lowering/issue40373.dart.strong.expect
+++ b/pkg/front_end/testcases/late_lowering/issue40373.dart.strong.expect
@@ -16,7 +16,7 @@
   set p1(core::num #t2) → void
     this.{self::C::_#C#p1} = #t2;
   get p2() → core::num
-    return let final core::num? #t3 = this.{self::C::_#C#p2} in #t3.==(null) ?{core::num} let final core::num #t4 = this.{self::C::pi} in this.{self::C::_#C#p2}.==(null) ?{core::num} this.{self::C::_#C#p2} = #t4 : throw new _in::LateInitializationErrorImpl::•("Field 'p2' has been assigned during initialization.") : #t3{core::num};
+    return let final core::num? #t3 = this.{self::C::_#C#p2} in #t3.==(null) ?{core::num} let final core::num #t4 = this.{self::C::pi} in this.{self::C::_#C#p2}.==(null) ?{core::num} this.{self::C::_#C#p2} = #t4 : throw new _in::LateError::fieldADI("p2") : #t3{core::num};
 }
 static method main() → dynamic {
   self::expect(3.14, new self::C::•().{self::C::p1});
diff --git a/pkg/front_end/testcases/late_lowering/issue40373.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/issue40373.dart.strong.transformed.expect
index ecf82f3..b7c4bbf 100644
--- a/pkg/front_end/testcases/late_lowering/issue40373.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/issue40373.dart.strong.transformed.expect
@@ -16,7 +16,7 @@
   set p1(core::num #t2) → void
     this.{self::C::_#C#p1} = #t2;
   get p2() → core::num
-    return let final core::num? #t3 = this.{self::C::_#C#p2} in #t3.==(null) ?{core::num} let final core::num #t4 = this.{self::C::pi} in this.{self::C::_#C#p2}.==(null) ?{core::num} this.{self::C::_#C#p2} = #t4 : throw new _in::LateInitializationErrorImpl::•("Field 'p2' has been assigned during initialization.") : #t3{core::num};
+    return let final core::num? #t3 = this.{self::C::_#C#p2} in #t3.==(null) ?{core::num} let final core::num #t4 = this.{self::C::pi} in this.{self::C::_#C#p2}.==(null) ?{core::num} this.{self::C::_#C#p2} = #t4 : throw new _in::LateError::fieldADI("p2") : #t3{core::num};
 }
 static method main() → dynamic {
   self::expect(3.14, new self::C::•().{self::C::p1});
diff --git a/pkg/front_end/testcases/late_lowering/issue40373.dart.weak.expect b/pkg/front_end/testcases/late_lowering/issue40373.dart.weak.expect
index 3fc2e39..b9751eb 100644
--- a/pkg/front_end/testcases/late_lowering/issue40373.dart.weak.expect
+++ b/pkg/front_end/testcases/late_lowering/issue40373.dart.weak.expect
@@ -27,7 +27,7 @@
     if(!this.{self::C::_#C#p2#isSet}) {
       final core::num #t3 = this.{self::C::pi};
       if(this.{self::C::_#C#p2#isSet})
-        throw new _in::LateInitializationErrorImpl::•("Field 'p2' has been assigned during initialization.");
+        throw new _in::LateError::fieldADI("p2");
       this.{self::C::_#C#p2} = #t3;
       this.{self::C::_#C#p2#isSet} = true;
     }
diff --git a/pkg/front_end/testcases/late_lowering/issue40373.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/issue40373.dart.weak.transformed.expect
index 3fc2e39..b9751eb 100644
--- a/pkg/front_end/testcases/late_lowering/issue40373.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/issue40373.dart.weak.transformed.expect
@@ -27,7 +27,7 @@
     if(!this.{self::C::_#C#p2#isSet}) {
       final core::num #t3 = this.{self::C::pi};
       if(this.{self::C::_#C#p2#isSet})
-        throw new _in::LateInitializationErrorImpl::•("Field 'p2' has been assigned during initialization.");
+        throw new _in::LateError::fieldADI("p2");
       this.{self::C::_#C#p2} = #t3;
       this.{self::C::_#C#p2#isSet} = true;
     }
diff --git a/pkg/front_end/testcases/late_lowering/issue40373b.dart.strong.expect b/pkg/front_end/testcases/late_lowering/issue40373b.dart.strong.expect
index ba0c369..8eb1418 100644
--- a/pkg/front_end/testcases/late_lowering/issue40373b.dart.strong.expect
+++ b/pkg/front_end/testcases/late_lowering/issue40373b.dart.strong.expect
@@ -12,19 +12,19 @@
     : super core::Object::•()
     ;
   static get s() → dynamic
-    return self::C::_#s#isSet ?{dynamic} self::C::_#s : throw new _in::LateInitializationErrorImpl::•("Field 's' has not been initialized.");
+    return self::C::_#s#isSet ?{dynamic} self::C::_#s : throw new _in::LateError::fieldNI("s");
   static set s(dynamic #t1) → void
     if(self::C::_#s#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Field 's' has already been initialized.");
+      throw new _in::LateError::fieldAI("s");
     else {
       self::C::_#s#isSet = true;
       self::C::_#s = #t1;
     }
   get v() → dynamic
-    return this.{self::C::_#C#v#isSet} ?{dynamic} this.{self::C::_#C#v} : throw new _in::LateInitializationErrorImpl::•("Field 'v' has not been initialized.");
+    return this.{self::C::_#C#v#isSet} ?{dynamic} this.{self::C::_#C#v} : throw new _in::LateError::fieldNI("v");
   set v(dynamic #t2) → void
     if(this.{self::C::_#C#v#isSet})
-      throw new _in::LateInitializationErrorImpl::•("Field 'v' has already been initialized.");
+      throw new _in::LateError::fieldAI("v");
     else {
       this.{self::C::_#C#v#isSet} = true;
       this.{self::C::_#C#v} = #t2;
@@ -33,10 +33,10 @@
 static field dynamic _#g = null;
 static field core::bool _#g#isSet = false;
 static get g() → dynamic
-  return self::_#g#isSet ?{dynamic} self::_#g : throw new _in::LateInitializationErrorImpl::•("Field 'g' has not been initialized.");
+  return self::_#g#isSet ?{dynamic} self::_#g : throw new _in::LateError::fieldNI("g");
 static set g(dynamic #t3) → void
   if(self::_#g#isSet)
-    throw new _in::LateInitializationErrorImpl::•("Field 'g' has already been initialized.");
+    throw new _in::LateError::fieldAI("g");
   else {
     self::_#g#isSet = true;
     self::_#g = #t3;
@@ -45,10 +45,10 @@
   final dynamic l;
   core::bool #l#isSet = false;
   function #l#get() → dynamic
-    return #l#isSet ?{dynamic} l : throw new _in::LateInitializationErrorImpl::•("Local 'l' has not been initialized.");
+    return #l#isSet ?{dynamic} l : throw new _in::LateError::localNI("l");
   function #l#set(dynamic #t4) → dynamic
     if(#l#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Local 'l' has already been initialized.");
+      throw new _in::LateError::localAI("l");
     else {
       #l#isSet = true;
       return l = #t4;
diff --git a/pkg/front_end/testcases/late_lowering/issue40373b.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/issue40373b.dart.strong.transformed.expect
index ba0c369..8eb1418 100644
--- a/pkg/front_end/testcases/late_lowering/issue40373b.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/issue40373b.dart.strong.transformed.expect
@@ -12,19 +12,19 @@
     : super core::Object::•()
     ;
   static get s() → dynamic
-    return self::C::_#s#isSet ?{dynamic} self::C::_#s : throw new _in::LateInitializationErrorImpl::•("Field 's' has not been initialized.");
+    return self::C::_#s#isSet ?{dynamic} self::C::_#s : throw new _in::LateError::fieldNI("s");
   static set s(dynamic #t1) → void
     if(self::C::_#s#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Field 's' has already been initialized.");
+      throw new _in::LateError::fieldAI("s");
     else {
       self::C::_#s#isSet = true;
       self::C::_#s = #t1;
     }
   get v() → dynamic
-    return this.{self::C::_#C#v#isSet} ?{dynamic} this.{self::C::_#C#v} : throw new _in::LateInitializationErrorImpl::•("Field 'v' has not been initialized.");
+    return this.{self::C::_#C#v#isSet} ?{dynamic} this.{self::C::_#C#v} : throw new _in::LateError::fieldNI("v");
   set v(dynamic #t2) → void
     if(this.{self::C::_#C#v#isSet})
-      throw new _in::LateInitializationErrorImpl::•("Field 'v' has already been initialized.");
+      throw new _in::LateError::fieldAI("v");
     else {
       this.{self::C::_#C#v#isSet} = true;
       this.{self::C::_#C#v} = #t2;
@@ -33,10 +33,10 @@
 static field dynamic _#g = null;
 static field core::bool _#g#isSet = false;
 static get g() → dynamic
-  return self::_#g#isSet ?{dynamic} self::_#g : throw new _in::LateInitializationErrorImpl::•("Field 'g' has not been initialized.");
+  return self::_#g#isSet ?{dynamic} self::_#g : throw new _in::LateError::fieldNI("g");
 static set g(dynamic #t3) → void
   if(self::_#g#isSet)
-    throw new _in::LateInitializationErrorImpl::•("Field 'g' has already been initialized.");
+    throw new _in::LateError::fieldAI("g");
   else {
     self::_#g#isSet = true;
     self::_#g = #t3;
@@ -45,10 +45,10 @@
   final dynamic l;
   core::bool #l#isSet = false;
   function #l#get() → dynamic
-    return #l#isSet ?{dynamic} l : throw new _in::LateInitializationErrorImpl::•("Local 'l' has not been initialized.");
+    return #l#isSet ?{dynamic} l : throw new _in::LateError::localNI("l");
   function #l#set(dynamic #t4) → dynamic
     if(#l#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Local 'l' has already been initialized.");
+      throw new _in::LateError::localAI("l");
     else {
       #l#isSet = true;
       return l = #t4;
diff --git a/pkg/front_end/testcases/late_lowering/issue40373b.dart.weak.expect b/pkg/front_end/testcases/late_lowering/issue40373b.dart.weak.expect
index ba0c369..8eb1418 100644
--- a/pkg/front_end/testcases/late_lowering/issue40373b.dart.weak.expect
+++ b/pkg/front_end/testcases/late_lowering/issue40373b.dart.weak.expect
@@ -12,19 +12,19 @@
     : super core::Object::•()
     ;
   static get s() → dynamic
-    return self::C::_#s#isSet ?{dynamic} self::C::_#s : throw new _in::LateInitializationErrorImpl::•("Field 's' has not been initialized.");
+    return self::C::_#s#isSet ?{dynamic} self::C::_#s : throw new _in::LateError::fieldNI("s");
   static set s(dynamic #t1) → void
     if(self::C::_#s#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Field 's' has already been initialized.");
+      throw new _in::LateError::fieldAI("s");
     else {
       self::C::_#s#isSet = true;
       self::C::_#s = #t1;
     }
   get v() → dynamic
-    return this.{self::C::_#C#v#isSet} ?{dynamic} this.{self::C::_#C#v} : throw new _in::LateInitializationErrorImpl::•("Field 'v' has not been initialized.");
+    return this.{self::C::_#C#v#isSet} ?{dynamic} this.{self::C::_#C#v} : throw new _in::LateError::fieldNI("v");
   set v(dynamic #t2) → void
     if(this.{self::C::_#C#v#isSet})
-      throw new _in::LateInitializationErrorImpl::•("Field 'v' has already been initialized.");
+      throw new _in::LateError::fieldAI("v");
     else {
       this.{self::C::_#C#v#isSet} = true;
       this.{self::C::_#C#v} = #t2;
@@ -33,10 +33,10 @@
 static field dynamic _#g = null;
 static field core::bool _#g#isSet = false;
 static get g() → dynamic
-  return self::_#g#isSet ?{dynamic} self::_#g : throw new _in::LateInitializationErrorImpl::•("Field 'g' has not been initialized.");
+  return self::_#g#isSet ?{dynamic} self::_#g : throw new _in::LateError::fieldNI("g");
 static set g(dynamic #t3) → void
   if(self::_#g#isSet)
-    throw new _in::LateInitializationErrorImpl::•("Field 'g' has already been initialized.");
+    throw new _in::LateError::fieldAI("g");
   else {
     self::_#g#isSet = true;
     self::_#g = #t3;
@@ -45,10 +45,10 @@
   final dynamic l;
   core::bool #l#isSet = false;
   function #l#get() → dynamic
-    return #l#isSet ?{dynamic} l : throw new _in::LateInitializationErrorImpl::•("Local 'l' has not been initialized.");
+    return #l#isSet ?{dynamic} l : throw new _in::LateError::localNI("l");
   function #l#set(dynamic #t4) → dynamic
     if(#l#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Local 'l' has already been initialized.");
+      throw new _in::LateError::localAI("l");
     else {
       #l#isSet = true;
       return l = #t4;
diff --git a/pkg/front_end/testcases/late_lowering/issue40373b.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/issue40373b.dart.weak.transformed.expect
index ba0c369..8eb1418 100644
--- a/pkg/front_end/testcases/late_lowering/issue40373b.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/issue40373b.dart.weak.transformed.expect
@@ -12,19 +12,19 @@
     : super core::Object::•()
     ;
   static get s() → dynamic
-    return self::C::_#s#isSet ?{dynamic} self::C::_#s : throw new _in::LateInitializationErrorImpl::•("Field 's' has not been initialized.");
+    return self::C::_#s#isSet ?{dynamic} self::C::_#s : throw new _in::LateError::fieldNI("s");
   static set s(dynamic #t1) → void
     if(self::C::_#s#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Field 's' has already been initialized.");
+      throw new _in::LateError::fieldAI("s");
     else {
       self::C::_#s#isSet = true;
       self::C::_#s = #t1;
     }
   get v() → dynamic
-    return this.{self::C::_#C#v#isSet} ?{dynamic} this.{self::C::_#C#v} : throw new _in::LateInitializationErrorImpl::•("Field 'v' has not been initialized.");
+    return this.{self::C::_#C#v#isSet} ?{dynamic} this.{self::C::_#C#v} : throw new _in::LateError::fieldNI("v");
   set v(dynamic #t2) → void
     if(this.{self::C::_#C#v#isSet})
-      throw new _in::LateInitializationErrorImpl::•("Field 'v' has already been initialized.");
+      throw new _in::LateError::fieldAI("v");
     else {
       this.{self::C::_#C#v#isSet} = true;
       this.{self::C::_#C#v} = #t2;
@@ -33,10 +33,10 @@
 static field dynamic _#g = null;
 static field core::bool _#g#isSet = false;
 static get g() → dynamic
-  return self::_#g#isSet ?{dynamic} self::_#g : throw new _in::LateInitializationErrorImpl::•("Field 'g' has not been initialized.");
+  return self::_#g#isSet ?{dynamic} self::_#g : throw new _in::LateError::fieldNI("g");
 static set g(dynamic #t3) → void
   if(self::_#g#isSet)
-    throw new _in::LateInitializationErrorImpl::•("Field 'g' has already been initialized.");
+    throw new _in::LateError::fieldAI("g");
   else {
     self::_#g#isSet = true;
     self::_#g = #t3;
@@ -45,10 +45,10 @@
   final dynamic l;
   core::bool #l#isSet = false;
   function #l#get() → dynamic
-    return #l#isSet ?{dynamic} l : throw new _in::LateInitializationErrorImpl::•("Local 'l' has not been initialized.");
+    return #l#isSet ?{dynamic} l : throw new _in::LateError::localNI("l");
   function #l#set(dynamic #t4) → dynamic
     if(#l#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Local 'l' has already been initialized.");
+      throw new _in::LateError::localAI("l");
     else {
       #l#isSet = true;
       return l = #t4;
diff --git a/pkg/front_end/testcases/late_lowering/issue40601.dart.strong.expect b/pkg/front_end/testcases/late_lowering/issue40601.dart.strong.expect
index b339c0e..7e000ad 100644
--- a/pkg/front_end/testcases/late_lowering/issue40601.dart.strong.expect
+++ b/pkg/front_end/testcases/late_lowering/issue40601.dart.strong.expect
@@ -13,13 +13,13 @@
     self::A::T? value;
     core::bool #value#isSet = false;
     function #value#get() → self::A::T%
-      return #value#isSet ?{self::A::T%} value{self::A::T%} : throw new _in::LateInitializationErrorImpl::•("Local 'value' has not been initialized.");
+      return #value#isSet ?{self::A::T%} value{self::A::T%} : throw new _in::LateError::localNI("value");
     function #value#set(self::A::T% #t1) → dynamic {
       #value#isSet = true;
       return value = #t1;
     }
     () → dynamic result = () → dynamic => this.{self::A::bar}(#value#get.call());
-    (() → core::Null? {
+    (() → Null {
       #value#set.call(this.{self::A::baz}());
     }).call();
     return result;
diff --git a/pkg/front_end/testcases/late_lowering/issue40601.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/issue40601.dart.strong.transformed.expect
index b339c0e..7e000ad 100644
--- a/pkg/front_end/testcases/late_lowering/issue40601.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/issue40601.dart.strong.transformed.expect
@@ -13,13 +13,13 @@
     self::A::T? value;
     core::bool #value#isSet = false;
     function #value#get() → self::A::T%
-      return #value#isSet ?{self::A::T%} value{self::A::T%} : throw new _in::LateInitializationErrorImpl::•("Local 'value' has not been initialized.");
+      return #value#isSet ?{self::A::T%} value{self::A::T%} : throw new _in::LateError::localNI("value");
     function #value#set(self::A::T% #t1) → dynamic {
       #value#isSet = true;
       return value = #t1;
     }
     () → dynamic result = () → dynamic => this.{self::A::bar}(#value#get.call());
-    (() → core::Null? {
+    (() → Null {
       #value#set.call(this.{self::A::baz}());
     }).call();
     return result;
diff --git a/pkg/front_end/testcases/late_lowering/issue40601.dart.weak.expect b/pkg/front_end/testcases/late_lowering/issue40601.dart.weak.expect
index b339c0e..7e000ad 100644
--- a/pkg/front_end/testcases/late_lowering/issue40601.dart.weak.expect
+++ b/pkg/front_end/testcases/late_lowering/issue40601.dart.weak.expect
@@ -13,13 +13,13 @@
     self::A::T? value;
     core::bool #value#isSet = false;
     function #value#get() → self::A::T%
-      return #value#isSet ?{self::A::T%} value{self::A::T%} : throw new _in::LateInitializationErrorImpl::•("Local 'value' has not been initialized.");
+      return #value#isSet ?{self::A::T%} value{self::A::T%} : throw new _in::LateError::localNI("value");
     function #value#set(self::A::T% #t1) → dynamic {
       #value#isSet = true;
       return value = #t1;
     }
     () → dynamic result = () → dynamic => this.{self::A::bar}(#value#get.call());
-    (() → core::Null? {
+    (() → Null {
       #value#set.call(this.{self::A::baz}());
     }).call();
     return result;
diff --git a/pkg/front_end/testcases/late_lowering/issue40601.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/issue40601.dart.weak.transformed.expect
index b339c0e..7e000ad 100644
--- a/pkg/front_end/testcases/late_lowering/issue40601.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/issue40601.dart.weak.transformed.expect
@@ -13,13 +13,13 @@
     self::A::T? value;
     core::bool #value#isSet = false;
     function #value#get() → self::A::T%
-      return #value#isSet ?{self::A::T%} value{self::A::T%} : throw new _in::LateInitializationErrorImpl::•("Local 'value' has not been initialized.");
+      return #value#isSet ?{self::A::T%} value{self::A::T%} : throw new _in::LateError::localNI("value");
     function #value#set(self::A::T% #t1) → dynamic {
       #value#isSet = true;
       return value = #t1;
     }
     () → dynamic result = () → dynamic => this.{self::A::bar}(#value#get.call());
-    (() → core::Null? {
+    (() → Null {
       #value#set.call(this.{self::A::baz}());
     }).call();
     return result;
diff --git a/pkg/front_end/testcases/late_lowering/issue40805.dart.strong.expect b/pkg/front_end/testcases/late_lowering/issue40805.dart.strong.expect
index 2f75d09..7df4dbc 100644
--- a/pkg/front_end/testcases/late_lowering/issue40805.dart.strong.expect
+++ b/pkg/front_end/testcases/late_lowering/issue40805.dart.strong.expect
@@ -9,12 +9,12 @@
     : super core::Object::•()
     ;
   get x() → core::int
-    return let final core::int? #t1 = this.{self::C::_#C#x} in #t1.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'x' has not been initialized.") : #t1{core::int};
+    return let final core::int? #t1 = this.{self::C::_#C#x} in #t1.==(null) ?{core::int} throw new _in::LateError::fieldNI("x") : #t1{core::int};
   set x(covariant core::int #t2) → void
     if(this.{self::C::_#C#x}.==(null))
       this.{self::C::_#C#x} = #t2;
     else
-      throw new _in::LateInitializationErrorImpl::•("Field 'x' has already been initialized.");
+      throw new _in::LateError::fieldAI("x");
 }
 class D extends self::C {
   synthetic constructor •() → self::D
diff --git a/pkg/front_end/testcases/late_lowering/issue40805.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/issue40805.dart.strong.transformed.expect
index 2f75d09..7df4dbc 100644
--- a/pkg/front_end/testcases/late_lowering/issue40805.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/issue40805.dart.strong.transformed.expect
@@ -9,12 +9,12 @@
     : super core::Object::•()
     ;
   get x() → core::int
-    return let final core::int? #t1 = this.{self::C::_#C#x} in #t1.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'x' has not been initialized.") : #t1{core::int};
+    return let final core::int? #t1 = this.{self::C::_#C#x} in #t1.==(null) ?{core::int} throw new _in::LateError::fieldNI("x") : #t1{core::int};
   set x(covariant core::int #t2) → void
     if(this.{self::C::_#C#x}.==(null))
       this.{self::C::_#C#x} = #t2;
     else
-      throw new _in::LateInitializationErrorImpl::•("Field 'x' has already been initialized.");
+      throw new _in::LateError::fieldAI("x");
 }
 class D extends self::C {
   synthetic constructor •() → self::D
diff --git a/pkg/front_end/testcases/late_lowering/issue40805.dart.weak.expect b/pkg/front_end/testcases/late_lowering/issue40805.dart.weak.expect
index aead618..d0b344e 100644
--- a/pkg/front_end/testcases/late_lowering/issue40805.dart.weak.expect
+++ b/pkg/front_end/testcases/late_lowering/issue40805.dart.weak.expect
@@ -10,10 +10,10 @@
     : super core::Object::•()
     ;
   get x() → core::int
-    return this.{self::C::_#C#x#isSet} ?{core::int} let final core::int? #t1 = this.{self::C::_#C#x} in #t1{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'x' has not been initialized.");
+    return this.{self::C::_#C#x#isSet} ?{core::int} let final core::int? #t1 = this.{self::C::_#C#x} in #t1{core::int} : throw new _in::LateError::fieldNI("x");
   set x(covariant core::int #t2) → void
     if(this.{self::C::_#C#x#isSet})
-      throw new _in::LateInitializationErrorImpl::•("Field 'x' has already been initialized.");
+      throw new _in::LateError::fieldAI("x");
     else {
       this.{self::C::_#C#x#isSet} = true;
       this.{self::C::_#C#x} = #t2;
diff --git a/pkg/front_end/testcases/late_lowering/issue40805.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/issue40805.dart.weak.transformed.expect
index aead618..d0b344e 100644
--- a/pkg/front_end/testcases/late_lowering/issue40805.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/issue40805.dart.weak.transformed.expect
@@ -10,10 +10,10 @@
     : super core::Object::•()
     ;
   get x() → core::int
-    return this.{self::C::_#C#x#isSet} ?{core::int} let final core::int? #t1 = this.{self::C::_#C#x} in #t1{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'x' has not been initialized.");
+    return this.{self::C::_#C#x#isSet} ?{core::int} let final core::int? #t1 = this.{self::C::_#C#x} in #t1{core::int} : throw new _in::LateError::fieldNI("x");
   set x(covariant core::int #t2) → void
     if(this.{self::C::_#C#x#isSet})
-      throw new _in::LateInitializationErrorImpl::•("Field 'x' has already been initialized.");
+      throw new _in::LateError::fieldAI("x");
     else {
       this.{self::C::_#C#x#isSet} = true;
       this.{self::C::_#C#x} = #t2;
diff --git a/pkg/front_end/testcases/late_lowering/issue41436/issue41436.dart.strong.expect b/pkg/front_end/testcases/late_lowering/issue41436/issue41436.dart.strong.expect
index 139a488..3c27241 100644
--- a/pkg/front_end/testcases/late_lowering/issue41436/issue41436.dart.strong.expect
+++ b/pkg/front_end/testcases/late_lowering/issue41436/issue41436.dart.strong.expect
@@ -19,7 +19,7 @@
     : super core::Object::•()
     ;
   get x() → core::int
-    return let final core::int? #t1 = this.{test::A::_#A#x} in #t1.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'x' has not been initialized.") : #t1{core::int};
+    return let final core::int? #t1 = this.{test::A::_#A#x} in #t1.==(null) ?{core::int} throw new _in::LateError::fieldNI("x") : #t1{core::int};
   set x(core::int #t2) → void
     this.{test::A::_#A#x} = #t2;
 }
diff --git a/pkg/front_end/testcases/late_lowering/issue41436/issue41436.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/issue41436/issue41436.dart.strong.transformed.expect
index 139a488..3c27241 100644
--- a/pkg/front_end/testcases/late_lowering/issue41436/issue41436.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/issue41436/issue41436.dart.strong.transformed.expect
@@ -19,7 +19,7 @@
     : super core::Object::•()
     ;
   get x() → core::int
-    return let final core::int? #t1 = this.{test::A::_#A#x} in #t1.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'x' has not been initialized.") : #t1{core::int};
+    return let final core::int? #t1 = this.{test::A::_#A#x} in #t1.==(null) ?{core::int} throw new _in::LateError::fieldNI("x") : #t1{core::int};
   set x(core::int #t2) → void
     this.{test::A::_#A#x} = #t2;
 }
diff --git a/pkg/front_end/testcases/late_lowering/issue41436/issue41436.dart.weak.expect b/pkg/front_end/testcases/late_lowering/issue41436/issue41436.dart.weak.expect
index 3872041..132542f 100644
--- a/pkg/front_end/testcases/late_lowering/issue41436/issue41436.dart.weak.expect
+++ b/pkg/front_end/testcases/late_lowering/issue41436/issue41436.dart.weak.expect
@@ -20,7 +20,7 @@
     : super core::Object::•()
     ;
   get x() → core::int
-    return this.{test::A::_#A#x#isSet} ?{core::int} let final core::int? #t1 = this.{test::A::_#A#x} in #t1{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'x' has not been initialized.");
+    return this.{test::A::_#A#x#isSet} ?{core::int} let final core::int? #t1 = this.{test::A::_#A#x} in #t1{core::int} : throw new _in::LateError::fieldNI("x");
   set x(core::int #t2) → void {
     this.{test::A::_#A#x#isSet} = true;
     this.{test::A::_#A#x} = #t2;
diff --git a/pkg/front_end/testcases/late_lowering/issue41436/issue41436.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/issue41436/issue41436.dart.weak.transformed.expect
index 3872041..132542f 100644
--- a/pkg/front_end/testcases/late_lowering/issue41436/issue41436.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/issue41436/issue41436.dart.weak.transformed.expect
@@ -20,7 +20,7 @@
     : super core::Object::•()
     ;
   get x() → core::int
-    return this.{test::A::_#A#x#isSet} ?{core::int} let final core::int? #t1 = this.{test::A::_#A#x} in #t1{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'x' has not been initialized.");
+    return this.{test::A::_#A#x#isSet} ?{core::int} let final core::int? #t1 = this.{test::A::_#A#x} in #t1{core::int} : throw new _in::LateError::fieldNI("x");
   set x(core::int #t2) → void {
     this.{test::A::_#A#x#isSet} = true;
     this.{test::A::_#A#x} = #t2;
diff --git a/pkg/front_end/testcases/late_lowering/issue41436b.dart.strong.expect b/pkg/front_end/testcases/late_lowering/issue41436b.dart.strong.expect
index 61c5d86..61f91a8 100644
--- a/pkg/front_end/testcases/late_lowering/issue41436b.dart.strong.expect
+++ b/pkg/front_end/testcases/late_lowering/issue41436b.dart.strong.expect
@@ -9,7 +9,7 @@
     : super core::Object::•()
     ;
   get x() → core::int
-    return let final core::int? #t1 = this.{self::A::_#A#x} in #t1.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'x' has not been initialized.") : #t1{core::int};
+    return let final core::int? #t1 = this.{self::A::_#A#x} in #t1.==(null) ?{core::int} throw new _in::LateError::fieldNI("x") : #t1{core::int};
   set x(core::int #t2) → void
     this.{self::A::_#A#x} = #t2;
 }
diff --git a/pkg/front_end/testcases/late_lowering/issue41436b.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/issue41436b.dart.strong.transformed.expect
index 61c5d86..61f91a8 100644
--- a/pkg/front_end/testcases/late_lowering/issue41436b.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/issue41436b.dart.strong.transformed.expect
@@ -9,7 +9,7 @@
     : super core::Object::•()
     ;
   get x() → core::int
-    return let final core::int? #t1 = this.{self::A::_#A#x} in #t1.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'x' has not been initialized.") : #t1{core::int};
+    return let final core::int? #t1 = this.{self::A::_#A#x} in #t1.==(null) ?{core::int} throw new _in::LateError::fieldNI("x") : #t1{core::int};
   set x(core::int #t2) → void
     this.{self::A::_#A#x} = #t2;
 }
diff --git a/pkg/front_end/testcases/late_lowering/issue41436b.dart.weak.expect b/pkg/front_end/testcases/late_lowering/issue41436b.dart.weak.expect
index 34bca462..33ef62f 100644
--- a/pkg/front_end/testcases/late_lowering/issue41436b.dart.weak.expect
+++ b/pkg/front_end/testcases/late_lowering/issue41436b.dart.weak.expect
@@ -10,7 +10,7 @@
     : super core::Object::•()
     ;
   get x() → core::int
-    return this.{self::A::_#A#x#isSet} ?{core::int} let final core::int? #t1 = this.{self::A::_#A#x} in #t1{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'x' has not been initialized.");
+    return this.{self::A::_#A#x#isSet} ?{core::int} let final core::int? #t1 = this.{self::A::_#A#x} in #t1{core::int} : throw new _in::LateError::fieldNI("x");
   set x(core::int #t2) → void {
     this.{self::A::_#A#x#isSet} = true;
     this.{self::A::_#A#x} = #t2;
diff --git a/pkg/front_end/testcases/late_lowering/issue41436b.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/issue41436b.dart.weak.transformed.expect
index 34bca462..33ef62f 100644
--- a/pkg/front_end/testcases/late_lowering/issue41436b.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/issue41436b.dart.weak.transformed.expect
@@ -10,7 +10,7 @@
     : super core::Object::•()
     ;
   get x() → core::int
-    return this.{self::A::_#A#x#isSet} ?{core::int} let final core::int? #t1 = this.{self::A::_#A#x} in #t1{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'x' has not been initialized.");
+    return this.{self::A::_#A#x#isSet} ?{core::int} let final core::int? #t1 = this.{self::A::_#A#x} in #t1{core::int} : throw new _in::LateError::fieldNI("x");
   set x(core::int #t2) → void {
     this.{self::A::_#A#x#isSet} = true;
     this.{self::A::_#A#x} = #t2;
diff --git a/pkg/front_end/testcases/late_lowering/issue41436c/issue41436c.dart.strong.expect b/pkg/front_end/testcases/late_lowering/issue41436c/issue41436c.dart.strong.expect
index 05bf5e3..6e6d809 100644
--- a/pkg/front_end/testcases/late_lowering/issue41436c/issue41436c.dart.strong.expect
+++ b/pkg/front_end/testcases/late_lowering/issue41436c/issue41436c.dart.strong.expect
@@ -29,7 +29,7 @@
     : super core::Object::•()
     ;
   get x() → core::int
-    return let final core::int? #t1 = this.{iss::A::_#A#x} in #t1.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'x' has not been initialized.") : #t1{core::int};
+    return let final core::int? #t1 = this.{iss::A::_#A#x} in #t1.==(null) ?{core::int} throw new _in::LateError::fieldNI("x") : #t1{core::int};
   set x(core::int #t2) → void
     this.{iss::A::_#A#x} = #t2;
 }
diff --git a/pkg/front_end/testcases/late_lowering/issue41436c/issue41436c.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/issue41436c/issue41436c.dart.strong.transformed.expect
index 05bf5e3..6e6d809 100644
--- a/pkg/front_end/testcases/late_lowering/issue41436c/issue41436c.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/issue41436c/issue41436c.dart.strong.transformed.expect
@@ -29,7 +29,7 @@
     : super core::Object::•()
     ;
   get x() → core::int
-    return let final core::int? #t1 = this.{iss::A::_#A#x} in #t1.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'x' has not been initialized.") : #t1{core::int};
+    return let final core::int? #t1 = this.{iss::A::_#A#x} in #t1.==(null) ?{core::int} throw new _in::LateError::fieldNI("x") : #t1{core::int};
   set x(core::int #t2) → void
     this.{iss::A::_#A#x} = #t2;
 }
diff --git a/pkg/front_end/testcases/late_lowering/issue41436c/issue41436c.dart.weak.expect b/pkg/front_end/testcases/late_lowering/issue41436c/issue41436c.dart.weak.expect
index 432f8c1..bf446b5 100644
--- a/pkg/front_end/testcases/late_lowering/issue41436c/issue41436c.dart.weak.expect
+++ b/pkg/front_end/testcases/late_lowering/issue41436c/issue41436c.dart.weak.expect
@@ -34,7 +34,7 @@
     : super core::Object::•()
     ;
   get x() → core::int
-    return this.{iss::A::_#A#x#isSet} ?{core::int} let final core::int? #t1 = this.{iss::A::_#A#x} in #t1{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'x' has not been initialized.");
+    return this.{iss::A::_#A#x#isSet} ?{core::int} let final core::int? #t1 = this.{iss::A::_#A#x} in #t1{core::int} : throw new _in::LateError::fieldNI("x");
   set x(core::int #t2) → void {
     this.{iss::A::_#A#x#isSet} = true;
     this.{iss::A::_#A#x} = #t2;
diff --git a/pkg/front_end/testcases/late_lowering/issue41436c/issue41436c.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/issue41436c/issue41436c.dart.weak.transformed.expect
index 432f8c1..bf446b5 100644
--- a/pkg/front_end/testcases/late_lowering/issue41436c/issue41436c.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/issue41436c/issue41436c.dart.weak.transformed.expect
@@ -34,7 +34,7 @@
     : super core::Object::•()
     ;
   get x() → core::int
-    return this.{iss::A::_#A#x#isSet} ?{core::int} let final core::int? #t1 = this.{iss::A::_#A#x} in #t1{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'x' has not been initialized.");
+    return this.{iss::A::_#A#x#isSet} ?{core::int} let final core::int? #t1 = this.{iss::A::_#A#x} in #t1{core::int} : throw new _in::LateError::fieldNI("x");
   set x(core::int #t2) → void {
     this.{iss::A::_#A#x#isSet} = true;
     this.{iss::A::_#A#x} = #t2;
diff --git a/pkg/front_end/testcases/late_lowering/issue41922.dart.strong.expect b/pkg/front_end/testcases/late_lowering/issue41922.dart.strong.expect
index 14ecf83..f550130 100644
--- a/pkg/front_end/testcases/late_lowering/issue41922.dart.strong.expect
+++ b/pkg/front_end/testcases/late_lowering/issue41922.dart.strong.expect
@@ -29,7 +29,7 @@
   return val;
 }
 static method main() → dynamic {
-  self::throws(() → core::Null? {
+  self::throws(() → void {
     self::C::s;
   });
   self::expect("lateValue", self::C::s);
diff --git a/pkg/front_end/testcases/late_lowering/issue41922.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/issue41922.dart.strong.transformed.expect
index 14ecf83..f550130 100644
--- a/pkg/front_end/testcases/late_lowering/issue41922.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/issue41922.dart.strong.transformed.expect
@@ -29,7 +29,7 @@
   return val;
 }
 static method main() → dynamic {
-  self::throws(() → core::Null? {
+  self::throws(() → void {
     self::C::s;
   });
   self::expect("lateValue", self::C::s);
diff --git a/pkg/front_end/testcases/late_lowering/issue41922.dart.weak.expect b/pkg/front_end/testcases/late_lowering/issue41922.dart.weak.expect
index 14ecf83..f550130 100644
--- a/pkg/front_end/testcases/late_lowering/issue41922.dart.weak.expect
+++ b/pkg/front_end/testcases/late_lowering/issue41922.dart.weak.expect
@@ -29,7 +29,7 @@
   return val;
 }
 static method main() → dynamic {
-  self::throws(() → core::Null? {
+  self::throws(() → void {
     self::C::s;
   });
   self::expect("lateValue", self::C::s);
diff --git a/pkg/front_end/testcases/late_lowering/issue41922.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/issue41922.dart.weak.transformed.expect
index 14ecf83..f550130 100644
--- a/pkg/front_end/testcases/late_lowering/issue41922.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/issue41922.dart.weak.transformed.expect
@@ -29,7 +29,7 @@
   return val;
 }
 static method main() → dynamic {
-  self::throws(() → core::Null? {
+  self::throws(() → void {
     self::C::s;
   });
   self::expect("lateValue", self::C::s);
diff --git a/pkg/front_end/testcases/late_lowering/issue42407.dart.strong.expect b/pkg/front_end/testcases/late_lowering/issue42407.dart.strong.expect
index 59101b9..e2cc0e7 100644
--- a/pkg/front_end/testcases/late_lowering/issue42407.dart.strong.expect
+++ b/pkg/front_end/testcases/late_lowering/issue42407.dart.strong.expect
@@ -10,7 +10,7 @@
     : super core::Object::•()
     ;
   get x() → self::A::T%
-    return this.{self::A::_#A#x#isSet} ?{self::A::T%} let final self::A::T? #t1 = this.{self::A::_#A#x} in #t1{self::A::T%} : throw new _in::LateInitializationErrorImpl::•("Field 'x' has not been initialized.");
+    return this.{self::A::_#A#x#isSet} ?{self::A::T%} let final self::A::T? #t1 = this.{self::A::_#A#x} in #t1{self::A::T%} : throw new _in::LateError::fieldNI("x");
   set x(generic-covariant-impl self::A::T% #t2) → void {
     this.{self::A::_#A#x#isSet} = true;
     this.{self::A::_#A#x} = #t2;
@@ -30,10 +30,10 @@
 static method main() → dynamic {
   self::A<core::num> a = new self::A::•<core::int>();
   self::expect(42, a.{self::A::x} = 42);
-  self::throws(() → core::double => a.{self::A::x} = 0.5);
+  self::throws(() → void => a.{self::A::x} = 0.5);
   self::B<core::num> b = new self::B::•<core::int>();
   self::expect(42, b.{self::B::y} = 42);
-  self::throws(() → core::double => b.{self::B::y} = 0.5);
+  self::throws(() → void => b.{self::B::y} = 0.5);
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
   if(!expected.{core::Object::==}(actual))
diff --git a/pkg/front_end/testcases/late_lowering/issue42407.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/issue42407.dart.strong.transformed.expect
index 59101b9..e2cc0e7 100644
--- a/pkg/front_end/testcases/late_lowering/issue42407.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/issue42407.dart.strong.transformed.expect
@@ -10,7 +10,7 @@
     : super core::Object::•()
     ;
   get x() → self::A::T%
-    return this.{self::A::_#A#x#isSet} ?{self::A::T%} let final self::A::T? #t1 = this.{self::A::_#A#x} in #t1{self::A::T%} : throw new _in::LateInitializationErrorImpl::•("Field 'x' has not been initialized.");
+    return this.{self::A::_#A#x#isSet} ?{self::A::T%} let final self::A::T? #t1 = this.{self::A::_#A#x} in #t1{self::A::T%} : throw new _in::LateError::fieldNI("x");
   set x(generic-covariant-impl self::A::T% #t2) → void {
     this.{self::A::_#A#x#isSet} = true;
     this.{self::A::_#A#x} = #t2;
@@ -30,10 +30,10 @@
 static method main() → dynamic {
   self::A<core::num> a = new self::A::•<core::int>();
   self::expect(42, a.{self::A::x} = 42);
-  self::throws(() → core::double => a.{self::A::x} = 0.5);
+  self::throws(() → void => a.{self::A::x} = 0.5);
   self::B<core::num> b = new self::B::•<core::int>();
   self::expect(42, b.{self::B::y} = 42);
-  self::throws(() → core::double => b.{self::B::y} = 0.5);
+  self::throws(() → void => b.{self::B::y} = 0.5);
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
   if(!expected.{core::Object::==}(actual))
diff --git a/pkg/front_end/testcases/late_lowering/issue42407.dart.weak.expect b/pkg/front_end/testcases/late_lowering/issue42407.dart.weak.expect
index 59101b9..e2cc0e7 100644
--- a/pkg/front_end/testcases/late_lowering/issue42407.dart.weak.expect
+++ b/pkg/front_end/testcases/late_lowering/issue42407.dart.weak.expect
@@ -10,7 +10,7 @@
     : super core::Object::•()
     ;
   get x() → self::A::T%
-    return this.{self::A::_#A#x#isSet} ?{self::A::T%} let final self::A::T? #t1 = this.{self::A::_#A#x} in #t1{self::A::T%} : throw new _in::LateInitializationErrorImpl::•("Field 'x' has not been initialized.");
+    return this.{self::A::_#A#x#isSet} ?{self::A::T%} let final self::A::T? #t1 = this.{self::A::_#A#x} in #t1{self::A::T%} : throw new _in::LateError::fieldNI("x");
   set x(generic-covariant-impl self::A::T% #t2) → void {
     this.{self::A::_#A#x#isSet} = true;
     this.{self::A::_#A#x} = #t2;
@@ -30,10 +30,10 @@
 static method main() → dynamic {
   self::A<core::num> a = new self::A::•<core::int>();
   self::expect(42, a.{self::A::x} = 42);
-  self::throws(() → core::double => a.{self::A::x} = 0.5);
+  self::throws(() → void => a.{self::A::x} = 0.5);
   self::B<core::num> b = new self::B::•<core::int>();
   self::expect(42, b.{self::B::y} = 42);
-  self::throws(() → core::double => b.{self::B::y} = 0.5);
+  self::throws(() → void => b.{self::B::y} = 0.5);
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
   if(!expected.{core::Object::==}(actual))
diff --git a/pkg/front_end/testcases/late_lowering/issue42407.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/issue42407.dart.weak.transformed.expect
index 59101b9..e2cc0e7 100644
--- a/pkg/front_end/testcases/late_lowering/issue42407.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/issue42407.dart.weak.transformed.expect
@@ -10,7 +10,7 @@
     : super core::Object::•()
     ;
   get x() → self::A::T%
-    return this.{self::A::_#A#x#isSet} ?{self::A::T%} let final self::A::T? #t1 = this.{self::A::_#A#x} in #t1{self::A::T%} : throw new _in::LateInitializationErrorImpl::•("Field 'x' has not been initialized.");
+    return this.{self::A::_#A#x#isSet} ?{self::A::T%} let final self::A::T? #t1 = this.{self::A::_#A#x} in #t1{self::A::T%} : throw new _in::LateError::fieldNI("x");
   set x(generic-covariant-impl self::A::T% #t2) → void {
     this.{self::A::_#A#x#isSet} = true;
     this.{self::A::_#A#x} = #t2;
@@ -30,10 +30,10 @@
 static method main() → dynamic {
   self::A<core::num> a = new self::A::•<core::int>();
   self::expect(42, a.{self::A::x} = 42);
-  self::throws(() → core::double => a.{self::A::x} = 0.5);
+  self::throws(() → void => a.{self::A::x} = 0.5);
   self::B<core::num> b = new self::B::•<core::int>();
   self::expect(42, b.{self::B::y} = 42);
-  self::throws(() → core::double => b.{self::B::y} = 0.5);
+  self::throws(() → void => b.{self::B::y} = 0.5);
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
   if(!expected.{core::Object::==}(actual))
diff --git a/pkg/front_end/testcases/late_lowering/late_annotations.dart.strong.expect b/pkg/front_end/testcases/late_lowering/late_annotations.dart.strong.expect
index 44d325d..3adbaa8 100644
--- a/pkg/front_end/testcases/late_lowering/late_annotations.dart.strong.expect
+++ b/pkg/front_end/testcases/late_lowering/late_annotations.dart.strong.expect
@@ -21,46 +21,46 @@
     ;
   @#C1
   get instanceField() → core::int
-    return let final core::int? #t1 = this.{self::A::_#A#instanceField} in #t1.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'instanceField' has not been initialized.") : #t1{core::int};
+    return let final core::int? #t1 = this.{self::A::_#A#instanceField} in #t1.==(null) ?{core::int} throw new _in::LateError::fieldNI("instanceField") : #t1{core::int};
   @#C1
   set instanceField(core::int #t2) → void
     this.{self::A::_#A#instanceField} = #t2;
   @#C1
   get finalInstanceField() → core::int
-    return let final core::int? #t3 = this.{self::A::_#A#finalInstanceField} in #t3.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'finalInstanceField' has not been initialized.") : #t3{core::int};
+    return let final core::int? #t3 = this.{self::A::_#A#finalInstanceField} in #t3.==(null) ?{core::int} throw new _in::LateError::fieldNI("finalInstanceField") : #t3{core::int};
   @#C1
   set finalInstanceField(core::int #t4) → void
     if(this.{self::A::_#A#finalInstanceField}.==(null))
       this.{self::A::_#A#finalInstanceField} = #t4;
     else
-      throw new _in::LateInitializationErrorImpl::•("Field 'finalInstanceField' has already been initialized.");
+      throw new _in::LateError::fieldAI("finalInstanceField");
   @#C1
   get finalInstanceFieldWithInitializer() → core::int
-    return let final core::int? #t5 = this.{self::A::_#A#finalInstanceFieldWithInitializer} in #t5.==(null) ?{core::int} let final core::int #t6 = 0 in this.{self::A::_#A#finalInstanceFieldWithInitializer}.==(null) ?{core::int} this.{self::A::_#A#finalInstanceFieldWithInitializer} = #t6 : throw new _in::LateInitializationErrorImpl::•("Field 'finalInstanceFieldWithInitializer' has been assigned during initialization.") : #t5{core::int};
+    return let final core::int? #t5 = this.{self::A::_#A#finalInstanceFieldWithInitializer} in #t5.==(null) ?{core::int} let final core::int #t6 = 0 in this.{self::A::_#A#finalInstanceFieldWithInitializer}.==(null) ?{core::int} this.{self::A::_#A#finalInstanceFieldWithInitializer} = #t6 : throw new _in::LateError::fieldADI("finalInstanceFieldWithInitializer") : #t5{core::int};
   @#C1
   get covariantInstanceField() → core::num
-    return let final core::num? #t7 = this.{self::A::_#A#covariantInstanceField} in #t7.==(null) ?{core::num} throw new _in::LateInitializationErrorImpl::•("Field 'covariantInstanceField' has not been initialized.") : #t7{core::num};
+    return let final core::num? #t7 = this.{self::A::_#A#covariantInstanceField} in #t7.==(null) ?{core::num} throw new _in::LateError::fieldNI("covariantInstanceField") : #t7{core::num};
   @#C1
   set covariantInstanceField(covariant core::num #t8) → void
     this.{self::A::_#A#covariantInstanceField} = #t8;
   @#C1
   static get staticField() → core::int
-    return let final core::int? #t9 = self::A::_#staticField in #t9.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'staticField' has not been initialized.") : #t9{core::int};
+    return let final core::int? #t9 = self::A::_#staticField in #t9.==(null) ?{core::int} throw new _in::LateError::fieldNI("staticField") : #t9{core::int};
   @#C1
   static set staticField(core::int #t10) → void
     self::A::_#staticField = #t10;
   @#C1
   static get finalStaticField() → core::int
-    return let final core::int? #t11 = self::A::_#finalStaticField in #t11.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'finalStaticField' has not been initialized.") : #t11{core::int};
+    return let final core::int? #t11 = self::A::_#finalStaticField in #t11.==(null) ?{core::int} throw new _in::LateError::fieldNI("finalStaticField") : #t11{core::int};
   @#C1
   static set finalStaticField(core::int #t12) → void
     if(self::A::_#finalStaticField.==(null))
       self::A::_#finalStaticField = #t12;
     else
-      throw new _in::LateInitializationErrorImpl::•("Field 'finalStaticField' has already been initialized.");
+      throw new _in::LateError::fieldAI("finalStaticField");
   @#C1
   static get finalStaticFieldWithInitializer() → core::int
-    return let final core::int? #t13 = self::A::_#finalStaticFieldWithInitializer in #t13.==(null) ?{core::int} let final core::int #t14 = 0 in self::A::_#finalStaticFieldWithInitializer.==(null) ?{core::int} self::A::_#finalStaticFieldWithInitializer = #t14 : throw new _in::LateInitializationErrorImpl::•("Field 'finalStaticFieldWithInitializer' has been assigned during initialization.") : #t13{core::int};
+    return let final core::int? #t13 = self::A::_#finalStaticFieldWithInitializer in #t13.==(null) ?{core::int} let final core::int #t14 = 0 in self::A::_#finalStaticFieldWithInitializer.==(null) ?{core::int} self::A::_#finalStaticFieldWithInitializer = #t14 : throw new _in::LateError::fieldADI("finalStaticFieldWithInitializer") : #t13{core::int};
 }
 abstract class B extends core::Object /*isMixinDeclaration*/  {
   field core::int? _#B#instanceField = null;
@@ -72,46 +72,46 @@
   static field core::int? _#finalStaticFieldWithInitializer = null;
   @#C1
   get instanceField() → core::int
-    return let final core::int? #t15 = this.{self::B::_#B#instanceField} in #t15.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'instanceField' has not been initialized.") : #t15{core::int};
+    return let final core::int? #t15 = this.{self::B::_#B#instanceField} in #t15.==(null) ?{core::int} throw new _in::LateError::fieldNI("instanceField") : #t15{core::int};
   @#C1
   set instanceField(core::int #t16) → void
     this.{self::B::_#B#instanceField} = #t16;
   @#C1
   get finalInstanceField() → core::int
-    return let final core::int? #t17 = this.{self::B::_#B#finalInstanceField} in #t17.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'finalInstanceField' has not been initialized.") : #t17{core::int};
+    return let final core::int? #t17 = this.{self::B::_#B#finalInstanceField} in #t17.==(null) ?{core::int} throw new _in::LateError::fieldNI("finalInstanceField") : #t17{core::int};
   @#C1
   set finalInstanceField(core::int #t18) → void
     if(this.{self::B::_#B#finalInstanceField}.==(null))
       this.{self::B::_#B#finalInstanceField} = #t18;
     else
-      throw new _in::LateInitializationErrorImpl::•("Field 'finalInstanceField' has already been initialized.");
+      throw new _in::LateError::fieldAI("finalInstanceField");
   @#C1
   get finalInstanceFieldWithInitializer() → core::int
-    return let final core::int? #t19 = this.{self::B::_#B#finalInstanceFieldWithInitializer} in #t19.==(null) ?{core::int} let final core::int #t20 = 0 in this.{self::B::_#B#finalInstanceFieldWithInitializer}.==(null) ?{core::int} this.{self::B::_#B#finalInstanceFieldWithInitializer} = #t20 : throw new _in::LateInitializationErrorImpl::•("Field 'finalInstanceFieldWithInitializer' has been assigned during initialization.") : #t19{core::int};
+    return let final core::int? #t19 = this.{self::B::_#B#finalInstanceFieldWithInitializer} in #t19.==(null) ?{core::int} let final core::int #t20 = 0 in this.{self::B::_#B#finalInstanceFieldWithInitializer}.==(null) ?{core::int} this.{self::B::_#B#finalInstanceFieldWithInitializer} = #t20 : throw new _in::LateError::fieldADI("finalInstanceFieldWithInitializer") : #t19{core::int};
   @#C1
   get covariantInstanceField() → core::num
-    return let final core::num? #t21 = this.{self::B::_#B#covariantInstanceField} in #t21.==(null) ?{core::num} throw new _in::LateInitializationErrorImpl::•("Field 'covariantInstanceField' has not been initialized.") : #t21{core::num};
+    return let final core::num? #t21 = this.{self::B::_#B#covariantInstanceField} in #t21.==(null) ?{core::num} throw new _in::LateError::fieldNI("covariantInstanceField") : #t21{core::num};
   @#C1
   set covariantInstanceField(covariant core::num #t22) → void
     this.{self::B::_#B#covariantInstanceField} = #t22;
   @#C1
   static get staticField() → core::int
-    return let final core::int? #t23 = self::B::_#staticField in #t23.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'staticField' has not been initialized.") : #t23{core::int};
+    return let final core::int? #t23 = self::B::_#staticField in #t23.==(null) ?{core::int} throw new _in::LateError::fieldNI("staticField") : #t23{core::int};
   @#C1
   static set staticField(core::int #t24) → void
     self::B::_#staticField = #t24;
   @#C1
   static get finalStaticField() → core::int
-    return let final core::int? #t25 = self::B::_#finalStaticField in #t25.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'finalStaticField' has not been initialized.") : #t25{core::int};
+    return let final core::int? #t25 = self::B::_#finalStaticField in #t25.==(null) ?{core::int} throw new _in::LateError::fieldNI("finalStaticField") : #t25{core::int};
   @#C1
   static set finalStaticField(core::int #t26) → void
     if(self::B::_#finalStaticField.==(null))
       self::B::_#finalStaticField = #t26;
     else
-      throw new _in::LateInitializationErrorImpl::•("Field 'finalStaticField' has already been initialized.");
+      throw new _in::LateError::fieldAI("finalStaticField");
   @#C1
   static get finalStaticFieldWithInitializer() → core::int
-    return let final core::int? #t27 = self::B::_#finalStaticFieldWithInitializer in #t27.==(null) ?{core::int} let final core::int #t28 = 0 in self::B::_#finalStaticFieldWithInitializer.==(null) ?{core::int} self::B::_#finalStaticFieldWithInitializer = #t28 : throw new _in::LateInitializationErrorImpl::•("Field 'finalStaticFieldWithInitializer' has been assigned during initialization.") : #t27{core::int};
+    return let final core::int? #t27 = self::B::_#finalStaticFieldWithInitializer in #t27.==(null) ?{core::int} let final core::int #t28 = 0 in self::B::_#finalStaticFieldWithInitializer.==(null) ?{core::int} self::B::_#finalStaticFieldWithInitializer = #t28 : throw new _in::LateError::fieldADI("finalStaticFieldWithInitializer") : #t27{core::int};
 }
 extension Extension on self::A {
   static field extensionStaticField = self::_#Extension|extensionStaticField;
@@ -131,40 +131,40 @@
 static field core::int? _#Extension|finalExtensionStaticFieldWithInitializer = null;
 @#C1
 static get topLevelField() → core::int
-  return let final core::int? #t29 = self::_#topLevelField in #t29.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'topLevelField' has not been initialized.") : #t29{core::int};
+  return let final core::int? #t29 = self::_#topLevelField in #t29.==(null) ?{core::int} throw new _in::LateError::fieldNI("topLevelField") : #t29{core::int};
 @#C1
 static set topLevelField(core::int #t30) → void
   self::_#topLevelField = #t30;
 @#C1
 static get finalTopLevelField() → core::int
-  return let final core::int? #t31 = self::_#finalTopLevelField in #t31.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'finalTopLevelField' has not been initialized.") : #t31{core::int};
+  return let final core::int? #t31 = self::_#finalTopLevelField in #t31.==(null) ?{core::int} throw new _in::LateError::fieldNI("finalTopLevelField") : #t31{core::int};
 @#C1
 static set finalTopLevelField(core::int #t32) → void
   if(self::_#finalTopLevelField.==(null))
     self::_#finalTopLevelField = #t32;
   else
-    throw new _in::LateInitializationErrorImpl::•("Field 'finalTopLevelField' has already been initialized.");
+    throw new _in::LateError::fieldAI("finalTopLevelField");
 @#C1
 static get finalTopLevelFieldWithInitializer() → core::int
-  return let final core::int? #t33 = self::_#finalTopLevelFieldWithInitializer in #t33.==(null) ?{core::int} let final core::int #t34 = 0 in self::_#finalTopLevelFieldWithInitializer.==(null) ?{core::int} self::_#finalTopLevelFieldWithInitializer = #t34 : throw new _in::LateInitializationErrorImpl::•("Field 'finalTopLevelFieldWithInitializer' has been assigned during initialization.") : #t33{core::int};
+  return let final core::int? #t33 = self::_#finalTopLevelFieldWithInitializer in #t33.==(null) ?{core::int} let final core::int #t34 = 0 in self::_#finalTopLevelFieldWithInitializer.==(null) ?{core::int} self::_#finalTopLevelFieldWithInitializer = #t34 : throw new _in::LateError::fieldADI("finalTopLevelFieldWithInitializer") : #t33{core::int};
 @#C1
 static get Extension|extensionStaticField() → core::int
-  return let final core::int? #t35 = self::_#Extension|extensionStaticField in #t35.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'extensionStaticField' has not been initialized.") : #t35{core::int};
+  return let final core::int? #t35 = self::_#Extension|extensionStaticField in #t35.==(null) ?{core::int} throw new _in::LateError::fieldNI("extensionStaticField") : #t35{core::int};
 @#C1
 static set Extension|extensionStaticField(core::int #t36) → void
   self::_#Extension|extensionStaticField = #t36;
 @#C1
 static get Extension|finalExtensionStaticField() → core::int
-  return let final core::int? #t37 = self::_#Extension|finalExtensionStaticField in #t37.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'finalExtensionStaticField' has not been initialized.") : #t37{core::int};
+  return let final core::int? #t37 = self::_#Extension|finalExtensionStaticField in #t37.==(null) ?{core::int} throw new _in::LateError::fieldNI("finalExtensionStaticField") : #t37{core::int};
 @#C1
 static set Extension|finalExtensionStaticField(core::int #t38) → void
   if(self::_#Extension|finalExtensionStaticField.==(null))
     self::_#Extension|finalExtensionStaticField = #t38;
   else
-    throw new _in::LateInitializationErrorImpl::•("Field 'finalExtensionStaticField' has already been initialized.");
+    throw new _in::LateError::fieldAI("finalExtensionStaticField");
 @#C1
 static get Extension|finalExtensionStaticFieldWithInitializer() → core::int
-  return let final core::int? #t39 = self::_#Extension|finalExtensionStaticFieldWithInitializer in #t39.==(null) ?{core::int} let final core::int #t40 = 0 in self::_#Extension|finalExtensionStaticFieldWithInitializer.==(null) ?{core::int} self::_#Extension|finalExtensionStaticFieldWithInitializer = #t40 : throw new _in::LateInitializationErrorImpl::•("Field 'finalExtensionStaticFieldWithInitializer' has been assigned during initialization.") : #t39{core::int};
+  return let final core::int? #t39 = self::_#Extension|finalExtensionStaticFieldWithInitializer in #t39.==(null) ?{core::int} let final core::int #t40 = 0 in self::_#Extension|finalExtensionStaticFieldWithInitializer.==(null) ?{core::int} self::_#Extension|finalExtensionStaticFieldWithInitializer = #t40 : throw new _in::LateError::fieldADI("finalExtensionStaticFieldWithInitializer") : #t39{core::int};
 static method main() → dynamic {}
 
 constants  {
diff --git a/pkg/front_end/testcases/late_lowering/late_annotations.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/late_annotations.dart.strong.transformed.expect
index 4555905..f9033f9 100644
--- a/pkg/front_end/testcases/late_lowering/late_annotations.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/late_annotations.dart.strong.transformed.expect
@@ -21,46 +21,46 @@
     ;
   @#C1
   get instanceField() → core::int
-    return let final core::int? #t1 = this.{self::A::_#A#instanceField} in #t1.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'instanceField' has not been initialized.") : #t1{core::int};
+    return let final core::int? #t1 = this.{self::A::_#A#instanceField} in #t1.==(null) ?{core::int} throw new _in::LateError::fieldNI("instanceField") : #t1{core::int};
   @#C1
   set instanceField(core::int #t2) → void
     this.{self::A::_#A#instanceField} = #t2;
   @#C1
   get finalInstanceField() → core::int
-    return let final core::int? #t3 = this.{self::A::_#A#finalInstanceField} in #t3.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'finalInstanceField' has not been initialized.") : #t3{core::int};
+    return let final core::int? #t3 = this.{self::A::_#A#finalInstanceField} in #t3.==(null) ?{core::int} throw new _in::LateError::fieldNI("finalInstanceField") : #t3{core::int};
   @#C1
   set finalInstanceField(core::int #t4) → void
     if(this.{self::A::_#A#finalInstanceField}.==(null))
       this.{self::A::_#A#finalInstanceField} = #t4;
     else
-      throw new _in::LateInitializationErrorImpl::•("Field 'finalInstanceField' has already been initialized.");
+      throw new _in::LateError::fieldAI("finalInstanceField");
   @#C1
   get finalInstanceFieldWithInitializer() → core::int
-    return let final core::int? #t5 = this.{self::A::_#A#finalInstanceFieldWithInitializer} in #t5.==(null) ?{core::int} let final core::int #t6 = 0 in this.{self::A::_#A#finalInstanceFieldWithInitializer}.==(null) ?{core::int} this.{self::A::_#A#finalInstanceFieldWithInitializer} = #t6 : throw new _in::LateInitializationErrorImpl::•("Field 'finalInstanceFieldWithInitializer' has been assigned during initialization.") : #t5{core::int};
+    return let final core::int? #t5 = this.{self::A::_#A#finalInstanceFieldWithInitializer} in #t5.==(null) ?{core::int} let final core::int #t6 = 0 in this.{self::A::_#A#finalInstanceFieldWithInitializer}.==(null) ?{core::int} this.{self::A::_#A#finalInstanceFieldWithInitializer} = #t6 : throw new _in::LateError::fieldADI("finalInstanceFieldWithInitializer") : #t5{core::int};
   @#C1
   get covariantInstanceField() → core::num
-    return let final core::num? #t7 = this.{self::A::_#A#covariantInstanceField} in #t7.==(null) ?{core::num} throw new _in::LateInitializationErrorImpl::•("Field 'covariantInstanceField' has not been initialized.") : #t7{core::num};
+    return let final core::num? #t7 = this.{self::A::_#A#covariantInstanceField} in #t7.==(null) ?{core::num} throw new _in::LateError::fieldNI("covariantInstanceField") : #t7{core::num};
   @#C1
   set covariantInstanceField(covariant core::num #t8) → void
     this.{self::A::_#A#covariantInstanceField} = #t8;
   @#C1
   static get staticField() → core::int
-    return let final core::int? #t9 = self::A::_#staticField in #t9.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'staticField' has not been initialized.") : #t9{core::int};
+    return let final core::int? #t9 = self::A::_#staticField in #t9.==(null) ?{core::int} throw new _in::LateError::fieldNI("staticField") : #t9{core::int};
   @#C1
   static set staticField(core::int #t10) → void
     self::A::_#staticField = #t10;
   @#C1
   static get finalStaticField() → core::int
-    return let final core::int? #t11 = self::A::_#finalStaticField in #t11.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'finalStaticField' has not been initialized.") : #t11{core::int};
+    return let final core::int? #t11 = self::A::_#finalStaticField in #t11.==(null) ?{core::int} throw new _in::LateError::fieldNI("finalStaticField") : #t11{core::int};
   @#C1
   static set finalStaticField(core::int #t12) → void
     if(self::A::_#finalStaticField.==(null))
       self::A::_#finalStaticField = #t12;
     else
-      throw new _in::LateInitializationErrorImpl::•("Field 'finalStaticField' has already been initialized.");
+      throw new _in::LateError::fieldAI("finalStaticField");
   @#C1
   static get finalStaticFieldWithInitializer() → core::int
-    return let final core::int? #t13 = self::A::_#finalStaticFieldWithInitializer in #t13.==(null) ?{core::int} let final core::int #t14 = 0 in self::A::_#finalStaticFieldWithInitializer.==(null) ?{core::int} self::A::_#finalStaticFieldWithInitializer = #t14 : throw new _in::LateInitializationErrorImpl::•("Field 'finalStaticFieldWithInitializer' has been assigned during initialization.") : #t13{core::int};
+    return let final core::int? #t13 = self::A::_#finalStaticFieldWithInitializer in #t13.==(null) ?{core::int} let final core::int #t14 = 0 in self::A::_#finalStaticFieldWithInitializer.==(null) ?{core::int} self::A::_#finalStaticFieldWithInitializer = #t14 : throw new _in::LateError::fieldADI("finalStaticFieldWithInitializer") : #t13{core::int};
 }
 abstract class B extends core::Object /*isMixinDeclaration*/  {
   field core::int? _#B#instanceField = null;
@@ -72,46 +72,46 @@
   static field core::int? _#finalStaticFieldWithInitializer = null;
   @#C1
   get instanceField() → core::int
-    return let final core::int? #t15 = this.{self::B::_#B#instanceField} in #t15.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'instanceField' has not been initialized.") : #t15{core::int};
+    return let final core::int? #t15 = this.{self::B::_#B#instanceField} in #t15.==(null) ?{core::int} throw new _in::LateError::fieldNI("instanceField") : #t15{core::int};
   @#C1
   set instanceField(core::int #t16) → void
     this.{self::B::_#B#instanceField} = #t16;
   @#C1
   get finalInstanceField() → core::int
-    return let final core::int? #t17 = this.{self::B::_#B#finalInstanceField} in #t17.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'finalInstanceField' has not been initialized.") : #t17{core::int};
+    return let final core::int? #t17 = this.{self::B::_#B#finalInstanceField} in #t17.==(null) ?{core::int} throw new _in::LateError::fieldNI("finalInstanceField") : #t17{core::int};
   @#C1
   set finalInstanceField(core::int #t18) → void
     if(this.{self::B::_#B#finalInstanceField}.==(null))
       this.{self::B::_#B#finalInstanceField} = #t18;
     else
-      throw new _in::LateInitializationErrorImpl::•("Field 'finalInstanceField' has already been initialized.");
+      throw new _in::LateError::fieldAI("finalInstanceField");
   @#C1
   get finalInstanceFieldWithInitializer() → core::int
-    return let final core::int? #t19 = this.{self::B::_#B#finalInstanceFieldWithInitializer} in #t19.==(null) ?{core::int} let final core::int #t20 = 0 in this.{self::B::_#B#finalInstanceFieldWithInitializer}.==(null) ?{core::int} this.{self::B::_#B#finalInstanceFieldWithInitializer} = #t20 : throw new _in::LateInitializationErrorImpl::•("Field 'finalInstanceFieldWithInitializer' has been assigned during initialization.") : #t19{core::int};
+    return let final core::int? #t19 = this.{self::B::_#B#finalInstanceFieldWithInitializer} in #t19.==(null) ?{core::int} let final core::int #t20 = 0 in this.{self::B::_#B#finalInstanceFieldWithInitializer}.==(null) ?{core::int} this.{self::B::_#B#finalInstanceFieldWithInitializer} = #t20 : throw new _in::LateError::fieldADI("finalInstanceFieldWithInitializer") : #t19{core::int};
   @#C1
   get covariantInstanceField() → core::num
-    return let final core::num? #t21 = this.{self::B::_#B#covariantInstanceField} in #t21.==(null) ?{core::num} throw new _in::LateInitializationErrorImpl::•("Field 'covariantInstanceField' has not been initialized.") : #t21{core::num};
+    return let final core::num? #t21 = this.{self::B::_#B#covariantInstanceField} in #t21.==(null) ?{core::num} throw new _in::LateError::fieldNI("covariantInstanceField") : #t21{core::num};
   @#C1
   set covariantInstanceField(covariant core::num #t22) → void
     this.{self::B::_#B#covariantInstanceField} = #t22;
   @#C1
   static get staticField() → core::int
-    return let final core::int? #t23 = self::B::_#staticField in #t23.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'staticField' has not been initialized.") : #t23{core::int};
+    return let final core::int? #t23 = self::B::_#staticField in #t23.==(null) ?{core::int} throw new _in::LateError::fieldNI("staticField") : #t23{core::int};
   @#C1
   static set staticField(core::int #t24) → void
     self::B::_#staticField = #t24;
   @#C1
   static get finalStaticField() → core::int
-    return let final core::int? #t25 = self::B::_#finalStaticField in #t25.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'finalStaticField' has not been initialized.") : #t25{core::int};
+    return let final core::int? #t25 = self::B::_#finalStaticField in #t25.==(null) ?{core::int} throw new _in::LateError::fieldNI("finalStaticField") : #t25{core::int};
   @#C1
   static set finalStaticField(core::int #t26) → void
     if(self::B::_#finalStaticField.==(null))
       self::B::_#finalStaticField = #t26;
     else
-      throw new _in::LateInitializationErrorImpl::•("Field 'finalStaticField' has already been initialized.");
+      throw new _in::LateError::fieldAI("finalStaticField");
   @#C1
   static get finalStaticFieldWithInitializer() → core::int
-    return let final core::int? #t27 = self::B::_#finalStaticFieldWithInitializer in #t27.==(null) ?{core::int} let final core::int #t28 = 0 in self::B::_#finalStaticFieldWithInitializer.==(null) ?{core::int} self::B::_#finalStaticFieldWithInitializer = #t28 : throw new _in::LateInitializationErrorImpl::•("Field 'finalStaticFieldWithInitializer' has been assigned during initialization.") : #t27{core::int};
+    return let final core::int? #t27 = self::B::_#finalStaticFieldWithInitializer in #t27.==(null) ?{core::int} let final core::int #t28 = 0 in self::B::_#finalStaticFieldWithInitializer.==(null) ?{core::int} self::B::_#finalStaticFieldWithInitializer = #t28 : throw new _in::LateError::fieldADI("finalStaticFieldWithInitializer") : #t27{core::int};
 }
 extension Extension on self::A {
   static field extensionStaticField = self::_#Extension|extensionStaticField;
@@ -131,40 +131,40 @@
 static field core::int? _#Extension|finalExtensionStaticFieldWithInitializer = null;
 @#C1
 static get topLevelField() → core::int
-  return let final core::int? #t29 = self::_#topLevelField in #t29.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'topLevelField' has not been initialized.") : #t29{core::int};
+  return let final core::int? #t29 = self::_#topLevelField in #t29.==(null) ?{core::int} throw new _in::LateError::fieldNI("topLevelField") : #t29{core::int};
 @#C1
 static set topLevelField(core::int #t30) → void
   self::_#topLevelField = #t30;
 @#C1
 static get finalTopLevelField() → core::int
-  return let final core::int? #t31 = self::_#finalTopLevelField in #t31.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'finalTopLevelField' has not been initialized.") : #t31{core::int};
+  return let final core::int? #t31 = self::_#finalTopLevelField in #t31.==(null) ?{core::int} throw new _in::LateError::fieldNI("finalTopLevelField") : #t31{core::int};
 @#C1
 static set finalTopLevelField(core::int #t32) → void
   if(self::_#finalTopLevelField.==(null))
     self::_#finalTopLevelField = #t32;
   else
-    throw new _in::LateInitializationErrorImpl::•("Field 'finalTopLevelField' has already been initialized.");
+    throw new _in::LateError::fieldAI("finalTopLevelField");
 @#C1
 static get finalTopLevelFieldWithInitializer() → core::int
-  return let final core::int? #t33 = self::_#finalTopLevelFieldWithInitializer in #t33.==(null) ?{core::int} let final core::int #t34 = 0 in self::_#finalTopLevelFieldWithInitializer.==(null) ?{core::int} self::_#finalTopLevelFieldWithInitializer = #t34 : throw new _in::LateInitializationErrorImpl::•("Field 'finalTopLevelFieldWithInitializer' has been assigned during initialization.") : #t33{core::int};
+  return let final core::int? #t33 = self::_#finalTopLevelFieldWithInitializer in #t33.==(null) ?{core::int} let final core::int #t34 = 0 in self::_#finalTopLevelFieldWithInitializer.==(null) ?{core::int} self::_#finalTopLevelFieldWithInitializer = #t34 : throw new _in::LateError::fieldADI("finalTopLevelFieldWithInitializer") : #t33{core::int};
 @#C1
 static get Extension|extensionStaticField() → core::int
-  return let final core::int? #t35 = self::_#Extension|extensionStaticField in #t35.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'extensionStaticField' has not been initialized.") : #t35{core::int};
+  return let final core::int? #t35 = self::_#Extension|extensionStaticField in #t35.==(null) ?{core::int} throw new _in::LateError::fieldNI("extensionStaticField") : #t35{core::int};
 @#C1
 static set Extension|extensionStaticField(core::int #t36) → void
   self::_#Extension|extensionStaticField = #t36;
 @#C1
 static get Extension|finalExtensionStaticField() → core::int
-  return let final core::int? #t37 = self::_#Extension|finalExtensionStaticField in #t37.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'finalExtensionStaticField' has not been initialized.") : #t37{core::int};
+  return let final core::int? #t37 = self::_#Extension|finalExtensionStaticField in #t37.==(null) ?{core::int} throw new _in::LateError::fieldNI("finalExtensionStaticField") : #t37{core::int};
 @#C1
 static set Extension|finalExtensionStaticField(core::int #t38) → void
   if(self::_#Extension|finalExtensionStaticField.==(null))
     self::_#Extension|finalExtensionStaticField = #t38;
   else
-    throw new _in::LateInitializationErrorImpl::•("Field 'finalExtensionStaticField' has already been initialized.");
+    throw new _in::LateError::fieldAI("finalExtensionStaticField");
 @#C1
 static get Extension|finalExtensionStaticFieldWithInitializer() → core::int
-  return let final core::int? #t39 = self::_#Extension|finalExtensionStaticFieldWithInitializer in #t39.==(null) ?{core::int} let final core::int #t40 = 0 in self::_#Extension|finalExtensionStaticFieldWithInitializer.==(null) ?{core::int} self::_#Extension|finalExtensionStaticFieldWithInitializer = #t40 : throw new _in::LateInitializationErrorImpl::•("Field 'finalExtensionStaticFieldWithInitializer' has been assigned during initialization.") : #t39{core::int};
+  return let final core::int? #t39 = self::_#Extension|finalExtensionStaticFieldWithInitializer in #t39.==(null) ?{core::int} let final core::int #t40 = 0 in self::_#Extension|finalExtensionStaticFieldWithInitializer.==(null) ?{core::int} self::_#Extension|finalExtensionStaticFieldWithInitializer = #t40 : throw new _in::LateError::fieldADI("finalExtensionStaticFieldWithInitializer") : #t39{core::int};
 static method main() → dynamic {}
 
 constants  {
diff --git a/pkg/front_end/testcases/late_lowering/late_annotations.dart.weak.expect b/pkg/front_end/testcases/late_lowering/late_annotations.dart.weak.expect
index 89e5a3a..ad7345c 100644
--- a/pkg/front_end/testcases/late_lowering/late_annotations.dart.weak.expect
+++ b/pkg/front_end/testcases/late_lowering/late_annotations.dart.weak.expect
@@ -28,7 +28,7 @@
     ;
   @#C1
   get instanceField() → core::int
-    return this.{self::A::_#A#instanceField#isSet} ?{core::int} let final core::int? #t1 = this.{self::A::_#A#instanceField} in #t1{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'instanceField' has not been initialized.");
+    return this.{self::A::_#A#instanceField#isSet} ?{core::int} let final core::int? #t1 = this.{self::A::_#A#instanceField} in #t1{core::int} : throw new _in::LateError::fieldNI("instanceField");
   @#C1
   set instanceField(core::int #t2) → void {
     this.{self::A::_#A#instanceField#isSet} = true;
@@ -36,11 +36,11 @@
   }
   @#C1
   get finalInstanceField() → core::int
-    return this.{self::A::_#A#finalInstanceField#isSet} ?{core::int} let final core::int? #t3 = this.{self::A::_#A#finalInstanceField} in #t3{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'finalInstanceField' has not been initialized.");
+    return this.{self::A::_#A#finalInstanceField#isSet} ?{core::int} let final core::int? #t3 = this.{self::A::_#A#finalInstanceField} in #t3{core::int} : throw new _in::LateError::fieldNI("finalInstanceField");
   @#C1
   set finalInstanceField(core::int #t4) → void
     if(this.{self::A::_#A#finalInstanceField#isSet})
-      throw new _in::LateInitializationErrorImpl::•("Field 'finalInstanceField' has already been initialized.");
+      throw new _in::LateError::fieldAI("finalInstanceField");
     else {
       this.{self::A::_#A#finalInstanceField#isSet} = true;
       this.{self::A::_#A#finalInstanceField} = #t4;
@@ -50,7 +50,7 @@
     if(!this.{self::A::_#A#finalInstanceFieldWithInitializer#isSet}) {
       final core::int #t5 = 0;
       if(this.{self::A::_#A#finalInstanceFieldWithInitializer#isSet})
-        throw new _in::LateInitializationErrorImpl::•("Field 'finalInstanceFieldWithInitializer' has been assigned during initialization.");
+        throw new _in::LateError::fieldADI("finalInstanceFieldWithInitializer");
       this.{self::A::_#A#finalInstanceFieldWithInitializer} = #t5;
       this.{self::A::_#A#finalInstanceFieldWithInitializer#isSet} = true;
     }
@@ -58,7 +58,7 @@
   }
   @#C1
   get covariantInstanceField() → core::num
-    return this.{self::A::_#A#covariantInstanceField#isSet} ?{core::num} let final core::num? #t7 = this.{self::A::_#A#covariantInstanceField} in #t7{core::num} : throw new _in::LateInitializationErrorImpl::•("Field 'covariantInstanceField' has not been initialized.");
+    return this.{self::A::_#A#covariantInstanceField#isSet} ?{core::num} let final core::num? #t7 = this.{self::A::_#A#covariantInstanceField} in #t7{core::num} : throw new _in::LateError::fieldNI("covariantInstanceField");
   @#C1
   set covariantInstanceField(covariant core::num #t8) → void {
     this.{self::A::_#A#covariantInstanceField#isSet} = true;
@@ -66,7 +66,7 @@
   }
   @#C1
   static get staticField() → core::int
-    return self::A::_#staticField#isSet ?{core::int} let final core::int? #t9 = self::A::_#staticField in #t9{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'staticField' has not been initialized.");
+    return self::A::_#staticField#isSet ?{core::int} let final core::int? #t9 = self::A::_#staticField in #t9{core::int} : throw new _in::LateError::fieldNI("staticField");
   @#C1
   static set staticField(core::int #t10) → void {
     self::A::_#staticField#isSet = true;
@@ -74,11 +74,11 @@
   }
   @#C1
   static get finalStaticField() → core::int
-    return self::A::_#finalStaticField#isSet ?{core::int} let final core::int? #t11 = self::A::_#finalStaticField in #t11{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'finalStaticField' has not been initialized.");
+    return self::A::_#finalStaticField#isSet ?{core::int} let final core::int? #t11 = self::A::_#finalStaticField in #t11{core::int} : throw new _in::LateError::fieldNI("finalStaticField");
   @#C1
   static set finalStaticField(core::int #t12) → void
     if(self::A::_#finalStaticField#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Field 'finalStaticField' has already been initialized.");
+      throw new _in::LateError::fieldAI("finalStaticField");
     else {
       self::A::_#finalStaticField#isSet = true;
       self::A::_#finalStaticField = #t12;
@@ -88,7 +88,7 @@
     if(!self::A::_#finalStaticFieldWithInitializer#isSet) {
       final core::int #t13 = 0;
       if(self::A::_#finalStaticFieldWithInitializer#isSet)
-        throw new _in::LateInitializationErrorImpl::•("Field 'finalStaticFieldWithInitializer' has been assigned during initialization.");
+        throw new _in::LateError::fieldADI("finalStaticFieldWithInitializer");
       self::A::_#finalStaticFieldWithInitializer = #t13;
       self::A::_#finalStaticFieldWithInitializer#isSet = true;
     }
@@ -112,7 +112,7 @@
   static field core::bool _#finalStaticFieldWithInitializer#isSet = false;
   @#C1
   get instanceField() → core::int
-    return this.{self::B::_#B#instanceField#isSet} ?{core::int} let final core::int? #t15 = this.{self::B::_#B#instanceField} in #t15{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'instanceField' has not been initialized.");
+    return this.{self::B::_#B#instanceField#isSet} ?{core::int} let final core::int? #t15 = this.{self::B::_#B#instanceField} in #t15{core::int} : throw new _in::LateError::fieldNI("instanceField");
   @#C1
   set instanceField(core::int #t16) → void {
     this.{self::B::_#B#instanceField#isSet} = true;
@@ -120,11 +120,11 @@
   }
   @#C1
   get finalInstanceField() → core::int
-    return this.{self::B::_#B#finalInstanceField#isSet} ?{core::int} let final core::int? #t17 = this.{self::B::_#B#finalInstanceField} in #t17{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'finalInstanceField' has not been initialized.");
+    return this.{self::B::_#B#finalInstanceField#isSet} ?{core::int} let final core::int? #t17 = this.{self::B::_#B#finalInstanceField} in #t17{core::int} : throw new _in::LateError::fieldNI("finalInstanceField");
   @#C1
   set finalInstanceField(core::int #t18) → void
     if(this.{self::B::_#B#finalInstanceField#isSet})
-      throw new _in::LateInitializationErrorImpl::•("Field 'finalInstanceField' has already been initialized.");
+      throw new _in::LateError::fieldAI("finalInstanceField");
     else {
       this.{self::B::_#B#finalInstanceField#isSet} = true;
       this.{self::B::_#B#finalInstanceField} = #t18;
@@ -134,7 +134,7 @@
     if(!this.{self::B::_#B#finalInstanceFieldWithInitializer#isSet}) {
       final core::int #t19 = 0;
       if(this.{self::B::_#B#finalInstanceFieldWithInitializer#isSet})
-        throw new _in::LateInitializationErrorImpl::•("Field 'finalInstanceFieldWithInitializer' has been assigned during initialization.");
+        throw new _in::LateError::fieldADI("finalInstanceFieldWithInitializer");
       this.{self::B::_#B#finalInstanceFieldWithInitializer} = #t19;
       this.{self::B::_#B#finalInstanceFieldWithInitializer#isSet} = true;
     }
@@ -142,7 +142,7 @@
   }
   @#C1
   get covariantInstanceField() → core::num
-    return this.{self::B::_#B#covariantInstanceField#isSet} ?{core::num} let final core::num? #t21 = this.{self::B::_#B#covariantInstanceField} in #t21{core::num} : throw new _in::LateInitializationErrorImpl::•("Field 'covariantInstanceField' has not been initialized.");
+    return this.{self::B::_#B#covariantInstanceField#isSet} ?{core::num} let final core::num? #t21 = this.{self::B::_#B#covariantInstanceField} in #t21{core::num} : throw new _in::LateError::fieldNI("covariantInstanceField");
   @#C1
   set covariantInstanceField(covariant core::num #t22) → void {
     this.{self::B::_#B#covariantInstanceField#isSet} = true;
@@ -150,7 +150,7 @@
   }
   @#C1
   static get staticField() → core::int
-    return self::B::_#staticField#isSet ?{core::int} let final core::int? #t23 = self::B::_#staticField in #t23{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'staticField' has not been initialized.");
+    return self::B::_#staticField#isSet ?{core::int} let final core::int? #t23 = self::B::_#staticField in #t23{core::int} : throw new _in::LateError::fieldNI("staticField");
   @#C1
   static set staticField(core::int #t24) → void {
     self::B::_#staticField#isSet = true;
@@ -158,11 +158,11 @@
   }
   @#C1
   static get finalStaticField() → core::int
-    return self::B::_#finalStaticField#isSet ?{core::int} let final core::int? #t25 = self::B::_#finalStaticField in #t25{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'finalStaticField' has not been initialized.");
+    return self::B::_#finalStaticField#isSet ?{core::int} let final core::int? #t25 = self::B::_#finalStaticField in #t25{core::int} : throw new _in::LateError::fieldNI("finalStaticField");
   @#C1
   static set finalStaticField(core::int #t26) → void
     if(self::B::_#finalStaticField#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Field 'finalStaticField' has already been initialized.");
+      throw new _in::LateError::fieldAI("finalStaticField");
     else {
       self::B::_#finalStaticField#isSet = true;
       self::B::_#finalStaticField = #t26;
@@ -172,7 +172,7 @@
     if(!self::B::_#finalStaticFieldWithInitializer#isSet) {
       final core::int #t27 = 0;
       if(self::B::_#finalStaticFieldWithInitializer#isSet)
-        throw new _in::LateInitializationErrorImpl::•("Field 'finalStaticFieldWithInitializer' has been assigned during initialization.");
+        throw new _in::LateError::fieldADI("finalStaticFieldWithInitializer");
       self::B::_#finalStaticFieldWithInitializer = #t27;
       self::B::_#finalStaticFieldWithInitializer#isSet = true;
     }
@@ -206,7 +206,7 @@
 static field core::bool _#Extension|finalExtensionStaticFieldWithInitializer#isSet = false;
 @#C1
 static get topLevelField() → core::int
-  return self::_#topLevelField#isSet ?{core::int} let final core::int? #t29 = self::_#topLevelField in #t29{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'topLevelField' has not been initialized.");
+  return self::_#topLevelField#isSet ?{core::int} let final core::int? #t29 = self::_#topLevelField in #t29{core::int} : throw new _in::LateError::fieldNI("topLevelField");
 @#C1
 static set topLevelField(core::int #t30) → void {
   self::_#topLevelField#isSet = true;
@@ -214,11 +214,11 @@
 }
 @#C1
 static get finalTopLevelField() → core::int
-  return self::_#finalTopLevelField#isSet ?{core::int} let final core::int? #t31 = self::_#finalTopLevelField in #t31{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'finalTopLevelField' has not been initialized.");
+  return self::_#finalTopLevelField#isSet ?{core::int} let final core::int? #t31 = self::_#finalTopLevelField in #t31{core::int} : throw new _in::LateError::fieldNI("finalTopLevelField");
 @#C1
 static set finalTopLevelField(core::int #t32) → void
   if(self::_#finalTopLevelField#isSet)
-    throw new _in::LateInitializationErrorImpl::•("Field 'finalTopLevelField' has already been initialized.");
+    throw new _in::LateError::fieldAI("finalTopLevelField");
   else {
     self::_#finalTopLevelField#isSet = true;
     self::_#finalTopLevelField = #t32;
@@ -228,7 +228,7 @@
   if(!self::_#finalTopLevelFieldWithInitializer#isSet) {
     final core::int #t33 = 0;
     if(self::_#finalTopLevelFieldWithInitializer#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Field 'finalTopLevelFieldWithInitializer' has been assigned during initialization.");
+      throw new _in::LateError::fieldADI("finalTopLevelFieldWithInitializer");
     self::_#finalTopLevelFieldWithInitializer = #t33;
     self::_#finalTopLevelFieldWithInitializer#isSet = true;
   }
@@ -236,7 +236,7 @@
 }
 @#C1
 static get Extension|extensionStaticField() → core::int
-  return self::_#Extension|extensionStaticField#isSet ?{core::int} let final core::int? #t35 = self::_#Extension|extensionStaticField in #t35{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'extensionStaticField' has not been initialized.");
+  return self::_#Extension|extensionStaticField#isSet ?{core::int} let final core::int? #t35 = self::_#Extension|extensionStaticField in #t35{core::int} : throw new _in::LateError::fieldNI("extensionStaticField");
 @#C1
 static set Extension|extensionStaticField(core::int #t36) → void {
   self::_#Extension|extensionStaticField#isSet = true;
@@ -244,11 +244,11 @@
 }
 @#C1
 static get Extension|finalExtensionStaticField() → core::int
-  return self::_#Extension|finalExtensionStaticField#isSet ?{core::int} let final core::int? #t37 = self::_#Extension|finalExtensionStaticField in #t37{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'finalExtensionStaticField' has not been initialized.");
+  return self::_#Extension|finalExtensionStaticField#isSet ?{core::int} let final core::int? #t37 = self::_#Extension|finalExtensionStaticField in #t37{core::int} : throw new _in::LateError::fieldNI("finalExtensionStaticField");
 @#C1
 static set Extension|finalExtensionStaticField(core::int #t38) → void
   if(self::_#Extension|finalExtensionStaticField#isSet)
-    throw new _in::LateInitializationErrorImpl::•("Field 'finalExtensionStaticField' has already been initialized.");
+    throw new _in::LateError::fieldAI("finalExtensionStaticField");
   else {
     self::_#Extension|finalExtensionStaticField#isSet = true;
     self::_#Extension|finalExtensionStaticField = #t38;
@@ -258,7 +258,7 @@
   if(!self::_#Extension|finalExtensionStaticFieldWithInitializer#isSet) {
     final core::int #t39 = 0;
     if(self::_#Extension|finalExtensionStaticFieldWithInitializer#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Field 'finalExtensionStaticFieldWithInitializer' has been assigned during initialization.");
+      throw new _in::LateError::fieldADI("finalExtensionStaticFieldWithInitializer");
     self::_#Extension|finalExtensionStaticFieldWithInitializer = #t39;
     self::_#Extension|finalExtensionStaticFieldWithInitializer#isSet = true;
   }
diff --git a/pkg/front_end/testcases/late_lowering/late_annotations.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/late_annotations.dart.weak.transformed.expect
index 89e5a3a..ad7345c 100644
--- a/pkg/front_end/testcases/late_lowering/late_annotations.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/late_annotations.dart.weak.transformed.expect
@@ -28,7 +28,7 @@
     ;
   @#C1
   get instanceField() → core::int
-    return this.{self::A::_#A#instanceField#isSet} ?{core::int} let final core::int? #t1 = this.{self::A::_#A#instanceField} in #t1{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'instanceField' has not been initialized.");
+    return this.{self::A::_#A#instanceField#isSet} ?{core::int} let final core::int? #t1 = this.{self::A::_#A#instanceField} in #t1{core::int} : throw new _in::LateError::fieldNI("instanceField");
   @#C1
   set instanceField(core::int #t2) → void {
     this.{self::A::_#A#instanceField#isSet} = true;
@@ -36,11 +36,11 @@
   }
   @#C1
   get finalInstanceField() → core::int
-    return this.{self::A::_#A#finalInstanceField#isSet} ?{core::int} let final core::int? #t3 = this.{self::A::_#A#finalInstanceField} in #t3{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'finalInstanceField' has not been initialized.");
+    return this.{self::A::_#A#finalInstanceField#isSet} ?{core::int} let final core::int? #t3 = this.{self::A::_#A#finalInstanceField} in #t3{core::int} : throw new _in::LateError::fieldNI("finalInstanceField");
   @#C1
   set finalInstanceField(core::int #t4) → void
     if(this.{self::A::_#A#finalInstanceField#isSet})
-      throw new _in::LateInitializationErrorImpl::•("Field 'finalInstanceField' has already been initialized.");
+      throw new _in::LateError::fieldAI("finalInstanceField");
     else {
       this.{self::A::_#A#finalInstanceField#isSet} = true;
       this.{self::A::_#A#finalInstanceField} = #t4;
@@ -50,7 +50,7 @@
     if(!this.{self::A::_#A#finalInstanceFieldWithInitializer#isSet}) {
       final core::int #t5 = 0;
       if(this.{self::A::_#A#finalInstanceFieldWithInitializer#isSet})
-        throw new _in::LateInitializationErrorImpl::•("Field 'finalInstanceFieldWithInitializer' has been assigned during initialization.");
+        throw new _in::LateError::fieldADI("finalInstanceFieldWithInitializer");
       this.{self::A::_#A#finalInstanceFieldWithInitializer} = #t5;
       this.{self::A::_#A#finalInstanceFieldWithInitializer#isSet} = true;
     }
@@ -58,7 +58,7 @@
   }
   @#C1
   get covariantInstanceField() → core::num
-    return this.{self::A::_#A#covariantInstanceField#isSet} ?{core::num} let final core::num? #t7 = this.{self::A::_#A#covariantInstanceField} in #t7{core::num} : throw new _in::LateInitializationErrorImpl::•("Field 'covariantInstanceField' has not been initialized.");
+    return this.{self::A::_#A#covariantInstanceField#isSet} ?{core::num} let final core::num? #t7 = this.{self::A::_#A#covariantInstanceField} in #t7{core::num} : throw new _in::LateError::fieldNI("covariantInstanceField");
   @#C1
   set covariantInstanceField(covariant core::num #t8) → void {
     this.{self::A::_#A#covariantInstanceField#isSet} = true;
@@ -66,7 +66,7 @@
   }
   @#C1
   static get staticField() → core::int
-    return self::A::_#staticField#isSet ?{core::int} let final core::int? #t9 = self::A::_#staticField in #t9{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'staticField' has not been initialized.");
+    return self::A::_#staticField#isSet ?{core::int} let final core::int? #t9 = self::A::_#staticField in #t9{core::int} : throw new _in::LateError::fieldNI("staticField");
   @#C1
   static set staticField(core::int #t10) → void {
     self::A::_#staticField#isSet = true;
@@ -74,11 +74,11 @@
   }
   @#C1
   static get finalStaticField() → core::int
-    return self::A::_#finalStaticField#isSet ?{core::int} let final core::int? #t11 = self::A::_#finalStaticField in #t11{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'finalStaticField' has not been initialized.");
+    return self::A::_#finalStaticField#isSet ?{core::int} let final core::int? #t11 = self::A::_#finalStaticField in #t11{core::int} : throw new _in::LateError::fieldNI("finalStaticField");
   @#C1
   static set finalStaticField(core::int #t12) → void
     if(self::A::_#finalStaticField#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Field 'finalStaticField' has already been initialized.");
+      throw new _in::LateError::fieldAI("finalStaticField");
     else {
       self::A::_#finalStaticField#isSet = true;
       self::A::_#finalStaticField = #t12;
@@ -88,7 +88,7 @@
     if(!self::A::_#finalStaticFieldWithInitializer#isSet) {
       final core::int #t13 = 0;
       if(self::A::_#finalStaticFieldWithInitializer#isSet)
-        throw new _in::LateInitializationErrorImpl::•("Field 'finalStaticFieldWithInitializer' has been assigned during initialization.");
+        throw new _in::LateError::fieldADI("finalStaticFieldWithInitializer");
       self::A::_#finalStaticFieldWithInitializer = #t13;
       self::A::_#finalStaticFieldWithInitializer#isSet = true;
     }
@@ -112,7 +112,7 @@
   static field core::bool _#finalStaticFieldWithInitializer#isSet = false;
   @#C1
   get instanceField() → core::int
-    return this.{self::B::_#B#instanceField#isSet} ?{core::int} let final core::int? #t15 = this.{self::B::_#B#instanceField} in #t15{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'instanceField' has not been initialized.");
+    return this.{self::B::_#B#instanceField#isSet} ?{core::int} let final core::int? #t15 = this.{self::B::_#B#instanceField} in #t15{core::int} : throw new _in::LateError::fieldNI("instanceField");
   @#C1
   set instanceField(core::int #t16) → void {
     this.{self::B::_#B#instanceField#isSet} = true;
@@ -120,11 +120,11 @@
   }
   @#C1
   get finalInstanceField() → core::int
-    return this.{self::B::_#B#finalInstanceField#isSet} ?{core::int} let final core::int? #t17 = this.{self::B::_#B#finalInstanceField} in #t17{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'finalInstanceField' has not been initialized.");
+    return this.{self::B::_#B#finalInstanceField#isSet} ?{core::int} let final core::int? #t17 = this.{self::B::_#B#finalInstanceField} in #t17{core::int} : throw new _in::LateError::fieldNI("finalInstanceField");
   @#C1
   set finalInstanceField(core::int #t18) → void
     if(this.{self::B::_#B#finalInstanceField#isSet})
-      throw new _in::LateInitializationErrorImpl::•("Field 'finalInstanceField' has already been initialized.");
+      throw new _in::LateError::fieldAI("finalInstanceField");
     else {
       this.{self::B::_#B#finalInstanceField#isSet} = true;
       this.{self::B::_#B#finalInstanceField} = #t18;
@@ -134,7 +134,7 @@
     if(!this.{self::B::_#B#finalInstanceFieldWithInitializer#isSet}) {
       final core::int #t19 = 0;
       if(this.{self::B::_#B#finalInstanceFieldWithInitializer#isSet})
-        throw new _in::LateInitializationErrorImpl::•("Field 'finalInstanceFieldWithInitializer' has been assigned during initialization.");
+        throw new _in::LateError::fieldADI("finalInstanceFieldWithInitializer");
       this.{self::B::_#B#finalInstanceFieldWithInitializer} = #t19;
       this.{self::B::_#B#finalInstanceFieldWithInitializer#isSet} = true;
     }
@@ -142,7 +142,7 @@
   }
   @#C1
   get covariantInstanceField() → core::num
-    return this.{self::B::_#B#covariantInstanceField#isSet} ?{core::num} let final core::num? #t21 = this.{self::B::_#B#covariantInstanceField} in #t21{core::num} : throw new _in::LateInitializationErrorImpl::•("Field 'covariantInstanceField' has not been initialized.");
+    return this.{self::B::_#B#covariantInstanceField#isSet} ?{core::num} let final core::num? #t21 = this.{self::B::_#B#covariantInstanceField} in #t21{core::num} : throw new _in::LateError::fieldNI("covariantInstanceField");
   @#C1
   set covariantInstanceField(covariant core::num #t22) → void {
     this.{self::B::_#B#covariantInstanceField#isSet} = true;
@@ -150,7 +150,7 @@
   }
   @#C1
   static get staticField() → core::int
-    return self::B::_#staticField#isSet ?{core::int} let final core::int? #t23 = self::B::_#staticField in #t23{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'staticField' has not been initialized.");
+    return self::B::_#staticField#isSet ?{core::int} let final core::int? #t23 = self::B::_#staticField in #t23{core::int} : throw new _in::LateError::fieldNI("staticField");
   @#C1
   static set staticField(core::int #t24) → void {
     self::B::_#staticField#isSet = true;
@@ -158,11 +158,11 @@
   }
   @#C1
   static get finalStaticField() → core::int
-    return self::B::_#finalStaticField#isSet ?{core::int} let final core::int? #t25 = self::B::_#finalStaticField in #t25{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'finalStaticField' has not been initialized.");
+    return self::B::_#finalStaticField#isSet ?{core::int} let final core::int? #t25 = self::B::_#finalStaticField in #t25{core::int} : throw new _in::LateError::fieldNI("finalStaticField");
   @#C1
   static set finalStaticField(core::int #t26) → void
     if(self::B::_#finalStaticField#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Field 'finalStaticField' has already been initialized.");
+      throw new _in::LateError::fieldAI("finalStaticField");
     else {
       self::B::_#finalStaticField#isSet = true;
       self::B::_#finalStaticField = #t26;
@@ -172,7 +172,7 @@
     if(!self::B::_#finalStaticFieldWithInitializer#isSet) {
       final core::int #t27 = 0;
       if(self::B::_#finalStaticFieldWithInitializer#isSet)
-        throw new _in::LateInitializationErrorImpl::•("Field 'finalStaticFieldWithInitializer' has been assigned during initialization.");
+        throw new _in::LateError::fieldADI("finalStaticFieldWithInitializer");
       self::B::_#finalStaticFieldWithInitializer = #t27;
       self::B::_#finalStaticFieldWithInitializer#isSet = true;
     }
@@ -206,7 +206,7 @@
 static field core::bool _#Extension|finalExtensionStaticFieldWithInitializer#isSet = false;
 @#C1
 static get topLevelField() → core::int
-  return self::_#topLevelField#isSet ?{core::int} let final core::int? #t29 = self::_#topLevelField in #t29{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'topLevelField' has not been initialized.");
+  return self::_#topLevelField#isSet ?{core::int} let final core::int? #t29 = self::_#topLevelField in #t29{core::int} : throw new _in::LateError::fieldNI("topLevelField");
 @#C1
 static set topLevelField(core::int #t30) → void {
   self::_#topLevelField#isSet = true;
@@ -214,11 +214,11 @@
 }
 @#C1
 static get finalTopLevelField() → core::int
-  return self::_#finalTopLevelField#isSet ?{core::int} let final core::int? #t31 = self::_#finalTopLevelField in #t31{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'finalTopLevelField' has not been initialized.");
+  return self::_#finalTopLevelField#isSet ?{core::int} let final core::int? #t31 = self::_#finalTopLevelField in #t31{core::int} : throw new _in::LateError::fieldNI("finalTopLevelField");
 @#C1
 static set finalTopLevelField(core::int #t32) → void
   if(self::_#finalTopLevelField#isSet)
-    throw new _in::LateInitializationErrorImpl::•("Field 'finalTopLevelField' has already been initialized.");
+    throw new _in::LateError::fieldAI("finalTopLevelField");
   else {
     self::_#finalTopLevelField#isSet = true;
     self::_#finalTopLevelField = #t32;
@@ -228,7 +228,7 @@
   if(!self::_#finalTopLevelFieldWithInitializer#isSet) {
     final core::int #t33 = 0;
     if(self::_#finalTopLevelFieldWithInitializer#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Field 'finalTopLevelFieldWithInitializer' has been assigned during initialization.");
+      throw new _in::LateError::fieldADI("finalTopLevelFieldWithInitializer");
     self::_#finalTopLevelFieldWithInitializer = #t33;
     self::_#finalTopLevelFieldWithInitializer#isSet = true;
   }
@@ -236,7 +236,7 @@
 }
 @#C1
 static get Extension|extensionStaticField() → core::int
-  return self::_#Extension|extensionStaticField#isSet ?{core::int} let final core::int? #t35 = self::_#Extension|extensionStaticField in #t35{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'extensionStaticField' has not been initialized.");
+  return self::_#Extension|extensionStaticField#isSet ?{core::int} let final core::int? #t35 = self::_#Extension|extensionStaticField in #t35{core::int} : throw new _in::LateError::fieldNI("extensionStaticField");
 @#C1
 static set Extension|extensionStaticField(core::int #t36) → void {
   self::_#Extension|extensionStaticField#isSet = true;
@@ -244,11 +244,11 @@
 }
 @#C1
 static get Extension|finalExtensionStaticField() → core::int
-  return self::_#Extension|finalExtensionStaticField#isSet ?{core::int} let final core::int? #t37 = self::_#Extension|finalExtensionStaticField in #t37{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'finalExtensionStaticField' has not been initialized.");
+  return self::_#Extension|finalExtensionStaticField#isSet ?{core::int} let final core::int? #t37 = self::_#Extension|finalExtensionStaticField in #t37{core::int} : throw new _in::LateError::fieldNI("finalExtensionStaticField");
 @#C1
 static set Extension|finalExtensionStaticField(core::int #t38) → void
   if(self::_#Extension|finalExtensionStaticField#isSet)
-    throw new _in::LateInitializationErrorImpl::•("Field 'finalExtensionStaticField' has already been initialized.");
+    throw new _in::LateError::fieldAI("finalExtensionStaticField");
   else {
     self::_#Extension|finalExtensionStaticField#isSet = true;
     self::_#Extension|finalExtensionStaticField = #t38;
@@ -258,7 +258,7 @@
   if(!self::_#Extension|finalExtensionStaticFieldWithInitializer#isSet) {
     final core::int #t39 = 0;
     if(self::_#Extension|finalExtensionStaticFieldWithInitializer#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Field 'finalExtensionStaticFieldWithInitializer' has been assigned during initialization.");
+      throw new _in::LateError::fieldADI("finalExtensionStaticFieldWithInitializer");
     self::_#Extension|finalExtensionStaticFieldWithInitializer = #t39;
     self::_#Extension|finalExtensionStaticFieldWithInitializer#isSet = true;
   }
diff --git a/pkg/front_end/testcases/late_lowering/late_field_without_initializer.dart.strong.expect b/pkg/front_end/testcases/late_lowering/late_field_without_initializer.dart.strong.expect
index 28513d18..e6c2ae9 100644
--- a/pkg/front_end/testcases/late_lowering/late_field_without_initializer.dart.strong.expect
+++ b/pkg/front_end/testcases/late_lowering/late_field_without_initializer.dart.strong.expect
@@ -13,11 +13,11 @@
     : super core::Object::•()
     ;
   static get lateStaticField1() → core::int
-    return let final core::int? #t1 = self::Class::_#lateStaticField1 in #t1.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'lateStaticField1' has not been initialized.") : #t1{core::int};
+    return let final core::int? #t1 = self::Class::_#lateStaticField1 in #t1.==(null) ?{core::int} throw new _in::LateError::fieldNI("lateStaticField1") : #t1{core::int};
   static set lateStaticField1(core::int #t2) → void
     self::Class::_#lateStaticField1 = #t2;
   static get lateStaticField2() → core::int
-    return let final core::int? #t3 = self::Class::_#lateStaticField2 in #t3.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'lateStaticField2' has not been initialized.") : #t3{core::int};
+    return let final core::int? #t3 = self::Class::_#lateStaticField2 in #t3.==(null) ?{core::int} throw new _in::LateError::fieldNI("lateStaticField2") : #t3{core::int};
   static set lateStaticField2(core::int #t4) → void
     self::Class::_#lateStaticField2 = #t4;
   static method staticMethod() → dynamic {
@@ -26,11 +26,11 @@
     self::expect(42, self::Class::lateStaticField2);
   }
   get lateInstanceField() → core::int
-    return let final core::int? #t5 = this.{self::Class::_#Class#lateInstanceField} in #t5.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'lateInstanceField' has not been initialized.") : #t5{core::int};
+    return let final core::int? #t5 = this.{self::Class::_#Class#lateInstanceField} in #t5.==(null) ?{core::int} throw new _in::LateError::fieldNI("lateInstanceField") : #t5{core::int};
   set lateInstanceField(core::int #t6) → void
     this.{self::Class::_#Class#lateInstanceField} = #t6;
   get lateGenericInstanceField() → self::Class::T%
-    return this.{self::Class::_#Class#lateGenericInstanceField#isSet} ?{self::Class::T%} let final self::Class::T? #t7 = this.{self::Class::_#Class#lateGenericInstanceField} in #t7{self::Class::T%} : throw new _in::LateInitializationErrorImpl::•("Field 'lateGenericInstanceField' has not been initialized.");
+    return this.{self::Class::_#Class#lateGenericInstanceField#isSet} ?{self::Class::T%} let final self::Class::T? #t7 = this.{self::Class::_#Class#lateGenericInstanceField} in #t7{self::Class::T%} : throw new _in::LateError::fieldNI("lateGenericInstanceField");
   set lateGenericInstanceField(generic-covariant-impl self::Class::T% #t8) → void {
     this.{self::Class::_#Class#lateGenericInstanceField#isSet} = true;
     this.{self::Class::_#Class#lateGenericInstanceField} = #t8;
@@ -57,15 +57,15 @@
 static field core::int? _#Extension|lateExtensionField1 = null;
 static field core::int? _#Extension|lateExtensionField2 = null;
 static get lateTopLevelField() → core::int
-  return let final core::int? #t9 = self::_#lateTopLevelField in #t9.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'lateTopLevelField' has not been initialized.") : #t9{core::int};
+  return let final core::int? #t9 = self::_#lateTopLevelField in #t9.==(null) ?{core::int} throw new _in::LateError::fieldNI("lateTopLevelField") : #t9{core::int};
 static set lateTopLevelField(core::int #t10) → void
   self::_#lateTopLevelField = #t10;
 static get Extension|lateExtensionField1() → core::int
-  return let final core::int? #t11 = self::_#Extension|lateExtensionField1 in #t11.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'lateExtensionField1' has not been initialized.") : #t11{core::int};
+  return let final core::int? #t11 = self::_#Extension|lateExtensionField1 in #t11.==(null) ?{core::int} throw new _in::LateError::fieldNI("lateExtensionField1") : #t11{core::int};
 static set Extension|lateExtensionField1(core::int #t12) → void
   self::_#Extension|lateExtensionField1 = #t12;
 static get Extension|lateExtensionField2() → core::int
-  return let final core::int? #t13 = self::_#Extension|lateExtensionField2 in #t13.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'lateExtensionField2' has not been initialized.") : #t13{core::int};
+  return let final core::int? #t13 = self::_#Extension|lateExtensionField2 in #t13.==(null) ?{core::int} throw new _in::LateError::fieldNI("lateExtensionField2") : #t13{core::int};
 static set Extension|lateExtensionField2(core::int #t14) → void
   self::_#Extension|lateExtensionField2 = #t14;
 static method Extension|staticMethod() → dynamic {
diff --git a/pkg/front_end/testcases/late_lowering/late_field_without_initializer.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/late_field_without_initializer.dart.strong.transformed.expect
index 28513d18..e6c2ae9 100644
--- a/pkg/front_end/testcases/late_lowering/late_field_without_initializer.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/late_field_without_initializer.dart.strong.transformed.expect
@@ -13,11 +13,11 @@
     : super core::Object::•()
     ;
   static get lateStaticField1() → core::int
-    return let final core::int? #t1 = self::Class::_#lateStaticField1 in #t1.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'lateStaticField1' has not been initialized.") : #t1{core::int};
+    return let final core::int? #t1 = self::Class::_#lateStaticField1 in #t1.==(null) ?{core::int} throw new _in::LateError::fieldNI("lateStaticField1") : #t1{core::int};
   static set lateStaticField1(core::int #t2) → void
     self::Class::_#lateStaticField1 = #t2;
   static get lateStaticField2() → core::int
-    return let final core::int? #t3 = self::Class::_#lateStaticField2 in #t3.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'lateStaticField2' has not been initialized.") : #t3{core::int};
+    return let final core::int? #t3 = self::Class::_#lateStaticField2 in #t3.==(null) ?{core::int} throw new _in::LateError::fieldNI("lateStaticField2") : #t3{core::int};
   static set lateStaticField2(core::int #t4) → void
     self::Class::_#lateStaticField2 = #t4;
   static method staticMethod() → dynamic {
@@ -26,11 +26,11 @@
     self::expect(42, self::Class::lateStaticField2);
   }
   get lateInstanceField() → core::int
-    return let final core::int? #t5 = this.{self::Class::_#Class#lateInstanceField} in #t5.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'lateInstanceField' has not been initialized.") : #t5{core::int};
+    return let final core::int? #t5 = this.{self::Class::_#Class#lateInstanceField} in #t5.==(null) ?{core::int} throw new _in::LateError::fieldNI("lateInstanceField") : #t5{core::int};
   set lateInstanceField(core::int #t6) → void
     this.{self::Class::_#Class#lateInstanceField} = #t6;
   get lateGenericInstanceField() → self::Class::T%
-    return this.{self::Class::_#Class#lateGenericInstanceField#isSet} ?{self::Class::T%} let final self::Class::T? #t7 = this.{self::Class::_#Class#lateGenericInstanceField} in #t7{self::Class::T%} : throw new _in::LateInitializationErrorImpl::•("Field 'lateGenericInstanceField' has not been initialized.");
+    return this.{self::Class::_#Class#lateGenericInstanceField#isSet} ?{self::Class::T%} let final self::Class::T? #t7 = this.{self::Class::_#Class#lateGenericInstanceField} in #t7{self::Class::T%} : throw new _in::LateError::fieldNI("lateGenericInstanceField");
   set lateGenericInstanceField(generic-covariant-impl self::Class::T% #t8) → void {
     this.{self::Class::_#Class#lateGenericInstanceField#isSet} = true;
     this.{self::Class::_#Class#lateGenericInstanceField} = #t8;
@@ -57,15 +57,15 @@
 static field core::int? _#Extension|lateExtensionField1 = null;
 static field core::int? _#Extension|lateExtensionField2 = null;
 static get lateTopLevelField() → core::int
-  return let final core::int? #t9 = self::_#lateTopLevelField in #t9.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'lateTopLevelField' has not been initialized.") : #t9{core::int};
+  return let final core::int? #t9 = self::_#lateTopLevelField in #t9.==(null) ?{core::int} throw new _in::LateError::fieldNI("lateTopLevelField") : #t9{core::int};
 static set lateTopLevelField(core::int #t10) → void
   self::_#lateTopLevelField = #t10;
 static get Extension|lateExtensionField1() → core::int
-  return let final core::int? #t11 = self::_#Extension|lateExtensionField1 in #t11.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'lateExtensionField1' has not been initialized.") : #t11{core::int};
+  return let final core::int? #t11 = self::_#Extension|lateExtensionField1 in #t11.==(null) ?{core::int} throw new _in::LateError::fieldNI("lateExtensionField1") : #t11{core::int};
 static set Extension|lateExtensionField1(core::int #t12) → void
   self::_#Extension|lateExtensionField1 = #t12;
 static get Extension|lateExtensionField2() → core::int
-  return let final core::int? #t13 = self::_#Extension|lateExtensionField2 in #t13.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'lateExtensionField2' has not been initialized.") : #t13{core::int};
+  return let final core::int? #t13 = self::_#Extension|lateExtensionField2 in #t13.==(null) ?{core::int} throw new _in::LateError::fieldNI("lateExtensionField2") : #t13{core::int};
 static set Extension|lateExtensionField2(core::int #t14) → void
   self::_#Extension|lateExtensionField2 = #t14;
 static method Extension|staticMethod() → dynamic {
diff --git a/pkg/front_end/testcases/late_lowering/late_field_without_initializer.dart.weak.expect b/pkg/front_end/testcases/late_lowering/late_field_without_initializer.dart.weak.expect
index 4d4ab11..d782319 100644
--- a/pkg/front_end/testcases/late_lowering/late_field_without_initializer.dart.weak.expect
+++ b/pkg/front_end/testcases/late_lowering/late_field_without_initializer.dart.weak.expect
@@ -16,13 +16,13 @@
     : super core::Object::•()
     ;
   static get lateStaticField1() → core::int
-    return self::Class::_#lateStaticField1#isSet ?{core::int} let final core::int? #t1 = self::Class::_#lateStaticField1 in #t1{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'lateStaticField1' has not been initialized.");
+    return self::Class::_#lateStaticField1#isSet ?{core::int} let final core::int? #t1 = self::Class::_#lateStaticField1 in #t1{core::int} : throw new _in::LateError::fieldNI("lateStaticField1");
   static set lateStaticField1(core::int #t2) → void {
     self::Class::_#lateStaticField1#isSet = true;
     self::Class::_#lateStaticField1 = #t2;
   }
   static get lateStaticField2() → core::int
-    return self::Class::_#lateStaticField2#isSet ?{core::int} let final core::int? #t3 = self::Class::_#lateStaticField2 in #t3{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'lateStaticField2' has not been initialized.");
+    return self::Class::_#lateStaticField2#isSet ?{core::int} let final core::int? #t3 = self::Class::_#lateStaticField2 in #t3{core::int} : throw new _in::LateError::fieldNI("lateStaticField2");
   static set lateStaticField2(core::int #t4) → void {
     self::Class::_#lateStaticField2#isSet = true;
     self::Class::_#lateStaticField2 = #t4;
@@ -33,13 +33,13 @@
     self::expect(42, self::Class::lateStaticField2);
   }
   get lateInstanceField() → core::int
-    return this.{self::Class::_#Class#lateInstanceField#isSet} ?{core::int} let final core::int? #t5 = this.{self::Class::_#Class#lateInstanceField} in #t5{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'lateInstanceField' has not been initialized.");
+    return this.{self::Class::_#Class#lateInstanceField#isSet} ?{core::int} let final core::int? #t5 = this.{self::Class::_#Class#lateInstanceField} in #t5{core::int} : throw new _in::LateError::fieldNI("lateInstanceField");
   set lateInstanceField(core::int #t6) → void {
     this.{self::Class::_#Class#lateInstanceField#isSet} = true;
     this.{self::Class::_#Class#lateInstanceField} = #t6;
   }
   get lateGenericInstanceField() → self::Class::T%
-    return this.{self::Class::_#Class#lateGenericInstanceField#isSet} ?{self::Class::T%} let final self::Class::T? #t7 = this.{self::Class::_#Class#lateGenericInstanceField} in #t7{self::Class::T%} : throw new _in::LateInitializationErrorImpl::•("Field 'lateGenericInstanceField' has not been initialized.");
+    return this.{self::Class::_#Class#lateGenericInstanceField#isSet} ?{self::Class::T%} let final self::Class::T? #t7 = this.{self::Class::_#Class#lateGenericInstanceField} in #t7{self::Class::T%} : throw new _in::LateError::fieldNI("lateGenericInstanceField");
   set lateGenericInstanceField(generic-covariant-impl self::Class::T% #t8) → void {
     this.{self::Class::_#Class#lateGenericInstanceField#isSet} = true;
     this.{self::Class::_#Class#lateGenericInstanceField} = #t8;
@@ -71,19 +71,19 @@
 static field core::int? _#Extension|lateExtensionField2 = null;
 static field core::bool _#Extension|lateExtensionField2#isSet = false;
 static get lateTopLevelField() → core::int
-  return self::_#lateTopLevelField#isSet ?{core::int} let final core::int? #t9 = self::_#lateTopLevelField in #t9{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'lateTopLevelField' has not been initialized.");
+  return self::_#lateTopLevelField#isSet ?{core::int} let final core::int? #t9 = self::_#lateTopLevelField in #t9{core::int} : throw new _in::LateError::fieldNI("lateTopLevelField");
 static set lateTopLevelField(core::int #t10) → void {
   self::_#lateTopLevelField#isSet = true;
   self::_#lateTopLevelField = #t10;
 }
 static get Extension|lateExtensionField1() → core::int
-  return self::_#Extension|lateExtensionField1#isSet ?{core::int} let final core::int? #t11 = self::_#Extension|lateExtensionField1 in #t11{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'lateExtensionField1' has not been initialized.");
+  return self::_#Extension|lateExtensionField1#isSet ?{core::int} let final core::int? #t11 = self::_#Extension|lateExtensionField1 in #t11{core::int} : throw new _in::LateError::fieldNI("lateExtensionField1");
 static set Extension|lateExtensionField1(core::int #t12) → void {
   self::_#Extension|lateExtensionField1#isSet = true;
   self::_#Extension|lateExtensionField1 = #t12;
 }
 static get Extension|lateExtensionField2() → core::int
-  return self::_#Extension|lateExtensionField2#isSet ?{core::int} let final core::int? #t13 = self::_#Extension|lateExtensionField2 in #t13{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'lateExtensionField2' has not been initialized.");
+  return self::_#Extension|lateExtensionField2#isSet ?{core::int} let final core::int? #t13 = self::_#Extension|lateExtensionField2 in #t13{core::int} : throw new _in::LateError::fieldNI("lateExtensionField2");
 static set Extension|lateExtensionField2(core::int #t14) → void {
   self::_#Extension|lateExtensionField2#isSet = true;
   self::_#Extension|lateExtensionField2 = #t14;
diff --git a/pkg/front_end/testcases/late_lowering/late_field_without_initializer.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/late_field_without_initializer.dart.weak.transformed.expect
index 4d4ab11..d782319 100644
--- a/pkg/front_end/testcases/late_lowering/late_field_without_initializer.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/late_field_without_initializer.dart.weak.transformed.expect
@@ -16,13 +16,13 @@
     : super core::Object::•()
     ;
   static get lateStaticField1() → core::int
-    return self::Class::_#lateStaticField1#isSet ?{core::int} let final core::int? #t1 = self::Class::_#lateStaticField1 in #t1{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'lateStaticField1' has not been initialized.");
+    return self::Class::_#lateStaticField1#isSet ?{core::int} let final core::int? #t1 = self::Class::_#lateStaticField1 in #t1{core::int} : throw new _in::LateError::fieldNI("lateStaticField1");
   static set lateStaticField1(core::int #t2) → void {
     self::Class::_#lateStaticField1#isSet = true;
     self::Class::_#lateStaticField1 = #t2;
   }
   static get lateStaticField2() → core::int
-    return self::Class::_#lateStaticField2#isSet ?{core::int} let final core::int? #t3 = self::Class::_#lateStaticField2 in #t3{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'lateStaticField2' has not been initialized.");
+    return self::Class::_#lateStaticField2#isSet ?{core::int} let final core::int? #t3 = self::Class::_#lateStaticField2 in #t3{core::int} : throw new _in::LateError::fieldNI("lateStaticField2");
   static set lateStaticField2(core::int #t4) → void {
     self::Class::_#lateStaticField2#isSet = true;
     self::Class::_#lateStaticField2 = #t4;
@@ -33,13 +33,13 @@
     self::expect(42, self::Class::lateStaticField2);
   }
   get lateInstanceField() → core::int
-    return this.{self::Class::_#Class#lateInstanceField#isSet} ?{core::int} let final core::int? #t5 = this.{self::Class::_#Class#lateInstanceField} in #t5{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'lateInstanceField' has not been initialized.");
+    return this.{self::Class::_#Class#lateInstanceField#isSet} ?{core::int} let final core::int? #t5 = this.{self::Class::_#Class#lateInstanceField} in #t5{core::int} : throw new _in::LateError::fieldNI("lateInstanceField");
   set lateInstanceField(core::int #t6) → void {
     this.{self::Class::_#Class#lateInstanceField#isSet} = true;
     this.{self::Class::_#Class#lateInstanceField} = #t6;
   }
   get lateGenericInstanceField() → self::Class::T%
-    return this.{self::Class::_#Class#lateGenericInstanceField#isSet} ?{self::Class::T%} let final self::Class::T? #t7 = this.{self::Class::_#Class#lateGenericInstanceField} in #t7{self::Class::T%} : throw new _in::LateInitializationErrorImpl::•("Field 'lateGenericInstanceField' has not been initialized.");
+    return this.{self::Class::_#Class#lateGenericInstanceField#isSet} ?{self::Class::T%} let final self::Class::T? #t7 = this.{self::Class::_#Class#lateGenericInstanceField} in #t7{self::Class::T%} : throw new _in::LateError::fieldNI("lateGenericInstanceField");
   set lateGenericInstanceField(generic-covariant-impl self::Class::T% #t8) → void {
     this.{self::Class::_#Class#lateGenericInstanceField#isSet} = true;
     this.{self::Class::_#Class#lateGenericInstanceField} = #t8;
@@ -71,19 +71,19 @@
 static field core::int? _#Extension|lateExtensionField2 = null;
 static field core::bool _#Extension|lateExtensionField2#isSet = false;
 static get lateTopLevelField() → core::int
-  return self::_#lateTopLevelField#isSet ?{core::int} let final core::int? #t9 = self::_#lateTopLevelField in #t9{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'lateTopLevelField' has not been initialized.");
+  return self::_#lateTopLevelField#isSet ?{core::int} let final core::int? #t9 = self::_#lateTopLevelField in #t9{core::int} : throw new _in::LateError::fieldNI("lateTopLevelField");
 static set lateTopLevelField(core::int #t10) → void {
   self::_#lateTopLevelField#isSet = true;
   self::_#lateTopLevelField = #t10;
 }
 static get Extension|lateExtensionField1() → core::int
-  return self::_#Extension|lateExtensionField1#isSet ?{core::int} let final core::int? #t11 = self::_#Extension|lateExtensionField1 in #t11{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'lateExtensionField1' has not been initialized.");
+  return self::_#Extension|lateExtensionField1#isSet ?{core::int} let final core::int? #t11 = self::_#Extension|lateExtensionField1 in #t11{core::int} : throw new _in::LateError::fieldNI("lateExtensionField1");
 static set Extension|lateExtensionField1(core::int #t12) → void {
   self::_#Extension|lateExtensionField1#isSet = true;
   self::_#Extension|lateExtensionField1 = #t12;
 }
 static get Extension|lateExtensionField2() → core::int
-  return self::_#Extension|lateExtensionField2#isSet ?{core::int} let final core::int? #t13 = self::_#Extension|lateExtensionField2 in #t13{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'lateExtensionField2' has not been initialized.");
+  return self::_#Extension|lateExtensionField2#isSet ?{core::int} let final core::int? #t13 = self::_#Extension|lateExtensionField2 in #t13{core::int} : throw new _in::LateError::fieldNI("lateExtensionField2");
 static set Extension|lateExtensionField2(core::int #t14) → void {
   self::_#Extension|lateExtensionField2#isSet = true;
   self::_#Extension|lateExtensionField2 = #t14;
diff --git a/pkg/front_end/testcases/late_lowering/late_final_field_with_initializer.dart.strong.expect b/pkg/front_end/testcases/late_lowering/late_final_field_with_initializer.dart.strong.expect
index e1e5f51..dc87dd2 100644
--- a/pkg/front_end/testcases/late_lowering/late_final_field_with_initializer.dart.strong.expect
+++ b/pkg/front_end/testcases/late_lowering/late_final_field_with_initializer.dart.strong.expect
@@ -16,7 +16,7 @@
     : super self::B::•(x)
     ;
   get y() → core::int
-    return let final core::int? #t1 = this.{self::C::_#C#y} in #t1.==(null) ?{core::int} let final core::int #t2 = this.{self::B::x}.{core::num::+}(1) in this.{self::C::_#C#y}.==(null) ?{core::int} this.{self::C::_#C#y} = #t2 : throw new _in::LateInitializationErrorImpl::•("Field 'y' has been assigned during initialization.") : #t1{core::int};
+    return let final core::int? #t1 = this.{self::C::_#C#y} in #t1.==(null) ?{core::int} let final core::int #t2 = this.{self::B::x}.{core::num::+}(1) in this.{self::C::_#C#y}.==(null) ?{core::int} this.{self::C::_#C#y} = #t2 : throw new _in::LateError::fieldADI("y") : #t1{core::int};
   method method() → dynamic
     return this.{self::B::x};
 }
@@ -38,12 +38,12 @@
     return self::Class::lateStaticField1Init = value;
   }
   static get lateStaticField1() → core::int
-    return let final core::int? #t3 = self::Class::_#lateStaticField1 in #t3.==(null) ?{core::int} let final core::int #t4 = self::Class::initLateStaticField1(87) in self::Class::_#lateStaticField1.==(null) ?{core::int} self::Class::_#lateStaticField1 = #t4 : throw new _in::LateInitializationErrorImpl::•("Field 'lateStaticField1' has been assigned during initialization.") : #t3{core::int};
+    return let final core::int? #t3 = self::Class::_#lateStaticField1 in #t3.==(null) ?{core::int} let final core::int #t4 = self::Class::initLateStaticField1(87) in self::Class::_#lateStaticField1.==(null) ?{core::int} self::Class::_#lateStaticField1 = #t4 : throw new _in::LateError::fieldADI("lateStaticField1") : #t3{core::int};
   static method initLateStaticField2(core::int value) → core::int {
     return self::Class::lateStaticField2Init = value;
   }
   static get lateStaticField2() → core::int
-    return let final core::int? #t5 = self::Class::_#lateStaticField2 in #t5.==(null) ?{core::int} let final core::int #t6 = self::Class::initLateStaticField2(42) in self::Class::_#lateStaticField2.==(null) ?{core::int} self::Class::_#lateStaticField2 = #t6 : throw new _in::LateInitializationErrorImpl::•("Field 'lateStaticField2' has been assigned during initialization.") : #t5{core::int};
+    return let final core::int? #t5 = self::Class::_#lateStaticField2 in #t5.==(null) ?{core::int} let final core::int #t6 = self::Class::initLateStaticField2(42) in self::Class::_#lateStaticField2.==(null) ?{core::int} self::Class::_#lateStaticField2 = #t6 : throw new _in::LateError::fieldADI("lateStaticField2") : #t5{core::int};
   static method staticMethod() → dynamic {
     self::expect(null, self::Class::lateStaticField2Init);
     self::expect(42, self::Class::lateStaticField2);
@@ -53,7 +53,7 @@
     return this.{self::Class::lateInstanceFieldInit} = value;
   }
   get lateInstanceField() → core::int
-    return let final core::int? #t7 = this.{self::Class::_#Class#lateInstanceField} in #t7.==(null) ?{core::int} let final core::int #t8 = this.{self::Class::initLateInstanceField}(16) in this.{self::Class::_#Class#lateInstanceField}.==(null) ?{core::int} this.{self::Class::_#Class#lateInstanceField} = #t8 : throw new _in::LateInitializationErrorImpl::•("Field 'lateInstanceField' has been assigned during initialization.") : #t7{core::int};
+    return let final core::int? #t7 = this.{self::Class::_#Class#lateInstanceField} in #t7.==(null) ?{core::int} let final core::int #t8 = this.{self::Class::initLateInstanceField}(16) in this.{self::Class::_#Class#lateInstanceField}.==(null) ?{core::int} this.{self::Class::_#Class#lateInstanceField} = #t8 : throw new _in::LateError::fieldADI("lateInstanceField") : #t7{core::int};
   method initLateGenericField(generic-covariant-impl self::Class::T% value) → self::Class::T% {
     return this.{self::Class::lateGenericFieldInit} = value;
   }
@@ -61,7 +61,7 @@
     if(!this.{self::Class::_#Class#lateGenericField#isSet}) {
       final self::Class::T% #t9 = this.{self::Class::initLateGenericField}(this.{self::Class::field});
       if(this.{self::Class::_#Class#lateGenericField#isSet})
-        throw new _in::LateInitializationErrorImpl::•("Field 'lateGenericField' has been assigned during initialization.");
+        throw new _in::LateError::fieldADI("lateGenericField");
       this.{self::Class::_#Class#lateGenericField} = #t9;
       this.{self::Class::_#Class#lateGenericField#isSet} = true;
     }
@@ -97,17 +97,17 @@
   return self::lateTopLevelField1Init = value;
 }
 static get lateTopLevelField1() → core::int
-  return let final core::int? #t11 = self::_#lateTopLevelField1 in #t11.==(null) ?{core::int} let final core::int #t12 = self::initLateTopLevelField1(123) in self::_#lateTopLevelField1.==(null) ?{core::int} self::_#lateTopLevelField1 = #t12 : throw new _in::LateInitializationErrorImpl::•("Field 'lateTopLevelField1' has been assigned during initialization.") : #t11{core::int};
+  return let final core::int? #t11 = self::_#lateTopLevelField1 in #t11.==(null) ?{core::int} let final core::int #t12 = self::initLateTopLevelField1(123) in self::_#lateTopLevelField1.==(null) ?{core::int} self::_#lateTopLevelField1 = #t12 : throw new _in::LateError::fieldADI("lateTopLevelField1") : #t11{core::int};
 static method Extension|initLateExtensionField1(core::int value) → core::int {
   return self::Extension|lateExtensionField1Init = value;
 }
 static get Extension|lateExtensionField1() → core::int
-  return let final core::int? #t13 = self::_#Extension|lateExtensionField1 in #t13.==(null) ?{core::int} let final core::int #t14 = self::Extension|initLateExtensionField1(87) in self::_#Extension|lateExtensionField1.==(null) ?{core::int} self::_#Extension|lateExtensionField1 = #t14 : throw new _in::LateInitializationErrorImpl::•("Field 'lateExtensionField1' has been assigned during initialization.") : #t13{core::int};
+  return let final core::int? #t13 = self::_#Extension|lateExtensionField1 in #t13.==(null) ?{core::int} let final core::int #t14 = self::Extension|initLateExtensionField1(87) in self::_#Extension|lateExtensionField1.==(null) ?{core::int} self::_#Extension|lateExtensionField1 = #t14 : throw new _in::LateError::fieldADI("lateExtensionField1") : #t13{core::int};
 static method Extension|initLateExtensionField2(core::int value) → core::int {
   return self::Extension|lateExtensionField2Init = value;
 }
 static get Extension|lateExtensionField2() → core::int
-  return let final core::int? #t15 = self::_#Extension|lateExtensionField2 in #t15.==(null) ?{core::int} let final core::int #t16 = self::Extension|initLateExtensionField2(42) in self::_#Extension|lateExtensionField2.==(null) ?{core::int} self::_#Extension|lateExtensionField2 = #t16 : throw new _in::LateInitializationErrorImpl::•("Field 'lateExtensionField2' has been assigned during initialization.") : #t15{core::int};
+  return let final core::int? #t15 = self::_#Extension|lateExtensionField2 in #t15.==(null) ?{core::int} let final core::int #t16 = self::Extension|initLateExtensionField2(42) in self::_#Extension|lateExtensionField2.==(null) ?{core::int} self::_#Extension|lateExtensionField2 = #t16 : throw new _in::LateError::fieldADI("lateExtensionField2") : #t15{core::int};
 static method Extension|staticMethod() → dynamic {
   self::expect(null, self::Extension|lateExtensionField2Init);
   self::expect(42, self::Extension|lateExtensionField2);
diff --git a/pkg/front_end/testcases/late_lowering/late_final_field_with_initializer.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/late_final_field_with_initializer.dart.strong.transformed.expect
index e1e5f51..dc87dd2 100644
--- a/pkg/front_end/testcases/late_lowering/late_final_field_with_initializer.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/late_final_field_with_initializer.dart.strong.transformed.expect
@@ -16,7 +16,7 @@
     : super self::B::•(x)
     ;
   get y() → core::int
-    return let final core::int? #t1 = this.{self::C::_#C#y} in #t1.==(null) ?{core::int} let final core::int #t2 = this.{self::B::x}.{core::num::+}(1) in this.{self::C::_#C#y}.==(null) ?{core::int} this.{self::C::_#C#y} = #t2 : throw new _in::LateInitializationErrorImpl::•("Field 'y' has been assigned during initialization.") : #t1{core::int};
+    return let final core::int? #t1 = this.{self::C::_#C#y} in #t1.==(null) ?{core::int} let final core::int #t2 = this.{self::B::x}.{core::num::+}(1) in this.{self::C::_#C#y}.==(null) ?{core::int} this.{self::C::_#C#y} = #t2 : throw new _in::LateError::fieldADI("y") : #t1{core::int};
   method method() → dynamic
     return this.{self::B::x};
 }
@@ -38,12 +38,12 @@
     return self::Class::lateStaticField1Init = value;
   }
   static get lateStaticField1() → core::int
-    return let final core::int? #t3 = self::Class::_#lateStaticField1 in #t3.==(null) ?{core::int} let final core::int #t4 = self::Class::initLateStaticField1(87) in self::Class::_#lateStaticField1.==(null) ?{core::int} self::Class::_#lateStaticField1 = #t4 : throw new _in::LateInitializationErrorImpl::•("Field 'lateStaticField1' has been assigned during initialization.") : #t3{core::int};
+    return let final core::int? #t3 = self::Class::_#lateStaticField1 in #t3.==(null) ?{core::int} let final core::int #t4 = self::Class::initLateStaticField1(87) in self::Class::_#lateStaticField1.==(null) ?{core::int} self::Class::_#lateStaticField1 = #t4 : throw new _in::LateError::fieldADI("lateStaticField1") : #t3{core::int};
   static method initLateStaticField2(core::int value) → core::int {
     return self::Class::lateStaticField2Init = value;
   }
   static get lateStaticField2() → core::int
-    return let final core::int? #t5 = self::Class::_#lateStaticField2 in #t5.==(null) ?{core::int} let final core::int #t6 = self::Class::initLateStaticField2(42) in self::Class::_#lateStaticField2.==(null) ?{core::int} self::Class::_#lateStaticField2 = #t6 : throw new _in::LateInitializationErrorImpl::•("Field 'lateStaticField2' has been assigned during initialization.") : #t5{core::int};
+    return let final core::int? #t5 = self::Class::_#lateStaticField2 in #t5.==(null) ?{core::int} let final core::int #t6 = self::Class::initLateStaticField2(42) in self::Class::_#lateStaticField2.==(null) ?{core::int} self::Class::_#lateStaticField2 = #t6 : throw new _in::LateError::fieldADI("lateStaticField2") : #t5{core::int};
   static method staticMethod() → dynamic {
     self::expect(null, self::Class::lateStaticField2Init);
     self::expect(42, self::Class::lateStaticField2);
@@ -53,7 +53,7 @@
     return this.{self::Class::lateInstanceFieldInit} = value;
   }
   get lateInstanceField() → core::int
-    return let final core::int? #t7 = this.{self::Class::_#Class#lateInstanceField} in #t7.==(null) ?{core::int} let final core::int #t8 = this.{self::Class::initLateInstanceField}(16) in this.{self::Class::_#Class#lateInstanceField}.==(null) ?{core::int} this.{self::Class::_#Class#lateInstanceField} = #t8 : throw new _in::LateInitializationErrorImpl::•("Field 'lateInstanceField' has been assigned during initialization.") : #t7{core::int};
+    return let final core::int? #t7 = this.{self::Class::_#Class#lateInstanceField} in #t7.==(null) ?{core::int} let final core::int #t8 = this.{self::Class::initLateInstanceField}(16) in this.{self::Class::_#Class#lateInstanceField}.==(null) ?{core::int} this.{self::Class::_#Class#lateInstanceField} = #t8 : throw new _in::LateError::fieldADI("lateInstanceField") : #t7{core::int};
   method initLateGenericField(generic-covariant-impl self::Class::T% value) → self::Class::T% {
     return this.{self::Class::lateGenericFieldInit} = value;
   }
@@ -61,7 +61,7 @@
     if(!this.{self::Class::_#Class#lateGenericField#isSet}) {
       final self::Class::T% #t9 = this.{self::Class::initLateGenericField}(this.{self::Class::field});
       if(this.{self::Class::_#Class#lateGenericField#isSet})
-        throw new _in::LateInitializationErrorImpl::•("Field 'lateGenericField' has been assigned during initialization.");
+        throw new _in::LateError::fieldADI("lateGenericField");
       this.{self::Class::_#Class#lateGenericField} = #t9;
       this.{self::Class::_#Class#lateGenericField#isSet} = true;
     }
@@ -97,17 +97,17 @@
   return self::lateTopLevelField1Init = value;
 }
 static get lateTopLevelField1() → core::int
-  return let final core::int? #t11 = self::_#lateTopLevelField1 in #t11.==(null) ?{core::int} let final core::int #t12 = self::initLateTopLevelField1(123) in self::_#lateTopLevelField1.==(null) ?{core::int} self::_#lateTopLevelField1 = #t12 : throw new _in::LateInitializationErrorImpl::•("Field 'lateTopLevelField1' has been assigned during initialization.") : #t11{core::int};
+  return let final core::int? #t11 = self::_#lateTopLevelField1 in #t11.==(null) ?{core::int} let final core::int #t12 = self::initLateTopLevelField1(123) in self::_#lateTopLevelField1.==(null) ?{core::int} self::_#lateTopLevelField1 = #t12 : throw new _in::LateError::fieldADI("lateTopLevelField1") : #t11{core::int};
 static method Extension|initLateExtensionField1(core::int value) → core::int {
   return self::Extension|lateExtensionField1Init = value;
 }
 static get Extension|lateExtensionField1() → core::int
-  return let final core::int? #t13 = self::_#Extension|lateExtensionField1 in #t13.==(null) ?{core::int} let final core::int #t14 = self::Extension|initLateExtensionField1(87) in self::_#Extension|lateExtensionField1.==(null) ?{core::int} self::_#Extension|lateExtensionField1 = #t14 : throw new _in::LateInitializationErrorImpl::•("Field 'lateExtensionField1' has been assigned during initialization.") : #t13{core::int};
+  return let final core::int? #t13 = self::_#Extension|lateExtensionField1 in #t13.==(null) ?{core::int} let final core::int #t14 = self::Extension|initLateExtensionField1(87) in self::_#Extension|lateExtensionField1.==(null) ?{core::int} self::_#Extension|lateExtensionField1 = #t14 : throw new _in::LateError::fieldADI("lateExtensionField1") : #t13{core::int};
 static method Extension|initLateExtensionField2(core::int value) → core::int {
   return self::Extension|lateExtensionField2Init = value;
 }
 static get Extension|lateExtensionField2() → core::int
-  return let final core::int? #t15 = self::_#Extension|lateExtensionField2 in #t15.==(null) ?{core::int} let final core::int #t16 = self::Extension|initLateExtensionField2(42) in self::_#Extension|lateExtensionField2.==(null) ?{core::int} self::_#Extension|lateExtensionField2 = #t16 : throw new _in::LateInitializationErrorImpl::•("Field 'lateExtensionField2' has been assigned during initialization.") : #t15{core::int};
+  return let final core::int? #t15 = self::_#Extension|lateExtensionField2 in #t15.==(null) ?{core::int} let final core::int #t16 = self::Extension|initLateExtensionField2(42) in self::_#Extension|lateExtensionField2.==(null) ?{core::int} self::_#Extension|lateExtensionField2 = #t16 : throw new _in::LateError::fieldADI("lateExtensionField2") : #t15{core::int};
 static method Extension|staticMethod() → dynamic {
   self::expect(null, self::Extension|lateExtensionField2Init);
   self::expect(42, self::Extension|lateExtensionField2);
diff --git a/pkg/front_end/testcases/late_lowering/late_final_field_with_initializer.dart.weak.expect b/pkg/front_end/testcases/late_lowering/late_final_field_with_initializer.dart.weak.expect
index af7e11a..5d1075d 100644
--- a/pkg/front_end/testcases/late_lowering/late_final_field_with_initializer.dart.weak.expect
+++ b/pkg/front_end/testcases/late_lowering/late_final_field_with_initializer.dart.weak.expect
@@ -19,7 +19,7 @@
     if(!this.{self::C::_#C#y#isSet}) {
       final core::int #t1 = this.{self::B::x}.{core::num::+}(1);
       if(this.{self::C::_#C#y#isSet})
-        throw new _in::LateInitializationErrorImpl::•("Field 'y' has been assigned during initialization.");
+        throw new _in::LateError::fieldADI("y");
       this.{self::C::_#C#y} = #t1;
       this.{self::C::_#C#y#isSet} = true;
     }
@@ -52,7 +52,7 @@
     if(!self::Class::_#lateStaticField1#isSet) {
       final core::int #t3 = self::Class::initLateStaticField1(87);
       if(self::Class::_#lateStaticField1#isSet)
-        throw new _in::LateInitializationErrorImpl::•("Field 'lateStaticField1' has been assigned during initialization.");
+        throw new _in::LateError::fieldADI("lateStaticField1");
       self::Class::_#lateStaticField1 = #t3;
       self::Class::_#lateStaticField1#isSet = true;
     }
@@ -65,7 +65,7 @@
     if(!self::Class::_#lateStaticField2#isSet) {
       final core::int #t5 = self::Class::initLateStaticField2(42);
       if(self::Class::_#lateStaticField2#isSet)
-        throw new _in::LateInitializationErrorImpl::•("Field 'lateStaticField2' has been assigned during initialization.");
+        throw new _in::LateError::fieldADI("lateStaticField2");
       self::Class::_#lateStaticField2 = #t5;
       self::Class::_#lateStaticField2#isSet = true;
     }
@@ -83,7 +83,7 @@
     if(!this.{self::Class::_#Class#lateInstanceField#isSet}) {
       final core::int #t7 = this.{self::Class::initLateInstanceField}(16);
       if(this.{self::Class::_#Class#lateInstanceField#isSet})
-        throw new _in::LateInitializationErrorImpl::•("Field 'lateInstanceField' has been assigned during initialization.");
+        throw new _in::LateError::fieldADI("lateInstanceField");
       this.{self::Class::_#Class#lateInstanceField} = #t7;
       this.{self::Class::_#Class#lateInstanceField#isSet} = true;
     }
@@ -96,7 +96,7 @@
     if(!this.{self::Class::_#Class#lateGenericField#isSet}) {
       final self::Class::T% #t9 = this.{self::Class::initLateGenericField}(this.{self::Class::field});
       if(this.{self::Class::_#Class#lateGenericField#isSet})
-        throw new _in::LateInitializationErrorImpl::•("Field 'lateGenericField' has been assigned during initialization.");
+        throw new _in::LateError::fieldADI("lateGenericField");
       this.{self::Class::_#Class#lateGenericField} = #t9;
       this.{self::Class::_#Class#lateGenericField#isSet} = true;
     }
@@ -140,7 +140,7 @@
   if(!self::_#lateTopLevelField1#isSet) {
     final core::int #t11 = self::initLateTopLevelField1(123);
     if(self::_#lateTopLevelField1#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Field 'lateTopLevelField1' has been assigned during initialization.");
+      throw new _in::LateError::fieldADI("lateTopLevelField1");
     self::_#lateTopLevelField1 = #t11;
     self::_#lateTopLevelField1#isSet = true;
   }
@@ -153,7 +153,7 @@
   if(!self::_#Extension|lateExtensionField1#isSet) {
     final core::int #t13 = self::Extension|initLateExtensionField1(87);
     if(self::_#Extension|lateExtensionField1#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Field 'lateExtensionField1' has been assigned during initialization.");
+      throw new _in::LateError::fieldADI("lateExtensionField1");
     self::_#Extension|lateExtensionField1 = #t13;
     self::_#Extension|lateExtensionField1#isSet = true;
   }
@@ -166,7 +166,7 @@
   if(!self::_#Extension|lateExtensionField2#isSet) {
     final core::int #t15 = self::Extension|initLateExtensionField2(42);
     if(self::_#Extension|lateExtensionField2#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Field 'lateExtensionField2' has been assigned during initialization.");
+      throw new _in::LateError::fieldADI("lateExtensionField2");
     self::_#Extension|lateExtensionField2 = #t15;
     self::_#Extension|lateExtensionField2#isSet = true;
   }
diff --git a/pkg/front_end/testcases/late_lowering/late_final_field_with_initializer.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/late_final_field_with_initializer.dart.weak.transformed.expect
index af7e11a..5d1075d 100644
--- a/pkg/front_end/testcases/late_lowering/late_final_field_with_initializer.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/late_final_field_with_initializer.dart.weak.transformed.expect
@@ -19,7 +19,7 @@
     if(!this.{self::C::_#C#y#isSet}) {
       final core::int #t1 = this.{self::B::x}.{core::num::+}(1);
       if(this.{self::C::_#C#y#isSet})
-        throw new _in::LateInitializationErrorImpl::•("Field 'y' has been assigned during initialization.");
+        throw new _in::LateError::fieldADI("y");
       this.{self::C::_#C#y} = #t1;
       this.{self::C::_#C#y#isSet} = true;
     }
@@ -52,7 +52,7 @@
     if(!self::Class::_#lateStaticField1#isSet) {
       final core::int #t3 = self::Class::initLateStaticField1(87);
       if(self::Class::_#lateStaticField1#isSet)
-        throw new _in::LateInitializationErrorImpl::•("Field 'lateStaticField1' has been assigned during initialization.");
+        throw new _in::LateError::fieldADI("lateStaticField1");
       self::Class::_#lateStaticField1 = #t3;
       self::Class::_#lateStaticField1#isSet = true;
     }
@@ -65,7 +65,7 @@
     if(!self::Class::_#lateStaticField2#isSet) {
       final core::int #t5 = self::Class::initLateStaticField2(42);
       if(self::Class::_#lateStaticField2#isSet)
-        throw new _in::LateInitializationErrorImpl::•("Field 'lateStaticField2' has been assigned during initialization.");
+        throw new _in::LateError::fieldADI("lateStaticField2");
       self::Class::_#lateStaticField2 = #t5;
       self::Class::_#lateStaticField2#isSet = true;
     }
@@ -83,7 +83,7 @@
     if(!this.{self::Class::_#Class#lateInstanceField#isSet}) {
       final core::int #t7 = this.{self::Class::initLateInstanceField}(16);
       if(this.{self::Class::_#Class#lateInstanceField#isSet})
-        throw new _in::LateInitializationErrorImpl::•("Field 'lateInstanceField' has been assigned during initialization.");
+        throw new _in::LateError::fieldADI("lateInstanceField");
       this.{self::Class::_#Class#lateInstanceField} = #t7;
       this.{self::Class::_#Class#lateInstanceField#isSet} = true;
     }
@@ -96,7 +96,7 @@
     if(!this.{self::Class::_#Class#lateGenericField#isSet}) {
       final self::Class::T% #t9 = this.{self::Class::initLateGenericField}(this.{self::Class::field});
       if(this.{self::Class::_#Class#lateGenericField#isSet})
-        throw new _in::LateInitializationErrorImpl::•("Field 'lateGenericField' has been assigned during initialization.");
+        throw new _in::LateError::fieldADI("lateGenericField");
       this.{self::Class::_#Class#lateGenericField} = #t9;
       this.{self::Class::_#Class#lateGenericField#isSet} = true;
     }
@@ -140,7 +140,7 @@
   if(!self::_#lateTopLevelField1#isSet) {
     final core::int #t11 = self::initLateTopLevelField1(123);
     if(self::_#lateTopLevelField1#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Field 'lateTopLevelField1' has been assigned during initialization.");
+      throw new _in::LateError::fieldADI("lateTopLevelField1");
     self::_#lateTopLevelField1 = #t11;
     self::_#lateTopLevelField1#isSet = true;
   }
@@ -153,7 +153,7 @@
   if(!self::_#Extension|lateExtensionField1#isSet) {
     final core::int #t13 = self::Extension|initLateExtensionField1(87);
     if(self::_#Extension|lateExtensionField1#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Field 'lateExtensionField1' has been assigned during initialization.");
+      throw new _in::LateError::fieldADI("lateExtensionField1");
     self::_#Extension|lateExtensionField1 = #t13;
     self::_#Extension|lateExtensionField1#isSet = true;
   }
@@ -166,7 +166,7 @@
   if(!self::_#Extension|lateExtensionField2#isSet) {
     final core::int #t15 = self::Extension|initLateExtensionField2(42);
     if(self::_#Extension|lateExtensionField2#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Field 'lateExtensionField2' has been assigned during initialization.");
+      throw new _in::LateError::fieldADI("lateExtensionField2");
     self::_#Extension|lateExtensionField2 = #t15;
     self::_#Extension|lateExtensionField2#isSet = true;
   }
diff --git a/pkg/front_end/testcases/late_lowering/late_final_field_without_initializer.dart.strong.expect b/pkg/front_end/testcases/late_lowering/late_final_field_without_initializer.dart.strong.expect
index 6c0bb20..13abe89 100644
--- a/pkg/front_end/testcases/late_lowering/late_final_field_without_initializer.dart.strong.expect
+++ b/pkg/front_end/testcases/late_lowering/late_final_field_without_initializer.dart.strong.expect
@@ -11,19 +11,19 @@
     : super core::Object::•()
     ;
   static get lateStaticField1() → core::int
-    return let final core::int? #t1 = self::Class::_#lateStaticField1 in #t1.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'lateStaticField1' has not been initialized.") : #t1{core::int};
+    return let final core::int? #t1 = self::Class::_#lateStaticField1 in #t1.==(null) ?{core::int} throw new _in::LateError::fieldNI("lateStaticField1") : #t1{core::int};
   static set lateStaticField1(core::int #t2) → void
     if(self::Class::_#lateStaticField1.==(null))
       self::Class::_#lateStaticField1 = #t2;
     else
-      throw new _in::LateInitializationErrorImpl::•("Field 'lateStaticField1' has already been initialized.");
+      throw new _in::LateError::fieldAI("lateStaticField1");
   static get lateStaticField2() → core::int
-    return let final core::int? #t3 = self::Class::_#lateStaticField2 in #t3.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'lateStaticField2' has not been initialized.") : #t3{core::int};
+    return let final core::int? #t3 = self::Class::_#lateStaticField2 in #t3.==(null) ?{core::int} throw new _in::LateError::fieldNI("lateStaticField2") : #t3{core::int};
   static set lateStaticField2(core::int #t4) → void
     if(self::Class::_#lateStaticField2.==(null))
       self::Class::_#lateStaticField2 = #t4;
     else
-      throw new _in::LateInitializationErrorImpl::•("Field 'lateStaticField2' has already been initialized.");
+      throw new _in::LateError::fieldAI("lateStaticField2");
   static method staticMethod() → dynamic {
     self::throws(() → core::int => self::Class::lateStaticField2, "Read value from uninitialized Class.lateStaticField2");
     self::Class::lateStaticField2 = 42;
@@ -31,12 +31,12 @@
     self::throws(() → core::int => self::Class::lateStaticField2 = 43, "Write value to initialized Class.lateStaticField2");
   }
   get lateInstanceField() → core::int
-    return let final core::int? #t5 = this.{self::Class::_#Class#lateInstanceField} in #t5.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'lateInstanceField' has not been initialized.") : #t5{core::int};
+    return let final core::int? #t5 = this.{self::Class::_#Class#lateInstanceField} in #t5.==(null) ?{core::int} throw new _in::LateError::fieldNI("lateInstanceField") : #t5{core::int};
   set lateInstanceField(core::int #t6) → void
     if(this.{self::Class::_#Class#lateInstanceField}.==(null))
       this.{self::Class::_#Class#lateInstanceField} = #t6;
     else
-      throw new _in::LateInitializationErrorImpl::•("Field 'lateInstanceField' has already been initialized.");
+      throw new _in::LateError::fieldAI("lateInstanceField");
   method instanceMethod() → dynamic {
     self::throws(() → core::int => this.{self::Class::lateInstanceField}, "Read value from uninitialized Class.lateInstanceField");
     this.{self::Class::lateInstanceField} = 16;
@@ -57,26 +57,26 @@
 static field core::int? _#Extension|lateExtensionField1 = null;
 static field core::int? _#Extension|lateExtensionField2 = null;
 static get lateTopLevelField() → core::int
-  return let final core::int? #t7 = self::_#lateTopLevelField in #t7.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'lateTopLevelField' has not been initialized.") : #t7{core::int};
+  return let final core::int? #t7 = self::_#lateTopLevelField in #t7.==(null) ?{core::int} throw new _in::LateError::fieldNI("lateTopLevelField") : #t7{core::int};
 static set lateTopLevelField(core::int #t8) → void
   if(self::_#lateTopLevelField.==(null))
     self::_#lateTopLevelField = #t8;
   else
-    throw new _in::LateInitializationErrorImpl::•("Field 'lateTopLevelField' has already been initialized.");
+    throw new _in::LateError::fieldAI("lateTopLevelField");
 static get Extension|lateExtensionField1() → core::int
-  return let final core::int? #t9 = self::_#Extension|lateExtensionField1 in #t9.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'lateExtensionField1' has not been initialized.") : #t9{core::int};
+  return let final core::int? #t9 = self::_#Extension|lateExtensionField1 in #t9.==(null) ?{core::int} throw new _in::LateError::fieldNI("lateExtensionField1") : #t9{core::int};
 static set Extension|lateExtensionField1(core::int #t10) → void
   if(self::_#Extension|lateExtensionField1.==(null))
     self::_#Extension|lateExtensionField1 = #t10;
   else
-    throw new _in::LateInitializationErrorImpl::•("Field 'lateExtensionField1' has already been initialized.");
+    throw new _in::LateError::fieldAI("lateExtensionField1");
 static get Extension|lateExtensionField2() → core::int
-  return let final core::int? #t11 = self::_#Extension|lateExtensionField2 in #t11.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'lateExtensionField2' has not been initialized.") : #t11{core::int};
+  return let final core::int? #t11 = self::_#Extension|lateExtensionField2 in #t11.==(null) ?{core::int} throw new _in::LateError::fieldNI("lateExtensionField2") : #t11{core::int};
 static set Extension|lateExtensionField2(core::int #t12) → void
   if(self::_#Extension|lateExtensionField2.==(null))
     self::_#Extension|lateExtensionField2 = #t12;
   else
-    throw new _in::LateInitializationErrorImpl::•("Field 'lateExtensionField2' has already been initialized.");
+    throw new _in::LateError::fieldAI("lateExtensionField2");
 static method Extension|staticMethod() → dynamic {
   self::throws(() → core::int => self::Extension|lateExtensionField2, "Read value from uninitialized Class.lateExtensionField2");
   self::Extension|lateExtensionField2 = 42;
diff --git a/pkg/front_end/testcases/late_lowering/late_final_field_without_initializer.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/late_final_field_without_initializer.dart.strong.transformed.expect
index 6c0bb20..13abe89 100644
--- a/pkg/front_end/testcases/late_lowering/late_final_field_without_initializer.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/late_final_field_without_initializer.dart.strong.transformed.expect
@@ -11,19 +11,19 @@
     : super core::Object::•()
     ;
   static get lateStaticField1() → core::int
-    return let final core::int? #t1 = self::Class::_#lateStaticField1 in #t1.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'lateStaticField1' has not been initialized.") : #t1{core::int};
+    return let final core::int? #t1 = self::Class::_#lateStaticField1 in #t1.==(null) ?{core::int} throw new _in::LateError::fieldNI("lateStaticField1") : #t1{core::int};
   static set lateStaticField1(core::int #t2) → void
     if(self::Class::_#lateStaticField1.==(null))
       self::Class::_#lateStaticField1 = #t2;
     else
-      throw new _in::LateInitializationErrorImpl::•("Field 'lateStaticField1' has already been initialized.");
+      throw new _in::LateError::fieldAI("lateStaticField1");
   static get lateStaticField2() → core::int
-    return let final core::int? #t3 = self::Class::_#lateStaticField2 in #t3.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'lateStaticField2' has not been initialized.") : #t3{core::int};
+    return let final core::int? #t3 = self::Class::_#lateStaticField2 in #t3.==(null) ?{core::int} throw new _in::LateError::fieldNI("lateStaticField2") : #t3{core::int};
   static set lateStaticField2(core::int #t4) → void
     if(self::Class::_#lateStaticField2.==(null))
       self::Class::_#lateStaticField2 = #t4;
     else
-      throw new _in::LateInitializationErrorImpl::•("Field 'lateStaticField2' has already been initialized.");
+      throw new _in::LateError::fieldAI("lateStaticField2");
   static method staticMethod() → dynamic {
     self::throws(() → core::int => self::Class::lateStaticField2, "Read value from uninitialized Class.lateStaticField2");
     self::Class::lateStaticField2 = 42;
@@ -31,12 +31,12 @@
     self::throws(() → core::int => self::Class::lateStaticField2 = 43, "Write value to initialized Class.lateStaticField2");
   }
   get lateInstanceField() → core::int
-    return let final core::int? #t5 = this.{self::Class::_#Class#lateInstanceField} in #t5.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'lateInstanceField' has not been initialized.") : #t5{core::int};
+    return let final core::int? #t5 = this.{self::Class::_#Class#lateInstanceField} in #t5.==(null) ?{core::int} throw new _in::LateError::fieldNI("lateInstanceField") : #t5{core::int};
   set lateInstanceField(core::int #t6) → void
     if(this.{self::Class::_#Class#lateInstanceField}.==(null))
       this.{self::Class::_#Class#lateInstanceField} = #t6;
     else
-      throw new _in::LateInitializationErrorImpl::•("Field 'lateInstanceField' has already been initialized.");
+      throw new _in::LateError::fieldAI("lateInstanceField");
   method instanceMethod() → dynamic {
     self::throws(() → core::int => this.{self::Class::lateInstanceField}, "Read value from uninitialized Class.lateInstanceField");
     this.{self::Class::lateInstanceField} = 16;
@@ -57,26 +57,26 @@
 static field core::int? _#Extension|lateExtensionField1 = null;
 static field core::int? _#Extension|lateExtensionField2 = null;
 static get lateTopLevelField() → core::int
-  return let final core::int? #t7 = self::_#lateTopLevelField in #t7.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'lateTopLevelField' has not been initialized.") : #t7{core::int};
+  return let final core::int? #t7 = self::_#lateTopLevelField in #t7.==(null) ?{core::int} throw new _in::LateError::fieldNI("lateTopLevelField") : #t7{core::int};
 static set lateTopLevelField(core::int #t8) → void
   if(self::_#lateTopLevelField.==(null))
     self::_#lateTopLevelField = #t8;
   else
-    throw new _in::LateInitializationErrorImpl::•("Field 'lateTopLevelField' has already been initialized.");
+    throw new _in::LateError::fieldAI("lateTopLevelField");
 static get Extension|lateExtensionField1() → core::int
-  return let final core::int? #t9 = self::_#Extension|lateExtensionField1 in #t9.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'lateExtensionField1' has not been initialized.") : #t9{core::int};
+  return let final core::int? #t9 = self::_#Extension|lateExtensionField1 in #t9.==(null) ?{core::int} throw new _in::LateError::fieldNI("lateExtensionField1") : #t9{core::int};
 static set Extension|lateExtensionField1(core::int #t10) → void
   if(self::_#Extension|lateExtensionField1.==(null))
     self::_#Extension|lateExtensionField1 = #t10;
   else
-    throw new _in::LateInitializationErrorImpl::•("Field 'lateExtensionField1' has already been initialized.");
+    throw new _in::LateError::fieldAI("lateExtensionField1");
 static get Extension|lateExtensionField2() → core::int
-  return let final core::int? #t11 = self::_#Extension|lateExtensionField2 in #t11.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'lateExtensionField2' has not been initialized.") : #t11{core::int};
+  return let final core::int? #t11 = self::_#Extension|lateExtensionField2 in #t11.==(null) ?{core::int} throw new _in::LateError::fieldNI("lateExtensionField2") : #t11{core::int};
 static set Extension|lateExtensionField2(core::int #t12) → void
   if(self::_#Extension|lateExtensionField2.==(null))
     self::_#Extension|lateExtensionField2 = #t12;
   else
-    throw new _in::LateInitializationErrorImpl::•("Field 'lateExtensionField2' has already been initialized.");
+    throw new _in::LateError::fieldAI("lateExtensionField2");
 static method Extension|staticMethod() → dynamic {
   self::throws(() → core::int => self::Extension|lateExtensionField2, "Read value from uninitialized Class.lateExtensionField2");
   self::Extension|lateExtensionField2 = 42;
diff --git a/pkg/front_end/testcases/late_lowering/late_final_field_without_initializer.dart.weak.expect b/pkg/front_end/testcases/late_lowering/late_final_field_without_initializer.dart.weak.expect
index 381a0ba..63c7b11 100644
--- a/pkg/front_end/testcases/late_lowering/late_final_field_without_initializer.dart.weak.expect
+++ b/pkg/front_end/testcases/late_lowering/late_final_field_without_initializer.dart.weak.expect
@@ -14,19 +14,19 @@
     : super core::Object::•()
     ;
   static get lateStaticField1() → core::int
-    return self::Class::_#lateStaticField1#isSet ?{core::int} let final core::int? #t1 = self::Class::_#lateStaticField1 in #t1{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'lateStaticField1' has not been initialized.");
+    return self::Class::_#lateStaticField1#isSet ?{core::int} let final core::int? #t1 = self::Class::_#lateStaticField1 in #t1{core::int} : throw new _in::LateError::fieldNI("lateStaticField1");
   static set lateStaticField1(core::int #t2) → void
     if(self::Class::_#lateStaticField1#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Field 'lateStaticField1' has already been initialized.");
+      throw new _in::LateError::fieldAI("lateStaticField1");
     else {
       self::Class::_#lateStaticField1#isSet = true;
       self::Class::_#lateStaticField1 = #t2;
     }
   static get lateStaticField2() → core::int
-    return self::Class::_#lateStaticField2#isSet ?{core::int} let final core::int? #t3 = self::Class::_#lateStaticField2 in #t3{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'lateStaticField2' has not been initialized.");
+    return self::Class::_#lateStaticField2#isSet ?{core::int} let final core::int? #t3 = self::Class::_#lateStaticField2 in #t3{core::int} : throw new _in::LateError::fieldNI("lateStaticField2");
   static set lateStaticField2(core::int #t4) → void
     if(self::Class::_#lateStaticField2#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Field 'lateStaticField2' has already been initialized.");
+      throw new _in::LateError::fieldAI("lateStaticField2");
     else {
       self::Class::_#lateStaticField2#isSet = true;
       self::Class::_#lateStaticField2 = #t4;
@@ -38,10 +38,10 @@
     self::throws(() → core::int => self::Class::lateStaticField2 = 43, "Write value to initialized Class.lateStaticField2");
   }
   get lateInstanceField() → core::int
-    return this.{self::Class::_#Class#lateInstanceField#isSet} ?{core::int} let final core::int? #t5 = this.{self::Class::_#Class#lateInstanceField} in #t5{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'lateInstanceField' has not been initialized.");
+    return this.{self::Class::_#Class#lateInstanceField#isSet} ?{core::int} let final core::int? #t5 = this.{self::Class::_#Class#lateInstanceField} in #t5{core::int} : throw new _in::LateError::fieldNI("lateInstanceField");
   set lateInstanceField(core::int #t6) → void
     if(this.{self::Class::_#Class#lateInstanceField#isSet})
-      throw new _in::LateInitializationErrorImpl::•("Field 'lateInstanceField' has already been initialized.");
+      throw new _in::LateError::fieldAI("lateInstanceField");
     else {
       this.{self::Class::_#Class#lateInstanceField#isSet} = true;
       this.{self::Class::_#Class#lateInstanceField} = #t6;
@@ -71,28 +71,28 @@
 static field core::int? _#Extension|lateExtensionField2 = null;
 static field core::bool _#Extension|lateExtensionField2#isSet = false;
 static get lateTopLevelField() → core::int
-  return self::_#lateTopLevelField#isSet ?{core::int} let final core::int? #t7 = self::_#lateTopLevelField in #t7{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'lateTopLevelField' has not been initialized.");
+  return self::_#lateTopLevelField#isSet ?{core::int} let final core::int? #t7 = self::_#lateTopLevelField in #t7{core::int} : throw new _in::LateError::fieldNI("lateTopLevelField");
 static set lateTopLevelField(core::int #t8) → void
   if(self::_#lateTopLevelField#isSet)
-    throw new _in::LateInitializationErrorImpl::•("Field 'lateTopLevelField' has already been initialized.");
+    throw new _in::LateError::fieldAI("lateTopLevelField");
   else {
     self::_#lateTopLevelField#isSet = true;
     self::_#lateTopLevelField = #t8;
   }
 static get Extension|lateExtensionField1() → core::int
-  return self::_#Extension|lateExtensionField1#isSet ?{core::int} let final core::int? #t9 = self::_#Extension|lateExtensionField1 in #t9{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'lateExtensionField1' has not been initialized.");
+  return self::_#Extension|lateExtensionField1#isSet ?{core::int} let final core::int? #t9 = self::_#Extension|lateExtensionField1 in #t9{core::int} : throw new _in::LateError::fieldNI("lateExtensionField1");
 static set Extension|lateExtensionField1(core::int #t10) → void
   if(self::_#Extension|lateExtensionField1#isSet)
-    throw new _in::LateInitializationErrorImpl::•("Field 'lateExtensionField1' has already been initialized.");
+    throw new _in::LateError::fieldAI("lateExtensionField1");
   else {
     self::_#Extension|lateExtensionField1#isSet = true;
     self::_#Extension|lateExtensionField1 = #t10;
   }
 static get Extension|lateExtensionField2() → core::int
-  return self::_#Extension|lateExtensionField2#isSet ?{core::int} let final core::int? #t11 = self::_#Extension|lateExtensionField2 in #t11{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'lateExtensionField2' has not been initialized.");
+  return self::_#Extension|lateExtensionField2#isSet ?{core::int} let final core::int? #t11 = self::_#Extension|lateExtensionField2 in #t11{core::int} : throw new _in::LateError::fieldNI("lateExtensionField2");
 static set Extension|lateExtensionField2(core::int #t12) → void
   if(self::_#Extension|lateExtensionField2#isSet)
-    throw new _in::LateInitializationErrorImpl::•("Field 'lateExtensionField2' has already been initialized.");
+    throw new _in::LateError::fieldAI("lateExtensionField2");
   else {
     self::_#Extension|lateExtensionField2#isSet = true;
     self::_#Extension|lateExtensionField2 = #t12;
diff --git a/pkg/front_end/testcases/late_lowering/late_final_field_without_initializer.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/late_final_field_without_initializer.dart.weak.transformed.expect
index 381a0ba..63c7b11 100644
--- a/pkg/front_end/testcases/late_lowering/late_final_field_without_initializer.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/late_final_field_without_initializer.dart.weak.transformed.expect
@@ -14,19 +14,19 @@
     : super core::Object::•()
     ;
   static get lateStaticField1() → core::int
-    return self::Class::_#lateStaticField1#isSet ?{core::int} let final core::int? #t1 = self::Class::_#lateStaticField1 in #t1{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'lateStaticField1' has not been initialized.");
+    return self::Class::_#lateStaticField1#isSet ?{core::int} let final core::int? #t1 = self::Class::_#lateStaticField1 in #t1{core::int} : throw new _in::LateError::fieldNI("lateStaticField1");
   static set lateStaticField1(core::int #t2) → void
     if(self::Class::_#lateStaticField1#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Field 'lateStaticField1' has already been initialized.");
+      throw new _in::LateError::fieldAI("lateStaticField1");
     else {
       self::Class::_#lateStaticField1#isSet = true;
       self::Class::_#lateStaticField1 = #t2;
     }
   static get lateStaticField2() → core::int
-    return self::Class::_#lateStaticField2#isSet ?{core::int} let final core::int? #t3 = self::Class::_#lateStaticField2 in #t3{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'lateStaticField2' has not been initialized.");
+    return self::Class::_#lateStaticField2#isSet ?{core::int} let final core::int? #t3 = self::Class::_#lateStaticField2 in #t3{core::int} : throw new _in::LateError::fieldNI("lateStaticField2");
   static set lateStaticField2(core::int #t4) → void
     if(self::Class::_#lateStaticField2#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Field 'lateStaticField2' has already been initialized.");
+      throw new _in::LateError::fieldAI("lateStaticField2");
     else {
       self::Class::_#lateStaticField2#isSet = true;
       self::Class::_#lateStaticField2 = #t4;
@@ -38,10 +38,10 @@
     self::throws(() → core::int => self::Class::lateStaticField2 = 43, "Write value to initialized Class.lateStaticField2");
   }
   get lateInstanceField() → core::int
-    return this.{self::Class::_#Class#lateInstanceField#isSet} ?{core::int} let final core::int? #t5 = this.{self::Class::_#Class#lateInstanceField} in #t5{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'lateInstanceField' has not been initialized.");
+    return this.{self::Class::_#Class#lateInstanceField#isSet} ?{core::int} let final core::int? #t5 = this.{self::Class::_#Class#lateInstanceField} in #t5{core::int} : throw new _in::LateError::fieldNI("lateInstanceField");
   set lateInstanceField(core::int #t6) → void
     if(this.{self::Class::_#Class#lateInstanceField#isSet})
-      throw new _in::LateInitializationErrorImpl::•("Field 'lateInstanceField' has already been initialized.");
+      throw new _in::LateError::fieldAI("lateInstanceField");
     else {
       this.{self::Class::_#Class#lateInstanceField#isSet} = true;
       this.{self::Class::_#Class#lateInstanceField} = #t6;
@@ -71,28 +71,28 @@
 static field core::int? _#Extension|lateExtensionField2 = null;
 static field core::bool _#Extension|lateExtensionField2#isSet = false;
 static get lateTopLevelField() → core::int
-  return self::_#lateTopLevelField#isSet ?{core::int} let final core::int? #t7 = self::_#lateTopLevelField in #t7{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'lateTopLevelField' has not been initialized.");
+  return self::_#lateTopLevelField#isSet ?{core::int} let final core::int? #t7 = self::_#lateTopLevelField in #t7{core::int} : throw new _in::LateError::fieldNI("lateTopLevelField");
 static set lateTopLevelField(core::int #t8) → void
   if(self::_#lateTopLevelField#isSet)
-    throw new _in::LateInitializationErrorImpl::•("Field 'lateTopLevelField' has already been initialized.");
+    throw new _in::LateError::fieldAI("lateTopLevelField");
   else {
     self::_#lateTopLevelField#isSet = true;
     self::_#lateTopLevelField = #t8;
   }
 static get Extension|lateExtensionField1() → core::int
-  return self::_#Extension|lateExtensionField1#isSet ?{core::int} let final core::int? #t9 = self::_#Extension|lateExtensionField1 in #t9{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'lateExtensionField1' has not been initialized.");
+  return self::_#Extension|lateExtensionField1#isSet ?{core::int} let final core::int? #t9 = self::_#Extension|lateExtensionField1 in #t9{core::int} : throw new _in::LateError::fieldNI("lateExtensionField1");
 static set Extension|lateExtensionField1(core::int #t10) → void
   if(self::_#Extension|lateExtensionField1#isSet)
-    throw new _in::LateInitializationErrorImpl::•("Field 'lateExtensionField1' has already been initialized.");
+    throw new _in::LateError::fieldAI("lateExtensionField1");
   else {
     self::_#Extension|lateExtensionField1#isSet = true;
     self::_#Extension|lateExtensionField1 = #t10;
   }
 static get Extension|lateExtensionField2() → core::int
-  return self::_#Extension|lateExtensionField2#isSet ?{core::int} let final core::int? #t11 = self::_#Extension|lateExtensionField2 in #t11{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'lateExtensionField2' has not been initialized.");
+  return self::_#Extension|lateExtensionField2#isSet ?{core::int} let final core::int? #t11 = self::_#Extension|lateExtensionField2 in #t11{core::int} : throw new _in::LateError::fieldNI("lateExtensionField2");
 static set Extension|lateExtensionField2(core::int #t12) → void
   if(self::_#Extension|lateExtensionField2#isSet)
-    throw new _in::LateInitializationErrorImpl::•("Field 'lateExtensionField2' has already been initialized.");
+    throw new _in::LateError::fieldAI("lateExtensionField2");
   else {
     self::_#Extension|lateExtensionField2#isSet = true;
     self::_#Extension|lateExtensionField2 = #t12;
diff --git a/pkg/front_end/testcases/late_lowering/late_final_local_with_initializer.dart.strong.expect b/pkg/front_end/testcases/late_lowering/late_final_local_with_initializer.dart.strong.expect
index 2f84c91..8a5dd62 100644
--- a/pkg/front_end/testcases/late_lowering/late_final_local_with_initializer.dart.strong.expect
+++ b/pkg/front_end/testcases/late_lowering/late_final_local_with_initializer.dart.strong.expect
@@ -13,7 +13,7 @@
   self::expect(null, lateLocalInit);
   self::expect(123, #lateLocal#get.call());
   self::expect(123, lateLocalInit);
-  function local<T extends core::Object? = dynamic>(T% value) → core::Null? {
+  function local<T extends core::Object? = dynamic>(T% value) → Null {
     T? lateGenericLocalInit;
     function initLateGenericLocal(T% value) → T% {
       return lateGenericLocalInit = value;
diff --git a/pkg/front_end/testcases/late_lowering/late_final_local_with_initializer.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/late_final_local_with_initializer.dart.strong.transformed.expect
index 2f84c91..8a5dd62 100644
--- a/pkg/front_end/testcases/late_lowering/late_final_local_with_initializer.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/late_final_local_with_initializer.dart.strong.transformed.expect
@@ -13,7 +13,7 @@
   self::expect(null, lateLocalInit);
   self::expect(123, #lateLocal#get.call());
   self::expect(123, lateLocalInit);
-  function local<T extends core::Object? = dynamic>(T% value) → core::Null? {
+  function local<T extends core::Object? = dynamic>(T% value) → Null {
     T? lateGenericLocalInit;
     function initLateGenericLocal(T% value) → T% {
       return lateGenericLocalInit = value;
diff --git a/pkg/front_end/testcases/late_lowering/late_final_local_with_initializer.dart.weak.expect b/pkg/front_end/testcases/late_lowering/late_final_local_with_initializer.dart.weak.expect
index bfa3459..76adb10 100644
--- a/pkg/front_end/testcases/late_lowering/late_final_local_with_initializer.dart.weak.expect
+++ b/pkg/front_end/testcases/late_lowering/late_final_local_with_initializer.dart.weak.expect
@@ -19,7 +19,7 @@
   self::expect(null, lateLocalInit);
   self::expect(123, #lateLocal#get.call());
   self::expect(123, lateLocalInit);
-  function local<T extends core::Object? = dynamic>(T% value) → core::Null? {
+  function local<T extends core::Object? = dynamic>(T% value) → Null {
     T? lateGenericLocalInit;
     function initLateGenericLocal(T% value) → T% {
       return lateGenericLocalInit = value;
diff --git a/pkg/front_end/testcases/late_lowering/late_final_local_with_initializer.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/late_final_local_with_initializer.dart.weak.transformed.expect
index bfa3459..76adb10 100644
--- a/pkg/front_end/testcases/late_lowering/late_final_local_with_initializer.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/late_final_local_with_initializer.dart.weak.transformed.expect
@@ -19,7 +19,7 @@
   self::expect(null, lateLocalInit);
   self::expect(123, #lateLocal#get.call());
   self::expect(123, lateLocalInit);
-  function local<T extends core::Object? = dynamic>(T% value) → core::Null? {
+  function local<T extends core::Object? = dynamic>(T% value) → Null {
     T? lateGenericLocalInit;
     function initLateGenericLocal(T% value) → T% {
       return lateGenericLocalInit = value;
diff --git a/pkg/front_end/testcases/late_lowering/late_final_local_without_initializer.dart.strong.expect b/pkg/front_end/testcases/late_lowering/late_final_local_without_initializer.dart.strong.expect
index 3476c20..5052aa475 100644
--- a/pkg/front_end/testcases/late_lowering/late_final_local_without_initializer.dart.strong.expect
+++ b/pkg/front_end/testcases/late_lowering/late_final_local_without_initializer.dart.strong.expect
@@ -7,12 +7,12 @@
   core::bool b = false;
   final core::int? lateLocal;
   function #lateLocal#get() → core::int
-    return let final core::int? #t1 = lateLocal in #t1.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'lateLocal' has not been initialized.") : #t1{core::int};
+    return let final core::int? #t1 = lateLocal in #t1.==(null) ?{core::int} throw new _in::LateError::localNI("lateLocal") : #t1{core::int};
   function #lateLocal#set(core::int #t2) → dynamic
     if(lateLocal.==(null))
       return lateLocal = #t2;
     else
-      throw new _in::LateInitializationErrorImpl::•("Local 'lateLocal' has already been initialized.");
+      throw new _in::LateError::localAI("lateLocal");
   if(b) {
     #lateLocal#set.call(123);
   }
@@ -22,14 +22,14 @@
     self::expect(123, #lateLocal#get.call());
   }
   self::throws(() → core::int => #lateLocal#set.call(124), "Write value to initialized lateLocal");
-  function local<T extends core::Object? = dynamic>(T% value) → core::Null? {
+  function local<T extends core::Object? = dynamic>(T% value) → Null {
     final T? lateGenericLocal;
     core::bool #lateGenericLocal#isSet = false;
     function #lateGenericLocal#get() → T%
-      return #lateGenericLocal#isSet ?{T%} lateGenericLocal{T%} : throw new _in::LateInitializationErrorImpl::•("Local 'lateGenericLocal' has not been initialized.");
+      return #lateGenericLocal#isSet ?{T%} lateGenericLocal{T%} : throw new _in::LateError::localNI("lateGenericLocal");
     function #lateGenericLocal#set(T% #t3) → dynamic
       if(#lateGenericLocal#isSet)
-        throw new _in::LateInitializationErrorImpl::•("Local 'lateGenericLocal' has already been initialized.");
+        throw new _in::LateError::localAI("lateGenericLocal");
       else {
         #lateGenericLocal#isSet = true;
         return lateGenericLocal = #t3;
diff --git a/pkg/front_end/testcases/late_lowering/late_final_local_without_initializer.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/late_final_local_without_initializer.dart.strong.transformed.expect
index 3476c20..5052aa475 100644
--- a/pkg/front_end/testcases/late_lowering/late_final_local_without_initializer.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/late_final_local_without_initializer.dart.strong.transformed.expect
@@ -7,12 +7,12 @@
   core::bool b = false;
   final core::int? lateLocal;
   function #lateLocal#get() → core::int
-    return let final core::int? #t1 = lateLocal in #t1.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'lateLocal' has not been initialized.") : #t1{core::int};
+    return let final core::int? #t1 = lateLocal in #t1.==(null) ?{core::int} throw new _in::LateError::localNI("lateLocal") : #t1{core::int};
   function #lateLocal#set(core::int #t2) → dynamic
     if(lateLocal.==(null))
       return lateLocal = #t2;
     else
-      throw new _in::LateInitializationErrorImpl::•("Local 'lateLocal' has already been initialized.");
+      throw new _in::LateError::localAI("lateLocal");
   if(b) {
     #lateLocal#set.call(123);
   }
@@ -22,14 +22,14 @@
     self::expect(123, #lateLocal#get.call());
   }
   self::throws(() → core::int => #lateLocal#set.call(124), "Write value to initialized lateLocal");
-  function local<T extends core::Object? = dynamic>(T% value) → core::Null? {
+  function local<T extends core::Object? = dynamic>(T% value) → Null {
     final T? lateGenericLocal;
     core::bool #lateGenericLocal#isSet = false;
     function #lateGenericLocal#get() → T%
-      return #lateGenericLocal#isSet ?{T%} lateGenericLocal{T%} : throw new _in::LateInitializationErrorImpl::•("Local 'lateGenericLocal' has not been initialized.");
+      return #lateGenericLocal#isSet ?{T%} lateGenericLocal{T%} : throw new _in::LateError::localNI("lateGenericLocal");
     function #lateGenericLocal#set(T% #t3) → dynamic
       if(#lateGenericLocal#isSet)
-        throw new _in::LateInitializationErrorImpl::•("Local 'lateGenericLocal' has already been initialized.");
+        throw new _in::LateError::localAI("lateGenericLocal");
       else {
         #lateGenericLocal#isSet = true;
         return lateGenericLocal = #t3;
diff --git a/pkg/front_end/testcases/late_lowering/late_final_local_without_initializer.dart.weak.expect b/pkg/front_end/testcases/late_lowering/late_final_local_without_initializer.dart.weak.expect
index 7a343a9..4a3c1ef 100644
--- a/pkg/front_end/testcases/late_lowering/late_final_local_without_initializer.dart.weak.expect
+++ b/pkg/front_end/testcases/late_lowering/late_final_local_without_initializer.dart.weak.expect
@@ -8,10 +8,10 @@
   final core::int? lateLocal;
   core::bool #lateLocal#isSet = false;
   function #lateLocal#get() → core::int
-    return #lateLocal#isSet ?{core::int} lateLocal{core::int} : throw new _in::LateInitializationErrorImpl::•("Local 'lateLocal' has not been initialized.");
+    return #lateLocal#isSet ?{core::int} lateLocal{core::int} : throw new _in::LateError::localNI("lateLocal");
   function #lateLocal#set(core::int #t1) → dynamic
     if(#lateLocal#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Local 'lateLocal' has already been initialized.");
+      throw new _in::LateError::localAI("lateLocal");
     else {
       #lateLocal#isSet = true;
       return lateLocal = #t1;
@@ -25,14 +25,14 @@
     self::expect(123, #lateLocal#get.call());
   }
   self::throws(() → core::int => #lateLocal#set.call(124), "Write value to initialized lateLocal");
-  function local<T extends core::Object? = dynamic>(T% value) → core::Null? {
+  function local<T extends core::Object? = dynamic>(T% value) → Null {
     final T? lateGenericLocal;
     core::bool #lateGenericLocal#isSet = false;
     function #lateGenericLocal#get() → T%
-      return #lateGenericLocal#isSet ?{T%} lateGenericLocal{T%} : throw new _in::LateInitializationErrorImpl::•("Local 'lateGenericLocal' has not been initialized.");
+      return #lateGenericLocal#isSet ?{T%} lateGenericLocal{T%} : throw new _in::LateError::localNI("lateGenericLocal");
     function #lateGenericLocal#set(T% #t2) → dynamic
       if(#lateGenericLocal#isSet)
-        throw new _in::LateInitializationErrorImpl::•("Local 'lateGenericLocal' has already been initialized.");
+        throw new _in::LateError::localAI("lateGenericLocal");
       else {
         #lateGenericLocal#isSet = true;
         return lateGenericLocal = #t2;
diff --git a/pkg/front_end/testcases/late_lowering/late_final_local_without_initializer.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/late_final_local_without_initializer.dart.weak.transformed.expect
index 7a343a9..4a3c1ef 100644
--- a/pkg/front_end/testcases/late_lowering/late_final_local_without_initializer.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/late_final_local_without_initializer.dart.weak.transformed.expect
@@ -8,10 +8,10 @@
   final core::int? lateLocal;
   core::bool #lateLocal#isSet = false;
   function #lateLocal#get() → core::int
-    return #lateLocal#isSet ?{core::int} lateLocal{core::int} : throw new _in::LateInitializationErrorImpl::•("Local 'lateLocal' has not been initialized.");
+    return #lateLocal#isSet ?{core::int} lateLocal{core::int} : throw new _in::LateError::localNI("lateLocal");
   function #lateLocal#set(core::int #t1) → dynamic
     if(#lateLocal#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Local 'lateLocal' has already been initialized.");
+      throw new _in::LateError::localAI("lateLocal");
     else {
       #lateLocal#isSet = true;
       return lateLocal = #t1;
@@ -25,14 +25,14 @@
     self::expect(123, #lateLocal#get.call());
   }
   self::throws(() → core::int => #lateLocal#set.call(124), "Write value to initialized lateLocal");
-  function local<T extends core::Object? = dynamic>(T% value) → core::Null? {
+  function local<T extends core::Object? = dynamic>(T% value) → Null {
     final T? lateGenericLocal;
     core::bool #lateGenericLocal#isSet = false;
     function #lateGenericLocal#get() → T%
-      return #lateGenericLocal#isSet ?{T%} lateGenericLocal{T%} : throw new _in::LateInitializationErrorImpl::•("Local 'lateGenericLocal' has not been initialized.");
+      return #lateGenericLocal#isSet ?{T%} lateGenericLocal{T%} : throw new _in::LateError::localNI("lateGenericLocal");
     function #lateGenericLocal#set(T% #t2) → dynamic
       if(#lateGenericLocal#isSet)
-        throw new _in::LateInitializationErrorImpl::•("Local 'lateGenericLocal' has already been initialized.");
+        throw new _in::LateError::localAI("lateGenericLocal");
       else {
         #lateGenericLocal#isSet = true;
         return lateGenericLocal = #t2;
diff --git a/pkg/front_end/testcases/late_lowering/late_final_nullable_field_with_initializer.dart.strong.expect b/pkg/front_end/testcases/late_lowering/late_final_nullable_field_with_initializer.dart.strong.expect
index 52eadc4..705fc46 100644
--- a/pkg/front_end/testcases/late_lowering/late_final_nullable_field_with_initializer.dart.strong.expect
+++ b/pkg/front_end/testcases/late_lowering/late_final_nullable_field_with_initializer.dart.strong.expect
@@ -27,7 +27,7 @@
     if(!self::Class::_#lateStaticField1#isSet) {
       final core::int? #t1 = self::Class::initLateStaticField1(87);
       if(self::Class::_#lateStaticField1#isSet)
-        throw new _in::LateInitializationErrorImpl::•("Field 'lateStaticField1' has been assigned during initialization.");
+        throw new _in::LateError::fieldADI("lateStaticField1");
       self::Class::_#lateStaticField1 = #t1;
       self::Class::_#lateStaticField1#isSet = true;
     }
@@ -40,7 +40,7 @@
     if(!self::Class::_#lateStaticField2#isSet) {
       final core::int? #t2 = self::Class::initLateStaticField2(42);
       if(self::Class::_#lateStaticField2#isSet)
-        throw new _in::LateInitializationErrorImpl::•("Field 'lateStaticField2' has been assigned during initialization.");
+        throw new _in::LateError::fieldADI("lateStaticField2");
       self::Class::_#lateStaticField2 = #t2;
       self::Class::_#lateStaticField2#isSet = true;
     }
@@ -58,7 +58,7 @@
     if(!this.{self::Class::_#Class#lateInstanceField#isSet}) {
       final core::int? #t3 = this.{self::Class::initLateInstanceField}(16);
       if(this.{self::Class::_#Class#lateInstanceField#isSet})
-        throw new _in::LateInitializationErrorImpl::•("Field 'lateInstanceField' has been assigned during initialization.");
+        throw new _in::LateError::fieldADI("lateInstanceField");
       this.{self::Class::_#Class#lateInstanceField} = #t3;
       this.{self::Class::_#Class#lateInstanceField#isSet} = true;
     }
@@ -71,7 +71,7 @@
     if(!this.{self::Class::_#Class#lateGenericInstanceField#isSet}) {
       final self::Class::T? #t4 = this.{self::Class::initLateGenericInstanceField}(this.{self::Class::field});
       if(this.{self::Class::_#Class#lateGenericInstanceField#isSet})
-        throw new _in::LateInitializationErrorImpl::•("Field 'lateGenericInstanceField' has been assigned during initialization.");
+        throw new _in::LateError::fieldADI("lateGenericInstanceField");
       this.{self::Class::_#Class#lateGenericInstanceField} = #t4;
       this.{self::Class::_#Class#lateGenericInstanceField#isSet} = true;
     }
@@ -115,7 +115,7 @@
   if(!self::_#lateTopLevelField1#isSet) {
     final core::int? #t5 = self::initLateTopLevelField1(123);
     if(self::_#lateTopLevelField1#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Field 'lateTopLevelField1' has been assigned during initialization.");
+      throw new _in::LateError::fieldADI("lateTopLevelField1");
     self::_#lateTopLevelField1 = #t5;
     self::_#lateTopLevelField1#isSet = true;
   }
@@ -128,7 +128,7 @@
   if(!self::_#Extension|lateExtensionField1#isSet) {
     final core::int? #t6 = self::Extension|initLateExtensionField1(87);
     if(self::_#Extension|lateExtensionField1#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Field 'lateExtensionField1' has been assigned during initialization.");
+      throw new _in::LateError::fieldADI("lateExtensionField1");
     self::_#Extension|lateExtensionField1 = #t6;
     self::_#Extension|lateExtensionField1#isSet = true;
   }
@@ -141,7 +141,7 @@
   if(!self::_#Extension|lateExtensionField2#isSet) {
     final core::int? #t7 = self::Extension|initLateExtensionField2(42);
     if(self::_#Extension|lateExtensionField2#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Field 'lateExtensionField2' has been assigned during initialization.");
+      throw new _in::LateError::fieldADI("lateExtensionField2");
     self::_#Extension|lateExtensionField2 = #t7;
     self::_#Extension|lateExtensionField2#isSet = true;
   }
diff --git a/pkg/front_end/testcases/late_lowering/late_final_nullable_field_with_initializer.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/late_final_nullable_field_with_initializer.dart.strong.transformed.expect
index 52eadc4..705fc46 100644
--- a/pkg/front_end/testcases/late_lowering/late_final_nullable_field_with_initializer.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/late_final_nullable_field_with_initializer.dart.strong.transformed.expect
@@ -27,7 +27,7 @@
     if(!self::Class::_#lateStaticField1#isSet) {
       final core::int? #t1 = self::Class::initLateStaticField1(87);
       if(self::Class::_#lateStaticField1#isSet)
-        throw new _in::LateInitializationErrorImpl::•("Field 'lateStaticField1' has been assigned during initialization.");
+        throw new _in::LateError::fieldADI("lateStaticField1");
       self::Class::_#lateStaticField1 = #t1;
       self::Class::_#lateStaticField1#isSet = true;
     }
@@ -40,7 +40,7 @@
     if(!self::Class::_#lateStaticField2#isSet) {
       final core::int? #t2 = self::Class::initLateStaticField2(42);
       if(self::Class::_#lateStaticField2#isSet)
-        throw new _in::LateInitializationErrorImpl::•("Field 'lateStaticField2' has been assigned during initialization.");
+        throw new _in::LateError::fieldADI("lateStaticField2");
       self::Class::_#lateStaticField2 = #t2;
       self::Class::_#lateStaticField2#isSet = true;
     }
@@ -58,7 +58,7 @@
     if(!this.{self::Class::_#Class#lateInstanceField#isSet}) {
       final core::int? #t3 = this.{self::Class::initLateInstanceField}(16);
       if(this.{self::Class::_#Class#lateInstanceField#isSet})
-        throw new _in::LateInitializationErrorImpl::•("Field 'lateInstanceField' has been assigned during initialization.");
+        throw new _in::LateError::fieldADI("lateInstanceField");
       this.{self::Class::_#Class#lateInstanceField} = #t3;
       this.{self::Class::_#Class#lateInstanceField#isSet} = true;
     }
@@ -71,7 +71,7 @@
     if(!this.{self::Class::_#Class#lateGenericInstanceField#isSet}) {
       final self::Class::T? #t4 = this.{self::Class::initLateGenericInstanceField}(this.{self::Class::field});
       if(this.{self::Class::_#Class#lateGenericInstanceField#isSet})
-        throw new _in::LateInitializationErrorImpl::•("Field 'lateGenericInstanceField' has been assigned during initialization.");
+        throw new _in::LateError::fieldADI("lateGenericInstanceField");
       this.{self::Class::_#Class#lateGenericInstanceField} = #t4;
       this.{self::Class::_#Class#lateGenericInstanceField#isSet} = true;
     }
@@ -115,7 +115,7 @@
   if(!self::_#lateTopLevelField1#isSet) {
     final core::int? #t5 = self::initLateTopLevelField1(123);
     if(self::_#lateTopLevelField1#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Field 'lateTopLevelField1' has been assigned during initialization.");
+      throw new _in::LateError::fieldADI("lateTopLevelField1");
     self::_#lateTopLevelField1 = #t5;
     self::_#lateTopLevelField1#isSet = true;
   }
@@ -128,7 +128,7 @@
   if(!self::_#Extension|lateExtensionField1#isSet) {
     final core::int? #t6 = self::Extension|initLateExtensionField1(87);
     if(self::_#Extension|lateExtensionField1#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Field 'lateExtensionField1' has been assigned during initialization.");
+      throw new _in::LateError::fieldADI("lateExtensionField1");
     self::_#Extension|lateExtensionField1 = #t6;
     self::_#Extension|lateExtensionField1#isSet = true;
   }
@@ -141,7 +141,7 @@
   if(!self::_#Extension|lateExtensionField2#isSet) {
     final core::int? #t7 = self::Extension|initLateExtensionField2(42);
     if(self::_#Extension|lateExtensionField2#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Field 'lateExtensionField2' has been assigned during initialization.");
+      throw new _in::LateError::fieldADI("lateExtensionField2");
     self::_#Extension|lateExtensionField2 = #t7;
     self::_#Extension|lateExtensionField2#isSet = true;
   }
diff --git a/pkg/front_end/testcases/late_lowering/late_final_nullable_field_with_initializer.dart.weak.expect b/pkg/front_end/testcases/late_lowering/late_final_nullable_field_with_initializer.dart.weak.expect
index 52eadc4..705fc46 100644
--- a/pkg/front_end/testcases/late_lowering/late_final_nullable_field_with_initializer.dart.weak.expect
+++ b/pkg/front_end/testcases/late_lowering/late_final_nullable_field_with_initializer.dart.weak.expect
@@ -27,7 +27,7 @@
     if(!self::Class::_#lateStaticField1#isSet) {
       final core::int? #t1 = self::Class::initLateStaticField1(87);
       if(self::Class::_#lateStaticField1#isSet)
-        throw new _in::LateInitializationErrorImpl::•("Field 'lateStaticField1' has been assigned during initialization.");
+        throw new _in::LateError::fieldADI("lateStaticField1");
       self::Class::_#lateStaticField1 = #t1;
       self::Class::_#lateStaticField1#isSet = true;
     }
@@ -40,7 +40,7 @@
     if(!self::Class::_#lateStaticField2#isSet) {
       final core::int? #t2 = self::Class::initLateStaticField2(42);
       if(self::Class::_#lateStaticField2#isSet)
-        throw new _in::LateInitializationErrorImpl::•("Field 'lateStaticField2' has been assigned during initialization.");
+        throw new _in::LateError::fieldADI("lateStaticField2");
       self::Class::_#lateStaticField2 = #t2;
       self::Class::_#lateStaticField2#isSet = true;
     }
@@ -58,7 +58,7 @@
     if(!this.{self::Class::_#Class#lateInstanceField#isSet}) {
       final core::int? #t3 = this.{self::Class::initLateInstanceField}(16);
       if(this.{self::Class::_#Class#lateInstanceField#isSet})
-        throw new _in::LateInitializationErrorImpl::•("Field 'lateInstanceField' has been assigned during initialization.");
+        throw new _in::LateError::fieldADI("lateInstanceField");
       this.{self::Class::_#Class#lateInstanceField} = #t3;
       this.{self::Class::_#Class#lateInstanceField#isSet} = true;
     }
@@ -71,7 +71,7 @@
     if(!this.{self::Class::_#Class#lateGenericInstanceField#isSet}) {
       final self::Class::T? #t4 = this.{self::Class::initLateGenericInstanceField}(this.{self::Class::field});
       if(this.{self::Class::_#Class#lateGenericInstanceField#isSet})
-        throw new _in::LateInitializationErrorImpl::•("Field 'lateGenericInstanceField' has been assigned during initialization.");
+        throw new _in::LateError::fieldADI("lateGenericInstanceField");
       this.{self::Class::_#Class#lateGenericInstanceField} = #t4;
       this.{self::Class::_#Class#lateGenericInstanceField#isSet} = true;
     }
@@ -115,7 +115,7 @@
   if(!self::_#lateTopLevelField1#isSet) {
     final core::int? #t5 = self::initLateTopLevelField1(123);
     if(self::_#lateTopLevelField1#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Field 'lateTopLevelField1' has been assigned during initialization.");
+      throw new _in::LateError::fieldADI("lateTopLevelField1");
     self::_#lateTopLevelField1 = #t5;
     self::_#lateTopLevelField1#isSet = true;
   }
@@ -128,7 +128,7 @@
   if(!self::_#Extension|lateExtensionField1#isSet) {
     final core::int? #t6 = self::Extension|initLateExtensionField1(87);
     if(self::_#Extension|lateExtensionField1#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Field 'lateExtensionField1' has been assigned during initialization.");
+      throw new _in::LateError::fieldADI("lateExtensionField1");
     self::_#Extension|lateExtensionField1 = #t6;
     self::_#Extension|lateExtensionField1#isSet = true;
   }
@@ -141,7 +141,7 @@
   if(!self::_#Extension|lateExtensionField2#isSet) {
     final core::int? #t7 = self::Extension|initLateExtensionField2(42);
     if(self::_#Extension|lateExtensionField2#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Field 'lateExtensionField2' has been assigned during initialization.");
+      throw new _in::LateError::fieldADI("lateExtensionField2");
     self::_#Extension|lateExtensionField2 = #t7;
     self::_#Extension|lateExtensionField2#isSet = true;
   }
diff --git a/pkg/front_end/testcases/late_lowering/late_final_nullable_field_with_initializer.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/late_final_nullable_field_with_initializer.dart.weak.transformed.expect
index 52eadc4..705fc46 100644
--- a/pkg/front_end/testcases/late_lowering/late_final_nullable_field_with_initializer.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/late_final_nullable_field_with_initializer.dart.weak.transformed.expect
@@ -27,7 +27,7 @@
     if(!self::Class::_#lateStaticField1#isSet) {
       final core::int? #t1 = self::Class::initLateStaticField1(87);
       if(self::Class::_#lateStaticField1#isSet)
-        throw new _in::LateInitializationErrorImpl::•("Field 'lateStaticField1' has been assigned during initialization.");
+        throw new _in::LateError::fieldADI("lateStaticField1");
       self::Class::_#lateStaticField1 = #t1;
       self::Class::_#lateStaticField1#isSet = true;
     }
@@ -40,7 +40,7 @@
     if(!self::Class::_#lateStaticField2#isSet) {
       final core::int? #t2 = self::Class::initLateStaticField2(42);
       if(self::Class::_#lateStaticField2#isSet)
-        throw new _in::LateInitializationErrorImpl::•("Field 'lateStaticField2' has been assigned during initialization.");
+        throw new _in::LateError::fieldADI("lateStaticField2");
       self::Class::_#lateStaticField2 = #t2;
       self::Class::_#lateStaticField2#isSet = true;
     }
@@ -58,7 +58,7 @@
     if(!this.{self::Class::_#Class#lateInstanceField#isSet}) {
       final core::int? #t3 = this.{self::Class::initLateInstanceField}(16);
       if(this.{self::Class::_#Class#lateInstanceField#isSet})
-        throw new _in::LateInitializationErrorImpl::•("Field 'lateInstanceField' has been assigned during initialization.");
+        throw new _in::LateError::fieldADI("lateInstanceField");
       this.{self::Class::_#Class#lateInstanceField} = #t3;
       this.{self::Class::_#Class#lateInstanceField#isSet} = true;
     }
@@ -71,7 +71,7 @@
     if(!this.{self::Class::_#Class#lateGenericInstanceField#isSet}) {
       final self::Class::T? #t4 = this.{self::Class::initLateGenericInstanceField}(this.{self::Class::field});
       if(this.{self::Class::_#Class#lateGenericInstanceField#isSet})
-        throw new _in::LateInitializationErrorImpl::•("Field 'lateGenericInstanceField' has been assigned during initialization.");
+        throw new _in::LateError::fieldADI("lateGenericInstanceField");
       this.{self::Class::_#Class#lateGenericInstanceField} = #t4;
       this.{self::Class::_#Class#lateGenericInstanceField#isSet} = true;
     }
@@ -115,7 +115,7 @@
   if(!self::_#lateTopLevelField1#isSet) {
     final core::int? #t5 = self::initLateTopLevelField1(123);
     if(self::_#lateTopLevelField1#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Field 'lateTopLevelField1' has been assigned during initialization.");
+      throw new _in::LateError::fieldADI("lateTopLevelField1");
     self::_#lateTopLevelField1 = #t5;
     self::_#lateTopLevelField1#isSet = true;
   }
@@ -128,7 +128,7 @@
   if(!self::_#Extension|lateExtensionField1#isSet) {
     final core::int? #t6 = self::Extension|initLateExtensionField1(87);
     if(self::_#Extension|lateExtensionField1#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Field 'lateExtensionField1' has been assigned during initialization.");
+      throw new _in::LateError::fieldADI("lateExtensionField1");
     self::_#Extension|lateExtensionField1 = #t6;
     self::_#Extension|lateExtensionField1#isSet = true;
   }
@@ -141,7 +141,7 @@
   if(!self::_#Extension|lateExtensionField2#isSet) {
     final core::int? #t7 = self::Extension|initLateExtensionField2(42);
     if(self::_#Extension|lateExtensionField2#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Field 'lateExtensionField2' has been assigned during initialization.");
+      throw new _in::LateError::fieldADI("lateExtensionField2");
     self::_#Extension|lateExtensionField2 = #t7;
     self::_#Extension|lateExtensionField2#isSet = true;
   }
diff --git a/pkg/front_end/testcases/late_lowering/late_final_nullable_field_without_initializer.dart.strong.expect b/pkg/front_end/testcases/late_lowering/late_final_nullable_field_without_initializer.dart.strong.expect
index 59a762a..d2f5afa 100644
--- a/pkg/front_end/testcases/late_lowering/late_final_nullable_field_without_initializer.dart.strong.expect
+++ b/pkg/front_end/testcases/late_lowering/late_final_nullable_field_without_initializer.dart.strong.expect
@@ -16,19 +16,19 @@
     : super core::Object::•()
     ;
   static get lateStaticField1() → core::int?
-    return self::Class::_#lateStaticField1#isSet ?{core::int?} self::Class::_#lateStaticField1 : throw new _in::LateInitializationErrorImpl::•("Field 'lateStaticField1' has not been initialized.");
+    return self::Class::_#lateStaticField1#isSet ?{core::int?} self::Class::_#lateStaticField1 : throw new _in::LateError::fieldNI("lateStaticField1");
   static set lateStaticField1(core::int? #t1) → void
     if(self::Class::_#lateStaticField1#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Field 'lateStaticField1' has already been initialized.");
+      throw new _in::LateError::fieldAI("lateStaticField1");
     else {
       self::Class::_#lateStaticField1#isSet = true;
       self::Class::_#lateStaticField1 = #t1;
     }
   static get lateStaticField2() → core::int?
-    return self::Class::_#lateStaticField2#isSet ?{core::int?} self::Class::_#lateStaticField2 : throw new _in::LateInitializationErrorImpl::•("Field 'lateStaticField2' has not been initialized.");
+    return self::Class::_#lateStaticField2#isSet ?{core::int?} self::Class::_#lateStaticField2 : throw new _in::LateError::fieldNI("lateStaticField2");
   static set lateStaticField2(core::int? #t2) → void
     if(self::Class::_#lateStaticField2#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Field 'lateStaticField2' has already been initialized.");
+      throw new _in::LateError::fieldAI("lateStaticField2");
     else {
       self::Class::_#lateStaticField2#isSet = true;
       self::Class::_#lateStaticField2 = #t2;
@@ -40,19 +40,19 @@
     self::throws(() → core::int => self::Class::lateStaticField2 = 43, "Write value to initialized Class.lateStaticField2");
   }
   get lateInstanceField() → core::int?
-    return this.{self::Class::_#Class#lateInstanceField#isSet} ?{core::int?} this.{self::Class::_#Class#lateInstanceField} : throw new _in::LateInitializationErrorImpl::•("Field 'lateInstanceField' has not been initialized.");
+    return this.{self::Class::_#Class#lateInstanceField#isSet} ?{core::int?} this.{self::Class::_#Class#lateInstanceField} : throw new _in::LateError::fieldNI("lateInstanceField");
   set lateInstanceField(core::int? #t3) → void
     if(this.{self::Class::_#Class#lateInstanceField#isSet})
-      throw new _in::LateInitializationErrorImpl::•("Field 'lateInstanceField' has already been initialized.");
+      throw new _in::LateError::fieldAI("lateInstanceField");
     else {
       this.{self::Class::_#Class#lateInstanceField#isSet} = true;
       this.{self::Class::_#Class#lateInstanceField} = #t3;
     }
   get lateGenericInstanceField() → self::Class::T?
-    return this.{self::Class::_#Class#lateGenericInstanceField#isSet} ?{self::Class::T?} this.{self::Class::_#Class#lateGenericInstanceField} : throw new _in::LateInitializationErrorImpl::•("Field 'lateGenericInstanceField' has not been initialized.");
+    return this.{self::Class::_#Class#lateGenericInstanceField#isSet} ?{self::Class::T?} this.{self::Class::_#Class#lateGenericInstanceField} : throw new _in::LateError::fieldNI("lateGenericInstanceField");
   set lateGenericInstanceField(self::Class::T? #t4) → void
     if(this.{self::Class::_#Class#lateGenericInstanceField#isSet})
-      throw new _in::LateInitializationErrorImpl::•("Field 'lateGenericInstanceField' has already been initialized.");
+      throw new _in::LateError::fieldAI("lateGenericInstanceField");
     else {
       this.{self::Class::_#Class#lateGenericInstanceField#isSet} = true;
       this.{self::Class::_#Class#lateGenericInstanceField} = #t4;
@@ -86,28 +86,28 @@
 static field core::int? _#Extension|lateExtensionField2 = null;
 static field core::bool _#Extension|lateExtensionField2#isSet = false;
 static get lateTopLevelField() → core::int?
-  return self::_#lateTopLevelField#isSet ?{core::int?} self::_#lateTopLevelField : throw new _in::LateInitializationErrorImpl::•("Field 'lateTopLevelField' has not been initialized.");
+  return self::_#lateTopLevelField#isSet ?{core::int?} self::_#lateTopLevelField : throw new _in::LateError::fieldNI("lateTopLevelField");
 static set lateTopLevelField(core::int? #t5) → void
   if(self::_#lateTopLevelField#isSet)
-    throw new _in::LateInitializationErrorImpl::•("Field 'lateTopLevelField' has already been initialized.");
+    throw new _in::LateError::fieldAI("lateTopLevelField");
   else {
     self::_#lateTopLevelField#isSet = true;
     self::_#lateTopLevelField = #t5;
   }
 static get Extension|lateExtensionField1() → core::int?
-  return self::_#Extension|lateExtensionField1#isSet ?{core::int?} self::_#Extension|lateExtensionField1 : throw new _in::LateInitializationErrorImpl::•("Field 'lateExtensionField1' has not been initialized.");
+  return self::_#Extension|lateExtensionField1#isSet ?{core::int?} self::_#Extension|lateExtensionField1 : throw new _in::LateError::fieldNI("lateExtensionField1");
 static set Extension|lateExtensionField1(core::int? #t6) → void
   if(self::_#Extension|lateExtensionField1#isSet)
-    throw new _in::LateInitializationErrorImpl::•("Field 'lateExtensionField1' has already been initialized.");
+    throw new _in::LateError::fieldAI("lateExtensionField1");
   else {
     self::_#Extension|lateExtensionField1#isSet = true;
     self::_#Extension|lateExtensionField1 = #t6;
   }
 static get Extension|lateExtensionField2() → core::int?
-  return self::_#Extension|lateExtensionField2#isSet ?{core::int?} self::_#Extension|lateExtensionField2 : throw new _in::LateInitializationErrorImpl::•("Field 'lateExtensionField2' has not been initialized.");
+  return self::_#Extension|lateExtensionField2#isSet ?{core::int?} self::_#Extension|lateExtensionField2 : throw new _in::LateError::fieldNI("lateExtensionField2");
 static set Extension|lateExtensionField2(core::int? #t7) → void
   if(self::_#Extension|lateExtensionField2#isSet)
-    throw new _in::LateInitializationErrorImpl::•("Field 'lateExtensionField2' has already been initialized.");
+    throw new _in::LateError::fieldAI("lateExtensionField2");
   else {
     self::_#Extension|lateExtensionField2#isSet = true;
     self::_#Extension|lateExtensionField2 = #t7;
diff --git a/pkg/front_end/testcases/late_lowering/late_final_nullable_field_without_initializer.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/late_final_nullable_field_without_initializer.dart.strong.transformed.expect
index 59a762a..d2f5afa 100644
--- a/pkg/front_end/testcases/late_lowering/late_final_nullable_field_without_initializer.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/late_final_nullable_field_without_initializer.dart.strong.transformed.expect
@@ -16,19 +16,19 @@
     : super core::Object::•()
     ;
   static get lateStaticField1() → core::int?
-    return self::Class::_#lateStaticField1#isSet ?{core::int?} self::Class::_#lateStaticField1 : throw new _in::LateInitializationErrorImpl::•("Field 'lateStaticField1' has not been initialized.");
+    return self::Class::_#lateStaticField1#isSet ?{core::int?} self::Class::_#lateStaticField1 : throw new _in::LateError::fieldNI("lateStaticField1");
   static set lateStaticField1(core::int? #t1) → void
     if(self::Class::_#lateStaticField1#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Field 'lateStaticField1' has already been initialized.");
+      throw new _in::LateError::fieldAI("lateStaticField1");
     else {
       self::Class::_#lateStaticField1#isSet = true;
       self::Class::_#lateStaticField1 = #t1;
     }
   static get lateStaticField2() → core::int?
-    return self::Class::_#lateStaticField2#isSet ?{core::int?} self::Class::_#lateStaticField2 : throw new _in::LateInitializationErrorImpl::•("Field 'lateStaticField2' has not been initialized.");
+    return self::Class::_#lateStaticField2#isSet ?{core::int?} self::Class::_#lateStaticField2 : throw new _in::LateError::fieldNI("lateStaticField2");
   static set lateStaticField2(core::int? #t2) → void
     if(self::Class::_#lateStaticField2#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Field 'lateStaticField2' has already been initialized.");
+      throw new _in::LateError::fieldAI("lateStaticField2");
     else {
       self::Class::_#lateStaticField2#isSet = true;
       self::Class::_#lateStaticField2 = #t2;
@@ -40,19 +40,19 @@
     self::throws(() → core::int => self::Class::lateStaticField2 = 43, "Write value to initialized Class.lateStaticField2");
   }
   get lateInstanceField() → core::int?
-    return this.{self::Class::_#Class#lateInstanceField#isSet} ?{core::int?} this.{self::Class::_#Class#lateInstanceField} : throw new _in::LateInitializationErrorImpl::•("Field 'lateInstanceField' has not been initialized.");
+    return this.{self::Class::_#Class#lateInstanceField#isSet} ?{core::int?} this.{self::Class::_#Class#lateInstanceField} : throw new _in::LateError::fieldNI("lateInstanceField");
   set lateInstanceField(core::int? #t3) → void
     if(this.{self::Class::_#Class#lateInstanceField#isSet})
-      throw new _in::LateInitializationErrorImpl::•("Field 'lateInstanceField' has already been initialized.");
+      throw new _in::LateError::fieldAI("lateInstanceField");
     else {
       this.{self::Class::_#Class#lateInstanceField#isSet} = true;
       this.{self::Class::_#Class#lateInstanceField} = #t3;
     }
   get lateGenericInstanceField() → self::Class::T?
-    return this.{self::Class::_#Class#lateGenericInstanceField#isSet} ?{self::Class::T?} this.{self::Class::_#Class#lateGenericInstanceField} : throw new _in::LateInitializationErrorImpl::•("Field 'lateGenericInstanceField' has not been initialized.");
+    return this.{self::Class::_#Class#lateGenericInstanceField#isSet} ?{self::Class::T?} this.{self::Class::_#Class#lateGenericInstanceField} : throw new _in::LateError::fieldNI("lateGenericInstanceField");
   set lateGenericInstanceField(self::Class::T? #t4) → void
     if(this.{self::Class::_#Class#lateGenericInstanceField#isSet})
-      throw new _in::LateInitializationErrorImpl::•("Field 'lateGenericInstanceField' has already been initialized.");
+      throw new _in::LateError::fieldAI("lateGenericInstanceField");
     else {
       this.{self::Class::_#Class#lateGenericInstanceField#isSet} = true;
       this.{self::Class::_#Class#lateGenericInstanceField} = #t4;
@@ -86,28 +86,28 @@
 static field core::int? _#Extension|lateExtensionField2 = null;
 static field core::bool _#Extension|lateExtensionField2#isSet = false;
 static get lateTopLevelField() → core::int?
-  return self::_#lateTopLevelField#isSet ?{core::int?} self::_#lateTopLevelField : throw new _in::LateInitializationErrorImpl::•("Field 'lateTopLevelField' has not been initialized.");
+  return self::_#lateTopLevelField#isSet ?{core::int?} self::_#lateTopLevelField : throw new _in::LateError::fieldNI("lateTopLevelField");
 static set lateTopLevelField(core::int? #t5) → void
   if(self::_#lateTopLevelField#isSet)
-    throw new _in::LateInitializationErrorImpl::•("Field 'lateTopLevelField' has already been initialized.");
+    throw new _in::LateError::fieldAI("lateTopLevelField");
   else {
     self::_#lateTopLevelField#isSet = true;
     self::_#lateTopLevelField = #t5;
   }
 static get Extension|lateExtensionField1() → core::int?
-  return self::_#Extension|lateExtensionField1#isSet ?{core::int?} self::_#Extension|lateExtensionField1 : throw new _in::LateInitializationErrorImpl::•("Field 'lateExtensionField1' has not been initialized.");
+  return self::_#Extension|lateExtensionField1#isSet ?{core::int?} self::_#Extension|lateExtensionField1 : throw new _in::LateError::fieldNI("lateExtensionField1");
 static set Extension|lateExtensionField1(core::int? #t6) → void
   if(self::_#Extension|lateExtensionField1#isSet)
-    throw new _in::LateInitializationErrorImpl::•("Field 'lateExtensionField1' has already been initialized.");
+    throw new _in::LateError::fieldAI("lateExtensionField1");
   else {
     self::_#Extension|lateExtensionField1#isSet = true;
     self::_#Extension|lateExtensionField1 = #t6;
   }
 static get Extension|lateExtensionField2() → core::int?
-  return self::_#Extension|lateExtensionField2#isSet ?{core::int?} self::_#Extension|lateExtensionField2 : throw new _in::LateInitializationErrorImpl::•("Field 'lateExtensionField2' has not been initialized.");
+  return self::_#Extension|lateExtensionField2#isSet ?{core::int?} self::_#Extension|lateExtensionField2 : throw new _in::LateError::fieldNI("lateExtensionField2");
 static set Extension|lateExtensionField2(core::int? #t7) → void
   if(self::_#Extension|lateExtensionField2#isSet)
-    throw new _in::LateInitializationErrorImpl::•("Field 'lateExtensionField2' has already been initialized.");
+    throw new _in::LateError::fieldAI("lateExtensionField2");
   else {
     self::_#Extension|lateExtensionField2#isSet = true;
     self::_#Extension|lateExtensionField2 = #t7;
diff --git a/pkg/front_end/testcases/late_lowering/late_final_nullable_field_without_initializer.dart.weak.expect b/pkg/front_end/testcases/late_lowering/late_final_nullable_field_without_initializer.dart.weak.expect
index 59a762a..d2f5afa 100644
--- a/pkg/front_end/testcases/late_lowering/late_final_nullable_field_without_initializer.dart.weak.expect
+++ b/pkg/front_end/testcases/late_lowering/late_final_nullable_field_without_initializer.dart.weak.expect
@@ -16,19 +16,19 @@
     : super core::Object::•()
     ;
   static get lateStaticField1() → core::int?
-    return self::Class::_#lateStaticField1#isSet ?{core::int?} self::Class::_#lateStaticField1 : throw new _in::LateInitializationErrorImpl::•("Field 'lateStaticField1' has not been initialized.");
+    return self::Class::_#lateStaticField1#isSet ?{core::int?} self::Class::_#lateStaticField1 : throw new _in::LateError::fieldNI("lateStaticField1");
   static set lateStaticField1(core::int? #t1) → void
     if(self::Class::_#lateStaticField1#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Field 'lateStaticField1' has already been initialized.");
+      throw new _in::LateError::fieldAI("lateStaticField1");
     else {
       self::Class::_#lateStaticField1#isSet = true;
       self::Class::_#lateStaticField1 = #t1;
     }
   static get lateStaticField2() → core::int?
-    return self::Class::_#lateStaticField2#isSet ?{core::int?} self::Class::_#lateStaticField2 : throw new _in::LateInitializationErrorImpl::•("Field 'lateStaticField2' has not been initialized.");
+    return self::Class::_#lateStaticField2#isSet ?{core::int?} self::Class::_#lateStaticField2 : throw new _in::LateError::fieldNI("lateStaticField2");
   static set lateStaticField2(core::int? #t2) → void
     if(self::Class::_#lateStaticField2#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Field 'lateStaticField2' has already been initialized.");
+      throw new _in::LateError::fieldAI("lateStaticField2");
     else {
       self::Class::_#lateStaticField2#isSet = true;
       self::Class::_#lateStaticField2 = #t2;
@@ -40,19 +40,19 @@
     self::throws(() → core::int => self::Class::lateStaticField2 = 43, "Write value to initialized Class.lateStaticField2");
   }
   get lateInstanceField() → core::int?
-    return this.{self::Class::_#Class#lateInstanceField#isSet} ?{core::int?} this.{self::Class::_#Class#lateInstanceField} : throw new _in::LateInitializationErrorImpl::•("Field 'lateInstanceField' has not been initialized.");
+    return this.{self::Class::_#Class#lateInstanceField#isSet} ?{core::int?} this.{self::Class::_#Class#lateInstanceField} : throw new _in::LateError::fieldNI("lateInstanceField");
   set lateInstanceField(core::int? #t3) → void
     if(this.{self::Class::_#Class#lateInstanceField#isSet})
-      throw new _in::LateInitializationErrorImpl::•("Field 'lateInstanceField' has already been initialized.");
+      throw new _in::LateError::fieldAI("lateInstanceField");
     else {
       this.{self::Class::_#Class#lateInstanceField#isSet} = true;
       this.{self::Class::_#Class#lateInstanceField} = #t3;
     }
   get lateGenericInstanceField() → self::Class::T?
-    return this.{self::Class::_#Class#lateGenericInstanceField#isSet} ?{self::Class::T?} this.{self::Class::_#Class#lateGenericInstanceField} : throw new _in::LateInitializationErrorImpl::•("Field 'lateGenericInstanceField' has not been initialized.");
+    return this.{self::Class::_#Class#lateGenericInstanceField#isSet} ?{self::Class::T?} this.{self::Class::_#Class#lateGenericInstanceField} : throw new _in::LateError::fieldNI("lateGenericInstanceField");
   set lateGenericInstanceField(self::Class::T? #t4) → void
     if(this.{self::Class::_#Class#lateGenericInstanceField#isSet})
-      throw new _in::LateInitializationErrorImpl::•("Field 'lateGenericInstanceField' has already been initialized.");
+      throw new _in::LateError::fieldAI("lateGenericInstanceField");
     else {
       this.{self::Class::_#Class#lateGenericInstanceField#isSet} = true;
       this.{self::Class::_#Class#lateGenericInstanceField} = #t4;
@@ -86,28 +86,28 @@
 static field core::int? _#Extension|lateExtensionField2 = null;
 static field core::bool _#Extension|lateExtensionField2#isSet = false;
 static get lateTopLevelField() → core::int?
-  return self::_#lateTopLevelField#isSet ?{core::int?} self::_#lateTopLevelField : throw new _in::LateInitializationErrorImpl::•("Field 'lateTopLevelField' has not been initialized.");
+  return self::_#lateTopLevelField#isSet ?{core::int?} self::_#lateTopLevelField : throw new _in::LateError::fieldNI("lateTopLevelField");
 static set lateTopLevelField(core::int? #t5) → void
   if(self::_#lateTopLevelField#isSet)
-    throw new _in::LateInitializationErrorImpl::•("Field 'lateTopLevelField' has already been initialized.");
+    throw new _in::LateError::fieldAI("lateTopLevelField");
   else {
     self::_#lateTopLevelField#isSet = true;
     self::_#lateTopLevelField = #t5;
   }
 static get Extension|lateExtensionField1() → core::int?
-  return self::_#Extension|lateExtensionField1#isSet ?{core::int?} self::_#Extension|lateExtensionField1 : throw new _in::LateInitializationErrorImpl::•("Field 'lateExtensionField1' has not been initialized.");
+  return self::_#Extension|lateExtensionField1#isSet ?{core::int?} self::_#Extension|lateExtensionField1 : throw new _in::LateError::fieldNI("lateExtensionField1");
 static set Extension|lateExtensionField1(core::int? #t6) → void
   if(self::_#Extension|lateExtensionField1#isSet)
-    throw new _in::LateInitializationErrorImpl::•("Field 'lateExtensionField1' has already been initialized.");
+    throw new _in::LateError::fieldAI("lateExtensionField1");
   else {
     self::_#Extension|lateExtensionField1#isSet = true;
     self::_#Extension|lateExtensionField1 = #t6;
   }
 static get Extension|lateExtensionField2() → core::int?
-  return self::_#Extension|lateExtensionField2#isSet ?{core::int?} self::_#Extension|lateExtensionField2 : throw new _in::LateInitializationErrorImpl::•("Field 'lateExtensionField2' has not been initialized.");
+  return self::_#Extension|lateExtensionField2#isSet ?{core::int?} self::_#Extension|lateExtensionField2 : throw new _in::LateError::fieldNI("lateExtensionField2");
 static set Extension|lateExtensionField2(core::int? #t7) → void
   if(self::_#Extension|lateExtensionField2#isSet)
-    throw new _in::LateInitializationErrorImpl::•("Field 'lateExtensionField2' has already been initialized.");
+    throw new _in::LateError::fieldAI("lateExtensionField2");
   else {
     self::_#Extension|lateExtensionField2#isSet = true;
     self::_#Extension|lateExtensionField2 = #t7;
diff --git a/pkg/front_end/testcases/late_lowering/late_final_nullable_field_without_initializer.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/late_final_nullable_field_without_initializer.dart.weak.transformed.expect
index 59a762a..d2f5afa 100644
--- a/pkg/front_end/testcases/late_lowering/late_final_nullable_field_without_initializer.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/late_final_nullable_field_without_initializer.dart.weak.transformed.expect
@@ -16,19 +16,19 @@
     : super core::Object::•()
     ;
   static get lateStaticField1() → core::int?
-    return self::Class::_#lateStaticField1#isSet ?{core::int?} self::Class::_#lateStaticField1 : throw new _in::LateInitializationErrorImpl::•("Field 'lateStaticField1' has not been initialized.");
+    return self::Class::_#lateStaticField1#isSet ?{core::int?} self::Class::_#lateStaticField1 : throw new _in::LateError::fieldNI("lateStaticField1");
   static set lateStaticField1(core::int? #t1) → void
     if(self::Class::_#lateStaticField1#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Field 'lateStaticField1' has already been initialized.");
+      throw new _in::LateError::fieldAI("lateStaticField1");
     else {
       self::Class::_#lateStaticField1#isSet = true;
       self::Class::_#lateStaticField1 = #t1;
     }
   static get lateStaticField2() → core::int?
-    return self::Class::_#lateStaticField2#isSet ?{core::int?} self::Class::_#lateStaticField2 : throw new _in::LateInitializationErrorImpl::•("Field 'lateStaticField2' has not been initialized.");
+    return self::Class::_#lateStaticField2#isSet ?{core::int?} self::Class::_#lateStaticField2 : throw new _in::LateError::fieldNI("lateStaticField2");
   static set lateStaticField2(core::int? #t2) → void
     if(self::Class::_#lateStaticField2#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Field 'lateStaticField2' has already been initialized.");
+      throw new _in::LateError::fieldAI("lateStaticField2");
     else {
       self::Class::_#lateStaticField2#isSet = true;
       self::Class::_#lateStaticField2 = #t2;
@@ -40,19 +40,19 @@
     self::throws(() → core::int => self::Class::lateStaticField2 = 43, "Write value to initialized Class.lateStaticField2");
   }
   get lateInstanceField() → core::int?
-    return this.{self::Class::_#Class#lateInstanceField#isSet} ?{core::int?} this.{self::Class::_#Class#lateInstanceField} : throw new _in::LateInitializationErrorImpl::•("Field 'lateInstanceField' has not been initialized.");
+    return this.{self::Class::_#Class#lateInstanceField#isSet} ?{core::int?} this.{self::Class::_#Class#lateInstanceField} : throw new _in::LateError::fieldNI("lateInstanceField");
   set lateInstanceField(core::int? #t3) → void
     if(this.{self::Class::_#Class#lateInstanceField#isSet})
-      throw new _in::LateInitializationErrorImpl::•("Field 'lateInstanceField' has already been initialized.");
+      throw new _in::LateError::fieldAI("lateInstanceField");
     else {
       this.{self::Class::_#Class#lateInstanceField#isSet} = true;
       this.{self::Class::_#Class#lateInstanceField} = #t3;
     }
   get lateGenericInstanceField() → self::Class::T?
-    return this.{self::Class::_#Class#lateGenericInstanceField#isSet} ?{self::Class::T?} this.{self::Class::_#Class#lateGenericInstanceField} : throw new _in::LateInitializationErrorImpl::•("Field 'lateGenericInstanceField' has not been initialized.");
+    return this.{self::Class::_#Class#lateGenericInstanceField#isSet} ?{self::Class::T?} this.{self::Class::_#Class#lateGenericInstanceField} : throw new _in::LateError::fieldNI("lateGenericInstanceField");
   set lateGenericInstanceField(self::Class::T? #t4) → void
     if(this.{self::Class::_#Class#lateGenericInstanceField#isSet})
-      throw new _in::LateInitializationErrorImpl::•("Field 'lateGenericInstanceField' has already been initialized.");
+      throw new _in::LateError::fieldAI("lateGenericInstanceField");
     else {
       this.{self::Class::_#Class#lateGenericInstanceField#isSet} = true;
       this.{self::Class::_#Class#lateGenericInstanceField} = #t4;
@@ -86,28 +86,28 @@
 static field core::int? _#Extension|lateExtensionField2 = null;
 static field core::bool _#Extension|lateExtensionField2#isSet = false;
 static get lateTopLevelField() → core::int?
-  return self::_#lateTopLevelField#isSet ?{core::int?} self::_#lateTopLevelField : throw new _in::LateInitializationErrorImpl::•("Field 'lateTopLevelField' has not been initialized.");
+  return self::_#lateTopLevelField#isSet ?{core::int?} self::_#lateTopLevelField : throw new _in::LateError::fieldNI("lateTopLevelField");
 static set lateTopLevelField(core::int? #t5) → void
   if(self::_#lateTopLevelField#isSet)
-    throw new _in::LateInitializationErrorImpl::•("Field 'lateTopLevelField' has already been initialized.");
+    throw new _in::LateError::fieldAI("lateTopLevelField");
   else {
     self::_#lateTopLevelField#isSet = true;
     self::_#lateTopLevelField = #t5;
   }
 static get Extension|lateExtensionField1() → core::int?
-  return self::_#Extension|lateExtensionField1#isSet ?{core::int?} self::_#Extension|lateExtensionField1 : throw new _in::LateInitializationErrorImpl::•("Field 'lateExtensionField1' has not been initialized.");
+  return self::_#Extension|lateExtensionField1#isSet ?{core::int?} self::_#Extension|lateExtensionField1 : throw new _in::LateError::fieldNI("lateExtensionField1");
 static set Extension|lateExtensionField1(core::int? #t6) → void
   if(self::_#Extension|lateExtensionField1#isSet)
-    throw new _in::LateInitializationErrorImpl::•("Field 'lateExtensionField1' has already been initialized.");
+    throw new _in::LateError::fieldAI("lateExtensionField1");
   else {
     self::_#Extension|lateExtensionField1#isSet = true;
     self::_#Extension|lateExtensionField1 = #t6;
   }
 static get Extension|lateExtensionField2() → core::int?
-  return self::_#Extension|lateExtensionField2#isSet ?{core::int?} self::_#Extension|lateExtensionField2 : throw new _in::LateInitializationErrorImpl::•("Field 'lateExtensionField2' has not been initialized.");
+  return self::_#Extension|lateExtensionField2#isSet ?{core::int?} self::_#Extension|lateExtensionField2 : throw new _in::LateError::fieldNI("lateExtensionField2");
 static set Extension|lateExtensionField2(core::int? #t7) → void
   if(self::_#Extension|lateExtensionField2#isSet)
-    throw new _in::LateInitializationErrorImpl::•("Field 'lateExtensionField2' has already been initialized.");
+    throw new _in::LateError::fieldAI("lateExtensionField2");
   else {
     self::_#Extension|lateExtensionField2#isSet = true;
     self::_#Extension|lateExtensionField2 = #t7;
diff --git a/pkg/front_end/testcases/late_lowering/late_final_nullable_local_with_initializer.dart.strong.expect b/pkg/front_end/testcases/late_lowering/late_final_nullable_local_with_initializer.dart.strong.expect
index a134538..ffb22f1 100644
--- a/pkg/front_end/testcases/late_lowering/late_final_nullable_local_with_initializer.dart.strong.expect
+++ b/pkg/front_end/testcases/late_lowering/late_final_nullable_local_with_initializer.dart.strong.expect
@@ -19,7 +19,7 @@
   self::expect(null, lateLocalInit);
   self::expect(123, #lateLocal#get.call());
   self::expect(123, lateLocalInit);
-  function local<T extends core::Object? = dynamic>(T? value) → core::Null? {
+  function local<T extends core::Object? = dynamic>(T? value) → Null {
     T? lateGenericLocalInit;
     function initLateGenericLocal(T? value) → T? {
       return lateGenericLocalInit = value;
diff --git a/pkg/front_end/testcases/late_lowering/late_final_nullable_local_with_initializer.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/late_final_nullable_local_with_initializer.dart.strong.transformed.expect
index a134538..ffb22f1 100644
--- a/pkg/front_end/testcases/late_lowering/late_final_nullable_local_with_initializer.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/late_final_nullable_local_with_initializer.dart.strong.transformed.expect
@@ -19,7 +19,7 @@
   self::expect(null, lateLocalInit);
   self::expect(123, #lateLocal#get.call());
   self::expect(123, lateLocalInit);
-  function local<T extends core::Object? = dynamic>(T? value) → core::Null? {
+  function local<T extends core::Object? = dynamic>(T? value) → Null {
     T? lateGenericLocalInit;
     function initLateGenericLocal(T? value) → T? {
       return lateGenericLocalInit = value;
diff --git a/pkg/front_end/testcases/late_lowering/late_final_nullable_local_with_initializer.dart.weak.expect b/pkg/front_end/testcases/late_lowering/late_final_nullable_local_with_initializer.dart.weak.expect
index a134538..ffb22f1 100644
--- a/pkg/front_end/testcases/late_lowering/late_final_nullable_local_with_initializer.dart.weak.expect
+++ b/pkg/front_end/testcases/late_lowering/late_final_nullable_local_with_initializer.dart.weak.expect
@@ -19,7 +19,7 @@
   self::expect(null, lateLocalInit);
   self::expect(123, #lateLocal#get.call());
   self::expect(123, lateLocalInit);
-  function local<T extends core::Object? = dynamic>(T? value) → core::Null? {
+  function local<T extends core::Object? = dynamic>(T? value) → Null {
     T? lateGenericLocalInit;
     function initLateGenericLocal(T? value) → T? {
       return lateGenericLocalInit = value;
diff --git a/pkg/front_end/testcases/late_lowering/late_final_nullable_local_with_initializer.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/late_final_nullable_local_with_initializer.dart.weak.transformed.expect
index a134538..ffb22f1 100644
--- a/pkg/front_end/testcases/late_lowering/late_final_nullable_local_with_initializer.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/late_final_nullable_local_with_initializer.dart.weak.transformed.expect
@@ -19,7 +19,7 @@
   self::expect(null, lateLocalInit);
   self::expect(123, #lateLocal#get.call());
   self::expect(123, lateLocalInit);
-  function local<T extends core::Object? = dynamic>(T? value) → core::Null? {
+  function local<T extends core::Object? = dynamic>(T? value) → Null {
     T? lateGenericLocalInit;
     function initLateGenericLocal(T? value) → T? {
       return lateGenericLocalInit = value;
diff --git a/pkg/front_end/testcases/late_lowering/late_final_nullable_local_without_initializer.dart.strong.expect b/pkg/front_end/testcases/late_lowering/late_final_nullable_local_without_initializer.dart.strong.expect
index b04eb47..37fa15a 100644
--- a/pkg/front_end/testcases/late_lowering/late_final_nullable_local_without_initializer.dart.strong.expect
+++ b/pkg/front_end/testcases/late_lowering/late_final_nullable_local_without_initializer.dart.strong.expect
@@ -7,10 +7,10 @@
   final core::int? lateLocal;
   core::bool #lateLocal#isSet = false;
   function #lateLocal#get() → core::int?
-    return #lateLocal#isSet ?{core::int?} lateLocal : throw new _in::LateInitializationErrorImpl::•("Local 'lateLocal' has not been initialized.");
+    return #lateLocal#isSet ?{core::int?} lateLocal : throw new _in::LateError::localNI("lateLocal");
   function #lateLocal#set(core::int? #t1) → dynamic
     if(#lateLocal#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Local 'lateLocal' has already been initialized.");
+      throw new _in::LateError::localAI("lateLocal");
     else {
       #lateLocal#isSet = true;
       return lateLocal = #t1;
@@ -21,14 +21,14 @@
   }
   self::expect(123, #lateLocal#get.call());
   self::throws(() → core::int => #lateLocal#set.call(124), "Write value to initialized lateLocal");
-  function local<T extends core::Object? = dynamic>(T? value) → core::Null? {
+  function local<T extends core::Object? = dynamic>(T? value) → Null {
     final T? lateGenericLocal;
     core::bool #lateGenericLocal#isSet = false;
     function #lateGenericLocal#get() → T?
-      return #lateGenericLocal#isSet ?{T?} lateGenericLocal : throw new _in::LateInitializationErrorImpl::•("Local 'lateGenericLocal' has not been initialized.");
+      return #lateGenericLocal#isSet ?{T?} lateGenericLocal : throw new _in::LateError::localNI("lateGenericLocal");
     function #lateGenericLocal#set(T? #t2) → dynamic
       if(#lateGenericLocal#isSet)
-        throw new _in::LateInitializationErrorImpl::•("Local 'lateGenericLocal' has already been initialized.");
+        throw new _in::LateError::localAI("lateGenericLocal");
       else {
         #lateGenericLocal#isSet = true;
         return lateGenericLocal = #t2;
diff --git a/pkg/front_end/testcases/late_lowering/late_final_nullable_local_without_initializer.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/late_final_nullable_local_without_initializer.dart.strong.transformed.expect
index 6fe95bd..3dfd218 100644
--- a/pkg/front_end/testcases/late_lowering/late_final_nullable_local_without_initializer.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/late_final_nullable_local_without_initializer.dart.strong.transformed.expect
@@ -7,10 +7,10 @@
   final core::int? lateLocal;
   core::bool #lateLocal#isSet = false;
   function #lateLocal#get() → core::int?
-    return #lateLocal#isSet ?{core::int?} lateLocal : throw new _in::LateInitializationErrorImpl::•("Local 'lateLocal' has not been initialized.");
+    return #lateLocal#isSet ?{core::int?} lateLocal : throw new _in::LateError::localNI("lateLocal");
   function #lateLocal#set(core::int? #t1) → dynamic
     if(#lateLocal#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Local 'lateLocal' has already been initialized.");
+      throw new _in::LateError::localAI("lateLocal");
     else {
       #lateLocal#isSet = true;
       return lateLocal = #t1;
@@ -21,14 +21,14 @@
   }
   self::expect(123, #lateLocal#get.call());
   self::throws(() → core::int => #lateLocal#set.call(124), "Write value to initialized lateLocal");
-  function local<T extends core::Object? = dynamic>(T? value) → core::Null? {
+  function local<T extends core::Object? = dynamic>(T? value) → Null {
     final T? lateGenericLocal;
     core::bool #lateGenericLocal#isSet = false;
     function #lateGenericLocal#get() → T?
-      return #lateGenericLocal#isSet ?{T?} lateGenericLocal : throw new _in::LateInitializationErrorImpl::•("Local 'lateGenericLocal' has not been initialized.");
+      return #lateGenericLocal#isSet ?{T?} lateGenericLocal : throw new _in::LateError::localNI("lateGenericLocal");
     function #lateGenericLocal#set(T? #t2) → dynamic
       if(#lateGenericLocal#isSet)
-        throw new _in::LateInitializationErrorImpl::•("Local 'lateGenericLocal' has already been initialized.");
+        throw new _in::LateError::localAI("lateGenericLocal");
       else {
         #lateGenericLocal#isSet = true;
         return lateGenericLocal = #t2;
diff --git a/pkg/front_end/testcases/late_lowering/late_final_nullable_local_without_initializer.dart.weak.expect b/pkg/front_end/testcases/late_lowering/late_final_nullable_local_without_initializer.dart.weak.expect
index b04eb47..37fa15a 100644
--- a/pkg/front_end/testcases/late_lowering/late_final_nullable_local_without_initializer.dart.weak.expect
+++ b/pkg/front_end/testcases/late_lowering/late_final_nullable_local_without_initializer.dart.weak.expect
@@ -7,10 +7,10 @@
   final core::int? lateLocal;
   core::bool #lateLocal#isSet = false;
   function #lateLocal#get() → core::int?
-    return #lateLocal#isSet ?{core::int?} lateLocal : throw new _in::LateInitializationErrorImpl::•("Local 'lateLocal' has not been initialized.");
+    return #lateLocal#isSet ?{core::int?} lateLocal : throw new _in::LateError::localNI("lateLocal");
   function #lateLocal#set(core::int? #t1) → dynamic
     if(#lateLocal#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Local 'lateLocal' has already been initialized.");
+      throw new _in::LateError::localAI("lateLocal");
     else {
       #lateLocal#isSet = true;
       return lateLocal = #t1;
@@ -21,14 +21,14 @@
   }
   self::expect(123, #lateLocal#get.call());
   self::throws(() → core::int => #lateLocal#set.call(124), "Write value to initialized lateLocal");
-  function local<T extends core::Object? = dynamic>(T? value) → core::Null? {
+  function local<T extends core::Object? = dynamic>(T? value) → Null {
     final T? lateGenericLocal;
     core::bool #lateGenericLocal#isSet = false;
     function #lateGenericLocal#get() → T?
-      return #lateGenericLocal#isSet ?{T?} lateGenericLocal : throw new _in::LateInitializationErrorImpl::•("Local 'lateGenericLocal' has not been initialized.");
+      return #lateGenericLocal#isSet ?{T?} lateGenericLocal : throw new _in::LateError::localNI("lateGenericLocal");
     function #lateGenericLocal#set(T? #t2) → dynamic
       if(#lateGenericLocal#isSet)
-        throw new _in::LateInitializationErrorImpl::•("Local 'lateGenericLocal' has already been initialized.");
+        throw new _in::LateError::localAI("lateGenericLocal");
       else {
         #lateGenericLocal#isSet = true;
         return lateGenericLocal = #t2;
diff --git a/pkg/front_end/testcases/late_lowering/late_final_nullable_local_without_initializer.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/late_final_nullable_local_without_initializer.dart.weak.transformed.expect
index 6fe95bd..3dfd218 100644
--- a/pkg/front_end/testcases/late_lowering/late_final_nullable_local_without_initializer.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/late_final_nullable_local_without_initializer.dart.weak.transformed.expect
@@ -7,10 +7,10 @@
   final core::int? lateLocal;
   core::bool #lateLocal#isSet = false;
   function #lateLocal#get() → core::int?
-    return #lateLocal#isSet ?{core::int?} lateLocal : throw new _in::LateInitializationErrorImpl::•("Local 'lateLocal' has not been initialized.");
+    return #lateLocal#isSet ?{core::int?} lateLocal : throw new _in::LateError::localNI("lateLocal");
   function #lateLocal#set(core::int? #t1) → dynamic
     if(#lateLocal#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Local 'lateLocal' has already been initialized.");
+      throw new _in::LateError::localAI("lateLocal");
     else {
       #lateLocal#isSet = true;
       return lateLocal = #t1;
@@ -21,14 +21,14 @@
   }
   self::expect(123, #lateLocal#get.call());
   self::throws(() → core::int => #lateLocal#set.call(124), "Write value to initialized lateLocal");
-  function local<T extends core::Object? = dynamic>(T? value) → core::Null? {
+  function local<T extends core::Object? = dynamic>(T? value) → Null {
     final T? lateGenericLocal;
     core::bool #lateGenericLocal#isSet = false;
     function #lateGenericLocal#get() → T?
-      return #lateGenericLocal#isSet ?{T?} lateGenericLocal : throw new _in::LateInitializationErrorImpl::•("Local 'lateGenericLocal' has not been initialized.");
+      return #lateGenericLocal#isSet ?{T?} lateGenericLocal : throw new _in::LateError::localNI("lateGenericLocal");
     function #lateGenericLocal#set(T? #t2) → dynamic
       if(#lateGenericLocal#isSet)
-        throw new _in::LateInitializationErrorImpl::•("Local 'lateGenericLocal' has already been initialized.");
+        throw new _in::LateError::localAI("lateGenericLocal");
       else {
         #lateGenericLocal#isSet = true;
         return lateGenericLocal = #t2;
diff --git a/pkg/front_end/testcases/late_lowering/late_future_or.dart.strong.expect b/pkg/front_end/testcases/late_lowering/late_future_or.dart.strong.expect
index 6a5587c..f28f0a7 100644
--- a/pkg/front_end/testcases/late_lowering/late_future_or.dart.strong.expect
+++ b/pkg/front_end/testcases/late_lowering/late_future_or.dart.strong.expect
@@ -20,31 +20,31 @@
     : super core::Object::•()
     ;
   get field1() → FutureOr<dynamic>
-    return this.{self::C::_#C#field1#isSet} ?{FutureOr<dynamic>} this.{self::C::_#C#field1} : throw new _in::LateInitializationErrorImpl::•("Field 'field1' has not been initialized.");
+    return this.{self::C::_#C#field1#isSet} ?{FutureOr<dynamic>} this.{self::C::_#C#field1} : throw new _in::LateError::fieldNI("field1");
   set field1(FutureOr<dynamic>#t1) → void {
     this.{self::C::_#C#field1#isSet} = true;
     this.{self::C::_#C#field1} = #t1;
   }
   get field2() → FutureOr<dynamic>?
-    return this.{self::C::_#C#field2#isSet} ?{FutureOr<dynamic>?} this.{self::C::_#C#field2} : throw new _in::LateInitializationErrorImpl::•("Field 'field2' has not been initialized.");
+    return this.{self::C::_#C#field2#isSet} ?{FutureOr<dynamic>?} this.{self::C::_#C#field2} : throw new _in::LateError::fieldNI("field2");
   set field2(FutureOr<dynamic>? #t2) → void {
     this.{self::C::_#C#field2#isSet} = true;
     this.{self::C::_#C#field2} = #t2;
   }
   get field3() → FutureOr<self::C::T%>
-    return this.{self::C::_#C#field3#isSet} ?{FutureOr<self::C::T%>} let final FutureOr<self::C::T%>? #t3 = this.{self::C::_#C#field3} in #t3{FutureOr<self::C::T%>} : throw new _in::LateInitializationErrorImpl::•("Field 'field3' has not been initialized.");
+    return this.{self::C::_#C#field3#isSet} ?{FutureOr<self::C::T%>} let final FutureOr<self::C::T%>? #t3 = this.{self::C::_#C#field3} in #t3{FutureOr<self::C::T%>} : throw new _in::LateError::fieldNI("field3");
   set field3(generic-covariant-impl FutureOr<self::C::T%>#t4) → void {
     this.{self::C::_#C#field3#isSet} = true;
     this.{self::C::_#C#field3} = #t4;
   }
   get field4() → FutureOr<self::C::T?>
-    return this.{self::C::_#C#field4#isSet} ?{FutureOr<self::C::T?>} this.{self::C::_#C#field4} : throw new _in::LateInitializationErrorImpl::•("Field 'field4' has not been initialized.");
+    return this.{self::C::_#C#field4#isSet} ?{FutureOr<self::C::T?>} this.{self::C::_#C#field4} : throw new _in::LateError::fieldNI("field4");
   set field4(generic-covariant-impl FutureOr<self::C::T?>#t5) → void {
     this.{self::C::_#C#field4#isSet} = true;
     this.{self::C::_#C#field4} = #t5;
   }
   get field5() → FutureOr<self::C::T?>?
-    return this.{self::C::_#C#field5#isSet} ?{FutureOr<self::C::T?>?} this.{self::C::_#C#field5} : throw new _in::LateInitializationErrorImpl::•("Field 'field5' has not been initialized.");
+    return this.{self::C::_#C#field5#isSet} ?{FutureOr<self::C::T?>?} this.{self::C::_#C#field5} : throw new _in::LateError::fieldNI("field5");
   set field5(generic-covariant-impl FutureOr<self::C::T?>? #t6) → void {
     this.{self::C::_#C#field5#isSet} = true;
     this.{self::C::_#C#field5} = #t6;
@@ -53,7 +53,7 @@
     FutureOr<dynamic>? local1;
     core::bool #local1#isSet = false;
     function #local1#get() → FutureOr<dynamic>
-      return #local1#isSet ?{FutureOr<dynamic>} local1 : throw new _in::LateInitializationErrorImpl::•("Local 'local1' has not been initialized.");
+      return #local1#isSet ?{FutureOr<dynamic>} local1 : throw new _in::LateError::localNI("local1");
     function #local1#set(FutureOr<dynamic>#t7) → dynamic {
       #local1#isSet = true;
       return local1 = #t7;
@@ -61,7 +61,7 @@
     FutureOr<dynamic>? local2;
     core::bool #local2#isSet = false;
     function #local2#get() → FutureOr<dynamic>?
-      return #local2#isSet ?{FutureOr<dynamic>?} local2 : throw new _in::LateInitializationErrorImpl::•("Local 'local2' has not been initialized.");
+      return #local2#isSet ?{FutureOr<dynamic>?} local2 : throw new _in::LateError::localNI("local2");
     function #local2#set(FutureOr<dynamic>? #t8) → dynamic {
       #local2#isSet = true;
       return local2 = #t8;
@@ -69,7 +69,7 @@
     FutureOr<self::C::T%>? local3;
     core::bool #local3#isSet = false;
     function #local3#get() → FutureOr<self::C::T%>
-      return #local3#isSet ?{FutureOr<self::C::T%>} local3{FutureOr<self::C::T%>} : throw new _in::LateInitializationErrorImpl::•("Local 'local3' has not been initialized.");
+      return #local3#isSet ?{FutureOr<self::C::T%>} local3{FutureOr<self::C::T%>} : throw new _in::LateError::localNI("local3");
     function #local3#set(FutureOr<self::C::T%>#t9) → dynamic {
       #local3#isSet = true;
       return local3 = #t9;
@@ -77,7 +77,7 @@
     FutureOr<self::C::T?>? local4;
     core::bool #local4#isSet = false;
     function #local4#get() → FutureOr<self::C::T?>
-      return #local4#isSet ?{FutureOr<self::C::T?>} local4 : throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.");
+      return #local4#isSet ?{FutureOr<self::C::T?>} local4 : throw new _in::LateError::localNI("local4");
     function #local4#set(FutureOr<self::C::T?>#t10) → dynamic {
       #local4#isSet = true;
       return local4 = #t10;
@@ -85,7 +85,7 @@
     FutureOr<self::C::T?>? local5;
     core::bool #local5#isSet = false;
     function #local5#get() → FutureOr<self::C::T?>?
-      return #local5#isSet ?{FutureOr<self::C::T?>?} local5 : throw new _in::LateInitializationErrorImpl::•("Local 'local5' has not been initialized.");
+      return #local5#isSet ?{FutureOr<self::C::T?>?} local5 : throw new _in::LateError::localNI("local5");
     function #local5#set(FutureOr<self::C::T?>? #t11) → dynamic {
       #local5#isSet = true;
       return local5 = #t11;
diff --git a/pkg/front_end/testcases/late_lowering/late_future_or.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/late_future_or.dart.strong.transformed.expect
index 6a5587c..f28f0a7 100644
--- a/pkg/front_end/testcases/late_lowering/late_future_or.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/late_future_or.dart.strong.transformed.expect
@@ -20,31 +20,31 @@
     : super core::Object::•()
     ;
   get field1() → FutureOr<dynamic>
-    return this.{self::C::_#C#field1#isSet} ?{FutureOr<dynamic>} this.{self::C::_#C#field1} : throw new _in::LateInitializationErrorImpl::•("Field 'field1' has not been initialized.");
+    return this.{self::C::_#C#field1#isSet} ?{FutureOr<dynamic>} this.{self::C::_#C#field1} : throw new _in::LateError::fieldNI("field1");
   set field1(FutureOr<dynamic>#t1) → void {
     this.{self::C::_#C#field1#isSet} = true;
     this.{self::C::_#C#field1} = #t1;
   }
   get field2() → FutureOr<dynamic>?
-    return this.{self::C::_#C#field2#isSet} ?{FutureOr<dynamic>?} this.{self::C::_#C#field2} : throw new _in::LateInitializationErrorImpl::•("Field 'field2' has not been initialized.");
+    return this.{self::C::_#C#field2#isSet} ?{FutureOr<dynamic>?} this.{self::C::_#C#field2} : throw new _in::LateError::fieldNI("field2");
   set field2(FutureOr<dynamic>? #t2) → void {
     this.{self::C::_#C#field2#isSet} = true;
     this.{self::C::_#C#field2} = #t2;
   }
   get field3() → FutureOr<self::C::T%>
-    return this.{self::C::_#C#field3#isSet} ?{FutureOr<self::C::T%>} let final FutureOr<self::C::T%>? #t3 = this.{self::C::_#C#field3} in #t3{FutureOr<self::C::T%>} : throw new _in::LateInitializationErrorImpl::•("Field 'field3' has not been initialized.");
+    return this.{self::C::_#C#field3#isSet} ?{FutureOr<self::C::T%>} let final FutureOr<self::C::T%>? #t3 = this.{self::C::_#C#field3} in #t3{FutureOr<self::C::T%>} : throw new _in::LateError::fieldNI("field3");
   set field3(generic-covariant-impl FutureOr<self::C::T%>#t4) → void {
     this.{self::C::_#C#field3#isSet} = true;
     this.{self::C::_#C#field3} = #t4;
   }
   get field4() → FutureOr<self::C::T?>
-    return this.{self::C::_#C#field4#isSet} ?{FutureOr<self::C::T?>} this.{self::C::_#C#field4} : throw new _in::LateInitializationErrorImpl::•("Field 'field4' has not been initialized.");
+    return this.{self::C::_#C#field4#isSet} ?{FutureOr<self::C::T?>} this.{self::C::_#C#field4} : throw new _in::LateError::fieldNI("field4");
   set field4(generic-covariant-impl FutureOr<self::C::T?>#t5) → void {
     this.{self::C::_#C#field4#isSet} = true;
     this.{self::C::_#C#field4} = #t5;
   }
   get field5() → FutureOr<self::C::T?>?
-    return this.{self::C::_#C#field5#isSet} ?{FutureOr<self::C::T?>?} this.{self::C::_#C#field5} : throw new _in::LateInitializationErrorImpl::•("Field 'field5' has not been initialized.");
+    return this.{self::C::_#C#field5#isSet} ?{FutureOr<self::C::T?>?} this.{self::C::_#C#field5} : throw new _in::LateError::fieldNI("field5");
   set field5(generic-covariant-impl FutureOr<self::C::T?>? #t6) → void {
     this.{self::C::_#C#field5#isSet} = true;
     this.{self::C::_#C#field5} = #t6;
@@ -53,7 +53,7 @@
     FutureOr<dynamic>? local1;
     core::bool #local1#isSet = false;
     function #local1#get() → FutureOr<dynamic>
-      return #local1#isSet ?{FutureOr<dynamic>} local1 : throw new _in::LateInitializationErrorImpl::•("Local 'local1' has not been initialized.");
+      return #local1#isSet ?{FutureOr<dynamic>} local1 : throw new _in::LateError::localNI("local1");
     function #local1#set(FutureOr<dynamic>#t7) → dynamic {
       #local1#isSet = true;
       return local1 = #t7;
@@ -61,7 +61,7 @@
     FutureOr<dynamic>? local2;
     core::bool #local2#isSet = false;
     function #local2#get() → FutureOr<dynamic>?
-      return #local2#isSet ?{FutureOr<dynamic>?} local2 : throw new _in::LateInitializationErrorImpl::•("Local 'local2' has not been initialized.");
+      return #local2#isSet ?{FutureOr<dynamic>?} local2 : throw new _in::LateError::localNI("local2");
     function #local2#set(FutureOr<dynamic>? #t8) → dynamic {
       #local2#isSet = true;
       return local2 = #t8;
@@ -69,7 +69,7 @@
     FutureOr<self::C::T%>? local3;
     core::bool #local3#isSet = false;
     function #local3#get() → FutureOr<self::C::T%>
-      return #local3#isSet ?{FutureOr<self::C::T%>} local3{FutureOr<self::C::T%>} : throw new _in::LateInitializationErrorImpl::•("Local 'local3' has not been initialized.");
+      return #local3#isSet ?{FutureOr<self::C::T%>} local3{FutureOr<self::C::T%>} : throw new _in::LateError::localNI("local3");
     function #local3#set(FutureOr<self::C::T%>#t9) → dynamic {
       #local3#isSet = true;
       return local3 = #t9;
@@ -77,7 +77,7 @@
     FutureOr<self::C::T?>? local4;
     core::bool #local4#isSet = false;
     function #local4#get() → FutureOr<self::C::T?>
-      return #local4#isSet ?{FutureOr<self::C::T?>} local4 : throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.");
+      return #local4#isSet ?{FutureOr<self::C::T?>} local4 : throw new _in::LateError::localNI("local4");
     function #local4#set(FutureOr<self::C::T?>#t10) → dynamic {
       #local4#isSet = true;
       return local4 = #t10;
@@ -85,7 +85,7 @@
     FutureOr<self::C::T?>? local5;
     core::bool #local5#isSet = false;
     function #local5#get() → FutureOr<self::C::T?>?
-      return #local5#isSet ?{FutureOr<self::C::T?>?} local5 : throw new _in::LateInitializationErrorImpl::•("Local 'local5' has not been initialized.");
+      return #local5#isSet ?{FutureOr<self::C::T?>?} local5 : throw new _in::LateError::localNI("local5");
     function #local5#set(FutureOr<self::C::T?>? #t11) → dynamic {
       #local5#isSet = true;
       return local5 = #t11;
diff --git a/pkg/front_end/testcases/late_lowering/late_future_or.dart.weak.expect b/pkg/front_end/testcases/late_lowering/late_future_or.dart.weak.expect
index ad35343..78cd9c9 100644
--- a/pkg/front_end/testcases/late_lowering/late_future_or.dart.weak.expect
+++ b/pkg/front_end/testcases/late_lowering/late_future_or.dart.weak.expect
@@ -20,31 +20,31 @@
     : super core::Object::•()
     ;
   get field1() → FutureOr<dynamic>
-    return this.{self::C::_#C#field1#isSet} ?{FutureOr<dynamic>} this.{self::C::_#C#field1} : throw new _in::LateInitializationErrorImpl::•("Field 'field1' has not been initialized.");
+    return this.{self::C::_#C#field1#isSet} ?{FutureOr<dynamic>} this.{self::C::_#C#field1} : throw new _in::LateError::fieldNI("field1");
   set field1(FutureOr<dynamic>#t1) → void {
     this.{self::C::_#C#field1#isSet} = true;
     this.{self::C::_#C#field1} = #t1;
   }
   get field2() → FutureOr<dynamic>?
-    return this.{self::C::_#C#field2#isSet} ?{FutureOr<dynamic>?} this.{self::C::_#C#field2} : throw new _in::LateInitializationErrorImpl::•("Field 'field2' has not been initialized.");
+    return this.{self::C::_#C#field2#isSet} ?{FutureOr<dynamic>?} this.{self::C::_#C#field2} : throw new _in::LateError::fieldNI("field2");
   set field2(FutureOr<dynamic>? #t2) → void {
     this.{self::C::_#C#field2#isSet} = true;
     this.{self::C::_#C#field2} = #t2;
   }
   get field3() → FutureOr<self::C::T%>
-    return this.{self::C::_#C#field3#isSet} ?{FutureOr<self::C::T%>} let final FutureOr<self::C::T%>? #t3 = this.{self::C::_#C#field3} in #t3{FutureOr<self::C::T%>} : throw new _in::LateInitializationErrorImpl::•("Field 'field3' has not been initialized.");
+    return this.{self::C::_#C#field3#isSet} ?{FutureOr<self::C::T%>} let final FutureOr<self::C::T%>? #t3 = this.{self::C::_#C#field3} in #t3{FutureOr<self::C::T%>} : throw new _in::LateError::fieldNI("field3");
   set field3(generic-covariant-impl FutureOr<self::C::T%>#t4) → void {
     this.{self::C::_#C#field3#isSet} = true;
     this.{self::C::_#C#field3} = #t4;
   }
   get field4() → FutureOr<self::C::T?>
-    return this.{self::C::_#C#field4#isSet} ?{FutureOr<self::C::T?>} this.{self::C::_#C#field4} : throw new _in::LateInitializationErrorImpl::•("Field 'field4' has not been initialized.");
+    return this.{self::C::_#C#field4#isSet} ?{FutureOr<self::C::T?>} this.{self::C::_#C#field4} : throw new _in::LateError::fieldNI("field4");
   set field4(generic-covariant-impl FutureOr<self::C::T?>#t5) → void {
     this.{self::C::_#C#field4#isSet} = true;
     this.{self::C::_#C#field4} = #t5;
   }
   get field5() → FutureOr<self::C::T?>?
-    return this.{self::C::_#C#field5#isSet} ?{FutureOr<self::C::T?>?} this.{self::C::_#C#field5} : throw new _in::LateInitializationErrorImpl::•("Field 'field5' has not been initialized.");
+    return this.{self::C::_#C#field5#isSet} ?{FutureOr<self::C::T?>?} this.{self::C::_#C#field5} : throw new _in::LateError::fieldNI("field5");
   set field5(generic-covariant-impl FutureOr<self::C::T?>? #t6) → void {
     this.{self::C::_#C#field5#isSet} = true;
     this.{self::C::_#C#field5} = #t6;
@@ -53,7 +53,7 @@
     FutureOr<dynamic>? local1;
     core::bool #local1#isSet = false;
     function #local1#get() → FutureOr<dynamic>
-      return #local1#isSet ?{FutureOr<dynamic>} local1 : throw new _in::LateInitializationErrorImpl::•("Local 'local1' has not been initialized.");
+      return #local1#isSet ?{FutureOr<dynamic>} local1 : throw new _in::LateError::localNI("local1");
     function #local1#set(FutureOr<dynamic>#t7) → dynamic {
       #local1#isSet = true;
       return local1 = #t7;
@@ -61,7 +61,7 @@
     FutureOr<dynamic>? local2;
     core::bool #local2#isSet = false;
     function #local2#get() → FutureOr<dynamic>?
-      return #local2#isSet ?{FutureOr<dynamic>?} local2 : throw new _in::LateInitializationErrorImpl::•("Local 'local2' has not been initialized.");
+      return #local2#isSet ?{FutureOr<dynamic>?} local2 : throw new _in::LateError::localNI("local2");
     function #local2#set(FutureOr<dynamic>? #t8) → dynamic {
       #local2#isSet = true;
       return local2 = #t8;
@@ -69,7 +69,7 @@
     FutureOr<self::C::T%>? local3;
     core::bool #local3#isSet = false;
     function #local3#get() → FutureOr<self::C::T%>
-      return #local3#isSet ?{FutureOr<self::C::T%>} local3{FutureOr<self::C::T%>} : throw new _in::LateInitializationErrorImpl::•("Local 'local3' has not been initialized.");
+      return #local3#isSet ?{FutureOr<self::C::T%>} local3{FutureOr<self::C::T%>} : throw new _in::LateError::localNI("local3");
     function #local3#set(FutureOr<self::C::T%>#t9) → dynamic {
       #local3#isSet = true;
       return local3 = #t9;
@@ -77,7 +77,7 @@
     FutureOr<self::C::T?>? local4;
     core::bool #local4#isSet = false;
     function #local4#get() → FutureOr<self::C::T?>
-      return #local4#isSet ?{FutureOr<self::C::T?>} local4 : throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.");
+      return #local4#isSet ?{FutureOr<self::C::T?>} local4 : throw new _in::LateError::localNI("local4");
     function #local4#set(FutureOr<self::C::T?>#t10) → dynamic {
       #local4#isSet = true;
       return local4 = #t10;
@@ -85,7 +85,7 @@
     FutureOr<self::C::T?>? local5;
     core::bool #local5#isSet = false;
     function #local5#get() → FutureOr<self::C::T?>?
-      return #local5#isSet ?{FutureOr<self::C::T?>?} local5 : throw new _in::LateInitializationErrorImpl::•("Local 'local5' has not been initialized.");
+      return #local5#isSet ?{FutureOr<self::C::T?>?} local5 : throw new _in::LateError::localNI("local5");
     function #local5#set(FutureOr<self::C::T?>? #t11) → dynamic {
       #local5#isSet = true;
       return local5 = #t11;
diff --git a/pkg/front_end/testcases/late_lowering/late_future_or.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/late_future_or.dart.weak.transformed.expect
index ad35343..78cd9c9 100644
--- a/pkg/front_end/testcases/late_lowering/late_future_or.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/late_future_or.dart.weak.transformed.expect
@@ -20,31 +20,31 @@
     : super core::Object::•()
     ;
   get field1() → FutureOr<dynamic>
-    return this.{self::C::_#C#field1#isSet} ?{FutureOr<dynamic>} this.{self::C::_#C#field1} : throw new _in::LateInitializationErrorImpl::•("Field 'field1' has not been initialized.");
+    return this.{self::C::_#C#field1#isSet} ?{FutureOr<dynamic>} this.{self::C::_#C#field1} : throw new _in::LateError::fieldNI("field1");
   set field1(FutureOr<dynamic>#t1) → void {
     this.{self::C::_#C#field1#isSet} = true;
     this.{self::C::_#C#field1} = #t1;
   }
   get field2() → FutureOr<dynamic>?
-    return this.{self::C::_#C#field2#isSet} ?{FutureOr<dynamic>?} this.{self::C::_#C#field2} : throw new _in::LateInitializationErrorImpl::•("Field 'field2' has not been initialized.");
+    return this.{self::C::_#C#field2#isSet} ?{FutureOr<dynamic>?} this.{self::C::_#C#field2} : throw new _in::LateError::fieldNI("field2");
   set field2(FutureOr<dynamic>? #t2) → void {
     this.{self::C::_#C#field2#isSet} = true;
     this.{self::C::_#C#field2} = #t2;
   }
   get field3() → FutureOr<self::C::T%>
-    return this.{self::C::_#C#field3#isSet} ?{FutureOr<self::C::T%>} let final FutureOr<self::C::T%>? #t3 = this.{self::C::_#C#field3} in #t3{FutureOr<self::C::T%>} : throw new _in::LateInitializationErrorImpl::•("Field 'field3' has not been initialized.");
+    return this.{self::C::_#C#field3#isSet} ?{FutureOr<self::C::T%>} let final FutureOr<self::C::T%>? #t3 = this.{self::C::_#C#field3} in #t3{FutureOr<self::C::T%>} : throw new _in::LateError::fieldNI("field3");
   set field3(generic-covariant-impl FutureOr<self::C::T%>#t4) → void {
     this.{self::C::_#C#field3#isSet} = true;
     this.{self::C::_#C#field3} = #t4;
   }
   get field4() → FutureOr<self::C::T?>
-    return this.{self::C::_#C#field4#isSet} ?{FutureOr<self::C::T?>} this.{self::C::_#C#field4} : throw new _in::LateInitializationErrorImpl::•("Field 'field4' has not been initialized.");
+    return this.{self::C::_#C#field4#isSet} ?{FutureOr<self::C::T?>} this.{self::C::_#C#field4} : throw new _in::LateError::fieldNI("field4");
   set field4(generic-covariant-impl FutureOr<self::C::T?>#t5) → void {
     this.{self::C::_#C#field4#isSet} = true;
     this.{self::C::_#C#field4} = #t5;
   }
   get field5() → FutureOr<self::C::T?>?
-    return this.{self::C::_#C#field5#isSet} ?{FutureOr<self::C::T?>?} this.{self::C::_#C#field5} : throw new _in::LateInitializationErrorImpl::•("Field 'field5' has not been initialized.");
+    return this.{self::C::_#C#field5#isSet} ?{FutureOr<self::C::T?>?} this.{self::C::_#C#field5} : throw new _in::LateError::fieldNI("field5");
   set field5(generic-covariant-impl FutureOr<self::C::T?>? #t6) → void {
     this.{self::C::_#C#field5#isSet} = true;
     this.{self::C::_#C#field5} = #t6;
@@ -53,7 +53,7 @@
     FutureOr<dynamic>? local1;
     core::bool #local1#isSet = false;
     function #local1#get() → FutureOr<dynamic>
-      return #local1#isSet ?{FutureOr<dynamic>} local1 : throw new _in::LateInitializationErrorImpl::•("Local 'local1' has not been initialized.");
+      return #local1#isSet ?{FutureOr<dynamic>} local1 : throw new _in::LateError::localNI("local1");
     function #local1#set(FutureOr<dynamic>#t7) → dynamic {
       #local1#isSet = true;
       return local1 = #t7;
@@ -61,7 +61,7 @@
     FutureOr<dynamic>? local2;
     core::bool #local2#isSet = false;
     function #local2#get() → FutureOr<dynamic>?
-      return #local2#isSet ?{FutureOr<dynamic>?} local2 : throw new _in::LateInitializationErrorImpl::•("Local 'local2' has not been initialized.");
+      return #local2#isSet ?{FutureOr<dynamic>?} local2 : throw new _in::LateError::localNI("local2");
     function #local2#set(FutureOr<dynamic>? #t8) → dynamic {
       #local2#isSet = true;
       return local2 = #t8;
@@ -69,7 +69,7 @@
     FutureOr<self::C::T%>? local3;
     core::bool #local3#isSet = false;
     function #local3#get() → FutureOr<self::C::T%>
-      return #local3#isSet ?{FutureOr<self::C::T%>} local3{FutureOr<self::C::T%>} : throw new _in::LateInitializationErrorImpl::•("Local 'local3' has not been initialized.");
+      return #local3#isSet ?{FutureOr<self::C::T%>} local3{FutureOr<self::C::T%>} : throw new _in::LateError::localNI("local3");
     function #local3#set(FutureOr<self::C::T%>#t9) → dynamic {
       #local3#isSet = true;
       return local3 = #t9;
@@ -77,7 +77,7 @@
     FutureOr<self::C::T?>? local4;
     core::bool #local4#isSet = false;
     function #local4#get() → FutureOr<self::C::T?>
-      return #local4#isSet ?{FutureOr<self::C::T?>} local4 : throw new _in::LateInitializationErrorImpl::•("Local 'local4' has not been initialized.");
+      return #local4#isSet ?{FutureOr<self::C::T?>} local4 : throw new _in::LateError::localNI("local4");
     function #local4#set(FutureOr<self::C::T?>#t10) → dynamic {
       #local4#isSet = true;
       return local4 = #t10;
@@ -85,7 +85,7 @@
     FutureOr<self::C::T?>? local5;
     core::bool #local5#isSet = false;
     function #local5#get() → FutureOr<self::C::T?>?
-      return #local5#isSet ?{FutureOr<self::C::T?>?} local5 : throw new _in::LateInitializationErrorImpl::•("Local 'local5' has not been initialized.");
+      return #local5#isSet ?{FutureOr<self::C::T?>?} local5 : throw new _in::LateError::localNI("local5");
     function #local5#set(FutureOr<self::C::T?>? #t11) → dynamic {
       #local5#isSet = true;
       return local5 = #t11;
diff --git a/pkg/front_end/testcases/late_lowering/late_local_with_initializer.dart.strong.expect b/pkg/front_end/testcases/late_lowering/late_local_with_initializer.dart.strong.expect
index 9fbaf26..d08871e 100644
--- a/pkg/front_end/testcases/late_lowering/late_local_with_initializer.dart.strong.expect
+++ b/pkg/front_end/testcases/late_lowering/late_local_with_initializer.dart.strong.expect
@@ -11,7 +11,7 @@
   self::expect(123, #lateLocal#get.call());
   self::expect(124, #lateLocal#set.call(124));
   self::expect(124, #lateLocal#get.call());
-  function local<T extends core::Object? = dynamic>(T% value1, T% value2) → core::Null? {
+  function local<T extends core::Object? = dynamic>(T% value1, T% value2) → Null {
     T? lateGenericLocal;
     core::bool #lateGenericLocal#isSet = false;
     function #lateGenericLocal#get() → T% {
diff --git a/pkg/front_end/testcases/late_lowering/late_local_with_initializer.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/late_local_with_initializer.dart.strong.transformed.expect
index 9fbaf26..d08871e 100644
--- a/pkg/front_end/testcases/late_lowering/late_local_with_initializer.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/late_local_with_initializer.dart.strong.transformed.expect
@@ -11,7 +11,7 @@
   self::expect(123, #lateLocal#get.call());
   self::expect(124, #lateLocal#set.call(124));
   self::expect(124, #lateLocal#get.call());
-  function local<T extends core::Object? = dynamic>(T% value1, T% value2) → core::Null? {
+  function local<T extends core::Object? = dynamic>(T% value1, T% value2) → Null {
     T? lateGenericLocal;
     core::bool #lateGenericLocal#isSet = false;
     function #lateGenericLocal#get() → T% {
diff --git a/pkg/front_end/testcases/late_lowering/late_local_with_initializer.dart.weak.expect b/pkg/front_end/testcases/late_lowering/late_local_with_initializer.dart.weak.expect
index 81e2022..c681474 100644
--- a/pkg/front_end/testcases/late_lowering/late_local_with_initializer.dart.weak.expect
+++ b/pkg/front_end/testcases/late_lowering/late_local_with_initializer.dart.weak.expect
@@ -19,7 +19,7 @@
   self::expect(123, #lateLocal#get.call());
   self::expect(124, #lateLocal#set.call(124));
   self::expect(124, #lateLocal#get.call());
-  function local<T extends core::Object? = dynamic>(T% value1, T% value2) → core::Null? {
+  function local<T extends core::Object? = dynamic>(T% value1, T% value2) → Null {
     T? lateGenericLocal;
     core::bool #lateGenericLocal#isSet = false;
     function #lateGenericLocal#get() → T% {
diff --git a/pkg/front_end/testcases/late_lowering/late_local_with_initializer.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/late_local_with_initializer.dart.weak.transformed.expect
index 81e2022..c681474 100644
--- a/pkg/front_end/testcases/late_lowering/late_local_with_initializer.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/late_local_with_initializer.dart.weak.transformed.expect
@@ -19,7 +19,7 @@
   self::expect(123, #lateLocal#get.call());
   self::expect(124, #lateLocal#set.call(124));
   self::expect(124, #lateLocal#get.call());
-  function local<T extends core::Object? = dynamic>(T% value1, T% value2) → core::Null? {
+  function local<T extends core::Object? = dynamic>(T% value1, T% value2) → Null {
     T? lateGenericLocal;
     core::bool #lateGenericLocal#isSet = false;
     function #lateGenericLocal#get() → T% {
diff --git a/pkg/front_end/testcases/late_lowering/late_local_without_initializer.dart.strong.expect b/pkg/front_end/testcases/late_lowering/late_local_without_initializer.dart.strong.expect
index eaf2671..0f888e9 100644
--- a/pkg/front_end/testcases/late_lowering/late_local_without_initializer.dart.strong.expect
+++ b/pkg/front_end/testcases/late_lowering/late_local_without_initializer.dart.strong.expect
@@ -6,17 +6,17 @@
 static method main() → dynamic {
   core::int? lateLocal;
   function #lateLocal#get() → core::int
-    return let final core::int? #t1 = lateLocal in #t1.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'lateLocal' has not been initialized.") : #t1{core::int};
+    return let final core::int? #t1 = lateLocal in #t1.==(null) ?{core::int} throw new _in::LateError::localNI("lateLocal") : #t1{core::int};
   function #lateLocal#set(core::int #t2) → dynamic
     return lateLocal = #t2;
   self::throws(() → core::int => #lateLocal#get.call(), "Read value from uninitialized lateLocal");
   self::expect(123, #lateLocal#set.call(123));
   self::expect(123, #lateLocal#get.call());
-  function local<T extends core::Object? = dynamic>(T% value) → core::Null? {
+  function local<T extends core::Object? = dynamic>(T% value) → Null {
     T? lateGenericLocal;
     core::bool #lateGenericLocal#isSet = false;
     function #lateGenericLocal#get() → T%
-      return #lateGenericLocal#isSet ?{T%} lateGenericLocal{T%} : throw new _in::LateInitializationErrorImpl::•("Local 'lateGenericLocal' has not been initialized.");
+      return #lateGenericLocal#isSet ?{T%} lateGenericLocal{T%} : throw new _in::LateError::localNI("lateGenericLocal");
     function #lateGenericLocal#set(T% #t3) → dynamic {
       #lateGenericLocal#isSet = true;
       return lateGenericLocal = #t3;
diff --git a/pkg/front_end/testcases/late_lowering/late_local_without_initializer.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/late_local_without_initializer.dart.strong.transformed.expect
index eaf2671..0f888e9 100644
--- a/pkg/front_end/testcases/late_lowering/late_local_without_initializer.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/late_local_without_initializer.dart.strong.transformed.expect
@@ -6,17 +6,17 @@
 static method main() → dynamic {
   core::int? lateLocal;
   function #lateLocal#get() → core::int
-    return let final core::int? #t1 = lateLocal in #t1.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'lateLocal' has not been initialized.") : #t1{core::int};
+    return let final core::int? #t1 = lateLocal in #t1.==(null) ?{core::int} throw new _in::LateError::localNI("lateLocal") : #t1{core::int};
   function #lateLocal#set(core::int #t2) → dynamic
     return lateLocal = #t2;
   self::throws(() → core::int => #lateLocal#get.call(), "Read value from uninitialized lateLocal");
   self::expect(123, #lateLocal#set.call(123));
   self::expect(123, #lateLocal#get.call());
-  function local<T extends core::Object? = dynamic>(T% value) → core::Null? {
+  function local<T extends core::Object? = dynamic>(T% value) → Null {
     T? lateGenericLocal;
     core::bool #lateGenericLocal#isSet = false;
     function #lateGenericLocal#get() → T%
-      return #lateGenericLocal#isSet ?{T%} lateGenericLocal{T%} : throw new _in::LateInitializationErrorImpl::•("Local 'lateGenericLocal' has not been initialized.");
+      return #lateGenericLocal#isSet ?{T%} lateGenericLocal{T%} : throw new _in::LateError::localNI("lateGenericLocal");
     function #lateGenericLocal#set(T% #t3) → dynamic {
       #lateGenericLocal#isSet = true;
       return lateGenericLocal = #t3;
diff --git a/pkg/front_end/testcases/late_lowering/late_local_without_initializer.dart.weak.expect b/pkg/front_end/testcases/late_lowering/late_local_without_initializer.dart.weak.expect
index 9c46d6e..49dc955 100644
--- a/pkg/front_end/testcases/late_lowering/late_local_without_initializer.dart.weak.expect
+++ b/pkg/front_end/testcases/late_lowering/late_local_without_initializer.dart.weak.expect
@@ -7,7 +7,7 @@
   core::int? lateLocal;
   core::bool #lateLocal#isSet = false;
   function #lateLocal#get() → core::int
-    return #lateLocal#isSet ?{core::int} lateLocal{core::int} : throw new _in::LateInitializationErrorImpl::•("Local 'lateLocal' has not been initialized.");
+    return #lateLocal#isSet ?{core::int} lateLocal{core::int} : throw new _in::LateError::localNI("lateLocal");
   function #lateLocal#set(core::int #t1) → dynamic {
     #lateLocal#isSet = true;
     return lateLocal = #t1;
@@ -15,11 +15,11 @@
   self::throws(() → core::int => #lateLocal#get.call(), "Read value from uninitialized lateLocal");
   self::expect(123, #lateLocal#set.call(123));
   self::expect(123, #lateLocal#get.call());
-  function local<T extends core::Object? = dynamic>(T% value) → core::Null? {
+  function local<T extends core::Object? = dynamic>(T% value) → Null {
     T? lateGenericLocal;
     core::bool #lateGenericLocal#isSet = false;
     function #lateGenericLocal#get() → T%
-      return #lateGenericLocal#isSet ?{T%} lateGenericLocal{T%} : throw new _in::LateInitializationErrorImpl::•("Local 'lateGenericLocal' has not been initialized.");
+      return #lateGenericLocal#isSet ?{T%} lateGenericLocal{T%} : throw new _in::LateError::localNI("lateGenericLocal");
     function #lateGenericLocal#set(T% #t2) → dynamic {
       #lateGenericLocal#isSet = true;
       return lateGenericLocal = #t2;
diff --git a/pkg/front_end/testcases/late_lowering/late_local_without_initializer.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/late_local_without_initializer.dart.weak.transformed.expect
index 9c46d6e..49dc955 100644
--- a/pkg/front_end/testcases/late_lowering/late_local_without_initializer.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/late_local_without_initializer.dart.weak.transformed.expect
@@ -7,7 +7,7 @@
   core::int? lateLocal;
   core::bool #lateLocal#isSet = false;
   function #lateLocal#get() → core::int
-    return #lateLocal#isSet ?{core::int} lateLocal{core::int} : throw new _in::LateInitializationErrorImpl::•("Local 'lateLocal' has not been initialized.");
+    return #lateLocal#isSet ?{core::int} lateLocal{core::int} : throw new _in::LateError::localNI("lateLocal");
   function #lateLocal#set(core::int #t1) → dynamic {
     #lateLocal#isSet = true;
     return lateLocal = #t1;
@@ -15,11 +15,11 @@
   self::throws(() → core::int => #lateLocal#get.call(), "Read value from uninitialized lateLocal");
   self::expect(123, #lateLocal#set.call(123));
   self::expect(123, #lateLocal#get.call());
-  function local<T extends core::Object? = dynamic>(T% value) → core::Null? {
+  function local<T extends core::Object? = dynamic>(T% value) → Null {
     T? lateGenericLocal;
     core::bool #lateGenericLocal#isSet = false;
     function #lateGenericLocal#get() → T%
-      return #lateGenericLocal#isSet ?{T%} lateGenericLocal{T%} : throw new _in::LateInitializationErrorImpl::•("Local 'lateGenericLocal' has not been initialized.");
+      return #lateGenericLocal#isSet ?{T%} lateGenericLocal{T%} : throw new _in::LateError::localNI("lateGenericLocal");
     function #lateGenericLocal#set(T% #t2) → dynamic {
       #lateGenericLocal#isSet = true;
       return lateGenericLocal = #t2;
diff --git a/pkg/front_end/testcases/late_lowering/late_nullable_field_without_initializer.dart.strong.expect b/pkg/front_end/testcases/late_lowering/late_nullable_field_without_initializer.dart.strong.expect
index fe6ab5e..5faf637 100644
--- a/pkg/front_end/testcases/late_lowering/late_nullable_field_without_initializer.dart.strong.expect
+++ b/pkg/front_end/testcases/late_lowering/late_nullable_field_without_initializer.dart.strong.expect
@@ -16,13 +16,13 @@
     : super core::Object::•()
     ;
   static get lateStaticField1() → core::int?
-    return self::Class::_#lateStaticField1#isSet ?{core::int?} self::Class::_#lateStaticField1 : throw new _in::LateInitializationErrorImpl::•("Field 'lateStaticField1' has not been initialized.");
+    return self::Class::_#lateStaticField1#isSet ?{core::int?} self::Class::_#lateStaticField1 : throw new _in::LateError::fieldNI("lateStaticField1");
   static set lateStaticField1(core::int? #t1) → void {
     self::Class::_#lateStaticField1#isSet = true;
     self::Class::_#lateStaticField1 = #t1;
   }
   static get lateStaticField2() → core::int?
-    return self::Class::_#lateStaticField2#isSet ?{core::int?} self::Class::_#lateStaticField2 : throw new _in::LateInitializationErrorImpl::•("Field 'lateStaticField2' has not been initialized.");
+    return self::Class::_#lateStaticField2#isSet ?{core::int?} self::Class::_#lateStaticField2 : throw new _in::LateError::fieldNI("lateStaticField2");
   static set lateStaticField2(core::int? #t2) → void {
     self::Class::_#lateStaticField2#isSet = true;
     self::Class::_#lateStaticField2 = #t2;
@@ -33,13 +33,13 @@
     self::expect(42, self::Class::lateStaticField2);
   }
   get lateInstanceField() → core::int?
-    return this.{self::Class::_#Class#lateInstanceField#isSet} ?{core::int?} this.{self::Class::_#Class#lateInstanceField} : throw new _in::LateInitializationErrorImpl::•("Field 'lateInstanceField' has not been initialized.");
+    return this.{self::Class::_#Class#lateInstanceField#isSet} ?{core::int?} this.{self::Class::_#Class#lateInstanceField} : throw new _in::LateError::fieldNI("lateInstanceField");
   set lateInstanceField(core::int? #t3) → void {
     this.{self::Class::_#Class#lateInstanceField#isSet} = true;
     this.{self::Class::_#Class#lateInstanceField} = #t3;
   }
   get lateGenericInstanceField() → self::Class::T?
-    return this.{self::Class::_#Class#lateGenericInstanceField#isSet} ?{self::Class::T?} this.{self::Class::_#Class#lateGenericInstanceField} : throw new _in::LateInitializationErrorImpl::•("Field 'lateGenericInstanceField' has not been initialized.");
+    return this.{self::Class::_#Class#lateGenericInstanceField#isSet} ?{self::Class::T?} this.{self::Class::_#Class#lateGenericInstanceField} : throw new _in::LateError::fieldNI("lateGenericInstanceField");
   set lateGenericInstanceField(generic-covariant-impl self::Class::T? #t4) → void {
     this.{self::Class::_#Class#lateGenericInstanceField#isSet} = true;
     this.{self::Class::_#Class#lateGenericInstanceField} = #t4;
@@ -71,19 +71,19 @@
 static field core::int? _#Extension|lateExtensionField2 = null;
 static field core::bool _#Extension|lateExtensionField2#isSet = false;
 static get lateTopLevelField() → core::int?
-  return self::_#lateTopLevelField#isSet ?{core::int?} self::_#lateTopLevelField : throw new _in::LateInitializationErrorImpl::•("Field 'lateTopLevelField' has not been initialized.");
+  return self::_#lateTopLevelField#isSet ?{core::int?} self::_#lateTopLevelField : throw new _in::LateError::fieldNI("lateTopLevelField");
 static set lateTopLevelField(core::int? #t5) → void {
   self::_#lateTopLevelField#isSet = true;
   self::_#lateTopLevelField = #t5;
 }
 static get Extension|lateExtensionField1() → core::int?
-  return self::_#Extension|lateExtensionField1#isSet ?{core::int?} self::_#Extension|lateExtensionField1 : throw new _in::LateInitializationErrorImpl::•("Field 'lateExtensionField1' has not been initialized.");
+  return self::_#Extension|lateExtensionField1#isSet ?{core::int?} self::_#Extension|lateExtensionField1 : throw new _in::LateError::fieldNI("lateExtensionField1");
 static set Extension|lateExtensionField1(core::int? #t6) → void {
   self::_#Extension|lateExtensionField1#isSet = true;
   self::_#Extension|lateExtensionField1 = #t6;
 }
 static get Extension|lateExtensionField2() → core::int?
-  return self::_#Extension|lateExtensionField2#isSet ?{core::int?} self::_#Extension|lateExtensionField2 : throw new _in::LateInitializationErrorImpl::•("Field 'lateExtensionField2' has not been initialized.");
+  return self::_#Extension|lateExtensionField2#isSet ?{core::int?} self::_#Extension|lateExtensionField2 : throw new _in::LateError::fieldNI("lateExtensionField2");
 static set Extension|lateExtensionField2(core::int? #t7) → void {
   self::_#Extension|lateExtensionField2#isSet = true;
   self::_#Extension|lateExtensionField2 = #t7;
diff --git a/pkg/front_end/testcases/late_lowering/late_nullable_field_without_initializer.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/late_nullable_field_without_initializer.dart.strong.transformed.expect
index fe6ab5e..5faf637 100644
--- a/pkg/front_end/testcases/late_lowering/late_nullable_field_without_initializer.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/late_nullable_field_without_initializer.dart.strong.transformed.expect
@@ -16,13 +16,13 @@
     : super core::Object::•()
     ;
   static get lateStaticField1() → core::int?
-    return self::Class::_#lateStaticField1#isSet ?{core::int?} self::Class::_#lateStaticField1 : throw new _in::LateInitializationErrorImpl::•("Field 'lateStaticField1' has not been initialized.");
+    return self::Class::_#lateStaticField1#isSet ?{core::int?} self::Class::_#lateStaticField1 : throw new _in::LateError::fieldNI("lateStaticField1");
   static set lateStaticField1(core::int? #t1) → void {
     self::Class::_#lateStaticField1#isSet = true;
     self::Class::_#lateStaticField1 = #t1;
   }
   static get lateStaticField2() → core::int?
-    return self::Class::_#lateStaticField2#isSet ?{core::int?} self::Class::_#lateStaticField2 : throw new _in::LateInitializationErrorImpl::•("Field 'lateStaticField2' has not been initialized.");
+    return self::Class::_#lateStaticField2#isSet ?{core::int?} self::Class::_#lateStaticField2 : throw new _in::LateError::fieldNI("lateStaticField2");
   static set lateStaticField2(core::int? #t2) → void {
     self::Class::_#lateStaticField2#isSet = true;
     self::Class::_#lateStaticField2 = #t2;
@@ -33,13 +33,13 @@
     self::expect(42, self::Class::lateStaticField2);
   }
   get lateInstanceField() → core::int?
-    return this.{self::Class::_#Class#lateInstanceField#isSet} ?{core::int?} this.{self::Class::_#Class#lateInstanceField} : throw new _in::LateInitializationErrorImpl::•("Field 'lateInstanceField' has not been initialized.");
+    return this.{self::Class::_#Class#lateInstanceField#isSet} ?{core::int?} this.{self::Class::_#Class#lateInstanceField} : throw new _in::LateError::fieldNI("lateInstanceField");
   set lateInstanceField(core::int? #t3) → void {
     this.{self::Class::_#Class#lateInstanceField#isSet} = true;
     this.{self::Class::_#Class#lateInstanceField} = #t3;
   }
   get lateGenericInstanceField() → self::Class::T?
-    return this.{self::Class::_#Class#lateGenericInstanceField#isSet} ?{self::Class::T?} this.{self::Class::_#Class#lateGenericInstanceField} : throw new _in::LateInitializationErrorImpl::•("Field 'lateGenericInstanceField' has not been initialized.");
+    return this.{self::Class::_#Class#lateGenericInstanceField#isSet} ?{self::Class::T?} this.{self::Class::_#Class#lateGenericInstanceField} : throw new _in::LateError::fieldNI("lateGenericInstanceField");
   set lateGenericInstanceField(generic-covariant-impl self::Class::T? #t4) → void {
     this.{self::Class::_#Class#lateGenericInstanceField#isSet} = true;
     this.{self::Class::_#Class#lateGenericInstanceField} = #t4;
@@ -71,19 +71,19 @@
 static field core::int? _#Extension|lateExtensionField2 = null;
 static field core::bool _#Extension|lateExtensionField2#isSet = false;
 static get lateTopLevelField() → core::int?
-  return self::_#lateTopLevelField#isSet ?{core::int?} self::_#lateTopLevelField : throw new _in::LateInitializationErrorImpl::•("Field 'lateTopLevelField' has not been initialized.");
+  return self::_#lateTopLevelField#isSet ?{core::int?} self::_#lateTopLevelField : throw new _in::LateError::fieldNI("lateTopLevelField");
 static set lateTopLevelField(core::int? #t5) → void {
   self::_#lateTopLevelField#isSet = true;
   self::_#lateTopLevelField = #t5;
 }
 static get Extension|lateExtensionField1() → core::int?
-  return self::_#Extension|lateExtensionField1#isSet ?{core::int?} self::_#Extension|lateExtensionField1 : throw new _in::LateInitializationErrorImpl::•("Field 'lateExtensionField1' has not been initialized.");
+  return self::_#Extension|lateExtensionField1#isSet ?{core::int?} self::_#Extension|lateExtensionField1 : throw new _in::LateError::fieldNI("lateExtensionField1");
 static set Extension|lateExtensionField1(core::int? #t6) → void {
   self::_#Extension|lateExtensionField1#isSet = true;
   self::_#Extension|lateExtensionField1 = #t6;
 }
 static get Extension|lateExtensionField2() → core::int?
-  return self::_#Extension|lateExtensionField2#isSet ?{core::int?} self::_#Extension|lateExtensionField2 : throw new _in::LateInitializationErrorImpl::•("Field 'lateExtensionField2' has not been initialized.");
+  return self::_#Extension|lateExtensionField2#isSet ?{core::int?} self::_#Extension|lateExtensionField2 : throw new _in::LateError::fieldNI("lateExtensionField2");
 static set Extension|lateExtensionField2(core::int? #t7) → void {
   self::_#Extension|lateExtensionField2#isSet = true;
   self::_#Extension|lateExtensionField2 = #t7;
diff --git a/pkg/front_end/testcases/late_lowering/late_nullable_field_without_initializer.dart.weak.expect b/pkg/front_end/testcases/late_lowering/late_nullable_field_without_initializer.dart.weak.expect
index fe6ab5e..5faf637 100644
--- a/pkg/front_end/testcases/late_lowering/late_nullable_field_without_initializer.dart.weak.expect
+++ b/pkg/front_end/testcases/late_lowering/late_nullable_field_without_initializer.dart.weak.expect
@@ -16,13 +16,13 @@
     : super core::Object::•()
     ;
   static get lateStaticField1() → core::int?
-    return self::Class::_#lateStaticField1#isSet ?{core::int?} self::Class::_#lateStaticField1 : throw new _in::LateInitializationErrorImpl::•("Field 'lateStaticField1' has not been initialized.");
+    return self::Class::_#lateStaticField1#isSet ?{core::int?} self::Class::_#lateStaticField1 : throw new _in::LateError::fieldNI("lateStaticField1");
   static set lateStaticField1(core::int? #t1) → void {
     self::Class::_#lateStaticField1#isSet = true;
     self::Class::_#lateStaticField1 = #t1;
   }
   static get lateStaticField2() → core::int?
-    return self::Class::_#lateStaticField2#isSet ?{core::int?} self::Class::_#lateStaticField2 : throw new _in::LateInitializationErrorImpl::•("Field 'lateStaticField2' has not been initialized.");
+    return self::Class::_#lateStaticField2#isSet ?{core::int?} self::Class::_#lateStaticField2 : throw new _in::LateError::fieldNI("lateStaticField2");
   static set lateStaticField2(core::int? #t2) → void {
     self::Class::_#lateStaticField2#isSet = true;
     self::Class::_#lateStaticField2 = #t2;
@@ -33,13 +33,13 @@
     self::expect(42, self::Class::lateStaticField2);
   }
   get lateInstanceField() → core::int?
-    return this.{self::Class::_#Class#lateInstanceField#isSet} ?{core::int?} this.{self::Class::_#Class#lateInstanceField} : throw new _in::LateInitializationErrorImpl::•("Field 'lateInstanceField' has not been initialized.");
+    return this.{self::Class::_#Class#lateInstanceField#isSet} ?{core::int?} this.{self::Class::_#Class#lateInstanceField} : throw new _in::LateError::fieldNI("lateInstanceField");
   set lateInstanceField(core::int? #t3) → void {
     this.{self::Class::_#Class#lateInstanceField#isSet} = true;
     this.{self::Class::_#Class#lateInstanceField} = #t3;
   }
   get lateGenericInstanceField() → self::Class::T?
-    return this.{self::Class::_#Class#lateGenericInstanceField#isSet} ?{self::Class::T?} this.{self::Class::_#Class#lateGenericInstanceField} : throw new _in::LateInitializationErrorImpl::•("Field 'lateGenericInstanceField' has not been initialized.");
+    return this.{self::Class::_#Class#lateGenericInstanceField#isSet} ?{self::Class::T?} this.{self::Class::_#Class#lateGenericInstanceField} : throw new _in::LateError::fieldNI("lateGenericInstanceField");
   set lateGenericInstanceField(generic-covariant-impl self::Class::T? #t4) → void {
     this.{self::Class::_#Class#lateGenericInstanceField#isSet} = true;
     this.{self::Class::_#Class#lateGenericInstanceField} = #t4;
@@ -71,19 +71,19 @@
 static field core::int? _#Extension|lateExtensionField2 = null;
 static field core::bool _#Extension|lateExtensionField2#isSet = false;
 static get lateTopLevelField() → core::int?
-  return self::_#lateTopLevelField#isSet ?{core::int?} self::_#lateTopLevelField : throw new _in::LateInitializationErrorImpl::•("Field 'lateTopLevelField' has not been initialized.");
+  return self::_#lateTopLevelField#isSet ?{core::int?} self::_#lateTopLevelField : throw new _in::LateError::fieldNI("lateTopLevelField");
 static set lateTopLevelField(core::int? #t5) → void {
   self::_#lateTopLevelField#isSet = true;
   self::_#lateTopLevelField = #t5;
 }
 static get Extension|lateExtensionField1() → core::int?
-  return self::_#Extension|lateExtensionField1#isSet ?{core::int?} self::_#Extension|lateExtensionField1 : throw new _in::LateInitializationErrorImpl::•("Field 'lateExtensionField1' has not been initialized.");
+  return self::_#Extension|lateExtensionField1#isSet ?{core::int?} self::_#Extension|lateExtensionField1 : throw new _in::LateError::fieldNI("lateExtensionField1");
 static set Extension|lateExtensionField1(core::int? #t6) → void {
   self::_#Extension|lateExtensionField1#isSet = true;
   self::_#Extension|lateExtensionField1 = #t6;
 }
 static get Extension|lateExtensionField2() → core::int?
-  return self::_#Extension|lateExtensionField2#isSet ?{core::int?} self::_#Extension|lateExtensionField2 : throw new _in::LateInitializationErrorImpl::•("Field 'lateExtensionField2' has not been initialized.");
+  return self::_#Extension|lateExtensionField2#isSet ?{core::int?} self::_#Extension|lateExtensionField2 : throw new _in::LateError::fieldNI("lateExtensionField2");
 static set Extension|lateExtensionField2(core::int? #t7) → void {
   self::_#Extension|lateExtensionField2#isSet = true;
   self::_#Extension|lateExtensionField2 = #t7;
diff --git a/pkg/front_end/testcases/late_lowering/late_nullable_field_without_initializer.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/late_nullable_field_without_initializer.dart.weak.transformed.expect
index fe6ab5e..5faf637 100644
--- a/pkg/front_end/testcases/late_lowering/late_nullable_field_without_initializer.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/late_nullable_field_without_initializer.dart.weak.transformed.expect
@@ -16,13 +16,13 @@
     : super core::Object::•()
     ;
   static get lateStaticField1() → core::int?
-    return self::Class::_#lateStaticField1#isSet ?{core::int?} self::Class::_#lateStaticField1 : throw new _in::LateInitializationErrorImpl::•("Field 'lateStaticField1' has not been initialized.");
+    return self::Class::_#lateStaticField1#isSet ?{core::int?} self::Class::_#lateStaticField1 : throw new _in::LateError::fieldNI("lateStaticField1");
   static set lateStaticField1(core::int? #t1) → void {
     self::Class::_#lateStaticField1#isSet = true;
     self::Class::_#lateStaticField1 = #t1;
   }
   static get lateStaticField2() → core::int?
-    return self::Class::_#lateStaticField2#isSet ?{core::int?} self::Class::_#lateStaticField2 : throw new _in::LateInitializationErrorImpl::•("Field 'lateStaticField2' has not been initialized.");
+    return self::Class::_#lateStaticField2#isSet ?{core::int?} self::Class::_#lateStaticField2 : throw new _in::LateError::fieldNI("lateStaticField2");
   static set lateStaticField2(core::int? #t2) → void {
     self::Class::_#lateStaticField2#isSet = true;
     self::Class::_#lateStaticField2 = #t2;
@@ -33,13 +33,13 @@
     self::expect(42, self::Class::lateStaticField2);
   }
   get lateInstanceField() → core::int?
-    return this.{self::Class::_#Class#lateInstanceField#isSet} ?{core::int?} this.{self::Class::_#Class#lateInstanceField} : throw new _in::LateInitializationErrorImpl::•("Field 'lateInstanceField' has not been initialized.");
+    return this.{self::Class::_#Class#lateInstanceField#isSet} ?{core::int?} this.{self::Class::_#Class#lateInstanceField} : throw new _in::LateError::fieldNI("lateInstanceField");
   set lateInstanceField(core::int? #t3) → void {
     this.{self::Class::_#Class#lateInstanceField#isSet} = true;
     this.{self::Class::_#Class#lateInstanceField} = #t3;
   }
   get lateGenericInstanceField() → self::Class::T?
-    return this.{self::Class::_#Class#lateGenericInstanceField#isSet} ?{self::Class::T?} this.{self::Class::_#Class#lateGenericInstanceField} : throw new _in::LateInitializationErrorImpl::•("Field 'lateGenericInstanceField' has not been initialized.");
+    return this.{self::Class::_#Class#lateGenericInstanceField#isSet} ?{self::Class::T?} this.{self::Class::_#Class#lateGenericInstanceField} : throw new _in::LateError::fieldNI("lateGenericInstanceField");
   set lateGenericInstanceField(generic-covariant-impl self::Class::T? #t4) → void {
     this.{self::Class::_#Class#lateGenericInstanceField#isSet} = true;
     this.{self::Class::_#Class#lateGenericInstanceField} = #t4;
@@ -71,19 +71,19 @@
 static field core::int? _#Extension|lateExtensionField2 = null;
 static field core::bool _#Extension|lateExtensionField2#isSet = false;
 static get lateTopLevelField() → core::int?
-  return self::_#lateTopLevelField#isSet ?{core::int?} self::_#lateTopLevelField : throw new _in::LateInitializationErrorImpl::•("Field 'lateTopLevelField' has not been initialized.");
+  return self::_#lateTopLevelField#isSet ?{core::int?} self::_#lateTopLevelField : throw new _in::LateError::fieldNI("lateTopLevelField");
 static set lateTopLevelField(core::int? #t5) → void {
   self::_#lateTopLevelField#isSet = true;
   self::_#lateTopLevelField = #t5;
 }
 static get Extension|lateExtensionField1() → core::int?
-  return self::_#Extension|lateExtensionField1#isSet ?{core::int?} self::_#Extension|lateExtensionField1 : throw new _in::LateInitializationErrorImpl::•("Field 'lateExtensionField1' has not been initialized.");
+  return self::_#Extension|lateExtensionField1#isSet ?{core::int?} self::_#Extension|lateExtensionField1 : throw new _in::LateError::fieldNI("lateExtensionField1");
 static set Extension|lateExtensionField1(core::int? #t6) → void {
   self::_#Extension|lateExtensionField1#isSet = true;
   self::_#Extension|lateExtensionField1 = #t6;
 }
 static get Extension|lateExtensionField2() → core::int?
-  return self::_#Extension|lateExtensionField2#isSet ?{core::int?} self::_#Extension|lateExtensionField2 : throw new _in::LateInitializationErrorImpl::•("Field 'lateExtensionField2' has not been initialized.");
+  return self::_#Extension|lateExtensionField2#isSet ?{core::int?} self::_#Extension|lateExtensionField2 : throw new _in::LateError::fieldNI("lateExtensionField2");
 static set Extension|lateExtensionField2(core::int? #t7) → void {
   self::_#Extension|lateExtensionField2#isSet = true;
   self::_#Extension|lateExtensionField2 = #t7;
diff --git a/pkg/front_end/testcases/late_lowering/late_nullable_local_with_initializer.dart.strong.expect b/pkg/front_end/testcases/late_lowering/late_nullable_local_with_initializer.dart.strong.expect
index dea8137..44a6c7f 100644
--- a/pkg/front_end/testcases/late_lowering/late_nullable_local_with_initializer.dart.strong.expect
+++ b/pkg/front_end/testcases/late_lowering/late_nullable_local_with_initializer.dart.strong.expect
@@ -21,7 +21,7 @@
   self::expect(123, #lateLocal#get.call());
   self::expect(124, #lateLocal#set.call(124));
   self::expect(124, #lateLocal#get.call());
-  function local<T extends core::Object? = dynamic>(T? value1, T? value2) → core::Null? {
+  function local<T extends core::Object? = dynamic>(T? value1, T? value2) → Null {
     T? lateGenericLocal;
     core::bool #lateGenericLocal#isSet = false;
     function #lateGenericLocal#get() → T? {
diff --git a/pkg/front_end/testcases/late_lowering/late_nullable_local_with_initializer.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/late_nullable_local_with_initializer.dart.strong.transformed.expect
index dea8137..44a6c7f 100644
--- a/pkg/front_end/testcases/late_lowering/late_nullable_local_with_initializer.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/late_nullable_local_with_initializer.dart.strong.transformed.expect
@@ -21,7 +21,7 @@
   self::expect(123, #lateLocal#get.call());
   self::expect(124, #lateLocal#set.call(124));
   self::expect(124, #lateLocal#get.call());
-  function local<T extends core::Object? = dynamic>(T? value1, T? value2) → core::Null? {
+  function local<T extends core::Object? = dynamic>(T? value1, T? value2) → Null {
     T? lateGenericLocal;
     core::bool #lateGenericLocal#isSet = false;
     function #lateGenericLocal#get() → T? {
diff --git a/pkg/front_end/testcases/late_lowering/late_nullable_local_with_initializer.dart.weak.expect b/pkg/front_end/testcases/late_lowering/late_nullable_local_with_initializer.dart.weak.expect
index dea8137..44a6c7f 100644
--- a/pkg/front_end/testcases/late_lowering/late_nullable_local_with_initializer.dart.weak.expect
+++ b/pkg/front_end/testcases/late_lowering/late_nullable_local_with_initializer.dart.weak.expect
@@ -21,7 +21,7 @@
   self::expect(123, #lateLocal#get.call());
   self::expect(124, #lateLocal#set.call(124));
   self::expect(124, #lateLocal#get.call());
-  function local<T extends core::Object? = dynamic>(T? value1, T? value2) → core::Null? {
+  function local<T extends core::Object? = dynamic>(T? value1, T? value2) → Null {
     T? lateGenericLocal;
     core::bool #lateGenericLocal#isSet = false;
     function #lateGenericLocal#get() → T? {
diff --git a/pkg/front_end/testcases/late_lowering/late_nullable_local_with_initializer.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/late_nullable_local_with_initializer.dart.weak.transformed.expect
index dea8137..44a6c7f 100644
--- a/pkg/front_end/testcases/late_lowering/late_nullable_local_with_initializer.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/late_nullable_local_with_initializer.dart.weak.transformed.expect
@@ -21,7 +21,7 @@
   self::expect(123, #lateLocal#get.call());
   self::expect(124, #lateLocal#set.call(124));
   self::expect(124, #lateLocal#get.call());
-  function local<T extends core::Object? = dynamic>(T? value1, T? value2) → core::Null? {
+  function local<T extends core::Object? = dynamic>(T? value1, T? value2) → Null {
     T? lateGenericLocal;
     core::bool #lateGenericLocal#isSet = false;
     function #lateGenericLocal#get() → T? {
diff --git a/pkg/front_end/testcases/late_lowering/late_nullable_local_without_initializer.dart.strong.expect b/pkg/front_end/testcases/late_lowering/late_nullable_local_without_initializer.dart.strong.expect
index b313971..d1c2417 100644
--- a/pkg/front_end/testcases/late_lowering/late_nullable_local_without_initializer.dart.strong.expect
+++ b/pkg/front_end/testcases/late_lowering/late_nullable_local_without_initializer.dart.strong.expect
@@ -7,7 +7,7 @@
   core::int? lateLocal;
   core::bool #lateLocal#isSet = false;
   function #lateLocal#get() → core::int?
-    return #lateLocal#isSet ?{core::int?} lateLocal : throw new _in::LateInitializationErrorImpl::•("Local 'lateLocal' has not been initialized.");
+    return #lateLocal#isSet ?{core::int?} lateLocal : throw new _in::LateError::localNI("lateLocal");
   function #lateLocal#set(core::int? #t1) → dynamic {
     #lateLocal#isSet = true;
     return lateLocal = #t1;
@@ -15,11 +15,11 @@
   self::throws(() → core::int? => #lateLocal#get.call(), "Read value from uninitialized lateLocal");
   self::expect(123, #lateLocal#set.call(123));
   self::expect(123, #lateLocal#get.call());
-  function local<T extends core::Object? = dynamic>(T? value) → core::Null? {
+  function local<T extends core::Object? = dynamic>(T? value) → Null {
     T? lateGenericLocal;
     core::bool #lateGenericLocal#isSet = false;
     function #lateGenericLocal#get() → T?
-      return #lateGenericLocal#isSet ?{T?} lateGenericLocal : throw new _in::LateInitializationErrorImpl::•("Local 'lateGenericLocal' has not been initialized.");
+      return #lateGenericLocal#isSet ?{T?} lateGenericLocal : throw new _in::LateError::localNI("lateGenericLocal");
     function #lateGenericLocal#set(T? #t2) → dynamic {
       #lateGenericLocal#isSet = true;
       return lateGenericLocal = #t2;
diff --git a/pkg/front_end/testcases/late_lowering/late_nullable_local_without_initializer.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/late_nullable_local_without_initializer.dart.strong.transformed.expect
index b313971..d1c2417 100644
--- a/pkg/front_end/testcases/late_lowering/late_nullable_local_without_initializer.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/late_nullable_local_without_initializer.dart.strong.transformed.expect
@@ -7,7 +7,7 @@
   core::int? lateLocal;
   core::bool #lateLocal#isSet = false;
   function #lateLocal#get() → core::int?
-    return #lateLocal#isSet ?{core::int?} lateLocal : throw new _in::LateInitializationErrorImpl::•("Local 'lateLocal' has not been initialized.");
+    return #lateLocal#isSet ?{core::int?} lateLocal : throw new _in::LateError::localNI("lateLocal");
   function #lateLocal#set(core::int? #t1) → dynamic {
     #lateLocal#isSet = true;
     return lateLocal = #t1;
@@ -15,11 +15,11 @@
   self::throws(() → core::int? => #lateLocal#get.call(), "Read value from uninitialized lateLocal");
   self::expect(123, #lateLocal#set.call(123));
   self::expect(123, #lateLocal#get.call());
-  function local<T extends core::Object? = dynamic>(T? value) → core::Null? {
+  function local<T extends core::Object? = dynamic>(T? value) → Null {
     T? lateGenericLocal;
     core::bool #lateGenericLocal#isSet = false;
     function #lateGenericLocal#get() → T?
-      return #lateGenericLocal#isSet ?{T?} lateGenericLocal : throw new _in::LateInitializationErrorImpl::•("Local 'lateGenericLocal' has not been initialized.");
+      return #lateGenericLocal#isSet ?{T?} lateGenericLocal : throw new _in::LateError::localNI("lateGenericLocal");
     function #lateGenericLocal#set(T? #t2) → dynamic {
       #lateGenericLocal#isSet = true;
       return lateGenericLocal = #t2;
diff --git a/pkg/front_end/testcases/late_lowering/late_nullable_local_without_initializer.dart.weak.expect b/pkg/front_end/testcases/late_lowering/late_nullable_local_without_initializer.dart.weak.expect
index b313971..d1c2417 100644
--- a/pkg/front_end/testcases/late_lowering/late_nullable_local_without_initializer.dart.weak.expect
+++ b/pkg/front_end/testcases/late_lowering/late_nullable_local_without_initializer.dart.weak.expect
@@ -7,7 +7,7 @@
   core::int? lateLocal;
   core::bool #lateLocal#isSet = false;
   function #lateLocal#get() → core::int?
-    return #lateLocal#isSet ?{core::int?} lateLocal : throw new _in::LateInitializationErrorImpl::•("Local 'lateLocal' has not been initialized.");
+    return #lateLocal#isSet ?{core::int?} lateLocal : throw new _in::LateError::localNI("lateLocal");
   function #lateLocal#set(core::int? #t1) → dynamic {
     #lateLocal#isSet = true;
     return lateLocal = #t1;
@@ -15,11 +15,11 @@
   self::throws(() → core::int? => #lateLocal#get.call(), "Read value from uninitialized lateLocal");
   self::expect(123, #lateLocal#set.call(123));
   self::expect(123, #lateLocal#get.call());
-  function local<T extends core::Object? = dynamic>(T? value) → core::Null? {
+  function local<T extends core::Object? = dynamic>(T? value) → Null {
     T? lateGenericLocal;
     core::bool #lateGenericLocal#isSet = false;
     function #lateGenericLocal#get() → T?
-      return #lateGenericLocal#isSet ?{T?} lateGenericLocal : throw new _in::LateInitializationErrorImpl::•("Local 'lateGenericLocal' has not been initialized.");
+      return #lateGenericLocal#isSet ?{T?} lateGenericLocal : throw new _in::LateError::localNI("lateGenericLocal");
     function #lateGenericLocal#set(T? #t2) → dynamic {
       #lateGenericLocal#isSet = true;
       return lateGenericLocal = #t2;
diff --git a/pkg/front_end/testcases/late_lowering/late_nullable_local_without_initializer.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/late_nullable_local_without_initializer.dart.weak.transformed.expect
index b313971..d1c2417 100644
--- a/pkg/front_end/testcases/late_lowering/late_nullable_local_without_initializer.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/late_nullable_local_without_initializer.dart.weak.transformed.expect
@@ -7,7 +7,7 @@
   core::int? lateLocal;
   core::bool #lateLocal#isSet = false;
   function #lateLocal#get() → core::int?
-    return #lateLocal#isSet ?{core::int?} lateLocal : throw new _in::LateInitializationErrorImpl::•("Local 'lateLocal' has not been initialized.");
+    return #lateLocal#isSet ?{core::int?} lateLocal : throw new _in::LateError::localNI("lateLocal");
   function #lateLocal#set(core::int? #t1) → dynamic {
     #lateLocal#isSet = true;
     return lateLocal = #t1;
@@ -15,11 +15,11 @@
   self::throws(() → core::int? => #lateLocal#get.call(), "Read value from uninitialized lateLocal");
   self::expect(123, #lateLocal#set.call(123));
   self::expect(123, #lateLocal#get.call());
-  function local<T extends core::Object? = dynamic>(T? value) → core::Null? {
+  function local<T extends core::Object? = dynamic>(T? value) → Null {
     T? lateGenericLocal;
     core::bool #lateGenericLocal#isSet = false;
     function #lateGenericLocal#get() → T?
-      return #lateGenericLocal#isSet ?{T?} lateGenericLocal : throw new _in::LateInitializationErrorImpl::•("Local 'lateGenericLocal' has not been initialized.");
+      return #lateGenericLocal#isSet ?{T?} lateGenericLocal : throw new _in::LateError::localNI("lateGenericLocal");
     function #lateGenericLocal#set(T? #t2) → dynamic {
       #lateGenericLocal#isSet = true;
       return lateGenericLocal = #t2;
diff --git a/pkg/front_end/testcases/late_lowering/later.dart.outline.expect b/pkg/front_end/testcases/late_lowering/later.dart.outline.expect
index 8288606..7b8f4d1 100644
--- a/pkg/front_end/testcases/late_lowering/later.dart.outline.expect
+++ b/pkg/front_end/testcases/late_lowering/later.dart.outline.expect
@@ -32,7 +32,7 @@
     : super core::Object::•()
     ;
   get x() → core::int
-    return let final core::int? #t2 = this.{self::B::_#B#x} in #t2.==(null) ?{core::int} let final core::int #t3 = 42 in this.{self::B::_#B#x}.==(null) ?{core::int} this.{self::B::_#B#x} = #t3 : throw new _in::LateInitializationErrorImpl::•("Field 'x' has been assigned during initialization.") : #t2{core::int};
+    return let final core::int? #t2 = this.{self::B::_#B#x} in #t2.==(null) ?{core::int} let final core::int #t3 = 42 in this.{self::B::_#B#x}.==(null) ?{core::int} this.{self::B::_#B#x} = #t3 : throw new _in::LateError::fieldADI("x") : #t2{core::int};
 }
 class C extends core::Object {
   field core::int? _#C#x;
diff --git a/pkg/front_end/testcases/late_lowering/later.dart.strong.expect b/pkg/front_end/testcases/late_lowering/later.dart.strong.expect
index cdcf986..1876a7a 100644
--- a/pkg/front_end/testcases/late_lowering/later.dart.strong.expect
+++ b/pkg/front_end/testcases/late_lowering/later.dart.strong.expect
@@ -85,7 +85,7 @@
     : super core::Object::•()
     ;
   get x() → core::int
-    return let final core::int? #t3 = this.{self::B::_#B#x} in #t3.==(null) ?{core::int} let final core::int #t4 = 42 in this.{self::B::_#B#x}.==(null) ?{core::int} this.{self::B::_#B#x} = #t4 : throw new _in::LateInitializationErrorImpl::•("Field 'x' has been assigned during initialization.") : #t3{core::int};
+    return let final core::int? #t3 = this.{self::B::_#B#x} in #t3.==(null) ?{core::int} let final core::int #t4 = 42 in this.{self::B::_#B#x}.==(null) ?{core::int} this.{self::B::_#B#x} = #t4 : throw new _in::LateError::fieldADI("x") : #t3{core::int};
 }
 class C extends core::Object {
   field core::int? _#C#x = null;
@@ -93,12 +93,12 @@
     : super core::Object::•()
     ;
   get x() → core::int
-    return let final core::int? #t5 = this.{self::C::_#C#x} in #t5.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'x' has not been initialized.") : #t5{core::int};
+    return let final core::int? #t5 = this.{self::C::_#C#x} in #t5.==(null) ?{core::int} throw new _in::LateError::fieldNI("x") : #t5{core::int};
   set x(core::int #t6) → void
     if(this.{self::C::_#C#x}.==(null))
       this.{self::C::_#C#x} = #t6;
     else
-      throw new _in::LateInitializationErrorImpl::•("Field 'x' has already been initialized.");
+      throw new _in::LateError::fieldAI("x");
   method initVars() → dynamic {
     this.{self::C::x} = 42;
   }
@@ -127,7 +127,7 @@
   block {
     final core::List<core::int> #t7 = <core::int>[];
     for (core::int i = 0; i.{core::num::<}(10); i = i.{core::num::+}(1))
-      #t7.{core::List::add}(i);
+      #t7.{core::List::add}{Invariant}(i);
   } =>#t7;
 }
 static method hest() → dynamic async {
diff --git a/pkg/front_end/testcases/late_lowering/later.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/later.dart.strong.transformed.expect
index 7afe2ac..d9e572e 100644
--- a/pkg/front_end/testcases/late_lowering/later.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/later.dart.strong.transformed.expect
@@ -85,7 +85,7 @@
     : super core::Object::•()
     ;
   get x() → core::int
-    return let final core::int? #t3 = this.{self::B::_#B#x} in #t3.==(null) ?{core::int} let final core::int #t4 = 42 in this.{self::B::_#B#x}.==(null) ?{core::int} this.{self::B::_#B#x} = #t4 : throw new _in::LateInitializationErrorImpl::•("Field 'x' has been assigned during initialization.") : #t3{core::int};
+    return let final core::int? #t3 = this.{self::B::_#B#x} in #t3.==(null) ?{core::int} let final core::int #t4 = 42 in this.{self::B::_#B#x}.==(null) ?{core::int} this.{self::B::_#B#x} = #t4 : throw new _in::LateError::fieldADI("x") : #t3{core::int};
 }
 class C extends core::Object {
   field core::int? _#C#x = null;
@@ -93,12 +93,12 @@
     : super core::Object::•()
     ;
   get x() → core::int
-    return let final core::int? #t5 = this.{self::C::_#C#x} in #t5.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'x' has not been initialized.") : #t5{core::int};
+    return let final core::int? #t5 = this.{self::C::_#C#x} in #t5.==(null) ?{core::int} throw new _in::LateError::fieldNI("x") : #t5{core::int};
   set x(core::int #t6) → void
     if(this.{self::C::_#C#x}.==(null))
       this.{self::C::_#C#x} = #t6;
     else
-      throw new _in::LateInitializationErrorImpl::•("Field 'x' has already been initialized.");
+      throw new _in::LateError::fieldAI("x");
   method initVars() → dynamic {
     this.{self::C::x} = 42;
   }
@@ -133,11 +133,12 @@
   block {
     final core::List<core::int> #t7 = <core::int>[];
     for (core::int i = 0; i.{core::num::<}(10); i = i.{core::num::+}(1))
-      #t7.{core::List::add}(i);
+      #t7.{core::List::add}{Invariant}(i);
   } =>#t7;
 }
 static method hest() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic> :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>? :return_value;
   dynamic :async_stack_trace;
   (dynamic) → dynamic :async_op_then;
@@ -154,7 +155,6 @@
       {
         {
           asy::Stream<core::String> :stream = asy::Stream::fromIterable<core::String>(<core::String>["hest"]);
-          asy::_asyncStarListenHelper(:stream, :async_op);
           asy::_StreamIterator<core::String>? :for-iterator = new asy::_StreamIterator::•<core::String>(:stream);
           try
             #L2:
@@ -179,20 +179,22 @@
         :return_value = "hest";
         break #L1;
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method fisk() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic> :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>? :return_value;
   dynamic :async_stack_trace;
   (dynamic) → dynamic :async_op_then;
@@ -220,7 +222,8 @@
         core::Function? f;
         function #f#get() → core::Function
           return let final core::Function? #t15 = f in #t15.==(null) ?{core::Function} f = () → asy::Future<dynamic> /* originally async */ {
-            final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+            final asy::_Future<dynamic> :async_future = new asy::_Future::•<dynamic>();
+            core::bool* :is_sync = false;
             FutureOr<dynamic>? :return_value;
             dynamic :async_stack_trace;
             (dynamic) → dynamic :async_op_then;
@@ -236,32 +239,34 @@
                   :return_value = :result;
                   break #L4;
                 }
-                asy::_completeOnAsyncReturn(:async_completer, :return_value);
+                asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
                 return;
               }
               on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-                :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+                asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
               }
             :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
             :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
             :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-            :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-            return :async_completer.{asy::Completer::future};
+            :async_op.call();
+            :is_sync = true;
+            return :async_future;
           } : #t15{core::Function};
         function #f#set(core::Function #t17) → dynamic
           return f = #t17;
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method main() → dynamic {}
 
diff --git a/pkg/front_end/testcases/late_lowering/later.dart.weak.expect b/pkg/front_end/testcases/late_lowering/later.dart.weak.expect
index 1144c13..267e384 100644
--- a/pkg/front_end/testcases/late_lowering/later.dart.weak.expect
+++ b/pkg/front_end/testcases/late_lowering/later.dart.weak.expect
@@ -97,7 +97,7 @@
     if(!this.{self::B::_#B#x#isSet}) {
       final core::int #t3 = 42;
       if(this.{self::B::_#B#x#isSet})
-        throw new _in::LateInitializationErrorImpl::•("Field 'x' has been assigned during initialization.");
+        throw new _in::LateError::fieldADI("x");
       this.{self::B::_#B#x} = #t3;
       this.{self::B::_#B#x#isSet} = true;
     }
@@ -111,10 +111,10 @@
     : super core::Object::•()
     ;
   get x() → core::int
-    return this.{self::C::_#C#x#isSet} ?{core::int} let final core::int? #t5 = this.{self::C::_#C#x} in #t5{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'x' has not been initialized.");
+    return this.{self::C::_#C#x#isSet} ?{core::int} let final core::int? #t5 = this.{self::C::_#C#x} in #t5{core::int} : throw new _in::LateError::fieldNI("x");
   set x(core::int #t6) → void
     if(this.{self::C::_#C#x#isSet})
-      throw new _in::LateInitializationErrorImpl::•("Field 'x' has already been initialized.");
+      throw new _in::LateError::fieldAI("x");
     else {
       this.{self::C::_#C#x#isSet} = true;
       this.{self::C::_#C#x} = #t6;
@@ -147,7 +147,7 @@
   block {
     final core::List<core::int> #t7 = <core::int>[];
     for (core::int i = 0; i.{core::num::<}(10); i = i.{core::num::+}(1))
-      #t7.{core::List::add}(i);
+      #t7.{core::List::add}{Invariant}(i);
   } =>#t7;
 }
 static method hest() → dynamic async {
diff --git a/pkg/front_end/testcases/late_lowering/later.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/later.dart.weak.transformed.expect
index 4dac8b1..abfa48e 100644
--- a/pkg/front_end/testcases/late_lowering/later.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/later.dart.weak.transformed.expect
@@ -97,7 +97,7 @@
     if(!this.{self::B::_#B#x#isSet}) {
       final core::int #t3 = 42;
       if(this.{self::B::_#B#x#isSet})
-        throw new _in::LateInitializationErrorImpl::•("Field 'x' has been assigned during initialization.");
+        throw new _in::LateError::fieldADI("x");
       this.{self::B::_#B#x} = #t3;
       this.{self::B::_#B#x#isSet} = true;
     }
@@ -111,10 +111,10 @@
     : super core::Object::•()
     ;
   get x() → core::int
-    return this.{self::C::_#C#x#isSet} ?{core::int} let final core::int? #t5 = this.{self::C::_#C#x} in #t5{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'x' has not been initialized.");
+    return this.{self::C::_#C#x#isSet} ?{core::int} let final core::int? #t5 = this.{self::C::_#C#x} in #t5{core::int} : throw new _in::LateError::fieldNI("x");
   set x(core::int #t6) → void
     if(this.{self::C::_#C#x#isSet})
-      throw new _in::LateInitializationErrorImpl::•("Field 'x' has already been initialized.");
+      throw new _in::LateError::fieldAI("x");
     else {
       this.{self::C::_#C#x#isSet} = true;
       this.{self::C::_#C#x} = #t6;
@@ -153,11 +153,12 @@
   block {
     final core::List<core::int> #t7 = <core::int>[];
     for (core::int i = 0; i.{core::num::<}(10); i = i.{core::num::+}(1))
-      #t7.{core::List::add}(i);
+      #t7.{core::List::add}{Invariant}(i);
   } =>#t7;
 }
 static method hest() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic> :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>? :return_value;
   dynamic :async_stack_trace;
   (dynamic) → dynamic :async_op_then;
@@ -174,7 +175,6 @@
       {
         {
           asy::Stream<core::String> :stream = asy::Stream::fromIterable<core::String>(<core::String>["hest"]);
-          asy::_asyncStarListenHelper(:stream, :async_op);
           asy::_StreamIterator<core::String>? :for-iterator = new asy::_StreamIterator::•<core::String>(:stream);
           try
             #L2:
@@ -199,20 +199,22 @@
         :return_value = "hest";
         break #L1;
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method fisk() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic> :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>? :return_value;
   dynamic :async_stack_trace;
   (dynamic) → dynamic :async_op_then;
@@ -258,7 +260,8 @@
         function #f#get() → core::Function {
           if(!#f#isSet) {
             f = () → asy::Future<dynamic> /* originally async */ {
-              final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+              final asy::_Future<dynamic> :async_future = new asy::_Future::•<dynamic>();
+              core::bool* :is_sync = false;
               FutureOr<dynamic>? :return_value;
               dynamic :async_stack_trace;
               (dynamic) → dynamic :async_op_then;
@@ -274,17 +277,18 @@
                     :return_value = :result;
                     break #L4;
                   }
-                  asy::_completeOnAsyncReturn(:async_completer, :return_value);
+                  asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
                   return;
                 }
                 on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-                  :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+                  asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
                 }
               :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
               :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
               :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-              :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-              return :async_completer.{asy::Completer::future};
+              :async_op.call();
+              :is_sync = true;
+              return :async_future;
             };
             #f#isSet = true;
           }
@@ -295,17 +299,18 @@
           return f = #t14;
         }
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method main() → dynamic {}
 
diff --git a/pkg/front_end/testcases/late_lowering/non_nullable_from_opt_out.dart.strong.expect b/pkg/front_end/testcases/late_lowering/non_nullable_from_opt_out.dart.strong.expect
index 6ffbd4b..03ef078 100644
--- a/pkg/front_end/testcases/late_lowering/non_nullable_from_opt_out.dart.strong.expect
+++ b/pkg/front_end/testcases/late_lowering/non_nullable_from_opt_out.dart.strong.expect
@@ -30,11 +30,11 @@
   non::expect(null, c.{non::Class::finalInstanceTypeVariable});
   non::expect(null, non::Class::staticField);
   non::expect(null, non::Class::staticFinalField);
-  non::throws(() → core::Null? => non::finalTopLevelField = null);
-  non::throws(() → core::Null? => c.{non::Class::finalInstanceField} = null);
-  non::throws(() → core::Null? => c.{non::Class::finalInstanceTypeVariable} = null);
-  non::throws(() → core::Null? => non::Class::staticFinalField = null);
-  non::method<core::Null?>(true, null, null);
+  non::throws(() → Null => non::finalTopLevelField = null);
+  non::throws(() → Null => c.{non::Class::finalInstanceField} = null);
+  non::throws(() → Null => c.{non::Class::finalInstanceTypeVariable} = null);
+  non::throws(() → Null => non::Class::staticFinalField = null);
+  non::method<Null>(true, null, null);
 }
 
 library /*isNonNullableByDefault*/;
@@ -55,38 +55,38 @@
     : super core::Object::•()
     ;
   get instanceField() → core::int
-    return let final core::int? #t1 = this.{non::Class::_#Class#instanceField} in #t1.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'instanceField' has not been initialized.") : #t1{core::int};
+    return let final core::int? #t1 = this.{non::Class::_#Class#instanceField} in #t1.==(null) ?{core::int} throw new _in::LateError::fieldNI("instanceField") : #t1{core::int};
   set instanceField(core::int #t2) → void
     this.{non::Class::_#Class#instanceField} = #t2;
   get finalInstanceField() → dynamic
-    return this.{non::Class::_#Class#finalInstanceField#isSet} ?{dynamic} this.{non::Class::_#Class#finalInstanceField} : throw new _in::LateInitializationErrorImpl::•("Field 'finalInstanceField' has not been initialized.");
+    return this.{non::Class::_#Class#finalInstanceField#isSet} ?{dynamic} this.{non::Class::_#Class#finalInstanceField} : throw new _in::LateError::fieldNI("finalInstanceField");
   set finalInstanceField(dynamic #t3) → void
     if(this.{non::Class::_#Class#finalInstanceField#isSet})
-      throw new _in::LateInitializationErrorImpl::•("Field 'finalInstanceField' has already been initialized.");
+      throw new _in::LateError::fieldAI("finalInstanceField");
     else {
       this.{non::Class::_#Class#finalInstanceField#isSet} = true;
       this.{non::Class::_#Class#finalInstanceField} = #t3;
     }
   get instanceTypeVariable() → non::Class::T
-    return let final non::Class::T? #t4 = this.{non::Class::_#Class#instanceTypeVariable} in #t4.==(null) ?{non::Class::T} throw new _in::LateInitializationErrorImpl::•("Field 'instanceTypeVariable' has not been initialized.") : #t4{non::Class::T};
+    return let final non::Class::T? #t4 = this.{non::Class::_#Class#instanceTypeVariable} in #t4.==(null) ?{non::Class::T} throw new _in::LateError::fieldNI("instanceTypeVariable") : #t4{non::Class::T};
   set instanceTypeVariable(generic-covariant-impl non::Class::T #t5) → void
     this.{non::Class::_#Class#instanceTypeVariable} = #t5;
   get finalInstanceTypeVariable() → non::Class::T
-    return let final non::Class::T? #t6 = this.{non::Class::_#Class#finalInstanceTypeVariable} in #t6.==(null) ?{non::Class::T} throw new _in::LateInitializationErrorImpl::•("Field 'finalInstanceTypeVariable' has not been initialized.") : #t6{non::Class::T};
+    return let final non::Class::T? #t6 = this.{non::Class::_#Class#finalInstanceTypeVariable} in #t6.==(null) ?{non::Class::T} throw new _in::LateError::fieldNI("finalInstanceTypeVariable") : #t6{non::Class::T};
   set finalInstanceTypeVariable(non::Class::T #t7) → void
     if(this.{non::Class::_#Class#finalInstanceTypeVariable}.==(null))
       this.{non::Class::_#Class#finalInstanceTypeVariable} = #t7;
     else
-      throw new _in::LateInitializationErrorImpl::•("Field 'finalInstanceTypeVariable' has already been initialized.");
+      throw new _in::LateError::fieldAI("finalInstanceTypeVariable");
   static get staticField() → core::int
-    return let final core::int? #t8 = non::Class::_#staticField in #t8.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'staticField' has not been initialized.") : #t8{core::int};
+    return let final core::int? #t8 = non::Class::_#staticField in #t8.==(null) ?{core::int} throw new _in::LateError::fieldNI("staticField") : #t8{core::int};
   static set staticField(core::int #t9) → void
     non::Class::_#staticField = #t9;
   static get staticFinalField() → dynamic
-    return non::Class::_#staticFinalField#isSet ?{dynamic} non::Class::_#staticFinalField : throw new _in::LateInitializationErrorImpl::•("Field 'staticFinalField' has not been initialized.");
+    return non::Class::_#staticFinalField#isSet ?{dynamic} non::Class::_#staticFinalField : throw new _in::LateError::fieldNI("staticFinalField");
   static set staticFinalField(dynamic #t10) → void
     if(non::Class::_#staticFinalField#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Field 'staticFinalField' has already been initialized.");
+      throw new _in::LateError::fieldAI("staticFinalField");
     else {
       non::Class::_#staticFinalField#isSet = true;
       non::Class::_#staticFinalField = #t10;
@@ -96,14 +96,14 @@
 static field dynamic _#finalTopLevelField = null;
 static field core::bool _#finalTopLevelField#isSet = false;
 static get topLevelField() → core::int
-  return let final core::int? #t11 = non::_#topLevelField in #t11.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'topLevelField' has not been initialized.") : #t11{core::int};
+  return let final core::int? #t11 = non::_#topLevelField in #t11.==(null) ?{core::int} throw new _in::LateError::fieldNI("topLevelField") : #t11{core::int};
 static set topLevelField(core::int #t12) → void
   non::_#topLevelField = #t12;
 static get finalTopLevelField() → dynamic
-  return non::_#finalTopLevelField#isSet ?{dynamic} non::_#finalTopLevelField : throw new _in::LateInitializationErrorImpl::•("Field 'finalTopLevelField' has not been initialized.");
+  return non::_#finalTopLevelField#isSet ?{dynamic} non::_#finalTopLevelField : throw new _in::LateError::fieldNI("finalTopLevelField");
 static set finalTopLevelField(dynamic #t13) → void
   if(non::_#finalTopLevelField#isSet)
-    throw new _in::LateInitializationErrorImpl::•("Field 'finalTopLevelField' has already been initialized.");
+    throw new _in::LateError::fieldAI("finalTopLevelField");
   else {
     non::_#finalTopLevelField#isSet = true;
     non::_#finalTopLevelField = #t13;
@@ -111,33 +111,33 @@
 static method method<T extends core::Object = core::Object>(core::bool b, core::int i, non::method::T t) → dynamic {
   core::int? local;
   function #local#get() → core::int
-    return let final core::int? #t14 = local in #t14.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local' has not been initialized.") : #t14{core::int};
+    return let final core::int? #t14 = local in #t14.==(null) ?{core::int} throw new _in::LateError::localNI("local") : #t14{core::int};
   function #local#set(core::int #t15) → dynamic
     return local = #t15;
   final dynamic finalLocal;
   core::bool #finalLocal#isSet = false;
   function #finalLocal#get() → dynamic
-    return #finalLocal#isSet ?{dynamic} finalLocal : throw new _in::LateInitializationErrorImpl::•("Local 'finalLocal' has not been initialized.");
+    return #finalLocal#isSet ?{dynamic} finalLocal : throw new _in::LateError::localNI("finalLocal");
   function #finalLocal#set(dynamic #t16) → dynamic
     if(#finalLocal#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Local 'finalLocal' has already been initialized.");
+      throw new _in::LateError::localAI("finalLocal");
     else {
       #finalLocal#isSet = true;
       return finalLocal = #t16;
     }
   non::method::T? localTypeVariable;
   function #localTypeVariable#get() → non::method::T
-    return let final non::method::T? #t17 = localTypeVariable in #t17.==(null) ?{non::method::T} throw new _in::LateInitializationErrorImpl::•("Local 'localTypeVariable' has not been initialized.") : #t17{non::method::T};
+    return let final non::method::T? #t17 = localTypeVariable in #t17.==(null) ?{non::method::T} throw new _in::LateError::localNI("localTypeVariable") : #t17{non::method::T};
   function #localTypeVariable#set(non::method::T #t18) → dynamic
     return localTypeVariable = #t18;
   final non::method::T? finalLocalTypeVariable;
   function #finalLocalTypeVariable#get() → non::method::T
-    return let final non::method::T? #t19 = finalLocalTypeVariable in #t19.==(null) ?{non::method::T} throw new _in::LateInitializationErrorImpl::•("Local 'finalLocalTypeVariable' has not been initialized.") : #t19{non::method::T};
+    return let final non::method::T? #t19 = finalLocalTypeVariable in #t19.==(null) ?{non::method::T} throw new _in::LateError::localNI("finalLocalTypeVariable") : #t19{non::method::T};
   function #finalLocalTypeVariable#set(non::method::T #t20) → dynamic
     if(finalLocalTypeVariable.==(null))
       return finalLocalTypeVariable = #t20;
     else
-      throw new _in::LateInitializationErrorImpl::•("Local 'finalLocalTypeVariable' has already been initialized.");
+      throw new _in::LateError::localAI("finalLocalTypeVariable");
   if(b) {
     #local#set.call(i);
     #finalLocal#set.call(i);
@@ -148,8 +148,8 @@
     non::expect(t, #localTypeVariable#get.call());
     non::expect(t, #finalLocalTypeVariable#get.call());
   }
-  non::throws(() → core::int => #finalLocal#set.call(i));
-  non::throws(() → non::method::T => #finalLocalTypeVariable#set.call(t));
+  non::throws(() → void => #finalLocal#set.call(i));
+  non::throws(() → void => #finalLocalTypeVariable#set.call(t));
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
   if(!expected.{core::Object::==}(actual))
diff --git a/pkg/front_end/testcases/late_lowering/non_nullable_from_opt_out.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/non_nullable_from_opt_out.dart.strong.transformed.expect
index 6ffbd4b..03ef078 100644
--- a/pkg/front_end/testcases/late_lowering/non_nullable_from_opt_out.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/non_nullable_from_opt_out.dart.strong.transformed.expect
@@ -30,11 +30,11 @@
   non::expect(null, c.{non::Class::finalInstanceTypeVariable});
   non::expect(null, non::Class::staticField);
   non::expect(null, non::Class::staticFinalField);
-  non::throws(() → core::Null? => non::finalTopLevelField = null);
-  non::throws(() → core::Null? => c.{non::Class::finalInstanceField} = null);
-  non::throws(() → core::Null? => c.{non::Class::finalInstanceTypeVariable} = null);
-  non::throws(() → core::Null? => non::Class::staticFinalField = null);
-  non::method<core::Null?>(true, null, null);
+  non::throws(() → Null => non::finalTopLevelField = null);
+  non::throws(() → Null => c.{non::Class::finalInstanceField} = null);
+  non::throws(() → Null => c.{non::Class::finalInstanceTypeVariable} = null);
+  non::throws(() → Null => non::Class::staticFinalField = null);
+  non::method<Null>(true, null, null);
 }
 
 library /*isNonNullableByDefault*/;
@@ -55,38 +55,38 @@
     : super core::Object::•()
     ;
   get instanceField() → core::int
-    return let final core::int? #t1 = this.{non::Class::_#Class#instanceField} in #t1.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'instanceField' has not been initialized.") : #t1{core::int};
+    return let final core::int? #t1 = this.{non::Class::_#Class#instanceField} in #t1.==(null) ?{core::int} throw new _in::LateError::fieldNI("instanceField") : #t1{core::int};
   set instanceField(core::int #t2) → void
     this.{non::Class::_#Class#instanceField} = #t2;
   get finalInstanceField() → dynamic
-    return this.{non::Class::_#Class#finalInstanceField#isSet} ?{dynamic} this.{non::Class::_#Class#finalInstanceField} : throw new _in::LateInitializationErrorImpl::•("Field 'finalInstanceField' has not been initialized.");
+    return this.{non::Class::_#Class#finalInstanceField#isSet} ?{dynamic} this.{non::Class::_#Class#finalInstanceField} : throw new _in::LateError::fieldNI("finalInstanceField");
   set finalInstanceField(dynamic #t3) → void
     if(this.{non::Class::_#Class#finalInstanceField#isSet})
-      throw new _in::LateInitializationErrorImpl::•("Field 'finalInstanceField' has already been initialized.");
+      throw new _in::LateError::fieldAI("finalInstanceField");
     else {
       this.{non::Class::_#Class#finalInstanceField#isSet} = true;
       this.{non::Class::_#Class#finalInstanceField} = #t3;
     }
   get instanceTypeVariable() → non::Class::T
-    return let final non::Class::T? #t4 = this.{non::Class::_#Class#instanceTypeVariable} in #t4.==(null) ?{non::Class::T} throw new _in::LateInitializationErrorImpl::•("Field 'instanceTypeVariable' has not been initialized.") : #t4{non::Class::T};
+    return let final non::Class::T? #t4 = this.{non::Class::_#Class#instanceTypeVariable} in #t4.==(null) ?{non::Class::T} throw new _in::LateError::fieldNI("instanceTypeVariable") : #t4{non::Class::T};
   set instanceTypeVariable(generic-covariant-impl non::Class::T #t5) → void
     this.{non::Class::_#Class#instanceTypeVariable} = #t5;
   get finalInstanceTypeVariable() → non::Class::T
-    return let final non::Class::T? #t6 = this.{non::Class::_#Class#finalInstanceTypeVariable} in #t6.==(null) ?{non::Class::T} throw new _in::LateInitializationErrorImpl::•("Field 'finalInstanceTypeVariable' has not been initialized.") : #t6{non::Class::T};
+    return let final non::Class::T? #t6 = this.{non::Class::_#Class#finalInstanceTypeVariable} in #t6.==(null) ?{non::Class::T} throw new _in::LateError::fieldNI("finalInstanceTypeVariable") : #t6{non::Class::T};
   set finalInstanceTypeVariable(non::Class::T #t7) → void
     if(this.{non::Class::_#Class#finalInstanceTypeVariable}.==(null))
       this.{non::Class::_#Class#finalInstanceTypeVariable} = #t7;
     else
-      throw new _in::LateInitializationErrorImpl::•("Field 'finalInstanceTypeVariable' has already been initialized.");
+      throw new _in::LateError::fieldAI("finalInstanceTypeVariable");
   static get staticField() → core::int
-    return let final core::int? #t8 = non::Class::_#staticField in #t8.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'staticField' has not been initialized.") : #t8{core::int};
+    return let final core::int? #t8 = non::Class::_#staticField in #t8.==(null) ?{core::int} throw new _in::LateError::fieldNI("staticField") : #t8{core::int};
   static set staticField(core::int #t9) → void
     non::Class::_#staticField = #t9;
   static get staticFinalField() → dynamic
-    return non::Class::_#staticFinalField#isSet ?{dynamic} non::Class::_#staticFinalField : throw new _in::LateInitializationErrorImpl::•("Field 'staticFinalField' has not been initialized.");
+    return non::Class::_#staticFinalField#isSet ?{dynamic} non::Class::_#staticFinalField : throw new _in::LateError::fieldNI("staticFinalField");
   static set staticFinalField(dynamic #t10) → void
     if(non::Class::_#staticFinalField#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Field 'staticFinalField' has already been initialized.");
+      throw new _in::LateError::fieldAI("staticFinalField");
     else {
       non::Class::_#staticFinalField#isSet = true;
       non::Class::_#staticFinalField = #t10;
@@ -96,14 +96,14 @@
 static field dynamic _#finalTopLevelField = null;
 static field core::bool _#finalTopLevelField#isSet = false;
 static get topLevelField() → core::int
-  return let final core::int? #t11 = non::_#topLevelField in #t11.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'topLevelField' has not been initialized.") : #t11{core::int};
+  return let final core::int? #t11 = non::_#topLevelField in #t11.==(null) ?{core::int} throw new _in::LateError::fieldNI("topLevelField") : #t11{core::int};
 static set topLevelField(core::int #t12) → void
   non::_#topLevelField = #t12;
 static get finalTopLevelField() → dynamic
-  return non::_#finalTopLevelField#isSet ?{dynamic} non::_#finalTopLevelField : throw new _in::LateInitializationErrorImpl::•("Field 'finalTopLevelField' has not been initialized.");
+  return non::_#finalTopLevelField#isSet ?{dynamic} non::_#finalTopLevelField : throw new _in::LateError::fieldNI("finalTopLevelField");
 static set finalTopLevelField(dynamic #t13) → void
   if(non::_#finalTopLevelField#isSet)
-    throw new _in::LateInitializationErrorImpl::•("Field 'finalTopLevelField' has already been initialized.");
+    throw new _in::LateError::fieldAI("finalTopLevelField");
   else {
     non::_#finalTopLevelField#isSet = true;
     non::_#finalTopLevelField = #t13;
@@ -111,33 +111,33 @@
 static method method<T extends core::Object = core::Object>(core::bool b, core::int i, non::method::T t) → dynamic {
   core::int? local;
   function #local#get() → core::int
-    return let final core::int? #t14 = local in #t14.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'local' has not been initialized.") : #t14{core::int};
+    return let final core::int? #t14 = local in #t14.==(null) ?{core::int} throw new _in::LateError::localNI("local") : #t14{core::int};
   function #local#set(core::int #t15) → dynamic
     return local = #t15;
   final dynamic finalLocal;
   core::bool #finalLocal#isSet = false;
   function #finalLocal#get() → dynamic
-    return #finalLocal#isSet ?{dynamic} finalLocal : throw new _in::LateInitializationErrorImpl::•("Local 'finalLocal' has not been initialized.");
+    return #finalLocal#isSet ?{dynamic} finalLocal : throw new _in::LateError::localNI("finalLocal");
   function #finalLocal#set(dynamic #t16) → dynamic
     if(#finalLocal#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Local 'finalLocal' has already been initialized.");
+      throw new _in::LateError::localAI("finalLocal");
     else {
       #finalLocal#isSet = true;
       return finalLocal = #t16;
     }
   non::method::T? localTypeVariable;
   function #localTypeVariable#get() → non::method::T
-    return let final non::method::T? #t17 = localTypeVariable in #t17.==(null) ?{non::method::T} throw new _in::LateInitializationErrorImpl::•("Local 'localTypeVariable' has not been initialized.") : #t17{non::method::T};
+    return let final non::method::T? #t17 = localTypeVariable in #t17.==(null) ?{non::method::T} throw new _in::LateError::localNI("localTypeVariable") : #t17{non::method::T};
   function #localTypeVariable#set(non::method::T #t18) → dynamic
     return localTypeVariable = #t18;
   final non::method::T? finalLocalTypeVariable;
   function #finalLocalTypeVariable#get() → non::method::T
-    return let final non::method::T? #t19 = finalLocalTypeVariable in #t19.==(null) ?{non::method::T} throw new _in::LateInitializationErrorImpl::•("Local 'finalLocalTypeVariable' has not been initialized.") : #t19{non::method::T};
+    return let final non::method::T? #t19 = finalLocalTypeVariable in #t19.==(null) ?{non::method::T} throw new _in::LateError::localNI("finalLocalTypeVariable") : #t19{non::method::T};
   function #finalLocalTypeVariable#set(non::method::T #t20) → dynamic
     if(finalLocalTypeVariable.==(null))
       return finalLocalTypeVariable = #t20;
     else
-      throw new _in::LateInitializationErrorImpl::•("Local 'finalLocalTypeVariable' has already been initialized.");
+      throw new _in::LateError::localAI("finalLocalTypeVariable");
   if(b) {
     #local#set.call(i);
     #finalLocal#set.call(i);
@@ -148,8 +148,8 @@
     non::expect(t, #localTypeVariable#get.call());
     non::expect(t, #finalLocalTypeVariable#get.call());
   }
-  non::throws(() → core::int => #finalLocal#set.call(i));
-  non::throws(() → non::method::T => #finalLocalTypeVariable#set.call(t));
+  non::throws(() → void => #finalLocal#set.call(i));
+  non::throws(() → void => #finalLocalTypeVariable#set.call(t));
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
   if(!expected.{core::Object::==}(actual))
diff --git a/pkg/front_end/testcases/late_lowering/non_nullable_from_opt_out.dart.weak.expect b/pkg/front_end/testcases/late_lowering/non_nullable_from_opt_out.dart.weak.expect
index 454958d..53ea9c9 100644
--- a/pkg/front_end/testcases/late_lowering/non_nullable_from_opt_out.dart.weak.expect
+++ b/pkg/front_end/testcases/late_lowering/non_nullable_from_opt_out.dart.weak.expect
@@ -23,11 +23,11 @@
   non::expect(null, c.{non::Class::finalInstanceTypeVariable});
   non::expect(null, non::Class::staticField);
   non::expect(null, non::Class::staticFinalField);
-  non::throws(() → core::Null? => non::finalTopLevelField = null);
-  non::throws(() → core::Null? => c.{non::Class::finalInstanceField} = null);
-  non::throws(() → core::Null? => c.{non::Class::finalInstanceTypeVariable} = null);
-  non::throws(() → core::Null? => non::Class::staticFinalField = null);
-  non::method<core::Null?>(true, null, null);
+  non::throws(() → Null => non::finalTopLevelField = null);
+  non::throws(() → Null => c.{non::Class::finalInstanceField} = null);
+  non::throws(() → Null => c.{non::Class::finalInstanceTypeVariable} = null);
+  non::throws(() → Null => non::Class::staticFinalField = null);
+  non::method<Null>(true, null, null);
 }
 
 library /*isNonNullableByDefault*/;
@@ -52,46 +52,46 @@
     : super core::Object::•()
     ;
   get instanceField() → core::int
-    return this.{non::Class::_#Class#instanceField#isSet} ?{core::int} let final core::int? #t1 = this.{non::Class::_#Class#instanceField} in #t1{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'instanceField' has not been initialized.");
+    return this.{non::Class::_#Class#instanceField#isSet} ?{core::int} let final core::int? #t1 = this.{non::Class::_#Class#instanceField} in #t1{core::int} : throw new _in::LateError::fieldNI("instanceField");
   set instanceField(core::int #t2) → void {
     this.{non::Class::_#Class#instanceField#isSet} = true;
     this.{non::Class::_#Class#instanceField} = #t2;
   }
   get finalInstanceField() → dynamic
-    return this.{non::Class::_#Class#finalInstanceField#isSet} ?{dynamic} this.{non::Class::_#Class#finalInstanceField} : throw new _in::LateInitializationErrorImpl::•("Field 'finalInstanceField' has not been initialized.");
+    return this.{non::Class::_#Class#finalInstanceField#isSet} ?{dynamic} this.{non::Class::_#Class#finalInstanceField} : throw new _in::LateError::fieldNI("finalInstanceField");
   set finalInstanceField(dynamic #t3) → void
     if(this.{non::Class::_#Class#finalInstanceField#isSet})
-      throw new _in::LateInitializationErrorImpl::•("Field 'finalInstanceField' has already been initialized.");
+      throw new _in::LateError::fieldAI("finalInstanceField");
     else {
       this.{non::Class::_#Class#finalInstanceField#isSet} = true;
       this.{non::Class::_#Class#finalInstanceField} = #t3;
     }
   get instanceTypeVariable() → non::Class::T
-    return this.{non::Class::_#Class#instanceTypeVariable#isSet} ?{non::Class::T} let final non::Class::T? #t4 = this.{non::Class::_#Class#instanceTypeVariable} in #t4{non::Class::T} : throw new _in::LateInitializationErrorImpl::•("Field 'instanceTypeVariable' has not been initialized.");
+    return this.{non::Class::_#Class#instanceTypeVariable#isSet} ?{non::Class::T} let final non::Class::T? #t4 = this.{non::Class::_#Class#instanceTypeVariable} in #t4{non::Class::T} : throw new _in::LateError::fieldNI("instanceTypeVariable");
   set instanceTypeVariable(generic-covariant-impl non::Class::T #t5) → void {
     this.{non::Class::_#Class#instanceTypeVariable#isSet} = true;
     this.{non::Class::_#Class#instanceTypeVariable} = #t5;
   }
   get finalInstanceTypeVariable() → non::Class::T
-    return this.{non::Class::_#Class#finalInstanceTypeVariable#isSet} ?{non::Class::T} let final non::Class::T? #t6 = this.{non::Class::_#Class#finalInstanceTypeVariable} in #t6{non::Class::T} : throw new _in::LateInitializationErrorImpl::•("Field 'finalInstanceTypeVariable' has not been initialized.");
+    return this.{non::Class::_#Class#finalInstanceTypeVariable#isSet} ?{non::Class::T} let final non::Class::T? #t6 = this.{non::Class::_#Class#finalInstanceTypeVariable} in #t6{non::Class::T} : throw new _in::LateError::fieldNI("finalInstanceTypeVariable");
   set finalInstanceTypeVariable(non::Class::T #t7) → void
     if(this.{non::Class::_#Class#finalInstanceTypeVariable#isSet})
-      throw new _in::LateInitializationErrorImpl::•("Field 'finalInstanceTypeVariable' has already been initialized.");
+      throw new _in::LateError::fieldAI("finalInstanceTypeVariable");
     else {
       this.{non::Class::_#Class#finalInstanceTypeVariable#isSet} = true;
       this.{non::Class::_#Class#finalInstanceTypeVariable} = #t7;
     }
   static get staticField() → core::int
-    return non::Class::_#staticField#isSet ?{core::int} let final core::int? #t8 = non::Class::_#staticField in #t8{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'staticField' has not been initialized.");
+    return non::Class::_#staticField#isSet ?{core::int} let final core::int? #t8 = non::Class::_#staticField in #t8{core::int} : throw new _in::LateError::fieldNI("staticField");
   static set staticField(core::int #t9) → void {
     non::Class::_#staticField#isSet = true;
     non::Class::_#staticField = #t9;
   }
   static get staticFinalField() → dynamic
-    return non::Class::_#staticFinalField#isSet ?{dynamic} non::Class::_#staticFinalField : throw new _in::LateInitializationErrorImpl::•("Field 'staticFinalField' has not been initialized.");
+    return non::Class::_#staticFinalField#isSet ?{dynamic} non::Class::_#staticFinalField : throw new _in::LateError::fieldNI("staticFinalField");
   static set staticFinalField(dynamic #t10) → void
     if(non::Class::_#staticFinalField#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Field 'staticFinalField' has already been initialized.");
+      throw new _in::LateError::fieldAI("staticFinalField");
     else {
       non::Class::_#staticFinalField#isSet = true;
       non::Class::_#staticFinalField = #t10;
@@ -102,16 +102,16 @@
 static field dynamic _#finalTopLevelField = null;
 static field core::bool _#finalTopLevelField#isSet = false;
 static get topLevelField() → core::int
-  return non::_#topLevelField#isSet ?{core::int} let final core::int? #t11 = non::_#topLevelField in #t11{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'topLevelField' has not been initialized.");
+  return non::_#topLevelField#isSet ?{core::int} let final core::int? #t11 = non::_#topLevelField in #t11{core::int} : throw new _in::LateError::fieldNI("topLevelField");
 static set topLevelField(core::int #t12) → void {
   non::_#topLevelField#isSet = true;
   non::_#topLevelField = #t12;
 }
 static get finalTopLevelField() → dynamic
-  return non::_#finalTopLevelField#isSet ?{dynamic} non::_#finalTopLevelField : throw new _in::LateInitializationErrorImpl::•("Field 'finalTopLevelField' has not been initialized.");
+  return non::_#finalTopLevelField#isSet ?{dynamic} non::_#finalTopLevelField : throw new _in::LateError::fieldNI("finalTopLevelField");
 static set finalTopLevelField(dynamic #t13) → void
   if(non::_#finalTopLevelField#isSet)
-    throw new _in::LateInitializationErrorImpl::•("Field 'finalTopLevelField' has already been initialized.");
+    throw new _in::LateError::fieldAI("finalTopLevelField");
   else {
     non::_#finalTopLevelField#isSet = true;
     non::_#finalTopLevelField = #t13;
@@ -120,7 +120,7 @@
   core::int? local;
   core::bool #local#isSet = false;
   function #local#get() → core::int
-    return #local#isSet ?{core::int} local{core::int} : throw new _in::LateInitializationErrorImpl::•("Local 'local' has not been initialized.");
+    return #local#isSet ?{core::int} local{core::int} : throw new _in::LateError::localNI("local");
   function #local#set(core::int #t14) → dynamic {
     #local#isSet = true;
     return local = #t14;
@@ -128,10 +128,10 @@
   final dynamic finalLocal;
   core::bool #finalLocal#isSet = false;
   function #finalLocal#get() → dynamic
-    return #finalLocal#isSet ?{dynamic} finalLocal : throw new _in::LateInitializationErrorImpl::•("Local 'finalLocal' has not been initialized.");
+    return #finalLocal#isSet ?{dynamic} finalLocal : throw new _in::LateError::localNI("finalLocal");
   function #finalLocal#set(dynamic #t15) → dynamic
     if(#finalLocal#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Local 'finalLocal' has already been initialized.");
+      throw new _in::LateError::localAI("finalLocal");
     else {
       #finalLocal#isSet = true;
       return finalLocal = #t15;
@@ -139,7 +139,7 @@
   non::method::T? localTypeVariable;
   core::bool #localTypeVariable#isSet = false;
   function #localTypeVariable#get() → non::method::T
-    return #localTypeVariable#isSet ?{non::method::T} localTypeVariable{non::method::T} : throw new _in::LateInitializationErrorImpl::•("Local 'localTypeVariable' has not been initialized.");
+    return #localTypeVariable#isSet ?{non::method::T} localTypeVariable{non::method::T} : throw new _in::LateError::localNI("localTypeVariable");
   function #localTypeVariable#set(non::method::T #t16) → dynamic {
     #localTypeVariable#isSet = true;
     return localTypeVariable = #t16;
@@ -147,10 +147,10 @@
   final non::method::T? finalLocalTypeVariable;
   core::bool #finalLocalTypeVariable#isSet = false;
   function #finalLocalTypeVariable#get() → non::method::T
-    return #finalLocalTypeVariable#isSet ?{non::method::T} finalLocalTypeVariable{non::method::T} : throw new _in::LateInitializationErrorImpl::•("Local 'finalLocalTypeVariable' has not been initialized.");
+    return #finalLocalTypeVariable#isSet ?{non::method::T} finalLocalTypeVariable{non::method::T} : throw new _in::LateError::localNI("finalLocalTypeVariable");
   function #finalLocalTypeVariable#set(non::method::T #t17) → dynamic
     if(#finalLocalTypeVariable#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Local 'finalLocalTypeVariable' has already been initialized.");
+      throw new _in::LateError::localAI("finalLocalTypeVariable");
     else {
       #finalLocalTypeVariable#isSet = true;
       return finalLocalTypeVariable = #t17;
@@ -165,8 +165,8 @@
     non::expect(t, #localTypeVariable#get.call());
     non::expect(t, #finalLocalTypeVariable#get.call());
   }
-  non::throws(() → core::int => #finalLocal#set.call(i));
-  non::throws(() → non::method::T => #finalLocalTypeVariable#set.call(t));
+  non::throws(() → void => #finalLocal#set.call(i));
+  non::throws(() → void => #finalLocalTypeVariable#set.call(t));
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
   if(!expected.{core::Object::==}(actual))
diff --git a/pkg/front_end/testcases/late_lowering/non_nullable_from_opt_out.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/non_nullable_from_opt_out.dart.weak.transformed.expect
index 454958d..53ea9c9 100644
--- a/pkg/front_end/testcases/late_lowering/non_nullable_from_opt_out.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/non_nullable_from_opt_out.dart.weak.transformed.expect
@@ -23,11 +23,11 @@
   non::expect(null, c.{non::Class::finalInstanceTypeVariable});
   non::expect(null, non::Class::staticField);
   non::expect(null, non::Class::staticFinalField);
-  non::throws(() → core::Null? => non::finalTopLevelField = null);
-  non::throws(() → core::Null? => c.{non::Class::finalInstanceField} = null);
-  non::throws(() → core::Null? => c.{non::Class::finalInstanceTypeVariable} = null);
-  non::throws(() → core::Null? => non::Class::staticFinalField = null);
-  non::method<core::Null?>(true, null, null);
+  non::throws(() → Null => non::finalTopLevelField = null);
+  non::throws(() → Null => c.{non::Class::finalInstanceField} = null);
+  non::throws(() → Null => c.{non::Class::finalInstanceTypeVariable} = null);
+  non::throws(() → Null => non::Class::staticFinalField = null);
+  non::method<Null>(true, null, null);
 }
 
 library /*isNonNullableByDefault*/;
@@ -52,46 +52,46 @@
     : super core::Object::•()
     ;
   get instanceField() → core::int
-    return this.{non::Class::_#Class#instanceField#isSet} ?{core::int} let final core::int? #t1 = this.{non::Class::_#Class#instanceField} in #t1{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'instanceField' has not been initialized.");
+    return this.{non::Class::_#Class#instanceField#isSet} ?{core::int} let final core::int? #t1 = this.{non::Class::_#Class#instanceField} in #t1{core::int} : throw new _in::LateError::fieldNI("instanceField");
   set instanceField(core::int #t2) → void {
     this.{non::Class::_#Class#instanceField#isSet} = true;
     this.{non::Class::_#Class#instanceField} = #t2;
   }
   get finalInstanceField() → dynamic
-    return this.{non::Class::_#Class#finalInstanceField#isSet} ?{dynamic} this.{non::Class::_#Class#finalInstanceField} : throw new _in::LateInitializationErrorImpl::•("Field 'finalInstanceField' has not been initialized.");
+    return this.{non::Class::_#Class#finalInstanceField#isSet} ?{dynamic} this.{non::Class::_#Class#finalInstanceField} : throw new _in::LateError::fieldNI("finalInstanceField");
   set finalInstanceField(dynamic #t3) → void
     if(this.{non::Class::_#Class#finalInstanceField#isSet})
-      throw new _in::LateInitializationErrorImpl::•("Field 'finalInstanceField' has already been initialized.");
+      throw new _in::LateError::fieldAI("finalInstanceField");
     else {
       this.{non::Class::_#Class#finalInstanceField#isSet} = true;
       this.{non::Class::_#Class#finalInstanceField} = #t3;
     }
   get instanceTypeVariable() → non::Class::T
-    return this.{non::Class::_#Class#instanceTypeVariable#isSet} ?{non::Class::T} let final non::Class::T? #t4 = this.{non::Class::_#Class#instanceTypeVariable} in #t4{non::Class::T} : throw new _in::LateInitializationErrorImpl::•("Field 'instanceTypeVariable' has not been initialized.");
+    return this.{non::Class::_#Class#instanceTypeVariable#isSet} ?{non::Class::T} let final non::Class::T? #t4 = this.{non::Class::_#Class#instanceTypeVariable} in #t4{non::Class::T} : throw new _in::LateError::fieldNI("instanceTypeVariable");
   set instanceTypeVariable(generic-covariant-impl non::Class::T #t5) → void {
     this.{non::Class::_#Class#instanceTypeVariable#isSet} = true;
     this.{non::Class::_#Class#instanceTypeVariable} = #t5;
   }
   get finalInstanceTypeVariable() → non::Class::T
-    return this.{non::Class::_#Class#finalInstanceTypeVariable#isSet} ?{non::Class::T} let final non::Class::T? #t6 = this.{non::Class::_#Class#finalInstanceTypeVariable} in #t6{non::Class::T} : throw new _in::LateInitializationErrorImpl::•("Field 'finalInstanceTypeVariable' has not been initialized.");
+    return this.{non::Class::_#Class#finalInstanceTypeVariable#isSet} ?{non::Class::T} let final non::Class::T? #t6 = this.{non::Class::_#Class#finalInstanceTypeVariable} in #t6{non::Class::T} : throw new _in::LateError::fieldNI("finalInstanceTypeVariable");
   set finalInstanceTypeVariable(non::Class::T #t7) → void
     if(this.{non::Class::_#Class#finalInstanceTypeVariable#isSet})
-      throw new _in::LateInitializationErrorImpl::•("Field 'finalInstanceTypeVariable' has already been initialized.");
+      throw new _in::LateError::fieldAI("finalInstanceTypeVariable");
     else {
       this.{non::Class::_#Class#finalInstanceTypeVariable#isSet} = true;
       this.{non::Class::_#Class#finalInstanceTypeVariable} = #t7;
     }
   static get staticField() → core::int
-    return non::Class::_#staticField#isSet ?{core::int} let final core::int? #t8 = non::Class::_#staticField in #t8{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'staticField' has not been initialized.");
+    return non::Class::_#staticField#isSet ?{core::int} let final core::int? #t8 = non::Class::_#staticField in #t8{core::int} : throw new _in::LateError::fieldNI("staticField");
   static set staticField(core::int #t9) → void {
     non::Class::_#staticField#isSet = true;
     non::Class::_#staticField = #t9;
   }
   static get staticFinalField() → dynamic
-    return non::Class::_#staticFinalField#isSet ?{dynamic} non::Class::_#staticFinalField : throw new _in::LateInitializationErrorImpl::•("Field 'staticFinalField' has not been initialized.");
+    return non::Class::_#staticFinalField#isSet ?{dynamic} non::Class::_#staticFinalField : throw new _in::LateError::fieldNI("staticFinalField");
   static set staticFinalField(dynamic #t10) → void
     if(non::Class::_#staticFinalField#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Field 'staticFinalField' has already been initialized.");
+      throw new _in::LateError::fieldAI("staticFinalField");
     else {
       non::Class::_#staticFinalField#isSet = true;
       non::Class::_#staticFinalField = #t10;
@@ -102,16 +102,16 @@
 static field dynamic _#finalTopLevelField = null;
 static field core::bool _#finalTopLevelField#isSet = false;
 static get topLevelField() → core::int
-  return non::_#topLevelField#isSet ?{core::int} let final core::int? #t11 = non::_#topLevelField in #t11{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'topLevelField' has not been initialized.");
+  return non::_#topLevelField#isSet ?{core::int} let final core::int? #t11 = non::_#topLevelField in #t11{core::int} : throw new _in::LateError::fieldNI("topLevelField");
 static set topLevelField(core::int #t12) → void {
   non::_#topLevelField#isSet = true;
   non::_#topLevelField = #t12;
 }
 static get finalTopLevelField() → dynamic
-  return non::_#finalTopLevelField#isSet ?{dynamic} non::_#finalTopLevelField : throw new _in::LateInitializationErrorImpl::•("Field 'finalTopLevelField' has not been initialized.");
+  return non::_#finalTopLevelField#isSet ?{dynamic} non::_#finalTopLevelField : throw new _in::LateError::fieldNI("finalTopLevelField");
 static set finalTopLevelField(dynamic #t13) → void
   if(non::_#finalTopLevelField#isSet)
-    throw new _in::LateInitializationErrorImpl::•("Field 'finalTopLevelField' has already been initialized.");
+    throw new _in::LateError::fieldAI("finalTopLevelField");
   else {
     non::_#finalTopLevelField#isSet = true;
     non::_#finalTopLevelField = #t13;
@@ -120,7 +120,7 @@
   core::int? local;
   core::bool #local#isSet = false;
   function #local#get() → core::int
-    return #local#isSet ?{core::int} local{core::int} : throw new _in::LateInitializationErrorImpl::•("Local 'local' has not been initialized.");
+    return #local#isSet ?{core::int} local{core::int} : throw new _in::LateError::localNI("local");
   function #local#set(core::int #t14) → dynamic {
     #local#isSet = true;
     return local = #t14;
@@ -128,10 +128,10 @@
   final dynamic finalLocal;
   core::bool #finalLocal#isSet = false;
   function #finalLocal#get() → dynamic
-    return #finalLocal#isSet ?{dynamic} finalLocal : throw new _in::LateInitializationErrorImpl::•("Local 'finalLocal' has not been initialized.");
+    return #finalLocal#isSet ?{dynamic} finalLocal : throw new _in::LateError::localNI("finalLocal");
   function #finalLocal#set(dynamic #t15) → dynamic
     if(#finalLocal#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Local 'finalLocal' has already been initialized.");
+      throw new _in::LateError::localAI("finalLocal");
     else {
       #finalLocal#isSet = true;
       return finalLocal = #t15;
@@ -139,7 +139,7 @@
   non::method::T? localTypeVariable;
   core::bool #localTypeVariable#isSet = false;
   function #localTypeVariable#get() → non::method::T
-    return #localTypeVariable#isSet ?{non::method::T} localTypeVariable{non::method::T} : throw new _in::LateInitializationErrorImpl::•("Local 'localTypeVariable' has not been initialized.");
+    return #localTypeVariable#isSet ?{non::method::T} localTypeVariable{non::method::T} : throw new _in::LateError::localNI("localTypeVariable");
   function #localTypeVariable#set(non::method::T #t16) → dynamic {
     #localTypeVariable#isSet = true;
     return localTypeVariable = #t16;
@@ -147,10 +147,10 @@
   final non::method::T? finalLocalTypeVariable;
   core::bool #finalLocalTypeVariable#isSet = false;
   function #finalLocalTypeVariable#get() → non::method::T
-    return #finalLocalTypeVariable#isSet ?{non::method::T} finalLocalTypeVariable{non::method::T} : throw new _in::LateInitializationErrorImpl::•("Local 'finalLocalTypeVariable' has not been initialized.");
+    return #finalLocalTypeVariable#isSet ?{non::method::T} finalLocalTypeVariable{non::method::T} : throw new _in::LateError::localNI("finalLocalTypeVariable");
   function #finalLocalTypeVariable#set(non::method::T #t17) → dynamic
     if(#finalLocalTypeVariable#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Local 'finalLocalTypeVariable' has already been initialized.");
+      throw new _in::LateError::localAI("finalLocalTypeVariable");
     else {
       #finalLocalTypeVariable#isSet = true;
       return finalLocalTypeVariable = #t17;
@@ -165,8 +165,8 @@
     non::expect(t, #localTypeVariable#get.call());
     non::expect(t, #finalLocalTypeVariable#get.call());
   }
-  non::throws(() → core::int => #finalLocal#set.call(i));
-  non::throws(() → non::method::T => #finalLocalTypeVariable#set.call(t));
+  non::throws(() → void => #finalLocal#set.call(i));
+  non::throws(() → void => #finalLocalTypeVariable#set.call(t));
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
   if(!expected.{core::Object::==}(actual))
diff --git a/pkg/front_end/testcases/late_lowering/override.dart.strong.expect b/pkg/front_end/testcases/late_lowering/override.dart.strong.expect
index 8e2fcee..bc88c3f 100644
--- a/pkg/front_end/testcases/late_lowering/override.dart.strong.expect
+++ b/pkg/front_end/testcases/late_lowering/override.dart.strong.expect
@@ -12,27 +12,27 @@
     : super core::Object::•()
     ;
   get field1() → core::int
-    return let final core::int? #t1 = this.{self::Class::_#Class#field1} in #t1.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'field1' has not been initialized.") : #t1{core::int};
+    return let final core::int? #t1 = this.{self::Class::_#Class#field1} in #t1.==(null) ?{core::int} throw new _in::LateError::fieldNI("field1") : #t1{core::int};
   set field1(core::int #t2) → void
     this.{self::Class::_#Class#field1} = #t2;
   get field2() → core::int
-    return let final core::int? #t3 = this.{self::Class::_#Class#field2} in #t3.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'field2' has not been initialized.") : #t3{core::int};
+    return let final core::int? #t3 = this.{self::Class::_#Class#field2} in #t3.==(null) ?{core::int} throw new _in::LateError::fieldNI("field2") : #t3{core::int};
   set field2(core::int #t4) → void
     this.{self::Class::_#Class#field2} = #t4;
   get field3() → core::int
-    return let final core::int? #t5 = this.{self::Class::_#Class#field3} in #t5.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'field3' has not been initialized.") : #t5{core::int};
+    return let final core::int? #t5 = this.{self::Class::_#Class#field3} in #t5.==(null) ?{core::int} throw new _in::LateError::fieldNI("field3") : #t5{core::int};
   set field3(core::int #t6) → void
     if(this.{self::Class::_#Class#field3}.==(null))
       this.{self::Class::_#Class#field3} = #t6;
     else
-      throw new _in::LateInitializationErrorImpl::•("Field 'field3' has already been initialized.");
+      throw new _in::LateError::fieldAI("field3");
   get field4() → core::int
-    return let final core::int? #t7 = this.{self::Class::_#Class#field4} in #t7.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'field4' has not been initialized.") : #t7{core::int};
+    return let final core::int? #t7 = this.{self::Class::_#Class#field4} in #t7.==(null) ?{core::int} throw new _in::LateError::fieldNI("field4") : #t7{core::int};
   set field4(core::int #t8) → void
     if(this.{self::Class::_#Class#field4}.==(null))
       this.{self::Class::_#Class#field4} = #t8;
     else
-      throw new _in::LateInitializationErrorImpl::•("Field 'field4' has already been initialized.");
+      throw new _in::LateError::fieldAI("field4");
 }
 class SubClass extends self::Class {
   field core::int? _#SubClass#field1 = null;
@@ -43,7 +43,7 @@
     : super self::Class::•()
     ;
   get field1() → core::int
-    return let final core::int? #t9 = this.{self::SubClass::_#SubClass#field1} in #t9.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'field1' has not been initialized.") : #t9{core::int};
+    return let final core::int? #t9 = this.{self::SubClass::_#SubClass#field1} in #t9.==(null) ?{core::int} throw new _in::LateError::fieldNI("field1") : #t9{core::int};
   set field1(core::int #t10) → void
     this.{self::SubClass::_#SubClass#field1} = #t10;
   get field2() → core::int
@@ -51,14 +51,14 @@
   set field2(core::int #t12) → void
     this.{self::SubClass::_#SubClass#field2} = #t12;
   get field3() → core::int
-    return let final core::int? #t13 = this.{self::SubClass::_#SubClass#field3} in #t13.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'field3' has not been initialized.") : #t13{core::int};
+    return let final core::int? #t13 = this.{self::SubClass::_#SubClass#field3} in #t13.==(null) ?{core::int} throw new _in::LateError::fieldNI("field3") : #t13{core::int};
   set field3(core::int #t14) → void
     if(this.{self::SubClass::_#SubClass#field3}.==(null))
       this.{self::SubClass::_#SubClass#field3} = #t14;
     else
-      throw new _in::LateInitializationErrorImpl::•("Field 'field3' has already been initialized.");
+      throw new _in::LateError::fieldAI("field3");
   get field4() → core::int
-    return let final core::int? #t15 = this.{self::SubClass::_#SubClass#field4} in #t15.==(null) ?{core::int} let final core::int #t16 = 0 in this.{self::SubClass::_#SubClass#field4}.==(null) ?{core::int} this.{self::SubClass::_#SubClass#field4} = #t16 : throw new _in::LateInitializationErrorImpl::•("Field 'field4' has been assigned during initialization.") : #t15{core::int};
+    return let final core::int? #t15 = this.{self::SubClass::_#SubClass#field4} in #t15.==(null) ?{core::int} let final core::int #t16 = 0 in this.{self::SubClass::_#SubClass#field4}.==(null) ?{core::int} this.{self::SubClass::_#SubClass#field4} = #t16 : throw new _in::LateError::fieldADI("field4") : #t15{core::int};
   get directField1() → core::int
     return super.{self::Class::field1};
   set directField1(core::int value) → void {
diff --git a/pkg/front_end/testcases/late_lowering/override.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/override.dart.strong.transformed.expect
index f94376c..6b5321f 100644
--- a/pkg/front_end/testcases/late_lowering/override.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/override.dart.strong.transformed.expect
@@ -12,27 +12,27 @@
     : super core::Object::•()
     ;
   get field1() → core::int
-    return let final core::int? #t1 = this.{self::Class::_#Class#field1} in #t1.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'field1' has not been initialized.") : #t1{core::int};
+    return let final core::int? #t1 = this.{self::Class::_#Class#field1} in #t1.==(null) ?{core::int} throw new _in::LateError::fieldNI("field1") : #t1{core::int};
   set field1(core::int #t2) → void
     this.{self::Class::_#Class#field1} = #t2;
   get field2() → core::int
-    return let final core::int? #t3 = this.{self::Class::_#Class#field2} in #t3.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'field2' has not been initialized.") : #t3{core::int};
+    return let final core::int? #t3 = this.{self::Class::_#Class#field2} in #t3.==(null) ?{core::int} throw new _in::LateError::fieldNI("field2") : #t3{core::int};
   set field2(core::int #t4) → void
     this.{self::Class::_#Class#field2} = #t4;
   get field3() → core::int
-    return let final core::int? #t5 = this.{self::Class::_#Class#field3} in #t5.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'field3' has not been initialized.") : #t5{core::int};
+    return let final core::int? #t5 = this.{self::Class::_#Class#field3} in #t5.==(null) ?{core::int} throw new _in::LateError::fieldNI("field3") : #t5{core::int};
   set field3(core::int #t6) → void
     if(this.{self::Class::_#Class#field3}.==(null))
       this.{self::Class::_#Class#field3} = #t6;
     else
-      throw new _in::LateInitializationErrorImpl::•("Field 'field3' has already been initialized.");
+      throw new _in::LateError::fieldAI("field3");
   get field4() → core::int
-    return let final core::int? #t7 = this.{self::Class::_#Class#field4} in #t7.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'field4' has not been initialized.") : #t7{core::int};
+    return let final core::int? #t7 = this.{self::Class::_#Class#field4} in #t7.==(null) ?{core::int} throw new _in::LateError::fieldNI("field4") : #t7{core::int};
   set field4(core::int #t8) → void
     if(this.{self::Class::_#Class#field4}.==(null))
       this.{self::Class::_#Class#field4} = #t8;
     else
-      throw new _in::LateInitializationErrorImpl::•("Field 'field4' has already been initialized.");
+      throw new _in::LateError::fieldAI("field4");
 }
 class SubClass extends self::Class {
   field core::int? _#SubClass#field1 = null;
@@ -43,7 +43,7 @@
     : super self::Class::•()
     ;
   get field1() → core::int
-    return let final core::int? #t9 = this.{self::SubClass::_#SubClass#field1} in #t9.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'field1' has not been initialized.") : #t9{core::int};
+    return let final core::int? #t9 = this.{self::SubClass::_#SubClass#field1} in #t9.==(null) ?{core::int} throw new _in::LateError::fieldNI("field1") : #t9{core::int};
   set field1(core::int #t10) → void
     this.{self::SubClass::_#SubClass#field1} = #t10;
   get field2() → core::int
@@ -51,14 +51,14 @@
   set field2(core::int #t12) → void
     this.{self::SubClass::_#SubClass#field2} = #t12;
   get field3() → core::int
-    return let final core::int? #t13 = this.{self::SubClass::_#SubClass#field3} in #t13.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'field3' has not been initialized.") : #t13{core::int};
+    return let final core::int? #t13 = this.{self::SubClass::_#SubClass#field3} in #t13.==(null) ?{core::int} throw new _in::LateError::fieldNI("field3") : #t13{core::int};
   set field3(core::int #t14) → void
     if(this.{self::SubClass::_#SubClass#field3}.==(null))
       this.{self::SubClass::_#SubClass#field3} = #t14;
     else
-      throw new _in::LateInitializationErrorImpl::•("Field 'field3' has already been initialized.");
+      throw new _in::LateError::fieldAI("field3");
   get field4() → core::int
-    return let final core::int? #t15 = this.{self::SubClass::_#SubClass#field4} in #t15.==(null) ?{core::int} let final core::int #t16 = 0 in this.{self::SubClass::_#SubClass#field4}.==(null) ?{core::int} this.{self::SubClass::_#SubClass#field4} = #t16 : throw new _in::LateInitializationErrorImpl::•("Field 'field4' has been assigned during initialization.") : #t15{core::int};
+    return let final core::int? #t15 = this.{self::SubClass::_#SubClass#field4} in #t15.==(null) ?{core::int} let final core::int #t16 = 0 in this.{self::SubClass::_#SubClass#field4}.==(null) ?{core::int} this.{self::SubClass::_#SubClass#field4} = #t16 : throw new _in::LateError::fieldADI("field4") : #t15{core::int};
   get directField1() → core::int
     return super.{self::Class::field1};
   set directField1(core::int value) → void {
diff --git a/pkg/front_end/testcases/late_lowering/override.dart.weak.expect b/pkg/front_end/testcases/late_lowering/override.dart.weak.expect
index 961d813..ee8f06d 100644
--- a/pkg/front_end/testcases/late_lowering/override.dart.weak.expect
+++ b/pkg/front_end/testcases/late_lowering/override.dart.weak.expect
@@ -16,31 +16,31 @@
     : super core::Object::•()
     ;
   get field1() → core::int
-    return this.{self::Class::_#Class#field1#isSet} ?{core::int} let final core::int? #t1 = this.{self::Class::_#Class#field1} in #t1{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'field1' has not been initialized.");
+    return this.{self::Class::_#Class#field1#isSet} ?{core::int} let final core::int? #t1 = this.{self::Class::_#Class#field1} in #t1{core::int} : throw new _in::LateError::fieldNI("field1");
   set field1(core::int #t2) → void {
     this.{self::Class::_#Class#field1#isSet} = true;
     this.{self::Class::_#Class#field1} = #t2;
   }
   get field2() → core::int
-    return this.{self::Class::_#Class#field2#isSet} ?{core::int} let final core::int? #t3 = this.{self::Class::_#Class#field2} in #t3{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'field2' has not been initialized.");
+    return this.{self::Class::_#Class#field2#isSet} ?{core::int} let final core::int? #t3 = this.{self::Class::_#Class#field2} in #t3{core::int} : throw new _in::LateError::fieldNI("field2");
   set field2(core::int #t4) → void {
     this.{self::Class::_#Class#field2#isSet} = true;
     this.{self::Class::_#Class#field2} = #t4;
   }
   get field3() → core::int
-    return this.{self::Class::_#Class#field3#isSet} ?{core::int} let final core::int? #t5 = this.{self::Class::_#Class#field3} in #t5{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'field3' has not been initialized.");
+    return this.{self::Class::_#Class#field3#isSet} ?{core::int} let final core::int? #t5 = this.{self::Class::_#Class#field3} in #t5{core::int} : throw new _in::LateError::fieldNI("field3");
   set field3(core::int #t6) → void
     if(this.{self::Class::_#Class#field3#isSet})
-      throw new _in::LateInitializationErrorImpl::•("Field 'field3' has already been initialized.");
+      throw new _in::LateError::fieldAI("field3");
     else {
       this.{self::Class::_#Class#field3#isSet} = true;
       this.{self::Class::_#Class#field3} = #t6;
     }
   get field4() → core::int
-    return this.{self::Class::_#Class#field4#isSet} ?{core::int} let final core::int? #t7 = this.{self::Class::_#Class#field4} in #t7{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'field4' has not been initialized.");
+    return this.{self::Class::_#Class#field4#isSet} ?{core::int} let final core::int? #t7 = this.{self::Class::_#Class#field4} in #t7{core::int} : throw new _in::LateError::fieldNI("field4");
   set field4(core::int #t8) → void
     if(this.{self::Class::_#Class#field4#isSet})
-      throw new _in::LateInitializationErrorImpl::•("Field 'field4' has already been initialized.");
+      throw new _in::LateError::fieldAI("field4");
     else {
       this.{self::Class::_#Class#field4#isSet} = true;
       this.{self::Class::_#Class#field4} = #t8;
@@ -59,7 +59,7 @@
     : super self::Class::•()
     ;
   get field1() → core::int
-    return this.{self::SubClass::_#SubClass#field1#isSet} ?{core::int} let final core::int? #t9 = this.{self::SubClass::_#SubClass#field1} in #t9{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'field1' has not been initialized.");
+    return this.{self::SubClass::_#SubClass#field1#isSet} ?{core::int} let final core::int? #t9 = this.{self::SubClass::_#SubClass#field1} in #t9{core::int} : throw new _in::LateError::fieldNI("field1");
   set field1(core::int #t10) → void {
     this.{self::SubClass::_#SubClass#field1#isSet} = true;
     this.{self::SubClass::_#SubClass#field1} = #t10;
@@ -76,10 +76,10 @@
     this.{self::SubClass::_#SubClass#field2} = #t12;
   }
   get field3() → core::int
-    return this.{self::SubClass::_#SubClass#field3#isSet} ?{core::int} let final core::int? #t13 = this.{self::SubClass::_#SubClass#field3} in #t13{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'field3' has not been initialized.");
+    return this.{self::SubClass::_#SubClass#field3#isSet} ?{core::int} let final core::int? #t13 = this.{self::SubClass::_#SubClass#field3} in #t13{core::int} : throw new _in::LateError::fieldNI("field3");
   set field3(core::int #t14) → void
     if(this.{self::SubClass::_#SubClass#field3#isSet})
-      throw new _in::LateInitializationErrorImpl::•("Field 'field3' has already been initialized.");
+      throw new _in::LateError::fieldAI("field3");
     else {
       this.{self::SubClass::_#SubClass#field3#isSet} = true;
       this.{self::SubClass::_#SubClass#field3} = #t14;
@@ -88,7 +88,7 @@
     if(!this.{self::SubClass::_#SubClass#field4#isSet}) {
       final core::int #t15 = 0;
       if(this.{self::SubClass::_#SubClass#field4#isSet})
-        throw new _in::LateInitializationErrorImpl::•("Field 'field4' has been assigned during initialization.");
+        throw new _in::LateError::fieldADI("field4");
       this.{self::SubClass::_#SubClass#field4} = #t15;
       this.{self::SubClass::_#SubClass#field4#isSet} = true;
     }
diff --git a/pkg/front_end/testcases/late_lowering/override.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/override.dart.weak.transformed.expect
index 961d813..ee8f06d 100644
--- a/pkg/front_end/testcases/late_lowering/override.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/override.dart.weak.transformed.expect
@@ -16,31 +16,31 @@
     : super core::Object::•()
     ;
   get field1() → core::int
-    return this.{self::Class::_#Class#field1#isSet} ?{core::int} let final core::int? #t1 = this.{self::Class::_#Class#field1} in #t1{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'field1' has not been initialized.");
+    return this.{self::Class::_#Class#field1#isSet} ?{core::int} let final core::int? #t1 = this.{self::Class::_#Class#field1} in #t1{core::int} : throw new _in::LateError::fieldNI("field1");
   set field1(core::int #t2) → void {
     this.{self::Class::_#Class#field1#isSet} = true;
     this.{self::Class::_#Class#field1} = #t2;
   }
   get field2() → core::int
-    return this.{self::Class::_#Class#field2#isSet} ?{core::int} let final core::int? #t3 = this.{self::Class::_#Class#field2} in #t3{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'field2' has not been initialized.");
+    return this.{self::Class::_#Class#field2#isSet} ?{core::int} let final core::int? #t3 = this.{self::Class::_#Class#field2} in #t3{core::int} : throw new _in::LateError::fieldNI("field2");
   set field2(core::int #t4) → void {
     this.{self::Class::_#Class#field2#isSet} = true;
     this.{self::Class::_#Class#field2} = #t4;
   }
   get field3() → core::int
-    return this.{self::Class::_#Class#field3#isSet} ?{core::int} let final core::int? #t5 = this.{self::Class::_#Class#field3} in #t5{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'field3' has not been initialized.");
+    return this.{self::Class::_#Class#field3#isSet} ?{core::int} let final core::int? #t5 = this.{self::Class::_#Class#field3} in #t5{core::int} : throw new _in::LateError::fieldNI("field3");
   set field3(core::int #t6) → void
     if(this.{self::Class::_#Class#field3#isSet})
-      throw new _in::LateInitializationErrorImpl::•("Field 'field3' has already been initialized.");
+      throw new _in::LateError::fieldAI("field3");
     else {
       this.{self::Class::_#Class#field3#isSet} = true;
       this.{self::Class::_#Class#field3} = #t6;
     }
   get field4() → core::int
-    return this.{self::Class::_#Class#field4#isSet} ?{core::int} let final core::int? #t7 = this.{self::Class::_#Class#field4} in #t7{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'field4' has not been initialized.");
+    return this.{self::Class::_#Class#field4#isSet} ?{core::int} let final core::int? #t7 = this.{self::Class::_#Class#field4} in #t7{core::int} : throw new _in::LateError::fieldNI("field4");
   set field4(core::int #t8) → void
     if(this.{self::Class::_#Class#field4#isSet})
-      throw new _in::LateInitializationErrorImpl::•("Field 'field4' has already been initialized.");
+      throw new _in::LateError::fieldAI("field4");
     else {
       this.{self::Class::_#Class#field4#isSet} = true;
       this.{self::Class::_#Class#field4} = #t8;
@@ -59,7 +59,7 @@
     : super self::Class::•()
     ;
   get field1() → core::int
-    return this.{self::SubClass::_#SubClass#field1#isSet} ?{core::int} let final core::int? #t9 = this.{self::SubClass::_#SubClass#field1} in #t9{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'field1' has not been initialized.");
+    return this.{self::SubClass::_#SubClass#field1#isSet} ?{core::int} let final core::int? #t9 = this.{self::SubClass::_#SubClass#field1} in #t9{core::int} : throw new _in::LateError::fieldNI("field1");
   set field1(core::int #t10) → void {
     this.{self::SubClass::_#SubClass#field1#isSet} = true;
     this.{self::SubClass::_#SubClass#field1} = #t10;
@@ -76,10 +76,10 @@
     this.{self::SubClass::_#SubClass#field2} = #t12;
   }
   get field3() → core::int
-    return this.{self::SubClass::_#SubClass#field3#isSet} ?{core::int} let final core::int? #t13 = this.{self::SubClass::_#SubClass#field3} in #t13{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'field3' has not been initialized.");
+    return this.{self::SubClass::_#SubClass#field3#isSet} ?{core::int} let final core::int? #t13 = this.{self::SubClass::_#SubClass#field3} in #t13{core::int} : throw new _in::LateError::fieldNI("field3");
   set field3(core::int #t14) → void
     if(this.{self::SubClass::_#SubClass#field3#isSet})
-      throw new _in::LateInitializationErrorImpl::•("Field 'field3' has already been initialized.");
+      throw new _in::LateError::fieldAI("field3");
     else {
       this.{self::SubClass::_#SubClass#field3#isSet} = true;
       this.{self::SubClass::_#SubClass#field3} = #t14;
@@ -88,7 +88,7 @@
     if(!this.{self::SubClass::_#SubClass#field4#isSet}) {
       final core::int #t15 = 0;
       if(this.{self::SubClass::_#SubClass#field4#isSet})
-        throw new _in::LateInitializationErrorImpl::•("Field 'field4' has been assigned during initialization.");
+        throw new _in::LateError::fieldADI("field4");
       this.{self::SubClass::_#SubClass#field4} = #t15;
       this.{self::SubClass::_#SubClass#field4#isSet} = true;
     }
diff --git a/pkg/front_end/testcases/late_lowering/override_getter_setter.dart.strong.expect b/pkg/front_end/testcases/late_lowering/override_getter_setter.dart.strong.expect
index 6e5f0ef..a40aad4 100644
--- a/pkg/front_end/testcases/late_lowering/override_getter_setter.dart.strong.expect
+++ b/pkg/front_end/testcases/late_lowering/override_getter_setter.dart.strong.expect
@@ -11,17 +11,17 @@
     : super core::Object::•()
     ;
   get x() → core::int
-    return let final core::int? #t1 = this.{self::A::_#A#x} in #t1.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'x' has not been initialized.") : #t1{core::int};
+    return let final core::int? #t1 = this.{self::A::_#A#x} in #t1.==(null) ?{core::int} throw new _in::LateError::fieldNI("x") : #t1{core::int};
   set x(core::int #t2) → void
     if(this.{self::A::_#A#x}.==(null))
       this.{self::A::_#A#x} = #t2;
     else
-      throw new _in::LateInitializationErrorImpl::•("Field 'x' has already been initialized.");
+      throw new _in::LateError::fieldAI("x");
   get y() → core::int?
-    return this.{self::A::_#A#y#isSet} ?{core::int?} this.{self::A::_#A#y} : throw new _in::LateInitializationErrorImpl::•("Field 'y' has not been initialized.");
+    return this.{self::A::_#A#y#isSet} ?{core::int?} this.{self::A::_#A#y} : throw new _in::LateError::fieldNI("y");
   set y(core::int? #t3) → void
     if(this.{self::A::_#A#y#isSet})
-      throw new _in::LateInitializationErrorImpl::•("Field 'y' has already been initialized.");
+      throw new _in::LateError::fieldAI("y");
     else {
       this.{self::A::_#A#y#isSet} = true;
       this.{self::A::_#A#y} = #t3;
@@ -44,12 +44,12 @@
     : super self::A::•()
     ;
   get x() → core::int
-    return let final core::int? #t4 = this.{self::C::_#C#x} in #t4.==(null) ?{core::int} let final core::int #t5 = 2 in this.{self::C::_#C#x}.==(null) ?{core::int} this.{self::C::_#C#x} = #t5 : throw new _in::LateInitializationErrorImpl::•("Field 'x' has been assigned during initialization.") : #t4{core::int};
+    return let final core::int? #t4 = this.{self::C::_#C#x} in #t4.==(null) ?{core::int} let final core::int #t5 = 2 in this.{self::C::_#C#x}.==(null) ?{core::int} this.{self::C::_#C#x} = #t5 : throw new _in::LateError::fieldADI("x") : #t4{core::int};
   get y() → core::int? {
     if(!this.{self::C::_#C#y#isSet}) {
       final core::int? #t6 = 2;
       if(this.{self::C::_#C#y#isSet})
-        throw new _in::LateInitializationErrorImpl::•("Field 'y' has been assigned during initialization.");
+        throw new _in::LateError::fieldADI("y");
       this.{self::C::_#C#y} = #t6;
       this.{self::C::_#C#y#isSet} = true;
     }
diff --git a/pkg/front_end/testcases/late_lowering/override_getter_setter.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/override_getter_setter.dart.strong.transformed.expect
index 6466db6..270a287 100644
--- a/pkg/front_end/testcases/late_lowering/override_getter_setter.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/override_getter_setter.dart.strong.transformed.expect
@@ -11,17 +11,17 @@
     : super core::Object::•()
     ;
   get x() → core::int
-    return let final core::int? #t1 = this.{self::A::_#A#x} in #t1.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'x' has not been initialized.") : #t1{core::int};
+    return let final core::int? #t1 = this.{self::A::_#A#x} in #t1.==(null) ?{core::int} throw new _in::LateError::fieldNI("x") : #t1{core::int};
   set x(core::int #t2) → void
     if(this.{self::A::_#A#x}.==(null))
       this.{self::A::_#A#x} = #t2;
     else
-      throw new _in::LateInitializationErrorImpl::•("Field 'x' has already been initialized.");
+      throw new _in::LateError::fieldAI("x");
   get y() → core::int?
-    return this.{self::A::_#A#y#isSet} ?{core::int?} this.{self::A::_#A#y} : throw new _in::LateInitializationErrorImpl::•("Field 'y' has not been initialized.");
+    return this.{self::A::_#A#y#isSet} ?{core::int?} this.{self::A::_#A#y} : throw new _in::LateError::fieldNI("y");
   set y(core::int? #t3) → void
     if(this.{self::A::_#A#y#isSet})
-      throw new _in::LateInitializationErrorImpl::•("Field 'y' has already been initialized.");
+      throw new _in::LateError::fieldAI("y");
     else {
       this.{self::A::_#A#y#isSet} = true;
       this.{self::A::_#A#y} = #t3;
@@ -44,12 +44,12 @@
     : super self::A::•()
     ;
   get x() → core::int
-    return let final core::int? #t4 = this.{self::C::_#C#x} in #t4.==(null) ?{core::int} let final core::int #t5 = 2 in this.{self::C::_#C#x}.==(null) ?{core::int} this.{self::C::_#C#x} = #t5 : throw new _in::LateInitializationErrorImpl::•("Field 'x' has been assigned during initialization.") : #t4{core::int};
+    return let final core::int? #t4 = this.{self::C::_#C#x} in #t4.==(null) ?{core::int} let final core::int #t5 = 2 in this.{self::C::_#C#x}.==(null) ?{core::int} this.{self::C::_#C#x} = #t5 : throw new _in::LateError::fieldADI("x") : #t4{core::int};
   get y() → core::int? {
     if(!this.{self::C::_#C#y#isSet}) {
       final core::int? #t6 = 2;
       if(this.{self::C::_#C#y#isSet})
-        throw new _in::LateInitializationErrorImpl::•("Field 'y' has been assigned during initialization.");
+        throw new _in::LateError::fieldADI("y");
       this.{self::C::_#C#y} = #t6;
       this.{self::C::_#C#y#isSet} = true;
     }
diff --git a/pkg/front_end/testcases/late_lowering/override_getter_setter.dart.weak.expect b/pkg/front_end/testcases/late_lowering/override_getter_setter.dart.weak.expect
index e51321c..ed7604c 100644
--- a/pkg/front_end/testcases/late_lowering/override_getter_setter.dart.weak.expect
+++ b/pkg/front_end/testcases/late_lowering/override_getter_setter.dart.weak.expect
@@ -12,19 +12,19 @@
     : super core::Object::•()
     ;
   get x() → core::int
-    return this.{self::A::_#A#x#isSet} ?{core::int} let final core::int? #t1 = this.{self::A::_#A#x} in #t1{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'x' has not been initialized.");
+    return this.{self::A::_#A#x#isSet} ?{core::int} let final core::int? #t1 = this.{self::A::_#A#x} in #t1{core::int} : throw new _in::LateError::fieldNI("x");
   set x(core::int #t2) → void
     if(this.{self::A::_#A#x#isSet})
-      throw new _in::LateInitializationErrorImpl::•("Field 'x' has already been initialized.");
+      throw new _in::LateError::fieldAI("x");
     else {
       this.{self::A::_#A#x#isSet} = true;
       this.{self::A::_#A#x} = #t2;
     }
   get y() → core::int?
-    return this.{self::A::_#A#y#isSet} ?{core::int?} this.{self::A::_#A#y} : throw new _in::LateInitializationErrorImpl::•("Field 'y' has not been initialized.");
+    return this.{self::A::_#A#y#isSet} ?{core::int?} this.{self::A::_#A#y} : throw new _in::LateError::fieldNI("y");
   set y(core::int? #t3) → void
     if(this.{self::A::_#A#y#isSet})
-      throw new _in::LateInitializationErrorImpl::•("Field 'y' has already been initialized.");
+      throw new _in::LateError::fieldAI("y");
     else {
       this.{self::A::_#A#y#isSet} = true;
       this.{self::A::_#A#y} = #t3;
@@ -51,7 +51,7 @@
     if(!this.{self::C::_#C#x#isSet}) {
       final core::int #t4 = 2;
       if(this.{self::C::_#C#x#isSet})
-        throw new _in::LateInitializationErrorImpl::•("Field 'x' has been assigned during initialization.");
+        throw new _in::LateError::fieldADI("x");
       this.{self::C::_#C#x} = #t4;
       this.{self::C::_#C#x#isSet} = true;
     }
@@ -61,7 +61,7 @@
     if(!this.{self::C::_#C#y#isSet}) {
       final core::int? #t6 = 2;
       if(this.{self::C::_#C#y#isSet})
-        throw new _in::LateInitializationErrorImpl::•("Field 'y' has been assigned during initialization.");
+        throw new _in::LateError::fieldADI("y");
       this.{self::C::_#C#y} = #t6;
       this.{self::C::_#C#y#isSet} = true;
     }
diff --git a/pkg/front_end/testcases/late_lowering/override_getter_setter.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/override_getter_setter.dart.weak.transformed.expect
index e51321c..ed7604c 100644
--- a/pkg/front_end/testcases/late_lowering/override_getter_setter.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/override_getter_setter.dart.weak.transformed.expect
@@ -12,19 +12,19 @@
     : super core::Object::•()
     ;
   get x() → core::int
-    return this.{self::A::_#A#x#isSet} ?{core::int} let final core::int? #t1 = this.{self::A::_#A#x} in #t1{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'x' has not been initialized.");
+    return this.{self::A::_#A#x#isSet} ?{core::int} let final core::int? #t1 = this.{self::A::_#A#x} in #t1{core::int} : throw new _in::LateError::fieldNI("x");
   set x(core::int #t2) → void
     if(this.{self::A::_#A#x#isSet})
-      throw new _in::LateInitializationErrorImpl::•("Field 'x' has already been initialized.");
+      throw new _in::LateError::fieldAI("x");
     else {
       this.{self::A::_#A#x#isSet} = true;
       this.{self::A::_#A#x} = #t2;
     }
   get y() → core::int?
-    return this.{self::A::_#A#y#isSet} ?{core::int?} this.{self::A::_#A#y} : throw new _in::LateInitializationErrorImpl::•("Field 'y' has not been initialized.");
+    return this.{self::A::_#A#y#isSet} ?{core::int?} this.{self::A::_#A#y} : throw new _in::LateError::fieldNI("y");
   set y(core::int? #t3) → void
     if(this.{self::A::_#A#y#isSet})
-      throw new _in::LateInitializationErrorImpl::•("Field 'y' has already been initialized.");
+      throw new _in::LateError::fieldAI("y");
     else {
       this.{self::A::_#A#y#isSet} = true;
       this.{self::A::_#A#y} = #t3;
@@ -51,7 +51,7 @@
     if(!this.{self::C::_#C#x#isSet}) {
       final core::int #t4 = 2;
       if(this.{self::C::_#C#x#isSet})
-        throw new _in::LateInitializationErrorImpl::•("Field 'x' has been assigned during initialization.");
+        throw new _in::LateError::fieldADI("x");
       this.{self::C::_#C#x} = #t4;
       this.{self::C::_#C#x#isSet} = true;
     }
@@ -61,7 +61,7 @@
     if(!this.{self::C::_#C#y#isSet}) {
       final core::int? #t6 = 2;
       if(this.{self::C::_#C#y#isSet})
-        throw new _in::LateInitializationErrorImpl::•("Field 'y' has been assigned during initialization.");
+        throw new _in::LateError::fieldADI("y");
       this.{self::C::_#C#y} = #t6;
       this.{self::C::_#C#y#isSet} = true;
     }
diff --git a/pkg/front_end/testcases/late_lowering/uninitialized_non_nullable_late_fields.dart.strong.expect b/pkg/front_end/testcases/late_lowering/uninitialized_non_nullable_late_fields.dart.strong.expect
index 2829fae..8297049 100644
--- a/pkg/front_end/testcases/late_lowering/uninitialized_non_nullable_late_fields.dart.strong.expect
+++ b/pkg/front_end/testcases/late_lowering/uninitialized_non_nullable_late_fields.dart.strong.expect
@@ -12,7 +12,7 @@
     : super core::Object::•()
     ;
   get x() → core::int
-    return let final core::int? #t1 = this.{self::A::_#A#x} in #t1.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'x' has not been initialized.") : #t1{core::int};
+    return let final core::int? #t1 = this.{self::A::_#A#x} in #t1.==(null) ?{core::int} throw new _in::LateError::fieldNI("x") : #t1{core::int};
   set x(core::int #t2) → void
     this.{self::A::_#A#x} = #t2;
 }
diff --git a/pkg/front_end/testcases/late_lowering/uninitialized_non_nullable_late_fields.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/uninitialized_non_nullable_late_fields.dart.strong.transformed.expect
index 2829fae..8297049 100644
--- a/pkg/front_end/testcases/late_lowering/uninitialized_non_nullable_late_fields.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/uninitialized_non_nullable_late_fields.dart.strong.transformed.expect
@@ -12,7 +12,7 @@
     : super core::Object::•()
     ;
   get x() → core::int
-    return let final core::int? #t1 = this.{self::A::_#A#x} in #t1.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'x' has not been initialized.") : #t1{core::int};
+    return let final core::int? #t1 = this.{self::A::_#A#x} in #t1.==(null) ?{core::int} throw new _in::LateError::fieldNI("x") : #t1{core::int};
   set x(core::int #t2) → void
     this.{self::A::_#A#x} = #t2;
 }
diff --git a/pkg/front_end/testcases/late_lowering/uninitialized_non_nullable_late_fields.dart.weak.expect b/pkg/front_end/testcases/late_lowering/uninitialized_non_nullable_late_fields.dart.weak.expect
index 327729a..1f6e81c 100644
--- a/pkg/front_end/testcases/late_lowering/uninitialized_non_nullable_late_fields.dart.weak.expect
+++ b/pkg/front_end/testcases/late_lowering/uninitialized_non_nullable_late_fields.dart.weak.expect
@@ -13,7 +13,7 @@
     : super core::Object::•()
     ;
   get x() → core::int
-    return this.{self::A::_#A#x#isSet} ?{core::int} let final core::int? #t1 = this.{self::A::_#A#x} in #t1{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'x' has not been initialized.");
+    return this.{self::A::_#A#x#isSet} ?{core::int} let final core::int? #t1 = this.{self::A::_#A#x} in #t1{core::int} : throw new _in::LateError::fieldNI("x");
   set x(core::int #t2) → void {
     this.{self::A::_#A#x#isSet} = true;
     this.{self::A::_#A#x} = #t2;
diff --git a/pkg/front_end/testcases/late_lowering/uninitialized_non_nullable_late_fields.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/uninitialized_non_nullable_late_fields.dart.weak.transformed.expect
index 327729a..1f6e81c 100644
--- a/pkg/front_end/testcases/late_lowering/uninitialized_non_nullable_late_fields.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/uninitialized_non_nullable_late_fields.dart.weak.transformed.expect
@@ -13,7 +13,7 @@
     : super core::Object::•()
     ;
   get x() → core::int
-    return this.{self::A::_#A#x#isSet} ?{core::int} let final core::int? #t1 = this.{self::A::_#A#x} in #t1{core::int} : throw new _in::LateInitializationErrorImpl::•("Field 'x' has not been initialized.");
+    return this.{self::A::_#A#x#isSet} ?{core::int} let final core::int? #t1 = this.{self::A::_#A#x} in #t1{core::int} : throw new _in::LateError::fieldNI("x");
   set x(core::int #t2) → void {
     this.{self::A::_#A#x#isSet} = true;
     this.{self::A::_#A#x} = #t2;
diff --git a/pkg/front_end/testcases/late_lowering_sentinel/late_fields.dart.strong.expect b/pkg/front_end/testcases/late_lowering_sentinel/late_fields.dart.strong.expect
index 2bd9072..5b254e4 100644
--- a/pkg/front_end/testcases/late_lowering_sentinel/late_fields.dart.strong.expect
+++ b/pkg/front_end/testcases/late_lowering_sentinel/late_fields.dart.strong.expect
@@ -12,11 +12,11 @@
 static field core::int? _#nullableFinalTopLevelFieldWithInitializer = _in::createSentinel<core::int?>();
 static field core::int? _#nonNullableFinalTopLevelFieldWithInitializer = null;
 static get nullableTopLevelField() → core::int?
-  return let final core::int? #t1 = self::_#nullableTopLevelField in _in::isSentinel(#t1) ?{core::int?} throw new _in::LateInitializationErrorImpl::•("Field 'nullableTopLevelField' has not been initialized.") : #t1{core::int?};
+  return let final core::int? #t1 = self::_#nullableTopLevelField in _in::isSentinel(#t1) ?{core::int?} throw new _in::LateError::fieldNI("nullableTopLevelField") : #t1{core::int?};
 static set nullableTopLevelField(core::int? #t2) → void
   self::_#nullableTopLevelField = #t2;
 static get nonNullableTopLevelField() → core::int
-  return let final core::int? #t3 = self::_#nonNullableTopLevelField in #t3.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'nonNullableTopLevelField' has not been initialized.") : #t3{core::int};
+  return let final core::int? #t3 = self::_#nonNullableTopLevelField in #t3.==(null) ?{core::int} throw new _in::LateError::fieldNI("nonNullableTopLevelField") : #t3{core::int};
 static set nonNullableTopLevelField(core::int #t4) → void
   self::_#nonNullableTopLevelField = #t4;
 static get nullableTopLevelFieldWithInitializer() → core::int?
@@ -28,21 +28,21 @@
 static set nonNullableTopLevelFieldWithInitializer(core::int #t8) → void
   self::_#nonNullableTopLevelFieldWithInitializer = #t8;
 static get nullableFinalTopLevelField() → core::int?
-  return let final core::int? #t9 = self::_#nullableFinalTopLevelField in _in::isSentinel(#t9) ?{core::int?} throw new _in::LateInitializationErrorImpl::•("Field 'nullableFinalTopLevelField' has not been initialized.") : #t9{core::int?};
+  return let final core::int? #t9 = self::_#nullableFinalTopLevelField in _in::isSentinel(#t9) ?{core::int?} throw new _in::LateError::fieldNI("nullableFinalTopLevelField") : #t9{core::int?};
 static set nullableFinalTopLevelField(core::int? #t10) → void
   if(_in::isSentinel(self::_#nullableFinalTopLevelField))
     self::_#nullableFinalTopLevelField = #t10;
   else
-    throw new _in::LateInitializationErrorImpl::•("Field 'nullableFinalTopLevelField' has already been initialized.");
+    throw new _in::LateError::fieldAI("nullableFinalTopLevelField");
 static get nonNullableFinalTopLevelField() → core::int
-  return let final core::int? #t11 = self::_#nonNullableFinalTopLevelField in #t11.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'nonNullableFinalTopLevelField' has not been initialized.") : #t11{core::int};
+  return let final core::int? #t11 = self::_#nonNullableFinalTopLevelField in #t11.==(null) ?{core::int} throw new _in::LateError::fieldNI("nonNullableFinalTopLevelField") : #t11{core::int};
 static set nonNullableFinalTopLevelField(core::int #t12) → void
   if(self::_#nonNullableFinalTopLevelField.==(null))
     self::_#nonNullableFinalTopLevelField = #t12;
   else
-    throw new _in::LateInitializationErrorImpl::•("Field 'nonNullableFinalTopLevelField' has already been initialized.");
+    throw new _in::LateError::fieldAI("nonNullableFinalTopLevelField");
 static get nullableFinalTopLevelFieldWithInitializer() → core::int?
-  return let final core::int? #t13 = self::_#nullableFinalTopLevelFieldWithInitializer in _in::isSentinel(#t13) ?{core::int?} let final core::int? #t14 = null in _in::isSentinel(self::_#nullableFinalTopLevelFieldWithInitializer) ?{core::int?} self::_#nullableFinalTopLevelFieldWithInitializer = #t14 : throw new _in::LateInitializationErrorImpl::•("Field 'nullableFinalTopLevelFieldWithInitializer' has been assigned during initialization.") : #t13;
+  return let final core::int? #t13 = self::_#nullableFinalTopLevelFieldWithInitializer in _in::isSentinel(#t13) ?{core::int?} let final core::int? #t14 = null in _in::isSentinel(self::_#nullableFinalTopLevelFieldWithInitializer) ?{core::int?} self::_#nullableFinalTopLevelFieldWithInitializer = #t14 : throw new _in::LateError::fieldADI("nullableFinalTopLevelFieldWithInitializer") : #t13;
 static get nonNullableFinalTopLevelFieldWithInitializer() → core::int
-  return let final core::int? #t15 = self::_#nonNullableFinalTopLevelFieldWithInitializer in #t15.==(null) ?{core::int} let final core::int #t16 = 0 in self::_#nonNullableFinalTopLevelFieldWithInitializer.==(null) ?{core::int} self::_#nonNullableFinalTopLevelFieldWithInitializer = #t16 : throw new _in::LateInitializationErrorImpl::•("Field 'nonNullableFinalTopLevelFieldWithInitializer' has been assigned during initialization.") : #t15{core::int};
+  return let final core::int? #t15 = self::_#nonNullableFinalTopLevelFieldWithInitializer in #t15.==(null) ?{core::int} let final core::int #t16 = 0 in self::_#nonNullableFinalTopLevelFieldWithInitializer.==(null) ?{core::int} self::_#nonNullableFinalTopLevelFieldWithInitializer = #t16 : throw new _in::LateError::fieldADI("nonNullableFinalTopLevelFieldWithInitializer") : #t15{core::int};
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/late_lowering_sentinel/late_fields.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering_sentinel/late_fields.dart.strong.transformed.expect
index 6d153d9..0a63f7d 100644
--- a/pkg/front_end/testcases/late_lowering_sentinel/late_fields.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering_sentinel/late_fields.dart.strong.transformed.expect
@@ -12,11 +12,11 @@
 static field core::int? _#nullableFinalTopLevelFieldWithInitializer = _in::createSentinel<core::int?>();
 static field core::int? _#nonNullableFinalTopLevelFieldWithInitializer = null;
 static get nullableTopLevelField() → core::int?
-  return let final core::int? #t1 = self::_#nullableTopLevelField in _in::isSentinel(#t1) ?{core::int?} throw new _in::LateInitializationErrorImpl::•("Field 'nullableTopLevelField' has not been initialized.") : #t1{core::int?};
+  return let final core::int? #t1 = self::_#nullableTopLevelField in _in::isSentinel(#t1) ?{core::int?} throw new _in::LateError::fieldNI("nullableTopLevelField") : #t1{core::int?};
 static set nullableTopLevelField(core::int? #t2) → void
   self::_#nullableTopLevelField = #t2;
 static get nonNullableTopLevelField() → core::int
-  return let final core::int? #t3 = self::_#nonNullableTopLevelField in #t3.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'nonNullableTopLevelField' has not been initialized.") : #t3{core::int};
+  return let final core::int? #t3 = self::_#nonNullableTopLevelField in #t3.==(null) ?{core::int} throw new _in::LateError::fieldNI("nonNullableTopLevelField") : #t3{core::int};
 static set nonNullableTopLevelField(core::int #t4) → void
   self::_#nonNullableTopLevelField = #t4;
 static get nullableTopLevelFieldWithInitializer() → core::int?
@@ -28,23 +28,23 @@
 static set nonNullableTopLevelFieldWithInitializer(core::int #t8) → void
   self::_#nonNullableTopLevelFieldWithInitializer = #t8;
 static get nullableFinalTopLevelField() → core::int?
-  return let final core::int? #t9 = self::_#nullableFinalTopLevelField in _in::isSentinel(#t9) ?{core::int?} throw new _in::LateInitializationErrorImpl::•("Field 'nullableFinalTopLevelField' has not been initialized.") : #t9{core::int?};
+  return let final core::int? #t9 = self::_#nullableFinalTopLevelField in _in::isSentinel(#t9) ?{core::int?} throw new _in::LateError::fieldNI("nullableFinalTopLevelField") : #t9{core::int?};
 static set nullableFinalTopLevelField(core::int? #t10) → void
   if(_in::isSentinel(self::_#nullableFinalTopLevelField))
     self::_#nullableFinalTopLevelField = #t10;
   else
-    throw new _in::LateInitializationErrorImpl::•("Field 'nullableFinalTopLevelField' has already been initialized.");
+    throw new _in::LateError::fieldAI("nullableFinalTopLevelField");
 static get nonNullableFinalTopLevelField() → core::int
-  return let final core::int? #t11 = self::_#nonNullableFinalTopLevelField in #t11.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'nonNullableFinalTopLevelField' has not been initialized.") : #t11{core::int};
+  return let final core::int? #t11 = self::_#nonNullableFinalTopLevelField in #t11.==(null) ?{core::int} throw new _in::LateError::fieldNI("nonNullableFinalTopLevelField") : #t11{core::int};
 static set nonNullableFinalTopLevelField(core::int #t12) → void
   if(self::_#nonNullableFinalTopLevelField.==(null))
     self::_#nonNullableFinalTopLevelField = #t12;
   else
-    throw new _in::LateInitializationErrorImpl::•("Field 'nonNullableFinalTopLevelField' has already been initialized.");
+    throw new _in::LateError::fieldAI("nonNullableFinalTopLevelField");
 static get nullableFinalTopLevelFieldWithInitializer() → core::int?
-  return let final core::int? #t13 = self::_#nullableFinalTopLevelFieldWithInitializer in _in::isSentinel(#t13) ?{core::int?} let final core::int? #t14 = null in _in::isSentinel(self::_#nullableFinalTopLevelFieldWithInitializer) ?{core::int?} self::_#nullableFinalTopLevelFieldWithInitializer = #t14 : throw new _in::LateInitializationErrorImpl::•("Field 'nullableFinalTopLevelFieldWithInitializer' has been assigned during initialization.") : #t13;
+  return let final core::int? #t13 = self::_#nullableFinalTopLevelFieldWithInitializer in _in::isSentinel(#t13) ?{core::int?} let final core::int? #t14 = null in _in::isSentinel(self::_#nullableFinalTopLevelFieldWithInitializer) ?{core::int?} self::_#nullableFinalTopLevelFieldWithInitializer = #t14 : throw new _in::LateError::fieldADI("nullableFinalTopLevelFieldWithInitializer") : #t13;
 static get nonNullableFinalTopLevelFieldWithInitializer() → core::int
-  return let final core::int? #t15 = self::_#nonNullableFinalTopLevelFieldWithInitializer in #t15.==(null) ?{core::int} let final core::int #t16 = 0 in self::_#nonNullableFinalTopLevelFieldWithInitializer.==(null) ?{core::int} self::_#nonNullableFinalTopLevelFieldWithInitializer = #t16 : throw new _in::LateInitializationErrorImpl::•("Field 'nonNullableFinalTopLevelFieldWithInitializer' has been assigned during initialization.") : #t15{core::int};
+  return let final core::int? #t15 = self::_#nonNullableFinalTopLevelFieldWithInitializer in #t15.==(null) ?{core::int} let final core::int #t16 = 0 in self::_#nonNullableFinalTopLevelFieldWithInitializer.==(null) ?{core::int} self::_#nonNullableFinalTopLevelFieldWithInitializer = #t16 : throw new _in::LateError::fieldADI("nonNullableFinalTopLevelFieldWithInitializer") : #t15{core::int};
 static method main() → dynamic {}
 
 
diff --git a/pkg/front_end/testcases/late_lowering_sentinel/late_fields.dart.weak.expect b/pkg/front_end/testcases/late_lowering_sentinel/late_fields.dart.weak.expect
index 2bd9072..5b254e4 100644
--- a/pkg/front_end/testcases/late_lowering_sentinel/late_fields.dart.weak.expect
+++ b/pkg/front_end/testcases/late_lowering_sentinel/late_fields.dart.weak.expect
@@ -12,11 +12,11 @@
 static field core::int? _#nullableFinalTopLevelFieldWithInitializer = _in::createSentinel<core::int?>();
 static field core::int? _#nonNullableFinalTopLevelFieldWithInitializer = null;
 static get nullableTopLevelField() → core::int?
-  return let final core::int? #t1 = self::_#nullableTopLevelField in _in::isSentinel(#t1) ?{core::int?} throw new _in::LateInitializationErrorImpl::•("Field 'nullableTopLevelField' has not been initialized.") : #t1{core::int?};
+  return let final core::int? #t1 = self::_#nullableTopLevelField in _in::isSentinel(#t1) ?{core::int?} throw new _in::LateError::fieldNI("nullableTopLevelField") : #t1{core::int?};
 static set nullableTopLevelField(core::int? #t2) → void
   self::_#nullableTopLevelField = #t2;
 static get nonNullableTopLevelField() → core::int
-  return let final core::int? #t3 = self::_#nonNullableTopLevelField in #t3.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'nonNullableTopLevelField' has not been initialized.") : #t3{core::int};
+  return let final core::int? #t3 = self::_#nonNullableTopLevelField in #t3.==(null) ?{core::int} throw new _in::LateError::fieldNI("nonNullableTopLevelField") : #t3{core::int};
 static set nonNullableTopLevelField(core::int #t4) → void
   self::_#nonNullableTopLevelField = #t4;
 static get nullableTopLevelFieldWithInitializer() → core::int?
@@ -28,21 +28,21 @@
 static set nonNullableTopLevelFieldWithInitializer(core::int #t8) → void
   self::_#nonNullableTopLevelFieldWithInitializer = #t8;
 static get nullableFinalTopLevelField() → core::int?
-  return let final core::int? #t9 = self::_#nullableFinalTopLevelField in _in::isSentinel(#t9) ?{core::int?} throw new _in::LateInitializationErrorImpl::•("Field 'nullableFinalTopLevelField' has not been initialized.") : #t9{core::int?};
+  return let final core::int? #t9 = self::_#nullableFinalTopLevelField in _in::isSentinel(#t9) ?{core::int?} throw new _in::LateError::fieldNI("nullableFinalTopLevelField") : #t9{core::int?};
 static set nullableFinalTopLevelField(core::int? #t10) → void
   if(_in::isSentinel(self::_#nullableFinalTopLevelField))
     self::_#nullableFinalTopLevelField = #t10;
   else
-    throw new _in::LateInitializationErrorImpl::•("Field 'nullableFinalTopLevelField' has already been initialized.");
+    throw new _in::LateError::fieldAI("nullableFinalTopLevelField");
 static get nonNullableFinalTopLevelField() → core::int
-  return let final core::int? #t11 = self::_#nonNullableFinalTopLevelField in #t11.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'nonNullableFinalTopLevelField' has not been initialized.") : #t11{core::int};
+  return let final core::int? #t11 = self::_#nonNullableFinalTopLevelField in #t11.==(null) ?{core::int} throw new _in::LateError::fieldNI("nonNullableFinalTopLevelField") : #t11{core::int};
 static set nonNullableFinalTopLevelField(core::int #t12) → void
   if(self::_#nonNullableFinalTopLevelField.==(null))
     self::_#nonNullableFinalTopLevelField = #t12;
   else
-    throw new _in::LateInitializationErrorImpl::•("Field 'nonNullableFinalTopLevelField' has already been initialized.");
+    throw new _in::LateError::fieldAI("nonNullableFinalTopLevelField");
 static get nullableFinalTopLevelFieldWithInitializer() → core::int?
-  return let final core::int? #t13 = self::_#nullableFinalTopLevelFieldWithInitializer in _in::isSentinel(#t13) ?{core::int?} let final core::int? #t14 = null in _in::isSentinel(self::_#nullableFinalTopLevelFieldWithInitializer) ?{core::int?} self::_#nullableFinalTopLevelFieldWithInitializer = #t14 : throw new _in::LateInitializationErrorImpl::•("Field 'nullableFinalTopLevelFieldWithInitializer' has been assigned during initialization.") : #t13;
+  return let final core::int? #t13 = self::_#nullableFinalTopLevelFieldWithInitializer in _in::isSentinel(#t13) ?{core::int?} let final core::int? #t14 = null in _in::isSentinel(self::_#nullableFinalTopLevelFieldWithInitializer) ?{core::int?} self::_#nullableFinalTopLevelFieldWithInitializer = #t14 : throw new _in::LateError::fieldADI("nullableFinalTopLevelFieldWithInitializer") : #t13;
 static get nonNullableFinalTopLevelFieldWithInitializer() → core::int
-  return let final core::int? #t15 = self::_#nonNullableFinalTopLevelFieldWithInitializer in #t15.==(null) ?{core::int} let final core::int #t16 = 0 in self::_#nonNullableFinalTopLevelFieldWithInitializer.==(null) ?{core::int} self::_#nonNullableFinalTopLevelFieldWithInitializer = #t16 : throw new _in::LateInitializationErrorImpl::•("Field 'nonNullableFinalTopLevelFieldWithInitializer' has been assigned during initialization.") : #t15{core::int};
+  return let final core::int? #t15 = self::_#nonNullableFinalTopLevelFieldWithInitializer in #t15.==(null) ?{core::int} let final core::int #t16 = 0 in self::_#nonNullableFinalTopLevelFieldWithInitializer.==(null) ?{core::int} self::_#nonNullableFinalTopLevelFieldWithInitializer = #t16 : throw new _in::LateError::fieldADI("nonNullableFinalTopLevelFieldWithInitializer") : #t15{core::int};
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/late_lowering_sentinel/late_fields.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering_sentinel/late_fields.dart.weak.transformed.expect
index 6d153d9..0a63f7d 100644
--- a/pkg/front_end/testcases/late_lowering_sentinel/late_fields.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering_sentinel/late_fields.dart.weak.transformed.expect
@@ -12,11 +12,11 @@
 static field core::int? _#nullableFinalTopLevelFieldWithInitializer = _in::createSentinel<core::int?>();
 static field core::int? _#nonNullableFinalTopLevelFieldWithInitializer = null;
 static get nullableTopLevelField() → core::int?
-  return let final core::int? #t1 = self::_#nullableTopLevelField in _in::isSentinel(#t1) ?{core::int?} throw new _in::LateInitializationErrorImpl::•("Field 'nullableTopLevelField' has not been initialized.") : #t1{core::int?};
+  return let final core::int? #t1 = self::_#nullableTopLevelField in _in::isSentinel(#t1) ?{core::int?} throw new _in::LateError::fieldNI("nullableTopLevelField") : #t1{core::int?};
 static set nullableTopLevelField(core::int? #t2) → void
   self::_#nullableTopLevelField = #t2;
 static get nonNullableTopLevelField() → core::int
-  return let final core::int? #t3 = self::_#nonNullableTopLevelField in #t3.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'nonNullableTopLevelField' has not been initialized.") : #t3{core::int};
+  return let final core::int? #t3 = self::_#nonNullableTopLevelField in #t3.==(null) ?{core::int} throw new _in::LateError::fieldNI("nonNullableTopLevelField") : #t3{core::int};
 static set nonNullableTopLevelField(core::int #t4) → void
   self::_#nonNullableTopLevelField = #t4;
 static get nullableTopLevelFieldWithInitializer() → core::int?
@@ -28,23 +28,23 @@
 static set nonNullableTopLevelFieldWithInitializer(core::int #t8) → void
   self::_#nonNullableTopLevelFieldWithInitializer = #t8;
 static get nullableFinalTopLevelField() → core::int?
-  return let final core::int? #t9 = self::_#nullableFinalTopLevelField in _in::isSentinel(#t9) ?{core::int?} throw new _in::LateInitializationErrorImpl::•("Field 'nullableFinalTopLevelField' has not been initialized.") : #t9{core::int?};
+  return let final core::int? #t9 = self::_#nullableFinalTopLevelField in _in::isSentinel(#t9) ?{core::int?} throw new _in::LateError::fieldNI("nullableFinalTopLevelField") : #t9{core::int?};
 static set nullableFinalTopLevelField(core::int? #t10) → void
   if(_in::isSentinel(self::_#nullableFinalTopLevelField))
     self::_#nullableFinalTopLevelField = #t10;
   else
-    throw new _in::LateInitializationErrorImpl::•("Field 'nullableFinalTopLevelField' has already been initialized.");
+    throw new _in::LateError::fieldAI("nullableFinalTopLevelField");
 static get nonNullableFinalTopLevelField() → core::int
-  return let final core::int? #t11 = self::_#nonNullableFinalTopLevelField in #t11.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Field 'nonNullableFinalTopLevelField' has not been initialized.") : #t11{core::int};
+  return let final core::int? #t11 = self::_#nonNullableFinalTopLevelField in #t11.==(null) ?{core::int} throw new _in::LateError::fieldNI("nonNullableFinalTopLevelField") : #t11{core::int};
 static set nonNullableFinalTopLevelField(core::int #t12) → void
   if(self::_#nonNullableFinalTopLevelField.==(null))
     self::_#nonNullableFinalTopLevelField = #t12;
   else
-    throw new _in::LateInitializationErrorImpl::•("Field 'nonNullableFinalTopLevelField' has already been initialized.");
+    throw new _in::LateError::fieldAI("nonNullableFinalTopLevelField");
 static get nullableFinalTopLevelFieldWithInitializer() → core::int?
-  return let final core::int? #t13 = self::_#nullableFinalTopLevelFieldWithInitializer in _in::isSentinel(#t13) ?{core::int?} let final core::int? #t14 = null in _in::isSentinel(self::_#nullableFinalTopLevelFieldWithInitializer) ?{core::int?} self::_#nullableFinalTopLevelFieldWithInitializer = #t14 : throw new _in::LateInitializationErrorImpl::•("Field 'nullableFinalTopLevelFieldWithInitializer' has been assigned during initialization.") : #t13;
+  return let final core::int? #t13 = self::_#nullableFinalTopLevelFieldWithInitializer in _in::isSentinel(#t13) ?{core::int?} let final core::int? #t14 = null in _in::isSentinel(self::_#nullableFinalTopLevelFieldWithInitializer) ?{core::int?} self::_#nullableFinalTopLevelFieldWithInitializer = #t14 : throw new _in::LateError::fieldADI("nullableFinalTopLevelFieldWithInitializer") : #t13;
 static get nonNullableFinalTopLevelFieldWithInitializer() → core::int
-  return let final core::int? #t15 = self::_#nonNullableFinalTopLevelFieldWithInitializer in #t15.==(null) ?{core::int} let final core::int #t16 = 0 in self::_#nonNullableFinalTopLevelFieldWithInitializer.==(null) ?{core::int} self::_#nonNullableFinalTopLevelFieldWithInitializer = #t16 : throw new _in::LateInitializationErrorImpl::•("Field 'nonNullableFinalTopLevelFieldWithInitializer' has been assigned during initialization.") : #t15{core::int};
+  return let final core::int? #t15 = self::_#nonNullableFinalTopLevelFieldWithInitializer in #t15.==(null) ?{core::int} let final core::int #t16 = 0 in self::_#nonNullableFinalTopLevelFieldWithInitializer.==(null) ?{core::int} self::_#nonNullableFinalTopLevelFieldWithInitializer = #t16 : throw new _in::LateError::fieldADI("nonNullableFinalTopLevelFieldWithInitializer") : #t15{core::int};
 static method main() → dynamic {}
 
 
diff --git a/pkg/front_end/testcases/late_lowering_sentinel/late_locals.dart.strong.expect b/pkg/front_end/testcases/late_lowering_sentinel/late_locals.dart.strong.expect
index aace5e6..d8369ba 100644
--- a/pkg/front_end/testcases/late_lowering_sentinel/late_locals.dart.strong.expect
+++ b/pkg/front_end/testcases/late_lowering_sentinel/late_locals.dart.strong.expect
@@ -6,12 +6,12 @@
 static method test() → dynamic {
   core::int? nullableTopLevelLocal = _in::createSentinel<core::int?>();
   function #nullableTopLevelLocal#get() → core::int?
-    return let final core::int? #t1 = nullableTopLevelLocal in _in::isSentinel(#t1) ?{core::int?} throw new _in::LateInitializationErrorImpl::•("Local 'nullableTopLevelLocal' has not been initialized.") : #t1{core::int?};
+    return let final core::int? #t1 = nullableTopLevelLocal in _in::isSentinel(#t1) ?{core::int?} throw new _in::LateError::localNI("nullableTopLevelLocal") : #t1{core::int?};
   function #nullableTopLevelLocal#set(core::int? #t2) → dynamic
     return nullableTopLevelLocal = #t2;
   core::int? nonNullableTopLevelLocal;
   function #nonNullableTopLevelLocal#get() → core::int
-    return let final core::int? #t3 = nonNullableTopLevelLocal in #t3.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'nonNullableTopLevelLocal' has not been initialized.") : #t3{core::int};
+    return let final core::int? #t3 = nonNullableTopLevelLocal in #t3.==(null) ?{core::int} throw new _in::LateError::localNI("nonNullableTopLevelLocal") : #t3{core::int};
   function #nonNullableTopLevelLocal#set(core::int #t4) → dynamic
     return nonNullableTopLevelLocal = #t4;
   core::int? nullableTopLevelLocalWithInitializer = _in::createSentinel<core::int?>();
@@ -26,20 +26,20 @@
     return nonNullableTopLevelLocalWithInitializer = #t8;
   final core::int? nullableFinalTopLevelLocal = _in::createSentinel<core::int?>();
   function #nullableFinalTopLevelLocal#get() → core::int?
-    return let final core::int? #t9 = nullableFinalTopLevelLocal in _in::isSentinel(#t9) ?{core::int?} throw new _in::LateInitializationErrorImpl::•("Local 'nullableFinalTopLevelLocal' has not been initialized.") : #t9{core::int?};
+    return let final core::int? #t9 = nullableFinalTopLevelLocal in _in::isSentinel(#t9) ?{core::int?} throw new _in::LateError::localNI("nullableFinalTopLevelLocal") : #t9{core::int?};
   function #nullableFinalTopLevelLocal#set(core::int? #t10) → dynamic
     if(_in::isSentinel(nullableFinalTopLevelLocal))
       return nullableFinalTopLevelLocal = #t10;
     else
-      throw new _in::LateInitializationErrorImpl::•("Local 'nullableFinalTopLevelLocal' has already been initialized.");
+      throw new _in::LateError::localAI("nullableFinalTopLevelLocal");
   final core::int? nonNullableFinalTopLevelLocal;
   function #nonNullableFinalTopLevelLocal#get() → core::int
-    return let final core::int? #t11 = nonNullableFinalTopLevelLocal in #t11.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'nonNullableFinalTopLevelLocal' has not been initialized.") : #t11{core::int};
+    return let final core::int? #t11 = nonNullableFinalTopLevelLocal in #t11.==(null) ?{core::int} throw new _in::LateError::localNI("nonNullableFinalTopLevelLocal") : #t11{core::int};
   function #nonNullableFinalTopLevelLocal#set(core::int #t12) → dynamic
     if(nonNullableFinalTopLevelLocal.==(null))
       return nonNullableFinalTopLevelLocal = #t12;
     else
-      throw new _in::LateInitializationErrorImpl::•("Local 'nonNullableFinalTopLevelLocal' has already been initialized.");
+      throw new _in::LateError::localAI("nonNullableFinalTopLevelLocal");
   final core::int? nullableFinalTopLevelLocalWithInitializer = _in::createSentinel<core::int?>();
   function #nullableFinalTopLevelLocalWithInitializer#get() → core::int?
     return let final core::int? #t13 = nullableFinalTopLevelLocalWithInitializer in _in::isSentinel(#t13) ?{core::int?} nullableFinalTopLevelLocalWithInitializer = null : #t13{core::int?};
diff --git a/pkg/front_end/testcases/late_lowering_sentinel/late_locals.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering_sentinel/late_locals.dart.strong.transformed.expect
index aace5e6..d8369ba 100644
--- a/pkg/front_end/testcases/late_lowering_sentinel/late_locals.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering_sentinel/late_locals.dart.strong.transformed.expect
@@ -6,12 +6,12 @@
 static method test() → dynamic {
   core::int? nullableTopLevelLocal = _in::createSentinel<core::int?>();
   function #nullableTopLevelLocal#get() → core::int?
-    return let final core::int? #t1 = nullableTopLevelLocal in _in::isSentinel(#t1) ?{core::int?} throw new _in::LateInitializationErrorImpl::•("Local 'nullableTopLevelLocal' has not been initialized.") : #t1{core::int?};
+    return let final core::int? #t1 = nullableTopLevelLocal in _in::isSentinel(#t1) ?{core::int?} throw new _in::LateError::localNI("nullableTopLevelLocal") : #t1{core::int?};
   function #nullableTopLevelLocal#set(core::int? #t2) → dynamic
     return nullableTopLevelLocal = #t2;
   core::int? nonNullableTopLevelLocal;
   function #nonNullableTopLevelLocal#get() → core::int
-    return let final core::int? #t3 = nonNullableTopLevelLocal in #t3.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'nonNullableTopLevelLocal' has not been initialized.") : #t3{core::int};
+    return let final core::int? #t3 = nonNullableTopLevelLocal in #t3.==(null) ?{core::int} throw new _in::LateError::localNI("nonNullableTopLevelLocal") : #t3{core::int};
   function #nonNullableTopLevelLocal#set(core::int #t4) → dynamic
     return nonNullableTopLevelLocal = #t4;
   core::int? nullableTopLevelLocalWithInitializer = _in::createSentinel<core::int?>();
@@ -26,20 +26,20 @@
     return nonNullableTopLevelLocalWithInitializer = #t8;
   final core::int? nullableFinalTopLevelLocal = _in::createSentinel<core::int?>();
   function #nullableFinalTopLevelLocal#get() → core::int?
-    return let final core::int? #t9 = nullableFinalTopLevelLocal in _in::isSentinel(#t9) ?{core::int?} throw new _in::LateInitializationErrorImpl::•("Local 'nullableFinalTopLevelLocal' has not been initialized.") : #t9{core::int?};
+    return let final core::int? #t9 = nullableFinalTopLevelLocal in _in::isSentinel(#t9) ?{core::int?} throw new _in::LateError::localNI("nullableFinalTopLevelLocal") : #t9{core::int?};
   function #nullableFinalTopLevelLocal#set(core::int? #t10) → dynamic
     if(_in::isSentinel(nullableFinalTopLevelLocal))
       return nullableFinalTopLevelLocal = #t10;
     else
-      throw new _in::LateInitializationErrorImpl::•("Local 'nullableFinalTopLevelLocal' has already been initialized.");
+      throw new _in::LateError::localAI("nullableFinalTopLevelLocal");
   final core::int? nonNullableFinalTopLevelLocal;
   function #nonNullableFinalTopLevelLocal#get() → core::int
-    return let final core::int? #t11 = nonNullableFinalTopLevelLocal in #t11.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'nonNullableFinalTopLevelLocal' has not been initialized.") : #t11{core::int};
+    return let final core::int? #t11 = nonNullableFinalTopLevelLocal in #t11.==(null) ?{core::int} throw new _in::LateError::localNI("nonNullableFinalTopLevelLocal") : #t11{core::int};
   function #nonNullableFinalTopLevelLocal#set(core::int #t12) → dynamic
     if(nonNullableFinalTopLevelLocal.==(null))
       return nonNullableFinalTopLevelLocal = #t12;
     else
-      throw new _in::LateInitializationErrorImpl::•("Local 'nonNullableFinalTopLevelLocal' has already been initialized.");
+      throw new _in::LateError::localAI("nonNullableFinalTopLevelLocal");
   final core::int? nullableFinalTopLevelLocalWithInitializer = _in::createSentinel<core::int?>();
   function #nullableFinalTopLevelLocalWithInitializer#get() → core::int?
     return let final core::int? #t13 = nullableFinalTopLevelLocalWithInitializer in _in::isSentinel(#t13) ?{core::int?} nullableFinalTopLevelLocalWithInitializer = null : #t13{core::int?};
diff --git a/pkg/front_end/testcases/late_lowering_sentinel/late_locals.dart.weak.expect b/pkg/front_end/testcases/late_lowering_sentinel/late_locals.dart.weak.expect
index aace5e6..d8369ba 100644
--- a/pkg/front_end/testcases/late_lowering_sentinel/late_locals.dart.weak.expect
+++ b/pkg/front_end/testcases/late_lowering_sentinel/late_locals.dart.weak.expect
@@ -6,12 +6,12 @@
 static method test() → dynamic {
   core::int? nullableTopLevelLocal = _in::createSentinel<core::int?>();
   function #nullableTopLevelLocal#get() → core::int?
-    return let final core::int? #t1 = nullableTopLevelLocal in _in::isSentinel(#t1) ?{core::int?} throw new _in::LateInitializationErrorImpl::•("Local 'nullableTopLevelLocal' has not been initialized.") : #t1{core::int?};
+    return let final core::int? #t1 = nullableTopLevelLocal in _in::isSentinel(#t1) ?{core::int?} throw new _in::LateError::localNI("nullableTopLevelLocal") : #t1{core::int?};
   function #nullableTopLevelLocal#set(core::int? #t2) → dynamic
     return nullableTopLevelLocal = #t2;
   core::int? nonNullableTopLevelLocal;
   function #nonNullableTopLevelLocal#get() → core::int
-    return let final core::int? #t3 = nonNullableTopLevelLocal in #t3.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'nonNullableTopLevelLocal' has not been initialized.") : #t3{core::int};
+    return let final core::int? #t3 = nonNullableTopLevelLocal in #t3.==(null) ?{core::int} throw new _in::LateError::localNI("nonNullableTopLevelLocal") : #t3{core::int};
   function #nonNullableTopLevelLocal#set(core::int #t4) → dynamic
     return nonNullableTopLevelLocal = #t4;
   core::int? nullableTopLevelLocalWithInitializer = _in::createSentinel<core::int?>();
@@ -26,20 +26,20 @@
     return nonNullableTopLevelLocalWithInitializer = #t8;
   final core::int? nullableFinalTopLevelLocal = _in::createSentinel<core::int?>();
   function #nullableFinalTopLevelLocal#get() → core::int?
-    return let final core::int? #t9 = nullableFinalTopLevelLocal in _in::isSentinel(#t9) ?{core::int?} throw new _in::LateInitializationErrorImpl::•("Local 'nullableFinalTopLevelLocal' has not been initialized.") : #t9{core::int?};
+    return let final core::int? #t9 = nullableFinalTopLevelLocal in _in::isSentinel(#t9) ?{core::int?} throw new _in::LateError::localNI("nullableFinalTopLevelLocal") : #t9{core::int?};
   function #nullableFinalTopLevelLocal#set(core::int? #t10) → dynamic
     if(_in::isSentinel(nullableFinalTopLevelLocal))
       return nullableFinalTopLevelLocal = #t10;
     else
-      throw new _in::LateInitializationErrorImpl::•("Local 'nullableFinalTopLevelLocal' has already been initialized.");
+      throw new _in::LateError::localAI("nullableFinalTopLevelLocal");
   final core::int? nonNullableFinalTopLevelLocal;
   function #nonNullableFinalTopLevelLocal#get() → core::int
-    return let final core::int? #t11 = nonNullableFinalTopLevelLocal in #t11.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'nonNullableFinalTopLevelLocal' has not been initialized.") : #t11{core::int};
+    return let final core::int? #t11 = nonNullableFinalTopLevelLocal in #t11.==(null) ?{core::int} throw new _in::LateError::localNI("nonNullableFinalTopLevelLocal") : #t11{core::int};
   function #nonNullableFinalTopLevelLocal#set(core::int #t12) → dynamic
     if(nonNullableFinalTopLevelLocal.==(null))
       return nonNullableFinalTopLevelLocal = #t12;
     else
-      throw new _in::LateInitializationErrorImpl::•("Local 'nonNullableFinalTopLevelLocal' has already been initialized.");
+      throw new _in::LateError::localAI("nonNullableFinalTopLevelLocal");
   final core::int? nullableFinalTopLevelLocalWithInitializer = _in::createSentinel<core::int?>();
   function #nullableFinalTopLevelLocalWithInitializer#get() → core::int?
     return let final core::int? #t13 = nullableFinalTopLevelLocalWithInitializer in _in::isSentinel(#t13) ?{core::int?} nullableFinalTopLevelLocalWithInitializer = null : #t13{core::int?};
diff --git a/pkg/front_end/testcases/late_lowering_sentinel/late_locals.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering_sentinel/late_locals.dart.weak.transformed.expect
index aace5e6..d8369ba 100644
--- a/pkg/front_end/testcases/late_lowering_sentinel/late_locals.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering_sentinel/late_locals.dart.weak.transformed.expect
@@ -6,12 +6,12 @@
 static method test() → dynamic {
   core::int? nullableTopLevelLocal = _in::createSentinel<core::int?>();
   function #nullableTopLevelLocal#get() → core::int?
-    return let final core::int? #t1 = nullableTopLevelLocal in _in::isSentinel(#t1) ?{core::int?} throw new _in::LateInitializationErrorImpl::•("Local 'nullableTopLevelLocal' has not been initialized.") : #t1{core::int?};
+    return let final core::int? #t1 = nullableTopLevelLocal in _in::isSentinel(#t1) ?{core::int?} throw new _in::LateError::localNI("nullableTopLevelLocal") : #t1{core::int?};
   function #nullableTopLevelLocal#set(core::int? #t2) → dynamic
     return nullableTopLevelLocal = #t2;
   core::int? nonNullableTopLevelLocal;
   function #nonNullableTopLevelLocal#get() → core::int
-    return let final core::int? #t3 = nonNullableTopLevelLocal in #t3.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'nonNullableTopLevelLocal' has not been initialized.") : #t3{core::int};
+    return let final core::int? #t3 = nonNullableTopLevelLocal in #t3.==(null) ?{core::int} throw new _in::LateError::localNI("nonNullableTopLevelLocal") : #t3{core::int};
   function #nonNullableTopLevelLocal#set(core::int #t4) → dynamic
     return nonNullableTopLevelLocal = #t4;
   core::int? nullableTopLevelLocalWithInitializer = _in::createSentinel<core::int?>();
@@ -26,20 +26,20 @@
     return nonNullableTopLevelLocalWithInitializer = #t8;
   final core::int? nullableFinalTopLevelLocal = _in::createSentinel<core::int?>();
   function #nullableFinalTopLevelLocal#get() → core::int?
-    return let final core::int? #t9 = nullableFinalTopLevelLocal in _in::isSentinel(#t9) ?{core::int?} throw new _in::LateInitializationErrorImpl::•("Local 'nullableFinalTopLevelLocal' has not been initialized.") : #t9{core::int?};
+    return let final core::int? #t9 = nullableFinalTopLevelLocal in _in::isSentinel(#t9) ?{core::int?} throw new _in::LateError::localNI("nullableFinalTopLevelLocal") : #t9{core::int?};
   function #nullableFinalTopLevelLocal#set(core::int? #t10) → dynamic
     if(_in::isSentinel(nullableFinalTopLevelLocal))
       return nullableFinalTopLevelLocal = #t10;
     else
-      throw new _in::LateInitializationErrorImpl::•("Local 'nullableFinalTopLevelLocal' has already been initialized.");
+      throw new _in::LateError::localAI("nullableFinalTopLevelLocal");
   final core::int? nonNullableFinalTopLevelLocal;
   function #nonNullableFinalTopLevelLocal#get() → core::int
-    return let final core::int? #t11 = nonNullableFinalTopLevelLocal in #t11.==(null) ?{core::int} throw new _in::LateInitializationErrorImpl::•("Local 'nonNullableFinalTopLevelLocal' has not been initialized.") : #t11{core::int};
+    return let final core::int? #t11 = nonNullableFinalTopLevelLocal in #t11.==(null) ?{core::int} throw new _in::LateError::localNI("nonNullableFinalTopLevelLocal") : #t11{core::int};
   function #nonNullableFinalTopLevelLocal#set(core::int #t12) → dynamic
     if(nonNullableFinalTopLevelLocal.==(null))
       return nonNullableFinalTopLevelLocal = #t12;
     else
-      throw new _in::LateInitializationErrorImpl::•("Local 'nonNullableFinalTopLevelLocal' has already been initialized.");
+      throw new _in::LateError::localAI("nonNullableFinalTopLevelLocal");
   final core::int? nullableFinalTopLevelLocalWithInitializer = _in::createSentinel<core::int?>();
   function #nullableFinalTopLevelLocalWithInitializer#get() → core::int?
     return let final core::int? #t13 = nullableFinalTopLevelLocalWithInitializer in _in::isSentinel(#t13) ?{core::int?} nullableFinalTopLevelLocalWithInitializer = null : #t13{core::int?};
diff --git a/pkg/front_end/testcases/new_const_insertion/folder.options b/pkg/front_end/testcases/new_const_insertion/folder.options
new file mode 100644
index 0000000..dbc148e
--- /dev/null
+++ b/pkg/front_end/testcases/new_const_insertion/folder.options
@@ -0,0 +1 @@
+--enable-experiment=no-non-nullable
\ No newline at end of file
diff --git a/pkg/front_end/testcases/nnbd/assignability.dart.strong.expect b/pkg/front_end/testcases/nnbd/assignability.dart.strong.expect
index 9c3d453..3ca69a3 100644
--- a/pkg/front_end/testcases/nnbd/assignability.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/assignability.dart.strong.expect
@@ -2,69 +2,69 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:114:22: Error: A value of type 'Object?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:114:22: Error: A value of type 'Object?' can't be assigned to a variable of type 'Object' because 'Object?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   Object objectVar = objectNullableArg;
 //                      ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:115:15: Error: A value of type 'num?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:115:15: Error: A value of type 'num?' can't be assigned to a variable of type 'Object' because 'num?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = numNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:116:15: Error: A value of type 'int?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:116:15: Error: A value of type 'int?' can't be assigned to a variable of type 'Object' because 'int?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = intNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:117:15: Error: A value of type 'double?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:117:15: Error: A value of type 'double?' can't be assigned to a variable of type 'Object' because 'double?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = doubleNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:118:15: Error: A value of type 'Function?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:118:15: Error: A value of type 'Function?' can't be assigned to a variable of type 'Object' because 'Function?' is nullable and 'Object' isn't.
 //  - 'Function' is from 'dart:core'.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = functionNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:119:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:119:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Object' because 'void Function()?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = toVoidNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:120:15: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:120:15: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'Object' because 'Tearoffable?' is nullable and 'Object' isn't.
 //  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = tearoffableNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:121:15: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:121:15: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'Object' because 'XnonNull?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = xNonNullNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:122:15: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:122:15: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'Object' because 'XpotentiallyNull' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = xPotentiallyNullArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:123:15: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:123:15: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'Object' because 'XpotentiallyNull?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = xPotentiallyNullNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:124:15: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:124:15: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'Object' because 'YnonNull?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = yNonNullNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:125:15: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:125:15: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'Object' because 'YpotentiallyNull' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = yPotentiallyNullArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:126:15: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:126:15: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'Object' because 'YpotentiallyNull?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = yPotentiallyNullNullableArg;
 //               ^
@@ -79,15 +79,15 @@
 //   numVar = objectNullableArg;
 //            ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:130:12: Error: A value of type 'num?' can't be assigned to a variable of type 'num'.
+// pkg/front_end/testcases/nnbd/assignability.dart:130:12: Error: A value of type 'num?' can't be assigned to a variable of type 'num' because 'num?' is nullable and 'num' isn't.
 //   numVar = numNullableArg;
 //            ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:131:12: Error: A value of type 'int?' can't be assigned to a variable of type 'num'.
+// pkg/front_end/testcases/nnbd/assignability.dart:131:12: Error: A value of type 'int?' can't be assigned to a variable of type 'num' because 'int?' is nullable and 'num' isn't.
 //   numVar = intNullableArg;
 //            ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:132:12: Error: A value of type 'double?' can't be assigned to a variable of type 'num'.
+// pkg/front_end/testcases/nnbd/assignability.dart:132:12: Error: A value of type 'double?' can't be assigned to a variable of type 'num' because 'double?' is nullable and 'num' isn't.
 //   numVar = doubleNullableArg;
 //            ^
 //
@@ -169,7 +169,7 @@
 //   intVar = numNullableArg;
 //            ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:152:12: Error: A value of type 'int?' can't be assigned to a variable of type 'int'.
+// pkg/front_end/testcases/nnbd/assignability.dart:152:12: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
 //   intVar = intNullableArg;
 //            ^
 //
@@ -267,7 +267,7 @@
 //   doubleVar = intNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:176:15: Error: A value of type 'double?' can't be assigned to a variable of type 'double'.
+// pkg/front_end/testcases/nnbd/assignability.dart:176:15: Error: A value of type 'double?' can't be assigned to a variable of type 'double' because 'double?' is nullable and 'double' isn't.
 //   doubleVar = doubleNullableArg;
 //               ^
 //
@@ -373,12 +373,12 @@
 //   functionVar = doubleNullableArg;
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:200:17: Error: A value of type 'Function?' can't be assigned to a variable of type 'Function'.
+// pkg/front_end/testcases/nnbd/assignability.dart:200:17: Error: A value of type 'Function?' can't be assigned to a variable of type 'Function' because 'Function?' is nullable and 'Function' isn't.
 //  - 'Function' is from 'dart:core'.
 //   functionVar = functionNullableArg;
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:201:17: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Function'.
+// pkg/front_end/testcases/nnbd/assignability.dart:201:17: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Function' because 'void Function()?' is nullable and 'Function' isn't.
 //  - 'Function' is from 'dart:core'.
 //   functionVar = toVoidNullableArg;
 //                 ^
@@ -471,7 +471,7 @@
 //   toVoidVar = functionNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:222:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'void Function()'.
+// pkg/front_end/testcases/nnbd/assignability.dart:222:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'void Function()' because 'void Function()?' is nullable and 'void Function()' isn't.
 //   toVoidVar = toVoidNullableArg;
 //               ^
 //
@@ -575,7 +575,7 @@
 //   tearoffableVar = toVoidNullableArg;
 //                    ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:245:20: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'Tearoffable'.
+// pkg/front_end/testcases/nnbd/assignability.dart:245:20: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'Tearoffable' because 'Tearoffable?' is nullable and 'Tearoffable' isn't.
 //  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
 //   tearoffableVar = tearoffableNullableArg;
 //                    ^
@@ -682,7 +682,7 @@
 //   xNonNullVar = tearoffableNullableArg;
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:269:17: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'XnonNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:269:17: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'XnonNull' because 'XnonNull?' is nullable and 'XnonNull' isn't.
 //   xNonNullVar = xNonNullNullableArg;
 //                 ^
 //
@@ -694,7 +694,7 @@
 //   xNonNullVar = xPotentiallyNullNullableArg;
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:272:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'XnonNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:272:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'XnonNull' because 'YnonNull?' is nullable and 'XnonNull' isn't.
 //   xNonNullVar = yNonNullNullableArg;
 //                 ^
 //
@@ -776,7 +776,7 @@
 //   xPotentiallyNullVar = xNonNullNullableArg;
 //                         ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:292:25: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'XpotentiallyNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:292:25: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'XpotentiallyNull' because 'XpotentiallyNull?' is nullable and 'XpotentiallyNull' isn't.
 //   xPotentiallyNullVar = xPotentiallyNullNullableArg;
 //                         ^
 //
@@ -788,7 +788,7 @@
 //   xPotentiallyNullVar = yNonNullNullableArg;
 //                         ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:295:25: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'XpotentiallyNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:295:25: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'XpotentiallyNull' because 'YpotentiallyNull?' is nullable and 'XpotentiallyNull' isn't.
 //   xPotentiallyNullVar = yPotentiallyNullNullableArg;
 //                         ^
 //
@@ -870,7 +870,7 @@
 //   yNonNullVar = xPotentiallyNullNullableArg;
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:315:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'YnonNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:315:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'YnonNull' because 'YnonNull?' is nullable and 'YnonNull' isn't.
 //   yNonNullVar = yNonNullNullableArg;
 //                 ^
 //
@@ -968,7 +968,7 @@
 //   yPotentiallyNullVar = yNonNullNullableArg;
 //                         ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:339:25: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'YpotentiallyNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:339:25: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'YpotentiallyNull' because 'YpotentiallyNull?' is nullable and 'YpotentiallyNull' isn't.
 //   yPotentiallyNullVar = yPotentiallyNullNullableArg;
 //                         ^
 //
@@ -1032,57 +1032,57 @@
   yPotentiallyNullVar = yPotentiallyNullArg;
 }
 static method error<XnonNull extends core::Object = core::Object, YnonNull extends self::error::XnonNull = core::Object, XpotentiallyNull extends core::Object? = core::Object?, YpotentiallyNull extends self::error::XpotentiallyNull% = core::Object?>(core::Object objectArg, core::Object? objectNullableArg, core::num numArg, core::num? numNullableArg, core::int intArg, core::int? intNullableArg, core::double doubleArg, core::double? doubleNullableArg, core::Function functionArg, core::Function? functionNullableArg, () → void toVoidArg, () →? void toVoidNullableArg, self::Tearoffable tearoffableArg, self::Tearoffable? tearoffableNullableArg, self::error::XnonNull xNonNullArg, self::error::XnonNull? xNonNullNullableArg, self::error::XpotentiallyNull% xPotentiallyNullArg, self::error::XpotentiallyNull? xPotentiallyNullNullableArg, self::error::YnonNull yNonNullArg, self::error::YnonNull? yNonNullNullableArg, self::error::YpotentiallyNull% yPotentiallyNullArg, self::error::YpotentiallyNull? yPotentiallyNullNullableArg) → dynamic {
-  core::Object objectVar = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:114:22: Error: A value of type 'Object?' can't be assigned to a variable of type 'Object'.
+  core::Object objectVar = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:114:22: Error: A value of type 'Object?' can't be assigned to a variable of type 'Object' because 'Object?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   Object objectVar = objectNullableArg;
                      ^" in objectNullableArg as{TypeError,ForNonNullableByDefault} core::Object;
-  objectVar = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:115:15: Error: A value of type 'num?' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:115:15: Error: A value of type 'num?' can't be assigned to a variable of type 'Object' because 'num?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   objectVar = numNullableArg;
               ^" in numNullableArg as{TypeError,ForNonNullableByDefault} core::Object;
-  objectVar = let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:116:15: Error: A value of type 'int?' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:116:15: Error: A value of type 'int?' can't be assigned to a variable of type 'Object' because 'int?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   objectVar = intNullableArg;
               ^" in intNullableArg as{TypeError,ForNonNullableByDefault} core::Object;
-  objectVar = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:117:15: Error: A value of type 'double?' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:117:15: Error: A value of type 'double?' can't be assigned to a variable of type 'Object' because 'double?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   objectVar = doubleNullableArg;
               ^" in doubleNullableArg as{TypeError,ForNonNullableByDefault} core::Object;
-  objectVar = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:118:15: Error: A value of type 'Function?' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:118:15: Error: A value of type 'Function?' can't be assigned to a variable of type 'Object' because 'Function?' is nullable and 'Object' isn't.
  - 'Function' is from 'dart:core'.
  - 'Object' is from 'dart:core'.
   objectVar = functionNullableArg;
               ^" in functionNullableArg as{TypeError,ForNonNullableByDefault} core::Object;
-  objectVar = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:119:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:119:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Object' because 'void Function()?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   objectVar = toVoidNullableArg;
               ^" in toVoidNullableArg as{TypeError,ForNonNullableByDefault} core::Object;
-  objectVar = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:120:15: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:120:15: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'Object' because 'Tearoffable?' is nullable and 'Object' isn't.
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
  - 'Object' is from 'dart:core'.
   objectVar = tearoffableNullableArg;
               ^" in tearoffableNullableArg as{TypeError,ForNonNullableByDefault} core::Object;
-  objectVar = let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:121:15: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:121:15: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'Object' because 'XnonNull?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   objectVar = xNonNullNullableArg;
               ^" in xNonNullNullableArg as{TypeError,ForNonNullableByDefault} core::Object;
-  objectVar = let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:122:15: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:122:15: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'Object' because 'XpotentiallyNull' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   objectVar = xPotentiallyNullArg;
               ^" in xPotentiallyNullArg as{TypeError,ForNonNullableByDefault} core::Object;
-  objectVar = let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:123:15: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:123:15: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'Object' because 'XpotentiallyNull?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   objectVar = xPotentiallyNullNullableArg;
               ^" in xPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} core::Object;
-  objectVar = let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:124:15: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:124:15: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'Object' because 'YnonNull?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   objectVar = yNonNullNullableArg;
               ^" in yNonNullNullableArg as{TypeError,ForNonNullableByDefault} core::Object;
-  objectVar = let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:125:15: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:125:15: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'Object' because 'YpotentiallyNull' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   objectVar = yPotentiallyNullArg;
               ^" in yPotentiallyNullArg as{TypeError,ForNonNullableByDefault} core::Object;
-  objectVar = let final<BottomType> #t15 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:126:15: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t15 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:126:15: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'Object' because 'YpotentiallyNull?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   objectVar = yPotentiallyNullNullableArg;
               ^" in yPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} core::Object;
@@ -1094,13 +1094,13 @@
  - 'Object' is from 'dart:core'.
   numVar = objectNullableArg;
            ^" in objectNullableArg as{TypeError,ForNonNullableByDefault} core::num;
-  numVar = let final<BottomType> #t18 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:130:12: Error: A value of type 'num?' can't be assigned to a variable of type 'num'.
+  numVar = let final<BottomType> #t18 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:130:12: Error: A value of type 'num?' can't be assigned to a variable of type 'num' because 'num?' is nullable and 'num' isn't.
   numVar = numNullableArg;
            ^" in numNullableArg as{TypeError,ForNonNullableByDefault} core::num;
-  numVar = let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:131:12: Error: A value of type 'int?' can't be assigned to a variable of type 'num'.
+  numVar = let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:131:12: Error: A value of type 'int?' can't be assigned to a variable of type 'num' because 'int?' is nullable and 'num' isn't.
   numVar = intNullableArg;
            ^" in intNullableArg as{TypeError,ForNonNullableByDefault} core::num;
-  numVar = let final<BottomType> #t20 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:132:12: Error: A value of type 'double?' can't be assigned to a variable of type 'num'.
+  numVar = let final<BottomType> #t20 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:132:12: Error: A value of type 'double?' can't be assigned to a variable of type 'num' because 'double?' is nullable and 'num' isn't.
   numVar = doubleNullableArg;
            ^" in doubleNullableArg as{TypeError,ForNonNullableByDefault} core::num;
   numVar = let final<BottomType> #t21 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:133:12: Error: A value of type 'Function' can't be assigned to a variable of type 'num'.
@@ -1163,7 +1163,7 @@
   intVar = let final<BottomType> #t38 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:151:12: Error: A value of type 'num?' can't be assigned to a variable of type 'int'.
   intVar = numNullableArg;
            ^" in numNullableArg as{TypeError,ForNonNullableByDefault} core::int;
-  intVar = let final<BottomType> #t39 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:152:12: Error: A value of type 'int?' can't be assigned to a variable of type 'int'.
+  intVar = let final<BottomType> #t39 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:152:12: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
   intVar = intNullableArg;
            ^" in intNullableArg as{TypeError,ForNonNullableByDefault} core::int;
   intVar = let final<BottomType> #t40 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:153:12: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
@@ -1238,7 +1238,7 @@
   doubleVar = let final<BottomType> #t61 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:175:15: Error: A value of type 'int?' can't be assigned to a variable of type 'double'.
   doubleVar = intNullableArg;
               ^" in intNullableArg as{TypeError,ForNonNullableByDefault} core::double;
-  doubleVar = let final<BottomType> #t62 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:176:15: Error: A value of type 'double?' can't be assigned to a variable of type 'double'.
+  doubleVar = let final<BottomType> #t62 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:176:15: Error: A value of type 'double?' can't be assigned to a variable of type 'double' because 'double?' is nullable and 'double' isn't.
   doubleVar = doubleNullableArg;
               ^" in doubleNullableArg as{TypeError,ForNonNullableByDefault} core::double;
   doubleVar = let final<BottomType> #t63 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:177:15: Error: A value of type 'Function' can't be assigned to a variable of type 'double'.
@@ -1321,11 +1321,11 @@
  - 'Function' is from 'dart:core'.
   functionVar = doubleNullableArg;
                 ^" in doubleNullableArg as{TypeError,ForNonNullableByDefault} core::Function;
-  functionVar = let final<BottomType> #t85 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:200:17: Error: A value of type 'Function?' can't be assigned to a variable of type 'Function'.
+  functionVar = let final<BottomType> #t85 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:200:17: Error: A value of type 'Function?' can't be assigned to a variable of type 'Function' because 'Function?' is nullable and 'Function' isn't.
  - 'Function' is from 'dart:core'.
   functionVar = functionNullableArg;
                 ^" in functionNullableArg as{TypeError,ForNonNullableByDefault} core::Function;
-  functionVar = let final<BottomType> #t86 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:201:17: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Function'.
+  functionVar = let final<BottomType> #t86 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:201:17: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Function' because 'void Function()?' is nullable and 'Function' isn't.
  - 'Function' is from 'dart:core'.
   functionVar = toVoidNullableArg;
                 ^" in toVoidNullableArg as{TypeError,ForNonNullableByDefault} core::Function;
@@ -1398,7 +1398,7 @@
  - 'Function' is from 'dart:core'.
   toVoidVar = functionNullableArg;
               ^" in functionNullableArg as{TypeError,ForNonNullableByDefault} () → void;
-  toVoidVar = let final<BottomType> #t106 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:222:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'void Function()'.
+  toVoidVar = let final<BottomType> #t106 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:222:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'void Function()' because 'void Function()?' is nullable and 'void Function()' isn't.
   toVoidVar = toVoidNullableArg;
               ^" in toVoidNullableArg as{TypeError,ForNonNullableByDefault} () → void;
   toVoidVar = let final<BottomType> #t107 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:223:15: Error: Can't tear off method 'call' from a potentially null value.
@@ -1480,7 +1480,7 @@
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   tearoffableVar = toVoidNullableArg;
                    ^" in toVoidNullableArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
-  tearoffableVar = let final<BottomType> #t128 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:245:20: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'Tearoffable'.
+  tearoffableVar = let final<BottomType> #t128 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:245:20: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'Tearoffable' because 'Tearoffable?' is nullable and 'Tearoffable' isn't.
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   tearoffableVar = tearoffableNullableArg;
                    ^" in tearoffableNullableArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
@@ -1564,7 +1564,7 @@
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   xNonNullVar = tearoffableNullableArg;
                 ^" in tearoffableNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xNonNullVar = let final<BottomType> #t151 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:269:17: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'XnonNull'.
+  xNonNullVar = let final<BottomType> #t151 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:269:17: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'XnonNull' because 'XnonNull?' is nullable and 'XnonNull' isn't.
   xNonNullVar = xNonNullNullableArg;
                 ^" in xNonNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
   xNonNullVar = let final<BottomType> #t152 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:270:17: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'XnonNull'.
@@ -1573,7 +1573,7 @@
   xNonNullVar = let final<BottomType> #t153 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:271:17: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'XnonNull'.
   xNonNullVar = xPotentiallyNullNullableArg;
                 ^" in xPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xNonNullVar = let final<BottomType> #t154 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:272:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'XnonNull'.
+  xNonNullVar = let final<BottomType> #t154 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:272:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'XnonNull' because 'YnonNull?' is nullable and 'XnonNull' isn't.
   xNonNullVar = yNonNullNullableArg;
                 ^" in yNonNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
   xNonNullVar = let final<BottomType> #t155 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:273:17: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'XnonNull'.
@@ -1636,7 +1636,7 @@
   xPotentiallyNullVar = let final<BottomType> #t172 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:291:25: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'XpotentiallyNull'.
   xPotentiallyNullVar = xNonNullNullableArg;
                         ^" in xNonNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xPotentiallyNullVar = let final<BottomType> #t173 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:292:25: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'XpotentiallyNull'.
+  xPotentiallyNullVar = let final<BottomType> #t173 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:292:25: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'XpotentiallyNull' because 'XpotentiallyNull?' is nullable and 'XpotentiallyNull' isn't.
   xPotentiallyNullVar = xPotentiallyNullNullableArg;
                         ^" in xPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
   xPotentiallyNullVar = let final<BottomType> #t174 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:293:25: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'XpotentiallyNull'.
@@ -1645,7 +1645,7 @@
   xPotentiallyNullVar = let final<BottomType> #t175 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:294:25: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'XpotentiallyNull'.
   xPotentiallyNullVar = yNonNullNullableArg;
                         ^" in yNonNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xPotentiallyNullVar = let final<BottomType> #t176 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:295:25: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'XpotentiallyNull'.
+  xPotentiallyNullVar = let final<BottomType> #t176 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:295:25: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'XpotentiallyNull' because 'YpotentiallyNull?' is nullable and 'XpotentiallyNull' isn't.
   xPotentiallyNullVar = yPotentiallyNullNullableArg;
                         ^" in yPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
   self::error::YnonNull yNonNullVar = let final<BottomType> #t177 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:297:26: Error: A value of type 'Object' can't be assigned to a variable of type 'YnonNull'.
@@ -1708,7 +1708,7 @@
   yNonNullVar = let final<BottomType> #t194 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:314:17: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'YnonNull'.
   yNonNullVar = xPotentiallyNullNullableArg;
                 ^" in xPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  yNonNullVar = let final<BottomType> #t195 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:315:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'YnonNull'.
+  yNonNullVar = let final<BottomType> #t195 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:315:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'YnonNull' because 'YnonNull?' is nullable and 'YnonNull' isn't.
   yNonNullVar = yNonNullNullableArg;
                 ^" in yNonNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
   yNonNullVar = let final<BottomType> #t196 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:316:17: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'YnonNull'.
@@ -1783,7 +1783,7 @@
   yPotentiallyNullVar = let final<BottomType> #t217 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:338:25: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'YpotentiallyNull'.
   yPotentiallyNullVar = yNonNullNullableArg;
                         ^" in yNonNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  yPotentiallyNullVar = let final<BottomType> #t218 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:339:25: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'YpotentiallyNull'.
+  yPotentiallyNullVar = let final<BottomType> #t218 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:339:25: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'YpotentiallyNull' because 'YpotentiallyNull?' is nullable and 'YpotentiallyNull' isn't.
   yPotentiallyNullVar = yPotentiallyNullNullableArg;
                         ^" in yPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
 }
diff --git a/pkg/front_end/testcases/nnbd/assignability.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/assignability.dart.strong.transformed.expect
index 25a4dd1..fc7fd3d 100644
--- a/pkg/front_end/testcases/nnbd/assignability.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/assignability.dart.strong.transformed.expect
@@ -2,69 +2,69 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:114:22: Error: A value of type 'Object?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:114:22: Error: A value of type 'Object?' can't be assigned to a variable of type 'Object' because 'Object?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   Object objectVar = objectNullableArg;
 //                      ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:115:15: Error: A value of type 'num?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:115:15: Error: A value of type 'num?' can't be assigned to a variable of type 'Object' because 'num?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = numNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:116:15: Error: A value of type 'int?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:116:15: Error: A value of type 'int?' can't be assigned to a variable of type 'Object' because 'int?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = intNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:117:15: Error: A value of type 'double?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:117:15: Error: A value of type 'double?' can't be assigned to a variable of type 'Object' because 'double?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = doubleNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:118:15: Error: A value of type 'Function?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:118:15: Error: A value of type 'Function?' can't be assigned to a variable of type 'Object' because 'Function?' is nullable and 'Object' isn't.
 //  - 'Function' is from 'dart:core'.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = functionNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:119:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:119:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Object' because 'void Function()?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = toVoidNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:120:15: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:120:15: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'Object' because 'Tearoffable?' is nullable and 'Object' isn't.
 //  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = tearoffableNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:121:15: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:121:15: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'Object' because 'XnonNull?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = xNonNullNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:122:15: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:122:15: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'Object' because 'XpotentiallyNull' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = xPotentiallyNullArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:123:15: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:123:15: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'Object' because 'XpotentiallyNull?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = xPotentiallyNullNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:124:15: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:124:15: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'Object' because 'YnonNull?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = yNonNullNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:125:15: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:125:15: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'Object' because 'YpotentiallyNull' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = yPotentiallyNullArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:126:15: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:126:15: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'Object' because 'YpotentiallyNull?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = yPotentiallyNullNullableArg;
 //               ^
@@ -79,15 +79,15 @@
 //   numVar = objectNullableArg;
 //            ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:130:12: Error: A value of type 'num?' can't be assigned to a variable of type 'num'.
+// pkg/front_end/testcases/nnbd/assignability.dart:130:12: Error: A value of type 'num?' can't be assigned to a variable of type 'num' because 'num?' is nullable and 'num' isn't.
 //   numVar = numNullableArg;
 //            ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:131:12: Error: A value of type 'int?' can't be assigned to a variable of type 'num'.
+// pkg/front_end/testcases/nnbd/assignability.dart:131:12: Error: A value of type 'int?' can't be assigned to a variable of type 'num' because 'int?' is nullable and 'num' isn't.
 //   numVar = intNullableArg;
 //            ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:132:12: Error: A value of type 'double?' can't be assigned to a variable of type 'num'.
+// pkg/front_end/testcases/nnbd/assignability.dart:132:12: Error: A value of type 'double?' can't be assigned to a variable of type 'num' because 'double?' is nullable and 'num' isn't.
 //   numVar = doubleNullableArg;
 //            ^
 //
@@ -169,7 +169,7 @@
 //   intVar = numNullableArg;
 //            ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:152:12: Error: A value of type 'int?' can't be assigned to a variable of type 'int'.
+// pkg/front_end/testcases/nnbd/assignability.dart:152:12: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
 //   intVar = intNullableArg;
 //            ^
 //
@@ -267,7 +267,7 @@
 //   doubleVar = intNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:176:15: Error: A value of type 'double?' can't be assigned to a variable of type 'double'.
+// pkg/front_end/testcases/nnbd/assignability.dart:176:15: Error: A value of type 'double?' can't be assigned to a variable of type 'double' because 'double?' is nullable and 'double' isn't.
 //   doubleVar = doubleNullableArg;
 //               ^
 //
@@ -373,12 +373,12 @@
 //   functionVar = doubleNullableArg;
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:200:17: Error: A value of type 'Function?' can't be assigned to a variable of type 'Function'.
+// pkg/front_end/testcases/nnbd/assignability.dart:200:17: Error: A value of type 'Function?' can't be assigned to a variable of type 'Function' because 'Function?' is nullable and 'Function' isn't.
 //  - 'Function' is from 'dart:core'.
 //   functionVar = functionNullableArg;
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:201:17: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Function'.
+// pkg/front_end/testcases/nnbd/assignability.dart:201:17: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Function' because 'void Function()?' is nullable and 'Function' isn't.
 //  - 'Function' is from 'dart:core'.
 //   functionVar = toVoidNullableArg;
 //                 ^
@@ -471,7 +471,7 @@
 //   toVoidVar = functionNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:222:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'void Function()'.
+// pkg/front_end/testcases/nnbd/assignability.dart:222:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'void Function()' because 'void Function()?' is nullable and 'void Function()' isn't.
 //   toVoidVar = toVoidNullableArg;
 //               ^
 //
@@ -575,7 +575,7 @@
 //   tearoffableVar = toVoidNullableArg;
 //                    ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:245:20: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'Tearoffable'.
+// pkg/front_end/testcases/nnbd/assignability.dart:245:20: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'Tearoffable' because 'Tearoffable?' is nullable and 'Tearoffable' isn't.
 //  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
 //   tearoffableVar = tearoffableNullableArg;
 //                    ^
@@ -682,7 +682,7 @@
 //   xNonNullVar = tearoffableNullableArg;
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:269:17: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'XnonNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:269:17: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'XnonNull' because 'XnonNull?' is nullable and 'XnonNull' isn't.
 //   xNonNullVar = xNonNullNullableArg;
 //                 ^
 //
@@ -694,7 +694,7 @@
 //   xNonNullVar = xPotentiallyNullNullableArg;
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:272:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'XnonNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:272:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'XnonNull' because 'YnonNull?' is nullable and 'XnonNull' isn't.
 //   xNonNullVar = yNonNullNullableArg;
 //                 ^
 //
@@ -776,7 +776,7 @@
 //   xPotentiallyNullVar = xNonNullNullableArg;
 //                         ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:292:25: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'XpotentiallyNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:292:25: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'XpotentiallyNull' because 'XpotentiallyNull?' is nullable and 'XpotentiallyNull' isn't.
 //   xPotentiallyNullVar = xPotentiallyNullNullableArg;
 //                         ^
 //
@@ -788,7 +788,7 @@
 //   xPotentiallyNullVar = yNonNullNullableArg;
 //                         ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:295:25: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'XpotentiallyNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:295:25: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'XpotentiallyNull' because 'YpotentiallyNull?' is nullable and 'XpotentiallyNull' isn't.
 //   xPotentiallyNullVar = yPotentiallyNullNullableArg;
 //                         ^
 //
@@ -870,7 +870,7 @@
 //   yNonNullVar = xPotentiallyNullNullableArg;
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:315:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'YnonNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:315:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'YnonNull' because 'YnonNull?' is nullable and 'YnonNull' isn't.
 //   yNonNullVar = yNonNullNullableArg;
 //                 ^
 //
@@ -968,7 +968,7 @@
 //   yPotentiallyNullVar = yNonNullNullableArg;
 //                         ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:339:25: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'YpotentiallyNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:339:25: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'YpotentiallyNull' because 'YpotentiallyNull?' is nullable and 'YpotentiallyNull' isn't.
 //   yPotentiallyNullVar = yPotentiallyNullNullableArg;
 //                         ^
 //
@@ -1032,57 +1032,57 @@
   yPotentiallyNullVar = yPotentiallyNullArg;
 }
 static method error<XnonNull extends core::Object = core::Object, YnonNull extends self::error::XnonNull = core::Object, XpotentiallyNull extends core::Object? = core::Object?, YpotentiallyNull extends self::error::XpotentiallyNull% = core::Object?>(core::Object objectArg, core::Object? objectNullableArg, core::num numArg, core::num? numNullableArg, core::int intArg, core::int? intNullableArg, core::double doubleArg, core::double? doubleNullableArg, core::Function functionArg, core::Function? functionNullableArg, () → void toVoidArg, () →? void toVoidNullableArg, self::Tearoffable tearoffableArg, self::Tearoffable? tearoffableNullableArg, self::error::XnonNull xNonNullArg, self::error::XnonNull? xNonNullNullableArg, self::error::XpotentiallyNull% xPotentiallyNullArg, self::error::XpotentiallyNull? xPotentiallyNullNullableArg, self::error::YnonNull yNonNullArg, self::error::YnonNull? yNonNullNullableArg, self::error::YpotentiallyNull% yPotentiallyNullArg, self::error::YpotentiallyNull? yPotentiallyNullNullableArg) → dynamic {
-  core::Object objectVar = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:114:22: Error: A value of type 'Object?' can't be assigned to a variable of type 'Object'.
+  core::Object objectVar = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:114:22: Error: A value of type 'Object?' can't be assigned to a variable of type 'Object' because 'Object?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   Object objectVar = objectNullableArg;
                      ^" in let core::Object? #t5 = objectNullableArg in #t5.==(null) ?{core::Object} #t5 as{TypeError,ForNonNullableByDefault} core::Object : #t5{core::Object};
-  objectVar = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:115:15: Error: A value of type 'num?' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:115:15: Error: A value of type 'num?' can't be assigned to a variable of type 'Object' because 'num?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   objectVar = numNullableArg;
               ^" in let core::num? #t7 = numNullableArg in #t7.==(null) ?{core::Object} #t7 as{TypeError,ForNonNullableByDefault} core::Object : #t7{core::Object};
-  objectVar = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:116:15: Error: A value of type 'int?' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:116:15: Error: A value of type 'int?' can't be assigned to a variable of type 'Object' because 'int?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   objectVar = intNullableArg;
               ^" in let core::int? #t9 = intNullableArg in #t9.==(null) ?{core::Object} #t9 as{TypeError,ForNonNullableByDefault} core::Object : #t9{core::Object};
-  objectVar = let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:117:15: Error: A value of type 'double?' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:117:15: Error: A value of type 'double?' can't be assigned to a variable of type 'Object' because 'double?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   objectVar = doubleNullableArg;
               ^" in let core::double? #t11 = doubleNullableArg in #t11.==(null) ?{core::Object} #t11 as{TypeError,ForNonNullableByDefault} core::Object : #t11{core::Object};
-  objectVar = let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:118:15: Error: A value of type 'Function?' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:118:15: Error: A value of type 'Function?' can't be assigned to a variable of type 'Object' because 'Function?' is nullable and 'Object' isn't.
  - 'Function' is from 'dart:core'.
  - 'Object' is from 'dart:core'.
   objectVar = functionNullableArg;
               ^" in let core::Function? #t13 = functionNullableArg in #t13.==(null) ?{core::Object} #t13 as{TypeError,ForNonNullableByDefault} core::Object : #t13{core::Object};
-  objectVar = let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:119:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:119:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Object' because 'void Function()?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   objectVar = toVoidNullableArg;
               ^" in let () →? void #t15 = toVoidNullableArg in #t15.==(null) ?{core::Object} #t15 as{TypeError,ForNonNullableByDefault} core::Object : #t15{core::Object};
-  objectVar = let final<BottomType> #t16 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:120:15: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t16 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:120:15: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'Object' because 'Tearoffable?' is nullable and 'Object' isn't.
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
  - 'Object' is from 'dart:core'.
   objectVar = tearoffableNullableArg;
               ^" in let self::Tearoffable? #t17 = tearoffableNullableArg in #t17.==(null) ?{core::Object} #t17 as{TypeError,ForNonNullableByDefault} core::Object : #t17{core::Object};
-  objectVar = let final<BottomType> #t18 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:121:15: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t18 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:121:15: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'Object' because 'XnonNull?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   objectVar = xNonNullNullableArg;
               ^" in let self::error::XnonNull? #t19 = xNonNullNullableArg in #t19.==(null) ?{core::Object} #t19 as{TypeError,ForNonNullableByDefault} core::Object : #t19{core::Object};
-  objectVar = let final<BottomType> #t20 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:122:15: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t20 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:122:15: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'Object' because 'XpotentiallyNull' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   objectVar = xPotentiallyNullArg;
               ^" in let self::error::XpotentiallyNull% #t21 = xPotentiallyNullArg in #t21.==(null) ?{core::Object} #t21 as{TypeError,ForNonNullableByDefault} core::Object : #t21{core::Object};
-  objectVar = let final<BottomType> #t22 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:123:15: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t22 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:123:15: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'Object' because 'XpotentiallyNull?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   objectVar = xPotentiallyNullNullableArg;
               ^" in let self::error::XpotentiallyNull? #t23 = xPotentiallyNullNullableArg in #t23.==(null) ?{core::Object} #t23 as{TypeError,ForNonNullableByDefault} core::Object : #t23{core::Object};
-  objectVar = let final<BottomType> #t24 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:124:15: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t24 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:124:15: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'Object' because 'YnonNull?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   objectVar = yNonNullNullableArg;
               ^" in let self::error::YnonNull? #t25 = yNonNullNullableArg in #t25.==(null) ?{core::Object} #t25 as{TypeError,ForNonNullableByDefault} core::Object : #t25{core::Object};
-  objectVar = let final<BottomType> #t26 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:125:15: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t26 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:125:15: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'Object' because 'YpotentiallyNull' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   objectVar = yPotentiallyNullArg;
               ^" in let self::error::YpotentiallyNull% #t27 = yPotentiallyNullArg in #t27.==(null) ?{core::Object} #t27 as{TypeError,ForNonNullableByDefault} core::Object : #t27{core::Object};
-  objectVar = let final<BottomType> #t28 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:126:15: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t28 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:126:15: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'Object' because 'YpotentiallyNull?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   objectVar = yPotentiallyNullNullableArg;
               ^" in let self::error::YpotentiallyNull? #t29 = yPotentiallyNullNullableArg in #t29.==(null) ?{core::Object} #t29 as{TypeError,ForNonNullableByDefault} core::Object : #t29{core::Object};
@@ -1094,13 +1094,13 @@
  - 'Object' is from 'dart:core'.
   numVar = objectNullableArg;
            ^" in objectNullableArg as{TypeError,ForNonNullableByDefault} core::num;
-  numVar = let final<BottomType> #t32 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:130:12: Error: A value of type 'num?' can't be assigned to a variable of type 'num'.
+  numVar = let final<BottomType> #t32 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:130:12: Error: A value of type 'num?' can't be assigned to a variable of type 'num' because 'num?' is nullable and 'num' isn't.
   numVar = numNullableArg;
            ^" in let core::num? #t33 = numNullableArg in #t33.==(null) ?{core::num} #t33 as{TypeError,ForNonNullableByDefault} core::num : #t33{core::num};
-  numVar = let final<BottomType> #t34 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:131:12: Error: A value of type 'int?' can't be assigned to a variable of type 'num'.
+  numVar = let final<BottomType> #t34 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:131:12: Error: A value of type 'int?' can't be assigned to a variable of type 'num' because 'int?' is nullable and 'num' isn't.
   numVar = intNullableArg;
            ^" in let core::int? #t35 = intNullableArg in #t35.==(null) ?{core::num} #t35 as{TypeError,ForNonNullableByDefault} core::num : #t35{core::num};
-  numVar = let final<BottomType> #t36 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:132:12: Error: A value of type 'double?' can't be assigned to a variable of type 'num'.
+  numVar = let final<BottomType> #t36 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:132:12: Error: A value of type 'double?' can't be assigned to a variable of type 'num' because 'double?' is nullable and 'num' isn't.
   numVar = doubleNullableArg;
            ^" in let core::double? #t37 = doubleNullableArg in #t37.==(null) ?{core::num} #t37 as{TypeError,ForNonNullableByDefault} core::num : #t37{core::num};
   numVar = let final<BottomType> #t38 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:133:12: Error: A value of type 'Function' can't be assigned to a variable of type 'num'.
@@ -1163,7 +1163,7 @@
   intVar = let final<BottomType> #t55 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:151:12: Error: A value of type 'num?' can't be assigned to a variable of type 'int'.
   intVar = numNullableArg;
            ^" in numNullableArg as{TypeError,ForNonNullableByDefault} core::int;
-  intVar = let final<BottomType> #t56 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:152:12: Error: A value of type 'int?' can't be assigned to a variable of type 'int'.
+  intVar = let final<BottomType> #t56 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:152:12: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
   intVar = intNullableArg;
            ^" in let core::int? #t57 = intNullableArg in #t57.==(null) ?{core::int} #t57 as{TypeError,ForNonNullableByDefault} core::int : #t57{core::int};
   intVar = let final<BottomType> #t58 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:153:12: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
@@ -1238,7 +1238,7 @@
   doubleVar = let final<BottomType> #t79 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:175:15: Error: A value of type 'int?' can't be assigned to a variable of type 'double'.
   doubleVar = intNullableArg;
               ^" in intNullableArg as{TypeError,ForNonNullableByDefault} core::double;
-  doubleVar = let final<BottomType> #t80 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:176:15: Error: A value of type 'double?' can't be assigned to a variable of type 'double'.
+  doubleVar = let final<BottomType> #t80 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:176:15: Error: A value of type 'double?' can't be assigned to a variable of type 'double' because 'double?' is nullable and 'double' isn't.
   doubleVar = doubleNullableArg;
               ^" in let core::double? #t81 = doubleNullableArg in #t81.==(null) ?{core::double} #t81 as{TypeError,ForNonNullableByDefault} core::double : #t81{core::double};
   doubleVar = let final<BottomType> #t82 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:177:15: Error: A value of type 'Function' can't be assigned to a variable of type 'double'.
@@ -1321,11 +1321,11 @@
  - 'Function' is from 'dart:core'.
   functionVar = doubleNullableArg;
                 ^" in doubleNullableArg as{TypeError,ForNonNullableByDefault} core::Function;
-  functionVar = let final<BottomType> #t104 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:200:17: Error: A value of type 'Function?' can't be assigned to a variable of type 'Function'.
+  functionVar = let final<BottomType> #t104 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:200:17: Error: A value of type 'Function?' can't be assigned to a variable of type 'Function' because 'Function?' is nullable and 'Function' isn't.
  - 'Function' is from 'dart:core'.
   functionVar = functionNullableArg;
                 ^" in let core::Function? #t105 = functionNullableArg in #t105.==(null) ?{core::Function} #t105 as{TypeError,ForNonNullableByDefault} core::Function : #t105{core::Function};
-  functionVar = let final<BottomType> #t106 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:201:17: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Function'.
+  functionVar = let final<BottomType> #t106 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:201:17: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Function' because 'void Function()?' is nullable and 'Function' isn't.
  - 'Function' is from 'dart:core'.
   functionVar = toVoidNullableArg;
                 ^" in let () →? void #t107 = toVoidNullableArg in #t107.==(null) ?{core::Function} #t107 as{TypeError,ForNonNullableByDefault} core::Function : #t107{core::Function};
@@ -1398,7 +1398,7 @@
  - 'Function' is from 'dart:core'.
   toVoidVar = functionNullableArg;
               ^" in functionNullableArg as{TypeError,ForNonNullableByDefault} () → void;
-  toVoidVar = let final<BottomType> #t127 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:222:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'void Function()'.
+  toVoidVar = let final<BottomType> #t127 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:222:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'void Function()' because 'void Function()?' is nullable and 'void Function()' isn't.
   toVoidVar = toVoidNullableArg;
               ^" in let () →? void #t128 = toVoidNullableArg in #t128.==(null) ?{() → void} #t128 as{TypeError,ForNonNullableByDefault} () → void : #t128{() → void};
   toVoidVar = let final<BottomType> #t129 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:223:15: Error: Can't tear off method 'call' from a potentially null value.
@@ -1480,7 +1480,7 @@
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   tearoffableVar = toVoidNullableArg;
                    ^" in toVoidNullableArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
-  tearoffableVar = let final<BottomType> #t150 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:245:20: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'Tearoffable'.
+  tearoffableVar = let final<BottomType> #t150 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:245:20: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'Tearoffable' because 'Tearoffable?' is nullable and 'Tearoffable' isn't.
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   tearoffableVar = tearoffableNullableArg;
                    ^" in let self::Tearoffable? #t151 = tearoffableNullableArg in #t151.==(null) ?{self::Tearoffable} #t151 as{TypeError,ForNonNullableByDefault} self::Tearoffable : #t151{self::Tearoffable};
@@ -1564,7 +1564,7 @@
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   xNonNullVar = tearoffableNullableArg;
                 ^" in tearoffableNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xNonNullVar = let final<BottomType> #t174 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:269:17: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'XnonNull'.
+  xNonNullVar = let final<BottomType> #t174 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:269:17: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'XnonNull' because 'XnonNull?' is nullable and 'XnonNull' isn't.
   xNonNullVar = xNonNullNullableArg;
                 ^" in xNonNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
   xNonNullVar = let final<BottomType> #t175 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:270:17: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'XnonNull'.
@@ -1573,7 +1573,7 @@
   xNonNullVar = let final<BottomType> #t176 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:271:17: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'XnonNull'.
   xNonNullVar = xPotentiallyNullNullableArg;
                 ^" in xPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xNonNullVar = let final<BottomType> #t177 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:272:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'XnonNull'.
+  xNonNullVar = let final<BottomType> #t177 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:272:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'XnonNull' because 'YnonNull?' is nullable and 'XnonNull' isn't.
   xNonNullVar = yNonNullNullableArg;
                 ^" in yNonNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
   xNonNullVar = let final<BottomType> #t178 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:273:17: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'XnonNull'.
@@ -1636,7 +1636,7 @@
   xPotentiallyNullVar = let final<BottomType> #t195 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:291:25: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'XpotentiallyNull'.
   xPotentiallyNullVar = xNonNullNullableArg;
                         ^" in xNonNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xPotentiallyNullVar = let final<BottomType> #t196 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:292:25: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'XpotentiallyNull'.
+  xPotentiallyNullVar = let final<BottomType> #t196 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:292:25: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'XpotentiallyNull' because 'XpotentiallyNull?' is nullable and 'XpotentiallyNull' isn't.
   xPotentiallyNullVar = xPotentiallyNullNullableArg;
                         ^" in xPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
   xPotentiallyNullVar = let final<BottomType> #t197 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:293:25: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'XpotentiallyNull'.
@@ -1645,7 +1645,7 @@
   xPotentiallyNullVar = let final<BottomType> #t198 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:294:25: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'XpotentiallyNull'.
   xPotentiallyNullVar = yNonNullNullableArg;
                         ^" in yNonNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xPotentiallyNullVar = let final<BottomType> #t199 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:295:25: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'XpotentiallyNull'.
+  xPotentiallyNullVar = let final<BottomType> #t199 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:295:25: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'XpotentiallyNull' because 'YpotentiallyNull?' is nullable and 'XpotentiallyNull' isn't.
   xPotentiallyNullVar = yPotentiallyNullNullableArg;
                         ^" in yPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
   self::error::YnonNull yNonNullVar = let final<BottomType> #t200 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:297:26: Error: A value of type 'Object' can't be assigned to a variable of type 'YnonNull'.
@@ -1708,7 +1708,7 @@
   yNonNullVar = let final<BottomType> #t217 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:314:17: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'YnonNull'.
   yNonNullVar = xPotentiallyNullNullableArg;
                 ^" in xPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  yNonNullVar = let final<BottomType> #t218 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:315:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'YnonNull'.
+  yNonNullVar = let final<BottomType> #t218 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:315:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'YnonNull' because 'YnonNull?' is nullable and 'YnonNull' isn't.
   yNonNullVar = yNonNullNullableArg;
                 ^" in yNonNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
   yNonNullVar = let final<BottomType> #t219 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:316:17: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'YnonNull'.
@@ -1783,7 +1783,7 @@
   yPotentiallyNullVar = let final<BottomType> #t240 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:338:25: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'YpotentiallyNull'.
   yPotentiallyNullVar = yNonNullNullableArg;
                         ^" in yNonNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  yPotentiallyNullVar = let final<BottomType> #t241 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:339:25: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'YpotentiallyNull'.
+  yPotentiallyNullVar = let final<BottomType> #t241 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:339:25: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'YpotentiallyNull' because 'YpotentiallyNull?' is nullable and 'YpotentiallyNull' isn't.
   yPotentiallyNullVar = yPotentiallyNullNullableArg;
                         ^" in yPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
 }
diff --git a/pkg/front_end/testcases/nnbd/assignability.dart.weak.expect b/pkg/front_end/testcases/nnbd/assignability.dart.weak.expect
index 9c3d453..3ca69a3 100644
--- a/pkg/front_end/testcases/nnbd/assignability.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/assignability.dart.weak.expect
@@ -2,69 +2,69 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:114:22: Error: A value of type 'Object?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:114:22: Error: A value of type 'Object?' can't be assigned to a variable of type 'Object' because 'Object?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   Object objectVar = objectNullableArg;
 //                      ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:115:15: Error: A value of type 'num?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:115:15: Error: A value of type 'num?' can't be assigned to a variable of type 'Object' because 'num?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = numNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:116:15: Error: A value of type 'int?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:116:15: Error: A value of type 'int?' can't be assigned to a variable of type 'Object' because 'int?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = intNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:117:15: Error: A value of type 'double?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:117:15: Error: A value of type 'double?' can't be assigned to a variable of type 'Object' because 'double?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = doubleNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:118:15: Error: A value of type 'Function?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:118:15: Error: A value of type 'Function?' can't be assigned to a variable of type 'Object' because 'Function?' is nullable and 'Object' isn't.
 //  - 'Function' is from 'dart:core'.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = functionNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:119:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:119:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Object' because 'void Function()?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = toVoidNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:120:15: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:120:15: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'Object' because 'Tearoffable?' is nullable and 'Object' isn't.
 //  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = tearoffableNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:121:15: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:121:15: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'Object' because 'XnonNull?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = xNonNullNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:122:15: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:122:15: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'Object' because 'XpotentiallyNull' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = xPotentiallyNullArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:123:15: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:123:15: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'Object' because 'XpotentiallyNull?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = xPotentiallyNullNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:124:15: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:124:15: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'Object' because 'YnonNull?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = yNonNullNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:125:15: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:125:15: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'Object' because 'YpotentiallyNull' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = yPotentiallyNullArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:126:15: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:126:15: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'Object' because 'YpotentiallyNull?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = yPotentiallyNullNullableArg;
 //               ^
@@ -79,15 +79,15 @@
 //   numVar = objectNullableArg;
 //            ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:130:12: Error: A value of type 'num?' can't be assigned to a variable of type 'num'.
+// pkg/front_end/testcases/nnbd/assignability.dart:130:12: Error: A value of type 'num?' can't be assigned to a variable of type 'num' because 'num?' is nullable and 'num' isn't.
 //   numVar = numNullableArg;
 //            ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:131:12: Error: A value of type 'int?' can't be assigned to a variable of type 'num'.
+// pkg/front_end/testcases/nnbd/assignability.dart:131:12: Error: A value of type 'int?' can't be assigned to a variable of type 'num' because 'int?' is nullable and 'num' isn't.
 //   numVar = intNullableArg;
 //            ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:132:12: Error: A value of type 'double?' can't be assigned to a variable of type 'num'.
+// pkg/front_end/testcases/nnbd/assignability.dart:132:12: Error: A value of type 'double?' can't be assigned to a variable of type 'num' because 'double?' is nullable and 'num' isn't.
 //   numVar = doubleNullableArg;
 //            ^
 //
@@ -169,7 +169,7 @@
 //   intVar = numNullableArg;
 //            ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:152:12: Error: A value of type 'int?' can't be assigned to a variable of type 'int'.
+// pkg/front_end/testcases/nnbd/assignability.dart:152:12: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
 //   intVar = intNullableArg;
 //            ^
 //
@@ -267,7 +267,7 @@
 //   doubleVar = intNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:176:15: Error: A value of type 'double?' can't be assigned to a variable of type 'double'.
+// pkg/front_end/testcases/nnbd/assignability.dart:176:15: Error: A value of type 'double?' can't be assigned to a variable of type 'double' because 'double?' is nullable and 'double' isn't.
 //   doubleVar = doubleNullableArg;
 //               ^
 //
@@ -373,12 +373,12 @@
 //   functionVar = doubleNullableArg;
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:200:17: Error: A value of type 'Function?' can't be assigned to a variable of type 'Function'.
+// pkg/front_end/testcases/nnbd/assignability.dart:200:17: Error: A value of type 'Function?' can't be assigned to a variable of type 'Function' because 'Function?' is nullable and 'Function' isn't.
 //  - 'Function' is from 'dart:core'.
 //   functionVar = functionNullableArg;
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:201:17: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Function'.
+// pkg/front_end/testcases/nnbd/assignability.dart:201:17: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Function' because 'void Function()?' is nullable and 'Function' isn't.
 //  - 'Function' is from 'dart:core'.
 //   functionVar = toVoidNullableArg;
 //                 ^
@@ -471,7 +471,7 @@
 //   toVoidVar = functionNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:222:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'void Function()'.
+// pkg/front_end/testcases/nnbd/assignability.dart:222:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'void Function()' because 'void Function()?' is nullable and 'void Function()' isn't.
 //   toVoidVar = toVoidNullableArg;
 //               ^
 //
@@ -575,7 +575,7 @@
 //   tearoffableVar = toVoidNullableArg;
 //                    ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:245:20: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'Tearoffable'.
+// pkg/front_end/testcases/nnbd/assignability.dart:245:20: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'Tearoffable' because 'Tearoffable?' is nullable and 'Tearoffable' isn't.
 //  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
 //   tearoffableVar = tearoffableNullableArg;
 //                    ^
@@ -682,7 +682,7 @@
 //   xNonNullVar = tearoffableNullableArg;
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:269:17: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'XnonNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:269:17: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'XnonNull' because 'XnonNull?' is nullable and 'XnonNull' isn't.
 //   xNonNullVar = xNonNullNullableArg;
 //                 ^
 //
@@ -694,7 +694,7 @@
 //   xNonNullVar = xPotentiallyNullNullableArg;
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:272:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'XnonNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:272:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'XnonNull' because 'YnonNull?' is nullable and 'XnonNull' isn't.
 //   xNonNullVar = yNonNullNullableArg;
 //                 ^
 //
@@ -776,7 +776,7 @@
 //   xPotentiallyNullVar = xNonNullNullableArg;
 //                         ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:292:25: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'XpotentiallyNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:292:25: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'XpotentiallyNull' because 'XpotentiallyNull?' is nullable and 'XpotentiallyNull' isn't.
 //   xPotentiallyNullVar = xPotentiallyNullNullableArg;
 //                         ^
 //
@@ -788,7 +788,7 @@
 //   xPotentiallyNullVar = yNonNullNullableArg;
 //                         ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:295:25: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'XpotentiallyNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:295:25: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'XpotentiallyNull' because 'YpotentiallyNull?' is nullable and 'XpotentiallyNull' isn't.
 //   xPotentiallyNullVar = yPotentiallyNullNullableArg;
 //                         ^
 //
@@ -870,7 +870,7 @@
 //   yNonNullVar = xPotentiallyNullNullableArg;
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:315:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'YnonNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:315:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'YnonNull' because 'YnonNull?' is nullable and 'YnonNull' isn't.
 //   yNonNullVar = yNonNullNullableArg;
 //                 ^
 //
@@ -968,7 +968,7 @@
 //   yPotentiallyNullVar = yNonNullNullableArg;
 //                         ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:339:25: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'YpotentiallyNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:339:25: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'YpotentiallyNull' because 'YpotentiallyNull?' is nullable and 'YpotentiallyNull' isn't.
 //   yPotentiallyNullVar = yPotentiallyNullNullableArg;
 //                         ^
 //
@@ -1032,57 +1032,57 @@
   yPotentiallyNullVar = yPotentiallyNullArg;
 }
 static method error<XnonNull extends core::Object = core::Object, YnonNull extends self::error::XnonNull = core::Object, XpotentiallyNull extends core::Object? = core::Object?, YpotentiallyNull extends self::error::XpotentiallyNull% = core::Object?>(core::Object objectArg, core::Object? objectNullableArg, core::num numArg, core::num? numNullableArg, core::int intArg, core::int? intNullableArg, core::double doubleArg, core::double? doubleNullableArg, core::Function functionArg, core::Function? functionNullableArg, () → void toVoidArg, () →? void toVoidNullableArg, self::Tearoffable tearoffableArg, self::Tearoffable? tearoffableNullableArg, self::error::XnonNull xNonNullArg, self::error::XnonNull? xNonNullNullableArg, self::error::XpotentiallyNull% xPotentiallyNullArg, self::error::XpotentiallyNull? xPotentiallyNullNullableArg, self::error::YnonNull yNonNullArg, self::error::YnonNull? yNonNullNullableArg, self::error::YpotentiallyNull% yPotentiallyNullArg, self::error::YpotentiallyNull? yPotentiallyNullNullableArg) → dynamic {
-  core::Object objectVar = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:114:22: Error: A value of type 'Object?' can't be assigned to a variable of type 'Object'.
+  core::Object objectVar = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:114:22: Error: A value of type 'Object?' can't be assigned to a variable of type 'Object' because 'Object?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   Object objectVar = objectNullableArg;
                      ^" in objectNullableArg as{TypeError,ForNonNullableByDefault} core::Object;
-  objectVar = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:115:15: Error: A value of type 'num?' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:115:15: Error: A value of type 'num?' can't be assigned to a variable of type 'Object' because 'num?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   objectVar = numNullableArg;
               ^" in numNullableArg as{TypeError,ForNonNullableByDefault} core::Object;
-  objectVar = let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:116:15: Error: A value of type 'int?' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:116:15: Error: A value of type 'int?' can't be assigned to a variable of type 'Object' because 'int?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   objectVar = intNullableArg;
               ^" in intNullableArg as{TypeError,ForNonNullableByDefault} core::Object;
-  objectVar = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:117:15: Error: A value of type 'double?' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:117:15: Error: A value of type 'double?' can't be assigned to a variable of type 'Object' because 'double?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   objectVar = doubleNullableArg;
               ^" in doubleNullableArg as{TypeError,ForNonNullableByDefault} core::Object;
-  objectVar = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:118:15: Error: A value of type 'Function?' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:118:15: Error: A value of type 'Function?' can't be assigned to a variable of type 'Object' because 'Function?' is nullable and 'Object' isn't.
  - 'Function' is from 'dart:core'.
  - 'Object' is from 'dart:core'.
   objectVar = functionNullableArg;
               ^" in functionNullableArg as{TypeError,ForNonNullableByDefault} core::Object;
-  objectVar = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:119:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:119:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Object' because 'void Function()?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   objectVar = toVoidNullableArg;
               ^" in toVoidNullableArg as{TypeError,ForNonNullableByDefault} core::Object;
-  objectVar = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:120:15: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:120:15: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'Object' because 'Tearoffable?' is nullable and 'Object' isn't.
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
  - 'Object' is from 'dart:core'.
   objectVar = tearoffableNullableArg;
               ^" in tearoffableNullableArg as{TypeError,ForNonNullableByDefault} core::Object;
-  objectVar = let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:121:15: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:121:15: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'Object' because 'XnonNull?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   objectVar = xNonNullNullableArg;
               ^" in xNonNullNullableArg as{TypeError,ForNonNullableByDefault} core::Object;
-  objectVar = let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:122:15: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:122:15: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'Object' because 'XpotentiallyNull' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   objectVar = xPotentiallyNullArg;
               ^" in xPotentiallyNullArg as{TypeError,ForNonNullableByDefault} core::Object;
-  objectVar = let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:123:15: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:123:15: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'Object' because 'XpotentiallyNull?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   objectVar = xPotentiallyNullNullableArg;
               ^" in xPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} core::Object;
-  objectVar = let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:124:15: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:124:15: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'Object' because 'YnonNull?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   objectVar = yNonNullNullableArg;
               ^" in yNonNullNullableArg as{TypeError,ForNonNullableByDefault} core::Object;
-  objectVar = let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:125:15: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:125:15: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'Object' because 'YpotentiallyNull' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   objectVar = yPotentiallyNullArg;
               ^" in yPotentiallyNullArg as{TypeError,ForNonNullableByDefault} core::Object;
-  objectVar = let final<BottomType> #t15 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:126:15: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t15 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:126:15: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'Object' because 'YpotentiallyNull?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   objectVar = yPotentiallyNullNullableArg;
               ^" in yPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} core::Object;
@@ -1094,13 +1094,13 @@
  - 'Object' is from 'dart:core'.
   numVar = objectNullableArg;
            ^" in objectNullableArg as{TypeError,ForNonNullableByDefault} core::num;
-  numVar = let final<BottomType> #t18 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:130:12: Error: A value of type 'num?' can't be assigned to a variable of type 'num'.
+  numVar = let final<BottomType> #t18 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:130:12: Error: A value of type 'num?' can't be assigned to a variable of type 'num' because 'num?' is nullable and 'num' isn't.
   numVar = numNullableArg;
            ^" in numNullableArg as{TypeError,ForNonNullableByDefault} core::num;
-  numVar = let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:131:12: Error: A value of type 'int?' can't be assigned to a variable of type 'num'.
+  numVar = let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:131:12: Error: A value of type 'int?' can't be assigned to a variable of type 'num' because 'int?' is nullable and 'num' isn't.
   numVar = intNullableArg;
            ^" in intNullableArg as{TypeError,ForNonNullableByDefault} core::num;
-  numVar = let final<BottomType> #t20 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:132:12: Error: A value of type 'double?' can't be assigned to a variable of type 'num'.
+  numVar = let final<BottomType> #t20 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:132:12: Error: A value of type 'double?' can't be assigned to a variable of type 'num' because 'double?' is nullable and 'num' isn't.
   numVar = doubleNullableArg;
            ^" in doubleNullableArg as{TypeError,ForNonNullableByDefault} core::num;
   numVar = let final<BottomType> #t21 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:133:12: Error: A value of type 'Function' can't be assigned to a variable of type 'num'.
@@ -1163,7 +1163,7 @@
   intVar = let final<BottomType> #t38 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:151:12: Error: A value of type 'num?' can't be assigned to a variable of type 'int'.
   intVar = numNullableArg;
            ^" in numNullableArg as{TypeError,ForNonNullableByDefault} core::int;
-  intVar = let final<BottomType> #t39 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:152:12: Error: A value of type 'int?' can't be assigned to a variable of type 'int'.
+  intVar = let final<BottomType> #t39 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:152:12: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
   intVar = intNullableArg;
            ^" in intNullableArg as{TypeError,ForNonNullableByDefault} core::int;
   intVar = let final<BottomType> #t40 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:153:12: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
@@ -1238,7 +1238,7 @@
   doubleVar = let final<BottomType> #t61 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:175:15: Error: A value of type 'int?' can't be assigned to a variable of type 'double'.
   doubleVar = intNullableArg;
               ^" in intNullableArg as{TypeError,ForNonNullableByDefault} core::double;
-  doubleVar = let final<BottomType> #t62 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:176:15: Error: A value of type 'double?' can't be assigned to a variable of type 'double'.
+  doubleVar = let final<BottomType> #t62 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:176:15: Error: A value of type 'double?' can't be assigned to a variable of type 'double' because 'double?' is nullable and 'double' isn't.
   doubleVar = doubleNullableArg;
               ^" in doubleNullableArg as{TypeError,ForNonNullableByDefault} core::double;
   doubleVar = let final<BottomType> #t63 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:177:15: Error: A value of type 'Function' can't be assigned to a variable of type 'double'.
@@ -1321,11 +1321,11 @@
  - 'Function' is from 'dart:core'.
   functionVar = doubleNullableArg;
                 ^" in doubleNullableArg as{TypeError,ForNonNullableByDefault} core::Function;
-  functionVar = let final<BottomType> #t85 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:200:17: Error: A value of type 'Function?' can't be assigned to a variable of type 'Function'.
+  functionVar = let final<BottomType> #t85 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:200:17: Error: A value of type 'Function?' can't be assigned to a variable of type 'Function' because 'Function?' is nullable and 'Function' isn't.
  - 'Function' is from 'dart:core'.
   functionVar = functionNullableArg;
                 ^" in functionNullableArg as{TypeError,ForNonNullableByDefault} core::Function;
-  functionVar = let final<BottomType> #t86 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:201:17: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Function'.
+  functionVar = let final<BottomType> #t86 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:201:17: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Function' because 'void Function()?' is nullable and 'Function' isn't.
  - 'Function' is from 'dart:core'.
   functionVar = toVoidNullableArg;
                 ^" in toVoidNullableArg as{TypeError,ForNonNullableByDefault} core::Function;
@@ -1398,7 +1398,7 @@
  - 'Function' is from 'dart:core'.
   toVoidVar = functionNullableArg;
               ^" in functionNullableArg as{TypeError,ForNonNullableByDefault} () → void;
-  toVoidVar = let final<BottomType> #t106 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:222:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'void Function()'.
+  toVoidVar = let final<BottomType> #t106 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:222:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'void Function()' because 'void Function()?' is nullable and 'void Function()' isn't.
   toVoidVar = toVoidNullableArg;
               ^" in toVoidNullableArg as{TypeError,ForNonNullableByDefault} () → void;
   toVoidVar = let final<BottomType> #t107 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:223:15: Error: Can't tear off method 'call' from a potentially null value.
@@ -1480,7 +1480,7 @@
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   tearoffableVar = toVoidNullableArg;
                    ^" in toVoidNullableArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
-  tearoffableVar = let final<BottomType> #t128 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:245:20: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'Tearoffable'.
+  tearoffableVar = let final<BottomType> #t128 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:245:20: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'Tearoffable' because 'Tearoffable?' is nullable and 'Tearoffable' isn't.
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   tearoffableVar = tearoffableNullableArg;
                    ^" in tearoffableNullableArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
@@ -1564,7 +1564,7 @@
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   xNonNullVar = tearoffableNullableArg;
                 ^" in tearoffableNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xNonNullVar = let final<BottomType> #t151 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:269:17: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'XnonNull'.
+  xNonNullVar = let final<BottomType> #t151 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:269:17: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'XnonNull' because 'XnonNull?' is nullable and 'XnonNull' isn't.
   xNonNullVar = xNonNullNullableArg;
                 ^" in xNonNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
   xNonNullVar = let final<BottomType> #t152 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:270:17: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'XnonNull'.
@@ -1573,7 +1573,7 @@
   xNonNullVar = let final<BottomType> #t153 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:271:17: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'XnonNull'.
   xNonNullVar = xPotentiallyNullNullableArg;
                 ^" in xPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xNonNullVar = let final<BottomType> #t154 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:272:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'XnonNull'.
+  xNonNullVar = let final<BottomType> #t154 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:272:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'XnonNull' because 'YnonNull?' is nullable and 'XnonNull' isn't.
   xNonNullVar = yNonNullNullableArg;
                 ^" in yNonNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
   xNonNullVar = let final<BottomType> #t155 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:273:17: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'XnonNull'.
@@ -1636,7 +1636,7 @@
   xPotentiallyNullVar = let final<BottomType> #t172 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:291:25: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'XpotentiallyNull'.
   xPotentiallyNullVar = xNonNullNullableArg;
                         ^" in xNonNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xPotentiallyNullVar = let final<BottomType> #t173 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:292:25: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'XpotentiallyNull'.
+  xPotentiallyNullVar = let final<BottomType> #t173 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:292:25: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'XpotentiallyNull' because 'XpotentiallyNull?' is nullable and 'XpotentiallyNull' isn't.
   xPotentiallyNullVar = xPotentiallyNullNullableArg;
                         ^" in xPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
   xPotentiallyNullVar = let final<BottomType> #t174 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:293:25: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'XpotentiallyNull'.
@@ -1645,7 +1645,7 @@
   xPotentiallyNullVar = let final<BottomType> #t175 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:294:25: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'XpotentiallyNull'.
   xPotentiallyNullVar = yNonNullNullableArg;
                         ^" in yNonNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xPotentiallyNullVar = let final<BottomType> #t176 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:295:25: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'XpotentiallyNull'.
+  xPotentiallyNullVar = let final<BottomType> #t176 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:295:25: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'XpotentiallyNull' because 'YpotentiallyNull?' is nullable and 'XpotentiallyNull' isn't.
   xPotentiallyNullVar = yPotentiallyNullNullableArg;
                         ^" in yPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
   self::error::YnonNull yNonNullVar = let final<BottomType> #t177 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:297:26: Error: A value of type 'Object' can't be assigned to a variable of type 'YnonNull'.
@@ -1708,7 +1708,7 @@
   yNonNullVar = let final<BottomType> #t194 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:314:17: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'YnonNull'.
   yNonNullVar = xPotentiallyNullNullableArg;
                 ^" in xPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  yNonNullVar = let final<BottomType> #t195 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:315:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'YnonNull'.
+  yNonNullVar = let final<BottomType> #t195 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:315:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'YnonNull' because 'YnonNull?' is nullable and 'YnonNull' isn't.
   yNonNullVar = yNonNullNullableArg;
                 ^" in yNonNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
   yNonNullVar = let final<BottomType> #t196 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:316:17: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'YnonNull'.
@@ -1783,7 +1783,7 @@
   yPotentiallyNullVar = let final<BottomType> #t217 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:338:25: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'YpotentiallyNull'.
   yPotentiallyNullVar = yNonNullNullableArg;
                         ^" in yNonNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  yPotentiallyNullVar = let final<BottomType> #t218 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:339:25: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'YpotentiallyNull'.
+  yPotentiallyNullVar = let final<BottomType> #t218 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:339:25: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'YpotentiallyNull' because 'YpotentiallyNull?' is nullable and 'YpotentiallyNull' isn't.
   yPotentiallyNullVar = yPotentiallyNullNullableArg;
                         ^" in yPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
 }
diff --git a/pkg/front_end/testcases/nnbd/assignability.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/assignability.dart.weak.transformed.expect
index c141b93..45a8006 100644
--- a/pkg/front_end/testcases/nnbd/assignability.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/assignability.dart.weak.transformed.expect
@@ -2,69 +2,69 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:114:22: Error: A value of type 'Object?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:114:22: Error: A value of type 'Object?' can't be assigned to a variable of type 'Object' because 'Object?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   Object objectVar = objectNullableArg;
 //                      ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:115:15: Error: A value of type 'num?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:115:15: Error: A value of type 'num?' can't be assigned to a variable of type 'Object' because 'num?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = numNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:116:15: Error: A value of type 'int?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:116:15: Error: A value of type 'int?' can't be assigned to a variable of type 'Object' because 'int?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = intNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:117:15: Error: A value of type 'double?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:117:15: Error: A value of type 'double?' can't be assigned to a variable of type 'Object' because 'double?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = doubleNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:118:15: Error: A value of type 'Function?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:118:15: Error: A value of type 'Function?' can't be assigned to a variable of type 'Object' because 'Function?' is nullable and 'Object' isn't.
 //  - 'Function' is from 'dart:core'.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = functionNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:119:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:119:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Object' because 'void Function()?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = toVoidNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:120:15: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:120:15: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'Object' because 'Tearoffable?' is nullable and 'Object' isn't.
 //  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = tearoffableNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:121:15: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:121:15: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'Object' because 'XnonNull?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = xNonNullNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:122:15: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:122:15: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'Object' because 'XpotentiallyNull' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = xPotentiallyNullArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:123:15: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:123:15: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'Object' because 'XpotentiallyNull?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = xPotentiallyNullNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:124:15: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:124:15: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'Object' because 'YnonNull?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = yNonNullNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:125:15: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:125:15: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'Object' because 'YpotentiallyNull' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = yPotentiallyNullArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:126:15: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/assignability.dart:126:15: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'Object' because 'YpotentiallyNull?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = yPotentiallyNullNullableArg;
 //               ^
@@ -79,15 +79,15 @@
 //   numVar = objectNullableArg;
 //            ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:130:12: Error: A value of type 'num?' can't be assigned to a variable of type 'num'.
+// pkg/front_end/testcases/nnbd/assignability.dart:130:12: Error: A value of type 'num?' can't be assigned to a variable of type 'num' because 'num?' is nullable and 'num' isn't.
 //   numVar = numNullableArg;
 //            ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:131:12: Error: A value of type 'int?' can't be assigned to a variable of type 'num'.
+// pkg/front_end/testcases/nnbd/assignability.dart:131:12: Error: A value of type 'int?' can't be assigned to a variable of type 'num' because 'int?' is nullable and 'num' isn't.
 //   numVar = intNullableArg;
 //            ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:132:12: Error: A value of type 'double?' can't be assigned to a variable of type 'num'.
+// pkg/front_end/testcases/nnbd/assignability.dart:132:12: Error: A value of type 'double?' can't be assigned to a variable of type 'num' because 'double?' is nullable and 'num' isn't.
 //   numVar = doubleNullableArg;
 //            ^
 //
@@ -169,7 +169,7 @@
 //   intVar = numNullableArg;
 //            ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:152:12: Error: A value of type 'int?' can't be assigned to a variable of type 'int'.
+// pkg/front_end/testcases/nnbd/assignability.dart:152:12: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
 //   intVar = intNullableArg;
 //            ^
 //
@@ -267,7 +267,7 @@
 //   doubleVar = intNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:176:15: Error: A value of type 'double?' can't be assigned to a variable of type 'double'.
+// pkg/front_end/testcases/nnbd/assignability.dart:176:15: Error: A value of type 'double?' can't be assigned to a variable of type 'double' because 'double?' is nullable and 'double' isn't.
 //   doubleVar = doubleNullableArg;
 //               ^
 //
@@ -373,12 +373,12 @@
 //   functionVar = doubleNullableArg;
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:200:17: Error: A value of type 'Function?' can't be assigned to a variable of type 'Function'.
+// pkg/front_end/testcases/nnbd/assignability.dart:200:17: Error: A value of type 'Function?' can't be assigned to a variable of type 'Function' because 'Function?' is nullable and 'Function' isn't.
 //  - 'Function' is from 'dart:core'.
 //   functionVar = functionNullableArg;
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:201:17: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Function'.
+// pkg/front_end/testcases/nnbd/assignability.dart:201:17: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Function' because 'void Function()?' is nullable and 'Function' isn't.
 //  - 'Function' is from 'dart:core'.
 //   functionVar = toVoidNullableArg;
 //                 ^
@@ -471,7 +471,7 @@
 //   toVoidVar = functionNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:222:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'void Function()'.
+// pkg/front_end/testcases/nnbd/assignability.dart:222:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'void Function()' because 'void Function()?' is nullable and 'void Function()' isn't.
 //   toVoidVar = toVoidNullableArg;
 //               ^
 //
@@ -575,7 +575,7 @@
 //   tearoffableVar = toVoidNullableArg;
 //                    ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:245:20: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'Tearoffable'.
+// pkg/front_end/testcases/nnbd/assignability.dart:245:20: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'Tearoffable' because 'Tearoffable?' is nullable and 'Tearoffable' isn't.
 //  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
 //   tearoffableVar = tearoffableNullableArg;
 //                    ^
@@ -682,7 +682,7 @@
 //   xNonNullVar = tearoffableNullableArg;
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:269:17: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'XnonNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:269:17: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'XnonNull' because 'XnonNull?' is nullable and 'XnonNull' isn't.
 //   xNonNullVar = xNonNullNullableArg;
 //                 ^
 //
@@ -694,7 +694,7 @@
 //   xNonNullVar = xPotentiallyNullNullableArg;
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:272:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'XnonNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:272:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'XnonNull' because 'YnonNull?' is nullable and 'XnonNull' isn't.
 //   xNonNullVar = yNonNullNullableArg;
 //                 ^
 //
@@ -776,7 +776,7 @@
 //   xPotentiallyNullVar = xNonNullNullableArg;
 //                         ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:292:25: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'XpotentiallyNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:292:25: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'XpotentiallyNull' because 'XpotentiallyNull?' is nullable and 'XpotentiallyNull' isn't.
 //   xPotentiallyNullVar = xPotentiallyNullNullableArg;
 //                         ^
 //
@@ -788,7 +788,7 @@
 //   xPotentiallyNullVar = yNonNullNullableArg;
 //                         ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:295:25: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'XpotentiallyNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:295:25: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'XpotentiallyNull' because 'YpotentiallyNull?' is nullable and 'XpotentiallyNull' isn't.
 //   xPotentiallyNullVar = yPotentiallyNullNullableArg;
 //                         ^
 //
@@ -870,7 +870,7 @@
 //   yNonNullVar = xPotentiallyNullNullableArg;
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:315:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'YnonNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:315:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'YnonNull' because 'YnonNull?' is nullable and 'YnonNull' isn't.
 //   yNonNullVar = yNonNullNullableArg;
 //                 ^
 //
@@ -968,7 +968,7 @@
 //   yPotentiallyNullVar = yNonNullNullableArg;
 //                         ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:339:25: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'YpotentiallyNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:339:25: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'YpotentiallyNull' because 'YpotentiallyNull?' is nullable and 'YpotentiallyNull' isn't.
 //   yPotentiallyNullVar = yPotentiallyNullNullableArg;
 //                         ^
 //
@@ -1032,57 +1032,57 @@
   yPotentiallyNullVar = yPotentiallyNullArg;
 }
 static method error<XnonNull extends core::Object = core::Object, YnonNull extends self::error::XnonNull = core::Object, XpotentiallyNull extends core::Object? = core::Object?, YpotentiallyNull extends self::error::XpotentiallyNull% = core::Object?>(core::Object objectArg, core::Object? objectNullableArg, core::num numArg, core::num? numNullableArg, core::int intArg, core::int? intNullableArg, core::double doubleArg, core::double? doubleNullableArg, core::Function functionArg, core::Function? functionNullableArg, () → void toVoidArg, () →? void toVoidNullableArg, self::Tearoffable tearoffableArg, self::Tearoffable? tearoffableNullableArg, self::error::XnonNull xNonNullArg, self::error::XnonNull? xNonNullNullableArg, self::error::XpotentiallyNull% xPotentiallyNullArg, self::error::XpotentiallyNull? xPotentiallyNullNullableArg, self::error::YnonNull yNonNullArg, self::error::YnonNull? yNonNullNullableArg, self::error::YpotentiallyNull% yPotentiallyNullArg, self::error::YpotentiallyNull? yPotentiallyNullNullableArg) → dynamic {
-  core::Object objectVar = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:114:22: Error: A value of type 'Object?' can't be assigned to a variable of type 'Object'.
+  core::Object objectVar = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:114:22: Error: A value of type 'Object?' can't be assigned to a variable of type 'Object' because 'Object?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   Object objectVar = objectNullableArg;
                      ^" in objectNullableArg;
-  objectVar = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:115:15: Error: A value of type 'num?' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:115:15: Error: A value of type 'num?' can't be assigned to a variable of type 'Object' because 'num?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   objectVar = numNullableArg;
               ^" in numNullableArg;
-  objectVar = let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:116:15: Error: A value of type 'int?' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:116:15: Error: A value of type 'int?' can't be assigned to a variable of type 'Object' because 'int?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   objectVar = intNullableArg;
               ^" in intNullableArg;
-  objectVar = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:117:15: Error: A value of type 'double?' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:117:15: Error: A value of type 'double?' can't be assigned to a variable of type 'Object' because 'double?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   objectVar = doubleNullableArg;
               ^" in doubleNullableArg;
-  objectVar = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:118:15: Error: A value of type 'Function?' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:118:15: Error: A value of type 'Function?' can't be assigned to a variable of type 'Object' because 'Function?' is nullable and 'Object' isn't.
  - 'Function' is from 'dart:core'.
  - 'Object' is from 'dart:core'.
   objectVar = functionNullableArg;
               ^" in functionNullableArg;
-  objectVar = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:119:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:119:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Object' because 'void Function()?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   objectVar = toVoidNullableArg;
               ^" in toVoidNullableArg;
-  objectVar = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:120:15: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:120:15: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'Object' because 'Tearoffable?' is nullable and 'Object' isn't.
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
  - 'Object' is from 'dart:core'.
   objectVar = tearoffableNullableArg;
               ^" in tearoffableNullableArg;
-  objectVar = let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:121:15: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:121:15: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'Object' because 'XnonNull?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   objectVar = xNonNullNullableArg;
               ^" in xNonNullNullableArg;
-  objectVar = let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:122:15: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:122:15: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'Object' because 'XpotentiallyNull' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   objectVar = xPotentiallyNullArg;
               ^" in xPotentiallyNullArg;
-  objectVar = let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:123:15: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:123:15: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'Object' because 'XpotentiallyNull?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   objectVar = xPotentiallyNullNullableArg;
               ^" in xPotentiallyNullNullableArg;
-  objectVar = let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:124:15: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:124:15: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'Object' because 'YnonNull?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   objectVar = yNonNullNullableArg;
               ^" in yNonNullNullableArg;
-  objectVar = let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:125:15: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:125:15: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'Object' because 'YpotentiallyNull' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   objectVar = yPotentiallyNullArg;
               ^" in yPotentiallyNullArg;
-  objectVar = let final<BottomType> #t15 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:126:15: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'Object'.
+  objectVar = let final<BottomType> #t15 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:126:15: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'Object' because 'YpotentiallyNull?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   objectVar = yPotentiallyNullNullableArg;
               ^" in yPotentiallyNullNullableArg;
@@ -1094,13 +1094,13 @@
  - 'Object' is from 'dart:core'.
   numVar = objectNullableArg;
            ^" in objectNullableArg as{TypeError,ForNonNullableByDefault} core::num;
-  numVar = let final<BottomType> #t18 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:130:12: Error: A value of type 'num?' can't be assigned to a variable of type 'num'.
+  numVar = let final<BottomType> #t18 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:130:12: Error: A value of type 'num?' can't be assigned to a variable of type 'num' because 'num?' is nullable and 'num' isn't.
   numVar = numNullableArg;
            ^" in numNullableArg;
-  numVar = let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:131:12: Error: A value of type 'int?' can't be assigned to a variable of type 'num'.
+  numVar = let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:131:12: Error: A value of type 'int?' can't be assigned to a variable of type 'num' because 'int?' is nullable and 'num' isn't.
   numVar = intNullableArg;
            ^" in intNullableArg;
-  numVar = let final<BottomType> #t20 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:132:12: Error: A value of type 'double?' can't be assigned to a variable of type 'num'.
+  numVar = let final<BottomType> #t20 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:132:12: Error: A value of type 'double?' can't be assigned to a variable of type 'num' because 'double?' is nullable and 'num' isn't.
   numVar = doubleNullableArg;
            ^" in doubleNullableArg;
   numVar = let final<BottomType> #t21 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:133:12: Error: A value of type 'Function' can't be assigned to a variable of type 'num'.
@@ -1163,7 +1163,7 @@
   intVar = let final<BottomType> #t38 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:151:12: Error: A value of type 'num?' can't be assigned to a variable of type 'int'.
   intVar = numNullableArg;
            ^" in numNullableArg as{TypeError,ForNonNullableByDefault} core::int;
-  intVar = let final<BottomType> #t39 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:152:12: Error: A value of type 'int?' can't be assigned to a variable of type 'int'.
+  intVar = let final<BottomType> #t39 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:152:12: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
   intVar = intNullableArg;
            ^" in intNullableArg;
   intVar = let final<BottomType> #t40 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:153:12: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
@@ -1238,7 +1238,7 @@
   doubleVar = let final<BottomType> #t61 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:175:15: Error: A value of type 'int?' can't be assigned to a variable of type 'double'.
   doubleVar = intNullableArg;
               ^" in intNullableArg as{TypeError,ForNonNullableByDefault} core::double;
-  doubleVar = let final<BottomType> #t62 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:176:15: Error: A value of type 'double?' can't be assigned to a variable of type 'double'.
+  doubleVar = let final<BottomType> #t62 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:176:15: Error: A value of type 'double?' can't be assigned to a variable of type 'double' because 'double?' is nullable and 'double' isn't.
   doubleVar = doubleNullableArg;
               ^" in doubleNullableArg;
   doubleVar = let final<BottomType> #t63 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:177:15: Error: A value of type 'Function' can't be assigned to a variable of type 'double'.
@@ -1321,11 +1321,11 @@
  - 'Function' is from 'dart:core'.
   functionVar = doubleNullableArg;
                 ^" in doubleNullableArg as{TypeError,ForNonNullableByDefault} core::Function;
-  functionVar = let final<BottomType> #t85 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:200:17: Error: A value of type 'Function?' can't be assigned to a variable of type 'Function'.
+  functionVar = let final<BottomType> #t85 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:200:17: Error: A value of type 'Function?' can't be assigned to a variable of type 'Function' because 'Function?' is nullable and 'Function' isn't.
  - 'Function' is from 'dart:core'.
   functionVar = functionNullableArg;
                 ^" in functionNullableArg;
-  functionVar = let final<BottomType> #t86 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:201:17: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Function'.
+  functionVar = let final<BottomType> #t86 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:201:17: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Function' because 'void Function()?' is nullable and 'Function' isn't.
  - 'Function' is from 'dart:core'.
   functionVar = toVoidNullableArg;
                 ^" in toVoidNullableArg;
@@ -1398,7 +1398,7 @@
  - 'Function' is from 'dart:core'.
   toVoidVar = functionNullableArg;
               ^" in functionNullableArg as{TypeError,ForNonNullableByDefault} () → void;
-  toVoidVar = let final<BottomType> #t106 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:222:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'void Function()'.
+  toVoidVar = let final<BottomType> #t106 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:222:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'void Function()' because 'void Function()?' is nullable and 'void Function()' isn't.
   toVoidVar = toVoidNullableArg;
               ^" in toVoidNullableArg;
   toVoidVar = let final<BottomType> #t107 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:223:15: Error: Can't tear off method 'call' from a potentially null value.
@@ -1480,7 +1480,7 @@
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   tearoffableVar = toVoidNullableArg;
                    ^" in toVoidNullableArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
-  tearoffableVar = let final<BottomType> #t128 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:245:20: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'Tearoffable'.
+  tearoffableVar = let final<BottomType> #t128 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:245:20: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'Tearoffable' because 'Tearoffable?' is nullable and 'Tearoffable' isn't.
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   tearoffableVar = tearoffableNullableArg;
                    ^" in tearoffableNullableArg;
@@ -1564,7 +1564,7 @@
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   xNonNullVar = tearoffableNullableArg;
                 ^" in tearoffableNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xNonNullVar = let final<BottomType> #t151 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:269:17: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'XnonNull'.
+  xNonNullVar = let final<BottomType> #t151 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:269:17: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'XnonNull' because 'XnonNull?' is nullable and 'XnonNull' isn't.
   xNonNullVar = xNonNullNullableArg;
                 ^" in xNonNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
   xNonNullVar = let final<BottomType> #t152 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:270:17: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'XnonNull'.
@@ -1573,7 +1573,7 @@
   xNonNullVar = let final<BottomType> #t153 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:271:17: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'XnonNull'.
   xNonNullVar = xPotentiallyNullNullableArg;
                 ^" in xPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xNonNullVar = let final<BottomType> #t154 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:272:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'XnonNull'.
+  xNonNullVar = let final<BottomType> #t154 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:272:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'XnonNull' because 'YnonNull?' is nullable and 'XnonNull' isn't.
   xNonNullVar = yNonNullNullableArg;
                 ^" in yNonNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
   xNonNullVar = let final<BottomType> #t155 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:273:17: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'XnonNull'.
@@ -1636,7 +1636,7 @@
   xPotentiallyNullVar = let final<BottomType> #t172 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:291:25: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'XpotentiallyNull'.
   xPotentiallyNullVar = xNonNullNullableArg;
                         ^" in xNonNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xPotentiallyNullVar = let final<BottomType> #t173 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:292:25: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'XpotentiallyNull'.
+  xPotentiallyNullVar = let final<BottomType> #t173 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:292:25: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'XpotentiallyNull' because 'XpotentiallyNull?' is nullable and 'XpotentiallyNull' isn't.
   xPotentiallyNullVar = xPotentiallyNullNullableArg;
                         ^" in xPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
   xPotentiallyNullVar = let final<BottomType> #t174 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:293:25: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'XpotentiallyNull'.
@@ -1645,7 +1645,7 @@
   xPotentiallyNullVar = let final<BottomType> #t175 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:294:25: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'XpotentiallyNull'.
   xPotentiallyNullVar = yNonNullNullableArg;
                         ^" in yNonNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xPotentiallyNullVar = let final<BottomType> #t176 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:295:25: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'XpotentiallyNull'.
+  xPotentiallyNullVar = let final<BottomType> #t176 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:295:25: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'XpotentiallyNull' because 'YpotentiallyNull?' is nullable and 'XpotentiallyNull' isn't.
   xPotentiallyNullVar = yPotentiallyNullNullableArg;
                         ^" in yPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
   self::error::YnonNull yNonNullVar = let final<BottomType> #t177 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:297:26: Error: A value of type 'Object' can't be assigned to a variable of type 'YnonNull'.
@@ -1708,7 +1708,7 @@
   yNonNullVar = let final<BottomType> #t194 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:314:17: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'YnonNull'.
   yNonNullVar = xPotentiallyNullNullableArg;
                 ^" in xPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  yNonNullVar = let final<BottomType> #t195 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:315:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'YnonNull'.
+  yNonNullVar = let final<BottomType> #t195 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:315:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'YnonNull' because 'YnonNull?' is nullable and 'YnonNull' isn't.
   yNonNullVar = yNonNullNullableArg;
                 ^" in yNonNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
   yNonNullVar = let final<BottomType> #t196 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:316:17: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'YnonNull'.
@@ -1783,7 +1783,7 @@
   yPotentiallyNullVar = let final<BottomType> #t217 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:338:25: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'YpotentiallyNull'.
   yPotentiallyNullVar = yNonNullNullableArg;
                         ^" in yNonNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  yPotentiallyNullVar = let final<BottomType> #t218 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:339:25: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'YpotentiallyNull'.
+  yPotentiallyNullVar = let final<BottomType> #t218 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:339:25: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'YpotentiallyNull' because 'YpotentiallyNull?' is nullable and 'YpotentiallyNull' isn't.
   yPotentiallyNullVar = yPotentiallyNullNullableArg;
                         ^" in yPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
 }
diff --git a/pkg/front_end/testcases/nnbd/assignability_error_messages.dart b/pkg/front_end/testcases/nnbd/assignability_error_messages.dart
new file mode 100644
index 0000000..ee2a051
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/assignability_error_messages.dart
@@ -0,0 +1,84 @@
+// Copyright (c) 2020, 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.
+
+// The test checks that if one type isn't assignable to the other only because
+// of the nullability modifiers, the error message reflects that.
+
+import 'dart:async';
+
+class A {
+  const A();
+}
+
+class B extends A {}
+
+class C {
+  num? call() {}
+}
+
+void fooContext(A x) {}
+
+void barContext(List<A> x) {}
+
+void bazContext(num Function() f) {}
+
+A foo(B? x, List<B?> l, Map<B?, B?> m, List<B>? l2, Map<B, B>? m2) {
+  fooContext(x); // Error.
+  A a = x; // Error.
+  <A>[...l]; // Error.
+  <A>[...l2]; // Error.
+  <A, A>{...m}; // Error.
+  <A, A>{...m2}; // Error.
+  for (A y in l) {} // Error.
+  for (A y in l2) {} // Error.
+  switch (x) /*  Error. */ {
+    case const A():
+      break;
+    default:
+      break;
+  }
+  FutureOr<A> local() async {
+    if (true) {
+      return x; // Error.
+    } else {
+      return new Future<B?>.value(x); // Error.
+    }
+  }
+
+  return x; // Error.
+}
+
+List<A> bar(List<B?> x, List<List<B?>> l, Map<List<B?>, List<B?>> m) {
+  barContext(x); // Error.
+  List<A> y = x; // Error.
+  <List<A>>[...l]; // Error.
+  <List<A>, List<A>>{...m}; // Error.
+  for (List<A> y in l) {} // Error.
+  return x; // Error.
+}
+
+void baz(C c) {
+  bazContext(c);
+}
+
+A boz(Null x) {
+  fooContext(x); // Error.
+  fooContext(null); // Error.
+  A a1 = x; // Error.
+  A a2 = null; // Error.
+  if (true) {
+    return x; // Error.
+  } else {
+    return null; // Error.
+  }
+  FutureOr<A> local() async {
+    if (true) {
+      return null; // Error.
+    } else {
+      return new Future<Null>.value(null); // Error.
+    }
+  }
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/assignability_error_messages.dart.outline.expect b/pkg/front_end/testcases/nnbd/assignability_error_messages.dart.outline.expect
new file mode 100644
index 0000000..9f993af
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/assignability_error_messages.dart.outline.expect
@@ -0,0 +1,37 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+import "dart:async";
+
+class A extends core::Object /*hasConstConstructor*/  {
+  const constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class B extends self::A {
+  synthetic constructor •() → self::B
+    ;
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C
+    ;
+  method call() → core::num?
+    ;
+}
+static method fooContext(self::A x) → void
+  ;
+static method barContext(core::List<self::A> x) → void
+  ;
+static method bazContext(() → core::num f) → void
+  ;
+static method foo(self::B? x, core::List<self::B?> l, core::Map<self::B?, self::B?> m, core::List<self::B>? l2, core::Map<self::B, self::B>? m2) → self::A
+  ;
+static method bar(core::List<self::B?> x, core::List<core::List<self::B?>> l, core::Map<core::List<self::B?>, core::List<self::B?>> m) → core::List<self::A>
+  ;
+static method baz(self::C c) → void
+  ;
+static method boz(Null x) → self::A
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/nnbd/assignability_error_messages.dart.strong.expect b/pkg/front_end/testcases/nnbd/assignability_error_messages.dart.strong.expect
new file mode 100644
index 0000000..a4b4cdc
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/assignability_error_messages.dart.strong.expect
@@ -0,0 +1,387 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:27:14: Error: The argument type 'B?' can't be assigned to the parameter type 'A' because 'B?' is nullable and 'A' isn't.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   fooContext(x); // Error.
+//              ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:28:9: Error: A value of type 'B?' can't be assigned to a variable of type 'A' because 'B?' is nullable and 'A' isn't.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   A a = x; // Error.
+//         ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:29:10: Error: Can't assign spread elements of type 'B?' to collection elements of type 'A' because 'B?' is nullable and 'A' isn't.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   <A>[...l]; // Error.
+//          ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:30:10: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//   <A>[...l2]; // Error.
+//          ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:31:13: Error: Can't assign spread entry keys of type 'B?' to map entry keys of type 'A' because 'B?' is nullable and 'A' isn't.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   <A, A>{...m}; // Error.
+//             ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:31:13: Error: Can't assign spread entry values of type 'B?' to map entry values of type 'A' because 'B?' is nullable and 'A' isn't.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   <A, A>{...m}; // Error.
+//             ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:32:13: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//   <A, A>{...m2}; // Error.
+//             ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:33:10: Error: A value of type 'B?' can't be assigned to a variable of type 'A' because 'B?' is nullable and 'A' isn't.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+// Try changing the type of the variable.
+//   for (A y in l) {} // Error.
+//          ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:34:15: Error: The type 'List<B>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'List<B>?' is nullable and 'Iterable<dynamic>' isn't.
+//  - 'List' is from 'dart:core'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'Iterable' is from 'dart:core'.
+//   for (A y in l2) {} // Error.
+//               ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:36:16: Error: Type 'A' of the case expression is not a subtype of type 'B?' of this switch expression.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//     case const A():
+//                ^
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:35:11: Context: The switch expression is here.
+//   switch (x) /*  Error. */ {
+//           ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:43:14: Error: A value of type 'B?' can't be returned from an async function with return type 'FutureOr<A>' because 'B?' is nullable and 'FutureOr<A>' isn't.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//       return x; // Error.
+//              ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:45:18: Error: A value of type 'Future<B?>' can't be returned from an async function with return type 'FutureOr<A>'.
+//  - 'Future' is from 'dart:async'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//       return new Future<B?>.value(x); // Error.
+//                  ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:49:10: Error: A value of type 'B?' can't be returned from a function with return type 'A' because 'B?' is nullable and 'A' isn't.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   return x; // Error.
+//          ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:53:14: Error: The argument type 'List<B?>' can't be assigned to the parameter type 'List<A>' because 'B?' is nullable and 'A' isn't.
+//  - 'List' is from 'dart:core'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   barContext(x); // Error.
+//              ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:54:15: Error: A value of type 'List<B?>' can't be assigned to a variable of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+//  - 'List' is from 'dart:core'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   List<A> y = x; // Error.
+//               ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:55:16: Error: Can't assign spread elements of type 'List<B?>' to collection elements of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+//  - 'List' is from 'dart:core'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   <List<A>>[...l]; // Error.
+//                ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:56:25: Error: Can't assign spread entry keys of type 'List<B?>' to map entry keys of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+//  - 'List' is from 'dart:core'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   <List<A>, List<A>>{...m}; // Error.
+//                         ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:56:25: Error: Can't assign spread entry values of type 'List<B?>' to map entry values of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+//  - 'List' is from 'dart:core'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   <List<A>, List<A>>{...m}; // Error.
+//                         ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:57:16: Error: A value of type 'List<B?>' can't be assigned to a variable of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+//  - 'List' is from 'dart:core'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+// Try changing the type of the variable.
+//   for (List<A> y in l) {} // Error.
+//                ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:58:10: Error: A value of type 'List<B?>' can't be returned from a function with return type 'List<A>' because 'B?' is nullable and 'A' isn't.
+//  - 'List' is from 'dart:core'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   return x; // Error.
+//          ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:62:14: Error: The argument type 'num? Function()' can't be assigned to the parameter type 'num Function()' because 'num?' is nullable and 'num' isn't.
+//   bazContext(c);
+//              ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:66:14: Error: The argument type 'Null' can't be assigned to the parameter type 'A' because 'A' is not nullable.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   fooContext(x); // Error.
+//              ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:67:14: Error: The value 'null' can't be assigned to the parameter type 'A' because 'A' is not nullable.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   fooContext(null); // Error.
+//              ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:68:10: Error: A value of type 'Null' can't be assigned to a variable of type 'A' because 'A' is not nullable.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   A a1 = x; // Error.
+//          ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:69:10: Error: The value 'null' can't be assigned to a variable of type 'A' because 'A' is not nullable.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   A a2 = null; // Error.
+//          ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:71:12: Error: A value of type 'Null' can't be returned from a function with return type 'A' because 'A' is not nullable.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//     return x; // Error.
+//            ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:73:12: Error: The value 'null' can't be returned from a function with return type 'A' because 'A' is not nullable.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//     return null; // Error.
+//            ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:77:14: Error: The value 'null' can't be returned from an async function with return type 'FutureOr<A>' because 'FutureOr<A>' is not nullable.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//       return null; // Error.
+//              ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:79:18: Error: A value of type 'Future<Null>' can't be returned from an async function with return type 'FutureOr<A>'.
+//  - 'Future' is from 'dart:async'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//       return new Future<Null>.value(null); // Error.
+//                  ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+class A extends core::Object /*hasConstConstructor*/  {
+  const constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class B extends self::A {
+  synthetic constructor •() → self::B
+    : super self::A::•()
+    ;
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  method call() → core::num? {}
+}
+static method fooContext(self::A x) → void {}
+static method barContext(core::List<self::A> x) → void {}
+static method bazContext(() → core::num f) → void {}
+static method foo(self::B? x, core::List<self::B?> l, core::Map<self::B?, self::B?> m, core::List<self::B>? l2, core::Map<self::B, self::B>? m2) → self::A {
+  self::fooContext(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:27:14: Error: The argument type 'B?' can't be assigned to the parameter type 'A' because 'B?' is nullable and 'A' isn't.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  fooContext(x); // Error.
+             ^" in x as{TypeError,ForNonNullableByDefault} self::A);
+  self::A a = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:28:9: Error: A value of type 'B?' can't be assigned to a variable of type 'A' because 'B?' is nullable and 'A' isn't.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  A a = x; // Error.
+        ^" in x as{TypeError,ForNonNullableByDefault} self::A;
+  <self::A>[invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:29:10: Error: Can't assign spread elements of type 'B?' to collection elements of type 'A' because 'B?' is nullable and 'A' isn't.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  <A>[...l]; // Error.
+         ^"];
+  <self::A>[invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:30:10: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+  <A>[...l2]; // Error.
+         ^"];
+  <self::A, self::A>{invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:31:13: Error: Can't assign spread entry keys of type 'B?' to map entry keys of type 'A' because 'B?' is nullable and 'A' isn't.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  <A, A>{...m}; // Error.
+            ^": invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:31:13: Error: Can't assign spread entry values of type 'B?' to map entry values of type 'A' because 'B?' is nullable and 'A' isn't.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  <A, A>{...m}; // Error.
+            ^"};
+  <self::A, self::A>{invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:32:13: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+  <A, A>{...m2}; // Error.
+            ^": null};
+  for (final self::B? #t3 in l) {
+    self::A y = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:33:10: Error: A value of type 'B?' can't be assigned to a variable of type 'A' because 'B?' is nullable and 'A' isn't.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+Try changing the type of the variable.
+  for (A y in l) {} // Error.
+         ^" in #t3 as{TypeError,ForNonNullableByDefault} self::A;
+  }
+  for (self::A y in let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:34:15: Error: The type 'List<B>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'List<B>?' is nullable and 'Iterable<dynamic>' isn't.
+ - 'List' is from 'dart:core'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'Iterable' is from 'dart:core'.
+  for (A y in l2) {} // Error.
+              ^" in l2 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic>) {
+  }
+  #L1:
+  switch(x) {
+    #L2:
+    case #C1:
+      {
+        break #L1;
+      }
+    #L3:
+    default:
+      {
+        break #L1;
+      }
+  }
+  function local() → FutureOr<self::A> async {
+    if(true) {
+      return let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:43:14: Error: A value of type 'B?' can't be returned from an async function with return type 'FutureOr<A>' because 'B?' is nullable and 'FutureOr<A>' isn't.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+      return x; // Error.
+             ^" in x as{TypeError,ForNonNullableByDefault} self::A;
+    }
+    else {
+      return let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:45:18: Error: A value of type 'Future<B?>' can't be returned from an async function with return type 'FutureOr<A>'.
+ - 'Future' is from 'dart:async'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+      return new Future<B?>.value(x); // Error.
+                 ^" in asy::Future::value<self::B?>(x) as{TypeError,ForNonNullableByDefault} self::A;
+    }
+  }
+  return let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:49:10: Error: A value of type 'B?' can't be returned from a function with return type 'A' because 'B?' is nullable and 'A' isn't.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  return x; // Error.
+         ^" in x as{TypeError,ForNonNullableByDefault} self::A;
+}
+static method bar(core::List<self::B?> x, core::List<core::List<self::B?>> l, core::Map<core::List<self::B?>, core::List<self::B?>> m) → core::List<self::A> {
+  self::barContext(let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:53:14: Error: The argument type 'List<B?>' can't be assigned to the parameter type 'List<A>' because 'B?' is nullable and 'A' isn't.
+ - 'List' is from 'dart:core'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  barContext(x); // Error.
+             ^" in x as{TypeError,ForNonNullableByDefault} core::List<self::A>);
+  core::List<self::A> y = let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:54:15: Error: A value of type 'List<B?>' can't be assigned to a variable of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+ - 'List' is from 'dart:core'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  List<A> y = x; // Error.
+              ^" in x as{TypeError,ForNonNullableByDefault} core::List<self::A>;
+  <core::List<self::A>>[invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:55:16: Error: Can't assign spread elements of type 'List<B?>' to collection elements of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+ - 'List' is from 'dart:core'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  <List<A>>[...l]; // Error.
+               ^"];
+  <core::List<self::A>, core::List<self::A>>{invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:56:25: Error: Can't assign spread entry keys of type 'List<B?>' to map entry keys of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+ - 'List' is from 'dart:core'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  <List<A>, List<A>>{...m}; // Error.
+                        ^": invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:56:25: Error: Can't assign spread entry values of type 'List<B?>' to map entry values of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+ - 'List' is from 'dart:core'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  <List<A>, List<A>>{...m}; // Error.
+                        ^"};
+  for (final core::List<self::B?> #t11 in l) {
+    core::List<self::A> y = let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:57:16: Error: A value of type 'List<B?>' can't be assigned to a variable of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+ - 'List' is from 'dart:core'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+Try changing the type of the variable.
+  for (List<A> y in l) {} // Error.
+               ^" in #t11 as{TypeError,ForNonNullableByDefault} core::List<self::A>;
+  }
+  return let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:58:10: Error: A value of type 'List<B?>' can't be returned from a function with return type 'List<A>' because 'B?' is nullable and 'A' isn't.
+ - 'List' is from 'dart:core'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  return x; // Error.
+         ^" in x as{TypeError,ForNonNullableByDefault} core::List<self::A>;
+}
+static method baz(self::C c) → void {
+  self::bazContext(let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:62:14: Error: The argument type 'num? Function()' can't be assigned to the parameter type 'num Function()' because 'num?' is nullable and 'num' isn't.
+  bazContext(c);
+             ^" in (let final self::C #t15 = c in #t15.==(null) ?{() → core::num?} null : #t15.{self::C::call}) as{TypeError,ForNonNullableByDefault} () → core::num);
+}
+static method boz(Null x) → self::A {
+  self::fooContext(let final<BottomType> #t16 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:66:14: Error: The argument type 'Null' can't be assigned to the parameter type 'A' because 'A' is not nullable.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  fooContext(x); // Error.
+             ^" in x as{TypeError,ForNonNullableByDefault} self::A);
+  self::fooContext(let final<BottomType> #t17 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:67:14: Error: The value 'null' can't be assigned to the parameter type 'A' because 'A' is not nullable.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  fooContext(null); // Error.
+             ^" in null as{TypeError,ForNonNullableByDefault} self::A);
+  self::A a1 = let final<BottomType> #t18 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:68:10: Error: A value of type 'Null' can't be assigned to a variable of type 'A' because 'A' is not nullable.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  A a1 = x; // Error.
+         ^" in x as{TypeError,ForNonNullableByDefault} self::A;
+  self::A a2 = let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:69:10: Error: The value 'null' can't be assigned to a variable of type 'A' because 'A' is not nullable.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  A a2 = null; // Error.
+         ^" in null as{TypeError,ForNonNullableByDefault} self::A;
+  if(true) {
+    return let final<BottomType> #t20 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:71:12: Error: A value of type 'Null' can't be returned from a function with return type 'A' because 'A' is not nullable.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+    return x; // Error.
+           ^" in x as{TypeError,ForNonNullableByDefault} self::A;
+  }
+  else {
+    return let final<BottomType> #t21 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:73:12: Error: The value 'null' can't be returned from a function with return type 'A' because 'A' is not nullable.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+    return null; // Error.
+           ^" in null as{TypeError,ForNonNullableByDefault} self::A;
+  }
+  function local() → FutureOr<self::A> async {
+    if(true) {
+      return let final<BottomType> #t22 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:77:14: Error: The value 'null' can't be returned from an async function with return type 'FutureOr<A>' because 'FutureOr<A>' is not nullable.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+      return null; // Error.
+             ^" in null as{TypeError,ForNonNullableByDefault} self::A;
+    }
+    else {
+      return let final<BottomType> #t23 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:79:18: Error: A value of type 'Future<Null>' can't be returned from an async function with return type 'FutureOr<A>'.
+ - 'Future' is from 'dart:async'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+      return new Future<Null>.value(null); // Error.
+                 ^" in asy::Future::value<Null>(null) as{TypeError,ForNonNullableByDefault} self::A;
+    }
+  }
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = self::A {}
+}
diff --git a/pkg/front_end/testcases/nnbd/assignability_error_messages.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/assignability_error_messages.dart.strong.transformed.expect
new file mode 100644
index 0000000..2c1bc3e
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/assignability_error_messages.dart.strong.transformed.expect
@@ -0,0 +1,473 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:27:14: Error: The argument type 'B?' can't be assigned to the parameter type 'A' because 'B?' is nullable and 'A' isn't.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   fooContext(x); // Error.
+//              ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:28:9: Error: A value of type 'B?' can't be assigned to a variable of type 'A' because 'B?' is nullable and 'A' isn't.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   A a = x; // Error.
+//         ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:29:10: Error: Can't assign spread elements of type 'B?' to collection elements of type 'A' because 'B?' is nullable and 'A' isn't.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   <A>[...l]; // Error.
+//          ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:30:10: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//   <A>[...l2]; // Error.
+//          ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:31:13: Error: Can't assign spread entry keys of type 'B?' to map entry keys of type 'A' because 'B?' is nullable and 'A' isn't.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   <A, A>{...m}; // Error.
+//             ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:31:13: Error: Can't assign spread entry values of type 'B?' to map entry values of type 'A' because 'B?' is nullable and 'A' isn't.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   <A, A>{...m}; // Error.
+//             ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:32:13: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//   <A, A>{...m2}; // Error.
+//             ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:33:10: Error: A value of type 'B?' can't be assigned to a variable of type 'A' because 'B?' is nullable and 'A' isn't.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+// Try changing the type of the variable.
+//   for (A y in l) {} // Error.
+//          ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:34:15: Error: The type 'List<B>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'List<B>?' is nullable and 'Iterable<dynamic>' isn't.
+//  - 'List' is from 'dart:core'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'Iterable' is from 'dart:core'.
+//   for (A y in l2) {} // Error.
+//               ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:36:16: Error: Type 'A' of the case expression is not a subtype of type 'B?' of this switch expression.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//     case const A():
+//                ^
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:35:11: Context: The switch expression is here.
+//   switch (x) /*  Error. */ {
+//           ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:43:14: Error: A value of type 'B?' can't be returned from an async function with return type 'FutureOr<A>' because 'B?' is nullable and 'FutureOr<A>' isn't.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//       return x; // Error.
+//              ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:45:18: Error: A value of type 'Future<B?>' can't be returned from an async function with return type 'FutureOr<A>'.
+//  - 'Future' is from 'dart:async'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//       return new Future<B?>.value(x); // Error.
+//                  ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:49:10: Error: A value of type 'B?' can't be returned from a function with return type 'A' because 'B?' is nullable and 'A' isn't.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   return x; // Error.
+//          ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:53:14: Error: The argument type 'List<B?>' can't be assigned to the parameter type 'List<A>' because 'B?' is nullable and 'A' isn't.
+//  - 'List' is from 'dart:core'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   barContext(x); // Error.
+//              ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:54:15: Error: A value of type 'List<B?>' can't be assigned to a variable of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+//  - 'List' is from 'dart:core'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   List<A> y = x; // Error.
+//               ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:55:16: Error: Can't assign spread elements of type 'List<B?>' to collection elements of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+//  - 'List' is from 'dart:core'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   <List<A>>[...l]; // Error.
+//                ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:56:25: Error: Can't assign spread entry keys of type 'List<B?>' to map entry keys of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+//  - 'List' is from 'dart:core'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   <List<A>, List<A>>{...m}; // Error.
+//                         ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:56:25: Error: Can't assign spread entry values of type 'List<B?>' to map entry values of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+//  - 'List' is from 'dart:core'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   <List<A>, List<A>>{...m}; // Error.
+//                         ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:57:16: Error: A value of type 'List<B?>' can't be assigned to a variable of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+//  - 'List' is from 'dart:core'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+// Try changing the type of the variable.
+//   for (List<A> y in l) {} // Error.
+//                ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:58:10: Error: A value of type 'List<B?>' can't be returned from a function with return type 'List<A>' because 'B?' is nullable and 'A' isn't.
+//  - 'List' is from 'dart:core'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   return x; // Error.
+//          ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:62:14: Error: The argument type 'num? Function()' can't be assigned to the parameter type 'num Function()' because 'num?' is nullable and 'num' isn't.
+//   bazContext(c);
+//              ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:66:14: Error: The argument type 'Null' can't be assigned to the parameter type 'A' because 'A' is not nullable.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   fooContext(x); // Error.
+//              ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:67:14: Error: The value 'null' can't be assigned to the parameter type 'A' because 'A' is not nullable.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   fooContext(null); // Error.
+//              ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:68:10: Error: A value of type 'Null' can't be assigned to a variable of type 'A' because 'A' is not nullable.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   A a1 = x; // Error.
+//          ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:69:10: Error: The value 'null' can't be assigned to a variable of type 'A' because 'A' is not nullable.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   A a2 = null; // Error.
+//          ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:71:12: Error: A value of type 'Null' can't be returned from a function with return type 'A' because 'A' is not nullable.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//     return x; // Error.
+//            ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:73:12: Error: The value 'null' can't be returned from a function with return type 'A' because 'A' is not nullable.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//     return null; // Error.
+//            ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:77:14: Error: The value 'null' can't be returned from an async function with return type 'FutureOr<A>' because 'FutureOr<A>' is not nullable.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//       return null; // Error.
+//              ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:79:18: Error: A value of type 'Future<Null>' can't be returned from an async function with return type 'FutureOr<A>'.
+//  - 'Future' is from 'dart:async'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//       return new Future<Null>.value(null); // Error.
+//                  ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+class A extends core::Object /*hasConstConstructor*/  {
+  const constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class B extends self::A {
+  synthetic constructor •() → self::B
+    : super self::A::•()
+    ;
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  method call() → core::num? {}
+}
+static method fooContext(self::A x) → void {}
+static method barContext(core::List<self::A> x) → void {}
+static method bazContext(() → core::num f) → void {}
+static method foo(self::B? x, core::List<self::B?> l, core::Map<self::B?, self::B?> m, core::List<self::B>? l2, core::Map<self::B, self::B>? m2) → self::A {
+  self::fooContext(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:27:14: Error: The argument type 'B?' can't be assigned to the parameter type 'A' because 'B?' is nullable and 'A' isn't.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  fooContext(x); // Error.
+             ^" in let self::B? #t2 = x in #t2.==(null) ?{self::A} #t2 as{TypeError,ForNonNullableByDefault} self::A : #t2{self::A});
+  self::A a = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:28:9: Error: A value of type 'B?' can't be assigned to a variable of type 'A' because 'B?' is nullable and 'A' isn't.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  A a = x; // Error.
+        ^" in let self::B? #t4 = x in #t4.==(null) ?{self::A} #t4 as{TypeError,ForNonNullableByDefault} self::A : #t4{self::A};
+  <self::A>[invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:29:10: Error: Can't assign spread elements of type 'B?' to collection elements of type 'A' because 'B?' is nullable and 'A' isn't.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  <A>[...l]; // Error.
+         ^"];
+  <self::A>[invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:30:10: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+  <A>[...l2]; // Error.
+         ^"];
+  <self::A, self::A>{invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:31:13: Error: Can't assign spread entry keys of type 'B?' to map entry keys of type 'A' because 'B?' is nullable and 'A' isn't.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  <A, A>{...m}; // Error.
+            ^": invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:31:13: Error: Can't assign spread entry values of type 'B?' to map entry values of type 'A' because 'B?' is nullable and 'A' isn't.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  <A, A>{...m}; // Error.
+            ^"};
+  <self::A, self::A>{invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:32:13: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+  <A, A>{...m2}; // Error.
+            ^": null};
+  {
+    core::Iterator<self::B?> :sync-for-iterator = l.{core::Iterable::iterator};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+      final self::B? #t5 = :sync-for-iterator.{core::Iterator::current};
+      {
+        self::A y = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:33:10: Error: A value of type 'B?' can't be assigned to a variable of type 'A' because 'B?' is nullable and 'A' isn't.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+Try changing the type of the variable.
+  for (A y in l) {} // Error.
+         ^" in let self::B? #t7 = #t5 in #t7.==(null) ?{self::A} #t7 as{TypeError,ForNonNullableByDefault} self::A : #t7{self::A};
+      }
+    }
+  }
+  {
+    core::Iterator<dynamic> :sync-for-iterator = (let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:34:15: Error: The type 'List<B>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'List<B>?' is nullable and 'Iterable<dynamic>' isn't.
+ - 'List' is from 'dart:core'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'Iterable' is from 'dart:core'.
+  for (A y in l2) {} // Error.
+              ^" in let core::List<self::B>? #t9 = l2 in #t9.==(null) ?{core::Iterable<dynamic>} #t9 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic> : #t9{core::Iterable<dynamic>}).{core::Iterable::iterator};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+      self::A y = :sync-for-iterator.{core::Iterator::current};
+      {}
+    }
+  }
+  #L1:
+  switch(x) {
+    #L2:
+    case #C1:
+      {
+        break #L1;
+      }
+    #L3:
+    default:
+      {
+        break #L1;
+      }
+  }
+  function local() → FutureOr<self::A> /* originally async */ {
+    final asy::_Future<self::A> :async_future = new asy::_Future::•<self::A>();
+    core::bool* :is_sync = false;
+    FutureOr<self::A>? :return_value;
+    dynamic :async_stack_trace;
+    (dynamic) → dynamic :async_op_then;
+    (core::Object, core::StackTrace) → dynamic :async_op_error;
+    core::int :await_jump_var = 0;
+    dynamic :await_ctx_var;
+    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+      try {
+        #L4:
+        {
+          if(true) {
+            :return_value = let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:43:14: Error: A value of type 'B?' can't be returned from an async function with return type 'FutureOr<A>' because 'B?' is nullable and 'FutureOr<A>' isn't.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+      return x; // Error.
+             ^" in let self::B? #t11 = x in #t11.==(null) ?{self::A} #t11 as{TypeError,ForNonNullableByDefault} self::A : #t11{self::A};
+            break #L4;
+          }
+          else {
+            :return_value = let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:45:18: Error: A value of type 'Future<B?>' can't be returned from an async function with return type 'FutureOr<A>'.
+ - 'Future' is from 'dart:async'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+      return new Future<B?>.value(x); // Error.
+                 ^" in asy::Future::value<self::B?>(x) as{TypeError,ForNonNullableByDefault} self::A;
+            break #L4;
+          }
+        }
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
+        return;
+      }
+      on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
+      }
+    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
+  }
+  return let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:49:10: Error: A value of type 'B?' can't be returned from a function with return type 'A' because 'B?' is nullable and 'A' isn't.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  return x; // Error.
+         ^" in let self::B? #t14 = x in #t14.==(null) ?{self::A} #t14 as{TypeError,ForNonNullableByDefault} self::A : #t14{self::A};
+}
+static method bar(core::List<self::B?> x, core::List<core::List<self::B?>> l, core::Map<core::List<self::B?>, core::List<self::B?>> m) → core::List<self::A> {
+  self::barContext(let final<BottomType> #t15 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:53:14: Error: The argument type 'List<B?>' can't be assigned to the parameter type 'List<A>' because 'B?' is nullable and 'A' isn't.
+ - 'List' is from 'dart:core'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  barContext(x); // Error.
+             ^" in x as{TypeError,ForNonNullableByDefault} core::List<self::A>);
+  core::List<self::A> y = let final<BottomType> #t16 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:54:15: Error: A value of type 'List<B?>' can't be assigned to a variable of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+ - 'List' is from 'dart:core'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  List<A> y = x; // Error.
+              ^" in x as{TypeError,ForNonNullableByDefault} core::List<self::A>;
+  <core::List<self::A>>[invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:55:16: Error: Can't assign spread elements of type 'List<B?>' to collection elements of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+ - 'List' is from 'dart:core'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  <List<A>>[...l]; // Error.
+               ^"];
+  <core::List<self::A>, core::List<self::A>>{invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:56:25: Error: Can't assign spread entry keys of type 'List<B?>' to map entry keys of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+ - 'List' is from 'dart:core'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  <List<A>, List<A>>{...m}; // Error.
+                        ^": invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:56:25: Error: Can't assign spread entry values of type 'List<B?>' to map entry values of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+ - 'List' is from 'dart:core'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  <List<A>, List<A>>{...m}; // Error.
+                        ^"};
+  {
+    core::Iterator<core::List<self::B?>> :sync-for-iterator = l.{core::Iterable::iterator};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+      final core::List<self::B?> #t17 = :sync-for-iterator.{core::Iterator::current};
+      {
+        core::List<self::A> y = let final<BottomType> #t18 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:57:16: Error: A value of type 'List<B?>' can't be assigned to a variable of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+ - 'List' is from 'dart:core'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+Try changing the type of the variable.
+  for (List<A> y in l) {} // Error.
+               ^" in #t17 as{TypeError,ForNonNullableByDefault} core::List<self::A>;
+      }
+    }
+  }
+  return let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:58:10: Error: A value of type 'List<B?>' can't be returned from a function with return type 'List<A>' because 'B?' is nullable and 'A' isn't.
+ - 'List' is from 'dart:core'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  return x; // Error.
+         ^" in x as{TypeError,ForNonNullableByDefault} core::List<self::A>;
+}
+static method baz(self::C c) → void {
+  self::bazContext(let final<BottomType> #t20 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:62:14: Error: The argument type 'num? Function()' can't be assigned to the parameter type 'num Function()' because 'num?' is nullable and 'num' isn't.
+  bazContext(c);
+             ^" in (let final self::C #t21 = c in #t21.==(null) ?{() → core::num?} null : #t21.{self::C::call}) as{TypeError,ForNonNullableByDefault} () → core::num);
+}
+static method boz(Null x) → self::A {
+  self::fooContext(let final<BottomType> #t22 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:66:14: Error: The argument type 'Null' can't be assigned to the parameter type 'A' because 'A' is not nullable.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  fooContext(x); // Error.
+             ^" in let Null #t23 = x in #t23.==(null) ?{self::A} #t23 as{TypeError,ForNonNullableByDefault} self::A : #t23{self::A});
+  self::fooContext(let final<BottomType> #t24 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:67:14: Error: The value 'null' can't be assigned to the parameter type 'A' because 'A' is not nullable.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  fooContext(null); // Error.
+             ^" in let Null #t25 = null in #t25.==(null) ?{self::A} #t25 as{TypeError,ForNonNullableByDefault} self::A : #t25{self::A});
+  self::A a1 = let final<BottomType> #t26 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:68:10: Error: A value of type 'Null' can't be assigned to a variable of type 'A' because 'A' is not nullable.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  A a1 = x; // Error.
+         ^" in let Null #t27 = x in #t27.==(null) ?{self::A} #t27 as{TypeError,ForNonNullableByDefault} self::A : #t27{self::A};
+  self::A a2 = let final<BottomType> #t28 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:69:10: Error: The value 'null' can't be assigned to a variable of type 'A' because 'A' is not nullable.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  A a2 = null; // Error.
+         ^" in let Null #t29 = null in #t29.==(null) ?{self::A} #t29 as{TypeError,ForNonNullableByDefault} self::A : #t29{self::A};
+  if(true) {
+    return let final<BottomType> #t30 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:71:12: Error: A value of type 'Null' can't be returned from a function with return type 'A' because 'A' is not nullable.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+    return x; // Error.
+           ^" in let Null #t31 = x in #t31.==(null) ?{self::A} #t31 as{TypeError,ForNonNullableByDefault} self::A : #t31{self::A};
+  }
+  else {
+    return let final<BottomType> #t32 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:73:12: Error: The value 'null' can't be returned from a function with return type 'A' because 'A' is not nullable.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+    return null; // Error.
+           ^" in let Null #t33 = null in #t33.==(null) ?{self::A} #t33 as{TypeError,ForNonNullableByDefault} self::A : #t33{self::A};
+  }
+  function local() → FutureOr<self::A> /* originally async */ {
+    final asy::_Future<self::A> :async_future = new asy::_Future::•<self::A>();
+    core::bool* :is_sync = false;
+    FutureOr<self::A>? :return_value;
+    dynamic :async_stack_trace;
+    (dynamic) → dynamic :async_op_then;
+    (core::Object, core::StackTrace) → dynamic :async_op_error;
+    core::int :await_jump_var = 0;
+    dynamic :await_ctx_var;
+    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+      try {
+        #L5:
+        {
+          if(true) {
+            :return_value = let final<BottomType> #t34 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:77:14: Error: The value 'null' can't be returned from an async function with return type 'FutureOr<A>' because 'FutureOr<A>' is not nullable.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+      return null; // Error.
+             ^" in let Null #t35 = null in #t35.==(null) ?{self::A} #t35 as{TypeError,ForNonNullableByDefault} self::A : #t35{self::A};
+            break #L5;
+          }
+          else {
+            :return_value = let final<BottomType> #t36 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:79:18: Error: A value of type 'Future<Null>' can't be returned from an async function with return type 'FutureOr<A>'.
+ - 'Future' is from 'dart:async'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+      return new Future<Null>.value(null); // Error.
+                 ^" in asy::Future::value<Null>(null) as{TypeError,ForNonNullableByDefault} self::A;
+            break #L5;
+          }
+        }
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
+        return;
+      }
+      on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
+      }
+    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
+  }
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = self::A {}
+}
+
+Extra constant evaluation status:
+Evaluated: MethodInvocation @ org-dartlang-testcase:///assignability_error_messages.dart:67:14 -> BoolConstant(true)
+Evaluated: VariableGet @ org-dartlang-testcase:///assignability_error_messages.dart:67:14 -> NullConstant(null)
+Evaluated: VariableGet @ org-dartlang-testcase:///assignability_error_messages.dart:67:14 -> NullConstant(null)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///assignability_error_messages.dart:69:10 -> BoolConstant(true)
+Evaluated: VariableGet @ org-dartlang-testcase:///assignability_error_messages.dart:69:10 -> NullConstant(null)
+Evaluated: VariableGet @ org-dartlang-testcase:///assignability_error_messages.dart:69:10 -> NullConstant(null)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///assignability_error_messages.dart:73:12 -> BoolConstant(true)
+Evaluated: VariableGet @ org-dartlang-testcase:///assignability_error_messages.dart:73:12 -> NullConstant(null)
+Evaluated: VariableGet @ org-dartlang-testcase:///assignability_error_messages.dart:73:12 -> NullConstant(null)
+Evaluated: MethodInvocation @ org-dartlang-testcase:///assignability_error_messages.dart:77:14 -> BoolConstant(true)
+Evaluated: VariableGet @ org-dartlang-testcase:///assignability_error_messages.dart:77:14 -> NullConstant(null)
+Evaluated: VariableGet @ org-dartlang-testcase:///assignability_error_messages.dart:77:14 -> NullConstant(null)
+Extra constant evaluation: evaluated: 216, effectively constant: 12
diff --git a/pkg/front_end/testcases/nnbd/assignability_error_messages.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd/assignability_error_messages.dart.textual_outline.expect
new file mode 100644
index 0000000..77c6443
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/assignability_error_messages.dart.textual_outline.expect
@@ -0,0 +1,20 @@
+import 'dart:async';
+
+class A {
+  const A();
+}
+
+class B extends A {}
+
+class C {
+  num? call() {}
+}
+
+void fooContext(A x) {}
+void barContext(List<A> x) {}
+void bazContext(num Function() f) {}
+A foo(B? x, List<B?> l, Map<B?, B?> m, List<B>? l2, Map<B, B>? m2) {}
+List<A> bar(List<B?> x, List<List<B?>> l, Map<List<B?>, List<B?>> m) {}
+void baz(C c) {}
+A boz(Null x) {}
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/assignability_error_messages.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/nnbd/assignability_error_messages.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..ade5e0b
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/assignability_error_messages.dart.textual_outline_modelled.expect
@@ -0,0 +1,21 @@
+import 'dart:async';
+
+A boz(Null x) {}
+A foo(B? x, List<B?> l, Map<B?, B?> m, List<B>? l2, Map<B, B>? m2) {}
+List<A> bar(List<B?> x, List<List<B?>> l, Map<List<B?>, List<B?>> m) {}
+
+class A {
+  const A();
+}
+
+class B extends A {}
+
+class C {
+  num? call() {}
+}
+
+main() {}
+void barContext(List<A> x) {}
+void baz(C c) {}
+void bazContext(num Function() f) {}
+void fooContext(A x) {}
diff --git a/pkg/front_end/testcases/nnbd/assignability_error_messages.dart.weak.expect b/pkg/front_end/testcases/nnbd/assignability_error_messages.dart.weak.expect
new file mode 100644
index 0000000..a4b4cdc
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/assignability_error_messages.dart.weak.expect
@@ -0,0 +1,387 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:27:14: Error: The argument type 'B?' can't be assigned to the parameter type 'A' because 'B?' is nullable and 'A' isn't.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   fooContext(x); // Error.
+//              ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:28:9: Error: A value of type 'B?' can't be assigned to a variable of type 'A' because 'B?' is nullable and 'A' isn't.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   A a = x; // Error.
+//         ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:29:10: Error: Can't assign spread elements of type 'B?' to collection elements of type 'A' because 'B?' is nullable and 'A' isn't.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   <A>[...l]; // Error.
+//          ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:30:10: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//   <A>[...l2]; // Error.
+//          ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:31:13: Error: Can't assign spread entry keys of type 'B?' to map entry keys of type 'A' because 'B?' is nullable and 'A' isn't.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   <A, A>{...m}; // Error.
+//             ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:31:13: Error: Can't assign spread entry values of type 'B?' to map entry values of type 'A' because 'B?' is nullable and 'A' isn't.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   <A, A>{...m}; // Error.
+//             ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:32:13: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//   <A, A>{...m2}; // Error.
+//             ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:33:10: Error: A value of type 'B?' can't be assigned to a variable of type 'A' because 'B?' is nullable and 'A' isn't.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+// Try changing the type of the variable.
+//   for (A y in l) {} // Error.
+//          ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:34:15: Error: The type 'List<B>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'List<B>?' is nullable and 'Iterable<dynamic>' isn't.
+//  - 'List' is from 'dart:core'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'Iterable' is from 'dart:core'.
+//   for (A y in l2) {} // Error.
+//               ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:36:16: Error: Type 'A' of the case expression is not a subtype of type 'B?' of this switch expression.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//     case const A():
+//                ^
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:35:11: Context: The switch expression is here.
+//   switch (x) /*  Error. */ {
+//           ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:43:14: Error: A value of type 'B?' can't be returned from an async function with return type 'FutureOr<A>' because 'B?' is nullable and 'FutureOr<A>' isn't.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//       return x; // Error.
+//              ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:45:18: Error: A value of type 'Future<B?>' can't be returned from an async function with return type 'FutureOr<A>'.
+//  - 'Future' is from 'dart:async'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//       return new Future<B?>.value(x); // Error.
+//                  ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:49:10: Error: A value of type 'B?' can't be returned from a function with return type 'A' because 'B?' is nullable and 'A' isn't.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   return x; // Error.
+//          ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:53:14: Error: The argument type 'List<B?>' can't be assigned to the parameter type 'List<A>' because 'B?' is nullable and 'A' isn't.
+//  - 'List' is from 'dart:core'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   barContext(x); // Error.
+//              ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:54:15: Error: A value of type 'List<B?>' can't be assigned to a variable of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+//  - 'List' is from 'dart:core'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   List<A> y = x; // Error.
+//               ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:55:16: Error: Can't assign spread elements of type 'List<B?>' to collection elements of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+//  - 'List' is from 'dart:core'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   <List<A>>[...l]; // Error.
+//                ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:56:25: Error: Can't assign spread entry keys of type 'List<B?>' to map entry keys of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+//  - 'List' is from 'dart:core'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   <List<A>, List<A>>{...m}; // Error.
+//                         ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:56:25: Error: Can't assign spread entry values of type 'List<B?>' to map entry values of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+//  - 'List' is from 'dart:core'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   <List<A>, List<A>>{...m}; // Error.
+//                         ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:57:16: Error: A value of type 'List<B?>' can't be assigned to a variable of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+//  - 'List' is from 'dart:core'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+// Try changing the type of the variable.
+//   for (List<A> y in l) {} // Error.
+//                ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:58:10: Error: A value of type 'List<B?>' can't be returned from a function with return type 'List<A>' because 'B?' is nullable and 'A' isn't.
+//  - 'List' is from 'dart:core'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   return x; // Error.
+//          ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:62:14: Error: The argument type 'num? Function()' can't be assigned to the parameter type 'num Function()' because 'num?' is nullable and 'num' isn't.
+//   bazContext(c);
+//              ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:66:14: Error: The argument type 'Null' can't be assigned to the parameter type 'A' because 'A' is not nullable.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   fooContext(x); // Error.
+//              ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:67:14: Error: The value 'null' can't be assigned to the parameter type 'A' because 'A' is not nullable.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   fooContext(null); // Error.
+//              ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:68:10: Error: A value of type 'Null' can't be assigned to a variable of type 'A' because 'A' is not nullable.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   A a1 = x; // Error.
+//          ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:69:10: Error: The value 'null' can't be assigned to a variable of type 'A' because 'A' is not nullable.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   A a2 = null; // Error.
+//          ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:71:12: Error: A value of type 'Null' can't be returned from a function with return type 'A' because 'A' is not nullable.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//     return x; // Error.
+//            ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:73:12: Error: The value 'null' can't be returned from a function with return type 'A' because 'A' is not nullable.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//     return null; // Error.
+//            ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:77:14: Error: The value 'null' can't be returned from an async function with return type 'FutureOr<A>' because 'FutureOr<A>' is not nullable.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//       return null; // Error.
+//              ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:79:18: Error: A value of type 'Future<Null>' can't be returned from an async function with return type 'FutureOr<A>'.
+//  - 'Future' is from 'dart:async'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//       return new Future<Null>.value(null); // Error.
+//                  ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+class A extends core::Object /*hasConstConstructor*/  {
+  const constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class B extends self::A {
+  synthetic constructor •() → self::B
+    : super self::A::•()
+    ;
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  method call() → core::num? {}
+}
+static method fooContext(self::A x) → void {}
+static method barContext(core::List<self::A> x) → void {}
+static method bazContext(() → core::num f) → void {}
+static method foo(self::B? x, core::List<self::B?> l, core::Map<self::B?, self::B?> m, core::List<self::B>? l2, core::Map<self::B, self::B>? m2) → self::A {
+  self::fooContext(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:27:14: Error: The argument type 'B?' can't be assigned to the parameter type 'A' because 'B?' is nullable and 'A' isn't.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  fooContext(x); // Error.
+             ^" in x as{TypeError,ForNonNullableByDefault} self::A);
+  self::A a = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:28:9: Error: A value of type 'B?' can't be assigned to a variable of type 'A' because 'B?' is nullable and 'A' isn't.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  A a = x; // Error.
+        ^" in x as{TypeError,ForNonNullableByDefault} self::A;
+  <self::A>[invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:29:10: Error: Can't assign spread elements of type 'B?' to collection elements of type 'A' because 'B?' is nullable and 'A' isn't.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  <A>[...l]; // Error.
+         ^"];
+  <self::A>[invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:30:10: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+  <A>[...l2]; // Error.
+         ^"];
+  <self::A, self::A>{invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:31:13: Error: Can't assign spread entry keys of type 'B?' to map entry keys of type 'A' because 'B?' is nullable and 'A' isn't.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  <A, A>{...m}; // Error.
+            ^": invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:31:13: Error: Can't assign spread entry values of type 'B?' to map entry values of type 'A' because 'B?' is nullable and 'A' isn't.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  <A, A>{...m}; // Error.
+            ^"};
+  <self::A, self::A>{invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:32:13: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+  <A, A>{...m2}; // Error.
+            ^": null};
+  for (final self::B? #t3 in l) {
+    self::A y = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:33:10: Error: A value of type 'B?' can't be assigned to a variable of type 'A' because 'B?' is nullable and 'A' isn't.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+Try changing the type of the variable.
+  for (A y in l) {} // Error.
+         ^" in #t3 as{TypeError,ForNonNullableByDefault} self::A;
+  }
+  for (self::A y in let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:34:15: Error: The type 'List<B>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'List<B>?' is nullable and 'Iterable<dynamic>' isn't.
+ - 'List' is from 'dart:core'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'Iterable' is from 'dart:core'.
+  for (A y in l2) {} // Error.
+              ^" in l2 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic>) {
+  }
+  #L1:
+  switch(x) {
+    #L2:
+    case #C1:
+      {
+        break #L1;
+      }
+    #L3:
+    default:
+      {
+        break #L1;
+      }
+  }
+  function local() → FutureOr<self::A> async {
+    if(true) {
+      return let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:43:14: Error: A value of type 'B?' can't be returned from an async function with return type 'FutureOr<A>' because 'B?' is nullable and 'FutureOr<A>' isn't.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+      return x; // Error.
+             ^" in x as{TypeError,ForNonNullableByDefault} self::A;
+    }
+    else {
+      return let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:45:18: Error: A value of type 'Future<B?>' can't be returned from an async function with return type 'FutureOr<A>'.
+ - 'Future' is from 'dart:async'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+      return new Future<B?>.value(x); // Error.
+                 ^" in asy::Future::value<self::B?>(x) as{TypeError,ForNonNullableByDefault} self::A;
+    }
+  }
+  return let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:49:10: Error: A value of type 'B?' can't be returned from a function with return type 'A' because 'B?' is nullable and 'A' isn't.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  return x; // Error.
+         ^" in x as{TypeError,ForNonNullableByDefault} self::A;
+}
+static method bar(core::List<self::B?> x, core::List<core::List<self::B?>> l, core::Map<core::List<self::B?>, core::List<self::B?>> m) → core::List<self::A> {
+  self::barContext(let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:53:14: Error: The argument type 'List<B?>' can't be assigned to the parameter type 'List<A>' because 'B?' is nullable and 'A' isn't.
+ - 'List' is from 'dart:core'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  barContext(x); // Error.
+             ^" in x as{TypeError,ForNonNullableByDefault} core::List<self::A>);
+  core::List<self::A> y = let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:54:15: Error: A value of type 'List<B?>' can't be assigned to a variable of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+ - 'List' is from 'dart:core'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  List<A> y = x; // Error.
+              ^" in x as{TypeError,ForNonNullableByDefault} core::List<self::A>;
+  <core::List<self::A>>[invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:55:16: Error: Can't assign spread elements of type 'List<B?>' to collection elements of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+ - 'List' is from 'dart:core'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  <List<A>>[...l]; // Error.
+               ^"];
+  <core::List<self::A>, core::List<self::A>>{invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:56:25: Error: Can't assign spread entry keys of type 'List<B?>' to map entry keys of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+ - 'List' is from 'dart:core'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  <List<A>, List<A>>{...m}; // Error.
+                        ^": invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:56:25: Error: Can't assign spread entry values of type 'List<B?>' to map entry values of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+ - 'List' is from 'dart:core'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  <List<A>, List<A>>{...m}; // Error.
+                        ^"};
+  for (final core::List<self::B?> #t11 in l) {
+    core::List<self::A> y = let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:57:16: Error: A value of type 'List<B?>' can't be assigned to a variable of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+ - 'List' is from 'dart:core'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+Try changing the type of the variable.
+  for (List<A> y in l) {} // Error.
+               ^" in #t11 as{TypeError,ForNonNullableByDefault} core::List<self::A>;
+  }
+  return let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:58:10: Error: A value of type 'List<B?>' can't be returned from a function with return type 'List<A>' because 'B?' is nullable and 'A' isn't.
+ - 'List' is from 'dart:core'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  return x; // Error.
+         ^" in x as{TypeError,ForNonNullableByDefault} core::List<self::A>;
+}
+static method baz(self::C c) → void {
+  self::bazContext(let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:62:14: Error: The argument type 'num? Function()' can't be assigned to the parameter type 'num Function()' because 'num?' is nullable and 'num' isn't.
+  bazContext(c);
+             ^" in (let final self::C #t15 = c in #t15.==(null) ?{() → core::num?} null : #t15.{self::C::call}) as{TypeError,ForNonNullableByDefault} () → core::num);
+}
+static method boz(Null x) → self::A {
+  self::fooContext(let final<BottomType> #t16 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:66:14: Error: The argument type 'Null' can't be assigned to the parameter type 'A' because 'A' is not nullable.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  fooContext(x); // Error.
+             ^" in x as{TypeError,ForNonNullableByDefault} self::A);
+  self::fooContext(let final<BottomType> #t17 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:67:14: Error: The value 'null' can't be assigned to the parameter type 'A' because 'A' is not nullable.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  fooContext(null); // Error.
+             ^" in null as{TypeError,ForNonNullableByDefault} self::A);
+  self::A a1 = let final<BottomType> #t18 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:68:10: Error: A value of type 'Null' can't be assigned to a variable of type 'A' because 'A' is not nullable.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  A a1 = x; // Error.
+         ^" in x as{TypeError,ForNonNullableByDefault} self::A;
+  self::A a2 = let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:69:10: Error: The value 'null' can't be assigned to a variable of type 'A' because 'A' is not nullable.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  A a2 = null; // Error.
+         ^" in null as{TypeError,ForNonNullableByDefault} self::A;
+  if(true) {
+    return let final<BottomType> #t20 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:71:12: Error: A value of type 'Null' can't be returned from a function with return type 'A' because 'A' is not nullable.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+    return x; // Error.
+           ^" in x as{TypeError,ForNonNullableByDefault} self::A;
+  }
+  else {
+    return let final<BottomType> #t21 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:73:12: Error: The value 'null' can't be returned from a function with return type 'A' because 'A' is not nullable.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+    return null; // Error.
+           ^" in null as{TypeError,ForNonNullableByDefault} self::A;
+  }
+  function local() → FutureOr<self::A> async {
+    if(true) {
+      return let final<BottomType> #t22 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:77:14: Error: The value 'null' can't be returned from an async function with return type 'FutureOr<A>' because 'FutureOr<A>' is not nullable.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+      return null; // Error.
+             ^" in null as{TypeError,ForNonNullableByDefault} self::A;
+    }
+    else {
+      return let final<BottomType> #t23 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:79:18: Error: A value of type 'Future<Null>' can't be returned from an async function with return type 'FutureOr<A>'.
+ - 'Future' is from 'dart:async'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+      return new Future<Null>.value(null); // Error.
+                 ^" in asy::Future::value<Null>(null) as{TypeError,ForNonNullableByDefault} self::A;
+    }
+  }
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = self::A {}
+}
diff --git a/pkg/front_end/testcases/nnbd/assignability_error_messages.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/assignability_error_messages.dart.weak.transformed.expect
new file mode 100644
index 0000000..a63f3a4
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/assignability_error_messages.dart.weak.transformed.expect
@@ -0,0 +1,458 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:27:14: Error: The argument type 'B?' can't be assigned to the parameter type 'A' because 'B?' is nullable and 'A' isn't.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   fooContext(x); // Error.
+//              ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:28:9: Error: A value of type 'B?' can't be assigned to a variable of type 'A' because 'B?' is nullable and 'A' isn't.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   A a = x; // Error.
+//         ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:29:10: Error: Can't assign spread elements of type 'B?' to collection elements of type 'A' because 'B?' is nullable and 'A' isn't.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   <A>[...l]; // Error.
+//          ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:30:10: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//   <A>[...l2]; // Error.
+//          ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:31:13: Error: Can't assign spread entry keys of type 'B?' to map entry keys of type 'A' because 'B?' is nullable and 'A' isn't.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   <A, A>{...m}; // Error.
+//             ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:31:13: Error: Can't assign spread entry values of type 'B?' to map entry values of type 'A' because 'B?' is nullable and 'A' isn't.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   <A, A>{...m}; // Error.
+//             ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:32:13: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//   <A, A>{...m2}; // Error.
+//             ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:33:10: Error: A value of type 'B?' can't be assigned to a variable of type 'A' because 'B?' is nullable and 'A' isn't.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+// Try changing the type of the variable.
+//   for (A y in l) {} // Error.
+//          ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:34:15: Error: The type 'List<B>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'List<B>?' is nullable and 'Iterable<dynamic>' isn't.
+//  - 'List' is from 'dart:core'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'Iterable' is from 'dart:core'.
+//   for (A y in l2) {} // Error.
+//               ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:36:16: Error: Type 'A' of the case expression is not a subtype of type 'B?' of this switch expression.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//     case const A():
+//                ^
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:35:11: Context: The switch expression is here.
+//   switch (x) /*  Error. */ {
+//           ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:43:14: Error: A value of type 'B?' can't be returned from an async function with return type 'FutureOr<A>' because 'B?' is nullable and 'FutureOr<A>' isn't.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//       return x; // Error.
+//              ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:45:18: Error: A value of type 'Future<B?>' can't be returned from an async function with return type 'FutureOr<A>'.
+//  - 'Future' is from 'dart:async'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//       return new Future<B?>.value(x); // Error.
+//                  ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:49:10: Error: A value of type 'B?' can't be returned from a function with return type 'A' because 'B?' is nullable and 'A' isn't.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   return x; // Error.
+//          ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:53:14: Error: The argument type 'List<B?>' can't be assigned to the parameter type 'List<A>' because 'B?' is nullable and 'A' isn't.
+//  - 'List' is from 'dart:core'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   barContext(x); // Error.
+//              ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:54:15: Error: A value of type 'List<B?>' can't be assigned to a variable of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+//  - 'List' is from 'dart:core'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   List<A> y = x; // Error.
+//               ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:55:16: Error: Can't assign spread elements of type 'List<B?>' to collection elements of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+//  - 'List' is from 'dart:core'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   <List<A>>[...l]; // Error.
+//                ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:56:25: Error: Can't assign spread entry keys of type 'List<B?>' to map entry keys of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+//  - 'List' is from 'dart:core'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   <List<A>, List<A>>{...m}; // Error.
+//                         ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:56:25: Error: Can't assign spread entry values of type 'List<B?>' to map entry values of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+//  - 'List' is from 'dart:core'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   <List<A>, List<A>>{...m}; // Error.
+//                         ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:57:16: Error: A value of type 'List<B?>' can't be assigned to a variable of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+//  - 'List' is from 'dart:core'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+// Try changing the type of the variable.
+//   for (List<A> y in l) {} // Error.
+//                ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:58:10: Error: A value of type 'List<B?>' can't be returned from a function with return type 'List<A>' because 'B?' is nullable and 'A' isn't.
+//  - 'List' is from 'dart:core'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   return x; // Error.
+//          ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:62:14: Error: The argument type 'num? Function()' can't be assigned to the parameter type 'num Function()' because 'num?' is nullable and 'num' isn't.
+//   bazContext(c);
+//              ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:66:14: Error: The argument type 'Null' can't be assigned to the parameter type 'A' because 'A' is not nullable.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   fooContext(x); // Error.
+//              ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:67:14: Error: The value 'null' can't be assigned to the parameter type 'A' because 'A' is not nullable.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   fooContext(null); // Error.
+//              ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:68:10: Error: A value of type 'Null' can't be assigned to a variable of type 'A' because 'A' is not nullable.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   A a1 = x; // Error.
+//          ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:69:10: Error: The value 'null' can't be assigned to a variable of type 'A' because 'A' is not nullable.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   A a2 = null; // Error.
+//          ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:71:12: Error: A value of type 'Null' can't be returned from a function with return type 'A' because 'A' is not nullable.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//     return x; // Error.
+//            ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:73:12: Error: The value 'null' can't be returned from a function with return type 'A' because 'A' is not nullable.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//     return null; // Error.
+//            ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:77:14: Error: The value 'null' can't be returned from an async function with return type 'FutureOr<A>' because 'FutureOr<A>' is not nullable.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//       return null; // Error.
+//              ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:79:18: Error: A value of type 'Future<Null>' can't be returned from an async function with return type 'FutureOr<A>'.
+//  - 'Future' is from 'dart:async'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//       return new Future<Null>.value(null); // Error.
+//                  ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+class A extends core::Object /*hasConstConstructor*/  {
+  const constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class B extends self::A {
+  synthetic constructor •() → self::B
+    : super self::A::•()
+    ;
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  method call() → core::num? {}
+}
+static method fooContext(self::A x) → void {}
+static method barContext(core::List<self::A> x) → void {}
+static method bazContext(() → core::num f) → void {}
+static method foo(self::B? x, core::List<self::B?> l, core::Map<self::B?, self::B?> m, core::List<self::B>? l2, core::Map<self::B, self::B>? m2) → self::A {
+  self::fooContext(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:27:14: Error: The argument type 'B?' can't be assigned to the parameter type 'A' because 'B?' is nullable and 'A' isn't.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  fooContext(x); // Error.
+             ^" in x);
+  self::A a = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:28:9: Error: A value of type 'B?' can't be assigned to a variable of type 'A' because 'B?' is nullable and 'A' isn't.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  A a = x; // Error.
+        ^" in x;
+  <self::A>[invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:29:10: Error: Can't assign spread elements of type 'B?' to collection elements of type 'A' because 'B?' is nullable and 'A' isn't.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  <A>[...l]; // Error.
+         ^"];
+  <self::A>[invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:30:10: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+  <A>[...l2]; // Error.
+         ^"];
+  <self::A, self::A>{invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:31:13: Error: Can't assign spread entry keys of type 'B?' to map entry keys of type 'A' because 'B?' is nullable and 'A' isn't.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  <A, A>{...m}; // Error.
+            ^": invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:31:13: Error: Can't assign spread entry values of type 'B?' to map entry values of type 'A' because 'B?' is nullable and 'A' isn't.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  <A, A>{...m}; // Error.
+            ^"};
+  <self::A, self::A>{invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:32:13: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+  <A, A>{...m2}; // Error.
+            ^": null};
+  {
+    core::Iterator<self::B?> :sync-for-iterator = l.{core::Iterable::iterator};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+      final self::B? #t3 = :sync-for-iterator.{core::Iterator::current};
+      {
+        self::A y = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:33:10: Error: A value of type 'B?' can't be assigned to a variable of type 'A' because 'B?' is nullable and 'A' isn't.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+Try changing the type of the variable.
+  for (A y in l) {} // Error.
+         ^" in #t3;
+      }
+    }
+  }
+  {
+    core::Iterator<dynamic> :sync-for-iterator = (let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:34:15: Error: The type 'List<B>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'List<B>?' is nullable and 'Iterable<dynamic>' isn't.
+ - 'List' is from 'dart:core'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'Iterable' is from 'dart:core'.
+  for (A y in l2) {} // Error.
+              ^" in l2).{core::Iterable::iterator};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+      self::A y = :sync-for-iterator.{core::Iterator::current};
+      {}
+    }
+  }
+  #L1:
+  switch(x) {
+    #L2:
+    case #C1:
+      {
+        break #L1;
+      }
+    #L3:
+    default:
+      {
+        break #L1;
+      }
+  }
+  function local() → FutureOr<self::A> /* originally async */ {
+    final asy::_Future<self::A> :async_future = new asy::_Future::•<self::A>();
+    core::bool* :is_sync = false;
+    FutureOr<self::A>? :return_value;
+    dynamic :async_stack_trace;
+    (dynamic) → dynamic :async_op_then;
+    (core::Object, core::StackTrace) → dynamic :async_op_error;
+    core::int :await_jump_var = 0;
+    dynamic :await_ctx_var;
+    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+      try {
+        #L4:
+        {
+          if(true) {
+            :return_value = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:43:14: Error: A value of type 'B?' can't be returned from an async function with return type 'FutureOr<A>' because 'B?' is nullable and 'FutureOr<A>' isn't.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+      return x; // Error.
+             ^" in x;
+            break #L4;
+          }
+          else {
+            :return_value = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:45:18: Error: A value of type 'Future<B?>' can't be returned from an async function with return type 'FutureOr<A>'.
+ - 'Future' is from 'dart:async'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+      return new Future<B?>.value(x); // Error.
+                 ^" in asy::Future::value<self::B?>(x) as{TypeError,ForNonNullableByDefault} self::A;
+            break #L4;
+          }
+        }
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
+        return;
+      }
+      on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
+      }
+    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
+  }
+  return let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:49:10: Error: A value of type 'B?' can't be returned from a function with return type 'A' because 'B?' is nullable and 'A' isn't.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  return x; // Error.
+         ^" in x;
+}
+static method bar(core::List<self::B?> x, core::List<core::List<self::B?>> l, core::Map<core::List<self::B?>, core::List<self::B?>> m) → core::List<self::A> {
+  self::barContext(let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:53:14: Error: The argument type 'List<B?>' can't be assigned to the parameter type 'List<A>' because 'B?' is nullable and 'A' isn't.
+ - 'List' is from 'dart:core'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  barContext(x); // Error.
+             ^" in x);
+  core::List<self::A> y = let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:54:15: Error: A value of type 'List<B?>' can't be assigned to a variable of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+ - 'List' is from 'dart:core'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  List<A> y = x; // Error.
+              ^" in x;
+  <core::List<self::A>>[invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:55:16: Error: Can't assign spread elements of type 'List<B?>' to collection elements of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+ - 'List' is from 'dart:core'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  <List<A>>[...l]; // Error.
+               ^"];
+  <core::List<self::A>, core::List<self::A>>{invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:56:25: Error: Can't assign spread entry keys of type 'List<B?>' to map entry keys of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+ - 'List' is from 'dart:core'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  <List<A>, List<A>>{...m}; // Error.
+                        ^": invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:56:25: Error: Can't assign spread entry values of type 'List<B?>' to map entry values of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+ - 'List' is from 'dart:core'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  <List<A>, List<A>>{...m}; // Error.
+                        ^"};
+  {
+    core::Iterator<core::List<self::B?>> :sync-for-iterator = l.{core::Iterable::iterator};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+      final core::List<self::B?> #t11 = :sync-for-iterator.{core::Iterator::current};
+      {
+        core::List<self::A> y = let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:57:16: Error: A value of type 'List<B?>' can't be assigned to a variable of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+ - 'List' is from 'dart:core'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+Try changing the type of the variable.
+  for (List<A> y in l) {} // Error.
+               ^" in #t11;
+      }
+    }
+  }
+  return let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:58:10: Error: A value of type 'List<B?>' can't be returned from a function with return type 'List<A>' because 'B?' is nullable and 'A' isn't.
+ - 'List' is from 'dart:core'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  return x; // Error.
+         ^" in x;
+}
+static method baz(self::C c) → void {
+  self::bazContext(let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:62:14: Error: The argument type 'num? Function()' can't be assigned to the parameter type 'num Function()' because 'num?' is nullable and 'num' isn't.
+  bazContext(c);
+             ^" in let final self::C #t15 = c in #t15.==(null) ?{() → core::num?} null : #t15.{self::C::call});
+}
+static method boz(Null x) → self::A {
+  self::fooContext(let final<BottomType> #t16 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:66:14: Error: The argument type 'Null' can't be assigned to the parameter type 'A' because 'A' is not nullable.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  fooContext(x); // Error.
+             ^" in x);
+  self::fooContext(let final<BottomType> #t17 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:67:14: Error: The value 'null' can't be assigned to the parameter type 'A' because 'A' is not nullable.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  fooContext(null); // Error.
+             ^" in null);
+  self::A a1 = let final<BottomType> #t18 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:68:10: Error: A value of type 'Null' can't be assigned to a variable of type 'A' because 'A' is not nullable.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  A a1 = x; // Error.
+         ^" in x;
+  self::A a2 = let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:69:10: Error: The value 'null' can't be assigned to a variable of type 'A' because 'A' is not nullable.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  A a2 = null; // Error.
+         ^" in null;
+  if(true) {
+    return let final<BottomType> #t20 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:71:12: Error: A value of type 'Null' can't be returned from a function with return type 'A' because 'A' is not nullable.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+    return x; // Error.
+           ^" in x;
+  }
+  else {
+    return let final<BottomType> #t21 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:73:12: Error: The value 'null' can't be returned from a function with return type 'A' because 'A' is not nullable.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+    return null; // Error.
+           ^" in null;
+  }
+  function local() → FutureOr<self::A> /* originally async */ {
+    final asy::_Future<self::A> :async_future = new asy::_Future::•<self::A>();
+    core::bool* :is_sync = false;
+    FutureOr<self::A>? :return_value;
+    dynamic :async_stack_trace;
+    (dynamic) → dynamic :async_op_then;
+    (core::Object, core::StackTrace) → dynamic :async_op_error;
+    core::int :await_jump_var = 0;
+    dynamic :await_ctx_var;
+    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+      try {
+        #L5:
+        {
+          if(true) {
+            :return_value = let final<BottomType> #t22 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:77:14: Error: The value 'null' can't be returned from an async function with return type 'FutureOr<A>' because 'FutureOr<A>' is not nullable.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+      return null; // Error.
+             ^" in null;
+            break #L5;
+          }
+          else {
+            :return_value = let final<BottomType> #t23 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:79:18: Error: A value of type 'Future<Null>' can't be returned from an async function with return type 'FutureOr<A>'.
+ - 'Future' is from 'dart:async'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+      return new Future<Null>.value(null); // Error.
+                 ^" in asy::Future::value<Null>(null) as{TypeError,ForNonNullableByDefault} self::A;
+            break #L5;
+          }
+        }
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
+        return;
+      }
+      on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
+      }
+    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
+  }
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = self::A {}
+}
diff --git a/pkg/front_end/testcases/nnbd/build_issue_2688.dart b/pkg/front_end/testcases/nnbd/build_issue_2688.dart
new file mode 100644
index 0000000..016f457
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/build_issue_2688.dart
@@ -0,0 +1,129 @@
+// Copyright (c) 2020, 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.
+
+// Regression test for https://github.com/dart-lang/build/issues/2688
+
+mixin M0 {
+  int get property;
+}
+mixin M1 implements M0 {
+  int get property;
+}
+mixin M2 implements M1 {
+  int get property;
+}
+mixin M3 implements M2 {
+  int get property;
+}
+mixin M4 implements M3 {
+  int get property;
+}
+mixin M5 implements M4 {
+  int get property;
+}
+mixin M6 implements M5 {
+  int get property;
+}
+mixin M7 implements M6 {
+  int get property;
+}
+mixin M8 implements M7 {
+  int get property;
+}
+mixin M9 implements M8 {
+  int get property;
+}
+mixin M10 implements M9 {
+  int get property;
+}
+mixin M11 implements M10 {
+  int get property;
+}
+mixin M12 implements M11 {
+  int get property;
+}
+mixin M13 implements M12 {
+  int get property;
+}
+mixin M14 implements M13 {
+  int get property;
+}
+mixin M15 implements M14 {
+  int get property;
+}
+mixin M16 implements M15 {
+  int get property;
+}
+mixin M17 implements M16 {
+  int get property;
+}
+mixin M18 implements M17 {
+  int get property;
+}
+mixin M19 implements M18 {
+  int get property;
+}
+mixin M20 implements M19 {
+  int get property;
+}
+mixin M21 implements M20 {
+  int get property;
+}
+mixin M22 implements M21 {
+  int get property;
+}
+mixin M23 implements M22 {
+  int get property;
+}
+mixin M24 implements M23 {
+  int get property;
+}
+mixin M25 implements M24 {
+  int get property;
+}
+mixin M26 implements M25 {
+  int get property;
+}
+mixin M27 implements M26 {
+  int get property;
+}
+
+abstract class Super {
+  int get property;
+}
+
+class Class extends Super
+    with
+        M0,
+        M1,
+        M2,
+        M3,
+        M4,
+        M5,
+        M6,
+        M7,
+        M8,
+        M9,
+        M10,
+        M11,
+        M12,
+        M13,
+        M14,
+        M15,
+        M16,
+        M17,
+        M18,
+        M19,
+        M20,
+        M21,
+        M22,
+        M23,
+        M24,
+        M25,
+        M26,
+        M27 {
+  int get property => 0;
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/build_issue_2688.dart.outline.expect b/pkg/front_end/testcases/nnbd/build_issue_2688.dart.outline.expect
new file mode 100644
index 0000000..8b55238
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/build_issue_2688.dart.outline.expect
@@ -0,0 +1,241 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class M0 extends core::Object /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M1 extends core::Object implements self::M0 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M2 extends core::Object implements self::M1 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M3 extends core::Object implements self::M2 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M4 extends core::Object implements self::M3 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M5 extends core::Object implements self::M4 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M6 extends core::Object implements self::M5 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M7 extends core::Object implements self::M6 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M8 extends core::Object implements self::M7 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M9 extends core::Object implements self::M8 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M10 extends core::Object implements self::M9 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M11 extends core::Object implements self::M10 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M12 extends core::Object implements self::M11 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M13 extends core::Object implements self::M12 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M14 extends core::Object implements self::M13 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M15 extends core::Object implements self::M14 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M16 extends core::Object implements self::M15 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M17 extends core::Object implements self::M16 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M18 extends core::Object implements self::M17 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M19 extends core::Object implements self::M18 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M20 extends core::Object implements self::M19 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M21 extends core::Object implements self::M20 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M22 extends core::Object implements self::M21 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M23 extends core::Object implements self::M22 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M24 extends core::Object implements self::M23 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M25 extends core::Object implements self::M24 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M26 extends core::Object implements self::M25 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M27 extends core::Object implements self::M26 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class Super extends core::Object {
+  synthetic constructor •() → self::Super
+    ;
+  abstract get property() → core::int;
+}
+abstract class _Class&Super&M0 = self::Super with self::M0 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0
+    : super self::Super::•()
+    ;
+}
+abstract class _Class&Super&M0&M1 = self::_Class&Super&M0 with self::M1 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1
+    : super self::_Class&Super&M0::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2 = self::_Class&Super&M0&M1 with self::M2 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2
+    : super self::_Class&Super&M0&M1::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3 = self::_Class&Super&M0&M1&M2 with self::M3 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3
+    : super self::_Class&Super&M0&M1&M2::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4 = self::_Class&Super&M0&M1&M2&M3 with self::M4 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4
+    : super self::_Class&Super&M0&M1&M2&M3::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5 = self::_Class&Super&M0&M1&M2&M3&M4 with self::M5 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5
+    : super self::_Class&Super&M0&M1&M2&M3&M4::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6 = self::_Class&Super&M0&M1&M2&M3&M4&M5 with self::M6 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6 with self::M7 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7 with self::M8 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8 with self::M9 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9 with self::M10 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10 with self::M11 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11 with self::M12 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12 with self::M13 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13 with self::M14 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14 with self::M15 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15 with self::M16 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16 with self::M17 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17 with self::M18 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18 with self::M19 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19 with self::M20 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20 with self::M21 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21 with self::M22 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22 with self::M23 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23 with self::M24 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24 with self::M25 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25 with self::M26 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26&M27 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26 with self::M27 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26&M27
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26::•()
+    ;
+}
+class Class extends self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26&M27 {
+  synthetic constructor •() → self::Class
+    ;
+  get property() → core::int
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/nnbd/build_issue_2688.dart.strong.expect b/pkg/front_end/testcases/nnbd/build_issue_2688.dart.strong.expect
new file mode 100644
index 0000000..974275d
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/build_issue_2688.dart.strong.expect
@@ -0,0 +1,242 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class M0 extends core::Object /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M1 extends core::Object implements self::M0 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M2 extends core::Object implements self::M1 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M3 extends core::Object implements self::M2 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M4 extends core::Object implements self::M3 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M5 extends core::Object implements self::M4 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M6 extends core::Object implements self::M5 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M7 extends core::Object implements self::M6 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M8 extends core::Object implements self::M7 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M9 extends core::Object implements self::M8 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M10 extends core::Object implements self::M9 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M11 extends core::Object implements self::M10 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M12 extends core::Object implements self::M11 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M13 extends core::Object implements self::M12 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M14 extends core::Object implements self::M13 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M15 extends core::Object implements self::M14 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M16 extends core::Object implements self::M15 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M17 extends core::Object implements self::M16 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M18 extends core::Object implements self::M17 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M19 extends core::Object implements self::M18 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M20 extends core::Object implements self::M19 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M21 extends core::Object implements self::M20 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M22 extends core::Object implements self::M21 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M23 extends core::Object implements self::M22 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M24 extends core::Object implements self::M23 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M25 extends core::Object implements self::M24 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M26 extends core::Object implements self::M25 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M27 extends core::Object implements self::M26 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class Super extends core::Object {
+  synthetic constructor •() → self::Super
+    : super core::Object::•()
+    ;
+  abstract get property() → core::int;
+}
+abstract class _Class&Super&M0 = self::Super with self::M0 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0
+    : super self::Super::•()
+    ;
+}
+abstract class _Class&Super&M0&M1 = self::_Class&Super&M0 with self::M1 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1
+    : super self::_Class&Super&M0::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2 = self::_Class&Super&M0&M1 with self::M2 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2
+    : super self::_Class&Super&M0&M1::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3 = self::_Class&Super&M0&M1&M2 with self::M3 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3
+    : super self::_Class&Super&M0&M1&M2::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4 = self::_Class&Super&M0&M1&M2&M3 with self::M4 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4
+    : super self::_Class&Super&M0&M1&M2&M3::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5 = self::_Class&Super&M0&M1&M2&M3&M4 with self::M5 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5
+    : super self::_Class&Super&M0&M1&M2&M3&M4::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6 = self::_Class&Super&M0&M1&M2&M3&M4&M5 with self::M6 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6 with self::M7 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7 with self::M8 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8 with self::M9 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9 with self::M10 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10 with self::M11 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11 with self::M12 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12 with self::M13 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13 with self::M14 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14 with self::M15 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15 with self::M16 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16 with self::M17 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17 with self::M18 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18 with self::M19 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19 with self::M20 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20 with self::M21 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21 with self::M22 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22 with self::M23 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23 with self::M24 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24 with self::M25 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25 with self::M26 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26&M27 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26 with self::M27 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26&M27
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26::•()
+    ;
+}
+class Class extends self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26&M27 {
+  synthetic constructor •() → self::Class
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26&M27::•()
+    ;
+  get property() → core::int
+    return 0;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/build_issue_2688.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/build_issue_2688.dart.strong.transformed.expect
new file mode 100644
index 0000000..a9961fa
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/build_issue_2688.dart.strong.transformed.expect
@@ -0,0 +1,270 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class M0 extends core::Object /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M1 extends core::Object implements self::M0 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M2 extends core::Object implements self::M1 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M3 extends core::Object implements self::M2 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M4 extends core::Object implements self::M3 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M5 extends core::Object implements self::M4 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M6 extends core::Object implements self::M5 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M7 extends core::Object implements self::M6 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M8 extends core::Object implements self::M7 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M9 extends core::Object implements self::M8 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M10 extends core::Object implements self::M9 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M11 extends core::Object implements self::M10 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M12 extends core::Object implements self::M11 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M13 extends core::Object implements self::M12 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M14 extends core::Object implements self::M13 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M15 extends core::Object implements self::M14 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M16 extends core::Object implements self::M15 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M17 extends core::Object implements self::M16 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M18 extends core::Object implements self::M17 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M19 extends core::Object implements self::M18 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M20 extends core::Object implements self::M19 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M21 extends core::Object implements self::M20 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M22 extends core::Object implements self::M21 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M23 extends core::Object implements self::M22 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M24 extends core::Object implements self::M23 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M25 extends core::Object implements self::M24 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M26 extends core::Object implements self::M25 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M27 extends core::Object implements self::M26 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class Super extends core::Object {
+  synthetic constructor •() → self::Super
+    : super core::Object::•()
+    ;
+  abstract get property() → core::int;
+}
+abstract class _Class&Super&M0 extends self::Super implements self::M0 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0
+    : super self::Super::•()
+    ;
+  abstract get property() → core::int;
+}
+abstract class _Class&Super&M0&M1 extends self::_Class&Super&M0 implements self::M1 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1
+    : super self::_Class&Super&M0::•()
+    ;
+  abstract get property() → core::int;
+}
+abstract class _Class&Super&M0&M1&M2 extends self::_Class&Super&M0&M1 implements self::M2 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2
+    : super self::_Class&Super&M0&M1::•()
+    ;
+  abstract get property() → core::int;
+}
+abstract class _Class&Super&M0&M1&M2&M3 extends self::_Class&Super&M0&M1&M2 implements self::M3 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3
+    : super self::_Class&Super&M0&M1&M2::•()
+    ;
+  abstract get property() → core::int;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4 extends self::_Class&Super&M0&M1&M2&M3 implements self::M4 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4
+    : super self::_Class&Super&M0&M1&M2&M3::•()
+    ;
+  abstract get property() → core::int;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5 extends self::_Class&Super&M0&M1&M2&M3&M4 implements self::M5 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5
+    : super self::_Class&Super&M0&M1&M2&M3&M4::•()
+    ;
+  abstract get property() → core::int;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6 extends self::_Class&Super&M0&M1&M2&M3&M4&M5 implements self::M6 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5::•()
+    ;
+  abstract get property() → core::int;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7 extends self::_Class&Super&M0&M1&M2&M3&M4&M5&M6 implements self::M7 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6::•()
+    ;
+  abstract get property() → core::int;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8 extends self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7 implements self::M8 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7::•()
+    ;
+  abstract get property() → core::int;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9 extends self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8 implements self::M9 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8::•()
+    ;
+  abstract get property() → core::int;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10 extends self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9 implements self::M10 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9::•()
+    ;
+  abstract get property() → core::int;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11 extends self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10 implements self::M11 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10::•()
+    ;
+  abstract get property() → core::int;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12 extends self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11 implements self::M12 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11::•()
+    ;
+  abstract get property() → core::int;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13 extends self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12 implements self::M13 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12::•()
+    ;
+  abstract get property() → core::int;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14 extends self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13 implements self::M14 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13::•()
+    ;
+  abstract get property() → core::int;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15 extends self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14 implements self::M15 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14::•()
+    ;
+  abstract get property() → core::int;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16 extends self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15 implements self::M16 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15::•()
+    ;
+  abstract get property() → core::int;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17 extends self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16 implements self::M17 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16::•()
+    ;
+  abstract get property() → core::int;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18 extends self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17 implements self::M18 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17::•()
+    ;
+  abstract get property() → core::int;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19 extends self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18 implements self::M19 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18::•()
+    ;
+  abstract get property() → core::int;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20 extends self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19 implements self::M20 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19::•()
+    ;
+  abstract get property() → core::int;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21 extends self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20 implements self::M21 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20::•()
+    ;
+  abstract get property() → core::int;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22 extends self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21 implements self::M22 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21::•()
+    ;
+  abstract get property() → core::int;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23 extends self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22 implements self::M23 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22::•()
+    ;
+  abstract get property() → core::int;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24 extends self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23 implements self::M24 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23::•()
+    ;
+  abstract get property() → core::int;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25 extends self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24 implements self::M25 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24::•()
+    ;
+  abstract get property() → core::int;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26 extends self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25 implements self::M26 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25::•()
+    ;
+  abstract get property() → core::int;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26&M27 extends self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26 implements self::M27 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26&M27
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26::•()
+    ;
+  abstract get property() → core::int;
+}
+class Class extends self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26&M27 {
+  synthetic constructor •() → self::Class
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26&M27::•()
+    ;
+  get property() → core::int
+    return 0;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/build_issue_2688.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd/build_issue_2688.dart.textual_outline.expect
new file mode 100644
index 0000000..ed52349
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/build_issue_2688.dart.textual_outline.expect
@@ -0,0 +1,123 @@
+mixin M0 {
+  int get property;
+}
+mixin M1 implements M0 {
+  int get property;
+}
+mixin M2 implements M1 {
+  int get property;
+}
+mixin M3 implements M2 {
+  int get property;
+}
+mixin M4 implements M3 {
+  int get property;
+}
+mixin M5 implements M4 {
+  int get property;
+}
+mixin M6 implements M5 {
+  int get property;
+}
+mixin M7 implements M6 {
+  int get property;
+}
+mixin M8 implements M7 {
+  int get property;
+}
+mixin M9 implements M8 {
+  int get property;
+}
+mixin M10 implements M9 {
+  int get property;
+}
+mixin M11 implements M10 {
+  int get property;
+}
+mixin M12 implements M11 {
+  int get property;
+}
+mixin M13 implements M12 {
+  int get property;
+}
+mixin M14 implements M13 {
+  int get property;
+}
+mixin M15 implements M14 {
+  int get property;
+}
+mixin M16 implements M15 {
+  int get property;
+}
+mixin M17 implements M16 {
+  int get property;
+}
+mixin M18 implements M17 {
+  int get property;
+}
+mixin M19 implements M18 {
+  int get property;
+}
+mixin M20 implements M19 {
+  int get property;
+}
+mixin M21 implements M20 {
+  int get property;
+}
+mixin M22 implements M21 {
+  int get property;
+}
+mixin M23 implements M22 {
+  int get property;
+}
+mixin M24 implements M23 {
+  int get property;
+}
+mixin M25 implements M24 {
+  int get property;
+}
+mixin M26 implements M25 {
+  int get property;
+}
+mixin M27 implements M26 {
+  int get property;
+}
+
+abstract class Super {
+  int get property;
+}
+
+class Class extends Super
+    with
+        M0,
+        M1,
+        M2,
+        M3,
+        M4,
+        M5,
+        M6,
+        M7,
+        M8,
+        M9,
+        M10,
+        M11,
+        M12,
+        M13,
+        M14,
+        M15,
+        M16,
+        M17,
+        M18,
+        M19,
+        M20,
+        M21,
+        M22,
+        M23,
+        M24,
+        M25,
+        M26,
+        M27 {
+  int get property => 0;
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/build_issue_2688.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/nnbd/build_issue_2688.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..d2ec562
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/build_issue_2688.dart.textual_outline_modelled.expect
@@ -0,0 +1,122 @@
+abstract class Super {
+  int get property;
+}
+
+class Class extends Super
+    with
+        M0,
+        M1,
+        M2,
+        M3,
+        M4,
+        M5,
+        M6,
+        M7,
+        M8,
+        M9,
+        M10,
+        M11,
+        M12,
+        M13,
+        M14,
+        M15,
+        M16,
+        M17,
+        M18,
+        M19,
+        M20,
+        M21,
+        M22,
+        M23,
+        M24,
+        M25,
+        M26,
+        M27 {
+  int get property => 0;
+}
+
+main() {}
+mixin M0 {
+  int get property;
+}
+mixin M1 implements M0 {
+  int get property;
+}
+mixin M10 implements M9 {
+  int get property;
+}
+mixin M11 implements M10 {
+  int get property;
+}
+mixin M12 implements M11 {
+  int get property;
+}
+mixin M13 implements M12 {
+  int get property;
+}
+mixin M14 implements M13 {
+  int get property;
+}
+mixin M15 implements M14 {
+  int get property;
+}
+mixin M16 implements M15 {
+  int get property;
+}
+mixin M17 implements M16 {
+  int get property;
+}
+mixin M18 implements M17 {
+  int get property;
+}
+mixin M19 implements M18 {
+  int get property;
+}
+mixin M2 implements M1 {
+  int get property;
+}
+mixin M20 implements M19 {
+  int get property;
+}
+mixin M21 implements M20 {
+  int get property;
+}
+mixin M22 implements M21 {
+  int get property;
+}
+mixin M23 implements M22 {
+  int get property;
+}
+mixin M24 implements M23 {
+  int get property;
+}
+mixin M25 implements M24 {
+  int get property;
+}
+mixin M26 implements M25 {
+  int get property;
+}
+mixin M27 implements M26 {
+  int get property;
+}
+mixin M3 implements M2 {
+  int get property;
+}
+mixin M4 implements M3 {
+  int get property;
+}
+mixin M5 implements M4 {
+  int get property;
+}
+mixin M6 implements M5 {
+  int get property;
+}
+mixin M7 implements M6 {
+  int get property;
+}
+mixin M8 implements M7 {
+  int get property;
+}
+mixin M9 implements M8 {
+  int get property;
+}
diff --git a/pkg/front_end/testcases/nnbd/build_issue_2688.dart.weak.expect b/pkg/front_end/testcases/nnbd/build_issue_2688.dart.weak.expect
new file mode 100644
index 0000000..974275d
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/build_issue_2688.dart.weak.expect
@@ -0,0 +1,242 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class M0 extends core::Object /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M1 extends core::Object implements self::M0 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M2 extends core::Object implements self::M1 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M3 extends core::Object implements self::M2 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M4 extends core::Object implements self::M3 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M5 extends core::Object implements self::M4 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M6 extends core::Object implements self::M5 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M7 extends core::Object implements self::M6 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M8 extends core::Object implements self::M7 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M9 extends core::Object implements self::M8 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M10 extends core::Object implements self::M9 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M11 extends core::Object implements self::M10 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M12 extends core::Object implements self::M11 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M13 extends core::Object implements self::M12 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M14 extends core::Object implements self::M13 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M15 extends core::Object implements self::M14 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M16 extends core::Object implements self::M15 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M17 extends core::Object implements self::M16 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M18 extends core::Object implements self::M17 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M19 extends core::Object implements self::M18 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M20 extends core::Object implements self::M19 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M21 extends core::Object implements self::M20 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M22 extends core::Object implements self::M21 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M23 extends core::Object implements self::M22 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M24 extends core::Object implements self::M23 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M25 extends core::Object implements self::M24 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M26 extends core::Object implements self::M25 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M27 extends core::Object implements self::M26 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class Super extends core::Object {
+  synthetic constructor •() → self::Super
+    : super core::Object::•()
+    ;
+  abstract get property() → core::int;
+}
+abstract class _Class&Super&M0 = self::Super with self::M0 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0
+    : super self::Super::•()
+    ;
+}
+abstract class _Class&Super&M0&M1 = self::_Class&Super&M0 with self::M1 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1
+    : super self::_Class&Super&M0::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2 = self::_Class&Super&M0&M1 with self::M2 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2
+    : super self::_Class&Super&M0&M1::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3 = self::_Class&Super&M0&M1&M2 with self::M3 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3
+    : super self::_Class&Super&M0&M1&M2::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4 = self::_Class&Super&M0&M1&M2&M3 with self::M4 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4
+    : super self::_Class&Super&M0&M1&M2&M3::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5 = self::_Class&Super&M0&M1&M2&M3&M4 with self::M5 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5
+    : super self::_Class&Super&M0&M1&M2&M3&M4::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6 = self::_Class&Super&M0&M1&M2&M3&M4&M5 with self::M6 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6 with self::M7 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7 with self::M8 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8 with self::M9 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9 with self::M10 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10 with self::M11 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11 with self::M12 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12 with self::M13 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13 with self::M14 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14 with self::M15 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15 with self::M16 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16 with self::M17 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17 with self::M18 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18 with self::M19 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19 with self::M20 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20 with self::M21 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21 with self::M22 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22 with self::M23 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23 with self::M24 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24 with self::M25 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25 with self::M26 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25::•()
+    ;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26&M27 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26 with self::M27 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26&M27
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26::•()
+    ;
+}
+class Class extends self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26&M27 {
+  synthetic constructor •() → self::Class
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26&M27::•()
+    ;
+  get property() → core::int
+    return 0;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/build_issue_2688.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/build_issue_2688.dart.weak.transformed.expect
new file mode 100644
index 0000000..a9961fa
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/build_issue_2688.dart.weak.transformed.expect
@@ -0,0 +1,270 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class M0 extends core::Object /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M1 extends core::Object implements self::M0 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M2 extends core::Object implements self::M1 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M3 extends core::Object implements self::M2 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M4 extends core::Object implements self::M3 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M5 extends core::Object implements self::M4 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M6 extends core::Object implements self::M5 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M7 extends core::Object implements self::M6 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M8 extends core::Object implements self::M7 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M9 extends core::Object implements self::M8 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M10 extends core::Object implements self::M9 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M11 extends core::Object implements self::M10 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M12 extends core::Object implements self::M11 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M13 extends core::Object implements self::M12 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M14 extends core::Object implements self::M13 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M15 extends core::Object implements self::M14 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M16 extends core::Object implements self::M15 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M17 extends core::Object implements self::M16 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M18 extends core::Object implements self::M17 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M19 extends core::Object implements self::M18 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M20 extends core::Object implements self::M19 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M21 extends core::Object implements self::M20 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M22 extends core::Object implements self::M21 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M23 extends core::Object implements self::M22 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M24 extends core::Object implements self::M23 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M25 extends core::Object implements self::M24 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M26 extends core::Object implements self::M25 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M27 extends core::Object implements self::M26 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class Super extends core::Object {
+  synthetic constructor •() → self::Super
+    : super core::Object::•()
+    ;
+  abstract get property() → core::int;
+}
+abstract class _Class&Super&M0 extends self::Super implements self::M0 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0
+    : super self::Super::•()
+    ;
+  abstract get property() → core::int;
+}
+abstract class _Class&Super&M0&M1 extends self::_Class&Super&M0 implements self::M1 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1
+    : super self::_Class&Super&M0::•()
+    ;
+  abstract get property() → core::int;
+}
+abstract class _Class&Super&M0&M1&M2 extends self::_Class&Super&M0&M1 implements self::M2 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2
+    : super self::_Class&Super&M0&M1::•()
+    ;
+  abstract get property() → core::int;
+}
+abstract class _Class&Super&M0&M1&M2&M3 extends self::_Class&Super&M0&M1&M2 implements self::M3 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3
+    : super self::_Class&Super&M0&M1&M2::•()
+    ;
+  abstract get property() → core::int;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4 extends self::_Class&Super&M0&M1&M2&M3 implements self::M4 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4
+    : super self::_Class&Super&M0&M1&M2&M3::•()
+    ;
+  abstract get property() → core::int;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5 extends self::_Class&Super&M0&M1&M2&M3&M4 implements self::M5 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5
+    : super self::_Class&Super&M0&M1&M2&M3&M4::•()
+    ;
+  abstract get property() → core::int;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6 extends self::_Class&Super&M0&M1&M2&M3&M4&M5 implements self::M6 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5::•()
+    ;
+  abstract get property() → core::int;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7 extends self::_Class&Super&M0&M1&M2&M3&M4&M5&M6 implements self::M7 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6::•()
+    ;
+  abstract get property() → core::int;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8 extends self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7 implements self::M8 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7::•()
+    ;
+  abstract get property() → core::int;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9 extends self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8 implements self::M9 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8::•()
+    ;
+  abstract get property() → core::int;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10 extends self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9 implements self::M10 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9::•()
+    ;
+  abstract get property() → core::int;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11 extends self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10 implements self::M11 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10::•()
+    ;
+  abstract get property() → core::int;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12 extends self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11 implements self::M12 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11::•()
+    ;
+  abstract get property() → core::int;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13 extends self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12 implements self::M13 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12::•()
+    ;
+  abstract get property() → core::int;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14 extends self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13 implements self::M14 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13::•()
+    ;
+  abstract get property() → core::int;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15 extends self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14 implements self::M15 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14::•()
+    ;
+  abstract get property() → core::int;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16 extends self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15 implements self::M16 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15::•()
+    ;
+  abstract get property() → core::int;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17 extends self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16 implements self::M17 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16::•()
+    ;
+  abstract get property() → core::int;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18 extends self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17 implements self::M18 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17::•()
+    ;
+  abstract get property() → core::int;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19 extends self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18 implements self::M19 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18::•()
+    ;
+  abstract get property() → core::int;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20 extends self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19 implements self::M20 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19::•()
+    ;
+  abstract get property() → core::int;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21 extends self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20 implements self::M21 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20::•()
+    ;
+  abstract get property() → core::int;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22 extends self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21 implements self::M22 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21::•()
+    ;
+  abstract get property() → core::int;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23 extends self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22 implements self::M23 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22::•()
+    ;
+  abstract get property() → core::int;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24 extends self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23 implements self::M24 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23::•()
+    ;
+  abstract get property() → core::int;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25 extends self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24 implements self::M25 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24::•()
+    ;
+  abstract get property() → core::int;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26 extends self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25 implements self::M26 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25::•()
+    ;
+  abstract get property() → core::int;
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26&M27 extends self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26 implements self::M27 /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26&M27
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26::•()
+    ;
+  abstract get property() → core::int;
+}
+class Class extends self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26&M27 {
+  synthetic constructor •() → self::Class
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26&M27::•()
+    ;
+  get property() → core::int
+    return 0;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/combined_required.dart b/pkg/front_end/testcases/nnbd/combined_required.dart
new file mode 100644
index 0000000..9584091
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/combined_required.dart
@@ -0,0 +1,18 @@
+class A {
+  void method1({required int a}) {}
+  void method2({int? a, required int b}) {}
+}
+
+class B {
+  void method1({required covariant int a}) {}
+  void method2({covariant int? a, required int b}) {}
+}
+
+class C extends A implements B {}
+
+class D extends C {
+  void method1({required covariant int a}) {}
+  void method2({covariant int? a, required int b}) {}
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/combined_required.dart.outline.expect b/pkg/front_end/testcases/nnbd/combined_required.dart.outline.expect
new file mode 100644
index 0000000..f39bdf2
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/combined_required.dart.outline.expect
@@ -0,0 +1,38 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    ;
+  method method1({required core::int a}) → void
+    ;
+  method method2({core::int? a, required core::int b}) → void
+    ;
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    ;
+  method method1({required covariant core::int a}) → void
+    ;
+  method method2({covariant core::int? a, required core::int b}) → void
+    ;
+}
+class C extends self::A implements self::B {
+  synthetic constructor •() → self::C
+    ;
+  forwarding-stub method method1({required covariant core::int a}) → void
+    return super.{self::A::method1}(a: a);
+  forwarding-stub method method2({covariant core::int? a, required core::int b}) → void
+    return super.{self::A::method2}(a: a, b: b);
+}
+class D extends self::C {
+  synthetic constructor •() → self::D
+    ;
+  method method1({required covariant core::int a}) → void
+    ;
+  method method2({covariant core::int? a, required core::int b}) → void
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/nnbd/combined_required.dart.strong.expect b/pkg/front_end/testcases/nnbd/combined_required.dart.strong.expect
new file mode 100644
index 0000000..34958ef
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/combined_required.dart.strong.expect
@@ -0,0 +1,39 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  method method1({required core::int a = #C1}) → void {}
+  method method2({core::int? a = #C1, required core::int b = #C1}) → void {}
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+  method method1({required covariant core::int a = #C1}) → void {}
+  method method2({covariant core::int? a = #C1, required core::int b = #C1}) → void {}
+}
+class C extends self::A implements self::B {
+  synthetic constructor •() → self::C
+    : super self::A::•()
+    ;
+  forwarding-stub method method1({required covariant core::int a = #C1}) → void
+    return super.{self::A::method1}(a: a);
+  forwarding-stub method method2({covariant core::int? a = #C1, required core::int b = #C1}) → void
+    return super.{self::A::method2}(a: a, b: b);
+}
+class D extends self::C {
+  synthetic constructor •() → self::D
+    : super self::C::•()
+    ;
+  method method1({required covariant core::int a = #C1}) → void {}
+  method method2({covariant core::int? a = #C1, required core::int b = #C1}) → void {}
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/nnbd/combined_required.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/combined_required.dart.strong.transformed.expect
new file mode 100644
index 0000000..34958ef
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/combined_required.dart.strong.transformed.expect
@@ -0,0 +1,39 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  method method1({required core::int a = #C1}) → void {}
+  method method2({core::int? a = #C1, required core::int b = #C1}) → void {}
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+  method method1({required covariant core::int a = #C1}) → void {}
+  method method2({covariant core::int? a = #C1, required core::int b = #C1}) → void {}
+}
+class C extends self::A implements self::B {
+  synthetic constructor •() → self::C
+    : super self::A::•()
+    ;
+  forwarding-stub method method1({required covariant core::int a = #C1}) → void
+    return super.{self::A::method1}(a: a);
+  forwarding-stub method method2({covariant core::int? a = #C1, required core::int b = #C1}) → void
+    return super.{self::A::method2}(a: a, b: b);
+}
+class D extends self::C {
+  synthetic constructor •() → self::D
+    : super self::C::•()
+    ;
+  method method1({required covariant core::int a = #C1}) → void {}
+  method method2({covariant core::int? a = #C1, required core::int b = #C1}) → void {}
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/nnbd/combined_required.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd/combined_required.dart.textual_outline.expect
new file mode 100644
index 0000000..9584091
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/combined_required.dart.textual_outline.expect
@@ -0,0 +1,18 @@
+class A {
+  void method1({required int a}) {}
+  void method2({int? a, required int b}) {}
+}
+
+class B {
+  void method1({required covariant int a}) {}
+  void method2({covariant int? a, required int b}) {}
+}
+
+class C extends A implements B {}
+
+class D extends C {
+  void method1({required covariant int a}) {}
+  void method2({covariant int? a, required int b}) {}
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/combined_required.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/nnbd/combined_required.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..9584091
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/combined_required.dart.textual_outline_modelled.expect
@@ -0,0 +1,18 @@
+class A {
+  void method1({required int a}) {}
+  void method2({int? a, required int b}) {}
+}
+
+class B {
+  void method1({required covariant int a}) {}
+  void method2({covariant int? a, required int b}) {}
+}
+
+class C extends A implements B {}
+
+class D extends C {
+  void method1({required covariant int a}) {}
+  void method2({covariant int? a, required int b}) {}
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/combined_required.dart.weak.expect b/pkg/front_end/testcases/nnbd/combined_required.dart.weak.expect
new file mode 100644
index 0000000..34958ef
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/combined_required.dart.weak.expect
@@ -0,0 +1,39 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  method method1({required core::int a = #C1}) → void {}
+  method method2({core::int? a = #C1, required core::int b = #C1}) → void {}
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+  method method1({required covariant core::int a = #C1}) → void {}
+  method method2({covariant core::int? a = #C1, required core::int b = #C1}) → void {}
+}
+class C extends self::A implements self::B {
+  synthetic constructor •() → self::C
+    : super self::A::•()
+    ;
+  forwarding-stub method method1({required covariant core::int a = #C1}) → void
+    return super.{self::A::method1}(a: a);
+  forwarding-stub method method2({covariant core::int? a = #C1, required core::int b = #C1}) → void
+    return super.{self::A::method2}(a: a, b: b);
+}
+class D extends self::C {
+  synthetic constructor •() → self::D
+    : super self::C::•()
+    ;
+  method method1({required covariant core::int a = #C1}) → void {}
+  method method2({covariant core::int? a = #C1, required core::int b = #C1}) → void {}
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/nnbd/combined_required.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/combined_required.dart.weak.transformed.expect
new file mode 100644
index 0000000..34958ef
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/combined_required.dart.weak.transformed.expect
@@ -0,0 +1,39 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  method method1({required core::int a = #C1}) → void {}
+  method method2({core::int? a = #C1, required core::int b = #C1}) → void {}
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+  method method1({required covariant core::int a = #C1}) → void {}
+  method method2({covariant core::int? a = #C1, required core::int b = #C1}) → void {}
+}
+class C extends self::A implements self::B {
+  synthetic constructor •() → self::C
+    : super self::A::•()
+    ;
+  forwarding-stub method method1({required covariant core::int a = #C1}) → void
+    return super.{self::A::method1}(a: a);
+  forwarding-stub method method2({covariant core::int? a = #C1, required core::int b = #C1}) → void
+    return super.{self::A::method2}(a: a, b: b);
+}
+class D extends self::C {
+  synthetic constructor •() → self::D
+    : super self::C::•()
+    ;
+  method method1({required covariant core::int a = #C1}) → void {}
+  method method2({covariant core::int? a = #C1, required core::int b = #C1}) → void {}
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/nnbd/constant_null_is.dart.outline.expect b/pkg/front_end/testcases/nnbd/constant_null_is.dart.outline.expect
index 04a6535..02239ae 100644
--- a/pkg/front_end/testcases/nnbd/constant_null_is.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/constant_null_is.dart.outline.expect
@@ -22,29 +22,29 @@
 static final field core::bool isWeakMode;
 static const field core::bool c0 = null is{ForNonNullableByDefault} core::int?;
 static const field core::bool c1 = null is{ForNonNullableByDefault} core::int;
-static const field core::bool c2 = null is{ForNonNullableByDefault} core::Null?;
+static const field core::bool c2 = null is{ForNonNullableByDefault} Null;
 static const field core::bool c3 = null is{ForNonNullableByDefault} Never?;
 static const field core::bool c4 = null is{ForNonNullableByDefault} Never;
 static const field core::bool c5 = null is{ForNonNullableByDefault} FutureOr<core::int?>;
 static const field core::bool c6 = null is{ForNonNullableByDefault} FutureOr<core::int>;
 static const field core::bool c7 = null is{ForNonNullableByDefault} FutureOr<core::int>?;
-static const field core::bool c8 = null is{ForNonNullableByDefault} FutureOr<core::Null?>;
-static const field core::bool c9 = null is{ForNonNullableByDefault} FutureOr<core::Null?>?;
+static const field core::bool c8 = null is{ForNonNullableByDefault} FutureOr<Null>;
+static const field core::bool c9 = null is{ForNonNullableByDefault} FutureOr<Null>?;
 static const field core::bool c10 = null is{ForNonNullableByDefault} FutureOr<Never>;
 static const field core::bool c11 = null is{ForNonNullableByDefault} FutureOr<Never?>;
 static const field core::bool c12 = null is{ForNonNullableByDefault} FutureOr<Never>?;
 static const field self::Class<core::int> e1 = const self::Class::constructor1<core::int>(null);
 static const field self::Class<core::int?> e2 = const self::Class::constructor1<core::int?>(null);
-static const field self::Class<core::Null?> e3 = const self::Class::constructor1<core::Null?>(null);
+static const field self::Class<Null> e3 = const self::Class::constructor1<Null>(null);
 static const field self::Class<core::int> e4 = const self::Class::constructor2<core::int>(null);
 static const field self::Class<core::int?> e5 = const self::Class::constructor2<core::int?>(null);
-static const field self::Class<core::Null?> e6 = const self::Class::constructor2<core::Null?>(null);
+static const field self::Class<Null> e6 = const self::Class::constructor2<Null>(null);
 static const field self::Class<core::int> e7 = const self::Class::constructor3<core::int>(null);
 static const field self::Class<core::int?> e8 = const self::Class::constructor3<core::int?>(null);
-static const field self::Class<core::Null?> e9 = const self::Class::constructor3<core::Null?>(null);
+static const field self::Class<Null> e9 = const self::Class::constructor3<Null>(null);
 static const field self::Class<core::int> e10 = const self::Class::constructor4<core::int>(null);
 static const field self::Class<core::int?> e11 = const self::Class::constructor4<core::int?>(null);
-static const field self::Class<core::Null?> e12 = const self::Class::constructor4<core::Null?>(null);
+static const field self::Class<Null> e12 = const self::Class::constructor4<Null>(null);
 static method main() → dynamic
   ;
 static method expect(dynamic expected, dynamic actual, core::String message) → dynamic
@@ -67,14 +67,14 @@
 Evaluated: IsExpression @ org-dartlang-testcase:///constant_null_is.dart:21:18 -> BoolConstant(true)
 Evaluated: ConstructorInvocation @ org-dartlang-testcase:///constant_null_is.dart:22:18 -> InstanceConstant(const Class<int>{Class.field: false})
 Evaluated: ConstructorInvocation @ org-dartlang-testcase:///constant_null_is.dart:23:18 -> InstanceConstant(const Class<int?>{Class.field: true})
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///constant_null_is.dart:24:18 -> InstanceConstant(const Class<Null?>{Class.field: true})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///constant_null_is.dart:24:18 -> InstanceConstant(const Class<Null>{Class.field: true})
 Evaluated: ConstructorInvocation @ org-dartlang-testcase:///constant_null_is.dart:25:18 -> InstanceConstant(const Class<int>{Class.field: true})
 Evaluated: ConstructorInvocation @ org-dartlang-testcase:///constant_null_is.dart:26:18 -> InstanceConstant(const Class<int?>{Class.field: true})
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///constant_null_is.dart:27:18 -> InstanceConstant(const Class<Null?>{Class.field: true})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///constant_null_is.dart:27:18 -> InstanceConstant(const Class<Null>{Class.field: true})
 Evaluated: ConstructorInvocation @ org-dartlang-testcase:///constant_null_is.dart:28:18 -> InstanceConstant(const Class<int>{Class.field: false})
 Evaluated: ConstructorInvocation @ org-dartlang-testcase:///constant_null_is.dart:29:18 -> InstanceConstant(const Class<int?>{Class.field: false})
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///constant_null_is.dart:30:18 -> InstanceConstant(const Class<Null?>{Class.field: false})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///constant_null_is.dart:30:18 -> InstanceConstant(const Class<Null>{Class.field: false})
 Evaluated: ConstructorInvocation @ org-dartlang-testcase:///constant_null_is.dart:31:19 -> InstanceConstant(const Class<int>{Class.field: true})
 Evaluated: ConstructorInvocation @ org-dartlang-testcase:///constant_null_is.dart:32:19 -> InstanceConstant(const Class<int?>{Class.field: true})
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///constant_null_is.dart:33:19 -> InstanceConstant(const Class<Null?>{Class.field: true})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///constant_null_is.dart:33:19 -> InstanceConstant(const Class<Null>{Class.field: true})
 Extra constant evaluation: evaluated: 33, effectively constant: 25
diff --git a/pkg/front_end/testcases/nnbd/constant_null_is.dart.strong.expect b/pkg/front_end/testcases/nnbd/constant_null_is.dart.strong.expect
index 38d97af..fd5c283 100644
--- a/pkg/front_end/testcases/nnbd/constant_null_is.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/constant_null_is.dart.strong.expect
@@ -35,45 +35,45 @@
 static const field core::bool c12 = #C2;
 static const field self::Class<core::int> e1 = #C4;
 static const field self::Class<core::int?> e2 = #C5;
-static const field self::Class<core::Null?> e3 = #C6;
+static const field self::Class<Null> e3 = #C6;
 static const field self::Class<core::int> e4 = #C7;
 static const field self::Class<core::int?> e5 = #C5;
-static const field self::Class<core::Null?> e6 = #C6;
+static const field self::Class<Null> e6 = #C6;
 static const field self::Class<core::int> e7 = #C4;
 static const field self::Class<core::int?> e8 = #C8;
-static const field self::Class<core::Null?> e9 = #C9;
+static const field self::Class<Null> e9 = #C9;
 static const field self::Class<core::int> e10 = #C7;
 static const field self::Class<core::int?> e11 = #C5;
-static const field self::Class<core::Null?> e12 = #C6;
+static const field self::Class<Null> e12 = #C6;
 static method main() → dynamic {
   self::expect(null is{ForNonNullableByDefault} core::int?, #C2, "null is int?");
   self::expect(null is{ForNonNullableByDefault} core::int, #C3, "null is int");
-  self::expect(null is{ForNonNullableByDefault} core::Null?, #C2, "null is Null");
+  self::expect(null is{ForNonNullableByDefault} Null, #C2, "null is Null");
   self::expect(null is{ForNonNullableByDefault} Never?, #C2, "null is Never?");
   self::expect(null is{ForNonNullableByDefault} Never, #C3, "null is Never");
   self::expect(null is{ForNonNullableByDefault} FutureOr<core::int?>, #C2, "null is FutureOr<int?>");
   self::expect(null is{ForNonNullableByDefault} FutureOr<core::int>, #C3, "null is FutureOr<int>");
   self::expect(null is{ForNonNullableByDefault} FutureOr<core::int>?, #C2, "null is FutureOr<int>?");
-  self::expect(null is{ForNonNullableByDefault} FutureOr<core::Null?>, #C2, "null is FutureOr<Null>");
-  self::expect(null is{ForNonNullableByDefault} FutureOr<core::Null?>?, #C2, "null is FutureOr<Null>?");
+  self::expect(null is{ForNonNullableByDefault} FutureOr<Null>, #C2, "null is FutureOr<Null>");
+  self::expect(null is{ForNonNullableByDefault} FutureOr<Null>?, #C2, "null is FutureOr<Null>?");
   self::expect(null is{ForNonNullableByDefault} FutureOr<Never>, #C3, "null is FutureOr<Never>");
   self::expect(null is{ForNonNullableByDefault} FutureOr<Never?>, #C2, "null is FutureOr<Never?>");
   self::expect(null is{ForNonNullableByDefault} FutureOr<Never>?, #C2, "null is FutureOr<Never>?");
   self::expect(new self::Class::constructor1<core::int>(null).{self::Class::field}, (#C4).{self::Class::field}, "Class<int>.constructor1(null).field");
   self::expect(true, new self::Class::constructor1<core::int?>(null).{self::Class::field}, "new Class<int?>.constructor1(null).field");
   self::expect(!self::isWeakMode, (#C5).{self::Class::field}, "const Class<int?>.constructor1(null).field");
-  self::expect(new self::Class::constructor1<core::Null?>(null).{self::Class::field}, (#C6).{self::Class::field}, "Class<Null>.constructor1(null).field");
+  self::expect(new self::Class::constructor1<Null>(null).{self::Class::field}, (#C6).{self::Class::field}, "Class<Null>.constructor1(null).field");
   self::expect(new self::Class::constructor2<core::int>(null).{self::Class::field}, (#C7).{self::Class::field}, "Class<int>.constructor2(null).field");
   self::expect(true, new self::Class::constructor2<core::int?>(null).{self::Class::field}, "new Class<int?>.constructor2(null).field");
   self::expect(new self::Class::constructor2<core::int?>(null).{self::Class::field}, (#C5).{self::Class::field}, "Class<int?>.constructor2(null).field");
-  self::expect(new self::Class::constructor2<core::Null?>(null).{self::Class::field}, (#C6).{self::Class::field}, "Class<Null>.constructor2(null).field");
+  self::expect(new self::Class::constructor2<Null>(null).{self::Class::field}, (#C6).{self::Class::field}, "Class<Null>.constructor2(null).field");
   self::expect(new self::Class::constructor3<core::int>(null).{self::Class::field}, (#C4).{self::Class::field}, "Class<int>.constructor3(null).field");
   self::expect(new self::Class::constructor3<core::int?>(null).{self::Class::field}, (#C8).{self::Class::field}, "Class<int?>.constructor3(null).field");
   self::expect(new self::Class::constructor3<core::int?>(null).{self::Class::field}, (#C8).{self::Class::field}, "Class<int?>.constructor3(null).field");
-  self::expect(new self::Class::constructor3<core::Null?>(null).{self::Class::field}, (#C9).{self::Class::field}, "Class<Null>.constructor3(null).field");
+  self::expect(new self::Class::constructor3<Null>(null).{self::Class::field}, (#C9).{self::Class::field}, "Class<Null>.constructor3(null).field");
   self::expect(new self::Class::constructor4<core::int>(null).{self::Class::field}, (#C7).{self::Class::field}, "Class<int>.constructor4(null).field");
   self::expect(new self::Class::constructor4<core::int?>(null).{self::Class::field}, (#C5).{self::Class::field}, "Class<int?>.constructor4(null).field");
-  self::expect(new self::Class::constructor4<core::Null?>(null).{self::Class::field}, (#C6).{self::Class::field}, "Class<Null>.constructor4(null).field");
+  self::expect(new self::Class::constructor4<Null>(null).{self::Class::field}, (#C6).{self::Class::field}, "Class<Null>.constructor4(null).field");
 }
 static method expect(dynamic expected, dynamic actual, core::String message) → dynamic {
   if(!expected.{core::Object::==}(actual))
@@ -81,13 +81,13 @@
 }
 
 constants  {
-  #C1 = <core::Null?>[]
+  #C1 = <Null>[]
   #C2 = true
   #C3 = false
   #C4 = self::Class<core::int> {field:#C3}
   #C5 = self::Class<core::int?> {field:#C2}
-  #C6 = self::Class<core::Null?> {field:#C2}
+  #C6 = self::Class<Null> {field:#C2}
   #C7 = self::Class<core::int> {field:#C2}
   #C8 = self::Class<core::int?> {field:#C3}
-  #C9 = self::Class<core::Null?> {field:#C3}
+  #C9 = self::Class<Null> {field:#C3}
 }
diff --git a/pkg/front_end/testcases/nnbd/constant_null_is.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/constant_null_is.dart.strong.transformed.expect
index 72bc1d1..a6548c6 100644
--- a/pkg/front_end/testcases/nnbd/constant_null_is.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/constant_null_is.dart.strong.transformed.expect
@@ -35,45 +35,45 @@
 static const field core::bool c12 = #C2;
 static const field self::Class<core::int> e1 = #C4;
 static const field self::Class<core::int?> e2 = #C5;
-static const field self::Class<core::Null?> e3 = #C6;
+static const field self::Class<Null> e3 = #C6;
 static const field self::Class<core::int> e4 = #C7;
 static const field self::Class<core::int?> e5 = #C5;
-static const field self::Class<core::Null?> e6 = #C6;
+static const field self::Class<Null> e6 = #C6;
 static const field self::Class<core::int> e7 = #C4;
 static const field self::Class<core::int?> e8 = #C8;
-static const field self::Class<core::Null?> e9 = #C9;
+static const field self::Class<Null> e9 = #C9;
 static const field self::Class<core::int> e10 = #C7;
 static const field self::Class<core::int?> e11 = #C5;
-static const field self::Class<core::Null?> e12 = #C6;
+static const field self::Class<Null> e12 = #C6;
 static method main() → dynamic {
   self::expect(null is{ForNonNullableByDefault} core::int?, #C2, "null is int?");
   self::expect(null is{ForNonNullableByDefault} core::int, #C3, "null is int");
-  self::expect(null is{ForNonNullableByDefault} core::Null?, #C2, "null is Null");
+  self::expect(null is{ForNonNullableByDefault} Null, #C2, "null is Null");
   self::expect(null is{ForNonNullableByDefault} Never?, #C2, "null is Never?");
   self::expect(null is{ForNonNullableByDefault} Never, #C3, "null is Never");
   self::expect(null is{ForNonNullableByDefault} FutureOr<core::int?>, #C2, "null is FutureOr<int?>");
   self::expect(null is{ForNonNullableByDefault} FutureOr<core::int>, #C3, "null is FutureOr<int>");
   self::expect(null is{ForNonNullableByDefault} FutureOr<core::int>?, #C2, "null is FutureOr<int>?");
-  self::expect(null is{ForNonNullableByDefault} FutureOr<core::Null?>, #C2, "null is FutureOr<Null>");
-  self::expect(null is{ForNonNullableByDefault} FutureOr<core::Null?>?, #C2, "null is FutureOr<Null>?");
+  self::expect(null is{ForNonNullableByDefault} FutureOr<Null>, #C2, "null is FutureOr<Null>");
+  self::expect(null is{ForNonNullableByDefault} FutureOr<Null>?, #C2, "null is FutureOr<Null>?");
   self::expect(null is{ForNonNullableByDefault} FutureOr<Never>, #C3, "null is FutureOr<Never>");
   self::expect(null is{ForNonNullableByDefault} FutureOr<Never?>, #C2, "null is FutureOr<Never?>");
   self::expect(null is{ForNonNullableByDefault} FutureOr<Never>?, #C2, "null is FutureOr<Never>?");
   self::expect(new self::Class::constructor1<core::int>(null).{self::Class::field}, (#C4).{self::Class::field}, "Class<int>.constructor1(null).field");
   self::expect(true, new self::Class::constructor1<core::int?>(null).{self::Class::field}, "new Class<int?>.constructor1(null).field");
   self::expect(!self::isWeakMode, (#C5).{self::Class::field}, "const Class<int?>.constructor1(null).field");
-  self::expect(new self::Class::constructor1<core::Null?>(null).{self::Class::field}, (#C6).{self::Class::field}, "Class<Null>.constructor1(null).field");
+  self::expect(new self::Class::constructor1<Null>(null).{self::Class::field}, (#C6).{self::Class::field}, "Class<Null>.constructor1(null).field");
   self::expect(new self::Class::constructor2<core::int>(null).{self::Class::field}, (#C7).{self::Class::field}, "Class<int>.constructor2(null).field");
   self::expect(true, new self::Class::constructor2<core::int?>(null).{self::Class::field}, "new Class<int?>.constructor2(null).field");
   self::expect(new self::Class::constructor2<core::int?>(null).{self::Class::field}, (#C5).{self::Class::field}, "Class<int?>.constructor2(null).field");
-  self::expect(new self::Class::constructor2<core::Null?>(null).{self::Class::field}, (#C6).{self::Class::field}, "Class<Null>.constructor2(null).field");
+  self::expect(new self::Class::constructor2<Null>(null).{self::Class::field}, (#C6).{self::Class::field}, "Class<Null>.constructor2(null).field");
   self::expect(new self::Class::constructor3<core::int>(null).{self::Class::field}, (#C4).{self::Class::field}, "Class<int>.constructor3(null).field");
   self::expect(new self::Class::constructor3<core::int?>(null).{self::Class::field}, (#C8).{self::Class::field}, "Class<int?>.constructor3(null).field");
   self::expect(new self::Class::constructor3<core::int?>(null).{self::Class::field}, (#C8).{self::Class::field}, "Class<int?>.constructor3(null).field");
-  self::expect(new self::Class::constructor3<core::Null?>(null).{self::Class::field}, (#C9).{self::Class::field}, "Class<Null>.constructor3(null).field");
+  self::expect(new self::Class::constructor3<Null>(null).{self::Class::field}, (#C9).{self::Class::field}, "Class<Null>.constructor3(null).field");
   self::expect(new self::Class::constructor4<core::int>(null).{self::Class::field}, (#C7).{self::Class::field}, "Class<int>.constructor4(null).field");
   self::expect(new self::Class::constructor4<core::int?>(null).{self::Class::field}, (#C5).{self::Class::field}, "Class<int?>.constructor4(null).field");
-  self::expect(new self::Class::constructor4<core::Null?>(null).{self::Class::field}, (#C6).{self::Class::field}, "Class<Null>.constructor4(null).field");
+  self::expect(new self::Class::constructor4<Null>(null).{self::Class::field}, (#C6).{self::Class::field}, "Class<Null>.constructor4(null).field");
 }
 static method expect(dynamic expected, dynamic actual, core::String message) → dynamic {
   if(!expected.{core::Object::==}(actual))
@@ -81,15 +81,15 @@
 }
 
 constants  {
-  #C1 = <core::Null?>[]
+  #C1 = <Null>[]
   #C2 = true
   #C3 = false
   #C4 = self::Class<core::int> {field:#C3}
   #C5 = self::Class<core::int?> {field:#C2}
-  #C6 = self::Class<core::Null?> {field:#C2}
+  #C6 = self::Class<Null> {field:#C2}
   #C7 = self::Class<core::int> {field:#C2}
   #C8 = self::Class<core::int?> {field:#C3}
-  #C9 = self::Class<core::Null?> {field:#C3}
+  #C9 = self::Class<Null> {field:#C3}
 }
 
 Extra constant evaluation status:
diff --git a/pkg/front_end/testcases/nnbd/constant_null_is.dart.weak.expect b/pkg/front_end/testcases/nnbd/constant_null_is.dart.weak.expect
index 1c2af1f..5ff7516 100644
--- a/pkg/front_end/testcases/nnbd/constant_null_is.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/constant_null_is.dart.weak.expect
@@ -35,45 +35,45 @@
 static const field core::bool c12 = #C2;
 static const field self::Class<core::int> e1 = #C4;
 static const field self::Class<core::int?> e2 = #C4;
-static const field self::Class<core::Null?> e3 = #C5;
+static const field self::Class<Null> e3 = #C5;
 static const field self::Class<core::int> e4 = #C6;
 static const field self::Class<core::int?> e5 = #C6;
-static const field self::Class<core::Null?> e6 = #C5;
+static const field self::Class<Null> e6 = #C5;
 static const field self::Class<core::int> e7 = #C4;
 static const field self::Class<core::int?> e8 = #C4;
-static const field self::Class<core::Null?> e9 = #C7;
+static const field self::Class<Null> e9 = #C7;
 static const field self::Class<core::int> e10 = #C6;
 static const field self::Class<core::int?> e11 = #C6;
-static const field self::Class<core::Null?> e12 = #C5;
+static const field self::Class<Null> e12 = #C5;
 static method main() → dynamic {
   self::expect(null is{ForNonNullableByDefault} core::int?, #C2, "null is int?");
   self::expect(null is{ForNonNullableByDefault} core::int, #C3, "null is int");
-  self::expect(null is{ForNonNullableByDefault} core::Null?, #C2, "null is Null");
+  self::expect(null is{ForNonNullableByDefault} Null, #C2, "null is Null");
   self::expect(null is{ForNonNullableByDefault} Never?, #C2, "null is Never?");
   self::expect(null is{ForNonNullableByDefault} Never, #C3, "null is Never");
   self::expect(null is{ForNonNullableByDefault} FutureOr<core::int?>, #C2, "null is FutureOr<int?>");
   self::expect(null is{ForNonNullableByDefault} FutureOr<core::int>, #C3, "null is FutureOr<int>");
   self::expect(null is{ForNonNullableByDefault} FutureOr<core::int>?, #C2, "null is FutureOr<int>?");
-  self::expect(null is{ForNonNullableByDefault} FutureOr<core::Null?>, #C2, "null is FutureOr<Null>");
-  self::expect(null is{ForNonNullableByDefault} FutureOr<core::Null?>?, #C2, "null is FutureOr<Null>?");
+  self::expect(null is{ForNonNullableByDefault} FutureOr<Null>, #C2, "null is FutureOr<Null>");
+  self::expect(null is{ForNonNullableByDefault} FutureOr<Null>?, #C2, "null is FutureOr<Null>?");
   self::expect(null is{ForNonNullableByDefault} FutureOr<Never>, #C3, "null is FutureOr<Never>");
   self::expect(null is{ForNonNullableByDefault} FutureOr<Never?>, #C2, "null is FutureOr<Never?>");
   self::expect(null is{ForNonNullableByDefault} FutureOr<Never>?, #C2, "null is FutureOr<Never>?");
   self::expect(new self::Class::constructor1<core::int>(null).{self::Class::field}, (#C4).{self::Class::field}, "Class<int>.constructor1(null).field");
   self::expect(true, new self::Class::constructor1<core::int?>(null).{self::Class::field}, "new Class<int?>.constructor1(null).field");
   self::expect(!self::isWeakMode, (#C4).{self::Class::field}, "const Class<int?>.constructor1(null).field");
-  self::expect(new self::Class::constructor1<core::Null?>(null).{self::Class::field}, (#C5).{self::Class::field}, "Class<Null>.constructor1(null).field");
+  self::expect(new self::Class::constructor1<Null>(null).{self::Class::field}, (#C5).{self::Class::field}, "Class<Null>.constructor1(null).field");
   self::expect(new self::Class::constructor2<core::int>(null).{self::Class::field}, (#C6).{self::Class::field}, "Class<int>.constructor2(null).field");
   self::expect(true, new self::Class::constructor2<core::int?>(null).{self::Class::field}, "new Class<int?>.constructor2(null).field");
   self::expect(new self::Class::constructor2<core::int?>(null).{self::Class::field}, (#C6).{self::Class::field}, "Class<int?>.constructor2(null).field");
-  self::expect(new self::Class::constructor2<core::Null?>(null).{self::Class::field}, (#C5).{self::Class::field}, "Class<Null>.constructor2(null).field");
+  self::expect(new self::Class::constructor2<Null>(null).{self::Class::field}, (#C5).{self::Class::field}, "Class<Null>.constructor2(null).field");
   self::expect(new self::Class::constructor3<core::int>(null).{self::Class::field}, (#C4).{self::Class::field}, "Class<int>.constructor3(null).field");
   self::expect(new self::Class::constructor3<core::int?>(null).{self::Class::field}, (#C4).{self::Class::field}, "Class<int?>.constructor3(null).field");
   self::expect(new self::Class::constructor3<core::int?>(null).{self::Class::field}, (#C4).{self::Class::field}, "Class<int?>.constructor3(null).field");
-  self::expect(new self::Class::constructor3<core::Null?>(null).{self::Class::field}, (#C7).{self::Class::field}, "Class<Null>.constructor3(null).field");
+  self::expect(new self::Class::constructor3<Null>(null).{self::Class::field}, (#C7).{self::Class::field}, "Class<Null>.constructor3(null).field");
   self::expect(new self::Class::constructor4<core::int>(null).{self::Class::field}, (#C6).{self::Class::field}, "Class<int>.constructor4(null).field");
   self::expect(new self::Class::constructor4<core::int?>(null).{self::Class::field}, (#C6).{self::Class::field}, "Class<int?>.constructor4(null).field");
-  self::expect(new self::Class::constructor4<core::Null?>(null).{self::Class::field}, (#C5).{self::Class::field}, "Class<Null>.constructor4(null).field");
+  self::expect(new self::Class::constructor4<Null>(null).{self::Class::field}, (#C5).{self::Class::field}, "Class<Null>.constructor4(null).field");
 }
 static method expect(dynamic expected, dynamic actual, core::String message) → dynamic {
   if(!expected.{core::Object::==}(actual))
@@ -81,11 +81,11 @@
 }
 
 constants  {
-  #C1 = <core::Null?>[]
+  #C1 = <Null>[]
   #C2 = true
   #C3 = false
   #C4 = self::Class<core::int*> {field:#C3}
-  #C5 = self::Class<core::Null?> {field:#C2}
+  #C5 = self::Class<Null> {field:#C2}
   #C6 = self::Class<core::int*> {field:#C2}
-  #C7 = self::Class<core::Null?> {field:#C3}
+  #C7 = self::Class<Null> {field:#C3}
 }
diff --git a/pkg/front_end/testcases/nnbd/constant_null_is.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/constant_null_is.dart.weak.transformed.expect
index 4bd5117..72bc3fa 100644
--- a/pkg/front_end/testcases/nnbd/constant_null_is.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/constant_null_is.dart.weak.transformed.expect
@@ -35,45 +35,45 @@
 static const field core::bool c12 = #C2;
 static const field self::Class<core::int> e1 = #C4;
 static const field self::Class<core::int?> e2 = #C4;
-static const field self::Class<core::Null?> e3 = #C5;
+static const field self::Class<Null> e3 = #C5;
 static const field self::Class<core::int> e4 = #C6;
 static const field self::Class<core::int?> e5 = #C6;
-static const field self::Class<core::Null?> e6 = #C5;
+static const field self::Class<Null> e6 = #C5;
 static const field self::Class<core::int> e7 = #C4;
 static const field self::Class<core::int?> e8 = #C4;
-static const field self::Class<core::Null?> e9 = #C7;
+static const field self::Class<Null> e9 = #C7;
 static const field self::Class<core::int> e10 = #C6;
 static const field self::Class<core::int?> e11 = #C6;
-static const field self::Class<core::Null?> e12 = #C5;
+static const field self::Class<Null> e12 = #C5;
 static method main() → dynamic {
   self::expect(null is{ForNonNullableByDefault} core::int?, #C2, "null is int?");
   self::expect(null is{ForNonNullableByDefault} core::int, #C3, "null is int");
-  self::expect(null is{ForNonNullableByDefault} core::Null?, #C2, "null is Null");
+  self::expect(null is{ForNonNullableByDefault} Null, #C2, "null is Null");
   self::expect(null is{ForNonNullableByDefault} Never?, #C2, "null is Never?");
   self::expect(null is{ForNonNullableByDefault} Never, #C3, "null is Never");
   self::expect(null is{ForNonNullableByDefault} FutureOr<core::int?>, #C2, "null is FutureOr<int?>");
   self::expect(null is{ForNonNullableByDefault} FutureOr<core::int>, #C3, "null is FutureOr<int>");
   self::expect(null is{ForNonNullableByDefault} FutureOr<core::int>?, #C2, "null is FutureOr<int>?");
-  self::expect(null is{ForNonNullableByDefault} FutureOr<core::Null?>, #C2, "null is FutureOr<Null>");
-  self::expect(null is{ForNonNullableByDefault} FutureOr<core::Null?>?, #C2, "null is FutureOr<Null>?");
+  self::expect(null is{ForNonNullableByDefault} FutureOr<Null>, #C2, "null is FutureOr<Null>");
+  self::expect(null is{ForNonNullableByDefault} FutureOr<Null>?, #C2, "null is FutureOr<Null>?");
   self::expect(null is{ForNonNullableByDefault} FutureOr<Never>, #C3, "null is FutureOr<Never>");
   self::expect(null is{ForNonNullableByDefault} FutureOr<Never?>, #C2, "null is FutureOr<Never?>");
   self::expect(null is{ForNonNullableByDefault} FutureOr<Never>?, #C2, "null is FutureOr<Never>?");
   self::expect(new self::Class::constructor1<core::int>(null).{self::Class::field}, (#C4).{self::Class::field}, "Class<int>.constructor1(null).field");
   self::expect(true, new self::Class::constructor1<core::int?>(null).{self::Class::field}, "new Class<int?>.constructor1(null).field");
   self::expect(!self::isWeakMode, (#C4).{self::Class::field}, "const Class<int?>.constructor1(null).field");
-  self::expect(new self::Class::constructor1<core::Null?>(null).{self::Class::field}, (#C5).{self::Class::field}, "Class<Null>.constructor1(null).field");
+  self::expect(new self::Class::constructor1<Null>(null).{self::Class::field}, (#C5).{self::Class::field}, "Class<Null>.constructor1(null).field");
   self::expect(new self::Class::constructor2<core::int>(null).{self::Class::field}, (#C6).{self::Class::field}, "Class<int>.constructor2(null).field");
   self::expect(true, new self::Class::constructor2<core::int?>(null).{self::Class::field}, "new Class<int?>.constructor2(null).field");
   self::expect(new self::Class::constructor2<core::int?>(null).{self::Class::field}, (#C6).{self::Class::field}, "Class<int?>.constructor2(null).field");
-  self::expect(new self::Class::constructor2<core::Null?>(null).{self::Class::field}, (#C5).{self::Class::field}, "Class<Null>.constructor2(null).field");
+  self::expect(new self::Class::constructor2<Null>(null).{self::Class::field}, (#C5).{self::Class::field}, "Class<Null>.constructor2(null).field");
   self::expect(new self::Class::constructor3<core::int>(null).{self::Class::field}, (#C4).{self::Class::field}, "Class<int>.constructor3(null).field");
   self::expect(new self::Class::constructor3<core::int?>(null).{self::Class::field}, (#C4).{self::Class::field}, "Class<int?>.constructor3(null).field");
   self::expect(new self::Class::constructor3<core::int?>(null).{self::Class::field}, (#C4).{self::Class::field}, "Class<int?>.constructor3(null).field");
-  self::expect(new self::Class::constructor3<core::Null?>(null).{self::Class::field}, (#C7).{self::Class::field}, "Class<Null>.constructor3(null).field");
+  self::expect(new self::Class::constructor3<Null>(null).{self::Class::field}, (#C7).{self::Class::field}, "Class<Null>.constructor3(null).field");
   self::expect(new self::Class::constructor4<core::int>(null).{self::Class::field}, (#C6).{self::Class::field}, "Class<int>.constructor4(null).field");
   self::expect(new self::Class::constructor4<core::int?>(null).{self::Class::field}, (#C6).{self::Class::field}, "Class<int?>.constructor4(null).field");
-  self::expect(new self::Class::constructor4<core::Null?>(null).{self::Class::field}, (#C5).{self::Class::field}, "Class<Null>.constructor4(null).field");
+  self::expect(new self::Class::constructor4<Null>(null).{self::Class::field}, (#C5).{self::Class::field}, "Class<Null>.constructor4(null).field");
 }
 static method expect(dynamic expected, dynamic actual, core::String message) → dynamic {
   if(!expected.{core::Object::==}(actual))
@@ -81,13 +81,13 @@
 }
 
 constants  {
-  #C1 = <core::Null?>[]
+  #C1 = <Null>[]
   #C2 = true
   #C3 = false
   #C4 = self::Class<core::int*> {field:#C3}
-  #C5 = self::Class<core::Null?> {field:#C2}
+  #C5 = self::Class<Null> {field:#C2}
   #C6 = self::Class<core::int*> {field:#C2}
-  #C7 = self::Class<core::Null?> {field:#C3}
+  #C7 = self::Class<Null> {field:#C3}
 }
 
 Extra constant evaluation status:
diff --git a/pkg/front_end/testcases/nnbd/constants.dart.outline.expect b/pkg/front_end/testcases/nnbd/constants.dart.outline.expect
index 4de21ca..2ca773c 100644
--- a/pkg/front_end/testcases/nnbd/constants.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/constants.dart.outline.expect
@@ -69,10 +69,10 @@
 Evaluated: TypeLiteral @ org-dartlang-testcase:///constants.dart:13:29 -> TypeLiteralConstant(dynamic Function(dynamic))
 Evaluated: TypeLiteral @ org-dartlang-testcase:///constants.dart:14:36 -> TypeLiteralConstant(T% Function<T>(T%))
 Evaluated: ListLiteral @ org-dartlang-testcase:///constants.dart:15:26 -> ListConstant(const <int>[0])
-Evaluated: SetLiteral @ org-dartlang-testcase:///constants.dart:16:25 -> InstanceConstant(const _UnmodifiableSet<int>{_UnmodifiableSet._map: const _ImmutableMap<int, Null?>{_ImmutableMap._kvPairs: const <dynamic>[0, null]}})
+Evaluated: SetLiteral @ org-dartlang-testcase:///constants.dart:16:25 -> InstanceConstant(const _UnmodifiableSet<int>{_UnmodifiableSet._map: const _ImmutableMap<int, Null>{_ImmutableMap._kvPairs: const <dynamic>[0, null]}})
 Evaluated: MapLiteral @ org-dartlang-testcase:///constants.dart:17:33 -> InstanceConstant(const _ImmutableMap<int, String>{_ImmutableMap._kvPairs: const <dynamic>[0, "foo"]})
 Evaluated: ListConcatenation @ org-dartlang-testcase:///constants.dart:18:32 -> ListConstant(const <int>[0])
-Evaluated: SetConcatenation @ org-dartlang-testcase:///constants.dart:19:31 -> InstanceConstant(const _UnmodifiableSet<int>{_UnmodifiableSet._map: const _ImmutableMap<int, Null?>{_ImmutableMap._kvPairs: const <dynamic>[0, null]}})
+Evaluated: SetConcatenation @ org-dartlang-testcase:///constants.dart:19:31 -> InstanceConstant(const _UnmodifiableSet<int>{_UnmodifiableSet._map: const _ImmutableMap<int, Null>{_ImmutableMap._kvPairs: const <dynamic>[0, null]}})
 Evaluated: MapConcatenation @ org-dartlang-testcase:///constants.dart:20:7 -> InstanceConstant(const _ImmutableMap<int, String>{_ImmutableMap._kvPairs: const <dynamic>[0, "foo"]})
 Evaluated: StaticInvocation @ org-dartlang-testcase:///constants.dart:23:5 -> BoolConstant(true)
 Evaluated: StaticInvocation @ org-dartlang-testcase:///constants.dart:25:5 -> BoolConstant(true)
@@ -92,9 +92,9 @@
 Evaluated: TypeLiteral @ org-dartlang-testcase:///constants_lib.dart:20:29 -> TypeLiteralConstant(dynamic Function(dynamic))
 Evaluated: TypeLiteral @ org-dartlang-testcase:///constants_lib.dart:21:36 -> TypeLiteralConstant(T% Function<T>(T%))
 Evaluated: ListLiteral @ org-dartlang-testcase:///constants_lib.dart:22:26 -> ListConstant(const <int>[0])
-Evaluated: SetLiteral @ org-dartlang-testcase:///constants_lib.dart:23:25 -> InstanceConstant(const _UnmodifiableSet<int>{_UnmodifiableSet._map: const _ImmutableMap<int, Null?>{_ImmutableMap._kvPairs: const <dynamic>[0, null]}})
+Evaluated: SetLiteral @ org-dartlang-testcase:///constants_lib.dart:23:25 -> InstanceConstant(const _UnmodifiableSet<int>{_UnmodifiableSet._map: const _ImmutableMap<int, Null>{_ImmutableMap._kvPairs: const <dynamic>[0, null]}})
 Evaluated: MapLiteral @ org-dartlang-testcase:///constants_lib.dart:24:33 -> InstanceConstant(const _ImmutableMap<int, String>{_ImmutableMap._kvPairs: const <dynamic>[0, "foo"]})
 Evaluated: ListConcatenation @ org-dartlang-testcase:///constants_lib.dart:25:32 -> ListConstant(const <int>[0])
-Evaluated: SetConcatenation @ org-dartlang-testcase:///constants_lib.dart:26:31 -> InstanceConstant(const _UnmodifiableSet<int>{_UnmodifiableSet._map: const _ImmutableMap<int, Null?>{_ImmutableMap._kvPairs: const <dynamic>[0, null]}})
+Evaluated: SetConcatenation @ org-dartlang-testcase:///constants_lib.dart:26:31 -> InstanceConstant(const _UnmodifiableSet<int>{_UnmodifiableSet._map: const _ImmutableMap<int, Null>{_ImmutableMap._kvPairs: const <dynamic>[0, null]}})
 Evaluated: MapConcatenation @ org-dartlang-testcase:///constants_lib.dart:27:7 -> InstanceConstant(const _ImmutableMap<int, String>{_ImmutableMap._kvPairs: const <dynamic>[0, "foo"]})
 Extra constant evaluation: evaluated: 35, effectively constant: 34
diff --git a/pkg/front_end/testcases/nnbd/constants.dart.strong.expect b/pkg/front_end/testcases/nnbd/constants.dart.strong.expect
index 6ff5eb2..d2ed836 100644
--- a/pkg/front_end/testcases/nnbd/constants.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/constants.dart.strong.expect
@@ -98,7 +98,7 @@
   #C8 = <core::int>[#C4]
   #C9 = null
   #C10 = <dynamic>[#C4, #C9]
-  #C11 = core::_ImmutableMap<core::int, core::Null?> {_kvPairs:#C10}
+  #C11 = core::_ImmutableMap<core::int, Null> {_kvPairs:#C10}
   #C12 = col::_UnmodifiableSet<core::int> {_map:#C11}
   #C13 = "foo"
   #C14 = <dynamic>[#C4, #C13]
diff --git a/pkg/front_end/testcases/nnbd/constants.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/constants.dart.strong.transformed.expect
index 6ff5eb2..d2ed836 100644
--- a/pkg/front_end/testcases/nnbd/constants.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/constants.dart.strong.transformed.expect
@@ -98,7 +98,7 @@
   #C8 = <core::int>[#C4]
   #C9 = null
   #C10 = <dynamic>[#C4, #C9]
-  #C11 = core::_ImmutableMap<core::int, core::Null?> {_kvPairs:#C10}
+  #C11 = core::_ImmutableMap<core::int, Null> {_kvPairs:#C10}
   #C12 = col::_UnmodifiableSet<core::int> {_map:#C11}
   #C13 = "foo"
   #C14 = <dynamic>[#C4, #C13]
diff --git a/pkg/front_end/testcases/nnbd/constants.dart.weak.expect b/pkg/front_end/testcases/nnbd/constants.dart.weak.expect
index 787be87..be9f59d 100644
--- a/pkg/front_end/testcases/nnbd/constants.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/constants.dart.weak.expect
@@ -98,7 +98,7 @@
   #C8 = <core::int*>[#C4]
   #C9 = null
   #C10 = <dynamic>[#C4, #C9]
-  #C11 = core::_ImmutableMap<core::int*, core::Null?> {_kvPairs:#C10}
+  #C11 = core::_ImmutableMap<core::int*, Null> {_kvPairs:#C10}
   #C12 = col::_UnmodifiableSet<core::int*> {_map:#C11}
   #C13 = "foo"
   #C14 = <dynamic>[#C4, #C13]
diff --git a/pkg/front_end/testcases/nnbd/constants.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/constants.dart.weak.transformed.expect
index 787be87..be9f59d 100644
--- a/pkg/front_end/testcases/nnbd/constants.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/constants.dart.weak.transformed.expect
@@ -98,7 +98,7 @@
   #C8 = <core::int*>[#C4]
   #C9 = null
   #C10 = <dynamic>[#C4, #C9]
-  #C11 = core::_ImmutableMap<core::int*, core::Null?> {_kvPairs:#C10}
+  #C11 = core::_ImmutableMap<core::int*, Null> {_kvPairs:#C10}
   #C12 = col::_UnmodifiableSet<core::int*> {_map:#C11}
   #C13 = "foo"
   #C14 = <dynamic>[#C4, #C13]
diff --git a/pkg/front_end/testcases/nnbd/covariant_nnbd_top_merge.dart.outline.expect b/pkg/front_end/testcases/nnbd/covariant_nnbd_top_merge.dart.outline.expect
index 27f6cc7..9504dc6 100644
--- a/pkg/front_end/testcases/nnbd/covariant_nnbd_top_merge.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/covariant_nnbd_top_merge.dart.outline.expect
@@ -34,7 +34,7 @@
 abstract class D4 extends core::Object implements self::C, self::B {
   synthetic constructor •() → self::D4
     ;
-  abstract forwarding-stub method method(covariant core::num a) → void;
+  abstract member-signature method method(covariant core::num a) → void; -> self::B::method
 }
 abstract class D5 extends core::Object implements self::A, self::C {
   synthetic constructor •() → self::D5
diff --git a/pkg/front_end/testcases/nnbd/covariant_nnbd_top_merge.dart.strong.expect b/pkg/front_end/testcases/nnbd/covariant_nnbd_top_merge.dart.strong.expect
index a513c5a..85ec816 100644
--- a/pkg/front_end/testcases/nnbd/covariant_nnbd_top_merge.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/covariant_nnbd_top_merge.dart.strong.expect
@@ -41,7 +41,7 @@
   synthetic constructor •() → self::D4
     : super core::Object::•()
     ;
-  abstract forwarding-stub method method(covariant core::num a) → void;
+  abstract member-signature method method(covariant core::num a) → void; -> self::B::method
 }
 abstract class D5 extends core::Object implements self::A, self::C {
   synthetic constructor •() → self::D5
diff --git a/pkg/front_end/testcases/nnbd/covariant_nnbd_top_merge.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/covariant_nnbd_top_merge.dart.strong.transformed.expect
index a513c5a..85ec816 100644
--- a/pkg/front_end/testcases/nnbd/covariant_nnbd_top_merge.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/covariant_nnbd_top_merge.dart.strong.transformed.expect
@@ -41,7 +41,7 @@
   synthetic constructor •() → self::D4
     : super core::Object::•()
     ;
-  abstract forwarding-stub method method(covariant core::num a) → void;
+  abstract member-signature method method(covariant core::num a) → void; -> self::B::method
 }
 abstract class D5 extends core::Object implements self::A, self::C {
   synthetic constructor •() → self::D5
diff --git a/pkg/front_end/testcases/nnbd/covariant_nnbd_top_merge.dart.weak.expect b/pkg/front_end/testcases/nnbd/covariant_nnbd_top_merge.dart.weak.expect
index a513c5a..85ec816 100644
--- a/pkg/front_end/testcases/nnbd/covariant_nnbd_top_merge.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/covariant_nnbd_top_merge.dart.weak.expect
@@ -41,7 +41,7 @@
   synthetic constructor •() → self::D4
     : super core::Object::•()
     ;
-  abstract forwarding-stub method method(covariant core::num a) → void;
+  abstract member-signature method method(covariant core::num a) → void; -> self::B::method
 }
 abstract class D5 extends core::Object implements self::A, self::C {
   synthetic constructor •() → self::D5
diff --git a/pkg/front_end/testcases/nnbd/covariant_nnbd_top_merge.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/covariant_nnbd_top_merge.dart.weak.transformed.expect
index a513c5a..85ec816 100644
--- a/pkg/front_end/testcases/nnbd/covariant_nnbd_top_merge.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/covariant_nnbd_top_merge.dart.weak.transformed.expect
@@ -41,7 +41,7 @@
   synthetic constructor •() → self::D4
     : super core::Object::•()
     ;
-  abstract forwarding-stub method method(covariant core::num a) → void;
+  abstract member-signature method method(covariant core::num a) → void; -> self::B::method
 }
 abstract class D5 extends core::Object implements self::A, self::C {
   synthetic constructor •() → self::D5
diff --git a/pkg/front_end/testcases/nnbd/definitely_assigned.dart.outline.expect b/pkg/front_end/testcases/nnbd/definitely_assigned.dart.outline.expect
index 1a5e8e7..4078e3a 100644
--- a/pkg/front_end/testcases/nnbd/definitely_assigned.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/definitely_assigned.dart.outline.expect
@@ -4,9 +4,9 @@
 
 import "dart:async";
 
-static field <T extends core::Object? = dynamic>(T%) → core::Null? fieldDirect;
-static field <T extends core::Object? = dynamic>(core::bool, T%) → core::Null? fieldConditional;
-static field () → core::Null? fieldCompound;
+static field <T extends core::Object? = dynamic>(T%) → Null fieldDirect;
+static field <T extends core::Object? = dynamic>(core::bool, T%) → Null fieldConditional;
+static field () → Null fieldCompound;
 static method methodDirect<T extends core::Object? = dynamic>(self::methodDirect::T% value) → dynamic
   ;
 static method methodConditional<T extends core::Object? = dynamic>(core::bool b, self::methodConditional::T% value) → dynamic
diff --git a/pkg/front_end/testcases/nnbd/definitely_assigned.dart.strong.expect b/pkg/front_end/testcases/nnbd/definitely_assigned.dart.strong.expect
index 31532b7..a63baf3 100644
--- a/pkg/front_end/testcases/nnbd/definitely_assigned.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/definitely_assigned.dart.strong.expect
@@ -63,7 +63,7 @@
 
 import "dart:async";
 
-static field <T extends core::Object? = dynamic>(T%) → core::Null? fieldDirect = <T extends core::Object? = dynamic>(T% value) → core::Null? {
+static field <T extends core::Object? = dynamic>(T%) → Null fieldDirect = <T extends core::Object? = dynamic>(T% value) → Null {
   late final T% local2;
   late final core::int local4;
   late final FutureOr<core::int>local6;
@@ -80,7 +80,7 @@
   local6 = 0; // error
   ^^^^^^" in local6 = 0;
 };
-static field <T extends core::Object? = dynamic>(core::bool, T%) → core::Null? fieldConditional = <T extends core::Object? = dynamic>(core::bool b, T% value) → core::Null? {
+static field <T extends core::Object? = dynamic>(core::bool, T%) → Null fieldConditional = <T extends core::Object? = dynamic>(core::bool b, T% value) → Null {
   late final T% local2;
   late final core::int local4;
   late final FutureOr<core::int>local6;
@@ -102,7 +102,7 @@
   local6 = 0; // error
   ^^^^^^" in local6 = 0;
 };
-static field () → core::Null? fieldCompound = () → core::Null? {
+static field () → Null fieldCompound = () → Null {
   late final core::int local4;
   local4 = 0;
   let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:88:3: Error: Late final variable 'local4' definitely assigned.
diff --git a/pkg/front_end/testcases/nnbd/definitely_assigned.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/definitely_assigned.dart.strong.transformed.expect
index 31532b7..a63baf3 100644
--- a/pkg/front_end/testcases/nnbd/definitely_assigned.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/definitely_assigned.dart.strong.transformed.expect
@@ -63,7 +63,7 @@
 
 import "dart:async";
 
-static field <T extends core::Object? = dynamic>(T%) → core::Null? fieldDirect = <T extends core::Object? = dynamic>(T% value) → core::Null? {
+static field <T extends core::Object? = dynamic>(T%) → Null fieldDirect = <T extends core::Object? = dynamic>(T% value) → Null {
   late final T% local2;
   late final core::int local4;
   late final FutureOr<core::int>local6;
@@ -80,7 +80,7 @@
   local6 = 0; // error
   ^^^^^^" in local6 = 0;
 };
-static field <T extends core::Object? = dynamic>(core::bool, T%) → core::Null? fieldConditional = <T extends core::Object? = dynamic>(core::bool b, T% value) → core::Null? {
+static field <T extends core::Object? = dynamic>(core::bool, T%) → Null fieldConditional = <T extends core::Object? = dynamic>(core::bool b, T% value) → Null {
   late final T% local2;
   late final core::int local4;
   late final FutureOr<core::int>local6;
@@ -102,7 +102,7 @@
   local6 = 0; // error
   ^^^^^^" in local6 = 0;
 };
-static field () → core::Null? fieldCompound = () → core::Null? {
+static field () → Null fieldCompound = () → Null {
   late final core::int local4;
   local4 = 0;
   let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:88:3: Error: Late final variable 'local4' definitely assigned.
diff --git a/pkg/front_end/testcases/nnbd/definitely_assigned.dart.weak.expect b/pkg/front_end/testcases/nnbd/definitely_assigned.dart.weak.expect
index 31532b7..a63baf3 100644
--- a/pkg/front_end/testcases/nnbd/definitely_assigned.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/definitely_assigned.dart.weak.expect
@@ -63,7 +63,7 @@
 
 import "dart:async";
 
-static field <T extends core::Object? = dynamic>(T%) → core::Null? fieldDirect = <T extends core::Object? = dynamic>(T% value) → core::Null? {
+static field <T extends core::Object? = dynamic>(T%) → Null fieldDirect = <T extends core::Object? = dynamic>(T% value) → Null {
   late final T% local2;
   late final core::int local4;
   late final FutureOr<core::int>local6;
@@ -80,7 +80,7 @@
   local6 = 0; // error
   ^^^^^^" in local6 = 0;
 };
-static field <T extends core::Object? = dynamic>(core::bool, T%) → core::Null? fieldConditional = <T extends core::Object? = dynamic>(core::bool b, T% value) → core::Null? {
+static field <T extends core::Object? = dynamic>(core::bool, T%) → Null fieldConditional = <T extends core::Object? = dynamic>(core::bool b, T% value) → Null {
   late final T% local2;
   late final core::int local4;
   late final FutureOr<core::int>local6;
@@ -102,7 +102,7 @@
   local6 = 0; // error
   ^^^^^^" in local6 = 0;
 };
-static field () → core::Null? fieldCompound = () → core::Null? {
+static field () → Null fieldCompound = () → Null {
   late final core::int local4;
   local4 = 0;
   let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:88:3: Error: Late final variable 'local4' definitely assigned.
diff --git a/pkg/front_end/testcases/nnbd/definitely_assigned.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/definitely_assigned.dart.weak.transformed.expect
index 31532b7..a63baf3 100644
--- a/pkg/front_end/testcases/nnbd/definitely_assigned.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/definitely_assigned.dart.weak.transformed.expect
@@ -63,7 +63,7 @@
 
 import "dart:async";
 
-static field <T extends core::Object? = dynamic>(T%) → core::Null? fieldDirect = <T extends core::Object? = dynamic>(T% value) → core::Null? {
+static field <T extends core::Object? = dynamic>(T%) → Null fieldDirect = <T extends core::Object? = dynamic>(T% value) → Null {
   late final T% local2;
   late final core::int local4;
   late final FutureOr<core::int>local6;
@@ -80,7 +80,7 @@
   local6 = 0; // error
   ^^^^^^" in local6 = 0;
 };
-static field <T extends core::Object? = dynamic>(core::bool, T%) → core::Null? fieldConditional = <T extends core::Object? = dynamic>(core::bool b, T% value) → core::Null? {
+static field <T extends core::Object? = dynamic>(core::bool, T%) → Null fieldConditional = <T extends core::Object? = dynamic>(core::bool b, T% value) → Null {
   late final T% local2;
   late final core::int local4;
   late final FutureOr<core::int>local6;
@@ -102,7 +102,7 @@
   local6 = 0; // error
   ^^^^^^" in local6 = 0;
 };
-static field () → core::Null? fieldCompound = () → core::Null? {
+static field () → Null fieldCompound = () → Null {
   late final core::int local4;
   local4 = 0;
   let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:88:3: Error: Late final variable 'local4' definitely assigned.
diff --git a/pkg/front_end/testcases/nnbd/definitely_unassigned.dart.outline.expect b/pkg/front_end/testcases/nnbd/definitely_unassigned.dart.outline.expect
index 1a5e8e7..4078e3a 100644
--- a/pkg/front_end/testcases/nnbd/definitely_unassigned.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/definitely_unassigned.dart.outline.expect
@@ -4,9 +4,9 @@
 
 import "dart:async";
 
-static field <T extends core::Object? = dynamic>(T%) → core::Null? fieldDirect;
-static field <T extends core::Object? = dynamic>(core::bool, T%) → core::Null? fieldConditional;
-static field () → core::Null? fieldCompound;
+static field <T extends core::Object? = dynamic>(T%) → Null fieldDirect;
+static field <T extends core::Object? = dynamic>(core::bool, T%) → Null fieldConditional;
+static field () → Null fieldCompound;
 static method methodDirect<T extends core::Object? = dynamic>(self::methodDirect::T% value) → dynamic
   ;
 static method methodConditional<T extends core::Object? = dynamic>(core::bool b, self::methodConditional::T% value) → dynamic
diff --git a/pkg/front_end/testcases/nnbd/definitely_unassigned.dart.strong.expect b/pkg/front_end/testcases/nnbd/definitely_unassigned.dart.strong.expect
index d23513e..1803f4a 100644
--- a/pkg/front_end/testcases/nnbd/definitely_unassigned.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/definitely_unassigned.dart.strong.expect
@@ -95,7 +95,7 @@
 
 import "dart:async";
 
-static field <T extends core::Object? = dynamic>(T%) → core::Null? fieldDirect = <T extends core::Object? = dynamic>(T% value) → core::Null? {
+static field <T extends core::Object? = dynamic>(T%) → Null fieldDirect = <T extends core::Object? = dynamic>(T% value) → Null {
   T% local1;
   late T% local2;
   core::int local3;
@@ -123,7 +123,7 @@
   ^^^^^^" in local6;
   local7;
 };
-static field <T extends core::Object? = dynamic>(core::bool, T%) → core::Null? fieldConditional = <T extends core::Object? = dynamic>(core::bool b, T% value) → core::Null? {
+static field <T extends core::Object? = dynamic>(core::bool, T%) → Null fieldConditional = <T extends core::Object? = dynamic>(core::bool b, T% value) → Null {
   T% local1;
   late T% local2;
   core::int local3;
@@ -154,7 +154,7 @@
   local6;
   local7;
 };
-static field () → core::Null? fieldCompound = () → core::Null? {
+static field () → Null fieldCompound = () → Null {
   core::int local3;
   late core::int local4;
   local3 = (let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:111:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
diff --git a/pkg/front_end/testcases/nnbd/definitely_unassigned.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/definitely_unassigned.dart.strong.transformed.expect
index b7c2c1c..be2309c 100644
--- a/pkg/front_end/testcases/nnbd/definitely_unassigned.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/definitely_unassigned.dart.strong.transformed.expect
@@ -95,7 +95,7 @@
 
 import "dart:async";
 
-static field <T extends core::Object? = dynamic>(T%) → core::Null? fieldDirect = <T extends core::Object? = dynamic>(T% value) → core::Null? {
+static field <T extends core::Object? = dynamic>(T%) → Null fieldDirect = <T extends core::Object? = dynamic>(T% value) → Null {
   T% local1;
   late T% local2;
   core::int local3;
@@ -125,7 +125,7 @@
   ^^^^^^" in local6;
   local7;
 };
-static field <T extends core::Object? = dynamic>(core::bool, T%) → core::Null? fieldConditional = <T extends core::Object? = dynamic>(core::bool b, T% value) → core::Null? {
+static field <T extends core::Object? = dynamic>(core::bool, T%) → Null fieldConditional = <T extends core::Object? = dynamic>(core::bool b, T% value) → Null {
   T% local1;
   late T% local2;
   core::int local3;
@@ -158,7 +158,7 @@
   local6;
   local7;
 };
-static field () → core::Null? fieldCompound = () → core::Null? {
+static field () → Null fieldCompound = () → Null {
   core::int local3;
   late core::int local4;
   local3 = (let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:111:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
diff --git a/pkg/front_end/testcases/nnbd/definitely_unassigned.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd/definitely_unassigned.dart.textual_outline.expect
index f27c6c0..8b2d8e6 100644
--- a/pkg/front_end/testcases/nnbd/definitely_unassigned.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/nnbd/definitely_unassigned.dart.textual_outline.expect
@@ -1,64 +1,8 @@
 import 'dart:async';
-
 methodDirect<T>(T value) {}
-var fieldDirect = <T>(T value) {
-  T local1;
-  late T;
-  local2;
-  int local3;
-  late int;
-  local4;
-  FutureOr<int> local5;
-  late FutureOr;
-  <int>[];
-  local6;
-  late T;
-  local7 = value;
-  local1;
-  local2;
-  local3;
-  local4;
-  local5;
-  local6;
-  local7;
-};
+var fieldDirect = <T>(T value) { T local1; late T ;local2; int local3; late int ;local4; FutureOr<int> local5; late FutureOr;<int> [];local6; late T ;local7 = value; local1; local2; local3; local4; local5; local6; local7; };
 methodConditional<T>(bool b, T value) {}
-var fieldConditional = <T>(bool b, T value) {
-  T local1;
-  late T;
-  local2;
-  int local3;
-  late int;
-  local4;
-  FutureOr<int> local5;
-  late FutureOr;
-  <int>[];
-  local6;
-  late T;
-  local7 = value;
-  if (b) {
-    local1 = value;
-    local2 = value;
-    local3 = 0;
-    local4 = 0;
-    local5 = 0;
-    local6 = 0;
-    local7;
-  }
-  local1;
-  local2;
-  local3;
-  local4;
-  local5;
-  local6;
-  local7;
-};
+var fieldConditional = <T>(bool b, T value) { T local1; late T ;local2; int local3; late int ;local4; FutureOr<int> local5; late FutureOr;<int> [];local6; late T ;local7 = value; if (b) { local1 = value; local2 = value; local3 = 0; local4 = 0; local5 = 0; local6 = 0; local7; } local1; local2; local3; local4; local5; local6; local7; };
 methodCompound() {}
-var fieldCompound = () {
-  int local3;
-  late int;
-  local4;
-  local3 += 0;
-  local4 += 0;
-};
+var fieldCompound = () { int local3; late int ;local4; local3 += 0; local4 += 0; };
 main() {}
diff --git a/pkg/front_end/testcases/nnbd/definitely_unassigned.dart.weak.expect b/pkg/front_end/testcases/nnbd/definitely_unassigned.dart.weak.expect
index d23513e..1803f4a 100644
--- a/pkg/front_end/testcases/nnbd/definitely_unassigned.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/definitely_unassigned.dart.weak.expect
@@ -95,7 +95,7 @@
 
 import "dart:async";
 
-static field <T extends core::Object? = dynamic>(T%) → core::Null? fieldDirect = <T extends core::Object? = dynamic>(T% value) → core::Null? {
+static field <T extends core::Object? = dynamic>(T%) → Null fieldDirect = <T extends core::Object? = dynamic>(T% value) → Null {
   T% local1;
   late T% local2;
   core::int local3;
@@ -123,7 +123,7 @@
   ^^^^^^" in local6;
   local7;
 };
-static field <T extends core::Object? = dynamic>(core::bool, T%) → core::Null? fieldConditional = <T extends core::Object? = dynamic>(core::bool b, T% value) → core::Null? {
+static field <T extends core::Object? = dynamic>(core::bool, T%) → Null fieldConditional = <T extends core::Object? = dynamic>(core::bool b, T% value) → Null {
   T% local1;
   late T% local2;
   core::int local3;
@@ -154,7 +154,7 @@
   local6;
   local7;
 };
-static field () → core::Null? fieldCompound = () → core::Null? {
+static field () → Null fieldCompound = () → Null {
   core::int local3;
   late core::int local4;
   local3 = (let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:111:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
diff --git a/pkg/front_end/testcases/nnbd/definitely_unassigned.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/definitely_unassigned.dart.weak.transformed.expect
index b7c2c1c..be2309c 100644
--- a/pkg/front_end/testcases/nnbd/definitely_unassigned.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/definitely_unassigned.dart.weak.transformed.expect
@@ -95,7 +95,7 @@
 
 import "dart:async";
 
-static field <T extends core::Object? = dynamic>(T%) → core::Null? fieldDirect = <T extends core::Object? = dynamic>(T% value) → core::Null? {
+static field <T extends core::Object? = dynamic>(T%) → Null fieldDirect = <T extends core::Object? = dynamic>(T% value) → Null {
   T% local1;
   late T% local2;
   core::int local3;
@@ -125,7 +125,7 @@
   ^^^^^^" in local6;
   local7;
 };
-static field <T extends core::Object? = dynamic>(core::bool, T%) → core::Null? fieldConditional = <T extends core::Object? = dynamic>(core::bool b, T% value) → core::Null? {
+static field <T extends core::Object? = dynamic>(core::bool, T%) → Null fieldConditional = <T extends core::Object? = dynamic>(core::bool b, T% value) → Null {
   T% local1;
   late T% local2;
   core::int local3;
@@ -158,7 +158,7 @@
   local6;
   local7;
 };
-static field () → core::Null? fieldCompound = () → core::Null? {
+static field () → Null fieldCompound = () → Null {
   core::int local3;
   late core::int local4;
   local3 = (let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:111:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
diff --git a/pkg/front_end/testcases/nnbd/export_main_declaration.dart.outline.expect b/pkg/front_end/testcases/nnbd/export_main_declaration.dart.outline.expect
index 4212a8e..0f3daec 100644
--- a/pkg/front_end/testcases/nnbd/export_main_declaration.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/export_main_declaration.dart.outline.expect
@@ -65,7 +65,8 @@
 //
 import self as self4;
 import "main_declaration_field_lib.dart" as mai4;
-additionalExports = (mai4::main)
+additionalExports = (mai4::main,
+  mai4::main)
 
 export "org-dartlang-testcase:///main_declaration_field_lib.dart";
 
diff --git a/pkg/front_end/testcases/nnbd/export_main_declaration.dart.strong.expect b/pkg/front_end/testcases/nnbd/export_main_declaration.dart.strong.expect
index 87148a1..92cd79e 100644
--- a/pkg/front_end/testcases/nnbd/export_main_declaration.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/export_main_declaration.dart.strong.expect
@@ -65,7 +65,8 @@
 //
 import self as self4;
 import "main_declaration_field_lib.dart" as mai4;
-additionalExports = (mai4::main)
+additionalExports = (mai4::main,
+  mai4::main)
 
 export "org-dartlang-testcase:///main_declaration_field_lib.dart";
 
@@ -286,9 +287,8 @@
 //                 ^^^^
 //
 import self as mai4;
-import "dart:core" as core;
 
-static field () → void main = () → core::Null? {};
+static field () → void main = () → void {};
 
 library /*isNonNullableByDefault*/;
 //
@@ -299,10 +299,9 @@
 //                     ^^^^
 //
 import self as mai5;
-import "dart:core" as core;
 
 static get main() → () → void
-  return () → core::Null? {};
+  return () → void {};
 
 library /*isNonNullableByDefault*/;
 import self as mai6;
diff --git a/pkg/front_end/testcases/nnbd/export_main_declaration.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/export_main_declaration.dart.strong.transformed.expect
index 87148a1..92cd79e 100644
--- a/pkg/front_end/testcases/nnbd/export_main_declaration.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/export_main_declaration.dart.strong.transformed.expect
@@ -65,7 +65,8 @@
 //
 import self as self4;
 import "main_declaration_field_lib.dart" as mai4;
-additionalExports = (mai4::main)
+additionalExports = (mai4::main,
+  mai4::main)
 
 export "org-dartlang-testcase:///main_declaration_field_lib.dart";
 
@@ -286,9 +287,8 @@
 //                 ^^^^
 //
 import self as mai4;
-import "dart:core" as core;
 
-static field () → void main = () → core::Null? {};
+static field () → void main = () → void {};
 
 library /*isNonNullableByDefault*/;
 //
@@ -299,10 +299,9 @@
 //                     ^^^^
 //
 import self as mai5;
-import "dart:core" as core;
 
 static get main() → () → void
-  return () → core::Null? {};
+  return () → void {};
 
 library /*isNonNullableByDefault*/;
 import self as mai6;
diff --git a/pkg/front_end/testcases/nnbd/export_main_declaration.dart.weak.expect b/pkg/front_end/testcases/nnbd/export_main_declaration.dart.weak.expect
index 00c2307..c4ad76f 100644
--- a/pkg/front_end/testcases/nnbd/export_main_declaration.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/export_main_declaration.dart.weak.expect
@@ -65,7 +65,8 @@
 //
 import self as self4;
 import "main_declaration_field_lib.dart" as mai4;
-additionalExports = (mai4::main)
+additionalExports = (mai4::main,
+  mai4::main)
 
 export "org-dartlang-testcase:///main_declaration_field_lib.dart";
 
@@ -286,9 +287,8 @@
 //                 ^^^^
 //
 import self as mai4;
-import "dart:core" as core;
 
-static field () → void main = () → core::Null? {};
+static field () → void main = () → void {};
 
 library /*isNonNullableByDefault*/;
 //
@@ -299,10 +299,9 @@
 //                     ^^^^
 //
 import self as mai5;
-import "dart:core" as core;
 
 static get main() → () → void
-  return () → core::Null? {};
+  return () → void {};
 
 library /*isNonNullableByDefault*/;
 import self as mai6;
diff --git a/pkg/front_end/testcases/nnbd/export_main_declaration.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/export_main_declaration.dart.weak.transformed.expect
index 00c2307..c4ad76f 100644
--- a/pkg/front_end/testcases/nnbd/export_main_declaration.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/export_main_declaration.dart.weak.transformed.expect
@@ -65,7 +65,8 @@
 //
 import self as self4;
 import "main_declaration_field_lib.dart" as mai4;
-additionalExports = (mai4::main)
+additionalExports = (mai4::main,
+  mai4::main)
 
 export "org-dartlang-testcase:///main_declaration_field_lib.dart";
 
@@ -286,9 +287,8 @@
 //                 ^^^^
 //
 import self as mai4;
-import "dart:core" as core;
 
-static field () → void main = () → core::Null? {};
+static field () → void main = () → void {};
 
 library /*isNonNullableByDefault*/;
 //
@@ -299,10 +299,9 @@
 //                     ^^^^
 //
 import self as mai5;
-import "dart:core" as core;
 
 static get main() → () → void
-  return () → core::Null? {};
+  return () → void {};
 
 library /*isNonNullableByDefault*/;
 import self as mai6;
diff --git a/pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart b/pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart
new file mode 100644
index 0000000..426f2f2
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart
@@ -0,0 +1,36 @@
+// Copyright (c) 2020, 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.
+
+extension Extension<T> on T {
+  T method1() => this;
+}
+
+extension BoundExtension<T extends Class> on T {
+  T method2() => this;
+}
+
+class Class {}
+
+class SubClass extends Class {}
+
+Class test1<T>(T t1) {
+  if (t1 is SubClass) {
+    return t1.method1();
+  }
+  return new Class();
+}
+
+test2<T extends Class>(T t2) {
+  if (T == SubClass) {
+    SubClass subClass = t2.method2();
+  }
+}
+
+test3<T>(T t3) {
+  if (t3 is SubClass) {
+    SubClass subClass = t3.method2();
+  }
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart.outline.expect b/pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart.outline.expect
new file mode 100644
index 0000000..d373301
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart.outline.expect
@@ -0,0 +1,36 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  synthetic constructor •() → self::Class
+    ;
+}
+class SubClass extends self::Class {
+  synthetic constructor •() → self::SubClass
+    ;
+}
+extension Extension<T extends core::Object? = dynamic> on T% {
+  method method1 = self::Extension|method1;
+  tearoff method1 = self::Extension|get#method1;
+}
+extension BoundExtension<T extends self::Class = self::Class> on T {
+  method method2 = self::BoundExtension|method2;
+  tearoff method2 = self::BoundExtension|get#method2;
+}
+static method Extension|method1<T extends core::Object? = dynamic>(final self::Extension|method1::T% #this) → self::Extension|method1::T%
+  ;
+static method Extension|get#method1<T extends core::Object? = dynamic>(final self::Extension|get#method1::T% #this) → () → self::Extension|get#method1::T%
+  return () → self::Extension|get#method1::T% => self::Extension|method1<self::Extension|get#method1::T%>(#this);
+static method BoundExtension|method2<T extends self::Class = self::Class>(final self::BoundExtension|method2::T #this) → self::BoundExtension|method2::T
+  ;
+static method BoundExtension|get#method2<T extends self::Class = self::Class>(final self::BoundExtension|get#method2::T #this) → () → self::BoundExtension|get#method2::T
+  return () → self::BoundExtension|get#method2::T => self::BoundExtension|method2<self::BoundExtension|get#method2::T>(#this);
+static method test1<T extends core::Object? = dynamic>(self::test1::T% t1) → self::Class
+  ;
+static method test2<T extends self::Class = self::Class>(self::test2::T t2) → dynamic
+  ;
+static method test3<T extends core::Object? = dynamic>(self::test3::T% t3) → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart.strong.expect b/pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart.strong.expect
new file mode 100644
index 0000000..a948972
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart.strong.expect
@@ -0,0 +1,76 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart:19:15: Error: A value of type 'T' can't be returned from a function with return type 'Class'.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart'.
+//     return t1.method1();
+//               ^
+//
+// pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart:26:28: Error: A value of type 'T' can't be assigned to a variable of type 'SubClass'.
+//  - 'SubClass' is from 'pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart'.
+//     SubClass subClass = t2.method2();
+//                            ^
+//
+// pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart:32:28: Error: The method 'method2' isn't defined for the class 'SubClass'.
+//  - 'SubClass' is from 'pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named 'method2'.
+//     SubClass subClass = t3.method2();
+//                            ^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  synthetic constructor •() → self::Class
+    : super core::Object::•()
+    ;
+}
+class SubClass extends self::Class {
+  synthetic constructor •() → self::SubClass
+    : super self::Class::•()
+    ;
+}
+extension Extension<T extends core::Object? = dynamic> on T% {
+  method method1 = self::Extension|method1;
+  tearoff method1 = self::Extension|get#method1;
+}
+extension BoundExtension<T extends self::Class = self::Class> on T {
+  method method2 = self::BoundExtension|method2;
+  tearoff method2 = self::BoundExtension|get#method2;
+}
+static method Extension|method1<T extends core::Object? = dynamic>(final self::Extension|method1::T% #this) → self::Extension|method1::T%
+  return #this;
+static method Extension|get#method1<T extends core::Object? = dynamic>(final self::Extension|get#method1::T% #this) → () → self::Extension|get#method1::T%
+  return () → self::Extension|get#method1::T% => self::Extension|method1<self::Extension|get#method1::T%>(#this);
+static method BoundExtension|method2<T extends self::Class = self::Class>(final self::BoundExtension|method2::T #this) → self::BoundExtension|method2::T
+  return #this;
+static method BoundExtension|get#method2<T extends self::Class = self::Class>(final self::BoundExtension|get#method2::T #this) → () → self::BoundExtension|get#method2::T
+  return () → self::BoundExtension|get#method2::T => self::BoundExtension|method2<self::BoundExtension|get#method2::T>(#this);
+static method test1<T extends core::Object? = dynamic>(self::test1::T% t1) → self::Class {
+  if(t1 is{ForNonNullableByDefault} self::SubClass) {
+    return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart:19:15: Error: A value of type 'T' can't be returned from a function with return type 'Class'.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart'.
+    return t1.method1();
+              ^" in self::Extension|method1<self::test1::T%>(t1{self::test1::T% & self::SubClass /* '%' & '!' = '!' */}) as{TypeError,ForNonNullableByDefault} self::Class;
+  }
+  return new self::Class::•();
+}
+static method test2<T extends self::Class = self::Class>(self::test2::T t2) → dynamic {
+  if(self::test2::T.{core::Type::==}(self::SubClass)) {
+    self::SubClass subClass = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart:26:28: Error: A value of type 'T' can't be assigned to a variable of type 'SubClass'.
+ - 'SubClass' is from 'pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart'.
+    SubClass subClass = t2.method2();
+                           ^" in self::BoundExtension|method2<self::test2::T>(t2) as{TypeError,ForNonNullableByDefault} self::SubClass;
+  }
+}
+static method test3<T extends core::Object? = dynamic>(self::test3::T% t3) → dynamic {
+  if(t3 is{ForNonNullableByDefault} self::SubClass) {
+    self::SubClass subClass = invalid-expression "pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart:32:28: Error: The method 'method2' isn't defined for the class 'SubClass'.
+ - 'SubClass' is from 'pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart'.
+Try correcting the name to the name of an existing method, or defining a method named 'method2'.
+    SubClass subClass = t3.method2();
+                           ^^^^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} self::SubClass;
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart.strong.transformed.expect
new file mode 100644
index 0000000..e6c4be4
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart.strong.transformed.expect
@@ -0,0 +1,81 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart:19:15: Error: A value of type 'T' can't be returned from a function with return type 'Class'.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart'.
+//     return t1.method1();
+//               ^
+//
+// pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart:26:28: Error: A value of type 'T' can't be assigned to a variable of type 'SubClass'.
+//  - 'SubClass' is from 'pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart'.
+//     SubClass subClass = t2.method2();
+//                            ^
+//
+// pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart:32:28: Error: The method 'method2' isn't defined for the class 'SubClass'.
+//  - 'SubClass' is from 'pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named 'method2'.
+//     SubClass subClass = t3.method2();
+//                            ^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  synthetic constructor •() → self::Class
+    : super core::Object::•()
+    ;
+}
+class SubClass extends self::Class {
+  synthetic constructor •() → self::SubClass
+    : super self::Class::•()
+    ;
+}
+extension Extension<T extends core::Object? = dynamic> on T% {
+  method method1 = self::Extension|method1;
+  tearoff method1 = self::Extension|get#method1;
+}
+extension BoundExtension<T extends self::Class = self::Class> on T {
+  method method2 = self::BoundExtension|method2;
+  tearoff method2 = self::BoundExtension|get#method2;
+}
+static method Extension|method1<T extends core::Object? = dynamic>(final self::Extension|method1::T% #this) → self::Extension|method1::T%
+  return #this;
+static method Extension|get#method1<T extends core::Object? = dynamic>(final self::Extension|get#method1::T% #this) → () → self::Extension|get#method1::T%
+  return () → self::Extension|get#method1::T% => self::Extension|method1<self::Extension|get#method1::T%>(#this);
+static method BoundExtension|method2<T extends self::Class = self::Class>(final self::BoundExtension|method2::T #this) → self::BoundExtension|method2::T
+  return #this;
+static method BoundExtension|get#method2<T extends self::Class = self::Class>(final self::BoundExtension|get#method2::T #this) → () → self::BoundExtension|get#method2::T
+  return () → self::BoundExtension|get#method2::T => self::BoundExtension|method2<self::BoundExtension|get#method2::T>(#this);
+static method test1<T extends core::Object? = dynamic>(self::test1::T% t1) → self::Class {
+  if(t1 is{ForNonNullableByDefault} self::SubClass) {
+    return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart:19:15: Error: A value of type 'T' can't be returned from a function with return type 'Class'.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart'.
+    return t1.method1();
+              ^" in self::Extension|method1<self::test1::T%>(t1{self::test1::T% & self::SubClass /* '%' & '!' = '!' */}) as{TypeError,ForNonNullableByDefault} self::Class;
+  }
+  return new self::Class::•();
+}
+static method test2<T extends self::Class = self::Class>(self::test2::T t2) → dynamic {
+  if(self::test2::T.{core::Type::==}(self::SubClass)) {
+    self::SubClass subClass = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart:26:28: Error: A value of type 'T' can't be assigned to a variable of type 'SubClass'.
+ - 'SubClass' is from 'pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart'.
+    SubClass subClass = t2.method2();
+                           ^" in self::BoundExtension|method2<self::test2::T>(t2) as{TypeError,ForNonNullableByDefault} self::SubClass;
+  }
+}
+static method test3<T extends core::Object? = dynamic>(self::test3::T% t3) → dynamic {
+  if(t3 is{ForNonNullableByDefault} self::SubClass) {
+    self::SubClass subClass = invalid-expression "pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart:32:28: Error: The method 'method2' isn't defined for the class 'SubClass'.
+ - 'SubClass' is from 'pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart'.
+Try correcting the name to the name of an existing method, or defining a method named 'method2'.
+    SubClass subClass = t3.method2();
+                           ^^^^^^^";
+  }
+}
+static method main() → dynamic {}
+
+
+Extra constant evaluation status:
+Evaluated: TypeLiteral @ org-dartlang-testcase:///extension_type_variable_bound.dart:25:12 -> TypeLiteralConstant(SubClass)
+Extra constant evaluation: evaluated: 24, effectively constant: 1
diff --git a/pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart.textual_outline.expect
new file mode 100644
index 0000000..0434002
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart.textual_outline.expect
@@ -0,0 +1,10 @@
+extension Extension<T> (){}
+on T (){}
+extension BoundExtension<T extends Class> (){}
+on T (){}
+class Class {}
+class SubClass extends Class {}
+Class test1<T>(T t1) {}
+test2<T extends Class>(T t2) {}
+test3<T>(T t3) {}
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart.weak.expect b/pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart.weak.expect
new file mode 100644
index 0000000..a948972
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart.weak.expect
@@ -0,0 +1,76 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart:19:15: Error: A value of type 'T' can't be returned from a function with return type 'Class'.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart'.
+//     return t1.method1();
+//               ^
+//
+// pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart:26:28: Error: A value of type 'T' can't be assigned to a variable of type 'SubClass'.
+//  - 'SubClass' is from 'pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart'.
+//     SubClass subClass = t2.method2();
+//                            ^
+//
+// pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart:32:28: Error: The method 'method2' isn't defined for the class 'SubClass'.
+//  - 'SubClass' is from 'pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named 'method2'.
+//     SubClass subClass = t3.method2();
+//                            ^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  synthetic constructor •() → self::Class
+    : super core::Object::•()
+    ;
+}
+class SubClass extends self::Class {
+  synthetic constructor •() → self::SubClass
+    : super self::Class::•()
+    ;
+}
+extension Extension<T extends core::Object? = dynamic> on T% {
+  method method1 = self::Extension|method1;
+  tearoff method1 = self::Extension|get#method1;
+}
+extension BoundExtension<T extends self::Class = self::Class> on T {
+  method method2 = self::BoundExtension|method2;
+  tearoff method2 = self::BoundExtension|get#method2;
+}
+static method Extension|method1<T extends core::Object? = dynamic>(final self::Extension|method1::T% #this) → self::Extension|method1::T%
+  return #this;
+static method Extension|get#method1<T extends core::Object? = dynamic>(final self::Extension|get#method1::T% #this) → () → self::Extension|get#method1::T%
+  return () → self::Extension|get#method1::T% => self::Extension|method1<self::Extension|get#method1::T%>(#this);
+static method BoundExtension|method2<T extends self::Class = self::Class>(final self::BoundExtension|method2::T #this) → self::BoundExtension|method2::T
+  return #this;
+static method BoundExtension|get#method2<T extends self::Class = self::Class>(final self::BoundExtension|get#method2::T #this) → () → self::BoundExtension|get#method2::T
+  return () → self::BoundExtension|get#method2::T => self::BoundExtension|method2<self::BoundExtension|get#method2::T>(#this);
+static method test1<T extends core::Object? = dynamic>(self::test1::T% t1) → self::Class {
+  if(t1 is{ForNonNullableByDefault} self::SubClass) {
+    return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart:19:15: Error: A value of type 'T' can't be returned from a function with return type 'Class'.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart'.
+    return t1.method1();
+              ^" in self::Extension|method1<self::test1::T%>(t1{self::test1::T% & self::SubClass /* '%' & '!' = '!' */}) as{TypeError,ForNonNullableByDefault} self::Class;
+  }
+  return new self::Class::•();
+}
+static method test2<T extends self::Class = self::Class>(self::test2::T t2) → dynamic {
+  if(self::test2::T.{core::Type::==}(self::SubClass)) {
+    self::SubClass subClass = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart:26:28: Error: A value of type 'T' can't be assigned to a variable of type 'SubClass'.
+ - 'SubClass' is from 'pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart'.
+    SubClass subClass = t2.method2();
+                           ^" in self::BoundExtension|method2<self::test2::T>(t2) as{TypeError,ForNonNullableByDefault} self::SubClass;
+  }
+}
+static method test3<T extends core::Object? = dynamic>(self::test3::T% t3) → dynamic {
+  if(t3 is{ForNonNullableByDefault} self::SubClass) {
+    self::SubClass subClass = invalid-expression "pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart:32:28: Error: The method 'method2' isn't defined for the class 'SubClass'.
+ - 'SubClass' is from 'pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart'.
+Try correcting the name to the name of an existing method, or defining a method named 'method2'.
+    SubClass subClass = t3.method2();
+                           ^^^^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} self::SubClass;
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart.weak.transformed.expect
new file mode 100644
index 0000000..e6c4be4
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart.weak.transformed.expect
@@ -0,0 +1,81 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart:19:15: Error: A value of type 'T' can't be returned from a function with return type 'Class'.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart'.
+//     return t1.method1();
+//               ^
+//
+// pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart:26:28: Error: A value of type 'T' can't be assigned to a variable of type 'SubClass'.
+//  - 'SubClass' is from 'pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart'.
+//     SubClass subClass = t2.method2();
+//                            ^
+//
+// pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart:32:28: Error: The method 'method2' isn't defined for the class 'SubClass'.
+//  - 'SubClass' is from 'pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named 'method2'.
+//     SubClass subClass = t3.method2();
+//                            ^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  synthetic constructor •() → self::Class
+    : super core::Object::•()
+    ;
+}
+class SubClass extends self::Class {
+  synthetic constructor •() → self::SubClass
+    : super self::Class::•()
+    ;
+}
+extension Extension<T extends core::Object? = dynamic> on T% {
+  method method1 = self::Extension|method1;
+  tearoff method1 = self::Extension|get#method1;
+}
+extension BoundExtension<T extends self::Class = self::Class> on T {
+  method method2 = self::BoundExtension|method2;
+  tearoff method2 = self::BoundExtension|get#method2;
+}
+static method Extension|method1<T extends core::Object? = dynamic>(final self::Extension|method1::T% #this) → self::Extension|method1::T%
+  return #this;
+static method Extension|get#method1<T extends core::Object? = dynamic>(final self::Extension|get#method1::T% #this) → () → self::Extension|get#method1::T%
+  return () → self::Extension|get#method1::T% => self::Extension|method1<self::Extension|get#method1::T%>(#this);
+static method BoundExtension|method2<T extends self::Class = self::Class>(final self::BoundExtension|method2::T #this) → self::BoundExtension|method2::T
+  return #this;
+static method BoundExtension|get#method2<T extends self::Class = self::Class>(final self::BoundExtension|get#method2::T #this) → () → self::BoundExtension|get#method2::T
+  return () → self::BoundExtension|get#method2::T => self::BoundExtension|method2<self::BoundExtension|get#method2::T>(#this);
+static method test1<T extends core::Object? = dynamic>(self::test1::T% t1) → self::Class {
+  if(t1 is{ForNonNullableByDefault} self::SubClass) {
+    return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart:19:15: Error: A value of type 'T' can't be returned from a function with return type 'Class'.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart'.
+    return t1.method1();
+              ^" in self::Extension|method1<self::test1::T%>(t1{self::test1::T% & self::SubClass /* '%' & '!' = '!' */}) as{TypeError,ForNonNullableByDefault} self::Class;
+  }
+  return new self::Class::•();
+}
+static method test2<T extends self::Class = self::Class>(self::test2::T t2) → dynamic {
+  if(self::test2::T.{core::Type::==}(self::SubClass)) {
+    self::SubClass subClass = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart:26:28: Error: A value of type 'T' can't be assigned to a variable of type 'SubClass'.
+ - 'SubClass' is from 'pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart'.
+    SubClass subClass = t2.method2();
+                           ^" in self::BoundExtension|method2<self::test2::T>(t2) as{TypeError,ForNonNullableByDefault} self::SubClass;
+  }
+}
+static method test3<T extends core::Object? = dynamic>(self::test3::T% t3) → dynamic {
+  if(t3 is{ForNonNullableByDefault} self::SubClass) {
+    self::SubClass subClass = invalid-expression "pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart:32:28: Error: The method 'method2' isn't defined for the class 'SubClass'.
+ - 'SubClass' is from 'pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart'.
+Try correcting the name to the name of an existing method, or defining a method named 'method2'.
+    SubClass subClass = t3.method2();
+                           ^^^^^^^";
+  }
+}
+static method main() → dynamic {}
+
+
+Extra constant evaluation status:
+Evaluated: TypeLiteral @ org-dartlang-testcase:///extension_type_variable_bound.dart:25:12 -> TypeLiteralConstant(SubClass)
+Extra constant evaluation: evaluated: 24, effectively constant: 1
diff --git a/pkg/front_end/testcases/nnbd/flutter_issue64155.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/flutter_issue64155.dart.strong.transformed.expect
index a06a87e..cfe4af3 100644
--- a/pkg/front_end/testcases/nnbd/flutter_issue64155.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/flutter_issue64155.dart.strong.transformed.expect
@@ -6,7 +6,8 @@
 
 abstract class TestMixin<R extends core::Object? = dynamic, T extends core::Object? = dynamic> extends core::Object /*isMixinDeclaration*/  {
   method test(generic-covariant-impl asy::Future<self::TestMixin::R%> fetch) → asy::Future<self::TestMixin::T%> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<self::TestMixin::T%> :async_completer = new asy::_AsyncAwaitCompleter::•<self::TestMixin::T%>();
+    final asy::_Future<self::TestMixin::T%> :async_future = new asy::_Future::•<self::TestMixin::T%>();
+    core::bool* :is_sync = false;
     FutureOr<self::TestMixin::T%>? :return_value;
     dynamic :async_stack_trace;
     (dynamic) → dynamic :async_op_then;
@@ -38,17 +39,18 @@
           :return_value = result;
           break #L1;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   }
 }
 class PagingResponse<T extends core::Object? = dynamic> extends core::Object {
@@ -74,7 +76,8 @@
     : super core::Object::•()
     ;
   method test(generic-covariant-impl asy::Future<self::Response<core::String>> fetch) → asy::Future<core::String> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::String> :async_completer = new asy::_AsyncAwaitCompleter::•<core::String>();
+    final asy::_Future<core::String> :async_future = new asy::_Future::•<core::String>();
+    core::bool* :is_sync = false;
     FutureOr<core::String>? :return_value;
     dynamic :async_stack_trace;
     (dynamic) → dynamic :async_op_then;
@@ -106,17 +109,18 @@
           :return_value = result;
           break #L2;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   }
 }
 class Class1 extends self::_Class1&Object&TestMixin {
@@ -133,7 +137,8 @@
     : super core::Object::•()
     ;
   method test(generic-covariant-impl asy::Future<self::PagingResponse<core::String>> fetch) → asy::Future<core::String> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::String> :async_completer = new asy::_AsyncAwaitCompleter::•<core::String>();
+    final asy::_Future<core::String> :async_future = new asy::_Future::•<core::String>();
+    core::bool* :is_sync = false;
     FutureOr<core::String>? :return_value;
     dynamic :async_stack_trace;
     (dynamic) → dynamic :async_op_then;
@@ -165,17 +170,18 @@
           :return_value = result;
           break #L3;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   }
 }
 class Class2 extends self::_Class2&Object&TestMixin {
diff --git a/pkg/front_end/testcases/nnbd/flutter_issue64155.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/flutter_issue64155.dart.weak.transformed.expect
index a06a87e..cfe4af3 100644
--- a/pkg/front_end/testcases/nnbd/flutter_issue64155.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/flutter_issue64155.dart.weak.transformed.expect
@@ -6,7 +6,8 @@
 
 abstract class TestMixin<R extends core::Object? = dynamic, T extends core::Object? = dynamic> extends core::Object /*isMixinDeclaration*/  {
   method test(generic-covariant-impl asy::Future<self::TestMixin::R%> fetch) → asy::Future<self::TestMixin::T%> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<self::TestMixin::T%> :async_completer = new asy::_AsyncAwaitCompleter::•<self::TestMixin::T%>();
+    final asy::_Future<self::TestMixin::T%> :async_future = new asy::_Future::•<self::TestMixin::T%>();
+    core::bool* :is_sync = false;
     FutureOr<self::TestMixin::T%>? :return_value;
     dynamic :async_stack_trace;
     (dynamic) → dynamic :async_op_then;
@@ -38,17 +39,18 @@
           :return_value = result;
           break #L1;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   }
 }
 class PagingResponse<T extends core::Object? = dynamic> extends core::Object {
@@ -74,7 +76,8 @@
     : super core::Object::•()
     ;
   method test(generic-covariant-impl asy::Future<self::Response<core::String>> fetch) → asy::Future<core::String> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::String> :async_completer = new asy::_AsyncAwaitCompleter::•<core::String>();
+    final asy::_Future<core::String> :async_future = new asy::_Future::•<core::String>();
+    core::bool* :is_sync = false;
     FutureOr<core::String>? :return_value;
     dynamic :async_stack_trace;
     (dynamic) → dynamic :async_op_then;
@@ -106,17 +109,18 @@
           :return_value = result;
           break #L2;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   }
 }
 class Class1 extends self::_Class1&Object&TestMixin {
@@ -133,7 +137,8 @@
     : super core::Object::•()
     ;
   method test(generic-covariant-impl asy::Future<self::PagingResponse<core::String>> fetch) → asy::Future<core::String> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::String> :async_completer = new asy::_AsyncAwaitCompleter::•<core::String>();
+    final asy::_Future<core::String> :async_future = new asy::_Future::•<core::String>();
+    core::bool* :is_sync = false;
     FutureOr<core::String>? :return_value;
     dynamic :async_stack_trace;
     (dynamic) → dynamic :async_op_then;
@@ -165,17 +170,18 @@
           :return_value = result;
           break #L3;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   }
 }
 class Class2 extends self::_Class2&Object&TestMixin {
diff --git a/pkg/front_end/testcases/nnbd/forin.dart.strong.expect b/pkg/front_end/testcases/nnbd/forin.dart.strong.expect
index d6e6324..0d3c0c9 100644
--- a/pkg/front_end/testcases/nnbd/forin.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/forin.dart.strong.expect
@@ -2,23 +2,23 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/forin.dart:9:17: Error: The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+// pkg/front_end/testcases/nnbd/forin.dart:9:17: Error: The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'Iterable<int>?' is nullable and 'Iterable<dynamic>' isn't.
 //  - 'Iterable' is from 'dart:core'.
 //   for (int x in i2) x;
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/forin.dart:10:18: Error: The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+// pkg/front_end/testcases/nnbd/forin.dart:10:18: Error: The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'Iterable<int>?' is nullable and 'Iterable<dynamic>' isn't.
 //  - 'Iterable' is from 'dart:core'.
 //   [for (int x in i2) x];
 //                  ^
 //
-// pkg/front_end/testcases/nnbd/forin.dart:12:17: Error: The type 'List<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+// pkg/front_end/testcases/nnbd/forin.dart:12:17: Error: The type 'List<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'List<int>?' is nullable and 'Iterable<dynamic>' isn't.
 //  - 'List' is from 'dart:core'.
 //  - 'Iterable' is from 'dart:core'.
 //   for (int x in l2) x;
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/forin.dart:13:18: Error: The type 'List<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+// pkg/front_end/testcases/nnbd/forin.dart:13:18: Error: The type 'List<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'List<int>?' is nullable and 'Iterable<dynamic>' isn't.
 //  - 'List' is from 'dart:core'.
 //  - 'Iterable' is from 'dart:core'.
 //   [for (int x in l2) x];
@@ -52,20 +52,20 @@
 import "dart:core" as core;
 
 static method error(core::Iterable<core::int>? i2, core::List<core::int>? l2, core::Object o1, core::Object? o2) → dynamic {
-  for (core::int x in let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:9:17: Error: The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+  for (core::int x in let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:9:17: Error: The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'Iterable<int>?' is nullable and 'Iterable<dynamic>' isn't.
  - 'Iterable' is from 'dart:core'.
   for (int x in i2) x;
                 ^" in i2 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic>)
     x;
   block {
     final core::List<core::int> #t2 = <core::int>[];
-    for (core::int x in let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:10:18: Error: The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+    for (core::int x in let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:10:18: Error: The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'Iterable<int>?' is nullable and 'Iterable<dynamic>' isn't.
  - 'Iterable' is from 'dart:core'.
   [for (int x in i2) x];
                  ^" in i2 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic>)
-      #t2.{core::List::add}(x);
+      #t2.{core::List::add}{Invariant}(x);
   } =>#t2;
-  for (core::int x in let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:12:17: Error: The type 'List<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+  for (core::int x in let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:12:17: Error: The type 'List<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'List<int>?' is nullable and 'Iterable<dynamic>' isn't.
  - 'List' is from 'dart:core'.
  - 'Iterable' is from 'dart:core'.
   for (int x in l2) x;
@@ -73,12 +73,12 @@
     x;
   block {
     final core::List<core::int> #t5 = <core::int>[];
-    for (core::int x in let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:13:18: Error: The type 'List<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+    for (core::int x in let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:13:18: Error: The type 'List<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'List<int>?' is nullable and 'Iterable<dynamic>' isn't.
  - 'List' is from 'dart:core'.
  - 'Iterable' is from 'dart:core'.
   [for (int x in l2) x];
                  ^" in l2 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic>)
-      #t5.{core::List::add}(x);
+      #t5.{core::List::add}{Invariant}(x);
   } =>#t5;
   for (final dynamic #t7 in let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:15:17: Error: The type 'Object' used in the 'for' loop must implement 'Iterable<dynamic>'.
  - 'Object' is from 'dart:core'.
@@ -96,7 +96,7 @@
   [for (int x in o1) x];
                  ^" in o1 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic>) {
       core::int x = #t10 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
-      #t9.{core::List::add}(x);
+      #t9.{core::List::add}{Invariant}(x);
     }
   } =>#t9;
   for (final dynamic #t12 in let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:18:17: Error: The type 'Object?' used in the 'for' loop must implement 'Iterable<dynamic>'.
@@ -115,7 +115,7 @@
   [for (int x in o2) x];
                  ^" in o2 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic>) {
       core::int x = #t15 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
-      #t14.{core::List::add}(x);
+      #t14.{core::List::add}{Invariant}(x);
     }
   } =>#t14;
 }
@@ -125,14 +125,14 @@
   block {
     final core::List<core::int> #t17 = <core::int>[];
     for (core::int x in i1)
-      #t17.{core::List::add}(x);
+      #t17.{core::List::add}{Invariant}(x);
   } =>#t17;
   for (core::int x in l1)
     x;
   block {
     final core::List<core::int> #t18 = <core::int>[];
     for (core::int x in l1)
-      #t18.{core::List::add}(x);
+      #t18.{core::List::add}{Invariant}(x);
   } =>#t18;
   for (final dynamic #t19 in d as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>) {
     core::int x = #t19 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
@@ -142,7 +142,7 @@
     final core::List<core::int> #t20 = <core::int>[];
     for (final dynamic #t21 in d as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>) {
       core::int x = #t21 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
-      #t20.{core::List::add}(x);
+      #t20.{core::List::add}{Invariant}(x);
     }
   } =>#t20;
 }
diff --git a/pkg/front_end/testcases/nnbd/forin.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/forin.dart.strong.transformed.expect
index b470efa..a4e5658 100644
--- a/pkg/front_end/testcases/nnbd/forin.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/forin.dart.strong.transformed.expect
@@ -2,23 +2,23 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/forin.dart:9:17: Error: The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+// pkg/front_end/testcases/nnbd/forin.dart:9:17: Error: The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'Iterable<int>?' is nullable and 'Iterable<dynamic>' isn't.
 //  - 'Iterable' is from 'dart:core'.
 //   for (int x in i2) x;
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/forin.dart:10:18: Error: The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+// pkg/front_end/testcases/nnbd/forin.dart:10:18: Error: The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'Iterable<int>?' is nullable and 'Iterable<dynamic>' isn't.
 //  - 'Iterable' is from 'dart:core'.
 //   [for (int x in i2) x];
 //                  ^
 //
-// pkg/front_end/testcases/nnbd/forin.dart:12:17: Error: The type 'List<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+// pkg/front_end/testcases/nnbd/forin.dart:12:17: Error: The type 'List<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'List<int>?' is nullable and 'Iterable<dynamic>' isn't.
 //  - 'List' is from 'dart:core'.
 //  - 'Iterable' is from 'dart:core'.
 //   for (int x in l2) x;
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/forin.dart:13:18: Error: The type 'List<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+// pkg/front_end/testcases/nnbd/forin.dart:13:18: Error: The type 'List<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'List<int>?' is nullable and 'Iterable<dynamic>' isn't.
 //  - 'List' is from 'dart:core'.
 //  - 'Iterable' is from 'dart:core'.
 //   [for (int x in l2) x];
@@ -53,7 +53,7 @@
 
 static method error(core::Iterable<core::int>? i2, core::List<core::int>? l2, core::Object o1, core::Object? o2) → dynamic {
   {
-    core::Iterator<dynamic> :sync-for-iterator = (let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:9:17: Error: The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+    core::Iterator<dynamic> :sync-for-iterator = (let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:9:17: Error: The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'Iterable<int>?' is nullable and 'Iterable<dynamic>' isn't.
  - 'Iterable' is from 'dart:core'.
   for (int x in i2) x;
                 ^" in let core::Iterable<core::int>? #t2 = i2 in #t2.==(null) ?{core::Iterable<dynamic>} #t2 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic> : #t2{core::Iterable<dynamic>}).{core::Iterable::iterator};
@@ -65,18 +65,18 @@
   block {
     final core::List<core::int> #t3 = <core::int>[];
     {
-      core::Iterator<dynamic> :sync-for-iterator = (let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:10:18: Error: The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+      core::Iterator<dynamic> :sync-for-iterator = (let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:10:18: Error: The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'Iterable<int>?' is nullable and 'Iterable<dynamic>' isn't.
  - 'Iterable' is from 'dart:core'.
   [for (int x in i2) x];
                  ^" in let core::Iterable<core::int>? #t5 = i2 in #t5.==(null) ?{core::Iterable<dynamic>} #t5 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic> : #t5{core::Iterable<dynamic>}).{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         core::int x = :sync-for-iterator.{core::Iterator::current};
-        #t3.{core::List::add}(x);
+        #t3.{core::List::add}{Invariant}(x);
       }
     }
   } =>#t3;
   {
-    core::Iterator<dynamic> :sync-for-iterator = (let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:12:17: Error: The type 'List<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+    core::Iterator<dynamic> :sync-for-iterator = (let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:12:17: Error: The type 'List<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'List<int>?' is nullable and 'Iterable<dynamic>' isn't.
  - 'List' is from 'dart:core'.
  - 'Iterable' is from 'dart:core'.
   for (int x in l2) x;
@@ -89,14 +89,14 @@
   block {
     final core::List<core::int> #t8 = <core::int>[];
     {
-      core::Iterator<dynamic> :sync-for-iterator = (let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:13:18: Error: The type 'List<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+      core::Iterator<dynamic> :sync-for-iterator = (let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:13:18: Error: The type 'List<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'List<int>?' is nullable and 'Iterable<dynamic>' isn't.
  - 'List' is from 'dart:core'.
  - 'Iterable' is from 'dart:core'.
   [for (int x in l2) x];
                  ^" in let core::List<core::int>? #t10 = l2 in #t10.==(null) ?{core::Iterable<dynamic>} #t10 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic> : #t10{core::Iterable<dynamic>}).{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         core::int x = :sync-for-iterator.{core::Iterator::current};
-        #t8.{core::List::add}(x);
+        #t8.{core::List::add}{Invariant}(x);
       }
     }
   } =>#t8;
@@ -126,7 +126,7 @@
         final dynamic #t15 = :sync-for-iterator.{core::Iterator::current};
         {
           core::int x = #t15 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
-          #t13.{core::List::add}(x);
+          #t13.{core::List::add}{Invariant}(x);
         }
       }
     }
@@ -157,7 +157,7 @@
         final dynamic #t20 = :sync-for-iterator.{core::Iterator::current};
         {
           core::int x = #t20 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
-          #t18.{core::List::add}(x);
+          #t18.{core::List::add}{Invariant}(x);
         }
       }
     }
@@ -177,7 +177,7 @@
       core::Iterator<core::int> :sync-for-iterator = i1.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         core::int x = :sync-for-iterator.{core::Iterator::current};
-        #t21.{core::List::add}(x);
+        #t21.{core::List::add}{Invariant}(x);
       }
     }
   } =>#t21;
@@ -194,7 +194,7 @@
       core::Iterator<core::int> :sync-for-iterator = l1.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         core::int x = :sync-for-iterator.{core::Iterator::current};
-        #t22.{core::List::add}(x);
+        #t22.{core::List::add}{Invariant}(x);
       }
     }
   } =>#t22;
@@ -216,7 +216,7 @@
         final dynamic #t25 = :sync-for-iterator.{core::Iterator::current};
         {
           core::int x = #t25 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
-          #t24.{core::List::add}(x);
+          #t24.{core::List::add}{Invariant}(x);
         }
       }
     }
diff --git a/pkg/front_end/testcases/nnbd/forin.dart.weak.expect b/pkg/front_end/testcases/nnbd/forin.dart.weak.expect
index d6e6324..0d3c0c9 100644
--- a/pkg/front_end/testcases/nnbd/forin.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/forin.dart.weak.expect
@@ -2,23 +2,23 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/forin.dart:9:17: Error: The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+// pkg/front_end/testcases/nnbd/forin.dart:9:17: Error: The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'Iterable<int>?' is nullable and 'Iterable<dynamic>' isn't.
 //  - 'Iterable' is from 'dart:core'.
 //   for (int x in i2) x;
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/forin.dart:10:18: Error: The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+// pkg/front_end/testcases/nnbd/forin.dart:10:18: Error: The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'Iterable<int>?' is nullable and 'Iterable<dynamic>' isn't.
 //  - 'Iterable' is from 'dart:core'.
 //   [for (int x in i2) x];
 //                  ^
 //
-// pkg/front_end/testcases/nnbd/forin.dart:12:17: Error: The type 'List<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+// pkg/front_end/testcases/nnbd/forin.dart:12:17: Error: The type 'List<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'List<int>?' is nullable and 'Iterable<dynamic>' isn't.
 //  - 'List' is from 'dart:core'.
 //  - 'Iterable' is from 'dart:core'.
 //   for (int x in l2) x;
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/forin.dart:13:18: Error: The type 'List<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+// pkg/front_end/testcases/nnbd/forin.dart:13:18: Error: The type 'List<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'List<int>?' is nullable and 'Iterable<dynamic>' isn't.
 //  - 'List' is from 'dart:core'.
 //  - 'Iterable' is from 'dart:core'.
 //   [for (int x in l2) x];
@@ -52,20 +52,20 @@
 import "dart:core" as core;
 
 static method error(core::Iterable<core::int>? i2, core::List<core::int>? l2, core::Object o1, core::Object? o2) → dynamic {
-  for (core::int x in let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:9:17: Error: The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+  for (core::int x in let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:9:17: Error: The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'Iterable<int>?' is nullable and 'Iterable<dynamic>' isn't.
  - 'Iterable' is from 'dart:core'.
   for (int x in i2) x;
                 ^" in i2 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic>)
     x;
   block {
     final core::List<core::int> #t2 = <core::int>[];
-    for (core::int x in let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:10:18: Error: The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+    for (core::int x in let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:10:18: Error: The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'Iterable<int>?' is nullable and 'Iterable<dynamic>' isn't.
  - 'Iterable' is from 'dart:core'.
   [for (int x in i2) x];
                  ^" in i2 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic>)
-      #t2.{core::List::add}(x);
+      #t2.{core::List::add}{Invariant}(x);
   } =>#t2;
-  for (core::int x in let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:12:17: Error: The type 'List<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+  for (core::int x in let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:12:17: Error: The type 'List<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'List<int>?' is nullable and 'Iterable<dynamic>' isn't.
  - 'List' is from 'dart:core'.
  - 'Iterable' is from 'dart:core'.
   for (int x in l2) x;
@@ -73,12 +73,12 @@
     x;
   block {
     final core::List<core::int> #t5 = <core::int>[];
-    for (core::int x in let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:13:18: Error: The type 'List<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+    for (core::int x in let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:13:18: Error: The type 'List<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'List<int>?' is nullable and 'Iterable<dynamic>' isn't.
  - 'List' is from 'dart:core'.
  - 'Iterable' is from 'dart:core'.
   [for (int x in l2) x];
                  ^" in l2 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic>)
-      #t5.{core::List::add}(x);
+      #t5.{core::List::add}{Invariant}(x);
   } =>#t5;
   for (final dynamic #t7 in let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:15:17: Error: The type 'Object' used in the 'for' loop must implement 'Iterable<dynamic>'.
  - 'Object' is from 'dart:core'.
@@ -96,7 +96,7 @@
   [for (int x in o1) x];
                  ^" in o1 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic>) {
       core::int x = #t10 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
-      #t9.{core::List::add}(x);
+      #t9.{core::List::add}{Invariant}(x);
     }
   } =>#t9;
   for (final dynamic #t12 in let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:18:17: Error: The type 'Object?' used in the 'for' loop must implement 'Iterable<dynamic>'.
@@ -115,7 +115,7 @@
   [for (int x in o2) x];
                  ^" in o2 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic>) {
       core::int x = #t15 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
-      #t14.{core::List::add}(x);
+      #t14.{core::List::add}{Invariant}(x);
     }
   } =>#t14;
 }
@@ -125,14 +125,14 @@
   block {
     final core::List<core::int> #t17 = <core::int>[];
     for (core::int x in i1)
-      #t17.{core::List::add}(x);
+      #t17.{core::List::add}{Invariant}(x);
   } =>#t17;
   for (core::int x in l1)
     x;
   block {
     final core::List<core::int> #t18 = <core::int>[];
     for (core::int x in l1)
-      #t18.{core::List::add}(x);
+      #t18.{core::List::add}{Invariant}(x);
   } =>#t18;
   for (final dynamic #t19 in d as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>) {
     core::int x = #t19 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
@@ -142,7 +142,7 @@
     final core::List<core::int> #t20 = <core::int>[];
     for (final dynamic #t21 in d as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>) {
       core::int x = #t21 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
-      #t20.{core::List::add}(x);
+      #t20.{core::List::add}{Invariant}(x);
     }
   } =>#t20;
 }
diff --git a/pkg/front_end/testcases/nnbd/forin.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/forin.dart.weak.transformed.expect
index 3882876..43b2e84 100644
--- a/pkg/front_end/testcases/nnbd/forin.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/forin.dart.weak.transformed.expect
@@ -2,23 +2,23 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/forin.dart:9:17: Error: The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+// pkg/front_end/testcases/nnbd/forin.dart:9:17: Error: The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'Iterable<int>?' is nullable and 'Iterable<dynamic>' isn't.
 //  - 'Iterable' is from 'dart:core'.
 //   for (int x in i2) x;
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/forin.dart:10:18: Error: The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+// pkg/front_end/testcases/nnbd/forin.dart:10:18: Error: The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'Iterable<int>?' is nullable and 'Iterable<dynamic>' isn't.
 //  - 'Iterable' is from 'dart:core'.
 //   [for (int x in i2) x];
 //                  ^
 //
-// pkg/front_end/testcases/nnbd/forin.dart:12:17: Error: The type 'List<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+// pkg/front_end/testcases/nnbd/forin.dart:12:17: Error: The type 'List<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'List<int>?' is nullable and 'Iterable<dynamic>' isn't.
 //  - 'List' is from 'dart:core'.
 //  - 'Iterable' is from 'dart:core'.
 //   for (int x in l2) x;
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/forin.dart:13:18: Error: The type 'List<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+// pkg/front_end/testcases/nnbd/forin.dart:13:18: Error: The type 'List<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'List<int>?' is nullable and 'Iterable<dynamic>' isn't.
 //  - 'List' is from 'dart:core'.
 //  - 'Iterable' is from 'dart:core'.
 //   [for (int x in l2) x];
@@ -53,7 +53,7 @@
 
 static method error(core::Iterable<core::int>? i2, core::List<core::int>? l2, core::Object o1, core::Object? o2) → dynamic {
   {
-    core::Iterator<dynamic> :sync-for-iterator = (let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:9:17: Error: The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+    core::Iterator<dynamic> :sync-for-iterator = (let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:9:17: Error: The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'Iterable<int>?' is nullable and 'Iterable<dynamic>' isn't.
  - 'Iterable' is from 'dart:core'.
   for (int x in i2) x;
                 ^" in i2).{core::Iterable::iterator};
@@ -65,18 +65,18 @@
   block {
     final core::List<core::int> #t2 = <core::int>[];
     {
-      core::Iterator<dynamic> :sync-for-iterator = (let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:10:18: Error: The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+      core::Iterator<dynamic> :sync-for-iterator = (let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:10:18: Error: The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'Iterable<int>?' is nullable and 'Iterable<dynamic>' isn't.
  - 'Iterable' is from 'dart:core'.
   [for (int x in i2) x];
                  ^" in i2).{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         core::int x = :sync-for-iterator.{core::Iterator::current};
-        #t2.{core::List::add}(x);
+        #t2.{core::List::add}{Invariant}(x);
       }
     }
   } =>#t2;
   {
-    core::Iterator<dynamic> :sync-for-iterator = (let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:12:17: Error: The type 'List<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+    core::Iterator<dynamic> :sync-for-iterator = (let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:12:17: Error: The type 'List<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'List<int>?' is nullable and 'Iterable<dynamic>' isn't.
  - 'List' is from 'dart:core'.
  - 'Iterable' is from 'dart:core'.
   for (int x in l2) x;
@@ -89,14 +89,14 @@
   block {
     final core::List<core::int> #t5 = <core::int>[];
     {
-      core::Iterator<dynamic> :sync-for-iterator = (let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:13:18: Error: The type 'List<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+      core::Iterator<dynamic> :sync-for-iterator = (let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:13:18: Error: The type 'List<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'List<int>?' is nullable and 'Iterable<dynamic>' isn't.
  - 'List' is from 'dart:core'.
  - 'Iterable' is from 'dart:core'.
   [for (int x in l2) x];
                  ^" in l2).{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         core::int x = :sync-for-iterator.{core::Iterator::current};
-        #t5.{core::List::add}(x);
+        #t5.{core::List::add}{Invariant}(x);
       }
     }
   } =>#t5;
@@ -126,7 +126,7 @@
         final dynamic #t11 = :sync-for-iterator.{core::Iterator::current};
         {
           core::int x = #t11 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
-          #t9.{core::List::add}(x);
+          #t9.{core::List::add}{Invariant}(x);
         }
       }
     }
@@ -157,7 +157,7 @@
         final dynamic #t16 = :sync-for-iterator.{core::Iterator::current};
         {
           core::int x = #t16 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
-          #t14.{core::List::add}(x);
+          #t14.{core::List::add}{Invariant}(x);
         }
       }
     }
@@ -177,7 +177,7 @@
       core::Iterator<core::int> :sync-for-iterator = i1.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         core::int x = :sync-for-iterator.{core::Iterator::current};
-        #t17.{core::List::add}(x);
+        #t17.{core::List::add}{Invariant}(x);
       }
     }
   } =>#t17;
@@ -194,7 +194,7 @@
       core::Iterator<core::int> :sync-for-iterator = l1.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         core::int x = :sync-for-iterator.{core::Iterator::current};
-        #t18.{core::List::add}(x);
+        #t18.{core::List::add}{Invariant}(x);
       }
     }
   } =>#t18;
@@ -216,7 +216,7 @@
         final dynamic #t21 = :sync-for-iterator.{core::Iterator::current};
         {
           core::int x = #t21 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
-          #t20.{core::List::add}(x);
+          #t20.{core::List::add}{Invariant}(x);
         }
       }
     }
diff --git a/pkg/front_end/testcases/nnbd/from_agnostic/from_agnostic.dart.outline.expect b/pkg/front_end/testcases/nnbd/from_agnostic/from_agnostic.dart.outline.expect
index c79998e..b4161d9 100644
--- a/pkg/front_end/testcases/nnbd/from_agnostic/from_agnostic.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/from_agnostic/from_agnostic.dart.outline.expect
@@ -28,7 +28,7 @@
 Extra constant evaluation status:
 Evaluated: StaticInvocation @ org-dartlang-testcase:///from_agnostic.dart:7:12 -> BoolConstant(false)
 Evaluated: MapLiteral @ org-dartlang-testcase:///from_agnostic.dart:8:12 -> InstanceConstant(const _ImmutableMap<List<int?>, int>{_ImmutableMap._kvPairs: const <dynamic>[const <int>[], 0, const <int?>[], 1]})
-Evaluated: SetLiteral @ org-dartlang-testcase:///from_agnostic.dart:9:12 -> InstanceConstant(const _UnmodifiableSet<List<int?>>{_UnmodifiableSet._map: const _ImmutableMap<List<int?>, Null?>{_ImmutableMap._kvPairs: const <dynamic>[const <int>[], null, const <int?>[], null]}})
+Evaluated: SetLiteral @ org-dartlang-testcase:///from_agnostic.dart:9:12 -> InstanceConstant(const _UnmodifiableSet<List<int?>>{_UnmodifiableSet._map: const _ImmutableMap<List<int?>, Null>{_ImmutableMap._kvPairs: const <dynamic>[const <int>[], null, const <int?>[], null]}})
 Evaluated: StaticGet @ org-dartlang-testcase:///from_agnostic.dart:10:12 -> ListConstant(const <int>[])
 Evaluated: StaticGet @ org-dartlang-testcase:///from_agnostic.dart:11:12 -> ListConstant(const <int?>[])
 Extra constant evaluation: evaluated: 5, effectively constant: 5
diff --git a/pkg/front_end/testcases/nnbd/from_agnostic/from_agnostic.dart.strong.expect b/pkg/front_end/testcases/nnbd/from_agnostic/from_agnostic.dart.strong.expect
index ef5caf7..e114f63 100644
--- a/pkg/front_end/testcases/nnbd/from_agnostic/from_agnostic.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/from_agnostic/from_agnostic.dart.strong.expect
@@ -31,6 +31,6 @@
   #C7 = core::_ImmutableMap<core::List<core::int?>, core::int> {_kvPairs:#C6}
   #C8 = null
   #C9 = <dynamic>[#C2, #C8, #C4, #C8]
-  #C10 = core::_ImmutableMap<core::List<core::int?>, core::Null?> {_kvPairs:#C9}
+  #C10 = core::_ImmutableMap<core::List<core::int?>, Null> {_kvPairs:#C9}
   #C11 = col::_UnmodifiableSet<core::List<core::int?>> {_map:#C10}
 }
diff --git a/pkg/front_end/testcases/nnbd/from_agnostic/from_agnostic.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/from_agnostic/from_agnostic.dart.strong.transformed.expect
index ef5caf7..e114f63 100644
--- a/pkg/front_end/testcases/nnbd/from_agnostic/from_agnostic.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/from_agnostic/from_agnostic.dart.strong.transformed.expect
@@ -31,6 +31,6 @@
   #C7 = core::_ImmutableMap<core::List<core::int?>, core::int> {_kvPairs:#C6}
   #C8 = null
   #C9 = <dynamic>[#C2, #C8, #C4, #C8]
-  #C10 = core::_ImmutableMap<core::List<core::int?>, core::Null?> {_kvPairs:#C9}
+  #C10 = core::_ImmutableMap<core::List<core::int?>, Null> {_kvPairs:#C9}
   #C11 = col::_UnmodifiableSet<core::List<core::int?>> {_map:#C10}
 }
diff --git a/pkg/front_end/testcases/nnbd/function_types.dart.strong.expect b/pkg/front_end/testcases/nnbd/function_types.dart.strong.expect
index 639f4a9..26e67a7 100644
--- a/pkg/front_end/testcases/nnbd/function_types.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/function_types.dart.strong.expect
@@ -27,7 +27,7 @@
 static method foobar(() →? dynamic x) → () →? dynamic
   return null;
 static method main() → dynamic {
-  () → void g = () → core::Null? {};
+  () → void g = () → void {};
   () →? void f = g;
   () → void fBar = self::bar();
   () →? void fBaz = self::baz();
diff --git a/pkg/front_end/testcases/nnbd/function_types.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/function_types.dart.strong.transformed.expect
index 639f4a9..26e67a7 100644
--- a/pkg/front_end/testcases/nnbd/function_types.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/function_types.dart.strong.transformed.expect
@@ -27,7 +27,7 @@
 static method foobar(() →? dynamic x) → () →? dynamic
   return null;
 static method main() → dynamic {
-  () → void g = () → core::Null? {};
+  () → void g = () → void {};
   () →? void f = g;
   () → void fBar = self::bar();
   () →? void fBaz = self::baz();
diff --git a/pkg/front_end/testcases/nnbd/function_types.dart.weak.expect b/pkg/front_end/testcases/nnbd/function_types.dart.weak.expect
index 639f4a9..26e67a7 100644
--- a/pkg/front_end/testcases/nnbd/function_types.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/function_types.dart.weak.expect
@@ -27,7 +27,7 @@
 static method foobar(() →? dynamic x) → () →? dynamic
   return null;
 static method main() → dynamic {
-  () → void g = () → core::Null? {};
+  () → void g = () → void {};
   () →? void f = g;
   () → void fBar = self::bar();
   () →? void fBaz = self::baz();
diff --git a/pkg/front_end/testcases/nnbd/function_types.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/function_types.dart.weak.transformed.expect
index 639f4a9..26e67a7 100644
--- a/pkg/front_end/testcases/nnbd/function_types.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/function_types.dart.weak.transformed.expect
@@ -27,7 +27,7 @@
 static method foobar(() →? dynamic x) → () →? dynamic
   return null;
 static method main() → dynamic {
-  () → void g = () → core::Null? {};
+  () → void g = () → void {};
   () →? void f = g;
   () → void fBar = self::bar();
   () →? void fBaz = self::baz();
diff --git a/pkg/front_end/testcases/nnbd/infer_method_types.dart.outline.expect b/pkg/front_end/testcases/nnbd/infer_method_types.dart.outline.expect
index fa99f33..37ff6de 100644
--- a/pkg/front_end/testcases/nnbd/infer_method_types.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/infer_method_types.dart.outline.expect
@@ -40,7 +40,7 @@
 abstract class H extends core::Object implements self::D, self::E, self::F, self::C {
   synthetic constructor •() → self::H
     ;
-  abstract forwarding-stub method m(covariant core::num a) → core::Object?;
+  abstract member-signature method m(covariant core::num a) → core::Object?; -> self::E::m
 }
 abstract class I extends core::Object implements self::D {
   synthetic constructor •() → self::I
@@ -55,7 +55,7 @@
 abstract class K extends core::Object implements self::I, self::E, self::G {
   synthetic constructor •() → self::K
     ;
-  abstract forwarding-stub method m(covariant core::num a) → core::Object?;
+  abstract member-signature method m(covariant core::num a) → core::Object?; -> self::E::m
 }
 abstract class L extends core::Object implements self::K {
   synthetic constructor •() → self::L
diff --git a/pkg/front_end/testcases/nnbd/infer_method_types.dart.strong.expect b/pkg/front_end/testcases/nnbd/infer_method_types.dart.strong.expect
index 5bd5e36..bbe06cb 100644
--- a/pkg/front_end/testcases/nnbd/infer_method_types.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/infer_method_types.dart.strong.expect
@@ -48,7 +48,7 @@
   synthetic constructor •() → self::H
     : super core::Object::•()
     ;
-  abstract forwarding-stub method m(covariant core::num a) → core::Object?;
+  abstract member-signature method m(covariant core::num a) → core::Object?; -> self::E::m
 }
 abstract class I extends core::Object implements self::D {
   synthetic constructor •() → self::I
@@ -66,7 +66,7 @@
   synthetic constructor •() → self::K
     : super core::Object::•()
     ;
-  abstract forwarding-stub method m(covariant core::num a) → core::Object?;
+  abstract member-signature method m(covariant core::num a) → core::Object?; -> self::E::m
 }
 abstract class L extends core::Object implements self::K {
   synthetic constructor •() → self::L
diff --git a/pkg/front_end/testcases/nnbd/infer_method_types.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/infer_method_types.dart.strong.transformed.expect
index 5bd5e36..bbe06cb 100644
--- a/pkg/front_end/testcases/nnbd/infer_method_types.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/infer_method_types.dart.strong.transformed.expect
@@ -48,7 +48,7 @@
   synthetic constructor •() → self::H
     : super core::Object::•()
     ;
-  abstract forwarding-stub method m(covariant core::num a) → core::Object?;
+  abstract member-signature method m(covariant core::num a) → core::Object?; -> self::E::m
 }
 abstract class I extends core::Object implements self::D {
   synthetic constructor •() → self::I
@@ -66,7 +66,7 @@
   synthetic constructor •() → self::K
     : super core::Object::•()
     ;
-  abstract forwarding-stub method m(covariant core::num a) → core::Object?;
+  abstract member-signature method m(covariant core::num a) → core::Object?; -> self::E::m
 }
 abstract class L extends core::Object implements self::K {
   synthetic constructor •() → self::L
diff --git a/pkg/front_end/testcases/nnbd/infer_method_types.dart.weak.expect b/pkg/front_end/testcases/nnbd/infer_method_types.dart.weak.expect
index 5bd5e36..bbe06cb 100644
--- a/pkg/front_end/testcases/nnbd/infer_method_types.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/infer_method_types.dart.weak.expect
@@ -48,7 +48,7 @@
   synthetic constructor •() → self::H
     : super core::Object::•()
     ;
-  abstract forwarding-stub method m(covariant core::num a) → core::Object?;
+  abstract member-signature method m(covariant core::num a) → core::Object?; -> self::E::m
 }
 abstract class I extends core::Object implements self::D {
   synthetic constructor •() → self::I
@@ -66,7 +66,7 @@
   synthetic constructor •() → self::K
     : super core::Object::•()
     ;
-  abstract forwarding-stub method m(covariant core::num a) → core::Object?;
+  abstract member-signature method m(covariant core::num a) → core::Object?; -> self::E::m
 }
 abstract class L extends core::Object implements self::K {
   synthetic constructor •() → self::L
diff --git a/pkg/front_end/testcases/nnbd/infer_method_types.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/infer_method_types.dart.weak.transformed.expect
index 5bd5e36..bbe06cb 100644
--- a/pkg/front_end/testcases/nnbd/infer_method_types.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/infer_method_types.dart.weak.transformed.expect
@@ -48,7 +48,7 @@
   synthetic constructor •() → self::H
     : super core::Object::•()
     ;
-  abstract forwarding-stub method m(covariant core::num a) → core::Object?;
+  abstract member-signature method m(covariant core::num a) → core::Object?; -> self::E::m
 }
 abstract class I extends core::Object implements self::D {
   synthetic constructor •() → self::I
@@ -66,7 +66,7 @@
   synthetic constructor •() → self::K
     : super core::Object::•()
     ;
-  abstract forwarding-stub method m(covariant core::num a) → core::Object?;
+  abstract member-signature method m(covariant core::num a) → core::Object?; -> self::E::m
 }
 abstract class L extends core::Object implements self::K {
   synthetic constructor •() → self::L
diff --git a/pkg/front_end/testcases/nnbd/issue39822.dart.outline.expect b/pkg/front_end/testcases/nnbd/issue39822.dart.outline.expect
index bc24ff1..3a5a5b8 100644
--- a/pkg/front_end/testcases/nnbd/issue39822.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/issue39822.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static method foo(core::Null? x) → dynamic
+static method foo(Null x) → dynamic
   ;
 static method bar(core::int y) → dynamic
   ;
diff --git a/pkg/front_end/testcases/nnbd/issue39822.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue39822.dart.strong.expect
index 14a6598..0c41f17 100644
--- a/pkg/front_end/testcases/nnbd/issue39822.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue39822.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static method foo(core::Null? x) → dynamic {
+static method foo(Null x) → dynamic {
   self::bar(x!);
 }
 static method bar(core::int y) → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue39822.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue39822.dart.strong.transformed.expect
index 14a6598..0c41f17 100644
--- a/pkg/front_end/testcases/nnbd/issue39822.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue39822.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static method foo(core::Null? x) → dynamic {
+static method foo(Null x) → dynamic {
   self::bar(x!);
 }
 static method bar(core::int y) → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue39822.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue39822.dart.weak.expect
index 4304389..5ffa759 100644
--- a/pkg/front_end/testcases/nnbd/issue39822.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue39822.dart.weak.expect
@@ -1,9 +1,9 @@
 library /*isNonNullableByDefault*/;
 import self as self;
-import "dart:core" as core;
 import "dart:_internal" as _in;
+import "dart:core" as core;
 
-static method foo(core::Null? x) → dynamic {
+static method foo(Null x) → dynamic {
   self::bar(let final Never #t1 = x! in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
 }
 static method bar(core::int y) → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue39822.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue39822.dart.weak.transformed.expect
index 4304389..5ffa759 100644
--- a/pkg/front_end/testcases/nnbd/issue39822.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue39822.dart.weak.transformed.expect
@@ -1,9 +1,9 @@
 library /*isNonNullableByDefault*/;
 import self as self;
-import "dart:core" as core;
 import "dart:_internal" as _in;
+import "dart:core" as core;
 
-static method foo(core::Null? x) → dynamic {
+static method foo(Null x) → dynamic {
   self::bar(let final Never #t1 = x! in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
 }
 static method bar(core::int y) → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue40601.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue40601.dart.strong.expect
index 3d1b60c..412e12d 100644
--- a/pkg/front_end/testcases/nnbd/issue40601.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue40601.dart.strong.expect
@@ -11,7 +11,7 @@
   method foo() → dynamic {
     late self::A::T% value;
     () → dynamic result = () → dynamic => this.{self::A::bar}(value);
-    (() → core::Null? {
+    (() → Null {
       value = this.{self::A::baz}();
     }).call();
     return result;
diff --git a/pkg/front_end/testcases/nnbd/issue40601.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue40601.dart.strong.transformed.expect
index 3d1b60c..412e12d 100644
--- a/pkg/front_end/testcases/nnbd/issue40601.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue40601.dart.strong.transformed.expect
@@ -11,7 +11,7 @@
   method foo() → dynamic {
     late self::A::T% value;
     () → dynamic result = () → dynamic => this.{self::A::bar}(value);
-    (() → core::Null? {
+    (() → Null {
       value = this.{self::A::baz}();
     }).call();
     return result;
diff --git a/pkg/front_end/testcases/nnbd/issue40601.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue40601.dart.weak.expect
index 3d1b60c..412e12d 100644
--- a/pkg/front_end/testcases/nnbd/issue40601.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue40601.dart.weak.expect
@@ -11,7 +11,7 @@
   method foo() → dynamic {
     late self::A::T% value;
     () → dynamic result = () → dynamic => this.{self::A::bar}(value);
-    (() → core::Null? {
+    (() → Null {
       value = this.{self::A::baz}();
     }).call();
     return result;
diff --git a/pkg/front_end/testcases/nnbd/issue40601.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue40601.dart.weak.transformed.expect
index 3d1b60c..412e12d 100644
--- a/pkg/front_end/testcases/nnbd/issue40601.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue40601.dart.weak.transformed.expect
@@ -11,7 +11,7 @@
   method foo() → dynamic {
     late self::A::T% value;
     () → dynamic result = () → dynamic => this.{self::A::bar}(value);
-    (() → core::Null? {
+    (() → Null {
       value = this.{self::A::baz}();
     }).call();
     return result;
diff --git a/pkg/front_end/testcases/nnbd/issue41102.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue41102.dart.strong.expect
index 2889d4d..6c3640f 100644
--- a/pkg/front_end/testcases/nnbd/issue41102.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue41102.dart.strong.expect
@@ -68,14 +68,14 @@
 
 import "dart:async";
 
-static final field asy::StreamTransformer<core::Object?, core::Object?> t = new asy::_StreamHandlerTransformer::•<core::Object?, core::Object?>(handleData: (core::Object? data, asy::EventSink<core::Object?> sink) → asy::Future<void> => asy::Future::microtask<void>(() → void => sink.{asy::EventSink::add}(data)), handleDone: (asy::EventSink<core::Object?> sink) → asy::Future<void> => asy::Future::microtask<void>(() → void => sink.{asy::EventSink::close}()));
+static final field asy::StreamTransformer<core::Object?, core::Object?> t = new asy::_StreamHandlerTransformer::•<core::Object?, core::Object?>(handleData: (core::Object? data, asy::EventSink<core::Object?> sink) → void => asy::Future::microtask<void>(() → void => sink.{asy::EventSink::add}(data)), handleDone: (asy::EventSink<core::Object?> sink) → void => asy::Future::microtask<void>(() → void => sink.{asy::EventSink::close}()));
 static final field core::List<dynamic> s1 = <dynamic>[];
 static final field core::int? s2 = let final core::List<dynamic> #t1 = self::s1 in #t1.{core::List::==}(null) ?{core::int?} null : #t1.{core::List::length};
 static final field core::List<core::int> s3 = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:17:16: Error: Can't use the default List constructor.
 Try using List.filled instead.
 final s3 = new List<int>(2);
                ^" in core::List::•<core::int>(2);
-static final field dynamic s4 = (() → core::Null? {
+static final field dynamic s4 = (() → Null {
   core::int e = 0;
   switch(e) {
     #L1:
diff --git a/pkg/front_end/testcases/nnbd/issue41102.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue41102.dart.strong.transformed.expect
index 4d1285a..55a469e 100644
--- a/pkg/front_end/testcases/nnbd/issue41102.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41102.dart.strong.transformed.expect
@@ -68,14 +68,14 @@
 
 import "dart:async";
 
-static final field asy::StreamTransformer<core::Object?, core::Object?> t = new asy::_StreamHandlerTransformer::•<core::Object?, core::Object?>(handleData: (core::Object? data, asy::EventSink<core::Object?> sink) → asy::Future<void> => asy::Future::microtask<void>(() → void => sink.{asy::EventSink::add}(data)), handleDone: (asy::EventSink<core::Object?> sink) → asy::Future<void> => asy::Future::microtask<void>(() → void => sink.{asy::EventSink::close}()));
+static final field asy::StreamTransformer<core::Object?, core::Object?> t = new asy::_StreamHandlerTransformer::•<core::Object?, core::Object?>(handleData: (core::Object? data, asy::EventSink<core::Object?> sink) → void => asy::Future::microtask<void>(() → void => sink.{asy::EventSink::add}(data)), handleDone: (asy::EventSink<core::Object?> sink) → void => asy::Future::microtask<void>(() → void => sink.{asy::EventSink::close}()));
 static final field core::List<dynamic> s1 = <dynamic>[];
 static final field core::int? s2 = let final core::List<dynamic> #t1 = self::s1 in #t1.{core::List::==}(null) ?{core::int?} null : #t1.{core::List::length};
 static final field core::List<core::int> s3 = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:17:16: Error: Can't use the default List constructor.
 Try using List.filled instead.
 final s3 = new List<int>(2);
                ^" in core::_List::•<core::int>(2);
-static final field dynamic s4 = (() → core::Null? {
+static final field dynamic s4 = (() → Null {
   core::int e = 0;
   switch(e) {
     #L1:
diff --git a/pkg/front_end/testcases/nnbd/issue41102.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue41102.dart.weak.expect
index 2889d4d..6c3640f 100644
--- a/pkg/front_end/testcases/nnbd/issue41102.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue41102.dart.weak.expect
@@ -68,14 +68,14 @@
 
 import "dart:async";
 
-static final field asy::StreamTransformer<core::Object?, core::Object?> t = new asy::_StreamHandlerTransformer::•<core::Object?, core::Object?>(handleData: (core::Object? data, asy::EventSink<core::Object?> sink) → asy::Future<void> => asy::Future::microtask<void>(() → void => sink.{asy::EventSink::add}(data)), handleDone: (asy::EventSink<core::Object?> sink) → asy::Future<void> => asy::Future::microtask<void>(() → void => sink.{asy::EventSink::close}()));
+static final field asy::StreamTransformer<core::Object?, core::Object?> t = new asy::_StreamHandlerTransformer::•<core::Object?, core::Object?>(handleData: (core::Object? data, asy::EventSink<core::Object?> sink) → void => asy::Future::microtask<void>(() → void => sink.{asy::EventSink::add}(data)), handleDone: (asy::EventSink<core::Object?> sink) → void => asy::Future::microtask<void>(() → void => sink.{asy::EventSink::close}()));
 static final field core::List<dynamic> s1 = <dynamic>[];
 static final field core::int? s2 = let final core::List<dynamic> #t1 = self::s1 in #t1.{core::List::==}(null) ?{core::int?} null : #t1.{core::List::length};
 static final field core::List<core::int> s3 = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:17:16: Error: Can't use the default List constructor.
 Try using List.filled instead.
 final s3 = new List<int>(2);
                ^" in core::List::•<core::int>(2);
-static final field dynamic s4 = (() → core::Null? {
+static final field dynamic s4 = (() → Null {
   core::int e = 0;
   switch(e) {
     #L1:
diff --git a/pkg/front_end/testcases/nnbd/issue41102.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue41102.dart.weak.transformed.expect
index 4d1285a..55a469e 100644
--- a/pkg/front_end/testcases/nnbd/issue41102.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41102.dart.weak.transformed.expect
@@ -68,14 +68,14 @@
 
 import "dart:async";
 
-static final field asy::StreamTransformer<core::Object?, core::Object?> t = new asy::_StreamHandlerTransformer::•<core::Object?, core::Object?>(handleData: (core::Object? data, asy::EventSink<core::Object?> sink) → asy::Future<void> => asy::Future::microtask<void>(() → void => sink.{asy::EventSink::add}(data)), handleDone: (asy::EventSink<core::Object?> sink) → asy::Future<void> => asy::Future::microtask<void>(() → void => sink.{asy::EventSink::close}()));
+static final field asy::StreamTransformer<core::Object?, core::Object?> t = new asy::_StreamHandlerTransformer::•<core::Object?, core::Object?>(handleData: (core::Object? data, asy::EventSink<core::Object?> sink) → void => asy::Future::microtask<void>(() → void => sink.{asy::EventSink::add}(data)), handleDone: (asy::EventSink<core::Object?> sink) → void => asy::Future::microtask<void>(() → void => sink.{asy::EventSink::close}()));
 static final field core::List<dynamic> s1 = <dynamic>[];
 static final field core::int? s2 = let final core::List<dynamic> #t1 = self::s1 in #t1.{core::List::==}(null) ?{core::int?} null : #t1.{core::List::length};
 static final field core::List<core::int> s3 = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:17:16: Error: Can't use the default List constructor.
 Try using List.filled instead.
 final s3 = new List<int>(2);
                ^" in core::_List::•<core::int>(2);
-static final field dynamic s4 = (() → core::Null? {
+static final field dynamic s4 = (() → Null {
   core::int e = 0;
   switch(e) {
     #L1:
diff --git a/pkg/front_end/testcases/nnbd/issue41103.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue41103.dart.strong.expect
index ea23f98..4b85f1c 100644
--- a/pkg/front_end/testcases/nnbd/issue41103.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue41103.dart.strong.expect
@@ -5,5 +5,5 @@
 
 import "dart:async";
 
-static final field asy::StreamTransformer<core::Object?, core::Object?> t = new asy::_StreamHandlerTransformer::•<core::Object?, core::Object?>(handleData: (core::Object? data, asy::EventSink<core::Object?> sink) → asy::Future<void> => asy::Future::microtask<void>(() → void => sink.{asy::EventSink::add}(data)), handleDone: (asy::EventSink<core::Object?> sink) → asy::Future<void> => asy::Future::microtask<void>(() → void => sink.{asy::EventSink::close}()));
+static final field asy::StreamTransformer<core::Object?, core::Object?> t = new asy::_StreamHandlerTransformer::•<core::Object?, core::Object?>(handleData: (core::Object? data, asy::EventSink<core::Object?> sink) → void => asy::Future::microtask<void>(() → void => sink.{asy::EventSink::add}(data)), handleDone: (asy::EventSink<core::Object?> sink) → void => asy::Future::microtask<void>(() → void => sink.{asy::EventSink::close}()));
 static method main() → void {}
diff --git a/pkg/front_end/testcases/nnbd/issue41103.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue41103.dart.strong.transformed.expect
index ea23f98..4b85f1c 100644
--- a/pkg/front_end/testcases/nnbd/issue41103.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41103.dart.strong.transformed.expect
@@ -5,5 +5,5 @@
 
 import "dart:async";
 
-static final field asy::StreamTransformer<core::Object?, core::Object?> t = new asy::_StreamHandlerTransformer::•<core::Object?, core::Object?>(handleData: (core::Object? data, asy::EventSink<core::Object?> sink) → asy::Future<void> => asy::Future::microtask<void>(() → void => sink.{asy::EventSink::add}(data)), handleDone: (asy::EventSink<core::Object?> sink) → asy::Future<void> => asy::Future::microtask<void>(() → void => sink.{asy::EventSink::close}()));
+static final field asy::StreamTransformer<core::Object?, core::Object?> t = new asy::_StreamHandlerTransformer::•<core::Object?, core::Object?>(handleData: (core::Object? data, asy::EventSink<core::Object?> sink) → void => asy::Future::microtask<void>(() → void => sink.{asy::EventSink::add}(data)), handleDone: (asy::EventSink<core::Object?> sink) → void => asy::Future::microtask<void>(() → void => sink.{asy::EventSink::close}()));
 static method main() → void {}
diff --git a/pkg/front_end/testcases/nnbd/issue41103.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue41103.dart.weak.expect
index ea23f98..4b85f1c 100644
--- a/pkg/front_end/testcases/nnbd/issue41103.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue41103.dart.weak.expect
@@ -5,5 +5,5 @@
 
 import "dart:async";
 
-static final field asy::StreamTransformer<core::Object?, core::Object?> t = new asy::_StreamHandlerTransformer::•<core::Object?, core::Object?>(handleData: (core::Object? data, asy::EventSink<core::Object?> sink) → asy::Future<void> => asy::Future::microtask<void>(() → void => sink.{asy::EventSink::add}(data)), handleDone: (asy::EventSink<core::Object?> sink) → asy::Future<void> => asy::Future::microtask<void>(() → void => sink.{asy::EventSink::close}()));
+static final field asy::StreamTransformer<core::Object?, core::Object?> t = new asy::_StreamHandlerTransformer::•<core::Object?, core::Object?>(handleData: (core::Object? data, asy::EventSink<core::Object?> sink) → void => asy::Future::microtask<void>(() → void => sink.{asy::EventSink::add}(data)), handleDone: (asy::EventSink<core::Object?> sink) → void => asy::Future::microtask<void>(() → void => sink.{asy::EventSink::close}()));
 static method main() → void {}
diff --git a/pkg/front_end/testcases/nnbd/issue41103.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue41103.dart.weak.transformed.expect
index ea23f98..4b85f1c 100644
--- a/pkg/front_end/testcases/nnbd/issue41103.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41103.dart.weak.transformed.expect
@@ -5,5 +5,5 @@
 
 import "dart:async";
 
-static final field asy::StreamTransformer<core::Object?, core::Object?> t = new asy::_StreamHandlerTransformer::•<core::Object?, core::Object?>(handleData: (core::Object? data, asy::EventSink<core::Object?> sink) → asy::Future<void> => asy::Future::microtask<void>(() → void => sink.{asy::EventSink::add}(data)), handleDone: (asy::EventSink<core::Object?> sink) → asy::Future<void> => asy::Future::microtask<void>(() → void => sink.{asy::EventSink::close}()));
+static final field asy::StreamTransformer<core::Object?, core::Object?> t = new asy::_StreamHandlerTransformer::•<core::Object?, core::Object?>(handleData: (core::Object? data, asy::EventSink<core::Object?> sink) → void => asy::Future::microtask<void>(() → void => sink.{asy::EventSink::add}(data)), handleDone: (asy::EventSink<core::Object?> sink) → void => asy::Future::microtask<void>(() → void => sink.{asy::EventSink::close}()));
 static method main() → void {}
diff --git a/pkg/front_end/testcases/nnbd/issue41108.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue41108.dart.strong.expect
index 778d86e..62a6e70 100644
--- a/pkg/front_end/testcases/nnbd/issue41108.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue41108.dart.strong.expect
@@ -2,7 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/issue41108.dart:6:12: Error: A value of type 'List<dynamic>?' can't be assigned to a variable of type 'List<dynamic>'.
+// pkg/front_end/testcases/nnbd/issue41108.dart:6:12: Error: A value of type 'List<dynamic>?' can't be assigned to a variable of type 'List<dynamic>' because 'List<dynamic>?' is nullable and 'List<dynamic>' isn't.
 //  - 'List' is from 'dart:core'.
 //   List y = await l(); // should be a List?
 //            ^
@@ -12,7 +12,7 @@
 import "dart:async" as asy;
 
 static method test() → dynamic async {
-  core::List<dynamic> y = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue41108.dart:6:12: Error: A value of type 'List<dynamic>?' can't be assigned to a variable of type 'List<dynamic>'.
+  core::List<dynamic> y = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue41108.dart:6:12: Error: A value of type 'List<dynamic>?' can't be assigned to a variable of type 'List<dynamic>' because 'List<dynamic>?' is nullable and 'List<dynamic>' isn't.
  - 'List' is from 'dart:core'.
   List y = await l(); // should be a List?
            ^" in await self::l() as{TypeError,ForNonNullableByDefault} core::List<dynamic>;
diff --git a/pkg/front_end/testcases/nnbd/issue41108.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue41108.dart.strong.transformed.expect
index 87e1bf1..50e24cb 100644
--- a/pkg/front_end/testcases/nnbd/issue41108.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41108.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/issue41108.dart:6:12: Error: A value of type 'List<dynamic>?' can't be assigned to a variable of type 'List<dynamic>'.
+// pkg/front_end/testcases/nnbd/issue41108.dart:6:12: Error: A value of type 'List<dynamic>?' can't be assigned to a variable of type 'List<dynamic>' because 'List<dynamic>?' is nullable and 'List<dynamic>' isn't.
 //  - 'List' is from 'dart:core'.
 //   List y = await l(); // should be a List?
 //            ^
@@ -13,7 +13,8 @@
 import "dart:_internal" as _in;
 
 static method test() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic> :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>? :return_value;
   dynamic :async_stack_trace;
   (dynamic) → dynamic :async_op_then;
@@ -25,24 +26,25 @@
     try {
       #L1:
       {
-        final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue41108.dart:6:12: Error: A value of type 'List<dynamic>?' can't be assigned to a variable of type 'List<dynamic>'.
+        final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue41108.dart:6:12: Error: A value of type 'List<dynamic>?' can't be assigned to a variable of type 'List<dynamic>' because 'List<dynamic>?' is nullable and 'List<dynamic>' isn't.
  - 'List' is from 'dart:core'.
   List y = await l(); // should be a List?
            ^";
         [yield] let dynamic #t2 = asy::_awaitHelper(self::l(), :async_op_then, :async_op_error, :async_op) in null;
         core::List<dynamic> y = let core::List<dynamic>? #t3 = _in::unsafeCast<core::List<dynamic>?>(:result) in #t3.==(null) ?{core::List<dynamic>} #t3 as{TypeError,ForNonNullableByDefault} core::List<dynamic> : #t3{core::List<dynamic>};
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method l() → asy::Future<core::List<dynamic>>?
   return null;
diff --git a/pkg/front_end/testcases/nnbd/issue41108.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue41108.dart.weak.expect
index 778d86e..62a6e70 100644
--- a/pkg/front_end/testcases/nnbd/issue41108.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue41108.dart.weak.expect
@@ -2,7 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/issue41108.dart:6:12: Error: A value of type 'List<dynamic>?' can't be assigned to a variable of type 'List<dynamic>'.
+// pkg/front_end/testcases/nnbd/issue41108.dart:6:12: Error: A value of type 'List<dynamic>?' can't be assigned to a variable of type 'List<dynamic>' because 'List<dynamic>?' is nullable and 'List<dynamic>' isn't.
 //  - 'List' is from 'dart:core'.
 //   List y = await l(); // should be a List?
 //            ^
@@ -12,7 +12,7 @@
 import "dart:async" as asy;
 
 static method test() → dynamic async {
-  core::List<dynamic> y = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue41108.dart:6:12: Error: A value of type 'List<dynamic>?' can't be assigned to a variable of type 'List<dynamic>'.
+  core::List<dynamic> y = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue41108.dart:6:12: Error: A value of type 'List<dynamic>?' can't be assigned to a variable of type 'List<dynamic>' because 'List<dynamic>?' is nullable and 'List<dynamic>' isn't.
  - 'List' is from 'dart:core'.
   List y = await l(); // should be a List?
            ^" in await self::l() as{TypeError,ForNonNullableByDefault} core::List<dynamic>;
diff --git a/pkg/front_end/testcases/nnbd/issue41108.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue41108.dart.weak.transformed.expect
index 255b564..8631965 100644
--- a/pkg/front_end/testcases/nnbd/issue41108.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41108.dart.weak.transformed.expect
@@ -2,7 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/issue41108.dart:6:12: Error: A value of type 'List<dynamic>?' can't be assigned to a variable of type 'List<dynamic>'.
+// pkg/front_end/testcases/nnbd/issue41108.dart:6:12: Error: A value of type 'List<dynamic>?' can't be assigned to a variable of type 'List<dynamic>' because 'List<dynamic>?' is nullable and 'List<dynamic>' isn't.
 //  - 'List' is from 'dart:core'.
 //   List y = await l(); // should be a List?
 //            ^
@@ -13,7 +13,8 @@
 import "dart:_internal" as _in;
 
 static method test() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic> :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>? :return_value;
   dynamic :async_stack_trace;
   (dynamic) → dynamic :async_op_then;
@@ -25,24 +26,25 @@
     try {
       #L1:
       {
-        final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue41108.dart:6:12: Error: A value of type 'List<dynamic>?' can't be assigned to a variable of type 'List<dynamic>'.
+        final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue41108.dart:6:12: Error: A value of type 'List<dynamic>?' can't be assigned to a variable of type 'List<dynamic>' because 'List<dynamic>?' is nullable and 'List<dynamic>' isn't.
  - 'List' is from 'dart:core'.
   List y = await l(); // should be a List?
            ^";
         [yield] let dynamic #t2 = asy::_awaitHelper(self::l(), :async_op_then, :async_op_error, :async_op) in null;
         core::List<dynamic> y = _in::unsafeCast<core::List<dynamic>?>(:result);
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method l() → asy::Future<core::List<dynamic>>?
   return null;
diff --git a/pkg/front_end/testcases/nnbd/issue41114.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue41114.dart.strong.transformed.expect
index 3ac2da4..0d0a5f6 100644
--- a/pkg/front_end/testcases/nnbd/issue41114.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41114.dart.strong.transformed.expect
@@ -4,7 +4,8 @@
 import "dart:core" as core;
 
 static method main() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic> :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>? :return_value;
   dynamic :async_stack_trace;
   (dynamic) → dynamic :async_op_then;
@@ -20,15 +21,16 @@
         core::Iterable<core::String>? i = let final core::Iterable<core::String>? #t2 = b in #t2.{core::Object::==}(null) ?{core::Iterable<core::String>?} a : #t2{core::Iterable<core::String>};
         core::print(i);
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
diff --git a/pkg/front_end/testcases/nnbd/issue41114.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue41114.dart.weak.transformed.expect
index 3ac2da4..0d0a5f6 100644
--- a/pkg/front_end/testcases/nnbd/issue41114.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41114.dart.weak.transformed.expect
@@ -4,7 +4,8 @@
 import "dart:core" as core;
 
 static method main() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic> :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>? :return_value;
   dynamic :async_stack_trace;
   (dynamic) → dynamic :async_op_then;
@@ -20,15 +21,16 @@
         core::Iterable<core::String>? i = let final core::Iterable<core::String>? #t2 = b in #t2.{core::Object::==}(null) ?{core::Iterable<core::String>?} a : #t2{core::Iterable<core::String>};
         core::print(i);
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
diff --git a/pkg/front_end/testcases/nnbd/issue41156.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue41156.dart.strong.transformed.expect
index 07174dc..2d5c92d 100644
--- a/pkg/front_end/testcases/nnbd/issue41156.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41156.dart.strong.transformed.expect
@@ -56,7 +56,8 @@
     return self::throwing();
   };
   (core::int) → asy::Future<core::String> y1 = (core::int v) → asy::Future<Never> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<Never> :async_completer = new asy::_AsyncAwaitCompleter::•<Never>();
+    final asy::_Future<Never> :async_future = new asy::_Future::•<Never>();
+    core::bool* :is_sync = false;
     FutureOr<Never>? :return_value;
     dynamic :async_stack_trace;
     (dynamic) → dynamic :async_op_then;
@@ -70,20 +71,22 @@
           :return_value = throw v;
           break #L1;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   };
   (core::int) → asy::Future<core::String> y2 = (core::int v) → asy::Future<Never> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<Never> :async_completer = new asy::_AsyncAwaitCompleter::•<Never>();
+    final asy::_Future<Never> :async_future = new asy::_Future::•<Never>();
+    core::bool* :is_sync = false;
     FutureOr<Never>? :return_value;
     dynamic :async_stack_trace;
     (dynamic) → dynamic :async_op_then;
@@ -96,20 +99,22 @@
         {
           throw v;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   };
   (core::int) → asy::Future<core::String> y3 = (core::int v) → asy::Future<Never> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<Never> :async_completer = new asy::_AsyncAwaitCompleter::•<Never>();
+    final asy::_Future<Never> :async_future = new asy::_Future::•<Never>();
+    core::bool* :is_sync = false;
     FutureOr<Never>? :return_value;
     dynamic :async_stack_trace;
     (dynamic) → dynamic :async_op_then;
@@ -123,20 +128,22 @@
           :return_value = throw v;
           break #L3;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   };
   (core::int) → asy::Future<core::String> y4 = (core::int v) → asy::Future<Never> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<Never> :async_completer = new asy::_AsyncAwaitCompleter::•<Never>();
+    final asy::_Future<Never> :async_future = new asy::_Future::•<Never>();
+    core::bool* :is_sync = false;
     FutureOr<Never>? :return_value;
     dynamic :async_stack_trace;
     (dynamic) → dynamic :async_op_then;
@@ -150,20 +157,22 @@
           :return_value = self::throwing();
           break #L4;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   };
   (core::int) → asy::Future<core::String> y5 = (core::int v) → asy::Future<Never> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<Never> :async_completer = new asy::_AsyncAwaitCompleter::•<Never>();
+    final asy::_Future<Never> :async_future = new asy::_Future::•<Never>();
+    core::bool* :is_sync = false;
     FutureOr<Never>? :return_value;
     dynamic :async_stack_trace;
     (dynamic) → dynamic :async_op_then;
@@ -176,20 +185,22 @@
         {
           self::throwing();
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   };
   (core::int) → asy::Future<core::String> y6 = (core::int v) → asy::Future<Never> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<Never> :async_completer = new asy::_AsyncAwaitCompleter::•<Never>();
+    final asy::_Future<Never> :async_future = new asy::_Future::•<Never>();
+    core::bool* :is_sync = false;
     FutureOr<Never>? :return_value;
     dynamic :async_stack_trace;
     (dynamic) → dynamic :async_op_then;
@@ -203,21 +214,23 @@
           :return_value = self::throwing();
           break #L6;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   };
 }
 static method errors() → void /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic> :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>? :return_value;
   dynamic :async_stack_trace;
   (dynamic) → dynamic :async_op_then;
@@ -269,7 +282,8 @@
                             ^" in null;
         };
         (core::int) → asy::Future<core::String> y2 = (core::int v) → asy::Future<core::String> /* originally async */ {
-          final asy::_AsyncAwaitCompleter<core::String> :async_completer = new asy::_AsyncAwaitCompleter::•<core::String>();
+          final asy::_Future<core::String> :async_future = new asy::_Future::•<core::String>();
+          core::bool* :is_sync = false;
           FutureOr<core::String>? :return_value;
           dynamic :async_stack_trace;
           (dynamic) → dynamic :async_op_then;
@@ -290,20 +304,22 @@
                                     ^" in null;
                 break #L8;
               }
-              asy::_completeOnAsyncReturn(:async_completer, :return_value);
+              asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
               return;
             }
             on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-              :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+              asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
             }
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-          :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-          return :async_completer.{asy::Completer::future};
+          :async_op.call();
+          :is_sync = true;
+          return :async_future;
         };
         (core::int) → asy::Future<core::String> y3 = (core::int v) → asy::Future<core::String> /* originally async */ {
-          final asy::_AsyncAwaitCompleter<core::String> :async_completer = new asy::_AsyncAwaitCompleter::•<core::String>();
+          final asy::_Future<core::String> :async_future = new asy::_Future::•<core::String>();
+          core::bool* :is_sync = false;
           FutureOr<core::String>? :return_value;
           dynamic :async_stack_trace;
           (dynamic) → dynamic :async_op_then;
@@ -325,20 +341,22 @@
                                     ^" in null;
                 break #L9;
               }
-              asy::_completeOnAsyncReturn(:async_completer, :return_value);
+              asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
               return;
             }
             on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-              :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+              asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
             }
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-          :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-          return :async_completer.{asy::Completer::future};
+          :async_op.call();
+          :is_sync = true;
+          return :async_future;
         };
         (core::int) → asy::Future<core::String> y5 = (core::int v) → asy::Future<core::String> /* originally async */ {
-          final asy::_AsyncAwaitCompleter<core::String> :async_completer = new asy::_AsyncAwaitCompleter::•<core::String>();
+          final asy::_Future<core::String> :async_future = new asy::_Future::•<core::String>();
+          core::bool* :is_sync = false;
           FutureOr<core::String>? :return_value;
           dynamic :async_stack_trace;
           (dynamic) → dynamic :async_op_then;
@@ -359,20 +377,22 @@
                                     ^" in null;
                 break #L10;
               }
-              asy::_completeOnAsyncReturn(:async_completer, :return_value);
+              asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
               return;
             }
             on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-              :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+              asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
             }
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-          :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-          return :async_completer.{asy::Completer::future};
+          :async_op.call();
+          :is_sync = true;
+          return :async_future;
         };
         (core::int) → asy::Future<core::String> y6 = (core::int v) → asy::Future<core::String> /* originally async */ {
-          final asy::_AsyncAwaitCompleter<core::String> :async_completer = new asy::_AsyncAwaitCompleter::•<core::String>();
+          final asy::_Future<core::String> :async_future = new asy::_Future::•<core::String>();
+          core::bool* :is_sync = false;
           FutureOr<core::String>? :return_value;
           dynamic :async_stack_trace;
           (dynamic) → dynamic :async_op_then;
@@ -394,28 +414,30 @@
                                     ^" in null;
                 break #L11;
               }
-              asy::_completeOnAsyncReturn(:async_completer, :return_value);
+              asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
               return;
             }
             on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-              :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+              asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
             }
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-          :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-          return :async_completer.{asy::Completer::future};
+          :async_op.call();
+          :is_sync = true;
+          return :async_future;
         };
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
diff --git a/pkg/front_end/testcases/nnbd/issue41156.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue41156.dart.weak.transformed.expect
index 73ca4fa..f657157 100644
--- a/pkg/front_end/testcases/nnbd/issue41156.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41156.dart.weak.transformed.expect
@@ -57,7 +57,8 @@
     return let final Never #t3 = self::throwing() in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
   };
   (core::int) → asy::Future<core::String> y1 = (core::int v) → asy::Future<Never> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<Never> :async_completer = new asy::_AsyncAwaitCompleter::•<Never>();
+    final asy::_Future<Never> :async_future = new asy::_Future::•<Never>();
+    core::bool* :is_sync = false;
     FutureOr<Never>? :return_value;
     dynamic :async_stack_trace;
     (dynamic) → dynamic :async_op_then;
@@ -71,20 +72,22 @@
           :return_value = throw v;
           break #L1;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   };
   (core::int) → asy::Future<core::String> y2 = (core::int v) → asy::Future<Never> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<Never> :async_completer = new asy::_AsyncAwaitCompleter::•<Never>();
+    final asy::_Future<Never> :async_future = new asy::_Future::•<Never>();
+    core::bool* :is_sync = false;
     FutureOr<Never>? :return_value;
     dynamic :async_stack_trace;
     (dynamic) → dynamic :async_op_then;
@@ -97,20 +100,22 @@
         {
           throw v;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   };
   (core::int) → asy::Future<core::String> y3 = (core::int v) → asy::Future<Never> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<Never> :async_completer = new asy::_AsyncAwaitCompleter::•<Never>();
+    final asy::_Future<Never> :async_future = new asy::_Future::•<Never>();
+    core::bool* :is_sync = false;
     FutureOr<Never>? :return_value;
     dynamic :async_stack_trace;
     (dynamic) → dynamic :async_op_then;
@@ -124,20 +129,22 @@
           :return_value = throw v;
           break #L3;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   };
   (core::int) → asy::Future<core::String> y4 = (core::int v) → asy::Future<Never> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<Never> :async_completer = new asy::_AsyncAwaitCompleter::•<Never>();
+    final asy::_Future<Never> :async_future = new asy::_Future::•<Never>();
+    core::bool* :is_sync = false;
     FutureOr<Never>? :return_value;
     dynamic :async_stack_trace;
     (dynamic) → dynamic :async_op_then;
@@ -151,20 +158,22 @@
           :return_value = let final Never #t4 = self::throwing() in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
           break #L4;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   };
   (core::int) → asy::Future<core::String> y5 = (core::int v) → asy::Future<Never> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<Never> :async_completer = new asy::_AsyncAwaitCompleter::•<Never>();
+    final asy::_Future<Never> :async_future = new asy::_Future::•<Never>();
+    core::bool* :is_sync = false;
     FutureOr<Never>? :return_value;
     dynamic :async_stack_trace;
     (dynamic) → dynamic :async_op_then;
@@ -177,20 +186,22 @@
         {
           let final Never #t5 = self::throwing() in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   };
   (core::int) → asy::Future<core::String> y6 = (core::int v) → asy::Future<Never> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<Never> :async_completer = new asy::_AsyncAwaitCompleter::•<Never>();
+    final asy::_Future<Never> :async_future = new asy::_Future::•<Never>();
+    core::bool* :is_sync = false;
     FutureOr<Never>? :return_value;
     dynamic :async_stack_trace;
     (dynamic) → dynamic :async_op_then;
@@ -204,21 +215,23 @@
           :return_value = let final Never #t6 = self::throwing() in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
           break #L6;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   };
 }
 static method errors() → void /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic> :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>? :return_value;
   dynamic :async_stack_trace;
   (dynamic) → dynamic :async_op_then;
@@ -270,7 +283,8 @@
                             ^" in null;
         };
         (core::int) → asy::Future<core::String> y2 = (core::int v) → asy::Future<core::String> /* originally async */ {
-          final asy::_AsyncAwaitCompleter<core::String> :async_completer = new asy::_AsyncAwaitCompleter::•<core::String>();
+          final asy::_Future<core::String> :async_future = new asy::_Future::•<core::String>();
+          core::bool* :is_sync = false;
           FutureOr<core::String>? :return_value;
           dynamic :async_stack_trace;
           (dynamic) → dynamic :async_op_then;
@@ -291,20 +305,22 @@
                                     ^" in null;
                 break #L8;
               }
-              asy::_completeOnAsyncReturn(:async_completer, :return_value);
+              asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
               return;
             }
             on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-              :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+              asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
             }
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-          :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-          return :async_completer.{asy::Completer::future};
+          :async_op.call();
+          :is_sync = true;
+          return :async_future;
         };
         (core::int) → asy::Future<core::String> y3 = (core::int v) → asy::Future<core::String> /* originally async */ {
-          final asy::_AsyncAwaitCompleter<core::String> :async_completer = new asy::_AsyncAwaitCompleter::•<core::String>();
+          final asy::_Future<core::String> :async_future = new asy::_Future::•<core::String>();
+          core::bool* :is_sync = false;
           FutureOr<core::String>? :return_value;
           dynamic :async_stack_trace;
           (dynamic) → dynamic :async_op_then;
@@ -326,20 +342,22 @@
                                     ^" in null;
                 break #L9;
               }
-              asy::_completeOnAsyncReturn(:async_completer, :return_value);
+              asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
               return;
             }
             on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-              :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+              asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
             }
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-          :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-          return :async_completer.{asy::Completer::future};
+          :async_op.call();
+          :is_sync = true;
+          return :async_future;
         };
         (core::int) → asy::Future<core::String> y5 = (core::int v) → asy::Future<core::String> /* originally async */ {
-          final asy::_AsyncAwaitCompleter<core::String> :async_completer = new asy::_AsyncAwaitCompleter::•<core::String>();
+          final asy::_Future<core::String> :async_future = new asy::_Future::•<core::String>();
+          core::bool* :is_sync = false;
           FutureOr<core::String>? :return_value;
           dynamic :async_stack_trace;
           (dynamic) → dynamic :async_op_then;
@@ -360,20 +378,22 @@
                                     ^" in null;
                 break #L10;
               }
-              asy::_completeOnAsyncReturn(:async_completer, :return_value);
+              asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
               return;
             }
             on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-              :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+              asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
             }
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-          :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-          return :async_completer.{asy::Completer::future};
+          :async_op.call();
+          :is_sync = true;
+          return :async_future;
         };
         (core::int) → asy::Future<core::String> y6 = (core::int v) → asy::Future<core::String> /* originally async */ {
-          final asy::_AsyncAwaitCompleter<core::String> :async_completer = new asy::_AsyncAwaitCompleter::•<core::String>();
+          final asy::_Future<core::String> :async_future = new asy::_Future::•<core::String>();
+          core::bool* :is_sync = false;
           FutureOr<core::String>? :return_value;
           dynamic :async_stack_trace;
           (dynamic) → dynamic :async_op_then;
@@ -395,28 +415,30 @@
                                     ^" in null;
                 break #L11;
               }
-              asy::_completeOnAsyncReturn(:async_completer, :return_value);
+              asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
               return;
             }
             on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-              :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+              asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
             }
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-          :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-          return :async_completer.{asy::Completer::future};
+          :async_op.call();
+          :is_sync = true;
+          return :async_future;
         };
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
diff --git a/pkg/front_end/testcases/nnbd/issue41386b.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue41386b.dart.strong.expect
index 189246c..5e52bce 100644
--- a/pkg/front_end/testcases/nnbd/issue41386b.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue41386b.dart.strong.expect
@@ -7,6 +7,6 @@
   map.{core::Map::[]}(0).foo;
   core::Iterable<core::String> elements = <core::String>[];
   core::List<dynamic> list = core::List::from<dynamic>(elements);
-  core::List::from<dynamic>(elements).{core::Iterable::forEach}((dynamic element) → dynamic => element.foo);
+  core::List::from<dynamic>(elements).{core::Iterable::forEach}((dynamic element) → void => element.foo);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue41386b.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue41386b.dart.strong.transformed.expect
index 189246c..5e52bce 100644
--- a/pkg/front_end/testcases/nnbd/issue41386b.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41386b.dart.strong.transformed.expect
@@ -7,6 +7,6 @@
   map.{core::Map::[]}(0).foo;
   core::Iterable<core::String> elements = <core::String>[];
   core::List<dynamic> list = core::List::from<dynamic>(elements);
-  core::List::from<dynamic>(elements).{core::Iterable::forEach}((dynamic element) → dynamic => element.foo);
+  core::List::from<dynamic>(elements).{core::Iterable::forEach}((dynamic element) → void => element.foo);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue41386b.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue41386b.dart.weak.expect
index 189246c..5e52bce 100644
--- a/pkg/front_end/testcases/nnbd/issue41386b.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue41386b.dart.weak.expect
@@ -7,6 +7,6 @@
   map.{core::Map::[]}(0).foo;
   core::Iterable<core::String> elements = <core::String>[];
   core::List<dynamic> list = core::List::from<dynamic>(elements);
-  core::List::from<dynamic>(elements).{core::Iterable::forEach}((dynamic element) → dynamic => element.foo);
+  core::List::from<dynamic>(elements).{core::Iterable::forEach}((dynamic element) → void => element.foo);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue41386b.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue41386b.dart.weak.transformed.expect
index 189246c..5e52bce 100644
--- a/pkg/front_end/testcases/nnbd/issue41386b.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41386b.dart.weak.transformed.expect
@@ -7,6 +7,6 @@
   map.{core::Map::[]}(0).foo;
   core::Iterable<core::String> elements = <core::String>[];
   core::List<dynamic> list = core::List::from<dynamic>(elements);
-  core::List::from<dynamic>(elements).{core::Iterable::forEach}((dynamic element) → dynamic => element.foo);
+  core::List::from<dynamic>(elements).{core::Iterable::forEach}((dynamic element) → void => element.foo);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue41415.dart.outline.expect b/pkg/front_end/testcases/nnbd/issue41415.dart.outline.expect
index 0213dd7..f683084 100644
--- a/pkg/front_end/testcases/nnbd/issue41415.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/issue41415.dart.outline.expect
@@ -1,8 +1,7 @@
 library /*isNonNullableByDefault*/;
 import self as self;
-import "dart:core" as core;
 
 static method main() → dynamic
   ;
-static method test<X extends core::Null? = core::Null?, Y extends Never? = Never?, Z extends Never = Never>() → dynamic
+static method test<X extends Null = Null, Y extends Never? = Never?, Z extends Never = Never>() → dynamic
   ;
diff --git a/pkg/front_end/testcases/nnbd/issue41415.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue41415.dart.strong.expect
index 4419497..8a8d3f2 100644
--- a/pkg/front_end/testcases/nnbd/issue41415.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue41415.dart.strong.expect
@@ -3,8 +3,8 @@
 import "dart:core" as core;
 
 static method main() → dynamic {}
-static method test<X extends core::Null? = core::Null?, Y extends Never? = Never?, Z extends Never = Never>() → dynamic {
-  (core::Null?) → core::int f = (core::Object? x) → core::int => 1;
+static method test<X extends Null = Null, Y extends Never? = Never?, Z extends Never = Never>() → dynamic {
+  (Null) → core::int f = (core::Object? x) → core::int => 1;
   (Never) → core::int g = (core::Object? x) → core::int => 1;
   (Never?) → core::int h = (core::Object? x) → core::int => 1;
   (core::String) → core::int i = (core::String x) → core::int => 1;
diff --git a/pkg/front_end/testcases/nnbd/issue41415.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue41415.dart.strong.transformed.expect
index 4419497..8a8d3f2 100644
--- a/pkg/front_end/testcases/nnbd/issue41415.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41415.dart.strong.transformed.expect
@@ -3,8 +3,8 @@
 import "dart:core" as core;
 
 static method main() → dynamic {}
-static method test<X extends core::Null? = core::Null?, Y extends Never? = Never?, Z extends Never = Never>() → dynamic {
-  (core::Null?) → core::int f = (core::Object? x) → core::int => 1;
+static method test<X extends Null = Null, Y extends Never? = Never?, Z extends Never = Never>() → dynamic {
+  (Null) → core::int f = (core::Object? x) → core::int => 1;
   (Never) → core::int g = (core::Object? x) → core::int => 1;
   (Never?) → core::int h = (core::Object? x) → core::int => 1;
   (core::String) → core::int i = (core::String x) → core::int => 1;
diff --git a/pkg/front_end/testcases/nnbd/issue41415.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue41415.dart.weak.expect
index 4419497..8a8d3f2 100644
--- a/pkg/front_end/testcases/nnbd/issue41415.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue41415.dart.weak.expect
@@ -3,8 +3,8 @@
 import "dart:core" as core;
 
 static method main() → dynamic {}
-static method test<X extends core::Null? = core::Null?, Y extends Never? = Never?, Z extends Never = Never>() → dynamic {
-  (core::Null?) → core::int f = (core::Object? x) → core::int => 1;
+static method test<X extends Null = Null, Y extends Never? = Never?, Z extends Never = Never>() → dynamic {
+  (Null) → core::int f = (core::Object? x) → core::int => 1;
   (Never) → core::int g = (core::Object? x) → core::int => 1;
   (Never?) → core::int h = (core::Object? x) → core::int => 1;
   (core::String) → core::int i = (core::String x) → core::int => 1;
diff --git a/pkg/front_end/testcases/nnbd/issue41415.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue41415.dart.weak.transformed.expect
index 4419497..8a8d3f2 100644
--- a/pkg/front_end/testcases/nnbd/issue41415.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41415.dart.weak.transformed.expect
@@ -3,8 +3,8 @@
 import "dart:core" as core;
 
 static method main() → dynamic {}
-static method test<X extends core::Null? = core::Null?, Y extends Never? = Never?, Z extends Never = Never>() → dynamic {
-  (core::Null?) → core::int f = (core::Object? x) → core::int => 1;
+static method test<X extends Null = Null, Y extends Never? = Never?, Z extends Never = Never>() → dynamic {
+  (Null) → core::int f = (core::Object? x) → core::int => 1;
   (Never) → core::int g = (core::Object? x) → core::int => 1;
   (Never?) → core::int h = (core::Object? x) → core::int => 1;
   (core::String) → core::int i = (core::String x) → core::int => 1;
diff --git a/pkg/front_end/testcases/nnbd/issue41437a.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue41437a.dart.strong.transformed.expect
index e54c5af..049ebe6 100644
--- a/pkg/front_end/testcases/nnbd/issue41437a.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41437a.dart.strong.transformed.expect
@@ -34,7 +34,8 @@
 static method getNull() → dynamic
   return null;
 static method getFutureNull() → asy::Future<dynamic> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic> :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>? :return_value;
   dynamic :async_stack_trace;
   (dynamic) → dynamic :async_op_then;
@@ -48,20 +49,22 @@
         :return_value = null;
         break #L1;
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method getFutureBool() → asy::Future<core::bool> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::bool> :async_completer = new asy::_AsyncAwaitCompleter::•<core::bool>();
+  final asy::_Future<core::bool> :async_future = new asy::_Future::•<core::bool>();
+  core::bool* :is_sync = false;
   FutureOr<core::bool>? :return_value;
   dynamic :async_stack_trace;
   (dynamic) → dynamic :async_op_then;
@@ -75,20 +78,22 @@
         :return_value = true;
         break #L2;
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method test1() → asy::Future<core::bool> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::bool> :async_completer = new asy::_AsyncAwaitCompleter::•<core::bool>();
+  final asy::_Future<core::bool> :async_future = new asy::_Future::•<core::bool>();
+  core::bool* :is_sync = false;
   FutureOr<core::bool>? :return_value;
   dynamic :async_stack_trace;
   (dynamic) → dynamic :async_op_then;
@@ -104,24 +109,26 @@
         :return_value = :result as{TypeError,ForDynamic,ForNonNullableByDefault} FutureOr<core::bool>;
         break #L3;
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method test2() → asy::Future<core::bool>
   return self::getNull() as{TypeError,ForDynamic,ForNonNullableByDefault} asy::Future<core::bool>;
 static method test3() → core::bool
   return self::getNull() as{TypeError,ForDynamic,ForNonNullableByDefault} core::bool;
 static method test4() → asy::Future<core::bool> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::bool> :async_completer = new asy::_AsyncAwaitCompleter::•<core::bool>();
+  final asy::_Future<core::bool> :async_future = new asy::_Future::•<core::bool>();
+  core::bool* :is_sync = false;
   FutureOr<core::bool>? :return_value;
   dynamic :async_stack_trace;
   (dynamic) → dynamic :async_op_then;
@@ -137,17 +144,18 @@
         :return_value = :result as{TypeError,ForDynamic,ForNonNullableByDefault} FutureOr<core::bool>;
         break #L4;
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method test5() → asy::Future<core::bool>
   return let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/issue41437a.dart:18:25: Error: A value of type 'Future<dynamic>' can't be returned from a function with return type 'Future<bool>'.
@@ -157,7 +165,8 @@
 static method test6() → asy::Future<core::bool>
   return self::getFutureBool();
 static method test7() → asy::Future<core::bool> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::bool> :async_completer = new asy::_AsyncAwaitCompleter::•<core::bool>();
+  final asy::_Future<core::bool> :async_future = new asy::_Future::•<core::bool>();
+  core::bool* :is_sync = false;
   FutureOr<core::bool>? :return_value;
   dynamic :async_stack_trace;
   (dynamic) → dynamic :async_op_then;
@@ -171,20 +180,22 @@
         :return_value = self::getFutureBool();
         break #L5;
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method test() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic> :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>? :return_value;
   dynamic :async_stack_trace;
   (dynamic) → dynamic :async_op_then;
@@ -196,7 +207,8 @@
       #L6:
       {
         function test1() → asy::Future<core::bool> /* originally async */ {
-          final asy::_AsyncAwaitCompleter<core::bool> :async_completer = new asy::_AsyncAwaitCompleter::•<core::bool>();
+          final asy::_Future<core::bool> :async_future = new asy::_Future::•<core::bool>();
+          core::bool* :is_sync = false;
           FutureOr<core::bool>? :return_value;
           dynamic :async_stack_trace;
           (dynamic) → dynamic :async_op_then;
@@ -212,24 +224,26 @@
                 :return_value = :result as{TypeError,ForDynamic,ForNonNullableByDefault} FutureOr<core::bool>;
                 break #L7;
               }
-              asy::_completeOnAsyncReturn(:async_completer, :return_value);
+              asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
               return;
             }
             on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-              :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+              asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
             }
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-          :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-          return :async_completer.{asy::Completer::future};
+          :async_op.call();
+          :is_sync = true;
+          return :async_future;
         }
         function test2() → asy::Future<core::bool>
           return self::getNull() as{TypeError,ForDynamic,ForNonNullableByDefault} asy::Future<core::bool>;
         function test3() → core::bool
           return self::getNull() as{TypeError,ForDynamic,ForNonNullableByDefault} core::bool;
         function test4() → asy::Future<core::bool> /* originally async */ {
-          final asy::_AsyncAwaitCompleter<core::bool> :async_completer = new asy::_AsyncAwaitCompleter::•<core::bool>();
+          final asy::_Future<core::bool> :async_future = new asy::_Future::•<core::bool>();
+          core::bool* :is_sync = false;
           FutureOr<core::bool>? :return_value;
           dynamic :async_stack_trace;
           (dynamic) → dynamic :async_op_then;
@@ -245,17 +259,18 @@
                 :return_value = :result as{TypeError,ForDynamic,ForNonNullableByDefault} FutureOr<core::bool>;
                 break #L8;
               }
-              asy::_completeOnAsyncReturn(:async_completer, :return_value);
+              asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
               return;
             }
             on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-              :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+              asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
             }
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-          :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-          return :async_completer.{asy::Completer::future};
+          :async_op.call();
+          :is_sync = true;
+          return :async_future;
         }
         function test5() → asy::Future<core::bool>
           return let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/issue41437a.dart:27:27: Error: A value of type 'Future<dynamic>' can't be returned from a function with return type 'Future<bool>'.
@@ -265,7 +280,8 @@
         function test6() → asy::Future<core::bool>
           return self::getFutureBool();
         function test7() → asy::Future<core::bool> /* originally async */ {
-          final asy::_AsyncAwaitCompleter<core::bool> :async_completer = new asy::_AsyncAwaitCompleter::•<core::bool>();
+          final asy::_Future<core::bool> :async_future = new asy::_Future::•<core::bool>();
+          core::bool* :is_sync = false;
           FutureOr<core::bool>? :return_value;
           dynamic :async_stack_trace;
           (dynamic) → dynamic :async_op_then;
@@ -279,23 +295,25 @@
                 :return_value = self::getFutureBool();
                 break #L9;
               }
-              asy::_completeOnAsyncReturn(:async_completer, :return_value);
+              asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
               return;
             }
             on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-              :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+              asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
             }
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-          :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-          return :async_completer.{asy::Completer::future};
+          :async_op.call();
+          :is_sync = true;
+          return :async_future;
         }
         asy::Future<core::bool> var1 = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/issue41437a.dart:31:52: Error: A value of type 'Future<dynamic>' can't be assigned to a variable of type 'Future<bool>'.
  - 'Future' is from 'dart:async'.
   Future<bool> var1 = (() async => await getNull())(); // error
                                                    ^" in (() → asy::Future<dynamic> /* originally async */ {
-          final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+          final asy::_Future<dynamic> :async_future = new asy::_Future::•<dynamic>();
+          core::bool* :is_sync = false;
           FutureOr<dynamic>? :return_value;
           dynamic :async_stack_trace;
           (dynamic) → dynamic :async_op_then;
@@ -311,17 +329,18 @@
                 :return_value = :result;
                 break #L10;
               }
-              asy::_completeOnAsyncReturn(:async_completer, :return_value);
+              asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
               return;
             }
             on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-              :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+              asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
             }
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-          :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-          return :async_completer.{asy::Completer::future};
+          :async_op.call();
+          :is_sync = true;
+          return :async_future;
         }).call() as{TypeError,ForNonNullableByDefault} asy::Future<core::bool>;
         asy::Future<core::bool> var2 = (() → dynamic => self::getNull()).call() as{TypeError,ForDynamic,ForNonNullableByDefault} asy::Future<core::bool>;
         core::bool var3 = (() → dynamic => self::getNull()).call() as{TypeError,ForDynamic,ForNonNullableByDefault} core::bool;
@@ -329,7 +348,8 @@
  - 'Future' is from 'dart:async'.
   Future<bool> var4 = (() async => await getFutureNull())(); // error
                                                          ^" in (() → asy::Future<dynamic> /* originally async */ {
-          final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+          final asy::_Future<dynamic> :async_future = new asy::_Future::•<dynamic>();
+          core::bool* :is_sync = false;
           FutureOr<dynamic>? :return_value;
           dynamic :async_stack_trace;
           (dynamic) → dynamic :async_op_then;
@@ -345,17 +365,18 @@
                 :return_value = :result;
                 break #L11;
               }
-              asy::_completeOnAsyncReturn(:async_completer, :return_value);
+              asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
               return;
             }
             on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-              :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+              asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
             }
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-          :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-          return :async_completer.{asy::Completer::future};
+          :async_op.call();
+          :is_sync = true;
+          return :async_future;
         }).call() as{TypeError,ForNonNullableByDefault} asy::Future<core::bool>;
         asy::Future<core::bool> var5 = let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/issue41437a.dart:35:46: Error: A value of type 'Future<dynamic>' can't be assigned to a variable of type 'Future<bool>'.
  - 'Future' is from 'dart:async'.
@@ -363,7 +384,8 @@
                                              ^" in (() → asy::Future<dynamic> => self::getFutureNull()).call() as{TypeError,ForNonNullableByDefault} asy::Future<core::bool>;
         asy::Future<core::bool> var6 = (() → asy::Future<core::bool> => self::getFutureBool()).call();
         asy::Future<core::bool> var7 = (() → asy::Future<core::bool> /* originally async */ {
-          final asy::_AsyncAwaitCompleter<core::bool> :async_completer = new asy::_AsyncAwaitCompleter::•<core::bool>();
+          final asy::_Future<core::bool> :async_future = new asy::_Future::•<core::bool>();
+          core::bool* :is_sync = false;
           FutureOr<core::bool>? :return_value;
           dynamic :async_stack_trace;
           (dynamic) → dynamic :async_op_then;
@@ -377,29 +399,31 @@
                 :return_value = self::getFutureBool();
                 break #L12;
               }
-              asy::_completeOnAsyncReturn(:async_completer, :return_value);
+              asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
               return;
             }
             on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-              :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+              asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
             }
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-          :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-          return :async_completer.{asy::Completer::future};
+          :async_op.call();
+          :is_sync = true;
+          return :async_future;
         }).call();
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue41437a.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue41437a.dart.weak.transformed.expect
index e54c5af..049ebe6 100644
--- a/pkg/front_end/testcases/nnbd/issue41437a.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41437a.dart.weak.transformed.expect
@@ -34,7 +34,8 @@
 static method getNull() → dynamic
   return null;
 static method getFutureNull() → asy::Future<dynamic> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic> :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>? :return_value;
   dynamic :async_stack_trace;
   (dynamic) → dynamic :async_op_then;
@@ -48,20 +49,22 @@
         :return_value = null;
         break #L1;
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method getFutureBool() → asy::Future<core::bool> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::bool> :async_completer = new asy::_AsyncAwaitCompleter::•<core::bool>();
+  final asy::_Future<core::bool> :async_future = new asy::_Future::•<core::bool>();
+  core::bool* :is_sync = false;
   FutureOr<core::bool>? :return_value;
   dynamic :async_stack_trace;
   (dynamic) → dynamic :async_op_then;
@@ -75,20 +78,22 @@
         :return_value = true;
         break #L2;
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method test1() → asy::Future<core::bool> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::bool> :async_completer = new asy::_AsyncAwaitCompleter::•<core::bool>();
+  final asy::_Future<core::bool> :async_future = new asy::_Future::•<core::bool>();
+  core::bool* :is_sync = false;
   FutureOr<core::bool>? :return_value;
   dynamic :async_stack_trace;
   (dynamic) → dynamic :async_op_then;
@@ -104,24 +109,26 @@
         :return_value = :result as{TypeError,ForDynamic,ForNonNullableByDefault} FutureOr<core::bool>;
         break #L3;
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method test2() → asy::Future<core::bool>
   return self::getNull() as{TypeError,ForDynamic,ForNonNullableByDefault} asy::Future<core::bool>;
 static method test3() → core::bool
   return self::getNull() as{TypeError,ForDynamic,ForNonNullableByDefault} core::bool;
 static method test4() → asy::Future<core::bool> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::bool> :async_completer = new asy::_AsyncAwaitCompleter::•<core::bool>();
+  final asy::_Future<core::bool> :async_future = new asy::_Future::•<core::bool>();
+  core::bool* :is_sync = false;
   FutureOr<core::bool>? :return_value;
   dynamic :async_stack_trace;
   (dynamic) → dynamic :async_op_then;
@@ -137,17 +144,18 @@
         :return_value = :result as{TypeError,ForDynamic,ForNonNullableByDefault} FutureOr<core::bool>;
         break #L4;
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method test5() → asy::Future<core::bool>
   return let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/issue41437a.dart:18:25: Error: A value of type 'Future<dynamic>' can't be returned from a function with return type 'Future<bool>'.
@@ -157,7 +165,8 @@
 static method test6() → asy::Future<core::bool>
   return self::getFutureBool();
 static method test7() → asy::Future<core::bool> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::bool> :async_completer = new asy::_AsyncAwaitCompleter::•<core::bool>();
+  final asy::_Future<core::bool> :async_future = new asy::_Future::•<core::bool>();
+  core::bool* :is_sync = false;
   FutureOr<core::bool>? :return_value;
   dynamic :async_stack_trace;
   (dynamic) → dynamic :async_op_then;
@@ -171,20 +180,22 @@
         :return_value = self::getFutureBool();
         break #L5;
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method test() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic> :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>? :return_value;
   dynamic :async_stack_trace;
   (dynamic) → dynamic :async_op_then;
@@ -196,7 +207,8 @@
       #L6:
       {
         function test1() → asy::Future<core::bool> /* originally async */ {
-          final asy::_AsyncAwaitCompleter<core::bool> :async_completer = new asy::_AsyncAwaitCompleter::•<core::bool>();
+          final asy::_Future<core::bool> :async_future = new asy::_Future::•<core::bool>();
+          core::bool* :is_sync = false;
           FutureOr<core::bool>? :return_value;
           dynamic :async_stack_trace;
           (dynamic) → dynamic :async_op_then;
@@ -212,24 +224,26 @@
                 :return_value = :result as{TypeError,ForDynamic,ForNonNullableByDefault} FutureOr<core::bool>;
                 break #L7;
               }
-              asy::_completeOnAsyncReturn(:async_completer, :return_value);
+              asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
               return;
             }
             on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-              :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+              asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
             }
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-          :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-          return :async_completer.{asy::Completer::future};
+          :async_op.call();
+          :is_sync = true;
+          return :async_future;
         }
         function test2() → asy::Future<core::bool>
           return self::getNull() as{TypeError,ForDynamic,ForNonNullableByDefault} asy::Future<core::bool>;
         function test3() → core::bool
           return self::getNull() as{TypeError,ForDynamic,ForNonNullableByDefault} core::bool;
         function test4() → asy::Future<core::bool> /* originally async */ {
-          final asy::_AsyncAwaitCompleter<core::bool> :async_completer = new asy::_AsyncAwaitCompleter::•<core::bool>();
+          final asy::_Future<core::bool> :async_future = new asy::_Future::•<core::bool>();
+          core::bool* :is_sync = false;
           FutureOr<core::bool>? :return_value;
           dynamic :async_stack_trace;
           (dynamic) → dynamic :async_op_then;
@@ -245,17 +259,18 @@
                 :return_value = :result as{TypeError,ForDynamic,ForNonNullableByDefault} FutureOr<core::bool>;
                 break #L8;
               }
-              asy::_completeOnAsyncReturn(:async_completer, :return_value);
+              asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
               return;
             }
             on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-              :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+              asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
             }
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-          :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-          return :async_completer.{asy::Completer::future};
+          :async_op.call();
+          :is_sync = true;
+          return :async_future;
         }
         function test5() → asy::Future<core::bool>
           return let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/issue41437a.dart:27:27: Error: A value of type 'Future<dynamic>' can't be returned from a function with return type 'Future<bool>'.
@@ -265,7 +280,8 @@
         function test6() → asy::Future<core::bool>
           return self::getFutureBool();
         function test7() → asy::Future<core::bool> /* originally async */ {
-          final asy::_AsyncAwaitCompleter<core::bool> :async_completer = new asy::_AsyncAwaitCompleter::•<core::bool>();
+          final asy::_Future<core::bool> :async_future = new asy::_Future::•<core::bool>();
+          core::bool* :is_sync = false;
           FutureOr<core::bool>? :return_value;
           dynamic :async_stack_trace;
           (dynamic) → dynamic :async_op_then;
@@ -279,23 +295,25 @@
                 :return_value = self::getFutureBool();
                 break #L9;
               }
-              asy::_completeOnAsyncReturn(:async_completer, :return_value);
+              asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
               return;
             }
             on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-              :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+              asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
             }
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-          :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-          return :async_completer.{asy::Completer::future};
+          :async_op.call();
+          :is_sync = true;
+          return :async_future;
         }
         asy::Future<core::bool> var1 = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/issue41437a.dart:31:52: Error: A value of type 'Future<dynamic>' can't be assigned to a variable of type 'Future<bool>'.
  - 'Future' is from 'dart:async'.
   Future<bool> var1 = (() async => await getNull())(); // error
                                                    ^" in (() → asy::Future<dynamic> /* originally async */ {
-          final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+          final asy::_Future<dynamic> :async_future = new asy::_Future::•<dynamic>();
+          core::bool* :is_sync = false;
           FutureOr<dynamic>? :return_value;
           dynamic :async_stack_trace;
           (dynamic) → dynamic :async_op_then;
@@ -311,17 +329,18 @@
                 :return_value = :result;
                 break #L10;
               }
-              asy::_completeOnAsyncReturn(:async_completer, :return_value);
+              asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
               return;
             }
             on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-              :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+              asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
             }
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-          :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-          return :async_completer.{asy::Completer::future};
+          :async_op.call();
+          :is_sync = true;
+          return :async_future;
         }).call() as{TypeError,ForNonNullableByDefault} asy::Future<core::bool>;
         asy::Future<core::bool> var2 = (() → dynamic => self::getNull()).call() as{TypeError,ForDynamic,ForNonNullableByDefault} asy::Future<core::bool>;
         core::bool var3 = (() → dynamic => self::getNull()).call() as{TypeError,ForDynamic,ForNonNullableByDefault} core::bool;
@@ -329,7 +348,8 @@
  - 'Future' is from 'dart:async'.
   Future<bool> var4 = (() async => await getFutureNull())(); // error
                                                          ^" in (() → asy::Future<dynamic> /* originally async */ {
-          final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+          final asy::_Future<dynamic> :async_future = new asy::_Future::•<dynamic>();
+          core::bool* :is_sync = false;
           FutureOr<dynamic>? :return_value;
           dynamic :async_stack_trace;
           (dynamic) → dynamic :async_op_then;
@@ -345,17 +365,18 @@
                 :return_value = :result;
                 break #L11;
               }
-              asy::_completeOnAsyncReturn(:async_completer, :return_value);
+              asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
               return;
             }
             on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-              :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+              asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
             }
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-          :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-          return :async_completer.{asy::Completer::future};
+          :async_op.call();
+          :is_sync = true;
+          return :async_future;
         }).call() as{TypeError,ForNonNullableByDefault} asy::Future<core::bool>;
         asy::Future<core::bool> var5 = let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/issue41437a.dart:35:46: Error: A value of type 'Future<dynamic>' can't be assigned to a variable of type 'Future<bool>'.
  - 'Future' is from 'dart:async'.
@@ -363,7 +384,8 @@
                                              ^" in (() → asy::Future<dynamic> => self::getFutureNull()).call() as{TypeError,ForNonNullableByDefault} asy::Future<core::bool>;
         asy::Future<core::bool> var6 = (() → asy::Future<core::bool> => self::getFutureBool()).call();
         asy::Future<core::bool> var7 = (() → asy::Future<core::bool> /* originally async */ {
-          final asy::_AsyncAwaitCompleter<core::bool> :async_completer = new asy::_AsyncAwaitCompleter::•<core::bool>();
+          final asy::_Future<core::bool> :async_future = new asy::_Future::•<core::bool>();
+          core::bool* :is_sync = false;
           FutureOr<core::bool>? :return_value;
           dynamic :async_stack_trace;
           (dynamic) → dynamic :async_op_then;
@@ -377,29 +399,31 @@
                 :return_value = self::getFutureBool();
                 break #L12;
               }
-              asy::_completeOnAsyncReturn(:async_completer, :return_value);
+              asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
               return;
             }
             on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-              :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+              asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
             }
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-          :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-          return :async_completer.{asy::Completer::future};
+          :async_op.call();
+          :is_sync = true;
+          return :async_future;
         }).call();
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue41437b.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue41437b.dart.strong.transformed.expect
index bc6171e..fb81d0d 100644
--- a/pkg/front_end/testcases/nnbd/issue41437b.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41437b.dart.strong.transformed.expect
@@ -44,10 +44,10 @@
 static method getNull() → dynamic
   return null;
 static method getIterableNull() → core::Iterable<dynamic> /* originally sync* */ {
-  function :sync_op_gen() → (core::_SyncIterator<dynamic>?) → core::bool* {
+  function :sync_op_gen() → (core::_SyncIterator<dynamic>?, dynamic, dynamic) → core::bool* {
     core::int :await_jump_var = 0;
     dynamic :await_ctx_var;
-    return (core::_SyncIterator<dynamic>? :iterator) → core::bool* yielding {
+    function :sync_op(core::_SyncIterator<dynamic>? :iterator, dynamic :exception, dynamic :stack_trace) → core::bool* yielding {
       {
         {
           :iterator.{core::_SyncIterator::_current} = null;
@@ -55,15 +55,16 @@
         }
       }
       return false;
-    };
+    }
+    return :sync_op;
   }
   return new core::_SyncIterable::•<dynamic>(:sync_op_gen);
 }
 static method getIterableBool() → core::Iterable<core::bool> /* originally sync* */ {
-  function :sync_op_gen() → (core::_SyncIterator<dynamic>?) → core::bool* {
+  function :sync_op_gen() → (core::_SyncIterator<dynamic>?, dynamic, dynamic) → core::bool* {
     core::int :await_jump_var = 0;
     dynamic :await_ctx_var;
-    return (core::_SyncIterator<dynamic>? :iterator) → core::bool* yielding {
+    function :sync_op(core::_SyncIterator<dynamic>? :iterator, dynamic :exception, dynamic :stack_trace) → core::bool* yielding {
       {
         {
           :iterator.{core::_SyncIterator::_current} = true;
@@ -71,15 +72,16 @@
         }
       }
       return false;
-    };
+    }
+    return :sync_op;
   }
   return new core::_SyncIterable::•<core::bool>(:sync_op_gen);
 }
 static method test1() → core::Iterable<core::bool> /* originally sync* */ {
-  function :sync_op_gen() → (core::_SyncIterator<dynamic>?) → core::bool* {
+  function :sync_op_gen() → (core::_SyncIterator<dynamic>?, dynamic, dynamic) → core::bool* {
     core::int :await_jump_var = 0;
     dynamic :await_ctx_var;
-    return (core::_SyncIterator<dynamic>? :iterator) → core::bool* yielding {
+    function :sync_op(core::_SyncIterator<dynamic>? :iterator, dynamic :exception, dynamic :stack_trace) → core::bool* yielding {
       {
         {
           :iterator.{core::_SyncIterator::_current} = self::getNull() as{TypeError,ForDynamic,ForNonNullableByDefault} core::bool;
@@ -87,7 +89,8 @@
         }
       }
       return false;
-    };
+    }
+    return :sync_op;
   }
   return new core::_SyncIterable::•<core::bool>(:sync_op_gen);
 }
@@ -96,10 +99,10 @@
 static method test3() → core::bool
   return self::getNull() as{TypeError,ForDynamic,ForNonNullableByDefault} core::bool;
 static method test4() → core::Iterable<core::bool> /* originally sync* */ {
-  function :sync_op_gen() → (core::_SyncIterator<dynamic>?) → core::bool* {
+  function :sync_op_gen() → (core::_SyncIterator<dynamic>?, dynamic, dynamic) → core::bool* {
     core::int :await_jump_var = 0;
     dynamic :await_ctx_var;
-    return (core::_SyncIterator<dynamic>? :iterator) → core::bool* yielding {
+    function :sync_op(core::_SyncIterator<dynamic>? :iterator, dynamic :exception, dynamic :stack_trace) → core::bool* yielding {
       {
         {
           :iterator.{core::_SyncIterator::_yieldEachIterable} = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue41437b.dart:21:10: Error: A value of type 'Iterable<dynamic>' can't be assigned to a variable of type 'Iterable<bool>'.
@@ -110,7 +113,8 @@
         }
       }
       return false;
-    };
+    }
+    return :sync_op;
   }
   return new core::_SyncIterable::•<core::bool>(:sync_op_gen);
 }
@@ -122,10 +126,10 @@
 static method test6() → core::Iterable<core::bool>
   return self::getIterableBool();
 static method test7() → core::Iterable<core::bool> /* originally sync* */ {
-  function :sync_op_gen() → (core::_SyncIterator<dynamic>?) → core::bool* {
+  function :sync_op_gen() → (core::_SyncIterator<dynamic>?, dynamic, dynamic) → core::bool* {
     core::int :await_jump_var = 0;
     dynamic :await_ctx_var;
-    return (core::_SyncIterator<dynamic>? :iterator) → core::bool* yielding {
+    function :sync_op(core::_SyncIterator<dynamic>? :iterator, dynamic :exception, dynamic :stack_trace) → core::bool* yielding {
       {
         {
           :iterator.{core::_SyncIterator::_yieldEachIterable} = self::getIterableBool();
@@ -133,12 +137,14 @@
         }
       }
       return false;
-    };
+    }
+    return :sync_op;
   }
   return new core::_SyncIterable::•<core::bool>(:sync_op_gen);
 }
 static method test() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic> :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>? :return_value;
   dynamic :async_stack_trace;
   (dynamic) → dynamic :async_op_then;
@@ -150,10 +156,10 @@
       #L1:
       {
         function test1() → core::Iterable<core::bool> /* originally sync* */ {
-          function :sync_op_gen() → (core::_SyncIterator<dynamic>?) → core::bool* {
+          function :sync_op_gen() → (core::_SyncIterator<dynamic>?, dynamic, dynamic) → core::bool* {
             core::int :await_jump_var = 0;
             dynamic :await_ctx_var;
-            return (core::_SyncIterator<dynamic>? :iterator) → core::bool* yielding {
+            function :sync_op(core::_SyncIterator<dynamic>? :iterator, dynamic :exception, dynamic :stack_trace) → core::bool* yielding {
               {
                 {
                   :iterator.{core::_SyncIterator::_current} = self::getNull() as{TypeError,ForDynamic,ForNonNullableByDefault} core::bool;
@@ -161,7 +167,8 @@
                 }
               }
               return false;
-            };
+            }
+            return :sync_op;
           }
           return new core::_SyncIterable::•<core::bool>(:sync_op_gen);
         }
@@ -170,10 +177,10 @@
         function test3() → core::bool
           return self::getNull() as{TypeError,ForDynamic,ForNonNullableByDefault} core::bool;
         function test4() → core::Iterable<core::bool> /* originally sync* */ {
-          function :sync_op_gen() → (core::_SyncIterator<dynamic>?) → core::bool* {
+          function :sync_op_gen() → (core::_SyncIterator<dynamic>?, dynamic, dynamic) → core::bool* {
             core::int :await_jump_var = 0;
             dynamic :await_ctx_var;
-            return (core::_SyncIterator<dynamic>? :iterator) → core::bool* yielding {
+            function :sync_op(core::_SyncIterator<dynamic>? :iterator, dynamic :exception, dynamic :stack_trace) → core::bool* yielding {
               {
                 {
                   :iterator.{core::_SyncIterator::_yieldEachIterable} = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/issue41437b.dart:38:12: Error: A value of type 'Iterable<dynamic>' can't be assigned to a variable of type 'Iterable<bool>'.
@@ -184,7 +191,8 @@
                 }
               }
               return false;
-            };
+            }
+            return :sync_op;
           }
           return new core::_SyncIterable::•<core::bool>(:sync_op_gen);
         }
@@ -196,10 +204,10 @@
         function test6() → core::Iterable<core::bool>
           return self::getIterableBool();
         function test7() → core::Iterable<core::bool> /* originally sync* */ {
-          function :sync_op_gen() → (core::_SyncIterator<dynamic>?) → core::bool* {
+          function :sync_op_gen() → (core::_SyncIterator<dynamic>?, dynamic, dynamic) → core::bool* {
             core::int :await_jump_var = 0;
             dynamic :await_ctx_var;
-            return (core::_SyncIterator<dynamic>? :iterator) → core::bool* yielding {
+            function :sync_op(core::_SyncIterator<dynamic>? :iterator, dynamic :exception, dynamic :stack_trace) → core::bool* yielding {
               {
                 {
                   :iterator.{core::_SyncIterator::_yieldEachIterable} = self::getIterableBool();
@@ -207,7 +215,8 @@
                 }
               }
               return false;
-            };
+            }
+            return :sync_op;
           }
           return new core::_SyncIterable::•<core::bool>(:sync_op_gen);
         }
@@ -215,10 +224,10 @@
  - 'Iterable' is from 'dart:core'.
   })(); // error
     ^" in (() → core::Iterable<dynamic> /* originally sync* */ {
-          function :sync_op_gen() → (core::_SyncIterator<dynamic>?) → core::bool* {
+          function :sync_op_gen() → (core::_SyncIterator<dynamic>?, dynamic, dynamic) → core::bool* {
             core::int :await_jump_var = 0;
             dynamic :await_ctx_var;
-            return (core::_SyncIterator<dynamic>? :iterator) → core::bool* yielding {
+            function :sync_op(core::_SyncIterator<dynamic>? :iterator, dynamic :exception, dynamic :stack_trace) → core::bool* yielding {
               {
                 {
                   :iterator.{core::_SyncIterator::_current} = self::getNull();
@@ -226,7 +235,8 @@
                 }
               }
               return false;
-            };
+            }
+            return :sync_op;
           }
           return new core::_SyncIterable::•<dynamic>(:sync_op_gen);
         }).call() as{TypeError,ForNonNullableByDefault} core::Iterable<core::bool>;
@@ -236,10 +246,10 @@
  - 'Iterable' is from 'dart:core'.
   })(); // error
     ^" in (() → core::Iterable<dynamic> /* originally sync* */ {
-          function :sync_op_gen() → (core::_SyncIterator<dynamic>?) → core::bool* {
+          function :sync_op_gen() → (core::_SyncIterator<dynamic>?, dynamic, dynamic) → core::bool* {
             core::int :await_jump_var = 0;
             dynamic :await_ctx_var;
-            return (core::_SyncIterator<dynamic>? :iterator) → core::bool* yielding {
+            function :sync_op(core::_SyncIterator<dynamic>? :iterator, dynamic :exception, dynamic :stack_trace) → core::bool* yielding {
               {
                 {
                   :iterator.{core::_SyncIterator::_yieldEachIterable} = self::getIterableNull();
@@ -247,7 +257,8 @@
                 }
               }
               return false;
-            };
+            }
+            return :sync_op;
           }
           return new core::_SyncIterable::•<dynamic>(:sync_op_gen);
         }).call() as{TypeError,ForNonNullableByDefault} core::Iterable<core::bool>;
@@ -257,10 +268,10 @@
                                                  ^" in (() → core::Iterable<dynamic> => self::getIterableNull()).call() as{TypeError,ForNonNullableByDefault} core::Iterable<core::bool>;
         core::Iterable<core::bool> var6 = (() → core::Iterable<core::bool> => self::getIterableBool()).call();
         core::Iterable<core::bool> var7 = (() → core::Iterable<core::bool> /* originally sync* */ {
-          function :sync_op_gen() → (core::_SyncIterator<dynamic>?) → core::bool* {
+          function :sync_op_gen() → (core::_SyncIterator<dynamic>?, dynamic, dynamic) → core::bool* {
             core::int :await_jump_var = 0;
             dynamic :await_ctx_var;
-            return (core::_SyncIterator<dynamic>? :iterator) → core::bool* yielding {
+            function :sync_op(core::_SyncIterator<dynamic>? :iterator, dynamic :exception, dynamic :stack_trace) → core::bool* yielding {
               {
                 {
                   :iterator.{core::_SyncIterator::_yieldEachIterable} = self::getIterableBool();
@@ -268,21 +279,23 @@
                 }
               }
               return false;
-            };
+            }
+            return :sync_op;
           }
           return new core::_SyncIterable::•<core::bool>(:sync_op_gen);
         }).call();
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue41437b.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue41437b.dart.weak.transformed.expect
index bc6171e..fb81d0d 100644
--- a/pkg/front_end/testcases/nnbd/issue41437b.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41437b.dart.weak.transformed.expect
@@ -44,10 +44,10 @@
 static method getNull() → dynamic
   return null;
 static method getIterableNull() → core::Iterable<dynamic> /* originally sync* */ {
-  function :sync_op_gen() → (core::_SyncIterator<dynamic>?) → core::bool* {
+  function :sync_op_gen() → (core::_SyncIterator<dynamic>?, dynamic, dynamic) → core::bool* {
     core::int :await_jump_var = 0;
     dynamic :await_ctx_var;
-    return (core::_SyncIterator<dynamic>? :iterator) → core::bool* yielding {
+    function :sync_op(core::_SyncIterator<dynamic>? :iterator, dynamic :exception, dynamic :stack_trace) → core::bool* yielding {
       {
         {
           :iterator.{core::_SyncIterator::_current} = null;
@@ -55,15 +55,16 @@
         }
       }
       return false;
-    };
+    }
+    return :sync_op;
   }
   return new core::_SyncIterable::•<dynamic>(:sync_op_gen);
 }
 static method getIterableBool() → core::Iterable<core::bool> /* originally sync* */ {
-  function :sync_op_gen() → (core::_SyncIterator<dynamic>?) → core::bool* {
+  function :sync_op_gen() → (core::_SyncIterator<dynamic>?, dynamic, dynamic) → core::bool* {
     core::int :await_jump_var = 0;
     dynamic :await_ctx_var;
-    return (core::_SyncIterator<dynamic>? :iterator) → core::bool* yielding {
+    function :sync_op(core::_SyncIterator<dynamic>? :iterator, dynamic :exception, dynamic :stack_trace) → core::bool* yielding {
       {
         {
           :iterator.{core::_SyncIterator::_current} = true;
@@ -71,15 +72,16 @@
         }
       }
       return false;
-    };
+    }
+    return :sync_op;
   }
   return new core::_SyncIterable::•<core::bool>(:sync_op_gen);
 }
 static method test1() → core::Iterable<core::bool> /* originally sync* */ {
-  function :sync_op_gen() → (core::_SyncIterator<dynamic>?) → core::bool* {
+  function :sync_op_gen() → (core::_SyncIterator<dynamic>?, dynamic, dynamic) → core::bool* {
     core::int :await_jump_var = 0;
     dynamic :await_ctx_var;
-    return (core::_SyncIterator<dynamic>? :iterator) → core::bool* yielding {
+    function :sync_op(core::_SyncIterator<dynamic>? :iterator, dynamic :exception, dynamic :stack_trace) → core::bool* yielding {
       {
         {
           :iterator.{core::_SyncIterator::_current} = self::getNull() as{TypeError,ForDynamic,ForNonNullableByDefault} core::bool;
@@ -87,7 +89,8 @@
         }
       }
       return false;
-    };
+    }
+    return :sync_op;
   }
   return new core::_SyncIterable::•<core::bool>(:sync_op_gen);
 }
@@ -96,10 +99,10 @@
 static method test3() → core::bool
   return self::getNull() as{TypeError,ForDynamic,ForNonNullableByDefault} core::bool;
 static method test4() → core::Iterable<core::bool> /* originally sync* */ {
-  function :sync_op_gen() → (core::_SyncIterator<dynamic>?) → core::bool* {
+  function :sync_op_gen() → (core::_SyncIterator<dynamic>?, dynamic, dynamic) → core::bool* {
     core::int :await_jump_var = 0;
     dynamic :await_ctx_var;
-    return (core::_SyncIterator<dynamic>? :iterator) → core::bool* yielding {
+    function :sync_op(core::_SyncIterator<dynamic>? :iterator, dynamic :exception, dynamic :stack_trace) → core::bool* yielding {
       {
         {
           :iterator.{core::_SyncIterator::_yieldEachIterable} = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue41437b.dart:21:10: Error: A value of type 'Iterable<dynamic>' can't be assigned to a variable of type 'Iterable<bool>'.
@@ -110,7 +113,8 @@
         }
       }
       return false;
-    };
+    }
+    return :sync_op;
   }
   return new core::_SyncIterable::•<core::bool>(:sync_op_gen);
 }
@@ -122,10 +126,10 @@
 static method test6() → core::Iterable<core::bool>
   return self::getIterableBool();
 static method test7() → core::Iterable<core::bool> /* originally sync* */ {
-  function :sync_op_gen() → (core::_SyncIterator<dynamic>?) → core::bool* {
+  function :sync_op_gen() → (core::_SyncIterator<dynamic>?, dynamic, dynamic) → core::bool* {
     core::int :await_jump_var = 0;
     dynamic :await_ctx_var;
-    return (core::_SyncIterator<dynamic>? :iterator) → core::bool* yielding {
+    function :sync_op(core::_SyncIterator<dynamic>? :iterator, dynamic :exception, dynamic :stack_trace) → core::bool* yielding {
       {
         {
           :iterator.{core::_SyncIterator::_yieldEachIterable} = self::getIterableBool();
@@ -133,12 +137,14 @@
         }
       }
       return false;
-    };
+    }
+    return :sync_op;
   }
   return new core::_SyncIterable::•<core::bool>(:sync_op_gen);
 }
 static method test() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic> :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>? :return_value;
   dynamic :async_stack_trace;
   (dynamic) → dynamic :async_op_then;
@@ -150,10 +156,10 @@
       #L1:
       {
         function test1() → core::Iterable<core::bool> /* originally sync* */ {
-          function :sync_op_gen() → (core::_SyncIterator<dynamic>?) → core::bool* {
+          function :sync_op_gen() → (core::_SyncIterator<dynamic>?, dynamic, dynamic) → core::bool* {
             core::int :await_jump_var = 0;
             dynamic :await_ctx_var;
-            return (core::_SyncIterator<dynamic>? :iterator) → core::bool* yielding {
+            function :sync_op(core::_SyncIterator<dynamic>? :iterator, dynamic :exception, dynamic :stack_trace) → core::bool* yielding {
               {
                 {
                   :iterator.{core::_SyncIterator::_current} = self::getNull() as{TypeError,ForDynamic,ForNonNullableByDefault} core::bool;
@@ -161,7 +167,8 @@
                 }
               }
               return false;
-            };
+            }
+            return :sync_op;
           }
           return new core::_SyncIterable::•<core::bool>(:sync_op_gen);
         }
@@ -170,10 +177,10 @@
         function test3() → core::bool
           return self::getNull() as{TypeError,ForDynamic,ForNonNullableByDefault} core::bool;
         function test4() → core::Iterable<core::bool> /* originally sync* */ {
-          function :sync_op_gen() → (core::_SyncIterator<dynamic>?) → core::bool* {
+          function :sync_op_gen() → (core::_SyncIterator<dynamic>?, dynamic, dynamic) → core::bool* {
             core::int :await_jump_var = 0;
             dynamic :await_ctx_var;
-            return (core::_SyncIterator<dynamic>? :iterator) → core::bool* yielding {
+            function :sync_op(core::_SyncIterator<dynamic>? :iterator, dynamic :exception, dynamic :stack_trace) → core::bool* yielding {
               {
                 {
                   :iterator.{core::_SyncIterator::_yieldEachIterable} = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/issue41437b.dart:38:12: Error: A value of type 'Iterable<dynamic>' can't be assigned to a variable of type 'Iterable<bool>'.
@@ -184,7 +191,8 @@
                 }
               }
               return false;
-            };
+            }
+            return :sync_op;
           }
           return new core::_SyncIterable::•<core::bool>(:sync_op_gen);
         }
@@ -196,10 +204,10 @@
         function test6() → core::Iterable<core::bool>
           return self::getIterableBool();
         function test7() → core::Iterable<core::bool> /* originally sync* */ {
-          function :sync_op_gen() → (core::_SyncIterator<dynamic>?) → core::bool* {
+          function :sync_op_gen() → (core::_SyncIterator<dynamic>?, dynamic, dynamic) → core::bool* {
             core::int :await_jump_var = 0;
             dynamic :await_ctx_var;
-            return (core::_SyncIterator<dynamic>? :iterator) → core::bool* yielding {
+            function :sync_op(core::_SyncIterator<dynamic>? :iterator, dynamic :exception, dynamic :stack_trace) → core::bool* yielding {
               {
                 {
                   :iterator.{core::_SyncIterator::_yieldEachIterable} = self::getIterableBool();
@@ -207,7 +215,8 @@
                 }
               }
               return false;
-            };
+            }
+            return :sync_op;
           }
           return new core::_SyncIterable::•<core::bool>(:sync_op_gen);
         }
@@ -215,10 +224,10 @@
  - 'Iterable' is from 'dart:core'.
   })(); // error
     ^" in (() → core::Iterable<dynamic> /* originally sync* */ {
-          function :sync_op_gen() → (core::_SyncIterator<dynamic>?) → core::bool* {
+          function :sync_op_gen() → (core::_SyncIterator<dynamic>?, dynamic, dynamic) → core::bool* {
             core::int :await_jump_var = 0;
             dynamic :await_ctx_var;
-            return (core::_SyncIterator<dynamic>? :iterator) → core::bool* yielding {
+            function :sync_op(core::_SyncIterator<dynamic>? :iterator, dynamic :exception, dynamic :stack_trace) → core::bool* yielding {
               {
                 {
                   :iterator.{core::_SyncIterator::_current} = self::getNull();
@@ -226,7 +235,8 @@
                 }
               }
               return false;
-            };
+            }
+            return :sync_op;
           }
           return new core::_SyncIterable::•<dynamic>(:sync_op_gen);
         }).call() as{TypeError,ForNonNullableByDefault} core::Iterable<core::bool>;
@@ -236,10 +246,10 @@
  - 'Iterable' is from 'dart:core'.
   })(); // error
     ^" in (() → core::Iterable<dynamic> /* originally sync* */ {
-          function :sync_op_gen() → (core::_SyncIterator<dynamic>?) → core::bool* {
+          function :sync_op_gen() → (core::_SyncIterator<dynamic>?, dynamic, dynamic) → core::bool* {
             core::int :await_jump_var = 0;
             dynamic :await_ctx_var;
-            return (core::_SyncIterator<dynamic>? :iterator) → core::bool* yielding {
+            function :sync_op(core::_SyncIterator<dynamic>? :iterator, dynamic :exception, dynamic :stack_trace) → core::bool* yielding {
               {
                 {
                   :iterator.{core::_SyncIterator::_yieldEachIterable} = self::getIterableNull();
@@ -247,7 +257,8 @@
                 }
               }
               return false;
-            };
+            }
+            return :sync_op;
           }
           return new core::_SyncIterable::•<dynamic>(:sync_op_gen);
         }).call() as{TypeError,ForNonNullableByDefault} core::Iterable<core::bool>;
@@ -257,10 +268,10 @@
                                                  ^" in (() → core::Iterable<dynamic> => self::getIterableNull()).call() as{TypeError,ForNonNullableByDefault} core::Iterable<core::bool>;
         core::Iterable<core::bool> var6 = (() → core::Iterable<core::bool> => self::getIterableBool()).call();
         core::Iterable<core::bool> var7 = (() → core::Iterable<core::bool> /* originally sync* */ {
-          function :sync_op_gen() → (core::_SyncIterator<dynamic>?) → core::bool* {
+          function :sync_op_gen() → (core::_SyncIterator<dynamic>?, dynamic, dynamic) → core::bool* {
             core::int :await_jump_var = 0;
             dynamic :await_ctx_var;
-            return (core::_SyncIterator<dynamic>? :iterator) → core::bool* yielding {
+            function :sync_op(core::_SyncIterator<dynamic>? :iterator, dynamic :exception, dynamic :stack_trace) → core::bool* yielding {
               {
                 {
                   :iterator.{core::_SyncIterator::_yieldEachIterable} = self::getIterableBool();
@@ -268,21 +279,23 @@
                 }
               }
               return false;
-            };
+            }
+            return :sync_op;
           }
           return new core::_SyncIterable::•<core::bool>(:sync_op_gen);
         }).call();
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue41437c.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue41437c.dart.strong.transformed.expect
index 71bc53a..5bfffb3 100644
--- a/pkg/front_end/testcases/nnbd/issue41437c.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41437c.dart.strong.transformed.expect
@@ -233,7 +233,8 @@
   return :controller_stream;
 }
 static method test() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic> :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>? :return_value;
   dynamic :async_stack_trace;
   (dynamic) → dynamic :async_op_then;
@@ -482,16 +483,17 @@
           return :controller_stream;
         }).call();
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue41437c.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue41437c.dart.weak.transformed.expect
index 71bc53a..5bfffb3 100644
--- a/pkg/front_end/testcases/nnbd/issue41437c.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41437c.dart.weak.transformed.expect
@@ -233,7 +233,8 @@
   return :controller_stream;
 }
 static method test() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic> :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>? :return_value;
   dynamic :async_stack_trace;
   (dynamic) → dynamic :async_op_then;
@@ -482,16 +483,17 @@
           return :controller_stream;
         }).call();
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue41602.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue41602.dart.strong.transformed.expect
index 303fbeb..1add5c8 100644
--- a/pkg/front_end/testcases/nnbd/issue41602.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41602.dart.strong.transformed.expect
@@ -16,7 +16,8 @@
 import "dart:_internal" as _in;
 
 static method returnFutureOfVoid() → asy::Future<void> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<void> :async_completer = new asy::_AsyncAwaitCompleter::•<void>();
+  final asy::_Future<void> :async_future = new asy::_Future::•<void>();
+  core::bool* :is_sync = false;
   FutureOr<void>? :return_value;
   dynamic :async_stack_trace;
   (dynamic) → dynamic :async_op_then;
@@ -27,21 +28,23 @@
     try {
       #L1:
       {}
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method returnVoid() → void {}
 static method returnVoidAsync() → void /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic> :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>? :return_value;
   dynamic :async_stack_trace;
   (dynamic) → dynamic :async_op_then;
@@ -52,20 +55,22 @@
     try {
       #L2:
       {}
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method test() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic> :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>? :return_value;
   dynamic :async_stack_trace;
   (dynamic) → dynamic :async_op_then;
@@ -82,20 +87,22 @@
         [yield] let dynamic #t2 = asy::_awaitHelper(self::returnVoidAsync(), :async_op_then, :async_op_error, :async_op) in null;
         _in::unsafeCast<void>(:result);
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method main() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic> :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>? :return_value;
   dynamic :async_stack_trace;
   (dynamic) → dynamic :async_op_then;
@@ -110,15 +117,16 @@
         [yield] let dynamic #t3 = asy::_awaitHelper(self::returnFutureOfVoid(), :async_op_then, :async_op_error, :async_op) in null;
         _in::unsafeCast<void>(:result);
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
diff --git a/pkg/front_end/testcases/nnbd/issue41602.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue41602.dart.weak.transformed.expect
index 303fbeb..1add5c8 100644
--- a/pkg/front_end/testcases/nnbd/issue41602.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41602.dart.weak.transformed.expect
@@ -16,7 +16,8 @@
 import "dart:_internal" as _in;
 
 static method returnFutureOfVoid() → asy::Future<void> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<void> :async_completer = new asy::_AsyncAwaitCompleter::•<void>();
+  final asy::_Future<void> :async_future = new asy::_Future::•<void>();
+  core::bool* :is_sync = false;
   FutureOr<void>? :return_value;
   dynamic :async_stack_trace;
   (dynamic) → dynamic :async_op_then;
@@ -27,21 +28,23 @@
     try {
       #L1:
       {}
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method returnVoid() → void {}
 static method returnVoidAsync() → void /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic> :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>? :return_value;
   dynamic :async_stack_trace;
   (dynamic) → dynamic :async_op_then;
@@ -52,20 +55,22 @@
     try {
       #L2:
       {}
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method test() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic> :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>? :return_value;
   dynamic :async_stack_trace;
   (dynamic) → dynamic :async_op_then;
@@ -82,20 +87,22 @@
         [yield] let dynamic #t2 = asy::_awaitHelper(self::returnVoidAsync(), :async_op_then, :async_op_error, :async_op) in null;
         _in::unsafeCast<void>(:result);
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method main() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic> :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>? :return_value;
   dynamic :async_stack_trace;
   (dynamic) → dynamic :async_op_then;
@@ -110,15 +117,16 @@
         [yield] let dynamic #t3 = asy::_awaitHelper(self::returnFutureOfVoid(), :async_op_then, :async_op_error, :async_op) in null;
         _in::unsafeCast<void>(:result);
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
diff --git a/pkg/front_end/testcases/nnbd/issue41657.dart.outline.expect b/pkg/front_end/testcases/nnbd/issue41657.dart.outline.expect
index a9d3a40..b01f0d8 100644
--- a/pkg/front_end/testcases/nnbd/issue41657.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/issue41657.dart.outline.expect
@@ -3,10 +3,10 @@
 import "dart:core" as core;
 
 static final field core::bool isLegacySubtyping1a;
-static const field core::bool isLegacySubtyping1b = const <core::Null?>[] is{ForNonNullableByDefault} core::List<core::int>;
+static const field core::bool isLegacySubtyping1b = const <Null>[] is{ForNonNullableByDefault} core::List<core::int>;
 static final field core::bool isLegacySubtyping2a;
 static const field core::bool isLegacySubtyping2b = const <core::int?>[] is{ForNonNullableByDefault} core::List<core::int>;
-static const field core::List<core::int> assertLegacySubtyping1 = const <core::Null?>[] as{ForNonNullableByDefault} core::List<core::int>;
+static const field core::List<core::int> assertLegacySubtyping1 = const <Null>[] as{ForNonNullableByDefault} core::List<core::int>;
 static const field core::List<core::int> assertLegacySubtyping2 = const <core::int?>[] as{ForNonNullableByDefault} core::List<core::int>;
 static method main() → void
   ;
@@ -17,6 +17,6 @@
 Extra constant evaluation status:
 Evaluated: IsExpression @ org-dartlang-testcase:///issue41657.dart:6:38 -> BoolConstant(false)
 Evaluated: IsExpression @ org-dartlang-testcase:///issue41657.dart:8:38 -> BoolConstant(false)
-Evaluated: ListLiteral @ org-dartlang-testcase:///issue41657.dart:10:38 -> ListConstant(const <Null?>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///issue41657.dart:10:38 -> ListConstant(const <Null>[])
 Evaluated: ListLiteral @ org-dartlang-testcase:///issue41657.dart:12:38 -> ListConstant(const <int?>[])
 Extra constant evaluation: evaluated: 6, effectively constant: 4
diff --git a/pkg/front_end/testcases/nnbd/issue41657.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue41657.dart.strong.expect
index 0e06724..b2b28aa 100644
--- a/pkg/front_end/testcases/nnbd/issue41657.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue41657.dart.strong.expect
@@ -27,7 +27,7 @@
 import self as self;
 import "dart:core" as core;
 
-static final field core::bool isLegacySubtyping1a = <core::Null?>[] is{ForNonNullableByDefault} core::List<core::int>;
+static final field core::bool isLegacySubtyping1a = <Null>[] is{ForNonNullableByDefault} core::List<core::int>;
 static const field core::bool isLegacySubtyping1b = #C1;
 static final field core::bool isLegacySubtyping2a = <core::int?>[] is{ForNonNullableByDefault} core::List<core::int>;
 static const field core::bool isLegacySubtyping2b = #C1;
diff --git a/pkg/front_end/testcases/nnbd/issue41657.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue41657.dart.strong.transformed.expect
index 0e06724..b2b28aa 100644
--- a/pkg/front_end/testcases/nnbd/issue41657.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41657.dart.strong.transformed.expect
@@ -27,7 +27,7 @@
 import self as self;
 import "dart:core" as core;
 
-static final field core::bool isLegacySubtyping1a = <core::Null?>[] is{ForNonNullableByDefault} core::List<core::int>;
+static final field core::bool isLegacySubtyping1a = <Null>[] is{ForNonNullableByDefault} core::List<core::int>;
 static const field core::bool isLegacySubtyping1b = #C1;
 static final field core::bool isLegacySubtyping2a = <core::int?>[] is{ForNonNullableByDefault} core::List<core::int>;
 static const field core::bool isLegacySubtyping2b = #C1;
diff --git a/pkg/front_end/testcases/nnbd/issue41657.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue41657.dart.weak.expect
index 2a7e74f..0065c49 100644
--- a/pkg/front_end/testcases/nnbd/issue41657.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue41657.dart.weak.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static final field core::bool isLegacySubtyping1a = <core::Null?>[] is{ForNonNullableByDefault} core::List<core::int>;
+static final field core::bool isLegacySubtyping1a = <Null>[] is{ForNonNullableByDefault} core::List<core::int>;
 static const field core::bool isLegacySubtyping1b = #C1;
 static final field core::bool isLegacySubtyping2a = <core::int?>[] is{ForNonNullableByDefault} core::List<core::int>;
 static const field core::bool isLegacySubtyping2b = #C1;
@@ -19,6 +19,6 @@
 
 constants  {
   #C1 = true
-  #C2 = <core::Null?>[]
+  #C2 = <Null>[]
   #C3 = <core::int*>[]
 }
diff --git a/pkg/front_end/testcases/nnbd/issue41657.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue41657.dart.weak.transformed.expect
index 2a7e74f..0065c49 100644
--- a/pkg/front_end/testcases/nnbd/issue41657.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41657.dart.weak.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static final field core::bool isLegacySubtyping1a = <core::Null?>[] is{ForNonNullableByDefault} core::List<core::int>;
+static final field core::bool isLegacySubtyping1a = <Null>[] is{ForNonNullableByDefault} core::List<core::int>;
 static const field core::bool isLegacySubtyping1b = #C1;
 static final field core::bool isLegacySubtyping2a = <core::int?>[] is{ForNonNullableByDefault} core::List<core::int>;
 static const field core::bool isLegacySubtyping2b = #C1;
@@ -19,6 +19,6 @@
 
 constants  {
   #C1 = true
-  #C2 = <core::Null?>[]
+  #C2 = <Null>[]
   #C3 = <core::int*>[]
 }
diff --git a/pkg/front_end/testcases/nnbd/issue41697.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue41697.dart.strong.transformed.expect
index 3355e4f..af60f0b 100644
--- a/pkg/front_end/testcases/nnbd/issue41697.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41697.dart.strong.transformed.expect
@@ -35,7 +35,8 @@
     return s.{core::num::+}(1);
   };
   <S extends FutureOr<core::num> = FutureOr<core::num>>(S, FutureOr<core::num>) → asy::Future<core::num> f2 = c.{self::C::field2} = <S extends FutureOr<core::num> = FutureOr<core::num>>(S s, FutureOr<core::num>t) → asy::Future<core::num> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::num> :async_completer = new asy::_AsyncAwaitCompleter::•<core::num>();
+    final asy::_Future<core::num> :async_future = new asy::_Future::•<core::num>();
+    core::bool* :is_sync = false;
     FutureOr<core::num>? :return_value;
     dynamic :async_stack_trace;
     (dynamic) → dynamic :async_op_then;
@@ -51,17 +52,18 @@
           :return_value = _in::unsafeCast<core::num>(:result).{core::num::+}(1);
           break #L1;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   };
 }
 static method test2(self::C<core::num?> c) → dynamic {
@@ -71,7 +73,8 @@
              ^" in s.{core::num::+}(1);
   };
   <S extends FutureOr<core::num?> = FutureOr<core::num?>>(S%, FutureOr<core::num?>) → asy::Future<core::num> f2 = c.{self::C::field2} = <S extends FutureOr<core::num?> = FutureOr<core::num?>>(S% s, FutureOr<core::num?>t) → asy::Future<core::num> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::num> :async_completer = new asy::_AsyncAwaitCompleter::•<core::num>();
+    final asy::_Future<core::num> :async_future = new asy::_Future::•<core::num>();
+    core::bool* :is_sync = false;
     FutureOr<core::num>? :return_value;
     dynamic :async_stack_trace;
     (dynamic) → dynamic :async_op_then;
@@ -90,17 +93,18 @@
           :return_value = _in::unsafeCast<core::num?>(:result).{core::num::+}(1);
           break #L2;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   };
 }
 static method test3<S extends core::num? = core::num?>(self::test3::S% s) → dynamic
diff --git a/pkg/front_end/testcases/nnbd/issue41697.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue41697.dart.weak.transformed.expect
index 3355e4f..af60f0b 100644
--- a/pkg/front_end/testcases/nnbd/issue41697.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41697.dart.weak.transformed.expect
@@ -35,7 +35,8 @@
     return s.{core::num::+}(1);
   };
   <S extends FutureOr<core::num> = FutureOr<core::num>>(S, FutureOr<core::num>) → asy::Future<core::num> f2 = c.{self::C::field2} = <S extends FutureOr<core::num> = FutureOr<core::num>>(S s, FutureOr<core::num>t) → asy::Future<core::num> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::num> :async_completer = new asy::_AsyncAwaitCompleter::•<core::num>();
+    final asy::_Future<core::num> :async_future = new asy::_Future::•<core::num>();
+    core::bool* :is_sync = false;
     FutureOr<core::num>? :return_value;
     dynamic :async_stack_trace;
     (dynamic) → dynamic :async_op_then;
@@ -51,17 +52,18 @@
           :return_value = _in::unsafeCast<core::num>(:result).{core::num::+}(1);
           break #L1;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   };
 }
 static method test2(self::C<core::num?> c) → dynamic {
@@ -71,7 +73,8 @@
              ^" in s.{core::num::+}(1);
   };
   <S extends FutureOr<core::num?> = FutureOr<core::num?>>(S%, FutureOr<core::num?>) → asy::Future<core::num> f2 = c.{self::C::field2} = <S extends FutureOr<core::num?> = FutureOr<core::num?>>(S% s, FutureOr<core::num?>t) → asy::Future<core::num> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::num> :async_completer = new asy::_AsyncAwaitCompleter::•<core::num>();
+    final asy::_Future<core::num> :async_future = new asy::_Future::•<core::num>();
+    core::bool* :is_sync = false;
     FutureOr<core::num>? :return_value;
     dynamic :async_stack_trace;
     (dynamic) → dynamic :async_op_then;
@@ -90,17 +93,18 @@
           :return_value = _in::unsafeCast<core::num?>(:result).{core::num::+}(1);
           break #L2;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   };
 }
 static method test3<S extends core::num? = core::num?>(self::test3::S% s) → dynamic
diff --git a/pkg/front_end/testcases/nnbd/issue41700a.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue41700a.dart.strong.expect
index 65b8b25..40f1fe1 100644
--- a/pkg/front_end/testcases/nnbd/issue41700a.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue41700a.dart.strong.expect
@@ -13,15 +13,14 @@
 //     ^^^
 //
 import self as self;
-import "dart:core" as core;
 
 static method test() → dynamic {
-  core::Null? x = null;
+  Null x = null;
   invalid-expression "pkg/front_end/testcases/nnbd/issue41700a.dart:7:5: Error: The method 'foo' isn't defined for the class 'Null'.
 Try correcting the name to the name of an existing method, or defining a method named 'foo'.
   x.foo();
     ^^^";
-  core::Null? y = null;
+  Null y = null;
   invalid-expression "pkg/front_end/testcases/nnbd/issue41700a.dart:9:5: Error: The method 'foo' isn't defined for the class 'Null'.
 Try correcting the name to the name of an existing method, or defining a method named 'foo'.
   y.foo();
diff --git a/pkg/front_end/testcases/nnbd/issue41700a.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue41700a.dart.strong.transformed.expect
index 65b8b25..40f1fe1 100644
--- a/pkg/front_end/testcases/nnbd/issue41700a.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41700a.dart.strong.transformed.expect
@@ -13,15 +13,14 @@
 //     ^^^
 //
 import self as self;
-import "dart:core" as core;
 
 static method test() → dynamic {
-  core::Null? x = null;
+  Null x = null;
   invalid-expression "pkg/front_end/testcases/nnbd/issue41700a.dart:7:5: Error: The method 'foo' isn't defined for the class 'Null'.
 Try correcting the name to the name of an existing method, or defining a method named 'foo'.
   x.foo();
     ^^^";
-  core::Null? y = null;
+  Null y = null;
   invalid-expression "pkg/front_end/testcases/nnbd/issue41700a.dart:9:5: Error: The method 'foo' isn't defined for the class 'Null'.
 Try correcting the name to the name of an existing method, or defining a method named 'foo'.
   y.foo();
diff --git a/pkg/front_end/testcases/nnbd/issue41700a.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue41700a.dart.weak.expect
index 65b8b25..40f1fe1 100644
--- a/pkg/front_end/testcases/nnbd/issue41700a.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue41700a.dart.weak.expect
@@ -13,15 +13,14 @@
 //     ^^^
 //
 import self as self;
-import "dart:core" as core;
 
 static method test() → dynamic {
-  core::Null? x = null;
+  Null x = null;
   invalid-expression "pkg/front_end/testcases/nnbd/issue41700a.dart:7:5: Error: The method 'foo' isn't defined for the class 'Null'.
 Try correcting the name to the name of an existing method, or defining a method named 'foo'.
   x.foo();
     ^^^";
-  core::Null? y = null;
+  Null y = null;
   invalid-expression "pkg/front_end/testcases/nnbd/issue41700a.dart:9:5: Error: The method 'foo' isn't defined for the class 'Null'.
 Try correcting the name to the name of an existing method, or defining a method named 'foo'.
   y.foo();
diff --git a/pkg/front_end/testcases/nnbd/issue41700a.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue41700a.dart.weak.transformed.expect
index 65b8b25..40f1fe1 100644
--- a/pkg/front_end/testcases/nnbd/issue41700a.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41700a.dart.weak.transformed.expect
@@ -13,15 +13,14 @@
 //     ^^^
 //
 import self as self;
-import "dart:core" as core;
 
 static method test() → dynamic {
-  core::Null? x = null;
+  Null x = null;
   invalid-expression "pkg/front_end/testcases/nnbd/issue41700a.dart:7:5: Error: The method 'foo' isn't defined for the class 'Null'.
 Try correcting the name to the name of an existing method, or defining a method named 'foo'.
   x.foo();
     ^^^";
-  core::Null? y = null;
+  Null y = null;
   invalid-expression "pkg/front_end/testcases/nnbd/issue41700a.dart:9:5: Error: The method 'foo' isn't defined for the class 'Null'.
 Try correcting the name to the name of an existing method, or defining a method named 'foo'.
   y.foo();
diff --git a/pkg/front_end/testcases/nnbd/issue41700b.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue41700b.dart.strong.expect
index 79e8633..f3fd260 100644
--- a/pkg/front_end/testcases/nnbd/issue41700b.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue41700b.dart.strong.expect
@@ -2,9 +2,8 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/issue41700b.dart:8:12: Error: A value of type 'Null/*1*/' can't be assigned to a variable of type 'Null/*2*/'.
-//  - 'Null/*1*/' is from 'dart:core'.
-//  - 'Null/*2*/' is from 'pkg/front_end/testcases/nnbd/issue41700b.dart'.
+// pkg/front_end/testcases/nnbd/issue41700b.dart:8:12: Error: The value 'null' can't be assigned to a variable of type 'Null' because 'Null' is not nullable.
+//  - 'Null' is from 'pkg/front_end/testcases/nnbd/issue41700b.dart'.
 //   Null x = null;
 //            ^
 //
@@ -29,9 +28,8 @@
     ;
 }
 static method test() → dynamic {
-  self::Null x = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue41700b.dart:8:12: Error: A value of type 'Null/*1*/' can't be assigned to a variable of type 'Null/*2*/'.
- - 'Null/*1*/' is from 'dart:core'.
- - 'Null/*2*/' is from 'pkg/front_end/testcases/nnbd/issue41700b.dart'.
+  self::Null x = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue41700b.dart:8:12: Error: The value 'null' can't be assigned to a variable of type 'Null' because 'Null' is not nullable.
+ - 'Null' is from 'pkg/front_end/testcases/nnbd/issue41700b.dart'.
   Null x = null;
            ^" in null as{TypeError,ForNonNullableByDefault} self::Null;
   invalid-expression "pkg/front_end/testcases/nnbd/issue41700b.dart:9:5: Error: The method 'foo' isn't defined for the class 'Null'.
diff --git a/pkg/front_end/testcases/nnbd/issue41700b.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue41700b.dart.strong.transformed.expect
index 46f2af9..14adf33 100644
--- a/pkg/front_end/testcases/nnbd/issue41700b.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41700b.dart.strong.transformed.expect
@@ -2,9 +2,8 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/issue41700b.dart:8:12: Error: A value of type 'Null/*1*/' can't be assigned to a variable of type 'Null/*2*/'.
-//  - 'Null/*1*/' is from 'dart:core'.
-//  - 'Null/*2*/' is from 'pkg/front_end/testcases/nnbd/issue41700b.dart'.
+// pkg/front_end/testcases/nnbd/issue41700b.dart:8:12: Error: The value 'null' can't be assigned to a variable of type 'Null' because 'Null' is not nullable.
+//  - 'Null' is from 'pkg/front_end/testcases/nnbd/issue41700b.dart'.
 //   Null x = null;
 //            ^
 //
@@ -29,11 +28,10 @@
     ;
 }
 static method test() → dynamic {
-  self::Null x = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue41700b.dart:8:12: Error: A value of type 'Null/*1*/' can't be assigned to a variable of type 'Null/*2*/'.
- - 'Null/*1*/' is from 'dart:core'.
- - 'Null/*2*/' is from 'pkg/front_end/testcases/nnbd/issue41700b.dart'.
+  self::Null x = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue41700b.dart:8:12: Error: The value 'null' can't be assigned to a variable of type 'Null' because 'Null' is not nullable.
+ - 'Null' is from 'pkg/front_end/testcases/nnbd/issue41700b.dart'.
   Null x = null;
-           ^" in let core::Null? #t2 = null in #t2.==(null) ?{self::Null} #t2 as{TypeError,ForNonNullableByDefault} self::Null : #t2{self::Null};
+           ^" in let Null #t2 = null in #t2.==(null) ?{self::Null} #t2 as{TypeError,ForNonNullableByDefault} self::Null : #t2{self::Null};
   invalid-expression "pkg/front_end/testcases/nnbd/issue41700b.dart:9:5: Error: The method 'foo' isn't defined for the class 'Null'.
  - 'Null' is from 'pkg/front_end/testcases/nnbd/issue41700b.dart'.
 Try correcting the name to the name of an existing method, or defining a method named 'foo'.
diff --git a/pkg/front_end/testcases/nnbd/issue41700b.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue41700b.dart.weak.expect
index 79e8633..f3fd260 100644
--- a/pkg/front_end/testcases/nnbd/issue41700b.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue41700b.dart.weak.expect
@@ -2,9 +2,8 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/issue41700b.dart:8:12: Error: A value of type 'Null/*1*/' can't be assigned to a variable of type 'Null/*2*/'.
-//  - 'Null/*1*/' is from 'dart:core'.
-//  - 'Null/*2*/' is from 'pkg/front_end/testcases/nnbd/issue41700b.dart'.
+// pkg/front_end/testcases/nnbd/issue41700b.dart:8:12: Error: The value 'null' can't be assigned to a variable of type 'Null' because 'Null' is not nullable.
+//  - 'Null' is from 'pkg/front_end/testcases/nnbd/issue41700b.dart'.
 //   Null x = null;
 //            ^
 //
@@ -29,9 +28,8 @@
     ;
 }
 static method test() → dynamic {
-  self::Null x = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue41700b.dart:8:12: Error: A value of type 'Null/*1*/' can't be assigned to a variable of type 'Null/*2*/'.
- - 'Null/*1*/' is from 'dart:core'.
- - 'Null/*2*/' is from 'pkg/front_end/testcases/nnbd/issue41700b.dart'.
+  self::Null x = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue41700b.dart:8:12: Error: The value 'null' can't be assigned to a variable of type 'Null' because 'Null' is not nullable.
+ - 'Null' is from 'pkg/front_end/testcases/nnbd/issue41700b.dart'.
   Null x = null;
            ^" in null as{TypeError,ForNonNullableByDefault} self::Null;
   invalid-expression "pkg/front_end/testcases/nnbd/issue41700b.dart:9:5: Error: The method 'foo' isn't defined for the class 'Null'.
diff --git a/pkg/front_end/testcases/nnbd/issue41700b.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue41700b.dart.weak.transformed.expect
index 69120e0..18bf619 100644
--- a/pkg/front_end/testcases/nnbd/issue41700b.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41700b.dart.weak.transformed.expect
@@ -2,9 +2,8 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/issue41700b.dart:8:12: Error: A value of type 'Null/*1*/' can't be assigned to a variable of type 'Null/*2*/'.
-//  - 'Null/*1*/' is from 'dart:core'.
-//  - 'Null/*2*/' is from 'pkg/front_end/testcases/nnbd/issue41700b.dart'.
+// pkg/front_end/testcases/nnbd/issue41700b.dart:8:12: Error: The value 'null' can't be assigned to a variable of type 'Null' because 'Null' is not nullable.
+//  - 'Null' is from 'pkg/front_end/testcases/nnbd/issue41700b.dart'.
 //   Null x = null;
 //            ^
 //
@@ -29,9 +28,8 @@
     ;
 }
 static method test() → dynamic {
-  self::Null x = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue41700b.dart:8:12: Error: A value of type 'Null/*1*/' can't be assigned to a variable of type 'Null/*2*/'.
- - 'Null/*1*/' is from 'dart:core'.
- - 'Null/*2*/' is from 'pkg/front_end/testcases/nnbd/issue41700b.dart'.
+  self::Null x = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue41700b.dart:8:12: Error: The value 'null' can't be assigned to a variable of type 'Null' because 'Null' is not nullable.
+ - 'Null' is from 'pkg/front_end/testcases/nnbd/issue41700b.dart'.
   Null x = null;
            ^" in null;
   invalid-expression "pkg/front_end/testcases/nnbd/issue41700b.dart:9:5: Error: The method 'foo' isn't defined for the class 'Null'.
diff --git a/pkg/front_end/testcases/nnbd/issue41952.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue41952.dart.strong.expect
index 3eac783..01926cd 100644
--- a/pkg/front_end/testcases/nnbd/issue41952.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue41952.dart.strong.expect
@@ -3,5 +3,5 @@
 import "dart:core" as core;
 
 static method i1<R extends core::Object? = dynamic>() → <S2 extends self::i1::R? = dynamic>() → void
-  return <S2 extends self::i1::R? = self::i1::R?>() → core::Null? {};
+  return <S2 extends self::i1::R? = self::i1::R?>() → void {};
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue41952.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue41952.dart.strong.transformed.expect
index 3eac783..01926cd 100644
--- a/pkg/front_end/testcases/nnbd/issue41952.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41952.dart.strong.transformed.expect
@@ -3,5 +3,5 @@
 import "dart:core" as core;
 
 static method i1<R extends core::Object? = dynamic>() → <S2 extends self::i1::R? = dynamic>() → void
-  return <S2 extends self::i1::R? = self::i1::R?>() → core::Null? {};
+  return <S2 extends self::i1::R? = self::i1::R?>() → void {};
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue41952.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue41952.dart.weak.expect
index 3eac783..01926cd 100644
--- a/pkg/front_end/testcases/nnbd/issue41952.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue41952.dart.weak.expect
@@ -3,5 +3,5 @@
 import "dart:core" as core;
 
 static method i1<R extends core::Object? = dynamic>() → <S2 extends self::i1::R? = dynamic>() → void
-  return <S2 extends self::i1::R? = self::i1::R?>() → core::Null? {};
+  return <S2 extends self::i1::R? = self::i1::R?>() → void {};
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue41952.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue41952.dart.weak.transformed.expect
index 3eac783..01926cd 100644
--- a/pkg/front_end/testcases/nnbd/issue41952.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41952.dart.weak.transformed.expect
@@ -3,5 +3,5 @@
 import "dart:core" as core;
 
 static method i1<R extends core::Object? = dynamic>() → <S2 extends self::i1::R? = dynamic>() → void
-  return <S2 extends self::i1::R? = self::i1::R?>() → core::Null? {};
+  return <S2 extends self::i1::R? = self::i1::R?>() → void {};
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue42089.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue42089.dart.strong.expect
index 36f7b96..21e3af9 100644
--- a/pkg/front_end/testcases/nnbd/issue42089.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue42089.dart.strong.expect
@@ -2,12 +2,12 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/issue42089.dart:7:16: Error: A value of type 'X?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/issue42089.dart:7:16: Error: A value of type 'X?' can't be assigned to a variable of type 'Object' because 'X?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //     Object o = x;
 //                ^
 //
-// pkg/front_end/testcases/nnbd/issue42089.dart:8:9: Error: A value of type 'X?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/issue42089.dart:8:9: Error: A value of type 'X?' can't be assigned to a variable of type 'Object' because 'X?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //     o = x;
 //         ^
@@ -17,11 +17,11 @@
 
 static method test<X extends core::Object? = dynamic>(self::test::X? x) → dynamic {
   if(x is{ForNonNullableByDefault} core::String?) {
-    core::Object o = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue42089.dart:7:16: Error: A value of type 'X?' can't be assigned to a variable of type 'Object'.
+    core::Object o = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue42089.dart:7:16: Error: A value of type 'X?' can't be assigned to a variable of type 'Object' because 'X?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
     Object o = x;
                ^" in x{self::test::X? & core::String? /* '?' & '?' = '?' */} as{TypeError,ForNonNullableByDefault} core::Object;
-    o = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/issue42089.dart:8:9: Error: A value of type 'X?' can't be assigned to a variable of type 'Object'.
+    o = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/issue42089.dart:8:9: Error: A value of type 'X?' can't be assigned to a variable of type 'Object' because 'X?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
     o = x;
         ^" in x{self::test::X? & core::String? /* '?' & '?' = '?' */} as{TypeError,ForNonNullableByDefault} core::Object;
diff --git a/pkg/front_end/testcases/nnbd/issue42089.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue42089.dart.strong.transformed.expect
index e118a5c..25cda95 100644
--- a/pkg/front_end/testcases/nnbd/issue42089.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue42089.dart.strong.transformed.expect
@@ -2,12 +2,12 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/issue42089.dart:7:16: Error: A value of type 'X?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/issue42089.dart:7:16: Error: A value of type 'X?' can't be assigned to a variable of type 'Object' because 'X?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //     Object o = x;
 //                ^
 //
-// pkg/front_end/testcases/nnbd/issue42089.dart:8:9: Error: A value of type 'X?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/issue42089.dart:8:9: Error: A value of type 'X?' can't be assigned to a variable of type 'Object' because 'X?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //     o = x;
 //         ^
@@ -17,11 +17,11 @@
 
 static method test<X extends core::Object? = dynamic>(self::test::X? x) → dynamic {
   if(x is{ForNonNullableByDefault} core::String?) {
-    core::Object o = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue42089.dart:7:16: Error: A value of type 'X?' can't be assigned to a variable of type 'Object'.
+    core::Object o = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue42089.dart:7:16: Error: A value of type 'X?' can't be assigned to a variable of type 'Object' because 'X?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
     Object o = x;
                ^" in let self::test::X? & core::String? /* '?' & '?' = '?' */ #t2 = x{self::test::X? & core::String? /* '?' & '?' = '?' */} in #t2.==(null) ?{core::Object} #t2 as{TypeError,ForNonNullableByDefault} core::Object : #t2{core::Object};
-    o = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/issue42089.dart:8:9: Error: A value of type 'X?' can't be assigned to a variable of type 'Object'.
+    o = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/issue42089.dart:8:9: Error: A value of type 'X?' can't be assigned to a variable of type 'Object' because 'X?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
     o = x;
         ^" in let self::test::X? & core::String? /* '?' & '?' = '?' */ #t4 = x{self::test::X? & core::String? /* '?' & '?' = '?' */} in #t4.==(null) ?{core::Object} #t4 as{TypeError,ForNonNullableByDefault} core::Object : #t4{core::Object};
diff --git a/pkg/front_end/testcases/nnbd/issue42089.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue42089.dart.weak.expect
index 36f7b96..21e3af9 100644
--- a/pkg/front_end/testcases/nnbd/issue42089.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue42089.dart.weak.expect
@@ -2,12 +2,12 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/issue42089.dart:7:16: Error: A value of type 'X?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/issue42089.dart:7:16: Error: A value of type 'X?' can't be assigned to a variable of type 'Object' because 'X?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //     Object o = x;
 //                ^
 //
-// pkg/front_end/testcases/nnbd/issue42089.dart:8:9: Error: A value of type 'X?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/issue42089.dart:8:9: Error: A value of type 'X?' can't be assigned to a variable of type 'Object' because 'X?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //     o = x;
 //         ^
@@ -17,11 +17,11 @@
 
 static method test<X extends core::Object? = dynamic>(self::test::X? x) → dynamic {
   if(x is{ForNonNullableByDefault} core::String?) {
-    core::Object o = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue42089.dart:7:16: Error: A value of type 'X?' can't be assigned to a variable of type 'Object'.
+    core::Object o = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue42089.dart:7:16: Error: A value of type 'X?' can't be assigned to a variable of type 'Object' because 'X?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
     Object o = x;
                ^" in x{self::test::X? & core::String? /* '?' & '?' = '?' */} as{TypeError,ForNonNullableByDefault} core::Object;
-    o = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/issue42089.dart:8:9: Error: A value of type 'X?' can't be assigned to a variable of type 'Object'.
+    o = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/issue42089.dart:8:9: Error: A value of type 'X?' can't be assigned to a variable of type 'Object' because 'X?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
     o = x;
         ^" in x{self::test::X? & core::String? /* '?' & '?' = '?' */} as{TypeError,ForNonNullableByDefault} core::Object;
diff --git a/pkg/front_end/testcases/nnbd/issue42089.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue42089.dart.weak.transformed.expect
index e75b74f..60c8103 100644
--- a/pkg/front_end/testcases/nnbd/issue42089.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue42089.dart.weak.transformed.expect
@@ -2,12 +2,12 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/issue42089.dart:7:16: Error: A value of type 'X?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/issue42089.dart:7:16: Error: A value of type 'X?' can't be assigned to a variable of type 'Object' because 'X?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //     Object o = x;
 //                ^
 //
-// pkg/front_end/testcases/nnbd/issue42089.dart:8:9: Error: A value of type 'X?' can't be assigned to a variable of type 'Object'.
+// pkg/front_end/testcases/nnbd/issue42089.dart:8:9: Error: A value of type 'X?' can't be assigned to a variable of type 'Object' because 'X?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //     o = x;
 //         ^
@@ -17,11 +17,11 @@
 
 static method test<X extends core::Object? = dynamic>(self::test::X? x) → dynamic {
   if(x is{ForNonNullableByDefault} core::String?) {
-    core::Object o = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue42089.dart:7:16: Error: A value of type 'X?' can't be assigned to a variable of type 'Object'.
+    core::Object o = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue42089.dart:7:16: Error: A value of type 'X?' can't be assigned to a variable of type 'Object' because 'X?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
     Object o = x;
                ^" in x{self::test::X? & core::String? /* '?' & '?' = '?' */};
-    o = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/issue42089.dart:8:9: Error: A value of type 'X?' can't be assigned to a variable of type 'Object'.
+    o = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/issue42089.dart:8:9: Error: A value of type 'X?' can't be assigned to a variable of type 'Object' because 'X?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
     o = x;
         ^" in x{self::test::X? & core::String? /* '?' & '?' = '?' */};
diff --git a/pkg/front_end/testcases/nnbd/issue42362.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue42362.dart.strong.expect
index 212d75b..62f2fb2 100644
--- a/pkg/front_end/testcases/nnbd/issue42362.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue42362.dart.strong.expect
@@ -66,19 +66,19 @@
 //   factory C.factory9({int i}) => new C.constructor4(); // error
 //                           ^
 //
-// pkg/front_end/testcases/nnbd/issue42362.dart:19:18: Error: A value of type 'int?' can't be assigned to a variable of type 'int'.
+// pkg/front_end/testcases/nnbd/issue42362.dart:19:18: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
 //       : this.i = i; // error
 //                  ^
 //
-// pkg/front_end/testcases/nnbd/issue42362.dart:22:18: Error: A value of type 'int?' can't be assigned to a variable of type 'int'.
+// pkg/front_end/testcases/nnbd/issue42362.dart:22:18: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
 //       : this.i = i; // error
 //                  ^
 //
-// pkg/front_end/testcases/nnbd/issue42362.dart:85:39: Error: A value of type 'int?' can't be assigned to a variable of type 'int'.
+// pkg/front_end/testcases/nnbd/issue42362.dart:85:39: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
 //   C.constructor5([int? i]) : this.i = i; // error
 //                                       ^
 //
-// pkg/front_end/testcases/nnbd/issue42362.dart:87:39: Error: A value of type 'int?' can't be assigned to a variable of type 'int'.
+// pkg/front_end/testcases/nnbd/issue42362.dart:87:39: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
 //   C.constructor6({int? i}) : this.i = i; // error
 //                                       ^
 //
@@ -101,12 +101,12 @@
     : self::A::i = i, super core::Object::•()
     ;
   constructor constructor5([core::int? i = #C1]) → self::A
-    : self::A::i = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue42362.dart:19:18: Error: A value of type 'int?' can't be assigned to a variable of type 'int'.
+    : self::A::i = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue42362.dart:19:18: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
       : this.i = i; // error
                  ^" in i as{TypeError,ForNonNullableByDefault} core::int, super core::Object::•()
     ;
   constructor constructor6({core::int? i = #C1}) → self::A
-    : self::A::i = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/issue42362.dart:22:18: Error: A value of type 'int?' can't be assigned to a variable of type 'int'.
+    : self::A::i = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/issue42362.dart:22:18: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
       : this.i = i; // error
                  ^" in i as{TypeError,ForNonNullableByDefault} core::int, super core::Object::•()
     ;
@@ -168,12 +168,12 @@
     : self::C::i = i, super core::Object::•()
     ;
   constructor constructor5([core::int? i = #C1]) → self::C
-    : self::C::i = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/issue42362.dart:85:39: Error: A value of type 'int?' can't be assigned to a variable of type 'int'.
+    : self::C::i = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/issue42362.dart:85:39: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
   C.constructor5([int? i]) : this.i = i; // error
                                       ^" in i as{TypeError,ForNonNullableByDefault} core::int, super core::Object::•()
     ;
   constructor constructor6({core::int? i = #C1}) → self::C
-    : self::C::i = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/issue42362.dart:87:39: Error: A value of type 'int?' can't be assigned to a variable of type 'int'.
+    : self::C::i = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/issue42362.dart:87:39: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
   C.constructor6({int? i}) : this.i = i; // error
                                       ^" in i as{TypeError,ForNonNullableByDefault} core::int, super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/nnbd/issue42362.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue42362.dart.strong.transformed.expect
index b0359f3..a58e129 100644
--- a/pkg/front_end/testcases/nnbd/issue42362.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue42362.dart.strong.transformed.expect
@@ -66,19 +66,19 @@
 //   factory C.factory9({int i}) => new C.constructor4(); // error
 //                           ^
 //
-// pkg/front_end/testcases/nnbd/issue42362.dart:19:18: Error: A value of type 'int?' can't be assigned to a variable of type 'int'.
+// pkg/front_end/testcases/nnbd/issue42362.dart:19:18: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
 //       : this.i = i; // error
 //                  ^
 //
-// pkg/front_end/testcases/nnbd/issue42362.dart:22:18: Error: A value of type 'int?' can't be assigned to a variable of type 'int'.
+// pkg/front_end/testcases/nnbd/issue42362.dart:22:18: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
 //       : this.i = i; // error
 //                  ^
 //
-// pkg/front_end/testcases/nnbd/issue42362.dart:85:39: Error: A value of type 'int?' can't be assigned to a variable of type 'int'.
+// pkg/front_end/testcases/nnbd/issue42362.dart:85:39: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
 //   C.constructor5([int? i]) : this.i = i; // error
 //                                       ^
 //
-// pkg/front_end/testcases/nnbd/issue42362.dart:87:39: Error: A value of type 'int?' can't be assigned to a variable of type 'int'.
+// pkg/front_end/testcases/nnbd/issue42362.dart:87:39: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
 //   C.constructor6({int? i}) : this.i = i; // error
 //                                       ^
 //
@@ -101,12 +101,12 @@
     : self::A::i = i, super core::Object::•()
     ;
   constructor constructor5([core::int? i = #C1]) → self::A
-    : self::A::i = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue42362.dart:19:18: Error: A value of type 'int?' can't be assigned to a variable of type 'int'.
+    : self::A::i = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue42362.dart:19:18: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
       : this.i = i; // error
                  ^" in let core::int? #t2 = i in #t2.==(null) ?{core::int} #t2 as{TypeError,ForNonNullableByDefault} core::int : #t2{core::int}, super core::Object::•()
     ;
   constructor constructor6({core::int? i = #C1}) → self::A
-    : self::A::i = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/issue42362.dart:22:18: Error: A value of type 'int?' can't be assigned to a variable of type 'int'.
+    : self::A::i = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/issue42362.dart:22:18: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
       : this.i = i; // error
                  ^" in let core::int? #t4 = i in #t4.==(null) ?{core::int} #t4 as{TypeError,ForNonNullableByDefault} core::int : #t4{core::int}, super core::Object::•()
     ;
@@ -168,12 +168,12 @@
     : self::C::i = i, super core::Object::•()
     ;
   constructor constructor5([core::int? i = #C1]) → self::C
-    : self::C::i = let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/issue42362.dart:85:39: Error: A value of type 'int?' can't be assigned to a variable of type 'int'.
+    : self::C::i = let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/issue42362.dart:85:39: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
   C.constructor5([int? i]) : this.i = i; // error
                                       ^" in let core::int? #t6 = i in #t6.==(null) ?{core::int} #t6 as{TypeError,ForNonNullableByDefault} core::int : #t6{core::int}, super core::Object::•()
     ;
   constructor constructor6({core::int? i = #C1}) → self::C
-    : self::C::i = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/issue42362.dart:87:39: Error: A value of type 'int?' can't be assigned to a variable of type 'int'.
+    : self::C::i = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/issue42362.dart:87:39: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
   C.constructor6({int? i}) : this.i = i; // error
                                       ^" in let core::int? #t8 = i in #t8.==(null) ?{core::int} #t8 as{TypeError,ForNonNullableByDefault} core::int : #t8{core::int}, super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/nnbd/issue42362.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue42362.dart.weak.expect
index 212d75b..62f2fb2 100644
--- a/pkg/front_end/testcases/nnbd/issue42362.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue42362.dart.weak.expect
@@ -66,19 +66,19 @@
 //   factory C.factory9({int i}) => new C.constructor4(); // error
 //                           ^
 //
-// pkg/front_end/testcases/nnbd/issue42362.dart:19:18: Error: A value of type 'int?' can't be assigned to a variable of type 'int'.
+// pkg/front_end/testcases/nnbd/issue42362.dart:19:18: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
 //       : this.i = i; // error
 //                  ^
 //
-// pkg/front_end/testcases/nnbd/issue42362.dart:22:18: Error: A value of type 'int?' can't be assigned to a variable of type 'int'.
+// pkg/front_end/testcases/nnbd/issue42362.dart:22:18: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
 //       : this.i = i; // error
 //                  ^
 //
-// pkg/front_end/testcases/nnbd/issue42362.dart:85:39: Error: A value of type 'int?' can't be assigned to a variable of type 'int'.
+// pkg/front_end/testcases/nnbd/issue42362.dart:85:39: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
 //   C.constructor5([int? i]) : this.i = i; // error
 //                                       ^
 //
-// pkg/front_end/testcases/nnbd/issue42362.dart:87:39: Error: A value of type 'int?' can't be assigned to a variable of type 'int'.
+// pkg/front_end/testcases/nnbd/issue42362.dart:87:39: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
 //   C.constructor6({int? i}) : this.i = i; // error
 //                                       ^
 //
@@ -101,12 +101,12 @@
     : self::A::i = i, super core::Object::•()
     ;
   constructor constructor5([core::int? i = #C1]) → self::A
-    : self::A::i = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue42362.dart:19:18: Error: A value of type 'int?' can't be assigned to a variable of type 'int'.
+    : self::A::i = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue42362.dart:19:18: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
       : this.i = i; // error
                  ^" in i as{TypeError,ForNonNullableByDefault} core::int, super core::Object::•()
     ;
   constructor constructor6({core::int? i = #C1}) → self::A
-    : self::A::i = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/issue42362.dart:22:18: Error: A value of type 'int?' can't be assigned to a variable of type 'int'.
+    : self::A::i = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/issue42362.dart:22:18: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
       : this.i = i; // error
                  ^" in i as{TypeError,ForNonNullableByDefault} core::int, super core::Object::•()
     ;
@@ -168,12 +168,12 @@
     : self::C::i = i, super core::Object::•()
     ;
   constructor constructor5([core::int? i = #C1]) → self::C
-    : self::C::i = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/issue42362.dart:85:39: Error: A value of type 'int?' can't be assigned to a variable of type 'int'.
+    : self::C::i = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/issue42362.dart:85:39: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
   C.constructor5([int? i]) : this.i = i; // error
                                       ^" in i as{TypeError,ForNonNullableByDefault} core::int, super core::Object::•()
     ;
   constructor constructor6({core::int? i = #C1}) → self::C
-    : self::C::i = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/issue42362.dart:87:39: Error: A value of type 'int?' can't be assigned to a variable of type 'int'.
+    : self::C::i = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/issue42362.dart:87:39: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
   C.constructor6({int? i}) : this.i = i; // error
                                       ^" in i as{TypeError,ForNonNullableByDefault} core::int, super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/nnbd/issue42362.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue42362.dart.weak.transformed.expect
index 6b13d7b..33d6b11 100644
--- a/pkg/front_end/testcases/nnbd/issue42362.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue42362.dart.weak.transformed.expect
@@ -66,19 +66,19 @@
 //   factory C.factory9({int i}) => new C.constructor4(); // error
 //                           ^
 //
-// pkg/front_end/testcases/nnbd/issue42362.dart:19:18: Error: A value of type 'int?' can't be assigned to a variable of type 'int'.
+// pkg/front_end/testcases/nnbd/issue42362.dart:19:18: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
 //       : this.i = i; // error
 //                  ^
 //
-// pkg/front_end/testcases/nnbd/issue42362.dart:22:18: Error: A value of type 'int?' can't be assigned to a variable of type 'int'.
+// pkg/front_end/testcases/nnbd/issue42362.dart:22:18: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
 //       : this.i = i; // error
 //                  ^
 //
-// pkg/front_end/testcases/nnbd/issue42362.dart:85:39: Error: A value of type 'int?' can't be assigned to a variable of type 'int'.
+// pkg/front_end/testcases/nnbd/issue42362.dart:85:39: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
 //   C.constructor5([int? i]) : this.i = i; // error
 //                                       ^
 //
-// pkg/front_end/testcases/nnbd/issue42362.dart:87:39: Error: A value of type 'int?' can't be assigned to a variable of type 'int'.
+// pkg/front_end/testcases/nnbd/issue42362.dart:87:39: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
 //   C.constructor6({int? i}) : this.i = i; // error
 //                                       ^
 //
@@ -101,12 +101,12 @@
     : self::A::i = i, super core::Object::•()
     ;
   constructor constructor5([core::int? i = #C1]) → self::A
-    : self::A::i = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue42362.dart:19:18: Error: A value of type 'int?' can't be assigned to a variable of type 'int'.
+    : self::A::i = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue42362.dart:19:18: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
       : this.i = i; // error
                  ^" in i, super core::Object::•()
     ;
   constructor constructor6({core::int? i = #C1}) → self::A
-    : self::A::i = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/issue42362.dart:22:18: Error: A value of type 'int?' can't be assigned to a variable of type 'int'.
+    : self::A::i = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/issue42362.dart:22:18: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
       : this.i = i; // error
                  ^" in i, super core::Object::•()
     ;
@@ -168,12 +168,12 @@
     : self::C::i = i, super core::Object::•()
     ;
   constructor constructor5([core::int? i = #C1]) → self::C
-    : self::C::i = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/issue42362.dart:85:39: Error: A value of type 'int?' can't be assigned to a variable of type 'int'.
+    : self::C::i = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/issue42362.dart:85:39: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
   C.constructor5([int? i]) : this.i = i; // error
                                       ^" in i, super core::Object::•()
     ;
   constructor constructor6({core::int? i = #C1}) → self::C
-    : self::C::i = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/issue42362.dart:87:39: Error: A value of type 'int?' can't be assigned to a variable of type 'int'.
+    : self::C::i = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/issue42362.dart:87:39: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
   C.constructor6({int? i}) : this.i = i; // error
                                       ^" in i, super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/nnbd/issue42429.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue42429.dart.strong.expect
index 30ddc8d..eebb429 100644
--- a/pkg/front_end/testcases/nnbd/issue42429.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue42429.dart.strong.expect
@@ -183,19 +183,19 @@
   self::A<core::Object> aObject;
   self::A<core::num?> aNumNullable;
   self::A<core::int?> aIntNullable;
-  self::A<core::Null?> aNull;
+  self::A<Null> aNull;
   (core::Object) → dynamic fArgumentObject;
   (core::num?) → dynamic fArgumentNumNullable;
   (core::int?) → dynamic fArgumentIntNullable;
-  (core::Null?) → dynamic fArgumentNull;
+  (Null) → dynamic fArgumentNull;
   () → core::Object fReturnObject;
   () → core::num? fReturnNumNullable;
   () → core::int? fReturnIntNullable;
-  () → core::Null? fReturnNull;
+  () → Null fReturnNull;
   (core::Object) → core::Object fBothObject;
   (core::num?) → core::num? fBothNumNullable;
   (core::int?) → core::int? fBothIntNullable;
-  (core::Null?) → core::Null? fBothNull;
+  (Null) → Null fBothNull;
   () → dynamic fNowhereObject;
   () → dynamic fNowhereNumNullable;
   () → dynamic fNowhereIntNullable;
diff --git a/pkg/front_end/testcases/nnbd/issue42429.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue42429.dart.strong.transformed.expect
index 30ddc8d..eebb429 100644
--- a/pkg/front_end/testcases/nnbd/issue42429.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue42429.dart.strong.transformed.expect
@@ -183,19 +183,19 @@
   self::A<core::Object> aObject;
   self::A<core::num?> aNumNullable;
   self::A<core::int?> aIntNullable;
-  self::A<core::Null?> aNull;
+  self::A<Null> aNull;
   (core::Object) → dynamic fArgumentObject;
   (core::num?) → dynamic fArgumentNumNullable;
   (core::int?) → dynamic fArgumentIntNullable;
-  (core::Null?) → dynamic fArgumentNull;
+  (Null) → dynamic fArgumentNull;
   () → core::Object fReturnObject;
   () → core::num? fReturnNumNullable;
   () → core::int? fReturnIntNullable;
-  () → core::Null? fReturnNull;
+  () → Null fReturnNull;
   (core::Object) → core::Object fBothObject;
   (core::num?) → core::num? fBothNumNullable;
   (core::int?) → core::int? fBothIntNullable;
-  (core::Null?) → core::Null? fBothNull;
+  (Null) → Null fBothNull;
   () → dynamic fNowhereObject;
   () → dynamic fNowhereNumNullable;
   () → dynamic fNowhereIntNullable;
diff --git a/pkg/front_end/testcases/nnbd/issue42429.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue42429.dart.weak.expect
index 30ddc8d..eebb429 100644
--- a/pkg/front_end/testcases/nnbd/issue42429.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue42429.dart.weak.expect
@@ -183,19 +183,19 @@
   self::A<core::Object> aObject;
   self::A<core::num?> aNumNullable;
   self::A<core::int?> aIntNullable;
-  self::A<core::Null?> aNull;
+  self::A<Null> aNull;
   (core::Object) → dynamic fArgumentObject;
   (core::num?) → dynamic fArgumentNumNullable;
   (core::int?) → dynamic fArgumentIntNullable;
-  (core::Null?) → dynamic fArgumentNull;
+  (Null) → dynamic fArgumentNull;
   () → core::Object fReturnObject;
   () → core::num? fReturnNumNullable;
   () → core::int? fReturnIntNullable;
-  () → core::Null? fReturnNull;
+  () → Null fReturnNull;
   (core::Object) → core::Object fBothObject;
   (core::num?) → core::num? fBothNumNullable;
   (core::int?) → core::int? fBothIntNullable;
-  (core::Null?) → core::Null? fBothNull;
+  (Null) → Null fBothNull;
   () → dynamic fNowhereObject;
   () → dynamic fNowhereNumNullable;
   () → dynamic fNowhereIntNullable;
diff --git a/pkg/front_end/testcases/nnbd/issue42429.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue42429.dart.weak.transformed.expect
index 30ddc8d..eebb429 100644
--- a/pkg/front_end/testcases/nnbd/issue42429.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue42429.dart.weak.transformed.expect
@@ -183,19 +183,19 @@
   self::A<core::Object> aObject;
   self::A<core::num?> aNumNullable;
   self::A<core::int?> aIntNullable;
-  self::A<core::Null?> aNull;
+  self::A<Null> aNull;
   (core::Object) → dynamic fArgumentObject;
   (core::num?) → dynamic fArgumentNumNullable;
   (core::int?) → dynamic fArgumentIntNullable;
-  (core::Null?) → dynamic fArgumentNull;
+  (Null) → dynamic fArgumentNull;
   () → core::Object fReturnObject;
   () → core::num? fReturnNumNullable;
   () → core::int? fReturnIntNullable;
-  () → core::Null? fReturnNull;
+  () → Null fReturnNull;
   (core::Object) → core::Object fBothObject;
   (core::num?) → core::num? fBothNumNullable;
   (core::int?) → core::int? fBothIntNullable;
-  (core::Null?) → core::Null? fBothNull;
+  (Null) → Null fBothNull;
   () → dynamic fNowhereObject;
   () → dynamic fNowhereNumNullable;
   () → dynamic fNowhereIntNullable;
diff --git a/pkg/front_end/testcases/nnbd/issue42540.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue42540.dart.strong.transformed.expect
index 5fbd656..630569b 100644
--- a/pkg/front_end/testcases/nnbd/issue42540.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue42540.dart.strong.transformed.expect
@@ -6,7 +6,8 @@
 static method getNull() → dynamic
   return null;
 static method fn() → asy::Future<core::Object> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::Object> :async_completer = new asy::_AsyncAwaitCompleter::•<core::Object>();
+  final asy::_Future<core::Object> :async_future = new asy::_Future::•<core::Object>();
+  core::bool* :is_sync = false;
   FutureOr<core::Object>? :return_value;
   dynamic :async_stack_trace;
   (dynamic) → dynamic :async_op_then;
@@ -24,16 +25,17 @@
         :return_value = let dynamic #t4 = :result in #t4.==(null) ?{FutureOr<core::Object>} #t4 as{TypeError,ForDynamic,ForNonNullableByDefault} FutureOr<core::Object> : #t4{FutureOr<core::Object>};
         break #L1;
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue42540.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue42540.dart.weak.transformed.expect
index ae9a451..d317b87 100644
--- a/pkg/front_end/testcases/nnbd/issue42540.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue42540.dart.weak.transformed.expect
@@ -6,7 +6,8 @@
 static method getNull() → dynamic
   return null;
 static method fn() → asy::Future<core::Object> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::Object> :async_completer = new asy::_AsyncAwaitCompleter::•<core::Object>();
+  final asy::_Future<core::Object> :async_future = new asy::_Future::•<core::Object>();
+  core::bool* :is_sync = false;
   FutureOr<core::Object>? :return_value;
   dynamic :async_stack_trace;
   (dynamic) → dynamic :async_op_then;
@@ -24,16 +25,17 @@
         :return_value = :result;
         break #L1;
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue42546.dart.outline.expect b/pkg/front_end/testcases/nnbd/issue42546.dart.outline.expect
index baab324..de61651 100644
--- a/pkg/front_end/testcases/nnbd/issue42546.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/issue42546.dart.outline.expect
@@ -10,13 +10,13 @@
     ;
   method noSuchMethod(core::Invocation invocation) → dynamic
     ;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) →? core::bool test = #C1}) → asy::Future<self::Divergent<self::Divergent<self::Divergent::T%>>>
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) →? core::bool test}) → asy::Future<self::Divergent<self::Divergent<self::Divergent::T%>>>
     return this.{self::Divergent::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#test: test}))) as{TypeError,ForDynamic,ForNonNullableByDefault} asy::Future<self::Divergent<self::Divergent<self::Divergent::T%>>>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → FutureOr<void>action) → asy::Future<self::Divergent<self::Divergent<self::Divergent::T%>>>
     return this.{self::Divergent::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) as{TypeError,ForDynamic,ForNonNullableByDefault} asy::Future<self::Divergent<self::Divergent<self::Divergent::T%>>>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () →? FutureOr<self::Divergent<self::Divergent<self::Divergent::T%>>>onTimeout = #C1}) → asy::Future<self::Divergent<self::Divergent<self::Divergent::T%>>>
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () →? FutureOr<self::Divergent<self::Divergent<self::Divergent::T%>>>onTimeout}) → asy::Future<self::Divergent<self::Divergent<self::Divergent::T%>>>
     return this.{self::Divergent::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#onTimeout: onTimeout}))) as{TypeError,ForDynamic,ForNonNullableByDefault} asy::Future<self::Divergent<self::Divergent<self::Divergent::T%>>>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ then<R extends core::Object? = dynamic>((self::Divergent<self::Divergent<self::Divergent::T%>>) → FutureOr<self::Divergent::then::R%>onValue, {core::Function? onError = #C1}) → asy::Future<self::Divergent::then::R%>
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ then<R extends core::Object? = dynamic>((self::Divergent<self::Divergent<self::Divergent::T%>>) → FutureOr<self::Divergent::then::R%>onValue, {core::Function? onError}) → asy::Future<self::Divergent::then::R%>
     return this.{self::Divergent::noSuchMethod}(new core::_InvocationMirror::_withType(#then, 0, core::List::unmodifiable<core::Type*>(<core::Type*>[self::Divergent::then::R%]), core::List::unmodifiable<dynamic>(<dynamic>[onValue]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#onError: onError}))) as{TypeError,ForDynamic,ForNonNullableByDefault} asy::Future<self::Divergent::then::R%>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::Divergent<self::Divergent<self::Divergent::T%>>>
     return this.{self::Divergent::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) as{TypeError,ForDynamic,ForNonNullableByDefault} asy::Stream<self::Divergent<self::Divergent<self::Divergent::T%>>>;
@@ -26,9 +26,6 @@
 static method main() → dynamic
   ;
 
-constants  {
-  #C1 = null
-}
 
 Extra constant evaluation status:
 Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/async/future.dart:661:13 -> SymbolConstant(#catchError)
diff --git a/pkg/front_end/testcases/nnbd/issue42603.dart.outline.expect b/pkg/front_end/testcases/nnbd/issue42603.dart.outline.expect
index 384e012..930703f 100644
--- a/pkg/front_end/testcases/nnbd/issue42603.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/issue42603.dart.outline.expect
@@ -36,7 +36,7 @@
     ;
   method method1(dynamic o) → core::bool
     ;
-  method method2(core::Null? o) → core::bool
+  method method2(Null o) → core::bool
     ;
 }
 class E extends core::Object {
diff --git a/pkg/front_end/testcases/nnbd/issue42603.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue42603.dart.strong.expect
index 91362db..e677ee5 100644
--- a/pkg/front_end/testcases/nnbd/issue42603.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue42603.dart.strong.expect
@@ -43,7 +43,7 @@
     return super.{self::C::==}(other);
   method method1(dynamic o) → core::bool
     return super.{self::C::==}(o);
-  method method2(core::Null? o) → core::bool
+  method method2(Null o) → core::bool
     return super.{self::C::==}(o);
 }
 class E extends core::Object {
diff --git a/pkg/front_end/testcases/nnbd/issue42603.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue42603.dart.weak.expect
index 91362db..e677ee5 100644
--- a/pkg/front_end/testcases/nnbd/issue42603.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue42603.dart.weak.expect
@@ -43,7 +43,7 @@
     return super.{self::C::==}(other);
   method method1(dynamic o) → core::bool
     return super.{self::C::==}(o);
-  method method2(core::Null? o) → core::bool
+  method method2(Null o) → core::bool
     return super.{self::C::==}(o);
 }
 class E extends core::Object {
diff --git a/pkg/front_end/testcases/nnbd/issue42607.dart b/pkg/front_end/testcases/nnbd/issue42607.dart
new file mode 100644
index 0000000..91f7d49
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42607.dart
@@ -0,0 +1,13 @@
+// Copyright (c) 2020, 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.
+
+// @dart = 2.6
+
+test() {
+  int x = 3;
+  x?.isEven;
+  x = null;
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/issue42607.dart.outline.expect b/pkg/front_end/testcases/nnbd/issue42607.dart.outline.expect
new file mode 100644
index 0000000..67a3569
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42607.dart.outline.expect
@@ -0,0 +1,14 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue42607.dart:5:1: Error: A library can't opt out of null safety by default, when using sound null safety.
+// // @dart = 2.6
+// ^^^^^^^^^^^^^^
+//
+import self as self;
+
+static method test() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/nnbd/issue42607.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue42607.dart.strong.expect
new file mode 100644
index 0000000..f1a2bdd
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42607.dart.strong.expect
@@ -0,0 +1,17 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue42607.dart:5:1: Error: A library can't opt out of null safety by default, when using sound null safety.
+// // @dart = 2.6
+// ^^^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+static method test() → dynamic {
+  core::int* x = 3;
+  let final core::int* #t1 = x in #t1.{core::num::==}(null) ?{core::bool*} null : #t1.{core::int::isEven};
+  x = null;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue42607.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue42607.dart.strong.transformed.expect
new file mode 100644
index 0000000..f1a2bdd
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42607.dart.strong.transformed.expect
@@ -0,0 +1,17 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue42607.dart:5:1: Error: A library can't opt out of null safety by default, when using sound null safety.
+// // @dart = 2.6
+// ^^^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+static method test() → dynamic {
+  core::int* x = 3;
+  let final core::int* #t1 = x in #t1.{core::num::==}(null) ?{core::bool*} null : #t1.{core::int::isEven};
+  x = null;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue42607.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd/issue42607.dart.textual_outline.expect
new file mode 100644
index 0000000..5cf5db8
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42607.dart.textual_outline.expect
@@ -0,0 +1,3 @@
+// @dart = 2.6
+test() {}
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/issue42607.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/nnbd/issue42607.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..94295cd
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42607.dart.textual_outline_modelled.expect
@@ -0,0 +1,3 @@
+// @dart = 2.6
+main() {}
+test() {}
diff --git a/pkg/front_end/testcases/nnbd/issue42607.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue42607.dart.weak.expect
new file mode 100644
index 0000000..2678d44
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42607.dart.weak.expect
@@ -0,0 +1,10 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method test() → dynamic {
+  core::int* x = 3;
+  let final core::int* #t1 = x in #t1.{core::num::==}(null) ?{core::bool*} null : #t1.{core::int::isEven};
+  x = null;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue42607.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue42607.dart.weak.transformed.expect
new file mode 100644
index 0000000..2678d44
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42607.dart.weak.transformed.expect
@@ -0,0 +1,10 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method test() → dynamic {
+  core::int* x = 3;
+  let final core::int* #t1 = x in #t1.{core::num::==}(null) ?{core::bool*} null : #t1.{core::int::isEven};
+  x = null;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue42743.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue42743.dart.strong.transformed.expect
index 454a896..47601b2 100644
--- a/pkg/front_end/testcases/nnbd/issue42743.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue42743.dart.strong.transformed.expect
@@ -4,7 +4,8 @@
 import "dart:core" as core;
 
 static method main() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic> :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>? :return_value;
   dynamic :async_stack_trace;
   (dynamic) → dynamic :async_op_then;
@@ -21,7 +22,8 @@
             return 42;
         };
         (dynamic _) → asy::Future<core::int?> /* originally async */ {
-          final asy::_AsyncAwaitCompleter<core::int?> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int?>();
+          final asy::_Future<core::int?> :async_future = new asy::_Future::•<core::int?>();
+          core::bool* :is_sync = false;
           FutureOr<core::int?>? :return_value;
           dynamic :async_stack_trace;
           (dynamic) → dynamic :async_op_then;
@@ -37,28 +39,30 @@
                   break #L2;
                 }
               }
-              asy::_completeOnAsyncReturn(:async_completer, :return_value);
+              asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
               return;
             }
             on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-              :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+              asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
             }
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-          :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-          return :async_completer.{asy::Completer::future};
+          :async_op.call();
+          :is_sync = true;
+          return :async_future;
         };
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
diff --git a/pkg/front_end/testcases/nnbd/issue42743.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue42743.dart.weak.transformed.expect
index 454a896..47601b2 100644
--- a/pkg/front_end/testcases/nnbd/issue42743.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue42743.dart.weak.transformed.expect
@@ -4,7 +4,8 @@
 import "dart:core" as core;
 
 static method main() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic> :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>? :return_value;
   dynamic :async_stack_trace;
   (dynamic) → dynamic :async_op_then;
@@ -21,7 +22,8 @@
             return 42;
         };
         (dynamic _) → asy::Future<core::int?> /* originally async */ {
-          final asy::_AsyncAwaitCompleter<core::int?> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int?>();
+          final asy::_Future<core::int?> :async_future = new asy::_Future::•<core::int?>();
+          core::bool* :is_sync = false;
           FutureOr<core::int?>? :return_value;
           dynamic :async_stack_trace;
           (dynamic) → dynamic :async_op_then;
@@ -37,28 +39,30 @@
                   break #L2;
                 }
               }
-              asy::_completeOnAsyncReturn(:async_completer, :return_value);
+              asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
               return;
             }
             on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-              :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+              asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
             }
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-          :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-          return :async_completer.{asy::Completer::future};
+          :async_op.call();
+          :is_sync = true;
+          return :async_future;
         };
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
diff --git a/pkg/front_end/testcases/nnbd/issue42758.dart.outline.expect b/pkg/front_end/testcases/nnbd/issue42758.dart.outline.expect
index 3ada4d6..d2e2ef3 100644
--- a/pkg/front_end/testcases/nnbd/issue42758.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/issue42758.dart.outline.expect
@@ -1,10 +1,9 @@
 library /*isNonNullableByDefault*/;
 import self as self;
-import "dart:core" as core;
 
-static method test1(Never n1, Never? n2, core::Null? n3) → dynamic
+static method test1(Never n1, Never? n2, Null n3) → dynamic
   ;
-static method test2<N1 extends Never = Never, N2 extends Never? = Never?, N3 extends core::Null? = core::Null?>(self::test2::N1 n1, self::test2::N2% n2, self::test2::N3% n3) → dynamic
+static method test2<N1 extends Never = Never, N2 extends Never? = Never?, N3 extends Null = Null>(self::test2::N1 n1, self::test2::N2% n2, self::test2::N3% n3) → dynamic
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/nnbd/issue42758.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue42758.dart.strong.expect
index 6e4b63d..e18d2d3 100644
--- a/pkg/front_end/testcases/nnbd/issue42758.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue42758.dart.strong.expect
@@ -78,18 +78,18 @@
 import "dart:core" as core;
 import "dart:collection" as col;
 
-static method test1(Never n1, Never? n2, core::Null? n3) → dynamic {
+static method test1(Never n1, Never? n2, Null n3) → dynamic {
   core::List<Never> l1 = block {
     final core::List<Never> #t1 = <Never>[];
     for (final Never #t2 in n1)
-      #t1.{core::List::add}(#t2);
+      #t1.{core::List::add}{Invariant}(#t2);
   } =>#t1;
   core::List<Never> l2 = block {
     final core::List<Never> #t3 = <Never>[];
     final core::Iterable<Never>? #t4 = n1;
     if(!#t4.{core::Object::==}(null))
       for (final Never #t5 in #t4{core::Iterable<Never>})
-        #t3.{core::List::add}(#t5);
+        #t3.{core::List::add}{Invariant}(#t5);
   } =>#t3;
   core::List<dynamic> l3 = <dynamic>[invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:8:16: Error: Can't spread a value with static type 'Never?'.
   var l3 = [...n2];
@@ -99,7 +99,7 @@
     final core::Iterable<Never>? #t7 = n2;
     if(!#t7.{core::Object::==}(null))
       for (final Never #t8 in #t7{core::Iterable<Never>})
-        #t6.{core::List::add}(#t8);
+        #t6.{core::List::add}{Invariant}(#t8);
   } =>#t6;
   core::List<dynamic> l5 = <dynamic>[invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:10:16: Error: Can't spread a value with static type 'Null'.
   var l5 = [...n3];
@@ -109,185 +109,201 @@
     final core::Iterable<Never>? #t10 = n3;
     if(!#t10.{core::Object::==}(null))
       for (final Never #t11 in #t10{core::Iterable<Never>})
-        #t9.{core::List::add}(#t11);
+        #t9.{core::List::add}{Invariant}(#t11);
   } =>#t9;
   core::Set<Never> s1 = block {
     final core::Set<Never> #t12 = col::LinkedHashSet::•<Never>();
     for (final Never #t13 in n1)
-      #t12.{core::Set::add}(#t13);
-    #t12.{core::Set::add}(n1);
+      #t12.{core::Set::add}{Invariant}(#t13);
+    #t12.{core::Set::add}{Invariant}(n1);
   } =>#t12;
   core::Set<Never> s2 = block {
     final core::Set<Never> #t14 = col::LinkedHashSet::•<Never>();
     final core::Iterable<Never>? #t15 = n1;
     if(!#t15.{core::Object::==}(null))
       for (final Never #t16 in #t15{core::Iterable<Never>})
-        #t14.{core::Set::add}(#t16);
-    #t14.{core::Set::add}(n1);
+        #t14.{core::Set::add}{Invariant}(#t16);
+    #t14.{core::Set::add}{Invariant}(n1);
   } =>#t14;
-  core::Set<dynamic> s3 = let final core::Set<dynamic> #t17 = col::LinkedHashSet::•<dynamic>() in let final dynamic #t18 = #t17.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:14:16: Error: Can't spread a value with static type 'Never?'.
+  core::Set<dynamic> s3 = block {
+    final core::Set<dynamic> #t17 = col::LinkedHashSet::•<dynamic>();
+    #t17.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:14:16: Error: Can't spread a value with static type 'Never?'.
   var s3 = {...n2, n1};
-               ^") in let final dynamic #t19 = #t17.{core::Set::add}(n1) in #t17;
+               ^");
+    #t17.{core::Set::add}{Invariant}(n1);
+  } =>#t17;
   core::Set<Never> s4 = block {
-    final core::Set<Never> #t20 = col::LinkedHashSet::•<Never>();
-    final core::Iterable<Never>? #t21 = n2;
-    if(!#t21.{core::Object::==}(null))
-      for (final Never #t22 in #t21{core::Iterable<Never>})
-        #t20.{core::Set::add}(#t22);
-    #t20.{core::Set::add}(n1);
-  } =>#t20;
-  core::Set<dynamic> s5 = let final core::Set<dynamic> #t23 = col::LinkedHashSet::•<dynamic>() in let final dynamic #t24 = #t23.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:16:16: Error: Can't spread a value with static type 'Null'.
+    final core::Set<Never> #t18 = col::LinkedHashSet::•<Never>();
+    final core::Iterable<Never>? #t19 = n2;
+    if(!#t19.{core::Object::==}(null))
+      for (final Never #t20 in #t19{core::Iterable<Never>})
+        #t18.{core::Set::add}{Invariant}(#t20);
+    #t18.{core::Set::add}{Invariant}(n1);
+  } =>#t18;
+  core::Set<dynamic> s5 = block {
+    final core::Set<dynamic> #t21 = col::LinkedHashSet::•<dynamic>();
+    #t21.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:16:16: Error: Can't spread a value with static type 'Null'.
   var s5 = {...n3, n1};
-               ^") in let final dynamic #t25 = #t23.{core::Set::add}(n1) in #t23;
+               ^");
+    #t21.{core::Set::add}{Invariant}(n1);
+  } =>#t21;
   core::Set<Never> s6 = block {
-    final core::Set<Never> #t26 = col::LinkedHashSet::•<Never>();
-    final core::Iterable<Never>? #t27 = n3;
-    if(!#t27.{core::Object::==}(null))
-      for (final Never #t28 in #t27{core::Iterable<Never>})
-        #t26.{core::Set::add}(#t28);
-    #t26.{core::Set::add}(n1);
-  } =>#t26;
+    final core::Set<Never> #t22 = col::LinkedHashSet::•<Never>();
+    final core::Iterable<Never>? #t23 = n3;
+    if(!#t23.{core::Object::==}(null))
+      for (final Never #t24 in #t23{core::Iterable<Never>})
+        #t22.{core::Set::add}{Invariant}(#t24);
+    #t22.{core::Set::add}{Invariant}(n1);
+  } =>#t22;
   core::Map<Never, Never> m1 = block {
-    final core::Map<Never, Never> #t29 = <Never, Never>{};
-    for (final core::MapEntry<Never, Never> #t30 in n1.{core::Map::entries})
-      #t29.{core::Map::[]=}(#t30.{core::MapEntry::key}, #t30.{core::MapEntry::value});
-    #t29.{core::Map::[]=}(n1, n1);
-  } =>#t29;
+    final core::Map<Never, Never> #t25 = <Never, Never>{};
+    for (final core::MapEntry<Never, Never> #t26 in n1.{core::Map::entries})
+      #t25.{core::Map::[]=}{Invariant}(#t26.{core::MapEntry::key}, #t26.{core::MapEntry::value});
+    #t25.{core::Map::[]=}{Invariant}(n1, n1);
+  } =>#t25;
   core::Map<Never, Never> m2 = block {
-    final core::Map<Never, Never> #t31 = <Never, Never>{};
-    final core::Map<Never, Never>? #t32 = n1;
-    if(!#t32.{core::Object::==}(null))
-      for (final core::MapEntry<Never, Never> #t33 in #t32{core::Map<Never, Never>}.{core::Map::entries})
-        #t31.{core::Map::[]=}(#t33.{core::MapEntry::key}, #t33.{core::MapEntry::value});
-    #t31.{core::Map::[]=}(n1, n1);
-  } =>#t31;
+    final core::Map<Never, Never> #t27 = <Never, Never>{};
+    final core::Map<Never, Never>? #t28 = n1;
+    if(!#t28.{core::Object::==}(null))
+      for (final core::MapEntry<Never, Never> #t29 in #t28{core::Map<Never, Never>}.{core::Map::entries})
+        #t27.{core::Map::[]=}{Invariant}(#t29.{core::MapEntry::key}, #t29.{core::MapEntry::value});
+    #t27.{core::Map::[]=}{Invariant}(n1, n1);
+  } =>#t27;
   core::Map<dynamic, dynamic> m3 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:20:16: Error: Can't spread a value with static type 'Never?'.
   var m3 = {...n2, n1: n1};
                ^": null, n1: n1};
   core::Map<Never, Never> m4 = block {
-    final core::Map<Never, Never> #t34 = <Never, Never>{};
-    final core::Map<Never, Never>? #t35 = n2;
-    if(!#t35.{core::Object::==}(null))
-      for (final core::MapEntry<Never, Never> #t36 in #t35{core::Map<Never, Never>}.{core::Map::entries})
-        #t34.{core::Map::[]=}(#t36.{core::MapEntry::key}, #t36.{core::MapEntry::value});
-    #t34.{core::Map::[]=}(n1, n1);
-  } =>#t34;
+    final core::Map<Never, Never> #t30 = <Never, Never>{};
+    final core::Map<Never, Never>? #t31 = n2;
+    if(!#t31.{core::Object::==}(null))
+      for (final core::MapEntry<Never, Never> #t32 in #t31{core::Map<Never, Never>}.{core::Map::entries})
+        #t30.{core::Map::[]=}{Invariant}(#t32.{core::MapEntry::key}, #t32.{core::MapEntry::value});
+    #t30.{core::Map::[]=}{Invariant}(n1, n1);
+  } =>#t30;
   core::Map<dynamic, dynamic> m5 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:22:16: Error: Can't spread a value with static type 'Null'.
   var m5 = {...n3, n1: n1};
                ^": null, n1: n1};
   core::Map<Never, Never> m6 = block {
-    final core::Map<Never, Never> #t37 = <Never, Never>{};
-    final core::Map<Never, Never>? #t38 = n3;
-    if(!#t38.{core::Object::==}(null))
-      for (final core::MapEntry<Never, Never> #t39 in #t38{core::Map<Never, Never>}.{core::Map::entries})
-        #t37.{core::Map::[]=}(#t39.{core::MapEntry::key}, #t39.{core::MapEntry::value});
-    #t37.{core::Map::[]=}(n1, n1);
-  } =>#t37;
+    final core::Map<Never, Never> #t33 = <Never, Never>{};
+    final core::Map<Never, Never>? #t34 = n3;
+    if(!#t34.{core::Object::==}(null))
+      for (final core::MapEntry<Never, Never> #t35 in #t34{core::Map<Never, Never>}.{core::Map::entries})
+        #t33.{core::Map::[]=}{Invariant}(#t35.{core::MapEntry::key}, #t35.{core::MapEntry::value});
+    #t33.{core::Map::[]=}{Invariant}(n1, n1);
+  } =>#t33;
 }
-static method test2<N1 extends Never = Never, N2 extends Never? = Never?, N3 extends core::Null? = core::Null?>(self::test2::N1 n1, self::test2::N2% n2, self::test2::N3% n3) → dynamic {
+static method test2<N1 extends Never = Never, N2 extends Never? = Never?, N3 extends Null = Null>(self::test2::N1 n1, self::test2::N2% n2, self::test2::N3% n3) → dynamic {
   core::List<Never> l1 = block {
-    final core::List<Never> #t40 = <Never>[];
-    for (final Never #t41 in n1)
-      #t40.{core::List::add}(#t41);
-  } =>#t40;
+    final core::List<Never> #t36 = <Never>[];
+    for (final Never #t37 in n1)
+      #t36.{core::List::add}{Invariant}(#t37);
+  } =>#t36;
   core::List<Never> l2 = block {
-    final core::List<Never> #t42 = <Never>[];
-    final core::Iterable<Never>? #t43 = n1;
-    if(!#t43.{core::Object::==}(null))
-      for (final Never #t44 in #t43{core::Iterable<Never>})
-        #t42.{core::List::add}(#t44);
-  } =>#t42;
+    final core::List<Never> #t38 = <Never>[];
+    final core::Iterable<Never>? #t39 = n1;
+    if(!#t39.{core::Object::==}(null))
+      for (final Never #t40 in #t39{core::Iterable<Never>})
+        #t38.{core::List::add}{Invariant}(#t40);
+  } =>#t38;
   core::List<dynamic> l3 = <dynamic>[invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:30:16: Error: Can't spread a value with static type 'N2'.
   var l3 = [...n2];
                ^"];
   core::List<Never> l4 = block {
-    final core::List<Never> #t45 = <Never>[];
-    final core::Iterable<Never>? #t46 = n2;
-    if(!#t46.{core::Object::==}(null))
-      for (final Never #t47 in #t46{core::Iterable<Never>})
-        #t45.{core::List::add}(#t47);
-  } =>#t45;
+    final core::List<Never> #t41 = <Never>[];
+    final core::Iterable<Never>? #t42 = n2;
+    if(!#t42.{core::Object::==}(null))
+      for (final Never #t43 in #t42{core::Iterable<Never>})
+        #t41.{core::List::add}{Invariant}(#t43);
+  } =>#t41;
   core::List<dynamic> l5 = <dynamic>[invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:32:16: Error: Can't spread a value with static type 'N3'.
   var l5 = [...n3];
                ^"];
   core::List<Never> l6 = block {
-    final core::List<Never> #t48 = <Never>[];
-    final core::Iterable<Never>? #t49 = n3;
-    if(!#t49.{core::Object::==}(null))
-      for (final Never #t50 in #t49{core::Iterable<Never>})
-        #t48.{core::List::add}(#t50);
-  } =>#t48;
+    final core::List<Never> #t44 = <Never>[];
+    final core::Iterable<Never>? #t45 = n3;
+    if(!#t45.{core::Object::==}(null))
+      for (final Never #t46 in #t45{core::Iterable<Never>})
+        #t44.{core::List::add}{Invariant}(#t46);
+  } =>#t44;
   core::Set<self::test2::N1> s1 = block {
-    final core::Set<self::test2::N1> #t51 = col::LinkedHashSet::•<self::test2::N1>();
-    for (final self::test2::N1 #t52 in n1)
-      #t51.{core::Set::add}(#t52);
-    #t51.{core::Set::add}(n1);
-  } =>#t51;
+    final core::Set<self::test2::N1> #t47 = col::LinkedHashSet::•<self::test2::N1>();
+    for (final self::test2::N1 #t48 in n1)
+      #t47.{core::Set::add}{Invariant}(#t48);
+    #t47.{core::Set::add}{Invariant}(n1);
+  } =>#t47;
   core::Set<self::test2::N1> s2 = block {
+    final core::Set<self::test2::N1> #t49 = col::LinkedHashSet::•<self::test2::N1>();
+    final core::Iterable<self::test2::N1>? #t50 = n1;
+    if(!#t50.{core::Object::==}(null))
+      for (final self::test2::N1 #t51 in #t50{core::Iterable<self::test2::N1>})
+        #t49.{core::Set::add}{Invariant}(#t51);
+    #t49.{core::Set::add}{Invariant}(n1);
+  } =>#t49;
+  core::Set<dynamic> s3 = block {
+    final core::Set<dynamic> #t52 = col::LinkedHashSet::•<dynamic>();
+    #t52.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:36:16: Error: Can't spread a value with static type 'N2'.
+  var s3 = {...n2, n1};
+               ^");
+    #t52.{core::Set::add}{Invariant}(n1);
+  } =>#t52;
+  core::Set<self::test2::N1> s4 = block {
     final core::Set<self::test2::N1> #t53 = col::LinkedHashSet::•<self::test2::N1>();
-    final core::Iterable<self::test2::N1>? #t54 = n1;
+    final core::Iterable<self::test2::N1>? #t54 = n2;
     if(!#t54.{core::Object::==}(null))
       for (final self::test2::N1 #t55 in #t54{core::Iterable<self::test2::N1>})
-        #t53.{core::Set::add}(#t55);
-    #t53.{core::Set::add}(n1);
+        #t53.{core::Set::add}{Invariant}(#t55);
+    #t53.{core::Set::add}{Invariant}(n1);
   } =>#t53;
-  core::Set<dynamic> s3 = let final core::Set<dynamic> #t56 = col::LinkedHashSet::•<dynamic>() in let final dynamic #t57 = #t56.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:36:16: Error: Can't spread a value with static type 'N2'.
-  var s3 = {...n2, n1};
-               ^") in let final dynamic #t58 = #t56.{core::Set::add}(n1) in #t56;
-  core::Set<self::test2::N1> s4 = block {
-    final core::Set<self::test2::N1> #t59 = col::LinkedHashSet::•<self::test2::N1>();
-    final core::Iterable<self::test2::N1>? #t60 = n2;
-    if(!#t60.{core::Object::==}(null))
-      for (final self::test2::N1 #t61 in #t60{core::Iterable<self::test2::N1>})
-        #t59.{core::Set::add}(#t61);
-    #t59.{core::Set::add}(n1);
-  } =>#t59;
-  core::Set<dynamic> s5 = let final core::Set<dynamic> #t62 = col::LinkedHashSet::•<dynamic>() in let final dynamic #t63 = #t62.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:38:16: Error: Can't spread a value with static type 'N3'.
+  core::Set<dynamic> s5 = block {
+    final core::Set<dynamic> #t56 = col::LinkedHashSet::•<dynamic>();
+    #t56.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:38:16: Error: Can't spread a value with static type 'N3'.
   var s5 = {...n3, n1};
-               ^") in let final dynamic #t64 = #t62.{core::Set::add}(n1) in #t62;
+               ^");
+    #t56.{core::Set::add}{Invariant}(n1);
+  } =>#t56;
   core::Set<self::test2::N1> s6 = block {
-    final core::Set<self::test2::N1> #t65 = col::LinkedHashSet::•<self::test2::N1>();
-    final core::Iterable<self::test2::N1>? #t66 = n3;
-    if(!#t66.{core::Object::==}(null))
-      for (final self::test2::N1 #t67 in #t66{core::Iterable<self::test2::N1>})
-        #t65.{core::Set::add}(#t67);
-    #t65.{core::Set::add}(n1);
-  } =>#t65;
+    final core::Set<self::test2::N1> #t57 = col::LinkedHashSet::•<self::test2::N1>();
+    final core::Iterable<self::test2::N1>? #t58 = n3;
+    if(!#t58.{core::Object::==}(null))
+      for (final self::test2::N1 #t59 in #t58{core::Iterable<self::test2::N1>})
+        #t57.{core::Set::add}{Invariant}(#t59);
+    #t57.{core::Set::add}{Invariant}(n1);
+  } =>#t57;
   core::Map<self::test2::N1, self::test2::N1> m1 = block {
-    final core::Map<self::test2::N1, self::test2::N1> #t68 = <self::test2::N1, self::test2::N1>{};
-    for (final core::MapEntry<self::test2::N1, self::test2::N1> #t69 in n1.{core::Map::entries})
-      #t68.{core::Map::[]=}(#t69.{core::MapEntry::key}, #t69.{core::MapEntry::value});
-    #t68.{core::Map::[]=}(n1, n1);
-  } =>#t68;
+    final core::Map<self::test2::N1, self::test2::N1> #t60 = <self::test2::N1, self::test2::N1>{};
+    for (final core::MapEntry<self::test2::N1, self::test2::N1> #t61 in n1.{core::Map::entries})
+      #t60.{core::Map::[]=}{Invariant}(#t61.{core::MapEntry::key}, #t61.{core::MapEntry::value});
+    #t60.{core::Map::[]=}{Invariant}(n1, n1);
+  } =>#t60;
   core::Map<self::test2::N1, self::test2::N1> m2 = block {
-    final core::Map<self::test2::N1, self::test2::N1> #t70 = <self::test2::N1, self::test2::N1>{};
-    final core::Map<self::test2::N1, self::test2::N1>? #t71 = n1;
-    if(!#t71.{core::Object::==}(null))
-      for (final core::MapEntry<self::test2::N1, self::test2::N1> #t72 in #t71{core::Map<self::test2::N1, self::test2::N1>}.{core::Map::entries})
-        #t70.{core::Map::[]=}(#t72.{core::MapEntry::key}, #t72.{core::MapEntry::value});
-    #t70.{core::Map::[]=}(n1, n1);
-  } =>#t70;
+    final core::Map<self::test2::N1, self::test2::N1> #t62 = <self::test2::N1, self::test2::N1>{};
+    final core::Map<self::test2::N1, self::test2::N1>? #t63 = n1;
+    if(!#t63.{core::Object::==}(null))
+      for (final core::MapEntry<self::test2::N1, self::test2::N1> #t64 in #t63{core::Map<self::test2::N1, self::test2::N1>}.{core::Map::entries})
+        #t62.{core::Map::[]=}{Invariant}(#t64.{core::MapEntry::key}, #t64.{core::MapEntry::value});
+    #t62.{core::Map::[]=}{Invariant}(n1, n1);
+  } =>#t62;
   core::Map<dynamic, dynamic> m3 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:42:16: Error: Can't spread a value with static type 'N2'.
   var m3 = {...n2, n1: n1};
                ^": null, n1: n1};
   core::Map<self::test2::N1, self::test2::N1> m4 = block {
-    final core::Map<self::test2::N1, self::test2::N1> #t73 = <self::test2::N1, self::test2::N1>{};
-    final core::Map<self::test2::N1, self::test2::N1>? #t74 = n2;
-    if(!#t74.{core::Object::==}(null))
-      for (final core::MapEntry<self::test2::N1, self::test2::N1> #t75 in #t74{core::Map<self::test2::N1, self::test2::N1>}.{core::Map::entries})
-        #t73.{core::Map::[]=}(#t75.{core::MapEntry::key}, #t75.{core::MapEntry::value});
-    #t73.{core::Map::[]=}(n1, n1);
-  } =>#t73;
+    final core::Map<self::test2::N1, self::test2::N1> #t65 = <self::test2::N1, self::test2::N1>{};
+    final core::Map<self::test2::N1, self::test2::N1>? #t66 = n2;
+    if(!#t66.{core::Object::==}(null))
+      for (final core::MapEntry<self::test2::N1, self::test2::N1> #t67 in #t66{core::Map<self::test2::N1, self::test2::N1>}.{core::Map::entries})
+        #t65.{core::Map::[]=}{Invariant}(#t67.{core::MapEntry::key}, #t67.{core::MapEntry::value});
+    #t65.{core::Map::[]=}{Invariant}(n1, n1);
+  } =>#t65;
   core::Map<dynamic, dynamic> m5 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:44:16: Error: Can't spread a value with static type 'N3'.
   var m5 = {...n3, n1: n1};
                ^": null, n1: n1};
   core::Map<self::test2::N1, self::test2::N1> m6 = block {
-    final core::Map<self::test2::N1, self::test2::N1> #t76 = <self::test2::N1, self::test2::N1>{};
-    final core::Map<self::test2::N1, self::test2::N1>? #t77 = n3;
-    if(!#t77.{core::Object::==}(null))
-      for (final core::MapEntry<self::test2::N1, self::test2::N1> #t78 in #t77{core::Map<self::test2::N1, self::test2::N1>}.{core::Map::entries})
-        #t76.{core::Map::[]=}(#t78.{core::MapEntry::key}, #t78.{core::MapEntry::value});
-    #t76.{core::Map::[]=}(n1, n1);
-  } =>#t76;
+    final core::Map<self::test2::N1, self::test2::N1> #t68 = <self::test2::N1, self::test2::N1>{};
+    final core::Map<self::test2::N1, self::test2::N1>? #t69 = n3;
+    if(!#t69.{core::Object::==}(null))
+      for (final core::MapEntry<self::test2::N1, self::test2::N1> #t70 in #t69{core::Map<self::test2::N1, self::test2::N1>}.{core::Map::entries})
+        #t68.{core::Map::[]=}{Invariant}(#t70.{core::MapEntry::key}, #t70.{core::MapEntry::value});
+    #t68.{core::Map::[]=}{Invariant}(n1, n1);
+  } =>#t68;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue42758.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue42758.dart.strong.transformed.expect
index 97d6ebf..b4eff37 100644
--- a/pkg/front_end/testcases/nnbd/issue42758.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue42758.dart.strong.transformed.expect
@@ -78,11 +78,11 @@
 import "dart:core" as core;
 import "dart:collection" as col;
 
-static method test1(Never n1, Never? n2, core::Null? n3) → dynamic {
+static method test1(Never n1, Never? n2, Null n3) → dynamic {
   core::List<Never> l1 = block {
     final core::List<Never> #t1 = <Never>[];
     for (final Never #t2 in n1)
-      #t1.{core::List::add}(#t2);
+      #t1.{core::List::add}{Invariant}(#t2);
   } =>#t1;
   core::List<Never> l2 = block {
     final core::List<Never> #t3 = <Never>[];
@@ -91,7 +91,7 @@
       core::Iterator<Never> :sync-for-iterator = #t4{core::Iterable<Never>}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final Never #t5 = :sync-for-iterator.{core::Iterator::current};
-        #t3.{core::List::add}(#t5);
+        #t3.{core::List::add}{Invariant}(#t5);
       }
     }
   } =>#t3;
@@ -105,7 +105,7 @@
       core::Iterator<Never> :sync-for-iterator = #t7{core::Iterable<Never>}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final Never #t8 = :sync-for-iterator.{core::Iterator::current};
-        #t6.{core::List::add}(#t8);
+        #t6.{core::List::add}{Invariant}(#t8);
       }
     }
   } =>#t6;
@@ -119,15 +119,15 @@
       core::Iterator<Never> :sync-for-iterator = #t10{core::Iterable<Never>}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final Never #t11 = :sync-for-iterator.{core::Iterator::current};
-        #t9.{core::List::add}(#t11);
+        #t9.{core::List::add}{Invariant}(#t11);
       }
     }
   } =>#t9;
   core::Set<Never> s1 = block {
     final core::Set<Never> #t12 = new col::_CompactLinkedHashSet::•<Never>();
     for (final Never #t13 in n1)
-      #t12.{core::Set::add}(#t13);
-    #t12.{core::Set::add}(n1);
+      #t12.{core::Set::add}{Invariant}(#t13);
+    #t12.{core::Set::add}{Invariant}(n1);
   } =>#t12;
   core::Set<Never> s2 = block {
     final core::Set<Never> #t14 = new col::_CompactLinkedHashSet::•<Never>();
@@ -136,240 +136,256 @@
       core::Iterator<Never> :sync-for-iterator = #t15{core::Iterable<Never>}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final Never #t16 = :sync-for-iterator.{core::Iterator::current};
-        #t14.{core::Set::add}(#t16);
+        #t14.{core::Set::add}{Invariant}(#t16);
       }
     }
-    #t14.{core::Set::add}(n1);
+    #t14.{core::Set::add}{Invariant}(n1);
   } =>#t14;
-  core::Set<dynamic> s3 = let final core::Set<dynamic> #t17 = new col::_CompactLinkedHashSet::•<dynamic>() in let final core::bool #t18 = #t17.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:14:16: Error: Can't spread a value with static type 'Never?'.
+  core::Set<dynamic> s3 = block {
+    final core::Set<dynamic> #t17 = new col::_CompactLinkedHashSet::•<dynamic>();
+    #t17.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:14:16: Error: Can't spread a value with static type 'Never?'.
   var s3 = {...n2, n1};
-               ^") in let final core::bool #t19 = #t17.{core::Set::add}(n1) in #t17;
+               ^");
+    #t17.{core::Set::add}{Invariant}(n1);
+  } =>#t17;
   core::Set<Never> s4 = block {
-    final core::Set<Never> #t20 = new col::_CompactLinkedHashSet::•<Never>();
-    final core::Iterable<Never>? #t21 = n2;
-    if(!#t21.{core::Object::==}(null)) {
-      core::Iterator<Never> :sync-for-iterator = #t21{core::Iterable<Never>}.{core::Iterable::iterator};
+    final core::Set<Never> #t18 = new col::_CompactLinkedHashSet::•<Never>();
+    final core::Iterable<Never>? #t19 = n2;
+    if(!#t19.{core::Object::==}(null)) {
+      core::Iterator<Never> :sync-for-iterator = #t19{core::Iterable<Never>}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final Never #t22 = :sync-for-iterator.{core::Iterator::current};
-        #t20.{core::Set::add}(#t22);
+        final Never #t20 = :sync-for-iterator.{core::Iterator::current};
+        #t18.{core::Set::add}{Invariant}(#t20);
       }
     }
-    #t20.{core::Set::add}(n1);
-  } =>#t20;
-  core::Set<dynamic> s5 = let final core::Set<dynamic> #t23 = new col::_CompactLinkedHashSet::•<dynamic>() in let final core::bool #t24 = #t23.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:16:16: Error: Can't spread a value with static type 'Null'.
+    #t18.{core::Set::add}{Invariant}(n1);
+  } =>#t18;
+  core::Set<dynamic> s5 = block {
+    final core::Set<dynamic> #t21 = new col::_CompactLinkedHashSet::•<dynamic>();
+    #t21.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:16:16: Error: Can't spread a value with static type 'Null'.
   var s5 = {...n3, n1};
-               ^") in let final core::bool #t25 = #t23.{core::Set::add}(n1) in #t23;
+               ^");
+    #t21.{core::Set::add}{Invariant}(n1);
+  } =>#t21;
   core::Set<Never> s6 = block {
-    final core::Set<Never> #t26 = new col::_CompactLinkedHashSet::•<Never>();
-    final core::Iterable<Never>? #t27 = n3;
-    if(!#t27.{core::Object::==}(null)) {
-      core::Iterator<Never> :sync-for-iterator = #t27{core::Iterable<Never>}.{core::Iterable::iterator};
+    final core::Set<Never> #t22 = new col::_CompactLinkedHashSet::•<Never>();
+    final core::Iterable<Never>? #t23 = n3;
+    if(!#t23.{core::Object::==}(null)) {
+      core::Iterator<Never> :sync-for-iterator = #t23{core::Iterable<Never>}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final Never #t28 = :sync-for-iterator.{core::Iterator::current};
-        #t26.{core::Set::add}(#t28);
+        final Never #t24 = :sync-for-iterator.{core::Iterator::current};
+        #t22.{core::Set::add}{Invariant}(#t24);
       }
     }
-    #t26.{core::Set::add}(n1);
-  } =>#t26;
+    #t22.{core::Set::add}{Invariant}(n1);
+  } =>#t22;
   core::Map<Never, Never> m1 = block {
-    final core::Map<Never, Never> #t29 = <Never, Never>{};
+    final core::Map<Never, Never> #t25 = <Never, Never>{};
     {
       core::Iterator<core::MapEntry<<BottomType>, <BottomType>>> :sync-for-iterator = n1.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::MapEntry<Never, Never> #t30 = :sync-for-iterator.{core::Iterator::current};
-        #t29.{core::Map::[]=}(#t30.{core::MapEntry::key}, #t30.{core::MapEntry::value});
+        final core::MapEntry<Never, Never> #t26 = :sync-for-iterator.{core::Iterator::current};
+        #t25.{core::Map::[]=}{Invariant}(#t26.{core::MapEntry::key}, #t26.{core::MapEntry::value});
       }
     }
-    #t29.{core::Map::[]=}(n1, n1);
-  } =>#t29;
+    #t25.{core::Map::[]=}{Invariant}(n1, n1);
+  } =>#t25;
   core::Map<Never, Never> m2 = block {
-    final core::Map<Never, Never> #t31 = <Never, Never>{};
-    final core::Map<Never, Never>? #t32 = n1;
-    if(!#t32.{core::Object::==}(null)) {
-      core::Iterator<core::MapEntry<Never, Never>> :sync-for-iterator = #t32{core::Map<Never, Never>}.{core::Map::entries}.{core::Iterable::iterator};
+    final core::Map<Never, Never> #t27 = <Never, Never>{};
+    final core::Map<Never, Never>? #t28 = n1;
+    if(!#t28.{core::Object::==}(null)) {
+      core::Iterator<core::MapEntry<Never, Never>> :sync-for-iterator = #t28{core::Map<Never, Never>}.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::MapEntry<Never, Never> #t33 = :sync-for-iterator.{core::Iterator::current};
-        #t31.{core::Map::[]=}(#t33.{core::MapEntry::key}, #t33.{core::MapEntry::value});
+        final core::MapEntry<Never, Never> #t29 = :sync-for-iterator.{core::Iterator::current};
+        #t27.{core::Map::[]=}{Invariant}(#t29.{core::MapEntry::key}, #t29.{core::MapEntry::value});
       }
     }
-    #t31.{core::Map::[]=}(n1, n1);
-  } =>#t31;
+    #t27.{core::Map::[]=}{Invariant}(n1, n1);
+  } =>#t27;
   core::Map<dynamic, dynamic> m3 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:20:16: Error: Can't spread a value with static type 'Never?'.
   var m3 = {...n2, n1: n1};
                ^": null, n1: n1};
   core::Map<Never, Never> m4 = block {
-    final core::Map<Never, Never> #t34 = <Never, Never>{};
-    final core::Map<Never, Never>? #t35 = n2;
-    if(!#t35.{core::Object::==}(null)) {
-      core::Iterator<core::MapEntry<Never, Never>> :sync-for-iterator = #t35{core::Map<Never, Never>}.{core::Map::entries}.{core::Iterable::iterator};
+    final core::Map<Never, Never> #t30 = <Never, Never>{};
+    final core::Map<Never, Never>? #t31 = n2;
+    if(!#t31.{core::Object::==}(null)) {
+      core::Iterator<core::MapEntry<Never, Never>> :sync-for-iterator = #t31{core::Map<Never, Never>}.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::MapEntry<Never, Never> #t36 = :sync-for-iterator.{core::Iterator::current};
-        #t34.{core::Map::[]=}(#t36.{core::MapEntry::key}, #t36.{core::MapEntry::value});
+        final core::MapEntry<Never, Never> #t32 = :sync-for-iterator.{core::Iterator::current};
+        #t30.{core::Map::[]=}{Invariant}(#t32.{core::MapEntry::key}, #t32.{core::MapEntry::value});
       }
     }
-    #t34.{core::Map::[]=}(n1, n1);
-  } =>#t34;
+    #t30.{core::Map::[]=}{Invariant}(n1, n1);
+  } =>#t30;
   core::Map<dynamic, dynamic> m5 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:22:16: Error: Can't spread a value with static type 'Null'.
   var m5 = {...n3, n1: n1};
                ^": null, n1: n1};
   core::Map<Never, Never> m6 = block {
-    final core::Map<Never, Never> #t37 = <Never, Never>{};
-    final core::Map<Never, Never>? #t38 = n3;
-    if(!#t38.{core::Object::==}(null)) {
-      core::Iterator<core::MapEntry<Never, Never>> :sync-for-iterator = #t38{core::Map<Never, Never>}.{core::Map::entries}.{core::Iterable::iterator};
+    final core::Map<Never, Never> #t33 = <Never, Never>{};
+    final core::Map<Never, Never>? #t34 = n3;
+    if(!#t34.{core::Object::==}(null)) {
+      core::Iterator<core::MapEntry<Never, Never>> :sync-for-iterator = #t34{core::Map<Never, Never>}.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::MapEntry<Never, Never> #t39 = :sync-for-iterator.{core::Iterator::current};
-        #t37.{core::Map::[]=}(#t39.{core::MapEntry::key}, #t39.{core::MapEntry::value});
+        final core::MapEntry<Never, Never> #t35 = :sync-for-iterator.{core::Iterator::current};
+        #t33.{core::Map::[]=}{Invariant}(#t35.{core::MapEntry::key}, #t35.{core::MapEntry::value});
       }
     }
-    #t37.{core::Map::[]=}(n1, n1);
-  } =>#t37;
+    #t33.{core::Map::[]=}{Invariant}(n1, n1);
+  } =>#t33;
 }
-static method test2<N1 extends Never = Never, N2 extends Never? = Never?, N3 extends core::Null? = core::Null?>(self::test2::N1 n1, self::test2::N2% n2, self::test2::N3% n3) → dynamic {
+static method test2<N1 extends Never = Never, N2 extends Never? = Never?, N3 extends Null = Null>(self::test2::N1 n1, self::test2::N2% n2, self::test2::N3% n3) → dynamic {
   core::List<Never> l1 = block {
-    final core::List<Never> #t40 = <Never>[];
-    for (final Never #t41 in n1)
-      #t40.{core::List::add}(#t41);
-  } =>#t40;
+    final core::List<Never> #t36 = <Never>[];
+    for (final Never #t37 in n1)
+      #t36.{core::List::add}{Invariant}(#t37);
+  } =>#t36;
   core::List<Never> l2 = block {
-    final core::List<Never> #t42 = <Never>[];
-    final core::Iterable<Never>? #t43 = n1;
-    if(!#t43.{core::Object::==}(null)) {
-      core::Iterator<Never> :sync-for-iterator = #t43{core::Iterable<Never>}.{core::Iterable::iterator};
+    final core::List<Never> #t38 = <Never>[];
+    final core::Iterable<Never>? #t39 = n1;
+    if(!#t39.{core::Object::==}(null)) {
+      core::Iterator<Never> :sync-for-iterator = #t39{core::Iterable<Never>}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final Never #t44 = :sync-for-iterator.{core::Iterator::current};
-        #t42.{core::List::add}(#t44);
+        final Never #t40 = :sync-for-iterator.{core::Iterator::current};
+        #t38.{core::List::add}{Invariant}(#t40);
       }
     }
-  } =>#t42;
+  } =>#t38;
   core::List<dynamic> l3 = <dynamic>[invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:30:16: Error: Can't spread a value with static type 'N2'.
   var l3 = [...n2];
                ^"];
   core::List<Never> l4 = block {
-    final core::List<Never> #t45 = <Never>[];
-    final core::Iterable<Never>? #t46 = n2;
-    if(!#t46.{core::Object::==}(null)) {
-      core::Iterator<Never> :sync-for-iterator = #t46{core::Iterable<Never>}.{core::Iterable::iterator};
+    final core::List<Never> #t41 = <Never>[];
+    final core::Iterable<Never>? #t42 = n2;
+    if(!#t42.{core::Object::==}(null)) {
+      core::Iterator<Never> :sync-for-iterator = #t42{core::Iterable<Never>}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final Never #t47 = :sync-for-iterator.{core::Iterator::current};
-        #t45.{core::List::add}(#t47);
+        final Never #t43 = :sync-for-iterator.{core::Iterator::current};
+        #t41.{core::List::add}{Invariant}(#t43);
       }
     }
-  } =>#t45;
+  } =>#t41;
   core::List<dynamic> l5 = <dynamic>[invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:32:16: Error: Can't spread a value with static type 'N3'.
   var l5 = [...n3];
                ^"];
   core::List<Never> l6 = block {
-    final core::List<Never> #t48 = <Never>[];
-    final core::Iterable<Never>? #t49 = n3;
-    if(!#t49.{core::Object::==}(null)) {
-      core::Iterator<Never> :sync-for-iterator = #t49{core::Iterable<Never>}.{core::Iterable::iterator};
+    final core::List<Never> #t44 = <Never>[];
+    final core::Iterable<Never>? #t45 = n3;
+    if(!#t45.{core::Object::==}(null)) {
+      core::Iterator<Never> :sync-for-iterator = #t45{core::Iterable<Never>}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final Never #t50 = :sync-for-iterator.{core::Iterator::current};
-        #t48.{core::List::add}(#t50);
+        final Never #t46 = :sync-for-iterator.{core::Iterator::current};
+        #t44.{core::List::add}{Invariant}(#t46);
       }
     }
-  } =>#t48;
+  } =>#t44;
   core::Set<self::test2::N1> s1 = block {
-    final core::Set<self::test2::N1> #t51 = new col::_CompactLinkedHashSet::•<self::test2::N1>();
-    for (final self::test2::N1 #t52 in n1)
-      #t51.{core::Set::add}(#t52);
-    #t51.{core::Set::add}(n1);
-  } =>#t51;
+    final core::Set<self::test2::N1> #t47 = new col::_CompactLinkedHashSet::•<self::test2::N1>();
+    for (final self::test2::N1 #t48 in n1)
+      #t47.{core::Set::add}{Invariant}(#t48);
+    #t47.{core::Set::add}{Invariant}(n1);
+  } =>#t47;
   core::Set<self::test2::N1> s2 = block {
+    final core::Set<self::test2::N1> #t49 = new col::_CompactLinkedHashSet::•<self::test2::N1>();
+    final core::Iterable<self::test2::N1>? #t50 = n1;
+    if(!#t50.{core::Object::==}(null)) {
+      core::Iterator<self::test2::N1> :sync-for-iterator = #t50{core::Iterable<self::test2::N1>}.{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final self::test2::N1 #t51 = :sync-for-iterator.{core::Iterator::current};
+        #t49.{core::Set::add}{Invariant}(#t51);
+      }
+    }
+    #t49.{core::Set::add}{Invariant}(n1);
+  } =>#t49;
+  core::Set<dynamic> s3 = block {
+    final core::Set<dynamic> #t52 = new col::_CompactLinkedHashSet::•<dynamic>();
+    #t52.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:36:16: Error: Can't spread a value with static type 'N2'.
+  var s3 = {...n2, n1};
+               ^");
+    #t52.{core::Set::add}{Invariant}(n1);
+  } =>#t52;
+  core::Set<self::test2::N1> s4 = block {
     final core::Set<self::test2::N1> #t53 = new col::_CompactLinkedHashSet::•<self::test2::N1>();
-    final core::Iterable<self::test2::N1>? #t54 = n1;
+    final core::Iterable<self::test2::N1>? #t54 = n2;
     if(!#t54.{core::Object::==}(null)) {
       core::Iterator<self::test2::N1> :sync-for-iterator = #t54{core::Iterable<self::test2::N1>}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final self::test2::N1 #t55 = :sync-for-iterator.{core::Iterator::current};
-        #t53.{core::Set::add}(#t55);
+        #t53.{core::Set::add}{Invariant}(#t55);
       }
     }
-    #t53.{core::Set::add}(n1);
+    #t53.{core::Set::add}{Invariant}(n1);
   } =>#t53;
-  core::Set<dynamic> s3 = let final core::Set<dynamic> #t56 = new col::_CompactLinkedHashSet::•<dynamic>() in let final core::bool #t57 = #t56.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:36:16: Error: Can't spread a value with static type 'N2'.
-  var s3 = {...n2, n1};
-               ^") in let final core::bool #t58 = #t56.{core::Set::add}(n1) in #t56;
-  core::Set<self::test2::N1> s4 = block {
-    final core::Set<self::test2::N1> #t59 = new col::_CompactLinkedHashSet::•<self::test2::N1>();
-    final core::Iterable<self::test2::N1>? #t60 = n2;
-    if(!#t60.{core::Object::==}(null)) {
-      core::Iterator<self::test2::N1> :sync-for-iterator = #t60{core::Iterable<self::test2::N1>}.{core::Iterable::iterator};
-      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final self::test2::N1 #t61 = :sync-for-iterator.{core::Iterator::current};
-        #t59.{core::Set::add}(#t61);
-      }
-    }
-    #t59.{core::Set::add}(n1);
-  } =>#t59;
-  core::Set<dynamic> s5 = let final core::Set<dynamic> #t62 = new col::_CompactLinkedHashSet::•<dynamic>() in let final core::bool #t63 = #t62.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:38:16: Error: Can't spread a value with static type 'N3'.
+  core::Set<dynamic> s5 = block {
+    final core::Set<dynamic> #t56 = new col::_CompactLinkedHashSet::•<dynamic>();
+    #t56.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:38:16: Error: Can't spread a value with static type 'N3'.
   var s5 = {...n3, n1};
-               ^") in let final core::bool #t64 = #t62.{core::Set::add}(n1) in #t62;
+               ^");
+    #t56.{core::Set::add}{Invariant}(n1);
+  } =>#t56;
   core::Set<self::test2::N1> s6 = block {
-    final core::Set<self::test2::N1> #t65 = new col::_CompactLinkedHashSet::•<self::test2::N1>();
-    final core::Iterable<self::test2::N1>? #t66 = n3;
-    if(!#t66.{core::Object::==}(null)) {
-      core::Iterator<self::test2::N1> :sync-for-iterator = #t66{core::Iterable<self::test2::N1>}.{core::Iterable::iterator};
+    final core::Set<self::test2::N1> #t57 = new col::_CompactLinkedHashSet::•<self::test2::N1>();
+    final core::Iterable<self::test2::N1>? #t58 = n3;
+    if(!#t58.{core::Object::==}(null)) {
+      core::Iterator<self::test2::N1> :sync-for-iterator = #t58{core::Iterable<self::test2::N1>}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final self::test2::N1 #t67 = :sync-for-iterator.{core::Iterator::current};
-        #t65.{core::Set::add}(#t67);
+        final self::test2::N1 #t59 = :sync-for-iterator.{core::Iterator::current};
+        #t57.{core::Set::add}{Invariant}(#t59);
       }
     }
-    #t65.{core::Set::add}(n1);
-  } =>#t65;
+    #t57.{core::Set::add}{Invariant}(n1);
+  } =>#t57;
   core::Map<self::test2::N1, self::test2::N1> m1 = block {
-    final core::Map<self::test2::N1, self::test2::N1> #t68 = <self::test2::N1, self::test2::N1>{};
+    final core::Map<self::test2::N1, self::test2::N1> #t60 = <self::test2::N1, self::test2::N1>{};
     {
       core::Iterator<core::MapEntry<<BottomType>, <BottomType>>> :sync-for-iterator = n1.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::MapEntry<self::test2::N1, self::test2::N1> #t69 = :sync-for-iterator.{core::Iterator::current};
-        #t68.{core::Map::[]=}(#t69.{core::MapEntry::key}, #t69.{core::MapEntry::value});
+        final core::MapEntry<self::test2::N1, self::test2::N1> #t61 = :sync-for-iterator.{core::Iterator::current};
+        #t60.{core::Map::[]=}{Invariant}(#t61.{core::MapEntry::key}, #t61.{core::MapEntry::value});
       }
     }
-    #t68.{core::Map::[]=}(n1, n1);
-  } =>#t68;
+    #t60.{core::Map::[]=}{Invariant}(n1, n1);
+  } =>#t60;
   core::Map<self::test2::N1, self::test2::N1> m2 = block {
-    final core::Map<self::test2::N1, self::test2::N1> #t70 = <self::test2::N1, self::test2::N1>{};
-    final core::Map<self::test2::N1, self::test2::N1>? #t71 = n1;
-    if(!#t71.{core::Object::==}(null)) {
-      core::Iterator<core::MapEntry<self::test2::N1, self::test2::N1>> :sync-for-iterator = #t71{core::Map<self::test2::N1, self::test2::N1>}.{core::Map::entries}.{core::Iterable::iterator};
+    final core::Map<self::test2::N1, self::test2::N1> #t62 = <self::test2::N1, self::test2::N1>{};
+    final core::Map<self::test2::N1, self::test2::N1>? #t63 = n1;
+    if(!#t63.{core::Object::==}(null)) {
+      core::Iterator<core::MapEntry<self::test2::N1, self::test2::N1>> :sync-for-iterator = #t63{core::Map<self::test2::N1, self::test2::N1>}.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::MapEntry<self::test2::N1, self::test2::N1> #t72 = :sync-for-iterator.{core::Iterator::current};
-        #t70.{core::Map::[]=}(#t72.{core::MapEntry::key}, #t72.{core::MapEntry::value});
+        final core::MapEntry<self::test2::N1, self::test2::N1> #t64 = :sync-for-iterator.{core::Iterator::current};
+        #t62.{core::Map::[]=}{Invariant}(#t64.{core::MapEntry::key}, #t64.{core::MapEntry::value});
       }
     }
-    #t70.{core::Map::[]=}(n1, n1);
-  } =>#t70;
+    #t62.{core::Map::[]=}{Invariant}(n1, n1);
+  } =>#t62;
   core::Map<dynamic, dynamic> m3 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:42:16: Error: Can't spread a value with static type 'N2'.
   var m3 = {...n2, n1: n1};
                ^": null, n1: n1};
   core::Map<self::test2::N1, self::test2::N1> m4 = block {
-    final core::Map<self::test2::N1, self::test2::N1> #t73 = <self::test2::N1, self::test2::N1>{};
-    final core::Map<self::test2::N1, self::test2::N1>? #t74 = n2;
-    if(!#t74.{core::Object::==}(null)) {
-      core::Iterator<core::MapEntry<self::test2::N1, self::test2::N1>> :sync-for-iterator = #t74{core::Map<self::test2::N1, self::test2::N1>}.{core::Map::entries}.{core::Iterable::iterator};
+    final core::Map<self::test2::N1, self::test2::N1> #t65 = <self::test2::N1, self::test2::N1>{};
+    final core::Map<self::test2::N1, self::test2::N1>? #t66 = n2;
+    if(!#t66.{core::Object::==}(null)) {
+      core::Iterator<core::MapEntry<self::test2::N1, self::test2::N1>> :sync-for-iterator = #t66{core::Map<self::test2::N1, self::test2::N1>}.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::MapEntry<self::test2::N1, self::test2::N1> #t75 = :sync-for-iterator.{core::Iterator::current};
-        #t73.{core::Map::[]=}(#t75.{core::MapEntry::key}, #t75.{core::MapEntry::value});
+        final core::MapEntry<self::test2::N1, self::test2::N1> #t67 = :sync-for-iterator.{core::Iterator::current};
+        #t65.{core::Map::[]=}{Invariant}(#t67.{core::MapEntry::key}, #t67.{core::MapEntry::value});
       }
     }
-    #t73.{core::Map::[]=}(n1, n1);
-  } =>#t73;
+    #t65.{core::Map::[]=}{Invariant}(n1, n1);
+  } =>#t65;
   core::Map<dynamic, dynamic> m5 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:44:16: Error: Can't spread a value with static type 'N3'.
   var m5 = {...n3, n1: n1};
                ^": null, n1: n1};
   core::Map<self::test2::N1, self::test2::N1> m6 = block {
-    final core::Map<self::test2::N1, self::test2::N1> #t76 = <self::test2::N1, self::test2::N1>{};
-    final core::Map<self::test2::N1, self::test2::N1>? #t77 = n3;
-    if(!#t77.{core::Object::==}(null)) {
-      core::Iterator<core::MapEntry<self::test2::N1, self::test2::N1>> :sync-for-iterator = #t77{core::Map<self::test2::N1, self::test2::N1>}.{core::Map::entries}.{core::Iterable::iterator};
+    final core::Map<self::test2::N1, self::test2::N1> #t68 = <self::test2::N1, self::test2::N1>{};
+    final core::Map<self::test2::N1, self::test2::N1>? #t69 = n3;
+    if(!#t69.{core::Object::==}(null)) {
+      core::Iterator<core::MapEntry<self::test2::N1, self::test2::N1>> :sync-for-iterator = #t69{core::Map<self::test2::N1, self::test2::N1>}.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::MapEntry<self::test2::N1, self::test2::N1> #t78 = :sync-for-iterator.{core::Iterator::current};
-        #t76.{core::Map::[]=}(#t78.{core::MapEntry::key}, #t78.{core::MapEntry::value});
+        final core::MapEntry<self::test2::N1, self::test2::N1> #t70 = :sync-for-iterator.{core::Iterator::current};
+        #t68.{core::Map::[]=}{Invariant}(#t70.{core::MapEntry::key}, #t70.{core::MapEntry::value});
       }
     }
-    #t76.{core::Map::[]=}(n1, n1);
-  } =>#t76;
+    #t68.{core::Map::[]=}{Invariant}(n1, n1);
+  } =>#t68;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue42758.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue42758.dart.weak.expect
index ffb6307..5672439 100644
--- a/pkg/front_end/testcases/nnbd/issue42758.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue42758.dart.weak.expect
@@ -79,18 +79,18 @@
 import "dart:_internal" as _in;
 import "dart:collection" as col;
 
-static method test1(Never n1, Never? n2, core::Null? n3) → dynamic {
+static method test1(Never n1, Never? n2, Null n3) → dynamic {
   core::List<Never> l1 = block {
     final core::List<Never> #t1 = <Never>[];
     for (final Never #t2 in let final Never #t3 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."))
-      #t1.{core::List::add}(#t2);
+      #t1.{core::List::add}{Invariant}(#t2);
   } =>#t1;
   core::List<Never> l2 = block {
     final core::List<Never> #t4 = <Never>[];
     final core::Iterable<Never>? #t5 = let final Never #t6 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
     if(!#t5.{core::Object::==}(null))
       for (final Never #t7 in #t5{core::Iterable<Never>})
-        #t4.{core::List::add}(#t7);
+        #t4.{core::List::add}{Invariant}(#t7);
   } =>#t4;
   core::List<dynamic> l3 = <dynamic>[invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:8:16: Error: Can't spread a value with static type 'Never?'.
   var l3 = [...n2];
@@ -100,7 +100,7 @@
     final core::Iterable<Never>? #t9 = n2;
     if(!#t9.{core::Object::==}(null))
       for (final Never #t10 in #t9{core::Iterable<Never>})
-        #t8.{core::List::add}(#t10);
+        #t8.{core::List::add}{Invariant}(#t10);
   } =>#t8;
   core::List<dynamic> l5 = <dynamic>[invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:10:16: Error: Can't spread a value with static type 'Null'.
   var l5 = [...n3];
@@ -110,185 +110,201 @@
     final core::Iterable<Never>? #t12 = n3;
     if(!#t12.{core::Object::==}(null))
       for (final Never #t13 in #t12{core::Iterable<Never>})
-        #t11.{core::List::add}(#t13);
+        #t11.{core::List::add}{Invariant}(#t13);
   } =>#t11;
   core::Set<Never> s1 = block {
     final core::Set<Never> #t14 = col::LinkedHashSet::•<Never>();
     for (final Never #t15 in let final Never #t16 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."))
-      #t14.{core::Set::add}(#t15);
-    #t14.{core::Set::add}(let final Never #t17 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
+      #t14.{core::Set::add}{Invariant}(#t15);
+    #t14.{core::Set::add}{Invariant}(let final Never #t17 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
   } =>#t14;
   core::Set<Never> s2 = block {
     final core::Set<Never> #t18 = col::LinkedHashSet::•<Never>();
     final core::Iterable<Never>? #t19 = let final Never #t20 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
     if(!#t19.{core::Object::==}(null))
       for (final Never #t21 in #t19{core::Iterable<Never>})
-        #t18.{core::Set::add}(#t21);
-    #t18.{core::Set::add}(let final Never #t22 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
+        #t18.{core::Set::add}{Invariant}(#t21);
+    #t18.{core::Set::add}{Invariant}(let final Never #t22 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
   } =>#t18;
-  core::Set<dynamic> s3 = let final core::Set<dynamic> #t23 = col::LinkedHashSet::•<dynamic>() in let final dynamic #t24 = #t23.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:14:16: Error: Can't spread a value with static type 'Never?'.
+  core::Set<dynamic> s3 = block {
+    final core::Set<dynamic> #t23 = col::LinkedHashSet::•<dynamic>();
+    #t23.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:14:16: Error: Can't spread a value with static type 'Never?'.
   var s3 = {...n2, n1};
-               ^") in let final dynamic #t25 = #t23.{core::Set::add}(let final Never #t26 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")) in #t23;
+               ^");
+    #t23.{core::Set::add}{Invariant}(let final Never #t24 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
+  } =>#t23;
   core::Set<Never> s4 = block {
-    final core::Set<Never> #t27 = col::LinkedHashSet::•<Never>();
-    final core::Iterable<Never>? #t28 = n2;
-    if(!#t28.{core::Object::==}(null))
-      for (final Never #t29 in #t28{core::Iterable<Never>})
-        #t27.{core::Set::add}(#t29);
-    #t27.{core::Set::add}(let final Never #t30 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
-  } =>#t27;
-  core::Set<dynamic> s5 = let final core::Set<dynamic> #t31 = col::LinkedHashSet::•<dynamic>() in let final dynamic #t32 = #t31.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:16:16: Error: Can't spread a value with static type 'Null'.
+    final core::Set<Never> #t25 = col::LinkedHashSet::•<Never>();
+    final core::Iterable<Never>? #t26 = n2;
+    if(!#t26.{core::Object::==}(null))
+      for (final Never #t27 in #t26{core::Iterable<Never>})
+        #t25.{core::Set::add}{Invariant}(#t27);
+    #t25.{core::Set::add}{Invariant}(let final Never #t28 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
+  } =>#t25;
+  core::Set<dynamic> s5 = block {
+    final core::Set<dynamic> #t29 = col::LinkedHashSet::•<dynamic>();
+    #t29.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:16:16: Error: Can't spread a value with static type 'Null'.
   var s5 = {...n3, n1};
-               ^") in let final dynamic #t33 = #t31.{core::Set::add}(let final Never #t34 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")) in #t31;
+               ^");
+    #t29.{core::Set::add}{Invariant}(let final Never #t30 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
+  } =>#t29;
   core::Set<Never> s6 = block {
-    final core::Set<Never> #t35 = col::LinkedHashSet::•<Never>();
-    final core::Iterable<Never>? #t36 = n3;
-    if(!#t36.{core::Object::==}(null))
-      for (final Never #t37 in #t36{core::Iterable<Never>})
-        #t35.{core::Set::add}(#t37);
-    #t35.{core::Set::add}(let final Never #t38 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
-  } =>#t35;
+    final core::Set<Never> #t31 = col::LinkedHashSet::•<Never>();
+    final core::Iterable<Never>? #t32 = n3;
+    if(!#t32.{core::Object::==}(null))
+      for (final Never #t33 in #t32{core::Iterable<Never>})
+        #t31.{core::Set::add}{Invariant}(#t33);
+    #t31.{core::Set::add}{Invariant}(let final Never #t34 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
+  } =>#t31;
   core::Map<Never, Never> m1 = block {
-    final core::Map<Never, Never> #t39 = <Never, Never>{};
-    for (final core::MapEntry<Never, Never> #t40 in (let final Never #t41 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).{core::Map::entries})
-      #t39.{core::Map::[]=}(#t40.{core::MapEntry::key}, #t40.{core::MapEntry::value});
-    #t39.{core::Map::[]=}(let final Never #t42 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."), let final Never #t43 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
-  } =>#t39;
+    final core::Map<Never, Never> #t35 = <Never, Never>{};
+    for (final core::MapEntry<Never, Never> #t36 in (let final Never #t37 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).{core::Map::entries})
+      #t35.{core::Map::[]=}{Invariant}(#t36.{core::MapEntry::key}, #t36.{core::MapEntry::value});
+    #t35.{core::Map::[]=}{Invariant}(let final Never #t38 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."), let final Never #t39 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
+  } =>#t35;
   core::Map<Never, Never> m2 = block {
-    final core::Map<Never, Never> #t44 = <Never, Never>{};
-    final core::Map<Never, Never>? #t45 = let final Never #t46 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
-    if(!#t45.{core::Object::==}(null))
-      for (final core::MapEntry<Never, Never> #t47 in #t45{core::Map<Never, Never>}.{core::Map::entries})
-        #t44.{core::Map::[]=}(#t47.{core::MapEntry::key}, #t47.{core::MapEntry::value});
-    #t44.{core::Map::[]=}(let final Never #t48 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."), let final Never #t49 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
-  } =>#t44;
+    final core::Map<Never, Never> #t40 = <Never, Never>{};
+    final core::Map<Never, Never>? #t41 = let final Never #t42 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+    if(!#t41.{core::Object::==}(null))
+      for (final core::MapEntry<Never, Never> #t43 in #t41{core::Map<Never, Never>}.{core::Map::entries})
+        #t40.{core::Map::[]=}{Invariant}(#t43.{core::MapEntry::key}, #t43.{core::MapEntry::value});
+    #t40.{core::Map::[]=}{Invariant}(let final Never #t44 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."), let final Never #t45 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
+  } =>#t40;
   core::Map<dynamic, dynamic> m3 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:20:16: Error: Can't spread a value with static type 'Never?'.
   var m3 = {...n2, n1: n1};
-               ^": null, let final Never #t50 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."): let final Never #t51 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")};
+               ^": null, let final Never #t46 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."): let final Never #t47 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")};
   core::Map<Never, Never> m4 = block {
-    final core::Map<Never, Never> #t52 = <Never, Never>{};
-    final core::Map<Never, Never>? #t53 = n2;
-    if(!#t53.{core::Object::==}(null))
-      for (final core::MapEntry<Never, Never> #t54 in #t53{core::Map<Never, Never>}.{core::Map::entries})
-        #t52.{core::Map::[]=}(#t54.{core::MapEntry::key}, #t54.{core::MapEntry::value});
-    #t52.{core::Map::[]=}(let final Never #t55 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."), let final Never #t56 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
-  } =>#t52;
+    final core::Map<Never, Never> #t48 = <Never, Never>{};
+    final core::Map<Never, Never>? #t49 = n2;
+    if(!#t49.{core::Object::==}(null))
+      for (final core::MapEntry<Never, Never> #t50 in #t49{core::Map<Never, Never>}.{core::Map::entries})
+        #t48.{core::Map::[]=}{Invariant}(#t50.{core::MapEntry::key}, #t50.{core::MapEntry::value});
+    #t48.{core::Map::[]=}{Invariant}(let final Never #t51 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."), let final Never #t52 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
+  } =>#t48;
   core::Map<dynamic, dynamic> m5 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:22:16: Error: Can't spread a value with static type 'Null'.
   var m5 = {...n3, n1: n1};
-               ^": null, let final Never #t57 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."): let final Never #t58 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")};
+               ^": null, let final Never #t53 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."): let final Never #t54 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")};
   core::Map<Never, Never> m6 = block {
-    final core::Map<Never, Never> #t59 = <Never, Never>{};
-    final core::Map<Never, Never>? #t60 = n3;
-    if(!#t60.{core::Object::==}(null))
-      for (final core::MapEntry<Never, Never> #t61 in #t60{core::Map<Never, Never>}.{core::Map::entries})
-        #t59.{core::Map::[]=}(#t61.{core::MapEntry::key}, #t61.{core::MapEntry::value});
-    #t59.{core::Map::[]=}(let final Never #t62 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."), let final Never #t63 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
-  } =>#t59;
+    final core::Map<Never, Never> #t55 = <Never, Never>{};
+    final core::Map<Never, Never>? #t56 = n3;
+    if(!#t56.{core::Object::==}(null))
+      for (final core::MapEntry<Never, Never> #t57 in #t56{core::Map<Never, Never>}.{core::Map::entries})
+        #t55.{core::Map::[]=}{Invariant}(#t57.{core::MapEntry::key}, #t57.{core::MapEntry::value});
+    #t55.{core::Map::[]=}{Invariant}(let final Never #t58 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."), let final Never #t59 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
+  } =>#t55;
 }
-static method test2<N1 extends Never = Never, N2 extends Never? = Never?, N3 extends core::Null? = core::Null?>(self::test2::N1 n1, self::test2::N2% n2, self::test2::N3% n3) → dynamic {
+static method test2<N1 extends Never = Never, N2 extends Never? = Never?, N3 extends Null = Null>(self::test2::N1 n1, self::test2::N2% n2, self::test2::N3% n3) → dynamic {
   core::List<Never> l1 = block {
-    final core::List<Never> #t64 = <Never>[];
-    for (final Never #t65 in let final self::test2::N1 #t66 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."))
-      #t64.{core::List::add}(#t65);
-  } =>#t64;
+    final core::List<Never> #t60 = <Never>[];
+    for (final Never #t61 in let final self::test2::N1 #t62 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."))
+      #t60.{core::List::add}{Invariant}(#t61);
+  } =>#t60;
   core::List<Never> l2 = block {
-    final core::List<Never> #t67 = <Never>[];
-    final core::Iterable<Never>? #t68 = let final self::test2::N1 #t69 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
-    if(!#t68.{core::Object::==}(null))
-      for (final Never #t70 in #t68{core::Iterable<Never>})
-        #t67.{core::List::add}(#t70);
-  } =>#t67;
+    final core::List<Never> #t63 = <Never>[];
+    final core::Iterable<Never>? #t64 = let final self::test2::N1 #t65 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+    if(!#t64.{core::Object::==}(null))
+      for (final Never #t66 in #t64{core::Iterable<Never>})
+        #t63.{core::List::add}{Invariant}(#t66);
+  } =>#t63;
   core::List<dynamic> l3 = <dynamic>[invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:30:16: Error: Can't spread a value with static type 'N2'.
   var l3 = [...n2];
                ^"];
   core::List<Never> l4 = block {
-    final core::List<Never> #t71 = <Never>[];
-    final core::Iterable<Never>? #t72 = n2;
-    if(!#t72.{core::Object::==}(null))
-      for (final Never #t73 in #t72{core::Iterable<Never>})
-        #t71.{core::List::add}(#t73);
-  } =>#t71;
+    final core::List<Never> #t67 = <Never>[];
+    final core::Iterable<Never>? #t68 = n2;
+    if(!#t68.{core::Object::==}(null))
+      for (final Never #t69 in #t68{core::Iterable<Never>})
+        #t67.{core::List::add}{Invariant}(#t69);
+  } =>#t67;
   core::List<dynamic> l5 = <dynamic>[invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:32:16: Error: Can't spread a value with static type 'N3'.
   var l5 = [...n3];
                ^"];
   core::List<Never> l6 = block {
-    final core::List<Never> #t74 = <Never>[];
-    final core::Iterable<Never>? #t75 = n3;
-    if(!#t75.{core::Object::==}(null))
-      for (final Never #t76 in #t75{core::Iterable<Never>})
-        #t74.{core::List::add}(#t76);
-  } =>#t74;
+    final core::List<Never> #t70 = <Never>[];
+    final core::Iterable<Never>? #t71 = n3;
+    if(!#t71.{core::Object::==}(null))
+      for (final Never #t72 in #t71{core::Iterable<Never>})
+        #t70.{core::List::add}{Invariant}(#t72);
+  } =>#t70;
   core::Set<self::test2::N1> s1 = block {
-    final core::Set<self::test2::N1> #t77 = col::LinkedHashSet::•<self::test2::N1>();
-    for (final self::test2::N1 #t78 in let final self::test2::N1 #t79 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."))
-      #t77.{core::Set::add}(#t78);
-    #t77.{core::Set::add}(let final self::test2::N1 #t80 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
-  } =>#t77;
+    final core::Set<self::test2::N1> #t73 = col::LinkedHashSet::•<self::test2::N1>();
+    for (final self::test2::N1 #t74 in let final self::test2::N1 #t75 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."))
+      #t73.{core::Set::add}{Invariant}(#t74);
+    #t73.{core::Set::add}{Invariant}(let final self::test2::N1 #t76 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
+  } =>#t73;
   core::Set<self::test2::N1> s2 = block {
-    final core::Set<self::test2::N1> #t81 = col::LinkedHashSet::•<self::test2::N1>();
-    final core::Iterable<self::test2::N1>? #t82 = let final self::test2::N1 #t83 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
-    if(!#t82.{core::Object::==}(null))
-      for (final self::test2::N1 #t84 in #t82{core::Iterable<self::test2::N1>})
-        #t81.{core::Set::add}(#t84);
-    #t81.{core::Set::add}(let final self::test2::N1 #t85 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
-  } =>#t81;
-  core::Set<dynamic> s3 = let final core::Set<dynamic> #t86 = col::LinkedHashSet::•<dynamic>() in let final dynamic #t87 = #t86.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:36:16: Error: Can't spread a value with static type 'N2'.
+    final core::Set<self::test2::N1> #t77 = col::LinkedHashSet::•<self::test2::N1>();
+    final core::Iterable<self::test2::N1>? #t78 = let final self::test2::N1 #t79 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+    if(!#t78.{core::Object::==}(null))
+      for (final self::test2::N1 #t80 in #t78{core::Iterable<self::test2::N1>})
+        #t77.{core::Set::add}{Invariant}(#t80);
+    #t77.{core::Set::add}{Invariant}(let final self::test2::N1 #t81 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
+  } =>#t77;
+  core::Set<dynamic> s3 = block {
+    final core::Set<dynamic> #t82 = col::LinkedHashSet::•<dynamic>();
+    #t82.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:36:16: Error: Can't spread a value with static type 'N2'.
   var s3 = {...n2, n1};
-               ^") in let final dynamic #t88 = #t86.{core::Set::add}(let final self::test2::N1 #t89 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")) in #t86;
+               ^");
+    #t82.{core::Set::add}{Invariant}(let final self::test2::N1 #t83 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
+  } =>#t82;
   core::Set<self::test2::N1> s4 = block {
+    final core::Set<self::test2::N1> #t84 = col::LinkedHashSet::•<self::test2::N1>();
+    final core::Iterable<self::test2::N1>? #t85 = n2;
+    if(!#t85.{core::Object::==}(null))
+      for (final self::test2::N1 #t86 in #t85{core::Iterable<self::test2::N1>})
+        #t84.{core::Set::add}{Invariant}(#t86);
+    #t84.{core::Set::add}{Invariant}(let final self::test2::N1 #t87 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
+  } =>#t84;
+  core::Set<dynamic> s5 = block {
+    final core::Set<dynamic> #t88 = col::LinkedHashSet::•<dynamic>();
+    #t88.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:38:16: Error: Can't spread a value with static type 'N3'.
+  var s5 = {...n3, n1};
+               ^");
+    #t88.{core::Set::add}{Invariant}(let final self::test2::N1 #t89 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
+  } =>#t88;
+  core::Set<self::test2::N1> s6 = block {
     final core::Set<self::test2::N1> #t90 = col::LinkedHashSet::•<self::test2::N1>();
-    final core::Iterable<self::test2::N1>? #t91 = n2;
+    final core::Iterable<self::test2::N1>? #t91 = n3;
     if(!#t91.{core::Object::==}(null))
       for (final self::test2::N1 #t92 in #t91{core::Iterable<self::test2::N1>})
-        #t90.{core::Set::add}(#t92);
-    #t90.{core::Set::add}(let final self::test2::N1 #t93 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
+        #t90.{core::Set::add}{Invariant}(#t92);
+    #t90.{core::Set::add}{Invariant}(let final self::test2::N1 #t93 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
   } =>#t90;
-  core::Set<dynamic> s5 = let final core::Set<dynamic> #t94 = col::LinkedHashSet::•<dynamic>() in let final dynamic #t95 = #t94.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:38:16: Error: Can't spread a value with static type 'N3'.
-  var s5 = {...n3, n1};
-               ^") in let final dynamic #t96 = #t94.{core::Set::add}(let final self::test2::N1 #t97 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")) in #t94;
-  core::Set<self::test2::N1> s6 = block {
-    final core::Set<self::test2::N1> #t98 = col::LinkedHashSet::•<self::test2::N1>();
-    final core::Iterable<self::test2::N1>? #t99 = n3;
-    if(!#t99.{core::Object::==}(null))
-      for (final self::test2::N1 #t100 in #t99{core::Iterable<self::test2::N1>})
-        #t98.{core::Set::add}(#t100);
-    #t98.{core::Set::add}(let final self::test2::N1 #t101 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
-  } =>#t98;
   core::Map<self::test2::N1, self::test2::N1> m1 = block {
-    final core::Map<self::test2::N1, self::test2::N1> #t102 = <self::test2::N1, self::test2::N1>{};
-    for (final core::MapEntry<self::test2::N1, self::test2::N1> #t103 in (let final self::test2::N1 #t104 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).{core::Map::entries})
-      #t102.{core::Map::[]=}(#t103.{core::MapEntry::key}, #t103.{core::MapEntry::value});
-    #t102.{core::Map::[]=}(let final self::test2::N1 #t105 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."), let final self::test2::N1 #t106 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
-  } =>#t102;
+    final core::Map<self::test2::N1, self::test2::N1> #t94 = <self::test2::N1, self::test2::N1>{};
+    for (final core::MapEntry<self::test2::N1, self::test2::N1> #t95 in (let final self::test2::N1 #t96 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).{core::Map::entries})
+      #t94.{core::Map::[]=}{Invariant}(#t95.{core::MapEntry::key}, #t95.{core::MapEntry::value});
+    #t94.{core::Map::[]=}{Invariant}(let final self::test2::N1 #t97 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."), let final self::test2::N1 #t98 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
+  } =>#t94;
   core::Map<self::test2::N1, self::test2::N1> m2 = block {
-    final core::Map<self::test2::N1, self::test2::N1> #t107 = <self::test2::N1, self::test2::N1>{};
-    final core::Map<self::test2::N1, self::test2::N1>? #t108 = let final self::test2::N1 #t109 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
-    if(!#t108.{core::Object::==}(null))
-      for (final core::MapEntry<self::test2::N1, self::test2::N1> #t110 in #t108{core::Map<self::test2::N1, self::test2::N1>}.{core::Map::entries})
-        #t107.{core::Map::[]=}(#t110.{core::MapEntry::key}, #t110.{core::MapEntry::value});
-    #t107.{core::Map::[]=}(let final self::test2::N1 #t111 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."), let final self::test2::N1 #t112 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
-  } =>#t107;
+    final core::Map<self::test2::N1, self::test2::N1> #t99 = <self::test2::N1, self::test2::N1>{};
+    final core::Map<self::test2::N1, self::test2::N1>? #t100 = let final self::test2::N1 #t101 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+    if(!#t100.{core::Object::==}(null))
+      for (final core::MapEntry<self::test2::N1, self::test2::N1> #t102 in #t100{core::Map<self::test2::N1, self::test2::N1>}.{core::Map::entries})
+        #t99.{core::Map::[]=}{Invariant}(#t102.{core::MapEntry::key}, #t102.{core::MapEntry::value});
+    #t99.{core::Map::[]=}{Invariant}(let final self::test2::N1 #t103 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."), let final self::test2::N1 #t104 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
+  } =>#t99;
   core::Map<dynamic, dynamic> m3 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:42:16: Error: Can't spread a value with static type 'N2'.
   var m3 = {...n2, n1: n1};
-               ^": null, let final self::test2::N1 #t113 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."): let final self::test2::N1 #t114 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")};
+               ^": null, let final self::test2::N1 #t105 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."): let final self::test2::N1 #t106 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")};
   core::Map<self::test2::N1, self::test2::N1> m4 = block {
-    final core::Map<self::test2::N1, self::test2::N1> #t115 = <self::test2::N1, self::test2::N1>{};
-    final core::Map<self::test2::N1, self::test2::N1>? #t116 = n2;
-    if(!#t116.{core::Object::==}(null))
-      for (final core::MapEntry<self::test2::N1, self::test2::N1> #t117 in #t116{core::Map<self::test2::N1, self::test2::N1>}.{core::Map::entries})
-        #t115.{core::Map::[]=}(#t117.{core::MapEntry::key}, #t117.{core::MapEntry::value});
-    #t115.{core::Map::[]=}(let final self::test2::N1 #t118 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."), let final self::test2::N1 #t119 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
-  } =>#t115;
+    final core::Map<self::test2::N1, self::test2::N1> #t107 = <self::test2::N1, self::test2::N1>{};
+    final core::Map<self::test2::N1, self::test2::N1>? #t108 = n2;
+    if(!#t108.{core::Object::==}(null))
+      for (final core::MapEntry<self::test2::N1, self::test2::N1> #t109 in #t108{core::Map<self::test2::N1, self::test2::N1>}.{core::Map::entries})
+        #t107.{core::Map::[]=}{Invariant}(#t109.{core::MapEntry::key}, #t109.{core::MapEntry::value});
+    #t107.{core::Map::[]=}{Invariant}(let final self::test2::N1 #t110 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."), let final self::test2::N1 #t111 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
+  } =>#t107;
   core::Map<dynamic, dynamic> m5 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:44:16: Error: Can't spread a value with static type 'N3'.
   var m5 = {...n3, n1: n1};
-               ^": null, let final self::test2::N1 #t120 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."): let final self::test2::N1 #t121 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")};
+               ^": null, let final self::test2::N1 #t112 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."): let final self::test2::N1 #t113 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")};
   core::Map<self::test2::N1, self::test2::N1> m6 = block {
-    final core::Map<self::test2::N1, self::test2::N1> #t122 = <self::test2::N1, self::test2::N1>{};
-    final core::Map<self::test2::N1, self::test2::N1>? #t123 = n3;
-    if(!#t123.{core::Object::==}(null))
-      for (final core::MapEntry<self::test2::N1, self::test2::N1> #t124 in #t123{core::Map<self::test2::N1, self::test2::N1>}.{core::Map::entries})
-        #t122.{core::Map::[]=}(#t124.{core::MapEntry::key}, #t124.{core::MapEntry::value});
-    #t122.{core::Map::[]=}(let final self::test2::N1 #t125 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."), let final self::test2::N1 #t126 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
-  } =>#t122;
+    final core::Map<self::test2::N1, self::test2::N1> #t114 = <self::test2::N1, self::test2::N1>{};
+    final core::Map<self::test2::N1, self::test2::N1>? #t115 = n3;
+    if(!#t115.{core::Object::==}(null))
+      for (final core::MapEntry<self::test2::N1, self::test2::N1> #t116 in #t115{core::Map<self::test2::N1, self::test2::N1>}.{core::Map::entries})
+        #t114.{core::Map::[]=}{Invariant}(#t116.{core::MapEntry::key}, #t116.{core::MapEntry::value});
+    #t114.{core::Map::[]=}{Invariant}(let final self::test2::N1 #t117 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."), let final self::test2::N1 #t118 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
+  } =>#t114;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue42758.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue42758.dart.weak.transformed.expect
index 1e59eae..3c95716 100644
--- a/pkg/front_end/testcases/nnbd/issue42758.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue42758.dart.weak.transformed.expect
@@ -79,11 +79,11 @@
 import "dart:_internal" as _in;
 import "dart:collection" as col;
 
-static method test1(Never n1, Never? n2, core::Null? n3) → dynamic {
+static method test1(Never n1, Never? n2, Null n3) → dynamic {
   core::List<Never> l1 = block {
     final core::List<Never> #t1 = <Never>[];
     for (final Never #t2 in let final Never #t3 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."))
-      #t1.{core::List::add}(#t2);
+      #t1.{core::List::add}{Invariant}(#t2);
   } =>#t1;
   core::List<Never> l2 = block {
     final core::List<Never> #t4 = <Never>[];
@@ -92,7 +92,7 @@
       core::Iterator<Never> :sync-for-iterator = #t5{core::Iterable<Never>}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final Never #t7 = :sync-for-iterator.{core::Iterator::current};
-        #t4.{core::List::add}(#t7);
+        #t4.{core::List::add}{Invariant}(#t7);
       }
     }
   } =>#t4;
@@ -106,7 +106,7 @@
       core::Iterator<Never> :sync-for-iterator = #t9{core::Iterable<Never>}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final Never #t10 = :sync-for-iterator.{core::Iterator::current};
-        #t8.{core::List::add}(#t10);
+        #t8.{core::List::add}{Invariant}(#t10);
       }
     }
   } =>#t8;
@@ -120,15 +120,15 @@
       core::Iterator<Never> :sync-for-iterator = #t12{core::Iterable<Never>}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final Never #t13 = :sync-for-iterator.{core::Iterator::current};
-        #t11.{core::List::add}(#t13);
+        #t11.{core::List::add}{Invariant}(#t13);
       }
     }
   } =>#t11;
   core::Set<Never> s1 = block {
     final core::Set<Never> #t14 = new col::_CompactLinkedHashSet::•<Never>();
     for (final Never #t15 in let final Never #t16 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."))
-      #t14.{core::Set::add}(#t15);
-    #t14.{core::Set::add}(let final Never #t17 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
+      #t14.{core::Set::add}{Invariant}(#t15);
+    #t14.{core::Set::add}{Invariant}(let final Never #t17 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
   } =>#t14;
   core::Set<Never> s2 = block {
     final core::Set<Never> #t18 = new col::_CompactLinkedHashSet::•<Never>();
@@ -137,240 +137,256 @@
       core::Iterator<Never> :sync-for-iterator = #t19{core::Iterable<Never>}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final Never #t21 = :sync-for-iterator.{core::Iterator::current};
-        #t18.{core::Set::add}(#t21);
+        #t18.{core::Set::add}{Invariant}(#t21);
       }
     }
-    #t18.{core::Set::add}(let final Never #t22 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
+    #t18.{core::Set::add}{Invariant}(let final Never #t22 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
   } =>#t18;
-  core::Set<dynamic> s3 = let final core::Set<dynamic> #t23 = new col::_CompactLinkedHashSet::•<dynamic>() in let final core::bool #t24 = #t23.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:14:16: Error: Can't spread a value with static type 'Never?'.
+  core::Set<dynamic> s3 = block {
+    final core::Set<dynamic> #t23 = new col::_CompactLinkedHashSet::•<dynamic>();
+    #t23.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:14:16: Error: Can't spread a value with static type 'Never?'.
   var s3 = {...n2, n1};
-               ^") in let final core::bool #t25 = #t23.{core::Set::add}(let final Never #t26 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")) in #t23;
+               ^");
+    #t23.{core::Set::add}{Invariant}(let final Never #t24 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
+  } =>#t23;
   core::Set<Never> s4 = block {
-    final core::Set<Never> #t27 = new col::_CompactLinkedHashSet::•<Never>();
-    final core::Iterable<Never>? #t28 = n2;
-    if(!#t28.{core::Object::==}(null)) {
-      core::Iterator<Never> :sync-for-iterator = #t28{core::Iterable<Never>}.{core::Iterable::iterator};
+    final core::Set<Never> #t25 = new col::_CompactLinkedHashSet::•<Never>();
+    final core::Iterable<Never>? #t26 = n2;
+    if(!#t26.{core::Object::==}(null)) {
+      core::Iterator<Never> :sync-for-iterator = #t26{core::Iterable<Never>}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final Never #t29 = :sync-for-iterator.{core::Iterator::current};
-        #t27.{core::Set::add}(#t29);
+        final Never #t27 = :sync-for-iterator.{core::Iterator::current};
+        #t25.{core::Set::add}{Invariant}(#t27);
       }
     }
-    #t27.{core::Set::add}(let final Never #t30 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
-  } =>#t27;
-  core::Set<dynamic> s5 = let final core::Set<dynamic> #t31 = new col::_CompactLinkedHashSet::•<dynamic>() in let final core::bool #t32 = #t31.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:16:16: Error: Can't spread a value with static type 'Null'.
+    #t25.{core::Set::add}{Invariant}(let final Never #t28 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
+  } =>#t25;
+  core::Set<dynamic> s5 = block {
+    final core::Set<dynamic> #t29 = new col::_CompactLinkedHashSet::•<dynamic>();
+    #t29.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:16:16: Error: Can't spread a value with static type 'Null'.
   var s5 = {...n3, n1};
-               ^") in let final core::bool #t33 = #t31.{core::Set::add}(let final Never #t34 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")) in #t31;
+               ^");
+    #t29.{core::Set::add}{Invariant}(let final Never #t30 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
+  } =>#t29;
   core::Set<Never> s6 = block {
-    final core::Set<Never> #t35 = new col::_CompactLinkedHashSet::•<Never>();
-    final core::Iterable<Never>? #t36 = n3;
-    if(!#t36.{core::Object::==}(null)) {
-      core::Iterator<Never> :sync-for-iterator = #t36{core::Iterable<Never>}.{core::Iterable::iterator};
+    final core::Set<Never> #t31 = new col::_CompactLinkedHashSet::•<Never>();
+    final core::Iterable<Never>? #t32 = n3;
+    if(!#t32.{core::Object::==}(null)) {
+      core::Iterator<Never> :sync-for-iterator = #t32{core::Iterable<Never>}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final Never #t37 = :sync-for-iterator.{core::Iterator::current};
-        #t35.{core::Set::add}(#t37);
+        final Never #t33 = :sync-for-iterator.{core::Iterator::current};
+        #t31.{core::Set::add}{Invariant}(#t33);
       }
     }
-    #t35.{core::Set::add}(let final Never #t38 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
-  } =>#t35;
+    #t31.{core::Set::add}{Invariant}(let final Never #t34 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
+  } =>#t31;
   core::Map<Never, Never> m1 = block {
-    final core::Map<Never, Never> #t39 = <Never, Never>{};
+    final core::Map<Never, Never> #t35 = <Never, Never>{};
     {
-      core::Iterator<core::MapEntry<<BottomType>, <BottomType>>> :sync-for-iterator = (let final Never #t40 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).{core::Map::entries}.{core::Iterable::iterator};
+      core::Iterator<core::MapEntry<<BottomType>, <BottomType>>> :sync-for-iterator = (let final Never #t36 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::MapEntry<Never, Never> #t41 = :sync-for-iterator.{core::Iterator::current};
-        #t39.{core::Map::[]=}(#t41.{core::MapEntry::key}, #t41.{core::MapEntry::value});
+        final core::MapEntry<Never, Never> #t37 = :sync-for-iterator.{core::Iterator::current};
+        #t35.{core::Map::[]=}{Invariant}(#t37.{core::MapEntry::key}, #t37.{core::MapEntry::value});
       }
     }
-    #t39.{core::Map::[]=}(let final Never #t42 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."), let final Never #t43 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
-  } =>#t39;
+    #t35.{core::Map::[]=}{Invariant}(let final Never #t38 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."), let final Never #t39 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
+  } =>#t35;
   core::Map<Never, Never> m2 = block {
-    final core::Map<Never, Never> #t44 = <Never, Never>{};
-    final core::Map<Never, Never>? #t45 = let final Never #t46 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
-    if(!#t45.{core::Object::==}(null)) {
-      core::Iterator<core::MapEntry<Never, Never>> :sync-for-iterator = #t45{core::Map<Never, Never>}.{core::Map::entries}.{core::Iterable::iterator};
+    final core::Map<Never, Never> #t40 = <Never, Never>{};
+    final core::Map<Never, Never>? #t41 = let final Never #t42 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+    if(!#t41.{core::Object::==}(null)) {
+      core::Iterator<core::MapEntry<Never, Never>> :sync-for-iterator = #t41{core::Map<Never, Never>}.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::MapEntry<Never, Never> #t47 = :sync-for-iterator.{core::Iterator::current};
-        #t44.{core::Map::[]=}(#t47.{core::MapEntry::key}, #t47.{core::MapEntry::value});
+        final core::MapEntry<Never, Never> #t43 = :sync-for-iterator.{core::Iterator::current};
+        #t40.{core::Map::[]=}{Invariant}(#t43.{core::MapEntry::key}, #t43.{core::MapEntry::value});
       }
     }
-    #t44.{core::Map::[]=}(let final Never #t48 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."), let final Never #t49 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
-  } =>#t44;
+    #t40.{core::Map::[]=}{Invariant}(let final Never #t44 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."), let final Never #t45 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
+  } =>#t40;
   core::Map<dynamic, dynamic> m3 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:20:16: Error: Can't spread a value with static type 'Never?'.
   var m3 = {...n2, n1: n1};
-               ^": null, let final Never #t50 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."): let final Never #t51 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")};
+               ^": null, let final Never #t46 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."): let final Never #t47 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")};
   core::Map<Never, Never> m4 = block {
-    final core::Map<Never, Never> #t52 = <Never, Never>{};
-    final core::Map<Never, Never>? #t53 = n2;
-    if(!#t53.{core::Object::==}(null)) {
-      core::Iterator<core::MapEntry<Never, Never>> :sync-for-iterator = #t53{core::Map<Never, Never>}.{core::Map::entries}.{core::Iterable::iterator};
+    final core::Map<Never, Never> #t48 = <Never, Never>{};
+    final core::Map<Never, Never>? #t49 = n2;
+    if(!#t49.{core::Object::==}(null)) {
+      core::Iterator<core::MapEntry<Never, Never>> :sync-for-iterator = #t49{core::Map<Never, Never>}.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::MapEntry<Never, Never> #t54 = :sync-for-iterator.{core::Iterator::current};
-        #t52.{core::Map::[]=}(#t54.{core::MapEntry::key}, #t54.{core::MapEntry::value});
+        final core::MapEntry<Never, Never> #t50 = :sync-for-iterator.{core::Iterator::current};
+        #t48.{core::Map::[]=}{Invariant}(#t50.{core::MapEntry::key}, #t50.{core::MapEntry::value});
       }
     }
-    #t52.{core::Map::[]=}(let final Never #t55 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."), let final Never #t56 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
-  } =>#t52;
+    #t48.{core::Map::[]=}{Invariant}(let final Never #t51 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."), let final Never #t52 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
+  } =>#t48;
   core::Map<dynamic, dynamic> m5 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:22:16: Error: Can't spread a value with static type 'Null'.
   var m5 = {...n3, n1: n1};
-               ^": null, let final Never #t57 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."): let final Never #t58 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")};
+               ^": null, let final Never #t53 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."): let final Never #t54 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")};
   core::Map<Never, Never> m6 = block {
-    final core::Map<Never, Never> #t59 = <Never, Never>{};
-    final core::Map<Never, Never>? #t60 = n3;
-    if(!#t60.{core::Object::==}(null)) {
-      core::Iterator<core::MapEntry<Never, Never>> :sync-for-iterator = #t60{core::Map<Never, Never>}.{core::Map::entries}.{core::Iterable::iterator};
+    final core::Map<Never, Never> #t55 = <Never, Never>{};
+    final core::Map<Never, Never>? #t56 = n3;
+    if(!#t56.{core::Object::==}(null)) {
+      core::Iterator<core::MapEntry<Never, Never>> :sync-for-iterator = #t56{core::Map<Never, Never>}.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::MapEntry<Never, Never> #t61 = :sync-for-iterator.{core::Iterator::current};
-        #t59.{core::Map::[]=}(#t61.{core::MapEntry::key}, #t61.{core::MapEntry::value});
+        final core::MapEntry<Never, Never> #t57 = :sync-for-iterator.{core::Iterator::current};
+        #t55.{core::Map::[]=}{Invariant}(#t57.{core::MapEntry::key}, #t57.{core::MapEntry::value});
       }
     }
-    #t59.{core::Map::[]=}(let final Never #t62 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."), let final Never #t63 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
-  } =>#t59;
+    #t55.{core::Map::[]=}{Invariant}(let final Never #t58 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."), let final Never #t59 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
+  } =>#t55;
 }
-static method test2<N1 extends Never = Never, N2 extends Never? = Never?, N3 extends core::Null? = core::Null?>(self::test2::N1 n1, self::test2::N2% n2, self::test2::N3% n3) → dynamic {
+static method test2<N1 extends Never = Never, N2 extends Never? = Never?, N3 extends Null = Null>(self::test2::N1 n1, self::test2::N2% n2, self::test2::N3% n3) → dynamic {
   core::List<Never> l1 = block {
-    final core::List<Never> #t64 = <Never>[];
-    for (final Never #t65 in let final self::test2::N1 #t66 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."))
-      #t64.{core::List::add}(#t65);
-  } =>#t64;
+    final core::List<Never> #t60 = <Never>[];
+    for (final Never #t61 in let final self::test2::N1 #t62 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."))
+      #t60.{core::List::add}{Invariant}(#t61);
+  } =>#t60;
   core::List<Never> l2 = block {
-    final core::List<Never> #t67 = <Never>[];
-    final core::Iterable<Never>? #t68 = let final self::test2::N1 #t69 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
-    if(!#t68.{core::Object::==}(null)) {
-      core::Iterator<Never> :sync-for-iterator = #t68{core::Iterable<Never>}.{core::Iterable::iterator};
+    final core::List<Never> #t63 = <Never>[];
+    final core::Iterable<Never>? #t64 = let final self::test2::N1 #t65 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+    if(!#t64.{core::Object::==}(null)) {
+      core::Iterator<Never> :sync-for-iterator = #t64{core::Iterable<Never>}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final Never #t70 = :sync-for-iterator.{core::Iterator::current};
-        #t67.{core::List::add}(#t70);
+        final Never #t66 = :sync-for-iterator.{core::Iterator::current};
+        #t63.{core::List::add}{Invariant}(#t66);
       }
     }
-  } =>#t67;
+  } =>#t63;
   core::List<dynamic> l3 = <dynamic>[invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:30:16: Error: Can't spread a value with static type 'N2'.
   var l3 = [...n2];
                ^"];
   core::List<Never> l4 = block {
-    final core::List<Never> #t71 = <Never>[];
-    final core::Iterable<Never>? #t72 = n2;
-    if(!#t72.{core::Object::==}(null)) {
-      core::Iterator<Never> :sync-for-iterator = #t72{core::Iterable<Never>}.{core::Iterable::iterator};
+    final core::List<Never> #t67 = <Never>[];
+    final core::Iterable<Never>? #t68 = n2;
+    if(!#t68.{core::Object::==}(null)) {
+      core::Iterator<Never> :sync-for-iterator = #t68{core::Iterable<Never>}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final Never #t73 = :sync-for-iterator.{core::Iterator::current};
-        #t71.{core::List::add}(#t73);
+        final Never #t69 = :sync-for-iterator.{core::Iterator::current};
+        #t67.{core::List::add}{Invariant}(#t69);
       }
     }
-  } =>#t71;
+  } =>#t67;
   core::List<dynamic> l5 = <dynamic>[invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:32:16: Error: Can't spread a value with static type 'N3'.
   var l5 = [...n3];
                ^"];
   core::List<Never> l6 = block {
-    final core::List<Never> #t74 = <Never>[];
-    final core::Iterable<Never>? #t75 = n3;
-    if(!#t75.{core::Object::==}(null)) {
-      core::Iterator<Never> :sync-for-iterator = #t75{core::Iterable<Never>}.{core::Iterable::iterator};
+    final core::List<Never> #t70 = <Never>[];
+    final core::Iterable<Never>? #t71 = n3;
+    if(!#t71.{core::Object::==}(null)) {
+      core::Iterator<Never> :sync-for-iterator = #t71{core::Iterable<Never>}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final Never #t76 = :sync-for-iterator.{core::Iterator::current};
-        #t74.{core::List::add}(#t76);
+        final Never #t72 = :sync-for-iterator.{core::Iterator::current};
+        #t70.{core::List::add}{Invariant}(#t72);
       }
     }
-  } =>#t74;
+  } =>#t70;
   core::Set<self::test2::N1> s1 = block {
-    final core::Set<self::test2::N1> #t77 = new col::_CompactLinkedHashSet::•<self::test2::N1>();
-    for (final self::test2::N1 #t78 in let final self::test2::N1 #t79 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."))
-      #t77.{core::Set::add}(#t78);
-    #t77.{core::Set::add}(let final self::test2::N1 #t80 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
-  } =>#t77;
+    final core::Set<self::test2::N1> #t73 = new col::_CompactLinkedHashSet::•<self::test2::N1>();
+    for (final self::test2::N1 #t74 in let final self::test2::N1 #t75 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."))
+      #t73.{core::Set::add}{Invariant}(#t74);
+    #t73.{core::Set::add}{Invariant}(let final self::test2::N1 #t76 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
+  } =>#t73;
   core::Set<self::test2::N1> s2 = block {
-    final core::Set<self::test2::N1> #t81 = new col::_CompactLinkedHashSet::•<self::test2::N1>();
-    final core::Iterable<self::test2::N1>? #t82 = let final self::test2::N1 #t83 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
-    if(!#t82.{core::Object::==}(null)) {
-      core::Iterator<self::test2::N1> :sync-for-iterator = #t82{core::Iterable<self::test2::N1>}.{core::Iterable::iterator};
+    final core::Set<self::test2::N1> #t77 = new col::_CompactLinkedHashSet::•<self::test2::N1>();
+    final core::Iterable<self::test2::N1>? #t78 = let final self::test2::N1 #t79 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+    if(!#t78.{core::Object::==}(null)) {
+      core::Iterator<self::test2::N1> :sync-for-iterator = #t78{core::Iterable<self::test2::N1>}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final self::test2::N1 #t84 = :sync-for-iterator.{core::Iterator::current};
-        #t81.{core::Set::add}(#t84);
+        final self::test2::N1 #t80 = :sync-for-iterator.{core::Iterator::current};
+        #t77.{core::Set::add}{Invariant}(#t80);
       }
     }
-    #t81.{core::Set::add}(let final self::test2::N1 #t85 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
-  } =>#t81;
-  core::Set<dynamic> s3 = let final core::Set<dynamic> #t86 = new col::_CompactLinkedHashSet::•<dynamic>() in let final core::bool #t87 = #t86.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:36:16: Error: Can't spread a value with static type 'N2'.
+    #t77.{core::Set::add}{Invariant}(let final self::test2::N1 #t81 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
+  } =>#t77;
+  core::Set<dynamic> s3 = block {
+    final core::Set<dynamic> #t82 = new col::_CompactLinkedHashSet::•<dynamic>();
+    #t82.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:36:16: Error: Can't spread a value with static type 'N2'.
   var s3 = {...n2, n1};
-               ^") in let final core::bool #t88 = #t86.{core::Set::add}(let final self::test2::N1 #t89 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")) in #t86;
+               ^");
+    #t82.{core::Set::add}{Invariant}(let final self::test2::N1 #t83 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
+  } =>#t82;
   core::Set<self::test2::N1> s4 = block {
+    final core::Set<self::test2::N1> #t84 = new col::_CompactLinkedHashSet::•<self::test2::N1>();
+    final core::Iterable<self::test2::N1>? #t85 = n2;
+    if(!#t85.{core::Object::==}(null)) {
+      core::Iterator<self::test2::N1> :sync-for-iterator = #t85{core::Iterable<self::test2::N1>}.{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final self::test2::N1 #t86 = :sync-for-iterator.{core::Iterator::current};
+        #t84.{core::Set::add}{Invariant}(#t86);
+      }
+    }
+    #t84.{core::Set::add}{Invariant}(let final self::test2::N1 #t87 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
+  } =>#t84;
+  core::Set<dynamic> s5 = block {
+    final core::Set<dynamic> #t88 = new col::_CompactLinkedHashSet::•<dynamic>();
+    #t88.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:38:16: Error: Can't spread a value with static type 'N3'.
+  var s5 = {...n3, n1};
+               ^");
+    #t88.{core::Set::add}{Invariant}(let final self::test2::N1 #t89 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
+  } =>#t88;
+  core::Set<self::test2::N1> s6 = block {
     final core::Set<self::test2::N1> #t90 = new col::_CompactLinkedHashSet::•<self::test2::N1>();
-    final core::Iterable<self::test2::N1>? #t91 = n2;
+    final core::Iterable<self::test2::N1>? #t91 = n3;
     if(!#t91.{core::Object::==}(null)) {
       core::Iterator<self::test2::N1> :sync-for-iterator = #t91{core::Iterable<self::test2::N1>}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final self::test2::N1 #t92 = :sync-for-iterator.{core::Iterator::current};
-        #t90.{core::Set::add}(#t92);
+        #t90.{core::Set::add}{Invariant}(#t92);
       }
     }
-    #t90.{core::Set::add}(let final self::test2::N1 #t93 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
+    #t90.{core::Set::add}{Invariant}(let final self::test2::N1 #t93 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
   } =>#t90;
-  core::Set<dynamic> s5 = let final core::Set<dynamic> #t94 = new col::_CompactLinkedHashSet::•<dynamic>() in let final core::bool #t95 = #t94.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:38:16: Error: Can't spread a value with static type 'N3'.
-  var s5 = {...n3, n1};
-               ^") in let final core::bool #t96 = #t94.{core::Set::add}(let final self::test2::N1 #t97 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")) in #t94;
-  core::Set<self::test2::N1> s6 = block {
-    final core::Set<self::test2::N1> #t98 = new col::_CompactLinkedHashSet::•<self::test2::N1>();
-    final core::Iterable<self::test2::N1>? #t99 = n3;
-    if(!#t99.{core::Object::==}(null)) {
-      core::Iterator<self::test2::N1> :sync-for-iterator = #t99{core::Iterable<self::test2::N1>}.{core::Iterable::iterator};
-      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final self::test2::N1 #t100 = :sync-for-iterator.{core::Iterator::current};
-        #t98.{core::Set::add}(#t100);
-      }
-    }
-    #t98.{core::Set::add}(let final self::test2::N1 #t101 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
-  } =>#t98;
   core::Map<self::test2::N1, self::test2::N1> m1 = block {
-    final core::Map<self::test2::N1, self::test2::N1> #t102 = <self::test2::N1, self::test2::N1>{};
+    final core::Map<self::test2::N1, self::test2::N1> #t94 = <self::test2::N1, self::test2::N1>{};
     {
-      core::Iterator<core::MapEntry<<BottomType>, <BottomType>>> :sync-for-iterator = (let final self::test2::N1 #t103 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).{core::Map::entries}.{core::Iterable::iterator};
+      core::Iterator<core::MapEntry<<BottomType>, <BottomType>>> :sync-for-iterator = (let final self::test2::N1 #t95 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::MapEntry<self::test2::N1, self::test2::N1> #t104 = :sync-for-iterator.{core::Iterator::current};
-        #t102.{core::Map::[]=}(#t104.{core::MapEntry::key}, #t104.{core::MapEntry::value});
+        final core::MapEntry<self::test2::N1, self::test2::N1> #t96 = :sync-for-iterator.{core::Iterator::current};
+        #t94.{core::Map::[]=}{Invariant}(#t96.{core::MapEntry::key}, #t96.{core::MapEntry::value});
       }
     }
-    #t102.{core::Map::[]=}(let final self::test2::N1 #t105 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."), let final self::test2::N1 #t106 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
-  } =>#t102;
+    #t94.{core::Map::[]=}{Invariant}(let final self::test2::N1 #t97 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."), let final self::test2::N1 #t98 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
+  } =>#t94;
   core::Map<self::test2::N1, self::test2::N1> m2 = block {
+    final core::Map<self::test2::N1, self::test2::N1> #t99 = <self::test2::N1, self::test2::N1>{};
+    final core::Map<self::test2::N1, self::test2::N1>? #t100 = let final self::test2::N1 #t101 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+    if(!#t100.{core::Object::==}(null)) {
+      core::Iterator<core::MapEntry<self::test2::N1, self::test2::N1>> :sync-for-iterator = #t100{core::Map<self::test2::N1, self::test2::N1>}.{core::Map::entries}.{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::MapEntry<self::test2::N1, self::test2::N1> #t102 = :sync-for-iterator.{core::Iterator::current};
+        #t99.{core::Map::[]=}{Invariant}(#t102.{core::MapEntry::key}, #t102.{core::MapEntry::value});
+      }
+    }
+    #t99.{core::Map::[]=}{Invariant}(let final self::test2::N1 #t103 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."), let final self::test2::N1 #t104 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
+  } =>#t99;
+  core::Map<dynamic, dynamic> m3 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:42:16: Error: Can't spread a value with static type 'N2'.
+  var m3 = {...n2, n1: n1};
+               ^": null, let final self::test2::N1 #t105 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."): let final self::test2::N1 #t106 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")};
+  core::Map<self::test2::N1, self::test2::N1> m4 = block {
     final core::Map<self::test2::N1, self::test2::N1> #t107 = <self::test2::N1, self::test2::N1>{};
-    final core::Map<self::test2::N1, self::test2::N1>? #t108 = let final self::test2::N1 #t109 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+    final core::Map<self::test2::N1, self::test2::N1>? #t108 = n2;
     if(!#t108.{core::Object::==}(null)) {
       core::Iterator<core::MapEntry<self::test2::N1, self::test2::N1>> :sync-for-iterator = #t108{core::Map<self::test2::N1, self::test2::N1>}.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::MapEntry<self::test2::N1, self::test2::N1> #t110 = :sync-for-iterator.{core::Iterator::current};
-        #t107.{core::Map::[]=}(#t110.{core::MapEntry::key}, #t110.{core::MapEntry::value});
+        final core::MapEntry<self::test2::N1, self::test2::N1> #t109 = :sync-for-iterator.{core::Iterator::current};
+        #t107.{core::Map::[]=}{Invariant}(#t109.{core::MapEntry::key}, #t109.{core::MapEntry::value});
       }
     }
-    #t107.{core::Map::[]=}(let final self::test2::N1 #t111 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."), let final self::test2::N1 #t112 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
+    #t107.{core::Map::[]=}{Invariant}(let final self::test2::N1 #t110 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."), let final self::test2::N1 #t111 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
   } =>#t107;
-  core::Map<dynamic, dynamic> m3 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:42:16: Error: Can't spread a value with static type 'N2'.
-  var m3 = {...n2, n1: n1};
-               ^": null, let final self::test2::N1 #t113 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."): let final self::test2::N1 #t114 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")};
-  core::Map<self::test2::N1, self::test2::N1> m4 = block {
-    final core::Map<self::test2::N1, self::test2::N1> #t115 = <self::test2::N1, self::test2::N1>{};
-    final core::Map<self::test2::N1, self::test2::N1>? #t116 = n2;
-    if(!#t116.{core::Object::==}(null)) {
-      core::Iterator<core::MapEntry<self::test2::N1, self::test2::N1>> :sync-for-iterator = #t116{core::Map<self::test2::N1, self::test2::N1>}.{core::Map::entries}.{core::Iterable::iterator};
-      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::MapEntry<self::test2::N1, self::test2::N1> #t117 = :sync-for-iterator.{core::Iterator::current};
-        #t115.{core::Map::[]=}(#t117.{core::MapEntry::key}, #t117.{core::MapEntry::value});
-      }
-    }
-    #t115.{core::Map::[]=}(let final self::test2::N1 #t118 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."), let final self::test2::N1 #t119 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
-  } =>#t115;
   core::Map<dynamic, dynamic> m5 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:44:16: Error: Can't spread a value with static type 'N3'.
   var m5 = {...n3, n1: n1};
-               ^": null, let final self::test2::N1 #t120 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."): let final self::test2::N1 #t121 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")};
+               ^": null, let final self::test2::N1 #t112 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."): let final self::test2::N1 #t113 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")};
   core::Map<self::test2::N1, self::test2::N1> m6 = block {
-    final core::Map<self::test2::N1, self::test2::N1> #t122 = <self::test2::N1, self::test2::N1>{};
-    final core::Map<self::test2::N1, self::test2::N1>? #t123 = n3;
-    if(!#t123.{core::Object::==}(null)) {
-      core::Iterator<core::MapEntry<self::test2::N1, self::test2::N1>> :sync-for-iterator = #t123{core::Map<self::test2::N1, self::test2::N1>}.{core::Map::entries}.{core::Iterable::iterator};
+    final core::Map<self::test2::N1, self::test2::N1> #t114 = <self::test2::N1, self::test2::N1>{};
+    final core::Map<self::test2::N1, self::test2::N1>? #t115 = n3;
+    if(!#t115.{core::Object::==}(null)) {
+      core::Iterator<core::MapEntry<self::test2::N1, self::test2::N1>> :sync-for-iterator = #t115{core::Map<self::test2::N1, self::test2::N1>}.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::MapEntry<self::test2::N1, self::test2::N1> #t124 = :sync-for-iterator.{core::Iterator::current};
-        #t122.{core::Map::[]=}(#t124.{core::MapEntry::key}, #t124.{core::MapEntry::value});
+        final core::MapEntry<self::test2::N1, self::test2::N1> #t116 = :sync-for-iterator.{core::Iterator::current};
+        #t114.{core::Map::[]=}{Invariant}(#t116.{core::MapEntry::key}, #t116.{core::MapEntry::value});
       }
     }
-    #t122.{core::Map::[]=}(let final self::test2::N1 #t125 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."), let final self::test2::N1 #t126 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
-  } =>#t122;
+    #t114.{core::Map::[]=}{Invariant}(let final self::test2::N1 #t117 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."), let final self::test2::N1 #t118 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
+  } =>#t114;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue43174.dart b/pkg/front_end/testcases/nnbd/issue43174.dart
new file mode 100644
index 0000000..9de8f5d
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43174.dart
@@ -0,0 +1,24 @@
+// Copyright (c) 2020, 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:async';
+
+method(void Function() f) {
+  f();
+}
+
+method2(FutureOr<void> Function() f) {
+  f();
+}
+
+test() {
+  method(() {
+    return 42; // error
+  });
+  method2(() {
+    return 42; // ok
+  });
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/issue43174.dart.outline.expect b/pkg/front_end/testcases/nnbd/issue43174.dart.outline.expect
new file mode 100644
index 0000000..a5d2331
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43174.dart.outline.expect
@@ -0,0 +1,13 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+
+import "dart:async";
+
+static method method(() → void f) → dynamic
+  ;
+static method method2(() → FutureOr<void>f) → dynamic
+  ;
+static method test() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/nnbd/issue43174.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue43174.dart.strong.expect
new file mode 100644
index 0000000..4133b4b
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43174.dart.strong.expect
@@ -0,0 +1,30 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue43174.dart:17:12: Error: Can't return a value from a void function.
+//     return 42; // error
+//            ^
+//
+import self as self;
+import "dart:core" as core;
+
+import "dart:async";
+
+static method method(() → void f) → dynamic {
+  f.call();
+}
+static method method2(() → FutureOr<void>f) → dynamic {
+  f.call();
+}
+static method test() → dynamic {
+  self::method(() → void {
+    return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue43174.dart:17:12: Error: Can't return a value from a void function.
+    return 42; // error
+           ^" in 42;
+  });
+  self::method2(() → core::int {
+    return 42;
+  });
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue43174.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue43174.dart.strong.transformed.expect
new file mode 100644
index 0000000..4133b4b
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43174.dart.strong.transformed.expect
@@ -0,0 +1,30 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue43174.dart:17:12: Error: Can't return a value from a void function.
+//     return 42; // error
+//            ^
+//
+import self as self;
+import "dart:core" as core;
+
+import "dart:async";
+
+static method method(() → void f) → dynamic {
+  f.call();
+}
+static method method2(() → FutureOr<void>f) → dynamic {
+  f.call();
+}
+static method test() → dynamic {
+  self::method(() → void {
+    return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue43174.dart:17:12: Error: Can't return a value from a void function.
+    return 42; // error
+           ^" in 42;
+  });
+  self::method2(() → core::int {
+    return 42;
+  });
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue43174.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd/issue43174.dart.textual_outline.expect
new file mode 100644
index 0000000..af8fe66
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43174.dart.textual_outline.expect
@@ -0,0 +1,6 @@
+import 'dart:async';
+
+method(void Function() f) {}
+method2(FutureOr<void> Function() f) {}
+test() {}
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/issue43174.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/nnbd/issue43174.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..52a9616
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43174.dart.textual_outline_modelled.expect
@@ -0,0 +1,6 @@
+import 'dart:async';
+
+main() {}
+method(void Function() f) {}
+method2(FutureOr<void> Function() f) {}
+test() {}
diff --git a/pkg/front_end/testcases/nnbd/issue43174.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue43174.dart.weak.expect
new file mode 100644
index 0000000..4133b4b
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43174.dart.weak.expect
@@ -0,0 +1,30 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue43174.dart:17:12: Error: Can't return a value from a void function.
+//     return 42; // error
+//            ^
+//
+import self as self;
+import "dart:core" as core;
+
+import "dart:async";
+
+static method method(() → void f) → dynamic {
+  f.call();
+}
+static method method2(() → FutureOr<void>f) → dynamic {
+  f.call();
+}
+static method test() → dynamic {
+  self::method(() → void {
+    return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue43174.dart:17:12: Error: Can't return a value from a void function.
+    return 42; // error
+           ^" in 42;
+  });
+  self::method2(() → core::int {
+    return 42;
+  });
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue43174.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue43174.dart.weak.transformed.expect
new file mode 100644
index 0000000..4133b4b
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43174.dart.weak.transformed.expect
@@ -0,0 +1,30 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue43174.dart:17:12: Error: Can't return a value from a void function.
+//     return 42; // error
+//            ^
+//
+import self as self;
+import "dart:core" as core;
+
+import "dart:async";
+
+static method method(() → void f) → dynamic {
+  f.call();
+}
+static method method2(() → FutureOr<void>f) → dynamic {
+  f.call();
+}
+static method test() → dynamic {
+  self::method(() → void {
+    return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue43174.dart:17:12: Error: Can't return a value from a void function.
+    return 42; // error
+           ^" in 42;
+  });
+  self::method2(() → core::int {
+    return 42;
+  });
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue43211.dart.outline.expect b/pkg/front_end/testcases/nnbd/issue43211.dart.outline.expect
index f9ad8e5..2ff42f4 100644
--- a/pkg/front_end/testcases/nnbd/issue43211.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/issue43211.dart.outline.expect
@@ -112,10 +112,10 @@
   synthetic constructor •() → self::D<self::D::X>
     ;
 }
-class B<X extends self::A<core::Null?>? = self::A<core::Null?>?> extends core::Object implements self::A<self::B::X%> {
+class B<X extends self::A<Null>? = self::A<Null>?> extends core::Object implements self::A<self::B::X%> {
   synthetic constructor •() → self::B<self::B::X%>
     ;
-  method method1<Y extends self::A<core::Null?>? = self::A<core::Null?>?>(self::A<self::B::method1::Y%> a, self::A<self::A<core::Null?>>? b) → void
+  method method1<Y extends self::A<Null>? = self::A<Null>?>(self::A<self::B::method1::Y%> a, self::A<self::A<Null>>? b) → void
     ;
   method method2<Y extends core::String = core::String>(self::D<self::B::method2::Y> a, self::D<core::String>? b) → void
     ;
@@ -124,9 +124,9 @@
   static field dynamic _redirecting# = <dynamic>[self::C::redirect]/*isNullableByDefault*/;
   constructor internal(dynamic _) → self::C
     ;
-  static factory redirect(self::A<self::A<core::Null?>>? a) → self::C
+  static factory redirect(self::A<self::A<Null>>? a) → self::C
     let dynamic #redirecting_factory = self::C::internal in invalid-expression;
-  static factory fact(self::A<self::A<core::Null?>>? a) → self::C
+  static factory fact(self::A<self::A<Null>>? a) → self::C
     ;
 }
 extension Extension1<X extends self::A<X%>? = self::A<dynamic>?> on self::A<X%> {
@@ -135,12 +135,12 @@
   method method2 = self::Extension1|method2;
   tearoff method2 = self::Extension1|get#method2;
 }
-extension ext2<X extends self::A<core::Null?>? = self::A<core::Null?>?> on self::A<X%> {
+extension ext2<X extends self::A<Null>? = self::A<Null>?> on self::A<X%> {
 }
-static method Extension1|method1<X extends self::A<self::Extension1|method1::X%>? = self::A<dynamic>?, Y extends self::A<self::Extension1|method1::Y%>? = self::A<dynamic>?>(final self::A<self::Extension1|method1::X%> #this, self::A<self::Extension1|method1::Y%> a, self::A<self::A<core::Null?>>? b) → void
+static method Extension1|method1<X extends self::A<self::Extension1|method1::X%>? = self::A<dynamic>?, Y extends self::A<self::Extension1|method1::Y%>? = self::A<dynamic>?>(final self::A<self::Extension1|method1::X%> #this, self::A<self::Extension1|method1::Y%> a, self::A<self::A<Null>>? b) → void
   ;
-static method Extension1|get#method1<X extends self::A<self::Extension1|get#method1::X%>? = self::A<dynamic>?>(final self::A<self::Extension1|get#method1::X%> #this) → <Y extends self::A<Y%>? = self::A<dynamic>?>(self::A<Y%>, self::A<self::A<core::Null?>>?) → void
-  return <Y extends self::A<Y%>? = self::A<dynamic>?>(self::A<Y%> a, self::A<self::A<core::Null?>>? b) → void => self::Extension1|method1<self::Extension1|get#method1::X%, Y%>(#this, a, b);
+static method Extension1|get#method1<X extends self::A<self::Extension1|get#method1::X%>? = self::A<dynamic>?>(final self::A<self::Extension1|get#method1::X%> #this) → <Y extends self::A<Y%>? = self::A<dynamic>?>(self::A<Y%>, self::A<self::A<Null>>?) → void
+  return <Y extends self::A<Y%>? = self::A<dynamic>?>(self::A<Y%> a, self::A<self::A<Null>>? b) → void => self::Extension1|method1<self::Extension1|get#method1::X%, Y%>(#this, a, b);
 static method Extension1|method2<X extends self::A<self::Extension1|method2::X%>? = self::A<dynamic>?, Y extends core::String = core::String>(final self::A<self::Extension1|method2::X%> #this, self::D<self::Extension1|method2::Y> a, self::D<core::String>? b) → void
   ;
 static method Extension1|get#method2<X extends self::A<self::Extension1|get#method2::X%>? = self::A<dynamic>?>(final self::A<self::Extension1|get#method2::X%> #this) → <Y extends core::String = core::String>(self::D<Y>, self::D<core::String>?) → void
diff --git a/pkg/front_end/testcases/nnbd/issue43211.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue43211.dart.strong.expect
index 127779c..54f0536 100644
--- a/pkg/front_end/testcases/nnbd/issue43211.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue43211.dart.strong.expect
@@ -207,13 +207,13 @@
     : super core::Object::•()
     ;
 }
-class B<X extends self::A<core::Null?>? = self::A<core::Null?>?> extends core::Object implements self::A<self::B::X%> {
+class B<X extends self::A<Null>? = self::A<Null>?> extends core::Object implements self::A<self::B::X%> {
   synthetic constructor •() → self::B<self::B::X%>
     : super core::Object::•()
     ;
-  method method1<Y extends self::A<core::Null?>? = self::A<core::Null?>?>(self::A<self::B::method1::Y%> a, self::A<self::A<core::Null?>>? b) → void {
+  method method1<Y extends self::A<Null>? = self::A<Null>?>(self::A<self::B::method1::Y%> a, self::A<self::A<Null>>? b) → void {
     self::A<self::B::method1::Y%>? c;
-    self::A<self::A<core::Null?>>? d;
+    self::A<self::A<Null>>? d;
   }
   method method2<Y extends core::String = core::String>(self::D<self::B::method2::Y> a, self::D<core::String>? b) → void {
     self::D<self::B::method2::Y>? c;
@@ -224,13 +224,13 @@
   static field dynamic _redirecting# = <dynamic>[self::C::redirect]/*isNullableByDefault*/;
   constructor internal(dynamic _) → self::C
     : super core::Object::•() {
-    self::A<self::A<core::Null?>>? a;
+    self::A<self::A<Null>>? a;
     self::D<core::String>? b;
   }
-  static factory redirect(self::A<self::A<core::Null?>>? a) → self::C
+  static factory redirect(self::A<self::A<Null>>? a) → self::C
     let dynamic #redirecting_factory = self::C::internal in invalid-expression;
-  static factory fact(self::A<self::A<core::Null?>>? a) → self::C {
-    self::A<self::A<core::Null?>>? b;
+  static factory fact(self::A<self::A<Null>>? a) → self::C {
+    self::A<self::A<Null>>? b;
     self::D<core::String>? c;
     return new self::C::internal(a);
   }
@@ -241,14 +241,14 @@
   method method2 = self::Extension1|method2;
   tearoff method2 = self::Extension1|get#method2;
 }
-extension ext2<X extends self::A<core::Null?>? = self::A<core::Null?>?> on self::A<X%> {
+extension ext2<X extends self::A<Null>? = self::A<Null>?> on self::A<X%> {
 }
-static method Extension1|method1<X extends self::A<self::Extension1|method1::X%>? = self::A<dynamic>?, Y extends self::A<self::Extension1|method1::Y%>? = self::A<dynamic>?>(final self::A<self::Extension1|method1::X%> #this, self::A<self::Extension1|method1::Y%> a, self::A<self::A<core::Null?>>? b) → void {
+static method Extension1|method1<X extends self::A<self::Extension1|method1::X%>? = self::A<dynamic>?, Y extends self::A<self::Extension1|method1::Y%>? = self::A<dynamic>?>(final self::A<self::Extension1|method1::X%> #this, self::A<self::Extension1|method1::Y%> a, self::A<self::A<Null>>? b) → void {
   self::A<self::Extension1|method1::Y%>? c;
-  self::A<self::A<core::Null?>>? d;
+  self::A<self::A<Null>>? d;
 }
-static method Extension1|get#method1<X extends self::A<self::Extension1|get#method1::X%>? = self::A<dynamic>?>(final self::A<self::Extension1|get#method1::X%> #this) → <Y extends self::A<Y%>? = self::A<dynamic>?>(self::A<Y%>, self::A<self::A<core::Null?>>?) → void
-  return <Y extends self::A<Y%>? = self::A<dynamic>?>(self::A<Y%> a, self::A<self::A<core::Null?>>? b) → void => self::Extension1|method1<self::Extension1|get#method1::X%, Y%>(#this, a, b);
+static method Extension1|get#method1<X extends self::A<self::Extension1|get#method1::X%>? = self::A<dynamic>?>(final self::A<self::Extension1|get#method1::X%> #this) → <Y extends self::A<Y%>? = self::A<dynamic>?>(self::A<Y%>, self::A<self::A<Null>>?) → void
+  return <Y extends self::A<Y%>? = self::A<dynamic>?>(self::A<Y%> a, self::A<self::A<Null>>? b) → void => self::Extension1|method1<self::Extension1|get#method1::X%, Y%>(#this, a, b);
 static method Extension1|method2<X extends self::A<self::Extension1|method2::X%>? = self::A<dynamic>?, Y extends core::String = core::String>(final self::A<self::Extension1|method2::X%> #this, self::D<self::Extension1|method2::Y> a, self::D<core::String>? b) → void {
   self::D<self::Extension1|method2::Y>? c;
   self::D<core::String>? d;
@@ -256,6 +256,6 @@
 static method Extension1|get#method2<X extends self::A<self::Extension1|get#method2::X%>? = self::A<dynamic>?>(final self::A<self::Extension1|get#method2::X%> #this) → <Y extends core::String = core::String>(self::D<Y>, self::D<core::String>?) → void
   return <Y extends core::String = core::String>(self::D<Y> a, self::D<core::String>? b) → void => self::Extension1|method2<self::Extension1|get#method2::X%, Y>(#this, a, b);
 static method test() → dynamic {
-  self::A<core::Null?> a = new self::A::•<core::Null?>();
+  self::A<Null> a = new self::A::•<Null>();
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue43211.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue43211.dart.strong.transformed.expect
index 10f7711..e77cc1a 100644
--- a/pkg/front_end/testcases/nnbd/issue43211.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue43211.dart.strong.transformed.expect
@@ -207,13 +207,13 @@
     : super core::Object::•()
     ;
 }
-class B<X extends self::A<core::Null?>? = self::A<core::Null?>?> extends core::Object implements self::A<self::B::X%> {
+class B<X extends self::A<Null>? = self::A<Null>?> extends core::Object implements self::A<self::B::X%> {
   synthetic constructor •() → self::B<self::B::X%>
     : super core::Object::•()
     ;
-  method method1<Y extends self::A<core::Null?>? = self::A<core::Null?>?>(self::A<self::B::method1::Y%> a, self::A<self::A<core::Null?>>? b) → void {
+  method method1<Y extends self::A<Null>? = self::A<Null>?>(self::A<self::B::method1::Y%> a, self::A<self::A<Null>>? b) → void {
     self::A<self::B::method1::Y%>? c;
-    self::A<self::A<core::Null?>>? d;
+    self::A<self::A<Null>>? d;
   }
   method method2<Y extends core::String = core::String>(self::D<self::B::method2::Y> a, self::D<core::String>? b) → void {
     self::D<self::B::method2::Y>? c;
@@ -224,13 +224,13 @@
   static field dynamic _redirecting# = <dynamic>[self::C::redirect]/*isNullableByDefault*/;
   constructor internal(dynamic _) → self::C
     : super core::Object::•() {
-    self::A<self::A<core::Null?>>? a;
+    self::A<self::A<Null>>? a;
     self::D<core::String>? b;
   }
-  static factory redirect(self::A<self::A<core::Null?>>? a) → self::C
+  static factory redirect(self::A<self::A<Null>>? a) → self::C
     let<BottomType> #redirecting_factory = self::C::internal in invalid-expression;
-  static factory fact(self::A<self::A<core::Null?>>? a) → self::C {
-    self::A<self::A<core::Null?>>? b;
+  static factory fact(self::A<self::A<Null>>? a) → self::C {
+    self::A<self::A<Null>>? b;
     self::D<core::String>? c;
     return new self::C::internal(a);
   }
@@ -241,14 +241,14 @@
   method method2 = self::Extension1|method2;
   tearoff method2 = self::Extension1|get#method2;
 }
-extension ext2<X extends self::A<core::Null?>? = self::A<core::Null?>?> on self::A<X%> {
+extension ext2<X extends self::A<Null>? = self::A<Null>?> on self::A<X%> {
 }
-static method Extension1|method1<X extends self::A<self::Extension1|method1::X%>? = self::A<dynamic>?, Y extends self::A<self::Extension1|method1::Y%>? = self::A<dynamic>?>(final self::A<self::Extension1|method1::X%> #this, self::A<self::Extension1|method1::Y%> a, self::A<self::A<core::Null?>>? b) → void {
+static method Extension1|method1<X extends self::A<self::Extension1|method1::X%>? = self::A<dynamic>?, Y extends self::A<self::Extension1|method1::Y%>? = self::A<dynamic>?>(final self::A<self::Extension1|method1::X%> #this, self::A<self::Extension1|method1::Y%> a, self::A<self::A<Null>>? b) → void {
   self::A<self::Extension1|method1::Y%>? c;
-  self::A<self::A<core::Null?>>? d;
+  self::A<self::A<Null>>? d;
 }
-static method Extension1|get#method1<X extends self::A<self::Extension1|get#method1::X%>? = self::A<dynamic>?>(final self::A<self::Extension1|get#method1::X%> #this) → <Y extends self::A<Y%>? = self::A<dynamic>?>(self::A<Y%>, self::A<self::A<core::Null?>>?) → void
-  return <Y extends self::A<Y%>? = self::A<dynamic>?>(self::A<Y%> a, self::A<self::A<core::Null?>>? b) → void => self::Extension1|method1<self::Extension1|get#method1::X%, Y%>(#this, a, b);
+static method Extension1|get#method1<X extends self::A<self::Extension1|get#method1::X%>? = self::A<dynamic>?>(final self::A<self::Extension1|get#method1::X%> #this) → <Y extends self::A<Y%>? = self::A<dynamic>?>(self::A<Y%>, self::A<self::A<Null>>?) → void
+  return <Y extends self::A<Y%>? = self::A<dynamic>?>(self::A<Y%> a, self::A<self::A<Null>>? b) → void => self::Extension1|method1<self::Extension1|get#method1::X%, Y%>(#this, a, b);
 static method Extension1|method2<X extends self::A<self::Extension1|method2::X%>? = self::A<dynamic>?, Y extends core::String = core::String>(final self::A<self::Extension1|method2::X%> #this, self::D<self::Extension1|method2::Y> a, self::D<core::String>? b) → void {
   self::D<self::Extension1|method2::Y>? c;
   self::D<core::String>? d;
@@ -256,6 +256,6 @@
 static method Extension1|get#method2<X extends self::A<self::Extension1|get#method2::X%>? = self::A<dynamic>?>(final self::A<self::Extension1|get#method2::X%> #this) → <Y extends core::String = core::String>(self::D<Y>, self::D<core::String>?) → void
   return <Y extends core::String = core::String>(self::D<Y> a, self::D<core::String>? b) → void => self::Extension1|method2<self::Extension1|get#method2::X%, Y>(#this, a, b);
 static method test() → dynamic {
-  self::A<core::Null?> a = new self::A::•<core::Null?>();
+  self::A<Null> a = new self::A::•<Null>();
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue43211.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue43211.dart.weak.expect
index 127779c..54f0536 100644
--- a/pkg/front_end/testcases/nnbd/issue43211.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue43211.dart.weak.expect
@@ -207,13 +207,13 @@
     : super core::Object::•()
     ;
 }
-class B<X extends self::A<core::Null?>? = self::A<core::Null?>?> extends core::Object implements self::A<self::B::X%> {
+class B<X extends self::A<Null>? = self::A<Null>?> extends core::Object implements self::A<self::B::X%> {
   synthetic constructor •() → self::B<self::B::X%>
     : super core::Object::•()
     ;
-  method method1<Y extends self::A<core::Null?>? = self::A<core::Null?>?>(self::A<self::B::method1::Y%> a, self::A<self::A<core::Null?>>? b) → void {
+  method method1<Y extends self::A<Null>? = self::A<Null>?>(self::A<self::B::method1::Y%> a, self::A<self::A<Null>>? b) → void {
     self::A<self::B::method1::Y%>? c;
-    self::A<self::A<core::Null?>>? d;
+    self::A<self::A<Null>>? d;
   }
   method method2<Y extends core::String = core::String>(self::D<self::B::method2::Y> a, self::D<core::String>? b) → void {
     self::D<self::B::method2::Y>? c;
@@ -224,13 +224,13 @@
   static field dynamic _redirecting# = <dynamic>[self::C::redirect]/*isNullableByDefault*/;
   constructor internal(dynamic _) → self::C
     : super core::Object::•() {
-    self::A<self::A<core::Null?>>? a;
+    self::A<self::A<Null>>? a;
     self::D<core::String>? b;
   }
-  static factory redirect(self::A<self::A<core::Null?>>? a) → self::C
+  static factory redirect(self::A<self::A<Null>>? a) → self::C
     let dynamic #redirecting_factory = self::C::internal in invalid-expression;
-  static factory fact(self::A<self::A<core::Null?>>? a) → self::C {
-    self::A<self::A<core::Null?>>? b;
+  static factory fact(self::A<self::A<Null>>? a) → self::C {
+    self::A<self::A<Null>>? b;
     self::D<core::String>? c;
     return new self::C::internal(a);
   }
@@ -241,14 +241,14 @@
   method method2 = self::Extension1|method2;
   tearoff method2 = self::Extension1|get#method2;
 }
-extension ext2<X extends self::A<core::Null?>? = self::A<core::Null?>?> on self::A<X%> {
+extension ext2<X extends self::A<Null>? = self::A<Null>?> on self::A<X%> {
 }
-static method Extension1|method1<X extends self::A<self::Extension1|method1::X%>? = self::A<dynamic>?, Y extends self::A<self::Extension1|method1::Y%>? = self::A<dynamic>?>(final self::A<self::Extension1|method1::X%> #this, self::A<self::Extension1|method1::Y%> a, self::A<self::A<core::Null?>>? b) → void {
+static method Extension1|method1<X extends self::A<self::Extension1|method1::X%>? = self::A<dynamic>?, Y extends self::A<self::Extension1|method1::Y%>? = self::A<dynamic>?>(final self::A<self::Extension1|method1::X%> #this, self::A<self::Extension1|method1::Y%> a, self::A<self::A<Null>>? b) → void {
   self::A<self::Extension1|method1::Y%>? c;
-  self::A<self::A<core::Null?>>? d;
+  self::A<self::A<Null>>? d;
 }
-static method Extension1|get#method1<X extends self::A<self::Extension1|get#method1::X%>? = self::A<dynamic>?>(final self::A<self::Extension1|get#method1::X%> #this) → <Y extends self::A<Y%>? = self::A<dynamic>?>(self::A<Y%>, self::A<self::A<core::Null?>>?) → void
-  return <Y extends self::A<Y%>? = self::A<dynamic>?>(self::A<Y%> a, self::A<self::A<core::Null?>>? b) → void => self::Extension1|method1<self::Extension1|get#method1::X%, Y%>(#this, a, b);
+static method Extension1|get#method1<X extends self::A<self::Extension1|get#method1::X%>? = self::A<dynamic>?>(final self::A<self::Extension1|get#method1::X%> #this) → <Y extends self::A<Y%>? = self::A<dynamic>?>(self::A<Y%>, self::A<self::A<Null>>?) → void
+  return <Y extends self::A<Y%>? = self::A<dynamic>?>(self::A<Y%> a, self::A<self::A<Null>>? b) → void => self::Extension1|method1<self::Extension1|get#method1::X%, Y%>(#this, a, b);
 static method Extension1|method2<X extends self::A<self::Extension1|method2::X%>? = self::A<dynamic>?, Y extends core::String = core::String>(final self::A<self::Extension1|method2::X%> #this, self::D<self::Extension1|method2::Y> a, self::D<core::String>? b) → void {
   self::D<self::Extension1|method2::Y>? c;
   self::D<core::String>? d;
@@ -256,6 +256,6 @@
 static method Extension1|get#method2<X extends self::A<self::Extension1|get#method2::X%>? = self::A<dynamic>?>(final self::A<self::Extension1|get#method2::X%> #this) → <Y extends core::String = core::String>(self::D<Y>, self::D<core::String>?) → void
   return <Y extends core::String = core::String>(self::D<Y> a, self::D<core::String>? b) → void => self::Extension1|method2<self::Extension1|get#method2::X%, Y>(#this, a, b);
 static method test() → dynamic {
-  self::A<core::Null?> a = new self::A::•<core::Null?>();
+  self::A<Null> a = new self::A::•<Null>();
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue43211.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue43211.dart.weak.transformed.expect
index 10f7711..e77cc1a 100644
--- a/pkg/front_end/testcases/nnbd/issue43211.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue43211.dart.weak.transformed.expect
@@ -207,13 +207,13 @@
     : super core::Object::•()
     ;
 }
-class B<X extends self::A<core::Null?>? = self::A<core::Null?>?> extends core::Object implements self::A<self::B::X%> {
+class B<X extends self::A<Null>? = self::A<Null>?> extends core::Object implements self::A<self::B::X%> {
   synthetic constructor •() → self::B<self::B::X%>
     : super core::Object::•()
     ;
-  method method1<Y extends self::A<core::Null?>? = self::A<core::Null?>?>(self::A<self::B::method1::Y%> a, self::A<self::A<core::Null?>>? b) → void {
+  method method1<Y extends self::A<Null>? = self::A<Null>?>(self::A<self::B::method1::Y%> a, self::A<self::A<Null>>? b) → void {
     self::A<self::B::method1::Y%>? c;
-    self::A<self::A<core::Null?>>? d;
+    self::A<self::A<Null>>? d;
   }
   method method2<Y extends core::String = core::String>(self::D<self::B::method2::Y> a, self::D<core::String>? b) → void {
     self::D<self::B::method2::Y>? c;
@@ -224,13 +224,13 @@
   static field dynamic _redirecting# = <dynamic>[self::C::redirect]/*isNullableByDefault*/;
   constructor internal(dynamic _) → self::C
     : super core::Object::•() {
-    self::A<self::A<core::Null?>>? a;
+    self::A<self::A<Null>>? a;
     self::D<core::String>? b;
   }
-  static factory redirect(self::A<self::A<core::Null?>>? a) → self::C
+  static factory redirect(self::A<self::A<Null>>? a) → self::C
     let<BottomType> #redirecting_factory = self::C::internal in invalid-expression;
-  static factory fact(self::A<self::A<core::Null?>>? a) → self::C {
-    self::A<self::A<core::Null?>>? b;
+  static factory fact(self::A<self::A<Null>>? a) → self::C {
+    self::A<self::A<Null>>? b;
     self::D<core::String>? c;
     return new self::C::internal(a);
   }
@@ -241,14 +241,14 @@
   method method2 = self::Extension1|method2;
   tearoff method2 = self::Extension1|get#method2;
 }
-extension ext2<X extends self::A<core::Null?>? = self::A<core::Null?>?> on self::A<X%> {
+extension ext2<X extends self::A<Null>? = self::A<Null>?> on self::A<X%> {
 }
-static method Extension1|method1<X extends self::A<self::Extension1|method1::X%>? = self::A<dynamic>?, Y extends self::A<self::Extension1|method1::Y%>? = self::A<dynamic>?>(final self::A<self::Extension1|method1::X%> #this, self::A<self::Extension1|method1::Y%> a, self::A<self::A<core::Null?>>? b) → void {
+static method Extension1|method1<X extends self::A<self::Extension1|method1::X%>? = self::A<dynamic>?, Y extends self::A<self::Extension1|method1::Y%>? = self::A<dynamic>?>(final self::A<self::Extension1|method1::X%> #this, self::A<self::Extension1|method1::Y%> a, self::A<self::A<Null>>? b) → void {
   self::A<self::Extension1|method1::Y%>? c;
-  self::A<self::A<core::Null?>>? d;
+  self::A<self::A<Null>>? d;
 }
-static method Extension1|get#method1<X extends self::A<self::Extension1|get#method1::X%>? = self::A<dynamic>?>(final self::A<self::Extension1|get#method1::X%> #this) → <Y extends self::A<Y%>? = self::A<dynamic>?>(self::A<Y%>, self::A<self::A<core::Null?>>?) → void
-  return <Y extends self::A<Y%>? = self::A<dynamic>?>(self::A<Y%> a, self::A<self::A<core::Null?>>? b) → void => self::Extension1|method1<self::Extension1|get#method1::X%, Y%>(#this, a, b);
+static method Extension1|get#method1<X extends self::A<self::Extension1|get#method1::X%>? = self::A<dynamic>?>(final self::A<self::Extension1|get#method1::X%> #this) → <Y extends self::A<Y%>? = self::A<dynamic>?>(self::A<Y%>, self::A<self::A<Null>>?) → void
+  return <Y extends self::A<Y%>? = self::A<dynamic>?>(self::A<Y%> a, self::A<self::A<Null>>? b) → void => self::Extension1|method1<self::Extension1|get#method1::X%, Y%>(#this, a, b);
 static method Extension1|method2<X extends self::A<self::Extension1|method2::X%>? = self::A<dynamic>?, Y extends core::String = core::String>(final self::A<self::Extension1|method2::X%> #this, self::D<self::Extension1|method2::Y> a, self::D<core::String>? b) → void {
   self::D<self::Extension1|method2::Y>? c;
   self::D<core::String>? d;
@@ -256,6 +256,6 @@
 static method Extension1|get#method2<X extends self::A<self::Extension1|get#method2::X%>? = self::A<dynamic>?>(final self::A<self::Extension1|get#method2::X%> #this) → <Y extends core::String = core::String>(self::D<Y>, self::D<core::String>?) → void
   return <Y extends core::String = core::String>(self::D<Y> a, self::D<core::String>? b) → void => self::Extension1|method2<self::Extension1|get#method2::X%, Y>(#this, a, b);
 static method test() → dynamic {
-  self::A<core::Null?> a = new self::A::•<core::Null?>();
+  self::A<Null> a = new self::A::•<Null>();
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue43256.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue43256.dart.strong.expect
index c66b4918..d4b69b6 100644
--- a/pkg/front_end/testcases/nnbd/issue43256.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue43256.dart.strong.expect
@@ -58,91 +58,91 @@
 static field core::Map<dynamic, dynamic> map1 = block {
   final core::Map<dynamic, dynamic> #t1 = <dynamic, dynamic>{};
   if(self::i.{core::num::>}(0))
-    #t1.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:16:17: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+    #t1.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:16:17: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
   if (i > 0) ...nullableMap, // error
                 ^", null);
   if(self::i.{core::num::>}(0))
     for (final core::MapEntry<dynamic, dynamic> #t2 in (self::dynamicMap as{TypeError,ForDynamic,ForNonNullableByDefault} core::Map<dynamic, dynamic>).{core::Map::entries})
-      #t1.{core::Map::[]=}(#t2.{core::MapEntry::key}, #t2.{core::MapEntry::value});
+      #t1.{core::Map::[]=}{Invariant}(#t2.{core::MapEntry::key}, #t2.{core::MapEntry::value});
   if(self::i.{core::num::>}(0))
     for (final core::MapEntry<dynamic, dynamic> #t3 in self::nullableMap!.{core::Map::entries})
-      #t1.{core::Map::[]=}(#t3.{core::MapEntry::key}, #t3.{core::MapEntry::value});
+      #t1.{core::Map::[]=}{Invariant}(#t3.{core::MapEntry::key}, #t3.{core::MapEntry::value});
 } =>#t1;
 static field core::Set<dynamic> set1 = block {
   final core::Set<dynamic> #t4 = col::LinkedHashSet::•<dynamic>();
-  #t4.{core::Set::add}(0);
+  #t4.{core::Set::add}{Invariant}(0);
   if(self::i.{core::num::>}(0))
-    #t4.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:23:17: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+    #t4.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:23:17: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
   if (i > 0) ...nullableList, // error
                 ^");
   if(self::i.{core::num::>}(0))
     for (final dynamic #t5 in self::dynamicList as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>)
-      #t4.{core::Set::add}(#t5);
+      #t4.{core::Set::add}{Invariant}(#t5);
   if(self::i.{core::num::>}(0))
     for (final dynamic #t6 in self::nullableList!)
-      #t4.{core::Set::add}(#t6);
+      #t4.{core::Set::add}{Invariant}(#t6);
 } =>#t4;
 static field core::List<dynamic> list1 = block {
   final core::List<dynamic> #t7 = <dynamic>[];
   if(self::i.{core::num::>}(0))
-    #t7.{core::List::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:29:17: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+    #t7.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:29:17: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
   if (i > 0) ...nullableList, // error
                 ^");
   if(self::i.{core::num::>}(0))
     for (final dynamic #t8 in self::dynamicList as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>)
-      #t7.{core::List::add}(#t8);
+      #t7.{core::List::add}{Invariant}(#t8);
   if(self::i.{core::num::>}(0))
     for (final dynamic #t9 in self::nullableList!)
-      #t7.{core::List::add}(#t9);
+      #t7.{core::List::add}{Invariant}(#t9);
 } =>#t7;
 static method testMap<X extends dynamic = dynamic, Y extends core::Map<core::int, core::String>? = core::Map<core::int, core::String>?, Z extends core::Map<core::int, core::String> = core::Map<core::int, core::String>>(self::testMap::X% x, self::testMap::Y% y, self::testMap::Z z) → dynamic {
   core::Map<dynamic, dynamic> map2 = block {
     final core::Map<dynamic, dynamic> #t10 = <dynamic, dynamic>{};
     if(self::i.{core::num::>}(0))
-      #t10.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:37:19: Error: Unexpected type 'X' of a map spread entry.  Expected 'dynamic' or a Map.
+      #t10.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:37:19: Error: Unexpected type 'X' of a map spread entry.  Expected 'dynamic' or a Map.
     if (i > 0) ...x, // error
                   ^", null);
     if(self::i.{core::num::>}(0))
-      #t10.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:38:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      #t10.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:38:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     if (i > 0) ...y, // error
                   ^", null);
     if(self::i.{core::num::>}(0))
       for (final core::MapEntry<dynamic, dynamic> #t11 in z.{core::Map::entries})
-        #t10.{core::Map::[]=}(#t11.{core::MapEntry::key}, #t11.{core::MapEntry::value});
+        #t10.{core::Map::[]=}{Invariant}(#t11.{core::MapEntry::key}, #t11.{core::MapEntry::value});
     if(self::i.{core::num::>}(0))
       for (final core::MapEntry<dynamic, dynamic> #t12 in y!.{core::Map::entries})
-        #t10.{core::Map::[]=}(#t12.{core::MapEntry::key}, #t12.{core::MapEntry::value});
+        #t10.{core::Map::[]=}{Invariant}(#t12.{core::MapEntry::key}, #t12.{core::MapEntry::value});
   } =>#t10;
 }
 static method testIterables<X extends dynamic = dynamic, Y extends core::List<core::int>? = core::List<core::int>?, Z extends core::List<core::int> = core::List<core::int>>(self::testIterables::X% x, self::testIterables::Y% y, self::testIterables::Z z) → dynamic {
   core::Set<dynamic> set2 = block {
     final core::Set<dynamic> #t13 = col::LinkedHashSet::•<dynamic>();
-    #t13.{core::Set::add}(0);
+    #t13.{core::Set::add}{Invariant}(0);
     if(self::i.{core::num::>}(0))
-      #t13.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:48:19: Error: Unexpected type 'X' of a spread.  Expected 'dynamic' or an Iterable.
+      #t13.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:48:19: Error: Unexpected type 'X' of a spread.  Expected 'dynamic' or an Iterable.
     if (i > 0) ...x, // error
                   ^");
     if(self::i.{core::num::>}(0))
-      #t13.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:49:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      #t13.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:49:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     if (i > 0) ...y, // error
                   ^");
     if(self::i.{core::num::>}(0))
       for (final dynamic #t14 in z)
-        #t13.{core::Set::add}(#t14);
+        #t13.{core::Set::add}{Invariant}(#t14);
   } =>#t13;
   core::List<dynamic> list2 = block {
     final core::List<dynamic> #t15 = <dynamic>[];
     if(self::i.{core::num::>}(0))
-      #t15.{core::List::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:53:19: Error: Unexpected type 'X' of a spread.  Expected 'dynamic' or an Iterable.
+      #t15.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:53:19: Error: Unexpected type 'X' of a spread.  Expected 'dynamic' or an Iterable.
     if (i > 0) ...x, // error
                   ^");
     if(self::i.{core::num::>}(0))
-      #t15.{core::List::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:54:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      #t15.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:54:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     if (i > 0) ...y, // error
                   ^");
     if(self::i.{core::num::>}(0))
       for (final dynamic #t16 in z)
-        #t15.{core::List::add}(#t16);
+        #t15.{core::List::add}{Invariant}(#t16);
   } =>#t15;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue43256.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue43256.dart.strong.transformed.expect
index 32a8e8e..7babee3 100644
--- a/pkg/front_end/testcases/nnbd/issue43256.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue43256.dart.strong.transformed.expect
@@ -58,64 +58,64 @@
 static field core::Map<dynamic, dynamic> map1 = block {
   final core::Map<dynamic, dynamic> #t1 = <dynamic, dynamic>{};
   if(self::i.{core::num::>}(0))
-    #t1.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:16:17: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+    #t1.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:16:17: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
   if (i > 0) ...nullableMap, // error
                 ^", null);
   if(self::i.{core::num::>}(0)) {
     core::Iterator<core::MapEntry<dynamic, dynamic>> :sync-for-iterator = (self::dynamicMap as{TypeError,ForDynamic,ForNonNullableByDefault} core::Map<dynamic, dynamic>).{core::Map::entries}.{core::Iterable::iterator};
     for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
       final core::MapEntry<dynamic, dynamic> #t2 = :sync-for-iterator.{core::Iterator::current};
-      #t1.{core::Map::[]=}(#t2.{core::MapEntry::key}, #t2.{core::MapEntry::value});
+      #t1.{core::Map::[]=}{Invariant}(#t2.{core::MapEntry::key}, #t2.{core::MapEntry::value});
     }
   }
   if(self::i.{core::num::>}(0)) {
     core::Iterator<core::MapEntry<core::int, core::String>> :sync-for-iterator = self::nullableMap!.{core::Map::entries}.{core::Iterable::iterator};
     for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
       final core::MapEntry<dynamic, dynamic> #t3 = :sync-for-iterator.{core::Iterator::current};
-      #t1.{core::Map::[]=}(#t3.{core::MapEntry::key}, #t3.{core::MapEntry::value});
+      #t1.{core::Map::[]=}{Invariant}(#t3.{core::MapEntry::key}, #t3.{core::MapEntry::value});
     }
   }
 } =>#t1;
 static field core::Set<dynamic> set1 = block {
   final core::Set<dynamic> #t4 = new col::_CompactLinkedHashSet::•<dynamic>();
-  #t4.{core::Set::add}(0);
+  #t4.{core::Set::add}{Invariant}(0);
   if(self::i.{core::num::>}(0))
-    #t4.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:23:17: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+    #t4.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:23:17: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
   if (i > 0) ...nullableList, // error
                 ^");
   if(self::i.{core::num::>}(0)) {
     core::Iterator<dynamic> :sync-for-iterator = (self::dynamicList as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>).{core::Iterable::iterator};
     for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
       final dynamic #t5 = :sync-for-iterator.{core::Iterator::current};
-      #t4.{core::Set::add}(#t5);
+      #t4.{core::Set::add}{Invariant}(#t5);
     }
   }
   if(self::i.{core::num::>}(0)) {
     core::Iterator<core::int> :sync-for-iterator = self::nullableList!.{core::Iterable::iterator};
     for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
       final dynamic #t6 = :sync-for-iterator.{core::Iterator::current};
-      #t4.{core::Set::add}(#t6);
+      #t4.{core::Set::add}{Invariant}(#t6);
     }
   }
 } =>#t4;
 static field core::List<dynamic> list1 = block {
   final core::List<dynamic> #t7 = <dynamic>[];
   if(self::i.{core::num::>}(0))
-    #t7.{core::List::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:29:17: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+    #t7.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:29:17: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
   if (i > 0) ...nullableList, // error
                 ^");
   if(self::i.{core::num::>}(0)) {
     core::Iterator<dynamic> :sync-for-iterator = (self::dynamicList as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>).{core::Iterable::iterator};
     for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
       final dynamic #t8 = :sync-for-iterator.{core::Iterator::current};
-      #t7.{core::List::add}(#t8);
+      #t7.{core::List::add}{Invariant}(#t8);
     }
   }
   if(self::i.{core::num::>}(0)) {
     core::Iterator<core::int> :sync-for-iterator = self::nullableList!.{core::Iterable::iterator};
     for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
       final dynamic #t9 = :sync-for-iterator.{core::Iterator::current};
-      #t7.{core::List::add}(#t9);
+      #t7.{core::List::add}{Invariant}(#t9);
     }
   }
 } =>#t7;
@@ -123,25 +123,25 @@
   core::Map<dynamic, dynamic> map2 = block {
     final core::Map<dynamic, dynamic> #t10 = <dynamic, dynamic>{};
     if(self::i.{core::num::>}(0))
-      #t10.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:37:19: Error: Unexpected type 'X' of a map spread entry.  Expected 'dynamic' or a Map.
+      #t10.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:37:19: Error: Unexpected type 'X' of a map spread entry.  Expected 'dynamic' or a Map.
     if (i > 0) ...x, // error
                   ^", null);
     if(self::i.{core::num::>}(0))
-      #t10.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:38:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      #t10.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:38:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     if (i > 0) ...y, // error
                   ^", null);
     if(self::i.{core::num::>}(0)) {
       core::Iterator<core::MapEntry<core::int, core::String>> :sync-for-iterator = z.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::MapEntry<dynamic, dynamic> #t11 = :sync-for-iterator.{core::Iterator::current};
-        #t10.{core::Map::[]=}(#t11.{core::MapEntry::key}, #t11.{core::MapEntry::value});
+        #t10.{core::Map::[]=}{Invariant}(#t11.{core::MapEntry::key}, #t11.{core::MapEntry::value});
       }
     }
     if(self::i.{core::num::>}(0)) {
       core::Iterator<core::MapEntry<core::int, core::String>> :sync-for-iterator = y!.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::MapEntry<dynamic, dynamic> #t12 = :sync-for-iterator.{core::Iterator::current};
-        #t10.{core::Map::[]=}(#t12.{core::MapEntry::key}, #t12.{core::MapEntry::value});
+        #t10.{core::Map::[]=}{Invariant}(#t12.{core::MapEntry::key}, #t12.{core::MapEntry::value});
       }
     }
   } =>#t10;
@@ -149,38 +149,38 @@
 static method testIterables<X extends dynamic = dynamic, Y extends core::List<core::int>? = core::List<core::int>?, Z extends core::List<core::int> = core::List<core::int>>(self::testIterables::X% x, self::testIterables::Y% y, self::testIterables::Z z) → dynamic {
   core::Set<dynamic> set2 = block {
     final core::Set<dynamic> #t13 = new col::_CompactLinkedHashSet::•<dynamic>();
-    #t13.{core::Set::add}(0);
+    #t13.{core::Set::add}{Invariant}(0);
     if(self::i.{core::num::>}(0))
-      #t13.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:48:19: Error: Unexpected type 'X' of a spread.  Expected 'dynamic' or an Iterable.
+      #t13.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:48:19: Error: Unexpected type 'X' of a spread.  Expected 'dynamic' or an Iterable.
     if (i > 0) ...x, // error
                   ^");
     if(self::i.{core::num::>}(0))
-      #t13.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:49:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      #t13.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:49:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     if (i > 0) ...y, // error
                   ^");
     if(self::i.{core::num::>}(0)) {
       core::Iterator<core::int> :sync-for-iterator = z.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final dynamic #t14 = :sync-for-iterator.{core::Iterator::current};
-        #t13.{core::Set::add}(#t14);
+        #t13.{core::Set::add}{Invariant}(#t14);
       }
     }
   } =>#t13;
   core::List<dynamic> list2 = block {
     final core::List<dynamic> #t15 = <dynamic>[];
     if(self::i.{core::num::>}(0))
-      #t15.{core::List::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:53:19: Error: Unexpected type 'X' of a spread.  Expected 'dynamic' or an Iterable.
+      #t15.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:53:19: Error: Unexpected type 'X' of a spread.  Expected 'dynamic' or an Iterable.
     if (i > 0) ...x, // error
                   ^");
     if(self::i.{core::num::>}(0))
-      #t15.{core::List::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:54:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      #t15.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:54:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     if (i > 0) ...y, // error
                   ^");
     if(self::i.{core::num::>}(0)) {
       core::Iterator<core::int> :sync-for-iterator = z.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final dynamic #t16 = :sync-for-iterator.{core::Iterator::current};
-        #t15.{core::List::add}(#t16);
+        #t15.{core::List::add}{Invariant}(#t16);
       }
     }
   } =>#t15;
diff --git a/pkg/front_end/testcases/nnbd/issue43256.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue43256.dart.weak.expect
index c66b4918..d4b69b6 100644
--- a/pkg/front_end/testcases/nnbd/issue43256.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue43256.dart.weak.expect
@@ -58,91 +58,91 @@
 static field core::Map<dynamic, dynamic> map1 = block {
   final core::Map<dynamic, dynamic> #t1 = <dynamic, dynamic>{};
   if(self::i.{core::num::>}(0))
-    #t1.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:16:17: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+    #t1.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:16:17: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
   if (i > 0) ...nullableMap, // error
                 ^", null);
   if(self::i.{core::num::>}(0))
     for (final core::MapEntry<dynamic, dynamic> #t2 in (self::dynamicMap as{TypeError,ForDynamic,ForNonNullableByDefault} core::Map<dynamic, dynamic>).{core::Map::entries})
-      #t1.{core::Map::[]=}(#t2.{core::MapEntry::key}, #t2.{core::MapEntry::value});
+      #t1.{core::Map::[]=}{Invariant}(#t2.{core::MapEntry::key}, #t2.{core::MapEntry::value});
   if(self::i.{core::num::>}(0))
     for (final core::MapEntry<dynamic, dynamic> #t3 in self::nullableMap!.{core::Map::entries})
-      #t1.{core::Map::[]=}(#t3.{core::MapEntry::key}, #t3.{core::MapEntry::value});
+      #t1.{core::Map::[]=}{Invariant}(#t3.{core::MapEntry::key}, #t3.{core::MapEntry::value});
 } =>#t1;
 static field core::Set<dynamic> set1 = block {
   final core::Set<dynamic> #t4 = col::LinkedHashSet::•<dynamic>();
-  #t4.{core::Set::add}(0);
+  #t4.{core::Set::add}{Invariant}(0);
   if(self::i.{core::num::>}(0))
-    #t4.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:23:17: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+    #t4.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:23:17: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
   if (i > 0) ...nullableList, // error
                 ^");
   if(self::i.{core::num::>}(0))
     for (final dynamic #t5 in self::dynamicList as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>)
-      #t4.{core::Set::add}(#t5);
+      #t4.{core::Set::add}{Invariant}(#t5);
   if(self::i.{core::num::>}(0))
     for (final dynamic #t6 in self::nullableList!)
-      #t4.{core::Set::add}(#t6);
+      #t4.{core::Set::add}{Invariant}(#t6);
 } =>#t4;
 static field core::List<dynamic> list1 = block {
   final core::List<dynamic> #t7 = <dynamic>[];
   if(self::i.{core::num::>}(0))
-    #t7.{core::List::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:29:17: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+    #t7.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:29:17: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
   if (i > 0) ...nullableList, // error
                 ^");
   if(self::i.{core::num::>}(0))
     for (final dynamic #t8 in self::dynamicList as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>)
-      #t7.{core::List::add}(#t8);
+      #t7.{core::List::add}{Invariant}(#t8);
   if(self::i.{core::num::>}(0))
     for (final dynamic #t9 in self::nullableList!)
-      #t7.{core::List::add}(#t9);
+      #t7.{core::List::add}{Invariant}(#t9);
 } =>#t7;
 static method testMap<X extends dynamic = dynamic, Y extends core::Map<core::int, core::String>? = core::Map<core::int, core::String>?, Z extends core::Map<core::int, core::String> = core::Map<core::int, core::String>>(self::testMap::X% x, self::testMap::Y% y, self::testMap::Z z) → dynamic {
   core::Map<dynamic, dynamic> map2 = block {
     final core::Map<dynamic, dynamic> #t10 = <dynamic, dynamic>{};
     if(self::i.{core::num::>}(0))
-      #t10.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:37:19: Error: Unexpected type 'X' of a map spread entry.  Expected 'dynamic' or a Map.
+      #t10.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:37:19: Error: Unexpected type 'X' of a map spread entry.  Expected 'dynamic' or a Map.
     if (i > 0) ...x, // error
                   ^", null);
     if(self::i.{core::num::>}(0))
-      #t10.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:38:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      #t10.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:38:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     if (i > 0) ...y, // error
                   ^", null);
     if(self::i.{core::num::>}(0))
       for (final core::MapEntry<dynamic, dynamic> #t11 in z.{core::Map::entries})
-        #t10.{core::Map::[]=}(#t11.{core::MapEntry::key}, #t11.{core::MapEntry::value});
+        #t10.{core::Map::[]=}{Invariant}(#t11.{core::MapEntry::key}, #t11.{core::MapEntry::value});
     if(self::i.{core::num::>}(0))
       for (final core::MapEntry<dynamic, dynamic> #t12 in y!.{core::Map::entries})
-        #t10.{core::Map::[]=}(#t12.{core::MapEntry::key}, #t12.{core::MapEntry::value});
+        #t10.{core::Map::[]=}{Invariant}(#t12.{core::MapEntry::key}, #t12.{core::MapEntry::value});
   } =>#t10;
 }
 static method testIterables<X extends dynamic = dynamic, Y extends core::List<core::int>? = core::List<core::int>?, Z extends core::List<core::int> = core::List<core::int>>(self::testIterables::X% x, self::testIterables::Y% y, self::testIterables::Z z) → dynamic {
   core::Set<dynamic> set2 = block {
     final core::Set<dynamic> #t13 = col::LinkedHashSet::•<dynamic>();
-    #t13.{core::Set::add}(0);
+    #t13.{core::Set::add}{Invariant}(0);
     if(self::i.{core::num::>}(0))
-      #t13.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:48:19: Error: Unexpected type 'X' of a spread.  Expected 'dynamic' or an Iterable.
+      #t13.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:48:19: Error: Unexpected type 'X' of a spread.  Expected 'dynamic' or an Iterable.
     if (i > 0) ...x, // error
                   ^");
     if(self::i.{core::num::>}(0))
-      #t13.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:49:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      #t13.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:49:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     if (i > 0) ...y, // error
                   ^");
     if(self::i.{core::num::>}(0))
       for (final dynamic #t14 in z)
-        #t13.{core::Set::add}(#t14);
+        #t13.{core::Set::add}{Invariant}(#t14);
   } =>#t13;
   core::List<dynamic> list2 = block {
     final core::List<dynamic> #t15 = <dynamic>[];
     if(self::i.{core::num::>}(0))
-      #t15.{core::List::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:53:19: Error: Unexpected type 'X' of a spread.  Expected 'dynamic' or an Iterable.
+      #t15.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:53:19: Error: Unexpected type 'X' of a spread.  Expected 'dynamic' or an Iterable.
     if (i > 0) ...x, // error
                   ^");
     if(self::i.{core::num::>}(0))
-      #t15.{core::List::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:54:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      #t15.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:54:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     if (i > 0) ...y, // error
                   ^");
     if(self::i.{core::num::>}(0))
       for (final dynamic #t16 in z)
-        #t15.{core::List::add}(#t16);
+        #t15.{core::List::add}{Invariant}(#t16);
   } =>#t15;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue43256.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue43256.dart.weak.transformed.expect
index 32a8e8e..7babee3 100644
--- a/pkg/front_end/testcases/nnbd/issue43256.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue43256.dart.weak.transformed.expect
@@ -58,64 +58,64 @@
 static field core::Map<dynamic, dynamic> map1 = block {
   final core::Map<dynamic, dynamic> #t1 = <dynamic, dynamic>{};
   if(self::i.{core::num::>}(0))
-    #t1.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:16:17: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+    #t1.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:16:17: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
   if (i > 0) ...nullableMap, // error
                 ^", null);
   if(self::i.{core::num::>}(0)) {
     core::Iterator<core::MapEntry<dynamic, dynamic>> :sync-for-iterator = (self::dynamicMap as{TypeError,ForDynamic,ForNonNullableByDefault} core::Map<dynamic, dynamic>).{core::Map::entries}.{core::Iterable::iterator};
     for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
       final core::MapEntry<dynamic, dynamic> #t2 = :sync-for-iterator.{core::Iterator::current};
-      #t1.{core::Map::[]=}(#t2.{core::MapEntry::key}, #t2.{core::MapEntry::value});
+      #t1.{core::Map::[]=}{Invariant}(#t2.{core::MapEntry::key}, #t2.{core::MapEntry::value});
     }
   }
   if(self::i.{core::num::>}(0)) {
     core::Iterator<core::MapEntry<core::int, core::String>> :sync-for-iterator = self::nullableMap!.{core::Map::entries}.{core::Iterable::iterator};
     for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
       final core::MapEntry<dynamic, dynamic> #t3 = :sync-for-iterator.{core::Iterator::current};
-      #t1.{core::Map::[]=}(#t3.{core::MapEntry::key}, #t3.{core::MapEntry::value});
+      #t1.{core::Map::[]=}{Invariant}(#t3.{core::MapEntry::key}, #t3.{core::MapEntry::value});
     }
   }
 } =>#t1;
 static field core::Set<dynamic> set1 = block {
   final core::Set<dynamic> #t4 = new col::_CompactLinkedHashSet::•<dynamic>();
-  #t4.{core::Set::add}(0);
+  #t4.{core::Set::add}{Invariant}(0);
   if(self::i.{core::num::>}(0))
-    #t4.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:23:17: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+    #t4.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:23:17: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
   if (i > 0) ...nullableList, // error
                 ^");
   if(self::i.{core::num::>}(0)) {
     core::Iterator<dynamic> :sync-for-iterator = (self::dynamicList as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>).{core::Iterable::iterator};
     for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
       final dynamic #t5 = :sync-for-iterator.{core::Iterator::current};
-      #t4.{core::Set::add}(#t5);
+      #t4.{core::Set::add}{Invariant}(#t5);
     }
   }
   if(self::i.{core::num::>}(0)) {
     core::Iterator<core::int> :sync-for-iterator = self::nullableList!.{core::Iterable::iterator};
     for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
       final dynamic #t6 = :sync-for-iterator.{core::Iterator::current};
-      #t4.{core::Set::add}(#t6);
+      #t4.{core::Set::add}{Invariant}(#t6);
     }
   }
 } =>#t4;
 static field core::List<dynamic> list1 = block {
   final core::List<dynamic> #t7 = <dynamic>[];
   if(self::i.{core::num::>}(0))
-    #t7.{core::List::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:29:17: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+    #t7.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:29:17: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
   if (i > 0) ...nullableList, // error
                 ^");
   if(self::i.{core::num::>}(0)) {
     core::Iterator<dynamic> :sync-for-iterator = (self::dynamicList as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>).{core::Iterable::iterator};
     for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
       final dynamic #t8 = :sync-for-iterator.{core::Iterator::current};
-      #t7.{core::List::add}(#t8);
+      #t7.{core::List::add}{Invariant}(#t8);
     }
   }
   if(self::i.{core::num::>}(0)) {
     core::Iterator<core::int> :sync-for-iterator = self::nullableList!.{core::Iterable::iterator};
     for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
       final dynamic #t9 = :sync-for-iterator.{core::Iterator::current};
-      #t7.{core::List::add}(#t9);
+      #t7.{core::List::add}{Invariant}(#t9);
     }
   }
 } =>#t7;
@@ -123,25 +123,25 @@
   core::Map<dynamic, dynamic> map2 = block {
     final core::Map<dynamic, dynamic> #t10 = <dynamic, dynamic>{};
     if(self::i.{core::num::>}(0))
-      #t10.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:37:19: Error: Unexpected type 'X' of a map spread entry.  Expected 'dynamic' or a Map.
+      #t10.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:37:19: Error: Unexpected type 'X' of a map spread entry.  Expected 'dynamic' or a Map.
     if (i > 0) ...x, // error
                   ^", null);
     if(self::i.{core::num::>}(0))
-      #t10.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:38:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      #t10.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:38:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     if (i > 0) ...y, // error
                   ^", null);
     if(self::i.{core::num::>}(0)) {
       core::Iterator<core::MapEntry<core::int, core::String>> :sync-for-iterator = z.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::MapEntry<dynamic, dynamic> #t11 = :sync-for-iterator.{core::Iterator::current};
-        #t10.{core::Map::[]=}(#t11.{core::MapEntry::key}, #t11.{core::MapEntry::value});
+        #t10.{core::Map::[]=}{Invariant}(#t11.{core::MapEntry::key}, #t11.{core::MapEntry::value});
       }
     }
     if(self::i.{core::num::>}(0)) {
       core::Iterator<core::MapEntry<core::int, core::String>> :sync-for-iterator = y!.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::MapEntry<dynamic, dynamic> #t12 = :sync-for-iterator.{core::Iterator::current};
-        #t10.{core::Map::[]=}(#t12.{core::MapEntry::key}, #t12.{core::MapEntry::value});
+        #t10.{core::Map::[]=}{Invariant}(#t12.{core::MapEntry::key}, #t12.{core::MapEntry::value});
       }
     }
   } =>#t10;
@@ -149,38 +149,38 @@
 static method testIterables<X extends dynamic = dynamic, Y extends core::List<core::int>? = core::List<core::int>?, Z extends core::List<core::int> = core::List<core::int>>(self::testIterables::X% x, self::testIterables::Y% y, self::testIterables::Z z) → dynamic {
   core::Set<dynamic> set2 = block {
     final core::Set<dynamic> #t13 = new col::_CompactLinkedHashSet::•<dynamic>();
-    #t13.{core::Set::add}(0);
+    #t13.{core::Set::add}{Invariant}(0);
     if(self::i.{core::num::>}(0))
-      #t13.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:48:19: Error: Unexpected type 'X' of a spread.  Expected 'dynamic' or an Iterable.
+      #t13.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:48:19: Error: Unexpected type 'X' of a spread.  Expected 'dynamic' or an Iterable.
     if (i > 0) ...x, // error
                   ^");
     if(self::i.{core::num::>}(0))
-      #t13.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:49:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      #t13.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:49:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     if (i > 0) ...y, // error
                   ^");
     if(self::i.{core::num::>}(0)) {
       core::Iterator<core::int> :sync-for-iterator = z.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final dynamic #t14 = :sync-for-iterator.{core::Iterator::current};
-        #t13.{core::Set::add}(#t14);
+        #t13.{core::Set::add}{Invariant}(#t14);
       }
     }
   } =>#t13;
   core::List<dynamic> list2 = block {
     final core::List<dynamic> #t15 = <dynamic>[];
     if(self::i.{core::num::>}(0))
-      #t15.{core::List::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:53:19: Error: Unexpected type 'X' of a spread.  Expected 'dynamic' or an Iterable.
+      #t15.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:53:19: Error: Unexpected type 'X' of a spread.  Expected 'dynamic' or an Iterable.
     if (i > 0) ...x, // error
                   ^");
     if(self::i.{core::num::>}(0))
-      #t15.{core::List::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:54:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      #t15.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:54:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     if (i > 0) ...y, // error
                   ^");
     if(self::i.{core::num::>}(0)) {
       core::Iterator<core::int> :sync-for-iterator = z.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final dynamic #t16 = :sync-for-iterator.{core::Iterator::current};
-        #t15.{core::List::add}(#t16);
+        #t15.{core::List::add}{Invariant}(#t16);
       }
     }
   } =>#t15;
diff --git a/pkg/front_end/testcases/nnbd/issue43278.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue43278.dart.strong.expect
index 7ca309b..3087b3b 100644
--- a/pkg/front_end/testcases/nnbd/issue43278.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue43278.dart.strong.expect
@@ -19,8 +19,15 @@
 //   b.fooExtension ??= x; // Error.
 //     ^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/nnbd/issue43278.dart:29:5: Error: Property 'fooExtension' cannot be accessed on 'T' because it is potentially null.
-// Try accessing using ?. instead.
+// pkg/front_end/testcases/nnbd/issue43278.dart:29:5: Error: The getter 'fooExtension' isn't defined for the class 'B?'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/issue43278.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'fooExtension'.
+//   t.fooExtension ??= x; // Error.
+//     ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/issue43278.dart:29:5: Error: The setter 'fooExtension' isn't defined for the class 'B?'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/issue43278.dart'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'fooExtension'.
 //   t.fooExtension ??= x; // Error.
 //     ^^^^^^^^^^^^
 //
@@ -79,13 +86,15 @@
 Try accessing using ?. instead.
   b.fooExtension ??= x; // Error.
     ^^^^^^^^^^^^" in self::Extension|set#fooExtension(#t10, x) : null;
-  let final self::testExtension::T% #t13 = t in (let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/nnbd/issue43278.dart:29:5: Error: Property 'fooExtension' cannot be accessed on 'T' because it is potentially null.
-Try accessing using ?. instead.
+  let final self::testExtension::T% #t13 = t in invalid-expression "pkg/front_end/testcases/nnbd/issue43278.dart:29:5: Error: The getter 'fooExtension' isn't defined for the class 'B?'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/issue43278.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'fooExtension'.
   t.fooExtension ??= x; // Error.
-    ^^^^^^^^^^^^" in self::Extension|get#fooExtension(#t13)).{core::num::==}(null) ?{core::int} let final<BottomType> #t15 = invalid-expression "pkg/front_end/testcases/nnbd/issue43278.dart:29:5: Error: Property 'fooExtension' cannot be accessed on 'T' because it is potentially null.
-Try accessing using ?. instead.
+    ^^^^^^^^^^^^".{core::Object::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/nnbd/issue43278.dart:29:5: Error: The setter 'fooExtension' isn't defined for the class 'B?'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/issue43278.dart'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'fooExtension'.
   t.fooExtension ??= x; // Error.
-    ^^^^^^^^^^^^" in self::Extension|set#fooExtension(#t13, x) : null;
-  let final self::B? #t16 = b in #t16.{core::Object::==}(null) ?{core::int?} null : let final self::B #t17 = self::Extension|get#barExtension(#t16{self::B}) in self::Extension|get#fooExtension(#t17).{core::num::==}(null) ?{core::int} self::Extension|set#fooExtension(#t17, x) : null;
+    ^^^^^^^^^^^^" : null;
+  let final self::B? #t14 = b in #t14.{core::Object::==}(null) ?{core::int?} null : let final self::B #t15 = self::Extension|get#barExtension(#t14{self::B}) in self::Extension|get#fooExtension(#t15).{core::num::==}(null) ?{core::int} self::Extension|set#fooExtension(#t15, x) : null;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue43278.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue43278.dart.strong.transformed.expect
index 7ca309b..3087b3b 100644
--- a/pkg/front_end/testcases/nnbd/issue43278.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue43278.dart.strong.transformed.expect
@@ -19,8 +19,15 @@
 //   b.fooExtension ??= x; // Error.
 //     ^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/nnbd/issue43278.dart:29:5: Error: Property 'fooExtension' cannot be accessed on 'T' because it is potentially null.
-// Try accessing using ?. instead.
+// pkg/front_end/testcases/nnbd/issue43278.dart:29:5: Error: The getter 'fooExtension' isn't defined for the class 'B?'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/issue43278.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'fooExtension'.
+//   t.fooExtension ??= x; // Error.
+//     ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/issue43278.dart:29:5: Error: The setter 'fooExtension' isn't defined for the class 'B?'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/issue43278.dart'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'fooExtension'.
 //   t.fooExtension ??= x; // Error.
 //     ^^^^^^^^^^^^
 //
@@ -79,13 +86,15 @@
 Try accessing using ?. instead.
   b.fooExtension ??= x; // Error.
     ^^^^^^^^^^^^" in self::Extension|set#fooExtension(#t10, x) : null;
-  let final self::testExtension::T% #t13 = t in (let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/nnbd/issue43278.dart:29:5: Error: Property 'fooExtension' cannot be accessed on 'T' because it is potentially null.
-Try accessing using ?. instead.
+  let final self::testExtension::T% #t13 = t in invalid-expression "pkg/front_end/testcases/nnbd/issue43278.dart:29:5: Error: The getter 'fooExtension' isn't defined for the class 'B?'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/issue43278.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'fooExtension'.
   t.fooExtension ??= x; // Error.
-    ^^^^^^^^^^^^" in self::Extension|get#fooExtension(#t13)).{core::num::==}(null) ?{core::int} let final<BottomType> #t15 = invalid-expression "pkg/front_end/testcases/nnbd/issue43278.dart:29:5: Error: Property 'fooExtension' cannot be accessed on 'T' because it is potentially null.
-Try accessing using ?. instead.
+    ^^^^^^^^^^^^".{core::Object::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/nnbd/issue43278.dart:29:5: Error: The setter 'fooExtension' isn't defined for the class 'B?'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/issue43278.dart'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'fooExtension'.
   t.fooExtension ??= x; // Error.
-    ^^^^^^^^^^^^" in self::Extension|set#fooExtension(#t13, x) : null;
-  let final self::B? #t16 = b in #t16.{core::Object::==}(null) ?{core::int?} null : let final self::B #t17 = self::Extension|get#barExtension(#t16{self::B}) in self::Extension|get#fooExtension(#t17).{core::num::==}(null) ?{core::int} self::Extension|set#fooExtension(#t17, x) : null;
+    ^^^^^^^^^^^^" : null;
+  let final self::B? #t14 = b in #t14.{core::Object::==}(null) ?{core::int?} null : let final self::B #t15 = self::Extension|get#barExtension(#t14{self::B}) in self::Extension|get#fooExtension(#t15).{core::num::==}(null) ?{core::int} self::Extension|set#fooExtension(#t15, x) : null;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue43278.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue43278.dart.weak.expect
index 7ca309b..3087b3b 100644
--- a/pkg/front_end/testcases/nnbd/issue43278.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue43278.dart.weak.expect
@@ -19,8 +19,15 @@
 //   b.fooExtension ??= x; // Error.
 //     ^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/nnbd/issue43278.dart:29:5: Error: Property 'fooExtension' cannot be accessed on 'T' because it is potentially null.
-// Try accessing using ?. instead.
+// pkg/front_end/testcases/nnbd/issue43278.dart:29:5: Error: The getter 'fooExtension' isn't defined for the class 'B?'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/issue43278.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'fooExtension'.
+//   t.fooExtension ??= x; // Error.
+//     ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/issue43278.dart:29:5: Error: The setter 'fooExtension' isn't defined for the class 'B?'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/issue43278.dart'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'fooExtension'.
 //   t.fooExtension ??= x; // Error.
 //     ^^^^^^^^^^^^
 //
@@ -79,13 +86,15 @@
 Try accessing using ?. instead.
   b.fooExtension ??= x; // Error.
     ^^^^^^^^^^^^" in self::Extension|set#fooExtension(#t10, x) : null;
-  let final self::testExtension::T% #t13 = t in (let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/nnbd/issue43278.dart:29:5: Error: Property 'fooExtension' cannot be accessed on 'T' because it is potentially null.
-Try accessing using ?. instead.
+  let final self::testExtension::T% #t13 = t in invalid-expression "pkg/front_end/testcases/nnbd/issue43278.dart:29:5: Error: The getter 'fooExtension' isn't defined for the class 'B?'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/issue43278.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'fooExtension'.
   t.fooExtension ??= x; // Error.
-    ^^^^^^^^^^^^" in self::Extension|get#fooExtension(#t13)).{core::num::==}(null) ?{core::int} let final<BottomType> #t15 = invalid-expression "pkg/front_end/testcases/nnbd/issue43278.dart:29:5: Error: Property 'fooExtension' cannot be accessed on 'T' because it is potentially null.
-Try accessing using ?. instead.
+    ^^^^^^^^^^^^".{core::Object::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/nnbd/issue43278.dart:29:5: Error: The setter 'fooExtension' isn't defined for the class 'B?'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/issue43278.dart'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'fooExtension'.
   t.fooExtension ??= x; // Error.
-    ^^^^^^^^^^^^" in self::Extension|set#fooExtension(#t13, x) : null;
-  let final self::B? #t16 = b in #t16.{core::Object::==}(null) ?{core::int?} null : let final self::B #t17 = self::Extension|get#barExtension(#t16{self::B}) in self::Extension|get#fooExtension(#t17).{core::num::==}(null) ?{core::int} self::Extension|set#fooExtension(#t17, x) : null;
+    ^^^^^^^^^^^^" : null;
+  let final self::B? #t14 = b in #t14.{core::Object::==}(null) ?{core::int?} null : let final self::B #t15 = self::Extension|get#barExtension(#t14{self::B}) in self::Extension|get#fooExtension(#t15).{core::num::==}(null) ?{core::int} self::Extension|set#fooExtension(#t15, x) : null;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue43278.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue43278.dart.weak.transformed.expect
index 7ca309b..3087b3b 100644
--- a/pkg/front_end/testcases/nnbd/issue43278.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue43278.dart.weak.transformed.expect
@@ -19,8 +19,15 @@
 //   b.fooExtension ??= x; // Error.
 //     ^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/nnbd/issue43278.dart:29:5: Error: Property 'fooExtension' cannot be accessed on 'T' because it is potentially null.
-// Try accessing using ?. instead.
+// pkg/front_end/testcases/nnbd/issue43278.dart:29:5: Error: The getter 'fooExtension' isn't defined for the class 'B?'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/issue43278.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'fooExtension'.
+//   t.fooExtension ??= x; // Error.
+//     ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/issue43278.dart:29:5: Error: The setter 'fooExtension' isn't defined for the class 'B?'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/issue43278.dart'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'fooExtension'.
 //   t.fooExtension ??= x; // Error.
 //     ^^^^^^^^^^^^
 //
@@ -79,13 +86,15 @@
 Try accessing using ?. instead.
   b.fooExtension ??= x; // Error.
     ^^^^^^^^^^^^" in self::Extension|set#fooExtension(#t10, x) : null;
-  let final self::testExtension::T% #t13 = t in (let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/nnbd/issue43278.dart:29:5: Error: Property 'fooExtension' cannot be accessed on 'T' because it is potentially null.
-Try accessing using ?. instead.
+  let final self::testExtension::T% #t13 = t in invalid-expression "pkg/front_end/testcases/nnbd/issue43278.dart:29:5: Error: The getter 'fooExtension' isn't defined for the class 'B?'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/issue43278.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'fooExtension'.
   t.fooExtension ??= x; // Error.
-    ^^^^^^^^^^^^" in self::Extension|get#fooExtension(#t13)).{core::num::==}(null) ?{core::int} let final<BottomType> #t15 = invalid-expression "pkg/front_end/testcases/nnbd/issue43278.dart:29:5: Error: Property 'fooExtension' cannot be accessed on 'T' because it is potentially null.
-Try accessing using ?. instead.
+    ^^^^^^^^^^^^".{core::Object::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/nnbd/issue43278.dart:29:5: Error: The setter 'fooExtension' isn't defined for the class 'B?'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/issue43278.dart'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'fooExtension'.
   t.fooExtension ??= x; // Error.
-    ^^^^^^^^^^^^" in self::Extension|set#fooExtension(#t13, x) : null;
-  let final self::B? #t16 = b in #t16.{core::Object::==}(null) ?{core::int?} null : let final self::B #t17 = self::Extension|get#barExtension(#t16{self::B}) in self::Extension|get#fooExtension(#t17).{core::num::==}(null) ?{core::int} self::Extension|set#fooExtension(#t17, x) : null;
+    ^^^^^^^^^^^^" : null;
+  let final self::B? #t14 = b in #t14.{core::Object::==}(null) ?{core::int?} null : let final self::B #t15 = self::Extension|get#barExtension(#t14{self::B}) in self::Extension|get#fooExtension(#t15).{core::num::==}(null) ?{core::int} self::Extension|set#fooExtension(#t15, x) : null;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue43455.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue43455.dart.strong.expect
index 0acee2d..e6ba91c 100644
--- a/pkg/front_end/testcases/nnbd/issue43455.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue43455.dart.strong.expect
@@ -8,10 +8,26 @@
     : super core::Object::•()
     ;
   method test(generic-covariant-impl self::C::X% x, generic-covariant-impl self::C::Y? y) → dynamic {
-    core::Set<core::Object?> v = let final core::Set<core::Object?> #t1 = col::LinkedHashSet::•<core::Object?>() in let final dynamic #t2 = #t1.{core::Set::add}(x) in let final dynamic #t3 = #t1.{core::Set::add}(42) in #t1;
-    core::Set<core::Object?> w = let final core::Set<core::Object?> #t4 = col::LinkedHashSet::•<core::Object?>() in let final dynamic #t5 = #t4.{core::Set::add}(42) in let final dynamic #t6 = #t4.{core::Set::add}(x) in #t4;
-    core::Set<core::Object?> p = let final core::Set<core::Object?> #t7 = col::LinkedHashSet::•<core::Object?>() in let final dynamic #t8 = #t7.{core::Set::add}(y) in let final dynamic #t9 = #t7.{core::Set::add}(42) in #t7;
-    core::Set<core::Object?> q = let final core::Set<core::Object?> #t10 = col::LinkedHashSet::•<core::Object?>() in let final dynamic #t11 = #t10.{core::Set::add}(42) in let final dynamic #t12 = #t10.{core::Set::add}(y) in #t10;
+    core::Set<core::Object?> v = block {
+      final core::Set<core::Object?> #t1 = col::LinkedHashSet::•<core::Object?>();
+      #t1.{core::Set::add}{Invariant}(x);
+      #t1.{core::Set::add}{Invariant}(42);
+    } =>#t1;
+    core::Set<core::Object?> w = block {
+      final core::Set<core::Object?> #t2 = col::LinkedHashSet::•<core::Object?>();
+      #t2.{core::Set::add}{Invariant}(42);
+      #t2.{core::Set::add}{Invariant}(x);
+    } =>#t2;
+    core::Set<core::Object?> p = block {
+      final core::Set<core::Object?> #t3 = col::LinkedHashSet::•<core::Object?>();
+      #t3.{core::Set::add}{Invariant}(y);
+      #t3.{core::Set::add}{Invariant}(42);
+    } =>#t3;
+    core::Set<core::Object?> q = block {
+      final core::Set<core::Object?> #t4 = col::LinkedHashSet::•<core::Object?>();
+      #t4.{core::Set::add}{Invariant}(42);
+      #t4.{core::Set::add}{Invariant}(y);
+    } =>#t4;
     self::assertRightSubtype(v);
     self::assertLeftSubtype<core::Set<core::Object?>>(v);
     self::assertRightSubtype(w);
@@ -21,8 +37,16 @@
     self::assertRightSubtype(q);
     self::assertLeftSubtype<core::Set<core::Object?>>(q);
     if(x is{ForNonNullableByDefault} core::Object?) {
-      core::Set<core::Object?> v = let final core::Set<core::Object?> #t13 = col::LinkedHashSet::•<core::Object?>() in let final dynamic #t14 = #t13.{core::Set::add}(x{self::C::X% & core::Object? /* '%' & '?' = '%' */}) in let final dynamic #t15 = #t13.{core::Set::add}(42) in #t13;
-      core::Set<core::Object?> w = let final core::Set<core::Object?> #t16 = col::LinkedHashSet::•<core::Object?>() in let final dynamic #t17 = #t16.{core::Set::add}(42) in let final dynamic #t18 = #t16.{core::Set::add}(x{self::C::X% & core::Object? /* '%' & '?' = '%' */}) in #t16;
+      core::Set<core::Object?> v = block {
+        final core::Set<core::Object?> #t5 = col::LinkedHashSet::•<core::Object?>();
+        #t5.{core::Set::add}{Invariant}(x{self::C::X% & core::Object? /* '%' & '?' = '%' */});
+        #t5.{core::Set::add}{Invariant}(42);
+      } =>#t5;
+      core::Set<core::Object?> w = block {
+        final core::Set<core::Object?> #t6 = col::LinkedHashSet::•<core::Object?>();
+        #t6.{core::Set::add}{Invariant}(42);
+        #t6.{core::Set::add}{Invariant}(x{self::C::X% & core::Object? /* '%' & '?' = '%' */});
+      } =>#t6;
       self::assertRightSubtype(v);
       self::assertLeftSubtype<core::Set<core::Object?>>(v);
       self::assertRightSubtype(w);
diff --git a/pkg/front_end/testcases/nnbd/issue43455.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue43455.dart.strong.transformed.expect
index 49327f3..47bd5a2 100644
--- a/pkg/front_end/testcases/nnbd/issue43455.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue43455.dart.strong.transformed.expect
@@ -8,10 +8,26 @@
     : super core::Object::•()
     ;
   method test(generic-covariant-impl self::C::X% x, generic-covariant-impl self::C::Y? y) → dynamic {
-    core::Set<core::Object?> v = let final core::Set<core::Object?> #t1 = new col::_CompactLinkedHashSet::•<core::Object?>() in let final core::bool #t2 = #t1.{core::Set::add}(x) in let final core::bool #t3 = #t1.{core::Set::add}(42) in #t1;
-    core::Set<core::Object?> w = let final core::Set<core::Object?> #t4 = new col::_CompactLinkedHashSet::•<core::Object?>() in let final core::bool #t5 = #t4.{core::Set::add}(42) in let final core::bool #t6 = #t4.{core::Set::add}(x) in #t4;
-    core::Set<core::Object?> p = let final core::Set<core::Object?> #t7 = new col::_CompactLinkedHashSet::•<core::Object?>() in let final core::bool #t8 = #t7.{core::Set::add}(y) in let final core::bool #t9 = #t7.{core::Set::add}(42) in #t7;
-    core::Set<core::Object?> q = let final core::Set<core::Object?> #t10 = new col::_CompactLinkedHashSet::•<core::Object?>() in let final core::bool #t11 = #t10.{core::Set::add}(42) in let final core::bool #t12 = #t10.{core::Set::add}(y) in #t10;
+    core::Set<core::Object?> v = block {
+      final core::Set<core::Object?> #t1 = new col::_CompactLinkedHashSet::•<core::Object?>();
+      #t1.{core::Set::add}{Invariant}(x);
+      #t1.{core::Set::add}{Invariant}(42);
+    } =>#t1;
+    core::Set<core::Object?> w = block {
+      final core::Set<core::Object?> #t2 = new col::_CompactLinkedHashSet::•<core::Object?>();
+      #t2.{core::Set::add}{Invariant}(42);
+      #t2.{core::Set::add}{Invariant}(x);
+    } =>#t2;
+    core::Set<core::Object?> p = block {
+      final core::Set<core::Object?> #t3 = new col::_CompactLinkedHashSet::•<core::Object?>();
+      #t3.{core::Set::add}{Invariant}(y);
+      #t3.{core::Set::add}{Invariant}(42);
+    } =>#t3;
+    core::Set<core::Object?> q = block {
+      final core::Set<core::Object?> #t4 = new col::_CompactLinkedHashSet::•<core::Object?>();
+      #t4.{core::Set::add}{Invariant}(42);
+      #t4.{core::Set::add}{Invariant}(y);
+    } =>#t4;
     self::assertRightSubtype(v);
     self::assertLeftSubtype<core::Set<core::Object?>>(v);
     self::assertRightSubtype(w);
@@ -21,8 +37,16 @@
     self::assertRightSubtype(q);
     self::assertLeftSubtype<core::Set<core::Object?>>(q);
     if(x is{ForNonNullableByDefault} core::Object?) {
-      core::Set<core::Object?> v = let final core::Set<core::Object?> #t13 = new col::_CompactLinkedHashSet::•<core::Object?>() in let final core::bool #t14 = #t13.{core::Set::add}(x{self::C::X% & core::Object? /* '%' & '?' = '%' */}) in let final core::bool #t15 = #t13.{core::Set::add}(42) in #t13;
-      core::Set<core::Object?> w = let final core::Set<core::Object?> #t16 = new col::_CompactLinkedHashSet::•<core::Object?>() in let final core::bool #t17 = #t16.{core::Set::add}(42) in let final core::bool #t18 = #t16.{core::Set::add}(x{self::C::X% & core::Object? /* '%' & '?' = '%' */}) in #t16;
+      core::Set<core::Object?> v = block {
+        final core::Set<core::Object?> #t5 = new col::_CompactLinkedHashSet::•<core::Object?>();
+        #t5.{core::Set::add}{Invariant}(x{self::C::X% & core::Object? /* '%' & '?' = '%' */});
+        #t5.{core::Set::add}{Invariant}(42);
+      } =>#t5;
+      core::Set<core::Object?> w = block {
+        final core::Set<core::Object?> #t6 = new col::_CompactLinkedHashSet::•<core::Object?>();
+        #t6.{core::Set::add}{Invariant}(42);
+        #t6.{core::Set::add}{Invariant}(x{self::C::X% & core::Object? /* '%' & '?' = '%' */});
+      } =>#t6;
       self::assertRightSubtype(v);
       self::assertLeftSubtype<core::Set<core::Object?>>(v);
       self::assertRightSubtype(w);
diff --git a/pkg/front_end/testcases/nnbd/issue43455.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue43455.dart.weak.expect
index 0acee2d..e6ba91c 100644
--- a/pkg/front_end/testcases/nnbd/issue43455.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue43455.dart.weak.expect
@@ -8,10 +8,26 @@
     : super core::Object::•()
     ;
   method test(generic-covariant-impl self::C::X% x, generic-covariant-impl self::C::Y? y) → dynamic {
-    core::Set<core::Object?> v = let final core::Set<core::Object?> #t1 = col::LinkedHashSet::•<core::Object?>() in let final dynamic #t2 = #t1.{core::Set::add}(x) in let final dynamic #t3 = #t1.{core::Set::add}(42) in #t1;
-    core::Set<core::Object?> w = let final core::Set<core::Object?> #t4 = col::LinkedHashSet::•<core::Object?>() in let final dynamic #t5 = #t4.{core::Set::add}(42) in let final dynamic #t6 = #t4.{core::Set::add}(x) in #t4;
-    core::Set<core::Object?> p = let final core::Set<core::Object?> #t7 = col::LinkedHashSet::•<core::Object?>() in let final dynamic #t8 = #t7.{core::Set::add}(y) in let final dynamic #t9 = #t7.{core::Set::add}(42) in #t7;
-    core::Set<core::Object?> q = let final core::Set<core::Object?> #t10 = col::LinkedHashSet::•<core::Object?>() in let final dynamic #t11 = #t10.{core::Set::add}(42) in let final dynamic #t12 = #t10.{core::Set::add}(y) in #t10;
+    core::Set<core::Object?> v = block {
+      final core::Set<core::Object?> #t1 = col::LinkedHashSet::•<core::Object?>();
+      #t1.{core::Set::add}{Invariant}(x);
+      #t1.{core::Set::add}{Invariant}(42);
+    } =>#t1;
+    core::Set<core::Object?> w = block {
+      final core::Set<core::Object?> #t2 = col::LinkedHashSet::•<core::Object?>();
+      #t2.{core::Set::add}{Invariant}(42);
+      #t2.{core::Set::add}{Invariant}(x);
+    } =>#t2;
+    core::Set<core::Object?> p = block {
+      final core::Set<core::Object?> #t3 = col::LinkedHashSet::•<core::Object?>();
+      #t3.{core::Set::add}{Invariant}(y);
+      #t3.{core::Set::add}{Invariant}(42);
+    } =>#t3;
+    core::Set<core::Object?> q = block {
+      final core::Set<core::Object?> #t4 = col::LinkedHashSet::•<core::Object?>();
+      #t4.{core::Set::add}{Invariant}(42);
+      #t4.{core::Set::add}{Invariant}(y);
+    } =>#t4;
     self::assertRightSubtype(v);
     self::assertLeftSubtype<core::Set<core::Object?>>(v);
     self::assertRightSubtype(w);
@@ -21,8 +37,16 @@
     self::assertRightSubtype(q);
     self::assertLeftSubtype<core::Set<core::Object?>>(q);
     if(x is{ForNonNullableByDefault} core::Object?) {
-      core::Set<core::Object?> v = let final core::Set<core::Object?> #t13 = col::LinkedHashSet::•<core::Object?>() in let final dynamic #t14 = #t13.{core::Set::add}(x{self::C::X% & core::Object? /* '%' & '?' = '%' */}) in let final dynamic #t15 = #t13.{core::Set::add}(42) in #t13;
-      core::Set<core::Object?> w = let final core::Set<core::Object?> #t16 = col::LinkedHashSet::•<core::Object?>() in let final dynamic #t17 = #t16.{core::Set::add}(42) in let final dynamic #t18 = #t16.{core::Set::add}(x{self::C::X% & core::Object? /* '%' & '?' = '%' */}) in #t16;
+      core::Set<core::Object?> v = block {
+        final core::Set<core::Object?> #t5 = col::LinkedHashSet::•<core::Object?>();
+        #t5.{core::Set::add}{Invariant}(x{self::C::X% & core::Object? /* '%' & '?' = '%' */});
+        #t5.{core::Set::add}{Invariant}(42);
+      } =>#t5;
+      core::Set<core::Object?> w = block {
+        final core::Set<core::Object?> #t6 = col::LinkedHashSet::•<core::Object?>();
+        #t6.{core::Set::add}{Invariant}(42);
+        #t6.{core::Set::add}{Invariant}(x{self::C::X% & core::Object? /* '%' & '?' = '%' */});
+      } =>#t6;
       self::assertRightSubtype(v);
       self::assertLeftSubtype<core::Set<core::Object?>>(v);
       self::assertRightSubtype(w);
diff --git a/pkg/front_end/testcases/nnbd/issue43455.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue43455.dart.weak.transformed.expect
index 49327f3..47bd5a2 100644
--- a/pkg/front_end/testcases/nnbd/issue43455.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue43455.dart.weak.transformed.expect
@@ -8,10 +8,26 @@
     : super core::Object::•()
     ;
   method test(generic-covariant-impl self::C::X% x, generic-covariant-impl self::C::Y? y) → dynamic {
-    core::Set<core::Object?> v = let final core::Set<core::Object?> #t1 = new col::_CompactLinkedHashSet::•<core::Object?>() in let final core::bool #t2 = #t1.{core::Set::add}(x) in let final core::bool #t3 = #t1.{core::Set::add}(42) in #t1;
-    core::Set<core::Object?> w = let final core::Set<core::Object?> #t4 = new col::_CompactLinkedHashSet::•<core::Object?>() in let final core::bool #t5 = #t4.{core::Set::add}(42) in let final core::bool #t6 = #t4.{core::Set::add}(x) in #t4;
-    core::Set<core::Object?> p = let final core::Set<core::Object?> #t7 = new col::_CompactLinkedHashSet::•<core::Object?>() in let final core::bool #t8 = #t7.{core::Set::add}(y) in let final core::bool #t9 = #t7.{core::Set::add}(42) in #t7;
-    core::Set<core::Object?> q = let final core::Set<core::Object?> #t10 = new col::_CompactLinkedHashSet::•<core::Object?>() in let final core::bool #t11 = #t10.{core::Set::add}(42) in let final core::bool #t12 = #t10.{core::Set::add}(y) in #t10;
+    core::Set<core::Object?> v = block {
+      final core::Set<core::Object?> #t1 = new col::_CompactLinkedHashSet::•<core::Object?>();
+      #t1.{core::Set::add}{Invariant}(x);
+      #t1.{core::Set::add}{Invariant}(42);
+    } =>#t1;
+    core::Set<core::Object?> w = block {
+      final core::Set<core::Object?> #t2 = new col::_CompactLinkedHashSet::•<core::Object?>();
+      #t2.{core::Set::add}{Invariant}(42);
+      #t2.{core::Set::add}{Invariant}(x);
+    } =>#t2;
+    core::Set<core::Object?> p = block {
+      final core::Set<core::Object?> #t3 = new col::_CompactLinkedHashSet::•<core::Object?>();
+      #t3.{core::Set::add}{Invariant}(y);
+      #t3.{core::Set::add}{Invariant}(42);
+    } =>#t3;
+    core::Set<core::Object?> q = block {
+      final core::Set<core::Object?> #t4 = new col::_CompactLinkedHashSet::•<core::Object?>();
+      #t4.{core::Set::add}{Invariant}(42);
+      #t4.{core::Set::add}{Invariant}(y);
+    } =>#t4;
     self::assertRightSubtype(v);
     self::assertLeftSubtype<core::Set<core::Object?>>(v);
     self::assertRightSubtype(w);
@@ -21,8 +37,16 @@
     self::assertRightSubtype(q);
     self::assertLeftSubtype<core::Set<core::Object?>>(q);
     if(x is{ForNonNullableByDefault} core::Object?) {
-      core::Set<core::Object?> v = let final core::Set<core::Object?> #t13 = new col::_CompactLinkedHashSet::•<core::Object?>() in let final core::bool #t14 = #t13.{core::Set::add}(x{self::C::X% & core::Object? /* '%' & '?' = '%' */}) in let final core::bool #t15 = #t13.{core::Set::add}(42) in #t13;
-      core::Set<core::Object?> w = let final core::Set<core::Object?> #t16 = new col::_CompactLinkedHashSet::•<core::Object?>() in let final core::bool #t17 = #t16.{core::Set::add}(42) in let final core::bool #t18 = #t16.{core::Set::add}(x{self::C::X% & core::Object? /* '%' & '?' = '%' */}) in #t16;
+      core::Set<core::Object?> v = block {
+        final core::Set<core::Object?> #t5 = new col::_CompactLinkedHashSet::•<core::Object?>();
+        #t5.{core::Set::add}{Invariant}(x{self::C::X% & core::Object? /* '%' & '?' = '%' */});
+        #t5.{core::Set::add}{Invariant}(42);
+      } =>#t5;
+      core::Set<core::Object?> w = block {
+        final core::Set<core::Object?> #t6 = new col::_CompactLinkedHashSet::•<core::Object?>();
+        #t6.{core::Set::add}{Invariant}(42);
+        #t6.{core::Set::add}{Invariant}(x{self::C::X% & core::Object? /* '%' & '?' = '%' */});
+      } =>#t6;
       self::assertRightSubtype(v);
       self::assertLeftSubtype<core::Set<core::Object?>>(v);
       self::assertRightSubtype(w);
diff --git a/pkg/front_end/testcases/nnbd/issue43495.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue43495.dart.strong.expect
index e89957c..0934075 100644
--- a/pkg/front_end/testcases/nnbd/issue43495.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue43495.dart.strong.expect
@@ -175,7 +175,7 @@
     {...a}, // Error.
         ^") {
       final core::int #t3 = #t2 as{TypeError,ForNonNullableByDefault} core::int;
-      #t1.{core::Set::add}(#t3);
+      #t1.{core::Set::add}{Invariant}(#t3);
     }
   } =>#t1, block {
     final core::Set<core::int> #t4 = col::LinkedHashSet::•<core::int>();
@@ -183,7 +183,7 @@
     {...b}, // Error.
         ^") {
       final core::int #t6 = #t5 as{TypeError,ForNonNullableByDefault} core::int;
-      #t4.{core::Set::add}(#t6);
+      #t4.{core::Set::add}{Invariant}(#t6);
     }
   } =>#t4, block {
     final core::Set<core::int> #t7 = col::LinkedHashSet::•<core::int>();
@@ -191,535 +191,541 @@
     {...c}, // Error.
         ^") {
       final core::int #t9 = #t8 as{TypeError,ForNonNullableByDefault} core::int;
-      #t7.{core::Set::add}(#t9);
+      #t7.{core::Set::add}{Invariant}(#t9);
     }
   } =>#t7, <core::int, core::int>{invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:11:9: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {...d}, // Error.
         ^": null}, <core::int, core::int>{invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:12:19: Error: Unexpected type 'List<int>?' of a map spread entry.  Expected 'dynamic' or a Map.
  - 'List' is from 'dart:core'.
     <int, int>{...a}, // Error.
-                  ^": null}, let final core::Set<core::int> #t10 = col::LinkedHashSet::•<core::int>() in let final dynamic #t11 = #t10.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:13:14: Error: Unexpected type 'Map<int, int>?' of a spread.  Expected 'dynamic' or an Iterable.
+                  ^": null}, block {
+    final core::Set<core::int> #t10 = col::LinkedHashSet::•<core::int>();
+    #t10.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:13:14: Error: Unexpected type 'Map<int, int>?' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
     <int>{...d}, // Error.
-             ^") in #t10, block {
-    final core::Set<core::int> #t12 = col::LinkedHashSet::•<core::int>();
+             ^");
+  } =>#t10, block {
+    final core::Set<core::int> #t11 = col::LinkedHashSet::•<core::int>();
     if(condition)
-      for (final dynamic #t13 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:14:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      for (final dynamic #t12 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:14:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {if (condition) ...a}, // Error.
                        ^") {
-        final core::int #t14 = #t13 as{TypeError,ForNonNullableByDefault} core::int;
-        #t12.{core::Set::add}(#t14);
+        final core::int #t13 = #t12 as{TypeError,ForNonNullableByDefault} core::int;
+        #t11.{core::Set::add}{Invariant}(#t13);
       }
-  } =>#t12, block {
-    final core::Set<core::int> #t15 = col::LinkedHashSet::•<core::int>();
+  } =>#t11, block {
+    final core::Set<core::int> #t14 = col::LinkedHashSet::•<core::int>();
     if(condition)
-      for (final dynamic #t16 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:15:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      for (final dynamic #t15 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:15:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {if (condition) ...b}, // Error.
                        ^") {
-        final core::int #t17 = #t16 as{TypeError,ForNonNullableByDefault} core::int;
-        #t15.{core::Set::add}(#t17);
+        final core::int #t16 = #t15 as{TypeError,ForNonNullableByDefault} core::int;
+        #t14.{core::Set::add}{Invariant}(#t16);
       }
-  } =>#t15, block {
-    final core::Set<core::int> #t18 = col::LinkedHashSet::•<core::int>();
+  } =>#t14, block {
+    final core::Set<core::int> #t17 = col::LinkedHashSet::•<core::int>();
     if(condition)
-      for (final dynamic #t19 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:16:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      for (final dynamic #t18 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:16:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {if (condition) ...c}, // Error.
                        ^") {
-        final core::int #t20 = #t19 as{TypeError,ForNonNullableByDefault} core::int;
-        #t18.{core::Set::add}(#t20);
+        final core::int #t19 = #t18 as{TypeError,ForNonNullableByDefault} core::int;
+        #t17.{core::Set::add}{Invariant}(#t19);
       }
-  } =>#t18, block {
-    final core::Map<core::int, core::int> #t21 = <core::int, core::int>{};
+  } =>#t17, block {
+    final core::Map<core::int, core::int> #t20 = <core::int, core::int>{};
     if(condition)
-      #t21.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:17:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      #t20.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:17:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {if (condition) ...d}, // Error.
                        ^", null);
-  } =>#t21, block {
-    final core::Set<core::int> #t22 = col::LinkedHashSet::•<core::int>();
+  } =>#t20, block {
+    final core::Set<core::int> #t21 = col::LinkedHashSet::•<core::int>();
     for (dynamic e in iterable)
-      for (final dynamic #t23 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:18:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      for (final dynamic #t22 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:18:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {for (dynamic e in iterable) ...a}, // Error.
                                     ^") {
-        final core::int #t24 = #t23 as{TypeError,ForNonNullableByDefault} core::int;
-        #t22.{core::Set::add}(#t24);
+        final core::int #t23 = #t22 as{TypeError,ForNonNullableByDefault} core::int;
+        #t21.{core::Set::add}{Invariant}(#t23);
       }
-  } =>#t22, block {
-    final core::Set<core::int> #t25 = col::LinkedHashSet::•<core::int>();
+  } =>#t21, block {
+    final core::Set<core::int> #t24 = col::LinkedHashSet::•<core::int>();
     for (dynamic e in iterable)
-      for (final dynamic #t26 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:19:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      for (final dynamic #t25 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:19:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {for (dynamic e in iterable) ...b}, // Error.
                                     ^") {
-        final core::int #t27 = #t26 as{TypeError,ForNonNullableByDefault} core::int;
-        #t25.{core::Set::add}(#t27);
+        final core::int #t26 = #t25 as{TypeError,ForNonNullableByDefault} core::int;
+        #t24.{core::Set::add}{Invariant}(#t26);
       }
-  } =>#t25, block {
-    final core::Set<core::int> #t28 = col::LinkedHashSet::•<core::int>();
+  } =>#t24, block {
+    final core::Set<core::int> #t27 = col::LinkedHashSet::•<core::int>();
     for (dynamic e in iterable)
-      for (final dynamic #t29 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:20:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      for (final dynamic #t28 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:20:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {for (dynamic e in iterable) ...c}, // Error.
                                     ^") {
-        final core::int #t30 = #t29 as{TypeError,ForNonNullableByDefault} core::int;
-        #t28.{core::Set::add}(#t30);
+        final core::int #t29 = #t28 as{TypeError,ForNonNullableByDefault} core::int;
+        #t27.{core::Set::add}{Invariant}(#t29);
       }
-  } =>#t28, block {
-    final core::Map<core::int, core::int> #t31 = <core::int, core::int>{};
+  } =>#t27, block {
+    final core::Map<core::int, core::int> #t30 = <core::int, core::int>{};
     for (dynamic e in iterable)
-      #t31.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:21:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      #t30.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:21:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {for (dynamic e in iterable) ...d}, // Error.
                                     ^", null);
-  } =>#t31, block {
-    final core::Set<core::int> #t32 = col::LinkedHashSet::•<core::int>();
+  } =>#t30, block {
+    final core::Set<core::int> #t31 = col::LinkedHashSet::•<core::int>();
     for (core::int i = 0; i.{core::num::<}(42); i = i.{core::num::+}(1))
-      for (final dynamic #t33 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:22:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      for (final dynamic #t32 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:22:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {for (int i = 0; i < 42; ++i) ...a}, // Error.
                                      ^") {
-        final core::int #t34 = #t33 as{TypeError,ForNonNullableByDefault} core::int;
-        #t32.{core::Set::add}(#t34);
+        final core::int #t33 = #t32 as{TypeError,ForNonNullableByDefault} core::int;
+        #t31.{core::Set::add}{Invariant}(#t33);
       }
-  } =>#t32, block {
-    final core::Set<core::int> #t35 = col::LinkedHashSet::•<core::int>();
+  } =>#t31, block {
+    final core::Set<core::int> #t34 = col::LinkedHashSet::•<core::int>();
     for (core::int i = 0; i.{core::num::<}(42); i = i.{core::num::+}(1))
-      for (final dynamic #t36 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:23:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      for (final dynamic #t35 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:23:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {for (int i = 0; i < 42; ++i) ...b}, // Error.
                                      ^") {
-        final core::int #t37 = #t36 as{TypeError,ForNonNullableByDefault} core::int;
-        #t35.{core::Set::add}(#t37);
+        final core::int #t36 = #t35 as{TypeError,ForNonNullableByDefault} core::int;
+        #t34.{core::Set::add}{Invariant}(#t36);
       }
-  } =>#t35, block {
-    final core::Set<core::int> #t38 = col::LinkedHashSet::•<core::int>();
+  } =>#t34, block {
+    final core::Set<core::int> #t37 = col::LinkedHashSet::•<core::int>();
     for (core::int i = 0; i.{core::num::<}(42); i = i.{core::num::+}(1))
-      for (final dynamic #t39 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:24:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      for (final dynamic #t38 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:24:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {for (int i = 0; i < 42; ++i) ...c}, // Error.
                                      ^") {
-        final core::int #t40 = #t39 as{TypeError,ForNonNullableByDefault} core::int;
-        #t38.{core::Set::add}(#t40);
+        final core::int #t39 = #t38 as{TypeError,ForNonNullableByDefault} core::int;
+        #t37.{core::Set::add}{Invariant}(#t39);
       }
-  } =>#t38, block {
-    final core::Map<core::int, core::int> #t41 = <core::int, core::int>{};
+  } =>#t37, block {
+    final core::Map<core::int, core::int> #t40 = <core::int, core::int>{};
     for (core::int i = 0; i.{core::num::<}(42); i = i.{core::num::+}(1))
-      #t41.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:25:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      #t40.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:25:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {for (int i = 0; i < 42; ++i) ...d}, // Error.
                                      ^", null);
+  } =>#t40, block {
+    final core::Set<core::int> #t41 = col::LinkedHashSet::•<core::int>();
+    final core::Iterable<dynamic>? #t42 = a;
+    if(!#t42.{core::Object::==}(null))
+      for (final dynamic #t43 in #t42{core::Iterable<dynamic>}) {
+        final core::int #t44 = #t43 as{TypeError,ForNonNullableByDefault} core::int;
+        #t41.{core::Set::add}{Invariant}(#t44);
+      }
   } =>#t41, block {
-    final core::Set<core::int> #t42 = col::LinkedHashSet::•<core::int>();
-    final core::Iterable<dynamic>? #t43 = a;
-    if(!#t43.{core::Object::==}(null))
-      for (final dynamic #t44 in #t43{core::Iterable<dynamic>}) {
-        final core::int #t45 = #t44 as{TypeError,ForNonNullableByDefault} core::int;
-        #t42.{core::Set::add}(#t45);
+    final core::Set<core::int> #t45 = col::LinkedHashSet::•<core::int>();
+    final core::Iterable<dynamic>? #t46 = b;
+    if(!#t46.{core::Object::==}(null))
+      for (final dynamic #t47 in #t46{core::Iterable<dynamic>}) {
+        final core::int #t48 = #t47 as{TypeError,ForNonNullableByDefault} core::int;
+        #t45.{core::Set::add}{Invariant}(#t48);
       }
-  } =>#t42, block {
-    final core::Set<core::int> #t46 = col::LinkedHashSet::•<core::int>();
-    final core::Iterable<dynamic>? #t47 = b;
-    if(!#t47.{core::Object::==}(null))
-      for (final dynamic #t48 in #t47{core::Iterable<dynamic>}) {
-        final core::int #t49 = #t48 as{TypeError,ForNonNullableByDefault} core::int;
-        #t46.{core::Set::add}(#t49);
+  } =>#t45, block {
+    final core::Set<core::int> #t49 = col::LinkedHashSet::•<core::int>();
+    final core::Iterable<dynamic>? #t50 = c;
+    if(!#t50.{core::Object::==}(null))
+      for (final dynamic #t51 in #t50{core::Iterable<dynamic>}) {
+        final core::int #t52 = #t51 as{TypeError,ForNonNullableByDefault} core::int;
+        #t49.{core::Set::add}{Invariant}(#t52);
       }
-  } =>#t46, block {
-    final core::Set<core::int> #t50 = col::LinkedHashSet::•<core::int>();
-    final core::Iterable<dynamic>? #t51 = c;
-    if(!#t51.{core::Object::==}(null))
-      for (final dynamic #t52 in #t51{core::Iterable<dynamic>}) {
-        final core::int #t53 = #t52 as{TypeError,ForNonNullableByDefault} core::int;
-        #t50.{core::Set::add}(#t53);
-      }
-  } =>#t50, block {
-    final core::Map<core::int, core::int> #t54 = <core::int, core::int>{};
-    final core::Map<core::int, core::int>? #t55 = d;
-    if(!#t55.{core::Object::==}(null))
-      for (final core::MapEntry<core::int, core::int> #t56 in #t55{core::Map<core::int, core::int>}.{core::Map::entries})
-        #t54.{core::Map::[]=}(#t56.{core::MapEntry::key}, #t56.{core::MapEntry::value});
-  } =>#t54, block {
-    final core::Set<core::int> #t57 = col::LinkedHashSet::•<core::int>();
+  } =>#t49, block {
+    final core::Map<core::int, core::int> #t53 = <core::int, core::int>{};
+    final core::Map<core::int, core::int>? #t54 = d;
+    if(!#t54.{core::Object::==}(null))
+      for (final core::MapEntry<core::int, core::int> #t55 in #t54{core::Map<core::int, core::int>}.{core::Map::entries})
+        #t53.{core::Map::[]=}{Invariant}(#t55.{core::MapEntry::key}, #t55.{core::MapEntry::value});
+  } =>#t53, block {
+    final core::Set<core::int> #t56 = col::LinkedHashSet::•<core::int>();
     if(condition) {
-      final core::Iterable<dynamic>? #t58 = a;
-      if(!#t58.{core::Object::==}(null))
-        for (final dynamic #t59 in #t58{core::Iterable<dynamic>}) {
-          final core::int #t60 = #t59 as{TypeError,ForNonNullableByDefault} core::int;
-          #t57.{core::Set::add}(#t60);
+      final core::Iterable<dynamic>? #t57 = a;
+      if(!#t57.{core::Object::==}(null))
+        for (final dynamic #t58 in #t57{core::Iterable<dynamic>}) {
+          final core::int #t59 = #t58 as{TypeError,ForNonNullableByDefault} core::int;
+          #t56.{core::Set::add}{Invariant}(#t59);
         }
     }
-  } =>#t57, block {
-    final core::Set<core::int> #t61 = col::LinkedHashSet::•<core::int>();
+  } =>#t56, block {
+    final core::Set<core::int> #t60 = col::LinkedHashSet::•<core::int>();
     if(condition) {
-      final core::Iterable<dynamic>? #t62 = b;
-      if(!#t62.{core::Object::==}(null))
-        for (final dynamic #t63 in #t62{core::Iterable<dynamic>}) {
-          final core::int #t64 = #t63 as{TypeError,ForNonNullableByDefault} core::int;
-          #t61.{core::Set::add}(#t64);
+      final core::Iterable<dynamic>? #t61 = b;
+      if(!#t61.{core::Object::==}(null))
+        for (final dynamic #t62 in #t61{core::Iterable<dynamic>}) {
+          final core::int #t63 = #t62 as{TypeError,ForNonNullableByDefault} core::int;
+          #t60.{core::Set::add}{Invariant}(#t63);
         }
     }
-  } =>#t61, block {
-    final core::Set<core::int> #t65 = col::LinkedHashSet::•<core::int>();
+  } =>#t60, block {
+    final core::Set<core::int> #t64 = col::LinkedHashSet::•<core::int>();
     if(condition) {
-      final core::Iterable<dynamic>? #t66 = c;
-      if(!#t66.{core::Object::==}(null))
-        for (final dynamic #t67 in #t66{core::Iterable<dynamic>}) {
-          final core::int #t68 = #t67 as{TypeError,ForNonNullableByDefault} core::int;
-          #t65.{core::Set::add}(#t68);
+      final core::Iterable<dynamic>? #t65 = c;
+      if(!#t65.{core::Object::==}(null))
+        for (final dynamic #t66 in #t65{core::Iterable<dynamic>}) {
+          final core::int #t67 = #t66 as{TypeError,ForNonNullableByDefault} core::int;
+          #t64.{core::Set::add}{Invariant}(#t67);
         }
     }
-  } =>#t65, block {
-    final core::Map<core::int, core::int> #t69 = <core::int, core::int>{};
+  } =>#t64, block {
+    final core::Map<core::int, core::int> #t68 = <core::int, core::int>{};
     if(condition) {
-      final core::Map<core::int, core::int>? #t70 = d;
-      if(!#t70.{core::Object::==}(null))
-        for (final core::MapEntry<core::int, core::int> #t71 in #t70{core::Map<core::int, core::int>}.{core::Map::entries})
-          #t69.{core::Map::[]=}(#t71.{core::MapEntry::key}, #t71.{core::MapEntry::value});
+      final core::Map<core::int, core::int>? #t69 = d;
+      if(!#t69.{core::Object::==}(null))
+        for (final core::MapEntry<core::int, core::int> #t70 in #t69{core::Map<core::int, core::int>}.{core::Map::entries})
+          #t68.{core::Map::[]=}{Invariant}(#t70.{core::MapEntry::key}, #t70.{core::MapEntry::value});
     }
-  } =>#t69, block {
-    final core::Set<core::int> #t72 = col::LinkedHashSet::•<core::int>();
+  } =>#t68, block {
+    final core::Set<core::int> #t71 = col::LinkedHashSet::•<core::int>();
     for (dynamic e in iterable) {
-      final core::Iterable<dynamic>? #t73 = a;
-      if(!#t73.{core::Object::==}(null))
-        for (final dynamic #t74 in #t73{core::Iterable<dynamic>}) {
-          final core::int #t75 = #t74 as{TypeError,ForNonNullableByDefault} core::int;
-          #t72.{core::Set::add}(#t75);
+      final core::Iterable<dynamic>? #t72 = a;
+      if(!#t72.{core::Object::==}(null))
+        for (final dynamic #t73 in #t72{core::Iterable<dynamic>}) {
+          final core::int #t74 = #t73 as{TypeError,ForNonNullableByDefault} core::int;
+          #t71.{core::Set::add}{Invariant}(#t74);
         }
     }
-  } =>#t72, block {
-    final core::Set<core::int> #t76 = col::LinkedHashSet::•<core::int>();
+  } =>#t71, block {
+    final core::Set<core::int> #t75 = col::LinkedHashSet::•<core::int>();
     for (dynamic e in iterable) {
-      final core::Iterable<dynamic>? #t77 = b;
-      if(!#t77.{core::Object::==}(null))
-        for (final dynamic #t78 in #t77{core::Iterable<dynamic>}) {
-          final core::int #t79 = #t78 as{TypeError,ForNonNullableByDefault} core::int;
-          #t76.{core::Set::add}(#t79);
+      final core::Iterable<dynamic>? #t76 = b;
+      if(!#t76.{core::Object::==}(null))
+        for (final dynamic #t77 in #t76{core::Iterable<dynamic>}) {
+          final core::int #t78 = #t77 as{TypeError,ForNonNullableByDefault} core::int;
+          #t75.{core::Set::add}{Invariant}(#t78);
         }
     }
-  } =>#t76, block {
-    final core::Set<core::int> #t80 = col::LinkedHashSet::•<core::int>();
+  } =>#t75, block {
+    final core::Set<core::int> #t79 = col::LinkedHashSet::•<core::int>();
     for (dynamic e in iterable) {
-      final core::Iterable<dynamic>? #t81 = c;
-      if(!#t81.{core::Object::==}(null))
-        for (final dynamic #t82 in #t81{core::Iterable<dynamic>}) {
-          final core::int #t83 = #t82 as{TypeError,ForNonNullableByDefault} core::int;
-          #t80.{core::Set::add}(#t83);
+      final core::Iterable<dynamic>? #t80 = c;
+      if(!#t80.{core::Object::==}(null))
+        for (final dynamic #t81 in #t80{core::Iterable<dynamic>}) {
+          final core::int #t82 = #t81 as{TypeError,ForNonNullableByDefault} core::int;
+          #t79.{core::Set::add}{Invariant}(#t82);
         }
     }
-  } =>#t80, block {
-    final core::Map<core::int, core::int> #t84 = <core::int, core::int>{};
+  } =>#t79, block {
+    final core::Map<core::int, core::int> #t83 = <core::int, core::int>{};
     for (dynamic e in iterable) {
-      final core::Map<core::int, core::int>? #t85 = d;
-      if(!#t85.{core::Object::==}(null))
-        for (final core::MapEntry<core::int, core::int> #t86 in #t85{core::Map<core::int, core::int>}.{core::Map::entries})
-          #t84.{core::Map::[]=}(#t86.{core::MapEntry::key}, #t86.{core::MapEntry::value});
+      final core::Map<core::int, core::int>? #t84 = d;
+      if(!#t84.{core::Object::==}(null))
+        for (final core::MapEntry<core::int, core::int> #t85 in #t84{core::Map<core::int, core::int>}.{core::Map::entries})
+          #t83.{core::Map::[]=}{Invariant}(#t85.{core::MapEntry::key}, #t85.{core::MapEntry::value});
     }
-  } =>#t84, block {
-    final core::Set<core::int> #t87 = col::LinkedHashSet::•<core::int>();
+  } =>#t83, block {
+    final core::Set<core::int> #t86 = col::LinkedHashSet::•<core::int>();
     for (core::int i = 0; i.{core::num::<}(42); i = i.{core::num::+}(1)) {
-      final core::Iterable<dynamic>? #t88 = a;
-      if(!#t88.{core::Object::==}(null))
-        for (final dynamic #t89 in #t88{core::Iterable<dynamic>}) {
-          final core::int #t90 = #t89 as{TypeError,ForNonNullableByDefault} core::int;
-          #t87.{core::Set::add}(#t90);
+      final core::Iterable<dynamic>? #t87 = a;
+      if(!#t87.{core::Object::==}(null))
+        for (final dynamic #t88 in #t87{core::Iterable<dynamic>}) {
+          final core::int #t89 = #t88 as{TypeError,ForNonNullableByDefault} core::int;
+          #t86.{core::Set::add}{Invariant}(#t89);
         }
     }
-  } =>#t87, block {
-    final core::Set<core::int> #t91 = col::LinkedHashSet::•<core::int>();
+  } =>#t86, block {
+    final core::Set<core::int> #t90 = col::LinkedHashSet::•<core::int>();
     for (core::int i = 0; i.{core::num::<}(42); i = i.{core::num::+}(1)) {
-      final core::Iterable<dynamic>? #t92 = b;
-      if(!#t92.{core::Object::==}(null))
-        for (final dynamic #t93 in #t92{core::Iterable<dynamic>}) {
-          final core::int #t94 = #t93 as{TypeError,ForNonNullableByDefault} core::int;
-          #t91.{core::Set::add}(#t94);
+      final core::Iterable<dynamic>? #t91 = b;
+      if(!#t91.{core::Object::==}(null))
+        for (final dynamic #t92 in #t91{core::Iterable<dynamic>}) {
+          final core::int #t93 = #t92 as{TypeError,ForNonNullableByDefault} core::int;
+          #t90.{core::Set::add}{Invariant}(#t93);
         }
     }
-  } =>#t91, block {
-    final core::Set<core::int> #t95 = col::LinkedHashSet::•<core::int>();
+  } =>#t90, block {
+    final core::Set<core::int> #t94 = col::LinkedHashSet::•<core::int>();
     for (core::int i = 0; i.{core::num::<}(42); i = i.{core::num::+}(1)) {
-      final core::Iterable<dynamic>? #t96 = c;
-      if(!#t96.{core::Object::==}(null))
-        for (final dynamic #t97 in #t96{core::Iterable<dynamic>}) {
-          final core::int #t98 = #t97 as{TypeError,ForNonNullableByDefault} core::int;
-          #t95.{core::Set::add}(#t98);
+      final core::Iterable<dynamic>? #t95 = c;
+      if(!#t95.{core::Object::==}(null))
+        for (final dynamic #t96 in #t95{core::Iterable<dynamic>}) {
+          final core::int #t97 = #t96 as{TypeError,ForNonNullableByDefault} core::int;
+          #t94.{core::Set::add}{Invariant}(#t97);
         }
     }
-  } =>#t95, block {
-    final core::Map<core::int, core::int> #t99 = <core::int, core::int>{};
+  } =>#t94, block {
+    final core::Map<core::int, core::int> #t98 = <core::int, core::int>{};
     for (core::int i = 0; i.{core::num::<}(42); i = i.{core::num::+}(1)) {
-      final core::Map<core::int, core::int>? #t100 = d;
-      if(!#t100.{core::Object::==}(null))
-        for (final core::MapEntry<core::int, core::int> #t101 in #t100{core::Map<core::int, core::int>}.{core::Map::entries})
-          #t99.{core::Map::[]=}(#t101.{core::MapEntry::key}, #t101.{core::MapEntry::value});
+      final core::Map<core::int, core::int>? #t99 = d;
+      if(!#t99.{core::Object::==}(null))
+        for (final core::MapEntry<core::int, core::int> #t100 in #t99{core::Map<core::int, core::int>}.{core::Map::entries})
+          #t98.{core::Map::[]=}{Invariant}(#t100.{core::MapEntry::key}, #t100.{core::MapEntry::value});
     }
-  } =>#t99];
+  } =>#t98];
 }
 static method bar<X extends core::List<core::int>? = core::List<core::int>?, Y extends core::Set<core::int>? = core::Set<core::int>?, Z extends core::Iterable<core::int>? = core::Iterable<core::int>?, W extends core::Map<core::int, core::int>? = core::Map<core::int, core::int>?>(core::bool condition, core::Iterable<dynamic> iterable, self::bar::X% x, self::bar::Y% y, self::bar::Z% z, self::bar::W% w) → dynamic {
   return <core::Object>[ block {
-    final core::Set<core::int> #t102 = col::LinkedHashSet::•<core::int>();
-    for (final dynamic #t103 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:50:9: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+    final core::Set<core::int> #t101 = col::LinkedHashSet::•<core::int>();
+    for (final dynamic #t102 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:50:9: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {...x}, // Error.
         ^") {
-      final core::int #t104 = #t103 as{TypeError,ForNonNullableByDefault} core::int;
-      #t102.{core::Set::add}(#t104);
+      final core::int #t103 = #t102 as{TypeError,ForNonNullableByDefault} core::int;
+      #t101.{core::Set::add}{Invariant}(#t103);
     }
-  } =>#t102, block {
-    final core::Set<core::int> #t105 = col::LinkedHashSet::•<core::int>();
-    for (final dynamic #t106 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:51:9: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+  } =>#t101, block {
+    final core::Set<core::int> #t104 = col::LinkedHashSet::•<core::int>();
+    for (final dynamic #t105 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:51:9: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {...y}, // Error.
         ^") {
-      final core::int #t107 = #t106 as{TypeError,ForNonNullableByDefault} core::int;
-      #t105.{core::Set::add}(#t107);
+      final core::int #t106 = #t105 as{TypeError,ForNonNullableByDefault} core::int;
+      #t104.{core::Set::add}{Invariant}(#t106);
     }
-  } =>#t105, block {
-    final core::Set<core::int> #t108 = col::LinkedHashSet::•<core::int>();
-    for (final dynamic #t109 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:52:9: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+  } =>#t104, block {
+    final core::Set<core::int> #t107 = col::LinkedHashSet::•<core::int>();
+    for (final dynamic #t108 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:52:9: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {...z}, // Error.
         ^") {
-      final core::int #t110 = #t109 as{TypeError,ForNonNullableByDefault} core::int;
-      #t108.{core::Set::add}(#t110);
+      final core::int #t109 = #t108 as{TypeError,ForNonNullableByDefault} core::int;
+      #t107.{core::Set::add}{Invariant}(#t109);
     }
-  } =>#t108, <core::int, core::int>{invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:53:9: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+  } =>#t107, <core::int, core::int>{invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:53:9: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {...w}, // Error.
         ^": null}, <core::int, core::int>{invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:54:19: Error: Unexpected type 'X' of a map spread entry.  Expected 'dynamic' or a Map.
     <int, int>{...x}, // Error.
-                  ^": null}, let final core::Set<core::int> #t111 = col::LinkedHashSet::•<core::int>() in let final dynamic #t112 = #t111.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:55:14: Error: Unexpected type 'W' of a spread.  Expected 'dynamic' or an Iterable.
+                  ^": null}, block {
+    final core::Set<core::int> #t110 = col::LinkedHashSet::•<core::int>();
+    #t110.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:55:14: Error: Unexpected type 'W' of a spread.  Expected 'dynamic' or an Iterable.
     <int>{...w}, // Error.
-             ^") in #t111, block {
-    final core::Set<core::int> #t113 = col::LinkedHashSet::•<core::int>();
+             ^");
+  } =>#t110, block {
+    final core::Set<core::int> #t111 = col::LinkedHashSet::•<core::int>();
     if(condition)
-      for (final dynamic #t114 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:56:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      for (final dynamic #t112 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:56:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {if (condition) ...x}, // Error.
                        ^") {
-        final core::int #t115 = #t114 as{TypeError,ForNonNullableByDefault} core::int;
-        #t113.{core::Set::add}(#t115);
+        final core::int #t113 = #t112 as{TypeError,ForNonNullableByDefault} core::int;
+        #t111.{core::Set::add}{Invariant}(#t113);
       }
-  } =>#t113, block {
-    final core::Set<core::int> #t116 = col::LinkedHashSet::•<core::int>();
+  } =>#t111, block {
+    final core::Set<core::int> #t114 = col::LinkedHashSet::•<core::int>();
     if(condition)
-      for (final dynamic #t117 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:57:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      for (final dynamic #t115 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:57:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {if (condition) ...y}, // Error.
                        ^") {
-        final core::int #t118 = #t117 as{TypeError,ForNonNullableByDefault} core::int;
-        #t116.{core::Set::add}(#t118);
+        final core::int #t116 = #t115 as{TypeError,ForNonNullableByDefault} core::int;
+        #t114.{core::Set::add}{Invariant}(#t116);
       }
-  } =>#t116, block {
-    final core::Set<core::int> #t119 = col::LinkedHashSet::•<core::int>();
+  } =>#t114, block {
+    final core::Set<core::int> #t117 = col::LinkedHashSet::•<core::int>();
     if(condition)
-      for (final dynamic #t120 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:58:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      for (final dynamic #t118 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:58:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {if (condition) ...z}, // Error.
                        ^") {
-        final core::int #t121 = #t120 as{TypeError,ForNonNullableByDefault} core::int;
-        #t119.{core::Set::add}(#t121);
+        final core::int #t119 = #t118 as{TypeError,ForNonNullableByDefault} core::int;
+        #t117.{core::Set::add}{Invariant}(#t119);
       }
-  } =>#t119, block {
-    final core::Map<core::int, core::int> #t122 = <core::int, core::int>{};
+  } =>#t117, block {
+    final core::Map<core::int, core::int> #t120 = <core::int, core::int>{};
     if(condition)
-      #t122.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:59:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      #t120.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:59:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {if (condition) ...w}, // Error.
                        ^", null);
-  } =>#t122, block {
-    final core::Set<core::int> #t123 = col::LinkedHashSet::•<core::int>();
+  } =>#t120, block {
+    final core::Set<core::int> #t121 = col::LinkedHashSet::•<core::int>();
     for (dynamic e in iterable)
-      for (final dynamic #t124 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:60:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      for (final dynamic #t122 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:60:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {for (dynamic e in iterable) ...x}, // Error.
                                     ^") {
-        final core::int #t125 = #t124 as{TypeError,ForNonNullableByDefault} core::int;
-        #t123.{core::Set::add}(#t125);
+        final core::int #t123 = #t122 as{TypeError,ForNonNullableByDefault} core::int;
+        #t121.{core::Set::add}{Invariant}(#t123);
       }
-  } =>#t123, block {
-    final core::Set<core::int> #t126 = col::LinkedHashSet::•<core::int>();
+  } =>#t121, block {
+    final core::Set<core::int> #t124 = col::LinkedHashSet::•<core::int>();
     for (dynamic e in iterable)
-      for (final dynamic #t127 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:61:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      for (final dynamic #t125 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:61:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {for (dynamic e in iterable) ...y}, // Error.
                                     ^") {
-        final core::int #t128 = #t127 as{TypeError,ForNonNullableByDefault} core::int;
-        #t126.{core::Set::add}(#t128);
+        final core::int #t126 = #t125 as{TypeError,ForNonNullableByDefault} core::int;
+        #t124.{core::Set::add}{Invariant}(#t126);
       }
-  } =>#t126, block {
-    final core::Set<core::int> #t129 = col::LinkedHashSet::•<core::int>();
+  } =>#t124, block {
+    final core::Set<core::int> #t127 = col::LinkedHashSet::•<core::int>();
     for (dynamic e in iterable)
-      for (final dynamic #t130 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:62:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      for (final dynamic #t128 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:62:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {for (dynamic e in iterable) ...z}, // Error.
                                     ^") {
-        final core::int #t131 = #t130 as{TypeError,ForNonNullableByDefault} core::int;
-        #t129.{core::Set::add}(#t131);
+        final core::int #t129 = #t128 as{TypeError,ForNonNullableByDefault} core::int;
+        #t127.{core::Set::add}{Invariant}(#t129);
       }
-  } =>#t129, block {
-    final core::Map<core::int, core::int> #t132 = <core::int, core::int>{};
+  } =>#t127, block {
+    final core::Map<core::int, core::int> #t130 = <core::int, core::int>{};
     for (dynamic e in iterable)
-      #t132.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:63:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      #t130.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:63:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {for (dynamic e in iterable) ...w}, // Error.
                                     ^", null);
-  } =>#t132, block {
-    final core::Set<core::int> #t133 = col::LinkedHashSet::•<core::int>();
+  } =>#t130, block {
+    final core::Set<core::int> #t131 = col::LinkedHashSet::•<core::int>();
     for (core::int i = 0; i.{core::num::<}(42); i = i.{core::num::+}(1))
-      for (final dynamic #t134 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:64:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      for (final dynamic #t132 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:64:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {for (int i = 0; i < 42; ++i) ...x}, // Error.
                                      ^") {
-        final core::int #t135 = #t134 as{TypeError,ForNonNullableByDefault} core::int;
-        #t133.{core::Set::add}(#t135);
+        final core::int #t133 = #t132 as{TypeError,ForNonNullableByDefault} core::int;
+        #t131.{core::Set::add}{Invariant}(#t133);
       }
-  } =>#t133, block {
-    final core::Set<core::int> #t136 = col::LinkedHashSet::•<core::int>();
+  } =>#t131, block {
+    final core::Set<core::int> #t134 = col::LinkedHashSet::•<core::int>();
     for (core::int i = 0; i.{core::num::<}(42); i = i.{core::num::+}(1))
-      for (final dynamic #t137 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:65:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      for (final dynamic #t135 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:65:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {for (int i = 0; i < 42; ++i) ...y}, // Error.
                                      ^") {
-        final core::int #t138 = #t137 as{TypeError,ForNonNullableByDefault} core::int;
-        #t136.{core::Set::add}(#t138);
+        final core::int #t136 = #t135 as{TypeError,ForNonNullableByDefault} core::int;
+        #t134.{core::Set::add}{Invariant}(#t136);
       }
-  } =>#t136, block {
-    final core::Set<core::int> #t139 = col::LinkedHashSet::•<core::int>();
+  } =>#t134, block {
+    final core::Set<core::int> #t137 = col::LinkedHashSet::•<core::int>();
     for (core::int i = 0; i.{core::num::<}(42); i = i.{core::num::+}(1))
-      for (final dynamic #t140 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:66:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      for (final dynamic #t138 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:66:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {for (int i = 0; i < 42; ++i) ...z}, // Error.
                                      ^") {
-        final core::int #t141 = #t140 as{TypeError,ForNonNullableByDefault} core::int;
-        #t139.{core::Set::add}(#t141);
+        final core::int #t139 = #t138 as{TypeError,ForNonNullableByDefault} core::int;
+        #t137.{core::Set::add}{Invariant}(#t139);
       }
-  } =>#t139, block {
-    final core::Map<core::int, core::int> #t142 = <core::int, core::int>{};
+  } =>#t137, block {
+    final core::Map<core::int, core::int> #t140 = <core::int, core::int>{};
     for (core::int i = 0; i.{core::num::<}(42); i = i.{core::num::+}(1))
-      #t142.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:67:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      #t140.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:67:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {for (int i = 0; i < 42; ++i) ...w}, // Error.
                                      ^", null);
-  } =>#t142, block {
-    final core::Set<core::int> #t143 = col::LinkedHashSet::•<core::int>();
-    final core::Iterable<dynamic>? #t144 = x;
-    if(!#t144.{core::Object::==}(null))
-      for (final dynamic #t145 in #t144{core::Iterable<dynamic>}) {
-        final core::int #t146 = #t145 as{TypeError,ForNonNullableByDefault} core::int;
-        #t143.{core::Set::add}(#t146);
+  } =>#t140, block {
+    final core::Set<core::int> #t141 = col::LinkedHashSet::•<core::int>();
+    final core::Iterable<dynamic>? #t142 = x;
+    if(!#t142.{core::Object::==}(null))
+      for (final dynamic #t143 in #t142{core::Iterable<dynamic>}) {
+        final core::int #t144 = #t143 as{TypeError,ForNonNullableByDefault} core::int;
+        #t141.{core::Set::add}{Invariant}(#t144);
       }
-  } =>#t143, block {
-    final core::Set<core::int> #t147 = col::LinkedHashSet::•<core::int>();
-    final core::Iterable<dynamic>? #t148 = y;
-    if(!#t148.{core::Object::==}(null))
-      for (final dynamic #t149 in #t148{core::Iterable<dynamic>}) {
-        final core::int #t150 = #t149 as{TypeError,ForNonNullableByDefault} core::int;
-        #t147.{core::Set::add}(#t150);
+  } =>#t141, block {
+    final core::Set<core::int> #t145 = col::LinkedHashSet::•<core::int>();
+    final core::Iterable<dynamic>? #t146 = y;
+    if(!#t146.{core::Object::==}(null))
+      for (final dynamic #t147 in #t146{core::Iterable<dynamic>}) {
+        final core::int #t148 = #t147 as{TypeError,ForNonNullableByDefault} core::int;
+        #t145.{core::Set::add}{Invariant}(#t148);
       }
-  } =>#t147, block {
-    final core::Set<core::int> #t151 = col::LinkedHashSet::•<core::int>();
-    final core::Iterable<dynamic>? #t152 = z;
-    if(!#t152.{core::Object::==}(null))
-      for (final dynamic #t153 in #t152{core::Iterable<dynamic>}) {
-        final core::int #t154 = #t153 as{TypeError,ForNonNullableByDefault} core::int;
-        #t151.{core::Set::add}(#t154);
+  } =>#t145, block {
+    final core::Set<core::int> #t149 = col::LinkedHashSet::•<core::int>();
+    final core::Iterable<dynamic>? #t150 = z;
+    if(!#t150.{core::Object::==}(null))
+      for (final dynamic #t151 in #t150{core::Iterable<dynamic>}) {
+        final core::int #t152 = #t151 as{TypeError,ForNonNullableByDefault} core::int;
+        #t149.{core::Set::add}{Invariant}(#t152);
       }
-  } =>#t151, block {
-    final core::Map<core::int, core::int> #t155 = <core::int, core::int>{};
-    final core::Map<core::int, core::int>? #t156 = w;
-    if(!#t156.{core::Object::==}(null))
-      for (final core::MapEntry<core::int, core::int> #t157 in #t156{core::Map<core::int, core::int>}.{core::Map::entries})
-        #t155.{core::Map::[]=}(#t157.{core::MapEntry::key}, #t157.{core::MapEntry::value});
-  } =>#t155, block {
-    final core::Set<core::int> #t158 = col::LinkedHashSet::•<core::int>();
+  } =>#t149, block {
+    final core::Map<core::int, core::int> #t153 = <core::int, core::int>{};
+    final core::Map<core::int, core::int>? #t154 = w;
+    if(!#t154.{core::Object::==}(null))
+      for (final core::MapEntry<core::int, core::int> #t155 in #t154{core::Map<core::int, core::int>}.{core::Map::entries})
+        #t153.{core::Map::[]=}{Invariant}(#t155.{core::MapEntry::key}, #t155.{core::MapEntry::value});
+  } =>#t153, block {
+    final core::Set<core::int> #t156 = col::LinkedHashSet::•<core::int>();
     if(condition) {
-      final core::Iterable<dynamic>? #t159 = x;
-      if(!#t159.{core::Object::==}(null))
-        for (final dynamic #t160 in #t159{core::Iterable<dynamic>}) {
-          final core::int #t161 = #t160 as{TypeError,ForNonNullableByDefault} core::int;
-          #t158.{core::Set::add}(#t161);
+      final core::Iterable<dynamic>? #t157 = x;
+      if(!#t157.{core::Object::==}(null))
+        for (final dynamic #t158 in #t157{core::Iterable<dynamic>}) {
+          final core::int #t159 = #t158 as{TypeError,ForNonNullableByDefault} core::int;
+          #t156.{core::Set::add}{Invariant}(#t159);
         }
     }
-  } =>#t158, block {
-    final core::Set<core::int> #t162 = col::LinkedHashSet::•<core::int>();
+  } =>#t156, block {
+    final core::Set<core::int> #t160 = col::LinkedHashSet::•<core::int>();
     if(condition) {
-      final core::Iterable<dynamic>? #t163 = y;
-      if(!#t163.{core::Object::==}(null))
-        for (final dynamic #t164 in #t163{core::Iterable<dynamic>}) {
-          final core::int #t165 = #t164 as{TypeError,ForNonNullableByDefault} core::int;
-          #t162.{core::Set::add}(#t165);
+      final core::Iterable<dynamic>? #t161 = y;
+      if(!#t161.{core::Object::==}(null))
+        for (final dynamic #t162 in #t161{core::Iterable<dynamic>}) {
+          final core::int #t163 = #t162 as{TypeError,ForNonNullableByDefault} core::int;
+          #t160.{core::Set::add}{Invariant}(#t163);
         }
     }
-  } =>#t162, block {
-    final core::Set<core::int> #t166 = col::LinkedHashSet::•<core::int>();
+  } =>#t160, block {
+    final core::Set<core::int> #t164 = col::LinkedHashSet::•<core::int>();
     if(condition) {
-      final core::Iterable<dynamic>? #t167 = z;
-      if(!#t167.{core::Object::==}(null))
-        for (final dynamic #t168 in #t167{core::Iterable<dynamic>}) {
-          final core::int #t169 = #t168 as{TypeError,ForNonNullableByDefault} core::int;
-          #t166.{core::Set::add}(#t169);
+      final core::Iterable<dynamic>? #t165 = z;
+      if(!#t165.{core::Object::==}(null))
+        for (final dynamic #t166 in #t165{core::Iterable<dynamic>}) {
+          final core::int #t167 = #t166 as{TypeError,ForNonNullableByDefault} core::int;
+          #t164.{core::Set::add}{Invariant}(#t167);
         }
     }
-  } =>#t166, block {
-    final core::Map<core::int, core::int> #t170 = <core::int, core::int>{};
+  } =>#t164, block {
+    final core::Map<core::int, core::int> #t168 = <core::int, core::int>{};
     if(condition) {
-      final core::Map<core::int, core::int>? #t171 = w;
-      if(!#t171.{core::Object::==}(null))
-        for (final core::MapEntry<core::int, core::int> #t172 in #t171{core::Map<core::int, core::int>}.{core::Map::entries})
-          #t170.{core::Map::[]=}(#t172.{core::MapEntry::key}, #t172.{core::MapEntry::value});
+      final core::Map<core::int, core::int>? #t169 = w;
+      if(!#t169.{core::Object::==}(null))
+        for (final core::MapEntry<core::int, core::int> #t170 in #t169{core::Map<core::int, core::int>}.{core::Map::entries})
+          #t168.{core::Map::[]=}{Invariant}(#t170.{core::MapEntry::key}, #t170.{core::MapEntry::value});
     }
-  } =>#t170, block {
-    final core::Set<core::int> #t173 = col::LinkedHashSet::•<core::int>();
+  } =>#t168, block {
+    final core::Set<core::int> #t171 = col::LinkedHashSet::•<core::int>();
     for (dynamic e in iterable) {
-      final core::Iterable<dynamic>? #t174 = x;
-      if(!#t174.{core::Object::==}(null))
-        for (final dynamic #t175 in #t174{core::Iterable<dynamic>}) {
-          final core::int #t176 = #t175 as{TypeError,ForNonNullableByDefault} core::int;
-          #t173.{core::Set::add}(#t176);
+      final core::Iterable<dynamic>? #t172 = x;
+      if(!#t172.{core::Object::==}(null))
+        for (final dynamic #t173 in #t172{core::Iterable<dynamic>}) {
+          final core::int #t174 = #t173 as{TypeError,ForNonNullableByDefault} core::int;
+          #t171.{core::Set::add}{Invariant}(#t174);
         }
     }
-  } =>#t173, block {
-    final core::Set<core::int> #t177 = col::LinkedHashSet::•<core::int>();
+  } =>#t171, block {
+    final core::Set<core::int> #t175 = col::LinkedHashSet::•<core::int>();
     for (dynamic e in iterable) {
-      final core::Iterable<dynamic>? #t178 = y;
-      if(!#t178.{core::Object::==}(null))
-        for (final dynamic #t179 in #t178{core::Iterable<dynamic>}) {
-          final core::int #t180 = #t179 as{TypeError,ForNonNullableByDefault} core::int;
-          #t177.{core::Set::add}(#t180);
+      final core::Iterable<dynamic>? #t176 = y;
+      if(!#t176.{core::Object::==}(null))
+        for (final dynamic #t177 in #t176{core::Iterable<dynamic>}) {
+          final core::int #t178 = #t177 as{TypeError,ForNonNullableByDefault} core::int;
+          #t175.{core::Set::add}{Invariant}(#t178);
         }
     }
-  } =>#t177, block {
-    final core::Set<core::int> #t181 = col::LinkedHashSet::•<core::int>();
+  } =>#t175, block {
+    final core::Set<core::int> #t179 = col::LinkedHashSet::•<core::int>();
     for (dynamic e in iterable) {
-      final core::Iterable<dynamic>? #t182 = z;
-      if(!#t182.{core::Object::==}(null))
-        for (final dynamic #t183 in #t182{core::Iterable<dynamic>}) {
-          final core::int #t184 = #t183 as{TypeError,ForNonNullableByDefault} core::int;
-          #t181.{core::Set::add}(#t184);
+      final core::Iterable<dynamic>? #t180 = z;
+      if(!#t180.{core::Object::==}(null))
+        for (final dynamic #t181 in #t180{core::Iterable<dynamic>}) {
+          final core::int #t182 = #t181 as{TypeError,ForNonNullableByDefault} core::int;
+          #t179.{core::Set::add}{Invariant}(#t182);
         }
     }
-  } =>#t181, block {
-    final core::Map<core::int, core::int> #t185 = <core::int, core::int>{};
+  } =>#t179, block {
+    final core::Map<core::int, core::int> #t183 = <core::int, core::int>{};
     for (dynamic e in iterable) {
-      final core::Map<core::int, core::int>? #t186 = w;
-      if(!#t186.{core::Object::==}(null))
-        for (final core::MapEntry<core::int, core::int> #t187 in #t186{core::Map<core::int, core::int>}.{core::Map::entries})
-          #t185.{core::Map::[]=}(#t187.{core::MapEntry::key}, #t187.{core::MapEntry::value});
+      final core::Map<core::int, core::int>? #t184 = w;
+      if(!#t184.{core::Object::==}(null))
+        for (final core::MapEntry<core::int, core::int> #t185 in #t184{core::Map<core::int, core::int>}.{core::Map::entries})
+          #t183.{core::Map::[]=}{Invariant}(#t185.{core::MapEntry::key}, #t185.{core::MapEntry::value});
     }
-  } =>#t185, block {
-    final core::Set<core::int> #t188 = col::LinkedHashSet::•<core::int>();
+  } =>#t183, block {
+    final core::Set<core::int> #t186 = col::LinkedHashSet::•<core::int>();
     for (core::int i = 0; i.{core::num::<}(42); i = i.{core::num::+}(1)) {
-      final core::Iterable<dynamic>? #t189 = x;
-      if(!#t189.{core::Object::==}(null))
-        for (final dynamic #t190 in #t189{core::Iterable<dynamic>}) {
-          final core::int #t191 = #t190 as{TypeError,ForNonNullableByDefault} core::int;
-          #t188.{core::Set::add}(#t191);
+      final core::Iterable<dynamic>? #t187 = x;
+      if(!#t187.{core::Object::==}(null))
+        for (final dynamic #t188 in #t187{core::Iterable<dynamic>}) {
+          final core::int #t189 = #t188 as{TypeError,ForNonNullableByDefault} core::int;
+          #t186.{core::Set::add}{Invariant}(#t189);
         }
     }
-  } =>#t188, block {
-    final core::Set<core::int> #t192 = col::LinkedHashSet::•<core::int>();
+  } =>#t186, block {
+    final core::Set<core::int> #t190 = col::LinkedHashSet::•<core::int>();
     for (core::int i = 0; i.{core::num::<}(42); i = i.{core::num::+}(1)) {
-      final core::Iterable<dynamic>? #t193 = y;
-      if(!#t193.{core::Object::==}(null))
-        for (final dynamic #t194 in #t193{core::Iterable<dynamic>}) {
-          final core::int #t195 = #t194 as{TypeError,ForNonNullableByDefault} core::int;
-          #t192.{core::Set::add}(#t195);
+      final core::Iterable<dynamic>? #t191 = y;
+      if(!#t191.{core::Object::==}(null))
+        for (final dynamic #t192 in #t191{core::Iterable<dynamic>}) {
+          final core::int #t193 = #t192 as{TypeError,ForNonNullableByDefault} core::int;
+          #t190.{core::Set::add}{Invariant}(#t193);
         }
     }
-  } =>#t192, block {
-    final core::Set<core::int> #t196 = col::LinkedHashSet::•<core::int>();
+  } =>#t190, block {
+    final core::Set<core::int> #t194 = col::LinkedHashSet::•<core::int>();
     for (core::int i = 0; i.{core::num::<}(42); i = i.{core::num::+}(1)) {
-      final core::Iterable<dynamic>? #t197 = z;
-      if(!#t197.{core::Object::==}(null))
-        for (final dynamic #t198 in #t197{core::Iterable<dynamic>}) {
-          final core::int #t199 = #t198 as{TypeError,ForNonNullableByDefault} core::int;
-          #t196.{core::Set::add}(#t199);
+      final core::Iterable<dynamic>? #t195 = z;
+      if(!#t195.{core::Object::==}(null))
+        for (final dynamic #t196 in #t195{core::Iterable<dynamic>}) {
+          final core::int #t197 = #t196 as{TypeError,ForNonNullableByDefault} core::int;
+          #t194.{core::Set::add}{Invariant}(#t197);
         }
     }
-  } =>#t196, block {
-    final core::Map<core::int, core::int> #t200 = <core::int, core::int>{};
+  } =>#t194, block {
+    final core::Map<core::int, core::int> #t198 = <core::int, core::int>{};
     for (core::int i = 0; i.{core::num::<}(42); i = i.{core::num::+}(1)) {
-      final core::Map<core::int, core::int>? #t201 = w;
-      if(!#t201.{core::Object::==}(null))
-        for (final core::MapEntry<core::int, core::int> #t202 in #t201{core::Map<core::int, core::int>}.{core::Map::entries})
-          #t200.{core::Map::[]=}(#t202.{core::MapEntry::key}, #t202.{core::MapEntry::value});
+      final core::Map<core::int, core::int>? #t199 = w;
+      if(!#t199.{core::Object::==}(null))
+        for (final core::MapEntry<core::int, core::int> #t200 in #t199{core::Map<core::int, core::int>}.{core::Map::entries})
+          #t198.{core::Map::[]=}{Invariant}(#t200.{core::MapEntry::key}, #t200.{core::MapEntry::value});
     }
-  } =>#t200];
+  } =>#t198];
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue43495.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue43495.dart.strong.transformed.expect
index 84cd03a..e3ffc57 100644
--- a/pkg/front_end/testcases/nnbd/issue43495.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue43495.dart.strong.transformed.expect
@@ -175,7 +175,7 @@
     {...a}, // Error.
         ^") {
       final core::int #t3 = #t2 as{TypeError,ForNonNullableByDefault} core::int;
-      #t1.{core::Set::add}(#t3);
+      #t1.{core::Set::add}{Invariant}(#t3);
     }
   } =>#t1, block {
     final core::Set<core::int> #t4 = new col::_CompactLinkedHashSet::•<core::int>();
@@ -183,7 +183,7 @@
     {...b}, // Error.
         ^") {
       final core::int #t6 = #t5 as{TypeError,ForNonNullableByDefault} core::int;
-      #t4.{core::Set::add}(#t6);
+      #t4.{core::Set::add}{Invariant}(#t6);
     }
   } =>#t4, block {
     final core::Set<core::int> #t7 = new col::_CompactLinkedHashSet::•<core::int>();
@@ -191,775 +191,781 @@
     {...c}, // Error.
         ^") {
       final core::int #t9 = #t8 as{TypeError,ForNonNullableByDefault} core::int;
-      #t7.{core::Set::add}(#t9);
+      #t7.{core::Set::add}{Invariant}(#t9);
     }
   } =>#t7, <core::int, core::int>{invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:11:9: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {...d}, // Error.
         ^": null}, <core::int, core::int>{invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:12:19: Error: Unexpected type 'List<int>?' of a map spread entry.  Expected 'dynamic' or a Map.
  - 'List' is from 'dart:core'.
     <int, int>{...a}, // Error.
-                  ^": null}, let final core::Set<core::int> #t10 = new col::_CompactLinkedHashSet::•<core::int>() in let final core::bool #t11 = #t10.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:13:14: Error: Unexpected type 'Map<int, int>?' of a spread.  Expected 'dynamic' or an Iterable.
+                  ^": null}, block {
+    final core::Set<core::int> #t10 = new col::_CompactLinkedHashSet::•<core::int>();
+    #t10.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:13:14: Error: Unexpected type 'Map<int, int>?' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
     <int>{...d}, // Error.
-             ^") in #t10, block {
-    final core::Set<core::int> #t12 = new col::_CompactLinkedHashSet::•<core::int>();
+             ^");
+  } =>#t10, block {
+    final core::Set<core::int> #t11 = new col::_CompactLinkedHashSet::•<core::int>();
     if(condition)
-      for (final dynamic #t13 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:14:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      for (final dynamic #t12 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:14:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {if (condition) ...a}, // Error.
                        ^") {
-        final core::int #t14 = #t13 as{TypeError,ForNonNullableByDefault} core::int;
-        #t12.{core::Set::add}(#t14);
+        final core::int #t13 = #t12 as{TypeError,ForNonNullableByDefault} core::int;
+        #t11.{core::Set::add}{Invariant}(#t13);
       }
-  } =>#t12, block {
-    final core::Set<core::int> #t15 = new col::_CompactLinkedHashSet::•<core::int>();
+  } =>#t11, block {
+    final core::Set<core::int> #t14 = new col::_CompactLinkedHashSet::•<core::int>();
     if(condition)
-      for (final dynamic #t16 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:15:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      for (final dynamic #t15 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:15:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {if (condition) ...b}, // Error.
                        ^") {
-        final core::int #t17 = #t16 as{TypeError,ForNonNullableByDefault} core::int;
-        #t15.{core::Set::add}(#t17);
+        final core::int #t16 = #t15 as{TypeError,ForNonNullableByDefault} core::int;
+        #t14.{core::Set::add}{Invariant}(#t16);
       }
-  } =>#t15, block {
-    final core::Set<core::int> #t18 = new col::_CompactLinkedHashSet::•<core::int>();
+  } =>#t14, block {
+    final core::Set<core::int> #t17 = new col::_CompactLinkedHashSet::•<core::int>();
     if(condition)
-      for (final dynamic #t19 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:16:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      for (final dynamic #t18 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:16:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {if (condition) ...c}, // Error.
                        ^") {
-        final core::int #t20 = #t19 as{TypeError,ForNonNullableByDefault} core::int;
-        #t18.{core::Set::add}(#t20);
+        final core::int #t19 = #t18 as{TypeError,ForNonNullableByDefault} core::int;
+        #t17.{core::Set::add}{Invariant}(#t19);
       }
-  } =>#t18, block {
-    final core::Map<core::int, core::int> #t21 = <core::int, core::int>{};
+  } =>#t17, block {
+    final core::Map<core::int, core::int> #t20 = <core::int, core::int>{};
     if(condition)
-      #t21.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:17:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      #t20.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:17:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {if (condition) ...d}, // Error.
                        ^", null);
-  } =>#t21, block {
-    final core::Set<core::int> #t22 = new col::_CompactLinkedHashSet::•<core::int>();
+  } =>#t20, block {
+    final core::Set<core::int> #t21 = new col::_CompactLinkedHashSet::•<core::int>();
     {
       core::Iterator<dynamic> :sync-for-iterator = iterable.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         dynamic e = :sync-for-iterator.{core::Iterator::current};
-        for (final dynamic #t23 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:18:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+        for (final dynamic #t22 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:18:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {for (dynamic e in iterable) ...a}, // Error.
                                     ^") {
-          final core::int #t24 = #t23 as{TypeError,ForNonNullableByDefault} core::int;
-          #t22.{core::Set::add}(#t24);
+          final core::int #t23 = #t22 as{TypeError,ForNonNullableByDefault} core::int;
+          #t21.{core::Set::add}{Invariant}(#t23);
         }
       }
     }
-  } =>#t22, block {
-    final core::Set<core::int> #t25 = new col::_CompactLinkedHashSet::•<core::int>();
+  } =>#t21, block {
+    final core::Set<core::int> #t24 = new col::_CompactLinkedHashSet::•<core::int>();
     {
       core::Iterator<dynamic> :sync-for-iterator = iterable.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         dynamic e = :sync-for-iterator.{core::Iterator::current};
-        for (final dynamic #t26 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:19:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+        for (final dynamic #t25 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:19:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {for (dynamic e in iterable) ...b}, // Error.
                                     ^") {
-          final core::int #t27 = #t26 as{TypeError,ForNonNullableByDefault} core::int;
-          #t25.{core::Set::add}(#t27);
+          final core::int #t26 = #t25 as{TypeError,ForNonNullableByDefault} core::int;
+          #t24.{core::Set::add}{Invariant}(#t26);
         }
       }
     }
-  } =>#t25, block {
-    final core::Set<core::int> #t28 = new col::_CompactLinkedHashSet::•<core::int>();
+  } =>#t24, block {
+    final core::Set<core::int> #t27 = new col::_CompactLinkedHashSet::•<core::int>();
     {
       core::Iterator<dynamic> :sync-for-iterator = iterable.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         dynamic e = :sync-for-iterator.{core::Iterator::current};
-        for (final dynamic #t29 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:20:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+        for (final dynamic #t28 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:20:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {for (dynamic e in iterable) ...c}, // Error.
                                     ^") {
-          final core::int #t30 = #t29 as{TypeError,ForNonNullableByDefault} core::int;
-          #t28.{core::Set::add}(#t30);
+          final core::int #t29 = #t28 as{TypeError,ForNonNullableByDefault} core::int;
+          #t27.{core::Set::add}{Invariant}(#t29);
         }
       }
     }
-  } =>#t28, block {
-    final core::Map<core::int, core::int> #t31 = <core::int, core::int>{};
+  } =>#t27, block {
+    final core::Map<core::int, core::int> #t30 = <core::int, core::int>{};
     {
       core::Iterator<dynamic> :sync-for-iterator = iterable.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         dynamic e = :sync-for-iterator.{core::Iterator::current};
-        #t31.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:21:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+        #t30.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:21:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {for (dynamic e in iterable) ...d}, // Error.
                                     ^", null);
       }
     }
-  } =>#t31, block {
-    final core::Set<core::int> #t32 = new col::_CompactLinkedHashSet::•<core::int>();
+  } =>#t30, block {
+    final core::Set<core::int> #t31 = new col::_CompactLinkedHashSet::•<core::int>();
     for (core::int i = 0; i.{core::num::<}(42); i = i.{core::num::+}(1))
-      for (final dynamic #t33 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:22:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      for (final dynamic #t32 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:22:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {for (int i = 0; i < 42; ++i) ...a}, // Error.
                                      ^") {
-        final core::int #t34 = #t33 as{TypeError,ForNonNullableByDefault} core::int;
-        #t32.{core::Set::add}(#t34);
+        final core::int #t33 = #t32 as{TypeError,ForNonNullableByDefault} core::int;
+        #t31.{core::Set::add}{Invariant}(#t33);
       }
-  } =>#t32, block {
-    final core::Set<core::int> #t35 = new col::_CompactLinkedHashSet::•<core::int>();
+  } =>#t31, block {
+    final core::Set<core::int> #t34 = new col::_CompactLinkedHashSet::•<core::int>();
     for (core::int i = 0; i.{core::num::<}(42); i = i.{core::num::+}(1))
-      for (final dynamic #t36 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:23:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      for (final dynamic #t35 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:23:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {for (int i = 0; i < 42; ++i) ...b}, // Error.
                                      ^") {
-        final core::int #t37 = #t36 as{TypeError,ForNonNullableByDefault} core::int;
-        #t35.{core::Set::add}(#t37);
+        final core::int #t36 = #t35 as{TypeError,ForNonNullableByDefault} core::int;
+        #t34.{core::Set::add}{Invariant}(#t36);
       }
-  } =>#t35, block {
-    final core::Set<core::int> #t38 = new col::_CompactLinkedHashSet::•<core::int>();
+  } =>#t34, block {
+    final core::Set<core::int> #t37 = new col::_CompactLinkedHashSet::•<core::int>();
     for (core::int i = 0; i.{core::num::<}(42); i = i.{core::num::+}(1))
-      for (final dynamic #t39 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:24:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      for (final dynamic #t38 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:24:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {for (int i = 0; i < 42; ++i) ...c}, // Error.
                                      ^") {
-        final core::int #t40 = #t39 as{TypeError,ForNonNullableByDefault} core::int;
-        #t38.{core::Set::add}(#t40);
+        final core::int #t39 = #t38 as{TypeError,ForNonNullableByDefault} core::int;
+        #t37.{core::Set::add}{Invariant}(#t39);
       }
-  } =>#t38, block {
-    final core::Map<core::int, core::int> #t41 = <core::int, core::int>{};
+  } =>#t37, block {
+    final core::Map<core::int, core::int> #t40 = <core::int, core::int>{};
     for (core::int i = 0; i.{core::num::<}(42); i = i.{core::num::+}(1))
-      #t41.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:25:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      #t40.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:25:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {for (int i = 0; i < 42; ++i) ...d}, // Error.
                                      ^", null);
+  } =>#t40, block {
+    final core::Set<core::int> #t41 = new col::_CompactLinkedHashSet::•<core::int>();
+    final core::Iterable<dynamic>? #t42 = a;
+    if(!#t42.{core::Object::==}(null)) {
+      core::Iterator<dynamic> :sync-for-iterator = #t42{core::Iterable<dynamic>}.{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final dynamic #t43 = :sync-for-iterator.{core::Iterator::current};
+        {
+          final core::int #t44 = #t43 as{TypeError,ForNonNullableByDefault} core::int;
+          #t41.{core::Set::add}{Invariant}(#t44);
+        }
+      }
+    }
   } =>#t41, block {
-    final core::Set<core::int> #t42 = new col::_CompactLinkedHashSet::•<core::int>();
-    final core::Iterable<dynamic>? #t43 = a;
-    if(!#t43.{core::Object::==}(null)) {
-      core::Iterator<dynamic> :sync-for-iterator = #t43{core::Iterable<dynamic>}.{core::Iterable::iterator};
+    final core::Set<core::int> #t45 = new col::_CompactLinkedHashSet::•<core::int>();
+    final core::Iterable<dynamic>? #t46 = b;
+    if(!#t46.{core::Object::==}(null)) {
+      core::Iterator<dynamic> :sync-for-iterator = #t46{core::Iterable<dynamic>}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final dynamic #t44 = :sync-for-iterator.{core::Iterator::current};
+        final dynamic #t47 = :sync-for-iterator.{core::Iterator::current};
         {
-          final core::int #t45 = #t44 as{TypeError,ForNonNullableByDefault} core::int;
-          #t42.{core::Set::add}(#t45);
+          final core::int #t48 = #t47 as{TypeError,ForNonNullableByDefault} core::int;
+          #t45.{core::Set::add}{Invariant}(#t48);
         }
       }
     }
-  } =>#t42, block {
-    final core::Set<core::int> #t46 = new col::_CompactLinkedHashSet::•<core::int>();
-    final core::Iterable<dynamic>? #t47 = b;
-    if(!#t47.{core::Object::==}(null)) {
-      core::Iterator<dynamic> :sync-for-iterator = #t47{core::Iterable<dynamic>}.{core::Iterable::iterator};
+  } =>#t45, block {
+    final core::Set<core::int> #t49 = new col::_CompactLinkedHashSet::•<core::int>();
+    final core::Iterable<dynamic>? #t50 = c;
+    if(!#t50.{core::Object::==}(null)) {
+      core::Iterator<dynamic> :sync-for-iterator = #t50{core::Iterable<dynamic>}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final dynamic #t48 = :sync-for-iterator.{core::Iterator::current};
+        final dynamic #t51 = :sync-for-iterator.{core::Iterator::current};
         {
-          final core::int #t49 = #t48 as{TypeError,ForNonNullableByDefault} core::int;
-          #t46.{core::Set::add}(#t49);
+          final core::int #t52 = #t51 as{TypeError,ForNonNullableByDefault} core::int;
+          #t49.{core::Set::add}{Invariant}(#t52);
         }
       }
     }
-  } =>#t46, block {
-    final core::Set<core::int> #t50 = new col::_CompactLinkedHashSet::•<core::int>();
-    final core::Iterable<dynamic>? #t51 = c;
-    if(!#t51.{core::Object::==}(null)) {
-      core::Iterator<dynamic> :sync-for-iterator = #t51{core::Iterable<dynamic>}.{core::Iterable::iterator};
+  } =>#t49, block {
+    final core::Map<core::int, core::int> #t53 = <core::int, core::int>{};
+    final core::Map<core::int, core::int>? #t54 = d;
+    if(!#t54.{core::Object::==}(null)) {
+      core::Iterator<core::MapEntry<core::int, core::int>> :sync-for-iterator = #t54{core::Map<core::int, core::int>}.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final dynamic #t52 = :sync-for-iterator.{core::Iterator::current};
-        {
-          final core::int #t53 = #t52 as{TypeError,ForNonNullableByDefault} core::int;
-          #t50.{core::Set::add}(#t53);
-        }
+        final core::MapEntry<core::int, core::int> #t55 = :sync-for-iterator.{core::Iterator::current};
+        #t53.{core::Map::[]=}{Invariant}(#t55.{core::MapEntry::key}, #t55.{core::MapEntry::value});
       }
     }
-  } =>#t50, block {
-    final core::Map<core::int, core::int> #t54 = <core::int, core::int>{};
-    final core::Map<core::int, core::int>? #t55 = d;
-    if(!#t55.{core::Object::==}(null)) {
-      core::Iterator<core::MapEntry<core::int, core::int>> :sync-for-iterator = #t55{core::Map<core::int, core::int>}.{core::Map::entries}.{core::Iterable::iterator};
-      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::MapEntry<core::int, core::int> #t56 = :sync-for-iterator.{core::Iterator::current};
-        #t54.{core::Map::[]=}(#t56.{core::MapEntry::key}, #t56.{core::MapEntry::value});
-      }
-    }
-  } =>#t54, block {
-    final core::Set<core::int> #t57 = new col::_CompactLinkedHashSet::•<core::int>();
+  } =>#t53, block {
+    final core::Set<core::int> #t56 = new col::_CompactLinkedHashSet::•<core::int>();
     if(condition) {
-      final core::Iterable<dynamic>? #t58 = a;
-      if(!#t58.{core::Object::==}(null)) {
-        core::Iterator<dynamic> :sync-for-iterator = #t58{core::Iterable<dynamic>}.{core::Iterable::iterator};
+      final core::Iterable<dynamic>? #t57 = a;
+      if(!#t57.{core::Object::==}(null)) {
+        core::Iterator<dynamic> :sync-for-iterator = #t57{core::Iterable<dynamic>}.{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final dynamic #t59 = :sync-for-iterator.{core::Iterator::current};
+          final dynamic #t58 = :sync-for-iterator.{core::Iterator::current};
           {
-            final core::int #t60 = #t59 as{TypeError,ForNonNullableByDefault} core::int;
-            #t57.{core::Set::add}(#t60);
+            final core::int #t59 = #t58 as{TypeError,ForNonNullableByDefault} core::int;
+            #t56.{core::Set::add}{Invariant}(#t59);
           }
         }
       }
     }
-  } =>#t57, block {
-    final core::Set<core::int> #t61 = new col::_CompactLinkedHashSet::•<core::int>();
+  } =>#t56, block {
+    final core::Set<core::int> #t60 = new col::_CompactLinkedHashSet::•<core::int>();
     if(condition) {
-      final core::Iterable<dynamic>? #t62 = b;
-      if(!#t62.{core::Object::==}(null)) {
-        core::Iterator<dynamic> :sync-for-iterator = #t62{core::Iterable<dynamic>}.{core::Iterable::iterator};
+      final core::Iterable<dynamic>? #t61 = b;
+      if(!#t61.{core::Object::==}(null)) {
+        core::Iterator<dynamic> :sync-for-iterator = #t61{core::Iterable<dynamic>}.{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final dynamic #t63 = :sync-for-iterator.{core::Iterator::current};
+          final dynamic #t62 = :sync-for-iterator.{core::Iterator::current};
           {
-            final core::int #t64 = #t63 as{TypeError,ForNonNullableByDefault} core::int;
-            #t61.{core::Set::add}(#t64);
+            final core::int #t63 = #t62 as{TypeError,ForNonNullableByDefault} core::int;
+            #t60.{core::Set::add}{Invariant}(#t63);
           }
         }
       }
     }
-  } =>#t61, block {
-    final core::Set<core::int> #t65 = new col::_CompactLinkedHashSet::•<core::int>();
+  } =>#t60, block {
+    final core::Set<core::int> #t64 = new col::_CompactLinkedHashSet::•<core::int>();
     if(condition) {
-      final core::Iterable<dynamic>? #t66 = c;
-      if(!#t66.{core::Object::==}(null)) {
-        core::Iterator<dynamic> :sync-for-iterator = #t66{core::Iterable<dynamic>}.{core::Iterable::iterator};
+      final core::Iterable<dynamic>? #t65 = c;
+      if(!#t65.{core::Object::==}(null)) {
+        core::Iterator<dynamic> :sync-for-iterator = #t65{core::Iterable<dynamic>}.{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final dynamic #t67 = :sync-for-iterator.{core::Iterator::current};
+          final dynamic #t66 = :sync-for-iterator.{core::Iterator::current};
           {
-            final core::int #t68 = #t67 as{TypeError,ForNonNullableByDefault} core::int;
-            #t65.{core::Set::add}(#t68);
+            final core::int #t67 = #t66 as{TypeError,ForNonNullableByDefault} core::int;
+            #t64.{core::Set::add}{Invariant}(#t67);
           }
         }
       }
     }
-  } =>#t65, block {
-    final core::Map<core::int, core::int> #t69 = <core::int, core::int>{};
+  } =>#t64, block {
+    final core::Map<core::int, core::int> #t68 = <core::int, core::int>{};
     if(condition) {
-      final core::Map<core::int, core::int>? #t70 = d;
-      if(!#t70.{core::Object::==}(null)) {
-        core::Iterator<core::MapEntry<core::int, core::int>> :sync-for-iterator = #t70{core::Map<core::int, core::int>}.{core::Map::entries}.{core::Iterable::iterator};
+      final core::Map<core::int, core::int>? #t69 = d;
+      if(!#t69.{core::Object::==}(null)) {
+        core::Iterator<core::MapEntry<core::int, core::int>> :sync-for-iterator = #t69{core::Map<core::int, core::int>}.{core::Map::entries}.{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final core::MapEntry<core::int, core::int> #t71 = :sync-for-iterator.{core::Iterator::current};
-          #t69.{core::Map::[]=}(#t71.{core::MapEntry::key}, #t71.{core::MapEntry::value});
+          final core::MapEntry<core::int, core::int> #t70 = :sync-for-iterator.{core::Iterator::current};
+          #t68.{core::Map::[]=}{Invariant}(#t70.{core::MapEntry::key}, #t70.{core::MapEntry::value});
         }
       }
     }
-  } =>#t69, block {
-    final core::Set<core::int> #t72 = new col::_CompactLinkedHashSet::•<core::int>();
+  } =>#t68, block {
+    final core::Set<core::int> #t71 = new col::_CompactLinkedHashSet::•<core::int>();
     {
       core::Iterator<dynamic> :sync-for-iterator = iterable.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         dynamic e = :sync-for-iterator.{core::Iterator::current};
         {
-          final core::Iterable<dynamic>? #t73 = a;
-          if(!#t73.{core::Object::==}(null)) {
-            core::Iterator<dynamic> :sync-for-iterator = #t73{core::Iterable<dynamic>}.{core::Iterable::iterator};
+          final core::Iterable<dynamic>? #t72 = a;
+          if(!#t72.{core::Object::==}(null)) {
+            core::Iterator<dynamic> :sync-for-iterator = #t72{core::Iterable<dynamic>}.{core::Iterable::iterator};
             for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-              final dynamic #t74 = :sync-for-iterator.{core::Iterator::current};
+              final dynamic #t73 = :sync-for-iterator.{core::Iterator::current};
               {
-                final core::int #t75 = #t74 as{TypeError,ForNonNullableByDefault} core::int;
-                #t72.{core::Set::add}(#t75);
+                final core::int #t74 = #t73 as{TypeError,ForNonNullableByDefault} core::int;
+                #t71.{core::Set::add}{Invariant}(#t74);
               }
             }
           }
         }
       }
     }
-  } =>#t72, block {
-    final core::Set<core::int> #t76 = new col::_CompactLinkedHashSet::•<core::int>();
+  } =>#t71, block {
+    final core::Set<core::int> #t75 = new col::_CompactLinkedHashSet::•<core::int>();
     {
       core::Iterator<dynamic> :sync-for-iterator = iterable.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         dynamic e = :sync-for-iterator.{core::Iterator::current};
         {
-          final core::Iterable<dynamic>? #t77 = b;
-          if(!#t77.{core::Object::==}(null)) {
-            core::Iterator<dynamic> :sync-for-iterator = #t77{core::Iterable<dynamic>}.{core::Iterable::iterator};
+          final core::Iterable<dynamic>? #t76 = b;
+          if(!#t76.{core::Object::==}(null)) {
+            core::Iterator<dynamic> :sync-for-iterator = #t76{core::Iterable<dynamic>}.{core::Iterable::iterator};
             for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-              final dynamic #t78 = :sync-for-iterator.{core::Iterator::current};
+              final dynamic #t77 = :sync-for-iterator.{core::Iterator::current};
               {
-                final core::int #t79 = #t78 as{TypeError,ForNonNullableByDefault} core::int;
-                #t76.{core::Set::add}(#t79);
+                final core::int #t78 = #t77 as{TypeError,ForNonNullableByDefault} core::int;
+                #t75.{core::Set::add}{Invariant}(#t78);
               }
             }
           }
         }
       }
     }
-  } =>#t76, block {
-    final core::Set<core::int> #t80 = new col::_CompactLinkedHashSet::•<core::int>();
+  } =>#t75, block {
+    final core::Set<core::int> #t79 = new col::_CompactLinkedHashSet::•<core::int>();
     {
       core::Iterator<dynamic> :sync-for-iterator = iterable.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         dynamic e = :sync-for-iterator.{core::Iterator::current};
         {
-          final core::Iterable<dynamic>? #t81 = c;
-          if(!#t81.{core::Object::==}(null)) {
-            core::Iterator<dynamic> :sync-for-iterator = #t81{core::Iterable<dynamic>}.{core::Iterable::iterator};
+          final core::Iterable<dynamic>? #t80 = c;
+          if(!#t80.{core::Object::==}(null)) {
+            core::Iterator<dynamic> :sync-for-iterator = #t80{core::Iterable<dynamic>}.{core::Iterable::iterator};
             for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-              final dynamic #t82 = :sync-for-iterator.{core::Iterator::current};
+              final dynamic #t81 = :sync-for-iterator.{core::Iterator::current};
               {
-                final core::int #t83 = #t82 as{TypeError,ForNonNullableByDefault} core::int;
-                #t80.{core::Set::add}(#t83);
+                final core::int #t82 = #t81 as{TypeError,ForNonNullableByDefault} core::int;
+                #t79.{core::Set::add}{Invariant}(#t82);
               }
             }
           }
         }
       }
     }
-  } =>#t80, block {
-    final core::Map<core::int, core::int> #t84 = <core::int, core::int>{};
+  } =>#t79, block {
+    final core::Map<core::int, core::int> #t83 = <core::int, core::int>{};
     {
       core::Iterator<dynamic> :sync-for-iterator = iterable.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         dynamic e = :sync-for-iterator.{core::Iterator::current};
         {
-          final core::Map<core::int, core::int>? #t85 = d;
-          if(!#t85.{core::Object::==}(null)) {
-            core::Iterator<core::MapEntry<core::int, core::int>> :sync-for-iterator = #t85{core::Map<core::int, core::int>}.{core::Map::entries}.{core::Iterable::iterator};
+          final core::Map<core::int, core::int>? #t84 = d;
+          if(!#t84.{core::Object::==}(null)) {
+            core::Iterator<core::MapEntry<core::int, core::int>> :sync-for-iterator = #t84{core::Map<core::int, core::int>}.{core::Map::entries}.{core::Iterable::iterator};
             for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-              final core::MapEntry<core::int, core::int> #t86 = :sync-for-iterator.{core::Iterator::current};
-              #t84.{core::Map::[]=}(#t86.{core::MapEntry::key}, #t86.{core::MapEntry::value});
+              final core::MapEntry<core::int, core::int> #t85 = :sync-for-iterator.{core::Iterator::current};
+              #t83.{core::Map::[]=}{Invariant}(#t85.{core::MapEntry::key}, #t85.{core::MapEntry::value});
             }
           }
         }
       }
     }
-  } =>#t84, block {
-    final core::Set<core::int> #t87 = new col::_CompactLinkedHashSet::•<core::int>();
+  } =>#t83, block {
+    final core::Set<core::int> #t86 = new col::_CompactLinkedHashSet::•<core::int>();
     for (core::int i = 0; i.{core::num::<}(42); i = i.{core::num::+}(1)) {
-      final core::Iterable<dynamic>? #t88 = a;
-      if(!#t88.{core::Object::==}(null)) {
-        core::Iterator<dynamic> :sync-for-iterator = #t88{core::Iterable<dynamic>}.{core::Iterable::iterator};
+      final core::Iterable<dynamic>? #t87 = a;
+      if(!#t87.{core::Object::==}(null)) {
+        core::Iterator<dynamic> :sync-for-iterator = #t87{core::Iterable<dynamic>}.{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final dynamic #t89 = :sync-for-iterator.{core::Iterator::current};
+          final dynamic #t88 = :sync-for-iterator.{core::Iterator::current};
           {
-            final core::int #t90 = #t89 as{TypeError,ForNonNullableByDefault} core::int;
-            #t87.{core::Set::add}(#t90);
+            final core::int #t89 = #t88 as{TypeError,ForNonNullableByDefault} core::int;
+            #t86.{core::Set::add}{Invariant}(#t89);
           }
         }
       }
     }
-  } =>#t87, block {
-    final core::Set<core::int> #t91 = new col::_CompactLinkedHashSet::•<core::int>();
+  } =>#t86, block {
+    final core::Set<core::int> #t90 = new col::_CompactLinkedHashSet::•<core::int>();
     for (core::int i = 0; i.{core::num::<}(42); i = i.{core::num::+}(1)) {
-      final core::Iterable<dynamic>? #t92 = b;
-      if(!#t92.{core::Object::==}(null)) {
-        core::Iterator<dynamic> :sync-for-iterator = #t92{core::Iterable<dynamic>}.{core::Iterable::iterator};
+      final core::Iterable<dynamic>? #t91 = b;
+      if(!#t91.{core::Object::==}(null)) {
+        core::Iterator<dynamic> :sync-for-iterator = #t91{core::Iterable<dynamic>}.{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final dynamic #t93 = :sync-for-iterator.{core::Iterator::current};
+          final dynamic #t92 = :sync-for-iterator.{core::Iterator::current};
           {
-            final core::int #t94 = #t93 as{TypeError,ForNonNullableByDefault} core::int;
-            #t91.{core::Set::add}(#t94);
+            final core::int #t93 = #t92 as{TypeError,ForNonNullableByDefault} core::int;
+            #t90.{core::Set::add}{Invariant}(#t93);
           }
         }
       }
     }
-  } =>#t91, block {
-    final core::Set<core::int> #t95 = new col::_CompactLinkedHashSet::•<core::int>();
+  } =>#t90, block {
+    final core::Set<core::int> #t94 = new col::_CompactLinkedHashSet::•<core::int>();
     for (core::int i = 0; i.{core::num::<}(42); i = i.{core::num::+}(1)) {
-      final core::Iterable<dynamic>? #t96 = c;
-      if(!#t96.{core::Object::==}(null)) {
-        core::Iterator<dynamic> :sync-for-iterator = #t96{core::Iterable<dynamic>}.{core::Iterable::iterator};
+      final core::Iterable<dynamic>? #t95 = c;
+      if(!#t95.{core::Object::==}(null)) {
+        core::Iterator<dynamic> :sync-for-iterator = #t95{core::Iterable<dynamic>}.{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final dynamic #t97 = :sync-for-iterator.{core::Iterator::current};
+          final dynamic #t96 = :sync-for-iterator.{core::Iterator::current};
           {
-            final core::int #t98 = #t97 as{TypeError,ForNonNullableByDefault} core::int;
-            #t95.{core::Set::add}(#t98);
+            final core::int #t97 = #t96 as{TypeError,ForNonNullableByDefault} core::int;
+            #t94.{core::Set::add}{Invariant}(#t97);
           }
         }
       }
     }
-  } =>#t95, block {
-    final core::Map<core::int, core::int> #t99 = <core::int, core::int>{};
+  } =>#t94, block {
+    final core::Map<core::int, core::int> #t98 = <core::int, core::int>{};
     for (core::int i = 0; i.{core::num::<}(42); i = i.{core::num::+}(1)) {
-      final core::Map<core::int, core::int>? #t100 = d;
-      if(!#t100.{core::Object::==}(null)) {
-        core::Iterator<core::MapEntry<core::int, core::int>> :sync-for-iterator = #t100{core::Map<core::int, core::int>}.{core::Map::entries}.{core::Iterable::iterator};
+      final core::Map<core::int, core::int>? #t99 = d;
+      if(!#t99.{core::Object::==}(null)) {
+        core::Iterator<core::MapEntry<core::int, core::int>> :sync-for-iterator = #t99{core::Map<core::int, core::int>}.{core::Map::entries}.{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final core::MapEntry<core::int, core::int> #t101 = :sync-for-iterator.{core::Iterator::current};
-          #t99.{core::Map::[]=}(#t101.{core::MapEntry::key}, #t101.{core::MapEntry::value});
+          final core::MapEntry<core::int, core::int> #t100 = :sync-for-iterator.{core::Iterator::current};
+          #t98.{core::Map::[]=}{Invariant}(#t100.{core::MapEntry::key}, #t100.{core::MapEntry::value});
         }
       }
     }
-  } =>#t99];
+  } =>#t98];
 }
 static method bar<X extends core::List<core::int>? = core::List<core::int>?, Y extends core::Set<core::int>? = core::Set<core::int>?, Z extends core::Iterable<core::int>? = core::Iterable<core::int>?, W extends core::Map<core::int, core::int>? = core::Map<core::int, core::int>?>(core::bool condition, core::Iterable<dynamic> iterable, self::bar::X% x, self::bar::Y% y, self::bar::Z% z, self::bar::W% w) → dynamic {
   return <core::Object>[ block {
-    final core::Set<core::int> #t102 = new col::_CompactLinkedHashSet::•<core::int>();
-    for (final dynamic #t103 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:50:9: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+    final core::Set<core::int> #t101 = new col::_CompactLinkedHashSet::•<core::int>();
+    for (final dynamic #t102 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:50:9: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {...x}, // Error.
         ^") {
-      final core::int #t104 = #t103 as{TypeError,ForNonNullableByDefault} core::int;
-      #t102.{core::Set::add}(#t104);
+      final core::int #t103 = #t102 as{TypeError,ForNonNullableByDefault} core::int;
+      #t101.{core::Set::add}{Invariant}(#t103);
     }
-  } =>#t102, block {
-    final core::Set<core::int> #t105 = new col::_CompactLinkedHashSet::•<core::int>();
-    for (final dynamic #t106 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:51:9: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+  } =>#t101, block {
+    final core::Set<core::int> #t104 = new col::_CompactLinkedHashSet::•<core::int>();
+    for (final dynamic #t105 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:51:9: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {...y}, // Error.
         ^") {
-      final core::int #t107 = #t106 as{TypeError,ForNonNullableByDefault} core::int;
-      #t105.{core::Set::add}(#t107);
+      final core::int #t106 = #t105 as{TypeError,ForNonNullableByDefault} core::int;
+      #t104.{core::Set::add}{Invariant}(#t106);
     }
-  } =>#t105, block {
-    final core::Set<core::int> #t108 = new col::_CompactLinkedHashSet::•<core::int>();
-    for (final dynamic #t109 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:52:9: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+  } =>#t104, block {
+    final core::Set<core::int> #t107 = new col::_CompactLinkedHashSet::•<core::int>();
+    for (final dynamic #t108 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:52:9: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {...z}, // Error.
         ^") {
-      final core::int #t110 = #t109 as{TypeError,ForNonNullableByDefault} core::int;
-      #t108.{core::Set::add}(#t110);
+      final core::int #t109 = #t108 as{TypeError,ForNonNullableByDefault} core::int;
+      #t107.{core::Set::add}{Invariant}(#t109);
     }
-  } =>#t108, <core::int, core::int>{invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:53:9: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+  } =>#t107, <core::int, core::int>{invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:53:9: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {...w}, // Error.
         ^": null}, <core::int, core::int>{invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:54:19: Error: Unexpected type 'X' of a map spread entry.  Expected 'dynamic' or a Map.
     <int, int>{...x}, // Error.
-                  ^": null}, let final core::Set<core::int> #t111 = new col::_CompactLinkedHashSet::•<core::int>() in let final core::bool #t112 = #t111.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:55:14: Error: Unexpected type 'W' of a spread.  Expected 'dynamic' or an Iterable.
+                  ^": null}, block {
+    final core::Set<core::int> #t110 = new col::_CompactLinkedHashSet::•<core::int>();
+    #t110.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:55:14: Error: Unexpected type 'W' of a spread.  Expected 'dynamic' or an Iterable.
     <int>{...w}, // Error.
-             ^") in #t111, block {
-    final core::Set<core::int> #t113 = new col::_CompactLinkedHashSet::•<core::int>();
+             ^");
+  } =>#t110, block {
+    final core::Set<core::int> #t111 = new col::_CompactLinkedHashSet::•<core::int>();
     if(condition)
-      for (final dynamic #t114 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:56:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      for (final dynamic #t112 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:56:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {if (condition) ...x}, // Error.
                        ^") {
-        final core::int #t115 = #t114 as{TypeError,ForNonNullableByDefault} core::int;
-        #t113.{core::Set::add}(#t115);
+        final core::int #t113 = #t112 as{TypeError,ForNonNullableByDefault} core::int;
+        #t111.{core::Set::add}{Invariant}(#t113);
       }
-  } =>#t113, block {
-    final core::Set<core::int> #t116 = new col::_CompactLinkedHashSet::•<core::int>();
+  } =>#t111, block {
+    final core::Set<core::int> #t114 = new col::_CompactLinkedHashSet::•<core::int>();
     if(condition)
-      for (final dynamic #t117 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:57:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      for (final dynamic #t115 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:57:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {if (condition) ...y}, // Error.
                        ^") {
-        final core::int #t118 = #t117 as{TypeError,ForNonNullableByDefault} core::int;
-        #t116.{core::Set::add}(#t118);
+        final core::int #t116 = #t115 as{TypeError,ForNonNullableByDefault} core::int;
+        #t114.{core::Set::add}{Invariant}(#t116);
       }
-  } =>#t116, block {
-    final core::Set<core::int> #t119 = new col::_CompactLinkedHashSet::•<core::int>();
+  } =>#t114, block {
+    final core::Set<core::int> #t117 = new col::_CompactLinkedHashSet::•<core::int>();
     if(condition)
-      for (final dynamic #t120 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:58:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      for (final dynamic #t118 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:58:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {if (condition) ...z}, // Error.
                        ^") {
-        final core::int #t121 = #t120 as{TypeError,ForNonNullableByDefault} core::int;
-        #t119.{core::Set::add}(#t121);
+        final core::int #t119 = #t118 as{TypeError,ForNonNullableByDefault} core::int;
+        #t117.{core::Set::add}{Invariant}(#t119);
       }
-  } =>#t119, block {
-    final core::Map<core::int, core::int> #t122 = <core::int, core::int>{};
+  } =>#t117, block {
+    final core::Map<core::int, core::int> #t120 = <core::int, core::int>{};
     if(condition)
-      #t122.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:59:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      #t120.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:59:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {if (condition) ...w}, // Error.
                        ^", null);
-  } =>#t122, block {
-    final core::Set<core::int> #t123 = new col::_CompactLinkedHashSet::•<core::int>();
+  } =>#t120, block {
+    final core::Set<core::int> #t121 = new col::_CompactLinkedHashSet::•<core::int>();
     {
       core::Iterator<dynamic> :sync-for-iterator = iterable.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         dynamic e = :sync-for-iterator.{core::Iterator::current};
-        for (final dynamic #t124 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:60:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+        for (final dynamic #t122 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:60:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {for (dynamic e in iterable) ...x}, // Error.
                                     ^") {
-          final core::int #t125 = #t124 as{TypeError,ForNonNullableByDefault} core::int;
-          #t123.{core::Set::add}(#t125);
+          final core::int #t123 = #t122 as{TypeError,ForNonNullableByDefault} core::int;
+          #t121.{core::Set::add}{Invariant}(#t123);
         }
       }
     }
-  } =>#t123, block {
-    final core::Set<core::int> #t126 = new col::_CompactLinkedHashSet::•<core::int>();
+  } =>#t121, block {
+    final core::Set<core::int> #t124 = new col::_CompactLinkedHashSet::•<core::int>();
     {
       core::Iterator<dynamic> :sync-for-iterator = iterable.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         dynamic e = :sync-for-iterator.{core::Iterator::current};
-        for (final dynamic #t127 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:61:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+        for (final dynamic #t125 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:61:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {for (dynamic e in iterable) ...y}, // Error.
                                     ^") {
-          final core::int #t128 = #t127 as{TypeError,ForNonNullableByDefault} core::int;
-          #t126.{core::Set::add}(#t128);
+          final core::int #t126 = #t125 as{TypeError,ForNonNullableByDefault} core::int;
+          #t124.{core::Set::add}{Invariant}(#t126);
         }
       }
     }
-  } =>#t126, block {
-    final core::Set<core::int> #t129 = new col::_CompactLinkedHashSet::•<core::int>();
+  } =>#t124, block {
+    final core::Set<core::int> #t127 = new col::_CompactLinkedHashSet::•<core::int>();
     {
       core::Iterator<dynamic> :sync-for-iterator = iterable.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         dynamic e = :sync-for-iterator.{core::Iterator::current};
-        for (final dynamic #t130 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:62:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+        for (final dynamic #t128 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:62:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {for (dynamic e in iterable) ...z}, // Error.
                                     ^") {
-          final core::int #t131 = #t130 as{TypeError,ForNonNullableByDefault} core::int;
-          #t129.{core::Set::add}(#t131);
+          final core::int #t129 = #t128 as{TypeError,ForNonNullableByDefault} core::int;
+          #t127.{core::Set::add}{Invariant}(#t129);
         }
       }
     }
-  } =>#t129, block {
-    final core::Map<core::int, core::int> #t132 = <core::int, core::int>{};
+  } =>#t127, block {
+    final core::Map<core::int, core::int> #t130 = <core::int, core::int>{};
     {
       core::Iterator<dynamic> :sync-for-iterator = iterable.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         dynamic e = :sync-for-iterator.{core::Iterator::current};
-        #t132.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:63:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+        #t130.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:63:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {for (dynamic e in iterable) ...w}, // Error.
                                     ^", null);
       }
     }
-  } =>#t132, block {
-    final core::Set<core::int> #t133 = new col::_CompactLinkedHashSet::•<core::int>();
+  } =>#t130, block {
+    final core::Set<core::int> #t131 = new col::_CompactLinkedHashSet::•<core::int>();
     for (core::int i = 0; i.{core::num::<}(42); i = i.{core::num::+}(1))
-      for (final dynamic #t134 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:64:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      for (final dynamic #t132 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:64:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {for (int i = 0; i < 42; ++i) ...x}, // Error.
                                      ^") {
-        final core::int #t135 = #t134 as{TypeError,ForNonNullableByDefault} core::int;
-        #t133.{core::Set::add}(#t135);
+        final core::int #t133 = #t132 as{TypeError,ForNonNullableByDefault} core::int;
+        #t131.{core::Set::add}{Invariant}(#t133);
       }
-  } =>#t133, block {
-    final core::Set<core::int> #t136 = new col::_CompactLinkedHashSet::•<core::int>();
+  } =>#t131, block {
+    final core::Set<core::int> #t134 = new col::_CompactLinkedHashSet::•<core::int>();
     for (core::int i = 0; i.{core::num::<}(42); i = i.{core::num::+}(1))
-      for (final dynamic #t137 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:65:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      for (final dynamic #t135 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:65:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {for (int i = 0; i < 42; ++i) ...y}, // Error.
                                      ^") {
-        final core::int #t138 = #t137 as{TypeError,ForNonNullableByDefault} core::int;
-        #t136.{core::Set::add}(#t138);
+        final core::int #t136 = #t135 as{TypeError,ForNonNullableByDefault} core::int;
+        #t134.{core::Set::add}{Invariant}(#t136);
       }
-  } =>#t136, block {
-    final core::Set<core::int> #t139 = new col::_CompactLinkedHashSet::•<core::int>();
+  } =>#t134, block {
+    final core::Set<core::int> #t137 = new col::_CompactLinkedHashSet::•<core::int>();
     for (core::int i = 0; i.{core::num::<}(42); i = i.{core::num::+}(1))
-      for (final dynamic #t140 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:66:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      for (final dynamic #t138 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:66:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {for (int i = 0; i < 42; ++i) ...z}, // Error.
                                      ^") {
-        final core::int #t141 = #t140 as{TypeError,ForNonNullableByDefault} core::int;
-        #t139.{core::Set::add}(#t141);
+        final core::int #t139 = #t138 as{TypeError,ForNonNullableByDefault} core::int;
+        #t137.{core::Set::add}{Invariant}(#t139);
       }
-  } =>#t139, block {
-    final core::Map<core::int, core::int> #t142 = <core::int, core::int>{};
+  } =>#t137, block {
+    final core::Map<core::int, core::int> #t140 = <core::int, core::int>{};
     for (core::int i = 0; i.{core::num::<}(42); i = i.{core::num::+}(1))
-      #t142.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:67:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      #t140.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:67:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {for (int i = 0; i < 42; ++i) ...w}, // Error.
                                      ^", null);
-  } =>#t142, block {
-    final core::Set<core::int> #t143 = new col::_CompactLinkedHashSet::•<core::int>();
-    final core::Iterable<dynamic>? #t144 = x;
-    if(!#t144.{core::Object::==}(null)) {
-      core::Iterator<dynamic> :sync-for-iterator = #t144{core::Iterable<dynamic>}.{core::Iterable::iterator};
+  } =>#t140, block {
+    final core::Set<core::int> #t141 = new col::_CompactLinkedHashSet::•<core::int>();
+    final core::Iterable<dynamic>? #t142 = x;
+    if(!#t142.{core::Object::==}(null)) {
+      core::Iterator<dynamic> :sync-for-iterator = #t142{core::Iterable<dynamic>}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final dynamic #t145 = :sync-for-iterator.{core::Iterator::current};
+        final dynamic #t143 = :sync-for-iterator.{core::Iterator::current};
         {
-          final core::int #t146 = #t145 as{TypeError,ForNonNullableByDefault} core::int;
-          #t143.{core::Set::add}(#t146);
+          final core::int #t144 = #t143 as{TypeError,ForNonNullableByDefault} core::int;
+          #t141.{core::Set::add}{Invariant}(#t144);
         }
       }
     }
-  } =>#t143, block {
-    final core::Set<core::int> #t147 = new col::_CompactLinkedHashSet::•<core::int>();
-    final core::Iterable<dynamic>? #t148 = y;
-    if(!#t148.{core::Object::==}(null)) {
-      core::Iterator<dynamic> :sync-for-iterator = #t148{core::Iterable<dynamic>}.{core::Iterable::iterator};
+  } =>#t141, block {
+    final core::Set<core::int> #t145 = new col::_CompactLinkedHashSet::•<core::int>();
+    final core::Iterable<dynamic>? #t146 = y;
+    if(!#t146.{core::Object::==}(null)) {
+      core::Iterator<dynamic> :sync-for-iterator = #t146{core::Iterable<dynamic>}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final dynamic #t149 = :sync-for-iterator.{core::Iterator::current};
+        final dynamic #t147 = :sync-for-iterator.{core::Iterator::current};
         {
-          final core::int #t150 = #t149 as{TypeError,ForNonNullableByDefault} core::int;
-          #t147.{core::Set::add}(#t150);
+          final core::int #t148 = #t147 as{TypeError,ForNonNullableByDefault} core::int;
+          #t145.{core::Set::add}{Invariant}(#t148);
         }
       }
     }
-  } =>#t147, block {
-    final core::Set<core::int> #t151 = new col::_CompactLinkedHashSet::•<core::int>();
-    final core::Iterable<dynamic>? #t152 = z;
-    if(!#t152.{core::Object::==}(null)) {
-      core::Iterator<dynamic> :sync-for-iterator = #t152{core::Iterable<dynamic>}.{core::Iterable::iterator};
+  } =>#t145, block {
+    final core::Set<core::int> #t149 = new col::_CompactLinkedHashSet::•<core::int>();
+    final core::Iterable<dynamic>? #t150 = z;
+    if(!#t150.{core::Object::==}(null)) {
+      core::Iterator<dynamic> :sync-for-iterator = #t150{core::Iterable<dynamic>}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final dynamic #t153 = :sync-for-iterator.{core::Iterator::current};
+        final dynamic #t151 = :sync-for-iterator.{core::Iterator::current};
         {
-          final core::int #t154 = #t153 as{TypeError,ForNonNullableByDefault} core::int;
-          #t151.{core::Set::add}(#t154);
+          final core::int #t152 = #t151 as{TypeError,ForNonNullableByDefault} core::int;
+          #t149.{core::Set::add}{Invariant}(#t152);
         }
       }
     }
-  } =>#t151, block {
-    final core::Map<core::int, core::int> #t155 = <core::int, core::int>{};
-    final core::Map<core::int, core::int>? #t156 = w;
-    if(!#t156.{core::Object::==}(null)) {
-      core::Iterator<core::MapEntry<core::int, core::int>> :sync-for-iterator = #t156{core::Map<core::int, core::int>}.{core::Map::entries}.{core::Iterable::iterator};
+  } =>#t149, block {
+    final core::Map<core::int, core::int> #t153 = <core::int, core::int>{};
+    final core::Map<core::int, core::int>? #t154 = w;
+    if(!#t154.{core::Object::==}(null)) {
+      core::Iterator<core::MapEntry<core::int, core::int>> :sync-for-iterator = #t154{core::Map<core::int, core::int>}.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::MapEntry<core::int, core::int> #t157 = :sync-for-iterator.{core::Iterator::current};
-        #t155.{core::Map::[]=}(#t157.{core::MapEntry::key}, #t157.{core::MapEntry::value});
+        final core::MapEntry<core::int, core::int> #t155 = :sync-for-iterator.{core::Iterator::current};
+        #t153.{core::Map::[]=}{Invariant}(#t155.{core::MapEntry::key}, #t155.{core::MapEntry::value});
       }
     }
-  } =>#t155, block {
-    final core::Set<core::int> #t158 = new col::_CompactLinkedHashSet::•<core::int>();
+  } =>#t153, block {
+    final core::Set<core::int> #t156 = new col::_CompactLinkedHashSet::•<core::int>();
     if(condition) {
-      final core::Iterable<dynamic>? #t159 = x;
-      if(!#t159.{core::Object::==}(null)) {
-        core::Iterator<dynamic> :sync-for-iterator = #t159{core::Iterable<dynamic>}.{core::Iterable::iterator};
+      final core::Iterable<dynamic>? #t157 = x;
+      if(!#t157.{core::Object::==}(null)) {
+        core::Iterator<dynamic> :sync-for-iterator = #t157{core::Iterable<dynamic>}.{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final dynamic #t160 = :sync-for-iterator.{core::Iterator::current};
+          final dynamic #t158 = :sync-for-iterator.{core::Iterator::current};
           {
-            final core::int #t161 = #t160 as{TypeError,ForNonNullableByDefault} core::int;
-            #t158.{core::Set::add}(#t161);
+            final core::int #t159 = #t158 as{TypeError,ForNonNullableByDefault} core::int;
+            #t156.{core::Set::add}{Invariant}(#t159);
           }
         }
       }
     }
-  } =>#t158, block {
-    final core::Set<core::int> #t162 = new col::_CompactLinkedHashSet::•<core::int>();
+  } =>#t156, block {
+    final core::Set<core::int> #t160 = new col::_CompactLinkedHashSet::•<core::int>();
     if(condition) {
-      final core::Iterable<dynamic>? #t163 = y;
-      if(!#t163.{core::Object::==}(null)) {
-        core::Iterator<dynamic> :sync-for-iterator = #t163{core::Iterable<dynamic>}.{core::Iterable::iterator};
+      final core::Iterable<dynamic>? #t161 = y;
+      if(!#t161.{core::Object::==}(null)) {
+        core::Iterator<dynamic> :sync-for-iterator = #t161{core::Iterable<dynamic>}.{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final dynamic #t164 = :sync-for-iterator.{core::Iterator::current};
+          final dynamic #t162 = :sync-for-iterator.{core::Iterator::current};
           {
-            final core::int #t165 = #t164 as{TypeError,ForNonNullableByDefault} core::int;
-            #t162.{core::Set::add}(#t165);
+            final core::int #t163 = #t162 as{TypeError,ForNonNullableByDefault} core::int;
+            #t160.{core::Set::add}{Invariant}(#t163);
           }
         }
       }
     }
-  } =>#t162, block {
-    final core::Set<core::int> #t166 = new col::_CompactLinkedHashSet::•<core::int>();
+  } =>#t160, block {
+    final core::Set<core::int> #t164 = new col::_CompactLinkedHashSet::•<core::int>();
     if(condition) {
-      final core::Iterable<dynamic>? #t167 = z;
-      if(!#t167.{core::Object::==}(null)) {
-        core::Iterator<dynamic> :sync-for-iterator = #t167{core::Iterable<dynamic>}.{core::Iterable::iterator};
+      final core::Iterable<dynamic>? #t165 = z;
+      if(!#t165.{core::Object::==}(null)) {
+        core::Iterator<dynamic> :sync-for-iterator = #t165{core::Iterable<dynamic>}.{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final dynamic #t168 = :sync-for-iterator.{core::Iterator::current};
+          final dynamic #t166 = :sync-for-iterator.{core::Iterator::current};
           {
-            final core::int #t169 = #t168 as{TypeError,ForNonNullableByDefault} core::int;
-            #t166.{core::Set::add}(#t169);
+            final core::int #t167 = #t166 as{TypeError,ForNonNullableByDefault} core::int;
+            #t164.{core::Set::add}{Invariant}(#t167);
           }
         }
       }
     }
-  } =>#t166, block {
-    final core::Map<core::int, core::int> #t170 = <core::int, core::int>{};
+  } =>#t164, block {
+    final core::Map<core::int, core::int> #t168 = <core::int, core::int>{};
     if(condition) {
-      final core::Map<core::int, core::int>? #t171 = w;
-      if(!#t171.{core::Object::==}(null)) {
-        core::Iterator<core::MapEntry<core::int, core::int>> :sync-for-iterator = #t171{core::Map<core::int, core::int>}.{core::Map::entries}.{core::Iterable::iterator};
+      final core::Map<core::int, core::int>? #t169 = w;
+      if(!#t169.{core::Object::==}(null)) {
+        core::Iterator<core::MapEntry<core::int, core::int>> :sync-for-iterator = #t169{core::Map<core::int, core::int>}.{core::Map::entries}.{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final core::MapEntry<core::int, core::int> #t172 = :sync-for-iterator.{core::Iterator::current};
-          #t170.{core::Map::[]=}(#t172.{core::MapEntry::key}, #t172.{core::MapEntry::value});
+          final core::MapEntry<core::int, core::int> #t170 = :sync-for-iterator.{core::Iterator::current};
+          #t168.{core::Map::[]=}{Invariant}(#t170.{core::MapEntry::key}, #t170.{core::MapEntry::value});
         }
       }
     }
-  } =>#t170, block {
-    final core::Set<core::int> #t173 = new col::_CompactLinkedHashSet::•<core::int>();
+  } =>#t168, block {
+    final core::Set<core::int> #t171 = new col::_CompactLinkedHashSet::•<core::int>();
     {
       core::Iterator<dynamic> :sync-for-iterator = iterable.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         dynamic e = :sync-for-iterator.{core::Iterator::current};
         {
-          final core::Iterable<dynamic>? #t174 = x;
-          if(!#t174.{core::Object::==}(null)) {
-            core::Iterator<dynamic> :sync-for-iterator = #t174{core::Iterable<dynamic>}.{core::Iterable::iterator};
+          final core::Iterable<dynamic>? #t172 = x;
+          if(!#t172.{core::Object::==}(null)) {
+            core::Iterator<dynamic> :sync-for-iterator = #t172{core::Iterable<dynamic>}.{core::Iterable::iterator};
             for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-              final dynamic #t175 = :sync-for-iterator.{core::Iterator::current};
+              final dynamic #t173 = :sync-for-iterator.{core::Iterator::current};
               {
-                final core::int #t176 = #t175 as{TypeError,ForNonNullableByDefault} core::int;
-                #t173.{core::Set::add}(#t176);
+                final core::int #t174 = #t173 as{TypeError,ForNonNullableByDefault} core::int;
+                #t171.{core::Set::add}{Invariant}(#t174);
               }
             }
           }
         }
       }
     }
-  } =>#t173, block {
-    final core::Set<core::int> #t177 = new col::_CompactLinkedHashSet::•<core::int>();
+  } =>#t171, block {
+    final core::Set<core::int> #t175 = new col::_CompactLinkedHashSet::•<core::int>();
     {
       core::Iterator<dynamic> :sync-for-iterator = iterable.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         dynamic e = :sync-for-iterator.{core::Iterator::current};
         {
-          final core::Iterable<dynamic>? #t178 = y;
-          if(!#t178.{core::Object::==}(null)) {
-            core::Iterator<dynamic> :sync-for-iterator = #t178{core::Iterable<dynamic>}.{core::Iterable::iterator};
+          final core::Iterable<dynamic>? #t176 = y;
+          if(!#t176.{core::Object::==}(null)) {
+            core::Iterator<dynamic> :sync-for-iterator = #t176{core::Iterable<dynamic>}.{core::Iterable::iterator};
             for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-              final dynamic #t179 = :sync-for-iterator.{core::Iterator::current};
+              final dynamic #t177 = :sync-for-iterator.{core::Iterator::current};
               {
-                final core::int #t180 = #t179 as{TypeError,ForNonNullableByDefault} core::int;
-                #t177.{core::Set::add}(#t180);
+                final core::int #t178 = #t177 as{TypeError,ForNonNullableByDefault} core::int;
+                #t175.{core::Set::add}{Invariant}(#t178);
               }
             }
           }
         }
       }
     }
-  } =>#t177, block {
-    final core::Set<core::int> #t181 = new col::_CompactLinkedHashSet::•<core::int>();
+  } =>#t175, block {
+    final core::Set<core::int> #t179 = new col::_CompactLinkedHashSet::•<core::int>();
     {
       core::Iterator<dynamic> :sync-for-iterator = iterable.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         dynamic e = :sync-for-iterator.{core::Iterator::current};
         {
-          final core::Iterable<dynamic>? #t182 = z;
-          if(!#t182.{core::Object::==}(null)) {
-            core::Iterator<dynamic> :sync-for-iterator = #t182{core::Iterable<dynamic>}.{core::Iterable::iterator};
+          final core::Iterable<dynamic>? #t180 = z;
+          if(!#t180.{core::Object::==}(null)) {
+            core::Iterator<dynamic> :sync-for-iterator = #t180{core::Iterable<dynamic>}.{core::Iterable::iterator};
             for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-              final dynamic #t183 = :sync-for-iterator.{core::Iterator::current};
+              final dynamic #t181 = :sync-for-iterator.{core::Iterator::current};
               {
-                final core::int #t184 = #t183 as{TypeError,ForNonNullableByDefault} core::int;
-                #t181.{core::Set::add}(#t184);
+                final core::int #t182 = #t181 as{TypeError,ForNonNullableByDefault} core::int;
+                #t179.{core::Set::add}{Invariant}(#t182);
               }
             }
           }
         }
       }
     }
-  } =>#t181, block {
-    final core::Map<core::int, core::int> #t185 = <core::int, core::int>{};
+  } =>#t179, block {
+    final core::Map<core::int, core::int> #t183 = <core::int, core::int>{};
     {
       core::Iterator<dynamic> :sync-for-iterator = iterable.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         dynamic e = :sync-for-iterator.{core::Iterator::current};
         {
-          final core::Map<core::int, core::int>? #t186 = w;
-          if(!#t186.{core::Object::==}(null)) {
-            core::Iterator<core::MapEntry<core::int, core::int>> :sync-for-iterator = #t186{core::Map<core::int, core::int>}.{core::Map::entries}.{core::Iterable::iterator};
+          final core::Map<core::int, core::int>? #t184 = w;
+          if(!#t184.{core::Object::==}(null)) {
+            core::Iterator<core::MapEntry<core::int, core::int>> :sync-for-iterator = #t184{core::Map<core::int, core::int>}.{core::Map::entries}.{core::Iterable::iterator};
             for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-              final core::MapEntry<core::int, core::int> #t187 = :sync-for-iterator.{core::Iterator::current};
-              #t185.{core::Map::[]=}(#t187.{core::MapEntry::key}, #t187.{core::MapEntry::value});
+              final core::MapEntry<core::int, core::int> #t185 = :sync-for-iterator.{core::Iterator::current};
+              #t183.{core::Map::[]=}{Invariant}(#t185.{core::MapEntry::key}, #t185.{core::MapEntry::value});
             }
           }
         }
       }
     }
-  } =>#t185, block {
-    final core::Set<core::int> #t188 = new col::_CompactLinkedHashSet::•<core::int>();
+  } =>#t183, block {
+    final core::Set<core::int> #t186 = new col::_CompactLinkedHashSet::•<core::int>();
     for (core::int i = 0; i.{core::num::<}(42); i = i.{core::num::+}(1)) {
-      final core::Iterable<dynamic>? #t189 = x;
-      if(!#t189.{core::Object::==}(null)) {
-        core::Iterator<dynamic> :sync-for-iterator = #t189{core::Iterable<dynamic>}.{core::Iterable::iterator};
+      final core::Iterable<dynamic>? #t187 = x;
+      if(!#t187.{core::Object::==}(null)) {
+        core::Iterator<dynamic> :sync-for-iterator = #t187{core::Iterable<dynamic>}.{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final dynamic #t190 = :sync-for-iterator.{core::Iterator::current};
+          final dynamic #t188 = :sync-for-iterator.{core::Iterator::current};
           {
-            final core::int #t191 = #t190 as{TypeError,ForNonNullableByDefault} core::int;
-            #t188.{core::Set::add}(#t191);
+            final core::int #t189 = #t188 as{TypeError,ForNonNullableByDefault} core::int;
+            #t186.{core::Set::add}{Invariant}(#t189);
           }
         }
       }
     }
-  } =>#t188, block {
-    final core::Set<core::int> #t192 = new col::_CompactLinkedHashSet::•<core::int>();
+  } =>#t186, block {
+    final core::Set<core::int> #t190 = new col::_CompactLinkedHashSet::•<core::int>();
     for (core::int i = 0; i.{core::num::<}(42); i = i.{core::num::+}(1)) {
-      final core::Iterable<dynamic>? #t193 = y;
-      if(!#t193.{core::Object::==}(null)) {
-        core::Iterator<dynamic> :sync-for-iterator = #t193{core::Iterable<dynamic>}.{core::Iterable::iterator};
+      final core::Iterable<dynamic>? #t191 = y;
+      if(!#t191.{core::Object::==}(null)) {
+        core::Iterator<dynamic> :sync-for-iterator = #t191{core::Iterable<dynamic>}.{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final dynamic #t194 = :sync-for-iterator.{core::Iterator::current};
+          final dynamic #t192 = :sync-for-iterator.{core::Iterator::current};
           {
-            final core::int #t195 = #t194 as{TypeError,ForNonNullableByDefault} core::int;
-            #t192.{core::Set::add}(#t195);
+            final core::int #t193 = #t192 as{TypeError,ForNonNullableByDefault} core::int;
+            #t190.{core::Set::add}{Invariant}(#t193);
           }
         }
       }
     }
-  } =>#t192, block {
-    final core::Set<core::int> #t196 = new col::_CompactLinkedHashSet::•<core::int>();
+  } =>#t190, block {
+    final core::Set<core::int> #t194 = new col::_CompactLinkedHashSet::•<core::int>();
     for (core::int i = 0; i.{core::num::<}(42); i = i.{core::num::+}(1)) {
-      final core::Iterable<dynamic>? #t197 = z;
-      if(!#t197.{core::Object::==}(null)) {
-        core::Iterator<dynamic> :sync-for-iterator = #t197{core::Iterable<dynamic>}.{core::Iterable::iterator};
+      final core::Iterable<dynamic>? #t195 = z;
+      if(!#t195.{core::Object::==}(null)) {
+        core::Iterator<dynamic> :sync-for-iterator = #t195{core::Iterable<dynamic>}.{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final dynamic #t198 = :sync-for-iterator.{core::Iterator::current};
+          final dynamic #t196 = :sync-for-iterator.{core::Iterator::current};
           {
-            final core::int #t199 = #t198 as{TypeError,ForNonNullableByDefault} core::int;
-            #t196.{core::Set::add}(#t199);
+            final core::int #t197 = #t196 as{TypeError,ForNonNullableByDefault} core::int;
+            #t194.{core::Set::add}{Invariant}(#t197);
           }
         }
       }
     }
-  } =>#t196, block {
-    final core::Map<core::int, core::int> #t200 = <core::int, core::int>{};
+  } =>#t194, block {
+    final core::Map<core::int, core::int> #t198 = <core::int, core::int>{};
     for (core::int i = 0; i.{core::num::<}(42); i = i.{core::num::+}(1)) {
-      final core::Map<core::int, core::int>? #t201 = w;
-      if(!#t201.{core::Object::==}(null)) {
-        core::Iterator<core::MapEntry<core::int, core::int>> :sync-for-iterator = #t201{core::Map<core::int, core::int>}.{core::Map::entries}.{core::Iterable::iterator};
+      final core::Map<core::int, core::int>? #t199 = w;
+      if(!#t199.{core::Object::==}(null)) {
+        core::Iterator<core::MapEntry<core::int, core::int>> :sync-for-iterator = #t199{core::Map<core::int, core::int>}.{core::Map::entries}.{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final core::MapEntry<core::int, core::int> #t202 = :sync-for-iterator.{core::Iterator::current};
-          #t200.{core::Map::[]=}(#t202.{core::MapEntry::key}, #t202.{core::MapEntry::value});
+          final core::MapEntry<core::int, core::int> #t200 = :sync-for-iterator.{core::Iterator::current};
+          #t198.{core::Map::[]=}{Invariant}(#t200.{core::MapEntry::key}, #t200.{core::MapEntry::value});
         }
       }
     }
-  } =>#t200];
+  } =>#t198];
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue43495.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue43495.dart.weak.expect
index e89957c..0934075 100644
--- a/pkg/front_end/testcases/nnbd/issue43495.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue43495.dart.weak.expect
@@ -175,7 +175,7 @@
     {...a}, // Error.
         ^") {
       final core::int #t3 = #t2 as{TypeError,ForNonNullableByDefault} core::int;
-      #t1.{core::Set::add}(#t3);
+      #t1.{core::Set::add}{Invariant}(#t3);
     }
   } =>#t1, block {
     final core::Set<core::int> #t4 = col::LinkedHashSet::•<core::int>();
@@ -183,7 +183,7 @@
     {...b}, // Error.
         ^") {
       final core::int #t6 = #t5 as{TypeError,ForNonNullableByDefault} core::int;
-      #t4.{core::Set::add}(#t6);
+      #t4.{core::Set::add}{Invariant}(#t6);
     }
   } =>#t4, block {
     final core::Set<core::int> #t7 = col::LinkedHashSet::•<core::int>();
@@ -191,535 +191,541 @@
     {...c}, // Error.
         ^") {
       final core::int #t9 = #t8 as{TypeError,ForNonNullableByDefault} core::int;
-      #t7.{core::Set::add}(#t9);
+      #t7.{core::Set::add}{Invariant}(#t9);
     }
   } =>#t7, <core::int, core::int>{invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:11:9: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {...d}, // Error.
         ^": null}, <core::int, core::int>{invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:12:19: Error: Unexpected type 'List<int>?' of a map spread entry.  Expected 'dynamic' or a Map.
  - 'List' is from 'dart:core'.
     <int, int>{...a}, // Error.
-                  ^": null}, let final core::Set<core::int> #t10 = col::LinkedHashSet::•<core::int>() in let final dynamic #t11 = #t10.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:13:14: Error: Unexpected type 'Map<int, int>?' of a spread.  Expected 'dynamic' or an Iterable.
+                  ^": null}, block {
+    final core::Set<core::int> #t10 = col::LinkedHashSet::•<core::int>();
+    #t10.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:13:14: Error: Unexpected type 'Map<int, int>?' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
     <int>{...d}, // Error.
-             ^") in #t10, block {
-    final core::Set<core::int> #t12 = col::LinkedHashSet::•<core::int>();
+             ^");
+  } =>#t10, block {
+    final core::Set<core::int> #t11 = col::LinkedHashSet::•<core::int>();
     if(condition)
-      for (final dynamic #t13 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:14:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      for (final dynamic #t12 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:14:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {if (condition) ...a}, // Error.
                        ^") {
-        final core::int #t14 = #t13 as{TypeError,ForNonNullableByDefault} core::int;
-        #t12.{core::Set::add}(#t14);
+        final core::int #t13 = #t12 as{TypeError,ForNonNullableByDefault} core::int;
+        #t11.{core::Set::add}{Invariant}(#t13);
       }
-  } =>#t12, block {
-    final core::Set<core::int> #t15 = col::LinkedHashSet::•<core::int>();
+  } =>#t11, block {
+    final core::Set<core::int> #t14 = col::LinkedHashSet::•<core::int>();
     if(condition)
-      for (final dynamic #t16 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:15:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      for (final dynamic #t15 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:15:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {if (condition) ...b}, // Error.
                        ^") {
-        final core::int #t17 = #t16 as{TypeError,ForNonNullableByDefault} core::int;
-        #t15.{core::Set::add}(#t17);
+        final core::int #t16 = #t15 as{TypeError,ForNonNullableByDefault} core::int;
+        #t14.{core::Set::add}{Invariant}(#t16);
       }
-  } =>#t15, block {
-    final core::Set<core::int> #t18 = col::LinkedHashSet::•<core::int>();
+  } =>#t14, block {
+    final core::Set<core::int> #t17 = col::LinkedHashSet::•<core::int>();
     if(condition)
-      for (final dynamic #t19 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:16:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      for (final dynamic #t18 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:16:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {if (condition) ...c}, // Error.
                        ^") {
-        final core::int #t20 = #t19 as{TypeError,ForNonNullableByDefault} core::int;
-        #t18.{core::Set::add}(#t20);
+        final core::int #t19 = #t18 as{TypeError,ForNonNullableByDefault} core::int;
+        #t17.{core::Set::add}{Invariant}(#t19);
       }
-  } =>#t18, block {
-    final core::Map<core::int, core::int> #t21 = <core::int, core::int>{};
+  } =>#t17, block {
+    final core::Map<core::int, core::int> #t20 = <core::int, core::int>{};
     if(condition)
-      #t21.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:17:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      #t20.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:17:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {if (condition) ...d}, // Error.
                        ^", null);
-  } =>#t21, block {
-    final core::Set<core::int> #t22 = col::LinkedHashSet::•<core::int>();
+  } =>#t20, block {
+    final core::Set<core::int> #t21 = col::LinkedHashSet::•<core::int>();
     for (dynamic e in iterable)
-      for (final dynamic #t23 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:18:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      for (final dynamic #t22 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:18:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {for (dynamic e in iterable) ...a}, // Error.
                                     ^") {
-        final core::int #t24 = #t23 as{TypeError,ForNonNullableByDefault} core::int;
-        #t22.{core::Set::add}(#t24);
+        final core::int #t23 = #t22 as{TypeError,ForNonNullableByDefault} core::int;
+        #t21.{core::Set::add}{Invariant}(#t23);
       }
-  } =>#t22, block {
-    final core::Set<core::int> #t25 = col::LinkedHashSet::•<core::int>();
+  } =>#t21, block {
+    final core::Set<core::int> #t24 = col::LinkedHashSet::•<core::int>();
     for (dynamic e in iterable)
-      for (final dynamic #t26 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:19:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      for (final dynamic #t25 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:19:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {for (dynamic e in iterable) ...b}, // Error.
                                     ^") {
-        final core::int #t27 = #t26 as{TypeError,ForNonNullableByDefault} core::int;
-        #t25.{core::Set::add}(#t27);
+        final core::int #t26 = #t25 as{TypeError,ForNonNullableByDefault} core::int;
+        #t24.{core::Set::add}{Invariant}(#t26);
       }
-  } =>#t25, block {
-    final core::Set<core::int> #t28 = col::LinkedHashSet::•<core::int>();
+  } =>#t24, block {
+    final core::Set<core::int> #t27 = col::LinkedHashSet::•<core::int>();
     for (dynamic e in iterable)
-      for (final dynamic #t29 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:20:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      for (final dynamic #t28 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:20:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {for (dynamic e in iterable) ...c}, // Error.
                                     ^") {
-        final core::int #t30 = #t29 as{TypeError,ForNonNullableByDefault} core::int;
-        #t28.{core::Set::add}(#t30);
+        final core::int #t29 = #t28 as{TypeError,ForNonNullableByDefault} core::int;
+        #t27.{core::Set::add}{Invariant}(#t29);
       }
-  } =>#t28, block {
-    final core::Map<core::int, core::int> #t31 = <core::int, core::int>{};
+  } =>#t27, block {
+    final core::Map<core::int, core::int> #t30 = <core::int, core::int>{};
     for (dynamic e in iterable)
-      #t31.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:21:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      #t30.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:21:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {for (dynamic e in iterable) ...d}, // Error.
                                     ^", null);
-  } =>#t31, block {
-    final core::Set<core::int> #t32 = col::LinkedHashSet::•<core::int>();
+  } =>#t30, block {
+    final core::Set<core::int> #t31 = col::LinkedHashSet::•<core::int>();
     for (core::int i = 0; i.{core::num::<}(42); i = i.{core::num::+}(1))
-      for (final dynamic #t33 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:22:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      for (final dynamic #t32 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:22:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {for (int i = 0; i < 42; ++i) ...a}, // Error.
                                      ^") {
-        final core::int #t34 = #t33 as{TypeError,ForNonNullableByDefault} core::int;
-        #t32.{core::Set::add}(#t34);
+        final core::int #t33 = #t32 as{TypeError,ForNonNullableByDefault} core::int;
+        #t31.{core::Set::add}{Invariant}(#t33);
       }
-  } =>#t32, block {
-    final core::Set<core::int> #t35 = col::LinkedHashSet::•<core::int>();
+  } =>#t31, block {
+    final core::Set<core::int> #t34 = col::LinkedHashSet::•<core::int>();
     for (core::int i = 0; i.{core::num::<}(42); i = i.{core::num::+}(1))
-      for (final dynamic #t36 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:23:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      for (final dynamic #t35 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:23:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {for (int i = 0; i < 42; ++i) ...b}, // Error.
                                      ^") {
-        final core::int #t37 = #t36 as{TypeError,ForNonNullableByDefault} core::int;
-        #t35.{core::Set::add}(#t37);
+        final core::int #t36 = #t35 as{TypeError,ForNonNullableByDefault} core::int;
+        #t34.{core::Set::add}{Invariant}(#t36);
       }
-  } =>#t35, block {
-    final core::Set<core::int> #t38 = col::LinkedHashSet::•<core::int>();
+  } =>#t34, block {
+    final core::Set<core::int> #t37 = col::LinkedHashSet::•<core::int>();
     for (core::int i = 0; i.{core::num::<}(42); i = i.{core::num::+}(1))
-      for (final dynamic #t39 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:24:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      for (final dynamic #t38 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:24:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {for (int i = 0; i < 42; ++i) ...c}, // Error.
                                      ^") {
-        final core::int #t40 = #t39 as{TypeError,ForNonNullableByDefault} core::int;
-        #t38.{core::Set::add}(#t40);
+        final core::int #t39 = #t38 as{TypeError,ForNonNullableByDefault} core::int;
+        #t37.{core::Set::add}{Invariant}(#t39);
       }
-  } =>#t38, block {
-    final core::Map<core::int, core::int> #t41 = <core::int, core::int>{};
+  } =>#t37, block {
+    final core::Map<core::int, core::int> #t40 = <core::int, core::int>{};
     for (core::int i = 0; i.{core::num::<}(42); i = i.{core::num::+}(1))
-      #t41.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:25:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      #t40.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:25:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {for (int i = 0; i < 42; ++i) ...d}, // Error.
                                      ^", null);
+  } =>#t40, block {
+    final core::Set<core::int> #t41 = col::LinkedHashSet::•<core::int>();
+    final core::Iterable<dynamic>? #t42 = a;
+    if(!#t42.{core::Object::==}(null))
+      for (final dynamic #t43 in #t42{core::Iterable<dynamic>}) {
+        final core::int #t44 = #t43 as{TypeError,ForNonNullableByDefault} core::int;
+        #t41.{core::Set::add}{Invariant}(#t44);
+      }
   } =>#t41, block {
-    final core::Set<core::int> #t42 = col::LinkedHashSet::•<core::int>();
-    final core::Iterable<dynamic>? #t43 = a;
-    if(!#t43.{core::Object::==}(null))
-      for (final dynamic #t44 in #t43{core::Iterable<dynamic>}) {
-        final core::int #t45 = #t44 as{TypeError,ForNonNullableByDefault} core::int;
-        #t42.{core::Set::add}(#t45);
+    final core::Set<core::int> #t45 = col::LinkedHashSet::•<core::int>();
+    final core::Iterable<dynamic>? #t46 = b;
+    if(!#t46.{core::Object::==}(null))
+      for (final dynamic #t47 in #t46{core::Iterable<dynamic>}) {
+        final core::int #t48 = #t47 as{TypeError,ForNonNullableByDefault} core::int;
+        #t45.{core::Set::add}{Invariant}(#t48);
       }
-  } =>#t42, block {
-    final core::Set<core::int> #t46 = col::LinkedHashSet::•<core::int>();
-    final core::Iterable<dynamic>? #t47 = b;
-    if(!#t47.{core::Object::==}(null))
-      for (final dynamic #t48 in #t47{core::Iterable<dynamic>}) {
-        final core::int #t49 = #t48 as{TypeError,ForNonNullableByDefault} core::int;
-        #t46.{core::Set::add}(#t49);
+  } =>#t45, block {
+    final core::Set<core::int> #t49 = col::LinkedHashSet::•<core::int>();
+    final core::Iterable<dynamic>? #t50 = c;
+    if(!#t50.{core::Object::==}(null))
+      for (final dynamic #t51 in #t50{core::Iterable<dynamic>}) {
+        final core::int #t52 = #t51 as{TypeError,ForNonNullableByDefault} core::int;
+        #t49.{core::Set::add}{Invariant}(#t52);
       }
-  } =>#t46, block {
-    final core::Set<core::int> #t50 = col::LinkedHashSet::•<core::int>();
-    final core::Iterable<dynamic>? #t51 = c;
-    if(!#t51.{core::Object::==}(null))
-      for (final dynamic #t52 in #t51{core::Iterable<dynamic>}) {
-        final core::int #t53 = #t52 as{TypeError,ForNonNullableByDefault} core::int;
-        #t50.{core::Set::add}(#t53);
-      }
-  } =>#t50, block {
-    final core::Map<core::int, core::int> #t54 = <core::int, core::int>{};
-    final core::Map<core::int, core::int>? #t55 = d;
-    if(!#t55.{core::Object::==}(null))
-      for (final core::MapEntry<core::int, core::int> #t56 in #t55{core::Map<core::int, core::int>}.{core::Map::entries})
-        #t54.{core::Map::[]=}(#t56.{core::MapEntry::key}, #t56.{core::MapEntry::value});
-  } =>#t54, block {
-    final core::Set<core::int> #t57 = col::LinkedHashSet::•<core::int>();
+  } =>#t49, block {
+    final core::Map<core::int, core::int> #t53 = <core::int, core::int>{};
+    final core::Map<core::int, core::int>? #t54 = d;
+    if(!#t54.{core::Object::==}(null))
+      for (final core::MapEntry<core::int, core::int> #t55 in #t54{core::Map<core::int, core::int>}.{core::Map::entries})
+        #t53.{core::Map::[]=}{Invariant}(#t55.{core::MapEntry::key}, #t55.{core::MapEntry::value});
+  } =>#t53, block {
+    final core::Set<core::int> #t56 = col::LinkedHashSet::•<core::int>();
     if(condition) {
-      final core::Iterable<dynamic>? #t58 = a;
-      if(!#t58.{core::Object::==}(null))
-        for (final dynamic #t59 in #t58{core::Iterable<dynamic>}) {
-          final core::int #t60 = #t59 as{TypeError,ForNonNullableByDefault} core::int;
-          #t57.{core::Set::add}(#t60);
+      final core::Iterable<dynamic>? #t57 = a;
+      if(!#t57.{core::Object::==}(null))
+        for (final dynamic #t58 in #t57{core::Iterable<dynamic>}) {
+          final core::int #t59 = #t58 as{TypeError,ForNonNullableByDefault} core::int;
+          #t56.{core::Set::add}{Invariant}(#t59);
         }
     }
-  } =>#t57, block {
-    final core::Set<core::int> #t61 = col::LinkedHashSet::•<core::int>();
+  } =>#t56, block {
+    final core::Set<core::int> #t60 = col::LinkedHashSet::•<core::int>();
     if(condition) {
-      final core::Iterable<dynamic>? #t62 = b;
-      if(!#t62.{core::Object::==}(null))
-        for (final dynamic #t63 in #t62{core::Iterable<dynamic>}) {
-          final core::int #t64 = #t63 as{TypeError,ForNonNullableByDefault} core::int;
-          #t61.{core::Set::add}(#t64);
+      final core::Iterable<dynamic>? #t61 = b;
+      if(!#t61.{core::Object::==}(null))
+        for (final dynamic #t62 in #t61{core::Iterable<dynamic>}) {
+          final core::int #t63 = #t62 as{TypeError,ForNonNullableByDefault} core::int;
+          #t60.{core::Set::add}{Invariant}(#t63);
         }
     }
-  } =>#t61, block {
-    final core::Set<core::int> #t65 = col::LinkedHashSet::•<core::int>();
+  } =>#t60, block {
+    final core::Set<core::int> #t64 = col::LinkedHashSet::•<core::int>();
     if(condition) {
-      final core::Iterable<dynamic>? #t66 = c;
-      if(!#t66.{core::Object::==}(null))
-        for (final dynamic #t67 in #t66{core::Iterable<dynamic>}) {
-          final core::int #t68 = #t67 as{TypeError,ForNonNullableByDefault} core::int;
-          #t65.{core::Set::add}(#t68);
+      final core::Iterable<dynamic>? #t65 = c;
+      if(!#t65.{core::Object::==}(null))
+        for (final dynamic #t66 in #t65{core::Iterable<dynamic>}) {
+          final core::int #t67 = #t66 as{TypeError,ForNonNullableByDefault} core::int;
+          #t64.{core::Set::add}{Invariant}(#t67);
         }
     }
-  } =>#t65, block {
-    final core::Map<core::int, core::int> #t69 = <core::int, core::int>{};
+  } =>#t64, block {
+    final core::Map<core::int, core::int> #t68 = <core::int, core::int>{};
     if(condition) {
-      final core::Map<core::int, core::int>? #t70 = d;
-      if(!#t70.{core::Object::==}(null))
-        for (final core::MapEntry<core::int, core::int> #t71 in #t70{core::Map<core::int, core::int>}.{core::Map::entries})
-          #t69.{core::Map::[]=}(#t71.{core::MapEntry::key}, #t71.{core::MapEntry::value});
+      final core::Map<core::int, core::int>? #t69 = d;
+      if(!#t69.{core::Object::==}(null))
+        for (final core::MapEntry<core::int, core::int> #t70 in #t69{core::Map<core::int, core::int>}.{core::Map::entries})
+          #t68.{core::Map::[]=}{Invariant}(#t70.{core::MapEntry::key}, #t70.{core::MapEntry::value});
     }
-  } =>#t69, block {
-    final core::Set<core::int> #t72 = col::LinkedHashSet::•<core::int>();
+  } =>#t68, block {
+    final core::Set<core::int> #t71 = col::LinkedHashSet::•<core::int>();
     for (dynamic e in iterable) {
-      final core::Iterable<dynamic>? #t73 = a;
-      if(!#t73.{core::Object::==}(null))
-        for (final dynamic #t74 in #t73{core::Iterable<dynamic>}) {
-          final core::int #t75 = #t74 as{TypeError,ForNonNullableByDefault} core::int;
-          #t72.{core::Set::add}(#t75);
+      final core::Iterable<dynamic>? #t72 = a;
+      if(!#t72.{core::Object::==}(null))
+        for (final dynamic #t73 in #t72{core::Iterable<dynamic>}) {
+          final core::int #t74 = #t73 as{TypeError,ForNonNullableByDefault} core::int;
+          #t71.{core::Set::add}{Invariant}(#t74);
         }
     }
-  } =>#t72, block {
-    final core::Set<core::int> #t76 = col::LinkedHashSet::•<core::int>();
+  } =>#t71, block {
+    final core::Set<core::int> #t75 = col::LinkedHashSet::•<core::int>();
     for (dynamic e in iterable) {
-      final core::Iterable<dynamic>? #t77 = b;
-      if(!#t77.{core::Object::==}(null))
-        for (final dynamic #t78 in #t77{core::Iterable<dynamic>}) {
-          final core::int #t79 = #t78 as{TypeError,ForNonNullableByDefault} core::int;
-          #t76.{core::Set::add}(#t79);
+      final core::Iterable<dynamic>? #t76 = b;
+      if(!#t76.{core::Object::==}(null))
+        for (final dynamic #t77 in #t76{core::Iterable<dynamic>}) {
+          final core::int #t78 = #t77 as{TypeError,ForNonNullableByDefault} core::int;
+          #t75.{core::Set::add}{Invariant}(#t78);
         }
     }
-  } =>#t76, block {
-    final core::Set<core::int> #t80 = col::LinkedHashSet::•<core::int>();
+  } =>#t75, block {
+    final core::Set<core::int> #t79 = col::LinkedHashSet::•<core::int>();
     for (dynamic e in iterable) {
-      final core::Iterable<dynamic>? #t81 = c;
-      if(!#t81.{core::Object::==}(null))
-        for (final dynamic #t82 in #t81{core::Iterable<dynamic>}) {
-          final core::int #t83 = #t82 as{TypeError,ForNonNullableByDefault} core::int;
-          #t80.{core::Set::add}(#t83);
+      final core::Iterable<dynamic>? #t80 = c;
+      if(!#t80.{core::Object::==}(null))
+        for (final dynamic #t81 in #t80{core::Iterable<dynamic>}) {
+          final core::int #t82 = #t81 as{TypeError,ForNonNullableByDefault} core::int;
+          #t79.{core::Set::add}{Invariant}(#t82);
         }
     }
-  } =>#t80, block {
-    final core::Map<core::int, core::int> #t84 = <core::int, core::int>{};
+  } =>#t79, block {
+    final core::Map<core::int, core::int> #t83 = <core::int, core::int>{};
     for (dynamic e in iterable) {
-      final core::Map<core::int, core::int>? #t85 = d;
-      if(!#t85.{core::Object::==}(null))
-        for (final core::MapEntry<core::int, core::int> #t86 in #t85{core::Map<core::int, core::int>}.{core::Map::entries})
-          #t84.{core::Map::[]=}(#t86.{core::MapEntry::key}, #t86.{core::MapEntry::value});
+      final core::Map<core::int, core::int>? #t84 = d;
+      if(!#t84.{core::Object::==}(null))
+        for (final core::MapEntry<core::int, core::int> #t85 in #t84{core::Map<core::int, core::int>}.{core::Map::entries})
+          #t83.{core::Map::[]=}{Invariant}(#t85.{core::MapEntry::key}, #t85.{core::MapEntry::value});
     }
-  } =>#t84, block {
-    final core::Set<core::int> #t87 = col::LinkedHashSet::•<core::int>();
+  } =>#t83, block {
+    final core::Set<core::int> #t86 = col::LinkedHashSet::•<core::int>();
     for (core::int i = 0; i.{core::num::<}(42); i = i.{core::num::+}(1)) {
-      final core::Iterable<dynamic>? #t88 = a;
-      if(!#t88.{core::Object::==}(null))
-        for (final dynamic #t89 in #t88{core::Iterable<dynamic>}) {
-          final core::int #t90 = #t89 as{TypeError,ForNonNullableByDefault} core::int;
-          #t87.{core::Set::add}(#t90);
+      final core::Iterable<dynamic>? #t87 = a;
+      if(!#t87.{core::Object::==}(null))
+        for (final dynamic #t88 in #t87{core::Iterable<dynamic>}) {
+          final core::int #t89 = #t88 as{TypeError,ForNonNullableByDefault} core::int;
+          #t86.{core::Set::add}{Invariant}(#t89);
         }
     }
-  } =>#t87, block {
-    final core::Set<core::int> #t91 = col::LinkedHashSet::•<core::int>();
+  } =>#t86, block {
+    final core::Set<core::int> #t90 = col::LinkedHashSet::•<core::int>();
     for (core::int i = 0; i.{core::num::<}(42); i = i.{core::num::+}(1)) {
-      final core::Iterable<dynamic>? #t92 = b;
-      if(!#t92.{core::Object::==}(null))
-        for (final dynamic #t93 in #t92{core::Iterable<dynamic>}) {
-          final core::int #t94 = #t93 as{TypeError,ForNonNullableByDefault} core::int;
-          #t91.{core::Set::add}(#t94);
+      final core::Iterable<dynamic>? #t91 = b;
+      if(!#t91.{core::Object::==}(null))
+        for (final dynamic #t92 in #t91{core::Iterable<dynamic>}) {
+          final core::int #t93 = #t92 as{TypeError,ForNonNullableByDefault} core::int;
+          #t90.{core::Set::add}{Invariant}(#t93);
         }
     }
-  } =>#t91, block {
-    final core::Set<core::int> #t95 = col::LinkedHashSet::•<core::int>();
+  } =>#t90, block {
+    final core::Set<core::int> #t94 = col::LinkedHashSet::•<core::int>();
     for (core::int i = 0; i.{core::num::<}(42); i = i.{core::num::+}(1)) {
-      final core::Iterable<dynamic>? #t96 = c;
-      if(!#t96.{core::Object::==}(null))
-        for (final dynamic #t97 in #t96{core::Iterable<dynamic>}) {
-          final core::int #t98 = #t97 as{TypeError,ForNonNullableByDefault} core::int;
-          #t95.{core::Set::add}(#t98);
+      final core::Iterable<dynamic>? #t95 = c;
+      if(!#t95.{core::Object::==}(null))
+        for (final dynamic #t96 in #t95{core::Iterable<dynamic>}) {
+          final core::int #t97 = #t96 as{TypeError,ForNonNullableByDefault} core::int;
+          #t94.{core::Set::add}{Invariant}(#t97);
         }
     }
-  } =>#t95, block {
-    final core::Map<core::int, core::int> #t99 = <core::int, core::int>{};
+  } =>#t94, block {
+    final core::Map<core::int, core::int> #t98 = <core::int, core::int>{};
     for (core::int i = 0; i.{core::num::<}(42); i = i.{core::num::+}(1)) {
-      final core::Map<core::int, core::int>? #t100 = d;
-      if(!#t100.{core::Object::==}(null))
-        for (final core::MapEntry<core::int, core::int> #t101 in #t100{core::Map<core::int, core::int>}.{core::Map::entries})
-          #t99.{core::Map::[]=}(#t101.{core::MapEntry::key}, #t101.{core::MapEntry::value});
+      final core::Map<core::int, core::int>? #t99 = d;
+      if(!#t99.{core::Object::==}(null))
+        for (final core::MapEntry<core::int, core::int> #t100 in #t99{core::Map<core::int, core::int>}.{core::Map::entries})
+          #t98.{core::Map::[]=}{Invariant}(#t100.{core::MapEntry::key}, #t100.{core::MapEntry::value});
     }
-  } =>#t99];
+  } =>#t98];
 }
 static method bar<X extends core::List<core::int>? = core::List<core::int>?, Y extends core::Set<core::int>? = core::Set<core::int>?, Z extends core::Iterable<core::int>? = core::Iterable<core::int>?, W extends core::Map<core::int, core::int>? = core::Map<core::int, core::int>?>(core::bool condition, core::Iterable<dynamic> iterable, self::bar::X% x, self::bar::Y% y, self::bar::Z% z, self::bar::W% w) → dynamic {
   return <core::Object>[ block {
-    final core::Set<core::int> #t102 = col::LinkedHashSet::•<core::int>();
-    for (final dynamic #t103 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:50:9: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+    final core::Set<core::int> #t101 = col::LinkedHashSet::•<core::int>();
+    for (final dynamic #t102 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:50:9: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {...x}, // Error.
         ^") {
-      final core::int #t104 = #t103 as{TypeError,ForNonNullableByDefault} core::int;
-      #t102.{core::Set::add}(#t104);
+      final core::int #t103 = #t102 as{TypeError,ForNonNullableByDefault} core::int;
+      #t101.{core::Set::add}{Invariant}(#t103);
     }
-  } =>#t102, block {
-    final core::Set<core::int> #t105 = col::LinkedHashSet::•<core::int>();
-    for (final dynamic #t106 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:51:9: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+  } =>#t101, block {
+    final core::Set<core::int> #t104 = col::LinkedHashSet::•<core::int>();
+    for (final dynamic #t105 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:51:9: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {...y}, // Error.
         ^") {
-      final core::int #t107 = #t106 as{TypeError,ForNonNullableByDefault} core::int;
-      #t105.{core::Set::add}(#t107);
+      final core::int #t106 = #t105 as{TypeError,ForNonNullableByDefault} core::int;
+      #t104.{core::Set::add}{Invariant}(#t106);
     }
-  } =>#t105, block {
-    final core::Set<core::int> #t108 = col::LinkedHashSet::•<core::int>();
-    for (final dynamic #t109 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:52:9: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+  } =>#t104, block {
+    final core::Set<core::int> #t107 = col::LinkedHashSet::•<core::int>();
+    for (final dynamic #t108 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:52:9: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {...z}, // Error.
         ^") {
-      final core::int #t110 = #t109 as{TypeError,ForNonNullableByDefault} core::int;
-      #t108.{core::Set::add}(#t110);
+      final core::int #t109 = #t108 as{TypeError,ForNonNullableByDefault} core::int;
+      #t107.{core::Set::add}{Invariant}(#t109);
     }
-  } =>#t108, <core::int, core::int>{invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:53:9: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+  } =>#t107, <core::int, core::int>{invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:53:9: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {...w}, // Error.
         ^": null}, <core::int, core::int>{invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:54:19: Error: Unexpected type 'X' of a map spread entry.  Expected 'dynamic' or a Map.
     <int, int>{...x}, // Error.
-                  ^": null}, let final core::Set<core::int> #t111 = col::LinkedHashSet::•<core::int>() in let final dynamic #t112 = #t111.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:55:14: Error: Unexpected type 'W' of a spread.  Expected 'dynamic' or an Iterable.
+                  ^": null}, block {
+    final core::Set<core::int> #t110 = col::LinkedHashSet::•<core::int>();
+    #t110.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:55:14: Error: Unexpected type 'W' of a spread.  Expected 'dynamic' or an Iterable.
     <int>{...w}, // Error.
-             ^") in #t111, block {
-    final core::Set<core::int> #t113 = col::LinkedHashSet::•<core::int>();
+             ^");
+  } =>#t110, block {
+    final core::Set<core::int> #t111 = col::LinkedHashSet::•<core::int>();
     if(condition)
-      for (final dynamic #t114 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:56:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      for (final dynamic #t112 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:56:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {if (condition) ...x}, // Error.
                        ^") {
-        final core::int #t115 = #t114 as{TypeError,ForNonNullableByDefault} core::int;
-        #t113.{core::Set::add}(#t115);
+        final core::int #t113 = #t112 as{TypeError,ForNonNullableByDefault} core::int;
+        #t111.{core::Set::add}{Invariant}(#t113);
       }
-  } =>#t113, block {
-    final core::Set<core::int> #t116 = col::LinkedHashSet::•<core::int>();
+  } =>#t111, block {
+    final core::Set<core::int> #t114 = col::LinkedHashSet::•<core::int>();
     if(condition)
-      for (final dynamic #t117 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:57:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      for (final dynamic #t115 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:57:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {if (condition) ...y}, // Error.
                        ^") {
-        final core::int #t118 = #t117 as{TypeError,ForNonNullableByDefault} core::int;
-        #t116.{core::Set::add}(#t118);
+        final core::int #t116 = #t115 as{TypeError,ForNonNullableByDefault} core::int;
+        #t114.{core::Set::add}{Invariant}(#t116);
       }
-  } =>#t116, block {
-    final core::Set<core::int> #t119 = col::LinkedHashSet::•<core::int>();
+  } =>#t114, block {
+    final core::Set<core::int> #t117 = col::LinkedHashSet::•<core::int>();
     if(condition)
-      for (final dynamic #t120 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:58:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      for (final dynamic #t118 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:58:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {if (condition) ...z}, // Error.
                        ^") {
-        final core::int #t121 = #t120 as{TypeError,ForNonNullableByDefault} core::int;
-        #t119.{core::Set::add}(#t121);
+        final core::int #t119 = #t118 as{TypeError,ForNonNullableByDefault} core::int;
+        #t117.{core::Set::add}{Invariant}(#t119);
       }
-  } =>#t119, block {
-    final core::Map<core::int, core::int> #t122 = <core::int, core::int>{};
+  } =>#t117, block {
+    final core::Map<core::int, core::int> #t120 = <core::int, core::int>{};
     if(condition)
-      #t122.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:59:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      #t120.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:59:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {if (condition) ...w}, // Error.
                        ^", null);
-  } =>#t122, block {
-    final core::Set<core::int> #t123 = col::LinkedHashSet::•<core::int>();
+  } =>#t120, block {
+    final core::Set<core::int> #t121 = col::LinkedHashSet::•<core::int>();
     for (dynamic e in iterable)
-      for (final dynamic #t124 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:60:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      for (final dynamic #t122 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:60:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {for (dynamic e in iterable) ...x}, // Error.
                                     ^") {
-        final core::int #t125 = #t124 as{TypeError,ForNonNullableByDefault} core::int;
-        #t123.{core::Set::add}(#t125);
+        final core::int #t123 = #t122 as{TypeError,ForNonNullableByDefault} core::int;
+        #t121.{core::Set::add}{Invariant}(#t123);
       }
-  } =>#t123, block {
-    final core::Set<core::int> #t126 = col::LinkedHashSet::•<core::int>();
+  } =>#t121, block {
+    final core::Set<core::int> #t124 = col::LinkedHashSet::•<core::int>();
     for (dynamic e in iterable)
-      for (final dynamic #t127 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:61:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      for (final dynamic #t125 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:61:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {for (dynamic e in iterable) ...y}, // Error.
                                     ^") {
-        final core::int #t128 = #t127 as{TypeError,ForNonNullableByDefault} core::int;
-        #t126.{core::Set::add}(#t128);
+        final core::int #t126 = #t125 as{TypeError,ForNonNullableByDefault} core::int;
+        #t124.{core::Set::add}{Invariant}(#t126);
       }
-  } =>#t126, block {
-    final core::Set<core::int> #t129 = col::LinkedHashSet::•<core::int>();
+  } =>#t124, block {
+    final core::Set<core::int> #t127 = col::LinkedHashSet::•<core::int>();
     for (dynamic e in iterable)
-      for (final dynamic #t130 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:62:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      for (final dynamic #t128 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:62:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {for (dynamic e in iterable) ...z}, // Error.
                                     ^") {
-        final core::int #t131 = #t130 as{TypeError,ForNonNullableByDefault} core::int;
-        #t129.{core::Set::add}(#t131);
+        final core::int #t129 = #t128 as{TypeError,ForNonNullableByDefault} core::int;
+        #t127.{core::Set::add}{Invariant}(#t129);
       }
-  } =>#t129, block {
-    final core::Map<core::int, core::int> #t132 = <core::int, core::int>{};
+  } =>#t127, block {
+    final core::Map<core::int, core::int> #t130 = <core::int, core::int>{};
     for (dynamic e in iterable)
-      #t132.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:63:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      #t130.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:63:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {for (dynamic e in iterable) ...w}, // Error.
                                     ^", null);
-  } =>#t132, block {
-    final core::Set<core::int> #t133 = col::LinkedHashSet::•<core::int>();
+  } =>#t130, block {
+    final core::Set<core::int> #t131 = col::LinkedHashSet::•<core::int>();
     for (core::int i = 0; i.{core::num::<}(42); i = i.{core::num::+}(1))
-      for (final dynamic #t134 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:64:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      for (final dynamic #t132 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:64:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {for (int i = 0; i < 42; ++i) ...x}, // Error.
                                      ^") {
-        final core::int #t135 = #t134 as{TypeError,ForNonNullableByDefault} core::int;
-        #t133.{core::Set::add}(#t135);
+        final core::int #t133 = #t132 as{TypeError,ForNonNullableByDefault} core::int;
+        #t131.{core::Set::add}{Invariant}(#t133);
       }
-  } =>#t133, block {
-    final core::Set<core::int> #t136 = col::LinkedHashSet::•<core::int>();
+  } =>#t131, block {
+    final core::Set<core::int> #t134 = col::LinkedHashSet::•<core::int>();
     for (core::int i = 0; i.{core::num::<}(42); i = i.{core::num::+}(1))
-      for (final dynamic #t137 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:65:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      for (final dynamic #t135 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:65:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {for (int i = 0; i < 42; ++i) ...y}, // Error.
                                      ^") {
-        final core::int #t138 = #t137 as{TypeError,ForNonNullableByDefault} core::int;
-        #t136.{core::Set::add}(#t138);
+        final core::int #t136 = #t135 as{TypeError,ForNonNullableByDefault} core::int;
+        #t134.{core::Set::add}{Invariant}(#t136);
       }
-  } =>#t136, block {
-    final core::Set<core::int> #t139 = col::LinkedHashSet::•<core::int>();
+  } =>#t134, block {
+    final core::Set<core::int> #t137 = col::LinkedHashSet::•<core::int>();
     for (core::int i = 0; i.{core::num::<}(42); i = i.{core::num::+}(1))
-      for (final dynamic #t140 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:66:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      for (final dynamic #t138 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:66:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {for (int i = 0; i < 42; ++i) ...z}, // Error.
                                      ^") {
-        final core::int #t141 = #t140 as{TypeError,ForNonNullableByDefault} core::int;
-        #t139.{core::Set::add}(#t141);
+        final core::int #t139 = #t138 as{TypeError,ForNonNullableByDefault} core::int;
+        #t137.{core::Set::add}{Invariant}(#t139);
       }
-  } =>#t139, block {
-    final core::Map<core::int, core::int> #t142 = <core::int, core::int>{};
+  } =>#t137, block {
+    final core::Map<core::int, core::int> #t140 = <core::int, core::int>{};
     for (core::int i = 0; i.{core::num::<}(42); i = i.{core::num::+}(1))
-      #t142.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:67:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      #t140.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:67:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {for (int i = 0; i < 42; ++i) ...w}, // Error.
                                      ^", null);
-  } =>#t142, block {
-    final core::Set<core::int> #t143 = col::LinkedHashSet::•<core::int>();
-    final core::Iterable<dynamic>? #t144 = x;
-    if(!#t144.{core::Object::==}(null))
-      for (final dynamic #t145 in #t144{core::Iterable<dynamic>}) {
-        final core::int #t146 = #t145 as{TypeError,ForNonNullableByDefault} core::int;
-        #t143.{core::Set::add}(#t146);
+  } =>#t140, block {
+    final core::Set<core::int> #t141 = col::LinkedHashSet::•<core::int>();
+    final core::Iterable<dynamic>? #t142 = x;
+    if(!#t142.{core::Object::==}(null))
+      for (final dynamic #t143 in #t142{core::Iterable<dynamic>}) {
+        final core::int #t144 = #t143 as{TypeError,ForNonNullableByDefault} core::int;
+        #t141.{core::Set::add}{Invariant}(#t144);
       }
-  } =>#t143, block {
-    final core::Set<core::int> #t147 = col::LinkedHashSet::•<core::int>();
-    final core::Iterable<dynamic>? #t148 = y;
-    if(!#t148.{core::Object::==}(null))
-      for (final dynamic #t149 in #t148{core::Iterable<dynamic>}) {
-        final core::int #t150 = #t149 as{TypeError,ForNonNullableByDefault} core::int;
-        #t147.{core::Set::add}(#t150);
+  } =>#t141, block {
+    final core::Set<core::int> #t145 = col::LinkedHashSet::•<core::int>();
+    final core::Iterable<dynamic>? #t146 = y;
+    if(!#t146.{core::Object::==}(null))
+      for (final dynamic #t147 in #t146{core::Iterable<dynamic>}) {
+        final core::int #t148 = #t147 as{TypeError,ForNonNullableByDefault} core::int;
+        #t145.{core::Set::add}{Invariant}(#t148);
       }
-  } =>#t147, block {
-    final core::Set<core::int> #t151 = col::LinkedHashSet::•<core::int>();
-    final core::Iterable<dynamic>? #t152 = z;
-    if(!#t152.{core::Object::==}(null))
-      for (final dynamic #t153 in #t152{core::Iterable<dynamic>}) {
-        final core::int #t154 = #t153 as{TypeError,ForNonNullableByDefault} core::int;
-        #t151.{core::Set::add}(#t154);
+  } =>#t145, block {
+    final core::Set<core::int> #t149 = col::LinkedHashSet::•<core::int>();
+    final core::Iterable<dynamic>? #t150 = z;
+    if(!#t150.{core::Object::==}(null))
+      for (final dynamic #t151 in #t150{core::Iterable<dynamic>}) {
+        final core::int #t152 = #t151 as{TypeError,ForNonNullableByDefault} core::int;
+        #t149.{core::Set::add}{Invariant}(#t152);
       }
-  } =>#t151, block {
-    final core::Map<core::int, core::int> #t155 = <core::int, core::int>{};
-    final core::Map<core::int, core::int>? #t156 = w;
-    if(!#t156.{core::Object::==}(null))
-      for (final core::MapEntry<core::int, core::int> #t157 in #t156{core::Map<core::int, core::int>}.{core::Map::entries})
-        #t155.{core::Map::[]=}(#t157.{core::MapEntry::key}, #t157.{core::MapEntry::value});
-  } =>#t155, block {
-    final core::Set<core::int> #t158 = col::LinkedHashSet::•<core::int>();
+  } =>#t149, block {
+    final core::Map<core::int, core::int> #t153 = <core::int, core::int>{};
+    final core::Map<core::int, core::int>? #t154 = w;
+    if(!#t154.{core::Object::==}(null))
+      for (final core::MapEntry<core::int, core::int> #t155 in #t154{core::Map<core::int, core::int>}.{core::Map::entries})
+        #t153.{core::Map::[]=}{Invariant}(#t155.{core::MapEntry::key}, #t155.{core::MapEntry::value});
+  } =>#t153, block {
+    final core::Set<core::int> #t156 = col::LinkedHashSet::•<core::int>();
     if(condition) {
-      final core::Iterable<dynamic>? #t159 = x;
-      if(!#t159.{core::Object::==}(null))
-        for (final dynamic #t160 in #t159{core::Iterable<dynamic>}) {
-          final core::int #t161 = #t160 as{TypeError,ForNonNullableByDefault} core::int;
-          #t158.{core::Set::add}(#t161);
+      final core::Iterable<dynamic>? #t157 = x;
+      if(!#t157.{core::Object::==}(null))
+        for (final dynamic #t158 in #t157{core::Iterable<dynamic>}) {
+          final core::int #t159 = #t158 as{TypeError,ForNonNullableByDefault} core::int;
+          #t156.{core::Set::add}{Invariant}(#t159);
         }
     }
-  } =>#t158, block {
-    final core::Set<core::int> #t162 = col::LinkedHashSet::•<core::int>();
+  } =>#t156, block {
+    final core::Set<core::int> #t160 = col::LinkedHashSet::•<core::int>();
     if(condition) {
-      final core::Iterable<dynamic>? #t163 = y;
-      if(!#t163.{core::Object::==}(null))
-        for (final dynamic #t164 in #t163{core::Iterable<dynamic>}) {
-          final core::int #t165 = #t164 as{TypeError,ForNonNullableByDefault} core::int;
-          #t162.{core::Set::add}(#t165);
+      final core::Iterable<dynamic>? #t161 = y;
+      if(!#t161.{core::Object::==}(null))
+        for (final dynamic #t162 in #t161{core::Iterable<dynamic>}) {
+          final core::int #t163 = #t162 as{TypeError,ForNonNullableByDefault} core::int;
+          #t160.{core::Set::add}{Invariant}(#t163);
         }
     }
-  } =>#t162, block {
-    final core::Set<core::int> #t166 = col::LinkedHashSet::•<core::int>();
+  } =>#t160, block {
+    final core::Set<core::int> #t164 = col::LinkedHashSet::•<core::int>();
     if(condition) {
-      final core::Iterable<dynamic>? #t167 = z;
-      if(!#t167.{core::Object::==}(null))
-        for (final dynamic #t168 in #t167{core::Iterable<dynamic>}) {
-          final core::int #t169 = #t168 as{TypeError,ForNonNullableByDefault} core::int;
-          #t166.{core::Set::add}(#t169);
+      final core::Iterable<dynamic>? #t165 = z;
+      if(!#t165.{core::Object::==}(null))
+        for (final dynamic #t166 in #t165{core::Iterable<dynamic>}) {
+          final core::int #t167 = #t166 as{TypeError,ForNonNullableByDefault} core::int;
+          #t164.{core::Set::add}{Invariant}(#t167);
         }
     }
-  } =>#t166, block {
-    final core::Map<core::int, core::int> #t170 = <core::int, core::int>{};
+  } =>#t164, block {
+    final core::Map<core::int, core::int> #t168 = <core::int, core::int>{};
     if(condition) {
-      final core::Map<core::int, core::int>? #t171 = w;
-      if(!#t171.{core::Object::==}(null))
-        for (final core::MapEntry<core::int, core::int> #t172 in #t171{core::Map<core::int, core::int>}.{core::Map::entries})
-          #t170.{core::Map::[]=}(#t172.{core::MapEntry::key}, #t172.{core::MapEntry::value});
+      final core::Map<core::int, core::int>? #t169 = w;
+      if(!#t169.{core::Object::==}(null))
+        for (final core::MapEntry<core::int, core::int> #t170 in #t169{core::Map<core::int, core::int>}.{core::Map::entries})
+          #t168.{core::Map::[]=}{Invariant}(#t170.{core::MapEntry::key}, #t170.{core::MapEntry::value});
     }
-  } =>#t170, block {
-    final core::Set<core::int> #t173 = col::LinkedHashSet::•<core::int>();
+  } =>#t168, block {
+    final core::Set<core::int> #t171 = col::LinkedHashSet::•<core::int>();
     for (dynamic e in iterable) {
-      final core::Iterable<dynamic>? #t174 = x;
-      if(!#t174.{core::Object::==}(null))
-        for (final dynamic #t175 in #t174{core::Iterable<dynamic>}) {
-          final core::int #t176 = #t175 as{TypeError,ForNonNullableByDefault} core::int;
-          #t173.{core::Set::add}(#t176);
+      final core::Iterable<dynamic>? #t172 = x;
+      if(!#t172.{core::Object::==}(null))
+        for (final dynamic #t173 in #t172{core::Iterable<dynamic>}) {
+          final core::int #t174 = #t173 as{TypeError,ForNonNullableByDefault} core::int;
+          #t171.{core::Set::add}{Invariant}(#t174);
         }
     }
-  } =>#t173, block {
-    final core::Set<core::int> #t177 = col::LinkedHashSet::•<core::int>();
+  } =>#t171, block {
+    final core::Set<core::int> #t175 = col::LinkedHashSet::•<core::int>();
     for (dynamic e in iterable) {
-      final core::Iterable<dynamic>? #t178 = y;
-      if(!#t178.{core::Object::==}(null))
-        for (final dynamic #t179 in #t178{core::Iterable<dynamic>}) {
-          final core::int #t180 = #t179 as{TypeError,ForNonNullableByDefault} core::int;
-          #t177.{core::Set::add}(#t180);
+      final core::Iterable<dynamic>? #t176 = y;
+      if(!#t176.{core::Object::==}(null))
+        for (final dynamic #t177 in #t176{core::Iterable<dynamic>}) {
+          final core::int #t178 = #t177 as{TypeError,ForNonNullableByDefault} core::int;
+          #t175.{core::Set::add}{Invariant}(#t178);
         }
     }
-  } =>#t177, block {
-    final core::Set<core::int> #t181 = col::LinkedHashSet::•<core::int>();
+  } =>#t175, block {
+    final core::Set<core::int> #t179 = col::LinkedHashSet::•<core::int>();
     for (dynamic e in iterable) {
-      final core::Iterable<dynamic>? #t182 = z;
-      if(!#t182.{core::Object::==}(null))
-        for (final dynamic #t183 in #t182{core::Iterable<dynamic>}) {
-          final core::int #t184 = #t183 as{TypeError,ForNonNullableByDefault} core::int;
-          #t181.{core::Set::add}(#t184);
+      final core::Iterable<dynamic>? #t180 = z;
+      if(!#t180.{core::Object::==}(null))
+        for (final dynamic #t181 in #t180{core::Iterable<dynamic>}) {
+          final core::int #t182 = #t181 as{TypeError,ForNonNullableByDefault} core::int;
+          #t179.{core::Set::add}{Invariant}(#t182);
         }
     }
-  } =>#t181, block {
-    final core::Map<core::int, core::int> #t185 = <core::int, core::int>{};
+  } =>#t179, block {
+    final core::Map<core::int, core::int> #t183 = <core::int, core::int>{};
     for (dynamic e in iterable) {
-      final core::Map<core::int, core::int>? #t186 = w;
-      if(!#t186.{core::Object::==}(null))
-        for (final core::MapEntry<core::int, core::int> #t187 in #t186{core::Map<core::int, core::int>}.{core::Map::entries})
-          #t185.{core::Map::[]=}(#t187.{core::MapEntry::key}, #t187.{core::MapEntry::value});
+      final core::Map<core::int, core::int>? #t184 = w;
+      if(!#t184.{core::Object::==}(null))
+        for (final core::MapEntry<core::int, core::int> #t185 in #t184{core::Map<core::int, core::int>}.{core::Map::entries})
+          #t183.{core::Map::[]=}{Invariant}(#t185.{core::MapEntry::key}, #t185.{core::MapEntry::value});
     }
-  } =>#t185, block {
-    final core::Set<core::int> #t188 = col::LinkedHashSet::•<core::int>();
+  } =>#t183, block {
+    final core::Set<core::int> #t186 = col::LinkedHashSet::•<core::int>();
     for (core::int i = 0; i.{core::num::<}(42); i = i.{core::num::+}(1)) {
-      final core::Iterable<dynamic>? #t189 = x;
-      if(!#t189.{core::Object::==}(null))
-        for (final dynamic #t190 in #t189{core::Iterable<dynamic>}) {
-          final core::int #t191 = #t190 as{TypeError,ForNonNullableByDefault} core::int;
-          #t188.{core::Set::add}(#t191);
+      final core::Iterable<dynamic>? #t187 = x;
+      if(!#t187.{core::Object::==}(null))
+        for (final dynamic #t188 in #t187{core::Iterable<dynamic>}) {
+          final core::int #t189 = #t188 as{TypeError,ForNonNullableByDefault} core::int;
+          #t186.{core::Set::add}{Invariant}(#t189);
         }
     }
-  } =>#t188, block {
-    final core::Set<core::int> #t192 = col::LinkedHashSet::•<core::int>();
+  } =>#t186, block {
+    final core::Set<core::int> #t190 = col::LinkedHashSet::•<core::int>();
     for (core::int i = 0; i.{core::num::<}(42); i = i.{core::num::+}(1)) {
-      final core::Iterable<dynamic>? #t193 = y;
-      if(!#t193.{core::Object::==}(null))
-        for (final dynamic #t194 in #t193{core::Iterable<dynamic>}) {
-          final core::int #t195 = #t194 as{TypeError,ForNonNullableByDefault} core::int;
-          #t192.{core::Set::add}(#t195);
+      final core::Iterable<dynamic>? #t191 = y;
+      if(!#t191.{core::Object::==}(null))
+        for (final dynamic #t192 in #t191{core::Iterable<dynamic>}) {
+          final core::int #t193 = #t192 as{TypeError,ForNonNullableByDefault} core::int;
+          #t190.{core::Set::add}{Invariant}(#t193);
         }
     }
-  } =>#t192, block {
-    final core::Set<core::int> #t196 = col::LinkedHashSet::•<core::int>();
+  } =>#t190, block {
+    final core::Set<core::int> #t194 = col::LinkedHashSet::•<core::int>();
     for (core::int i = 0; i.{core::num::<}(42); i = i.{core::num::+}(1)) {
-      final core::Iterable<dynamic>? #t197 = z;
-      if(!#t197.{core::Object::==}(null))
-        for (final dynamic #t198 in #t197{core::Iterable<dynamic>}) {
-          final core::int #t199 = #t198 as{TypeError,ForNonNullableByDefault} core::int;
-          #t196.{core::Set::add}(#t199);
+      final core::Iterable<dynamic>? #t195 = z;
+      if(!#t195.{core::Object::==}(null))
+        for (final dynamic #t196 in #t195{core::Iterable<dynamic>}) {
+          final core::int #t197 = #t196 as{TypeError,ForNonNullableByDefault} core::int;
+          #t194.{core::Set::add}{Invariant}(#t197);
         }
     }
-  } =>#t196, block {
-    final core::Map<core::int, core::int> #t200 = <core::int, core::int>{};
+  } =>#t194, block {
+    final core::Map<core::int, core::int> #t198 = <core::int, core::int>{};
     for (core::int i = 0; i.{core::num::<}(42); i = i.{core::num::+}(1)) {
-      final core::Map<core::int, core::int>? #t201 = w;
-      if(!#t201.{core::Object::==}(null))
-        for (final core::MapEntry<core::int, core::int> #t202 in #t201{core::Map<core::int, core::int>}.{core::Map::entries})
-          #t200.{core::Map::[]=}(#t202.{core::MapEntry::key}, #t202.{core::MapEntry::value});
+      final core::Map<core::int, core::int>? #t199 = w;
+      if(!#t199.{core::Object::==}(null))
+        for (final core::MapEntry<core::int, core::int> #t200 in #t199{core::Map<core::int, core::int>}.{core::Map::entries})
+          #t198.{core::Map::[]=}{Invariant}(#t200.{core::MapEntry::key}, #t200.{core::MapEntry::value});
     }
-  } =>#t200];
+  } =>#t198];
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue43495.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue43495.dart.weak.transformed.expect
index 84cd03a..e3ffc57 100644
--- a/pkg/front_end/testcases/nnbd/issue43495.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue43495.dart.weak.transformed.expect
@@ -175,7 +175,7 @@
     {...a}, // Error.
         ^") {
       final core::int #t3 = #t2 as{TypeError,ForNonNullableByDefault} core::int;
-      #t1.{core::Set::add}(#t3);
+      #t1.{core::Set::add}{Invariant}(#t3);
     }
   } =>#t1, block {
     final core::Set<core::int> #t4 = new col::_CompactLinkedHashSet::•<core::int>();
@@ -183,7 +183,7 @@
     {...b}, // Error.
         ^") {
       final core::int #t6 = #t5 as{TypeError,ForNonNullableByDefault} core::int;
-      #t4.{core::Set::add}(#t6);
+      #t4.{core::Set::add}{Invariant}(#t6);
     }
   } =>#t4, block {
     final core::Set<core::int> #t7 = new col::_CompactLinkedHashSet::•<core::int>();
@@ -191,775 +191,781 @@
     {...c}, // Error.
         ^") {
       final core::int #t9 = #t8 as{TypeError,ForNonNullableByDefault} core::int;
-      #t7.{core::Set::add}(#t9);
+      #t7.{core::Set::add}{Invariant}(#t9);
     }
   } =>#t7, <core::int, core::int>{invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:11:9: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {...d}, // Error.
         ^": null}, <core::int, core::int>{invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:12:19: Error: Unexpected type 'List<int>?' of a map spread entry.  Expected 'dynamic' or a Map.
  - 'List' is from 'dart:core'.
     <int, int>{...a}, // Error.
-                  ^": null}, let final core::Set<core::int> #t10 = new col::_CompactLinkedHashSet::•<core::int>() in let final core::bool #t11 = #t10.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:13:14: Error: Unexpected type 'Map<int, int>?' of a spread.  Expected 'dynamic' or an Iterable.
+                  ^": null}, block {
+    final core::Set<core::int> #t10 = new col::_CompactLinkedHashSet::•<core::int>();
+    #t10.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:13:14: Error: Unexpected type 'Map<int, int>?' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
     <int>{...d}, // Error.
-             ^") in #t10, block {
-    final core::Set<core::int> #t12 = new col::_CompactLinkedHashSet::•<core::int>();
+             ^");
+  } =>#t10, block {
+    final core::Set<core::int> #t11 = new col::_CompactLinkedHashSet::•<core::int>();
     if(condition)
-      for (final dynamic #t13 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:14:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      for (final dynamic #t12 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:14:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {if (condition) ...a}, // Error.
                        ^") {
-        final core::int #t14 = #t13 as{TypeError,ForNonNullableByDefault} core::int;
-        #t12.{core::Set::add}(#t14);
+        final core::int #t13 = #t12 as{TypeError,ForNonNullableByDefault} core::int;
+        #t11.{core::Set::add}{Invariant}(#t13);
       }
-  } =>#t12, block {
-    final core::Set<core::int> #t15 = new col::_CompactLinkedHashSet::•<core::int>();
+  } =>#t11, block {
+    final core::Set<core::int> #t14 = new col::_CompactLinkedHashSet::•<core::int>();
     if(condition)
-      for (final dynamic #t16 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:15:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      for (final dynamic #t15 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:15:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {if (condition) ...b}, // Error.
                        ^") {
-        final core::int #t17 = #t16 as{TypeError,ForNonNullableByDefault} core::int;
-        #t15.{core::Set::add}(#t17);
+        final core::int #t16 = #t15 as{TypeError,ForNonNullableByDefault} core::int;
+        #t14.{core::Set::add}{Invariant}(#t16);
       }
-  } =>#t15, block {
-    final core::Set<core::int> #t18 = new col::_CompactLinkedHashSet::•<core::int>();
+  } =>#t14, block {
+    final core::Set<core::int> #t17 = new col::_CompactLinkedHashSet::•<core::int>();
     if(condition)
-      for (final dynamic #t19 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:16:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      for (final dynamic #t18 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:16:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {if (condition) ...c}, // Error.
                        ^") {
-        final core::int #t20 = #t19 as{TypeError,ForNonNullableByDefault} core::int;
-        #t18.{core::Set::add}(#t20);
+        final core::int #t19 = #t18 as{TypeError,ForNonNullableByDefault} core::int;
+        #t17.{core::Set::add}{Invariant}(#t19);
       }
-  } =>#t18, block {
-    final core::Map<core::int, core::int> #t21 = <core::int, core::int>{};
+  } =>#t17, block {
+    final core::Map<core::int, core::int> #t20 = <core::int, core::int>{};
     if(condition)
-      #t21.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:17:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      #t20.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:17:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {if (condition) ...d}, // Error.
                        ^", null);
-  } =>#t21, block {
-    final core::Set<core::int> #t22 = new col::_CompactLinkedHashSet::•<core::int>();
+  } =>#t20, block {
+    final core::Set<core::int> #t21 = new col::_CompactLinkedHashSet::•<core::int>();
     {
       core::Iterator<dynamic> :sync-for-iterator = iterable.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         dynamic e = :sync-for-iterator.{core::Iterator::current};
-        for (final dynamic #t23 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:18:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+        for (final dynamic #t22 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:18:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {for (dynamic e in iterable) ...a}, // Error.
                                     ^") {
-          final core::int #t24 = #t23 as{TypeError,ForNonNullableByDefault} core::int;
-          #t22.{core::Set::add}(#t24);
+          final core::int #t23 = #t22 as{TypeError,ForNonNullableByDefault} core::int;
+          #t21.{core::Set::add}{Invariant}(#t23);
         }
       }
     }
-  } =>#t22, block {
-    final core::Set<core::int> #t25 = new col::_CompactLinkedHashSet::•<core::int>();
+  } =>#t21, block {
+    final core::Set<core::int> #t24 = new col::_CompactLinkedHashSet::•<core::int>();
     {
       core::Iterator<dynamic> :sync-for-iterator = iterable.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         dynamic e = :sync-for-iterator.{core::Iterator::current};
-        for (final dynamic #t26 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:19:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+        for (final dynamic #t25 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:19:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {for (dynamic e in iterable) ...b}, // Error.
                                     ^") {
-          final core::int #t27 = #t26 as{TypeError,ForNonNullableByDefault} core::int;
-          #t25.{core::Set::add}(#t27);
+          final core::int #t26 = #t25 as{TypeError,ForNonNullableByDefault} core::int;
+          #t24.{core::Set::add}{Invariant}(#t26);
         }
       }
     }
-  } =>#t25, block {
-    final core::Set<core::int> #t28 = new col::_CompactLinkedHashSet::•<core::int>();
+  } =>#t24, block {
+    final core::Set<core::int> #t27 = new col::_CompactLinkedHashSet::•<core::int>();
     {
       core::Iterator<dynamic> :sync-for-iterator = iterable.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         dynamic e = :sync-for-iterator.{core::Iterator::current};
-        for (final dynamic #t29 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:20:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+        for (final dynamic #t28 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:20:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {for (dynamic e in iterable) ...c}, // Error.
                                     ^") {
-          final core::int #t30 = #t29 as{TypeError,ForNonNullableByDefault} core::int;
-          #t28.{core::Set::add}(#t30);
+          final core::int #t29 = #t28 as{TypeError,ForNonNullableByDefault} core::int;
+          #t27.{core::Set::add}{Invariant}(#t29);
         }
       }
     }
-  } =>#t28, block {
-    final core::Map<core::int, core::int> #t31 = <core::int, core::int>{};
+  } =>#t27, block {
+    final core::Map<core::int, core::int> #t30 = <core::int, core::int>{};
     {
       core::Iterator<dynamic> :sync-for-iterator = iterable.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         dynamic e = :sync-for-iterator.{core::Iterator::current};
-        #t31.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:21:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+        #t30.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:21:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {for (dynamic e in iterable) ...d}, // Error.
                                     ^", null);
       }
     }
-  } =>#t31, block {
-    final core::Set<core::int> #t32 = new col::_CompactLinkedHashSet::•<core::int>();
+  } =>#t30, block {
+    final core::Set<core::int> #t31 = new col::_CompactLinkedHashSet::•<core::int>();
     for (core::int i = 0; i.{core::num::<}(42); i = i.{core::num::+}(1))
-      for (final dynamic #t33 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:22:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      for (final dynamic #t32 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:22:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {for (int i = 0; i < 42; ++i) ...a}, // Error.
                                      ^") {
-        final core::int #t34 = #t33 as{TypeError,ForNonNullableByDefault} core::int;
-        #t32.{core::Set::add}(#t34);
+        final core::int #t33 = #t32 as{TypeError,ForNonNullableByDefault} core::int;
+        #t31.{core::Set::add}{Invariant}(#t33);
       }
-  } =>#t32, block {
-    final core::Set<core::int> #t35 = new col::_CompactLinkedHashSet::•<core::int>();
+  } =>#t31, block {
+    final core::Set<core::int> #t34 = new col::_CompactLinkedHashSet::•<core::int>();
     for (core::int i = 0; i.{core::num::<}(42); i = i.{core::num::+}(1))
-      for (final dynamic #t36 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:23:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      for (final dynamic #t35 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:23:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {for (int i = 0; i < 42; ++i) ...b}, // Error.
                                      ^") {
-        final core::int #t37 = #t36 as{TypeError,ForNonNullableByDefault} core::int;
-        #t35.{core::Set::add}(#t37);
+        final core::int #t36 = #t35 as{TypeError,ForNonNullableByDefault} core::int;
+        #t34.{core::Set::add}{Invariant}(#t36);
       }
-  } =>#t35, block {
-    final core::Set<core::int> #t38 = new col::_CompactLinkedHashSet::•<core::int>();
+  } =>#t34, block {
+    final core::Set<core::int> #t37 = new col::_CompactLinkedHashSet::•<core::int>();
     for (core::int i = 0; i.{core::num::<}(42); i = i.{core::num::+}(1))
-      for (final dynamic #t39 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:24:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      for (final dynamic #t38 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:24:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {for (int i = 0; i < 42; ++i) ...c}, // Error.
                                      ^") {
-        final core::int #t40 = #t39 as{TypeError,ForNonNullableByDefault} core::int;
-        #t38.{core::Set::add}(#t40);
+        final core::int #t39 = #t38 as{TypeError,ForNonNullableByDefault} core::int;
+        #t37.{core::Set::add}{Invariant}(#t39);
       }
-  } =>#t38, block {
-    final core::Map<core::int, core::int> #t41 = <core::int, core::int>{};
+  } =>#t37, block {
+    final core::Map<core::int, core::int> #t40 = <core::int, core::int>{};
     for (core::int i = 0; i.{core::num::<}(42); i = i.{core::num::+}(1))
-      #t41.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:25:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      #t40.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:25:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {for (int i = 0; i < 42; ++i) ...d}, // Error.
                                      ^", null);
+  } =>#t40, block {
+    final core::Set<core::int> #t41 = new col::_CompactLinkedHashSet::•<core::int>();
+    final core::Iterable<dynamic>? #t42 = a;
+    if(!#t42.{core::Object::==}(null)) {
+      core::Iterator<dynamic> :sync-for-iterator = #t42{core::Iterable<dynamic>}.{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final dynamic #t43 = :sync-for-iterator.{core::Iterator::current};
+        {
+          final core::int #t44 = #t43 as{TypeError,ForNonNullableByDefault} core::int;
+          #t41.{core::Set::add}{Invariant}(#t44);
+        }
+      }
+    }
   } =>#t41, block {
-    final core::Set<core::int> #t42 = new col::_CompactLinkedHashSet::•<core::int>();
-    final core::Iterable<dynamic>? #t43 = a;
-    if(!#t43.{core::Object::==}(null)) {
-      core::Iterator<dynamic> :sync-for-iterator = #t43{core::Iterable<dynamic>}.{core::Iterable::iterator};
+    final core::Set<core::int> #t45 = new col::_CompactLinkedHashSet::•<core::int>();
+    final core::Iterable<dynamic>? #t46 = b;
+    if(!#t46.{core::Object::==}(null)) {
+      core::Iterator<dynamic> :sync-for-iterator = #t46{core::Iterable<dynamic>}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final dynamic #t44 = :sync-for-iterator.{core::Iterator::current};
+        final dynamic #t47 = :sync-for-iterator.{core::Iterator::current};
         {
-          final core::int #t45 = #t44 as{TypeError,ForNonNullableByDefault} core::int;
-          #t42.{core::Set::add}(#t45);
+          final core::int #t48 = #t47 as{TypeError,ForNonNullableByDefault} core::int;
+          #t45.{core::Set::add}{Invariant}(#t48);
         }
       }
     }
-  } =>#t42, block {
-    final core::Set<core::int> #t46 = new col::_CompactLinkedHashSet::•<core::int>();
-    final core::Iterable<dynamic>? #t47 = b;
-    if(!#t47.{core::Object::==}(null)) {
-      core::Iterator<dynamic> :sync-for-iterator = #t47{core::Iterable<dynamic>}.{core::Iterable::iterator};
+  } =>#t45, block {
+    final core::Set<core::int> #t49 = new col::_CompactLinkedHashSet::•<core::int>();
+    final core::Iterable<dynamic>? #t50 = c;
+    if(!#t50.{core::Object::==}(null)) {
+      core::Iterator<dynamic> :sync-for-iterator = #t50{core::Iterable<dynamic>}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final dynamic #t48 = :sync-for-iterator.{core::Iterator::current};
+        final dynamic #t51 = :sync-for-iterator.{core::Iterator::current};
         {
-          final core::int #t49 = #t48 as{TypeError,ForNonNullableByDefault} core::int;
-          #t46.{core::Set::add}(#t49);
+          final core::int #t52 = #t51 as{TypeError,ForNonNullableByDefault} core::int;
+          #t49.{core::Set::add}{Invariant}(#t52);
         }
       }
     }
-  } =>#t46, block {
-    final core::Set<core::int> #t50 = new col::_CompactLinkedHashSet::•<core::int>();
-    final core::Iterable<dynamic>? #t51 = c;
-    if(!#t51.{core::Object::==}(null)) {
-      core::Iterator<dynamic> :sync-for-iterator = #t51{core::Iterable<dynamic>}.{core::Iterable::iterator};
+  } =>#t49, block {
+    final core::Map<core::int, core::int> #t53 = <core::int, core::int>{};
+    final core::Map<core::int, core::int>? #t54 = d;
+    if(!#t54.{core::Object::==}(null)) {
+      core::Iterator<core::MapEntry<core::int, core::int>> :sync-for-iterator = #t54{core::Map<core::int, core::int>}.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final dynamic #t52 = :sync-for-iterator.{core::Iterator::current};
-        {
-          final core::int #t53 = #t52 as{TypeError,ForNonNullableByDefault} core::int;
-          #t50.{core::Set::add}(#t53);
-        }
+        final core::MapEntry<core::int, core::int> #t55 = :sync-for-iterator.{core::Iterator::current};
+        #t53.{core::Map::[]=}{Invariant}(#t55.{core::MapEntry::key}, #t55.{core::MapEntry::value});
       }
     }
-  } =>#t50, block {
-    final core::Map<core::int, core::int> #t54 = <core::int, core::int>{};
-    final core::Map<core::int, core::int>? #t55 = d;
-    if(!#t55.{core::Object::==}(null)) {
-      core::Iterator<core::MapEntry<core::int, core::int>> :sync-for-iterator = #t55{core::Map<core::int, core::int>}.{core::Map::entries}.{core::Iterable::iterator};
-      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::MapEntry<core::int, core::int> #t56 = :sync-for-iterator.{core::Iterator::current};
-        #t54.{core::Map::[]=}(#t56.{core::MapEntry::key}, #t56.{core::MapEntry::value});
-      }
-    }
-  } =>#t54, block {
-    final core::Set<core::int> #t57 = new col::_CompactLinkedHashSet::•<core::int>();
+  } =>#t53, block {
+    final core::Set<core::int> #t56 = new col::_CompactLinkedHashSet::•<core::int>();
     if(condition) {
-      final core::Iterable<dynamic>? #t58 = a;
-      if(!#t58.{core::Object::==}(null)) {
-        core::Iterator<dynamic> :sync-for-iterator = #t58{core::Iterable<dynamic>}.{core::Iterable::iterator};
+      final core::Iterable<dynamic>? #t57 = a;
+      if(!#t57.{core::Object::==}(null)) {
+        core::Iterator<dynamic> :sync-for-iterator = #t57{core::Iterable<dynamic>}.{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final dynamic #t59 = :sync-for-iterator.{core::Iterator::current};
+          final dynamic #t58 = :sync-for-iterator.{core::Iterator::current};
           {
-            final core::int #t60 = #t59 as{TypeError,ForNonNullableByDefault} core::int;
-            #t57.{core::Set::add}(#t60);
+            final core::int #t59 = #t58 as{TypeError,ForNonNullableByDefault} core::int;
+            #t56.{core::Set::add}{Invariant}(#t59);
           }
         }
       }
     }
-  } =>#t57, block {
-    final core::Set<core::int> #t61 = new col::_CompactLinkedHashSet::•<core::int>();
+  } =>#t56, block {
+    final core::Set<core::int> #t60 = new col::_CompactLinkedHashSet::•<core::int>();
     if(condition) {
-      final core::Iterable<dynamic>? #t62 = b;
-      if(!#t62.{core::Object::==}(null)) {
-        core::Iterator<dynamic> :sync-for-iterator = #t62{core::Iterable<dynamic>}.{core::Iterable::iterator};
+      final core::Iterable<dynamic>? #t61 = b;
+      if(!#t61.{core::Object::==}(null)) {
+        core::Iterator<dynamic> :sync-for-iterator = #t61{core::Iterable<dynamic>}.{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final dynamic #t63 = :sync-for-iterator.{core::Iterator::current};
+          final dynamic #t62 = :sync-for-iterator.{core::Iterator::current};
           {
-            final core::int #t64 = #t63 as{TypeError,ForNonNullableByDefault} core::int;
-            #t61.{core::Set::add}(#t64);
+            final core::int #t63 = #t62 as{TypeError,ForNonNullableByDefault} core::int;
+            #t60.{core::Set::add}{Invariant}(#t63);
           }
         }
       }
     }
-  } =>#t61, block {
-    final core::Set<core::int> #t65 = new col::_CompactLinkedHashSet::•<core::int>();
+  } =>#t60, block {
+    final core::Set<core::int> #t64 = new col::_CompactLinkedHashSet::•<core::int>();
     if(condition) {
-      final core::Iterable<dynamic>? #t66 = c;
-      if(!#t66.{core::Object::==}(null)) {
-        core::Iterator<dynamic> :sync-for-iterator = #t66{core::Iterable<dynamic>}.{core::Iterable::iterator};
+      final core::Iterable<dynamic>? #t65 = c;
+      if(!#t65.{core::Object::==}(null)) {
+        core::Iterator<dynamic> :sync-for-iterator = #t65{core::Iterable<dynamic>}.{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final dynamic #t67 = :sync-for-iterator.{core::Iterator::current};
+          final dynamic #t66 = :sync-for-iterator.{core::Iterator::current};
           {
-            final core::int #t68 = #t67 as{TypeError,ForNonNullableByDefault} core::int;
-            #t65.{core::Set::add}(#t68);
+            final core::int #t67 = #t66 as{TypeError,ForNonNullableByDefault} core::int;
+            #t64.{core::Set::add}{Invariant}(#t67);
           }
         }
       }
     }
-  } =>#t65, block {
-    final core::Map<core::int, core::int> #t69 = <core::int, core::int>{};
+  } =>#t64, block {
+    final core::Map<core::int, core::int> #t68 = <core::int, core::int>{};
     if(condition) {
-      final core::Map<core::int, core::int>? #t70 = d;
-      if(!#t70.{core::Object::==}(null)) {
-        core::Iterator<core::MapEntry<core::int, core::int>> :sync-for-iterator = #t70{core::Map<core::int, core::int>}.{core::Map::entries}.{core::Iterable::iterator};
+      final core::Map<core::int, core::int>? #t69 = d;
+      if(!#t69.{core::Object::==}(null)) {
+        core::Iterator<core::MapEntry<core::int, core::int>> :sync-for-iterator = #t69{core::Map<core::int, core::int>}.{core::Map::entries}.{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final core::MapEntry<core::int, core::int> #t71 = :sync-for-iterator.{core::Iterator::current};
-          #t69.{core::Map::[]=}(#t71.{core::MapEntry::key}, #t71.{core::MapEntry::value});
+          final core::MapEntry<core::int, core::int> #t70 = :sync-for-iterator.{core::Iterator::current};
+          #t68.{core::Map::[]=}{Invariant}(#t70.{core::MapEntry::key}, #t70.{core::MapEntry::value});
         }
       }
     }
-  } =>#t69, block {
-    final core::Set<core::int> #t72 = new col::_CompactLinkedHashSet::•<core::int>();
+  } =>#t68, block {
+    final core::Set<core::int> #t71 = new col::_CompactLinkedHashSet::•<core::int>();
     {
       core::Iterator<dynamic> :sync-for-iterator = iterable.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         dynamic e = :sync-for-iterator.{core::Iterator::current};
         {
-          final core::Iterable<dynamic>? #t73 = a;
-          if(!#t73.{core::Object::==}(null)) {
-            core::Iterator<dynamic> :sync-for-iterator = #t73{core::Iterable<dynamic>}.{core::Iterable::iterator};
+          final core::Iterable<dynamic>? #t72 = a;
+          if(!#t72.{core::Object::==}(null)) {
+            core::Iterator<dynamic> :sync-for-iterator = #t72{core::Iterable<dynamic>}.{core::Iterable::iterator};
             for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-              final dynamic #t74 = :sync-for-iterator.{core::Iterator::current};
+              final dynamic #t73 = :sync-for-iterator.{core::Iterator::current};
               {
-                final core::int #t75 = #t74 as{TypeError,ForNonNullableByDefault} core::int;
-                #t72.{core::Set::add}(#t75);
+                final core::int #t74 = #t73 as{TypeError,ForNonNullableByDefault} core::int;
+                #t71.{core::Set::add}{Invariant}(#t74);
               }
             }
           }
         }
       }
     }
-  } =>#t72, block {
-    final core::Set<core::int> #t76 = new col::_CompactLinkedHashSet::•<core::int>();
+  } =>#t71, block {
+    final core::Set<core::int> #t75 = new col::_CompactLinkedHashSet::•<core::int>();
     {
       core::Iterator<dynamic> :sync-for-iterator = iterable.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         dynamic e = :sync-for-iterator.{core::Iterator::current};
         {
-          final core::Iterable<dynamic>? #t77 = b;
-          if(!#t77.{core::Object::==}(null)) {
-            core::Iterator<dynamic> :sync-for-iterator = #t77{core::Iterable<dynamic>}.{core::Iterable::iterator};
+          final core::Iterable<dynamic>? #t76 = b;
+          if(!#t76.{core::Object::==}(null)) {
+            core::Iterator<dynamic> :sync-for-iterator = #t76{core::Iterable<dynamic>}.{core::Iterable::iterator};
             for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-              final dynamic #t78 = :sync-for-iterator.{core::Iterator::current};
+              final dynamic #t77 = :sync-for-iterator.{core::Iterator::current};
               {
-                final core::int #t79 = #t78 as{TypeError,ForNonNullableByDefault} core::int;
-                #t76.{core::Set::add}(#t79);
+                final core::int #t78 = #t77 as{TypeError,ForNonNullableByDefault} core::int;
+                #t75.{core::Set::add}{Invariant}(#t78);
               }
             }
           }
         }
       }
     }
-  } =>#t76, block {
-    final core::Set<core::int> #t80 = new col::_CompactLinkedHashSet::•<core::int>();
+  } =>#t75, block {
+    final core::Set<core::int> #t79 = new col::_CompactLinkedHashSet::•<core::int>();
     {
       core::Iterator<dynamic> :sync-for-iterator = iterable.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         dynamic e = :sync-for-iterator.{core::Iterator::current};
         {
-          final core::Iterable<dynamic>? #t81 = c;
-          if(!#t81.{core::Object::==}(null)) {
-            core::Iterator<dynamic> :sync-for-iterator = #t81{core::Iterable<dynamic>}.{core::Iterable::iterator};
+          final core::Iterable<dynamic>? #t80 = c;
+          if(!#t80.{core::Object::==}(null)) {
+            core::Iterator<dynamic> :sync-for-iterator = #t80{core::Iterable<dynamic>}.{core::Iterable::iterator};
             for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-              final dynamic #t82 = :sync-for-iterator.{core::Iterator::current};
+              final dynamic #t81 = :sync-for-iterator.{core::Iterator::current};
               {
-                final core::int #t83 = #t82 as{TypeError,ForNonNullableByDefault} core::int;
-                #t80.{core::Set::add}(#t83);
+                final core::int #t82 = #t81 as{TypeError,ForNonNullableByDefault} core::int;
+                #t79.{core::Set::add}{Invariant}(#t82);
               }
             }
           }
         }
       }
     }
-  } =>#t80, block {
-    final core::Map<core::int, core::int> #t84 = <core::int, core::int>{};
+  } =>#t79, block {
+    final core::Map<core::int, core::int> #t83 = <core::int, core::int>{};
     {
       core::Iterator<dynamic> :sync-for-iterator = iterable.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         dynamic e = :sync-for-iterator.{core::Iterator::current};
         {
-          final core::Map<core::int, core::int>? #t85 = d;
-          if(!#t85.{core::Object::==}(null)) {
-            core::Iterator<core::MapEntry<core::int, core::int>> :sync-for-iterator = #t85{core::Map<core::int, core::int>}.{core::Map::entries}.{core::Iterable::iterator};
+          final core::Map<core::int, core::int>? #t84 = d;
+          if(!#t84.{core::Object::==}(null)) {
+            core::Iterator<core::MapEntry<core::int, core::int>> :sync-for-iterator = #t84{core::Map<core::int, core::int>}.{core::Map::entries}.{core::Iterable::iterator};
             for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-              final core::MapEntry<core::int, core::int> #t86 = :sync-for-iterator.{core::Iterator::current};
-              #t84.{core::Map::[]=}(#t86.{core::MapEntry::key}, #t86.{core::MapEntry::value});
+              final core::MapEntry<core::int, core::int> #t85 = :sync-for-iterator.{core::Iterator::current};
+              #t83.{core::Map::[]=}{Invariant}(#t85.{core::MapEntry::key}, #t85.{core::MapEntry::value});
             }
           }
         }
       }
     }
-  } =>#t84, block {
-    final core::Set<core::int> #t87 = new col::_CompactLinkedHashSet::•<core::int>();
+  } =>#t83, block {
+    final core::Set<core::int> #t86 = new col::_CompactLinkedHashSet::•<core::int>();
     for (core::int i = 0; i.{core::num::<}(42); i = i.{core::num::+}(1)) {
-      final core::Iterable<dynamic>? #t88 = a;
-      if(!#t88.{core::Object::==}(null)) {
-        core::Iterator<dynamic> :sync-for-iterator = #t88{core::Iterable<dynamic>}.{core::Iterable::iterator};
+      final core::Iterable<dynamic>? #t87 = a;
+      if(!#t87.{core::Object::==}(null)) {
+        core::Iterator<dynamic> :sync-for-iterator = #t87{core::Iterable<dynamic>}.{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final dynamic #t89 = :sync-for-iterator.{core::Iterator::current};
+          final dynamic #t88 = :sync-for-iterator.{core::Iterator::current};
           {
-            final core::int #t90 = #t89 as{TypeError,ForNonNullableByDefault} core::int;
-            #t87.{core::Set::add}(#t90);
+            final core::int #t89 = #t88 as{TypeError,ForNonNullableByDefault} core::int;
+            #t86.{core::Set::add}{Invariant}(#t89);
           }
         }
       }
     }
-  } =>#t87, block {
-    final core::Set<core::int> #t91 = new col::_CompactLinkedHashSet::•<core::int>();
+  } =>#t86, block {
+    final core::Set<core::int> #t90 = new col::_CompactLinkedHashSet::•<core::int>();
     for (core::int i = 0; i.{core::num::<}(42); i = i.{core::num::+}(1)) {
-      final core::Iterable<dynamic>? #t92 = b;
-      if(!#t92.{core::Object::==}(null)) {
-        core::Iterator<dynamic> :sync-for-iterator = #t92{core::Iterable<dynamic>}.{core::Iterable::iterator};
+      final core::Iterable<dynamic>? #t91 = b;
+      if(!#t91.{core::Object::==}(null)) {
+        core::Iterator<dynamic> :sync-for-iterator = #t91{core::Iterable<dynamic>}.{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final dynamic #t93 = :sync-for-iterator.{core::Iterator::current};
+          final dynamic #t92 = :sync-for-iterator.{core::Iterator::current};
           {
-            final core::int #t94 = #t93 as{TypeError,ForNonNullableByDefault} core::int;
-            #t91.{core::Set::add}(#t94);
+            final core::int #t93 = #t92 as{TypeError,ForNonNullableByDefault} core::int;
+            #t90.{core::Set::add}{Invariant}(#t93);
           }
         }
       }
     }
-  } =>#t91, block {
-    final core::Set<core::int> #t95 = new col::_CompactLinkedHashSet::•<core::int>();
+  } =>#t90, block {
+    final core::Set<core::int> #t94 = new col::_CompactLinkedHashSet::•<core::int>();
     for (core::int i = 0; i.{core::num::<}(42); i = i.{core::num::+}(1)) {
-      final core::Iterable<dynamic>? #t96 = c;
-      if(!#t96.{core::Object::==}(null)) {
-        core::Iterator<dynamic> :sync-for-iterator = #t96{core::Iterable<dynamic>}.{core::Iterable::iterator};
+      final core::Iterable<dynamic>? #t95 = c;
+      if(!#t95.{core::Object::==}(null)) {
+        core::Iterator<dynamic> :sync-for-iterator = #t95{core::Iterable<dynamic>}.{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final dynamic #t97 = :sync-for-iterator.{core::Iterator::current};
+          final dynamic #t96 = :sync-for-iterator.{core::Iterator::current};
           {
-            final core::int #t98 = #t97 as{TypeError,ForNonNullableByDefault} core::int;
-            #t95.{core::Set::add}(#t98);
+            final core::int #t97 = #t96 as{TypeError,ForNonNullableByDefault} core::int;
+            #t94.{core::Set::add}{Invariant}(#t97);
           }
         }
       }
     }
-  } =>#t95, block {
-    final core::Map<core::int, core::int> #t99 = <core::int, core::int>{};
+  } =>#t94, block {
+    final core::Map<core::int, core::int> #t98 = <core::int, core::int>{};
     for (core::int i = 0; i.{core::num::<}(42); i = i.{core::num::+}(1)) {
-      final core::Map<core::int, core::int>? #t100 = d;
-      if(!#t100.{core::Object::==}(null)) {
-        core::Iterator<core::MapEntry<core::int, core::int>> :sync-for-iterator = #t100{core::Map<core::int, core::int>}.{core::Map::entries}.{core::Iterable::iterator};
+      final core::Map<core::int, core::int>? #t99 = d;
+      if(!#t99.{core::Object::==}(null)) {
+        core::Iterator<core::MapEntry<core::int, core::int>> :sync-for-iterator = #t99{core::Map<core::int, core::int>}.{core::Map::entries}.{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final core::MapEntry<core::int, core::int> #t101 = :sync-for-iterator.{core::Iterator::current};
-          #t99.{core::Map::[]=}(#t101.{core::MapEntry::key}, #t101.{core::MapEntry::value});
+          final core::MapEntry<core::int, core::int> #t100 = :sync-for-iterator.{core::Iterator::current};
+          #t98.{core::Map::[]=}{Invariant}(#t100.{core::MapEntry::key}, #t100.{core::MapEntry::value});
         }
       }
     }
-  } =>#t99];
+  } =>#t98];
 }
 static method bar<X extends core::List<core::int>? = core::List<core::int>?, Y extends core::Set<core::int>? = core::Set<core::int>?, Z extends core::Iterable<core::int>? = core::Iterable<core::int>?, W extends core::Map<core::int, core::int>? = core::Map<core::int, core::int>?>(core::bool condition, core::Iterable<dynamic> iterable, self::bar::X% x, self::bar::Y% y, self::bar::Z% z, self::bar::W% w) → dynamic {
   return <core::Object>[ block {
-    final core::Set<core::int> #t102 = new col::_CompactLinkedHashSet::•<core::int>();
-    for (final dynamic #t103 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:50:9: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+    final core::Set<core::int> #t101 = new col::_CompactLinkedHashSet::•<core::int>();
+    for (final dynamic #t102 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:50:9: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {...x}, // Error.
         ^") {
-      final core::int #t104 = #t103 as{TypeError,ForNonNullableByDefault} core::int;
-      #t102.{core::Set::add}(#t104);
+      final core::int #t103 = #t102 as{TypeError,ForNonNullableByDefault} core::int;
+      #t101.{core::Set::add}{Invariant}(#t103);
     }
-  } =>#t102, block {
-    final core::Set<core::int> #t105 = new col::_CompactLinkedHashSet::•<core::int>();
-    for (final dynamic #t106 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:51:9: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+  } =>#t101, block {
+    final core::Set<core::int> #t104 = new col::_CompactLinkedHashSet::•<core::int>();
+    for (final dynamic #t105 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:51:9: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {...y}, // Error.
         ^") {
-      final core::int #t107 = #t106 as{TypeError,ForNonNullableByDefault} core::int;
-      #t105.{core::Set::add}(#t107);
+      final core::int #t106 = #t105 as{TypeError,ForNonNullableByDefault} core::int;
+      #t104.{core::Set::add}{Invariant}(#t106);
     }
-  } =>#t105, block {
-    final core::Set<core::int> #t108 = new col::_CompactLinkedHashSet::•<core::int>();
-    for (final dynamic #t109 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:52:9: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+  } =>#t104, block {
+    final core::Set<core::int> #t107 = new col::_CompactLinkedHashSet::•<core::int>();
+    for (final dynamic #t108 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:52:9: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {...z}, // Error.
         ^") {
-      final core::int #t110 = #t109 as{TypeError,ForNonNullableByDefault} core::int;
-      #t108.{core::Set::add}(#t110);
+      final core::int #t109 = #t108 as{TypeError,ForNonNullableByDefault} core::int;
+      #t107.{core::Set::add}{Invariant}(#t109);
     }
-  } =>#t108, <core::int, core::int>{invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:53:9: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+  } =>#t107, <core::int, core::int>{invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:53:9: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {...w}, // Error.
         ^": null}, <core::int, core::int>{invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:54:19: Error: Unexpected type 'X' of a map spread entry.  Expected 'dynamic' or a Map.
     <int, int>{...x}, // Error.
-                  ^": null}, let final core::Set<core::int> #t111 = new col::_CompactLinkedHashSet::•<core::int>() in let final core::bool #t112 = #t111.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:55:14: Error: Unexpected type 'W' of a spread.  Expected 'dynamic' or an Iterable.
+                  ^": null}, block {
+    final core::Set<core::int> #t110 = new col::_CompactLinkedHashSet::•<core::int>();
+    #t110.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:55:14: Error: Unexpected type 'W' of a spread.  Expected 'dynamic' or an Iterable.
     <int>{...w}, // Error.
-             ^") in #t111, block {
-    final core::Set<core::int> #t113 = new col::_CompactLinkedHashSet::•<core::int>();
+             ^");
+  } =>#t110, block {
+    final core::Set<core::int> #t111 = new col::_CompactLinkedHashSet::•<core::int>();
     if(condition)
-      for (final dynamic #t114 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:56:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      for (final dynamic #t112 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:56:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {if (condition) ...x}, // Error.
                        ^") {
-        final core::int #t115 = #t114 as{TypeError,ForNonNullableByDefault} core::int;
-        #t113.{core::Set::add}(#t115);
+        final core::int #t113 = #t112 as{TypeError,ForNonNullableByDefault} core::int;
+        #t111.{core::Set::add}{Invariant}(#t113);
       }
-  } =>#t113, block {
-    final core::Set<core::int> #t116 = new col::_CompactLinkedHashSet::•<core::int>();
+  } =>#t111, block {
+    final core::Set<core::int> #t114 = new col::_CompactLinkedHashSet::•<core::int>();
     if(condition)
-      for (final dynamic #t117 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:57:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      for (final dynamic #t115 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:57:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {if (condition) ...y}, // Error.
                        ^") {
-        final core::int #t118 = #t117 as{TypeError,ForNonNullableByDefault} core::int;
-        #t116.{core::Set::add}(#t118);
+        final core::int #t116 = #t115 as{TypeError,ForNonNullableByDefault} core::int;
+        #t114.{core::Set::add}{Invariant}(#t116);
       }
-  } =>#t116, block {
-    final core::Set<core::int> #t119 = new col::_CompactLinkedHashSet::•<core::int>();
+  } =>#t114, block {
+    final core::Set<core::int> #t117 = new col::_CompactLinkedHashSet::•<core::int>();
     if(condition)
-      for (final dynamic #t120 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:58:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      for (final dynamic #t118 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:58:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {if (condition) ...z}, // Error.
                        ^") {
-        final core::int #t121 = #t120 as{TypeError,ForNonNullableByDefault} core::int;
-        #t119.{core::Set::add}(#t121);
+        final core::int #t119 = #t118 as{TypeError,ForNonNullableByDefault} core::int;
+        #t117.{core::Set::add}{Invariant}(#t119);
       }
-  } =>#t119, block {
-    final core::Map<core::int, core::int> #t122 = <core::int, core::int>{};
+  } =>#t117, block {
+    final core::Map<core::int, core::int> #t120 = <core::int, core::int>{};
     if(condition)
-      #t122.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:59:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      #t120.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:59:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {if (condition) ...w}, // Error.
                        ^", null);
-  } =>#t122, block {
-    final core::Set<core::int> #t123 = new col::_CompactLinkedHashSet::•<core::int>();
+  } =>#t120, block {
+    final core::Set<core::int> #t121 = new col::_CompactLinkedHashSet::•<core::int>();
     {
       core::Iterator<dynamic> :sync-for-iterator = iterable.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         dynamic e = :sync-for-iterator.{core::Iterator::current};
-        for (final dynamic #t124 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:60:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+        for (final dynamic #t122 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:60:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {for (dynamic e in iterable) ...x}, // Error.
                                     ^") {
-          final core::int #t125 = #t124 as{TypeError,ForNonNullableByDefault} core::int;
-          #t123.{core::Set::add}(#t125);
+          final core::int #t123 = #t122 as{TypeError,ForNonNullableByDefault} core::int;
+          #t121.{core::Set::add}{Invariant}(#t123);
         }
       }
     }
-  } =>#t123, block {
-    final core::Set<core::int> #t126 = new col::_CompactLinkedHashSet::•<core::int>();
+  } =>#t121, block {
+    final core::Set<core::int> #t124 = new col::_CompactLinkedHashSet::•<core::int>();
     {
       core::Iterator<dynamic> :sync-for-iterator = iterable.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         dynamic e = :sync-for-iterator.{core::Iterator::current};
-        for (final dynamic #t127 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:61:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+        for (final dynamic #t125 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:61:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {for (dynamic e in iterable) ...y}, // Error.
                                     ^") {
-          final core::int #t128 = #t127 as{TypeError,ForNonNullableByDefault} core::int;
-          #t126.{core::Set::add}(#t128);
+          final core::int #t126 = #t125 as{TypeError,ForNonNullableByDefault} core::int;
+          #t124.{core::Set::add}{Invariant}(#t126);
         }
       }
     }
-  } =>#t126, block {
-    final core::Set<core::int> #t129 = new col::_CompactLinkedHashSet::•<core::int>();
+  } =>#t124, block {
+    final core::Set<core::int> #t127 = new col::_CompactLinkedHashSet::•<core::int>();
     {
       core::Iterator<dynamic> :sync-for-iterator = iterable.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         dynamic e = :sync-for-iterator.{core::Iterator::current};
-        for (final dynamic #t130 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:62:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+        for (final dynamic #t128 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:62:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {for (dynamic e in iterable) ...z}, // Error.
                                     ^") {
-          final core::int #t131 = #t130 as{TypeError,ForNonNullableByDefault} core::int;
-          #t129.{core::Set::add}(#t131);
+          final core::int #t129 = #t128 as{TypeError,ForNonNullableByDefault} core::int;
+          #t127.{core::Set::add}{Invariant}(#t129);
         }
       }
     }
-  } =>#t129, block {
-    final core::Map<core::int, core::int> #t132 = <core::int, core::int>{};
+  } =>#t127, block {
+    final core::Map<core::int, core::int> #t130 = <core::int, core::int>{};
     {
       core::Iterator<dynamic> :sync-for-iterator = iterable.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         dynamic e = :sync-for-iterator.{core::Iterator::current};
-        #t132.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:63:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+        #t130.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:63:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {for (dynamic e in iterable) ...w}, // Error.
                                     ^", null);
       }
     }
-  } =>#t132, block {
-    final core::Set<core::int> #t133 = new col::_CompactLinkedHashSet::•<core::int>();
+  } =>#t130, block {
+    final core::Set<core::int> #t131 = new col::_CompactLinkedHashSet::•<core::int>();
     for (core::int i = 0; i.{core::num::<}(42); i = i.{core::num::+}(1))
-      for (final dynamic #t134 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:64:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      for (final dynamic #t132 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:64:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {for (int i = 0; i < 42; ++i) ...x}, // Error.
                                      ^") {
-        final core::int #t135 = #t134 as{TypeError,ForNonNullableByDefault} core::int;
-        #t133.{core::Set::add}(#t135);
+        final core::int #t133 = #t132 as{TypeError,ForNonNullableByDefault} core::int;
+        #t131.{core::Set::add}{Invariant}(#t133);
       }
-  } =>#t133, block {
-    final core::Set<core::int> #t136 = new col::_CompactLinkedHashSet::•<core::int>();
+  } =>#t131, block {
+    final core::Set<core::int> #t134 = new col::_CompactLinkedHashSet::•<core::int>();
     for (core::int i = 0; i.{core::num::<}(42); i = i.{core::num::+}(1))
-      for (final dynamic #t137 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:65:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      for (final dynamic #t135 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:65:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {for (int i = 0; i < 42; ++i) ...y}, // Error.
                                      ^") {
-        final core::int #t138 = #t137 as{TypeError,ForNonNullableByDefault} core::int;
-        #t136.{core::Set::add}(#t138);
+        final core::int #t136 = #t135 as{TypeError,ForNonNullableByDefault} core::int;
+        #t134.{core::Set::add}{Invariant}(#t136);
       }
-  } =>#t136, block {
-    final core::Set<core::int> #t139 = new col::_CompactLinkedHashSet::•<core::int>();
+  } =>#t134, block {
+    final core::Set<core::int> #t137 = new col::_CompactLinkedHashSet::•<core::int>();
     for (core::int i = 0; i.{core::num::<}(42); i = i.{core::num::+}(1))
-      for (final dynamic #t140 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:66:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      for (final dynamic #t138 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:66:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {for (int i = 0; i < 42; ++i) ...z}, // Error.
                                      ^") {
-        final core::int #t141 = #t140 as{TypeError,ForNonNullableByDefault} core::int;
-        #t139.{core::Set::add}(#t141);
+        final core::int #t139 = #t138 as{TypeError,ForNonNullableByDefault} core::int;
+        #t137.{core::Set::add}{Invariant}(#t139);
       }
-  } =>#t139, block {
-    final core::Map<core::int, core::int> #t142 = <core::int, core::int>{};
+  } =>#t137, block {
+    final core::Map<core::int, core::int> #t140 = <core::int, core::int>{};
     for (core::int i = 0; i.{core::num::<}(42); i = i.{core::num::+}(1))
-      #t142.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:67:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+      #t140.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:67:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
     {for (int i = 0; i < 42; ++i) ...w}, // Error.
                                      ^", null);
-  } =>#t142, block {
-    final core::Set<core::int> #t143 = new col::_CompactLinkedHashSet::•<core::int>();
-    final core::Iterable<dynamic>? #t144 = x;
-    if(!#t144.{core::Object::==}(null)) {
-      core::Iterator<dynamic> :sync-for-iterator = #t144{core::Iterable<dynamic>}.{core::Iterable::iterator};
+  } =>#t140, block {
+    final core::Set<core::int> #t141 = new col::_CompactLinkedHashSet::•<core::int>();
+    final core::Iterable<dynamic>? #t142 = x;
+    if(!#t142.{core::Object::==}(null)) {
+      core::Iterator<dynamic> :sync-for-iterator = #t142{core::Iterable<dynamic>}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final dynamic #t145 = :sync-for-iterator.{core::Iterator::current};
+        final dynamic #t143 = :sync-for-iterator.{core::Iterator::current};
         {
-          final core::int #t146 = #t145 as{TypeError,ForNonNullableByDefault} core::int;
-          #t143.{core::Set::add}(#t146);
+          final core::int #t144 = #t143 as{TypeError,ForNonNullableByDefault} core::int;
+          #t141.{core::Set::add}{Invariant}(#t144);
         }
       }
     }
-  } =>#t143, block {
-    final core::Set<core::int> #t147 = new col::_CompactLinkedHashSet::•<core::int>();
-    final core::Iterable<dynamic>? #t148 = y;
-    if(!#t148.{core::Object::==}(null)) {
-      core::Iterator<dynamic> :sync-for-iterator = #t148{core::Iterable<dynamic>}.{core::Iterable::iterator};
+  } =>#t141, block {
+    final core::Set<core::int> #t145 = new col::_CompactLinkedHashSet::•<core::int>();
+    final core::Iterable<dynamic>? #t146 = y;
+    if(!#t146.{core::Object::==}(null)) {
+      core::Iterator<dynamic> :sync-for-iterator = #t146{core::Iterable<dynamic>}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final dynamic #t149 = :sync-for-iterator.{core::Iterator::current};
+        final dynamic #t147 = :sync-for-iterator.{core::Iterator::current};
         {
-          final core::int #t150 = #t149 as{TypeError,ForNonNullableByDefault} core::int;
-          #t147.{core::Set::add}(#t150);
+          final core::int #t148 = #t147 as{TypeError,ForNonNullableByDefault} core::int;
+          #t145.{core::Set::add}{Invariant}(#t148);
         }
       }
     }
-  } =>#t147, block {
-    final core::Set<core::int> #t151 = new col::_CompactLinkedHashSet::•<core::int>();
-    final core::Iterable<dynamic>? #t152 = z;
-    if(!#t152.{core::Object::==}(null)) {
-      core::Iterator<dynamic> :sync-for-iterator = #t152{core::Iterable<dynamic>}.{core::Iterable::iterator};
+  } =>#t145, block {
+    final core::Set<core::int> #t149 = new col::_CompactLinkedHashSet::•<core::int>();
+    final core::Iterable<dynamic>? #t150 = z;
+    if(!#t150.{core::Object::==}(null)) {
+      core::Iterator<dynamic> :sync-for-iterator = #t150{core::Iterable<dynamic>}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final dynamic #t153 = :sync-for-iterator.{core::Iterator::current};
+        final dynamic #t151 = :sync-for-iterator.{core::Iterator::current};
         {
-          final core::int #t154 = #t153 as{TypeError,ForNonNullableByDefault} core::int;
-          #t151.{core::Set::add}(#t154);
+          final core::int #t152 = #t151 as{TypeError,ForNonNullableByDefault} core::int;
+          #t149.{core::Set::add}{Invariant}(#t152);
         }
       }
     }
-  } =>#t151, block {
-    final core::Map<core::int, core::int> #t155 = <core::int, core::int>{};
-    final core::Map<core::int, core::int>? #t156 = w;
-    if(!#t156.{core::Object::==}(null)) {
-      core::Iterator<core::MapEntry<core::int, core::int>> :sync-for-iterator = #t156{core::Map<core::int, core::int>}.{core::Map::entries}.{core::Iterable::iterator};
+  } =>#t149, block {
+    final core::Map<core::int, core::int> #t153 = <core::int, core::int>{};
+    final core::Map<core::int, core::int>? #t154 = w;
+    if(!#t154.{core::Object::==}(null)) {
+      core::Iterator<core::MapEntry<core::int, core::int>> :sync-for-iterator = #t154{core::Map<core::int, core::int>}.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final core::MapEntry<core::int, core::int> #t157 = :sync-for-iterator.{core::Iterator::current};
-        #t155.{core::Map::[]=}(#t157.{core::MapEntry::key}, #t157.{core::MapEntry::value});
+        final core::MapEntry<core::int, core::int> #t155 = :sync-for-iterator.{core::Iterator::current};
+        #t153.{core::Map::[]=}{Invariant}(#t155.{core::MapEntry::key}, #t155.{core::MapEntry::value});
       }
     }
-  } =>#t155, block {
-    final core::Set<core::int> #t158 = new col::_CompactLinkedHashSet::•<core::int>();
+  } =>#t153, block {
+    final core::Set<core::int> #t156 = new col::_CompactLinkedHashSet::•<core::int>();
     if(condition) {
-      final core::Iterable<dynamic>? #t159 = x;
-      if(!#t159.{core::Object::==}(null)) {
-        core::Iterator<dynamic> :sync-for-iterator = #t159{core::Iterable<dynamic>}.{core::Iterable::iterator};
+      final core::Iterable<dynamic>? #t157 = x;
+      if(!#t157.{core::Object::==}(null)) {
+        core::Iterator<dynamic> :sync-for-iterator = #t157{core::Iterable<dynamic>}.{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final dynamic #t160 = :sync-for-iterator.{core::Iterator::current};
+          final dynamic #t158 = :sync-for-iterator.{core::Iterator::current};
           {
-            final core::int #t161 = #t160 as{TypeError,ForNonNullableByDefault} core::int;
-            #t158.{core::Set::add}(#t161);
+            final core::int #t159 = #t158 as{TypeError,ForNonNullableByDefault} core::int;
+            #t156.{core::Set::add}{Invariant}(#t159);
           }
         }
       }
     }
-  } =>#t158, block {
-    final core::Set<core::int> #t162 = new col::_CompactLinkedHashSet::•<core::int>();
+  } =>#t156, block {
+    final core::Set<core::int> #t160 = new col::_CompactLinkedHashSet::•<core::int>();
     if(condition) {
-      final core::Iterable<dynamic>? #t163 = y;
-      if(!#t163.{core::Object::==}(null)) {
-        core::Iterator<dynamic> :sync-for-iterator = #t163{core::Iterable<dynamic>}.{core::Iterable::iterator};
+      final core::Iterable<dynamic>? #t161 = y;
+      if(!#t161.{core::Object::==}(null)) {
+        core::Iterator<dynamic> :sync-for-iterator = #t161{core::Iterable<dynamic>}.{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final dynamic #t164 = :sync-for-iterator.{core::Iterator::current};
+          final dynamic #t162 = :sync-for-iterator.{core::Iterator::current};
           {
-            final core::int #t165 = #t164 as{TypeError,ForNonNullableByDefault} core::int;
-            #t162.{core::Set::add}(#t165);
+            final core::int #t163 = #t162 as{TypeError,ForNonNullableByDefault} core::int;
+            #t160.{core::Set::add}{Invariant}(#t163);
           }
         }
       }
     }
-  } =>#t162, block {
-    final core::Set<core::int> #t166 = new col::_CompactLinkedHashSet::•<core::int>();
+  } =>#t160, block {
+    final core::Set<core::int> #t164 = new col::_CompactLinkedHashSet::•<core::int>();
     if(condition) {
-      final core::Iterable<dynamic>? #t167 = z;
-      if(!#t167.{core::Object::==}(null)) {
-        core::Iterator<dynamic> :sync-for-iterator = #t167{core::Iterable<dynamic>}.{core::Iterable::iterator};
+      final core::Iterable<dynamic>? #t165 = z;
+      if(!#t165.{core::Object::==}(null)) {
+        core::Iterator<dynamic> :sync-for-iterator = #t165{core::Iterable<dynamic>}.{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final dynamic #t168 = :sync-for-iterator.{core::Iterator::current};
+          final dynamic #t166 = :sync-for-iterator.{core::Iterator::current};
           {
-            final core::int #t169 = #t168 as{TypeError,ForNonNullableByDefault} core::int;
-            #t166.{core::Set::add}(#t169);
+            final core::int #t167 = #t166 as{TypeError,ForNonNullableByDefault} core::int;
+            #t164.{core::Set::add}{Invariant}(#t167);
           }
         }
       }
     }
-  } =>#t166, block {
-    final core::Map<core::int, core::int> #t170 = <core::int, core::int>{};
+  } =>#t164, block {
+    final core::Map<core::int, core::int> #t168 = <core::int, core::int>{};
     if(condition) {
-      final core::Map<core::int, core::int>? #t171 = w;
-      if(!#t171.{core::Object::==}(null)) {
-        core::Iterator<core::MapEntry<core::int, core::int>> :sync-for-iterator = #t171{core::Map<core::int, core::int>}.{core::Map::entries}.{core::Iterable::iterator};
+      final core::Map<core::int, core::int>? #t169 = w;
+      if(!#t169.{core::Object::==}(null)) {
+        core::Iterator<core::MapEntry<core::int, core::int>> :sync-for-iterator = #t169{core::Map<core::int, core::int>}.{core::Map::entries}.{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final core::MapEntry<core::int, core::int> #t172 = :sync-for-iterator.{core::Iterator::current};
-          #t170.{core::Map::[]=}(#t172.{core::MapEntry::key}, #t172.{core::MapEntry::value});
+          final core::MapEntry<core::int, core::int> #t170 = :sync-for-iterator.{core::Iterator::current};
+          #t168.{core::Map::[]=}{Invariant}(#t170.{core::MapEntry::key}, #t170.{core::MapEntry::value});
         }
       }
     }
-  } =>#t170, block {
-    final core::Set<core::int> #t173 = new col::_CompactLinkedHashSet::•<core::int>();
+  } =>#t168, block {
+    final core::Set<core::int> #t171 = new col::_CompactLinkedHashSet::•<core::int>();
     {
       core::Iterator<dynamic> :sync-for-iterator = iterable.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         dynamic e = :sync-for-iterator.{core::Iterator::current};
         {
-          final core::Iterable<dynamic>? #t174 = x;
-          if(!#t174.{core::Object::==}(null)) {
-            core::Iterator<dynamic> :sync-for-iterator = #t174{core::Iterable<dynamic>}.{core::Iterable::iterator};
+          final core::Iterable<dynamic>? #t172 = x;
+          if(!#t172.{core::Object::==}(null)) {
+            core::Iterator<dynamic> :sync-for-iterator = #t172{core::Iterable<dynamic>}.{core::Iterable::iterator};
             for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-              final dynamic #t175 = :sync-for-iterator.{core::Iterator::current};
+              final dynamic #t173 = :sync-for-iterator.{core::Iterator::current};
               {
-                final core::int #t176 = #t175 as{TypeError,ForNonNullableByDefault} core::int;
-                #t173.{core::Set::add}(#t176);
+                final core::int #t174 = #t173 as{TypeError,ForNonNullableByDefault} core::int;
+                #t171.{core::Set::add}{Invariant}(#t174);
               }
             }
           }
         }
       }
     }
-  } =>#t173, block {
-    final core::Set<core::int> #t177 = new col::_CompactLinkedHashSet::•<core::int>();
+  } =>#t171, block {
+    final core::Set<core::int> #t175 = new col::_CompactLinkedHashSet::•<core::int>();
     {
       core::Iterator<dynamic> :sync-for-iterator = iterable.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         dynamic e = :sync-for-iterator.{core::Iterator::current};
         {
-          final core::Iterable<dynamic>? #t178 = y;
-          if(!#t178.{core::Object::==}(null)) {
-            core::Iterator<dynamic> :sync-for-iterator = #t178{core::Iterable<dynamic>}.{core::Iterable::iterator};
+          final core::Iterable<dynamic>? #t176 = y;
+          if(!#t176.{core::Object::==}(null)) {
+            core::Iterator<dynamic> :sync-for-iterator = #t176{core::Iterable<dynamic>}.{core::Iterable::iterator};
             for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-              final dynamic #t179 = :sync-for-iterator.{core::Iterator::current};
+              final dynamic #t177 = :sync-for-iterator.{core::Iterator::current};
               {
-                final core::int #t180 = #t179 as{TypeError,ForNonNullableByDefault} core::int;
-                #t177.{core::Set::add}(#t180);
+                final core::int #t178 = #t177 as{TypeError,ForNonNullableByDefault} core::int;
+                #t175.{core::Set::add}{Invariant}(#t178);
               }
             }
           }
         }
       }
     }
-  } =>#t177, block {
-    final core::Set<core::int> #t181 = new col::_CompactLinkedHashSet::•<core::int>();
+  } =>#t175, block {
+    final core::Set<core::int> #t179 = new col::_CompactLinkedHashSet::•<core::int>();
     {
       core::Iterator<dynamic> :sync-for-iterator = iterable.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         dynamic e = :sync-for-iterator.{core::Iterator::current};
         {
-          final core::Iterable<dynamic>? #t182 = z;
-          if(!#t182.{core::Object::==}(null)) {
-            core::Iterator<dynamic> :sync-for-iterator = #t182{core::Iterable<dynamic>}.{core::Iterable::iterator};
+          final core::Iterable<dynamic>? #t180 = z;
+          if(!#t180.{core::Object::==}(null)) {
+            core::Iterator<dynamic> :sync-for-iterator = #t180{core::Iterable<dynamic>}.{core::Iterable::iterator};
             for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-              final dynamic #t183 = :sync-for-iterator.{core::Iterator::current};
+              final dynamic #t181 = :sync-for-iterator.{core::Iterator::current};
               {
-                final core::int #t184 = #t183 as{TypeError,ForNonNullableByDefault} core::int;
-                #t181.{core::Set::add}(#t184);
+                final core::int #t182 = #t181 as{TypeError,ForNonNullableByDefault} core::int;
+                #t179.{core::Set::add}{Invariant}(#t182);
               }
             }
           }
         }
       }
     }
-  } =>#t181, block {
-    final core::Map<core::int, core::int> #t185 = <core::int, core::int>{};
+  } =>#t179, block {
+    final core::Map<core::int, core::int> #t183 = <core::int, core::int>{};
     {
       core::Iterator<dynamic> :sync-for-iterator = iterable.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         dynamic e = :sync-for-iterator.{core::Iterator::current};
         {
-          final core::Map<core::int, core::int>? #t186 = w;
-          if(!#t186.{core::Object::==}(null)) {
-            core::Iterator<core::MapEntry<core::int, core::int>> :sync-for-iterator = #t186{core::Map<core::int, core::int>}.{core::Map::entries}.{core::Iterable::iterator};
+          final core::Map<core::int, core::int>? #t184 = w;
+          if(!#t184.{core::Object::==}(null)) {
+            core::Iterator<core::MapEntry<core::int, core::int>> :sync-for-iterator = #t184{core::Map<core::int, core::int>}.{core::Map::entries}.{core::Iterable::iterator};
             for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-              final core::MapEntry<core::int, core::int> #t187 = :sync-for-iterator.{core::Iterator::current};
-              #t185.{core::Map::[]=}(#t187.{core::MapEntry::key}, #t187.{core::MapEntry::value});
+              final core::MapEntry<core::int, core::int> #t185 = :sync-for-iterator.{core::Iterator::current};
+              #t183.{core::Map::[]=}{Invariant}(#t185.{core::MapEntry::key}, #t185.{core::MapEntry::value});
             }
           }
         }
       }
     }
-  } =>#t185, block {
-    final core::Set<core::int> #t188 = new col::_CompactLinkedHashSet::•<core::int>();
+  } =>#t183, block {
+    final core::Set<core::int> #t186 = new col::_CompactLinkedHashSet::•<core::int>();
     for (core::int i = 0; i.{core::num::<}(42); i = i.{core::num::+}(1)) {
-      final core::Iterable<dynamic>? #t189 = x;
-      if(!#t189.{core::Object::==}(null)) {
-        core::Iterator<dynamic> :sync-for-iterator = #t189{core::Iterable<dynamic>}.{core::Iterable::iterator};
+      final core::Iterable<dynamic>? #t187 = x;
+      if(!#t187.{core::Object::==}(null)) {
+        core::Iterator<dynamic> :sync-for-iterator = #t187{core::Iterable<dynamic>}.{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final dynamic #t190 = :sync-for-iterator.{core::Iterator::current};
+          final dynamic #t188 = :sync-for-iterator.{core::Iterator::current};
           {
-            final core::int #t191 = #t190 as{TypeError,ForNonNullableByDefault} core::int;
-            #t188.{core::Set::add}(#t191);
+            final core::int #t189 = #t188 as{TypeError,ForNonNullableByDefault} core::int;
+            #t186.{core::Set::add}{Invariant}(#t189);
           }
         }
       }
     }
-  } =>#t188, block {
-    final core::Set<core::int> #t192 = new col::_CompactLinkedHashSet::•<core::int>();
+  } =>#t186, block {
+    final core::Set<core::int> #t190 = new col::_CompactLinkedHashSet::•<core::int>();
     for (core::int i = 0; i.{core::num::<}(42); i = i.{core::num::+}(1)) {
-      final core::Iterable<dynamic>? #t193 = y;
-      if(!#t193.{core::Object::==}(null)) {
-        core::Iterator<dynamic> :sync-for-iterator = #t193{core::Iterable<dynamic>}.{core::Iterable::iterator};
+      final core::Iterable<dynamic>? #t191 = y;
+      if(!#t191.{core::Object::==}(null)) {
+        core::Iterator<dynamic> :sync-for-iterator = #t191{core::Iterable<dynamic>}.{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final dynamic #t194 = :sync-for-iterator.{core::Iterator::current};
+          final dynamic #t192 = :sync-for-iterator.{core::Iterator::current};
           {
-            final core::int #t195 = #t194 as{TypeError,ForNonNullableByDefault} core::int;
-            #t192.{core::Set::add}(#t195);
+            final core::int #t193 = #t192 as{TypeError,ForNonNullableByDefault} core::int;
+            #t190.{core::Set::add}{Invariant}(#t193);
           }
         }
       }
     }
-  } =>#t192, block {
-    final core::Set<core::int> #t196 = new col::_CompactLinkedHashSet::•<core::int>();
+  } =>#t190, block {
+    final core::Set<core::int> #t194 = new col::_CompactLinkedHashSet::•<core::int>();
     for (core::int i = 0; i.{core::num::<}(42); i = i.{core::num::+}(1)) {
-      final core::Iterable<dynamic>? #t197 = z;
-      if(!#t197.{core::Object::==}(null)) {
-        core::Iterator<dynamic> :sync-for-iterator = #t197{core::Iterable<dynamic>}.{core::Iterable::iterator};
+      final core::Iterable<dynamic>? #t195 = z;
+      if(!#t195.{core::Object::==}(null)) {
+        core::Iterator<dynamic> :sync-for-iterator = #t195{core::Iterable<dynamic>}.{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final dynamic #t198 = :sync-for-iterator.{core::Iterator::current};
+          final dynamic #t196 = :sync-for-iterator.{core::Iterator::current};
           {
-            final core::int #t199 = #t198 as{TypeError,ForNonNullableByDefault} core::int;
-            #t196.{core::Set::add}(#t199);
+            final core::int #t197 = #t196 as{TypeError,ForNonNullableByDefault} core::int;
+            #t194.{core::Set::add}{Invariant}(#t197);
           }
         }
       }
     }
-  } =>#t196, block {
-    final core::Map<core::int, core::int> #t200 = <core::int, core::int>{};
+  } =>#t194, block {
+    final core::Map<core::int, core::int> #t198 = <core::int, core::int>{};
     for (core::int i = 0; i.{core::num::<}(42); i = i.{core::num::+}(1)) {
-      final core::Map<core::int, core::int>? #t201 = w;
-      if(!#t201.{core::Object::==}(null)) {
-        core::Iterator<core::MapEntry<core::int, core::int>> :sync-for-iterator = #t201{core::Map<core::int, core::int>}.{core::Map::entries}.{core::Iterable::iterator};
+      final core::Map<core::int, core::int>? #t199 = w;
+      if(!#t199.{core::Object::==}(null)) {
+        core::Iterator<core::MapEntry<core::int, core::int>> :sync-for-iterator = #t199{core::Map<core::int, core::int>}.{core::Map::entries}.{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-          final core::MapEntry<core::int, core::int> #t202 = :sync-for-iterator.{core::Iterator::current};
-          #t200.{core::Map::[]=}(#t202.{core::MapEntry::key}, #t202.{core::MapEntry::value});
+          final core::MapEntry<core::int, core::int> #t200 = :sync-for-iterator.{core::Iterator::current};
+          #t198.{core::Map::[]=}{Invariant}(#t200.{core::MapEntry::key}, #t200.{core::MapEntry::value});
         }
       }
     }
-  } =>#t200];
+  } =>#t198];
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue43591.dart b/pkg/front_end/testcases/nnbd/issue43591.dart
new file mode 100644
index 0000000..f845be9
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43591.dart
@@ -0,0 +1,26 @@
+// Copyright (c) 2020, 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.
+
+extension E<T> on T {
+  T Function(T) get f => (T t) => t;
+}
+
+method1<S>(S s) {
+  S Function(S) f = s.f;
+}
+
+method2<S extends dynamic>(S s) {
+  throws(() => s.f);
+}
+
+main() {}
+
+throws(void Function() f) {
+  try {
+    f();
+  } catch (e) {
+    return;
+  }
+  throw 'Expected exception';
+}
diff --git a/pkg/front_end/testcases/nnbd/issue43591.dart.outline.expect b/pkg/front_end/testcases/nnbd/issue43591.dart.outline.expect
new file mode 100644
index 0000000..dbf8690
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43591.dart.outline.expect
@@ -0,0 +1,17 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+extension E<T extends core::Object? = dynamic> on T% {
+  get f = self::E|get#f;
+}
+static method E|get#f<T extends core::Object? = dynamic>(final self::E|get#f::T% #this) → (self::E|get#f::T%) → self::E|get#f::T%
+  ;
+static method method1<S extends core::Object? = dynamic>(self::method1::S% s) → dynamic
+  ;
+static method method2<S extends dynamic = dynamic>(self::method2::S% s) → dynamic
+  ;
+static method main() → dynamic
+  ;
+static method throws(() → void f) → dynamic
+  ;
diff --git a/pkg/front_end/testcases/nnbd/issue43591.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue43591.dart.strong.expect
new file mode 100644
index 0000000..aae95d4
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43591.dart.strong.expect
@@ -0,0 +1,25 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+extension E<T extends core::Object? = dynamic> on T% {
+  get f = self::E|get#f;
+}
+static method E|get#f<T extends core::Object? = dynamic>(final self::E|get#f::T% #this) → (self::E|get#f::T%) → self::E|get#f::T%
+  return (self::E|get#f::T% t) → self::E|get#f::T% => t;
+static method method1<S extends core::Object? = dynamic>(self::method1::S% s) → dynamic {
+  (self::method1::S%) → self::method1::S% f = self::E|get#f<self::method1::S%>(s);
+}
+static method method2<S extends dynamic = dynamic>(self::method2::S% s) → dynamic {
+  self::throws(() → void => s.f);
+}
+static method main() → dynamic {}
+static method throws(() → void f) → dynamic {
+  try {
+    f.call();
+  }
+  on core::Object catch(final core::Object e) {
+    return;
+  }
+  throw "Expected exception";
+}
diff --git a/pkg/front_end/testcases/nnbd/issue43591.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue43591.dart.strong.transformed.expect
new file mode 100644
index 0000000..aae95d4
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43591.dart.strong.transformed.expect
@@ -0,0 +1,25 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+extension E<T extends core::Object? = dynamic> on T% {
+  get f = self::E|get#f;
+}
+static method E|get#f<T extends core::Object? = dynamic>(final self::E|get#f::T% #this) → (self::E|get#f::T%) → self::E|get#f::T%
+  return (self::E|get#f::T% t) → self::E|get#f::T% => t;
+static method method1<S extends core::Object? = dynamic>(self::method1::S% s) → dynamic {
+  (self::method1::S%) → self::method1::S% f = self::E|get#f<self::method1::S%>(s);
+}
+static method method2<S extends dynamic = dynamic>(self::method2::S% s) → dynamic {
+  self::throws(() → void => s.f);
+}
+static method main() → dynamic {}
+static method throws(() → void f) → dynamic {
+  try {
+    f.call();
+  }
+  on core::Object catch(final core::Object e) {
+    return;
+  }
+  throw "Expected exception";
+}
diff --git a/pkg/front_end/testcases/nnbd/issue43591.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd/issue43591.dart.textual_outline.expect
new file mode 100644
index 0000000..eb34b94
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43591.dart.textual_outline.expect
@@ -0,0 +1,6 @@
+extension E<T> (){}
+on T (){}
+method1<S>(S s) {}
+method2<S extends dynamic>(S s) {}
+main() {}
+throws(void Function() f) {}
diff --git a/pkg/front_end/testcases/nnbd/issue43591.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue43591.dart.weak.expect
new file mode 100644
index 0000000..aae95d4
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43591.dart.weak.expect
@@ -0,0 +1,25 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+extension E<T extends core::Object? = dynamic> on T% {
+  get f = self::E|get#f;
+}
+static method E|get#f<T extends core::Object? = dynamic>(final self::E|get#f::T% #this) → (self::E|get#f::T%) → self::E|get#f::T%
+  return (self::E|get#f::T% t) → self::E|get#f::T% => t;
+static method method1<S extends core::Object? = dynamic>(self::method1::S% s) → dynamic {
+  (self::method1::S%) → self::method1::S% f = self::E|get#f<self::method1::S%>(s);
+}
+static method method2<S extends dynamic = dynamic>(self::method2::S% s) → dynamic {
+  self::throws(() → void => s.f);
+}
+static method main() → dynamic {}
+static method throws(() → void f) → dynamic {
+  try {
+    f.call();
+  }
+  on core::Object catch(final core::Object e) {
+    return;
+  }
+  throw "Expected exception";
+}
diff --git a/pkg/front_end/testcases/nnbd/issue43591.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue43591.dart.weak.transformed.expect
new file mode 100644
index 0000000..aae95d4
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43591.dart.weak.transformed.expect
@@ -0,0 +1,25 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+extension E<T extends core::Object? = dynamic> on T% {
+  get f = self::E|get#f;
+}
+static method E|get#f<T extends core::Object? = dynamic>(final self::E|get#f::T% #this) → (self::E|get#f::T%) → self::E|get#f::T%
+  return (self::E|get#f::T% t) → self::E|get#f::T% => t;
+static method method1<S extends core::Object? = dynamic>(self::method1::S% s) → dynamic {
+  (self::method1::S%) → self::method1::S% f = self::E|get#f<self::method1::S%>(s);
+}
+static method method2<S extends dynamic = dynamic>(self::method2::S% s) → dynamic {
+  self::throws(() → void => s.f);
+}
+static method main() → dynamic {}
+static method throws(() → void f) → dynamic {
+  try {
+    f.call();
+  }
+  on core::Object catch(final core::Object e) {
+    return;
+  }
+  throw "Expected exception";
+}
diff --git a/pkg/front_end/testcases/nnbd/issue43689.dart b/pkg/front_end/testcases/nnbd/issue43689.dart
new file mode 100644
index 0000000..20737ba
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43689.dart
@@ -0,0 +1,15 @@
+// Copyright (c) 2020, 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.
+
+late final int y;
+late final int? y;
+
+test() {
+  late final int x;
+  late final int? x;
+  int z;
+  int? z;
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/issue43689.dart.outline.expect b/pkg/front_end/testcases/nnbd/issue43689.dart.outline.expect
new file mode 100644
index 0000000..35b1c6f
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43689.dart.outline.expect
@@ -0,0 +1,19 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue43689.dart:6:17: Error: 'y' is already declared in this scope.
+// late final int? y;
+//                 ^
+// pkg/front_end/testcases/nnbd/issue43689.dart:5:16: Context: Previous declaration of 'y'.
+// late final int y;
+//                ^
+//
+import self as self;
+import "dart:core" as core;
+
+late static final field core::int y;
+static method test() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/nnbd/issue43689.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue43689.dart.strong.expect
new file mode 100644
index 0000000..64c8656
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43689.dart.strong.expect
@@ -0,0 +1,40 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue43689.dart:6:17: Error: 'y' is already declared in this scope.
+// late final int? y;
+//                 ^
+// pkg/front_end/testcases/nnbd/issue43689.dart:5:16: Context: Previous declaration of 'y'.
+// late final int y;
+//                ^
+//
+// pkg/front_end/testcases/nnbd/issue43689.dart:10:19: Error: 'x' is already declared in this scope.
+//   late final int? x;
+//                   ^
+// pkg/front_end/testcases/nnbd/issue43689.dart:9:18: Context: Previous declaration of 'x'.
+//   late final int x;
+//                  ^
+//
+// pkg/front_end/testcases/nnbd/issue43689.dart:12:8: Error: 'z' is already declared in this scope.
+//   int? z;
+//        ^
+// pkg/front_end/testcases/nnbd/issue43689.dart:11:7: Context: Previous declaration of 'z'.
+//   int z;
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+late static final field core::int y;
+static method test() → dynamic {
+  late final core::int x;
+  late final core::int? x = invalid-expression "pkg/front_end/testcases/nnbd/issue43689.dart:10:19: Error: 'x' is already declared in this scope.
+  late final int? x;
+                  ^" as{TypeError,ForDynamic,ForNonNullableByDefault} core::int?;
+  core::int z;
+  core::int? z = invalid-expression "pkg/front_end/testcases/nnbd/issue43689.dart:12:8: Error: 'z' is already declared in this scope.
+  int? z;
+       ^" as{TypeError,ForDynamic,ForNonNullableByDefault} core::int?;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue43689.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue43689.dart.strong.transformed.expect
new file mode 100644
index 0000000..4d8f37a
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43689.dart.strong.transformed.expect
@@ -0,0 +1,42 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue43689.dart:6:17: Error: 'y' is already declared in this scope.
+// late final int? y;
+//                 ^
+// pkg/front_end/testcases/nnbd/issue43689.dart:5:16: Context: Previous declaration of 'y'.
+// late final int y;
+//                ^
+//
+// pkg/front_end/testcases/nnbd/issue43689.dart:10:19: Error: 'x' is already declared in this scope.
+//   late final int? x;
+//                   ^
+// pkg/front_end/testcases/nnbd/issue43689.dart:9:18: Context: Previous declaration of 'x'.
+//   late final int x;
+//                  ^
+//
+// pkg/front_end/testcases/nnbd/issue43689.dart:12:8: Error: 'z' is already declared in this scope.
+//   int? z;
+//        ^
+// pkg/front_end/testcases/nnbd/issue43689.dart:11:7: Context: Previous declaration of 'z'.
+//   int z;
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+late static final field core::int y;
+static method test() → dynamic {
+  late final core::int x;
+  function #x#initializer() → core::int?
+    return invalid-expression "pkg/front_end/testcases/nnbd/issue43689.dart:10:19: Error: 'x' is already declared in this scope.
+  late final int? x;
+                  ^";
+  late final core::int? x = #x#initializer.call();
+  core::int z;
+  core::int? z = invalid-expression "pkg/front_end/testcases/nnbd/issue43689.dart:12:8: Error: 'z' is already declared in this scope.
+  int? z;
+       ^";
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue43689.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd/issue43689.dart.textual_outline.expect
new file mode 100644
index 0000000..efaf61b
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43689.dart.textual_outline.expect
@@ -0,0 +1,6 @@
+late ;
+final int y;
+late ;
+final int? y;
+test() {}
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/issue43689.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue43689.dart.weak.expect
new file mode 100644
index 0000000..64c8656
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43689.dart.weak.expect
@@ -0,0 +1,40 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue43689.dart:6:17: Error: 'y' is already declared in this scope.
+// late final int? y;
+//                 ^
+// pkg/front_end/testcases/nnbd/issue43689.dart:5:16: Context: Previous declaration of 'y'.
+// late final int y;
+//                ^
+//
+// pkg/front_end/testcases/nnbd/issue43689.dart:10:19: Error: 'x' is already declared in this scope.
+//   late final int? x;
+//                   ^
+// pkg/front_end/testcases/nnbd/issue43689.dart:9:18: Context: Previous declaration of 'x'.
+//   late final int x;
+//                  ^
+//
+// pkg/front_end/testcases/nnbd/issue43689.dart:12:8: Error: 'z' is already declared in this scope.
+//   int? z;
+//        ^
+// pkg/front_end/testcases/nnbd/issue43689.dart:11:7: Context: Previous declaration of 'z'.
+//   int z;
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+late static final field core::int y;
+static method test() → dynamic {
+  late final core::int x;
+  late final core::int? x = invalid-expression "pkg/front_end/testcases/nnbd/issue43689.dart:10:19: Error: 'x' is already declared in this scope.
+  late final int? x;
+                  ^" as{TypeError,ForDynamic,ForNonNullableByDefault} core::int?;
+  core::int z;
+  core::int? z = invalid-expression "pkg/front_end/testcases/nnbd/issue43689.dart:12:8: Error: 'z' is already declared in this scope.
+  int? z;
+       ^" as{TypeError,ForDynamic,ForNonNullableByDefault} core::int?;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue43689.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue43689.dart.weak.transformed.expect
new file mode 100644
index 0000000..4d8f37a
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43689.dart.weak.transformed.expect
@@ -0,0 +1,42 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue43689.dart:6:17: Error: 'y' is already declared in this scope.
+// late final int? y;
+//                 ^
+// pkg/front_end/testcases/nnbd/issue43689.dart:5:16: Context: Previous declaration of 'y'.
+// late final int y;
+//                ^
+//
+// pkg/front_end/testcases/nnbd/issue43689.dart:10:19: Error: 'x' is already declared in this scope.
+//   late final int? x;
+//                   ^
+// pkg/front_end/testcases/nnbd/issue43689.dart:9:18: Context: Previous declaration of 'x'.
+//   late final int x;
+//                  ^
+//
+// pkg/front_end/testcases/nnbd/issue43689.dart:12:8: Error: 'z' is already declared in this scope.
+//   int? z;
+//        ^
+// pkg/front_end/testcases/nnbd/issue43689.dart:11:7: Context: Previous declaration of 'z'.
+//   int z;
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+late static final field core::int y;
+static method test() → dynamic {
+  late final core::int x;
+  function #x#initializer() → core::int?
+    return invalid-expression "pkg/front_end/testcases/nnbd/issue43689.dart:10:19: Error: 'x' is already declared in this scope.
+  late final int? x;
+                  ^";
+  late final core::int? x = #x#initializer.call();
+  core::int z;
+  core::int? z = invalid-expression "pkg/front_end/testcases/nnbd/issue43689.dart:12:8: Error: 'z' is already declared in this scope.
+  int? z;
+       ^";
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue43716a.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue43716a.dart.strong.expect
index f415c03..30657ed 100644
--- a/pkg/front_end/testcases/nnbd/issue43716a.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue43716a.dart.strong.expect
@@ -2,7 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/issue43716a.dart:15:14: Error: A value of type 'Object?' can't be returned from a function with return type 'Object'.
+// pkg/front_end/testcases/nnbd/issue43716a.dart:15:14: Error: A value of type 'Object?' can't be returned from a function with return type 'Object' because 'Object?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //     return z.x; // Error.
 //              ^
@@ -19,7 +19,7 @@
     self::C<core::Object?, core::Object?>? z = self::b ?{self::C<core::Object?, core::Object?>?} x : y;
     if(z.{core::Object::==}(null))
       throw 0;
-    return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue43716a.dart:15:14: Error: A value of type 'Object?' can't be returned from a function with return type 'Object'.
+    return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue43716a.dart:15:14: Error: A value of type 'Object?' can't be returned from a function with return type 'Object' because 'Object?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
     return z.x; // Error.
              ^" in z{self::C<core::Object?, core::Object?>}.{self::C::x} as{TypeError,ForNonNullableByDefault} core::Object;
diff --git a/pkg/front_end/testcases/nnbd/issue43716a.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue43716a.dart.strong.transformed.expect
index 06894de..f4523d0 100644
--- a/pkg/front_end/testcases/nnbd/issue43716a.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue43716a.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/issue43716a.dart:15:14: Error: A value of type 'Object?' can't be returned from a function with return type 'Object'.
+// pkg/front_end/testcases/nnbd/issue43716a.dart:15:14: Error: A value of type 'Object?' can't be returned from a function with return type 'Object' because 'Object?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //     return z.x; // Error.
 //              ^
@@ -19,7 +19,7 @@
     self::C<core::Object?, core::Object?>? z = self::b ?{self::C<core::Object?, core::Object?>?} x : y;
     if(z.{core::Object::==}(null))
       throw 0;
-    return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue43716a.dart:15:14: Error: A value of type 'Object?' can't be returned from a function with return type 'Object'.
+    return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue43716a.dart:15:14: Error: A value of type 'Object?' can't be returned from a function with return type 'Object' because 'Object?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
     return z.x; // Error.
              ^" in let core::Object? #t2 = z{self::C<core::Object?, core::Object?>}.{self::C::x} in #t2.==(null) ?{core::Object} #t2 as{TypeError,ForNonNullableByDefault} core::Object : #t2{core::Object};
diff --git a/pkg/front_end/testcases/nnbd/issue43716a.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue43716a.dart.weak.expect
index f415c03..30657ed 100644
--- a/pkg/front_end/testcases/nnbd/issue43716a.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue43716a.dart.weak.expect
@@ -2,7 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/issue43716a.dart:15:14: Error: A value of type 'Object?' can't be returned from a function with return type 'Object'.
+// pkg/front_end/testcases/nnbd/issue43716a.dart:15:14: Error: A value of type 'Object?' can't be returned from a function with return type 'Object' because 'Object?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //     return z.x; // Error.
 //              ^
@@ -19,7 +19,7 @@
     self::C<core::Object?, core::Object?>? z = self::b ?{self::C<core::Object?, core::Object?>?} x : y;
     if(z.{core::Object::==}(null))
       throw 0;
-    return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue43716a.dart:15:14: Error: A value of type 'Object?' can't be returned from a function with return type 'Object'.
+    return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue43716a.dart:15:14: Error: A value of type 'Object?' can't be returned from a function with return type 'Object' because 'Object?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
     return z.x; // Error.
              ^" in z{self::C<core::Object?, core::Object?>}.{self::C::x} as{TypeError,ForNonNullableByDefault} core::Object;
diff --git a/pkg/front_end/testcases/nnbd/issue43716a.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue43716a.dart.weak.transformed.expect
index 2b40d28..63594f2 100644
--- a/pkg/front_end/testcases/nnbd/issue43716a.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue43716a.dart.weak.transformed.expect
@@ -2,7 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/issue43716a.dart:15:14: Error: A value of type 'Object?' can't be returned from a function with return type 'Object'.
+// pkg/front_end/testcases/nnbd/issue43716a.dart:15:14: Error: A value of type 'Object?' can't be returned from a function with return type 'Object' because 'Object?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //     return z.x; // Error.
 //              ^
@@ -19,7 +19,7 @@
     self::C<core::Object?, core::Object?>? z = self::b ?{self::C<core::Object?, core::Object?>?} x : y;
     if(z.{core::Object::==}(null))
       throw 0;
-    return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue43716a.dart:15:14: Error: A value of type 'Object?' can't be returned from a function with return type 'Object'.
+    return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue43716a.dart:15:14: Error: A value of type 'Object?' can't be returned from a function with return type 'Object' because 'Object?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
     return z.x; // Error.
              ^" in z{self::C<core::Object?, core::Object?>}.{self::C::x};
diff --git a/pkg/front_end/testcases/nnbd/issue43721.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue43721.dart.strong.expect
index a293187..f2b4df9 100644
--- a/pkg/front_end/testcases/nnbd/issue43721.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue43721.dart.strong.expect
@@ -2,7 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/issue43721.dart:13:7: Error: The argument type 'FutureOr<num?>' can't be assigned to the parameter type 'Object'.
+// pkg/front_end/testcases/nnbd/issue43721.dart:13:7: Error: The argument type 'FutureOr<num?>' can't be assigned to the parameter type 'Object' because 'num?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   foo(z); // Error.
 //       ^
@@ -17,7 +17,7 @@
   FutureOr<core::int?>x = null;
   core::num n = 1;
   FutureOr<core::num?>z = condition ?{FutureOr<core::num?>} x : n;
-  self::foo(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue43721.dart:13:7: Error: The argument type 'FutureOr<num?>' can't be assigned to the parameter type 'Object'.
+  self::foo(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue43721.dart:13:7: Error: The argument type 'FutureOr<num?>' can't be assigned to the parameter type 'Object' because 'num?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   foo(z); // Error.
       ^" in z as{TypeError,ForNonNullableByDefault} core::Object);
diff --git a/pkg/front_end/testcases/nnbd/issue43721.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue43721.dart.strong.transformed.expect
index 7d5061d..8b07b75 100644
--- a/pkg/front_end/testcases/nnbd/issue43721.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue43721.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/issue43721.dart:13:7: Error: The argument type 'FutureOr<num?>' can't be assigned to the parameter type 'Object'.
+// pkg/front_end/testcases/nnbd/issue43721.dart:13:7: Error: The argument type 'FutureOr<num?>' can't be assigned to the parameter type 'Object' because 'num?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   foo(z); // Error.
 //       ^
@@ -17,7 +17,7 @@
   FutureOr<core::int?>x = null;
   core::num n = 1;
   FutureOr<core::num?>z = condition ?{FutureOr<core::num?>} x : n;
-  self::foo(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue43721.dart:13:7: Error: The argument type 'FutureOr<num?>' can't be assigned to the parameter type 'Object'.
+  self::foo(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue43721.dart:13:7: Error: The argument type 'FutureOr<num?>' can't be assigned to the parameter type 'Object' because 'num?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   foo(z); // Error.
       ^" in let FutureOr<core::num?>#t2 = z in #t2.==(null) ?{core::Object} #t2 as{TypeError,ForNonNullableByDefault} core::Object : #t2{core::Object});
diff --git a/pkg/front_end/testcases/nnbd/issue43721.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue43721.dart.weak.expect
index a293187..f2b4df9 100644
--- a/pkg/front_end/testcases/nnbd/issue43721.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue43721.dart.weak.expect
@@ -2,7 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/issue43721.dart:13:7: Error: The argument type 'FutureOr<num?>' can't be assigned to the parameter type 'Object'.
+// pkg/front_end/testcases/nnbd/issue43721.dart:13:7: Error: The argument type 'FutureOr<num?>' can't be assigned to the parameter type 'Object' because 'num?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   foo(z); // Error.
 //       ^
@@ -17,7 +17,7 @@
   FutureOr<core::int?>x = null;
   core::num n = 1;
   FutureOr<core::num?>z = condition ?{FutureOr<core::num?>} x : n;
-  self::foo(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue43721.dart:13:7: Error: The argument type 'FutureOr<num?>' can't be assigned to the parameter type 'Object'.
+  self::foo(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue43721.dart:13:7: Error: The argument type 'FutureOr<num?>' can't be assigned to the parameter type 'Object' because 'num?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   foo(z); // Error.
       ^" in z as{TypeError,ForNonNullableByDefault} core::Object);
diff --git a/pkg/front_end/testcases/nnbd/issue43721.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue43721.dart.weak.transformed.expect
index 7619193..530420f 100644
--- a/pkg/front_end/testcases/nnbd/issue43721.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue43721.dart.weak.transformed.expect
@@ -2,7 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/issue43721.dart:13:7: Error: The argument type 'FutureOr<num?>' can't be assigned to the parameter type 'Object'.
+// pkg/front_end/testcases/nnbd/issue43721.dart:13:7: Error: The argument type 'FutureOr<num?>' can't be assigned to the parameter type 'Object' because 'num?' is nullable and 'Object' isn't.
 //  - 'Object' is from 'dart:core'.
 //   foo(z); // Error.
 //       ^
@@ -17,7 +17,7 @@
   FutureOr<core::int?>x = null;
   core::num n = 1;
   FutureOr<core::num?>z = condition ?{FutureOr<core::num?>} x : n;
-  self::foo(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue43721.dart:13:7: Error: The argument type 'FutureOr<num?>' can't be assigned to the parameter type 'Object'.
+  self::foo(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue43721.dart:13:7: Error: The argument type 'FutureOr<num?>' can't be assigned to the parameter type 'Object' because 'num?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   foo(z); // Error.
       ^" in z);
diff --git a/pkg/front_end/testcases/nnbd/issue43918.dart b/pkg/front_end/testcases/nnbd/issue43918.dart
new file mode 100644
index 0000000..6e5f741
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43918.dart
@@ -0,0 +1,21 @@
+// Copyright (c) 2020, 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.
+
+abstract class A<T> {
+  factory A(T value) = _A;
+}
+
+class _A<T> implements A<T> {
+  _A(T value);
+}
+
+abstract class B<T> {
+  factory B(int value) = _B;
+}
+
+class _B<T> implements B<T> {
+  _B(int value);
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/issue43918.dart.outline.expect b/pkg/front_end/testcases/nnbd/issue43918.dart.outline.expect
new file mode 100644
index 0000000..2e633c9
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43918.dart.outline.expect
@@ -0,0 +1,24 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class A<T extends core::Object? = dynamic> extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::A::•]/*isNullableByDefault*/;
+  static factory •<T extends core::Object? = dynamic>(self::A::•::T% value) → self::A<self::A::•::T%>
+    let dynamic #redirecting_factory = self::_A::• in let self::A::•::T% #typeArg0 = null in invalid-expression;
+}
+class _A<T extends core::Object? = dynamic> extends core::Object implements self::A<self::_A::T%> {
+  constructor •(self::_A::T% value) → self::_A<self::_A::T%>
+    ;
+}
+abstract class B<T extends core::Object? = dynamic> extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::B::•]/*isNullableByDefault*/;
+  static factory •<T extends core::Object? = dynamic>(core::int value) → self::B<self::B::•::T%>
+    let dynamic #redirecting_factory = self::_B::• in let self::B::•::T% #typeArg0 = null in invalid-expression;
+}
+class _B<T extends core::Object? = dynamic> extends core::Object implements self::B<self::_B::T%> {
+  constructor •(core::int value) → self::_B<self::_B::T%>
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/nnbd/issue43918.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue43918.dart.strong.expect
new file mode 100644
index 0000000..1d6771b
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43918.dart.strong.expect
@@ -0,0 +1,25 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class A<T extends core::Object? = dynamic> extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::A::•]/*isNullableByDefault*/;
+  static factory •<T extends core::Object? = dynamic>(self::A::•::T% value) → self::A<self::A::•::T%>
+    let dynamic #redirecting_factory = self::_A::• in let self::A::•::T% #typeArg0 = null in invalid-expression;
+}
+class _A<T extends core::Object? = dynamic> extends core::Object implements self::A<self::_A::T%> {
+  constructor •(self::_A::T% value) → self::_A<self::_A::T%>
+    : super core::Object::•()
+    ;
+}
+abstract class B<T extends core::Object? = dynamic> extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::B::•]/*isNullableByDefault*/;
+  static factory •<T extends core::Object? = dynamic>(core::int value) → self::B<self::B::•::T%>
+    let dynamic #redirecting_factory = self::_B::• in let self::B::•::T% #typeArg0 = null in invalid-expression;
+}
+class _B<T extends core::Object? = dynamic> extends core::Object implements self::B<self::_B::T%> {
+  constructor •(core::int value) → self::_B<self::_B::T%>
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue43918.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue43918.dart.strong.transformed.expect
new file mode 100644
index 0000000..143829a
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43918.dart.strong.transformed.expect
@@ -0,0 +1,25 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class A<T extends core::Object? = dynamic> extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::A::•]/*isNullableByDefault*/;
+  static factory •<T extends core::Object? = dynamic>(self::A::•::T% value) → self::A<self::A::•::T%>
+    let<BottomType> #redirecting_factory = self::_A::• in let self::A::•::T% #typeArg0 = null in invalid-expression;
+}
+class _A<T extends core::Object? = dynamic> extends core::Object implements self::A<self::_A::T%> {
+  constructor •(self::_A::T% value) → self::_A<self::_A::T%>
+    : super core::Object::•()
+    ;
+}
+abstract class B<T extends core::Object? = dynamic> extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::B::•]/*isNullableByDefault*/;
+  static factory •<T extends core::Object? = dynamic>(core::int value) → self::B<self::B::•::T%>
+    let<BottomType> #redirecting_factory = self::_B::• in let self::B::•::T% #typeArg0 = null in invalid-expression;
+}
+class _B<T extends core::Object? = dynamic> extends core::Object implements self::B<self::_B::T%> {
+  constructor •(core::int value) → self::_B<self::_B::T%>
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue43918.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd/issue43918.dart.textual_outline.expect
new file mode 100644
index 0000000..8694243
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43918.dart.textual_outline.expect
@@ -0,0 +1,17 @@
+abstract class A<T> {
+  factory A(T value) = _A;
+}
+
+class _A<T> implements A<T> {
+  _A(T value);
+}
+
+abstract class B<T> {
+  factory B(int value) = _B;
+}
+
+class _B<T> implements B<T> {
+  _B(int value);
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/issue43918.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/nnbd/issue43918.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..b331b76
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43918.dart.textual_outline_modelled.expect
@@ -0,0 +1,17 @@
+abstract class A<T> {
+  factory A(T value) = _A;
+}
+
+abstract class B<T> {
+  factory B(int value) = _B;
+}
+
+class _A<T> implements A<T> {
+  _A(T value);
+}
+
+class _B<T> implements B<T> {
+  _B(int value);
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/issue43918.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue43918.dart.weak.expect
new file mode 100644
index 0000000..1d6771b
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43918.dart.weak.expect
@@ -0,0 +1,25 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class A<T extends core::Object? = dynamic> extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::A::•]/*isNullableByDefault*/;
+  static factory •<T extends core::Object? = dynamic>(self::A::•::T% value) → self::A<self::A::•::T%>
+    let dynamic #redirecting_factory = self::_A::• in let self::A::•::T% #typeArg0 = null in invalid-expression;
+}
+class _A<T extends core::Object? = dynamic> extends core::Object implements self::A<self::_A::T%> {
+  constructor •(self::_A::T% value) → self::_A<self::_A::T%>
+    : super core::Object::•()
+    ;
+}
+abstract class B<T extends core::Object? = dynamic> extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::B::•]/*isNullableByDefault*/;
+  static factory •<T extends core::Object? = dynamic>(core::int value) → self::B<self::B::•::T%>
+    let dynamic #redirecting_factory = self::_B::• in let self::B::•::T% #typeArg0 = null in invalid-expression;
+}
+class _B<T extends core::Object? = dynamic> extends core::Object implements self::B<self::_B::T%> {
+  constructor •(core::int value) → self::_B<self::_B::T%>
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue43918.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue43918.dart.weak.transformed.expect
new file mode 100644
index 0000000..143829a
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43918.dart.weak.transformed.expect
@@ -0,0 +1,25 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class A<T extends core::Object? = dynamic> extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::A::•]/*isNullableByDefault*/;
+  static factory •<T extends core::Object? = dynamic>(self::A::•::T% value) → self::A<self::A::•::T%>
+    let<BottomType> #redirecting_factory = self::_A::• in let self::A::•::T% #typeArg0 = null in invalid-expression;
+}
+class _A<T extends core::Object? = dynamic> extends core::Object implements self::A<self::_A::T%> {
+  constructor •(self::_A::T% value) → self::_A<self::_A::T%>
+    : super core::Object::•()
+    ;
+}
+abstract class B<T extends core::Object? = dynamic> extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::B::•]/*isNullableByDefault*/;
+  static factory •<T extends core::Object? = dynamic>(core::int value) → self::B<self::B::•::T%>
+    let<BottomType> #redirecting_factory = self::_B::• in let self::B::•::T% #typeArg0 = null in invalid-expression;
+}
+class _B<T extends core::Object? = dynamic> extends core::Object implements self::B<self::_B::T%> {
+  constructor •(core::int value) → self::_B<self::_B::T%>
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/language_issue1182.dart b/pkg/front_end/testcases/nnbd/language_issue1182.dart
new file mode 100644
index 0000000..c9d46c8
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/language_issue1182.dart
@@ -0,0 +1,15 @@
+// Copyright (c) 2020, 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.
+
+extension Test<T> on T {
+  T Function(T) get test => (a) => this;
+}
+
+class Foo<S extends num> {
+  void test1(S x) {
+    S Function(S) f = x.test;
+  }
+}
+
+void main() {}
diff --git a/pkg/front_end/testcases/nnbd/language_issue1182.dart.outline.expect b/pkg/front_end/testcases/nnbd/language_issue1182.dart.outline.expect
new file mode 100644
index 0000000..5032523
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/language_issue1182.dart.outline.expect
@@ -0,0 +1,17 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Foo<S extends core::num = core::num> extends core::Object {
+  synthetic constructor •() → self::Foo<self::Foo::S>
+    ;
+  method test1(generic-covariant-impl self::Foo::S x) → void
+    ;
+}
+extension Test<T extends core::Object? = dynamic> on T% {
+  get test = self::Test|get#test;
+}
+static method Test|get#test<T extends core::Object? = dynamic>(final self::Test|get#test::T% #this) → (self::Test|get#test::T%) → self::Test|get#test::T%
+  ;
+static method main() → void
+  ;
diff --git a/pkg/front_end/testcases/nnbd/language_issue1182.dart.strong.expect b/pkg/front_end/testcases/nnbd/language_issue1182.dart.strong.expect
new file mode 100644
index 0000000..151bcbd
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/language_issue1182.dart.strong.expect
@@ -0,0 +1,18 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Foo<S extends core::num = core::num> extends core::Object {
+  synthetic constructor •() → self::Foo<self::Foo::S>
+    : super core::Object::•()
+    ;
+  method test1(generic-covariant-impl self::Foo::S x) → void {
+    (self::Foo::S) → self::Foo::S f = self::Test|get#test<self::Foo::S>(x);
+  }
+}
+extension Test<T extends core::Object? = dynamic> on T% {
+  get test = self::Test|get#test;
+}
+static method Test|get#test<T extends core::Object? = dynamic>(final self::Test|get#test::T% #this) → (self::Test|get#test::T%) → self::Test|get#test::T%
+  return (self::Test|get#test::T% a) → self::Test|get#test::T% => #this;
+static method main() → void {}
diff --git a/pkg/front_end/testcases/nnbd/language_issue1182.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/language_issue1182.dart.strong.transformed.expect
new file mode 100644
index 0000000..151bcbd
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/language_issue1182.dart.strong.transformed.expect
@@ -0,0 +1,18 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Foo<S extends core::num = core::num> extends core::Object {
+  synthetic constructor •() → self::Foo<self::Foo::S>
+    : super core::Object::•()
+    ;
+  method test1(generic-covariant-impl self::Foo::S x) → void {
+    (self::Foo::S) → self::Foo::S f = self::Test|get#test<self::Foo::S>(x);
+  }
+}
+extension Test<T extends core::Object? = dynamic> on T% {
+  get test = self::Test|get#test;
+}
+static method Test|get#test<T extends core::Object? = dynamic>(final self::Test|get#test::T% #this) → (self::Test|get#test::T%) → self::Test|get#test::T%
+  return (self::Test|get#test::T% a) → self::Test|get#test::T% => #this;
+static method main() → void {}
diff --git a/pkg/front_end/testcases/nnbd/language_issue1182.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd/language_issue1182.dart.textual_outline.expect
new file mode 100644
index 0000000..2f9718a
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/language_issue1182.dart.textual_outline.expect
@@ -0,0 +1,6 @@
+extension Test<T> (){}
+on T (){}
+class Foo<S extends num> {
+  void test1(S x) {}
+}
+void main() {}
diff --git a/pkg/front_end/testcases/nnbd/language_issue1182.dart.weak.expect b/pkg/front_end/testcases/nnbd/language_issue1182.dart.weak.expect
new file mode 100644
index 0000000..151bcbd
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/language_issue1182.dart.weak.expect
@@ -0,0 +1,18 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Foo<S extends core::num = core::num> extends core::Object {
+  synthetic constructor •() → self::Foo<self::Foo::S>
+    : super core::Object::•()
+    ;
+  method test1(generic-covariant-impl self::Foo::S x) → void {
+    (self::Foo::S) → self::Foo::S f = self::Test|get#test<self::Foo::S>(x);
+  }
+}
+extension Test<T extends core::Object? = dynamic> on T% {
+  get test = self::Test|get#test;
+}
+static method Test|get#test<T extends core::Object? = dynamic>(final self::Test|get#test::T% #this) → (self::Test|get#test::T%) → self::Test|get#test::T%
+  return (self::Test|get#test::T% a) → self::Test|get#test::T% => #this;
+static method main() → void {}
diff --git a/pkg/front_end/testcases/nnbd/language_issue1182.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/language_issue1182.dart.weak.transformed.expect
new file mode 100644
index 0000000..151bcbd
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/language_issue1182.dart.weak.transformed.expect
@@ -0,0 +1,18 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Foo<S extends core::num = core::num> extends core::Object {
+  synthetic constructor •() → self::Foo<self::Foo::S>
+    : super core::Object::•()
+    ;
+  method test1(generic-covariant-impl self::Foo::S x) → void {
+    (self::Foo::S) → self::Foo::S f = self::Test|get#test<self::Foo::S>(x);
+  }
+}
+extension Test<T extends core::Object? = dynamic> on T% {
+  get test = self::Test|get#test;
+}
+static method Test|get#test<T extends core::Object? = dynamic>(final self::Test|get#test::T% #this) → (self::Test|get#test::T%) → self::Test|get#test::T%
+  return (self::Test|get#test::T% a) → self::Test|get#test::T% => #this;
+static method main() → void {}
diff --git a/pkg/front_end/testcases/nnbd/later.dart.strong.expect b/pkg/front_end/testcases/nnbd/later.dart.strong.expect
index 992c773..df47af6 100644
--- a/pkg/front_end/testcases/nnbd/later.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/later.dart.strong.expect
@@ -113,7 +113,7 @@
   block {
     final core::List<core::int> #t1 = <core::int>[];
     for (core::int i = 0; i.{core::num::<}(10); i = i.{core::num::+}(1))
-      #t1.{core::List::add}(i);
+      #t1.{core::List::add}{Invariant}(i);
   } =>#t1;
 }
 static method hest() → dynamic async {
diff --git a/pkg/front_end/testcases/nnbd/later.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/later.dart.strong.transformed.expect
index f36cfd3..25b17c9 100644
--- a/pkg/front_end/testcases/nnbd/later.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/later.dart.strong.transformed.expect
@@ -120,11 +120,12 @@
   block {
     final core::List<core::int> #t1 = <core::int>[];
     for (core::int i = 0; i.{core::num::<}(10); i = i.{core::num::+}(1))
-      #t1.{core::List::add}(i);
+      #t1.{core::List::add}{Invariant}(i);
   } =>#t1;
 }
 static method hest() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic> :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>? :return_value;
   dynamic :async_stack_trace;
   (dynamic) → dynamic :async_op_then;
@@ -141,7 +142,6 @@
       {
         {
           asy::Stream<core::String> :stream = asy::Stream::fromIterable<core::String>(<core::String>["hest"]);
-          asy::_asyncStarListenHelper(:stream, :async_op);
           asy::_StreamIterator<core::String>? :for-iterator = new asy::_StreamIterator::•<core::String>(:stream);
           try
             #L2:
@@ -166,20 +166,22 @@
         :return_value = "hest";
         break #L1;
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method fisk() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic> :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>? :return_value;
   dynamic :async_stack_trace;
   (dynamic) → dynamic :async_op_then;
@@ -202,7 +204,8 @@
         late core::String s2 = #s2#initializer.call();
         function #f#initializer() → core::Function
           return () → asy::Future<dynamic> /* originally async */ {
-            final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+            final asy::_Future<dynamic> :async_future = new asy::_Future::•<dynamic>();
+            core::bool* :is_sync = false;
             FutureOr<dynamic>? :return_value;
             dynamic :async_stack_trace;
             (dynamic) → dynamic :async_op_then;
@@ -218,31 +221,33 @@
                   :return_value = :result;
                   break #L4;
                 }
-                asy::_completeOnAsyncReturn(:async_completer, :return_value);
+                asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
                 return;
               }
               on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-                :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+                asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
               }
             :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
             :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
             :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-            :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-            return :async_completer.{asy::Completer::future};
+            :async_op.call();
+            :is_sync = true;
+            return :async_future;
           };
         late core::Function f = #f#initializer.call();
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method main() → dynamic {}
 
diff --git a/pkg/front_end/testcases/nnbd/later.dart.weak.expect b/pkg/front_end/testcases/nnbd/later.dart.weak.expect
index 992c773..df47af6 100644
--- a/pkg/front_end/testcases/nnbd/later.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/later.dart.weak.expect
@@ -113,7 +113,7 @@
   block {
     final core::List<core::int> #t1 = <core::int>[];
     for (core::int i = 0; i.{core::num::<}(10); i = i.{core::num::+}(1))
-      #t1.{core::List::add}(i);
+      #t1.{core::List::add}{Invariant}(i);
   } =>#t1;
 }
 static method hest() → dynamic async {
diff --git a/pkg/front_end/testcases/nnbd/later.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/later.dart.weak.transformed.expect
index f36cfd3..25b17c9 100644
--- a/pkg/front_end/testcases/nnbd/later.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/later.dart.weak.transformed.expect
@@ -120,11 +120,12 @@
   block {
     final core::List<core::int> #t1 = <core::int>[];
     for (core::int i = 0; i.{core::num::<}(10); i = i.{core::num::+}(1))
-      #t1.{core::List::add}(i);
+      #t1.{core::List::add}{Invariant}(i);
   } =>#t1;
 }
 static method hest() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic> :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>? :return_value;
   dynamic :async_stack_trace;
   (dynamic) → dynamic :async_op_then;
@@ -141,7 +142,6 @@
       {
         {
           asy::Stream<core::String> :stream = asy::Stream::fromIterable<core::String>(<core::String>["hest"]);
-          asy::_asyncStarListenHelper(:stream, :async_op);
           asy::_StreamIterator<core::String>? :for-iterator = new asy::_StreamIterator::•<core::String>(:stream);
           try
             #L2:
@@ -166,20 +166,22 @@
         :return_value = "hest";
         break #L1;
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method fisk() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic> :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>? :return_value;
   dynamic :async_stack_trace;
   (dynamic) → dynamic :async_op_then;
@@ -202,7 +204,8 @@
         late core::String s2 = #s2#initializer.call();
         function #f#initializer() → core::Function
           return () → asy::Future<dynamic> /* originally async */ {
-            final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+            final asy::_Future<dynamic> :async_future = new asy::_Future::•<dynamic>();
+            core::bool* :is_sync = false;
             FutureOr<dynamic>? :return_value;
             dynamic :async_stack_trace;
             (dynamic) → dynamic :async_op_then;
@@ -218,31 +221,33 @@
                   :return_value = :result;
                   break #L4;
                 }
-                asy::_completeOnAsyncReturn(:async_completer, :return_value);
+                asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
                 return;
               }
               on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-                :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+                asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
               }
             :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
             :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
             :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-            :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-            return :async_completer.{asy::Completer::future};
+            :async_op.call();
+            :is_sync = true;
+            return :async_future;
           };
         late core::Function f = #f#initializer.call();
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method main() → dynamic {}
 
diff --git a/pkg/front_end/testcases/nnbd/load_library.dart.strong.expect b/pkg/front_end/testcases/nnbd/load_library.dart.strong.expect
index 92acca2..0e7e3b1 100644
--- a/pkg/front_end/testcases/nnbd/load_library.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/load_library.dart.strong.expect
@@ -1,15 +1,14 @@
 library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:async" as asy;
-import "dart:core" as core;
 
 import "dart:math" deferred as math;
 
 static method main() → dynamic {
   asy::Future<dynamic> v1 = LoadLibrary(math);
-  v1.{asy::Future::then}<core::Null?>((dynamic _) → core::Null? {});
+  v1.{asy::Future::then}<Null>((dynamic _) → Null {});
   () → asy::Future<dynamic> v2 = #C1;
-  v2.call().{asy::Future::then}<core::Null?>((dynamic _) → core::Null? {});
+  v2.call().{asy::Future::then}<Null>((dynamic _) → Null {});
 }
 static method _#loadLibrary_math() → asy::Future<dynamic>
   return LoadLibrary(math);
diff --git a/pkg/front_end/testcases/nnbd/load_library.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/load_library.dart.strong.transformed.expect
index 92acca2..0e7e3b1 100644
--- a/pkg/front_end/testcases/nnbd/load_library.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/load_library.dart.strong.transformed.expect
@@ -1,15 +1,14 @@
 library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:async" as asy;
-import "dart:core" as core;
 
 import "dart:math" deferred as math;
 
 static method main() → dynamic {
   asy::Future<dynamic> v1 = LoadLibrary(math);
-  v1.{asy::Future::then}<core::Null?>((dynamic _) → core::Null? {});
+  v1.{asy::Future::then}<Null>((dynamic _) → Null {});
   () → asy::Future<dynamic> v2 = #C1;
-  v2.call().{asy::Future::then}<core::Null?>((dynamic _) → core::Null? {});
+  v2.call().{asy::Future::then}<Null>((dynamic _) → Null {});
 }
 static method _#loadLibrary_math() → asy::Future<dynamic>
   return LoadLibrary(math);
diff --git a/pkg/front_end/testcases/nnbd/load_library.dart.weak.expect b/pkg/front_end/testcases/nnbd/load_library.dart.weak.expect
index 92acca2..0e7e3b1 100644
--- a/pkg/front_end/testcases/nnbd/load_library.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/load_library.dart.weak.expect
@@ -1,15 +1,14 @@
 library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:async" as asy;
-import "dart:core" as core;
 
 import "dart:math" deferred as math;
 
 static method main() → dynamic {
   asy::Future<dynamic> v1 = LoadLibrary(math);
-  v1.{asy::Future::then}<core::Null?>((dynamic _) → core::Null? {});
+  v1.{asy::Future::then}<Null>((dynamic _) → Null {});
   () → asy::Future<dynamic> v2 = #C1;
-  v2.call().{asy::Future::then}<core::Null?>((dynamic _) → core::Null? {});
+  v2.call().{asy::Future::then}<Null>((dynamic _) → Null {});
 }
 static method _#loadLibrary_math() → asy::Future<dynamic>
   return LoadLibrary(math);
diff --git a/pkg/front_end/testcases/nnbd/load_library.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/load_library.dart.weak.transformed.expect
index 92acca2..0e7e3b1 100644
--- a/pkg/front_end/testcases/nnbd/load_library.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/load_library.dart.weak.transformed.expect
@@ -1,15 +1,14 @@
 library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:async" as asy;
-import "dart:core" as core;
 
 import "dart:math" deferred as math;
 
 static method main() → dynamic {
   asy::Future<dynamic> v1 = LoadLibrary(math);
-  v1.{asy::Future::then}<core::Null?>((dynamic _) → core::Null? {});
+  v1.{asy::Future::then}<Null>((dynamic _) → Null {});
   () → asy::Future<dynamic> v2 = #C1;
-  v2.call().{asy::Future::then}<core::Null?>((dynamic _) → core::Null? {});
+  v2.call().{asy::Future::then}<Null>((dynamic _) → Null {});
 }
 static method _#loadLibrary_math() → asy::Future<dynamic>
   return LoadLibrary(math);
diff --git a/pkg/front_end/testcases/nnbd/main_declaration.dart.strong.expect b/pkg/front_end/testcases/nnbd/main_declaration.dart.strong.expect
index bef2df6..6826015 100644
--- a/pkg/front_end/testcases/nnbd/main_declaration.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/main_declaration.dart.strong.expect
@@ -60,9 +60,8 @@
 //                 ^^^^
 //
 import self as self4;
-import "dart:core" as core;
 
-static field () → void main = () → core::Null? {};
+static field () → void main = () → void {};
 
 library /*isNonNullableByDefault*/;
 //
@@ -73,10 +72,9 @@
 //                     ^^^^
 //
 import self as self5;
-import "dart:core" as core;
 
 static get main() → () → void
-  return () → core::Null? {};
+  return () → void {};
 
 library /*isNonNullableByDefault*/;
 import self as self6;
diff --git a/pkg/front_end/testcases/nnbd/main_declaration.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/main_declaration.dart.strong.transformed.expect
index bef2df6..6826015 100644
--- a/pkg/front_end/testcases/nnbd/main_declaration.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/main_declaration.dart.strong.transformed.expect
@@ -60,9 +60,8 @@
 //                 ^^^^
 //
 import self as self4;
-import "dart:core" as core;
 
-static field () → void main = () → core::Null? {};
+static field () → void main = () → void {};
 
 library /*isNonNullableByDefault*/;
 //
@@ -73,10 +72,9 @@
 //                     ^^^^
 //
 import self as self5;
-import "dart:core" as core;
 
 static get main() → () → void
-  return () → core::Null? {};
+  return () → void {};
 
 library /*isNonNullableByDefault*/;
 import self as self6;
diff --git a/pkg/front_end/testcases/nnbd/main_declaration.dart.weak.expect b/pkg/front_end/testcases/nnbd/main_declaration.dart.weak.expect
index c850a85..9319364 100644
--- a/pkg/front_end/testcases/nnbd/main_declaration.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/main_declaration.dart.weak.expect
@@ -60,9 +60,8 @@
 //                 ^^^^
 //
 import self as self4;
-import "dart:core" as core;
 
-static field () → void main = () → core::Null? {};
+static field () → void main = () → void {};
 
 library /*isNonNullableByDefault*/;
 //
@@ -73,10 +72,9 @@
 //                     ^^^^
 //
 import self as self5;
-import "dart:core" as core;
 
 static get main() → () → void
-  return () → core::Null? {};
+  return () → void {};
 
 library /*isNonNullableByDefault*/;
 import self as self6;
diff --git a/pkg/front_end/testcases/nnbd/main_declaration.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/main_declaration.dart.weak.transformed.expect
index c850a85..9319364 100644
--- a/pkg/front_end/testcases/nnbd/main_declaration.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/main_declaration.dart.weak.transformed.expect
@@ -60,9 +60,8 @@
 //                 ^^^^
 //
 import self as self4;
-import "dart:core" as core;
 
-static field () → void main = () → core::Null? {};
+static field () → void main = () → void {};
 
 library /*isNonNullableByDefault*/;
 //
@@ -73,10 +72,9 @@
 //                     ^^^^
 //
 import self as self5;
-import "dart:core" as core;
 
 static get main() → () → void
-  return () → core::Null? {};
+  return () → void {};
 
 library /*isNonNullableByDefault*/;
 import self as self6;
diff --git a/pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart.strong.expect b/pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart.strong.expect
index aea1af9..b5a66c2 100644
--- a/pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart.strong.expect
@@ -32,13 +32,13 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  field ({required s: core::String}) → void f = ({required core::String s = #C1}) → core::Null? {};
+  field ({required s: core::String}) → void f = ({required core::String s = #C1}) → void {};
   constructor •({required core::int x = #C1}) → self::A
     : super core::Object::•()
     ;
   method foo({required core::int y = #C1}) → dynamic {}
 }
-static field ({required s: core::String}) → void g = ({required core::String s = #C1}) → core::Null? {};
+static field ({required s: core::String}) → void g = ({required core::String s = #C1}) → void {};
 static method foo({required core::String s = #C1}) → void {}
 static method bar() → dynamic {
   invalid-expression "pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart:15:6: Error: Required named parameter 's' must be provided.
diff --git a/pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart.strong.transformed.expect
index aea1af9..b5a66c2 100644
--- a/pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart.strong.transformed.expect
@@ -32,13 +32,13 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  field ({required s: core::String}) → void f = ({required core::String s = #C1}) → core::Null? {};
+  field ({required s: core::String}) → void f = ({required core::String s = #C1}) → void {};
   constructor •({required core::int x = #C1}) → self::A
     : super core::Object::•()
     ;
   method foo({required core::int y = #C1}) → dynamic {}
 }
-static field ({required s: core::String}) → void g = ({required core::String s = #C1}) → core::Null? {};
+static field ({required s: core::String}) → void g = ({required core::String s = #C1}) → void {};
 static method foo({required core::String s = #C1}) → void {}
 static method bar() → dynamic {
   invalid-expression "pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart:15:6: Error: Required named parameter 's' must be provided.
diff --git a/pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart.weak.expect b/pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart.weak.expect
index aea1af9..b5a66c2 100644
--- a/pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart.weak.expect
@@ -32,13 +32,13 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  field ({required s: core::String}) → void f = ({required core::String s = #C1}) → core::Null? {};
+  field ({required s: core::String}) → void f = ({required core::String s = #C1}) → void {};
   constructor •({required core::int x = #C1}) → self::A
     : super core::Object::•()
     ;
   method foo({required core::int y = #C1}) → dynamic {}
 }
-static field ({required s: core::String}) → void g = ({required core::String s = #C1}) → core::Null? {};
+static field ({required s: core::String}) → void g = ({required core::String s = #C1}) → void {};
 static method foo({required core::String s = #C1}) → void {}
 static method bar() → dynamic {
   invalid-expression "pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart:15:6: Error: Required named parameter 's' must be provided.
diff --git a/pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart.weak.transformed.expect
index aea1af9..b5a66c2 100644
--- a/pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart.weak.transformed.expect
@@ -32,13 +32,13 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  field ({required s: core::String}) → void f = ({required core::String s = #C1}) → core::Null? {};
+  field ({required s: core::String}) → void f = ({required core::String s = #C1}) → void {};
   constructor •({required core::int x = #C1}) → self::A
     : super core::Object::•()
     ;
   method foo({required core::int y = #C1}) → dynamic {}
 }
-static field ({required s: core::String}) → void g = ({required core::String s = #C1}) → core::Null? {};
+static field ({required s: core::String}) → void g = ({required core::String s = #C1}) → void {};
 static method foo({required core::String s = #C1}) → void {}
 static method bar() → dynamic {
   invalid-expression "pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart:15:6: Error: Required named parameter 's' must be provided.
diff --git a/pkg/front_end/testcases/nnbd/mix_in_field.dart.outline.expect b/pkg/front_end/testcases/nnbd/mix_in_field.dart.outline.expect
index 8ff567c..100ffd1 100644
--- a/pkg/front_end/testcases/nnbd/mix_in_field.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/mix_in_field.dart.outline.expect
@@ -5,7 +5,7 @@
 import "dart:async";
 
 class Mixin extends core::Object {
-  field FutureOr<core::Null?>m;
+  field FutureOr<Null>m;
   synthetic constructor •() → self::Mixin
     ;
 }
diff --git a/pkg/front_end/testcases/nnbd/mix_in_field.dart.strong.expect b/pkg/front_end/testcases/nnbd/mix_in_field.dart.strong.expect
index 41252e1..f87569c 100644
--- a/pkg/front_end/testcases/nnbd/mix_in_field.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/mix_in_field.dart.strong.expect
@@ -5,7 +5,7 @@
 import "dart:async";
 
 class Mixin extends core::Object {
-  field FutureOr<core::Null?>m = null;
+  field FutureOr<Null>m = null;
   synthetic constructor •() → self::Mixin
     : super core::Object::•()
     ;
@@ -20,7 +20,7 @@
     : super self::_Class&Object&Mixin::•()
     ;
   method test(dynamic t1) → dynamic {
-    this.{self::Mixin::m} = t1 as{TypeError,ForDynamic,ForNonNullableByDefault} FutureOr<core::Null?>;
+    this.{self::Mixin::m} = t1 as{TypeError,ForDynamic,ForNonNullableByDefault} FutureOr<Null>;
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/mix_in_field.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/mix_in_field.dart.strong.transformed.expect
index 002d4b2..0f52fef 100644
--- a/pkg/front_end/testcases/nnbd/mix_in_field.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/mix_in_field.dart.strong.transformed.expect
@@ -5,13 +5,13 @@
 import "dart:async";
 
 class Mixin extends core::Object {
-  field FutureOr<core::Null?>m = null;
+  field FutureOr<Null>m = null;
   synthetic constructor •() → self::Mixin
     : super core::Object::•()
     ;
 }
 abstract class _Class&Object&Mixin extends core::Object implements self::Mixin /*isAnonymousMixin,isEliminatedMixin*/  {
-  field FutureOr<core::Null?>m = null;
+  field FutureOr<Null>m = null;
   synthetic constructor •() → self::_Class&Object&Mixin
     : super core::Object::•()
     ;
@@ -21,7 +21,7 @@
     : super self::_Class&Object&Mixin::•()
     ;
   method test(dynamic t1) → dynamic {
-    this.{self::Mixin::m} = t1 as{TypeError,ForDynamic,ForNonNullableByDefault} FutureOr<core::Null?>;
+    this.{self::Mixin::m} = t1 as{TypeError,ForDynamic,ForNonNullableByDefault} FutureOr<Null>;
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/mix_in_field.dart.weak.expect b/pkg/front_end/testcases/nnbd/mix_in_field.dart.weak.expect
index 41252e1..f87569c 100644
--- a/pkg/front_end/testcases/nnbd/mix_in_field.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/mix_in_field.dart.weak.expect
@@ -5,7 +5,7 @@
 import "dart:async";
 
 class Mixin extends core::Object {
-  field FutureOr<core::Null?>m = null;
+  field FutureOr<Null>m = null;
   synthetic constructor •() → self::Mixin
     : super core::Object::•()
     ;
@@ -20,7 +20,7 @@
     : super self::_Class&Object&Mixin::•()
     ;
   method test(dynamic t1) → dynamic {
-    this.{self::Mixin::m} = t1 as{TypeError,ForDynamic,ForNonNullableByDefault} FutureOr<core::Null?>;
+    this.{self::Mixin::m} = t1 as{TypeError,ForDynamic,ForNonNullableByDefault} FutureOr<Null>;
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/mix_in_field.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/mix_in_field.dart.weak.transformed.expect
index 002d4b2..0f52fef 100644
--- a/pkg/front_end/testcases/nnbd/mix_in_field.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/mix_in_field.dart.weak.transformed.expect
@@ -5,13 +5,13 @@
 import "dart:async";
 
 class Mixin extends core::Object {
-  field FutureOr<core::Null?>m = null;
+  field FutureOr<Null>m = null;
   synthetic constructor •() → self::Mixin
     : super core::Object::•()
     ;
 }
 abstract class _Class&Object&Mixin extends core::Object implements self::Mixin /*isAnonymousMixin,isEliminatedMixin*/  {
-  field FutureOr<core::Null?>m = null;
+  field FutureOr<Null>m = null;
   synthetic constructor •() → self::_Class&Object&Mixin
     : super core::Object::•()
     ;
@@ -21,7 +21,7 @@
     : super self::_Class&Object&Mixin::•()
     ;
   method test(dynamic t1) → dynamic {
-    this.{self::Mixin::m} = t1 as{TypeError,ForDynamic,ForNonNullableByDefault} FutureOr<core::Null?>;
+    this.{self::Mixin::m} = t1 as{TypeError,ForDynamic,ForNonNullableByDefault} FutureOr<Null>;
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/mutual_subtype_norm.dart b/pkg/front_end/testcases/nnbd/mutual_subtype_norm.dart
new file mode 100644
index 0000000..598e59b
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/mutual_subtype_norm.dart
@@ -0,0 +1,33 @@
+// Copyright (c) 2020, 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:async';
+
+class A {
+  void method1() {}
+  FutureOr<void> method2() {}
+  FutureOr<void> method3() {}
+}
+
+class B {
+  void method1() {}
+  void method2() {}
+  FutureOr<void> method3() {}
+}
+
+class C implements A, B {
+  method1() {
+    return new Future<Null>.value(null); // error
+  }
+
+  method2() {
+    return new Future<Null>.value(null); // error
+  }
+
+  method3() {
+    return new Future<Null>.value(null); // ok
+  }
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/mutual_subtype_norm.dart.outline.expect b/pkg/front_end/testcases/nnbd/mutual_subtype_norm.dart.outline.expect
new file mode 100644
index 0000000..4e5e128
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/mutual_subtype_norm.dart.outline.expect
@@ -0,0 +1,38 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+import "dart:async";
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    ;
+  method method1() → void
+    ;
+  method method2() → FutureOr<void>
+    ;
+  method method3() → FutureOr<void>
+    ;
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    ;
+  method method1() → void
+    ;
+  method method2() → void
+    ;
+  method method3() → FutureOr<void>
+    ;
+}
+class C extends core::Object implements self::A, self::B {
+  synthetic constructor •() → self::C
+    ;
+  method method1() → void
+    ;
+  method method2() → void
+    ;
+  method method3() → FutureOr<void>
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/nnbd/mutual_subtype_norm.dart.strong.expect b/pkg/front_end/testcases/nnbd/mutual_subtype_norm.dart.strong.expect
new file mode 100644
index 0000000..b0cfefc
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/mutual_subtype_norm.dart.strong.expect
@@ -0,0 +1,53 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/mutual_subtype_norm.dart:21:16: Error: Can't return a value from a void function.
+//     return new Future<Null>.value(null); // error
+//                ^
+//
+// pkg/front_end/testcases/nnbd/mutual_subtype_norm.dart:25:16: Error: Can't return a value from a void function.
+//     return new Future<Null>.value(null); // error
+//                ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  method method1() → void {}
+  method method2() → FutureOr<void> {}
+  method method3() → FutureOr<void> {}
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+  method method1() → void {}
+  method method2() → void {}
+  method method3() → FutureOr<void> {}
+}
+class C extends core::Object implements self::A, self::B {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  method method1() → void {
+    return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/mutual_subtype_norm.dart:21:16: Error: Can't return a value from a void function.
+    return new Future<Null>.value(null); // error
+               ^" in asy::Future::value<Null>(null);
+  }
+  method method2() → void {
+    return let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/mutual_subtype_norm.dart:25:16: Error: Can't return a value from a void function.
+    return new Future<Null>.value(null); // error
+               ^" in asy::Future::value<Null>(null);
+  }
+  method method3() → FutureOr<void> {
+    return asy::Future::value<Null>(null);
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/mutual_subtype_norm.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/mutual_subtype_norm.dart.strong.transformed.expect
new file mode 100644
index 0000000..b0cfefc
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/mutual_subtype_norm.dart.strong.transformed.expect
@@ -0,0 +1,53 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/mutual_subtype_norm.dart:21:16: Error: Can't return a value from a void function.
+//     return new Future<Null>.value(null); // error
+//                ^
+//
+// pkg/front_end/testcases/nnbd/mutual_subtype_norm.dart:25:16: Error: Can't return a value from a void function.
+//     return new Future<Null>.value(null); // error
+//                ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  method method1() → void {}
+  method method2() → FutureOr<void> {}
+  method method3() → FutureOr<void> {}
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+  method method1() → void {}
+  method method2() → void {}
+  method method3() → FutureOr<void> {}
+}
+class C extends core::Object implements self::A, self::B {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  method method1() → void {
+    return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/mutual_subtype_norm.dart:21:16: Error: Can't return a value from a void function.
+    return new Future<Null>.value(null); // error
+               ^" in asy::Future::value<Null>(null);
+  }
+  method method2() → void {
+    return let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/mutual_subtype_norm.dart:25:16: Error: Can't return a value from a void function.
+    return new Future<Null>.value(null); // error
+               ^" in asy::Future::value<Null>(null);
+  }
+  method method3() → FutureOr<void> {
+    return asy::Future::value<Null>(null);
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/mutual_subtype_norm.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd/mutual_subtype_norm.dart.textual_outline.expect
new file mode 100644
index 0000000..1dcc43b
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/mutual_subtype_norm.dart.textual_outline.expect
@@ -0,0 +1,21 @@
+import 'dart:async';
+
+class A {
+  void method1() {}
+  FutureOr<void> method2() {}
+  FutureOr<void> method3() {}
+}
+
+class B {
+  void method1() {}
+  void method2() {}
+  FutureOr<void> method3() {}
+}
+
+class C implements A, B {
+  method1() {}
+  method2() {}
+  method3() {}
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/mutual_subtype_norm.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/nnbd/mutual_subtype_norm.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..ebbd5f2
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/mutual_subtype_norm.dart.textual_outline_modelled.expect
@@ -0,0 +1,21 @@
+import 'dart:async';
+
+class A {
+  FutureOr<void> method2() {}
+  FutureOr<void> method3() {}
+  void method1() {}
+}
+
+class B {
+  FutureOr<void> method3() {}
+  void method1() {}
+  void method2() {}
+}
+
+class C implements A, B {
+  method1() {}
+  method2() {}
+  method3() {}
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/mutual_subtype_norm.dart.weak.expect b/pkg/front_end/testcases/nnbd/mutual_subtype_norm.dart.weak.expect
new file mode 100644
index 0000000..b0cfefc
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/mutual_subtype_norm.dart.weak.expect
@@ -0,0 +1,53 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/mutual_subtype_norm.dart:21:16: Error: Can't return a value from a void function.
+//     return new Future<Null>.value(null); // error
+//                ^
+//
+// pkg/front_end/testcases/nnbd/mutual_subtype_norm.dart:25:16: Error: Can't return a value from a void function.
+//     return new Future<Null>.value(null); // error
+//                ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  method method1() → void {}
+  method method2() → FutureOr<void> {}
+  method method3() → FutureOr<void> {}
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+  method method1() → void {}
+  method method2() → void {}
+  method method3() → FutureOr<void> {}
+}
+class C extends core::Object implements self::A, self::B {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  method method1() → void {
+    return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/mutual_subtype_norm.dart:21:16: Error: Can't return a value from a void function.
+    return new Future<Null>.value(null); // error
+               ^" in asy::Future::value<Null>(null);
+  }
+  method method2() → void {
+    return let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/mutual_subtype_norm.dart:25:16: Error: Can't return a value from a void function.
+    return new Future<Null>.value(null); // error
+               ^" in asy::Future::value<Null>(null);
+  }
+  method method3() → FutureOr<void> {
+    return asy::Future::value<Null>(null);
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/mutual_subtype_norm.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/mutual_subtype_norm.dart.weak.transformed.expect
new file mode 100644
index 0000000..b0cfefc
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/mutual_subtype_norm.dart.weak.transformed.expect
@@ -0,0 +1,53 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/mutual_subtype_norm.dart:21:16: Error: Can't return a value from a void function.
+//     return new Future<Null>.value(null); // error
+//                ^
+//
+// pkg/front_end/testcases/nnbd/mutual_subtype_norm.dart:25:16: Error: Can't return a value from a void function.
+//     return new Future<Null>.value(null); // error
+//                ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  method method1() → void {}
+  method method2() → FutureOr<void> {}
+  method method3() → FutureOr<void> {}
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+  method method1() → void {}
+  method method2() → void {}
+  method method3() → FutureOr<void> {}
+}
+class C extends core::Object implements self::A, self::B {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  method method1() → void {
+    return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/mutual_subtype_norm.dart:21:16: Error: Can't return a value from a void function.
+    return new Future<Null>.value(null); // error
+               ^" in asy::Future::value<Null>(null);
+  }
+  method method2() → void {
+    return let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/mutual_subtype_norm.dart:25:16: Error: Can't return a value from a void function.
+    return new Future<Null>.value(null); // error
+               ^" in asy::Future::value<Null>(null);
+  }
+  method method3() → FutureOr<void> {
+    return asy::Future::value<Null>(null);
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/never_bound.dart.strong.expect b/pkg/front_end/testcases/nnbd/never_bound.dart.strong.expect
index 8d4563e..ab8cca2 100644
--- a/pkg/front_end/testcases/nnbd/never_bound.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/never_bound.dart.strong.expect
@@ -37,7 +37,7 @@
     return self::GenericNever::T;
 }
 static method errors() → dynamic {
-  new self::GenericNever::•<core::Null?>();
+  new self::GenericNever::•<Null>();
   new self::GenericNever::•<void>();
   new self::GenericNever::•<core::int>();
 }
diff --git a/pkg/front_end/testcases/nnbd/never_bound.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/never_bound.dart.strong.transformed.expect
index 8d4563e..ab8cca2 100644
--- a/pkg/front_end/testcases/nnbd/never_bound.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/never_bound.dart.strong.transformed.expect
@@ -37,7 +37,7 @@
     return self::GenericNever::T;
 }
 static method errors() → dynamic {
-  new self::GenericNever::•<core::Null?>();
+  new self::GenericNever::•<Null>();
   new self::GenericNever::•<void>();
   new self::GenericNever::•<core::int>();
 }
diff --git a/pkg/front_end/testcases/nnbd/never_bound.dart.weak.expect b/pkg/front_end/testcases/nnbd/never_bound.dart.weak.expect
index 8d4563e..ab8cca2 100644
--- a/pkg/front_end/testcases/nnbd/never_bound.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/never_bound.dart.weak.expect
@@ -37,7 +37,7 @@
     return self::GenericNever::T;
 }
 static method errors() → dynamic {
-  new self::GenericNever::•<core::Null?>();
+  new self::GenericNever::•<Null>();
   new self::GenericNever::•<void>();
   new self::GenericNever::•<core::int>();
 }
diff --git a/pkg/front_end/testcases/nnbd/never_bound.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/never_bound.dart.weak.transformed.expect
index 8d4563e..ab8cca2 100644
--- a/pkg/front_end/testcases/nnbd/never_bound.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/never_bound.dart.weak.transformed.expect
@@ -37,7 +37,7 @@
     return self::GenericNever::T;
 }
 static method errors() → dynamic {
-  new self::GenericNever::•<core::Null?>();
+  new self::GenericNever::•<Null>();
   new self::GenericNever::•<void>();
   new self::GenericNever::•<core::int>();
 }
diff --git a/pkg/front_end/testcases/nnbd/never_receiver.dart.strong.expect b/pkg/front_end/testcases/nnbd/never_receiver.dart.strong.expect
index 8a67b5a..1a136213 100644
--- a/pkg/front_end/testcases/nnbd/never_receiver.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/never_receiver.dart.strong.expect
@@ -76,16 +76,16 @@
   x.[]=(42, 42);
   x = x.+(1);
   x = x.+(1);
-  let final Never? #t1 = y in #t1.{core::Object::==}(null) ?{core::Null?} null : #t1{Never}.foo();
-  let final Never? #t2 = y in #t2.{core::Object::==}(null) ?{core::Null?} null : #t2{Never}.bar;
+  let final Never? #t1 = y in #t1.{core::Object::==}(null) ?{Null} null : #t1{Never}.foo();
+  let final Never? #t2 = y in #t2.{core::Object::==}(null) ?{Null} null : #t2{Never}.bar;
   let final Never? #t3 = y in #t3.{core::Object::==}(null) ?{core::int?} null : #t3{Never}.baz = 42;
-  let final Never? #t4 = y in #t4.{core::Object::==}(null) ?{core::Null?} null : #t4{Never}.call();
-  let final Never? #t5 = y in #t5.{core::Object::==}(null) ?{core::Null?} null : #t5{Never}.[](42);
+  let final Never? #t4 = y in #t4.{core::Object::==}(null) ?{Null} null : #t4{Never}.call();
+  let final Never? #t5 = y in #t5.{core::Object::==}(null) ?{Null} null : #t5{Never}.[](42);
   let final Never? #t6 = y in #t6.{core::Object::==}(null) ?{core::int?} null : #t6{Never}.[]=(42, 42);
-  let final Never #t7 = x in #t7.{core::Object::==}(null) ?{core::Null?} null : #t7.foo();
-  let final Never #t8 = x in #t8.{core::Object::==}(null) ?{core::Null?} null : #t8.bar;
+  let final Never #t7 = x in #t7.{core::Object::==}(null) ?{Null} null : #t7.foo();
+  let final Never #t8 = x in #t8.{core::Object::==}(null) ?{Null} null : #t8.bar;
   let final Never #t9 = x in #t9.{core::Object::==}(null) ?{core::int?} null : #t9.baz = 42;
-  let final Never #t10 = x in #t10.{core::Object::==}(null) ?{core::Null?} null : #t10.[](42);
+  let final Never #t10 = x in #t10.{core::Object::==}(null) ?{Null} null : #t10.[](42);
   let final Never #t11 = x in #t11.{core::Object::==}(null) ?{core::int?} null : #t11.[]=(42, 42);
   invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:30:5: Error: The method 'foo' isn't defined for the class 'Never?'.
 Try correcting the name to the name of an existing method, or defining a method named 'foo'.
diff --git a/pkg/front_end/testcases/nnbd/never_receiver.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/never_receiver.dart.strong.transformed.expect
index aa42b16..8078ed3 100644
--- a/pkg/front_end/testcases/nnbd/never_receiver.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/never_receiver.dart.strong.transformed.expect
@@ -76,16 +76,16 @@
   x.[]=(42, 42);
   x = x.+(1);
   x = x.+(1);
-  let final Never? #t1 = y in #t1.{core::Object::==}(null) ?{core::Null?} null : #t1{Never}.foo();
-  let final Never? #t2 = y in #t2.{core::Object::==}(null) ?{core::Null?} null : #t2{Never}.bar;
+  let final Never? #t1 = y in #t1.{core::Object::==}(null) ?{Null} null : #t1{Never}.foo();
+  let final Never? #t2 = y in #t2.{core::Object::==}(null) ?{Null} null : #t2{Never}.bar;
   let final Never? #t3 = y in #t3.{core::Object::==}(null) ?{core::int?} null : #t3{Never}.baz = 42;
-  let final Never? #t4 = y in #t4.{core::Object::==}(null) ?{core::Null?} null : #t4{Never}.call();
-  let final Never? #t5 = y in #t5.{core::Object::==}(null) ?{core::Null?} null : #t5{Never}.[](42);
+  let final Never? #t4 = y in #t4.{core::Object::==}(null) ?{Null} null : #t4{Never}.call();
+  let final Never? #t5 = y in #t5.{core::Object::==}(null) ?{Null} null : #t5{Never}.[](42);
   let final Never? #t6 = y in #t6.{core::Object::==}(null) ?{core::int?} null : #t6{Never}.[]=(42, 42);
-  let final Never #t7 = x in #t7.{core::Object::==}(null) ?{core::Null?} null : #t7.foo();
-  let final Never #t8 = x in #t8.{core::Object::==}(null) ?{core::Null?} null : #t8.bar;
+  let final Never #t7 = x in #t7.{core::Object::==}(null) ?{Null} null : #t7.foo();
+  let final Never #t8 = x in #t8.{core::Object::==}(null) ?{Null} null : #t8.bar;
   let final Never #t9 = x in #t9.{core::Object::==}(null) ?{core::int?} null : #t9.baz = 42;
-  let final Never #t10 = x in #t10.{core::Object::==}(null) ?{core::Null?} null : #t10.[](42);
+  let final Never #t10 = x in #t10.{core::Object::==}(null) ?{Null} null : #t10.[](42);
   let final Never #t11 = x in #t11.{core::Object::==}(null) ?{core::int?} null : #t11.[]=(42, 42);
   invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:30:5: Error: The method 'foo' isn't defined for the class 'Never?'.
 Try correcting the name to the name of an existing method, or defining a method named 'foo'.
diff --git a/pkg/front_end/testcases/nnbd/never_receiver.dart.weak.expect b/pkg/front_end/testcases/nnbd/never_receiver.dart.weak.expect
index ea4279d..8460d43 100644
--- a/pkg/front_end/testcases/nnbd/never_receiver.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/never_receiver.dart.weak.expect
@@ -77,16 +77,16 @@
   (let final Never #t10 = x in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).[]=(42, 42);
   let final Never #t11 = x = let final Never #t12 = (let final Never #t13 = x in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).+(1) in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.") in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
   let final Never #t14 = x = let final Never #t15 = (let final Never #t16 = x in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).+(1) in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.") in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
-  let final Never? #t17 = y in #t17.{core::Object::==}(null) ?{core::Null?} null : let final Never #t18 = (let final Never #t19 = #t17{Never} in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).foo() in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
-  let final Never? #t20 = y in #t20.{core::Object::==}(null) ?{core::Null?} null : let final Never #t21 = (let final Never #t22 = #t20{Never} in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).bar in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  let final Never? #t17 = y in #t17.{core::Object::==}(null) ?{Null} null : let final Never #t18 = (let final Never #t19 = #t17{Never} in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).foo() in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  let final Never? #t20 = y in #t20.{core::Object::==}(null) ?{Null} null : let final Never #t21 = (let final Never #t22 = #t20{Never} in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).bar in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
   let final Never? #t23 = y in #t23.{core::Object::==}(null) ?{core::int?} null : (let final Never #t24 = #t23{Never} in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).baz = 42;
-  let final Never? #t25 = y in #t25.{core::Object::==}(null) ?{core::Null?} null : let final Never #t26 = (let final Never #t27 = #t25{Never} in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).call() in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
-  let final Never? #t28 = y in #t28.{core::Object::==}(null) ?{core::Null?} null : let final Never #t29 = (let final Never #t30 = #t28{Never} in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).[](42) in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  let final Never? #t25 = y in #t25.{core::Object::==}(null) ?{Null} null : let final Never #t26 = (let final Never #t27 = #t25{Never} in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).call() in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  let final Never? #t28 = y in #t28.{core::Object::==}(null) ?{Null} null : let final Never #t29 = (let final Never #t30 = #t28{Never} in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).[](42) in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
   let final Never? #t31 = y in #t31.{core::Object::==}(null) ?{core::int?} null : (let final Never #t32 = #t31{Never} in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).[]=(42, 42);
-  let final Never #t33 = let final Never #t34 = x in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.") in #t33.{core::Object::==}(null) ?{core::Null?} null : let final Never #t35 = (let final Never #t36 = #t33 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).foo() in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
-  let final Never #t37 = let final Never #t38 = x in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.") in #t37.{core::Object::==}(null) ?{core::Null?} null : let final Never #t39 = (let final Never #t40 = #t37 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).bar in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  let final Never #t33 = let final Never #t34 = x in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.") in #t33.{core::Object::==}(null) ?{Null} null : let final Never #t35 = (let final Never #t36 = #t33 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).foo() in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  let final Never #t37 = let final Never #t38 = x in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.") in #t37.{core::Object::==}(null) ?{Null} null : let final Never #t39 = (let final Never #t40 = #t37 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).bar in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
   let final Never #t41 = let final Never #t42 = x in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.") in #t41.{core::Object::==}(null) ?{core::int?} null : (let final Never #t43 = #t41 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).baz = 42;
-  let final Never #t44 = let final Never #t45 = x in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.") in #t44.{core::Object::==}(null) ?{core::Null?} null : let final Never #t46 = (let final Never #t47 = #t44 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).[](42) in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  let final Never #t44 = let final Never #t45 = x in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.") in #t44.{core::Object::==}(null) ?{Null} null : let final Never #t46 = (let final Never #t47 = #t44 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).[](42) in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
   let final Never #t48 = let final Never #t49 = x in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.") in #t48.{core::Object::==}(null) ?{core::int?} null : (let final Never #t50 = #t48 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).[]=(42, 42);
   invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:30:5: Error: The method 'foo' isn't defined for the class 'Never?'.
 Try correcting the name to the name of an existing method, or defining a method named 'foo'.
diff --git a/pkg/front_end/testcases/nnbd/never_receiver.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/never_receiver.dart.weak.transformed.expect
index d677ad0..7e2c429 100644
--- a/pkg/front_end/testcases/nnbd/never_receiver.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/never_receiver.dart.weak.transformed.expect
@@ -77,16 +77,16 @@
   (let final Never #t10 = x in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).[]=(42, 42);
   let final Never #t11 = x = let final Never #t12 = (let final Never #t13 = x in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).+(1) in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.") in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
   let final Never #t14 = x = let final Never #t15 = (let final Never #t16 = x in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).+(1) in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.") in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
-  let final Never? #t17 = y in #t17.{core::Object::==}(null) ?{core::Null?} null : let final Never #t18 = (let final Never #t19 = #t17{Never} in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).foo() in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
-  let final Never? #t20 = y in #t20.{core::Object::==}(null) ?{core::Null?} null : let final Never #t21 = (let final Never #t22 = #t20{Never} in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).bar in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  let final Never? #t17 = y in #t17.{core::Object::==}(null) ?{Null} null : let final Never #t18 = (let final Never #t19 = #t17{Never} in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).foo() in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  let final Never? #t20 = y in #t20.{core::Object::==}(null) ?{Null} null : let final Never #t21 = (let final Never #t22 = #t20{Never} in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).bar in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
   let final Never? #t23 = y in #t23.{core::Object::==}(null) ?{core::int?} null : (let final Never #t24 = #t23{Never} in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).baz = 42;
-  let final Never? #t25 = y in #t25.{core::Object::==}(null) ?{core::Null?} null : let final Never #t26 = (let final Never #t27 = #t25{Never} in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).call() in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
-  let final Never? #t28 = y in #t28.{core::Object::==}(null) ?{core::Null?} null : let final Never #t29 = (let final Never #t30 = #t28{Never} in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).[](42) in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  let final Never? #t25 = y in #t25.{core::Object::==}(null) ?{Null} null : let final Never #t26 = (let final Never #t27 = #t25{Never} in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).call() in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  let final Never? #t28 = y in #t28.{core::Object::==}(null) ?{Null} null : let final Never #t29 = (let final Never #t30 = #t28{Never} in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).[](42) in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
   let final Never? #t31 = y in #t31.{core::Object::==}(null) ?{core::int?} null : (let final Never #t32 = #t31{Never} in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).[]=(42, 42);
-  let final Never #t33 = let final Never #t34 = x in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.") in #t33.{core::Object::==}(null) ?{core::Null?} null : let final Never #t35 = (let final Never #t36 = #t33 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).foo() in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
-  let final Never #t37 = let final Never #t38 = x in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.") in #t37.{core::Object::==}(null) ?{core::Null?} null : let final Never #t39 = (let final Never #t40 = #t37 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).bar in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  let final Never #t33 = let final Never #t34 = x in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.") in #t33.{core::Object::==}(null) ?{Null} null : let final Never #t35 = (let final Never #t36 = #t33 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).foo() in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  let final Never #t37 = let final Never #t38 = x in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.") in #t37.{core::Object::==}(null) ?{Null} null : let final Never #t39 = (let final Never #t40 = #t37 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).bar in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
   let final Never #t41 = let final Never #t42 = x in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.") in #t41.{core::Object::==}(null) ?{core::int?} null : (let final Never #t43 = #t41 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).baz = 42;
-  let final Never #t44 = let final Never #t45 = x in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.") in #t44.{core::Object::==}(null) ?{core::Null?} null : let final Never #t46 = (let final Never #t47 = #t44 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).[](42) in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  let final Never #t44 = let final Never #t45 = x in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.") in #t44.{core::Object::==}(null) ?{Null} null : let final Never #t46 = (let final Never #t47 = #t44 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).[](42) in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
   let final Never #t48 = let final Never #t49 = x in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.") in #t48.{core::Object::==}(null) ?{core::int?} null : (let final Never #t50 = #t48 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).[]=(42, 42);
   invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:30:5: Error: The method 'foo' isn't defined for the class 'Never?'.
 Try correcting the name to the name of an existing method, or defining a method named 'foo'.
diff --git a/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.outline.expect b/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.outline.expect
index 296454f..03d3614 100644
--- a/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.outline.expect
@@ -55,7 +55,7 @@
   generic-covariant-impl field self::C::X? fieldOfX;
   field core::int? fieldOfX2;
   field dynamic fieldOfX3;
-  field core::Null? fieldOfX4;
+  field Null fieldOfX4;
   field () →? core::int fieldOfX5;
   generic-covariant-impl field self::C::Y? fieldOfX6;
   late static field core::int lateStaticFieldOfC;
@@ -74,7 +74,7 @@
   generic-covariant-impl field self::L::X? fieldOfL;
   field core::int? fieldOfL2;
   field dynamic fieldOfL3;
-  field core::Null? fieldOfL4;
+  field Null fieldOfL4;
   field () →? core::int fieldOfL5;
   generic-covariant-impl field self::L::Y? fieldOfL6;
   late static field core::int lateStaticFieldOfM;
diff --git a/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.strong.expect b/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.strong.expect
index 344ba8c..e9ee16a 100644
--- a/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.strong.expect
@@ -93,7 +93,7 @@
   generic-covariant-impl field self::C::X? fieldOfX = null;
   field core::int? fieldOfX2 = null;
   field dynamic fieldOfX3 = null;
-  field core::Null? fieldOfX4 = null;
+  field Null fieldOfX4 = null;
   field () →? core::int fieldOfX5 = null;
   generic-covariant-impl field self::C::Y? fieldOfX6 = null;
   late static field core::int lateStaticFieldOfC;
@@ -114,7 +114,7 @@
   generic-covariant-impl field self::L::X? fieldOfL = null;
   field core::int? fieldOfL2 = null;
   field dynamic fieldOfL3 = null;
-  field core::Null? fieldOfL4 = null;
+  field Null fieldOfL4 = null;
   field () →? core::int fieldOfL5 = null;
   generic-covariant-impl field self::L::Y? fieldOfL6 = null;
   late static field core::int lateStaticFieldOfM;
diff --git a/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.strong.transformed.expect
index 344ba8c..e9ee16a 100644
--- a/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.strong.transformed.expect
@@ -93,7 +93,7 @@
   generic-covariant-impl field self::C::X? fieldOfX = null;
   field core::int? fieldOfX2 = null;
   field dynamic fieldOfX3 = null;
-  field core::Null? fieldOfX4 = null;
+  field Null fieldOfX4 = null;
   field () →? core::int fieldOfX5 = null;
   generic-covariant-impl field self::C::Y? fieldOfX6 = null;
   late static field core::int lateStaticFieldOfC;
@@ -114,7 +114,7 @@
   generic-covariant-impl field self::L::X? fieldOfL = null;
   field core::int? fieldOfL2 = null;
   field dynamic fieldOfL3 = null;
-  field core::Null? fieldOfL4 = null;
+  field Null fieldOfL4 = null;
   field () →? core::int fieldOfL5 = null;
   generic-covariant-impl field self::L::Y? fieldOfL6 = null;
   late static field core::int lateStaticFieldOfM;
diff --git a/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.weak.expect b/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.weak.expect
index 344ba8c..e9ee16a 100644
--- a/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.weak.expect
@@ -93,7 +93,7 @@
   generic-covariant-impl field self::C::X? fieldOfX = null;
   field core::int? fieldOfX2 = null;
   field dynamic fieldOfX3 = null;
-  field core::Null? fieldOfX4 = null;
+  field Null fieldOfX4 = null;
   field () →? core::int fieldOfX5 = null;
   generic-covariant-impl field self::C::Y? fieldOfX6 = null;
   late static field core::int lateStaticFieldOfC;
@@ -114,7 +114,7 @@
   generic-covariant-impl field self::L::X? fieldOfL = null;
   field core::int? fieldOfL2 = null;
   field dynamic fieldOfL3 = null;
-  field core::Null? fieldOfL4 = null;
+  field Null fieldOfL4 = null;
   field () →? core::int fieldOfL5 = null;
   generic-covariant-impl field self::L::Y? fieldOfL6 = null;
   late static field core::int lateStaticFieldOfM;
diff --git a/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.weak.transformed.expect
index 344ba8c..e9ee16a 100644
--- a/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.weak.transformed.expect
@@ -93,7 +93,7 @@
   generic-covariant-impl field self::C::X? fieldOfX = null;
   field core::int? fieldOfX2 = null;
   field dynamic fieldOfX3 = null;
-  field core::Null? fieldOfX4 = null;
+  field Null fieldOfX4 = null;
   field () →? core::int fieldOfX5 = null;
   generic-covariant-impl field self::C::Y? fieldOfX6 = null;
   late static field core::int lateStaticFieldOfC;
@@ -114,7 +114,7 @@
   generic-covariant-impl field self::L::X? fieldOfL = null;
   field core::int? fieldOfL2 = null;
   field dynamic fieldOfL3 = null;
-  field core::Null? fieldOfL4 = null;
+  field Null fieldOfL4 = null;
   field () →? core::int fieldOfL5 = null;
   generic-covariant-impl field self::L::Y? fieldOfL6 = null;
   late static field core::int lateStaticFieldOfM;
diff --git a/pkg/front_end/testcases/nnbd/not_definitely_unassigned_late_local_variables.dart.strong.expect b/pkg/front_end/testcases/nnbd/not_definitely_unassigned_late_local_variables.dart.strong.expect
index 81553c6..56259bd 100644
--- a/pkg/front_end/testcases/nnbd/not_definitely_unassigned_late_local_variables.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/not_definitely_unassigned_late_local_variables.dart.strong.expect
@@ -12,11 +12,11 @@
   method foo() → dynamic {
     late self::A::T% value;
     late core::int intValue;
-    () → core::Null? result = () → core::Null? {
+    () → Null result = () → Null {
       this.{self::A::bar}(value);
       this.{self::A::barInt}(intValue);
     };
-    (() → core::Null? {
+    (() → Null {
       value = this.{self::A::baz}();
       intValue = 42;
     }).call();
diff --git a/pkg/front_end/testcases/nnbd/not_definitely_unassigned_late_local_variables.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/not_definitely_unassigned_late_local_variables.dart.strong.transformed.expect
index 81553c6..56259bd 100644
--- a/pkg/front_end/testcases/nnbd/not_definitely_unassigned_late_local_variables.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/not_definitely_unassigned_late_local_variables.dart.strong.transformed.expect
@@ -12,11 +12,11 @@
   method foo() → dynamic {
     late self::A::T% value;
     late core::int intValue;
-    () → core::Null? result = () → core::Null? {
+    () → Null result = () → Null {
       this.{self::A::bar}(value);
       this.{self::A::barInt}(intValue);
     };
-    (() → core::Null? {
+    (() → Null {
       value = this.{self::A::baz}();
       intValue = 42;
     }).call();
diff --git a/pkg/front_end/testcases/nnbd/not_definitely_unassigned_late_local_variables.dart.weak.expect b/pkg/front_end/testcases/nnbd/not_definitely_unassigned_late_local_variables.dart.weak.expect
index 81553c6..56259bd 100644
--- a/pkg/front_end/testcases/nnbd/not_definitely_unassigned_late_local_variables.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/not_definitely_unassigned_late_local_variables.dart.weak.expect
@@ -12,11 +12,11 @@
   method foo() → dynamic {
     late self::A::T% value;
     late core::int intValue;
-    () → core::Null? result = () → core::Null? {
+    () → Null result = () → Null {
       this.{self::A::bar}(value);
       this.{self::A::barInt}(intValue);
     };
-    (() → core::Null? {
+    (() → Null {
       value = this.{self::A::baz}();
       intValue = 42;
     }).call();
diff --git a/pkg/front_end/testcases/nnbd/not_definitely_unassigned_late_local_variables.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/not_definitely_unassigned_late_local_variables.dart.weak.transformed.expect
index 81553c6..56259bd 100644
--- a/pkg/front_end/testcases/nnbd/not_definitely_unassigned_late_local_variables.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/not_definitely_unassigned_late_local_variables.dart.weak.transformed.expect
@@ -12,11 +12,11 @@
   method foo() → dynamic {
     late self::A::T% value;
     late core::int intValue;
-    () → core::Null? result = () → core::Null? {
+    () → Null result = () → Null {
       this.{self::A::bar}(value);
       this.{self::A::barInt}(intValue);
     };
-    (() → core::Null? {
+    (() → Null {
       value = this.{self::A::baz}();
       intValue = 42;
     }).call();
diff --git a/pkg/front_end/testcases/nnbd/null_aware_static_access.dart b/pkg/front_end/testcases/nnbd/null_aware_static_access.dart
new file mode 100644
index 0000000..62eca0d
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/null_aware_static_access.dart
@@ -0,0 +1,30 @@
+// Copyright (c) 2020, 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.
+
+class C {
+  static int get staticMember => 0;
+  static void set staticMember(int value) {}
+  static int? get staticMember2 => 0;
+  static void set staticMember2(int? value) {}
+  static void staticMethod() {}
+
+  static List<int> get property => [0];
+  static Map<int, int?> get property2 => {};
+}
+
+void main() {
+  C?.staticMember;
+  C?.staticMember;
+  C?.staticMember = 42;
+  C?.staticMethod();
+  C?.staticMember.isEven;
+  C?.staticMember.toString();
+  C?.property[0];
+  C?.property[0] = 0;
+  C?.property2[0] ??= 0;
+  C?.staticMember2 ??= 42;
+  C?.staticMember += 2;
+  C?.staticMember++;
+  --C?.staticMember;
+}
diff --git a/pkg/front_end/testcases/nnbd/null_aware_static_access.dart.outline.expect b/pkg/front_end/testcases/nnbd/null_aware_static_access.dart.outline.expect
new file mode 100644
index 0000000..c2596b9
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/null_aware_static_access.dart.outline.expect
@@ -0,0 +1,24 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C
+    ;
+  static get staticMember() → core::int
+    ;
+  static set staticMember(core::int value) → void
+    ;
+  static get staticMember2() → core::int?
+    ;
+  static set staticMember2(core::int? value) → void
+    ;
+  static method staticMethod() → void
+    ;
+  static get property() → core::List<core::int>
+    ;
+  static get property2() → core::Map<core::int, core::int?>
+    ;
+}
+static method main() → void
+  ;
diff --git a/pkg/front_end/testcases/nnbd/null_aware_static_access.dart.strong.expect b/pkg/front_end/testcases/nnbd/null_aware_static_access.dart.strong.expect
new file mode 100644
index 0000000..df91c3c
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/null_aware_static_access.dart.strong.expect
@@ -0,0 +1,98 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/null_aware_static_access.dart:17:3: Warning: The class 'C' cannot be null.
+// Try replacing '?.' with '.'
+//   C?.staticMember;
+//   ^
+//
+// pkg/front_end/testcases/nnbd/null_aware_static_access.dart:18:3: Warning: The class 'C' cannot be null.
+// Try replacing '?.' with '.'
+//   C?.staticMember;
+//   ^
+//
+// pkg/front_end/testcases/nnbd/null_aware_static_access.dart:19:3: Warning: The class 'C' cannot be null.
+// Try replacing '?.' with '.'
+//   C?.staticMember = 42;
+//   ^
+//
+// pkg/front_end/testcases/nnbd/null_aware_static_access.dart:21:3: Warning: The class 'C' cannot be null.
+// Try replacing '?.' with '.'
+//   C?.staticMember.isEven;
+//   ^
+//
+// pkg/front_end/testcases/nnbd/null_aware_static_access.dart:22:3: Warning: The class 'C' cannot be null.
+// Try replacing '?.' with '.'
+//   C?.staticMember.toString();
+//   ^
+//
+// pkg/front_end/testcases/nnbd/null_aware_static_access.dart:23:3: Warning: The class 'C' cannot be null.
+// Try replacing '?.' with '.'
+//   C?.property[0];
+//   ^
+//
+// pkg/front_end/testcases/nnbd/null_aware_static_access.dart:24:3: Warning: The class 'C' cannot be null.
+// Try replacing '?.' with '.'
+//   C?.property[0] = 0;
+//   ^
+//
+// pkg/front_end/testcases/nnbd/null_aware_static_access.dart:25:3: Warning: The class 'C' cannot be null.
+// Try replacing '?.' with '.'
+//   C?.property2[0] ??= 0;
+//   ^
+//
+// pkg/front_end/testcases/nnbd/null_aware_static_access.dart:26:3: Warning: The class 'C' cannot be null.
+// Try replacing '?.' with '.'
+//   C?.staticMember2 ??= 42;
+//   ^
+//
+// pkg/front_end/testcases/nnbd/null_aware_static_access.dart:27:3: Warning: The class 'C' cannot be null.
+// Try replacing '?.' with '.'
+//   C?.staticMember += 2;
+//   ^
+//
+// pkg/front_end/testcases/nnbd/null_aware_static_access.dart:28:3: Warning: The class 'C' cannot be null.
+// Try replacing '?.' with '.'
+//   C?.staticMember++;
+//   ^
+//
+// pkg/front_end/testcases/nnbd/null_aware_static_access.dart:29:5: Warning: The class 'C' cannot be null.
+// Try replacing '?.' with '.'
+//   --C?.staticMember;
+//     ^
+//
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  static get staticMember() → core::int
+    return 0;
+  static set staticMember(core::int value) → void {}
+  static get staticMember2() → core::int?
+    return 0;
+  static set staticMember2(core::int? value) → void {}
+  static method staticMethod() → void {}
+  static get property() → core::List<core::int>
+    return <core::int>[0];
+  static get property2() → core::Map<core::int, core::int?>
+    return <core::int, core::int?>{};
+}
+static method main() → void {
+  self::C::staticMember;
+  self::C::staticMember;
+  self::C::staticMember = 42;
+  self::C::staticMethod();
+  self::C::staticMember.{core::int::isEven};
+  self::C::staticMember.{core::int::toString}();
+  self::C::property.{core::List::[]}(0);
+  self::C::property.{core::List::[]=}(0, 0);
+  let final core::Map<core::int, core::int?> #t1 = self::C::property2 in let final core::int #t2 = 0 in #t1.{core::Map::[]}(#t2).{core::num::==}(null) ?{core::int} #t1.{core::Map::[]=}(#t2, 0) : null;
+  self::C::staticMember2.{core::num::==}(null) ?{core::int} self::C::staticMember2 = 42 : null;
+  self::C::staticMember = self::C::staticMember.{core::num::+}(2);
+  self::C::staticMember = self::C::staticMember.{core::num::+}(1);
+  self::C::staticMember = self::C::staticMember.{core::num::-}(1);
+}
diff --git a/pkg/front_end/testcases/nnbd/null_aware_static_access.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/null_aware_static_access.dart.strong.transformed.expect
new file mode 100644
index 0000000..5af0f3e
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/null_aware_static_access.dart.strong.transformed.expect
@@ -0,0 +1,104 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/null_aware_static_access.dart:17:3: Warning: The class 'C' cannot be null.
+// Try replacing '?.' with '.'
+//   C?.staticMember;
+//   ^
+//
+// pkg/front_end/testcases/nnbd/null_aware_static_access.dart:18:3: Warning: The class 'C' cannot be null.
+// Try replacing '?.' with '.'
+//   C?.staticMember;
+//   ^
+//
+// pkg/front_end/testcases/nnbd/null_aware_static_access.dart:19:3: Warning: The class 'C' cannot be null.
+// Try replacing '?.' with '.'
+//   C?.staticMember = 42;
+//   ^
+//
+// pkg/front_end/testcases/nnbd/null_aware_static_access.dart:21:3: Warning: The class 'C' cannot be null.
+// Try replacing '?.' with '.'
+//   C?.staticMember.isEven;
+//   ^
+//
+// pkg/front_end/testcases/nnbd/null_aware_static_access.dart:22:3: Warning: The class 'C' cannot be null.
+// Try replacing '?.' with '.'
+//   C?.staticMember.toString();
+//   ^
+//
+// pkg/front_end/testcases/nnbd/null_aware_static_access.dart:23:3: Warning: The class 'C' cannot be null.
+// Try replacing '?.' with '.'
+//   C?.property[0];
+//   ^
+//
+// pkg/front_end/testcases/nnbd/null_aware_static_access.dart:24:3: Warning: The class 'C' cannot be null.
+// Try replacing '?.' with '.'
+//   C?.property[0] = 0;
+//   ^
+//
+// pkg/front_end/testcases/nnbd/null_aware_static_access.dart:25:3: Warning: The class 'C' cannot be null.
+// Try replacing '?.' with '.'
+//   C?.property2[0] ??= 0;
+//   ^
+//
+// pkg/front_end/testcases/nnbd/null_aware_static_access.dart:26:3: Warning: The class 'C' cannot be null.
+// Try replacing '?.' with '.'
+//   C?.staticMember2 ??= 42;
+//   ^
+//
+// pkg/front_end/testcases/nnbd/null_aware_static_access.dart:27:3: Warning: The class 'C' cannot be null.
+// Try replacing '?.' with '.'
+//   C?.staticMember += 2;
+//   ^
+//
+// pkg/front_end/testcases/nnbd/null_aware_static_access.dart:28:3: Warning: The class 'C' cannot be null.
+// Try replacing '?.' with '.'
+//   C?.staticMember++;
+//   ^
+//
+// pkg/front_end/testcases/nnbd/null_aware_static_access.dart:29:5: Warning: The class 'C' cannot be null.
+// Try replacing '?.' with '.'
+//   --C?.staticMember;
+//     ^
+//
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  static get staticMember() → core::int
+    return 0;
+  static set staticMember(core::int value) → void {}
+  static get staticMember2() → core::int?
+    return 0;
+  static set staticMember2(core::int? value) → void {}
+  static method staticMethod() → void {}
+  static get property() → core::List<core::int>
+    return <core::int>[0];
+  static get property2() → core::Map<core::int, core::int?>
+    return <core::int, core::int?>{};
+}
+static method main() → void {
+  self::C::staticMember;
+  self::C::staticMember;
+  self::C::staticMember = 42;
+  self::C::staticMethod();
+  self::C::staticMember.{core::int::isEven};
+  self::C::staticMember.{core::int::toString}();
+  self::C::property.{core::List::[]}(0);
+  self::C::property.{core::List::[]=}(0, 0);
+  let final core::Map<core::int, core::int?> #t1 = self::C::property2 in let final core::int #t2 = 0 in #t1.{core::Map::[]}(#t2).{core::num::==}(null) ?{core::int} #t1.{core::Map::[]=}(#t2, 0) : null;
+  self::C::staticMember2.{core::num::==}(null) ?{core::int} self::C::staticMember2 = 42 : null;
+  self::C::staticMember = self::C::staticMember.{core::num::+}(2);
+  self::C::staticMember = self::C::staticMember.{core::num::+}(1);
+  self::C::staticMember = self::C::staticMember.{core::num::-}(1);
+}
+
+
+Extra constant evaluation status:
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware_static_access.dart:25:16 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware_static_access.dart:25:16 -> IntConstant(0)
+Extra constant evaluation: evaluated: 38, effectively constant: 2
diff --git a/pkg/front_end/testcases/nnbd/null_aware_static_access.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd/null_aware_static_access.dart.textual_outline.expect
new file mode 100644
index 0000000..7871be6
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/null_aware_static_access.dart.textual_outline.expect
@@ -0,0 +1,11 @@
+class C {
+  static int get staticMember => 0;
+  static void set staticMember(int value) {}
+  static int? get staticMember2 => 0;
+  static void set staticMember2(int? value) {}
+  static void staticMethod() {}
+  static List<int> get property => [0];
+  static Map<int, int?> get property2 => {};
+}
+
+void main() {}
diff --git a/pkg/front_end/testcases/nnbd/null_aware_static_access.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/nnbd/null_aware_static_access.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..f1e61b6
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/null_aware_static_access.dart.textual_outline_modelled.expect
@@ -0,0 +1,11 @@
+class C {
+  static List<int> get property => [0];
+  static Map<int, int?> get property2 => {};
+  static int? get staticMember2 => 0;
+  static int get staticMember => 0;
+  static void set staticMember(int value) {}
+  static void set staticMember2(int? value) {}
+  static void staticMethod() {}
+}
+
+void main() {}
diff --git a/pkg/front_end/testcases/nnbd/null_aware_static_access.dart.weak.expect b/pkg/front_end/testcases/nnbd/null_aware_static_access.dart.weak.expect
new file mode 100644
index 0000000..df91c3c
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/null_aware_static_access.dart.weak.expect
@@ -0,0 +1,98 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/null_aware_static_access.dart:17:3: Warning: The class 'C' cannot be null.
+// Try replacing '?.' with '.'
+//   C?.staticMember;
+//   ^
+//
+// pkg/front_end/testcases/nnbd/null_aware_static_access.dart:18:3: Warning: The class 'C' cannot be null.
+// Try replacing '?.' with '.'
+//   C?.staticMember;
+//   ^
+//
+// pkg/front_end/testcases/nnbd/null_aware_static_access.dart:19:3: Warning: The class 'C' cannot be null.
+// Try replacing '?.' with '.'
+//   C?.staticMember = 42;
+//   ^
+//
+// pkg/front_end/testcases/nnbd/null_aware_static_access.dart:21:3: Warning: The class 'C' cannot be null.
+// Try replacing '?.' with '.'
+//   C?.staticMember.isEven;
+//   ^
+//
+// pkg/front_end/testcases/nnbd/null_aware_static_access.dart:22:3: Warning: The class 'C' cannot be null.
+// Try replacing '?.' with '.'
+//   C?.staticMember.toString();
+//   ^
+//
+// pkg/front_end/testcases/nnbd/null_aware_static_access.dart:23:3: Warning: The class 'C' cannot be null.
+// Try replacing '?.' with '.'
+//   C?.property[0];
+//   ^
+//
+// pkg/front_end/testcases/nnbd/null_aware_static_access.dart:24:3: Warning: The class 'C' cannot be null.
+// Try replacing '?.' with '.'
+//   C?.property[0] = 0;
+//   ^
+//
+// pkg/front_end/testcases/nnbd/null_aware_static_access.dart:25:3: Warning: The class 'C' cannot be null.
+// Try replacing '?.' with '.'
+//   C?.property2[0] ??= 0;
+//   ^
+//
+// pkg/front_end/testcases/nnbd/null_aware_static_access.dart:26:3: Warning: The class 'C' cannot be null.
+// Try replacing '?.' with '.'
+//   C?.staticMember2 ??= 42;
+//   ^
+//
+// pkg/front_end/testcases/nnbd/null_aware_static_access.dart:27:3: Warning: The class 'C' cannot be null.
+// Try replacing '?.' with '.'
+//   C?.staticMember += 2;
+//   ^
+//
+// pkg/front_end/testcases/nnbd/null_aware_static_access.dart:28:3: Warning: The class 'C' cannot be null.
+// Try replacing '?.' with '.'
+//   C?.staticMember++;
+//   ^
+//
+// pkg/front_end/testcases/nnbd/null_aware_static_access.dart:29:5: Warning: The class 'C' cannot be null.
+// Try replacing '?.' with '.'
+//   --C?.staticMember;
+//     ^
+//
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  static get staticMember() → core::int
+    return 0;
+  static set staticMember(core::int value) → void {}
+  static get staticMember2() → core::int?
+    return 0;
+  static set staticMember2(core::int? value) → void {}
+  static method staticMethod() → void {}
+  static get property() → core::List<core::int>
+    return <core::int>[0];
+  static get property2() → core::Map<core::int, core::int?>
+    return <core::int, core::int?>{};
+}
+static method main() → void {
+  self::C::staticMember;
+  self::C::staticMember;
+  self::C::staticMember = 42;
+  self::C::staticMethod();
+  self::C::staticMember.{core::int::isEven};
+  self::C::staticMember.{core::int::toString}();
+  self::C::property.{core::List::[]}(0);
+  self::C::property.{core::List::[]=}(0, 0);
+  let final core::Map<core::int, core::int?> #t1 = self::C::property2 in let final core::int #t2 = 0 in #t1.{core::Map::[]}(#t2).{core::num::==}(null) ?{core::int} #t1.{core::Map::[]=}(#t2, 0) : null;
+  self::C::staticMember2.{core::num::==}(null) ?{core::int} self::C::staticMember2 = 42 : null;
+  self::C::staticMember = self::C::staticMember.{core::num::+}(2);
+  self::C::staticMember = self::C::staticMember.{core::num::+}(1);
+  self::C::staticMember = self::C::staticMember.{core::num::-}(1);
+}
diff --git a/pkg/front_end/testcases/nnbd/null_aware_static_access.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/null_aware_static_access.dart.weak.transformed.expect
new file mode 100644
index 0000000..5af0f3e
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/null_aware_static_access.dart.weak.transformed.expect
@@ -0,0 +1,104 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/null_aware_static_access.dart:17:3: Warning: The class 'C' cannot be null.
+// Try replacing '?.' with '.'
+//   C?.staticMember;
+//   ^
+//
+// pkg/front_end/testcases/nnbd/null_aware_static_access.dart:18:3: Warning: The class 'C' cannot be null.
+// Try replacing '?.' with '.'
+//   C?.staticMember;
+//   ^
+//
+// pkg/front_end/testcases/nnbd/null_aware_static_access.dart:19:3: Warning: The class 'C' cannot be null.
+// Try replacing '?.' with '.'
+//   C?.staticMember = 42;
+//   ^
+//
+// pkg/front_end/testcases/nnbd/null_aware_static_access.dart:21:3: Warning: The class 'C' cannot be null.
+// Try replacing '?.' with '.'
+//   C?.staticMember.isEven;
+//   ^
+//
+// pkg/front_end/testcases/nnbd/null_aware_static_access.dart:22:3: Warning: The class 'C' cannot be null.
+// Try replacing '?.' with '.'
+//   C?.staticMember.toString();
+//   ^
+//
+// pkg/front_end/testcases/nnbd/null_aware_static_access.dart:23:3: Warning: The class 'C' cannot be null.
+// Try replacing '?.' with '.'
+//   C?.property[0];
+//   ^
+//
+// pkg/front_end/testcases/nnbd/null_aware_static_access.dart:24:3: Warning: The class 'C' cannot be null.
+// Try replacing '?.' with '.'
+//   C?.property[0] = 0;
+//   ^
+//
+// pkg/front_end/testcases/nnbd/null_aware_static_access.dart:25:3: Warning: The class 'C' cannot be null.
+// Try replacing '?.' with '.'
+//   C?.property2[0] ??= 0;
+//   ^
+//
+// pkg/front_end/testcases/nnbd/null_aware_static_access.dart:26:3: Warning: The class 'C' cannot be null.
+// Try replacing '?.' with '.'
+//   C?.staticMember2 ??= 42;
+//   ^
+//
+// pkg/front_end/testcases/nnbd/null_aware_static_access.dart:27:3: Warning: The class 'C' cannot be null.
+// Try replacing '?.' with '.'
+//   C?.staticMember += 2;
+//   ^
+//
+// pkg/front_end/testcases/nnbd/null_aware_static_access.dart:28:3: Warning: The class 'C' cannot be null.
+// Try replacing '?.' with '.'
+//   C?.staticMember++;
+//   ^
+//
+// pkg/front_end/testcases/nnbd/null_aware_static_access.dart:29:5: Warning: The class 'C' cannot be null.
+// Try replacing '?.' with '.'
+//   --C?.staticMember;
+//     ^
+//
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  static get staticMember() → core::int
+    return 0;
+  static set staticMember(core::int value) → void {}
+  static get staticMember2() → core::int?
+    return 0;
+  static set staticMember2(core::int? value) → void {}
+  static method staticMethod() → void {}
+  static get property() → core::List<core::int>
+    return <core::int>[0];
+  static get property2() → core::Map<core::int, core::int?>
+    return <core::int, core::int?>{};
+}
+static method main() → void {
+  self::C::staticMember;
+  self::C::staticMember;
+  self::C::staticMember = 42;
+  self::C::staticMethod();
+  self::C::staticMember.{core::int::isEven};
+  self::C::staticMember.{core::int::toString}();
+  self::C::property.{core::List::[]}(0);
+  self::C::property.{core::List::[]=}(0, 0);
+  let final core::Map<core::int, core::int?> #t1 = self::C::property2 in let final core::int #t2 = 0 in #t1.{core::Map::[]}(#t2).{core::num::==}(null) ?{core::int} #t1.{core::Map::[]=}(#t2, 0) : null;
+  self::C::staticMember2.{core::num::==}(null) ?{core::int} self::C::staticMember2 = 42 : null;
+  self::C::staticMember = self::C::staticMember.{core::num::+}(2);
+  self::C::staticMember = self::C::staticMember.{core::num::+}(1);
+  self::C::staticMember = self::C::staticMember.{core::num::-}(1);
+}
+
+
+Extra constant evaluation status:
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware_static_access.dart:25:16 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware_static_access.dart:25:16 -> IntConstant(0)
+Extra constant evaluation: evaluated: 38, effectively constant: 2
diff --git a/pkg/front_end/testcases/nnbd/null_aware_this_access.dart b/pkg/front_end/testcases/nnbd/null_aware_this_access.dart
new file mode 100644
index 0000000..d82d2f6
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/null_aware_this_access.dart
@@ -0,0 +1,57 @@
+// Copyright (c) 2020, 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.
+
+class C {
+  int? m1;
+  int m2 = 0;
+
+  C get property => this;
+
+  test() {
+    this?.m1;
+    this?.m1 = 42;
+    this?.method();
+    this?.property.m1;
+    this?.property.method();
+    this?[0];
+    this?[0] = 0;
+    this?[0] ??= 0;
+    this?.property[0];
+    this?.property[0] = 0;
+    this?.property[0] ??= 0;
+    this?.m1 ??= 42;
+    this?.m2 += 2;
+    this?.m2++;
+    --this?.m2;
+    this ?? new C();
+  }
+
+  int? operator [](int index) => 0;
+
+  void operator []=(int index, int value) {}
+
+  method() {}
+}
+
+class D {
+  D get property => this;
+
+  test() {
+    this?[0];
+    this?[0] = 0;
+    this?[0] += 0;
+    this?.property[0];
+    this?.property[0] = 0;
+    this?.property[0] += 0;
+  }
+
+  int operator [](int index) => 0;
+
+  void operator []=(int index, int value) {}
+}
+
+main() {
+  new C().test();
+  new D().test();
+}
diff --git a/pkg/front_end/testcases/nnbd/null_aware_this_access.dart.outline.expect b/pkg/front_end/testcases/nnbd/null_aware_this_access.dart.outline.expect
new file mode 100644
index 0000000..754edd6
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/null_aware_this_access.dart.outline.expect
@@ -0,0 +1,34 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  field core::int? m1;
+  field core::int m2;
+  synthetic constructor •() → self::C
+    ;
+  get property() → self::C
+    ;
+  method test() → dynamic
+    ;
+  operator [](core::int index) → core::int?
+    ;
+  operator []=(core::int index, core::int value) → void
+    ;
+  method method() → dynamic
+    ;
+}
+class D extends core::Object {
+  synthetic constructor •() → self::D
+    ;
+  get property() → self::D
+    ;
+  method test() → dynamic
+    ;
+  operator [](core::int index) → core::int
+    ;
+  operator []=(core::int index, core::int value) → void
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/nnbd/null_aware_this_access.dart.strong.expect b/pkg/front_end/testcases/nnbd/null_aware_this_access.dart.strong.expect
new file mode 100644
index 0000000..2c133c7
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/null_aware_this_access.dart.strong.expect
@@ -0,0 +1,170 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:12:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?.m1;
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:13:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?.m1 = 42;
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:14:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?.method();
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:15:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?.property.m1;
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:16:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?.property.method();
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:17:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?[0];
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:18:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?[0] = 0;
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:19:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?[0] ??= 0;
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:20:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?.property[0];
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:21:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?.property[0] = 0;
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:22:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?.property[0] ??= 0;
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:23:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?.m1 ??= 42;
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:24:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?.m2 += 2;
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:25:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?.m2++;
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:26:7: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     --this?.m2;
+//       ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:27:5: Warning: Operand of null-aware operation '??' has type 'C' which excludes null.
+//  - 'C' is from 'pkg/front_end/testcases/nnbd/null_aware_this_access.dart'.
+//     this ?? new C();
+//     ^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:41:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?[0];
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:42:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?[0] = 0;
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:43:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?[0] += 0;
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:44:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?.property[0];
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:45:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?.property[0] = 0;
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:46:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?.property[0] += 0;
+//     ^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  field core::int? m1 = null;
+  field core::int m2 = 0;
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  get property() → self::C
+    return this;
+  method test() → dynamic {
+    this.{self::C::m1};
+    this.{self::C::m1} = 42;
+    this.{self::C::method}();
+    this.{self::C::property}.{self::C::m1};
+    this.{self::C::property}.{self::C::method}();
+    this.{self::C::[]}(0);
+    this.{self::C::[]=}(0, 0);
+    let final core::int #t1 = 0 in this.{self::C::[]}(#t1).{core::num::==}(null) ?{core::int} this.{self::C::[]=}(#t1, 0) : null;
+    this.{self::C::property}.{self::C::[]}(0);
+    this.{self::C::property}.{self::C::[]=}(0, 0);
+    let final self::C #t2 = this.{self::C::property} in let final core::int #t3 = 0 in #t2.{self::C::[]}(#t3).{core::num::==}(null) ?{core::int} #t2.{self::C::[]=}(#t3, 0) : null;
+    this.{self::C::m1}.{core::num::==}(null) ?{core::int} this.{self::C::m1} = 42 : null;
+    this.{self::C::m2} = this.{self::C::m2}.{core::num::+}(2);
+    this.{self::C::m2} = this.{self::C::m2}.{core::num::+}(1);
+    this.{self::C::m2} = this.{self::C::m2}.{core::num::-}(1);
+    this;
+  }
+  operator [](core::int index) → core::int?
+    return 0;
+  operator []=(core::int index, core::int value) → void {}
+  method method() → dynamic {}
+}
+class D extends core::Object {
+  synthetic constructor •() → self::D
+    : super core::Object::•()
+    ;
+  get property() → self::D
+    return this;
+  method test() → dynamic {
+    this.{self::D::[]}(0);
+    this.{self::D::[]=}(0, 0);
+    let final core::int #t4 = 0 in this.{self::D::[]=}(#t4, this.{self::D::[]}(#t4).{core::num::+}(0));
+    this.{self::D::property}.{self::D::[]}(0);
+    this.{self::D::property}.{self::D::[]=}(0, 0);
+    let final self::D #t5 = this.{self::D::property} in let final core::int #t6 = 0 in #t5.{self::D::[]=}(#t6, #t5.{self::D::[]}(#t6).{core::num::+}(0));
+  }
+  operator [](core::int index) → core::int
+    return 0;
+  operator []=(core::int index, core::int value) → void {}
+}
+static method main() → dynamic {
+  new self::C::•().{self::C::test}();
+  new self::D::•().{self::D::test}();
+}
diff --git a/pkg/front_end/testcases/nnbd/null_aware_this_access.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/null_aware_this_access.dart.strong.transformed.expect
new file mode 100644
index 0000000..992a282
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/null_aware_this_access.dart.strong.transformed.expect
@@ -0,0 +1,182 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:12:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?.m1;
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:13:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?.m1 = 42;
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:14:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?.method();
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:15:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?.property.m1;
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:16:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?.property.method();
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:17:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?[0];
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:18:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?[0] = 0;
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:19:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?[0] ??= 0;
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:20:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?.property[0];
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:21:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?.property[0] = 0;
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:22:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?.property[0] ??= 0;
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:23:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?.m1 ??= 42;
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:24:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?.m2 += 2;
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:25:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?.m2++;
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:26:7: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     --this?.m2;
+//       ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:27:5: Warning: Operand of null-aware operation '??' has type 'C' which excludes null.
+//  - 'C' is from 'pkg/front_end/testcases/nnbd/null_aware_this_access.dart'.
+//     this ?? new C();
+//     ^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:41:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?[0];
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:42:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?[0] = 0;
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:43:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?[0] += 0;
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:44:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?.property[0];
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:45:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?.property[0] = 0;
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:46:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?.property[0] += 0;
+//     ^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  field core::int? m1 = null;
+  field core::int m2 = 0;
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  get property() → self::C
+    return this;
+  method test() → dynamic {
+    this.{self::C::m1};
+    this.{self::C::m1} = 42;
+    this.{self::C::method}();
+    this.{self::C::property}.{self::C::m1};
+    this.{self::C::property}.{self::C::method}();
+    this.{self::C::[]}(0);
+    this.{self::C::[]=}(0, 0);
+    let final core::int #t1 = 0 in this.{self::C::[]}(#t1).{core::num::==}(null) ?{core::int} this.{self::C::[]=}(#t1, 0) : null;
+    this.{self::C::property}.{self::C::[]}(0);
+    this.{self::C::property}.{self::C::[]=}(0, 0);
+    let final self::C #t2 = this.{self::C::property} in let final core::int #t3 = 0 in #t2.{self::C::[]}(#t3).{core::num::==}(null) ?{core::int} #t2.{self::C::[]=}(#t3, 0) : null;
+    this.{self::C::m1}.{core::num::==}(null) ?{core::int} this.{self::C::m1} = 42 : null;
+    this.{self::C::m2} = this.{self::C::m2}.{core::num::+}(2);
+    this.{self::C::m2} = this.{self::C::m2}.{core::num::+}(1);
+    this.{self::C::m2} = this.{self::C::m2}.{core::num::-}(1);
+    this;
+  }
+  operator [](core::int index) → core::int?
+    return 0;
+  operator []=(core::int index, core::int value) → void {}
+  method method() → dynamic {}
+}
+class D extends core::Object {
+  synthetic constructor •() → self::D
+    : super core::Object::•()
+    ;
+  get property() → self::D
+    return this;
+  method test() → dynamic {
+    this.{self::D::[]}(0);
+    this.{self::D::[]=}(0, 0);
+    let final core::int #t4 = 0 in this.{self::D::[]=}(#t4, this.{self::D::[]}(#t4).{core::num::+}(0));
+    this.{self::D::property}.{self::D::[]}(0);
+    this.{self::D::property}.{self::D::[]=}(0, 0);
+    let final self::D #t5 = this.{self::D::property} in let final core::int #t6 = 0 in #t5.{self::D::[]=}(#t6, #t5.{self::D::[]}(#t6).{core::num::+}(0));
+  }
+  operator [](core::int index) → core::int
+    return 0;
+  operator []=(core::int index, core::int value) → void {}
+}
+static method main() → dynamic {
+  new self::C::•().{self::C::test}();
+  new self::D::•().{self::D::test}();
+}
+
+
+Extra constant evaluation status:
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware_this_access.dart:19:11 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware_this_access.dart:19:11 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware_this_access.dart:22:20 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware_this_access.dart:22:20 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware_this_access.dart:43:11 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware_this_access.dart:43:11 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware_this_access.dart:46:20 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware_this_access.dart:46:20 -> IntConstant(0)
+Extra constant evaluation: evaluated: 100, effectively constant: 8
diff --git a/pkg/front_end/testcases/nnbd/null_aware_this_access.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd/null_aware_this_access.dart.textual_outline.expect
new file mode 100644
index 0000000..64332d9
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/null_aware_this_access.dart.textual_outline.expect
@@ -0,0 +1,18 @@
+class C {
+  int? m1;
+  int m2 = 0;
+  C get property => this;
+  test() {}
+  int? operator [](int index) => 0;
+  void operator []=(int index, int value) {}
+  method() {}
+}
+
+class D {
+  D get property => this;
+  test() {}
+  int operator [](int index) => 0;
+  void operator []=(int index, int value) {}
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/null_aware_this_access.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/nnbd/null_aware_this_access.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..0315e45
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/null_aware_this_access.dart.textual_outline_modelled.expect
@@ -0,0 +1,18 @@
+class C {
+  C get property => this;
+  int? m1;
+  int? operator [](int index) => 0;
+  int m2 = 0;
+  method() {}
+  test() {}
+  void operator []=(int index, int value) {}
+}
+
+class D {
+  D get property => this;
+  int operator [](int index) => 0;
+  test() {}
+  void operator []=(int index, int value) {}
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/null_aware_this_access.dart.weak.expect b/pkg/front_end/testcases/nnbd/null_aware_this_access.dart.weak.expect
new file mode 100644
index 0000000..2c133c7
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/null_aware_this_access.dart.weak.expect
@@ -0,0 +1,170 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:12:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?.m1;
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:13:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?.m1 = 42;
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:14:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?.method();
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:15:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?.property.m1;
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:16:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?.property.method();
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:17:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?[0];
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:18:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?[0] = 0;
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:19:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?[0] ??= 0;
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:20:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?.property[0];
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:21:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?.property[0] = 0;
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:22:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?.property[0] ??= 0;
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:23:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?.m1 ??= 42;
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:24:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?.m2 += 2;
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:25:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?.m2++;
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:26:7: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     --this?.m2;
+//       ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:27:5: Warning: Operand of null-aware operation '??' has type 'C' which excludes null.
+//  - 'C' is from 'pkg/front_end/testcases/nnbd/null_aware_this_access.dart'.
+//     this ?? new C();
+//     ^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:41:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?[0];
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:42:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?[0] = 0;
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:43:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?[0] += 0;
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:44:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?.property[0];
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:45:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?.property[0] = 0;
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:46:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?.property[0] += 0;
+//     ^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  field core::int? m1 = null;
+  field core::int m2 = 0;
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  get property() → self::C
+    return this;
+  method test() → dynamic {
+    this.{self::C::m1};
+    this.{self::C::m1} = 42;
+    this.{self::C::method}();
+    this.{self::C::property}.{self::C::m1};
+    this.{self::C::property}.{self::C::method}();
+    this.{self::C::[]}(0);
+    this.{self::C::[]=}(0, 0);
+    let final core::int #t1 = 0 in this.{self::C::[]}(#t1).{core::num::==}(null) ?{core::int} this.{self::C::[]=}(#t1, 0) : null;
+    this.{self::C::property}.{self::C::[]}(0);
+    this.{self::C::property}.{self::C::[]=}(0, 0);
+    let final self::C #t2 = this.{self::C::property} in let final core::int #t3 = 0 in #t2.{self::C::[]}(#t3).{core::num::==}(null) ?{core::int} #t2.{self::C::[]=}(#t3, 0) : null;
+    this.{self::C::m1}.{core::num::==}(null) ?{core::int} this.{self::C::m1} = 42 : null;
+    this.{self::C::m2} = this.{self::C::m2}.{core::num::+}(2);
+    this.{self::C::m2} = this.{self::C::m2}.{core::num::+}(1);
+    this.{self::C::m2} = this.{self::C::m2}.{core::num::-}(1);
+    this;
+  }
+  operator [](core::int index) → core::int?
+    return 0;
+  operator []=(core::int index, core::int value) → void {}
+  method method() → dynamic {}
+}
+class D extends core::Object {
+  synthetic constructor •() → self::D
+    : super core::Object::•()
+    ;
+  get property() → self::D
+    return this;
+  method test() → dynamic {
+    this.{self::D::[]}(0);
+    this.{self::D::[]=}(0, 0);
+    let final core::int #t4 = 0 in this.{self::D::[]=}(#t4, this.{self::D::[]}(#t4).{core::num::+}(0));
+    this.{self::D::property}.{self::D::[]}(0);
+    this.{self::D::property}.{self::D::[]=}(0, 0);
+    let final self::D #t5 = this.{self::D::property} in let final core::int #t6 = 0 in #t5.{self::D::[]=}(#t6, #t5.{self::D::[]}(#t6).{core::num::+}(0));
+  }
+  operator [](core::int index) → core::int
+    return 0;
+  operator []=(core::int index, core::int value) → void {}
+}
+static method main() → dynamic {
+  new self::C::•().{self::C::test}();
+  new self::D::•().{self::D::test}();
+}
diff --git a/pkg/front_end/testcases/nnbd/null_aware_this_access.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/null_aware_this_access.dart.weak.transformed.expect
new file mode 100644
index 0000000..992a282
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/null_aware_this_access.dart.weak.transformed.expect
@@ -0,0 +1,182 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:12:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?.m1;
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:13:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?.m1 = 42;
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:14:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?.method();
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:15:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?.property.m1;
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:16:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?.property.method();
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:17:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?[0];
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:18:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?[0] = 0;
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:19:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?[0] ??= 0;
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:20:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?.property[0];
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:21:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?.property[0] = 0;
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:22:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?.property[0] ??= 0;
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:23:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?.m1 ??= 42;
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:24:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?.m2 += 2;
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:25:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?.m2++;
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:26:7: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     --this?.m2;
+//       ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:27:5: Warning: Operand of null-aware operation '??' has type 'C' which excludes null.
+//  - 'C' is from 'pkg/front_end/testcases/nnbd/null_aware_this_access.dart'.
+//     this ?? new C();
+//     ^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:41:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?[0];
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:42:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?[0] = 0;
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:43:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?[0] += 0;
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:44:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?.property[0];
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:45:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?.property[0] = 0;
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:46:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?.property[0] += 0;
+//     ^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  field core::int? m1 = null;
+  field core::int m2 = 0;
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  get property() → self::C
+    return this;
+  method test() → dynamic {
+    this.{self::C::m1};
+    this.{self::C::m1} = 42;
+    this.{self::C::method}();
+    this.{self::C::property}.{self::C::m1};
+    this.{self::C::property}.{self::C::method}();
+    this.{self::C::[]}(0);
+    this.{self::C::[]=}(0, 0);
+    let final core::int #t1 = 0 in this.{self::C::[]}(#t1).{core::num::==}(null) ?{core::int} this.{self::C::[]=}(#t1, 0) : null;
+    this.{self::C::property}.{self::C::[]}(0);
+    this.{self::C::property}.{self::C::[]=}(0, 0);
+    let final self::C #t2 = this.{self::C::property} in let final core::int #t3 = 0 in #t2.{self::C::[]}(#t3).{core::num::==}(null) ?{core::int} #t2.{self::C::[]=}(#t3, 0) : null;
+    this.{self::C::m1}.{core::num::==}(null) ?{core::int} this.{self::C::m1} = 42 : null;
+    this.{self::C::m2} = this.{self::C::m2}.{core::num::+}(2);
+    this.{self::C::m2} = this.{self::C::m2}.{core::num::+}(1);
+    this.{self::C::m2} = this.{self::C::m2}.{core::num::-}(1);
+    this;
+  }
+  operator [](core::int index) → core::int?
+    return 0;
+  operator []=(core::int index, core::int value) → void {}
+  method method() → dynamic {}
+}
+class D extends core::Object {
+  synthetic constructor •() → self::D
+    : super core::Object::•()
+    ;
+  get property() → self::D
+    return this;
+  method test() → dynamic {
+    this.{self::D::[]}(0);
+    this.{self::D::[]=}(0, 0);
+    let final core::int #t4 = 0 in this.{self::D::[]=}(#t4, this.{self::D::[]}(#t4).{core::num::+}(0));
+    this.{self::D::property}.{self::D::[]}(0);
+    this.{self::D::property}.{self::D::[]=}(0, 0);
+    let final self::D #t5 = this.{self::D::property} in let final core::int #t6 = 0 in #t5.{self::D::[]=}(#t6, #t5.{self::D::[]}(#t6).{core::num::+}(0));
+  }
+  operator [](core::int index) → core::int
+    return 0;
+  operator []=(core::int index, core::int value) → void {}
+}
+static method main() → dynamic {
+  new self::C::•().{self::C::test}();
+  new self::D::•().{self::D::test}();
+}
+
+
+Extra constant evaluation status:
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware_this_access.dart:19:11 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware_this_access.dart:19:11 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware_this_access.dart:22:20 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware_this_access.dart:22:20 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware_this_access.dart:43:11 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware_this_access.dart:43:11 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware_this_access.dart:46:20 -> IntConstant(0)
+Evaluated: VariableGet @ org-dartlang-testcase:///null_aware_this_access.dart:46:20 -> IntConstant(0)
+Extra constant evaluation: evaluated: 100, effectively constant: 8
diff --git a/pkg/front_end/testcases/nnbd/null_shorting.dart.strong.expect b/pkg/front_end/testcases/nnbd/null_shorting.dart.strong.expect
index d0bb828..63b5274 100644
--- a/pkg/front_end/testcases/nnbd/null_shorting.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/null_shorting.dart.strong.expect
@@ -110,12 +110,12 @@
   let final self::Class1? #t11 = n1 in #t11.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t12 = #t11{self::Class1}.{self::Class1::nullable1} in #t12.{core::Object::==}(null) ?{self::Class1?} null : #t12{self::Class1}.{self::Class1::nullable1} = new self::Class1::•();
   let final self::Class1? #t13 = n1 in #t13.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t14 = #t13{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} in #t14.{core::Object::==}(null) ?{self::Class1?} null : #t14{self::Class1}.{self::Class1::nullable1} = new self::Class1::•();
   let final self::Class1? #t15 = let final self::Class1? #t16 = n1 in #t16.{core::Object::==}(null) ?{self::Class1?} null : #t16{self::Class1}.{self::Class1::nullable1} in #t15.{core::Object::==}(null) ?{self::Class1?} null : #t15{self::Class1}.{self::Class1::nullable1};
-  self::throws(() → self::Class1? => let final<BottomType> #t17 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting.dart:87:47: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
+  self::throws(() → void => let final<BottomType> #t17 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting.dart:87:47: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
  - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting.dart'.
 Try accessing using ?. instead.
   throws(() => (n1?.nullable1 = new Class1()).nullable1);
                                               ^^^^^^^^^" in (let final self::Class1? #t18 = n1 in #t18.{core::Object::==}(null) ?{self::Class1?} null : #t18{self::Class1}.{self::Class1::nullable1} = new self::Class1::•()).{self::Class1::nullable1});
-  self::throws(() → self::Class1? => let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting.dart:88:43: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
+  self::throws(() → void => let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting.dart:88:43: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
  - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting.dart'.
 Try accessing using ?. instead.
   throws(() => (n1?.nonNullable1Method()).nullable1);
@@ -232,11 +232,11 @@
 }
 static method operatorAccess(self::Class1? n1, self::Class2? n2) → void {
   self::Class2? nullable2 = n2;
-  self::throws(() → self::Class1? => let final<BottomType> #t241 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting.dart:220:33: Error: Operator '+' cannot be called on 'Class1?' because it is potentially null.
+  self::throws(() → void => let final<BottomType> #t241 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting.dart:220:33: Error: Operator '+' cannot be called on 'Class1?' because it is potentially null.
  - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting.dart'.
   throws(() => n1?.nonNullable1 + 0);
                                 ^" in (let final self::Class1? #t242 = n1 in #t242.{core::Object::==}(null) ?{self::Class1?} null : #t242{self::Class1}.{self::Class1::nonNullable1}).{self::Class1::+}(0));
-  self::throws(() → self::Class1? => let final<BottomType> #t243 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting.dart:221:16: Error: Operator 'unary-' cannot be called on 'Class1?' because it is potentially null.
+  self::throws(() → void => let final<BottomType> #t243 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting.dart:221:16: Error: Operator 'unary-' cannot be called on 'Class1?' because it is potentially null.
  - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting.dart'.
   throws(() => -n1?.nonNullable1);
                ^" in (let final self::Class1? #t244 = n1 in #t244.{core::Object::==}(null) ?{self::Class1?} null : #t244{self::Class1}.{self::Class1::nonNullable1}).{self::Class1::unary-}());
diff --git a/pkg/front_end/testcases/nnbd/null_shorting.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/null_shorting.dart.strong.transformed.expect
index d0bb828..63b5274 100644
--- a/pkg/front_end/testcases/nnbd/null_shorting.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/null_shorting.dart.strong.transformed.expect
@@ -110,12 +110,12 @@
   let final self::Class1? #t11 = n1 in #t11.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t12 = #t11{self::Class1}.{self::Class1::nullable1} in #t12.{core::Object::==}(null) ?{self::Class1?} null : #t12{self::Class1}.{self::Class1::nullable1} = new self::Class1::•();
   let final self::Class1? #t13 = n1 in #t13.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t14 = #t13{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} in #t14.{core::Object::==}(null) ?{self::Class1?} null : #t14{self::Class1}.{self::Class1::nullable1} = new self::Class1::•();
   let final self::Class1? #t15 = let final self::Class1? #t16 = n1 in #t16.{core::Object::==}(null) ?{self::Class1?} null : #t16{self::Class1}.{self::Class1::nullable1} in #t15.{core::Object::==}(null) ?{self::Class1?} null : #t15{self::Class1}.{self::Class1::nullable1};
-  self::throws(() → self::Class1? => let final<BottomType> #t17 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting.dart:87:47: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
+  self::throws(() → void => let final<BottomType> #t17 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting.dart:87:47: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
  - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting.dart'.
 Try accessing using ?. instead.
   throws(() => (n1?.nullable1 = new Class1()).nullable1);
                                               ^^^^^^^^^" in (let final self::Class1? #t18 = n1 in #t18.{core::Object::==}(null) ?{self::Class1?} null : #t18{self::Class1}.{self::Class1::nullable1} = new self::Class1::•()).{self::Class1::nullable1});
-  self::throws(() → self::Class1? => let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting.dart:88:43: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
+  self::throws(() → void => let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting.dart:88:43: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
  - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting.dart'.
 Try accessing using ?. instead.
   throws(() => (n1?.nonNullable1Method()).nullable1);
@@ -232,11 +232,11 @@
 }
 static method operatorAccess(self::Class1? n1, self::Class2? n2) → void {
   self::Class2? nullable2 = n2;
-  self::throws(() → self::Class1? => let final<BottomType> #t241 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting.dart:220:33: Error: Operator '+' cannot be called on 'Class1?' because it is potentially null.
+  self::throws(() → void => let final<BottomType> #t241 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting.dart:220:33: Error: Operator '+' cannot be called on 'Class1?' because it is potentially null.
  - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting.dart'.
   throws(() => n1?.nonNullable1 + 0);
                                 ^" in (let final self::Class1? #t242 = n1 in #t242.{core::Object::==}(null) ?{self::Class1?} null : #t242{self::Class1}.{self::Class1::nonNullable1}).{self::Class1::+}(0));
-  self::throws(() → self::Class1? => let final<BottomType> #t243 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting.dart:221:16: Error: Operator 'unary-' cannot be called on 'Class1?' because it is potentially null.
+  self::throws(() → void => let final<BottomType> #t243 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting.dart:221:16: Error: Operator 'unary-' cannot be called on 'Class1?' because it is potentially null.
  - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting.dart'.
   throws(() => -n1?.nonNullable1);
                ^" in (let final self::Class1? #t244 = n1 in #t244.{core::Object::==}(null) ?{self::Class1?} null : #t244{self::Class1}.{self::Class1::nonNullable1}).{self::Class1::unary-}());
diff --git a/pkg/front_end/testcases/nnbd/null_shorting.dart.weak.expect b/pkg/front_end/testcases/nnbd/null_shorting.dart.weak.expect
index d0bb828..63b5274 100644
--- a/pkg/front_end/testcases/nnbd/null_shorting.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/null_shorting.dart.weak.expect
@@ -110,12 +110,12 @@
   let final self::Class1? #t11 = n1 in #t11.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t12 = #t11{self::Class1}.{self::Class1::nullable1} in #t12.{core::Object::==}(null) ?{self::Class1?} null : #t12{self::Class1}.{self::Class1::nullable1} = new self::Class1::•();
   let final self::Class1? #t13 = n1 in #t13.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t14 = #t13{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} in #t14.{core::Object::==}(null) ?{self::Class1?} null : #t14{self::Class1}.{self::Class1::nullable1} = new self::Class1::•();
   let final self::Class1? #t15 = let final self::Class1? #t16 = n1 in #t16.{core::Object::==}(null) ?{self::Class1?} null : #t16{self::Class1}.{self::Class1::nullable1} in #t15.{core::Object::==}(null) ?{self::Class1?} null : #t15{self::Class1}.{self::Class1::nullable1};
-  self::throws(() → self::Class1? => let final<BottomType> #t17 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting.dart:87:47: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
+  self::throws(() → void => let final<BottomType> #t17 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting.dart:87:47: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
  - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting.dart'.
 Try accessing using ?. instead.
   throws(() => (n1?.nullable1 = new Class1()).nullable1);
                                               ^^^^^^^^^" in (let final self::Class1? #t18 = n1 in #t18.{core::Object::==}(null) ?{self::Class1?} null : #t18{self::Class1}.{self::Class1::nullable1} = new self::Class1::•()).{self::Class1::nullable1});
-  self::throws(() → self::Class1? => let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting.dart:88:43: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
+  self::throws(() → void => let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting.dart:88:43: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
  - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting.dart'.
 Try accessing using ?. instead.
   throws(() => (n1?.nonNullable1Method()).nullable1);
@@ -232,11 +232,11 @@
 }
 static method operatorAccess(self::Class1? n1, self::Class2? n2) → void {
   self::Class2? nullable2 = n2;
-  self::throws(() → self::Class1? => let final<BottomType> #t241 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting.dart:220:33: Error: Operator '+' cannot be called on 'Class1?' because it is potentially null.
+  self::throws(() → void => let final<BottomType> #t241 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting.dart:220:33: Error: Operator '+' cannot be called on 'Class1?' because it is potentially null.
  - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting.dart'.
   throws(() => n1?.nonNullable1 + 0);
                                 ^" in (let final self::Class1? #t242 = n1 in #t242.{core::Object::==}(null) ?{self::Class1?} null : #t242{self::Class1}.{self::Class1::nonNullable1}).{self::Class1::+}(0));
-  self::throws(() → self::Class1? => let final<BottomType> #t243 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting.dart:221:16: Error: Operator 'unary-' cannot be called on 'Class1?' because it is potentially null.
+  self::throws(() → void => let final<BottomType> #t243 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting.dart:221:16: Error: Operator 'unary-' cannot be called on 'Class1?' because it is potentially null.
  - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting.dart'.
   throws(() => -n1?.nonNullable1);
                ^" in (let final self::Class1? #t244 = n1 in #t244.{core::Object::==}(null) ?{self::Class1?} null : #t244{self::Class1}.{self::Class1::nonNullable1}).{self::Class1::unary-}());
diff --git a/pkg/front_end/testcases/nnbd/null_shorting.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/null_shorting.dart.weak.transformed.expect
index d0bb828..63b5274 100644
--- a/pkg/front_end/testcases/nnbd/null_shorting.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/null_shorting.dart.weak.transformed.expect
@@ -110,12 +110,12 @@
   let final self::Class1? #t11 = n1 in #t11.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t12 = #t11{self::Class1}.{self::Class1::nullable1} in #t12.{core::Object::==}(null) ?{self::Class1?} null : #t12{self::Class1}.{self::Class1::nullable1} = new self::Class1::•();
   let final self::Class1? #t13 = n1 in #t13.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t14 = #t13{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} in #t14.{core::Object::==}(null) ?{self::Class1?} null : #t14{self::Class1}.{self::Class1::nullable1} = new self::Class1::•();
   let final self::Class1? #t15 = let final self::Class1? #t16 = n1 in #t16.{core::Object::==}(null) ?{self::Class1?} null : #t16{self::Class1}.{self::Class1::nullable1} in #t15.{core::Object::==}(null) ?{self::Class1?} null : #t15{self::Class1}.{self::Class1::nullable1};
-  self::throws(() → self::Class1? => let final<BottomType> #t17 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting.dart:87:47: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
+  self::throws(() → void => let final<BottomType> #t17 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting.dart:87:47: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
  - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting.dart'.
 Try accessing using ?. instead.
   throws(() => (n1?.nullable1 = new Class1()).nullable1);
                                               ^^^^^^^^^" in (let final self::Class1? #t18 = n1 in #t18.{core::Object::==}(null) ?{self::Class1?} null : #t18{self::Class1}.{self::Class1::nullable1} = new self::Class1::•()).{self::Class1::nullable1});
-  self::throws(() → self::Class1? => let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting.dart:88:43: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
+  self::throws(() → void => let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting.dart:88:43: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
  - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting.dart'.
 Try accessing using ?. instead.
   throws(() => (n1?.nonNullable1Method()).nullable1);
@@ -232,11 +232,11 @@
 }
 static method operatorAccess(self::Class1? n1, self::Class2? n2) → void {
   self::Class2? nullable2 = n2;
-  self::throws(() → self::Class1? => let final<BottomType> #t241 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting.dart:220:33: Error: Operator '+' cannot be called on 'Class1?' because it is potentially null.
+  self::throws(() → void => let final<BottomType> #t241 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting.dart:220:33: Error: Operator '+' cannot be called on 'Class1?' because it is potentially null.
  - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting.dart'.
   throws(() => n1?.nonNullable1 + 0);
                                 ^" in (let final self::Class1? #t242 = n1 in #t242.{core::Object::==}(null) ?{self::Class1?} null : #t242{self::Class1}.{self::Class1::nonNullable1}).{self::Class1::+}(0));
-  self::throws(() → self::Class1? => let final<BottomType> #t243 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting.dart:221:16: Error: Operator 'unary-' cannot be called on 'Class1?' because it is potentially null.
+  self::throws(() → void => let final<BottomType> #t243 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting.dart:221:16: Error: Operator 'unary-' cannot be called on 'Class1?' because it is potentially null.
  - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting.dart'.
   throws(() => -n1?.nonNullable1);
                ^" in (let final self::Class1? #t244 = n1 in #t244.{core::Object::==}(null) ?{self::Class1?} null : #t244{self::Class1}.{self::Class1::nonNullable1}).{self::Class1::unary-}());
diff --git a/pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart.strong.expect b/pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart.strong.expect
index 5a4a4e5..ba0ed52 100644
--- a/pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart.strong.expect
@@ -139,12 +139,12 @@
   let final self::Class1? #t13 = n1 in #t13.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t14 = self::Extension1|get#nullable1(#t13{self::Class1}) in #t14.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t14{self::Class1}, new self::Class1::•());
   let final self::Class1? #t15 = n1 in #t15.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t16 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t15{self::Class1})) in #t16.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t16{self::Class1}, new self::Class1::•());
   let final self::Class1? #t17 = let final self::Class1? #t18 = n1 in #t18.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(#t18{self::Class1}) in #t17.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(#t17{self::Class1});
-  self::throws(() → self::Class1? => let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:93:59: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
+  self::throws(() → void => let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:93:59: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
  - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart'.
 Try accessing using ?. instead.
   throws(() => (Extension1(n1)?.nullable1 = new Class1()).nullable1);
                                                           ^^^^^^^^^" in self::Extension1|get#nullable1(let final self::Class1? #t20 = n1 in #t20.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t21 = new self::Class1::•() in let final void #t22 = self::Extension1|set#nullable1(#t20{self::Class1}, #t21) in #t21));
-  self::throws(() → self::Class1? => let final<BottomType> #t23 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:94:55: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
+  self::throws(() → void => let final<BottomType> #t23 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:94:55: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
  - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart'.
 Try accessing using ?. instead.
   throws(() => (Extension1(n1)?.nonNullable1Method()).nullable1);
@@ -261,11 +261,11 @@
 }
 static method operatorAccess(self::Class1? n1, self::Class2? n2) → void {
   self::Class2? nullable2 = n2;
-  self::throws(() → self::Class1? => let final<BottomType> #t327 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:244:45: Error: Operator '+' cannot be called on 'Class1?' because it is potentially null.
+  self::throws(() → void => let final<BottomType> #t327 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:244:45: Error: Operator '+' cannot be called on 'Class1?' because it is potentially null.
  - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart'.
   throws(() => Extension1(n1)?.nonNullable1 + 0);
                                             ^" in self::Extension1|+(let final self::Class1? #t328 = n1 in #t328.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nonNullable1(#t328{self::Class1}), 0));
-  self::throws(() → self::Class1? => let final<BottomType> #t329 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:245:16: Error: Operator 'unary-' cannot be called on 'Class1?' because it is potentially null.
+  self::throws(() → void => let final<BottomType> #t329 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:245:16: Error: Operator 'unary-' cannot be called on 'Class1?' because it is potentially null.
  - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart'.
   throws(() => -Extension1(n1)?.nonNullable1);
                ^" in self::Extension1|unary-(let final self::Class1? #t330 = n1 in #t330.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nonNullable1(#t330{self::Class1})));
diff --git a/pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart.strong.transformed.expect
index 5a4a4e5..ba0ed52 100644
--- a/pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart.strong.transformed.expect
@@ -139,12 +139,12 @@
   let final self::Class1? #t13 = n1 in #t13.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t14 = self::Extension1|get#nullable1(#t13{self::Class1}) in #t14.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t14{self::Class1}, new self::Class1::•());
   let final self::Class1? #t15 = n1 in #t15.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t16 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t15{self::Class1})) in #t16.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t16{self::Class1}, new self::Class1::•());
   let final self::Class1? #t17 = let final self::Class1? #t18 = n1 in #t18.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(#t18{self::Class1}) in #t17.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(#t17{self::Class1});
-  self::throws(() → self::Class1? => let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:93:59: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
+  self::throws(() → void => let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:93:59: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
  - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart'.
 Try accessing using ?. instead.
   throws(() => (Extension1(n1)?.nullable1 = new Class1()).nullable1);
                                                           ^^^^^^^^^" in self::Extension1|get#nullable1(let final self::Class1? #t20 = n1 in #t20.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t21 = new self::Class1::•() in let final void #t22 = self::Extension1|set#nullable1(#t20{self::Class1}, #t21) in #t21));
-  self::throws(() → self::Class1? => let final<BottomType> #t23 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:94:55: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
+  self::throws(() → void => let final<BottomType> #t23 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:94:55: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
  - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart'.
 Try accessing using ?. instead.
   throws(() => (Extension1(n1)?.nonNullable1Method()).nullable1);
@@ -261,11 +261,11 @@
 }
 static method operatorAccess(self::Class1? n1, self::Class2? n2) → void {
   self::Class2? nullable2 = n2;
-  self::throws(() → self::Class1? => let final<BottomType> #t327 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:244:45: Error: Operator '+' cannot be called on 'Class1?' because it is potentially null.
+  self::throws(() → void => let final<BottomType> #t327 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:244:45: Error: Operator '+' cannot be called on 'Class1?' because it is potentially null.
  - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart'.
   throws(() => Extension1(n1)?.nonNullable1 + 0);
                                             ^" in self::Extension1|+(let final self::Class1? #t328 = n1 in #t328.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nonNullable1(#t328{self::Class1}), 0));
-  self::throws(() → self::Class1? => let final<BottomType> #t329 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:245:16: Error: Operator 'unary-' cannot be called on 'Class1?' because it is potentially null.
+  self::throws(() → void => let final<BottomType> #t329 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:245:16: Error: Operator 'unary-' cannot be called on 'Class1?' because it is potentially null.
  - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart'.
   throws(() => -Extension1(n1)?.nonNullable1);
                ^" in self::Extension1|unary-(let final self::Class1? #t330 = n1 in #t330.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nonNullable1(#t330{self::Class1})));
diff --git a/pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart.weak.expect b/pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart.weak.expect
index 5a4a4e5..ba0ed52 100644
--- a/pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart.weak.expect
@@ -139,12 +139,12 @@
   let final self::Class1? #t13 = n1 in #t13.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t14 = self::Extension1|get#nullable1(#t13{self::Class1}) in #t14.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t14{self::Class1}, new self::Class1::•());
   let final self::Class1? #t15 = n1 in #t15.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t16 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t15{self::Class1})) in #t16.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t16{self::Class1}, new self::Class1::•());
   let final self::Class1? #t17 = let final self::Class1? #t18 = n1 in #t18.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(#t18{self::Class1}) in #t17.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(#t17{self::Class1});
-  self::throws(() → self::Class1? => let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:93:59: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
+  self::throws(() → void => let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:93:59: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
  - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart'.
 Try accessing using ?. instead.
   throws(() => (Extension1(n1)?.nullable1 = new Class1()).nullable1);
                                                           ^^^^^^^^^" in self::Extension1|get#nullable1(let final self::Class1? #t20 = n1 in #t20.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t21 = new self::Class1::•() in let final void #t22 = self::Extension1|set#nullable1(#t20{self::Class1}, #t21) in #t21));
-  self::throws(() → self::Class1? => let final<BottomType> #t23 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:94:55: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
+  self::throws(() → void => let final<BottomType> #t23 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:94:55: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
  - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart'.
 Try accessing using ?. instead.
   throws(() => (Extension1(n1)?.nonNullable1Method()).nullable1);
@@ -261,11 +261,11 @@
 }
 static method operatorAccess(self::Class1? n1, self::Class2? n2) → void {
   self::Class2? nullable2 = n2;
-  self::throws(() → self::Class1? => let final<BottomType> #t327 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:244:45: Error: Operator '+' cannot be called on 'Class1?' because it is potentially null.
+  self::throws(() → void => let final<BottomType> #t327 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:244:45: Error: Operator '+' cannot be called on 'Class1?' because it is potentially null.
  - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart'.
   throws(() => Extension1(n1)?.nonNullable1 + 0);
                                             ^" in self::Extension1|+(let final self::Class1? #t328 = n1 in #t328.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nonNullable1(#t328{self::Class1}), 0));
-  self::throws(() → self::Class1? => let final<BottomType> #t329 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:245:16: Error: Operator 'unary-' cannot be called on 'Class1?' because it is potentially null.
+  self::throws(() → void => let final<BottomType> #t329 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:245:16: Error: Operator 'unary-' cannot be called on 'Class1?' because it is potentially null.
  - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart'.
   throws(() => -Extension1(n1)?.nonNullable1);
                ^" in self::Extension1|unary-(let final self::Class1? #t330 = n1 in #t330.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nonNullable1(#t330{self::Class1})));
diff --git a/pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart.weak.transformed.expect
index 5a4a4e5..ba0ed52 100644
--- a/pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart.weak.transformed.expect
@@ -139,12 +139,12 @@
   let final self::Class1? #t13 = n1 in #t13.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t14 = self::Extension1|get#nullable1(#t13{self::Class1}) in #t14.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t14{self::Class1}, new self::Class1::•());
   let final self::Class1? #t15 = n1 in #t15.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t16 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t15{self::Class1})) in #t16.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t16{self::Class1}, new self::Class1::•());
   let final self::Class1? #t17 = let final self::Class1? #t18 = n1 in #t18.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(#t18{self::Class1}) in #t17.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(#t17{self::Class1});
-  self::throws(() → self::Class1? => let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:93:59: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
+  self::throws(() → void => let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:93:59: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
  - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart'.
 Try accessing using ?. instead.
   throws(() => (Extension1(n1)?.nullable1 = new Class1()).nullable1);
                                                           ^^^^^^^^^" in self::Extension1|get#nullable1(let final self::Class1? #t20 = n1 in #t20.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t21 = new self::Class1::•() in let final void #t22 = self::Extension1|set#nullable1(#t20{self::Class1}, #t21) in #t21));
-  self::throws(() → self::Class1? => let final<BottomType> #t23 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:94:55: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
+  self::throws(() → void => let final<BottomType> #t23 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:94:55: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
  - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart'.
 Try accessing using ?. instead.
   throws(() => (Extension1(n1)?.nonNullable1Method()).nullable1);
@@ -261,11 +261,11 @@
 }
 static method operatorAccess(self::Class1? n1, self::Class2? n2) → void {
   self::Class2? nullable2 = n2;
-  self::throws(() → self::Class1? => let final<BottomType> #t327 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:244:45: Error: Operator '+' cannot be called on 'Class1?' because it is potentially null.
+  self::throws(() → void => let final<BottomType> #t327 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:244:45: Error: Operator '+' cannot be called on 'Class1?' because it is potentially null.
  - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart'.
   throws(() => Extension1(n1)?.nonNullable1 + 0);
                                             ^" in self::Extension1|+(let final self::Class1? #t328 = n1 in #t328.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nonNullable1(#t328{self::Class1}), 0));
-  self::throws(() → self::Class1? => let final<BottomType> #t329 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:245:16: Error: Operator 'unary-' cannot be called on 'Class1?' because it is potentially null.
+  self::throws(() → void => let final<BottomType> #t329 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:245:16: Error: Operator 'unary-' cannot be called on 'Class1?' because it is potentially null.
  - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart'.
   throws(() => -Extension1(n1)?.nonNullable1);
                ^" in self::Extension1|unary-(let final self::Class1? #t330 = n1 in #t330.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nonNullable1(#t330{self::Class1})));
diff --git a/pkg/front_end/testcases/nnbd/null_shorting_extension.dart.strong.expect b/pkg/front_end/testcases/nnbd/null_shorting_extension.dart.strong.expect
index 45fd2888..595c5b9 100644
--- a/pkg/front_end/testcases/nnbd/null_shorting_extension.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/null_shorting_extension.dart.strong.expect
@@ -139,12 +139,12 @@
   let final self::Class1? #t13 = n1 in #t13.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t14 = self::Extension1|get#nullable1(#t13{self::Class1}) in #t14.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t14{self::Class1}, new self::Class1::•());
   let final self::Class1? #t15 = n1 in #t15.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t16 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t15{self::Class1})) in #t16.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t16{self::Class1}, new self::Class1::•());
   let final self::Class1? #t17 = let final self::Class1? #t18 = n1 in #t18.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(#t18{self::Class1}) in #t17.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(#t17{self::Class1});
-  self::throws(() → self::Class1? => let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_extension.dart:93:47: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
+  self::throws(() → void => let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_extension.dart:93:47: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
  - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_extension.dart'.
 Try accessing using ?. instead.
   throws(() => (n1?.nullable1 = new Class1()).nullable1);
                                               ^^^^^^^^^" in self::Extension1|get#nullable1(let final self::Class1? #t20 = n1 in #t20.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t21 = new self::Class1::•() in let final void #t22 = self::Extension1|set#nullable1(#t20{self::Class1}, #t21) in #t21));
-  self::throws(() → self::Class1? => let final<BottomType> #t23 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_extension.dart:94:43: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
+  self::throws(() → void => let final<BottomType> #t23 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_extension.dart:94:43: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
  - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_extension.dart'.
 Try accessing using ?. instead.
   throws(() => (n1?.nonNullable1Method()).nullable1);
@@ -261,11 +261,11 @@
 }
 static method operatorAccess(self::Class1? n1, self::Class2? n2) → void {
   self::Class2? nullable2 = n2;
-  self::throws(() → self::Class1? => let final<BottomType> #t327 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_extension.dart:226:33: Error: Operator '+' cannot be called on 'Class1?' because it is potentially null.
+  self::throws(() → void => let final<BottomType> #t327 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_extension.dart:226:33: Error: Operator '+' cannot be called on 'Class1?' because it is potentially null.
  - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_extension.dart'.
   throws(() => n1?.nonNullable1 + 0);
                                 ^" in self::Extension1|+(let final self::Class1? #t328 = n1 in #t328.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nonNullable1(#t328{self::Class1}), 0));
-  self::throws(() → self::Class1? => let final<BottomType> #t329 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_extension.dart:227:16: Error: Operator 'unary-' cannot be called on 'Class1?' because it is potentially null.
+  self::throws(() → void => let final<BottomType> #t329 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_extension.dart:227:16: Error: Operator 'unary-' cannot be called on 'Class1?' because it is potentially null.
  - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_extension.dart'.
   throws(() => -n1?.nonNullable1);
                ^" in self::Extension1|unary-(let final self::Class1? #t330 = n1 in #t330.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nonNullable1(#t330{self::Class1})));
diff --git a/pkg/front_end/testcases/nnbd/null_shorting_extension.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/null_shorting_extension.dart.strong.transformed.expect
index 45fd2888..595c5b9 100644
--- a/pkg/front_end/testcases/nnbd/null_shorting_extension.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/null_shorting_extension.dart.strong.transformed.expect
@@ -139,12 +139,12 @@
   let final self::Class1? #t13 = n1 in #t13.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t14 = self::Extension1|get#nullable1(#t13{self::Class1}) in #t14.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t14{self::Class1}, new self::Class1::•());
   let final self::Class1? #t15 = n1 in #t15.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t16 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t15{self::Class1})) in #t16.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t16{self::Class1}, new self::Class1::•());
   let final self::Class1? #t17 = let final self::Class1? #t18 = n1 in #t18.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(#t18{self::Class1}) in #t17.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(#t17{self::Class1});
-  self::throws(() → self::Class1? => let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_extension.dart:93:47: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
+  self::throws(() → void => let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_extension.dart:93:47: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
  - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_extension.dart'.
 Try accessing using ?. instead.
   throws(() => (n1?.nullable1 = new Class1()).nullable1);
                                               ^^^^^^^^^" in self::Extension1|get#nullable1(let final self::Class1? #t20 = n1 in #t20.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t21 = new self::Class1::•() in let final void #t22 = self::Extension1|set#nullable1(#t20{self::Class1}, #t21) in #t21));
-  self::throws(() → self::Class1? => let final<BottomType> #t23 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_extension.dart:94:43: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
+  self::throws(() → void => let final<BottomType> #t23 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_extension.dart:94:43: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
  - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_extension.dart'.
 Try accessing using ?. instead.
   throws(() => (n1?.nonNullable1Method()).nullable1);
@@ -261,11 +261,11 @@
 }
 static method operatorAccess(self::Class1? n1, self::Class2? n2) → void {
   self::Class2? nullable2 = n2;
-  self::throws(() → self::Class1? => let final<BottomType> #t327 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_extension.dart:226:33: Error: Operator '+' cannot be called on 'Class1?' because it is potentially null.
+  self::throws(() → void => let final<BottomType> #t327 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_extension.dart:226:33: Error: Operator '+' cannot be called on 'Class1?' because it is potentially null.
  - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_extension.dart'.
   throws(() => n1?.nonNullable1 + 0);
                                 ^" in self::Extension1|+(let final self::Class1? #t328 = n1 in #t328.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nonNullable1(#t328{self::Class1}), 0));
-  self::throws(() → self::Class1? => let final<BottomType> #t329 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_extension.dart:227:16: Error: Operator 'unary-' cannot be called on 'Class1?' because it is potentially null.
+  self::throws(() → void => let final<BottomType> #t329 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_extension.dart:227:16: Error: Operator 'unary-' cannot be called on 'Class1?' because it is potentially null.
  - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_extension.dart'.
   throws(() => -n1?.nonNullable1);
                ^" in self::Extension1|unary-(let final self::Class1? #t330 = n1 in #t330.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nonNullable1(#t330{self::Class1})));
diff --git a/pkg/front_end/testcases/nnbd/null_shorting_extension.dart.weak.expect b/pkg/front_end/testcases/nnbd/null_shorting_extension.dart.weak.expect
index 45fd2888..595c5b9 100644
--- a/pkg/front_end/testcases/nnbd/null_shorting_extension.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/null_shorting_extension.dart.weak.expect
@@ -139,12 +139,12 @@
   let final self::Class1? #t13 = n1 in #t13.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t14 = self::Extension1|get#nullable1(#t13{self::Class1}) in #t14.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t14{self::Class1}, new self::Class1::•());
   let final self::Class1? #t15 = n1 in #t15.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t16 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t15{self::Class1})) in #t16.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t16{self::Class1}, new self::Class1::•());
   let final self::Class1? #t17 = let final self::Class1? #t18 = n1 in #t18.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(#t18{self::Class1}) in #t17.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(#t17{self::Class1});
-  self::throws(() → self::Class1? => let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_extension.dart:93:47: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
+  self::throws(() → void => let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_extension.dart:93:47: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
  - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_extension.dart'.
 Try accessing using ?. instead.
   throws(() => (n1?.nullable1 = new Class1()).nullable1);
                                               ^^^^^^^^^" in self::Extension1|get#nullable1(let final self::Class1? #t20 = n1 in #t20.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t21 = new self::Class1::•() in let final void #t22 = self::Extension1|set#nullable1(#t20{self::Class1}, #t21) in #t21));
-  self::throws(() → self::Class1? => let final<BottomType> #t23 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_extension.dart:94:43: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
+  self::throws(() → void => let final<BottomType> #t23 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_extension.dart:94:43: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
  - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_extension.dart'.
 Try accessing using ?. instead.
   throws(() => (n1?.nonNullable1Method()).nullable1);
@@ -261,11 +261,11 @@
 }
 static method operatorAccess(self::Class1? n1, self::Class2? n2) → void {
   self::Class2? nullable2 = n2;
-  self::throws(() → self::Class1? => let final<BottomType> #t327 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_extension.dart:226:33: Error: Operator '+' cannot be called on 'Class1?' because it is potentially null.
+  self::throws(() → void => let final<BottomType> #t327 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_extension.dart:226:33: Error: Operator '+' cannot be called on 'Class1?' because it is potentially null.
  - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_extension.dart'.
   throws(() => n1?.nonNullable1 + 0);
                                 ^" in self::Extension1|+(let final self::Class1? #t328 = n1 in #t328.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nonNullable1(#t328{self::Class1}), 0));
-  self::throws(() → self::Class1? => let final<BottomType> #t329 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_extension.dart:227:16: Error: Operator 'unary-' cannot be called on 'Class1?' because it is potentially null.
+  self::throws(() → void => let final<BottomType> #t329 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_extension.dart:227:16: Error: Operator 'unary-' cannot be called on 'Class1?' because it is potentially null.
  - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_extension.dart'.
   throws(() => -n1?.nonNullable1);
                ^" in self::Extension1|unary-(let final self::Class1? #t330 = n1 in #t330.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nonNullable1(#t330{self::Class1})));
diff --git a/pkg/front_end/testcases/nnbd/null_shorting_extension.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/null_shorting_extension.dart.weak.transformed.expect
index 45fd2888..595c5b9 100644
--- a/pkg/front_end/testcases/nnbd/null_shorting_extension.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/null_shorting_extension.dart.weak.transformed.expect
@@ -139,12 +139,12 @@
   let final self::Class1? #t13 = n1 in #t13.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t14 = self::Extension1|get#nullable1(#t13{self::Class1}) in #t14.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t14{self::Class1}, new self::Class1::•());
   let final self::Class1? #t15 = n1 in #t15.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t16 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t15{self::Class1})) in #t16.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t16{self::Class1}, new self::Class1::•());
   let final self::Class1? #t17 = let final self::Class1? #t18 = n1 in #t18.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(#t18{self::Class1}) in #t17.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(#t17{self::Class1});
-  self::throws(() → self::Class1? => let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_extension.dart:93:47: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
+  self::throws(() → void => let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_extension.dart:93:47: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
  - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_extension.dart'.
 Try accessing using ?. instead.
   throws(() => (n1?.nullable1 = new Class1()).nullable1);
                                               ^^^^^^^^^" in self::Extension1|get#nullable1(let final self::Class1? #t20 = n1 in #t20.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t21 = new self::Class1::•() in let final void #t22 = self::Extension1|set#nullable1(#t20{self::Class1}, #t21) in #t21));
-  self::throws(() → self::Class1? => let final<BottomType> #t23 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_extension.dart:94:43: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
+  self::throws(() → void => let final<BottomType> #t23 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_extension.dart:94:43: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
  - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_extension.dart'.
 Try accessing using ?. instead.
   throws(() => (n1?.nonNullable1Method()).nullable1);
@@ -261,11 +261,11 @@
 }
 static method operatorAccess(self::Class1? n1, self::Class2? n2) → void {
   self::Class2? nullable2 = n2;
-  self::throws(() → self::Class1? => let final<BottomType> #t327 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_extension.dart:226:33: Error: Operator '+' cannot be called on 'Class1?' because it is potentially null.
+  self::throws(() → void => let final<BottomType> #t327 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_extension.dart:226:33: Error: Operator '+' cannot be called on 'Class1?' because it is potentially null.
  - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_extension.dart'.
   throws(() => n1?.nonNullable1 + 0);
                                 ^" in self::Extension1|+(let final self::Class1? #t328 = n1 in #t328.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nonNullable1(#t328{self::Class1}), 0));
-  self::throws(() → self::Class1? => let final<BottomType> #t329 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_extension.dart:227:16: Error: Operator 'unary-' cannot be called on 'Class1?' because it is potentially null.
+  self::throws(() → void => let final<BottomType> #t329 = invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_extension.dart:227:16: Error: Operator 'unary-' cannot be called on 'Class1?' because it is potentially null.
  - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_extension.dart'.
   throws(() => -n1?.nonNullable1);
                ^" in self::Extension1|unary-(let final self::Class1? #t330 = n1 in #t330.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nonNullable1(#t330{self::Class1})));
diff --git a/pkg/front_end/testcases/nnbd/nullable_access.dart.strong.expect b/pkg/front_end/testcases/nnbd/nullable_access.dart.strong.expect
index 5609034..3b43c3b 100644
--- a/pkg/front_end/testcases/nnbd/nullable_access.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/nullable_access.dart.strong.expect
@@ -33,7 +33,7 @@
 }
 static method main() → dynamic {
   self::Class? c;
-  self::throws(() → self::A => let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_access.dart:23:18: Error: Property 'nonNullableField' cannot be accessed on 'Class?' because it is potentially null.
+  self::throws(() → void => let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_access.dart:23:18: Error: Property 'nonNullableField' cannot be accessed on 'Class?' because it is potentially null.
  - 'Class' is from 'pkg/front_end/testcases/nnbd/nullable_access.dart'.
 Try accessing using ?. instead.
   throws(() => c.nonNullableField);
diff --git a/pkg/front_end/testcases/nnbd/nullable_access.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/nullable_access.dart.strong.transformed.expect
index 5609034..3b43c3b 100644
--- a/pkg/front_end/testcases/nnbd/nullable_access.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/nullable_access.dart.strong.transformed.expect
@@ -33,7 +33,7 @@
 }
 static method main() → dynamic {
   self::Class? c;
-  self::throws(() → self::A => let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_access.dart:23:18: Error: Property 'nonNullableField' cannot be accessed on 'Class?' because it is potentially null.
+  self::throws(() → void => let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_access.dart:23:18: Error: Property 'nonNullableField' cannot be accessed on 'Class?' because it is potentially null.
  - 'Class' is from 'pkg/front_end/testcases/nnbd/nullable_access.dart'.
 Try accessing using ?. instead.
   throws(() => c.nonNullableField);
diff --git a/pkg/front_end/testcases/nnbd/nullable_access.dart.weak.expect b/pkg/front_end/testcases/nnbd/nullable_access.dart.weak.expect
index 5609034..3b43c3b 100644
--- a/pkg/front_end/testcases/nnbd/nullable_access.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/nullable_access.dart.weak.expect
@@ -33,7 +33,7 @@
 }
 static method main() → dynamic {
   self::Class? c;
-  self::throws(() → self::A => let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_access.dart:23:18: Error: Property 'nonNullableField' cannot be accessed on 'Class?' because it is potentially null.
+  self::throws(() → void => let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_access.dart:23:18: Error: Property 'nonNullableField' cannot be accessed on 'Class?' because it is potentially null.
  - 'Class' is from 'pkg/front_end/testcases/nnbd/nullable_access.dart'.
 Try accessing using ?. instead.
   throws(() => c.nonNullableField);
diff --git a/pkg/front_end/testcases/nnbd/nullable_access.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/nullable_access.dart.weak.transformed.expect
index 5609034..3b43c3b 100644
--- a/pkg/front_end/testcases/nnbd/nullable_access.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/nullable_access.dart.weak.transformed.expect
@@ -33,7 +33,7 @@
 }
 static method main() → dynamic {
   self::Class? c;
-  self::throws(() → self::A => let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_access.dart:23:18: Error: Property 'nonNullableField' cannot be accessed on 'Class?' because it is potentially null.
+  self::throws(() → void => let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_access.dart:23:18: Error: Property 'nonNullableField' cannot be accessed on 'Class?' because it is potentially null.
  - 'Class' is from 'pkg/front_end/testcases/nnbd/nullable_access.dart'.
 Try accessing using ?. instead.
   throws(() => c.nonNullableField);
diff --git a/pkg/front_end/testcases/nnbd/nullable_null.dart.outline.expect b/pkg/front_end/testcases/nnbd/nullable_null.dart.outline.expect
index f1b5ac6..6aaebca 100644
--- a/pkg/front_end/testcases/nnbd/nullable_null.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/nullable_null.dart.outline.expect
@@ -6,14 +6,14 @@
   synthetic constructor •() → self::A<self::A::X%>
     ;
 }
-class B extends self::A<core::Null?> {
+class B extends self::A<Null> {
   synthetic constructor •() → self::B
     ;
 }
 class C extends core::Object {
   synthetic constructor •() → self::C
     ;
-  method foo(core::Null? n, self::A<core::Null?> an) → core::Null?
+  method foo(Null n, self::A<Null> an) → Null
     ;
 }
 static method foo() → dynamic
diff --git a/pkg/front_end/testcases/nnbd/nullable_null.dart.strong.expect b/pkg/front_end/testcases/nnbd/nullable_null.dart.strong.expect
index a19cb5b..b1e0890 100644
--- a/pkg/front_end/testcases/nnbd/nullable_null.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/nullable_null.dart.strong.expect
@@ -7,7 +7,7 @@
     : super core::Object::•()
     ;
 }
-class B extends self::A<core::Null?> {
+class B extends self::A<Null> {
   synthetic constructor •() → self::B
     : super self::A::•()
     ;
@@ -16,18 +16,18 @@
   synthetic constructor •() → self::C
     : super core::Object::•()
     ;
-  method foo(core::Null? n, self::A<core::Null?> an) → core::Null?
+  method foo(Null n, self::A<Null> an) → Null
     return n;
 }
 static method foo() → dynamic {
-  return <core::List<self::A<core::Null?>?>>[<core::Null?>[], <self::A<core::Null?>>[]];
+  return <core::List<self::A<Null>?>>[<Null>[], <self::A<Null>>[]];
 }
 static method bar() → dynamic {
-  return <core::List<self::A<core::Null?>?>>[#C1, #C2];
+  return <core::List<self::A<Null>?>>[#C1, #C2];
 }
 static method main() → dynamic {}
 
 constants  {
-  #C1 = <core::Null?>[]
-  #C2 = <self::A<core::Null?>>[]
+  #C1 = <Null>[]
+  #C2 = <self::A<Null>>[]
 }
diff --git a/pkg/front_end/testcases/nnbd/nullable_null.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/nullable_null.dart.strong.transformed.expect
index a19cb5b..b1e0890 100644
--- a/pkg/front_end/testcases/nnbd/nullable_null.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/nullable_null.dart.strong.transformed.expect
@@ -7,7 +7,7 @@
     : super core::Object::•()
     ;
 }
-class B extends self::A<core::Null?> {
+class B extends self::A<Null> {
   synthetic constructor •() → self::B
     : super self::A::•()
     ;
@@ -16,18 +16,18 @@
   synthetic constructor •() → self::C
     : super core::Object::•()
     ;
-  method foo(core::Null? n, self::A<core::Null?> an) → core::Null?
+  method foo(Null n, self::A<Null> an) → Null
     return n;
 }
 static method foo() → dynamic {
-  return <core::List<self::A<core::Null?>?>>[<core::Null?>[], <self::A<core::Null?>>[]];
+  return <core::List<self::A<Null>?>>[<Null>[], <self::A<Null>>[]];
 }
 static method bar() → dynamic {
-  return <core::List<self::A<core::Null?>?>>[#C1, #C2];
+  return <core::List<self::A<Null>?>>[#C1, #C2];
 }
 static method main() → dynamic {}
 
 constants  {
-  #C1 = <core::Null?>[]
-  #C2 = <self::A<core::Null?>>[]
+  #C1 = <Null>[]
+  #C2 = <self::A<Null>>[]
 }
diff --git a/pkg/front_end/testcases/nnbd/nullable_null.dart.weak.expect b/pkg/front_end/testcases/nnbd/nullable_null.dart.weak.expect
index 7efdb66..82c9494 100644
--- a/pkg/front_end/testcases/nnbd/nullable_null.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/nullable_null.dart.weak.expect
@@ -7,7 +7,7 @@
     : super core::Object::•()
     ;
 }
-class B extends self::A<core::Null?> {
+class B extends self::A<Null> {
   synthetic constructor •() → self::B
     : super self::A::•()
     ;
@@ -16,18 +16,18 @@
   synthetic constructor •() → self::C
     : super core::Object::•()
     ;
-  method foo(core::Null? n, self::A<core::Null?> an) → core::Null?
+  method foo(Null n, self::A<Null> an) → Null
     return n;
 }
 static method foo() → dynamic {
-  return <core::List<self::A<core::Null?>?>>[<core::Null?>[], <self::A<core::Null?>>[]];
+  return <core::List<self::A<Null>?>>[<Null>[], <self::A<Null>>[]];
 }
 static method bar() → dynamic {
-  return <core::List<self::A<core::Null?>?>>[#C1, #C2];
+  return <core::List<self::A<Null>?>>[#C1, #C2];
 }
 static method main() → dynamic {}
 
 constants  {
-  #C1 = <core::Null?>[]
-  #C2 = <self::A<core::Null?>*>[]
+  #C1 = <Null>[]
+  #C2 = <self::A<Null>*>[]
 }
diff --git a/pkg/front_end/testcases/nnbd/nullable_null.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/nullable_null.dart.weak.transformed.expect
index 7efdb66..82c9494 100644
--- a/pkg/front_end/testcases/nnbd/nullable_null.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/nullable_null.dart.weak.transformed.expect
@@ -7,7 +7,7 @@
     : super core::Object::•()
     ;
 }
-class B extends self::A<core::Null?> {
+class B extends self::A<Null> {
   synthetic constructor •() → self::B
     : super self::A::•()
     ;
@@ -16,18 +16,18 @@
   synthetic constructor •() → self::C
     : super core::Object::•()
     ;
-  method foo(core::Null? n, self::A<core::Null?> an) → core::Null?
+  method foo(Null n, self::A<Null> an) → Null
     return n;
 }
 static method foo() → dynamic {
-  return <core::List<self::A<core::Null?>?>>[<core::Null?>[], <self::A<core::Null?>>[]];
+  return <core::List<self::A<Null>?>>[<Null>[], <self::A<Null>>[]];
 }
 static method bar() → dynamic {
-  return <core::List<self::A<core::Null?>?>>[#C1, #C2];
+  return <core::List<self::A<Null>?>>[#C1, #C2];
 }
 static method main() → dynamic {}
 
 constants  {
-  #C1 = <core::Null?>[]
-  #C2 = <self::A<core::Null?>*>[]
+  #C1 = <Null>[]
+  #C2 = <self::A<Null>*>[]
 }
diff --git a/pkg/front_end/testcases/nnbd/override_inference.dart.outline.expect b/pkg/front_end/testcases/nnbd/override_inference.dart.outline.expect
index 5e9a2cc..eca66dc 100644
--- a/pkg/front_end/testcases/nnbd/override_inference.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/override_inference.dart.outline.expect
@@ -283,9 +283,9 @@
   abstract set setter1c(invalid-type x) → void;
   abstract set setter1d(core::String x) → void;
   abstract set setter1e(core::Object x) → void;
-  abstract forwarding-stub set getter1d(core::Object x) → void;
-  abstract forwarding-stub set getter1e(core::Object x) → void;
-  abstract forwarding-stub set field2a(core::num? value) → void;
+  abstract member-signature set getter1d(core::Object x) → void; -> self::B::getter1d
+  abstract member-signature set getter1e(core::Object x) → void; -> self::B::getter1e
+  abstract member-signature set field2a(core::num? value) → void; -> self::B::field2a
 }
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/nnbd/override_inference.dart.strong.expect b/pkg/front_end/testcases/nnbd/override_inference.dart.strong.expect
index 71e2237..0a80f3f 100644
--- a/pkg/front_end/testcases/nnbd/override_inference.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/override_inference.dart.strong.expect
@@ -285,9 +285,9 @@
   abstract set setter1c(invalid-type x) → void;
   abstract set setter1d(core::String x) → void;
   abstract set setter1e(core::Object x) → void;
-  abstract forwarding-stub set getter1d(core::Object x) → void;
-  abstract forwarding-stub set getter1e(core::Object x) → void;
-  abstract forwarding-stub set field2a(core::num? value) → void;
+  abstract member-signature set getter1d(core::Object x) → void; -> self::B::getter1d
+  abstract member-signature set getter1e(core::Object x) → void; -> self::B::getter1e
+  abstract member-signature set field2a(core::num? value) → void; -> self::B::field2a
 }
 static method main() → dynamic {}
 
diff --git a/pkg/front_end/testcases/nnbd/override_inference.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/override_inference.dart.strong.transformed.expect
index 71e2237..0a80f3f 100644
--- a/pkg/front_end/testcases/nnbd/override_inference.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/override_inference.dart.strong.transformed.expect
@@ -285,9 +285,9 @@
   abstract set setter1c(invalid-type x) → void;
   abstract set setter1d(core::String x) → void;
   abstract set setter1e(core::Object x) → void;
-  abstract forwarding-stub set getter1d(core::Object x) → void;
-  abstract forwarding-stub set getter1e(core::Object x) → void;
-  abstract forwarding-stub set field2a(core::num? value) → void;
+  abstract member-signature set getter1d(core::Object x) → void; -> self::B::getter1d
+  abstract member-signature set getter1e(core::Object x) → void; -> self::B::getter1e
+  abstract member-signature set field2a(core::num? value) → void; -> self::B::field2a
 }
 static method main() → dynamic {}
 
diff --git a/pkg/front_end/testcases/nnbd/override_inference.dart.weak.expect b/pkg/front_end/testcases/nnbd/override_inference.dart.weak.expect
index 71e2237..0a80f3f 100644
--- a/pkg/front_end/testcases/nnbd/override_inference.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/override_inference.dart.weak.expect
@@ -285,9 +285,9 @@
   abstract set setter1c(invalid-type x) → void;
   abstract set setter1d(core::String x) → void;
   abstract set setter1e(core::Object x) → void;
-  abstract forwarding-stub set getter1d(core::Object x) → void;
-  abstract forwarding-stub set getter1e(core::Object x) → void;
-  abstract forwarding-stub set field2a(core::num? value) → void;
+  abstract member-signature set getter1d(core::Object x) → void; -> self::B::getter1d
+  abstract member-signature set getter1e(core::Object x) → void; -> self::B::getter1e
+  abstract member-signature set field2a(core::num? value) → void; -> self::B::field2a
 }
 static method main() → dynamic {}
 
diff --git a/pkg/front_end/testcases/nnbd/override_inference.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/override_inference.dart.weak.transformed.expect
index 71e2237..0a80f3f 100644
--- a/pkg/front_end/testcases/nnbd/override_inference.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/override_inference.dart.weak.transformed.expect
@@ -285,9 +285,9 @@
   abstract set setter1c(invalid-type x) → void;
   abstract set setter1d(core::String x) → void;
   abstract set setter1e(core::Object x) → void;
-  abstract forwarding-stub set getter1d(core::Object x) → void;
-  abstract forwarding-stub set getter1e(core::Object x) → void;
-  abstract forwarding-stub set field2a(core::num? value) → void;
+  abstract member-signature set getter1d(core::Object x) → void; -> self::B::getter1d
+  abstract member-signature set getter1e(core::Object x) → void; -> self::B::getter1e
+  abstract member-signature set field2a(core::num? value) → void; -> self::B::field2a
 }
 static method main() → dynamic {}
 
diff --git a/pkg/front_end/testcases/nnbd/potentially_nullable_access.dart.strong.expect b/pkg/front_end/testcases/nnbd/potentially_nullable_access.dart.strong.expect
index c4c45a5..c104f5c 100644
--- a/pkg/front_end/testcases/nnbd/potentially_nullable_access.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/potentially_nullable_access.dart.strong.expect
@@ -417,17 +417,17 @@
 
 class Class extends core::Object {
   field core::int property = 0;
-  field core::Function functionField = () → core::Null? {};
-  field () → void functionTypeField = () → core::Null? {};
+  field core::Function functionField = () → Null {};
+  field () → void functionTypeField = () → void {};
   synthetic constructor •() → self::Class
     : super core::Object::•()
     ;
   method method() → core::int
     return 0;
   get functionGetter() → core::Function
-    return () → core::Null? {};
+    return () → Null {};
   get functionTypeGetter() → () → void
-    return () → core::Null? {};
+    return () → void {};
 }
 extension Extension on self::Class {
   operator + = self::Extension|+;
@@ -636,13 +636,13 @@
 static method Extension|get#extensionMethod(final self::Class #this) → () → core::int
   return () → core::int => self::Extension|extensionMethod(#this);
 static method Extension|get#extensionFunctionGetter(final self::Class #this) → core::Function
-  return () → core::Null? {};
+  return () → Null {};
 static method Extension|get#extensionFunctionTypeGetter(final self::Class #this) → () → void
-  return () → core::Null? {};
+  return () → void {};
 static get nullableFunction() → core::Function?
-  return () → core::Null? {};
+  return () → Null {};
 static get nullableFunctionType() → () →? void
-  return () → core::Null? {};
+  return () → void {};
 static get nullableInt() → core::int?
   return 0;
 static get nullableMap() → core::Map<dynamic, dynamic>?
diff --git a/pkg/front_end/testcases/nnbd/potentially_nullable_access.dart.weak.expect b/pkg/front_end/testcases/nnbd/potentially_nullable_access.dart.weak.expect
index c4c45a5..c104f5c 100644
--- a/pkg/front_end/testcases/nnbd/potentially_nullable_access.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/potentially_nullable_access.dart.weak.expect
@@ -417,17 +417,17 @@
 
 class Class extends core::Object {
   field core::int property = 0;
-  field core::Function functionField = () → core::Null? {};
-  field () → void functionTypeField = () → core::Null? {};
+  field core::Function functionField = () → Null {};
+  field () → void functionTypeField = () → void {};
   synthetic constructor •() → self::Class
     : super core::Object::•()
     ;
   method method() → core::int
     return 0;
   get functionGetter() → core::Function
-    return () → core::Null? {};
+    return () → Null {};
   get functionTypeGetter() → () → void
-    return () → core::Null? {};
+    return () → void {};
 }
 extension Extension on self::Class {
   operator + = self::Extension|+;
@@ -636,13 +636,13 @@
 static method Extension|get#extensionMethod(final self::Class #this) → () → core::int
   return () → core::int => self::Extension|extensionMethod(#this);
 static method Extension|get#extensionFunctionGetter(final self::Class #this) → core::Function
-  return () → core::Null? {};
+  return () → Null {};
 static method Extension|get#extensionFunctionTypeGetter(final self::Class #this) → () → void
-  return () → core::Null? {};
+  return () → void {};
 static get nullableFunction() → core::Function?
-  return () → core::Null? {};
+  return () → Null {};
 static get nullableFunctionType() → () →? void
-  return () → core::Null? {};
+  return () → void {};
 static get nullableInt() → core::int?
   return 0;
 static get nullableMap() → core::Map<dynamic, dynamic>?
diff --git a/pkg/front_end/testcases/nnbd/required.dart.strong.expect b/pkg/front_end/testcases/nnbd/required.dart.strong.expect
index ed0ee8e..55eb694 100644
--- a/pkg/front_end/testcases/nnbd/required.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/required.dart.strong.expect
@@ -74,23 +74,23 @@
     ;
   method foo({core::int x = #C1}) → dynamic {}
 }
-static field ({a: core::int, required b: core::int}) → dynamic field = ({core::int a = #C1, required core::int b = #C2}) → core::Null? {};
+static field ({a: core::int, required b: core::int}) → dynamic field = ({core::int a = #C1, required core::int b = #C2}) → Null {};
 static method method({core::int a = #C1, required core::int b = #C2, required final core::int c = #C2}) → dynamic {}
 static method ok() → dynamic {
   ({a: core::int, required b: core::int}) → dynamic f;
   function g({core::int a = #C1, required core::int b = #C2}) → void {}
-  f = ({core::int a = #C1, required core::int b = #C2}) → core::Null? {};
+  f = ({core::int a = #C1, required core::int b = #C2}) → Null {};
   (core::int, [core::int]) → dynamic f2;
   function g2(core::int a, [core::int b = #C1]) → void {}
-  f2 = (core::int a, [core::int b = #C1]) → core::Null? {};
+  f2 = (core::int a, [core::int b = #C1]) → Null {};
 }
 static method error() → dynamic {
   ({a: core::int, required b: core::int}) → dynamic f;
   function g({core::int a = #C2, required core::int b = #C1}) → void {}
-  f = ({core::int a = #C2, required core::int b = #C1}) → core::Null? {};
+  f = ({core::int a = #C2, required core::int b = #C1}) → Null {};
   (core::int, [core::int]) → dynamic f2;
   function g2(core::int a = #C1, [core::int b = #C2]) → void {}
-  f2 = (core::int a = #C1, [core::int b = #C2]) → core::Null? {};
+  f2 = (core::int a = #C1, [core::int b = #C2]) → Null {};
 }
 static method main() → dynamic {}
 
diff --git a/pkg/front_end/testcases/nnbd/required.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/required.dart.strong.transformed.expect
index ed0ee8e..55eb694 100644
--- a/pkg/front_end/testcases/nnbd/required.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/required.dart.strong.transformed.expect
@@ -74,23 +74,23 @@
     ;
   method foo({core::int x = #C1}) → dynamic {}
 }
-static field ({a: core::int, required b: core::int}) → dynamic field = ({core::int a = #C1, required core::int b = #C2}) → core::Null? {};
+static field ({a: core::int, required b: core::int}) → dynamic field = ({core::int a = #C1, required core::int b = #C2}) → Null {};
 static method method({core::int a = #C1, required core::int b = #C2, required final core::int c = #C2}) → dynamic {}
 static method ok() → dynamic {
   ({a: core::int, required b: core::int}) → dynamic f;
   function g({core::int a = #C1, required core::int b = #C2}) → void {}
-  f = ({core::int a = #C1, required core::int b = #C2}) → core::Null? {};
+  f = ({core::int a = #C1, required core::int b = #C2}) → Null {};
   (core::int, [core::int]) → dynamic f2;
   function g2(core::int a, [core::int b = #C1]) → void {}
-  f2 = (core::int a, [core::int b = #C1]) → core::Null? {};
+  f2 = (core::int a, [core::int b = #C1]) → Null {};
 }
 static method error() → dynamic {
   ({a: core::int, required b: core::int}) → dynamic f;
   function g({core::int a = #C2, required core::int b = #C1}) → void {}
-  f = ({core::int a = #C2, required core::int b = #C1}) → core::Null? {};
+  f = ({core::int a = #C2, required core::int b = #C1}) → Null {};
   (core::int, [core::int]) → dynamic f2;
   function g2(core::int a = #C1, [core::int b = #C2]) → void {}
-  f2 = (core::int a = #C1, [core::int b = #C2]) → core::Null? {};
+  f2 = (core::int a = #C1, [core::int b = #C2]) → Null {};
 }
 static method main() → dynamic {}
 
diff --git a/pkg/front_end/testcases/nnbd/required.dart.weak.expect b/pkg/front_end/testcases/nnbd/required.dart.weak.expect
index ed0ee8e..55eb694 100644
--- a/pkg/front_end/testcases/nnbd/required.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/required.dart.weak.expect
@@ -74,23 +74,23 @@
     ;
   method foo({core::int x = #C1}) → dynamic {}
 }
-static field ({a: core::int, required b: core::int}) → dynamic field = ({core::int a = #C1, required core::int b = #C2}) → core::Null? {};
+static field ({a: core::int, required b: core::int}) → dynamic field = ({core::int a = #C1, required core::int b = #C2}) → Null {};
 static method method({core::int a = #C1, required core::int b = #C2, required final core::int c = #C2}) → dynamic {}
 static method ok() → dynamic {
   ({a: core::int, required b: core::int}) → dynamic f;
   function g({core::int a = #C1, required core::int b = #C2}) → void {}
-  f = ({core::int a = #C1, required core::int b = #C2}) → core::Null? {};
+  f = ({core::int a = #C1, required core::int b = #C2}) → Null {};
   (core::int, [core::int]) → dynamic f2;
   function g2(core::int a, [core::int b = #C1]) → void {}
-  f2 = (core::int a, [core::int b = #C1]) → core::Null? {};
+  f2 = (core::int a, [core::int b = #C1]) → Null {};
 }
 static method error() → dynamic {
   ({a: core::int, required b: core::int}) → dynamic f;
   function g({core::int a = #C2, required core::int b = #C1}) → void {}
-  f = ({core::int a = #C2, required core::int b = #C1}) → core::Null? {};
+  f = ({core::int a = #C2, required core::int b = #C1}) → Null {};
   (core::int, [core::int]) → dynamic f2;
   function g2(core::int a = #C1, [core::int b = #C2]) → void {}
-  f2 = (core::int a = #C1, [core::int b = #C2]) → core::Null? {};
+  f2 = (core::int a = #C1, [core::int b = #C2]) → Null {};
 }
 static method main() → dynamic {}
 
diff --git a/pkg/front_end/testcases/nnbd/required.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/required.dart.weak.transformed.expect
index ed0ee8e..55eb694 100644
--- a/pkg/front_end/testcases/nnbd/required.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/required.dart.weak.transformed.expect
@@ -74,23 +74,23 @@
     ;
   method foo({core::int x = #C1}) → dynamic {}
 }
-static field ({a: core::int, required b: core::int}) → dynamic field = ({core::int a = #C1, required core::int b = #C2}) → core::Null? {};
+static field ({a: core::int, required b: core::int}) → dynamic field = ({core::int a = #C1, required core::int b = #C2}) → Null {};
 static method method({core::int a = #C1, required core::int b = #C2, required final core::int c = #C2}) → dynamic {}
 static method ok() → dynamic {
   ({a: core::int, required b: core::int}) → dynamic f;
   function g({core::int a = #C1, required core::int b = #C2}) → void {}
-  f = ({core::int a = #C1, required core::int b = #C2}) → core::Null? {};
+  f = ({core::int a = #C1, required core::int b = #C2}) → Null {};
   (core::int, [core::int]) → dynamic f2;
   function g2(core::int a, [core::int b = #C1]) → void {}
-  f2 = (core::int a, [core::int b = #C1]) → core::Null? {};
+  f2 = (core::int a, [core::int b = #C1]) → Null {};
 }
 static method error() → dynamic {
   ({a: core::int, required b: core::int}) → dynamic f;
   function g({core::int a = #C2, required core::int b = #C1}) → void {}
-  f = ({core::int a = #C2, required core::int b = #C1}) → core::Null? {};
+  f = ({core::int a = #C2, required core::int b = #C1}) → Null {};
   (core::int, [core::int]) → dynamic f2;
   function g2(core::int a = #C1, [core::int b = #C2]) → void {}
-  f2 = (core::int a = #C1, [core::int b = #C2]) → core::Null? {};
+  f2 = (core::int a = #C1, [core::int b = #C2]) → Null {};
 }
 static method main() → dynamic {}
 
diff --git a/pkg/front_end/testcases/nnbd/return_async.dart.strong.expect b/pkg/front_end/testcases/nnbd/return_async.dart.strong.expect
index 2c9322b..2c50b42 100644
--- a/pkg/front_end/testcases/nnbd/return_async.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/return_async.dart.strong.expect
@@ -22,10 +22,10 @@
 }
 static method customErrorZone() → asy::Future<void> async {
   final asy::Completer<void> completer = asy::Completer::•<void>();
-  asy::runZonedGuarded<asy::Future<core::Null?>>(() → asy::Future<core::Null?> async {
+  asy::runZonedGuarded<asy::Future<Null>>(() → asy::Future<Null> async {
     await self::allYield();
     completer.{asy::Completer::complete}(null);
-  }, (core::Object e, core::StackTrace s) → core::Null? {
+  }, (core::Object e, core::StackTrace s) → void {
     completer.{asy::Completer::completeError}(e, s);
   });
   return completer.{asy::Completer::future};
diff --git a/pkg/front_end/testcases/nnbd/return_async.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/return_async.dart.strong.transformed.expect
index ae00b67..8c64d78 100644
--- a/pkg/front_end/testcases/nnbd/return_async.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/return_async.dart.strong.transformed.expect
@@ -10,7 +10,8 @@
   throw "";
 }
 static method allYield() → asy::Future<void> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<void> :async_completer = new asy::_AsyncAwaitCompleter::•<void>();
+  final asy::_Future<void> :async_future = new asy::_Future::•<void>();
+  core::bool* :is_sync = false;
   FutureOr<void>? :return_value;
   dynamic :async_stack_trace;
   (dynamic) → dynamic :async_op_then;
@@ -27,20 +28,22 @@
         [yield] let dynamic #t2 = asy::_awaitHelper(self::allYield2(), :async_op_then, :async_op_error, :async_op) in null;
         _in::unsafeCast<void>(:result);
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method allYield2() → asy::Future<void> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<void> :async_completer = new asy::_AsyncAwaitCompleter::•<void>();
+  final asy::_Future<void> :async_future = new asy::_Future::•<void>();
+  core::bool* :is_sync = false;
   FutureOr<void>? :return_value;
   dynamic :async_stack_trace;
   (dynamic) → dynamic :async_op_then;
@@ -57,20 +60,22 @@
         [yield] let dynamic #t4 = asy::_awaitHelper(self::allYield3(), :async_op_then, :async_op_error, :async_op) in null;
         _in::unsafeCast<void>(:result);
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method allYield3() → asy::Future<void> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<void> :async_completer = new asy::_AsyncAwaitCompleter::•<void>();
+  final asy::_Future<void> :async_future = new asy::_Future::•<void>();
+  core::bool* :is_sync = false;
   FutureOr<void>? :return_value;
   dynamic :async_stack_trace;
   (dynamic) → dynamic :async_op_then;
@@ -86,20 +91,22 @@
         _in::unsafeCast<core::int>(:result);
         self::throwSync();
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method customErrorZone() → asy::Future<void> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<void> :async_completer = new asy::_AsyncAwaitCompleter::•<void>();
+  final asy::_Future<void> :async_future = new asy::_Future::•<void>();
+  core::bool* :is_sync = false;
   FutureOr<void>? :return_value;
   dynamic :async_stack_trace;
   (dynamic) → dynamic :async_op_then;
@@ -111,9 +118,10 @@
       #L4:
       {
         final asy::Completer<void> completer = asy::Completer::•<void>();
-        asy::runZonedGuarded<asy::Future<core::Null?>>(() → asy::Future<core::Null?> /* originally async */ {
-          final asy::_AsyncAwaitCompleter<core::Null?> :async_completer = new asy::_AsyncAwaitCompleter::•<core::Null?>();
-          FutureOr<core::Null?>? :return_value;
+        asy::runZonedGuarded<asy::Future<Null>>(() → asy::Future<Null> /* originally async */ {
+          final asy::_Future<Null> :async_future = new asy::_Future::•<Null>();
+          core::bool* :is_sync = false;
+          FutureOr<Null>? :return_value;
           dynamic :async_stack_trace;
           (dynamic) → dynamic :async_op_then;
           (core::Object, core::StackTrace) → dynamic :async_op_error;
@@ -128,33 +136,35 @@
                 _in::unsafeCast<void>(:result);
                 completer.{asy::Completer::complete}(null);
               }
-              asy::_completeOnAsyncReturn(:async_completer, :return_value);
+              asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
               return;
             }
             on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-              :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+              asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
             }
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-          :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-          return :async_completer.{asy::Completer::future};
-        }, (core::Object e, core::StackTrace s) → core::Null? {
+          :async_op.call();
+          :is_sync = true;
+          return :async_future;
+        }, (core::Object e, core::StackTrace s) → void {
           completer.{asy::Completer::completeError}(e, s);
         });
         :return_value = completer.{asy::Completer::future};
         break #L4;
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/return_async.dart.weak.expect b/pkg/front_end/testcases/nnbd/return_async.dart.weak.expect
index 2c9322b..2c50b42 100644
--- a/pkg/front_end/testcases/nnbd/return_async.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/return_async.dart.weak.expect
@@ -22,10 +22,10 @@
 }
 static method customErrorZone() → asy::Future<void> async {
   final asy::Completer<void> completer = asy::Completer::•<void>();
-  asy::runZonedGuarded<asy::Future<core::Null?>>(() → asy::Future<core::Null?> async {
+  asy::runZonedGuarded<asy::Future<Null>>(() → asy::Future<Null> async {
     await self::allYield();
     completer.{asy::Completer::complete}(null);
-  }, (core::Object e, core::StackTrace s) → core::Null? {
+  }, (core::Object e, core::StackTrace s) → void {
     completer.{asy::Completer::completeError}(e, s);
   });
   return completer.{asy::Completer::future};
diff --git a/pkg/front_end/testcases/nnbd/return_async.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/return_async.dart.weak.transformed.expect
index ae00b67..8c64d78 100644
--- a/pkg/front_end/testcases/nnbd/return_async.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/return_async.dart.weak.transformed.expect
@@ -10,7 +10,8 @@
   throw "";
 }
 static method allYield() → asy::Future<void> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<void> :async_completer = new asy::_AsyncAwaitCompleter::•<void>();
+  final asy::_Future<void> :async_future = new asy::_Future::•<void>();
+  core::bool* :is_sync = false;
   FutureOr<void>? :return_value;
   dynamic :async_stack_trace;
   (dynamic) → dynamic :async_op_then;
@@ -27,20 +28,22 @@
         [yield] let dynamic #t2 = asy::_awaitHelper(self::allYield2(), :async_op_then, :async_op_error, :async_op) in null;
         _in::unsafeCast<void>(:result);
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method allYield2() → asy::Future<void> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<void> :async_completer = new asy::_AsyncAwaitCompleter::•<void>();
+  final asy::_Future<void> :async_future = new asy::_Future::•<void>();
+  core::bool* :is_sync = false;
   FutureOr<void>? :return_value;
   dynamic :async_stack_trace;
   (dynamic) → dynamic :async_op_then;
@@ -57,20 +60,22 @@
         [yield] let dynamic #t4 = asy::_awaitHelper(self::allYield3(), :async_op_then, :async_op_error, :async_op) in null;
         _in::unsafeCast<void>(:result);
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method allYield3() → asy::Future<void> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<void> :async_completer = new asy::_AsyncAwaitCompleter::•<void>();
+  final asy::_Future<void> :async_future = new asy::_Future::•<void>();
+  core::bool* :is_sync = false;
   FutureOr<void>? :return_value;
   dynamic :async_stack_trace;
   (dynamic) → dynamic :async_op_then;
@@ -86,20 +91,22 @@
         _in::unsafeCast<core::int>(:result);
         self::throwSync();
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method customErrorZone() → asy::Future<void> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<void> :async_completer = new asy::_AsyncAwaitCompleter::•<void>();
+  final asy::_Future<void> :async_future = new asy::_Future::•<void>();
+  core::bool* :is_sync = false;
   FutureOr<void>? :return_value;
   dynamic :async_stack_trace;
   (dynamic) → dynamic :async_op_then;
@@ -111,9 +118,10 @@
       #L4:
       {
         final asy::Completer<void> completer = asy::Completer::•<void>();
-        asy::runZonedGuarded<asy::Future<core::Null?>>(() → asy::Future<core::Null?> /* originally async */ {
-          final asy::_AsyncAwaitCompleter<core::Null?> :async_completer = new asy::_AsyncAwaitCompleter::•<core::Null?>();
-          FutureOr<core::Null?>? :return_value;
+        asy::runZonedGuarded<asy::Future<Null>>(() → asy::Future<Null> /* originally async */ {
+          final asy::_Future<Null> :async_future = new asy::_Future::•<Null>();
+          core::bool* :is_sync = false;
+          FutureOr<Null>? :return_value;
           dynamic :async_stack_trace;
           (dynamic) → dynamic :async_op_then;
           (core::Object, core::StackTrace) → dynamic :async_op_error;
@@ -128,33 +136,35 @@
                 _in::unsafeCast<void>(:result);
                 completer.{asy::Completer::complete}(null);
               }
-              asy::_completeOnAsyncReturn(:async_completer, :return_value);
+              asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
               return;
             }
             on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-              :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+              asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
             }
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-          :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-          return :async_completer.{asy::Completer::future};
-        }, (core::Object e, core::StackTrace s) → core::Null? {
+          :async_op.call();
+          :is_sync = true;
+          return :async_future;
+        }, (core::Object e, core::StackTrace s) → void {
           completer.{asy::Completer::completeError}(e, s);
         });
         :return_value = completer.{asy::Completer::future};
         break #L4;
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/return_null.dart.strong.expect b/pkg/front_end/testcases/nnbd/return_null.dart.strong.expect
index 99136f1..ad7fa70 100644
--- a/pkg/front_end/testcases/nnbd/return_null.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/return_null.dart.strong.expect
@@ -6,11 +6,11 @@
 // String returnImplicit() /*error*/ {
 //        ^
 //
-// pkg/front_end/testcases/nnbd/return_null.dart:13:10: Error: A value of type 'Null' can't be returned from a function with return type 'String'.
+// pkg/front_end/testcases/nnbd/return_null.dart:13:10: Error: The value 'null' can't be returned from a function with return type 'String' because 'String' is not nullable.
 //   return null; // error
 //          ^
 //
-// pkg/front_end/testcases/nnbd/return_null.dart:19:12: Error: A value of type 'Null' can't be returned from a function with return type 'String'.
+// pkg/front_end/testcases/nnbd/return_null.dart:19:12: Error: The value 'null' can't be returned from a function with return type 'String' because 'String' is not nullable.
 //     return null; // error
 //            ^
 //
@@ -31,11 +31,11 @@
 //   String returnImplicit() /* error */ {
 //   ^
 //
-// pkg/front_end/testcases/nnbd/return_null.dart:69:12: Error: A value of type 'Null' can't be returned from a function with return type 'String'.
+// pkg/front_end/testcases/nnbd/return_null.dart:69:12: Error: The value 'null' can't be returned from a function with return type 'String' because 'String' is not nullable.
 //     return null; // error
 //            ^
 //
-// pkg/front_end/testcases/nnbd/return_null.dart:75:14: Error: A value of type 'Null' can't be returned from a function with return type 'String'.
+// pkg/front_end/testcases/nnbd/return_null.dart:75:14: Error: The value 'null' can't be returned from a function with return type 'String' because 'String' is not nullable.
 //       return null; // error
 //              ^
 //
@@ -78,14 +78,14 @@
 }
 static method returnExplicit() → core::String {
   core::print("foo");
-  return let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:13:10: Error: A value of type 'Null' can't be returned from a function with return type 'String'.
+  return let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:13:10: Error: The value 'null' can't be returned from a function with return type 'String' because 'String' is not nullable.
   return null; // error
          ^" in null as{TypeError,ForNonNullableByDefault} core::String;
 }
 static method returnMixed(core::bool b) → core::String {
   if(b) {
     core::print("foo");
-    return let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:19:12: Error: A value of type 'Null' can't be returned from a function with return type 'String'.
+    return let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:19:12: Error: The value 'null' can't be returned from a function with return type 'String' because 'String' is not nullable.
     return null; // error
            ^" in null as{TypeError,ForNonNullableByDefault} core::String;
   }
@@ -147,14 +147,14 @@
   }
   function returnExplicit() → core::String {
     core::print("foo");
-    return let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:69:12: Error: A value of type 'Null' can't be returned from a function with return type 'String'.
+    return let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:69:12: Error: The value 'null' can't be returned from a function with return type 'String' because 'String' is not nullable.
     return null; // error
            ^" in null as{TypeError,ForNonNullableByDefault} core::String;
   }
   function returnMixed(core::bool b) → core::String {
     if(b) {
       core::print("foo");
-      return let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:75:14: Error: A value of type 'Null' can't be returned from a function with return type 'String'.
+      return let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:75:14: Error: The value 'null' can't be returned from a function with return type 'String' because 'String' is not nullable.
       return null; // error
              ^" in null as{TypeError,ForNonNullableByDefault} core::String;
     }
@@ -170,7 +170,7 @@
   ^" in null;
   }
   function returnAsync4() → FutureOr<core::int?> async {}
-  function returnAsync5() → asy::Future<core::Null?> async {}
+  function returnAsync5() → asy::Future<Null> async {}
   function returnAsync6() → asy::Future<core::int?> async {
     return null;
   }
diff --git a/pkg/front_end/testcases/nnbd/return_null.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/return_null.dart.strong.transformed.expect
index 3d6ecf6..66eca58 100644
--- a/pkg/front_end/testcases/nnbd/return_null.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/return_null.dart.strong.transformed.expect
@@ -6,11 +6,11 @@
 // String returnImplicit() /*error*/ {
 //        ^
 //
-// pkg/front_end/testcases/nnbd/return_null.dart:13:10: Error: A value of type 'Null' can't be returned from a function with return type 'String'.
+// pkg/front_end/testcases/nnbd/return_null.dart:13:10: Error: The value 'null' can't be returned from a function with return type 'String' because 'String' is not nullable.
 //   return null; // error
 //          ^
 //
-// pkg/front_end/testcases/nnbd/return_null.dart:19:12: Error: A value of type 'Null' can't be returned from a function with return type 'String'.
+// pkg/front_end/testcases/nnbd/return_null.dart:19:12: Error: The value 'null' can't be returned from a function with return type 'String' because 'String' is not nullable.
 //     return null; // error
 //            ^
 //
@@ -31,11 +31,11 @@
 //   String returnImplicit() /* error */ {
 //   ^
 //
-// pkg/front_end/testcases/nnbd/return_null.dart:69:12: Error: A value of type 'Null' can't be returned from a function with return type 'String'.
+// pkg/front_end/testcases/nnbd/return_null.dart:69:12: Error: The value 'null' can't be returned from a function with return type 'String' because 'String' is not nullable.
 //     return null; // error
 //            ^
 //
-// pkg/front_end/testcases/nnbd/return_null.dart:75:14: Error: A value of type 'Null' can't be returned from a function with return type 'String'.
+// pkg/front_end/testcases/nnbd/return_null.dart:75:14: Error: The value 'null' can't be returned from a function with return type 'String' because 'String' is not nullable.
 //       return null; // error
 //              ^
 //
@@ -78,23 +78,24 @@
 }
 static method returnExplicit() → core::String {
   core::print("foo");
-  return let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:13:10: Error: A value of type 'Null' can't be returned from a function with return type 'String'.
+  return let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:13:10: Error: The value 'null' can't be returned from a function with return type 'String' because 'String' is not nullable.
   return null; // error
-         ^" in let core::Null? #t3 = null in #t3.==(null) ?{core::String} #t3 as{TypeError,ForNonNullableByDefault} core::String : #t3{core::String};
+         ^" in let Null #t3 = null in #t3.==(null) ?{core::String} #t3 as{TypeError,ForNonNullableByDefault} core::String : #t3{core::String};
 }
 static method returnMixed(core::bool b) → core::String {
   if(b) {
     core::print("foo");
-    return let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:19:12: Error: A value of type 'Null' can't be returned from a function with return type 'String'.
+    return let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:19:12: Error: The value 'null' can't be returned from a function with return type 'String' because 'String' is not nullable.
     return null; // error
-           ^" in let core::Null? #t5 = null in #t5.==(null) ?{core::String} #t5 as{TypeError,ForNonNullableByDefault} core::String : #t5{core::String};
+           ^" in let Null #t5 = null in #t5.==(null) ?{core::String} #t5 as{TypeError,ForNonNullableByDefault} core::String : #t5{core::String};
   }
   return let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:16:8: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
 String returnMixed(bool b) /*error*/ {
        ^" in null;
 }
 static method returnAsync1() → asy::Future<dynamic> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic> :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>? :return_value;
   dynamic :async_stack_trace;
   (dynamic) → dynamic :async_op_then;
@@ -105,20 +106,22 @@
     try {
       #L1:
       {}
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method returnAsync2() → FutureOr<dynamic> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic> :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>? :return_value;
   dynamic :async_stack_trace;
   (dynamic) → dynamic :async_op_then;
@@ -129,20 +132,22 @@
     try {
       #L2:
       {}
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method returnAsync3() → FutureOr<core::int> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
+  final asy::_Future<core::int> :async_future = new asy::_Future::•<core::int>();
+  core::bool* :is_sync = false;
   FutureOr<core::int>? :return_value;
   dynamic :async_stack_trace;
   (dynamic) → dynamic :async_op_then;
@@ -158,20 +163,22 @@
               ^" in null;
         break #L3;
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method returnAsync4() → FutureOr<core::int?> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::int?> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int?>();
+  final asy::_Future<core::int?> :async_future = new asy::_Future::•<core::int?>();
+  core::bool* :is_sync = false;
   FutureOr<core::int?>? :return_value;
   dynamic :async_stack_trace;
   (dynamic) → dynamic :async_op_then;
@@ -182,20 +189,22 @@
     try {
       #L4:
       {}
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method returnAsync5() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic> :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>? :return_value;
   dynamic :async_stack_trace;
   (dynamic) → dynamic :async_op_then;
@@ -206,20 +215,22 @@
     try {
       #L5:
       {}
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method returnAsync6() → asy::Future<core::int?> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::int?> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int?>();
+  final asy::_Future<core::int?> :async_future = new asy::_Future::•<core::int?>();
+  core::bool* :is_sync = false;
   FutureOr<core::int?>? :return_value;
   dynamic :async_stack_trace;
   (dynamic) → dynamic :async_op_then;
@@ -233,20 +244,22 @@
         :return_value = null;
         break #L6;
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method returnAsync7() → asy::Future<core::int?> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::int?> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int?>();
+  final asy::_Future<core::int?> :async_future = new asy::_Future::•<core::int?>();
+  core::bool* :is_sync = false;
   FutureOr<core::int?>? :return_value;
   dynamic :async_stack_trace;
   (dynamic) → dynamic :async_op_then;
@@ -257,26 +270,28 @@
     try {
       #L7:
       {}
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method yieldSync() → core::Iterable<dynamic> /* originally sync* */ {
-  function :sync_op_gen() → (core::_SyncIterator<dynamic>?) → core::bool* {
+  function :sync_op_gen() → (core::_SyncIterator<dynamic>?, dynamic, dynamic) → core::bool* {
     core::int :await_jump_var = 0;
     dynamic :await_ctx_var;
-    return (core::_SyncIterator<dynamic>? :iterator) → core::bool* yielding {
+    function :sync_op(core::_SyncIterator<dynamic>? :iterator, dynamic :exception, dynamic :stack_trace) → core::bool* yielding {
       {}
       return false;
-    };
+    }
+    return :sync_op;
   }
   return new core::_SyncIterable::•<dynamic>(:sync_op_gen);
 }
@@ -347,23 +362,24 @@
   }
   function returnExplicit() → core::String {
     core::print("foo");
-    return let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:69:12: Error: A value of type 'Null' can't be returned from a function with return type 'String'.
+    return let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:69:12: Error: The value 'null' can't be returned from a function with return type 'String' because 'String' is not nullable.
     return null; // error
-           ^" in let core::Null? #t11 = null in #t11.==(null) ?{core::String} #t11 as{TypeError,ForNonNullableByDefault} core::String : #t11{core::String};
+           ^" in let Null #t11 = null in #t11.==(null) ?{core::String} #t11 as{TypeError,ForNonNullableByDefault} core::String : #t11{core::String};
   }
   function returnMixed(core::bool b) → core::String {
     if(b) {
       core::print("foo");
-      return let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:75:14: Error: A value of type 'Null' can't be returned from a function with return type 'String'.
+      return let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:75:14: Error: The value 'null' can't be returned from a function with return type 'String' because 'String' is not nullable.
       return null; // error
-             ^" in let core::Null? #t13 = null in #t13.==(null) ?{core::String} #t13 as{TypeError,ForNonNullableByDefault} core::String : #t13{core::String};
+             ^" in let Null #t13 = null in #t13.==(null) ?{core::String} #t13 as{TypeError,ForNonNullableByDefault} core::String : #t13{core::String};
     }
     return let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:72:3: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
   String returnMixed(bool b) /* error */ {
   ^" in null;
   }
   function returnAsync1() → asy::Future<dynamic> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    final asy::_Future<dynamic> :async_future = new asy::_Future::•<dynamic>();
+    core::bool* :is_sync = false;
     FutureOr<dynamic>? :return_value;
     dynamic :async_stack_trace;
     (dynamic) → dynamic :async_op_then;
@@ -374,20 +390,22 @@
       try {
         #L13:
         {}
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   }
   function returnAsync2() → FutureOr<dynamic> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    final asy::_Future<dynamic> :async_future = new asy::_Future::•<dynamic>();
+    core::bool* :is_sync = false;
     FutureOr<dynamic>? :return_value;
     dynamic :async_stack_trace;
     (dynamic) → dynamic :async_op_then;
@@ -398,20 +416,22 @@
       try {
         #L14:
         {}
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   }
   function returnAsync3() → FutureOr<core::int> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
+    final asy::_Future<core::int> :async_future = new asy::_Future::•<core::int>();
+    core::bool* :is_sync = false;
     FutureOr<core::int>? :return_value;
     dynamic :async_stack_trace;
     (dynamic) → dynamic :async_op_then;
@@ -427,20 +447,22 @@
   ^" in null;
           break #L15;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   }
   function returnAsync4() → FutureOr<core::int?> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int?> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int?>();
+    final asy::_Future<core::int?> :async_future = new asy::_Future::•<core::int?>();
+    core::bool* :is_sync = false;
     FutureOr<core::int?>? :return_value;
     dynamic :async_stack_trace;
     (dynamic) → dynamic :async_op_then;
@@ -451,21 +473,23 @@
       try {
         #L16:
         {}
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   }
-  function returnAsync5() → asy::Future<core::Null?> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::Null?> :async_completer = new asy::_AsyncAwaitCompleter::•<core::Null?>();
-    FutureOr<core::Null?>? :return_value;
+  function returnAsync5() → asy::Future<Null> /* originally async */ {
+    final asy::_Future<Null> :async_future = new asy::_Future::•<Null>();
+    core::bool* :is_sync = false;
+    FutureOr<Null>? :return_value;
     dynamic :async_stack_trace;
     (dynamic) → dynamic :async_op_then;
     (core::Object, core::StackTrace) → dynamic :async_op_error;
@@ -475,20 +499,22 @@
       try {
         #L17:
         {}
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   }
   function returnAsync6() → asy::Future<core::int?> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int?> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int?>();
+    final asy::_Future<core::int?> :async_future = new asy::_Future::•<core::int?>();
+    core::bool* :is_sync = false;
     FutureOr<core::int?>? :return_value;
     dynamic :async_stack_trace;
     (dynamic) → dynamic :async_op_then;
@@ -502,20 +528,22 @@
           :return_value = null;
           break #L18;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   }
   function returnAsync7() → asy::Future<core::int?> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int?> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int?>();
+    final asy::_Future<core::int?> :async_future = new asy::_Future::•<core::int?>();
+    core::bool* :is_sync = false;
     FutureOr<core::int?>? :return_value;
     dynamic :async_stack_trace;
     (dynamic) → dynamic :async_op_then;
@@ -526,26 +554,28 @@
       try {
         #L19:
         {}
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   }
   function yieldSync() → core::Iterable<dynamic> /* originally sync* */ {
-    function :sync_op_gen() → (core::_SyncIterator<dynamic>?) → core::bool* {
+    function :sync_op_gen() → (core::_SyncIterator<dynamic>?, dynamic, dynamic) → core::bool* {
       core::int :await_jump_var = 0;
       dynamic :await_ctx_var;
-      return (core::_SyncIterator<dynamic>? :iterator) → core::bool* yielding {
+      function :sync_op(core::_SyncIterator<dynamic>? :iterator, dynamic :exception, dynamic :stack_trace) → core::bool* yielding {
         {}
         return false;
-      };
+      }
+      return :sync_op;
     }
     return new core::_SyncIterable::•<dynamic>(:sync_op_gen);
   }
@@ -644,4 +674,4 @@
 Evaluated: MethodInvocation @ org-dartlang-testcase:///return_null.dart:75:14 -> BoolConstant(true)
 Evaluated: VariableGet @ org-dartlang-testcase:///return_null.dart:75:14 -> NullConstant(null)
 Evaluated: VariableGet @ org-dartlang-testcase:///return_null.dart:75:14 -> NullConstant(null)
-Extra constant evaluation: evaluated: 428, effectively constant: 12
+Extra constant evaluation: evaluated: 442, effectively constant: 12
diff --git a/pkg/front_end/testcases/nnbd/return_null.dart.weak.expect b/pkg/front_end/testcases/nnbd/return_null.dart.weak.expect
index 75221ed..e747dfe 100644
--- a/pkg/front_end/testcases/nnbd/return_null.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/return_null.dart.weak.expect
@@ -6,11 +6,11 @@
 // String returnImplicit() /*error*/ {
 //        ^
 //
-// pkg/front_end/testcases/nnbd/return_null.dart:13:10: Error: A value of type 'Null' can't be returned from a function with return type 'String'.
+// pkg/front_end/testcases/nnbd/return_null.dart:13:10: Error: The value 'null' can't be returned from a function with return type 'String' because 'String' is not nullable.
 //   return null; // error
 //          ^
 //
-// pkg/front_end/testcases/nnbd/return_null.dart:19:12: Error: A value of type 'Null' can't be returned from a function with return type 'String'.
+// pkg/front_end/testcases/nnbd/return_null.dart:19:12: Error: The value 'null' can't be returned from a function with return type 'String' because 'String' is not nullable.
 //     return null; // error
 //            ^
 //
@@ -31,11 +31,11 @@
 //   String returnImplicit() /* error */ {
 //   ^
 //
-// pkg/front_end/testcases/nnbd/return_null.dart:69:12: Error: A value of type 'Null' can't be returned from a function with return type 'String'.
+// pkg/front_end/testcases/nnbd/return_null.dart:69:12: Error: The value 'null' can't be returned from a function with return type 'String' because 'String' is not nullable.
 //     return null; // error
 //            ^
 //
-// pkg/front_end/testcases/nnbd/return_null.dart:75:14: Error: A value of type 'Null' can't be returned from a function with return type 'String'.
+// pkg/front_end/testcases/nnbd/return_null.dart:75:14: Error: The value 'null' can't be returned from a function with return type 'String' because 'String' is not nullable.
 //       return null; // error
 //              ^
 //
@@ -79,14 +79,14 @@
 }
 static method returnExplicit() → core::String {
   core::print("foo");
-  return let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:13:10: Error: A value of type 'Null' can't be returned from a function with return type 'String'.
+  return let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:13:10: Error: The value 'null' can't be returned from a function with return type 'String' because 'String' is not nullable.
   return null; // error
          ^" in null as{TypeError,ForNonNullableByDefault} core::String;
 }
 static method returnMixed(core::bool b) → core::String {
   if(b) {
     core::print("foo");
-    return let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:19:12: Error: A value of type 'Null' can't be returned from a function with return type 'String'.
+    return let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:19:12: Error: The value 'null' can't be returned from a function with return type 'String' because 'String' is not nullable.
     return null; // error
            ^" in null as{TypeError,ForNonNullableByDefault} core::String;
   }
@@ -151,14 +151,14 @@
   }
   function returnExplicit() → core::String {
     core::print("foo");
-    return let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:69:12: Error: A value of type 'Null' can't be returned from a function with return type 'String'.
+    return let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:69:12: Error: The value 'null' can't be returned from a function with return type 'String' because 'String' is not nullable.
     return null; // error
            ^" in null as{TypeError,ForNonNullableByDefault} core::String;
   }
   function returnMixed(core::bool b) → core::String {
     if(b) {
       core::print("foo");
-      return let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:75:14: Error: A value of type 'Null' can't be returned from a function with return type 'String'.
+      return let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:75:14: Error: The value 'null' can't be returned from a function with return type 'String' because 'String' is not nullable.
       return null; // error
              ^" in null as{TypeError,ForNonNullableByDefault} core::String;
     }
@@ -174,7 +174,7 @@
   ^" in null;
   }
   function returnAsync4() → FutureOr<core::int?> async {}
-  function returnAsync5() → asy::Future<core::Null?> async {}
+  function returnAsync5() → asy::Future<Null> async {}
   function returnAsync6() → asy::Future<core::int?> async {
     return null;
   }
diff --git a/pkg/front_end/testcases/nnbd/return_null.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/return_null.dart.weak.transformed.expect
index 91bc7b3..4b3b79c 100644
--- a/pkg/front_end/testcases/nnbd/return_null.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/return_null.dart.weak.transformed.expect
@@ -6,11 +6,11 @@
 // String returnImplicit() /*error*/ {
 //        ^
 //
-// pkg/front_end/testcases/nnbd/return_null.dart:13:10: Error: A value of type 'Null' can't be returned from a function with return type 'String'.
+// pkg/front_end/testcases/nnbd/return_null.dart:13:10: Error: The value 'null' can't be returned from a function with return type 'String' because 'String' is not nullable.
 //   return null; // error
 //          ^
 //
-// pkg/front_end/testcases/nnbd/return_null.dart:19:12: Error: A value of type 'Null' can't be returned from a function with return type 'String'.
+// pkg/front_end/testcases/nnbd/return_null.dart:19:12: Error: The value 'null' can't be returned from a function with return type 'String' because 'String' is not nullable.
 //     return null; // error
 //            ^
 //
@@ -31,11 +31,11 @@
 //   String returnImplicit() /* error */ {
 //   ^
 //
-// pkg/front_end/testcases/nnbd/return_null.dart:69:12: Error: A value of type 'Null' can't be returned from a function with return type 'String'.
+// pkg/front_end/testcases/nnbd/return_null.dart:69:12: Error: The value 'null' can't be returned from a function with return type 'String' because 'String' is not nullable.
 //     return null; // error
 //            ^
 //
-// pkg/front_end/testcases/nnbd/return_null.dart:75:14: Error: A value of type 'Null' can't be returned from a function with return type 'String'.
+// pkg/front_end/testcases/nnbd/return_null.dart:75:14: Error: The value 'null' can't be returned from a function with return type 'String' because 'String' is not nullable.
 //       return null; // error
 //              ^
 //
@@ -79,14 +79,14 @@
 }
 static method returnExplicit() → core::String {
   core::print("foo");
-  return let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:13:10: Error: A value of type 'Null' can't be returned from a function with return type 'String'.
+  return let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:13:10: Error: The value 'null' can't be returned from a function with return type 'String' because 'String' is not nullable.
   return null; // error
          ^" in null;
 }
 static method returnMixed(core::bool b) → core::String {
   if(b) {
     core::print("foo");
-    return let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:19:12: Error: A value of type 'Null' can't be returned from a function with return type 'String'.
+    return let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:19:12: Error: The value 'null' can't be returned from a function with return type 'String' because 'String' is not nullable.
     return null; // error
            ^" in null;
   }
@@ -95,7 +95,8 @@
        ^" in null;
 }
 static method returnAsync1() → asy::Future<dynamic> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic> :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>? :return_value;
   dynamic :async_stack_trace;
   (dynamic) → dynamic :async_op_then;
@@ -106,20 +107,22 @@
     try {
       #L1:
       {}
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method returnAsync2() → FutureOr<dynamic> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic> :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>? :return_value;
   dynamic :async_stack_trace;
   (dynamic) → dynamic :async_op_then;
@@ -130,20 +133,22 @@
     try {
       #L2:
       {}
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method returnAsync3() → FutureOr<core::int> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
+  final asy::_Future<core::int> :async_future = new asy::_Future::•<core::int>();
+  core::bool* :is_sync = false;
   FutureOr<core::int>? :return_value;
   dynamic :async_stack_trace;
   (dynamic) → dynamic :async_op_then;
@@ -159,20 +164,22 @@
               ^" in null;
         break #L3;
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method returnAsync4() → FutureOr<core::int?> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::int?> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int?>();
+  final asy::_Future<core::int?> :async_future = new asy::_Future::•<core::int?>();
+  core::bool* :is_sync = false;
   FutureOr<core::int?>? :return_value;
   dynamic :async_stack_trace;
   (dynamic) → dynamic :async_op_then;
@@ -183,20 +190,22 @@
     try {
       #L4:
       {}
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method returnAsync5() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic> :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>? :return_value;
   dynamic :async_stack_trace;
   (dynamic) → dynamic :async_op_then;
@@ -207,20 +216,22 @@
     try {
       #L5:
       {}
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method returnAsync6() → asy::Future<core::int?> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::int?> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int?>();
+  final asy::_Future<core::int?> :async_future = new asy::_Future::•<core::int?>();
+  core::bool* :is_sync = false;
   FutureOr<core::int?>? :return_value;
   dynamic :async_stack_trace;
   (dynamic) → dynamic :async_op_then;
@@ -234,20 +245,22 @@
         :return_value = null;
         break #L6;
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method returnAsync7() → asy::Future<core::int?> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::int?> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int?>();
+  final asy::_Future<core::int?> :async_future = new asy::_Future::•<core::int?>();
+  core::bool* :is_sync = false;
   FutureOr<core::int?>? :return_value;
   dynamic :async_stack_trace;
   (dynamic) → dynamic :async_op_then;
@@ -258,26 +271,28 @@
     try {
       #L7:
       {}
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method yieldSync() → core::Iterable<dynamic> /* originally sync* */ {
-  function :sync_op_gen() → (core::_SyncIterator<dynamic>?) → core::bool* {
+  function :sync_op_gen() → (core::_SyncIterator<dynamic>?, dynamic, dynamic) → core::bool* {
     core::int :await_jump_var = 0;
     dynamic :await_ctx_var;
-    return (core::_SyncIterator<dynamic>? :iterator) → core::bool* yielding {
+    function :sync_op(core::_SyncIterator<dynamic>? :iterator, dynamic :exception, dynamic :stack_trace) → core::bool* yielding {
       {}
       return false;
-    };
+    }
+    return :sync_op;
   }
   return new core::_SyncIterable::•<dynamic>(:sync_op_gen);
 }
@@ -351,14 +366,14 @@
   }
   function returnExplicit() → core::String {
     core::print("foo");
-    return let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:69:12: Error: A value of type 'Null' can't be returned from a function with return type 'String'.
+    return let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:69:12: Error: The value 'null' can't be returned from a function with return type 'String' because 'String' is not nullable.
     return null; // error
            ^" in null;
   }
   function returnMixed(core::bool b) → core::String {
     if(b) {
       core::print("foo");
-      return let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:75:14: Error: A value of type 'Null' can't be returned from a function with return type 'String'.
+      return let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:75:14: Error: The value 'null' can't be returned from a function with return type 'String' because 'String' is not nullable.
       return null; // error
              ^" in null;
     }
@@ -367,7 +382,8 @@
   ^" in null;
   }
   function returnAsync1() → asy::Future<dynamic> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    final asy::_Future<dynamic> :async_future = new asy::_Future::•<dynamic>();
+    core::bool* :is_sync = false;
     FutureOr<dynamic>? :return_value;
     dynamic :async_stack_trace;
     (dynamic) → dynamic :async_op_then;
@@ -378,20 +394,22 @@
       try {
         #L14:
         {}
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   }
   function returnAsync2() → FutureOr<dynamic> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    final asy::_Future<dynamic> :async_future = new asy::_Future::•<dynamic>();
+    core::bool* :is_sync = false;
     FutureOr<dynamic>? :return_value;
     dynamic :async_stack_trace;
     (dynamic) → dynamic :async_op_then;
@@ -402,20 +420,22 @@
       try {
         #L15:
         {}
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   }
   function returnAsync3() → FutureOr<core::int> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
+    final asy::_Future<core::int> :async_future = new asy::_Future::•<core::int>();
+    core::bool* :is_sync = false;
     FutureOr<core::int>? :return_value;
     dynamic :async_stack_trace;
     (dynamic) → dynamic :async_op_then;
@@ -431,20 +451,22 @@
   ^" in null;
           break #L16;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   }
   function returnAsync4() → FutureOr<core::int?> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int?> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int?>();
+    final asy::_Future<core::int?> :async_future = new asy::_Future::•<core::int?>();
+    core::bool* :is_sync = false;
     FutureOr<core::int?>? :return_value;
     dynamic :async_stack_trace;
     (dynamic) → dynamic :async_op_then;
@@ -455,21 +477,23 @@
       try {
         #L17:
         {}
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   }
-  function returnAsync5() → asy::Future<core::Null?> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::Null?> :async_completer = new asy::_AsyncAwaitCompleter::•<core::Null?>();
-    FutureOr<core::Null?>? :return_value;
+  function returnAsync5() → asy::Future<Null> /* originally async */ {
+    final asy::_Future<Null> :async_future = new asy::_Future::•<Null>();
+    core::bool* :is_sync = false;
+    FutureOr<Null>? :return_value;
     dynamic :async_stack_trace;
     (dynamic) → dynamic :async_op_then;
     (core::Object, core::StackTrace) → dynamic :async_op_error;
@@ -479,20 +503,22 @@
       try {
         #L18:
         {}
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   }
   function returnAsync6() → asy::Future<core::int?> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int?> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int?>();
+    final asy::_Future<core::int?> :async_future = new asy::_Future::•<core::int?>();
+    core::bool* :is_sync = false;
     FutureOr<core::int?>? :return_value;
     dynamic :async_stack_trace;
     (dynamic) → dynamic :async_op_then;
@@ -506,20 +532,22 @@
           :return_value = null;
           break #L19;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   }
   function returnAsync7() → asy::Future<core::int?> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int?> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int?>();
+    final asy::_Future<core::int?> :async_future = new asy::_Future::•<core::int?>();
+    core::bool* :is_sync = false;
     FutureOr<core::int?>? :return_value;
     dynamic :async_stack_trace;
     (dynamic) → dynamic :async_op_then;
@@ -530,26 +558,28 @@
       try {
         #L20:
         {}
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
-        :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{asy::Completer::future};
+    :async_op.call();
+    :is_sync = true;
+    return :async_future;
   }
   function yieldSync() → core::Iterable<dynamic> /* originally sync* */ {
-    function :sync_op_gen() → (core::_SyncIterator<dynamic>?) → core::bool* {
+    function :sync_op_gen() → (core::_SyncIterator<dynamic>?, dynamic, dynamic) → core::bool* {
       core::int :await_jump_var = 0;
       dynamic :await_ctx_var;
-      return (core::_SyncIterator<dynamic>? :iterator) → core::bool* yielding {
+      function :sync_op(core::_SyncIterator<dynamic>? :iterator, dynamic :exception, dynamic :stack_trace) → core::bool* yielding {
         {}
         return false;
-      };
+      }
+      return :sync_op;
     }
     return new core::_SyncIterable::•<dynamic>(:sync_op_gen);
   }
diff --git a/pkg/front_end/testcases/nnbd/shorting_null_check.dart.strong.expect b/pkg/front_end/testcases/nnbd/shorting_null_check.dart.strong.expect
index 2897025..af891e2 100644
--- a/pkg/front_end/testcases/nnbd/shorting_null_check.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/shorting_null_check.dart.strong.expect
@@ -63,30 +63,30 @@
   self::expect(null, self::test1(null));
   self::expect(0, self::test2(new self::A::•(0, 0)));
   self::expect(null, self::test2(null));
-  self::throws(() → core::int? => self::test2(new self::A::•(0, null)));
+  self::throws(() → void => self::test2(new self::A::•(0, null)));
   self::expect(true, self::test3(new self::A::•(0)));
   self::expect(null, self::test3(null));
   self::expect(true, self::test4(new self::A::•(0, 0)));
   self::expect(null, self::test4(null));
-  self::throws(() → core::bool? => self::test4(new self::A::•(0, null)));
+  self::throws(() → void => self::test4(new self::A::•(0, null)));
   self::expect(new self::Bar::•(0), self::test5(new self::Foo::•(new self::Bar::•(0))));
   self::expect(null, self::test5(null));
-  self::throws(() → self::Bar? => self::test5(new self::Foo::•(null)));
+  self::throws(() → void => self::test5(new self::Foo::•(null)));
   self::expect(0, self::test6(new self::Foo::•(new self::Bar::•(0))));
   self::expect(null, self::test6(null));
-  self::throws(() → core::int? => self::test6(new self::Foo::•(null)));
+  self::throws(() → void => self::test6(new self::Foo::•(null)));
   self::expect(42, self::test7(new self::Foo::•(new self::Bar::•(0)), 42));
   self::expect(null, self::test7(null, 42));
-  self::throws(() → core::int? => self::test7(new self::Foo::•(null), 42));
+  self::throws(() → void => self::test7(new self::Foo::•(null), 42));
   self::expect(new self::Bar::•(42), self::test8(new self::Foo::•(new self::Bar::•(0)), 42));
   self::expect(null, self::test8(null, 42));
-  self::throws(() → self::Bar? => self::test8(new self::Foo::•(new self::Bar::•(0)), null));
+  self::throws(() → void => self::test8(new self::Foo::•(new self::Bar::•(0)), null));
   self::expect(42, self::test9(new self::Foo::•(new self::Bar::•(0)), 42));
   self::expect(null, self::test9(null, 42));
-  self::throws(() → core::int? => self::test9(new self::Foo::•(new self::Bar::•(0)), null));
+  self::throws(() → void => self::test9(new self::Foo::•(new self::Bar::•(0)), null));
   self::expect(87, self::test10(new self::Foo::•(new self::Bar::•(0)), 42, 87));
   self::expect(null, self::test10(null, 42, 87));
-  self::throws(() → dynamic => self::test10(new self::Foo::•(new self::Bar::•(0)), null, 87));
+  self::throws(() → void => self::test10(new self::Foo::•(new self::Bar::•(0)), null, 87));
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
   if(!expected.{core::Object::==}(actual))
diff --git a/pkg/front_end/testcases/nnbd/shorting_null_check.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/shorting_null_check.dart.strong.transformed.expect
index 2897025..af891e2 100644
--- a/pkg/front_end/testcases/nnbd/shorting_null_check.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/shorting_null_check.dart.strong.transformed.expect
@@ -63,30 +63,30 @@
   self::expect(null, self::test1(null));
   self::expect(0, self::test2(new self::A::•(0, 0)));
   self::expect(null, self::test2(null));
-  self::throws(() → core::int? => self::test2(new self::A::•(0, null)));
+  self::throws(() → void => self::test2(new self::A::•(0, null)));
   self::expect(true, self::test3(new self::A::•(0)));
   self::expect(null, self::test3(null));
   self::expect(true, self::test4(new self::A::•(0, 0)));
   self::expect(null, self::test4(null));
-  self::throws(() → core::bool? => self::test4(new self::A::•(0, null)));
+  self::throws(() → void => self::test4(new self::A::•(0, null)));
   self::expect(new self::Bar::•(0), self::test5(new self::Foo::•(new self::Bar::•(0))));
   self::expect(null, self::test5(null));
-  self::throws(() → self::Bar? => self::test5(new self::Foo::•(null)));
+  self::throws(() → void => self::test5(new self::Foo::•(null)));
   self::expect(0, self::test6(new self::Foo::•(new self::Bar::•(0))));
   self::expect(null, self::test6(null));
-  self::throws(() → core::int? => self::test6(new self::Foo::•(null)));
+  self::throws(() → void => self::test6(new self::Foo::•(null)));
   self::expect(42, self::test7(new self::Foo::•(new self::Bar::•(0)), 42));
   self::expect(null, self::test7(null, 42));
-  self::throws(() → core::int? => self::test7(new self::Foo::•(null), 42));
+  self::throws(() → void => self::test7(new self::Foo::•(null), 42));
   self::expect(new self::Bar::•(42), self::test8(new self::Foo::•(new self::Bar::•(0)), 42));
   self::expect(null, self::test8(null, 42));
-  self::throws(() → self::Bar? => self::test8(new self::Foo::•(new self::Bar::•(0)), null));
+  self::throws(() → void => self::test8(new self::Foo::•(new self::Bar::•(0)), null));
   self::expect(42, self::test9(new self::Foo::•(new self::Bar::•(0)), 42));
   self::expect(null, self::test9(null, 42));
-  self::throws(() → core::int? => self::test9(new self::Foo::•(new self::Bar::•(0)), null));
+  self::throws(() → void => self::test9(new self::Foo::•(new self::Bar::•(0)), null));
   self::expect(87, self::test10(new self::Foo::•(new self::Bar::•(0)), 42, 87));
   self::expect(null, self::test10(null, 42, 87));
-  self::throws(() → dynamic => self::test10(new self::Foo::•(new self::Bar::•(0)), null, 87));
+  self::throws(() → void => self::test10(new self::Foo::•(new self::Bar::•(0)), null, 87));
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
   if(!expected.{core::Object::==}(actual))
diff --git a/pkg/front_end/testcases/nnbd/shorting_null_check.dart.weak.expect b/pkg/front_end/testcases/nnbd/shorting_null_check.dart.weak.expect
index 2897025..af891e2 100644
--- a/pkg/front_end/testcases/nnbd/shorting_null_check.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/shorting_null_check.dart.weak.expect
@@ -63,30 +63,30 @@
   self::expect(null, self::test1(null));
   self::expect(0, self::test2(new self::A::•(0, 0)));
   self::expect(null, self::test2(null));
-  self::throws(() → core::int? => self::test2(new self::A::•(0, null)));
+  self::throws(() → void => self::test2(new self::A::•(0, null)));
   self::expect(true, self::test3(new self::A::•(0)));
   self::expect(null, self::test3(null));
   self::expect(true, self::test4(new self::A::•(0, 0)));
   self::expect(null, self::test4(null));
-  self::throws(() → core::bool? => self::test4(new self::A::•(0, null)));
+  self::throws(() → void => self::test4(new self::A::•(0, null)));
   self::expect(new self::Bar::•(0), self::test5(new self::Foo::•(new self::Bar::•(0))));
   self::expect(null, self::test5(null));
-  self::throws(() → self::Bar? => self::test5(new self::Foo::•(null)));
+  self::throws(() → void => self::test5(new self::Foo::•(null)));
   self::expect(0, self::test6(new self::Foo::•(new self::Bar::•(0))));
   self::expect(null, self::test6(null));
-  self::throws(() → core::int? => self::test6(new self::Foo::•(null)));
+  self::throws(() → void => self::test6(new self::Foo::•(null)));
   self::expect(42, self::test7(new self::Foo::•(new self::Bar::•(0)), 42));
   self::expect(null, self::test7(null, 42));
-  self::throws(() → core::int? => self::test7(new self::Foo::•(null), 42));
+  self::throws(() → void => self::test7(new self::Foo::•(null), 42));
   self::expect(new self::Bar::•(42), self::test8(new self::Foo::•(new self::Bar::•(0)), 42));
   self::expect(null, self::test8(null, 42));
-  self::throws(() → self::Bar? => self::test8(new self::Foo::•(new self::Bar::•(0)), null));
+  self::throws(() → void => self::test8(new self::Foo::•(new self::Bar::•(0)), null));
   self::expect(42, self::test9(new self::Foo::•(new self::Bar::•(0)), 42));
   self::expect(null, self::test9(null, 42));
-  self::throws(() → core::int? => self::test9(new self::Foo::•(new self::Bar::•(0)), null));
+  self::throws(() → void => self::test9(new self::Foo::•(new self::Bar::•(0)), null));
   self::expect(87, self::test10(new self::Foo::•(new self::Bar::•(0)), 42, 87));
   self::expect(null, self::test10(null, 42, 87));
-  self::throws(() → dynamic => self::test10(new self::Foo::•(new self::Bar::•(0)), null, 87));
+  self::throws(() → void => self::test10(new self::Foo::•(new self::Bar::•(0)), null, 87));
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
   if(!expected.{core::Object::==}(actual))
diff --git a/pkg/front_end/testcases/nnbd/shorting_null_check.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/shorting_null_check.dart.weak.transformed.expect
index 2897025..af891e2 100644
--- a/pkg/front_end/testcases/nnbd/shorting_null_check.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/shorting_null_check.dart.weak.transformed.expect
@@ -63,30 +63,30 @@
   self::expect(null, self::test1(null));
   self::expect(0, self::test2(new self::A::•(0, 0)));
   self::expect(null, self::test2(null));
-  self::throws(() → core::int? => self::test2(new self::A::•(0, null)));
+  self::throws(() → void => self::test2(new self::A::•(0, null)));
   self::expect(true, self::test3(new self::A::•(0)));
   self::expect(null, self::test3(null));
   self::expect(true, self::test4(new self::A::•(0, 0)));
   self::expect(null, self::test4(null));
-  self::throws(() → core::bool? => self::test4(new self::A::•(0, null)));
+  self::throws(() → void => self::test4(new self::A::•(0, null)));
   self::expect(new self::Bar::•(0), self::test5(new self::Foo::•(new self::Bar::•(0))));
   self::expect(null, self::test5(null));
-  self::throws(() → self::Bar? => self::test5(new self::Foo::•(null)));
+  self::throws(() → void => self::test5(new self::Foo::•(null)));
   self::expect(0, self::test6(new self::Foo::•(new self::Bar::•(0))));
   self::expect(null, self::test6(null));
-  self::throws(() → core::int? => self::test6(new self::Foo::•(null)));
+  self::throws(() → void => self::test6(new self::Foo::•(null)));
   self::expect(42, self::test7(new self::Foo::•(new self::Bar::•(0)), 42));
   self::expect(null, self::test7(null, 42));
-  self::throws(() → core::int? => self::test7(new self::Foo::•(null), 42));
+  self::throws(() → void => self::test7(new self::Foo::•(null), 42));
   self::expect(new self::Bar::•(42), self::test8(new self::Foo::•(new self::Bar::•(0)), 42));
   self::expect(null, self::test8(null, 42));
-  self::throws(() → self::Bar? => self::test8(new self::Foo::•(new self::Bar::•(0)), null));
+  self::throws(() → void => self::test8(new self::Foo::•(new self::Bar::•(0)), null));
   self::expect(42, self::test9(new self::Foo::•(new self::Bar::•(0)), 42));
   self::expect(null, self::test9(null, 42));
-  self::throws(() → core::int? => self::test9(new self::Foo::•(new self::Bar::•(0)), null));
+  self::throws(() → void => self::test9(new self::Foo::•(new self::Bar::•(0)), null));
   self::expect(87, self::test10(new self::Foo::•(new self::Bar::•(0)), 42, 87));
   self::expect(null, self::test10(null, 42, 87));
-  self::throws(() → dynamic => self::test10(new self::Foo::•(new self::Bar::•(0)), null, 87));
+  self::throws(() → void => self::test10(new self::Foo::•(new self::Bar::•(0)), null, 87));
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
   if(!expected.{core::Object::==}(actual))
diff --git a/pkg/front_end/testcases/nnbd/shorting_stop.dart.strong.expect b/pkg/front_end/testcases/nnbd/shorting_stop.dart.strong.expect
index 609cde0..2e91168 100644
--- a/pkg/front_end/testcases/nnbd/shorting_stop.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/shorting_stop.dart.strong.expect
@@ -54,35 +54,35 @@
 }
 static method test(self::Class? c) → dynamic {
   let final self::Class? #t1 = c in #t1.{core::Object::==}(null) ?{core::int?} null : #t1{self::Class}.{self::Class::next}.{self::Class::field};
-  self::throwsInStrong(() → core::num => let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:18:33: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+  self::throwsInStrong(() → void => let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:18:33: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
   throwsInStrong(() => c?.field + 2); // error
                                 ^" in (let final self::Class? #t3 = c in #t3.{core::Object::==}(null) ?{core::int?} null : #t3{self::Class}.{self::Class::field}).{core::num::+}(2));
   let final self::Class? #t4 = c in #t4.{core::Object::==}(null) ?{core::int?} null : let final core::int #t5 = #t4.{self::Class::field}.{core::num::+}(1) in let final void #t6 = #t4.{self::Class::field} = #t5 in #t5;
   let final self::Class? #t7 = c in #t7.{core::Object::==}(null) ?{core::int?} null : #t7.{self::Class::field} = #t7.{self::Class::field}.{core::num::+}(1);
-  self::throwsInStrong(() → core::int => let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:21:34: Error: Property 'field' cannot be accessed on 'Class?' because it is potentially null.
+  self::throwsInStrong(() → void => let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:21:34: Error: Property 'field' cannot be accessed on 'Class?' because it is potentially null.
  - 'Class' is from 'pkg/front_end/testcases/nnbd/shorting_stop.dart'.
 Try accessing using ?. instead.
   throwsInStrong(() => (c?.next).field); // error
                                  ^^^^^" in (let final self::Class? #t9 = c in #t9.{core::Object::==}(null) ?{self::Class?} null : #t9{self::Class}.{self::Class::next}).{self::Class::field});
-  self::throwsInStrong(() → core::int => let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:22:24: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
+  self::throwsInStrong(() → void => let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:22:24: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
   throwsInStrong(() => -c?.field); // error
                        ^" in (let final self::Class? #t11 = c in #t11.{core::Object::==}(null) ?{core::int?} null : #t11{self::Class}.{self::Class::field}).{core::int::unary-}());
   let final self::Class? #t12 = c in #t12.{core::Object::==}(null) ?{core::bool?} null : #t12{self::Class}.{self::Class::next}.{self::Class::[]}(0).{core::int::isEven};
-  self::throwsInStrong(() → core::num => let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:25:35: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+  self::throwsInStrong(() → void => let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:25:35: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
   throwsInStrong(() => c?.next[0] + 2); // error
                                   ^" in (let final self::Class? #t14 = c in #t14.{core::Object::==}(null) ?{core::int?} null : #t14{self::Class}.{self::Class::next}.{self::Class::[]}(0)).{core::num::+}(2));
   let final self::Class? #t15 = c in #t15.{core::Object::==}(null) ?{core::int?} null : let final self::Class #t16 = #t15{self::Class}.{self::Class::next} in let final core::int #t17 = 0 in let final core::int #t18 = #t16.{self::Class::[]}(#t17).{core::num::+}(1) in let final void #t19 = #t16.{self::Class::[]=}(#t17, #t18) in #t18;
   let final self::Class? #t20 = c in #t20.{core::Object::==}(null) ?{core::int?} null : let final self::Class #t21 = #t20{self::Class}.{self::Class::next} in let final core::int #t22 = 0 in #t21.{self::Class::[]=}(#t22, #t21.{self::Class::[]}(#t22).{core::num::+}(1));
-  self::throwsInStrong(() → core::bool => let final<BottomType> #t23 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:28:37: Error: Property 'isEven' cannot be accessed on 'int?' because it is potentially null.
+  self::throwsInStrong(() → void => let final<BottomType> #t23 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:28:37: Error: Property 'isEven' cannot be accessed on 'int?' because it is potentially null.
 Try accessing using ?. instead.
   throwsInStrong(() => (c?.next[0]).isEven); // error
                                     ^^^^^^" in (let final self::Class? #t24 = c in #t24.{core::Object::==}(null) ?{core::int?} null : #t24{self::Class}.{self::Class::next}.{self::Class::[]}(0)).{core::int::isEven});
-  self::throwsInStrong(() → core::int => let final<BottomType> #t25 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:29:24: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
+  self::throwsInStrong(() → void => let final<BottomType> #t25 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:29:24: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
   throwsInStrong(() => -c?.next[0]); // error
                        ^" in (let final self::Class? #t26 = c in #t26.{core::Object::==}(null) ?{core::int?} null : #t26{self::Class}.{self::Class::next}.{self::Class::[]}(0)).{core::int::unary-}());
 }
 static method _inStrongMode() → core::bool {
-  (core::String?) → core::Null? f = (core::String? s) → core::Null? {
+  (core::String?) → Null f = (core::String? s) → Null {
     let final<BottomType> #t27 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:36:7: Error: Property 'length' cannot be accessed on 'String?' because it is potentially null.
 Try accessing using ?. instead.
     s.length; // This will be an invalid expression in strong mode.
diff --git a/pkg/front_end/testcases/nnbd/shorting_stop.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/shorting_stop.dart.strong.transformed.expect
index 2c4e1da..6fba66e 100644
--- a/pkg/front_end/testcases/nnbd/shorting_stop.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/shorting_stop.dart.strong.transformed.expect
@@ -54,35 +54,35 @@
 }
 static method test(self::Class? c) → dynamic {
   let final self::Class? #t1 = c in #t1.{core::Object::==}(null) ?{core::int?} null : #t1{self::Class}.{self::Class::next}.{self::Class::field};
-  self::throwsInStrong(() → core::num => let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:18:33: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+  self::throwsInStrong(() → void => let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:18:33: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
   throwsInStrong(() => c?.field + 2); // error
                                 ^" in (let final self::Class? #t3 = c in #t3.{core::Object::==}(null) ?{core::int?} null : #t3{self::Class}.{self::Class::field}).{core::num::+}(2));
   let final self::Class? #t4 = c in #t4.{core::Object::==}(null) ?{core::int?} null : let final core::int #t5 = #t4.{self::Class::field}.{core::num::+}(1) in let final void #t6 = #t4.{self::Class::field} = #t5 in #t5;
   let final self::Class? #t7 = c in #t7.{core::Object::==}(null) ?{core::int?} null : #t7.{self::Class::field} = #t7.{self::Class::field}.{core::num::+}(1);
-  self::throwsInStrong(() → core::int => let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:21:34: Error: Property 'field' cannot be accessed on 'Class?' because it is potentially null.
+  self::throwsInStrong(() → void => let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:21:34: Error: Property 'field' cannot be accessed on 'Class?' because it is potentially null.
  - 'Class' is from 'pkg/front_end/testcases/nnbd/shorting_stop.dart'.
 Try accessing using ?. instead.
   throwsInStrong(() => (c?.next).field); // error
                                  ^^^^^" in (let final self::Class? #t9 = c in #t9.{core::Object::==}(null) ?{self::Class?} null : #t9{self::Class}.{self::Class::next}).{self::Class::field});
-  self::throwsInStrong(() → core::int => let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:22:24: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
+  self::throwsInStrong(() → void => let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:22:24: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
   throwsInStrong(() => -c?.field); // error
                        ^" in (let final self::Class? #t11 = c in #t11.{core::Object::==}(null) ?{core::int?} null : #t11{self::Class}.{self::Class::field}).{core::int::unary-}());
   let final self::Class? #t12 = c in #t12.{core::Object::==}(null) ?{core::bool?} null : #t12{self::Class}.{self::Class::next}.{self::Class::[]}(0).{core::int::isEven};
-  self::throwsInStrong(() → core::num => let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:25:35: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+  self::throwsInStrong(() → void => let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:25:35: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
   throwsInStrong(() => c?.next[0] + 2); // error
                                   ^" in (let final self::Class? #t14 = c in #t14.{core::Object::==}(null) ?{core::int?} null : #t14{self::Class}.{self::Class::next}.{self::Class::[]}(0)).{core::num::+}(2));
   let final self::Class? #t15 = c in #t15.{core::Object::==}(null) ?{core::int?} null : let final self::Class #t16 = #t15{self::Class}.{self::Class::next} in let final core::int #t17 = 0 in let final core::int #t18 = #t16.{self::Class::[]}(#t17).{core::num::+}(1) in let final void #t19 = #t16.{self::Class::[]=}(#t17, #t18) in #t18;
   let final self::Class? #t20 = c in #t20.{core::Object::==}(null) ?{core::int?} null : let final self::Class #t21 = #t20{self::Class}.{self::Class::next} in let final core::int #t22 = 0 in #t21.{self::Class::[]=}(#t22, #t21.{self::Class::[]}(#t22).{core::num::+}(1));
-  self::throwsInStrong(() → core::bool => let final<BottomType> #t23 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:28:37: Error: Property 'isEven' cannot be accessed on 'int?' because it is potentially null.
+  self::throwsInStrong(() → void => let final<BottomType> #t23 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:28:37: Error: Property 'isEven' cannot be accessed on 'int?' because it is potentially null.
 Try accessing using ?. instead.
   throwsInStrong(() => (c?.next[0]).isEven); // error
                                     ^^^^^^" in (let final self::Class? #t24 = c in #t24.{core::Object::==}(null) ?{core::int?} null : #t24{self::Class}.{self::Class::next}.{self::Class::[]}(0)).{core::int::isEven});
-  self::throwsInStrong(() → core::int => let final<BottomType> #t25 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:29:24: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
+  self::throwsInStrong(() → void => let final<BottomType> #t25 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:29:24: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
   throwsInStrong(() => -c?.next[0]); // error
                        ^" in (let final self::Class? #t26 = c in #t26.{core::Object::==}(null) ?{core::int?} null : #t26{self::Class}.{self::Class::next}.{self::Class::[]}(0)).{core::int::unary-}());
 }
 static method _inStrongMode() → core::bool {
-  (core::String?) → core::Null? f = (core::String? s) → core::Null? {
+  (core::String?) → Null f = (core::String? s) → Null {
     let final<BottomType> #t27 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:36:7: Error: Property 'length' cannot be accessed on 'String?' because it is potentially null.
 Try accessing using ?. instead.
     s.length; // This will be an invalid expression in strong mode.
diff --git a/pkg/front_end/testcases/nnbd/shorting_stop.dart.weak.expect b/pkg/front_end/testcases/nnbd/shorting_stop.dart.weak.expect
index 609cde0..2e91168 100644
--- a/pkg/front_end/testcases/nnbd/shorting_stop.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/shorting_stop.dart.weak.expect
@@ -54,35 +54,35 @@
 }
 static method test(self::Class? c) → dynamic {
   let final self::Class? #t1 = c in #t1.{core::Object::==}(null) ?{core::int?} null : #t1{self::Class}.{self::Class::next}.{self::Class::field};
-  self::throwsInStrong(() → core::num => let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:18:33: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+  self::throwsInStrong(() → void => let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:18:33: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
   throwsInStrong(() => c?.field + 2); // error
                                 ^" in (let final self::Class? #t3 = c in #t3.{core::Object::==}(null) ?{core::int?} null : #t3{self::Class}.{self::Class::field}).{core::num::+}(2));
   let final self::Class? #t4 = c in #t4.{core::Object::==}(null) ?{core::int?} null : let final core::int #t5 = #t4.{self::Class::field}.{core::num::+}(1) in let final void #t6 = #t4.{self::Class::field} = #t5 in #t5;
   let final self::Class? #t7 = c in #t7.{core::Object::==}(null) ?{core::int?} null : #t7.{self::Class::field} = #t7.{self::Class::field}.{core::num::+}(1);
-  self::throwsInStrong(() → core::int => let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:21:34: Error: Property 'field' cannot be accessed on 'Class?' because it is potentially null.
+  self::throwsInStrong(() → void => let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:21:34: Error: Property 'field' cannot be accessed on 'Class?' because it is potentially null.
  - 'Class' is from 'pkg/front_end/testcases/nnbd/shorting_stop.dart'.
 Try accessing using ?. instead.
   throwsInStrong(() => (c?.next).field); // error
                                  ^^^^^" in (let final self::Class? #t9 = c in #t9.{core::Object::==}(null) ?{self::Class?} null : #t9{self::Class}.{self::Class::next}).{self::Class::field});
-  self::throwsInStrong(() → core::int => let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:22:24: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
+  self::throwsInStrong(() → void => let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:22:24: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
   throwsInStrong(() => -c?.field); // error
                        ^" in (let final self::Class? #t11 = c in #t11.{core::Object::==}(null) ?{core::int?} null : #t11{self::Class}.{self::Class::field}).{core::int::unary-}());
   let final self::Class? #t12 = c in #t12.{core::Object::==}(null) ?{core::bool?} null : #t12{self::Class}.{self::Class::next}.{self::Class::[]}(0).{core::int::isEven};
-  self::throwsInStrong(() → core::num => let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:25:35: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+  self::throwsInStrong(() → void => let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:25:35: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
   throwsInStrong(() => c?.next[0] + 2); // error
                                   ^" in (let final self::Class? #t14 = c in #t14.{core::Object::==}(null) ?{core::int?} null : #t14{self::Class}.{self::Class::next}.{self::Class::[]}(0)).{core::num::+}(2));
   let final self::Class? #t15 = c in #t15.{core::Object::==}(null) ?{core::int?} null : let final self::Class #t16 = #t15{self::Class}.{self::Class::next} in let final core::int #t17 = 0 in let final core::int #t18 = #t16.{self::Class::[]}(#t17).{core::num::+}(1) in let final void #t19 = #t16.{self::Class::[]=}(#t17, #t18) in #t18;
   let final self::Class? #t20 = c in #t20.{core::Object::==}(null) ?{core::int?} null : let final self::Class #t21 = #t20{self::Class}.{self::Class::next} in let final core::int #t22 = 0 in #t21.{self::Class::[]=}(#t22, #t21.{self::Class::[]}(#t22).{core::num::+}(1));
-  self::throwsInStrong(() → core::bool => let final<BottomType> #t23 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:28:37: Error: Property 'isEven' cannot be accessed on 'int?' because it is potentially null.
+  self::throwsInStrong(() → void => let final<BottomType> #t23 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:28:37: Error: Property 'isEven' cannot be accessed on 'int?' because it is potentially null.
 Try accessing using ?. instead.
   throwsInStrong(() => (c?.next[0]).isEven); // error
                                     ^^^^^^" in (let final self::Class? #t24 = c in #t24.{core::Object::==}(null) ?{core::int?} null : #t24{self::Class}.{self::Class::next}.{self::Class::[]}(0)).{core::int::isEven});
-  self::throwsInStrong(() → core::int => let final<BottomType> #t25 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:29:24: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
+  self::throwsInStrong(() → void => let final<BottomType> #t25 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:29:24: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
   throwsInStrong(() => -c?.next[0]); // error
                        ^" in (let final self::Class? #t26 = c in #t26.{core::Object::==}(null) ?{core::int?} null : #t26{self::Class}.{self::Class::next}.{self::Class::[]}(0)).{core::int::unary-}());
 }
 static method _inStrongMode() → core::bool {
-  (core::String?) → core::Null? f = (core::String? s) → core::Null? {
+  (core::String?) → Null f = (core::String? s) → Null {
     let final<BottomType> #t27 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:36:7: Error: Property 'length' cannot be accessed on 'String?' because it is potentially null.
 Try accessing using ?. instead.
     s.length; // This will be an invalid expression in strong mode.
diff --git a/pkg/front_end/testcases/nnbd/shorting_stop.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/shorting_stop.dart.weak.transformed.expect
index 2c4e1da..6fba66e 100644
--- a/pkg/front_end/testcases/nnbd/shorting_stop.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/shorting_stop.dart.weak.transformed.expect
@@ -54,35 +54,35 @@
 }
 static method test(self::Class? c) → dynamic {
   let final self::Class? #t1 = c in #t1.{core::Object::==}(null) ?{core::int?} null : #t1{self::Class}.{self::Class::next}.{self::Class::field};
-  self::throwsInStrong(() → core::num => let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:18:33: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+  self::throwsInStrong(() → void => let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:18:33: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
   throwsInStrong(() => c?.field + 2); // error
                                 ^" in (let final self::Class? #t3 = c in #t3.{core::Object::==}(null) ?{core::int?} null : #t3{self::Class}.{self::Class::field}).{core::num::+}(2));
   let final self::Class? #t4 = c in #t4.{core::Object::==}(null) ?{core::int?} null : let final core::int #t5 = #t4.{self::Class::field}.{core::num::+}(1) in let final void #t6 = #t4.{self::Class::field} = #t5 in #t5;
   let final self::Class? #t7 = c in #t7.{core::Object::==}(null) ?{core::int?} null : #t7.{self::Class::field} = #t7.{self::Class::field}.{core::num::+}(1);
-  self::throwsInStrong(() → core::int => let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:21:34: Error: Property 'field' cannot be accessed on 'Class?' because it is potentially null.
+  self::throwsInStrong(() → void => let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:21:34: Error: Property 'field' cannot be accessed on 'Class?' because it is potentially null.
  - 'Class' is from 'pkg/front_end/testcases/nnbd/shorting_stop.dart'.
 Try accessing using ?. instead.
   throwsInStrong(() => (c?.next).field); // error
                                  ^^^^^" in (let final self::Class? #t9 = c in #t9.{core::Object::==}(null) ?{self::Class?} null : #t9{self::Class}.{self::Class::next}).{self::Class::field});
-  self::throwsInStrong(() → core::int => let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:22:24: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
+  self::throwsInStrong(() → void => let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:22:24: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
   throwsInStrong(() => -c?.field); // error
                        ^" in (let final self::Class? #t11 = c in #t11.{core::Object::==}(null) ?{core::int?} null : #t11{self::Class}.{self::Class::field}).{core::int::unary-}());
   let final self::Class? #t12 = c in #t12.{core::Object::==}(null) ?{core::bool?} null : #t12{self::Class}.{self::Class::next}.{self::Class::[]}(0).{core::int::isEven};
-  self::throwsInStrong(() → core::num => let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:25:35: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+  self::throwsInStrong(() → void => let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:25:35: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
   throwsInStrong(() => c?.next[0] + 2); // error
                                   ^" in (let final self::Class? #t14 = c in #t14.{core::Object::==}(null) ?{core::int?} null : #t14{self::Class}.{self::Class::next}.{self::Class::[]}(0)).{core::num::+}(2));
   let final self::Class? #t15 = c in #t15.{core::Object::==}(null) ?{core::int?} null : let final self::Class #t16 = #t15{self::Class}.{self::Class::next} in let final core::int #t17 = 0 in let final core::int #t18 = #t16.{self::Class::[]}(#t17).{core::num::+}(1) in let final void #t19 = #t16.{self::Class::[]=}(#t17, #t18) in #t18;
   let final self::Class? #t20 = c in #t20.{core::Object::==}(null) ?{core::int?} null : let final self::Class #t21 = #t20{self::Class}.{self::Class::next} in let final core::int #t22 = 0 in #t21.{self::Class::[]=}(#t22, #t21.{self::Class::[]}(#t22).{core::num::+}(1));
-  self::throwsInStrong(() → core::bool => let final<BottomType> #t23 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:28:37: Error: Property 'isEven' cannot be accessed on 'int?' because it is potentially null.
+  self::throwsInStrong(() → void => let final<BottomType> #t23 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:28:37: Error: Property 'isEven' cannot be accessed on 'int?' because it is potentially null.
 Try accessing using ?. instead.
   throwsInStrong(() => (c?.next[0]).isEven); // error
                                     ^^^^^^" in (let final self::Class? #t24 = c in #t24.{core::Object::==}(null) ?{core::int?} null : #t24{self::Class}.{self::Class::next}.{self::Class::[]}(0)).{core::int::isEven});
-  self::throwsInStrong(() → core::int => let final<BottomType> #t25 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:29:24: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
+  self::throwsInStrong(() → void => let final<BottomType> #t25 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:29:24: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
   throwsInStrong(() => -c?.next[0]); // error
                        ^" in (let final self::Class? #t26 = c in #t26.{core::Object::==}(null) ?{core::int?} null : #t26{self::Class}.{self::Class::next}.{self::Class::[]}(0)).{core::int::unary-}());
 }
 static method _inStrongMode() → core::bool {
-  (core::String?) → core::Null? f = (core::String? s) → core::Null? {
+  (core::String?) → Null f = (core::String? s) → Null {
     let final<BottomType> #t27 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:36:7: Error: Property 'length' cannot be accessed on 'String?' because it is potentially null.
 Try accessing using ?. instead.
     s.length; // This will be an invalid expression in strong mode.
diff --git a/pkg/front_end/testcases/nnbd/spread_if_null.dart.strong.expect b/pkg/front_end/testcases/nnbd/spread_if_null.dart.strong.expect
index 04612a2..ffceca9 100644
--- a/pkg/front_end/testcases/nnbd/spread_if_null.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/spread_if_null.dart.strong.expect
@@ -7,78 +7,78 @@
   core::List<core::int>? list = null;
   core::print( block {
     final core::List<core::int> #t1 = <core::int>[];
-    #t1.{core::List::add}(1);
-    #t1.{core::List::add}(2);
+    #t1.{core::List::add}{Invariant}(1);
+    #t1.{core::List::add}{Invariant}(2);
     final core::Iterable<core::int>? #t2 = list;
     if(!#t2.{core::Object::==}(null))
       for (final core::int #t3 in #t2{core::Iterable<core::int>})
-        #t1.{core::List::add}(#t3);
-    #t1.{core::List::add}(3);
+        #t1.{core::List::add}{Invariant}(#t3);
+    #t1.{core::List::add}{Invariant}(3);
   } =>#t1);
   core::print( block {
     final core::List<core::int> #t4 = <core::int>[];
-    #t4.{core::List::add}(1);
-    #t4.{core::List::add}(2);
+    #t4.{core::List::add}{Invariant}(1);
+    #t4.{core::List::add}{Invariant}(2);
     final core::Iterable<core::int>? #t5 = null;
     if(!#t5.{core::Object::==}(null))
       for (final core::int #t6 in #t5{core::Iterable<core::int>})
-        #t4.{core::List::add}(#t6);
-    #t4.{core::List::add}(3);
+        #t4.{core::List::add}{Invariant}(#t6);
+    #t4.{core::List::add}{Invariant}(3);
   } =>#t4);
   core::List<core::int> list1 = block {
     final core::List<core::int> #t7 = <core::int>[];
     final core::Iterable<core::int>? #t8 = list;
     if(!#t8.{core::Object::==}(null))
       for (final core::int #t9 in #t8{core::Iterable<core::int>})
-        #t7.{core::List::add}(#t9);
+        #t7.{core::List::add}{Invariant}(#t9);
   } =>#t7;
   core::List<Never> list2 = block {
     final core::List<Never> #t10 = <Never>[];
     final core::Iterable<Never>? #t11 = null;
     if(!#t11.{core::Object::==}(null))
       for (final Never #t12 in #t11{core::Iterable<Never>})
-        #t10.{core::List::add}(#t12);
+        #t10.{core::List::add}{Invariant}(#t12);
   } =>#t10;
   core::List<core::int> list3 = block {
     final core::List<core::int> #t13 = <core::int>[];
-    #t13.{core::List::add}(1);
-    #t13.{core::List::add}(2);
+    #t13.{core::List::add}{Invariant}(1);
+    #t13.{core::List::add}{Invariant}(2);
     final core::Iterable<core::int>? #t14 = list;
     if(!#t14.{core::Object::==}(null))
       for (final core::int #t15 in #t14{core::Iterable<core::int>})
-        #t13.{core::List::add}(#t15);
-    #t13.{core::List::add}(3);
+        #t13.{core::List::add}{Invariant}(#t15);
+    #t13.{core::List::add}{Invariant}(3);
   } =>#t13;
   core::List<core::int> list4 = block {
     final core::List<core::int> #t16 = <core::int>[];
-    #t16.{core::List::add}(1);
-    #t16.{core::List::add}(2);
+    #t16.{core::List::add}{Invariant}(1);
+    #t16.{core::List::add}{Invariant}(2);
     final core::Iterable<core::int>? #t17 = null;
     if(!#t17.{core::Object::==}(null))
       for (final core::int #t18 in #t17{core::Iterable<core::int>})
-        #t16.{core::List::add}(#t18);
-    #t16.{core::List::add}(3);
+        #t16.{core::List::add}{Invariant}(#t18);
+    #t16.{core::List::add}{Invariant}(3);
   } =>#t16;
   core::Set<core::int>? set = null;
   core::print( block {
     final core::Set<core::int> #t19 = col::LinkedHashSet::•<core::int>();
-    #t19.{core::Set::add}(1);
-    #t19.{core::Set::add}(2);
+    #t19.{core::Set::add}{Invariant}(1);
+    #t19.{core::Set::add}{Invariant}(2);
     final core::Iterable<core::int>? #t20 = set;
     if(!#t20.{core::Object::==}(null))
       for (final core::int #t21 in #t20{core::Iterable<core::int>})
-        #t19.{core::Set::add}(#t21);
-    #t19.{core::Set::add}(3);
+        #t19.{core::Set::add}{Invariant}(#t21);
+    #t19.{core::Set::add}{Invariant}(3);
   } =>#t19);
   core::print( block {
     final core::Set<core::int> #t22 = col::LinkedHashSet::•<core::int>();
-    #t22.{core::Set::add}(1);
-    #t22.{core::Set::add}(2);
+    #t22.{core::Set::add}{Invariant}(1);
+    #t22.{core::Set::add}{Invariant}(2);
     final core::Iterable<core::int>? #t23 = null;
     if(!#t23.{core::Object::==}(null))
       for (final core::int #t24 in #t23{core::Iterable<core::int>})
-        #t22.{core::Set::add}(#t24);
-    #t22.{core::Set::add}(3);
+        #t22.{core::Set::add}{Invariant}(#t24);
+    #t22.{core::Set::add}{Invariant}(3);
   } =>#t22);
   core::Set<core::int> set1 = block {
     final core::Set<core::int> #t25 = col::LinkedHashSet::•<core::int>();
@@ -86,75 +86,75 @@
     if(!#t26.{core::Object::==}(null))
       for (final dynamic #t27 in #t26{core::Iterable<dynamic>}) {
         final core::int #t28 = #t27 as{TypeError,ForNonNullableByDefault} core::int;
-        #t25.{core::Set::add}(#t28);
+        #t25.{core::Set::add}{Invariant}(#t28);
       }
   } =>#t25;
   core::Set<core::int> set3 = block {
     final core::Set<core::int> #t29 = col::LinkedHashSet::•<core::int>();
-    #t29.{core::Set::add}(1);
-    #t29.{core::Set::add}(2);
+    #t29.{core::Set::add}{Invariant}(1);
+    #t29.{core::Set::add}{Invariant}(2);
     final core::Iterable<core::int>? #t30 = set;
     if(!#t30.{core::Object::==}(null))
       for (final core::int #t31 in #t30{core::Iterable<core::int>})
-        #t29.{core::Set::add}(#t31);
-    #t29.{core::Set::add}(3);
+        #t29.{core::Set::add}{Invariant}(#t31);
+    #t29.{core::Set::add}{Invariant}(3);
   } =>#t29;
   core::Set<core::int> set4 = block {
     final core::Set<core::int> #t32 = col::LinkedHashSet::•<core::int>();
-    #t32.{core::Set::add}(1);
-    #t32.{core::Set::add}(2);
+    #t32.{core::Set::add}{Invariant}(1);
+    #t32.{core::Set::add}{Invariant}(2);
     final core::Iterable<core::int>? #t33 = null;
     if(!#t33.{core::Object::==}(null))
       for (final core::int #t34 in #t33{core::Iterable<core::int>})
-        #t32.{core::Set::add}(#t34);
-    #t32.{core::Set::add}(3);
+        #t32.{core::Set::add}{Invariant}(#t34);
+    #t32.{core::Set::add}{Invariant}(3);
   } =>#t32;
   core::Map<core::int, core::int>? map = null;
   core::print( block {
     final core::Map<core::int, core::int> #t35 = <core::int, core::int>{};
-    #t35.{core::Map::[]=}(1, 1);
-    #t35.{core::Map::[]=}(2, 2);
+    #t35.{core::Map::[]=}{Invariant}(1, 1);
+    #t35.{core::Map::[]=}{Invariant}(2, 2);
     final core::Map<core::int, core::int>? #t36 = map;
     if(!#t36.{core::Object::==}(null))
       for (final core::MapEntry<core::int, core::int> #t37 in #t36{core::Map<core::int, core::int>}.{core::Map::entries})
-        #t35.{core::Map::[]=}(#t37.{core::MapEntry::key}, #t37.{core::MapEntry::value});
-    #t35.{core::Map::[]=}(3, 3);
+        #t35.{core::Map::[]=}{Invariant}(#t37.{core::MapEntry::key}, #t37.{core::MapEntry::value});
+    #t35.{core::Map::[]=}{Invariant}(3, 3);
   } =>#t35);
   core::print( block {
     final core::Map<core::int, core::int> #t38 = <core::int, core::int>{};
-    #t38.{core::Map::[]=}(1, 1);
-    #t38.{core::Map::[]=}(2, 2);
+    #t38.{core::Map::[]=}{Invariant}(1, 1);
+    #t38.{core::Map::[]=}{Invariant}(2, 2);
     final core::Map<core::int, core::int>? #t39 = null;
     if(!#t39.{core::Object::==}(null))
       for (final core::MapEntry<core::int, core::int> #t40 in #t39{core::Map<core::int, core::int>}.{core::Map::entries})
-        #t38.{core::Map::[]=}(#t40.{core::MapEntry::key}, #t40.{core::MapEntry::value});
-    #t38.{core::Map::[]=}(3, 3);
+        #t38.{core::Map::[]=}{Invariant}(#t40.{core::MapEntry::key}, #t40.{core::MapEntry::value});
+    #t38.{core::Map::[]=}{Invariant}(3, 3);
   } =>#t38);
   core::Map<core::int, core::int> map1 = block {
     final core::Map<core::int, core::int> #t41 = <core::int, core::int>{};
     final core::Map<core::int, core::int>? #t42 = map;
     if(!#t42.{core::Object::==}(null))
       for (final core::MapEntry<core::int, core::int> #t43 in #t42{core::Map<core::int, core::int>}.{core::Map::entries})
-        #t41.{core::Map::[]=}(#t43.{core::MapEntry::key}, #t43.{core::MapEntry::value});
+        #t41.{core::Map::[]=}{Invariant}(#t43.{core::MapEntry::key}, #t43.{core::MapEntry::value});
   } =>#t41;
   core::Map<core::int, core::int> map3 = block {
     final core::Map<core::int, core::int> #t44 = <core::int, core::int>{};
-    #t44.{core::Map::[]=}(1, 1);
-    #t44.{core::Map::[]=}(2, 2);
+    #t44.{core::Map::[]=}{Invariant}(1, 1);
+    #t44.{core::Map::[]=}{Invariant}(2, 2);
     final core::Map<core::int, core::int>? #t45 = map;
     if(!#t45.{core::Object::==}(null))
       for (final core::MapEntry<core::int, core::int> #t46 in #t45{core::Map<core::int, core::int>}.{core::Map::entries})
-        #t44.{core::Map::[]=}(#t46.{core::MapEntry::key}, #t46.{core::MapEntry::value});
-    #t44.{core::Map::[]=}(3, 3);
+        #t44.{core::Map::[]=}{Invariant}(#t46.{core::MapEntry::key}, #t46.{core::MapEntry::value});
+    #t44.{core::Map::[]=}{Invariant}(3, 3);
   } =>#t44;
   core::Map<core::int, core::int> map4 = block {
     final core::Map<core::int, core::int> #t47 = <core::int, core::int>{};
-    #t47.{core::Map::[]=}(1, 1);
-    #t47.{core::Map::[]=}(2, 2);
+    #t47.{core::Map::[]=}{Invariant}(1, 1);
+    #t47.{core::Map::[]=}{Invariant}(2, 2);
     final core::Map<core::int, core::int>? #t48 = null;
     if(!#t48.{core::Object::==}(null))
       for (final core::MapEntry<core::int, core::int> #t49 in #t48{core::Map<core::int, core::int>}.{core::Map::entries})
-        #t47.{core::Map::[]=}(#t49.{core::MapEntry::key}, #t49.{core::MapEntry::value});
-    #t47.{core::Map::[]=}(3, 3);
+        #t47.{core::Map::[]=}{Invariant}(#t49.{core::MapEntry::key}, #t49.{core::MapEntry::value});
+    #t47.{core::Map::[]=}{Invariant}(3, 3);
   } =>#t47;
 }
diff --git a/pkg/front_end/testcases/nnbd/spread_if_null.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/spread_if_null.dart.strong.transformed.expect
index 80f3187..ba1a66c 100644
--- a/pkg/front_end/testcases/nnbd/spread_if_null.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/spread_if_null.dart.strong.transformed.expect
@@ -7,31 +7,31 @@
   core::List<core::int>? list = null;
   core::print( block {
     final core::List<core::int> #t1 = <core::int>[];
-    #t1.{core::List::add}(1);
-    #t1.{core::List::add}(2);
+    #t1.{core::List::add}{Invariant}(1);
+    #t1.{core::List::add}{Invariant}(2);
     final core::Iterable<core::int>? #t2 = list;
     if(!#t2.{core::Object::==}(null)) {
       core::Iterator<core::int> :sync-for-iterator = #t2{core::Iterable<core::int>}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::int #t3 = :sync-for-iterator.{core::Iterator::current};
-        #t1.{core::List::add}(#t3);
+        #t1.{core::List::add}{Invariant}(#t3);
       }
     }
-    #t1.{core::List::add}(3);
+    #t1.{core::List::add}{Invariant}(3);
   } =>#t1);
   core::print( block {
     final core::List<core::int> #t4 = <core::int>[];
-    #t4.{core::List::add}(1);
-    #t4.{core::List::add}(2);
+    #t4.{core::List::add}{Invariant}(1);
+    #t4.{core::List::add}{Invariant}(2);
     final core::Iterable<core::int>? #t5 = null;
     if(!#t5.{core::Object::==}(null)) {
       core::Iterator<core::int> :sync-for-iterator = #t5{core::Iterable<core::int>}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::int #t6 = :sync-for-iterator.{core::Iterator::current};
-        #t4.{core::List::add}(#t6);
+        #t4.{core::List::add}{Invariant}(#t6);
       }
     }
-    #t4.{core::List::add}(3);
+    #t4.{core::List::add}{Invariant}(3);
   } =>#t4);
   core::List<core::int> list1 = block {
     final core::List<core::int> #t7 = <core::int>[];
@@ -40,7 +40,7 @@
       core::Iterator<core::int> :sync-for-iterator = #t8{core::Iterable<core::int>}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::int #t9 = :sync-for-iterator.{core::Iterator::current};
-        #t7.{core::List::add}(#t9);
+        #t7.{core::List::add}{Invariant}(#t9);
       }
     }
   } =>#t7;
@@ -51,66 +51,66 @@
       core::Iterator<Never> :sync-for-iterator = #t11{core::Iterable<Never>}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final Never #t12 = :sync-for-iterator.{core::Iterator::current};
-        #t10.{core::List::add}(#t12);
+        #t10.{core::List::add}{Invariant}(#t12);
       }
     }
   } =>#t10;
   core::List<core::int> list3 = block {
     final core::List<core::int> #t13 = <core::int>[];
-    #t13.{core::List::add}(1);
-    #t13.{core::List::add}(2);
+    #t13.{core::List::add}{Invariant}(1);
+    #t13.{core::List::add}{Invariant}(2);
     final core::Iterable<core::int>? #t14 = list;
     if(!#t14.{core::Object::==}(null)) {
       core::Iterator<core::int> :sync-for-iterator = #t14{core::Iterable<core::int>}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::int #t15 = :sync-for-iterator.{core::Iterator::current};
-        #t13.{core::List::add}(#t15);
+        #t13.{core::List::add}{Invariant}(#t15);
       }
     }
-    #t13.{core::List::add}(3);
+    #t13.{core::List::add}{Invariant}(3);
   } =>#t13;
   core::List<core::int> list4 = block {
     final core::List<core::int> #t16 = <core::int>[];
-    #t16.{core::List::add}(1);
-    #t16.{core::List::add}(2);
+    #t16.{core::List::add}{Invariant}(1);
+    #t16.{core::List::add}{Invariant}(2);
     final core::Iterable<core::int>? #t17 = null;
     if(!#t17.{core::Object::==}(null)) {
       core::Iterator<core::int> :sync-for-iterator = #t17{core::Iterable<core::int>}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::int #t18 = :sync-for-iterator.{core::Iterator::current};
-        #t16.{core::List::add}(#t18);
+        #t16.{core::List::add}{Invariant}(#t18);
       }
     }
-    #t16.{core::List::add}(3);
+    #t16.{core::List::add}{Invariant}(3);
   } =>#t16;
   core::Set<core::int>? set = null;
   core::print( block {
     final core::Set<core::int> #t19 = new col::_CompactLinkedHashSet::•<core::int>();
-    #t19.{core::Set::add}(1);
-    #t19.{core::Set::add}(2);
+    #t19.{core::Set::add}{Invariant}(1);
+    #t19.{core::Set::add}{Invariant}(2);
     final core::Iterable<core::int>? #t20 = set;
     if(!#t20.{core::Object::==}(null)) {
       core::Iterator<core::int> :sync-for-iterator = #t20{core::Iterable<core::int>}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::int #t21 = :sync-for-iterator.{core::Iterator::current};
-        #t19.{core::Set::add}(#t21);
+        #t19.{core::Set::add}{Invariant}(#t21);
       }
     }
-    #t19.{core::Set::add}(3);
+    #t19.{core::Set::add}{Invariant}(3);
   } =>#t19);
   core::print( block {
     final core::Set<core::int> #t22 = new col::_CompactLinkedHashSet::•<core::int>();
-    #t22.{core::Set::add}(1);
-    #t22.{core::Set::add}(2);
+    #t22.{core::Set::add}{Invariant}(1);
+    #t22.{core::Set::add}{Invariant}(2);
     final core::Iterable<core::int>? #t23 = null;
     if(!#t23.{core::Object::==}(null)) {
       core::Iterator<core::int> :sync-for-iterator = #t23{core::Iterable<core::int>}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::int #t24 = :sync-for-iterator.{core::Iterator::current};
-        #t22.{core::Set::add}(#t24);
+        #t22.{core::Set::add}{Invariant}(#t24);
       }
     }
-    #t22.{core::Set::add}(3);
+    #t22.{core::Set::add}{Invariant}(3);
   } =>#t22);
   core::Set<core::int> set1 = block {
     final core::Set<core::int> #t25 = new col::_CompactLinkedHashSet::•<core::int>();
@@ -121,67 +121,67 @@
         final dynamic #t27 = :sync-for-iterator.{core::Iterator::current};
         {
           final core::int #t28 = #t27 as{TypeError,ForNonNullableByDefault} core::int;
-          #t25.{core::Set::add}(#t28);
+          #t25.{core::Set::add}{Invariant}(#t28);
         }
       }
     }
   } =>#t25;
   core::Set<core::int> set3 = block {
     final core::Set<core::int> #t29 = new col::_CompactLinkedHashSet::•<core::int>();
-    #t29.{core::Set::add}(1);
-    #t29.{core::Set::add}(2);
+    #t29.{core::Set::add}{Invariant}(1);
+    #t29.{core::Set::add}{Invariant}(2);
     final core::Iterable<core::int>? #t30 = set;
     if(!#t30.{core::Object::==}(null)) {
       core::Iterator<core::int> :sync-for-iterator = #t30{core::Iterable<core::int>}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::int #t31 = :sync-for-iterator.{core::Iterator::current};
-        #t29.{core::Set::add}(#t31);
+        #t29.{core::Set::add}{Invariant}(#t31);
       }
     }
-    #t29.{core::Set::add}(3);
+    #t29.{core::Set::add}{Invariant}(3);
   } =>#t29;
   core::Set<core::int> set4 = block {
     final core::Set<core::int> #t32 = new col::_CompactLinkedHashSet::•<core::int>();
-    #t32.{core::Set::add}(1);
-    #t32.{core::Set::add}(2);
+    #t32.{core::Set::add}{Invariant}(1);
+    #t32.{core::Set::add}{Invariant}(2);
     final core::Iterable<core::int>? #t33 = null;
     if(!#t33.{core::Object::==}(null)) {
       core::Iterator<core::int> :sync-for-iterator = #t33{core::Iterable<core::int>}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::int #t34 = :sync-for-iterator.{core::Iterator::current};
-        #t32.{core::Set::add}(#t34);
+        #t32.{core::Set::add}{Invariant}(#t34);
       }
     }
-    #t32.{core::Set::add}(3);
+    #t32.{core::Set::add}{Invariant}(3);
   } =>#t32;
   core::Map<core::int, core::int>? map = null;
   core::print( block {
     final core::Map<core::int, core::int> #t35 = <core::int, core::int>{};
-    #t35.{core::Map::[]=}(1, 1);
-    #t35.{core::Map::[]=}(2, 2);
+    #t35.{core::Map::[]=}{Invariant}(1, 1);
+    #t35.{core::Map::[]=}{Invariant}(2, 2);
     final core::Map<core::int, core::int>? #t36 = map;
     if(!#t36.{core::Object::==}(null)) {
       core::Iterator<core::MapEntry<core::int, core::int>> :sync-for-iterator = #t36{core::Map<core::int, core::int>}.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::MapEntry<core::int, core::int> #t37 = :sync-for-iterator.{core::Iterator::current};
-        #t35.{core::Map::[]=}(#t37.{core::MapEntry::key}, #t37.{core::MapEntry::value});
+        #t35.{core::Map::[]=}{Invariant}(#t37.{core::MapEntry::key}, #t37.{core::MapEntry::value});
       }
     }
-    #t35.{core::Map::[]=}(3, 3);
+    #t35.{core::Map::[]=}{Invariant}(3, 3);
   } =>#t35);
   core::print( block {
     final core::Map<core::int, core::int> #t38 = <core::int, core::int>{};
-    #t38.{core::Map::[]=}(1, 1);
-    #t38.{core::Map::[]=}(2, 2);
+    #t38.{core::Map::[]=}{Invariant}(1, 1);
+    #t38.{core::Map::[]=}{Invariant}(2, 2);
     final core::Map<core::int, core::int>? #t39 = null;
     if(!#t39.{core::Object::==}(null)) {
       core::Iterator<core::MapEntry<core::int, core::int>> :sync-for-iterator = #t39{core::Map<core::int, core::int>}.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::MapEntry<core::int, core::int> #t40 = :sync-for-iterator.{core::Iterator::current};
-        #t38.{core::Map::[]=}(#t40.{core::MapEntry::key}, #t40.{core::MapEntry::value});
+        #t38.{core::Map::[]=}{Invariant}(#t40.{core::MapEntry::key}, #t40.{core::MapEntry::value});
       }
     }
-    #t38.{core::Map::[]=}(3, 3);
+    #t38.{core::Map::[]=}{Invariant}(3, 3);
   } =>#t38);
   core::Map<core::int, core::int> map1 = block {
     final core::Map<core::int, core::int> #t41 = <core::int, core::int>{};
@@ -190,36 +190,36 @@
       core::Iterator<core::MapEntry<core::int, core::int>> :sync-for-iterator = #t42{core::Map<core::int, core::int>}.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::MapEntry<core::int, core::int> #t43 = :sync-for-iterator.{core::Iterator::current};
-        #t41.{core::Map::[]=}(#t43.{core::MapEntry::key}, #t43.{core::MapEntry::value});
+        #t41.{core::Map::[]=}{Invariant}(#t43.{core::MapEntry::key}, #t43.{core::MapEntry::value});
       }
     }
   } =>#t41;
   core::Map<core::int, core::int> map3 = block {
     final core::Map<core::int, core::int> #t44 = <core::int, core::int>{};
-    #t44.{core::Map::[]=}(1, 1);
-    #t44.{core::Map::[]=}(2, 2);
+    #t44.{core::Map::[]=}{Invariant}(1, 1);
+    #t44.{core::Map::[]=}{Invariant}(2, 2);
     final core::Map<core::int, core::int>? #t45 = map;
     if(!#t45.{core::Object::==}(null)) {
       core::Iterator<core::MapEntry<core::int, core::int>> :sync-for-iterator = #t45{core::Map<core::int, core::int>}.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::MapEntry<core::int, core::int> #t46 = :sync-for-iterator.{core::Iterator::current};
-        #t44.{core::Map::[]=}(#t46.{core::MapEntry::key}, #t46.{core::MapEntry::value});
+        #t44.{core::Map::[]=}{Invariant}(#t46.{core::MapEntry::key}, #t46.{core::MapEntry::value});
       }
     }
-    #t44.{core::Map::[]=}(3, 3);
+    #t44.{core::Map::[]=}{Invariant}(3, 3);
   } =>#t44;
   core::Map<core::int, core::int> map4 = block {
     final core::Map<core::int, core::int> #t47 = <core::int, core::int>{};
-    #t47.{core::Map::[]=}(1, 1);
-    #t47.{core::Map::[]=}(2, 2);
+    #t47.{core::Map::[]=}{Invariant}(1, 1);
+    #t47.{core::Map::[]=}{Invariant}(2, 2);
     final core::Map<core::int, core::int>? #t48 = null;
     if(!#t48.{core::Object::==}(null)) {
       core::Iterator<core::MapEntry<core::int, core::int>> :sync-for-iterator = #t48{core::Map<core::int, core::int>}.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::MapEntry<core::int, core::int> #t49 = :sync-for-iterator.{core::Iterator::current};
-        #t47.{core::Map::[]=}(#t49.{core::MapEntry::key}, #t49.{core::MapEntry::value});
+        #t47.{core::Map::[]=}{Invariant}(#t49.{core::MapEntry::key}, #t49.{core::MapEntry::value});
       }
     }
-    #t47.{core::Map::[]=}(3, 3);
+    #t47.{core::Map::[]=}{Invariant}(3, 3);
   } =>#t47;
 }
diff --git a/pkg/front_end/testcases/nnbd/spread_if_null.dart.weak.expect b/pkg/front_end/testcases/nnbd/spread_if_null.dart.weak.expect
index 04612a2..ffceca9 100644
--- a/pkg/front_end/testcases/nnbd/spread_if_null.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/spread_if_null.dart.weak.expect
@@ -7,78 +7,78 @@
   core::List<core::int>? list = null;
   core::print( block {
     final core::List<core::int> #t1 = <core::int>[];
-    #t1.{core::List::add}(1);
-    #t1.{core::List::add}(2);
+    #t1.{core::List::add}{Invariant}(1);
+    #t1.{core::List::add}{Invariant}(2);
     final core::Iterable<core::int>? #t2 = list;
     if(!#t2.{core::Object::==}(null))
       for (final core::int #t3 in #t2{core::Iterable<core::int>})
-        #t1.{core::List::add}(#t3);
-    #t1.{core::List::add}(3);
+        #t1.{core::List::add}{Invariant}(#t3);
+    #t1.{core::List::add}{Invariant}(3);
   } =>#t1);
   core::print( block {
     final core::List<core::int> #t4 = <core::int>[];
-    #t4.{core::List::add}(1);
-    #t4.{core::List::add}(2);
+    #t4.{core::List::add}{Invariant}(1);
+    #t4.{core::List::add}{Invariant}(2);
     final core::Iterable<core::int>? #t5 = null;
     if(!#t5.{core::Object::==}(null))
       for (final core::int #t6 in #t5{core::Iterable<core::int>})
-        #t4.{core::List::add}(#t6);
-    #t4.{core::List::add}(3);
+        #t4.{core::List::add}{Invariant}(#t6);
+    #t4.{core::List::add}{Invariant}(3);
   } =>#t4);
   core::List<core::int> list1 = block {
     final core::List<core::int> #t7 = <core::int>[];
     final core::Iterable<core::int>? #t8 = list;
     if(!#t8.{core::Object::==}(null))
       for (final core::int #t9 in #t8{core::Iterable<core::int>})
-        #t7.{core::List::add}(#t9);
+        #t7.{core::List::add}{Invariant}(#t9);
   } =>#t7;
   core::List<Never> list2 = block {
     final core::List<Never> #t10 = <Never>[];
     final core::Iterable<Never>? #t11 = null;
     if(!#t11.{core::Object::==}(null))
       for (final Never #t12 in #t11{core::Iterable<Never>})
-        #t10.{core::List::add}(#t12);
+        #t10.{core::List::add}{Invariant}(#t12);
   } =>#t10;
   core::List<core::int> list3 = block {
     final core::List<core::int> #t13 = <core::int>[];
-    #t13.{core::List::add}(1);
-    #t13.{core::List::add}(2);
+    #t13.{core::List::add}{Invariant}(1);
+    #t13.{core::List::add}{Invariant}(2);
     final core::Iterable<core::int>? #t14 = list;
     if(!#t14.{core::Object::==}(null))
       for (final core::int #t15 in #t14{core::Iterable<core::int>})
-        #t13.{core::List::add}(#t15);
-    #t13.{core::List::add}(3);
+        #t13.{core::List::add}{Invariant}(#t15);
+    #t13.{core::List::add}{Invariant}(3);
   } =>#t13;
   core::List<core::int> list4 = block {
     final core::List<core::int> #t16 = <core::int>[];
-    #t16.{core::List::add}(1);
-    #t16.{core::List::add}(2);
+    #t16.{core::List::add}{Invariant}(1);
+    #t16.{core::List::add}{Invariant}(2);
     final core::Iterable<core::int>? #t17 = null;
     if(!#t17.{core::Object::==}(null))
       for (final core::int #t18 in #t17{core::Iterable<core::int>})
-        #t16.{core::List::add}(#t18);
-    #t16.{core::List::add}(3);
+        #t16.{core::List::add}{Invariant}(#t18);
+    #t16.{core::List::add}{Invariant}(3);
   } =>#t16;
   core::Set<core::int>? set = null;
   core::print( block {
     final core::Set<core::int> #t19 = col::LinkedHashSet::•<core::int>();
-    #t19.{core::Set::add}(1);
-    #t19.{core::Set::add}(2);
+    #t19.{core::Set::add}{Invariant}(1);
+    #t19.{core::Set::add}{Invariant}(2);
     final core::Iterable<core::int>? #t20 = set;
     if(!#t20.{core::Object::==}(null))
       for (final core::int #t21 in #t20{core::Iterable<core::int>})
-        #t19.{core::Set::add}(#t21);
-    #t19.{core::Set::add}(3);
+        #t19.{core::Set::add}{Invariant}(#t21);
+    #t19.{core::Set::add}{Invariant}(3);
   } =>#t19);
   core::print( block {
     final core::Set<core::int> #t22 = col::LinkedHashSet::•<core::int>();
-    #t22.{core::Set::add}(1);
-    #t22.{core::Set::add}(2);
+    #t22.{core::Set::add}{Invariant}(1);
+    #t22.{core::Set::add}{Invariant}(2);
     final core::Iterable<core::int>? #t23 = null;
     if(!#t23.{core::Object::==}(null))
       for (final core::int #t24 in #t23{core::Iterable<core::int>})
-        #t22.{core::Set::add}(#t24);
-    #t22.{core::Set::add}(3);
+        #t22.{core::Set::add}{Invariant}(#t24);
+    #t22.{core::Set::add}{Invariant}(3);
   } =>#t22);
   core::Set<core::int> set1 = block {
     final core::Set<core::int> #t25 = col::LinkedHashSet::•<core::int>();
@@ -86,75 +86,75 @@
     if(!#t26.{core::Object::==}(null))
       for (final dynamic #t27 in #t26{core::Iterable<dynamic>}) {
         final core::int #t28 = #t27 as{TypeError,ForNonNullableByDefault} core::int;
-        #t25.{core::Set::add}(#t28);
+        #t25.{core::Set::add}{Invariant}(#t28);
       }
   } =>#t25;
   core::Set<core::int> set3 = block {
     final core::Set<core::int> #t29 = col::LinkedHashSet::•<core::int>();
-    #t29.{core::Set::add}(1);
-    #t29.{core::Set::add}(2);
+    #t29.{core::Set::add}{Invariant}(1);
+    #t29.{core::Set::add}{Invariant}(2);
     final core::Iterable<core::int>? #t30 = set;
     if(!#t30.{core::Object::==}(null))
       for (final core::int #t31 in #t30{core::Iterable<core::int>})
-        #t29.{core::Set::add}(#t31);
-    #t29.{core::Set::add}(3);
+        #t29.{core::Set::add}{Invariant}(#t31);
+    #t29.{core::Set::add}{Invariant}(3);
   } =>#t29;
   core::Set<core::int> set4 = block {
     final core::Set<core::int> #t32 = col::LinkedHashSet::•<core::int>();
-    #t32.{core::Set::add}(1);
-    #t32.{core::Set::add}(2);
+    #t32.{core::Set::add}{Invariant}(1);
+    #t32.{core::Set::add}{Invariant}(2);
     final core::Iterable<core::int>? #t33 = null;
     if(!#t33.{core::Object::==}(null))
       for (final core::int #t34 in #t33{core::Iterable<core::int>})
-        #t32.{core::Set::add}(#t34);
-    #t32.{core::Set::add}(3);
+        #t32.{core::Set::add}{Invariant}(#t34);
+    #t32.{core::Set::add}{Invariant}(3);
   } =>#t32;
   core::Map<core::int, core::int>? map = null;
   core::print( block {
     final core::Map<core::int, core::int> #t35 = <core::int, core::int>{};
-    #t35.{core::Map::[]=}(1, 1);
-    #t35.{core::Map::[]=}(2, 2);
+    #t35.{core::Map::[]=}{Invariant}(1, 1);
+    #t35.{core::Map::[]=}{Invariant}(2, 2);
     final core::Map<core::int, core::int>? #t36 = map;
     if(!#t36.{core::Object::==}(null))
       for (final core::MapEntry<core::int, core::int> #t37 in #t36{core::Map<core::int, core::int>}.{core::Map::entries})
-        #t35.{core::Map::[]=}(#t37.{core::MapEntry::key}, #t37.{core::MapEntry::value});
-    #t35.{core::Map::[]=}(3, 3);
+        #t35.{core::Map::[]=}{Invariant}(#t37.{core::MapEntry::key}, #t37.{core::MapEntry::value});
+    #t35.{core::Map::[]=}{Invariant}(3, 3);
   } =>#t35);
   core::print( block {
     final core::Map<core::int, core::int> #t38 = <core::int, core::int>{};
-    #t38.{core::Map::[]=}(1, 1);
-    #t38.{core::Map::[]=}(2, 2);
+    #t38.{core::Map::[]=}{Invariant}(1, 1);
+    #t38.{core::Map::[]=}{Invariant}(2, 2);
     final core::Map<core::int, core::int>? #t39 = null;
     if(!#t39.{core::Object::==}(null))
       for (final core::MapEntry<core::int, core::int> #t40 in #t39{core::Map<core::int, core::int>}.{core::Map::entries})
-        #t38.{core::Map::[]=}(#t40.{core::MapEntry::key}, #t40.{core::MapEntry::value});
-    #t38.{core::Map::[]=}(3, 3);
+        #t38.{core::Map::[]=}{Invariant}(#t40.{core::MapEntry::key}, #t40.{core::MapEntry::value});
+    #t38.{core::Map::[]=}{Invariant}(3, 3);
   } =>#t38);
   core::Map<core::int, core::int> map1 = block {
     final core::Map<core::int, core::int> #t41 = <core::int, core::int>{};
     final core::Map<core::int, core::int>? #t42 = map;
     if(!#t42.{core::Object::==}(null))
       for (final core::MapEntry<core::int, core::int> #t43 in #t42{core::Map<core::int, core::int>}.{core::Map::entries})
-        #t41.{core::Map::[]=}(#t43.{core::MapEntry::key}, #t43.{core::MapEntry::value});
+        #t41.{core::Map::[]=}{Invariant}(#t43.{core::MapEntry::key}, #t43.{core::MapEntry::value});
   } =>#t41;
   core::Map<core::int, core::int> map3 = block {
     final core::Map<core::int, core::int> #t44 = <core::int, core::int>{};
-    #t44.{core::Map::[]=}(1, 1);
-    #t44.{core::Map::[]=}(2, 2);
+    #t44.{core::Map::[]=}{Invariant}(1, 1);
+    #t44.{core::Map::[]=}{Invariant}(2, 2);
     final core::Map<core::int, core::int>? #t45 = map;
     if(!#t45.{core::Object::==}(null))
       for (final core::MapEntry<core::int, core::int> #t46 in #t45{core::Map<core::int, core::int>}.{core::Map::entries})
-        #t44.{core::Map::[]=}(#t46.{core::MapEntry::key}, #t46.{core::MapEntry::value});
-    #t44.{core::Map::[]=}(3, 3);
+        #t44.{core::Map::[]=}{Invariant}(#t46.{core::MapEntry::key}, #t46.{core::MapEntry::value});
+    #t44.{core::Map::[]=}{Invariant}(3, 3);
   } =>#t44;
   core::Map<core::int, core::int> map4 = block {
     final core::Map<core::int, core::int> #t47 = <core::int, core::int>{};
-    #t47.{core::Map::[]=}(1, 1);
-    #t47.{core::Map::[]=}(2, 2);
+    #t47.{core::Map::[]=}{Invariant}(1, 1);
+    #t47.{core::Map::[]=}{Invariant}(2, 2);
     final core::Map<core::int, core::int>? #t48 = null;
     if(!#t48.{core::Object::==}(null))
       for (final core::MapEntry<core::int, core::int> #t49 in #t48{core::Map<core::int, core::int>}.{core::Map::entries})
-        #t47.{core::Map::[]=}(#t49.{core::MapEntry::key}, #t49.{core::MapEntry::value});
-    #t47.{core::Map::[]=}(3, 3);
+        #t47.{core::Map::[]=}{Invariant}(#t49.{core::MapEntry::key}, #t49.{core::MapEntry::value});
+    #t47.{core::Map::[]=}{Invariant}(3, 3);
   } =>#t47;
 }
diff --git a/pkg/front_end/testcases/nnbd/spread_if_null.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/spread_if_null.dart.weak.transformed.expect
index 80f3187..ba1a66c 100644
--- a/pkg/front_end/testcases/nnbd/spread_if_null.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/spread_if_null.dart.weak.transformed.expect
@@ -7,31 +7,31 @@
   core::List<core::int>? list = null;
   core::print( block {
     final core::List<core::int> #t1 = <core::int>[];
-    #t1.{core::List::add}(1);
-    #t1.{core::List::add}(2);
+    #t1.{core::List::add}{Invariant}(1);
+    #t1.{core::List::add}{Invariant}(2);
     final core::Iterable<core::int>? #t2 = list;
     if(!#t2.{core::Object::==}(null)) {
       core::Iterator<core::int> :sync-for-iterator = #t2{core::Iterable<core::int>}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::int #t3 = :sync-for-iterator.{core::Iterator::current};
-        #t1.{core::List::add}(#t3);
+        #t1.{core::List::add}{Invariant}(#t3);
       }
     }
-    #t1.{core::List::add}(3);
+    #t1.{core::List::add}{Invariant}(3);
   } =>#t1);
   core::print( block {
     final core::List<core::int> #t4 = <core::int>[];
-    #t4.{core::List::add}(1);
-    #t4.{core::List::add}(2);
+    #t4.{core::List::add}{Invariant}(1);
+    #t4.{core::List::add}{Invariant}(2);
     final core::Iterable<core::int>? #t5 = null;
     if(!#t5.{core::Object::==}(null)) {
       core::Iterator<core::int> :sync-for-iterator = #t5{core::Iterable<core::int>}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::int #t6 = :sync-for-iterator.{core::Iterator::current};
-        #t4.{core::List::add}(#t6);
+        #t4.{core::List::add}{Invariant}(#t6);
       }
     }
-    #t4.{core::List::add}(3);
+    #t4.{core::List::add}{Invariant}(3);
   } =>#t4);
   core::List<core::int> list1 = block {
     final core::List<core::int> #t7 = <core::int>[];
@@ -40,7 +40,7 @@
       core::Iterator<core::int> :sync-for-iterator = #t8{core::Iterable<core::int>}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::int #t9 = :sync-for-iterator.{core::Iterator::current};
-        #t7.{core::List::add}(#t9);
+        #t7.{core::List::add}{Invariant}(#t9);
       }
     }
   } =>#t7;
@@ -51,66 +51,66 @@
       core::Iterator<Never> :sync-for-iterator = #t11{core::Iterable<Never>}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final Never #t12 = :sync-for-iterator.{core::Iterator::current};
-        #t10.{core::List::add}(#t12);
+        #t10.{core::List::add}{Invariant}(#t12);
       }
     }
   } =>#t10;
   core::List<core::int> list3 = block {
     final core::List<core::int> #t13 = <core::int>[];
-    #t13.{core::List::add}(1);
-    #t13.{core::List::add}(2);
+    #t13.{core::List::add}{Invariant}(1);
+    #t13.{core::List::add}{Invariant}(2);
     final core::Iterable<core::int>? #t14 = list;
     if(!#t14.{core::Object::==}(null)) {
       core::Iterator<core::int> :sync-for-iterator = #t14{core::Iterable<core::int>}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::int #t15 = :sync-for-iterator.{core::Iterator::current};
-        #t13.{core::List::add}(#t15);
+        #t13.{core::List::add}{Invariant}(#t15);
       }
     }
-    #t13.{core::List::add}(3);
+    #t13.{core::List::add}{Invariant}(3);
   } =>#t13;
   core::List<core::int> list4 = block {
     final core::List<core::int> #t16 = <core::int>[];
-    #t16.{core::List::add}(1);
-    #t16.{core::List::add}(2);
+    #t16.{core::List::add}{Invariant}(1);
+    #t16.{core::List::add}{Invariant}(2);
     final core::Iterable<core::int>? #t17 = null;
     if(!#t17.{core::Object::==}(null)) {
       core::Iterator<core::int> :sync-for-iterator = #t17{core::Iterable<core::int>}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::int #t18 = :sync-for-iterator.{core::Iterator::current};
-        #t16.{core::List::add}(#t18);
+        #t16.{core::List::add}{Invariant}(#t18);
       }
     }
-    #t16.{core::List::add}(3);
+    #t16.{core::List::add}{Invariant}(3);
   } =>#t16;
   core::Set<core::int>? set = null;
   core::print( block {
     final core::Set<core::int> #t19 = new col::_CompactLinkedHashSet::•<core::int>();
-    #t19.{core::Set::add}(1);
-    #t19.{core::Set::add}(2);
+    #t19.{core::Set::add}{Invariant}(1);
+    #t19.{core::Set::add}{Invariant}(2);
     final core::Iterable<core::int>? #t20 = set;
     if(!#t20.{core::Object::==}(null)) {
       core::Iterator<core::int> :sync-for-iterator = #t20{core::Iterable<core::int>}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::int #t21 = :sync-for-iterator.{core::Iterator::current};
-        #t19.{core::Set::add}(#t21);
+        #t19.{core::Set::add}{Invariant}(#t21);
       }
     }
-    #t19.{core::Set::add}(3);
+    #t19.{core::Set::add}{Invariant}(3);
   } =>#t19);
   core::print( block {
     final core::Set<core::int> #t22 = new col::_CompactLinkedHashSet::•<core::int>();
-    #t22.{core::Set::add}(1);
-    #t22.{core::Set::add}(2);
+    #t22.{core::Set::add}{Invariant}(1);
+    #t22.{core::Set::add}{Invariant}(2);
     final core::Iterable<core::int>? #t23 = null;
     if(!#t23.{core::Object::==}(null)) {
       core::Iterator<core::int> :sync-for-iterator = #t23{core::Iterable<core::int>}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::int #t24 = :sync-for-iterator.{core::Iterator::current};
-        #t22.{core::Set::add}(#t24);
+        #t22.{core::Set::add}{Invariant}(#t24);
       }
     }
-    #t22.{core::Set::add}(3);
+    #t22.{core::Set::add}{Invariant}(3);
   } =>#t22);
   core::Set<core::int> set1 = block {
     final core::Set<core::int> #t25 = new col::_CompactLinkedHashSet::•<core::int>();
@@ -121,67 +121,67 @@
         final dynamic #t27 = :sync-for-iterator.{core::Iterator::current};
         {
           final core::int #t28 = #t27 as{TypeError,ForNonNullableByDefault} core::int;
-          #t25.{core::Set::add}(#t28);
+          #t25.{core::Set::add}{Invariant}(#t28);
         }
       }
     }
   } =>#t25;
   core::Set<core::int> set3 = block {
     final core::Set<core::int> #t29 = new col::_CompactLinkedHashSet::•<core::int>();
-    #t29.{core::Set::add}(1);
-    #t29.{core::Set::add}(2);
+    #t29.{core::Set::add}{Invariant}(1);
+    #t29.{core::Set::add}{Invariant}(2);
     final core::Iterable<core::int>? #t30 = set;
     if(!#t30.{core::Object::==}(null)) {
       core::Iterator<core::int> :sync-for-iterator = #t30{core::Iterable<core::int>}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::int #t31 = :sync-for-iterator.{core::Iterator::current};
-        #t29.{core::Set::add}(#t31);
+        #t29.{core::Set::add}{Invariant}(#t31);
       }
     }
-    #t29.{core::Set::add}(3);
+    #t29.{core::Set::add}{Invariant}(3);
   } =>#t29;
   core::Set<core::int> set4 = block {
     final core::Set<core::int> #t32 = new col::_CompactLinkedHashSet::•<core::int>();
-    #t32.{core::Set::add}(1);
-    #t32.{core::Set::add}(2);
+    #t32.{core::Set::add}{Invariant}(1);
+    #t32.{core::Set::add}{Invariant}(2);
     final core::Iterable<core::int>? #t33 = null;
     if(!#t33.{core::Object::==}(null)) {
       core::Iterator<core::int> :sync-for-iterator = #t33{core::Iterable<core::int>}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::int #t34 = :sync-for-iterator.{core::Iterator::current};
-        #t32.{core::Set::add}(#t34);
+        #t32.{core::Set::add}{Invariant}(#t34);
       }
     }
-    #t32.{core::Set::add}(3);
+    #t32.{core::Set::add}{Invariant}(3);
   } =>#t32;
   core::Map<core::int, core::int>? map = null;
   core::print( block {
     final core::Map<core::int, core::int> #t35 = <core::int, core::int>{};
-    #t35.{core::Map::[]=}(1, 1);
-    #t35.{core::Map::[]=}(2, 2);
+    #t35.{core::Map::[]=}{Invariant}(1, 1);
+    #t35.{core::Map::[]=}{Invariant}(2, 2);
     final core::Map<core::int, core::int>? #t36 = map;
     if(!#t36.{core::Object::==}(null)) {
       core::Iterator<core::MapEntry<core::int, core::int>> :sync-for-iterator = #t36{core::Map<core::int, core::int>}.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::MapEntry<core::int, core::int> #t37 = :sync-for-iterator.{core::Iterator::current};
-        #t35.{core::Map::[]=}(#t37.{core::MapEntry::key}, #t37.{core::MapEntry::value});
+        #t35.{core::Map::[]=}{Invariant}(#t37.{core::MapEntry::key}, #t37.{core::MapEntry::value});
       }
     }
-    #t35.{core::Map::[]=}(3, 3);
+    #t35.{core::Map::[]=}{Invariant}(3, 3);
   } =>#t35);
   core::print( block {
     final core::Map<core::int, core::int> #t38 = <core::int, core::int>{};
-    #t38.{core::Map::[]=}(1, 1);
-    #t38.{core::Map::[]=}(2, 2);
+    #t38.{core::Map::[]=}{Invariant}(1, 1);
+    #t38.{core::Map::[]=}{Invariant}(2, 2);
     final core::Map<core::int, core::int>? #t39 = null;
     if(!#t39.{core::Object::==}(null)) {
       core::Iterator<core::MapEntry<core::int, core::int>> :sync-for-iterator = #t39{core::Map<core::int, core::int>}.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::MapEntry<core::int, core::int> #t40 = :sync-for-iterator.{core::Iterator::current};
-        #t38.{core::Map::[]=}(#t40.{core::MapEntry::key}, #t40.{core::MapEntry::value});
+        #t38.{core::Map::[]=}{Invariant}(#t40.{core::MapEntry::key}, #t40.{core::MapEntry::value});
       }
     }
-    #t38.{core::Map::[]=}(3, 3);
+    #t38.{core::Map::[]=}{Invariant}(3, 3);
   } =>#t38);
   core::Map<core::int, core::int> map1 = block {
     final core::Map<core::int, core::int> #t41 = <core::int, core::int>{};
@@ -190,36 +190,36 @@
       core::Iterator<core::MapEntry<core::int, core::int>> :sync-for-iterator = #t42{core::Map<core::int, core::int>}.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::MapEntry<core::int, core::int> #t43 = :sync-for-iterator.{core::Iterator::current};
-        #t41.{core::Map::[]=}(#t43.{core::MapEntry::key}, #t43.{core::MapEntry::value});
+        #t41.{core::Map::[]=}{Invariant}(#t43.{core::MapEntry::key}, #t43.{core::MapEntry::value});
       }
     }
   } =>#t41;
   core::Map<core::int, core::int> map3 = block {
     final core::Map<core::int, core::int> #t44 = <core::int, core::int>{};
-    #t44.{core::Map::[]=}(1, 1);
-    #t44.{core::Map::[]=}(2, 2);
+    #t44.{core::Map::[]=}{Invariant}(1, 1);
+    #t44.{core::Map::[]=}{Invariant}(2, 2);
     final core::Map<core::int, core::int>? #t45 = map;
     if(!#t45.{core::Object::==}(null)) {
       core::Iterator<core::MapEntry<core::int, core::int>> :sync-for-iterator = #t45{core::Map<core::int, core::int>}.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::MapEntry<core::int, core::int> #t46 = :sync-for-iterator.{core::Iterator::current};
-        #t44.{core::Map::[]=}(#t46.{core::MapEntry::key}, #t46.{core::MapEntry::value});
+        #t44.{core::Map::[]=}{Invariant}(#t46.{core::MapEntry::key}, #t46.{core::MapEntry::value});
       }
     }
-    #t44.{core::Map::[]=}(3, 3);
+    #t44.{core::Map::[]=}{Invariant}(3, 3);
   } =>#t44;
   core::Map<core::int, core::int> map4 = block {
     final core::Map<core::int, core::int> #t47 = <core::int, core::int>{};
-    #t47.{core::Map::[]=}(1, 1);
-    #t47.{core::Map::[]=}(2, 2);
+    #t47.{core::Map::[]=}{Invariant}(1, 1);
+    #t47.{core::Map::[]=}{Invariant}(2, 2);
     final core::Map<core::int, core::int>? #t48 = null;
     if(!#t48.{core::Object::==}(null)) {
       core::Iterator<core::MapEntry<core::int, core::int>> :sync-for-iterator = #t48{core::Map<core::int, core::int>}.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::MapEntry<core::int, core::int> #t49 = :sync-for-iterator.{core::Iterator::current};
-        #t47.{core::Map::[]=}(#t49.{core::MapEntry::key}, #t49.{core::MapEntry::value});
+        #t47.{core::Map::[]=}{Invariant}(#t49.{core::MapEntry::key}, #t49.{core::MapEntry::value});
       }
     }
-    #t47.{core::Map::[]=}(3, 3);
+    #t47.{core::Map::[]=}{Invariant}(3, 3);
   } =>#t47;
 }
diff --git a/pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart.strong.expect b/pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart.strong.expect
index dc3e70c..a97650d 100644
--- a/pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart.strong.expect
@@ -142,7 +142,7 @@
     final core::Iterable<core::String>? #t6 = l;
     if(!#t6.{core::Object::==}(null))
       for (final core::String #t7 in #t6{core::Iterable<core::String>})
-        #t5.{core::List::add}(#t7);
+        #t5.{core::List::add}{Invariant}(#t7);
   } =>#t5;
   core::Set<core::String> a = block {
     final core::Set<core::String> #t8 = col::LinkedHashSet::•<core::String>();
@@ -150,7 +150,7 @@
     if(!#t9.{core::Object::==}(null))
       for (final dynamic #t10 in #t9{core::Iterable<dynamic>}) {
         final core::String #t11 = #t10 as{TypeError,ForNonNullableByDefault} core::String;
-        #t8.{core::Set::add}(#t11);
+        #t8.{core::Set::add}{Invariant}(#t11);
       }
   } =>#t8;
   block {
@@ -158,21 +158,21 @@
     final core::Iterable<core::String>? #t13 = l;
     if(!#t13.{core::Object::==}(null))
       for (final core::String #t14 in #t13{core::Iterable<core::String>})
-        #t12.{core::Set::add}(#t14);
+        #t12.{core::Set::add}{Invariant}(#t14);
   } =>#t12;
   core::Map<core::String, core::int> b = block {
     final core::Map<core::String, core::int> #t15 = <core::String, core::int>{};
     final core::Map<core::String, core::int>? #t16 = m;
     if(!#t16.{core::Object::==}(null))
       for (final core::MapEntry<core::String, core::int> #t17 in #t16{core::Map<core::String, core::int>}.{core::Map::entries})
-        #t15.{core::Map::[]=}(#t17.{core::MapEntry::key}, #t17.{core::MapEntry::value});
+        #t15.{core::Map::[]=}{Invariant}(#t17.{core::MapEntry::key}, #t17.{core::MapEntry::value});
   } =>#t15;
   block {
     final core::Map<core::String, core::int> #t18 = <core::String, core::int>{};
     final core::Map<core::String, core::int>? #t19 = m;
     if(!#t19.{core::Object::==}(null))
       for (final core::MapEntry<core::String, core::int> #t20 in #t19{core::Map<core::String, core::int>}.{core::Map::entries})
-        #t18.{core::Map::[]=}(#t20.{core::MapEntry::key}, #t20.{core::MapEntry::value});
+        #t18.{core::Map::[]=}{Invariant}(#t20.{core::MapEntry::key}, #t20.{core::MapEntry::value});
   } =>#t18;
   s!;
   let final core::String #t21 = s in #t21.{core::String::==}(null) ?{core::String?} null : #t21.{core::String::substring}(0, 0);
diff --git a/pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart.strong.transformed.expect
index 87930a9..df0ca83 100644
--- a/pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart.strong.transformed.expect
@@ -144,7 +144,7 @@
       core::Iterator<core::String> :sync-for-iterator = #t6{core::Iterable<core::String>}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::String #t7 = :sync-for-iterator.{core::Iterator::current};
-        #t5.{core::List::add}(#t7);
+        #t5.{core::List::add}{Invariant}(#t7);
       }
     }
   } =>#t5;
@@ -157,7 +157,7 @@
         final dynamic #t10 = :sync-for-iterator.{core::Iterator::current};
         {
           final core::String #t11 = #t10 as{TypeError,ForNonNullableByDefault} core::String;
-          #t8.{core::Set::add}(#t11);
+          #t8.{core::Set::add}{Invariant}(#t11);
         }
       }
     }
@@ -169,7 +169,7 @@
       core::Iterator<core::String> :sync-for-iterator = #t13{core::Iterable<core::String>}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::String #t14 = :sync-for-iterator.{core::Iterator::current};
-        #t12.{core::Set::add}(#t14);
+        #t12.{core::Set::add}{Invariant}(#t14);
       }
     }
   } =>#t12;
@@ -180,7 +180,7 @@
       core::Iterator<core::MapEntry<core::String, core::int>> :sync-for-iterator = #t16{core::Map<core::String, core::int>}.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::MapEntry<core::String, core::int> #t17 = :sync-for-iterator.{core::Iterator::current};
-        #t15.{core::Map::[]=}(#t17.{core::MapEntry::key}, #t17.{core::MapEntry::value});
+        #t15.{core::Map::[]=}{Invariant}(#t17.{core::MapEntry::key}, #t17.{core::MapEntry::value});
       }
     }
   } =>#t15;
@@ -191,7 +191,7 @@
       core::Iterator<core::MapEntry<core::String, core::int>> :sync-for-iterator = #t19{core::Map<core::String, core::int>}.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::MapEntry<core::String, core::int> #t20 = :sync-for-iterator.{core::Iterator::current};
-        #t18.{core::Map::[]=}(#t20.{core::MapEntry::key}, #t20.{core::MapEntry::value});
+        #t18.{core::Map::[]=}{Invariant}(#t20.{core::MapEntry::key}, #t20.{core::MapEntry::value});
       }
     }
   } =>#t18;
diff --git a/pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart.weak.expect b/pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart.weak.expect
index dc3e70c..a97650d 100644
--- a/pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart.weak.expect
@@ -142,7 +142,7 @@
     final core::Iterable<core::String>? #t6 = l;
     if(!#t6.{core::Object::==}(null))
       for (final core::String #t7 in #t6{core::Iterable<core::String>})
-        #t5.{core::List::add}(#t7);
+        #t5.{core::List::add}{Invariant}(#t7);
   } =>#t5;
   core::Set<core::String> a = block {
     final core::Set<core::String> #t8 = col::LinkedHashSet::•<core::String>();
@@ -150,7 +150,7 @@
     if(!#t9.{core::Object::==}(null))
       for (final dynamic #t10 in #t9{core::Iterable<dynamic>}) {
         final core::String #t11 = #t10 as{TypeError,ForNonNullableByDefault} core::String;
-        #t8.{core::Set::add}(#t11);
+        #t8.{core::Set::add}{Invariant}(#t11);
       }
   } =>#t8;
   block {
@@ -158,21 +158,21 @@
     final core::Iterable<core::String>? #t13 = l;
     if(!#t13.{core::Object::==}(null))
       for (final core::String #t14 in #t13{core::Iterable<core::String>})
-        #t12.{core::Set::add}(#t14);
+        #t12.{core::Set::add}{Invariant}(#t14);
   } =>#t12;
   core::Map<core::String, core::int> b = block {
     final core::Map<core::String, core::int> #t15 = <core::String, core::int>{};
     final core::Map<core::String, core::int>? #t16 = m;
     if(!#t16.{core::Object::==}(null))
       for (final core::MapEntry<core::String, core::int> #t17 in #t16{core::Map<core::String, core::int>}.{core::Map::entries})
-        #t15.{core::Map::[]=}(#t17.{core::MapEntry::key}, #t17.{core::MapEntry::value});
+        #t15.{core::Map::[]=}{Invariant}(#t17.{core::MapEntry::key}, #t17.{core::MapEntry::value});
   } =>#t15;
   block {
     final core::Map<core::String, core::int> #t18 = <core::String, core::int>{};
     final core::Map<core::String, core::int>? #t19 = m;
     if(!#t19.{core::Object::==}(null))
       for (final core::MapEntry<core::String, core::int> #t20 in #t19{core::Map<core::String, core::int>}.{core::Map::entries})
-        #t18.{core::Map::[]=}(#t20.{core::MapEntry::key}, #t20.{core::MapEntry::value});
+        #t18.{core::Map::[]=}{Invariant}(#t20.{core::MapEntry::key}, #t20.{core::MapEntry::value});
   } =>#t18;
   s!;
   let final core::String #t21 = s in #t21.{core::String::==}(null) ?{core::String?} null : #t21.{core::String::substring}(0, 0);
diff --git a/pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart.weak.transformed.expect
index 87930a9..df0ca83 100644
--- a/pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart.weak.transformed.expect
@@ -144,7 +144,7 @@
       core::Iterator<core::String> :sync-for-iterator = #t6{core::Iterable<core::String>}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::String #t7 = :sync-for-iterator.{core::Iterator::current};
-        #t5.{core::List::add}(#t7);
+        #t5.{core::List::add}{Invariant}(#t7);
       }
     }
   } =>#t5;
@@ -157,7 +157,7 @@
         final dynamic #t10 = :sync-for-iterator.{core::Iterator::current};
         {
           final core::String #t11 = #t10 as{TypeError,ForNonNullableByDefault} core::String;
-          #t8.{core::Set::add}(#t11);
+          #t8.{core::Set::add}{Invariant}(#t11);
         }
       }
     }
@@ -169,7 +169,7 @@
       core::Iterator<core::String> :sync-for-iterator = #t13{core::Iterable<core::String>}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::String #t14 = :sync-for-iterator.{core::Iterator::current};
-        #t12.{core::Set::add}(#t14);
+        #t12.{core::Set::add}{Invariant}(#t14);
       }
     }
   } =>#t12;
@@ -180,7 +180,7 @@
       core::Iterator<core::MapEntry<core::String, core::int>> :sync-for-iterator = #t16{core::Map<core::String, core::int>}.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::MapEntry<core::String, core::int> #t17 = :sync-for-iterator.{core::Iterator::current};
-        #t15.{core::Map::[]=}(#t17.{core::MapEntry::key}, #t17.{core::MapEntry::value});
+        #t15.{core::Map::[]=}{Invariant}(#t17.{core::MapEntry::key}, #t17.{core::MapEntry::value});
       }
     }
   } =>#t15;
@@ -191,7 +191,7 @@
       core::Iterator<core::MapEntry<core::String, core::int>> :sync-for-iterator = #t19{core::Map<core::String, core::int>}.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::MapEntry<core::String, core::int> #t20 = :sync-for-iterator.{core::Iterator::current};
-        #t18.{core::Map::[]=}(#t20.{core::MapEntry::key}, #t20.{core::MapEntry::value});
+        #t18.{core::Map::[]=}{Invariant}(#t20.{core::MapEntry::key}, #t20.{core::MapEntry::value});
       }
     }
   } =>#t18;
diff --git a/pkg/front_end/testcases/nnbd/strong_package_not_ok_from_dill/strong.dart.outline.expect b/pkg/front_end/testcases/nnbd/strong_package_not_ok_from_dill/strong.dart.outline.expect
index 0c8bca3..a0f941d 100644
--- a/pkg/front_end/testcases/nnbd/strong_package_not_ok_from_dill/strong.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/strong_package_not_ok_from_dill/strong.dart.outline.expect
@@ -1,7 +1,7 @@
 //
 // Problems in component:
 //
-// Error: Cannot run with sound null safety as one or more dependencies do not
+// Error: This project cannot run with sound null safety, because one or more project dependencies do not
 // support null safety:
 //
 //  - package:opt_in_package/opt_out_lib.dart
@@ -10,6 +10,8 @@
 // Run 'pub outdated --mode=null-safety' to determine if versions of your
 // dependencies supporting null safety are available.
 //
+// pkg/front_end/testcases/nnbd/strong_package_not_ok_from_dill/opt_in_package/lib/opt_in_lib.dart: Error: Loaded library is compiled with unsound null safety and cannot be used in compilation for sound null safety.
+//
 library /*isNonNullableByDefault*/;
 import self as self;
 
diff --git a/pkg/front_end/testcases/nnbd/strong_package_not_ok_from_dill/strong.dart.strong.expect b/pkg/front_end/testcases/nnbd/strong_package_not_ok_from_dill/strong.dart.strong.expect
index ce5b6e5..d72b9a7 100644
--- a/pkg/front_end/testcases/nnbd/strong_package_not_ok_from_dill/strong.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/strong_package_not_ok_from_dill/strong.dart.strong.expect
@@ -1,7 +1,7 @@
 //
 // Problems in component:
 //
-// Error: Cannot run with sound null safety as one or more dependencies do not
+// Error: This project cannot run with sound null safety, because one or more project dependencies do not
 // support null safety:
 //
 //  - package:opt_in_package/opt_out_lib.dart
@@ -10,6 +10,8 @@
 // Run 'pub outdated --mode=null-safety' to determine if versions of your
 // dependencies supporting null safety are available.
 //
+// pkg/front_end/testcases/nnbd/strong_package_not_ok_from_dill/opt_in_package/lib/opt_in_lib.dart: Error: Loaded library is compiled with unsound null safety and cannot be used in compilation for sound null safety.
+//
 library /*isNonNullableByDefault*/;
 import self as self;
 
diff --git a/pkg/front_end/testcases/nnbd/strong_package_not_ok_from_dill/strong.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/strong_package_not_ok_from_dill/strong.dart.strong.transformed.expect
index ce5b6e5..d72b9a7 100644
--- a/pkg/front_end/testcases/nnbd/strong_package_not_ok_from_dill/strong.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/strong_package_not_ok_from_dill/strong.dart.strong.transformed.expect
@@ -1,7 +1,7 @@
 //
 // Problems in component:
 //
-// Error: Cannot run with sound null safety as one or more dependencies do not
+// Error: This project cannot run with sound null safety, because one or more project dependencies do not
 // support null safety:
 //
 //  - package:opt_in_package/opt_out_lib.dart
@@ -10,6 +10,8 @@
 // Run 'pub outdated --mode=null-safety' to determine if versions of your
 // dependencies supporting null safety are available.
 //
+// pkg/front_end/testcases/nnbd/strong_package_not_ok_from_dill/opt_in_package/lib/opt_in_lib.dart: Error: Loaded library is compiled with unsound null safety and cannot be used in compilation for sound null safety.
+//
 library /*isNonNullableByDefault*/;
 import self as self;
 
diff --git a/pkg/front_end/testcases/nnbd/strong_package_not_ok_from_source/strong.dart.outline.expect b/pkg/front_end/testcases/nnbd/strong_package_not_ok_from_source/strong.dart.outline.expect
index 6d4bfe9..59a5039 100644
--- a/pkg/front_end/testcases/nnbd/strong_package_not_ok_from_source/strong.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/strong_package_not_ok_from_source/strong.dart.outline.expect
@@ -8,7 +8,7 @@
 //
 // Problems in component:
 //
-// Error: Cannot run with sound null safety as one or more dependencies do not
+// Error: This project cannot run with sound null safety, because one or more project dependencies do not
 // support null safety:
 //
 //  - package:opt_out_package
diff --git a/pkg/front_end/testcases/nnbd/strong_package_not_ok_from_source/strong.dart.strong.expect b/pkg/front_end/testcases/nnbd/strong_package_not_ok_from_source/strong.dart.strong.expect
index 45dd453..d834f3b 100644
--- a/pkg/front_end/testcases/nnbd/strong_package_not_ok_from_source/strong.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/strong_package_not_ok_from_source/strong.dart.strong.expect
@@ -8,7 +8,7 @@
 //
 // Problems in component:
 //
-// Error: Cannot run with sound null safety as one or more dependencies do not
+// Error: This project cannot run with sound null safety, because one or more project dependencies do not
 // support null safety:
 //
 //  - package:opt_out_package
diff --git a/pkg/front_end/testcases/nnbd/strong_package_not_ok_from_source/strong.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/strong_package_not_ok_from_source/strong.dart.strong.transformed.expect
index 0134870..95f7dc1 100644
--- a/pkg/front_end/testcases/nnbd/strong_package_not_ok_from_source/strong.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/strong_package_not_ok_from_source/strong.dart.strong.transformed.expect
@@ -1,7 +1,7 @@
 //
 // Problems in component:
 //
-// Error: Cannot run with sound null safety as one or more dependencies do not
+// Error: This project cannot run with sound null safety, because one or more project dependencies do not
 // support null safety:
 //
 //  - package:opt_out_package
diff --git a/pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart.strong.transformed.expect
index c7475f1..23c8814 100644
--- a/pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart.strong.transformed.expect
@@ -57,7 +57,7 @@
 static method foo<T extends self::C? = self::C?>(self::C? c, self::foo::T% t, self::foo::T? nt) → dynamic {
   self::functionContext(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:14:24: Error: Can't tear off method 'call' from a potentially null value.
   functionContext(null as C?); // Error.
-                       ^" in let core::Null? #t2 = null in #t2.==(null) ?{() → core::int} #t2 as{TypeError} () → core::int : #t2{() → core::int});
+                       ^" in let Null #t2 = null in #t2.==(null) ?{() → core::int} #t2 as{TypeError} () → core::int : #t2{() → core::int});
   self::nullableFunctionContext(let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:15:32: Error: Can't tear off method 'call' from a potentially null value.
   nullableFunctionContext(null as C?); // Error.
                                ^" in null);
diff --git a/pkg/front_end/testcases/nnbd/type_constraint_solving_closures_in_upper_and_lower_bounds.dart.strong.expect b/pkg/front_end/testcases/nnbd/type_constraint_solving_closures_in_upper_and_lower_bounds.dart.strong.expect
index 5012338..771943f 100644
--- a/pkg/front_end/testcases/nnbd/type_constraint_solving_closures_in_upper_and_lower_bounds.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/type_constraint_solving_closures_in_upper_and_lower_bounds.dart.strong.expect
@@ -18,7 +18,7 @@
   return null as{ForNonNullableByDefault} self::check::T%;
 }
 static method test() → void {
-  core::int x = self::check<core::int>(new self::C::•<core::List<core::int>>((core::List<core::int> x) → core::Null? {}));
+  core::int x = self::check<core::int>(new self::C::•<core::List<core::int>>((core::List<core::int> x) → void {}));
   core::String s = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/type_constraint_solving_closures_in_upper_and_lower_bounds.dart:15:14: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
   String s = x; // Should be an error, `T` should be int.
              ^" in x as{TypeError,ForNonNullableByDefault} core::String;
diff --git a/pkg/front_end/testcases/nnbd/type_constraint_solving_closures_in_upper_and_lower_bounds.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/type_constraint_solving_closures_in_upper_and_lower_bounds.dart.strong.transformed.expect
index 0104bef..64936bf 100644
--- a/pkg/front_end/testcases/nnbd/type_constraint_solving_closures_in_upper_and_lower_bounds.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/type_constraint_solving_closures_in_upper_and_lower_bounds.dart.strong.transformed.expect
@@ -15,10 +15,10 @@
     ;
 }
 static method check<T extends core::Object? = dynamic>(self::C<core::List<self::check::T%>> f) → self::check::T% {
-  return let core::Null? #t1 = null in #t1.==(null) ?{self::check::T%} #t1 as{ForNonNullableByDefault} self::check::T% : #t1{self::check::T%};
+  return let Null #t1 = null in #t1.==(null) ?{self::check::T%} #t1 as{ForNonNullableByDefault} self::check::T% : #t1{self::check::T%};
 }
 static method test() → void {
-  core::int x = self::check<core::int>(new self::C::•<core::List<core::int>>((core::List<core::int> x) → core::Null? {}));
+  core::int x = self::check<core::int>(new self::C::•<core::List<core::int>>((core::List<core::int> x) → void {}));
   core::String s = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/type_constraint_solving_closures_in_upper_and_lower_bounds.dart:15:14: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
   String s = x; // Should be an error, `T` should be int.
              ^" in x as{TypeError,ForNonNullableByDefault} core::String;
diff --git a/pkg/front_end/testcases/nnbd/type_constraint_solving_closures_in_upper_and_lower_bounds.dart.weak.expect b/pkg/front_end/testcases/nnbd/type_constraint_solving_closures_in_upper_and_lower_bounds.dart.weak.expect
index 5012338..771943f 100644
--- a/pkg/front_end/testcases/nnbd/type_constraint_solving_closures_in_upper_and_lower_bounds.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/type_constraint_solving_closures_in_upper_and_lower_bounds.dart.weak.expect
@@ -18,7 +18,7 @@
   return null as{ForNonNullableByDefault} self::check::T%;
 }
 static method test() → void {
-  core::int x = self::check<core::int>(new self::C::•<core::List<core::int>>((core::List<core::int> x) → core::Null? {}));
+  core::int x = self::check<core::int>(new self::C::•<core::List<core::int>>((core::List<core::int> x) → void {}));
   core::String s = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/type_constraint_solving_closures_in_upper_and_lower_bounds.dart:15:14: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
   String s = x; // Should be an error, `T` should be int.
              ^" in x as{TypeError,ForNonNullableByDefault} core::String;
diff --git a/pkg/front_end/testcases/nnbd/type_constraint_solving_closures_in_upper_and_lower_bounds.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/type_constraint_solving_closures_in_upper_and_lower_bounds.dart.weak.transformed.expect
index 442fdfd..16ca485 100644
--- a/pkg/front_end/testcases/nnbd/type_constraint_solving_closures_in_upper_and_lower_bounds.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/type_constraint_solving_closures_in_upper_and_lower_bounds.dart.weak.transformed.expect
@@ -18,7 +18,7 @@
   return null;
 }
 static method test() → void {
-  core::int x = self::check<core::int>(new self::C::•<core::List<core::int>>((core::List<core::int> x) → core::Null? {}));
+  core::int x = self::check<core::int>(new self::C::•<core::List<core::int>>((core::List<core::int> x) → void {}));
   core::String s = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/type_constraint_solving_closures_in_upper_and_lower_bounds.dart:15:14: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
   String s = x; // Should be an error, `T` should be int.
              ^" in x as{TypeError,ForNonNullableByDefault} core::String;
diff --git a/pkg/front_end/testcases/nnbd_mixed/bounds_from_opt_in.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/bounds_from_opt_in.dart.weak.expect
index 364e1c1..f315bb6 100644
--- a/pkg/front_end/testcases/nnbd_mixed/bounds_from_opt_in.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/bounds_from_opt_in.dart.weak.expect
@@ -1,15 +1,15 @@
 library;
 import self as self;
-import "dart:core" as core;
 import "bounds_from_opt_in_lib.dart" as bou;
+import "dart:core" as core;
 
 import "org-dartlang-testcase:///bounds_from_opt_in_lib.dart";
 
-class LegacyClass<T extends core::Null? = core::Null?> extends bou::Class<self::LegacyClass::T*> {
+class LegacyClass<T extends Null = Null> extends bou::Class<self::LegacyClass::T*> {
   synthetic constructor •() → self::LegacyClass<self::LegacyClass::T*>*
     : super bou::Class::•()
     ;
-  method method<T extends core::Null? = core::Null?>() → dynamic {}
+  method method<T extends Null = Null>() → dynamic {}
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -22,9 +22,9 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 static method test() → dynamic {
-  bou::Class<core::Null?>* c = new bou::Class::•<core::Null?>();
-  c.{bou::Class::method}<core::Null?>();
-  bou::method<core::Null?>();
+  bou::Class<Null>* c = new bou::Class::•<Null>();
+  c.{bou::Class::method}<Null>();
+  bou::method<Null>();
 }
 static method main() → dynamic {}
 
diff --git a/pkg/front_end/testcases/nnbd_mixed/bounds_from_opt_in.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/bounds_from_opt_in.dart.weak.transformed.expect
index 364e1c1..f315bb6 100644
--- a/pkg/front_end/testcases/nnbd_mixed/bounds_from_opt_in.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/bounds_from_opt_in.dart.weak.transformed.expect
@@ -1,15 +1,15 @@
 library;
 import self as self;
-import "dart:core" as core;
 import "bounds_from_opt_in_lib.dart" as bou;
+import "dart:core" as core;
 
 import "org-dartlang-testcase:///bounds_from_opt_in_lib.dart";
 
-class LegacyClass<T extends core::Null? = core::Null?> extends bou::Class<self::LegacyClass::T*> {
+class LegacyClass<T extends Null = Null> extends bou::Class<self::LegacyClass::T*> {
   synthetic constructor •() → self::LegacyClass<self::LegacyClass::T*>*
     : super bou::Class::•()
     ;
-  method method<T extends core::Null? = core::Null?>() → dynamic {}
+  method method<T extends Null = Null>() → dynamic {}
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -22,9 +22,9 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 static method test() → dynamic {
-  bou::Class<core::Null?>* c = new bou::Class::•<core::Null?>();
-  c.{bou::Class::method}<core::Null?>();
-  bou::method<core::Null?>();
+  bou::Class<Null>* c = new bou::Class::•<Null>();
+  c.{bou::Class::method}<Null>();
+  bou::method<Null>();
 }
 static method main() → dynamic {}
 
diff --git a/pkg/front_end/testcases/nnbd_mixed/call_opt_in_through_opt_out.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/call_opt_in_through_opt_out.dart.weak.expect
index 3725acd..496eb80 100644
--- a/pkg/front_end/testcases/nnbd_mixed/call_opt_in_through_opt_out.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/call_opt_in_through_opt_out.dart.weak.expect
@@ -29,11 +29,11 @@
 import self as cal;
 import "dart:core" as core;
 
-static method takesNull(core::Null? n) → void {}
+static method takesNull(Null n) → void {}
 static method takesNever(Never n) → void {}
-static method applyTakesNull((core::Null?) → void f) → dynamic {}
+static method applyTakesNull((Null) → void f) → dynamic {}
 static method applyTakesNever((Never) → void f) → dynamic {}
-static method applyTakesNullNamed({required (core::Null?) → void f = #C5}) → dynamic {}
+static method applyTakesNullNamed({required (Null) → void f = #C5}) → dynamic {}
 static method applyTakesNeverNamed({required (Never) → void f = #C5}) → dynamic {}
 static method takesNullable(core::int? i) → void {}
 static method takesNonNullable(core::int i) → void {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/call_opt_in_through_opt_out.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/call_opt_in_through_opt_out.dart.weak.transformed.expect
index 3725acd..496eb80 100644
--- a/pkg/front_end/testcases/nnbd_mixed/call_opt_in_through_opt_out.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/call_opt_in_through_opt_out.dart.weak.transformed.expect
@@ -29,11 +29,11 @@
 import self as cal;
 import "dart:core" as core;
 
-static method takesNull(core::Null? n) → void {}
+static method takesNull(Null n) → void {}
 static method takesNever(Never n) → void {}
-static method applyTakesNull((core::Null?) → void f) → dynamic {}
+static method applyTakesNull((Null) → void f) → dynamic {}
 static method applyTakesNever((Never) → void f) → dynamic {}
-static method applyTakesNullNamed({required (core::Null?) → void f = #C5}) → dynamic {}
+static method applyTakesNullNamed({required (Null) → void f = #C5}) → dynamic {}
 static method applyTakesNeverNamed({required (Never) → void f = #C5}) → dynamic {}
 static method takesNullable(core::int? i) → void {}
 static method takesNonNullable(core::int i) → void {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/const_is.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/const_is.dart.weak.expect
index a139d60..bdcfe75 100644
--- a/pkg/front_end/testcases/nnbd_mixed/const_is.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/const_is.dart.weak.expect
@@ -23,7 +23,7 @@
 typedef fnTypeWithNeverBound = <T extends Never = dynamic>() → void;
 static method fnWithNonNullObjectBound<T extends core::Object = core::Object>() → void
   return null;
-static method fnWithNullBound<T extends core::Null? = core::Null?>() → void
+static method fnWithNullBound<T extends Null = Null>() → void
   return null;
 
 constants  {
diff --git a/pkg/front_end/testcases/nnbd_mixed/const_is.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/const_is.dart.weak.transformed.expect
index 9c0d806..a2670ba 100644
--- a/pkg/front_end/testcases/nnbd_mixed/const_is.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/const_is.dart.weak.transformed.expect
@@ -23,7 +23,7 @@
 typedef fnTypeWithNeverBound = <T extends Never = dynamic>() → void;
 static method fnWithNonNullObjectBound<T extends core::Object = core::Object>() → void
   return null;
-static method fnWithNullBound<T extends core::Null? = core::Null?>() → void
+static method fnWithNullBound<T extends Null = Null>() → void
   return null;
 
 constants  {
diff --git a/pkg/front_end/testcases/nnbd_mixed/constant_null_is.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/constant_null_is.dart.weak.expect
index 2a5dc83..470c9c8 100644
--- a/pkg/front_end/testcases/nnbd_mixed/constant_null_is.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/constant_null_is.dart.weak.expect
@@ -37,45 +37,45 @@
 static const field core::bool c12 = #C2;
 static const field self::Class<core::int> e1 = #C4;
 static const field self::Class<core::int?> e2 = #C4;
-static const field self::Class<core::Null?> e3 = #C5;
+static const field self::Class<Null> e3 = #C5;
 static const field self::Class<core::int> e4 = #C6;
 static const field self::Class<core::int?> e5 = #C6;
-static const field self::Class<core::Null?> e6 = #C5;
+static const field self::Class<Null> e6 = #C5;
 static const field self::Class<core::int> e7 = #C4;
 static const field self::Class<core::int?> e8 = #C4;
-static const field self::Class<core::Null?> e9 = #C7;
+static const field self::Class<Null> e9 = #C7;
 static const field self::Class<core::int> e10 = #C6;
 static const field self::Class<core::int?> e11 = #C6;
-static const field self::Class<core::Null?> e12 = #C5;
+static const field self::Class<Null> e12 = #C5;
 static method main() → dynamic {
   self::expect(null is{ForNonNullableByDefault} core::int?, #C2, "null is int?");
   self::expect(null is{ForNonNullableByDefault} core::int, #C3, "null is int");
-  self::expect(null is{ForNonNullableByDefault} core::Null?, #C2, "null is Null");
+  self::expect(null is{ForNonNullableByDefault} Null, #C2, "null is Null");
   self::expect(null is{ForNonNullableByDefault} Never?, #C2, "null is Never?");
   self::expect(null is{ForNonNullableByDefault} Never, #C3, "null is Never");
   self::expect(null is{ForNonNullableByDefault} FutureOr<core::int?>, #C2, "null is FutureOr<int?>");
   self::expect(null is{ForNonNullableByDefault} FutureOr<core::int>, #C3, "null is FutureOr<int>");
   self::expect(null is{ForNonNullableByDefault} FutureOr<core::int>?, #C2, "null is FutureOr<int>?");
-  self::expect(null is{ForNonNullableByDefault} FutureOr<core::Null?>, #C2, "null is FutureOr<Null>");
-  self::expect(null is{ForNonNullableByDefault} FutureOr<core::Null?>?, #C2, "null is FutureOr<Null>?");
+  self::expect(null is{ForNonNullableByDefault} FutureOr<Null>, #C2, "null is FutureOr<Null>");
+  self::expect(null is{ForNonNullableByDefault} FutureOr<Null>?, #C2, "null is FutureOr<Null>?");
   self::expect(null is{ForNonNullableByDefault} FutureOr<Never>, #C3, "null is FutureOr<Never>");
   self::expect(null is{ForNonNullableByDefault} FutureOr<Never?>, #C2, "null is FutureOr<Never?>");
   self::expect(null is{ForNonNullableByDefault} FutureOr<Never>?, #C2, "null is FutureOr<Never>?");
   self::expect(new self::Class::constructor1<core::int>(null).{self::Class::field}, (#C4).{self::Class::field}, "Class<int>.constructor1(null).field");
   self::expect(true, new self::Class::constructor1<core::int?>(null).{self::Class::field}, "new Class<int?>.constructor1(null).field");
   self::expect(!self::isWeakMode, (#C4).{self::Class::field}, "const Class<int?>.constructor1(null).field");
-  self::expect(new self::Class::constructor1<core::Null?>(null).{self::Class::field}, (#C5).{self::Class::field}, "Class<Null>.constructor1(null).field");
+  self::expect(new self::Class::constructor1<Null>(null).{self::Class::field}, (#C5).{self::Class::field}, "Class<Null>.constructor1(null).field");
   self::expect(new self::Class::constructor2<core::int>(null).{self::Class::field}, (#C6).{self::Class::field}, "Class<int>.constructor2(null).field");
   self::expect(true, new self::Class::constructor2<core::int?>(null).{self::Class::field}, "new Class<int?>.constructor2(null).field");
   self::expect(new self::Class::constructor2<core::int?>(null).{self::Class::field}, (#C6).{self::Class::field}, "Class<int?>.constructor2(null).field");
-  self::expect(new self::Class::constructor2<core::Null?>(null).{self::Class::field}, (#C5).{self::Class::field}, "Class<Null>.constructor2(null).field");
+  self::expect(new self::Class::constructor2<Null>(null).{self::Class::field}, (#C5).{self::Class::field}, "Class<Null>.constructor2(null).field");
   self::expect(new self::Class::constructor3<core::int>(null).{self::Class::field}, (#C4).{self::Class::field}, "Class<int>.constructor3(null).field");
   self::expect(new self::Class::constructor3<core::int?>(null).{self::Class::field}, (#C4).{self::Class::field}, "Class<int?>.constructor3(null).field");
   self::expect(new self::Class::constructor3<core::int?>(null).{self::Class::field}, (#C4).{self::Class::field}, "Class<int?>.constructor3(null).field");
-  self::expect(new self::Class::constructor3<core::Null?>(null).{self::Class::field}, (#C7).{self::Class::field}, "Class<Null>.constructor3(null).field");
+  self::expect(new self::Class::constructor3<Null>(null).{self::Class::field}, (#C7).{self::Class::field}, "Class<Null>.constructor3(null).field");
   self::expect(new self::Class::constructor4<core::int>(null).{self::Class::field}, (#C6).{self::Class::field}, "Class<int>.constructor4(null).field");
   self::expect(new self::Class::constructor4<core::int?>(null).{self::Class::field}, (#C6).{self::Class::field}, "Class<int?>.constructor4(null).field");
-  self::expect(new self::Class::constructor4<core::Null?>(null).{self::Class::field}, (#C5).{self::Class::field}, "Class<Null>.constructor4(null).field");
+  self::expect(new self::Class::constructor4<Null>(null).{self::Class::field}, (#C5).{self::Class::field}, "Class<Null>.constructor4(null).field");
   con::test();
 }
 static method expect(dynamic expected, dynamic actual, core::String message) → dynamic {
@@ -94,32 +94,32 @@
 static const field core::bool* d0 = #C3;
 static const field core::bool* d1 = #C2;
 static const field self::Class<core::int*>* d4 = #C4;
-static const field self::Class<core::Null?>* d5 = #C5;
+static const field self::Class<Null>* d5 = #C5;
 static const field self::Class<core::int*>* d6 = #C6;
-static const field self::Class<core::Null?>* d7 = #C5;
+static const field self::Class<Null>* d7 = #C5;
 static const field self::Class<core::int*>* d8 = #C4;
-static const field self::Class<core::Null?>* d9 = #C7;
+static const field self::Class<Null>* d9 = #C7;
 static const field self::Class<core::int*>* d10 = #C6;
-static const field self::Class<core::Null?>* d11 = #C5;
+static const field self::Class<Null>* d11 = #C5;
 static method test() → dynamic {
   self::expect(null is core::int*, #C3, "null is int (opt-out)");
-  self::expect(null is core::Null?, #C2, "null is Null");
+  self::expect(null is Null, #C2, "null is Null");
   self::expect(new self::Class::constructor1<core::int*>(null).{self::Class::field}, (#C4).{self::Class::field}, "Class<int>.constructor1(null).field (opt-out)");
-  self::expect(new self::Class::constructor1<core::Null?>(null).{self::Class::field}, (#C5).{self::Class::field}, "Class<Null>.constructor1(null).field (opt-out)");
+  self::expect(new self::Class::constructor1<Null>(null).{self::Class::field}, (#C5).{self::Class::field}, "Class<Null>.constructor1(null).field (opt-out)");
   self::expect(new self::Class::constructor2<core::int*>(null).{self::Class::field}, (#C6).{self::Class::field}, "Class<int>.constructor2(null).field (opt-out)");
-  self::expect(new self::Class::constructor2<core::Null?>(null).{self::Class::field}, (#C5).{self::Class::field}, "Class<Null>.constructor2(null).field (opt-out)");
+  self::expect(new self::Class::constructor2<Null>(null).{self::Class::field}, (#C5).{self::Class::field}, "Class<Null>.constructor2(null).field (opt-out)");
   self::expect(new self::Class::constructor3<core::int*>(null).{self::Class::field}, (#C4).{self::Class::field}, "Class<int>.constructor3(null).field (opt-out)");
-  self::expect(new self::Class::constructor3<core::Null?>(null).{self::Class::field}, (#C7).{self::Class::field}, "Class<Null>.constructor3(null).field (opt-out)");
+  self::expect(new self::Class::constructor3<Null>(null).{self::Class::field}, (#C7).{self::Class::field}, "Class<Null>.constructor3(null).field (opt-out)");
   self::expect(new self::Class::constructor4<core::int*>(null).{self::Class::field}, (#C6).{self::Class::field}, "Class<int>.constructor4(null).field (opt-out)");
-  self::expect(new self::Class::constructor4<core::Null?>(null).{self::Class::field}, (#C5).{self::Class::field}, "Class<Null>.constructor4(null).field (opt-out)");
+  self::expect(new self::Class::constructor4<Null>(null).{self::Class::field}, (#C5).{self::Class::field}, "Class<Null>.constructor4(null).field (opt-out)");
 }
 
 constants  {
-  #C1 = <core::Null?>[]
+  #C1 = <Null>[]
   #C2 = true
   #C3 = false
   #C4 = self::Class<core::int*> {field:#C3}
-  #C5 = self::Class<core::Null?> {field:#C2}
+  #C5 = self::Class<Null> {field:#C2}
   #C6 = self::Class<core::int*> {field:#C2}
-  #C7 = self::Class<core::Null?> {field:#C3}
+  #C7 = self::Class<Null> {field:#C3}
 }
diff --git a/pkg/front_end/testcases/nnbd_mixed/constant_null_is.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/constant_null_is.dart.weak.transformed.expect
index 439da59..dc41d03 100644
--- a/pkg/front_end/testcases/nnbd_mixed/constant_null_is.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/constant_null_is.dart.weak.transformed.expect
@@ -37,45 +37,45 @@
 static const field core::bool c12 = #C2;
 static const field self::Class<core::int> e1 = #C4;
 static const field self::Class<core::int?> e2 = #C4;
-static const field self::Class<core::Null?> e3 = #C5;
+static const field self::Class<Null> e3 = #C5;
 static const field self::Class<core::int> e4 = #C6;
 static const field self::Class<core::int?> e5 = #C6;
-static const field self::Class<core::Null?> e6 = #C5;
+static const field self::Class<Null> e6 = #C5;
 static const field self::Class<core::int> e7 = #C4;
 static const field self::Class<core::int?> e8 = #C4;
-static const field self::Class<core::Null?> e9 = #C7;
+static const field self::Class<Null> e9 = #C7;
 static const field self::Class<core::int> e10 = #C6;
 static const field self::Class<core::int?> e11 = #C6;
-static const field self::Class<core::Null?> e12 = #C5;
+static const field self::Class<Null> e12 = #C5;
 static method main() → dynamic {
   self::expect(null is{ForNonNullableByDefault} core::int?, #C2, "null is int?");
   self::expect(null is{ForNonNullableByDefault} core::int, #C3, "null is int");
-  self::expect(null is{ForNonNullableByDefault} core::Null?, #C2, "null is Null");
+  self::expect(null is{ForNonNullableByDefault} Null, #C2, "null is Null");
   self::expect(null is{ForNonNullableByDefault} Never?, #C2, "null is Never?");
   self::expect(null is{ForNonNullableByDefault} Never, #C3, "null is Never");
   self::expect(null is{ForNonNullableByDefault} FutureOr<core::int?>, #C2, "null is FutureOr<int?>");
   self::expect(null is{ForNonNullableByDefault} FutureOr<core::int>, #C3, "null is FutureOr<int>");
   self::expect(null is{ForNonNullableByDefault} FutureOr<core::int>?, #C2, "null is FutureOr<int>?");
-  self::expect(null is{ForNonNullableByDefault} FutureOr<core::Null?>, #C2, "null is FutureOr<Null>");
-  self::expect(null is{ForNonNullableByDefault} FutureOr<core::Null?>?, #C2, "null is FutureOr<Null>?");
+  self::expect(null is{ForNonNullableByDefault} FutureOr<Null>, #C2, "null is FutureOr<Null>");
+  self::expect(null is{ForNonNullableByDefault} FutureOr<Null>?, #C2, "null is FutureOr<Null>?");
   self::expect(null is{ForNonNullableByDefault} FutureOr<Never>, #C3, "null is FutureOr<Never>");
   self::expect(null is{ForNonNullableByDefault} FutureOr<Never?>, #C2, "null is FutureOr<Never?>");
   self::expect(null is{ForNonNullableByDefault} FutureOr<Never>?, #C2, "null is FutureOr<Never>?");
   self::expect(new self::Class::constructor1<core::int>(null).{self::Class::field}, (#C4).{self::Class::field}, "Class<int>.constructor1(null).field");
   self::expect(true, new self::Class::constructor1<core::int?>(null).{self::Class::field}, "new Class<int?>.constructor1(null).field");
   self::expect(!self::isWeakMode, (#C4).{self::Class::field}, "const Class<int?>.constructor1(null).field");
-  self::expect(new self::Class::constructor1<core::Null?>(null).{self::Class::field}, (#C5).{self::Class::field}, "Class<Null>.constructor1(null).field");
+  self::expect(new self::Class::constructor1<Null>(null).{self::Class::field}, (#C5).{self::Class::field}, "Class<Null>.constructor1(null).field");
   self::expect(new self::Class::constructor2<core::int>(null).{self::Class::field}, (#C6).{self::Class::field}, "Class<int>.constructor2(null).field");
   self::expect(true, new self::Class::constructor2<core::int?>(null).{self::Class::field}, "new Class<int?>.constructor2(null).field");
   self::expect(new self::Class::constructor2<core::int?>(null).{self::Class::field}, (#C6).{self::Class::field}, "Class<int?>.constructor2(null).field");
-  self::expect(new self::Class::constructor2<core::Null?>(null).{self::Class::field}, (#C5).{self::Class::field}, "Class<Null>.constructor2(null).field");
+  self::expect(new self::Class::constructor2<Null>(null).{self::Class::field}, (#C5).{self::Class::field}, "Class<Null>.constructor2(null).field");
   self::expect(new self::Class::constructor3<core::int>(null).{self::Class::field}, (#C4).{self::Class::field}, "Class<int>.constructor3(null).field");
   self::expect(new self::Class::constructor3<core::int?>(null).{self::Class::field}, (#C4).{self::Class::field}, "Class<int?>.constructor3(null).field");
   self::expect(new self::Class::constructor3<core::int?>(null).{self::Class::field}, (#C4).{self::Class::field}, "Class<int?>.constructor3(null).field");
-  self::expect(new self::Class::constructor3<core::Null?>(null).{self::Class::field}, (#C7).{self::Class::field}, "Class<Null>.constructor3(null).field");
+  self::expect(new self::Class::constructor3<Null>(null).{self::Class::field}, (#C7).{self::Class::field}, "Class<Null>.constructor3(null).field");
   self::expect(new self::Class::constructor4<core::int>(null).{self::Class::field}, (#C6).{self::Class::field}, "Class<int>.constructor4(null).field");
   self::expect(new self::Class::constructor4<core::int?>(null).{self::Class::field}, (#C6).{self::Class::field}, "Class<int?>.constructor4(null).field");
-  self::expect(new self::Class::constructor4<core::Null?>(null).{self::Class::field}, (#C5).{self::Class::field}, "Class<Null>.constructor4(null).field");
+  self::expect(new self::Class::constructor4<Null>(null).{self::Class::field}, (#C5).{self::Class::field}, "Class<Null>.constructor4(null).field");
   con::test();
 }
 static method expect(dynamic expected, dynamic actual, core::String message) → dynamic {
@@ -94,34 +94,34 @@
 static const field core::bool* d0 = #C3;
 static const field core::bool* d1 = #C2;
 static const field self::Class<core::int*>* d4 = #C4;
-static const field self::Class<core::Null?>* d5 = #C5;
+static const field self::Class<Null>* d5 = #C5;
 static const field self::Class<core::int*>* d6 = #C6;
-static const field self::Class<core::Null?>* d7 = #C5;
+static const field self::Class<Null>* d7 = #C5;
 static const field self::Class<core::int*>* d8 = #C4;
-static const field self::Class<core::Null?>* d9 = #C7;
+static const field self::Class<Null>* d9 = #C7;
 static const field self::Class<core::int*>* d10 = #C6;
-static const field self::Class<core::Null?>* d11 = #C5;
+static const field self::Class<Null>* d11 = #C5;
 static method test() → dynamic {
   self::expect(null is core::int*, #C3, "null is int (opt-out)");
-  self::expect(null is core::Null?, #C2, "null is Null");
+  self::expect(null is Null, #C2, "null is Null");
   self::expect(new self::Class::constructor1<core::int*>(null).{self::Class::field}, (#C4).{self::Class::field}, "Class<int>.constructor1(null).field (opt-out)");
-  self::expect(new self::Class::constructor1<core::Null?>(null).{self::Class::field}, (#C5).{self::Class::field}, "Class<Null>.constructor1(null).field (opt-out)");
+  self::expect(new self::Class::constructor1<Null>(null).{self::Class::field}, (#C5).{self::Class::field}, "Class<Null>.constructor1(null).field (opt-out)");
   self::expect(new self::Class::constructor2<core::int*>(null).{self::Class::field}, (#C6).{self::Class::field}, "Class<int>.constructor2(null).field (opt-out)");
-  self::expect(new self::Class::constructor2<core::Null?>(null).{self::Class::field}, (#C5).{self::Class::field}, "Class<Null>.constructor2(null).field (opt-out)");
+  self::expect(new self::Class::constructor2<Null>(null).{self::Class::field}, (#C5).{self::Class::field}, "Class<Null>.constructor2(null).field (opt-out)");
   self::expect(new self::Class::constructor3<core::int*>(null).{self::Class::field}, (#C4).{self::Class::field}, "Class<int>.constructor3(null).field (opt-out)");
-  self::expect(new self::Class::constructor3<core::Null?>(null).{self::Class::field}, (#C7).{self::Class::field}, "Class<Null>.constructor3(null).field (opt-out)");
+  self::expect(new self::Class::constructor3<Null>(null).{self::Class::field}, (#C7).{self::Class::field}, "Class<Null>.constructor3(null).field (opt-out)");
   self::expect(new self::Class::constructor4<core::int*>(null).{self::Class::field}, (#C6).{self::Class::field}, "Class<int>.constructor4(null).field (opt-out)");
-  self::expect(new self::Class::constructor4<core::Null?>(null).{self::Class::field}, (#C5).{self::Class::field}, "Class<Null>.constructor4(null).field (opt-out)");
+  self::expect(new self::Class::constructor4<Null>(null).{self::Class::field}, (#C5).{self::Class::field}, "Class<Null>.constructor4(null).field (opt-out)");
 }
 
 constants  {
-  #C1 = <core::Null?>[]
+  #C1 = <Null>[]
   #C2 = true
   #C3 = false
   #C4 = self::Class<core::int*> {field:#C3}
-  #C5 = self::Class<core::Null?> {field:#C2}
+  #C5 = self::Class<Null> {field:#C2}
   #C6 = self::Class<core::int*> {field:#C2}
-  #C7 = self::Class<core::Null?> {field:#C3}
+  #C7 = self::Class<Null> {field:#C3}
 }
 
 Extra constant evaluation status:
diff --git a/pkg/front_end/testcases/nnbd_mixed/constants.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/constants.dart.weak.expect
index e324019..0124126 100644
--- a/pkg/front_end/testcases/nnbd_mixed/constants.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/constants.dart.weak.expect
@@ -88,7 +88,7 @@
   #C5 = <core::int*>[#C3]
   #C6 = null
   #C7 = <dynamic>[#C3, #C6]
-  #C8 = core::_ImmutableMap<core::int*, core::Null?> {_kvPairs:#C7}
+  #C8 = core::_ImmutableMap<core::int*, Null> {_kvPairs:#C7}
   #C9 = col::_UnmodifiableSet<core::int*> {_map:#C8}
   #C10 = "foo"
   #C11 = <dynamic>[#C3, #C10]
diff --git a/pkg/front_end/testcases/nnbd_mixed/constants.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/constants.dart.weak.transformed.expect
index e324019..0124126 100644
--- a/pkg/front_end/testcases/nnbd_mixed/constants.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/constants.dart.weak.transformed.expect
@@ -88,7 +88,7 @@
   #C5 = <core::int*>[#C3]
   #C6 = null
   #C7 = <dynamic>[#C3, #C6]
-  #C8 = core::_ImmutableMap<core::int*, core::Null?> {_kvPairs:#C7}
+  #C8 = core::_ImmutableMap<core::int*, Null> {_kvPairs:#C7}
   #C9 = col::_UnmodifiableSet<core::int*> {_map:#C8}
   #C10 = "foo"
   #C11 = <dynamic>[#C3, #C10]
diff --git a/pkg/front_end/testcases/nnbd_mixed/experiment_release_version/not_allowed_package/lib/versioned_2_9_lib.dart b/pkg/front_end/testcases/nnbd_mixed/experiment_release_version/not_allowed_package/lib/versioned_2_9_lib.dart
index 43a931e..ff693f6 100644
--- a/pkg/front_end/testcases/nnbd_mixed/experiment_release_version/not_allowed_package/lib/versioned_2_9_lib.dart
+++ b/pkg/front_end/testcases/nnbd_mixed/experiment_release_version/not_allowed_package/lib/versioned_2_9_lib.dart
@@ -4,4 +4,4 @@
 
 // @dart=2.9
 
-int? versioned_2_9_AllowedPackage; // ok
\ No newline at end of file
+int? versioned_2_9_AllowedPackage; // error
\ No newline at end of file
diff --git a/pkg/front_end/testcases/nnbd_mixed/experiment_release_version/versioned_2_9_lib.dart b/pkg/front_end/testcases/nnbd_mixed/experiment_release_version/versioned_2_9_lib.dart
index 6df385a..7a9a3ee 100644
--- a/pkg/front_end/testcases/nnbd_mixed/experiment_release_version/versioned_2_9_lib.dart
+++ b/pkg/front_end/testcases/nnbd_mixed/experiment_release_version/versioned_2_9_lib.dart
@@ -4,4 +4,4 @@
 
 // @dart=2.9
 
-int? versioned_2_9_Library; // ok
\ No newline at end of file
+int? versioned_2_9_Library; // error
\ No newline at end of file
diff --git a/pkg/front_end/testcases/nnbd_mixed/flutter_issue_63029/flutter_issue_63029.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/flutter_issue_63029/flutter_issue_63029.dart.weak.expect
index b2ebdd8..2c462af 100644
--- a/pkg/front_end/testcases/nnbd_mixed/flutter_issue_63029/flutter_issue_63029.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/flutter_issue_63029/flutter_issue_63029.dart.weak.expect
@@ -16,7 +16,7 @@
   synthetic constructor •() → self::_F&B&D
     : super flu::B::•()
     ;
-  abstract forwarding-stub operator ==(dynamic other) → core::bool*;
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
 }
 class F extends self::_F&B&D {
   synthetic constructor •() → self::F
diff --git a/pkg/front_end/testcases/nnbd_mixed/infer_constraints_from_opt_in.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/infer_constraints_from_opt_in.dart.weak.expect
index ef2cfcc..e4cfa36 100644
--- a/pkg/front_end/testcases/nnbd_mixed/infer_constraints_from_opt_in.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/infer_constraints_from_opt_in.dart.weak.expect
@@ -34,23 +34,87 @@
   core::List<inf::C<core::int*>*>* local1f = <inf::C<core::int*>*>[inf::field6];
   core::List<core::int*>* local1g = <core::int*>[inf::field7];
   core::List<core::int*>* local1h = <core::int*>[inf::field8];
-  core::List<core::Null?>* local1i = <core::Null?>[null];
-  core::Set<inf::C<dynamic>*>* local2a = let final core::Set<inf::C<dynamic>*>* #t1 = col::LinkedHashSet::•<inf::C<dynamic>*>() in let final dynamic #t2 = #t1.{core::Set::add}(inf::field1) in let final dynamic #t3 = #t1.{core::Set::add}(null) in #t1;
-  core::Set<inf::C<dynamic>*>* local2b = let final core::Set<inf::C<dynamic>*>* #t4 = col::LinkedHashSet::•<inf::C<dynamic>*>() in let final dynamic #t5 = #t4.{core::Set::add}(inf::field2) in let final dynamic #t6 = #t4.{core::Set::add}(null) in #t4;
-  core::Set<inf::C<core::int*>*>* local2c = let final core::Set<inf::C<core::int*>*>* #t7 = col::LinkedHashSet::•<inf::C<core::int*>*>() in let final dynamic #t8 = #t7.{core::Set::add}(inf::field3) in let final dynamic #t9 = #t7.{core::Set::add}(null) in #t7;
-  core::Set<inf::C<core::int*>*>* local2d = let final core::Set<inf::C<core::int*>*>* #t10 = col::LinkedHashSet::•<inf::C<core::int*>*>() in let final dynamic #t11 = #t10.{core::Set::add}(inf::field4) in let final dynamic #t12 = #t10.{core::Set::add}(null) in #t10;
-  core::Set<inf::C<core::int*>*>* local2e = let final core::Set<inf::C<core::int*>*>* #t13 = col::LinkedHashSet::•<inf::C<core::int*>*>() in let final dynamic #t14 = #t13.{core::Set::add}(inf::field5) in let final dynamic #t15 = #t13.{core::Set::add}(null) in #t13;
-  core::Set<inf::C<core::int*>*>* local2f = let final core::Set<inf::C<core::int*>*>* #t16 = col::LinkedHashSet::•<inf::C<core::int*>*>() in let final dynamic #t17 = #t16.{core::Set::add}(inf::field6) in let final dynamic #t18 = #t16.{core::Set::add}(null) in #t16;
-  core::Set<core::int*>* local2g = let final core::Set<core::int*>* #t19 = col::LinkedHashSet::•<core::int*>() in let final dynamic #t20 = #t19.{core::Set::add}(inf::field7) in let final dynamic #t21 = #t19.{core::Set::add}(null) in #t19;
-  core::Set<core::int*>* local2h = let final core::Set<core::int*>* #t22 = col::LinkedHashSet::•<core::int*>() in let final dynamic #t23 = #t22.{core::Set::add}(inf::field8) in let final dynamic #t24 = #t22.{core::Set::add}(null) in #t22;
-  core::Set<inf::C<dynamic>*>* local3a = let final core::Set<inf::C<dynamic>*>* #t25 = col::LinkedHashSet::•<inf::C<dynamic>*>() in let final dynamic #t26 = #t25.{core::Set::add}(null) in let final dynamic #t27 = #t25.{core::Set::add}(inf::field1) in #t25;
-  core::Set<inf::C<dynamic>*>* local3b = let final core::Set<inf::C<dynamic>*>* #t28 = col::LinkedHashSet::•<inf::C<dynamic>*>() in let final dynamic #t29 = #t28.{core::Set::add}(null) in let final dynamic #t30 = #t28.{core::Set::add}(inf::field2) in #t28;
-  core::Set<inf::C<core::int*>*>* local3c = let final core::Set<inf::C<core::int*>*>* #t31 = col::LinkedHashSet::•<inf::C<core::int*>*>() in let final dynamic #t32 = #t31.{core::Set::add}(null) in let final dynamic #t33 = #t31.{core::Set::add}(inf::field3) in #t31;
-  core::Set<inf::C<core::int*>*>* local3d = let final core::Set<inf::C<core::int*>*>* #t34 = col::LinkedHashSet::•<inf::C<core::int*>*>() in let final dynamic #t35 = #t34.{core::Set::add}(null) in let final dynamic #t36 = #t34.{core::Set::add}(inf::field4) in #t34;
-  core::Set<inf::C<core::int*>*>* local3e = let final core::Set<inf::C<core::int*>*>* #t37 = col::LinkedHashSet::•<inf::C<core::int*>*>() in let final dynamic #t38 = #t37.{core::Set::add}(null) in let final dynamic #t39 = #t37.{core::Set::add}(inf::field5) in #t37;
-  core::Set<inf::C<core::int*>*>* local3f = let final core::Set<inf::C<core::int*>*>* #t40 = col::LinkedHashSet::•<inf::C<core::int*>*>() in let final dynamic #t41 = #t40.{core::Set::add}(null) in let final dynamic #t42 = #t40.{core::Set::add}(inf::field6) in #t40;
-  core::Set<core::int*>* local3g = let final core::Set<core::int*>* #t43 = col::LinkedHashSet::•<core::int*>() in let final dynamic #t44 = #t43.{core::Set::add}(null) in let final dynamic #t45 = #t43.{core::Set::add}(inf::field7) in #t43;
-  core::Set<core::int*>* local3h = let final core::Set<core::int*>* #t46 = col::LinkedHashSet::•<core::int*>() in let final dynamic #t47 = #t46.{core::Set::add}(null) in let final dynamic #t48 = #t46.{core::Set::add}(inf::field8) in #t46;
+  core::List<Null>* local1i = <Null>[null];
+  core::Set<inf::C<dynamic>*>* local2a = block {
+    final core::Set<inf::C<dynamic>*>* #t1 = col::LinkedHashSet::•<inf::C<dynamic>*>();
+    #t1.{core::Set::add}{Invariant}(inf::field1);
+    #t1.{core::Set::add}{Invariant}(null);
+  } =>#t1;
+  core::Set<inf::C<dynamic>*>* local2b = block {
+    final core::Set<inf::C<dynamic>*>* #t2 = col::LinkedHashSet::•<inf::C<dynamic>*>();
+    #t2.{core::Set::add}{Invariant}(inf::field2);
+    #t2.{core::Set::add}{Invariant}(null);
+  } =>#t2;
+  core::Set<inf::C<core::int*>*>* local2c = block {
+    final core::Set<inf::C<core::int*>*>* #t3 = col::LinkedHashSet::•<inf::C<core::int*>*>();
+    #t3.{core::Set::add}{Invariant}(inf::field3);
+    #t3.{core::Set::add}{Invariant}(null);
+  } =>#t3;
+  core::Set<inf::C<core::int*>*>* local2d = block {
+    final core::Set<inf::C<core::int*>*>* #t4 = col::LinkedHashSet::•<inf::C<core::int*>*>();
+    #t4.{core::Set::add}{Invariant}(inf::field4);
+    #t4.{core::Set::add}{Invariant}(null);
+  } =>#t4;
+  core::Set<inf::C<core::int*>*>* local2e = block {
+    final core::Set<inf::C<core::int*>*>* #t5 = col::LinkedHashSet::•<inf::C<core::int*>*>();
+    #t5.{core::Set::add}{Invariant}(inf::field5);
+    #t5.{core::Set::add}{Invariant}(null);
+  } =>#t5;
+  core::Set<inf::C<core::int*>*>* local2f = block {
+    final core::Set<inf::C<core::int*>*>* #t6 = col::LinkedHashSet::•<inf::C<core::int*>*>();
+    #t6.{core::Set::add}{Invariant}(inf::field6);
+    #t6.{core::Set::add}{Invariant}(null);
+  } =>#t6;
+  core::Set<core::int*>* local2g = block {
+    final core::Set<core::int*>* #t7 = col::LinkedHashSet::•<core::int*>();
+    #t7.{core::Set::add}{Invariant}(inf::field7);
+    #t7.{core::Set::add}{Invariant}(null);
+  } =>#t7;
+  core::Set<core::int*>* local2h = block {
+    final core::Set<core::int*>* #t8 = col::LinkedHashSet::•<core::int*>();
+    #t8.{core::Set::add}{Invariant}(inf::field8);
+    #t8.{core::Set::add}{Invariant}(null);
+  } =>#t8;
+  core::Set<inf::C<dynamic>*>* local3a = block {
+    final core::Set<inf::C<dynamic>*>* #t9 = col::LinkedHashSet::•<inf::C<dynamic>*>();
+    #t9.{core::Set::add}{Invariant}(null);
+    #t9.{core::Set::add}{Invariant}(inf::field1);
+  } =>#t9;
+  core::Set<inf::C<dynamic>*>* local3b = block {
+    final core::Set<inf::C<dynamic>*>* #t10 = col::LinkedHashSet::•<inf::C<dynamic>*>();
+    #t10.{core::Set::add}{Invariant}(null);
+    #t10.{core::Set::add}{Invariant}(inf::field2);
+  } =>#t10;
+  core::Set<inf::C<core::int*>*>* local3c = block {
+    final core::Set<inf::C<core::int*>*>* #t11 = col::LinkedHashSet::•<inf::C<core::int*>*>();
+    #t11.{core::Set::add}{Invariant}(null);
+    #t11.{core::Set::add}{Invariant}(inf::field3);
+  } =>#t11;
+  core::Set<inf::C<core::int*>*>* local3d = block {
+    final core::Set<inf::C<core::int*>*>* #t12 = col::LinkedHashSet::•<inf::C<core::int*>*>();
+    #t12.{core::Set::add}{Invariant}(null);
+    #t12.{core::Set::add}{Invariant}(inf::field4);
+  } =>#t12;
+  core::Set<inf::C<core::int*>*>* local3e = block {
+    final core::Set<inf::C<core::int*>*>* #t13 = col::LinkedHashSet::•<inf::C<core::int*>*>();
+    #t13.{core::Set::add}{Invariant}(null);
+    #t13.{core::Set::add}{Invariant}(inf::field5);
+  } =>#t13;
+  core::Set<inf::C<core::int*>*>* local3f = block {
+    final core::Set<inf::C<core::int*>*>* #t14 = col::LinkedHashSet::•<inf::C<core::int*>*>();
+    #t14.{core::Set::add}{Invariant}(null);
+    #t14.{core::Set::add}{Invariant}(inf::field6);
+  } =>#t14;
+  core::Set<core::int*>* local3g = block {
+    final core::Set<core::int*>* #t15 = col::LinkedHashSet::•<core::int*>();
+    #t15.{core::Set::add}{Invariant}(null);
+    #t15.{core::Set::add}{Invariant}(inf::field7);
+  } =>#t15;
+  core::Set<core::int*>* local3h = block {
+    final core::Set<core::int*>* #t16 = col::LinkedHashSet::•<core::int*>();
+    #t16.{core::Set::add}{Invariant}(null);
+    #t16.{core::Set::add}{Invariant}(inf::field8);
+  } =>#t16;
 }
 
 library /*isNonNullableByDefault*/;
@@ -100,21 +164,85 @@
   core::List<inf::C<core::int?>?> local1f = <inf::C<core::int?>?>[inf::field6];
   core::List<core::int> local1g = <core::int>[inf::field7];
   core::List<core::int?> local1h = <core::int?>[inf::field8];
-  core::List<core::Null?> local1i = <core::Null?>[null];
-  core::Set<inf::C<dynamic>?> local2a = let final core::Set<inf::C<dynamic>?> #t49 = col::LinkedHashSet::•<inf::C<dynamic>?>() in let final dynamic #t50 = #t49.{core::Set::add}(inf::field1) in let final dynamic #t51 = #t49.{core::Set::add}(null) in #t49;
-  core::Set<inf::C<dynamic>?> local2b = let final core::Set<inf::C<dynamic>?> #t52 = col::LinkedHashSet::•<inf::C<dynamic>?>() in let final dynamic #t53 = #t52.{core::Set::add}(inf::field2) in let final dynamic #t54 = #t52.{core::Set::add}(null) in #t52;
-  core::Set<inf::C<core::int>?> local2c = let final core::Set<inf::C<core::int>?> #t55 = col::LinkedHashSet::•<inf::C<core::int>?>() in let final dynamic #t56 = #t55.{core::Set::add}(inf::field3) in let final dynamic #t57 = #t55.{core::Set::add}(null) in #t55;
-  core::Set<inf::C<core::int>?> local2d = let final core::Set<inf::C<core::int>?> #t58 = col::LinkedHashSet::•<inf::C<core::int>?>() in let final dynamic #t59 = #t58.{core::Set::add}(inf::field4) in let final dynamic #t60 = #t58.{core::Set::add}(null) in #t58;
-  core::Set<inf::C<core::int?>?> local2e = let final core::Set<inf::C<core::int?>?> #t61 = col::LinkedHashSet::•<inf::C<core::int?>?>() in let final dynamic #t62 = #t61.{core::Set::add}(inf::field5) in let final dynamic #t63 = #t61.{core::Set::add}(null) in #t61;
-  core::Set<inf::C<core::int?>?> local2f = let final core::Set<inf::C<core::int?>?> #t64 = col::LinkedHashSet::•<inf::C<core::int?>?>() in let final dynamic #t65 = #t64.{core::Set::add}(inf::field6) in let final dynamic #t66 = #t64.{core::Set::add}(null) in #t64;
-  core::Set<core::int?> local2g = let final core::Set<core::int?> #t67 = col::LinkedHashSet::•<core::int?>() in let final dynamic #t68 = #t67.{core::Set::add}(inf::field7) in let final dynamic #t69 = #t67.{core::Set::add}(null) in #t67;
-  core::Set<core::int?> local2h = let final core::Set<core::int?> #t70 = col::LinkedHashSet::•<core::int?>() in let final dynamic #t71 = #t70.{core::Set::add}(inf::field8) in let final dynamic #t72 = #t70.{core::Set::add}(null) in #t70;
-  core::Set<inf::C<dynamic>?> local3a = let final core::Set<inf::C<dynamic>?> #t73 = col::LinkedHashSet::•<inf::C<dynamic>?>() in let final dynamic #t74 = #t73.{core::Set::add}(null) in let final dynamic #t75 = #t73.{core::Set::add}(inf::field1) in #t73;
-  core::Set<inf::C<dynamic>?> local3b = let final core::Set<inf::C<dynamic>?> #t76 = col::LinkedHashSet::•<inf::C<dynamic>?>() in let final dynamic #t77 = #t76.{core::Set::add}(null) in let final dynamic #t78 = #t76.{core::Set::add}(inf::field2) in #t76;
-  core::Set<inf::C<core::int>?> local3c = let final core::Set<inf::C<core::int>?> #t79 = col::LinkedHashSet::•<inf::C<core::int>?>() in let final dynamic #t80 = #t79.{core::Set::add}(null) in let final dynamic #t81 = #t79.{core::Set::add}(inf::field3) in #t79;
-  core::Set<inf::C<core::int>?> local3d = let final core::Set<inf::C<core::int>?> #t82 = col::LinkedHashSet::•<inf::C<core::int>?>() in let final dynamic #t83 = #t82.{core::Set::add}(null) in let final dynamic #t84 = #t82.{core::Set::add}(inf::field4) in #t82;
-  core::Set<inf::C<core::int?>?> local3e = let final core::Set<inf::C<core::int?>?> #t85 = col::LinkedHashSet::•<inf::C<core::int?>?>() in let final dynamic #t86 = #t85.{core::Set::add}(null) in let final dynamic #t87 = #t85.{core::Set::add}(inf::field5) in #t85;
-  core::Set<inf::C<core::int?>?> local3f = let final core::Set<inf::C<core::int?>?> #t88 = col::LinkedHashSet::•<inf::C<core::int?>?>() in let final dynamic #t89 = #t88.{core::Set::add}(null) in let final dynamic #t90 = #t88.{core::Set::add}(inf::field6) in #t88;
-  core::Set<core::int?> local3g = let final core::Set<core::int?> #t91 = col::LinkedHashSet::•<core::int?>() in let final dynamic #t92 = #t91.{core::Set::add}(null) in let final dynamic #t93 = #t91.{core::Set::add}(inf::field7) in #t91;
-  core::Set<core::int?> local3h = let final core::Set<core::int?> #t94 = col::LinkedHashSet::•<core::int?>() in let final dynamic #t95 = #t94.{core::Set::add}(null) in let final dynamic #t96 = #t94.{core::Set::add}(inf::field8) in #t94;
+  core::List<Null> local1i = <Null>[null];
+  core::Set<inf::C<dynamic>?> local2a = block {
+    final core::Set<inf::C<dynamic>?> #t17 = col::LinkedHashSet::•<inf::C<dynamic>?>();
+    #t17.{core::Set::add}{Invariant}(inf::field1);
+    #t17.{core::Set::add}{Invariant}(null);
+  } =>#t17;
+  core::Set<inf::C<dynamic>?> local2b = block {
+    final core::Set<inf::C<dynamic>?> #t18 = col::LinkedHashSet::•<inf::C<dynamic>?>();
+    #t18.{core::Set::add}{Invariant}(inf::field2);
+    #t18.{core::Set::add}{Invariant}(null);
+  } =>#t18;
+  core::Set<inf::C<core::int>?> local2c = block {
+    final core::Set<inf::C<core::int>?> #t19 = col::LinkedHashSet::•<inf::C<core::int>?>();
+    #t19.{core::Set::add}{Invariant}(inf::field3);
+    #t19.{core::Set::add}{Invariant}(null);
+  } =>#t19;
+  core::Set<inf::C<core::int>?> local2d = block {
+    final core::Set<inf::C<core::int>?> #t20 = col::LinkedHashSet::•<inf::C<core::int>?>();
+    #t20.{core::Set::add}{Invariant}(inf::field4);
+    #t20.{core::Set::add}{Invariant}(null);
+  } =>#t20;
+  core::Set<inf::C<core::int?>?> local2e = block {
+    final core::Set<inf::C<core::int?>?> #t21 = col::LinkedHashSet::•<inf::C<core::int?>?>();
+    #t21.{core::Set::add}{Invariant}(inf::field5);
+    #t21.{core::Set::add}{Invariant}(null);
+  } =>#t21;
+  core::Set<inf::C<core::int?>?> local2f = block {
+    final core::Set<inf::C<core::int?>?> #t22 = col::LinkedHashSet::•<inf::C<core::int?>?>();
+    #t22.{core::Set::add}{Invariant}(inf::field6);
+    #t22.{core::Set::add}{Invariant}(null);
+  } =>#t22;
+  core::Set<core::int?> local2g = block {
+    final core::Set<core::int?> #t23 = col::LinkedHashSet::•<core::int?>();
+    #t23.{core::Set::add}{Invariant}(inf::field7);
+    #t23.{core::Set::add}{Invariant}(null);
+  } =>#t23;
+  core::Set<core::int?> local2h = block {
+    final core::Set<core::int?> #t24 = col::LinkedHashSet::•<core::int?>();
+    #t24.{core::Set::add}{Invariant}(inf::field8);
+    #t24.{core::Set::add}{Invariant}(null);
+  } =>#t24;
+  core::Set<inf::C<dynamic>?> local3a = block {
+    final core::Set<inf::C<dynamic>?> #t25 = col::LinkedHashSet::•<inf::C<dynamic>?>();
+    #t25.{core::Set::add}{Invariant}(null);
+    #t25.{core::Set::add}{Invariant}(inf::field1);
+  } =>#t25;
+  core::Set<inf::C<dynamic>?> local3b = block {
+    final core::Set<inf::C<dynamic>?> #t26 = col::LinkedHashSet::•<inf::C<dynamic>?>();
+    #t26.{core::Set::add}{Invariant}(null);
+    #t26.{core::Set::add}{Invariant}(inf::field2);
+  } =>#t26;
+  core::Set<inf::C<core::int>?> local3c = block {
+    final core::Set<inf::C<core::int>?> #t27 = col::LinkedHashSet::•<inf::C<core::int>?>();
+    #t27.{core::Set::add}{Invariant}(null);
+    #t27.{core::Set::add}{Invariant}(inf::field3);
+  } =>#t27;
+  core::Set<inf::C<core::int>?> local3d = block {
+    final core::Set<inf::C<core::int>?> #t28 = col::LinkedHashSet::•<inf::C<core::int>?>();
+    #t28.{core::Set::add}{Invariant}(null);
+    #t28.{core::Set::add}{Invariant}(inf::field4);
+  } =>#t28;
+  core::Set<inf::C<core::int?>?> local3e = block {
+    final core::Set<inf::C<core::int?>?> #t29 = col::LinkedHashSet::•<inf::C<core::int?>?>();
+    #t29.{core::Set::add}{Invariant}(null);
+    #t29.{core::Set::add}{Invariant}(inf::field5);
+  } =>#t29;
+  core::Set<inf::C<core::int?>?> local3f = block {
+    final core::Set<inf::C<core::int?>?> #t30 = col::LinkedHashSet::•<inf::C<core::int?>?>();
+    #t30.{core::Set::add}{Invariant}(null);
+    #t30.{core::Set::add}{Invariant}(inf::field6);
+  } =>#t30;
+  core::Set<core::int?> local3g = block {
+    final core::Set<core::int?> #t31 = col::LinkedHashSet::•<core::int?>();
+    #t31.{core::Set::add}{Invariant}(null);
+    #t31.{core::Set::add}{Invariant}(inf::field7);
+  } =>#t31;
+  core::Set<core::int?> local3h = block {
+    final core::Set<core::int?> #t32 = col::LinkedHashSet::•<core::int?>();
+    #t32.{core::Set::add}{Invariant}(null);
+    #t32.{core::Set::add}{Invariant}(inf::field8);
+  } =>#t32;
 }
diff --git a/pkg/front_end/testcases/nnbd_mixed/infer_constraints_from_opt_in.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/infer_constraints_from_opt_in.dart.weak.transformed.expect
index 04c6f0d..267b93e 100644
--- a/pkg/front_end/testcases/nnbd_mixed/infer_constraints_from_opt_in.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/infer_constraints_from_opt_in.dart.weak.transformed.expect
@@ -34,23 +34,87 @@
   core::List<inf::C<core::int*>*>* local1f = <inf::C<core::int*>*>[inf::field6];
   core::List<core::int*>* local1g = <core::int*>[inf::field7];
   core::List<core::int*>* local1h = <core::int*>[inf::field8];
-  core::List<core::Null?>* local1i = <core::Null?>[null];
-  core::Set<inf::C<dynamic>*>* local2a = let final core::Set<inf::C<dynamic>*>* #t1 = new col::_CompactLinkedHashSet::•<inf::C<dynamic>*>() in let final core::bool #t2 = #t1.{core::Set::add}(inf::field1) in let final core::bool #t3 = #t1.{core::Set::add}(null) in #t1;
-  core::Set<inf::C<dynamic>*>* local2b = let final core::Set<inf::C<dynamic>*>* #t4 = new col::_CompactLinkedHashSet::•<inf::C<dynamic>*>() in let final core::bool #t5 = #t4.{core::Set::add}(inf::field2) in let final core::bool #t6 = #t4.{core::Set::add}(null) in #t4;
-  core::Set<inf::C<core::int*>*>* local2c = let final core::Set<inf::C<core::int*>*>* #t7 = new col::_CompactLinkedHashSet::•<inf::C<core::int*>*>() in let final core::bool #t8 = #t7.{core::Set::add}(inf::field3) in let final core::bool #t9 = #t7.{core::Set::add}(null) in #t7;
-  core::Set<inf::C<core::int*>*>* local2d = let final core::Set<inf::C<core::int*>*>* #t10 = new col::_CompactLinkedHashSet::•<inf::C<core::int*>*>() in let final core::bool #t11 = #t10.{core::Set::add}(inf::field4) in let final core::bool #t12 = #t10.{core::Set::add}(null) in #t10;
-  core::Set<inf::C<core::int*>*>* local2e = let final core::Set<inf::C<core::int*>*>* #t13 = new col::_CompactLinkedHashSet::•<inf::C<core::int*>*>() in let final core::bool #t14 = #t13.{core::Set::add}(inf::field5) in let final core::bool #t15 = #t13.{core::Set::add}(null) in #t13;
-  core::Set<inf::C<core::int*>*>* local2f = let final core::Set<inf::C<core::int*>*>* #t16 = new col::_CompactLinkedHashSet::•<inf::C<core::int*>*>() in let final core::bool #t17 = #t16.{core::Set::add}(inf::field6) in let final core::bool #t18 = #t16.{core::Set::add}(null) in #t16;
-  core::Set<core::int*>* local2g = let final core::Set<core::int*>* #t19 = new col::_CompactLinkedHashSet::•<core::int*>() in let final core::bool #t20 = #t19.{core::Set::add}(inf::field7) in let final core::bool #t21 = #t19.{core::Set::add}(null) in #t19;
-  core::Set<core::int*>* local2h = let final core::Set<core::int*>* #t22 = new col::_CompactLinkedHashSet::•<core::int*>() in let final core::bool #t23 = #t22.{core::Set::add}(inf::field8) in let final core::bool #t24 = #t22.{core::Set::add}(null) in #t22;
-  core::Set<inf::C<dynamic>*>* local3a = let final core::Set<inf::C<dynamic>*>* #t25 = new col::_CompactLinkedHashSet::•<inf::C<dynamic>*>() in let final core::bool #t26 = #t25.{core::Set::add}(null) in let final core::bool #t27 = #t25.{core::Set::add}(inf::field1) in #t25;
-  core::Set<inf::C<dynamic>*>* local3b = let final core::Set<inf::C<dynamic>*>* #t28 = new col::_CompactLinkedHashSet::•<inf::C<dynamic>*>() in let final core::bool #t29 = #t28.{core::Set::add}(null) in let final core::bool #t30 = #t28.{core::Set::add}(inf::field2) in #t28;
-  core::Set<inf::C<core::int*>*>* local3c = let final core::Set<inf::C<core::int*>*>* #t31 = new col::_CompactLinkedHashSet::•<inf::C<core::int*>*>() in let final core::bool #t32 = #t31.{core::Set::add}(null) in let final core::bool #t33 = #t31.{core::Set::add}(inf::field3) in #t31;
-  core::Set<inf::C<core::int*>*>* local3d = let final core::Set<inf::C<core::int*>*>* #t34 = new col::_CompactLinkedHashSet::•<inf::C<core::int*>*>() in let final core::bool #t35 = #t34.{core::Set::add}(null) in let final core::bool #t36 = #t34.{core::Set::add}(inf::field4) in #t34;
-  core::Set<inf::C<core::int*>*>* local3e = let final core::Set<inf::C<core::int*>*>* #t37 = new col::_CompactLinkedHashSet::•<inf::C<core::int*>*>() in let final core::bool #t38 = #t37.{core::Set::add}(null) in let final core::bool #t39 = #t37.{core::Set::add}(inf::field5) in #t37;
-  core::Set<inf::C<core::int*>*>* local3f = let final core::Set<inf::C<core::int*>*>* #t40 = new col::_CompactLinkedHashSet::•<inf::C<core::int*>*>() in let final core::bool #t41 = #t40.{core::Set::add}(null) in let final core::bool #t42 = #t40.{core::Set::add}(inf::field6) in #t40;
-  core::Set<core::int*>* local3g = let final core::Set<core::int*>* #t43 = new col::_CompactLinkedHashSet::•<core::int*>() in let final core::bool #t44 = #t43.{core::Set::add}(null) in let final core::bool #t45 = #t43.{core::Set::add}(inf::field7) in #t43;
-  core::Set<core::int*>* local3h = let final core::Set<core::int*>* #t46 = new col::_CompactLinkedHashSet::•<core::int*>() in let final core::bool #t47 = #t46.{core::Set::add}(null) in let final core::bool #t48 = #t46.{core::Set::add}(inf::field8) in #t46;
+  core::List<Null>* local1i = <Null>[null];
+  core::Set<inf::C<dynamic>*>* local2a = block {
+    final core::Set<inf::C<dynamic>*>* #t1 = new col::_CompactLinkedHashSet::•<inf::C<dynamic>*>();
+    #t1.{core::Set::add}{Invariant}(inf::field1);
+    #t1.{core::Set::add}{Invariant}(null);
+  } =>#t1;
+  core::Set<inf::C<dynamic>*>* local2b = block {
+    final core::Set<inf::C<dynamic>*>* #t2 = new col::_CompactLinkedHashSet::•<inf::C<dynamic>*>();
+    #t2.{core::Set::add}{Invariant}(inf::field2);
+    #t2.{core::Set::add}{Invariant}(null);
+  } =>#t2;
+  core::Set<inf::C<core::int*>*>* local2c = block {
+    final core::Set<inf::C<core::int*>*>* #t3 = new col::_CompactLinkedHashSet::•<inf::C<core::int*>*>();
+    #t3.{core::Set::add}{Invariant}(inf::field3);
+    #t3.{core::Set::add}{Invariant}(null);
+  } =>#t3;
+  core::Set<inf::C<core::int*>*>* local2d = block {
+    final core::Set<inf::C<core::int*>*>* #t4 = new col::_CompactLinkedHashSet::•<inf::C<core::int*>*>();
+    #t4.{core::Set::add}{Invariant}(inf::field4);
+    #t4.{core::Set::add}{Invariant}(null);
+  } =>#t4;
+  core::Set<inf::C<core::int*>*>* local2e = block {
+    final core::Set<inf::C<core::int*>*>* #t5 = new col::_CompactLinkedHashSet::•<inf::C<core::int*>*>();
+    #t5.{core::Set::add}{Invariant}(inf::field5);
+    #t5.{core::Set::add}{Invariant}(null);
+  } =>#t5;
+  core::Set<inf::C<core::int*>*>* local2f = block {
+    final core::Set<inf::C<core::int*>*>* #t6 = new col::_CompactLinkedHashSet::•<inf::C<core::int*>*>();
+    #t6.{core::Set::add}{Invariant}(inf::field6);
+    #t6.{core::Set::add}{Invariant}(null);
+  } =>#t6;
+  core::Set<core::int*>* local2g = block {
+    final core::Set<core::int*>* #t7 = new col::_CompactLinkedHashSet::•<core::int*>();
+    #t7.{core::Set::add}{Invariant}(inf::field7);
+    #t7.{core::Set::add}{Invariant}(null);
+  } =>#t7;
+  core::Set<core::int*>* local2h = block {
+    final core::Set<core::int*>* #t8 = new col::_CompactLinkedHashSet::•<core::int*>();
+    #t8.{core::Set::add}{Invariant}(inf::field8);
+    #t8.{core::Set::add}{Invariant}(null);
+  } =>#t8;
+  core::Set<inf::C<dynamic>*>* local3a = block {
+    final core::Set<inf::C<dynamic>*>* #t9 = new col::_CompactLinkedHashSet::•<inf::C<dynamic>*>();
+    #t9.{core::Set::add}{Invariant}(null);
+    #t9.{core::Set::add}{Invariant}(inf::field1);
+  } =>#t9;
+  core::Set<inf::C<dynamic>*>* local3b = block {
+    final core::Set<inf::C<dynamic>*>* #t10 = new col::_CompactLinkedHashSet::•<inf::C<dynamic>*>();
+    #t10.{core::Set::add}{Invariant}(null);
+    #t10.{core::Set::add}{Invariant}(inf::field2);
+  } =>#t10;
+  core::Set<inf::C<core::int*>*>* local3c = block {
+    final core::Set<inf::C<core::int*>*>* #t11 = new col::_CompactLinkedHashSet::•<inf::C<core::int*>*>();
+    #t11.{core::Set::add}{Invariant}(null);
+    #t11.{core::Set::add}{Invariant}(inf::field3);
+  } =>#t11;
+  core::Set<inf::C<core::int*>*>* local3d = block {
+    final core::Set<inf::C<core::int*>*>* #t12 = new col::_CompactLinkedHashSet::•<inf::C<core::int*>*>();
+    #t12.{core::Set::add}{Invariant}(null);
+    #t12.{core::Set::add}{Invariant}(inf::field4);
+  } =>#t12;
+  core::Set<inf::C<core::int*>*>* local3e = block {
+    final core::Set<inf::C<core::int*>*>* #t13 = new col::_CompactLinkedHashSet::•<inf::C<core::int*>*>();
+    #t13.{core::Set::add}{Invariant}(null);
+    #t13.{core::Set::add}{Invariant}(inf::field5);
+  } =>#t13;
+  core::Set<inf::C<core::int*>*>* local3f = block {
+    final core::Set<inf::C<core::int*>*>* #t14 = new col::_CompactLinkedHashSet::•<inf::C<core::int*>*>();
+    #t14.{core::Set::add}{Invariant}(null);
+    #t14.{core::Set::add}{Invariant}(inf::field6);
+  } =>#t14;
+  core::Set<core::int*>* local3g = block {
+    final core::Set<core::int*>* #t15 = new col::_CompactLinkedHashSet::•<core::int*>();
+    #t15.{core::Set::add}{Invariant}(null);
+    #t15.{core::Set::add}{Invariant}(inf::field7);
+  } =>#t15;
+  core::Set<core::int*>* local3h = block {
+    final core::Set<core::int*>* #t16 = new col::_CompactLinkedHashSet::•<core::int*>();
+    #t16.{core::Set::add}{Invariant}(null);
+    #t16.{core::Set::add}{Invariant}(inf::field8);
+  } =>#t16;
 }
 
 library /*isNonNullableByDefault*/;
@@ -100,21 +164,85 @@
   core::List<inf::C<core::int?>?> local1f = <inf::C<core::int?>?>[inf::field6];
   core::List<core::int> local1g = <core::int>[inf::field7];
   core::List<core::int?> local1h = <core::int?>[inf::field8];
-  core::List<core::Null?> local1i = <core::Null?>[null];
-  core::Set<inf::C<dynamic>?> local2a = let final core::Set<inf::C<dynamic>?> #t49 = new col::_CompactLinkedHashSet::•<inf::C<dynamic>?>() in let final core::bool #t50 = #t49.{core::Set::add}(inf::field1) in let final core::bool #t51 = #t49.{core::Set::add}(null) in #t49;
-  core::Set<inf::C<dynamic>?> local2b = let final core::Set<inf::C<dynamic>?> #t52 = new col::_CompactLinkedHashSet::•<inf::C<dynamic>?>() in let final core::bool #t53 = #t52.{core::Set::add}(inf::field2) in let final core::bool #t54 = #t52.{core::Set::add}(null) in #t52;
-  core::Set<inf::C<core::int>?> local2c = let final core::Set<inf::C<core::int>?> #t55 = new col::_CompactLinkedHashSet::•<inf::C<core::int>?>() in let final core::bool #t56 = #t55.{core::Set::add}(inf::field3) in let final core::bool #t57 = #t55.{core::Set::add}(null) in #t55;
-  core::Set<inf::C<core::int>?> local2d = let final core::Set<inf::C<core::int>?> #t58 = new col::_CompactLinkedHashSet::•<inf::C<core::int>?>() in let final core::bool #t59 = #t58.{core::Set::add}(inf::field4) in let final core::bool #t60 = #t58.{core::Set::add}(null) in #t58;
-  core::Set<inf::C<core::int?>?> local2e = let final core::Set<inf::C<core::int?>?> #t61 = new col::_CompactLinkedHashSet::•<inf::C<core::int?>?>() in let final core::bool #t62 = #t61.{core::Set::add}(inf::field5) in let final core::bool #t63 = #t61.{core::Set::add}(null) in #t61;
-  core::Set<inf::C<core::int?>?> local2f = let final core::Set<inf::C<core::int?>?> #t64 = new col::_CompactLinkedHashSet::•<inf::C<core::int?>?>() in let final core::bool #t65 = #t64.{core::Set::add}(inf::field6) in let final core::bool #t66 = #t64.{core::Set::add}(null) in #t64;
-  core::Set<core::int?> local2g = let final core::Set<core::int?> #t67 = new col::_CompactLinkedHashSet::•<core::int?>() in let final core::bool #t68 = #t67.{core::Set::add}(inf::field7) in let final core::bool #t69 = #t67.{core::Set::add}(null) in #t67;
-  core::Set<core::int?> local2h = let final core::Set<core::int?> #t70 = new col::_CompactLinkedHashSet::•<core::int?>() in let final core::bool #t71 = #t70.{core::Set::add}(inf::field8) in let final core::bool #t72 = #t70.{core::Set::add}(null) in #t70;
-  core::Set<inf::C<dynamic>?> local3a = let final core::Set<inf::C<dynamic>?> #t73 = new col::_CompactLinkedHashSet::•<inf::C<dynamic>?>() in let final core::bool #t74 = #t73.{core::Set::add}(null) in let final core::bool #t75 = #t73.{core::Set::add}(inf::field1) in #t73;
-  core::Set<inf::C<dynamic>?> local3b = let final core::Set<inf::C<dynamic>?> #t76 = new col::_CompactLinkedHashSet::•<inf::C<dynamic>?>() in let final core::bool #t77 = #t76.{core::Set::add}(null) in let final core::bool #t78 = #t76.{core::Set::add}(inf::field2) in #t76;
-  core::Set<inf::C<core::int>?> local3c = let final core::Set<inf::C<core::int>?> #t79 = new col::_CompactLinkedHashSet::•<inf::C<core::int>?>() in let final core::bool #t80 = #t79.{core::Set::add}(null) in let final core::bool #t81 = #t79.{core::Set::add}(inf::field3) in #t79;
-  core::Set<inf::C<core::int>?> local3d = let final core::Set<inf::C<core::int>?> #t82 = new col::_CompactLinkedHashSet::•<inf::C<core::int>?>() in let final core::bool #t83 = #t82.{core::Set::add}(null) in let final core::bool #t84 = #t82.{core::Set::add}(inf::field4) in #t82;
-  core::Set<inf::C<core::int?>?> local3e = let final core::Set<inf::C<core::int?>?> #t85 = new col::_CompactLinkedHashSet::•<inf::C<core::int?>?>() in let final core::bool #t86 = #t85.{core::Set::add}(null) in let final core::bool #t87 = #t85.{core::Set::add}(inf::field5) in #t85;
-  core::Set<inf::C<core::int?>?> local3f = let final core::Set<inf::C<core::int?>?> #t88 = new col::_CompactLinkedHashSet::•<inf::C<core::int?>?>() in let final core::bool #t89 = #t88.{core::Set::add}(null) in let final core::bool #t90 = #t88.{core::Set::add}(inf::field6) in #t88;
-  core::Set<core::int?> local3g = let final core::Set<core::int?> #t91 = new col::_CompactLinkedHashSet::•<core::int?>() in let final core::bool #t92 = #t91.{core::Set::add}(null) in let final core::bool #t93 = #t91.{core::Set::add}(inf::field7) in #t91;
-  core::Set<core::int?> local3h = let final core::Set<core::int?> #t94 = new col::_CompactLinkedHashSet::•<core::int?>() in let final core::bool #t95 = #t94.{core::Set::add}(null) in let final core::bool #t96 = #t94.{core::Set::add}(inf::field8) in #t94;
+  core::List<Null> local1i = <Null>[null];
+  core::Set<inf::C<dynamic>?> local2a = block {
+    final core::Set<inf::C<dynamic>?> #t17 = new col::_CompactLinkedHashSet::•<inf::C<dynamic>?>();
+    #t17.{core::Set::add}{Invariant}(inf::field1);
+    #t17.{core::Set::add}{Invariant}(null);
+  } =>#t17;
+  core::Set<inf::C<dynamic>?> local2b = block {
+    final core::Set<inf::C<dynamic>?> #t18 = new col::_CompactLinkedHashSet::•<inf::C<dynamic>?>();
+    #t18.{core::Set::add}{Invariant}(inf::field2);
+    #t18.{core::Set::add}{Invariant}(null);
+  } =>#t18;
+  core::Set<inf::C<core::int>?> local2c = block {
+    final core::Set<inf::C<core::int>?> #t19 = new col::_CompactLinkedHashSet::•<inf::C<core::int>?>();
+    #t19.{core::Set::add}{Invariant}(inf::field3);
+    #t19.{core::Set::add}{Invariant}(null);
+  } =>#t19;
+  core::Set<inf::C<core::int>?> local2d = block {
+    final core::Set<inf::C<core::int>?> #t20 = new col::_CompactLinkedHashSet::•<inf::C<core::int>?>();
+    #t20.{core::Set::add}{Invariant}(inf::field4);
+    #t20.{core::Set::add}{Invariant}(null);
+  } =>#t20;
+  core::Set<inf::C<core::int?>?> local2e = block {
+    final core::Set<inf::C<core::int?>?> #t21 = new col::_CompactLinkedHashSet::•<inf::C<core::int?>?>();
+    #t21.{core::Set::add}{Invariant}(inf::field5);
+    #t21.{core::Set::add}{Invariant}(null);
+  } =>#t21;
+  core::Set<inf::C<core::int?>?> local2f = block {
+    final core::Set<inf::C<core::int?>?> #t22 = new col::_CompactLinkedHashSet::•<inf::C<core::int?>?>();
+    #t22.{core::Set::add}{Invariant}(inf::field6);
+    #t22.{core::Set::add}{Invariant}(null);
+  } =>#t22;
+  core::Set<core::int?> local2g = block {
+    final core::Set<core::int?> #t23 = new col::_CompactLinkedHashSet::•<core::int?>();
+    #t23.{core::Set::add}{Invariant}(inf::field7);
+    #t23.{core::Set::add}{Invariant}(null);
+  } =>#t23;
+  core::Set<core::int?> local2h = block {
+    final core::Set<core::int?> #t24 = new col::_CompactLinkedHashSet::•<core::int?>();
+    #t24.{core::Set::add}{Invariant}(inf::field8);
+    #t24.{core::Set::add}{Invariant}(null);
+  } =>#t24;
+  core::Set<inf::C<dynamic>?> local3a = block {
+    final core::Set<inf::C<dynamic>?> #t25 = new col::_CompactLinkedHashSet::•<inf::C<dynamic>?>();
+    #t25.{core::Set::add}{Invariant}(null);
+    #t25.{core::Set::add}{Invariant}(inf::field1);
+  } =>#t25;
+  core::Set<inf::C<dynamic>?> local3b = block {
+    final core::Set<inf::C<dynamic>?> #t26 = new col::_CompactLinkedHashSet::•<inf::C<dynamic>?>();
+    #t26.{core::Set::add}{Invariant}(null);
+    #t26.{core::Set::add}{Invariant}(inf::field2);
+  } =>#t26;
+  core::Set<inf::C<core::int>?> local3c = block {
+    final core::Set<inf::C<core::int>?> #t27 = new col::_CompactLinkedHashSet::•<inf::C<core::int>?>();
+    #t27.{core::Set::add}{Invariant}(null);
+    #t27.{core::Set::add}{Invariant}(inf::field3);
+  } =>#t27;
+  core::Set<inf::C<core::int>?> local3d = block {
+    final core::Set<inf::C<core::int>?> #t28 = new col::_CompactLinkedHashSet::•<inf::C<core::int>?>();
+    #t28.{core::Set::add}{Invariant}(null);
+    #t28.{core::Set::add}{Invariant}(inf::field4);
+  } =>#t28;
+  core::Set<inf::C<core::int?>?> local3e = block {
+    final core::Set<inf::C<core::int?>?> #t29 = new col::_CompactLinkedHashSet::•<inf::C<core::int?>?>();
+    #t29.{core::Set::add}{Invariant}(null);
+    #t29.{core::Set::add}{Invariant}(inf::field5);
+  } =>#t29;
+  core::Set<inf::C<core::int?>?> local3f = block {
+    final core::Set<inf::C<core::int?>?> #t30 = new col::_CompactLinkedHashSet::•<inf::C<core::int?>?>();
+    #t30.{core::Set::add}{Invariant}(null);
+    #t30.{core::Set::add}{Invariant}(inf::field6);
+  } =>#t30;
+  core::Set<core::int?> local3g = block {
+    final core::Set<core::int?> #t31 = new col::_CompactLinkedHashSet::•<core::int?>();
+    #t31.{core::Set::add}{Invariant}(null);
+    #t31.{core::Set::add}{Invariant}(inf::field7);
+  } =>#t31;
+  core::Set<core::int?> local3h = block {
+    final core::Set<core::int?> #t32 = new col::_CompactLinkedHashSet::•<core::int?>();
+    #t32.{core::Set::add}{Invariant}(null);
+    #t32.{core::Set::add}{Invariant}(inf::field8);
+  } =>#t32;
 }
diff --git a/pkg/front_end/testcases/nnbd_mixed/inheritance_from_opt_out.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/inheritance_from_opt_out.dart.weak.expect
index 5a93c679..9ed16b6 100644
--- a/pkg/front_end/testcases/nnbd_mixed/inheritance_from_opt_out.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/inheritance_from_opt_out.dart.weak.expect
@@ -34,13 +34,13 @@
   synthetic constructor •() → self::Class4b
     : super core::Object::•()
     ;
-  abstract forwarding-stub operator ==(dynamic other) → core::bool*;
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
 }
 class Class4c extends core::Object implements inh::GenericInterface<core::num?> {
   synthetic constructor •() → self::Class4c
     : super core::Object::•()
     ;
-  abstract forwarding-stub operator ==(dynamic other) → core::bool*;
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
 }
 class Class4d extends inh::LegacyClass4 implements inh::GenericInterface<core::num> {
   synthetic constructor •() → self::Class4d
diff --git a/pkg/front_end/testcases/nnbd_mixed/inheritance_from_opt_out.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/inheritance_from_opt_out.dart.weak.transformed.expect
index 0421e5b..0bc6430 100644
--- a/pkg/front_end/testcases/nnbd_mixed/inheritance_from_opt_out.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/inheritance_from_opt_out.dart.weak.transformed.expect
@@ -34,13 +34,13 @@
   synthetic constructor •() → self::Class4b
     : super core::Object::•()
     ;
-  abstract forwarding-stub operator ==(dynamic other) → core::bool*;
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
 }
 class Class4c extends core::Object implements inh::GenericInterface<core::num?> {
   synthetic constructor •() → self::Class4c
     : super core::Object::•()
     ;
-  abstract forwarding-stub operator ==(dynamic other) → core::bool*;
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
 }
 class Class4d extends inh::LegacyClass4 implements inh::GenericInterface<core::num> {
   synthetic constructor •() → self::Class4d
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue40512/issue40512.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/issue40512/issue40512.dart.weak.expect
index 0b53eb7..ad3788d 100644
--- a/pkg/front_end/testcases/nnbd_mixed/issue40512/issue40512.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/issue40512/issue40512.dart.weak.expect
@@ -14,13 +14,13 @@
   const synthetic constructor •() → self::_C&Object&A&B*
     : super self::_C&Object&A::•()
     ;
-  abstract forwarding-stub method toString({core::String* s = #C1}) → core::String*;
+  abstract member-signature method toString({core::String* s = #C1}) → core::String*; -> baz2::A::toString
 }
 class C extends self::_C&Object&A&B {
   synthetic constructor •() → self::C*
     : super self::_C&Object&A&B::•()
     ;
-  abstract forwarding-stub method toString({core::String* s = #C1}) → core::String*;
+  abstract member-signature method toString({core::String* s = #C1}) → core::String*; -> baz2::A::toString
 }
 static method main() → void {
   core::print(new baz2::B::•());
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue40512/issue40512.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/issue40512/issue40512.dart.weak.transformed.expect
index a8728ca..0a99e51 100644
--- a/pkg/front_end/testcases/nnbd_mixed/issue40512/issue40512.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/issue40512/issue40512.dart.weak.transformed.expect
@@ -25,7 +25,7 @@
   const synthetic constructor •() → self::_C&Object&A&B*
     : super self::_C&Object&A::•()
     ;
-  abstract forwarding-stub method toString({core::String* s = #C1}) → core::String*;
+  abstract member-signature method toString({core::String* s = #C1}) → core::String*; -> baz2::A::toString
   abstract member-signature get /* from org-dartlang-testcase:///issue40512_lib.dart */ _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method /* from org-dartlang-testcase:///issue40512_lib.dart */ _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method /* from org-dartlang-testcase:///issue40512_lib.dart */ _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -40,7 +40,7 @@
   synthetic constructor •() → self::C*
     : super self::_C&Object&A&B::•()
     ;
-  abstract forwarding-stub method toString({core::String* s = #C1}) → core::String*;
+  abstract member-signature method toString({core::String* s = #C1}) → core::String*; -> baz2::A::toString
 }
 static method main() → void {
   core::print(new baz2::B::•());
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue41180.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/issue41180.dart.weak.expect
index 1a52e64..615c4e4 100644
--- a/pkg/front_end/testcases/nnbd_mixed/issue41180.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/issue41180.dart.weak.expect
@@ -10,7 +10,7 @@
     : super core::Object::•()
     ;
   method method() → iss::C<self::D::Y*>*
-    return new iss::C::•<self::D::Y*>(() → core::Null? => null);
+    return new iss::C::•<self::D::Y*>(() → Null => null);
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -23,13 +23,13 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 static method main() → void {
-  iss::foo(() → core::Null? => null);
+  iss::foo(() → Null => null);
   iss::bar = () → iss::Map<core::String*, core::String*>* => null;
   new self::D::•<core::int*>().{self::D::method}();
   self::findKey(new iss::Map::•<core::String*, core::String*>("foo", "bar"), "bar");
 }
 static method findKey(iss::Map<core::String*, dynamic>* m, dynamic search) → void {
-  core::print(let final core::MapEntry<core::String*, dynamic>* #t1 = m.{iss::Map::entries}.{iss::Iterable::singleWhere}((core::MapEntry<core::String*, dynamic>* entry) → core::bool* => entry.{core::MapEntry::value}.{core::Object::==}(search), orElse: () → core::Null? => null) in #t1.{core::Object::==}(null) ?{core::String*} null : #t1.{core::MapEntry::key});
+  core::print(let final core::MapEntry<core::String*, dynamic>* #t1 = m.{iss::Map::entries}.{iss::Iterable::singleWhere}((core::MapEntry<core::String*, dynamic>* entry) → core::bool* => entry.{core::MapEntry::value}.{core::Object::==}(search), orElse: () → Null => null) in #t1.{core::Object::==}(null) ?{core::String*} null : #t1.{core::MapEntry::key});
 }
 
 library /*isNonNullableByDefault*/;
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue41180.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/issue41180.dart.weak.transformed.expect
index 1a52e64..615c4e4 100644
--- a/pkg/front_end/testcases/nnbd_mixed/issue41180.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/issue41180.dart.weak.transformed.expect
@@ -10,7 +10,7 @@
     : super core::Object::•()
     ;
   method method() → iss::C<self::D::Y*>*
-    return new iss::C::•<self::D::Y*>(() → core::Null? => null);
+    return new iss::C::•<self::D::Y*>(() → Null => null);
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -23,13 +23,13 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 static method main() → void {
-  iss::foo(() → core::Null? => null);
+  iss::foo(() → Null => null);
   iss::bar = () → iss::Map<core::String*, core::String*>* => null;
   new self::D::•<core::int*>().{self::D::method}();
   self::findKey(new iss::Map::•<core::String*, core::String*>("foo", "bar"), "bar");
 }
 static method findKey(iss::Map<core::String*, dynamic>* m, dynamic search) → void {
-  core::print(let final core::MapEntry<core::String*, dynamic>* #t1 = m.{iss::Map::entries}.{iss::Iterable::singleWhere}((core::MapEntry<core::String*, dynamic>* entry) → core::bool* => entry.{core::MapEntry::value}.{core::Object::==}(search), orElse: () → core::Null? => null) in #t1.{core::Object::==}(null) ?{core::String*} null : #t1.{core::MapEntry::key});
+  core::print(let final core::MapEntry<core::String*, dynamic>* #t1 = m.{iss::Map::entries}.{iss::Iterable::singleWhere}((core::MapEntry<core::String*, dynamic>* entry) → core::bool* => entry.{core::MapEntry::value}.{core::Object::==}(search), orElse: () → Null => null) in #t1.{core::Object::==}(null) ?{core::String*} null : #t1.{core::MapEntry::key});
 }
 
 library /*isNonNullableByDefault*/;
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue41210a/issue41210.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/issue41210a/issue41210.dart.weak.expect
index 51f1ffe..bbc1cb2 100644
--- a/pkg/front_end/testcases/nnbd_mixed/issue41210a/issue41210.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/issue41210a/issue41210.dart.weak.expect
@@ -14,13 +14,13 @@
   const synthetic constructor •() → self::_C&Object&A&B*
     : super self::_C&Object&A::•()
     ;
-  abstract forwarding-stub method method({core::String* s = #C1}) → core::String*;
+  abstract member-signature method method({core::String* s = #C1}) → core::String*; -> iss::A::method
 }
 class C extends self::_C&Object&A&B {
   synthetic constructor •() → self::C*
     : super self::_C&Object&A&B::•()
     ;
-  abstract forwarding-stub method method({core::String* s = #C1}) → core::String*;
+  abstract member-signature method method({core::String* s = #C1}) → core::String*; -> iss::A::method
 }
 static method main() → dynamic {
   core::print(new self::C::•().{self::C::method}());
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue41210a/issue41210.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/issue41210a/issue41210.dart.weak.transformed.expect
index 9306da9..ee21372 100644
--- a/pkg/front_end/testcases/nnbd_mixed/issue41210a/issue41210.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/issue41210a/issue41210.dart.weak.transformed.expect
@@ -26,7 +26,7 @@
   const synthetic constructor •() → self::_C&Object&A&B*
     : super self::_C&Object&A::•()
     ;
-  abstract forwarding-stub method method({core::String* s = #C1}) → core::String*;
+  abstract member-signature method method({core::String* s = #C1}) → core::String*; -> iss::A::method
   abstract member-signature get /* from org-dartlang-testcase:///issue41210_lib1.dart */ _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method /* from org-dartlang-testcase:///issue41210_lib1.dart */ _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method /* from org-dartlang-testcase:///issue41210_lib1.dart */ _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -42,7 +42,7 @@
   synthetic constructor •() → self::C*
     : super self::_C&Object&A&B::•()
     ;
-  abstract forwarding-stub method method({core::String* s = #C1}) → core::String*;
+  abstract member-signature method method({core::String* s = #C1}) → core::String*; -> iss::A::method
 }
 static method main() → dynamic {
   core::print(new self::C::•().{self::C::method}());
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue41435.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/issue41435.dart.weak.expect
index c941a64..bcfdbf4 100644
--- a/pkg/front_end/testcases/nnbd_mixed/issue41435.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/issue41435.dart.weak.expect
@@ -1,18 +1,17 @@
 library;
 import self as self;
-import "dart:core" as core;
 import "issue41435_lib.dart" as iss;
 
 import "org-dartlang-testcase:///issue41435_lib.dart";
 
 static method main() → void {
-  core::Null? nil;
+  Null nil;
   iss::x = null;
   iss::x = nil;
   iss::takesNever(null);
   iss::takesNever(nil);
   iss::takesTakesNull(#C1);
-  iss::f = (core::Null? x) → core::Null? {};
+  iss::f = (Null x) → Null {};
 }
 
 library /*isNonNullableByDefault*/;
@@ -20,9 +19,9 @@
 import "dart:core" as core;
 
 static field Never x = throw "Unreachable";
-static field (core::Null?) → void f = (core::Object? n) → core::Null? {};
+static field (Null) → void f = (core::Object? n) → void {};
 static method takesNever(Never x) → void {}
-static method takesTakesNull((core::Null?) → void f) → void {}
+static method takesTakesNull((Null) → void f) → void {}
 
 constants  {
   #C1 = tearoff iss::takesNever
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue41435.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/issue41435.dart.weak.transformed.expect
index c941a64..bcfdbf4 100644
--- a/pkg/front_end/testcases/nnbd_mixed/issue41435.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/issue41435.dart.weak.transformed.expect
@@ -1,18 +1,17 @@
 library;
 import self as self;
-import "dart:core" as core;
 import "issue41435_lib.dart" as iss;
 
 import "org-dartlang-testcase:///issue41435_lib.dart";
 
 static method main() → void {
-  core::Null? nil;
+  Null nil;
   iss::x = null;
   iss::x = nil;
   iss::takesNever(null);
   iss::takesNever(nil);
   iss::takesTakesNull(#C1);
-  iss::f = (core::Null? x) → core::Null? {};
+  iss::f = (Null x) → Null {};
 }
 
 library /*isNonNullableByDefault*/;
@@ -20,9 +19,9 @@
 import "dart:core" as core;
 
 static field Never x = throw "Unreachable";
-static field (core::Null?) → void f = (core::Object? n) → core::Null? {};
+static field (Null) → void f = (core::Object? n) → void {};
 static method takesNever(Never x) → void {}
-static method takesTakesNull((core::Null?) → void f) → void {}
+static method takesTakesNull((Null) → void f) → void {}
 
 constants  {
   #C1 = tearoff iss::takesNever
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue41498.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/issue41498.dart.weak.expect
index e78db51..280af56 100644
--- a/pkg/front_end/testcases/nnbd_mixed/issue41498.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/issue41498.dart.weak.expect
@@ -45,7 +45,7 @@
   (let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/issue41498.dart:24:3: Error: Non-nullable variable 'f' must be assigned before it can be used.
   f.toString(); // error
   ^" in f).{core::Object::toString}();
-  core::Function foo = () → core::Null? {
+  core::Function foo = () → Null {
     () → void f;
     (let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/issue41498.dart:29:5: Error: Non-nullable variable 'f' must be assigned before it can be used.
     f.toString(); // error
@@ -87,7 +87,7 @@
 static method test() → dynamic {
   () →* void f;
   f.{core::Object::toString}();
-  core::Function* foo = () → core::Null? {
+  core::Function* foo = () → Null {
     () →* void f;
     f.{core::Object::toString}();
   };
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue41498.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/issue41498.dart.weak.transformed.expect
index e78db51..280af56 100644
--- a/pkg/front_end/testcases/nnbd_mixed/issue41498.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/issue41498.dart.weak.transformed.expect
@@ -45,7 +45,7 @@
   (let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/issue41498.dart:24:3: Error: Non-nullable variable 'f' must be assigned before it can be used.
   f.toString(); // error
   ^" in f).{core::Object::toString}();
-  core::Function foo = () → core::Null? {
+  core::Function foo = () → Null {
     () → void f;
     (let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/issue41498.dart:29:5: Error: Non-nullable variable 'f' must be assigned before it can be used.
     f.toString(); // error
@@ -87,7 +87,7 @@
 static method test() → dynamic {
   () →* void f;
   f.{core::Object::toString}();
-  core::Function* foo = () → core::Null? {
+  core::Function* foo = () → Null {
     () →* void f;
     f.{core::Object::toString}();
   };
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue41498b.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/issue41498b.dart.weak.expect
index aaa6b94..a230610b 100644
--- a/pkg/front_end/testcases/nnbd_mixed/issue41498b.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/issue41498b.dart.weak.expect
@@ -32,7 +32,7 @@
 static method test() → dynamic {
   () →* void f;
   f.{core::Object::toString}();
-  core::Function* foo = () → core::Null? {
+  core::Function* foo = () → Null {
     () →* void f;
     f.{core::Object::toString}();
   };
@@ -90,7 +90,7 @@
   (let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/issue41498b_lib.dart:24:3: Error: Non-nullable variable 'f' must be assigned before it can be used.
   f.toString(); // error
   ^" in f).{core::Object::toString}();
-  core::Function foo = () → core::Null? {
+  core::Function foo = () → Null {
     () → void f;
     (let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/issue41498b_lib.dart:29:5: Error: Non-nullable variable 'f' must be assigned before it can be used.
     f.toString(); // error
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue41498b.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/issue41498b.dart.weak.transformed.expect
index aaa6b94..a230610b 100644
--- a/pkg/front_end/testcases/nnbd_mixed/issue41498b.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/issue41498b.dart.weak.transformed.expect
@@ -32,7 +32,7 @@
 static method test() → dynamic {
   () →* void f;
   f.{core::Object::toString}();
-  core::Function* foo = () → core::Null? {
+  core::Function* foo = () → Null {
     () →* void f;
     f.{core::Object::toString}();
   };
@@ -90,7 +90,7 @@
   (let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/issue41498b_lib.dart:24:3: Error: Non-nullable variable 'f' must be assigned before it can be used.
   f.toString(); // error
   ^" in f).{core::Object::toString}();
-  core::Function foo = () → core::Null? {
+  core::Function foo = () → Null {
     () → void f;
     (let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/issue41498b_lib.dart:29:5: Error: Non-nullable variable 'f' must be assigned before it can be used.
     f.toString(); // error
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue41602.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/issue41602.dart.weak.transformed.expect
index 64235dc..ee6d621 100644
--- a/pkg/front_end/testcases/nnbd_mixed/issue41602.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/issue41602.dart.weak.transformed.expect
@@ -5,7 +5,8 @@
 import "dart:_internal" as _in;
 
 static method returnFutureOfVoid() → asy::Future<void>* /* originally async */ {
-  final asy::_AsyncAwaitCompleter<void>* :async_completer = new asy::_AsyncAwaitCompleter::•<void>();
+  final asy::_Future<void>* :async_future = new asy::_Future::•<void>();
+  core::bool* :is_sync = false;
   FutureOr<void>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -16,21 +17,23 @@
     try {
       #L1:
       {}
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method returnVoid() → void {}
 static method returnVoidAsync() → void /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic>* :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -41,20 +44,22 @@
     try {
       #L2:
       {}
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method main() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic>* :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -73,15 +78,16 @@
         [yield] let dynamic #t3 = asy::_awaitHelper(self::returnVoidAsync(), :async_op_then, :async_op_error, :async_op) in null;
         _in::unsafeCast<void>(:result);
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue41657.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/issue41657.dart.weak.expect
index 06afa9c..6654a73 100644
--- a/pkg/front_end/testcases/nnbd_mixed/issue41657.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/issue41657.dart.weak.expect
@@ -22,7 +22,7 @@
 }
 
 constants  {
-  #C1 = <core::Null?>[]
+  #C1 = <Null>[]
   #C2 = true
   #C3 = <core::int*>[]
 }
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue41657.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/issue41657.dart.weak.transformed.expect
index a19de51..9a8aafd 100644
--- a/pkg/front_end/testcases/nnbd_mixed/issue41657.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/issue41657.dart.weak.transformed.expect
@@ -22,7 +22,7 @@
 }
 
 constants  {
-  #C1 = <core::Null?>[]
+  #C1 = <Null>[]
   #C2 = true
   #C3 = <core::int*>[]
 }
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue42181.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/issue42181.dart.weak.expect
index 6cfbab4..076de4e 100644
--- a/pkg/front_end/testcases/nnbd_mixed/issue42181.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/issue42181.dart.weak.expect
@@ -2,7 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd_mixed/issue42181.dart:10:9: Error: A value of type 'Null' can't be assigned to a variable of type 'int Function(int)'.
+// pkg/front_end/testcases/nnbd_mixed/issue42181.dart:10:9: Error: The value 'null' can't be assigned to a variable of type 'int Function(int)' because 'int Function(int)' is not nullable.
 //   F f = null; // Static error
 //         ^
 //
@@ -14,7 +14,7 @@
 static method f1(core::int x) → core::int?
   return x;
 static method test() → void {
-  (core::int*) → core::int* f = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/issue42181.dart:10:9: Error: A value of type 'Null' can't be assigned to a variable of type 'int Function(int)'.
+  (core::int*) → core::int* f = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/issue42181.dart:10:9: Error: The value 'null' can't be assigned to a variable of type 'int Function(int)' because 'int Function(int)' is not nullable.
   F f = null; // Static error
         ^" in null as{TypeError,ForNonNullableByDefault} (core::int*) → core::int*;
   f = #C1;
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue42181.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/issue42181.dart.weak.transformed.expect
index 87f79f9..4193805 100644
--- a/pkg/front_end/testcases/nnbd_mixed/issue42181.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/issue42181.dart.weak.transformed.expect
@@ -2,7 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd_mixed/issue42181.dart:10:9: Error: A value of type 'Null' can't be assigned to a variable of type 'int Function(int)'.
+// pkg/front_end/testcases/nnbd_mixed/issue42181.dart:10:9: Error: The value 'null' can't be assigned to a variable of type 'int Function(int)' because 'int Function(int)' is not nullable.
 //   F f = null; // Static error
 //         ^
 //
@@ -14,7 +14,7 @@
 static method f1(core::int x) → core::int?
   return x;
 static method test() → void {
-  (core::int*) → core::int* f = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/issue42181.dart:10:9: Error: A value of type 'Null' can't be assigned to a variable of type 'int Function(int)'.
+  (core::int*) → core::int* f = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/issue42181.dart:10:9: Error: The value 'null' can't be assigned to a variable of type 'int Function(int)' because 'int Function(int)' is not nullable.
   F f = null; // Static error
         ^" in null;
   f = #C1;
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue42387/foundation_basic_types_lib.dart b/pkg/front_end/testcases/nnbd_mixed/issue42387/foundation_basic_types_lib.dart
index 0984f7c..8820bae 100644
--- a/pkg/front_end/testcases/nnbd_mixed/issue42387/foundation_basic_types_lib.dart
+++ b/pkg/front_end/testcases/nnbd_mixed/issue42387/foundation_basic_types_lib.dart
@@ -2,6 +2,4 @@
 // 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.
 
-// @dart = 2.10
-
 typedef Future<Null> AsyncCallback();
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue42387/foundation_binding_lib.dart b/pkg/front_end/testcases/nnbd_mixed/issue42387/foundation_binding_lib.dart
index 9666c88..86af477 100644
--- a/pkg/front_end/testcases/nnbd_mixed/issue42387/foundation_binding_lib.dart
+++ b/pkg/front_end/testcases/nnbd_mixed/issue42387/foundation_binding_lib.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.
 
-// @dart = 2.10
-
 import 'foundation_basic_types_lib.dart';
 
 abstract class BindingBase {
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue42387/scheduler_tester.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/issue42387/scheduler_tester.dart.weak.expect
index 0e74a72..3a9fde4 100644
--- a/pkg/front_end/testcases/nnbd_mixed/issue42387/scheduler_tester.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/issue42387/scheduler_tester.dart.weak.expect
@@ -28,9 +28,8 @@
 library /*isNonNullableByDefault*/;
 import self as self2;
 import "dart:async" as asy;
-import "dart:core" as core;
 
-typedef AsyncCallback = () → asy::Future<core::Null?>;
+typedef AsyncCallback = () → asy::Future<Null>;
 
 library /*isNonNullableByDefault*/;
 import self as fou;
@@ -43,7 +42,7 @@
   synthetic constructor •() → fou::BindingBase
     : super core::Object::•()
     ;
-  method registerSignalServiceExtension({required core::String name = #C1, required () → asy::Future<core::Null?> callback = #C1}) → void {}
+  method registerSignalServiceExtension({required core::String name = #C1, required () → asy::Future<Null> callback = #C1}) → void {}
 }
 
 library;
@@ -66,7 +65,7 @@
 import "org-dartlang-testcase:///foundation_lib.dart";
 
 abstract class SchedulerBinding extends fou::BindingBase /*isMixinDeclaration*/  {
-  abstract member-signature method registerSignalServiceExtension({core::String* name = #C1, () →* asy::Future<core::Null?>* callback = #C1}) → void; -> fou::BindingBase::registerSignalServiceExtension
+  abstract member-signature method registerSignalServiceExtension({core::String* name = #C1, () →* asy::Future<Null>* callback = #C1}) → void; -> fou::BindingBase::registerSignalServiceExtension
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -111,7 +110,7 @@
   abstract member-signature method toString() → core::String*; -> core::Object::toString
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
-  abstract member-signature method registerSignalServiceExtension({core::String* name = #C1, () →* asy::Future<core::Null?>* callback = #C1}) → void; -> fou::BindingBase::registerSignalServiceExtension
+  abstract member-signature method registerSignalServiceExtension({core::String* name = #C1, () →* asy::Future<Null>* callback = #C1}) → void; -> fou::BindingBase::registerSignalServiceExtension
 }
 abstract class ServicesBinding extends ser::_ServicesBinding&BindingBase&SchedulerBinding /*isMixinDeclaration*/  {
 }
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue42387/scheduler_tester.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/issue42387/scheduler_tester.dart.weak.transformed.expect
index 30fe040..75be828 100644
--- a/pkg/front_end/testcases/nnbd_mixed/issue42387/scheduler_tester.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/issue42387/scheduler_tester.dart.weak.transformed.expect
@@ -14,7 +14,7 @@
   synthetic constructor •() → self::_TestSchedulerBinding&BindingBase&SchedulerBinding*
     : super fou::BindingBase::•()
     ;
-  abstract member-signature method /* from org-dartlang-testcase:///scheduler_binding_lib.dart */ registerSignalServiceExtension({core::String* name = #C1, () →* asy::Future<core::Null?>* callback = #C1}) → void; -> fou::BindingBase::registerSignalServiceExtension
+  abstract member-signature method /* from org-dartlang-testcase:///scheduler_binding_lib.dart */ registerSignalServiceExtension({core::String* name = #C1, () →* asy::Future<Null>* callback = #C1}) → void; -> fou::BindingBase::registerSignalServiceExtension
   abstract member-signature get /* from org-dartlang-testcase:///scheduler_binding_lib.dart */ _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method /* from org-dartlang-testcase:///scheduler_binding_lib.dart */ _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method /* from org-dartlang-testcase:///scheduler_binding_lib.dart */ _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -41,9 +41,8 @@
 library /*isNonNullableByDefault*/;
 import self as self2;
 import "dart:async" as asy;
-import "dart:core" as core;
 
-typedef AsyncCallback = () → asy::Future<core::Null?>;
+typedef AsyncCallback = () → asy::Future<Null>;
 
 library /*isNonNullableByDefault*/;
 import self as fou;
@@ -56,7 +55,7 @@
   synthetic constructor •() → fou::BindingBase
     : super core::Object::•()
     ;
-  method registerSignalServiceExtension({required core::String name = #C1, required () → asy::Future<core::Null?> callback = #C1}) → void {}
+  method registerSignalServiceExtension({required core::String name = #C1, required () → asy::Future<Null> callback = #C1}) → void {}
 }
 
 library;
@@ -79,7 +78,7 @@
 import "org-dartlang-testcase:///foundation_lib.dart";
 
 abstract class SchedulerBinding extends fou::BindingBase /*isMixinDeclaration*/  {
-  abstract member-signature method registerSignalServiceExtension({core::String* name = #C1, () →* asy::Future<core::Null?>* callback = #C1}) → void; -> fou::BindingBase::registerSignalServiceExtension
+  abstract member-signature method registerSignalServiceExtension({core::String* name = #C1, () →* asy::Future<Null>* callback = #C1}) → void; -> fou::BindingBase::registerSignalServiceExtension
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -124,7 +123,7 @@
   abstract member-signature method toString() → core::String*; -> core::Object::toString
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
-  abstract member-signature method registerSignalServiceExtension({core::String* name = #C1, () →* asy::Future<core::Null?>* callback = #C1}) → void; -> fou::BindingBase::registerSignalServiceExtension
+  abstract member-signature method registerSignalServiceExtension({core::String* name = #C1, () →* asy::Future<Null>* callback = #C1}) → void; -> fou::BindingBase::registerSignalServiceExtension
 }
 abstract class ServicesBinding extends ser::_ServicesBinding&BindingBase&SchedulerBinding /*isMixinDeclaration*/  {
 }
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue42660_lib.dart b/pkg/front_end/testcases/nnbd_mixed/issue42660_lib.dart
index 7207237..159b420 100644
--- a/pkg/front_end/testcases/nnbd_mixed/issue42660_lib.dart
+++ b/pkg/front_end/testcases/nnbd_mixed/issue42660_lib.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.
 
-// @dart=2.10
-
 extension E on int {
   String m() => 'm';
 }
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue43988/main.dart b/pkg/front_end/testcases/nnbd_mixed/issue43988/main.dart
new file mode 100644
index 0000000..7f60cbd
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/issue43988/main.dart
@@ -0,0 +1,17 @@
+// Copyright (c) 2020, 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.
+
+// @dart=2.9
+
+import 'main_lib.dart';
+
+class E1 with A, D {}
+
+class E2 = Object with A, D;
+
+abstract class C6 extends C3 implements C4 {}
+
+abstract class C8 extends C5 implements C7 {}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue43988/main.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd_mixed/issue43988/main.dart.textual_outline.expect
new file mode 100644
index 0000000..1763bc0
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/issue43988/main.dart.textual_outline.expect
@@ -0,0 +1,12 @@
+// @dart = 2.9
+import 'main_lib.dart';
+
+class E1 with A, D {}
+
+class E2 = Object with A, D;
+
+abstract class C6 extends C3 implements C4 {}
+
+abstract class C8 extends C5 implements C7 {}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue43988/main.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/nnbd_mixed/issue43988/main.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..9bd7263
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/issue43988/main.dart.textual_outline_modelled.expect
@@ -0,0 +1,11 @@
+// @dart = 2.9
+import 'main_lib.dart';
+
+abstract class C6 extends C3 implements C4 {}
+
+abstract class C8 extends C5 implements C7 {}
+
+class E1 with A, D {}
+
+class E2 = Object with A, D;
+main() {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue43988/main.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/issue43988/main.dart.weak.expect
new file mode 100644
index 0000000..1345fdd
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/issue43988/main.dart.weak.expect
@@ -0,0 +1,156 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "main_lib.dart" as mai;
+
+import "org-dartlang-testcase:///main_lib.dart";
+
+abstract class _E1&Object&A = core::Object with mai::A /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_E1&Object&A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _E1&Object&A&D = self::_E1&Object&A with mai::D /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_E1&Object&A&D*
+    : super self::_E1&Object&A::•()
+    ;
+  abstract forwarding-stub method method(covariant core::num* i, {core::String* s = #C1}) → core::String*;
+}
+class E1 extends self::_E1&Object&A&D {
+  synthetic constructor •() → self::E1*
+    : super self::_E1&Object&A&D::•()
+    ;
+  abstract member-signature method method(covariant core::num* i, {core::String* s = #C1}) → core::String*; -> self::_E1&Object&A&D::method
+}
+abstract class _E2&Object&A = core::Object with mai::A /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_E2&Object&A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class E2 = self::_E2&Object&A with mai::D /*hasConstConstructor*/  {
+  const synthetic constructor •() → self::E2*
+    : super self::_E2&Object&A::•()
+    ;
+  abstract forwarding-stub method method(covariant core::num* i, {core::String* s = #C1}) → core::String*;
+}
+abstract class C6 extends mai::C3 implements mai::C4 {
+  synthetic constructor •() → self::C6*
+    : super mai::C3::•()
+    ;
+  abstract forwarding-stub method method2([covariant core::String* a = #C2]) → dynamic;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class C8 extends mai::C5 implements mai::C7 {
+  synthetic constructor •() → self::C8*
+    : super mai::C5::•()
+    ;
+  abstract forwarding-stub method method2([covariant core::String* a = #C2, core::num* b = #C2]) → dynamic;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
+
+library /*isNonNullableByDefault*/;
+import self as mai;
+import "dart:core" as core;
+
+abstract class Interface extends core::Object {
+  synthetic constructor •() → mai::Interface
+    : super core::Object::•()
+    ;
+  abstract method method(core::num i) → core::String;
+}
+abstract class Interface2 extends core::Object {
+  synthetic constructor •() → mai::Interface2
+    : super core::Object::•()
+    ;
+  abstract method method(covariant core::int i) → core::String;
+}
+abstract class A extends core::Object implements mai::Interface /*isMixinDeclaration*/  {
+  method method(core::num i, {core::String s = #C1}) → core::String
+    return s;
+}
+abstract class D extends core::Object implements mai::Interface, mai::Interface2 {
+  synthetic constructor •() → mai::D
+    : super core::Object::•()
+    ;
+  abstract forwarding-stub method method(covariant core::num i) → core::String;
+}
+abstract class C1 extends core::Object {
+  synthetic constructor •() → mai::C1
+    : super core::Object::•()
+    ;
+  abstract method method2() → dynamic;
+}
+abstract class C2 extends core::Object {
+  synthetic constructor •() → mai::C2
+    : super core::Object::•()
+    ;
+  abstract method method2([core::String a = #C2]) → dynamic;
+}
+abstract class C3 extends core::Object implements mai::C1, mai::C2 {
+  synthetic constructor •() → mai::C3
+    : super core::Object::•()
+    ;
+  abstract member-signature method method2([core::String a = #C2]) → dynamic; -> mai::C2::method2
+}
+abstract class C4 extends core::Object {
+  synthetic constructor •() → mai::C4
+    : super core::Object::•()
+    ;
+  abstract method method2([covariant core::String a = #C2]) → dynamic;
+}
+abstract class C5 extends mai::C3 implements mai::C4 {
+  synthetic constructor •() → mai::C5
+    : super mai::C3::•()
+    ;
+  abstract forwarding-stub method method2([covariant core::String a = #C2]) → dynamic;
+}
+abstract class C7 extends core::Object {
+  synthetic constructor •() → mai::C7
+    : super core::Object::•()
+    ;
+  abstract method method2([core::String a = #C2, core::num b = #C2]) → dynamic;
+}
+
+constants  {
+  #C1 = "hello"
+  #C2 = null
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue43988/main.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/issue43988/main.dart.weak.transformed.expect
new file mode 100644
index 0000000..341bd9b
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/issue43988/main.dart.weak.transformed.expect
@@ -0,0 +1,160 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "main_lib.dart" as mai;
+
+import "org-dartlang-testcase:///main_lib.dart";
+
+abstract class _E1&Object&A extends core::Object implements mai::A /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_E1&Object&A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  method /*isNonNullableByDefault, from org-dartlang-testcase:///main_lib.dart */ method(core::num i, {core::String s = #C1}) → core::String
+    return s;
+}
+abstract class _E1&Object&A&D extends self::_E1&Object&A implements mai::D /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_E1&Object&A&D*
+    : super self::_E1&Object&A::•()
+    ;
+  abstract forwarding-stub method method(covariant core::num* i, {core::String* s = #C1}) → core::String*;
+}
+class E1 extends self::_E1&Object&A&D {
+  synthetic constructor •() → self::E1*
+    : super self::_E1&Object&A&D::•()
+    ;
+  abstract member-signature method method(covariant core::num* i, {core::String* s = #C1}) → core::String*; -> self::_E1&Object&A&D::method
+}
+abstract class _E2&Object&A extends core::Object implements mai::A /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_E2&Object&A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  method /*isNonNullableByDefault, from org-dartlang-testcase:///main_lib.dart */ method(core::num i, {core::String s = #C1}) → core::String
+    return s;
+}
+class E2 extends self::_E2&Object&A implements mai::D /*isEliminatedMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::E2*
+    : super self::_E2&Object&A::•()
+    ;
+  abstract forwarding-stub method method(covariant core::num* i, {core::String* s = #C1}) → core::String*;
+}
+abstract class C6 extends mai::C3 implements mai::C4 {
+  synthetic constructor •() → self::C6*
+    : super mai::C3::•()
+    ;
+  abstract forwarding-stub method method2([covariant core::String* a = #C2]) → dynamic;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class C8 extends mai::C5 implements mai::C7 {
+  synthetic constructor •() → self::C8*
+    : super mai::C5::•()
+    ;
+  abstract forwarding-stub method method2([covariant core::String* a = #C2, core::num* b = #C2]) → dynamic;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
+
+library /*isNonNullableByDefault*/;
+import self as mai;
+import "dart:core" as core;
+
+abstract class Interface extends core::Object {
+  synthetic constructor •() → mai::Interface
+    : super core::Object::•()
+    ;
+  abstract method method(core::num i) → core::String;
+}
+abstract class Interface2 extends core::Object {
+  synthetic constructor •() → mai::Interface2
+    : super core::Object::•()
+    ;
+  abstract method method(covariant core::int i) → core::String;
+}
+abstract class A extends core::Object implements mai::Interface /*isMixinDeclaration*/  {
+  method method(core::num i, {core::String s = #C1}) → core::String
+    return s;
+}
+abstract class D extends core::Object implements mai::Interface, mai::Interface2 {
+  synthetic constructor •() → mai::D
+    : super core::Object::•()
+    ;
+  abstract forwarding-stub method method(covariant core::num i) → core::String;
+}
+abstract class C1 extends core::Object {
+  synthetic constructor •() → mai::C1
+    : super core::Object::•()
+    ;
+  abstract method method2() → dynamic;
+}
+abstract class C2 extends core::Object {
+  synthetic constructor •() → mai::C2
+    : super core::Object::•()
+    ;
+  abstract method method2([core::String a = #C2]) → dynamic;
+}
+abstract class C3 extends core::Object implements mai::C1, mai::C2 {
+  synthetic constructor •() → mai::C3
+    : super core::Object::•()
+    ;
+  abstract member-signature method method2([core::String a = #C2]) → dynamic; -> mai::C2::method2
+}
+abstract class C4 extends core::Object {
+  synthetic constructor •() → mai::C4
+    : super core::Object::•()
+    ;
+  abstract method method2([covariant core::String a = #C2]) → dynamic;
+}
+abstract class C5 extends mai::C3 implements mai::C4 {
+  synthetic constructor •() → mai::C5
+    : super mai::C3::•()
+    ;
+  abstract forwarding-stub method method2([covariant core::String a = #C2]) → dynamic;
+}
+abstract class C7 extends core::Object {
+  synthetic constructor •() → mai::C7
+    : super core::Object::•()
+    ;
+  abstract method method2([core::String a = #C2, core::num b = #C2]) → dynamic;
+}
+
+constants  {
+  #C1 = "hello"
+  #C2 = null
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue43988/main_lib.dart b/pkg/front_end/testcases/nnbd_mixed/issue43988/main_lib.dart
new file mode 100644
index 0000000..5291414
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/issue43988/main_lib.dart
@@ -0,0 +1,37 @@
+// Copyright (c) 2020, 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.
+
+abstract class Interface {
+  String method(num i);
+}
+
+abstract class Interface2 {
+  String method(covariant int i);
+}
+
+mixin A implements Interface {
+  String method(num i, {String s = "hello"}) => s;
+}
+
+abstract class D implements Interface, Interface2 {}
+
+abstract class C1 {
+  method2();
+}
+
+abstract class C2 {
+  method2([String a]);
+}
+
+abstract class C3 implements C1, C2 {}
+
+abstract class C4 {
+  method2([covariant String a]);
+}
+
+abstract class C5 extends C3 implements C4 {}
+
+abstract class C7 {
+  method2([String a, num b]);
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue43988/test.options b/pkg/front_end/testcases/nnbd_mixed/issue43988/test.options
new file mode 100644
index 0000000..bfe6dc8
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/issue43988/test.options
@@ -0,0 +1 @@
+main_lib.dart
\ No newline at end of file
diff --git a/pkg/front_end/testcases/nnbd_mixed/member_inheritance_from_opt_in.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/member_inheritance_from_opt_in.dart.weak.expect
index 44dc597..9e000b7 100644
--- a/pkg/front_end/testcases/nnbd_mixed/member_inheritance_from_opt_in.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/member_inheritance_from_opt_in.dart.weak.expect
@@ -44,17 +44,17 @@
     return 0;
   set property4(core::int* value) → void {}
   abstract member-signature get field1() → core::int*; -> mem::Class::field1
-  abstract member-signature set field1(core::int* _) → void; -> mem::Class::field1
+  abstract member-signature set field1(core::int* value) → void; -> mem::Class::field1
   abstract member-signature get field2() → core::int*; -> mem::Class::field2
-  abstract member-signature set field2(core::int* _) → void; -> mem::Class::field2
+  abstract member-signature set field2(core::int* value) → void; -> mem::Class::field2
   abstract member-signature get property1() → core::int*; -> mem::Class::property1
   abstract member-signature set property1(core::int* value) → void; -> mem::Class::property1
   abstract member-signature get property2() → core::int*; -> mem::Class::property2
   abstract member-signature set property2(core::int* value) → void; -> mem::Class::property2
   abstract member-signature get property5() → core::int*; -> mem::Class::property5
-  abstract member-signature set property5(core::int* _) → void; -> mem::Class::property5
+  abstract member-signature set property5(core::int* value) → void; -> mem::Class::property5
   abstract member-signature get property6() → core::int*; -> mem::Class::property6
-  abstract member-signature set property6(core::int* _) → void; -> mem::Class::property6
+  abstract member-signature set property6(core::int* value) → void; -> mem::Class::property6
   abstract member-signature method method1() → core::int*; -> mem::Class::method1
   abstract member-signature method method2() → core::int*; -> mem::Class::method2
   abstract member-signature method method5a(core::int* a, core::int* b) → core::int*; -> mem::Class::method5a
diff --git a/pkg/front_end/testcases/nnbd_mixed/member_inheritance_from_opt_in.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/member_inheritance_from_opt_in.dart.weak.transformed.expect
index 44dc597..9e000b7 100644
--- a/pkg/front_end/testcases/nnbd_mixed/member_inheritance_from_opt_in.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/member_inheritance_from_opt_in.dart.weak.transformed.expect
@@ -44,17 +44,17 @@
     return 0;
   set property4(core::int* value) → void {}
   abstract member-signature get field1() → core::int*; -> mem::Class::field1
-  abstract member-signature set field1(core::int* _) → void; -> mem::Class::field1
+  abstract member-signature set field1(core::int* value) → void; -> mem::Class::field1
   abstract member-signature get field2() → core::int*; -> mem::Class::field2
-  abstract member-signature set field2(core::int* _) → void; -> mem::Class::field2
+  abstract member-signature set field2(core::int* value) → void; -> mem::Class::field2
   abstract member-signature get property1() → core::int*; -> mem::Class::property1
   abstract member-signature set property1(core::int* value) → void; -> mem::Class::property1
   abstract member-signature get property2() → core::int*; -> mem::Class::property2
   abstract member-signature set property2(core::int* value) → void; -> mem::Class::property2
   abstract member-signature get property5() → core::int*; -> mem::Class::property5
-  abstract member-signature set property5(core::int* _) → void; -> mem::Class::property5
+  abstract member-signature set property5(core::int* value) → void; -> mem::Class::property5
   abstract member-signature get property6() → core::int*; -> mem::Class::property6
-  abstract member-signature set property6(core::int* _) → void; -> mem::Class::property6
+  abstract member-signature set property6(core::int* value) → void; -> mem::Class::property6
   abstract member-signature method method1() → core::int*; -> mem::Class::method1
   abstract member-signature method method2() → core::int*; -> mem::Class::method2
   abstract member-signature method method5a(core::int* a, core::int* b) → core::int*; -> mem::Class::method5a
diff --git a/pkg/front_end/testcases/nnbd_mixed/member_inheritance_from_opt_out.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/member_inheritance_from_opt_out.dart.weak.expect
index 973cfd4..fc797ac 100644
--- a/pkg/front_end/testcases/nnbd_mixed/member_inheritance_from_opt_out.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/member_inheritance_from_opt_out.dart.weak.expect
@@ -50,13 +50,13 @@
     : super opt::LegacyClass::•()
     ;
   abstract member-signature get field1() → core::int; -> opt::LegacyClass::field1
-  abstract member-signature set field1(core::int _) → void; -> opt::LegacyClass::field1
+  abstract member-signature set field1(core::int value) → void; -> opt::LegacyClass::field1
   abstract member-signature get field2() → core::int?; -> opt::LegacyClass::field2
-  abstract member-signature set field2(core::int? _) → void; -> opt::LegacyClass::field2
+  abstract member-signature set field2(core::int? value) → void; -> opt::LegacyClass::field2
   abstract member-signature get field3() → core::int; -> opt::LegacyClass::field3
-  abstract member-signature set field3(core::int _) → void; -> opt::LegacyClass::field3
+  abstract member-signature set field3(core::int value) → void; -> opt::LegacyClass::field3
   abstract member-signature get field4() → core::int?; -> opt::LegacyClass::field4
-  abstract member-signature set field4(core::int? _) → void; -> opt::LegacyClass::field4
+  abstract member-signature set field4(core::int? value) → void; -> opt::LegacyClass::field4
   abstract member-signature get property1() → core::int; -> opt::LegacyClass::property1
   abstract member-signature set property1(core::int value) → void; -> opt::LegacyClass::property1
   abstract member-signature get property2() → core::int?; -> opt::LegacyClass::property2
diff --git a/pkg/front_end/testcases/nnbd_mixed/member_inheritance_from_opt_out.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/member_inheritance_from_opt_out.dart.weak.transformed.expect
index 973cfd4..fc797ac 100644
--- a/pkg/front_end/testcases/nnbd_mixed/member_inheritance_from_opt_out.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/member_inheritance_from_opt_out.dart.weak.transformed.expect
@@ -50,13 +50,13 @@
     : super opt::LegacyClass::•()
     ;
   abstract member-signature get field1() → core::int; -> opt::LegacyClass::field1
-  abstract member-signature set field1(core::int _) → void; -> opt::LegacyClass::field1
+  abstract member-signature set field1(core::int value) → void; -> opt::LegacyClass::field1
   abstract member-signature get field2() → core::int?; -> opt::LegacyClass::field2
-  abstract member-signature set field2(core::int? _) → void; -> opt::LegacyClass::field2
+  abstract member-signature set field2(core::int? value) → void; -> opt::LegacyClass::field2
   abstract member-signature get field3() → core::int; -> opt::LegacyClass::field3
-  abstract member-signature set field3(core::int _) → void; -> opt::LegacyClass::field3
+  abstract member-signature set field3(core::int value) → void; -> opt::LegacyClass::field3
   abstract member-signature get field4() → core::int?; -> opt::LegacyClass::field4
-  abstract member-signature set field4(core::int? _) → void; -> opt::LegacyClass::field4
+  abstract member-signature set field4(core::int? value) → void; -> opt::LegacyClass::field4
   abstract member-signature get property1() → core::int; -> opt::LegacyClass::property1
   abstract member-signature set property1(core::int value) → void; -> opt::LegacyClass::property1
   abstract member-signature get property2() → core::int?; -> opt::LegacyClass::property2
diff --git a/pkg/front_end/testcases/nnbd_mixed/mixin_from_opt_out.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/mixin_from_opt_out.dart.weak.expect
index 731c106..bd160a8 100644
--- a/pkg/front_end/testcases/nnbd_mixed/mixin_from_opt_out.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/mixin_from_opt_out.dart.weak.expect
@@ -9,7 +9,7 @@
   const synthetic constructor •() → self::_Class&Object&Mixin
     : super core::Object::•()
     ;
-  abstract forwarding-stub operator ==(dynamic other) → core::bool*;
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
 }
 class Class extends self::_Class&Object&Mixin {
   synthetic constructor •() → self::Class
diff --git a/pkg/front_end/testcases/nnbd_mixed/mock_http_headers.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/mock_http_headers.dart.weak.expect
index 225ab3c..c929e9f 100644
--- a/pkg/front_end/testcases/nnbd_mixed/mock_http_headers.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/mock_http_headers.dart.weak.expect
@@ -27,40 +27,40 @@
     ;
   no-such-method-forwarder get date() → core::DateTime*
     return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))) as{TypeError,ForDynamic} core::DateTime*;
-  no-such-method-forwarder set date(core::DateTime* _) → void
-    return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C5, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+  no-such-method-forwarder set date(core::DateTime* value) → void
+    return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C5, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
   no-such-method-forwarder get expires() → core::DateTime*
     return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C6, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))) as{TypeError,ForDynamic} core::DateTime*;
-  no-such-method-forwarder set expires(core::DateTime* _) → void
-    return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C7, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+  no-such-method-forwarder set expires(core::DateTime* value) → void
+    return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C7, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
   no-such-method-forwarder get ifModifiedSince() → core::DateTime*
     return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))) as{TypeError,ForDynamic} core::DateTime*;
-  no-such-method-forwarder set ifModifiedSince(core::DateTime* _) → void
-    return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C9, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+  no-such-method-forwarder set ifModifiedSince(core::DateTime* value) → void
+    return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C9, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
   no-such-method-forwarder get host() → core::String*
     return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))) as{TypeError,ForDynamic} core::String*;
-  no-such-method-forwarder set host(core::String* _) → void
-    return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C11, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+  no-such-method-forwarder set host(core::String* value) → void
+    return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C11, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
   no-such-method-forwarder get port() → core::int*
     return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C12, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))) as{TypeError,ForDynamic} core::int*;
-  no-such-method-forwarder set port(core::int* _) → void
-    return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C13, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+  no-such-method-forwarder set port(core::int* value) → void
+    return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C13, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
   no-such-method-forwarder get contentType() → _ht::ContentType*
     return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C14, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))) as{TypeError,ForDynamic} _ht::ContentType*;
-  no-such-method-forwarder set contentType(_ht::ContentType* _) → void
-    return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C15, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+  no-such-method-forwarder set contentType(_ht::ContentType* value) → void
+    return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C15, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
   no-such-method-forwarder get contentLength() → core::int*
     return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C16, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))) as{TypeError,ForDynamic} core::int*;
-  no-such-method-forwarder set contentLength(core::int* _) → void
-    return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C17, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+  no-such-method-forwarder set contentLength(core::int* value) → void
+    return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C17, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
   no-such-method-forwarder get persistentConnection() → core::bool*
     return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C18, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))) as{TypeError,ForDynamic} core::bool*;
-  no-such-method-forwarder set persistentConnection(core::bool* _) → void
-    return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C19, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+  no-such-method-forwarder set persistentConnection(core::bool* value) → void
+    return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C19, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
   no-such-method-forwarder get chunkedTransferEncoding() → core::bool*
     return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C20, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))) as{TypeError,ForDynamic} core::bool*;
-  no-such-method-forwarder set chunkedTransferEncoding(core::bool* _) → void
-    return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C21, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+  no-such-method-forwarder set chunkedTransferEncoding(core::bool* value) → void
+    return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C21, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
   no-such-method-forwarder operator [](core::String* name) → core::List<core::String*>*
     return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C22, 0, #C2, core::List::unmodifiable<dynamic>(<dynamic>[name]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))) as{TypeError,ForDynamic} core::List<core::String*>*;
   no-such-method-forwarder method value(core::String* name) → core::String*
@@ -77,7 +77,7 @@
     return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C30, 0, #C2, core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
   no-such-method-forwarder method noFolding(core::String* name) → void
     return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C31, 0, #C2, core::List::unmodifiable<dynamic>(<dynamic>[name]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
-  no-such-method-forwarder method /*isNonNullableByDefault, from org-dartlang-sdk:///sdk/lib/_http/http.dart */ clear() → void
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/_http/http.dart */ clear() → void
     return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C32, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/mock_http_headers.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/mock_http_headers.dart.weak.transformed.expect
index 225ab3c..c929e9f 100644
--- a/pkg/front_end/testcases/nnbd_mixed/mock_http_headers.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/mock_http_headers.dart.weak.transformed.expect
@@ -27,40 +27,40 @@
     ;
   no-such-method-forwarder get date() → core::DateTime*
     return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))) as{TypeError,ForDynamic} core::DateTime*;
-  no-such-method-forwarder set date(core::DateTime* _) → void
-    return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C5, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+  no-such-method-forwarder set date(core::DateTime* value) → void
+    return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C5, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
   no-such-method-forwarder get expires() → core::DateTime*
     return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C6, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))) as{TypeError,ForDynamic} core::DateTime*;
-  no-such-method-forwarder set expires(core::DateTime* _) → void
-    return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C7, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+  no-such-method-forwarder set expires(core::DateTime* value) → void
+    return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C7, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
   no-such-method-forwarder get ifModifiedSince() → core::DateTime*
     return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))) as{TypeError,ForDynamic} core::DateTime*;
-  no-such-method-forwarder set ifModifiedSince(core::DateTime* _) → void
-    return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C9, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+  no-such-method-forwarder set ifModifiedSince(core::DateTime* value) → void
+    return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C9, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
   no-such-method-forwarder get host() → core::String*
     return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))) as{TypeError,ForDynamic} core::String*;
-  no-such-method-forwarder set host(core::String* _) → void
-    return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C11, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+  no-such-method-forwarder set host(core::String* value) → void
+    return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C11, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
   no-such-method-forwarder get port() → core::int*
     return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C12, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))) as{TypeError,ForDynamic} core::int*;
-  no-such-method-forwarder set port(core::int* _) → void
-    return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C13, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+  no-such-method-forwarder set port(core::int* value) → void
+    return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C13, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
   no-such-method-forwarder get contentType() → _ht::ContentType*
     return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C14, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))) as{TypeError,ForDynamic} _ht::ContentType*;
-  no-such-method-forwarder set contentType(_ht::ContentType* _) → void
-    return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C15, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+  no-such-method-forwarder set contentType(_ht::ContentType* value) → void
+    return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C15, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
   no-such-method-forwarder get contentLength() → core::int*
     return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C16, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))) as{TypeError,ForDynamic} core::int*;
-  no-such-method-forwarder set contentLength(core::int* _) → void
-    return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C17, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+  no-such-method-forwarder set contentLength(core::int* value) → void
+    return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C17, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
   no-such-method-forwarder get persistentConnection() → core::bool*
     return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C18, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))) as{TypeError,ForDynamic} core::bool*;
-  no-such-method-forwarder set persistentConnection(core::bool* _) → void
-    return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C19, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+  no-such-method-forwarder set persistentConnection(core::bool* value) → void
+    return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C19, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
   no-such-method-forwarder get chunkedTransferEncoding() → core::bool*
     return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C20, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))) as{TypeError,ForDynamic} core::bool*;
-  no-such-method-forwarder set chunkedTransferEncoding(core::bool* _) → void
-    return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C21, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+  no-such-method-forwarder set chunkedTransferEncoding(core::bool* value) → void
+    return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C21, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
   no-such-method-forwarder operator [](core::String* name) → core::List<core::String*>*
     return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C22, 0, #C2, core::List::unmodifiable<dynamic>(<dynamic>[name]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))) as{TypeError,ForDynamic} core::List<core::String*>*;
   no-such-method-forwarder method value(core::String* name) → core::String*
@@ -77,7 +77,7 @@
     return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C30, 0, #C2, core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
   no-such-method-forwarder method noFolding(core::String* name) → void
     return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C31, 0, #C2, core::List::unmodifiable<dynamic>(<dynamic>[name]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
-  no-such-method-forwarder method /*isNonNullableByDefault, from org-dartlang-sdk:///sdk/lib/_http/http.dart */ clear() → void
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/_http/http.dart */ clear() → void
     return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C32, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart.weak.expect
index 4852b17..ee003ce 100644
--- a/pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart.weak.expect
@@ -21,21 +21,21 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 class B extends nev::A {
-  field core::Null? neverField = null;
-  field core::Null? nullField = null;
+  field Null neverField = null;
+  field Null nullField = null;
   synthetic constructor •() → self::B*
     : super nev::A::•()
     ;
-  method neverMethod(core::Null? value) → core::Null?
+  method neverMethod(Null value) → Null
     return value;
-  get neverProperty() → core::Null?
+  get neverProperty() → Null
     return null;
-  set neverProperty(core::Null? value) → void {}
-  method nullMethod(core::Null? value) → core::Null?
+  set neverProperty(Null value) → void {}
+  method nullMethod(Null value) → Null
     return value;
-  get nullProperty() → core::Null?
+  get nullProperty() → Null
     return null;
-  set nullProperty(core::Null? value) → void {}
+  set nullProperty(Null value) → void {}
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -48,21 +48,21 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 class C extends nev::A {
-  field core::Null? neverField = null;
-  field core::Null? nullField = null;
+  field Null neverField = null;
+  field Null nullField = null;
   synthetic constructor •() → self::C*
     : super nev::A::•()
     ;
-  method neverMethod(core::Null? value) → core::Null?
+  method neverMethod(Null value) → Null
     return value;
-  get neverProperty() → core::Null?
+  get neverProperty() → Null
     return null;
-  set neverProperty(core::Null? value) → void {}
-  method nullMethod(core::Null? value) → core::Null?
+  set neverProperty(Null value) → void {}
+  method nullMethod(Null value) → Null
     return value;
-  get nullProperty() → core::Null?
+  get nullProperty() → Null
     return null;
-  set nullProperty(core::Null? value) → void {}
+  set nullProperty(Null value) → void {}
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -74,16 +74,16 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-static field core::Null? optOutNever;
+static field Null optOutNever;
 static field dynamic inferredOptOutNever = nev::optInNever;
 static method genericMethod<T extends core::Object* = dynamic>() → dynamic {}
 static method main() → dynamic {
   nev::optInNever = self::optOutNever;
-  core::Type* typeNever = core::Null?;
-  self::genericMethod<core::Null?>();
-  new self::GenericClass::•<core::Null?>();
-  core::Null? localNever = null;
-  core::Null? localNull = null;
+  core::Type* typeNever = Null;
+  self::genericMethod<Null>();
+  new self::GenericClass::•<Null>();
+  Null localNever = null;
+  Null localNull = null;
   dynamic inferredLocalNever = nev::optInNever;
   localNever = localNever;
   self::optOutNever = localNever;
@@ -109,29 +109,29 @@
   localNull = localNull;
   self::inferredOptOutNever = localNull;
   inferredLocalNever = localNull;
-  localNever = self::inferredOptOutNever as{TypeError,ForDynamic} core::Null?;
-  self::optOutNever = self::inferredOptOutNever as{TypeError,ForDynamic} core::Null?;
+  localNever = self::inferredOptOutNever as{TypeError,ForDynamic} Null;
+  self::optOutNever = self::inferredOptOutNever as{TypeError,ForDynamic} Null;
   nev::optInNever = self::inferredOptOutNever as{TypeError,ForDynamic} Never;
-  localNull = self::inferredOptOutNever as{TypeError,ForDynamic} core::Null?;
+  localNull = self::inferredOptOutNever as{TypeError,ForDynamic} Null;
   self::inferredOptOutNever = self::inferredOptOutNever;
   inferredLocalNever = self::inferredOptOutNever;
-  localNever = inferredLocalNever as{TypeError,ForDynamic} core::Null?;
-  self::optOutNever = inferredLocalNever as{TypeError,ForDynamic} core::Null?;
+  localNever = inferredLocalNever as{TypeError,ForDynamic} Null;
+  self::optOutNever = inferredLocalNever as{TypeError,ForDynamic} Null;
   nev::optInNever = inferredLocalNever as{TypeError,ForDynamic} Never;
-  localNull = inferredLocalNever as{TypeError,ForDynamic} core::Null?;
+  localNull = inferredLocalNever as{TypeError,ForDynamic} Null;
   self::inferredOptOutNever = inferredLocalNever;
   inferredLocalNever = inferredLocalNever;
-  self::throws(() → core::Null? => self::optOutNever = nev::throwing());
-  self::throws(() → core::Null? => localNever = nev::throwing());
-  self::throws(() → core::Null? => self::optOutNever = nev::throwing());
-  self::throws(() → core::Null? => nev::optInNever = nev::throwing());
-  self::throws(() → core::Null? => self::inferredOptOutNever = nev::throwing());
-  self::throws(() → core::Null? => inferredLocalNever = nev::throwing());
-  nev::BoundedGenericClass<core::Null?>* boundedGenericClass = new nev::BoundedGenericClass::•<core::Null?>();
-  self::throws(() → core::Null? {
-    dynamic boundedGenericMethodResult1 = nev::boundedGenericMethod1<core::Null?>();
+  self::throws(() → Null => self::optOutNever = nev::throwing());
+  self::throws(() → Null => localNever = nev::throwing());
+  self::throws(() → Null => self::optOutNever = nev::throwing());
+  self::throws(() → Null => nev::optInNever = nev::throwing());
+  self::throws(() → Null => self::inferredOptOutNever = nev::throwing());
+  self::throws(() → Null => inferredLocalNever = nev::throwing());
+  nev::BoundedGenericClass<Null>* boundedGenericClass = new nev::BoundedGenericClass::•<Null>();
+  self::throws(() → Null {
+    dynamic boundedGenericMethodResult1 = nev::boundedGenericMethod1<Null>();
   });
-  core::List<core::Null?>* boundedGenericMethodResult2 = nev::boundedGenericMethod2<core::Null?>();
+  core::List<Null>* boundedGenericMethodResult2 = nev::boundedGenericMethod2<Null>();
   dynamic dyn = null;
   nev::optInNever = dyn as{TypeError,ForDynamic} Never;
 }
@@ -154,7 +154,7 @@
 
 class A extends core::Object {
   field Never neverField = throw "Should not reach here";
-  field core::Null? nullField = null;
+  field Null nullField = null;
   synthetic constructor •() → nev::A
     : super core::Object::•()
     ;
@@ -163,11 +163,11 @@
   get neverProperty() → Never
     return throw "Should not reach here";
   set neverProperty(Never value) → void {}
-  method nullMethod(core::Null? value) → core::Null?
+  method nullMethod(Null value) → Null
     return value;
-  get nullProperty() → core::Null?
+  get nullProperty() → Null
     return null;
-  set nullProperty(core::Null? value) → void {}
+  set nullProperty(Null value) → void {}
 }
 class BoundedGenericClass<T extends Never = Never> extends core::Object {
   synthetic constructor •() → nev::BoundedGenericClass<nev::BoundedGenericClass::T>
diff --git a/pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart.weak.transformed.expect
index 9428bc8..34765b6 100644
--- a/pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart.weak.transformed.expect
@@ -21,21 +21,21 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 class B extends nev::A {
-  field core::Null? neverField = null;
-  field core::Null? nullField = null;
+  field Null neverField = null;
+  field Null nullField = null;
   synthetic constructor •() → self::B*
     : super nev::A::•()
     ;
-  method neverMethod(core::Null? value) → core::Null?
+  method neverMethod(Null value) → Null
     return value;
-  get neverProperty() → core::Null?
+  get neverProperty() → Null
     return null;
-  set neverProperty(core::Null? value) → void {}
-  method nullMethod(core::Null? value) → core::Null?
+  set neverProperty(Null value) → void {}
+  method nullMethod(Null value) → Null
     return value;
-  get nullProperty() → core::Null?
+  get nullProperty() → Null
     return null;
-  set nullProperty(core::Null? value) → void {}
+  set nullProperty(Null value) → void {}
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -48,21 +48,21 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 class C extends nev::A {
-  field core::Null? neverField = null;
-  field core::Null? nullField = null;
+  field Null neverField = null;
+  field Null nullField = null;
   synthetic constructor •() → self::C*
     : super nev::A::•()
     ;
-  method neverMethod(core::Null? value) → core::Null?
+  method neverMethod(Null value) → Null
     return value;
-  get neverProperty() → core::Null?
+  get neverProperty() → Null
     return null;
-  set neverProperty(core::Null? value) → void {}
-  method nullMethod(core::Null? value) → core::Null?
+  set neverProperty(Null value) → void {}
+  method nullMethod(Null value) → Null
     return value;
-  get nullProperty() → core::Null?
+  get nullProperty() → Null
     return null;
-  set nullProperty(core::Null? value) → void {}
+  set nullProperty(Null value) → void {}
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -74,16 +74,16 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-static field core::Null? optOutNever;
+static field Null optOutNever;
 static field dynamic inferredOptOutNever = nev::optInNever;
 static method genericMethod<T extends core::Object* = dynamic>() → dynamic {}
 static method main() → dynamic {
   nev::optInNever = self::optOutNever;
-  core::Type* typeNever = core::Null?;
-  self::genericMethod<core::Null?>();
-  new self::GenericClass::•<core::Null?>();
-  core::Null? localNever = null;
-  core::Null? localNull = null;
+  core::Type* typeNever = Null;
+  self::genericMethod<Null>();
+  new self::GenericClass::•<Null>();
+  Null localNever = null;
+  Null localNull = null;
   dynamic inferredLocalNever = nev::optInNever;
   localNever = localNever;
   self::optOutNever = localNever;
@@ -109,29 +109,29 @@
   localNull = localNull;
   self::inferredOptOutNever = localNull;
   inferredLocalNever = localNull;
-  localNever = self::inferredOptOutNever as{TypeError,ForDynamic} core::Null?;
-  self::optOutNever = self::inferredOptOutNever as{TypeError,ForDynamic} core::Null?;
+  localNever = self::inferredOptOutNever as{TypeError,ForDynamic} Null;
+  self::optOutNever = self::inferredOptOutNever as{TypeError,ForDynamic} Null;
   nev::optInNever = self::inferredOptOutNever as{TypeError,ForDynamic} Never;
-  localNull = self::inferredOptOutNever as{TypeError,ForDynamic} core::Null?;
+  localNull = self::inferredOptOutNever as{TypeError,ForDynamic} Null;
   self::inferredOptOutNever = self::inferredOptOutNever;
   inferredLocalNever = self::inferredOptOutNever;
-  localNever = inferredLocalNever as{TypeError,ForDynamic} core::Null?;
-  self::optOutNever = inferredLocalNever as{TypeError,ForDynamic} core::Null?;
+  localNever = inferredLocalNever as{TypeError,ForDynamic} Null;
+  self::optOutNever = inferredLocalNever as{TypeError,ForDynamic} Null;
   nev::optInNever = inferredLocalNever as{TypeError,ForDynamic} Never;
-  localNull = inferredLocalNever as{TypeError,ForDynamic} core::Null?;
+  localNull = inferredLocalNever as{TypeError,ForDynamic} Null;
   self::inferredOptOutNever = inferredLocalNever;
   inferredLocalNever = inferredLocalNever;
-  self::throws(() → core::Null? => self::optOutNever = nev::throwing());
-  self::throws(() → core::Null? => localNever = nev::throwing());
-  self::throws(() → core::Null? => self::optOutNever = nev::throwing());
-  self::throws(() → core::Null? => nev::optInNever = nev::throwing());
-  self::throws(() → core::Null? => self::inferredOptOutNever = nev::throwing());
-  self::throws(() → core::Null? => inferredLocalNever = nev::throwing());
-  nev::BoundedGenericClass<core::Null?>* boundedGenericClass = new nev::BoundedGenericClass::•<core::Null?>();
-  self::throws(() → core::Null? {
-    dynamic boundedGenericMethodResult1 = nev::boundedGenericMethod1<core::Null?>();
+  self::throws(() → Null => self::optOutNever = nev::throwing());
+  self::throws(() → Null => localNever = nev::throwing());
+  self::throws(() → Null => self::optOutNever = nev::throwing());
+  self::throws(() → Null => nev::optInNever = nev::throwing());
+  self::throws(() → Null => self::inferredOptOutNever = nev::throwing());
+  self::throws(() → Null => inferredLocalNever = nev::throwing());
+  nev::BoundedGenericClass<Null>* boundedGenericClass = new nev::BoundedGenericClass::•<Null>();
+  self::throws(() → Null {
+    dynamic boundedGenericMethodResult1 = nev::boundedGenericMethod1<Null>();
   });
-  core::List<core::Null?>* boundedGenericMethodResult2 = nev::boundedGenericMethod2<core::Null?>();
+  core::List<Null>* boundedGenericMethodResult2 = nev::boundedGenericMethod2<Null>();
   dynamic dyn = null;
   nev::optInNever = dyn as{TypeError,ForDynamic} Never;
 }
@@ -154,7 +154,7 @@
 
 class A extends core::Object {
   field Never neverField = throw "Should not reach here";
-  field core::Null? nullField = null;
+  field Null nullField = null;
   synthetic constructor •() → nev::A
     : super core::Object::•()
     ;
@@ -163,11 +163,11 @@
   get neverProperty() → Never
     return throw "Should not reach here";
   set neverProperty(Never value) → void {}
-  method nullMethod(core::Null? value) → core::Null?
+  method nullMethod(Null value) → Null
     return value;
-  get nullProperty() → core::Null?
+  get nullProperty() → Null
     return null;
-  set nullProperty(core::Null? value) → void {}
+  set nullProperty(Null value) → void {}
 }
 class BoundedGenericClass<T extends Never = Never> extends core::Object {
   synthetic constructor •() → nev::BoundedGenericClass<nev::BoundedGenericClass::T>
@@ -184,5 +184,5 @@
 
 
 Extra constant evaluation status:
-Evaluated: TypeLiteral @ org-dartlang-testcase:///never_opt_out.dart:19:20 -> TypeLiteralConstant(Null?)
+Evaluated: TypeLiteral @ org-dartlang-testcase:///never_opt_out.dart:19:20 -> TypeLiteralConstant(Null)
 Extra constant evaluation: evaluated: 136, effectively constant: 1
diff --git a/pkg/front_end/testcases/nnbd_mixed/nsm_from_opt_in.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/nsm_from_opt_in.dart.weak.expect
index 52e8458..561c9cb 100644
--- a/pkg/front_end/testcases/nnbd_mixed/nsm_from_opt_in.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/nsm_from_opt_in.dart.weak.expect
@@ -35,7 +35,7 @@
   method noSuchMethod(core::Invocation* invocation) → dynamic {
     return super.{core::Object::noSuchMethod}(invocation);
   }
-  abstract forwarding-stub method method(core::int* i, {dynamic optional = #C2}) → core::int*;
+  abstract member-signature method method(core::int* i, {dynamic optional = #C2}) → core::int*; -> self::C2::method
   abstract member-signature method genericMethod1<T extends core::Object* = dynamic>(self::B2::genericMethod1::T* t) → self::B2::genericMethod1::T*; -> nsm::A::genericMethod1
   abstract member-signature method genericMethod2<T extends core::Object* = core::Object*>(self::B2::genericMethod2::T* t) → self::B2::genericMethod2::T*; -> nsm::A::genericMethod2
   abstract member-signature method genericMethod3<T extends core::Object* = core::Object*>(self::B2::genericMethod3::T* t) → self::B2::genericMethod3::T*; -> nsm::A::genericMethod3
@@ -95,7 +95,7 @@
   method noSuchMethod(core::Invocation invocation) → dynamic {
     return super.{core::Object::noSuchMethod}(invocation);
   }
-  abstract forwarding-stub method method(core::int? i, {dynamic optional = #C2}) → core::int;
+  abstract member-signature method method(core::int? i, {dynamic optional = #C2}) → core::int; -> nsm::C1::method
 }
 abstract class C1 extends core::Object {
   synthetic constructor •() → nsm::C1
diff --git a/pkg/front_end/testcases/nnbd_mixed/nsm_from_opt_in.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/nsm_from_opt_in.dart.weak.transformed.expect
index 52e8458..561c9cb 100644
--- a/pkg/front_end/testcases/nnbd_mixed/nsm_from_opt_in.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/nsm_from_opt_in.dart.weak.transformed.expect
@@ -35,7 +35,7 @@
   method noSuchMethod(core::Invocation* invocation) → dynamic {
     return super.{core::Object::noSuchMethod}(invocation);
   }
-  abstract forwarding-stub method method(core::int* i, {dynamic optional = #C2}) → core::int*;
+  abstract member-signature method method(core::int* i, {dynamic optional = #C2}) → core::int*; -> self::C2::method
   abstract member-signature method genericMethod1<T extends core::Object* = dynamic>(self::B2::genericMethod1::T* t) → self::B2::genericMethod1::T*; -> nsm::A::genericMethod1
   abstract member-signature method genericMethod2<T extends core::Object* = core::Object*>(self::B2::genericMethod2::T* t) → self::B2::genericMethod2::T*; -> nsm::A::genericMethod2
   abstract member-signature method genericMethod3<T extends core::Object* = core::Object*>(self::B2::genericMethod3::T* t) → self::B2::genericMethod3::T*; -> nsm::A::genericMethod3
@@ -95,7 +95,7 @@
   method noSuchMethod(core::Invocation invocation) → dynamic {
     return super.{core::Object::noSuchMethod}(invocation);
   }
-  abstract forwarding-stub method method(core::int? i, {dynamic optional = #C2}) → core::int;
+  abstract member-signature method method(core::int? i, {dynamic optional = #C2}) → core::int; -> nsm::C1::method
 }
 abstract class C1 extends core::Object {
   synthetic constructor •() → nsm::C1
diff --git a/pkg/front_end/testcases/nnbd_mixed/regress_null_aware.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/regress_null_aware.dart.weak.expect
index 8d088bb..4ca139e 100644
--- a/pkg/front_end/testcases/nnbd_mixed/regress_null_aware.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/regress_null_aware.dart.weak.expect
@@ -11,11 +11,11 @@
   method method(core::String* node, core::Set<core::String*>* set) → core::List<core::String*>*
     return set.{core::Set::add}(node) ?{core::List<core::String*>*} block {
       final core::List<core::String*>* #t1 = <core::String*>[];
-      #t1.{core::List::add}(node);
+      #t1.{core::List::add}{Invariant}(node);
       final core::Iterable<core::String*>* #t2 = let final core::Iterable<core::String*>* #t3 = let final core::Set<core::String*>* #t4 = this.{self::Class::map}.{core::Map::[]}(node) in #t4.{core::Object::==}(null) ?{core::Iterable<core::String*>*} null : #t4.{core::Iterable::expand}<core::String*>((core::String* node) → core::List<core::String*>* => this.{self::Class::method}(node, set)) in #t3.{core::Object::==}(null) ?{core::List<core::String*>*} null : #t3.{core::Iterable::toList}();
       if(!#t2.{core::Object::==}(null))
         for (final core::String* #t5 in #t2)
-          #t1.{core::List::add}(#t5);
+          #t1.{core::List::add}{Invariant}(#t5);
     } =>#t1 : <core::String*>[];
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -30,5 +30,7 @@
 }
 static method main(dynamic args) → dynamic {
   if(false)
-    new self::Class::•().{self::Class::method}("", let final core::Set<core::String*>* #t6 = col::LinkedHashSet::•<core::String*>() in #t6);
+    new self::Class::•().{self::Class::method}("", block {
+      final core::Set<core::String*>* #t6 = col::LinkedHashSet::•<core::String*>();
+    } =>#t6);
 }
diff --git a/pkg/front_end/testcases/nnbd_mixed/regress_null_aware.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/regress_null_aware.dart.weak.transformed.expect
index 67fece5..32474f7 100644
--- a/pkg/front_end/testcases/nnbd_mixed/regress_null_aware.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/regress_null_aware.dart.weak.transformed.expect
@@ -11,13 +11,13 @@
   method method(core::String* node, core::Set<core::String*>* set) → core::List<core::String*>*
     return set.{core::Set::add}(node) ?{core::List<core::String*>*} block {
       final core::List<core::String*>* #t1 = <core::String*>[];
-      #t1.{core::List::add}(node);
+      #t1.{core::List::add}{Invariant}(node);
       final core::Iterable<core::String*>* #t2 = let final core::Iterable<core::String*>* #t3 = let final core::Set<core::String*>* #t4 = this.{self::Class::map}.{core::Map::[]}(node) in #t4.{core::Object::==}(null) ?{core::Iterable<core::String*>*} null : #t4.{core::Iterable::expand}<core::String*>((core::String* node) → core::List<core::String*>* => this.{self::Class::method}(node, set)) in #t3.{core::Object::==}(null) ?{core::List<core::String*>*} null : #t3.{core::Iterable::toList}();
       if(!#t2.{core::Object::==}(null)) {
         core::Iterator<core::String*>* :sync-for-iterator = #t2.{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
           final core::String* #t5 = :sync-for-iterator.{core::Iterator::current};
-          #t1.{core::List::add}(#t5);
+          #t1.{core::List::add}{Invariant}(#t5);
         }
       }
     } =>#t1 : <core::String*>[];
@@ -34,5 +34,7 @@
 }
 static method main(dynamic args) → dynamic {
   if(false)
-    new self::Class::•().{self::Class::method}("", let final core::Set<core::String*>* #t6 = new col::_CompactLinkedHashSet::•<core::String*>() in #t6);
+    new self::Class::•().{self::Class::method}("", block {
+      final core::Set<core::String*>* #t6 = new col::_CompactLinkedHashSet::•<core::String*>();
+    } =>#t6);
 }
diff --git a/pkg/front_end/testcases/nnbd_mixed/required_name_override.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/required_name_override.dart.weak.expect
index a7d11cd..e2f0b61 100644
--- a/pkg/front_end/testcases/nnbd_mixed/required_name_override.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/required_name_override.dart.weak.expect
@@ -36,7 +36,7 @@
   method test_default({required core::int? i = #C1}) → void {}
   method test_nondefault({required core::int? i = #C1}) → void {}
   method test_legacy({required core::int? i = #C1}) → void {}
-  abstract forwarding-stub operator ==(dynamic other) → core::bool*;
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
 }
 static method main() → dynamic {
   new self::A::•().{self::A::test_default}(i: 1);
diff --git a/pkg/front_end/testcases/nnbd_mixed/required_name_override.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/required_name_override.dart.weak.transformed.expect
index a7d11cd..e2f0b61 100644
--- a/pkg/front_end/testcases/nnbd_mixed/required_name_override.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/required_name_override.dart.weak.transformed.expect
@@ -36,7 +36,7 @@
   method test_default({required core::int? i = #C1}) → void {}
   method test_nondefault({required core::int? i = #C1}) → void {}
   method test_legacy({required core::int? i = #C1}) → void {}
-  abstract forwarding-stub operator ==(dynamic other) → core::bool*;
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
 }
 static method main() → dynamic {
   new self::A::•().{self::A::test_default}(i: 1);
diff --git a/pkg/front_end/testcases/nnbd_mixed/super_access/main.dart b/pkg/front_end/testcases/nnbd_mixed/super_access/main.dart
new file mode 100644
index 0000000..e256d1e
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/super_access/main.dart
@@ -0,0 +1,19 @@
+// Copyright (c) 2020, 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.
+
+// @dart=2.9
+
+import 'main_lib1.dart';
+import 'main_lib2.dart';
+
+class Class<T> with Mixin1<T>, Mixin2<T> {
+  set field(Typedef value) {
+    super.field;
+    super.field = value;
+    super.method1();
+    super.method2(null);
+  }
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/super_access/main.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd_mixed/super_access/main.dart.textual_outline.expect
new file mode 100644
index 0000000..0cd68c4
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/super_access/main.dart.textual_outline.expect
@@ -0,0 +1,9 @@
+// @dart = 2.9
+import 'main_lib1.dart';
+import 'main_lib2.dart';
+
+class Class<T> with Mixin1<T>, Mixin2<T> {
+  set field(Typedef value) {}
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/super_access/main.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/nnbd_mixed/super_access/main.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..0cd68c4
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/super_access/main.dart.textual_outline_modelled.expect
@@ -0,0 +1,9 @@
+// @dart = 2.9
+import 'main_lib1.dart';
+import 'main_lib2.dart';
+
+class Class<T> with Mixin1<T>, Mixin2<T> {
+  set field(Typedef value) {}
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/super_access/main.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/super_access/main.dart.weak.expect
new file mode 100644
index 0000000..e157b1f
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/super_access/main.dart.weak.expect
@@ -0,0 +1,111 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "main_lib1.dart" as mai;
+import "main_lib2.dart" as mai2;
+
+import "org-dartlang-testcase:///main_lib1.dart";
+import "org-dartlang-testcase:///main_lib2.dart";
+
+abstract class _Class&Object&Mixin1<T extends core::Object* = dynamic> = core::Object with mai::Mixin1<self::_Class&Object&Mixin1::T*> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_Class&Object&Mixin1<self::_Class&Object&Mixin1::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _Class&Object&Mixin1&Mixin2<T extends core::Object* = dynamic> = self::_Class&Object&Mixin1<self::_Class&Object&Mixin1&Mixin2::T*> with mai::Mixin2<self::_Class&Object&Mixin1&Mixin2::T*> /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Object&Mixin1&Mixin2<self::_Class&Object&Mixin1&Mixin2::T*>*
+    : super self::_Class&Object&Mixin1::•()
+    ;
+  abstract member-signature set field((dynamic) →* core::Type* value) → void; -> mai::Mixin2::field
+  abstract member-signature get field() → (dynamic) →* core::Type*; -> mai::Mixin2::field
+  abstract member-signature method method1() → (dynamic) →* core::Type*; -> mai::Mixin2::method1
+  abstract member-signature method method2((dynamic) →* core::Type* t) → void; -> mai::Mixin2::method2
+}
+class Class<T extends core::Object* = dynamic> extends self::_Class&Object&Mixin1&Mixin2<self::Class::T*> {
+  synthetic constructor •() → self::Class<self::Class::T*>*
+    : super self::_Class&Object&Mixin1&Mixin2::•()
+    ;
+  set field((dynamic) →* core::Type value) → void {
+    super.{mai::Mixin2::field};
+    super.{self::_Class&Object&Mixin1&Mixin2::field} = value;
+    super.{mai::Mixin2::method1}();
+    super.{mai::Mixin2::method2}(null);
+  }
+}
+static method main() → dynamic {}
+
+library;
+import self as mai;
+import "dart:core" as core;
+import "main_lib2.dart" as mai2;
+
+import "org-dartlang-testcase:///main_lib2.dart";
+
+abstract class Mixin1<T extends core::Object* = dynamic> extends core::Object implements mai2::Interface<mai2::Value<dynamic>*, core::Object*> {
+  synthetic constructor •() → mai::Mixin1<mai::Mixin1::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature set field((core::Object*) →* core::Type* value) → void; -> mai2::Interface::field
+  abstract member-signature get field() → (core::Object*) →* core::Type*; -> mai2::Interface::field
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  abstract member-signature method method1() → (core::Object*) →* core::Type*; -> mai2::Interface::method1
+  abstract member-signature method method2((core::Object*) →* core::Type* t) → void; -> mai2::Interface::method2
+}
+abstract class Mixin2<T extends core::Object* = dynamic> extends core::Object implements mai2::Interface<mai2::Value<dynamic>*, core::Object*> {
+  field (dynamic) →* core::Type field = null;
+  synthetic constructor •() → mai::Mixin2<mai::Mixin2::T*>*
+    : super core::Object::•()
+    ;
+  method method1() → (dynamic) →* core::Type
+    return null;
+  method method2((dynamic) →* core::Type t) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+
+library /*isNonNullableByDefault*/;
+import self as mai2;
+import "dart:core" as core;
+
+typedef Typedef<unrelated T extends mai2::Value<dynamic> = mai2::Value<dynamic>, contravariant I extends core::Object? = dynamic> = (I%) → core::Type;
+abstract class Value<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → mai2::Value<mai2::Value::T%>
+    : super core::Object::•()
+    ;
+}
+class Interface<T extends mai2::Value<dynamic> = mai2::Value<dynamic>, I extends core::Object? = dynamic> extends core::Object {
+  field (mai2::Interface::I%) →? core::Type field = null;
+  synthetic constructor •() → mai2::Interface<mai2::Interface::T, mai2::Interface::I%>
+    : super core::Object::•()
+    ;
+  method method1() → (mai2::Interface::I%) →? core::Type
+    return null;
+  method method2((mai2::Interface::I%) →? core::Type t) → void {}
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/super_access/main.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/super_access/main.dart.weak.transformed.expect
new file mode 100644
index 0000000..cf90354
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/super_access/main.dart.weak.transformed.expect
@@ -0,0 +1,125 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "main_lib1.dart" as mai;
+import "main_lib2.dart" as mai2;
+
+import "org-dartlang-testcase:///main_lib1.dart";
+import "org-dartlang-testcase:///main_lib2.dart";
+
+abstract class _Class&Object&Mixin1<T extends core::Object* = dynamic> extends core::Object implements mai::Mixin1<self::_Class&Object&Mixin1::T*> /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_Class&Object&Mixin1<self::_Class&Object&Mixin1::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get /* from org-dartlang-testcase:///main_lib1.dart */ _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method /* from org-dartlang-testcase:///main_lib1.dart */ _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method /* from org-dartlang-testcase:///main_lib1.dart */ _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method /* from org-dartlang-testcase:///main_lib1.dart */ _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method /* from org-dartlang-testcase:///main_lib1.dart */ _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator /* from org-dartlang-testcase:///main_lib1.dart */ ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get /* from org-dartlang-testcase:///main_lib1.dart */ hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method /* from org-dartlang-testcase:///main_lib1.dart */ toString() → core::String*; -> core::Object::toString
+  abstract member-signature method /* from org-dartlang-testcase:///main_lib1.dart */ noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get /* from org-dartlang-testcase:///main_lib1.dart */ runtimeType() → core::Type*; -> core::Object::runtimeType
+  abstract member-signature set /* from org-dartlang-testcase:///main_lib1.dart */ field((core::Object*) →* core::Type* value) → void; -> mai2::Interface::field
+  abstract member-signature get /* from org-dartlang-testcase:///main_lib1.dart */ field() → (core::Object*) →* core::Type*; -> mai2::Interface::field
+  abstract member-signature method /* from org-dartlang-testcase:///main_lib1.dart */ method1() → (core::Object*) →* core::Type*; -> mai2::Interface::method1
+  abstract member-signature method /* from org-dartlang-testcase:///main_lib1.dart */ method2((core::Object*) →* core::Type* t) → void; -> mai2::Interface::method2
+}
+abstract class _Class&Object&Mixin1&Mixin2<T extends core::Object* = dynamic> extends self::_Class&Object&Mixin1<self::_Class&Object&Mixin1&Mixin2::T*> implements mai::Mixin2<self::_Class&Object&Mixin1&Mixin2::T*> /*isAnonymousMixin,isEliminatedMixin*/  {
+  field (dynamic) →* core::Type field = null /* from org-dartlang-testcase:///main_lib1.dart */;
+  synthetic constructor •() → self::_Class&Object&Mixin1&Mixin2<self::_Class&Object&Mixin1&Mixin2::T*>*
+    : super self::_Class&Object&Mixin1::•()
+    ;
+  method /* from org-dartlang-testcase:///main_lib1.dart */ method1() → (dynamic) →* core::Type
+    return null;
+  method /* from org-dartlang-testcase:///main_lib1.dart */ method2((dynamic) →* core::Type t) → void {}
+  abstract member-signature get /* from org-dartlang-testcase:///main_lib1.dart */ _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method /* from org-dartlang-testcase:///main_lib1.dart */ _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method /* from org-dartlang-testcase:///main_lib1.dart */ _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method /* from org-dartlang-testcase:///main_lib1.dart */ _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method /* from org-dartlang-testcase:///main_lib1.dart */ _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator /* from org-dartlang-testcase:///main_lib1.dart */ ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get /* from org-dartlang-testcase:///main_lib1.dart */ hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method /* from org-dartlang-testcase:///main_lib1.dart */ toString() → core::String*; -> core::Object::toString
+  abstract member-signature method /* from org-dartlang-testcase:///main_lib1.dart */ noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get /* from org-dartlang-testcase:///main_lib1.dart */ runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Class<T extends core::Object* = dynamic> extends self::_Class&Object&Mixin1&Mixin2<self::Class::T*> {
+  synthetic constructor •() → self::Class<self::Class::T*>*
+    : super self::_Class&Object&Mixin1&Mixin2::•()
+    ;
+  set field((dynamic) →* core::Type value) → void {
+    super.{mai::Mixin2::field};
+    super.{self::_Class&Object&Mixin1&Mixin2::field} = value;
+    super.{mai::Mixin2::method1}();
+    super.{mai::Mixin2::method2}(null);
+  }
+}
+static method main() → dynamic {}
+
+library;
+import self as mai;
+import "dart:core" as core;
+import "main_lib2.dart" as mai2;
+
+import "org-dartlang-testcase:///main_lib2.dart";
+
+abstract class Mixin1<T extends core::Object* = dynamic> extends core::Object implements mai2::Interface<mai2::Value<dynamic>*, core::Object*> {
+  synthetic constructor •() → mai::Mixin1<mai::Mixin1::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature set field((core::Object*) →* core::Type* value) → void; -> mai2::Interface::field
+  abstract member-signature get field() → (core::Object*) →* core::Type*; -> mai2::Interface::field
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  abstract member-signature method method1() → (core::Object*) →* core::Type*; -> mai2::Interface::method1
+  abstract member-signature method method2((core::Object*) →* core::Type* t) → void; -> mai2::Interface::method2
+}
+abstract class Mixin2<T extends core::Object* = dynamic> extends core::Object implements mai2::Interface<mai2::Value<dynamic>*, core::Object*> {
+  field (dynamic) →* core::Type field = null;
+  synthetic constructor •() → mai::Mixin2<mai::Mixin2::T*>*
+    : super core::Object::•()
+    ;
+  method method1() → (dynamic) →* core::Type
+    return null;
+  method method2((dynamic) →* core::Type t) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+
+library /*isNonNullableByDefault*/;
+import self as mai2;
+import "dart:core" as core;
+
+typedef Typedef<unrelated T extends mai2::Value<dynamic> = mai2::Value<dynamic>, contravariant I extends core::Object? = dynamic> = (I%) → core::Type;
+abstract class Value<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → mai2::Value<mai2::Value::T%>
+    : super core::Object::•()
+    ;
+}
+class Interface<T extends mai2::Value<dynamic> = mai2::Value<dynamic>, I extends core::Object? = dynamic> extends core::Object {
+  field (mai2::Interface::I%) →? core::Type field = null;
+  synthetic constructor •() → mai2::Interface<mai2::Interface::T, mai2::Interface::I%>
+    : super core::Object::•()
+    ;
+  method method1() → (mai2::Interface::I%) →? core::Type
+    return null;
+  method method2((mai2::Interface::I%) →? core::Type t) → void {}
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/super_access/main.no_link.dart b/pkg/front_end/testcases/nnbd_mixed/super_access/main.no_link.dart
new file mode 100644
index 0000000..e256d1e
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/super_access/main.no_link.dart
@@ -0,0 +1,19 @@
+// Copyright (c) 2020, 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.
+
+// @dart=2.9
+
+import 'main_lib1.dart';
+import 'main_lib2.dart';
+
+class Class<T> with Mixin1<T>, Mixin2<T> {
+  set field(Typedef value) {
+    super.field;
+    super.field = value;
+    super.method1();
+    super.method2(null);
+  }
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/super_access/main.no_link.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd_mixed/super_access/main.no_link.dart.textual_outline.expect
new file mode 100644
index 0000000..0cd68c4
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/super_access/main.no_link.dart.textual_outline.expect
@@ -0,0 +1,9 @@
+// @dart = 2.9
+import 'main_lib1.dart';
+import 'main_lib2.dart';
+
+class Class<T> with Mixin1<T>, Mixin2<T> {
+  set field(Typedef value) {}
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/super_access/main.no_link.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/nnbd_mixed/super_access/main.no_link.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..0cd68c4
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/super_access/main.no_link.dart.textual_outline_modelled.expect
@@ -0,0 +1,9 @@
+// @dart = 2.9
+import 'main_lib1.dart';
+import 'main_lib2.dart';
+
+class Class<T> with Mixin1<T>, Mixin2<T> {
+  set field(Typedef value) {}
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/super_access/main.no_link.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/super_access/main.no_link.dart.weak.expect
new file mode 100644
index 0000000..e157b1f
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/super_access/main.no_link.dart.weak.expect
@@ -0,0 +1,111 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "main_lib1.dart" as mai;
+import "main_lib2.dart" as mai2;
+
+import "org-dartlang-testcase:///main_lib1.dart";
+import "org-dartlang-testcase:///main_lib2.dart";
+
+abstract class _Class&Object&Mixin1<T extends core::Object* = dynamic> = core::Object with mai::Mixin1<self::_Class&Object&Mixin1::T*> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_Class&Object&Mixin1<self::_Class&Object&Mixin1::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _Class&Object&Mixin1&Mixin2<T extends core::Object* = dynamic> = self::_Class&Object&Mixin1<self::_Class&Object&Mixin1&Mixin2::T*> with mai::Mixin2<self::_Class&Object&Mixin1&Mixin2::T*> /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Object&Mixin1&Mixin2<self::_Class&Object&Mixin1&Mixin2::T*>*
+    : super self::_Class&Object&Mixin1::•()
+    ;
+  abstract member-signature set field((dynamic) →* core::Type* value) → void; -> mai::Mixin2::field
+  abstract member-signature get field() → (dynamic) →* core::Type*; -> mai::Mixin2::field
+  abstract member-signature method method1() → (dynamic) →* core::Type*; -> mai::Mixin2::method1
+  abstract member-signature method method2((dynamic) →* core::Type* t) → void; -> mai::Mixin2::method2
+}
+class Class<T extends core::Object* = dynamic> extends self::_Class&Object&Mixin1&Mixin2<self::Class::T*> {
+  synthetic constructor •() → self::Class<self::Class::T*>*
+    : super self::_Class&Object&Mixin1&Mixin2::•()
+    ;
+  set field((dynamic) →* core::Type value) → void {
+    super.{mai::Mixin2::field};
+    super.{self::_Class&Object&Mixin1&Mixin2::field} = value;
+    super.{mai::Mixin2::method1}();
+    super.{mai::Mixin2::method2}(null);
+  }
+}
+static method main() → dynamic {}
+
+library;
+import self as mai;
+import "dart:core" as core;
+import "main_lib2.dart" as mai2;
+
+import "org-dartlang-testcase:///main_lib2.dart";
+
+abstract class Mixin1<T extends core::Object* = dynamic> extends core::Object implements mai2::Interface<mai2::Value<dynamic>*, core::Object*> {
+  synthetic constructor •() → mai::Mixin1<mai::Mixin1::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature set field((core::Object*) →* core::Type* value) → void; -> mai2::Interface::field
+  abstract member-signature get field() → (core::Object*) →* core::Type*; -> mai2::Interface::field
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  abstract member-signature method method1() → (core::Object*) →* core::Type*; -> mai2::Interface::method1
+  abstract member-signature method method2((core::Object*) →* core::Type* t) → void; -> mai2::Interface::method2
+}
+abstract class Mixin2<T extends core::Object* = dynamic> extends core::Object implements mai2::Interface<mai2::Value<dynamic>*, core::Object*> {
+  field (dynamic) →* core::Type field = null;
+  synthetic constructor •() → mai::Mixin2<mai::Mixin2::T*>*
+    : super core::Object::•()
+    ;
+  method method1() → (dynamic) →* core::Type
+    return null;
+  method method2((dynamic) →* core::Type t) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+
+library /*isNonNullableByDefault*/;
+import self as mai2;
+import "dart:core" as core;
+
+typedef Typedef<unrelated T extends mai2::Value<dynamic> = mai2::Value<dynamic>, contravariant I extends core::Object? = dynamic> = (I%) → core::Type;
+abstract class Value<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → mai2::Value<mai2::Value::T%>
+    : super core::Object::•()
+    ;
+}
+class Interface<T extends mai2::Value<dynamic> = mai2::Value<dynamic>, I extends core::Object? = dynamic> extends core::Object {
+  field (mai2::Interface::I%) →? core::Type field = null;
+  synthetic constructor •() → mai2::Interface<mai2::Interface::T, mai2::Interface::I%>
+    : super core::Object::•()
+    ;
+  method method1() → (mai2::Interface::I%) →? core::Type
+    return null;
+  method method2((mai2::Interface::I%) →? core::Type t) → void {}
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/super_access/main.no_link.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/super_access/main.no_link.dart.weak.transformed.expect
new file mode 100644
index 0000000..cf90354
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/super_access/main.no_link.dart.weak.transformed.expect
@@ -0,0 +1,125 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "main_lib1.dart" as mai;
+import "main_lib2.dart" as mai2;
+
+import "org-dartlang-testcase:///main_lib1.dart";
+import "org-dartlang-testcase:///main_lib2.dart";
+
+abstract class _Class&Object&Mixin1<T extends core::Object* = dynamic> extends core::Object implements mai::Mixin1<self::_Class&Object&Mixin1::T*> /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_Class&Object&Mixin1<self::_Class&Object&Mixin1::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get /* from org-dartlang-testcase:///main_lib1.dart */ _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method /* from org-dartlang-testcase:///main_lib1.dart */ _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method /* from org-dartlang-testcase:///main_lib1.dart */ _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method /* from org-dartlang-testcase:///main_lib1.dart */ _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method /* from org-dartlang-testcase:///main_lib1.dart */ _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator /* from org-dartlang-testcase:///main_lib1.dart */ ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get /* from org-dartlang-testcase:///main_lib1.dart */ hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method /* from org-dartlang-testcase:///main_lib1.dart */ toString() → core::String*; -> core::Object::toString
+  abstract member-signature method /* from org-dartlang-testcase:///main_lib1.dart */ noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get /* from org-dartlang-testcase:///main_lib1.dart */ runtimeType() → core::Type*; -> core::Object::runtimeType
+  abstract member-signature set /* from org-dartlang-testcase:///main_lib1.dart */ field((core::Object*) →* core::Type* value) → void; -> mai2::Interface::field
+  abstract member-signature get /* from org-dartlang-testcase:///main_lib1.dart */ field() → (core::Object*) →* core::Type*; -> mai2::Interface::field
+  abstract member-signature method /* from org-dartlang-testcase:///main_lib1.dart */ method1() → (core::Object*) →* core::Type*; -> mai2::Interface::method1
+  abstract member-signature method /* from org-dartlang-testcase:///main_lib1.dart */ method2((core::Object*) →* core::Type* t) → void; -> mai2::Interface::method2
+}
+abstract class _Class&Object&Mixin1&Mixin2<T extends core::Object* = dynamic> extends self::_Class&Object&Mixin1<self::_Class&Object&Mixin1&Mixin2::T*> implements mai::Mixin2<self::_Class&Object&Mixin1&Mixin2::T*> /*isAnonymousMixin,isEliminatedMixin*/  {
+  field (dynamic) →* core::Type field = null /* from org-dartlang-testcase:///main_lib1.dart */;
+  synthetic constructor •() → self::_Class&Object&Mixin1&Mixin2<self::_Class&Object&Mixin1&Mixin2::T*>*
+    : super self::_Class&Object&Mixin1::•()
+    ;
+  method /* from org-dartlang-testcase:///main_lib1.dart */ method1() → (dynamic) →* core::Type
+    return null;
+  method /* from org-dartlang-testcase:///main_lib1.dart */ method2((dynamic) →* core::Type t) → void {}
+  abstract member-signature get /* from org-dartlang-testcase:///main_lib1.dart */ _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method /* from org-dartlang-testcase:///main_lib1.dart */ _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method /* from org-dartlang-testcase:///main_lib1.dart */ _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method /* from org-dartlang-testcase:///main_lib1.dart */ _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method /* from org-dartlang-testcase:///main_lib1.dart */ _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator /* from org-dartlang-testcase:///main_lib1.dart */ ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get /* from org-dartlang-testcase:///main_lib1.dart */ hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method /* from org-dartlang-testcase:///main_lib1.dart */ toString() → core::String*; -> core::Object::toString
+  abstract member-signature method /* from org-dartlang-testcase:///main_lib1.dart */ noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get /* from org-dartlang-testcase:///main_lib1.dart */ runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Class<T extends core::Object* = dynamic> extends self::_Class&Object&Mixin1&Mixin2<self::Class::T*> {
+  synthetic constructor •() → self::Class<self::Class::T*>*
+    : super self::_Class&Object&Mixin1&Mixin2::•()
+    ;
+  set field((dynamic) →* core::Type value) → void {
+    super.{mai::Mixin2::field};
+    super.{self::_Class&Object&Mixin1&Mixin2::field} = value;
+    super.{mai::Mixin2::method1}();
+    super.{mai::Mixin2::method2}(null);
+  }
+}
+static method main() → dynamic {}
+
+library;
+import self as mai;
+import "dart:core" as core;
+import "main_lib2.dart" as mai2;
+
+import "org-dartlang-testcase:///main_lib2.dart";
+
+abstract class Mixin1<T extends core::Object* = dynamic> extends core::Object implements mai2::Interface<mai2::Value<dynamic>*, core::Object*> {
+  synthetic constructor •() → mai::Mixin1<mai::Mixin1::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature set field((core::Object*) →* core::Type* value) → void; -> mai2::Interface::field
+  abstract member-signature get field() → (core::Object*) →* core::Type*; -> mai2::Interface::field
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  abstract member-signature method method1() → (core::Object*) →* core::Type*; -> mai2::Interface::method1
+  abstract member-signature method method2((core::Object*) →* core::Type* t) → void; -> mai2::Interface::method2
+}
+abstract class Mixin2<T extends core::Object* = dynamic> extends core::Object implements mai2::Interface<mai2::Value<dynamic>*, core::Object*> {
+  field (dynamic) →* core::Type field = null;
+  synthetic constructor •() → mai::Mixin2<mai::Mixin2::T*>*
+    : super core::Object::•()
+    ;
+  method method1() → (dynamic) →* core::Type
+    return null;
+  method method2((dynamic) →* core::Type t) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+
+library /*isNonNullableByDefault*/;
+import self as mai2;
+import "dart:core" as core;
+
+typedef Typedef<unrelated T extends mai2::Value<dynamic> = mai2::Value<dynamic>, contravariant I extends core::Object? = dynamic> = (I%) → core::Type;
+abstract class Value<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → mai2::Value<mai2::Value::T%>
+    : super core::Object::•()
+    ;
+}
+class Interface<T extends mai2::Value<dynamic> = mai2::Value<dynamic>, I extends core::Object? = dynamic> extends core::Object {
+  field (mai2::Interface::I%) →? core::Type field = null;
+  synthetic constructor •() → mai2::Interface<mai2::Interface::T, mai2::Interface::I%>
+    : super core::Object::•()
+    ;
+  method method1() → (mai2::Interface::I%) →? core::Type
+    return null;
+  method method2((mai2::Interface::I%) →? core::Type t) → void {}
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/super_access/main_lib1.dart b/pkg/front_end/testcases/nnbd_mixed/super_access/main_lib1.dart
new file mode 100644
index 0000000..ee49dbf
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/super_access/main_lib1.dart
@@ -0,0 +1,15 @@
+// Copyright (c) 2020, 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.
+
+// @dart=2.9
+
+import 'main_lib2.dart';
+
+abstract class Mixin1<T> implements Interface<Value, Object> {}
+
+abstract class Mixin2<T> implements Interface<Value, Object> {
+  Typedef field;
+  Typedef method1() => null;
+  void method2(Typedef t) {}
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/super_access/main_lib2.dart b/pkg/front_end/testcases/nnbd_mixed/super_access/main_lib2.dart
new file mode 100644
index 0000000..06013cc
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/super_access/main_lib2.dart
@@ -0,0 +1,13 @@
+// Copyright (c) 2020, 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.
+
+abstract class Value<T> {}
+
+typedef Typedef<T extends Value, I> = Type Function(I item);
+
+class Interface<T extends Value, I> {
+  Typedef<T, I>? field;
+  Typedef<T, I>? method1() => null;
+  void method2(Typedef<T, I>? t) {}
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/super_access/test.options b/pkg/front_end/testcases/nnbd_mixed/super_access/test.options
new file mode 100644
index 0000000..8400751
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/super_access/test.options
@@ -0,0 +1 @@
+main_lib2.dart
\ No newline at end of file
diff --git a/pkg/front_end/testcases/nnbd_mixed/unsound_checks.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/unsound_checks.dart.weak.expect
index 06a5216..20bc8a1 100644
--- a/pkg/front_end/testcases/nnbd_mixed/unsound_checks.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/unsound_checks.dart.weak.expect
@@ -247,15 +247,15 @@
   uns::promotionToNever(0);
   uns::promotionToNever(null);
   uns::unnecessaryNullCheck(() → core::int* => 0);
-  uns::unnecessaryNullCheck(() → core::Null? => null);
+  uns::unnecessaryNullCheck(() → Null => null);
   self::expect(0, uns::unnecessaryIfNull(() → core::int* => 0, () → core::int* => 42));
-  self::expect(42, uns::unnecessaryIfNull(() → core::Null? => null, () → core::int* => 42));
+  self::expect(42, uns::unnecessaryIfNull(() → Null => null, () → core::int* => 42));
   uns::unnecessaryIfNullAssign(<core::int*>[0], () → core::int* => 42);
   uns::unnecessaryIfNullAssign(<core::int*>[null], () → core::int* => 42);
   uns::unnecessaryNullAwareAccess(() → core::int* => 0);
-  uns::unnecessaryNullAwareAccess(() → core::Null? => null);
+  uns::unnecessaryNullAwareAccess(() → Null => null);
   self::throws(() → dynamic => uns::callReturningNever(() → <BottomType>=> throw "foo"), (core::Object* e) → core::bool* => e.{core::Object::==}("foo"));
-  () →* core::Null? f = () → core::Null? => null;
+  () →* Null f = () → Null => null;
   self::throws(() → dynamic => uns::callReturningNever(f));
   uns::switchOnEnum(#C3);
   uns::switchOnEnum(#C6);
diff --git a/pkg/front_end/testcases/nnbd_mixed/unsound_checks.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/unsound_checks.dart.weak.transformed.expect
index 908eb54..272a76b 100644
--- a/pkg/front_end/testcases/nnbd_mixed/unsound_checks.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/unsound_checks.dart.weak.transformed.expect
@@ -247,15 +247,15 @@
   uns::promotionToNever(0);
   uns::promotionToNever(null);
   uns::unnecessaryNullCheck(() → core::int* => 0);
-  uns::unnecessaryNullCheck(() → core::Null? => null);
+  uns::unnecessaryNullCheck(() → Null => null);
   self::expect(0, uns::unnecessaryIfNull(() → core::int* => 0, () → core::int* => 42));
-  self::expect(42, uns::unnecessaryIfNull(() → core::Null? => null, () → core::int* => 42));
+  self::expect(42, uns::unnecessaryIfNull(() → Null => null, () → core::int* => 42));
   uns::unnecessaryIfNullAssign(<core::int*>[0], () → core::int* => 42);
   uns::unnecessaryIfNullAssign(<core::int*>[null], () → core::int* => 42);
   uns::unnecessaryNullAwareAccess(() → core::int* => 0);
-  uns::unnecessaryNullAwareAccess(() → core::Null? => null);
+  uns::unnecessaryNullAwareAccess(() → Null => null);
   self::throws(() → dynamic => uns::callReturningNever(() → <BottomType>=> throw "foo"), (core::Object* e) → core::bool* => e.{core::Object::==}("foo"));
-  () →* core::Null? f = () → core::Null? => null;
+  () →* Null f = () → Null => null;
   self::throws(() → dynamic => uns::callReturningNever(f));
   uns::switchOnEnum(#C3);
   uns::switchOnEnum(#C6);
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.outline.expect
index 8348811..5a8b1a0 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.outline.expect
@@ -33,7 +33,7 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
   no-such-method-forwarder get foo() → core::List<core::int*>*
     return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 1, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) as{TypeError,ForDynamic} core::List<core::int*>*;
-  no-such-method-forwarder set foo(core::List<core::int*>* value) → void
+  no-such-method-forwarder set foo(generic-covariant-impl core::List<core::int*>* value) → void
     return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#foo=, 2, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
 }
 static method expectTypeError(() →* dynamic callback) → void
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.strong.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.strong.expect
index 4d819be..94eb66f 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.strong.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.strong.expect
@@ -35,7 +35,7 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
   no-such-method-forwarder get foo() → core::List<core::int*>*
     return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))) as{TypeError,ForDynamic} core::List<core::int*>*;
-  no-such-method-forwarder set foo(core::List<core::int*>* value) → void
+  no-such-method-forwarder set foo(generic-covariant-impl core::List<core::int*>* value) → void
     return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#C5, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
 }
 static method expectTypeError(() →* dynamic callback) → void {
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.strong.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.strong.transformed.expect
index 4d819be..94eb66f 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.strong.transformed.expect
@@ -35,7 +35,7 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
   no-such-method-forwarder get foo() → core::List<core::int*>*
     return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))) as{TypeError,ForDynamic} core::List<core::int*>*;
-  no-such-method-forwarder set foo(core::List<core::int*>* value) → void
+  no-such-method-forwarder set foo(generic-covariant-impl core::List<core::int*>* value) → void
     return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#C5, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
 }
 static method expectTypeError(() →* dynamic callback) → void {
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/duplicated_abstract_method.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/duplicated_abstract_method.dart.outline.expect
index 4dfd530..ce29ada 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/duplicated_abstract_method.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/duplicated_abstract_method.dart.outline.expect
@@ -54,8 +54,8 @@
 
 
 Extra constant evaluation status:
-Evaluated: SymbolLiteral @ org-dartlang-testcase:///duplicated_abstract_method.dart:14:8 -> SymbolConstant(#foo)
-Evaluated: ListLiteral @ org-dartlang-testcase:///duplicated_abstract_method.dart:14:8 -> ListConstant(const <Type*>[])
-Evaluated: ListLiteral @ org-dartlang-testcase:///duplicated_abstract_method.dart:14:8 -> ListConstant(const <dynamic>[])
-Evaluated: MapLiteral @ org-dartlang-testcase:///duplicated_abstract_method.dart:14:8 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///duplicated_abstract_method.dart:10:8 -> SymbolConstant(#foo)
+Evaluated: ListLiteral @ org-dartlang-testcase:///duplicated_abstract_method.dart:10:8 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///duplicated_abstract_method.dart:10:8 -> ListConstant(const <dynamic>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///duplicated_abstract_method.dart:10:8 -> InstanceConstant(const _ImmutableMap<Symbol*, dynamic>{_ImmutableMap._kvPairs: const <dynamic>[]})
 Extra constant evaluation: evaluated: 8, effectively constant: 4
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/folder.options b/pkg/front_end/testcases/no_such_method_forwarders/folder.options
new file mode 100644
index 0000000..dbc148e
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/folder.options
@@ -0,0 +1 @@
+--enable-experiment=no-non-nullable
\ No newline at end of file
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/multiple_abstract_setters.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/multiple_abstract_setters.dart.outline.expect
index 8a420c1..bc566ba 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/multiple_abstract_setters.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/multiple_abstract_setters.dart.outline.expect
@@ -43,7 +43,7 @@
     ;
   set foo(core::num* value) → void
     ;
-  get bar() → core::Null?
+  get bar() → Null
     ;
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -70,8 +70,8 @@
   abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
   abstract member-signature method toString() → core::String*; -> core::Object::toString
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
-  no-such-method-forwarder get bar() → core::Null?
-    return this.{self::D::noSuchMethod}(new core::_InvocationMirror::_withType(#bar, 1, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) as{TypeError,ForDynamic} core::Null?;
+  no-such-method-forwarder get bar() → Null
+    return this.{self::D::noSuchMethod}(new core::_InvocationMirror::_withType(#bar, 1, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) as{TypeError,ForDynamic} Null;
   no-such-method-forwarder set foo(core::num* value) → void
     return this.{self::D::noSuchMethod}(new core::_InvocationMirror::_withType(#foo=, 2, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
 }
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/multiple_abstract_setters.dart.strong.expect b/pkg/front_end/testcases/no_such_method_forwarders/multiple_abstract_setters.dart.strong.expect
index d9f1769..297ab3b 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/multiple_abstract_setters.dart.strong.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/multiple_abstract_setters.dart.strong.expect
@@ -43,7 +43,7 @@
     : super core::Object::•()
     ;
   set foo(core::num* value) → void {}
-  get bar() → core::Null?
+  get bar() → Null
     return null;
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -71,8 +71,8 @@
   abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
   abstract member-signature method toString() → core::String*; -> core::Object::toString
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
-  no-such-method-forwarder get bar() → core::Null?
-    return this.{self::D::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))) as{TypeError,ForDynamic} core::Null?;
+  no-such-method-forwarder get bar() → Null
+    return this.{self::D::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))) as{TypeError,ForDynamic} Null;
   no-such-method-forwarder set foo(core::num* value) → void
     return this.{self::D::noSuchMethod}(new core::_InvocationMirror::_withType(#C5, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
 }
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/multiple_abstract_setters.dart.strong.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/multiple_abstract_setters.dart.strong.transformed.expect
index d9f1769..297ab3b 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/multiple_abstract_setters.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/multiple_abstract_setters.dart.strong.transformed.expect
@@ -43,7 +43,7 @@
     : super core::Object::•()
     ;
   set foo(core::num* value) → void {}
-  get bar() → core::Null?
+  get bar() → Null
     return null;
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -71,8 +71,8 @@
   abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
   abstract member-signature method toString() → core::String*; -> core::Object::toString
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
-  no-such-method-forwarder get bar() → core::Null?
-    return this.{self::D::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))) as{TypeError,ForDynamic} core::Null?;
+  no-such-method-forwarder get bar() → Null
+    return this.{self::D::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))) as{TypeError,ForDynamic} Null;
   no-such-method-forwarder set foo(core::num* value) → void
     return this.{self::D::noSuchMethod}(new core::_InvocationMirror::_withType(#C5, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
 }
diff --git a/pkg/front_end/testcases/none/folder.options b/pkg/front_end/testcases/none/folder.options
new file mode 100644
index 0000000..725ee9f
--- /dev/null
+++ b/pkg/front_end/testcases/none/folder.options
@@ -0,0 +1 @@
+--target=none
\ No newline at end of file
diff --git a/pkg/front_end/testcases/none/mixin_application_declares/main.dart b/pkg/front_end/testcases/none/mixin_application_declares/main.dart
new file mode 100644
index 0000000..347a06c
--- /dev/null
+++ b/pkg/front_end/testcases/none/mixin_application_declares/main.dart
@@ -0,0 +1,11 @@
+// Copyright (c) 2020, 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 'main_lib.dart';
+
+class SubClass extends Class {}
+
+main() {
+  new SubClass();
+}
diff --git a/pkg/front_end/testcases/none/mixin_application_declares/main.dart.outline.expect b/pkg/front_end/testcases/none/mixin_application_declares/main.dart.outline.expect
new file mode 100644
index 0000000..e9e3bdd
--- /dev/null
+++ b/pkg/front_end/testcases/none/mixin_application_declares/main.dart.outline.expect
@@ -0,0 +1,40 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "main_lib.dart" as mai;
+
+import "org-dartlang-testcase:///main_lib.dart";
+
+class SubClass extends mai::Class {
+  synthetic constructor •() → self::SubClass
+    ;
+}
+static method main() → dynamic
+  ;
+
+library /*isNonNullableByDefault*/;
+import self as mai;
+import "dart:core" as core;
+
+class SuperClass extends core::Object {
+  synthetic constructor •() → mai::SuperClass
+    ;
+  method method(covariant core::int i) → void
+    ;
+}
+class Mixin extends core::Object {
+  synthetic constructor •() → mai::Mixin
+    ;
+  method method(core::num i) → void
+    ;
+}
+abstract class _Class&SuperClass&Mixin = mai::SuperClass with mai::Mixin /*isAnonymousMixin*/  {
+  synthetic constructor •() → mai::_Class&SuperClass&Mixin
+    : super mai::SuperClass::•()
+    ;
+  forwarding-stub method method(covariant core::num i) → void
+    return super.{mai::SuperClass::method}(i);
+}
+class Class extends mai::_Class&SuperClass&Mixin {
+  synthetic constructor •() → mai::Class
+    ;
+}
diff --git a/pkg/front_end/testcases/none/mixin_application_declares/main.dart.strong.expect b/pkg/front_end/testcases/none/mixin_application_declares/main.dart.strong.expect
new file mode 100644
index 0000000..cd8c81e
--- /dev/null
+++ b/pkg/front_end/testcases/none/mixin_application_declares/main.dart.strong.expect
@@ -0,0 +1,43 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "main_lib.dart" as mai;
+
+import "org-dartlang-testcase:///main_lib.dart";
+
+class SubClass extends mai::Class {
+  synthetic constructor •() → self::SubClass
+    : super mai::Class::•()
+    ;
+}
+static method main() → dynamic {
+  new self::SubClass::•();
+}
+
+library /*isNonNullableByDefault*/;
+import self as mai;
+import "dart:core" as core;
+
+class SuperClass extends core::Object {
+  synthetic constructor •() → mai::SuperClass
+    : super core::Object::•()
+    ;
+  method method(covariant core::int i) → void {}
+}
+class Mixin extends core::Object {
+  synthetic constructor •() → mai::Mixin
+    : super core::Object::•()
+    ;
+  method method(core::num i) → void {}
+}
+abstract class _Class&SuperClass&Mixin = mai::SuperClass with mai::Mixin /*isAnonymousMixin*/  {
+  synthetic constructor •() → mai::_Class&SuperClass&Mixin
+    : super mai::SuperClass::•()
+    ;
+  forwarding-stub method method(covariant core::num i) → void
+    return super.{mai::SuperClass::method}(i);
+}
+class Class extends mai::_Class&SuperClass&Mixin {
+  synthetic constructor •() → mai::Class
+    : super mai::_Class&SuperClass&Mixin::•()
+    ;
+}
diff --git a/pkg/front_end/testcases/none/mixin_application_declares/main.dart.strong.transformed.expect b/pkg/front_end/testcases/none/mixin_application_declares/main.dart.strong.transformed.expect
new file mode 100644
index 0000000..cd8c81e
--- /dev/null
+++ b/pkg/front_end/testcases/none/mixin_application_declares/main.dart.strong.transformed.expect
@@ -0,0 +1,43 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "main_lib.dart" as mai;
+
+import "org-dartlang-testcase:///main_lib.dart";
+
+class SubClass extends mai::Class {
+  synthetic constructor •() → self::SubClass
+    : super mai::Class::•()
+    ;
+}
+static method main() → dynamic {
+  new self::SubClass::•();
+}
+
+library /*isNonNullableByDefault*/;
+import self as mai;
+import "dart:core" as core;
+
+class SuperClass extends core::Object {
+  synthetic constructor •() → mai::SuperClass
+    : super core::Object::•()
+    ;
+  method method(covariant core::int i) → void {}
+}
+class Mixin extends core::Object {
+  synthetic constructor •() → mai::Mixin
+    : super core::Object::•()
+    ;
+  method method(core::num i) → void {}
+}
+abstract class _Class&SuperClass&Mixin = mai::SuperClass with mai::Mixin /*isAnonymousMixin*/  {
+  synthetic constructor •() → mai::_Class&SuperClass&Mixin
+    : super mai::SuperClass::•()
+    ;
+  forwarding-stub method method(covariant core::num i) → void
+    return super.{mai::SuperClass::method}(i);
+}
+class Class extends mai::_Class&SuperClass&Mixin {
+  synthetic constructor •() → mai::Class
+    : super mai::_Class&SuperClass&Mixin::•()
+    ;
+}
diff --git a/pkg/front_end/testcases/none/mixin_application_declares/main.dart.textual_outline.expect b/pkg/front_end/testcases/none/mixin_application_declares/main.dart.textual_outline.expect
new file mode 100644
index 0000000..1f10286
--- /dev/null
+++ b/pkg/front_end/testcases/none/mixin_application_declares/main.dart.textual_outline.expect
@@ -0,0 +1,5 @@
+import 'main_lib.dart';
+
+class SubClass extends Class {}
+
+main() {}
diff --git a/pkg/front_end/testcases/none/mixin_application_declares/main.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/none/mixin_application_declares/main.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..1f10286
--- /dev/null
+++ b/pkg/front_end/testcases/none/mixin_application_declares/main.dart.textual_outline_modelled.expect
@@ -0,0 +1,5 @@
+import 'main_lib.dart';
+
+class SubClass extends Class {}
+
+main() {}
diff --git a/pkg/front_end/testcases/none/mixin_application_declares/main.dart.weak.expect b/pkg/front_end/testcases/none/mixin_application_declares/main.dart.weak.expect
new file mode 100644
index 0000000..cd8c81e
--- /dev/null
+++ b/pkg/front_end/testcases/none/mixin_application_declares/main.dart.weak.expect
@@ -0,0 +1,43 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "main_lib.dart" as mai;
+
+import "org-dartlang-testcase:///main_lib.dart";
+
+class SubClass extends mai::Class {
+  synthetic constructor •() → self::SubClass
+    : super mai::Class::•()
+    ;
+}
+static method main() → dynamic {
+  new self::SubClass::•();
+}
+
+library /*isNonNullableByDefault*/;
+import self as mai;
+import "dart:core" as core;
+
+class SuperClass extends core::Object {
+  synthetic constructor •() → mai::SuperClass
+    : super core::Object::•()
+    ;
+  method method(covariant core::int i) → void {}
+}
+class Mixin extends core::Object {
+  synthetic constructor •() → mai::Mixin
+    : super core::Object::•()
+    ;
+  method method(core::num i) → void {}
+}
+abstract class _Class&SuperClass&Mixin = mai::SuperClass with mai::Mixin /*isAnonymousMixin*/  {
+  synthetic constructor •() → mai::_Class&SuperClass&Mixin
+    : super mai::SuperClass::•()
+    ;
+  forwarding-stub method method(covariant core::num i) → void
+    return super.{mai::SuperClass::method}(i);
+}
+class Class extends mai::_Class&SuperClass&Mixin {
+  synthetic constructor •() → mai::Class
+    : super mai::_Class&SuperClass&Mixin::•()
+    ;
+}
diff --git a/pkg/front_end/testcases/none/mixin_application_declares/main.dart.weak.transformed.expect b/pkg/front_end/testcases/none/mixin_application_declares/main.dart.weak.transformed.expect
new file mode 100644
index 0000000..cd8c81e
--- /dev/null
+++ b/pkg/front_end/testcases/none/mixin_application_declares/main.dart.weak.transformed.expect
@@ -0,0 +1,43 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "main_lib.dart" as mai;
+
+import "org-dartlang-testcase:///main_lib.dart";
+
+class SubClass extends mai::Class {
+  synthetic constructor •() → self::SubClass
+    : super mai::Class::•()
+    ;
+}
+static method main() → dynamic {
+  new self::SubClass::•();
+}
+
+library /*isNonNullableByDefault*/;
+import self as mai;
+import "dart:core" as core;
+
+class SuperClass extends core::Object {
+  synthetic constructor •() → mai::SuperClass
+    : super core::Object::•()
+    ;
+  method method(covariant core::int i) → void {}
+}
+class Mixin extends core::Object {
+  synthetic constructor •() → mai::Mixin
+    : super core::Object::•()
+    ;
+  method method(core::num i) → void {}
+}
+abstract class _Class&SuperClass&Mixin = mai::SuperClass with mai::Mixin /*isAnonymousMixin*/  {
+  synthetic constructor •() → mai::_Class&SuperClass&Mixin
+    : super mai::SuperClass::•()
+    ;
+  forwarding-stub method method(covariant core::num i) → void
+    return super.{mai::SuperClass::method}(i);
+}
+class Class extends mai::_Class&SuperClass&Mixin {
+  synthetic constructor •() → mai::Class
+    : super mai::_Class&SuperClass&Mixin::•()
+    ;
+}
diff --git a/pkg/front_end/testcases/none/mixin_application_declares/main_lib.dart b/pkg/front_end/testcases/none/mixin_application_declares/main_lib.dart
new file mode 100644
index 0000000..6f2553d
--- /dev/null
+++ b/pkg/front_end/testcases/none/mixin_application_declares/main_lib.dart
@@ -0,0 +1,13 @@
+// Copyright (c) 2020, 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.
+
+class SuperClass {
+  void method(covariant int i) {}
+}
+
+class Mixin {
+  void method(num i) {}
+}
+
+class Class extends SuperClass with Mixin {}
diff --git a/pkg/front_end/testcases/none/mixin_application_declares/test.options b/pkg/front_end/testcases/none/mixin_application_declares/test.options
new file mode 100644
index 0000000..bfe6dc8
--- /dev/null
+++ b/pkg/front_end/testcases/none/mixin_application_declares/test.options
@@ -0,0 +1 @@
+main_lib.dart
\ No newline at end of file
diff --git a/pkg/front_end/testcases/none/mixin_covariant.dart b/pkg/front_end/testcases/none/mixin_covariant.dart
new file mode 100644
index 0000000..8454114
--- /dev/null
+++ b/pkg/front_end/testcases/none/mixin_covariant.dart
@@ -0,0 +1,53 @@
+// Copyright (c) 2020, 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.
+
+class Superclass {
+  String method1(num argument1, num argument2) => "Superclass";
+  String method2(num argument1, num argument2) => "Superclass";
+  String method3(num argument1, covariant int argument2) => "Superclass";
+  String method4(num argument1, covariant num argument2) => "Superclass";
+}
+
+class Mixin {
+  String method1(num argument1, num argument2) => "Mixin";
+  String method2(covariant int argument1, num argument2) => "Mixin";
+  String method3(num argument1, num argument2) => "Mixin";
+  String method4(covariant int argument1, int argument2) => "Mixin";
+}
+
+class Class extends Superclass with Mixin {}
+
+main() {
+  Class c = new Class();
+  expect("Mixin", c.method1(0, 1));
+  expect("Mixin", c.method2(0, 1));
+  expect("Mixin", c.method3(0, 1));
+  expect("Mixin", c.method4(0, 1));
+
+  Superclass s = c;
+  expect("Mixin", s.method1(0.5, 1.5));
+  throws(() => s.method2(0.5, 1.5));
+  expect("Mixin", s.method3(0.5, 1));
+  throws(() => s.method4(0.5, 1));
+  expect("Mixin", s.method4(1, 0.5));
+
+  Mixin m = c;
+  expect("Mixin", m.method1(0, 1));
+  expect("Mixin", m.method2(0, 1));
+  expect("Mixin", m.method3(0, 1));
+  expect("Mixin", m.method4(0, 1));
+}
+
+void expect(expected, actual) {
+  if (expected != actual) throw 'Expected $expected, actual $actual';
+}
+
+void throws(void Function() f) {
+  try {
+    f();
+  } catch (_) {
+    return;
+  }
+  throw 'Expected exception';
+}
diff --git a/pkg/front_end/testcases/none/mixin_covariant.dart.outline.expect b/pkg/front_end/testcases/none/mixin_covariant.dart.outline.expect
new file mode 100644
index 0000000..a0757dd
--- /dev/null
+++ b/pkg/front_end/testcases/none/mixin_covariant.dart.outline.expect
@@ -0,0 +1,48 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Superclass extends core::Object {
+  synthetic constructor •() → self::Superclass
+    ;
+  method method1(core::num argument1, core::num argument2) → core::String
+    ;
+  method method2(core::num argument1, core::num argument2) → core::String
+    ;
+  method method3(core::num argument1, covariant core::int argument2) → core::String
+    ;
+  method method4(core::num argument1, covariant core::num argument2) → core::String
+    ;
+}
+class Mixin extends core::Object {
+  synthetic constructor •() → self::Mixin
+    ;
+  method method1(core::num argument1, core::num argument2) → core::String
+    ;
+  method method2(covariant core::int argument1, core::num argument2) → core::String
+    ;
+  method method3(core::num argument1, core::num argument2) → core::String
+    ;
+  method method4(covariant core::int argument1, core::int argument2) → core::String
+    ;
+}
+abstract class _Class&Superclass&Mixin = self::Superclass with self::Mixin /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Superclass&Mixin
+    : super self::Superclass::•()
+    ;
+  abstract forwarding-stub method method2(covariant core::num argument1, core::num argument2) → core::String;
+  forwarding-stub method method3(core::num argument1, covariant core::num argument2) → core::String
+    return super.{self::Superclass::method3}(argument1, argument2);
+  forwarding-stub method method4(covariant core::num argument1, covariant core::num argument2) → core::String
+    return super.{self::Superclass::method4}(argument1, argument2);
+}
+class Class extends self::_Class&Superclass&Mixin {
+  synthetic constructor •() → self::Class
+    ;
+}
+static method main() → dynamic
+  ;
+static method expect(dynamic expected, dynamic actual) → void
+  ;
+static method throws(() → void f) → void
+  ;
diff --git a/pkg/front_end/testcases/none/mixin_covariant.dart.strong.expect b/pkg/front_end/testcases/none/mixin_covariant.dart.strong.expect
new file mode 100644
index 0000000..412bbf0
--- /dev/null
+++ b/pkg/front_end/testcases/none/mixin_covariant.dart.strong.expect
@@ -0,0 +1,76 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Superclass extends core::Object {
+  synthetic constructor •() → self::Superclass
+    : super core::Object::•()
+    ;
+  method method1(core::num argument1, core::num argument2) → core::String
+    return "Superclass";
+  method method2(core::num argument1, core::num argument2) → core::String
+    return "Superclass";
+  method method3(core::num argument1, covariant core::int argument2) → core::String
+    return "Superclass";
+  method method4(core::num argument1, covariant core::num argument2) → core::String
+    return "Superclass";
+}
+class Mixin extends core::Object {
+  synthetic constructor •() → self::Mixin
+    : super core::Object::•()
+    ;
+  method method1(core::num argument1, core::num argument2) → core::String
+    return "Mixin";
+  method method2(covariant core::int argument1, core::num argument2) → core::String
+    return "Mixin";
+  method method3(core::num argument1, core::num argument2) → core::String
+    return "Mixin";
+  method method4(covariant core::int argument1, core::int argument2) → core::String
+    return "Mixin";
+}
+abstract class _Class&Superclass&Mixin = self::Superclass with self::Mixin /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Superclass&Mixin
+    : super self::Superclass::•()
+    ;
+  abstract forwarding-stub method method2(covariant core::num argument1, core::num argument2) → core::String;
+  forwarding-stub method method3(core::num argument1, covariant core::num argument2) → core::String
+    return super.{self::Superclass::method3}(argument1, argument2);
+  forwarding-stub method method4(covariant core::num argument1, covariant core::num argument2) → core::String
+    return super.{self::Superclass::method4}(argument1, argument2);
+}
+class Class extends self::_Class&Superclass&Mixin {
+  synthetic constructor •() → self::Class
+    : super self::_Class&Superclass&Mixin::•()
+    ;
+}
+static method main() → dynamic {
+  self::Class c = new self::Class::•();
+  self::expect("Mixin", c.{self::Mixin::method1}(0, 1));
+  self::expect("Mixin", c.{self::_Class&Superclass&Mixin::method2}(0, 1));
+  self::expect("Mixin", c.{self::_Class&Superclass&Mixin::method3}(0, 1));
+  self::expect("Mixin", c.{self::_Class&Superclass&Mixin::method4}(0, 1));
+  self::Superclass s = c;
+  self::expect("Mixin", s.{self::Superclass::method1}(0.5, 1.5));
+  self::throws(() → void => s.{self::Superclass::method2}(0.5, 1.5));
+  self::expect("Mixin", s.{self::Superclass::method3}(0.5, 1));
+  self::throws(() → void => s.{self::Superclass::method4}(0.5, 1));
+  self::expect("Mixin", s.{self::Superclass::method4}(1, 0.5));
+  self::Mixin m = c;
+  self::expect("Mixin", m.{self::Mixin::method1}(0, 1));
+  self::expect("Mixin", m.{self::Mixin::method2}(0, 1));
+  self::expect("Mixin", m.{self::Mixin::method3}(0, 1));
+  self::expect("Mixin", m.{self::Mixin::method4}(0, 1));
+}
+static method expect(dynamic expected, dynamic actual) → void {
+  if(!expected.{core::Object::==}(actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+static method throws(() → void f) → void {
+  try {
+    f.call();
+  }
+  on core::Object catch(final core::Object _) {
+    return;
+  }
+  throw "Expected exception";
+}
diff --git a/pkg/front_end/testcases/none/mixin_covariant.dart.textual_outline.expect b/pkg/front_end/testcases/none/mixin_covariant.dart.textual_outline.expect
new file mode 100644
index 0000000..6f22d96
--- /dev/null
+++ b/pkg/front_end/testcases/none/mixin_covariant.dart.textual_outline.expect
@@ -0,0 +1,19 @@
+class Superclass {
+  String method1(num argument1, num argument2) => "Superclass";
+  String method2(num argument1, num argument2) => "Superclass";
+  String method3(num argument1, covariant int argument2) => "Superclass";
+  String method4(num argument1, covariant num argument2) => "Superclass";
+}
+
+class Mixin {
+  String method1(num argument1, num argument2) => "Mixin";
+  String method2(covariant int argument1, num argument2) => "Mixin";
+  String method3(num argument1, num argument2) => "Mixin";
+  String method4(covariant int argument1, int argument2) => "Mixin";
+}
+
+class Class extends Superclass with Mixin {}
+
+main() {}
+void expect(expected, actual) {}
+void throws(void Function() f) {}
diff --git a/pkg/front_end/testcases/none/mixin_covariant.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/none/mixin_covariant.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..9f3d0b4
--- /dev/null
+++ b/pkg/front_end/testcases/none/mixin_covariant.dart.textual_outline_modelled.expect
@@ -0,0 +1,19 @@
+class Class extends Superclass with Mixin {}
+
+class Mixin {
+  String method1(num argument1, num argument2) => "Mixin";
+  String method2(covariant int argument1, num argument2) => "Mixin";
+  String method3(num argument1, num argument2) => "Mixin";
+  String method4(covariant int argument1, int argument2) => "Mixin";
+}
+
+class Superclass {
+  String method1(num argument1, num argument2) => "Superclass";
+  String method2(num argument1, num argument2) => "Superclass";
+  String method3(num argument1, covariant int argument2) => "Superclass";
+  String method4(num argument1, covariant num argument2) => "Superclass";
+}
+
+main() {}
+void expect(expected, actual) {}
+void throws(void Function() f) {}
diff --git a/pkg/front_end/testcases/none/mixin_covariant.dart.weak.expect b/pkg/front_end/testcases/none/mixin_covariant.dart.weak.expect
new file mode 100644
index 0000000..412bbf0
--- /dev/null
+++ b/pkg/front_end/testcases/none/mixin_covariant.dart.weak.expect
@@ -0,0 +1,76 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Superclass extends core::Object {
+  synthetic constructor •() → self::Superclass
+    : super core::Object::•()
+    ;
+  method method1(core::num argument1, core::num argument2) → core::String
+    return "Superclass";
+  method method2(core::num argument1, core::num argument2) → core::String
+    return "Superclass";
+  method method3(core::num argument1, covariant core::int argument2) → core::String
+    return "Superclass";
+  method method4(core::num argument1, covariant core::num argument2) → core::String
+    return "Superclass";
+}
+class Mixin extends core::Object {
+  synthetic constructor •() → self::Mixin
+    : super core::Object::•()
+    ;
+  method method1(core::num argument1, core::num argument2) → core::String
+    return "Mixin";
+  method method2(covariant core::int argument1, core::num argument2) → core::String
+    return "Mixin";
+  method method3(core::num argument1, core::num argument2) → core::String
+    return "Mixin";
+  method method4(covariant core::int argument1, core::int argument2) → core::String
+    return "Mixin";
+}
+abstract class _Class&Superclass&Mixin = self::Superclass with self::Mixin /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Superclass&Mixin
+    : super self::Superclass::•()
+    ;
+  abstract forwarding-stub method method2(covariant core::num argument1, core::num argument2) → core::String;
+  forwarding-stub method method3(core::num argument1, covariant core::num argument2) → core::String
+    return super.{self::Superclass::method3}(argument1, argument2);
+  forwarding-stub method method4(covariant core::num argument1, covariant core::num argument2) → core::String
+    return super.{self::Superclass::method4}(argument1, argument2);
+}
+class Class extends self::_Class&Superclass&Mixin {
+  synthetic constructor •() → self::Class
+    : super self::_Class&Superclass&Mixin::•()
+    ;
+}
+static method main() → dynamic {
+  self::Class c = new self::Class::•();
+  self::expect("Mixin", c.{self::Mixin::method1}(0, 1));
+  self::expect("Mixin", c.{self::_Class&Superclass&Mixin::method2}(0, 1));
+  self::expect("Mixin", c.{self::_Class&Superclass&Mixin::method3}(0, 1));
+  self::expect("Mixin", c.{self::_Class&Superclass&Mixin::method4}(0, 1));
+  self::Superclass s = c;
+  self::expect("Mixin", s.{self::Superclass::method1}(0.5, 1.5));
+  self::throws(() → void => s.{self::Superclass::method2}(0.5, 1.5));
+  self::expect("Mixin", s.{self::Superclass::method3}(0.5, 1));
+  self::throws(() → void => s.{self::Superclass::method4}(0.5, 1));
+  self::expect("Mixin", s.{self::Superclass::method4}(1, 0.5));
+  self::Mixin m = c;
+  self::expect("Mixin", m.{self::Mixin::method1}(0, 1));
+  self::expect("Mixin", m.{self::Mixin::method2}(0, 1));
+  self::expect("Mixin", m.{self::Mixin::method3}(0, 1));
+  self::expect("Mixin", m.{self::Mixin::method4}(0, 1));
+}
+static method expect(dynamic expected, dynamic actual) → void {
+  if(!expected.{core::Object::==}(actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+static method throws(() → void f) → void {
+  try {
+    f.call();
+  }
+  on core::Object catch(final core::Object _) {
+    return;
+  }
+  throw "Expected exception";
+}
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/issue41501.dart.weak.expect b/pkg/front_end/testcases/nonfunction_type_aliases/issue41501.dart.weak.expect
index 13d2fb8..6d116f9 100644
--- a/pkg/front_end/testcases/nonfunction_type_aliases/issue41501.dart.weak.expect
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/issue41501.dart.weak.expect
@@ -2,12 +2,12 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nonfunction_type_aliases/issue41501.dart:13:42: Error: A value of type 'Null' can't be assigned to a variable of type 'FutureOr<A>'.
+// pkg/front_end/testcases/nonfunction_type_aliases/issue41501.dart:13:42: Error: The value 'null' can't be assigned to a variable of type 'FutureOr<A>' because 'FutureOr<A>' is not nullable.
 //  - 'A' is from 'pkg/front_end/testcases/nonfunction_type_aliases/issue41501_lib.dart'.
 //   FutureOr<AAlias> foLegacyNonNullable = null; // error
 //                                          ^
 //
-// pkg/front_end/testcases/nonfunction_type_aliases/issue41501.dart:15:47: Error: A value of type 'Null' can't be assigned to a variable of type 'FutureOr<A>'.
+// pkg/front_end/testcases/nonfunction_type_aliases/issue41501.dart:15:47: Error: The value 'null' can't be assigned to a variable of type 'FutureOr<A>' because 'FutureOr<A>' is not nullable.
 //  - 'A' is from 'pkg/front_end/testcases/nonfunction_type_aliases/issue41501_lib.dart'.
 //   FutureOr<AAliasNonNullable> foNonNullable = null; // error
 //                                               ^
@@ -21,12 +21,12 @@
 typedef AAliasNonNullable = opt::A;
 typedef AAliasNullable = opt::A?;
 static method test() → dynamic {
-  FutureOr<opt::A>foLegacyNonNullable = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nonfunction_type_aliases/issue41501.dart:13:42: Error: A value of type 'Null' can't be assigned to a variable of type 'FutureOr<A>'.
+  FutureOr<opt::A>foLegacyNonNullable = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nonfunction_type_aliases/issue41501.dart:13:42: Error: The value 'null' can't be assigned to a variable of type 'FutureOr<A>' because 'FutureOr<A>' is not nullable.
  - 'A' is from 'pkg/front_end/testcases/nonfunction_type_aliases/issue41501_lib.dart'.
   FutureOr<AAlias> foLegacyNonNullable = null; // error
                                          ^" in null as{TypeError,ForNonNullableByDefault} FutureOr<opt::A>;
   FutureOr<opt::A?>foLegacyNullable = null;
-  FutureOr<opt::A>foNonNullable = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nonfunction_type_aliases/issue41501.dart:15:47: Error: A value of type 'Null' can't be assigned to a variable of type 'FutureOr<A>'.
+  FutureOr<opt::A>foNonNullable = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nonfunction_type_aliases/issue41501.dart:15:47: Error: The value 'null' can't be assigned to a variable of type 'FutureOr<A>' because 'FutureOr<A>' is not nullable.
  - 'A' is from 'pkg/front_end/testcases/nonfunction_type_aliases/issue41501_lib.dart'.
   FutureOr<AAliasNonNullable> foNonNullable = null; // error
                                               ^" in null as{TypeError,ForNonNullableByDefault} FutureOr<opt::A>;
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/issue41501.dart.weak.transformed.expect b/pkg/front_end/testcases/nonfunction_type_aliases/issue41501.dart.weak.transformed.expect
index 027a85d..5d63d6a 100644
--- a/pkg/front_end/testcases/nonfunction_type_aliases/issue41501.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/issue41501.dart.weak.transformed.expect
@@ -2,12 +2,12 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nonfunction_type_aliases/issue41501.dart:13:42: Error: A value of type 'Null' can't be assigned to a variable of type 'FutureOr<A>'.
+// pkg/front_end/testcases/nonfunction_type_aliases/issue41501.dart:13:42: Error: The value 'null' can't be assigned to a variable of type 'FutureOr<A>' because 'FutureOr<A>' is not nullable.
 //  - 'A' is from 'pkg/front_end/testcases/nonfunction_type_aliases/issue41501_lib.dart'.
 //   FutureOr<AAlias> foLegacyNonNullable = null; // error
 //                                          ^
 //
-// pkg/front_end/testcases/nonfunction_type_aliases/issue41501.dart:15:47: Error: A value of type 'Null' can't be assigned to a variable of type 'FutureOr<A>'.
+// pkg/front_end/testcases/nonfunction_type_aliases/issue41501.dart:15:47: Error: The value 'null' can't be assigned to a variable of type 'FutureOr<A>' because 'FutureOr<A>' is not nullable.
 //  - 'A' is from 'pkg/front_end/testcases/nonfunction_type_aliases/issue41501_lib.dart'.
 //   FutureOr<AAliasNonNullable> foNonNullable = null; // error
 //                                               ^
@@ -21,12 +21,12 @@
 typedef AAliasNonNullable = opt::A;
 typedef AAliasNullable = opt::A?;
 static method test() → dynamic {
-  FutureOr<opt::A>foLegacyNonNullable = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nonfunction_type_aliases/issue41501.dart:13:42: Error: A value of type 'Null' can't be assigned to a variable of type 'FutureOr<A>'.
+  FutureOr<opt::A>foLegacyNonNullable = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nonfunction_type_aliases/issue41501.dart:13:42: Error: The value 'null' can't be assigned to a variable of type 'FutureOr<A>' because 'FutureOr<A>' is not nullable.
  - 'A' is from 'pkg/front_end/testcases/nonfunction_type_aliases/issue41501_lib.dart'.
   FutureOr<AAlias> foLegacyNonNullable = null; // error
                                          ^" in null;
   FutureOr<opt::A?>foLegacyNullable = null;
-  FutureOr<opt::A>foNonNullable = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nonfunction_type_aliases/issue41501.dart:15:47: Error: A value of type 'Null' can't be assigned to a variable of type 'FutureOr<A>'.
+  FutureOr<opt::A>foNonNullable = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nonfunction_type_aliases/issue41501.dart:15:47: Error: The value 'null' can't be assigned to a variable of type 'FutureOr<A>' because 'FutureOr<A>' is not nullable.
  - 'A' is from 'pkg/front_end/testcases/nonfunction_type_aliases/issue41501_lib.dart'.
   FutureOr<AAliasNonNullable> foNonNullable = null; // error
                                               ^" in null;
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases_no_nnbd/folder.options b/pkg/front_end/testcases/nonfunction_type_aliases_no_nnbd/folder.options
index 155ea76..0498e9b 100644
--- a/pkg/front_end/testcases/nonfunction_type_aliases_no_nnbd/folder.options
+++ b/pkg/front_end/testcases/nonfunction_type_aliases_no_nnbd/folder.options
@@ -1 +1 @@
---enable-experiment=nonfunction-type-aliases
\ No newline at end of file
+--enable-experiment=nonfunction-type-aliases,no-non-nullable
\ No newline at end of file
diff --git a/pkg/front_end/testcases/old_dills/dills/dart2js.version.46.compile.1.dill b/pkg/front_end/testcases/old_dills/dills/dart2js.version.46.compile.1.dill
deleted file mode 100644
index d766ad5..0000000
--- a/pkg/front_end/testcases/old_dills/dills/dart2js.version.46.compile.1.dill
+++ /dev/null
Binary files differ
diff --git a/pkg/front_end/testcases/outline.status b/pkg/front_end/testcases/outline.status
index 532869a..8ddb02d 100644
--- a/pkg/front_end/testcases/outline.status
+++ b/pkg/front_end/testcases/outline.status
@@ -23,6 +23,7 @@
 general/issue41210a: TypeCheckError
 general/issue41210b/issue41210: TypeCheckError
 general/mixin_application_override: TypeCheckError
+general/mixin_covariant2: TypeCheckError
 general/override_check_accessor_after_inference: TypeCheckError
 general/override_check_accessor_basic: TypeCheckError
 general/override_check_accessor_with_covariant_modifier: TypeCheckError
@@ -47,6 +48,7 @@
 nnbd/covariant_late_field: TypeCheckError
 nnbd/getter_vs_setter_type: TypeCheckError
 nnbd/issue42603: TypeCheckError
+none/mixin_covariant: TypeCheckError
 rasta/native_is_illegal: Pass # Issue 29763
 runtime_checks_new/mixin_forwarding_stub_field: TypeCheckError
 runtime_checks_new/mixin_forwarding_stub_setter: TypeCheckError
diff --git a/pkg/front_end/testcases/rasta/folder.options b/pkg/front_end/testcases/rasta/folder.options
new file mode 100644
index 0000000..dbc148e
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/folder.options
@@ -0,0 +1 @@
+--enable-experiment=no-non-nullable
\ No newline at end of file
diff --git a/pkg/front_end/testcases/rasta/issue_000052.dart.strong.expect b/pkg/front_end/testcases/rasta/issue_000052.dart.strong.expect
index 2130845..bfd2076 100644
--- a/pkg/front_end/testcases/rasta/issue_000052.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/issue_000052.dart.strong.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  function f() → core::Null? {
+  function f() → Null {
     core::print("hello");
   }
   f.call();
diff --git a/pkg/front_end/testcases/rasta/issue_000052.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/issue_000052.dart.strong.transformed.expect
index 2130845..bfd2076 100644
--- a/pkg/front_end/testcases/rasta/issue_000052.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/issue_000052.dart.strong.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  function f() → core::Null? {
+  function f() → Null {
     core::print("hello");
   }
   f.call();
diff --git a/pkg/front_end/testcases/rasta/issue_000070.dart.outline.expect b/pkg/front_end/testcases/rasta/issue_000070.dart.outline.expect
index 9fbd201..9e77b8e 100644
--- a/pkg/front_end/testcases/rasta/issue_000070.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/issue_000070.dart.outline.expect
@@ -11,7 +11,7 @@
   constructor empty() → self::A<self::A::N*, self::A::S*, self::A::U*>*
     ;
   const constructor c(self::A::U* u, self::A::S* s) → self::A<self::A::N*, self::A::S*, self::A::U*>*
-    : self::A::field = const <core::Null?>[null], super core::Object::•()
+    : self::A::field = const <Null>[null], super core::Object::•()
     ;
   static factory f<N extends core::Object* = dynamic, S extends core::Object* = dynamic, U extends core::Object* = dynamic>(self::A::f::S* s) → self::A<self::A::f::N*, self::A::f::S*, self::A::f::U*>*
     ;
@@ -53,5 +53,5 @@
 
 
 Extra constant evaluation status:
-Evaluated: ListLiteral @ org-dartlang-testcase:///issue_000070.dart:22:33 -> ListConstant(const <Null?>[null])
+Evaluated: ListLiteral @ org-dartlang-testcase:///issue_000070.dart:22:33 -> ListConstant(const <Null>[null])
 Extra constant evaluation: evaluated: 1, effectively constant: 1
diff --git a/pkg/front_end/testcases/rasta/issue_000070.dart.strong.expect b/pkg/front_end/testcases/rasta/issue_000070.dart.strong.expect
index 98c4bca..2d43401 100644
--- a/pkg/front_end/testcases/rasta/issue_000070.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/issue_000070.dart.strong.expect
@@ -66,6 +66,6 @@
 
 constants  {
   #C1 = null
-  #C2 = <core::Null?>[#C1]
+  #C2 = <Null>[#C1]
   #C3 = self::A<core::int*, core::int*, core::List<dynamic>*> {field:#C2}
 }
diff --git a/pkg/front_end/testcases/rasta/issue_000070.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/issue_000070.dart.strong.transformed.expect
index e4737bd..b0d7301 100644
--- a/pkg/front_end/testcases/rasta/issue_000070.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/issue_000070.dart.strong.transformed.expect
@@ -66,6 +66,6 @@
 
 constants  {
   #C1 = null
-  #C2 = <core::Null?>[#C1]
+  #C2 = <Null>[#C1]
   #C3 = self::A<core::int*, core::int*, core::List<dynamic>*> {field:#C2}
 }
diff --git a/pkg/front_end/testcases/rasta/issue_000081.dart.strong.expect b/pkg/front_end/testcases/rasta/issue_000081.dart.strong.expect
index bf1076a..a132ec8 100644
--- a/pkg/front_end/testcases/rasta/issue_000081.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/issue_000081.dart.strong.expect
@@ -30,6 +30,6 @@
 }
 static method main() → dynamic {
   core::print(new self::Sub::•().{self::Sub::hashCode});
-  core::List<core::Null?>* l = <core::Null?>[null];
-  let final core::List<core::Null?>* #t2 = l in let final core::int* #t3 = 0 in #t2.{core::List::[]}(#t3).{core::Object::==}(null) ?{core::String*} #t2.{core::List::[]=}(#t3, "fisk" as{TypeError} core::Null?) : null;
+  core::List<Null>* l = <Null>[null];
+  let final core::List<Null>* #t2 = l in let final core::int* #t3 = 0 in #t2.{core::List::[]}(#t3).{core::Object::==}(null) ?{core::String*} #t2.{core::List::[]=}(#t3, "fisk" as{TypeError} Null) : null;
 }
diff --git a/pkg/front_end/testcases/rasta/issue_000081.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/issue_000081.dart.strong.transformed.expect
index 8b6d4d8..501253f 100644
--- a/pkg/front_end/testcases/rasta/issue_000081.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/issue_000081.dart.strong.transformed.expect
@@ -30,8 +30,8 @@
 }
 static method main() → dynamic {
   core::print(new self::Sub::•().{self::Sub::hashCode});
-  core::List<core::Null?>* l = <core::Null?>[null];
-  let final core::List<core::Null?>* #t2 = l in let final core::int* #t3 = 0 in #t2.{core::List::[]}(#t3).{core::Object::==}(null) ?{core::String*} #t2.{core::List::[]=}(#t3, "fisk" as{TypeError} core::Null?) : null;
+  core::List<Null>* l = <Null>[null];
+  let final core::List<Null>* #t2 = l in let final core::int* #t3 = 0 in #t2.{core::List::[]}(#t3).{core::Object::==}(null) ?{core::String*} #t2.{core::List::[]=}(#t3, "fisk" as{TypeError} Null) : null;
 }
 
 
diff --git a/pkg/front_end/testcases/rasta/type_literals.dart.strong.expect b/pkg/front_end/testcases/rasta/type_literals.dart.strong.expect
index ad8084b..46122d2 100644
--- a/pkg/front_end/testcases/rasta/type_literals.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/type_literals.dart.strong.expect
@@ -439,28 +439,28 @@
     self::use(invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:72:11: Error: Can't assign to a type literal.
     use(--Func);
           ^^^^");
-    self::C<dynamic>*.{core::Object::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:74:5: Error: Can't assign to a type literal.
+    self::C<dynamic>*.{core::Type::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:74:5: Error: Can't assign to a type literal.
     C ??= 42;
     ^" : null;
-    self::use(let final core::Type* #t1 = self::C<dynamic>* in #t1.{core::Object::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:75:9: Error: Can't assign to a type literal.
+    self::use(let final core::Type* #t1 = self::C<dynamic>* in #t1.{core::Type::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:75:9: Error: Can't assign to a type literal.
     use(C ??= 42);
         ^" : #t1);
-    dynamic.{core::Object::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:76:5: Error: Can't assign to a type literal.
+    dynamic.{core::Type::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:76:5: Error: Can't assign to a type literal.
     dynamic ??= 42;
     ^^^^^^^" : null;
-    self::use(let final core::Type* #t2 = dynamic in #t2.{core::Object::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:77:9: Error: Can't assign to a type literal.
+    self::use(let final core::Type* #t2 = dynamic in #t2.{core::Type::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:77:9: Error: Can't assign to a type literal.
     use(dynamic ??= 42);
         ^^^^^^^" : #t2);
-    self::C::T*.{core::Object::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:78:5: Error: Can't assign to a type literal.
+    self::C::T*.{core::Type::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:78:5: Error: Can't assign to a type literal.
     T ??= 42;
     ^" : null;
-    self::use(let final core::Type* #t3 = self::C::T* in #t3.{core::Object::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:79:9: Error: Can't assign to a type literal.
+    self::use(let final core::Type* #t3 = self::C::T* in #t3.{core::Type::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:79:9: Error: Can't assign to a type literal.
     use(T ??= 42);
         ^" : #t3);
-    () →* void.{core::Object::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:80:5: Error: Can't assign to a type literal.
+    () →* void.{core::Type::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:80:5: Error: Can't assign to a type literal.
     Func ??= 42;
     ^^^^" : null;
-    self::use(let final core::Type* #t4 = () →* void in #t4.{core::Object::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:81:9: Error: Can't assign to a type literal.
+    self::use(let final core::Type* #t4 = () →* void in #t4.{core::Type::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:81:9: Error: Can't assign to a type literal.
     use(Func ??= 42);
         ^^^^" : #t4);
     invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:83:5: Error: Can't assign to a type literal.
diff --git a/pkg/front_end/testcases/rasta/type_literals.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/type_literals.dart.strong.transformed.expect
index b50aab5..31ed6a4 100644
--- a/pkg/front_end/testcases/rasta/type_literals.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/type_literals.dart.strong.transformed.expect
@@ -439,28 +439,28 @@
     self::use(invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:72:11: Error: Can't assign to a type literal.
     use(--Func);
           ^^^^");
-    self::C<dynamic>*.{core::Object::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:74:5: Error: Can't assign to a type literal.
+    self::C<dynamic>*.{core::Type::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:74:5: Error: Can't assign to a type literal.
     C ??= 42;
     ^" : null;
-    self::use(let final core::Type* #t1 = self::C<dynamic>* in #t1.{core::Object::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:75:9: Error: Can't assign to a type literal.
+    self::use(let final core::Type* #t1 = self::C<dynamic>* in #t1.{core::Type::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:75:9: Error: Can't assign to a type literal.
     use(C ??= 42);
         ^" : #t1);
-    dynamic.{core::Object::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:76:5: Error: Can't assign to a type literal.
+    dynamic.{core::Type::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:76:5: Error: Can't assign to a type literal.
     dynamic ??= 42;
     ^^^^^^^" : null;
-    self::use(let final core::Type* #t2 = dynamic in #t2.{core::Object::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:77:9: Error: Can't assign to a type literal.
+    self::use(let final core::Type* #t2 = dynamic in #t2.{core::Type::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:77:9: Error: Can't assign to a type literal.
     use(dynamic ??= 42);
         ^^^^^^^" : #t2);
-    self::C::T*.{core::Object::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:78:5: Error: Can't assign to a type literal.
+    self::C::T*.{core::Type::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:78:5: Error: Can't assign to a type literal.
     T ??= 42;
     ^" : null;
-    self::use(let final core::Type* #t3 = self::C::T* in #t3.{core::Object::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:79:9: Error: Can't assign to a type literal.
+    self::use(let final core::Type* #t3 = self::C::T* in #t3.{core::Type::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:79:9: Error: Can't assign to a type literal.
     use(T ??= 42);
         ^" : #t3);
-    () →* void.{core::Object::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:80:5: Error: Can't assign to a type literal.
+    () →* void.{core::Type::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:80:5: Error: Can't assign to a type literal.
     Func ??= 42;
     ^^^^" : null;
-    self::use(let final core::Type* #t4 = () →* void in #t4.{core::Object::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:81:9: Error: Can't assign to a type literal.
+    self::use(let final core::Type* #t4 = () →* void in #t4.{core::Type::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:81:9: Error: Can't assign to a type literal.
     use(Func ??= 42);
         ^^^^" : #t4);
     invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:83:5: Error: Can't assign to a type literal.
diff --git a/pkg/front_end/testcases/rasta/typedef.dart.strong.expect b/pkg/front_end/testcases/rasta/typedef.dart.strong.expect
index 36ac25e..777322c 100644
--- a/pkg/front_end/testcases/rasta/typedef.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/typedef.dart.strong.expect
@@ -23,7 +23,7 @@
   invalid-expression "pkg/front_end/testcases/rasta/typedef.dart:9:3: Error: Can't assign to a type literal.
   Foo = null;
   ^^^";
-  () →* void.{core::Object::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/typedef.dart:10:3: Error: Can't assign to a type literal.
+  () →* void.{core::Type::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/typedef.dart:10:3: Error: Can't assign to a type literal.
   Foo ??= null;
   ^^^" : null;
   invalid-expression "pkg/front_end/testcases/rasta/typedef.dart:11:3: Error: Method not found: 'Foo'.
diff --git a/pkg/front_end/testcases/rasta/typedef.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/typedef.dart.strong.transformed.expect
index 2fda16d..625cf29 100644
--- a/pkg/front_end/testcases/rasta/typedef.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/typedef.dart.strong.transformed.expect
@@ -23,7 +23,7 @@
   invalid-expression "pkg/front_end/testcases/rasta/typedef.dart:9:3: Error: Can't assign to a type literal.
   Foo = null;
   ^^^";
-  () →* void.{core::Object::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/typedef.dart:10:3: Error: Can't assign to a type literal.
+  () →* void.{core::Type::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/typedef.dart:10:3: Error: Can't assign to a type literal.
   Foo ??= null;
   ^^^" : null;
   invalid-expression "pkg/front_end/testcases/rasta/typedef.dart:11:3: Error: Method not found: 'Foo'.
diff --git a/pkg/front_end/testcases/regress/folder.options b/pkg/front_end/testcases/regress/folder.options
new file mode 100644
index 0000000..dbc148e
--- /dev/null
+++ b/pkg/front_end/testcases/regress/folder.options
@@ -0,0 +1 @@
+--enable-experiment=no-non-nullable
\ No newline at end of file
diff --git a/pkg/front_end/testcases/regress/issue_29937.dart.strong.expect b/pkg/front_end/testcases/regress/issue_29937.dart.strong.expect
index c6c6d4d..07a6b9a7 100644
--- a/pkg/front_end/testcases/regress/issue_29937.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_29937.dart.strong.expect
@@ -7,8 +7,7 @@
 //    ^
 //
 import self as self;
-import "dart:core" as core;
 
 static method main() → dynamic {
-  <() →* core::Null?>[let final () →* core::Null? f = () → core::Null? {} in f];
+  <() →* Null>[let final () →* Null f = () → Null {} in f];
 }
diff --git a/pkg/front_end/testcases/regress/issue_29937.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_29937.dart.strong.transformed.expect
index c6c6d4d..07a6b9a7 100644
--- a/pkg/front_end/testcases/regress/issue_29937.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29937.dart.strong.transformed.expect
@@ -7,8 +7,7 @@
 //    ^
 //
 import self as self;
-import "dart:core" as core;
 
 static method main() → dynamic {
-  <() →* core::Null?>[let final () →* core::Null? f = () → core::Null? {} in f];
+  <() →* Null>[let final () →* Null f = () → Null {} in f];
 }
diff --git a/pkg/front_end/testcases/regress/issue_29942.dart.strong.expect b/pkg/front_end/testcases/regress/issue_29942.dart.strong.expect
index a052ac0..f545925 100644
--- a/pkg/front_end/testcases/regress/issue_29942.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_29942.dart.strong.expect
@@ -12,8 +12,7 @@
 // ^
 //
 import self as self;
-import "dart:core" as core;
 
 static method main() → dynamic {}
 static method f() → dynamic
-  return let final () →* core::Null? h = () → core::Null? => null in h;
+  return let final () →* Null h = () → Null => null in h;
diff --git a/pkg/front_end/testcases/regress/issue_29942.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_29942.dart.strong.transformed.expect
index a052ac0..f545925 100644
--- a/pkg/front_end/testcases/regress/issue_29942.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29942.dart.strong.transformed.expect
@@ -12,8 +12,7 @@
 // ^
 //
 import self as self;
-import "dart:core" as core;
 
 static method main() → dynamic {}
 static method f() → dynamic
-  return let final () →* core::Null? h = () → core::Null? => null in h;
+  return let final () →* Null h = () → Null => null in h;
diff --git a/pkg/front_end/testcases/regress/issue_29978.dart.strong.expect b/pkg/front_end/testcases/regress/issue_29978.dart.strong.expect
index 86dc966..a166dcf 100644
--- a/pkg/front_end/testcases/regress/issue_29978.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_29978.dart.strong.expect
@@ -7,10 +7,9 @@
 //             ^
 //
 import self as self;
-import "dart:core" as core;
 
 static method foo(dynamic a, dynamic b) → dynamic
   return null;
 static method main() → dynamic {
-  self::foo(null, let final () →* core::Null? f = () → core::Null? {} in f);
+  self::foo(null, let final () →* Null f = () → Null {} in f);
 }
diff --git a/pkg/front_end/testcases/regress/issue_29978.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_29978.dart.strong.transformed.expect
index 86dc966..a166dcf 100644
--- a/pkg/front_end/testcases/regress/issue_29978.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29978.dart.strong.transformed.expect
@@ -7,10 +7,9 @@
 //             ^
 //
 import self as self;
-import "dart:core" as core;
 
 static method foo(dynamic a, dynamic b) → dynamic
   return null;
 static method main() → dynamic {
-  self::foo(null, let final () →* core::Null? f = () → core::Null? {} in f);
+  self::foo(null, let final () →* Null f = () → Null {} in f);
 }
diff --git a/pkg/front_end/testcases/regress/issue_29979.dart.strong.expect b/pkg/front_end/testcases/regress/issue_29979.dart.strong.expect
index df04eff..aee80bb 100644
--- a/pkg/front_end/testcases/regress/issue_29979.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_29979.dart.strong.expect
@@ -7,8 +7,7 @@
 //    ^
 //
 import self as self;
-import "dart:core" as core;
 
 static method main() → dynamic {
-  (let final () →* core::Null? f = () → core::Null? {} in f).call();
+  (let final () →* Null f = () → Null {} in f).call();
 }
diff --git a/pkg/front_end/testcases/regress/issue_29979.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_29979.dart.strong.transformed.expect
index df04eff..aee80bb 100644
--- a/pkg/front_end/testcases/regress/issue_29979.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29979.dart.strong.transformed.expect
@@ -7,8 +7,7 @@
 //    ^
 //
 import self as self;
-import "dart:core" as core;
 
 static method main() → dynamic {
-  (let final () →* core::Null? f = () → core::Null? {} in f).call();
+  (let final () →* Null f = () → Null {} in f).call();
 }
diff --git a/pkg/front_end/testcases/regress/issue_29983.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_29983.dart.strong.transformed.expect
index 63808a8..aeb1e86 100644
--- a/pkg/front_end/testcases/regress/issue_29983.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29983.dart.strong.transformed.expect
@@ -22,43 +22,46 @@
 import "dart:core" as core;
 
 static method f() → dynamic /* originally sync* */ {
-  function :sync_op_gen() → (core::_SyncIterator<dynamic>*) →* core::bool* {
+  function :sync_op_gen() → (core::_SyncIterator<dynamic>*, dynamic, dynamic) →* core::bool* {
     core::int* :await_jump_var = 0;
     dynamic :await_ctx_var;
-    return (core::_SyncIterator<dynamic>* :iterator) → core::bool* yielding {
+    function :sync_op(core::_SyncIterator<dynamic>* :iterator, dynamic :exception, dynamic :stack_trace) → core::bool* yielding {
       {
         invalid-expression "pkg/front_end/testcases/regress/issue_29983.dart:7:3: Error: 'sync*' and 'async*' can't return a value.
   return missing;
   ^";
       }
       return false;
-    };
+    }
+    return :sync_op;
   }
   return new core::_SyncIterable::•<dynamic>(:sync_op_gen);
 }
 static method g() → dynamic /* originally sync* */ {
-  function :sync_op_gen() → (core::_SyncIterator<dynamic>*) →* core::bool* {
+  function :sync_op_gen() → (core::_SyncIterator<dynamic>*, dynamic, dynamic) →* core::bool* {
     core::int* :await_jump_var = 0;
     dynamic :await_ctx_var;
-    return (core::_SyncIterator<dynamic>* :iterator) → core::bool* yielding {
+    function :sync_op(core::_SyncIterator<dynamic>* :iterator, dynamic :exception, dynamic :stack_trace) → core::bool* yielding {
       invalid-expression "pkg/front_end/testcases/regress/issue_29983.dart:11:14: Error: 'sync*' and 'async*' can't return a value.
 g() sync* => dummy;
              ^";
       return false;
-    };
+    }
+    return :sync_op;
   }
   return new core::_SyncIterable::•<dynamic>(:sync_op_gen);
 }
 static method h() → dynamic /* originally sync* */ {
-  function :sync_op_gen() → (core::_SyncIterator<dynamic>*) →* core::bool* {
+  function :sync_op_gen() → (core::_SyncIterator<dynamic>*, dynamic, dynamic) →* core::bool* {
     core::int* :await_jump_var = 0;
     dynamic :await_ctx_var;
-    return (core::_SyncIterator<dynamic>* :iterator) → core::bool* yielding {
+    function :sync_op(core::_SyncIterator<dynamic>* :iterator, dynamic :exception, dynamic :stack_trace) → core::bool* yielding {
       {
         (() → core::String* => "return").call();
       }
       return false;
-    };
+    }
+    return :sync_op;
   }
   return new core::_SyncIterable::•<dynamic>(:sync_op_gen);
 }
diff --git a/pkg/front_end/testcases/regress/issue_31180.dart.strong.expect b/pkg/front_end/testcases/regress/issue_31180.dart.strong.expect
index 213fb86..8301dfb 100644
--- a/pkg/front_end/testcases/regress/issue_31180.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31180.dart.strong.expect
@@ -2,8 +2,8 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/regress/issue_31180.dart:6:15: Error: This requires the null safety language feature, which is experimental.
-// You can enable the experiment using the '--enable-experiment=non-nullable' command line option.
+// pkg/front_end/testcases/regress/issue_31180.dart:6:15: Error: This requires the 'non-nullable' language feature to be enabled.
+// The feature is on by default but is currently disabled, maybe because the '--enable-experiment=no-non-nullable' command line option is passed.
 //   return null?[1];
 //               ^
 //
diff --git a/pkg/front_end/testcases/regress/issue_31180.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_31180.dart.strong.transformed.expect
index 49cab5b..19c01b2 100644
--- a/pkg/front_end/testcases/regress/issue_31180.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31180.dart.strong.transformed.expect
@@ -2,8 +2,8 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/regress/issue_31180.dart:6:15: Error: This requires the null safety language feature, which is experimental.
-// You can enable the experiment using the '--enable-experiment=non-nullable' command line option.
+// pkg/front_end/testcases/regress/issue_31180.dart:6:15: Error: This requires the 'non-nullable' language feature to be enabled.
+// The feature is on by default but is currently disabled, maybe because the '--enable-experiment=no-non-nullable' command line option is passed.
 //   return null?[1];
 //               ^
 //
diff --git a/pkg/front_end/testcases/regress/issue_31766.dart.strong.expect b/pkg/front_end/testcases/regress/issue_31766.dart.strong.expect
index 00428db..84f19bf 100644
--- a/pkg/front_end/testcases/regress/issue_31766.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31766.dart.strong.expect
@@ -24,7 +24,7 @@
     core::print("t.foo()=${t.{self::A::foo}()}");
   }
   bar.call<self::A*>(new self::A::•());
-  (<S extends self::A* = self::A*>(S* s) → core::Null? {
+  (<S extends self::A* = self::A*>(S* s) → Null {
     core::print("s.foo()=${s.{self::A::foo}()}");
   }).call<self::A*>(new self::A::•());
 }
diff --git a/pkg/front_end/testcases/regress/issue_31766.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_31766.dart.strong.transformed.expect
index 00428db..84f19bf 100644
--- a/pkg/front_end/testcases/regress/issue_31766.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31766.dart.strong.transformed.expect
@@ -24,7 +24,7 @@
     core::print("t.foo()=${t.{self::A::foo}()}");
   }
   bar.call<self::A*>(new self::A::•());
-  (<S extends self::A* = self::A*>(S* s) → core::Null? {
+  (<S extends self::A* = self::A*>(S* s) → Null {
     core::print("s.foo()=${s.{self::A::foo}()}");
   }).call<self::A*>(new self::A::•());
 }
diff --git a/pkg/front_end/testcases/regress/issue_31846.dart.strong.expect b/pkg/front_end/testcases/regress/issue_31846.dart.strong.expect
index a9152eb..46e374c 100644
--- a/pkg/front_end/testcases/regress/issue_31846.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31846.dart.strong.expect
@@ -8,7 +8,7 @@
   core::print((<T extends core::num* = core::num*>(T* x) → T* => x).{core::Object::runtimeType});
   core::print((<T extends core::Comparable<T*>* = core::Comparable<dynamic>*>(T* x) → T* => x).{core::Object::runtimeType});
   core::print((<T extends core::Comparable<S*>* = core::Comparable<dynamic>*, S extends core::Object* = dynamic>(T* x) → T* => x).{core::Object::runtimeType});
-  core::print((<T extends (T*) →* dynamic = (core::Null?) →* dynamic>(T* x) → T* => x).{core::Object::runtimeType});
+  core::print((<T extends (T*) →* dynamic = (Null) →* dynamic>(T* x) → T* => x).{core::Object::runtimeType});
   core::print((<T extends core::List<core::List<T*>*>* = core::List<core::List<dynamic>*>*>(T* x) → T* => x).{core::Object::runtimeType});
 }
 
diff --git a/pkg/front_end/testcases/regress/issue_31846.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_31846.dart.strong.transformed.expect
index 14ec668..27bf019 100644
--- a/pkg/front_end/testcases/regress/issue_31846.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31846.dart.strong.transformed.expect
@@ -8,7 +8,7 @@
   core::print((<T extends core::num* = core::num*>(T* x) → T* => x).{core::Object::runtimeType});
   core::print((<T extends core::Comparable<T*>* = core::Comparable<dynamic>*>(T* x) → T* => x).{core::Object::runtimeType});
   core::print((<T extends core::Comparable<S*>* = core::Comparable<dynamic>*, S extends core::Object* = dynamic>(T* x) → T* => x).{core::Object::runtimeType});
-  core::print((<T extends (T*) →* dynamic = (core::Null?) →* dynamic>(T* x) → T* => x).{core::Object::runtimeType});
+  core::print((<T extends (T*) →* dynamic = (Null) →* dynamic>(T* x) → T* => x).{core::Object::runtimeType});
   core::print((<T extends core::List<core::List<T*>*>* = core::List<core::List<dynamic>*>*>(T* x) → T* => x).{core::Object::runtimeType});
 }
 
diff --git a/pkg/front_end/testcases/regress/issue_32660.dart.outline.expect b/pkg/front_end/testcases/regress/issue_32660.dart.outline.expect
index 290665e..ad6b170 100644
--- a/pkg/front_end/testcases/regress/issue_32660.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_32660.dart.outline.expect
@@ -62,7 +62,7 @@
     ;
   method noSuchMethod(core::Invocation* i) → dynamic
     ;
-  abstract forwarding-stub method foo(core::int* x, {core::int* y}) → dynamic;
+  abstract member-signature method foo(core::int* x, {core::int* y}) → dynamic; -> self::B::foo
 }
 class D extends core::Object {
   synthetic constructor •() → self::D*
diff --git a/pkg/front_end/testcases/regress/issue_32660.dart.strong.expect b/pkg/front_end/testcases/regress/issue_32660.dart.strong.expect
index 7e44d2a..32e4786 100644
--- a/pkg/front_end/testcases/regress/issue_32660.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_32660.dart.strong.expect
@@ -67,7 +67,7 @@
     core::print("No such method!");
     return 42;
   }
-  abstract forwarding-stub method foo(core::int* x, {core::int* y = #C1}) → dynamic;
+  abstract member-signature method foo(core::int* x, {core::int* y = #C1}) → dynamic; -> self::B::foo
 }
 class D extends core::Object {
   synthetic constructor •() → self::D*
diff --git a/pkg/front_end/testcases/regress/issue_32660.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_32660.dart.strong.transformed.expect
index 7e44d2a..32e4786 100644
--- a/pkg/front_end/testcases/regress/issue_32660.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_32660.dart.strong.transformed.expect
@@ -67,7 +67,7 @@
     core::print("No such method!");
     return 42;
   }
-  abstract forwarding-stub method foo(core::int* x, {core::int* y = #C1}) → dynamic;
+  abstract member-signature method foo(core::int* x, {core::int* y = #C1}) → dynamic; -> self::B::foo
 }
 class D extends core::Object {
   synthetic constructor •() → self::D*
diff --git a/pkg/front_end/testcases/regress/issue_34850.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_34850.dart.strong.transformed.expect
index 6413088..15f42cb 100644
--- a/pkg/front_end/testcases/regress/issue_34850.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_34850.dart.strong.transformed.expect
@@ -60,7 +60,8 @@
 }
 static method Future<List extends core::Object* = dynamic>() → invalid-type {}
 static method f2() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic>* :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -74,20 +75,22 @@
         :return_value = null;
         break #L1;
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method f3() → invalid-type /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic>* :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -101,20 +104,22 @@
         :return_value = null;
         break #L2;
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method main() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic>* :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -132,15 +137,16 @@
         [yield] let dynamic #t2 = asy::_awaitHelper(self::f3(), :async_op_then, :async_op_error, :async_op) in null;
         core::print(_in::unsafeCast<invalid-type>(:result));
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
diff --git a/pkg/front_end/testcases/regress/issue_36647.dart.outline.expect b/pkg/front_end/testcases/regress/issue_36647.dart.outline.expect
index 67b102e..9ece05e 100644
--- a/pkg/front_end/testcases/regress/issue_36647.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_36647.dart.outline.expect
@@ -9,6 +9,8 @@
 import "issue_36647_lib2.dart" as iss;
 additionalExports = (iss::xxx,
   iss::XXX,
+  iss::XXX,
+  iss::extends,
   iss::extends)
 
 export "org-dartlang-testcase:///issue_36647_lib2.dart";
diff --git a/pkg/front_end/testcases/regress/issue_36647.dart.strong.expect b/pkg/front_end/testcases/regress/issue_36647.dart.strong.expect
index 3ad0fc9..85c932b 100644
--- a/pkg/front_end/testcases/regress/issue_36647.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_36647.dart.strong.expect
@@ -9,6 +9,8 @@
 import "issue_36647_lib2.dart" as iss;
 additionalExports = (iss::xxx,
   iss::XXX,
+  iss::XXX,
+  iss::extends,
   iss::extends)
 
 export "org-dartlang-testcase:///issue_36647_lib2.dart";
diff --git a/pkg/front_end/testcases/regress/issue_36647.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_36647.dart.strong.transformed.expect
index 3ad0fc9..85c932b 100644
--- a/pkg/front_end/testcases/regress/issue_36647.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_36647.dart.strong.transformed.expect
@@ -9,6 +9,8 @@
 import "issue_36647_lib2.dart" as iss;
 additionalExports = (iss::xxx,
   iss::XXX,
+  iss::XXX,
+  iss::extends,
   iss::extends)
 
 export "org-dartlang-testcase:///issue_36647_lib2.dart";
diff --git a/pkg/front_end/testcases/regress/issue_36647_2.dart.outline.expect b/pkg/front_end/testcases/regress/issue_36647_2.dart.outline.expect
index eddabae..e7ebe11 100644
--- a/pkg/front_end/testcases/regress/issue_36647_2.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_36647_2.dart.outline.expect
@@ -2,6 +2,7 @@
 import self as self;
 import "issue_36647_2_lib1.dart" as iss;
 additionalExports = (iss::foo,
+  iss::foo,
   iss::bar,
   iss::baz)
 
diff --git a/pkg/front_end/testcases/regress/issue_36647_2.dart.strong.expect b/pkg/front_end/testcases/regress/issue_36647_2.dart.strong.expect
index 5180e18..79c30c6 100644
--- a/pkg/front_end/testcases/regress/issue_36647_2.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_36647_2.dart.strong.expect
@@ -2,6 +2,7 @@
 import self as self;
 import "issue_36647_2_lib1.dart" as iss;
 additionalExports = (iss::foo,
+  iss::foo,
   iss::bar,
   iss::baz)
 
diff --git a/pkg/front_end/testcases/regress/issue_36647_2.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_36647_2.dart.strong.transformed.expect
index 5180e18..79c30c6 100644
--- a/pkg/front_end/testcases/regress/issue_36647_2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_36647_2.dart.strong.transformed.expect
@@ -2,6 +2,7 @@
 import self as self;
 import "issue_36647_2_lib1.dart" as iss;
 additionalExports = (iss::foo,
+  iss::foo,
   iss::bar,
   iss::baz)
 
diff --git a/pkg/front_end/testcases/regress/issue_37681.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_37681.dart.strong.transformed.expect
index 2382e0e..a16254c 100644
--- a/pkg/front_end/testcases/regress/issue_37681.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_37681.dart.strong.transformed.expect
@@ -20,7 +20,8 @@
 import "dart:_internal" as _in;
 
 static method main() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic>* :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -36,7 +37,8 @@
       #L1:
       {
         function f_async() → core::int* /* originally async */ {
-          final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+          final asy::_Future<dynamic>* :async_future = new asy::_Future::•<dynamic>();
+          core::bool* :is_sync = false;
           FutureOr<dynamic>* :return_value;
           dynamic :async_stack_trace;
           (dynamic) →* dynamic :async_op_then;
@@ -50,17 +52,18 @@
                 :return_value = 42;
                 break #L2;
               }
-              asy::_completeOnAsyncReturn(:async_completer, :return_value);
+              asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
               return;
             }
             on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-              :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+              asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
             }
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-          :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-          return :async_completer.{asy::Completer::future};
+          :async_op.call();
+          :is_sync = true;
+          return :async_future;
         }
         [yield] let dynamic #t1 = asy::_awaitHelper(f_async.call(), :async_op_then, :async_op_error, :async_op) in null;
         core::print(_in::unsafeCast<core::int*>(:result));
@@ -101,7 +104,6 @@
         }
         {
           asy::Stream<dynamic>* :stream = (f_async_star.call() as dynamic) as{TypeError,ForDynamic} asy::Stream<dynamic>*;
-          asy::_asyncStarListenHelper(:stream, :async_op);
           asy::_StreamIterator<dynamic>* :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
           try
             #L4:
@@ -124,10 +126,10 @@
             }
         }
         function f_sync_star() → core::int* /* originally sync* */ {
-          function :sync_op_gen() → (core::_SyncIterator<dynamic>*) →* core::bool* {
+          function :sync_op_gen() → (core::_SyncIterator<dynamic>*, dynamic, dynamic) →* core::bool* {
             core::int* :await_jump_var = 0;
             dynamic :await_ctx_var;
-            return (core::_SyncIterator<dynamic>* :iterator) → core::bool* yielding {
+            function :sync_op(core::_SyncIterator<dynamic>* :iterator, dynamic :exception, dynamic :stack_trace) → core::bool* yielding {
               {
                 {
                   :iterator.{core::_SyncIterator::_current} = 42;
@@ -135,7 +137,8 @@
                 }
               }
               return false;
-            };
+            }
+            return :sync_op;
           }
           return new core::_SyncIterable::•<dynamic>(:sync_op_gen);
         }
@@ -149,15 +152,16 @@
           }
         }
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
diff --git a/pkg/front_end/testcases/regress/issue_39040.dart.strong.expect b/pkg/front_end/testcases/regress/issue_39040.dart.strong.expect
index 828cbd5..ccb6dec 100644
--- a/pkg/front_end/testcases/regress/issue_39040.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_39040.dart.strong.expect
@@ -17,7 +17,7 @@
     #L3:
     case #C2:
       {
-        (() → core::Null? {
+        (() → Null {
           switch(inner) {
             #L4:
             case #C1:
diff --git a/pkg/front_end/testcases/regress/issue_39040.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_39040.dart.strong.transformed.expect
index 828cbd5..ccb6dec 100644
--- a/pkg/front_end/testcases/regress/issue_39040.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_39040.dart.strong.transformed.expect
@@ -17,7 +17,7 @@
     #L3:
     case #C2:
       {
-        (() → core::Null? {
+        (() → Null {
           switch(inner) {
             #L4:
             case #C1:
diff --git a/pkg/front_end/testcases/regress/issue_42423.dart.strong.expect b/pkg/front_end/testcases/regress/issue_42423.dart.strong.expect
index d0a3c7c..f462ef4 100644
--- a/pkg/front_end/testcases/regress/issue_42423.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_42423.dart.strong.expect
@@ -13,7 +13,7 @@
     if(!#t2.{core::Object::==}(null))
       for (final dynamic #t3 in #t2) {
         final core::int* #t4 = #t3 as{TypeError} core::int*;
-        #t1.{core::Set::add}(#t4);
+        #t1.{core::Set::add}{Invariant}(#t4);
       }
   } =>#t1;
 }
@@ -24,7 +24,7 @@
     if(!#t6.{core::Object::==}(null))
       for (final dynamic #t7 in #t6) {
         final core::int* #t8 = #t7 as{TypeError} core::int*;
-        #t5.{core::List::add}(#t8);
+        #t5.{core::List::add}{Invariant}(#t8);
       }
   } =>#t5;
 }
@@ -36,20 +36,20 @@
       for (final core::MapEntry<dynamic, dynamic>* #t11 in #t10.{core::Map::entries}) {
         final core::int* #t12 = #t11.{core::MapEntry::key} as{TypeError} core::int*;
         final core::int* #t13 = #t11.{core::MapEntry::value} as{TypeError} core::int*;
-        #t9.{core::Map::[]=}(#t12, #t13);
+        #t9.{core::Map::[]=}{Invariant}(#t12, #t13);
       }
   } =>#t9;
 }
 static method main() → dynamic {
   dynamic stringList = <core::String*>["string"];
-  exp::Expect::throwsTypeError(() → core::Null? {
+  exp::Expect::throwsTypeError(() → Null {
     self::test1(stringList);
   });
-  exp::Expect::throwsTypeError(() → core::Null? {
+  exp::Expect::throwsTypeError(() → Null {
     self::test2(stringList);
   });
   dynamic stringMap = <core::String*, core::String*>{"a": "b"};
-  exp::Expect::throwsTypeError(() → core::Null? {
+  exp::Expect::throwsTypeError(() → Null {
     self::test3(stringMap);
   });
 }
diff --git a/pkg/front_end/testcases/regress/issue_42423.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_42423.dart.strong.transformed.expect
index 68f6106..5913720 100644
--- a/pkg/front_end/testcases/regress/issue_42423.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_42423.dart.strong.transformed.expect
@@ -16,7 +16,7 @@
         final dynamic #t3 = :sync-for-iterator.{core::Iterator::current};
         {
           final core::int* #t4 = #t3 as{TypeError} core::int*;
-          #t1.{core::Set::add}(#t4);
+          #t1.{core::Set::add}{Invariant}(#t4);
         }
       }
     }
@@ -32,7 +32,7 @@
         final dynamic #t7 = :sync-for-iterator.{core::Iterator::current};
         {
           final core::int* #t8 = #t7 as{TypeError} core::int*;
-          #t5.{core::List::add}(#t8);
+          #t5.{core::List::add}{Invariant}(#t8);
         }
       }
     }
@@ -49,7 +49,7 @@
         {
           final core::int* #t12 = #t11.{core::MapEntry::key} as{TypeError} core::int*;
           final core::int* #t13 = #t11.{core::MapEntry::value} as{TypeError} core::int*;
-          #t9.{core::Map::[]=}(#t12, #t13);
+          #t9.{core::Map::[]=}{Invariant}(#t12, #t13);
         }
       }
     }
@@ -57,14 +57,14 @@
 }
 static method main() → dynamic {
   dynamic stringList = <core::String*>["string"];
-  exp::Expect::throwsTypeError(() → core::Null? {
+  exp::Expect::throwsTypeError(() → Null {
     self::test1(stringList);
   });
-  exp::Expect::throwsTypeError(() → core::Null? {
+  exp::Expect::throwsTypeError(() → Null {
     self::test2(stringList);
   });
   dynamic stringMap = <core::String*, core::String*>{"a": "b"};
-  exp::Expect::throwsTypeError(() → core::Null? {
+  exp::Expect::throwsTypeError(() → Null {
     self::test3(stringMap);
   });
 }
diff --git a/pkg/front_end/testcases/regress/utf_16_le_content.crash_dart.strong.expect b/pkg/front_end/testcases/regress/utf_16_le_content.crash_dart.strong.expect
index 66cffa4..aad6d8e 100644
--- a/pkg/front_end/testcases/regress/utf_16_le_content.crash_dart.strong.expect
+++ b/pkg/front_end/testcases/regress/utf_16_le_content.crash_dart.strong.expect
Binary files differ
diff --git a/pkg/front_end/testcases/regress/utf_16_le_content.crash_dart.strong.transformed.expect b/pkg/front_end/testcases/regress/utf_16_le_content.crash_dart.strong.transformed.expect
index 66cffa4..aad6d8e 100644
--- a/pkg/front_end/testcases/regress/utf_16_le_content.crash_dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/utf_16_le_content.crash_dart.strong.transformed.expect
Binary files differ
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.strong.expect b/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.strong.expect
index 051b376..86eda63 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.strong.expect
@@ -20,7 +20,7 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 static method g(self::C<core::num*>* c) → void {
-  c.{self::C::f}<(core::Object*) →* void>((core::Object* o) → core::Null? {});
+  c.{self::C::f}<(core::Object*) →* void>((core::Object* o) → Null {});
 }
 static method test() → void {
   self::g(new self::C::•<core::int*>());
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.strong.transformed.expect
index 051b376..86eda63 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.strong.transformed.expect
@@ -20,7 +20,7 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 static method g(self::C<core::num*>* c) → void {
-  c.{self::C::f}<(core::Object*) →* void>((core::Object* o) → core::Null? {});
+  c.{self::C::f}<(core::Object*) →* void>((core::Object* o) → Null {});
 }
 static method test() → void {
   self::g(new self::C::•<core::int*>());
diff --git a/pkg/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.outline.expect b/pkg/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.outline.expect
index d0c8058..bbdac51 100644
--- a/pkg/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.outline.expect
@@ -35,8 +35,8 @@
 class D extends self::C implements self::B<core::num*> {
   synthetic constructor •() → self::D*
     ;
-  forwarding-stub set x(generic-covariant-impl core::num* _) → void
-    return super.{self::C::x} = _;
+  forwarding-stub set x(generic-covariant-impl core::num* value) → void
+    return super.{self::C::x} = value;
 }
 static method main() → void
   ;
diff --git a/pkg/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.strong.expect b/pkg/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.strong.expect
index c2be143..26e36fb 100644
--- a/pkg/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.strong.expect
@@ -38,7 +38,7 @@
   synthetic constructor •() → self::D*
     : super self::C::•()
     ;
-  forwarding-stub set x(generic-covariant-impl core::num* _) → void
-    return super.{self::C::x} = _;
+  forwarding-stub set x(generic-covariant-impl core::num* value) → void
+    return super.{self::C::x} = value;
 }
 static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.strong.transformed.expect
index c2be143..26e36fb 100644
--- a/pkg/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.strong.transformed.expect
@@ -38,7 +38,7 @@
   synthetic constructor •() → self::D*
     : super self::C::•()
     ;
-  forwarding-stub set x(generic-covariant-impl core::num* _) → void
-    return super.{self::C::x} = _;
+  forwarding-stub set x(generic-covariant-impl core::num* value) → void
+    return super.{self::C::x} = value;
 }
 static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/folder.options b/pkg/front_end/testcases/runtime_checks/folder.options
new file mode 100644
index 0000000..dbc148e
--- /dev/null
+++ b/pkg/front_end/testcases/runtime_checks/folder.options
@@ -0,0 +1 @@
+--enable-experiment=no-non-nullable
\ No newline at end of file
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.outline.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.outline.expect
index bec3c2e..fcd72a0 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.outline.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 typedef F<contravariant T extends core::Object* = dynamic> = (T*) →* void;
-class B<T extends core::Object* = dynamic, U extends (self::B::T*) →* void = (core::Null?) →* void> extends core::Object {
+class B<T extends core::Object* = dynamic, U extends (self::B::T*) →* void = (Null) →* void> extends core::Object {
   synthetic constructor •() → self::B<self::B::T*, self::B::U*>*
     ;
   operator +(dynamic other) → self::B<self::B::T*, (self::B::T*) →* void>*
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.strong.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.strong.expect
index 9b11bf0c..3bb4b53 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.strong.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 typedef F<contravariant T extends core::Object* = dynamic> = (T*) →* void;
-class B<T extends core::Object* = dynamic, U extends (self::B::T*) →* void = (core::Null?) →* void> extends core::Object {
+class B<T extends core::Object* = dynamic, U extends (self::B::T*) →* void = (Null) →* void> extends core::Object {
   synthetic constructor •() → self::B<self::B::T*, self::B::U*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.strong.transformed.expect
index 4656a41..f94a84b 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.strong.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 typedef F<contravariant T extends core::Object* = dynamic> = (T*) →* void;
-class B<T extends core::Object* = dynamic, U extends (self::B::T*) →* void = (core::Null?) →* void> extends core::Object {
+class B<T extends core::Object* = dynamic, U extends (self::B::T*) →* void = (Null) →* void> extends core::Object {
   synthetic constructor •() → self::B<self::B::T*, self::B::U*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.strong.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.strong.expect
index 408ea27..e5ff096 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.strong.expect
@@ -85,7 +85,7 @@
                                              ^" in (#t1.{self::D::value}.{self::C::+}(1) as{TypeError,CovarianceCheck} (core::num*) →* core::num*) as{TypeError} (core::int*) →* core::int*;
   self::expect(let final self::D* #t3 = d in let final core::int* #t4 = 0 in #t3.{self::D::setValue}.call(#t4), 1);
   d = new self::D::•(new self::C::•<core::num*>(#C2));
-  self::expectTypeError(() → core::Null? {
+  self::expectTypeError(() → Null {
     let final self::D* #t5 = d in #t5.{self::D::value} = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart:53:48: Error: A value of type 'num Function(num)' can't be assigned to a variable of type 'int Function(int)'.
     d.value /*@ checkReturn=(num*) ->* num* */ += 1;
                                                ^" in (#t5.{self::D::value}.{self::C::+}(1) as{TypeError,CovarianceCheck} (core::num*) →* core::num*) as{TypeError} (core::int*) →* core::int*;
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.strong.transformed.expect
index 7907879..909cbfa 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.strong.transformed.expect
@@ -85,7 +85,7 @@
                                              ^" in (#t1.{self::D::value}.{self::C::+}(1) as{TypeError,CovarianceCheck} (core::num*) →* core::num*) as{TypeError} (core::int*) →* core::int*;
   self::expect(let final self::D* #t3 = d in let final core::int* #t4 = 0 in #t3.{self::D::setValue}.call(#t4), 1);
   d = new self::D::•(new self::C::•<core::num*>(#C2));
-  self::expectTypeError(() → core::Null? {
+  self::expectTypeError(() → Null {
     let final self::D* #t5 = d in #t5.{self::D::value} = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart:53:48: Error: A value of type 'num Function(num)' can't be assigned to a variable of type 'int Function(int)'.
     d.value /*@ checkReturn=(num*) ->* num* */ += 1;
                                                ^" in (#t5.{self::D::value}.{self::C::+}(1) as{TypeError,CovarianceCheck} (core::num*) →* core::num*) as{TypeError} (core::int*) →* core::int*;
diff --git a/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.outline.expect b/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.outline.expect
index f9cfecc..9c97b6c 100644
--- a/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.outline.expect
@@ -35,8 +35,8 @@
 class D extends self::C implements self::B {
   synthetic constructor •() → self::D*
     ;
-  forwarding-stub set x(covariant core::num* _) → void
-    return super.{self::C::x} = _;
+  forwarding-stub set x(covariant core::num* value) → void
+    return super.{self::C::x} = value;
 }
 static method main() → void
   ;
diff --git a/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.strong.expect b/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.strong.expect
index ff585af..92c4e15 100644
--- a/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.strong.expect
@@ -38,7 +38,7 @@
   synthetic constructor •() → self::D*
     : super self::C::•()
     ;
-  forwarding-stub set x(covariant core::num* _) → void
-    return super.{self::C::x} = _;
+  forwarding-stub set x(covariant core::num* value) → void
+    return super.{self::C::x} = value;
 }
 static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.strong.transformed.expect
index ff585af..92c4e15 100644
--- a/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.strong.transformed.expect
@@ -38,7 +38,7 @@
   synthetic constructor •() → self::D*
     : super self::C::•()
     ;
-  forwarding-stub set x(covariant core::num* _) → void
-    return super.{self::C::x} = _;
+  forwarding-stub set x(covariant core::num* value) → void
+    return super.{self::C::x} = value;
 }
 static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks_new/folder.options b/pkg/front_end/testcases/runtime_checks_new/folder.options
new file mode 100644
index 0000000..dbc148e
--- /dev/null
+++ b/pkg/front_end/testcases/runtime_checks_new/folder.options
@@ -0,0 +1 @@
+--enable-experiment=no-non-nullable
\ No newline at end of file
diff --git a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.outline.expect b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.outline.expect
index 8766dd4..d6eb674 100644
--- a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.outline.expect
@@ -76,8 +76,8 @@
   synthetic constructor •() → self::C*
     : super self::B::•()
     ;
-  forwarding-stub set x(generic-covariant-impl core::int* _) → void
-    return super.{self::B::x} = _;
+  forwarding-stub set x(generic-covariant-impl core::int* value) → void
+    return super.{self::B::x} = value;
   forwarding-stub set y(covariant core::Object* value) → void
     return super.{self::B::y} = value;
 }
diff --git a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.strong.expect b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.strong.expect
index d5d7813..6b59110 100644
--- a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.strong.expect
@@ -83,8 +83,8 @@
   synthetic constructor •() → self::C*
     : super self::B::•()
     ;
-  forwarding-stub set x(generic-covariant-impl core::int* _) → void
-    return super.{self::B::x} = _;
+  forwarding-stub set x(generic-covariant-impl core::int* value) → void
+    return super.{self::B::x} = value;
   forwarding-stub set y(covariant core::Object* value) → void
     return super.{self::B::y} = value;
 }
@@ -102,12 +102,12 @@
   }
 }
 static method test(self::I<core::Object*>* i) → void {
-  self::expectTypeError(() → core::Null? {
+  self::expectTypeError(() → Null {
     i.{self::I::x} = "hello";
   });
   i.{self::I::x} = 1;
   self::expect(i.{self::I::x}, 1);
-  self::expectTypeError(() → core::Null? {
+  self::expectTypeError(() → Null {
     i.{self::I::y} = "hello";
   });
   i.{self::I::y} = 2;
diff --git a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart.strong.expect b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart.strong.expect
index b8a30d8..48bd4ce 100644
--- a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart.strong.expect
@@ -111,12 +111,12 @@
   }
 }
 static method test(self::I<core::Object*>* i) → void {
-  self::expectTypeError(() → core::Null? {
+  self::expectTypeError(() → Null {
     i.{self::I::x} = "hello";
   });
   i.{self::I::x} = 2;
   self::expect(i.{self::I::x}, 1);
-  self::expectTypeError(() → core::Null? {
+  self::expectTypeError(() → Null {
     i.{self::I::y} = "hello";
   });
   i.{self::I::y} = 4;
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_checked_via_target.dart.strong.expect b/pkg/front_end/testcases/runtime_checks_new/stub_checked_via_target.dart.strong.expect
index e26385d..ac79e6e 100644
--- a/pkg/front_end/testcases/runtime_checks_new/stub_checked_via_target.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_checked_via_target.dart.strong.expect
@@ -61,11 +61,11 @@
   c.{self::C::f}("hello");
 }
 static method test(self::C* c, self::I* i) → void {
-  self::expectTypeError(() → core::Null? {
+  self::expectTypeError(() → Null {
     i.{self::I::f}("hello");
   });
   self::expect(i.{self::I::f}(1), 2);
-  self::expectTypeError(() → core::Null? {
+  self::expectTypeError(() → Null {
     c.{self::C::f}("hello");
   });
   self::expect(c.{self::C::f}(1), 2);
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_checked_via_target.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/stub_checked_via_target.dart.strong.transformed.expect
index e26385d..ac79e6e 100644
--- a/pkg/front_end/testcases/runtime_checks_new/stub_checked_via_target.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_checked_via_target.dart.strong.transformed.expect
@@ -61,11 +61,11 @@
   c.{self::C::f}("hello");
 }
 static method test(self::C* c, self::I* i) → void {
-  self::expectTypeError(() → core::Null? {
+  self::expectTypeError(() → Null {
     i.{self::I::f}("hello");
   });
   self::expect(i.{self::I::f}(1), 2);
-  self::expectTypeError(() → core::Null? {
+  self::expectTypeError(() → Null {
     c.{self::C::f}("hello");
   });
   self::expect(c.{self::C::f}(1), 2);
diff --git a/pkg/front_end/testcases/set_literals/disambiguation_rule.dart.strong.expect b/pkg/front_end/testcases/set_literals/disambiguation_rule.dart.strong.expect
index 162d6c8..fc7f9e3 100644
--- a/pkg/front_end/testcases/set_literals/disambiguation_rule.dart.strong.expect
+++ b/pkg/front_end/testcases/set_literals/disambiguation_rule.dart.strong.expect
@@ -54,14 +54,20 @@
 
 static method main() → dynamic async {
   core::Map<core::int*, core::bool*>* m = <core::int*, core::bool*>{};
-  core::Set<core::int*>* s = let final core::Set<core::int*>* #t1 = col::LinkedHashSet::•<core::int*>() in #t1;
-  core::Iterable<core::int*>* i = let final core::Set<core::int*>* #t2 = col::LinkedHashSet::•<core::int*>() in #t2;
+  core::Set<core::int*>* s = block {
+    final core::Set<core::int*>* #t1 = col::LinkedHashSet::•<core::int*>();
+  } =>#t1;
+  core::Iterable<core::int*>* i = block {
+    final core::Set<core::int*>* #t2 = col::LinkedHashSet::•<core::int*>();
+  } =>#t2;
   col::LinkedHashSet<core::int*>* lhs = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/set_literals/disambiguation_rule.dart:13:28: Error: The set literal type 'Set<dynamic>' isn't of expected type 'LinkedHashSet<int>'.
  - 'Set' is from 'dart:core'.
  - 'LinkedHashSet' is from 'dart:collection'.
 Change the type of the set literal or the context in which it is used.
   LinkedHashSet<int> lhs = {};
-                           ^" in let final core::Set<dynamic>* #t4 = col::LinkedHashSet::•<dynamic>() in #t4;
+                           ^" in block {
+    final core::Set<dynamic>* #t4 = col::LinkedHashSet::•<dynamic>();
+  } =>#t4;
   col::LinkedHashMap<core::int*, core::bool*>* lhm = let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/set_literals/disambiguation_rule.dart:14:34: Error: The map literal type 'Map<dynamic, dynamic>' isn't of expected type 'LinkedHashMap<int, bool>'.
  - 'Map' is from 'dart:core'.
  - 'LinkedHashMap' is from 'dart:collection'.
@@ -82,9 +88,13 @@
 static method mapfun() → asy::Future<core::Map<core::int*, core::bool*>*>* async 
   return <core::int*, core::bool*>{};
 static method setfun() → asy::Future<core::Set<core::int*>*>* async 
-  return let final core::Set<core::int*>* #t6 = col::LinkedHashSet::•<core::int*>() in #t6;
+  return block {
+    final core::Set<core::int*>* #t6 = col::LinkedHashSet::•<core::int*>();
+  } =>#t6;
 static method iterablefun() → asy::Future<core::Iterable<core::int*>*>* async 
-  return let final core::Set<core::int*>* #t7 = col::LinkedHashSet::•<core::int*>() in #t7;
+  return block {
+    final core::Set<core::int*>* #t7 = col::LinkedHashSet::•<core::int*>();
+  } =>#t7;
 static method lhsfun() → asy::Future<col::LinkedHashSet<core::int*>*>* async 
   return let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/set_literals/disambiguation_rule.dart:32:46: Error: The set literal type 'Future<Set<dynamic>>' isn't of expected type 'Future<LinkedHashSet<int>>'.
  - 'Future' is from 'dart:async'.
@@ -92,7 +102,9 @@
  - 'LinkedHashSet' is from 'dart:collection'.
 Change the type of the set literal or the context in which it is used.
 Future<LinkedHashSet<int>> lhsfun() async => {};
-                                             ^" in let final core::Set<dynamic>* #t9 = col::LinkedHashSet::•<dynamic>() in #t9;
+                                             ^" in block {
+    final core::Set<dynamic>* #t9 = col::LinkedHashSet::•<dynamic>();
+  } =>#t9;
 static method lhmfun() → asy::Future<col::LinkedHashMap<core::int*, core::bool*>*>* async 
   return let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/set_literals/disambiguation_rule.dart:33:52: Error: The map literal type 'Future<Map<dynamic, dynamic>>' isn't of expected type 'Future<LinkedHashMap<int, bool>>'.
  - 'Future' is from 'dart:async'.
@@ -104,15 +116,21 @@
 static method mapfun2() → FutureOr<core::Map<core::int*, core::bool*>*>*
   return <core::int*, core::bool*>{};
 static method setfun2() → FutureOr<core::Set<core::int*>*>*
-  return let final core::Set<core::int*>* #t11 = col::LinkedHashSet::•<core::int*>() in #t11;
+  return block {
+    final core::Set<core::int*>* #t11 = col::LinkedHashSet::•<core::int*>();
+  } =>#t11;
 static method iterablefun2() → FutureOr<core::Iterable<core::int*>*>*
-  return let final core::Set<core::int*>* #t12 = col::LinkedHashSet::•<core::int*>() in #t12;
+  return block {
+    final core::Set<core::int*>* #t12 = col::LinkedHashSet::•<core::int*>();
+  } =>#t12;
 static method lhsfun2() → FutureOr<col::LinkedHashSet<core::int*>*>*
   return let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/set_literals/disambiguation_rule.dart:38:43: Error: A value of type 'Set<dynamic>' can't be assigned to a variable of type 'FutureOr<LinkedHashSet<int>>'.
  - 'Set' is from 'dart:core'.
  - 'LinkedHashSet' is from 'dart:collection'.
 FutureOr<LinkedHashSet<int>> lhsfun2() => {};
-                                          ^" in (let final core::Set<dynamic>* #t14 = col::LinkedHashSet::•<dynamic>() in #t14) as{TypeError} FutureOr<col::LinkedHashSet<core::int*>*>*;
+                                          ^" in ( block {
+    final core::Set<dynamic>* #t14 = col::LinkedHashSet::•<dynamic>();
+  } =>#t14) as{TypeError} FutureOr<col::LinkedHashSet<core::int*>*>*;
 static method lhmfun2() → FutureOr<col::LinkedHashMap<core::int*, core::bool*>*>*
   return let final<BottomType> #t15 = invalid-expression "pkg/front_end/testcases/set_literals/disambiguation_rule.dart:39:49: Error: A value of type 'Map<dynamic, dynamic>' can't be assigned to a variable of type 'FutureOr<LinkedHashMap<int, bool>>'.
  - 'Map' is from 'dart:core'.
diff --git a/pkg/front_end/testcases/set_literals/disambiguation_rule.dart.strong.transformed.expect b/pkg/front_end/testcases/set_literals/disambiguation_rule.dart.strong.transformed.expect
index f05acc0..01725ee 100644
--- a/pkg/front_end/testcases/set_literals/disambiguation_rule.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/set_literals/disambiguation_rule.dart.strong.transformed.expect
@@ -54,7 +54,8 @@
 import "dart:collection" show LinkedHashMap, LinkedHashSet;
 
 static method main() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic>* :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -67,14 +68,20 @@
       #L1:
       {
         core::Map<core::int*, core::bool*>* m = <core::int*, core::bool*>{};
-        core::Set<core::int*>* s = let final core::Set<core::int*>* #t1 = new col::_CompactLinkedHashSet::•<core::int*>() in #t1;
-        core::Iterable<core::int*>* i = let final core::Set<core::int*>* #t2 = new col::_CompactLinkedHashSet::•<core::int*>() in #t2;
+        core::Set<core::int*>* s = block {
+          final core::Set<core::int*>* #t1 = new col::_CompactLinkedHashSet::•<core::int*>();
+        } =>#t1;
+        core::Iterable<core::int*>* i = block {
+          final core::Set<core::int*>* #t2 = new col::_CompactLinkedHashSet::•<core::int*>();
+        } =>#t2;
         col::LinkedHashSet<core::int*>* lhs = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/set_literals/disambiguation_rule.dart:13:28: Error: The set literal type 'Set<dynamic>' isn't of expected type 'LinkedHashSet<int>'.
  - 'Set' is from 'dart:core'.
  - 'LinkedHashSet' is from 'dart:collection'.
 Change the type of the set literal or the context in which it is used.
   LinkedHashSet<int> lhs = {};
-                           ^" in let final core::Set<dynamic>* #t4 = new col::_CompactLinkedHashSet::•<dynamic>() in #t4;
+                           ^" in block {
+          final core::Set<dynamic>* #t4 = new col::_CompactLinkedHashSet::•<dynamic>();
+        } =>#t4;
         col::LinkedHashMap<core::int*, core::bool*>* lhm = let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/set_literals/disambiguation_rule.dart:14:34: Error: The map literal type 'Map<dynamic, dynamic>' isn't of expected type 'LinkedHashMap<int, bool>'.
  - 'Map' is from 'dart:core'.
  - 'LinkedHashMap' is from 'dart:collection'.
@@ -102,20 +109,22 @@
         [yield] let dynamic #t15 = asy::_awaitHelper(self::lhmfun2(), :async_op_then, :async_op_error, :async_op) in null;
         col::LinkedHashMap<core::int*, core::bool*>* flhm2 = _in::unsafeCast<col::LinkedHashMap<core::int*, core::bool*>*>(:result);
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method mapfun() → asy::Future<core::Map<core::int*, core::bool*>*>* /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::Map<core::int*, core::bool*>*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::Map<core::int*, core::bool*>*>();
+  final asy::_Future<core::Map<core::int*, core::bool*>*>* :async_future = new asy::_Future::•<core::Map<core::int*, core::bool*>*>();
+  core::bool* :is_sync = false;
   FutureOr<core::Map<core::int*, core::bool*>*>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -129,20 +138,22 @@
         :return_value = <core::int*, core::bool*>{};
         break #L2;
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method setfun() → asy::Future<core::Set<core::int*>*>* /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::Set<core::int*>*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::Set<core::int*>*>();
+  final asy::_Future<core::Set<core::int*>*>* :async_future = new asy::_Future::•<core::Set<core::int*>*>();
+  core::bool* :is_sync = false;
   FutureOr<core::Set<core::int*>*>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -153,23 +164,27 @@
     try {
       #L3:
       {
-        :return_value = let final core::Set<core::int*>* #t16 = new col::_CompactLinkedHashSet::•<core::int*>() in #t16;
+        :return_value = block {
+          final core::Set<core::int*>* #t16 = new col::_CompactLinkedHashSet::•<core::int*>();
+        } =>#t16;
         break #L3;
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method iterablefun() → asy::Future<core::Iterable<core::int*>*>* /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::Iterable<core::int*>*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::Iterable<core::int*>*>();
+  final asy::_Future<core::Iterable<core::int*>*>* :async_future = new asy::_Future::•<core::Iterable<core::int*>*>();
+  core::bool* :is_sync = false;
   FutureOr<core::Iterable<core::int*>*>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -180,23 +195,27 @@
     try {
       #L4:
       {
-        :return_value = let final core::Set<core::int*>* #t17 = new col::_CompactLinkedHashSet::•<core::int*>() in #t17;
+        :return_value = block {
+          final core::Set<core::int*>* #t17 = new col::_CompactLinkedHashSet::•<core::int*>();
+        } =>#t17;
         break #L4;
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method lhsfun() → asy::Future<col::LinkedHashSet<core::int*>*>* /* originally async */ {
-  final asy::_AsyncAwaitCompleter<col::LinkedHashSet<core::int*>*>* :async_completer = new asy::_AsyncAwaitCompleter::•<col::LinkedHashSet<core::int*>*>();
+  final asy::_Future<col::LinkedHashSet<core::int*>*>* :async_future = new asy::_Future::•<col::LinkedHashSet<core::int*>*>();
+  core::bool* :is_sync = false;
   FutureOr<col::LinkedHashSet<core::int*>*>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -213,23 +232,27 @@
  - 'LinkedHashSet' is from 'dart:collection'.
 Change the type of the set literal or the context in which it is used.
 Future<LinkedHashSet<int>> lhsfun() async => {};
-                                             ^" in let final core::Set<dynamic>* #t19 = new col::_CompactLinkedHashSet::•<dynamic>() in #t19;
+                                             ^" in block {
+          final core::Set<dynamic>* #t19 = new col::_CompactLinkedHashSet::•<dynamic>();
+        } =>#t19;
         break #L5;
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method lhmfun() → asy::Future<col::LinkedHashMap<core::int*, core::bool*>*>* /* originally async */ {
-  final asy::_AsyncAwaitCompleter<col::LinkedHashMap<core::int*, core::bool*>*>* :async_completer = new asy::_AsyncAwaitCompleter::•<col::LinkedHashMap<core::int*, core::bool*>*>();
+  final asy::_Future<col::LinkedHashMap<core::int*, core::bool*>*>* :async_future = new asy::_Future::•<col::LinkedHashMap<core::int*, core::bool*>*>();
+  core::bool* :is_sync = false;
   FutureOr<col::LinkedHashMap<core::int*, core::bool*>*>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -249,30 +272,37 @@
                                                    ^" in <dynamic, dynamic>{};
         break #L6;
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return :async_completer.{asy::Completer::future};
+  :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method mapfun2() → FutureOr<core::Map<core::int*, core::bool*>*>*
   return <core::int*, core::bool*>{};
 static method setfun2() → FutureOr<core::Set<core::int*>*>*
-  return let final core::Set<core::int*>* #t21 = new col::_CompactLinkedHashSet::•<core::int*>() in #t21;
+  return block {
+    final core::Set<core::int*>* #t21 = new col::_CompactLinkedHashSet::•<core::int*>();
+  } =>#t21;
 static method iterablefun2() → FutureOr<core::Iterable<core::int*>*>*
-  return let final core::Set<core::int*>* #t22 = new col::_CompactLinkedHashSet::•<core::int*>() in #t22;
+  return block {
+    final core::Set<core::int*>* #t22 = new col::_CompactLinkedHashSet::•<core::int*>();
+  } =>#t22;
 static method lhsfun2() → FutureOr<col::LinkedHashSet<core::int*>*>*
   return let final<BottomType> #t23 = invalid-expression "pkg/front_end/testcases/set_literals/disambiguation_rule.dart:38:43: Error: A value of type 'Set<dynamic>' can't be assigned to a variable of type 'FutureOr<LinkedHashSet<int>>'.
  - 'Set' is from 'dart:core'.
  - 'LinkedHashSet' is from 'dart:collection'.
 FutureOr<LinkedHashSet<int>> lhsfun2() => {};
-                                          ^" in (let final core::Set<dynamic>* #t24 = new col::_CompactLinkedHashSet::•<dynamic>() in #t24) as{TypeError} FutureOr<col::LinkedHashSet<core::int*>*>*;
+                                          ^" in ( block {
+    final core::Set<dynamic>* #t24 = new col::_CompactLinkedHashSet::•<dynamic>();
+  } =>#t24) as{TypeError} FutureOr<col::LinkedHashSet<core::int*>*>*;
 static method lhmfun2() → FutureOr<col::LinkedHashMap<core::int*, core::bool*>*>*
   return let final<BottomType> #t25 = invalid-expression "pkg/front_end/testcases/set_literals/disambiguation_rule.dart:39:49: Error: A value of type 'Map<dynamic, dynamic>' can't be assigned to a variable of type 'FutureOr<LinkedHashMap<int, bool>>'.
  - 'Map' is from 'dart:core'.
diff --git a/pkg/front_end/testcases/set_literals/folder.options b/pkg/front_end/testcases/set_literals/folder.options
new file mode 100644
index 0000000..dbc148e
--- /dev/null
+++ b/pkg/front_end/testcases/set_literals/folder.options
@@ -0,0 +1 @@
+--enable-experiment=no-non-nullable
\ No newline at end of file
diff --git a/pkg/front_end/testcases/static_field_lowering/opt_in.dart.weak.expect b/pkg/front_end/testcases/static_field_lowering/opt_in.dart.weak.expect
index da6a3f4..c4ea2b5 100644
--- a/pkg/front_end/testcases/static_field_lowering/opt_in.dart.weak.expect
+++ b/pkg/front_end/testcases/static_field_lowering/opt_in.dart.weak.expect
@@ -79,7 +79,7 @@
     if(!self::Class::_#nonNullableStaticFinalFieldWithInitializer1#isSet) {
       final core::int #t7 = self::init<core::int>(73);
       if(self::Class::_#nonNullableStaticFinalFieldWithInitializer1#isSet)
-        throw new _in::LateInitializationErrorImpl::•("Field 'nonNullableStaticFinalFieldWithInitializer1' has been assigned during initialization.");
+        throw new _in::LateError::fieldADI("nonNullableStaticFinalFieldWithInitializer1");
       self::Class::_#nonNullableStaticFinalFieldWithInitializer1 = #t7;
       self::Class::_#nonNullableStaticFinalFieldWithInitializer1#isSet = true;
     }
@@ -89,7 +89,7 @@
     if(!self::Class::_#nullableStaticFinalFieldWithInitializer1#isSet) {
       final core::int? #t9 = self::init<core::int?>(19);
       if(self::Class::_#nullableStaticFinalFieldWithInitializer1#isSet)
-        throw new _in::LateInitializationErrorImpl::•("Field 'nullableStaticFinalFieldWithInitializer1' has been assigned during initialization.");
+        throw new _in::LateError::fieldADI("nullableStaticFinalFieldWithInitializer1");
       self::Class::_#nullableStaticFinalFieldWithInitializer1 = #t9;
       self::Class::_#nullableStaticFinalFieldWithInitializer1#isSet = true;
     }
@@ -110,7 +110,7 @@
     if(!self::Class::_#nonNullableStaticFinalFieldWithInitializer2#isSet) {
       final core::int #t12 = (let final core::int #t13 = self::Class::nonNullableStaticFinalFieldWithInitializer2Init in let final core::int #t14 = self::Class::nonNullableStaticFinalFieldWithInitializer2Init = #t13.{core::num::+}(1) in #t13).{core::num::==}(0) ?{core::int} self::Class::nonNullableStaticFinalFieldWithInitializer2.{core::num::+}(1) : 87;
       if(self::Class::_#nonNullableStaticFinalFieldWithInitializer2#isSet)
-        throw new _in::LateInitializationErrorImpl::•("Field 'nonNullableStaticFinalFieldWithInitializer2' has been assigned during initialization.");
+        throw new _in::LateError::fieldADI("nonNullableStaticFinalFieldWithInitializer2");
       self::Class::_#nonNullableStaticFinalFieldWithInitializer2 = #t12;
       self::Class::_#nonNullableStaticFinalFieldWithInitializer2#isSet = true;
     }
@@ -131,7 +131,7 @@
     if(!self::Class::_#nullableStaticFinalFieldWithInitializer2#isSet) {
       final core::int? #t18 = (let final core::int #t19 = self::Class::nullableStaticFinalFieldWithInitializer2Init in let final core::int #t20 = self::Class::nullableStaticFinalFieldWithInitializer2Init = #t19.{core::num::+}(1) in #t19).{core::num::==}(0) ?{core::int} self::Class::nullableStaticFinalFieldWithInitializer2!.{core::num::+}(1) : 32;
       if(self::Class::_#nullableStaticFinalFieldWithInitializer2#isSet)
-        throw new _in::LateInitializationErrorImpl::•("Field 'nullableStaticFinalFieldWithInitializer2' has been assigned during initialization.");
+        throw new _in::LateError::fieldADI("nullableStaticFinalFieldWithInitializer2");
       self::Class::_#nullableStaticFinalFieldWithInitializer2 = #t18;
       self::Class::_#nullableStaticFinalFieldWithInitializer2#isSet = true;
     }
@@ -213,7 +213,7 @@
   if(!self::_#nonNullableFinalTopLevelFieldWithInitializer1#isSet) {
     final core::int #t27 = self::init<core::int>(87);
     if(self::_#nonNullableFinalTopLevelFieldWithInitializer1#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Field 'nonNullableFinalTopLevelFieldWithInitializer1' has been assigned during initialization.");
+      throw new _in::LateError::fieldADI("nonNullableFinalTopLevelFieldWithInitializer1");
     self::_#nonNullableFinalTopLevelFieldWithInitializer1 = #t27;
     self::_#nonNullableFinalTopLevelFieldWithInitializer1#isSet = true;
   }
@@ -223,7 +223,7 @@
   if(!self::_#nullableFinalTopLevelFieldWithInitializer1#isSet) {
     final core::int? #t29 = self::init<core::int?>(32);
     if(self::_#nullableFinalTopLevelFieldWithInitializer1#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Field 'nullableFinalTopLevelFieldWithInitializer1' has been assigned during initialization.");
+      throw new _in::LateError::fieldADI("nullableFinalTopLevelFieldWithInitializer1");
     self::_#nullableFinalTopLevelFieldWithInitializer1 = #t29;
     self::_#nullableFinalTopLevelFieldWithInitializer1#isSet = true;
   }
@@ -244,7 +244,7 @@
   if(!self::_#nonNullableFinalTopLevelFieldWithInitializer2#isSet) {
     final core::int #t32 = (let final core::int #t33 = self::nonNullableFinalTopLevelFieldWithInitializer2Init in let final core::int #t34 = self::nonNullableFinalTopLevelFieldWithInitializer2Init = #t33.{core::num::+}(1) in #t33).{core::num::==}(0) ?{core::int} self::nonNullableFinalTopLevelFieldWithInitializer2.{core::num::+}(1) : 87;
     if(self::_#nonNullableFinalTopLevelFieldWithInitializer2#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Field 'nonNullableFinalTopLevelFieldWithInitializer2' has been assigned during initialization.");
+      throw new _in::LateError::fieldADI("nonNullableFinalTopLevelFieldWithInitializer2");
     self::_#nonNullableFinalTopLevelFieldWithInitializer2 = #t32;
     self::_#nonNullableFinalTopLevelFieldWithInitializer2#isSet = true;
   }
@@ -265,7 +265,7 @@
   if(!self::_#nullableFinalTopLevelFieldWithInitializer2#isSet) {
     final core::int? #t38 = (let final core::int #t39 = self::nullableFinalTopLevelFieldWithInitializer2Init in let final core::int #t40 = self::nullableFinalTopLevelFieldWithInitializer2Init = #t39.{core::num::+}(1) in #t39).{core::num::==}(0) ?{core::int} self::nullableFinalTopLevelFieldWithInitializer2!.{core::num::+}(1) : 32;
     if(self::_#nullableFinalTopLevelFieldWithInitializer2#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Field 'nullableFinalTopLevelFieldWithInitializer2' has been assigned during initialization.");
+      throw new _in::LateError::fieldADI("nullableFinalTopLevelFieldWithInitializer2");
     self::_#nullableFinalTopLevelFieldWithInitializer2 = #t38;
     self::_#nullableFinalTopLevelFieldWithInitializer2#isSet = true;
   }
diff --git a/pkg/front_end/testcases/static_field_lowering/opt_in.dart.weak.transformed.expect b/pkg/front_end/testcases/static_field_lowering/opt_in.dart.weak.transformed.expect
index da6a3f4..c4ea2b5 100644
--- a/pkg/front_end/testcases/static_field_lowering/opt_in.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/static_field_lowering/opt_in.dart.weak.transformed.expect
@@ -79,7 +79,7 @@
     if(!self::Class::_#nonNullableStaticFinalFieldWithInitializer1#isSet) {
       final core::int #t7 = self::init<core::int>(73);
       if(self::Class::_#nonNullableStaticFinalFieldWithInitializer1#isSet)
-        throw new _in::LateInitializationErrorImpl::•("Field 'nonNullableStaticFinalFieldWithInitializer1' has been assigned during initialization.");
+        throw new _in::LateError::fieldADI("nonNullableStaticFinalFieldWithInitializer1");
       self::Class::_#nonNullableStaticFinalFieldWithInitializer1 = #t7;
       self::Class::_#nonNullableStaticFinalFieldWithInitializer1#isSet = true;
     }
@@ -89,7 +89,7 @@
     if(!self::Class::_#nullableStaticFinalFieldWithInitializer1#isSet) {
       final core::int? #t9 = self::init<core::int?>(19);
       if(self::Class::_#nullableStaticFinalFieldWithInitializer1#isSet)
-        throw new _in::LateInitializationErrorImpl::•("Field 'nullableStaticFinalFieldWithInitializer1' has been assigned during initialization.");
+        throw new _in::LateError::fieldADI("nullableStaticFinalFieldWithInitializer1");
       self::Class::_#nullableStaticFinalFieldWithInitializer1 = #t9;
       self::Class::_#nullableStaticFinalFieldWithInitializer1#isSet = true;
     }
@@ -110,7 +110,7 @@
     if(!self::Class::_#nonNullableStaticFinalFieldWithInitializer2#isSet) {
       final core::int #t12 = (let final core::int #t13 = self::Class::nonNullableStaticFinalFieldWithInitializer2Init in let final core::int #t14 = self::Class::nonNullableStaticFinalFieldWithInitializer2Init = #t13.{core::num::+}(1) in #t13).{core::num::==}(0) ?{core::int} self::Class::nonNullableStaticFinalFieldWithInitializer2.{core::num::+}(1) : 87;
       if(self::Class::_#nonNullableStaticFinalFieldWithInitializer2#isSet)
-        throw new _in::LateInitializationErrorImpl::•("Field 'nonNullableStaticFinalFieldWithInitializer2' has been assigned during initialization.");
+        throw new _in::LateError::fieldADI("nonNullableStaticFinalFieldWithInitializer2");
       self::Class::_#nonNullableStaticFinalFieldWithInitializer2 = #t12;
       self::Class::_#nonNullableStaticFinalFieldWithInitializer2#isSet = true;
     }
@@ -131,7 +131,7 @@
     if(!self::Class::_#nullableStaticFinalFieldWithInitializer2#isSet) {
       final core::int? #t18 = (let final core::int #t19 = self::Class::nullableStaticFinalFieldWithInitializer2Init in let final core::int #t20 = self::Class::nullableStaticFinalFieldWithInitializer2Init = #t19.{core::num::+}(1) in #t19).{core::num::==}(0) ?{core::int} self::Class::nullableStaticFinalFieldWithInitializer2!.{core::num::+}(1) : 32;
       if(self::Class::_#nullableStaticFinalFieldWithInitializer2#isSet)
-        throw new _in::LateInitializationErrorImpl::•("Field 'nullableStaticFinalFieldWithInitializer2' has been assigned during initialization.");
+        throw new _in::LateError::fieldADI("nullableStaticFinalFieldWithInitializer2");
       self::Class::_#nullableStaticFinalFieldWithInitializer2 = #t18;
       self::Class::_#nullableStaticFinalFieldWithInitializer2#isSet = true;
     }
@@ -213,7 +213,7 @@
   if(!self::_#nonNullableFinalTopLevelFieldWithInitializer1#isSet) {
     final core::int #t27 = self::init<core::int>(87);
     if(self::_#nonNullableFinalTopLevelFieldWithInitializer1#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Field 'nonNullableFinalTopLevelFieldWithInitializer1' has been assigned during initialization.");
+      throw new _in::LateError::fieldADI("nonNullableFinalTopLevelFieldWithInitializer1");
     self::_#nonNullableFinalTopLevelFieldWithInitializer1 = #t27;
     self::_#nonNullableFinalTopLevelFieldWithInitializer1#isSet = true;
   }
@@ -223,7 +223,7 @@
   if(!self::_#nullableFinalTopLevelFieldWithInitializer1#isSet) {
     final core::int? #t29 = self::init<core::int?>(32);
     if(self::_#nullableFinalTopLevelFieldWithInitializer1#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Field 'nullableFinalTopLevelFieldWithInitializer1' has been assigned during initialization.");
+      throw new _in::LateError::fieldADI("nullableFinalTopLevelFieldWithInitializer1");
     self::_#nullableFinalTopLevelFieldWithInitializer1 = #t29;
     self::_#nullableFinalTopLevelFieldWithInitializer1#isSet = true;
   }
@@ -244,7 +244,7 @@
   if(!self::_#nonNullableFinalTopLevelFieldWithInitializer2#isSet) {
     final core::int #t32 = (let final core::int #t33 = self::nonNullableFinalTopLevelFieldWithInitializer2Init in let final core::int #t34 = self::nonNullableFinalTopLevelFieldWithInitializer2Init = #t33.{core::num::+}(1) in #t33).{core::num::==}(0) ?{core::int} self::nonNullableFinalTopLevelFieldWithInitializer2.{core::num::+}(1) : 87;
     if(self::_#nonNullableFinalTopLevelFieldWithInitializer2#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Field 'nonNullableFinalTopLevelFieldWithInitializer2' has been assigned during initialization.");
+      throw new _in::LateError::fieldADI("nonNullableFinalTopLevelFieldWithInitializer2");
     self::_#nonNullableFinalTopLevelFieldWithInitializer2 = #t32;
     self::_#nonNullableFinalTopLevelFieldWithInitializer2#isSet = true;
   }
@@ -265,7 +265,7 @@
   if(!self::_#nullableFinalTopLevelFieldWithInitializer2#isSet) {
     final core::int? #t38 = (let final core::int #t39 = self::nullableFinalTopLevelFieldWithInitializer2Init in let final core::int #t40 = self::nullableFinalTopLevelFieldWithInitializer2Init = #t39.{core::num::+}(1) in #t39).{core::num::==}(0) ?{core::int} self::nullableFinalTopLevelFieldWithInitializer2!.{core::num::+}(1) : 32;
     if(self::_#nullableFinalTopLevelFieldWithInitializer2#isSet)
-      throw new _in::LateInitializationErrorImpl::•("Field 'nullableFinalTopLevelFieldWithInitializer2' has been assigned during initialization.");
+      throw new _in::LateError::fieldADI("nullableFinalTopLevelFieldWithInitializer2");
     self::_#nullableFinalTopLevelFieldWithInitializer2 = #t38;
     self::_#nullableFinalTopLevelFieldWithInitializer2#isSet = true;
   }
diff --git a/pkg/front_end/testcases/strong.status b/pkg/front_end/testcases/strong.status
index c15549a..8df4cda 100644
--- a/pkg/front_end/testcases/strong.status
+++ b/pkg/front_end/testcases/strong.status
@@ -78,6 +78,7 @@
 general/mixin_application_override: ExpectationFileMismatch # Too many errors.
 general/mixin_application_override: TypeCheckError
 general/mixin_constructors_with_default_values: RuntimeError # Expected
+general/mixin_covariant2: TypeCheckError
 general/operator_method_not_found: RuntimeError # Expected
 general/optional: TypeCheckError
 general/override_check_accessor_after_inference: TypeCheckError # Issue #31620
@@ -87,11 +88,9 @@
 general/override_check_basic: TypeCheckError # Issue #31620
 general/override_check_with_covariant_modifier: TypeCheckError # Issue #31620
 general/override_setter_with_field: TypeCheckError
-general/reject_generic_function_types_in_bounds: RuntimeError # Expected
 general/spread_collection: RuntimeError
 general/type_parameter_type_named_int: RuntimeError # Expected
 general/type_variable_as_super: RuntimeError
-general/type_variable_bound_access: TypeCheckError
 general/unsound_promotion: TypeCheckError
 general/void_methods: RuntimeError
 general/with_dependencies/issue_43084/issue_43084: RuntimeError
@@ -135,12 +134,10 @@
 general_nnbd_opt_out/override_check_basic: TypeCheckError # Issue #31620
 general_nnbd_opt_out/override_check_with_covariant_modifier: TypeCheckError # Issue #31620
 general_nnbd_opt_out/override_setter_with_field: TypeCheckError
-general_nnbd_opt_out/reject_generic_function_types_in_bounds: RuntimeError # Expected
 general_nnbd_opt_out/spread_collection: RuntimeError
 general_nnbd_opt_out/statements: Crash
 general_nnbd_opt_out/type_parameter_type_named_int: RuntimeError # Expected
 general_nnbd_opt_out/type_variable_as_super: RuntimeError
-general_nnbd_opt_out/type_variable_bound_access: TypeCheckError
 general_nnbd_opt_out/unsound_promotion: TypeCheckError
 general_nnbd_opt_out/void_methods: RuntimeError
 inference/constructors_infer_from_arguments_argument_not_assignable: TypeCheckError
@@ -168,11 +165,7 @@
 inference_new/infer_assign_to_index_upwards: TypeCheckError
 inference_new/infer_assign_to_property_custom: TypeCheckError
 inference_new/invalid_assignment_during_toplevel_inference: TypeCheckError
-instantiate_to_bound/non_simple_class_parametrized_typedef_cycle: RuntimeError # Expected
-instantiate_to_bound/non_simple_generic_function_in_bound_regress: RuntimeError # Expected
 late_lowering/covariant_late_field: TypeCheckError
-late_lowering/initializer_rewrite_from_opt_out: RuntimeError # Test is inherently mixed mode
-late_lowering/non_nullable_from_opt_out: RuntimeError # Test is inherently mixed mode
 nnbd/covariant_late_field: TypeCheckError
 nnbd/getter_vs_setter_type: TypeCheckError
 nnbd/issue41180: RuntimeError # Strong mode runtime checking fails due to mixed strong mode.
@@ -182,8 +175,7 @@
 nnbd/nullable_object_access: TypeCheckError
 nnbd/nullable_receiver: TypeCheckError
 nnbd/potentially_nullable_access: TypeCheckError
-nnbd/strong_lib_not_ok_from_dill/strong: RuntimeError
-nnbd/strong_package_not_ok_from_dill/strong: RuntimeError
+none/mixin_covariant: TypeCheckError
 rasta/abstract_constructor: RuntimeError
 rasta/bad_constructor_redirection: RuntimeError
 rasta/bad_continue: RuntimeError
diff --git a/pkg/front_end/testcases/text_serialization.status b/pkg/front_end/testcases/text_serialization.status
index 3c35730..20825b3 100644
--- a/pkg/front_end/testcases/text_serialization.status
+++ b/pkg/front_end/testcases/text_serialization.status
@@ -25,7 +25,7 @@
 general/candidate_found: TypeCheckError
 general/cascade: RuntimeError
 general/constants/with_unevaluated_agnostic/const_asserts: TextSerializationFailure
-general/constants/with_unevaluated_agnostic/const_collections: TextSerializationFailure
+general/constants/with_unevaluated_agnostic/const_collections_2: TextSerializationFailure
 general/constants/with_unevaluated_agnostic/various: TextSerializationFailure
 general/constants/with_unevaluated_agnostic/various_2: TextSerializationFailure
 general/constructor_initializer_invalid: RuntimeError
@@ -81,6 +81,7 @@
 general/micro: RuntimeError
 general/mixin_application_override: TypeCheckError
 general/mixin_constructors_with_default_values: RuntimeError
+general/mixin_covariant2: TypeCheckError
 general/operator_method_not_found: RuntimeError
 general/optional: TypeCheckError
 general/override_check_accessor_after_inference: TypeCheckError # Issue #31620
@@ -90,11 +91,9 @@
 general/override_check_basic: TypeCheckError # Issue #31620
 general/override_check_with_covariant_modifier: TypeCheckError # Issue #31620
 general/override_setter_with_field: TypeCheckError
-general/reject_generic_function_types_in_bounds: RuntimeError
 general/spread_collection: RuntimeError # Should be fixed as part of implementing spread collection support
 general/type_parameter_type_named_int: RuntimeError
 general/type_variable_as_super: RuntimeError
-general/type_variable_bound_access: TypeCheckError
 general/unsound_promotion: TypeCheckError
 general/void_methods: RuntimeError
 general/with_dependencies/issue_43084/issue_43084: RuntimeError
@@ -137,12 +136,10 @@
 general_nnbd_opt_out/override_check_basic: TypeCheckError # Issue #31620
 general_nnbd_opt_out/override_check_with_covariant_modifier: TypeCheckError # Issue #31620
 general_nnbd_opt_out/override_setter_with_field: TypeCheckError
-general_nnbd_opt_out/reject_generic_function_types_in_bounds: RuntimeError
 general_nnbd_opt_out/spread_collection: RuntimeError # Should be fixed as part of implementing spread collection support
 general_nnbd_opt_out/statements: Crash
 general_nnbd_opt_out/type_parameter_type_named_int: RuntimeError
 general_nnbd_opt_out/type_variable_as_super: RuntimeError
-general_nnbd_opt_out/type_variable_bound_access: TypeCheckError
 general_nnbd_opt_out/unsound_promotion: TypeCheckError
 general_nnbd_opt_out/void_methods: RuntimeError
 inference/constructors_infer_from_arguments_argument_not_assignable: TypeCheckError
@@ -170,11 +167,7 @@
 inference_new/infer_assign_to_index_upwards: TypeCheckError
 inference_new/infer_assign_to_property_custom: TypeCheckError
 inference_new/invalid_assignment_during_toplevel_inference: TypeCheckError
-instantiate_to_bound/non_simple_class_parametrized_typedef_cycle: RuntimeError
-instantiate_to_bound/non_simple_generic_function_in_bound_regress: RuntimeError
 late_lowering/covariant_late_field: TypeCheckError
-late_lowering/initializer_rewrite_from_opt_out: RuntimeError # Test is inherently mixed mode
-late_lowering/non_nullable_from_opt_out: RuntimeError # Test is inherently mixed mode
 nnbd/covariant_late_field: TypeCheckError
 nnbd/getter_vs_setter_type: TypeCheckError
 nnbd/issue41180: RuntimeError
@@ -184,8 +177,7 @@
 nnbd/nullable_object_access: TypeCheckError
 nnbd/nullable_receiver: TypeCheckError
 nnbd/potentially_nullable_access: TypeCheckError
-nnbd/strong_lib_not_ok_from_dill/strong: RuntimeError
-nnbd/strong_package_not_ok_from_dill/strong: RuntimeError
+none/mixin_covariant: TypeCheckError
 rasta/abstract_constructor: RuntimeError
 rasta/bad_constructor_redirection: RuntimeError
 rasta/bad_continue: RuntimeError
diff --git a/pkg/front_end/testcases/textual_outline.status b/pkg/front_end/testcases/textual_outline.status
index c551669..1d7593c 100644
--- a/pkg/front_end/testcases/textual_outline.status
+++ b/pkg/front_end/testcases/textual_outline.status
@@ -71,6 +71,7 @@
 extensions/issue40713: FormatterCrash
 extensions/issue40816: FormatterCrash
 extensions/issue43218: FormatterCrash
+extensions/language_issue1182: FormatterCrash
 extensions/missing_toplevel: FormatterCrash
 extensions/nested_on_types: FormatterCrash
 extensions/null_aware: FormatterCrash
@@ -82,6 +83,7 @@
 extensions/static_access: FormatterCrash
 extensions/static_access_of_instance: FormatterCrash
 extensions/tear_offs: FormatterCrash
+extensions/type_variable_bound: FormatterCrash
 extensions/type_variables: FormatterCrash
 extensions/unnamed_extensions: FormatterCrash
 extensions/use_this: FormatterCrash
@@ -135,6 +137,7 @@
 inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1: FormatterCrash
 inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1: FormatterCrash
 late_lowering/covariant_late_field: FormatterCrash
+late_lowering/definitely_unassigned: FormatterCrash
 late_lowering/getter_vs_setter_type: FormatterCrash
 late_lowering/infer_late_field_type: FormatterCrash
 late_lowering/initializer_rewrite: FormatterCrash
@@ -169,8 +172,10 @@
 late_lowering_sentinel/late_fields: FormatterCrash
 nnbd/abstract_field_errors: FormatterCrash
 nnbd/covariant_late_field: FormatterCrash
+nnbd/definitely_unassigned: FormatterCrash
 nnbd/extension_bounds: FormatterCrash
 nnbd/extension_never: FormatterCrash
+nnbd/extension_type_variable_bound: FormatterCrash
 nnbd/external_field_errors: FormatterCrash
 nnbd/external_fields: FormatterCrash
 nnbd/forbidden_supers: FormatterCrash
@@ -186,6 +191,9 @@
 nnbd/issue43211: FormatterCrash
 nnbd/issue43278: FormatterCrash
 nnbd/issue43354: FormatterCrash
+nnbd/issue43591: FormatterCrash
+nnbd/issue43689: FormatterCrash
+nnbd/language_issue1182: FormatterCrash
 nnbd/late: FormatterCrash
 nnbd/later: FormatterCrash
 nnbd/no_null_shorting_explicit_extension: FormatterCrash
diff --git a/pkg/front_end/testcases/top_level_variance_test.dart.outline.expect b/pkg/front_end/testcases/top_level_variance_test.dart.outline.expect
deleted file mode 100644
index 41c6dfd..0000000
--- a/pkg/front_end/testcases/top_level_variance_test.dart.outline.expect
+++ /dev/null
@@ -1,53 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-typedef F<invariant X extends core::Object* = dynamic> = <Y extends X* = dynamic>() →* void;
-typedef Fcov<X extends core::Object* = dynamic> = () →* X*;
-typedef Fcon<contravariant X extends core::Object* = dynamic> = (X*) →* dynamic;
-typedef Finv<invariant X extends core::Object* = dynamic> = (X*) →* X*;
-typedef FcovBound<X extends core::num* = core::num*> = () →* X*;
-typedef FconBound<contravariant X extends core::num* = core::num*> = (X*) →* dynamic;
-typedef FinvBound<invariant X extends core::num* = core::num*> = (X*) →* X*;
-typedef FcovCyclicBound<X extends self::A<X*>* = self::A<dynamic>*> = () →* X*;
-typedef FconCyclicBound<contravariant X extends self::A<X*>* = self::A<core::Null?>*> = (X*) →* dynamic;
-typedef FinvCyclicBound<invariant X extends self::A<X*>* = self::A<dynamic>*> = (X*) →* X*;
-typedef FcovCyclicCoBound<X extends (X*) →* dynamic = (core::Null?) →* dynamic> = () →* X*;
-typedef FconCyclicCoBound<contravariant X extends (X*) →* dynamic = (dynamic) →* dynamic> = (X*) →* dynamic;
-typedef FinvCyclicCoBound<invariant X extends (X*) →* dynamic = (dynamic) →* dynamic> = (X*) →* X*;
-class A<X extends core::Object* = dynamic> extends core::Object {
-  synthetic constructor •() → self::A<self::A::X*>*
-    ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
-}
-class B<X extends core::Object* = dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::X*>*
-    ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
-}
-static method toF<X extends core::Object* = dynamic>(self::toF::X* x) → <Y extends self::toF::X* = dynamic>() →* void
-  ;
-static method testTopLevel() → void
-  ;
-static method testNested() → void
-  ;
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/top_level_variance_test.dart.strong.expect b/pkg/front_end/testcases/top_level_variance_test.dart.strong.expect
deleted file mode 100644
index 9e640df..0000000
--- a/pkg/front_end/testcases/top_level_variance_test.dart.strong.expect
+++ /dev/null
@@ -1,125 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-typedef F<invariant X extends core::Object* = dynamic> = <Y extends X* = dynamic>() →* void;
-typedef Fcov<X extends core::Object* = dynamic> = () →* X*;
-typedef Fcon<contravariant X extends core::Object* = dynamic> = (X*) →* dynamic;
-typedef Finv<invariant X extends core::Object* = dynamic> = (X*) →* X*;
-typedef FcovBound<X extends core::num* = core::num*> = () →* X*;
-typedef FconBound<contravariant X extends core::num* = core::num*> = (X*) →* dynamic;
-typedef FinvBound<invariant X extends core::num* = core::num*> = (X*) →* X*;
-typedef FcovCyclicBound<X extends self::A<X*>* = self::A<dynamic>*> = () →* X*;
-typedef FconCyclicBound<contravariant X extends self::A<X*>* = self::A<core::Null?>*> = (X*) →* dynamic;
-typedef FinvCyclicBound<invariant X extends self::A<X*>* = self::A<dynamic>*> = (X*) →* X*;
-typedef FcovCyclicCoBound<X extends (X*) →* dynamic = (core::Null?) →* dynamic> = () →* X*;
-typedef FconCyclicCoBound<contravariant X extends (X*) →* dynamic = (dynamic) →* dynamic> = (X*) →* dynamic;
-typedef FinvCyclicCoBound<invariant X extends (X*) →* dynamic = (dynamic) →* dynamic> = (X*) →* X*;
-class A<X extends core::Object* = dynamic> extends core::Object {
-  synthetic constructor •() → self::A<self::A::X*>*
-    : super core::Object::•()
-    ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
-}
-class B<X extends core::Object* = dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::X*>*
-    : super core::Object::•()
-    ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
-}
-static method toF<X extends core::Object* = dynamic>(self::toF::X* x) → <Y extends self::toF::X* = dynamic>() →* void
-  return null;
-static method testTopLevel() → void {
-  () →* dynamic source1;
-  <Y extends () →* dynamic = dynamic>() →* void fsource1 = self::toF<() →* dynamic>(source1);
-  <Y extends () →* dynamic = dynamic>() →* void target1 = fsource1;
-  (dynamic) →* dynamic source2;
-  <Y extends (dynamic) →* dynamic = dynamic>() →* void fsource2 = self::toF<(dynamic) →* dynamic>(source2);
-  <Y extends (dynamic) →* dynamic = dynamic>() →* void target2 = fsource2;
-  (dynamic) →* dynamic source3;
-  <Y extends (dynamic) →* dynamic = dynamic>() →* void fsource3 = self::toF<(dynamic) →* dynamic>(source3);
-  <Y extends (dynamic) →* dynamic = dynamic>() →* void target3 = fsource3;
-  () →* core::num* source4;
-  <Y extends () →* core::num* = dynamic>() →* void fsource4 = self::toF<() →* core::num*>(source4);
-  <Y extends () →* core::num* = dynamic>() →* void target4 = fsource4;
-  (core::num*) →* dynamic source5;
-  <Y extends (core::num*) →* dynamic = dynamic>() →* void fsource5 = self::toF<(core::num*) →* dynamic>(source5);
-  <Y extends (core::num*) →* dynamic = dynamic>() →* void target5 = fsource5;
-  (core::num*) →* core::num* source6;
-  <Y extends (core::num*) →* core::num* = dynamic>() →* void fsource6 = self::toF<(core::num*) →* core::num*>(source6);
-  <Y extends (core::num*) →* core::num* = dynamic>() →* void target6 = fsource6;
-  () →* self::A<dynamic>* source7;
-  <Y extends () →* self::A<dynamic>* = dynamic>() →* void fsource7 = self::toF<() →* self::A<dynamic>*>(source7);
-  <Y extends () →* self::A<dynamic>* = dynamic>() →* void target7 = fsource7;
-  (self::A<core::Null?>*) →* dynamic source8;
-  <Y extends (self::A<core::Null?>*) →* dynamic = dynamic>() →* void fsource8 = self::toF<(self::A<core::Null?>*) →* dynamic>(source8);
-  <Y extends (self::A<core::Null?>*) →* dynamic = dynamic>() →* void target8 = fsource8;
-  (self::A<dynamic>*) →* self::A<dynamic>* source9;
-  () →* (core::Null?) →* dynamic source10;
-  <Y extends () →* (core::Null?) →* dynamic = dynamic>() →* void fsource10 = self::toF<() →* (core::Null?) →* dynamic>(source10);
-  <Y extends () →* (core::Null?) →* dynamic = dynamic>() →* void target10 = fsource10;
-  ((dynamic) →* dynamic) →* dynamic source11;
-  <Y extends ((dynamic) →* dynamic) →* dynamic = dynamic>() →* void fsource11 = self::toF<((dynamic) →* dynamic) →* dynamic>(source11);
-  <Y extends ((dynamic) →* dynamic) →* dynamic = dynamic>() →* void target11 = fsource11;
-  ((dynamic) →* dynamic) →* (dynamic) →* dynamic source12;
-  <Y extends ((dynamic) →* dynamic) →* (dynamic) →* dynamic = dynamic>() →* void fsource12 = self::toF<((dynamic) →* dynamic) →* (dynamic) →* dynamic>(source12);
-  <Y extends ((dynamic) →* dynamic) →* (dynamic) →* dynamic = dynamic>() →* void target12 = fsource12;
-}
-static method testNested() → void {
-  self::B<() →* dynamic>* source1;
-  <Y extends self::B<() →* dynamic>* = dynamic>() →* void fsource1 = self::toF<self::B<() →* dynamic>*>(source1);
-  <Y extends self::B<() →* dynamic>* = dynamic>() →* void target1 = fsource1;
-  self::B<(dynamic) →* dynamic>* source2;
-  <Y extends self::B<(dynamic) →* dynamic>* = dynamic>() →* void fsource2 = self::toF<self::B<(dynamic) →* dynamic>*>(source2);
-  <Y extends self::B<(dynamic) →* dynamic>* = dynamic>() →* void target2 = fsource2;
-  self::B<(dynamic) →* dynamic>* source3;
-  <Y extends self::B<(dynamic) →* dynamic>* = dynamic>() →* void fsource3 = self::toF<self::B<(dynamic) →* dynamic>*>(source3);
-  <Y extends self::B<(dynamic) →* dynamic>* = dynamic>() →* void target3 = fsource3;
-  self::B<() →* core::num*>* source4;
-  <Y extends self::B<() →* core::num*>* = dynamic>() →* void fsource4 = self::toF<self::B<() →* core::num*>*>(source4);
-  <Y extends self::B<() →* core::num*>* = dynamic>() →* void target4 = fsource4;
-  self::B<(core::num*) →* dynamic>* source5;
-  <Y extends self::B<(core::num*) →* dynamic>* = dynamic>() →* void fsource5 = self::toF<self::B<(core::num*) →* dynamic>*>(source5);
-  <Y extends self::B<(core::num*) →* dynamic>* = dynamic>() →* void target5 = fsource5;
-  self::B<(core::num*) →* core::num*>* source6;
-  <Y extends self::B<(core::num*) →* core::num*>* = dynamic>() →* void fsource6 = self::toF<self::B<(core::num*) →* core::num*>*>(source6);
-  <Y extends self::B<(core::num*) →* core::num*>* = dynamic>() →* void target6 = fsource6;
-  self::B<() →* self::A<dynamic>*>* source7;
-  <Y extends self::B<() →* self::A<dynamic>*>* = dynamic>() →* void fsource7 = self::toF<self::B<() →* self::A<dynamic>*>*>(source7);
-  <Y extends self::B<() →* self::A<dynamic>*>* = dynamic>() →* void target7 = fsource7;
-  self::B<(self::A<core::Null?>*) →* dynamic>* source8;
-  <Y extends self::B<(self::A<core::Null?>*) →* dynamic>* = dynamic>() →* void fsource8 = self::toF<self::B<(self::A<core::Null?>*) →* dynamic>*>(source8);
-  <Y extends self::B<(self::A<core::Null?>*) →* dynamic>* = dynamic>() →* void target8 = fsource8;
-  self::B<(self::A<dynamic>*) →* self::A<dynamic>*>* source9;
-  self::B<() →* (core::Null?) →* dynamic>* source10;
-  <Y extends self::B<() →* (core::Null?) →* dynamic>* = dynamic>() →* void fsource10 = self::toF<self::B<() →* (core::Null?) →* dynamic>*>(source10);
-  <Y extends self::B<() →* (core::Null?) →* dynamic>* = dynamic>() →* void target10 = fsource10;
-  self::B<((dynamic) →* dynamic) →* dynamic>* source11;
-  <Y extends self::B<((dynamic) →* dynamic) →* dynamic>* = dynamic>() →* void fsource11 = self::toF<self::B<((dynamic) →* dynamic) →* dynamic>*>(source11);
-  <Y extends self::B<((dynamic) →* dynamic) →* dynamic>* = dynamic>() →* void target11 = fsource11;
-  self::B<((dynamic) →* dynamic) →* (dynamic) →* dynamic>* source12;
-  <Y extends self::B<((dynamic) →* dynamic) →* (dynamic) →* dynamic>* = dynamic>() →* void fsource12 = self::toF<self::B<((dynamic) →* dynamic) →* (dynamic) →* dynamic>*>(source12);
-  <Y extends self::B<((dynamic) →* dynamic) →* (dynamic) →* dynamic>* = dynamic>() →* void target12 = fsource12;
-}
-static method main() → dynamic {
-  self::testTopLevel();
-  self::testNested();
-}
diff --git a/pkg/front_end/testcases/top_level_variance_test.dart.strong.transformed.expect b/pkg/front_end/testcases/top_level_variance_test.dart.strong.transformed.expect
deleted file mode 100644
index 9e640df..0000000
--- a/pkg/front_end/testcases/top_level_variance_test.dart.strong.transformed.expect
+++ /dev/null
@@ -1,125 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-typedef F<invariant X extends core::Object* = dynamic> = <Y extends X* = dynamic>() →* void;
-typedef Fcov<X extends core::Object* = dynamic> = () →* X*;
-typedef Fcon<contravariant X extends core::Object* = dynamic> = (X*) →* dynamic;
-typedef Finv<invariant X extends core::Object* = dynamic> = (X*) →* X*;
-typedef FcovBound<X extends core::num* = core::num*> = () →* X*;
-typedef FconBound<contravariant X extends core::num* = core::num*> = (X*) →* dynamic;
-typedef FinvBound<invariant X extends core::num* = core::num*> = (X*) →* X*;
-typedef FcovCyclicBound<X extends self::A<X*>* = self::A<dynamic>*> = () →* X*;
-typedef FconCyclicBound<contravariant X extends self::A<X*>* = self::A<core::Null?>*> = (X*) →* dynamic;
-typedef FinvCyclicBound<invariant X extends self::A<X*>* = self::A<dynamic>*> = (X*) →* X*;
-typedef FcovCyclicCoBound<X extends (X*) →* dynamic = (core::Null?) →* dynamic> = () →* X*;
-typedef FconCyclicCoBound<contravariant X extends (X*) →* dynamic = (dynamic) →* dynamic> = (X*) →* dynamic;
-typedef FinvCyclicCoBound<invariant X extends (X*) →* dynamic = (dynamic) →* dynamic> = (X*) →* X*;
-class A<X extends core::Object* = dynamic> extends core::Object {
-  synthetic constructor •() → self::A<self::A::X*>*
-    : super core::Object::•()
-    ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
-}
-class B<X extends core::Object* = dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::X*>*
-    : super core::Object::•()
-    ;
-  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
-  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
-  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
-  abstract member-signature method toString() → core::String*; -> core::Object::toString
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
-  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
-}
-static method toF<X extends core::Object* = dynamic>(self::toF::X* x) → <Y extends self::toF::X* = dynamic>() →* void
-  return null;
-static method testTopLevel() → void {
-  () →* dynamic source1;
-  <Y extends () →* dynamic = dynamic>() →* void fsource1 = self::toF<() →* dynamic>(source1);
-  <Y extends () →* dynamic = dynamic>() →* void target1 = fsource1;
-  (dynamic) →* dynamic source2;
-  <Y extends (dynamic) →* dynamic = dynamic>() →* void fsource2 = self::toF<(dynamic) →* dynamic>(source2);
-  <Y extends (dynamic) →* dynamic = dynamic>() →* void target2 = fsource2;
-  (dynamic) →* dynamic source3;
-  <Y extends (dynamic) →* dynamic = dynamic>() →* void fsource3 = self::toF<(dynamic) →* dynamic>(source3);
-  <Y extends (dynamic) →* dynamic = dynamic>() →* void target3 = fsource3;
-  () →* core::num* source4;
-  <Y extends () →* core::num* = dynamic>() →* void fsource4 = self::toF<() →* core::num*>(source4);
-  <Y extends () →* core::num* = dynamic>() →* void target4 = fsource4;
-  (core::num*) →* dynamic source5;
-  <Y extends (core::num*) →* dynamic = dynamic>() →* void fsource5 = self::toF<(core::num*) →* dynamic>(source5);
-  <Y extends (core::num*) →* dynamic = dynamic>() →* void target5 = fsource5;
-  (core::num*) →* core::num* source6;
-  <Y extends (core::num*) →* core::num* = dynamic>() →* void fsource6 = self::toF<(core::num*) →* core::num*>(source6);
-  <Y extends (core::num*) →* core::num* = dynamic>() →* void target6 = fsource6;
-  () →* self::A<dynamic>* source7;
-  <Y extends () →* self::A<dynamic>* = dynamic>() →* void fsource7 = self::toF<() →* self::A<dynamic>*>(source7);
-  <Y extends () →* self::A<dynamic>* = dynamic>() →* void target7 = fsource7;
-  (self::A<core::Null?>*) →* dynamic source8;
-  <Y extends (self::A<core::Null?>*) →* dynamic = dynamic>() →* void fsource8 = self::toF<(self::A<core::Null?>*) →* dynamic>(source8);
-  <Y extends (self::A<core::Null?>*) →* dynamic = dynamic>() →* void target8 = fsource8;
-  (self::A<dynamic>*) →* self::A<dynamic>* source9;
-  () →* (core::Null?) →* dynamic source10;
-  <Y extends () →* (core::Null?) →* dynamic = dynamic>() →* void fsource10 = self::toF<() →* (core::Null?) →* dynamic>(source10);
-  <Y extends () →* (core::Null?) →* dynamic = dynamic>() →* void target10 = fsource10;
-  ((dynamic) →* dynamic) →* dynamic source11;
-  <Y extends ((dynamic) →* dynamic) →* dynamic = dynamic>() →* void fsource11 = self::toF<((dynamic) →* dynamic) →* dynamic>(source11);
-  <Y extends ((dynamic) →* dynamic) →* dynamic = dynamic>() →* void target11 = fsource11;
-  ((dynamic) →* dynamic) →* (dynamic) →* dynamic source12;
-  <Y extends ((dynamic) →* dynamic) →* (dynamic) →* dynamic = dynamic>() →* void fsource12 = self::toF<((dynamic) →* dynamic) →* (dynamic) →* dynamic>(source12);
-  <Y extends ((dynamic) →* dynamic) →* (dynamic) →* dynamic = dynamic>() →* void target12 = fsource12;
-}
-static method testNested() → void {
-  self::B<() →* dynamic>* source1;
-  <Y extends self::B<() →* dynamic>* = dynamic>() →* void fsource1 = self::toF<self::B<() →* dynamic>*>(source1);
-  <Y extends self::B<() →* dynamic>* = dynamic>() →* void target1 = fsource1;
-  self::B<(dynamic) →* dynamic>* source2;
-  <Y extends self::B<(dynamic) →* dynamic>* = dynamic>() →* void fsource2 = self::toF<self::B<(dynamic) →* dynamic>*>(source2);
-  <Y extends self::B<(dynamic) →* dynamic>* = dynamic>() →* void target2 = fsource2;
-  self::B<(dynamic) →* dynamic>* source3;
-  <Y extends self::B<(dynamic) →* dynamic>* = dynamic>() →* void fsource3 = self::toF<self::B<(dynamic) →* dynamic>*>(source3);
-  <Y extends self::B<(dynamic) →* dynamic>* = dynamic>() →* void target3 = fsource3;
-  self::B<() →* core::num*>* source4;
-  <Y extends self::B<() →* core::num*>* = dynamic>() →* void fsource4 = self::toF<self::B<() →* core::num*>*>(source4);
-  <Y extends self::B<() →* core::num*>* = dynamic>() →* void target4 = fsource4;
-  self::B<(core::num*) →* dynamic>* source5;
-  <Y extends self::B<(core::num*) →* dynamic>* = dynamic>() →* void fsource5 = self::toF<self::B<(core::num*) →* dynamic>*>(source5);
-  <Y extends self::B<(core::num*) →* dynamic>* = dynamic>() →* void target5 = fsource5;
-  self::B<(core::num*) →* core::num*>* source6;
-  <Y extends self::B<(core::num*) →* core::num*>* = dynamic>() →* void fsource6 = self::toF<self::B<(core::num*) →* core::num*>*>(source6);
-  <Y extends self::B<(core::num*) →* core::num*>* = dynamic>() →* void target6 = fsource6;
-  self::B<() →* self::A<dynamic>*>* source7;
-  <Y extends self::B<() →* self::A<dynamic>*>* = dynamic>() →* void fsource7 = self::toF<self::B<() →* self::A<dynamic>*>*>(source7);
-  <Y extends self::B<() →* self::A<dynamic>*>* = dynamic>() →* void target7 = fsource7;
-  self::B<(self::A<core::Null?>*) →* dynamic>* source8;
-  <Y extends self::B<(self::A<core::Null?>*) →* dynamic>* = dynamic>() →* void fsource8 = self::toF<self::B<(self::A<core::Null?>*) →* dynamic>*>(source8);
-  <Y extends self::B<(self::A<core::Null?>*) →* dynamic>* = dynamic>() →* void target8 = fsource8;
-  self::B<(self::A<dynamic>*) →* self::A<dynamic>*>* source9;
-  self::B<() →* (core::Null?) →* dynamic>* source10;
-  <Y extends self::B<() →* (core::Null?) →* dynamic>* = dynamic>() →* void fsource10 = self::toF<self::B<() →* (core::Null?) →* dynamic>*>(source10);
-  <Y extends self::B<() →* (core::Null?) →* dynamic>* = dynamic>() →* void target10 = fsource10;
-  self::B<((dynamic) →* dynamic) →* dynamic>* source11;
-  <Y extends self::B<((dynamic) →* dynamic) →* dynamic>* = dynamic>() →* void fsource11 = self::toF<self::B<((dynamic) →* dynamic) →* dynamic>*>(source11);
-  <Y extends self::B<((dynamic) →* dynamic) →* dynamic>* = dynamic>() →* void target11 = fsource11;
-  self::B<((dynamic) →* dynamic) →* (dynamic) →* dynamic>* source12;
-  <Y extends self::B<((dynamic) →* dynamic) →* (dynamic) →* dynamic>* = dynamic>() →* void fsource12 = self::toF<self::B<((dynamic) →* dynamic) →* (dynamic) →* dynamic>*>(source12);
-  <Y extends self::B<((dynamic) →* dynamic) →* (dynamic) →* dynamic>* = dynamic>() →* void target12 = fsource12;
-}
-static method main() → dynamic {
-  self::testTopLevel();
-  self::testNested();
-}
diff --git a/pkg/front_end/testcases/triple_shift/folder.options b/pkg/front_end/testcases/triple_shift/folder.options
index 55774c6..199ca30 100644
--- a/pkg/front_end/testcases/triple_shift/folder.options
+++ b/pkg/front_end/testcases/triple_shift/folder.options
@@ -1 +1 @@
---enable-experiment=triple-shift
+--enable-experiment=triple-shift,no-non-nullable
\ No newline at end of file
diff --git a/pkg/front_end/testcases/unified_collections/folder.options b/pkg/front_end/testcases/unified_collections/folder.options
new file mode 100644
index 0000000..dbc148e
--- /dev/null
+++ b/pkg/front_end/testcases/unified_collections/folder.options
@@ -0,0 +1 @@
+--enable-experiment=no-non-nullable
\ No newline at end of file
diff --git a/pkg/front_end/testcases/unified_collections/invariance.dart b/pkg/front_end/testcases/unified_collections/invariance.dart
new file mode 100644
index 0000000..a22d3d3
--- /dev/null
+++ b/pkg/front_end/testcases/unified_collections/invariance.dart
@@ -0,0 +1,28 @@
+// Copyright (c) 2020, 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.
+
+// @dart=2.9
+
+main() {
+  var list1 = <int>[0];
+  var list2 = <num>[0];
+  dynamic list3 = <int>[0];
+  var list = <int>[0, ...list1, ...list2, ...list3, if (true) 2];
+
+  var set1 = <int>{0};
+  var set2 = <num>{0};
+  dynamic set3 = <int>{0};
+  var set = <int>{0, ...set1, ...set2, ...set3, if (true) 2};
+
+  var map1 = <int, String>{0: 'foo'};
+  var map2 = <num, Object>{0: 'bar'};
+  dynamic map3 = <int, String>{0: 'baz'};
+  var map = <int, String>{
+    0: 'foo',
+    ...map1,
+    ...map2,
+    ...map3,
+    if (true) 2: 'baz'
+  };
+}
diff --git a/pkg/front_end/testcases/unified_collections/invariance.dart.outline.expect b/pkg/front_end/testcases/unified_collections/invariance.dart.outline.expect
new file mode 100644
index 0000000..6a28c0d
--- /dev/null
+++ b/pkg/front_end/testcases/unified_collections/invariance.dart.outline.expect
@@ -0,0 +1,5 @@
+library;
+import self as self;
+
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/unified_collections/invariance.dart.strong.expect b/pkg/front_end/testcases/unified_collections/invariance.dart.strong.expect
new file mode 100644
index 0000000..ebbf96d
--- /dev/null
+++ b/pkg/front_end/testcases/unified_collections/invariance.dart.strong.expect
@@ -0,0 +1,75 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "dart:collection" as col;
+
+static method main() → dynamic {
+  core::List<core::int*>* list1 = <core::int*>[0];
+  core::List<core::num*>* list2 = <core::num*>[0];
+  dynamic list3 = <core::int*>[0];
+  core::List<core::int*>* list = block {
+    final core::List<core::int*>* #t1 = <core::int*>[];
+    #t1.{core::List::add}{Invariant}(0);
+    for (final core::int* #t2 in list1)
+      #t1.{core::List::add}{Invariant}(#t2);
+    for (final dynamic #t3 in list2) {
+      final core::int* #t4 = #t3 as{TypeError} core::int*;
+      #t1.{core::List::add}{Invariant}(#t4);
+    }
+    for (final dynamic #t5 in list3 as{TypeError,ForDynamic} core::Iterable<dynamic>*) {
+      final core::int* #t6 = #t5 as{TypeError} core::int*;
+      #t1.{core::List::add}{Invariant}(#t6);
+    }
+    if(true)
+      #t1.{core::List::add}{Invariant}(2);
+  } =>#t1;
+  core::Set<core::int*>* set1 = block {
+    final core::Set<core::int*>* #t7 = col::LinkedHashSet::•<core::int*>();
+    #t7.{core::Set::add}{Invariant}(0);
+  } =>#t7;
+  core::Set<core::num*>* set2 = block {
+    final core::Set<core::num*>* #t8 = col::LinkedHashSet::•<core::num*>();
+    #t8.{core::Set::add}{Invariant}(0);
+  } =>#t8;
+  dynamic set3 = block {
+    final core::Set<core::int*>* #t9 = col::LinkedHashSet::•<core::int*>();
+    #t9.{core::Set::add}{Invariant}(0);
+  } =>#t9;
+  core::Set<core::int*>* set = block {
+    final core::Set<core::int*>* #t10 = col::LinkedHashSet::•<core::int*>();
+    #t10.{core::Set::add}{Invariant}(0);
+    for (final core::int* #t11 in set1)
+      #t10.{core::Set::add}{Invariant}(#t11);
+    for (final dynamic #t12 in set2) {
+      final core::int* #t13 = #t12 as{TypeError} core::int*;
+      #t10.{core::Set::add}{Invariant}(#t13);
+    }
+    for (final dynamic #t14 in set3 as{TypeError,ForDynamic} core::Iterable<dynamic>*) {
+      final core::int* #t15 = #t14 as{TypeError} core::int*;
+      #t10.{core::Set::add}{Invariant}(#t15);
+    }
+    if(true)
+      #t10.{core::Set::add}{Invariant}(2);
+  } =>#t10;
+  core::Map<core::int*, core::String*>* map1 = <core::int*, core::String*>{0: "foo"};
+  core::Map<core::num*, core::Object*>* map2 = <core::num*, core::Object*>{0: "bar"};
+  dynamic map3 = <core::int*, core::String*>{0: "baz"};
+  core::Map<core::int*, core::String*>* map = block {
+    final core::Map<core::int*, core::String*>* #t16 = <core::int*, core::String*>{};
+    #t16.{core::Map::[]=}{Invariant}(0, "foo");
+    for (final core::MapEntry<core::int*, core::String*>* #t17 in map1.{core::Map::entries})
+      #t16.{core::Map::[]=}{Invariant}(#t17.{core::MapEntry::key}, #t17.{core::MapEntry::value});
+    for (final core::MapEntry<dynamic, dynamic>* #t18 in map2.{core::Map::entries}) {
+      final core::int* #t19 = #t18.{core::MapEntry::key} as{TypeError} core::int*;
+      final core::String* #t20 = #t18.{core::MapEntry::value} as{TypeError} core::String*;
+      #t16.{core::Map::[]=}{Invariant}(#t19, #t20);
+    }
+    for (final core::MapEntry<dynamic, dynamic>* #t21 in (map3 as{TypeError,ForDynamic} core::Map<dynamic, dynamic>*).{core::Map::entries}) {
+      final core::int* #t22 = #t21.{core::MapEntry::key} as{TypeError} core::int*;
+      final core::String* #t23 = #t21.{core::MapEntry::value} as{TypeError} core::String*;
+      #t16.{core::Map::[]=}{Invariant}(#t22, #t23);
+    }
+    if(true)
+      #t16.{core::Map::[]=}{Invariant}(2, "baz");
+  } =>#t16;
+}
diff --git a/pkg/front_end/testcases/unified_collections/invariance.dart.strong.transformed.expect b/pkg/front_end/testcases/unified_collections/invariance.dart.strong.transformed.expect
new file mode 100644
index 0000000..a1ce6d8
--- /dev/null
+++ b/pkg/front_end/testcases/unified_collections/invariance.dart.strong.transformed.expect
@@ -0,0 +1,126 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "dart:collection" as col;
+
+static method main() → dynamic {
+  core::List<core::int*>* list1 = <core::int*>[0];
+  core::List<core::num*>* list2 = <core::num*>[0];
+  dynamic list3 = <core::int*>[0];
+  core::List<core::int*>* list = block {
+    final core::List<core::int*>* #t1 = <core::int*>[];
+    #t1.{core::List::add}{Invariant}(0);
+    {
+      core::Iterator<core::int*>* :sync-for-iterator = list1.{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::int* #t2 = :sync-for-iterator.{core::Iterator::current};
+        #t1.{core::List::add}{Invariant}(#t2);
+      }
+    }
+    {
+      core::Iterator<core::num*>* :sync-for-iterator = list2.{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final dynamic #t3 = :sync-for-iterator.{core::Iterator::current};
+        {
+          final core::int* #t4 = #t3 as{TypeError} core::int*;
+          #t1.{core::List::add}{Invariant}(#t4);
+        }
+      }
+    }
+    {
+      core::Iterator<dynamic>* :sync-for-iterator = (list3 as{TypeError,ForDynamic} core::Iterable<dynamic>*).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final dynamic #t5 = :sync-for-iterator.{core::Iterator::current};
+        {
+          final core::int* #t6 = #t5 as{TypeError} core::int*;
+          #t1.{core::List::add}{Invariant}(#t6);
+        }
+      }
+    }
+    if(true)
+      #t1.{core::List::add}{Invariant}(2);
+  } =>#t1;
+  core::Set<core::int*>* set1 = block {
+    final core::Set<core::int*>* #t7 = new col::_CompactLinkedHashSet::•<core::int*>();
+    #t7.{core::Set::add}{Invariant}(0);
+  } =>#t7;
+  core::Set<core::num*>* set2 = block {
+    final core::Set<core::num*>* #t8 = new col::_CompactLinkedHashSet::•<core::num*>();
+    #t8.{core::Set::add}{Invariant}(0);
+  } =>#t8;
+  dynamic set3 = block {
+    final core::Set<core::int*>* #t9 = new col::_CompactLinkedHashSet::•<core::int*>();
+    #t9.{core::Set::add}{Invariant}(0);
+  } =>#t9;
+  core::Set<core::int*>* set = block {
+    final core::Set<core::int*>* #t10 = new col::_CompactLinkedHashSet::•<core::int*>();
+    #t10.{core::Set::add}{Invariant}(0);
+    {
+      core::Iterator<core::int*>* :sync-for-iterator = set1.{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::int* #t11 = :sync-for-iterator.{core::Iterator::current};
+        #t10.{core::Set::add}{Invariant}(#t11);
+      }
+    }
+    {
+      core::Iterator<core::num*>* :sync-for-iterator = set2.{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final dynamic #t12 = :sync-for-iterator.{core::Iterator::current};
+        {
+          final core::int* #t13 = #t12 as{TypeError} core::int*;
+          #t10.{core::Set::add}{Invariant}(#t13);
+        }
+      }
+    }
+    {
+      core::Iterator<dynamic>* :sync-for-iterator = (set3 as{TypeError,ForDynamic} core::Iterable<dynamic>*).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final dynamic #t14 = :sync-for-iterator.{core::Iterator::current};
+        {
+          final core::int* #t15 = #t14 as{TypeError} core::int*;
+          #t10.{core::Set::add}{Invariant}(#t15);
+        }
+      }
+    }
+    if(true)
+      #t10.{core::Set::add}{Invariant}(2);
+  } =>#t10;
+  core::Map<core::int*, core::String*>* map1 = <core::int*, core::String*>{0: "foo"};
+  core::Map<core::num*, core::Object*>* map2 = <core::num*, core::Object*>{0: "bar"};
+  dynamic map3 = <core::int*, core::String*>{0: "baz"};
+  core::Map<core::int*, core::String*>* map = block {
+    final core::Map<core::int*, core::String*>* #t16 = <core::int*, core::String*>{};
+    #t16.{core::Map::[]=}{Invariant}(0, "foo");
+    {
+      core::Iterator<core::MapEntry<core::int*, core::String*>>* :sync-for-iterator = map1.{core::Map::entries}.{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::MapEntry<core::int*, core::String*>* #t17 = :sync-for-iterator.{core::Iterator::current};
+        #t16.{core::Map::[]=}{Invariant}(#t17.{core::MapEntry::key}, #t17.{core::MapEntry::value});
+      }
+    }
+    {
+      core::Iterator<core::MapEntry<core::num*, core::Object*>>* :sync-for-iterator = map2.{core::Map::entries}.{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::MapEntry<dynamic, dynamic>* #t18 = :sync-for-iterator.{core::Iterator::current};
+        {
+          final core::int* #t19 = #t18.{core::MapEntry::key} as{TypeError} core::int*;
+          final core::String* #t20 = #t18.{core::MapEntry::value} as{TypeError} core::String*;
+          #t16.{core::Map::[]=}{Invariant}(#t19, #t20);
+        }
+      }
+    }
+    {
+      core::Iterator<core::MapEntry<dynamic, dynamic>>* :sync-for-iterator = (map3 as{TypeError,ForDynamic} core::Map<dynamic, dynamic>*).{core::Map::entries}.{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        final core::MapEntry<dynamic, dynamic>* #t21 = :sync-for-iterator.{core::Iterator::current};
+        {
+          final core::int* #t22 = #t21.{core::MapEntry::key} as{TypeError} core::int*;
+          final core::String* #t23 = #t21.{core::MapEntry::value} as{TypeError} core::String*;
+          #t16.{core::Map::[]=}{Invariant}(#t22, #t23);
+        }
+      }
+    }
+    if(true)
+      #t16.{core::Map::[]=}{Invariant}(2, "baz");
+  } =>#t16;
+}
diff --git a/pkg/front_end/testcases/unified_collections/invariance.dart.textual_outline.expect b/pkg/front_end/testcases/unified_collections/invariance.dart.textual_outline.expect
new file mode 100644
index 0000000..7c126a2
--- /dev/null
+++ b/pkg/front_end/testcases/unified_collections/invariance.dart.textual_outline.expect
@@ -0,0 +1,2 @@
+// @dart = 2.9
+main() {}
diff --git a/pkg/front_end/testcases/unified_collections/invariance.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/unified_collections/invariance.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..7c126a2
--- /dev/null
+++ b/pkg/front_end/testcases/unified_collections/invariance.dart.textual_outline_modelled.expect
@@ -0,0 +1,2 @@
+// @dart = 2.9
+main() {}
diff --git a/pkg/front_end/testcases/unified_collections/mixed_entries.dart.outline.expect b/pkg/front_end/testcases/unified_collections/mixed_entries.dart.outline.expect
index 3d8af13..a46c9ef 100644
--- a/pkg/front_end/testcases/unified_collections/mixed_entries.dart.outline.expect
+++ b/pkg/front_end/testcases/unified_collections/mixed_entries.dart.outline.expect
@@ -36,12 +36,12 @@
 static field core::Map<dynamic, core::int*>* map10;
 static field core::Map<dynamic, core::int*>* map11;
 static field core::Map<core::int*, core::int*>* map12;
-static field core::Map<dynamic, core::Null?>* error4;
-static field core::Map<dynamic, core::Null?>* error5;
+static field core::Map<dynamic, Null>* error4;
+static field core::Map<dynamic, Null>* error5;
 static field dynamic error6;
 static field dynamic error7;
-static field core::Map<dynamic, core::Null?>* error8;
-static field core::Map<dynamic, core::Null?>* error9;
+static field core::Map<dynamic, Null>* error8;
+static field core::Map<dynamic, Null>* error9;
 static field dynamic error10;
 static field dynamic error11;
 static field dynamic error12;
diff --git a/pkg/front_end/testcases/unified_collections/mixed_entries.dart.strong.expect b/pkg/front_end/testcases/unified_collections/mixed_entries.dart.strong.expect
index 6852242..1194246 100644
--- a/pkg/front_end/testcases/unified_collections/mixed_entries.dart.strong.expect
+++ b/pkg/front_end/testcases/unified_collections/mixed_entries.dart.strong.expect
@@ -47,109 +47,109 @@
 static field core::Map<dynamic, dynamic>* map1 = block {
   final core::Map<dynamic, dynamic>* #t1 = <dynamic, dynamic>{};
   if(self::b)
-    #t1.{core::Map::[]=}(0, 1);
+    #t1.{core::Map::[]=}{Invariant}(0, 1);
   else
     for (final core::MapEntry<dynamic, dynamic>* #t2 in self::map0.{core::Map::entries})
-      #t1.{core::Map::[]=}(#t2.{core::MapEntry::key}, #t2.{core::MapEntry::value});
+      #t1.{core::Map::[]=}{Invariant}(#t2.{core::MapEntry::key}, #t2.{core::MapEntry::value});
 } =>#t1;
 static field core::Map<dynamic, dynamic>* map2 = block {
   final core::Map<dynamic, dynamic>* #t3 = <dynamic, dynamic>{};
   if(self::b)
     for (final core::MapEntry<dynamic, dynamic>* #t4 in self::map0.{core::Map::entries})
-      #t3.{core::Map::[]=}(#t4.{core::MapEntry::key}, #t4.{core::MapEntry::value});
+      #t3.{core::Map::[]=}{Invariant}(#t4.{core::MapEntry::key}, #t4.{core::MapEntry::value});
   else
-    #t3.{core::Map::[]=}(0, 1);
+    #t3.{core::Map::[]=}{Invariant}(0, 1);
 } =>#t3;
 static field core::Map<dynamic, dynamic>* map3 = block {
   final core::Map<dynamic, dynamic>* #t5 = <dynamic, dynamic>{};
   if(self::b)
     for (final core::MapEntry<dynamic, dynamic>* #t6 in self::map0.{core::Map::entries})
-      #t5.{core::Map::[]=}(#t6.{core::MapEntry::key}, #t6.{core::MapEntry::value});
+      #t5.{core::Map::[]=}{Invariant}(#t6.{core::MapEntry::key}, #t6.{core::MapEntry::value});
   else
     for (final core::MapEntry<dynamic, dynamic>* #t7 in self::map0.{core::Map::entries})
-      #t5.{core::Map::[]=}(#t7.{core::MapEntry::key}, #t7.{core::MapEntry::value});
+      #t5.{core::Map::[]=}{Invariant}(#t7.{core::MapEntry::key}, #t7.{core::MapEntry::value});
 } =>#t5;
 static field core::Map<dynamic, core::int*>* map4 = block {
   final core::Map<dynamic, core::int*>* #t8 = <dynamic, core::int*>{};
   if(self::b)
-    #t8.{core::Map::[]=}(0, 1);
+    #t8.{core::Map::[]=}{Invariant}(0, 1);
   else
     for (dynamic a in self::list)
-      #t8.{core::Map::[]=}(a, 1);
+      #t8.{core::Map::[]=}{Invariant}(a, 1);
 } =>#t8;
 static field core::Map<dynamic, core::int*>* map5 = block {
   final core::Map<dynamic, core::int*>* #t9 = <dynamic, core::int*>{};
   if(self::b)
     for (dynamic a in self::list)
-      #t9.{core::Map::[]=}(a, 1);
+      #t9.{core::Map::[]=}{Invariant}(a, 1);
   else
-    #t9.{core::Map::[]=}(0, 1);
+    #t9.{core::Map::[]=}{Invariant}(0, 1);
 } =>#t9;
 static field core::Map<dynamic, core::int*>* map6 = block {
   final core::Map<dynamic, core::int*>* #t10 = <dynamic, core::int*>{};
   if(self::b)
-    #t10.{core::Map::[]=}(0, 1);
+    #t10.{core::Map::[]=}{Invariant}(0, 1);
   else
     for (dynamic a in self::list)
       for (final core::MapEntry<dynamic, core::int*>* #t11 in <dynamic, core::int*>{a: 1}.{core::Map::entries})
-        #t10.{core::Map::[]=}(#t11.{core::MapEntry::key}, #t11.{core::MapEntry::value});
+        #t10.{core::Map::[]=}{Invariant}(#t11.{core::MapEntry::key}, #t11.{core::MapEntry::value});
 } =>#t10;
 static field core::Map<dynamic, core::int*>* map7 = block {
   final core::Map<dynamic, core::int*>* #t12 = <dynamic, core::int*>{};
   if(self::b)
     for (dynamic a in self::list)
       for (final core::MapEntry<dynamic, core::int*>* #t13 in <dynamic, core::int*>{a: 1}.{core::Map::entries})
-        #t12.{core::Map::[]=}(#t13.{core::MapEntry::key}, #t13.{core::MapEntry::value});
+        #t12.{core::Map::[]=}{Invariant}(#t13.{core::MapEntry::key}, #t13.{core::MapEntry::value});
   else
-    #t12.{core::Map::[]=}(0, 1);
+    #t12.{core::Map::[]=}{Invariant}(0, 1);
 } =>#t12;
 static field core::Map<dynamic, core::int*>* map8 = block {
   final core::Map<dynamic, core::int*>* #t14 = <dynamic, core::int*>{};
   if(self::b)
-    #t14.{core::Map::[]=}(0, 1);
+    #t14.{core::Map::[]=}{Invariant}(0, 1);
   else
     for (core::int* i = 0; i.{core::num::<}(self::list.{core::List::length}); i = i.{core::num::+}(1))
-      #t14.{core::Map::[]=}(self::list.{core::List::[]}(i), 1);
+      #t14.{core::Map::[]=}{Invariant}(self::list.{core::List::[]}(i), 1);
 } =>#t14;
 static field core::Map<dynamic, core::int*>* map9 = block {
   final core::Map<dynamic, core::int*>* #t15 = <dynamic, core::int*>{};
   if(self::b)
     for (core::int* i = 0; i.{core::num::<}(self::list.{core::List::length}); i = i.{core::num::+}(1))
-      #t15.{core::Map::[]=}(self::list.{core::List::[]}(i), 1);
+      #t15.{core::Map::[]=}{Invariant}(self::list.{core::List::[]}(i), 1);
   else
-    #t15.{core::Map::[]=}(0, 1);
+    #t15.{core::Map::[]=}{Invariant}(0, 1);
 } =>#t15;
 static field core::Map<dynamic, core::int*>* map10 = block {
   final core::Map<dynamic, core::int*>* #t16 = <dynamic, core::int*>{};
   if(self::b)
-    #t16.{core::Map::[]=}(0, 1);
+    #t16.{core::Map::[]=}{Invariant}(0, 1);
   else
     for (core::int* i = 0; i.{core::num::<}(self::list.{core::List::length}); i = i.{core::num::+}(1))
       for (final core::MapEntry<dynamic, core::int*>* #t17 in <dynamic, core::int*>{self::list.{core::List::[]}(i): 1}.{core::Map::entries})
-        #t16.{core::Map::[]=}(#t17.{core::MapEntry::key}, #t17.{core::MapEntry::value});
+        #t16.{core::Map::[]=}{Invariant}(#t17.{core::MapEntry::key}, #t17.{core::MapEntry::value});
 } =>#t16;
 static field core::Map<dynamic, core::int*>* map11 = block {
   final core::Map<dynamic, core::int*>* #t18 = <dynamic, core::int*>{};
   if(self::b)
     for (core::int* i = 0; i.{core::num::<}(self::list.{core::List::length}); i = i.{core::num::+}(1))
       for (final core::MapEntry<dynamic, core::int*>* #t19 in <dynamic, core::int*>{self::list.{core::List::[]}(i): 1}.{core::Map::entries})
-        #t18.{core::Map::[]=}(#t19.{core::MapEntry::key}, #t19.{core::MapEntry::value});
+        #t18.{core::Map::[]=}{Invariant}(#t19.{core::MapEntry::key}, #t19.{core::MapEntry::value});
   else
-    #t18.{core::Map::[]=}(0, 1);
+    #t18.{core::Map::[]=}{Invariant}(0, 1);
 } =>#t18;
 static field core::Map<core::int*, core::int*>* map12 = block {
   final core::Map<core::int*, core::int*>* #t20 = <core::int*, core::int*>{};
   if(self::b)
-    #t20.{core::Map::[]=}(0, 1);
+    #t20.{core::Map::[]=}{Invariant}(0, 1);
   else
     if(self::b)
       for (final core::MapEntry<core::int*, core::int*>* #t21 in <core::int*, core::int*>{0: 1}.{core::Map::entries})
-        #t20.{core::Map::[]=}(#t21.{core::MapEntry::key}, #t21.{core::MapEntry::value});
+        #t20.{core::Map::[]=}{Invariant}(#t21.{core::MapEntry::key}, #t21.{core::MapEntry::value});
 } =>#t20;
-static field core::Map<dynamic, core::Null?>* error4 = <dynamic, core::Null?>{invalid-expression "pkg/front_end/testcases/unified_collections/mixed_entries.dart:33:32: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+static field core::Map<dynamic, Null>* error4 = <dynamic, Null>{invalid-expression "pkg/front_end/testcases/unified_collections/mixed_entries.dart:33:32: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
 var error4 = {if (b) 0: 1 else for (var a in list) a};
                                ^": null};
-static field core::Map<dynamic, core::Null?>* error5 = <dynamic, core::Null?>{invalid-expression "pkg/front_end/testcases/unified_collections/mixed_entries.dart:34:22: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+static field core::Map<dynamic, Null>* error5 = <dynamic, Null>{invalid-expression "pkg/front_end/testcases/unified_collections/mixed_entries.dart:34:22: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
 var error5 = {if (b) for (var a in list) a else 0: 1};
                      ^": null};
 static field dynamic error6 = invalid-expression "pkg/front_end/testcases/unified_collections/mixed_entries.dart:35:14: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
@@ -158,10 +158,10 @@
 static field dynamic error7 = invalid-expression "pkg/front_end/testcases/unified_collections/mixed_entries.dart:38:14: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
 var error7 = {
              ^";
-static field core::Map<dynamic, core::Null?>* error8 = <dynamic, core::Null?>{invalid-expression "pkg/front_end/testcases/unified_collections/mixed_entries.dart:41:32: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+static field core::Map<dynamic, Null>* error8 = <dynamic, Null>{invalid-expression "pkg/front_end/testcases/unified_collections/mixed_entries.dart:41:32: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
 var error8 = {if (b) 0: 1 else for (var i = 0; i < list.length; i++) list[i]};
                                ^": null};
-static field core::Map<dynamic, core::Null?>* error9 = <dynamic, core::Null?>{invalid-expression "pkg/front_end/testcases/unified_collections/mixed_entries.dart:42:22: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+static field core::Map<dynamic, Null>* error9 = <dynamic, Null>{invalid-expression "pkg/front_end/testcases/unified_collections/mixed_entries.dart:42:22: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
 var error9 = {if (b) for (var i = 0; i < list.length; i++) list[i] else 0: 1};
                      ^": null};
 static field dynamic error10 = invalid-expression "pkg/front_end/testcases/unified_collections/mixed_entries.dart:43:15: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
diff --git a/pkg/front_end/testcases/unified_collections/mixed_entries.dart.strong.transformed.expect b/pkg/front_end/testcases/unified_collections/mixed_entries.dart.strong.transformed.expect
index 819c6c1..ff07e3e 100644
--- a/pkg/front_end/testcases/unified_collections/mixed_entries.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/unified_collections/mixed_entries.dart.strong.transformed.expect
@@ -47,12 +47,12 @@
 static field core::Map<dynamic, dynamic>* map1 = block {
   final core::Map<dynamic, dynamic>* #t1 = <dynamic, dynamic>{};
   if(self::b)
-    #t1.{core::Map::[]=}(0, 1);
+    #t1.{core::Map::[]=}{Invariant}(0, 1);
   else {
     core::Iterator<core::MapEntry<dynamic, dynamic>>* :sync-for-iterator = self::map0.{core::Map::entries}.{core::Iterable::iterator};
     for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
       final core::MapEntry<dynamic, dynamic>* #t2 = :sync-for-iterator.{core::Iterator::current};
-      #t1.{core::Map::[]=}(#t2.{core::MapEntry::key}, #t2.{core::MapEntry::value});
+      #t1.{core::Map::[]=}{Invariant}(#t2.{core::MapEntry::key}, #t2.{core::MapEntry::value});
     }
   }
 } =>#t1;
@@ -62,11 +62,11 @@
     core::Iterator<core::MapEntry<dynamic, dynamic>>* :sync-for-iterator = self::map0.{core::Map::entries}.{core::Iterable::iterator};
     for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
       final core::MapEntry<dynamic, dynamic>* #t4 = :sync-for-iterator.{core::Iterator::current};
-      #t3.{core::Map::[]=}(#t4.{core::MapEntry::key}, #t4.{core::MapEntry::value});
+      #t3.{core::Map::[]=}{Invariant}(#t4.{core::MapEntry::key}, #t4.{core::MapEntry::value});
     }
   }
   else
-    #t3.{core::Map::[]=}(0, 1);
+    #t3.{core::Map::[]=}{Invariant}(0, 1);
 } =>#t3;
 static field core::Map<dynamic, dynamic>* map3 = block {
   final core::Map<dynamic, dynamic>* #t5 = <dynamic, dynamic>{};
@@ -74,26 +74,26 @@
     core::Iterator<core::MapEntry<dynamic, dynamic>>* :sync-for-iterator = self::map0.{core::Map::entries}.{core::Iterable::iterator};
     for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
       final core::MapEntry<dynamic, dynamic>* #t6 = :sync-for-iterator.{core::Iterator::current};
-      #t5.{core::Map::[]=}(#t6.{core::MapEntry::key}, #t6.{core::MapEntry::value});
+      #t5.{core::Map::[]=}{Invariant}(#t6.{core::MapEntry::key}, #t6.{core::MapEntry::value});
     }
   }
   else {
     core::Iterator<core::MapEntry<dynamic, dynamic>>* :sync-for-iterator = self::map0.{core::Map::entries}.{core::Iterable::iterator};
     for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
       final core::MapEntry<dynamic, dynamic>* #t7 = :sync-for-iterator.{core::Iterator::current};
-      #t5.{core::Map::[]=}(#t7.{core::MapEntry::key}, #t7.{core::MapEntry::value});
+      #t5.{core::Map::[]=}{Invariant}(#t7.{core::MapEntry::key}, #t7.{core::MapEntry::value});
     }
   }
 } =>#t5;
 static field core::Map<dynamic, core::int*>* map4 = block {
   final core::Map<dynamic, core::int*>* #t8 = <dynamic, core::int*>{};
   if(self::b)
-    #t8.{core::Map::[]=}(0, 1);
+    #t8.{core::Map::[]=}{Invariant}(0, 1);
   else {
     core::Iterator<dynamic>* :sync-for-iterator = self::list.{core::Iterable::iterator};
     for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
       dynamic a = :sync-for-iterator.{core::Iterator::current};
-      #t8.{core::Map::[]=}(a, 1);
+      #t8.{core::Map::[]=}{Invariant}(a, 1);
     }
   }
 } =>#t8;
@@ -103,16 +103,16 @@
     core::Iterator<dynamic>* :sync-for-iterator = self::list.{core::Iterable::iterator};
     for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
       dynamic a = :sync-for-iterator.{core::Iterator::current};
-      #t9.{core::Map::[]=}(a, 1);
+      #t9.{core::Map::[]=}{Invariant}(a, 1);
     }
   }
   else
-    #t9.{core::Map::[]=}(0, 1);
+    #t9.{core::Map::[]=}{Invariant}(0, 1);
 } =>#t9;
 static field core::Map<dynamic, core::int*>* map6 = block {
   final core::Map<dynamic, core::int*>* #t10 = <dynamic, core::int*>{};
   if(self::b)
-    #t10.{core::Map::[]=}(0, 1);
+    #t10.{core::Map::[]=}{Invariant}(0, 1);
   else {
     core::Iterator<dynamic>* :sync-for-iterator = self::list.{core::Iterable::iterator};
     for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -121,7 +121,7 @@
         core::Iterator<core::MapEntry<dynamic, core::int*>>* :sync-for-iterator = <dynamic, core::int*>{a: 1}.{core::Map::entries}.{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
           final core::MapEntry<dynamic, core::int*>* #t11 = :sync-for-iterator.{core::Iterator::current};
-          #t10.{core::Map::[]=}(#t11.{core::MapEntry::key}, #t11.{core::MapEntry::value});
+          #t10.{core::Map::[]=}{Invariant}(#t11.{core::MapEntry::key}, #t11.{core::MapEntry::value});
         }
       }
     }
@@ -137,40 +137,40 @@
         core::Iterator<core::MapEntry<dynamic, core::int*>>* :sync-for-iterator = <dynamic, core::int*>{a: 1}.{core::Map::entries}.{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
           final core::MapEntry<dynamic, core::int*>* #t13 = :sync-for-iterator.{core::Iterator::current};
-          #t12.{core::Map::[]=}(#t13.{core::MapEntry::key}, #t13.{core::MapEntry::value});
+          #t12.{core::Map::[]=}{Invariant}(#t13.{core::MapEntry::key}, #t13.{core::MapEntry::value});
         }
       }
     }
   }
   else
-    #t12.{core::Map::[]=}(0, 1);
+    #t12.{core::Map::[]=}{Invariant}(0, 1);
 } =>#t12;
 static field core::Map<dynamic, core::int*>* map8 = block {
   final core::Map<dynamic, core::int*>* #t14 = <dynamic, core::int*>{};
   if(self::b)
-    #t14.{core::Map::[]=}(0, 1);
+    #t14.{core::Map::[]=}{Invariant}(0, 1);
   else
     for (core::int* i = 0; i.{core::num::<}(self::list.{core::List::length}); i = i.{core::num::+}(1))
-      #t14.{core::Map::[]=}(self::list.{core::List::[]}(i), 1);
+      #t14.{core::Map::[]=}{Invariant}(self::list.{core::List::[]}(i), 1);
 } =>#t14;
 static field core::Map<dynamic, core::int*>* map9 = block {
   final core::Map<dynamic, core::int*>* #t15 = <dynamic, core::int*>{};
   if(self::b)
     for (core::int* i = 0; i.{core::num::<}(self::list.{core::List::length}); i = i.{core::num::+}(1))
-      #t15.{core::Map::[]=}(self::list.{core::List::[]}(i), 1);
+      #t15.{core::Map::[]=}{Invariant}(self::list.{core::List::[]}(i), 1);
   else
-    #t15.{core::Map::[]=}(0, 1);
+    #t15.{core::Map::[]=}{Invariant}(0, 1);
 } =>#t15;
 static field core::Map<dynamic, core::int*>* map10 = block {
   final core::Map<dynamic, core::int*>* #t16 = <dynamic, core::int*>{};
   if(self::b)
-    #t16.{core::Map::[]=}(0, 1);
+    #t16.{core::Map::[]=}{Invariant}(0, 1);
   else
     for (core::int* i = 0; i.{core::num::<}(self::list.{core::List::length}); i = i.{core::num::+}(1)) {
       core::Iterator<core::MapEntry<dynamic, core::int*>>* :sync-for-iterator = <dynamic, core::int*>{self::list.{core::List::[]}(i): 1}.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::MapEntry<dynamic, core::int*>* #t17 = :sync-for-iterator.{core::Iterator::current};
-        #t16.{core::Map::[]=}(#t17.{core::MapEntry::key}, #t17.{core::MapEntry::value});
+        #t16.{core::Map::[]=}{Invariant}(#t17.{core::MapEntry::key}, #t17.{core::MapEntry::value});
       }
     }
 } =>#t16;
@@ -181,29 +181,29 @@
       core::Iterator<core::MapEntry<dynamic, core::int*>>* :sync-for-iterator = <dynamic, core::int*>{self::list.{core::List::[]}(i): 1}.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::MapEntry<dynamic, core::int*>* #t19 = :sync-for-iterator.{core::Iterator::current};
-        #t18.{core::Map::[]=}(#t19.{core::MapEntry::key}, #t19.{core::MapEntry::value});
+        #t18.{core::Map::[]=}{Invariant}(#t19.{core::MapEntry::key}, #t19.{core::MapEntry::value});
       }
     }
   else
-    #t18.{core::Map::[]=}(0, 1);
+    #t18.{core::Map::[]=}{Invariant}(0, 1);
 } =>#t18;
 static field core::Map<core::int*, core::int*>* map12 = block {
   final core::Map<core::int*, core::int*>* #t20 = <core::int*, core::int*>{};
   if(self::b)
-    #t20.{core::Map::[]=}(0, 1);
+    #t20.{core::Map::[]=}{Invariant}(0, 1);
   else
     if(self::b) {
       core::Iterator<core::MapEntry<core::int*, core::int*>>* :sync-for-iterator = <core::int*, core::int*>{0: 1}.{core::Map::entries}.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::MapEntry<core::int*, core::int*>* #t21 = :sync-for-iterator.{core::Iterator::current};
-        #t20.{core::Map::[]=}(#t21.{core::MapEntry::key}, #t21.{core::MapEntry::value});
+        #t20.{core::Map::[]=}{Invariant}(#t21.{core::MapEntry::key}, #t21.{core::MapEntry::value});
       }
     }
 } =>#t20;
-static field core::Map<dynamic, core::Null?>* error4 = <dynamic, core::Null?>{invalid-expression "pkg/front_end/testcases/unified_collections/mixed_entries.dart:33:32: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+static field core::Map<dynamic, Null>* error4 = <dynamic, Null>{invalid-expression "pkg/front_end/testcases/unified_collections/mixed_entries.dart:33:32: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
 var error4 = {if (b) 0: 1 else for (var a in list) a};
                                ^": null};
-static field core::Map<dynamic, core::Null?>* error5 = <dynamic, core::Null?>{invalid-expression "pkg/front_end/testcases/unified_collections/mixed_entries.dart:34:22: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+static field core::Map<dynamic, Null>* error5 = <dynamic, Null>{invalid-expression "pkg/front_end/testcases/unified_collections/mixed_entries.dart:34:22: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
 var error5 = {if (b) for (var a in list) a else 0: 1};
                      ^": null};
 static field dynamic error6 = invalid-expression "pkg/front_end/testcases/unified_collections/mixed_entries.dart:35:14: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
@@ -212,10 +212,10 @@
 static field dynamic error7 = invalid-expression "pkg/front_end/testcases/unified_collections/mixed_entries.dart:38:14: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
 var error7 = {
              ^";
-static field core::Map<dynamic, core::Null?>* error8 = <dynamic, core::Null?>{invalid-expression "pkg/front_end/testcases/unified_collections/mixed_entries.dart:41:32: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+static field core::Map<dynamic, Null>* error8 = <dynamic, Null>{invalid-expression "pkg/front_end/testcases/unified_collections/mixed_entries.dart:41:32: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
 var error8 = {if (b) 0: 1 else for (var i = 0; i < list.length; i++) list[i]};
                                ^": null};
-static field core::Map<dynamic, core::Null?>* error9 = <dynamic, core::Null?>{invalid-expression "pkg/front_end/testcases/unified_collections/mixed_entries.dart:42:22: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+static field core::Map<dynamic, Null>* error9 = <dynamic, Null>{invalid-expression "pkg/front_end/testcases/unified_collections/mixed_entries.dart:42:22: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
 var error9 = {if (b) for (var i = 0; i < list.length; i++) list[i] else 0: 1};
                      ^": null};
 static field dynamic error10 = invalid-expression "pkg/front_end/testcases/unified_collections/mixed_entries.dart:43:15: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
diff --git a/pkg/front_end/testcases/unified_collections/string_concatenation.dart.strong.expect b/pkg/front_end/testcases/unified_collections/string_concatenation.dart.strong.expect
index 930929b..f3953a4 100644
--- a/pkg/front_end/testcases/unified_collections/string_concatenation.dart.strong.expect
+++ b/pkg/front_end/testcases/unified_collections/string_concatenation.dart.strong.expect
@@ -6,8 +6,8 @@
   core::bool* b = false;
   block {
     final core::List<core::String*>* #t1 = <core::String*>[];
-    #t1.{core::List::add}("ab");
+    #t1.{core::List::add}{Invariant}("ab");
     if(b)
-      #t1.{core::List::add}("cd");
+      #t1.{core::List::add}{Invariant}("cd");
   } =>#t1;
 }
diff --git a/pkg/front_end/testcases/unified_collections/string_concatenation.dart.strong.transformed.expect b/pkg/front_end/testcases/unified_collections/string_concatenation.dart.strong.transformed.expect
index b5ffe41..44b114b 100644
--- a/pkg/front_end/testcases/unified_collections/string_concatenation.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/unified_collections/string_concatenation.dart.strong.transformed.expect
@@ -6,9 +6,9 @@
   core::bool* b = false;
   block {
     final core::List<core::String*>* #t1 = <core::String*>[];
-    #t1.{core::List::add}("ab");
+    #t1.{core::List::add}{Invariant}("ab");
     if(b)
-      #t1.{core::List::add}("cd");
+      #t1.{core::List::add}{Invariant}("cd");
   } =>#t1;
 }
 
diff --git a/pkg/front_end/testcases/variance/folder.options b/pkg/front_end/testcases/variance/folder.options
index 3ce5008..a49934f 100644
--- a/pkg/front_end/testcases/variance/folder.options
+++ b/pkg/front_end/testcases/variance/folder.options
@@ -1 +1 @@
---enable-experiment=variance
+--enable-experiment=variance,no-non-nullable
diff --git a/pkg/front_end/testcases/variance/generic_covariance_sound_variance.dart.strong.expect b/pkg/front_end/testcases/variance/generic_covariance_sound_variance.dart.strong.expect
index 183b9bb..4b64468 100644
--- a/pkg/front_end/testcases/variance/generic_covariance_sound_variance.dart.strong.expect
+++ b/pkg/front_end/testcases/variance/generic_covariance_sound_variance.dart.strong.expect
@@ -167,7 +167,7 @@
 static method main() → dynamic {
   self::A<core::int*, core::num*, core::String*>* a = new self::A::•<core::int*, core::num*, core::String*>();
   self::expect(null, a.{self::A::field});
-  a.{self::A::method}(3, (core::num* num) → core::Null? {}, "test");
+  a.{self::A::method}(3, (core::num* num) → Null {}, "test");
   a.{self::A::method2}(3);
   a.{self::A::x} = 3;
   core::Map<core::num*, self::Contravariant<core::String*>*>* mapContra = a.{self::A::mapContra} as{TypeError,CovarianceCheck} core::Map<core::num*, self::Contravariant<core::String*>*>*;
@@ -183,7 +183,7 @@
   self::expect(null, c.{self::C::field});
   c.{self::C::method}(3, 2);
   c.{self::C::x} = 3;
-  self::D<core::Object*>* d = new self::F::•<core::String*>((core::String* s) → core::Null? {});
+  self::D<core::Object*>* d = new self::F::•<core::String*>((core::String* s) → Null {});
   d.{self::D::method}("test");
   self::NoSuchMethod<core::num*>* nsm = new self::NoSuchMethod::•<core::num*>();
   self::expect(3, nsm.{self::B::method}(3));
diff --git a/pkg/front_end/testcases/variance/generic_covariance_sound_variance.dart.strong.transformed.expect b/pkg/front_end/testcases/variance/generic_covariance_sound_variance.dart.strong.transformed.expect
index 183b9bb..4b64468 100644
--- a/pkg/front_end/testcases/variance/generic_covariance_sound_variance.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/variance/generic_covariance_sound_variance.dart.strong.transformed.expect
@@ -167,7 +167,7 @@
 static method main() → dynamic {
   self::A<core::int*, core::num*, core::String*>* a = new self::A::•<core::int*, core::num*, core::String*>();
   self::expect(null, a.{self::A::field});
-  a.{self::A::method}(3, (core::num* num) → core::Null? {}, "test");
+  a.{self::A::method}(3, (core::num* num) → Null {}, "test");
   a.{self::A::method2}(3);
   a.{self::A::x} = 3;
   core::Map<core::num*, self::Contravariant<core::String*>*>* mapContra = a.{self::A::mapContra} as{TypeError,CovarianceCheck} core::Map<core::num*, self::Contravariant<core::String*>*>*;
@@ -183,7 +183,7 @@
   self::expect(null, c.{self::C::field});
   c.{self::C::method}(3, 2);
   c.{self::C::x} = 3;
-  self::D<core::Object*>* d = new self::F::•<core::String*>((core::String* s) → core::Null? {});
+  self::D<core::Object*>* d = new self::F::•<core::String*>((core::String* s) → Null {});
   d.{self::D::method}("test");
   self::NoSuchMethod<core::num*>* nsm = new self::NoSuchMethod::•<core::num*>();
   self::expect(3, nsm.{self::B::method}(3));
diff --git a/pkg/front_end/testcases/variance/unconstrained_inference.dart.strong.expect b/pkg/front_end/testcases/variance/unconstrained_inference.dart.strong.expect
index fcc030b..d9a2571 100644
--- a/pkg/front_end/testcases/variance/unconstrained_inference.dart.strong.expect
+++ b/pkg/front_end/testcases/variance/unconstrained_inference.dart.strong.expect
@@ -53,8 +53,8 @@
 static method main() → dynamic {
   self::Covariant<dynamic>* cov = new self::Covariant::•<dynamic>();
   self::covariantListInfer<dynamic>(new self::Covariant::•<core::List<dynamic>*>());
-  self::Contravariant<core::Null?>* contra = new self::Contravariant::•<core::Null?>();
-  self::contravariantListInfer<core::Null?>(new self::Contravariant::•<core::List<core::Null?>*>());
+  self::Contravariant<Null>* contra = new self::Contravariant::•<Null>();
+  self::contravariantListInfer<Null>(new self::Contravariant::•<core::List<Null>*>());
   self::Invariant<dynamic>* inv = new self::Invariant::•<dynamic>();
-  self::invariantListInfer<core::Null?>(new self::Invariant::•<core::List<core::Null?>*>());
+  self::invariantListInfer<Null>(new self::Invariant::•<core::List<Null>*>());
 }
diff --git a/pkg/front_end/testcases/variance/unconstrained_inference.dart.strong.transformed.expect b/pkg/front_end/testcases/variance/unconstrained_inference.dart.strong.transformed.expect
index fcc030b..d9a2571 100644
--- a/pkg/front_end/testcases/variance/unconstrained_inference.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/variance/unconstrained_inference.dart.strong.transformed.expect
@@ -53,8 +53,8 @@
 static method main() → dynamic {
   self::Covariant<dynamic>* cov = new self::Covariant::•<dynamic>();
   self::covariantListInfer<dynamic>(new self::Covariant::•<core::List<dynamic>*>());
-  self::Contravariant<core::Null?>* contra = new self::Contravariant::•<core::Null?>();
-  self::contravariantListInfer<core::Null?>(new self::Contravariant::•<core::List<core::Null?>*>());
+  self::Contravariant<Null>* contra = new self::Contravariant::•<Null>();
+  self::contravariantListInfer<Null>(new self::Contravariant::•<core::List<Null>*>());
   self::Invariant<dynamic>* inv = new self::Invariant::•<dynamic>();
-  self::invariantListInfer<core::Null?>(new self::Invariant::•<core::List<core::Null?>*>());
+  self::invariantListInfer<Null>(new self::Invariant::•<core::List<Null>*>());
 }
diff --git a/pkg/front_end/testcases/weak.status b/pkg/front_end/testcases/weak.status
index bf869dd..23bbcca 100644
--- a/pkg/front_end/testcases/weak.status
+++ b/pkg/front_end/testcases/weak.status
@@ -50,11 +50,9 @@
 general_nnbd_opt_out/override_check_basic: TypeCheckError # Issue #31620
 general_nnbd_opt_out/override_check_with_covariant_modifier: TypeCheckError # Issue #31620
 general_nnbd_opt_out/override_setter_with_field: TypeCheckError
-general_nnbd_opt_out/reject_generic_function_types_in_bounds: RuntimeError # Expected
 general_nnbd_opt_out/spread_collection: RuntimeError
 general_nnbd_opt_out/type_parameter_type_named_int: RuntimeError # Expected
 general_nnbd_opt_out/type_variable_as_super: RuntimeError
-general_nnbd_opt_out/type_variable_bound_access: TypeCheckError
 general_nnbd_opt_out/unsound_promotion: TypeCheckError
 general_nnbd_opt_out/void_methods: RuntimeError
 late_lowering/covariant_late_field: TypeCheckError
@@ -72,6 +70,9 @@
 nnbd_mixed/issue41567: TypeCheckError
 nnbd_mixed/messages_with_types_opt_in: TypeCheckError
 nnbd_mixed/messages_with_types_opt_out: TypeCheckError
+nnbd_mixed/super_access/main: Crash # Issue 43864
+nnbd_mixed/super_access/main.no_link: Crash # Issue 43864
+none/mixin_covariant: TypeCheckError
 value_class/simple: RuntimeError # Expected
 value_class/value_extends_non_value: RuntimeError # Expected
 value_class/value_implements_non_value: RuntimeError # Expected
diff --git a/pkg/front_end/testing.json b/pkg/front_end/testing.json
index 47f67ff..deda925 100644
--- a/pkg/front_end/testing.json
+++ b/pkg/front_end/testing.json
@@ -480,6 +480,7 @@
     "exclude": [
       "^pkg/analysis_server/lib/src/analysis_server\\.dart",
       "test/analyser_ignored/",
+      "test/enable_non_nullable/data/",
       "test/extensions/data/",
       "test/id_testing/data/",
       "test/language_versioning/data/",
diff --git a/pkg/front_end/tool/_fasta/bench_maker.dart b/pkg/front_end/tool/_fasta/bench_maker.dart
index 581b5a9..6623d7a 100644
--- a/pkg/front_end/tool/_fasta/bench_maker.dart
+++ b/pkg/front_end/tool/_fasta/bench_maker.dart
@@ -253,6 +253,11 @@
   }
 
   @override
+  void visitNullType(NullType node, StringBuffer sb) {
+    sb.write("Null");
+  }
+
+  @override
   void visitInterfaceType(InterfaceType node, StringBuffer sb) {
     Class cls = node.classNode;
     sb.write(computeName(cls));
diff --git a/pkg/front_end/tool/_fasta/command_line.dart b/pkg/front_end/tool/_fasta/command_line.dart
index ca24131..0404554 100644
--- a/pkg/front_end/tool/_fasta/command_line.dart
+++ b/pkg/front_end/tool/_fasta/command_line.dart
@@ -4,8 +4,6 @@
 
 library fasta.tool.command_line;
 
-import 'dart:async' show Future;
-
 import 'dart:io' show exit;
 
 import 'package:_fe_analyzer_shared/src/messages/severity.dart' show Severity;
@@ -18,7 +16,7 @@
 import 'package:front_end/src/api_prototype/compiler_options.dart';
 
 import 'package:front_end/src/api_prototype/experimental_flags.dart'
-    show ExperimentalFlag;
+    show ExperimentalFlag, isExperimentEnabled;
 
 import 'package:front_end/src/api_prototype/file_system.dart' show FileSystem;
 
@@ -171,7 +169,6 @@
 //  * Get an explicit approval from the front-end team.
 const Map<String, ValueSpecification> optionSpecification =
     const <String, ValueSpecification>{
-  Flags.bytecode: const BoolValue(false),
   Flags.compileSdk: const UriValue(),
   Flags.dumpIr: const BoolValue(false),
   Flags.enableExperiment: const StringListValue(),
@@ -197,6 +194,7 @@
   Flags.target: const StringValue(),
   Flags.verbose: const BoolValue(false),
   Flags.verify: const BoolValue(false),
+  Flags.verifySkipPlatform: const BoolValue(false),
   Flags.warnOnReachabilityCheck: const BoolValue(false),
   Flags.linkDependencies: const UriListValue(),
   Flags.noDeps: const BoolValue(false),
@@ -237,10 +235,11 @@
 
   final String targetName = options[Flags.target] ?? "vm";
 
-  Map<ExperimentalFlag, bool> experimentalFlags = parseExperimentalFlags(
-      parseExperimentalArguments(options[Flags.enableExperiment]),
-      onError: throwCommandLineProblem,
-      onWarning: print);
+  Map<ExperimentalFlag, bool> explicitExperimentalFlags =
+      parseExperimentalFlags(
+          parseExperimentalArguments(options[Flags.enableExperiment]),
+          onError: throwCommandLineProblem,
+          onWarning: print);
 
   final TargetFlags flags = new TargetFlags(
       forceLateLoweringForTesting: options[Flags.forceLateLowering],
@@ -248,9 +247,8 @@
           options[Flags.forceStaticFieldLowering],
       forceNoExplicitGetterCallsForTesting:
           options[Flags.forceNoExplicitGetterCalls],
-      enableNullSafety:
-          experimentalFlags.containsKey(ExperimentalFlag.nonNullable) &&
-              experimentalFlags[ExperimentalFlag.nonNullable]);
+      enableNullSafety: isExperimentEnabled(ExperimentalFlag.nonNullable,
+          explicitExperimentalFlags: explicitExperimentalFlags));
 
   final Target target = getTarget(targetName, flags);
   if (target == null) {
@@ -265,6 +263,8 @@
 
   final bool verify = options[Flags.verify];
 
+  final bool verifySkipPlatform = options[Flags.verifySkipPlatform];
+
   final bool dumpIr = options[Flags.dumpIr];
 
   final bool excludeSource = options[Flags.excludeSource];
@@ -282,8 +282,6 @@
 
   final int fatalSkip = int.tryParse(options[Flags.fatalSkip] ?? "0") ?? -1;
 
-  final bool bytecode = options[Flags.bytecode];
-
   final bool compileSdk = options.containsKey(Flags.compileSdk);
 
   final String singleRootScheme = options[Flags.singleRootScheme];
@@ -347,7 +345,8 @@
     ..omitPlatform = omitPlatform
     ..verbose = verbose
     ..verify = verify
-    ..experimentalFlags = experimentalFlags
+    ..verifySkipPlatform = verifySkipPlatform
+    ..explicitExperimentalFlags = explicitExperimentalFlags
     ..environmentDefines = noDefines ? null : parsedArguments.defines
     ..nnbdMode = nnbdMode
     ..additionalDills = linkDependencies
@@ -372,8 +371,7 @@
         options: compilerOptions
           ..sdkSummary = options[Flags.platform]
           ..librariesSpecificationUri = resolveInputUri(arguments[1])
-          ..setExitCodeOnProblem = true
-          ..bytecode = bytecode,
+          ..setExitCodeOnProblem = true,
         inputs: <Uri>[Uri.parse(arguments[0])],
         output: resolveInputUri(arguments[3]));
   } else if (arguments.isEmpty) {
diff --git a/pkg/front_end/tool/_fasta/compile_platform_legacy_test.dart b/pkg/front_end/tool/_fasta/compile_platform_legacy_test.dart
index 90a9f5f..985026c 100644
--- a/pkg/front_end/tool/_fasta/compile_platform_legacy_test.dart
+++ b/pkg/front_end/tool/_fasta/compile_platform_legacy_test.dart
@@ -4,8 +4,6 @@
 
 library fasta.test.compile_platform_test;
 
-import 'dart:async';
-
 import 'dart:io';
 
 import 'package:async_helper/async_helper.dart';
diff --git a/pkg/front_end/tool/_fasta/compile_platform_test.dart b/pkg/front_end/tool/_fasta/compile_platform_test.dart
index 90a9f5f..985026c 100644
--- a/pkg/front_end/tool/_fasta/compile_platform_test.dart
+++ b/pkg/front_end/tool/_fasta/compile_platform_test.dart
@@ -4,8 +4,6 @@
 
 library fasta.test.compile_platform_test;
 
-import 'dart:async';
-
 import 'dart:io';
 
 import 'package:async_helper/async_helper.dart';
diff --git a/pkg/front_end/tool/_fasta/entry_points.dart b/pkg/front_end/tool/_fasta/entry_points.dart
index 1a4399f2..03a5e96 100644
--- a/pkg/front_end/tool/_fasta/entry_points.dart
+++ b/pkg/front_end/tool/_fasta/entry_points.dart
@@ -4,8 +4,6 @@
 
 library fasta.tool.entry_points;
 
-import 'dart:async' show Stream;
-
 import 'dart:convert' show LineSplitter, jsonDecode, jsonEncode, utf8;
 
 import 'dart:io' show File, Platform, exitCode, stderr, stdin, stdout;
@@ -13,6 +11,9 @@
 import 'package:_fe_analyzer_shared/src/util/relativize.dart'
     show isWindows, relativizeUri;
 
+import 'package:front_end/src/fasta/fasta_codes.dart'
+    show LocatedMessage, codeInternalProblemVerificationError;
+
 import 'package:kernel/kernel.dart'
     show CanonicalName, Library, Component, Source, loadComponentFromBytes;
 
@@ -20,11 +21,6 @@
 
 import 'package:kernel/src/types.dart' show Types;
 
-import 'package:vm/bytecode/gen_bytecode.dart'
-    show createFreshComponentWithBytecode, generateBytecode;
-
-import 'package:vm/bytecode/options.dart' show BytecodeOptions;
-
 import 'package:front_end/src/api_prototype/compiler_options.dart'
     show CompilerOptions;
 
@@ -136,6 +132,8 @@
 
   Component platformComponent;
 
+  bool hadVerifyError = false;
+
   BatchCompiler(this.lines);
 
   run() async {
@@ -176,12 +174,15 @@
     ProcessedOptions options = c.options;
     bool verbose = options.verbose;
     Ticker ticker = new Ticker(isVerbose: verbose);
-    if (platformComponent == null || platformUri != options.sdkSummary) {
+    if (platformComponent == null ||
+        platformUri != options.sdkSummary ||
+        hadVerifyError) {
       platformUri = options.sdkSummary;
       platformComponent = await options.loadSdkSummary(null);
       if (platformComponent == null) {
         throw "platformComponent is null";
       }
+      hadVerifyError = false;
     } else {
       options.sdkSummaryComponent = platformComponent;
     }
@@ -195,7 +196,13 @@
         root.adoptChild(name);
       }
     }
-    root.unbindAll();
+    for (Object error in c.errors) {
+      if (error is LocatedMessage) {
+        if (error.messageObject.code == codeInternalProblemVerificationError) {
+          hadVerifyError = true;
+        }
+      }
+    }
     return c.errors.isEmpty;
   }
 }
@@ -314,9 +321,9 @@
         dillTarget.loader.appendLibraries(additionalDill);
       }
     } else {
-      Uri platform = c.options.sdkSummary;
-      if (platform != null) {
-        _appendDillForUri(dillTarget, platform);
+      Component sdkSummary = await c.options.loadSdkSummary(null);
+      if (sdkSummary != null) {
+        dillTarget.loader.appendLibraries(sdkSummary);
       }
     }
 
@@ -419,18 +426,7 @@
   new File.fromUri(outlineOutput).writeAsBytesSync(result.summary);
   c.options.ticker.logMs("Wrote outline to ${outlineOutput.toFilePath()}");
 
-  Component component = result.component;
-  if (c.options.bytecode) {
-    generateBytecode(component,
-        options: new BytecodeOptions(
-            enableAsserts: true,
-            emitSourceFiles: true,
-            emitSourcePositions: true,
-            environmentDefines: c.options.environmentDefines));
-    component = createFreshComponentWithBytecode(component);
-  }
-
-  await writeComponentToFile(component, fullOutput);
+  await writeComponentToFile(result.component, fullOutput);
 
   c.options.ticker.logMs("Wrote component to ${fullOutput.toFilePath()}");
 
diff --git a/pkg/front_end/tool/_fasta/generate_messages.dart b/pkg/front_end/tool/_fasta/generate_messages.dart
index 5eeb061..cd6b870 100644
--- a/pkg/front_end/tool/_fasta/generate_messages.dart
+++ b/pkg/front_end/tool/_fasta/generate_messages.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:async';
-
 import 'dart:io';
 
 import 'dart:isolate';
@@ -18,10 +16,16 @@
 main(List<String> arguments) async {
   var port = new ReceivePort();
   Messages message = await generateMessagesFiles();
-  await new File.fromUri(await computeSharedGeneratedFile())
-      .writeAsString(message.sharedMessages, flush: true);
-  await new File.fromUri(await computeCfeGeneratedFile())
-      .writeAsString(message.cfeMessages, flush: true);
+  if (message.sharedMessages.trim().isEmpty ||
+      message.cfeMessages.trim().isEmpty) {
+    print("Bailing because of errors: "
+        "Refusing to overwrite with empty file!");
+  } else {
+    await new File.fromUri(await computeSharedGeneratedFile())
+        .writeAsString(message.sharedMessages, flush: true);
+    await new File.fromUri(await computeCfeGeneratedFile())
+        .writeAsString(message.cfeMessages, flush: true);
+  }
   port.close();
 }
 
@@ -300,6 +304,7 @@
       case "type":
       case "type2":
       case "type3":
+      case "type4":
         parameters.add("DartType _${name}");
         ensureLabeler();
         conversions
diff --git a/pkg/front_end/tool/fasta_perf.dart b/pkg/front_end/tool/fasta_perf.dart
index 8bffb28..385ec39 100644
--- a/pkg/front_end/tool/fasta_perf.dart
+++ b/pkg/front_end/tool/fasta_perf.dart
@@ -5,7 +5,6 @@
 /// An entrypoint used to run portions of fasta and measure its performance.
 library front_end.tool.fasta_perf;
 
-import 'dart:async';
 import 'dart:io';
 
 import 'package:_fe_analyzer_shared/src/parser/parser.dart';
diff --git a/pkg/front_end/tool/incremental_perf.dart b/pkg/front_end/tool/incremental_perf.dart
index 7d87595..617e448 100644
--- a/pkg/front_end/tool/incremental_perf.dart
+++ b/pkg/front_end/tool/incremental_perf.dart
@@ -42,7 +42,6 @@
 ///  updates input1.dart a second time.
 library front_end.tool.incremental_perf;
 
-import 'dart:async';
 import 'dart:convert';
 import 'dart:io' hide FileSystemEntity;
 
diff --git a/pkg/front_end/tool/perf.dart b/pkg/front_end/tool/perf.dart
index 4f10f61..95b3ba5 100644
--- a/pkg/front_end/tool/perf.dart
+++ b/pkg/front_end/tool/perf.dart
@@ -15,7 +15,6 @@
 /// outlines).
 library front_end.tool.perf;
 
-import 'dart:async';
 import 'dart:io' show Directory, File, Platform, exit;
 
 import 'package:_fe_analyzer_shared/src/scanner/scanner.dart';
diff --git a/pkg/frontend_server/lib/frontend_server.dart b/pkg/frontend_server/lib/frontend_server.dart
index dc92143..4d9b5ae 100644
--- a/pkg/frontend_server/lib/frontend_server.dart
+++ b/pkg/frontend_server/lib/frontend_server.dart
@@ -30,12 +30,6 @@
 import 'package:path/path.dart' as path;
 import 'package:usage/uuid/uuid.dart';
 
-import 'package:vm/metadata/binary_cache.dart'
-    show BinaryCacheMetadataRepository;
-
-import 'package:vm/bytecode/gen_bytecode.dart'
-    show generateBytecode, createFreshComponentWithBytecode;
-import 'package:vm/bytecode/options.dart' show BytecodeOptions;
 import 'package:vm/incremental_compiler.dart' show IncrementalCompiler;
 import 'package:vm/kernel_front_end.dart';
 
@@ -145,14 +139,6 @@
   ..addFlag('track-widget-creation',
       help: 'Run a kernel transformer to track creation locations for widgets.',
       defaultsTo: false)
-  ..addFlag('gen-bytecode', help: 'Generate bytecode', defaultsTo: false)
-  ..addMultiOption('bytecode-options',
-      help: 'Specify options for bytecode generation:',
-      valueHelp: 'opt1,opt2,...',
-      allowed: BytecodeOptions.commandLineFlags.keys,
-      allowedHelp: BytecodeOptions.commandLineFlags)
-  ..addFlag('drop-ast',
-      help: 'Include only bytecode into the output file', defaultsTo: true)
   ..addFlag('enable-asserts',
       help: 'Whether asserts will be enabled.', defaultsTo: false)
   ..addFlag('sound-null-safety',
@@ -180,7 +166,10 @@
       defaultsTo: 'amd')
   ..addFlag('flutter-widget-cache',
       help: 'Enable the widget cache to track changes to Widget subtypes',
-      defaultsTo: false);
+      defaultsTo: false)
+  ..addFlag('print-incremental-dependencies',
+      help: 'Print list of sources added and removed from compilation',
+      defaultsTo: true);
 
 String usage = '''
 Usage: server [options] [input.dart]
@@ -339,9 +328,9 @@
   bool incrementalSerialization;
   bool useDebuggerModuleNames;
   bool emitDebugMetadata;
+  bool _printIncrementalDependencies;
 
   CompilerOptions _compilerOptions;
-  BytecodeOptions _bytecodeOptions;
   ProcessedOptions _processedOptions;
   FileSystem _fileSystem;
   Uri _mainSource;
@@ -406,6 +395,7 @@
     _kernelBinaryFilename = _kernelBinaryFilenameFull;
     _initializeFromDill =
         _options['initialize-from-dill'] ?? _kernelBinaryFilenameFull;
+    _printIncrementalDependencies = _options['print-incremental-dependencies'];
     final String boundaryKey = Uuid().generateV4();
     _outputStream.writeln('result $boundaryKey');
     final Uri sdkRoot = _ensureFolderPath(options['sdk-root']);
@@ -421,7 +411,7 @@
       ..sdkSummary = sdkRoot.resolve(platformKernelDill)
       ..verbose = options['verbose']
       ..embedSourceText = options['embed-source-text']
-      ..experimentalFlags = parseExperimentalFlags(
+      ..explicitExperimentalFlags = parseExperimentalFlags(
           parseExperimentalArguments(options['enable-experiment']),
           onError: (msg) => errors.add(msg))
       ..nnbdMode = (nullSafety == true) ? NnbdMode.Strong : NnbdMode.Weak
@@ -475,18 +465,10 @@
     }
 
     if (nullSafety == null &&
-        compilerOptions.experimentalFlags[ExperimentalFlag.nonNullable]) {
+        compilerOptions.isExperimentEnabled(ExperimentalFlag.nonNullable)) {
       await autoDetectNullSafetyMode(_mainSource, compilerOptions);
     }
 
-    compilerOptions.bytecode = options['gen-bytecode'];
-    final BytecodeOptions bytecodeOptions = BytecodeOptions(
-      enableAsserts: options['enable-asserts'],
-      emitSourceFiles: options['embed-source-text'],
-      environmentDefines: environmentDefines,
-      aot: options['aot'],
-    )..parseCommandLineFlags(options['bytecode-options']);
-
     // Initialize additional supported kernel targets.
     _installDartdevcTarget();
     compilerOptions.target = createFrontEndTarget(
@@ -506,17 +488,7 @@
       ];
     }
 
-    if (compilerOptions.bytecode && _initializeFromDill != null) {
-      // If we are generating bytecode, put bytecode only (not AST) in
-      // [_kernelBinaryFilename], which the user of this tool will eventually
-      // feed to Flutter engine or flutter_tester. Use a separate file to cache
-      // the AST result to initialize the incremental compiler for the next
-      // invocation of this tool.
-      _initializeFromDill += ".ast";
-    }
-
     _compilerOptions = compilerOptions;
-    _bytecodeOptions = bytecodeOptions;
     _processedOptions = ProcessedOptions(options: compilerOptions);
 
     KernelCompilationResults results;
@@ -549,7 +521,6 @@
           sdkRoot.resolve(platformKernelDill)
         ];
       }
-      // No bytecode at this step. Bytecode is generated later in _writePackage.
       results = await _runWithPrintRedirection(() => compileToKernel(
           _mainSource, compilerOptions,
           includePlatform: options['link-platform'],
@@ -592,23 +563,10 @@
     return errors.isEmpty;
   }
 
-  Future<Component> _generateBytecodeIfNeeded(Component component) async {
-    if (_compilerOptions.bytecode && errors.isEmpty) {
-      await runWithFrontEndCompilerContext(
-          _mainSource, _compilerOptions, component, () {
-        generateBytecode(component,
-            coreTypes: _generator.getCoreTypes(),
-            hierarchy: _generator.getClassHierarchy(),
-            options: _bytecodeOptions);
-        if (_options['drop-ast']) {
-          component = createFreshComponentWithBytecode(component);
-        }
-      });
-    }
-    return component;
-  }
-
   void _outputDependenciesDelta(Iterable<Uri> compiledSources) async {
+    if (!_printIncrementalDependencies) {
+      return;
+    }
     Set<Uri> uris = Set<Uri>();
     for (Uri uri in compiledSources) {
       // Skip empty or corelib dependencies.
@@ -687,88 +645,29 @@
       {bool filterExternal: false,
       IncrementalSerializer incrementalSerializer}) async {
     final Component component = results.component;
-    // Remove the cache that came either from this function or from
-    // initializing from a kernel file.
-    component.metadata.remove(BinaryCacheMetadataRepository.repositoryTag);
+    final IOSink sink = File(filename).openWrite();
+    final Set<Library> loadedLibraries = results.loadedLibraries;
+    final BinaryPrinter printer = filterExternal
+        ? BinaryPrinter(sink,
+            libraryFilter: (lib) => !loadedLibraries.contains(lib),
+            includeSources: false)
+        : printerFactory.newBinaryPrinter(sink);
 
-    if (_compilerOptions.bytecode) {
-      {
-        // Generate bytecode as the output proper.
-        final IOSink sink = File(filename).openWrite();
-        await runWithFrontEndCompilerContext(
-            _mainSource, _compilerOptions, component, () async {
-          if (_options['incremental']) {
-            // When loading a single kernel buffer with multiple sub-components,
-            // the VM expects 'main' to be the first sub-component.
-            await forEachPackage(results,
-                (String package, List<Library> libraries) async {
-              _writePackage(results, package, libraries, sink);
-            }, mainFirst: true);
-          } else {
-            _writePackage(results, 'main', component.libraries, sink);
-          }
-        });
-        await sink.close();
-      }
+    sortComponent(component);
 
-      {
-        // Generate AST as a cache. This goes to [_initializeFromDill] instead
-        // of [filename] so that a later invocation of frontend_server will the
-        // same arguments will use this to initialize its incremental kernel
-        // compiler.
-        final repository = BinaryCacheMetadataRepository();
-        component.addMetadataRepository(repository);
-        for (var lib in component.libraries) {
-          var bytes = BinaryCacheMetadataRepository.lookup(lib);
-          if (bytes != null) {
-            repository.mapping[lib] = bytes;
-          }
-        }
-
-        final file = new File(_initializeFromDill);
-        await file.create(recursive: true);
-        final IOSink sink = file.openWrite();
-        final Set<Library> loadedLibraries = results.loadedLibraries;
-        final BinaryPrinter printer = filterExternal
-            ? BinaryPrinter(sink,
-                libraryFilter: (lib) => !loadedLibraries.contains(lib),
-                includeSources: false)
-            : printerFactory.newBinaryPrinter(sink);
-
-        sortComponent(component);
-
-        printer.writeComponentFile(component);
-        await sink.close();
-      }
-    } else {
-      // Generate AST as the output proper.
-      final IOSink sink = File(filename).openWrite();
-      final Set<Library> loadedLibraries = results.loadedLibraries;
-      final BinaryPrinter printer = filterExternal
-          ? BinaryPrinter(sink,
-              libraryFilter: (lib) => !loadedLibraries.contains(lib),
-              includeSources: false)
-          : printerFactory.newBinaryPrinter(sink);
-
-      sortComponent(component);
-
-      if (incrementalSerializer != null) {
-        incrementalSerializer.writePackagesToSinkAndTrimComponent(
-            component, sink);
-      } else if (unsafePackageSerialization == true) {
-        writePackagesToSinkAndTrimComponent(component, sink);
-      }
-
-      printer.writeComponentFile(component);
-      await sink.close();
+    if (incrementalSerializer != null) {
+      incrementalSerializer.writePackagesToSinkAndTrimComponent(
+          component, sink);
+    } else if (unsafePackageSerialization == true) {
+      writePackagesToSinkAndTrimComponent(component, sink);
     }
 
+    printer.writeComponentFile(component);
+    await sink.close();
+
     if (_options['split-output-by-packages']) {
       await writeOutputSplitByPackages(
-          _mainSource, _compilerOptions, results, filename,
-          genBytecode: _compilerOptions.bytecode,
-          bytecodeOptions: _bytecodeOptions,
-          dropAST: _options['drop-ast']);
+          _mainSource, _compilerOptions, results, filename);
     }
 
     final String manifestFilename = _options['far-manifest'];
@@ -838,54 +737,6 @@
     }
   }
 
-  void _writePackage(KernelCompilationResults result, String package,
-      List<Library> libraries, IOSink sink) {
-    final canCache = libraries.isNotEmpty &&
-        _compilerOptions.bytecode &&
-        errors.isEmpty &&
-        package != "main";
-
-    if (canCache) {
-      var cachedBytes = BinaryCacheMetadataRepository.lookup(libraries.first);
-      if (cachedBytes != null) {
-        sink.add(cachedBytes);
-        return;
-      }
-    }
-
-    Component partComponent = result.component;
-    if (_compilerOptions.bytecode && errors.isEmpty) {
-      final List<Library> librariesFiltered = new List<Library>();
-      final Set<Library> loadedLibraries = result.loadedLibraries;
-      for (Library library in libraries) {
-        if (loadedLibraries.contains(library)) continue;
-        librariesFiltered.add(library);
-      }
-
-      generateBytecode(partComponent,
-          options: _bytecodeOptions,
-          libraries: librariesFiltered,
-          coreTypes: _generator?.getCoreTypes(),
-          hierarchy: _generator?.getClassHierarchy());
-
-      if (_options['drop-ast']) {
-        partComponent = createFreshComponentWithBytecode(partComponent);
-      }
-    }
-
-    final byteSink = ByteSink();
-    final BinaryPrinter printer = BinaryPrinter(byteSink,
-        libraryFilter: (lib) =>
-            packageFor(lib, result.loadedLibraries) == package);
-    printer.writeComponentFile(partComponent);
-
-    final bytes = byteSink.builder.takeBytes();
-    sink.add(bytes);
-    if (canCache) {
-      BinaryCacheMetadataRepository.insert(libraries.first, bytes);
-    }
-  }
-
   @override
   Future<Null> recompileDelta({String entryPoint}) async {
     final String boundaryKey = Uuid().generateV4();
@@ -938,7 +789,6 @@
         expression, definitions, typeDefinitions, libraryUri, klass, isStatic);
     if (procedure != null) {
       Component component = createExpressionEvaluationComponent(procedure);
-      component = await _generateBytecodeIfNeeded(component);
       final IOSink sink = File(_kernelBinaryFilename).openWrite();
       sink.add(serializeComponent(component));
       await sink.close();
@@ -1083,6 +933,7 @@
           libraries: libraries,
           uriToSource: deltaProgram.uriToSource,
           nameRoot: deltaProgram.root);
+      singleLibrary.setMainMethodAndMode(null, false, deltaProgram.mode);
       ByteSink byteSink = ByteSink();
       final BinaryPrinter printer = printerFactory.newBinaryPrinter(byteSink);
       printer.writeComponentFile(singleLibrary);
diff --git a/pkg/frontend_server/test/frontend_server_flutter_suite.dart b/pkg/frontend_server/test/frontend_server_flutter_suite.dart
index e3e078a..8028d59 100644
--- a/pkg/frontend_server/test/frontend_server_flutter_suite.dart
+++ b/pkg/frontend_server/test/frontend_server_flutter_suite.dart
@@ -201,7 +201,7 @@
     options.flutterDir,
     options.flutterPlatformDir,
   );
-  Future future = Future<bool>(() async {
+  Future<bool> future = Future<bool>(() async {
     Stopwatch stopwatch = Stopwatch()..start();
     print("Running suite");
     Isolate isolate = await Isolate.spawn<SuiteConfiguration>(
@@ -209,6 +209,7 @@
         onExit: exitPort.sendPort, onError: errorPort.sendPort);
     bool gotError = false;
     StreamSubscription errorSubscription = errorPort.listen((message) {
+      print("Got error: $message!");
       gotError = true;
       logs.add("$message");
     });
diff --git a/pkg/frontend_server/test/frontend_server_test.dart b/pkg/frontend_server/test/frontend_server_test.dart
index 3bbdeb0..9715fb6 100644
--- a/pkg/frontend_server/test/frontend_server_test.dart
+++ b/pkg/frontend_server/test/frontend_server_test.dart
@@ -481,6 +481,8 @@
     final platformKernel =
         computePlatformBinariesLocation().resolve('vm_platform_strong.dill');
     final ddcPlatformKernel =
+        computePlatformBinariesLocation().resolve('ddc_outline_sound.dill');
+    final ddcPlatformKernelWeak =
         computePlatformBinariesLocation().resolve('ddc_sdk.dill');
     final sdkRoot = computePlatformBinariesLocation();
 
@@ -496,14 +498,32 @@
 
     test('compile expression', () async {
       var file = File('${tempDir.path}/foo.dart')..createSync();
-      file.writeAsStringSync("main() {}\n");
+      file.writeAsStringSync("main() {\n}\n");
       var dillFile = File('${tempDir.path}/app.dill');
+
+      var package_config =
+          File('${tempDir.path}/.dart_tool/package_config.json')
+            ..createSync(recursive: true)
+            ..writeAsStringSync('''
+  {
+    "configVersion": 2,
+    "packages": [
+      {
+        "name": "hello",
+        "rootUri": "../",
+        "packageUri": "./"
+      }
+    ]
+  }
+  ''');
+
       expect(dillFile.existsSync(), equals(false));
       final List<String> args = <String>[
         '--sdk-root=${sdkRoot.toFilePath()}',
         '--incremental',
         '--platform=${platformKernel.path}',
-        '--output-dill=${dillFile.path}'
+        '--output-dill=${dillFile.path}',
+        '--packages=${package_config.path}',
       ];
 
       final StreamController<List<int>> streamController =
@@ -1003,8 +1023,7 @@
     {
       "name": "flutter",
       "rootUri": "${frameworkDirectory.uri}",
-      "packageUri": "lib/",
-      "languageVersion": "2.2"
+      "packageUri": "lib/"
     }
   ]
 }
@@ -1188,9 +1207,6 @@
       file.writeAsStringSync("pkgA() {}");
 
       // Package B.
-      file = File('${tempDir.path}/pkgB/.packages')
-        ..createSync(recursive: true);
-      file.writeAsStringSync("pkgA: ../pkgA");
       file = File('${tempDir.path}/pkgB/a.dart')..createSync(recursive: true);
       file.writeAsStringSync("pkgB_a() {}");
       file = File('${tempDir.path}/pkgB/b.dart')..createSync(recursive: true);
@@ -1198,10 +1214,25 @@
           "pkgB_b() { pkgA(); }");
 
       // Application.
-      file = File('${tempDir.path}/app/.packages')..createSync(recursive: true);
-      file.writeAsStringSync("pkgA:../pkgA\n"
-          "pkgB:../pkgB");
-
+      File('${tempDir.path}/app/.dart_tool/package_config.json')
+        ..createSync(recursive: true)
+        ..writeAsStringSync('''
+  {
+    "configVersion": 2,
+    "packages": [
+      {
+        "name": "pkgA",
+        "rootUri": "${tempDir.uri.resolve('pkgA')}",
+        "packageUri": "./"
+      },
+      {
+        "name": "pkgB",
+        "rootUri": "${tempDir.uri.resolve('pkgB')}",
+        "packageUri": "./"
+      }
+    ]
+  }
+''');
       // Entry point A uses both package A and B.
       file = File('${tempDir.path}/app/a.dart')..createSync(recursive: true);
       file.writeAsStringSync("import 'package:pkgB/b.dart';"
@@ -1295,9 +1326,6 @@
       file.writeAsStringSync("pkgA() {}");
 
       // Package B.
-      file = File('${tempDir.path}/pkgB/.packages')
-        ..createSync(recursive: true);
-      file.writeAsStringSync("pkgA: ../pkgA");
       file = File('${tempDir.path}/pkgB/a.dart')..createSync(recursive: true);
       file.writeAsStringSync("pkgB_a() {}");
       file = File('${tempDir.path}/pkgB/b.dart')..createSync(recursive: true);
@@ -1305,6 +1333,25 @@
           "pkgB_b() { pkgA(); }");
 
       // Application.
+      File('${tempDir.path}/app/.dart_tool/package_config.json')
+        ..createSync(recursive: true)
+        ..writeAsStringSync('''
+  {
+    "configVersion": 2,
+    "packages": [
+      {
+        "name": "pkgA",
+        "rootUri": "${tempDir.uri.resolve('pkgA')}",
+        "packageUri": "./"
+      },
+      {
+        "name": "pkgB",
+        "rootUri": "${tempDir.uri.resolve('pkgB')}",
+        "packageUri": "./"
+      }
+    ]
+  }
+''');
       file = File('${tempDir.path}/app/.packages')..createSync(recursive: true);
       file.writeAsStringSync("pkgA:../pkgA\n"
           "pkgB:../pkgB");
@@ -1628,9 +1675,20 @@
         var main = File('${tempDir.path}/foo.dart')..createSync();
         main.writeAsStringSync(
             "import 'package:foo/foo.dart'; main() {print(foo);}\n");
-        File('${tempDir.path}/.packages')
-          ..createSync()
-          ..writeAsStringSync("\nfoo:http://$host:$port/packages/foo");
+        File('${tempDir.path}/.dart_tool/package_config.json')
+          ..createSync(recursive: true)
+          ..writeAsStringSync('''
+  {
+    "configVersion": 2,
+    "packages": [
+      {
+        "name": "foo",
+        "rootUri": "http://$host:$port/packages/foo",
+        "packageUri": "./"
+      }
+    ]
+  }
+''');
         File('${tempDir.path}/packages/foo/foo.dart')
           ..createSync(recursive: true)
           ..writeAsStringSync("var foo = 'hello';");
@@ -1676,10 +1734,22 @@
 
     test('compile to JavaScript', () async {
       var file = File('${tempDir.path}/foo.dart')..createSync();
-      file.writeAsStringSync("main() {}\n");
-      var packages = File('${tempDir.path}/.packages')
-        ..createSync()
-        ..writeAsStringSync("\n");
+      file.writeAsStringSync("main() {\n}\n");
+      var package_config =
+          File('${tempDir.path}/.dart_tool/package_config.json')
+            ..createSync(recursive: true)
+            ..writeAsStringSync('''
+  {
+    "configVersion": 2,
+    "packages": [
+      {
+        "name": "hello",
+        "rootUri": "../",
+        "packageUri": "./"
+      }
+    ]
+  }
+  ''');
       var dillFile = File('${tempDir.path}/app.dill');
 
       expect(dillFile.existsSync(), false);
@@ -1689,8 +1759,9 @@
         '--incremental',
         '--platform=${ddcPlatformKernel.path}',
         '--output-dill=${dillFile.path}',
-        '--packages=${packages.path}',
+        '--packages=${package_config.path}',
         '--target=dartdevc',
+        '--enable-experiment=non-nullable',
         file.path,
       ];
 
@@ -1699,8 +1770,8 @@
 
     test('compile to JavaScript with package scheme', () async {
       var file = File('${tempDir.path}/foo.dart')..createSync();
-      file.writeAsStringSync("main() {}\n");
-      File('${tempDir.path}/.packages')
+      file.writeAsStringSync("main() {\n}\n");
+      var packages = File('${tempDir.path}/.packages')
         ..createSync()
         ..writeAsStringSync("hello:${tempDir.uri}\n");
       var dillFile = File('${tempDir.path}/app.dill');
@@ -1710,22 +1781,118 @@
       final List<String> args = <String>[
         '--sdk-root=${sdkRoot.toFilePath()}',
         '--incremental',
-        '--platform=${ddcPlatformKernel.path}',
+        '--platform=${ddcPlatformKernelWeak.path}',
         '--output-dill=${dillFile.path}',
         '--target=dartdevc',
-        '--packages=${tempDir.path}/.packages',
+        '--packages=${packages.path}',
         'package:hello/foo.dart'
       ];
 
       expect(await starter(args), 0);
-    });
+    }, skip: 'https://github.com/dart-lang/sdk/issues/43959');
+
+    test('compile to JavaScript weak null safety', () async {
+      var file = File('${tempDir.path}/foo.dart')..createSync();
+      file.writeAsStringSync("// @dart = 2.9\nmain() {\n}\n");
+      var packages = File('${tempDir.path}/.packages')
+        ..createSync()
+        ..writeAsStringSync("hello:${tempDir.uri}\n");
+      var dillFile = File('${tempDir.path}/app.dill');
+
+      expect(dillFile.existsSync(), false);
+
+      final List<String> args = <String>[
+        '--sdk-root=${sdkRoot.toFilePath()}',
+        '--incremental',
+        '--platform=${ddcPlatformKernelWeak.path}',
+        '--output-dill=${dillFile.path}',
+        '--target=dartdevc',
+        '--packages=${packages.path}',
+        'package:hello/foo.dart'
+      ];
+
+      expect(await starter(args), 0);
+    }, skip: 'https://github.com/dart-lang/sdk/issues/43959');
+
+    test('compile to JavaScript weak null safety then non-existent file',
+        () async {
+      var file = File('${tempDir.path}/foo.dart')..createSync();
+      file.writeAsStringSync("// @dart = 2.9\nmain() {\n}\n");
+      var packages = File('${tempDir.path}/.packages')
+        ..createSync()
+        ..writeAsStringSync("hello:${tempDir.uri}\n");
+      var dillFile = File('${tempDir.path}/app.dill');
+
+      expect(dillFile.existsSync(), false);
+
+      var library = 'package:hello/foo.dart';
+
+      final List<String> args = <String>[
+        '--sdk-root=${sdkRoot.toFilePath()}',
+        '--incremental',
+        '--platform=${ddcPlatformKernelWeak.path}',
+        '--output-dill=${dillFile.path}',
+        '--target=dartdevc',
+        '--packages=${packages.path}',
+      ];
+
+      final StreamController<List<int>> streamController =
+          StreamController<List<int>>();
+      final StreamController<List<int>> stdoutStreamController =
+          StreamController<List<int>>();
+      final IOSink ioSink = IOSink(stdoutStreamController.sink);
+      StreamController<Result> receivedResults = StreamController<Result>();
+      final outputParser = OutputParser(receivedResults);
+      stdoutStreamController.stream
+          .transform(utf8.decoder)
+          .transform(const LineSplitter())
+          .listen(outputParser.listener);
+
+      Future<int> result =
+          starter(args, input: streamController.stream, output: ioSink);
+      streamController.add('compile $library\n'.codeUnits);
+      var count = 0;
+      receivedResults.stream.listen((Result compiledResult) {
+        CompilationResult result =
+            CompilationResult.parse(compiledResult.status);
+        count++;
+        if (count == 1) {
+          // First request is to 'compile', which results in full JavaScript
+          expect(result.errorsCount, equals(0));
+          expect(result.filename, dillFile.path);
+          streamController.add('accept\n'.codeUnits);
+          streamController.add('compile foo.bar\n'.codeUnits);
+        } else {
+          expect(count, 2);
+          // Second request is to 'compile' non-existent file, that should fail.
+          expect(result.errorsCount, greaterThan(0));
+          streamController.add('quit\n'.codeUnits);
+        }
+      });
+
+      expect(await result, 0);
+      expect(count, 2);
+    }, skip: 'https://github.com/dart-lang/sdk/issues/43959');
 
     test('compile to JavaScript with no metadata', () async {
       var file = File('${tempDir.path}/foo.dart')..createSync();
       file.writeAsStringSync("main() {\n\n}\n");
-      File('${tempDir.path}/.packages')
-        ..createSync()
-        ..writeAsStringSync("hello:${tempDir.uri}\n");
+
+      var package_config =
+          File('${tempDir.path}/.dart_tool/package_config.json')
+            ..createSync(recursive: true)
+            ..writeAsStringSync('''
+  {
+    "configVersion": 2,
+    "packages": [
+      {
+        "name": "hello",
+        "rootUri": "../",
+        "packageUri": "./"
+      }
+    ]
+  }
+  ''');
 
       var library = 'package:hello/foo.dart';
 
@@ -1747,7 +1914,8 @@
         '--platform=${ddcPlatformKernel.path}',
         '--output-dill=${dillFile.path}',
         '--target=dartdevc',
-        '--packages=${tempDir.path}/.packages',
+        '--packages=${package_config.path}',
+        '--enable-experiment=non-nullable',
       ];
 
       final StreamController<List<int>> streamController =
@@ -1789,9 +1957,21 @@
     test('compile to JavaScript with metadata', () async {
       var file = File('${tempDir.path}/foo.dart')..createSync();
       file.writeAsStringSync("main() {\n\n}\n");
-      File('${tempDir.path}/.packages')
-        ..createSync()
-        ..writeAsStringSync("hello:${tempDir.uri}\n");
+      var package_config =
+          File('${tempDir.path}/.dart_tool/package_config.json')
+            ..createSync(recursive: true)
+            ..writeAsStringSync('''
+  {
+    "configVersion": 2,
+    "packages": [
+      {
+        "name": "hello",
+        "rootUri": "../",
+        "packageUri": "./"
+      }
+    ]
+  }
+  ''');
 
       var library = 'package:hello/foo.dart';
 
@@ -1813,8 +1993,9 @@
         '--platform=${ddcPlatformKernel.path}',
         '--output-dill=${dillFile.path}',
         '--target=dartdevc',
-        '--packages=${tempDir.path}/.packages',
-        '--experimental-emit-debug-metadata'
+        '--packages=${package_config.path}',
+        '--experimental-emit-debug-metadata',
+        '--enable-experiment=non-nullable',
       ];
 
       final StreamController<List<int>> streamController =
@@ -1855,10 +2036,22 @@
 
     test('compile expression to Javascript', () async {
       var file = File('${tempDir.path}/foo.dart')..createSync();
-      file.writeAsStringSync("main() {\n\n}\n");
-      File('${tempDir.path}/.packages')
-        ..createSync()
-        ..writeAsStringSync("hello:${tempDir.uri}\n");
+      file.writeAsStringSync("main() {\n}\n");
+      var package_config =
+          File('${tempDir.path}/.dart_tool/package_config.json')
+            ..createSync(recursive: true)
+            ..writeAsStringSync('''
+  {
+    "configVersion": 2,
+    "packages": [
+      {
+        "name": "hello",
+        "rootUri": "../",
+        "packageUri": "./"
+      }
+    ]
+  }
+  ''');
 
       var library = 'package:hello/foo.dart';
       var module = 'packages/hello/foo.dart';
@@ -1876,7 +2069,8 @@
         '--platform=${ddcPlatformKernel.path}',
         '--output-dill=${dillFile.path}',
         '--target=dartdevc',
-        '--packages=${tempDir.path}/.packages',
+        '--packages=${package_config.path}',
+        '--enable-experiment=non-nullable',
       ];
 
       final StreamController<List<int>> streamController =
@@ -1921,7 +2115,7 @@
           // expression
           outputParser.expectSources = false;
           streamController.add('compile-expression-to-js abc\n'
-                  '$library\n1\n1\nabc\nabc\n$module\n\n'
+                  '$library\n2\n1\nabc\nabc\n$module\n\n'
               .codeUnits);
           count += 1;
         } else if (count == 1) {
@@ -1934,7 +2128,7 @@
 
           outputParser.expectSources = false;
           streamController.add('compile-expression-to-js abc\n'
-                  '$library\n1\n1\nabc\nabc\n$module\n2+2\n'
+                  '$library\n2\n1\nabc\nabc\n$module\n2+2\n'
               .codeUnits);
           count += 1;
         } else if (count == 2) {
@@ -1963,10 +2157,21 @@
     test('mixed compile expression commands with web target', () async {
       var file = File('${tempDir.path}/foo.dart')..createSync();
       file.writeAsStringSync("main() {\n\n}\n");
-      File('${tempDir.path}/.packages')
-        ..createSync()
-        ..writeAsStringSync("hello:${tempDir.uri}\n");
-
+      var package_config =
+          File('${tempDir.path}/.dart_tool/package_config.json')
+            ..createSync(recursive: true)
+            ..writeAsStringSync('''
+  {
+    "configVersion": 2,
+    "packages": [
+      {
+        "name": "hello",
+        "rootUri": "../",
+        "packageUri": "./"
+      }
+    ]
+  }
+  ''');
       var library = 'package:hello/foo.dart';
       var module = 'packages/hello/foo.dart';
 
@@ -1983,7 +2188,8 @@
         '--platform=${ddcPlatformKernel.path}',
         '--output-dill=${dillFile.path}',
         '--target=dartdevc',
-        '--packages=${tempDir.path}/.packages',
+        '--packages=${package_config.path}',
+        '--enable-experiment=non-nullable'
       ];
 
       final StreamController<List<int>> streamController =
@@ -2028,7 +2234,7 @@
           // expression
           outputParser.expectSources = false;
           streamController.add('compile-expression-to-js abc\n'
-                  '$library\n1\n1\nabc\nabc\n$module\n2+2\n'
+                  '$library\n2\n1\nabc\nabc\n$module\n2+2\n'
               .codeUnits);
           count += 1;
         } else if (count == 1) {
@@ -2065,7 +2271,7 @@
 
           outputParser.expectSources = false;
           streamController.add('compile-expression-to-js abc\n'
-                  '$library\n1\n1\nabc\nabc\n$module\n2+2\n'
+                  '$library\n2\n1\nabc\nabc\n$module\n2+2\n'
               .codeUnits);
           count += 1;
         } else if (count == 3) {
@@ -2084,52 +2290,6 @@
       expect(count, 3);
     });
 
-    test('compile with bytecode', () async {
-      var file = File('${tempDir.path}/foo.dart')..createSync();
-      file.writeAsStringSync("main() {}\n");
-      var dillFile = File('${tempDir.path}/app.dill');
-      expect(dillFile.existsSync(), equals(false));
-      final List<String> args = <String>[
-        '--sdk-root=${sdkRoot.toFilePath()}',
-        '--incremental',
-        '--platform=${platformKernel.path}',
-        '--output-dill=${dillFile.path}',
-        '--gen-bytecode',
-        '--drop-ast',
-        file.path,
-      ];
-      expect(await starter(args), 0);
-    });
-
-    test('compile with bytecode and produce deps file', () async {
-      var sourceFoo = File('${tempDir.path}/foo.dart')..createSync();
-      sourceFoo.writeAsStringSync("import 'bar.dart'; main() { barfunc(); }\n");
-      var sourceBar = File('${tempDir.path}/bar.dart')..createSync();
-      sourceBar.writeAsStringSync("barfunc() {}\n");
-      var dillFile = File('${tempDir.path}/app.dill');
-      expect(dillFile.existsSync(), equals(false));
-      var depFile = File('${tempDir.path}/app.dill.d');
-      expect(depFile.existsSync(), equals(false));
-      final List<String> args = <String>[
-        '--sdk-root=${sdkRoot.toFilePath()}',
-        '--incremental',
-        '--platform=${platformKernel.path}',
-        '--output-dill=${dillFile.path}',
-        '--depfile=${depFile.path}',
-        '--gen-bytecode',
-        '--drop-ast',
-        sourceFoo.path,
-      ];
-      expect(await starter(args), 0);
-      expect(depFile.existsSync(), true);
-      var depContents = depFile.readAsStringSync();
-      print(depContents);
-      var depContentsParsed = depContents.split(': ');
-      expect(path.basename(depContentsParsed[0]), path.basename(dillFile.path));
-      expect(depContentsParsed[1], contains(path.basename(sourceFoo.path)));
-      expect(depContentsParsed[1], contains(path.basename(sourceBar.path)));
-    });
-
     test('compile "package:"-file', () async {
       Directory lib = Directory('${tempDir.path}/lib')..createSync();
       File('${lib.path}/foo.dart')
diff --git a/pkg/js/CHANGELOG.md b/pkg/js/CHANGELOG.md
index 3728fa9..17e9aa3 100644
--- a/pkg/js/CHANGELOG.md
+++ b/pkg/js/CHANGELOG.md
@@ -1,3 +1,12 @@
+## 0.6.3-nullsafety.3
+
+* Update SDK constraints to `>=2.12.0-0 <3.0.0` based on beta release
+  guidelines.
+
+## 0.6.3-nullsafety.2
+
+* Allow prerelease versions of the `2.12` sdk.
+
 ## 0.6.3-nullsafety.1
 
 * Allow 2.10 stable and 2.11.0 dev SDK versions.
diff --git a/pkg/js/pubspec.yaml b/pkg/js/pubspec.yaml
index b9d05c4..90d0352 100644
--- a/pkg/js/pubspec.yaml
+++ b/pkg/js/pubspec.yaml
@@ -1,10 +1,10 @@
 name: js
-version: 0.6.3-nullsafety.1
+version: 0.6.3-nullsafety.3
 description: Annotations to create static Dart interfaces for JavaScript APIs.
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/js
 
 environment:
-  sdk: '>=2.10.0-0 <2.11.0'
+  sdk: ">=2.12.0-0 <3.0.0"
 
 dev_dependencies:
   pedantic: ^1.9.0
diff --git a/pkg/kernel/binary.md b/pkg/kernel/binary.md
index aade49b..cafad21 100644
--- a/pkg/kernel/binary.md
+++ b/pkg/kernel/binary.md
@@ -143,7 +143,7 @@
 
 type ComponentFile {
   UInt32 magic = 0x90ABCDEF;
-  UInt32 formatVersion = 46;
+  UInt32 formatVersion = 50;
   Byte[10] shortSdkHash;
   List<String> problemsAsJson; // Described in problems.md.
   Library[] libraries;
@@ -230,8 +230,7 @@
 }
 
 type Library {
-  Byte flags (_unused_, isSynthetic, isNonNullableByDefault,
-              nnbdModeBit1, nnbdModeBit2);
+  Byte flags (isSynthetic, isNonNullableByDefault, nnbdModeBit1, nnbdModeBit2);
   UInt languageVersionMajor;
   UInt languageVersionMinor;
   CanonicalNameReference canonicalName;
@@ -301,16 +300,6 @@
   Byte tag;
 }
 
-enum ClassLevel { Type = 0, Hierarchy = 1, Mixin = 2, Body = 3, }
-
-// A class can be represented at one of three levels: type, hierarchy, or body.
-//
-// If the enclosing library is external, a class is either at type or
-// hierarchy level, depending on its isTypeLevel flag.
-// If the enclosing library is not external, a class is always at body level.
-//
-// See ClassLevel in ast.dart for the details of each loading level.
-
 type Class extends Node {
   Byte tag = 2;
   CanonicalNameReference canonicalName;
@@ -319,9 +308,8 @@
   FileOffset startFileOffset; // Offset of the start of the class including any annotations.
   FileOffset fileOffset; // Offset of the name of the class.
   FileOffset fileEndOffset;
-  Byte flags (levelBit0, levelBit1, isAbstract, isEnum, isAnonymousMixin,
-              isEliminatedMixin, isMixinDeclaration,
-              hasConstConstructor); // Where level is index into ClassLevel
+  Byte flags (isAbstract, isEnum, isAnonymousMixin, isEliminatedMixin,
+              isMixinDeclaration, hasConstConstructor);
   StringReference name;
   List<Expression> annotations;
   List<TypeParameter> typeParameters;
@@ -365,7 +353,8 @@
 
 type Field extends Member {
   Byte tag = 4;
-  CanonicalNameReference canonicalName;
+  CanonicalNameReference canonicalNameGetter;
+  CanonicalNameReference canonicalNameSetter;
   // An absolute path URI to the .dart file from which the field was created.
   UriReference fileUri;
   FileOffset fileOffset;
@@ -642,6 +631,7 @@
 
 type MethodInvocation extends Expression {
   Byte tag = 28;
+  Byte flags;
   FileOffset fileOffset;
   Expression receiver;
   Name name;
@@ -1034,6 +1024,8 @@
 
 type Block extends Statement {
   Byte tag = 62;
+  FileOffset fileOffset;
+  FileOffset fileEndOffset;
   List<Statement> statements;
 }
 
diff --git a/pkg/kernel/lib/ast.dart b/pkg/kernel/lib/ast.dart
index e9b6940..ce1824e 100644
--- a/pkg/kernel/lib/ast.dart
+++ b/pkg/kernel/lib/ast.dart
@@ -210,7 +210,12 @@
 
   NamedNode(Reference reference)
       : this.reference = reference ?? new Reference() {
-    this.reference.node = this;
+    if (this is Field) {
+      Field me = this;
+      me.getterReference.node = this;
+    } else {
+      this.reference.node = this;
+    }
   }
 
   CanonicalName get canonicalName => reference?.canonicalName;
@@ -342,7 +347,7 @@
 //                      LIBRARIES and CLASSES
 // ------------------------------------------------------------------------
 
-enum NonNullableByDefaultCompiledMode { Disabled, Weak, Strong, Agnostic }
+enum NonNullableByDefaultCompiledMode { Weak, Strong, Agnostic, Invalid }
 
 class Library extends NamedNode
     implements Annotatable, Comparable<Library>, FileUriNode {
@@ -366,10 +371,10 @@
     _languageVersion = languageVersion;
   }
 
-  static const int SyntheticFlag = 1 << 1;
-  static const int NonNullableByDefaultFlag = 1 << 2;
-  static const int NonNullableByDefaultModeBit1Weak = 1 << 3;
-  static const int NonNullableByDefaultModeBit2Strong = 1 << 4;
+  static const int SyntheticFlag = 1 << 0;
+  static const int NonNullableByDefaultFlag = 1 << 1;
+  static const int NonNullableByDefaultModeBit1 = 1 << 2;
+  static const int NonNullableByDefaultModeBit2 = 1 << 3;
 
   int flags = 0;
 
@@ -388,33 +393,33 @@
   }
 
   NonNullableByDefaultCompiledMode get nonNullableByDefaultCompiledMode {
-    bool weak = (flags & NonNullableByDefaultModeBit1Weak) != 0;
-    bool strong = (flags & NonNullableByDefaultModeBit2Strong) != 0;
-
-    if (weak && strong) return NonNullableByDefaultCompiledMode.Agnostic;
-    if (strong) return NonNullableByDefaultCompiledMode.Strong;
-    if (weak) return NonNullableByDefaultCompiledMode.Weak;
-    return NonNullableByDefaultCompiledMode.Disabled;
+    bool bit1 = (flags & NonNullableByDefaultModeBit1) != 0;
+    bool bit2 = (flags & NonNullableByDefaultModeBit2) != 0;
+    if (!bit1 && !bit2) return NonNullableByDefaultCompiledMode.Weak;
+    if (bit1 && !bit2) return NonNullableByDefaultCompiledMode.Strong;
+    if (bit1 && bit2) return NonNullableByDefaultCompiledMode.Agnostic;
+    if (!bit1 && bit2) return NonNullableByDefaultCompiledMode.Invalid;
+    throw new StateError("Unused bit-pattern for compilation mode");
   }
 
   void set nonNullableByDefaultCompiledMode(
       NonNullableByDefaultCompiledMode mode) {
     switch (mode) {
-      case NonNullableByDefaultCompiledMode.Disabled:
-        flags = (flags & ~NonNullableByDefaultModeBit1Weak) &
-            ~NonNullableByDefaultModeBit2Strong;
-        break;
       case NonNullableByDefaultCompiledMode.Weak:
-        flags = (flags | NonNullableByDefaultModeBit1Weak) &
-            ~NonNullableByDefaultModeBit2Strong;
+        flags = (flags & ~NonNullableByDefaultModeBit1) &
+            ~NonNullableByDefaultModeBit2;
         break;
       case NonNullableByDefaultCompiledMode.Strong:
-        flags = (flags & ~NonNullableByDefaultModeBit1Weak) |
-            NonNullableByDefaultModeBit2Strong;
+        flags = (flags | NonNullableByDefaultModeBit1) &
+            ~NonNullableByDefaultModeBit2;
         break;
       case NonNullableByDefaultCompiledMode.Agnostic:
-        flags = (flags | NonNullableByDefaultModeBit1Weak) |
-            NonNullableByDefaultModeBit2Strong;
+        flags = (flags | NonNullableByDefaultModeBit1) |
+            NonNullableByDefaultModeBit2;
+        break;
+      case NonNullableByDefaultCompiledMode.Invalid:
+        flags = (flags & ~NonNullableByDefaultModeBit1) |
+            NonNullableByDefaultModeBit2;
         break;
     }
   }
@@ -499,17 +504,6 @@
   Iterable<Member> get members =>
       <Iterable<Member>>[fields, procedures].expand((x) => x);
 
-  void addMember(Member member) {
-    member.parent = this;
-    if (member is Procedure) {
-      procedures.add(member);
-    } else if (member is Field) {
-      fields.add(member);
-    } else {
-      throw new ArgumentError(member);
-    }
-  }
-
   void addAnnotation(Expression node) {
     node.parent = this;
     annotations.add(node);
@@ -548,11 +542,14 @@
     }
     for (int i = 0; i < fields.length; ++i) {
       Field field = fields[i];
-      canonicalName.getChildFromMember(field).bindTo(field.reference);
+      canonicalName.getChildFromField(field).bindTo(field.getterReference);
+      canonicalName
+          .getChildFromFieldSetter(field)
+          .bindTo(field.setterReference);
     }
     for (int i = 0; i < procedures.length; ++i) {
       Procedure member = procedures[i];
-      canonicalName.getChildFromMember(member).bindTo(member.reference);
+      canonicalName.getChildFromProcedure(member).bindTo(member.reference);
     }
     for (int i = 0; i < classes.length; ++i) {
       Class class_ = classes[i];
@@ -887,53 +884,6 @@
   }
 }
 
-/// The degree to which the contents of a class have been loaded into memory.
-///
-/// Each level imply the requirements of the previous ones.
-enum ClassLevel {
-  /// Temporary loading level for internal use by IR producers.  Consumers of
-  /// kernel code should not expect to see classes at this level.
-  Temporary,
-
-  /// The class may be used as a type, and it may contain members that are
-  /// referenced from this build unit.
-  ///
-  /// The type parameters and their bounds are present.
-  ///
-  /// There is no guarantee that all members are present.
-  ///
-  /// All supertypes of this class are at [Type] level or higher.
-  Type,
-
-  /// All instance members of the class are present.
-  ///
-  /// All supertypes of this class are at [Hierarchy] level or higher.
-  ///
-  /// This level exists so supertypes of a fully loaded class contain all the
-  /// members needed to detect override constraints.
-  Hierarchy,
-
-  /// All instance members of the class have their body loaded, and their
-  /// annotations are present.
-  ///
-  /// All supertypes of this class are at [Hierarchy] level or higher.
-  ///
-  /// If this class is a mixin application, then its mixin is loaded at [Mixin]
-  /// level or higher.
-  ///
-  /// This level exists so the contents of a mixin can be cloned into a
-  /// mixin application.
-  Mixin,
-
-  /// All members of the class are fully loaded and are in the correct order.
-  ///
-  /// Annotations are present on classes and members.
-  ///
-  /// All supertypes of this class are at [Hierarchy] level or higher,
-  /// not necessarily at [Body] level.
-  Body,
-}
-
 /// List-wrapper that marks the parent-class as dirty if the list is modified.
 ///
 /// The idea being, that for non-dirty classes (classes just loaded from dill)
@@ -990,9 +940,6 @@
   /// (this is the default if none is specifically set).
   int fileEndOffset = TreeNode.noOffset;
 
-  /// The degree to which the contents of the class have been loaded.
-  ClassLevel level = ClassLevel.Body;
-
   /// List of metadata annotations on the class.
   ///
   /// This defaults to an immutable empty list. Use [addAnnotation] to add
@@ -1009,13 +956,12 @@
   String name;
 
   // Must match serialized bit positions.
-  static const int LevelMask = 0x3; // Bits 0 and 1.
-  static const int FlagAbstract = 1 << 2;
-  static const int FlagEnum = 1 << 3;
-  static const int FlagAnonymousMixin = 1 << 4;
-  static const int FlagEliminatedMixin = 1 << 5;
-  static const int FlagMixinDeclaration = 1 << 6;
-  static const int FlagHasConstConstructor = 1 << 7;
+  static const int FlagAbstract = 1 << 0;
+  static const int FlagEnum = 1 << 1;
+  static const int FlagAnonymousMixin = 1 << 2;
+  static const int FlagEliminatedMixin = 1 << 3;
+  static const int FlagMixinDeclaration = 1 << 4;
+  static const int FlagHasConstConstructor = 1 << 5;
 
   int flags = 0;
 
@@ -1243,19 +1189,24 @@
     if (!dirty) return;
     for (int i = 0; i < fields.length; ++i) {
       Field member = fields[i];
-      canonicalName.getChildFromMember(member).bindTo(member.reference);
+      canonicalName.getChildFromField(member).bindTo(member.getterReference);
+      canonicalName
+          .getChildFromFieldSetter(member)
+          .bindTo(member.setterReference);
     }
     for (int i = 0; i < procedures.length; ++i) {
       Procedure member = procedures[i];
-      canonicalName.getChildFromMember(member).bindTo(member.reference);
+      canonicalName.getChildFromProcedure(member).bindTo(member.reference);
     }
     for (int i = 0; i < constructors.length; ++i) {
       Constructor member = constructors[i];
-      canonicalName.getChildFromMember(member).bindTo(member.reference);
+      canonicalName.getChildFromConstructor(member).bindTo(member.reference);
     }
     for (int i = 0; i < redirectingFactoryConstructors.length; ++i) {
       RedirectingFactoryConstructor member = redirectingFactoryConstructors[i];
-      canonicalName.getChildFromMember(member).bindTo(member.reference);
+      canonicalName
+          .getChildFromRedirectingFactoryConstructor(member)
+          .bindTo(member.reference);
     }
     dirty = false;
   }
@@ -1348,24 +1299,33 @@
   /// if false we can skip it.
   bool dirty = true;
 
-  /// Adds a member to this class.
-  ///
-  /// Throws an error if attempting to add a field or procedure to a mixin
-  /// application.
-  void addMember(Member member) {
+  /// Adds a constructor to this class.
+  void addConstructor(Constructor constructor) {
     dirty = true;
-    member.parent = this;
-    if (member is Constructor) {
-      constructorsInternal.add(member);
-    } else if (member is Procedure) {
-      proceduresInternal.add(member);
-    } else if (member is Field) {
-      fieldsInternal.add(member);
-    } else if (member is RedirectingFactoryConstructor) {
-      redirectingFactoryConstructorsInternal.add(member);
-    } else {
-      throw new ArgumentError(member);
-    }
+    constructor.parent = this;
+    constructorsInternal.add(constructor);
+  }
+
+  /// Adds a procedure to this class.
+  void addProcedure(Procedure procedure) {
+    dirty = true;
+    procedure.parent = this;
+    proceduresInternal.add(procedure);
+  }
+
+  /// Adds a field to this class.
+  void addField(Field field) {
+    dirty = true;
+    field.parent = this;
+    fieldsInternal.add(field);
+  }
+
+  /// Adds a field to this class.
+  void addRedirectingFactoryConstructor(
+      RedirectingFactoryConstructor redirectingFactoryConstructor) {
+    dirty = true;
+    redirectingFactoryConstructor.parent = this;
+    redirectingFactoryConstructorsInternal.add(redirectingFactoryConstructor);
   }
 
   void addAnnotation(Expression node) {
@@ -1568,6 +1528,12 @@
   void set isStatic(bool value) {
     flags = value ? (flags | FlagStatic) : (flags & ~FlagStatic);
   }
+
+  @override
+  String toString() {
+    return 'ExtensionMemberDescriptor($name,$kind,'
+        '${member.toStringInternal()},isStatic=${isStatic})';
+  }
 }
 
 // ------------------------------------------------------------------------
@@ -1704,6 +1670,16 @@
   DartType type; // Not null. Defaults to DynamicType.
   int flags = 0;
   Expression initializer; // May be null.
+  final Reference setterReference;
+  @Deprecated("Use the specific getterReference/setterReference instead")
+  Reference get reference => super.reference;
+
+  Reference get getterReference => super.reference;
+  @Deprecated(
+      "Use the specific getterCanonicalName/setterCanonicalName instead")
+  CanonicalName get canonicalName => reference?.canonicalName;
+  CanonicalName get getterCanonicalName => getterReference?.canonicalName;
+  CanonicalName get setterCanonicalName => setterReference?.canonicalName;
 
   Field(Name name,
       {this.type: const DynamicType(),
@@ -1717,8 +1693,14 @@
       bool isLate: false,
       int transformerFlags: 0,
       Uri fileUri,
-      Reference reference})
-      : super(name, fileUri, reference) {
+      Reference getterReference,
+      Reference setterReference})
+      :
+        // TODO(jensj): Maybe don't create one for final fields?
+        // ('final' is a mutable setting though).
+        this.setterReference = setterReference ?? new Reference(),
+        super(name, fileUri, getterReference) {
+    this.setterReference.node = this;
     assert(type != null);
     initializer?.parent = this;
     this.isCovariant = isCovariant;
@@ -1734,6 +1716,12 @@
     this.transformerFlags = transformerFlags;
   }
 
+  @override
+  void _relinkNode() {
+    super._relinkNode();
+    this.setterReference.node = this;
+  }
+
   static const int FlagFinal = 1 << 0; // Must match serialized bit positions.
   static const int FlagConst = 1 << 1;
   static const int FlagStatic = 1 << 2;
@@ -1889,6 +1877,11 @@
   Location _getLocationInEnclosingFile(int offset) {
     return _getLocationInComponent(enclosingComponent, fileUri, offset);
   }
+
+  @override
+  void toTextInternal(AstPrinter printer) {
+    printer.writeMemberName(getterReference);
+  }
 }
 
 /// A generative constructor, possibly redirecting.
@@ -2118,7 +2111,7 @@
   void set target(Member member) {
     assert(member is Constructor ||
         (member is Procedure && member.kind == ProcedureKind.Factory));
-    targetReference = getMemberReference(member);
+    targetReference = getMemberReferenceGetter(member);
   }
 
   R accept<R>(MemberVisitor<R> v) => v.visitRedirectingFactoryConstructor(this);
@@ -2171,7 +2164,7 @@
   /// set).
   int startFileOffset = TreeNode.noOffset;
 
-  ProcedureKind kind;
+  final ProcedureKind kind;
   int flags = 0;
   // function is null if and only if abstract, external.
   FunctionNode function;
@@ -2218,24 +2211,31 @@
       Member forwardingStubSuperTarget,
       Member forwardingStubInterfaceTarget,
       Member memberSignatureOrigin})
-      : this._byReferenceRenamed(name, kind, function,
-            isAbstract: isAbstract,
-            isStatic: isStatic,
-            isExternal: isExternal,
-            isConst: isConst,
-            isForwardingStub: isForwardingStub,
-            isMemberSignature: isMemberSignature,
-            isForwardingSemiStub: isForwardingSemiStub,
-            isExtensionMember: isExtensionMember,
-            transformerFlags: transformerFlags,
-            fileUri: fileUri,
-            reference: reference,
-            forwardingStubSuperTargetReference:
-                getMemberReference(forwardingStubSuperTarget),
-            forwardingStubInterfaceTargetReference:
-                getMemberReference(forwardingStubInterfaceTarget),
-            memberSignatureOriginReference:
-                getMemberReference(memberSignatureOrigin));
+      : this._byReferenceRenamed(
+          name,
+          kind,
+          function,
+          isAbstract: isAbstract,
+          isStatic: isStatic,
+          isExternal: isExternal,
+          isConst: isConst,
+          isForwardingStub: isForwardingStub,
+          isMemberSignature: isMemberSignature,
+          isForwardingSemiStub: isForwardingSemiStub,
+          isExtensionMember: isExtensionMember,
+          transformerFlags: transformerFlags,
+          fileUri: fileUri,
+          reference: reference,
+          forwardingStubSuperTargetReference:
+              getMemberReferenceBasedOnProcedureKind(
+                  forwardingStubSuperTarget, kind),
+          forwardingStubInterfaceTargetReference:
+              getMemberReferenceBasedOnProcedureKind(
+                  forwardingStubInterfaceTarget, kind),
+          memberSignatureOriginReference:
+              getMemberReferenceBasedOnProcedureKind(
+                  memberSignatureOrigin, kind),
+        );
 
   Procedure._byReferenceRenamed(Name name, this.kind, this.function,
       {bool isAbstract: false,
@@ -2252,7 +2252,8 @@
       this.forwardingStubSuperTargetReference,
       this.forwardingStubInterfaceTargetReference,
       this.memberSignatureOriginReference})
-      : super(name, fileUri, reference) {
+      : assert(kind != null),
+        super(name, fileUri, reference) {
     function?.parent = this;
     this.isAbstract = isAbstract;
     this.isStatic = isStatic;
@@ -2403,21 +2404,24 @@
       forwardingStubSuperTargetReference?.asMember;
 
   void set forwardingStubSuperTarget(Member target) {
-    forwardingStubSuperTargetReference = getMemberReference(target);
+    forwardingStubSuperTargetReference =
+        getMemberReferenceBasedOnProcedureKind(target, kind);
   }
 
   Member get forwardingStubInterfaceTarget =>
       forwardingStubInterfaceTargetReference?.asMember;
 
   void set forwardingStubInterfaceTarget(Member target) {
-    forwardingStubInterfaceTargetReference = getMemberReference(target);
+    forwardingStubInterfaceTargetReference =
+        getMemberReferenceBasedOnProcedureKind(target, kind);
   }
 
   @override
   Member get memberSignatureOrigin => memberSignatureOriginReference?.asMember;
 
   void set memberSignatureOrigin(Member target) {
-    memberSignatureOriginReference = getMemberReference(target);
+    memberSignatureOriginReference =
+        getMemberReferenceBasedOnProcedureKind(target, kind);
   }
 
   R accept<R>(MemberVisitor<R> v) => v.visitProcedure(this);
@@ -2513,7 +2517,10 @@
   Expression value;
 
   FieldInitializer(Field field, Expression value)
-      : this.byReference(field?.reference, value);
+      : this.byReference(
+            // getterReference is used since this refers to the field itself
+            field?.getterReference,
+            value);
 
   FieldInitializer.byReference(this.fieldReference, this.value) {
     value?.parent = this;
@@ -2522,7 +2529,7 @@
   Field get field => fieldReference?.node;
 
   void set field(Field field) {
-    fieldReference = field?.reference;
+    fieldReference = field?.getterReference;
   }
 
   R accept<R>(InitializerVisitor<R> v) => v.visitFieldInitializer(this);
@@ -2565,7 +2572,10 @@
   Arguments arguments;
 
   SuperInitializer(Constructor target, Arguments arguments)
-      : this.byReference(getMemberReference(target), arguments);
+      : this.byReference(
+            // Getter vs setter doesn't matter for constructors.
+            getMemberReferenceGetter(target),
+            arguments);
 
   SuperInitializer.byReference(this.targetReference, this.arguments) {
     arguments?.parent = this;
@@ -2574,7 +2584,8 @@
   Constructor get target => targetReference?.asConstructor;
 
   void set target(Constructor target) {
-    targetReference = getMemberReference(target);
+    // Getter vs setter doesn't matter for constructors.
+    targetReference = getMemberReferenceGetter(target);
   }
 
   R accept<R>(InitializerVisitor<R> v) => v.visitSuperInitializer(this);
@@ -2613,7 +2624,10 @@
   Arguments arguments;
 
   RedirectingInitializer(Constructor target, Arguments arguments)
-      : this.byReference(getMemberReference(target), arguments);
+      : this.byReference(
+            // Getter vs setter doesn't matter for constructors.
+            getMemberReferenceGetter(target),
+            arguments);
 
   RedirectingInitializer.byReference(this.targetReference, this.arguments) {
     arguments?.parent = this;
@@ -2622,7 +2636,8 @@
   Constructor get target => targetReference?.asConstructor;
 
   void set target(Constructor target) {
-    targetReference = getMemberReference(target);
+    // Getter vs setter doesn't matter for constructors.
+    targetReference = getMemberReferenceGetter(target);
   }
 
   R accept<R>(InitializerVisitor<R> v) => v.visitRedirectingInitializer(this);
@@ -3012,7 +3027,19 @@
 
 abstract class Expression extends TreeNode {
   /// Returns the static type of the expression.
-  DartType getStaticType(StaticTypeContext context);
+  ///
+  /// This calls `StaticTypeContext.getExpressionType` which calls
+  /// [getStaticTypeInternal] to compute the type of not already cached in
+  /// [context].
+  DartType getStaticType(StaticTypeContext context) {
+    return context.getExpressionType(this);
+  }
+
+  /// Computes the static type of this expression.
+  ///
+  /// This is called by `StaticTypeContext.getExpressionType` if the static
+  /// type of this expression is not already cached in [context].
+  DartType getStaticTypeInternal(StaticTypeContext context);
 
   /// Returns the static type of the expression as an instantiation of
   /// [superclass].
@@ -3041,7 +3068,7 @@
       type =
           typeParameterType.promotedBound ?? typeParameterType.parameter.bound;
     }
-    if (type == context.typeEnvironment.nullType) {
+    if (type is NullType) {
       return context.typeEnvironment.coreTypes
           .bottomInterfaceType(superclass, context.nullable);
     } else if (type is NeverType) {
@@ -3114,14 +3141,26 @@
 
   InvalidExpression(this.message);
 
-  DartType getStaticType(StaticTypeContext context) => const BottomType();
+  @override
+  DartType getStaticType(StaticTypeContext context) =>
+      getStaticTypeInternal(context);
 
+  @override
+  DartType getStaticTypeInternal(StaticTypeContext context) =>
+      const BottomType();
+
+  @override
   R accept<R>(ExpressionVisitor<R> v) => v.visitInvalidExpression(this);
+
+  @override
   R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
       v.visitInvalidExpression(this, arg);
 
-  visitChildren(Visitor v) {}
-  transformChildren(Transformer v) {}
+  @override
+  void visitChildren(Visitor v) {}
+
+  @override
+  void transformChildren(Transformer v) {}
 
   @override
   String toString() {
@@ -3143,7 +3182,11 @@
 
   VariableGet(this.variable, [this.promotedType]) : assert(variable != null);
 
-  DartType getStaticType(StaticTypeContext context) {
+  DartType getStaticType(StaticTypeContext context) =>
+      getStaticTypeInternal(context);
+
+  @override
+  DartType getStaticTypeInternal(StaticTypeContext context) {
     return promotedType ?? variable.type;
   }
 
@@ -3189,6 +3232,10 @@
   }
 
   DartType getStaticType(StaticTypeContext context) =>
+      getStaticTypeInternal(context);
+
+  @override
+  DartType getStaticTypeInternal(StaticTypeContext context) =>
       value.getStaticType(context);
 
   R accept<R>(ExpressionVisitor<R> v) => v.visitVariableSet(this);
@@ -3229,7 +3276,8 @@
   Reference interfaceTargetReference;
 
   PropertyGet(Expression receiver, Name name, [Member interfaceTarget])
-      : this.byReference(receiver, name, getMemberReference(interfaceTarget));
+      : this.byReference(
+            receiver, name, getMemberReferenceGetter(interfaceTarget));
 
   PropertyGet.byReference(
       this.receiver, this.name, this.interfaceTargetReference) {
@@ -3239,10 +3287,11 @@
   Member get interfaceTarget => interfaceTargetReference?.asMember;
 
   void set interfaceTarget(Member member) {
-    interfaceTargetReference = getMemberReference(member);
+    interfaceTargetReference = getMemberReferenceGetter(member);
   }
 
-  DartType getStaticType(StaticTypeContext context) {
+  @override
+  DartType getStaticTypeInternal(StaticTypeContext context) {
     var interfaceTarget = this.interfaceTarget;
     if (interfaceTarget != null) {
       Class superclass = interfaceTarget.enclosingClass;
@@ -3307,7 +3356,7 @@
   PropertySet(Expression receiver, Name name, Expression value,
       [Member interfaceTarget])
       : this.byReference(
-            receiver, name, value, getMemberReference(interfaceTarget));
+            receiver, name, value, getMemberReferenceSetter(interfaceTarget));
 
   PropertySet.byReference(
       this.receiver, this.name, this.value, this.interfaceTargetReference) {
@@ -3318,10 +3367,14 @@
   Member get interfaceTarget => interfaceTargetReference?.asMember;
 
   void set interfaceTarget(Member member) {
-    interfaceTargetReference = getMemberReference(member);
+    interfaceTargetReference = getMemberReferenceSetter(member);
   }
 
   DartType getStaticType(StaticTypeContext context) =>
+      getStaticTypeInternal(context);
+
+  @override
+  DartType getStaticTypeInternal(StaticTypeContext context) =>
       value.getStaticType(context);
 
   R accept<R>(ExpressionVisitor<R> v) => v.visitPropertySet(this);
@@ -3371,17 +3424,17 @@
   Reference interfaceTargetReference;
 
   SuperPropertyGet(Name name, [Member interfaceTarget])
-      : this.byReference(name, getMemberReference(interfaceTarget));
+      : this.byReference(name, getMemberReferenceGetter(interfaceTarget));
 
   SuperPropertyGet.byReference(this.name, this.interfaceTargetReference);
 
   Member get interfaceTarget => interfaceTargetReference?.asMember;
 
   void set interfaceTarget(Member member) {
-    interfaceTargetReference = getMemberReference(member);
+    interfaceTargetReference = getMemberReferenceGetter(member);
   }
 
-  DartType getStaticType(StaticTypeContext context) {
+  DartType getStaticTypeInternal(StaticTypeContext context) {
     if (interfaceTarget == null) {
       // TODO(johnniwinther): SuperPropertyGet without a target should be
       // replaced by invalid expressions.
@@ -3433,7 +3486,8 @@
   Reference interfaceTargetReference;
 
   SuperPropertySet(Name name, Expression value, Member interfaceTarget)
-      : this.byReference(name, value, getMemberReference(interfaceTarget));
+      : this.byReference(
+            name, value, getMemberReferenceSetter(interfaceTarget));
 
   SuperPropertySet.byReference(
       this.name, this.value, this.interfaceTargetReference) {
@@ -3443,10 +3497,14 @@
   Member get interfaceTarget => interfaceTargetReference?.asMember;
 
   void set interfaceTarget(Member member) {
-    interfaceTargetReference = getMemberReference(member);
+    interfaceTargetReference = getMemberReferenceSetter(member);
   }
 
   DartType getStaticType(StaticTypeContext context) =>
+      getStaticTypeInternal(context);
+
+  @override
+  DartType getStaticTypeInternal(StaticTypeContext context) =>
       value.getStaticType(context);
 
   R accept<R>(ExpressionVisitor<R> v) => v.visitSuperPropertySet(this);
@@ -3485,17 +3543,22 @@
   /// A static field, getter, or method (for tear-off).
   Reference targetReference;
 
-  StaticGet(Member target) : this.byReference(getMemberReference(target));
+  StaticGet(Member target) : this.byReference(getMemberReferenceGetter(target));
 
   StaticGet.byReference(this.targetReference);
 
   Member get target => targetReference?.asMember;
 
   void set target(Member target) {
-    targetReference = getMemberReference(target);
+    targetReference = getMemberReferenceGetter(target);
   }
 
-  DartType getStaticType(StaticTypeContext context) => target.getterType;
+  DartType getStaticType(StaticTypeContext context) =>
+      getStaticTypeInternal(context);
+
+  @override
+  DartType getStaticTypeInternal(StaticTypeContext context) =>
+      target.getterType;
 
   R accept<R>(ExpressionVisitor<R> v) => v.visitStaticGet(this);
   R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
@@ -3527,7 +3590,7 @@
   Expression value;
 
   StaticSet(Member target, Expression value)
-      : this.byReference(getMemberReference(target), value);
+      : this.byReference(getMemberReferenceSetter(target), value);
 
   StaticSet.byReference(this.targetReference, this.value) {
     value?.parent = this;
@@ -3536,10 +3599,14 @@
   Member get target => targetReference?.asMember;
 
   void set target(Member target) {
-    targetReference = getMemberReference(target);
+    targetReference = getMemberReferenceSetter(target);
   }
 
   DartType getStaticType(StaticTypeContext context) =>
+      getStaticTypeInternal(context);
+
+  @override
+  DartType getStaticTypeInternal(StaticTypeContext context) =>
       value.getStaticType(context);
 
   R accept<R>(ExpressionVisitor<R> v) => v.visitStaticSet(this);
@@ -3711,16 +3778,25 @@
 
 /// Expression of form `x.foo(y)`.
 class MethodInvocation extends InvocationExpression {
+  // Must match serialized bit positions.
+  static const int FlagInvariant = 1 << 0;
+  static const int FlagBoundsSafe = 1 << 1;
+
   Expression receiver;
   Name name;
   Arguments arguments;
+  int flags = 0;
 
   Reference interfaceTargetReference;
 
   MethodInvocation(Expression receiver, Name name, Arguments arguments,
       [Member interfaceTarget])
       : this.byReference(
-            receiver, name, arguments, getMemberReference(interfaceTarget));
+            receiver,
+            name,
+            arguments,
+            // An invocation doesn't refer to the setter.
+            getMemberReferenceGetter(interfaceTarget));
 
   MethodInvocation.byReference(
       this.receiver, this.name, this.arguments, this.interfaceTargetReference) {
@@ -3731,10 +3807,46 @@
   Member get interfaceTarget => interfaceTargetReference?.asMember;
 
   void set interfaceTarget(Member target) {
-    interfaceTargetReference = getMemberReference(target);
+    // An invocation doesn't refer to the setter.
+    interfaceTargetReference = getMemberReferenceGetter(target);
   }
 
-  DartType getStaticType(StaticTypeContext context) {
+  /// If `true`, this call is known to be safe wrt. parameter covariance checks.
+  ///
+  /// This is for instance the case in code patterns like this
+  ///
+  ///     List<int> list = <int>[];
+  ///     list.add(0);
+  ///
+  /// where the `list` variable is known to hold a value of the same type as
+  /// the static type. In contrast the would not be the case in code patterns
+  /// like this
+  ///
+  ///     List<num> list = <double>[];
+  ///     list.add(0); // Runtime error `int` is not a subtype of `double`.
+  ///
+  bool get isInvariant => flags & FlagInvariant != 0;
+
+  void set isInvariant(bool value) {
+    flags = value ? (flags | FlagInvariant) : (flags & ~FlagInvariant);
+  }
+
+  /// If `true`, this call is known to be safe wrt. parameter covariance checks.
+  ///
+  /// This is for instance the case in code patterns like this
+  ///
+  ///     List list = new List.filled(2, 0);
+  ///     list[1] = 42;
+  ///
+  /// where the `list` is known to have a sufficient length for the update
+  /// in `list[1] = 42`.
+  bool get isBoundsSafe => flags & FlagBoundsSafe != 0;
+
+  void set isBoundsSafe(bool value) {
+    flags = value ? (flags | FlagBoundsSafe) : (flags & ~FlagBoundsSafe);
+  }
+
+  DartType getStaticTypeInternal(StaticTypeContext context) {
     var interfaceTarget = this.interfaceTarget;
     if (interfaceTarget != null) {
       if (interfaceTarget is Procedure &&
@@ -3851,7 +3963,11 @@
 
   SuperMethodInvocation(Name name, Arguments arguments,
       [Procedure interfaceTarget])
-      : this.byReference(name, arguments, getMemberReference(interfaceTarget));
+      : this.byReference(
+            name,
+            arguments,
+            // An invocation doesn't refer to the setter.
+            getMemberReferenceGetter(interfaceTarget));
 
   SuperMethodInvocation.byReference(
       this.name, this.arguments, this.interfaceTargetReference) {
@@ -3861,10 +3977,11 @@
   Procedure get interfaceTarget => interfaceTargetReference?.asProcedure;
 
   void set interfaceTarget(Procedure target) {
-    interfaceTargetReference = getMemberReference(target);
+    // An invocation doesn't refer to the setter.
+    interfaceTargetReference = getMemberReferenceGetter(target);
   }
 
-  DartType getStaticType(StaticTypeContext context) {
+  DartType getStaticTypeInternal(StaticTypeContext context) {
     if (interfaceTarget == null) return const DynamicType();
     Class superclass = interfaceTarget.enclosingClass;
     List<DartType> receiverTypeArguments = context.typeEnvironment
@@ -3921,7 +4038,10 @@
   Name get name => target?.name;
 
   StaticInvocation(Procedure target, Arguments arguments, {bool isConst: false})
-      : this.byReference(getMemberReference(target), arguments,
+      : this.byReference(
+            // An invocation doesn't refer to the setter.
+            getMemberReferenceGetter(target),
+            arguments,
             isConst: isConst);
 
   StaticInvocation.byReference(this.targetReference, this.arguments,
@@ -3932,10 +4052,11 @@
   Procedure get target => targetReference?.asProcedure;
 
   void set target(Procedure target) {
-    targetReference = getMemberReference(target);
+    // An invocation doesn't refer to the setter.
+    targetReference = getMemberReferenceGetter(target);
   }
 
-  DartType getStaticType(StaticTypeContext context) {
+  DartType getStaticTypeInternal(StaticTypeContext context) {
     return Substitution.fromPairs(
             target.function.typeParameters, arguments.types)
         .substituteType(target.function.returnType);
@@ -3985,7 +4106,10 @@
 
   ConstructorInvocation(Constructor target, Arguments arguments,
       {bool isConst: false})
-      : this.byReference(getMemberReference(target), arguments,
+      : this.byReference(
+            // A constructor doesn't refer to the setter.
+            getMemberReferenceGetter(target),
+            arguments,
             isConst: isConst);
 
   ConstructorInvocation.byReference(this.targetReference, this.arguments,
@@ -3996,10 +4120,11 @@
   Constructor get target => targetReference?.asConstructor;
 
   void set target(Constructor target) {
-    targetReference = getMemberReference(target);
+    // A constructor doesn't refer to the setter.
+    targetReference = getMemberReferenceGetter(target);
   }
 
-  DartType getStaticType(StaticTypeContext context) {
+  DartType getStaticTypeInternal(StaticTypeContext context) {
     return arguments.types.isEmpty
         ? context.typeEnvironment.coreTypes
             .rawType(target.enclosingClass, context.nonNullable)
@@ -4066,7 +4191,7 @@
     expression?.parent = this;
   }
 
-  DartType getStaticType(StaticTypeContext context) {
+  DartType getStaticTypeInternal(StaticTypeContext context) {
     FunctionType type = expression.getStaticType(context);
     return Substitution.fromPairs(type.typeParameters, typeArguments)
         .substituteType(type.withoutTypeParameters);
@@ -4113,6 +4238,10 @@
   }
 
   DartType getStaticType(StaticTypeContext context) =>
+      getStaticTypeInternal(context);
+
+  @override
+  DartType getStaticTypeInternal(StaticTypeContext context) =>
       context.typeEnvironment.coreTypes.boolRawType(context.nonNullable);
 
   R accept<R>(ExpressionVisitor<R> v) => v.visitNot(this);
@@ -4166,6 +4295,10 @@
   }
 
   DartType getStaticType(StaticTypeContext context) =>
+      getStaticTypeInternal(context);
+
+  @override
+  DartType getStaticTypeInternal(StaticTypeContext context) =>
       context.typeEnvironment.coreTypes.boolRawType(context.nonNullable);
 
   R accept<R>(ExpressionVisitor<R> v) => v.visitLogicalExpression(this);
@@ -4218,7 +4351,11 @@
     otherwise?.parent = this;
   }
 
-  DartType getStaticType(StaticTypeContext context) => staticType;
+  DartType getStaticType(StaticTypeContext context) =>
+      getStaticTypeInternal(context);
+
+  @override
+  DartType getStaticTypeInternal(StaticTypeContext context) => staticType;
 
   R accept<R>(ExpressionVisitor<R> v) => v.visitConditionalExpression(this);
   R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
@@ -4286,6 +4423,10 @@
   }
 
   DartType getStaticType(StaticTypeContext context) =>
+      getStaticTypeInternal(context);
+
+  @override
+  DartType getStaticTypeInternal(StaticTypeContext context) =>
       context.typeEnvironment.coreTypes.stringRawType(context.nonNullable);
 
   R accept<R>(ExpressionVisitor<R> v) => v.visitStringConcatenation(this);
@@ -4336,7 +4477,11 @@
     setParents(lists, this);
   }
 
-  DartType getStaticType(StaticTypeContext context) {
+  DartType getStaticType(StaticTypeContext context) =>
+      getStaticTypeInternal(context);
+
+  @override
+  DartType getStaticTypeInternal(StaticTypeContext context) {
     return context.typeEnvironment.listType(typeArgument, context.nonNullable);
   }
 
@@ -4390,7 +4535,11 @@
     setParents(sets, this);
   }
 
-  DartType getStaticType(StaticTypeContext context) {
+  DartType getStaticType(StaticTypeContext context) =>
+      getStaticTypeInternal(context);
+
+  @override
+  DartType getStaticTypeInternal(StaticTypeContext context) {
     return context.typeEnvironment.setType(typeArgument, context.nonNullable);
   }
 
@@ -4447,7 +4596,11 @@
     setParents(maps, this);
   }
 
-  DartType getStaticType(StaticTypeContext context) {
+  DartType getStaticType(StaticTypeContext context) =>
+      getStaticTypeInternal(context);
+
+  @override
+  DartType getStaticTypeInternal(StaticTypeContext context) {
     return context.typeEnvironment
         .mapType(keyType, valueType, context.nonNullable);
   }
@@ -4508,7 +4661,11 @@
 
   Class get classNode => classReference.asClass;
 
-  DartType getStaticType(StaticTypeContext context) {
+  DartType getStaticType(StaticTypeContext context) =>
+      getStaticTypeInternal(context);
+
+  @override
+  DartType getStaticTypeInternal(StaticTypeContext context) {
     return typeArguments.isEmpty
         ? context.typeEnvironment.coreTypes
             .rawType(classNode, context.nonNullable)
@@ -4606,6 +4763,10 @@
   }
 
   DartType getStaticType(StaticTypeContext context) =>
+      getStaticTypeInternal(context);
+
+  @override
+  DartType getStaticTypeInternal(StaticTypeContext context) =>
       expression.getStaticType(context);
 
   R accept<R>(ExpressionVisitor<R> v) => v.visitFileUriExpression(this);
@@ -4667,6 +4828,10 @@
   }
 
   DartType getStaticType(StaticTypeContext context) =>
+      getStaticTypeInternal(context);
+
+  @override
+  DartType getStaticTypeInternal(StaticTypeContext context) =>
       context.typeEnvironment.coreTypes.boolRawType(context.nonNullable);
 
   R accept<R>(ExpressionVisitor<R> v) => v.visitIsExpression(this);
@@ -4776,7 +4941,11 @@
         : (flags & ~FlagForNonNullableByDefault);
   }
 
-  DartType getStaticType(StaticTypeContext context) => type;
+  DartType getStaticType(StaticTypeContext context) =>
+      getStaticTypeInternal(context);
+
+  @override
+  DartType getStaticTypeInternal(StaticTypeContext context) => type;
 
   R accept<R>(ExpressionVisitor<R> v) => v.visitAsExpression(this);
   R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
@@ -4839,9 +5008,9 @@
     operand?.parent = this;
   }
 
-  DartType getStaticType(StaticTypeContext context) {
+  DartType getStaticTypeInternal(StaticTypeContext context) {
     DartType operandType = operand.getStaticType(context);
-    return operandType == context.typeEnvironment.nullType
+    return operandType is NullType
         ? const NeverType(Nullability.nonNullable)
         : operandType.withDeclaredNullability(Nullability.nonNullable);
   }
@@ -4888,6 +5057,10 @@
   StringLiteral(this.value);
 
   DartType getStaticType(StaticTypeContext context) =>
+      getStaticTypeInternal(context);
+
+  @override
+  DartType getStaticTypeInternal(StaticTypeContext context) =>
       context.typeEnvironment.coreTypes.stringRawType(context.nonNullable);
 
   R accept<R>(ExpressionVisitor<R> v) => v.visitStringLiteral(this);
@@ -4917,6 +5090,10 @@
   IntLiteral(this.value);
 
   DartType getStaticType(StaticTypeContext context) =>
+      getStaticTypeInternal(context);
+
+  @override
+  DartType getStaticTypeInternal(StaticTypeContext context) =>
       context.typeEnvironment.coreTypes.intRawType(context.nonNullable);
 
   R accept<R>(ExpressionVisitor<R> v) => v.visitIntLiteral(this);
@@ -4940,6 +5117,10 @@
   DoubleLiteral(this.value);
 
   DartType getStaticType(StaticTypeContext context) =>
+      getStaticTypeInternal(context);
+
+  @override
+  DartType getStaticTypeInternal(StaticTypeContext context) =>
       context.typeEnvironment.coreTypes.doubleRawType(context.nonNullable);
 
   R accept<R>(ExpressionVisitor<R> v) => v.visitDoubleLiteral(this);
@@ -4963,6 +5144,10 @@
   BoolLiteral(this.value);
 
   DartType getStaticType(StaticTypeContext context) =>
+      getStaticTypeInternal(context);
+
+  @override
+  DartType getStaticTypeInternal(StaticTypeContext context) =>
       context.typeEnvironment.coreTypes.boolRawType(context.nonNullable);
 
   R accept<R>(ExpressionVisitor<R> v) => v.visitBoolLiteral(this);
@@ -4984,7 +5169,10 @@
   Object get value => null;
 
   DartType getStaticType(StaticTypeContext context) =>
-      context.typeEnvironment.nullType;
+      getStaticTypeInternal(context);
+
+  @override
+  DartType getStaticTypeInternal(StaticTypeContext context) => const NullType();
 
   R accept<R>(ExpressionVisitor<R> v) => v.visitNullLiteral(this);
   R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
@@ -5007,6 +5195,10 @@
   SymbolLiteral(this.value);
 
   DartType getStaticType(StaticTypeContext context) =>
+      getStaticTypeInternal(context);
+
+  @override
+  DartType getStaticTypeInternal(StaticTypeContext context) =>
       context.typeEnvironment.coreTypes.symbolRawType(context.nonNullable);
 
   R accept<R>(ExpressionVisitor<R> v) => v.visitSymbolLiteral(this);
@@ -5034,6 +5226,10 @@
   TypeLiteral(this.type);
 
   DartType getStaticType(StaticTypeContext context) =>
+      getStaticTypeInternal(context);
+
+  @override
+  DartType getStaticTypeInternal(StaticTypeContext context) =>
       context.typeEnvironment.coreTypes.typeRawType(context.nonNullable);
 
   R accept<R>(ExpressionVisitor<R> v) => v.visitTypeLiteral(this);
@@ -5060,7 +5256,11 @@
 }
 
 class ThisExpression extends Expression {
-  DartType getStaticType(StaticTypeContext context) => context.thisType;
+  DartType getStaticType(StaticTypeContext context) =>
+      getStaticTypeInternal(context);
+
+  @override
+  DartType getStaticTypeInternal(StaticTypeContext context) => context.thisType;
 
   R accept<R>(ExpressionVisitor<R> v) => v.visitThisExpression(this);
   R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
@@ -5082,6 +5282,10 @@
 
 class Rethrow extends Expression {
   DartType getStaticType(StaticTypeContext context) =>
+      getStaticTypeInternal(context);
+
+  @override
+  DartType getStaticTypeInternal(StaticTypeContext context) =>
       context.isNonNullableByDefault
           ? const NeverType(Nullability.nonNullable)
           : const BottomType();
@@ -5112,6 +5316,10 @@
   }
 
   DartType getStaticType(StaticTypeContext context) =>
+      getStaticTypeInternal(context);
+
+  @override
+  DartType getStaticTypeInternal(StaticTypeContext context) =>
       context.isNonNullableByDefault
           ? const NeverType(Nullability.nonNullable)
           : const BottomType();
@@ -5153,7 +5361,11 @@
     setParents(expressions, this);
   }
 
-  DartType getStaticType(StaticTypeContext context) {
+  DartType getStaticType(StaticTypeContext context) =>
+      getStaticTypeInternal(context);
+
+  @override
+  DartType getStaticTypeInternal(StaticTypeContext context) {
     return context.typeEnvironment.listType(typeArgument, context.nonNullable);
   }
 
@@ -5200,7 +5412,11 @@
     setParents(expressions, this);
   }
 
-  DartType getStaticType(StaticTypeContext context) {
+  DartType getStaticType(StaticTypeContext context) =>
+      getStaticTypeInternal(context);
+
+  @override
+  DartType getStaticTypeInternal(StaticTypeContext context) {
     return context.typeEnvironment.setType(typeArgument, context.nonNullable);
   }
 
@@ -5251,7 +5467,11 @@
     setParents(entries, this);
   }
 
-  DartType getStaticType(StaticTypeContext context) {
+  DartType getStaticType(StaticTypeContext context) =>
+      getStaticTypeInternal(context);
+
+  @override
+  DartType getStaticTypeInternal(StaticTypeContext context) {
     return context.typeEnvironment
         .mapType(keyType, valueType, context.nonNullable);
   }
@@ -5350,7 +5570,7 @@
     operand?.parent = this;
   }
 
-  DartType getStaticType(StaticTypeContext context) {
+  DartType getStaticTypeInternal(StaticTypeContext context) {
     return context.typeEnvironment.flatten(operand.getStaticType(context));
   }
 
@@ -5396,7 +5616,7 @@
     function?.parent = this;
   }
 
-  DartType getStaticType(StaticTypeContext context) {
+  DartType getStaticTypeInternal(StaticTypeContext context) {
     return function.computeFunctionType(context.nonNullable);
   }
 
@@ -5434,7 +5654,11 @@
     assert(constant != null);
   }
 
-  DartType getStaticType(StaticTypeContext context) => type;
+  DartType getStaticType(StaticTypeContext context) =>
+      getStaticTypeInternal(context);
+
+  @override
+  DartType getStaticTypeInternal(StaticTypeContext context) => type;
 
   R accept<R>(ExpressionVisitor<R> v) => v.visitConstantExpression(this);
   R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
@@ -5472,6 +5696,10 @@
   }
 
   DartType getStaticType(StaticTypeContext context) =>
+      getStaticTypeInternal(context);
+
+  @override
+  DartType getStaticTypeInternal(StaticTypeContext context) =>
       body.getStaticType(context);
 
   R accept<R>(ExpressionVisitor<R> v) => v.visitLet(this);
@@ -5517,6 +5745,10 @@
   }
 
   DartType getStaticType(StaticTypeContext context) =>
+      getStaticTypeInternal(context);
+
+  @override
+  DartType getStaticTypeInternal(StaticTypeContext context) =>
       value.getStaticType(context);
 
   R accept<R>(ExpressionVisitor<R> v) => v.visitBlockExpression(this);
@@ -5571,7 +5803,11 @@
 
   LoadLibrary(this.import);
 
-  DartType getStaticType(StaticTypeContext context) {
+  DartType getStaticType(StaticTypeContext context) =>
+      getStaticTypeInternal(context);
+
+  @override
+  DartType getStaticTypeInternal(StaticTypeContext context) {
     return context.typeEnvironment
         .futureType(const DynamicType(), context.nonNullable);
   }
@@ -5602,7 +5838,11 @@
 
   CheckLibraryIsLoaded(this.import);
 
-  DartType getStaticType(StaticTypeContext context) {
+  DartType getStaticType(StaticTypeContext context) =>
+      getStaticTypeInternal(context);
+
+  @override
+  DartType getStaticTypeInternal(StaticTypeContext context) {
     return context.typeEnvironment.coreTypes.objectRawType(context.nonNullable);
   }
 
@@ -5679,6 +5919,11 @@
 class Block extends Statement {
   final List<Statement> statements;
 
+  /// End offset in the source file it comes from. Valid values are from 0 and
+  /// up, or -1 ([TreeNode.noOffset]) if the file end offset is not available
+  /// (this is the default if none is specifically set).
+  int fileEndOffset = TreeNode.noOffset;
+
   Block(this.statements) {
     // Ensure statements is mutable.
     assert((statements
@@ -6117,6 +6362,76 @@
     }
   }
 
+  /// Returns the type of the iterator in this for-in statement.
+  ///
+  /// This calls `StaticTypeContext.getForInIteratorType` which calls
+  /// [getStaticTypeInternal] to compute the type of not already cached in
+  /// [context].
+  DartType getIteratorType(StaticTypeContext context) =>
+      context.getForInIteratorType(this);
+
+  /// Computes the type of the iterator in this for-in statement.
+  ///
+  /// This is called by `StaticTypeContext.getForInIteratorType` if the iterator
+  /// type of this for-in statement is not already cached in [context].
+  DartType getIteratorTypeInternal(StaticTypeContext context) {
+    DartType iteratorType;
+    if (isAsync) {
+      InterfaceType streamType = iterable.getStaticTypeAsInstanceOf(
+          context.typeEnvironment.coreTypes.streamClass, context);
+      if (streamType != null) {
+        iteratorType = new InterfaceType(
+            context.typeEnvironment.coreTypes.streamIteratorClass,
+            context.nonNullable,
+            streamType.typeArguments);
+      }
+    } else {
+      InterfaceType iterableType = iterable.getStaticTypeAsInstanceOf(
+          context.typeEnvironment.coreTypes.iterableClass, context);
+      Member member = context.typeEnvironment.hierarchy
+          .getInterfaceMember(iterableType.classNode, new Name('iterator'));
+      if (member != null) {
+        iteratorType = Substitution.fromInterfaceType(iterableType)
+            .substituteType(member.getterType);
+      }
+    }
+    return iteratorType ??= const DynamicType();
+  }
+
+  /// Returns the type of the element in this for-in statement.
+  ///
+  /// This calls `StaticTypeContext.getForInElementType` which calls
+  /// [getStaticTypeInternal] to compute the type of not already cached in
+  /// [context].
+  DartType getElementType(StaticTypeContext context) =>
+      context.getForInElementType(this);
+
+  /// Computes the type of the element in this for-in statement.
+  ///
+  /// This is called by `StaticTypeContext.getForInElementType` if the element
+  /// type of this for-in statement is not already cached in [context].
+  DartType getElementTypeInternal(StaticTypeContext context) {
+    DartType iterableType = iterable.getStaticType(context);
+    // TODO(johnniwinther): Update this to use the type of
+    //  `iterable.iterator.current` if inference is updated accordingly.
+    while (iterableType is TypeParameterType) {
+      TypeParameterType typeParameterType = iterableType;
+      iterableType =
+          typeParameterType.promotedBound ?? typeParameterType.parameter.bound;
+    }
+    if (isAsync) {
+      List<DartType> typeArguments = context.typeEnvironment
+          .getTypeArgumentsAsInstanceOf(
+              iterableType, context.typeEnvironment.coreTypes.streamClass);
+      return typeArguments.single;
+    } else {
+      List<DartType> typeArguments = context.typeEnvironment
+          .getTypeArgumentsAsInstanceOf(
+              iterableType, context.typeEnvironment.coreTypes.iterableClass);
+      return typeArguments.single;
+    }
+  }
+
   @override
   String toString() {
     return "ForInStatement(${toStringInternal()})";
@@ -7080,7 +7395,7 @@
 
   /// Checks if the type is potentially nullable.
   ///
-  /// A type is potentially nullable if it's nullable or if it's nullability is
+  /// A type is potentially nullable if it's nullable or if its nullability is
   /// undetermined at compile time.
   bool get isPotentiallyNullable {
     return nullability == Nullability.nullable ||
@@ -7089,8 +7404,8 @@
 
   /// Checks if the type is potentially non-nullable.
   ///
-  /// A type is potentially non-nullable if it's nullable or if it's nullability
-  /// is undetermined at compile time.
+  /// A type is potentially non-nullable if it's non-nullable or if its
+  /// nullability is undetermined at compile time.
   bool get isPotentiallyNonNullable {
     return nullability == Nullability.nonNullable ||
         nullability == Nullability.undetermined;
@@ -7338,6 +7653,49 @@
   }
 }
 
+class NullType extends DartType {
+  @override
+  final int hashCode = 415324;
+
+  const NullType();
+
+  @override
+  R accept<R>(DartTypeVisitor<R> v) => v.visitNullType(this);
+
+  @override
+  R accept1<R, A>(DartTypeVisitor1<R, A> v, A arg) {
+    return v.visitNullType(this, arg);
+  }
+
+  @override
+  void visitChildren(Visitor v) {}
+
+  @override
+  bool operator ==(Object other) => equals(other, null);
+
+  @override
+  bool equals(Object other, Assumptions assumptions) => other is NullType;
+
+  @override
+  Nullability get declaredNullability => Nullability.nullable;
+
+  @override
+  Nullability get nullability => Nullability.nullable;
+
+  @override
+  DartType withDeclaredNullability(Nullability nullability) => this;
+
+  @override
+  String toString() {
+    return "NullType(${toStringInternal()})";
+  }
+
+  @override
+  void toTextInternal(AstPrinter printer) {
+    printer.write("Null");
+  }
+}
+
 class InterfaceType extends DartType {
   Reference className;
 
@@ -8693,8 +9051,7 @@
   R accept<R>(ConstantVisitor<R> v) => v.visitNullConstant(this);
   R acceptReference<R>(Visitor<R> v) => v.visitNullConstantReference(this);
 
-  DartType getType(StaticTypeContext context) =>
-      context.typeEnvironment.nullType;
+  DartType getType(StaticTypeContext context) => const NullType();
 
   @override
   String toString() => 'NullConstant(${toStringInternal()})';
@@ -9199,6 +9556,14 @@
   String toString() {
     return "UnevaluatedConstant(${toStringInternal()})";
   }
+
+  @override
+  int get hashCode => expression.hashCode;
+
+  @override
+  bool operator ==(Object other) {
+    return other is UnevaluatedConstant && other.expression == expression;
+  }
 }
 
 // ------------------------------------------------------------------------
@@ -9232,7 +9597,7 @@
   Reference get mainMethodName => _mainMethodName;
   NonNullableByDefaultCompiledMode _mode;
   NonNullableByDefaultCompiledMode get mode {
-    return _mode ?? NonNullableByDefaultCompiledMode.Disabled;
+    return _mode ?? NonNullableByDefaultCompiledMode.Weak;
   }
 
   NonNullableByDefaultCompiledMode get modeRaw => _mode;
@@ -9367,6 +9732,8 @@
   void toTextInternal(AstPrinter printer) {
     // TODO(johnniwinther): Implement this.
   }
+
+  String leakingDebugToString() => astToText.debugComponentToString(this);
 }
 
 /// A tuple with file, line, and column number, for displaying human-readable
@@ -9638,11 +10005,37 @@
   }
 }
 
-/// Returns the [Reference] object for the given member.
+/// Returns the [Reference] object for the given member based on the
+/// ProcedureKind.
 ///
 /// Returns `null` if the member is `null`.
-Reference getMemberReference(Member member) {
-  return member?.reference;
+Reference getMemberReferenceBasedOnProcedureKind(
+    Member member, ProcedureKind kind) {
+  if (member == null) return null;
+  if (member is Field) {
+    if (kind == ProcedureKind.Setter) return member.setterReference;
+    return member.getterReference;
+  }
+  return member.reference;
+}
+
+/// Returns the (getter) [Reference] object for the given member.
+///
+/// Returns `null` if the member is `null`.
+/// TODO(jensj): Should it be called NotSetter instead of Getter?
+Reference getMemberReferenceGetter(Member member) {
+  if (member == null) return null;
+  if (member is Field) return member.getterReference;
+  return member.reference;
+}
+
+/// Returns the setter [Reference] object for the given member.
+///
+/// Returns `null` if the member is `null`.
+Reference getMemberReferenceSetter(Member member) {
+  if (member == null) return null;
+  if (member is Field) return member.setterReference;
+  return member.reference;
 }
 
 /// Returns the [Reference] object for the given class.
@@ -9656,12 +10049,36 @@
 /// member has not been assigned a canonical name yet.
 ///
 /// Returns `null` if the member is `null`.
-CanonicalName getCanonicalNameOfMember(Member member) {
+CanonicalName getCanonicalNameOfMemberGetter(Member member) {
   if (member == null) return null;
-  if (member.canonicalName == null) {
+  CanonicalName canonicalName;
+  if (member is Field) {
+    canonicalName = member.getterCanonicalName;
+  } else {
+    canonicalName = member.canonicalName;
+  }
+  if (canonicalName == null) {
     throw '$member has no canonical name';
   }
-  return member.canonicalName;
+  return canonicalName;
+}
+
+/// Returns the canonical name of [member], or throws an exception if the
+/// member has not been assigned a canonical name yet.
+///
+/// Returns `null` if the member is `null`.
+CanonicalName getCanonicalNameOfMemberSetter(Member member) {
+  if (member == null) return null;
+  CanonicalName canonicalName;
+  if (member is Field) {
+    canonicalName = member.setterCanonicalName;
+  } else {
+    canonicalName = member.canonicalName;
+  }
+  if (canonicalName == null) {
+    throw '$member has no canonical name';
+  }
+  return canonicalName;
 }
 
 /// Returns the canonical name of [class_], or throws an exception if the
diff --git a/pkg/kernel/lib/binary/ast_from_binary.dart b/pkg/kernel/lib/binary/ast_from_binary.dart
index 01e245c..c0af19e 100644
--- a/pkg/kernel/lib/binary/ast_from_binary.dart
+++ b/pkg/kernel/lib/binary/ast_from_binary.dart
@@ -614,6 +614,7 @@
         if (child.name != '@methods' &&
             child.name != '@typedefs' &&
             child.name != '@fields' &&
+            child.name != '@=fields' &&
             child.name != '@getters' &&
             child.name != '@setters' &&
             child.name != '@factories' &&
@@ -755,32 +756,8 @@
     if (compilationMode == null) {
       compilationMode = component.modeRaw;
     }
-    if (compilationMode == null) {
-      compilationMode = index.compiledMode;
-    } else if (compilationMode != index.compiledMode) {
-      if (compilationMode == NonNullableByDefaultCompiledMode.Agnostic) {
-        compilationMode = index.compiledMode;
-      } else if (index.compiledMode ==
-          NonNullableByDefaultCompiledMode.Agnostic) {
-        // Keep as-is.
-      } else {
-        if ((compilationMode == NonNullableByDefaultCompiledMode.Disabled ||
-                index.compiledMode ==
-                    NonNullableByDefaultCompiledMode.Disabled) &&
-            (compilationMode == NonNullableByDefaultCompiledMode.Weak ||
-                index.compiledMode == NonNullableByDefaultCompiledMode.Weak)) {
-          // One is disabled and one is weak.
-          // => We allow that and "merge" them as disabled.
-          compilationMode = NonNullableByDefaultCompiledMode.Disabled;
-        } else {
-          // Mixed mode where agnostic isn't involved and it's not
-          // disabled + weak.
-          throw new CompilationModeError(
-              "Mixed compilation mode found: $compilationMode "
-              "and ${index.compiledMode}.");
-        }
-      }
-    }
+    compilationMode =
+        mergeCompilationModeOrThrow(compilationMode, index.compiledMode);
 
     _byteOffset = index.binaryOffsetForStringTable;
     readStringTable(_stringTable);
@@ -1014,6 +991,13 @@
     library.fileUri = fileUri;
     library.problemsAsJson = problemsAsJson;
 
+    assert(
+        mergeCompilationModeOrThrow(
+                compilationMode, library.nonNullableByDefaultCompiledMode) ==
+            compilationMode,
+        "Cannot load ${library.nonNullableByDefaultCompiledMode} "
+        "into component with mode $compilationMode");
+
     assert(() {
       debugPath.add(library.name ?? library.importUri?.toString() ?? 'library');
       return true;
@@ -1166,9 +1150,7 @@
       node = null;
     }
     if (node == null) {
-      node = new Class(reference: reference)
-        ..level = ClassLevel.Temporary
-        ..dirty = false;
+      node = new Class(reference: reference)..dirty = false;
     }
 
     var fileUri = readUriReference();
@@ -1176,12 +1158,7 @@
     node.fileOffset = readOffset();
     node.fileEndOffset = readOffset();
     int flags = readByte();
-    node.flags = flags & ~Class.LevelMask;
-    int levelIndex = flags & Class.LevelMask;
-    var level = ClassLevel.values[levelIndex + 1];
-    if (level.index >= node.level.index) {
-      node.level = level;
-    }
+    node.flags = flags;
     var name = readStringOrNullIfEmpty();
     var annotations = readAnnotationList(node);
     assert(() {
@@ -1308,14 +1285,17 @@
   Field readField() {
     int tag = readByte();
     assert(tag == Tag.Field);
-    var canonicalName = readCanonicalNameReference();
-    var reference = canonicalName.getReference();
-    Field node = reference.node;
+    CanonicalName getterCanonicalName = readCanonicalNameReference();
+    Reference getterReference = getterCanonicalName.getReference();
+    CanonicalName setterCanonicalName = readCanonicalNameReference();
+    Reference setterReference = setterCanonicalName.getReference();
+    Field node = getterReference.node;
     if (alwaysCreateNewNamedNodes) {
       node = null;
     }
     if (node == null) {
-      node = new Field(null, reference: reference);
+      node = new Field(null,
+          getterReference: getterReference, setterReference: setterReference);
     }
     var fileUri = readUriReference();
     int fileOffset = readOffset();
@@ -1395,15 +1375,17 @@
     if (alwaysCreateNewNamedNodes) {
       node = null;
     }
-    if (node == null) {
-      node = new Procedure(null, null, null, reference: reference);
-    }
     var fileUri = readUriReference();
     var startFileOffset = readOffset();
     var fileOffset = readOffset();
     var fileEndOffset = readOffset();
     int kindIndex = readByte();
     var kind = ProcedureKind.values[kindIndex];
+    if (node == null) {
+      node = new Procedure(null, kind, null, reference: reference);
+    } else {
+      assert(node.kind == kind);
+    }
     var flags = readUInt();
     var name = readName();
     var annotations = readAnnotationList(node);
@@ -1427,7 +1409,6 @@
     node.startFileOffset = startFileOffset;
     node.fileOffset = fileOffset;
     node.fileEndOffset = fileEndOffset;
-    node.kind = kind;
     node.flags = flags;
     node.name = name;
     node.fileUri = fileUri;
@@ -1730,10 +1711,12 @@
             readMemberReference(), readExpression())
           ..fileOffset = offset;
       case Tag.MethodInvocation:
+        int flags = readByte();
         int offset = readOffset();
         return new MethodInvocation.byReference(readExpression(), readName(),
             readArguments(), readInstanceMemberReference(allowNull: true))
-          ..fileOffset = offset;
+          ..fileOffset = offset
+          ..flags = flags;
       case Tag.SuperMethodInvocation:
         int offset = readOffset();
         addTransformerFlag(TransformerFlag.superCalls);
@@ -2124,9 +2107,13 @@
 
   Block readBlock() {
     int stackHeight = variableStack.length;
+    var offset = readOffset();
+    var endOffset = readOffset();
     var body = readStatementList();
     variableStack.length = stackHeight;
-    return new Block(body);
+    return new Block(body)
+      ..fileOffset = offset
+      ..fileEndOffset = endOffset;
   }
 
   AssertBlock readAssertBlock() {
@@ -2137,7 +2124,7 @@
   }
 
   Supertype readSupertype() {
-    InterfaceType type = readDartType();
+    InterfaceType type = readDartType(forSupertype: true);
     assert(
         type.nullability == _currentLibrary.nonNullable,
         "In serialized form supertypes should have Nullability.legacy if they "
@@ -2192,7 +2179,7 @@
     return readAndCheckOptionTag() ? readDartType() : null;
   }
 
-  DartType readDartType() {
+  DartType readDartType({bool forSupertype: false}) {
     int tag = readByte();
     switch (tag) {
       case Tag.TypedefType:
@@ -2229,7 +2216,18 @@
             reference, Nullability.values[nullabilityIndex], typeArguments);
       case Tag.SimpleInterfaceType:
         int nullabilityIndex = readByte();
-        return new InterfaceType.byReference(readClassReference(),
+        Reference classReference = readClassReference();
+        {
+          CanonicalName canonicalName = classReference.canonicalName;
+          if (canonicalName != null &&
+              !forSupertype &&
+              canonicalName.name == "Null" &&
+              canonicalName.parent?.name == "dart:core" &&
+              (canonicalName.parent?.parent?.isRoot ?? false)) {
+            return const NullType();
+          }
+        }
+        return new InterfaceType.byReference(classReference,
             Nullability.values[nullabilityIndex], const <DartType>[]);
       case Tag.FunctionType:
         int typeParameterStackHeight = typeParameterStack.length;
@@ -2473,9 +2471,9 @@
   }
 
   @override
-  DartType readDartType() {
+  DartType readDartType({bool forSupertype = false}) {
     final nodeOffset = _byteOffset;
-    final result = super.readDartType();
+    final result = super.readDartType(forSupertype: forSupertype);
     return _associateMetadata(result, nodeOffset);
   }
 
@@ -2652,3 +2650,30 @@
 
   _MetadataSubsection(this.repository, this.mapping);
 }
+
+/// Merges two compilation modes or throws if they are not compatible.
+NonNullableByDefaultCompiledMode mergeCompilationModeOrThrow(
+    NonNullableByDefaultCompiledMode a, NonNullableByDefaultCompiledMode b) {
+  if (a == null || a == b) {
+    return b;
+  }
+
+  // If something is invalid, it should always merge as invalid.
+  if (a == NonNullableByDefaultCompiledMode.Invalid) {
+    return a;
+  }
+  if (b == NonNullableByDefaultCompiledMode.Invalid) {
+    return b;
+  }
+
+  if (a == NonNullableByDefaultCompiledMode.Agnostic) {
+    return b;
+  }
+  if (b == NonNullableByDefaultCompiledMode.Agnostic) {
+    // Keep as-is.
+    return a;
+  }
+
+  // Mixed mode where agnostic isn't involved.
+  throw new CompilationModeError("Mixed compilation mode found: $a and $b");
+}
diff --git a/pkg/kernel/lib/binary/ast_to_binary.dart b/pkg/kernel/lib/binary/ast_to_binary.dart
index 2dbc82f..e7bd343 100644
--- a/pkg/kernel/lib/binary/ast_to_binary.dart
+++ b/pkg/kernel/lib/binary/ast_to_binary.dart
@@ -10,6 +10,7 @@
 import 'dart:typed_data';
 
 import '../ast.dart';
+import 'ast_from_binary.dart' show mergeCompilationModeOrThrow;
 import 'tag.dart';
 
 /// Writes to a binary file.
@@ -29,6 +30,7 @@
   final List<bool> _sourcesUsedInLibrary = new List<bool>();
   Map<LibraryDependency, int> _libraryDependencyIndex =
       <LibraryDependency, int>{};
+  NonNullableByDefaultCompiledMode compilationMode;
 
   List<_MetadataSubsection> _metadataSubsections;
 
@@ -534,6 +536,7 @@
 
   void writeComponentFile(Component component) {
     Timeline.timeSync("BinaryPrinter.writeComponentFile", () {
+      compilationMode = component.mode;
       computeCanonicalNames(component);
       final componentOffset = getBufferOffset();
       writeUInt32(Tag.ComponentFile);
@@ -546,7 +549,7 @@
         _writeNodeMetadataImpl(component, componentOffset);
       }
       libraryOffsets = <int>[];
-      CanonicalName main = getCanonicalNameOfMember(component.mainMethod);
+      CanonicalName main = getCanonicalNameOfMemberGetter(component.mainMethod);
       if (main != null) {
         checkCanonicalName(main);
       }
@@ -746,12 +749,13 @@
     assert(_binaryOffsetForConstantTable >= 0);
     writeUInt32(_binaryOffsetForConstantTable);
 
-    CanonicalName main = getCanonicalNameOfMember(component.mainMethod);
+    CanonicalName main = getCanonicalNameOfMemberGetter(component.mainMethod);
     if (main == null) {
       writeUInt32(0);
     } else {
       writeUInt32(main.index + 1);
     }
+    assert(component.modeRaw != null, "Component mode not set.");
     writeUInt32(component.mode.index);
 
     assert(libraryOffsets.length == libraries.length);
@@ -836,8 +840,8 @@
 
   void writeNullAllowedInstanceMemberReference(Reference reference) {
     writeNullAllowedReference(reference);
-    Member member = reference?.asMember;
-    writeNullAllowedReference(member?.memberSignatureOrigin?.reference);
+    writeNullAllowedReference(
+        getMemberReferenceGetter(reference?.asMember?.memberSignatureOrigin));
   }
 
   void writeNullAllowedReference(Reference reference) {
@@ -855,8 +859,8 @@
 
   void writeNonNullInstanceMemberReference(Reference reference) {
     writeNonNullReference(reference);
-    Member member = reference.asMember;
-    writeNullAllowedReference(member?.memberSignatureOrigin?.reference);
+    writeNullAllowedReference(
+        getMemberReferenceGetter(reference.asMember?.memberSignatureOrigin));
   }
 
   void writeNonNullReference(Reference reference) {
@@ -954,6 +958,13 @@
     libraryOffsets.add(getBufferOffset());
     writeByte(node.flags);
 
+    assert(
+        mergeCompilationModeOrThrow(
+                compilationMode, node.nonNullableByDefaultCompiledMode) ==
+            compilationMode,
+        "Cannot have ${node.nonNullableByDefaultCompiledMode} "
+        "in component with mode $compilationMode");
+
     writeUInt30(node.languageVersion.major);
     writeUInt30(node.languageVersion.minor);
 
@@ -1102,20 +1113,12 @@
     }
   }
 
-  int _encodeClassFlags(int flags, ClassLevel level) {
-    assert((flags & Class.LevelMask) == 0);
-    final levelIndex = level.index - 1;
-    assert((levelIndex & Class.LevelMask) == levelIndex);
-    return flags | levelIndex;
-  }
-
   @override
   void visitClass(Class node) {
     classOffsets.add(getBufferOffset());
 
     if (node.isAnonymousMixin) _currentlyInNonimplementation = true;
 
-    int flags = _encodeClassFlags(node.flags, node.level);
     if (node.canonicalName == null) {
       throw new ArgumentError('Missing canonical name for $node');
     }
@@ -1126,7 +1129,7 @@
     writeOffset(node.fileOffset);
     writeOffset(node.fileEndOffset);
 
-    writeByte(flags);
+    writeByte(node.flags);
     writeStringReference(node.name ?? '');
 
     enterScope(memberScope: true);
@@ -1164,7 +1167,7 @@
     }
     enterScope(memberScope: true);
     writeByte(Tag.Constructor);
-    writeNonNullCanonicalNameReference(getCanonicalNameOfMember(node));
+    writeNonNullCanonicalNameReference(getCanonicalNameOfMemberGetter(node));
     writeUriReference(node.fileUri);
     writeOffset(node.startFileOffset);
     writeOffset(node.fileOffset);
@@ -1219,7 +1222,7 @@
 
     enterScope(memberScope: true);
     writeByte(Tag.Procedure);
-    writeNonNullCanonicalNameReference(getCanonicalNameOfMember(node));
+    writeNonNullCanonicalNameReference(getCanonicalNameOfMemberGetter(node));
     writeUriReference(node.fileUri);
     writeOffset(node.startFileOffset);
     writeOffset(node.fileOffset);
@@ -1243,12 +1246,13 @@
 
   @override
   void visitField(Field node) {
-    if (node.canonicalName == null) {
+    if (node.getterCanonicalName == null || node.setterCanonicalName == null) {
       throw new ArgumentError('Missing canonical name for $node');
     }
     enterScope(memberScope: true);
     writeByte(Tag.Field);
-    writeNonNullCanonicalNameReference(getCanonicalNameOfMember(node));
+    writeNonNullCanonicalNameReference(getCanonicalNameOfMemberGetter(node));
+    writeNonNullCanonicalNameReference(getCanonicalNameOfMemberSetter(node));
     writeUriReference(node.fileUri);
     writeOffset(node.fileOffset);
     writeOffset(node.fileEndOffset);
@@ -1270,7 +1274,7 @@
         typeParameters: node.typeParameters,
         memberScope: true,
         variableScope: true);
-    writeNonNullCanonicalNameReference(getCanonicalNameOfMember(node));
+    writeNonNullCanonicalNameReference(getCanonicalNameOfMemberGetter(node));
     writeUriReference(node.fileUri);
     writeOffset(node.fileOffset);
     writeOffset(node.fileEndOffset);
@@ -1462,6 +1466,7 @@
   @override
   void visitMethodInvocation(MethodInvocation node) {
     writeByte(Tag.MethodInvocation);
+    writeByte(node.flags);
     writeOffset(node.fileOffset);
     writeNode(node.receiver);
     writeName(node.name);
@@ -1807,6 +1812,8 @@
     _variableIndexer ??= new VariableIndexer();
     _variableIndexer.pushScope();
     writeByte(Tag.Block);
+    writeOffset(node.fileOffset);
+    writeOffset(node.fileEndOffset);
     writeNodeList(node.statements);
     _variableIndexer.popScope();
   }
@@ -2098,6 +2105,24 @@
   }
 
   @override
+  void visitNullType(NullType node) {
+    // TODO(dmitryas): Remove special treatment of Null when the VM supports the
+    // new encoding: just write the tag.
+    assert(_knownCanonicalNameNonRootTops != null &&
+        _knownCanonicalNameNonRootTops.isNotEmpty);
+    CanonicalName root = _knownCanonicalNameNonRootTops.first;
+    while (!root.isRoot) {
+      root = root.parent;
+    }
+    CanonicalName canonicalNameOfNull =
+        root.getChild("dart:core").getChild("Null");
+    writeByte(Tag.SimpleInterfaceType);
+    writeByte(node.declaredNullability.index);
+    checkCanonicalName(canonicalNameOfNull);
+    writeUInt30(canonicalNameOfNull.index + 1);
+  }
+
+  @override
   void visitSupertype(Supertype node) {
     // Writing nullability below is only necessary because
     // BinaryBuilder.readSupertype reads the supertype as an InterfaceType and
diff --git a/pkg/kernel/lib/binary/tag.dart b/pkg/kernel/lib/binary/tag.dart
index 2bbc968..5b46f8e 100644
--- a/pkg/kernel/lib/binary/tag.dart
+++ b/pkg/kernel/lib/binary/tag.dart
@@ -146,7 +146,7 @@
   /// Internal version of kernel binary format.
   /// Bump it when making incompatible changes in kernel binaries.
   /// Keep in sync with runtime/vm/kernel_binary.h, pkg/kernel/binary.md.
-  static const int BinaryFormatVersion = 46;
+  static const int BinaryFormatVersion = 50;
 }
 
 abstract class ConstantTag {
diff --git a/pkg/kernel/lib/canonical_name.dart b/pkg/kernel/lib/canonical_name.dart
index 95acedd..526c32e 100644
--- a/pkg/kernel/lib/canonical_name.dart
+++ b/pkg/kernel/lib/canonical_name.dart
@@ -122,15 +122,38 @@
         : getChild(name.text);
   }
 
-  CanonicalName getChildFromMember(Member member) {
-    return getChild(getMemberQualifier(member))
-        .getChildFromQualifiedName(member.name);
+  CanonicalName getChildFromProcedure(Procedure procedure) {
+    return getChild(getProcedureQualifier(procedure))
+        .getChildFromQualifiedName(procedure.name);
+  }
+
+  CanonicalName getChildFromField(Field field) {
+    return getChild('@fields').getChildFromQualifiedName(field.name);
+  }
+
+  CanonicalName getChildFromFieldSetter(Field field) {
+    return getChild('@=fields').getChildFromQualifiedName(field.name);
+  }
+
+  CanonicalName getChildFromConstructor(Constructor constructor) {
+    return getChild('@constructors')
+        .getChildFromQualifiedName(constructor.name);
+  }
+
+  CanonicalName getChildFromRedirectingFactoryConstructor(
+      RedirectingFactoryConstructor redirectingFactoryConstructor) {
+    return getChild('@factories')
+        .getChildFromQualifiedName(redirectingFactoryConstructor.name);
   }
 
   CanonicalName getChildFromFieldWithName(Name name) {
     return getChild('@fields').getChildFromQualifiedName(name);
   }
 
+  CanonicalName getChildFromFieldSetterWithName(Name name) {
+    return getChild('@=fields').getChildFromQualifiedName(name);
+  }
+
   CanonicalName getChildFromTypedef(Typedef typedef_) {
     return getChild('@typedefs').getChild(typedef_.name);
   }
@@ -210,22 +233,10 @@
     return reference ??= (new Reference()..canonicalName = this);
   }
 
-  static String getMemberQualifier(Member member) {
-    if (member is Procedure) {
-      if (member.isGetter) return '@getters';
-      if (member.isSetter) return '@setters';
-      if (member.isFactory) return '@factories';
-      return '@methods';
-    }
-    if (member is Field) {
-      return '@fields';
-    }
-    if (member is Constructor) {
-      return '@constructors';
-    }
-    if (member is RedirectingFactoryConstructor) {
-      return '@factories';
-    }
-    throw 'Unexpected member: $member';
+  static String getProcedureQualifier(Procedure procedure) {
+    if (procedure.isGetter) return '@getters';
+    if (procedure.isSetter) return '@setters';
+    if (procedure.isFactory) return '@factories';
+    return '@methods';
   }
 }
diff --git a/pkg/kernel/lib/class_hierarchy.dart b/pkg/kernel/lib/class_hierarchy.dart
index 9f8500c..cb03a01 100644
--- a/pkg/kernel/lib/class_hierarchy.dart
+++ b/pkg/kernel/lib/class_hierarchy.dart
@@ -29,8 +29,8 @@
 
   /// Returns the instantiation of [superclass] that is implemented by [type],
   /// or `null` if [type] does not implement [superclass] at all.
-  InterfaceType getTypeAsInstanceOf(InterfaceType type, Class superclass,
-      Library clientLibrary, CoreTypes coreTypes);
+  InterfaceType getTypeAsInstanceOf(
+      InterfaceType type, Class superclass, Library clientLibrary);
 
   /// Returns the type arguments of the instantiation of [superclass] that is
   /// implemented by [type], or `null` if [type] does not implement [superclass]
@@ -164,6 +164,16 @@
   /// mixin application (i.e. [Class.mixedInType]).
   bool isUsedAsMixin(Class class_);
 
+  /// True if the given class is extended by another class using `extends`.
+  bool isExtended(Class class_);
+
+  /// Returns the set of libraries for which this class hierarchy can be
+  /// queried.
+  ///
+  /// Classes outside the set of known libraries are not part of the internal
+  /// model and queries about such classes will fail.
+  Iterable<Library> get knownLibraries;
+
   /// Invokes [callback] for every member declared in or inherited by [class_]
   /// that overrides or implements a member in a supertype of [class_]
   /// (or in rare cases, overrides a member declared in [class_]).
@@ -547,6 +557,11 @@
     return infoFor(class_).directMixers.isNotEmpty;
   }
 
+  @override
+  bool isExtended(Class class_) {
+    return infoFor(class_).directExtenders.isNotEmpty;
+  }
+
   List<_ClassInfo> _getRankedSuperclassInfos(_ClassInfo info) {
     if (info.leastUpperBoundInfos != null) return info.leastUpperBoundInfos;
     var heap = new _LubHeap()..add(info);
@@ -598,8 +613,8 @@
     // LLUB(Null, List<dynamic>*) = List<dynamic>*.  In opt-in libraries the
     // rules imply that LLUB(Null, List<dynamic>*) = List<dynamic>?.
     if (!clientLibrary.isNonNullableByDefault) {
-      if (type1 == coreTypes.nullType) return type2;
-      if (type2 == coreTypes.nullType) return type1;
+      if (type1 is NullType) return type2;
+      if (type2 is NullType) return type1;
     }
 
     _ClassInfo info1 = infoFor(type1.classNode);
@@ -707,16 +722,15 @@
   }
 
   @override
-  InterfaceType getTypeAsInstanceOf(InterfaceType type, Class superclass,
-      Library clientLibrary, CoreTypes coreTypes) {
+  InterfaceType getTypeAsInstanceOf(
+      InterfaceType type, Class superclass, Library clientLibrary) {
     List<DartType> typeArguments =
         getTypeArgumentsAsInstanceOf(type, superclass);
     if (typeArguments == null) return null;
     // The return value should be a legacy type if it's computed for an
     // opted-out library, unless the return value is Null? which is always
     // nullable.
-    Nullability nullability = superclass == coreTypes.nullClass ||
-            clientLibrary.isNonNullableByDefault
+    Nullability nullability = clientLibrary.isNonNullableByDefault
         ? type.nullability
         : Nullability.legacy;
     return new InterfaceType(superclass, nullability, typeArguments);
@@ -750,7 +764,12 @@
   Member getDispatchTarget(Class class_, Name name, {bool setter: false}) {
     List<Member> list =
         _buildImplementedMembers(class_, infoFor(class_), setters: setter);
-    return ClassHierarchy.findMemberByName(list, name);
+    Member member = ClassHierarchy.findMemberByName(list, name);
+    assert(
+        member == null || !member.isAbstract,
+        "Abstract member $member found as dispatch target "
+        "for $name on $class_");
+    return member;
   }
 
   @override
diff --git a/pkg/kernel/lib/clone.dart b/pkg/kernel/lib/clone.dart
index 507d6a1..c14b8d16 100644
--- a/pkg/kernel/lib/clone.dart
+++ b/pkg/kernel/lib/clone.dart
@@ -158,7 +158,8 @@
 
   visitMethodInvocation(MethodInvocation node) {
     return new MethodInvocation.byReference(clone(node.receiver), node.name,
-        clone(node.arguments), node.interfaceTargetReference);
+        clone(node.arguments), node.interfaceTargetReference)
+      ..flags = node.flags;
   }
 
   visitSuperMethodInvocation(SuperMethodInvocation node) {
@@ -330,7 +331,8 @@
   }
 
   visitBlock(Block node) {
-    return new Block(node.statements.map(clone).toList());
+    return new Block(node.statements.map(clone).toList())
+      ..fileOffset = _cloneFileOffset(node.fileOffset);
   }
 
   visitAssertBlock(AssertBlock node) {
@@ -639,7 +641,7 @@
     return result;
   }
 
-  cloneProcedure(Procedure node, Procedure referenceFrom) {
+  Procedure cloneProcedure(Procedure node, Procedure referenceFrom) {
     final Uri activeFileUriSaved = _activeFileUri;
     _activeFileUri = node.fileUri ?? _activeFileUri;
 
@@ -663,7 +665,7 @@
     return result;
   }
 
-  cloneField(Field node, Field referenceFrom) {
+  Field cloneField(Field node, Field referenceFrom) {
     final Uri activeFileUriSaved = _activeFileUri;
     _activeFileUri = node.fileUri ?? _activeFileUri;
 
@@ -679,7 +681,8 @@
         hasImplicitSetter: node.hasImplicitSetter,
         transformerFlags: node.transformerFlags,
         fileUri: _activeFileUri,
-        reference: referenceFrom?.reference)
+        getterReference: referenceFrom?.getterReference,
+        setterReference: referenceFrom?.setterReference)
       ..annotations = cloneAnnotations && !node.annotations.isEmpty
           ? node.annotations.map(super.clone).toList()
           : const <Expression>[]
@@ -691,7 +694,8 @@
     return result;
   }
 
-  cloneRedirectingFactoryConstructor(RedirectingFactoryConstructor node,
+  RedirectingFactoryConstructor cloneRedirectingFactoryConstructor(
+      RedirectingFactoryConstructor node,
       RedirectingFactoryConstructor referenceFrom) {
     final Uri activeFileUriSaved = _activeFileUri;
     _activeFileUri = node.fileUri ?? _activeFileUri;
diff --git a/pkg/kernel/lib/core_types.dart b/pkg/kernel/lib/core_types.dart
index d67ff48..24f0250 100644
--- a/pkg/kernel/lib/core_types.dart
+++ b/pkg/kernel/lib/core_types.dart
@@ -44,7 +44,7 @@
 
   Library _coreLibrary;
   Class _objectClass;
-  Class _nullClass;
+  Class _deprecatedNullClass;
   Class _boolClass;
   Class _intClass;
   Class _numClass;
@@ -82,22 +82,24 @@
   Class _deprecatedFutureOrClass;
   Class _stackTraceClass;
   Class _streamClass;
-  Class _asyncAwaitCompleterClass;
-  Constructor _asyncAwaitCompleterConstructor;
-  Procedure _asyncAwaitCompleterStartProcedure;
+  Class _futureImplClass;
+  Constructor _futureImplConstructor;
+  Procedure _completeOnAsyncErrorProcedure;
   Procedure _completeOnAsyncReturnProcedure;
-  Procedure _completerCompleteError;
   Constructor _syncIterableDefaultConstructor;
   Constructor _streamIteratorDefaultConstructor;
   Constructor _asyncStarStreamControllerDefaultConstructor;
-  Procedure _asyncStarListenHelperProcedure;
   Procedure _asyncStarMoveNextHelperProcedure;
   Procedure _asyncStackTraceHelperProcedure;
   Procedure _asyncThenWrapperHelperProcedure;
   Procedure _asyncErrorWrapperHelperProcedure;
   Procedure _awaitHelperProcedure;
   Procedure _boolFromEnvironment;
-  Constructor _lateInitializationErrorConstructor;
+  Constructor _lateInitializationFieldAssignedDuringInitializationConstructor;
+  Constructor _lateInitializationFieldNotInitializedConstructor;
+  Constructor _lateInitializationLocalNotInitializedConstructor;
+  Constructor _lateInitializationFieldAlreadyInitializedConstructor;
+  Constructor _lateInitializationLocalAlreadyInitializedConstructor;
   Constructor _reachabilityErrorConstructor;
 
   /// The `dart:mirrors` library, or `null` if the component does not use it.
@@ -111,7 +113,7 @@
   InterfaceType _objectLegacyRawType;
   InterfaceType _objectNullableRawType;
   InterfaceType _objectNonNullableRawType;
-  InterfaceType _nullType;
+  InterfaceType _deprecatedNullType;
   InterfaceType _boolLegacyRawType;
   InterfaceType _boolNullableRawType;
   InterfaceType _boolNonNullableRawType;
@@ -226,11 +228,6 @@
         'dart:async', '_AsyncStarStreamController', 'get:stream');
   }
 
-  Procedure get asyncStarListenHelper {
-    return _asyncStarListenHelperProcedure ??=
-        index.getTopLevelMember('dart:async', '_asyncStarListenHelper');
-  }
-
   Procedure get asyncStarMoveNextHelper {
     return _asyncStarMoveNextHelperProcedure ??=
         index.getTopLevelMember('dart:async', '_asyncStarMoveNextHelper');
@@ -255,19 +252,13 @@
     return _boolClass ??= index.getClass('dart:core', 'bool');
   }
 
-  Class get asyncAwaitCompleterClass {
-    return _asyncAwaitCompleterClass ??=
-        index.getClass('dart:async', '_AsyncAwaitCompleter');
+  Class get futureImplClass {
+    return _futureImplClass ??= index.getClass('dart:async', '_Future');
   }
 
-  Constructor get asyncAwaitCompleterConstructor {
-    return _asyncAwaitCompleterConstructor ??=
-        index.getMember('dart:async', '_AsyncAwaitCompleter', '');
-  }
-
-  Procedure get asyncAwaitCompleterStartProcedure {
-    return _asyncAwaitCompleterStartProcedure ??=
-        index.getMember('dart:async', '_AsyncAwaitCompleter', 'start');
+  Constructor get futureImplConstructor {
+    return _futureImplConstructor ??=
+        index.getMember('dart:async', '_Future', '');
   }
 
   Member get completeOnAsyncReturn {
@@ -275,13 +266,9 @@
         index.getTopLevelMember('dart:async', '_completeOnAsyncReturn');
   }
 
-  Procedure get completerCompleteError {
-    return _completerCompleteError ??=
-        index.getMember('dart:async', 'Completer', 'completeError');
-  }
-
-  Member get completerFuture {
-    return index.getMember('dart:async', 'Completer', 'get:future');
+  Member get completeOnAsyncError {
+    return _completeOnAsyncErrorProcedure ??=
+        index.getTopLevelMember('dart:async', '_completeOnAsyncError');
   }
 
   Library get coreLibrary {
@@ -397,8 +384,8 @@
         index.getMember('dart:core', 'NoSuchMethodError', 'withInvocation');
   }
 
-  Class get nullClass {
-    return _nullClass ??= index.getClass('dart:core', 'Null');
+  Class get deprecatedNullClass {
+    return _deprecatedNullClass ??= index.getClass('dart:core', 'Null');
   }
 
   Class get numClass {
@@ -544,9 +531,10 @@
   }
 
   /// Null is always nullable, so there's only one raw type for that class.
-  InterfaceType get nullType {
-    return _nullType ??= _nullableRawTypes[nullClass] ??=
-        new InterfaceType(nullClass, Nullability.nullable, const <DartType>[]);
+  InterfaceType get deprecatedNullType {
+    return _deprecatedNullType ??= _nullableRawTypes[deprecatedNullClass] ??=
+        new InterfaceType(
+            deprecatedNullClass, Nullability.nullable, const <DartType>[]);
   }
 
   InterfaceType get boolLegacyRawType {
@@ -1232,9 +1220,30 @@
     return result;
   }
 
-  Constructor get lateInitializationErrorConstructor {
-    return _lateInitializationErrorConstructor ??=
-        index.getMember('dart:_internal', 'LateInitializationErrorImpl', '');
+  Constructor
+      get lateInitializationFieldAssignedDuringInitializationConstructor {
+    return _lateInitializationFieldAssignedDuringInitializationConstructor ??=
+        index.getMember('dart:_internal', 'LateError', 'fieldADI');
+  }
+
+  Constructor get lateInitializationFieldNotInitializedConstructor {
+    return _lateInitializationFieldNotInitializedConstructor ??=
+        index.getMember('dart:_internal', 'LateError', 'fieldNI');
+  }
+
+  Constructor get lateInitializationLocalNotInitializedConstructor {
+    return _lateInitializationLocalNotInitializedConstructor ??=
+        index.getMember('dart:_internal', 'LateError', 'localNI');
+  }
+
+  Constructor get lateInitializationFieldAlreadyInitializedConstructor {
+    return _lateInitializationFieldAlreadyInitializedConstructor ??=
+        index.getMember('dart:_internal', 'LateError', 'fieldAI');
+  }
+
+  Constructor get lateInitializationLocalAlreadyInitializedConstructor {
+    return _lateInitializationLocalAlreadyInitializedConstructor ??=
+        index.getMember('dart:_internal', 'LateError', 'localAI');
   }
 
   Constructor get reachabilityErrorConstructor {
@@ -1349,7 +1358,7 @@
     if (type is InvalidType) return false;
 
     // NULL(Null) is true.
-    if (type == nullType) return true;
+    if (type is NullType) return true;
 
     // NULL(T?) is true iff NULL(T) or BOTTOM(T).
     // NULL(T*) is true iff NULL(T) or BOTTOM(T).
diff --git a/pkg/kernel/lib/default_language_version.dart b/pkg/kernel/lib/default_language_version.dart
index eb90980..465988e 100644
--- a/pkg/kernel/lib/default_language_version.dart
+++ b/pkg/kernel/lib/default_language_version.dart
@@ -9,4 +9,4 @@
 
 import "ast.dart";
 
-Version defaultLanguageVersion = const Version(2, 11);
+Version defaultLanguageVersion = const Version(2, 12);
diff --git a/pkg/kernel/lib/naive_type_checker.dart b/pkg/kernel/lib/naive_type_checker.dart
index 1178a0c..2eb77b3 100644
--- a/pkg/kernel/lib/naive_type_checker.dart
+++ b/pkg/kernel/lib/naive_type_checker.dart
@@ -255,6 +255,11 @@
 
   @override
   void checkUnresolvedInvocation(DartType receiver, TreeNode where) {
+    while (receiver is TypeParameterType) {
+      TypeParameterType typeParameterType = receiver;
+      receiver = typeParameterType.bound;
+    }
+
     if (receiver is DynamicType) {
       return;
     }
diff --git a/pkg/kernel/lib/src/bounds_checks.dart b/pkg/kernel/lib/src/bounds_checks.dart
index 3bbef8a..7c5ee41 100644
--- a/pkg/kernel/lib/src/bounds_checks.dart
+++ b/pkg/kernel/lib/src/bounds_checks.dart
@@ -15,6 +15,7 @@
         Library,
         NamedType,
         NeverType,
+        NullType,
         Nullability,
         TypeParameter,
         TypeParameterType,
@@ -267,7 +268,7 @@
     DartType bottomType,
     {bool allowSuperBounded = false}) {
   assert(bottomType == const NeverType(Nullability.nonNullable) ||
-      bottomType == typeEnvironment.nullType);
+      bottomType is NullType);
   List<TypeParameter> variables;
   List<DartType> arguments;
   List<TypeArgumentIssue> typedefRhsResult;
@@ -435,7 +436,7 @@
     {Map<FunctionType, List<DartType>> typedefInstantiations}) {
   assert(arguments.length == parameters.length);
   assert(bottomType == const NeverType(Nullability.nonNullable) ||
-      bottomType == typeEnvironment.nullType);
+      bottomType is NullType);
   List<TypeArgumentIssue> result;
   var substitutionMap = <TypeParameter, DartType>{};
   for (int i = 0; i < arguments.length; ++i) {
@@ -688,6 +689,12 @@
   }
 
   @override
+  int visitNullType(
+      NullType node, Map<TypeParameter, Map<DartType, int>> computedVariances) {
+    return Variance.unrelated;
+  }
+
+  @override
   int visitVoidType(
       VoidType node, Map<TypeParameter, Map<DartType, int>> computedVariances) {
     return Variance.unrelated;
diff --git a/pkg/kernel/lib/src/dart_type_equivalence.dart b/pkg/kernel/lib/src/dart_type_equivalence.dart
index 35def49..35eeff4 100644
--- a/pkg/kernel/lib/src/dart_type_equivalence.dart
+++ b/pkg/kernel/lib/src/dart_type_equivalence.dart
@@ -8,6 +8,7 @@
 
 class DartTypeEquivalence implements DartTypeVisitor1<bool, DartType> {
   final CoreTypes coreTypes;
+  // TODO(dmitryas): Implement also equateBottomTypes.
   final bool equateTopTypes;
   final bool ignoreAllNullabilities;
   final bool ignoreTopLevelNullability;
@@ -198,6 +199,11 @@
   }
 
   @override
+  bool visitNullType(NullType node, DartType other) {
+    return other is NullType;
+  }
+
+  @override
   bool visitNeverType(NeverType node, DartType other) {
     if (other is NeverType) {
       return _checkAndRegisterNullabilities(
diff --git a/pkg/kernel/lib/src/future_value_type.dart b/pkg/kernel/lib/src/future_value_type.dart
index 939bb69..e3fd270 100644
--- a/pkg/kernel/lib/src/future_value_type.dart
+++ b/pkg/kernel/lib/src/future_value_type.dart
@@ -82,6 +82,12 @@
   }
 
   @override
+  DartType visitNullType(DartType node, CoreTypes coreTypes) {
+    // Otherwise, for all S, futureValueType(S) = Object?.
+    return coreTypes.objectNullableRawType;
+  }
+
+  @override
   DartType visitTypeParameterType(DartType node, CoreTypes coreTypes) {
     // Otherwise, for all S, futureValueType(S) = Object?.
     return coreTypes.objectNullableRawType;
diff --git a/pkg/kernel/lib/src/hierarchy_based_type_environment.dart b/pkg/kernel/lib/src/hierarchy_based_type_environment.dart
index eadc8fa..9474496 100644
--- a/pkg/kernel/lib/src/hierarchy_based_type_environment.dart
+++ b/pkg/kernel/lib/src/hierarchy_based_type_environment.dart
@@ -21,20 +21,13 @@
   @override
   InterfaceType getTypeAsInstanceOf(InterfaceType type, Class superclass,
       Library clientLibrary, CoreTypes coreTypes) {
-    return hierarchy.getTypeAsInstanceOf(
-        type, superclass, clientLibrary, coreTypes);
+    return hierarchy.getTypeAsInstanceOf(type, superclass, clientLibrary);
   }
 
   @override
   List<DartType> getTypeArgumentsAsInstanceOf(
       InterfaceType type, Class superclass) {
-    Class typeClass = type.classNode;
-    if (typeClass == superclass) return type.typeArguments;
-    if (typeClass == coreTypes.nullClass) {
-      if (superclass.typeParameters.isEmpty) return const <DartType>[];
-      return new List<DartType>.filled(
-          superclass.typeParameters.length, coreTypes.nullType);
-    }
+    if (type.classNode == superclass) return type.typeArguments;
     return hierarchy.getTypeArgumentsAsInstanceOf(type, superclass);
   }
 
diff --git a/pkg/kernel/lib/src/legacy_erasure.dart b/pkg/kernel/lib/src/legacy_erasure.dart
index 44a5d3a..83c32ce 100644
--- a/pkg/kernel/lib/src/legacy_erasure.dart
+++ b/pkg/kernel/lib/src/legacy_erasure.dart
@@ -71,11 +71,5 @@
   }
 
   @override
-  DartType visitInterfaceType(InterfaceType node) {
-    if (node.classNode == coreTypes.nullClass) return null;
-    return super.visitInterfaceType(node);
-  }
-
-  @override
-  DartType visitNeverType(NeverType node) => coreTypes.nullType;
+  DartType visitNeverType(NeverType node) => const NullType();
 }
diff --git a/pkg/kernel/lib/src/merge_visitor.dart b/pkg/kernel/lib/src/merge_visitor.dart
index 275b7d88..4b1e68b 100644
--- a/pkg/kernel/lib/src/merge_visitor.dart
+++ b/pkg/kernel/lib/src/merge_visitor.dart
@@ -208,6 +208,14 @@
   }
 
   @override
+  DartType visitNullType(NullType a, DartType b) {
+    if (b is NullType) {
+      return a;
+    }
+    return null;
+  }
+
+  @override
   DartType visitInvalidType(InvalidType a, DartType b) => null;
 
   @override
diff --git a/pkg/kernel/lib/src/nnbd_top_merge.dart b/pkg/kernel/lib/src/nnbd_top_merge.dart
index f0c5b4e..5b3634a 100644
--- a/pkg/kernel/lib/src/nnbd_top_merge.dart
+++ b/pkg/kernel/lib/src/nnbd_top_merge.dart
@@ -69,11 +69,6 @@
         // NNBD_TOP_MERGE(Object*, void) = Object?
         return coreTypes.objectNullableRawType;
       }
-    } else if (a == coreTypes.nullType &&
-        b is NeverType &&
-        b.nullability == Nullability.legacy) {
-      // NNBD_TOP_MERGE(Null, Never*) = Null
-      return coreTypes.nullType;
     }
     return super.visitInterfaceType(a, b);
   }
@@ -116,10 +111,19 @@
 
   @override
   DartType visitNeverType(NeverType a, DartType b) {
-    if (a.nullability == Nullability.legacy && b == coreTypes.nullType) {
+    if (a.nullability == Nullability.legacy && b is NullType) {
       // NNBD_TOP_MERGE(Never*, Null) = Null
-      return coreTypes.nullType;
+      return const NullType();
     }
     return super.visitNeverType(a, b);
   }
+
+  @override
+  DartType visitNullType(NullType a, DartType b) {
+    if (b is NeverType && b.nullability == Nullability.legacy) {
+      // NNBD_TOP_MERGE(Null, Never*) = Null
+      return const NullType();
+    }
+    return super.visitNullType(a, b);
+  }
 }
diff --git a/pkg/kernel/lib/src/non_null.dart b/pkg/kernel/lib/src/non_null.dart
new file mode 100644
index 0000000..14e0c01
--- /dev/null
+++ b/pkg/kernel/lib/src/non_null.dart
@@ -0,0 +1,140 @@
+// 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.md file.
+
+import '../ast.dart';
+
+/// Returns the type defines as `NonNull(type)` in the nnbd specification.
+DartType computeNonNull(DartType type) {
+  return type.accept(const _NonNullVisitor()) ?? type;
+}
+
+/// Visitor that computes the `NonNull` function defined in the nnbd
+/// specification.
+///
+/// The visitor returns `null` if `NonNull(T) = T`.
+class _NonNullVisitor implements DartTypeVisitor<DartType> {
+  const _NonNullVisitor();
+
+  @override
+  DartType defaultDartType(DartType node) {
+    throw new UnsupportedError(
+        "Unexpected DartType ${node} (${node.runtimeType})");
+  }
+
+  @override
+  DartType visitBottomType(BottomType node) => null;
+
+  @override
+  DartType visitDynamicType(DynamicType node) => null;
+
+  @override
+  DartType visitFunctionType(FunctionType node) {
+    if (node.declaredNullability == Nullability.nonNullable) {
+      return null;
+    }
+    return node.withDeclaredNullability(Nullability.nonNullable);
+  }
+
+  @override
+  DartType visitFutureOrType(FutureOrType node) {
+    DartType typeArgument = node.typeArgument.accept(this);
+    if (node.declaredNullability == Nullability.nonNullable &&
+        typeArgument == null) {
+      return null;
+    }
+    return new FutureOrType(
+        typeArgument ?? node.typeArgument, Nullability.nonNullable);
+  }
+
+  @override
+  DartType visitInterfaceType(InterfaceType node) {
+    if (node.declaredNullability == Nullability.nonNullable) {
+      return null;
+    }
+    return node.withDeclaredNullability(Nullability.nonNullable);
+  }
+
+  @override
+  DartType visitInvalidType(InvalidType node) => null;
+
+  @override
+  DartType visitNeverType(NeverType node) {
+    if (node.declaredNullability == Nullability.nonNullable) {
+      return null;
+    }
+    return const NeverType(Nullability.nonNullable);
+  }
+
+  @override
+  DartType visitNullType(NullType node) {
+    return const NeverType(Nullability.nonNullable);
+  }
+
+  @override
+  DartType visitTypeParameterType(TypeParameterType node) {
+    if (node.nullability == Nullability.nonNullable) {
+      return null;
+    }
+    if (node.promotedBound != null) {
+      if (node.promotedBound.nullability == Nullability.nonNullable) {
+        // The promoted bound is already non-nullable so we set the declared
+        // nullability to non-nullable.
+        return node.withDeclaredNullability(Nullability.nonNullable);
+      }
+      DartType promotedBound = node.promotedBound.accept(this);
+      if (promotedBound == null) {
+        // The promoted bound could not be made non-nullable so we set the
+        // declared nullability to undetermined.
+        if (node.declaredNullability == Nullability.undetermined) {
+          return null;
+        }
+        return new TypeParameterType.intersection(
+            node.parameter, Nullability.undetermined, node.promotedBound);
+      } else if (promotedBound.nullability == Nullability.nonNullable) {
+        // The bound could be made non-nullable so we use it as the promoted
+        // bound.
+        return new TypeParameterType.intersection(
+            node.parameter, Nullability.nonNullable, promotedBound);
+      } else {
+        // The bound could not be made non-nullable so we use it as the promoted
+        // bound with undetermined nullability.
+        return new TypeParameterType.intersection(
+            node.parameter, Nullability.undetermined, promotedBound);
+      }
+    } else {
+      if (node.bound.nullability == Nullability.nonNullable) {
+        // The bound is already non-nullable so we set the declared nullability
+        // to non-nullable.
+        return node.withDeclaredNullability(Nullability.nonNullable);
+      }
+      DartType bound = node.bound.accept(this);
+      if (bound == null) {
+        // The bound could not be made non-nullable so we set the declared
+        // nullability to undetermined.
+        if (node.declaredNullability == Nullability.undetermined) {
+          return null;
+        }
+        return node.withDeclaredNullability(Nullability.undetermined);
+      } else {
+        // The nullability is fully determined by the bound so we pass the
+        // default nullability for the declared nullability.
+        return new TypeParameterType.intersection(
+            node.parameter,
+            TypeParameterType.computeNullabilityFromBound(node.parameter),
+            bound);
+      }
+    }
+  }
+
+  @override
+  DartType visitTypedefType(TypedefType node) {
+    if (node.declaredNullability == Nullability.nonNullable) {
+      return null;
+    }
+    return node.withDeclaredNullability(Nullability.nonNullable);
+  }
+
+  @override
+  DartType visitVoidType(VoidType node) => null;
+}
diff --git a/pkg/kernel/lib/src/norm.dart b/pkg/kernel/lib/src/norm.dart
index ac209fb..c8d0f71 100644
--- a/pkg/kernel/lib/src/norm.dart
+++ b/pkg/kernel/lib/src/norm.dart
@@ -132,7 +132,7 @@
 
   @override
   DartType visitNeverType(NeverType node) {
-    if (node.nullability == Nullability.nullable) return coreTypes.nullType;
+    if (node.nullability == Nullability.nullable) return const NullType();
     return null;
   }
 
diff --git a/pkg/kernel/lib/src/replacement_visitor.dart b/pkg/kernel/lib/src/replacement_visitor.dart
index 72ddff6..5aea426 100644
--- a/pkg/kernel/lib/src/replacement_visitor.dart
+++ b/pkg/kernel/lib/src/replacement_visitor.dart
@@ -146,11 +146,6 @@
       // No nullability or type arguments needed to be substituted.
       return null;
     } else {
-      if (node.classNode.name == 'Null' &&
-          node.classNode.enclosingLibrary.importUri.scheme == 'dart' &&
-          node.classNode.enclosingLibrary.importUri.path == 'core') {
-        return null;
-      }
       return new InterfaceType(
           node.classNode,
           newNullability ?? node.nullability,
@@ -195,6 +190,9 @@
   }
 
   @override
+  DartType visitNullType(NullType node) => null;
+
+  @override
   DartType visitInvalidType(InvalidType node) => null;
 
   @override
diff --git a/pkg/kernel/lib/src/standard_bounds.dart b/pkg/kernel/lib/src/standard_bounds.dart
index 2fb3a96..64a1755 100644
--- a/pkg/kernel/lib/src/standard_bounds.dart
+++ b/pkg/kernel/lib/src/standard_bounds.dart
@@ -17,6 +17,7 @@
         Library,
         NamedType,
         NeverType,
+        NullType,
         Nullability,
         TypeParameter,
         TypeParameterType,
@@ -27,6 +28,7 @@
 import '../type_algebra.dart';
 import '../type_environment.dart';
 import 'legacy_erasure.dart';
+import 'non_null.dart';
 
 mixin StandardBounds {
   ClassHierarchyBase get hierarchy;
@@ -159,12 +161,12 @@
     }
 
     // MOREBOTTOM(Null, T) = true.
-    if (s == coreTypes.nullType) {
+    if (s is NullType) {
       return true;
     }
 
     // MOREBOTTOM(S, Null) = false.
-    if (t == coreTypes.nullType) {
+    if (t is NullType) {
       return false;
     }
 
@@ -354,20 +356,20 @@
       if (coreTypes.isObject(type2)) {
         return moretop(type2, type1) ? type1 : type2;
       }
-      if (type2.declaredNullability == Nullability.nonNullable) {
+      if (type2.nullability == Nullability.nonNullable) {
         return type2;
       }
-      type2 = type2.withDeclaredNullability(Nullability.nonNullable);
-      if (type2.declaredNullability == Nullability.nonNullable) {
+      type2 = computeNonNull(type2);
+      if (type2.nullability == Nullability.nonNullable) {
         return type2;
       }
       return const NeverType(Nullability.nonNullable);
     } else if (coreTypes.isObject(type2)) {
-      if (type1.declaredNullability == Nullability.nonNullable) {
+      if (type1.nullability == Nullability.nonNullable) {
         return type1;
       }
-      type1 = type1.withDeclaredNullability(Nullability.nonNullable);
-      if (type1.declaredNullability == Nullability.nonNullable) {
+      type1 = computeNonNull(type1);
+      if (type1.nullability == Nullability.nonNullable) {
         return type1;
       }
       return const NeverType(Nullability.nonNullable);
@@ -397,11 +399,9 @@
     // [intersectNullabilities] to compute the resulting type if the subtype
     // relation is established.
     DartType typeWithoutNullabilityMarker1 =
-        computeTypeWithoutNullabilityMarker(type1, clientLibrary,
-            nullType: coreTypes.nullType);
+        computeTypeWithoutNullabilityMarker(type1, clientLibrary);
     DartType typeWithoutNullabilityMarker2 =
-        computeTypeWithoutNullabilityMarker(type2, clientLibrary,
-            nullType: coreTypes.nullType);
+        computeTypeWithoutNullabilityMarker(type2, clientLibrary);
     if (isSubtypeOf(typeWithoutNullabilityMarker1,
         typeWithoutNullabilityMarker2, SubtypeCheckMode.withNullabilities)) {
       return type1.withDeclaredNullability(intersectNullabilities(
@@ -465,10 +465,10 @@
       DartType type1, DartType type2, Library clientLibrary) {
     // Do legacy erasure on the argument, so that the result types that are
     // computed from arguments are legacy.
-    type1 = type1 == coreTypes.nullType
+    type1 = type1 is NullType
         ? type1
         : type1.withDeclaredNullability(Nullability.legacy);
-    type2 = type2 == coreTypes.nullType
+    type2 = type2 is NullType
         ? type2
         : type2.withDeclaredNullability(Nullability.legacy);
 
@@ -513,8 +513,8 @@
     // SLB(bottom, T) = SLB(T, bottom) = bottom.
     if (type1 is BottomType) return type1;
     if (type2 is BottomType) return type2;
-    if (type1 == coreTypes.nullType) return type1;
-    if (type2 == coreTypes.nullType) return type2;
+    if (type1 is NullType) return type1;
+    if (type2 is NullType) return type2;
 
     // Function types have structural lower bounds.
     if (type1 is FunctionType && type2 is FunctionType) {
@@ -667,12 +667,12 @@
       if (coreTypes.isObject(type2)) {
         return moretop(type1, type2) ? type1 : type2;
       }
-      if (type2.declaredNullability == Nullability.nonNullable) {
+      if (type2.nullability == Nullability.nonNullable) {
         return type1;
       }
       return type1.withDeclaredNullability(Nullability.nullable);
     } else if (coreTypes.isObject(type2)) {
-      if (type1.declaredNullability == Nullability.nonNullable) {
+      if (type1.nullability == Nullability.nonNullable) {
         return type2;
       }
       return type2.withDeclaredNullability(Nullability.nullable);
@@ -773,11 +773,9 @@
     // uses [uniteNullabilities] to compute the resulting type if the subtype
     // relation is established.
     InterfaceType typeWithoutNullabilityMarker1 =
-        computeTypeWithoutNullabilityMarker(type1, clientLibrary,
-            nullType: coreTypes.nullType);
+        computeTypeWithoutNullabilityMarker(type1, clientLibrary);
     InterfaceType typeWithoutNullabilityMarker2 =
-        computeTypeWithoutNullabilityMarker(type2, clientLibrary,
-            nullType: coreTypes.nullType);
+        computeTypeWithoutNullabilityMarker(type2, clientLibrary);
 
     if (isSubtypeOf(typeWithoutNullabilityMarker1,
         typeWithoutNullabilityMarker2, SubtypeCheckMode.withNullabilities)) {
@@ -1276,8 +1274,8 @@
     // SUB(bottom, T) = SUB(T, bottom) = T.
     if (type1 is BottomType) return type2;
     if (type2 is BottomType) return type1;
-    if (type1 == coreTypes.nullType) return type2;
-    if (type2 == coreTypes.nullType) return type1;
+    if (type1 is NullType) return type2;
+    if (type2 is NullType) return type1;
 
     if (type1 is TypeParameterType || type2 is TypeParameterType) {
       return _getNullabilityObliviousTypeParameterStandardUpperBound(
diff --git a/pkg/kernel/lib/src/types.dart b/pkg/kernel/lib/src/types.dart
index 2ab1891..02a4933 100644
--- a/pkg/kernel/lib/src/types.dart
+++ b/pkg/kernel/lib/src/types.dart
@@ -15,6 +15,7 @@
         Library,
         NamedType,
         NeverType,
+        NullType,
         Nullability,
         TypeParameter,
         TypeParameterType,
@@ -110,6 +111,10 @@
     if (s is NeverType) {
       return new IsSubtypeOf.basedSolelyOnNullabilities(s, t);
     }
+    if (s is NullType) {
+      // Rule 4.
+      return new IsSubtypeOf.basedSolelyOnNullabilities(s, t);
+    }
 
     if (t is InterfaceType) {
       Class cls = t.classNode;
@@ -233,6 +238,25 @@
       } else if (s is FutureOrType) {
         return relation.isFutureOrRelated(s, t, this);
       }
+    } else if (t is NullType) {
+      const IsNullTypeSubtypeOf relation = const IsNullTypeSubtypeOf();
+      if (s is DynamicType) {
+        return relation.isDynamicRelated(s, t, this);
+      } else if (s is VoidType) {
+        return relation.isVoidRelated(s, t, this);
+      } else if (s is InterfaceType) {
+        return relation.isInterfaceRelated(s, t, this);
+      } else if (s is FunctionType) {
+        return relation.isFunctionRelated(s, t, this);
+      } else if (s is TypeParameterType) {
+        return s.promotedBound == null
+            ? relation.isTypeParameterRelated(s, t, this)
+            : relation.isIntersectionRelated(s, t, this);
+      } else if (s is TypedefType) {
+        return relation.isTypedefRelated(s, t, this);
+      } else if (s is FutureOrType) {
+        return relation.isFutureOrRelated(s, t, this);
+      }
     } else if (t is NeverType) {
       const IsNeverTypeSubtypeOf relation = const IsNeverTypeSubtypeOf();
       if (s is DynamicType) {
@@ -293,8 +317,7 @@
 
   InterfaceType getTypeAsInstanceOf(InterfaceType type, Class superclass,
       Library clientLibrary, CoreTypes coreTypes) {
-    return hierarchy.getTypeAsInstanceOf(
-        type, superclass, clientLibrary, coreTypes);
+    return hierarchy.getTypeAsInstanceOf(type, superclass, clientLibrary);
   }
 
   List<DartType> getTypeArgumentsAsInstanceOf(
@@ -343,11 +366,6 @@
   @override
   IsSubtypeOf isInterfaceRelated(
       InterfaceType s, InterfaceType t, Types types) {
-    if (s.classNode == types.hierarchy.coreTypes.nullClass) {
-      // This is an optimization, to avoid instantiating unnecessary type
-      // arguments in getKernelTypeAsInstanceOf.
-      return new IsSubtypeOf.basedSolelyOnNullabilities(s, t);
-    }
     List<DartType> asSupertypeArguments =
         types.hierarchy.getTypeArgumentsAsInstanceOf(s, t.classNode);
     if (asSupertypeArguments == null) {
@@ -509,8 +527,8 @@
             /// From the NNBD spec: For each j such that r0j is required, then
             /// there exists an i in n+1...q such that xj = yi, and r1i is
             /// required
-            result =
-                result.and(const IsSubtypeOf.onlyIfIgnoringNullabilities());
+            result = result.and(new IsSubtypeOf.onlyIfIgnoringNullabilities(
+                subtype: s, supertype: t));
           }
         }
         if (sCount == sNamedParameters.length) return const IsSubtypeOf.never();
@@ -526,7 +544,8 @@
         /// From the NNBD spec: For each j such that r0j is required, then there
         /// exists an i in n+1...q such that xj = yi, and r1i is required
         if (sNamedParameter.isRequired && !tNamedParameter.isRequired) {
-          result = result.and(const IsSubtypeOf.onlyIfIgnoringNullabilities());
+          result = result.and(new IsSubtypeOf.onlyIfIgnoringNullabilities(
+              subtype: s, supertype: t));
         }
       }
       for (; sCount < sNamedParameters.length; sCount++) {
@@ -535,7 +554,8 @@
           /// From the NNBD spec: For each j such that r0j is required, then
           /// there exists an i in n+1...q such that xj = yi, and r1i is
           /// required
-          result = result.and(const IsSubtypeOf.onlyIfIgnoringNullabilities());
+          result = result.and(new IsSubtypeOf.onlyIfIgnoringNullabilities(
+              subtype: s, supertype: t));
         }
       }
     }
@@ -544,10 +564,6 @@
 
   @override
   IsSubtypeOf isInterfaceRelated(InterfaceType s, FunctionType t, Types types) {
-    if (s.classNode == types.hierarchy.coreTypes.nullClass) {
-      // Rule 4.
-      return new IsSubtypeOf.basedSolelyOnNullabilities(s, t);
-    }
     return const IsSubtypeOf.never();
   }
 
@@ -637,10 +653,6 @@
   @override
   IsSubtypeOf isInterfaceRelated(
       InterfaceType s, TypeParameterType t, Types types) {
-    if (s.classNode == types.hierarchy.coreTypes.nullClass) {
-      // Rule 4.
-      return new IsSubtypeOf.basedSolelyOnNullabilities(s, t);
-    }
     return const IsSubtypeOf.never();
   }
 
@@ -871,10 +883,6 @@
   @override
   IsSubtypeOf isInterfaceRelated(
       InterfaceType s, TypeParameterType intersection, Types types) {
-    if (s.classNode == types.hierarchy.coreTypes.nullClass) {
-      // Rule 4.
-      return new IsSubtypeOf.basedSolelyOnNullabilities(s, intersection);
-    }
     return const IsSubtypeOf.never();
   }
 
@@ -910,6 +918,48 @@
   }
 }
 
+class IsNullTypeSubtypeOf implements TypeRelation<NullType> {
+  const IsNullTypeSubtypeOf();
+
+  IsSubtypeOf isDynamicRelated(DynamicType s, NullType t, Types types) {
+    return const IsSubtypeOf.never();
+  }
+
+  IsSubtypeOf isVoidRelated(VoidType s, NullType t, Types types) {
+    return const IsSubtypeOf.never();
+  }
+
+  IsSubtypeOf isInterfaceRelated(InterfaceType s, NullType t, Types types) {
+    return const IsSubtypeOf.never();
+  }
+
+  IsSubtypeOf isIntersectionRelated(
+      TypeParameterType intersection, NullType t, Types types) {
+    return types.performNullabilityAwareMutualSubtypesCheck(
+        intersection.promotedBound, t);
+  }
+
+  IsSubtypeOf isFunctionRelated(FunctionType s, NullType t, Types types) {
+    return const IsSubtypeOf.never();
+  }
+
+  IsSubtypeOf isFutureOrRelated(FutureOrType s, NullType t, Types types) {
+    return const IsSubtypeOf.never();
+  }
+
+  IsSubtypeOf isTypeParameterRelated(
+      TypeParameterType s, NullType t, Types types) {
+    // We don't need to combine the check of the bound against [t] with the
+    // check of the nullability of [s] against the nullability of [t] because
+    // [t] is always nullable.
+    return types.performNullabilityAwareSubtypeCheck(s.bound, t);
+  }
+
+  IsSubtypeOf isTypedefRelated(TypedefType s, NullType t, Types types) {
+    return types.performNullabilityAwareSubtypeCheck(s.unalias, t);
+  }
+}
+
 class IsNeverTypeSubtypeOf implements TypeRelation<NeverType> {
   const IsNeverTypeSubtypeOf();
 
@@ -922,17 +972,6 @@
   }
 
   IsSubtypeOf isInterfaceRelated(InterfaceType s, NeverType t, Types types) {
-    if (s.classNode == types.hierarchy.coreTypes.nullClass) {
-      if (t.nullability == Nullability.nullable ||
-          t.nullability == Nullability.legacy) {
-        return const IsSubtypeOf.always();
-      }
-      if (t.nullability == Nullability.nonNullable) {
-        return const IsSubtypeOf.onlyIfIgnoringNullabilities();
-      }
-      throw new StateError(
-          "Unexpected nullability '$t.nullability' of type Never");
-    }
     return const IsSubtypeOf.never();
   }
 
diff --git a/pkg/kernel/lib/testing/type_parser.dart b/pkg/kernel/lib/testing/type_parser.dart
index 4744340..ef288ed 100644
--- a/pkg/kernel/lib/testing/type_parser.dart
+++ b/pkg/kernel/lib/testing/type_parser.dart
@@ -345,7 +345,7 @@
   ParsedType parseType() {
     if (optional("class")) return parseClass();
     if (optional("typedef")) return parseTypedef();
-    ParsedType result;
+    List<ParsedType> results = <ParsedType>[];
     do {
       ParsedType type;
       if (optional("(") || optional("<")) {
@@ -369,12 +369,17 @@
         ParsedNullability parsedNullability = parseNullability();
         type = new ParsedInterfaceType(name, arguments, parsedNullability);
       }
+      results.add(type);
+    } while (optionalAdvance("&"));
+    // Parse `A & B & C` as `A & (B & C)` and not `(A & B) & C`.
+    ParsedType result;
+    for (ParsedType type in results.reversed) {
       if (result == null) {
         result = type;
       } else {
-        result = new ParsedIntersectionType(result, type);
+        result = new ParsedIntersectionType(type, result);
       }
-    } while (optionalAdvance("&"));
+    }
     return result;
   }
 
diff --git a/pkg/kernel/lib/testing/type_parser_environment.dart b/pkg/kernel/lib/testing/type_parser_environment.dart
index 10ffc59f..8989064 100644
--- a/pkg/kernel/lib/testing/type_parser_environment.dart
+++ b/pkg/kernel/lib/testing/type_parser_environment.dart
@@ -16,6 +16,7 @@
         NamedType,
         NeverType,
         Node,
+        NullType,
         Nullability,
         Supertype,
         TreeNode,
@@ -232,6 +233,10 @@
       // Don't return a const object to ensure we test implementations that use
       // identical.
       return new NeverType(interpretParsedNullability(node.parsedNullability));
+    } else if (name == "Null") {
+      // Don't return a const object to ensure we test implementations that use
+      // identical.
+      return new NullType();
     }
     TreeNode declaration = environment.lookupDeclaration(name);
     List<ParsedType> arguments = node.arguments;
diff --git a/pkg/kernel/lib/text/ast_to_text.dart b/pkg/kernel/lib/text/ast_to_text.dart
index 3e253af..e05a4b6 100644
--- a/pkg/kernel/lib/text/ast_to_text.dart
+++ b/pkg/kernel/lib/text/ast_to_text.dart
@@ -169,6 +169,13 @@
   return '$buffer';
 }
 
+String debugComponentToString(Component component) {
+  StringBuffer buffer = new StringBuffer();
+  new Printer(buffer, syntheticNames: new NameSystem())
+      .writeComponentFile(component);
+  return '$buffer';
+}
+
 String componentToString(Component node) {
   StringBuffer buffer = new StringBuffer();
   new Printer(buffer, syntheticNames: new NameSystem())
@@ -1342,6 +1349,16 @@
     writeExpression(node.receiver, Precedence.PRIMARY);
     writeSymbol('.');
     writeInterfaceTarget(node.name, node.interfaceTargetReference);
+    List<String> flags = <String>[];
+    if (node.isInvariant) {
+      flags.add('Invariant');
+    }
+    if (node.isBoundsSafe) {
+      flags.add('BoundsSafe');
+    }
+    if (flags.isNotEmpty) {
+      write('{${flags.join(',')}}');
+    }
     writeNode(node.arguments);
   }
 
@@ -2160,6 +2177,10 @@
     writeNullability(node.nullability);
   }
 
+  visitNullType(NullType node) {
+    writeWord('Null');
+  }
+
   visitInterfaceType(InterfaceType node) {
     writeClassReferenceFromReference(node.className);
     if (node.typeArguments.isNotEmpty) {
diff --git a/pkg/kernel/lib/text/text_serializer.dart b/pkg/kernel/lib/text/text_serializer.dart
index e633d04..42b5bda 100644
--- a/pkg/kernel/lib/text/text_serializer.dart
+++ b/pkg/kernel/lib/text/text_serializer.dart
@@ -822,6 +822,7 @@
   String visitNeverType(NeverType _) => "never";
   String visitTypedefType(TypedefType _) => "typedef";
   String visitFutureOrType(FutureOrType _) => "futureor";
+  String visitNullType(NullType _) => "null-type";
 }
 
 const TextSerializer<InvalidType> invalidTypeSerializer =
@@ -961,6 +962,13 @@
   return new FutureOrType(typeArgument, Nullability.legacy);
 }
 
+TextSerializer<NullType> nullTypeSerializer =
+    new Wrapped(unwrapNullType, wrapNullType, const Nothing());
+
+void unwrapNullType(NullType type) {}
+
+NullType wrapNullType(void ignored) => const NullType();
+
 Case<DartType> dartTypeSerializer =
     new Case.uninitialized(const DartTypeTagger());
 
@@ -1617,8 +1625,8 @@
 const Map<int, String> libraryFlagToName = const {
   Library.SyntheticFlag: "synthetic",
   Library.NonNullableByDefaultFlag: "nnbd",
-  Library.NonNullableByDefaultModeBit1Weak: "nnbd-weak",
-  Library.NonNullableByDefaultModeBit2Strong: "nnbd-strong",
+  Library.NonNullableByDefaultModeBit1: "nnbd-bit1",
+  Library.NonNullableByDefaultModeBit2: "nnbd-bit2",
 };
 
 class LibraryFlagTagger implements Tagger<int> {
@@ -2065,6 +2073,7 @@
     "never": neverTypeSerializer,
     "typedef": typedefTypeSerializer,
     "futureor": futureOrTypeSerializer,
+    "null-type": nullTypeSerializer,
   });
   statementSerializer.registerTags({
     "expr": expressionStatementSerializer,
diff --git a/pkg/kernel/lib/transformations/continuation.dart b/pkg/kernel/lib/transformations/continuation.dart
index 5ec1e6c..3900833 100644
--- a/pkg/kernel/lib/transformations/continuation.dart
+++ b/pkg/kernel/lib/transformations/continuation.dart
@@ -15,6 +15,8 @@
 
 class ContinuationVariables {
   static const awaitJumpVar = ':await_jump_var';
+  static const asyncFuture = ':async_future';
+  static const isSync = ":is_sync";
   static const awaitContextVar = ':await_ctx_var';
   static const asyncCompleter = ':async_completer';
   static const asyncOp = ':async_op';
@@ -28,9 +30,10 @@
   static const stream = ':stream';
   static const syncForIterator = ':sync-for-iterator';
   static const syncOpGen = ':sync_op_gen';
+  static const syncOp = ':sync_op';
   // sync_op(..) parameter.
   static const iteratorParam = ':iterator';
-  // async_op(..) parameters.
+  // (a)sync_op(..) parameters.
   static const exceptionParam = ':exception';
   static const stackTraceParam = ':stack_trace';
 
@@ -409,35 +412,42 @@
     enclosingFunction.body =
         enclosingFunction.body.accept<TreeNode>(shadowRewriter);
 
-    final syncOpType = FunctionType([iteratorParameter.type],
-        helper.coreTypes.boolLegacyRawType, staticTypeContext.nonNullable);
-
-    final syncOpGenVariable = VariableDeclaration(
-        ContinuationVariables.syncOpGen,
-        type: FunctionType([], syncOpType, staticTypeContext.nonNullable));
-
     // TODO(cskau): Figure out why inlining this below causes segfaults.
     // Maybe related to http://dartbug.com/41596 ?
     final syncOpFN = FunctionNode(buildClosureBody(),
-        positionalParameters: [iteratorParameter],
-        requiredParameterCount: 1,
+        positionalParameters: [
+          iteratorParameter,
+          new VariableDeclaration(ContinuationVariables.exceptionParam),
+          new VariableDeclaration(ContinuationVariables.stackTraceParam),
+        ],
+        requiredParameterCount: 3,
+        // Note: SyncYielding functions have no Dart equivalent. Since they are
+        // synchronous, we use Sync. (Note also that the Dart VM backend uses
+        // the Dart async marker to decide if functions are debuggable.)
         asyncMarker: AsyncMarker.SyncYielding,
         dartAsyncMarker: AsyncMarker.Sync,
         returnType: helper.coreTypes.boolLegacyRawType)
       ..fileOffset = enclosingFunction.fileOffset
       ..fileEndOffset = enclosingFunction.fileEndOffset;
+    final syncOpType =
+        syncOpFN.computeThisFunctionType(staticTypeContext.nonNullable);
+
+    final syncOpGenVariable = VariableDeclaration(
+        ContinuationVariables.syncOpGen,
+        type: FunctionType([], syncOpType, staticTypeContext.nonNullable));
+
+    final syncOpVariable = VariableDeclaration(ContinuationVariables.syncOp);
+    final syncOpDecl = FunctionDeclaration(syncOpVariable, syncOpFN);
 
     enclosingFunction.body = Block([
       // :sync_op_gen() {
       //   :await_jump_var;
       //   :await_ctx_var;
-      //   return bool (:iterator) yielding {
+      //   bool sync_op(:iterator, e, st) yielding {
       //     modified <node.body> ...
       //   };
+      //   return sync_op;
       // }
-      // Note: SyncYielding functions have no Dart equivalent. Since they are
-      // synchronous, we use Sync. (Note also that the Dart VM backend uses
-      // the Dart async marker to decide if functions are debuggable.)
       FunctionDeclaration(
           syncOpGenVariable,
           FunctionNode(
@@ -446,7 +456,10 @@
                 ...variableDeclarations(),
                 // Shadow any used function parameters with local copies.
                 ...shadowRewriter.shadowedParameters,
-                ReturnStatement(FunctionExpression(syncOpFN)),
+                // :sync_op(..) { .. }
+                syncOpDecl,
+                // return sync_op;
+                ReturnStatement(VariableGet(syncOpVariable)),
               ]),
               returnType: syncOpType)),
 
@@ -967,7 +980,6 @@
       //
       //   {
       //     :stream = <stream-expression>;
-      //     _asyncStarListenHelper(:stream, :async_op);
       //     _StreamIterator<T> :for-iterator = new _StreamIterator<T>(:stream);
       //     try {
       //       while (await :for-iterator.moveNext()) {
@@ -984,7 +996,6 @@
       //
       //   {
       //     :stream = <stream-expression>;
-      //     _asyncStarListenHelper(:stream, :async_op);
       //     _StreamIterator<T> :for-iterator = new _StreamIterator<T>(:stream);
       //     try {
       //       while (let _ = _asyncStarMoveNextHelper(:stream) in
@@ -1003,13 +1014,6 @@
           initializer: stmt.iterable,
           type: stmt.iterable.getStaticType(staticTypeContext));
 
-      var asyncStarListenHelper = new ExpressionStatement(new StaticInvocation(
-          helper.asyncStarListenHelper,
-          new Arguments([
-            new VariableGet(streamVariable),
-            new VariableGet(nestedClosureVariable)
-          ])));
-
       var forIteratorVariable = VariableDeclaration(
           ContinuationVariables.forIterator,
           initializer: new ConstructorInvocation(
@@ -1073,12 +1077,8 @@
 
       var tryFinally = new TryFinally(tryBody, tryFinalizer);
 
-      var block = new Block(<Statement>[
-        streamVariable,
-        asyncStarListenHelper,
-        forIteratorVariable,
-        tryFinally
-      ]);
+      var block = new Block(
+          <Statement>[streamVariable, forIteratorVariable, tryFinally]);
       block.accept<TreeNode>(this);
       return null;
     } else {
@@ -1285,8 +1285,9 @@
 }
 
 class AsyncFunctionRewriter extends AsyncRewriterBase {
-  VariableDeclaration completerVariable;
   VariableDeclaration returnVariable;
+  VariableDeclaration asyncFutureVariable;
+  VariableDeclaration isSyncVariable;
 
   AsyncFunctionRewriter(HelperNodes helper, FunctionNode enclosingFunction,
       StaticTypeContext staticTypeContext)
@@ -1305,71 +1306,87 @@
       valueType = elementTypeFromAsyncReturnType();
     }
     final DartType returnType =
-        new FutureOrType(valueType, staticTypeContext.nullable);
-    var completerTypeArguments = <DartType>[valueType];
+        FutureOrType(valueType, staticTypeContext.nullable);
+    final futureTypeArguments = <DartType>[valueType];
 
-    final completerType = new InterfaceType(helper.asyncAwaitCompleterClass,
-        staticTypeContext.nonNullable, completerTypeArguments);
-    // final Completer<T> :async_completer = new _AsyncAwaitCompleter<T>();
-    completerVariable = new VariableDeclaration(
-        ContinuationVariables.asyncCompleter,
-        initializer: new ConstructorInvocation(
-            helper.asyncAwaitCompleterConstructor,
-            new Arguments([], types: completerTypeArguments))
+    final futureType = InterfaceType(helper.futureImplClass,
+        staticTypeContext.nonNullable, futureTypeArguments);
+
+    // final _Future<T> :async_future = _Future<T>();
+    asyncFutureVariable = VariableDeclaration(ContinuationVariables.asyncFuture,
+        initializer: ConstructorInvocation(helper.futureImplConstructor,
+            Arguments([], types: futureTypeArguments))
           ..fileOffset = enclosingFunction.body?.fileOffset ?? -1,
         isFinal: true,
-        type: completerType);
-    statements.add(completerVariable);
+        type: futureType);
+    statements.add(asyncFutureVariable);
 
-    returnVariable = new VariableDeclaration(ContinuationVariables.returnValue,
+    // bool :is_sync = false;
+    isSyncVariable = VariableDeclaration(ContinuationVariables.isSync,
+        initializer: BoolLiteral(false),
+        type: helper.coreTypes.boolLegacyRawType);
+    statements.add(isSyncVariable);
+
+    // asy::FutureOr<dynamic>* :return_value;
+    returnVariable = VariableDeclaration(ContinuationVariables.returnValue,
         type: returnType);
     statements.add(returnVariable);
 
     setupAsyncContinuations(statements);
 
-    // :async_completer.start(:async_op);
-    var startStatement = new ExpressionStatement(new MethodInvocation(
-        new VariableGet(completerVariable),
-        new Name('start'),
-        new Arguments([new VariableGet(nestedClosureVariable)]),
-        helper.asyncAwaitCompleterStartProcedure)
-      ..fileOffset = enclosingFunction.fileOffset);
+    // :async_op();
+    final startStatement = ExpressionStatement(MethodInvocation(
+      VariableGet(nestedClosureVariable),
+      Name('call'),
+      Arguments([]),
+    )..fileOffset = enclosingFunction.fileOffset);
     statements.add(startStatement);
-    // return :async_completer.future;
-    var completerGet = new VariableGet(completerVariable);
-    var returnStatement = new ReturnStatement(new PropertyGet(completerGet,
-        new Name('future', helper.asyncLibrary), helper.completerFuture));
-    statements.add(returnStatement);
 
-    enclosingFunction.body = new Block(statements);
+    // :is_sync = true;
+    final setIsSync =
+        ExpressionStatement(VariableSet(isSyncVariable, BoolLiteral(true)));
+    statements.add(setIsSync);
+
+    // return :async_future;
+    statements.add(ReturnStatement(VariableGet(asyncFutureVariable)));
+
+    enclosingFunction.body = Block(statements);
     enclosingFunction.body.parent = enclosingFunction;
     enclosingFunction.asyncMarker = AsyncMarker.Sync;
     return enclosingFunction;
   }
 
+  // :async_op's try-catch catch body:
   Statement buildCatchBody(exceptionVariable, stackTraceVariable) {
-    return new ExpressionStatement(new MethodInvocation(
-        new VariableGet(completerVariable),
-        new Name('completeError'),
-        new Arguments([
-          new VariableGet(exceptionVariable),
-          new VariableGet(stackTraceVariable)
-        ]),
-        helper.completerCompleteError));
+    // _completeOnAsyncError(_future, e, st, :is_sync)
+    return ExpressionStatement(StaticInvocation(
+        helper.completeOnAsyncError,
+        Arguments([
+          VariableGet(asyncFutureVariable),
+          VariableGet(exceptionVariable),
+          VariableGet(stackTraceVariable),
+          VariableGet(isSyncVariable)
+        ])));
   }
 
+  // :async_op's try-catch try body:
   Statement buildReturn(Statement body) {
     // Returns from the body have all been translated into assignments to the
     // return value variable followed by a break from the labeled body.
-    return new Block(<Statement>[
+
+    // .. body ..
+    // _completeOnAsyncReturn(_future, returnVariable, :is_sync)
+    // return;
+    return Block(<Statement>[
       body,
-      new ExpressionStatement(new StaticInvocation(
+      ExpressionStatement(StaticInvocation(
           helper.completeOnAsyncReturn,
-          new Arguments([
-            new VariableGet(completerVariable),
-            new VariableGet(returnVariable)
+          Arguments([
+            VariableGet(asyncFutureVariable),
+            VariableGet(returnVariable),
+            VariableGet(isSyncVariable)
           ]))),
-      new ReturnStatement()..fileOffset = enclosingFunction.fileEndOffset
+      ReturnStatement()..fileOffset = enclosingFunction.fileEndOffset
     ]);
   }
 
@@ -1395,19 +1412,17 @@
   final Member asyncStarStreamControllerClose;
   final Constructor asyncStarStreamControllerConstructor;
   final Member asyncStarStreamControllerStream;
-  final Member asyncStarListenHelper;
   final Member asyncStarMoveNextHelper;
   final Procedure asyncThenWrapper;
   final Procedure awaitHelper;
-  final Class asyncAwaitCompleterClass;
-  final Member completerCompleteError;
-  final Member asyncAwaitCompleterConstructor;
-  final Member asyncAwaitCompleterStartProcedure;
   final Member completeOnAsyncReturn;
-  final Member completerFuture;
+  final Member completeOnAsyncError;
   final Library coreLibrary;
   final CoreTypes coreTypes;
   final Class futureClass;
+  final Class futureOrClass;
+  final Class futureImplClass;
+  final Constructor futureImplConstructor;
   final Class iterableClass;
   final Class streamClass;
   final Member streamIteratorCancel;
@@ -1435,19 +1450,17 @@
       this.asyncStarStreamControllerClose,
       this.asyncStarStreamControllerConstructor,
       this.asyncStarStreamControllerStream,
-      this.asyncStarListenHelper,
       this.asyncStarMoveNextHelper,
       this.asyncThenWrapper,
       this.awaitHelper,
-      this.asyncAwaitCompleterClass,
-      this.completerCompleteError,
-      this.asyncAwaitCompleterConstructor,
-      this.asyncAwaitCompleterStartProcedure,
       this.completeOnAsyncReturn,
-      this.completerFuture,
+      this.completeOnAsyncError,
       this.coreLibrary,
       this.coreTypes,
       this.futureClass,
+      this.futureOrClass,
+      this.futureImplClass,
+      this.futureImplConstructor,
       this.iterableClass,
       this.streamClass,
       this.streamIteratorCancel,
@@ -1475,19 +1488,17 @@
         coreTypes.asyncStarStreamControllerClose,
         coreTypes.asyncStarStreamControllerDefaultConstructor,
         coreTypes.asyncStarStreamControllerStream,
-        coreTypes.asyncStarListenHelper,
         coreTypes.asyncStarMoveNextHelper,
         coreTypes.asyncThenWrapperHelperProcedure,
         coreTypes.awaitHelperProcedure,
-        coreTypes.asyncAwaitCompleterClass,
-        coreTypes.completerCompleteError,
-        coreTypes.asyncAwaitCompleterConstructor,
-        coreTypes.asyncAwaitCompleterStartProcedure,
         coreTypes.completeOnAsyncReturn,
-        coreTypes.completerFuture,
+        coreTypes.completeOnAsyncError,
         coreTypes.coreLibrary,
         coreTypes,
         coreTypes.futureClass,
+        coreTypes.deprecatedFutureOrClass,
+        coreTypes.futureImplClass,
+        coreTypes.futureImplConstructor,
         coreTypes.iterableClass,
         coreTypes.streamClass,
         coreTypes.streamIteratorCancel,
diff --git a/pkg/kernel/lib/transformations/mixin_full_resolution.dart b/pkg/kernel/lib/transformations/mixin_full_resolution.dart
index 8af53bf..345d452 100644
--- a/pkg/kernel/lib/transformations/mixin_full_resolution.dart
+++ b/pkg/kernel/lib/transformations/mixin_full_resolution.dart
@@ -83,8 +83,7 @@
     }
 
     // Ensure super classes have been transformed before this class.
-    if (class_.superclass != null &&
-        class_.superclass.level.index >= ClassLevel.Mixin.index) {
+    if (class_.superclass != null) {
       transformClass(librariesToBeTransformed, processedClasses,
           transformedClasses, class_.superclass, referenceFromIndex);
     }
@@ -94,12 +93,6 @@
     if (!class_.isMixinApplication) return;
     assert(librariesToBeTransformed.contains(enclosingLibrary));
 
-    if (class_.mixedInClass.level.index < ClassLevel.Mixin.index) {
-      throw new Exception(
-          'Class "${class_.name}" mixes in "${class_.mixedInClass.name}" from'
-          ' an external library.  Did you forget --link?');
-    }
-
     transformedClasses.add(class_);
 
     // Clone fields and methods from the mixin class.
@@ -134,7 +127,7 @@
         clone.isGenericCovariantImpl = parameter.isGenericCovariantImpl;
       }
       nonSetters.remove(field.name);
-      class_.addMember(clone);
+      class_.addField(clone);
     }
     class_.procedures.clear();
     class_.procedures..addAll(nonSetters.values)..addAll(setters.values);
@@ -208,7 +201,7 @@
 
         class_.procedures[originalIndex] = clone;
       } else {
-        class_.addMember(clone);
+        class_.addProcedure(clone);
       }
     }
     assert(class_.constructors.isNotEmpty);
diff --git a/pkg/kernel/lib/transformations/track_widget_constructor_locations.dart b/pkg/kernel/lib/transformations/track_widget_constructor_locations.dart
index a47072d..7585b5c 100644
--- a/pkg/kernel/lib/transformations/track_widget_constructor_locations.dart
+++ b/pkg/kernel/lib/transformations/track_widget_constructor_locations.dart
@@ -379,10 +379,10 @@
         type:
             new InterfaceType(_locationClass, clazz.enclosingLibrary.nullable),
         isFinal: true,
-        reference: clazz.reference.canonicalName
+        getterReference: clazz.reference.canonicalName
             ?.getChildFromFieldWithName(fieldName)
             ?.reference);
-    clazz.addMember(locationField);
+    clazz.addField(locationField);
 
     final Set<Constructor> _handledConstructors =
         new Set<Constructor>.identity();
diff --git a/pkg/kernel/lib/transformations/value_class.dart b/pkg/kernel/lib/transformations/value_class.dart
index d56989a..5e21e5c 100644
--- a/pkg/kernel/lib/transformations/value_class.dart
+++ b/pkg/kernel/lib/transformations/value_class.dart
@@ -183,7 +183,7 @@
           positionalParameters: [other]),
       fileUri: cls.fileUri)
     ..fileOffset = cls.fileOffset;
-  cls.addMember(equalsOperator);
+  cls.addProcedure(equalsOperator);
 }
 
 void addHashCode(Class cls, CoreTypes coreTypes, ClassHierarchy hierarchy,
@@ -226,7 +226,7 @@
     targetsHashcode[variable] = targetHashcode;
     targets[variable] = target;
   }
-  cls.addMember(Procedure(
+  cls.addProcedure(Procedure(
       Name("hashCode"),
       ProcedureKind.Getter,
       FunctionNode(
@@ -278,7 +278,7 @@
   }
   DartType returnType =
       coreTypes.stringRawType(cls.enclosingLibrary.nonNullable);
-  cls.addMember(Procedure(
+  cls.addProcedure(Procedure(
       Name("toString"),
       ProcedureKind.Method,
       FunctionNode(ReturnStatement(StringConcatenation(wording)),
@@ -311,7 +311,7 @@
     targets[variable] = target;
   }
 
-  cls.addMember(Procedure(
+  cls.addProcedure(Procedure(
       Name("copyWith"),
       ProcedureKind.Method,
       FunctionNode(
diff --git a/pkg/kernel/lib/type_algebra.dart b/pkg/kernel/lib/type_algebra.dart
index dccad1c..b9ca3949 100644
--- a/pkg/kernel/lib/type_algebra.dart
+++ b/pkg/kernel/lib/type_algebra.dart
@@ -503,6 +503,7 @@
   DartType visitVoidType(VoidType node) => node;
   DartType visitBottomType(BottomType node) => node;
   DartType visitNeverType(NeverType node) => node;
+  DartType visitNullType(NullType node) => node;
 
   DartType visitInterfaceType(InterfaceType node) {
     if (node.typeArguments.isEmpty) return node;
@@ -839,6 +840,7 @@
 
   bool visitBottomType(BottomType node) => false;
   bool visitNeverType(NeverType node) => false;
+  bool visitNullType(NullType node) => false;
   bool visitInvalidType(InvalidType node) => false;
   bool visitDynamicType(DynamicType node) => false;
   bool visitVoidType(VoidType node) => false;
@@ -891,6 +893,7 @@
 
   bool visitBottomType(BottomType node) => false;
   bool visitNeverType(NeverType node) => false;
+  bool visitNullType(NullType node) => false;
   bool visitInvalidType(InvalidType node) => false;
   bool visitDynamicType(DynamicType node) => false;
   bool visitVoidType(VoidType node) => false;
@@ -1011,6 +1014,9 @@
   bool visitNeverType(NeverType node) => true;
 
   @override
+  bool visitNullType(NullType node) => true;
+
+  @override
   bool visitTypeParameterType(TypeParameterType node) {
     return node.promotedBound == null;
   }
@@ -1067,9 +1073,7 @@
 
   @override
   DartType visitInterfaceType(InterfaceType node, CoreTypes coreTypes) {
-    return node == coreTypes.nullType
-        ? node
-        : node.withDeclaredNullability(Nullability.nonNullable);
+    return node.withDeclaredNullability(Nullability.nonNullable);
   }
 
   @override
@@ -1081,6 +1085,9 @@
   }
 
   @override
+  DartType visitNullType(NullType node, CoreTypes coreTypes) => node;
+
+  @override
   DartType visitTypeParameterType(TypeParameterType node, CoreTypes coreTypes) {
     if (node.promotedBound != null) {
       // Intersection types don't have their own nullabilities.
@@ -1197,9 +1204,7 @@
 /// [TypeParameterType]s, the result may be either [Nullability.nonNullable] or
 /// [Nullability.undetermined], depending on the bound.
 DartType computeTypeWithoutNullabilityMarker(
-    DartType type, Library clientLibrary,
-    {DartType nullType}) {
-  assert(nullType != null);
+    DartType type, Library clientLibrary) {
   if (type is TypeParameterType) {
     if (type.promotedBound == null) {
       // The default nullability for library is used when there are no
@@ -1211,7 +1216,7 @@
       // type constructors, so nothing can be peeled off.
       return type;
     }
-  } else if (type == nullType) {
+  } else if (type is NullType) {
     return type;
   } else {
     // For most types, peeling off the nullability constructors means that
@@ -1244,12 +1249,11 @@
 /// String?, Object?, and T? where T is a type parameter.  Types dynamic, void,
 /// and Null are nullable, but aren't considered applications of the nullable
 /// type constructor.
-bool isNullableTypeConstructorApplication(DartType type, {DartType nullType}) {
-  assert(nullType != null);
+bool isNullableTypeConstructorApplication(DartType type) {
   return type.declaredNullability == Nullability.nullable &&
       type is! DynamicType &&
       type is! VoidType &&
-      type != nullType;
+      type is! NullType;
 }
 
 /// Returns true if [type] is an application of the legacy type constructor.
diff --git a/pkg/kernel/lib/type_checker.dart b/pkg/kernel/lib/type_checker.dart
index ff94bf8..2106e8e 100644
--- a/pkg/kernel/lib/type_checker.dart
+++ b/pkg/kernel/lib/type_checker.dart
@@ -249,7 +249,7 @@
     while (type is TypeParameterType) {
       type = (type as TypeParameterType).bound;
     }
-    if (type is BottomType || type is NeverType || type == coreTypes.nullType) {
+    if (type is BottomType || type is NeverType || type is NullType) {
       // The bottom type is a subtype of all types, so it should be allowed.
       return Substitution.bottomForClass(superclass);
     }
diff --git a/pkg/kernel/lib/type_environment.dart b/pkg/kernel/lib/type_environment.dart
index 4ccf611..7e0dedc 100644
--- a/pkg/kernel/lib/type_environment.dart
+++ b/pkg/kernel/lib/type_environment.dart
@@ -36,7 +36,6 @@
 
   InterfaceType get objectLegacyRawType => coreTypes.objectLegacyRawType;
   InterfaceType get objectNullableRawType => coreTypes.objectNullableRawType;
-  InterfaceType get nullType => coreTypes.nullType;
   InterfaceType get functionLegacyRawType => coreTypes.functionLegacyRawType;
 
   /// Returns the type `List<E>` with the given [nullability] and [elementType]
@@ -82,7 +81,7 @@
   }
 
   DartType _withDeclaredNullability(DartType type, Nullability nullability) {
-    if (type == nullType) return type;
+    if (type is NullType) return type;
     return type.withDeclaredNullability(
         uniteNullabilities(type.declaredNullability, nullability));
   }
@@ -270,7 +269,8 @@
                 SubtypeCheckMode.withNullabilities) &&
             isSubtypeOf(type3, coreTypes.intNonNullableRawType,
                 SubtypeCheckMode.withNullabilities)) {
-          // If T1, T2 and T3 are all subtypes of int, the static type of e is int.
+          // If T1, T2 and T3 are all subtypes of int, the static type of e is
+          // int.
           return coreTypes.intNonNullableRawType;
         } else if (isSubtypeOf(type1, coreTypes.doubleNonNullableRawType,
                 SubtypeCheckMode.withNullabilities) &&
@@ -278,7 +278,8 @@
                 SubtypeCheckMode.withNullabilities) &&
             isSubtypeOf(type3, coreTypes.doubleNonNullableRawType,
                 SubtypeCheckMode.withNullabilities)) {
-          // If T1, T2 and T3 are all subtypes of double, the static type of e is double.
+          // If T1, T2 and T3 are all subtypes of double, the static type of e
+          // is double.
           return coreTypes.doubleNonNullableRawType;
         }
       }
@@ -343,10 +344,15 @@
   /// The only state of an [IsSubtypeOf] object.
   final int _value;
 
-  const IsSubtypeOf._internal(int value) : _value = value;
+  final DartType subtype;
+
+  final DartType supertype;
+
+  const IsSubtypeOf._internal(int value, this.subtype, this.supertype)
+      : _value = value;
 
   /// Subtype check succeeds in both modes.
-  const IsSubtypeOf.always() : this._internal(_valueAlways);
+  const IsSubtypeOf.always() : this._internal(_valueAlways, null, null);
 
   /// Subtype check succeeds only if the nullability markers are ignored.
   ///
@@ -356,11 +362,12 @@
   /// mode).  By contraposition, if a subtype check fails for two types when the
   /// nullability markers are ignored, it should also fail for those types in
   /// full-NNBD mode.
-  const IsSubtypeOf.onlyIfIgnoringNullabilities()
-      : this._internal(_valueOnlyIfIgnoringNullabilities);
+  const IsSubtypeOf.onlyIfIgnoringNullabilities(
+      {DartType subtype, DartType supertype})
+      : this._internal(_valueOnlyIfIgnoringNullabilities, subtype, supertype);
 
   /// Subtype check fails in both modes.
-  const IsSubtypeOf.never() : this._internal(_valueNever);
+  const IsSubtypeOf.never() : this._internal(_valueNever, null, null);
 
   /// Checks if two types are in relation based solely on their nullabilities.
   ///
@@ -378,10 +385,12 @@
       if (supertype is InvalidType) {
         return const IsSubtypeOf.always();
       }
-      return const IsSubtypeOf.onlyIfIgnoringNullabilities();
+      return new IsSubtypeOf.onlyIfIgnoringNullabilities(
+          subtype: subtype, supertype: supertype);
     }
     if (supertype is InvalidType) {
-      return const IsSubtypeOf.onlyIfIgnoringNullabilities();
+      return new IsSubtypeOf.onlyIfIgnoringNullabilities(
+          subtype: subtype, supertype: supertype);
     }
 
     if (subtype.isPotentiallyNullable && supertype.isPotentiallyNonNullable) {
@@ -406,7 +415,8 @@
           return const IsSubtypeOf.always();
         }
       }
-      return const IsSubtypeOf.onlyIfIgnoringNullabilities();
+      return new IsSubtypeOf.onlyIfIgnoringNullabilities(
+          subtype: subtype, supertype: supertype);
     }
     return const IsSubtypeOf.always();
   }
@@ -421,7 +431,21 @@
   /// `Rb.and(Rc)` where `Rb` is the result of `B1 <: B2`, `Rc` is the result
   /// of `C1 <: C2`.
   IsSubtypeOf and(IsSubtypeOf other) {
-    return _all[_andValues(_value, other._value)];
+    int resultValue = _andValues(_value, other._value);
+    if (resultValue == IsSubtypeOf._valueOnlyIfIgnoringNullabilities) {
+      // If the type mismatch is due to nullabilities, the mismatching parts are
+      // remembered in either 'this' or [other].  In that case we need to return
+      // exactly one of those objects, so that the information about mismatching
+      // parts is propagated upwards.
+      if (_value == IsSubtypeOf._valueOnlyIfIgnoringNullabilities) {
+        return this;
+      } else {
+        assert(other._value == IsSubtypeOf._valueOnlyIfIgnoringNullabilities);
+        return other;
+      }
+    } else {
+      return _all[resultValue];
+    }
   }
 
   /// Shorts the computation of [and] if `this` is [IsSubtypeOf.never].
@@ -448,7 +472,21 @@
   /// as `Rs.or(Rf)` where `Rs` is the result of `T <: S`, `Rf` is the result of
   /// `T <: Future<S>`.
   IsSubtypeOf or(IsSubtypeOf other) {
-    return _all[_orValues(_value, other._value)];
+    int resultValue = _orValues(_value, other._value);
+    if (resultValue == IsSubtypeOf._valueOnlyIfIgnoringNullabilities) {
+      // If the type mismatch is due to nullabilities, the mismatching parts are
+      // remembered in either 'this' or [other].  In that case we need to return
+      // exactly one of those objects, so that the information about mismatching
+      // parts is propagated upwards.
+      if (_value == IsSubtypeOf._valueOnlyIfIgnoringNullabilities) {
+        return this;
+      } else {
+        assert(other._value == IsSubtypeOf._valueOnlyIfIgnoringNullabilities);
+        return other;
+      }
+    } else {
+      return _all[resultValue];
+    }
   }
 
   /// Shorts the computation of [or] if `this` is [IsSubtypeOf.always].
@@ -491,13 +529,89 @@
   ignoringNullabilities,
 }
 
+abstract class StaticTypeCache {
+  DartType getExpressionType(Expression node, StaticTypeContext context);
+
+  DartType getForInIteratorType(ForInStatement node, StaticTypeContext context);
+
+  DartType getForInElementType(ForInStatement node, StaticTypeContext context);
+}
+
+class StaticTypeCacheImpl implements StaticTypeCache {
+  Map<Expression, DartType> _expressionTypes;
+  Map<ForInStatement, DartType> _forInIteratorTypes;
+  Map<ForInStatement, DartType> _forInElementTypes;
+
+  DartType getExpressionType(Expression node, StaticTypeContext context) {
+    _expressionTypes ??= <Expression, DartType>{};
+    return _expressionTypes[node] ??= node.getStaticTypeInternal(context);
+  }
+
+  DartType getForInIteratorType(
+      ForInStatement node, StaticTypeContext context) {
+    _forInIteratorTypes ??= <ForInStatement, DartType>{};
+    return _forInIteratorTypes[node] ??= node.getIteratorTypeInternal(context);
+  }
+
+  DartType getForInElementType(ForInStatement node, StaticTypeContext context) {
+    _forInElementTypes ??= <ForInStatement, DartType>{};
+    return _forInElementTypes[node] ??= node.getElementTypeInternal(context);
+  }
+}
+
 /// Context object needed for computing `Expression.getStaticType`.
 ///
 /// The [StaticTypeContext] provides access to the [TypeEnvironment] and the
 /// current 'this type' as well as determining the nullability state of the
 /// enclosing library.
-// TODO(johnniwinther): Support static type caching through [StaticTypeContext].
-class StaticTypeContext {
+abstract class StaticTypeContext {
+  /// The [TypeEnvironment] used for the static type computation.
+  ///
+  /// This provides access to the core types and the class hierarchy.
+  TypeEnvironment get typeEnvironment;
+
+  /// The static type of a `this` expression.
+  InterfaceType get thisType;
+
+  /// Creates a static type context for computing static types in the body
+  /// of [member].
+  factory StaticTypeContext(Member member, TypeEnvironment typeEnvironment,
+      {StaticTypeCache cache}) = StaticTypeContextImpl;
+
+  /// Creates a static type context for computing static types of annotations
+  /// in [library].
+  factory StaticTypeContext.forAnnotations(
+      Library library, TypeEnvironment typeEnvironment,
+      {StaticTypeCache cache}) = StaticTypeContextImpl.forAnnotations;
+
+  /// The [Nullability] used for non-nullable types.
+  ///
+  /// For opt out libraries this is [Nullability.legacy].
+  Nullability get nonNullable;
+
+  /// The [Nullability] used for nullable types.
+  ///
+  /// For opt out libraries this is [Nullability.legacy].
+  Nullability get nullable;
+
+  /// Return `true` if the current library is opted in to non-nullable by
+  /// default.
+  bool get isNonNullableByDefault;
+
+  /// Returns the mode under which the current library was compiled.
+  NonNullableByDefaultCompiledMode get nonNullableByDefaultCompiledMode;
+
+  /// Returns the static type of [node].
+  DartType getExpressionType(Expression node);
+
+  /// Returns the static type of the iterator in for-in statement [node].
+  DartType getForInIteratorType(ForInStatement node);
+
+  /// Returns the static type of the element in for-in statement [node].
+  DartType getForInElementType(ForInStatement node);
+}
+
+class StaticTypeContextImpl implements StaticTypeContext {
   /// The [TypeEnvironment] used for the static type computation.
   ///
   /// This provides access to the core types and the class hierarchy.
@@ -512,17 +626,23 @@
   /// The static type of a `this` expression.
   final InterfaceType thisType;
 
+  final StaticTypeCache _cache;
+
   /// Creates a static type context for computing static types in the body
   /// of [member].
-  StaticTypeContext(Member member, this.typeEnvironment)
+  StaticTypeContextImpl(Member member, this.typeEnvironment,
+      {StaticTypeCache cache})
       : _library = member.enclosingLibrary,
         thisType = member.enclosingClass?.getThisType(
-            typeEnvironment.coreTypes, member.enclosingLibrary.nonNullable);
+            typeEnvironment.coreTypes, member.enclosingLibrary.nonNullable),
+        _cache = cache;
 
   /// Creates a static type context for computing static types of annotations
   /// in [library].
-  StaticTypeContext.forAnnotations(this._library, this.typeEnvironment)
-      : thisType = null;
+  StaticTypeContextImpl.forAnnotations(this._library, this.typeEnvironment,
+      {StaticTypeCache cache})
+      : thisType = null,
+        _cache = cache;
 
   /// The [Nullability] used for non-nullable types.
   ///
@@ -541,6 +661,30 @@
   /// Returns the mode under which the current library was compiled.
   NonNullableByDefaultCompiledMode get nonNullableByDefaultCompiledMode =>
       _library.nonNullableByDefaultCompiledMode;
+
+  DartType getExpressionType(Expression node) {
+    if (_cache != null) {
+      return _cache.getExpressionType(node, this);
+    } else {
+      return node.getStaticTypeInternal(this);
+    }
+  }
+
+  DartType getForInIteratorType(ForInStatement node) {
+    if (_cache != null) {
+      return _cache.getForInIteratorType(node, this);
+    } else {
+      return node.getIteratorTypeInternal(this);
+    }
+  }
+
+  DartType getForInElementType(ForInStatement node) {
+    if (_cache != null) {
+      return _cache.getForInElementType(node, this);
+    } else {
+      return node.getElementTypeInternal(this);
+    }
+  }
 }
 
 /// Implementation of [StaticTypeContext] that update its state when entering
@@ -597,7 +741,6 @@
   _FlatStatefulStaticTypeContext(TypeEnvironment typeEnvironment)
       : super._internal(typeEnvironment);
 
-  @override
   Library get _library {
     Library library = _currentLibrary ?? _currentMember?.enclosingLibrary;
     assert(library != null,
@@ -679,6 +822,18 @@
         "Trying to leave $node but current is ${_currentLibrary}.");
     _currentLibrary = null;
   }
+
+  @override
+  DartType getExpressionType(Expression node) =>
+      node.getStaticTypeInternal(this);
+
+  @override
+  DartType getForInIteratorType(ForInStatement node) =>
+      node.getIteratorTypeInternal(this);
+
+  @override
+  DartType getForInElementType(ForInStatement node) =>
+      node.getElementTypeInternal(this);
 }
 
 /// Implementation of [StatefulStaticTypeContext] that use a stack to change
@@ -690,7 +845,6 @@
   _StackedStatefulStaticTypeContext(TypeEnvironment typeEnvironment)
       : super._internal(typeEnvironment);
 
-  @override
   Library get _library {
     assert(_contextStack.isNotEmpty,
         "No library currently associated with StaticTypeContext.");
@@ -766,6 +920,18 @@
         "Inconsistent static type context stack: "
         "Trying to leave $node but current is ${state._node}.");
   }
+
+  @override
+  DartType getExpressionType(Expression node) =>
+      node.getStaticTypeInternal(this);
+
+  @override
+  DartType getForInIteratorType(ForInStatement node) =>
+      node.getIteratorTypeInternal(this);
+
+  @override
+  DartType getForInElementType(ForInStatement node) =>
+      node.getElementTypeInternal(this);
 }
 
 class _StaticTypeContextState {
diff --git a/pkg/kernel/lib/visitor.dart b/pkg/kernel/lib/visitor.dart
index 5cbe74c..1fec5a3 100644
--- a/pkg/kernel/lib/visitor.dart
+++ b/pkg/kernel/lib/visitor.dart
@@ -273,6 +273,7 @@
   R visitTypeParameterType(TypeParameterType node) => defaultDartType(node);
   R visitTypedefType(TypedefType node) => defaultDartType(node);
   R visitNeverType(NeverType node) => defaultDartType(node);
+  R visitNullType(NullType node) => defaultDartType(node);
 }
 
 class DartTypeVisitor1<R, T> {
@@ -289,6 +290,7 @@
       defaultDartType(node, arg);
   R visitTypedefType(TypedefType node, T arg) => defaultDartType(node, arg);
   R visitNeverType(NeverType node, T arg) => defaultDartType(node, arg);
+  R visitNullType(NullType node, T arg) => defaultDartType(node, arg);
 }
 
 /// Visitor for [Constant] nodes.
@@ -526,6 +528,7 @@
   R visitTypeParameterType(TypeParameterType node) => defaultDartType(node);
   R visitTypedefType(TypedefType node) => defaultDartType(node);
   R visitNeverType(NeverType node) => defaultDartType(node);
+  R visitNullType(NullType node) => defaultDartType(node);
 
   // Constants
   R defaultConstant(Constant node) => defaultNode(node);
diff --git a/pkg/kernel/lib/vm/constants_native_effects.dart b/pkg/kernel/lib/vm/constants_native_effects.dart
index 2dc607d..fb52988 100644
--- a/pkg/kernel/lib/vm/constants_native_effects.dart
+++ b/pkg/kernel/lib/vm/constants_native_effects.dart
@@ -45,7 +45,8 @@
       constant.keyType,
       constant.valueType,
     ], <Reference, Constant>{
-      kvPairListField.reference: kvListConstant,
+      // We use getterReference as we refer to the field itself.
+      kvPairListField.getterReference: kvListConstant,
     });
   }
 }
diff --git a/pkg/kernel/problems.md b/pkg/kernel/problems.md
index f064a3f..073789e 100644
--- a/pkg/kernel/problems.md
+++ b/pkg/kernel/problems.md
@@ -17,7 +17,13 @@
 `severity`: An integer representing severity. This should match the index in
 `package:_fe_analyzer_shared/src/messages/severity.dart`.
 
-`uri`: A uri that this problems relates to.
+`uri`: A possibly null uri that this problems relates to. This is the main uri.
+Normally this is not null (but it can be).
+
+`involvedFiles`: A possibly null list of uris involved in this message.
+Normally this is null.
+
+`codeName`: A string identifing the specific error message.
 
 These values are subject to change, but this file will be updated along with any
 such changes. On the code-side these are defined in
diff --git a/pkg/kernel/test/binary/component_mode_test.dart b/pkg/kernel/test/binary/component_mode_test.dart
index b41e2ef..982270d 100644
--- a/pkg/kernel/test/binary/component_mode_test.dart
+++ b/pkg/kernel/test/binary/component_mode_test.dart
@@ -19,7 +19,6 @@
   }
 
   const List<NonNullableByDefaultCompiledMode> modes = const [
-    NonNullableByDefaultCompiledMode.Disabled,
     NonNullableByDefaultCompiledMode.Weak,
     NonNullableByDefaultCompiledMode.Strong,
     NonNullableByDefaultCompiledMode.Agnostic,
@@ -37,7 +36,8 @@
       // Try individually.
       List<int> c1Serialized;
       {
-        Library lib1 = new Library(Uri.parse("foo://bar.dart"));
+        Library lib1 = new Library(Uri.parse("foo://bar.dart"))
+          ..nonNullableByDefaultCompiledMode = c1Mode;
         Component c1 = new Component(libraries: [lib1]);
         setCompileMode(c1, c1Mode);
         c1Serialized = serializeComponent(c1);
@@ -47,7 +47,8 @@
 
       List<int> c2Serialized;
       {
-        Library lib2 = new Library(Uri.parse("foo://baz.dart"));
+        Library lib2 = new Library(Uri.parse("foo://baz.dart"))
+          ..nonNullableByDefaultCompiledMode = c2Mode;
         Component c2 = new Component(libraries: [lib2]);
         setCompileMode(c2, c2Mode);
         c2Serialized = serializeComponent(c2);
@@ -128,12 +129,6 @@
   if (c1Mode == c2Mode) return true;
   if (c1Mode == NonNullableByDefaultCompiledMode.Agnostic) return true;
   if (c2Mode == NonNullableByDefaultCompiledMode.Agnostic) return true;
-  if ((c1Mode == NonNullableByDefaultCompiledMode.Disabled ||
-          c1Mode == NonNullableByDefaultCompiledMode.Weak) &&
-      (c2Mode == NonNullableByDefaultCompiledMode.Disabled ||
-          c2Mode == NonNullableByDefaultCompiledMode.Weak)) {
-    return true;
-  }
   return false;
 }
 
@@ -143,8 +138,6 @@
   if (isOK(c1Mode, c2Mode)) {
     if (c1Mode == NonNullableByDefaultCompiledMode.Agnostic) return c2Mode;
     if (c2Mode == NonNullableByDefaultCompiledMode.Agnostic) return c1Mode;
-    if (c1Mode == NonNullableByDefaultCompiledMode.Disabled) return c1Mode;
-    if (c2Mode == NonNullableByDefaultCompiledMode.Disabled) return c2Mode;
     return c1Mode;
   }
   throw "Not OK combination: $c1Mode and $c2Mode";
diff --git a/pkg/kernel/test/binary/library_flags_test.dart b/pkg/kernel/test/binary/library_flags_test.dart
index d6d8ecf..04630d7 100644
--- a/pkg/kernel/test/binary/library_flags_test.dart
+++ b/pkg/kernel/test/binary/library_flags_test.dart
@@ -46,7 +46,6 @@
     for (bool isNonNullableByDefault in [true, false]) {
       for (NonNullableByDefaultCompiledMode nonNullableByDefaultCompiledMode
           in [
-        NonNullableByDefaultCompiledMode.Disabled,
         NonNullableByDefaultCompiledMode.Weak,
         NonNullableByDefaultCompiledMode.Strong,
         NonNullableByDefaultCompiledMode.Agnostic,
diff --git a/pkg/kernel/test/binary/utils.dart b/pkg/kernel/test/binary/utils.dart
index 801f322..1005909 100644
--- a/pkg/kernel/test/binary/utils.dart
+++ b/pkg/kernel/test/binary/utils.dart
@@ -13,7 +13,9 @@
 }
 
 List<Library> serializationRoundTrip(List<Library> libraries) {
-  Component c = new Component(libraries: libraries);
+  Component c = new Component(libraries: libraries)
+    ..setMainMethodAndMode(
+        null, false, libraries.first.nonNullableByDefaultCompiledMode);
   List<int> bytes = serializeComponent(c);
   Component c2 = loadComponentFromBytes(bytes);
   return c2.libraries;
diff --git a/pkg/kernel/test/class_hierarchy_basic.dart b/pkg/kernel/test/class_hierarchy_basic.dart
index 6179cb0..b2b9322 100644
--- a/pkg/kernel/test/class_hierarchy_basic.dart
+++ b/pkg/kernel/test/class_hierarchy_basic.dart
@@ -11,6 +11,7 @@
 /// A simple implementation of the class hierarchy interface using
 /// hash tables for everything.
 class BasicClassHierarchy implements ClassHierarchy {
+  final Set<Library> knownLibraries;
   final Map<Class, Set<Class>> superclasses = <Class, Set<Class>>{};
   final Map<Class, Set<Class>> superMixtures = <Class, Set<Class>>{};
   final Map<Class, Set<Class>> supertypes = <Class, Set<Class>>{};
@@ -26,8 +27,9 @@
   final List<Class> classes = <Class>[];
   final Map<Class, int> classIndex = <Class, int>{};
 
-  BasicClassHierarchy(Component component) {
-    for (var library in component.libraries) {
+  BasicClassHierarchy(Component component)
+      : knownLibraries = component.libraries.toSet() {
+    for (var library in knownLibraries) {
       for (var classNode in library.classes) {
         buildSuperTypeSets(classNode);
         buildSuperTypeInstantiations(classNode);
diff --git a/pkg/kernel/test/class_hierarchy_test.dart b/pkg/kernel/test/class_hierarchy_test.dart
index 731e054..bd0ad7a 100644
--- a/pkg/kernel/test/class_hierarchy_test.dart
+++ b/pkg/kernel/test/class_hierarchy_test.dart
@@ -167,7 +167,7 @@
         hierarchy.getDispatchTargets(a), unorderedEquals([methodA1, methodA2]));
 
     // Add a member to A, but only update A.
-    a.addMember(methodA3);
+    a.addProcedure(methodA3);
     hierarchy.applyMemberChanges([a]);
     expect(hierarchy.getDispatchTargets(b),
         unorderedEquals([methodA1, methodA2, methodB1]));
@@ -1216,10 +1216,9 @@
 ''');
 
     var b_int = new InterfaceType(b, Nullability.legacy, [int]);
-    expect(hierarchy.getTypeAsInstanceOf(b_int, a, library, coreTypes),
+    expect(hierarchy.getTypeAsInstanceOf(b_int, a, library),
         new InterfaceType(a, Nullability.legacy, [int, bool]));
-    expect(
-        hierarchy.getTypeAsInstanceOf(b_int, objectClass, library, coreTypes),
+    expect(hierarchy.getTypeAsInstanceOf(b_int, objectClass, library),
         new InterfaceType(objectClass, Nullability.legacy));
   }
 
diff --git a/pkg/kernel/test/convert_field_to_setter_getter.dart b/pkg/kernel/test/convert_field_to_setter_getter.dart
new file mode 100644
index 0000000..fc45c7b
--- /dev/null
+++ b/pkg/kernel/test/convert_field_to_setter_getter.dart
@@ -0,0 +1,193 @@
+// Copyright (c) 2020, 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';
+
+import 'package:kernel/ast.dart';
+import 'package:kernel/binary/ast_from_binary.dart';
+import 'package:kernel/binary/ast_to_binary.dart';
+
+main() {
+  final Library lib1 = new Library(Uri.parse('org-dartlang:///lib.dart'));
+  final Field field = new Field(new Name("f"));
+  lib1.addField(field);
+  final Block libProcedureBody = new Block([
+    new ExpressionStatement(new StaticSet(field, new IntLiteral(42))),
+    new ReturnStatement(new StaticGet(field)),
+  ]);
+  final Procedure libProcedure = new Procedure(
+      new Name("method"),
+      ProcedureKind.Method,
+      new FunctionNode(libProcedureBody, returnType: new DynamicType()));
+  lib1.addProcedure(libProcedure);
+
+  final Library lib2 = new Library(Uri.parse('org-dartlang:///lib2.dart'));
+  final Block lib2ProcedureBody = new Block([
+    new ExpressionStatement(new StaticSet(field, new IntLiteral(43))),
+    new ReturnStatement(new StaticGet(field)),
+  ]);
+  final Procedure lib2Procedure = new Procedure(
+      new Name("method"),
+      ProcedureKind.Method,
+      new FunctionNode(lib2ProcedureBody, returnType: new DynamicType()));
+  lib2.addProcedure(lib2Procedure);
+
+  verifyTargets(libProcedure, lib2Procedure, field, field);
+  List<int> writtenBytesFieldOriginal = serialize(lib1, lib2);
+  // Canonical names are now set: Verify that the field is marked as such,
+  // canonical-name-wise.
+  if (field.getterCanonicalName.parent.name != "@fields") {
+    throw "Expected @fields parent, but had "
+        "${field.getterCanonicalName.parent.name}";
+  }
+  if (field.setterCanonicalName.parent.name != "@=fields") {
+    throw "Expected @=fields parent, but had "
+        "${field.setterCanonicalName.parent.name}";
+  }
+
+  // Replace the field with a setter/getter pair.
+  lib1.fields.remove(field);
+  FunctionNode getterFunction = new FunctionNode(new Block([]));
+  Procedure getter = new Procedure(
+      new Name("f"), ProcedureKind.Getter, getterFunction,
+      reference: field.getterReference);
+  // Important: Unbind any old canonical name
+  // (nulling out the canonical name is not enough because it leaves the old
+  // canonical name (which always stays alive) with a pointer to the reference,
+  // meaning that if one tried to rebind it (e.g. if going back to a field from
+  // a setter/getter), the reference wouldn't (because of the way `bindTo` is
+  // implemented) actually have it's canonical name set, and serialization
+  // wouldn't work.)
+  field.getterReference?.canonicalName?.unbind();
+  lib1.addProcedure(getter);
+
+  FunctionNode setterFunction = new FunctionNode(new Block([]),
+      positionalParameters: [new VariableDeclaration("foo")]);
+  Procedure setter = new Procedure(
+      new Name("f"), ProcedureKind.Setter, setterFunction,
+      reference: field.setterReference);
+  // Important: Unbind any old canonical name
+  // (nulling out the canonical name is not enough, see above).
+  field.setterReference?.canonicalName?.unbind();
+  lib1.addProcedure(setter);
+
+  verifyTargets(libProcedure, lib2Procedure, getter, setter);
+  List<int> writtenBytesGetterSetter = serialize(lib1, lib2);
+  // Canonical names are now set: Verify that the getter/setter is marked as
+  // such, canonical-name-wise.
+  if (getter.canonicalName.parent.name != "@getters") {
+    throw "Expected @getters parent, but had "
+        "${getter.canonicalName.parent.name}";
+  }
+  if (setter.canonicalName.parent.name != "@setters") {
+    throw "Expected @setters parent, but had "
+        "${setter.canonicalName.parent.name}";
+  }
+
+  // Replace getter/setter with field.
+  lib1.procedures.remove(getter);
+  lib1.procedures.remove(setter);
+  final Field fieldReplacement = new Field(new Name("f"),
+      getterReference: getter.reference, setterReference: setter.reference);
+  // Important: Unbind any old canonical name
+  // (nulling out the canonical name is not enough, see above).
+  fieldReplacement.getterReference?.canonicalName?.unbind();
+  fieldReplacement.setterReference?.canonicalName?.unbind();
+  lib1.addField(fieldReplacement);
+
+  verifyTargets(
+      libProcedure, lib2Procedure, fieldReplacement, fieldReplacement);
+  List<int> writtenBytesFieldNew = serialize(lib1, lib2);
+  // Canonical names are now set: Verify that the field is marked as such,
+  // canonical-name-wise.
+  if (fieldReplacement.getterCanonicalName.parent.name != "@fields") {
+    throw "Expected @fields parent, but had "
+        "${fieldReplacement.getterCanonicalName.parent.name}";
+  }
+  if (fieldReplacement.setterCanonicalName.parent.name != "@=fields") {
+    throw "Expected @=fields parent, but had "
+        "${fieldReplacement.setterCanonicalName.parent.name}";
+  }
+
+  // Load the written stuff and ensure it is as expected.
+  // First one has a field.
+  Component componentLoaded = new Component();
+  new BinaryBuilder(writtenBytesFieldOriginal)
+      .readSingleFileComponent(componentLoaded);
+  verifyTargets(
+      componentLoaded.libraries[0].procedures.single,
+      componentLoaded.libraries[1].procedures.single,
+      componentLoaded.libraries[0].fields.single,
+      componentLoaded.libraries[0].fields.single);
+
+  // Second one has a getter/setter pair.
+  componentLoaded = new Component();
+  new BinaryBuilder(writtenBytesGetterSetter)
+      .readSingleFileComponent(componentLoaded);
+  assert(componentLoaded.libraries[0].procedures[2].isSetter);
+  verifyTargets(
+      componentLoaded.libraries[0].procedures[0],
+      componentLoaded.libraries[1].procedures[0],
+      componentLoaded.libraries[0].procedures[1],
+      componentLoaded.libraries[0].procedures[2]);
+
+  // Third one has a field again.
+  componentLoaded = new Component();
+  new BinaryBuilder(writtenBytesFieldNew)
+      .readSingleFileComponent(componentLoaded);
+  verifyTargets(
+      componentLoaded.libraries[0].procedures.single,
+      componentLoaded.libraries[1].procedures.single,
+      componentLoaded.libraries[0].fields.single,
+      componentLoaded.libraries[0].fields.single);
+}
+
+void verifyTargets(Procedure libProcedure, Procedure lib2Procedure,
+    Member getterTarget, Member setterTarget) {
+  if (getGetTarget(libProcedure) != getterTarget) {
+    throw "Unexpected get target for lib #1";
+  }
+  if (getSetTarget(libProcedure) != setterTarget) {
+    throw "Unexpected set target for lib #1";
+  }
+  if (getGetTarget(lib2Procedure) != getterTarget) {
+    throw "Unexpected get target for lib #2";
+  }
+  if (getSetTarget(lib2Procedure) != setterTarget) {
+    throw "Unexpected set target for lib #2";
+  }
+}
+
+List<int> serialize(Library lib1, Library lib2) {
+  Component component = new Component(libraries: [lib1, lib2])
+    ..setMainMethodAndMode(null, false, NonNullableByDefaultCompiledMode.Weak);
+  ByteSink sink = new ByteSink();
+  new BinaryPrinter(sink).writeComponentFile(component);
+  return sink.builder.takeBytes();
+}
+
+Member getSetTarget(Procedure p) {
+  Block block = p.function.body;
+  ExpressionStatement getterStatement = block.statements[0];
+  StaticSet staticSet = getterStatement.expression;
+  return staticSet.target;
+}
+
+Member getGetTarget(Procedure p) {
+  Block block = p.function.body;
+  ReturnStatement setterStatement = block.statements[1];
+  StaticGet staticGet = setterStatement.expression;
+  return staticGet.target;
+}
+
+/// A [Sink] that directly writes data into a byte builder.
+class ByteSink implements Sink<List<int>> {
+  final BytesBuilder builder = new BytesBuilder();
+
+  void add(List<int> data) {
+    builder.add(data);
+  }
+
+  void close() {}
+}
diff --git a/pkg/kernel/test/load_concat_dill_keeps_source_test.dart b/pkg/kernel/test/load_concat_dill_keeps_source_test.dart
index 3226148..05bbc05 100644
--- a/pkg/kernel/test/load_concat_dill_keeps_source_test.dart
+++ b/pkg/kernel/test/load_concat_dill_keeps_source_test.dart
@@ -22,10 +22,11 @@
   Procedure p2 = new Procedure(new Name("p2"), ProcedureKind.Method,
       new FunctionNode(new ReturnStatement()))
     ..fileUri = uri1;
-  library1.addMember(p1);
-  library2.addMember(p2);
+  library1.addProcedure(p1);
+  library2.addProcedure(p2);
 
-  Component component = new Component(libraries: [library1, library2]);
+  Component component = new Component(libraries: [library1, library2])
+    ..setMainMethodAndMode(null, false, NonNullableByDefaultCompiledMode.Weak);
   component.uriToSource[uri1] = new Source(
       [42, 2 * 42], const Utf8Encoder().convert("source #1"), uri1, uri1);
   component.uriToSource[uri2] = new Source(
@@ -33,6 +34,7 @@
   expectSource(serialize(component), true, true);
 
   Component cPartial1 = new Component(nameRoot: component.root)
+    ..setMainMethodAndMode(null, false, NonNullableByDefaultCompiledMode.Weak)
     ..libraries.add(library1);
   cPartial1.uriToSource[uri1] = new Source(
       [42, 2 * 42], const Utf8Encoder().convert("source #1"), uri1, uri1);
@@ -42,6 +44,7 @@
   expectSource(partial1Serialized, true, false);
 
   Component cPartial2 = new Component(nameRoot: component.root)
+    ..setMainMethodAndMode(null, false, NonNullableByDefaultCompiledMode.Weak)
     ..libraries.add(library2);
   cPartial2.uriToSource[uri1] =
       new Source([42, 2 * 42], const <int>[], uri1, uri1);
diff --git a/pkg/kernel/test/metadata_test.dart b/pkg/kernel/test/metadata_test.dart
index dd557fb..5b362f1 100644
--- a/pkg/kernel/test/metadata_test.dart
+++ b/pkg/kernel/test/metadata_test.dart
@@ -25,8 +25,11 @@
   Member get member => _memberRef?.asMember;
 
   Metadata.forNode(TreeNode n)
-      : this(n.leakingDebugToString(),
-            getMemberReference(getMemberForMetadata(n)), getTypeForMetadata(n));
+      : this(
+            n.leakingDebugToString(),
+            // Refers to the member, not about the function => use getter.
+            getMemberReferenceGetter(getMemberForMetadata(n)),
+            getTypeForMetadata(n));
 
   Metadata(this.string, this._memberRef, this.type);
 }
diff --git a/pkg/kernel/test/non_null_test.dart b/pkg/kernel/test/non_null_test.dart
new file mode 100644
index 0000000..77750c8
--- /dev/null
+++ b/pkg/kernel/test/non_null_test.dart
@@ -0,0 +1,94 @@
+// 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 "package:expect/expect.dart" show Expect;
+
+import 'package:kernel/ast.dart' hide MapEntry;
+import 'package:kernel/src/non_null.dart';
+import 'package:kernel/testing/type_parser_environment.dart';
+
+const Map<String, String> data = {
+  'dynamic': 'dynamic',
+  'void': 'void',
+  'Null': 'Never',
+  'Never': 'Never',
+  'Never?': 'Never',
+  'Never*': 'Never',
+  'Object': 'Object',
+  'Object?': 'Object',
+  'Object*': 'Object',
+  'List<Object>': 'List<Object>',
+  'List<Object>?': 'List<Object>',
+  'List<Object>*': 'List<Object>',
+  'List<Object?>': 'List<Object?>',
+  'List<Object?>?': 'List<Object?>',
+  'List<Object?>*': 'List<Object?>',
+  'List<Object*>': 'List<Object*>',
+  'List<Object*>?': 'List<Object*>',
+  'List<Object*>*': 'List<Object*>',
+  'FutureOr<Null>': 'FutureOr<Never>',
+  'FutureOr<dynamic>': 'FutureOr<dynamic>',
+  'FutureOr<Object>': 'FutureOr<Object>',
+  'FutureOr<Object>?': 'FutureOr<Object>',
+  'FutureOr<Object>*': 'FutureOr<Object>',
+  'FutureOr<Object?>': 'FutureOr<Object>',
+  'FutureOr<Object?>?': 'FutureOr<Object>',
+  'FutureOr<Object?>*': 'FutureOr<Object>',
+  'FutureOr<Object*>': 'FutureOr<Object>',
+  'FutureOr<Object*>?': 'FutureOr<Object>',
+  'FutureOr<Object*>*': 'FutureOr<Object>',
+  'FutureOr<FutureOr<Object?>>': 'FutureOr<FutureOr<Object>>',
+  '(List<Object>, {required List<Object> a, List<Object> b}) -> List<Object>':
+      '(List<Object>, {required List<Object> a, List<Object> b}) -> List<Object>',
+  '(List<Object>, {required List<Object> a, List<Object> b}) ->? List<Object>':
+      '(List<Object>, {required List<Object> a, List<Object> b}) -> List<Object>',
+  '(List<Object>, {required List<Object> a, List<Object> b}) ->* List<Object>':
+      '(List<Object>, {required List<Object> a, List<Object> b}) -> List<Object>',
+  '(List<Object>?, {required List<Object?> a, List<Object?>? b}) ->? List<Object?>':
+      '(List<Object>?, {required List<Object?> a, List<Object?>? b}) -> List<Object?>',
+  'X': 'X & Object',
+  'X?': 'X & Object',
+  'X*': 'X & Object',
+  'X_extends_Object': 'X_extends_Object',
+  'X_extends_Object?': 'X_extends_Object',
+  'X_extends_Object*': 'X_extends_Object',
+  'X_extends_dynamic': 'X_extends_dynamic',
+  'X_extends_dynamic?': 'X_extends_dynamic',
+  'X_extends_dynamic*': 'X_extends_dynamic',
+  'X & Object?': 'X & Object',
+  'X & dynamic': 'X & dynamic',
+  'X & Object': 'X & Object',
+  'X? & Object?': 'X & Object',
+  'X? & dynamic': 'X & dynamic',
+  'X? & Object': 'X & Object',
+  'Y': 'Y & X & Object',
+  'Y?': 'Y & X & Object',
+  'Y_extends_dynamic': 'Y_extends_dynamic',
+  'Y_extends_dynamic?': 'Y_extends_dynamic',
+  'Y_extends_dynamic*': 'Y_extends_dynamic',
+  'Y_extends_dynamic & X': 'Y_extends_dynamic & X & Object',
+  'Y_extends_dynamic & X_extends_dynamic?':
+      'Y_extends_dynamic & X_extends_dynamic',
+};
+
+main() {
+  Env env = new Env('')
+    ..extendWithTypeParameters('X,'
+        'X_extends_Object extends Object,'
+        'X_extends_dynamic extends dynamic,'
+        'Y extends X,'
+        'Y_extends_dynamic extends X_extends_dynamic');
+  data.forEach((String input, String output) {
+    DartType inputType = env.parseType(input);
+    DartType expectedOutputType = env.parseType(output);
+    DartType actualOutputType = computeNonNull(inputType);
+    print('legacyErasure($inputType) = $actualOutputType: $expectedOutputType');
+    Expect.equals(
+        expectedOutputType,
+        actualOutputType,
+        "Unexpected NonNull of $inputType ('$input'):\n"
+        "Expected: ${expectedOutputType} ('$output')\n"
+        "Actual: ${actualOutputType}");
+  });
+}
diff --git a/pkg/kernel/test/relink_test.dart b/pkg/kernel/test/relink_test.dart
index 8f448cc..ed51ee6 100644
--- a/pkg/kernel/test/relink_test.dart
+++ b/pkg/kernel/test/relink_test.dart
@@ -91,7 +91,7 @@
       new Name("method"),
       ProcedureKind.Method,
       new FunctionNode(libProcedureBody, returnType: new DynamicType()));
-  lib.addMember(libProcedure);
+  lib.addProcedure(libProcedure);
 
   final Library main = new Library(Uri.parse('org-dartlang:///main.dart'));
   final Block mainProcedureBody = new Block([
@@ -102,8 +102,9 @@
       new Name("method"),
       ProcedureKind.Method,
       new FunctionNode(mainProcedureBody, returnType: new DynamicType()));
-  main.addMember(mainProcedure);
-  return new Component(libraries: [main, lib]);
+  main.addProcedure(mainProcedure);
+  return new Component(libraries: [main, lib])
+    ..setMainMethodAndMode(null, false, NonNullableByDefaultCompiledMode.Weak);
 }
 
 /// A [Sink] that directly writes data into a byte builder.
diff --git a/pkg/kernel/test/text_serializer_from_kernel_nodes_test.dart b/pkg/kernel/test/text_serializer_from_kernel_nodes_test.dart
index 7a55d99..cd4ae4a 100644
--- a/pkg/kernel/test/text_serializer_from_kernel_nodes_test.dart
+++ b/pkg/kernel/test/text_serializer_from_kernel_nodes_test.dart
@@ -148,7 +148,7 @@
               new ExpressionStatement(new StaticSet(field, new IntLiteral(1))),
           expectation: ''
               '(expr'
-              ' (set-static "package:foo/bar.dart::@fields::field" (int 1)))',
+              ' (set-static "package:foo/bar.dart::@=fields::field" (int 1)))',
           makeSerializationState: () => new SerializationState(null),
           makeDeserializationState: () =>
               new DeserializationState(null, component.root),
@@ -221,7 +221,7 @@
       return new TestCase<Statement>(
           name: '/* suppose A {dynamic field;} A x; */ x.{A::field};',
           node: new ExpressionStatement(new PropertyGet.byReference(
-              new VariableGet(x), field.name, field.reference)),
+              new VariableGet(x), field.name, field.getterReference)),
           expectation: ''
               '(expr (get-prop (get-var "x^0" _) (public "field")))',
           makeSerializationState: () =>
@@ -252,7 +252,7 @@
               new VariableGet(x),
               field.name,
               new IntLiteral(42),
-              field.reference)),
+              field.setterReference)),
           expectation: ''
               '(expr (set-prop (get-var "x^0" _) (public "field") (int 42)))',
           makeSerializationState: () =>
diff --git a/pkg/kernel/test/type_parser_test.dart b/pkg/kernel/test/type_parser_test.dart
index 76bb490..5a2e651 100644
--- a/pkg/kernel/test/type_parser_test.dart
+++ b/pkg/kernel/test/type_parser_test.dart
@@ -42,6 +42,7 @@
 class B<T extends List<List<Object>>>;
 <E>(E) -> int
 S & T
+S & T & U
 class C;
 <E>(E) -> int & <E>(E) -> void
 C*
diff --git a/pkg/kernel/test/verify_test.dart b/pkg/kernel/test/verify_test.dart
index 0e5a207..56ccfcf 100644
--- a/pkg/kernel/test/verify_test.dart
+++ b/pkg/kernel/test/verify_test.dart
@@ -292,7 +292,7 @@
           new FunctionNode(new EmptyStatement(),
               positionalParameters: [new VariableDeclaration('p')]),
           isStatic: true);
-      test.enclosingClass.addMember(method);
+      test.enclosingClass.addProcedure(method);
       test.addNode(
           StaticInvocation(method, new Arguments([new NullLiteral()])));
     },
@@ -303,7 +303,7 @@
       var method = new Procedure(new Name('bar'), ProcedureKind.Method,
           new FunctionNode(new EmptyStatement()),
           isStatic: true);
-      test.enclosingClass.addMember(method);
+      test.enclosingClass.addProcedure(method);
       test.addNode(
           StaticInvocation(method, new Arguments([new NullLiteral()])));
       return method;
@@ -320,7 +320,7 @@
           new FunctionNode(new EmptyStatement(),
               positionalParameters: [new VariableDeclaration('p')]),
           isStatic: true);
-      test.enclosingClass.addMember(method);
+      test.enclosingClass.addProcedure(method);
       test.addNode(StaticInvocation(method, new Arguments.empty()));
       return method;
     },
@@ -332,7 +332,7 @@
       var method = new Procedure(new Name('bar'), ProcedureKind.Method,
           new FunctionNode(new EmptyStatement()),
           isStatic: true);
-      test.enclosingClass.addMember(method);
+      test.enclosingClass.addProcedure(method);
       test.addNode(StaticInvocation(
           method,
           new Arguments([],
@@ -351,7 +351,7 @@
           new FunctionNode(new EmptyStatement(),
               typeParameters: [test.makeTypeParameter()]),
           isStatic: true);
-      test.enclosingClass.addMember(method);
+      test.enclosingClass.addProcedure(method);
       test.addNode(StaticInvocation(method, new Arguments.empty()));
       return method;
     },
@@ -363,7 +363,7 @@
     (TestHarness test) {
       var constructor = new Constructor(new FunctionNode(new EmptyStatement()),
           name: new Name('foo'));
-      test.enclosingClass.addMember(constructor);
+      test.enclosingClass.addConstructor(constructor);
       test.addNode(ConstructorInvocation(constructor, new Arguments.empty()));
       return constructor;
     },
@@ -424,7 +424,7 @@
       var field = new Field(new Name('field'),
           type: new TypedefType(typedef_, Nullability.legacy), isStatic: true);
       test.enclosingLibrary.addTypedef(typedef_);
-      test.enclosingLibrary.addMember(field);
+      test.enclosingLibrary.addField(field);
     },
   );
   negative1Test(
@@ -635,7 +635,7 @@
       var field =
           new Field(new Name('field'), type: typedefType, isStatic: true);
       test.enclosingLibrary.addTypedef(foo);
-      test.enclosingLibrary.addMember(field);
+      test.enclosingLibrary.addField(field);
       return typedefType;
     },
     (Node typedefType) =>
@@ -648,7 +648,7 @@
       var foo = new Typedef('Foo', test.otherLegacyRawType, typeParameters: []);
       var field = new Field(new Name('field'),
           type: new TypedefType(foo, Nullability.legacy, []), isStatic: true);
-      test.enclosingLibrary.addMember(field);
+      test.enclosingLibrary.addField(field);
       return foo;
     },
     (Node foo) => "Dangling reference to '$foo', parent is: 'null'",
@@ -657,7 +657,7 @@
     'Non-static top-level field',
     (TestHarness test) {
       var field = new Field(new Name('field'));
-      test.enclosingLibrary.addMember(field);
+      test.enclosingLibrary.addField(field);
       return null;
     },
     (Node node) => "The top-level field 'field' should be static",
@@ -715,11 +715,27 @@
   }
 
   void addClassMember(Member node) {
-    enclosingClass.addMember(node);
+    if (node is Procedure) {
+      enclosingClass.addProcedure(node);
+    } else if (node is Field) {
+      enclosingClass.addField(node);
+    } else if (node is Constructor) {
+      enclosingClass.addConstructor(node);
+    } else if (node is RedirectingFactoryConstructor) {
+      enclosingClass.addRedirectingFactoryConstructor(node);
+    } else {
+      throw "Unexpected class member: ${node.runtimeType}";
+    }
   }
 
   void addTopLevelMember(Member node) {
-    enclosingLibrary.addMember(node);
+    if (node is Procedure) {
+      enclosingLibrary.addProcedure(node);
+    } else if (node is Field) {
+      enclosingLibrary.addField(node);
+    } else {
+      throw "Unexpected top level member: ${node.runtimeType}";
+    }
   }
 
   void addClass(Class node) {
@@ -762,7 +778,7 @@
     enclosingLibrary.addClass(enclosingClass);
     enclosingMember = new Procedure(new Name('test'), ProcedureKind.Method,
         new FunctionNode(new EmptyStatement()));
-    enclosingClass.addMember(enclosingMember);
+    enclosingClass.addProcedure(enclosingMember);
     otherClass = new Class(
         name: 'OtherClass',
         typeParameters: [makeTypeParameter('OtherT')],
diff --git a/pkg/meta/CHANGELOG.md b/pkg/meta/CHANGELOG.md
index d80e12b..e56752f 100644
--- a/pkg/meta/CHANGELOG.md
+++ b/pkg/meta/CHANGELOG.md
@@ -1,3 +1,12 @@
+## 1.3.0-nullsafety.6
+
+* Update SDK constraints to `>=2.12.0-0 <3.0.0` based on beta release
+    guidelines.
+
+## 1.3.0-nullsafety.5
+
+* Allow prerelease versions of the `2.12` sdk.
+
 ## 1.3.0-nullsafety.4
 
 * Introduce `@internal` to annotate elements that should not be used outside of
diff --git a/pkg/meta/pubspec.yaml b/pkg/meta/pubspec.yaml
index 28a9847..835f447 100644
--- a/pkg/meta/pubspec.yaml
+++ b/pkg/meta/pubspec.yaml
@@ -1,5 +1,5 @@
 name: meta
-version: 1.3.0-nullsafety.4
+version: 1.3.0-nullsafety.6
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/meta
 description: >
  This library contains the declarations of annotations that developers can use
@@ -7,5 +7,4 @@
  analyzing the source code. These annotations are intended to be used by tools
  to provide a better user experience.
 environment:
-  # This must remain a tight constraint until nnbd is stable
-  sdk: '>=2.10.0-0 <2.11.0'
+  sdk: ">=2.12.0-0 <3.0.0"
diff --git a/pkg/nnbd_migration/CHANGELOG.md b/pkg/nnbd_migration/CHANGELOG.md
index 66aeb13..66a6ebd 100644
--- a/pkg/nnbd_migration/CHANGELOG.md
+++ b/pkg/nnbd_migration/CHANGELOG.md
@@ -1,2 +1,6 @@
+## 0.1.1
+* Add README text indicating that this package should not be used; instead,
+  migrations should be launched using `dart migrate`.
+
 ## 0.1.0
 * Separated from analysis_server project.
diff --git a/pkg/nnbd_migration/README.md b/pkg/nnbd_migration/README.md
index ed021dd..97659f3 100644
--- a/pkg/nnbd_migration/README.md
+++ b/pkg/nnbd_migration/README.md
@@ -2,6 +2,8 @@
 
 **Note**:
 
+  * This migration tool is now available through the SDK, using the `dart
+    migrate` command.  Support for running it via `pub activate` is deprecated.
   * The null safety migration tooling is in an early state and may have bugs and
     other issues.
   * As null safety is still in preview, we recommend only doing trial
diff --git a/pkg/nnbd_migration/lib/instrumentation.dart b/pkg/nnbd_migration/lib/instrumentation.dart
index 387d666..434a003 100644
--- a/pkg/nnbd_migration/lib/instrumentation.dart
+++ b/pkg/nnbd_migration/lib/instrumentation.dart
@@ -257,6 +257,7 @@
   alreadyMigratedType,
   alwaysNullableType,
   argumentErrorCheckNotNull,
+  callTearOff,
   compoundAssignment,
   // See [DummyOrigin].
   dummy,
@@ -277,6 +278,7 @@
   instantiateToBounds,
   isCheckComponentType,
   isCheckMainType,
+  iteratorMethodReturn,
   listLengthConstructor,
   literal,
   namedParameterNotSupplied,
diff --git a/pkg/nnbd_migration/lib/migration_cli.dart b/pkg/nnbd_migration/lib/migration_cli.dart
index d3f5fae..8f0d07d 100644
--- a/pkg/nnbd_migration/lib/migration_cli.dart
+++ b/pkg/nnbd_migration/lib/migration_cli.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:async';
-import 'dart:convert' show jsonDecode;
 import 'dart:io' hide File;
 
 import 'package:analyzer/dart/analysis/analysis_context_collection.dart';
@@ -15,6 +14,7 @@
 import 'package:analyzer/file_system/physical_file_system.dart';
 import 'package:analyzer/src/dart/analysis/analysis_context_collection.dart';
 import 'package:analyzer/src/dart/analysis/driver_based_analysis_context.dart';
+import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/util/sdk.dart';
@@ -31,7 +31,7 @@
 import 'package:nnbd_migration/src/front_end/migration_state.dart';
 import 'package:nnbd_migration/src/front_end/non_nullable_fix.dart';
 import 'package:nnbd_migration/src/messages.dart';
-import 'package:nnbd_migration/src/utilities/json.dart' as json;
+import 'package:nnbd_migration/src/utilities/progress_bar.dart';
 import 'package:nnbd_migration/src/utilities/source_edit_diff_formatter.dart';
 import 'package:path/path.dart' show Context;
 
@@ -43,6 +43,51 @@
   return value.endsWith('.') ? value.substring(0, value.length - 1) : value;
 }
 
+/// The result of a round of static analysis; primarily a list of
+/// [AnalysisError]s.
+class AnalysisResult {
+  final List<AnalysisError> errors;
+  final Map<String, LineInfo> lineInfo;
+  final Context pathContext;
+  final String rootDirectory;
+
+  AnalysisResult(
+      this.errors, this.lineInfo, this.pathContext, this.rootDirectory) {
+    errors.sort((AnalysisError one, AnalysisError two) {
+      if (one.source != two.source) {
+        return one.source.fullName.compareTo(two.source.fullName);
+      }
+      return one.offset - two.offset;
+    });
+  }
+
+  bool get hasErrors => errors.isNotEmpty;
+
+  /// Whether the errors include any which may be the result of not yet having
+  /// run "pub get".
+  bool get hasImportErrors => errors.any(
+      (error) => error.errorCode == CompileTimeErrorCode.URI_DOES_NOT_EXIST);
+
+  /// Converts the list of errors into JSON, for displaying in the web preview.
+  List<Map<String, dynamic>> toJson() {
+    var result = <Map<String, dynamic>>[];
+    // severity • Message ... at foo/bar.dart:6:1 • (error_code)
+    for (var error in errors) {
+      var lineInfoForThisFile = lineInfo[error.source.fullName];
+      var location = lineInfoForThisFile.getLocation(error.offset);
+      var path =
+          pathContext.relative(error.source.fullName, from: rootDirectory);
+      result.add({
+        'severity': error.severity.name,
+        'message': _removePeriod(error.message),
+        'location': '$path:${location.lineNumber}:${location.columnNumber}',
+        'code': error.errorCode.name.toLowerCase(),
+      });
+    }
+    return result;
+  }
+}
+
 /// Data structure recording command-line options for the migration tool that
 /// have been passed in by the client.
 class CommandLineOptions {
@@ -53,6 +98,10 @@
   static const previewHostnameOption = 'preview-hostname';
   static const previewPortOption = 'preview-port';
   static const sdkPathOption = 'sdk-path';
+  static const skipImportCheckFlag = 'skip-import-check';
+
+  /// TODO(paulberry): remove this flag once internal sources have been updated.
+  @Deprecated('The migration tool no longer performs "pub outdated" checks')
   static const skipPubOutdatedFlag = 'skip-pub-outdated';
   static const summaryOption = 'summary';
   static const verboseFlag = 'verbose';
@@ -72,123 +121,76 @@
 
   final String sdkPath;
 
-  final bool skipPubOutdated;
+  final bool skipImportCheck;
 
   final String summary;
 
   final bool webPreview;
 
   CommandLineOptions(
-      {@required this.applyChanges,
-      @required this.directory,
-      @required this.ignoreErrors,
-      @required this.ignoreExceptions,
-      @required this.previewHostname,
-      @required this.previewPort,
-      @required this.sdkPath,
-      @required this.skipPubOutdated,
-      @required this.summary,
-      @required this.webPreview});
+      {@required
+          this.applyChanges,
+      @required
+          this.directory,
+      @required
+          this.ignoreErrors,
+      @required
+          this.ignoreExceptions,
+      @required
+          this.previewHostname,
+      @required
+          this.previewPort,
+      @required
+          this.sdkPath,
+      // TODO(paulberry): make this parameter required once internal sources
+      // have been updated.
+      bool skipImportCheck,
+      // TODO(paulberry): remove this flag once internal sources have been
+      // updated.
+      @Deprecated('The migration tool no longer performs "pub outdated" checks')
+          bool skipPubOutdated = false,
+      @required
+          this.summary,
+      @required
+          this.webPreview})
+      // `skipImportCheck` has replaced `skipPubOutdated`, so if the caller
+      // specifies the latter but not the former, carry it over.
+      // TODO(paulberry): remove this logic once internal sources have been
+      // updated.
+      : skipImportCheck = skipImportCheck ?? skipPubOutdated;
 }
 
-@visibleForTesting
-class DependencyChecker {
-  /// The directory which contains the package being migrated.
-  final String _directory;
-  final Context _pathContext;
-  final Logger _logger;
-  final ProcessManager _processManager;
+// TODO(devoncarew): Refactor so this class extends DartdevCommand.
+class MigrateCommand extends Command<int> {
+  static const String cmdName = 'migrate';
 
-  DependencyChecker(
-      this._directory, this._pathContext, this._logger, this._processManager);
+  static const String cmdDescription =
+      'Perform a null safety migration on a project or package.';
 
-  bool check() {
-    var pubPath = _pathContext.join(getSdkPath(), 'bin', 'dart');
-    var pubArguments = ['pub', 'outdated', '--mode=null-safety', '--json'];
-    var preNullSafetyPackages = <String, String>{};
-    try {
-      var result = _processManager.runSync(pubPath, pubArguments,
-          workingDirectory: _directory);
-      if ((result.stderr as String).isNotEmpty) {
-        throw FormatException(
-            '`dart pub outdated --mode=null-safety` exited with exit code '
-            '${result.exitCode} and stderr:\n\n${result.stderr}');
-      }
-      var outdatedOutput = jsonDecode(result.stdout as String);
-      var outdatedMap = json.expectType<Map>(outdatedOutput, 'root');
-      var packageList =
-          json.expectType<List>(outdatedMap['packages'], 'packages');
-      for (var package_ in packageList) {
-        var package = json.expectType<Map>(package_, '');
-        var current_ = json.expectKey(package, 'current');
-        if (current_ == null) {
-          continue;
-        }
-        var current = json.expectType<Map>(current_, 'current');
-        if (json.expectType<bool>(current['nullSafety'], 'nullSafety')) {
-          // For whatever reason, there is no "current" version of this package.
-          // TODO(srawlins): We may want to report this to the user. But it may
-          // be inconsequential.
-          continue;
-        }
+  static const String migrationGuideLink =
+      'See https://dart.dev/go/null-safety-migration for a migration guide.';
 
-        json.expectKey(package, 'package');
-        json.expectKey(current, 'version');
-        var name = json.expectType<String>(package['package'], 'package');
-        // A version will be given, even if a package was provided with a local
-        // or git path.
-        var version = json.expectType<String>(current['version'], 'version');
-        preNullSafetyPackages[name] = version;
-      }
-    } on ProcessException catch (e) {
-      _logger.stderr(
-          'Warning: Could not execute `$pubPath ${pubArguments.join(' ')}`: '
-          '"${e.message}"');
-      // Allow the program to continue; users should be allowed to attempt to
-      // migrate when `pub outdated` is misbehaving, or if there is a bug above.
-    } on FormatException catch (e) {
-      _logger.stderr('Warning: ${e.message}');
-      // Allow the program to continue; users should be allowed to attempt to
-      // migrate when `pub outdated` is misbehaving, or if there is a bug above.
-    }
-    if (preNullSafetyPackages.isNotEmpty) {
-      _logger.stderr(
-          'Warning: dependencies are outdated. The version(s) of one or more '
-          'packages currently checked out have not yet migrated to the Null '
-          'Safety feature.');
-      _logger.stderr('');
-      for (var package in preNullSafetyPackages.entries) {
-        _logger.stderr(
-            '    ${package.key}, currently at version ${package.value}');
-      }
-      _logger.stderr('');
-      _logger.stderr('It is highly recommended to upgrade all dependencies to '
-          'versions which have migrated. Use `dart pub outdated '
-          '--mode=null-safety` to check the status of dependencies.');
-      _logger.stderr('');
-      _logger.stderr('Visit https://dart.dev/tools/pub/cmd/pub-outdated for '
-          'more information.');
-      return false;
-    }
-    return true;
-  }
-}
+  /// Return whether the SDK has null safety on by default.
+  static bool get nullSafetyOnByDefault => IsEnabledByDefault.non_nullable;
 
-class MigrateCommand extends Command<dynamic> {
   final bool verbose;
 
-  @override
-  final bool hidden;
+  ArgParser _argParser;
 
-  MigrateCommand({this.verbose = false, this.hidden = false}) {
+  MigrateCommand({this.verbose = false}) {
     MigrationCli._defineOptions(argParser, !verbose);
   }
 
   @override
-  String get description =>
-      'Perform a null safety migration on a project or package.'
-      '\n\nThe migration tool is in preview; see '
-      'https://dart.dev/go/null-safety-migration for a migration guide.';
+  ArgParser get argParser {
+    // We override this in order to configure the help text line wrapping.
+    return _argParser ??= ArgParser(
+      usageLineLength: stdout.hasTerminal ? stdout.terminalColumns : null,
+    );
+  }
+
+  @override
+  String get description => '$cmdDescription\n\n$migrationGuideLink';
 
   @override
   String get invocation {
@@ -196,7 +198,7 @@
   }
 
   @override
-  String get name => 'migrate';
+  String get name => cmdName;
 
   @override
   FutureOr<int> run() async {
@@ -218,6 +220,106 @@
 /// [MigrationCliRunner.run] on the result.  If either method throws a
 /// [MigrationExit], exit with the error code contained therein.
 class MigrationCli {
+  /// A list of all the command-line options supported by the tool.
+  ///
+  /// This may be used by clients that wish to run migration but provide their
+  /// own command-line interface.
+  static final List<MigrationCliOption> options = [
+    MigrationCliOption(
+        CommandLineOptions.verboseFlag,
+        (parser, hide) => parser.addFlag(
+              CommandLineOptions.verboseFlag,
+              abbr: 'v',
+              defaultsTo: false,
+              help: 'Show additional command output.',
+              negatable: false,
+            )),
+    MigrationCliOption(
+        CommandLineOptions.applyChangesFlag,
+        (parser, hide) => parser.addFlag(CommandLineOptions.applyChangesFlag,
+            defaultsTo: false,
+            negatable: false,
+            help:
+                'Apply the proposed null safety changes to the files on disk.')),
+    MigrationCliOption(
+        CommandLineOptions.ignoreErrorsFlag,
+        (parser, hide) => parser.addFlag(
+              CommandLineOptions.ignoreErrorsFlag,
+              defaultsTo: false,
+              negatable: false,
+              help:
+                  'Attempt to perform null safety analysis even if the package has '
+                  'analysis errors.',
+            )),
+    MigrationCliOption(
+        CommandLineOptions.skipImportCheckFlag,
+        (parser, hide) => parser.addFlag(
+              CommandLineOptions.skipImportCheckFlag,
+              defaultsTo: false,
+              negatable: false,
+              help: 'Go ahead with migration even if some imported files have '
+                  'not yet been migrated.',
+            )),
+    MigrationCliOption.separator('Web interface options:'),
+    MigrationCliOption(
+        CommandLineOptions.webPreviewFlag,
+        (parser, hide) => parser.addFlag(
+              CommandLineOptions.webPreviewFlag,
+              defaultsTo: true,
+              negatable: true,
+              help:
+                  'Show an interactive preview of the proposed null safety changes '
+                  'in a browser window. Use --no-web-preview to print proposed changes '
+                  'to the console.',
+            )),
+    MigrationCliOption(
+        CommandLineOptions.previewHostnameOption,
+        (parser, hide) => parser.addOption(
+              CommandLineOptions.previewHostnameOption,
+              defaultsTo: 'localhost',
+              valueHelp: 'host',
+              help: 'Run the preview server on the specified hostname. If not '
+                  'specified, "localhost" is used. Use "any" to specify IPv6.any or '
+                  'IPv4.any.',
+            )),
+    MigrationCliOption(
+        CommandLineOptions.previewPortOption,
+        (parser, hide) => parser.addOption(
+              CommandLineOptions.previewPortOption,
+              valueHelp: 'port',
+              help:
+                  'Run the preview server on the specified port. If not specified, '
+                  'dynamically allocate a port.',
+            )),
+    MigrationCliOption.separator('Additional options:'),
+    MigrationCliOption(
+        CommandLineOptions.summaryOption,
+        (parser, hide) => parser.addOption(
+              CommandLineOptions.summaryOption,
+              help: 'Output a machine-readable summary of migration changes.',
+              valueHelp: 'path',
+            )),
+    // hidden options
+    MigrationCliOption(
+        CommandLineOptions.ignoreExceptionsFlag,
+        (parser, hide) => parser.addFlag(
+              CommandLineOptions.ignoreExceptionsFlag,
+              defaultsTo: false,
+              negatable: false,
+              help:
+                  'Attempt to perform null safety analysis even if exceptions occur.',
+              hide: hide,
+            )),
+    MigrationCliOption(
+        CommandLineOptions.sdkPathOption,
+        (parser, hide) => parser.addOption(
+              CommandLineOptions.sdkPathOption,
+              valueHelp: 'sdk-path',
+              help: 'The path to the Dart SDK.',
+              hide: hide,
+            )),
+  ];
+
   /// The name of the executable, for reporting in help messages.
   final String binaryName;
 
@@ -229,11 +331,6 @@
   /// user.  Used in testing to allow user feedback messages to be tested.
   final Logger Function(bool isVerbose) loggerFactory;
 
-  /// Process manager that should be used to run processes. Used in testing to
-  /// redirect to mock processes.
-  @visibleForTesting
-  final ProcessManager processManager;
-
   /// Resource provider that should be used to access the filesystem.  Used in
   /// testing to redirect to an in-memory filesystem.
   final ResourceProvider resourceProvider;
@@ -250,7 +347,6 @@
     @visibleForTesting this.loggerFactory = _defaultLoggerFactory,
     @visibleForTesting this.defaultSdkPathOverride,
     @visibleForTesting ResourceProvider resourceProvider,
-    @visibleForTesting this.processManager = const ProcessManager.system(),
     @visibleForTesting Map<String, String> environmentVariables,
   })  : logger = loggerFactory(false),
         resourceProvider =
@@ -304,7 +400,14 @@
         throw _BadArgException(
             'Invalid value for --${CommandLineOptions.previewPortOption}');
       }
-      var webPreview = argResults[CommandLineOptions.webPreviewFlag] as bool;
+      bool webPreview;
+      if (argResults.wasParsed(CommandLineOptions.webPreviewFlag)) {
+        webPreview = argResults[CommandLineOptions.webPreviewFlag] as bool;
+      } else {
+        // If the `webPreviewFlag` wasn't explicitly passed, then the value of
+        // this option is based on the value of the [applyChanges] option.
+        webPreview = !applyChanges;
+      }
       if (applyChanges && webPreview) {
         throw _BadArgException('--apply-changes requires --no-web-preview');
       }
@@ -320,8 +423,8 @@
           sdkPath: argResults[CommandLineOptions.sdkPathOption] as String ??
               defaultSdkPathOverride ??
               getSdkPath(),
-          skipPubOutdated:
-              argResults[CommandLineOptions.skipPubOutdatedFlag] as bool,
+          skipImportCheck:
+              argResults[CommandLineOptions.skipImportCheckFlag] as bool,
           summary: argResults[CommandLineOptions.summaryOption] as String,
           webPreview: webPreview);
       return MigrationCliRunner(this, options,
@@ -382,58 +485,32 @@
   }
 
   static void _defineOptions(ArgParser parser, bool hide) {
-    addCoreOptions(parser, hide);
-    parser.addFlag(
-      CommandLineOptions.skipPubOutdatedFlag,
-      defaultsTo: false,
-      negatable: false,
-      help: 'Skip the `pub outdated --mode=null-safety` check.',
-    );
-    parser.addFlag(CommandLineOptions.webPreviewFlag,
-        defaultsTo: true,
-        negatable: true,
-        help: 'Show an interactive preview of the proposed null safety changes '
-            'in a browser window.\n'
-            '--no-web-preview prints proposed changes to the console.');
-
-    parser.addOption(CommandLineOptions.sdkPathOption,
-        help: 'The path to the Dart SDK.', hide: hide);
-    parser.addOption(CommandLineOptions.summaryOption,
-        help: 'Output a machine-readable summary of migration changes.');
+    for (var option in options) {
+      option.addToParser(parser, hide);
+    }
   }
+}
 
-  static void addCoreOptions(ArgParser parser, bool hide) {
-    parser.addFlag(CommandLineOptions.applyChangesFlag,
-        defaultsTo: false,
-        negatable: false,
-        help: 'Apply the proposed null safety changes to the files on disk.');
-    parser.addFlag(
-      CommandLineOptions.ignoreErrorsFlag,
-      defaultsTo: false,
-      negatable: false,
-      help: 'Attempt to perform null safety analysis even if the package has '
-          'analysis errors.',
-    );
-    parser.addFlag(CommandLineOptions.ignoreExceptionsFlag,
-        defaultsTo: false,
-        negatable: false,
-        help:
-            'Attempt to perform null safety analysis even if exceptions occur.',
-        hide: hide);
-    parser.addFlag(CommandLineOptions.verboseFlag,
-        abbr: 'v',
-        defaultsTo: false,
-        help: 'Show additional command output.',
-        negatable: false);
-    parser.addOption(CommandLineOptions.previewHostnameOption,
-        defaultsTo: 'localhost',
-        help: 'Run the preview server on the specified hostname.\nIf not '
-            'specified, "localhost" is used. Use "any" to specify IPv6.any or '
-            'IPv4.any.');
-    parser.addOption(CommandLineOptions.previewPortOption,
-        help: 'Run the preview server on the specified port. If not specified, '
-            'dynamically allocate a port.');
-  }
+/// Data structure representing a single command-line option to the migration
+/// tool, or a separator in the list of command-line options.
+class MigrationCliOption {
+  /// The name of the option, without the leading `--`.
+  final String name;
+
+  /// Callback function that can be used to add the option or separator to the
+  /// given [parser].  If [hide] is `true`, and the option is rarely used, it
+  /// is added as a hidden option.
+  final void Function(ArgParser parser, bool hide) addToParser;
+
+  /// If `true`, this is a separator between command line options; if `false`,
+  /// it's an option.
+  final bool isSeparator;
+
+  MigrationCliOption(this.name, this.addToParser) : isSeparator = false;
+
+  MigrationCliOption.separator(this.name)
+      : addToParser = ((parser, hide) => parser.addSeparator(name)),
+        isSeparator = true;
 }
 
 /// Internals of the command-line API for the migration tool, with additional
@@ -548,11 +625,14 @@
       Object bindAddress,
       {List<String> included = const <String>[],
       int preferredPort,
-      String summaryPath}) {
-    return NonNullableFix(listener, resourceProvider, getLineInfo, bindAddress,
+      String summaryPath,
+      @required String sdkPath}) {
+    return NonNullableFix(
+        listener, resourceProvider, getLineInfo, bindAddress, logger,
         included: included,
         preferredPort: preferredPort,
-        summaryPath: summaryPath);
+        summaryPath: summaryPath,
+        sdkPath: sdkPath);
   }
 
   /// Runs the full migration process.
@@ -560,17 +640,15 @@
   /// If something goes wrong, a message is printed using the logger configured
   /// in the constructor, and [MigrationExit] is thrown.
   Future<void> run() async {
-    if (!options.skipPubOutdated) {
-      _checkDependencies();
-    }
-
     logger.stdout('Migrating ${options.directory}');
     logger.stdout('');
 
+    logger.stdout(MigrateCommand.migrationGuideLink);
+    logger.stdout('');
+
     if (hasMultipleAnalysisContext) {
-      logger
-          .stdout('Note: more than one project found; migrating the top-level '
-              'project.');
+      logger.stdout('Note: more than one project found; migrating the '
+          'top-level project.');
       logger.stdout('');
     }
 
@@ -586,7 +664,8 @@
         _fixCodeProcessor.getLineInfo, computeBindAddress(),
         included: [options.directory],
         preferredPort: options.previewPort,
-        summaryPath: options.summary);
+        summaryPath: options.summary,
+        sdkPath: options.sdkPath);
     nonNullableFix.rerunFunction = _rerunFunction;
     _fixCodeProcessor.registerCodeTask(nonNullableFix);
 
@@ -650,9 +729,9 @@
       await blockUntilSignalInterrupt();
       nonNullableFix.shutdownServer();
     } else {
-      logger.stdout(ansi.emphasized('Summary of changes:'));
+      logger.stdout(ansi.emphasized('Diff of changes:'));
 
-      _displayChangeSummary(_dartFixListener);
+      _displayChangeDiff(_dartFixListener);
 
       logger.stdout('');
       logger.stdout('To apply these changes, re-run the tool with '
@@ -712,52 +791,7 @@
     applyHook();
   }
 
-  void _checkDependencies() {
-    var successful = DependencyChecker(
-            options.directory, pathContext, logger, cli.processManager)
-        .check();
-    if (!successful) {
-      throw MigrationExit(1);
-    }
-  }
-
-  void _logErrors(AnalysisResult analysisResult) {
-    logger.stdout('');
-
-    var issueCount = analysisResult.errors.length;
-    logger.stdout(
-        '$issueCount analysis ${_pluralize(issueCount, 'issue')} found:');
-
-    _IssueRenderer renderer =
-        _IssueRenderer(logger, options.directory, pathContext, lineInfo);
-    for (AnalysisError error in analysisResult.errors) {
-      renderer.render(error);
-    }
-
-    logger.stdout('');
-    logger.stdout('Note: analysis errors will result in erroneous migration '
-        'suggestions.');
-
-    _hasAnalysisErrors = true;
-    if (options.ignoreErrors) {
-      logger.stdout('Continuing with migration suggestions due to the use of '
-          '--${CommandLineOptions.ignoreErrorsFlag}.');
-    } else {
-      // Fail with how to continue.
-      logger.stdout('');
-      if (analysisResult.hasImportErrors) {
-        logger
-            .stdout('Unresolved URIs found.  Did you forget to run "pub get"?');
-        logger.stdout('');
-      }
-      logger.stdout(
-          'Please fix the analysis issues (or, force generation of migration '
-          'suggestions by re-running with '
-          '--${CommandLineOptions.ignoreErrorsFlag}).');
-    }
-  }
-
-  void _displayChangeSummary(DartFixListener migrationResults) {
+  void _displayChangeDiff(DartFixListener migrationResults) {
     Map<String, List<DartFixSuggestion>> fileSuggestions = {};
     for (DartFixSuggestion suggestion in migrationResults.suggestions) {
       String file = suggestion.location.file;
@@ -830,6 +864,42 @@
     }
   }
 
+  void _logErrors(AnalysisResult analysisResult) {
+    logger.stdout('');
+
+    var issueCount = analysisResult.errors.length;
+    logger.stdout(
+        '$issueCount analysis ${_pluralize(issueCount, 'issue')} found:');
+
+    _IssueRenderer renderer =
+        _IssueRenderer(logger, options.directory, pathContext, lineInfo);
+    for (AnalysisError error in analysisResult.errors) {
+      renderer.render(error);
+    }
+
+    logger.stdout('');
+    logger.stdout('Note: analysis errors will result in erroneous migration '
+        'suggestions.');
+
+    _hasAnalysisErrors = true;
+    if (options.ignoreErrors) {
+      logger.stdout('Continuing with migration suggestions due to the use of '
+          '--${CommandLineOptions.ignoreErrorsFlag}.');
+    } else {
+      // Fail with how to continue.
+      logger.stdout('');
+      if (analysisResult.hasImportErrors) {
+        logger
+            .stdout('Unresolved URIs found.  Did you forget to run "pub get"?');
+        logger.stdout('');
+      }
+      logger.stdout(
+          'Please fix the analysis issues (or, force generation of migration '
+          'suggestions by re-running with '
+          '--${CommandLineOptions.ignoreErrorsFlag}).');
+    }
+  }
+
   Future<MigrationState> _rerunFunction() async {
     logger.stdout(ansi.emphasized('Re-analyzing project...'));
 
@@ -868,51 +938,6 @@
   }
 }
 
-/// The result of a round of static analysis; primarily a list of
-/// [AnalysisError]s.
-class AnalysisResult {
-  final List<AnalysisError> errors;
-  final Map<String, LineInfo> lineInfo;
-  final Context pathContext;
-  final String rootDirectory;
-
-  AnalysisResult(
-      this.errors, this.lineInfo, this.pathContext, this.rootDirectory) {
-    errors.sort((AnalysisError one, AnalysisError two) {
-      if (one.source != two.source) {
-        return one.source.fullName.compareTo(two.source.fullName);
-      }
-      return one.offset - two.offset;
-    });
-  }
-
-  bool get hasErrors => errors.isNotEmpty;
-
-  /// Whether the errors include any which may be the result of not yet having
-  /// run "pub get".
-  bool get hasImportErrors => errors.any(
-      (error) => error.errorCode == CompileTimeErrorCode.URI_DOES_NOT_EXIST);
-
-  /// Converts the list of errors into JSON, for displaying in the web preview.
-  List<Map<String, dynamic>> toJson() {
-    var result = <Map<String, dynamic>>[];
-    // severity • Message ... at foo/bar.dart:6:1 • (error_code)
-    for (var error in errors) {
-      var lineInfoForThisFile = lineInfo[error.source.fullName];
-      var location = lineInfoForThisFile.getLocation(error.offset);
-      var path =
-          pathContext.relative(error.source.fullName, from: rootDirectory);
-      result.add({
-        'severity': error.severity.name,
-        'message': _removePeriod(error.message),
-        'location': '$path:${location.lineNumber}:${location.columnNumber}',
-        'code': error.errorCode.name.toLowerCase(),
-      });
-    }
-    return result;
-  }
-}
-
 /// Exception thrown by [MigrationCli] if the client should exit.
 class MigrationExit {
   /// The exit code that the client should set.
@@ -959,7 +984,7 @@
 
   Set<String> pathsToProcess;
 
-  _ProgressBar _progressBar;
+  ProgressBar _progressBar;
 
   final MigrationCliRunner _migrationCli;
 
@@ -1020,14 +1045,14 @@
   }
 
   Future<AnalysisResult> runFirstPhase() async {
-    // All tasks should be registered; [numPhases] should be finalized.
-    _progressBar = _ProgressBar(pathsToProcess.length);
-
     // Process package
     _task.processPackage(context.contextRoot.root);
 
     var analysisErrors = <AnalysisError>[];
 
+    // All tasks should be registered; [numPhases] should be finalized.
+    _progressBar = ProgressBar(_migrationCli.logger, pathsToProcess.length);
+
     // Process each source file.
     await processResources((ResolvedUnitResult result) async {
       _progressBar.tick();
@@ -1043,12 +1068,23 @@
       }
     });
 
+    var unmigratedDependencies = _task.migration.unmigratedDependencies;
+    if (unmigratedDependencies.isNotEmpty) {
+      if (_migrationCli.options.skipImportCheck) {
+        _migrationCli.logger.stdout(unmigratedDependenciesWarning);
+      } else {
+        throw ExperimentStatusException.unmigratedDependencies(
+            unmigratedDependencies);
+      }
+    }
+
     return AnalysisResult(analysisErrors, _migrationCli.lineInfo,
         _migrationCli.pathContext, _migrationCli.options.directory);
   }
 
   Future<MigrationState> runLaterPhases() async {
-    _progressBar = _ProgressBar(pathsToProcess.length * (numPhases - 1));
+    _progressBar = ProgressBar(
+        _migrationCli.logger, pathsToProcess.length * (numPhases - 1));
 
     await processResources((ResolvedUnitResult result) async {
       _progressBar.tick();
@@ -1060,11 +1096,13 @@
         await _task.finalizeUnit(result);
       }
     });
+    _progressBar.complete();
+    _migrationCli.logger.stdout(_migrationCli.ansi
+        .emphasized('Compiling instrumentation information...'));
     var state = await _task.finish();
     if (_migrationCli.options.webPreview) {
       await _task.startPreviewServer(state, _migrationCli.applyHook);
     }
-    _progressBar.complete();
     state.previewUrls = _task.previewUrls;
 
     return state;
@@ -1098,78 +1136,6 @@
   }
 }
 
-/// A facility for drawing a progress bar in the terminal.
-///
-/// The bar is instantiated with the total number of "ticks" to be completed,
-/// and progress is made by calling [tick]. The bar is drawn across one entire
-/// line, like so:
-///
-///     [----------                                                   ]
-///
-/// The hyphens represent completed progress, and the whitespace represents
-/// remaining progress.
-///
-/// If there is no terminal, the progress bar will not be drawn.
-class _ProgressBar {
-  /// Whether the progress bar should be drawn.
-  /*late*/ bool _shouldDrawProgress;
-
-  /// The width of the terminal, in terms of characters.
-  /*late*/ int _width;
-
-  /// The inner width of the terminal, in terms of characters.
-  ///
-  /// This represents the number of characters available for drawing progress.
-  /*late*/ int _innerWidth;
-
-  final int _totalTickCount;
-
-  int _tickCount = 0;
-
-  _ProgressBar(this._totalTickCount) {
-    if (!stdout.hasTerminal) {
-      _shouldDrawProgress = false;
-    } else {
-      _shouldDrawProgress = true;
-      _width = stdout.terminalColumns;
-      _innerWidth = stdout.terminalColumns - 2;
-      stdout.write('[' + ' ' * _innerWidth + ']');
-    }
-  }
-
-  /// Clear the progress bar from the terminal, allowing other logging to be
-  /// printed.
-  void clear() {
-    if (!_shouldDrawProgress) {
-      return;
-    }
-    stdout.write('\r' + ' ' * _width + '\r');
-  }
-
-  /// Draw the progress bar as complete, and print two newlines.
-  void complete() {
-    if (!_shouldDrawProgress) {
-      return;
-    }
-    stdout.write('\r[' + '-' * _innerWidth + ']\n\n');
-  }
-
-  /// Progress the bar by one tick.
-  void tick() {
-    if (!_shouldDrawProgress) {
-      return;
-    }
-    _tickCount++;
-    var fractionComplete = _tickCount * _innerWidth ~/ _totalTickCount - 1;
-    var remaining = _innerWidth - fractionComplete - 1;
-    stdout.write('\r[' + // Bring cursor back to the start of the line.
-        '-' * fractionComplete + // Print complete work.
-        AnsiProgress.kAnimationItems[_tickCount % 4] + // Print spinner.
-        ' ' * remaining + // Print remaining work.
-        ']');
-  }
-}
-
 extension on Severity {
   /// Returns the simple name of the Severity, as a String.
   String get name {
diff --git a/pkg/nnbd_migration/lib/nnbd_migration.dart b/pkg/nnbd_migration/lib/nnbd_migration.dart
index 787b235..36027a0 100644
--- a/pkg/nnbd_migration/lib/nnbd_migration.dart
+++ b/pkg/nnbd_migration/lib/nnbd_migration.dart
@@ -17,6 +17,11 @@
 
 /// Description of fixes that might be performed by nullability migration.
 class NullabilityFixDescription {
+  /// An import was added to the library.
+  static const addImport = NullabilityFixDescription._(
+      appliedMessage: 'Added import for use in migrated code',
+      kind: NullabilityFixKind.addImport);
+
   /// A variable declaration needs to be marked as "late".
   static const addLate = NullabilityFixDescription._(
       appliedMessage: 'Added a late keyword', kind: NullabilityFixKind.addLate);
@@ -33,6 +38,12 @@
       appliedMessage: 'Added a late keyword, due to assignment in `setUp`',
       kind: NullabilityFixKind.addLateDueToTestSetup);
 
+  /// A variable declaration needs to be marked as "late" and "final" due to the
+  /// presence of a `/*late final*/` hint.
+  static const addLateFinalDueToHint = NullabilityFixDescription._(
+      appliedMessage: 'Added late and final keywords, due to a hint',
+      kind: NullabilityFixKind.addLateFinalDueToHint);
+
   /// An expression's value needs to be null-checked.
   static const checkExpression = NullabilityFixDescription._(
     appliedMessage: 'Added a non-null assertion to nullable expression',
@@ -106,6 +117,12 @@
     kind: NullabilityFixKind.downcastExpression,
   );
 
+  /// Informative message: there is no valid migration for `null` in a
+  /// non-nullable context.
+  static const noValidMigrationForNull = NullabilityFixDescription._(
+      appliedMessage: 'No valid migration for `null` in a non-nullable context',
+      kind: NullabilityFixKind.noValidMigrationForNull);
+
   /// Informative message: a null-aware access won't be necessary in strong
   /// checking mode.
   static const nullAwarenessUnnecessaryInStrongMode =
@@ -175,6 +192,13 @@
         kind: NullabilityFixKind.replaceVar,
       );
 
+  /// A method call was changed from calling one method to another.
+  factory NullabilityFixDescription.changeMethodName(
+          String oldName, String newName) =>
+      NullabilityFixDescription._(
+          appliedMessage: "Changed method '$oldName' to '$newName'",
+          kind: NullabilityFixKind.changeMethodName);
+
   /// An explicit type mentioned in the source program needs to be made
   /// nullable.
   factory NullabilityFixDescription.makeTypeNullable(String type) =>
@@ -216,7 +240,9 @@
       );
 
   const NullabilityFixDescription._(
-      {@required this.appliedMessage, @required this.kind});
+      {@required this.appliedMessage, @required this.kind})
+      : assert(appliedMessage != null),
+        assert(kind != null);
 
   @override
   int get hashCode {
@@ -239,11 +265,14 @@
 
 /// An enumeration of the various kinds of nullability fixes.
 enum NullabilityFixKind {
+  addImport,
   addLate,
   addLateDueToHint,
   addLateDueToTestSetup,
+  addLateFinalDueToHint,
   addRequired,
   addType,
+  changeMethodName,
   checkExpression,
   checkExpressionDueToHint,
   compoundAssignmentHasNullableSource,
@@ -253,6 +282,7 @@
   downcastExpression,
   makeTypeNullable,
   makeTypeNullableDueToHint,
+  noValidMigrationForNull,
   nullAwarenessUnnecessaryInStrongMode,
   nullAwareAssignmentUnnecessaryInStrongMode,
   otherCastExpression,
@@ -284,12 +314,18 @@
   /// Optional parameter [warnOnWeakCode] indicates whether weak-only code
   /// should be warned about or removed (in the way specified by
   /// [removeViaComments]).
+  ///
+  /// Optional parameter [transformWhereOrNull] indicates whether Iterable
+  /// methods should be transformed to their "OrNull" equivalents when possible.
+  /// This feature is a work in progress, so by default they are not
+  /// transformed.
   factory NullabilityMigration(NullabilityMigrationListener listener,
       LineInfo Function(String) getLineInfo,
       {bool permissive,
       NullabilityMigrationInstrumentation instrumentation,
       bool removeViaComments,
-      bool warnOnWeakCode}) = NullabilityMigrationImpl;
+      bool warnOnWeakCode,
+      bool transformWhereOrNull}) = NullabilityMigrationImpl;
 
   /// Check if this migration is being run permissively.
   bool get isPermissive;
@@ -298,6 +334,11 @@
 
   void finish();
 
+  /// Use this getter after any calls to [prepareInput] to obtain a list of URIs
+  /// of unmigrated dependencies.  Ideally, this list should be empty before the
+  /// user tries to migrate their package.
+  List<String> get unmigratedDependencies;
+
   void prepareInput(ResolvedUnitResult result);
 
   void processInput(ResolvedUnitResult result);
diff --git a/pkg/nnbd_migration/lib/src/decorated_type.dart b/pkg/nnbd_migration/lib/src/decorated_type.dart
index da5596f..a6c6e30 100644
--- a/pkg/nnbd_migration/lib/src/decorated_type.dart
+++ b/pkg/nnbd_migration/lib/src/decorated_type.dart
@@ -420,8 +420,21 @@
           var typeFormal = typeFormals[i];
           var oldDecoratedBound =
               DecoratedTypeParameterBounds.current.get(typeFormal);
-          var newDecoratedBound = oldDecoratedBound._substitute(substitution,
-              undecoratedResult.typeFormals[i].bound ?? oldDecoratedBound.type);
+          var undecoratedResult2 = undecoratedResult.typeFormals[i].bound;
+          if (undecoratedResult2 == null) {
+            if (oldDecoratedBound == null) {
+              assert(
+                  false, 'Could not find old decorated bound for type formal');
+              // Recover the best we can by assuming a bound of `dynamic`.
+              oldDecoratedBound = DecoratedType(
+                  DynamicTypeImpl.instance,
+                  NullabilityNode.forInferredType(
+                      NullabilityNodeTarget.text('Type parameter bound')));
+            }
+            undecoratedResult2 = oldDecoratedBound.type;
+          }
+          var newDecoratedBound =
+              oldDecoratedBound._substitute(substitution, undecoratedResult2);
           if (identical(typeFormal, undecoratedResult.typeFormals[i])) {
             assert(oldDecoratedBound == newDecoratedBound);
           } else {
diff --git a/pkg/nnbd_migration/lib/src/edge_builder.dart b/pkg/nnbd_migration/lib/src/edge_builder.dart
index 44f256d..3611061 100644
--- a/pkg/nnbd_migration/lib/src/edge_builder.dart
+++ b/pkg/nnbd_migration/lib/src/edge_builder.dart
@@ -32,6 +32,7 @@
 import 'package:nnbd_migration/src/utilities/permissive_mode.dart';
 import 'package:nnbd_migration/src/utilities/resolution_utils.dart';
 import 'package:nnbd_migration/src/utilities/scoped_set.dart';
+import 'package:nnbd_migration/src/utilities/where_or_null_transformer.dart';
 import 'package:nnbd_migration/src/variables.dart';
 
 import 'decorated_type_operations.dart';
@@ -211,12 +212,33 @@
 
   final Set<PromotableElement> _lateHintedLocals = {};
 
+  final Set<PromotableElement> _requiredHintedParameters = {};
+
   final Map<Token, HintComment> _nullCheckHints = {};
 
-  EdgeBuilder(this.typeProvider, this._typeSystem, this._variables, this._graph,
-      this.source, this.listener, this._decoratedClassHierarchy,
+  /// Helper that assists us in transforming Iterable methods to their "OrNull"
+  /// equivalents, or `null` if we are not doing such transformations.
+  final WhereOrNullTransformer _whereOrNullTransformer;
+
+  /// Deferred processing that should be performed once we have finished
+  /// evaluating the decorated type of a method invocation.
+  final Map<MethodInvocation, DecoratedType Function(DecoratedType)>
+      _deferredMethodInvocationProcessing = {};
+
+  EdgeBuilder(
+      this.typeProvider,
+      this._typeSystem,
+      this._variables,
+      this._graph,
+      this.source,
+      this.listener,
+      this._decoratedClassHierarchy,
+      bool transformWhereOrNull,
       {this.instrumentation})
-      : _inheritanceManager = InheritanceManager3();
+      : _inheritanceManager = InheritanceManager3(),
+        _whereOrNullTransformer = transformWhereOrNull
+            ? WhereOrNullTransformer(typeProvider, _typeSystem)
+            : null;
 
   /// Gets the decorated type of [element] from [_variables], performing any
   /// necessary substitutions.
@@ -368,7 +390,8 @@
     var sourceIsSetupCall = false;
     if (node.leftHandSide is SimpleIdentifier &&
         _isCurrentFunctionExpressionFoundInTestSetUpCall()) {
-      var assignee = (node.leftHandSide as SimpleIdentifier).staticElement;
+      var assignee =
+          getWriteOrReadElement(node.leftHandSide as SimpleIdentifier);
       var enclosingElementOfCurrentFunction =
           _currentFunctionExpression.declaredElement.enclosingElement;
       if (enclosingElementOfCurrentFunction == assignee.enclosingElement) {
@@ -724,6 +747,10 @@
       if (node.declaredElement.hasRequired) {
         // Nothing to do; the implicit default value of `null` will never be
         // reached.
+      } else if (_variables.getRequiredHint(source, node) != null) {
+        // Nothing to do; assume the implicit default value of `null` will never
+        // be reached.
+        _requiredHintedParameters.add(node.declaredElement);
       } else {
         _graph.makeNullable(getOrComputeElementType(node.declaredElement).node,
             OptionalFormalParameterOrigin(source, node));
@@ -879,6 +906,7 @@
       _postDominatedLocals.doScoped(
           elements: node.declaredElement.parameters,
           action: () => _dispatch(node.body));
+      _variables.recordDecoratedExpressionType(node, _currentFunctionType);
       return _currentFunctionType;
     } finally {
       if (node.parent is! FunctionDeclaration) {
@@ -1001,7 +1029,7 @@
     } else if (target != null) {
       targetType = _checkExpressionNotNull(target);
     }
-    var callee = node.staticElement;
+    var callee = getWriteOrReadElement(node);
     DecoratedType result;
     if (callee == null) {
       // Dynamic dispatch.  The return type is `dynamic`.
@@ -1208,17 +1236,27 @@
       targetType = _thisOrSuper(node);
     }
     DecoratedType expressionType;
-    if (callee == null) {
+    DecoratedType calleeType;
+    if (targetType != null &&
+        targetType.type is FunctionType &&
+        node.methodName.name == 'call') {
+      // If `X` has a function type, then in the expression `X.call()`, the
+      // function being called is `X` itself, so the callee type is simply the
+      // type of `X`.
+      calleeType = targetType;
+    } else if (callee != null) {
+      calleeType = getOrComputeElementType(callee, targetType: targetType);
+      if (callee is PropertyAccessorElement) {
+        calleeType = calleeType.returnType;
+      }
+    }
+    if (calleeType == null) {
       // Dynamic dispatch.  The return type is `dynamic`.
       // TODO(paulberry): would it be better to assume a return type of `Never`
       // so that we don't unnecessarily propagate nullabilities everywhere?
       _dispatch(node.argumentList);
       expressionType = _makeNullableDynamicType(node);
     } else {
-      var calleeType = getOrComputeElementType(callee, targetType: targetType);
-      if (callee is PropertyAccessorElement) {
-        calleeType = calleeType.returnType;
-      }
       expressionType = _handleInvocationArguments(
           node,
           node.argumentList.arguments,
@@ -1227,11 +1265,16 @@
           calleeType,
           null,
           invokeType: node.staticInvokeType);
+      // Do any deferred processing for this method invocation.
+      var deferredProcessing = _deferredMethodInvocationProcessing.remove(node);
+      if (deferredProcessing != null) {
+        expressionType = deferredProcessing(expressionType);
+      }
       if (isNullAware) {
         expressionType = expressionType.withNode(
             NullabilityNode.forLUB(targetType.node, expressionType.node));
-        _variables.recordDecoratedExpressionType(node, expressionType);
       }
+      _variables.recordDecoratedExpressionType(node, expressionType);
     }
     _handleArgumentErrorCheckNotNull(node);
     _handleQuiverCheckNotNull(node);
@@ -1306,7 +1349,7 @@
         writeType = _fixNumericTypes(calleeType.returnType, node.staticType);
       }
       if (operand is SimpleIdentifier) {
-        var element = operand.staticElement;
+        var element = getWriteOrReadElement(operand);
         if (element is PromotableElement) {
           _flowAnalysis.write(element, writeType);
         }
@@ -1357,7 +1400,7 @@
       }
       if (isIncrementOrDecrement) {
         if (operand is SimpleIdentifier) {
-          var element = operand.staticElement;
+          var element = getWriteOrReadElement(operand);
           if (element is PromotableElement) {
             _flowAnalysis.write(element, staticType);
           }
@@ -1499,7 +1542,7 @@
   @override
   DecoratedType visitSimpleIdentifier(SimpleIdentifier node) {
     DecoratedType result;
-    var staticElement = node.staticElement;
+    var staticElement = getWriteOrReadElement(node);
     if (staticElement is PromotableElement) {
       if (!node.inDeclarationContext()) {
         var promotedType = _flowAnalysis.variableRead(node, staticElement);
@@ -1509,6 +1552,7 @@
       if (!node.inDeclarationContext() &&
           node.inGetterContext() &&
           !_lateHintedLocals.contains(staticElement) &&
+          !_requiredHintedParameters.contains(staticElement) &&
           !_flowAnalysis.isAssigned(staticElement)) {
         _graph.makeNullable(type.node, UninitializedReadOrigin(source, node));
       }
@@ -1702,7 +1746,7 @@
       _typeNameNesting++;
       var typeArguments = typeName.typeArguments?.arguments;
       var element = typeName.name.staticElement;
-      if (element is GenericTypeAliasElement) {
+      if (element is FunctionTypeAliasElement) {
         final typedefType = _variables.decoratedElementType(element.function);
         final typeNameType =
             _variables.decoratedTypeAnnotation(source, typeName);
@@ -2198,7 +2242,7 @@
     PromotableElement destinationLocalVariable;
     if (destinationType == null) {
       if (destinationExpression is SimpleIdentifier) {
-        var element = destinationExpression.staticElement;
+        var element = getWriteOrReadElement(destinationExpression);
         if (element is PromotableElement) {
           destinationLocalVariable = element;
         }
@@ -2259,18 +2303,40 @@
           sourceType = _makeNullableDynamicType(compoundOperatorInfo);
         }
       } else {
-        var unwrappedExpression = expression.unParenthesized;
-        var hard = (questionAssignNode == null &&
-                _postDominatedLocals.isReferenceInScope(expression)) ||
-            // An edge from a cast should be hard, so that the cast type
-            // annotation is appropriately made nullable according to the
-            // destination type.
-            unwrappedExpression is AsExpression;
-        _checkAssignment(edgeOrigin, FixReasonTarget.root,
-            source: sourceType,
-            destination: destinationType,
-            hard: hard,
-            sourceIsFunctionLiteral: expression is FunctionExpression);
+        var transformationInfo =
+            _whereOrNullTransformer?.tryTransformOrElseArgument(expression);
+        if (transformationInfo != null) {
+          // Don't build any edges for this argument; if necessary we'll transform
+          // it rather than make things nullable.  But do save the nullability of
+          // the return value of the `orElse` method, so that we can later connect
+          // it to the nullability of the value returned from the method
+          // invocation.
+          var extraNullability = sourceType.returnType.node;
+          _deferredMethodInvocationProcessing[
+              transformationInfo.methodInvocation] = (methodInvocationType) {
+            var newNode = NullabilityNode.forInferredType(
+                NullabilityNodeTarget.text(
+                    'return value from ${transformationInfo.originalName}'));
+            var origin = IteratorMethodReturnOrigin(
+                source, transformationInfo.methodInvocation);
+            _graph.connect(methodInvocationType.node, newNode, origin);
+            _graph.connect(extraNullability, newNode, origin);
+            return methodInvocationType.withNode(newNode);
+          };
+        } else {
+          var unwrappedExpression = expression.unParenthesized;
+          var hard = (questionAssignNode == null &&
+                  _postDominatedLocals.isReferenceInScope(expression)) ||
+              // An edge from a cast should be hard, so that the cast type
+              // annotation is appropriately made nullable according to the
+              // destination type.
+              unwrappedExpression is AsExpression;
+          _checkAssignment(edgeOrigin, FixReasonTarget.root,
+              source: sourceType,
+              destination: destinationType,
+              hard: hard,
+              sourceIsFunctionLiteral: expression is FunctionExpression);
+        }
       }
       if (destinationLocalVariable != null) {
         _flowAnalysis.write(destinationLocalVariable, sourceType);
@@ -2825,7 +2891,7 @@
   DecoratedType _handlePropertyAccess(Expression node, Expression target,
       SimpleIdentifier propertyName, bool isNullAware, bool isCascaded) {
     DecoratedType targetType;
-    var callee = propertyName.staticElement;
+    var callee = getWriteOrReadElement(propertyName);
     bool calleeIsStatic = callee is ExecutableElement && callee.isStatic;
     if (isCascaded) {
       targetType = _currentCascadeTargetType;
@@ -2838,12 +2904,27 @@
     } else {
       targetType = _handleTarget(target, propertyName.name, callee);
     }
-    if (callee == null) {
+    DecoratedType calleeType;
+    if (targetType != null &&
+        targetType.type is FunctionType &&
+        propertyName.name == 'call') {
+      // If `X` has a function type, then in the expression `X.call`, the
+      // function being torn off is `X` itself, so the callee type is simply the
+      // non-nullable counterpart to the type of `X`.
+      var nullabilityNodeTarget =
+          NullabilityNodeTarget.text('expression').withCodeRef(node);
+      var nullabilityNode =
+          NullabilityNode.forInferredType(nullabilityNodeTarget);
+      _graph.makeNonNullableUnion(
+          nullabilityNode, CallTearOffOrigin(source, node));
+      calleeType = targetType.withNode(nullabilityNode);
+    } else if (callee != null) {
+      calleeType = getOrComputeElementType(callee, targetType: targetType);
+    }
+    if (calleeType == null) {
       // Dynamic dispatch.
       return _makeNullableDynamicType(node);
     }
-    var calleeType = getOrComputeElementType(callee, targetType: targetType);
-    // TODO(paulberry): substitute if necessary
     if (propertyName.inSetterContext()) {
       if (isNullAware) {
         _conditionalNodes[node] = targetType.node;
@@ -3141,6 +3222,47 @@
 
     return _futureOf(type, node);
   }
+
+  /// If the [node] is the finishing identifier of an assignment, return its
+  /// "writeElement", otherwise return its "staticElement", which might be
+  /// thought as the "readElement".
+  static Element getWriteOrReadElement(AstNode node) {
+    var writeElement = _getWriteElement(node);
+    if (writeElement != null) {
+      return writeElement;
+    }
+
+    if (node is IndexExpression) {
+      return node.staticElement;
+    } else if (node is SimpleIdentifier) {
+      return node.staticElement;
+    } else {
+      return null;
+    }
+  }
+
+  /// If the [node] is the target of a [CompoundAssignmentExpression],
+  /// return the corresponding "writeElement", which is the local variable,
+  /// the setter referenced with a [SimpleIdentifier] or a [PropertyAccess],
+  /// or the `[]=` operator.
+  static Element _getWriteElement(AstNode node) {
+    var parent = node.parent;
+    if (parent is AssignmentExpression && parent.leftHandSide == node) {
+      return parent.writeElement;
+    } else if (parent is PostfixExpression) {
+      return parent.writeElement;
+    } else if (parent is PrefixExpression) {
+      return parent.writeElement;
+    }
+
+    if (parent is PrefixedIdentifier && parent.identifier == node) {
+      return _getWriteElement(parent);
+    } else if (parent is PropertyAccess && parent.propertyName == node) {
+      return _getWriteElement(parent);
+    } else {
+      return null;
+    }
+  }
 }
 
 /// Implementation of [_checkAssignment] for [EdgeBuilder].
diff --git a/pkg/nnbd_migration/lib/src/edge_origin.dart b/pkg/nnbd_migration/lib/src/edge_origin.dart
index 61c6837..5b42111 100644
--- a/pkg/nnbd_migration/lib/src/edge_origin.dart
+++ b/pkg/nnbd_migration/lib/src/edge_origin.dart
@@ -371,6 +371,19 @@
   EdgeOriginKind get kind => EdgeOriginKind.isCheckMainType;
 }
 
+/// An edge origin used for the return type of an iterator method that might be
+/// changed into an extension method from package:collection.
+class IteratorMethodReturnOrigin extends EdgeOrigin {
+  IteratorMethodReturnOrigin(Source source, AstNode node) : super(source, node);
+
+  @override
+  String get description =>
+      'Call to iterator method with orElse that returns null';
+
+  @override
+  EdgeOriginKind get kind => EdgeOriginKind.iteratorMethodReturn;
+}
+
 /// An edge origin used for the type argument of a list constructor that
 /// specified an initial length, because that type argument must be nullable.
 class ListLengthConstructorOrigin extends EdgeOrigin {
@@ -384,6 +397,18 @@
   EdgeOriginKind get kind => EdgeOriginKind.listLengthConstructor;
 }
 
+/// An edge origin used for edges that originated because of a tear-off of
+/// `call` on a function type.
+class CallTearOffOrigin extends EdgeOrigin {
+  CallTearOffOrigin(Source source, AstNode node) : super(source, node);
+
+  @override
+  String get description => 'tear-off of .call';
+
+  @override
+  EdgeOriginKind get kind => EdgeOriginKind.callTearOff;
+}
+
 /// An edge origin used for edges that originated because a literal expression
 /// has a known nullability.
 class LiteralOrigin extends EdgeOrigin {
diff --git a/pkg/nnbd_migration/lib/src/edit_plan.dart b/pkg/nnbd_migration/lib/src/edit_plan.dart
index 621a6e8a..c603225 100644
--- a/pkg/nnbd_migration/lib/src/edit_plan.dart
+++ b/pkg/nnbd_migration/lib/src/edit_plan.dart
@@ -495,11 +495,11 @@
     }
   }
 
-  /// Creates a new edit plan that removes [node] from the AST.
+  /// Creates a new edit plan that removes [sourceNode] from the AST.
   ///
-  /// [node] must be one element of a variable length sequence maintained by
-  /// [node]'s parent (for example, a statement in a block, an element in a
-  /// list, a declaration in a class, etc.).  If it is not, an exception is
+  /// [sourceNode] must be one element of a variable length sequence maintained
+  /// by [sourceNode]'s parent (for example, a statement in a block, an element
+  /// in a list, a declaration in a class, etc.).  If it is not, an exception is
   /// thrown.
   ///
   /// Optional argument [info] contains information about why the change was
@@ -674,9 +674,10 @@
   ///
   /// Optional argument [info] contains information about why the change was
   /// made.
-  EditPlan tryRemoveNode(AstNode sourceNode, {AtomicEditInfo info}) {
+  EditPlan tryRemoveNode(AstNode sourceNode,
+      {List<AstNode> sequenceNodes, AtomicEditInfo info}) {
     var parent = sourceNode.parent;
-    var sequenceNodes = _computeSequenceNodes(parent);
+    sequenceNodes ??= _computeSequenceNodes(parent);
     if (sequenceNodes == null) {
       return null;
     }
@@ -809,6 +810,8 @@
       return node.elements;
     } else if (node is ArgumentList) {
       return node.arguments;
+    } else if (node is FormalParameter) {
+      return node.metadata;
     } else if (node is FormalParameterList) {
       return node.parameters;
     } else if (node is VariableDeclarationList) {
@@ -1525,7 +1528,8 @@
       AstNode parent, List<AstNode> childNodes) {
     if (parent is Block ||
         parent is ClassDeclaration ||
-        parent is CompilationUnit) {
+        parent is CompilationUnit ||
+        parent is FormalParameter) {
       // These parent types don't use separators.
       return null;
     } else {
diff --git a/pkg/nnbd_migration/lib/src/exceptions.dart b/pkg/nnbd_migration/lib/src/exceptions.dart
index e862bdb..580fcda 100644
--- a/pkg/nnbd_migration/lib/src/exceptions.dart
+++ b/pkg/nnbd_migration/lib/src/exceptions.dart
@@ -1,13 +1,11 @@
-import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:nnbd_migration/src/messages.dart';
 
 /// A [StateError] specific to the ways that the NNBD experiment can be
 /// misconfigured which may prevent the tool from working.
 class ExperimentStatusException extends StateError {
-  /// A file included in the migration dir has already been migrated.
-  ExperimentStatusException.migratedAlready(String path)
-      : super('$migratedAlready: $path');
+  /// All files included in the migration dir have already been migrated.
+  ExperimentStatusException.migratedAlready() : super(migratedAlready);
 
   /// The SDK was analyzed without NNBD semantics.
   ExperimentStatusException.sdkExperimentDisabled() : super(nnbdExperimentOff);
@@ -15,6 +13,10 @@
   /// The SDK does not contain the NNBD sources, it is the pre-unfork copy.
   ExperimentStatusException.sdkPreforkSources() : super(sdkNnbdOff);
 
+  /// The user's code imports unmigrated dependencies.
+  ExperimentStatusException.unmigratedDependencies(List<String> uris)
+      : super(unmigratedDependenciesError(uris));
+
   /// Throw an [ExperimentStatusException] if the [result] seems to have
   /// incorrectly configured experiment flags/nnbd sources.
   static void sanityCheck(ResolvedUnitResult result) {
@@ -30,10 +32,5 @@
     if (equalsParamType != 'Object') {
       throw ExperimentStatusException.sdkPreforkSources();
     }
-
-    if (result.unit.featureSet.isEnabled(Feature.non_nullable)) {
-      // TODO(mfairhurst): Allow for skipping already migrated compilation units.
-      throw ExperimentStatusException.migratedAlready(result.path);
-    }
   }
 }
diff --git a/pkg/nnbd_migration/lib/src/fix_aggregator.dart b/pkg/nnbd_migration/lib/src/fix_aggregator.dart
index 47d8aa5..2105912 100644
--- a/pkg/nnbd_migration/lib/src/fix_aggregator.dart
+++ b/pkg/nnbd_migration/lib/src/fix_aggregator.dart
@@ -9,6 +9,7 @@
 import 'package:analyzer/dart/element/nullability_suffix.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
+import 'package:meta/meta.dart';
 import 'package:nnbd_migration/fix_reason_target.dart';
 import 'package:nnbd_migration/instrumentation.dart';
 import 'package:nnbd_migration/nnbd_migration.dart';
@@ -278,6 +279,48 @@
   }
 }
 
+/// Implementation of [NodeChange] specialized for operating on [ArgumentList]
+/// nodes.
+class NodeChangeForArgumentList extends NodeChange<ArgumentList> {
+  /// Map whose keys are the arguments that should be dropped from this argument
+  /// list, if any.  Values are info about why the arguments are being dropped.
+  final Map<Expression, AtomicEditInfo> _argumentsToDrop = {};
+
+  NodeChangeForArgumentList() : super._();
+
+  /// Queries the map whose keys are the arguments that should be dropped from
+  /// this argument list, if any.  Values are info about why the arguments are
+  /// being dropped.
+  @visibleForTesting
+  Map<Expression, AtomicEditInfo> get argumentsToDrop => _argumentsToDrop;
+
+  @override
+  Iterable<String> get _toStringParts =>
+      [if (_argumentsToDrop.isNotEmpty) 'argumentsToDrop: $_argumentsToDrop'];
+
+  /// Updates `this` so that the given [argument] will be dropped, using [info]
+  /// to annotate the reason why it is being dropped.
+  void dropArgument(Expression argument, AtomicEditInfo info) {
+    assert(!_argumentsToDrop.containsKey(argument));
+    _argumentsToDrop[argument] = info;
+  }
+
+  @override
+  EditPlan _apply(ArgumentList node, FixAggregator aggregator) {
+    assert(_argumentsToDrop.keys.every((e) => identical(e.parent, node)));
+    List<EditPlan> innerPlans = [];
+    for (var argument in node.arguments) {
+      if (_argumentsToDrop.containsKey(argument)) {
+        innerPlans.add(aggregator.planner
+            .removeNode(argument, info: _argumentsToDrop[argument]));
+      } else {
+        innerPlans.add(aggregator.planForNode(argument));
+      }
+    }
+    return aggregator.planner.passThrough(node, innerPlans: innerPlans);
+  }
+}
+
 /// Implementation of [NodeChange] specialized for operating on [AsExpression]
 /// nodes.
 class NodeChangeForAsExpression extends NodeChangeForExpression<AsExpression> {
@@ -393,13 +436,35 @@
 /// Implementation of [NodeChange] specialized for operating on
 /// [CompilationUnit] nodes.
 class NodeChangeForCompilationUnit extends NodeChange<CompilationUnit> {
+  /// A map of the imports that should be added, or the empty map if no imports
+  /// should be added.
+  ///
+  /// Each import is expressed as a map entry whose key is the URI to import and
+  /// whose value is the set of symbols to show.
+  final Map<String, Set<String>> _addImports = {};
+
   bool removeLanguageVersionComment = false;
 
   NodeChangeForCompilationUnit() : super._();
 
+  /// Queries a map of the imports that should be added, or the empty map if no
+  /// imports should be added.
+  ///
+  /// Each import is expressed as a map entry whose key is the URI to import and
+  /// whose value is the set of symbols to show.
+  @visibleForTesting
+  Map<String, Set<String>> get addImports => _addImports;
+
   @override
-  Iterable<String> get _toStringParts =>
-      [if (removeLanguageVersionComment) 'removeLanguageVersionComment'];
+  Iterable<String> get _toStringParts => [
+        if (_addImports.isNotEmpty) 'addImports: $_addImports',
+        if (removeLanguageVersionComment) 'removeLanguageVersionComment'
+      ];
+
+  /// Updates `this` so that an import of [uri] will be added, showing [name].
+  void addImport(String uri, String name) {
+    (_addImports[uri] ??= {}).add(name);
+  }
 
   @override
   EditPlan _apply(CompilationUnit node, FixAggregator aggregator) {
@@ -412,9 +477,68 @@
               NullabilityFixDescription.removeLanguageVersionComment,
               const {})));
     }
-    innerPlans.addAll(aggregator.innerPlansForNode(node));
+    _processDirectives(node, aggregator, innerPlans);
+    for (var declaration in node.declarations) {
+      innerPlans.add(aggregator.planForNode(declaration));
+    }
     return aggregator.planner.passThrough(node, innerPlans: innerPlans);
   }
+
+  /// Adds the necessary inner plans to [innerPlans] for the directives part of
+  /// [node].  This solely involves adding imports.
+  void _processDirectives(CompilationUnit node, FixAggregator aggregator,
+      List<EditPlan> innerPlans) {
+    List<MapEntry<String, Set<String>>> importsToAdd =
+        _addImports.entries.toList();
+    importsToAdd.sort((x, y) => x.key.compareTo(y.key));
+
+    void insertImport(int offset, MapEntry<String, Set<String>> importToAdd,
+        {String prefix = '', String suffix = '\n'}) {
+      var shownNames = importToAdd.value.toList();
+      shownNames.sort();
+      innerPlans.add(aggregator.planner.insertText(node, offset, [
+        if (prefix.isNotEmpty) AtomicEdit.insert(prefix),
+        AtomicEdit.insert(
+            "import '${importToAdd.key}' show ${shownNames.join(', ')};",
+            info: AtomicEditInfo(NullabilityFixDescription.addImport, {})),
+        if (suffix.isNotEmpty) AtomicEdit.insert(suffix)
+      ]));
+    }
+
+    if (node.directives.every((d) => d is LibraryDirective)) {
+      while (importsToAdd.isNotEmpty) {
+        insertImport(
+            node.declarations.beginToken.offset, importsToAdd.removeAt(0),
+            suffix: importsToAdd.isEmpty ? '\n\n' : '\n');
+      }
+    } else {
+      for (var directive in node.directives) {
+        while (importsToAdd.isNotEmpty &&
+            _shouldImportGoBefore(importsToAdd.first.key, directive)) {
+          insertImport(directive.offset, importsToAdd.removeAt(0));
+        }
+        innerPlans.add(aggregator.planForNode(directive));
+      }
+      while (importsToAdd.isNotEmpty) {
+        insertImport(node.directives.last.end, importsToAdd.removeAt(0),
+            prefix: '\n', suffix: '');
+      }
+    }
+  }
+
+  /// Determines whether a new import of [newImportUri] should be sorted before
+  /// an existing [directive].
+  bool _shouldImportGoBefore(String newImportUri, Directive directive) {
+    if (directive is ImportDirective) {
+      return newImportUri.compareTo(directive.uriContent) < 0;
+    } else if (directive is LibraryDirective) {
+      // Library directives must come before imports.
+      return false;
+    } else {
+      // Everything else tends to come after imports.
+      return true;
+    }
+  }
 }
 
 /// Common infrastructure used by [NodeChange] objects that operate on AST nodes
@@ -542,6 +666,14 @@
   /// contained in the edit.
   AtomicEditInfo addRequiredKeywordInfo;
 
+  /// If non-null, indicates a `@required` annotation which should be removed
+  /// from this node.
+  Annotation annotationToRemove;
+
+  /// If [annotationToRemove] is non-null, the information that should be
+  /// contained in the edit.
+  AtomicEditInfo removeAnnotationInfo;
+
   NodeChangeForDefaultFormalParameter() : super._();
 
   @override
@@ -552,14 +684,27 @@
   EditPlan _apply(DefaultFormalParameter node, FixAggregator aggregator) {
     var innerPlan = aggregator.innerPlanForNode(node);
     if (!addRequiredKeyword) return innerPlan;
-    return aggregator.planner.surround(innerPlan,
-        prefix: [AtomicEdit.insert('required ', info: addRequiredKeywordInfo)]);
+
+    var offset = node.firstTokenAfterCommentAndMetadata.offset;
+    return aggregator.planner.passThrough(node, innerPlans: [
+      aggregator.planner.insertText(node, offset, [
+        AtomicEdit.insert('required ', info: addRequiredKeywordInfo),
+      ]),
+      if (annotationToRemove != null)
+        aggregator.planner
+            .removeNode(annotationToRemove, info: removeAnnotationInfo),
+      ...aggregator.innerPlansForNode(node),
+    ]);
   }
 }
 
 /// Implementation of [NodeChange] specialized for operating on [Expression]
 /// nodes.
 class NodeChangeForExpression<N extends Expression> extends NodeChange<N> {
+  bool _addsNoValidMigration = false;
+
+  AtomicEditInfo _addNoValidMigrationInfo;
+
   bool _addsNullCheck = false;
 
   AtomicEditInfo _addNullCheckInfo;
@@ -572,9 +717,15 @@
 
   NodeChangeForExpression() : super._();
 
+  /// Gets the info for any added "no valid migration" comment.
+  AtomicEditInfo get addNoValidMigrationInfo => _addNoValidMigrationInfo;
+
   /// Gets the info for any added null check.
   AtomicEditInfo get addNullCheckInfo => _addNullCheckInfo;
 
+  /// Indicates whether [addNoValidMigration] has been called.
+  bool get addsNoValidMigration => _addsNoValidMigration;
+
   /// Indicates whether [addNullCheck] has been called.
   bool get addsNullCheck => _addsNullCheck;
 
@@ -587,10 +738,17 @@
 
   @override
   Iterable<String> get _toStringParts => [
+        if (_addsNoValidMigration) 'addsNoValidMigration',
         if (_addsNullCheck) 'addsNullCheck',
         if (_introducesAsType != null) 'introducesAsType'
       ];
 
+  void addNoValidMigration(AtomicEditInfo info) {
+    assert(!_addsNoValidMigration);
+    _addsNoValidMigration = true;
+    _addNoValidMigrationInfo = info;
+  }
+
   /// Causes a null check to be added to this expression, with the given [info].
   void addNullCheck(AtomicEditInfo info, {HintComment hint}) {
     assert(!_addsNullCheck);
@@ -630,6 +788,11 @@
             .addUnaryPostfix(plan, TokenType.BANG, info: _addNullCheckInfo);
       }
     }
+    if (_addsNoValidMigration) {
+      plan = aggregator.planner.addCommentPostfix(
+          plan, '/* no valid migration */',
+          info: _addNoValidMigrationInfo, isInformative: true);
+    }
     if (_introducesAsType != null) {
       plan = aggregator.planner.addBinaryPostfix(
           plan, TokenType.AS, aggregator.typeToCode(_introducesAsType),
@@ -749,6 +912,51 @@
   }
 }
 
+/// Implementation of [NodeChange] specialized for operating on
+/// [SimpleIdentifier] nodes that represent a method name.
+class NodeChangeForMethodName extends NodeChange<SimpleIdentifier> {
+  /// The name the method name should be changed to, or `null` if no change
+  /// should be made.
+  String _replacement;
+
+  /// Info object associated with the replacement.
+  AtomicEditInfo _replacementInfo;
+
+  NodeChangeForMethodName() : super._();
+
+  /// Queries the name the method name should be changed to, or `null` if no
+  /// change should be made.
+  @visibleForTesting
+  String get replacement => _replacement;
+
+  /// Queries the info object associated with the replacement.
+  @visibleForTesting
+  AtomicEditInfo get replacementInfo => _replacementInfo;
+
+  @override
+  Iterable<String> get _toStringParts =>
+      [if (replacement != null) 'replacement: $replacement'];
+
+  /// Updates `this` so that the method name will be changed to [replacement],
+  /// using [info] to annotate the reason for the change.
+  void replaceWith(String replacement, AtomicEditInfo info) {
+    assert(_replacement == null);
+    _replacement = replacement;
+    _replacementInfo = info;
+  }
+
+  @override
+  EditPlan _apply(SimpleIdentifier node, FixAggregator aggregator) {
+    if (replacement != null) {
+      return aggregator.planner.replace(
+          node, [AtomicEdit.insert(replacement, info: replacementInfo)],
+          info: replacementInfo);
+    } else {
+      return aggregator.innerPlanForNode(node);
+    }
+  }
+}
+
 /// Common infrastructure used by [NodeChange] objects that operate on AST nodes
 /// with that can be null-aware (method invocations and propety accesses).
 mixin NodeChangeForNullAware<N extends Expression> on NodeChange<N> {
@@ -831,6 +1039,60 @@
   }
 }
 
+/// Implementation of [NodeChange] specialized for operating on [ShowCombinator]
+/// nodes.
+class NodeChangeForShowCombinator extends NodeChange<ShowCombinator> {
+  /// A set of the names that should be added, or the empty set if no names
+  /// should be added.
+  final Set<String> _addNames = {};
+
+  NodeChangeForShowCombinator() : super._();
+
+  /// Queries the set of names that should be added, or the empty set if no
+  /// names should be added.
+  @visibleForTesting
+  Iterable<String> get addNames => _addNames;
+
+  @override
+  Iterable<String> get _toStringParts => [
+        if (_addNames.isNotEmpty) 'addNames: $_addNames',
+      ];
+
+  /// Updates `this` so that [name] will be added.
+  void addName(String name) {
+    _addNames.add(name);
+  }
+
+  @override
+  EditPlan _apply(ShowCombinator node, FixAggregator aggregator) {
+    List<EditPlan> innerPlans = [];
+    List<String> namesToAdd = _addNames.toList();
+    namesToAdd.sort();
+
+    void insertName(int offset, String nameToAdd,
+        {String prefix = '', String suffix = ', '}) {
+      innerPlans.add(aggregator.planner.insertText(node, offset, [
+        if (prefix.isNotEmpty) AtomicEdit.insert(prefix),
+        AtomicEdit.insert(nameToAdd),
+        if (suffix.isNotEmpty) AtomicEdit.insert(suffix)
+      ]));
+    }
+
+    for (var shownName in node.shownNames) {
+      while (namesToAdd.isNotEmpty &&
+          namesToAdd.first.compareTo(shownName.name) < 0) {
+        insertName(shownName.offset, namesToAdd.removeAt(0));
+      }
+      innerPlans.add(aggregator.planForNode(shownName));
+    }
+    while (namesToAdd.isNotEmpty) {
+      insertName(node.shownNames.last.end, namesToAdd.removeAt(0),
+          prefix: ', ', suffix: '');
+    }
+    return aggregator.planner.passThrough(node, innerPlans: innerPlans);
+  }
+}
+
 /// Implementation of [NodeChange] specialized for operating on
 /// [SimpleFormalParameter] nodes.
 class NodeChangeForSimpleFormalParameter
@@ -1017,9 +1279,11 @@
     innerPlans.addAll(aggregator.innerPlansForNode(node));
     var plan = aggregator.planner.passThrough(node, innerPlans: innerPlans);
     if (lateHint != null) {
+      var description = lateHint.kind == HintCommentKind.late_
+          ? NullabilityFixDescription.addLateDueToHint
+          : NullabilityFixDescription.addLateFinalDueToHint;
       plan = aggregator.planner.acceptLateHint(plan, lateHint,
-          info: AtomicEditInfo(NullabilityFixDescription.addLateDueToHint, {},
-              hintComment: lateHint));
+          info: AtomicEditInfo(description, {}, hintComment: lateHint));
     }
     return plan;
   }
@@ -1034,6 +1298,10 @@
   NodeChange visitAnnotation(Annotation node) => NodeChangeForAnnotation();
 
   @override
+  NodeChange visitArgumentList(ArgumentList node) =>
+      NodeChangeForArgumentList();
+
+  @override
   NodeChange visitAsExpression(AsExpression node) =>
       NodeChangeForAsExpression();
 
@@ -1096,10 +1364,24 @@
       NodeChangeForPropertyAccess();
 
   @override
+  NodeChange visitShowCombinator(ShowCombinator node) =>
+      NodeChangeForShowCombinator();
+
+  @override
   NodeChange visitSimpleFormalParameter(SimpleFormalParameter node) =>
       NodeChangeForSimpleFormalParameter();
 
   @override
+  NodeChange visitSimpleIdentifier(SimpleIdentifier node) {
+    var parent = node.parent;
+    if (parent is MethodInvocation && identical(node, parent.methodName)) {
+      return NodeChangeForMethodName();
+    } else {
+      return super.visitSimpleIdentifier(node);
+    }
+  }
+
+  @override
   NodeChange visitTypeName(TypeName node) => NodeChangeForTypeAnnotation();
 
   @override
diff --git a/pkg/nnbd_migration/lib/src/fix_builder.dart b/pkg/nnbd_migration/lib/src/fix_builder.dart
index 9e5e486..32b2777 100644
--- a/pkg/nnbd_migration/lib/src/fix_builder.dart
+++ b/pkg/nnbd_migration/lib/src/fix_builder.dart
@@ -26,6 +26,7 @@
 import 'package:analyzer/src/generated/resolver.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
+import 'package:meta/meta.dart';
 import 'package:nnbd_migration/fix_reason_target.dart';
 import 'package:nnbd_migration/instrumentation.dart';
 import 'package:nnbd_migration/nnbd_migration.dart';
@@ -37,6 +38,7 @@
 import 'package:nnbd_migration/src/utilities/hint_utils.dart';
 import 'package:nnbd_migration/src/utilities/permissive_mode.dart';
 import 'package:nnbd_migration/src/utilities/resolution_utils.dart';
+import 'package:nnbd_migration/src/utilities/where_or_null_transformer.dart';
 import 'package:nnbd_migration/src/variables.dart';
 
 bool _isIncrementOrDecrementOperator(TokenType tokenType) {
@@ -118,6 +120,15 @@
 
   final NullabilityGraph _graph;
 
+  /// Helper that assists us in transforming Iterable methods to their "OrNull"
+  /// equivalents, or `null` if we are not doing such transformations.
+  final WhereOrNullTransformer _whereOrNullTransformer;
+
+  /// Indicates whether an import of package:collection's `IterableExtension`
+  /// will need to be added.
+  @visibleForTesting
+  bool needsIterableExtension = false;
+
   factory FixBuilder(
       Source source,
       DecoratedClassHierarchy decoratedClassHierarchy,
@@ -128,7 +139,8 @@
       NullabilityMigrationListener listener,
       CompilationUnit unit,
       bool warnOnWeakCode,
-      NullabilityGraph graph) {
+      NullabilityGraph graph,
+      bool transformWhereOrNull) {
     var migrationResolutionHooks = MigrationResolutionHooksImpl();
     return FixBuilder._(
         decoratedClassHierarchy,
@@ -143,7 +155,8 @@
         unit,
         migrationResolutionHooks,
         warnOnWeakCode,
-        graph);
+        graph,
+        transformWhereOrNull);
   }
 
   FixBuilder._(
@@ -156,8 +169,12 @@
       this.unit,
       this.migrationResolutionHooks,
       this.warnOnWeakCode,
-      this._graph)
-      : typeProvider = _typeSystem.typeProvider {
+      this._graph,
+      bool transformWhereOrNull)
+      : typeProvider = _typeSystem.typeProvider,
+        _whereOrNullTransformer = transformWhereOrNull
+            ? WhereOrNullTransformer(_typeSystem.typeProvider, _typeSystem)
+            : null {
     migrationResolutionHooks._fixBuilder = this;
     assert(_typeSystem.isNonNullableByDefault);
     assert((typeProvider as TypeProviderImpl).isNonNullableByDefault);
@@ -308,6 +325,11 @@
   FlowAnalysis<AstNode, Statement, Expression, PromotableElement, DartType>
       _flowAnalysis;
 
+  /// Deferred processing that should be performed once we have finished
+  /// evaluating the type of a method invocation.
+  final Map<MethodInvocation, DartType Function(DartType)>
+      _deferredMethodInvocationProcessing = {};
+
   TypeProvider get typeProvider => _fixBuilder.typeProvider;
 
   @override
@@ -551,12 +573,21 @@
       {AtomicEditInfo info, HintComment hint}) {
     var checks =
         _fixBuilder._variables.expressionChecks(_fixBuilder.source, node);
+    bool noValidMigration = node is NullLiteral && hint == null;
     info ??= checks != null
         ? AtomicEditInfo(
-            NullabilityFixDescription.checkExpression, checks.edges)
+            noValidMigration
+                ? NullabilityFixDescription.noValidMigrationForNull
+                : NullabilityFixDescription.checkExpression,
+            checks.edges)
         : null;
-    (_fixBuilder._getChange(node) as NodeChangeForExpression)
-        .addNullCheck(info, hint: hint);
+    var nodeChangeForExpression =
+        _fixBuilder._getChange(node) as NodeChangeForExpression;
+    if (noValidMigration) {
+      nodeChangeForExpression.addNoValidMigration(info);
+    } else {
+      nodeChangeForExpression.addNullCheck(info, hint: hint);
+    }
     _flowAnalysis.nonNullAssert_end(node);
     return _fixBuilder._typeSystem.promoteToNonNull(type as TypeImpl);
   }
@@ -584,6 +615,12 @@
 
   DartType _modifyRValueType(Expression node, DartType type,
       {DartType context}) {
+    if (node is MethodInvocation) {
+      var deferredProcessing = _deferredMethodInvocationProcessing.remove(node);
+      if (deferredProcessing != null) {
+        type = deferredProcessing(type);
+      }
+    }
     var hint =
         _fixBuilder._variables.getNullCheckHint(_fixBuilder.source, node);
     if (hint != null) {
@@ -602,6 +639,29 @@
     context ??=
         InferenceContext.getContext(ancestor) ?? DynamicTypeImpl.instance;
     if (!_fixBuilder._typeSystem.isSubtypeOf(type, context)) {
+      var transformationInfo =
+          _fixBuilder._whereOrNullTransformer?.tryTransformOrElseArgument(node);
+      if (transformationInfo != null) {
+        // We can fix this by dropping the node and changing the method call.
+        _fixBuilder.needsIterableExtension = true;
+        var info = AtomicEditInfo(
+            NullabilityFixDescription.changeMethodName(
+                transformationInfo.originalName,
+                transformationInfo.replacementName),
+            {});
+        (_fixBuilder._getChange(transformationInfo.methodInvocation.methodName)
+                as NodeChangeForMethodName)
+            .replaceWith(transformationInfo.replacementName, info);
+        (_fixBuilder._getChange(
+                    transformationInfo.methodInvocation.argumentList)
+                as NodeChangeForArgumentList)
+            .dropArgument(transformationInfo.orElseArgument, info);
+        _deferredMethodInvocationProcessing[
+                transformationInfo.methodInvocation] =
+            (methodInvocationType) => _fixBuilder._typeSystem
+                .makeNullable(methodInvocationType as TypeImpl);
+        return type;
+      }
       // Either a cast or a null check is needed.  We prefer to do a null
       // check if we can.
       var nonNullType = _fixBuilder._typeSystem.promoteToNonNull(type);
@@ -855,6 +915,21 @@
       (_fixBuilder._getChange(node) as NodeChangeForCompilationUnit)
           .removeLanguageVersionComment = true;
     }
+    if (_fixBuilder.needsIterableExtension) {
+      var packageCollectionImport =
+          _findImportDirective(node, 'package:collection/collection.dart');
+      if (packageCollectionImport != null) {
+        for (var combinator in packageCollectionImport.combinators) {
+          if (combinator is ShowCombinator) {
+            _ensureShows(combinator, 'IterableExtension');
+          }
+        }
+      } else {
+        (_fixBuilder._getChange(node) as NodeChangeForCompilationUnit)
+            .addImport(
+                'package:collection/collection.dart', 'IterableExtension');
+      }
+    }
     super.visitCompilationUnit(node);
   }
 
@@ -930,6 +1005,28 @@
     }
     super.visitVariableDeclarationList(node);
   }
+
+  /// Creates the necessary changes to ensure that [combinator] shows [name].
+  void _ensureShows(ShowCombinator combinator, String name) {
+    if (combinator.shownNames.any((shownName) => shownName.name == name)) {
+      return;
+    }
+    (_fixBuilder._getChange(combinator) as NodeChangeForShowCombinator)
+        .addName(name);
+  }
+
+  /// Searches [unit] for an unprefixed import directive whose URI matches
+  /// [uri], returning it if found, or `null` if not found.
+  ImportDirective _findImportDirective(CompilationUnit unit, String uri) {
+    for (var directive in unit.directives) {
+      if (directive is ImportDirective &&
+          directive.prefix == null &&
+          directive.uriContent == uri) {
+        return directive;
+      }
+    }
+    return null;
+  }
 }
 
 /// Visitor that computes additional migrations on behalf of [FixBuilder] that
@@ -1048,20 +1145,33 @@
             cls.name, method.name, element.name),
         {FixReasonTarget.root: node});
     var metadata = parameter.metadata;
-    for (var annotation in metadata) {
-      if (annotation.elementAnnotation.isRequired) {
-        // TODO(paulberry): what if `@required` isn't the first annotation?
-        // Will we produce something that isn't grammatical?
-        (_fixBuilder._getChange(annotation) as NodeChangeForAnnotation)
+    if (metadata != null && metadata.isNotEmpty) {
+      // Only the last annotation can be changed into a `required` keyword;
+      // changing an earlier annotation into a keyword would be illegal.
+      var lastAnnotation = metadata.last;
+      if (lastAnnotation.elementAnnotation.isRequired) {
+        (_fixBuilder._getChange(lastAnnotation) as NodeChangeForAnnotation)
           ..changeToRequiredKeyword = true
           ..changeToRequiredKeywordInfo = info;
         return;
       }
     }
     // Otherwise create a new `required` keyword.
-    (_fixBuilder._getChange(parameter) as NodeChangeForDefaultFormalParameter)
+    var nodeChange = (_fixBuilder._getChange(parameter)
+        as NodeChangeForDefaultFormalParameter)
       ..addRequiredKeyword = true
       ..addRequiredKeywordInfo = info;
+    var requiredAnnotation = metadata?.firstWhere(
+        (annotation) => annotation.elementAnnotation.isRequired,
+        orElse: () => null);
+    if (requiredAnnotation != null) {
+      // If the parameter was annotated with `@required`, but it was not the
+      // last annotation, we remove the annotation in addition to adding the
+      // `required` keyword.
+      nodeChange
+        ..annotationToRemove = requiredAnnotation
+        ..removeAnnotationInfo = info;
+    }
   }
 
   void _makeTypeNameNullable(TypeAnnotation node, DecoratedType decoratedType) {
diff --git a/pkg/nnbd_migration/lib/src/front_end/charcodes.dart b/pkg/nnbd_migration/lib/src/front_end/charcodes.dart
new file mode 100644
index 0000000..aba601f
--- /dev/null
+++ b/pkg/nnbd_migration/lib/src/front_end/charcodes.dart
@@ -0,0 +1,12 @@
+// Copyright (c) 2020, 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.
+
+/// "Line feed" control character.
+const int $lf = 0x0a;
+
+/// "Carriage return" control character.
+const int $cr = 0x0d;
+
+/// Space character.
+const int $space = 0x20;
diff --git a/pkg/nnbd_migration/lib/src/front_end/info_builder.dart b/pkg/nnbd_migration/lib/src/front_end/info_builder.dart
index c16f646..b5b8e56 100644
--- a/pkg/nnbd_migration/lib/src/front_end/info_builder.dart
+++ b/pkg/nnbd_migration/lib/src/front_end/info_builder.dart
@@ -12,6 +12,7 @@
 import 'package:analyzer_plugin/protocol/protocol_common.dart' as protocol;
 import 'package:analyzer_plugin/src/utilities/navigation/navigation.dart';
 import 'package:analyzer_plugin/utilities/navigation/navigation_dart.dart';
+import 'package:cli_util/cli_logging.dart';
 import 'package:meta/meta.dart';
 import 'package:nnbd_migration/fix_reason_target.dart';
 import 'package:nnbd_migration/instrumentation.dart';
@@ -22,12 +23,16 @@
 import 'package:nnbd_migration/src/front_end/instrumentation_information.dart';
 import 'package:nnbd_migration/src/front_end/migration_info.dart';
 import 'package:nnbd_migration/src/front_end/offset_mapper.dart';
+import 'package:nnbd_migration/src/utilities/progress_bar.dart';
 
 /// A builder used to build the migration information for a library.
 class InfoBuilder {
   /// The node mapper for the migration state.
   NodeMapper nodeMapper;
 
+  /// The logger to use for showing progress when explaining the migration.
+  final Logger _logger;
+
   /// The resource provider used to access the file system.
   ResourceProvider provider;
 
@@ -49,7 +54,7 @@
 
   /// Initialize a newly created builder.
   InfoBuilder(this.provider, this.includedPath, this.info, this.listener,
-      this.migration, this.nodeMapper);
+      this.migration, this.nodeMapper, this._logger);
 
   /// The provider used to get information about libraries.
   DriverProviderImpl get driverProvider => listener.server;
@@ -60,7 +65,10 @@
     var sourceInfoMap = info.sourceInformation;
     Set<UnitInfo> units =
         SplayTreeSet<UnitInfo>((u1, u2) => u1.path.compareTo(u2.path));
+    var progressBar = ProgressBar(_logger, sourceInfoMap.length);
+
     for (var source in sourceInfoMap.keys) {
+      progressBar.tick();
       var filePath = source.fullName;
       var session = driverProvider.getAnalysisSession(filePath);
       if (!session.getFile(filePath).isPart) {
@@ -86,6 +94,7 @@
         }
       }
     }
+    progressBar.complete();
     return units;
   }
 
@@ -123,14 +132,16 @@
         'Reason', [_makeTraceEntry(info.description, info.codeReference)]));
   }
 
-  /// Return an edit that can be applied.
+  /// Returns a list of edits that can be applied.
   List<EditDetail> _computeEdits(
-      AtomicEditInfo fixInfo, int offset, String content) {
-    EditDetail _removeHint(String description) => EditDetail.fromSourceEdit(
+      AtomicEditInfo fixInfo, int offset, ResolvedUnitResult result) {
+    var content = result.content;
+
+    EditDetail removeHint(String description) => EditDetail.fromSourceEdit(
         description,
         fixInfo.hintComment.changesToRemove(content).toSourceEdits().single);
 
-    EditDetail _changeHint(String description, String replacement) =>
+    EditDetail changeHint(String description, String replacement) =>
         EditDetail.fromSourceEdit(
             description,
             fixInfo.hintComment
@@ -142,13 +153,27 @@
     var fixKind = fixInfo.description.kind;
     switch (fixKind) {
       case NullabilityFixKind.addLateDueToHint:
-        edits.add(_removeHint('Remove /*late*/ hint'));
+        edits.add(removeHint('Remove /*late*/ hint'));
+        break;
+      case NullabilityFixKind.addLateFinalDueToHint:
+        edits.add(removeHint('Remove /*late final*/ hint'));
         break;
       case NullabilityFixKind.addRequired:
-        // TODO(brianwilkerson) This doesn't verify that the meta package has
-        //  been imported.
-        edits
-            .add(EditDetail("Mark with '@required'.", offset, 0, '@required '));
+        var metaImport =
+            _findImportDirective(result.unit, 'package:meta/meta.dart');
+        if (metaImport == null) {
+          edits.add(
+              EditDetail('Add /*required*/ hint', offset, 0, '/*required*/ '));
+        } else {
+          var prefix = metaImport.prefix?.name;
+          if (prefix == null) {
+            edits.add(
+                EditDetail("Mark with '@required'", offset, 0, '@required '));
+          } else {
+            edits.add(EditDetail(
+                "Mark with '@required'", offset, 0, '@$prefix.required '));
+          }
+        }
         break;
       case NullabilityFixKind.checkExpression:
         // TODO(brianwilkerson) Determine whether we can know that the fix is
@@ -156,7 +181,7 @@
         edits.add(EditDetail('Add /*!*/ hint', offset, 0, '/*!*/'));
         break;
       case NullabilityFixKind.checkExpressionDueToHint:
-        edits.add(_removeHint('Remove /*!*/ hint'));
+        edits.add(removeHint('Remove /*!*/ hint'));
         break;
       case NullabilityFixKind.downcastExpression:
       case NullabilityFixKind.otherCastExpression:
@@ -177,12 +202,12 @@
         edits.add(EditDetail('Add /*?*/ hint', offset, 0, '/*?*/'));
         break;
       case NullabilityFixKind.makeTypeNullableDueToHint:
-        edits.add(_changeHint('Change to /*!*/ hint', '/*!*/'));
-        edits.add(_removeHint('Remove /*?*/ hint'));
+        edits.add(changeHint('Change to /*!*/ hint', '/*!*/'));
+        edits.add(removeHint('Remove /*?*/ hint'));
         break;
       case NullabilityFixKind.typeNotMadeNullableDueToHint:
-        edits.add(_removeHint('Remove /*!*/ hint'));
-        edits.add(_changeHint('Change to /*?*/ hint', '/*?*/'));
+        edits.add(removeHint('Remove /*!*/ hint'));
+        edits.add(changeHint('Change to /*?*/ hint', '/*?*/'));
         break;
       case NullabilityFixKind.addLate:
       case NullabilityFixKind.addLateDueToTestSetup:
@@ -202,6 +227,16 @@
         // We don't offer any edits around bad compound assignments or bad
         // increment/decrement operations.
         break;
+      case NullabilityFixKind.addImport:
+      case NullabilityFixKind.changeMethodName:
+        // These fix kinds have to do with changing iterable method calls to
+        // their "OrNull" equivalents.  We don't offer any hints around
+        // this transformation.
+        break;
+      case NullabilityFixKind.noValidMigrationForNull:
+        // We don't offer any edits around unmigratable `null`s.  The user has
+        // to fix manually.
+        break;
     }
     return edits;
   }
@@ -333,11 +368,12 @@
     var sourceOffsets = changes.keys.toList();
     sourceOffsets.sort();
     var offset = 0;
-    var lastSourceOffset = 0;
-    for (var sourceOffset in sourceOffsets) {
-      offset += sourceOffset - lastSourceOffset;
-      lastSourceOffset = sourceOffset;
-      var changesForSourceOffset = changes[sourceOffset];
+    var sourceOffset = 0;
+    for (var nextSourceOffset in sourceOffsets) {
+      var changesForSourceOffset = changes[nextSourceOffset];
+      var unchangedTextLength = nextSourceOffset - sourceOffset;
+      offset += unchangedTextLength;
+      sourceOffset += unchangedTextLength;
       for (var edit in changesForSourceOffset) {
         var length = edit.length;
         var replacement = edit.replacement;
@@ -349,7 +385,7 @@
         }
         var info = edit.info;
         var edits = info != null
-            ? _computeEdits(info, sourceOffset, result.content)
+            ? _computeEdits(info, sourceOffset, result)
             : <EditDetail>[];
         var lineNumber = lineInfo.getLocation(sourceOffset).lineNumber;
         var traces = info == null
@@ -358,46 +394,45 @@
         var description = info?.description;
         var hint = info?.hintComment;
         var isCounted = hint == null || hintsSeen.add(hint);
-        if (description != null) {
-          var explanation = description.appliedMessage;
-          var kind = description.kind;
-          if (edit.isInsertion) {
-            regions.add(RegionInfo(
-                edit.isInformative ? RegionType.informative : RegionType.add,
-                offset,
-                replacement.length,
-                lineNumber,
-                explanation,
-                kind,
-                isCounted,
-                edits: edits,
-                traces: traces));
-          } else if (edit.isDeletion) {
-            regions.add(RegionInfo(
-                edit.isInformative ? RegionType.informative : RegionType.remove,
-                offset,
-                length,
-                lineNumber,
-                explanation,
-                kind,
-                isCounted,
-                edits: edits,
-                traces: traces));
-          } else if (edit.isReplacement) {
-            assert(!edit.isInformative);
-            regions.add(RegionInfo(RegionType.remove, offset, length,
-                lineNumber, explanation, kind, isCounted,
-                edits: edits, traces: traces));
-            regions.add(RegionInfo(RegionType.add, end, replacement.length,
-                lineNumber, explanation, kind, isCounted,
-                edits: edits, traces: traces));
-          } else {
-            throw StateError(
-                'Edit is not an insertion, deletion, replacement, nor '
-                'informative: $edit');
-          }
+        var explanation = description?.appliedMessage;
+        var kind = description?.kind;
+        if (edit.isInsertion) {
+          regions.add(RegionInfo(
+              edit.isInformative ? RegionType.informative : RegionType.add,
+              offset,
+              replacement.length,
+              lineNumber,
+              explanation,
+              kind,
+              isCounted,
+              edits: edits,
+              traces: traces));
+        } else if (edit.isDeletion) {
+          regions.add(RegionInfo(
+              edit.isInformative ? RegionType.informative : RegionType.remove,
+              offset,
+              length,
+              lineNumber,
+              explanation,
+              kind,
+              isCounted,
+              edits: edits,
+              traces: traces));
+        } else if (edit.isReplacement) {
+          assert(!edit.isInformative);
+          regions.add(RegionInfo(RegionType.remove, offset, length, lineNumber,
+              explanation, kind, isCounted,
+              edits: edits, traces: traces));
+          regions.add(RegionInfo(RegionType.add, end, replacement.length,
+              lineNumber, explanation, kind, isCounted,
+              edits: edits, traces: traces));
+        } else {
+          throw StateError(
+              'Edit is not an insertion, deletion, replacement, nor '
+              'informative: $edit');
         }
-        offset += replacement.length;
+        sourceOffset += length;
+        offset += length + replacement.length;
       }
     }
 
@@ -413,6 +448,17 @@
     return unitInfo;
   }
 
+  /// Searches [unit] for an import directive whose URI matches [uri], returning
+  /// it if found, or `null` if not found.
+  ImportDirective _findImportDirective(CompilationUnit unit, String uri) {
+    for (var directive in unit.directives) {
+      if (directive is ImportDirective && directive.uriContent == uri) {
+        return directive;
+      }
+    }
+    return null;
+  }
+
   TraceEntryInfo _makeTraceEntry(
       String description, CodeReference codeReference,
       {List<HintAction> hintActions = const []}) {
diff --git a/pkg/nnbd_migration/lib/src/front_end/migration_info.dart b/pkg/nnbd_migration/lib/src/front_end/migration_info.dart
index 52e5a2f..c9d6099 100644
--- a/pkg/nnbd_migration/lib/src/front_end/migration_info.dart
+++ b/pkg/nnbd_migration/lib/src/front_end/migration_info.dart
@@ -77,15 +77,15 @@
 
   MigrationInfo(this.units, this.unitMap, this.pathContext, this.includedRoot);
 
+  /// The path of the Dart logo displayed in the toolbar.
+  String get dartLogoPath => PreviewSite.dartLogoPath;
+
   /// The path to the highlight.pack.js script, relative to [unitInfo].
   String get highlightJsPath => PreviewSite.highlightJsPath;
 
   /// The path to the highlight.pack.js stylesheet, relative to [unitInfo].
   String get highlightStylePath => PreviewSite.highlightCssPath;
 
-  /// The path of the Dart logo displayed in the toolbar.
-  String get dartLogoPath => PreviewSite.dartLogoPath;
-
   /// The path of the Material icons font.
   String get materialIconsPath => PreviewSite.materialIconsPath;
 
@@ -178,9 +178,15 @@
   final int lineNumber;
 
   /// The explanation to be displayed for the region.
+  ///
+  /// `null` if this region doesn't represent a fix (e.g. it's just whitespace
+  /// change to preserve formatting).
   final String explanation;
 
   /// The kind of fix that was applied.
+  ///
+  /// `null` if this region doesn't represent a fix (e.g. it's just whitespace
+  /// change to preserve formatting).
   final NullabilityFixKind kind;
 
   /// Indicates whether this region should be counted in the edit summary.
@@ -285,12 +291,14 @@
 
   /// Returns the [regions] that represent a fixed (changed) region of code.
   List<RegionInfo> get fixRegions => regions
-      .where((region) => region.regionType != RegionType.informative)
+      .where((region) =>
+          region.regionType != RegionType.informative && region.kind != null)
       .toList();
 
   /// Returns the [regions] that are informative.
   List<RegionInfo> get informativeRegions => regions
-      .where((region) => region.regionType == RegionType.informative)
+      .where((region) =>
+          region.regionType == RegionType.informative && region.kind != null)
       .toList();
 
   /// The object used to map the pre-edit offsets in the navigation targets to
@@ -352,6 +360,6 @@
   /// Returns the [RegionInfo] at offset [offset].
   // TODO(srawlins): This is O(n), used each time the user clicks on a region.
   //  Consider changing the type of [regions] to facilitate O(1) searching.
-  RegionInfo regionAt(int offset) =>
-      regions.firstWhere((region) => region.offset == offset);
+  RegionInfo regionAt(int offset) => regions
+      .firstWhere((region) => region.kind != null && region.offset == offset);
 }
diff --git a/pkg/nnbd_migration/lib/src/front_end/migration_state.dart b/pkg/nnbd_migration/lib/src/front_end/migration_state.dart
index 8593172..bfbf7cd 100644
--- a/pkg/nnbd_migration/lib/src/front_end/migration_state.dart
+++ b/pkg/nnbd_migration/lib/src/front_end/migration_state.dart
@@ -2,6 +2,7 @@
 // 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:cli_util/cli_logging.dart';
 import 'package:nnbd_migration/instrumentation.dart';
 import 'package:nnbd_migration/migration_cli.dart';
 import 'package:nnbd_migration/nnbd_migration.dart';
@@ -41,16 +42,18 @@
 
   final AnalysisResult analysisResult;
 
+  /*late*/ List<String> previewUrls;
+
   /// Initialize a newly created migration state with the given values.
   MigrationState(this.migration, this.includedRoot, this.listener,
       this.instrumentationListener,
       [this.analysisResult]);
 
-  bool get hasErrors => analysisResult?.hasErrors ?? false;
-
   /// If the migration has been applied to disk.
   bool get hasBeenApplied => _hasBeenApplied;
 
+  bool get hasErrors => analysisResult?.hasErrors ?? false;
+
   /// Mark that the migration has been applied to disk.
   void markApplied() {
     assert(!hasBeenApplied);
@@ -58,17 +61,15 @@
   }
 
   /// Refresh the state of the migration after the migration has been updated.
-  Future<void> refresh() async {
+  Future<void> refresh(Logger logger) async {
     assert(!hasBeenApplied);
     var provider = listener.server.resourceProvider;
     var infoBuilder = InfoBuilder(provider, includedRoot,
-        instrumentationListener.data, listener, migration, nodeMapper);
+        instrumentationListener.data, listener, migration, nodeMapper, logger);
     var unitInfos = await infoBuilder.explainMigration();
     var pathContext = provider.pathContext;
     migrationInfo = MigrationInfo(
         unitInfos, infoBuilder.unitMap, pathContext, includedRoot);
     pathMapper = PathMapper(provider);
   }
-
-  /*late*/ List<String> previewUrls;
 }
diff --git a/pkg/nnbd_migration/lib/src/front_end/migration_summary.dart b/pkg/nnbd_migration/lib/src/front_end/migration_summary.dart
index 1a90c12..a551df2 100644
--- a/pkg/nnbd_migration/lib/src/front_end/migration_summary.dart
+++ b/pkg/nnbd_migration/lib/src/front_end/migration_summary.dart
@@ -60,75 +60,60 @@
 
   String _keyForKind(NullabilityFixKind kind) {
     switch (kind) {
+      case NullabilityFixKind.addImport:
+        return 'addImport';
       case NullabilityFixKind.addLate:
         return 'addLate';
-        break;
       case NullabilityFixKind.addLateDueToHint:
         return 'addLateDueToHint';
-        break;
       case NullabilityFixKind.addLateDueToTestSetup:
         return 'addLateDueToTestSetup';
-        break;
+      case NullabilityFixKind.addLateFinalDueToHint:
+        return 'addLateFinalDueToHint';
       case NullabilityFixKind.addRequired:
         return 'addRequired';
-        break;
       case NullabilityFixKind.addType:
         return 'addType';
-        break;
+      case NullabilityFixKind.changeMethodName:
+        return 'changeMethodName';
       case NullabilityFixKind.checkExpression:
         return 'checkExpression';
-        break;
       case NullabilityFixKind.checkExpressionDueToHint:
         return 'checkExpressionDueToHint';
-        break;
       case NullabilityFixKind.compoundAssignmentHasNullableSource:
         return 'compoundAssignmentHasNullableSource';
-        break;
       case NullabilityFixKind.compoundAssignmentHasBadCombinedType:
         return 'compoundAssignmentHasBadCombinedType';
-        break;
       case NullabilityFixKind.conditionFalseInStrongMode:
         return 'conditionFalseInStrongMode';
-        break;
       case NullabilityFixKind.conditionTrueInStrongMode:
         return 'conditionTrueInStrongMode';
-        break;
       case NullabilityFixKind.downcastExpression:
         return 'downcastExpression';
-        break;
       case NullabilityFixKind.makeTypeNullable:
         return 'makeTypeNullable';
-        break;
       case NullabilityFixKind.makeTypeNullableDueToHint:
         return 'makeTypeNullableDueToHint';
-        break;
+      case NullabilityFixKind.noValidMigrationForNull:
+        return 'noValidMigrationForNull';
       case NullabilityFixKind.nullAwarenessUnnecessaryInStrongMode:
         return 'nullAwarenessUnnecessaryInStrongMode';
-        break;
       case NullabilityFixKind.nullAwareAssignmentUnnecessaryInStrongMode:
         return 'nullAwareAssignmentUnnecessaryInStrongMode';
-        break;
       case NullabilityFixKind.otherCastExpression:
         return 'otherCastExpression';
-        break;
       case NullabilityFixKind.removeAs:
         return 'removeAs';
-        break;
       case NullabilityFixKind.removeDeadCode:
         return 'removeDeadCode';
-        break;
       case NullabilityFixKind.removeLanguageVersionComment:
         return 'removeLanguageVersionComment';
-        break;
       case NullabilityFixKind.replaceVar:
         return 'replaceVar';
-        break;
       case NullabilityFixKind.typeNotMadeNullable:
         return 'typeNotMadeNullable';
-        break;
       case NullabilityFixKind.typeNotMadeNullableDueToHint:
         return 'typeNotMadeNullableDueToHint';
-        break;
     }
     return '???';
   }
diff --git a/pkg/nnbd_migration/lib/src/front_end/non_nullable_fix.dart b/pkg/nnbd_migration/lib/src/front_end/non_nullable_fix.dart
index 9b9d955..8a5d668 100644
--- a/pkg/nnbd_migration/lib/src/front_end/non_nullable_fix.dart
+++ b/pkg/nnbd_migration/lib/src/front_end/non_nullable_fix.dart
@@ -4,14 +4,16 @@
 
 import 'dart:convert' show jsonDecode, JsonEncoder;
 
+import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
-import 'package:charcode/charcode.dart';
+import 'package:cli_util/cli_logging.dart';
 import 'package:meta/meta.dart';
 import 'package:nnbd_migration/nnbd_migration.dart';
+import 'package:nnbd_migration/src/front_end/charcodes.dart';
 import 'package:nnbd_migration/src/front_end/dartfix_listener.dart';
 import 'package:nnbd_migration/src/front_end/instrumentation_listener.dart';
 import 'package:nnbd_migration/src/front_end/migration_state.dart';
@@ -26,23 +28,17 @@
 /// and determines whether the associated variable or parameter can be null
 /// then adds or removes a '?' trailing the named type as appropriate.
 class NonNullableFix {
-  // TODO(srawlins): Refactor to use
-  //  `Feature.non_nullable.releaseVersion` when this becomes non-null.
-  static const String _intendedMinimumSdkVersion = '2.9.0';
-
-  // In the package_config.json file, the patch number is omitted.
-  static const String _intendedLanguageVersion = '2.9';
-
-  static const String _intendedSdkVersionConstraint =
-      '>=$_intendedMinimumSdkVersion <2.10.0';
-
   static final List<HttpPreviewServer> _allServers = [];
 
+  final Version _intendedMinimumSdkVersion;
+
   /// The internet address the server should bind to.  Should be suitable for
   /// passing to HttpServer.bind, i.e. either a [String] or an
   /// [InternetAddress].
   final Object bindAddress;
 
+  final Logger _logger;
+
   final int preferredPort;
 
   final DartFixListener listener;
@@ -83,16 +79,28 @@
   /// A list of the URLs corresponding to the included roots.
   List<String> previewUrls;
 
-  NonNullableFix(
-      this.listener, this.resourceProvider, this._getLineInfo, this.bindAddress,
-      {List<String> included = const [], this.preferredPort, this.summaryPath})
+  NonNullableFix(this.listener, this.resourceProvider, this._getLineInfo,
+      this.bindAddress, this._logger,
+      {List<String> included = const [],
+      this.preferredPort,
+      this.summaryPath,
+      @required String sdkPath})
       : includedRoot =
-            _getIncludedRoot(included, listener.server.resourceProvider) {
+            _getIncludedRoot(included, listener.server.resourceProvider),
+        _intendedMinimumSdkVersion =
+            _computeIntendedMinimumSdkVersion(resourceProvider, sdkPath) {
     reset();
   }
 
   bool get isPreviewServerRunning => _server != null;
 
+  /// In the package_config.json file, the patch number is omitted.
+  String get _intendedLanguageVersion =>
+      '${_intendedMinimumSdkVersion.major}.${_intendedMinimumSdkVersion.minor}';
+
+  String get _intendedSdkVersionConstraint =>
+      '>=$_intendedMinimumSdkVersion <3.0.0';
+
   InstrumentationListener createInstrumentationListener(
           {MigrationSummary migrationSummary}) =>
       InstrumentationListener(migrationSummary: migrationSummary);
@@ -108,7 +116,7 @@
     migration.finish();
     final state = MigrationState(
         migration, includedRoot, listener, instrumentationListener);
-    await state.refresh();
+    await state.refresh(_logger);
     return state;
   }
 
@@ -121,8 +129,8 @@
 
   /// Processes the non-source files of the package rooted at [pkgFolder].
   ///
-  /// This means updating the pubspec.yaml file and the package_config.json
-  /// file, if necessary.
+  /// This means updating the pubspec.yaml file, the package_config.json
+  /// file, and the analysis_options.yaml file, each only if necessary.
   void processPackage(Folder pkgFolder) {
     if (!_packageIsNNBD) {
       return;
@@ -130,13 +138,14 @@
 
     var pubspecFile = pkgFolder.getChildAssumingFile('pubspec.yaml');
     if (!pubspecFile.exists) {
-      // TODO(srawlins): Handle other package types, such as Bazel.
+      // If the pubspec file cannot be found, we do not attempt to change the
+      // Package Config file, nor the analysis options file.
       return;
     }
 
-    _Pubspec pubspec;
+    _YamlFile pubspec;
     try {
-      pubspec = _Pubspec.parseFrom(pubspecFile);
+      pubspec = _YamlFile._parseFrom(pubspecFile);
     } on FileSystemException catch (e) {
       _processPubspecException('read', pubspecFile.path, e);
       return;
@@ -146,7 +155,6 @@
     }
 
     var updated = _processPubspec(pubspec);
-
     if (updated) {
       _processConfigFile(pkgFolder, pubspec);
     }
@@ -162,7 +170,7 @@
   Future<MigrationState> rerun() async {
     reset();
     var state = await rerunFunction();
-    await state.refresh();
+    await state.refresh(_logger);
     return state;
   }
 
@@ -207,14 +215,16 @@
   }
 
   /// Updates the Package Config file to specify a minimum Dart SDK version
-  /// which enables the Null Safety feature.
-  void _processConfigFile(Folder pkgFolder, _Pubspec pubspec) {
+  /// which supports null safety.
+  void _processConfigFile(Folder pkgFolder, _YamlFile pubspec) {
     if (!_packageIsNNBD) {
       return;
     }
 
     var packageName = pubspec._getName();
-    if (packageName == null) {}
+    if (packageName == null) {
+      return;
+    }
 
     var packageConfigFile = pkgFolder
         .getChildAssumingFolder('.dart_tool')
@@ -291,42 +301,8 @@
   }
 
   /// Updates the pubspec.yaml file to specify a minimum Dart SDK version which
-  /// enables the Null Safety feature.
-  bool _processPubspec(_Pubspec pubspec) {
-    /// Inserts [content] into [pubspecFile], immediately after [parentSpan].
-    void insertAfterParent(SourceSpan parentSpan, String content) {
-      var line = parentSpan.end.line;
-      var offset = parentSpan.end.offset;
-      // Walk [offset] and [line] back to the first non-whitespace character
-      // before [offset].
-      while (offset > 0) {
-        var ch = pubspec.textContent.codeUnitAt(offset - 1);
-        if (ch == $space || ch == $cr) {
-          --offset;
-        } else if (ch == $lf) {
-          --offset;
-          --line;
-        } else {
-          break;
-        }
-      }
-      var edit = SourceEdit(offset, 0, content);
-      listener.addSourceFileEdit(
-          'enable Null Safety language feature',
-          Location(pubspec.path, offset, content.length, line, 0),
-          SourceFileEdit(pubspec.path, 0, edits: [edit]));
-    }
-
-    void replaceSpan(SourceSpan span, String content) {
-      var line = span.start.line;
-      var offset = span.start.offset;
-      var edit = SourceEdit(offset, span.length, content);
-      listener.addSourceFileEdit(
-          'enable Null Safety language feature',
-          Location(pubspec.path, offset, content.length, line, 0),
-          SourceFileEdit(pubspec.path, 0, edits: [edit]));
-    }
-
+  /// supports null safety.
+  bool _processPubspec(_YamlFile pubspec) {
     var pubspecMap = pubspec.content;
     YamlNode environmentOptions;
     if (pubspecMap is YamlMap) {
@@ -339,21 +315,21 @@
   sdk: '$_intendedSdkVersionConstraint'
 
 ''';
-      insertAfterParent(SourceSpan(start, start, ''), content);
+      pubspec._insertAfterParent(
+          SourceSpan(start, start, ''), content, listener);
     } else if (environmentOptions is YamlMap) {
       var sdk = environmentOptions.nodes['sdk'];
       if (sdk == null) {
         var content = """
 
   sdk: '$_intendedSdkVersionConstraint'""";
-        insertAfterParent(environmentOptions.span, content);
+        pubspec._insertAfterParent(environmentOptions.span, content, listener);
       } else if (sdk is YamlScalar) {
         VersionConstraint currentConstraint;
         if (sdk.value is String) {
           currentConstraint = VersionConstraint.parse(sdk.value as String);
-          var minimumVersion = Version.parse(_intendedMinimumSdkVersion);
           if (currentConstraint is VersionRange &&
-              currentConstraint.min >= minimumVersion) {
+              currentConstraint.min >= _intendedMinimumSdkVersion) {
             // The current SDK version constraint already enables Null Safety.
             // Do not edit pubspec.yaml, nor package_config.json.
             return false;
@@ -361,7 +337,8 @@
             // TODO(srawlins): This overwrites the current maximum version. In
             // the uncommon situation that the maximum is not '<3.0.0', it
             // should not.
-            replaceSpan(sdk.span, "'$_intendedSdkVersionConstraint'");
+            pubspec._replaceSpan(
+                sdk.span, "'$_intendedSdkVersionConstraint'", listener);
           }
         } else {
           // Something is odd with the SDK constraint we've found in
@@ -400,6 +377,52 @@
     _allServers.clear();
   }
 
+  static Version _computeIntendedMinimumSdkVersion(
+      ResourceProvider resourceProvider, String sdkPath) {
+    var versionFile = resourceProvider
+        .getFile(resourceProvider.pathContext.join(sdkPath, 'version'));
+    if (!versionFile.exists) {
+      throw StateError(
+          'Could not find SDK version file at ${versionFile.path}');
+    }
+    var sdkVersionString = versionFile.readAsStringSync().trim();
+    var sdkVersion = Version.parse(sdkVersionString);
+    // Ideally, we would like to set the user's minimum SDK constraint to the
+    // version in which null safety was released to stable.  But we only want to
+    // do so if we are sure that stable release exists.  An easy way to check
+    // that is to see if the current SDK version is greater than or equal to the
+    // stable release of null safety.
+    var nullSafetyStableReleaseVersion = Feature.non_nullable.releaseVersion;
+    if (sdkVersion >= nullSafetyStableReleaseVersion) {
+      // It is, so we can use it as the minimum SDK constraint.
+      return nullSafetyStableReleaseVersion;
+    } else {
+      // It isn't.  This either means that null safety hasn't been released to
+      // stable yet (in which case it's definitely not safe to use
+      // `nullSafetyStableReleaseVersion` as a minimum SDK constraint), or it
+      // has been released but the user hasn't upgraded to it (in which case we
+      // don't want to use it as a minimum SDK constraint anyway, because we
+      // don't want to force the user to upgrade their SDK in order to be able
+      // to use their own package).  Our next best option is to use the user's
+      // current SDK version as a minimum SDK constraint, assuming it's a proper
+      // beta release version.
+      if (sdkVersionString.contains('beta')) {
+        // It is, so we can use it.
+        return sdkVersion;
+      } else {
+        // It isn't.  The user is probably either on a bleeding edge version of
+        // the SDK (e.g. `2.12.0-edge.<SHA>`), a dev version
+        // (e.g. `2.12.0-X.Y.dev`), or an internally built version
+        // (e.g. `2.12.0-<large number>`).  All of these version numbers are
+        // unsafe for the user to use as their minimum SDK constraint, because
+        // if they published their package, it wouldn't be usable with the
+        // latest beta release.  So just fall back on using a version of
+        // `<stable release>-0`.
+        return Version.parse('$nullSafetyStableReleaseVersion-0');
+      }
+    }
+  }
+
   /// Get the "root" of all [included] paths. See [includedRoot] for its
   /// definition.
   static String _getIncludedRoot(
@@ -455,22 +478,13 @@
   }
 }
 
-class _Pubspec {
+class _YamlFile {
   final String path;
   final String textContent;
+
   final YamlNode content;
 
-  factory _Pubspec.parseFrom(File file) {
-    var textContent = file.readAsStringSync();
-    var content = loadYaml(textContent);
-    if (content is YamlNode) {
-      return _Pubspec._(file.path, textContent, content);
-    } else {
-      throw FormatException('pubspec.yaml is not a YAML map.');
-    }
-  }
-
-  _Pubspec._(this.path, this.textContent, this.content);
+  _YamlFile._(this.path, this.textContent, this.content);
 
   String _getName() {
     YamlNode packageNameNode;
@@ -487,4 +501,49 @@
       return null;
     }
   }
+
+  /// Inserts [content] into this file, immediately after [parentSpan].
+  void _insertAfterParent(
+      SourceSpan parentSpan, String content, DartFixListener listener) {
+    var line = parentSpan.end.line;
+    var offset = parentSpan.end.offset;
+    // Walk [offset] and [line] back to the first non-whitespace character
+    // before [offset].
+    while (offset > 0) {
+      var ch = textContent.codeUnitAt(offset - 1);
+      if (ch == $space || ch == $cr) {
+        --offset;
+      } else if (ch == $lf) {
+        --offset;
+        --line;
+      } else {
+        break;
+      }
+    }
+    var edit = SourceEdit(offset, 0, content);
+    listener.addSourceFileEdit(
+        'enable Null Safety language feature',
+        Location(path, offset, content.length, line, 0),
+        SourceFileEdit(path, 0, edits: [edit]));
+  }
+
+  void _replaceSpan(SourceSpan span, String content, DartFixListener listener) {
+    var line = span.start.line;
+    var offset = span.start.offset;
+    var edit = SourceEdit(offset, span.length, content);
+    listener.addSourceFileEdit(
+        'enable Null Safety language feature',
+        Location(path, offset, content.length, line, 0),
+        SourceFileEdit(path, 0, edits: [edit]));
+  }
+
+  static _YamlFile _parseFrom(File file) {
+    var textContent = file.readAsStringSync();
+    var content = loadYaml(textContent);
+    if (content is YamlNode) {
+      return _YamlFile._(file.path, textContent, content);
+    } else {
+      throw FormatException('pubspec.yaml is not a YAML map.');
+    }
+  }
 }
diff --git a/pkg/nnbd_migration/lib/src/front_end/region_renderer.dart b/pkg/nnbd_migration/lib/src/front_end/region_renderer.dart
index e6be786..33f4b6c 100644
--- a/pkg/nnbd_migration/lib/src/front_end/region_renderer.dart
+++ b/pkg/nnbd_migration/lib/src/front_end/region_renderer.dart
@@ -49,14 +49,11 @@
 
     EditLink linkForEdit(EditDetail edit) => EditLink(
         description: edit.description,
-        href: Uri(
-            scheme: 'http',
-            path: pathContext.basename(unitInfo.path),
-            queryParameters: {
-              'offset': edit.offset.toString(),
-              'end': (edit.offset + edit.length).toString(),
-              'replacement': edit.replacement
-            }).toString());
+        href: Uri(path: pathContext.basename(unitInfo.path), queryParameters: {
+          'offset': edit.offset.toString(),
+          'end': (edit.offset + edit.length).toString(),
+          'replacement': edit.replacement
+        }).toString());
 
     var response = EditDetails(
       displayPath: unitInfo.path,
diff --git a/pkg/nnbd_migration/lib/src/front_end/resources/migration.css b/pkg/nnbd_migration/lib/src/front_end/resources/migration.css
index 4c121b8..0e752ea 100644
--- a/pkg/nnbd_migration/lib/src/front_end/resources/migration.css
+++ b/pkg/nnbd_migration/lib/src/front_end/resources/migration.css
@@ -229,6 +229,7 @@
 
 .nav-inner li {
   list-style-type: none;
+  white-space: nowrap;
 }
 
 .nav-inner li:not(.dir) {
@@ -249,7 +250,7 @@
 }
 
 .nav-inner ul {
-  max-height: 2000px;
+  /* a max-height is added to each element at runtime. */
   transition: max-height 0.5s ease-out;
 }
 
@@ -386,7 +387,6 @@
   display: inline-block;
   height: 15px;
   position: relative;
-  top: 2px;
 }
 
 .target {
diff --git a/pkg/nnbd_migration/lib/src/front_end/resources/resources.g.dart b/pkg/nnbd_migration/lib/src/front_end/resources/resources.g.dart
index 80f9df3..0ae2d82 100644
--- a/pkg/nnbd_migration/lib/src/front_end/resources/resources.g.dart
+++ b/pkg/nnbd_migration/lib/src/front_end/resources/resources.g.dart
@@ -7487,7 +7487,7 @@
 ''';
 
 String _migration_css;
-// migration_css md5 is 'aa4c1eeef41fd9f06779ba7bac691ac2'
+// migration_css md5 is '091ec5ef4e9fd6f11ad8bda81bdd26e4'
 String _migration_css_base64 = '''
 LyogQ29weXJpZ2h0IChjKSAyMDE5LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuIFBsZWFzZSBzZWUg
 dGhlIEFVVEhPUlMgZmlsZSAgKi8KLyogZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVz
@@ -7551,143 +7551,144 @@
 dDogNnB4Owp9CgoubmF2LXRyZWUgLm1hdGVyaWFsLWljb25zIHsKICBmb250LXNpemU6IDIwcHg7CiAg
 cG9zaXRpb246IHJlbGF0aXZlOwogIHRvcDogNXB4OwogIG1hcmdpbi1yaWdodDogOHB4OwogIGNvbG9y
 OiAjNjc2NzY3Owp9CgoubmF2LWlubmVyIHVsIHsKICBwYWRkaW5nLWxlZnQ6IDEycHg7CiAgbWFyZ2lu
-OiAwOwp9CgoubmF2LWlubmVyIGxpIHsKICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7Cn0KCi5uYXYtaW5u
-ZXIgbGk6bm90KC5kaXIpIHsKICBtYXJnaW4tbGVmdDogMjBweDsKICBtYXJnaW4tYm90dG9tOiAzcHg7
-Cn0KCi5uYXYtaW5uZXIgbGkuZGlyIC5hcnJvdyB7CiAgY3Vyc29yOiBwb2ludGVyOwogIGRpc3BsYXk6
-IGlubGluZS1ibG9jazsKICBmb250LXNpemU6IDEwcHg7CiAgbWFyZ2luLXJpZ2h0OiA0cHg7CiAgdHJh
-bnNpdGlvbjogdHJhbnNmb3JtIDAuNXMgZWFzZS1vdXQ7Cn0KCi5uYXYtaW5uZXIgbGkuZGlyIC5hcnJv
-dy5jb2xsYXBzZWQgewogIHRyYW5zZm9ybTogcm90YXRlKC05MGRlZyk7Cn0KCi5uYXYtaW5uZXIgdWwg
-ewogIG1heC1oZWlnaHQ6IDIwMDBweDsKICB0cmFuc2l0aW9uOiBtYXgtaGVpZ2h0IDAuNXMgZWFzZS1v
-dXQ7Cn0KCi5uYXYtaW5uZXIgdWwuY29sbGFwc2VkIHsKICBtYXgtaGVpZ2h0OiAwICFpbXBvcnRhbnQ7
-CiAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLm5hdi1pbm5lciAuc2VsZWN0ZWQtZmlsZSB7CiAgY29sb3I6
-IHdoaXRlOwogIGN1cnNvcjogaW5oZXJpdDsKICBmb250LXdlaWdodDogNjAwOwogIHRleHQtZGVjb3Jh
-dGlvbjogbm9uZTsKfQoKLmVkaXQtY291bnQgewogIGJhY2tncm91bmQtY29sb3I6ICM2NzY3Njc7CiAg
-Ym9yZGVyLXJhZGl1czogMTBweDsKICBjb2xvcjogI2ZmZjsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7
-CiAgZm9udC1zaXplOiAxMXB4OwogIGZvbnQtd2VpZ2h0OiA2MDA7CiAgbWFyZ2luLWxlZnQ6IDVweDsK
-ICBtaW4td2lkdGg6IDI1cHg7CiAgcGFkZGluZzogNHB4IDAgMnB4IDA7CiAgdGV4dC1hbGlnbjogY2Vu
-dGVyOwogIGxpbmUtaGVpZ2h0OiAxZW07Cn0KCi5jb250ZW50IHsKICBmbGV4OiA0IDMwMHB4OwogIGJh
-Y2tncm91bmQ6ICMxMjIwMmY7CiAgZm9udC1mYW1pbHk6ICJSb2JvdG8gTW9ubyIsIG1vbm9zcGFjZTsK
-ICBtYXJnaW46IDAgNnB4OwogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICB3aGl0ZS1zcGFjZTogcHJlOwog
-IG92ZXJmbG93OiBzY3JvbGw7Cn0KCi5jb2RlIHsKICBwYWRkaW5nOiAwLjVlbTsKICBwb3NpdGlvbjog
-YWJzb2x1dGU7CiAgbGVmdDogMDsKICB0b3A6IDA7CiAgbWFyZ2luLWxlZnQ6IDU2cHg7Cn0KCi5jb2Rl
-IC53ZWxjb21lIHsKICBmb250LWZhbWlseTogIkdvb2dsZSBTYW5zIiwiUm9ib3RvIixzYW5zLXNlcmlm
-OwogIGZvbnQtc2l6ZTogMThweDsKICBtYXJnaW4tcmlnaHQ6IDYycHg7CiAgY29sb3I6ICM3Nzc7Cn0K
-Ci5jb2RlIC5uYXYtbGluayB7CiAgY29sb3I6ICMxNmFkY2E7CiAgdGV4dC1kZWNvcmF0aW9uLWxpbmU6
-IG5vbmU7Cn0KCi5jb2RlIC5uYXYtbGluazp2aXNpdGVkIHsKICBjb2xvcjogIzEzOWJiNTsgLyogIzE2
-YWRjYSBkYXJrZW5lZCAxMCUgKi8KICB0ZXh0LWRlY29yYXRpb24tbGluZTogbm9uZTsKfQoKLmNvZGUg
-Lm5hdi1saW5rOmhvdmVyIHsKICB0ZXh0LWRlY29yYXRpb24tbGluZTogdW5kZXJsaW5lOwogIGZvbnQt
-d2VpZ2h0OiA2MDA7Cn0KCi5yZWdpb25zIHsKICBwYWRkaW5nOiAwLjVlbTsKICBwb3NpdGlvbjogYWJz
-b2x1dGU7CiAgbGVmdDogMDsKICB0b3A6IDA7Cn0KCi5yZWdpb25zIHRhYmxlIHsKICBib3JkZXItc3Bh
-Y2luZzogMDsKICBmb250LXNpemU6IGluaGVyaXQ7Cn0KCi5yZWdpb25zIHRkIHsKICBib3JkZXI6IG5v
-bmU7CiAgLyogVGhlIGNvbnRlbnQgb2YgdGhlIHJlZ2lvbnMgaXMgbm90IHZpc2libGU7IHRoZSB1c2Vy
-IGluc3RlYWQgd2lsbCBzZWUgdGhlCiAgICogaGlnaGxpZ2h0ZWQgY29weSBvZiB0aGUgY29udGVudC4g
-Ki8KICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwKTsKICBwYWRkaW5nOiAwOwogIHdoaXRlLXNw
-YWNlOiBwcmU7Cn0KCi5yZWdpb25zIHRkOmVtcHR5OmFmdGVyIHsKICBjb250ZW50OiAiXDAwYTAiOwp9
-CgoucmVnaW9ucyB0ci5oaWdobGlnaHQgdGQ6bGFzdC1jaGlsZCB7CiAgYmFja2dyb3VuZC1jb2xvcjog
-IzQ0NDQ0NDsKICBjb2xvcjogd2hpdGU7Cn0KCi5yZWdpb25zIHRkLmxpbmUtbm8gewogIGJvcmRlci1y
-aWdodDogc29saWQgIzEyMjAyZiAycHg7CiAgY29sb3I6ICM5OTk5OTk7CiAgcGFkZGluZy1yaWdodDog
-NHB4OwogIHRleHQtYWxpZ246IHJpZ2h0OwogIHZpc2liaWxpdHk6IHZpc2libGU7CiAgd2lkdGg6IDUw
-cHg7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwp9CgoucmVnaW9ucyB0ci5oaWdobGlnaHQgdGQubGlu
-ZS1ubyB7CiAgYm9yZGVyLXJpZ2h0OiBzb2xpZCAjY2NjIDJweDsKfQoKLnJlZ2lvbiB7CiAgZGlzcGxh
-eTogaW5saW5lLWJsb2NrOwogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICB2aXNpYmlsaXR5OiB2aXNpYmxl
-OwogIHotaW5kZXg6IDIwMDsKfQoKLnJlZ2lvbi5hZGRlZC1yZWdpb24gewogIGJhY2tncm91bmQtY29s
-b3I6ICMxNzhhZmQ7CiAgY29sb3I6ICNmZmY7Cn0KCi5yZWdpb24ucmVtb3ZlZC1yZWdpb24gewogIGJh
-Y2tncm91bmQtY29sb3I6ICNGQTU1N2Q7IC8qICRkYXJrLXBpbmsgKi8KICBjb2xvcjogI2ZmZjsKfQoK
-LnJlZ2lvbi5pbmZvcm1hdGl2ZS1yZWdpb24gewogIGJhY2tncm91bmQtY29sb3I6ICMyNjM5NTI7CiAg
-Y29sb3I6ICNmZmY7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGhlaWdodDogMTVweDsKICBwb3Np
-dGlvbjogcmVsYXRpdmU7CiAgdG9wOiAycHg7Cn0KCi50YXJnZXQgewogIGJhY2tncm91bmQtY29sb3I6
-ICM0NDQ7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIHZpc2liaWxpdHk6IHZpc2libGU7CiAgZm9udC13
-ZWlnaHQ6IDYwMDsKfQoKLmluZm8tcGFuZWwgewogIGZsZXg6IDEgMjAwcHg7CiAgbWFyZ2luOiAwOwog
-IGhlaWdodDogMTAwJTsKICBkaXNwbGF5OiBmbGV4OwogIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47Cn0K
-Ci5pbmZvLXBhbmVsIC5lZGl0LXBhbmVsIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjMTIyMDJmOwogIG92
-ZXJmbG93OiBhdXRvOwp9CgouaW5mby1wYW5lbCAucGFuZWwtY29udGVudCB7CiAgcGFkZGluZzogN3B4
-Owp9CgouaW5mby1wYW5lbCAucGFuZWwtY29udGVudD4gOmZpcnN0LWNoaWxkIHsKICBtYXJnaW4tdG9w
-OiAwOwp9CgouaW5mby1wYW5lbCAubm93cmFwIHsKICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9CgouaW5m
-by1wYW5lbCB1bCwKLmluZm8tcGFuZWwgb2wgewogIHBhZGRpbmctbGVmdDogMjBweDsKfQoKLmluZm8t
-cGFuZWwgbGkgewogIG1hcmdpbjogMCAwIDVweCAwOwp9CgouaW5mby1wYW5lbCBhIHsKICBjb2xvcjog
-IzEzOWJiNTsKfQoKLmluZm8tcGFuZWwgYTpob3ZlciB7CiAgY29sb3I6ICMxZWM3ZTc7IC8qICMxMzli
-YjUgbGlnaHRlbmVkIDIwJSAqLwp9CgouaW5mby1wYW5lbCAuZWRpdC1saXN0IHsKICBiYWNrZ3JvdW5k
-LWNvbG9yOiAjMTIyMDJmOwogIG92ZXJmbG93OiBhdXRvOwp9CgouZWRpdC1wYW5lbCB7CiAgbWFyZ2lu
-LXRvcDogNnB4OwogIGZsZXg6IDEgMTAwcHg7Cn0KCi5lZGl0LWxpc3QgewogIGZsZXg6IDIgMTAwcHg7
-Cn0KCi5lZGl0LWxpc3QgLmVkaXQgewogIG1hcmdpbjogM3B4IDA7Cn0KCi5lZGl0LWxpc3QgLmVkaXQt
-bGluayB7CiAgY3Vyc29yOiBwb2ludGVyOwp9CgoucG9wdXAtcGFuZSB7CiAgZGlzcGxheTogbm9uZTsK
-ICBwb3NpdGlvbjogZml4ZWQ7CiAgdG9wOiAxNTBweDsKICBsZWZ0OiAxNTBweDsKICByaWdodDogMTUw
-cHg7CiAgYm90dG9tOiAxNTBweDsKICBib3JkZXI6IDFweCBzb2xpZCBibGFjazsKICBib3JkZXItdG9w
-OiAycHggc29saWQgYmxhY2s7CiAgYm9yZGVyLXJhZGl1czogN3B4OwogIGJveC1zaGFkb3c6IDBweCAw
-cHggMjBweCAycHggI2I0YmZjYjIyOwogIHotaW5kZXg6IDQwMDsKICBiYWNrZ3JvdW5kOiAjMmIzMDM2
-OwogIHBhZGRpbmc6IDIwcHg7Cn0KCi5wb3B1cC1wYW5lIC5jbG9zZSB7CiAgcG9zaXRpb246IGFic29s
-dXRlOwogIHJpZ2h0OiAxMHB4OwogIHRvcDogMTBweDsKICBjdXJzb3I6IHBvaW50ZXI7CiAgdGV4dC1z
-aGFkb3c6IDFweCAxcHggMnB4ICM4ODg7CiAgYm94LXNoYWRvdzogMXB4IDFweCAycHggIzExMTsKfQoK
-LnBvcHVwLXBhbmUgaDIgewogIHBhZGRpbmc6IDIxcHg7CiAgaGVpZ2h0OiAxMCU7CiAgbWFyZ2luOiAw
-cHg7CiAgYm94LXNpemluZzogYm9yZGVyLWJveDsKfQoKLnBvcHVwLXBhbmUgcCB7CiAgaGVpZ2h0OiAx
-MCU7CiAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICBwYWRkaW5nOiAwcHggMjBweDsKfQoKLnBvcHVw
-LXBhbmUgcHJlIHsKICBiYWNrZ3JvdW5kOiAjMTIyMDJmOwogIHBhZGRpbmc6IDIwcHg7CiAgYm90dG9t
-OiAwcHg7CiAgb3ZlcmZsb3c6IGF1dG8gc2Nyb2xsOwogIGhlaWdodDogNjUlOwogIG1hcmdpbjogMHB4
-OwogIGJveC1zaXppbmc6IGJvcmRlci1ib3g7Cn0KCi5wb3B1cC1wYW5lIC5idXR0b24uYm90dG9tIHsK
-ICBtYXJnaW46IDIwcHggMHB4OwogIGRpc3BsYXk6IGJsb2NrOwogIHRleHQtYWxpZ246IGNlbnRlcjsK
-fQoKLnJlcnVubmluZy1wYW5lIHsKICBkaXNwbGF5OiBub25lOwp9Cgpib2R5LnJlcnVubmluZyAucmVy
-dW5uaW5nLXBhbmUgewogIGRpc3BsYXk6IGJsb2NrOwogIHBvc2l0aW9uOiBmaXhlZDsKICB0b3A6IDBw
-eDsKICBib3R0b206IDBweDsKICBsZWZ0OiAwcHg7CiAgcmlnaHQ6IDBweDsKICBiYWNrZ3JvdW5kLWNv
-bG9yOiAjMDAwMDAwQUE7IC8qIHRyYW5zbHVjZW50IGJsYWNrICovCiAgei1pbmRleDogNDAwOwp9Cgou
-cmVydW5uaW5nLXBhbmUgaDEgewogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICB0b3A6IDUwJTsKICBsZWZ0
-OiA1MCU7CiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7Cn0KCi5lZGl0LXBhbmVsIC50
-eXBlLWRlc2NyaXB0aW9uIHsKICAvKiBGcm9tIERhcnRQYWQgJGRhcmstb3JhbmdlICovCiAgY29sb3I6
-ICNmZjkxNmU7CiAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKfQoKdWwudHJhY2UgewogIGZvbnQtc2l6
-ZTogMTNweDsKICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7CiAgcGFkZGluZy1sZWZ0OiAwcHg7Cn0KCnVs
-LnRyYWNlIGxpIHsKICBjb2xvcjogd2hpdGU7Cn0KCnVsLnRyYWNlIGxpIC5mdW5jdGlvbiB7CiAgLyog
-ZnJvbSAuaGxqcy12YXJpYWJsZSAqLwogIGNvbG9yOiAjMTZhZGNhOwogIGZvbnQtZmFtaWx5OiBtb25v
-c3BhY2U7CiAgZm9udC13ZWlnaHQ6IDYwMDsKfQoKdWwudHJhY2UgbGkgcC5kcmF3ZXIgewogIG1hcmdp
-bjogM3B4IDBweDsKICBwYWRkaW5nOiAwcHggMHB4IDBweCAxNHB4Owp9Cgp1bC50cmFjZSBsaSBwLmRy
-YXdlciBidXR0b24gewogIG1hcmdpbi1yaWdodDogM3B4Owp9CgouZWxldmF0aW9uLXo0IHsKICBib3gt
-c2hhZG93OiAwcHggMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwKICAgICAgMHB4IDRweCA1
-cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksCiAgICAgIDBweCAxcHggMTBweCAwcHggcmdiYSgwLCAw
-LCAwLCAuMTIpOwp9CgphIHsKICBjb2xvcjogI2NjYzsKICBmaWxsOiAjY2NjOwogIHRleHQtZGVjb3Jh
-dGlvbjogbm9uZTsKfQoKYTpob3ZlciB7CiAgY29sb3I6ICNkYmRiZGI7IC8qICNjY2MgbGlnaHRlbnRl
-ZCAzMCUqLwogIGZpbGw6ICNmZmY7Cn0KCi5hZGQtaGludC1saW5rIHsKICBkaXNwbGF5OiBpbmxpbmUt
-YmxvY2s7CiAgbWFyZ2luOiAzcHg7Cn0KCi5hZGQtaGludC1saW5rOmhvdmVyIHsKICBjb2xvcjogI2Zm
-ZjsKfQoKaGVhZGVyIGJ1dHRvbiB7CiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKfQoKaGVhZGVy
-IGEgewogIG1hcmdpbjogMDsKfQoKLyogQ2FyZWZ1bCBoZXJlLiBgYS5idXR0b25gIGlzIHJlcGV0aXRp
-dmUgYnV0IHJlcXVpcmVkIHRvIGdldCBjb3JyZWN0CiAqIHNwZWNpZmljaXR5ICovCmJ1dHRvbiwgLmJ1
-dHRvbiwgYS5idXR0b24gewogIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjIsIDEzOCwgMjUzLCAwLjE1
-KTsKICBib3JkZXI6IG5vbmU7CiAgYm9yZGVyLXJhZGl1czogM3B4OwogIHBhZGRpbmc6IDNweCAxMHB4
-OwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgZm9udC1mb250OiBSb2JvdG8sIHNhbnMtc2VyaWY7CiAgY29s
-b3I6ICNmZmY7Cn0KCmJ1dHRvbjpob3ZlciwgLmJ1dHRvbjpob3ZlciB7CiAgYmFja2dyb3VuZC1jb2xv
-cjogcmdiYSgyMiwgMTM4LCAyNTMsIDAuMjkpOwogIGN1cnNvcjogcG9pbnRlcjsKfQoKYnV0dG9uW2Rp
-c2FibGVkXSB7CiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsMjU1LDI1NSwuMTIpOwogIGNvbG9y
-OiByZ2JhKDI1NSwyNTUsMjU1LC4zNyk7CiAgY3Vyc29yOiBub3QtYWxsb3dlZDsKfQoKLyogQ2hhbmdl
-IGVkaXQgcGFuZWwgYnV0dG9uIGNvbG9ycyAqLwouZWRpdC1wYW5lbCAuYnV0dG9uLCAuZWRpdC1wYW5l
-bCBidXR0b24gewogIGJhY2tncm91bmQtY29sb3I6IHJnYmEoNjMsIDEwNCwgMTQ4LCAwLjYpOwogIGNv
-bG9yOiB3aGl0ZTsKfQouZWRpdC1wYW5lbCAuYnV0dG9uOmhvdmVyLCAuZWRpdC1wYW5lbCBidXR0b246
-aG92ZXIgewogIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMTAxLCAxNTMsIDIwOCwgMC42KTsKICBjb2xv
-cjogd2hpdGU7Cn0KCi8qCiAqIEFkanVzdG1lbnRzIHRvIGFsaWduIG1hdGVyaWFsIGljb25zIGluIHRo
-ZSB0b29sYmFyIGJ1dHRvbnMuCiovCi5hY3Rpb24tYnV0dG9uID4gc3BhbiB7CiAgcG9zaXRpb246cmVs
-YXRpdmU7CiAgdG9wOiAtM3B4Owp9CgouYWN0aW9uLWJ1dHRvbiAubWF0ZXJpYWwtaWNvbnMgewogIHRv
-cDogNHB4Owp9CgovKiBEb24ndCBzaGlmdCB0aGUgaWNvbiB3aGVuIGl0J3MgYSBkaXJlY3QgY2hpbGQg
-b2YgdGhlIGJ1dHRvbiAqLwouYWN0aW9uLWJ1dHRvbiA+IC5tYXRlcmlhbC1pY29ucyB7CiAgdG9wOiAx
-cHg7Cn0KCi8qIFNoaWZ0IHRoZSB0ZXh0IHRvIGNlbnRlciB3aXRoIHRoZSBpY29uLiAqLwouYWN0aW9u
-LWJ1dHRvbiA+IHNwYW4ubGFiZWwgewogIHBvc2l0aW9uOnJlbGF0aXZlOwogIHRvcDogLTRweDsKfQoK
-LmFjdGlvbi1idXR0b24gLm1hdGVyaWFsLWljb25zIHsKICBmb250LXNpemU6IDIwcHg7CiAgcG9zaXRp
-b246IHJlbGF0aXZlOwp9CgoucGxhY2Vob2xkZXIgewogIGNvbG9yOiAjNzc3OwogIHRleHQtYWxpZ246
-IGNlbnRlcjsKICBtYXJnaW4tdG9wOiAzZW0gIWltcG9ydGFudDsKfQoKLyoqCiAqIEhMSlMgT3ZlcnJp
-ZGVzCiAqLwouaGxqcyB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzEyMjAyZjsgLyogJGRhcmstY29kZS1i
-YWNrZ3JvdW5kLWNvbG9yICovCiAgY29sb3I6ICNjMGMyYzU7IC8qICRkYXJrLWVkaXRvci10ZXh0ICov
-CiAgZGlzcGxheTogYmxvY2s7CiAgb3ZlcmZsb3cteDogYXV0bzsKICBwYWRkaW5nOiAwLjVlbTsKICAv
-KioKICAgKiBUaGlzIGFsbG93cyB0aGUgcGVyLWxpbmUgaGlnaGxpZ2h0cyB0byBzaG93LgogICAqLwog
-IGJhY2tncm91bmQ6IG5vbmU7Cn0KCi5obGpzLWtleXdvcmQsCi5obGpzLXNlbGVjdG9yLXRhZywKLmhs
-anMtZGVsZXRpb24gewogIGNvbG9yOiAjNTFjNjg2OyAvKiBjbS1rZXl3b3JkICovCn0KCi5obGpzLW51
-bWJlciB7CiAgY29sb3I6ICM2Mjc5Nzg7IC8qIGNtLW51bWJlciAqLwp9CgouaGxqcy1jb21tZW50IHsK
-ICBjb2xvcjogIzkxOThiNDsgLyogY20tY29tbWVudCAqLwp9CgouaGxqcy1saXRlcmFsIHsKICBjb2xv
-cjogI2VlODY2NjsgLyogY20tYXRvbSAqLwp9CgouaGxqcy1zdHJpbmcgewogIGNvbG9yOiAjZTU1MDc0
-OyAvKiBjbS1zdHJpbmcgKi8KfQoKLmhsanMtdmFyaWFibGUgewogIGNvbG9yOiAjMTZhZGNhOyAvKiBj
-bS12YXJpYWJsZSAqLwp9CgouaGxqcy1saW5rIHsKICBjb2xvcjogI2U1NTA3NDsgLyogY20tc3RyaW5n
-ICovCn0KLmhsanMtc2VjdGlvbiwKLmhsanMtdHlwZSwKLmhsanMtYnVpbHRfaW4sCi5obGpzLXRpdGxl
-IHsKICBjb2xvcjogI2VlODY2NjsgLyogY20tdmFyaWFibGUtMiAqLwp9CgouaGxqcy1hZGRpdGlvbiB7
-CiAgY29sb3I6ICMyNjM5NTI7IC8qICRkYXJrLXNlbGVjdGlvbi1jb2xvciAqLwp9CgouaGxqcy1tZXRh
-IHsKICBjb2xvcjogIzYyNzk3ODsKfQo=
+OiAwOwp9CgoubmF2LWlubmVyIGxpIHsKICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7CiAgd2hpdGUtc3Bh
+Y2U6IG5vd3JhcDsKfQoKLm5hdi1pbm5lciBsaTpub3QoLmRpcikgewogIG1hcmdpbi1sZWZ0OiAyMHB4
+OwogIG1hcmdpbi1ib3R0b206IDNweDsKfQoKLm5hdi1pbm5lciBsaS5kaXIgLmFycm93IHsKICBjdXJz
+b3I6IHBvaW50ZXI7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZvbnQtc2l6ZTogMTBweDsKICBt
+YXJnaW4tcmlnaHQ6IDRweDsKICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC41cyBlYXNlLW91dDsKfQoK
+Lm5hdi1pbm5lciBsaS5kaXIgLmFycm93LmNvbGxhcHNlZCB7CiAgdHJhbnNmb3JtOiByb3RhdGUoLTkw
+ZGVnKTsKfQoKLm5hdi1pbm5lciB1bCB7CiAgLyogYSBtYXgtaGVpZ2h0IGlzIGFkZGVkIHRvIGVhY2gg
+ZWxlbWVudCBhdCBydW50aW1lLiAqLwogIHRyYW5zaXRpb246IG1heC1oZWlnaHQgMC41cyBlYXNlLW91
+dDsKfQoKLm5hdi1pbm5lciB1bC5jb2xsYXBzZWQgewogIG1heC1oZWlnaHQ6IDAgIWltcG9ydGFudDsK
+ICBvdmVyZmxvdzogaGlkZGVuOwp9CgoubmF2LWlubmVyIC5zZWxlY3RlZC1maWxlIHsKICBjb2xvcjog
+d2hpdGU7CiAgY3Vyc29yOiBpbmhlcml0OwogIGZvbnQtd2VpZ2h0OiA2MDA7CiAgdGV4dC1kZWNvcmF0
+aW9uOiBub25lOwp9CgouZWRpdC1jb3VudCB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzY3Njc2NzsKICBi
+b3JkZXItcmFkaXVzOiAxMHB4OwogIGNvbG9yOiAjZmZmOwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsK
+ICBmb250LXNpemU6IDExcHg7CiAgZm9udC13ZWlnaHQ6IDYwMDsKICBtYXJnaW4tbGVmdDogNXB4Owog
+IG1pbi13aWR0aDogMjVweDsKICBwYWRkaW5nOiA0cHggMCAycHggMDsKICB0ZXh0LWFsaWduOiBjZW50
+ZXI7CiAgbGluZS1oZWlnaHQ6IDFlbTsKfQoKLmNvbnRlbnQgewogIGZsZXg6IDQgMzAwcHg7CiAgYmFj
+a2dyb3VuZDogIzEyMjAyZjsKICBmb250LWZhbWlseTogIlJvYm90byBNb25vIiwgbW9ub3NwYWNlOwog
+IG1hcmdpbjogMCA2cHg7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIHdoaXRlLXNwYWNlOiBwcmU7CiAg
+b3ZlcmZsb3c6IHNjcm9sbDsKfQoKLmNvZGUgewogIHBhZGRpbmc6IDAuNWVtOwogIHBvc2l0aW9uOiBh
+YnNvbHV0ZTsKICBsZWZ0OiAwOwogIHRvcDogMDsKICBtYXJnaW4tbGVmdDogNTZweDsKfQoKLmNvZGUg
+LndlbGNvbWUgewogIGZvbnQtZmFtaWx5OiAiR29vZ2xlIFNhbnMiLCJSb2JvdG8iLHNhbnMtc2VyaWY7
+CiAgZm9udC1zaXplOiAxOHB4OwogIG1hcmdpbi1yaWdodDogNjJweDsKICBjb2xvcjogIzc3NzsKfQoK
+LmNvZGUgLm5hdi1saW5rIHsKICBjb2xvcjogIzE2YWRjYTsKICB0ZXh0LWRlY29yYXRpb24tbGluZTog
+bm9uZTsKfQoKLmNvZGUgLm5hdi1saW5rOnZpc2l0ZWQgewogIGNvbG9yOiAjMTM5YmI1OyAvKiAjMTZh
+ZGNhIGRhcmtlbmVkIDEwJSAqLwogIHRleHQtZGVjb3JhdGlvbi1saW5lOiBub25lOwp9CgouY29kZSAu
+bmF2LWxpbms6aG92ZXIgewogIHRleHQtZGVjb3JhdGlvbi1saW5lOiB1bmRlcmxpbmU7CiAgZm9udC13
+ZWlnaHQ6IDYwMDsKfQoKLnJlZ2lvbnMgewogIHBhZGRpbmc6IDAuNWVtOwogIHBvc2l0aW9uOiBhYnNv
+bHV0ZTsKICBsZWZ0OiAwOwogIHRvcDogMDsKfQoKLnJlZ2lvbnMgdGFibGUgewogIGJvcmRlci1zcGFj
+aW5nOiAwOwogIGZvbnQtc2l6ZTogaW5oZXJpdDsKfQoKLnJlZ2lvbnMgdGQgewogIGJvcmRlcjogbm9u
+ZTsKICAvKiBUaGUgY29udGVudCBvZiB0aGUgcmVnaW9ucyBpcyBub3QgdmlzaWJsZTsgdGhlIHVzZXIg
+aW5zdGVhZCB3aWxsIHNlZSB0aGUKICAgKiBoaWdobGlnaHRlZCBjb3B5IG9mIHRoZSBjb250ZW50LiAq
+LwogIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDApOwogIHBhZGRpbmc6IDA7CiAgd2hpdGUtc3Bh
+Y2U6IHByZTsKfQoKLnJlZ2lvbnMgdGQ6ZW1wdHk6YWZ0ZXIgewogIGNvbnRlbnQ6ICJcMDBhMCI7Cn0K
+Ci5yZWdpb25zIHRyLmhpZ2hsaWdodCB0ZDpsYXN0LWNoaWxkIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAj
+NDQ0NDQ0OwogIGNvbG9yOiB3aGl0ZTsKfQoKLnJlZ2lvbnMgdGQubGluZS1ubyB7CiAgYm9yZGVyLXJp
+Z2h0OiBzb2xpZCAjMTIyMDJmIDJweDsKICBjb2xvcjogIzk5OTk5OTsKICBwYWRkaW5nLXJpZ2h0OiA0
+cHg7CiAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgdmlzaWJpbGl0eTogdmlzaWJsZTsKICB3aWR0aDogNTBw
+eDsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KCi5yZWdpb25zIHRyLmhpZ2hsaWdodCB0ZC5saW5l
+LW5vIHsKICBib3JkZXItcmlnaHQ6IHNvbGlkICNjY2MgMnB4Owp9CgoucmVnaW9uIHsKICBkaXNwbGF5
+OiBpbmxpbmUtYmxvY2s7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIHZpc2liaWxpdHk6IHZpc2libGU7
+CiAgei1pbmRleDogMjAwOwp9CgoucmVnaW9uLmFkZGVkLXJlZ2lvbiB7CiAgYmFja2dyb3VuZC1jb2xv
+cjogIzE3OGFmZDsKICBjb2xvcjogI2ZmZjsKfQoKLnJlZ2lvbi5yZW1vdmVkLXJlZ2lvbiB7CiAgYmFj
+a2dyb3VuZC1jb2xvcjogI0ZBNTU3ZDsgLyogJGRhcmstcGluayAqLwogIGNvbG9yOiAjZmZmOwp9Cgou
+cmVnaW9uLmluZm9ybWF0aXZlLXJlZ2lvbiB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzI2Mzk1MjsKICBj
+b2xvcjogI2ZmZjsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgaGVpZ2h0OiAxNXB4OwogIHBvc2l0
+aW9uOiByZWxhdGl2ZTsKfQoKLnRhcmdldCB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzQ0NDsKICBwb3Np
+dGlvbjogcmVsYXRpdmU7CiAgdmlzaWJpbGl0eTogdmlzaWJsZTsKICBmb250LXdlaWdodDogNjAwOwp9
+CgouaW5mby1wYW5lbCB7CiAgZmxleDogMSAyMDBweDsKICBtYXJnaW46IDA7CiAgaGVpZ2h0OiAxMDAl
+OwogIGRpc3BsYXk6IGZsZXg7CiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKfQoKLmluZm8tcGFuZWwg
+LmVkaXQtcGFuZWwgewogIGJhY2tncm91bmQtY29sb3I6ICMxMjIwMmY7CiAgb3ZlcmZsb3c6IGF1dG87
+Cn0KCi5pbmZvLXBhbmVsIC5wYW5lbC1jb250ZW50IHsKICBwYWRkaW5nOiA3cHg7Cn0KCi5pbmZvLXBh
+bmVsIC5wYW5lbC1jb250ZW50PiA6Zmlyc3QtY2hpbGQgewogIG1hcmdpbi10b3A6IDA7Cn0KCi5pbmZv
+LXBhbmVsIC5ub3dyYXAgewogIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi5pbmZvLXBhbmVsIHVsLAou
+aW5mby1wYW5lbCBvbCB7CiAgcGFkZGluZy1sZWZ0OiAyMHB4Owp9CgouaW5mby1wYW5lbCBsaSB7CiAg
+bWFyZ2luOiAwIDAgNXB4IDA7Cn0KCi5pbmZvLXBhbmVsIGEgewogIGNvbG9yOiAjMTM5YmI1Owp9Cgou
+aW5mby1wYW5lbCBhOmhvdmVyIHsKICBjb2xvcjogIzFlYzdlNzsgLyogIzEzOWJiNSBsaWdodGVuZWQg
+MjAlICovCn0KCi5pbmZvLXBhbmVsIC5lZGl0LWxpc3QgewogIGJhY2tncm91bmQtY29sb3I6ICMxMjIw
+MmY7CiAgb3ZlcmZsb3c6IGF1dG87Cn0KCi5lZGl0LXBhbmVsIHsKICBtYXJnaW4tdG9wOiA2cHg7CiAg
+ZmxleDogMSAxMDBweDsKfQoKLmVkaXQtbGlzdCB7CiAgZmxleDogMiAxMDBweDsKfQoKLmVkaXQtbGlz
+dCAuZWRpdCB7CiAgbWFyZ2luOiAzcHggMDsKfQoKLmVkaXQtbGlzdCAuZWRpdC1saW5rIHsKICBjdXJz
+b3I6IHBvaW50ZXI7Cn0KCi5wb3B1cC1wYW5lIHsKICBkaXNwbGF5OiBub25lOwogIHBvc2l0aW9uOiBm
+aXhlZDsKICB0b3A6IDE1MHB4OwogIGxlZnQ6IDE1MHB4OwogIHJpZ2h0OiAxNTBweDsKICBib3R0b206
+IDE1MHB4OwogIGJvcmRlcjogMXB4IHNvbGlkIGJsYWNrOwogIGJvcmRlci10b3A6IDJweCBzb2xpZCBi
+bGFjazsKICBib3JkZXItcmFkaXVzOiA3cHg7CiAgYm94LXNoYWRvdzogMHB4IDBweCAyMHB4IDJweCAj
+YjRiZmNiMjI7CiAgei1pbmRleDogNDAwOwogIGJhY2tncm91bmQ6ICMyYjMwMzY7CiAgcGFkZGluZzog
+MjBweDsKfQoKLnBvcHVwLXBhbmUgLmNsb3NlIHsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgcmlnaHQ6
+IDEwcHg7CiAgdG9wOiAxMHB4OwogIGN1cnNvcjogcG9pbnRlcjsKICB0ZXh0LXNoYWRvdzogMXB4IDFw
+eCAycHggIzg4ODsKICBib3gtc2hhZG93OiAxcHggMXB4IDJweCAjMTExOwp9CgoucG9wdXAtcGFuZSBo
+MiB7CiAgcGFkZGluZzogMjFweDsKICBoZWlnaHQ6IDEwJTsKICBtYXJnaW46IDBweDsKICBib3gtc2l6
+aW5nOiBib3JkZXItYm94Owp9CgoucG9wdXAtcGFuZSBwIHsKICBoZWlnaHQ6IDEwJTsKICBib3gtc2l6
+aW5nOiBib3JkZXItYm94OwogIHBhZGRpbmc6IDBweCAyMHB4Owp9CgoucG9wdXAtcGFuZSBwcmUgewog
+IGJhY2tncm91bmQ6ICMxMjIwMmY7CiAgcGFkZGluZzogMjBweDsKICBib3R0b206IDBweDsKICBvdmVy
+ZmxvdzogYXV0byBzY3JvbGw7CiAgaGVpZ2h0OiA2NSU7CiAgbWFyZ2luOiAwcHg7CiAgYm94LXNpemlu
+ZzogYm9yZGVyLWJveDsKfQoKLnBvcHVwLXBhbmUgLmJ1dHRvbi5ib3R0b20gewogIG1hcmdpbjogMjBw
+eCAwcHg7CiAgZGlzcGxheTogYmxvY2s7CiAgdGV4dC1hbGlnbjogY2VudGVyOwp9CgoucmVydW5uaW5n
+LXBhbmUgewogIGRpc3BsYXk6IG5vbmU7Cn0KCmJvZHkucmVydW5uaW5nIC5yZXJ1bm5pbmctcGFuZSB7
+CiAgZGlzcGxheTogYmxvY2s7CiAgcG9zaXRpb246IGZpeGVkOwogIHRvcDogMHB4OwogIGJvdHRvbTog
+MHB4OwogIGxlZnQ6IDBweDsKICByaWdodDogMHB4OwogIGJhY2tncm91bmQtY29sb3I6ICMwMDAwMDBB
+QTsgLyogdHJhbnNsdWNlbnQgYmxhY2sgKi8KICB6LWluZGV4OiA0MDA7Cn0KCi5yZXJ1bm5pbmctcGFu
+ZSBoMSB7CiAgcG9zaXRpb246IGFic29sdXRlOwogIHRvcDogNTAlOwogIGxlZnQ6IDUwJTsKICB0cmFu
+c2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTsKfQoKLmVkaXQtcGFuZWwgLnR5cGUtZGVzY3JpcHRp
+b24gewogIC8qIEZyb20gRGFydFBhZCAkZGFyay1vcmFuZ2UgKi8KICBjb2xvcjogI2ZmOTE2ZTsKICBm
+b250LWZhbWlseTogbW9ub3NwYWNlOwp9Cgp1bC50cmFjZSB7CiAgZm9udC1zaXplOiAxM3B4OwogIGxp
+c3Qtc3R5bGUtdHlwZTogbm9uZTsKICBwYWRkaW5nLWxlZnQ6IDBweDsKfQoKdWwudHJhY2UgbGkgewog
+IGNvbG9yOiB3aGl0ZTsKfQoKdWwudHJhY2UgbGkgLmZ1bmN0aW9uIHsKICAvKiBmcm9tIC5obGpzLXZh
+cmlhYmxlICovCiAgY29sb3I6ICMxNmFkY2E7CiAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICBmb250
+LXdlaWdodDogNjAwOwp9Cgp1bC50cmFjZSBsaSBwLmRyYXdlciB7CiAgbWFyZ2luOiAzcHggMHB4Owog
+IHBhZGRpbmc6IDBweCAwcHggMHB4IDE0cHg7Cn0KCnVsLnRyYWNlIGxpIHAuZHJhd2VyIGJ1dHRvbiB7
+CiAgbWFyZ2luLXJpZ2h0OiAzcHg7Cn0KCi5lbGV2YXRpb24tejQgewogIGJveC1zaGFkb3c6IDBweCAy
+cHggNHB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLAogICAgICAwcHggNHB4IDVweCAwcHggcmdiYSgw
+LCAwLCAwLCAwLjE0KSwKICAgICAgMHB4IDFweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIC4xMik7Cn0K
+CmEgewogIGNvbG9yOiAjY2NjOwogIGZpbGw6ICNjY2M7CiAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwp9
+CgphOmhvdmVyIHsKICBjb2xvcjogI2RiZGJkYjsgLyogI2NjYyBsaWdodGVudGVkIDMwJSovCiAgZmls
+bDogI2ZmZjsKfQoKLmFkZC1oaW50LWxpbmsgewogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBtYXJn
+aW46IDNweDsKfQoKLmFkZC1oaW50LWxpbms6aG92ZXIgewogIGNvbG9yOiAjZmZmOwp9CgpoZWFkZXIg
+YnV0dG9uIHsKICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwp9CgpoZWFkZXIgYSB7CiAgbWFyZ2lu
+OiAwOwp9CgovKiBDYXJlZnVsIGhlcmUuIGBhLmJ1dHRvbmAgaXMgcmVwZXRpdGl2ZSBidXQgcmVxdWly
+ZWQgdG8gZ2V0IGNvcnJlY3QKICogc3BlY2lmaWNpdHkgKi8KYnV0dG9uLCAuYnV0dG9uLCBhLmJ1dHRv
+biB7CiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyMiwgMTM4LCAyNTMsIDAuMTUpOwogIGJvcmRlcjog
+bm9uZTsKICBib3JkZXItcmFkaXVzOiAzcHg7CiAgcGFkZGluZzogM3B4IDEwcHg7CiAgZm9udC13ZWln
+aHQ6IDUwMDsKICBmb250LWZvbnQ6IFJvYm90bywgc2Fucy1zZXJpZjsKICBjb2xvcjogI2ZmZjsKfQoK
+YnV0dG9uOmhvdmVyLCAuYnV0dG9uOmhvdmVyIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDIyLCAx
+MzgsIDI1MywgMC4yOSk7CiAgY3Vyc29yOiBwb2ludGVyOwp9CgpidXR0b25bZGlzYWJsZWRdIHsKICBi
+YWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI1NSwyNTUsMjU1LC4xMik7CiAgY29sb3I6IHJnYmEoMjU1LDI1
+NSwyNTUsLjM3KTsKICBjdXJzb3I6IG5vdC1hbGxvd2VkOwp9CgovKiBDaGFuZ2UgZWRpdCBwYW5lbCBi
+dXR0b24gY29sb3JzICovCi5lZGl0LXBhbmVsIC5idXR0b24sIC5lZGl0LXBhbmVsIGJ1dHRvbiB7CiAg
+YmFja2dyb3VuZC1jb2xvcjogcmdiYSg2MywgMTA0LCAxNDgsIDAuNik7CiAgY29sb3I6IHdoaXRlOwp9
+Ci5lZGl0LXBhbmVsIC5idXR0b246aG92ZXIsIC5lZGl0LXBhbmVsIGJ1dHRvbjpob3ZlciB7CiAgYmFj
+a2dyb3VuZC1jb2xvcjogcmdiYSgxMDEsIDE1MywgMjA4LCAwLjYpOwogIGNvbG9yOiB3aGl0ZTsKfQoK
+LyoKICogQWRqdXN0bWVudHMgdG8gYWxpZ24gbWF0ZXJpYWwgaWNvbnMgaW4gdGhlIHRvb2xiYXIgYnV0
+dG9ucy4KKi8KLmFjdGlvbi1idXR0b24gPiBzcGFuIHsKICBwb3NpdGlvbjpyZWxhdGl2ZTsKICB0b3A6
+IC0zcHg7Cn0KCi5hY3Rpb24tYnV0dG9uIC5tYXRlcmlhbC1pY29ucyB7CiAgdG9wOiA0cHg7Cn0KCi8q
+IERvbid0IHNoaWZ0IHRoZSBpY29uIHdoZW4gaXQncyBhIGRpcmVjdCBjaGlsZCBvZiB0aGUgYnV0dG9u
+ICovCi5hY3Rpb24tYnV0dG9uID4gLm1hdGVyaWFsLWljb25zIHsKICB0b3A6IDFweDsKfQoKLyogU2hp
+ZnQgdGhlIHRleHQgdG8gY2VudGVyIHdpdGggdGhlIGljb24uICovCi5hY3Rpb24tYnV0dG9uID4gc3Bh
+bi5sYWJlbCB7CiAgcG9zaXRpb246cmVsYXRpdmU7CiAgdG9wOiAtNHB4Owp9CgouYWN0aW9uLWJ1dHRv
+biAubWF0ZXJpYWwtaWNvbnMgewogIGZvbnQtc2l6ZTogMjBweDsKICBwb3NpdGlvbjogcmVsYXRpdmU7
+Cn0KCi5wbGFjZWhvbGRlciB7CiAgY29sb3I6ICM3Nzc7CiAgdGV4dC1hbGlnbjogY2VudGVyOwogIG1h
+cmdpbi10b3A6IDNlbSAhaW1wb3J0YW50Owp9CgovKioKICogSExKUyBPdmVycmlkZXMKICovCi5obGpz
+IHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjMTIyMDJmOyAvKiAkZGFyay1jb2RlLWJhY2tncm91bmQtY29s
+b3IgKi8KICBjb2xvcjogI2MwYzJjNTsgLyogJGRhcmstZWRpdG9yLXRleHQgKi8KICBkaXNwbGF5OiBi
+bG9jazsKICBvdmVyZmxvdy14OiBhdXRvOwogIHBhZGRpbmc6IDAuNWVtOwogIC8qKgogICAqIFRoaXMg
+YWxsb3dzIHRoZSBwZXItbGluZSBoaWdobGlnaHRzIHRvIHNob3cuCiAgICovCiAgYmFja2dyb3VuZDog
+bm9uZTsKfQoKLmhsanMta2V5d29yZCwKLmhsanMtc2VsZWN0b3ItdGFnLAouaGxqcy1kZWxldGlvbiB7
+CiAgY29sb3I6ICM1MWM2ODY7IC8qIGNtLWtleXdvcmQgKi8KfQoKLmhsanMtbnVtYmVyIHsKICBjb2xv
+cjogIzYyNzk3ODsgLyogY20tbnVtYmVyICovCn0KCi5obGpzLWNvbW1lbnQgewogIGNvbG9yOiAjOTE5
+OGI0OyAvKiBjbS1jb21tZW50ICovCn0KCi5obGpzLWxpdGVyYWwgewogIGNvbG9yOiAjZWU4NjY2OyAv
+KiBjbS1hdG9tICovCn0KCi5obGpzLXN0cmluZyB7CiAgY29sb3I6ICNlNTUwNzQ7IC8qIGNtLXN0cmlu
+ZyAqLwp9CgouaGxqcy12YXJpYWJsZSB7CiAgY29sb3I6ICMxNmFkY2E7IC8qIGNtLXZhcmlhYmxlICov
+Cn0KCi5obGpzLWxpbmsgewogIGNvbG9yOiAjZTU1MDc0OyAvKiBjbS1zdHJpbmcgKi8KfQouaGxqcy1z
+ZWN0aW9uLAouaGxqcy10eXBlLAouaGxqcy1idWlsdF9pbiwKLmhsanMtdGl0bGUgewogIGNvbG9yOiAj
+ZWU4NjY2OyAvKiBjbS12YXJpYWJsZS0yICovCn0KCi5obGpzLWFkZGl0aW9uIHsKICBjb2xvcjogIzI2
+Mzk1MjsgLyogJGRhcmstc2VsZWN0aW9uLWNvbG9yICovCn0KCi5obGpzLW1ldGEgewogIGNvbG9yOiAj
+NjI3OTc4Owp9Cg==
 ''';
 
 String _migration_js;
-// migration_dart md5 is '6102ec712b1621d5b1eb706530f5efd2'
+// migration_dart md5 is '4e8037b6c5e790a11515f71f5c8a76c2'
 String _migration_js_base64 = '''
 KGZ1bmN0aW9uIGRhcnRQcm9ncmFtKCl7ZnVuY3Rpb24gY29weVByb3BlcnRpZXMoYSxiKXt2YXIgcz1P
 YmplY3Qua2V5cyhhKQpmb3IodmFyIHI9MDtyPHMubGVuZ3RoO3IrKyl7dmFyIHE9c1tyXQpiW3FdPWFb
@@ -7770,1390 +7771,1389 @@
 IEZLKCl7fSwKR0o6ZnVuY3Rpb24oYSxiLGMpe2lmKGIuQygiYlE8MD4iKS5iKGEpKXJldHVybiBuZXcg
 SC5vbChhLGIuQygiQDwwPiIpLktxKGMpLkMoIm9sPDEsMj4iKSkKcmV0dXJuIG5ldyBILlp5KGEsYi5D
 KCJAPDA+IikuS3EoYykuQygiWnk8MSwyPiIpKX0sCmM6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBILm4o
-YSl9LApvbzpmdW5jdGlvbihhKXt2YXIgcyxyPWFeNDgKaWYocjw9OSlyZXR1cm4gcgpzPWF8MzIKaWYo
-OTc8PXMmJnM8PTEwMilyZXR1cm4gcy04NwpyZXR1cm4tMX0sCnFDOmZ1bmN0aW9uKGEsYixjLGQpe1Au
-azEoYiwic3RhcnQiKQppZihjIT1udWxsKXtQLmsxKGMsImVuZCIpCmlmKGI+YylILnYoUC5URShiLDAs
-Yywic3RhcnQiLG51bGwpKX1yZXR1cm4gbmV3IEgubkgoYSxiLGMsZC5DKCJuSDwwPiIpKX0sCksxOmZ1
-bmN0aW9uKGEsYixjLGQpe2lmKHQuYi5iKGEpKXJldHVybiBuZXcgSC54eShhLGIsYy5DKCJAPDA+Iiku
-S3EoZCkuQygieHk8MSwyPiIpKQpyZXR1cm4gbmV3IEguaTEoYSxiLGMuQygiQDwwPiIpLktxKGQpLkMo
-ImkxPDEsMj4iKSl9LApiSzpmdW5jdGlvbihhLGIsYyl7dmFyIHM9ImNvdW50IgppZih0LmIuYihhKSl7
-UC5VSShiLHMsdC5TKQpQLmsxKGIscykKcmV0dXJuIG5ldyBILmQ1KGEsYixjLkMoImQ1PDA+IikpfVAu
-VUkoYixzLHQuUykKUC5rMShiLHMpCnJldHVybiBuZXcgSC5BTShhLGIsYy5DKCJBTTwwPiIpKX0sCldw
-OmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBQLmxqKCJObyBlbGVtZW50Iil9LApBbTpmdW5jdGlvbigpe3Jl
-dHVybiBuZXcgUC5saigiVG9vIG1hbnkgZWxlbWVudHMiKX0sCmFyOmZ1bmN0aW9uKCl7cmV0dXJuIG5l
-dyBQLmxqKCJUb28gZmV3IGVsZW1lbnRzIil9LApCUjpmdW5jdGlvbiBCUigpe30sCkU3OmZ1bmN0aW9u
-IEU3KGEsYil7dGhpcy5hPWEKdGhpcy4kdGk9Yn0sClp5OmZ1bmN0aW9uIFp5KGEsYil7dGhpcy5hPWEK
-dGhpcy4kdGk9Yn0sCm9sOmZ1bmN0aW9uIG9sKGEsYil7dGhpcy5hPWEKdGhpcy4kdGk9Yn0sClVxOmZ1
-bmN0aW9uIFVxKCl7fSwKalY6ZnVuY3Rpb24galYoYSxiKXt0aGlzLmE9YQp0aGlzLiR0aT1ifSwKbjpm
-dW5jdGlvbiBuKGEpe3RoaXMuYT1hfSwKcWo6ZnVuY3Rpb24gcWooYSl7dGhpcy5hPWF9LApiUTpmdW5j
-dGlvbiBiUSgpe30sCmFMOmZ1bmN0aW9uIGFMKCl7fSwKbkg6ZnVuY3Rpb24gbkgoYSxiLGMsZCl7dmFy
-IF89dGhpcwpfLmE9YQpfLmI9YgpfLmM9YwpfLiR0aT1kfSwKYTc6ZnVuY3Rpb24gYTcoYSxiLGMpe3Zh
-ciBfPXRoaXMKXy5hPWEKXy5iPWIKXy5jPTAKXy5kPW51bGwKXy4kdGk9Y30sCmkxOmZ1bmN0aW9uIGkx
-KGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLiR0aT1jfSwKeHk6ZnVuY3Rpb24geHkoYSxiLGMp
-e3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMuJHRpPWN9LApNSDpmdW5jdGlvbiBNSChhLGIsYyl7dmFyIF89
-dGhpcwpfLmE9bnVsbApfLmI9YQpfLmM9YgpfLiR0aT1jfSwKbEo6ZnVuY3Rpb24gbEooYSxiLGMpe3Ro
-aXMuYT1hCnRoaXMuYj1iCnRoaXMuJHRpPWN9LApVNTpmdW5jdGlvbiBVNShhLGIsYyl7dGhpcy5hPWEK
-dGhpcy5iPWIKdGhpcy4kdGk9Y30sClNPOmZ1bmN0aW9uIFNPKGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9
-Ygp0aGlzLiR0aT1jfSwKQU06ZnVuY3Rpb24gQU0oYSxiLGMpe3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMu
-JHRpPWN9LApkNTpmdW5jdGlvbiBkNShhLGIsYyl7dGhpcy5hPWEKdGhpcy5iPWIKdGhpcy4kdGk9Y30s
-ClUxOmZ1bmN0aW9uIFUxKGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLiR0aT1jfSwKTUI6ZnVu
-Y3Rpb24gTUIoYSl7dGhpcy4kdGk9YX0sCkZ1OmZ1bmN0aW9uIEZ1KGEpe3RoaXMuJHRpPWF9LAp1Njpm
-dW5jdGlvbiB1NihhLGIpe3RoaXMuYT1hCnRoaXMuJHRpPWJ9LApKQjpmdW5jdGlvbiBKQihhLGIpe3Ro
-aXMuYT1hCnRoaXMuJHRpPWJ9LApTVTpmdW5jdGlvbiBTVSgpe30sClJlOmZ1bmN0aW9uIFJlKCl7fSwK
-dzI6ZnVuY3Rpb24gdzIoKXt9LAp3djpmdW5jdGlvbiB3dihhKXt0aGlzLmE9YX0sClFDOmZ1bmN0aW9u
-IFFDKCl7fSwKZGM6ZnVuY3Rpb24oKXt0aHJvdyBILmIoUC5MNCgiQ2Fubm90IG1vZGlmeSB1bm1vZGlm
-aWFibGUgTWFwIikpfSwKTlE6ZnVuY3Rpb24oYSl7dmFyIHMscj1ILkpnKGEpCmlmKHIhPW51bGwpcmV0
-dXJuIHIKcz0ibWluaWZpZWQ6IithCnJldHVybiBzfSwKd1Y6ZnVuY3Rpb24oYSxiKXt2YXIgcwppZihi
-IT1udWxsKXtzPWIueAppZihzIT1udWxsKXJldHVybiBzfXJldHVybiB0LmFVLmIoYSl9LApFajpmdW5j
-dGlvbihhKXt2YXIgcwppZih0eXBlb2YgYT09InN0cmluZyIpcmV0dXJuIGEKaWYodHlwZW9mIGE9PSJu
-dW1iZXIiKXtpZihhIT09MClyZXR1cm4iIithfWVsc2UgaWYoITA9PT1hKXJldHVybiJ0cnVlIgplbHNl
-IGlmKCExPT09YSlyZXR1cm4iZmFsc2UiCmVsc2UgaWYoYT09bnVsbClyZXR1cm4ibnVsbCIKcz1KLmoo
-YSkKaWYodHlwZW9mIHMhPSJzdHJpbmciKXRocm93IEguYihILnRMKGEpKQpyZXR1cm4gc30sCmVROmZ1
-bmN0aW9uKGEpe3ZhciBzPWEuJGlkZW50aXR5SGFzaAppZihzPT1udWxsKXtzPU1hdGgucmFuZG9tKCkq
-MHgzZmZmZmZmZnwwCmEuJGlkZW50aXR5SGFzaD1zfXJldHVybiBzfSwKSHA6ZnVuY3Rpb24oYSxiKXt2
-YXIgcyxyLHEscCxvLG4sbT1udWxsCmlmKHR5cGVvZiBhIT0ic3RyaW5nIilILnYoSC50TChhKSkKcz0v
-XlxzKlsrLV0/KCgweFthLWYwLTldKyl8KFxkKyl8KFthLXowLTldKykpXHMqJC9pLmV4ZWMoYSkKaWYo
-cz09bnVsbClyZXR1cm4gbQppZigzPj1zLmxlbmd0aClyZXR1cm4gSC5PSChzLDMpCnI9c1szXQppZihi
-PT1udWxsKXtpZihyIT1udWxsKXJldHVybiBwYXJzZUludChhLDEwKQppZihzWzJdIT1udWxsKXJldHVy
-biBwYXJzZUludChhLDE2KQpyZXR1cm4gbX1pZihiPDJ8fGI+MzYpdGhyb3cgSC5iKFAuVEUoYiwyLDM2
-LCJyYWRpeCIsbSkpCmlmKGI9PT0xMCYmciE9bnVsbClyZXR1cm4gcGFyc2VJbnQoYSwxMCkKaWYoYjwx
-MHx8cj09bnVsbCl7cT1iPD0xMD80NytiOjg2K2IKcD1zWzFdCmZvcihvPXAubGVuZ3RoLG49MDtuPG87
-KytuKWlmKChDLnhCLlcocCxuKXwzMik+cSlyZXR1cm4gbX1yZXR1cm4gcGFyc2VJbnQoYSxiKX0sCk06
-ZnVuY3Rpb24oYSl7cmV0dXJuIEguSDUoYSl9LApINTpmdW5jdGlvbihhKXt2YXIgcyxyLHEKaWYoYSBp
-bnN0YW5jZW9mIFAuTWgpcmV0dXJuIEguZG0oSC56KGEpLG51bGwpCmlmKEouaWEoYSk9PT1DLk9rfHx0
-LmJKLmIoYSkpe3M9Qy5PNChhKQppZihILkJlKHMpKXJldHVybiBzCnI9YS5jb25zdHJ1Y3RvcgppZih0
-eXBlb2Ygcj09ImZ1bmN0aW9uIil7cT1yLm5hbWUKaWYodHlwZW9mIHE9PSJzdHJpbmciJiZILkJlKHEp
-KXJldHVybiBxfX1yZXR1cm4gSC5kbShILnooYSksbnVsbCl9LApCZTpmdW5jdGlvbihhKXt2YXIgcz1h
-IT09Ik9iamVjdCImJmEhPT0iIgpyZXR1cm4gc30sCk0wOmZ1bmN0aW9uKCl7aWYoISFzZWxmLmxvY2F0
-aW9uKXJldHVybiBzZWxmLmxvY2F0aW9uLmhyZWYKcmV0dXJuIG51bGx9LApWSzpmdW5jdGlvbihhKXt2
-YXIgcyxyLHEscCxvPWEubGVuZ3RoCmlmKG88PTUwMClyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5h
-cHBseShudWxsLGEpCmZvcihzPSIiLHI9MDtyPG87cj1xKXtxPXIrNTAwCnA9cTxvP3E6bwpzKz1TdHJp
-bmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsYS5zbGljZShyLHApKX1yZXR1cm4gc30sCkNxOmZ1bmN0
-aW9uKGEpe3ZhciBzLHIscSxwPUguVk0oW10sdC5hKQpmb3Iocz1hLmxlbmd0aCxyPTA7cjxhLmxlbmd0
-aDthLmxlbmd0aD09PXN8fCgwLEgubGspKGEpLCsrcil7cT1hW3JdCmlmKCFILm9rKHEpKXRocm93IEgu
-YihILnRMKHEpKQppZihxPD02NTUzNSlDLk5tLmkocCxxKQplbHNlIGlmKHE8PTExMTQxMTEpe0MuTm0u
-aShwLDU1Mjk2KyhDLmpuLndHKHEtNjU1MzYsMTApJjEwMjMpKQpDLk5tLmkocCw1NjMyMCsocSYxMDIz
-KSl9ZWxzZSB0aHJvdyBILmIoSC50TChxKSl9cmV0dXJuIEguVksocCl9LAplVDpmdW5jdGlvbihhKXt2
-YXIgcyxyLHEKZm9yKHM9YS5sZW5ndGgscj0wO3I8czsrK3Ipe3E9YVtyXQppZighSC5vayhxKSl0aHJv
-dyBILmIoSC50TChxKSkKaWYocTwwKXRocm93IEguYihILnRMKHEpKQppZihxPjY1NTM1KXJldHVybiBI
-LkNxKGEpfXJldHVybiBILlZLKGEpfSwKZnc6ZnVuY3Rpb24oYSxiLGMpe3ZhciBzLHIscSxwCmlmKGM8
-PTUwMCYmYj09PTAmJmM9PT1hLmxlbmd0aClyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShu
-dWxsLGEpCmZvcihzPWIscj0iIjtzPGM7cz1xKXtxPXMrNTAwCnA9cTxjP3E6YwpyKz1TdHJpbmcuZnJv
-bUNoYXJDb2RlLmFwcGx5KG51bGwsYS5zdWJhcnJheShzLHApKX1yZXR1cm4gcn0sCkx3OmZ1bmN0aW9u
-KGEpe3ZhciBzCmlmKDA8PWEpe2lmKGE8PTY1NTM1KXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGEp
-CmlmKGE8PTExMTQxMTEpe3M9YS02NTUzNgpyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSgoNTUyOTZ8
-Qy5qbi53RyhzLDEwKSk+Pj4wLDU2MzIwfHMmMTAyMyl9fXRocm93IEguYihQLlRFKGEsMCwxMTE0MTEx
-LG51bGwsbnVsbCkpfSwKbzI6ZnVuY3Rpb24oYSl7aWYoYS5kYXRlPT09dm9pZCAwKWEuZGF0ZT1uZXcg
-RGF0ZShhLmEpCnJldHVybiBhLmRhdGV9LAp0SjpmdW5jdGlvbihhKXt2YXIgcz1ILm8yKGEpLmdldEZ1
-bGxZZWFyKCkrMApyZXR1cm4gc30sCk5TOmZ1bmN0aW9uKGEpe3ZhciBzPUgubzIoYSkuZ2V0TW9udGgo
-KSsxCnJldHVybiBzfSwKakE6ZnVuY3Rpb24oYSl7dmFyIHM9SC5vMihhKS5nZXREYXRlKCkrMApyZXR1
-cm4gc30sCklYOmZ1bmN0aW9uKGEpe3ZhciBzPUgubzIoYSkuZ2V0SG91cnMoKSswCnJldHVybiBzfSwK
-Y2g6ZnVuY3Rpb24oYSl7dmFyIHM9SC5vMihhKS5nZXRNaW51dGVzKCkrMApyZXR1cm4gc30sCkpkOmZ1
-bmN0aW9uKGEpe3ZhciBzPUgubzIoYSkuZ2V0U2Vjb25kcygpKzAKcmV0dXJuIHN9LApvMTpmdW5jdGlv
-bihhKXt2YXIgcz1ILm8yKGEpLmdldE1pbGxpc2Vjb25kcygpKzAKcmV0dXJuIHN9LAp6bzpmdW5jdGlv
-bihhLGIsYyl7dmFyIHMscixxPXt9CnEuYT0wCnM9W10Kcj1bXQpxLmE9Yi5sZW5ndGgKQy5ObS5GVihz
-LGIpCnEuYj0iIgppZihjIT1udWxsJiZjLmEhPT0wKWMuSygwLG5ldyBILkNqKHEscixzKSkKIiIrcS5h
-CnJldHVybiBKLkp5KGEsbmV3IEguTEkoQy5UZSwwLHMsciwwKSl9LApFazpmdW5jdGlvbihhLGIsYyl7
-dmFyIHMscixxLHAKaWYoYiBpbnN0YW5jZW9mIEFycmF5KXM9Yz09bnVsbHx8Yy5hPT09MAplbHNlIHM9
-ITEKaWYocyl7cj1iCnE9ci5sZW5ndGgKaWYocT09PTApe2lmKCEhYS4kMClyZXR1cm4gYS4kMCgpfWVs
-c2UgaWYocT09PTEpe2lmKCEhYS4kMSlyZXR1cm4gYS4kMShyWzBdKX1lbHNlIGlmKHE9PT0yKXtpZigh
-IWEuJDIpcmV0dXJuIGEuJDIoclswXSxyWzFdKX1lbHNlIGlmKHE9PT0zKXtpZighIWEuJDMpcmV0dXJu
-IGEuJDMoclswXSxyWzFdLHJbMl0pfWVsc2UgaWYocT09PTQpe2lmKCEhYS4kNClyZXR1cm4gYS4kNChy
-WzBdLHJbMV0sclsyXSxyWzNdKX1lbHNlIGlmKHE9PT01KWlmKCEhYS4kNSlyZXR1cm4gYS4kNShyWzBd
-LHJbMV0sclsyXSxyWzNdLHJbNF0pCnA9YVsiIisiJCIrcV0KaWYocCE9bnVsbClyZXR1cm4gcC5hcHBs
-eShhLHIpfXJldHVybiBILmUxKGEsYixjKX0sCmUxOmZ1bmN0aW9uKGEsYixjKXt2YXIgcyxyLHEscCxv
-LG4sbSxsLGssaixpPWIgaW5zdGFuY2VvZiBBcnJheT9iOlAuQ0goYiwhMCx0LnopLGg9aS5sZW5ndGgs
-Zz1hLiRSCmlmKGg8ZylyZXR1cm4gSC56byhhLGksYykKcz1hLiRECnI9cz09bnVsbApxPSFyP3MoKTpu
-dWxsCnA9Si5pYShhKQpvPXAuJEMKaWYodHlwZW9mIG89PSJzdHJpbmciKW89cFtvXQppZihyKXtpZihj
-IT1udWxsJiZjLmEhPT0wKXJldHVybiBILnpvKGEsaSxjKQppZihoPT09ZylyZXR1cm4gby5hcHBseShh
-LGkpCnJldHVybiBILnpvKGEsaSxjKX1pZihxIGluc3RhbmNlb2YgQXJyYXkpe2lmKGMhPW51bGwmJmMu
-YSE9PTApcmV0dXJuIEguem8oYSxpLGMpCmlmKGg+ZytxLmxlbmd0aClyZXR1cm4gSC56byhhLGksbnVs
-bCkKQy5ObS5GVihpLHEuc2xpY2UoaC1nKSkKcmV0dXJuIG8uYXBwbHkoYSxpKX1lbHNle2lmKGg+Zyly
-ZXR1cm4gSC56byhhLGksYykKbj1PYmplY3Qua2V5cyhxKQppZihjPT1udWxsKWZvcihyPW4ubGVuZ3Ro
-LG09MDttPG4ubGVuZ3RoO24ubGVuZ3RoPT09cnx8KDAsSC5saykobiksKyttKXtsPXFbSC5oKG5bbV0p
-XQppZihDLk52PT09bClyZXR1cm4gSC56byhhLGksYykKQy5ObS5pKGksbCl9ZWxzZXtmb3Iocj1uLmxl
-bmd0aCxrPTAsbT0wO208bi5sZW5ndGg7bi5sZW5ndGg9PT1yfHwoMCxILmxrKShuKSwrK20pe2o9SC5o
-KG5bbV0pCmlmKGMueDQoaikpeysrawpDLk5tLmkoaSxjLnEoMCxqKSl9ZWxzZXtsPXFbal0KaWYoQy5O
-dj09PWwpcmV0dXJuIEguem8oYSxpLGMpCkMuTm0uaShpLGwpfX1pZihrIT09Yy5hKXJldHVybiBILnpv
-KGEsaSxjKX1yZXR1cm4gby5hcHBseShhLGkpfX0sCnBZOmZ1bmN0aW9uKGEpe3Rocm93IEguYihILnRM
-KGEpKX0sCk9IOmZ1bmN0aW9uKGEsYil7aWYoYT09bnVsbClKLkhtKGEpCnRocm93IEguYihILkhZKGEs
-YikpfSwKSFk6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyLHE9ImluZGV4IgppZighSC5vayhiKSlyZXR1cm4g
-bmV3IFAudSghMCxiLHEsbnVsbCkKcz1ILnVQKEouSG0oYSkpCmlmKCEoYjwwKSl7aWYodHlwZW9mIHMh
-PT0ibnVtYmVyIilyZXR1cm4gSC5wWShzKQpyPWI+PXN9ZWxzZSByPSEwCmlmKHIpcmV0dXJuIFAuQ2Yo
-YixhLHEsbnVsbCxzKQpyZXR1cm4gUC5PNyhiLHEpfSwKYXU6ZnVuY3Rpb24oYSxiLGMpe2lmKGE+Yyly
-ZXR1cm4gUC5URShhLDAsYywic3RhcnQiLG51bGwpCmlmKGIhPW51bGwpaWYoYjxhfHxiPmMpcmV0dXJu
-IFAuVEUoYixhLGMsImVuZCIsbnVsbCkKcmV0dXJuIG5ldyBQLnUoITAsYiwiZW5kIixudWxsKX0sCnRM
-OmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgUC51KCEwLGEsbnVsbCxudWxsKX0sCmI6ZnVuY3Rpb24oYSl7
-dmFyIHMscgppZihhPT1udWxsKWE9bmV3IFAuRigpCnM9bmV3IEVycm9yKCkKcy5kYXJ0RXhjZXB0aW9u
-PWEKcj1ILngKaWYoImRlZmluZVByb3BlcnR5IiBpbiBPYmplY3Qpe09iamVjdC5kZWZpbmVQcm9wZXJ0
-eShzLCJtZXNzYWdlIix7Z2V0OnJ9KQpzLm5hbWU9IiJ9ZWxzZSBzLnRvU3RyaW5nPXIKcmV0dXJuIHN9
-LAp4OmZ1bmN0aW9uKCl7cmV0dXJuIEouaih0aGlzLmRhcnRFeGNlcHRpb24pfSwKdjpmdW5jdGlvbihh
-KXt0aHJvdyBILmIoYSl9LApsazpmdW5jdGlvbihhKXt0aHJvdyBILmIoUC5hNChhKSl9LApjTTpmdW5j
-dGlvbihhKXt2YXIgcyxyLHEscCxvLG4KYT1ILmVBKGEucmVwbGFjZShTdHJpbmcoe30pLCckcmVjZWl2
-ZXIkJykpCnM9YS5tYXRjaCgvXFxcJFthLXpBLVpdK1xcXCQvZykKaWYocz09bnVsbClzPUguVk0oW10s
-dC5zKQpyPXMuaW5kZXhPZigiXFwkYXJndW1lbnRzXFwkIikKcT1zLmluZGV4T2YoIlxcJGFyZ3VtZW50
-c0V4cHJcXCQiKQpwPXMuaW5kZXhPZigiXFwkZXhwclxcJCIpCm89cy5pbmRleE9mKCJcXCRtZXRob2Rc
-XCQiKQpuPXMuaW5kZXhPZigiXFwkcmVjZWl2ZXJcXCQiKQpyZXR1cm4gbmV3IEguZjkoYS5yZXBsYWNl
-KG5ldyBSZWdFeHAoJ1xcXFxcXCRhcmd1bWVudHNcXFxcXFwkJywnZycpLCcoKD86eHxbXnhdKSopJyku
-cmVwbGFjZShuZXcgUmVnRXhwKCdcXFxcXFwkYXJndW1lbnRzRXhwclxcXFxcXCQnLCdnJyksJygoPzp4
-fFteeF0pKiknKS5yZXBsYWNlKG5ldyBSZWdFeHAoJ1xcXFxcXCRleHByXFxcXFxcJCcsJ2cnKSwnKCg/
-Onh8W154XSkqKScpLnJlcGxhY2UobmV3IFJlZ0V4cCgnXFxcXFxcJG1ldGhvZFxcXFxcXCQnLCdnJyks
-JygoPzp4fFteeF0pKiknKS5yZXBsYWNlKG5ldyBSZWdFeHAoJ1xcXFxcXCRyZWNlaXZlclxcXFxcXCQn
-LCdnJyksJygoPzp4fFteeF0pKiknKSxyLHEscCxvLG4pfSwKUzc6ZnVuY3Rpb24oYSl7cmV0dXJuIGZ1
-bmN0aW9uKCRleHByJCl7dmFyICRhcmd1bWVudHNFeHByJD0nJGFyZ3VtZW50cyQnCnRyeXskZXhwciQu
-JG1ldGhvZCQoJGFyZ3VtZW50c0V4cHIkKX1jYXRjaChzKXtyZXR1cm4gcy5tZXNzYWdlfX0oYSl9LApN
-ajpmdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oJGV4cHIkKXt0cnl7JGV4cHIkLiRtZXRob2QkfWNh
-dGNoKHMpe3JldHVybiBzLm1lc3NhZ2V9fShhKX0sCklqOmZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyBI
-LlcwKGEsYj09bnVsbD9udWxsOmIubWV0aG9kKX0sClQzOmZ1bmN0aW9uKGEsYil7dmFyIHM9Yj09bnVs
-bCxyPXM/bnVsbDpiLm1ldGhvZApyZXR1cm4gbmV3IEguYXooYSxyLHM/bnVsbDpiLnJlY2VpdmVyKX0s
-ClJ1OmZ1bmN0aW9uKGEpe2lmKGE9PW51bGwpcmV0dXJuIG5ldyBILnRlKGEpCmlmKGEgaW5zdGFuY2Vv
-ZiBILmJxKXJldHVybiBILnRXKGEsYS5hKQppZih0eXBlb2YgYSE9PSJvYmplY3QiKXJldHVybiBhCmlm
-KCJkYXJ0RXhjZXB0aW9uIiBpbiBhKXJldHVybiBILnRXKGEsYS5kYXJ0RXhjZXB0aW9uKQpyZXR1cm4g
-SC50bChhKX0sCnRXOmZ1bmN0aW9uKGEsYil7aWYodC5yLmIoYikpaWYoYi4kdGhyb3duSnNFcnJvcj09
-bnVsbCliLiR0aHJvd25Kc0Vycm9yPWEKcmV0dXJuIGJ9LAp0bDpmdW5jdGlvbihhKXt2YXIgcyxyLHEs
-cCxvLG4sbSxsLGssaixpLGgsZyxmLGU9bnVsbAppZighKCJtZXNzYWdlIiBpbiBhKSlyZXR1cm4gYQpz
-PWEubWVzc2FnZQppZigibnVtYmVyIiBpbiBhJiZ0eXBlb2YgYS5udW1iZXI9PSJudW1iZXIiKXtyPWEu
-bnVtYmVyCnE9ciY2NTUzNQppZigoQy5qbi53RyhyLDE2KSY4MTkxKT09PTEwKXN3aXRjaChxKXtjYXNl
-IDQzODpyZXR1cm4gSC50VyhhLEguVDMoSC5FaihzKSsiIChFcnJvciAiK3ErIikiLGUpKQpjYXNlIDQ0
-NTpjYXNlIDUwMDc6cmV0dXJuIEgudFcoYSxILklqKEguRWoocykrIiAoRXJyb3IgIitxKyIpIixlKSl9
-fWlmKGEgaW5zdGFuY2VvZiBUeXBlRXJyb3Ipe3A9JC5TbigpCm89JC5scSgpCm49JC5OOSgpCm09JC5p
-SSgpCmw9JC5VTigpCms9JC5aaCgpCmo9JC5yTigpCiQuYzMoKQppPSQuSEsoKQpoPSQucjEoKQpnPXAu
-cVMocykKaWYoZyE9bnVsbClyZXR1cm4gSC50VyhhLEguVDMoSC5oKHMpLGcpKQplbHNle2c9by5xUyhz
-KQppZihnIT1udWxsKXtnLm1ldGhvZD0iY2FsbCIKcmV0dXJuIEgudFcoYSxILlQzKEguaChzKSxnKSl9
-ZWxzZXtnPW4ucVMocykKaWYoZz09bnVsbCl7Zz1tLnFTKHMpCmlmKGc9PW51bGwpe2c9bC5xUyhzKQpp
-ZihnPT1udWxsKXtnPWsucVMocykKaWYoZz09bnVsbCl7Zz1qLnFTKHMpCmlmKGc9PW51bGwpe2c9bS5x
-UyhzKQppZihnPT1udWxsKXtnPWkucVMocykKaWYoZz09bnVsbCl7Zz1oLnFTKHMpCmY9ZyE9bnVsbH1l
-bHNlIGY9ITB9ZWxzZSBmPSEwfWVsc2UgZj0hMH1lbHNlIGY9ITB9ZWxzZSBmPSEwfWVsc2UgZj0hMH1l
-bHNlIGY9ITAKaWYoZilyZXR1cm4gSC50VyhhLEguSWooSC5oKHMpLGcpKX19cmV0dXJuIEgudFcoYSxu
-ZXcgSC52Vih0eXBlb2Ygcz09InN0cmluZyI/czoiIikpfWlmKGEgaW5zdGFuY2VvZiBSYW5nZUVycm9y
-KXtpZih0eXBlb2Ygcz09InN0cmluZyImJnMuaW5kZXhPZigiY2FsbCBzdGFjayIpIT09LTEpcmV0dXJu
-IG5ldyBQLktZKCkKcz1mdW5jdGlvbihiKXt0cnl7cmV0dXJuIFN0cmluZyhiKX1jYXRjaChkKXt9cmV0
-dXJuIG51bGx9KGEpCnJldHVybiBILnRXKGEsbmV3IFAudSghMSxlLGUsdHlwZW9mIHM9PSJzdHJpbmci
-P3MucmVwbGFjZSgvXlJhbmdlRXJyb3I6XHMqLywiIik6cykpfWlmKHR5cGVvZiBJbnRlcm5hbEVycm9y
-PT0iZnVuY3Rpb24iJiZhIGluc3RhbmNlb2YgSW50ZXJuYWxFcnJvcilpZih0eXBlb2Ygcz09InN0cmlu
-ZyImJnM9PT0idG9vIG11Y2ggcmVjdXJzaW9uIilyZXR1cm4gbmV3IFAuS1koKQpyZXR1cm4gYX0sCnRz
-OmZ1bmN0aW9uKGEpe3ZhciBzCmlmKGEgaW5zdGFuY2VvZiBILmJxKXJldHVybiBhLmIKaWYoYT09bnVs
-bClyZXR1cm4gbmV3IEguWE8oYSkKcz1hLiRjYWNoZWRUcmFjZQppZihzIT1udWxsKXJldHVybiBzCnJl
-dHVybiBhLiRjYWNoZWRUcmFjZT1uZXcgSC5YTyhhKX0sCkI3OmZ1bmN0aW9uKGEsYil7dmFyIHMscixx
-LHA9YS5sZW5ndGgKZm9yKHM9MDtzPHA7cz1xKXtyPXMrMQpxPXIrMQpiLlkoMCxhW3NdLGFbcl0pfXJl
-dHVybiBifSwKZnQ6ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe3QuWS5hKGEpCnN3aXRjaChILnVQKGIpKXtj
-YXNlIDA6cmV0dXJuIGEuJDAoKQpjYXNlIDE6cmV0dXJuIGEuJDEoYykKY2FzZSAyOnJldHVybiBhLiQy
-KGMsZCkKY2FzZSAzOnJldHVybiBhLiQzKGMsZCxlKQpjYXNlIDQ6cmV0dXJuIGEuJDQoYyxkLGUsZil9
-dGhyb3cgSC5iKG5ldyBQLkNEKCJVbnN1cHBvcnRlZCBudW1iZXIgb2YgYXJndW1lbnRzIGZvciB3cmFw
-cGVkIGNsb3N1cmUiKSl9LAp0UjpmdW5jdGlvbihhLGIpe3ZhciBzCmlmKGE9PW51bGwpcmV0dXJuIG51
-bGwKcz1hLiRpZGVudGl0eQppZighIXMpcmV0dXJuIHMKcz1mdW5jdGlvbihjLGQsZSl7cmV0dXJuIGZ1
-bmN0aW9uKGYsZyxoLGkpe3JldHVybiBlKGMsZCxmLGcsaCxpKX19KGEsYixILmZ0KQphLiRpZGVudGl0
-eT1zCnJldHVybiBzfSwKaUE6ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyl7dmFyIHMscixxLHAsbyxuLG0s
-bD1iWzBdLGs9bC4kY2FsbE5hbWUsaj1lP09iamVjdC5jcmVhdGUobmV3IEguengoKS5jb25zdHJ1Y3Rv
-ci5wcm90b3R5cGUpOk9iamVjdC5jcmVhdGUobmV3IEguclQobnVsbCxudWxsLG51bGwsIiIpLmNvbnN0
-cnVjdG9yLnByb3RvdHlwZSkKai4kaW5pdGlhbGl6ZT1qLmNvbnN0cnVjdG9yCmlmKGUpcz1mdW5jdGlv
-biBzdGF0aWNfdGVhcl9vZmYoKXt0aGlzLiRpbml0aWFsaXplKCl9CmVsc2V7cj0kLnlqCmlmKHR5cGVv
-ZiByIT09Im51bWJlciIpcmV0dXJuIHIuaCgpCiQueWo9cisxCnI9bmV3IEZ1bmN0aW9uKCJhLGIsYyxk
-IityLCJ0aGlzLiRpbml0aWFsaXplKGEsYixjLGQiK3IrIikiKQpzPXJ9ai5jb25zdHJ1Y3Rvcj1zCnMu
-cHJvdG90eXBlPWoKaWYoIWUpe3E9SC5ieChhLGwsZikKcS4kcmVmbGVjdGlvbkluZm89ZH1lbHNle2ou
-JHN0YXRpY19uYW1lPWcKcT1sfWouJFM9SC5pbShkLGUsZikKaltrXT1xCmZvcihwPXEsbz0xO288Yi5s
-ZW5ndGg7KytvKXtuPWJbb10KbT1uLiRjYWxsTmFtZQppZihtIT1udWxsKXtuPWU/bjpILmJ4KGEsbixm
-KQpqW21dPW59aWYobz09PWMpe24uJHJlZmxlY3Rpb25JbmZvPWQKcD1ufX1qLiRDPXAKai4kUj1sLiRS
-CmouJEQ9bC4kRApyZXR1cm4gc30sCmltOmZ1bmN0aW9uKGEsYixjKXt2YXIgcwppZih0eXBlb2YgYT09
-Im51bWJlciIpcmV0dXJuIGZ1bmN0aW9uKGQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGQoZSl9
-fShILkJwLGEpCmlmKHR5cGVvZiBhPT0ic3RyaW5nIil7aWYoYil0aHJvdyBILmIoIkNhbm5vdCBjb21w
-dXRlIHNpZ25hdHVyZSBmb3Igc3RhdGljIHRlYXJvZmYuIikKcz1jP0guUFc6SC5UbgpyZXR1cm4gZnVu
-Y3Rpb24oZCxlKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZSh0aGlzLGQpfX0oYSxzKX10aHJvdyBI
-LmIoIkVycm9yIGluIGZ1bmN0aW9uVHlwZSBvZiB0ZWFyb2ZmIil9LAp2cTpmdW5jdGlvbihhLGIsYyxk
-KXt2YXIgcz1ILkRWCnN3aXRjaChiPy0xOmEpe2Nhc2UgMDpyZXR1cm4gZnVuY3Rpb24oZSxmKXtyZXR1
-cm4gZnVuY3Rpb24oKXtyZXR1cm4gZih0aGlzKVtlXSgpfX0oYyxzKQpjYXNlIDE6cmV0dXJuIGZ1bmN0
-aW9uKGUsZil7cmV0dXJuIGZ1bmN0aW9uKGcpe3JldHVybiBmKHRoaXMpW2VdKGcpfX0oYyxzKQpjYXNl
-IDI6cmV0dXJuIGZ1bmN0aW9uKGUsZil7cmV0dXJuIGZ1bmN0aW9uKGcsaCl7cmV0dXJuIGYodGhpcylb
-ZV0oZyxoKX19KGMscykKY2FzZSAzOnJldHVybiBmdW5jdGlvbihlLGYpe3JldHVybiBmdW5jdGlvbihn
-LGgsaSl7cmV0dXJuIGYodGhpcylbZV0oZyxoLGkpfX0oYyxzKQpjYXNlIDQ6cmV0dXJuIGZ1bmN0aW9u
-KGUsZil7cmV0dXJuIGZ1bmN0aW9uKGcsaCxpLGope3JldHVybiBmKHRoaXMpW2VdKGcsaCxpLGopfX0o
-YyxzKQpjYXNlIDU6cmV0dXJuIGZ1bmN0aW9uKGUsZil7cmV0dXJuIGZ1bmN0aW9uKGcsaCxpLGosayl7
-cmV0dXJuIGYodGhpcylbZV0oZyxoLGksaixrKX19KGMscykKZGVmYXVsdDpyZXR1cm4gZnVuY3Rpb24o
-ZSxmKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZS5hcHBseShmKHRoaXMpLGFyZ3VtZW50cyl9fShk
-LHMpfX0sCmJ4OmZ1bmN0aW9uKGEsYixjKXt2YXIgcyxyLHEscCxvLG4sbQppZihjKXJldHVybiBILkhm
-KGEsYikKcz1iLiRzdHViTmFtZQpyPWIubGVuZ3RoCnE9YVtzXQpwPWI9PW51bGw/cT09bnVsbDpiPT09
-cQpvPSFwfHxyPj0yNwppZihvKXJldHVybiBILnZxKHIsIXAscyxiKQppZihyPT09MCl7cD0kLnlqCmlm
-KHR5cGVvZiBwIT09Im51bWJlciIpcmV0dXJuIHAuaCgpCiQueWo9cCsxCm49InNlbGYiK3AKcmV0dXJu
-IG5ldyBGdW5jdGlvbigicmV0dXJuIGZ1bmN0aW9uKCl7dmFyICIrbisiID0gdGhpcy4iK0guRWooSC5v
-TigpKSsiO3JldHVybiAiK24rIi4iK0guRWoocykrIigpO30iKSgpfW09ImFiY2RlZmdoaWprbG1ub3Bx
-cnN0dXZ3eHl6Ii5zcGxpdCgiIikuc3BsaWNlKDAscikuam9pbigiLCIpCnA9JC55agppZih0eXBlb2Yg
-cCE9PSJudW1iZXIiKXJldHVybiBwLmgoKQokLnlqPXArMQptKz1wCnJldHVybiBuZXcgRnVuY3Rpb24o
-InJldHVybiBmdW5jdGlvbigiK20rIil7cmV0dXJuIHRoaXMuIitILkVqKEgub04oKSkrIi4iK0guRWoo
-cykrIigiK20rIik7fSIpKCl9LApaNDpmdW5jdGlvbihhLGIsYyxkKXt2YXIgcz1ILkRWLHI9SC55Uwpz
-d2l0Y2goYj8tMTphKXtjYXNlIDA6dGhyb3cgSC5iKG5ldyBILkVxKCJJbnRlcmNlcHRlZCBmdW5jdGlv
-biB3aXRoIG5vIGFyZ3VtZW50cy4iKSkKY2FzZSAxOnJldHVybiBmdW5jdGlvbihlLGYsZyl7cmV0dXJu
-IGZ1bmN0aW9uKCl7cmV0dXJuIGYodGhpcylbZV0oZyh0aGlzKSl9fShjLHMscikKY2FzZSAyOnJldHVy
-biBmdW5jdGlvbihlLGYsZyl7cmV0dXJuIGZ1bmN0aW9uKGgpe3JldHVybiBmKHRoaXMpW2VdKGcodGhp
-cyksaCl9fShjLHMscikKY2FzZSAzOnJldHVybiBmdW5jdGlvbihlLGYsZyl7cmV0dXJuIGZ1bmN0aW9u
-KGgsaSl7cmV0dXJuIGYodGhpcylbZV0oZyh0aGlzKSxoLGkpfX0oYyxzLHIpCmNhc2UgNDpyZXR1cm4g
-ZnVuY3Rpb24oZSxmLGcpe3JldHVybiBmdW5jdGlvbihoLGksail7cmV0dXJuIGYodGhpcylbZV0oZyh0
-aGlzKSxoLGksail9fShjLHMscikKY2FzZSA1OnJldHVybiBmdW5jdGlvbihlLGYsZyl7cmV0dXJuIGZ1
-bmN0aW9uKGgsaSxqLGspe3JldHVybiBmKHRoaXMpW2VdKGcodGhpcyksaCxpLGosayl9fShjLHMscikK
-Y2FzZSA2OnJldHVybiBmdW5jdGlvbihlLGYsZyl7cmV0dXJuIGZ1bmN0aW9uKGgsaSxqLGssbCl7cmV0
-dXJuIGYodGhpcylbZV0oZyh0aGlzKSxoLGksaixrLGwpfX0oYyxzLHIpCmRlZmF1bHQ6cmV0dXJuIGZ1
-bmN0aW9uKGUsZixnLGgpe3JldHVybiBmdW5jdGlvbigpe2g9W2codGhpcyldCkFycmF5LnByb3RvdHlw
-ZS5wdXNoLmFwcGx5KGgsYXJndW1lbnRzKQpyZXR1cm4gZS5hcHBseShmKHRoaXMpLGgpfX0oZCxzLHIp
-fX0sCkhmOmZ1bmN0aW9uKGEsYil7dmFyIHMscixxLHAsbyxuLG09SC5vTigpLGw9JC5QNAppZihsPT1u
-dWxsKWw9JC5QND1ILkUyKCJyZWNlaXZlciIpCnM9Yi4kc3R1Yk5hbWUKcj1iLmxlbmd0aApxPWFbc10K
-cD1iPT1udWxsP3E9PW51bGw6Yj09PXEKbz0hcHx8cj49MjgKaWYobylyZXR1cm4gSC5aNChyLCFwLHMs
-YikKaWYocj09PTEpe3A9InJldHVybiBmdW5jdGlvbigpe3JldHVybiB0aGlzLiIrSC5FaihtKSsiLiIr
-SC5FaihzKSsiKHRoaXMuIitsKyIpOyIKbz0kLnlqCmlmKHR5cGVvZiBvIT09Im51bWJlciIpcmV0dXJu
-IG8uaCgpCiQueWo9bysxCnJldHVybiBuZXcgRnVuY3Rpb24ocCtvKyJ9IikoKX1uPSJhYmNkZWZnaGlq
-a2xtbm9wcXJzdHV2d3h5eiIuc3BsaXQoIiIpLnNwbGljZSgwLHItMSkuam9pbigiLCIpCnA9InJldHVy
-biBmdW5jdGlvbigiK24rIil7cmV0dXJuIHRoaXMuIitILkVqKG0pKyIuIitILkVqKHMpKyIodGhpcy4i
-K2wrIiwgIituKyIpOyIKbz0kLnlqCmlmKHR5cGVvZiBvIT09Im51bWJlciIpcmV0dXJuIG8uaCgpCiQu
-eWo9bysxCnJldHVybiBuZXcgRnVuY3Rpb24ocCtvKyJ9IikoKX0sCktxOmZ1bmN0aW9uKGEsYixjLGQs
-ZSxmLGcpe3JldHVybiBILmlBKGEsYixjLGQsISFlLCEhZixnKX0sClRuOmZ1bmN0aW9uKGEsYil7cmV0
-dXJuIEguY0Uodi50eXBlVW5pdmVyc2UsSC56KGEuYSksYil9LApQVzpmdW5jdGlvbihhLGIpe3JldHVy
-biBILmNFKHYudHlwZVVuaXZlcnNlLEgueihhLmMpLGIpfSwKRFY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEu
-YX0sCnlTOmZ1bmN0aW9uKGEpe3JldHVybiBhLmN9LApvTjpmdW5jdGlvbigpe3ZhciBzPSQubUoKcmV0
-dXJuIHM9PW51bGw/JC5tSj1ILkUyKCJzZWxmIik6c30sCkUyOmZ1bmN0aW9uKGEpe3ZhciBzLHIscSxw
-PW5ldyBILnJUKCJzZWxmIiwidGFyZ2V0IiwicmVjZWl2ZXIiLCJuYW1lIiksbz1KLkVwKE9iamVjdC5n
-ZXRPd25Qcm9wZXJ0eU5hbWVzKHApLHQuVykKZm9yKHM9by5sZW5ndGgscj0wO3I8czsrK3Ipe3E9b1ty
-XQppZihwW3FdPT09YSlyZXR1cm4gcX10aHJvdyBILmIoUC54WSgiRmllbGQgbmFtZSAiK2ErIiBub3Qg
-Zm91bmQuIikpfSwKb1Q6ZnVuY3Rpb24oYSl7aWYoYT09bnVsbClILmZPKCJib29sZWFuIGV4cHJlc3Np
-b24gbXVzdCBub3QgYmUgbnVsbCIpCnJldHVybiBhfSwKZk86ZnVuY3Rpb24oYSl7dGhyb3cgSC5iKG5l
-dyBILmtZKGEpKX0sCmFnOmZ1bmN0aW9uKGEpe3Rocm93IEguYihuZXcgUC5wKGEpKX0sCllnOmZ1bmN0
-aW9uKGEpe3JldHVybiB2LmdldElzb2xhdGVUYWcoYSl9LApCbzpmdW5jdGlvbihhKXtyZXR1cm4gSC52
-KEguYyhhKSl9LAppdzpmdW5jdGlvbihhLGIsYyl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGEsYix7dmFs
-dWU6YyxlbnVtZXJhYmxlOmZhbHNlLHdyaXRhYmxlOnRydWUsY29uZmlndXJhYmxlOnRydWV9KX0sCncz
-OmZ1bmN0aW9uKGEpe3ZhciBzLHIscSxwLG8sbj1ILmgoJC5ORi4kMShhKSksbT0kLm53W25dCmlmKG0h
-PW51bGwpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShhLHYuZGlzcGF0Y2hQcm9wZXJ0eU5hbWUse3ZhbHVl
-Om0sZW51bWVyYWJsZTpmYWxzZSx3cml0YWJsZTp0cnVlLGNvbmZpZ3VyYWJsZTp0cnVlfSkKcmV0dXJu
-IG0uaX1zPSQudnZbbl0KaWYocyE9bnVsbClyZXR1cm4gcwpyPXYuaW50ZXJjZXB0b3JzQnlUYWdbbl0K
-aWYocj09bnVsbCl7cT1ILmsoJC5UWC4kMihhLG4pKQppZihxIT1udWxsKXttPSQubndbcV0KaWYobSE9
-bnVsbCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGEsdi5kaXNwYXRjaFByb3BlcnR5TmFtZSx7dmFsdWU6
-bSxlbnVtZXJhYmxlOmZhbHNlLHdyaXRhYmxlOnRydWUsY29uZmlndXJhYmxlOnRydWV9KQpyZXR1cm4g
-bS5pfXM9JC52dltxXQppZihzIT1udWxsKXJldHVybiBzCnI9di5pbnRlcmNlcHRvcnNCeVRhZ1txXQpu
-PXF9fWlmKHI9PW51bGwpcmV0dXJuIG51bGwKcz1yLnByb3RvdHlwZQpwPW5bMF0KaWYocD09PSIhIil7
-bT1ILlZhKHMpCiQubndbbl09bQpPYmplY3QuZGVmaW5lUHJvcGVydHkoYSx2LmRpc3BhdGNoUHJvcGVy
-dHlOYW1lLHt2YWx1ZTptLGVudW1lcmFibGU6ZmFsc2Usd3JpdGFibGU6dHJ1ZSxjb25maWd1cmFibGU6
-dHJ1ZX0pCnJldHVybiBtLml9aWYocD09PSJ+Iil7JC52dltuXT1zCnJldHVybiBzfWlmKHA9PT0iLSIp
-e289SC5WYShzKQpPYmplY3QuZGVmaW5lUHJvcGVydHkoT2JqZWN0LmdldFByb3RvdHlwZU9mKGEpLHYu
-ZGlzcGF0Y2hQcm9wZXJ0eU5hbWUse3ZhbHVlOm8sZW51bWVyYWJsZTpmYWxzZSx3cml0YWJsZTp0cnVl
-LGNvbmZpZ3VyYWJsZTp0cnVlfSkKcmV0dXJuIG8uaX1pZihwPT09IisiKXJldHVybiBILkxjKGEscykK
-aWYocD09PSIqIil0aHJvdyBILmIoUC5TWShuKSkKaWYodi5sZWFmVGFnc1tuXT09PXRydWUpe289SC5W
-YShzKQpPYmplY3QuZGVmaW5lUHJvcGVydHkoT2JqZWN0LmdldFByb3RvdHlwZU9mKGEpLHYuZGlzcGF0
-Y2hQcm9wZXJ0eU5hbWUse3ZhbHVlOm8sZW51bWVyYWJsZTpmYWxzZSx3cml0YWJsZTp0cnVlLGNvbmZp
-Z3VyYWJsZTp0cnVlfSkKcmV0dXJuIG8uaX1lbHNlIHJldHVybiBILkxjKGEscyl9LApMYzpmdW5jdGlv
-bihhLGIpe3ZhciBzPU9iamVjdC5nZXRQcm90b3R5cGVPZihhKQpPYmplY3QuZGVmaW5lUHJvcGVydHko
-cyx2LmRpc3BhdGNoUHJvcGVydHlOYW1lLHt2YWx1ZTpKLlF1KGIscyxudWxsLG51bGwpLGVudW1lcmFi
-bGU6ZmFsc2Usd3JpdGFibGU6dHJ1ZSxjb25maWd1cmFibGU6dHJ1ZX0pCnJldHVybiBifSwKVmE6ZnVu
-Y3Rpb24oYSl7cmV0dXJuIEouUXUoYSwhMSxudWxsLCEhYS4kaVhqKX0sClZGOmZ1bmN0aW9uKGEsYixj
-KXt2YXIgcz1iLnByb3RvdHlwZQppZih2LmxlYWZUYWdzW2FdPT09dHJ1ZSlyZXR1cm4gSC5WYShzKQpl
-bHNlIHJldHVybiBKLlF1KHMsYyxudWxsLG51bGwpfSwKWEQ6ZnVuY3Rpb24oKXtpZighMD09PSQuQnYp
-cmV0dXJuCiQuQnY9ITAKSC5aMSgpfSwKWjE6ZnVuY3Rpb24oKXt2YXIgcyxyLHEscCxvLG4sbSxsCiQu
-bnc9T2JqZWN0LmNyZWF0ZShudWxsKQokLnZ2PU9iamVjdC5jcmVhdGUobnVsbCkKSC5rTygpCnM9di5p
-bnRlcmNlcHRvcnNCeVRhZwpyPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHMpCmlmKHR5cGVvZiB3
-aW5kb3chPSJ1bmRlZmluZWQiKXt3aW5kb3cKcT1mdW5jdGlvbigpe30KZm9yKHA9MDtwPHIubGVuZ3Ro
-OysrcCl7bz1yW3BdCm49JC54Ny4kMShvKQppZihuIT1udWxsKXttPUguVkYobyxzW29dLG4pCmlmKG0h
-PW51bGwpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShuLHYuZGlzcGF0Y2hQcm9wZXJ0eU5hbWUse3ZhbHVl
-Om0sZW51bWVyYWJsZTpmYWxzZSx3cml0YWJsZTp0cnVlLGNvbmZpZ3VyYWJsZTp0cnVlfSkKcS5wcm90
-b3R5cGU9bn19fX1mb3IocD0wO3A8ci5sZW5ndGg7KytwKXtvPXJbcF0KaWYoL15bQS1aYS16X10vLnRl
-c3Qobykpe2w9c1tvXQpzWyIhIitvXT1sCnNbIn4iK29dPWwKc1siLSIrb109bApzWyIrIitvXT1sCnNb
-IioiK29dPWx9fX0sCmtPOmZ1bmN0aW9uKCl7dmFyIHMscixxLHAsbyxuLG09Qy5ZcSgpCm09SC51ZChD
-LktVLEgudWQoQy5mUSxILnVkKEMuaTcsSC51ZChDLmk3LEgudWQoQy54aSxILnVkKEMuZGssSC51ZChD
-LndiKEMuTzQpLG0pKSkpKSkpCmlmKHR5cGVvZiBkYXJ0TmF0aXZlRGlzcGF0Y2hIb29rc1RyYW5zZm9y
-bWVyIT0idW5kZWZpbmVkIil7cz1kYXJ0TmF0aXZlRGlzcGF0Y2hIb29rc1RyYW5zZm9ybWVyCmlmKHR5
-cGVvZiBzPT0iZnVuY3Rpb24iKXM9W3NdCmlmKHMuY29uc3RydWN0b3I9PUFycmF5KWZvcihyPTA7cjxz
-Lmxlbmd0aDsrK3Ipe3E9c1tyXQppZih0eXBlb2YgcT09ImZ1bmN0aW9uIiltPXEobSl8fG19fXA9bS5n
-ZXRUYWcKbz1tLmdldFVua25vd25UYWcKbj1tLnByb3RvdHlwZUZvclRhZwokLk5GPW5ldyBILmRDKHAp
-CiQuVFg9bmV3IEgud04obykKJC54Nz1uZXcgSC5WWChuKX0sCnVkOmZ1bmN0aW9uKGEsYil7cmV0dXJu
-IGEoYil8fGJ9LAp2NDpmdW5jdGlvbihhLGIsYyxkLGUsZil7dmFyIHM9Yj8ibSI6IiIscj1jPyIiOiJp
-IixxPWQ/InUiOiIiLHA9ZT8icyI6IiIsbz1mPyJnIjoiIixuPWZ1bmN0aW9uKGcsaCl7dHJ5e3JldHVy
-biBuZXcgUmVnRXhwKGcsaCl9Y2F0Y2gobSl7cmV0dXJuIG19fShhLHMrcitxK3ArbykKaWYobiBpbnN0
-YW5jZW9mIFJlZ0V4cClyZXR1cm4gbgp0aHJvdyBILmIoUC5ycigiSWxsZWdhbCBSZWdFeHAgcGF0dGVy
-biAoIitTdHJpbmcobikrIikiLGEsbnVsbCkpfSwKbTI6ZnVuY3Rpb24oYSxiLGMpe3ZhciBzCmlmKHR5
-cGVvZiBiPT0ic3RyaW5nIilyZXR1cm4gYS5pbmRleE9mKGIsYyk+PTAKZWxzZSBpZihiIGluc3RhbmNl
-b2YgSC5WUil7cz1DLnhCLkcoYSxjKQpyZXR1cm4gYi5iLnRlc3Qocyl9ZWxzZXtzPUouRkwoYixDLnhC
-LkcoYSxjKSkKcmV0dXJuIXMuZ2wwKHMpfX0sCkE0OmZ1bmN0aW9uKGEpe2lmKGEuaW5kZXhPZigiJCIs
-MCk+PTApcmV0dXJuIGEucmVwbGFjZSgvXCQvZywiJCQkJCIpCnJldHVybiBhfSwKZUE6ZnVuY3Rpb24o
-YSl7aWYoL1tbXF17fSgpKis/LlxcXiR8XS8udGVzdChhKSlyZXR1cm4gYS5yZXBsYWNlKC9bW1xde30o
-KSorPy5cXF4kfF0vZywiXFwkJiIpCnJldHVybiBhfSwKeXM6ZnVuY3Rpb24oYSxiLGMpe3ZhciBzPUgu
-bk0oYSxiLGMpCnJldHVybiBzfSwKbk06ZnVuY3Rpb24oYSxiLGMpe3ZhciBzLHIscSxwCmlmKGI9PT0i
-Iil7aWYoYT09PSIiKXJldHVybiBjCnM9YS5sZW5ndGgKZm9yKHI9YyxxPTA7cTxzOysrcSlyPXIrYVtx
-XStjCnJldHVybiByLmNoYXJDb2RlQXQoMCk9PTA/cjpyfXA9YS5pbmRleE9mKGIsMCkKaWYocDwwKXJl
-dHVybiBhCmlmKGEubGVuZ3RoPDUwMHx8Yy5pbmRleE9mKCIkIiwwKT49MClyZXR1cm4gYS5zcGxpdChi
-KS5qb2luKGMpCnJldHVybiBhLnJlcGxhY2UobmV3IFJlZ0V4cChILmVBKGIpLCdnJyksSC5BNChjKSl9
-LApQRDpmdW5jdGlvbiBQRChhLGIpe3RoaXMuYT1hCnRoaXMuJHRpPWJ9LApXVTpmdW5jdGlvbiBXVSgp
-e30sCkxQOmZ1bmN0aW9uIExQKGEsYixjLGQpe3ZhciBfPXRoaXMKXy5hPWEKXy5iPWIKXy5jPWMKXy4k
-dGk9ZH0sClhSOmZ1bmN0aW9uIFhSKGEsYil7dGhpcy5hPWEKdGhpcy4kdGk9Yn0sCkxJOmZ1bmN0aW9u
-IExJKGEsYixjLGQsZSl7dmFyIF89dGhpcwpfLmE9YQpfLmM9YgpfLmQ9YwpfLmU9ZApfLmY9ZX0sCkNq
-OmZ1bmN0aW9uIENqKGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9Y30sCmY5OmZ1bmN0aW9u
-IGY5KGEsYixjLGQsZSxmKXt2YXIgXz10aGlzCl8uYT1hCl8uYj1iCl8uYz1jCl8uZD1kCl8uZT1lCl8u
-Zj1mfSwKVzA6ZnVuY3Rpb24gVzAoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCmF6OmZ1bmN0aW9uIGF6
-KGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9Y30sCnZWOmZ1bmN0aW9uIHZWKGEpe3RoaXMu
-YT1hfSwKdGU6ZnVuY3Rpb24gdGUoYSl7dGhpcy5hPWF9LApicTpmdW5jdGlvbiBicShhLGIpe3RoaXMu
-YT1hCnRoaXMuYj1ifSwKWE86ZnVuY3Rpb24gWE8oYSl7dGhpcy5hPWEKdGhpcy5iPW51bGx9LApUcDpm
-dW5jdGlvbiBUcCgpe30sCmxjOmZ1bmN0aW9uIGxjKCl7fSwKeng6ZnVuY3Rpb24gengoKXt9LApyVDpm
-dW5jdGlvbiByVChhLGIsYyxkKXt2YXIgXz10aGlzCl8uYT1hCl8uYj1iCl8uYz1jCl8uZD1kfSwKRXE6
-ZnVuY3Rpb24gRXEoYSl7dGhpcy5hPWF9LAprWTpmdW5jdGlvbiBrWShhKXt0aGlzLmE9YX0sCmtyOmZ1
-bmN0aW9uIGtyKCl7fSwKTjU6ZnVuY3Rpb24gTjUoYSl7dmFyIF89dGhpcwpfLmE9MApfLmY9Xy5lPV8u
-ZD1fLmM9Xy5iPW51bGwKXy5yPTAKXy4kdGk9YX0sCnZoOmZ1bmN0aW9uIHZoKGEsYil7dmFyIF89dGhp
-cwpfLmE9YQpfLmI9YgpfLmQ9Xy5jPW51bGx9LAppNTpmdW5jdGlvbiBpNShhLGIpe3RoaXMuYT1hCnRo
-aXMuJHRpPWJ9LApONjpmdW5jdGlvbiBONihhLGIsYyl7dmFyIF89dGhpcwpfLmE9YQpfLmI9YgpfLmQ9
-Xy5jPW51bGwKXy4kdGk9Y30sCmRDOmZ1bmN0aW9uIGRDKGEpe3RoaXMuYT1hfSwKd046ZnVuY3Rpb24g
-d04oYSl7dGhpcy5hPWF9LApWWDpmdW5jdGlvbiBWWChhKXt0aGlzLmE9YX0sClZSOmZ1bmN0aW9uIFZS
-KGEsYil7dmFyIF89dGhpcwpfLmE9YQpfLmI9YgpfLmQ9Xy5jPW51bGx9LApFSzpmdW5jdGlvbiBFSyhh
-KXt0aGlzLmI9YX0sCktXOmZ1bmN0aW9uIEtXKGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9
-Y30sClBiOmZ1bmN0aW9uIFBiKGEsYixjKXt2YXIgXz10aGlzCl8uYT1hCl8uYj1iCl8uYz1jCl8uZD1u
-dWxsfSwKdFE6ZnVuY3Rpb24gdFEoYSxiKXt0aGlzLmE9YQp0aGlzLmM9Yn0sCnVuOmZ1bmN0aW9uIHVu
-KGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9Y30sClNkOmZ1bmN0aW9uIFNkKGEsYixjKXt2
-YXIgXz10aGlzCl8uYT1hCl8uYj1iCl8uYz1jCl8uZD1udWxsfSwKWEY6ZnVuY3Rpb24oYSl7cmV0dXJu
-IGF9LApvZDpmdW5jdGlvbihhLGIsYyl7aWYoYT4+PjAhPT1hfHxhPj1jKXRocm93IEguYihILkhZKGIs
-YSkpfSwKck06ZnVuY3Rpb24oYSxiLGMpe3ZhciBzCmlmKCEoYT4+PjAhPT1hKSlzPWI+Pj4wIT09Ynx8
-YT5ifHxiPmMKZWxzZSBzPSEwCmlmKHMpdGhyb3cgSC5iKEguYXUoYSxiLGMpKQpyZXR1cm4gYn0sCkVU
-OmZ1bmN0aW9uIEVUKCl7fSwKWEg6ZnVuY3Rpb24gWEgoKXt9LApEZzpmdW5jdGlvbiBEZygpe30sClBn
-OmZ1bmN0aW9uIFBnKCl7fSwKeGo6ZnVuY3Rpb24geGooKXt9LApkRTpmdW5jdGlvbiBkRSgpe30sClpB
-OmZ1bmN0aW9uIFpBKCl7fSwKZFQ6ZnVuY3Rpb24gZFQoKXt9LApQcTpmdW5jdGlvbiBQcSgpe30sCmVF
-OmZ1bmN0aW9uIGVFKCl7fSwKVjY6ZnVuY3Rpb24gVjYoKXt9LApSRzpmdW5jdGlvbiBSRygpe30sClZQ
-OmZ1bmN0aW9uIFZQKCl7fSwKV0I6ZnVuY3Rpb24gV0IoKXt9LApaRzpmdW5jdGlvbiBaRygpe30sCmN6
-OmZ1bmN0aW9uKGEsYil7dmFyIHM9Yi5jCnJldHVybiBzPT1udWxsP2IuYz1ILkIoYSxiLnosITApOnN9
-LAp4WjpmdW5jdGlvbihhLGIpe3ZhciBzPWIuYwpyZXR1cm4gcz09bnVsbD9iLmM9SC5KKGEsImI4Iixb
-Yi56XSk6c30sClExOmZ1bmN0aW9uKGEpe3ZhciBzPWEueQppZihzPT09Nnx8cz09PTd8fHM9PT04KXJl
-dHVybiBILlExKGEueikKcmV0dXJuIHM9PT0xMXx8cz09PTEyfSwKbUQ6ZnVuY3Rpb24oYSl7cmV0dXJu
-IGEuY3l9LApOMDpmdW5jdGlvbihhKXtyZXR1cm4gSC5FKHYudHlwZVVuaXZlcnNlLGEsITEpfSwKUEw6
-ZnVuY3Rpb24oYSxiLGEwLGExKXt2YXIgcyxyLHEscCxvLG4sbSxsLGssaixpLGgsZyxmLGUsZCxjPWIu
-eQpzd2l0Y2goYyl7Y2FzZSA1OmNhc2UgMTpjYXNlIDI6Y2FzZSAzOmNhc2UgNDpyZXR1cm4gYgpjYXNl
-IDY6cz1iLnoKcj1ILlBMKGEscyxhMCxhMSkKaWYocj09PXMpcmV0dXJuIGIKcmV0dXJuIEguQyhhLHIs
-ITApCmNhc2UgNzpzPWIuegpyPUguUEwoYSxzLGEwLGExKQppZihyPT09cylyZXR1cm4gYgpyZXR1cm4g
-SC5CKGEsciwhMCkKY2FzZSA4OnM9Yi56CnI9SC5QTChhLHMsYTAsYTEpCmlmKHI9PT1zKXJldHVybiBi
-CnJldHVybiBILmYoYSxyLCEwKQpjYXNlIDk6cT1iLlEKcD1ILmJaKGEscSxhMCxhMSkKaWYocD09PXEp
-cmV0dXJuIGIKcmV0dXJuIEguSihhLGIueixwKQpjYXNlIDEwOm89Yi56Cm49SC5QTChhLG8sYTAsYTEp
-Cm09Yi5RCmw9SC5iWihhLG0sYTAsYTEpCmlmKG49PT1vJiZsPT09bSlyZXR1cm4gYgpyZXR1cm4gSC5h
-KGEsbixsKQpjYXNlIDExOms9Yi56Cmo9SC5QTChhLGssYTAsYTEpCmk9Yi5RCmg9SC5xVChhLGksYTAs
-YTEpCmlmKGo9PT1rJiZoPT09aSlyZXR1cm4gYgpyZXR1cm4gSC5kKGEsaixoKQpjYXNlIDEyOmc9Yi5R
-CmExKz1nLmxlbmd0aApmPUguYlooYSxnLGEwLGExKQpvPWIuegpuPUguUEwoYSxvLGEwLGExKQppZihm
-PT09ZyYmbj09PW8pcmV0dXJuIGIKcmV0dXJuIEguRChhLG4sZiwhMCkKY2FzZSAxMzplPWIuegppZihl
-PGExKXJldHVybiBiCmQ9YTBbZS1hMV0KaWYoZD09bnVsbClyZXR1cm4gYgpyZXR1cm4gZApkZWZhdWx0
-OnRocm93IEguYihQLmhWKCJBdHRlbXB0ZWQgdG8gc3Vic3RpdHV0ZSB1bmV4cGVjdGVkIFJUSSBraW5k
-ICIrYykpfX0sCmJaOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBzLHIscSxwLG89Yi5sZW5ndGgsbj1bXQpm
-b3Iocz0hMSxyPTA7cjxvOysrcil7cT1iW3JdCnA9SC5QTChhLHEsYyxkKQppZihwIT09cSlzPSEwCm4u
-cHVzaChwKX1yZXR1cm4gcz9uOmJ9LAp2TzpmdW5jdGlvbihhLGIsYyxkKXt2YXIgcyxyLHEscCxvLG4s
-bT1iLmxlbmd0aCxsPVtdCmZvcihzPSExLHI9MDtyPG07cis9Myl7cT1iW3JdCnA9YltyKzFdCm89Ylty
-KzJdCm49SC5QTChhLG8sYyxkKQppZihuIT09bylzPSEwCmwucHVzaChxKQpsLnB1c2gocCkKbC5wdXNo
-KG4pfXJldHVybiBzP2w6Yn0sCnFUOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBzLHI9Yi5hLHE9SC5iWihh
-LHIsYyxkKSxwPWIuYixvPUguYlooYSxwLGMsZCksbj1iLmMsbT1ILnZPKGEsbixjLGQpCmlmKHE9PT1y
-JiZvPT09cCYmbT09PW4pcmV0dXJuIGIKcz1uZXcgSC5HKCkKcy5hPXEKcy5iPW8Kcy5jPW0KcmV0dXJu
-IHN9LApWTTpmdW5jdGlvbihhLGIpe2Fbdi5hcnJheVJ0aV09YgpyZXR1cm4gYX0sCkpTOmZ1bmN0aW9u
-KGEpe3ZhciBzPWEuJFMKaWYocyE9bnVsbCl7aWYodHlwZW9mIHM9PSJudW1iZXIiKXJldHVybiBILkJw
-KHMpCnJldHVybiBhLiRTKCl9cmV0dXJuIG51bGx9LApVZTpmdW5jdGlvbihhLGIpe3ZhciBzCmlmKEgu
-UTEoYikpaWYoYSBpbnN0YW5jZW9mIEguVHApe3M9SC5KUyhhKQppZihzIT1udWxsKXJldHVybiBzfXJl
-dHVybiBILnooYSl9LAp6OmZ1bmN0aW9uKGEpe3ZhciBzCmlmKGEgaW5zdGFuY2VvZiBQLk1oKXtzPWEu
-JHRpCnJldHVybiBzIT1udWxsP3M6SC5WVShhKX1pZihBcnJheS5pc0FycmF5KGEpKXJldHVybiBILnQ2
-KGEpCnJldHVybiBILlZVKEouaWEoYSkpfSwKdDY6ZnVuY3Rpb24oYSl7dmFyIHM9YVt2LmFycmF5UnRp
-XSxyPXQueAppZihzPT1udWxsKXJldHVybiByCmlmKHMuY29uc3RydWN0b3IhPT1yLmNvbnN0cnVjdG9y
-KXJldHVybiByCnJldHVybiBzfSwKTGg6ZnVuY3Rpb24oYSl7dmFyIHM9YS4kdGkKcmV0dXJuIHMhPW51
-bGw/czpILlZVKGEpfSwKVlU6ZnVuY3Rpb24oYSl7dmFyIHM9YS5jb25zdHJ1Y3RvcixyPXMuJGNjYWNo
-ZQppZihyIT1udWxsKXJldHVybiByCnJldHVybiBILnI5KGEscyl9LApyOTpmdW5jdGlvbihhLGIpe3Zh
-ciBzPWEgaW5zdGFuY2VvZiBILlRwP2EuX19wcm90b19fLl9fcHJvdG9fXy5jb25zdHJ1Y3RvcjpiLHI9
-SC5haSh2LnR5cGVVbml2ZXJzZSxzLm5hbWUpCmIuJGNjYWNoZT1yCnJldHVybiByfSwKQnA6ZnVuY3Rp
-b24oYSl7dmFyIHMscixxCkgudVAoYSkKcz12LnR5cGVzCnI9c1thXQppZih0eXBlb2Ygcj09InN0cmlu
-ZyIpe3E9SC5FKHYudHlwZVVuaXZlcnNlLHIsITEpCnNbYV09cQpyZXR1cm4gcX1yZXR1cm4gcn0sCkpK
-OmZ1bmN0aW9uKGEpe3ZhciBzLHIscT10aGlzLHA9dC5LCmlmKHE9PT1wKXJldHVybiBILlJFKHEsYSxI
-LmtlKQppZighSC5BOChxKSlpZighKHE9PT10Ll8pKXA9cT09PXAKZWxzZSBwPSEwCmVsc2UgcD0hMApp
-ZihwKXJldHVybiBILlJFKHEsYSxILkl3KQpwPXEueQpzPXA9PT02P3EuejpxCmlmKHM9PT10LlMpcj1I
-Lm9rCmVsc2UgaWYocz09PXQuZ1J8fHM9PT10LmRpKXI9SC5LSAplbHNlIGlmKHM9PT10Lk4pcj1ILk1N
-CmVsc2Ugcj1zPT09dC55P0gubDpudWxsCmlmKHIhPW51bGwpcmV0dXJuIEguUkUocSxhLHIpCmlmKHMu
-eT09PTkpe3A9cy56CmlmKHMuUS5ldmVyeShILmNjKSl7cS5yPSIkaSIrcApyZXR1cm4gSC5SRShxLGEs
-SC50NCl9fWVsc2UgaWYocD09PTcpcmV0dXJuIEguUkUocSxhLEguQVEpCnJldHVybiBILlJFKHEsYSxI
-LllPKX0sClJFOmZ1bmN0aW9uKGEsYixjKXthLmI9YwpyZXR1cm4gYS5iKGIpfSwKQXU6ZnVuY3Rpb24o
-YSl7dmFyIHMscixxPXRoaXMKaWYoIUguQTgocSkpaWYoIShxPT09dC5fKSlzPXE9PT10LksKZWxzZSBz
-PSEwCmVsc2Ugcz0hMAppZihzKXI9SC5obgplbHNlIGlmKHE9PT10Lkspcj1ILlRpCmVsc2Ugcj1ILmw0
-CnEuYT1yCnJldHVybiBxLmEoYSl9LApRajpmdW5jdGlvbihhKXt2YXIgcyxyPWEueQppZighSC5BOChh
-KSlpZighKGE9PT10Ll8pKXM9YT09PXQuSwplbHNlIHM9ITAKZWxzZSBzPSEwCnJldHVybiBzfHxhPT09
-dC5jRnx8cj09PTd8fGE9PT10LlB8fGE9PT10LlR9LApZTzpmdW5jdGlvbihhKXt2YXIgcz10aGlzCmlm
-KGE9PW51bGwpcmV0dXJuIEguUWoocykKcmV0dXJuIEguV2Uodi50eXBlVW5pdmVyc2UsSC5VZShhLHMp
-LG51bGwscyxudWxsKX0sCkFROmZ1bmN0aW9uKGEpe2lmKGE9PW51bGwpcmV0dXJuITAKcmV0dXJuIHRo
-aXMuei5iKGEpfSwKdDQ6ZnVuY3Rpb24oYSl7dmFyIHMscj10aGlzCmlmKGE9PW51bGwpcmV0dXJuIEgu
-UWoocikKcz1yLnIKaWYoYSBpbnN0YW5jZW9mIFAuTWgpcmV0dXJuISFhW3NdCnJldHVybiEhSi5pYShh
-KVtzXX0sCk96OmZ1bmN0aW9uKGEpe3ZhciBzPXRoaXMKaWYoYT09bnVsbClyZXR1cm4gYQplbHNlIGlm
-KHMuYihhKSlyZXR1cm4gYQpILm00KGEscyl9LApsNDpmdW5jdGlvbihhKXt2YXIgcz10aGlzCmlmKGE9
-PW51bGwpcmV0dXJuIGEKZWxzZSBpZihzLmIoYSkpcmV0dXJuIGEKSC5tNChhLHMpfSwKbTQ6ZnVuY3Rp
-b24oYSxiKXt0aHJvdyBILmIoSC5aYyhILldLKGEsSC5VZShhLGIpLEguZG0oYixudWxsKSkpKX0sCkRo
-OmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBzPW51bGwKaWYoSC5XZSh2LnR5cGVVbml2ZXJzZSxhLHMsYixz
-KSlyZXR1cm4gYQp0aHJvdyBILmIoSC5aYygiVGhlIHR5cGUgYXJndW1lbnQgJyIrSC5FaihILmRtKGEs
-cykpKyInIGlzIG5vdCBhIHN1YnR5cGUgb2YgdGhlIHR5cGUgdmFyaWFibGUgYm91bmQgJyIrSC5FaihI
-LmRtKGIscykpKyInIG9mIHR5cGUgdmFyaWFibGUgJyIrSC5FaihjKSsiJyBpbiAnIitILkVqKGQpKyIn
-LiIpKX0sCldLOmZ1bmN0aW9uKGEsYixjKXt2YXIgcz1QLmhsKGEpLHI9SC5kbShiPT1udWxsP0gueihh
-KTpiLG51bGwpCnJldHVybiBzKyI6IHR5cGUgJyIrSC5FaihyKSsiJyBpcyBub3QgYSBzdWJ0eXBlIG9m
-IHR5cGUgJyIrSC5FaihjKSsiJyJ9LApaYzpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IEguaU0oIlR5cGVF
-cnJvcjogIithKX0sCnE6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbmV3IEguaU0oIlR5cGVFcnJvcjogIitI
-LldLKGEsbnVsbCxiKSl9LAprZTpmdW5jdGlvbihhKXtyZXR1cm4gYSE9bnVsbH0sClRpOmZ1bmN0aW9u
-KGEpe3JldHVybiBhfSwKSXc6ZnVuY3Rpb24oYSl7cmV0dXJuITB9LApobjpmdW5jdGlvbihhKXtyZXR1
-cm4gYX0sCmw6ZnVuY3Rpb24oYSl7cmV0dXJuITA9PT1hfHwhMT09PWF9LApwODpmdW5jdGlvbihhKXtp
-ZighMD09PWEpcmV0dXJuITAKaWYoITE9PT1hKXJldHVybiExCnRocm93IEguYihILnEoYSwiYm9vbCIp
-KX0sCnk4OmZ1bmN0aW9uKGEpe2lmKCEwPT09YSlyZXR1cm4hMAppZighMT09PWEpcmV0dXJuITEKaWYo
-YT09bnVsbClyZXR1cm4gYQp0aHJvdyBILmIoSC5xKGEsImJvb2wiKSl9LApkcDpmdW5jdGlvbihhKXtp
-ZighMD09PWEpcmV0dXJuITAKaWYoITE9PT1hKXJldHVybiExCmlmKGE9PW51bGwpcmV0dXJuIGEKdGhy
-b3cgSC5iKEgucShhLCJib29sPyIpKX0sCkZHOmZ1bmN0aW9uKGEpe2lmKHR5cGVvZiBhPT0ibnVtYmVy
-IilyZXR1cm4gYQp0aHJvdyBILmIoSC5xKGEsImRvdWJsZSIpKX0sCkdIOmZ1bmN0aW9uKGEpe2lmKHR5
-cGVvZiBhPT0ibnVtYmVyIilyZXR1cm4gYQppZihhPT1udWxsKXJldHVybiBhCnRocm93IEguYihILnEo
-YSwiZG91YmxlIikpfSwKUWs6ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGE9PSJudW1iZXIiKXJldHVybiBh
-CmlmKGE9PW51bGwpcmV0dXJuIGEKdGhyb3cgSC5iKEgucShhLCJkb3VibGU/IikpfSwKb2s6ZnVuY3Rp
-b24oYSl7cmV0dXJuIHR5cGVvZiBhPT0ibnVtYmVyIiYmTWF0aC5mbG9vcihhKT09PWF9LApJWjpmdW5j
-dGlvbihhKXtpZih0eXBlb2YgYT09Im51bWJlciImJk1hdGguZmxvb3IoYSk9PT1hKXJldHVybiBhCnRo
-cm93IEguYihILnEoYSwiaW50IikpfSwKdVA6ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGE9PSJudW1iZXIi
-JiZNYXRoLmZsb29yKGEpPT09YSlyZXR1cm4gYQppZihhPT1udWxsKXJldHVybiBhCnRocm93IEguYihI
-LnEoYSwiaW50IikpfSwKVWM6ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGE9PSJudW1iZXIiJiZNYXRoLmZs
-b29yKGEpPT09YSlyZXR1cm4gYQppZihhPT1udWxsKXJldHVybiBhCnRocm93IEguYihILnEoYSwiaW50
-PyIpKX0sCktIOmZ1bmN0aW9uKGEpe3JldHVybiB0eXBlb2YgYT09Im51bWJlciJ9LAp6NTpmdW5jdGlv
-bihhKXtpZih0eXBlb2YgYT09Im51bWJlciIpcmV0dXJuIGEKdGhyb3cgSC5iKEgucShhLCJudW0iKSl9
-LApXMTpmdW5jdGlvbihhKXtpZih0eXBlb2YgYT09Im51bWJlciIpcmV0dXJuIGEKaWYoYT09bnVsbCly
-ZXR1cm4gYQp0aHJvdyBILmIoSC5xKGEsIm51bSIpKX0sCmNVOmZ1bmN0aW9uKGEpe2lmKHR5cGVvZiBh
-PT0ibnVtYmVyIilyZXR1cm4gYQppZihhPT1udWxsKXJldHVybiBhCnRocm93IEguYihILnEoYSwibnVt
-PyIpKX0sCk1NOmZ1bmN0aW9uKGEpe3JldHVybiB0eXBlb2YgYT09InN0cmluZyJ9LApCdDpmdW5jdGlv
-bihhKXtpZih0eXBlb2YgYT09InN0cmluZyIpcmV0dXJuIGEKdGhyb3cgSC5iKEgucShhLCJTdHJpbmci
-KSl9LApoOmZ1bmN0aW9uKGEpe2lmKHR5cGVvZiBhPT0ic3RyaW5nIilyZXR1cm4gYQppZihhPT1udWxs
-KXJldHVybiBhCnRocm93IEguYihILnEoYSwiU3RyaW5nIikpfSwKazpmdW5jdGlvbihhKXtpZih0eXBl
-b2YgYT09InN0cmluZyIpcmV0dXJuIGEKaWYoYT09bnVsbClyZXR1cm4gYQp0aHJvdyBILmIoSC5xKGEs
-IlN0cmluZz8iKSl9LAppbzpmdW5jdGlvbihhLGIpe3ZhciBzLHIscQpmb3Iocz0iIixyPSIiLHE9MDtx
-PGEubGVuZ3RoOysrcSxyPSIsICIpcys9Qy54Qi5oKHIsSC5kbShhW3FdLGIpKQpyZXR1cm4gc30sCmJJ
-OmZ1bmN0aW9uKGE1LGE2LGE3KXt2YXIgcyxyLHEscCxvLG4sbSxsLGssaixpLGgsZyxmLGUsZCxjLGIs
-YSxhMCxhMSxhMixhMyxhND0iLCAiCmlmKGE3IT1udWxsKXtzPWE3Lmxlbmd0aAppZihhNj09bnVsbCl7
-YTY9SC5WTShbXSx0LnMpCnI9bnVsbH1lbHNlIHI9YTYubGVuZ3RoCnE9YTYubGVuZ3RoCmZvcihwPXM7
-cD4wOy0tcClDLk5tLmkoYTYsIlQiKyhxK3ApKQpmb3Iobz10Llcsbj10Ll8sbT10LkssbD0iPCIsaz0i
-IixwPTA7cDxzOysrcCxrPWE0KXtsKz1rCmo9YTYubGVuZ3RoCmk9ai0xLXAKaWYoaTwwKXJldHVybiBI
-Lk9IKGE2LGkpCmw9Qy54Qi5oKGwsYTZbaV0pCmg9YTdbcF0KZz1oLnkKaWYoIShnPT09Mnx8Zz09PTN8
-fGc9PT00fHxnPT09NXx8aD09PW8pKWlmKCEoaD09PW4pKWo9aD09PW0KZWxzZSBqPSEwCmVsc2Ugaj0h
-MAppZighailsKz1DLnhCLmgoIiBleHRlbmRzICIsSC5kbShoLGE2KSl9bCs9Ij4ifWVsc2V7bD0iIgpy
-PW51bGx9bz1hNS56CmY9YTUuUQplPWYuYQpkPWUubGVuZ3RoCmM9Zi5iCmI9Yy5sZW5ndGgKYT1mLmMK
-YTA9YS5sZW5ndGgKYTE9SC5kbShvLGE2KQpmb3IoYTI9IiIsYTM9IiIscD0wO3A8ZDsrK3AsYTM9YTQp
-YTIrPUMueEIuaChhMyxILmRtKGVbcF0sYTYpKQppZihiPjApe2EyKz1hMysiWyIKZm9yKGEzPSIiLHA9
-MDtwPGI7KytwLGEzPWE0KWEyKz1DLnhCLmgoYTMsSC5kbShjW3BdLGE2KSkKYTIrPSJdIn1pZihhMD4w
-KXthMis9YTMrInsiCmZvcihhMz0iIixwPTA7cDxhMDtwKz0zLGEzPWE0KXthMis9YTMKaWYoYVtwKzFd
-KWEyKz0icmVxdWlyZWQgIgphMis9Si5iYihILmRtKGFbcCsyXSxhNiksIiAiKSthW3BdfWEyKz0ifSJ9
-aWYociE9bnVsbCl7YTYudG9TdHJpbmcKYTYubGVuZ3RoPXJ9cmV0dXJuIGwrIigiK2EyKyIpID0+ICIr
-SC5FaihhMSl9LApkbTpmdW5jdGlvbihhLGIpe3ZhciBzLHIscSxwLG8sbixtLGw9YS55CmlmKGw9PT01
-KXJldHVybiJlcmFzZWQiCmlmKGw9PT0yKXJldHVybiJkeW5hbWljIgppZihsPT09MylyZXR1cm4idm9p
-ZCIKaWYobD09PTEpcmV0dXJuIk5ldmVyIgppZihsPT09NClyZXR1cm4iYW55IgppZihsPT09Nil7cz1I
-LmRtKGEueixiKQpyZXR1cm4gc31pZihsPT09Nyl7cj1hLnoKcz1ILmRtKHIsYikKcT1yLnkKcmV0dXJu
-IEouYmIocT09PTExfHxxPT09MTI/Qy54Qi5oKCIoIixzKSsiKSI6cywiPyIpfWlmKGw9PT04KXJldHVy
-biJGdXR1cmVPcjwiK0guRWooSC5kbShhLnosYikpKyI+IgppZihsPT09OSl7cD1ILm8zKGEueikKbz1h
-LlEKcmV0dXJuIG8ubGVuZ3RoIT09MD9wKygiPCIrSC5pbyhvLGIpKyI+Iik6cH1pZihsPT09MTEpcmV0
-dXJuIEguYkkoYSxiLG51bGwpCmlmKGw9PT0xMilyZXR1cm4gSC5iSShhLnosYixhLlEpCmlmKGw9PT0x
-Myl7Yi50b1N0cmluZwpuPWEuegptPWIubGVuZ3RoCm49bS0xLW4KaWYobjwwfHxuPj1tKXJldHVybiBI
-Lk9IKGIsbikKcmV0dXJuIGJbbl19cmV0dXJuIj8ifSwKbzM6ZnVuY3Rpb24oYSl7dmFyIHMscj1ILkpn
-KGEpCmlmKHIhPW51bGwpcmV0dXJuIHIKcz0ibWluaWZpZWQ6IithCnJldHVybiBzfSwKUW86ZnVuY3Rp
-b24oYSxiKXt2YXIgcz1hLnRSW2JdCmZvcig7dHlwZW9mIHM9PSJzdHJpbmciOylzPWEudFJbc10KcmV0
-dXJuIHN9LAphaTpmdW5jdGlvbihhLGIpe3ZhciBzLHIscSxwLG8sbj1hLmVULG09bltiXQppZihtPT1u
-dWxsKXJldHVybiBILkUoYSxiLCExKQplbHNlIGlmKHR5cGVvZiBtPT0ibnVtYmVyIil7cz1tCnI9SC5t
-KGEsNSwiIyIpCnE9W10KZm9yKHA9MDtwPHM7KytwKXEucHVzaChyKQpvPUguSihhLGIscSkKbltiXT1v
-CnJldHVybiBvfWVsc2UgcmV0dXJuIG19LAp4YjpmdW5jdGlvbihhLGIpe3JldHVybiBILkl4KGEudFIs
-Yil9LApGRjpmdW5jdGlvbihhLGIpe3JldHVybiBILkl4KGEuZVQsYil9LApFOmZ1bmN0aW9uKGEsYixj
-KXt2YXIgcyxyPWEuZUMscT1yLmdldChiKQppZihxIT1udWxsKXJldHVybiBxCnM9SC5pKEgubyhhLG51
-bGwsYixjKSkKci5zZXQoYixzKQpyZXR1cm4gc30sCmNFOmZ1bmN0aW9uKGEsYixjKXt2YXIgcyxyLHE9
-Yi5jaAppZihxPT1udWxsKXE9Yi5jaD1uZXcgTWFwKCkKcz1xLmdldChjKQppZihzIT1udWxsKXJldHVy
-biBzCnI9SC5pKEgubyhhLGIsYywhMCkpCnEuc2V0KGMscikKcmV0dXJuIHJ9LAp2NTpmdW5jdGlvbihh
-LGIsYyl7dmFyIHMscixxLHA9Yi5jeAppZihwPT1udWxsKXA9Yi5jeD1uZXcgTWFwKCkKcz1jLmN5CnI9
-cC5nZXQocykKaWYociE9bnVsbClyZXR1cm4gcgpxPUguYShhLGIsYy55PT09MTA/Yy5ROltjXSkKcC5z
-ZXQocyxxKQpyZXR1cm4gcX0sCkJEOmZ1bmN0aW9uKGEsYil7Yi5hPUguQXUKYi5iPUguSkoKcmV0dXJu
-IGJ9LAptOmZ1bmN0aW9uKGEsYixjKXt2YXIgcyxyLHE9YS5lQy5nZXQoYykKaWYocSE9bnVsbClyZXR1
-cm4gcQpzPW5ldyBILkpjKG51bGwsbnVsbCkKcy55PWIKcy5jeT1jCnI9SC5CRChhLHMpCmEuZUMuc2V0
-KGMscikKcmV0dXJuIHJ9LApDOmZ1bmN0aW9uKGEsYixjKXt2YXIgcyxyPWIuY3krIioiLHE9YS5lQy5n
-ZXQocikKaWYocSE9bnVsbClyZXR1cm4gcQpzPUguWjcoYSxiLHIsYykKYS5lQy5zZXQocixzKQpyZXR1
-cm4gc30sClo3OmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBzLHIscQppZihkKXtzPWIueQppZighSC5BOChi
-KSlyPWI9PT10LlB8fGI9PT10LlR8fHM9PT03fHxzPT09NgplbHNlIHI9ITAKaWYocilyZXR1cm4gYn1x
-PW5ldyBILkpjKG51bGwsbnVsbCkKcS55PTYKcS56PWIKcS5jeT1jCnJldHVybiBILkJEKGEscSl9LApC
-OmZ1bmN0aW9uKGEsYixjKXt2YXIgcyxyPWIuY3krIj8iLHE9YS5lQy5nZXQocikKaWYocSE9bnVsbCly
-ZXR1cm4gcQpzPUgubGwoYSxiLHIsYykKYS5lQy5zZXQocixzKQpyZXR1cm4gc30sCmxsOmZ1bmN0aW9u
-KGEsYixjLGQpe3ZhciBzLHIscSxwCmlmKGQpe3M9Yi55CmlmKCFILkE4KGIpKWlmKCEoYj09PXQuUHx8
-Yj09PXQuVCkpaWYocyE9PTcpcj1zPT09OCYmSC5sUihiLnopCmVsc2Ugcj0hMAplbHNlIHI9ITAKZWxz
-ZSByPSEwCmlmKHIpcmV0dXJuIGIKZWxzZSBpZihzPT09MXx8Yj09PXQuY0YpcmV0dXJuIHQuUAplbHNl
-IGlmKHM9PT02KXtxPWIuegppZihxLnk9PT04JiZILmxSKHEueikpcmV0dXJuIHEKZWxzZSByZXR1cm4g
-SC5jeihhLGIpfX1wPW5ldyBILkpjKG51bGwsbnVsbCkKcC55PTcKcC56PWIKcC5jeT1jCnJldHVybiBI
-LkJEKGEscCl9LApmOmZ1bmN0aW9uKGEsYixjKXt2YXIgcyxyPWIuY3krIi8iLHE9YS5lQy5nZXQocikK
-aWYocSE9bnVsbClyZXR1cm4gcQpzPUguZVYoYSxiLHIsYykKYS5lQy5zZXQocixzKQpyZXR1cm4gc30s
-CmVWOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBzLHIscQppZihkKXtzPWIueQppZighSC5BOChiKSlpZigh
-KGI9PT10Ll8pKXI9Yj09PXQuSwplbHNlIHI9ITAKZWxzZSByPSEwCmlmKHJ8fGI9PT10LkspcmV0dXJu
-IGIKZWxzZSBpZihzPT09MSlyZXR1cm4gSC5KKGEsImI4IixbYl0pCmVsc2UgaWYoYj09PXQuUHx8Yj09
-PXQuVClyZXR1cm4gdC5iR31xPW5ldyBILkpjKG51bGwsbnVsbCkKcS55PTgKcS56PWIKcS5jeT1jCnJl
-dHVybiBILkJEKGEscSl9LApIOmZ1bmN0aW9uKGEsYil7dmFyIHMscixxPSIiK2IrIl4iLHA9YS5lQy5n
-ZXQocSkKaWYocCE9bnVsbClyZXR1cm4gcApzPW5ldyBILkpjKG51bGwsbnVsbCkKcy55PTEzCnMuej1i
-CnMuY3k9cQpyPUguQkQoYSxzKQphLmVDLnNldChxLHIpCnJldHVybiByfSwKVXg6ZnVuY3Rpb24oYSl7
-dmFyIHMscixxLHA9YS5sZW5ndGgKZm9yKHM9IiIscj0iIixxPTA7cTxwOysrcSxyPSIsIilzKz1yK2Fb
-cV0uY3kKcmV0dXJuIHN9LApTNDpmdW5jdGlvbihhKXt2YXIgcyxyLHEscCxvLG4sbT1hLmxlbmd0aApm
-b3Iocz0iIixyPSIiLHE9MDtxPG07cSs9MyxyPSIsIil7cD1hW3FdCm89YVtxKzFdPyIhIjoiOiIKbj1h
-W3ErMl0uY3kKcys9citwK28rbn1yZXR1cm4gc30sCko6ZnVuY3Rpb24oYSxiLGMpe3ZhciBzLHIscSxw
-PWIKaWYoYy5sZW5ndGghPT0wKXArPSI8IitILlV4KGMpKyI+IgpzPWEuZUMuZ2V0KHApCmlmKHMhPW51
-bGwpcmV0dXJuIHMKcj1uZXcgSC5KYyhudWxsLG51bGwpCnIueT05CnIuej1iCnIuUT1jCmlmKGMubGVu
-Z3RoPjApci5jPWNbMF0Kci5jeT1wCnE9SC5CRChhLHIpCmEuZUMuc2V0KHAscSkKcmV0dXJuIHF9LAph
-OmZ1bmN0aW9uKGEsYixjKXt2YXIgcyxyLHEscCxvLG4KaWYoYi55PT09MTApe3M9Yi56CnI9Yi5RLmNv
-bmNhdChjKX1lbHNle3I9YwpzPWJ9cT1zLmN5KygiOzwiK0guVXgocikrIj4iKQpwPWEuZUMuZ2V0KHEp
-CmlmKHAhPW51bGwpcmV0dXJuIHAKbz1uZXcgSC5KYyhudWxsLG51bGwpCm8ueT0xMApvLno9cwpvLlE9
-cgpvLmN5PXEKbj1ILkJEKGEsbykKYS5lQy5zZXQocSxuKQpyZXR1cm4gbn0sCmQ6ZnVuY3Rpb24oYSxi
-LGMpe3ZhciBzLHIscSxwLG8sbj1iLmN5LG09Yy5hLGw9bS5sZW5ndGgsaz1jLmIsaj1rLmxlbmd0aCxp
-PWMuYyxoPWkubGVuZ3RoLGc9IigiK0guVXgobSkKaWYoaj4wKXtzPWw+MD8iLCI6IiIKcj1ILlV4KGsp
-CmcrPXMrIlsiK3IrIl0ifWlmKGg+MCl7cz1sPjA/IiwiOiIiCnI9SC5TNChpKQpnKz1zKyJ7IityKyJ9
-In1xPW4rKGcrIikiKQpwPWEuZUMuZ2V0KHEpCmlmKHAhPW51bGwpcmV0dXJuIHAKbz1uZXcgSC5KYyhu
-dWxsLG51bGwpCm8ueT0xMQpvLno9YgpvLlE9YwpvLmN5PXEKcj1ILkJEKGEsbykKYS5lQy5zZXQocSxy
-KQpyZXR1cm4gcn0sCkQ6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHMscj1iLmN5KygiPCIrSC5VeChjKSsi
-PiIpLHE9YS5lQy5nZXQocikKaWYocSE9bnVsbClyZXR1cm4gcQpzPUguaHcoYSxiLGMscixkKQphLmVD
-LnNldChyLHMpCnJldHVybiBzfSwKaHc6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgcyxyLHEscCxvLG4s
-bSxsCmlmKGUpe3M9Yy5sZW5ndGgKcj1uZXcgQXJyYXkocykKZm9yKHE9MCxwPTA7cDxzOysrcCl7bz1j
-W3BdCmlmKG8ueT09PTEpe3JbcF09bzsrK3F9fWlmKHE+MCl7bj1ILlBMKGEsYixyLDApCm09SC5iWihh
-LGMsciwwKQpyZXR1cm4gSC5EKGEsbixtLGMhPT1tKX19bD1uZXcgSC5KYyhudWxsLG51bGwpCmwueT0x
-MgpsLno9YgpsLlE9YwpsLmN5PWQKcmV0dXJuIEguQkQoYSxsKX0sCm86ZnVuY3Rpb24oYSxiLGMsZCl7
-cmV0dXJue3U6YSxlOmIscjpjLHM6W10scDowLG46ZH19LAppOmZ1bmN0aW9uKGEpe3ZhciBzLHIscSxw
-LG8sbixtLGwsayxqLGksaCxnPWEucixmPWEucwpmb3Iocz1nLmxlbmd0aCxyPTA7cjxzOyl7cT1nLmNo
-YXJDb2RlQXQocikKaWYocT49NDgmJnE8PTU3KXI9SC5BKHIrMSxxLGcsZikKZWxzZSBpZigoKChxfDMy
-KT4+PjApLTk3JjY1NTM1KTwyNnx8cT09PTk1fHxxPT09MzYpcj1ILnQoYSxyLGcsZiwhMSkKZWxzZSBp
-ZihxPT09NDYpcj1ILnQoYSxyLGcsZiwhMCkKZWxzZXsrK3IKc3dpdGNoKHEpe2Nhc2UgNDQ6YnJlYWsK
-Y2FzZSA1ODpmLnB1c2goITEpCmJyZWFrCmNhc2UgMzM6Zi5wdXNoKCEwKQpicmVhawpjYXNlIDU5OmYu
-cHVzaChILksoYS51LGEuZSxmLnBvcCgpKSkKYnJlYWsKY2FzZSA5NDpmLnB1c2goSC5IKGEudSxmLnBv
-cCgpKSkKYnJlYWsKY2FzZSAzNTpmLnB1c2goSC5tKGEudSw1LCIjIikpCmJyZWFrCmNhc2UgNjQ6Zi5w
-dXNoKEgubShhLnUsMiwiQCIpKQpicmVhawpjYXNlIDEyNjpmLnB1c2goSC5tKGEudSwzLCJ+IikpCmJy
-ZWFrCmNhc2UgNjA6Zi5wdXNoKGEucCkKYS5wPWYubGVuZ3RoCmJyZWFrCmNhc2UgNjI6cD1hLnUKbz1m
-LnNwbGljZShhLnApCkgucihhLnUsYS5lLG8pCmEucD1mLnBvcCgpCm49Zi5wb3AoKQppZih0eXBlb2Yg
-bj09InN0cmluZyIpZi5wdXNoKEguSihwLG4sbykpCmVsc2V7bT1ILksocCxhLmUsbikKc3dpdGNoKG0u
-eSl7Y2FzZSAxMTpmLnB1c2goSC5EKHAsbSxvLGEubikpCmJyZWFrCmRlZmF1bHQ6Zi5wdXNoKEguYShw
-LG0sbykpCmJyZWFrfX1icmVhawpjYXNlIDM4OkguSShhLGYpCmJyZWFrCmNhc2UgNDI6bD1hLnUKZi5w
-dXNoKEguQyhsLEguSyhsLGEuZSxmLnBvcCgpKSxhLm4pKQpicmVhawpjYXNlIDYzOmw9YS51CmYucHVz
-aChILkIobCxILksobCxhLmUsZi5wb3AoKSksYS5uKSkKYnJlYWsKY2FzZSA0NzpsPWEudQpmLnB1c2go
-SC5mKGwsSC5LKGwsYS5lLGYucG9wKCkpLGEubikpCmJyZWFrCmNhc2UgNDA6Zi5wdXNoKGEucCkKYS5w
-PWYubGVuZ3RoCmJyZWFrCmNhc2UgNDE6cD1hLnUKaz1uZXcgSC5HKCkKaj1wLnNFQQppPXAuc0VBCm49
-Zi5wb3AoKQppZih0eXBlb2Ygbj09Im51bWJlciIpc3dpdGNoKG4pe2Nhc2UtMTpqPWYucG9wKCkKYnJl
-YWsKY2FzZS0yOmk9Zi5wb3AoKQpicmVhawpkZWZhdWx0OmYucHVzaChuKQpicmVha31lbHNlIGYucHVz
-aChuKQpvPWYuc3BsaWNlKGEucCkKSC5yKGEudSxhLmUsbykKYS5wPWYucG9wKCkKay5hPW8Kay5iPWoK
-ay5jPWkKZi5wdXNoKEguZChwLEguSyhwLGEuZSxmLnBvcCgpKSxrKSkKYnJlYWsKY2FzZSA5MTpmLnB1
-c2goYS5wKQphLnA9Zi5sZW5ndGgKYnJlYWsKY2FzZSA5MzpvPWYuc3BsaWNlKGEucCkKSC5yKGEudSxh
-LmUsbykKYS5wPWYucG9wKCkKZi5wdXNoKG8pCmYucHVzaCgtMSkKYnJlYWsKY2FzZSAxMjM6Zi5wdXNo
-KGEucCkKYS5wPWYubGVuZ3RoCmJyZWFrCmNhc2UgMTI1Om89Zi5zcGxpY2UoYS5wKQpILnkoYS51LGEu
-ZSxvKQphLnA9Zi5wb3AoKQpmLnB1c2gobykKZi5wdXNoKC0yKQpicmVhawpkZWZhdWx0OnRocm93IkJh
-ZCBjaGFyYWN0ZXIgIitxfX19aD1mLnBvcCgpCnJldHVybiBILksoYS51LGEuZSxoKX0sCkE6ZnVuY3Rp
-b24oYSxiLGMsZCl7dmFyIHMscixxPWItNDgKZm9yKHM9Yy5sZW5ndGg7YTxzOysrYSl7cj1jLmNoYXJD
-b2RlQXQoYSkKaWYoIShyPj00OCYmcjw9NTcpKWJyZWFrCnE9cSoxMCsoci00OCl9ZC5wdXNoKHEpCnJl
-dHVybiBhfSwKdDpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBzLHIscSxwLG8sbixtPWIrMQpmb3Iocz1j
-Lmxlbmd0aDttPHM7KyttKXtyPWMuY2hhckNvZGVBdChtKQppZihyPT09NDYpe2lmKGUpYnJlYWsKZT0h
-MH1lbHNle2lmKCEoKCgocnwzMik+Pj4wKS05NyY2NTUzNSk8MjZ8fHI9PT05NXx8cj09PTM2KSlxPXI+
-PTQ4JiZyPD01NwplbHNlIHE9ITAKaWYoIXEpYnJlYWt9fXA9Yy5zdWJzdHJpbmcoYixtKQppZihlKXtz
-PWEudQpvPWEuZQppZihvLnk9PT0xMClvPW8uegpuPUguUW8ocyxvLnopW3BdCmlmKG49PW51bGwpSC52
-KCdObyAiJytwKyciIGluICInK0gubUQobykrJyInKQpkLnB1c2goSC5jRShzLG8sbikpfWVsc2UgZC5w
-dXNoKHApCnJldHVybiBtfSwKSTpmdW5jdGlvbihhLGIpe3ZhciBzPWIucG9wKCkKaWYoMD09PXMpe2Iu
-cHVzaChILm0oYS51LDEsIjAmIikpCnJldHVybn1pZigxPT09cyl7Yi5wdXNoKEgubShhLnUsNCwiMSYi
-KSkKcmV0dXJufXRocm93IEguYihQLmhWKCJVbmV4cGVjdGVkIGV4dGVuZGVkIG9wZXJhdGlvbiAiK0gu
-RWoocykpKX0sCks6ZnVuY3Rpb24oYSxiLGMpe2lmKHR5cGVvZiBjPT0ic3RyaW5nIilyZXR1cm4gSC5K
-KGEsYyxhLnNFQSkKZWxzZSBpZih0eXBlb2YgYz09Im51bWJlciIpcmV0dXJuIEguVFYoYSxiLGMpCmVs
-c2UgcmV0dXJuIGN9LApyOmZ1bmN0aW9uKGEsYixjKXt2YXIgcyxyPWMubGVuZ3RoCmZvcihzPTA7czxy
-OysrcyljW3NdPUguSyhhLGIsY1tzXSl9LAp5OmZ1bmN0aW9uKGEsYixjKXt2YXIgcyxyPWMubGVuZ3Ro
-CmZvcihzPTI7czxyO3MrPTMpY1tzXT1ILksoYSxiLGNbc10pfSwKVFY6ZnVuY3Rpb24oYSxiLGMpe3Zh
-ciBzLHIscT1iLnkKaWYocT09PTEwKXtpZihjPT09MClyZXR1cm4gYi56CnM9Yi5RCnI9cy5sZW5ndGgK
-aWYoYzw9cilyZXR1cm4gc1tjLTFdCmMtPXIKYj1iLnoKcT1iLnl9ZWxzZSBpZihjPT09MClyZXR1cm4g
-YgppZihxIT09OSl0aHJvdyBILmIoUC5oVigiSW5kZXhlZCBiYXNlIG11c3QgYmUgYW4gaW50ZXJmYWNl
-IHR5cGUiKSkKcz1iLlEKaWYoYzw9cy5sZW5ndGgpcmV0dXJuIHNbYy0xXQp0aHJvdyBILmIoUC5oVigi
-QmFkIGluZGV4ICIrYysiIGZvciAiK2IudygwKSkpfSwKV2U6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIg
-cyxyLHEscCxvLG4sbSxsLGssagppZihiPT09ZClyZXR1cm4hMAppZighSC5BOChkKSlpZighKGQ9PT10
-Ll8pKXM9ZD09PXQuSwplbHNlIHM9ITAKZWxzZSBzPSEwCmlmKHMpcmV0dXJuITAKcj1iLnkKaWYocj09
-PTQpcmV0dXJuITAKaWYoSC5BOChiKSlyZXR1cm4hMQppZihiLnkhPT0xKXM9Yj09PXQuUHx8Yj09PXQu
-VAplbHNlIHM9ITAKaWYocylyZXR1cm4hMApxPXI9PT0xMwppZihxKWlmKEguV2UoYSxjW2Iuel0sYyxk
-LGUpKXJldHVybiEwCnA9ZC55CmlmKHI9PT02KXJldHVybiBILldlKGEsYi56LGMsZCxlKQppZihwPT09
-Nil7cz1kLnoKcmV0dXJuIEguV2UoYSxiLGMscyxlKX1pZihyPT09OCl7aWYoIUguV2UoYSxiLnosYyxk
-LGUpKXJldHVybiExCnJldHVybiBILldlKGEsSC54WihhLGIpLGMsZCxlKX1pZihyPT09Nyl7cz1ILldl
-KGEsYi56LGMsZCxlKQpyZXR1cm4gc31pZihwPT09OCl7aWYoSC5XZShhLGIsYyxkLnosZSkpcmV0dXJu
-ITAKcmV0dXJuIEguV2UoYSxiLGMsSC54WihhLGQpLGUpfWlmKHA9PT03KXtzPUguV2UoYSxiLGMsZC56
-LGUpCnJldHVybiBzfWlmKHEpcmV0dXJuITEKcz1yIT09MTEKaWYoKCFzfHxyPT09MTIpJiZkPT09dC5Z
-KXJldHVybiEwCmlmKHA9PT0xMil7aWYoYj09PXQuRClyZXR1cm4hMAppZihyIT09MTIpcmV0dXJuITEK
-bz1iLlEKbj1kLlEKbT1vLmxlbmd0aAppZihtIT09bi5sZW5ndGgpcmV0dXJuITEKYz1jPT1udWxsP286
-by5jb25jYXQoYykKZT1lPT1udWxsP246bi5jb25jYXQoZSkKZm9yKGw9MDtsPG07KytsKXtrPW9bbF0K
-aj1uW2xdCmlmKCFILldlKGEsayxjLGosZSl8fCFILldlKGEsaixlLGssYykpcmV0dXJuITF9cmV0dXJu
-IEguYk8oYSxiLnosYyxkLnosZSl9aWYocD09PTExKXtpZihiPT09dC5EKXJldHVybiEwCmlmKHMpcmV0
-dXJuITEKcmV0dXJuIEguYk8oYSxiLGMsZCxlKX1pZihyPT09OSl7aWYocCE9PTkpcmV0dXJuITEKcmV0
-dXJuIEgucEcoYSxiLGMsZCxlKX1yZXR1cm4hMX0sCmJPOmZ1bmN0aW9uKGEyLGEzLGE0LGE1LGE2KXt2
-YXIgcyxyLHEscCxvLG4sbSxsLGssaixpLGgsZyxmLGUsZCxjLGIsYSxhMCxhMQppZighSC5XZShhMixh
-My56LGE0LGE1LnosYTYpKXJldHVybiExCnM9YTMuUQpyPWE1LlEKcT1zLmEKcD1yLmEKbz1xLmxlbmd0
-aApuPXAubGVuZ3RoCmlmKG8+bilyZXR1cm4hMQptPW4tbwpsPXMuYgprPXIuYgpqPWwubGVuZ3RoCmk9
-ay5sZW5ndGgKaWYobytqPG4raSlyZXR1cm4hMQpmb3IoaD0wO2g8bzsrK2gpe2c9cVtoXQppZighSC5X
-ZShhMixwW2hdLGE2LGcsYTQpKXJldHVybiExfWZvcihoPTA7aDxtOysraCl7Zz1sW2hdCmlmKCFILldl
-KGEyLHBbbytoXSxhNixnLGE0KSlyZXR1cm4hMX1mb3IoaD0wO2g8aTsrK2gpe2c9bFttK2hdCmlmKCFI
-LldlKGEyLGtbaF0sYTYsZyxhNCkpcmV0dXJuITF9Zj1zLmMKZT1yLmMKZD1mLmxlbmd0aApjPWUubGVu
-Z3RoCmZvcihiPTAsYT0wO2E8YzthKz0zKXthMD1lW2FdCmZvcig7ITA7KXtpZihiPj1kKXJldHVybiEx
-CmExPWZbYl0KYis9MwppZihhMDxhMSlyZXR1cm4hMQppZihhMTxhMCljb250aW51ZQpnPWZbYi0xXQpp
-ZighSC5XZShhMixlW2ErMl0sYTYsZyxhNCkpcmV0dXJuITEKYnJlYWt9fXJldHVybiEwfSwKcEc6ZnVu
-Y3Rpb24oYSxiLGMsZCxlKXt2YXIgcyxyLHEscCxvLG4sbSxsLGs9Yi56LGo9ZC56CmlmKGs9PT1qKXtz
-PWIuUQpyPWQuUQpxPXMubGVuZ3RoCmZvcihwPTA7cDxxOysrcCl7bz1zW3BdCm49cltwXQppZighSC5X
-ZShhLG8sYyxuLGUpKXJldHVybiExfXJldHVybiEwfWlmKGQ9PT10LkspcmV0dXJuITAKbT1ILlFvKGEs
-aykKaWYobT09bnVsbClyZXR1cm4hMQpsPW1bal0KaWYobD09bnVsbClyZXR1cm4hMQpxPWwubGVuZ3Ro
-CnI9ZC5RCmZvcihwPTA7cDxxOysrcClpZighSC5XZShhLEguY0UoYSxiLGxbcF0pLGMscltwXSxlKSly
-ZXR1cm4hMQpyZXR1cm4hMH0sCmxSOmZ1bmN0aW9uKGEpe3ZhciBzLHI9YS55CmlmKCEoYT09PXQuUHx8
-YT09PXQuVCkpaWYoIUguQTgoYSkpaWYociE9PTcpaWYoIShyPT09NiYmSC5sUihhLnopKSlzPXI9PT04
-JiZILmxSKGEueikKZWxzZSBzPSEwCmVsc2Ugcz0hMAplbHNlIHM9ITAKZWxzZSBzPSEwCnJldHVybiBz
-fSwKY2M6ZnVuY3Rpb24oYSl7dmFyIHMKaWYoIUguQTgoYSkpaWYoIShhPT09dC5fKSlzPWE9PT10LksK
-ZWxzZSBzPSEwCmVsc2Ugcz0hMApyZXR1cm4gc30sCkE4OmZ1bmN0aW9uKGEpe3ZhciBzPWEueQpyZXR1
-cm4gcz09PTJ8fHM9PT0zfHxzPT09NHx8cz09PTV8fGE9PT10Lld9LApJeDpmdW5jdGlvbihhLGIpe3Zh
-ciBzLHIscT1PYmplY3Qua2V5cyhiKSxwPXEubGVuZ3RoCmZvcihzPTA7czxwOysrcyl7cj1xW3NdCmFb
-cl09YltyXX19LApKYzpmdW5jdGlvbiBKYyhhLGIpe3ZhciBfPXRoaXMKXy5hPWEKXy5iPWIKXy54PV8u
-cj1fLmM9bnVsbApfLnk9MApfLmN5PV8uY3g9Xy5jaD1fLlE9Xy56PW51bGx9LApHOmZ1bmN0aW9uIEco
-KXt0aGlzLmM9dGhpcy5iPXRoaXMuYT1udWxsfSwKa1M6ZnVuY3Rpb24ga1MoKXt9LAppTTpmdW5jdGlv
-biBpTShhKXt0aGlzLmE9YX0sClI5OmZ1bmN0aW9uKGEpe3JldHVybiB0LncuYihhKXx8dC5CLmIoYSl8
-fHQuZHouYihhKXx8dC5JLmIoYSl8fHQuQS5iKGEpfHx0Lmc0LmIoYSl8fHQuZzIuYihhKX0sCkpnOmZ1
-bmN0aW9uKGEpe3JldHVybiB2Lm1hbmdsZWRHbG9iYWxOYW1lc1thXX19LEo9ewpRdTpmdW5jdGlvbihh
-LGIsYyxkKXtyZXR1cm57aTphLHA6YixlOmMseDpkfX0sCmtzOmZ1bmN0aW9uKGEpe3ZhciBzLHIscSxw
-LG89YVt2LmRpc3BhdGNoUHJvcGVydHlOYW1lXQppZihvPT1udWxsKWlmKCQuQnY9PW51bGwpe0guWEQo
-KQpvPWFbdi5kaXNwYXRjaFByb3BlcnR5TmFtZV19aWYobyE9bnVsbCl7cz1vLnAKaWYoITE9PT1zKXJl
-dHVybiBvLmkKaWYoITA9PT1zKXJldHVybiBhCnI9T2JqZWN0LmdldFByb3RvdHlwZU9mKGEpCmlmKHM9
-PT1yKXJldHVybiBvLmkKaWYoby5lPT09cil0aHJvdyBILmIoUC5TWSgiUmV0dXJuIGludGVyY2VwdG9y
-IGZvciAiK0guRWoocyhhLG8pKSkpfXE9YS5jb25zdHJ1Y3RvcgpwPXE9PW51bGw/bnVsbDpxW0ouUlAo
-KV0KaWYocCE9bnVsbClyZXR1cm4gcApwPUgudzMoYSkKaWYocCE9bnVsbClyZXR1cm4gcAppZih0eXBl
-b2YgYT09ImZ1bmN0aW9uIilyZXR1cm4gQy5ERwpzPU9iamVjdC5nZXRQcm90b3R5cGVPZihhKQppZihz
-PT1udWxsKXJldHVybiBDLlpRCmlmKHM9PT1PYmplY3QucHJvdG90eXBlKXJldHVybiBDLlpRCmlmKHR5
-cGVvZiBxPT0iZnVuY3Rpb24iKXtPYmplY3QuZGVmaW5lUHJvcGVydHkocSxKLlJQKCkse3ZhbHVlOkMu
-dkIsZW51bWVyYWJsZTpmYWxzZSx3cml0YWJsZTp0cnVlLGNvbmZpZ3VyYWJsZTp0cnVlfSkKcmV0dXJu
-IEMudkJ9cmV0dXJuIEMudkJ9LApSUDpmdW5jdGlvbigpe3ZhciBzPSQuem0KcmV0dXJuIHM9PW51bGw/
-JC56bT12LmdldElzb2xhdGVUYWcoIl8kZGFydF9qcyIpOnN9LApRaTpmdW5jdGlvbihhLGIpe2lmKGE8
-MHx8YT40Mjk0OTY3Mjk1KXRocm93IEguYihQLlRFKGEsMCw0Mjk0OTY3Mjk1LCJsZW5ndGgiLG51bGwp
-KQpyZXR1cm4gSi5weShuZXcgQXJyYXkoYSksYil9LApLaDpmdW5jdGlvbihhLGIpe2lmKGE8MCl0aHJv
-dyBILmIoUC54WSgiTGVuZ3RoIG11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlcjogIithKSkKcmV0
-dXJuIEguVk0obmV3IEFycmF5KGEpLGIuQygiamQ8MD4iKSl9LApweTpmdW5jdGlvbihhLGIpe3JldHVy
-biBKLkVwKEguVk0oYSxiLkMoImpkPDA+IikpLGIpfSwKRXA6ZnVuY3Rpb24oYSxiKXthLmZpeGVkJGxl
-bmd0aD1BcnJheQpyZXR1cm4gYX0sCnpDOmZ1bmN0aW9uKGEpe2EuZml4ZWQkbGVuZ3RoPUFycmF5CmEu
-aW1tdXRhYmxlJGxpc3Q9QXJyYXkKcmV0dXJuIGF9LApHYTpmdW5jdGlvbihhKXtpZihhPDI1Nilzd2l0
-Y2goYSl7Y2FzZSA5OmNhc2UgMTA6Y2FzZSAxMTpjYXNlIDEyOmNhc2UgMTM6Y2FzZSAzMjpjYXNlIDEz
-MzpjYXNlIDE2MDpyZXR1cm4hMApkZWZhdWx0OnJldHVybiExfXN3aXRjaChhKXtjYXNlIDU3NjA6Y2Fz
-ZSA4MTkyOmNhc2UgODE5MzpjYXNlIDgxOTQ6Y2FzZSA4MTk1OmNhc2UgODE5NjpjYXNlIDgxOTc6Y2Fz
-ZSA4MTk4OmNhc2UgODE5OTpjYXNlIDgyMDA6Y2FzZSA4MjAxOmNhc2UgODIwMjpjYXNlIDgyMzI6Y2Fz
-ZSA4MjMzOmNhc2UgODIzOTpjYXNlIDgyODc6Y2FzZSAxMjI4ODpjYXNlIDY1Mjc5OnJldHVybiEwCmRl
-ZmF1bHQ6cmV0dXJuITF9fSwKbW06ZnVuY3Rpb24oYSxiKXt2YXIgcyxyCmZvcihzPWEubGVuZ3RoO2I8
-czspe3I9Qy54Qi5XKGEsYikKaWYociE9PTMyJiZyIT09MTMmJiFKLkdhKHIpKWJyZWFrOysrYn1yZXR1
-cm4gYn0sCmMxOmZ1bmN0aW9uKGEsYil7dmFyIHMscgpmb3IoO2I+MDtiPXMpe3M9Yi0xCnI9Qy54Qi5t
-KGEscykKaWYociE9PTMyJiZyIT09MTMmJiFKLkdhKHIpKWJyZWFrfXJldHVybiBifSwKVEo6ZnVuY3Rp
-b24oYSl7aWYodHlwZW9mIGE9PSJudW1iZXIiKXJldHVybiBKLnFJLnByb3RvdHlwZQppZih0eXBlb2Yg
-YT09InN0cmluZyIpcmV0dXJuIEouRHIucHJvdG90eXBlCmlmKGE9PW51bGwpcmV0dXJuIGEKaWYoYS5j
-b25zdHJ1Y3Rvcj09QXJyYXkpcmV0dXJuIEouamQucHJvdG90eXBlCmlmKHR5cGVvZiBhIT0ib2JqZWN0
-Iil7aWYodHlwZW9mIGE9PSJmdW5jdGlvbiIpcmV0dXJuIEouYzUucHJvdG90eXBlCnJldHVybiBhfWlm
-KGEgaW5zdGFuY2VvZiBQLk1oKXJldHVybiBhCnJldHVybiBKLmtzKGEpfSwKVTY6ZnVuY3Rpb24oYSl7
-aWYodHlwZW9mIGE9PSJzdHJpbmciKXJldHVybiBKLkRyLnByb3RvdHlwZQppZihhPT1udWxsKXJldHVy
-biBhCmlmKGEuY29uc3RydWN0b3I9PUFycmF5KXJldHVybiBKLmpkLnByb3RvdHlwZQppZih0eXBlb2Yg
-YSE9Im9iamVjdCIpe2lmKHR5cGVvZiBhPT0iZnVuY3Rpb24iKXJldHVybiBKLmM1LnByb3RvdHlwZQpy
-ZXR1cm4gYX1pZihhIGluc3RhbmNlb2YgUC5NaClyZXR1cm4gYQpyZXR1cm4gSi5rcyhhKX0sCllFOmZ1
-bmN0aW9uKGEpe2lmKGE9PW51bGwpcmV0dXJuIGEKaWYodHlwZW9mIGEhPSJvYmplY3QiKXtpZih0eXBl
-b2YgYT09ImZ1bmN0aW9uIilyZXR1cm4gSi5jNS5wcm90b3R5cGUKcmV0dXJuIGF9aWYoYSBpbnN0YW5j
-ZW9mIFAuTWgpcmV0dXJuIGEKcmV0dXJuIEoua3MoYSl9LAppYTpmdW5jdGlvbihhKXtpZih0eXBlb2Yg
-YT09Im51bWJlciIpe2lmKE1hdGguZmxvb3IoYSk9PWEpcmV0dXJuIEouYlUucHJvdG90eXBlCnJldHVy
-biBKLlZBLnByb3RvdHlwZX1pZih0eXBlb2YgYT09InN0cmluZyIpcmV0dXJuIEouRHIucHJvdG90eXBl
-CmlmKGE9PW51bGwpcmV0dXJuIEoud2UucHJvdG90eXBlCmlmKHR5cGVvZiBhPT0iYm9vbGVhbiIpcmV0
-dXJuIEoueUUucHJvdG90eXBlCmlmKGEuY29uc3RydWN0b3I9PUFycmF5KXJldHVybiBKLmpkLnByb3Rv
-dHlwZQppZih0eXBlb2YgYSE9Im9iamVjdCIpe2lmKHR5cGVvZiBhPT0iZnVuY3Rpb24iKXJldHVybiBK
-LmM1LnByb3RvdHlwZQpyZXR1cm4gYX1pZihhIGluc3RhbmNlb2YgUC5NaClyZXR1cm4gYQpyZXR1cm4g
-Si5rcyhhKX0sCnJZOmZ1bmN0aW9uKGEpe2lmKHR5cGVvZiBhPT0ic3RyaW5nIilyZXR1cm4gSi5Eci5w
-cm90b3R5cGUKaWYoYT09bnVsbClyZXR1cm4gYQppZighKGEgaW5zdGFuY2VvZiBQLk1oKSlyZXR1cm4g
-Si5rZC5wcm90b3R5cGUKcmV0dXJuIGF9LAp3MTpmdW5jdGlvbihhKXtpZihhPT1udWxsKXJldHVybiBh
+YSl9LApCaTpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IEgucjMoYSl9LApvbzpmdW5jdGlvbihhKXt2YXIg
+cyxyPWFeNDgKaWYocjw9OSlyZXR1cm4gcgpzPWF8MzIKaWYoOTc8PXMmJnM8PTEwMilyZXR1cm4gcy04
+NwpyZXR1cm4tMX0sCnFDOmZ1bmN0aW9uKGEsYixjLGQpe1AuazEoYiwic3RhcnQiKQppZihjIT1udWxs
+KXtQLmsxKGMsImVuZCIpCmlmKGI+YylILnYoUC5URShiLDAsYywic3RhcnQiLG51bGwpKX1yZXR1cm4g
+bmV3IEgubkgoYSxiLGMsZC5DKCJuSDwwPiIpKX0sCksxOmZ1bmN0aW9uKGEsYixjLGQpe2lmKHQuYi5i
+KGEpKXJldHVybiBuZXcgSC54eShhLGIsYy5DKCJAPDA+IikuS3EoZCkuQygieHk8MSwyPiIpKQpyZXR1
+cm4gbmV3IEguaTEoYSxiLGMuQygiQDwwPiIpLktxKGQpLkMoImkxPDEsMj4iKSl9LApiSzpmdW5jdGlv
+bihhLGIsYyl7dmFyIHM9ImNvdW50IgppZih0LmIuYihhKSl7UC5VSShiLHMsdC5TKQpQLmsxKGIscykK
+cmV0dXJuIG5ldyBILmQ1KGEsYixjLkMoImQ1PDA+IikpfVAuVUkoYixzLHQuUykKUC5rMShiLHMpCnJl
+dHVybiBuZXcgSC5BTShhLGIsYy5DKCJBTTwwPiIpKX0sCldwOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBQ
+LmxqKCJObyBlbGVtZW50Iil9LApBbTpmdW5jdGlvbigpe3JldHVybiBuZXcgUC5saigiVG9vIG1hbnkg
+ZWxlbWVudHMiKX0sCmFyOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBQLmxqKCJUb28gZmV3IGVsZW1lbnRz
+Iil9LApCUjpmdW5jdGlvbiBCUigpe30sCkU3OmZ1bmN0aW9uIEU3KGEsYil7dGhpcy5hPWEKdGhpcy4k
+dGk9Yn0sClp5OmZ1bmN0aW9uIFp5KGEsYil7dGhpcy5hPWEKdGhpcy4kdGk9Yn0sCm9sOmZ1bmN0aW9u
+IG9sKGEsYil7dGhpcy5hPWEKdGhpcy4kdGk9Yn0sClVxOmZ1bmN0aW9uIFVxKCl7fSwKalY6ZnVuY3Rp
+b24galYoYSxiKXt0aGlzLmE9YQp0aGlzLiR0aT1ifSwKbjpmdW5jdGlvbiBuKGEpe3RoaXMuYT1hfSwK
+cjM6ZnVuY3Rpb24gcjMoYSl7dGhpcy5hPWF9LApxajpmdW5jdGlvbiBxaihhKXt0aGlzLmE9YX0sCmJR
+OmZ1bmN0aW9uIGJRKCl7fSwKYUw6ZnVuY3Rpb24gYUwoKXt9LApuSDpmdW5jdGlvbiBuSChhLGIsYyxk
+KXt2YXIgXz10aGlzCl8uYT1hCl8uYj1iCl8uYz1jCl8uJHRpPWR9LAphNzpmdW5jdGlvbiBhNyhhLGIs
+Yyl7dmFyIF89dGhpcwpfLmE9YQpfLmI9YgpfLmM9MApfLmQ9bnVsbApfLiR0aT1jfSwKaTE6ZnVuY3Rp
+b24gaTEoYSxiLGMpe3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMuJHRpPWN9LAp4eTpmdW5jdGlvbiB4eShh
+LGIsYyl7dGhpcy5hPWEKdGhpcy5iPWIKdGhpcy4kdGk9Y30sCk1IOmZ1bmN0aW9uIE1IKGEsYixjKXt2
+YXIgXz10aGlzCl8uYT1udWxsCl8uYj1hCl8uYz1iCl8uJHRpPWN9LApsSjpmdW5jdGlvbiBsSihhLGIs
+Yyl7dGhpcy5hPWEKdGhpcy5iPWIKdGhpcy4kdGk9Y30sClU1OmZ1bmN0aW9uIFU1KGEsYixjKXt0aGlz
+LmE9YQp0aGlzLmI9Ygp0aGlzLiR0aT1jfSwKU086ZnVuY3Rpb24gU08oYSxiLGMpe3RoaXMuYT1hCnRo
+aXMuYj1iCnRoaXMuJHRpPWN9LApBTTpmdW5jdGlvbiBBTShhLGIsYyl7dGhpcy5hPWEKdGhpcy5iPWIK
+dGhpcy4kdGk9Y30sCmQ1OmZ1bmN0aW9uIGQ1KGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLiR0
+aT1jfSwKVTE6ZnVuY3Rpb24gVTEoYSxiLGMpe3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMuJHRpPWN9LApN
+QjpmdW5jdGlvbiBNQihhKXt0aGlzLiR0aT1hfSwKRnU6ZnVuY3Rpb24gRnUoYSl7dGhpcy4kdGk9YX0s
+CnU2OmZ1bmN0aW9uIHU2KGEsYil7dGhpcy5hPWEKdGhpcy4kdGk9Yn0sCkpCOmZ1bmN0aW9uIEpCKGEs
+Yil7dGhpcy5hPWEKdGhpcy4kdGk9Yn0sClNVOmZ1bmN0aW9uIFNVKCl7fSwKUmU6ZnVuY3Rpb24gUmUo
+KXt9LAp3MjpmdW5jdGlvbiB3Migpe30sCnd2OmZ1bmN0aW9uIHd2KGEpe3RoaXMuYT1hfSwKUUM6ZnVu
+Y3Rpb24gUUMoKXt9LApkYzpmdW5jdGlvbigpe3Rocm93IEguYihQLkw0KCJDYW5ub3QgbW9kaWZ5IHVu
+bW9kaWZpYWJsZSBNYXAiKSl9LApOUTpmdW5jdGlvbihhKXt2YXIgcyxyPUguSmcoYSkKaWYociE9bnVs
+bClyZXR1cm4gcgpzPSJtaW5pZmllZDoiK2EKcmV0dXJuIHN9LAp3VjpmdW5jdGlvbihhLGIpe3ZhciBz
+CmlmKGIhPW51bGwpe3M9Yi54CmlmKHMhPW51bGwpcmV0dXJuIHN9cmV0dXJuIHQuYVUuYihhKX0sCkVq
+OmZ1bmN0aW9uKGEpe3ZhciBzCmlmKHR5cGVvZiBhPT0ic3RyaW5nIilyZXR1cm4gYQppZih0eXBlb2Yg
+YT09Im51bWJlciIpe2lmKGEhPT0wKXJldHVybiIiK2F9ZWxzZSBpZighMD09PWEpcmV0dXJuInRydWUi
+CmVsc2UgaWYoITE9PT1hKXJldHVybiJmYWxzZSIKZWxzZSBpZihhPT1udWxsKXJldHVybiJudWxsIgpz
+PUouaihhKQppZih0eXBlb2YgcyE9InN0cmluZyIpdGhyb3cgSC5iKEgudEwoYSkpCnJldHVybiBzfSwK
+ZVE6ZnVuY3Rpb24oYSl7dmFyIHM9YS4kaWRlbnRpdHlIYXNoCmlmKHM9PW51bGwpe3M9TWF0aC5yYW5k
+b20oKSoweDNmZmZmZmZmfDAKYS4kaWRlbnRpdHlIYXNoPXN9cmV0dXJuIHN9LApIcDpmdW5jdGlvbihh
+LGIpe3ZhciBzLHIscSxwLG8sbixtPW51bGwKaWYodHlwZW9mIGEhPSJzdHJpbmciKUgudihILnRMKGEp
+KQpzPS9eXHMqWystXT8oKDB4W2EtZjAtOV0rKXwoXGQrKXwoW2EtejAtOV0rKSlccyokL2kuZXhlYyhh
+KQppZihzPT1udWxsKXJldHVybiBtCmlmKDM+PXMubGVuZ3RoKXJldHVybiBILk9IKHMsMykKcj1zWzNd
+CmlmKGI9PW51bGwpe2lmKHIhPW51bGwpcmV0dXJuIHBhcnNlSW50KGEsMTApCmlmKHNbMl0hPW51bGwp
+cmV0dXJuIHBhcnNlSW50KGEsMTYpCnJldHVybiBtfWlmKGI8Mnx8Yj4zNil0aHJvdyBILmIoUC5URShi
+LDIsMzYsInJhZGl4IixtKSkKaWYoYj09PTEwJiZyIT1udWxsKXJldHVybiBwYXJzZUludChhLDEwKQpp
+ZihiPDEwfHxyPT1udWxsKXtxPWI8PTEwPzQ3K2I6ODYrYgpwPXNbMV0KZm9yKG89cC5sZW5ndGgsbj0w
+O248bzsrK24paWYoKEMueEIuVyhwLG4pfDMyKT5xKXJldHVybiBtfXJldHVybiBwYXJzZUludChhLGIp
+fSwKTTpmdW5jdGlvbihhKXtyZXR1cm4gSC5INShhKX0sCkg1OmZ1bmN0aW9uKGEpe3ZhciBzLHIscQpp
+ZihhIGluc3RhbmNlb2YgUC5NaClyZXR1cm4gSC5kbShILnooYSksbnVsbCkKaWYoSi5pYShhKT09PUMu
+T2t8fHQuYkouYihhKSl7cz1DLk80KGEpCmlmKEguQmUocykpcmV0dXJuIHMKcj1hLmNvbnN0cnVjdG9y
+CmlmKHR5cGVvZiByPT0iZnVuY3Rpb24iKXtxPXIubmFtZQppZih0eXBlb2YgcT09InN0cmluZyImJkgu
+QmUocSkpcmV0dXJuIHF9fXJldHVybiBILmRtKEgueihhKSxudWxsKX0sCkJlOmZ1bmN0aW9uKGEpe3Zh
+ciBzPWEhPT0iT2JqZWN0IiYmYSE9PSIiCnJldHVybiBzfSwKTTA6ZnVuY3Rpb24oKXtpZighIXNlbGYu
+bG9jYXRpb24pcmV0dXJuIHNlbGYubG9jYXRpb24uaHJlZgpyZXR1cm4gbnVsbH0sClZLOmZ1bmN0aW9u
+KGEpe3ZhciBzLHIscSxwLG89YS5sZW5ndGgKaWYobzw9NTAwKXJldHVybiBTdHJpbmcuZnJvbUNoYXJD
+b2RlLmFwcGx5KG51bGwsYSkKZm9yKHM9IiIscj0wO3I8bztyPXEpe3E9cis1MDAKcD1xPG8/cTpvCnMr
+PVN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxhLnNsaWNlKHIscCkpfXJldHVybiBzfSwKQ3E6
+ZnVuY3Rpb24oYSl7dmFyIHMscixxLHA9SC5WTShbXSx0LmEpCmZvcihzPWEubGVuZ3RoLHI9MDtyPGEu
+bGVuZ3RoO2EubGVuZ3RoPT09c3x8KDAsSC5saykoYSksKytyKXtxPWFbcl0KaWYoIUgub2socSkpdGhy
+b3cgSC5iKEgudEwocSkpCmlmKHE8PTY1NTM1KUMuTm0uaShwLHEpCmVsc2UgaWYocTw9MTExNDExMSl7
+Qy5ObS5pKHAsNTUyOTYrKEMuam4ud0cocS02NTUzNiwxMCkmMTAyMykpCkMuTm0uaShwLDU2MzIwKyhx
+JjEwMjMpKX1lbHNlIHRocm93IEguYihILnRMKHEpKX1yZXR1cm4gSC5WSyhwKX0sCmVUOmZ1bmN0aW9u
+KGEpe3ZhciBzLHIscQpmb3Iocz1hLmxlbmd0aCxyPTA7cjxzOysrcil7cT1hW3JdCmlmKCFILm9rKHEp
+KXRocm93IEguYihILnRMKHEpKQppZihxPDApdGhyb3cgSC5iKEgudEwocSkpCmlmKHE+NjU1MzUpcmV0
+dXJuIEguQ3EoYSl9cmV0dXJuIEguVksoYSl9LApmdzpmdW5jdGlvbihhLGIsYyl7dmFyIHMscixxLHAK
+aWYoYzw9NTAwJiZiPT09MCYmYz09PWEubGVuZ3RoKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFw
+cGx5KG51bGwsYSkKZm9yKHM9YixyPSIiO3M8YztzPXEpe3E9cys1MDAKcD1xPGM/cTpjCnIrPVN0cmlu
+Zy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxhLnN1YmFycmF5KHMscCkpfXJldHVybiByfSwKTHc6ZnVu
+Y3Rpb24oYSl7dmFyIHMKaWYoMDw9YSl7aWYoYTw9NjU1MzUpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNv
+ZGUoYSkKaWYoYTw9MTExNDExMSl7cz1hLTY1NTM2CnJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKChD
+LmpuLndHKHMsMTApfDU1Mjk2KT4+PjAscyYxMDIzfDU2MzIwKX19dGhyb3cgSC5iKFAuVEUoYSwwLDEx
+MTQxMTEsbnVsbCxudWxsKSl9LApvMjpmdW5jdGlvbihhKXtpZihhLmRhdGU9PT12b2lkIDApYS5kYXRl
+PW5ldyBEYXRlKGEuYSkKcmV0dXJuIGEuZGF0ZX0sCnRKOmZ1bmN0aW9uKGEpe3ZhciBzPUgubzIoYSku
+Z2V0RnVsbFllYXIoKSswCnJldHVybiBzfSwKTlM6ZnVuY3Rpb24oYSl7dmFyIHM9SC5vMihhKS5nZXRN
+b250aCgpKzEKcmV0dXJuIHN9LApqQTpmdW5jdGlvbihhKXt2YXIgcz1ILm8yKGEpLmdldERhdGUoKSsw
+CnJldHVybiBzfSwKSVg6ZnVuY3Rpb24oYSl7dmFyIHM9SC5vMihhKS5nZXRIb3VycygpKzAKcmV0dXJu
+IHN9LApjaDpmdW5jdGlvbihhKXt2YXIgcz1ILm8yKGEpLmdldE1pbnV0ZXMoKSswCnJldHVybiBzfSwK
+SmQ6ZnVuY3Rpb24oYSl7dmFyIHM9SC5vMihhKS5nZXRTZWNvbmRzKCkrMApyZXR1cm4gc30sCm8xOmZ1
+bmN0aW9uKGEpe3ZhciBzPUgubzIoYSkuZ2V0TWlsbGlzZWNvbmRzKCkrMApyZXR1cm4gc30sCnpvOmZ1
+bmN0aW9uKGEsYixjKXt2YXIgcyxyLHE9e30KcS5hPTAKcz1bXQpyPVtdCnEuYT1iLmxlbmd0aApDLk5t
+LkZWKHMsYikKcS5iPSIiCmlmKGMhPW51bGwmJmMuYSE9PTApYy5LKDAsbmV3IEguQ2oocSxyLHMpKQoi
+IitxLmEKcmV0dXJuIEouSnkoYSxuZXcgSC5MSShDLlRlLDAscyxyLDApKX0sCkVrOmZ1bmN0aW9uKGEs
+YixjKXt2YXIgcyxyLHEscAppZihiIGluc3RhbmNlb2YgQXJyYXkpcz1jPT1udWxsfHxjLmE9PT0wCmVs
+c2Ugcz0hMQppZihzKXtyPWIKcT1yLmxlbmd0aAppZihxPT09MCl7aWYoISFhLiQwKXJldHVybiBhLiQw
+KCl9ZWxzZSBpZihxPT09MSl7aWYoISFhLiQxKXJldHVybiBhLiQxKHJbMF0pfWVsc2UgaWYocT09PTIp
+e2lmKCEhYS4kMilyZXR1cm4gYS4kMihyWzBdLHJbMV0pfWVsc2UgaWYocT09PTMpe2lmKCEhYS4kMyly
+ZXR1cm4gYS4kMyhyWzBdLHJbMV0sclsyXSl9ZWxzZSBpZihxPT09NCl7aWYoISFhLiQ0KXJldHVybiBh
+LiQ0KHJbMF0sclsxXSxyWzJdLHJbM10pfWVsc2UgaWYocT09PTUpaWYoISFhLiQ1KXJldHVybiBhLiQ1
+KHJbMF0sclsxXSxyWzJdLHJbM10scls0XSkKcD1hWyIiKyIkIitxXQppZihwIT1udWxsKXJldHVybiBw
+LmFwcGx5KGEscil9cmV0dXJuIEguZTEoYSxiLGMpfSwKZTE6ZnVuY3Rpb24oYSxiLGMpe3ZhciBzLHIs
+cSxwLG8sbixtLGwsayxqLGk9YiBpbnN0YW5jZW9mIEFycmF5P2I6UC5DSChiLCEwLHQueiksaD1pLmxl
+bmd0aCxnPWEuJFIKaWYoaDxnKXJldHVybiBILnpvKGEsaSxjKQpzPWEuJEQKcj1zPT1udWxsCnE9IXI/
+cygpOm51bGwKcD1KLmlhKGEpCm89cC4kQwppZih0eXBlb2Ygbz09InN0cmluZyIpbz1wW29dCmlmKHIp
+e2lmKGMhPW51bGwmJmMuYSE9PTApcmV0dXJuIEguem8oYSxpLGMpCmlmKGg9PT1nKXJldHVybiBvLmFw
+cGx5KGEsaSkKcmV0dXJuIEguem8oYSxpLGMpfWlmKHEgaW5zdGFuY2VvZiBBcnJheSl7aWYoYyE9bnVs
+bCYmYy5hIT09MClyZXR1cm4gSC56byhhLGksYykKaWYoaD5nK3EubGVuZ3RoKXJldHVybiBILnpvKGEs
+aSxudWxsKQpDLk5tLkZWKGkscS5zbGljZShoLWcpKQpyZXR1cm4gby5hcHBseShhLGkpfWVsc2V7aWYo
+aD5nKXJldHVybiBILnpvKGEsaSxjKQpuPU9iamVjdC5rZXlzKHEpCmlmKGM9PW51bGwpZm9yKHI9bi5s
+ZW5ndGgsbT0wO208bi5sZW5ndGg7bi5sZW5ndGg9PT1yfHwoMCxILmxrKShuKSwrK20pe2w9cVtILmgo
+blttXSldCmlmKEMuTnY9PT1sKXJldHVybiBILnpvKGEsaSxjKQpDLk5tLmkoaSxsKX1lbHNle2Zvcihy
+PW4ubGVuZ3RoLGs9MCxtPTA7bTxuLmxlbmd0aDtuLmxlbmd0aD09PXJ8fCgwLEgubGspKG4pLCsrbSl7
+aj1ILmgoblttXSkKaWYoYy54NChqKSl7KytrCkMuTm0uaShpLGMucSgwLGopKX1lbHNle2w9cVtqXQpp
+ZihDLk52PT09bClyZXR1cm4gSC56byhhLGksYykKQy5ObS5pKGksbCl9fWlmKGshPT1jLmEpcmV0dXJu
+IEguem8oYSxpLGMpfXJldHVybiBvLmFwcGx5KGEsaSl9fSwKcFk6ZnVuY3Rpb24oYSl7dGhyb3cgSC5i
+KEgudEwoYSkpfSwKT0g6ZnVuY3Rpb24oYSxiKXtpZihhPT1udWxsKUouSG0oYSkKdGhyb3cgSC5iKEgu
+SFkoYSxiKSl9LApIWTpmdW5jdGlvbihhLGIpe3ZhciBzLHIscT0iaW5kZXgiCmlmKCFILm9rKGIpKXJl
+dHVybiBuZXcgUC51KCEwLGIscSxudWxsKQpzPUgudVAoSi5IbShhKSkKaWYoIShiPDApKXtpZih0eXBl
+b2YgcyE9PSJudW1iZXIiKXJldHVybiBILnBZKHMpCnI9Yj49c31lbHNlIHI9ITAKaWYocilyZXR1cm4g
+UC5DZihiLGEscSxudWxsLHMpCnJldHVybiBQLk83KGIscSl9LAphdTpmdW5jdGlvbihhLGIsYyl7aWYo
+YT5jKXJldHVybiBQLlRFKGEsMCxjLCJzdGFydCIsbnVsbCkKaWYoYiE9bnVsbClpZihiPGF8fGI+Yyly
+ZXR1cm4gUC5URShiLGEsYywiZW5kIixudWxsKQpyZXR1cm4gbmV3IFAudSghMCxiLCJlbmQiLG51bGwp
+fSwKdEw6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBQLnUoITAsYSxudWxsLG51bGwpfSwKYjpmdW5jdGlv
+bihhKXt2YXIgcyxyCmlmKGE9PW51bGwpYT1uZXcgUC5GKCkKcz1uZXcgRXJyb3IoKQpzLmRhcnRFeGNl
+cHRpb249YQpyPUgueAppZigiZGVmaW5lUHJvcGVydHkiIGluIE9iamVjdCl7T2JqZWN0LmRlZmluZVBy
+b3BlcnR5KHMsIm1lc3NhZ2UiLHtnZXQ6cn0pCnMubmFtZT0iIn1lbHNlIHMudG9TdHJpbmc9cgpyZXR1
+cm4gc30sCng6ZnVuY3Rpb24oKXtyZXR1cm4gSi5qKHRoaXMuZGFydEV4Y2VwdGlvbil9LAp2OmZ1bmN0
+aW9uKGEpe3Rocm93IEguYihhKX0sCmxrOmZ1bmN0aW9uKGEpe3Rocm93IEguYihQLmE0KGEpKX0sCmNN
+OmZ1bmN0aW9uKGEpe3ZhciBzLHIscSxwLG8sbgphPUguZUEoYS5yZXBsYWNlKFN0cmluZyh7fSksJyRy
+ZWNlaXZlciQnKSkKcz1hLm1hdGNoKC9cXFwkW2EtekEtWl0rXFxcJC9nKQppZihzPT1udWxsKXM9SC5W
+TShbXSx0LnMpCnI9cy5pbmRleE9mKCJcXCRhcmd1bWVudHNcXCQiKQpxPXMuaW5kZXhPZigiXFwkYXJn
+dW1lbnRzRXhwclxcJCIpCnA9cy5pbmRleE9mKCJcXCRleHByXFwkIikKbz1zLmluZGV4T2YoIlxcJG1l
+dGhvZFxcJCIpCm49cy5pbmRleE9mKCJcXCRyZWNlaXZlclxcJCIpCnJldHVybiBuZXcgSC5mOShhLnJl
+cGxhY2UobmV3IFJlZ0V4cCgnXFxcXFxcJGFyZ3VtZW50c1xcXFxcXCQnLCdnJyksJygoPzp4fFteeF0p
+KiknKS5yZXBsYWNlKG5ldyBSZWdFeHAoJ1xcXFxcXCRhcmd1bWVudHNFeHByXFxcXFxcJCcsJ2cnKSwn
+KCg/Onh8W154XSkqKScpLnJlcGxhY2UobmV3IFJlZ0V4cCgnXFxcXFxcJGV4cHJcXFxcXFwkJywnZycp
+LCcoKD86eHxbXnhdKSopJykucmVwbGFjZShuZXcgUmVnRXhwKCdcXFxcXFwkbWV0aG9kXFxcXFxcJCcs
+J2cnKSwnKCg/Onh8W154XSkqKScpLnJlcGxhY2UobmV3IFJlZ0V4cCgnXFxcXFxcJHJlY2VpdmVyXFxc
+XFxcJCcsJ2cnKSwnKCg/Onh8W154XSkqKScpLHIscSxwLG8sbil9LApTNzpmdW5jdGlvbihhKXtyZXR1
+cm4gZnVuY3Rpb24oJGV4cHIkKXt2YXIgJGFyZ3VtZW50c0V4cHIkPSckYXJndW1lbnRzJCcKdHJ5eyRl
+eHByJC4kbWV0aG9kJCgkYXJndW1lbnRzRXhwciQpfWNhdGNoKHMpe3JldHVybiBzLm1lc3NhZ2V9fShh
+KX0sCk1qOmZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbigkZXhwciQpe3RyeXskZXhwciQuJG1ldGhv
+ZCR9Y2F0Y2gocyl7cmV0dXJuIHMubWVzc2FnZX19KGEpfSwKSWo6ZnVuY3Rpb24oYSxiKXtyZXR1cm4g
+bmV3IEguVzAoYSxiPT1udWxsP251bGw6Yi5tZXRob2QpfSwKVDM6ZnVuY3Rpb24oYSxiKXt2YXIgcz1i
+PT1udWxsLHI9cz9udWxsOmIubWV0aG9kCnJldHVybiBuZXcgSC5heihhLHIscz9udWxsOmIucmVjZWl2
+ZXIpfSwKUnU6ZnVuY3Rpb24oYSl7aWYoYT09bnVsbClyZXR1cm4gbmV3IEgudGUoYSkKaWYoYSBpbnN0
+YW5jZW9mIEguYnEpcmV0dXJuIEgudFcoYSxhLmEpCmlmKHR5cGVvZiBhIT09Im9iamVjdCIpcmV0dXJu
+IGEKaWYoImRhcnRFeGNlcHRpb24iIGluIGEpcmV0dXJuIEgudFcoYSxhLmRhcnRFeGNlcHRpb24pCnJl
+dHVybiBILnRsKGEpfSwKdFc6ZnVuY3Rpb24oYSxiKXtpZih0LnIuYihiKSlpZihiLiR0aHJvd25Kc0Vy
+cm9yPT1udWxsKWIuJHRocm93bkpzRXJyb3I9YQpyZXR1cm4gYn0sCnRsOmZ1bmN0aW9uKGEpe3ZhciBz
+LHIscSxwLG8sbixtLGwsayxqLGksaCxnLGYsZT1udWxsCmlmKCEoIm1lc3NhZ2UiIGluIGEpKXJldHVy
+biBhCnM9YS5tZXNzYWdlCmlmKCJudW1iZXIiIGluIGEmJnR5cGVvZiBhLm51bWJlcj09Im51bWJlciIp
+e3I9YS5udW1iZXIKcT1yJjY1NTM1CmlmKChDLmpuLndHKHIsMTYpJjgxOTEpPT09MTApc3dpdGNoKHEp
+e2Nhc2UgNDM4OnJldHVybiBILnRXKGEsSC5UMyhILkVqKHMpKyIgKEVycm9yICIrcSsiKSIsZSkpCmNh
+c2UgNDQ1OmNhc2UgNTAwNzpyZXR1cm4gSC50VyhhLEguSWooSC5FaihzKSsiIChFcnJvciAiK3ErIiki
+LGUpKX19aWYoYSBpbnN0YW5jZW9mIFR5cGVFcnJvcil7cD0kLlNuKCkKbz0kLmxxKCkKbj0kLk45KCkK
+bT0kLmlJKCkKbD0kLlVOKCkKaz0kLlpoKCkKaj0kLnJOKCkKJC5jMygpCmk9JC5ISygpCmg9JC5yMSgp
+Cmc9cC5xUyhzKQppZihnIT1udWxsKXJldHVybiBILnRXKGEsSC5UMyhILmgocyksZykpCmVsc2V7Zz1v
+LnFTKHMpCmlmKGchPW51bGwpe2cubWV0aG9kPSJjYWxsIgpyZXR1cm4gSC50VyhhLEguVDMoSC5oKHMp
+LGcpKX1lbHNle2c9bi5xUyhzKQppZihnPT1udWxsKXtnPW0ucVMocykKaWYoZz09bnVsbCl7Zz1sLnFT
+KHMpCmlmKGc9PW51bGwpe2c9ay5xUyhzKQppZihnPT1udWxsKXtnPWoucVMocykKaWYoZz09bnVsbCl7
+Zz1tLnFTKHMpCmlmKGc9PW51bGwpe2c9aS5xUyhzKQppZihnPT1udWxsKXtnPWgucVMocykKZj1nIT1u
+dWxsfWVsc2UgZj0hMH1lbHNlIGY9ITB9ZWxzZSBmPSEwfWVsc2UgZj0hMH1lbHNlIGY9ITB9ZWxzZSBm
+PSEwfWVsc2UgZj0hMAppZihmKXJldHVybiBILnRXKGEsSC5JaihILmgocyksZykpfX1yZXR1cm4gSC50
+VyhhLG5ldyBILnZWKHR5cGVvZiBzPT0ic3RyaW5nIj9zOiIiKSl9aWYoYSBpbnN0YW5jZW9mIFJhbmdl
+RXJyb3Ipe2lmKHR5cGVvZiBzPT0ic3RyaW5nIiYmcy5pbmRleE9mKCJjYWxsIHN0YWNrIikhPT0tMSly
+ZXR1cm4gbmV3IFAuS1koKQpzPWZ1bmN0aW9uKGIpe3RyeXtyZXR1cm4gU3RyaW5nKGIpfWNhdGNoKGQp
+e31yZXR1cm4gbnVsbH0oYSkKcmV0dXJuIEgudFcoYSxuZXcgUC51KCExLGUsZSx0eXBlb2Ygcz09InN0
+cmluZyI/cy5yZXBsYWNlKC9eUmFuZ2VFcnJvcjpccyovLCIiKTpzKSl9aWYodHlwZW9mIEludGVybmFs
+RXJyb3I9PSJmdW5jdGlvbiImJmEgaW5zdGFuY2VvZiBJbnRlcm5hbEVycm9yKWlmKHR5cGVvZiBzPT0i
+c3RyaW5nIiYmcz09PSJ0b28gbXVjaCByZWN1cnNpb24iKXJldHVybiBuZXcgUC5LWSgpCnJldHVybiBh
+fSwKdHM6ZnVuY3Rpb24oYSl7dmFyIHMKaWYoYSBpbnN0YW5jZW9mIEguYnEpcmV0dXJuIGEuYgppZihh
+PT1udWxsKXJldHVybiBuZXcgSC5YTyhhKQpzPWEuJGNhY2hlZFRyYWNlCmlmKHMhPW51bGwpcmV0dXJu
+IHMKcmV0dXJuIGEuJGNhY2hlZFRyYWNlPW5ldyBILlhPKGEpfSwKQjc6ZnVuY3Rpb24oYSxiKXt2YXIg
+cyxyLHEscD1hLmxlbmd0aApmb3Iocz0wO3M8cDtzPXEpe3I9cysxCnE9cisxCmIuWSgwLGFbc10sYVty
+XSl9cmV0dXJuIGJ9LApmdDpmdW5jdGlvbihhLGIsYyxkLGUsZil7dC5ZLmEoYSkKc3dpdGNoKEgudVAo
+Yikpe2Nhc2UgMDpyZXR1cm4gYS4kMCgpCmNhc2UgMTpyZXR1cm4gYS4kMShjKQpjYXNlIDI6cmV0dXJu
+IGEuJDIoYyxkKQpjYXNlIDM6cmV0dXJuIGEuJDMoYyxkLGUpCmNhc2UgNDpyZXR1cm4gYS4kNChjLGQs
+ZSxmKX10aHJvdyBILmIobmV3IFAuQ0QoIlVuc3VwcG9ydGVkIG51bWJlciBvZiBhcmd1bWVudHMgZm9y
+IHdyYXBwZWQgY2xvc3VyZSIpKX0sCnRSOmZ1bmN0aW9uKGEsYil7dmFyIHMKaWYoYT09bnVsbClyZXR1
+cm4gbnVsbApzPWEuJGlkZW50aXR5CmlmKCEhcylyZXR1cm4gcwpzPWZ1bmN0aW9uKGMsZCxlKXtyZXR1
+cm4gZnVuY3Rpb24oZixnLGgsaSl7cmV0dXJuIGUoYyxkLGYsZyxoLGkpfX0oYSxiLEguZnQpCmEuJGlk
+ZW50aXR5PXMKcmV0dXJuIHN9LAppQTpmdW5jdGlvbihhLGIsYyxkLGUsZixnKXt2YXIgcyxyLHEscCxv
+LG4sbSxsPWJbMF0saz1sLiRjYWxsTmFtZSxqPWU/T2JqZWN0LmNyZWF0ZShuZXcgSC56eCgpLmNvbnN0
+cnVjdG9yLnByb3RvdHlwZSk6T2JqZWN0LmNyZWF0ZShuZXcgSC5yVChudWxsLG51bGwsbnVsbCwiIiku
+Y29uc3RydWN0b3IucHJvdG90eXBlKQpqLiRpbml0aWFsaXplPWouY29uc3RydWN0b3IKaWYoZSlzPWZ1
+bmN0aW9uIHN0YXRpY190ZWFyX29mZigpe3RoaXMuJGluaXRpYWxpemUoKX0KZWxzZXtyPSQueWoKaWYo
+dHlwZW9mIHIhPT0ibnVtYmVyIilyZXR1cm4gci5oKCkKJC55aj1yKzEKcj1uZXcgRnVuY3Rpb24oImEs
+YixjLGQiK3IsInRoaXMuJGluaXRpYWxpemUoYSxiLGMsZCIrcisiKSIpCnM9cn1qLmNvbnN0cnVjdG9y
+PXMKcy5wcm90b3R5cGU9agppZighZSl7cT1ILmJ4KGEsbCxmKQpxLiRyZWZsZWN0aW9uSW5mbz1kfWVs
+c2V7ai4kc3RhdGljX25hbWU9ZwpxPWx9ai4kUz1ILmltKGQsZSxmKQpqW2tdPXEKZm9yKHA9cSxvPTE7
+bzxiLmxlbmd0aDsrK28pe249YltvXQptPW4uJGNhbGxOYW1lCmlmKG0hPW51bGwpe249ZT9uOkguYngo
+YSxuLGYpCmpbbV09bn1pZihvPT09Yyl7bi4kcmVmbGVjdGlvbkluZm89ZApwPW59fWouJEM9cApqLiRS
+PWwuJFIKai4kRD1sLiRECnJldHVybiBzfSwKaW06ZnVuY3Rpb24oYSxiLGMpe3ZhciBzCmlmKHR5cGVv
+ZiBhPT0ibnVtYmVyIilyZXR1cm4gZnVuY3Rpb24oZCxlKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4g
+ZChlKX19KEguQnAsYSkKaWYodHlwZW9mIGE9PSJzdHJpbmciKXtpZihiKXRocm93IEguYigiQ2Fubm90
+IGNvbXB1dGUgc2lnbmF0dXJlIGZvciBzdGF0aWMgdGVhcm9mZi4iKQpzPWM/SC5QVzpILlRuCnJldHVy
+biBmdW5jdGlvbihkLGUpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBlKHRoaXMsZCl9fShhLHMpfXRo
+cm93IEguYigiRXJyb3IgaW4gZnVuY3Rpb25UeXBlIG9mIHRlYXJvZmYiKX0sCnZxOmZ1bmN0aW9uKGEs
+YixjLGQpe3ZhciBzPUguRFYKc3dpdGNoKGI/LTE6YSl7Y2FzZSAwOnJldHVybiBmdW5jdGlvbihlLGYp
+e3JldHVybiBmdW5jdGlvbigpe3JldHVybiBmKHRoaXMpW2VdKCl9fShjLHMpCmNhc2UgMTpyZXR1cm4g
+ZnVuY3Rpb24oZSxmKXtyZXR1cm4gZnVuY3Rpb24oZyl7cmV0dXJuIGYodGhpcylbZV0oZyl9fShjLHMp
+CmNhc2UgMjpyZXR1cm4gZnVuY3Rpb24oZSxmKXtyZXR1cm4gZnVuY3Rpb24oZyxoKXtyZXR1cm4gZih0
+aGlzKVtlXShnLGgpfX0oYyxzKQpjYXNlIDM6cmV0dXJuIGZ1bmN0aW9uKGUsZil7cmV0dXJuIGZ1bmN0
+aW9uKGcsaCxpKXtyZXR1cm4gZih0aGlzKVtlXShnLGgsaSl9fShjLHMpCmNhc2UgNDpyZXR1cm4gZnVu
+Y3Rpb24oZSxmKXtyZXR1cm4gZnVuY3Rpb24oZyxoLGksail7cmV0dXJuIGYodGhpcylbZV0oZyxoLGks
+ail9fShjLHMpCmNhc2UgNTpyZXR1cm4gZnVuY3Rpb24oZSxmKXtyZXR1cm4gZnVuY3Rpb24oZyxoLGks
+aixrKXtyZXR1cm4gZih0aGlzKVtlXShnLGgsaSxqLGspfX0oYyxzKQpkZWZhdWx0OnJldHVybiBmdW5j
+dGlvbihlLGYpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBlLmFwcGx5KGYodGhpcyksYXJndW1lbnRz
+KX19KGQscyl9fSwKYng6ZnVuY3Rpb24oYSxiLGMpe3ZhciBzLHIscSxwLG8sbixtCmlmKGMpcmV0dXJu
+IEguSGYoYSxiKQpzPWIuJHN0dWJOYW1lCnI9Yi5sZW5ndGgKcT1hW3NdCnA9Yj09bnVsbD9xPT1udWxs
+OmI9PT1xCm89IXB8fHI+PTI3CmlmKG8pcmV0dXJuIEgudnEociwhcCxzLGIpCmlmKHI9PT0wKXtwPSQu
+eWoKaWYodHlwZW9mIHAhPT0ibnVtYmVyIilyZXR1cm4gcC5oKCkKJC55aj1wKzEKbj0ic2VsZiIrcApy
+ZXR1cm4gbmV3IEZ1bmN0aW9uKCJyZXR1cm4gZnVuY3Rpb24oKXt2YXIgIituKyIgPSB0aGlzLiIrSC5F
+aihILm9OKCkpKyI7cmV0dXJuICIrbisiLiIrSC5FaihzKSsiKCk7fSIpKCl9bT0iYWJjZGVmZ2hpamts
+bW5vcHFyc3R1dnd4eXoiLnNwbGl0KCIiKS5zcGxpY2UoMCxyKS5qb2luKCIsIikKcD0kLnlqCmlmKHR5
+cGVvZiBwIT09Im51bWJlciIpcmV0dXJuIHAuaCgpCiQueWo9cCsxCm0rPXAKcmV0dXJuIG5ldyBGdW5j
+dGlvbigicmV0dXJuIGZ1bmN0aW9uKCIrbSsiKXtyZXR1cm4gdGhpcy4iK0guRWooSC5vTigpKSsiLiIr
+SC5FaihzKSsiKCIrbSsiKTt9IikoKX0sClo0OmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBzPUguRFYscj1I
+LnlTCnN3aXRjaChiPy0xOmEpe2Nhc2UgMDp0aHJvdyBILmIobmV3IEguRXEoIkludGVyY2VwdGVkIGZ1
+bmN0aW9uIHdpdGggbm8gYXJndW1lbnRzLiIpKQpjYXNlIDE6cmV0dXJuIGZ1bmN0aW9uKGUsZixnKXty
+ZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZih0aGlzKVtlXShnKHRoaXMpKX19KGMscyxyKQpjYXNlIDI6
+cmV0dXJuIGZ1bmN0aW9uKGUsZixnKXtyZXR1cm4gZnVuY3Rpb24oaCl7cmV0dXJuIGYodGhpcylbZV0o
+Zyh0aGlzKSxoKX19KGMscyxyKQpjYXNlIDM6cmV0dXJuIGZ1bmN0aW9uKGUsZixnKXtyZXR1cm4gZnVu
+Y3Rpb24oaCxpKXtyZXR1cm4gZih0aGlzKVtlXShnKHRoaXMpLGgsaSl9fShjLHMscikKY2FzZSA0OnJl
+dHVybiBmdW5jdGlvbihlLGYsZyl7cmV0dXJuIGZ1bmN0aW9uKGgsaSxqKXtyZXR1cm4gZih0aGlzKVtl
+XShnKHRoaXMpLGgsaSxqKX19KGMscyxyKQpjYXNlIDU6cmV0dXJuIGZ1bmN0aW9uKGUsZixnKXtyZXR1
+cm4gZnVuY3Rpb24oaCxpLGosayl7cmV0dXJuIGYodGhpcylbZV0oZyh0aGlzKSxoLGksaixrKX19KGMs
+cyxyKQpjYXNlIDY6cmV0dXJuIGZ1bmN0aW9uKGUsZixnKXtyZXR1cm4gZnVuY3Rpb24oaCxpLGosayxs
+KXtyZXR1cm4gZih0aGlzKVtlXShnKHRoaXMpLGgsaSxqLGssbCl9fShjLHMscikKZGVmYXVsdDpyZXR1
+cm4gZnVuY3Rpb24oZSxmLGcsaCl7cmV0dXJuIGZ1bmN0aW9uKCl7aD1bZyh0aGlzKV0KQXJyYXkucHJv
+dG90eXBlLnB1c2guYXBwbHkoaCxhcmd1bWVudHMpCnJldHVybiBlLmFwcGx5KGYodGhpcyksaCl9fShk
+LHMscil9fSwKSGY6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyLHEscCxvLG4sbT1ILm9OKCksbD0kLlA0Cmlm
+KGw9PW51bGwpbD0kLlA0PUguRTIoInJlY2VpdmVyIikKcz1iLiRzdHViTmFtZQpyPWIubGVuZ3RoCnE9
+YVtzXQpwPWI9PW51bGw/cT09bnVsbDpiPT09cQpvPSFwfHxyPj0yOAppZihvKXJldHVybiBILlo0KHIs
+IXAscyxiKQppZihyPT09MSl7cD0icmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuIitILkVqKG0p
+KyIuIitILkVqKHMpKyIodGhpcy4iK2wrIik7IgpvPSQueWoKaWYodHlwZW9mIG8hPT0ibnVtYmVyIily
+ZXR1cm4gby5oKCkKJC55aj1vKzEKcmV0dXJuIG5ldyBGdW5jdGlvbihwK28rIn0iKSgpfW49ImFiY2Rl
+ZmdoaWprbG1ub3BxcnN0dXZ3eHl6Ii5zcGxpdCgiIikuc3BsaWNlKDAsci0xKS5qb2luKCIsIikKcD0i
+cmV0dXJuIGZ1bmN0aW9uKCIrbisiKXtyZXR1cm4gdGhpcy4iK0guRWoobSkrIi4iK0guRWoocykrIih0
+aGlzLiIrbCsiLCAiK24rIik7IgpvPSQueWoKaWYodHlwZW9mIG8hPT0ibnVtYmVyIilyZXR1cm4gby5o
+KCkKJC55aj1vKzEKcmV0dXJuIG5ldyBGdW5jdGlvbihwK28rIn0iKSgpfSwKS3E6ZnVuY3Rpb24oYSxi
+LGMsZCxlLGYsZyl7cmV0dXJuIEguaUEoYSxiLGMsZCwhIWUsISFmLGcpfSwKVG46ZnVuY3Rpb24oYSxi
+KXtyZXR1cm4gSC5jRSh2LnR5cGVVbml2ZXJzZSxILnooYS5hKSxiKX0sClBXOmZ1bmN0aW9uKGEsYil7
+cmV0dXJuIEguY0Uodi50eXBlVW5pdmVyc2UsSC56KGEuYyksYil9LApEVjpmdW5jdGlvbihhKXtyZXR1
+cm4gYS5hfSwKeVM6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuY30sCm9OOmZ1bmN0aW9uKCl7dmFyIHM9JC5t
+SgpyZXR1cm4gcz09bnVsbD8kLm1KPUguRTIoInNlbGYiKTpzfSwKRTI6ZnVuY3Rpb24oYSl7dmFyIHMs
+cixxLHA9bmV3IEguclQoInNlbGYiLCJ0YXJnZXQiLCJyZWNlaXZlciIsIm5hbWUiKSxvPUouRXAoT2Jq
+ZWN0LmdldE93blByb3BlcnR5TmFtZXMocCksdC5SKQpmb3Iocz1vLmxlbmd0aCxyPTA7cjxzOysrcil7
+cT1vW3JdCmlmKHBbcV09PT1hKXJldHVybiBxfXRocm93IEguYihQLnhZKCJGaWVsZCBuYW1lICIrYSsi
+IG5vdCBmb3VuZC4iKSl9LApvVDpmdW5jdGlvbihhKXtpZihhPT1udWxsKUguZk8oImJvb2xlYW4gZXhw
+cmVzc2lvbiBtdXN0IG5vdCBiZSBudWxsIikKcmV0dXJuIGF9LApmTzpmdW5jdGlvbihhKXt0aHJvdyBI
+LmIobmV3IEgua1koYSkpfSwKYWc6ZnVuY3Rpb24oYSl7dGhyb3cgSC5iKG5ldyBQLnAoYSkpfSwKWWc6
+ZnVuY3Rpb24oYSl7cmV0dXJuIHYuZ2V0SXNvbGF0ZVRhZyhhKX0sCkJvOmZ1bmN0aW9uKGEpe3JldHVy
+biBILnYoSC5jKGEpKX0sCml3OmZ1bmN0aW9uKGEsYixjKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoYSxi
+LHt2YWx1ZTpjLGVudW1lcmFibGU6ZmFsc2Usd3JpdGFibGU6dHJ1ZSxjb25maWd1cmFibGU6dHJ1ZX0p
+fSwKdzM6ZnVuY3Rpb24oYSl7dmFyIHMscixxLHAsbyxuPUguaCgkLk5GLiQxKGEpKSxtPSQubndbbl0K
+aWYobSE9bnVsbCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGEsdi5kaXNwYXRjaFByb3BlcnR5TmFtZSx7
+dmFsdWU6bSxlbnVtZXJhYmxlOmZhbHNlLHdyaXRhYmxlOnRydWUsY29uZmlndXJhYmxlOnRydWV9KQpy
+ZXR1cm4gbS5pfXM9JC52dltuXQppZihzIT1udWxsKXJldHVybiBzCnI9di5pbnRlcmNlcHRvcnNCeVRh
+Z1tuXQppZihyPT1udWxsKXtxPUguaygkLlRYLiQyKGEsbikpCmlmKHEhPW51bGwpe209JC5ud1txXQpp
+ZihtIT1udWxsKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoYSx2LmRpc3BhdGNoUHJvcGVydHlOYW1lLHt2
+YWx1ZTptLGVudW1lcmFibGU6ZmFsc2Usd3JpdGFibGU6dHJ1ZSxjb25maWd1cmFibGU6dHJ1ZX0pCnJl
+dHVybiBtLml9cz0kLnZ2W3FdCmlmKHMhPW51bGwpcmV0dXJuIHMKcj12LmludGVyY2VwdG9yc0J5VGFn
+W3FdCm49cX19aWYocj09bnVsbClyZXR1cm4gbnVsbApzPXIucHJvdG90eXBlCnA9blswXQppZihwPT09
+IiEiKXttPUguVmEocykKJC5ud1tuXT1tCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLHYuZGlzcGF0Y2hQ
+cm9wZXJ0eU5hbWUse3ZhbHVlOm0sZW51bWVyYWJsZTpmYWxzZSx3cml0YWJsZTp0cnVlLGNvbmZpZ3Vy
+YWJsZTp0cnVlfSkKcmV0dXJuIG0uaX1pZihwPT09In4iKXskLnZ2W25dPXMKcmV0dXJuIHN9aWYocD09
+PSItIil7bz1ILlZhKHMpCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShPYmplY3QuZ2V0UHJvdG90eXBlT2Yo
+YSksdi5kaXNwYXRjaFByb3BlcnR5TmFtZSx7dmFsdWU6byxlbnVtZXJhYmxlOmZhbHNlLHdyaXRhYmxl
+OnRydWUsY29uZmlndXJhYmxlOnRydWV9KQpyZXR1cm4gby5pfWlmKHA9PT0iKyIpcmV0dXJuIEguTGMo
+YSxzKQppZihwPT09IioiKXRocm93IEguYihQLlNZKG4pKQppZih2LmxlYWZUYWdzW25dPT09dHJ1ZSl7
+bz1ILlZhKHMpCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShPYmplY3QuZ2V0UHJvdG90eXBlT2YoYSksdi5k
+aXNwYXRjaFByb3BlcnR5TmFtZSx7dmFsdWU6byxlbnVtZXJhYmxlOmZhbHNlLHdyaXRhYmxlOnRydWUs
+Y29uZmlndXJhYmxlOnRydWV9KQpyZXR1cm4gby5pfWVsc2UgcmV0dXJuIEguTGMoYSxzKX0sCkxjOmZ1
+bmN0aW9uKGEsYil7dmFyIHM9T2JqZWN0LmdldFByb3RvdHlwZU9mKGEpCk9iamVjdC5kZWZpbmVQcm9w
+ZXJ0eShzLHYuZGlzcGF0Y2hQcm9wZXJ0eU5hbWUse3ZhbHVlOkouUXUoYixzLG51bGwsbnVsbCksZW51
+bWVyYWJsZTpmYWxzZSx3cml0YWJsZTp0cnVlLGNvbmZpZ3VyYWJsZTp0cnVlfSkKcmV0dXJuIGJ9LApW
+YTpmdW5jdGlvbihhKXtyZXR1cm4gSi5RdShhLCExLG51bGwsISFhLiRpWGopfSwKVkY6ZnVuY3Rpb24o
+YSxiLGMpe3ZhciBzPWIucHJvdG90eXBlCmlmKHYubGVhZlRhZ3NbYV09PT10cnVlKXJldHVybiBILlZh
+KHMpCmVsc2UgcmV0dXJuIEouUXUocyxjLG51bGwsbnVsbCl9LApYRDpmdW5jdGlvbigpe2lmKCEwPT09
+JC5CdilyZXR1cm4KJC5Cdj0hMApILloxKCl9LApaMTpmdW5jdGlvbigpe3ZhciBzLHIscSxwLG8sbixt
+LGwKJC5udz1PYmplY3QuY3JlYXRlKG51bGwpCiQudnY9T2JqZWN0LmNyZWF0ZShudWxsKQpILmtPKCkK
+cz12LmludGVyY2VwdG9yc0J5VGFnCnI9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMocykKaWYodHlw
+ZW9mIHdpbmRvdyE9InVuZGVmaW5lZCIpe3dpbmRvdwpxPWZ1bmN0aW9uKCl7fQpmb3IocD0wO3A8ci5s
+ZW5ndGg7KytwKXtvPXJbcF0Kbj0kLng3LiQxKG8pCmlmKG4hPW51bGwpe209SC5WRihvLHNbb10sbikK
+aWYobSE9bnVsbCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KG4sdi5kaXNwYXRjaFByb3BlcnR5TmFtZSx7
+dmFsdWU6bSxlbnVtZXJhYmxlOmZhbHNlLHdyaXRhYmxlOnRydWUsY29uZmlndXJhYmxlOnRydWV9KQpx
+LnByb3RvdHlwZT1ufX19fWZvcihwPTA7cDxyLmxlbmd0aDsrK3Ape289cltwXQppZigvXltBLVphLXpf
+XS8udGVzdChvKSl7bD1zW29dCnNbIiEiK29dPWwKc1sifiIrb109bApzWyItIitvXT1sCnNbIisiK29d
+PWwKc1siKiIrb109bH19fSwKa086ZnVuY3Rpb24oKXt2YXIgcyxyLHEscCxvLG4sbT1DLllxKCkKbT1I
+LnVkKEMuS1UsSC51ZChDLmZRLEgudWQoQy5pNyxILnVkKEMuaTcsSC51ZChDLnhpLEgudWQoQy5kayxI
+LnVkKEMud2IoQy5PNCksbSkpKSkpKSkKaWYodHlwZW9mIGRhcnROYXRpdmVEaXNwYXRjaEhvb2tzVHJh
+bnNmb3JtZXIhPSJ1bmRlZmluZWQiKXtzPWRhcnROYXRpdmVEaXNwYXRjaEhvb2tzVHJhbnNmb3JtZXIK
+aWYodHlwZW9mIHM9PSJmdW5jdGlvbiIpcz1bc10KaWYocy5jb25zdHJ1Y3Rvcj09QXJyYXkpZm9yKHI9
+MDtyPHMubGVuZ3RoOysrcil7cT1zW3JdCmlmKHR5cGVvZiBxPT0iZnVuY3Rpb24iKW09cShtKXx8bX19
+cD1tLmdldFRhZwpvPW0uZ2V0VW5rbm93blRhZwpuPW0ucHJvdG90eXBlRm9yVGFnCiQuTkY9bmV3IEgu
+ZEMocCkKJC5UWD1uZXcgSC53TihvKQokLng3PW5ldyBILlZYKG4pfSwKdWQ6ZnVuY3Rpb24oYSxiKXty
+ZXR1cm4gYShiKXx8Yn0sCnY0OmZ1bmN0aW9uKGEsYixjLGQsZSxmKXt2YXIgcz1iPyJtIjoiIixyPWM/
+IiI6ImkiLHE9ZD8idSI6IiIscD1lPyJzIjoiIixvPWY/ImciOiIiLG49ZnVuY3Rpb24oZyxoKXt0cnl7
+cmV0dXJuIG5ldyBSZWdFeHAoZyxoKX1jYXRjaChtKXtyZXR1cm4gbX19KGEscytyK3ErcCtvKQppZihu
+IGluc3RhbmNlb2YgUmVnRXhwKXJldHVybiBuCnRocm93IEguYihQLnJyKCJJbGxlZ2FsIFJlZ0V4cCBw
+YXR0ZXJuICgiK1N0cmluZyhuKSsiKSIsYSxudWxsKSl9LApTUTpmdW5jdGlvbihhLGIsYyl7dmFyIHMK
+aWYodHlwZW9mIGI9PSJzdHJpbmciKXJldHVybiBhLmluZGV4T2YoYixjKT49MAplbHNlIGlmKGIgaW5z
+dGFuY2VvZiBILlZSKXtzPUMueEIuRyhhLGMpCnJldHVybiBiLmIudGVzdChzKX1lbHNle3M9Si5GTChi
+LEMueEIuRyhhLGMpKQpyZXR1cm4hcy5nbDAocyl9fSwKQTQ6ZnVuY3Rpb24oYSl7aWYoYS5pbmRleE9m
+KCIkIiwwKT49MClyZXR1cm4gYS5yZXBsYWNlKC9cJC9nLCIkJCQkIikKcmV0dXJuIGF9LAplQTpmdW5j
+dGlvbihhKXtpZigvW1tcXXt9KCkqKz8uXFxeJHxdLy50ZXN0KGEpKXJldHVybiBhLnJlcGxhY2UoL1tb
+XF17fSgpKis/LlxcXiR8XS9nLCJcXCQmIikKcmV0dXJuIGF9LAp5czpmdW5jdGlvbihhLGIsYyl7dmFy
+IHM9SC5uTShhLGIsYykKcmV0dXJuIHN9LApuTTpmdW5jdGlvbihhLGIsYyl7dmFyIHMscixxLHAKaWYo
+Yj09PSIiKXtpZihhPT09IiIpcmV0dXJuIGMKcz1hLmxlbmd0aApmb3Iocj1jLHE9MDtxPHM7KytxKXI9
+cithW3FdK2MKcmV0dXJuIHIuY2hhckNvZGVBdCgwKT09MD9yOnJ9cD1hLmluZGV4T2YoYiwwKQppZihw
+PDApcmV0dXJuIGEKaWYoYS5sZW5ndGg8NTAwfHxjLmluZGV4T2YoIiQiLDApPj0wKXJldHVybiBhLnNw
+bGl0KGIpLmpvaW4oYykKcmV0dXJuIGEucmVwbGFjZShuZXcgUmVnRXhwKEguZUEoYiksJ2cnKSxILkE0
+KGMpKX0sClBEOmZ1bmN0aW9uIFBEKGEsYil7dGhpcy5hPWEKdGhpcy4kdGk9Yn0sCldVOmZ1bmN0aW9u
+IFdVKCl7fSwKTFA6ZnVuY3Rpb24gTFAoYSxiLGMsZCl7dmFyIF89dGhpcwpfLmE9YQpfLmI9YgpfLmM9
+YwpfLiR0aT1kfSwKWFI6ZnVuY3Rpb24gWFIoYSxiKXt0aGlzLmE9YQp0aGlzLiR0aT1ifSwKTEk6ZnVu
+Y3Rpb24gTEkoYSxiLGMsZCxlKXt2YXIgXz10aGlzCl8uYT1hCl8uYz1iCl8uZD1jCl8uZT1kCl8uZj1l
+fSwKQ2o6ZnVuY3Rpb24gQ2ooYSxiLGMpe3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMuYz1jfSwKZjk6ZnVu
+Y3Rpb24gZjkoYSxiLGMsZCxlLGYpe3ZhciBfPXRoaXMKXy5hPWEKXy5iPWIKXy5jPWMKXy5kPWQKXy5l
+PWUKXy5mPWZ9LApXMDpmdW5jdGlvbiBXMChhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKYXo6ZnVuY3Rp
+b24gYXooYSxiLGMpe3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMuYz1jfSwKdlY6ZnVuY3Rpb24gdlYoYSl7
+dGhpcy5hPWF9LAp0ZTpmdW5jdGlvbiB0ZShhKXt0aGlzLmE9YX0sCmJxOmZ1bmN0aW9uIGJxKGEsYil7
+dGhpcy5hPWEKdGhpcy5iPWJ9LApYTzpmdW5jdGlvbiBYTyhhKXt0aGlzLmE9YQp0aGlzLmI9bnVsbH0s
+ClRwOmZ1bmN0aW9uIFRwKCl7fSwKbGM6ZnVuY3Rpb24gbGMoKXt9LAp6eDpmdW5jdGlvbiB6eCgpe30s
+CnJUOmZ1bmN0aW9uIHJUKGEsYixjLGQpe3ZhciBfPXRoaXMKXy5hPWEKXy5iPWIKXy5jPWMKXy5kPWR9
+LApFcTpmdW5jdGlvbiBFcShhKXt0aGlzLmE9YX0sCmtZOmZ1bmN0aW9uIGtZKGEpe3RoaXMuYT1hfSwK
+a3I6ZnVuY3Rpb24ga3IoKXt9LApONTpmdW5jdGlvbiBONShhKXt2YXIgXz10aGlzCl8uYT0wCl8uZj1f
+LmU9Xy5kPV8uYz1fLmI9bnVsbApfLnI9MApfLiR0aT1hfSwKdmg6ZnVuY3Rpb24gdmgoYSxiKXt2YXIg
+Xz10aGlzCl8uYT1hCl8uYj1iCl8uZD1fLmM9bnVsbH0sCmk1OmZ1bmN0aW9uIGk1KGEsYil7dGhpcy5h
+PWEKdGhpcy4kdGk9Yn0sCk42OmZ1bmN0aW9uIE42KGEsYixjKXt2YXIgXz10aGlzCl8uYT1hCl8uYj1i
+Cl8uZD1fLmM9bnVsbApfLiR0aT1jfSwKZEM6ZnVuY3Rpb24gZEMoYSl7dGhpcy5hPWF9LAp3TjpmdW5j
+dGlvbiB3TihhKXt0aGlzLmE9YX0sClZYOmZ1bmN0aW9uIFZYKGEpe3RoaXMuYT1hfSwKVlI6ZnVuY3Rp
+b24gVlIoYSxiKXt2YXIgXz10aGlzCl8uYT1hCl8uYj1iCl8uZD1fLmM9bnVsbH0sCkVLOmZ1bmN0aW9u
+IEVLKGEpe3RoaXMuYj1hfSwKS1c6ZnVuY3Rpb24gS1coYSxiLGMpe3RoaXMuYT1hCnRoaXMuYj1iCnRo
+aXMuYz1jfSwKUGI6ZnVuY3Rpb24gUGIoYSxiLGMpe3ZhciBfPXRoaXMKXy5hPWEKXy5iPWIKXy5jPWMK
+Xy5kPW51bGx9LAp0UTpmdW5jdGlvbiB0UShhLGIpe3RoaXMuYT1hCnRoaXMuYz1ifSwKdW46ZnVuY3Rp
+b24gdW4oYSxiLGMpe3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMuYz1jfSwKU2Q6ZnVuY3Rpb24gU2QoYSxi
+LGMpe3ZhciBfPXRoaXMKXy5hPWEKXy5iPWIKXy5jPWMKXy5kPW51bGx9LApYRjpmdW5jdGlvbihhKXty
+ZXR1cm4gYX0sCm9kOmZ1bmN0aW9uKGEsYixjKXtpZihhPj4+MCE9PWF8fGE+PWMpdGhyb3cgSC5iKEgu
+SFkoYixhKSl9LApyTTpmdW5jdGlvbihhLGIsYyl7dmFyIHMKaWYoIShhPj4+MCE9PWEpKXM9Yj4+PjAh
+PT1ifHxhPmJ8fGI+YwplbHNlIHM9ITAKaWYocyl0aHJvdyBILmIoSC5hdShhLGIsYykpCnJldHVybiBi
+fSwKRVQ6ZnVuY3Rpb24gRVQoKXt9LApYSDpmdW5jdGlvbiBYSCgpe30sCkRnOmZ1bmN0aW9uIERnKCl7
+fSwKUGc6ZnVuY3Rpb24gUGcoKXt9LAp4ajpmdW5jdGlvbiB4aigpe30sCmRFOmZ1bmN0aW9uIGRFKCl7
+fSwKWkE6ZnVuY3Rpb24gWkEoKXt9LApkVDpmdW5jdGlvbiBkVCgpe30sClBxOmZ1bmN0aW9uIFBxKCl7
+fSwKZUU6ZnVuY3Rpb24gZUUoKXt9LApWNjpmdW5jdGlvbiBWNigpe30sClJHOmZ1bmN0aW9uIFJHKCl7
+fSwKVlA6ZnVuY3Rpb24gVlAoKXt9LApXQjpmdW5jdGlvbiBXQigpe30sClpHOmZ1bmN0aW9uIFpHKCl7
+fSwKY3o6ZnVuY3Rpb24oYSxiKXt2YXIgcz1iLmMKcmV0dXJuIHM9PW51bGw/Yi5jPUguQihhLGIueiwh
+MCk6c30sCnhaOmZ1bmN0aW9uKGEsYil7dmFyIHM9Yi5jCnJldHVybiBzPT1udWxsP2IuYz1ILkooYSwi
+YjgiLFtiLnpdKTpzfSwKUTE6ZnVuY3Rpb24oYSl7dmFyIHM9YS55CmlmKHM9PT02fHxzPT09N3x8cz09
+PTgpcmV0dXJuIEguUTEoYS56KQpyZXR1cm4gcz09PTExfHxzPT09MTJ9LAptRDpmdW5jdGlvbihhKXty
+ZXR1cm4gYS5jeX0sCk4wOmZ1bmN0aW9uKGEpe3JldHVybiBILkUodi50eXBlVW5pdmVyc2UsYSwhMSl9
+LApQTDpmdW5jdGlvbihhLGIsYTAsYTEpe3ZhciBzLHIscSxwLG8sbixtLGwsayxqLGksaCxnLGYsZSxk
+LGM9Yi55CnN3aXRjaChjKXtjYXNlIDU6Y2FzZSAxOmNhc2UgMjpjYXNlIDM6Y2FzZSA0OnJldHVybiBi
+CmNhc2UgNjpzPWIuegpyPUguUEwoYSxzLGEwLGExKQppZihyPT09cylyZXR1cm4gYgpyZXR1cm4gSC5D
+KGEsciwhMCkKY2FzZSA3OnM9Yi56CnI9SC5QTChhLHMsYTAsYTEpCmlmKHI9PT1zKXJldHVybiBiCnJl
+dHVybiBILkIoYSxyLCEwKQpjYXNlIDg6cz1iLnoKcj1ILlBMKGEscyxhMCxhMSkKaWYocj09PXMpcmV0
+dXJuIGIKcmV0dXJuIEguZihhLHIsITApCmNhc2UgOTpxPWIuUQpwPUguYlooYSxxLGEwLGExKQppZihw
+PT09cSlyZXR1cm4gYgpyZXR1cm4gSC5KKGEsYi56LHApCmNhc2UgMTA6bz1iLnoKbj1ILlBMKGEsbyxh
+MCxhMSkKbT1iLlEKbD1ILmJaKGEsbSxhMCxhMSkKaWYobj09PW8mJmw9PT1tKXJldHVybiBiCnJldHVy
+biBILmEoYSxuLGwpCmNhc2UgMTE6az1iLnoKaj1ILlBMKGEsayxhMCxhMSkKaT1iLlEKaD1ILnFUKGEs
+aSxhMCxhMSkKaWYoaj09PWsmJmg9PT1pKXJldHVybiBiCnJldHVybiBILmQoYSxqLGgpCmNhc2UgMTI6
+Zz1iLlEKYTErPWcubGVuZ3RoCmY9SC5iWihhLGcsYTAsYTEpCm89Yi56Cm49SC5QTChhLG8sYTAsYTEp
+CmlmKGY9PT1nJiZuPT09bylyZXR1cm4gYgpyZXR1cm4gSC5EKGEsbixmLCEwKQpjYXNlIDEzOmU9Yi56
+CmlmKGU8YTEpcmV0dXJuIGIKZD1hMFtlLWExXQppZihkPT1udWxsKXJldHVybiBiCnJldHVybiBkCmRl
+ZmF1bHQ6dGhyb3cgSC5iKFAuaFYoIkF0dGVtcHRlZCB0byBzdWJzdGl0dXRlIHVuZXhwZWN0ZWQgUlRJ
+IGtpbmQgIitjKSl9fSwKYlo6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHMscixxLHAsbz1iLmxlbmd0aCxu
+PVtdCmZvcihzPSExLHI9MDtyPG87KytyKXtxPWJbcl0KcD1ILlBMKGEscSxjLGQpCmlmKHAhPT1xKXM9
+ITAKbi5wdXNoKHApfXJldHVybiBzP246Yn0sCnZPOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBzLHIscSxw
+LG8sbixtPWIubGVuZ3RoLGw9W10KZm9yKHM9ITEscj0wO3I8bTtyKz0zKXtxPWJbcl0KcD1iW3IrMV0K
+bz1iW3IrMl0Kbj1ILlBMKGEsbyxjLGQpCmlmKG4hPT1vKXM9ITAKbC5wdXNoKHEpCmwucHVzaChwKQps
+LnB1c2gobil9cmV0dXJuIHM/bDpifSwKcVQ6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHMscj1iLmEscT1I
+LmJaKGEscixjLGQpLHA9Yi5iLG89SC5iWihhLHAsYyxkKSxuPWIuYyxtPUgudk8oYSxuLGMsZCkKaWYo
+cT09PXImJm89PT1wJiZtPT09bilyZXR1cm4gYgpzPW5ldyBILkcoKQpzLmE9cQpzLmI9bwpzLmM9bQpy
+ZXR1cm4gc30sClZNOmZ1bmN0aW9uKGEsYil7YVt2LmFycmF5UnRpXT1iCnJldHVybiBhfSwKSlM6ZnVu
+Y3Rpb24oYSl7dmFyIHM9YS4kUwppZihzIT1udWxsKXtpZih0eXBlb2Ygcz09Im51bWJlciIpcmV0dXJu
+IEguQnAocykKcmV0dXJuIGEuJFMoKX1yZXR1cm4gbnVsbH0sClVlOmZ1bmN0aW9uKGEsYil7dmFyIHMK
+aWYoSC5RMShiKSlpZihhIGluc3RhbmNlb2YgSC5UcCl7cz1ILkpTKGEpCmlmKHMhPW51bGwpcmV0dXJu
+IHN9cmV0dXJuIEgueihhKX0sCno6ZnVuY3Rpb24oYSl7dmFyIHMKaWYoYSBpbnN0YW5jZW9mIFAuTWgp
+e3M9YS4kdGkKcmV0dXJuIHMhPW51bGw/czpILlZVKGEpfWlmKEFycmF5LmlzQXJyYXkoYSkpcmV0dXJu
+IEgudDYoYSkKcmV0dXJuIEguVlUoSi5pYShhKSl9LAp0NjpmdW5jdGlvbihhKXt2YXIgcz1hW3YuYXJy
+YXlSdGldLHI9dC54CmlmKHM9PW51bGwpcmV0dXJuIHIKaWYocy5jb25zdHJ1Y3RvciE9PXIuY29uc3Ry
+dWN0b3IpcmV0dXJuIHIKcmV0dXJuIHN9LApMaDpmdW5jdGlvbihhKXt2YXIgcz1hLiR0aQpyZXR1cm4g
+cyE9bnVsbD9zOkguVlUoYSl9LApWVTpmdW5jdGlvbihhKXt2YXIgcz1hLmNvbnN0cnVjdG9yLHI9cy4k
+Y2NhY2hlCmlmKHIhPW51bGwpcmV0dXJuIHIKcmV0dXJuIEgucjkoYSxzKX0sCnI5OmZ1bmN0aW9uKGEs
+Yil7dmFyIHM9YSBpbnN0YW5jZW9mIEguVHA/YS5fX3Byb3RvX18uX19wcm90b19fLmNvbnN0cnVjdG9y
+OmIscj1ILmFpKHYudHlwZVVuaXZlcnNlLHMubmFtZSkKYi4kY2NhY2hlPXIKcmV0dXJuIHJ9LApCcDpm
+dW5jdGlvbihhKXt2YXIgcyxyLHEKSC51UChhKQpzPXYudHlwZXMKcj1zW2FdCmlmKHR5cGVvZiByPT0i
+c3RyaW5nIil7cT1ILkUodi50eXBlVW5pdmVyc2UsciwhMSkKc1thXT1xCnJldHVybiBxfXJldHVybiBy
+fSwKSko6ZnVuY3Rpb24oYSl7dmFyIHMscixxPXRoaXMscD10LksKaWYocT09PXApcmV0dXJuIEguUkUo
+cSxhLEgua2UpCmlmKCFILkE4KHEpKWlmKCEocT09PXQuXykpcD1xPT09cAplbHNlIHA9ITAKZWxzZSBw
+PSEwCmlmKHApcmV0dXJuIEguUkUocSxhLEguSXcpCnA9cS55CnM9cD09PTY/cS56OnEKaWYocz09PXQu
+UylyPUgub2sKZWxzZSBpZihzPT09dC5nUnx8cz09PXQuZGkpcj1ILktICmVsc2UgaWYocz09PXQuTily
+PUguTU0KZWxzZSByPXM9PT10Lnk/SC5sOm51bGwKaWYociE9bnVsbClyZXR1cm4gSC5SRShxLGEscikK
+aWYocy55PT09OSl7cD1zLnoKaWYocy5RLmV2ZXJ5KEguY2MpKXtxLnI9IiRpIitwCnJldHVybiBILlJF
+KHEsYSxILnQ0KX19ZWxzZSBpZihwPT09NylyZXR1cm4gSC5SRShxLGEsSC5BUSkKcmV0dXJuIEguUkUo
+cSxhLEguWU8pfSwKUkU6ZnVuY3Rpb24oYSxiLGMpe2EuYj1jCnJldHVybiBhLmIoYil9LApBdTpmdW5j
+dGlvbihhKXt2YXIgcyxyLHE9dGhpcwppZighSC5BOChxKSlpZighKHE9PT10Ll8pKXM9cT09PXQuSwpl
+bHNlIHM9ITAKZWxzZSBzPSEwCmlmKHMpcj1ILmhuCmVsc2UgaWYocT09PXQuSylyPUguVGkKZWxzZSBy
+PUgubDQKcS5hPXIKcmV0dXJuIHEuYShhKX0sClFqOmZ1bmN0aW9uKGEpe3ZhciBzLHI9YS55CmlmKCFI
+LkE4KGEpKWlmKCEoYT09PXQuXykpaWYoIShhPT09dC5jRikpaWYociE9PTcpcz1yPT09OCYmSC5Raihh
+LnopfHxhPT09dC5QfHxhPT09dC5UCmVsc2Ugcz0hMAplbHNlIHM9ITAKZWxzZSBzPSEwCmVsc2Ugcz0h
+MApyZXR1cm4gc30sCllPOmZ1bmN0aW9uKGEpe3ZhciBzPXRoaXMKaWYoYT09bnVsbClyZXR1cm4gSC5R
+aihzKQpyZXR1cm4gSC5XZSh2LnR5cGVVbml2ZXJzZSxILlVlKGEscyksbnVsbCxzLG51bGwpfSwKQVE6
+ZnVuY3Rpb24oYSl7aWYoYT09bnVsbClyZXR1cm4hMApyZXR1cm4gdGhpcy56LmIoYSl9LAp0NDpmdW5j
+dGlvbihhKXt2YXIgcyxyPXRoaXMKaWYoYT09bnVsbClyZXR1cm4gSC5RaihyKQpzPXIucgppZihhIGlu
+c3RhbmNlb2YgUC5NaClyZXR1cm4hIWFbc10KcmV0dXJuISFKLmlhKGEpW3NdfSwKT3o6ZnVuY3Rpb24o
+YSl7dmFyIHM9dGhpcwppZihhPT1udWxsKXJldHVybiBhCmVsc2UgaWYocy5iKGEpKXJldHVybiBhCkgu
+bTQoYSxzKX0sCmw0OmZ1bmN0aW9uKGEpe3ZhciBzPXRoaXMKaWYoYT09bnVsbClyZXR1cm4gYQplbHNl
+IGlmKHMuYihhKSlyZXR1cm4gYQpILm00KGEscyl9LAptNDpmdW5jdGlvbihhLGIpe3Rocm93IEguYihI
+LlpjKEguV0soYSxILlVlKGEsYiksSC5kbShiLG51bGwpKSkpfSwKRGg6ZnVuY3Rpb24oYSxiLGMsZCl7
+dmFyIHM9bnVsbAppZihILldlKHYudHlwZVVuaXZlcnNlLGEscyxiLHMpKXJldHVybiBhCnRocm93IEgu
+YihILlpjKCJUaGUgdHlwZSBhcmd1bWVudCAnIitILkVqKEguZG0oYSxzKSkrIicgaXMgbm90IGEgc3Vi
+dHlwZSBvZiB0aGUgdHlwZSB2YXJpYWJsZSBib3VuZCAnIitILkVqKEguZG0oYixzKSkrIicgb2YgdHlw
+ZSB2YXJpYWJsZSAnIitILkVqKGMpKyInIGluICciK0guRWooZCkrIicuIikpfSwKV0s6ZnVuY3Rpb24o
+YSxiLGMpe3ZhciBzPVAuaGwoYSkscj1ILmRtKGI9PW51bGw/SC56KGEpOmIsbnVsbCkKcmV0dXJuIHMr
+IjogdHlwZSAnIitILkVqKHIpKyInIGlzIG5vdCBhIHN1YnR5cGUgb2YgdHlwZSAnIitILkVqKGMpKyIn
+In0sClpjOmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgSC5pTSgiVHlwZUVycm9yOiAiK2EpfSwKcTpmdW5j
+dGlvbihhLGIpe3JldHVybiBuZXcgSC5pTSgiVHlwZUVycm9yOiAiK0guV0soYSxudWxsLGIpKX0sCmtl
+OmZ1bmN0aW9uKGEpe3JldHVybiBhIT1udWxsfSwKVGk6ZnVuY3Rpb24oYSl7cmV0dXJuIGF9LApJdzpm
+dW5jdGlvbihhKXtyZXR1cm4hMH0sCmhuOmZ1bmN0aW9uKGEpe3JldHVybiBhfSwKbDpmdW5jdGlvbihh
+KXtyZXR1cm4hMD09PWF8fCExPT09YX0sCnA4OmZ1bmN0aW9uKGEpe2lmKCEwPT09YSlyZXR1cm4hMApp
+ZighMT09PWEpcmV0dXJuITEKdGhyb3cgSC5iKEgucShhLCJib29sIikpfSwKeTg6ZnVuY3Rpb24oYSl7
+aWYoITA9PT1hKXJldHVybiEwCmlmKCExPT09YSlyZXR1cm4hMQppZihhPT1udWxsKXJldHVybiBhCnRo
+cm93IEguYihILnEoYSwiYm9vbCIpKX0sCmRwOmZ1bmN0aW9uKGEpe2lmKCEwPT09YSlyZXR1cm4hMApp
+ZighMT09PWEpcmV0dXJuITEKaWYoYT09bnVsbClyZXR1cm4gYQp0aHJvdyBILmIoSC5xKGEsImJvb2w/
+IikpfSwKRkc6ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGE9PSJudW1iZXIiKXJldHVybiBhCnRocm93IEgu
+YihILnEoYSwiZG91YmxlIikpfSwKR0g6ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGE9PSJudW1iZXIiKXJl
+dHVybiBhCmlmKGE9PW51bGwpcmV0dXJuIGEKdGhyb3cgSC5iKEgucShhLCJkb3VibGUiKSl9LApRazpm
+dW5jdGlvbihhKXtpZih0eXBlb2YgYT09Im51bWJlciIpcmV0dXJuIGEKaWYoYT09bnVsbClyZXR1cm4g
+YQp0aHJvdyBILmIoSC5xKGEsImRvdWJsZT8iKSl9LApvazpmdW5jdGlvbihhKXtyZXR1cm4gdHlwZW9m
+IGE9PSJudW1iZXIiJiZNYXRoLmZsb29yKGEpPT09YX0sCklaOmZ1bmN0aW9uKGEpe2lmKHR5cGVvZiBh
+PT0ibnVtYmVyIiYmTWF0aC5mbG9vcihhKT09PWEpcmV0dXJuIGEKdGhyb3cgSC5iKEgucShhLCJpbnQi
+KSl9LAp1UDpmdW5jdGlvbihhKXtpZih0eXBlb2YgYT09Im51bWJlciImJk1hdGguZmxvb3IoYSk9PT1h
+KXJldHVybiBhCmlmKGE9PW51bGwpcmV0dXJuIGEKdGhyb3cgSC5iKEgucShhLCJpbnQiKSl9LApVYzpm
+dW5jdGlvbihhKXtpZih0eXBlb2YgYT09Im51bWJlciImJk1hdGguZmxvb3IoYSk9PT1hKXJldHVybiBh
+CmlmKGE9PW51bGwpcmV0dXJuIGEKdGhyb3cgSC5iKEgucShhLCJpbnQ/IikpfSwKS0g6ZnVuY3Rpb24o
+YSl7cmV0dXJuIHR5cGVvZiBhPT0ibnVtYmVyIn0sCno1OmZ1bmN0aW9uKGEpe2lmKHR5cGVvZiBhPT0i
+bnVtYmVyIilyZXR1cm4gYQp0aHJvdyBILmIoSC5xKGEsIm51bSIpKX0sClcxOmZ1bmN0aW9uKGEpe2lm
+KHR5cGVvZiBhPT0ibnVtYmVyIilyZXR1cm4gYQppZihhPT1udWxsKXJldHVybiBhCnRocm93IEguYihI
+LnEoYSwibnVtIikpfSwKY1U6ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGE9PSJudW1iZXIiKXJldHVybiBh
+CmlmKGE9PW51bGwpcmV0dXJuIGEKdGhyb3cgSC5iKEgucShhLCJudW0/IikpfSwKTU06ZnVuY3Rpb24o
+YSl7cmV0dXJuIHR5cGVvZiBhPT0ic3RyaW5nIn0sCkJ0OmZ1bmN0aW9uKGEpe2lmKHR5cGVvZiBhPT0i
+c3RyaW5nIilyZXR1cm4gYQp0aHJvdyBILmIoSC5xKGEsIlN0cmluZyIpKX0sCmg6ZnVuY3Rpb24oYSl7
+aWYodHlwZW9mIGE9PSJzdHJpbmciKXJldHVybiBhCmlmKGE9PW51bGwpcmV0dXJuIGEKdGhyb3cgSC5i
+KEgucShhLCJTdHJpbmciKSl9LAprOmZ1bmN0aW9uKGEpe2lmKHR5cGVvZiBhPT0ic3RyaW5nIilyZXR1
+cm4gYQppZihhPT1udWxsKXJldHVybiBhCnRocm93IEguYihILnEoYSwiU3RyaW5nPyIpKX0sCmlvOmZ1
+bmN0aW9uKGEsYil7dmFyIHMscixxCmZvcihzPSIiLHI9IiIscT0wO3E8YS5sZW5ndGg7KytxLHI9Iiwg
+IilzKz1DLnhCLmgocixILmRtKGFbcV0sYikpCnJldHVybiBzfSwKYkk6ZnVuY3Rpb24oYTUsYTYsYTcp
+e3ZhciBzLHIscSxwLG8sbixtLGwsayxqLGksaCxnLGYsZSxkLGMsYixhLGEwLGExLGEyLGEzLGE0PSIs
+ICIKaWYoYTchPW51bGwpe3M9YTcubGVuZ3RoCmlmKGE2PT1udWxsKXthNj1ILlZNKFtdLHQucykKcj1u
+dWxsfWVsc2Ugcj1hNi5sZW5ndGgKcT1hNi5sZW5ndGgKZm9yKHA9cztwPjA7LS1wKUMuTm0uaShhNiwi
+VCIrKHErcCkpCmZvcihvPXQuUixuPXQuXyxtPXQuSyxsPSI8IixrPSIiLHA9MDtwPHM7KytwLGs9YTQp
+e2wrPWsKaj1hNi5sZW5ndGgKaT1qLTEtcAppZihpPDApcmV0dXJuIEguT0goYTYsaSkKbD1DLnhCLmgo
+bCxhNltpXSkKaD1hN1twXQpnPWgueQppZighKGc9PT0yfHxnPT09M3x8Zz09PTR8fGc9PT01fHxoPT09
+bykpaWYoIShoPT09bikpaj1oPT09bQplbHNlIGo9ITAKZWxzZSBqPSEwCmlmKCFqKWwrPUMueEIuaCgi
+IGV4dGVuZHMgIixILmRtKGgsYTYpKX1sKz0iPiJ9ZWxzZXtsPSIiCnI9bnVsbH1vPWE1LnoKZj1hNS5R
+CmU9Zi5hCmQ9ZS5sZW5ndGgKYz1mLmIKYj1jLmxlbmd0aAphPWYuYwphMD1hLmxlbmd0aAphMT1ILmRt
+KG8sYTYpCmZvcihhMj0iIixhMz0iIixwPTA7cDxkOysrcCxhMz1hNClhMis9Qy54Qi5oKGEzLEguZG0o
+ZVtwXSxhNikpCmlmKGI+MCl7YTIrPWEzKyJbIgpmb3IoYTM9IiIscD0wO3A8YjsrK3AsYTM9YTQpYTIr
+PUMueEIuaChhMyxILmRtKGNbcF0sYTYpKQphMis9Il0ifWlmKGEwPjApe2EyKz1hMysieyIKZm9yKGEz
+PSIiLHA9MDtwPGEwO3ArPTMsYTM9YTQpe2EyKz1hMwppZihhW3ArMV0pYTIrPSJyZXF1aXJlZCAiCmEy
+Kz1KLmJiKEguZG0oYVtwKzJdLGE2KSwiICIpK2FbcF19YTIrPSJ9In1pZihyIT1udWxsKXthNi50b1N0
+cmluZwphNi5sZW5ndGg9cn1yZXR1cm4gbCsiKCIrYTIrIikgPT4gIitILkVqKGExKX0sCmRtOmZ1bmN0
+aW9uKGEsYil7dmFyIHMscixxLHAsbyxuLG0sbD1hLnkKaWYobD09PTUpcmV0dXJuImVyYXNlZCIKaWYo
+bD09PTIpcmV0dXJuImR5bmFtaWMiCmlmKGw9PT0zKXJldHVybiJ2b2lkIgppZihsPT09MSlyZXR1cm4i
+TmV2ZXIiCmlmKGw9PT00KXJldHVybiJhbnkiCmlmKGw9PT02KXtzPUguZG0oYS56LGIpCnJldHVybiBz
+fWlmKGw9PT03KXtyPWEuegpzPUguZG0ocixiKQpxPXIueQpyZXR1cm4gSi5iYihxPT09MTF8fHE9PT0x
+Mj9DLnhCLmgoIigiLHMpKyIpIjpzLCI/Iil9aWYobD09PTgpcmV0dXJuIkZ1dHVyZU9yPCIrSC5FaihI
+LmRtKGEueixiKSkrIj4iCmlmKGw9PT05KXtwPUgubzMoYS56KQpvPWEuUQpyZXR1cm4gby5sZW5ndGgh
+PT0wP3ArKCI8IitILmlvKG8sYikrIj4iKTpwfWlmKGw9PT0xMSlyZXR1cm4gSC5iSShhLGIsbnVsbCkK
+aWYobD09PTEyKXJldHVybiBILmJJKGEueixiLGEuUSkKaWYobD09PTEzKXtiLnRvU3RyaW5nCm49YS56
+Cm09Yi5sZW5ndGgKbj1tLTEtbgppZihuPDB8fG4+PW0pcmV0dXJuIEguT0goYixuKQpyZXR1cm4gYltu
+XX1yZXR1cm4iPyJ9LApvMzpmdW5jdGlvbihhKXt2YXIgcyxyPUguSmcoYSkKaWYociE9bnVsbClyZXR1
+cm4gcgpzPSJtaW5pZmllZDoiK2EKcmV0dXJuIHN9LApRbzpmdW5jdGlvbihhLGIpe3ZhciBzPWEudFJb
+Yl0KZm9yKDt0eXBlb2Ygcz09InN0cmluZyI7KXM9YS50UltzXQpyZXR1cm4gc30sCmFpOmZ1bmN0aW9u
+KGEsYil7dmFyIHMscixxLHAsbyxuPWEuZVQsbT1uW2JdCmlmKG09PW51bGwpcmV0dXJuIEguRShhLGIs
+ITEpCmVsc2UgaWYodHlwZW9mIG09PSJudW1iZXIiKXtzPW0Kcj1ILm0oYSw1LCIjIikKcT1bXQpmb3Io
+cD0wO3A8czsrK3ApcS5wdXNoKHIpCm89SC5KKGEsYixxKQpuW2JdPW8KcmV0dXJuIG99ZWxzZSByZXR1
+cm4gbX0sCnhiOmZ1bmN0aW9uKGEsYil7cmV0dXJuIEguSXgoYS50UixiKX0sCkZGOmZ1bmN0aW9uKGEs
+Yil7cmV0dXJuIEguSXgoYS5lVCxiKX0sCkU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBzLHI9YS5lQyxxPXIu
+Z2V0KGIpCmlmKHEhPW51bGwpcmV0dXJuIHEKcz1ILmkoSC5vKGEsbnVsbCxiLGMpKQpyLnNldChiLHMp
+CnJldHVybiBzfSwKY0U6ZnVuY3Rpb24oYSxiLGMpe3ZhciBzLHIscT1iLmNoCmlmKHE9PW51bGwpcT1i
+LmNoPW5ldyBNYXAoKQpzPXEuZ2V0KGMpCmlmKHMhPW51bGwpcmV0dXJuIHMKcj1ILmkoSC5vKGEsYixj
+LCEwKSkKcS5zZXQoYyxyKQpyZXR1cm4gcn0sCnY1OmZ1bmN0aW9uKGEsYixjKXt2YXIgcyxyLHEscD1i
+LmN4CmlmKHA9PW51bGwpcD1iLmN4PW5ldyBNYXAoKQpzPWMuY3kKcj1wLmdldChzKQppZihyIT1udWxs
+KXJldHVybiByCnE9SC5hKGEsYixjLnk9PT0xMD9jLlE6W2NdKQpwLnNldChzLHEpCnJldHVybiBxfSwK
+QkQ6ZnVuY3Rpb24oYSxiKXtiLmE9SC5BdQpiLmI9SC5KSgpyZXR1cm4gYn0sCm06ZnVuY3Rpb24oYSxi
+LGMpe3ZhciBzLHIscT1hLmVDLmdldChjKQppZihxIT1udWxsKXJldHVybiBxCnM9bmV3IEguSmMobnVs
+bCxudWxsKQpzLnk9YgpzLmN5PWMKcj1ILkJEKGEscykKYS5lQy5zZXQoYyxyKQpyZXR1cm4gcn0sCkM6
+ZnVuY3Rpb24oYSxiLGMpe3ZhciBzLHI9Yi5jeSsiKiIscT1hLmVDLmdldChyKQppZihxIT1udWxsKXJl
+dHVybiBxCnM9SC5aNyhhLGIscixjKQphLmVDLnNldChyLHMpCnJldHVybiBzfSwKWjc6ZnVuY3Rpb24o
+YSxiLGMsZCl7dmFyIHMscixxCmlmKGQpe3M9Yi55CmlmKCFILkE4KGIpKXI9Yj09PXQuUHx8Yj09PXQu
+VHx8cz09PTd8fHM9PT02CmVsc2Ugcj0hMAppZihyKXJldHVybiBifXE9bmV3IEguSmMobnVsbCxudWxs
+KQpxLnk9NgpxLno9YgpxLmN5PWMKcmV0dXJuIEguQkQoYSxxKX0sCkI6ZnVuY3Rpb24oYSxiLGMpe3Zh
+ciBzLHI9Yi5jeSsiPyIscT1hLmVDLmdldChyKQppZihxIT1udWxsKXJldHVybiBxCnM9SC5sbChhLGIs
+cixjKQphLmVDLnNldChyLHMpCnJldHVybiBzfSwKbGw6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHMscixx
+LHAKaWYoZCl7cz1iLnkKaWYoIUguQTgoYikpaWYoIShiPT09dC5QfHxiPT09dC5UKSlpZihzIT09Nyly
+PXM9PT04JiZILmxSKGIueikKZWxzZSByPSEwCmVsc2Ugcj0hMAplbHNlIHI9ITAKaWYocilyZXR1cm4g
+YgplbHNlIGlmKHM9PT0xfHxiPT09dC5jRilyZXR1cm4gdC5QCmVsc2UgaWYocz09PTYpe3E9Yi56Cmlm
+KHEueT09PTgmJkgubFIocS56KSlyZXR1cm4gcQplbHNlIHJldHVybiBILmN6KGEsYil9fXA9bmV3IEgu
+SmMobnVsbCxudWxsKQpwLnk9NwpwLno9YgpwLmN5PWMKcmV0dXJuIEguQkQoYSxwKX0sCmY6ZnVuY3Rp
+b24oYSxiLGMpe3ZhciBzLHI9Yi5jeSsiLyIscT1hLmVDLmdldChyKQppZihxIT1udWxsKXJldHVybiBx
+CnM9SC5lVihhLGIscixjKQphLmVDLnNldChyLHMpCnJldHVybiBzfSwKZVY6ZnVuY3Rpb24oYSxiLGMs
+ZCl7dmFyIHMscixxCmlmKGQpe3M9Yi55CmlmKCFILkE4KGIpKWlmKCEoYj09PXQuXykpcj1iPT09dC5L
+CmVsc2Ugcj0hMAplbHNlIHI9ITAKaWYocnx8Yj09PXQuSylyZXR1cm4gYgplbHNlIGlmKHM9PT0xKXJl
+dHVybiBILkooYSwiYjgiLFtiXSkKZWxzZSBpZihiPT09dC5QfHxiPT09dC5UKXJldHVybiB0LmJHfXE9
+bmV3IEguSmMobnVsbCxudWxsKQpxLnk9OApxLno9YgpxLmN5PWMKcmV0dXJuIEguQkQoYSxxKX0sCkg6
+ZnVuY3Rpb24oYSxiKXt2YXIgcyxyLHE9IiIrYisiXiIscD1hLmVDLmdldChxKQppZihwIT1udWxsKXJl
+dHVybiBwCnM9bmV3IEguSmMobnVsbCxudWxsKQpzLnk9MTMKcy56PWIKcy5jeT1xCnI9SC5CRChhLHMp
+CmEuZUMuc2V0KHEscikKcmV0dXJuIHJ9LApVeDpmdW5jdGlvbihhKXt2YXIgcyxyLHEscD1hLmxlbmd0
+aApmb3Iocz0iIixyPSIiLHE9MDtxPHA7KytxLHI9IiwiKXMrPXIrYVtxXS5jeQpyZXR1cm4gc30sClM0
+OmZ1bmN0aW9uKGEpe3ZhciBzLHIscSxwLG8sbixtPWEubGVuZ3RoCmZvcihzPSIiLHI9IiIscT0wO3E8
+bTtxKz0zLHI9IiwiKXtwPWFbcV0Kbz1hW3ErMV0/IiEiOiI6IgpuPWFbcSsyXS5jeQpzKz1yK3Arbytu
+fXJldHVybiBzfSwKSjpmdW5jdGlvbihhLGIsYyl7dmFyIHMscixxLHA9YgppZihjLmxlbmd0aCE9PTAp
+cCs9IjwiK0guVXgoYykrIj4iCnM9YS5lQy5nZXQocCkKaWYocyE9bnVsbClyZXR1cm4gcwpyPW5ldyBI
+LkpjKG51bGwsbnVsbCkKci55PTkKci56PWIKci5RPWMKaWYoYy5sZW5ndGg+MClyLmM9Y1swXQpyLmN5
+PXAKcT1ILkJEKGEscikKYS5lQy5zZXQocCxxKQpyZXR1cm4gcX0sCmE6ZnVuY3Rpb24oYSxiLGMpe3Zh
+ciBzLHIscSxwLG8sbgppZihiLnk9PT0xMCl7cz1iLnoKcj1iLlEuY29uY2F0KGMpfWVsc2V7cj1jCnM9
+Yn1xPXMuY3krKCI7PCIrSC5VeChyKSsiPiIpCnA9YS5lQy5nZXQocSkKaWYocCE9bnVsbClyZXR1cm4g
+cApvPW5ldyBILkpjKG51bGwsbnVsbCkKby55PTEwCm8uej1zCm8uUT1yCm8uY3k9cQpuPUguQkQoYSxv
+KQphLmVDLnNldChxLG4pCnJldHVybiBufSwKZDpmdW5jdGlvbihhLGIsYyl7dmFyIHMscixxLHAsbyxu
+PWIuY3ksbT1jLmEsbD1tLmxlbmd0aCxrPWMuYixqPWsubGVuZ3RoLGk9Yy5jLGg9aS5sZW5ndGgsZz0i
+KCIrSC5VeChtKQppZihqPjApe3M9bD4wPyIsIjoiIgpyPUguVXgoaykKZys9cysiWyIrcisiXSJ9aWYo
+aD4wKXtzPWw+MD8iLCI6IiIKcj1ILlM0KGkpCmcrPXMrInsiK3IrIn0ifXE9bisoZysiKSIpCnA9YS5l
+Qy5nZXQocSkKaWYocCE9bnVsbClyZXR1cm4gcApvPW5ldyBILkpjKG51bGwsbnVsbCkKby55PTExCm8u
+ej1iCm8uUT1jCm8uY3k9cQpyPUguQkQoYSxvKQphLmVDLnNldChxLHIpCnJldHVybiByfSwKRDpmdW5j
+dGlvbihhLGIsYyxkKXt2YXIgcyxyPWIuY3krKCI8IitILlV4KGMpKyI+IikscT1hLmVDLmdldChyKQpp
+ZihxIT1udWxsKXJldHVybiBxCnM9SC5odyhhLGIsYyxyLGQpCmEuZUMuc2V0KHIscykKcmV0dXJuIHN9
+LApodzpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBzLHIscSxwLG8sbixtLGwKaWYoZSl7cz1jLmxlbmd0
+aApyPW5ldyBBcnJheShzKQpmb3IocT0wLHA9MDtwPHM7KytwKXtvPWNbcF0KaWYoby55PT09MSl7cltw
+XT1vOysrcX19aWYocT4wKXtuPUguUEwoYSxiLHIsMCkKbT1ILmJaKGEsYyxyLDApCnJldHVybiBILkQo
+YSxuLG0sYyE9PW0pfX1sPW5ldyBILkpjKG51bGwsbnVsbCkKbC55PTEyCmwuej1iCmwuUT1jCmwuY3k9
+ZApyZXR1cm4gSC5CRChhLGwpfSwKbzpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm57dTphLGU6YixyOmMs
+czpbXSxwOjAsbjpkfX0sCmk6ZnVuY3Rpb24oYSl7dmFyIHMscixxLHAsbyxuLG0sbCxrLGosaSxoLGc9
+YS5yLGY9YS5zCmZvcihzPWcubGVuZ3RoLHI9MDtyPHM7KXtxPWcuY2hhckNvZGVBdChyKQppZihxPj00
+OCYmcTw9NTcpcj1ILkEocisxLHEsZyxmKQplbHNlIGlmKCgoKHF8MzIpPj4+MCktOTcmNjU1MzUpPDI2
+fHxxPT09OTV8fHE9PT0zNilyPUgudChhLHIsZyxmLCExKQplbHNlIGlmKHE9PT00NilyPUgudChhLHIs
+ZyxmLCEwKQplbHNleysrcgpzd2l0Y2gocSl7Y2FzZSA0NDpicmVhawpjYXNlIDU4OmYucHVzaCghMSkK
+YnJlYWsKY2FzZSAzMzpmLnB1c2goITApCmJyZWFrCmNhc2UgNTk6Zi5wdXNoKEguSyhhLnUsYS5lLGYu
+cG9wKCkpKQpicmVhawpjYXNlIDk0OmYucHVzaChILkgoYS51LGYucG9wKCkpKQpicmVhawpjYXNlIDM1
+OmYucHVzaChILm0oYS51LDUsIiMiKSkKYnJlYWsKY2FzZSA2NDpmLnB1c2goSC5tKGEudSwyLCJAIikp
+CmJyZWFrCmNhc2UgMTI2OmYucHVzaChILm0oYS51LDMsIn4iKSkKYnJlYWsKY2FzZSA2MDpmLnB1c2go
+YS5wKQphLnA9Zi5sZW5ndGgKYnJlYWsKY2FzZSA2MjpwPWEudQpvPWYuc3BsaWNlKGEucCkKSC5yKGEu
+dSxhLmUsbykKYS5wPWYucG9wKCkKbj1mLnBvcCgpCmlmKHR5cGVvZiBuPT0ic3RyaW5nIilmLnB1c2go
+SC5KKHAsbixvKSkKZWxzZXttPUguSyhwLGEuZSxuKQpzd2l0Y2gobS55KXtjYXNlIDExOmYucHVzaChI
+LkQocCxtLG8sYS5uKSkKYnJlYWsKZGVmYXVsdDpmLnB1c2goSC5hKHAsbSxvKSkKYnJlYWt9fWJyZWFr
+CmNhc2UgMzg6SC5JKGEsZikKYnJlYWsKY2FzZSA0MjpsPWEudQpmLnB1c2goSC5DKGwsSC5LKGwsYS5l
+LGYucG9wKCkpLGEubikpCmJyZWFrCmNhc2UgNjM6bD1hLnUKZi5wdXNoKEguQihsLEguSyhsLGEuZSxm
+LnBvcCgpKSxhLm4pKQpicmVhawpjYXNlIDQ3Omw9YS51CmYucHVzaChILmYobCxILksobCxhLmUsZi5w
+b3AoKSksYS5uKSkKYnJlYWsKY2FzZSA0MDpmLnB1c2goYS5wKQphLnA9Zi5sZW5ndGgKYnJlYWsKY2Fz
+ZSA0MTpwPWEudQprPW5ldyBILkcoKQpqPXAuc0VBCmk9cC5zRUEKbj1mLnBvcCgpCmlmKHR5cGVvZiBu
+PT0ibnVtYmVyIilzd2l0Y2gobil7Y2FzZS0xOmo9Zi5wb3AoKQpicmVhawpjYXNlLTI6aT1mLnBvcCgp
+CmJyZWFrCmRlZmF1bHQ6Zi5wdXNoKG4pCmJyZWFrfWVsc2UgZi5wdXNoKG4pCm89Zi5zcGxpY2UoYS5w
+KQpILnIoYS51LGEuZSxvKQphLnA9Zi5wb3AoKQprLmE9bwprLmI9agprLmM9aQpmLnB1c2goSC5kKHAs
+SC5LKHAsYS5lLGYucG9wKCkpLGspKQpicmVhawpjYXNlIDkxOmYucHVzaChhLnApCmEucD1mLmxlbmd0
+aApicmVhawpjYXNlIDkzOm89Zi5zcGxpY2UoYS5wKQpILnIoYS51LGEuZSxvKQphLnA9Zi5wb3AoKQpm
+LnB1c2gobykKZi5wdXNoKC0xKQpicmVhawpjYXNlIDEyMzpmLnB1c2goYS5wKQphLnA9Zi5sZW5ndGgK
+YnJlYWsKY2FzZSAxMjU6bz1mLnNwbGljZShhLnApCkgueShhLnUsYS5lLG8pCmEucD1mLnBvcCgpCmYu
+cHVzaChvKQpmLnB1c2goLTIpCmJyZWFrCmRlZmF1bHQ6dGhyb3ciQmFkIGNoYXJhY3RlciAiK3F9fX1o
+PWYucG9wKCkKcmV0dXJuIEguSyhhLnUsYS5lLGgpfSwKQTpmdW5jdGlvbihhLGIsYyxkKXt2YXIgcyxy
+LHE9Yi00OApmb3Iocz1jLmxlbmd0aDthPHM7KythKXtyPWMuY2hhckNvZGVBdChhKQppZighKHI+PTQ4
+JiZyPD01NykpYnJlYWsKcT1xKjEwKyhyLTQ4KX1kLnB1c2gocSkKcmV0dXJuIGF9LAp0OmZ1bmN0aW9u
+KGEsYixjLGQsZSl7dmFyIHMscixxLHAsbyxuLG09YisxCmZvcihzPWMubGVuZ3RoO208czsrK20pe3I9
+Yy5jaGFyQ29kZUF0KG0pCmlmKHI9PT00Nil7aWYoZSlicmVhawplPSEwfWVsc2V7aWYoISgoKChyfDMy
+KT4+PjApLTk3JjY1NTM1KTwyNnx8cj09PTk1fHxyPT09MzYpKXE9cj49NDgmJnI8PTU3CmVsc2UgcT0h
+MAppZighcSlicmVha319cD1jLnN1YnN0cmluZyhiLG0pCmlmKGUpe3M9YS51Cm89YS5lCmlmKG8ueT09
+PTEwKW89by56Cm49SC5RbyhzLG8ueilbcF0KaWYobj09bnVsbClILnYoJ05vICInK3ArJyIgaW4gIicr
+SC5tRChvKSsnIicpCmQucHVzaChILmNFKHMsbyxuKSl9ZWxzZSBkLnB1c2gocCkKcmV0dXJuIG19LApJ
+OmZ1bmN0aW9uKGEsYil7dmFyIHM9Yi5wb3AoKQppZigwPT09cyl7Yi5wdXNoKEgubShhLnUsMSwiMCYi
+KSkKcmV0dXJufWlmKDE9PT1zKXtiLnB1c2goSC5tKGEudSw0LCIxJiIpKQpyZXR1cm59dGhyb3cgSC5i
+KFAuaFYoIlVuZXhwZWN0ZWQgZXh0ZW5kZWQgb3BlcmF0aW9uICIrSC5FaihzKSkpfSwKSzpmdW5jdGlv
+bihhLGIsYyl7aWYodHlwZW9mIGM9PSJzdHJpbmciKXJldHVybiBILkooYSxjLGEuc0VBKQplbHNlIGlm
+KHR5cGVvZiBjPT0ibnVtYmVyIilyZXR1cm4gSC5UVihhLGIsYykKZWxzZSByZXR1cm4gY30sCnI6ZnVu
+Y3Rpb24oYSxiLGMpe3ZhciBzLHI9Yy5sZW5ndGgKZm9yKHM9MDtzPHI7KytzKWNbc109SC5LKGEsYixj
+W3NdKX0sCnk6ZnVuY3Rpb24oYSxiLGMpe3ZhciBzLHI9Yy5sZW5ndGgKZm9yKHM9MjtzPHI7cys9Mylj
+W3NdPUguSyhhLGIsY1tzXSl9LApUVjpmdW5jdGlvbihhLGIsYyl7dmFyIHMscixxPWIueQppZihxPT09
+MTApe2lmKGM9PT0wKXJldHVybiBiLnoKcz1iLlEKcj1zLmxlbmd0aAppZihjPD1yKXJldHVybiBzW2Mt
+MV0KYy09cgpiPWIuegpxPWIueX1lbHNlIGlmKGM9PT0wKXJldHVybiBiCmlmKHEhPT05KXRocm93IEgu
+YihQLmhWKCJJbmRleGVkIGJhc2UgbXVzdCBiZSBhbiBpbnRlcmZhY2UgdHlwZSIpKQpzPWIuUQppZihj
+PD1zLmxlbmd0aClyZXR1cm4gc1tjLTFdCnRocm93IEguYihQLmhWKCJCYWQgaW5kZXggIitjKyIgZm9y
+ICIrYi53KDApKSl9LApXZTpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBzLHIscSxwLG8sbixtLGwsayxq
+CmlmKGI9PT1kKXJldHVybiEwCmlmKCFILkE4KGQpKWlmKCEoZD09PXQuXykpcz1kPT09dC5LCmVsc2Ug
+cz0hMAplbHNlIHM9ITAKaWYocylyZXR1cm4hMApyPWIueQppZihyPT09NClyZXR1cm4hMAppZihILkE4
+KGIpKXJldHVybiExCmlmKGIueSE9PTEpcz1iPT09dC5QfHxiPT09dC5UCmVsc2Ugcz0hMAppZihzKXJl
+dHVybiEwCnE9cj09PTEzCmlmKHEpaWYoSC5XZShhLGNbYi56XSxjLGQsZSkpcmV0dXJuITAKcD1kLnkK
+aWYocj09PTYpcmV0dXJuIEguV2UoYSxiLnosYyxkLGUpCmlmKHA9PT02KXtzPWQuegpyZXR1cm4gSC5X
+ZShhLGIsYyxzLGUpfWlmKHI9PT04KXtpZighSC5XZShhLGIueixjLGQsZSkpcmV0dXJuITEKcmV0dXJu
+IEguV2UoYSxILnhaKGEsYiksYyxkLGUpfWlmKHI9PT03KXtzPUguV2UoYSxiLnosYyxkLGUpCnJldHVy
+biBzfWlmKHA9PT04KXtpZihILldlKGEsYixjLGQueixlKSlyZXR1cm4hMApyZXR1cm4gSC5XZShhLGIs
+YyxILnhaKGEsZCksZSl9aWYocD09PTcpe3M9SC5XZShhLGIsYyxkLnosZSkKcmV0dXJuIHN9aWYocSly
+ZXR1cm4hMQpzPXIhPT0xMQppZigoIXN8fHI9PT0xMikmJmQ9PT10LlkpcmV0dXJuITAKaWYocD09PTEy
+KXtpZihiPT09dC5EKXJldHVybiEwCmlmKHIhPT0xMilyZXR1cm4hMQpvPWIuUQpuPWQuUQptPW8ubGVu
+Z3RoCmlmKG0hPT1uLmxlbmd0aClyZXR1cm4hMQpjPWM9PW51bGw/bzpvLmNvbmNhdChjKQplPWU9PW51
+bGw/bjpuLmNvbmNhdChlKQpmb3IobD0wO2w8bTsrK2wpe2s9b1tsXQpqPW5bbF0KaWYoIUguV2UoYSxr
+LGMsaixlKXx8IUguV2UoYSxqLGUsayxjKSlyZXR1cm4hMX1yZXR1cm4gSC5iTyhhLGIueixjLGQueixl
+KX1pZihwPT09MTEpe2lmKGI9PT10LkQpcmV0dXJuITAKaWYocylyZXR1cm4hMQpyZXR1cm4gSC5iTyhh
+LGIsYyxkLGUpfWlmKHI9PT05KXtpZihwIT09OSlyZXR1cm4hMQpyZXR1cm4gSC5wRyhhLGIsYyxkLGUp
+fXJldHVybiExfSwKYk86ZnVuY3Rpb24oYTIsYTMsYTQsYTUsYTYpe3ZhciBzLHIscSxwLG8sbixtLGws
+ayxqLGksaCxnLGYsZSxkLGMsYixhLGEwLGExCmlmKCFILldlKGEyLGEzLnosYTQsYTUueixhNikpcmV0
+dXJuITEKcz1hMy5RCnI9YTUuUQpxPXMuYQpwPXIuYQpvPXEubGVuZ3RoCm49cC5sZW5ndGgKaWYobz5u
+KXJldHVybiExCm09bi1vCmw9cy5iCms9ci5iCmo9bC5sZW5ndGgKaT1rLmxlbmd0aAppZihvK2o8bitp
+KXJldHVybiExCmZvcihoPTA7aDxvOysraCl7Zz1xW2hdCmlmKCFILldlKGEyLHBbaF0sYTYsZyxhNCkp
+cmV0dXJuITF9Zm9yKGg9MDtoPG07KytoKXtnPWxbaF0KaWYoIUguV2UoYTIscFtvK2hdLGE2LGcsYTQp
+KXJldHVybiExfWZvcihoPTA7aDxpOysraCl7Zz1sW20raF0KaWYoIUguV2UoYTIsa1toXSxhNixnLGE0
+KSlyZXR1cm4hMX1mPXMuYwplPXIuYwpkPWYubGVuZ3RoCmM9ZS5sZW5ndGgKZm9yKGI9MCxhPTA7YTxj
+O2ErPTMpe2EwPWVbYV0KZm9yKDshMDspe2lmKGI+PWQpcmV0dXJuITEKYTE9ZltiXQpiKz0zCmlmKGEw
+PGExKXJldHVybiExCmlmKGExPGEwKWNvbnRpbnVlCmc9ZltiLTFdCmlmKCFILldlKGEyLGVbYSsyXSxh
+NixnLGE0KSlyZXR1cm4hMQpicmVha319cmV0dXJuITB9LApwRzpmdW5jdGlvbihhLGIsYyxkLGUpe3Zh
+ciBzLHIscSxwLG8sbixtLGwsaz1iLnosaj1kLnoKaWYoaz09PWope3M9Yi5RCnI9ZC5RCnE9cy5sZW5n
+dGgKZm9yKHA9MDtwPHE7KytwKXtvPXNbcF0Kbj1yW3BdCmlmKCFILldlKGEsbyxjLG4sZSkpcmV0dXJu
+ITF9cmV0dXJuITB9aWYoZD09PXQuSylyZXR1cm4hMAptPUguUW8oYSxrKQppZihtPT1udWxsKXJldHVy
+biExCmw9bVtqXQppZihsPT1udWxsKXJldHVybiExCnE9bC5sZW5ndGgKcj1kLlEKZm9yKHA9MDtwPHE7
+KytwKWlmKCFILldlKGEsSC5jRShhLGIsbFtwXSksYyxyW3BdLGUpKXJldHVybiExCnJldHVybiEwfSwK
+bFI6ZnVuY3Rpb24oYSl7dmFyIHMscj1hLnkKaWYoIShhPT09dC5QfHxhPT09dC5UKSlpZighSC5BOChh
+KSlpZihyIT09NylpZighKHI9PT02JiZILmxSKGEueikpKXM9cj09PTgmJkgubFIoYS56KQplbHNlIHM9
+ITAKZWxzZSBzPSEwCmVsc2Ugcz0hMAplbHNlIHM9ITAKcmV0dXJuIHN9LApjYzpmdW5jdGlvbihhKXt2
+YXIgcwppZighSC5BOChhKSlpZighKGE9PT10Ll8pKXM9YT09PXQuSwplbHNlIHM9ITAKZWxzZSBzPSEw
+CnJldHVybiBzfSwKQTg6ZnVuY3Rpb24oYSl7dmFyIHM9YS55CnJldHVybiBzPT09Mnx8cz09PTN8fHM9
+PT00fHxzPT09NXx8YT09PXQuUn0sCkl4OmZ1bmN0aW9uKGEsYil7dmFyIHMscixxPU9iamVjdC5rZXlz
+KGIpLHA9cS5sZW5ndGgKZm9yKHM9MDtzPHA7KytzKXtyPXFbc10KYVtyXT1iW3JdfX0sCkpjOmZ1bmN0
+aW9uIEpjKGEsYil7dmFyIF89dGhpcwpfLmE9YQpfLmI9YgpfLng9Xy5yPV8uYz1udWxsCl8ueT0wCl8u
+Y3k9Xy5jeD1fLmNoPV8uUT1fLno9bnVsbH0sCkc6ZnVuY3Rpb24gRygpe3RoaXMuYz10aGlzLmI9dGhp
+cy5hPW51bGx9LAprUzpmdW5jdGlvbiBrUygpe30sCmlNOmZ1bmN0aW9uIGlNKGEpe3RoaXMuYT1hfSwK
+Ujk6ZnVuY3Rpb24oYSl7cmV0dXJuIHQudy5iKGEpfHx0LkIuYihhKXx8dC5kei5iKGEpfHx0LkkuYihh
+KXx8dC5BLmIoYSl8fHQuZzQuYihhKXx8dC5nMi5iKGEpfSwKSmc6ZnVuY3Rpb24oYSl7cmV0dXJuIHYu
+bWFuZ2xlZEdsb2JhbE5hbWVzW2FdfX0sSj17ClF1OmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybntpOmEs
+cDpiLGU6Yyx4OmR9fSwKa3M6ZnVuY3Rpb24oYSl7dmFyIHMscixxLHAsbz1hW3YuZGlzcGF0Y2hQcm9w
+ZXJ0eU5hbWVdCmlmKG89PW51bGwpaWYoJC5Cdj09bnVsbCl7SC5YRCgpCm89YVt2LmRpc3BhdGNoUHJv
+cGVydHlOYW1lXX1pZihvIT1udWxsKXtzPW8ucAppZighMT09PXMpcmV0dXJuIG8uaQppZighMD09PXMp
+cmV0dXJuIGEKcj1PYmplY3QuZ2V0UHJvdG90eXBlT2YoYSkKaWYocz09PXIpcmV0dXJuIG8uaQppZihv
+LmU9PT1yKXRocm93IEguYihQLlNZKCJSZXR1cm4gaW50ZXJjZXB0b3IgZm9yICIrSC5FaihzKGEsbykp
+KSl9cT1hLmNvbnN0cnVjdG9yCnA9cT09bnVsbD9udWxsOnFbSi5SUCgpXQppZihwIT1udWxsKXJldHVy
+biBwCnA9SC53MyhhKQppZihwIT1udWxsKXJldHVybiBwCmlmKHR5cGVvZiBhPT0iZnVuY3Rpb24iKXJl
+dHVybiBDLkRHCnM9T2JqZWN0LmdldFByb3RvdHlwZU9mKGEpCmlmKHM9PW51bGwpcmV0dXJuIEMuWlEK
+aWYocz09PU9iamVjdC5wcm90b3R5cGUpcmV0dXJuIEMuWlEKaWYodHlwZW9mIHE9PSJmdW5jdGlvbiIp
+e09iamVjdC5kZWZpbmVQcm9wZXJ0eShxLEouUlAoKSx7dmFsdWU6Qy52QixlbnVtZXJhYmxlOmZhbHNl
+LHdyaXRhYmxlOnRydWUsY29uZmlndXJhYmxlOnRydWV9KQpyZXR1cm4gQy52Qn1yZXR1cm4gQy52Qn0s
+ClJQOmZ1bmN0aW9uKCl7dmFyIHM9JC56bQpyZXR1cm4gcz09bnVsbD8kLnptPXYuZ2V0SXNvbGF0ZVRh
+ZygiXyRkYXJ0X2pzIik6c30sClFpOmZ1bmN0aW9uKGEsYil7aWYoYTwwfHxhPjQyOTQ5NjcyOTUpdGhy
+b3cgSC5iKFAuVEUoYSwwLDQyOTQ5NjcyOTUsImxlbmd0aCIsbnVsbCkpCnJldHVybiBKLnB5KG5ldyBB
+cnJheShhKSxiKX0sCktoOmZ1bmN0aW9uKGEsYil7aWYoYTwwKXRocm93IEguYihQLnhZKCJMZW5ndGgg
+bXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyOiAiK2EpKQpyZXR1cm4gSC5WTShuZXcgQXJyYXko
+YSksYi5DKCJqZDwwPiIpKX0sCnB5OmZ1bmN0aW9uKGEsYil7cmV0dXJuIEouRXAoSC5WTShhLGIuQygi
+amQ8MD4iKSksYil9LApFcDpmdW5jdGlvbihhLGIpe2EuZml4ZWQkbGVuZ3RoPUFycmF5CnJldHVybiBh
+fSwKekM6ZnVuY3Rpb24oYSl7YS5maXhlZCRsZW5ndGg9QXJyYXkKYS5pbW11dGFibGUkbGlzdD1BcnJh
+eQpyZXR1cm4gYX0sCkdhOmZ1bmN0aW9uKGEpe2lmKGE8MjU2KXN3aXRjaChhKXtjYXNlIDk6Y2FzZSAx
+MDpjYXNlIDExOmNhc2UgMTI6Y2FzZSAxMzpjYXNlIDMyOmNhc2UgMTMzOmNhc2UgMTYwOnJldHVybiEw
+CmRlZmF1bHQ6cmV0dXJuITF9c3dpdGNoKGEpe2Nhc2UgNTc2MDpjYXNlIDgxOTI6Y2FzZSA4MTkzOmNh
+c2UgODE5NDpjYXNlIDgxOTU6Y2FzZSA4MTk2OmNhc2UgODE5NzpjYXNlIDgxOTg6Y2FzZSA4MTk5OmNh
+c2UgODIwMDpjYXNlIDgyMDE6Y2FzZSA4MjAyOmNhc2UgODIzMjpjYXNlIDgyMzM6Y2FzZSA4MjM5OmNh
+c2UgODI4NzpjYXNlIDEyMjg4OmNhc2UgNjUyNzk6cmV0dXJuITAKZGVmYXVsdDpyZXR1cm4hMX19LApt
+bTpmdW5jdGlvbihhLGIpe3ZhciBzLHIKZm9yKHM9YS5sZW5ndGg7YjxzOyl7cj1DLnhCLlcoYSxiKQpp
+ZihyIT09MzImJnIhPT0xMyYmIUouR2EocikpYnJlYWs7KytifXJldHVybiBifSwKYzE6ZnVuY3Rpb24o
+YSxiKXt2YXIgcyxyCmZvcig7Yj4wO2I9cyl7cz1iLTEKcj1DLnhCLk8yKGEscykKaWYociE9PTMyJiZy
+IT09MTMmJiFKLkdhKHIpKWJyZWFrfXJldHVybiBifSwKVEo6ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGE9
+PSJudW1iZXIiKXJldHVybiBKLnFJLnByb3RvdHlwZQppZih0eXBlb2YgYT09InN0cmluZyIpcmV0dXJu
+IEouRHIucHJvdG90eXBlCmlmKGE9PW51bGwpcmV0dXJuIGEKaWYoYS5jb25zdHJ1Y3Rvcj09QXJyYXkp
+cmV0dXJuIEouamQucHJvdG90eXBlCmlmKHR5cGVvZiBhIT0ib2JqZWN0Iil7aWYodHlwZW9mIGE9PSJm
+dW5jdGlvbiIpcmV0dXJuIEouYzUucHJvdG90eXBlCnJldHVybiBhfWlmKGEgaW5zdGFuY2VvZiBQLk1o
+KXJldHVybiBhCnJldHVybiBKLmtzKGEpfSwKVTY6ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGE9PSJzdHJp
+bmciKXJldHVybiBKLkRyLnByb3RvdHlwZQppZihhPT1udWxsKXJldHVybiBhCmlmKGEuY29uc3RydWN0
+b3I9PUFycmF5KXJldHVybiBKLmpkLnByb3RvdHlwZQppZih0eXBlb2YgYSE9Im9iamVjdCIpe2lmKHR5
+cGVvZiBhPT0iZnVuY3Rpb24iKXJldHVybiBKLmM1LnByb3RvdHlwZQpyZXR1cm4gYX1pZihhIGluc3Rh
+bmNlb2YgUC5NaClyZXR1cm4gYQpyZXR1cm4gSi5rcyhhKX0sCllFOmZ1bmN0aW9uKGEpe2lmKGE9PW51
+bGwpcmV0dXJuIGEKaWYodHlwZW9mIGEhPSJvYmplY3QiKXtpZih0eXBlb2YgYT09ImZ1bmN0aW9uIily
+ZXR1cm4gSi5jNS5wcm90b3R5cGUKcmV0dXJuIGF9aWYoYSBpbnN0YW5jZW9mIFAuTWgpcmV0dXJuIGEK
+cmV0dXJuIEoua3MoYSl9LAppYTpmdW5jdGlvbihhKXtpZih0eXBlb2YgYT09Im51bWJlciIpe2lmKE1h
+dGguZmxvb3IoYSk9PWEpcmV0dXJuIEouYlUucHJvdG90eXBlCnJldHVybiBKLlZBLnByb3RvdHlwZX1p
+Zih0eXBlb2YgYT09InN0cmluZyIpcmV0dXJuIEouRHIucHJvdG90eXBlCmlmKGE9PW51bGwpcmV0dXJu
+IEoud2UucHJvdG90eXBlCmlmKHR5cGVvZiBhPT0iYm9vbGVhbiIpcmV0dXJuIEoueUUucHJvdG90eXBl
 CmlmKGEuY29uc3RydWN0b3I9PUFycmF5KXJldHVybiBKLmpkLnByb3RvdHlwZQppZih0eXBlb2YgYSE9
 Im9iamVjdCIpe2lmKHR5cGVvZiBhPT0iZnVuY3Rpb24iKXJldHVybiBKLmM1LnByb3RvdHlwZQpyZXR1
-cm4gYX1pZihhIGluc3RhbmNlb2YgUC5NaClyZXR1cm4gYQpyZXR1cm4gSi5rcyhhKX0sCkE1OmZ1bmN0
-aW9uKGEsYil7cmV0dXJuIEoudzEoYSkuZVIoYSxiKX0sCkNNOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVy
-biBKLllFKGEpLmR1KGEsYixjLGQpfSwKRWg6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBKLllFKGEpLm1L
-KGEsYixjKX0sCkVsOmZ1bmN0aW9uKGEsYil7cmV0dXJuIEoudzEoYSkuZHIoYSxiKX0sCkY3OmZ1bmN0
-aW9uKGEpe3JldHVybiBKLlU2KGEpLmdvcihhKX0sCkZMOmZ1bmN0aW9uKGEsYil7cmV0dXJuIEouclko
-YSkuZGQoYSxiKX0sCkdBOmZ1bmN0aW9uKGEsYil7cmV0dXJuIEoudzEoYSkuRShhLGIpfSwKR3I6ZnVu
-Y3Rpb24oYSl7cmV0dXJuIEouWUUoYSkuZ21XKGEpfSwKSG06ZnVuY3Rpb24oYSl7cmV0dXJuIEouVTYo
-YSkuZ0EoYSl9LApJVDpmdW5jdGlvbihhKXtyZXR1cm4gSi53MShhKS5na3ooYSl9LApKeTpmdW5jdGlv
-bihhLGIpe3JldHVybiBKLmlhKGEpLmU3KGEsYil9LApLVjpmdW5jdGlvbihhLGIpe3JldHVybiBKLnJZ
-KGEpLkcoYSxiKX0sCkx0OmZ1bmN0aW9uKGEpe3JldHVybiBKLllFKGEpLndnKGEpfSwKTTE6ZnVuY3Rp
-b24oYSxiLGMpe3JldHVybiBKLncxKGEpLkUyKGEsYixjKX0sCk11OmZ1bmN0aW9uKGEsYil7cmV0dXJu
-IEouWUUoYSkuc0QoYSxiKX0sClF6OmZ1bmN0aW9uKGEsYil7cmV0dXJuIEouclkoYSkuVyhhLGIpfSwK
-Uk06ZnVuY3Rpb24oYSxiKXtpZihhPT1udWxsKXJldHVybiBiPT1udWxsCmlmKHR5cGVvZiBhIT0ib2Jq
-ZWN0IilyZXR1cm4gYiE9bnVsbCYmYT09PWIKcmV0dXJuIEouaWEoYSkuRE4oYSxiKX0sClJYOmZ1bmN0
-aW9uKGEpe3JldHVybiBKLncxKGEpLmJyKGEpfSwKVDA6ZnVuY3Rpb24oYSl7cmV0dXJuIEouclkoYSku
-YlMoYSl9LAphNjpmdW5jdGlvbihhLGIpe3JldHVybiBKLnJZKGEpLm0oYSxiKX0sCmJUOmZ1bmN0aW9u
-KGEpe3JldHVybiBKLllFKGEpLkQ0KGEpfSwKYmI6ZnVuY3Rpb24oYSxiKXtpZih0eXBlb2YgYT09Im51
-bWJlciImJnR5cGVvZiBiPT0ibnVtYmVyIilyZXR1cm4gYStiCnJldHVybiBKLlRKKGEpLmgoYSxiKX0s
-CmNIOmZ1bmN0aW9uKGEpe3JldHVybiBKLnJZKGEpLmhjKGEpfSwKZFI6ZnVuY3Rpb24oYSl7cmV0dXJu
-IEouWUUoYSkuZ0QoYSl9LApkWjpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gSi5ZRShhKS5PbihhLGIs
-YyxkKX0sCmRnOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBKLnJZKGEpLmk3KGEsYixjLGQpfSwKZGg6
-ZnVuY3Rpb24oYSl7cmV0dXJuIEouWUUoYSkuRkYoYSl9LApkcjpmdW5jdGlvbihhLGIpe3JldHVybiBK
-LllFKGEpLnNhNChhLGIpfSwKaGY6ZnVuY3Rpb24oYSl7cmV0dXJuIEouaWEoYSkuZ2lPKGEpfSwKaWc6
-ZnVuY3Rpb24oYSl7cmV0dXJuIEouWUUoYSkuZ1FnKGEpfSwKajpmdW5jdGlvbihhKXtyZXR1cm4gSi5p
-YShhKS53KGEpfSwKbDU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5ZRShhKS5zaGYoYSxiKX0sCmxkOmZ1
-bmN0aW9uKGEsYixjKXtyZXR1cm4gSi5yWShhKS5OaihhLGIsYyl9LApwNDpmdW5jdGlvbihhLGIpe3Jl
-dHVybiBKLnJZKGEpLlRjKGEsYil9LApxMDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIEouclkoYSkuUWko
-YSxiLGMpfSwKcUY6ZnVuY3Rpb24oYSl7cmV0dXJuIEouWUUoYSkuZ1ZsKGEpfSwKdEg6ZnVuY3Rpb24o
-YSxiLGMpe3JldHVybiBKLllFKGEpLnBrKGEsYixjKX0sCnU5OmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4g
-Si53MShhKS5ZKGEsYixjKX0sCnVVOmZ1bmN0aW9uKGEpe3JldHVybiBKLlU2KGEpLmdsMChhKX0sCndm
-OmZ1bmN0aW9uKGEsYil7cmV0dXJuIEouWUUoYSkuc1JOKGEsYil9LAp4OTpmdW5jdGlvbihhLGIpe2lm
-KHR5cGVvZiBiPT09Im51bWJlciIpaWYoYS5jb25zdHJ1Y3Rvcj09QXJyYXl8fHR5cGVvZiBhPT0ic3Ry
-aW5nInx8SC53VihhLGFbdi5kaXNwYXRjaFByb3BlcnR5TmFtZV0pKWlmKGI+Pj4wPT09YiYmYjxhLmxl
-bmd0aClyZXR1cm4gYVtiXQpyZXR1cm4gSi5VNihhKS5xKGEsYil9LAp6bDpmdW5jdGlvbihhLGIpe3Jl
-dHVybiBKLlU2KGEpLnRnKGEsYil9LAp2QjpmdW5jdGlvbiB2Qigpe30sCnlFOmZ1bmN0aW9uIHlFKCl7
-fSwKd2U6ZnVuY3Rpb24gd2UoKXt9LApNRjpmdW5jdGlvbiBNRigpe30sCmlDOmZ1bmN0aW9uIGlDKCl7
-fSwKa2Q6ZnVuY3Rpb24ga2QoKXt9LApjNTpmdW5jdGlvbiBjNSgpe30sCmpkOmZ1bmN0aW9uIGpkKGEp
-e3RoaXMuJHRpPWF9LApQbzpmdW5jdGlvbiBQbyhhKXt0aGlzLiR0aT1hfSwKbTE6ZnVuY3Rpb24gbTEo
-YSxiLGMpe3ZhciBfPXRoaXMKXy5hPWEKXy5iPWIKXy5jPTAKXy5kPW51bGwKXy4kdGk9Y30sCnFJOmZ1
-bmN0aW9uIHFJKCl7fSwKYlU6ZnVuY3Rpb24gYlUoKXt9LApWQTpmdW5jdGlvbiBWQSgpe30sCkRyOmZ1
-bmN0aW9uIERyKCl7fX0sUD17Ck9qOmZ1bmN0aW9uKCl7dmFyIHMscixxPXt9CmlmKHNlbGYuc2NoZWR1
-bGVJbW1lZGlhdGUhPW51bGwpcmV0dXJuIFAuRVgoKQppZihzZWxmLk11dGF0aW9uT2JzZXJ2ZXIhPW51
-bGwmJnNlbGYuZG9jdW1lbnQhPW51bGwpe3M9c2VsZi5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYi
-KQpyPXNlbGYuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpCnEuYT1udWxsCm5ldyBzZWxmLk11
-dGF0aW9uT2JzZXJ2ZXIoSC50UihuZXcgUC50aChxKSwxKSkub2JzZXJ2ZShzLHtjaGlsZExpc3Q6dHJ1
-ZX0pCnJldHVybiBuZXcgUC5oYShxLHMscil9ZWxzZSBpZihzZWxmLnNldEltbWVkaWF0ZSE9bnVsbCly
-ZXR1cm4gUC55dCgpCnJldHVybiBQLnFXKCl9LApaVjpmdW5jdGlvbihhKXtzZWxmLnNjaGVkdWxlSW1t
-ZWRpYXRlKEgudFIobmV3IFAuVnModC5NLmEoYSkpLDApKX0sCm9BOmZ1bmN0aW9uKGEpe3NlbGYuc2V0
-SW1tZWRpYXRlKEgudFIobmV3IFAuRnQodC5NLmEoYSkpLDApKX0sCkJ6OmZ1bmN0aW9uKGEpe3QuTS5h
-KGEpClAuUU4oMCxhKX0sClFOOmZ1bmN0aW9uKGEsYil7dmFyIHM9bmV3IFAuVzMoKQpzLkNZKGEsYikK
-cmV0dXJuIHN9LApGWDpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFAuaWgobmV3IFAudnMoJC5YMyxhLkMo
-InZzPDA+IikpLGEuQygiaWg8MD4iKSl9LApESTpmdW5jdGlvbihhLGIpe2EuJDIoMCxudWxsKQpiLmI9
-ITAKcmV0dXJuIGIuYX0sCmpROmZ1bmN0aW9uKGEsYil7UC5KZShhLGIpfSwKeUM6ZnVuY3Rpb24oYSxi
-KXtiLmFNKDAsYSl9LApmMzpmdW5jdGlvbihhLGIpe2IudzAoSC5SdShhKSxILnRzKGEpKX0sCkplOmZ1
-bmN0aW9uKGEsYil7dmFyIHMscixxPW5ldyBQLldNKGIpLHA9bmV3IFAuU1goYikKaWYoYSBpbnN0YW5j
-ZW9mIFAudnMpYS5RZChxLHAsdC56KQplbHNle3M9dC56CmlmKHQuZC5iKGEpKWEuU3EocSxwLHMpCmVs
-c2V7cj1uZXcgUC52cygkLlgzLHQuYykKci5hPTQKci5jPWEKci5RZChxLHAscyl9fX0sCmx6OmZ1bmN0
-aW9uKGEpe3ZhciBzPWZ1bmN0aW9uKGIsYyl7cmV0dXJuIGZ1bmN0aW9uKGQsZSl7d2hpbGUodHJ1ZSl0
-cnl7YihkLGUpCmJyZWFrfWNhdGNoKHIpe2U9cgpkPWN9fX0oYSwxKQpyZXR1cm4gJC5YMy5MaihuZXcg
-UC5HcyhzKSx0LkgsdC5TLHQueil9LApHUTpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFAuRnkoYSwxKX0s
-ClRoOmZ1bmN0aW9uKCl7cmV0dXJuIEMud1F9LApZbTpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFAuRnko
-YSwzKX0sCmwwOmZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyBQLnE0KGEsYi5DKCJxNDwwPiIpKX0sCmsz
-OmZ1bmN0aW9uKGEsYil7dmFyIHMscixxCmIuYT0xCnRyeXthLlNxKG5ldyBQLnBWKGIpLG5ldyBQLlU3
-KGIpLHQuUCl9Y2F0Y2gocSl7cz1ILlJ1KHEpCnI9SC50cyhxKQpQLnJiKG5ldyBQLnZyKGIscyxyKSl9
-fSwKQTk6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyLHEKZm9yKHM9dC5jO3I9YS5hLHI9PT0yOylhPXMuYShh
-LmMpCmlmKHI+PTQpe3E9Yi5haCgpCmIuYT1hLmEKYi5jPWEuYwpQLkhaKGIscSl9ZWxzZXtxPXQuRi5h
-KGIuYykKYi5hPTIKYi5jPWEKYS5qUShxKX19LApIWjpmdW5jdGlvbihhMCxhMSl7dmFyIHMscixxLHAs
-byxuLG0sbCxrLGosaSxoLGcsZixlLGQsYz1udWxsLGI9e30sYT1iLmE9YTAKZm9yKHM9dC5uLHI9dC5G
-LHE9dC5kOyEwOyl7cD17fQpvPWEuYT09PTgKaWYoYTE9PW51bGwpe2lmKG8pe249cy5hKGEuYykKUC5M
-MihjLGMsYS5iLG4uYSxuLmIpfXJldHVybn1wLmE9YTEKbT1hMS5hCmZvcihhPWExO20hPW51bGw7YT1t
-LG09bCl7YS5hPW51bGwKUC5IWihiLmEsYSkKcC5hPW0KbD1tLmF9az1iLmEKaj1rLmMKcC5iPW8KcC5j
-PWoKaT0hbwppZihpKXtoPWEuYwpoPShoJjEpIT09MHx8KGgmMTUpPT09OH1lbHNlIGg9ITAKaWYoaCl7
-Zz1hLmIuYgppZihvKXtoPWsuYj09PWcKaD0hKGh8fGgpfWVsc2UgaD0hMQppZihoKXtzLmEoaikKUC5M
-MihjLGMsay5iLGouYSxqLmIpCnJldHVybn1mPSQuWDMKaWYoZiE9PWcpJC5YMz1nCmVsc2UgZj1jCmE9
-YS5jCmlmKChhJjE1KT09PTgpbmV3IFAuUlQocCxiLG8pLiQwKCkKZWxzZSBpZihpKXtpZigoYSYxKSE9
-PTApbmV3IFAucnEocCxqKS4kMCgpfWVsc2UgaWYoKGEmMikhPT0wKW5ldyBQLlJXKGIscCkuJDAoKQpp
-ZihmIT1udWxsKSQuWDM9ZgphPXAuYwppZihxLmIoYSkpe2U9cC5hLmIKaWYoYS5hPj00KXtkPXIuYShl
-LmMpCmUuYz1udWxsCmExPWUuTjgoZCkKZS5hPWEuYQplLmM9YS5jCmIuYT1hCmNvbnRpbnVlfWVsc2Ug
-UC5BOShhLGUpCnJldHVybn19ZT1wLmEuYgpkPXIuYShlLmMpCmUuYz1udWxsCmExPWUuTjgoZCkKYT1w
-LmIKaz1wLmMKaWYoIWEpe2UuJHRpLmMuYShrKQplLmE9NAplLmM9a31lbHNle3MuYShrKQplLmE9OApl
-LmM9a31iLmE9ZQphPWV9fSwKVkg6ZnVuY3Rpb24oYSxiKXt2YXIgcwppZih0LmFnLmIoYSkpcmV0dXJu
-IGIuTGooYSx0LnosdC5LLHQubCkKcz10LmJJCmlmKHMuYihhKSlyZXR1cm4gcy5hKGEpCnRocm93IEgu
-YihQLkwzKGEsIm9uRXJyb3IiLCJFcnJvciBoYW5kbGVyIG11c3QgYWNjZXB0IG9uZSBPYmplY3Qgb3Ig
-b25lIE9iamVjdCBhbmQgYSBTdGFja1RyYWNlIGFzIGFyZ3VtZW50cywgYW5kIHJldHVybiBhIGEgdmFs
-aWQgcmVzdWx0IikpfSwKcHU6ZnVuY3Rpb24oKXt2YXIgcyxyCmZvcihzPSQuUzY7cyE9bnVsbDtzPSQu
-UzYpeyQubWc9bnVsbApyPXMuYgokLlM2PXIKaWYocj09bnVsbCkkLms4PW51bGwKcy5hLiQwKCl9fSwK
-ZU46ZnVuY3Rpb24oKXskLlVEPSEwCnRyeXtQLnB1KCl9ZmluYWxseXskLm1nPW51bGwKJC5VRD0hMQpp
-ZigkLlM2IT1udWxsKSQudXQoKS4kMShQLlY5KCkpfX0sCmVXOmZ1bmN0aW9uKGEpe3ZhciBzPW5ldyBQ
-Lk9NKGEpLHI9JC5rOAppZihyPT1udWxsKXskLlM2PSQuazg9cwppZighJC5VRCkkLnV0KCkuJDEoUC5W
-OSgpKX1lbHNlICQuazg9ci5iPXN9LApyUjpmdW5jdGlvbihhKXt2YXIgcyxyLHEscD0kLlM2CmlmKHA9
-PW51bGwpe1AuZVcoYSkKJC5tZz0kLms4CnJldHVybn1zPW5ldyBQLk9NKGEpCnI9JC5tZwppZihyPT1u
-dWxsKXtzLmI9cAokLlM2PSQubWc9c31lbHNle3E9ci5iCnMuYj1xCiQubWc9ci5iPXMKaWYocT09bnVs
-bCkkLms4PXN9fSwKcmI6ZnVuY3Rpb24oYSl7dmFyIHM9bnVsbCxyPSQuWDMKaWYoQy5OVT09PXIpe1Au
-VGsocyxzLEMuTlUsYSkKcmV0dXJufVAuVGsocyxzLHIsdC5NLmEoci5HWShhKSkpfSwKUXc6ZnVuY3Rp
-b24oYSxiKXtQLlVJKGEsInN0cmVhbSIsYi5DKCJxaDwwPiIpKQpyZXR1cm4gbmV3IFAueEkoYi5DKCJ4
-STwwPiIpKX0sClRsOmZ1bmN0aW9uKGEsYil7dmFyIHM9Yj09bnVsbD9QLnYwKGEpOmIKUC5VSShhLCJl
-cnJvciIsdC5LKQpyZXR1cm4gbmV3IFAuQ3coYSxzKX0sCnYwOmZ1bmN0aW9uKGEpe3ZhciBzCmlmKHQu
-ci5iKGEpKXtzPWEuZ0lJKCkKaWYocyE9bnVsbClyZXR1cm4gc31yZXR1cm4gQy5wZH0sCkwyOmZ1bmN0
-aW9uKGEsYixjLGQsZSl7UC5yUihuZXcgUC5wSyhkLGUpKX0sClQ4OmZ1bmN0aW9uKGEsYixjLGQsZSl7
-dmFyIHMscj0kLlgzCmlmKHI9PT1jKXJldHVybiBkLiQwKCkKJC5YMz1jCnM9cgp0cnl7cj1kLiQwKCkK
-cmV0dXJuIHJ9ZmluYWxseXskLlgzPXN9fSwKeXY6ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyl7dmFyIHMs
-cj0kLlgzCmlmKHI9PT1jKXJldHVybiBkLiQxKGUpCiQuWDM9YwpzPXIKdHJ5e3I9ZC4kMShlKQpyZXR1
-cm4gcn1maW5hbGx5eyQuWDM9c319LApReDpmdW5jdGlvbihhLGIsYyxkLGUsZixnLGgsaSl7dmFyIHMs
-cj0kLlgzCmlmKHI9PT1jKXJldHVybiBkLiQyKGUsZikKJC5YMz1jCnM9cgp0cnl7cj1kLiQyKGUsZikK
-cmV0dXJuIHJ9ZmluYWxseXskLlgzPXN9fSwKVGs6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHMKdC5NLmEo
-ZCkKcz1DLk5VIT09YwppZihzKWQ9ISghc3x8ITEpP2MuR1koZCk6Yy5SVChkLHQuSCkKUC5lVyhkKX0s
-CnRoOmZ1bmN0aW9uIHRoKGEpe3RoaXMuYT1hfSwKaGE6ZnVuY3Rpb24gaGEoYSxiLGMpe3RoaXMuYT1h
-CnRoaXMuYj1iCnRoaXMuYz1jfSwKVnM6ZnVuY3Rpb24gVnMoYSl7dGhpcy5hPWF9LApGdDpmdW5jdGlv
-biBGdChhKXt0aGlzLmE9YX0sClczOmZ1bmN0aW9uIFczKCl7fSwKeUg6ZnVuY3Rpb24geUgoYSxiKXt0
-aGlzLmE9YQp0aGlzLmI9Yn0sCmloOmZ1bmN0aW9uIGloKGEsYil7dGhpcy5hPWEKdGhpcy5iPSExCnRo
-aXMuJHRpPWJ9LApXTTpmdW5jdGlvbiBXTShhKXt0aGlzLmE9YX0sClNYOmZ1bmN0aW9uIFNYKGEpe3Ro
-aXMuYT1hfSwKR3M6ZnVuY3Rpb24gR3MoYSl7dGhpcy5hPWF9LApGeTpmdW5jdGlvbiBGeShhLGIpe3Ro
-aXMuYT1hCnRoaXMuYj1ifSwKR1Y6ZnVuY3Rpb24gR1YoYSxiKXt2YXIgXz10aGlzCl8uYT1hCl8uZD1f
-LmM9Xy5iPW51bGwKXy4kdGk9Yn0sCnE0OmZ1bmN0aW9uIHE0KGEsYil7dGhpcy5hPWEKdGhpcy4kdGk9
-Yn0sClBmOmZ1bmN0aW9uIFBmKCl7fSwKWmY6ZnVuY3Rpb24gWmYoYSxiKXt0aGlzLmE9YQp0aGlzLiR0
-aT1ifSwKRmU6ZnVuY3Rpb24gRmUoYSxiLGMsZCxlKXt2YXIgXz10aGlzCl8uYT1udWxsCl8uYj1hCl8u
-Yz1iCl8uZD1jCl8uZT1kCl8uJHRpPWV9LAp2czpmdW5jdGlvbiB2cyhhLGIpe3ZhciBfPXRoaXMKXy5h
-PTAKXy5iPWEKXy5jPW51bGwKXy4kdGk9Yn0sCmRhOmZ1bmN0aW9uIGRhKGEsYil7dGhpcy5hPWEKdGhp
-cy5iPWJ9LApvUTpmdW5jdGlvbiBvUShhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKcFY6ZnVuY3Rpb24g
-cFYoYSl7dGhpcy5hPWF9LApVNzpmdW5jdGlvbiBVNyhhKXt0aGlzLmE9YX0sCnZyOmZ1bmN0aW9uIHZy
-KGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9Y30sCnJ0OmZ1bmN0aW9uIHJ0KGEsYil7dGhp
-cy5hPWEKdGhpcy5iPWJ9LApLRjpmdW5jdGlvbiBLRihhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKWkw6
-ZnVuY3Rpb24gWkwoYSxiLGMpe3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMuYz1jfSwKUlQ6ZnVuY3Rpb24g
-UlQoYSxiLGMpe3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMuYz1jfSwKalo6ZnVuY3Rpb24galooYSl7dGhp
-cy5hPWF9LApycTpmdW5jdGlvbiBycShhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKUlc6ZnVuY3Rpb24g
-UlcoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCk9NOmZ1bmN0aW9uIE9NKGEpe3RoaXMuYT1hCnRoaXMu
-Yj1udWxsfSwKcWg6ZnVuY3Rpb24gcWgoKXt9LApCNTpmdW5jdGlvbiBCNShhLGIpe3RoaXMuYT1hCnRo
-aXMuYj1ifSwKdU86ZnVuY3Rpb24gdU8oYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCk1POmZ1bmN0aW9u
-IE1PKCl7fSwKa1Q6ZnVuY3Rpb24ga1QoKXt9LAp4STpmdW5jdGlvbiB4SShhKXt0aGlzLiR0aT1hfSwK
-Q3c6ZnVuY3Rpb24gQ3coYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCm0wOmZ1bmN0aW9uIG0wKCl7fSwK
-cEs6ZnVuY3Rpb24gcEsoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCkppOmZ1bmN0aW9uIEppKCl7fSwK
-aGo6ZnVuY3Rpb24gaGooYSxiLGMpe3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMuYz1jfSwKVnA6ZnVuY3Rp
-b24gVnAoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCk9SOmZ1bmN0aW9uIE9SKGEsYixjKXt0aGlzLmE9
-YQp0aGlzLmI9Ygp0aGlzLmM9Y30sCkVGOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gYi5DKCJAPDA+Iiku
-S3EoYykuQygiRm88MSwyPiIpLmEoSC5CNyhhLG5ldyBILk41KGIuQygiQDwwPiIpLktxKGMpLkMoIk41
-PDEsMj4iKSkpKX0sCkZsOmZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyBILk41KGEuQygiQDwwPiIpLktx
-KGIpLkMoIk41PDEsMj4iKSl9LApMczpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFAuYjYoYS5DKCJiNjww
-PiIpKX0sClQyOmZ1bmN0aW9uKCl7dmFyIHM9T2JqZWN0LmNyZWF0ZShudWxsKQpzWyI8bm9uLWlkZW50
-aWZpZXIta2V5PiJdPXMKZGVsZXRlIHNbIjxub24taWRlbnRpZmllci1rZXk+Il0KcmV0dXJuIHN9LApy
-ajpmdW5jdGlvbihhLGIsYyl7dmFyIHM9bmV3IFAubG0oYSxiLGMuQygibG08MD4iKSkKcy5jPWEuZQpy
-ZXR1cm4gc30sCkVQOmZ1bmN0aW9uKGEsYixjKXt2YXIgcyxyCmlmKFAuaEIoYSkpe2lmKGI9PT0iKCIm
-JmM9PT0iKSIpcmV0dXJuIiguLi4pIgpyZXR1cm4gYisiLi4uIitjfXM9SC5WTShbXSx0LnMpCkMuTm0u
-aSgkLnhnLGEpCnRyeXtQLlZyKGEscyl9ZmluYWxseXtpZigwPj0kLnhnLmxlbmd0aClyZXR1cm4gSC5P
-SCgkLnhnLC0xKQokLnhnLnBvcCgpfXI9UC52ZyhiLHQudS5hKHMpLCIsICIpK2MKcmV0dXJuIHIuY2hh
-ckNvZGVBdCgwKT09MD9yOnJ9LApXRTpmdW5jdGlvbihhLGIsYyl7dmFyIHMscgppZihQLmhCKGEpKXJl
-dHVybiBiKyIuLi4iK2MKcz1uZXcgUC5SbihiKQpDLk5tLmkoJC54ZyxhKQp0cnl7cj1zCnIuYT1QLnZn
-KHIuYSxhLCIsICIpfWZpbmFsbHl7aWYoMD49JC54Zy5sZW5ndGgpcmV0dXJuIEguT0goJC54ZywtMSkK
-JC54Zy5wb3AoKX1zLmErPWMKcj1zLmEKcmV0dXJuIHIuY2hhckNvZGVBdCgwKT09MD9yOnJ9LApoQjpm
-dW5jdGlvbihhKXt2YXIgcyxyCmZvcihzPSQueGcubGVuZ3RoLHI9MDtyPHM7KytyKWlmKGE9PT0kLnhn
-W3JdKXJldHVybiEwCnJldHVybiExfSwKVnI6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyLHEscCxvLG4sbSxs
-PWEuZ2t6KGEpLGs9MCxqPTAKd2hpbGUoITApe2lmKCEoazw4MHx8ajwzKSlicmVhawppZighbC5GKCkp
-cmV0dXJuCnM9SC5FaihsLmdsKCkpCkMuTm0uaShiLHMpCmsrPXMubGVuZ3RoKzI7KytqfWlmKCFsLkYo
-KSl7aWYoajw9NSlyZXR1cm4KaWYoMD49Yi5sZW5ndGgpcmV0dXJuIEguT0goYiwtMSkKcj1iLnBvcCgp
-CmlmKDA+PWIubGVuZ3RoKXJldHVybiBILk9IKGIsLTEpCnE9Yi5wb3AoKX1lbHNle3A9bC5nbCgpOysr
-agppZighbC5GKCkpe2lmKGo8PTQpe0MuTm0uaShiLEguRWoocCkpCnJldHVybn1yPUguRWoocCkKaWYo
-MD49Yi5sZW5ndGgpcmV0dXJuIEguT0goYiwtMSkKcT1iLnBvcCgpCmsrPXIubGVuZ3RoKzJ9ZWxzZXtv
-PWwuZ2woKTsrK2oKZm9yKDtsLkYoKTtwPW8sbz1uKXtuPWwuZ2woKTsrK2oKaWYoaj4xMDApe3doaWxl
-KCEwKXtpZighKGs+NzUmJmo+MykpYnJlYWsKaWYoMD49Yi5sZW5ndGgpcmV0dXJuIEguT0goYiwtMSkK
-ay09Yi5wb3AoKS5sZW5ndGgrMjstLWp9Qy5ObS5pKGIsIi4uLiIpCnJldHVybn19cT1ILkVqKHApCnI9
-SC5FaihvKQprKz1yLmxlbmd0aCtxLmxlbmd0aCs0fX1pZihqPmIubGVuZ3RoKzIpe2srPTUKbT0iLi4u
-In1lbHNlIG09bnVsbAp3aGlsZSghMCl7aWYoIShrPjgwJiZiLmxlbmd0aD4zKSlicmVhawppZigwPj1i
-Lmxlbmd0aClyZXR1cm4gSC5PSChiLC0xKQprLT1iLnBvcCgpLmxlbmd0aCsyCmlmKG09PW51bGwpe2sr
-PTUKbT0iLi4uIn19aWYobSE9bnVsbClDLk5tLmkoYixtKQpDLk5tLmkoYixxKQpDLk5tLmkoYixyKX0s
-CnRNOmZ1bmN0aW9uKGEsYil7dmFyIHMscixxPVAuTHMoYikKZm9yKHM9YS5sZW5ndGgscj0wO3I8YS5s
-ZW5ndGg7YS5sZW5ndGg9PT1zfHwoMCxILmxrKShhKSwrK3IpcS5pKDAsYi5hKGFbcl0pKQpyZXR1cm4g
-cX0sCm5POmZ1bmN0aW9uKGEpe3ZhciBzLHI9e30KaWYoUC5oQihhKSlyZXR1cm4iey4uLn0iCnM9bmV3
-IFAuUm4oIiIpCnRyeXtDLk5tLmkoJC54ZyxhKQpzLmErPSJ7IgpyLmE9ITAKYS5LKDAsbmV3IFAucmEo
-cixzKSkKcy5hKz0ifSJ9ZmluYWxseXtpZigwPj0kLnhnLmxlbmd0aClyZXR1cm4gSC5PSCgkLnhnLC0x
-KQokLnhnLnBvcCgpfXI9cy5hCnJldHVybiByLmNoYXJDb2RlQXQoMCk9PTA/cjpyfSwKYjY6ZnVuY3Rp
-b24gYjYoYSl7dmFyIF89dGhpcwpfLmE9MApfLmY9Xy5lPV8uZD1fLmM9Xy5iPW51bGwKXy5yPTAKXy4k
-dGk9YX0sCmJuOmZ1bmN0aW9uIGJuKGEpe3RoaXMuYT1hCnRoaXMuYz10aGlzLmI9bnVsbH0sCmxtOmZ1
-bmN0aW9uIGxtKGEsYixjKXt2YXIgXz10aGlzCl8uYT1hCl8uYj1iCl8uZD1fLmM9bnVsbApfLiR0aT1j
-fSwKbVc6ZnVuY3Rpb24gbVcoKXt9LAp1eTpmdW5jdGlvbiB1eSgpe30sCmxEOmZ1bmN0aW9uIGxEKCl7
-fSwKaWw6ZnVuY3Rpb24gaWwoKXt9LApyYTpmdW5jdGlvbiByYShhLGIpe3RoaXMuYT1hCnRoaXMuYj1i
-fSwKWWs6ZnVuY3Rpb24gWWsoKXt9LAp5UTpmdW5jdGlvbiB5UShhKXt0aGlzLmE9YX0sCktQOmZ1bmN0
-aW9uIEtQKCl7fSwKUG46ZnVuY3Rpb24gUG4oKXt9LApHajpmdW5jdGlvbiBHaihhLGIpe3RoaXMuYT1h
-CnRoaXMuJHRpPWJ9LApsZjpmdW5jdGlvbiBsZigpe30sClZqOmZ1bmN0aW9uIFZqKCl7fSwKWHY6ZnVu
-Y3Rpb24gWHYoKXt9LApuWTpmdW5jdGlvbiBuWSgpe30sCldZOmZ1bmN0aW9uIFdZKCl7fSwKUlU6ZnVu
-Y3Rpb24gUlUoKXt9LApCUzpmdW5jdGlvbihhLGIpe3ZhciBzLHIscSxwCmlmKHR5cGVvZiBhIT0ic3Ry
-aW5nIil0aHJvdyBILmIoSC50TChhKSkKcz1udWxsCnRyeXtzPUpTT04ucGFyc2UoYSl9Y2F0Y2gocSl7
-cj1ILlJ1KHEpCnA9UC5ycihTdHJpbmcociksbnVsbCxudWxsKQp0aHJvdyBILmIocCl9cD1QLlFlKHMp
-CnJldHVybiBwfSwKUWU6ZnVuY3Rpb24oYSl7dmFyIHMKaWYoYT09bnVsbClyZXR1cm4gbnVsbAppZih0
-eXBlb2YgYSE9Im9iamVjdCIpcmV0dXJuIGEKaWYoT2JqZWN0LmdldFByb3RvdHlwZU9mKGEpIT09QXJy
-YXkucHJvdG90eXBlKXJldHVybiBuZXcgUC51dyhhLE9iamVjdC5jcmVhdGUobnVsbCkpCmZvcihzPTA7
-czxhLmxlbmd0aDsrK3MpYVtzXT1QLlFlKGFbc10pCnJldHVybiBhfSwKa3k6ZnVuY3Rpb24oYSxiLGMs
-ZCl7dmFyIHMscgppZihiIGluc3RhbmNlb2YgVWludDhBcnJheSl7cz1iCmQ9cy5sZW5ndGgKaWYoZC1j
-PDE1KXJldHVybiBudWxsCnI9UC5DRyhhLHMsYyxkKQppZihyIT1udWxsJiZhKWlmKHIuaW5kZXhPZigi
-XHVmZmZkIik+PTApcmV0dXJuIG51bGwKcmV0dXJuIHJ9cmV0dXJuIG51bGx9LApDRzpmdW5jdGlvbihh
-LGIsYyxkKXt2YXIgcz1hPyQuSEcoKTokLnJmKCkKaWYocz09bnVsbClyZXR1cm4gbnVsbAppZigwPT09
-YyYmZD09PWIubGVuZ3RoKXJldHVybiBQLlJiKHMsYikKcmV0dXJuIFAuUmIocyxiLnN1YmFycmF5KGMs
-UC5qQihjLGQsYi5sZW5ndGgpKSl9LApSYjpmdW5jdGlvbihhLGIpe3ZhciBzLHIKdHJ5e3M9YS5kZWNv
-ZGUoYikKcmV0dXJuIHN9Y2F0Y2gocil7SC5SdShyKX1yZXR1cm4gbnVsbH0sCnhNOmZ1bmN0aW9uKGEs
-YixjLGQsZSxmKXtpZihDLmpuLnpZKGYsNCkhPT0wKXRocm93IEguYihQLnJyKCJJbnZhbGlkIGJhc2U2
-NCBwYWRkaW5nLCBwYWRkZWQgbGVuZ3RoIG11c3QgYmUgbXVsdGlwbGUgb2YgZm91ciwgaXMgIitmLGEs
-YykpCmlmKGQrZSE9PWYpdGhyb3cgSC5iKFAucnIoIkludmFsaWQgYmFzZTY0IHBhZGRpbmcsICc9JyBu
-b3QgYXQgdGhlIGVuZCIsYSxiKSkKaWYoZT4yKXRocm93IEguYihQLnJyKCJJbnZhbGlkIGJhc2U2NCBw
-YWRkaW5nLCBtb3JlIHRoYW4gdHdvICc9JyBjaGFyYWN0ZXJzIixhLGIpKX0sCkd5OmZ1bmN0aW9uKGEs
-YixjKXtyZXR1cm4gbmV3IFAuVWQoYSxiKX0sCk5DOmZ1bmN0aW9uKGEpe3JldHVybiBhLkx0KCl9LApV
-ZzpmdW5jdGlvbihhLGIpe3JldHVybiBuZXcgUC50dShhLFtdLFAuQ3koKSl9LAp1WDpmdW5jdGlvbihh
-LGIsYyl7dmFyIHMscj1uZXcgUC5SbigiIikscT1QLlVnKHIsYikKcS5pVShhKQpzPXIuYQpyZXR1cm4g
-cy5jaGFyQ29kZUF0KDApPT0wP3M6c30sCmo0OmZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlIDY1OnJl
-dHVybiJNaXNzaW5nIGV4dGVuc2lvbiBieXRlIgpjYXNlIDY3OnJldHVybiJVbmV4cGVjdGVkIGV4dGVu
-c2lvbiBieXRlIgpjYXNlIDY5OnJldHVybiJJbnZhbGlkIFVURi04IGJ5dGUiCmNhc2UgNzE6cmV0dXJu
-Ik92ZXJsb25nIGVuY29kaW5nIgpjYXNlIDczOnJldHVybiJPdXQgb2YgdW5pY29kZSByYW5nZSIKY2Fz
-ZSA3NTpyZXR1cm4iRW5jb2RlZCBzdXJyb2dhdGUiCmNhc2UgNzc6cmV0dXJuIlVuZmluaXNoZWQgVVRG
-LTggb2N0ZXQgc2VxdWVuY2UiCmRlZmF1bHQ6cmV0dXJuIiJ9fSwKank6ZnVuY3Rpb24oYSxiLGMpe3Zh
-ciBzLHIscSxwLG89Yy1iLG49bmV3IFVpbnQ4QXJyYXkobykKZm9yKHM9bi5sZW5ndGgscj1KLlU2KGEp
-LHE9MDtxPG87KytxKXtwPXIucShhLGIrcSkKaWYodHlwZW9mIHAhPT0ibnVtYmVyIilyZXR1cm4gcC56
-TSgpCmlmKChwJjQyOTQ5NjcwNDApPj4+MCE9PTApcD0yNTUKaWYocT49cylyZXR1cm4gSC5PSChuLHEp
-Cm5bcV09cH1yZXR1cm4gbn0sCnV3OmZ1bmN0aW9uIHV3KGEsYil7dGhpcy5hPWEKdGhpcy5iPWIKdGhp
-cy5jPW51bGx9LAppODpmdW5jdGlvbiBpOChhKXt0aGlzLmE9YX0sCnBnOmZ1bmN0aW9uIHBnKCl7fSwK
-YzI6ZnVuY3Rpb24gYzIoKXt9LApDVjpmdW5jdGlvbiBDVigpe30sClU4OmZ1bmN0aW9uIFU4KCl7fSwK
-VWs6ZnVuY3Rpb24gVWsoKXt9LAp3STpmdW5jdGlvbiB3SSgpe30sClppOmZ1bmN0aW9uIFppKCl7fSwK
-VWQ6ZnVuY3Rpb24gVWQoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCks4OmZ1bmN0aW9uIEs4KGEsYil7
-dGhpcy5hPWEKdGhpcy5iPWJ9LApieTpmdW5jdGlvbiBieSgpe30sCm9qOmZ1bmN0aW9uIG9qKGEpe3Ro
-aXMuYj1hfSwKTXg6ZnVuY3Rpb24gTXgoYSl7dGhpcy5hPWF9LApTaDpmdW5jdGlvbiBTaCgpe30sCnRp
-OmZ1bmN0aW9uIHRpKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LAp0dTpmdW5jdGlvbiB0dShhLGIsYyl7
-dGhpcy5jPWEKdGhpcy5hPWIKdGhpcy5iPWN9LAp1NTpmdW5jdGlvbiB1NSgpe30sCkUzOmZ1bmN0aW9u
-IEUzKCl7fSwKUnc6ZnVuY3Rpb24gUncoYSl7dGhpcy5iPTAKdGhpcy5jPWF9LApHWTpmdW5jdGlvbiBH
-WShhKXt0aGlzLmE9YX0sCmJ6OmZ1bmN0aW9uIGJ6KGEpe3RoaXMuYT1hCnRoaXMuYj0xNgp0aGlzLmM9
-MH0sClFBOmZ1bmN0aW9uKGEsYil7dmFyIHM9SC5IcChhLGIpCmlmKHMhPW51bGwpcmV0dXJuIHMKdGhy
-b3cgSC5iKFAucnIoYSxudWxsLG51bGwpKX0sCm9zOmZ1bmN0aW9uKGEpe2lmKGEgaW5zdGFuY2VvZiBI
-LlRwKXJldHVybiBhLncoMCkKcmV0dXJuIkluc3RhbmNlIG9mICciK0guRWooSC5NKGEpKSsiJyJ9LApP
-ODpmdW5jdGlvbihhLGIsYyxkKXt2YXIgcyxyPWM/Si5LaChhLGQpOkouUWkoYSxkKQppZihhIT09MCYm
-YiE9bnVsbClmb3Iocz0wO3M8ci5sZW5ndGg7KytzKXJbc109YgpyZXR1cm4gcn0sCkNIOmZ1bmN0aW9u
-KGEsYixjKXt2YXIgcyxyPUguVk0oW10sYy5DKCJqZDwwPiIpKQpmb3Iocz1KLklUKGEpO3MuRigpOylD
-Lk5tLmkocixjLmEocy5nbCgpKSkKaWYoYilyZXR1cm4gcgpyZXR1cm4gSi5FcChyLGMpfSwKZEg6ZnVu
-Y3Rpb24oYSxiLGMpe3ZhciBzLHI9Si5LaChhLGMpCmZvcihzPTA7czxhOysrcylDLk5tLlkocixzLGIu
-JDEocykpCnJldHVybiByfSwKQUY6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi56QyhQLkNIKGEsITEsYikp
-fSwKSE06ZnVuY3Rpb24oYSxiLGMpe2lmKHQuYm0uYihhKSlyZXR1cm4gSC5mdyhhLGIsUC5qQihiLGMs
-YS5sZW5ndGgpKQpyZXR1cm4gUC5idyhhLGIsYyl9LApPbzpmdW5jdGlvbihhKXtyZXR1cm4gSC5Mdyhh
-KX0sCmJ3OmZ1bmN0aW9uKGEsYixjKXt2YXIgcyxyLHEscCxvLG49bnVsbAppZihiPDApdGhyb3cgSC5i
-KFAuVEUoYiwwLGEubGVuZ3RoLG4sbikpCnM9Yz09bnVsbAppZighcyYmYzxiKXRocm93IEguYihQLlRF
-KGMsYixhLmxlbmd0aCxuLG4pKQpyPW5ldyBILmE3KGEsYS5sZW5ndGgsSC56KGEpLkMoImE3PGxELkU+
-IikpCmZvcihxPTA7cTxiOysrcSlpZighci5GKCkpdGhyb3cgSC5iKFAuVEUoYiwwLHEsbixuKSkKcD1b
-XQppZihzKWZvcig7ci5GKCk7KXtvPXIuZApwLnB1c2gobyl9ZWxzZSBmb3IocT1iO3E8YzsrK3Epe2lm
-KCFyLkYoKSl0aHJvdyBILmIoUC5URShjLGIscSxuLG4pKQpvPXIuZApwLnB1c2gobyl9cmV0dXJuIEgu
-ZVQocCl9LApudTpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IEguVlIoYSxILnY0KGEsITEsITAsITEsITEs
-ITEpKX0sCnZnOmZ1bmN0aW9uKGEsYixjKXt2YXIgcz1KLklUKGIpCmlmKCFzLkYoKSlyZXR1cm4gYQpp
-ZihjLmxlbmd0aD09PTApe2RvIGErPUguRWoocy5nbCgpKQp3aGlsZShzLkYoKSl9ZWxzZXthKz1ILkVq
-KHMuZ2woKSkKZm9yKDtzLkYoKTspYT1hK2MrSC5FaihzLmdsKCkpfXJldHVybiBhfSwKbHI6ZnVuY3Rp
-b24oYSxiLGMsZCl7cmV0dXJuIG5ldyBQLm1wKGEsYixjLGQpfSwKdW86ZnVuY3Rpb24oKXt2YXIgcz1I
-Lk0wKCkKaWYocyE9bnVsbClyZXR1cm4gUC5oSyhzKQp0aHJvdyBILmIoUC5MNCgiJ1VyaS5iYXNlJyBp
-cyBub3Qgc3VwcG9ydGVkIikpfSwKZVA6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHMscixxLHAsbyxuLG09
-IjAxMjM0NTY3ODlBQkNERUYiCmlmKGM9PT1DLnhNKXtzPSQuejQoKS5iCmlmKHR5cGVvZiBiIT0ic3Ry
-aW5nIilILnYoSC50TChiKSkKcz1zLnRlc3QoYil9ZWxzZSBzPSExCmlmKHMpcmV0dXJuIGIKSC5MaChj
-KS5DKCJVay5TIikuYShiKQpyPWMuZ1pFKCkuV0ooYikKZm9yKHM9ci5sZW5ndGgscT0wLHA9IiI7cTxz
-OysrcSl7bz1yW3FdCmlmKG88MTI4KXtuPW8+Pj40CmlmKG4+PTgpcmV0dXJuIEguT0goYSxuKQpuPShh
-W25dJjE8PChvJjE1KSkhPT0wfWVsc2Ugbj0hMQppZihuKXArPUguTHcobykKZWxzZSBwPWQmJm89PT0z
-Mj9wKyIrIjpwKyIlIittW28+Pj40JjE1XSttW28mMTVdfXJldHVybiBwLmNoYXJDb2RlQXQoMCk9PTA/
-cDpwfSwKR3E6ZnVuY3Rpb24oYSl7dmFyIHM9TWF0aC5hYnMoYSkscj1hPDA/Ii0iOiIiCmlmKHM+PTEw
-MDApcmV0dXJuIiIrYQppZihzPj0xMDApcmV0dXJuIHIrIjAiK3MKaWYocz49MTApcmV0dXJuIHIrIjAw
-IitzCnJldHVybiByKyIwMDAiK3N9LApWeDpmdW5jdGlvbihhKXtpZihhPj0xMDApcmV0dXJuIiIrYQpp
-ZihhPj0xMClyZXR1cm4iMCIrYQpyZXR1cm4iMDAiK2F9LApoMDpmdW5jdGlvbihhKXtpZihhPj0xMCly
-ZXR1cm4iIithCnJldHVybiIwIithfSwKaGw6ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGE9PSJudW1iZXIi
-fHxILmwoYSl8fG51bGw9PWEpcmV0dXJuIEouaihhKQppZih0eXBlb2YgYT09InN0cmluZyIpcmV0dXJu
-IEpTT04uc3RyaW5naWZ5KGEpCnJldHVybiBQLm9zKGEpfSwKaFY6ZnVuY3Rpb24oYSl7cmV0dXJuIG5l
-dyBQLkM2KGEpfSwKeFk6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBQLnUoITEsbnVsbCxudWxsLGEpfSwK
-TDM6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBuZXcgUC51KCEwLGEsYixjKX0sClVJOmZ1bmN0aW9uKGEs
-YixjKXtpZihhPT1udWxsKXRocm93IEguYihuZXcgUC51KCExLG51bGwsYiwiTXVzdCBub3QgYmUgbnVs
-bCIpKQpyZXR1cm4gYX0sCk83OmZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyBQLmJKKG51bGwsbnVsbCwh
-MCxhLGIsIlZhbHVlIG5vdCBpbiByYW5nZSIpfSwKVEU6ZnVuY3Rpb24oYSxiLGMsZCxlKXtyZXR1cm4g
-bmV3IFAuYkooYixjLCEwLGEsZCwiSW52YWxpZCB2YWx1ZSIpfSwKd0E6ZnVuY3Rpb24oYSxiLGMsZCl7
-aWYoYTxifHxhPmMpdGhyb3cgSC5iKFAuVEUoYSxiLGMsZCxudWxsKSkKcmV0dXJuIGF9LApqQjpmdW5j
-dGlvbihhLGIsYyl7aWYoMD5hfHxhPmMpdGhyb3cgSC5iKFAuVEUoYSwwLGMsInN0YXJ0IixudWxsKSkK
-aWYoYiE9bnVsbCl7aWYoYT5ifHxiPmMpdGhyb3cgSC5iKFAuVEUoYixhLGMsImVuZCIsbnVsbCkpCnJl
-dHVybiBifXJldHVybiBjfSwKazE6ZnVuY3Rpb24oYSxiKXtpZihhPDApdGhyb3cgSC5iKFAuVEUoYSww
-LG51bGwsYixudWxsKSkKcmV0dXJuIGF9LApDZjpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBzPUgudVAo
-ZT09bnVsbD9KLkhtKGIpOmUpCnJldHVybiBuZXcgUC5lWShzLCEwLGEsYywiSW5kZXggb3V0IG9mIHJh
-bmdlIil9LApMNDpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFAudWIoYSl9LApTWTpmdW5jdGlvbihhKXty
-ZXR1cm4gbmV3IFAuZHMoYSl9LApQVjpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFAubGooYSl9LAphNDpm
-dW5jdGlvbihhKXtyZXR1cm4gbmV3IFAuVVYoYSl9LApycjpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG5l
-dyBQLmFFKGEsYixjKX0sCmhLOmZ1bmN0aW9uKGE1KXt2YXIgcyxyLHEscCxvLG4sbSxsLGssaixpLGgs
-ZyxmLGUsZCxjLGIsYSxhMCxhMSxhMixhMz1udWxsLGE0PWE1Lmxlbmd0aAppZihhND49NSl7cz0oKEou
-UXooYTUsNCleNTgpKjN8Qy54Qi5XKGE1LDApXjEwMHxDLnhCLlcoYTUsMSleOTd8Qy54Qi5XKGE1LDIp
-XjExNnxDLnhCLlcoYTUsMyleOTcpPj4+MAppZihzPT09MClyZXR1cm4gUC5LRChhNDxhND9DLnhCLk5q
-KGE1LDAsYTQpOmE1LDUsYTMpLmdsUigpCmVsc2UgaWYocz09PTMyKXJldHVybiBQLktEKEMueEIuTmoo
-YTUsNSxhNCksMCxhMykuZ2xSKCl9cj1QLk84KDgsMCwhMSx0LlMpCkMuTm0uWShyLDAsMCkKQy5ObS5Z
-KHIsMSwtMSkKQy5ObS5ZKHIsMiwtMSkKQy5ObS5ZKHIsNywtMSkKQy5ObS5ZKHIsMywwKQpDLk5tLlko
-ciw0LDApCkMuTm0uWShyLDUsYTQpCkMuTm0uWShyLDYsYTQpCmlmKFAuVUIoYTUsMCxhNCwwLHIpPj0x
-NClDLk5tLlkociw3LGE0KQppZigxPj1yLmxlbmd0aClyZXR1cm4gSC5PSChyLDEpCnE9clsxXQppZihx
-Pj0wKWlmKFAuVUIoYTUsMCxxLDIwLHIpPT09MjApe2lmKDc+PXIubGVuZ3RoKXJldHVybiBILk9IKHIs
-NykKcls3XT1xfXA9ci5sZW5ndGgKaWYoMj49cClyZXR1cm4gSC5PSChyLDIpCm89clsyXSsxCmlmKDM+
-PXApcmV0dXJuIEguT0gociwzKQpuPXJbM10KaWYoND49cClyZXR1cm4gSC5PSChyLDQpCm09cls0XQpp
-Zig1Pj1wKXJldHVybiBILk9IKHIsNSkKbD1yWzVdCmlmKDY+PXApcmV0dXJuIEguT0gociw2KQprPXJb
-Nl0KaWYoazxsKWw9awppZihtPG8pbT1sCmVsc2UgaWYobTw9cSltPXErMQppZihuPG8pbj1tCmlmKDc+
-PXApcmV0dXJuIEguT0gociw3KQpqPXJbN108MAppZihqKWlmKG8+cSszKXtpPWEzCmo9ITF9ZWxzZXtw
-PW4+MAppZihwJiZuKzE9PT1tKXtpPWEzCmo9ITF9ZWxzZXtpZighKGw8YTQmJmw9PT1tKzImJkoucTAo
-YTUsIi4uIixtKSkpaD1sPm0rMiYmSi5xMChhNSwiLy4uIixsLTMpCmVsc2UgaD0hMAppZihoKXtpPWEz
-Cmo9ITF9ZWxzZXtpZihxPT09NClpZihKLnEwKGE1LCJmaWxlIiwwKSl7aWYobzw9MCl7aWYoIUMueEIu
-UWkoYTUsIi8iLG0pKXtnPSJmaWxlOi8vLyIKcz0zfWVsc2V7Zz0iZmlsZTovLyIKcz0yfWE1PWcrQy54
-Qi5OaihhNSxtLGE0KQpxLT0wCnA9cy0wCmwrPXAKays9cAphND1hNS5sZW5ndGgKbz03Cm49NwptPTd9
-ZWxzZSBpZihtPT09bCl7KytrCmY9bCsxCmE1PUMueEIuaTcoYTUsbSxsLCIvIik7KythNApsPWZ9aT0i
-ZmlsZSJ9ZWxzZSBpZihDLnhCLlFpKGE1LCJodHRwIiwwKSl7aWYocCYmbiszPT09bSYmQy54Qi5RaShh
-NSwiODAiLG4rMSkpe2stPTMKZT1tLTMKbC09MwphNT1DLnhCLmk3KGE1LG4sbSwiIikKYTQtPTMKbT1l
-fWk9Imh0dHAifWVsc2UgaT1hMwplbHNlIGlmKHE9PT01JiZKLnEwKGE1LCJodHRwcyIsMCkpe2lmKHAm
-Jm4rND09PW0mJkoucTAoYTUsIjQ0MyIsbisxKSl7ay09NAplPW0tNApsLT00CmE1PUouZGcoYTUsbixt
-LCIiKQphNC09MwptPWV9aT0iaHR0cHMifWVsc2UgaT1hMwpqPSEwfX19ZWxzZSBpPWEzCmlmKGope3A9
-YTUubGVuZ3RoCmlmKGE0PHApe2E1PUoubGQoYTUsMCxhNCkKcS09MApvLT0wCm4tPTAKbS09MApsLT0w
-CmstPTB9cmV0dXJuIG5ldyBQLlVmKGE1LHEsbyxuLG0sbCxrLGkpfWlmKGk9PW51bGwpaWYocT4wKWk9
-UC5QaShhNSwwLHEpCmVsc2V7aWYocT09PTApUC5SMyhhNSwwLCJJbnZhbGlkIGVtcHR5IHNjaGVtZSIp
-Cmk9IiJ9aWYobz4wKXtkPXErMwpjPWQ8bz9QLnpSKGE1LGQsby0xKToiIgpiPVAuT2UoYTUsbyxuLCEx
-KQpwPW4rMQppZihwPG0pe2E9SC5IcChKLmxkKGE1LHAsbSksYTMpCmEwPVAud0IoYT09bnVsbD9ILnYo
-UC5ycigiSW52YWxpZCBwb3J0IixhNSxwKSk6YSxpKX1lbHNlIGEwPWEzfWVsc2V7YTA9YTMKYj1hMApj
-PSIifWExPVAua2EoYTUsbSxsLGEzLGksYiE9bnVsbCkKYTI9bDxrP1AubGUoYTUsbCsxLGssYTMpOmEz
-CnJldHVybiBuZXcgUC5EbihpLGMsYixhMCxhMSxhMixrPGE0P1AudEcoYTUsaysxLGE0KTphMyl9LApN
-dDpmdW5jdGlvbihhKXtILmgoYSkKcmV0dXJuIFAua3UoYSwwLGEubGVuZ3RoLEMueE0sITEpfSwKV1g6
-ZnVuY3Rpb24oYSl7dmFyIHM9dC5OCnJldHVybiBDLk5tLk4wKEguVk0oYS5zcGxpdCgiJiIpLHQucyks
-UC5GbChzLHMpLG5ldyBQLm4xKEMueE0pLHQuSil9LApIaDpmdW5jdGlvbihhLGIsYyl7dmFyIHMscixx
-LHAsbyxuLG0sbD0iSVB2NCBhZGRyZXNzIHNob3VsZCBjb250YWluIGV4YWN0bHkgNCBwYXJ0cyIsaz0i
-ZWFjaCBwYXJ0IG11c3QgYmUgaW4gdGhlIHJhbmdlIDAuLjI1NSIsaj1uZXcgUC5jUyhhKSxpPW5ldyBV
-aW50OEFycmF5KDQpCmZvcihzPWkubGVuZ3RoLHI9YixxPXIscD0wO3I8YzsrK3Ipe289Qy54Qi5tKGEs
-cikKaWYobyE9PTQ2KXtpZigob140OCk+OSlqLiQyKCJpbnZhbGlkIGNoYXJhY3RlciIscil9ZWxzZXtp
-ZihwPT09MylqLiQyKGwscikKbj1QLlFBKEMueEIuTmooYSxxLHIpLG51bGwpCmlmKG4+MjU1KWouJDIo
-ayxxKQptPXArMQppZihwPj1zKXJldHVybiBILk9IKGkscCkKaVtwXT1uCnE9cisxCnA9bX19aWYocCE9
-PTMpai4kMihsLGMpCm49UC5RQShDLnhCLk5qKGEscSxjKSxudWxsKQppZihuPjI1NSlqLiQyKGsscSkK
-aWYocD49cylyZXR1cm4gSC5PSChpLHApCmlbcF09bgpyZXR1cm4gaX0sCmVnOmZ1bmN0aW9uKGEsYTAs
-YTEpe3ZhciBzLHIscSxwLG8sbixtLGwsayxqLGksaCxnLGYsZSxkLGM9bmV3IFAuVkMoYSksYj1uZXcg
-UC5KVChjLGEpCmlmKGEubGVuZ3RoPDIpYy4kMSgiYWRkcmVzcyBpcyB0b28gc2hvcnQiKQpzPUguVk0o
-W10sdC5hKQpmb3Iocj1hMCxxPXIscD0hMSxvPSExO3I8YTE7KytyKXtuPUMueEIubShhLHIpCmlmKG49
-PT01OCl7aWYocj09PWEwKXsrK3IKaWYoQy54Qi5tKGEscikhPT01OCljLiQyKCJpbnZhbGlkIHN0YXJ0
-IGNvbG9uLiIscikKcT1yfWlmKHI9PT1xKXtpZihwKWMuJDIoIm9ubHkgb25lIHdpbGRjYXJkIGA6OmAg
-aXMgYWxsb3dlZCIscikKQy5ObS5pKHMsLTEpCnA9ITB9ZWxzZSBDLk5tLmkocyxiLiQyKHEscikpCnE9
-cisxfWVsc2UgaWYobj09PTQ2KW89ITB9aWYocy5sZW5ndGg9PT0wKWMuJDEoInRvbyBmZXcgcGFydHMi
-KQptPXE9PT1hMQpsPUMuTm0uZ3JaKHMpCmlmKG0mJmwhPT0tMSljLiQyKCJleHBlY3RlZCBhIHBhcnQg
-YWZ0ZXIgbGFzdCBgOmAiLGExKQppZighbSlpZighbylDLk5tLmkocyxiLiQyKHEsYTEpKQplbHNle2s9
-UC5IaChhLHEsYTEpCkMuTm0uaShzLChrWzBdPDw4fGtbMV0pPj4+MCkKQy5ObS5pKHMsKGtbMl08PDh8
-a1szXSk+Pj4wKX1pZihwKXtpZihzLmxlbmd0aD43KWMuJDEoImFuIGFkZHJlc3Mgd2l0aCBhIHdpbGRj
-YXJkIG11c3QgaGF2ZSBsZXNzIHRoYW4gNyBwYXJ0cyIpfWVsc2UgaWYocy5sZW5ndGghPT04KWMuJDEo
-ImFuIGFkZHJlc3Mgd2l0aG91dCBhIHdpbGRjYXJkIG11c3QgY29udGFpbiBleGFjdGx5IDggcGFydHMi
-KQpqPW5ldyBVaW50OEFycmF5KDE2KQpmb3IobD1zLmxlbmd0aCxpPWoubGVuZ3RoLGg9OS1sLHI9MCxn
-PTA7cjxsOysrcil7Zj1zW3JdCmlmKGY9PT0tMSlmb3IoZT0wO2U8aDsrK2Upe2lmKGc8MHx8Zz49aSly
-ZXR1cm4gSC5PSChqLGcpCmpbZ109MApkPWcrMQppZihkPj1pKXJldHVybiBILk9IKGosZCkKaltkXT0w
-CmcrPTJ9ZWxzZXtkPUMuam4ud0coZiw4KQppZihnPDB8fGc+PWkpcmV0dXJuIEguT0goaixnKQpqW2dd
-PWQKZD1nKzEKaWYoZD49aSlyZXR1cm4gSC5PSChqLGQpCmpbZF09ZiYyNTUKZys9Mn19cmV0dXJuIGp9
-LApLTDpmdW5jdGlvbihhLGIsYyxkLGUsZixnKXt2YXIgcyxyLHEscCxvLG4KZj1mPT1udWxsPyIiOlAu
-UGkoZiwwLGYubGVuZ3RoKQpnPVAuelIoZywwLGc9PW51bGw/MDpnLmxlbmd0aCkKYT1QLk9lKGEsMCxh
-PT1udWxsPzA6YS5sZW5ndGgsITEpCnM9UC5sZShudWxsLDAsMCxlKQpyPVAudEcobnVsbCwwLDApCmQ9
-UC53QihkLGYpCnE9Zj09PSJmaWxlIgppZihhPT1udWxsKXA9Zy5sZW5ndGghPT0wfHxkIT1udWxsfHxx
-CmVsc2UgcD0hMQppZihwKWE9IiIKcD1hPT1udWxsCm89IXAKYj1QLmthKGIsMCxiPT1udWxsPzA6Yi5s
-ZW5ndGgsYyxmLG8pCm49Zi5sZW5ndGg9PT0wCmlmKG4mJnAmJiFDLnhCLm4oYiwiLyIpKWI9UC53Rihi
-LCFufHxvKQplbHNlIGI9UC54ZShiKQpyZXR1cm4gbmV3IFAuRG4oZixnLHAmJkMueEIubihiLCIvLyIp
-PyIiOmEsZCxiLHMscil9LAp3SzpmdW5jdGlvbihhKXtpZihhPT09Imh0dHAiKXJldHVybiA4MAppZihh
-PT09Imh0dHBzIilyZXR1cm4gNDQzCnJldHVybiAwfSwKUjM6ZnVuY3Rpb24oYSxiLGMpe3Rocm93IEgu
-YihQLnJyKGMsYSxiKSl9LApYZDpmdW5jdGlvbihhLGIsYyxkKXt2YXIgcyxyLHEscCxvLG4sbSxsLGss
-aixpLGg9bnVsbCxnPWIubGVuZ3RoCmlmKGchPT0wKXtxPTAKd2hpbGUoITApe2lmKCEocTxnKSl7cz0i
-IgpyPTAKYnJlYWt9aWYoQy54Qi5XKGIscSk9PT02NCl7cz1DLnhCLk5qKGIsMCxxKQpyPXErMQpicmVh
-a30rK3F9aWYocjxnJiZDLnhCLlcoYixyKT09PTkxKXtmb3IocD1yLG89LTE7cDxnOysrcCl7bj1DLnhC
-LlcoYixwKQppZihuPT09MzcmJm88MCl7bT1DLnhCLlFpKGIsIjI1IixwKzEpP3ArMjpwCm89cApwPW19
-ZWxzZSBpZihuPT09OTMpYnJlYWt9aWYocD09PWcpdGhyb3cgSC5iKFAucnIoIkludmFsaWQgSVB2NiBo
-b3N0IGVudHJ5LiIsYixyKSkKbD1vPDA/cDpvClAuZWcoYixyKzEsbCk7KytwCmlmKHAhPT1nJiZDLnhC
-LlcoYixwKSE9PTU4KXRocm93IEguYihQLnJyKCJJbnZhbGlkIGVuZCBvZiBhdXRob3JpdHkiLGIscCkp
-fWVsc2UgcD1yCndoaWxlKCEwKXtpZighKHA8Zykpe2s9aApicmVha31pZihDLnhCLlcoYixwKT09PTU4
-KXtqPUMueEIuRyhiLHArMSkKaz1qLmxlbmd0aCE9PTA/UC5RQShqLGgpOmgKYnJlYWt9KytwfWk9Qy54
-Qi5OaihiLHIscCl9ZWxzZXtrPWgKaT1rCnM9IiJ9cmV0dXJuIFAuS0woaSxoLEguVk0oYy5zcGxpdCgi
-LyIpLHQucyksayxkLGEscyl9LAprRTpmdW5jdGlvbihhLGIpe3ZhciBzLHIscSxwLG8KZm9yKHM9YS5s
-ZW5ndGgscj0wO3I8czsrK3Ipe3E9YVtyXQpxLnRvU3RyaW5nCnA9Si5VNihxKQpvPXAuZ0EocSkKaWYo
-MD5vKUgudihQLlRFKDAsMCxwLmdBKHEpLG51bGwsbnVsbCkpCmlmKEgubTIocSwiLyIsMCkpe3M9UC5M
-NCgiSWxsZWdhbCBwYXRoIGNoYXJhY3RlciAiK0guRWoocSkpCnRocm93IEguYihzKX19fSwKSE46ZnVu
-Y3Rpb24oYSxiLGMpe3ZhciBzLHIscQpmb3Iocz1ILnFDKGEsYyxudWxsLEgudDYoYSkuYykscz1uZXcg
-SC5hNyhzLHMuZ0Eocykscy4kdGkuQygiYTc8YUwuRT4iKSk7cy5GKCk7KXtyPXMuZApxPVAubnUoJ1si
-Ki86PD4/XFxcXHxdJykKci50b1N0cmluZwppZihILm0yKHIscSwwKSl7cz1QLkw0KCJJbGxlZ2FsIGNo
-YXJhY3RlciBpbiBwYXRoOiAiK3IpCnRocm93IEguYihzKX19fSwKcmc6ZnVuY3Rpb24oYSxiKXt2YXIg
-cwppZighKDY1PD1hJiZhPD05MCkpcz05Nzw9YSYmYTw9MTIyCmVsc2Ugcz0hMAppZihzKXJldHVybgpz
-PVAuTDQoIklsbGVnYWwgZHJpdmUgbGV0dGVyICIrUC5PbyhhKSkKdGhyb3cgSC5iKHMpfSwKd0I6ZnVu
-Y3Rpb24oYSxiKXtpZihhIT1udWxsJiZhPT09UC53SyhiKSlyZXR1cm4gbnVsbApyZXR1cm4gYX0sCk9l
-OmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBzLHIscSxwLG8sbgppZihhPT1udWxsKXJldHVybiBudWxsCmlm
-KGI9PT1jKXJldHVybiIiCmlmKEMueEIubShhLGIpPT09OTEpe3M9Yy0xCmlmKEMueEIubShhLHMpIT09
-OTMpUC5SMyhhLGIsIk1pc3NpbmcgZW5kIGBdYCB0byBtYXRjaCBgW2AgaW4gaG9zdCIpCnI9YisxCnE9
-UC50byhhLHIscykKaWYocTxzKXtwPXErMQpvPVAuT0EoYSxDLnhCLlFpKGEsIjI1IixwKT9xKzM6cCxz
-LCIlMjUiKX1lbHNlIG89IiIKUC5lZyhhLHIscSkKcmV0dXJuIEMueEIuTmooYSxiLHEpLnRvTG93ZXJD
-YXNlKCkrbysiXSJ9Zm9yKG49YjtuPGM7KytuKWlmKEMueEIubShhLG4pPT09NTgpe3E9Qy54Qi5YVShh
-LCIlIixiKQpxPXE+PWImJnE8Yz9xOmMKaWYocTxjKXtwPXErMQpvPVAuT0EoYSxDLnhCLlFpKGEsIjI1
-IixwKT9xKzM6cCxjLCIlMjUiKX1lbHNlIG89IiIKUC5lZyhhLGIscSkKcmV0dXJuIlsiK0MueEIuTmoo
-YSxiLHEpK28rIl0ifXJldHVybiBQLk9MKGEsYixjKX0sCnRvOmZ1bmN0aW9uKGEsYixjKXt2YXIgcz1D
-LnhCLlhVKGEsIiUiLGIpCnJldHVybiBzPj1iJiZzPGM/czpjfSwKT0E6ZnVuY3Rpb24oYSxiLGMsZCl7
-dmFyIHMscixxLHAsbyxuLG0sbCxrLGosaT1kIT09IiI/bmV3IFAuUm4oZCk6bnVsbApmb3Iocz1iLHI9
-cyxxPSEwO3M8Yzspe3A9Qy54Qi5tKGEscykKaWYocD09PTM3KXtvPVAucnYoYSxzLCEwKQpuPW89PW51
-bGwKaWYobiYmcSl7cys9Mwpjb250aW51ZX1pZihpPT1udWxsKWk9bmV3IFAuUm4oIiIpCm09aS5hKz1D
-LnhCLk5qKGEscixzKQppZihuKW89Qy54Qi5OaihhLHMscyszKQplbHNlIGlmKG89PT0iJSIpUC5SMyhh
-LHMsIlpvbmVJRCBzaG91bGQgbm90IGNvbnRhaW4gJSBhbnltb3JlIikKaS5hPW0rbwpzKz0zCnI9cwpx
-PSEwfWVsc2V7aWYocDwxMjcpe249cD4+PjQKaWYobj49OClyZXR1cm4gSC5PSChDLkYzLG4pCm49KEMu
-RjNbbl0mMTw8KHAmMTUpKSE9PTB9ZWxzZSBuPSExCmlmKG4pe2lmKHEmJjY1PD1wJiY5MD49cCl7aWYo
-aT09bnVsbClpPW5ldyBQLlJuKCIiKQppZihyPHMpe2kuYSs9Qy54Qi5OaihhLHIscykKcj1zfXE9ITF9
-KytzfWVsc2V7aWYoKHAmNjQ1MTIpPT09NTUyOTYmJnMrMTxjKXtsPUMueEIubShhLHMrMSkKaWYoKGwm
-NjQ1MTIpPT09NTYzMjApe3A9NjU1MzZ8KHAmMTAyMyk8PDEwfGwmMTAyMwprPTJ9ZWxzZSBrPTF9ZWxz
-ZSBrPTEKaj1DLnhCLk5qKGEscixzKQppZihpPT1udWxsKXtpPW5ldyBQLlJuKCIiKQpuPWl9ZWxzZSBu
-PWkKbi5hKz1qCm4uYSs9UC56WChwKQpzKz1rCnI9c319fWlmKGk9PW51bGwpcmV0dXJuIEMueEIuTmoo
-YSxiLGMpCmlmKHI8YylpLmErPUMueEIuTmooYSxyLGMpCm49aS5hCnJldHVybiBuLmNoYXJDb2RlQXQo
-MCk9PTA/bjpufSwKT0w6ZnVuY3Rpb24oYSxiLGMpe3ZhciBzLHIscSxwLG8sbixtLGwsayxqLGkKZm9y
-KHM9YixyPXMscT1udWxsLHA9ITA7czxjOyl7bz1DLnhCLm0oYSxzKQppZihvPT09Mzcpe249UC5ydihh
-LHMsITApCm09bj09bnVsbAppZihtJiZwKXtzKz0zCmNvbnRpbnVlfWlmKHE9PW51bGwpcT1uZXcgUC5S
-bigiIikKbD1DLnhCLk5qKGEscixzKQprPXEuYSs9IXA/bC50b0xvd2VyQ2FzZSgpOmwKaWYobSl7bj1D
-LnhCLk5qKGEscyxzKzMpCmo9M31lbHNlIGlmKG49PT0iJSIpe249IiUyNSIKaj0xfWVsc2Ugaj0zCnEu
-YT1rK24Kcys9agpyPXMKcD0hMH1lbHNle2lmKG88MTI3KXttPW8+Pj40CmlmKG0+PTgpcmV0dXJuIEgu
-T0goQy5lYSxtKQptPShDLmVhW21dJjE8PChvJjE1KSkhPT0wfWVsc2UgbT0hMQppZihtKXtpZihwJiY2
-NTw9byYmOTA+PW8pe2lmKHE9PW51bGwpcT1uZXcgUC5SbigiIikKaWYocjxzKXtxLmErPUMueEIuTmoo
-YSxyLHMpCnI9c31wPSExfSsrc31lbHNle2lmKG88PTkzKXttPW8+Pj40CmlmKG0+PTgpcmV0dXJuIEgu
-T0goQy5hayxtKQptPShDLmFrW21dJjE8PChvJjE1KSkhPT0wfWVsc2UgbT0hMQppZihtKVAuUjMoYSxz
-LCJJbnZhbGlkIGNoYXJhY3RlciIpCmVsc2V7aWYoKG8mNjQ1MTIpPT09NTUyOTYmJnMrMTxjKXtpPUMu
-eEIubShhLHMrMSkKaWYoKGkmNjQ1MTIpPT09NTYzMjApe289NjU1MzZ8KG8mMTAyMyk8PDEwfGkmMTAy
-MwpqPTJ9ZWxzZSBqPTF9ZWxzZSBqPTEKbD1DLnhCLk5qKGEscixzKQppZighcClsPWwudG9Mb3dlckNh
-c2UoKQppZihxPT1udWxsKXtxPW5ldyBQLlJuKCIiKQptPXF9ZWxzZSBtPXEKbS5hKz1sCm0uYSs9UC56
-WChvKQpzKz1qCnI9c319fX1pZihxPT1udWxsKXJldHVybiBDLnhCLk5qKGEsYixjKQppZihyPGMpe2w9
-Qy54Qi5OaihhLHIsYykKcS5hKz0hcD9sLnRvTG93ZXJDYXNlKCk6bH1tPXEuYQpyZXR1cm4gbS5jaGFy
-Q29kZUF0KDApPT0wP206bX0sClBpOmZ1bmN0aW9uKGEsYixjKXt2YXIgcyxyLHEscAppZihiPT09Yyly
-ZXR1cm4iIgppZighUC5FdChKLnJZKGEpLlcoYSxiKSkpUC5SMyhhLGIsIlNjaGVtZSBub3Qgc3RhcnRp
-bmcgd2l0aCBhbHBoYWJldGljIGNoYXJhY3RlciIpCmZvcihzPWIscj0hMTtzPGM7KytzKXtxPUMueEIu
-VyhhLHMpCmlmKHE8MTI4KXtwPXE+Pj40CmlmKHA+PTgpcmV0dXJuIEguT0goQy5tSyxwKQpwPShDLm1L
-W3BdJjE8PChxJjE1KSkhPT0wfWVsc2UgcD0hMQppZighcClQLlIzKGEscywiSWxsZWdhbCBzY2hlbWUg
-Y2hhcmFjdGVyIikKaWYoNjU8PXEmJnE8PTkwKXI9ITB9YT1DLnhCLk5qKGEsYixjKQpyZXR1cm4gUC5Z
-YShyP2EudG9Mb3dlckNhc2UoKTphKX0sCllhOmZ1bmN0aW9uKGEpe2lmKGE9PT0iaHR0cCIpcmV0dXJu
-Imh0dHAiCmlmKGE9PT0iZmlsZSIpcmV0dXJuImZpbGUiCmlmKGE9PT0iaHR0cHMiKXJldHVybiJodHRw
-cyIKaWYoYT09PSJwYWNrYWdlIilyZXR1cm4icGFja2FnZSIKcmV0dXJuIGF9LAp6UjpmdW5jdGlvbihh
-LGIsYyl7aWYoYT09bnVsbClyZXR1cm4iIgpyZXR1cm4gUC5QSShhLGIsYyxDLnRvLCExKX0sCmthOmZ1
-bmN0aW9uKGEsYixjLGQsZSxmKXt2YXIgcyxyLHE9ZT09PSJmaWxlIixwPXF8fGYKaWYoYT09bnVsbCl7
-aWYoZD09bnVsbClyZXR1cm4gcT8iLyI6IiIKcz1ILnQ2KGQpCnI9bmV3IEgubEooZCxzLkMoInFVKDEp
-IikuYShuZXcgUC5SWigpKSxzLkMoImxKPDEscVU+IikpLkgoMCwiLyIpfWVsc2UgaWYoZCE9bnVsbCl0
-aHJvdyBILmIoUC54WSgiQm90aCBwYXRoIGFuZCBwYXRoU2VnbWVudHMgc3BlY2lmaWVkIikpCmVsc2Ug
-cj1QLlBJKGEsYixjLEMuV2QsITApCmlmKHIubGVuZ3RoPT09MCl7aWYocSlyZXR1cm4iLyJ9ZWxzZSBp
-ZihwJiYhQy54Qi5uKHIsIi8iKSlyPSIvIityCnJldHVybiBQLkpyKHIsZSxmKX0sCkpyOmZ1bmN0aW9u
-KGEsYixjKXt2YXIgcz1iLmxlbmd0aD09PTAKaWYocyYmIWMmJiFDLnhCLm4oYSwiLyIpKXJldHVybiBQ
-LndGKGEsIXN8fGMpCnJldHVybiBQLnhlKGEpfSwKbGU6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHMscj17
-fQppZihhIT1udWxsKXtpZihkIT1udWxsKXRocm93IEguYihQLnhZKCJCb3RoIHF1ZXJ5IGFuZCBxdWVy
-eVBhcmFtZXRlcnMgc3BlY2lmaWVkIikpCnJldHVybiBQLlBJKGEsYixjLEMuVkMsITApfWlmKGQ9PW51
-bGwpcmV0dXJuIG51bGwKcz1uZXcgUC5SbigiIikKci5hPSIiCmQuSygwLG5ldyBQLnk1KG5ldyBQLk1F
-KHIscykpKQpyPXMuYQpyZXR1cm4gci5jaGFyQ29kZUF0KDApPT0wP3I6cn0sCnRHOmZ1bmN0aW9uKGEs
-YixjKXtpZihhPT1udWxsKXJldHVybiBudWxsCnJldHVybiBQLlBJKGEsYixjLEMuVkMsITApfSwKcnY6
-ZnVuY3Rpb24oYSxiLGMpe3ZhciBzLHIscSxwLG8sbj1iKzIKaWYobj49YS5sZW5ndGgpcmV0dXJuIiUi
-CnM9Qy54Qi5tKGEsYisxKQpyPUMueEIubShhLG4pCnE9SC5vbyhzKQpwPUgub28ocikKaWYocTwwfHxw
-PDApcmV0dXJuIiUiCm89cSoxNitwCmlmKG88MTI3KXtuPUMuam4ud0cobyw0KQppZihuPj04KXJldHVy
-biBILk9IKEMuRjMsbikKbj0oQy5GM1tuXSYxPDwobyYxNSkpIT09MH1lbHNlIG49ITEKaWYobilyZXR1
-cm4gSC5MdyhjJiY2NTw9byYmOTA+PW8/KG98MzIpPj4+MDpvKQppZihzPj05N3x8cj49OTcpcmV0dXJu
-IEMueEIuTmooYSxiLGIrMykudG9VcHBlckNhc2UoKQpyZXR1cm4gbnVsbH0sCnpYOmZ1bmN0aW9uKGEp
-e3ZhciBzLHIscSxwLG8sbixtLGwsaz0iMDEyMzQ1Njc4OUFCQ0RFRiIKaWYoYTwxMjgpe3M9bmV3IFVp
-bnQ4QXJyYXkoMykKcj1zLmxlbmd0aAppZigwPj1yKXJldHVybiBILk9IKHMsMCkKc1swXT0zNwpxPUMu
-eEIuVyhrLGE+Pj40KQppZigxPj1yKXJldHVybiBILk9IKHMsMSkKc1sxXT1xCnE9Qy54Qi5XKGssYSYx
-NSkKaWYoMj49cilyZXR1cm4gSC5PSChzLDIpCnNbMl09cX1lbHNle2lmKGE+MjA0NylpZihhPjY1NTM1
-KXtwPTI0MApvPTR9ZWxzZXtwPTIyNApvPTN9ZWxzZXtwPTE5MgpvPTJ9cz1uZXcgVWludDhBcnJheSgz
-Km8pCmZvcihyPXMubGVuZ3RoLG49MDstLW8sbz49MDtwPTEyOCl7bT1DLmpuLmJmKGEsNipvKSY2M3xw
-CmlmKG4+PXIpcmV0dXJuIEguT0gocyxuKQpzW25dPTM3CnE9bisxCmw9Qy54Qi5XKGssbT4+PjQpCmlm
-KHE+PXIpcmV0dXJuIEguT0gocyxxKQpzW3FdPWwKbD1uKzIKcT1DLnhCLlcoayxtJjE1KQppZihsPj1y
-KXJldHVybiBILk9IKHMsbCkKc1tsXT1xCm4rPTN9fXJldHVybiBQLkhNKHMsMCxudWxsKX0sClBJOmZ1
-bmN0aW9uKGEsYixjLGQsZSl7dmFyIHM9UC5VbChhLGIsYyxkLGUpCnJldHVybiBzPT1udWxsP0MueEIu
-TmooYSxiLGMpOnN9LApVbDpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBzLHIscSxwLG8sbixtLGwsayxq
-PW51bGwKZm9yKHM9IWUscj1iLHE9cixwPWo7cjxjOyl7bz1DLnhCLm0oYSxyKQppZihvPDEyNyl7bj1v
-Pj4+NAppZihuPj04KXJldHVybiBILk9IKGQsbikKbj0oZFtuXSYxPDwobyYxNSkpIT09MH1lbHNlIG49
-ITEKaWYobikrK3IKZWxzZXtpZihvPT09Mzcpe209UC5ydihhLHIsITEpCmlmKG09PW51bGwpe3IrPTMK
-Y29udGludWV9aWYoIiUiPT09bSl7bT0iJTI1IgpsPTF9ZWxzZSBsPTN9ZWxzZXtpZihzKWlmKG88PTkz
-KXtuPW8+Pj40CmlmKG4+PTgpcmV0dXJuIEguT0goQy5hayxuKQpuPShDLmFrW25dJjE8PChvJjE1KSkh
-PT0wfWVsc2Ugbj0hMQplbHNlIG49ITEKaWYobil7UC5SMyhhLHIsIkludmFsaWQgY2hhcmFjdGVyIikK
-bD1qCm09bH1lbHNle2lmKChvJjY0NTEyKT09PTU1Mjk2KXtuPXIrMQppZihuPGMpe2s9Qy54Qi5tKGEs
-bikKaWYoKGsmNjQ1MTIpPT09NTYzMjApe289NjU1MzZ8KG8mMTAyMyk8PDEwfGsmMTAyMwpsPTJ9ZWxz
-ZSBsPTF9ZWxzZSBsPTF9ZWxzZSBsPTEKbT1QLnpYKG8pfX1pZihwPT1udWxsKXtwPW5ldyBQLlJuKCIi
-KQpuPXB9ZWxzZSBuPXAKbi5hKz1DLnhCLk5qKGEscSxyKQpuLmErPUguRWoobSkKaWYodHlwZW9mIGwh
-PT0ibnVtYmVyIilyZXR1cm4gSC5wWShsKQpyKz1sCnE9cn19aWYocD09bnVsbClyZXR1cm4gagppZihx
-PGMpcC5hKz1DLnhCLk5qKGEscSxjKQpzPXAuYQpyZXR1cm4gcy5jaGFyQ29kZUF0KDApPT0wP3M6c30s
-CnlCOmZ1bmN0aW9uKGEpe2lmKEMueEIubihhLCIuIikpcmV0dXJuITAKcmV0dXJuIEMueEIuT1koYSwi
-Ly4iKSE9PS0xfSwKeGU6ZnVuY3Rpb24oYSl7dmFyIHMscixxLHAsbyxuLG0KaWYoIVAueUIoYSkpcmV0
-dXJuIGEKcz1ILlZNKFtdLHQucykKZm9yKHI9YS5zcGxpdCgiLyIpLHE9ci5sZW5ndGgscD0hMSxvPTA7
-bzxxOysrbyl7bj1yW29dCmlmKEouUk0obiwiLi4iKSl7bT1zLmxlbmd0aAppZihtIT09MCl7aWYoMD49
-bSlyZXR1cm4gSC5PSChzLC0xKQpzLnBvcCgpCmlmKHMubGVuZ3RoPT09MClDLk5tLmkocywiIil9cD0h
-MH1lbHNlIGlmKCIuIj09PW4pcD0hMAplbHNle0MuTm0uaShzLG4pCnA9ITF9fWlmKHApQy5ObS5pKHMs
-IiIpCnJldHVybiBDLk5tLkgocywiLyIpfSwKd0Y6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyLHEscCxvLG4K
-aWYoIVAueUIoYSkpcmV0dXJuIWI/UC5DMShhKTphCnM9SC5WTShbXSx0LnMpCmZvcihyPWEuc3BsaXQo
-Ii8iKSxxPXIubGVuZ3RoLHA9ITEsbz0wO288cTsrK28pe249cltvXQppZigiLi4iPT09bilpZihzLmxl
-bmd0aCE9PTAmJkMuTm0uZ3JaKHMpIT09Ii4uIil7aWYoMD49cy5sZW5ndGgpcmV0dXJuIEguT0gocywt
-MSkKcy5wb3AoKQpwPSEwfWVsc2V7Qy5ObS5pKHMsIi4uIikKcD0hMX1lbHNlIGlmKCIuIj09PW4pcD0h
-MAplbHNle0MuTm0uaShzLG4pCnA9ITF9fXI9cy5sZW5ndGgKaWYociE9PTApaWYocj09PTEpe2lmKDA+
-PXIpcmV0dXJuIEguT0gocywwKQpyPXNbMF0ubGVuZ3RoPT09MH1lbHNlIHI9ITEKZWxzZSByPSEwCmlm
-KHIpcmV0dXJuIi4vIgppZihwfHxDLk5tLmdyWihzKT09PSIuLiIpQy5ObS5pKHMsIiIpCmlmKCFiKXtp
-ZigwPj1zLmxlbmd0aClyZXR1cm4gSC5PSChzLDApCkMuTm0uWShzLDAsUC5DMShzWzBdKSl9cmV0dXJu
-IEMuTm0uSChzLCIvIil9LApDMTpmdW5jdGlvbihhKXt2YXIgcyxyLHEscD1hLmxlbmd0aAppZihwPj0y
-JiZQLkV0KEouUXooYSwwKSkpZm9yKHM9MTtzPHA7KytzKXtyPUMueEIuVyhhLHMpCmlmKHI9PT01OCly
-ZXR1cm4gQy54Qi5OaihhLDAscykrIiUzQSIrQy54Qi5HKGEscysxKQppZihyPD0xMjcpe3E9cj4+PjQK
-aWYocT49OClyZXR1cm4gSC5PSChDLm1LLHEpCnE9KEMubUtbcV0mMTw8KHImMTUpKT09PTB9ZWxzZSBx
-PSEwCmlmKHEpYnJlYWt9cmV0dXJuIGF9LAptbjpmdW5jdGlvbihhKXt2YXIgcyxyLHEscD1hLmdGaigp
-LG89cC5sZW5ndGgKaWYobz4wJiZKLkhtKHBbMF0pPT09MiYmSi5hNihwWzBdLDEpPT09NTgpe2lmKDA+
-PW8pcmV0dXJuIEguT0gocCwwKQpQLnJnKEouYTYocFswXSwwKSwhMSkKUC5ITihwLCExLDEpCnM9ITB9
-ZWxzZXtQLkhOKHAsITEsMCkKcz0hMX1yPWEuZ3RUKCkmJiFzPyJcXCI6IiIKaWYoYS5nY2ooKSl7cT1h
-LmdKZihhKQppZihxLmxlbmd0aCE9PTApcj1yKyJcXCIrcSsiXFwifXI9UC52ZyhyLHAsIlxcIikKbz1z
-JiZvPT09MT9yKyJcXCI6cgpyZXR1cm4gby5jaGFyQ29kZUF0KDApPT0wP286b30sCkloOmZ1bmN0aW9u
-KGEsYil7dmFyIHMscixxCmZvcihzPTAscj0wO3I8MjsrK3Ipe3E9Qy54Qi5XKGEsYityKQppZig0ODw9
-cSYmcTw9NTcpcz1zKjE2K3EtNDgKZWxzZXtxfD0zMgppZig5Nzw9cSYmcTw9MTAyKXM9cyoxNitxLTg3
-CmVsc2UgdGhyb3cgSC5iKFAueFkoIkludmFsaWQgVVJMIGVuY29kaW5nIikpfX1yZXR1cm4gc30sCmt1
-OmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIHMscixxLHAsbz1KLnJZKGEpLG49Ygp3aGlsZSghMCl7aWYo
-IShuPGMpKXtzPSEwCmJyZWFrfXI9by5XKGEsbikKaWYocjw9MTI3KWlmKHIhPT0zNylxPWUmJnI9PT00
-MwplbHNlIHE9ITAKZWxzZSBxPSEwCmlmKHEpe3M9ITEKYnJlYWt9KytufWlmKHMpe2lmKEMueE0hPT1k
-KXE9ITEKZWxzZSBxPSEwCmlmKHEpcmV0dXJuIG8uTmooYSxiLGMpCmVsc2UgcD1uZXcgSC5xaihvLk5q
-KGEsYixjKSl9ZWxzZXtwPUguVk0oW10sdC5hKQpmb3Iobj1iO248YzsrK24pe3I9by5XKGEsbikKaWYo
-cj4xMjcpdGhyb3cgSC5iKFAueFkoIklsbGVnYWwgcGVyY2VudCBlbmNvZGluZyBpbiBVUkkiKSkKaWYo
-cj09PTM3KXtpZihuKzM+YS5sZW5ndGgpdGhyb3cgSC5iKFAueFkoIlRydW5jYXRlZCBVUkkiKSkKQy5O
-bS5pKHAsUC5JaChhLG4rMSkpCm4rPTJ9ZWxzZSBpZihlJiZyPT09NDMpQy5ObS5pKHAsMzIpCmVsc2Ug
-Qy5ObS5pKHAscil9fXQuTC5hKHApCnJldHVybiBDLm9FLldKKHApfSwKRXQ6ZnVuY3Rpb24oYSl7dmFy
-IHM9YXwzMgpyZXR1cm4gOTc8PXMmJnM8PTEyMn0sCktEOmZ1bmN0aW9uKGEsYixjKXt2YXIgcyxyLHEs
-cCxvLG4sbSxsLGs9IkludmFsaWQgTUlNRSB0eXBlIixqPUguVk0oW2ItMV0sdC5hKQpmb3Iocz1hLmxl
-bmd0aCxyPWIscT0tMSxwPW51bGw7cjxzOysrcil7cD1DLnhCLlcoYSxyKQppZihwPT09NDR8fHA9PT01
-OSlicmVhawppZihwPT09NDcpe2lmKHE8MCl7cT1yCmNvbnRpbnVlfXRocm93IEguYihQLnJyKGssYSxy
-KSl9fWlmKHE8MCYmcj5iKXRocm93IEguYihQLnJyKGssYSxyKSkKZm9yKDtwIT09NDQ7KXtDLk5tLmko
-aixyKTsrK3IKZm9yKG89LTE7cjxzOysrcil7cD1DLnhCLlcoYSxyKQppZihwPT09NjEpe2lmKG88MClv
-PXJ9ZWxzZSBpZihwPT09NTl8fHA9PT00NClicmVha31pZihvPj0wKUMuTm0uaShqLG8pCmVsc2V7bj1D
-Lk5tLmdyWihqKQppZihwIT09NDR8fHIhPT1uKzd8fCFDLnhCLlFpKGEsImJhc2U2NCIsbisxKSl0aHJv
-dyBILmIoUC5ycigiRXhwZWN0aW5nICc9JyIsYSxyKSkKYnJlYWt9fUMuTm0uaShqLHIpCm09cisxCmlm
-KChqLmxlbmd0aCYxKT09PTEpYT1DLmg5LnlyKGEsbSxzKQplbHNle2w9UC5VbChhLG0scyxDLlZDLCEw
-KQppZihsIT1udWxsKWE9Qy54Qi5pNyhhLG0scyxsKX1yZXR1cm4gbmV3IFAuUEUoYSxqLGMpfSwKS046
-ZnVuY3Rpb24oKXt2YXIgcz0iMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVm
-Z2hpamtsbW5vcHFyc3R1dnd4eXotLl9+ISQmJygpKissOz0iLHI9Ii4iLHE9IjoiLHA9Ii8iLG89Ij8i
-LG49IiMiLG09UC5kSCgyMixuZXcgUC5xMygpLHQuZ2MpLGw9bmV3IFAueUkobSksaz1uZXcgUC5jNigp
-LGo9bmV3IFAucWQoKSxpPWwuJDIoMCwyMjUpCmsuJDMoaSxzLDEpCmsuJDMoaSxyLDE0KQprLiQzKGks
-cSwzNCkKay4kMyhpLHAsMykKay4kMyhpLG8sMTcyKQprLiQzKGksbiwyMDUpCmk9bC4kMigxNCwyMjUp
-CmsuJDMoaSxzLDEpCmsuJDMoaSxyLDE1KQprLiQzKGkscSwzNCkKay4kMyhpLHAsMjM0KQprLiQzKGks
-bywxNzIpCmsuJDMoaSxuLDIwNSkKaT1sLiQyKDE1LDIyNSkKay4kMyhpLHMsMSkKay4kMyhpLCIlIiwy
-MjUpCmsuJDMoaSxxLDM0KQprLiQzKGkscCw5KQprLiQzKGksbywxNzIpCmsuJDMoaSxuLDIwNSkKaT1s
-LiQyKDEsMjI1KQprLiQzKGkscywxKQprLiQzKGkscSwzNCkKay4kMyhpLHAsMTApCmsuJDMoaSxvLDE3
-MikKay4kMyhpLG4sMjA1KQppPWwuJDIoMiwyMzUpCmsuJDMoaSxzLDEzOSkKay4kMyhpLHAsMTMxKQpr
-LiQzKGksciwxNDYpCmsuJDMoaSxvLDE3MikKay4kMyhpLG4sMjA1KQppPWwuJDIoMywyMzUpCmsuJDMo
-aSxzLDExKQprLiQzKGkscCw2OCkKay4kMyhpLHIsMTgpCmsuJDMoaSxvLDE3MikKay4kMyhpLG4sMjA1
-KQppPWwuJDIoNCwyMjkpCmsuJDMoaSxzLDUpCmouJDMoaSwiQVoiLDIyOSkKay4kMyhpLHEsMTAyKQpr
-LiQzKGksIkAiLDY4KQprLiQzKGksIlsiLDIzMikKay4kMyhpLHAsMTM4KQprLiQzKGksbywxNzIpCmsu
-JDMoaSxuLDIwNSkKaT1sLiQyKDUsMjI5KQprLiQzKGkscyw1KQpqLiQzKGksIkFaIiwyMjkpCmsuJDMo
-aSxxLDEwMikKay4kMyhpLCJAIiw2OCkKay4kMyhpLHAsMTM4KQprLiQzKGksbywxNzIpCmsuJDMoaSxu
-LDIwNSkKaT1sLiQyKDYsMjMxKQpqLiQzKGksIjE5Iiw3KQprLiQzKGksIkAiLDY4KQprLiQzKGkscCwx
-MzgpCmsuJDMoaSxvLDE3MikKay4kMyhpLG4sMjA1KQppPWwuJDIoNywyMzEpCmouJDMoaSwiMDkiLDcp
-CmsuJDMoaSwiQCIsNjgpCmsuJDMoaSxwLDEzOCkKay4kMyhpLG8sMTcyKQprLiQzKGksbiwyMDUpCmsu
-JDMobC4kMig4LDgpLCJdIiw1KQppPWwuJDIoOSwyMzUpCmsuJDMoaSxzLDExKQprLiQzKGksciwxNikK
-ay4kMyhpLHAsMjM0KQprLiQzKGksbywxNzIpCmsuJDMoaSxuLDIwNSkKaT1sLiQyKDE2LDIzNSkKay4k
-MyhpLHMsMTEpCmsuJDMoaSxyLDE3KQprLiQzKGkscCwyMzQpCmsuJDMoaSxvLDE3MikKay4kMyhpLG4s
-MjA1KQppPWwuJDIoMTcsMjM1KQprLiQzKGkscywxMSkKay4kMyhpLHAsOSkKay4kMyhpLG8sMTcyKQpr
-LiQzKGksbiwyMDUpCmk9bC4kMigxMCwyMzUpCmsuJDMoaSxzLDExKQprLiQzKGksciwxOCkKay4kMyhp
-LHAsMjM0KQprLiQzKGksbywxNzIpCmsuJDMoaSxuLDIwNSkKaT1sLiQyKDE4LDIzNSkKay4kMyhpLHMs
-MTEpCmsuJDMoaSxyLDE5KQprLiQzKGkscCwyMzQpCmsuJDMoaSxvLDE3MikKay4kMyhpLG4sMjA1KQpp
-PWwuJDIoMTksMjM1KQprLiQzKGkscywxMSkKay4kMyhpLHAsMjM0KQprLiQzKGksbywxNzIpCmsuJDMo
-aSxuLDIwNSkKaT1sLiQyKDExLDIzNSkKay4kMyhpLHMsMTEpCmsuJDMoaSxwLDEwKQprLiQzKGksbywx
-NzIpCmsuJDMoaSxuLDIwNSkKaT1sLiQyKDEyLDIzNikKay4kMyhpLHMsMTIpCmsuJDMoaSxvLDEyKQpr
-LiQzKGksbiwyMDUpCmk9bC4kMigxMywyMzcpCmsuJDMoaSxzLDEzKQprLiQzKGksbywxMykKai4kMyhs
-LiQyKDIwLDI0NSksImF6IiwyMSkKaT1sLiQyKDIxLDI0NSkKai4kMyhpLCJheiIsMjEpCmouJDMoaSwi
-MDkiLDIxKQprLiQzKGksIistLiIsMjEpCnJldHVybiBtfSwKVUI6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2
-YXIgcyxyLHEscCxvLG49JC52WigpCmZvcihzPUouclkoYSkscj1iO3I8YzsrK3Ipe24ubGVuZ3RoCmlm
-KGQ8MHx8ZD49MjIpcmV0dXJuIEguT0gobixkKQpxPW5bZF0KcD1zLlcoYSxyKV45NgppZihwPjk1KXA9
-MzEKaWYocD49cS5sZW5ndGgpcmV0dXJuIEguT0gocSxwKQpvPXFbcF0KZD1vJjMxCkMuTm0uWShlLG8+
-Pj41LHIpfXJldHVybiBkfSwKV0Y6ZnVuY3Rpb24gV0YoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCmlQ
-OmZ1bmN0aW9uIGlQKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApYUzpmdW5jdGlvbiBYUygpe30sCkM2
-OmZ1bmN0aW9uIEM2KGEpe3RoaXMuYT1hfSwKRXo6ZnVuY3Rpb24gRXooKXt9LApGOmZ1bmN0aW9uIEYo
-KXt9LAp1OmZ1bmN0aW9uIHUoYSxiLGMsZCl7dmFyIF89dGhpcwpfLmE9YQpfLmI9YgpfLmM9YwpfLmQ9
-ZH0sCmJKOmZ1bmN0aW9uIGJKKGEsYixjLGQsZSxmKXt2YXIgXz10aGlzCl8uZT1hCl8uZj1iCl8uYT1j
-Cl8uYj1kCl8uYz1lCl8uZD1mfSwKZVk6ZnVuY3Rpb24gZVkoYSxiLGMsZCxlKXt2YXIgXz10aGlzCl8u
-Zj1hCl8uYT1iCl8uYj1jCl8uYz1kCl8uZD1lfSwKbXA6ZnVuY3Rpb24gbXAoYSxiLGMsZCl7dmFyIF89
-dGhpcwpfLmE9YQpfLmI9YgpfLmM9YwpfLmQ9ZH0sCnViOmZ1bmN0aW9uIHViKGEpe3RoaXMuYT1hfSwK
-ZHM6ZnVuY3Rpb24gZHMoYSl7dGhpcy5hPWF9LApsajpmdW5jdGlvbiBsaihhKXt0aGlzLmE9YX0sClVW
-OmZ1bmN0aW9uIFVWKGEpe3RoaXMuYT1hfSwKazU6ZnVuY3Rpb24gazUoKXt9LApLWTpmdW5jdGlvbiBL
-WSgpe30sCnA6ZnVuY3Rpb24gcChhKXt0aGlzLmE9YX0sCkNEOmZ1bmN0aW9uIENEKGEpe3RoaXMuYT1h
-fSwKYUU6ZnVuY3Rpb24gYUUoYSxiLGMpe3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMuYz1jfSwKY1g6ZnVu
-Y3Rpb24gY1goKXt9LApBbjpmdW5jdGlvbiBBbigpe30sCk4zOmZ1bmN0aW9uIE4zKGEsYixjKXt0aGlz
-LmE9YQp0aGlzLmI9Ygp0aGlzLiR0aT1jfSwKYzg6ZnVuY3Rpb24gYzgoKXt9LApNaDpmdW5jdGlvbiBN
-aCgpe30sClpkOmZ1bmN0aW9uIFpkKCl7fSwKUm46ZnVuY3Rpb24gUm4oYSl7dGhpcy5hPWF9LApuMTpm
-dW5jdGlvbiBuMShhKXt0aGlzLmE9YX0sCmNTOmZ1bmN0aW9uIGNTKGEpe3RoaXMuYT1hfSwKVkM6ZnVu
-Y3Rpb24gVkMoYSl7dGhpcy5hPWF9LApKVDpmdW5jdGlvbiBKVChhLGIpe3RoaXMuYT1hCnRoaXMuYj1i
-fSwKRG46ZnVuY3Rpb24gRG4oYSxiLGMsZCxlLGYsZyl7dmFyIF89dGhpcwpfLmE9YQpfLmI9YgpfLmM9
-YwpfLmQ9ZApfLmU9ZQpfLmY9ZgpfLnI9ZwpfLlE9Xy56PV8ueT1fLng9bnVsbH0sClJaOmZ1bmN0aW9u
-IFJaKCl7fSwKTUU6ZnVuY3Rpb24gTUUoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCnk1OmZ1bmN0aW9u
-IHk1KGEpe3RoaXMuYT1hfSwKUEU6ZnVuY3Rpb24gUEUoYSxiLGMpe3RoaXMuYT1hCnRoaXMuYj1iCnRo
-aXMuYz1jfSwKcTM6ZnVuY3Rpb24gcTMoKXt9LAp5STpmdW5jdGlvbiB5SShhKXt0aGlzLmE9YX0sCmM2
-OmZ1bmN0aW9uIGM2KCl7fSwKcWQ6ZnVuY3Rpb24gcWQoKXt9LApVZjpmdW5jdGlvbiBVZihhLGIsYyxk
-LGUsZixnLGgpe3ZhciBfPXRoaXMKXy5hPWEKXy5iPWIKXy5jPWMKXy5kPWQKXy5lPWUKXy5mPWYKXy5y
-PWcKXy54PWgKXy55PW51bGx9LApxZTpmdW5jdGlvbiBxZShhLGIsYyxkLGUsZixnKXt2YXIgXz10aGlz
-Cl8uYT1hCl8uYj1iCl8uYz1jCl8uZD1kCl8uZT1lCl8uZj1mCl8ucj1nCl8uUT1fLno9Xy55PV8ueD1u
-dWxsfSwKaUo6ZnVuY3Rpb24gaUooKXt9LApqZzpmdW5jdGlvbiBqZyhhLGIpe3RoaXMuYT1hCnRoaXMu
-Yj1ifSwKVGE6ZnVuY3Rpb24gVGEoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCkJmOmZ1bmN0aW9uIEJm
-KGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApBczpmdW5jdGlvbiBBcygpe30sCkdFOmZ1bmN0aW9uIEdF
-KGEpe3RoaXMuYT1hfSwKTjc6ZnVuY3Rpb24gTjcoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCnVROmZ1
-bmN0aW9uIHVRKCl7fSwKaEY6ZnVuY3Rpb24gaEYoKXt9LApSNDpmdW5jdGlvbihhLGIsYyxkKXt2YXIg
-cyxyLHEKSC55OChiKQp0LmouYShkKQppZihILm9UKGIpKXtzPVtjXQpDLk5tLkZWKHMsZCkKZD1zfXI9
-dC56CnE9UC5DSChKLk0xKGQsUC53MCgpLHIpLCEwLHIpCnQuWS5hKGEpCnJldHVybiBQLndZKEguRWso
-YSxxLG51bGwpKX0sCkRtOmZ1bmN0aW9uKGEsYixjKXt2YXIgcwp0cnl7aWYoT2JqZWN0LmlzRXh0ZW5z
-aWJsZShhKSYmIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhLGIpKXtPYmplY3Qu
-ZGVmaW5lUHJvcGVydHkoYSxiLHt2YWx1ZTpjfSkKcmV0dXJuITB9fWNhdGNoKHMpe0guUnUocyl9cmV0
-dXJuITF9LApPbTpmdW5jdGlvbihhLGIpe2lmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHku
-Y2FsbChhLGIpKXJldHVybiBhW2JdCnJldHVybiBudWxsfSwKd1k6ZnVuY3Rpb24oYSl7aWYoYT09bnVs
-bHx8dHlwZW9mIGE9PSJzdHJpbmcifHx0eXBlb2YgYT09Im51bWJlciJ8fEgubChhKSlyZXR1cm4gYQpp
-ZihhIGluc3RhbmNlb2YgUC5FNClyZXR1cm4gYS5hCmlmKEguUjkoYSkpcmV0dXJuIGEKaWYodC5hay5i
-KGEpKXJldHVybiBhCmlmKGEgaW5zdGFuY2VvZiBQLmlQKXJldHVybiBILm8yKGEpCmlmKHQuWS5iKGEp
-KXJldHVybiBQLmhFKGEsIiRkYXJ0X2pzRnVuY3Rpb24iLG5ldyBQLlBDKCkpCnJldHVybiBQLmhFKGEs
-Il8kZGFydF9qc09iamVjdCIsbmV3IFAubXQoJC5rSSgpKSl9LApoRTpmdW5jdGlvbihhLGIsYyl7dmFy
-IHM9UC5PbShhLGIpCmlmKHM9PW51bGwpe3M9Yy4kMShhKQpQLkRtKGEsYixzKX1yZXR1cm4gc30sCmRV
-OmZ1bmN0aW9uKGEpe3ZhciBzLHIKaWYoYT09bnVsbHx8dHlwZW9mIGE9PSJzdHJpbmcifHx0eXBlb2Yg
-YT09Im51bWJlciJ8fHR5cGVvZiBhPT0iYm9vbGVhbiIpcmV0dXJuIGEKZWxzZSBpZihhIGluc3RhbmNl
-b2YgT2JqZWN0JiZILlI5KGEpKXJldHVybiBhCmVsc2UgaWYoYSBpbnN0YW5jZW9mIE9iamVjdCYmdC5h
-ay5iKGEpKXJldHVybiBhCmVsc2UgaWYoYSBpbnN0YW5jZW9mIERhdGUpe3M9SC51UChhLmdldFRpbWUo
-KSkKaWYoTWF0aC5hYnMocyk8PTg2NGUxMylyPSExCmVsc2Ugcj0hMAppZihyKUgudihQLnhZKCJEYXRl
-VGltZSBpcyBvdXRzaWRlIHZhbGlkIHJhbmdlOiAiK3MpKQpQLlVJKCExLCJpc1V0YyIsdC55KQpyZXR1
-cm4gbmV3IFAuaVAocywhMSl9ZWxzZSBpZihhLmNvbnN0cnVjdG9yPT09JC5rSSgpKXJldHVybiBhLm8K
-ZWxzZSByZXR1cm4gUC5ORChhKX0sCk5EOmZ1bmN0aW9uKGEpe2lmKHR5cGVvZiBhPT0iZnVuY3Rpb24i
-KXJldHVybiBQLmlRKGEsJC53KCksbmV3IFAuTnooKSkKaWYoYSBpbnN0YW5jZW9mIEFycmF5KXJldHVy
-biBQLmlRKGEsJC5SOCgpLG5ldyBQLlFTKCkpCnJldHVybiBQLmlRKGEsJC5SOCgpLG5ldyBQLm5wKCkp
-fSwKaVE6ZnVuY3Rpb24oYSxiLGMpe3ZhciBzPVAuT20oYSxiKQppZihzPT1udWxsfHwhKGEgaW5zdGFu
-Y2VvZiBPYmplY3QpKXtzPWMuJDEoYSkKUC5EbShhLGIscyl9cmV0dXJuIHN9LApQQzpmdW5jdGlvbiBQ
-Qygpe30sCm10OmZ1bmN0aW9uIG10KGEpe3RoaXMuYT1hfSwKTno6ZnVuY3Rpb24gTnooKXt9LApRUzpm
-dW5jdGlvbiBRUygpe30sCm5wOmZ1bmN0aW9uIG5wKCl7fSwKRTQ6ZnVuY3Rpb24gRTQoYSl7dGhpcy5h
-PWF9LApyNzpmdW5jdGlvbiByNyhhKXt0aGlzLmE9YX0sClR6OmZ1bmN0aW9uIFR6KGEsYil7dGhpcy5h
-PWEKdGhpcy4kdGk9Yn0sCmNvOmZ1bmN0aW9uIGNvKCl7fSwKbmQ6ZnVuY3Rpb24gbmQoKXt9LApLZTpm
-dW5jdGlvbiBLZShhKXt0aGlzLmE9YX0sCmhpOmZ1bmN0aW9uIGhpKCl7fX0sVz17CngzOmZ1bmN0aW9u
-KCl7cmV0dXJuIHdpbmRvd30sClpyOmZ1bmN0aW9uKCl7cmV0dXJuIGRvY3VtZW50fSwKSjY6ZnVuY3Rp
-b24oYSl7dmFyIHM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpCmlmKGEhPW51bGwpQy54bi5zTFUo
-cyxhKQpyZXR1cm4gc30sClU5OmZ1bmN0aW9uKGEsYixjKXt2YXIgcyxyPWRvY3VtZW50LmJvZHkKci50
-b1N0cmluZwpzPUMuUlkucjYocixhLGIsYykKcy50b1N0cmluZwpyPXQuYWMKcj1uZXcgSC5VNShuZXcg
-Vy5lNyhzKSxyLkMoImEyKGxELkUpIikuYShuZXcgVy5DdigpKSxyLkMoIlU1PGxELkU+IikpCnJldHVy
-biB0LmguYShyLmdyOChyKSl9LApyUzpmdW5jdGlvbihhKXt2YXIgcyxyLHE9ImVsZW1lbnQgdGFnIHVu
-YXZhaWxhYmxlIgp0cnl7cz1KLllFKGEpCmlmKHR5cGVvZiBzLmducyhhKT09InN0cmluZyIpcT1zLmdu
-cyhhKX1jYXRjaChyKXtILlJ1KHIpfXJldHVybiBxfSwKQzA6ZnVuY3Rpb24oYSxiKXthPTUzNjg3MDkx
-MSZhK2IKYT01MzY4NzA5MTEmYSsoKDUyNDI4NyZhKTw8MTApCnJldHVybiBhXmE+Pj42fSwKckU6ZnVu
-Y3Rpb24oYSxiLGMsZCl7dmFyIHM9Vy5DMChXLkMwKFcuQzAoVy5DMCgwLGEpLGIpLGMpLGQpLHI9NTM2
-ODcwOTExJnMrKCg2NzEwODg2MyZzKTw8MykKcl49cj4+PjExCnJldHVybiA1MzY4NzA5MTEmcisoKDE2
-MzgzJnIpPDwxNSl9LApUTjpmdW5jdGlvbihhLGIpe3ZhciBzLHIscT1hLmNsYXNzTGlzdApmb3Iocz1i
-Lmxlbmd0aCxyPTA7cjxiLmxlbmd0aDtiLmxlbmd0aD09PXN8fCgwLEgubGspKGIpLCsrcilxLmFkZChi
-W3JdKX0sCkpFOmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIHM9Vy5hRihuZXcgVy52TihjKSx0LkIpCmlm
-KHMhPW51bGwmJiEwKUouZFooYSxiLHMsITEpCnJldHVybiBuZXcgVy54QyhhLGIscywhMSxlLkMoInhD
-PDA+IikpfSwKVHc6ZnVuY3Rpb24oYSl7dmFyIHM9Vy5KNihudWxsKSxyPXdpbmRvdy5sb2NhdGlvbgpz
-PW5ldyBXLkpRKG5ldyBXLm1rKHMscikpCnMuQ1koYSkKcmV0dXJuIHN9LApxRDpmdW5jdGlvbihhLGIs
-YyxkKXt0LmguYShhKQpILmgoYikKSC5oKGMpCnQuY3IuYShkKQpyZXR1cm4hMH0sClFXOmZ1bmN0aW9u
-KGEsYixjLGQpe3ZhciBzLHIscQp0LmguYShhKQpILmgoYikKSC5oKGMpCnM9dC5jci5hKGQpLmEKcj1z
-LmEKQy54bi5zTFUocixjKQpxPXIuaG9zdG5hbWUKcz1zLmIKaWYoIShxPT1zLmhvc3RuYW1lJiZyLnBv
-cnQ9PXMucG9ydCYmci5wcm90b2NvbD09cy5wcm90b2NvbCkpaWYocT09PSIiKWlmKHIucG9ydD09PSIi
-KXtzPXIucHJvdG9jb2wKcz1zPT09IjoifHxzPT09IiJ9ZWxzZSBzPSExCmVsc2Ugcz0hMQplbHNlIHM9
-ITAKcmV0dXJuIHN9LApCbDpmdW5jdGlvbigpe3ZhciBzPXQuTixyPVAudE0oQy5ReCxzKSxxPXQuZDAu
-YShuZXcgVy5JQSgpKSxwPUguVk0oWyJURU1QTEFURSJdLHQucykKcz1uZXcgVy5jdChyLFAuTHMocyks
-UC5McyhzKSxQLkxzKHMpLG51bGwpCnMuQ1kobnVsbCxuZXcgSC5sSihDLlF4LHEsdC5maikscCxudWxs
-KQpyZXR1cm4gc30sClB2OmZ1bmN0aW9uKGEpe2lmKGE9PW51bGwpcmV0dXJuIG51bGwKcmV0dXJuIFcu
-UDEoYSl9LApxYzpmdW5jdGlvbihhKXt2YXIgcwppZihhPT1udWxsKXJldHVybiBudWxsCmlmKCJwb3N0
-TWVzc2FnZSIgaW4gYSl7cz1XLlAxKGEpCmlmKHQuYVMuYihzKSlyZXR1cm4gcwpyZXR1cm4gbnVsbH1l
-bHNlIHJldHVybiB0LmNoLmEoYSl9LApQMTpmdW5jdGlvbihhKXtpZihhPT09d2luZG93KXJldHVybiB0
-LmNpLmEoYSkKZWxzZSByZXR1cm4gbmV3IFcuZFcoYSl9LApISDpmdW5jdGlvbihhKXtpZihhPT09d2lu
-ZG93LmxvY2F0aW9uKXJldHVybiBhCmVsc2UgcmV0dXJuIG5ldyBXLkZiKCl9LAphRjpmdW5jdGlvbihh
-LGIpe3ZhciBzPSQuWDMKaWYocz09PUMuTlUpcmV0dXJuIGEKcmV0dXJuIHMuUHkoYSxiKX0sCnFFOmZ1
-bmN0aW9uIHFFKCl7fSwKR2g6ZnVuY3Rpb24gR2goKXt9LApmWTpmdW5jdGlvbiBmWSgpe30sCm5COmZ1
-bmN0aW9uIG5CKCl7fSwKQXo6ZnVuY3Rpb24gQXooKXt9LApRUDpmdW5jdGlvbiBRUCgpe30sCm54OmZ1
-bmN0aW9uIG54KCl7fSwKb0o6ZnVuY3Rpb24gb0ooKXt9LAppZDpmdW5jdGlvbiBpZCgpe30sClFGOmZ1
-bmN0aW9uIFFGKCl7fSwKTmg6ZnVuY3Rpb24gTmgoKXt9LAphZTpmdW5jdGlvbiBhZSgpe30sCklCOmZ1
-bmN0aW9uIElCKCl7fSwKbjc6ZnVuY3Rpb24gbjcoKXt9LAp3ejpmdW5jdGlvbiB3eihhLGIpe3RoaXMu
-YT1hCnRoaXMuJHRpPWJ9LApjdjpmdW5jdGlvbiBjdigpe30sCkN2OmZ1bmN0aW9uIEN2KCl7fSwKZWE6
-ZnVuY3Rpb24gZWEoKXt9LApEMDpmdW5jdGlvbiBEMCgpe30sCmhIOmZ1bmN0aW9uIGhIKCl7fSwKaDQ6
-ZnVuY3Rpb24gaDQoKXt9LApicjpmdW5jdGlvbiBicigpe30sClZiOmZ1bmN0aW9uIFZiKCl7fSwKZko6
-ZnVuY3Rpb24gZkooKXt9LAp3YTpmdW5jdGlvbiB3YSgpe30sClNnOmZ1bmN0aW9uIFNnKCl7fSwKdTg6
-ZnVuY3Rpb24gdTgoKXt9LApBajpmdW5jdGlvbiBBaigpe30sCmU3OmZ1bmN0aW9uIGU3KGEpe3RoaXMu
-YT1hfSwKdUg6ZnVuY3Rpb24gdUgoKXt9LApCSDpmdW5jdGlvbiBCSCgpe30sClNOOmZ1bmN0aW9uIFNO
-KCl7fSwKZXc6ZnVuY3Rpb24gZXcoKXt9LApscDpmdW5jdGlvbiBscCgpe30sClRiOmZ1bmN0aW9uIFRi
-KCl7fSwKSXY6ZnVuY3Rpb24gSXYoKXt9LApXUDpmdW5jdGlvbiBXUCgpe30sCnlZOmZ1bmN0aW9uIHlZ
-KCl7fSwKdzY6ZnVuY3Rpb24gdzYoKXt9LApLNTpmdW5jdGlvbiBLNSgpe30sCkNtOmZ1bmN0aW9uIENt
-KCl7fSwKQ1E6ZnVuY3Rpb24gQ1EoKXt9LAp3NDpmdW5jdGlvbiB3NCgpe30sCnJoOmZ1bmN0aW9uIHJo
-KCl7fSwKY2Y6ZnVuY3Rpb24gY2YoKXt9LAppNzpmdW5jdGlvbiBpNyhhKXt0aGlzLmE9YX0sClN5OmZ1
-bmN0aW9uIFN5KGEpe3RoaXMuYT1hfSwKS1M6ZnVuY3Rpb24gS1MoYSxiKXt0aGlzLmE9YQp0aGlzLmI9
-Yn0sCkEzOmZ1bmN0aW9uIEEzKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApJNDpmdW5jdGlvbiBJNChh
-KXt0aGlzLmE9YX0sCkZrOmZ1bmN0aW9uIEZrKGEsYil7dGhpcy5hPWEKdGhpcy4kdGk9Yn0sClJPOmZ1
-bmN0aW9uIFJPKGEsYixjLGQpe3ZhciBfPXRoaXMKXy5hPWEKXy5iPWIKXy5jPWMKXy4kdGk9ZH0sCmV1
-OmZ1bmN0aW9uIGV1KGEsYixjLGQpe3ZhciBfPXRoaXMKXy5hPWEKXy5iPWIKXy5jPWMKXy4kdGk9ZH0s
-CnhDOmZ1bmN0aW9uIHhDKGEsYixjLGQsZSl7dmFyIF89dGhpcwpfLmI9YQpfLmM9YgpfLmQ9YwpfLmU9
-ZApfLiR0aT1lfSwKdk46ZnVuY3Rpb24gdk4oYSl7dGhpcy5hPWF9LApKUTpmdW5jdGlvbiBKUShhKXt0
-aGlzLmE9YX0sCkdtOmZ1bmN0aW9uIEdtKCl7fSwKdkQ6ZnVuY3Rpb24gdkQoYSl7dGhpcy5hPWF9LApV
-djpmdW5jdGlvbiBVdihhKXt0aGlzLmE9YX0sCkVnOmZ1bmN0aW9uIEVnKGEsYixjKXt0aGlzLmE9YQp0
-aGlzLmI9Ygp0aGlzLmM9Y30sCm02OmZ1bmN0aW9uIG02KCl7fSwKRW86ZnVuY3Rpb24gRW8oKXt9LApX
-azpmdW5jdGlvbiBXaygpe30sCmN0OmZ1bmN0aW9uIGN0KGEsYixjLGQsZSl7dmFyIF89dGhpcwpfLmU9
-YQpfLmE9YgpfLmI9YwpfLmM9ZApfLmQ9ZX0sCklBOmZ1bmN0aW9uIElBKCl7fSwKT3c6ZnVuY3Rpb24g
-T3coKXt9LApXOTpmdW5jdGlvbiBXOShhLGIsYyl7dmFyIF89dGhpcwpfLmE9YQpfLmI9YgpfLmM9LTEK
-Xy5kPW51bGwKXy4kdGk9Y30sCmRXOmZ1bmN0aW9uIGRXKGEpe3RoaXMuYT1hfSwKRmI6ZnVuY3Rpb24g
-RmIoKXt9LAptazpmdW5jdGlvbiBtayhhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKS286ZnVuY3Rpb24g
-S28oYSl7dGhpcy5hPWEKdGhpcy5iPSExfSwKZm06ZnVuY3Rpb24gZm0oYSl7dGhpcy5hPWF9LApMZTpm
-dW5jdGlvbiBMZSgpe30sCks3OmZ1bmN0aW9uIEs3KCl7fSwKckI6ZnVuY3Rpb24gckIoKXt9LApYVzpm
-dW5jdGlvbiBYVygpe30sCm9hOmZ1bmN0aW9uIG9hKCl7fX0sTT17Ck9YOmZ1bmN0aW9uKGEpe3N3aXRj
-aChhKXtjYXNlIEMuQWQ6cmV0dXJuIkFkZCAvKj8qLyBoaW50IgpjYXNlIEMubmU6cmV0dXJuIkFkZCAv
-KiEqLyBoaW50IgpjYXNlIEMud1Y6cmV0dXJuIlJlbW92ZSAvKj8qLyBoaW50IgpjYXNlIEMuZlI6cmV0
-dXJuIlJlbW92ZSAvKiEqLyBoaW50IgpjYXNlIEMubXk6cmV0dXJuIkNoYW5nZSB0byAvKj8qLyBoaW50
-IgpjYXNlIEMucng6cmV0dXJuIkNoYW5nZSB0byAvKiEqLyBoaW50In1yZXR1cm4gbnVsbH0sCkg3OmZ1
-bmN0aW9uIEg3KGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApZRjpmdW5jdGlvbihhLGIpe3ZhciBzLHIs
-cSxwLG8sbixtLGwKZm9yKHM9Yi5sZW5ndGgscj0xO3I8czsrK3Ipe2lmKGJbcl09PW51bGx8fGJbci0x
-XSE9bnVsbCljb250aW51ZQpmb3IoO3M+PTE7cz1xKXtxPXMtMQppZihiW3FdIT1udWxsKWJyZWFrfXA9
-bmV3IFAuUm4oIiIpCm89YSsiKCIKcC5hPW8Kbj1ILnQ2KGIpCm09bi5DKCJuSDwxPiIpCmw9bmV3IEgu
-bkgoYiwwLHMsbSkKbC5IZChiLDAscyxuLmMpCm09bytuZXcgSC5sSihsLG0uQygicVUoYUwuRSkiKS5h
-KG5ldyBNLk5vKCkpLG0uQygibEo8YUwuRSxxVT4iKSkuSCgwLCIsICIpCnAuYT1tCnAuYT1tKygiKTog
-cGFydCAiKyhyLTEpKyIgd2FzIG51bGwsIGJ1dCBwYXJ0ICIrcisiIHdhcyBub3QuIikKdGhyb3cgSC5i
-KFAueFkocC53KDApKSl9fSwKbEk6ZnVuY3Rpb24gbEkoYSl7dGhpcy5hPWF9LApxNzpmdW5jdGlvbiBx
-Nygpe30sCk5vOmZ1bmN0aW9uIE5vKCl7fX0sVT17Cm56OmZ1bmN0aW9uKGEpe3ZhciBzPUgudVAoYS5x
-KDAsIm5vZGVJZCIpKQpyZXR1cm4gbmV3IFUuTEwoQy5ObS5IdChDLnJrLG5ldyBVLk1EKGEpKSxzKX0s
-CkxMOmZ1bmN0aW9uIExMKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApNRDpmdW5jdGlvbiBNRChhKXt0
-aGlzLmE9YX0sCmpmOmZ1bmN0aW9uKGEpe3ZhciBzLHIscSxwCmlmKGE9PW51bGwpcz1udWxsCmVsc2V7
-cz1ILlZNKFtdLHQuZDcpCmZvcihyPUouSVQodC5VLmEoYSkpO3IuRigpOyl7cT1yLmdsKCkKcD1KLlU2
-KHEpCkMuTm0uaShzLG5ldyBVLlNlKEguaChwLnEocSwiZGVzY3JpcHRpb24iKSksSC5oKHAucShxLCJo
-cmVmIikpKSl9fXJldHVybiBzfSwKTmQ6ZnVuY3Rpb24oYSl7dmFyIHMscgppZihhPT1udWxsKXM9bnVs
-bAplbHNle3M9SC5WTShbXSx0LmFBKQpmb3Iocj1KLklUKHQuVS5hKGEpKTtyLkYoKTspQy5ObS5pKHMs
-VS5OZihyLmdsKCkpKX1yZXR1cm4gc30sCk5mOmZ1bmN0aW9uKGEpe3ZhciBzPUouVTYoYSkscj1ILmgo
-cy5xKGEsImRlc2NyaXB0aW9uIikpLHE9SC5WTShbXSx0LmFKKQpmb3Iocz1KLklUKHQuVS5hKHMucShh
-LCJlbnRyaWVzIikpKTtzLkYoKTspQy5ObS5pKHEsVS5SaihzLmdsKCkpKQpyZXR1cm4gbmV3IFUueUQo
-cixxKX0sClJqOmZ1bmN0aW9uKGEpe3ZhciBzLHI9Si5VNihhKSxxPUguaChyLnEoYSwiZGVzY3JpcHRp
-b24iKSkscD1ILmgoci5xKGEsImZ1bmN0aW9uIikpLG89ci5xKGEsImxpbmsiKQppZihvPT1udWxsKW89
-bnVsbAplbHNle3M9Si5VNihvKQpvPW5ldyBVLk1sKEguaChzLnEobywiaHJlZiIpKSxILnVQKHMucShv
-LCJsaW5lIikpLEguaChzLnEobywicGF0aCIpKSl9cj10LmZLLmEoci5xKGEsImhpbnRBY3Rpb25zIikp
-CnI9cj09bnVsbD9udWxsOkouTTEocixuZXcgVS5hTigpLHQuYVgpCnI9cj09bnVsbD9udWxsOnIuYnIo
-MCkKcmV0dXJuIG5ldyBVLndiKHEscCxvLHI9PW51bGw/Qy5kbjpyKX0sCmQyOmZ1bmN0aW9uIGQyKGEs
-YixjLGQsZSxmKXt2YXIgXz10aGlzCl8uYT1hCl8uYj1iCl8uYz1jCl8uZD1kCl8uZT1lCl8uZj1mfSwK
-U2U6ZnVuY3Rpb24gU2UoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCk1sOmZ1bmN0aW9uIE1sKGEsYixj
-KXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9Y30sCnlEOmZ1bmN0aW9uIHlEKGEsYil7dGhpcy5hPWEK
-dGhpcy5iPWJ9LAp3YjpmdW5jdGlvbiB3YihhLGIsYyxkKXt2YXIgXz10aGlzCl8uYT1hCl8uYj1iCl8u
-Yz1jCl8uZD1kfSwKYU46ZnVuY3Rpb24gYU4oKXt9LApiMDpmdW5jdGlvbiBiMCgpe319LEI9ewp3Ujpm
-dW5jdGlvbigpe3JldHVybiBuZXcgQi5xcCgiIiwiIiwiIixDLkR4KX0sCllmOmZ1bmN0aW9uKGEpe3Zh
-ciBzLHIscSxwLG8sbixtLGwsaz1ILmgoYS5xKDAsInJlZ2lvbnMiKSksaj1ILmgoYS5xKDAsIm5hdmln
-YXRpb25Db250ZW50IikpLGk9SC5oKGEucSgwLCJzb3VyY2VDb2RlIikpLGg9UC5GbCh0LlgsdC5kXykK
-Zm9yKHM9dC50LmEoYS5xKDAsImVkaXRzIikpLHM9cy5nUHUocykscz1zLmdreihzKSxyPXQuVSxxPXQu
-aDQ7cy5GKCk7KXtwPXMuZ2woKQpvPXAuYQpuPUguVk0oW10scSkKZm9yKHA9Si5JVChyLmEocC5iKSk7
-cC5GKCk7KXttPXAuZ2woKQpsPUouVTYobSkKQy5ObS5pKG4sbmV3IEIuajgoSC51UChsLnEobSwibGlu
-ZSIpKSxILmgobC5xKG0sImV4cGxhbmF0aW9uIikpLEgudVAobC5xKG0sIm9mZnNldCIpKSkpfWguWSgw
-LG8sbil9cmV0dXJuIG5ldyBCLnFwKGssaixpLGgpfSwKajg6ZnVuY3Rpb24gajgoYSxiLGMpe3RoaXMu
-YT1hCnRoaXMuYj1iCnRoaXMuYz1jfSwKcXA6ZnVuY3Rpb24gcXAoYSxiLGMsZCl7dmFyIF89dGhpcwpf
-LmE9YQpfLmI9YgpfLmM9YwpfLmQ9ZH0sCmZ2OmZ1bmN0aW9uIGZ2KCl7fSwKT1M6ZnVuY3Rpb24oYSl7
-dmFyIHMKaWYoIShhPj02NSYmYTw9OTApKXM9YT49OTcmJmE8PTEyMgplbHNlIHM9ITAKcmV0dXJuIHN9
-LApZdTpmdW5jdGlvbihhLGIpe3ZhciBzPWEubGVuZ3RoLHI9YisyCmlmKHM8cilyZXR1cm4hMQppZigh
-Qi5PUyhDLnhCLm0oYSxiKSkpcmV0dXJuITEKaWYoQy54Qi5tKGEsYisxKSE9PTU4KXJldHVybiExCmlm
-KHM9PT1yKXJldHVybiEwCnJldHVybiBDLnhCLm0oYSxyKT09PTQ3fX0sVD17bVE6ZnVuY3Rpb24gbVEo
+cm4gYX1pZihhIGluc3RhbmNlb2YgUC5NaClyZXR1cm4gYQpyZXR1cm4gSi5rcyhhKX0sCnJZOmZ1bmN0
+aW9uKGEpe2lmKHR5cGVvZiBhPT0ic3RyaW5nIilyZXR1cm4gSi5Eci5wcm90b3R5cGUKaWYoYT09bnVs
+bClyZXR1cm4gYQppZighKGEgaW5zdGFuY2VvZiBQLk1oKSlyZXR1cm4gSi5rZC5wcm90b3R5cGUKcmV0
+dXJuIGF9LAp2ZDpmdW5jdGlvbihhKXtpZih0eXBlb2YgYT09Im51bWJlciIpcmV0dXJuIEoucUkucHJv
+dG90eXBlCmlmKGE9PW51bGwpcmV0dXJuIGEKaWYoIShhIGluc3RhbmNlb2YgUC5NaCkpcmV0dXJuIEou
+a2QucHJvdG90eXBlCnJldHVybiBhfSwKdzE6ZnVuY3Rpb24oYSl7aWYoYT09bnVsbClyZXR1cm4gYQpp
+ZihhLmNvbnN0cnVjdG9yPT1BcnJheSlyZXR1cm4gSi5qZC5wcm90b3R5cGUKaWYodHlwZW9mIGEhPSJv
+YmplY3QiKXtpZih0eXBlb2YgYT09ImZ1bmN0aW9uIilyZXR1cm4gSi5jNS5wcm90b3R5cGUKcmV0dXJu
+IGF9aWYoYSBpbnN0YW5jZW9mIFAuTWgpcmV0dXJuIGEKcmV0dXJuIEoua3MoYSl9LApBNTpmdW5jdGlv
+bihhLGIpe3JldHVybiBKLncxKGEpLmVSKGEsYil9LApFaDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIEou
+WUUoYSkubUsoYSxiLGMpfSwKRWw6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi53MShhKS5kcihhLGIpfSwK
+Rjc6ZnVuY3Rpb24oYSl7cmV0dXJuIEouVTYoYSkuZ29yKGEpfSwKRkw6ZnVuY3Rpb24oYSxiKXtyZXR1
+cm4gSi5yWShhKS5kZChhLGIpfSwKR0E6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi53MShhKS5FKGEsYil9
+LApIbTpmdW5jdGlvbihhKXtyZXR1cm4gSi5VNihhKS5nQShhKX0sCklUOmZ1bmN0aW9uKGEpe3JldHVy
+biBKLncxKGEpLmdtKGEpfSwKSnk6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5pYShhKS5lNyhhLGIpfSwK
+S1Y6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5yWShhKS5HKGEsYil9LApMdDpmdW5jdGlvbihhKXtyZXR1
+cm4gSi5ZRShhKS53ZyhhKX0sCk0xOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gSi53MShhKS5FMihhLGIs
+Yyl9LApNdTpmdW5jdGlvbihhLGIpe3JldHVybiBKLllFKGEpLnNEKGEsYil9LApRejpmdW5jdGlvbihh
+LGIpe3JldHVybiBKLnJZKGEpLlcoYSxiKX0sClJNOmZ1bmN0aW9uKGEsYil7aWYoYT09bnVsbClyZXR1
+cm4gYj09bnVsbAppZih0eXBlb2YgYSE9Im9iamVjdCIpcmV0dXJuIGIhPW51bGwmJmE9PT1iCnJldHVy
+biBKLmlhKGEpLkROKGEsYil9LApSWDpmdW5jdGlvbihhKXtyZXR1cm4gSi53MShhKS5icihhKX0sClQw
+OmZ1bmN0aW9uKGEpe3JldHVybiBKLnJZKGEpLmJTKGEpfSwKVnU6ZnVuY3Rpb24oYSl7cmV0dXJuIEou
+dmQoYSkuelEoYSl9LAphNjpmdW5jdGlvbihhLGIpe3JldHVybiBKLnJZKGEpLk8yKGEsYil9LApiVDpm
+dW5jdGlvbihhKXtyZXR1cm4gSi5ZRShhKS5ENChhKX0sCmJiOmZ1bmN0aW9uKGEsYil7aWYodHlwZW9m
+IGE9PSJudW1iZXIiJiZ0eXBlb2YgYj09Im51bWJlciIpcmV0dXJuIGErYgpyZXR1cm4gSi5USihhKS5o
+KGEsYil9LApjSDpmdW5jdGlvbihhKXtyZXR1cm4gSi5yWShhKS5oYyhhKX0sCmRSOmZ1bmN0aW9uKGEp
+e3JldHVybiBKLllFKGEpLmdEKGEpfSwKZFo6ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIEouWUUoYSku
+T24oYSxiLGMsZCl9LApkZzpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gSi5yWShhKS5pNyhhLGIsYyxk
+KX0sCmRoOmZ1bmN0aW9uKGEpe3JldHVybiBKLllFKGEpLkZGKGEpfSwKZHI6ZnVuY3Rpb24oYSxiKXty
+ZXR1cm4gSi5ZRShhKS5zYTQoYSxiKX0sCmhmOmZ1bmN0aW9uKGEpe3JldHVybiBKLmlhKGEpLmdpTyhh
+KX0sCmlnOmZ1bmN0aW9uKGEpe3JldHVybiBKLllFKGEpLmdRZyhhKX0sCmo6ZnVuY3Rpb24oYSl7cmV0
+dXJuIEouaWEoYSkudyhhKX0sCmw1OmZ1bmN0aW9uKGEsYil7cmV0dXJuIEouWUUoYSkuc2hmKGEsYil9
+LApsZDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIEouclkoYSkuTmooYSxiLGMpfSwKcDQ6ZnVuY3Rpb24o
+YSxiKXtyZXR1cm4gSi5yWShhKS5UYyhhLGIpfSwKcTA6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBKLnJZ
+KGEpLlFpKGEsYixjKX0sCnFGOmZ1bmN0aW9uKGEpe3JldHVybiBKLllFKGEpLmdWbChhKX0sCnRIOmZ1
+bmN0aW9uKGEsYixjKXtyZXR1cm4gSi5ZRShhKS5wayhhLGIsYyl9LAp1OTpmdW5jdGlvbihhLGIsYyl7
+cmV0dXJuIEoudzEoYSkuWShhLGIsYyl9LAp1VTpmdW5jdGlvbihhKXtyZXR1cm4gSi5VNihhKS5nbDAo
+YSl9LAp3ZjpmdW5jdGlvbihhLGIpe3JldHVybiBKLllFKGEpLnNSTihhLGIpfSwKeDk6ZnVuY3Rpb24o
+YSxiKXtpZih0eXBlb2YgYj09PSJudW1iZXIiKWlmKGEuY29uc3RydWN0b3I9PUFycmF5fHx0eXBlb2Yg
+YT09InN0cmluZyJ8fEgud1YoYSxhW3YuZGlzcGF0Y2hQcm9wZXJ0eU5hbWVdKSlpZihiPj4+MD09PWIm
+JmI8YS5sZW5ndGgpcmV0dXJuIGFbYl0KcmV0dXJuIEouVTYoYSkucShhLGIpfSwKemw6ZnVuY3Rpb24o
+YSxiKXtyZXR1cm4gSi5VNihhKS50ZyhhLGIpfSwKdkI6ZnVuY3Rpb24gdkIoKXt9LAp5RTpmdW5jdGlv
+biB5RSgpe30sCndlOmZ1bmN0aW9uIHdlKCl7fSwKTUY6ZnVuY3Rpb24gTUYoKXt9LAppQzpmdW5jdGlv
+biBpQygpe30sCmtkOmZ1bmN0aW9uIGtkKCl7fSwKYzU6ZnVuY3Rpb24gYzUoKXt9LApqZDpmdW5jdGlv
+biBqZChhKXt0aGlzLiR0aT1hfSwKUG86ZnVuY3Rpb24gUG8oYSl7dGhpcy4kdGk9YX0sCm0xOmZ1bmN0
+aW9uIG0xKGEsYixjKXt2YXIgXz10aGlzCl8uYT1hCl8uYj1iCl8uYz0wCl8uZD1udWxsCl8uJHRpPWN9
+LApxSTpmdW5jdGlvbiBxSSgpe30sCmJVOmZ1bmN0aW9uIGJVKCl7fSwKVkE6ZnVuY3Rpb24gVkEoKXt9
+LApEcjpmdW5jdGlvbiBEcigpe319LFA9ewpPajpmdW5jdGlvbigpe3ZhciBzLHIscT17fQppZihzZWxm
+LnNjaGVkdWxlSW1tZWRpYXRlIT1udWxsKXJldHVybiBQLkVYKCkKaWYoc2VsZi5NdXRhdGlvbk9ic2Vy
+dmVyIT1udWxsJiZzZWxmLmRvY3VtZW50IT1udWxsKXtzPXNlbGYuZG9jdW1lbnQuY3JlYXRlRWxlbWVu
+dCgiZGl2IikKcj1zZWxmLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKQpxLmE9bnVsbApuZXcg
+c2VsZi5NdXRhdGlvbk9ic2VydmVyKEgudFIobmV3IFAudGgocSksMSkpLm9ic2VydmUocyx7Y2hpbGRM
+aXN0OnRydWV9KQpyZXR1cm4gbmV3IFAuaGEocSxzLHIpfWVsc2UgaWYoc2VsZi5zZXRJbW1lZGlhdGUh
+PW51bGwpcmV0dXJuIFAueXQoKQpyZXR1cm4gUC5xVygpfSwKWlY6ZnVuY3Rpb24oYSl7c2VsZi5zY2hl
+ZHVsZUltbWVkaWF0ZShILnRSKG5ldyBQLlZzKHQuTS5hKGEpKSwwKSl9LApvQTpmdW5jdGlvbihhKXtz
+ZWxmLnNldEltbWVkaWF0ZShILnRSKG5ldyBQLkZ0KHQuTS5hKGEpKSwwKSl9LApCejpmdW5jdGlvbihh
+KXt0Lk0uYShhKQpQLlFOKDAsYSl9LApRTjpmdW5jdGlvbihhLGIpe3ZhciBzPW5ldyBQLlczKCkKcy5D
+WShhLGIpCnJldHVybiBzfSwKRlg6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBQLmloKG5ldyBQLnZzKCQu
+WDMsYS5DKCJ2czwwPiIpKSxhLkMoImloPDA+IikpfSwKREk6ZnVuY3Rpb24oYSxiKXthLiQyKDAsbnVs
+bCkKYi5iPSEwCnJldHVybiBiLmF9LApqUTpmdW5jdGlvbihhLGIpe1AuSmUoYSxiKX0sCnlDOmZ1bmN0
+aW9uKGEsYil7Yi5hTSgwLGEpfSwKZjM6ZnVuY3Rpb24oYSxiKXtiLncwKEguUnUoYSksSC50cyhhKSl9
+LApKZTpmdW5jdGlvbihhLGIpe3ZhciBzLHIscT1uZXcgUC5XTShiKSxwPW5ldyBQLlNYKGIpCmlmKGEg
+aW5zdGFuY2VvZiBQLnZzKWEuUWQocSxwLHQueikKZWxzZXtzPXQuegppZih0LmQuYihhKSlhLlNxKHEs
+cCxzKQplbHNle3I9bmV3IFAudnMoJC5YMyx0LmMpCnIuYT00CnIuYz1hCnIuUWQocSxwLHMpfX19LAps
+ejpmdW5jdGlvbihhKXt2YXIgcz1mdW5jdGlvbihiLGMpe3JldHVybiBmdW5jdGlvbihkLGUpe3doaWxl
+KHRydWUpdHJ5e2IoZCxlKQpicmVha31jYXRjaChyKXtlPXIKZD1jfX19KGEsMSkKcmV0dXJuICQuWDMu
+TGoobmV3IFAuR3MocyksdC5ILHQuUyx0LnopfSwKR1E6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBQLkZ5
+KGEsMSl9LApUaDpmdW5jdGlvbigpe3JldHVybiBDLndRfSwKWW06ZnVuY3Rpb24oYSl7cmV0dXJuIG5l
+dyBQLkZ5KGEsMyl9LApsMDpmdW5jdGlvbihhLGIpe3JldHVybiBuZXcgUC5xNChhLGIuQygicTQ8MD4i
+KSl9LAprMzpmdW5jdGlvbihhLGIpe3ZhciBzLHIscQpiLmE9MQp0cnl7YS5TcShuZXcgUC5wVihiKSxu
+ZXcgUC5VNyhiKSx0LlApfWNhdGNoKHEpe3M9SC5SdShxKQpyPUgudHMocSkKUC5yYihuZXcgUC52cihi
+LHMscikpfX0sCkE5OmZ1bmN0aW9uKGEsYil7dmFyIHMscixxCmZvcihzPXQuYztyPWEuYSxyPT09Mjsp
+YT1zLmEoYS5jKQppZihyPj00KXtxPWIuYWgoKQpiLmE9YS5hCmIuYz1hLmMKUC5IWihiLHEpfWVsc2V7
+cT10LkYuYShiLmMpCmIuYT0yCmIuYz1hCmEualEocSl9fSwKSFo6ZnVuY3Rpb24oYTAsYTEpe3ZhciBz
+LHIscSxwLG8sbixtLGwsayxqLGksaCxnLGYsZSxkLGM9bnVsbCxiPXt9LGE9Yi5hPWEwCmZvcihzPXQu
+bixyPXQuRixxPXQuZDshMDspe3A9e30Kbz1hLmE9PT04CmlmKGExPT1udWxsKXtpZihvKXtuPXMuYShh
+LmMpClAuTDIoYyxjLGEuYixuLmEsbi5iKX1yZXR1cm59cC5hPWExCm09YTEuYQpmb3IoYT1hMTttIT1u
+dWxsO2E9bSxtPWwpe2EuYT1udWxsClAuSFooYi5hLGEpCnAuYT1tCmw9bS5hfWs9Yi5hCmo9ay5jCnAu
+Yj1vCnAuYz1qCmk9IW8KaWYoaSl7aD1hLmMKaD0oaCYxKSE9PTB8fChoJjE1KT09PTh9ZWxzZSBoPSEw
+CmlmKGgpe2c9YS5iLmIKaWYobyl7aD1rLmI9PT1nCmg9IShofHxoKX1lbHNlIGg9ITEKaWYoaCl7cy5h
+KGopClAuTDIoYyxjLGsuYixqLmEsai5iKQpyZXR1cm59Zj0kLlgzCmlmKGYhPT1nKSQuWDM9ZwplbHNl
+IGY9YwphPWEuYwppZigoYSYxNSk9PT04KW5ldyBQLlJUKHAsYixvKS4kMCgpCmVsc2UgaWYoaSl7aWYo
+KGEmMSkhPT0wKW5ldyBQLnJxKHAsaikuJDAoKX1lbHNlIGlmKChhJjIpIT09MCluZXcgUC5SVyhiLHAp
+LiQwKCkKaWYoZiE9bnVsbCkkLlgzPWYKYT1wLmMKaWYocS5iKGEpKXtlPXAuYS5iCmlmKGEuYT49NCl7
+ZD1yLmEoZS5jKQplLmM9bnVsbAphMT1lLk44KGQpCmUuYT1hLmEKZS5jPWEuYwpiLmE9YQpjb250aW51
+ZX1lbHNlIFAuQTkoYSxlKQpyZXR1cm59fWU9cC5hLmIKZD1yLmEoZS5jKQplLmM9bnVsbAphMT1lLk44
+KGQpCmE9cC5iCms9cC5jCmlmKCFhKXtlLiR0aS5jLmEoaykKZS5hPTQKZS5jPWt9ZWxzZXtzLmEoaykK
+ZS5hPTgKZS5jPWt9Yi5hPWUKYT1lfX0sClZIOmZ1bmN0aW9uKGEsYil7dmFyIHMKaWYodC5hZy5iKGEp
+KXJldHVybiBiLkxqKGEsdC56LHQuSyx0LmwpCnM9dC5iSQppZihzLmIoYSkpcmV0dXJuIHMuYShhKQp0
+aHJvdyBILmIoUC5MMyhhLCJvbkVycm9yIiwiRXJyb3IgaGFuZGxlciBtdXN0IGFjY2VwdCBvbmUgT2Jq
+ZWN0IG9yIG9uZSBPYmplY3QgYW5kIGEgU3RhY2tUcmFjZSBhcyBhcmd1bWVudHMsIGFuZCByZXR1cm4g
+YSBhIHZhbGlkIHJlc3VsdCIpKX0sCnB1OmZ1bmN0aW9uKCl7dmFyIHMscgpmb3Iocz0kLlM2O3MhPW51
+bGw7cz0kLlM2KXskLm1nPW51bGwKcj1zLmIKJC5TNj1yCmlmKHI9PW51bGwpJC5rOD1udWxsCnMuYS4k
+MCgpfX0sCmVOOmZ1bmN0aW9uKCl7JC5VRD0hMAp0cnl7UC5wdSgpfWZpbmFsbHl7JC5tZz1udWxsCiQu
+VUQ9ITEKaWYoJC5TNiE9bnVsbCkkLnV0KCkuJDEoUC5WOSgpKX19LAplVzpmdW5jdGlvbihhKXt2YXIg
+cz1uZXcgUC5PTShhKSxyPSQuazgKaWYocj09bnVsbCl7JC5TNj0kLms4PXMKaWYoISQuVUQpJC51dCgp
+LiQxKFAuVjkoKSl9ZWxzZSAkLms4PXIuYj1zfSwKclI6ZnVuY3Rpb24oYSl7dmFyIHMscixxLHA9JC5T
+NgppZihwPT1udWxsKXtQLmVXKGEpCiQubWc9JC5rOApyZXR1cm59cz1uZXcgUC5PTShhKQpyPSQubWcK
+aWYocj09bnVsbCl7cy5iPXAKJC5TNj0kLm1nPXN9ZWxzZXtxPXIuYgpzLmI9cQokLm1nPXIuYj1zCmlm
+KHE9PW51bGwpJC5rOD1zfX0sCnJiOmZ1bmN0aW9uKGEpe3ZhciBzPW51bGwscj0kLlgzCmlmKEMuTlU9
+PT1yKXtQLlRrKHMscyxDLk5VLGEpCnJldHVybn1QLlRrKHMscyxyLHQuTS5hKHIuR1koYSkpKX0sClF3
+OmZ1bmN0aW9uKGEsYil7UC5VSShhLCJzdHJlYW0iLHQuUikKcmV0dXJuIG5ldyBQLnhJKGIuQygieEk8
+MD4iKSl9LApUbDpmdW5jdGlvbihhLGIpe3ZhciBzPWI9PW51bGw/UC52MChhKTpiClAuVUkoYSwiZXJy
+b3IiLHQuSykKcmV0dXJuIG5ldyBQLkN3KGEscyl9LAp2MDpmdW5jdGlvbihhKXt2YXIgcwppZih0LnIu
+YihhKSl7cz1hLmdJSSgpCmlmKHMhPW51bGwpcmV0dXJuIHN9cmV0dXJuIEMucGR9LApMMjpmdW5jdGlv
+bihhLGIsYyxkLGUpe1AuclIobmV3IFAucEsoZCxlKSl9LApUODpmdW5jdGlvbihhLGIsYyxkLGUpe3Zh
+ciBzLHI9JC5YMwppZihyPT09YylyZXR1cm4gZC4kMCgpCiQuWDM9YwpzPXIKdHJ5e3I9ZC4kMCgpCnJl
+dHVybiByfWZpbmFsbHl7JC5YMz1zfX0sCnl2OmZ1bmN0aW9uKGEsYixjLGQsZSxmLGcpe3ZhciBzLHI9
+JC5YMwppZihyPT09YylyZXR1cm4gZC4kMShlKQokLlgzPWMKcz1yCnRyeXtyPWQuJDEoZSkKcmV0dXJu
+IHJ9ZmluYWxseXskLlgzPXN9fSwKUXg6ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyxoLGkpe3ZhciBzLHI9
+JC5YMwppZihyPT09YylyZXR1cm4gZC4kMihlLGYpCiQuWDM9YwpzPXIKdHJ5e3I9ZC4kMihlLGYpCnJl
+dHVybiByfWZpbmFsbHl7JC5YMz1zfX0sClRrOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBzCnQuTS5hKGQp
+CnM9Qy5OVSE9PWMKaWYocylkPSEoIXN8fCExKT9jLkdZKGQpOmMuUlQoZCx0LkgpClAuZVcoZCl9LAp0
+aDpmdW5jdGlvbiB0aChhKXt0aGlzLmE9YX0sCmhhOmZ1bmN0aW9uIGhhKGEsYixjKXt0aGlzLmE9YQp0
+aGlzLmI9Ygp0aGlzLmM9Y30sClZzOmZ1bmN0aW9uIFZzKGEpe3RoaXMuYT1hfSwKRnQ6ZnVuY3Rpb24g
+RnQoYSl7dGhpcy5hPWF9LApXMzpmdW5jdGlvbiBXMygpe30sCnlIOmZ1bmN0aW9uIHlIKGEsYil7dGhp
+cy5hPWEKdGhpcy5iPWJ9LAppaDpmdW5jdGlvbiBpaChhLGIpe3RoaXMuYT1hCnRoaXMuYj0hMQp0aGlz
+LiR0aT1ifSwKV006ZnVuY3Rpb24gV00oYSl7dGhpcy5hPWF9LApTWDpmdW5jdGlvbiBTWChhKXt0aGlz
+LmE9YX0sCkdzOmZ1bmN0aW9uIEdzKGEpe3RoaXMuYT1hfSwKRnk6ZnVuY3Rpb24gRnkoYSxiKXt0aGlz
+LmE9YQp0aGlzLmI9Yn0sCkdWOmZ1bmN0aW9uIEdWKGEsYil7dmFyIF89dGhpcwpfLmE9YQpfLmQ9Xy5j
+PV8uYj1udWxsCl8uJHRpPWJ9LApxNDpmdW5jdGlvbiBxNChhLGIpe3RoaXMuYT1hCnRoaXMuJHRpPWJ9
+LApQZjpmdW5jdGlvbiBQZigpe30sClpmOmZ1bmN0aW9uIFpmKGEsYil7dGhpcy5hPWEKdGhpcy4kdGk9
+Yn0sCkZlOmZ1bmN0aW9uIEZlKGEsYixjLGQsZSl7dmFyIF89dGhpcwpfLmE9bnVsbApfLmI9YQpfLmM9
+YgpfLmQ9YwpfLmU9ZApfLiR0aT1lfSwKdnM6ZnVuY3Rpb24gdnMoYSxiKXt2YXIgXz10aGlzCl8uYT0w
+Cl8uYj1hCl8uYz1udWxsCl8uJHRpPWJ9LApkYTpmdW5jdGlvbiBkYShhLGIpe3RoaXMuYT1hCnRoaXMu
+Yj1ifSwKb1E6ZnVuY3Rpb24gb1EoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCnBWOmZ1bmN0aW9uIHBW
+KGEpe3RoaXMuYT1hfSwKVTc6ZnVuY3Rpb24gVTcoYSl7dGhpcy5hPWF9LAp2cjpmdW5jdGlvbiB2cihh
+LGIsYyl7dGhpcy5hPWEKdGhpcy5iPWIKdGhpcy5jPWN9LApydDpmdW5jdGlvbiBydChhLGIpe3RoaXMu
+YT1hCnRoaXMuYj1ifSwKS0Y6ZnVuY3Rpb24gS0YoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sClpMOmZ1
+bmN0aW9uIFpMKGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9Y30sClJUOmZ1bmN0aW9uIFJU
+KGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9Y30sCmpaOmZ1bmN0aW9uIGpaKGEpe3RoaXMu
+YT1hfSwKcnE6ZnVuY3Rpb24gcnEoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sClJXOmZ1bmN0aW9uIFJX
+KGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApPTTpmdW5jdGlvbiBPTShhKXt0aGlzLmE9YQp0aGlzLmI9
+bnVsbH0sCnFoOmZ1bmN0aW9uIHFoKCl7fSwKQjU6ZnVuY3Rpb24gQjUoYSxiKXt0aGlzLmE9YQp0aGlz
+LmI9Yn0sCnVPOmZ1bmN0aW9uIHVPKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApNTzpmdW5jdGlvbiBN
+Tygpe30sCmtUOmZ1bmN0aW9uIGtUKCl7fSwKeEk6ZnVuY3Rpb24geEkoYSl7dGhpcy4kdGk9YX0sCkN3
+OmZ1bmN0aW9uIEN3KGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LAptMDpmdW5jdGlvbiBtMCgpe30sCnBL
+OmZ1bmN0aW9uIHBLKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApKaTpmdW5jdGlvbiBKaSgpe30sCmhq
+OmZ1bmN0aW9uIGhqKGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9Y30sClZwOmZ1bmN0aW9u
+IFZwKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApPUjpmdW5jdGlvbiBPUihhLGIsYyl7dGhpcy5hPWEK
+dGhpcy5iPWIKdGhpcy5jPWN9LApFRjpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGIuQygiQDwwPiIpLktx
+KGMpLkMoIkZvPDEsMj4iKS5hKEguQjcoYSxuZXcgSC5ONShiLkMoIkA8MD4iKS5LcShjKS5DKCJONTwx
+LDI+IikpKSl9LApGbDpmdW5jdGlvbihhLGIpe3JldHVybiBuZXcgSC5ONShhLkMoIkA8MD4iKS5LcShi
+KS5DKCJONTwxLDI+IikpfSwKTHM6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBQLmI2KGEuQygiYjY8MD4i
+KSl9LApUMjpmdW5jdGlvbigpe3ZhciBzPU9iamVjdC5jcmVhdGUobnVsbCkKc1siPG5vbi1pZGVudGlm
+aWVyLWtleT4iXT1zCmRlbGV0ZSBzWyI8bm9uLWlkZW50aWZpZXIta2V5PiJdCnJldHVybiBzfSwKcmo6
+ZnVuY3Rpb24oYSxiLGMpe3ZhciBzPW5ldyBQLmxtKGEsYixjLkMoImxtPDA+IikpCnMuYz1hLmUKcmV0
+dXJuIHN9LApFUDpmdW5jdGlvbihhLGIsYyl7dmFyIHMscgppZihQLmhCKGEpKXtpZihiPT09IigiJiZj
+PT09IikiKXJldHVybiIoLi4uKSIKcmV0dXJuIGIrIi4uLiIrY31zPUguVk0oW10sdC5zKQpDLk5tLmko
+JC54ZyxhKQp0cnl7UC5WcihhLHMpfWZpbmFsbHl7aWYoMD49JC54Zy5sZW5ndGgpcmV0dXJuIEguT0go
+JC54ZywtMSkKJC54Zy5wb3AoKX1yPVAudmcoYix0LnUuYShzKSwiLCAiKStjCnJldHVybiByLmNoYXJD
+b2RlQXQoMCk9PTA/cjpyfSwKV0U6ZnVuY3Rpb24oYSxiLGMpe3ZhciBzLHIKaWYoUC5oQihhKSlyZXR1
+cm4gYisiLi4uIitjCnM9bmV3IFAuUm4oYikKQy5ObS5pKCQueGcsYSkKdHJ5e3I9cwpyLmE9UC52Zyhy
+LmEsYSwiLCAiKX1maW5hbGx5e2lmKDA+PSQueGcubGVuZ3RoKXJldHVybiBILk9IKCQueGcsLTEpCiQu
+eGcucG9wKCl9cy5hKz1jCnI9cy5hCnJldHVybiByLmNoYXJDb2RlQXQoMCk9PTA/cjpyfSwKaEI6ZnVu
+Y3Rpb24oYSl7dmFyIHMscgpmb3Iocz0kLnhnLmxlbmd0aCxyPTA7cjxzOysrcilpZihhPT09JC54Z1ty
+XSlyZXR1cm4hMApyZXR1cm4hMX0sClZyOmZ1bmN0aW9uKGEsYil7dmFyIHMscixxLHAsbyxuLG0sbD1h
+LmdtKGEpLGs9MCxqPTAKd2hpbGUoITApe2lmKCEoazw4MHx8ajwzKSlicmVhawppZighbC5GKCkpcmV0
+dXJuCnM9SC5FaihsLmdsKCkpCkMuTm0uaShiLHMpCmsrPXMubGVuZ3RoKzI7KytqfWlmKCFsLkYoKSl7
+aWYoajw9NSlyZXR1cm4KaWYoMD49Yi5sZW5ndGgpcmV0dXJuIEguT0goYiwtMSkKcj1iLnBvcCgpCmlm
+KDA+PWIubGVuZ3RoKXJldHVybiBILk9IKGIsLTEpCnE9Yi5wb3AoKX1lbHNle3A9bC5nbCgpOysragpp
+ZighbC5GKCkpe2lmKGo8PTQpe0MuTm0uaShiLEguRWoocCkpCnJldHVybn1yPUguRWoocCkKaWYoMD49
+Yi5sZW5ndGgpcmV0dXJuIEguT0goYiwtMSkKcT1iLnBvcCgpCmsrPXIubGVuZ3RoKzJ9ZWxzZXtvPWwu
+Z2woKTsrK2oKZm9yKDtsLkYoKTtwPW8sbz1uKXtuPWwuZ2woKTsrK2oKaWYoaj4xMDApe3doaWxlKCEw
+KXtpZighKGs+NzUmJmo+MykpYnJlYWsKaWYoMD49Yi5sZW5ndGgpcmV0dXJuIEguT0goYiwtMSkKay09
+Yi5wb3AoKS5sZW5ndGgrMjstLWp9Qy5ObS5pKGIsIi4uLiIpCnJldHVybn19cT1ILkVqKHApCnI9SC5F
+aihvKQprKz1yLmxlbmd0aCtxLmxlbmd0aCs0fX1pZihqPmIubGVuZ3RoKzIpe2srPTUKbT0iLi4uIn1l
+bHNlIG09bnVsbAp3aGlsZSghMCl7aWYoIShrPjgwJiZiLmxlbmd0aD4zKSlicmVhawppZigwPj1iLmxl
+bmd0aClyZXR1cm4gSC5PSChiLC0xKQprLT1iLnBvcCgpLmxlbmd0aCsyCmlmKG09PW51bGwpe2srPTUK
+bT0iLi4uIn19aWYobSE9bnVsbClDLk5tLmkoYixtKQpDLk5tLmkoYixxKQpDLk5tLmkoYixyKX0sCnRN
+OmZ1bmN0aW9uKGEsYil7dmFyIHMscixxPVAuTHMoYikKZm9yKHM9YS5sZW5ndGgscj0wO3I8YS5sZW5n
+dGg7YS5sZW5ndGg9PT1zfHwoMCxILmxrKShhKSwrK3IpcS5pKDAsYi5hKGFbcl0pKQpyZXR1cm4gcX0s
+Cm5POmZ1bmN0aW9uKGEpe3ZhciBzLHI9e30KaWYoUC5oQihhKSlyZXR1cm4iey4uLn0iCnM9bmV3IFAu
+Um4oIiIpCnRyeXtDLk5tLmkoJC54ZyxhKQpzLmErPSJ7IgpyLmE9ITAKYS5LKDAsbmV3IFAucmEocixz
+KSkKcy5hKz0ifSJ9ZmluYWxseXtpZigwPj0kLnhnLmxlbmd0aClyZXR1cm4gSC5PSCgkLnhnLC0xKQok
+LnhnLnBvcCgpfXI9cy5hCnJldHVybiByLmNoYXJDb2RlQXQoMCk9PTA/cjpyfSwKYjY6ZnVuY3Rpb24g
+YjYoYSl7dmFyIF89dGhpcwpfLmE9MApfLmY9Xy5lPV8uZD1fLmM9Xy5iPW51bGwKXy5yPTAKXy4kdGk9
+YX0sCmJuOmZ1bmN0aW9uIGJuKGEpe3RoaXMuYT1hCnRoaXMuYz10aGlzLmI9bnVsbH0sCmxtOmZ1bmN0
+aW9uIGxtKGEsYixjKXt2YXIgXz10aGlzCl8uYT1hCl8uYj1iCl8uZD1fLmM9bnVsbApfLiR0aT1jfSwK
+bVc6ZnVuY3Rpb24gbVcoKXt9LAp1eTpmdW5jdGlvbiB1eSgpe30sCmxEOmZ1bmN0aW9uIGxEKCl7fSwK
+aWw6ZnVuY3Rpb24gaWwoKXt9LApyYTpmdW5jdGlvbiByYShhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwK
+WWs6ZnVuY3Rpb24gWWsoKXt9LAp5UTpmdW5jdGlvbiB5UShhKXt0aGlzLmE9YX0sCktQOmZ1bmN0aW9u
+IEtQKCl7fSwKUG46ZnVuY3Rpb24gUG4oKXt9LApHajpmdW5jdGlvbiBHaihhLGIpe3RoaXMuYT1hCnRo
+aXMuJHRpPWJ9LApsZjpmdW5jdGlvbiBsZigpe30sClZqOmZ1bmN0aW9uIFZqKCl7fSwKWHY6ZnVuY3Rp
+b24gWHYoKXt9LApuWTpmdW5jdGlvbiBuWSgpe30sCldZOmZ1bmN0aW9uIFdZKCl7fSwKUlU6ZnVuY3Rp
+b24gUlUoKXt9LApwUjpmdW5jdGlvbiBwUigpe30sCkJTOmZ1bmN0aW9uKGEsYil7dmFyIHMscixxLHAK
+aWYodHlwZW9mIGEhPSJzdHJpbmciKXRocm93IEguYihILnRMKGEpKQpzPW51bGwKdHJ5e3M9SlNPTi5w
+YXJzZShhKX1jYXRjaChxKXtyPUguUnUocSkKcD1QLnJyKFN0cmluZyhyKSxudWxsLG51bGwpCnRocm93
+IEguYihwKX1wPVAuUWUocykKcmV0dXJuIHB9LApRZTpmdW5jdGlvbihhKXt2YXIgcwppZihhPT1udWxs
+KXJldHVybiBudWxsCmlmKHR5cGVvZiBhIT0ib2JqZWN0IilyZXR1cm4gYQppZihPYmplY3QuZ2V0UHJv
+dG90eXBlT2YoYSkhPT1BcnJheS5wcm90b3R5cGUpcmV0dXJuIG5ldyBQLnV3KGEsT2JqZWN0LmNyZWF0
+ZShudWxsKSkKZm9yKHM9MDtzPGEubGVuZ3RoOysrcylhW3NdPVAuUWUoYVtzXSkKcmV0dXJuIGF9LApr
+eTpmdW5jdGlvbihhLGIsYyxkKXt2YXIgcyxyCmlmKGIgaW5zdGFuY2VvZiBVaW50OEFycmF5KXtzPWIK
+ZD1zLmxlbmd0aAppZihkLWM8MTUpcmV0dXJuIG51bGwKcj1QLkNHKGEscyxjLGQpCmlmKHIhPW51bGwm
+JmEpaWYoci5pbmRleE9mKCJcdWZmZmQiKT49MClyZXR1cm4gbnVsbApyZXR1cm4gcn1yZXR1cm4gbnVs
+bH0sCkNHOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBzPWE/JC5IRygpOiQucmYoKQppZihzPT1udWxsKXJl
+dHVybiBudWxsCmlmKDA9PT1jJiZkPT09Yi5sZW5ndGgpcmV0dXJuIFAuUmIocyxiKQpyZXR1cm4gUC5S
+YihzLGIuc3ViYXJyYXkoYyxQLmpCKGMsZCxiLmxlbmd0aCkpKX0sClJiOmZ1bmN0aW9uKGEsYil7dmFy
+IHMscgp0cnl7cz1hLmRlY29kZShiKQpyZXR1cm4gc31jYXRjaChyKXtILlJ1KHIpfXJldHVybiBudWxs
+fSwKeE06ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe2lmKEMuam4uelkoZiw0KSE9PTApdGhyb3cgSC5iKFAu
+cnIoIkludmFsaWQgYmFzZTY0IHBhZGRpbmcsIHBhZGRlZCBsZW5ndGggbXVzdCBiZSBtdWx0aXBsZSBv
+ZiBmb3VyLCBpcyAiK2YsYSxjKSkKaWYoZCtlIT09Zil0aHJvdyBILmIoUC5ycigiSW52YWxpZCBiYXNl
+NjQgcGFkZGluZywgJz0nIG5vdCBhdCB0aGUgZW5kIixhLGIpKQppZihlPjIpdGhyb3cgSC5iKFAucnIo
+IkludmFsaWQgYmFzZTY0IHBhZGRpbmcsIG1vcmUgdGhhbiB0d28gJz0nIGNoYXJhY3RlcnMiLGEsYikp
+fSwKR3k6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBuZXcgUC5VZChhLGIpfSwKTkM6ZnVuY3Rpb24oYSl7
+cmV0dXJuIGEuTHQoKX0sClVnOmZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyBQLnR1KGEsW10sUC5DeSgp
+KX0sCnVYOmZ1bmN0aW9uKGEsYixjKXt2YXIgcyxyPW5ldyBQLlJuKCIiKSxxPVAuVWcocixiKQpxLmlV
+KGEpCnM9ci5hCnJldHVybiBzLmNoYXJDb2RlQXQoMCk9PTA/czpzfSwKajQ6ZnVuY3Rpb24oYSl7c3dp
+dGNoKGEpe2Nhc2UgNjU6cmV0dXJuIk1pc3NpbmcgZXh0ZW5zaW9uIGJ5dGUiCmNhc2UgNjc6cmV0dXJu
+IlVuZXhwZWN0ZWQgZXh0ZW5zaW9uIGJ5dGUiCmNhc2UgNjk6cmV0dXJuIkludmFsaWQgVVRGLTggYnl0
+ZSIKY2FzZSA3MTpyZXR1cm4iT3ZlcmxvbmcgZW5jb2RpbmciCmNhc2UgNzM6cmV0dXJuIk91dCBvZiB1
+bmljb2RlIHJhbmdlIgpjYXNlIDc1OnJldHVybiJFbmNvZGVkIHN1cnJvZ2F0ZSIKY2FzZSA3NzpyZXR1
+cm4iVW5maW5pc2hlZCBVVEYtOCBvY3RldCBzZXF1ZW5jZSIKZGVmYXVsdDpyZXR1cm4iIn19LApqeTpm
+dW5jdGlvbihhLGIsYyl7dmFyIHMscixxLHA9Yy1iLG89bmV3IFVpbnQ4QXJyYXkocCkKZm9yKHM9Si5V
+NihhKSxyPTA7cjxwOysrcil7cT1zLnEoYSxiK3IpCmlmKHR5cGVvZiBxIT09Im51bWJlciIpcmV0dXJu
+IHEuek0oKQppZigocSY0Mjk0OTY3MDQwKT4+PjAhPT0wKXE9MjU1CmlmKHI+PXApcmV0dXJuIEguT0go
+byxyKQpvW3JdPXF9cmV0dXJuIG99LAp1dzpmdW5jdGlvbiB1dyhhLGIpe3RoaXMuYT1hCnRoaXMuYj1i
+CnRoaXMuYz1udWxsfSwKaTg6ZnVuY3Rpb24gaTgoYSl7dGhpcy5hPWF9LApwZzpmdW5jdGlvbiBwZygp
+e30sCmMyOmZ1bmN0aW9uIGMyKCl7fSwKQ1Y6ZnVuY3Rpb24gQ1YoKXt9LApVODpmdW5jdGlvbiBVOCgp
+e30sClVrOmZ1bmN0aW9uIFVrKCl7fSwKd0k6ZnVuY3Rpb24gd0koKXt9LApaaTpmdW5jdGlvbiBaaSgp
+e30sClVkOmZ1bmN0aW9uIFVkKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApLODpmdW5jdGlvbiBLOChh
+LGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKYnk6ZnVuY3Rpb24gYnkoKXt9LApvajpmdW5jdGlvbiBvaihh
+KXt0aGlzLmI9YX0sCk14OmZ1bmN0aW9uIE14KGEpe3RoaXMuYT1hfSwKU2g6ZnVuY3Rpb24gU2goKXt9
+LAp0aTpmdW5jdGlvbiB0aShhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKdHU6ZnVuY3Rpb24gdHUoYSxi
+LGMpe3RoaXMuYz1hCnRoaXMuYT1iCnRoaXMuYj1jfSwKdTU6ZnVuY3Rpb24gdTUoKXt9LApFMzpmdW5j
+dGlvbiBFMygpe30sClJ3OmZ1bmN0aW9uIFJ3KGEpe3RoaXMuYj0wCnRoaXMuYz1hfSwKR1k6ZnVuY3Rp
+b24gR1koYSl7dGhpcy5hPWF9LApiejpmdW5jdGlvbiBieihhKXt0aGlzLmE9YQp0aGlzLmI9MTYKdGhp
+cy5jPTB9LApRQTpmdW5jdGlvbihhLGIpe3ZhciBzPUguSHAoYSxiKQppZihzIT1udWxsKXJldHVybiBz
+CnRocm93IEguYihQLnJyKGEsbnVsbCxudWxsKSl9LApvczpmdW5jdGlvbihhKXtpZihhIGluc3RhbmNl
+b2YgSC5UcClyZXR1cm4gYS53KDApCnJldHVybiJJbnN0YW5jZSBvZiAnIitILkVqKEguTShhKSkrIici
+fSwKTzg6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHMscj1jP0ouS2goYSxkKTpKLlFpKGEsZCkKaWYoYSE9
+PTAmJmIhPW51bGwpZm9yKHM9MDtzPHIubGVuZ3RoOysrcylyW3NdPWIKcmV0dXJuIHJ9LApDSDpmdW5j
+dGlvbihhLGIsYyl7dmFyIHMscj1ILlZNKFtdLGMuQygiamQ8MD4iKSkKZm9yKHM9Si5JVChhKTtzLkYo
+KTspQy5ObS5pKHIsYy5hKHMuZ2woKSkpCmlmKGIpcmV0dXJuIHIKcmV0dXJuIEouRXAocixjKX0sCmRI
+OmZ1bmN0aW9uKGEsYixjKXt2YXIgcyxyPUouS2goYSxjKQpmb3Iocz0wO3M8YTsrK3MpQy5ObS5ZKHIs
+cyxiLiQxKHMpKQpyZXR1cm4gcn0sCkFGOmZ1bmN0aW9uKGEsYil7cmV0dXJuIEouekMoUC5DSChhLCEx
+LGIpKX0sCkhNOmZ1bmN0aW9uKGEsYixjKXtpZih0LmJtLmIoYSkpcmV0dXJuIEguZncoYSxiLFAuakIo
+YixjLGEubGVuZ3RoKSkKcmV0dXJuIFAuYncoYSxiLGMpfSwKT286ZnVuY3Rpb24oYSl7cmV0dXJuIEgu
+THcoYSl9LApidzpmdW5jdGlvbihhLGIsYyl7dmFyIHMscixxLHAsbyxuPW51bGwKaWYoYjwwKXRocm93
+IEguYihQLlRFKGIsMCxhLmxlbmd0aCxuLG4pKQpzPWM9PW51bGwKaWYoIXMmJmM8Yil0aHJvdyBILmIo
+UC5URShjLGIsYS5sZW5ndGgsbixuKSkKcj1uZXcgSC5hNyhhLGEubGVuZ3RoLEgueihhKS5DKCJhNzxs
+RC5FPiIpKQpmb3IocT0wO3E8YjsrK3EpaWYoIXIuRigpKXRocm93IEguYihQLlRFKGIsMCxxLG4sbikp
+CnA9W10KaWYocylmb3IoO3IuRigpOyl7bz1yLmQKcC5wdXNoKG8pfWVsc2UgZm9yKHE9YjtxPGM7Kytx
+KXtpZighci5GKCkpdGhyb3cgSC5iKFAuVEUoYyxiLHEsbixuKSkKbz1yLmQKcC5wdXNoKG8pfXJldHVy
+biBILmVUKHApfSwKbnU6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBILlZSKGEsSC52NChhLCExLCEwLCEx
+LCExLCExKSl9LAp2ZzpmdW5jdGlvbihhLGIsYyl7dmFyIHM9Si5JVChiKQppZighcy5GKCkpcmV0dXJu
+IGEKaWYoYy5sZW5ndGg9PT0wKXtkbyBhKz1ILkVqKHMuZ2woKSkKd2hpbGUocy5GKCkpfWVsc2V7YSs9
+SC5FaihzLmdsKCkpCmZvcig7cy5GKCk7KWE9YStjK0guRWoocy5nbCgpKX1yZXR1cm4gYX0sCmxyOmZ1
+bmN0aW9uKGEsYixjLGQpe3JldHVybiBuZXcgUC5tcChhLGIsYyxkKX0sCnVvOmZ1bmN0aW9uKCl7dmFy
+IHM9SC5NMCgpCmlmKHMhPW51bGwpcmV0dXJuIFAuaEsocykKdGhyb3cgSC5iKFAuTDQoIidVcmkuYmFz
+ZScgaXMgbm90IHN1cHBvcnRlZCIpKX0sCmVQOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBzLHIscSxwLG8s
+bixtPSIwMTIzNDU2Nzg5QUJDREVGIgppZihjPT09Qy54TSl7cz0kLno0KCkuYgppZih0eXBlb2YgYiE9
+InN0cmluZyIpSC52KEgudEwoYikpCnM9cy50ZXN0KGIpfWVsc2Ugcz0hMQppZihzKXJldHVybiBiCkgu
+TGgoYykuQygiVWsuUyIpLmEoYikKcj1jLmdaRSgpLldKKGIpCmZvcihzPXIubGVuZ3RoLHE9MCxwPSIi
+O3E8czsrK3Epe289cltxXQppZihvPDEyOCl7bj1vPj4+NAppZihuPj04KXJldHVybiBILk9IKGEsbikK
+bj0oYVtuXSYxPDwobyYxNSkpIT09MH1lbHNlIG49ITEKaWYobilwKz1ILkx3KG8pCmVsc2UgcD1kJiZv
+PT09MzI/cCsiKyI6cCsiJSIrbVtvPj4+NCYxNV0rbVtvJjE1XX1yZXR1cm4gcC5jaGFyQ29kZUF0KDAp
+PT0wP3A6cH0sCkdxOmZ1bmN0aW9uKGEpe3ZhciBzPU1hdGguYWJzKGEpLHI9YTwwPyItIjoiIgppZihz
+Pj0xMDAwKXJldHVybiIiK2EKaWYocz49MTAwKXJldHVybiByKyIwIitzCmlmKHM+PTEwKXJldHVybiBy
+KyIwMCIrcwpyZXR1cm4gcisiMDAwIitzfSwKVng6ZnVuY3Rpb24oYSl7aWYoYT49MTAwKXJldHVybiIi
+K2EKaWYoYT49MTApcmV0dXJuIjAiK2EKcmV0dXJuIjAwIithfSwKaDA6ZnVuY3Rpb24oYSl7aWYoYT49
+MTApcmV0dXJuIiIrYQpyZXR1cm4iMCIrYX0sCmhsOmZ1bmN0aW9uKGEpe2lmKHR5cGVvZiBhPT0ibnVt
+YmVyInx8SC5sKGEpfHxudWxsPT1hKXJldHVybiBKLmooYSkKaWYodHlwZW9mIGE9PSJzdHJpbmciKXJl
+dHVybiBKU09OLnN0cmluZ2lmeShhKQpyZXR1cm4gUC5vcyhhKX0sCmhWOmZ1bmN0aW9uKGEpe3JldHVy
+biBuZXcgUC5DNihhKX0sCnhZOmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgUC51KCExLG51bGwsbnVsbCxh
+KX0sCkwzOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbmV3IFAudSghMCxhLGIsYyl9LApVSTpmdW5jdGlv
+bihhLGIsYyl7aWYoYT09bnVsbCl0aHJvdyBILmIobmV3IFAudSghMSxudWxsLGIsIk11c3Qgbm90IGJl
+IG51bGwiKSkKcmV0dXJuIGF9LApPNzpmdW5jdGlvbihhLGIpe3JldHVybiBuZXcgUC5iSihudWxsLG51
+bGwsITAsYSxiLCJWYWx1ZSBub3QgaW4gcmFuZ2UiKX0sClRFOmZ1bmN0aW9uKGEsYixjLGQsZSl7cmV0
+dXJuIG5ldyBQLmJKKGIsYywhMCxhLGQsIkludmFsaWQgdmFsdWUiKX0sCndBOmZ1bmN0aW9uKGEsYixj
+LGQpe2lmKGE8Ynx8YT5jKXRocm93IEguYihQLlRFKGEsYixjLGQsbnVsbCkpCnJldHVybiBhfSwKakI6
+ZnVuY3Rpb24oYSxiLGMpe2lmKDA+YXx8YT5jKXRocm93IEguYihQLlRFKGEsMCxjLCJzdGFydCIsbnVs
+bCkpCmlmKGIhPW51bGwpe2lmKGE+Ynx8Yj5jKXRocm93IEguYihQLlRFKGIsYSxjLCJlbmQiLG51bGwp
+KQpyZXR1cm4gYn1yZXR1cm4gY30sCmsxOmZ1bmN0aW9uKGEsYil7aWYoYTwwKXRocm93IEguYihQLlRF
+KGEsMCxudWxsLGIsbnVsbCkpCnJldHVybiBhfSwKQ2Y6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgcz1I
+LnVQKGU9PW51bGw/Si5IbShiKTplKQpyZXR1cm4gbmV3IFAuZVkocywhMCxhLGMsIkluZGV4IG91dCBv
+ZiByYW5nZSIpfSwKTDQ6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBQLnViKGEpfSwKU1k6ZnVuY3Rpb24o
+YSl7cmV0dXJuIG5ldyBQLmRzKGEpfSwKUFY6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBQLmxqKGEpfSwK
+YTQ6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBQLlVWKGEpfSwKcnI6ZnVuY3Rpb24oYSxiLGMpe3JldHVy
+biBuZXcgUC5hRShhLGIsYyl9LApoSzpmdW5jdGlvbihhNSl7dmFyIHMscixxLHAsbyxuLG0sbCxrLGos
+aSxoLGcsZixlLGQsYyxiLGEsYTAsYTEsYTIsYTM9bnVsbCxhND1hNS5sZW5ndGgKaWYoYTQ+PTUpe3M9
+KChKLlF6KGE1LDQpXjU4KSozfEMueEIuVyhhNSwwKV4xMDB8Qy54Qi5XKGE1LDEpXjk3fEMueEIuVyhh
+NSwyKV4xMTZ8Qy54Qi5XKGE1LDMpXjk3KT4+PjAKaWYocz09PTApcmV0dXJuIFAuS0QoYTQ8YTQ/Qy54
+Qi5OaihhNSwwLGE0KTphNSw1LGEzKS5nbFIoKQplbHNlIGlmKHM9PT0zMilyZXR1cm4gUC5LRChDLnhC
+Lk5qKGE1LDUsYTQpLDAsYTMpLmdsUigpfXI9UC5POCg4LDAsITEsdC5TKQpDLk5tLlkociwwLDApCkMu
+Tm0uWShyLDEsLTEpCkMuTm0uWShyLDIsLTEpCkMuTm0uWShyLDcsLTEpCkMuTm0uWShyLDMsMCkKQy5O
+bS5ZKHIsNCwwKQpDLk5tLlkociw1LGE0KQpDLk5tLlkociw2LGE0KQppZihQLlVCKGE1LDAsYTQsMCxy
+KT49MTQpQy5ObS5ZKHIsNyxhNCkKcT1yWzFdCmlmKHE+PTApaWYoUC5VQihhNSwwLHEsMjAscik9PT0y
+MClyWzddPXEKcD1yWzJdKzEKbz1yWzNdCm49cls0XQptPXJbNV0KbD1yWzZdCmlmKGw8bSltPWwKaWYo
+bjxwKW49bQplbHNlIGlmKG48PXEpbj1xKzEKaWYobzxwKW89bgprPXJbN108MAppZihrKWlmKHA+cSsz
+KXtqPWEzCms9ITF9ZWxzZXtpPW8+MAppZihpJiZvKzE9PT1uKXtqPWEzCms9ITF9ZWxzZXtpZighKG08
+YTQmJm09PT1uKzImJkoucTAoYTUsIi4uIixuKSkpaD1tPm4rMiYmSi5xMChhNSwiLy4uIixtLTMpCmVs
+c2UgaD0hMAppZihoKXtqPWEzCms9ITF9ZWxzZXtpZihxPT09NClpZihKLnEwKGE1LCJmaWxlIiwwKSl7
+aWYocDw9MCl7aWYoIUMueEIuUWkoYTUsIi8iLG4pKXtnPSJmaWxlOi8vLyIKcz0zfWVsc2V7Zz0iZmls
+ZTovLyIKcz0yfWE1PWcrQy54Qi5OaihhNSxuLGE0KQpxLT0wCmk9cy0wCm0rPWkKbCs9aQphND1hNS5s
+ZW5ndGgKcD03Cm89NwpuPTd9ZWxzZSBpZihuPT09bSl7KytsCmY9bSsxCmE1PUMueEIuaTcoYTUsbixt
+LCIvIik7KythNAptPWZ9aj0iZmlsZSJ9ZWxzZSBpZihDLnhCLlFpKGE1LCJodHRwIiwwKSl7aWYoaSYm
+byszPT09biYmQy54Qi5RaShhNSwiODAiLG8rMSkpe2wtPTMKZT1uLTMKbS09MwphNT1DLnhCLmk3KGE1
+LG8sbiwiIikKYTQtPTMKbj1lfWo9Imh0dHAifWVsc2Ugaj1hMwplbHNlIGlmKHE9PT01JiZKLnEwKGE1
+LCJodHRwcyIsMCkpe2lmKGkmJm8rND09PW4mJkoucTAoYTUsIjQ0MyIsbysxKSl7bC09NAplPW4tNApt
+LT00CmE1PUouZGcoYTUsbyxuLCIiKQphNC09MwpuPWV9aj0iaHR0cHMifWVsc2Ugaj1hMwprPSEwfX19
+ZWxzZSBqPWEzCmlmKGspe2k9YTUubGVuZ3RoCmlmKGE0PGkpe2E1PUoubGQoYTUsMCxhNCkKcS09MApw
+LT0wCm8tPTAKbi09MAptLT0wCmwtPTB9cmV0dXJuIG5ldyBQLlVmKGE1LHEscCxvLG4sbSxsLGopfWlm
+KGo9PW51bGwpaWYocT4wKWo9UC5QaShhNSwwLHEpCmVsc2V7aWYocT09PTApe1AuUjMoYTUsMCwiSW52
+YWxpZCBlbXB0eSBzY2hlbWUiKQpILkJpKHUuZyl9aj0iIn1pZihwPjApe2Q9cSszCmM9ZDxwP1AuelIo
+YTUsZCxwLTEpOiIiCmI9UC5PZShhNSxwLG8sITEpCmk9bysxCmlmKGk8bil7YT1ILkhwKEoubGQoYTUs
+aSxuKSxhMykKYTA9UC53QihhPT1udWxsP0gudihQLnJyKCJJbnZhbGlkIHBvcnQiLGE1LGkpKTphLGop
+fWVsc2UgYTA9YTN9ZWxzZXthMD1hMwpiPWEwCmM9IiJ9YTE9UC5rYShhNSxuLG0sYTMsaixiIT1udWxs
+KQphMj1tPGw/UC5sZShhNSxtKzEsbCxhMyk6YTMKcmV0dXJuIG5ldyBQLkRuKGosYyxiLGEwLGExLGEy
+LGw8YTQ/UC50RyhhNSxsKzEsYTQpOmEzKX0sCk10OmZ1bmN0aW9uKGEpe0guaChhKQpyZXR1cm4gUC5r
+dShhLDAsYS5sZW5ndGgsQy54TSwhMSl9LApXWDpmdW5jdGlvbihhKXt2YXIgcz10Lk4KcmV0dXJuIEMu
+Tm0uTjAoSC5WTShhLnNwbGl0KCImIiksdC5zKSxQLkZsKHMscyksbmV3IFAubjEoQy54TSksdC5KKX0s
+CkhoOmZ1bmN0aW9uKGEsYixjKXt2YXIgcyxyLHEscCxvLG4sbT0iSVB2NCBhZGRyZXNzIHNob3VsZCBj
+b250YWluIGV4YWN0bHkgNCBwYXJ0cyIsbD0iZWFjaCBwYXJ0IG11c3QgYmUgaW4gdGhlIHJhbmdlIDAu
+LjI1NSIsaz1uZXcgUC5jUyhhKSxqPW5ldyBVaW50OEFycmF5KDQpCmZvcihzPWIscj1zLHE9MDtzPGM7
+KytzKXtwPUMueEIuTzIoYSxzKQppZihwIT09NDYpe2lmKChwXjQ4KT45KWsuJDIoImludmFsaWQgY2hh
+cmFjdGVyIixzKX1lbHNle2lmKHE9PT0zKWsuJDIobSxzKQpvPVAuUUEoQy54Qi5OaihhLHIscyksbnVs
+bCkKaWYobz4yNTUpay4kMihsLHIpCm49cSsxCmlmKHE+PTQpcmV0dXJuIEguT0goaixxKQpqW3FdPW8K
+cj1zKzEKcT1ufX1pZihxIT09MylrLiQyKG0sYykKbz1QLlFBKEMueEIuTmooYSxyLGMpLG51bGwpCmlm
+KG8+MjU1KWsuJDIobCxyKQppZihxPj00KXJldHVybiBILk9IKGoscSkKaltxXT1vCnJldHVybiBqfSwK
+ZWc6ZnVuY3Rpb24oYSxiLGEwKXt2YXIgcyxyLHEscCxvLG4sbSxsLGssaixpLGgsZyxmLGUsZD1uZXcg
+UC5WQyhhKSxjPW5ldyBQLkpUKGQsYSkKaWYoYS5sZW5ndGg8MilkLiQxKCJhZGRyZXNzIGlzIHRvbyBz
+aG9ydCIpCnM9SC5WTShbXSx0LmEpCmZvcihyPWIscT1yLHA9ITEsbz0hMTtyPGEwOysrcil7bj1DLnhC
+Lk8yKGEscikKaWYobj09PTU4KXtpZihyPT09Yil7KytyCmlmKEMueEIuTzIoYSxyKSE9PTU4KWQuJDIo
+ImludmFsaWQgc3RhcnQgY29sb24uIixyKQpxPXJ9aWYocj09PXEpe2lmKHApZC4kMigib25seSBvbmUg
+d2lsZGNhcmQgYDo6YCBpcyBhbGxvd2VkIixyKQpDLk5tLmkocywtMSkKcD0hMH1lbHNlIEMuTm0uaShz
+LGMuJDIocSxyKSkKcT1yKzF9ZWxzZSBpZihuPT09NDYpbz0hMH1pZihzLmxlbmd0aD09PTApZC4kMSgi
+dG9vIGZldyBwYXJ0cyIpCm09cT09PWEwCmw9Qy5ObS5ncloocykKaWYobSYmbCE9PS0xKWQuJDIoImV4
+cGVjdGVkIGEgcGFydCBhZnRlciBsYXN0IGA6YCIsYTApCmlmKCFtKWlmKCFvKUMuTm0uaShzLGMuJDIo
+cSxhMCkpCmVsc2V7az1QLkhoKGEscSxhMCkKQy5ObS5pKHMsKGtbMF08PDh8a1sxXSk+Pj4wKQpDLk5t
+Lmkocywoa1syXTw8OHxrWzNdKT4+PjApfWlmKHApe2lmKHMubGVuZ3RoPjcpZC4kMSgiYW4gYWRkcmVz
+cyB3aXRoIGEgd2lsZGNhcmQgbXVzdCBoYXZlIGxlc3MgdGhhbiA3IHBhcnRzIil9ZWxzZSBpZihzLmxl
+bmd0aCE9PTgpZC4kMSgiYW4gYWRkcmVzcyB3aXRob3V0IGEgd2lsZGNhcmQgbXVzdCBjb250YWluIGV4
+YWN0bHkgOCBwYXJ0cyIpCmo9bmV3IFVpbnQ4QXJyYXkoMTYpCmZvcihsPXMubGVuZ3RoLGk9OS1sLHI9
+MCxoPTA7cjxsOysrcil7Zz1zW3JdCmlmKGc9PT0tMSlmb3IoZj0wO2Y8aTsrK2Ype2lmKGg8MHx8aD49
+MTYpcmV0dXJuIEguT0goaixoKQpqW2hdPTAKZT1oKzEKaWYoZT49MTYpcmV0dXJuIEguT0goaixlKQpq
+W2VdPTAKaCs9Mn1lbHNle2U9Qy5qbi53RyhnLDgpCmlmKGg8MHx8aD49MTYpcmV0dXJuIEguT0goaixo
+KQpqW2hdPWUKZT1oKzEKaWYoZT49MTYpcmV0dXJuIEguT0goaixlKQpqW2VdPWcmMjU1CmgrPTJ9fXJl
+dHVybiBqfSwKS0w6ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyl7dmFyIHMscixxLHAsbyxuCmY9Zj09bnVs
+bD8iIjpQLlBpKGYsMCxmLmxlbmd0aCkKZz1QLnpSKGcsMCxnPT1udWxsPzA6Zy5sZW5ndGgpCmE9UC5P
+ZShhLDAsYT09bnVsbD8wOmEubGVuZ3RoLCExKQpzPVAubGUobnVsbCwwLDAsZSkKcj1QLnRHKG51bGws
+MCwwKQpkPVAud0IoZCxmKQpxPWY9PT0iZmlsZSIKaWYoYT09bnVsbClwPWcubGVuZ3RoIT09MHx8ZCE9
+bnVsbHx8cQplbHNlIHA9ITEKaWYocClhPSIiCnA9YT09bnVsbApvPSFwCmI9UC5rYShiLDAsYj09bnVs
+bD8wOmIubGVuZ3RoLGMsZixvKQpuPWYubGVuZ3RoPT09MAppZihuJiZwJiYhQy54Qi5uKGIsIi8iKSli
+PVAud0YoYiwhbnx8bykKZWxzZSBiPVAueGUoYikKcmV0dXJuIG5ldyBQLkRuKGYsZyxwJiZDLnhCLm4o
+YiwiLy8iKT8iIjphLGQsYixzLHIpfSwKd0s6ZnVuY3Rpb24oYSl7aWYoYT09PSJodHRwIilyZXR1cm4g
+ODAKaWYoYT09PSJodHRwcyIpcmV0dXJuIDQ0MwpyZXR1cm4gMH0sClIzOmZ1bmN0aW9uKGEsYixjKXt0
+aHJvdyBILmIoUC5ycihjLGEsYikpfSwKWGQ6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHMscixxLHAsbyxu
+LG0sbCxrLGosaSxoPW51bGwsZz1iLmxlbmd0aAppZihnIT09MCl7cT0wCndoaWxlKCEwKXtpZighKHE8
+Zykpe3M9IiIKcj0wCmJyZWFrfWlmKEMueEIuVyhiLHEpPT09NjQpe3M9Qy54Qi5OaihiLDAscSkKcj1x
+KzEKYnJlYWt9KytxfWlmKHI8ZyYmQy54Qi5XKGIscik9PT05MSl7Zm9yKHA9cixvPS0xO3A8ZzsrK3Ap
+e249Qy54Qi5XKGIscCkKaWYobj09PTM3JiZvPDApe209Qy54Qi5RaShiLCIyNSIscCsxKT9wKzI6cApv
+PXAKcD1tfWVsc2UgaWYobj09PTkzKWJyZWFrfWlmKHA9PT1nKXRocm93IEguYihQLnJyKCJJbnZhbGlk
+IElQdjYgaG9zdCBlbnRyeS4iLGIscikpCmw9bzwwP3A6bwpQLmVnKGIscisxLGwpOysrcAppZihwIT09
+ZyYmQy54Qi5XKGIscCkhPT01OCl0aHJvdyBILmIoUC5ycigiSW52YWxpZCBlbmQgb2YgYXV0aG9yaXR5
+IixiLHApKX1lbHNlIHA9cgp3aGlsZSghMCl7aWYoIShwPGcpKXtrPWgKYnJlYWt9aWYoQy54Qi5XKGIs
+cCk9PT01OCl7aj1DLnhCLkcoYixwKzEpCms9ai5sZW5ndGghPT0wP1AuUUEoaixoKTpoCmJyZWFrfSsr
+cH1pPUMueEIuTmooYixyLHApfWVsc2V7az1oCmk9awpzPSIifXJldHVybiBQLktMKGksaCxILlZNKGMu
+c3BsaXQoIi8iKSx0LnMpLGssZCxhLHMpfSwKa0U6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyLHEscCxvCmZv
+cihzPWEubGVuZ3RoLHI9MDtyPHM7KytyKXtxPWFbcl0KcS50b1N0cmluZwpwPUouVTYocSkKbz1wLmdB
+KHEpCmlmKDA+bylILnYoUC5URSgwLDAscC5nQShxKSxudWxsLG51bGwpKQppZihILlNRKHEsIi8iLDAp
+KXtzPVAuTDQoIklsbGVnYWwgcGF0aCBjaGFyYWN0ZXIgIitILkVqKHEpKQp0aHJvdyBILmIocyl9fX0s
+CkhOOmZ1bmN0aW9uKGEsYixjKXt2YXIgcyxyLHEKZm9yKHM9SC5xQyhhLGMsbnVsbCxILnQ2KGEpLmMp
+LHM9bmV3IEguYTcocyxzLmdBKHMpLHMuJHRpLkMoImE3PGFMLkU+IikpO3MuRigpOyl7cj1zLmQKcT1Q
+Lm51KCdbIiovOjw+P1xcXFx8XScpCnIudG9TdHJpbmcKaWYoSC5TUShyLHEsMCkpe3M9UC5MNCgiSWxs
+ZWdhbCBjaGFyYWN0ZXIgaW4gcGF0aDogIityKQp0aHJvdyBILmIocyl9fX0sCnJnOmZ1bmN0aW9uKGEs
+Yil7dmFyIHMKaWYoISg2NTw9YSYmYTw9OTApKXM9OTc8PWEmJmE8PTEyMgplbHNlIHM9ITAKaWYocyly
+ZXR1cm4Kcz1QLkw0KCJJbGxlZ2FsIGRyaXZlIGxldHRlciAiK1AuT28oYSkpCnRocm93IEguYihzKX0s
+CndCOmZ1bmN0aW9uKGEsYil7aWYoYSE9bnVsbCYmYT09PVAud0soYikpcmV0dXJuIG51bGwKcmV0dXJu
+IGF9LApPZTpmdW5jdGlvbihhLGIsYyxkKXt2YXIgcyxyLHEscCxvLG4KaWYoYT09bnVsbClyZXR1cm4g
+bnVsbAppZihiPT09YylyZXR1cm4iIgppZihDLnhCLk8yKGEsYik9PT05MSl7cz1jLTEKaWYoQy54Qi5P
+MihhLHMpIT09OTMpe1AuUjMoYSxiLCJNaXNzaW5nIGVuZCBgXWAgdG8gbWF0Y2ggYFtgIGluIGhvc3Qi
+KQpILkJpKHUuZyl9cj1iKzEKcT1QLnRvKGEscixzKQppZihxPHMpe3A9cSsxCm89UC5PQShhLEMueEIu
+UWkoYSwiMjUiLHApP3ErMzpwLHMsIiUyNSIpfWVsc2Ugbz0iIgpQLmVnKGEscixxKQpyZXR1cm4gQy54
+Qi5OaihhLGIscSkudG9Mb3dlckNhc2UoKStvKyJdIn1mb3Iobj1iO248YzsrK24paWYoQy54Qi5PMihh
+LG4pPT09NTgpe3E9Qy54Qi5YVShhLCIlIixiKQpxPXE+PWImJnE8Yz9xOmMKaWYocTxjKXtwPXErMQpv
+PVAuT0EoYSxDLnhCLlFpKGEsIjI1IixwKT9xKzM6cCxjLCIlMjUiKX1lbHNlIG89IiIKUC5lZyhhLGIs
+cSkKcmV0dXJuIlsiK0MueEIuTmooYSxiLHEpK28rIl0ifXJldHVybiBQLk9MKGEsYixjKX0sCnRvOmZ1
+bmN0aW9uKGEsYixjKXt2YXIgcz1DLnhCLlhVKGEsIiUiLGIpCnJldHVybiBzPj1iJiZzPGM/czpjfSwK
+T0E6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHMscixxLHAsbyxuLG0sbCxrLGosaT1kIT09IiI/bmV3IFAu
+Um4oZCk6bnVsbApmb3Iocz1iLHI9cyxxPSEwO3M8Yzspe3A9Qy54Qi5PMihhLHMpCmlmKHA9PT0zNyl7
+bz1QLnJ2KGEscywhMCkKbj1vPT1udWxsCmlmKG4mJnEpe3MrPTMKY29udGludWV9aWYoaT09bnVsbClp
+PW5ldyBQLlJuKCIiKQptPWkuYSs9Qy54Qi5OaihhLHIscykKaWYobilvPUMueEIuTmooYSxzLHMrMykK
+ZWxzZSBpZihvPT09IiUiKXtQLlIzKGEscywiWm9uZUlEIHNob3VsZCBub3QgY29udGFpbiAlIGFueW1v
+cmUiKQpILkJpKHUuZyl9aS5hPW0rbwpzKz0zCnI9cwpxPSEwfWVsc2V7aWYocDwxMjcpe249cD4+PjQK
+aWYobj49OClyZXR1cm4gSC5PSChDLkYzLG4pCm49KEMuRjNbbl0mMTw8KHAmMTUpKSE9PTB9ZWxzZSBu
+PSExCmlmKG4pe2lmKHEmJjY1PD1wJiY5MD49cCl7aWYoaT09bnVsbClpPW5ldyBQLlJuKCIiKQppZihy
+PHMpe2kuYSs9Qy54Qi5OaihhLHIscykKcj1zfXE9ITF9KytzfWVsc2V7aWYoKHAmNjQ1MTIpPT09NTUy
+OTYmJnMrMTxjKXtsPUMueEIuTzIoYSxzKzEpCmlmKChsJjY0NTEyKT09PTU2MzIwKXtwPShwJjEwMjMp
+PDwxMHxsJjEwMjN8NjU1MzYKaz0yfWVsc2Ugaz0xfWVsc2Ugaz0xCmo9Qy54Qi5OaihhLHIscykKaWYo
+aT09bnVsbCl7aT1uZXcgUC5SbigiIikKbj1pfWVsc2Ugbj1pCm4uYSs9agpuLmErPVAuelgocCkKcys9
+awpyPXN9fX1pZihpPT1udWxsKXJldHVybiBDLnhCLk5qKGEsYixjKQppZihyPGMpaS5hKz1DLnhCLk5q
+KGEscixjKQpuPWkuYQpyZXR1cm4gbi5jaGFyQ29kZUF0KDApPT0wP246bn0sCk9MOmZ1bmN0aW9uKGEs
+YixjKXt2YXIgcyxyLHEscCxvLG4sbSxsLGssaixpCmZvcihzPWIscj1zLHE9bnVsbCxwPSEwO3M8Yzsp
+e289Qy54Qi5PMihhLHMpCmlmKG89PT0zNyl7bj1QLnJ2KGEscywhMCkKbT1uPT1udWxsCmlmKG0mJnAp
+e3MrPTMKY29udGludWV9aWYocT09bnVsbClxPW5ldyBQLlJuKCIiKQpsPUMueEIuTmooYSxyLHMpCms9
+cS5hKz0hcD9sLnRvTG93ZXJDYXNlKCk6bAppZihtKXtuPUMueEIuTmooYSxzLHMrMykKaj0zfWVsc2Ug
+aWYobj09PSIlIil7bj0iJTI1IgpqPTF9ZWxzZSBqPTMKcS5hPWsrbgpzKz1qCnI9cwpwPSEwfWVsc2V7
+aWYobzwxMjcpe209bz4+PjQKaWYobT49OClyZXR1cm4gSC5PSChDLmVhLG0pCm09KEMuZWFbbV0mMTw8
+KG8mMTUpKSE9PTB9ZWxzZSBtPSExCmlmKG0pe2lmKHAmJjY1PD1vJiY5MD49byl7aWYocT09bnVsbClx
+PW5ldyBQLlJuKCIiKQppZihyPHMpe3EuYSs9Qy54Qi5OaihhLHIscykKcj1zfXA9ITF9KytzfWVsc2V7
+aWYobzw9OTMpe209bz4+PjQKaWYobT49OClyZXR1cm4gSC5PSChDLmFrLG0pCm09KEMuYWtbbV0mMTw8
+KG8mMTUpKSE9PTB9ZWxzZSBtPSExCmlmKG0pe1AuUjMoYSxzLCJJbnZhbGlkIGNoYXJhY3RlciIpCkgu
+QmkodS5nKX1lbHNle2lmKChvJjY0NTEyKT09PTU1Mjk2JiZzKzE8Yyl7aT1DLnhCLk8yKGEscysxKQpp
+ZigoaSY2NDUxMik9PT01NjMyMCl7bz0obyYxMDIzKTw8MTB8aSYxMDIzfDY1NTM2Cmo9Mn1lbHNlIGo9
+MX1lbHNlIGo9MQpsPUMueEIuTmooYSxyLHMpCmlmKCFwKWw9bC50b0xvd2VyQ2FzZSgpCmlmKHE9PW51
+bGwpe3E9bmV3IFAuUm4oIiIpCm09cX1lbHNlIG09cQptLmErPWwKbS5hKz1QLnpYKG8pCnMrPWoKcj1z
+fX19fWlmKHE9PW51bGwpcmV0dXJuIEMueEIuTmooYSxiLGMpCmlmKHI8Yyl7bD1DLnhCLk5qKGEscixj
+KQpxLmErPSFwP2wudG9Mb3dlckNhc2UoKTpsfW09cS5hCnJldHVybiBtLmNoYXJDb2RlQXQoMCk9PTA/
+bTptfSwKUGk6ZnVuY3Rpb24oYSxiLGMpe3ZhciBzLHIscSxwLG89dS5nCmlmKGI9PT1jKXJldHVybiIi
+CmlmKCFQLkV0KEouclkoYSkuVyhhLGIpKSl7UC5SMyhhLGIsIlNjaGVtZSBub3Qgc3RhcnRpbmcgd2l0
+aCBhbHBoYWJldGljIGNoYXJhY3RlciIpCkguQmkobyl9Zm9yKHM9YixyPSExO3M8YzsrK3Mpe3E9Qy54
+Qi5XKGEscykKaWYocTwxMjgpe3A9cT4+PjQKaWYocD49OClyZXR1cm4gSC5PSChDLm1LLHApCnA9KEMu
+bUtbcF0mMTw8KHEmMTUpKSE9PTB9ZWxzZSBwPSExCmlmKCFwKXtQLlIzKGEscywiSWxsZWdhbCBzY2hl
+bWUgY2hhcmFjdGVyIikKSC5CaShvKX1pZig2NTw9cSYmcTw9OTApcj0hMH1hPUMueEIuTmooYSxiLGMp
+CnJldHVybiBQLllhKHI/YS50b0xvd2VyQ2FzZSgpOmEpfSwKWWE6ZnVuY3Rpb24oYSl7aWYoYT09PSJo
+dHRwIilyZXR1cm4iaHR0cCIKaWYoYT09PSJmaWxlIilyZXR1cm4iZmlsZSIKaWYoYT09PSJodHRwcyIp
+cmV0dXJuImh0dHBzIgppZihhPT09InBhY2thZ2UiKXJldHVybiJwYWNrYWdlIgpyZXR1cm4gYX0sCnpS
+OmZ1bmN0aW9uKGEsYixjKXtpZihhPT1udWxsKXJldHVybiIiCnJldHVybiBQLlBJKGEsYixjLEMudG8s
+ITEpfSwKa2E6ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe3ZhciBzLHIscT1lPT09ImZpbGUiLHA9cXx8Zgpp
+ZihhPT1udWxsKXtpZihkPT1udWxsKXJldHVybiBxPyIvIjoiIgpzPUgudDYoZCkKcj1uZXcgSC5sSihk
+LHMuQygicVUoMSkiKS5hKG5ldyBQLlJaKCkpLHMuQygibEo8MSxxVT4iKSkuSCgwLCIvIil9ZWxzZSBp
+ZihkIT1udWxsKXRocm93IEguYihQLnhZKCJCb3RoIHBhdGggYW5kIHBhdGhTZWdtZW50cyBzcGVjaWZp
+ZWQiKSkKZWxzZSByPVAuUEkoYSxiLGMsQy5XZCwhMCkKaWYoci5sZW5ndGg9PT0wKXtpZihxKXJldHVy
+biIvIn1lbHNlIGlmKHAmJiFDLnhCLm4ociwiLyIpKXI9Ii8iK3IKcmV0dXJuIFAuSnIocixlLGYpfSwK
+SnI6ZnVuY3Rpb24oYSxiLGMpe3ZhciBzPWIubGVuZ3RoPT09MAppZihzJiYhYyYmIUMueEIubihhLCIv
+IikpcmV0dXJuIFAud0YoYSwhc3x8YykKcmV0dXJuIFAueGUoYSl9LApsZTpmdW5jdGlvbihhLGIsYyxk
+KXt2YXIgcyxyPXt9CmlmKGEhPW51bGwpe2lmKGQhPW51bGwpdGhyb3cgSC5iKFAueFkoIkJvdGggcXVl
+cnkgYW5kIHF1ZXJ5UGFyYW1ldGVycyBzcGVjaWZpZWQiKSkKcmV0dXJuIFAuUEkoYSxiLGMsQy5WQywh
+MCl9aWYoZD09bnVsbClyZXR1cm4gbnVsbApzPW5ldyBQLlJuKCIiKQpyLmE9IiIKZC5LKDAsbmV3IFAu
+eTUobmV3IFAuTUUocixzKSkpCnI9cy5hCnJldHVybiByLmNoYXJDb2RlQXQoMCk9PTA/cjpyfSwKdEc6
+ZnVuY3Rpb24oYSxiLGMpe2lmKGE9PW51bGwpcmV0dXJuIG51bGwKcmV0dXJuIFAuUEkoYSxiLGMsQy5W
+QywhMCl9LApydjpmdW5jdGlvbihhLGIsYyl7dmFyIHMscixxLHAsbyxuPWIrMgppZihuPj1hLmxlbmd0
+aClyZXR1cm4iJSIKcz1DLnhCLk8yKGEsYisxKQpyPUMueEIuTzIoYSxuKQpxPUgub28ocykKcD1ILm9v
+KHIpCmlmKHE8MHx8cDwwKXJldHVybiIlIgpvPXEqMTYrcAppZihvPDEyNyl7bj1DLmpuLndHKG8sNCkK
+aWYobj49OClyZXR1cm4gSC5PSChDLkYzLG4pCm49KEMuRjNbbl0mMTw8KG8mMTUpKSE9PTB9ZWxzZSBu
+PSExCmlmKG4pcmV0dXJuIEguTHcoYyYmNjU8PW8mJjkwPj1vPyhvfDMyKT4+PjA6bykKaWYocz49OTd8
+fHI+PTk3KXJldHVybiBDLnhCLk5qKGEsYixiKzMpLnRvVXBwZXJDYXNlKCkKcmV0dXJuIG51bGx9LAp6
+WDpmdW5jdGlvbihhKXt2YXIgcyxyLHEscCxvLG4sbSxsLGs9IjAxMjM0NTY3ODlBQkNERUYiCmlmKGE8
+MTI4KXtzPW5ldyBVaW50OEFycmF5KDMpCnNbMF09MzcKc1sxXT1DLnhCLlcoayxhPj4+NCkKc1syXT1D
+LnhCLlcoayxhJjE1KX1lbHNle2lmKGE+MjA0NylpZihhPjY1NTM1KXtyPTI0MApxPTR9ZWxzZXtyPTIy
+NApxPTN9ZWxzZXtyPTE5MgpxPTJ9cD0zKnEKcz1uZXcgVWludDhBcnJheShwKQpmb3Iobz0wOy0tcSxx
+Pj0wO3I9MTI4KXtuPUMuam4uYmYoYSw2KnEpJjYzfHIKaWYobz49cClyZXR1cm4gSC5PSChzLG8pCnNb
+b109MzcKbT1vKzEKbD1DLnhCLlcoayxuPj4+NCkKaWYobT49cClyZXR1cm4gSC5PSChzLG0pCnNbbV09
+bApsPW8rMgptPUMueEIuVyhrLG4mMTUpCmlmKGw+PXApcmV0dXJuIEguT0gocyxsKQpzW2xdPW0Kbys9
+M319cmV0dXJuIFAuSE0ocywwLG51bGwpfSwKUEk6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgcz1QLlVs
+KGEsYixjLGQsZSkKcmV0dXJuIHM9PW51bGw/Qy54Qi5OaihhLGIsYyk6c30sClVsOmZ1bmN0aW9uKGEs
+YixjLGQsZSl7dmFyIHMscixxLHAsbyxuLG0sbCxrLGo9bnVsbApmb3Iocz0hZSxyPWIscT1yLHA9ajty
+PGM7KXtvPUMueEIuTzIoYSxyKQppZihvPDEyNyl7bj1vPj4+NAppZihuPj04KXJldHVybiBILk9IKGQs
+bikKbj0oZFtuXSYxPDwobyYxNSkpIT09MH1lbHNlIG49ITEKaWYobikrK3IKZWxzZXtpZihvPT09Mzcp
+e209UC5ydihhLHIsITEpCmlmKG09PW51bGwpe3IrPTMKY29udGludWV9aWYoIiUiPT09bSl7bT0iJTI1
+IgpsPTF9ZWxzZSBsPTN9ZWxzZXtpZihzKWlmKG88PTkzKXtuPW8+Pj40CmlmKG4+PTgpcmV0dXJuIEgu
+T0goQy5hayxuKQpuPShDLmFrW25dJjE8PChvJjE1KSkhPT0wfWVsc2Ugbj0hMQplbHNlIG49ITEKaWYo
+bil7UC5SMyhhLHIsIkludmFsaWQgY2hhcmFjdGVyIikKSC5CaSh1LmcpCmw9agptPWx9ZWxzZXtpZigo
+byY2NDUxMik9PT01NTI5Nil7bj1yKzEKaWYobjxjKXtrPUMueEIuTzIoYSxuKQppZigoayY2NDUxMik9
+PT01NjMyMCl7bz0obyYxMDIzKTw8MTB8ayYxMDIzfDY1NTM2Cmw9Mn1lbHNlIGw9MX1lbHNlIGw9MX1l
+bHNlIGw9MQptPVAuelgobyl9fWlmKHA9PW51bGwpe3A9bmV3IFAuUm4oIiIpCm49cH1lbHNlIG49cApu
+LmErPUMueEIuTmooYSxxLHIpCm4uYSs9SC5FaihtKQppZih0eXBlb2YgbCE9PSJudW1iZXIiKXJldHVy
+biBILnBZKGwpCnIrPWwKcT1yfX1pZihwPT1udWxsKXJldHVybiBqCmlmKHE8YylwLmErPUMueEIuTmoo
+YSxxLGMpCnM9cC5hCnJldHVybiBzLmNoYXJDb2RlQXQoMCk9PTA/czpzfSwKeUI6ZnVuY3Rpb24oYSl7
+aWYoQy54Qi5uKGEsIi4iKSlyZXR1cm4hMApyZXR1cm4gQy54Qi5PWShhLCIvLiIpIT09LTF9LAp4ZTpm
+dW5jdGlvbihhKXt2YXIgcyxyLHEscCxvLG4sbQppZighUC55QihhKSlyZXR1cm4gYQpzPUguVk0oW10s
+dC5zKQpmb3Iocj1hLnNwbGl0KCIvIikscT1yLmxlbmd0aCxwPSExLG89MDtvPHE7KytvKXtuPXJbb10K
+aWYoSi5STShuLCIuLiIpKXttPXMubGVuZ3RoCmlmKG0hPT0wKXtpZigwPj1tKXJldHVybiBILk9IKHMs
+LTEpCnMucG9wKCkKaWYocy5sZW5ndGg9PT0wKUMuTm0uaShzLCIiKX1wPSEwfWVsc2UgaWYoIi4iPT09
+bilwPSEwCmVsc2V7Qy5ObS5pKHMsbikKcD0hMX19aWYocClDLk5tLmkocywiIikKcmV0dXJuIEMuTm0u
+SChzLCIvIil9LAp3RjpmdW5jdGlvbihhLGIpe3ZhciBzLHIscSxwLG8sbgppZighUC55QihhKSlyZXR1
+cm4hYj9QLkMxKGEpOmEKcz1ILlZNKFtdLHQucykKZm9yKHI9YS5zcGxpdCgiLyIpLHE9ci5sZW5ndGgs
+cD0hMSxvPTA7bzxxOysrbyl7bj1yW29dCmlmKCIuLiI9PT1uKWlmKHMubGVuZ3RoIT09MCYmQy5ObS5n
+cloocykhPT0iLi4iKXtpZigwPj1zLmxlbmd0aClyZXR1cm4gSC5PSChzLC0xKQpzLnBvcCgpCnA9ITB9
+ZWxzZXtDLk5tLmkocywiLi4iKQpwPSExfWVsc2UgaWYoIi4iPT09bilwPSEwCmVsc2V7Qy5ObS5pKHMs
+bikKcD0hMX19cj1zLmxlbmd0aAppZihyIT09MClpZihyPT09MSl7aWYoMD49cilyZXR1cm4gSC5PSChz
+LDApCnI9c1swXS5sZW5ndGg9PT0wfWVsc2Ugcj0hMQplbHNlIHI9ITAKaWYocilyZXR1cm4iLi8iCmlm
+KHB8fEMuTm0uZ3JaKHMpPT09Ii4uIilDLk5tLmkocywiIikKaWYoIWIpe2lmKDA+PXMubGVuZ3RoKXJl
+dHVybiBILk9IKHMsMCkKQy5ObS5ZKHMsMCxQLkMxKHNbMF0pKX1yZXR1cm4gQy5ObS5IKHMsIi8iKX0s
+CkMxOmZ1bmN0aW9uKGEpe3ZhciBzLHIscSxwPWEubGVuZ3RoCmlmKHA+PTImJlAuRXQoSi5ReihhLDAp
+KSlmb3Iocz0xO3M8cDsrK3Mpe3I9Qy54Qi5XKGEscykKaWYocj09PTU4KXJldHVybiBDLnhCLk5qKGEs
+MCxzKSsiJTNBIitDLnhCLkcoYSxzKzEpCmlmKHI8PTEyNyl7cT1yPj4+NAppZihxPj04KXJldHVybiBI
+Lk9IKEMubUsscSkKcT0oQy5tS1txXSYxPDwociYxNSkpPT09MH1lbHNlIHE9ITAKaWYocSlicmVha31y
+ZXR1cm4gYX0sCm1uOmZ1bmN0aW9uKGEpe3ZhciBzLHIscSxwPWEuZ0ZqKCksbz1wLmxlbmd0aAppZihv
+PjAmJkouSG0ocFswXSk9PT0yJiZKLmE2KHBbMF0sMSk9PT01OCl7aWYoMD49bylyZXR1cm4gSC5PSChw
+LDApClAucmcoSi5hNihwWzBdLDApLCExKQpQLkhOKHAsITEsMSkKcz0hMH1lbHNle1AuSE4ocCwhMSww
+KQpzPSExfXI9YS5ndFQoKSYmIXM/IlxcIjoiIgppZihhLmdjaigpKXtxPWEuZ0pmKGEpCmlmKHEubGVu
+Z3RoIT09MClyPXIrIlxcIitxKyJcXCJ9cj1QLnZnKHIscCwiXFwiKQpvPXMmJm89PT0xP3IrIlxcIjpy
+CnJldHVybiBvLmNoYXJDb2RlQXQoMCk9PTA/bzpvfSwKSWg6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyLHEK
+Zm9yKHM9MCxyPTA7cjwyOysrcil7cT1DLnhCLlcoYSxiK3IpCmlmKDQ4PD1xJiZxPD01NylzPXMqMTYr
+cS00OAplbHNle3F8PTMyCmlmKDk3PD1xJiZxPD0xMDIpcz1zKjE2K3EtODcKZWxzZSB0aHJvdyBILmIo
+UC54WSgiSW52YWxpZCBVUkwgZW5jb2RpbmciKSl9fXJldHVybiBzfSwKa3U6ZnVuY3Rpb24oYSxiLGMs
+ZCxlKXt2YXIgcyxyLHEscCxvPUouclkoYSksbj1iCndoaWxlKCEwKXtpZighKG48Yykpe3M9ITAKYnJl
+YWt9cj1vLlcoYSxuKQppZihyPD0xMjcpaWYociE9PTM3KXE9ZSYmcj09PTQzCmVsc2UgcT0hMAplbHNl
+IHE9ITAKaWYocSl7cz0hMQpicmVha30rK259aWYocyl7aWYoQy54TSE9PWQpcT0hMQplbHNlIHE9ITAK
+aWYocSlyZXR1cm4gby5OaihhLGIsYykKZWxzZSBwPW5ldyBILnFqKG8uTmooYSxiLGMpKX1lbHNle3A9
+SC5WTShbXSx0LmEpCmZvcihuPWI7bjxjOysrbil7cj1vLlcoYSxuKQppZihyPjEyNyl0aHJvdyBILmIo
+UC54WSgiSWxsZWdhbCBwZXJjZW50IGVuY29kaW5nIGluIFVSSSIpKQppZihyPT09Mzcpe2lmKG4rMz5h
+Lmxlbmd0aCl0aHJvdyBILmIoUC54WSgiVHJ1bmNhdGVkIFVSSSIpKQpDLk5tLmkocCxQLkloKGEsbisx
+KSkKbis9Mn1lbHNlIGlmKGUmJnI9PT00MylDLk5tLmkocCwzMikKZWxzZSBDLk5tLmkocCxyKX19dC5M
+LmEocCkKcmV0dXJuIEMub0UuV0oocCl9LApFdDpmdW5jdGlvbihhKXt2YXIgcz1hfDMyCnJldHVybiA5
+Nzw9cyYmczw9MTIyfSwKS0Q6ZnVuY3Rpb24oYSxiLGMpe3ZhciBzLHIscSxwLG8sbixtLGwsaz0iSW52
+YWxpZCBNSU1FIHR5cGUiLGo9SC5WTShbYi0xXSx0LmEpCmZvcihzPWEubGVuZ3RoLHI9YixxPS0xLHA9
+bnVsbDtyPHM7KytyKXtwPUMueEIuVyhhLHIpCmlmKHA9PT00NHx8cD09PTU5KWJyZWFrCmlmKHA9PT00
+Nyl7aWYocTwwKXtxPXIKY29udGludWV9dGhyb3cgSC5iKFAucnIoayxhLHIpKX19aWYocTwwJiZyPmIp
+dGhyb3cgSC5iKFAucnIoayxhLHIpKQpmb3IoO3AhPT00NDspe0MuTm0uaShqLHIpOysrcgpmb3Iobz0t
+MTtyPHM7KytyKXtwPUMueEIuVyhhLHIpCmlmKHA9PT02MSl7aWYobzwwKW89cn1lbHNlIGlmKHA9PT01
+OXx8cD09PTQ0KWJyZWFrfWlmKG8+PTApQy5ObS5pKGosbykKZWxzZXtuPUMuTm0uZ3JaKGopCmlmKHAh
+PT00NHx8ciE9PW4rN3x8IUMueEIuUWkoYSwiYmFzZTY0IixuKzEpKXRocm93IEguYihQLnJyKCJFeHBl
+Y3RpbmcgJz0nIixhLHIpKQpicmVha319Qy5ObS5pKGoscikKbT1yKzEKaWYoKGoubGVuZ3RoJjEpPT09
+MSlhPUMuaDkueXIoYSxtLHMpCmVsc2V7bD1QLlVsKGEsbSxzLEMuVkMsITApCmlmKGwhPW51bGwpYT1D
+LnhCLmk3KGEsbSxzLGwpfXJldHVybiBuZXcgUC5QRShhLGosYyl9LApLTjpmdW5jdGlvbigpe3ZhciBz
+PSIwMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2
+d3h5ei0uX34hJCYnKCkqKyw7PSIscj0iLiIscT0iOiIscD0iLyIsbz0iPyIsbj0iIyIsbT10LmdjLGw9
+UC5kSCgyMixuZXcgUC5xMygpLG0pLGs9bmV3IFAueUkobCksaj1uZXcgUC5jNigpLGk9bmV3IFAucWQo
+KSxoPW0uYShrLiQyKDAsMjI1KSkKai4kMyhoLHMsMSkKai4kMyhoLHIsMTQpCmouJDMoaCxxLDM0KQpq
+LiQzKGgscCwzKQpqLiQzKGgsbywxNzIpCmouJDMoaCxuLDIwNSkKaD1tLmEoay4kMigxNCwyMjUpKQpq
+LiQzKGgscywxKQpqLiQzKGgsciwxNSkKai4kMyhoLHEsMzQpCmouJDMoaCxwLDIzNCkKai4kMyhoLG8s
+MTcyKQpqLiQzKGgsbiwyMDUpCmg9bS5hKGsuJDIoMTUsMjI1KSkKai4kMyhoLHMsMSkKai4kMyhoLCIl
+IiwyMjUpCmouJDMoaCxxLDM0KQpqLiQzKGgscCw5KQpqLiQzKGgsbywxNzIpCmouJDMoaCxuLDIwNSkK
+aD1tLmEoay4kMigxLDIyNSkpCmouJDMoaCxzLDEpCmouJDMoaCxxLDM0KQpqLiQzKGgscCwxMCkKai4k
+MyhoLG8sMTcyKQpqLiQzKGgsbiwyMDUpCmg9bS5hKGsuJDIoMiwyMzUpKQpqLiQzKGgscywxMzkpCmou
+JDMoaCxwLDEzMSkKai4kMyhoLHIsMTQ2KQpqLiQzKGgsbywxNzIpCmouJDMoaCxuLDIwNSkKaD1tLmEo
+ay4kMigzLDIzNSkpCmouJDMoaCxzLDExKQpqLiQzKGgscCw2OCkKai4kMyhoLHIsMTgpCmouJDMoaCxv
+LDE3MikKai4kMyhoLG4sMjA1KQpoPW0uYShrLiQyKDQsMjI5KSkKai4kMyhoLHMsNSkKaS4kMyhoLCJB
+WiIsMjI5KQpqLiQzKGgscSwxMDIpCmouJDMoaCwiQCIsNjgpCmouJDMoaCwiWyIsMjMyKQpqLiQzKGgs
+cCwxMzgpCmouJDMoaCxvLDE3MikKai4kMyhoLG4sMjA1KQpoPW0uYShrLiQyKDUsMjI5KSkKai4kMyho
+LHMsNSkKaS4kMyhoLCJBWiIsMjI5KQpqLiQzKGgscSwxMDIpCmouJDMoaCwiQCIsNjgpCmouJDMoaCxw
+LDEzOCkKai4kMyhoLG8sMTcyKQpqLiQzKGgsbiwyMDUpCmg9bS5hKGsuJDIoNiwyMzEpKQppLiQzKGgs
+IjE5Iiw3KQpqLiQzKGgsIkAiLDY4KQpqLiQzKGgscCwxMzgpCmouJDMoaCxvLDE3MikKai4kMyhoLG4s
+MjA1KQpoPW0uYShrLiQyKDcsMjMxKSkKaS4kMyhoLCIwOSIsNykKai4kMyhoLCJAIiw2OCkKai4kMyho
+LHAsMTM4KQpqLiQzKGgsbywxNzIpCmouJDMoaCxuLDIwNSkKai4kMyhtLmEoay4kMig4LDgpKSwiXSIs
+NSkKaD1tLmEoay4kMig5LDIzNSkpCmouJDMoaCxzLDExKQpqLiQzKGgsciwxNikKai4kMyhoLHAsMjM0
+KQpqLiQzKGgsbywxNzIpCmouJDMoaCxuLDIwNSkKaD1tLmEoay4kMigxNiwyMzUpKQpqLiQzKGgscywx
+MSkKai4kMyhoLHIsMTcpCmouJDMoaCxwLDIzNCkKai4kMyhoLG8sMTcyKQpqLiQzKGgsbiwyMDUpCmg9
+bS5hKGsuJDIoMTcsMjM1KSkKai4kMyhoLHMsMTEpCmouJDMoaCxwLDkpCmouJDMoaCxvLDE3MikKai4k
+MyhoLG4sMjA1KQpoPW0uYShrLiQyKDEwLDIzNSkpCmouJDMoaCxzLDExKQpqLiQzKGgsciwxOCkKai4k
+MyhoLHAsMjM0KQpqLiQzKGgsbywxNzIpCmouJDMoaCxuLDIwNSkKaD1tLmEoay4kMigxOCwyMzUpKQpq
+LiQzKGgscywxMSkKai4kMyhoLHIsMTkpCmouJDMoaCxwLDIzNCkKai4kMyhoLG8sMTcyKQpqLiQzKGgs
+biwyMDUpCmg9bS5hKGsuJDIoMTksMjM1KSkKai4kMyhoLHMsMTEpCmouJDMoaCxwLDIzNCkKai4kMyho
+LG8sMTcyKQpqLiQzKGgsbiwyMDUpCmg9bS5hKGsuJDIoMTEsMjM1KSkKai4kMyhoLHMsMTEpCmouJDMo
+aCxwLDEwKQpqLiQzKGgsbywxNzIpCmouJDMoaCxuLDIwNSkKaD1tLmEoay4kMigxMiwyMzYpKQpqLiQz
+KGgscywxMikKai4kMyhoLG8sMTIpCmouJDMoaCxuLDIwNSkKaD1tLmEoay4kMigxMywyMzcpKQpqLiQz
+KGgscywxMykKai4kMyhoLG8sMTMpCmkuJDMobS5hKGsuJDIoMjAsMjQ1KSksImF6IiwyMSkKaz1tLmEo
+ay4kMigyMSwyNDUpKQppLiQzKGssImF6IiwyMSkKaS4kMyhrLCIwOSIsMjEpCmouJDMoaywiKy0uIiwy
+MSkKcmV0dXJuIGx9LApVQjpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBzLHIscSxwLG8sbj0kLnZaKCkK
+Zm9yKHM9Si5yWShhKSxyPWI7cjxjOysrcil7bi5sZW5ndGgKaWYoZDwwfHxkPj0yMilyZXR1cm4gSC5P
+SChuLGQpCnE9bltkXQpwPXMuVyhhLHIpXjk2Cm89cVtwPjk1PzMxOnBdCmQ9byYzMQpDLk5tLlkoZSxv
+Pj4+NSxyKX1yZXR1cm4gZH0sCldGOmZ1bmN0aW9uIFdGKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApp
+UDpmdW5jdGlvbiBpUChhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKWFM6ZnVuY3Rpb24gWFMoKXt9LApD
+NjpmdW5jdGlvbiBDNihhKXt0aGlzLmE9YX0sCkV6OmZ1bmN0aW9uIEV6KCl7fSwKRjpmdW5jdGlvbiBG
+KCl7fSwKdTpmdW5jdGlvbiB1KGEsYixjLGQpe3ZhciBfPXRoaXMKXy5hPWEKXy5iPWIKXy5jPWMKXy5k
+PWR9LApiSjpmdW5jdGlvbiBiSihhLGIsYyxkLGUsZil7dmFyIF89dGhpcwpfLmU9YQpfLmY9YgpfLmE9
+YwpfLmI9ZApfLmM9ZQpfLmQ9Zn0sCmVZOmZ1bmN0aW9uIGVZKGEsYixjLGQsZSl7dmFyIF89dGhpcwpf
+LmY9YQpfLmE9YgpfLmI9YwpfLmM9ZApfLmQ9ZX0sCm1wOmZ1bmN0aW9uIG1wKGEsYixjLGQpe3ZhciBf
+PXRoaXMKXy5hPWEKXy5iPWIKXy5jPWMKXy5kPWR9LAp1YjpmdW5jdGlvbiB1YihhKXt0aGlzLmE9YX0s
+CmRzOmZ1bmN0aW9uIGRzKGEpe3RoaXMuYT1hfSwKbGo6ZnVuY3Rpb24gbGooYSl7dGhpcy5hPWF9LApV
+VjpmdW5jdGlvbiBVVihhKXt0aGlzLmE9YX0sCms1OmZ1bmN0aW9uIGs1KCl7fSwKS1k6ZnVuY3Rpb24g
+S1koKXt9LApwOmZ1bmN0aW9uIHAoYSl7dGhpcy5hPWF9LApDRDpmdW5jdGlvbiBDRChhKXt0aGlzLmE9
+YX0sCmFFOmZ1bmN0aW9uIGFFKGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9Y30sCmNYOmZ1
+bmN0aW9uIGNYKCl7fSwKQW46ZnVuY3Rpb24gQW4oKXt9LApOMzpmdW5jdGlvbiBOMyhhLGIsYyl7dGhp
+cy5hPWEKdGhpcy5iPWIKdGhpcy4kdGk9Y30sCmM4OmZ1bmN0aW9uIGM4KCl7fSwKTWg6ZnVuY3Rpb24g
+TWgoKXt9LApaZDpmdW5jdGlvbiBaZCgpe30sClJuOmZ1bmN0aW9uIFJuKGEpe3RoaXMuYT1hfSwKbjE6
+ZnVuY3Rpb24gbjEoYSl7dGhpcy5hPWF9LApjUzpmdW5jdGlvbiBjUyhhKXt0aGlzLmE9YX0sClZDOmZ1
+bmN0aW9uIFZDKGEpe3RoaXMuYT1hfSwKSlQ6ZnVuY3Rpb24gSlQoYSxiKXt0aGlzLmE9YQp0aGlzLmI9
+Yn0sCkRuOmZ1bmN0aW9uIERuKGEsYixjLGQsZSxmLGcpe3ZhciBfPXRoaXMKXy5hPWEKXy5iPWIKXy5j
+PWMKXy5kPWQKXy5lPWUKXy5mPWYKXy5yPWcKXy54PW51bGwKXy55PSExCl8uej1udWxsCl8uUT0hMQpf
+LmNoPW51bGwKXy5jeD0hMQpfLmN5PW51bGwKXy5kYj0hMX0sClJaOmZ1bmN0aW9uIFJaKCl7fSwKTUU6
+ZnVuY3Rpb24gTUUoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCnk1OmZ1bmN0aW9uIHk1KGEpe3RoaXMu
+YT1hfSwKUEU6ZnVuY3Rpb24gUEUoYSxiLGMpe3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMuYz1jfSwKcTM6
+ZnVuY3Rpb24gcTMoKXt9LAp5STpmdW5jdGlvbiB5SShhKXt0aGlzLmE9YX0sCmM2OmZ1bmN0aW9uIGM2
+KCl7fSwKcWQ6ZnVuY3Rpb24gcWQoKXt9LApVZjpmdW5jdGlvbiBVZihhLGIsYyxkLGUsZixnLGgpe3Zh
+ciBfPXRoaXMKXy5hPWEKXy5iPWIKXy5jPWMKXy5kPWQKXy5lPWUKXy5mPWYKXy5yPWcKXy54PWgKXy55
+PW51bGx9LApxZTpmdW5jdGlvbiBxZShhLGIsYyxkLGUsZixnKXt2YXIgXz10aGlzCl8uYT1hCl8uYj1i
+Cl8uYz1jCl8uZD1kCl8uZT1lCl8uZj1mCl8ucj1nCl8ueD1udWxsCl8ueT0hMQpfLno9bnVsbApfLlE9
+ITEKXy5jaD1udWxsCl8uY3g9ITEKXy5jeT1udWxsCl8uZGI9ITF9LAppSjpmdW5jdGlvbiBpSigpe30s
+CmpnOmZ1bmN0aW9uIGpnKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApUYTpmdW5jdGlvbiBUYShhLGIp
+e3RoaXMuYT1hCnRoaXMuYj1ifSwKQmY6ZnVuY3Rpb24gQmYoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0s
+CkFzOmZ1bmN0aW9uIEFzKCl7fSwKR0U6ZnVuY3Rpb24gR0UoYSl7dGhpcy5hPWF9LApONzpmdW5jdGlv
+biBONyhhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKdVE6ZnVuY3Rpb24gdVEoKXt9LApoRjpmdW5jdGlv
+biBoRigpe30sClI0OmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBzLHIscQpILnk4KGIpCnQuai5hKGQpCmlm
+KEgub1QoYikpe3M9W2NdCkMuTm0uRlYocyxkKQpkPXN9cj10LnoKcT1QLkNIKEouTTEoZCxQLncwKCks
+ciksITAscikKdC5ZLmEoYSkKcmV0dXJuIFAud1koSC5FayhhLHEsbnVsbCkpfSwKRG06ZnVuY3Rpb24o
+YSxiLGMpe3ZhciBzCnRyeXtpZihPYmplY3QuaXNFeHRlbnNpYmxlKGEpJiYhT2JqZWN0LnByb3RvdHlw
+ZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGEsYikpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShhLGIse3ZhbHVl
+OmN9KQpyZXR1cm4hMH19Y2F0Y2gocyl7SC5SdShzKX1yZXR1cm4hMX0sCk9tOmZ1bmN0aW9uKGEsYil7
+aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGEsYikpcmV0dXJuIGFbYl0KcmV0
+dXJuIG51bGx9LAp3WTpmdW5jdGlvbihhKXtpZihhPT1udWxsfHx0eXBlb2YgYT09InN0cmluZyJ8fHR5
+cGVvZiBhPT0ibnVtYmVyInx8SC5sKGEpKXJldHVybiBhCmlmKGEgaW5zdGFuY2VvZiBQLkU0KXJldHVy
+biBhLmEKaWYoSC5SOShhKSlyZXR1cm4gYQppZih0LmFrLmIoYSkpcmV0dXJuIGEKaWYoYSBpbnN0YW5j
+ZW9mIFAuaVApcmV0dXJuIEgubzIoYSkKaWYodC5ZLmIoYSkpcmV0dXJuIFAuaEUoYSwiJGRhcnRfanNG
+dW5jdGlvbiIsbmV3IFAuUEMoKSkKcmV0dXJuIFAuaEUoYSwiXyRkYXJ0X2pzT2JqZWN0IixuZXcgUC5t
+dCgkLmtJKCkpKX0sCmhFOmZ1bmN0aW9uKGEsYixjKXt2YXIgcz1QLk9tKGEsYikKaWYocz09bnVsbCl7
+cz1jLiQxKGEpClAuRG0oYSxiLHMpfXJldHVybiBzfSwKZFU6ZnVuY3Rpb24oYSl7dmFyIHMscgppZihh
+PT1udWxsfHx0eXBlb2YgYT09InN0cmluZyJ8fHR5cGVvZiBhPT0ibnVtYmVyInx8dHlwZW9mIGE9PSJi
+b29sZWFuIilyZXR1cm4gYQplbHNlIGlmKGEgaW5zdGFuY2VvZiBPYmplY3QmJkguUjkoYSkpcmV0dXJu
+IGEKZWxzZSBpZihhIGluc3RhbmNlb2YgT2JqZWN0JiZ0LmFrLmIoYSkpcmV0dXJuIGEKZWxzZSBpZihh
+IGluc3RhbmNlb2YgRGF0ZSl7cz1ILnVQKGEuZ2V0VGltZSgpKQppZihNYXRoLmFicyhzKTw9ODY0ZTEz
+KXI9ITEKZWxzZSByPSEwCmlmKHIpSC52KFAueFkoIkRhdGVUaW1lIGlzIG91dHNpZGUgdmFsaWQgcmFu
+Z2U6ICIrcykpClAuVUkoITEsImlzVXRjIix0LnkpCnJldHVybiBuZXcgUC5pUChzLCExKX1lbHNlIGlm
+KGEuY29uc3RydWN0b3I9PT0kLmtJKCkpcmV0dXJuIGEubwplbHNlIHJldHVybiBQLk5EKGEpfSwKTkQ6
+ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGE9PSJmdW5jdGlvbiIpcmV0dXJuIFAuaVEoYSwkLncoKSxuZXcg
+UC5OeigpKQppZihhIGluc3RhbmNlb2YgQXJyYXkpcmV0dXJuIFAuaVEoYSwkLlI4KCksbmV3IFAuUVMo
+KSkKcmV0dXJuIFAuaVEoYSwkLlI4KCksbmV3IFAubnAoKSl9LAppUTpmdW5jdGlvbihhLGIsYyl7dmFy
+IHM9UC5PbShhLGIpCmlmKHM9PW51bGx8fCEoYSBpbnN0YW5jZW9mIE9iamVjdCkpe3M9Yy4kMShhKQpQ
+LkRtKGEsYixzKX1yZXR1cm4gc30sClBDOmZ1bmN0aW9uIFBDKCl7fSwKbXQ6ZnVuY3Rpb24gbXQoYSl7
+dGhpcy5hPWF9LApOejpmdW5jdGlvbiBOeigpe30sClFTOmZ1bmN0aW9uIFFTKCl7fSwKbnA6ZnVuY3Rp
+b24gbnAoKXt9LApFNDpmdW5jdGlvbiBFNChhKXt0aGlzLmE9YX0sCnI3OmZ1bmN0aW9uIHI3KGEpe3Ro
+aXMuYT1hfSwKVHo6ZnVuY3Rpb24gVHooYSxiKXt0aGlzLmE9YQp0aGlzLiR0aT1ifSwKY286ZnVuY3Rp
+b24gY28oKXt9LApuZDpmdW5jdGlvbiBuZCgpe30sCktlOmZ1bmN0aW9uIEtlKGEpe3RoaXMuYT1hfSwK
+aGk6ZnVuY3Rpb24gaGkoKXt9fSxXPXsKeDM6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93fSwKWnI6ZnVu
+Y3Rpb24oKXtyZXR1cm4gZG9jdW1lbnR9LApKNjpmdW5jdGlvbihhKXt2YXIgcz1kb2N1bWVudC5jcmVh
+dGVFbGVtZW50KCJhIikKaWYoYSE9bnVsbClDLnhuLnNMVShzLGEpCnJldHVybiBzfSwKVTk6ZnVuY3Rp
+b24oYSxiLGMpe3ZhciBzLHI9ZG9jdW1lbnQuYm9keQpyLnRvU3RyaW5nCnM9Qy5SWS5yNihyLGEsYixj
+KQpzLnRvU3RyaW5nCnI9dC5hYwpyPW5ldyBILlU1KG5ldyBXLmU3KHMpLHIuQygiYTIobEQuRSkiKS5h
+KG5ldyBXLkN2KCkpLHIuQygiVTU8bEQuRT4iKSkKcmV0dXJuIHQuaC5hKHIuZ3I4KHIpKX0sCnJTOmZ1
+bmN0aW9uKGEpe3ZhciBzLHIscT0iZWxlbWVudCB0YWcgdW5hdmFpbGFibGUiCnRyeXtzPUouWUUoYSkK
+aWYodHlwZW9mIHMuZ25zKGEpPT0ic3RyaW5nIilxPXMuZ25zKGEpfWNhdGNoKHIpe0guUnUocil9cmV0
+dXJuIHF9LApDMDpmdW5jdGlvbihhLGIpe2E9YStiJjUzNjg3MDkxMQphPWErKChhJjUyNDI4Nyk8PDEw
+KSY1MzY4NzA5MTEKcmV0dXJuIGFeYT4+PjZ9LApyRTpmdW5jdGlvbihhLGIsYyxkKXt2YXIgcz1XLkMw
+KFcuQzAoVy5DMChXLkMwKDAsYSksYiksYyksZCkscj1zKygocyY2NzEwODg2Myk8PDMpJjUzNjg3MDkx
+MQpyXj1yPj4+MTEKcmV0dXJuIHIrKChyJjE2MzgzKTw8MTUpJjUzNjg3MDkxMX0sClROOmZ1bmN0aW9u
+KGEsYil7dmFyIHMscixxPWEuY2xhc3NMaXN0CmZvcihzPWIubGVuZ3RoLHI9MDtyPGIubGVuZ3RoO2Iu
+bGVuZ3RoPT09c3x8KDAsSC5saykoYiksKytyKXEuYWRkKGJbcl0pfSwKSkU6ZnVuY3Rpb24oYSxiLGMs
+ZCxlKXt2YXIgcz1XLmFGKG5ldyBXLnZOKGMpLHQuQikKaWYocyE9bnVsbCYmITApSi5kWihhLGIscywh
+MSkKcmV0dXJuIG5ldyBXLnhDKGEsYixzLCExLGUuQygieEM8MD4iKSl9LApUdzpmdW5jdGlvbihhKXt2
+YXIgcz1XLko2KG51bGwpLHI9d2luZG93LmxvY2F0aW9uCnM9bmV3IFcuSlEobmV3IFcubWsocyxyKSkK
+cy5DWShhKQpyZXR1cm4gc30sCnFEOmZ1bmN0aW9uKGEsYixjLGQpe3QuaC5hKGEpCkguaChiKQpILmgo
+YykKdC5jci5hKGQpCnJldHVybiEwfSwKUVc6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHMscixxCnQuaC5h
+KGEpCkguaChiKQpILmgoYykKcz10LmNyLmEoZCkuYQpyPXMuYQpDLnhuLnNMVShyLGMpCnE9ci5ob3N0
+bmFtZQpzPXMuYgppZighKHE9PXMuaG9zdG5hbWUmJnIucG9ydD09cy5wb3J0JiZyLnByb3RvY29sPT1z
+LnByb3RvY29sKSlpZihxPT09IiIpaWYoci5wb3J0PT09IiIpe3M9ci5wcm90b2NvbApzPXM9PT0iOiJ8
+fHM9PT0iIn1lbHNlIHM9ITEKZWxzZSBzPSExCmVsc2Ugcz0hMApyZXR1cm4gc30sCkJsOmZ1bmN0aW9u
+KCl7dmFyIHM9dC5OLHI9UC50TShDLlF4LHMpLHE9dC5kMC5hKG5ldyBXLklBKCkpLHA9SC5WTShbIlRF
+TVBMQVRFIl0sdC5zKQpzPW5ldyBXLmN0KHIsUC5McyhzKSxQLkxzKHMpLFAuTHMocyksbnVsbCkKcy5D
+WShudWxsLG5ldyBILmxKKEMuUXgscSx0LmZqKSxwLG51bGwpCnJldHVybiBzfSwKcWM6ZnVuY3Rpb24o
+YSl7dmFyIHMKaWYoYT09bnVsbClyZXR1cm4gbnVsbAppZigicG9zdE1lc3NhZ2UiIGluIGEpe3M9Vy5Q
+MShhKQppZih0LmFTLmIocykpcmV0dXJuIHMKcmV0dXJuIG51bGx9ZWxzZSByZXR1cm4gdC5jaC5hKGEp
+fSwKUDE6ZnVuY3Rpb24oYSl7aWYoYT09PXdpbmRvdylyZXR1cm4gdC5jaS5hKGEpCmVsc2UgcmV0dXJu
+IG5ldyBXLmRXKCl9LAphRjpmdW5jdGlvbihhLGIpe3ZhciBzPSQuWDMKaWYocz09PUMuTlUpcmV0dXJu
+IGEKcmV0dXJuIHMuUHkoYSxiKX0sCnFFOmZ1bmN0aW9uIHFFKCl7fSwKR2g6ZnVuY3Rpb24gR2goKXt9
+LApmWTpmdW5jdGlvbiBmWSgpe30sCm5COmZ1bmN0aW9uIG5CKCl7fSwKQXo6ZnVuY3Rpb24gQXooKXt9
+LApRUDpmdW5jdGlvbiBRUCgpe30sCm54OmZ1bmN0aW9uIG54KCl7fSwKb0o6ZnVuY3Rpb24gb0ooKXt9
+LAppZDpmdW5jdGlvbiBpZCgpe30sClFGOmZ1bmN0aW9uIFFGKCl7fSwKTmg6ZnVuY3Rpb24gTmgoKXt9
+LAphZTpmdW5jdGlvbiBhZSgpe30sCklCOmZ1bmN0aW9uIElCKCl7fSwKbjc6ZnVuY3Rpb24gbjcoKXt9
+LAp3ejpmdW5jdGlvbiB3eihhLGIpe3RoaXMuYT1hCnRoaXMuJHRpPWJ9LApjdjpmdW5jdGlvbiBjdigp
+e30sCkN2OmZ1bmN0aW9uIEN2KCl7fSwKZWE6ZnVuY3Rpb24gZWEoKXt9LApEMDpmdW5jdGlvbiBEMCgp
+e30sCmhIOmZ1bmN0aW9uIGhIKCl7fSwKaDQ6ZnVuY3Rpb24gaDQoKXt9LApicjpmdW5jdGlvbiBicigp
+e30sClZiOmZ1bmN0aW9uIFZiKCl7fSwKZko6ZnVuY3Rpb24gZkooKXt9LAp3YTpmdW5jdGlvbiB3YSgp
+e30sClNnOmZ1bmN0aW9uIFNnKCl7fSwKdTg6ZnVuY3Rpb24gdTgoKXt9LApBajpmdW5jdGlvbiBBaigp
+e30sCmU3OmZ1bmN0aW9uIGU3KGEpe3RoaXMuYT1hfSwKdUg6ZnVuY3Rpb24gdUgoKXt9LApCSDpmdW5j
+dGlvbiBCSCgpe30sClNOOmZ1bmN0aW9uIFNOKCl7fSwKZXc6ZnVuY3Rpb24gZXcoKXt9LApscDpmdW5j
+dGlvbiBscCgpe30sClRiOmZ1bmN0aW9uIFRiKCl7fSwKSXY6ZnVuY3Rpb24gSXYoKXt9LApXUDpmdW5j
+dGlvbiBXUCgpe30sCnlZOmZ1bmN0aW9uIHlZKCl7fSwKdzY6ZnVuY3Rpb24gdzYoKXt9LApLNTpmdW5j
+dGlvbiBLNSgpe30sCkNtOmZ1bmN0aW9uIENtKCl7fSwKQ1E6ZnVuY3Rpb24gQ1EoKXt9LAp3NDpmdW5j
+dGlvbiB3NCgpe30sCnJoOmZ1bmN0aW9uIHJoKCl7fSwKY2Y6ZnVuY3Rpb24gY2YoKXt9LAppNzpmdW5j
+dGlvbiBpNyhhKXt0aGlzLmE9YX0sClN5OmZ1bmN0aW9uIFN5KGEpe3RoaXMuYT1hfSwKS1M6ZnVuY3Rp
+b24gS1MoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCkEzOmZ1bmN0aW9uIEEzKGEsYil7dGhpcy5hPWEK
+dGhpcy5iPWJ9LApJNDpmdW5jdGlvbiBJNChhKXt0aGlzLmE9YX0sCkZrOmZ1bmN0aW9uIEZrKGEsYil7
+dGhpcy5hPWEKdGhpcy4kdGk9Yn0sClJPOmZ1bmN0aW9uIFJPKGEsYixjLGQpe3ZhciBfPXRoaXMKXy5h
+PWEKXy5iPWIKXy5jPWMKXy4kdGk9ZH0sCmV1OmZ1bmN0aW9uIGV1KGEsYixjLGQpe3ZhciBfPXRoaXMK
+Xy5hPWEKXy5iPWIKXy5jPWMKXy4kdGk9ZH0sCnhDOmZ1bmN0aW9uIHhDKGEsYixjLGQsZSl7dmFyIF89
+dGhpcwpfLmI9YQpfLmM9YgpfLmQ9YwpfLmU9ZApfLiR0aT1lfSwKdk46ZnVuY3Rpb24gdk4oYSl7dGhp
+cy5hPWF9LApKUTpmdW5jdGlvbiBKUShhKXt0aGlzLmE9YX0sCkdtOmZ1bmN0aW9uIEdtKCl7fSwKdkQ6
+ZnVuY3Rpb24gdkQoYSl7dGhpcy5hPWF9LApVdjpmdW5jdGlvbiBVdihhKXt0aGlzLmE9YX0sCkVnOmZ1
+bmN0aW9uIEVnKGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9Y30sCm02OmZ1bmN0aW9uIG02
+KCl7fSwKRW86ZnVuY3Rpb24gRW8oKXt9LApXazpmdW5jdGlvbiBXaygpe30sCmN0OmZ1bmN0aW9uIGN0
+KGEsYixjLGQsZSl7dmFyIF89dGhpcwpfLmU9YQpfLmE9YgpfLmI9YwpfLmM9ZApfLmQ9ZX0sCklBOmZ1
+bmN0aW9uIElBKCl7fSwKT3c6ZnVuY3Rpb24gT3coKXt9LApXOTpmdW5jdGlvbiBXOShhLGIsYyl7dmFy
+IF89dGhpcwpfLmE9YQpfLmI9YgpfLmM9LTEKXy5kPW51bGwKXy4kdGk9Y30sCmRXOmZ1bmN0aW9uIGRX
+KCl7fSwKbWs6ZnVuY3Rpb24gbWsoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCktvOmZ1bmN0aW9uIEtv
+KGEpe3RoaXMuYT1hCnRoaXMuYj0hMX0sCmZtOmZ1bmN0aW9uIGZtKGEpe3RoaXMuYT1hfSwKTGU6ZnVu
+Y3Rpb24gTGUoKXt9LApLNzpmdW5jdGlvbiBLNygpe30sCnJCOmZ1bmN0aW9uIHJCKCl7fSwKWFc6ZnVu
+Y3Rpb24gWFcoKXt9LApvYTpmdW5jdGlvbiBvYSgpe319LE09ewpPWDpmdW5jdGlvbihhKXtzd2l0Y2go
+YSl7Y2FzZSBDLkFkOnJldHVybiJBZGQgLyo/Ki8gaGludCIKY2FzZSBDLm5lOnJldHVybiJBZGQgLyoh
+Ki8gaGludCIKY2FzZSBDLndWOnJldHVybiJSZW1vdmUgLyo/Ki8gaGludCIKY2FzZSBDLmZSOnJldHVy
+biJSZW1vdmUgLyohKi8gaGludCIKY2FzZSBDLm15OnJldHVybiJDaGFuZ2UgdG8gLyo/Ki8gaGludCIK
+Y2FzZSBDLnJ4OnJldHVybiJDaGFuZ2UgdG8gLyohKi8gaGludCJ9cmV0dXJuIG51bGx9LApINzpmdW5j
+dGlvbiBINyhhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKWUY6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyLHEs
+cCxvLG4sbSxsCmZvcihzPWIubGVuZ3RoLHI9MTtyPHM7KytyKXtpZihiW3JdPT1udWxsfHxiW3ItMV0h
+PW51bGwpY29udGludWUKZm9yKDtzPj0xO3M9cSl7cT1zLTEKaWYoYltxXSE9bnVsbClicmVha31wPW5l
+dyBQLlJuKCIiKQpvPWErIigiCnAuYT1vCm49SC50NihiKQptPW4uQygibkg8MT4iKQpsPW5ldyBILm5I
+KGIsMCxzLG0pCmwuSGQoYiwwLHMsbi5jKQptPW8rbmV3IEgubEoobCxtLkMoInFVKGFMLkUpIikuYShu
+ZXcgTS5ObygpKSxtLkMoImxKPGFMLkUscVU+IikpLkgoMCwiLCAiKQpwLmE9bQpwLmE9bSsoIik6IHBh
+cnQgIisoci0xKSsiIHdhcyBudWxsLCBidXQgcGFydCAiK3IrIiB3YXMgbm90LiIpCnRocm93IEguYihQ
+LnhZKHAudygwKSkpfX0sCmxJOmZ1bmN0aW9uIGxJKGEpe3RoaXMuYT1hfSwKcTc6ZnVuY3Rpb24gcTco
+KXt9LApObzpmdW5jdGlvbiBObygpe319LFU9ewpuejpmdW5jdGlvbihhKXt2YXIgcz1ILnVQKGEucSgw
+LCJub2RlSWQiKSkKcmV0dXJuIG5ldyBVLkxMKEMuTm0uSHQoQy5yayxuZXcgVS5NRChhKSkscyl9LApM
+TDpmdW5jdGlvbiBMTChhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKTUQ6ZnVuY3Rpb24gTUQoYSl7dGhp
+cy5hPWF9LApqZjpmdW5jdGlvbihhKXt2YXIgcyxyLHEscAppZihhPT1udWxsKXM9bnVsbAplbHNle3M9
+SC5WTShbXSx0LmQ3KQpmb3Iocj1KLklUKHQuVS5hKGEpKTtyLkYoKTspe3E9ci5nbCgpCnA9Si5VNihx
+KQpDLk5tLmkocyxuZXcgVS5TZShILmgocC5xKHEsImRlc2NyaXB0aW9uIikpLEguaChwLnEocSwiaHJl
+ZiIpKSkpfX1yZXR1cm4gc30sCk5kOmZ1bmN0aW9uKGEpe3ZhciBzLHIKaWYoYT09bnVsbClzPW51bGwK
+ZWxzZXtzPUguVk0oW10sdC5hQSkKZm9yKHI9Si5JVCh0LlUuYShhKSk7ci5GKCk7KUMuTm0uaShzLFUu
+TmYoci5nbCgpKSl9cmV0dXJuIHN9LApOZjpmdW5jdGlvbihhKXt2YXIgcz1KLlU2KGEpLHI9SC5oKHMu
+cShhLCJkZXNjcmlwdGlvbiIpKSxxPUguVk0oW10sdC5hSikKZm9yKHM9Si5JVCh0LlUuYShzLnEoYSwi
+ZW50cmllcyIpKSk7cy5GKCk7KUMuTm0uaShxLFUuUmoocy5nbCgpKSkKcmV0dXJuIG5ldyBVLnlEKHIs
+cSl9LApSajpmdW5jdGlvbihhKXt2YXIgcyxyPUouVTYoYSkscT1ILmgoci5xKGEsImRlc2NyaXB0aW9u
+IikpLHA9SC5oKHIucShhLCJmdW5jdGlvbiIpKSxvPXIucShhLCJsaW5rIikKaWYobz09bnVsbClvPW51
+bGwKZWxzZXtzPUouVTYobykKbz1uZXcgVS5NbChILmgocy5xKG8sImhyZWYiKSksSC51UChzLnEobywi
+bGluZSIpKSxILmgocy5xKG8sInBhdGgiKSkpfXI9dC5mSy5hKHIucShhLCJoaW50QWN0aW9ucyIpKQpy
+PXI9PW51bGw/bnVsbDpKLk0xKHIsbmV3IFUuYU4oKSx0LmFYKQpyPXI9PW51bGw/bnVsbDpyLmJyKDAp
+CnJldHVybiBuZXcgVS53YihxLHAsbyxyPT1udWxsP0MuZG46cil9LApkMjpmdW5jdGlvbiBkMihhLGIs
+YyxkLGUsZil7dmFyIF89dGhpcwpfLmE9YQpfLmI9YgpfLmM9YwpfLmQ9ZApfLmU9ZQpfLmY9Zn0sClNl
+OmZ1bmN0aW9uIFNlKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApNbDpmdW5jdGlvbiBNbChhLGIsYyl7
+dGhpcy5hPWEKdGhpcy5iPWIKdGhpcy5jPWN9LAp5RDpmdW5jdGlvbiB5RChhLGIpe3RoaXMuYT1hCnRo
+aXMuYj1ifSwKd2I6ZnVuY3Rpb24gd2IoYSxiLGMsZCl7dmFyIF89dGhpcwpfLmE9YQpfLmI9YgpfLmM9
+YwpfLmQ9ZH0sCmFOOmZ1bmN0aW9uIGFOKCl7fSwKYjA6ZnVuY3Rpb24gYjAoKXt9fSxCPXsKd1I6ZnVu
+Y3Rpb24oKXtyZXR1cm4gbmV3IEIucXAoIiIsIiIsIiIsQy5EeCl9LApZZjpmdW5jdGlvbihhKXt2YXIg
+cyxyLHEscCxvLG4sbSxsLGs9SC5oKGEucSgwLCJyZWdpb25zIikpLGo9SC5oKGEucSgwLCJuYXZpZ2F0
+aW9uQ29udGVudCIpKSxpPUguaChhLnEoMCwic291cmNlQ29kZSIpKSxoPVAuRmwodC5YLHQuZF8pCmZv
+cihzPXQudC5hKGEucSgwLCJlZGl0cyIpKSxzPXMuZ1B1KHMpLHM9cy5nbShzKSxyPXQuVSxxPXQuaDQ7
+cy5GKCk7KXtwPXMuZ2woKQpvPXAuYQpuPUguVk0oW10scSkKZm9yKHA9Si5JVChyLmEocC5iKSk7cC5G
+KCk7KXttPXAuZ2woKQpsPUouVTYobSkKQy5ObS5pKG4sbmV3IEIuajgoSC51UChsLnEobSwibGluZSIp
+KSxILmgobC5xKG0sImV4cGxhbmF0aW9uIikpLEgudVAobC5xKG0sIm9mZnNldCIpKSkpfWguWSgwLG8s
+bil9cmV0dXJuIG5ldyBCLnFwKGssaixpLGgpfSwKajg6ZnVuY3Rpb24gajgoYSxiLGMpe3RoaXMuYT1h
+CnRoaXMuYj1iCnRoaXMuYz1jfSwKcXA6ZnVuY3Rpb24gcXAoYSxiLGMsZCl7dmFyIF89dGhpcwpfLmE9
+YQpfLmI9YgpfLmM9YwpfLmQ9ZH0sCmZ2OmZ1bmN0aW9uIGZ2KCl7fSwKT1M6ZnVuY3Rpb24oYSl7dmFy
+IHMKaWYoIShhPj02NSYmYTw9OTApKXM9YT49OTcmJmE8PTEyMgplbHNlIHM9ITAKcmV0dXJuIHN9LApZ
+dTpmdW5jdGlvbihhLGIpe3ZhciBzPWEubGVuZ3RoLHI9YisyCmlmKHM8cilyZXR1cm4hMQppZighQi5P
+UyhDLnhCLk8yKGEsYikpKXJldHVybiExCmlmKEMueEIuTzIoYSxiKzEpIT09NTgpcmV0dXJuITEKaWYo
+cz09PXIpcmV0dXJuITAKcmV0dXJuIEMueEIuTzIoYSxyKT09PTQ3fX0sVD17bVE6ZnVuY3Rpb24gbVEo
 KXt9fSxMPXsKSXE6ZnVuY3Rpb24oKXtDLkJaLkIoZG9jdW1lbnQsIkRPTUNvbnRlbnRMb2FkZWQiLG5l
 dyBMLmUoKSkKQy5vbC5CKHdpbmRvdywicG9wc3RhdGUiLG5ldyBMLkwoKSl9LAprejpmdW5jdGlvbihh
 KXt2YXIgcyxyPXQuZy5hKGEucGFyZW50Tm9kZSkucXVlcnlTZWxlY3RvcigiOnNjb3BlID4gdWwiKSxx
@@ -9161,7 +9161,7 @@
 PUoucUYoYSkKcD1xLiR0aQpzPXAuQygifigxKT8iKS5hKG5ldyBMLld4KHIsYSkpCnQuWi5hKG51bGwp
 ClcuSkUocS5hLHEuYixzLCExLHAuYyl9LAp5WDpmdW5jdGlvbihhLGIpe3ZhciBzLHIscSxwLG8sbixt
 PSJxdWVyeVNlbGVjdG9yQWxsIixsPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYSksaz10LmcKbC50b1N0
-cmluZwpzPXQuaApILkRoKGsscywiVCIsbSkKcj10LlIKcT1uZXcgVy53eihsLnF1ZXJ5U2VsZWN0b3JB
+cmluZwpzPXQuaApILkRoKGsscywiVCIsbSkKcj10LlcKcT1uZXcgVy53eihsLnF1ZXJ5U2VsZWN0b3JB
 bGwoIi5uYXYtbGluayIpLHIpCnEuSyhxLG5ldyBMLkFPKGIpKQpILkRoKGsscywiVCIsbSkKcD1uZXcg
 Vy53eihsLnF1ZXJ5U2VsZWN0b3JBbGwoIi5yZWdpb24iKSxyKQppZighcC5nbDAocCkpe289bC5xdWVy
 eVNlbGVjdG9yKCJ0YWJsZVtkYXRhLXBhdGhdIikKby50b1N0cmluZwpwLksocCxuZXcgTC5IbyhvLmdl
@@ -9189,2509 +9189,2513 @@
 UC5oSyhhKS5naFkoKS5xKDAsImxpbmUiKQpyZXR1cm4gcz09bnVsbD9udWxsOkguSHAocyxudWxsKX0s
 Ckc2OmZ1bmN0aW9uKGEpe3ZhciBzPVAuaEsoYSkuZ2hZKCkucSgwLCJvZmZzZXQiKQpyZXR1cm4gcz09
 bnVsbD9udWxsOkguSHAocyxudWxsKX0sCmk2OmZ1bmN0aW9uKGEpe3JldHVybiBMLm5XKHQuTy5hKGEp
-KX0sCm5XOmZ1bmN0aW9uKGEpe3ZhciBzPTAscj1QLkZYKHQueikscT0xLHAsbz1bXSxuLG0sbCxrLGoK
-dmFyICRhc3luYyRpNj1QLmx6KGZ1bmN0aW9uKGIsYyl7aWYoYj09PTEpe3A9YwpzPXF9d2hpbGUodHJ1
-ZSlzd2l0Y2gocyl7Y2FzZSAwOms9dC5nLmEoVy5xYyhhLmN1cnJlbnRUYXJnZXQpKS5nZXRBdHRyaWJ1
-dGUoImhyZWYiKQphLnByZXZlbnREZWZhdWx0KCkKcT0zCnM9NgpyZXR1cm4gUC5qUShMLnR5KGssbnVs
-bCksJGFzeW5jJGk2KQpjYXNlIDY6dC5iWi5hKEouR3IoVy5Qdihkb2N1bWVudC5kZWZhdWx0Vmlldykp
-KS5yZWxvYWQoKQpxPTEKcz01CmJyZWFrCmNhc2UgMzpxPTIKaj1wCm49SC5SdShqKQptPUgudHMoaikK
-TC5DMigiQ291bGQgbm90IGFkZC9yZW1vdmUgaGludCIsbixtKQpzPTUKYnJlYWsKY2FzZSAyOnM9MQpi
-cmVhawpjYXNlIDU6cmV0dXJuIFAueUMobnVsbCxyKQpjYXNlIDE6cmV0dXJuIFAuZjMocCxyKX19KQpy
-ZXR1cm4gUC5ESSgkYXN5bmMkaTYscil9LApLMDpmdW5jdGlvbihhKXt2YXIgcyxyLHEscD1kb2N1bWVu
-dC5xdWVyeVNlbGVjdG9yKCIucG9wdXAtcGFuZSIpCnAucXVlcnlTZWxlY3RvcigiaDIiKS5pbm5lclRl
-eHQ9IkZhaWxlZCB0byByZXJ1biBmcm9tIHNvdXJjZXMiCnAucXVlcnlTZWxlY3RvcigicCIpLmlubmVy
-VGV4dD0iU291cmNlcyBjb250YWluIHN0YXRpYyBhbmFseXNpcyBlcnJvcnM6IgpzPXAucXVlcnlTZWxl
-Y3RvcigicHJlIikKcj1KLkVsKGEsdC5hdykKcT1ILkxoKHIpCnMuaW5uZXJUZXh0PW5ldyBILmxKKHIs
-cS5DKCJxVSoobEQuRSkiKS5hKG5ldyBMLnVlKCkpLHEuQygibEo8bEQuRSxxVSo+IikpLkgoMCwiXG4i
-KQpxPXAucXVlcnlTZWxlY3RvcigiYS5ib3R0b20iKS5zdHlsZQpxLmRpc3BsYXk9Im5vbmUiCnM9cC5z
-dHlsZQpzLmRpc3BsYXk9ImluaXRpYWwifSwKQzI6ZnVuY3Rpb24oYSxiLGMpe3ZhciBzLHIscSxwPSJl
-eGNlcHRpb24iLG89InN0YWNrVHJhY2UiLG49dC50LmIoYikmJkouUk0oYi5xKDAsInN1Y2Nlc3MiKSwh
-MSkmJmIueDQocCkmJmIueDQobyksbT1KLmlhKGIpCmlmKG4pe3M9SC5oKG0ucShiLHApKQpjPW0ucShi
-LG8pfWVsc2Ugcz1tLncoYikKbj1kb2N1bWVudApyPW4ucXVlcnlTZWxlY3RvcigiLnBvcHVwLXBhbmUi
-KQpyLnF1ZXJ5U2VsZWN0b3IoImgyIikuaW5uZXJUZXh0PWEKci5xdWVyeVNlbGVjdG9yKCJwIikuaW5u
-ZXJUZXh0PXMKci5xdWVyeVNlbGVjdG9yKCJwcmUiKS5pbm5lclRleHQ9Si5qKGMpCnE9dC5kZC5hKHIu
-cXVlcnlTZWxlY3RvcigiYS5ib3R0b20iKSkKbT10Llg7KHEmJkMueG4pLnNMVShxLFAuWGQoImh0dHBz
-IiwiZ2l0aHViLmNvbSIsImRhcnQtbGFuZy9zZGsvaXNzdWVzL25ldyIsUC5FRihbInRpdGxlIiwiQ3Vz
-dG9tZXItcmVwb3J0ZWQgaXNzdWUgd2l0aCBOTkJEIG1pZ3JhdGlvbiB0b29sOiAiK2EsImxhYmVscyIs
-dS5kLCJib2R5IixhKyJcblxuRXJyb3I6ICIrSC5FaihzKSsiXG5cblBsZWFzZSBmaWxsIGluIHRoZSBm
-b2xsb3dpbmc6XG5cbioqTmFtZSBvZiBwYWNrYWdlIGJlaW5nIG1pZ3JhdGVkIChpZiBwdWJsaWMpKio6
-XG4qKldoYXQgSSB3YXMgZG9pbmcgd2hlbiB0aGlzIGlzc3VlIG9jY3VycmVkKio6XG4qKklzIGl0IHBv
-c3NpYmxlIHRvIHdvcmsgYXJvdW5kIHRoaXMgaXNzdWUqKjpcbioqSGFzIHRoaXMgaXNzdWUgaGFwcGVu
-ZWQgYmVmb3JlLCBhbmQgaWYgc28sIGhvdyBvZnRlbioqOlxuKipEYXJ0IFNESyB2ZXJzaW9uKio6ICIr
-SC5FaihuLmdldEVsZW1lbnRCeUlkKCJzZGstdmVyc2lvbiIpLnRleHRDb250ZW50KSsiXG4qKkFkZGl0
-aW9uYWwgZGV0YWlscyoqOlxuXG5UaGFua3MgZm9yIGZpbGluZyFcblxuU3RhY2t0cmFjZTogX2F1dG8g
-cG9wdWxhdGVkIGJ5IG1pZ3JhdGlvbiBwcmV2aWV3IHRvb2wuX1xuXG5gYGBcbiIrSC5FaihjKSsiXG5g
-YGBcbiJdLG0sbSkpLmduRCgpKQptPXEuc3R5bGUKbS5kaXNwbGF5PSJpbml0aWFsIgpuPXIuc3R5bGUK
-bi5kaXNwbGF5PSJpbml0aWFsIgpuPWErIjogIitILkVqKGIpCndpbmRvdwppZih0eXBlb2YgY29uc29s
-ZSE9InVuZGVmaW5lZCIpd2luZG93LmNvbnNvbGUuZXJyb3IobikKd2luZG93Cm49SC5FaihjKQppZih0
-eXBlb2YgY29uc29sZSE9InVuZGVmaW5lZCIpd2luZG93LmNvbnNvbGUuZXJyb3Iobil9LApVczpmdW5j
-dGlvbihhKXtyZXR1cm4gSi5VNihhKS50ZyhhLCI/Iik/Qy54Qi5OaihhLDAsQy54Qi5PWShhLCI/Iikp
-OmF9LAp0MjpmdW5jdGlvbihhLGIsYyl7dmFyIHMscixxLHAsbz10LmcuYShXLnFjKGEuY3VycmVudFRh
-cmdldCkpCmEucHJldmVudERlZmF1bHQoKQpzPW8uZ2V0QXR0cmlidXRlKCJocmVmIikKcj1MLlVzKHMp
-CnE9TC5HNihzKQpwPUwuYUsocykKaWYocSE9bnVsbClMLmFmKHIscSxwLGIsbmV3IEwublQocixxLHAp
-KQplbHNlIEwuYWYocixudWxsLG51bGwsYixuZXcgTC5OWShyKSl9LAp2VTpmdW5jdGlvbigpe3ZhciBz
-PWRvY3VtZW50CkguRGgodC5nLHQuaCwiVCIsInF1ZXJ5U2VsZWN0b3JBbGwiKQpzPW5ldyBXLnd6KHMu
-cXVlcnlTZWxlY3RvckFsbCgiLmNvZGUiKSx0LlIpCnMuSyhzLG5ldyBMLmVYKCkpfSwKaFg6ZnVuY3Rp
-b24oYSxiLGMpe3JldHVybiBMLll3KGEsYixjKX0sCll3OmZ1bmN0aW9uKGEsYixjKXt2YXIgcz0wLHI9
-UC5GWCh0LnopLHE9MSxwLG89W10sbixtLGwsayxqLGksaCxnCnZhciAkYXN5bmMkaFg9UC5seihmdW5j
-dGlvbihkLGUpe2lmKGQ9PT0xKXtwPWUKcz1xfXdoaWxlKHRydWUpc3dpdGNoKHMpe2Nhc2UgMDpxPTMK
-aj10LlgKcz02CnJldHVybiBQLmpRKEwuUTYoYSxQLkVGKFsicmVnaW9uIiwicmVnaW9uIiwib2Zmc2V0
-IixILkVqKGIpXSxqLGopLHQudCksJGFzeW5jJGhYKQpjYXNlIDY6bj1lCmo9bgppPUouVTYoaikKbT1u
-ZXcgVS5kMihVLmpmKGkucShqLCJlZGl0cyIpKSxILmgoaS5xKGosImV4cGxhbmF0aW9uIikpLEgudVAo
-aS5xKGosImxpbmUiKSksSC5oKGkucShqLCJkaXNwbGF5UGF0aCIpKSxILmgoaS5xKGosInVyaVBhdGgi
-KSksVS5OZChpLnEoaiwidHJhY2VzIikpKQpMLlQxKG0pCkwuRnIoYSxiLGMpCkwueVgoIi5lZGl0LXBh
-bmVsIC5wYW5lbC1jb250ZW50IiwhMSkKcT0xCnM9NQpicmVhawpjYXNlIDM6cT0yCmc9cApsPUguUnUo
-ZykKaz1ILnRzKGcpCkwuQzIoIkNvdWxkIG5vdCBsb2FkIGVkaXQgZGV0YWlscyIsbCxrKQpzPTUKYnJl
-YWsKY2FzZSAyOnM9MQpicmVhawpjYXNlIDU6cmV0dXJuIFAueUMobnVsbCxyKQpjYXNlIDE6cmV0dXJu
-IFAuZjMocCxyKX19KQpyZXR1cm4gUC5ESSgkYXN5bmMkaFgscil9LApHNzpmdW5jdGlvbihhLGIsYyxk
-LGUpe3JldHVybiBMLkw1KGEsYixjLGQsZSl9LApMNTpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBzPTAs
-cj1QLkZYKHQueikscSxwPTIsbyxuPVtdLG0sbCxrLGosaSxoLGcKdmFyICRhc3luYyRHNz1QLmx6KGZ1
-bmN0aW9uKGYsYTApe2lmKGY9PT0xKXtvPWEwCnM9cH13aGlsZSh0cnVlKXN3aXRjaChzKXtjYXNlIDA6
-aWYoIUoucDQoYSwiLmRhcnQiKSl7TC5CRShhLEIud1IoKSxkKQpMLkJYKGEsbnVsbCkKaWYoZSE9bnVs
-bCllLiQwKCkKcz0xCmJyZWFrfXA9NAppPXQuWApzPTcKcmV0dXJuIFAualEoTC5RNihhLFAuRUYoWyJp
-bmxpbmUiLCJ0cnVlIl0saSxpKSx0LnQpLCRhc3luYyRHNykKY2FzZSA3Om09YTAKTC5CRShhLEIuWWYo
-bSksZCkKTC5mRyhiLGMpCmw9TC5VcyhhKQpMLkJYKGwsYikKaWYoZSE9bnVsbCllLiQwKCkKcD0yCnM9
-NgpicmVhawpjYXNlIDQ6cD0zCmc9bwprPUguUnUoZykKaj1ILnRzKGcpCkwuQzIoIkNvdWxkIG5vdCBs
-b2FkIGRhcnQgZmlsZSAiK2EsayxqKQpzPTYKYnJlYWsKY2FzZSAzOnM9MgpicmVhawpjYXNlIDY6Y2Fz
-ZSAxOnJldHVybiBQLnlDKHEscikKY2FzZSAyOnJldHVybiBQLmYzKG8scil9fSkKcmV0dXJuIFAuREko
-JGFzeW5jJEc3LHIpfSwKR2U6ZnVuY3Rpb24oKXt2YXIgcz0wLHI9UC5GWCh0LnopLHE9MSxwLG89W10s
-bixtLGwsayxqLGksaAp2YXIgJGFzeW5jJEdlPVAubHooZnVuY3Rpb24oYSxiKXtpZihhPT09MSl7cD1i
-CnM9cX13aGlsZSh0cnVlKXN3aXRjaChzKXtjYXNlIDA6aT0iL19wcmV2aWV3L25hdmlnYXRpb25UcmVl
-Lmpzb24iCnE9MwpzPTYKcmV0dXJuIFAualEoTC5RNihpLEMuQ00sdC5tKSwkYXN5bmMkR2UpCmNhc2Ug
-NjpuPWIKbT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIubmF2LXRyZWUiKQpKLmw1KG0sIiIpCkwudFgo
-bSxMLm1LKG4pKQpxPTEKcz01CmJyZWFrCmNhc2UgMzpxPTIKaD1wCmw9SC5SdShoKQprPUgudHMoaCkK
-TC5DMigiQ291bGQgbm90IGxvYWQgbmF2aWdhdGlvbiB0cmVlIixsLGspCnM9NQpicmVhawpjYXNlIDI6
-cz0xCmJyZWFrCmNhc2UgNTpyZXR1cm4gUC55QyhudWxsLHIpCmNhc2UgMTpyZXR1cm4gUC5mMyhwLHIp
-fX0pCnJldHVybiBQLkRJKCRhc3luYyRHZSxyKX0sCnFPOmZ1bmN0aW9uKGEpe3ZhciBzLHI9YS5nZXRC
-b3VuZGluZ0NsaWVudFJlY3QoKSxxPUMuQ0QuelEoJC5maSgpLm9mZnNldEhlaWdodCkscD13aW5kb3cu
-aW5uZXJIZWlnaHQsbz1DLkNELnpRKCQuRFcoKS5vZmZzZXRIZWlnaHQpCmlmKHR5cGVvZiBwIT09Im51
-bWJlciIpcmV0dXJuIHAuSE4oKQpzPXIuYm90dG9tCnMudG9TdHJpbmcKaWYocz5wLShvKzE0KSlKLmRo
-KGEpCmVsc2V7cD1yLnRvcApwLnRvU3RyaW5nCmlmKHA8cSsxNClKLmRoKGEpfX0sCmZHOmZ1bmN0aW9u
-KGEsYil7dmFyIHMscixxLHAsbwppZihhIT1udWxsKXtzPWRvY3VtZW50CnI9cy5nZXRFbGVtZW50QnlJ
-ZCgibyIrSC5FaihhKSkKcT1zLnF1ZXJ5U2VsZWN0b3IoIi5saW5lLSIrSC5FaihiKSkKaWYociE9bnVs
-bCl7TC5xTyhyKQpKLmRSKHIpLmkoMCwidGFyZ2V0Iil9ZWxzZSBpZihxIT1udWxsKUwucU8ocS5wYXJl
-bnRFbGVtZW50KQppZihxIT1udWxsKUouZFIodC5nLmEocS5wYXJlbnROb2RlKSkuaSgwLCJoaWdobGln
-aHQiKX1lbHNle3M9ZG9jdW1lbnQKcD10LmcKSC5EaChwLHQuaCwiVCIsInF1ZXJ5U2VsZWN0b3JBbGwi
-KQpzPXMucXVlcnlTZWxlY3RvckFsbCgiLmxpbmUtbm8iKQpvPW5ldyBXLnd6KHMsdC5SKQppZihvLmdB
-KG8pPT09MClyZXR1cm4KTC5xTyhwLmEoQy50NS5ndEgocykpKX19LAphZjpmdW5jdGlvbihhLGIsYyxk
-LGUpe3ZhciBzLHIscT1MLkc2KHdpbmRvdy5sb2NhdGlvbi5ocmVmKSxwPUwuYUsod2luZG93LmxvY2F0
-aW9uLmhyZWYpCmlmKHEhPW51bGwpe3M9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm8iK0guRWoocSkp
-CmlmKHMhPW51bGwpSi5kUihzKS5SKDAsInRhcmdldCIpfWlmKHAhPW51bGwpe3I9ZG9jdW1lbnQucXVl
-cnlTZWxlY3RvcigiLmxpbmUtIitILkVqKHApKQppZihyIT1udWxsKUouZFIoci5wYXJlbnRFbGVtZW50
-KS5SKDAsImhpZ2hsaWdodCIpfWlmKGE9PXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSl7TC5mRyhiLGMp
-CmUuJDAoKX1lbHNlIEwuRzcoYSxiLGMsZCxlKX0sClE0OmZ1bmN0aW9uKGEsYil7dmFyIHMscixxPVAu
-aEsoYSkscD10LlgKcD1QLkZsKHAscCkKZm9yKHM9cS5naFkoKSxzPXMuZ1B1KHMpLHM9cy5na3oocyk7
-cy5GKCk7KXtyPXMuZ2woKQpwLlkoMCxyLmEsci5iKX1mb3Iocz1iLmdQdShiKSxzPXMuZ2t6KHMpO3Mu
-RigpOyl7cj1zLmdsKCkKcC5ZKDAsci5hLHIuYil9cC5ZKDAsImF1dGhUb2tlbiIsJC5VRSgpKQpyZXR1
-cm4gcS5ubSgwLHApLmduRCgpfSwKVDE6ZnVuY3Rpb24oYSl7dmFyIHMscixxLHAsbyxuLG0sbCxrLGo9
-JC5oTCgpCkoubDUoaiwiIikKaWYoYT09bnVsbCl7cz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJwIikK
-Qy5MdC5zYTQocywiU2VlIGRldGFpbHMgYWJvdXQgYSBwcm9wb3NlZCBlZGl0LiIpCkMuTHQuc0QocyxI
-LlZNKFsicGxhY2Vob2xkZXIiXSx0LmkpKQpqLmFwcGVuZENoaWxkKHMpCkMuTHQuRkYocykKcmV0dXJu
-fXI9YS5kCnE9JC5uVSgpCnA9cS56ZihyKQpvPWEuYgpuPWRvY3VtZW50Cm09cS5IUChyLEouVDAobi5x
-dWVyeVNlbGVjdG9yKCIucm9vdCIpLnRleHRDb250ZW50KSkKbD1hLmMKaz1uLmNyZWF0ZUVsZW1lbnQo
-InAiKQpqLmFwcGVuZENoaWxkKGspCmsuYXBwZW5kQ2hpbGQobi5jcmVhdGVUZXh0Tm9kZShILkVqKG8p
-KyIgYXQgIikpCnE9dC5YCnE9Vy5KNihMLlE0KGEuZSxQLkVGKFsibGluZSIsSi5qKGwpXSxxLHEpKSkK
-cS5hcHBlbmRDaGlsZChuLmNyZWF0ZVRleHROb2RlKEguRWoobSkrIjoiK0guRWoobCkrIi4iKSkKay5h
-cHBlbmRDaGlsZChxKQpKLmRoKGspCkwuQ0MoYSxqLHApCkwuRnooYSxqKX0sCkxIOmZ1bmN0aW9uKGEs
-YixjKXt2YXIgcyxyLHEscCxvLG4sbSxsLGssaixpLGgsZyxmLGU9JC55UCgpCkoubDUoZSwiIikKaWYo
-Yi5nQShiKT09PTApe3M9ZG9jdW1lbnQKcj1zLmNyZWF0ZUVsZW1lbnQoInAiKQplLmFwcGVuZENoaWxk
-KHIpCnIuYXBwZW5kQ2hpbGQocy5jcmVhdGVUZXh0Tm9kZSgiTm8gcHJvcG9zZWQgZWRpdHMiKSl9ZWxz
-ZSBmb3IoZT1iLmdQdShiKSxlPWUuZ2t6KGUpLHM9dC5YLHE9dC5rLHA9cS5DKCJ+KDEpPyIpLG89dC5a
-LHE9cS5jO2UuRigpOyl7bj1lLmdsKCkKbT1kb2N1bWVudApyPW0uY3JlYXRlRWxlbWVudCgicCIpCmw9
-JC55UCgpCmwuYXBwZW5kQ2hpbGQocikKci5hcHBlbmRDaGlsZChtLmNyZWF0ZVRleHROb2RlKEguRWoo
-bi5hKSsiOiIpKQprPW0uY3JlYXRlRWxlbWVudCgidWwiKQpsLmFwcGVuZENoaWxkKGspCmZvcihuPUou
-SVQobi5iKTtuLkYoKTspe2w9bi5nbCgpCmo9bS5jcmVhdGVFbGVtZW50KCJsaSIpCmsuYXBwZW5kQ2hp
-bGQoaikKSi5kUihqKS5pKDAsImVkaXQiKQppPW0uY3JlYXRlRWxlbWVudCgiYSIpCmouYXBwZW5kQ2hp
-bGQoaSkKaS5jbGFzc0xpc3QuYWRkKCJlZGl0LWxpbmsiKQpoPWwuYwpnPUguRWooaCkKaS5zZXRBdHRy
-aWJ1dGUoImRhdGEtIituZXcgVy5TeShuZXcgVy5pNyhpKSkuTygib2Zmc2V0IiksZykKZj1sLmEKZz1I
-LkVqKGYpCmkuc2V0QXR0cmlidXRlKCJkYXRhLSIrbmV3IFcuU3kobmV3IFcuaTcoaSkpLk8oImxpbmUi
-KSxnKQppLmFwcGVuZENoaWxkKG0uY3JlYXRlVGV4dE5vZGUoImxpbmUgIitILkVqKGYpKSkKaS5zZXRB
-dHRyaWJ1dGUoImhyZWYiLEwuUTQod2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLFAuRUYoWyJsaW5lIixI
-LkVqKGYpLCJvZmZzZXQiLEguRWooaCldLHMscykpKQpnPXAuYShuZXcgTC5FRShoLGYsYSkpCm8uYShu
-dWxsKQpXLkpFKGksImNsaWNrIixnLCExLHEpCmouYXBwZW5kQ2hpbGQobS5jcmVhdGVUZXh0Tm9kZSgi
-OiAiK0guRWoobC5iKSkpfX1pZihjKUwuVDEobnVsbCl9LApGcjpmdW5jdGlvbihhLGIsYyl7dmFyIHMs
-cixxPXdpbmRvdy5sb2NhdGlvbixwPVAuaEsoKHEmJkMuRXgpLmdEcihxKStILkVqKGEpKQpxPXQuWApx
-PVAuRmwocSxxKQppZihiIT1udWxsKXEuWSgwLCJvZmZzZXQiLEguRWooYikpCmlmKGMhPW51bGwpcS5Z
-KDAsImxpbmUiLEguRWooYykpCnEuWSgwLCJhdXRoVG9rZW4iLCQuVUUoKSkKcD1wLm5tKDAscSkKcT13
-aW5kb3cuaGlzdG9yeQpzPXQuegpyPXAuZ25EKCkKcS50b1N0cmluZwpxLnB1c2hTdGF0ZShuZXcgUC5C
-ZihbXSxbXSkuUHYoUC5GbChzLHMpKSwiIixyKX0sCkVuOmZ1bmN0aW9uKGEpe3ZhciBzPUouYmIoZG9j
-dW1lbnQucXVlcnlTZWxlY3RvcigiLnJvb3QiKS50ZXh0Q29udGVudCwiLyIpCmlmKEMueEIubihhLHMp
-KXJldHVybiBDLnhCLkcoYSxzLmxlbmd0aCkKZWxzZSByZXR1cm4gYX0sCkJYOmZ1bmN0aW9uKGEsYil7
-dmFyIHMscj17fQpyLmE9YQphPUwuRW4oYSkKci5hPWEKSi5kcigkLkQ5KCksYSkKcz1kb2N1bWVudApI
-LkRoKHQuZyx0LmgsIlQiLCJxdWVyeVNlbGVjdG9yQWxsIikKcz1uZXcgVy53eihzLnF1ZXJ5U2VsZWN0
-b3JBbGwoIi5uYXYtcGFuZWwgLm5hdi1saW5rIiksdC5SKQpzLksocyxuZXcgTC5WUyhyKSl9LApCRTpm
-dW5jdGlvbihhLGIsYyl7dmFyIHM9Ii5yZWdpb25zIixyPWRvY3VtZW50LHE9ci5xdWVyeVNlbGVjdG9y
-KHMpLHA9ci5xdWVyeVNlbGVjdG9yKCIuY29kZSIpCkoudEgocSxiLmEsJC5LRygpKQpKLnRIKHAsYi5i
-LCQuS0coKSkKTC5MSChhLGIuZCxjKQpMLnZVKCkKTC55WCgiLmNvZGUiLCEwKQpMLnlYKHMsITApfSwK
-dFg6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyLHEscCxvLG4sbSxsLGssaixpLGgsZyxmLGU9ZG9jdW1lbnQs
-ZD1lLmNyZWF0ZUVsZW1lbnQoInVsIikKYS5hcHBlbmRDaGlsZChkKQpmb3Iocz1iLmxlbmd0aCxyPXQu
-WCxxPXQuWixwPTA7cDxiLmxlbmd0aDtiLmxlbmd0aD09PXN8fCgwLEgubGspKGIpLCsrcCl7bz1iW3Bd
-Cm49ZS5jcmVhdGVFbGVtZW50KCJsaSIpCmQuYXBwZW5kQ2hpbGQobikKbT1KLllFKG4pCmlmKG8uYT09
-PUMuWTIpe20uZ0QobikuaSgwLCJkaXIiKQpsPWUuY3JlYXRlRWxlbWVudCgic3BhbiIpCm4uYXBwZW5k
-Q2hpbGQobCkKbT1KLllFKGwpCm0uZ0QobCkuaSgwLCJhcnJvdyIpCm0uc2hmKGwsIiYjeDI1QkM7IikK
-az1lLmNyZWF0ZUVsZW1lbnQoInNwYW4iKQpuLmFwcGVuZENoaWxkKGspCkoubDUoaywnPHNwYW4gY2xh
-c3M9Im1hdGVyaWFsLWljb25zIj5mb2xkZXJfb3Blbjwvc3Bhbj4nKQpuLmFwcGVuZENoaWxkKGUuY3Jl
-YXRlVGV4dE5vZGUoby5iKSkKTC50WChuLG8uYykKTC5reihsKX1lbHNle20uc2hmKG4sJzxzcGFuIGNs
-YXNzPSJtYXRlcmlhbC1pY29ucyI+aW5zZXJ0X2RyaXZlX2ZpbGU8L3NwYW4+JykKaj1lLmNyZWF0ZUVs
-ZW1lbnQoImEiKQpuLmFwcGVuZENoaWxkKGopCm09Si5ZRShqKQptLmdEKGopLmkoMCwibmF2LWxpbmsi
-KQpqLnNldEF0dHJpYnV0ZSgiZGF0YS0iK25ldyBXLlN5KG5ldyBXLmk3KGopKS5PKCJuYW1lIiksby5k
-KQpqLnNldEF0dHJpYnV0ZSgiaHJlZiIsTC5RNChvLmUsUC5GbChyLHIpKSkKai5hcHBlbmRDaGlsZChl
-LmNyZWF0ZVRleHROb2RlKG8uYikpCm09bS5nVmwoaikKaT1tLiR0aQpoPWkuQygifigxKT8iKS5hKG5l
-dyBMLlREKCkpCnEuYShudWxsKQpXLkpFKG0uYSxtLmIsaCwhMSxpLmMpCmc9by5mCmlmKHR5cGVvZiBn
-IT09Im51bWJlciIpcmV0dXJuIGcub3MoKQppZihnPjApe2Y9ZS5jcmVhdGVFbGVtZW50KCJzcGFuIikK
-bi5hcHBlbmRDaGlsZChmKQpKLmRSKGYpLmkoMCwiZWRpdC1jb3VudCIpCm09IiIrZysiICIKaWYoZz09
-PTEpaT0iZWRpdCIKZWxzZSBpPSJlZGl0cyIKZi5zZXRBdHRyaWJ1dGUoInRpdGxlIixtK2kpCmYuYXBw
-ZW5kQ2hpbGQoZS5jcmVhdGVUZXh0Tm9kZShDLmpuLncoZykpKX19fX0sCkZ6OmZ1bmN0aW9uKGEsYil7
-dmFyIHMscixxLHAsbyxuLG0sbCxrLGosaSxoPWEuYQppZihoPT1udWxsKXJldHVybgpzPWRvY3VtZW50
-CnI9cy5jcmVhdGVFbGVtZW50KCJwIikKcT1iLmFwcGVuZENoaWxkKHIpCnI9cy5jcmVhdGVFbGVtZW50
-KCJzcGFuIikKcD10LmkKSi5NdShyLEguVk0oWyJ0eXBlLWRlc2NyaXB0aW9uIl0scCkpCnIuYXBwZW5k
-Q2hpbGQocy5jcmVhdGVUZXh0Tm9kZSgiQWN0aW9ucyIpKQpxLmFwcGVuZENoaWxkKHIpCnEuYXBwZW5k
-Q2hpbGQocy5jcmVhdGVUZXh0Tm9kZSgiOiIpKQpvPXMuY3JlYXRlRWxlbWVudCgicCIpCmIuYXBwZW5k
-Q2hpbGQobykKZm9yKHI9aC5sZW5ndGgsbj10LlEsbT0wO208aC5sZW5ndGg7aC5sZW5ndGg9PT1yfHwo
-MCxILmxrKShoKSwrK20pe2w9aFttXQprPXMuY3JlYXRlRWxlbWVudCgiYSIpCm8uYXBwZW5kQ2hpbGQo
-aykKay5hcHBlbmRDaGlsZChzLmNyZWF0ZVRleHROb2RlKGwuYSkpCmsuc2V0QXR0cmlidXRlKCJocmVm
-IixsLmIpCmo9bi5hKEguVk0oWyJhZGQtaGludC1saW5rIiwiYmVmb3JlLWFwcGx5IiwiYnV0dG9uIl0s
-cCkpCmk9Si5kUihrKQppLlYxKDApCmkuRlYoMCxqKX19LApDQzpmdW5jdGlvbihhOSxiMCxiMSl7dmFy
-IHMscixxLHAsbyxuLG0sbCxrLGosaSxoLGcsZixlLGQsYyxiLGEsYTAsYTEsYTIsYTMsYTQsYTUsYTYs
-YTcsYTgKZm9yKHM9YTkuZixyPXMubGVuZ3RoLHE9dC5pLHA9dC5RLG89dC5rLG49by5DKCJ+KDEpPyIp
-LG09dC5aLG89by5jLGw9MDtsPHMubGVuZ3RoO3MubGVuZ3RoPT09cnx8KDAsSC5saykocyksKytsKXtr
-PXNbbF0Kaj1kb2N1bWVudAppPWouY3JlYXRlRWxlbWVudCgicCIpCmg9cC5hKEguVk0oWyJ0cmFjZSJd
-LHEpKQpnPUouZFIoaSkKZy5WMSgwKQpnLkZWKDAsaCkKZj1iMC5hcHBlbmRDaGlsZChpKQppPWouY3Jl
-YXRlRWxlbWVudCgic3BhbiIpCmg9cC5hKEguVk0oWyJ0eXBlLWRlc2NyaXB0aW9uIl0scSkpCmc9Si5k
-UihpKQpnLlYxKDApCmcuRlYoMCxoKQppLmFwcGVuZENoaWxkKGouY3JlYXRlVGV4dE5vZGUoay5hKSkK
-Zi5hcHBlbmRDaGlsZChpKQpmLmFwcGVuZENoaWxkKGouY3JlYXRlVGV4dE5vZGUoIjoiKSkKaT1qLmNy
-ZWF0ZUVsZW1lbnQoInVsIikKaD1wLmEoSC5WTShbInRyYWNlIl0scSkpCmc9Si5kUihpKQpnLlYxKDAp
-CmcuRlYoMCxoKQplPWYuYXBwZW5kQ2hpbGQoaSkKZm9yKGk9ay5iLGg9aS5sZW5ndGgsZD0wO2Q8aS5s
-ZW5ndGg7aS5sZW5ndGg9PT1ofHwoMCxILmxrKShpKSwrK2Qpe2M9aVtkXQpiPWouY3JlYXRlRWxlbWVu
-dCgibGkiKQplLmFwcGVuZENoaWxkKGIpCmE9ai5jcmVhdGVFbGVtZW50KCJzcGFuIikKYTA9cC5hKEgu
-Vk0oWyJmdW5jdGlvbiJdLHEpKQpnPUouZFIoYSkKZy5WMSgwKQpnLkZWKDAsYTApCmEwPWMuYgpMLmtE
-KGEsYTA9PW51bGw/InVua25vd24iOmEwKQpiLmFwcGVuZENoaWxkKGEpCmExPWMuYwppZihhMSE9bnVs
-bCl7Yi5hcHBlbmRDaGlsZChqLmNyZWF0ZVRleHROb2RlKCIgKCIpKQphMj1hMS5iCmEzPWouY3JlYXRl
-RWxlbWVudCgiYSIpCmEzLmFwcGVuZENoaWxkKGouY3JlYXRlVGV4dE5vZGUoSC5FaihhMS5jKSsiOiIr
-SC5FaihhMikpKQphMy5zZXRBdHRyaWJ1dGUoImhyZWYiLGExLmEpCmEzLmNsYXNzTGlzdC5hZGQoIm5h
-di1saW5rIikKYi5hcHBlbmRDaGlsZChhMykKYi5hcHBlbmRDaGlsZChqLmNyZWF0ZVRleHROb2RlKCIp
-IikpfWIuYXBwZW5kQ2hpbGQoai5jcmVhdGVUZXh0Tm9kZSgiOiAiKSkKYT1jLmEKTC5rRChiLGE9PW51
-bGw/InVua25vd24iOmEpCmE9Yy5kCmlmKGEubGVuZ3RoIT09MCl7YTA9ai5jcmVhdGVFbGVtZW50KCJw
-IikKYTQ9cC5hKEguVk0oWyJkcmF3ZXIiLCJiZWZvcmUtYXBwbHkiXSxxKSkKZz1KLmRSKGEwKQpnLlYx
-KDApCmcuRlYoMCxhNCkKYTU9Yi5hcHBlbmRDaGlsZChhMCkKZm9yKGEwPWEubGVuZ3RoLGE2PTA7YTY8
-YS5sZW5ndGg7YS5sZW5ndGg9PT1hMHx8KDAsSC5saykoYSksKythNil7YTc9YVthNl0KYTQ9ai5jcmVh
-dGVFbGVtZW50KCJidXR0b24iKQphOD1uLmEobmV3IEwuQVMoYTcsYTEpKQptLmEobnVsbCkKVy5KRShh
-NCwiY2xpY2siLGE4LCExLG8pCmE0LmFwcGVuZENoaWxkKGouY3JlYXRlVGV4dE5vZGUoTS5PWChhNy5h
-KSkpCmE1LmFwcGVuZENoaWxkKGE0KX19fX19LAprRDpmdW5jdGlvbihhLGIpe3ZhciBzLHIscT1ILlZN
-KGIuc3BsaXQoIi4iKSx0LnMpLHA9Qy5ObS5ndEgocSksbz1kb2N1bWVudAphLmFwcGVuZENoaWxkKG8u
-Y3JlYXRlVGV4dE5vZGUocCkpCmZvcihwPUgucUMocSwxLG51bGwsdC5OKSxwPW5ldyBILmE3KHAscC5n
-QShwKSxwLiR0aS5DKCJhNzxhTC5FPiIpKSxzPUouWUUoYSk7cC5GKCk7KXtyPXAuZApzLm56KGEsImJl
-Zm9yZWVuZCIsIiYjODIwMzsuIixudWxsLG51bGwpCmEuYXBwZW5kQ2hpbGQoby5jcmVhdGVUZXh0Tm9k
-ZShyKSl9fSwKZTpmdW5jdGlvbiBlKCl7fSwKVlc6ZnVuY3Rpb24gVlcoYSxiLGMpe3RoaXMuYT1hCnRo
-aXMuYj1iCnRoaXMuYz1jfSwKb1o6ZnVuY3Rpb24gb1ooKXt9LApqcjpmdW5jdGlvbiBqcigpe30sCnFs
-OmZ1bmN0aW9uIHFsKCl7fSwKSGk6ZnVuY3Rpb24gSGkoKXt9LApCVDpmdW5jdGlvbiBCVCgpe30sClBZ
-OmZ1bmN0aW9uIFBZKCl7fSwKTDpmdW5jdGlvbiBMKCl7fSwKV3g6ZnVuY3Rpb24gV3goYSxiKXt0aGlz
-LmE9YQp0aGlzLmI9Yn0sCkFPOmZ1bmN0aW9uIEFPKGEpe3RoaXMuYT1hfSwKZE46ZnVuY3Rpb24gZE4o
-YSl7dGhpcy5hPWF9LApIbzpmdW5jdGlvbiBIbyhhKXt0aGlzLmE9YX0sCnh6OmZ1bmN0aW9uIHh6KGEs
-Yil7dGhpcy5hPWEKdGhpcy5iPWJ9LApJQzpmdW5jdGlvbiBJQygpe30sCmZDOmZ1bmN0aW9uIGZDKGEs
-Yil7dGhpcy5hPWEKdGhpcy5iPWJ9LAp1ZTpmdW5jdGlvbiB1ZSgpe30sCm5UOmZ1bmN0aW9uIG5UKGEs
-YixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9Y30sCk5ZOmZ1bmN0aW9uIE5ZKGEpe3RoaXMuYT1h
-fSwKZVg6ZnVuY3Rpb24gZVgoKXt9LApFRTpmdW5jdGlvbiBFRShhLGIsYyl7dGhpcy5hPWEKdGhpcy5i
-PWIKdGhpcy5jPWN9LApRTDpmdW5jdGlvbiBRTChhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKVlM6ZnVu
-Y3Rpb24gVlMoYSl7dGhpcy5hPWF9LApURDpmdW5jdGlvbiBURCgpe30sCkFTOmZ1bmN0aW9uIEFTKGEs
-Yil7dGhpcy5hPWEKdGhpcy5iPWJ9LApYQTpmdW5jdGlvbiBYQSgpe30sCm1LOmZ1bmN0aW9uKGEpe3Zh
-ciBzLHIscSxwLG8sbixtPUguVk0oW10sdC5jUSkKZm9yKHM9Si5JVCh0LlUuYShhKSk7cy5GKCk7KXty
-PXMuZ2woKQpxPUouVTYocikKcD1MLnAyKEguaChxLnEociwidHlwZSIpKSkKbz1ILmgocS5xKHIsIm5h
-bWUiKSkKbj1xLnEociwic3VidHJlZSIpCm49bj09bnVsbD9udWxsOkwubUsobikKQy5ObS5pKG0sbmV3
-IEwuWloocCxvLG4sSC5oKHEucShyLCJwYXRoIikpLEguaChxLnEociwiaHJlZiIpKSxILnVQKHEucShy
-LCJlZGl0Q291bnQiKSkpKX1yZXR1cm4gbX0sClZEOmZ1bmN0aW9uKGEpe3ZhciBzLHIscT1ILlZNKFtd
-LHQuRykKZm9yKHM9YS5sZW5ndGgscj0wO3I8YS5sZW5ndGg7YS5sZW5ndGg9PT1zfHwoMCxILmxrKShh
-KSwrK3IpQy5ObS5pKHEsYVtyXS5MdCgpKQpyZXR1cm4gcX0sCnAyOmZ1bmN0aW9uKGEpe3N3aXRjaChh
-KXtjYXNlImRpcmVjdG9yeSI6cmV0dXJuIEMuWTIKY2FzZSJmaWxlIjpyZXR1cm4gQy5yZgpkZWZhdWx0
-OnRocm93IEguYihQLlBWKCJVbnJlY29nbml6ZWQgbmF2aWdhdGlvbiB0cmVlIG5vZGUgdHlwZTogIitI
-LkVqKGEpKSl9fSwKdnk6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgQy5ZMjpyZXR1cm4iZGlyZWN0
-b3J5IgpjYXNlIEMucmY6cmV0dXJuImZpbGUifXRocm93IEguYihQLlBWKCJVbnJlY29nbml6ZWQgbmF2
-aWdhdGlvbiB0cmVlIG5vZGUgdHlwZTogIithLncoMCkpKX0sClpaOmZ1bmN0aW9uIFpaKGEsYixjLGQs
-ZSxmKXt2YXIgXz10aGlzCl8uYT1hCl8uYj1iCl8uYz1jCl8uZD1kCl8uZT1lCl8uZj1mfSwKTzk6ZnVu
-Y3Rpb24gTzkoYSl7dGhpcy5iPWF9LApJVjpmdW5jdGlvbiBJVihhLGIsYyxkKXt2YXIgXz10aGlzCl8u
-ZD1hCl8uZT1iCl8uZj1jCl8ucj1kfX0sWD17CkNMOmZ1bmN0aW9uKGEsYil7dmFyIHMscixxLHAsbyxu
-PWIueFooYSkKYi5oSyhhKQppZihuIT1udWxsKWE9Si5LVihhLG4ubGVuZ3RoKQpzPXQucwpyPUguVk0o
-W10scykKcT1ILlZNKFtdLHMpCnM9YS5sZW5ndGgKaWYocyE9PTAmJmIucjQoQy54Qi5XKGEsMCkpKXtp
-ZigwPj1zKXJldHVybiBILk9IKGEsMCkKQy5ObS5pKHEsYVswXSkKcD0xfWVsc2V7Qy5ObS5pKHEsIiIp
-CnA9MH1mb3Iobz1wO288czsrK28paWYoYi5yNChDLnhCLlcoYSxvKSkpe0MuTm0uaShyLEMueEIuTmoo
-YSxwLG8pKQpDLk5tLmkocSxhW29dKQpwPW8rMX1pZihwPHMpe0MuTm0uaShyLEMueEIuRyhhLHApKQpD
-Lk5tLmkocSwiIil9cmV0dXJuIG5ldyBYLldEKGIsbixyLHEpfSwKV0Q6ZnVuY3Rpb24gV0QoYSxiLGMs
-ZCl7dmFyIF89dGhpcwpfLmE9YQpfLmI9YgpfLmQ9YwpfLmU9ZH0sCkk3OmZ1bmN0aW9uKGEpe3JldHVy
-biBuZXcgWC5kdihhKX0sCmR2OmZ1bmN0aW9uIGR2KGEpe3RoaXMuYT1hfX0sTz17ClJoOmZ1bmN0aW9u
-KCl7dmFyIHMscj1udWxsCmlmKFAudW8oKS5nRmkoKSE9PSJmaWxlIilyZXR1cm4gJC5FYigpCnM9UC51
-bygpCmlmKCFDLnhCLlRjKHMuZ0lpKHMpLCIvIikpcmV0dXJuICQuRWIoKQppZihQLktMKHIsImEvYiIs
-cixyLHIscixyKS50NCgpPT09ImFcXGIiKXJldHVybiAkLktrKCkKcmV0dXJuICQuYkQoKX0sCnpMOmZ1
-bmN0aW9uIHpMKCl7fX0sRT17T0Y6ZnVuY3Rpb24gT0YoYSxiLGMpe3RoaXMuZD1hCnRoaXMuZT1iCnRo
-aXMuZj1jfX0sRj17cnU6ZnVuY3Rpb24gcnUoYSxiLGMsZCl7dmFyIF89dGhpcwpfLmQ9YQpfLmU9Ygpf
-LmY9YwpfLnI9ZH19LEQ9ewphYjpmdW5jdGlvbigpe3ZhciBzLHIscSxwLG89bnVsbAp0cnl7bz1QLnVv
-KCl9Y2F0Y2gocyl7aWYodC5nOC5iKEguUnUocykpKXtyPSQuRmYKaWYociE9bnVsbClyZXR1cm4gcgp0
-aHJvdyBzfWVsc2UgdGhyb3cgc31pZihKLlJNKG8sJC5JNikpe3I9JC5GZgpyLnRvU3RyaW5nCnJldHVy
-biByfSQuSTY9bwppZigkLkhrKCk9PSQuRWIoKSlyPSQuRmY9by5aSSgiLiIpLncoMCkKZWxzZXtxPW8u
-dDQoKQpwPXEubGVuZ3RoLTEKcj0kLkZmPXA9PT0wP3E6Qy54Qi5OaihxLDAscCl9cmV0dXJuIHJ9fQp2
-YXIgdz1bQyxILEosUCxXLE0sVSxCLFQsTCxYLE8sRSxGLERdCmh1bmtIZWxwZXJzLnNldEZ1bmN0aW9u
-TmFtZXNJZk5lY2Vzc2FyeSh3KQp2YXIgJD17fQpILkZLLnByb3RvdHlwZT17fQpKLnZCLnByb3RvdHlw
-ZT17CkROOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGE9PT1ifSwKZ2lPOmZ1bmN0aW9uKGEpe3JldHVybiBI
-LmVRKGEpfSwKdzpmdW5jdGlvbihhKXtyZXR1cm4iSW5zdGFuY2Ugb2YgJyIrSC5FaihILk0oYSkpKyIn
-In0sCmU3OmZ1bmN0aW9uKGEsYil7dC5vLmEoYikKdGhyb3cgSC5iKFAubHIoYSxiLmdXYSgpLGIuZ25k
-KCksYi5nVm0oKSkpfX0KSi55RS5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3JldHVybiBTdHJpbmco
-YSl9LApnaU86ZnVuY3Rpb24oYSl7cmV0dXJuIGE/NTE5MDE4OjIxODE1OX0sCiRpYTI6MX0KSi53ZS5w
-cm90b3R5cGU9ewpETjpmdW5jdGlvbihhLGIpe3JldHVybiBudWxsPT1ifSwKdzpmdW5jdGlvbihhKXty
-ZXR1cm4ibnVsbCJ9LApnaU86ZnVuY3Rpb24oYSl7cmV0dXJuIDB9LAplNzpmdW5jdGlvbihhLGIpe3Jl
-dHVybiB0aGlzLlNqKGEsdC5vLmEoYikpfSwKJGljODoxfQpKLk1GLnByb3RvdHlwZT17CmdpTzpmdW5j
-dGlvbihhKXtyZXR1cm4gMH0sCnc6ZnVuY3Rpb24oYSl7cmV0dXJuIFN0cmluZyhhKX0sCiRpdm06MX0K
-Si5pQy5wcm90b3R5cGU9e30KSi5rZC5wcm90b3R5cGU9e30KSi5jNS5wcm90b3R5cGU9ewp3OmZ1bmN0
-aW9uKGEpe3ZhciBzPWFbJC53KCldCmlmKHM9PW51bGwpcmV0dXJuIHRoaXMudChhKQpyZXR1cm4iSmF2
-YVNjcmlwdCBmdW5jdGlvbiBmb3IgIitILkVqKEouaihzKSl9LAokaUVIOjF9CkouamQucHJvdG90eXBl
-PXsKZHI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbmV3IEgualYoYSxILnQ2KGEpLkMoIkA8MT4iKS5LcShi
-KS5DKCJqVjwxLDI+IikpfSwKaTpmdW5jdGlvbihhLGIpe0gudDYoYSkuYy5hKGIpCmlmKCEhYS5maXhl
-ZCRsZW5ndGgpSC52KFAuTDQoImFkZCIpKQphLnB1c2goYil9LApXNDpmdW5jdGlvbihhLGIpe3ZhciBz
-CmlmKCEhYS5maXhlZCRsZW5ndGgpSC52KFAuTDQoInJlbW92ZUF0IikpCnM9YS5sZW5ndGgKaWYoYj49
-cyl0aHJvdyBILmIoUC5PNyhiLG51bGwpKQpyZXR1cm4gYS5zcGxpY2UoYiwxKVswXX0sClVHOmZ1bmN0
-aW9uKGEsYixjKXt2YXIgcyxyCkgudDYoYSkuQygiY1g8MT4iKS5hKGMpCmlmKCEhYS5maXhlZCRsZW5n
-dGgpSC52KFAuTDQoImluc2VydEFsbCIpKQpQLndBKGIsMCxhLmxlbmd0aCwiaW5kZXgiKQppZighdC5i
-LmIoYykpYz1KLlJYKGMpCnM9Si5IbShjKQphLmxlbmd0aD1hLmxlbmd0aCtzCnI9YitzCnRoaXMuWVco
-YSxyLGEubGVuZ3RoLGEsYikKdGhpcy52ZyhhLGIscixjKX0sCkZWOmZ1bmN0aW9uKGEsYil7dmFyIHMK
-SC50NihhKS5DKCJjWDwxPiIpLmEoYikKaWYoISFhLmZpeGVkJGxlbmd0aClILnYoUC5MNCgiYWRkQWxs
-IikpCmZvcihzPUouSVQoYik7cy5GKCk7KWEucHVzaChzLmdsKCkpfSwKRTI6ZnVuY3Rpb24oYSxiLGMp
-e3ZhciBzPUgudDYoYSkKcmV0dXJuIG5ldyBILmxKKGEscy5LcShjKS5DKCIxKDIpIikuYShiKSxzLkMo
-IkA8MT4iKS5LcShjKS5DKCJsSjwxLDI+IikpfSwKSDpmdW5jdGlvbihhLGIpe3ZhciBzLHI9UC5POChh
-Lmxlbmd0aCwiIiwhMSx0Lk4pCmZvcihzPTA7czxhLmxlbmd0aDsrK3MpdGhpcy5ZKHIscyxILkVqKGFb
-c10pKQpyZXR1cm4gci5qb2luKGIpfSwKZVI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSC5xQyhhLGIsbnVs
-bCxILnQ2KGEpLmMpfSwKTjA6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHMscixxCmQuYShiKQpILnQ2KGEp
-LktxKGQpLkMoIjEoMSwyKSIpLmEoYykKcz1hLmxlbmd0aApmb3Iocj1iLHE9MDtxPHM7KytxKXtyPWMu
-JDIocixhW3FdKQppZihhLmxlbmd0aCE9PXMpdGhyb3cgSC5iKFAuYTQoYSkpfXJldHVybiByfSwKSHQ6
-ZnVuY3Rpb24oYSxiKXt2YXIgcyxyLHEscCxvCkgudDYoYSkuQygiYTIoMSkiKS5hKGIpCnM9YS5sZW5n
-dGgKZm9yKHI9bnVsbCxxPSExLHA9MDtwPHM7KytwKXtvPWFbcF0KaWYoSC5vVChiLiQxKG8pKSl7aWYo
-cSl0aHJvdyBILmIoSC5BbSgpKQpyPW8KcT0hMH1pZihzIT09YS5sZW5ndGgpdGhyb3cgSC5iKFAuYTQo
-YSkpfWlmKHEpcmV0dXJuIHIKdGhyb3cgSC5iKEguV3AoKSl9LApFOmZ1bmN0aW9uKGEsYil7aWYoYjww
-fHxiPj1hLmxlbmd0aClyZXR1cm4gSC5PSChhLGIpCnJldHVybiBhW2JdfSwKZ3RIOmZ1bmN0aW9uKGEp
-e2lmKGEubGVuZ3RoPjApcmV0dXJuIGFbMF0KdGhyb3cgSC5iKEguV3AoKSl9LApnclo6ZnVuY3Rpb24o
-YSl7dmFyIHM9YS5sZW5ndGgKaWYocz4wKXJldHVybiBhW3MtMV0KdGhyb3cgSC5iKEguV3AoKSl9LApZ
-VzpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBzLHIscSxwLG8KSC50NihhKS5DKCJjWDwxPiIpLmEoZCkK
-aWYoISFhLmltbXV0YWJsZSRsaXN0KUgudihQLkw0KCJzZXRSYW5nZSIpKQpQLmpCKGIsYyxhLmxlbmd0
-aCkKcz1jLWIKaWYocz09PTApcmV0dXJuClAuazEoZSwic2tpcENvdW50IikKaWYodC5qLmIoZCkpe3I9
-ZApxPWV9ZWxzZXtyPUouQTUoZCxlKS50dCgwLCExKQpxPTB9cD1KLlU2KHIpCmlmKHErcz5wLmdBKHIp
-KXRocm93IEguYihILmFyKCkpCmlmKHE8Yilmb3Iobz1zLTE7bz49MDstLW8pYVtiK29dPXAucShyLHEr
-bykKZWxzZSBmb3Iobz0wO288czsrK28pYVtiK29dPXAucShyLHErbyl9LAp2ZzpmdW5jdGlvbihhLGIs
-YyxkKXtyZXR1cm4gdGhpcy5ZVyhhLGIsYyxkLDApfSwKVnI6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyCkgu
-dDYoYSkuQygiYTIoMSkiKS5hKGIpCnM9YS5sZW5ndGgKZm9yKHI9MDtyPHM7KytyKXtpZihILm9UKGIu
-JDEoYVtyXSkpKXJldHVybiEwCmlmKGEubGVuZ3RoIT09cyl0aHJvdyBILmIoUC5hNChhKSl9cmV0dXJu
-ITF9LAp0ZzpmdW5jdGlvbihhLGIpe3ZhciBzCmZvcihzPTA7czxhLmxlbmd0aDsrK3MpaWYoSi5STShh
-W3NdLGIpKXJldHVybiEwCnJldHVybiExfSwKZ2wwOmZ1bmN0aW9uKGEpe3JldHVybiBhLmxlbmd0aD09
-PTB9LApnb3I6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubGVuZ3RoIT09MH0sCnc6ZnVuY3Rpb24oYSl7cmV0
-dXJuIFAuV0UoYSwiWyIsIl0iKX0sCnR0OmZ1bmN0aW9uKGEsYil7dmFyIHM9SC5WTShhLnNsaWNlKDAp
-LEgudDYoYSkpCnJldHVybiBzfSwKYnI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMudHQoYSwhMCl9LApn
-a3o6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBKLm0xKGEsYS5sZW5ndGgsSC50NihhKS5DKCJtMTwxPiIp
-KX0sCmdpTzpmdW5jdGlvbihhKXtyZXR1cm4gSC5lUShhKX0sCmdBOmZ1bmN0aW9uKGEpe3JldHVybiBh
-Lmxlbmd0aH0sCnNBOmZ1bmN0aW9uKGEsYil7aWYoISFhLmZpeGVkJGxlbmd0aClILnYoUC5MNCgic2V0
-IGxlbmd0aCIpKQppZihiPDApdGhyb3cgSC5iKFAuVEUoYiwwLG51bGwsIm5ld0xlbmd0aCIsbnVsbCkp
-CmEubGVuZ3RoPWJ9LApxOmZ1bmN0aW9uKGEsYil7SC51UChiKQppZihiPj1hLmxlbmd0aHx8YjwwKXRo
-cm93IEguYihILkhZKGEsYikpCnJldHVybiBhW2JdfSwKWTpmdW5jdGlvbihhLGIsYyl7SC50NihhKS5j
-LmEoYykKaWYoISFhLmltbXV0YWJsZSRsaXN0KUgudihQLkw0KCJpbmRleGVkIHNldCIpKQppZihiPj1h
-Lmxlbmd0aHx8YjwwKXRocm93IEguYihILkhZKGEsYikpCmFbYl09Y30sCiRpYlE6MSwKJGljWDoxLAok
-aXpNOjF9CkouUG8ucHJvdG90eXBlPXt9CkoubTEucHJvdG90eXBlPXsKZ2w6ZnVuY3Rpb24oKXtyZXR1
-cm4gdGhpcy5kfSwKRjpmdW5jdGlvbigpe3ZhciBzLHI9dGhpcyxxPXIuYSxwPXEubGVuZ3RoCmlmKHIu
-YiE9PXApdGhyb3cgSC5iKEgubGsocSkpCnM9ci5jCmlmKHM+PXApe3Iuc00obnVsbCkKcmV0dXJuITF9
-ci5zTShxW3NdKTsrK3IuYwpyZXR1cm4hMH0sCnNNOmZ1bmN0aW9uKGEpe3RoaXMuZD10aGlzLiR0aS5D
-KCIxPyIpLmEoYSl9LAokaUFuOjF9CkoucUkucHJvdG90eXBlPXsKelE6ZnVuY3Rpb24oYSl7aWYoYT4w
-KXtpZihhIT09MS8wKXJldHVybiBNYXRoLnJvdW5kKGEpfWVsc2UgaWYoYT4tMS8wKXJldHVybiAwLU1h
-dGgucm91bmQoMC1hKQp0aHJvdyBILmIoUC5MNCgiIithKyIucm91bmQoKSIpKX0sCnc6ZnVuY3Rpb24o
-YSl7aWYoYT09PTAmJjEvYTwwKXJldHVybiItMC4wIgplbHNlIHJldHVybiIiK2F9LApnaU86ZnVuY3Rp
-b24oYSl7dmFyIHMscixxLHAsbz1hfDAKaWYoYT09PW8pcmV0dXJuIDUzNjg3MDkxMSZvCnM9TWF0aC5h
-YnMoYSkKcj1NYXRoLmxvZyhzKS8wLjY5MzE0NzE4MDU1OTk0NTN8MApxPU1hdGgucG93KDIscikKcD1z
-PDE/cy9xOnEvcwpyZXR1cm4gNTM2ODcwOTExJigocCo5MDA3MTk5MjU0NzQwOTkyfDApKyhwKjM1NDIy
-NDMxODExNzY1MjF8MCkpKjU5OTE5NytyKjEyNTl9LAp6WTpmdW5jdGlvbihhLGIpe3ZhciBzPWElYgpp
-ZihzPT09MClyZXR1cm4gMAppZihzPjApcmV0dXJuIHMKaWYoYjwwKXJldHVybiBzLWIKZWxzZSByZXR1
-cm4gcytifSwKQlU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4oYXwwKT09PWE/YS9ifDA6dGhpcy5ESihhLGIp
-fSwKREo6ZnVuY3Rpb24oYSxiKXt2YXIgcz1hL2IKaWYocz49LTIxNDc0ODM2NDgmJnM8PTIxNDc0ODM2
-NDcpcmV0dXJuIHN8MAppZihzPjApe2lmKHMhPT0xLzApcmV0dXJuIE1hdGguZmxvb3Iocyl9ZWxzZSBp
-ZihzPi0xLzApcmV0dXJuIE1hdGguY2VpbChzKQp0aHJvdyBILmIoUC5MNCgiUmVzdWx0IG9mIHRydW5j
-YXRpbmcgZGl2aXNpb24gaXMgIitILkVqKHMpKyI6ICIrSC5FaihhKSsiIH4vICIrYikpfSwKd0c6ZnVu
-Y3Rpb24oYSxiKXt2YXIgcwppZihhPjApcz10aGlzLnAzKGEsYikKZWxzZXtzPWI+MzE/MzE6YgpzPWE+
-PnM+Pj4wfXJldHVybiBzfSwKYmY6ZnVuY3Rpb24oYSxiKXtpZihiPDApdGhyb3cgSC5iKEgudEwoYikp
-CnJldHVybiB0aGlzLnAzKGEsYil9LApwMzpmdW5jdGlvbihhLGIpe3JldHVybiBiPjMxPzA6YT4+PmJ9
-LAokaUNQOjEsCiRpTFo6MX0KSi5iVS5wcm90b3R5cGU9eyRpSWY6MX0KSi5WQS5wcm90b3R5cGU9e30K
-Si5Eci5wcm90b3R5cGU9ewptOmZ1bmN0aW9uKGEsYil7aWYoYjwwKXRocm93IEguYihILkhZKGEsYikp
-CmlmKGI+PWEubGVuZ3RoKUgudihILkhZKGEsYikpCnJldHVybiBhLmNoYXJDb2RlQXQoYil9LApXOmZ1
-bmN0aW9uKGEsYil7aWYoYj49YS5sZW5ndGgpdGhyb3cgSC5iKEguSFkoYSxiKSkKcmV0dXJuIGEuY2hh
-ckNvZGVBdChiKX0sCmRkOmZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyBILnVuKGIsYSwwKX0sCmg6ZnVu
-Y3Rpb24oYSxiKXtpZih0eXBlb2YgYiE9InN0cmluZyIpdGhyb3cgSC5iKFAuTDMoYixudWxsLG51bGwp
-KQpyZXR1cm4gYStifSwKVGM6ZnVuY3Rpb24oYSxiKXt2YXIgcz1iLmxlbmd0aCxyPWEubGVuZ3RoCmlm
-KHM+cilyZXR1cm4hMQpyZXR1cm4gYj09PXRoaXMuRyhhLHItcyl9LAppNzpmdW5jdGlvbihhLGIsYyxk
-KXt2YXIgcz1QLmpCKGIsYyxhLmxlbmd0aCkscj1hLnN1YnN0cmluZygwLGIpLHE9YS5zdWJzdHJpbmco
-cykKcmV0dXJuIHIrZCtxfSwKUWk6ZnVuY3Rpb24oYSxiLGMpe3ZhciBzCmlmKGM8MHx8Yz5hLmxlbmd0
-aCl0aHJvdyBILmIoUC5URShjLDAsYS5sZW5ndGgsbnVsbCxudWxsKSkKcz1jK2IubGVuZ3RoCmlmKHM+
-YS5sZW5ndGgpcmV0dXJuITEKcmV0dXJuIGI9PT1hLnN1YnN0cmluZyhjLHMpfSwKbjpmdW5jdGlvbihh
-LGIpe3JldHVybiB0aGlzLlFpKGEsYiwwKX0sCk5qOmZ1bmN0aW9uKGEsYixjKXtpZihjPT1udWxsKWM9
-YS5sZW5ndGgKaWYoYjwwKXRocm93IEguYihQLk83KGIsbnVsbCkpCmlmKGI+Yyl0aHJvdyBILmIoUC5P
-NyhiLG51bGwpKQppZihjPmEubGVuZ3RoKXRocm93IEguYihQLk83KGMsbnVsbCkpCnJldHVybiBhLnN1
-YnN0cmluZyhiLGMpfSwKRzpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLk5qKGEsYixudWxsKX0sCmhj
-OmZ1bmN0aW9uKGEpe3JldHVybiBhLnRvTG93ZXJDYXNlKCl9LApiUzpmdW5jdGlvbihhKXt2YXIgcyxy
-LHEscD1hLnRyaW0oKSxvPXAubGVuZ3RoCmlmKG89PT0wKXJldHVybiBwCmlmKHRoaXMuVyhwLDApPT09
-MTMzKXtzPUoubW0ocCwxKQppZihzPT09bylyZXR1cm4iIn1lbHNlIHM9MApyPW8tMQpxPXRoaXMubShw
-LHIpPT09MTMzP0ouYzEocCxyKTpvCmlmKHM9PT0wJiZxPT09bylyZXR1cm4gcApyZXR1cm4gcC5zdWJz
-dHJpbmcocyxxKX0sCkl4OmZ1bmN0aW9uKGEsYil7dmFyIHMscgppZigwPj1iKXJldHVybiIiCmlmKGI9
-PT0xfHxhLmxlbmd0aD09PTApcmV0dXJuIGEKaWYoYiE9PWI+Pj4wKXRocm93IEguYihDLkVxKQpmb3Io
-cz1hLHI9IiI7ITA7KXtpZigoYiYxKT09PTEpcj1zK3IKYj1iPj4+MQppZihiPT09MClicmVhawpzKz1z
-fXJldHVybiByfSwKWFU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBzCmlmKGM8MHx8Yz5hLmxlbmd0aCl0aHJv
-dyBILmIoUC5URShjLDAsYS5sZW5ndGgsbnVsbCxudWxsKSkKcz1hLmluZGV4T2YoYixjKQpyZXR1cm4g
-c30sCk9ZOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuWFUoYSxiLDApfSwKUGs6ZnVuY3Rpb24oYSxi
-LGMpe3ZhciBzLHIKaWYoYz09bnVsbCljPWEubGVuZ3RoCmVsc2UgaWYoYzwwfHxjPmEubGVuZ3RoKXRo
-cm93IEguYihQLlRFKGMsMCxhLmxlbmd0aCxudWxsLG51bGwpKQpzPWIubGVuZ3RoCnI9YS5sZW5ndGgK
-aWYoYytzPnIpYz1yLXMKcmV0dXJuIGEubGFzdEluZGV4T2YoYixjKX0sCmNuOmZ1bmN0aW9uKGEsYil7
-cmV0dXJuIHRoaXMuUGsoYSxiLG51bGwpfSwKSXM6ZnVuY3Rpb24oYSxiLGMpe3ZhciBzPWEubGVuZ3Ro
-CmlmKGM+cyl0aHJvdyBILmIoUC5URShjLDAscyxudWxsLG51bGwpKQpyZXR1cm4gSC5tMihhLGIsYyl9
-LAp0ZzpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLklzKGEsYiwwKX0sCnc6ZnVuY3Rpb24oYSl7cmV0
-dXJuIGF9LApnaU86ZnVuY3Rpb24oYSl7dmFyIHMscixxCmZvcihzPWEubGVuZ3RoLHI9MCxxPTA7cTxz
-OysrcSl7cj01MzY4NzA5MTEmcithLmNoYXJDb2RlQXQocSkKcj01MzY4NzA5MTEmcisoKDUyNDI4NyZy
-KTw8MTApCnJePXI+PjZ9cj01MzY4NzA5MTEmcisoKDY3MTA4ODYzJnIpPDwzKQpyXj1yPj4xMQpyZXR1
-cm4gNTM2ODcwOTExJnIrKCgxNjM4MyZyKTw8MTUpfSwKZ0E6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubGVu
-Z3RofSwKcTpmdW5jdGlvbihhLGIpe0gudVAoYikKaWYoYj49YS5sZW5ndGh8fCExKXRocm93IEguYihI
-LkhZKGEsYikpCnJldHVybiBhW2JdfSwKJGl2WDoxLAokaXFVOjF9CkguQlIucHJvdG90eXBlPXsKZ2t6
-OmZ1bmN0aW9uKGEpe3ZhciBzPUguTGgodGhpcykKcmV0dXJuIG5ldyBILkU3KEouSVQodGhpcy5nT04o
-KSkscy5DKCJAPDE+IikuS3Eocy5RWzFdKS5DKCJFNzwxLDI+IikpfSwKZ0E6ZnVuY3Rpb24oYSl7cmV0
-dXJuIEouSG0odGhpcy5nT04oKSl9LApnbDA6ZnVuY3Rpb24oYSl7cmV0dXJuIEoudVUodGhpcy5nT04o
-KSl9LApnb3I6ZnVuY3Rpb24oYSl7cmV0dXJuIEouRjcodGhpcy5nT04oKSl9LAplUjpmdW5jdGlvbihh
-LGIpe3ZhciBzPUguTGgodGhpcykKcmV0dXJuIEguR0ooSi5BNSh0aGlzLmdPTigpLGIpLHMuYyxzLlFb
-MV0pfSwKRTpmdW5jdGlvbihhLGIpe3JldHVybiBILkxoKHRoaXMpLlFbMV0uYShKLkdBKHRoaXMuZ09O
-KCksYikpfSwKdzpmdW5jdGlvbihhKXtyZXR1cm4gSi5qKHRoaXMuZ09OKCkpfX0KSC5FNy5wcm90b3R5
-cGU9ewpGOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYS5GKCl9LApnbDpmdW5jdGlvbigpe3JldHVybiB0
-aGlzLiR0aS5RWzFdLmEodGhpcy5hLmdsKCkpfSwKJGlBbjoxfQpILlp5LnByb3RvdHlwZT17CmdPTjpm
-dW5jdGlvbigpe3JldHVybiB0aGlzLmF9fQpILm9sLnByb3RvdHlwZT17JGliUToxfQpILlVxLnByb3Rv
-dHlwZT17CnE6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy4kdGkuUVsxXS5hKEoueDkodGhpcy5hLEgu
-dVAoYikpKX0sClk6ZnVuY3Rpb24oYSxiLGMpe3ZhciBzPXRoaXMuJHRpCkoudTkodGhpcy5hLGIscy5j
-LmEocy5RWzFdLmEoYykpKX0sCiRpYlE6MSwKJGl6TToxfQpILmpWLnByb3RvdHlwZT17CmRyOmZ1bmN0
-aW9uKGEsYil7cmV0dXJuIG5ldyBILmpWKHRoaXMuYSx0aGlzLiR0aS5DKCJAPDE+IikuS3EoYikuQygi
-alY8MSwyPiIpKX0sCmdPTjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmF9fQpILm4ucHJvdG90eXBlPXsK
-dzpmdW5jdGlvbihhKXt2YXIgcz10aGlzLmEKcmV0dXJuIHMhPW51bGw/IkxhdGVJbml0aWFsaXphdGlv
-bkVycm9yOiAiK3M6IkxhdGVJbml0aWFsaXphdGlvbkVycm9yIn19CkgucWoucHJvdG90eXBlPXsKZ0E6
-ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYS5sZW5ndGh9LApxOmZ1bmN0aW9uKGEsYil7cmV0dXJuIEMu
-eEIubSh0aGlzLmEsSC51UChiKSl9fQpILmJRLnByb3RvdHlwZT17fQpILmFMLnByb3RvdHlwZT17Cmdr
-ejpmdW5jdGlvbihhKXt2YXIgcz10aGlzCnJldHVybiBuZXcgSC5hNyhzLHMuZ0EocyksSC5MaChzKS5D
-KCJhNzxhTC5FPiIpKX0sCmdsMDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5nQSh0aGlzKT09PTB9LApI
-OmZ1bmN0aW9uKGEsYil7dmFyIHMscixxLHA9dGhpcyxvPXAuZ0EocCkKaWYoYi5sZW5ndGghPT0wKXtp
-ZihvPT09MClyZXR1cm4iIgpzPUguRWoocC5FKDAsMCkpCmlmKG8hPT1wLmdBKHApKXRocm93IEguYihQ
-LmE0KHApKQpmb3Iocj1zLHE9MTtxPG87KytxKXtyPXIrYitILkVqKHAuRSgwLHEpKQppZihvIT09cC5n
-QShwKSl0aHJvdyBILmIoUC5hNChwKSl9cmV0dXJuIHIuY2hhckNvZGVBdCgwKT09MD9yOnJ9ZWxzZXtm
-b3IocT0wLHI9IiI7cTxvOysrcSl7cis9SC5FaihwLkUoMCxxKSkKaWYobyE9PXAuZ0EocCkpdGhyb3cg
-SC5iKFAuYTQocCkpfXJldHVybiByLmNoYXJDb2RlQXQoMCk9PTA/cjpyfX0sCmV2OmZ1bmN0aW9uKGEs
-Yil7cmV0dXJuIHRoaXMuR0coMCxILkxoKHRoaXMpLkMoImEyKGFMLkUpIikuYShiKSl9LApFMjpmdW5j
-dGlvbihhLGIsYyl7dmFyIHM9SC5MaCh0aGlzKQpyZXR1cm4gbmV3IEgubEoodGhpcyxzLktxKGMpLkMo
-IjEoYUwuRSkiKS5hKGIpLHMuQygiQDxhTC5FPiIpLktxKGMpLkMoImxKPDEsMj4iKSl9LAplUjpmdW5j
-dGlvbihhLGIpe3JldHVybiBILnFDKHRoaXMsYixudWxsLEguTGgodGhpcykuQygiYUwuRSIpKX0sCnR0
-OmZ1bmN0aW9uKGEsYil7cmV0dXJuIFAuQ0godGhpcywhMCxILkxoKHRoaXMpLkMoImFMLkUiKSl9LApi
-cjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy50dChhLCEwKX19CkgubkgucHJvdG90eXBlPXsKSGQ6ZnVu
-Y3Rpb24oYSxiLGMsZCl7dmFyIHMscj10aGlzLmIKUC5rMShyLCJzdGFydCIpCnM9dGhpcy5jCmlmKHMh
-PW51bGwpe1AuazEocywiZW5kIikKaWYocj5zKXRocm93IEguYihQLlRFKHIsMCxzLCJzdGFydCIsbnVs
-bCkpfX0sCmdVRDpmdW5jdGlvbigpe3ZhciBzPUouSG0odGhpcy5hKSxyPXRoaXMuYwppZihyPT1udWxs
-fHxyPnMpcmV0dXJuIHMKcmV0dXJuIHJ9LApnQXM6ZnVuY3Rpb24oKXt2YXIgcz1KLkhtKHRoaXMuYSks
-cj10aGlzLmIKaWYocj5zKXJldHVybiBzCnJldHVybiByfSwKZ0E6ZnVuY3Rpb24oYSl7dmFyIHMscj1K
-LkhtKHRoaXMuYSkscT10aGlzLmIKaWYocT49cilyZXR1cm4gMApzPXRoaXMuYwppZihzPT1udWxsfHxz
-Pj1yKXJldHVybiByLXEKaWYodHlwZW9mIHMhPT0ibnVtYmVyIilyZXR1cm4gcy5ITigpCnJldHVybiBz
-LXF9LApFOmZ1bmN0aW9uKGEsYil7dmFyIHM9dGhpcyxyPXMuZ0FzKCkrYgppZihiPDB8fHI+PXMuZ1VE
-KCkpdGhyb3cgSC5iKFAuQ2YoYixzLCJpbmRleCIsbnVsbCxudWxsKSkKcmV0dXJuIEouR0Eocy5hLHIp
-fSwKZVI6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyLHE9dGhpcwpQLmsxKGIsImNvdW50IikKcz1xLmIrYgpy
-PXEuYwppZihyIT1udWxsJiZzPj1yKXJldHVybiBuZXcgSC5NQihxLiR0aS5DKCJNQjwxPiIpKQpyZXR1
-cm4gSC5xQyhxLmEscyxyLHEuJHRpLmMpfSwKdHQ6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyLHEscD10aGlz
-LG89cC5iLG49cC5hLG09Si5VNihuKSxsPW0uZ0Eobiksaz1wLmMKaWYoayE9bnVsbCYmazxsKWw9awpp
-Zih0eXBlb2YgbCE9PSJudW1iZXIiKXJldHVybiBsLkhOKCkKcz1sLW8KaWYoczw9MCl7bj1KLlFpKDAs
-cC4kdGkuYykKcmV0dXJuIG59cj1QLk84KHMsbS5FKG4sbyksITEscC4kdGkuYykKZm9yKHE9MTtxPHM7
-KytxKXtDLk5tLlkocixxLG0uRShuLG8rcSkpCmlmKG0uZ0Eobik8bCl0aHJvdyBILmIoUC5hNChwKSl9
-cmV0dXJuIHJ9fQpILmE3LnByb3RvdHlwZT17CmdsOmZ1bmN0aW9uKCl7dmFyIHM9dGhpcy5kCnJldHVy
-biBzfSwKRjpmdW5jdGlvbigpe3ZhciBzLHI9dGhpcyxxPXIuYSxwPUouVTYocSksbz1wLmdBKHEpCmlm
-KHIuYiE9PW8pdGhyb3cgSC5iKFAuYTQocSkpCnM9ci5jCmlmKHM+PW8pe3Iuc0kobnVsbCkKcmV0dXJu
-ITF9ci5zSShwLkUocSxzKSk7KytyLmMKcmV0dXJuITB9LApzSTpmdW5jdGlvbihhKXt0aGlzLmQ9dGhp
-cy4kdGkuQygiMT8iKS5hKGEpfSwKJGlBbjoxfQpILmkxLnByb3RvdHlwZT17CmdrejpmdW5jdGlvbihh
-KXt2YXIgcz1ILkxoKHRoaXMpCnJldHVybiBuZXcgSC5NSChKLklUKHRoaXMuYSksdGhpcy5iLHMuQygi
-QDwxPiIpLktxKHMuUVsxXSkuQygiTUg8MSwyPiIpKX0sCmdBOmZ1bmN0aW9uKGEpe3JldHVybiBKLkht
-KHRoaXMuYSl9LApnbDA6ZnVuY3Rpb24oYSl7cmV0dXJuIEoudVUodGhpcy5hKX0sCkU6ZnVuY3Rpb24o
-YSxiKXtyZXR1cm4gdGhpcy5iLiQxKEouR0EodGhpcy5hLGIpKX19CkgueHkucHJvdG90eXBlPXskaWJR
-OjF9CkguTUgucHJvdG90eXBlPXsKRjpmdW5jdGlvbigpe3ZhciBzPXRoaXMscj1zLmIKaWYoci5GKCkp
-e3Muc0kocy5jLiQxKHIuZ2woKSkpCnJldHVybiEwfXMuc0kobnVsbCkKcmV0dXJuITF9LApnbDpmdW5j
-dGlvbigpe3ZhciBzPXRoaXMuYQpyZXR1cm4gc30sCnNJOmZ1bmN0aW9uKGEpe3RoaXMuYT10aGlzLiR0
-aS5DKCIyPyIpLmEoYSl9fQpILmxKLnByb3RvdHlwZT17CmdBOmZ1bmN0aW9uKGEpe3JldHVybiBKLkht
-KHRoaXMuYSl9LApFOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuYi4kMShKLkdBKHRoaXMuYSxiKSl9
-fQpILlU1LnByb3RvdHlwZT17CmdrejpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IEguU08oSi5JVCh0aGlz
-LmEpLHRoaXMuYix0aGlzLiR0aS5DKCJTTzwxPiIpKX19CkguU08ucHJvdG90eXBlPXsKRjpmdW5jdGlv
-bigpe3ZhciBzLHIKZm9yKHM9dGhpcy5hLHI9dGhpcy5iO3MuRigpOylpZihILm9UKHIuJDEocy5nbCgp
-KSkpcmV0dXJuITAKcmV0dXJuITF9LApnbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmEuZ2woKX19Ckgu
-QU0ucHJvdG90eXBlPXsKZVI6ZnVuY3Rpb24oYSxiKXtQLlVJKGIsImNvdW50Iix0LlMpClAuazEoYiwi
-Y291bnQiKQpyZXR1cm4gbmV3IEguQU0odGhpcy5hLHRoaXMuYitiLEguTGgodGhpcykuQygiQU08MT4i
-KSl9LApna3o6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBILlUxKEouSVQodGhpcy5hKSx0aGlzLmIsSC5M
-aCh0aGlzKS5DKCJVMTwxPiIpKX19CkguZDUucHJvdG90eXBlPXsKZ0E6ZnVuY3Rpb24oYSl7dmFyIHM9
-Si5IbSh0aGlzLmEpLXRoaXMuYgppZihzPj0wKXJldHVybiBzCnJldHVybiAwfSwKZVI6ZnVuY3Rpb24o
-YSxiKXtQLlVJKGIsImNvdW50Iix0LlMpClAuazEoYiwiY291bnQiKQpyZXR1cm4gbmV3IEguZDUodGhp
-cy5hLHRoaXMuYitiLHRoaXMuJHRpKX0sCiRpYlE6MX0KSC5VMS5wcm90b3R5cGU9ewpGOmZ1bmN0aW9u
-KCl7dmFyIHMscgpmb3Iocz10aGlzLmEscj0wO3I8dGhpcy5iOysrcilzLkYoKQp0aGlzLmI9MApyZXR1
-cm4gcy5GKCl9LApnbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmEuZ2woKX19CkguTUIucHJvdG90eXBl
-PXsKZ2t6OmZ1bmN0aW9uKGEpe3JldHVybiBDLkd3fSwKZ2wwOmZ1bmN0aW9uKGEpe3JldHVybiEwfSwK
-Z0E6ZnVuY3Rpb24oYSl7cmV0dXJuIDB9LApFOmZ1bmN0aW9uKGEsYil7dGhyb3cgSC5iKFAuVEUoYiww
-LDAsImluZGV4IixudWxsKSl9LAplUjpmdW5jdGlvbihhLGIpe1AuazEoYiwiY291bnQiKQpyZXR1cm4g
-dGhpc319CkguRnUucHJvdG90eXBlPXsKRjpmdW5jdGlvbigpe3JldHVybiExfSwKZ2w6ZnVuY3Rpb24o
-KXt0aHJvdyBILmIoSC5XcCgpKX0sCiRpQW46MX0KSC51Ni5wcm90b3R5cGU9ewpna3o6ZnVuY3Rpb24o
-YSl7cmV0dXJuIG5ldyBILkpCKEouSVQodGhpcy5hKSx0aGlzLiR0aS5DKCJKQjwxPiIpKX19CkguSkIu
-cHJvdG90eXBlPXsKRjpmdW5jdGlvbigpe3ZhciBzLHIKZm9yKHM9dGhpcy5hLHI9dGhpcy4kdGkuYztz
-LkYoKTspaWYoci5iKHMuZ2woKSkpcmV0dXJuITAKcmV0dXJuITF9LApnbDpmdW5jdGlvbigpe3JldHVy
-biB0aGlzLiR0aS5jLmEodGhpcy5hLmdsKCkpfSwKJGlBbjoxfQpILlNVLnByb3RvdHlwZT17fQpILlJl
-LnByb3RvdHlwZT17Clk6ZnVuY3Rpb24oYSxiLGMpe0guTGgodGhpcykuQygiUmUuRSIpLmEoYykKdGhy
-b3cgSC5iKFAuTDQoIkNhbm5vdCBtb2RpZnkgYW4gdW5tb2RpZmlhYmxlIGxpc3QiKSl9fQpILncyLnBy
-b3RvdHlwZT17fQpILnd2LnByb3RvdHlwZT17CmdpTzpmdW5jdGlvbihhKXt2YXIgcz10aGlzLl9oYXNo
-Q29kZQppZihzIT1udWxsKXJldHVybiBzCnM9NTM2ODcwOTExJjY2NDU5NypKLmhmKHRoaXMuYSkKdGhp
-cy5faGFzaENvZGU9cwpyZXR1cm4gc30sCnc6ZnVuY3Rpb24oYSl7cmV0dXJuJ1N5bWJvbCgiJytILkVq
-KHRoaXMuYSkrJyIpJ30sCkROOmZ1bmN0aW9uKGEsYil7aWYoYj09bnVsbClyZXR1cm4hMQpyZXR1cm4g
-YiBpbnN0YW5jZW9mIEgud3YmJnRoaXMuYT09Yi5hfSwKJGlHRDoxfQpILlFDLnByb3RvdHlwZT17fQpI
-LlBELnByb3RvdHlwZT17fQpILldVLnByb3RvdHlwZT17CmdsMDpmdW5jdGlvbihhKXtyZXR1cm4gdGhp
-cy5nQSh0aGlzKT09PTB9LAp3OmZ1bmN0aW9uKGEpe3JldHVybiBQLm5PKHRoaXMpfSwKWTpmdW5jdGlv
-bihhLGIsYyl7dmFyIHM9SC5MaCh0aGlzKQpzLmMuYShiKQpzLlFbMV0uYShjKQpILmRjKCl9LApnUHU6
-ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucTQoYSxILkxoKHRoaXMpLkMoIk4zPDEsMj4iKSl9LApxNDpm
-dW5jdGlvbihhLGIpe3ZhciBzPXRoaXMKcmV0dXJuIFAubDAoZnVuY3Rpb24oKXt2YXIgcj1hCnZhciBx
-PTAscD0xLG8sbixtLGwsawpyZXR1cm4gZnVuY3Rpb24gJGFzeW5jJGdQdShjLGQpe2lmKGM9PT0xKXtv
-PWQKcT1wfXdoaWxlKHRydWUpc3dpdGNoKHEpe2Nhc2UgMDpuPXMuZ1YoKSxuPW4uZ2t6KG4pLG09SC5M
-aChzKSxtPW0uQygiQDwxPiIpLktxKG0uUVsxXSkuQygiTjM8MSwyPiIpCmNhc2UgMjppZighbi5GKCkp
-e3E9MwpicmVha31sPW4uZ2woKQprPXMucSgwLGwpCmsudG9TdHJpbmcKcT00CnJldHVybiBuZXcgUC5O
-MyhsLGssbSkKY2FzZSA0OnE9MgpicmVhawpjYXNlIDM6cmV0dXJuIFAuVGgoKQpjYXNlIDE6cmV0dXJu
-IFAuWW0obyl9fX0sYil9LAokaVowOjF9CkguTFAucHJvdG90eXBlPXsKZ0E6ZnVuY3Rpb24oYSl7cmV0
-dXJuIHRoaXMuYX0sCng0OmZ1bmN0aW9uKGEpe2lmKHR5cGVvZiBhIT0ic3RyaW5nIilyZXR1cm4hMQpp
-ZigiX19wcm90b19fIj09PWEpcmV0dXJuITEKcmV0dXJuIHRoaXMuYi5oYXNPd25Qcm9wZXJ0eShhKX0s
-CnE6ZnVuY3Rpb24oYSxiKXtpZighdGhpcy54NChiKSlyZXR1cm4gbnVsbApyZXR1cm4gdGhpcy5xUChi
-KX0sCnFQOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmJbSC5oKGEpXX0sCks6ZnVuY3Rpb24oYSxiKXt2
-YXIgcyxyLHEscCxvPUguTGgodGhpcykKby5DKCJ+KDEsMikiKS5hKGIpCnM9dGhpcy5jCmZvcihyPXMu
-bGVuZ3RoLG89by5RWzFdLHE9MDtxPHI7KytxKXtwPXNbcV0KYi4kMihwLG8uYSh0aGlzLnFQKHApKSl9
-fSwKZ1Y6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEguWFIodGhpcyxILkxoKHRoaXMpLkMoIlhSPDE+Iikp
-fX0KSC5YUi5wcm90b3R5cGU9ewpna3o6ZnVuY3Rpb24oYSl7dmFyIHM9dGhpcy5hLmMKcmV0dXJuIG5l
-dyBKLm0xKHMscy5sZW5ndGgsSC50NihzKS5DKCJtMTwxPiIpKX0sCmdBOmZ1bmN0aW9uKGEpe3JldHVy
-biB0aGlzLmEuYy5sZW5ndGh9fQpILkxJLnByb3RvdHlwZT17CmdXYTpmdW5jdGlvbigpe3ZhciBzPXRo
-aXMuYQpyZXR1cm4gc30sCmduZDpmdW5jdGlvbigpe3ZhciBzLHIscSxwLG89dGhpcwppZihvLmM9PT0x
-KXJldHVybiBDLmhVCnM9by5kCnI9cy5sZW5ndGgtby5lLmxlbmd0aC1vLmYKaWYocj09PTApcmV0dXJu
-IEMuaFUKcT1bXQpmb3IocD0wO3A8cjsrK3Ape2lmKHA+PXMubGVuZ3RoKXJldHVybiBILk9IKHMscCkK
-cS5wdXNoKHNbcF0pfXJldHVybiBKLnpDKHEpfSwKZ1ZtOmZ1bmN0aW9uKCl7dmFyIHMscixxLHAsbyxu
-LG0sbCxrPXRoaXMKaWYoay5jIT09MClyZXR1cm4gQy5XTwpzPWsuZQpyPXMubGVuZ3RoCnE9ay5kCnA9
-cS5sZW5ndGgtci1rLmYKaWYocj09PTApcmV0dXJuIEMuV08Kbz1uZXcgSC5ONSh0LmVvKQpmb3Iobj0w
-O248cjsrK24pe2lmKG4+PXMubGVuZ3RoKXJldHVybiBILk9IKHMsbikKbT1zW25dCmw9cCtuCmlmKGw8
-MHx8bD49cS5sZW5ndGgpcmV0dXJuIEguT0gocSxsKQpvLlkoMCxuZXcgSC53dihtKSxxW2xdKX1yZXR1
-cm4gbmV3IEguUEQobyx0LmdGKX0sCiRpdlE6MX0KSC5Dai5wcm90b3R5cGU9ewokMjpmdW5jdGlvbihh
-LGIpe3ZhciBzCkguaChhKQpzPXRoaXMuYQpzLmI9cy5iKyIkIitILkVqKGEpCkMuTm0uaSh0aGlzLmIs
-YSkKQy5ObS5pKHRoaXMuYyxiKTsrK3MuYX0sCiRTOjE0fQpILmY5LnByb3RvdHlwZT17CnFTOmZ1bmN0
-aW9uKGEpe3ZhciBzLHIscT10aGlzLHA9bmV3IFJlZ0V4cChxLmEpLmV4ZWMoYSkKaWYocD09bnVsbCly
-ZXR1cm4gbnVsbApzPU9iamVjdC5jcmVhdGUobnVsbCkKcj1xLmIKaWYociE9PS0xKXMuYXJndW1lbnRz
-PXBbcisxXQpyPXEuYwppZihyIT09LTEpcy5hcmd1bWVudHNFeHByPXBbcisxXQpyPXEuZAppZihyIT09
-LTEpcy5leHByPXBbcisxXQpyPXEuZQppZihyIT09LTEpcy5tZXRob2Q9cFtyKzFdCnI9cS5mCmlmKHIh
-PT0tMSlzLnJlY2VpdmVyPXBbcisxXQpyZXR1cm4gc319CkguVzAucHJvdG90eXBlPXsKdzpmdW5jdGlv
-bihhKXt2YXIgcz10aGlzLmIKaWYocz09bnVsbClyZXR1cm4iTm9TdWNoTWV0aG9kRXJyb3I6ICIrSC5F
-aih0aGlzLmEpCnJldHVybiJOb1N1Y2hNZXRob2RFcnJvcjogbWV0aG9kIG5vdCBmb3VuZDogJyIrcysi
-JyBvbiBudWxsIn19CkguYXoucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXt2YXIgcyxyPXRoaXMscT0i
-Tm9TdWNoTWV0aG9kRXJyb3I6IG1ldGhvZCBub3QgZm91bmQ6ICciLHA9ci5iCmlmKHA9PW51bGwpcmV0
-dXJuIk5vU3VjaE1ldGhvZEVycm9yOiAiK0guRWooci5hKQpzPXIuYwppZihzPT1udWxsKXJldHVybiBx
-K3ArIicgKCIrSC5FaihyLmEpKyIpIgpyZXR1cm4gcStwKyInIG9uICciK3MrIicgKCIrSC5FaihyLmEp
-KyIpIn19CkgudlYucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXt2YXIgcz10aGlzLmEKcmV0dXJuIHMu
-bGVuZ3RoPT09MD8iRXJyb3IiOiJFcnJvcjogIitzfX0KSC50ZS5wcm90b3R5cGU9ewp3OmZ1bmN0aW9u
-KGEpe3JldHVybiJUaHJvdyBvZiBudWxsICgnIisodGhpcy5hPT09bnVsbD8ibnVsbCI6InVuZGVmaW5l
-ZCIpKyInIGZyb20gSmF2YVNjcmlwdCkifSwKJGlSejoxfQpILmJxLnByb3RvdHlwZT17fQpILlhPLnBy
-b3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7dmFyIHMscj10aGlzLmIKaWYociE9bnVsbClyZXR1cm4gcgpy
-PXRoaXMuYQpzPXIhPT1udWxsJiZ0eXBlb2Ygcj09PSJvYmplY3QiP3Iuc3RhY2s6bnVsbApyZXR1cm4g
-dGhpcy5iPXM9PW51bGw/IiI6c30sCiRpR3o6MX0KSC5UcC5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEp
-e3ZhciBzPXRoaXMuY29uc3RydWN0b3Iscj1zPT1udWxsP251bGw6cy5uYW1lCnJldHVybiJDbG9zdXJl
-ICciK0guTlEocj09bnVsbD8idW5rbm93biI6cikrIicifSwKJGlFSDoxLApnS3U6ZnVuY3Rpb24oKXty
-ZXR1cm4gdGhpc30sCiRDOiIkMSIsCiRSOjEsCiREOm51bGx9CkgubGMucHJvdG90eXBlPXt9Ckguengu
-cHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXt2YXIgcz10aGlzLiRzdGF0aWNfbmFtZQppZihzPT1udWxs
-KXJldHVybiJDbG9zdXJlIG9mIHVua25vd24gc3RhdGljIG1ldGhvZCIKcmV0dXJuIkNsb3N1cmUgJyIr
-SC5OUShzKSsiJyJ9fQpILnJULnByb3RvdHlwZT17CkROOmZ1bmN0aW9uKGEsYil7dmFyIHM9dGhpcwpp
-ZihiPT1udWxsKXJldHVybiExCmlmKHM9PT1iKXJldHVybiEwCmlmKCEoYiBpbnN0YW5jZW9mIEguclQp
-KXJldHVybiExCnJldHVybiBzLmE9PT1iLmEmJnMuYj09PWIuYiYmcy5jPT09Yi5jfSwKZ2lPOmZ1bmN0
-aW9uKGEpe3ZhciBzLHI9dGhpcy5jCmlmKHI9PW51bGwpcz1ILmVRKHRoaXMuYSkKZWxzZSBzPXR5cGVv
-ZiByIT09Im9iamVjdCI/Si5oZihyKTpILmVRKHIpCnJldHVybihzXkguZVEodGhpcy5iKSk+Pj4wfSwK
-dzpmdW5jdGlvbihhKXt2YXIgcz10aGlzLmMKaWYocz09bnVsbClzPXRoaXMuYQpyZXR1cm4iQ2xvc3Vy
-ZSAnIitILkVqKHRoaXMuZCkrIicgb2YgIisoIkluc3RhbmNlIG9mICciK0guRWooSC5NKHMpKSsiJyIp
-fX0KSC5FcS5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3JldHVybiJSdW50aW1lRXJyb3I6ICIrdGhp
-cy5hfX0KSC5rWS5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3JldHVybiJBc3NlcnRpb24gZmFpbGVk
-OiAiK1AuaGwodGhpcy5hKX19Ckgua3IucHJvdG90eXBlPXt9CkguTjUucHJvdG90eXBlPXsKZ0E6ZnVu
-Y3Rpb24oYSl7cmV0dXJuIHRoaXMuYX0sCmdsMDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hPT09MH0s
-CmdWOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBILmk1KHRoaXMsSC5MaCh0aGlzKS5DKCJpNTwxPiIpKX0s
-Cng0OmZ1bmN0aW9uKGEpe3ZhciBzLHIKaWYodHlwZW9mIGE9PSJzdHJpbmciKXtzPXRoaXMuYgppZihz
-PT1udWxsKXJldHVybiExCnJldHVybiB0aGlzLlh1KHMsYSl9ZWxzZXtyPXRoaXMuQ1goYSkKcmV0dXJu
-IHJ9fSwKQ1g6ZnVuY3Rpb24oYSl7dmFyIHM9dGhpcy5kCmlmKHM9PW51bGwpcmV0dXJuITEKcmV0dXJu
-IHRoaXMuRmgodGhpcy5CdChzLEouaGYoYSkmMHgzZmZmZmZmKSxhKT49MH0sCnE6ZnVuY3Rpb24oYSxi
-KXt2YXIgcyxyLHEscCxvPXRoaXMsbj1udWxsCmlmKHR5cGVvZiBiPT0ic3RyaW5nIil7cz1vLmIKaWYo
-cz09bnVsbClyZXR1cm4gbgpyPW8uajIocyxiKQpxPXI9PW51bGw/bjpyLmIKcmV0dXJuIHF9ZWxzZSBp
-Zih0eXBlb2YgYj09Im51bWJlciImJihiJjB4M2ZmZmZmZik9PT1iKXtwPW8uYwppZihwPT1udWxsKXJl
-dHVybiBuCnI9by5qMihwLGIpCnE9cj09bnVsbD9uOnIuYgpyZXR1cm4gcX1lbHNlIHJldHVybiBvLmFh
-KGIpfSwKYWE6ZnVuY3Rpb24oYSl7dmFyIHMscixxPXRoaXMuZAppZihxPT1udWxsKXJldHVybiBudWxs
-CnM9dGhpcy5CdChxLEouaGYoYSkmMHgzZmZmZmZmKQpyPXRoaXMuRmgocyxhKQppZihyPDApcmV0dXJu
-IG51bGwKcmV0dXJuIHNbcl0uYn0sClk6ZnVuY3Rpb24oYSxiLGMpe3ZhciBzLHIscSxwLG8sbixtPXRo
-aXMsbD1ILkxoKG0pCmwuYy5hKGIpCmwuUVsxXS5hKGMpCmlmKHR5cGVvZiBiPT0ic3RyaW5nIil7cz1t
-LmIKbS5FSChzPT1udWxsP20uYj1tLnpLKCk6cyxiLGMpfWVsc2UgaWYodHlwZW9mIGI9PSJudW1iZXIi
-JiYoYiYweDNmZmZmZmYpPT09Yil7cj1tLmMKbS5FSChyPT1udWxsP20uYz1tLnpLKCk6cixiLGMpfWVs
-c2V7cT1tLmQKaWYocT09bnVsbClxPW0uZD1tLnpLKCkKcD1KLmhmKGIpJjB4M2ZmZmZmZgpvPW0uQnQo
-cSxwKQppZihvPT1udWxsKW0uRUkocSxwLFttLkhuKGIsYyldKQplbHNle249bS5GaChvLGIpCmlmKG4+
-PTApb1tuXS5iPWMKZWxzZSBvLnB1c2gobS5IbihiLGMpKX19fSwKSzpmdW5jdGlvbihhLGIpe3ZhciBz
-LHIscT10aGlzCkguTGgocSkuQygifigxLDIpIikuYShiKQpzPXEuZQpyPXEucgpmb3IoO3MhPW51bGw7
-KXtiLiQyKHMuYSxzLmIpCmlmKHIhPT1xLnIpdGhyb3cgSC5iKFAuYTQocSkpCnM9cy5jfX0sCkVIOmZ1
-bmN0aW9uKGEsYixjKXt2YXIgcyxyPXRoaXMscT1ILkxoKHIpCnEuYy5hKGIpCnEuUVsxXS5hKGMpCnM9
-ci5qMihhLGIpCmlmKHM9PW51bGwpci5FSShhLGIsci5IbihiLGMpKQplbHNlIHMuYj1jfSwKa3M6ZnVu
-Y3Rpb24oKXt0aGlzLnI9dGhpcy5yKzEmNjcxMDg4NjN9LApIbjpmdW5jdGlvbihhLGIpe3ZhciBzPXRo
-aXMscj1ILkxoKHMpLHE9bmV3IEgudmgoci5jLmEoYSksci5RWzFdLmEoYikpCmlmKHMuZT09bnVsbClz
-LmU9cy5mPXEKZWxzZXtyPXMuZgpyLnRvU3RyaW5nCnEuZD1yCnMuZj1yLmM9cX0rK3MuYQpzLmtzKCkK
-cmV0dXJuIHF9LApGaDpmdW5jdGlvbihhLGIpe3ZhciBzLHIKaWYoYT09bnVsbClyZXR1cm4tMQpzPWEu
-bGVuZ3RoCmZvcihyPTA7cjxzOysrcilpZihKLlJNKGFbcl0uYSxiKSlyZXR1cm4gcgpyZXR1cm4tMX0s
-Cnc6ZnVuY3Rpb24oYSl7cmV0dXJuIFAubk8odGhpcyl9LApqMjpmdW5jdGlvbihhLGIpe3JldHVybiBh
-W2JdfSwKQnQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYVtiXX0sCkVJOmZ1bmN0aW9uKGEsYixjKXthW2Jd
-PWN9LApybjpmdW5jdGlvbihhLGIpe2RlbGV0ZSBhW2JdfSwKWHU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4g
-dGhpcy5qMihhLGIpIT1udWxsfSwKeks6ZnVuY3Rpb24oKXt2YXIgcz0iPG5vbi1pZGVudGlmaWVyLWtl
-eT4iLHI9T2JqZWN0LmNyZWF0ZShudWxsKQp0aGlzLkVJKHIscyxyKQp0aGlzLnJuKHIscykKcmV0dXJu
-IHJ9LAokaUZvOjF9CkgudmgucHJvdG90eXBlPXt9CkguaTUucHJvdG90eXBlPXsKZ0E6ZnVuY3Rpb24o
-YSl7cmV0dXJuIHRoaXMuYS5hfSwKZ2wwOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmEuYT09PTB9LApn
-a3o6ZnVuY3Rpb24oYSl7dmFyIHM9dGhpcy5hLHI9bmV3IEguTjYocyxzLnIsdGhpcy4kdGkuQygiTjY8
-MT4iKSkKci5jPXMuZQpyZXR1cm4gcn0sCnRnOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuYS54NChi
-KX19CkguTjYucHJvdG90eXBlPXsKZ2w6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kfSwKRjpmdW5jdGlv
-bigpe3ZhciBzLHI9dGhpcyxxPXIuYQppZihyLmIhPT1xLnIpdGhyb3cgSC5iKFAuYTQocSkpCnM9ci5j
-CmlmKHM9PW51bGwpe3Iuc3FZKG51bGwpCnJldHVybiExfWVsc2V7ci5zcVkocy5hKQpyLmM9cy5jCnJl
-dHVybiEwfX0sCnNxWTpmdW5jdGlvbihhKXt0aGlzLmQ9dGhpcy4kdGkuQygiMT8iKS5hKGEpfSwKJGlB
-bjoxfQpILmRDLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmEoYSl9LAokUzo0
-fQpILndOLnByb3RvdHlwZT17CiQyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuYShhLGIpfSwKJFM6
-NDF9CkguVlgucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYShILmgoYSkpfSwK
-JFM6MzR9CkguVlIucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXtyZXR1cm4iUmVnRXhwLyIrdGhpcy5h
-KyIvIit0aGlzLmIuZmxhZ3N9LApnSGM6ZnVuY3Rpb24oKXt2YXIgcz10aGlzLHI9cy5jCmlmKHIhPW51
-bGwpcmV0dXJuIHIKcj1zLmIKcmV0dXJuIHMuYz1ILnY0KHMuYSxyLm11bHRpbGluZSwhci5pZ25vcmVD
-YXNlLHIudW5pY29kZSxyLmRvdEFsbCwhMCl9LApkZDpmdW5jdGlvbihhLGIpe3JldHVybiBuZXcgSC5L
-Vyh0aGlzLGIsMCl9LApVWjpmdW5jdGlvbihhLGIpe3ZhciBzLHI9dGhpcy5nSGMoKQpyLmxhc3RJbmRl
-eD1iCnM9ci5leGVjKGEpCmlmKHM9PW51bGwpcmV0dXJuIG51bGwKcmV0dXJuIG5ldyBILkVLKHMpfSwK
-JGl2WDoxLAokaXdMOjF9CkguRUsucHJvdG90eXBlPXsKcTpmdW5jdGlvbihhLGIpe3ZhciBzCkgudVAo
-YikKcz10aGlzLmIKaWYoYj49cy5sZW5ndGgpcmV0dXJuIEguT0gocyxiKQpyZXR1cm4gc1tiXX0sCiRp
-T2Q6MSwKJGlpYjoxfQpILktXLnByb3RvdHlwZT17CmdrejpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IEgu
-UGIodGhpcy5hLHRoaXMuYix0aGlzLmMpfX0KSC5QYi5wcm90b3R5cGU9ewpnbDpmdW5jdGlvbigpe3Jl
-dHVybiB0aGlzLmR9LApGOmZ1bmN0aW9uKCl7dmFyIHMscixxLHAsbyxuLG09dGhpcyxsPW0uYgppZihs
-PT1udWxsKXJldHVybiExCnM9bS5jCnI9bC5sZW5ndGgKaWYoczw9cil7cT1tLmEKcD1xLlVaKGwscykK
-aWYocCE9bnVsbCl7bS5kPXAKcz1wLmIKbz1zLmluZGV4Cm49bytzWzBdLmxlbmd0aAppZihvPT09bil7
-aWYocS5iLnVuaWNvZGUpe3M9bS5jCnE9cysxCmlmKHE8cil7cz1DLnhCLm0obCxzKQppZihzPj01NTI5
-NiYmczw9NTYzMTkpe3M9Qy54Qi5tKGwscSkKcz1zPj01NjMyMCYmczw9NTczNDN9ZWxzZSBzPSExfWVs
-c2Ugcz0hMX1lbHNlIHM9ITEKbj0ocz9uKzE6bikrMX1tLmM9bgpyZXR1cm4hMH19bS5iPW0uZD1udWxs
-CnJldHVybiExfSwKJGlBbjoxfQpILnRRLnByb3RvdHlwZT17CnE6ZnVuY3Rpb24oYSxiKXtILnVQKGIp
-CmlmKGIhPT0wKUgudihQLk83KGIsbnVsbCkpCnJldHVybiB0aGlzLmN9LAokaU9kOjF9CkgudW4ucHJv
-dG90eXBlPXsKZ2t6OmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgSC5TZCh0aGlzLmEsdGhpcy5iLHRoaXMu
-Yyl9fQpILlNkLnByb3RvdHlwZT17CkY6ZnVuY3Rpb24oKXt2YXIgcyxyLHE9dGhpcyxwPXEuYyxvPXEu
-YixuPW8ubGVuZ3RoLG09cS5hLGw9bS5sZW5ndGgKaWYocCtuPmwpe3EuZD1udWxsCnJldHVybiExfXM9
-bS5pbmRleE9mKG8scCkKaWYoczwwKXtxLmM9bCsxCnEuZD1udWxsCnJldHVybiExfXI9cytuCnEuZD1u
-ZXcgSC50UShzLG8pCnEuYz1yPT09cS5jP3IrMTpyCnJldHVybiEwfSwKZ2w6ZnVuY3Rpb24oKXt2YXIg
-cz10aGlzLmQKcy50b1N0cmluZwpyZXR1cm4gc30sCiRpQW46MX0KSC5FVC5wcm90b3R5cGU9eyRpRVQ6
-MSwkaWVxOjF9CkguWEgucHJvdG90eXBlPXsKZ0E6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubGVuZ3RofSwK
-JGlYajoxfQpILkRnLnByb3RvdHlwZT17CnE6ZnVuY3Rpb24oYSxiKXtILnVQKGIpCkgub2QoYixhLGEu
-bGVuZ3RoKQpyZXR1cm4gYVtiXX0sClk6ZnVuY3Rpb24oYSxiLGMpe0guR0goYykKSC5vZChiLGEsYS5s
-ZW5ndGgpCmFbYl09Y30sCiRpYlE6MSwKJGljWDoxLAokaXpNOjF9CkguUGcucHJvdG90eXBlPXsKWTpm
-dW5jdGlvbihhLGIsYyl7SC51UChjKQpILm9kKGIsYSxhLmxlbmd0aCkKYVtiXT1jfSwKJGliUToxLAok
-aWNYOjEsCiRpek06MX0KSC54ai5wcm90b3R5cGU9ewpxOmZ1bmN0aW9uKGEsYil7SC51UChiKQpILm9k
-KGIsYSxhLmxlbmd0aCkKcmV0dXJuIGFbYl19fQpILmRFLnByb3RvdHlwZT17CnE6ZnVuY3Rpb24oYSxi
-KXtILnVQKGIpCkgub2QoYixhLGEubGVuZ3RoKQpyZXR1cm4gYVtiXX19CkguWkEucHJvdG90eXBlPXsK
-cTpmdW5jdGlvbihhLGIpe0gudVAoYikKSC5vZChiLGEsYS5sZW5ndGgpCnJldHVybiBhW2JdfX0KSC5k
-VC5wcm90b3R5cGU9ewpxOmZ1bmN0aW9uKGEsYil7SC51UChiKQpILm9kKGIsYSxhLmxlbmd0aCkKcmV0
-dXJuIGFbYl19fQpILlBxLnByb3RvdHlwZT17CnE6ZnVuY3Rpb24oYSxiKXtILnVQKGIpCkgub2QoYixh
-LGEubGVuZ3RoKQpyZXR1cm4gYVtiXX19CkguZUUucHJvdG90eXBlPXsKZ0E6ZnVuY3Rpb24oYSl7cmV0
-dXJuIGEubGVuZ3RofSwKcTpmdW5jdGlvbihhLGIpe0gudVAoYikKSC5vZChiLGEsYS5sZW5ndGgpCnJl
-dHVybiBhW2JdfX0KSC5WNi5wcm90b3R5cGU9ewpnQTpmdW5jdGlvbihhKXtyZXR1cm4gYS5sZW5ndGh9
-LApxOmZ1bmN0aW9uKGEsYil7SC51UChiKQpILm9kKGIsYSxhLmxlbmd0aCkKcmV0dXJuIGFbYl19LAok
-aVY2OjEsCiRpbjY6MX0KSC5SRy5wcm90b3R5cGU9e30KSC5WUC5wcm90b3R5cGU9e30KSC5XQi5wcm90
-b3R5cGU9e30KSC5aRy5wcm90b3R5cGU9e30KSC5KYy5wcm90b3R5cGU9ewpDOmZ1bmN0aW9uKGEpe3Jl
-dHVybiBILmNFKHYudHlwZVVuaXZlcnNlLHRoaXMsYSl9LApLcTpmdW5jdGlvbihhKXtyZXR1cm4gSC52
-NSh2LnR5cGVVbml2ZXJzZSx0aGlzLGEpfX0KSC5HLnByb3RvdHlwZT17fQpILmtTLnByb3RvdHlwZT17
-Cnc6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYX19CkguaU0ucHJvdG90eXBlPXt9ClAudGgucHJvdG90
-eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dmFyIHM9dGhpcy5hLHI9cy5hCnMuYT1udWxsCnIuJDAoKX0sCiRT
-OjEwfQpQLmhhLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3ZhciBzLHIKdGhpcy5hLmE9dC5NLmEo
-YSkKcz10aGlzLmIKcj10aGlzLmMKcy5maXJzdENoaWxkP3MucmVtb3ZlQ2hpbGQocik6cy5hcHBlbmRD
-aGlsZChyKX0sCiRTOjUyfQpQLlZzLnByb3RvdHlwZT17CiQwOmZ1bmN0aW9uKCl7dGhpcy5hLiQwKCl9
-LAokQzoiJDAiLAokUjowLAokUzowfQpQLkZ0LnByb3RvdHlwZT17CiQwOmZ1bmN0aW9uKCl7dGhpcy5h
-LiQwKCl9LAokQzoiJDAiLAokUjowLAokUzowfQpQLlczLnByb3RvdHlwZT17CkNZOmZ1bmN0aW9uKGEs
-Yil7aWYoc2VsZi5zZXRUaW1lb3V0IT1udWxsKXNlbGYuc2V0VGltZW91dChILnRSKG5ldyBQLnlIKHRo
-aXMsYiksMCksYSkKZWxzZSB0aHJvdyBILmIoUC5MNCgiYHNldFRpbWVvdXQoKWAgbm90IGZvdW5kLiIp
-KX19ClAueUgucHJvdG90eXBlPXsKJDA6ZnVuY3Rpb24oKXt0aGlzLmIuJDAoKX0sCiRDOiIkMCIsCiRS
-OjAsCiRTOjF9ClAuaWgucHJvdG90eXBlPXsKYU06ZnVuY3Rpb24oYSxiKXt2YXIgcyxyPXRoaXMscT1y
-LiR0aQpxLkMoIjEvPyIpLmEoYikKaWYoIXIuYilyLmEuWGYoYikKZWxzZXtzPXIuYQppZihxLkMoImI4
-PDE+IikuYihiKSlzLmNVKGIpCmVsc2Ugcy5YMihxLmMuYShiKSl9fSwKdzA6ZnVuY3Rpb24oYSxiKXt2
-YXIgcwppZihiPT1udWxsKWI9UC52MChhKQpzPXRoaXMuYQppZih0aGlzLmIpcy5aTChhLGIpCmVsc2Ug
-cy5OayhhLGIpfX0KUC5XTS5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hLiQy
-KDAsYSl9LAokUzo0Nn0KUC5TWC5wcm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe3RoaXMuYS4kMigx
-LG5ldyBILmJxKGEsdC5sLmEoYikpKX0sCiRDOiIkMiIsCiRSOjIsCiRTOjI3fQpQLkdzLnByb3RvdHlw
-ZT17CiQyOmZ1bmN0aW9uKGEsYil7dGhpcy5hKEgudVAoYSksYil9LAokUzoyNX0KUC5GeS5wcm90b3R5
-cGU9ewp3OmZ1bmN0aW9uKGEpe3JldHVybiJJdGVyYXRpb25NYXJrZXIoIit0aGlzLmIrIiwgIitILkVq
-KHRoaXMuYSkrIikifX0KUC5HVi5wcm90b3R5cGU9ewpnbDpmdW5jdGlvbigpe3ZhciBzPXRoaXMuYwpp
-ZihzPT1udWxsKXJldHVybiB0aGlzLiR0aS5jLmEodGhpcy5iKQpyZXR1cm4gcy5nbCgpfSwKRjpmdW5j
-dGlvbigpe3ZhciBzLHIscSxwLG8sbixtPXRoaXMKZm9yKHM9bS4kdGkuQygiQW48MT4iKTshMDspe3I9
-bS5jCmlmKHIhPW51bGwpaWYoci5GKCkpcmV0dXJuITAKZWxzZSBtLnNYOShudWxsKQpxPWZ1bmN0aW9u
-KGEsYixjKXt2YXIgbCxrPWIKd2hpbGUodHJ1ZSl0cnl7cmV0dXJuIGEoayxsKX1jYXRjaChqKXtsPWoK
-az1jfX0obS5hLDAsMSkKaWYocSBpbnN0YW5jZW9mIFAuRnkpe3A9cS5iCmlmKHA9PT0yKXtvPW0uZApp
-ZihvPT1udWxsfHxvLmxlbmd0aD09PTApe20uc0VDKG51bGwpCnJldHVybiExfWlmKDA+PW8ubGVuZ3Ro
-KXJldHVybiBILk9IKG8sLTEpCm0uYT1vLnBvcCgpCmNvbnRpbnVlfWVsc2V7cj1xLmEKaWYocD09PTMp
-dGhyb3cgcgplbHNle249cy5hKEouSVQocikpCmlmKG4gaW5zdGFuY2VvZiBQLkdWKXtyPW0uZAppZihy
-PT1udWxsKXI9bS5kPVtdCkMuTm0uaShyLG0uYSkKbS5hPW4uYQpjb250aW51ZX1lbHNle20uc1g5KG4p
-CmNvbnRpbnVlfX19fWVsc2V7bS5zRUMocSkKcmV0dXJuITB9fXJldHVybiExfSwKc0VDOmZ1bmN0aW9u
-KGEpe3RoaXMuYj10aGlzLiR0aS5DKCIxPyIpLmEoYSl9LApzWDk6ZnVuY3Rpb24oYSl7dGhpcy5jPXRo
-aXMuJHRpLkMoIkFuPDE+PyIpLmEoYSl9LAokaUFuOjF9ClAucTQucHJvdG90eXBlPXsKZ2t6OmZ1bmN0
-aW9uKGEpe3JldHVybiBuZXcgUC5HVih0aGlzLmEoKSx0aGlzLiR0aS5DKCJHVjwxPiIpKX19ClAuUGYu
-cHJvdG90eXBlPXsKdzA6ZnVuY3Rpb24oYSxiKXt2YXIgcwpQLlVJKGEsImVycm9yIix0LkspCnM9dGhp
-cy5hCmlmKHMuYSE9PTApdGhyb3cgSC5iKFAuUFYoIkZ1dHVyZSBhbHJlYWR5IGNvbXBsZXRlZCIpKQpp
-ZihiPT1udWxsKWI9UC52MChhKQpzLk5rKGEsYil9LApwbTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy53
-MChhLG51bGwpfX0KUC5aZi5wcm90b3R5cGU9ewphTTpmdW5jdGlvbihhLGIpe3ZhciBzLHI9dGhpcy4k
-dGkKci5DKCIxLz8iKS5hKGIpCnM9dGhpcy5hCmlmKHMuYSE9PTApdGhyb3cgSC5iKFAuUFYoIkZ1dHVy
-ZSBhbHJlYWR5IGNvbXBsZXRlZCIpKQpzLlhmKHIuQygiMS8iKS5hKGIpKX19ClAuRmUucHJvdG90eXBl
-PXsKSFI6ZnVuY3Rpb24oYSl7aWYoKHRoaXMuYyYxNSkhPT02KXJldHVybiEwCnJldHVybiB0aGlzLmIu
-Yi5idih0LmFsLmEodGhpcy5kKSxhLmEsdC55LHQuSyl9LApLdzpmdW5jdGlvbihhKXt2YXIgcz10aGlz
-LmUscj10LnoscT10LksscD10aGlzLiR0aS5DKCIyLyIpLG89dGhpcy5iLmIKaWYodC5hZy5iKHMpKXJl
-dHVybiBwLmEoby5ycChzLGEuYSxhLmIscixxLHQubCkpCmVsc2UgcmV0dXJuIHAuYShvLmJ2KHQuYkku
-YShzKSxhLmEscixxKSl9fQpQLnZzLnByb3RvdHlwZT17ClNxOmZ1bmN0aW9uKGEsYixjKXt2YXIgcyxy
-LHEscD10aGlzLiR0aQpwLktxKGMpLkMoIjEvKDIpIikuYShhKQpzPSQuWDMKaWYocyE9PUMuTlUpe2Mu
-QygiQDwwLz4iKS5LcShwLmMpLkMoIjEoMikiKS5hKGEpCmlmKGIhPW51bGwpYj1QLlZIKGIscyl9cj1u
-ZXcgUC52cygkLlgzLGMuQygidnM8MD4iKSkKcT1iPT1udWxsPzE6Mwp0aGlzLnhmKG5ldyBQLkZlKHIs
-cSxhLGIscC5DKCJAPDE+IikuS3EoYykuQygiRmU8MSwyPiIpKSkKcmV0dXJuIHJ9LApXNzpmdW5jdGlv
-bihhLGIpe3JldHVybiB0aGlzLlNxKGEsbnVsbCxiKX0sClFkOmZ1bmN0aW9uKGEsYixjKXt2YXIgcyxy
-PXRoaXMuJHRpCnIuS3EoYykuQygiMS8oMikiKS5hKGEpCnM9bmV3IFAudnMoJC5YMyxjLkMoInZzPDA+
-IikpCnRoaXMueGYobmV3IFAuRmUocywxOSxhLGIsci5DKCJAPDE+IikuS3EoYykuQygiRmU8MSwyPiIp
-KSkKcmV0dXJuIHN9LAp4ZjpmdW5jdGlvbihhKXt2YXIgcyxyPXRoaXMscT1yLmEKaWYocTw9MSl7YS5h
-PXQuRi5hKHIuYykKci5jPWF9ZWxzZXtpZihxPT09Mil7cz10LmMuYShyLmMpCnE9cy5hCmlmKHE8NCl7
-cy54ZihhKQpyZXR1cm59ci5hPXEKci5jPXMuY31QLlRrKG51bGwsbnVsbCxyLmIsdC5NLmEobmV3IFAu
-ZGEocixhKSkpfX0sCmpROmZ1bmN0aW9uKGEpe3ZhciBzLHIscSxwLG8sbixtPXRoaXMsbD17fQpsLmE9
-YQppZihhPT1udWxsKXJldHVybgpzPW0uYQppZihzPD0xKXtyPXQuRi5hKG0uYykKbS5jPWEKaWYociE9
-bnVsbCl7cT1hLmEKZm9yKHA9YTtxIT1udWxsO3A9cSxxPW8pbz1xLmEKcC5hPXJ9fWVsc2V7aWYocz09
-PTIpe249dC5jLmEobS5jKQpzPW4uYQppZihzPDQpe24ualEoYSkKcmV0dXJufW0uYT1zCm0uYz1uLmN9
-bC5hPW0uTjgoYSkKUC5UayhudWxsLG51bGwsbS5iLHQuTS5hKG5ldyBQLm9RKGwsbSkpKX19LAphaDpm
-dW5jdGlvbigpe3ZhciBzPXQuRi5hKHRoaXMuYykKdGhpcy5jPW51bGwKcmV0dXJuIHRoaXMuTjgocyl9
-LApOODpmdW5jdGlvbihhKXt2YXIgcyxyLHEKZm9yKHM9YSxyPW51bGw7cyE9bnVsbDtyPXMscz1xKXtx
-PXMuYQpzLmE9cn1yZXR1cm4gcn0sCkhIOmZ1bmN0aW9uKGEpe3ZhciBzLHI9dGhpcyxxPXIuJHRpCnEu
-QygiMS8iKS5hKGEpCmlmKHEuQygiYjg8MT4iKS5iKGEpKWlmKHEuYihhKSlQLkE5KGEscikKZWxzZSBQ
-LmszKGEscikKZWxzZXtzPXIuYWgoKQpxLmMuYShhKQpyLmE9NApyLmM9YQpQLkhaKHIscyl9fSwKWDI6
-ZnVuY3Rpb24oYSl7dmFyIHMscj10aGlzCnIuJHRpLmMuYShhKQpzPXIuYWgoKQpyLmE9NApyLmM9YQpQ
-LkhaKHIscyl9LApaTDpmdW5jdGlvbihhLGIpe3ZhciBzLHIscT10aGlzCnQubC5hKGIpCnM9cS5haCgp
-CnI9UC5UbChhLGIpCnEuYT04CnEuYz1yClAuSFoocSxzKX0sClhmOmZ1bmN0aW9uKGEpe3ZhciBzPXRo
-aXMuJHRpCnMuQygiMS8iKS5hKGEpCmlmKHMuQygiYjg8MT4iKS5iKGEpKXt0aGlzLmNVKGEpCnJldHVy
-bn10aGlzLndVKHMuYy5hKGEpKX0sCndVOmZ1bmN0aW9uKGEpe3ZhciBzPXRoaXMKcy4kdGkuYy5hKGEp
-CnMuYT0xClAuVGsobnVsbCxudWxsLHMuYix0Lk0uYShuZXcgUC5ydChzLGEpKSl9LApjVTpmdW5jdGlv
-bihhKXt2YXIgcz10aGlzLHI9cy4kdGkKci5DKCJiODwxPiIpLmEoYSkKaWYoci5iKGEpKXtpZihhLmE9
-PT04KXtzLmE9MQpQLlRrKG51bGwsbnVsbCxzLmIsdC5NLmEobmV3IFAuS0YocyxhKSkpfWVsc2UgUC5B
-OShhLHMpCnJldHVybn1QLmszKGEscyl9LApOazpmdW5jdGlvbihhLGIpe3RoaXMuYT0xClAuVGsobnVs
-bCxudWxsLHRoaXMuYix0Lk0uYShuZXcgUC5aTCh0aGlzLGEsYikpKX0sCiRpYjg6MX0KUC5kYS5wcm90
-b3R5cGU9ewokMDpmdW5jdGlvbigpe1AuSFoodGhpcy5hLHRoaXMuYil9LAokUzowfQpQLm9RLnByb3Rv
-dHlwZT17CiQwOmZ1bmN0aW9uKCl7UC5IWih0aGlzLmIsdGhpcy5hLmEpfSwKJFM6MH0KUC5wVi5wcm90
-b3R5cGU9ewokMTpmdW5jdGlvbihhKXt2YXIgcz10aGlzLmEKcy5hPTAKcy5ISChhKX0sCiRTOjEwfQpQ
-LlU3LnByb3RvdHlwZT17CiQyOmZ1bmN0aW9uKGEsYil7dGhpcy5hLlpMKGEsdC5sLmEoYikpfSwKJEM6
-IiQyIiwKJFI6MiwKJFM6MzB9ClAudnIucHJvdG90eXBlPXsKJDA6ZnVuY3Rpb24oKXt0aGlzLmEuWkwo
-dGhpcy5iLHRoaXMuYyl9LAokUzowfQpQLnJ0LnByb3RvdHlwZT17CiQwOmZ1bmN0aW9uKCl7dGhpcy5h
-LlgyKHRoaXMuYil9LAokUzowfQpQLktGLnByb3RvdHlwZT17CiQwOmZ1bmN0aW9uKCl7UC5BOSh0aGlz
-LmIsdGhpcy5hKX0sCiRTOjB9ClAuWkwucHJvdG90eXBlPXsKJDA6ZnVuY3Rpb24oKXt0aGlzLmEuWkwo
-dGhpcy5iLHRoaXMuYyl9LAokUzowfQpQLlJULnByb3RvdHlwZT17CiQwOmZ1bmN0aW9uKCl7dmFyIHMs
-cixxLHAsbyxuLG09dGhpcyxsPW51bGwKdHJ5e3E9bS5hLmEKbD1xLmIuYi56eih0LmZPLmEocS5kKSx0
-LnopfWNhdGNoKHApe3M9SC5SdShwKQpyPUgudHMocCkKaWYobS5jKXtxPXQubi5hKG0uYi5hLmMpLmEK
-bz1zCm89cT09bnVsbD9vPT1udWxsOnE9PT1vCnE9b31lbHNlIHE9ITEKbz1tLmEKaWYocSlvLmM9dC5u
-LmEobS5iLmEuYykKZWxzZSBvLmM9UC5UbChzLHIpCm8uYj0hMApyZXR1cm59aWYobCBpbnN0YW5jZW9m
-IFAudnMmJmwuYT49NCl7aWYobC5hPT09OCl7cT1tLmEKcS5jPXQubi5hKGwuYykKcS5iPSEwfXJldHVy
-bn1pZih0LmQuYihsKSl7bj1tLmIuYQpxPW0uYQpxLmM9bC5XNyhuZXcgUC5qWihuKSx0LnopCnEuYj0h
-MX19LAokUzoxfQpQLmpaLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmF9LAok
-UzozMn0KUC5ycS5wcm90b3R5cGU9ewokMDpmdW5jdGlvbigpe3ZhciBzLHIscSxwLG8sbixtLGwKdHJ5
-e3E9dGhpcy5hCnA9cS5hCm89cC4kdGkKbj1vLmMKbT1uLmEodGhpcy5iKQpxLmM9cC5iLmIuYnYoby5D
-KCIyLygxKSIpLmEocC5kKSxtLG8uQygiMi8iKSxuKX1jYXRjaChsKXtzPUguUnUobCkKcj1ILnRzKGwp
-CnE9dGhpcy5hCnEuYz1QLlRsKHMscikKcS5iPSEwfX0sCiRTOjF9ClAuUlcucHJvdG90eXBlPXsKJDA6
-ZnVuY3Rpb24oKXt2YXIgcyxyLHEscCxvLG4sbSxsLGs9dGhpcwp0cnl7cz10Lm4uYShrLmEuYS5jKQpw
-PWsuYgppZihILm9UKHAuYS5IUihzKSkmJnAuYS5lIT1udWxsKXtwLmM9cC5hLkt3KHMpCnAuYj0hMX19
-Y2F0Y2gobyl7cj1ILlJ1KG8pCnE9SC50cyhvKQpwPXQubi5hKGsuYS5hLmMpCm49cC5hCm09cgpsPWsu
-YgppZihuPT1udWxsP209PW51bGw6bj09PW0pbC5jPXAKZWxzZSBsLmM9UC5UbChyLHEpCmwuYj0hMH19
-LAokUzoxfQpQLk9NLnByb3RvdHlwZT17fQpQLnFoLnByb3RvdHlwZT17CmdBOmZ1bmN0aW9uKGEpe3Zh
-ciBzLHIscT10aGlzLHA9e30sbz1uZXcgUC52cygkLlgzLHQuZkopCnAuYT0wCnM9SC5MaChxKQpyPXMu
-QygifigxKT8iKS5hKG5ldyBQLkI1KHAscSkpCnQuWi5hKG5ldyBQLnVPKHAsbykpClcuSkUocS5hLHEu
-YixyLCExLHMuYykKcmV0dXJuIG99fQpQLkI1LnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe0guTGgo
-dGhpcy5iKS5jLmEoYSk7Kyt0aGlzLmEuYX0sCiRTOmZ1bmN0aW9uKCl7cmV0dXJuIEguTGgodGhpcy5i
-KS5DKCJjOCgxKSIpfX0KUC51Ty5wcm90b3R5cGU9ewokMDpmdW5jdGlvbigpe3RoaXMuYi5ISCh0aGlz
-LmEuYSl9LAokUzowfQpQLk1PLnByb3RvdHlwZT17fQpQLmtULnByb3RvdHlwZT17fQpQLnhJLnByb3Rv
-dHlwZT17fQpQLkN3LnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7cmV0dXJuIEguRWoodGhpcy5hKX0s
-CiRpWFM6MSwKZ0lJOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYn19ClAubTAucHJvdG90eXBlPXskaVFt
-OjF9ClAucEsucHJvdG90eXBlPXsKJDA6ZnVuY3Rpb24oKXt2YXIgcz1ILmIodGhpcy5hKQpzLnN0YWNr
-PUouaih0aGlzLmIpCnRocm93IHN9LAokUzowfQpQLkppLnByb3RvdHlwZT17CmJIOmZ1bmN0aW9uKGEp
-e3ZhciBzLHIscSxwPW51bGwKdC5NLmEoYSkKdHJ5e2lmKEMuTlU9PT0kLlgzKXthLiQwKCkKcmV0dXJu
-fVAuVDgocCxwLHRoaXMsYSx0LkgpfWNhdGNoKHEpe3M9SC5SdShxKQpyPUgudHMocSkKUC5MMihwLHAs
-dGhpcyxzLHQubC5hKHIpKX19LApEbDpmdW5jdGlvbihhLGIsYyl7dmFyIHMscixxLHA9bnVsbApjLkMo
-In4oMCkiKS5hKGEpCmMuYShiKQp0cnl7aWYoQy5OVT09PSQuWDMpe2EuJDEoYikKcmV0dXJufVAueXYo
-cCxwLHRoaXMsYSxiLHQuSCxjKX1jYXRjaChxKXtzPUguUnUocSkKcj1ILnRzKHEpClAuTDIocCxwLHRo
-aXMscyx0LmwuYShyKSl9fSwKUlQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbmV3IFAuaGoodGhpcyxiLkMo
-IjAoKSIpLmEoYSksYil9LApHWTpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFAuVnAodGhpcyx0Lk0uYShh
-KSl9LApQeTpmdW5jdGlvbihhLGIpe3JldHVybiBuZXcgUC5PUih0aGlzLGIuQygifigwKSIpLmEoYSks
-Yil9LApxOmZ1bmN0aW9uKGEsYil7cmV0dXJuIG51bGx9LAp6ejpmdW5jdGlvbihhLGIpe2IuQygiMCgp
-IikuYShhKQppZigkLlgzPT09Qy5OVSlyZXR1cm4gYS4kMCgpCnJldHVybiBQLlQ4KG51bGwsbnVsbCx0
-aGlzLGEsYil9LApidjpmdW5jdGlvbihhLGIsYyxkKXtjLkMoIkA8MD4iKS5LcShkKS5DKCIxKDIpIiku
-YShhKQpkLmEoYikKaWYoJC5YMz09PUMuTlUpcmV0dXJuIGEuJDEoYikKcmV0dXJuIFAueXYobnVsbCxu
-dWxsLHRoaXMsYSxiLGMsZCl9LApycDpmdW5jdGlvbihhLGIsYyxkLGUsZil7ZC5DKCJAPDA+IikuS3Eo
-ZSkuS3EoZikuQygiMSgyLDMpIikuYShhKQplLmEoYikKZi5hKGMpCmlmKCQuWDM9PT1DLk5VKXJldHVy
-biBhLiQyKGIsYykKcmV0dXJuIFAuUXgobnVsbCxudWxsLHRoaXMsYSxiLGMsZCxlLGYpfSwKTGo6ZnVu
-Y3Rpb24oYSxiLGMsZCl7cmV0dXJuIGIuQygiQDwwPiIpLktxKGMpLktxKGQpLkMoIjEoMiwzKSIpLmEo
-YSl9fQpQLmhqLnByb3RvdHlwZT17CiQwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYS56eih0aGlzLmIs
-dGhpcy5jKX0sCiRTOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYy5DKCIwKCkiKX19ClAuVnAucHJvdG90
-eXBlPXsKJDA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hLmJIKHRoaXMuYil9LAokUzoxfQpQLk9SLnBy
-b3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3ZhciBzPXRoaXMuYwpyZXR1cm4gdGhpcy5hLkRsKHRoaXMu
-YixzLmEoYSkscyl9LAokUzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmMuQygifigwKSIpfX0KUC5iNi5w
-cm90b3R5cGU9ewpna3o6ZnVuY3Rpb24oYSl7dmFyIHM9dGhpcyxyPW5ldyBQLmxtKHMscy5yLEguTGgo
-cykuQygibG08MT4iKSkKci5jPXMuZQpyZXR1cm4gcn0sCmdBOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlz
-LmF9LApnbDA6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYT09PTB9LApnb3I6ZnVuY3Rpb24oYSl7cmV0
-dXJuIHRoaXMuYSE9PTB9LAp0ZzpmdW5jdGlvbihhLGIpe3ZhciBzLHIKaWYodHlwZW9mIGI9PSJzdHJp
-bmciJiZiIT09Il9fcHJvdG9fXyIpe3M9dGhpcy5iCmlmKHM9PW51bGwpcmV0dXJuITEKcmV0dXJuIHQu
-ZS5hKHNbYl0pIT1udWxsfWVsc2V7cj10aGlzLlBSKGIpCnJldHVybiByfX0sClBSOmZ1bmN0aW9uKGEp
-e3ZhciBzPXRoaXMuZAppZihzPT1udWxsKXJldHVybiExCnJldHVybiB0aGlzLkRGKHNbdGhpcy5OKGEp
-XSxhKT49MH0sCmk6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyLHE9dGhpcwpILkxoKHEpLmMuYShiKQppZih0
-eXBlb2YgYj09InN0cmluZyImJmIhPT0iX19wcm90b19fIil7cz1xLmIKcmV0dXJuIHEuYlEocz09bnVs
-bD9xLmI9UC5UMigpOnMsYil9ZWxzZSBpZih0eXBlb2YgYj09Im51bWJlciImJihiJjEwNzM3NDE4MjMp
-PT09Yil7cj1xLmMKcmV0dXJuIHEuYlEocj09bnVsbD9xLmM9UC5UMigpOnIsYil9ZWxzZSByZXR1cm4g
-cS5CNyhiKX0sCkI3OmZ1bmN0aW9uKGEpe3ZhciBzLHIscSxwPXRoaXMKSC5MaChwKS5jLmEoYSkKcz1w
-LmQKaWYocz09bnVsbClzPXAuZD1QLlQyKCkKcj1wLk4oYSkKcT1zW3JdCmlmKHE9PW51bGwpc1tyXT1b
-cC55byhhKV0KZWxzZXtpZihwLkRGKHEsYSk+PTApcmV0dXJuITEKcS5wdXNoKHAueW8oYSkpfXJldHVy
-biEwfSwKUjpmdW5jdGlvbihhLGIpe3ZhciBzPXRoaXMKaWYodHlwZW9mIGI9PSJzdHJpbmciJiZiIT09
-Il9fcHJvdG9fXyIpcmV0dXJuIHMuTChzLmIsYikKZWxzZSBpZih0eXBlb2YgYj09Im51bWJlciImJihi
-JjEwNzM3NDE4MjMpPT09YilyZXR1cm4gcy5MKHMuYyxiKQplbHNlIHJldHVybiBzLnFnKGIpfSwKcWc6
-ZnVuY3Rpb24oYSl7dmFyIHMscixxLHAsbz10aGlzLG49by5kCmlmKG49PW51bGwpcmV0dXJuITEKcz1v
-Lk4oYSkKcj1uW3NdCnE9by5ERihyLGEpCmlmKHE8MClyZXR1cm4hMQpwPXIuc3BsaWNlKHEsMSlbMF0K
-aWYoMD09PXIubGVuZ3RoKWRlbGV0ZSBuW3NdCm8uR1MocCkKcmV0dXJuITB9LApiUTpmdW5jdGlvbihh
-LGIpe0guTGgodGhpcykuYy5hKGIpCmlmKHQuZS5hKGFbYl0pIT1udWxsKXJldHVybiExCmFbYl09dGhp
-cy55byhiKQpyZXR1cm4hMH0sCkw6ZnVuY3Rpb24oYSxiKXt2YXIgcwppZihhPT1udWxsKXJldHVybiEx
-CnM9dC5lLmEoYVtiXSkKaWYocz09bnVsbClyZXR1cm4hMQp0aGlzLkdTKHMpCmRlbGV0ZSBhW2JdCnJl
-dHVybiEwfSwKUzpmdW5jdGlvbigpe3RoaXMucj0xMDczNzQxODIzJnRoaXMucisxfSwKeW86ZnVuY3Rp
-b24oYSl7dmFyIHMscj10aGlzLHE9bmV3IFAuYm4oSC5MaChyKS5jLmEoYSkpCmlmKHIuZT09bnVsbCly
-LmU9ci5mPXEKZWxzZXtzPXIuZgpzLnRvU3RyaW5nCnEuYz1zCnIuZj1zLmI9cX0rK3IuYQpyLlMoKQpy
-ZXR1cm4gcX0sCkdTOmZ1bmN0aW9uKGEpe3ZhciBzPXRoaXMscj1hLmMscT1hLmIKaWYocj09bnVsbClz
-LmU9cQplbHNlIHIuYj1xCmlmKHE9PW51bGwpcy5mPXIKZWxzZSBxLmM9cjstLXMuYQpzLlMoKX0sCk46
-ZnVuY3Rpb24oYSl7cmV0dXJuIEouaGYoYSkmMTA3Mzc0MTgyM30sCkRGOmZ1bmN0aW9uKGEsYil7dmFy
-IHMscgppZihhPT1udWxsKXJldHVybi0xCnM9YS5sZW5ndGgKZm9yKHI9MDtyPHM7KytyKWlmKEouUk0o
-YVtyXS5hLGIpKXJldHVybiByCnJldHVybi0xfX0KUC5ibi5wcm90b3R5cGU9e30KUC5sbS5wcm90b3R5
-cGU9ewpnbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR9LApGOmZ1bmN0aW9uKCl7dmFyIHM9dGhpcyxy
-PXMuYyxxPXMuYQppZihzLmIhPT1xLnIpdGhyb3cgSC5iKFAuYTQocSkpCmVsc2UgaWYocj09bnVsbCl7
-cy5zaihudWxsKQpyZXR1cm4hMX1lbHNle3Muc2oocy4kdGkuQygiMT8iKS5hKHIuYSkpCnMuYz1yLmIK
-cmV0dXJuITB9fSwKc2o6ZnVuY3Rpb24oYSl7dGhpcy5kPXRoaXMuJHRpLkMoIjE/IikuYShhKX0sCiRp
-QW46MX0KUC5tVy5wcm90b3R5cGU9e30KUC51eS5wcm90b3R5cGU9eyRpYlE6MSwkaWNYOjEsJGl6TTox
-fQpQLmxELnByb3RvdHlwZT17CmdrejpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IEguYTcoYSx0aGlzLmdB
-KGEpLEgueihhKS5DKCJhNzxsRC5FPiIpKX0sCkU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5xKGEs
-Yil9LApLOmZ1bmN0aW9uKGEsYil7dmFyIHMscgpILnooYSkuQygifihsRC5FKSIpLmEoYikKcz10aGlz
-LmdBKGEpCmZvcihyPTA7cjxzOysrcil7Yi4kMSh0aGlzLnEoYSxyKSkKaWYocyE9PXRoaXMuZ0EoYSkp
-dGhyb3cgSC5iKFAuYTQoYSkpfX0sCmdsMDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5nQShhKT09PTB9
-LApnb3I6ZnVuY3Rpb24oYSl7cmV0dXJuIXRoaXMuZ2wwKGEpfSwKRTI6ZnVuY3Rpb24oYSxiLGMpe3Zh
-ciBzPUgueihhKQpyZXR1cm4gbmV3IEgubEooYSxzLktxKGMpLkMoIjEobEQuRSkiKS5hKGIpLHMuQygi
-QDxsRC5FPiIpLktxKGMpLkMoImxKPDEsMj4iKSl9LAplUjpmdW5jdGlvbihhLGIpe3JldHVybiBILnFD
-KGEsYixudWxsLEgueihhKS5DKCJsRC5FIikpfSwKZHI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbmV3IEgu
-alYoYSxILnooYSkuQygiQDxsRC5FPiIpLktxKGIpLkMoImpWPDEsMj4iKSl9LApkdTpmdW5jdGlvbihh
-LGIsYyxkKXt2YXIgcwpILnooYSkuQygibEQuRT8iKS5hKGQpClAuakIoYixjLHRoaXMuZ0EoYSkpCmZv
-cihzPWI7czxjOysrcyl0aGlzLlkoYSxzLGQpfSwKdzpmdW5jdGlvbihhKXtyZXR1cm4gUC5XRShhLCJb
-IiwiXSIpfX0KUC5pbC5wcm90b3R5cGU9e30KUC5yYS5wcm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIp
-e3ZhciBzLHI9dGhpcy5hCmlmKCFyLmEpdGhpcy5iLmErPSIsICIKci5hPSExCnI9dGhpcy5iCnM9ci5h
-Kz1ILkVqKGEpCnIuYT1zKyI6ICIKci5hKz1ILkVqKGIpfSwKJFM6MTJ9ClAuWWsucHJvdG90eXBlPXsK
-SzpmdW5jdGlvbihhLGIpe3ZhciBzLHIKSC5MaCh0aGlzKS5DKCJ+KFlrLkssWWsuVikiKS5hKGIpCmZv
-cihzPUouSVQodGhpcy5nVigpKTtzLkYoKTspe3I9cy5nbCgpCmIuJDIocix0aGlzLnEoMCxyKSl9fSwK
-Z1B1OmZ1bmN0aW9uKGEpe3JldHVybiBKLk0xKHRoaXMuZ1YoKSxuZXcgUC55USh0aGlzKSxILkxoKHRo
-aXMpLkMoIk4zPFlrLkssWWsuVj4iKSl9LAp4NDpmdW5jdGlvbihhKXtyZXR1cm4gSi56bCh0aGlzLmdW
-KCksYSl9LApnQTpmdW5jdGlvbihhKXtyZXR1cm4gSi5IbSh0aGlzLmdWKCkpfSwKZ2wwOmZ1bmN0aW9u
-KGEpe3JldHVybiBKLnVVKHRoaXMuZ1YoKSl9LAp3OmZ1bmN0aW9uKGEpe3JldHVybiBQLm5PKHRoaXMp
-fSwKJGlaMDoxfQpQLnlRLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3ZhciBzPXRoaXMuYSxyPUgu
-TGgocykKci5DKCJZay5LIikuYShhKQpyZXR1cm4gbmV3IFAuTjMoYSxzLnEoMCxhKSxyLkMoIkA8WWsu
-Sz4iKS5LcShyLkMoIllrLlYiKSkuQygiTjM8MSwyPiIpKX0sCiRTOmZ1bmN0aW9uKCl7cmV0dXJuIEgu
-TGgodGhpcy5hKS5DKCJOMzxZay5LLFlrLlY+KFlrLkspIil9fQpQLktQLnByb3RvdHlwZT17Clk6ZnVu
-Y3Rpb24oYSxiLGMpe3ZhciBzPUguTGgodGhpcykKcy5jLmEoYikKcy5RWzFdLmEoYykKdGhyb3cgSC5i
-KFAuTDQoIkNhbm5vdCBtb2RpZnkgdW5tb2RpZmlhYmxlIG1hcCIpKX19ClAuUG4ucHJvdG90eXBlPXsK
-cTpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmEucSgwLGIpfSwKWTpmdW5jdGlvbihhLGIsYyl7dmFy
-IHM9SC5MaCh0aGlzKQp0aGlzLmEuWSgwLHMuYy5hKGIpLHMuUVsxXS5hKGMpKX0sCng0OmZ1bmN0aW9u
-KGEpe3JldHVybiB0aGlzLmEueDQoYSl9LApLOmZ1bmN0aW9uKGEsYil7dGhpcy5hLksoMCxILkxoKHRo
-aXMpLkMoIn4oMSwyKSIpLmEoYikpfSwKZ2wwOmZ1bmN0aW9uKGEpe3ZhciBzPXRoaXMuYQpyZXR1cm4g
-cy5nbDAocyl9LApnQTpmdW5jdGlvbihhKXt2YXIgcz10aGlzLmEKcmV0dXJuIHMuZ0Eocyl9LAp3OmZ1
-bmN0aW9uKGEpe3JldHVybiBKLmoodGhpcy5hKX0sCmdQdTpmdW5jdGlvbihhKXt2YXIgcz10aGlzLmEK
-cmV0dXJuIHMuZ1B1KHMpfSwKJGlaMDoxfQpQLkdqLnByb3RvdHlwZT17fQpQLmxmLnByb3RvdHlwZT17
-CmdsMDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5nQSh0aGlzKT09PTB9LApnb3I6ZnVuY3Rpb24oYSl7
-cmV0dXJuIHRoaXMuZ0EodGhpcykhPT0wfSwKdzpmdW5jdGlvbihhKXtyZXR1cm4gUC5XRSh0aGlzLCJ7
-IiwifSIpfSwKZVI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSC5iSyh0aGlzLGIsSC5MaCh0aGlzKS5DKCJs
-Zi5FIikpfSwKRTpmdW5jdGlvbihhLGIpe3ZhciBzLHIscSxwPSJpbmRleCIKUC5VSShiLHAsdC5TKQpQ
-LmsxKGIscCkKZm9yKHM9dGhpcy5QKCkscz1QLnJqKHMscy5yLEguTGgocykuYykscj0wO3MuRigpOyl7
-cT1zLmQKaWYoYj09PXIpcmV0dXJuIHE7KytyfXRocm93IEguYihQLkNmKGIsdGhpcyxwLG51bGwscikp
-fX0KUC5Wai5wcm90b3R5cGU9eyRpYlE6MSwkaWNYOjEsJGl4dToxfQpQLlh2LnByb3RvdHlwZT17Cmds
-MDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hPT09MH0sCmdvcjpmdW5jdGlvbihhKXtyZXR1cm4gdGhp
-cy5hIT09MH0sCkZWOmZ1bmN0aW9uKGEsYil7dmFyIHMKZm9yKHM9Si5JVChILkxoKHRoaXMpLkMoImNY
-PDE+IikuYShiKSk7cy5GKCk7KXRoaXMuaSgwLHMuZ2woKSl9LAp3OmZ1bmN0aW9uKGEpe3JldHVybiBQ
-LldFKHRoaXMsInsiLCJ9Iil9LApIOmZ1bmN0aW9uKGEsYil7dmFyIHMscj1QLnJqKHRoaXMsdGhpcy5y
-LEguTGgodGhpcykuYykKaWYoIXIuRigpKXJldHVybiIiCmlmKGI9PT0iIil7cz0iIgpkbyBzKz1ILkVq
-KHIuZCkKd2hpbGUoci5GKCkpfWVsc2V7cz1ILkVqKHIuZCkKZm9yKDtyLkYoKTspcz1zK2IrSC5Faihy
-LmQpfXJldHVybiBzLmNoYXJDb2RlQXQoMCk9PTA/czpzfSwKZVI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4g
-SC5iSyh0aGlzLGIsSC5MaCh0aGlzKS5jKX0sCkU6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyLHEscD10aGlz
-LG89ImluZGV4IgpQLlVJKGIsbyx0LlMpClAuazEoYixvKQpmb3Iocz1QLnJqKHAscC5yLEguTGgocCku
-Yykscj0wO3MuRigpOyl7cT1zLmQKaWYoYj09PXIpcmV0dXJuIHE7KytyfXRocm93IEguYihQLkNmKGIs
-cCxvLG51bGwscikpfSwKJGliUToxLAokaWNYOjEsCiRpeHU6MX0KUC5uWS5wcm90b3R5cGU9e30KUC5X
-WS5wcm90b3R5cGU9e30KUC5SVS5wcm90b3R5cGU9e30KUC51dy5wcm90b3R5cGU9ewpxOmZ1bmN0aW9u
-KGEsYil7dmFyIHMscj10aGlzLmIKaWYocj09bnVsbClyZXR1cm4gdGhpcy5jLnEoMCxiKQplbHNlIGlm
-KHR5cGVvZiBiIT0ic3RyaW5nIilyZXR1cm4gbnVsbAplbHNle3M9cltiXQpyZXR1cm4gdHlwZW9mIHM9
-PSJ1bmRlZmluZWQiP3RoaXMuZmIoYik6c319LApnQTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5iPT1u
-dWxsP3RoaXMuYy5hOnRoaXMuQ2YoKS5sZW5ndGh9LApnbDA6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMu
-Z0EodGhpcyk9PT0wfSwKZ1Y6ZnVuY3Rpb24oKXtpZih0aGlzLmI9PW51bGwpe3ZhciBzPXRoaXMuYwpy
-ZXR1cm4gbmV3IEguaTUocyxILkxoKHMpLkMoImk1PDE+IikpfXJldHVybiBuZXcgUC5pOCh0aGlzKX0s
-Clk6ZnVuY3Rpb24oYSxiLGMpe3ZhciBzLHIscT10aGlzCmlmKHEuYj09bnVsbClxLmMuWSgwLGIsYykK
-ZWxzZSBpZihxLng0KGIpKXtzPXEuYgpzW2JdPWMKcj1xLmEKaWYocj09bnVsbD9zIT1udWxsOnIhPT1z
-KXJbYl09bnVsbH1lbHNlIHEuWEsoKS5ZKDAsYixjKX0sCng0OmZ1bmN0aW9uKGEpe2lmKHRoaXMuYj09
-bnVsbClyZXR1cm4gdGhpcy5jLng0KGEpCnJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3Bl
-cnR5LmNhbGwodGhpcy5hLGEpfSwKSzpmdW5jdGlvbihhLGIpe3ZhciBzLHIscSxwLG89dGhpcwp0LmNB
-LmEoYikKaWYoby5iPT1udWxsKXJldHVybiBvLmMuSygwLGIpCnM9by5DZigpCmZvcihyPTA7cjxzLmxl
-bmd0aDsrK3Ipe3E9c1tyXQpwPW8uYltxXQppZih0eXBlb2YgcD09InVuZGVmaW5lZCIpe3A9UC5RZShv
-LmFbcV0pCm8uYltxXT1wfWIuJDIocSxwKQppZihzIT09by5jKXRocm93IEguYihQLmE0KG8pKX19LApD
-ZjpmdW5jdGlvbigpe3ZhciBzPXQuYk0uYSh0aGlzLmMpCmlmKHM9PW51bGwpcz10aGlzLmM9SC5WTShP
-YmplY3Qua2V5cyh0aGlzLmEpLHQucykKcmV0dXJuIHN9LApYSzpmdW5jdGlvbigpe3ZhciBzLHIscSxw
-LG8sbj10aGlzCmlmKG4uYj09bnVsbClyZXR1cm4gbi5jCnM9UC5GbCh0Lk4sdC56KQpyPW4uQ2YoKQpm
-b3IocT0wO3A9ci5sZW5ndGgscTxwOysrcSl7bz1yW3FdCnMuWSgwLG8sbi5xKDAsbykpfWlmKHA9PT0w
-KUMuTm0uaShyLCIiKQplbHNlIEMuTm0uc0EociwwKQpuLmE9bi5iPW51bGwKcmV0dXJuIG4uYz1zfSwK
-ZmI6ZnVuY3Rpb24oYSl7dmFyIHMKaWYoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2Fs
-bCh0aGlzLmEsYSkpcmV0dXJuIG51bGwKcz1QLlFlKHRoaXMuYVthXSkKcmV0dXJuIHRoaXMuYlthXT1z
-fX0KUC5pOC5wcm90b3R5cGU9ewpnQTpmdW5jdGlvbihhKXt2YXIgcz10aGlzLmEKcmV0dXJuIHMuZ0Eo
-cyl9LApFOmZ1bmN0aW9uKGEsYil7dmFyIHM9dGhpcy5hCmlmKHMuYj09bnVsbClzPXMuZ1YoKS5FKDAs
-YikKZWxzZXtzPXMuQ2YoKQppZihiPDB8fGI+PXMubGVuZ3RoKXJldHVybiBILk9IKHMsYikKcz1zW2Jd
-fXJldHVybiBzfSwKZ2t6OmZ1bmN0aW9uKGEpe3ZhciBzPXRoaXMuYQppZihzLmI9PW51bGwpe3M9cy5n
-VigpCnM9cy5na3oocyl9ZWxzZXtzPXMuQ2YoKQpzPW5ldyBKLm0xKHMscy5sZW5ndGgsSC50NihzKS5D
-KCJtMTwxPiIpKX1yZXR1cm4gc30sCnRnOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuYS54NChiKX19
-ClAucGcucHJvdG90eXBlPXsKJDA6ZnVuY3Rpb24oKXt2YXIgcyxyCnRyeXtzPW5ldyBUZXh0RGVjb2Rl
-cigidXRmLTgiLHtmYXRhbDp0cnVlfSkKcmV0dXJuIHN9Y2F0Y2gocil7SC5SdShyKX1yZXR1cm4gbnVs
-bH0sCiRTOjEzfQpQLmMyLnByb3RvdHlwZT17CiQwOmZ1bmN0aW9uKCl7dmFyIHMscgp0cnl7cz1uZXcg
-VGV4dERlY29kZXIoInV0Zi04Iix7ZmF0YWw6ZmFsc2V9KQpyZXR1cm4gc31jYXRjaChyKXtILlJ1KHIp
-fXJldHVybiBudWxsfSwKJFM6MTN9ClAuQ1YucHJvdG90eXBlPXsKeXI6ZnVuY3Rpb24oYTAsYTEsYTIp
-e3ZhciBzLHIscSxwLG8sbixtLGwsayxqLGksaCxnLGYsZSxkLGMsYixhPSJJbnZhbGlkIGJhc2U2NCBl
-bmNvZGluZyBsZW5ndGggIgphMj1QLmpCKGExLGEyLGEwLmxlbmd0aCkKcz0kLlY3KCkKZm9yKHI9YTEs
-cT1yLHA9bnVsbCxvPS0xLG49LTEsbT0wO3I8YTI7cj1sKXtsPXIrMQprPUMueEIuVyhhMCxyKQppZihr
-PT09Mzcpe2o9bCsyCmlmKGo8PWEyKXtpPUgub28oQy54Qi5XKGEwLGwpKQpoPUgub28oQy54Qi5XKGEw
-LGwrMSkpCmc9aSoxNitoLShoJjI1NikKaWYoZz09PTM3KWc9LTEKbD1qfWVsc2UgZz0tMX1lbHNlIGc9
-awppZigwPD1nJiZnPD0xMjcpe2lmKGc8MHx8Zz49cy5sZW5ndGgpcmV0dXJuIEguT0gocyxnKQpmPXNb
-Z10KaWYoZj49MCl7Zz1DLnhCLm0oIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamts
-bW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iLGYpCmlmKGc9PT1rKWNvbnRpbnVlCms9Z31lbHNle2lm
-KGY9PT0tMSl7aWYobzwwKXtlPXA9PW51bGw/bnVsbDpwLmEubGVuZ3RoCmlmKGU9PW51bGwpZT0wCm89
-ZSsoci1xKQpuPXJ9KyttCmlmKGs9PT02MSljb250aW51ZX1rPWd9aWYoZiE9PS0yKXtpZihwPT1udWxs
-KXtwPW5ldyBQLlJuKCIiKQplPXB9ZWxzZSBlPXAKZS5hKz1DLnhCLk5qKGEwLHEscikKZS5hKz1ILkx3
-KGspCnE9bApjb250aW51ZX19dGhyb3cgSC5iKFAucnIoIkludmFsaWQgYmFzZTY0IGRhdGEiLGEwLHIp
-KX1pZihwIT1udWxsKXtlPXAuYSs9Qy54Qi5OaihhMCxxLGEyKQpkPWUubGVuZ3RoCmlmKG8+PTApUC54
-TShhMCxuLGEyLG8sbSxkKQplbHNle2M9Qy5qbi56WShkLTEsNCkrMQppZihjPT09MSl0aHJvdyBILmIo
-UC5ycihhLGEwLGEyKSkKZm9yKDtjPDQ7KXtlKz0iPSIKcC5hPWU7KytjfX1lPXAuYQpyZXR1cm4gQy54
-Qi5pNyhhMCxhMSxhMixlLmNoYXJDb2RlQXQoMCk9PTA/ZTplKX1iPWEyLWExCmlmKG8+PTApUC54TShh
-MCxuLGEyLG8sbSxiKQplbHNle2M9Qy5qbi56WShiLDQpCmlmKGM9PT0xKXRocm93IEguYihQLnJyKGEs
-YTAsYTIpKQppZihjPjEpYTA9Qy54Qi5pNyhhMCxhMixhMixjPT09Mj8iPT0iOiI9Iil9cmV0dXJuIGEw
-fX0KUC5VOC5wcm90b3R5cGU9e30KUC5Vay5wcm90b3R5cGU9e30KUC53SS5wcm90b3R5cGU9e30KUC5a
-aS5wcm90b3R5cGU9e30KUC5VZC5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3ZhciBzPVAuaGwodGhp
-cy5hKQpyZXR1cm4odGhpcy5iIT1udWxsPyJDb252ZXJ0aW5nIG9iamVjdCB0byBhbiBlbmNvZGFibGUg
-b2JqZWN0IGZhaWxlZDoiOiJDb252ZXJ0aW5nIG9iamVjdCBkaWQgbm90IHJldHVybiBhbiBlbmNvZGFi
-bGUgb2JqZWN0OiIpKyIgIitzfX0KUC5LOC5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3JldHVybiJD
-eWNsaWMgZXJyb3IgaW4gSlNPTiBzdHJpbmdpZnkifX0KUC5ieS5wcm90b3R5cGU9ewpwVzpmdW5jdGlv
-bihhLGIsYyl7dmFyIHMKdC5mVi5hKGMpCnM9UC5CUyhiLHRoaXMuZ0hlKCkuYSkKcmV0dXJuIHN9LApP
-QjpmdW5jdGlvbihhLGIpe3ZhciBzCnQuZEEuYShiKQpzPVAudVgoYSx0aGlzLmdaRSgpLmIsbnVsbCkK
-cmV0dXJuIHN9LApnWkU6ZnVuY3Rpb24oKXtyZXR1cm4gQy5uWH0sCmdIZTpmdW5jdGlvbigpe3JldHVy
-biBDLkEzfX0KUC5vai5wcm90b3R5cGU9e30KUC5NeC5wcm90b3R5cGU9e30KUC5TaC5wcm90b3R5cGU9
-ewp2cDpmdW5jdGlvbihhKXt2YXIgcyxyLHEscCxvLG4sbSxsPWEubGVuZ3RoCmZvcihzPUouclkoYSks
-cj10aGlzLmMscT0wLHA9MDtwPGw7KytwKXtvPXMuVyhhLHApCmlmKG8+OTIpe2lmKG8+PTU1Mjk2KXtu
-PW8mNjQ1MTIKaWYobj09PTU1Mjk2KXttPXArMQptPSEobTxsJiYoQy54Qi5XKGEsbSkmNjQ1MTIpPT09
-NTYzMjApfWVsc2UgbT0hMQppZighbSlpZihuPT09NTYzMjApe249cC0xCm49IShuPj0wJiYoQy54Qi5t
-KGEsbikmNjQ1MTIpPT09NTUyOTYpfWVsc2Ugbj0hMQplbHNlIG49ITAKaWYobil7aWYocD5xKXIuYSs9
-Qy54Qi5OaihhLHEscCkKcT1wKzEKci5hKz1ILkx3KDkyKQpyLmErPUguTHcoMTE3KQpyLmErPUguTHco
-MTAwKQpuPW8+Pj44JjE1CnIuYSs9SC5MdyhuPDEwPzQ4K246ODcrbikKbj1vPj4+NCYxNQpyLmErPUgu
-THcobjwxMD80OCtuOjg3K24pCm49byYxNQpyLmErPUguTHcobjwxMD80OCtuOjg3K24pfX1jb250aW51
-ZX1pZihvPDMyKXtpZihwPnEpci5hKz1DLnhCLk5qKGEscSxwKQpxPXArMQpyLmErPUguTHcoOTIpCnN3
-aXRjaChvKXtjYXNlIDg6ci5hKz1ILkx3KDk4KQpicmVhawpjYXNlIDk6ci5hKz1ILkx3KDExNikKYnJl
-YWsKY2FzZSAxMDpyLmErPUguTHcoMTEwKQpicmVhawpjYXNlIDEyOnIuYSs9SC5MdygxMDIpCmJyZWFr
-CmNhc2UgMTM6ci5hKz1ILkx3KDExNCkKYnJlYWsKZGVmYXVsdDpyLmErPUguTHcoMTE3KQpyLmErPUgu
-THcoNDgpCnIuYSs9SC5Mdyg0OCkKbj1vPj4+NCYxNQpyLmErPUguTHcobjwxMD80OCtuOjg3K24pCm49
-byYxNQpyLmErPUguTHcobjwxMD80OCtuOjg3K24pCmJyZWFrfX1lbHNlIGlmKG89PT0zNHx8bz09PTky
-KXtpZihwPnEpci5hKz1DLnhCLk5qKGEscSxwKQpxPXArMQpyLmErPUguTHcoOTIpCnIuYSs9SC5Mdyhv
-KX19aWYocT09PTApci5hKz1ILkVqKGEpCmVsc2UgaWYocTxsKXIuYSs9cy5OaihhLHEsbCl9LApKbjpm
-dW5jdGlvbihhKXt2YXIgcyxyLHEscApmb3Iocz10aGlzLmEscj1zLmxlbmd0aCxxPTA7cTxyOysrcSl7
-cD1zW3FdCmlmKGE9PW51bGw/cD09bnVsbDphPT09cCl0aHJvdyBILmIobmV3IFAuSzgoYSxudWxsKSl9
-Qy5ObS5pKHMsYSl9LAppVTpmdW5jdGlvbihhKXt2YXIgcyxyLHEscCxvPXRoaXMKaWYoby50TShhKSly
-ZXR1cm4Kby5KbihhKQp0cnl7cz1vLmIuJDEoYSkKaWYoIW8udE0ocykpe3E9UC5HeShhLG51bGwsby5n
-VksoKSkKdGhyb3cgSC5iKHEpfXE9by5hCmlmKDA+PXEubGVuZ3RoKXJldHVybiBILk9IKHEsLTEpCnEu
-cG9wKCl9Y2F0Y2gocCl7cj1ILlJ1KHApCnE9UC5HeShhLHIsby5nVksoKSkKdGhyb3cgSC5iKHEpfX0s
-CnRNOmZ1bmN0aW9uKGEpe3ZhciBzLHIscT10aGlzCmlmKHR5cGVvZiBhPT0ibnVtYmVyIil7aWYoIWlz
-RmluaXRlKGEpKXJldHVybiExCnEuYy5hKz1DLkNELncoYSkKcmV0dXJuITB9ZWxzZSBpZihhPT09ITAp
-e3EuYy5hKz0idHJ1ZSIKcmV0dXJuITB9ZWxzZSBpZihhPT09ITEpe3EuYy5hKz0iZmFsc2UiCnJldHVy
-biEwfWVsc2UgaWYoYT09bnVsbCl7cS5jLmErPSJudWxsIgpyZXR1cm4hMH1lbHNlIGlmKHR5cGVvZiBh
-PT0ic3RyaW5nIil7cz1xLmMKcy5hKz0nIicKcS52cChhKQpzLmErPSciJwpyZXR1cm4hMH1lbHNlIGlm
-KHQuai5iKGEpKXtxLkpuKGEpCnEubEsoYSkKcz1xLmEKaWYoMD49cy5sZW5ndGgpcmV0dXJuIEguT0go
-cywtMSkKcy5wb3AoKQpyZXR1cm4hMH1lbHNlIGlmKHQuZi5iKGEpKXtxLkpuKGEpCnI9cS5qdyhhKQpz
-PXEuYQppZigwPj1zLmxlbmd0aClyZXR1cm4gSC5PSChzLC0xKQpzLnBvcCgpCnJldHVybiByfWVsc2Ug
-cmV0dXJuITF9LApsSzpmdW5jdGlvbihhKXt2YXIgcyxyLHE9dGhpcy5jCnEuYSs9IlsiCnM9Si5VNihh
-KQppZihzLmdvcihhKSl7dGhpcy5pVShzLnEoYSwwKSkKZm9yKHI9MTtyPHMuZ0EoYSk7KytyKXtxLmEr
-PSIsIgp0aGlzLmlVKHMucShhLHIpKX19cS5hKz0iXSJ9LApqdzpmdW5jdGlvbihhKXt2YXIgcyxyLHEs
-cCxvLG49dGhpcyxtPXt9CmlmKGEuZ2wwKGEpKXtuLmMuYSs9Int9IgpyZXR1cm4hMH1zPVAuTzgoYS5n
-QShhKSoyLG51bGwsITEsdC5XKQpyPW0uYT0wCm0uYj0hMAphLksoMCxuZXcgUC50aShtLHMpKQppZigh
-bS5iKXJldHVybiExCnE9bi5jCnEuYSs9InsiCmZvcihwPSciJztyPHMubGVuZ3RoO3IrPTIscD0nLCIn
-KXtxLmErPXAKbi52cChILmgoc1tyXSkpCnEuYSs9JyI6JwpvPXIrMQppZihvPj1zLmxlbmd0aClyZXR1
-cm4gSC5PSChzLG8pCm4uaVUoc1tvXSl9cS5hKz0ifSIKcmV0dXJuITB9fQpQLnRpLnByb3RvdHlwZT17
-CiQyOmZ1bmN0aW9uKGEsYil7dmFyIHMscgppZih0eXBlb2YgYSE9InN0cmluZyIpdGhpcy5hLmI9ITEK
-cz10aGlzLmIKcj10aGlzLmEKQy5ObS5ZKHMsci5hKyssYSkKQy5ObS5ZKHMsci5hKyssYil9LAokUzox
-Mn0KUC50dS5wcm90b3R5cGU9ewpnVks6ZnVuY3Rpb24oKXt2YXIgcz10aGlzLmMuYQpyZXR1cm4gcy5j
-aGFyQ29kZUF0KDApPT0wP3M6c319ClAudTUucHJvdG90eXBlPXsKZ1pFOmZ1bmN0aW9uKCl7cmV0dXJu
-IEMuUWt9fQpQLkUzLnByb3RvdHlwZT17CldKOmZ1bmN0aW9uKGEpe3ZhciBzLHIscT1QLmpCKDAsbnVs
-bCxhLmxlbmd0aCkscD1xLTAKaWYocD09PTApcmV0dXJuIG5ldyBVaW50OEFycmF5KDApCnM9bmV3IFVp
-bnQ4QXJyYXkocCozKQpyPW5ldyBQLlJ3KHMpCmlmKHIuR3goYSwwLHEpIT09cSl7Si5hNihhLHEtMSkK
-ci5STygpfXJldHVybiBuZXcgVWludDhBcnJheShzLnN1YmFycmF5KDAsSC5yTSgwLHIuYixzLmxlbmd0
-aCkpKX19ClAuUncucHJvdG90eXBlPXsKUk86ZnVuY3Rpb24oKXt2YXIgcz10aGlzLHI9cy5jLHE9cy5i
-LHA9cy5iPXErMSxvPXIubGVuZ3RoCmlmKHE+PW8pcmV0dXJuIEguT0gocixxKQpyW3FdPTIzOQpxPXMu
-Yj1wKzEKaWYocD49bylyZXR1cm4gSC5PSChyLHApCnJbcF09MTkxCnMuYj1xKzEKaWYocT49bylyZXR1
-cm4gSC5PSChyLHEpCnJbcV09MTg5fSwKTzY6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyLHEscCxvLG49dGhp
-cwppZigoYiY2NDUxMik9PT01NjMyMCl7cz02NTUzNisoKGEmMTAyMyk8PDEwKXxiJjEwMjMKcj1uLmMK
-cT1uLmIKcD1uLmI9cSsxCm89ci5sZW5ndGgKaWYocT49bylyZXR1cm4gSC5PSChyLHEpCnJbcV09MjQw
-fHM+Pj4xOApxPW4uYj1wKzEKaWYocD49bylyZXR1cm4gSC5PSChyLHApCnJbcF09MTI4fHM+Pj4xMiY2
-MwpwPW4uYj1xKzEKaWYocT49bylyZXR1cm4gSC5PSChyLHEpCnJbcV09MTI4fHM+Pj42JjYzCm4uYj1w
-KzEKaWYocD49bylyZXR1cm4gSC5PSChyLHApCnJbcF09MTI4fHMmNjMKcmV0dXJuITB9ZWxzZXtuLlJP
-KCkKcmV0dXJuITF9fSwKR3g6ZnVuY3Rpb24oYSxiLGMpe3ZhciBzLHIscSxwLG8sbixtLGw9dGhpcwpp
-ZihiIT09YyYmKEMueEIubShhLGMtMSkmNjQ1MTIpPT09NTUyOTYpLS1jCmZvcihzPWwuYyxyPXMubGVu
-Z3RoLHE9YjtxPGM7KytxKXtwPUMueEIuVyhhLHEpCmlmKHA8PTEyNyl7bz1sLmIKaWYobz49cilicmVh
-awpsLmI9bysxCnNbb109cH1lbHNle289cCY2NDUxMgppZihvPT09NTUyOTYpe2lmKGwuYis0PnIpYnJl
-YWsKbj1xKzEKaWYobC5PNihwLEMueEIuVyhhLG4pKSlxPW59ZWxzZSBpZihvPT09NTYzMjApe2lmKGwu
-YiszPnIpYnJlYWsKbC5STygpfWVsc2UgaWYocDw9MjA0Nyl7bz1sLmIKbT1vKzEKaWYobT49cilicmVh
-awpsLmI9bQppZihvPj1yKXJldHVybiBILk9IKHMsbykKc1tvXT0xOTJ8cD4+PjYKbC5iPW0rMQpzW21d
-PTEyOHxwJjYzfWVsc2V7bz1sLmIKaWYobysyPj1yKWJyZWFrCm09bC5iPW8rMQppZihvPj1yKXJldHVy
-biBILk9IKHMsbykKc1tvXT0yMjR8cD4+PjEyCm89bC5iPW0rMQppZihtPj1yKXJldHVybiBILk9IKHMs
-bSkKc1ttXT0xMjh8cD4+PjYmNjMKbC5iPW8rMQppZihvPj1yKXJldHVybiBILk9IKHMsbykKc1tvXT0x
-Mjh8cCY2M319fXJldHVybiBxfX0KUC5HWS5wcm90b3R5cGU9ewpXSjpmdW5jdGlvbihhKXt2YXIgcyxy
-CnQuTC5hKGEpCnM9dGhpcy5hCnI9UC5reShzLGEsMCxudWxsKQppZihyIT1udWxsKXJldHVybiByCnJl
-dHVybiBuZXcgUC5ieihzKS5OZShhLDAsbnVsbCwhMCl9fQpQLmJ6LnByb3RvdHlwZT17Ck5lOmZ1bmN0
-aW9uKGEsYixjLGQpe3ZhciBzLHIscSxwLG8sbj10aGlzCnQuTC5hKGEpCnM9UC5qQihiLGMsSi5IbShh
-KSkKaWYoYj09PXMpcmV0dXJuIiIKcj1QLmp5KGEsYixzKQpxPW4uaE8ociwwLHMtYiwhMCkKcD1uLmIK
-aWYoKHAmMSkhPT0wKXtvPVAuajQocCkKbi5iPTAKdGhyb3cgSC5iKFAucnIobyxhLGIrbi5jKSl9cmV0
-dXJuIHF9LApoTzpmdW5jdGlvbihhLGIsYyxkKXt2YXIgcyxyLHE9dGhpcwppZihjLWI+MTAwMCl7cz1D
-LmpuLkJVKGIrYywyKQpyPXEuaE8oYSxiLHMsITEpCmlmKChxLmImMSkhPT0wKXJldHVybiByCnJldHVy
-biByK3EuaE8oYSxzLGMsZCl9cmV0dXJuIHEuRWgoYSxiLGMsZCl9LApFaDpmdW5jdGlvbihhLGIsYyxk
-KXt2YXIgcyxyLHEscCxvLG4sbSxsLGs9dGhpcyxqPTY1NTMzLGk9ay5iLGg9ay5jLGc9bmV3IFAuUm4o
-IiIpLGY9YisxLGU9YS5sZW5ndGgKaWYoYjwwfHxiPj1lKXJldHVybiBILk9IKGEsYikKcz1hW2JdCiRs
-YWJlbDAkMDpmb3Iocj1rLmE7ITA7KXtmb3IoOyEwO2Y9byl7cT1DLnhCLlcoIkFBQUFBQUFBQUFBQUFB
+KX0sCm5XOmZ1bmN0aW9uKGEpe3ZhciBzPTAscj1QLkZYKHQueikscT0xLHAsbz1bXSxuLG0sbCxrLGos
+aSxoCnZhciAkYXN5bmMkaTY9UC5seihmdW5jdGlvbihiLGMpe2lmKGI9PT0xKXtwPWMKcz1xfXdoaWxl
+KHRydWUpc3dpdGNoKHMpe2Nhc2UgMDppPXQuZy5hKFcucWMoYS5jdXJyZW50VGFyZ2V0KSkuZ2V0QXR0
+cmlidXRlKCJocmVmIikKYS5wcmV2ZW50RGVmYXVsdCgpCnE9MwprPWRvY3VtZW50Cm49Qy5DRC56UShr
+LnF1ZXJ5U2VsZWN0b3IoIi5jb250ZW50Iikuc2Nyb2xsVG9wKQpzPTYKcmV0dXJuIFAualEoTC50eShp
+LG51bGwpLCRhc3luYyRpNikKY2FzZSA2OnM9NwpyZXR1cm4gUC5qUShMLkc3KHdpbmRvdy5sb2NhdGlv
+bi5wYXRobmFtZSxudWxsLG51bGwsITEsbnVsbCksJGFzeW5jJGk2KQpjYXNlIDc6az1rLnF1ZXJ5U2Vs
+ZWN0b3IoIi5jb250ZW50IikKay50b1N0cmluZwprLnNjcm9sbFRvcD1KLlZ1KG4pCnE9MQpzPTUKYnJl
+YWsKY2FzZSAzOnE9MgpoPXAKbT1ILlJ1KGgpCmw9SC50cyhoKQpMLkMyKCJDb3VsZCBub3QgYWRkL3Jl
+bW92ZSBoaW50IixtLGwpCnM9NQpicmVhawpjYXNlIDI6cz0xCmJyZWFrCmNhc2UgNTpyZXR1cm4gUC55
+QyhudWxsLHIpCmNhc2UgMTpyZXR1cm4gUC5mMyhwLHIpfX0pCnJldHVybiBQLkRJKCRhc3luYyRpNixy
+KX0sCkMyOmZ1bmN0aW9uKGEsYixjKXt2YXIgcyxyLHEscD0iZXhjZXB0aW9uIixvPSJzdGFja1RyYWNl
+IixuPXQudC5iKGIpJiZKLlJNKGIucSgwLCJzdWNjZXNzIiksITEpJiZiLng0KHApJiZiLng0KG8pLG09
+Si5pYShiKQppZihuKXtzPUguaChtLnEoYixwKSkKYz1tLnEoYixvKX1lbHNlIHM9bS53KGIpCm49ZG9j
+dW1lbnQKcj1uLnF1ZXJ5U2VsZWN0b3IoIi5wb3B1cC1wYW5lIikKci5xdWVyeVNlbGVjdG9yKCJoMiIp
+LmlubmVyVGV4dD1hCnIucXVlcnlTZWxlY3RvcigicCIpLmlubmVyVGV4dD1zCnIucXVlcnlTZWxlY3Rv
+cigicHJlIikuaW5uZXJUZXh0PUouaihjKQpxPXQuZGQuYShyLnF1ZXJ5U2VsZWN0b3IoImEuYm90dG9t
+IikpCm09dC5YOyhxJiZDLnhuKS5zTFUocSxQLlhkKCJodHRwcyIsImdpdGh1Yi5jb20iLCJkYXJ0LWxh
+bmcvc2RrL2lzc3Vlcy9uZXciLFAuRUYoWyJ0aXRsZSIsIkN1c3RvbWVyLXJlcG9ydGVkIGlzc3VlIHdp
+dGggTk5CRCBtaWdyYXRpb24gdG9vbDogIithLCJsYWJlbHMiLHUuZCwiYm9keSIsYSsiXG5cbkVycm9y
+OiAiK0guRWoocykrIlxuXG5QbGVhc2UgZmlsbCBpbiB0aGUgZm9sbG93aW5nOlxuXG4qKk5hbWUgb2Yg
+cGFja2FnZSBiZWluZyBtaWdyYXRlZCAoaWYgcHVibGljKSoqOlxuKipXaGF0IEkgd2FzIGRvaW5nIHdo
+ZW4gdGhpcyBpc3N1ZSBvY2N1cnJlZCoqOlxuKipJcyBpdCBwb3NzaWJsZSB0byB3b3JrIGFyb3VuZCB0
+aGlzIGlzc3VlKio6XG4qKkhhcyB0aGlzIGlzc3VlIGhhcHBlbmVkIGJlZm9yZSwgYW5kIGlmIHNvLCBo
+b3cgb2Z0ZW4qKjpcbioqRGFydCBTREsgdmVyc2lvbioqOiAiK0guRWoobi5nZXRFbGVtZW50QnlJZCgi
+c2RrLXZlcnNpb24iKS50ZXh0Q29udGVudCkrIlxuKipBZGRpdGlvbmFsIGRldGFpbHMqKjpcblxuVGhh
+bmtzIGZvciBmaWxpbmchXG5cblN0YWNrdHJhY2U6IF9hdXRvIHBvcHVsYXRlZCBieSBtaWdyYXRpb24g
+cHJldmlldyB0b29sLl9cblxuYGBgXG4iK0guRWooYykrIlxuYGBgXG4iXSxtLG0pKS5nbkQoKSkKbT1x
+LnN0eWxlCm0uZGlzcGxheT0iaW5pdGlhbCIKbj1yLnN0eWxlCm4uZGlzcGxheT0iaW5pdGlhbCIKbj1h
+KyI6ICIrSC5FaihiKQp3aW5kb3cKaWYodHlwZW9mIGNvbnNvbGUhPSJ1bmRlZmluZWQiKXdpbmRvdy5j
+b25zb2xlLmVycm9yKG4pCndpbmRvdwpuPUguRWooYykKaWYodHlwZW9mIGNvbnNvbGUhPSJ1bmRlZmlu
+ZWQiKXdpbmRvdy5jb25zb2xlLmVycm9yKG4pfSwKdDI6ZnVuY3Rpb24oYSxiLGMpe3ZhciBzLHIscSxw
+LG89dC5nLmEoVy5xYyhhLmN1cnJlbnRUYXJnZXQpKQphLnByZXZlbnREZWZhdWx0KCkKcz1vLmdldEF0
+dHJpYnV0ZSgiaHJlZiIpCnI9TC5VcyhzKQpxPUwuRzYocykKcD1MLmFLKHMpCmlmKHEhPW51bGwpTC5h
+ZihyLHEscCxiLG5ldyBMLm5UKHIscSxwKSkKZWxzZSBMLmFmKHIsbnVsbCxudWxsLGIsbmV3IEwuTlko
+cikpfSwKSzA6ZnVuY3Rpb24oYSl7dmFyIHMscixxLHA9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnBv
+cHVwLXBhbmUiKQpwLnF1ZXJ5U2VsZWN0b3IoImgyIikuaW5uZXJUZXh0PSJGYWlsZWQgdG8gcmVydW4g
+ZnJvbSBzb3VyY2VzIgpwLnF1ZXJ5U2VsZWN0b3IoInAiKS5pbm5lclRleHQ9IlNvdXJjZXMgY29udGFp
+biBzdGF0aWMgYW5hbHlzaXMgZXJyb3JzOiIKcz1wLnF1ZXJ5U2VsZWN0b3IoInByZSIpCnI9Si5FbChh
+LHQuYXcpCnE9SC5MaChyKQpzLmlubmVyVGV4dD1uZXcgSC5sSihyLHEuQygicVUqKGxELkUpIikuYShu
+ZXcgTC51ZSgpKSxxLkMoImxKPGxELkUscVUqPiIpKS5IKDAsIlxuIikKcT1wLnF1ZXJ5U2VsZWN0b3Io
+ImEuYm90dG9tIikuc3R5bGUKcS5kaXNwbGF5PSJub25lIgpzPXAuc3R5bGUKcy5kaXNwbGF5PSJpbml0
+aWFsIn0sCnZVOmZ1bmN0aW9uKCl7dmFyIHM9ZG9jdW1lbnQKSC5EaCh0LmcsdC5oLCJUIiwicXVlcnlT
+ZWxlY3RvckFsbCIpCnM9bmV3IFcud3oocy5xdWVyeVNlbGVjdG9yQWxsKCIuY29kZSIpLHQuVykKcy5L
+KHMsbmV3IEwuZVgoKSl9LApoWDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIEwuWXcoYSxiLGMpfSwKWXc6
+ZnVuY3Rpb24oYSxiLGMpe3ZhciBzPTAscj1QLkZYKHQueikscT0xLHAsbz1bXSxuLG0sbCxrLGosaSxo
+LGcKdmFyICRhc3luYyRoWD1QLmx6KGZ1bmN0aW9uKGQsZSl7aWYoZD09PTEpe3A9ZQpzPXF9d2hpbGUo
+dHJ1ZSlzd2l0Y2gocyl7Y2FzZSAwOnE9MwpqPXQuWApzPTYKcmV0dXJuIFAualEoTC5RNihhLFAuRUYo
+WyJyZWdpb24iLCJyZWdpb24iLCJvZmZzZXQiLEguRWooYildLGosaiksdC50KSwkYXN5bmMkaFgpCmNh
+c2UgNjpuPWUKaj1uCmk9Si5VNihqKQptPW5ldyBVLmQyKFUuamYoaS5xKGosImVkaXRzIikpLEguaChp
+LnEoaiwiZXhwbGFuYXRpb24iKSksSC51UChpLnEoaiwibGluZSIpKSxILmgoaS5xKGosImRpc3BsYXlQ
+YXRoIikpLEguaChpLnEoaiwidXJpUGF0aCIpKSxVLk5kKGkucShqLCJ0cmFjZXMiKSkpCkwuVDEobSkK
+TC5GcihhLGIsYykKTC55WCgiLmVkaXQtcGFuZWwgLnBhbmVsLWNvbnRlbnQiLCExKQpxPTEKcz01CmJy
+ZWFrCmNhc2UgMzpxPTIKZz1wCmw9SC5SdShnKQprPUgudHMoZykKTC5DMigiQ291bGQgbm90IGxvYWQg
+ZWRpdCBkZXRhaWxzIixsLGspCnM9NQpicmVhawpjYXNlIDI6cz0xCmJyZWFrCmNhc2UgNTpyZXR1cm4g
+UC55QyhudWxsLHIpCmNhc2UgMTpyZXR1cm4gUC5mMyhwLHIpfX0pCnJldHVybiBQLkRJKCRhc3luYyRo
+WCxyKX0sCkc3OmZ1bmN0aW9uKGEsYixjLGQsZSl7cmV0dXJuIEwuTDUoYSxiLGMsZCxlKX0sCkw1OmZ1
+bmN0aW9uKGEsYixjLGQsZSl7dmFyIHM9MCxyPVAuRlgodC5IKSxxLHA9MixvLG49W10sbSxsLGssaixp
+LGgsZwp2YXIgJGFzeW5jJEc3PVAubHooZnVuY3Rpb24oZixhMCl7aWYoZj09PTEpe289YTAKcz1wfXdo
+aWxlKHRydWUpc3dpdGNoKHMpe2Nhc2UgMDppZighSi5wNChhLCIuZGFydCIpKXtMLkJFKGEsQi53Uigp
+LGQpCkwuQlgoYSxudWxsKQppZihlIT1udWxsKWUuJDAoKQpzPTEKYnJlYWt9cD00Cmk9dC5YCnM9Nwpy
+ZXR1cm4gUC5qUShMLlE2KGEsUC5FRihbImlubGluZSIsInRydWUiXSxpLGkpLHQudCksJGFzeW5jJEc3
+KQpjYXNlIDc6bT1hMApMLkJFKGEsQi5ZZihtKSxkKQpMLmZHKGIsYykKbD1MLlVzKGEpCkwuQlgobCxi
+KQppZihlIT1udWxsKWUuJDAoKQpwPTIKcz02CmJyZWFrCmNhc2UgNDpwPTMKZz1vCms9SC5SdShnKQpq
+PUgudHMoZykKTC5DMigiQ291bGQgbm90IGxvYWQgZGFydCBmaWxlICIrYSxrLGopCnM9NgpicmVhawpj
+YXNlIDM6cz0yCmJyZWFrCmNhc2UgNjpjYXNlIDE6cmV0dXJuIFAueUMocSxyKQpjYXNlIDI6cmV0dXJu
+IFAuZjMobyxyKX19KQpyZXR1cm4gUC5ESSgkYXN5bmMkRzcscil9LApHZTpmdW5jdGlvbigpe3ZhciBz
+PTAscj1QLkZYKHQueikscT0xLHAsbz1bXSxuLG0sbCxrLGosaSxoCnZhciAkYXN5bmMkR2U9UC5seihm
+dW5jdGlvbihhLGIpe2lmKGE9PT0xKXtwPWIKcz1xfXdoaWxlKHRydWUpc3dpdGNoKHMpe2Nhc2UgMDpp
+PSIvX3ByZXZpZXcvbmF2aWdhdGlvblRyZWUuanNvbiIKcT0zCnM9NgpyZXR1cm4gUC5qUShMLlE2KGks
+Qy5DTSx0Lm0pLCRhc3luYyRHZSkKY2FzZSA2Om49YgptPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5u
+YXYtdHJlZSIpCkoubDUobSwiIikKTC50WChtLEwubUsobikpCnE9MQpzPTUKYnJlYWsKY2FzZSAzOnE9
+MgpoPXAKbD1ILlJ1KGgpCms9SC50cyhoKQpMLkMyKCJDb3VsZCBub3QgbG9hZCBuYXZpZ2F0aW9uIHRy
+ZWUiLGwsaykKcz01CmJyZWFrCmNhc2UgMjpzPTEKYnJlYWsKY2FzZSA1OnJldHVybiBQLnlDKG51bGws
+cikKY2FzZSAxOnJldHVybiBQLmYzKHAscil9fSkKcmV0dXJuIFAuREkoJGFzeW5jJEdlLHIpfSwKcU86
+ZnVuY3Rpb24oYSl7dmFyIHMscj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLHE9Qy5DRC56USgkLmZp
+KCkub2Zmc2V0SGVpZ2h0KSxwPXdpbmRvdy5pbm5lckhlaWdodCxvPUMuQ0QuelEoJC5EVygpLm9mZnNl
+dEhlaWdodCkKaWYodHlwZW9mIHAhPT0ibnVtYmVyIilyZXR1cm4gcC5ITigpCnM9ci5ib3R0b20Kcy50
+b1N0cmluZwppZihzPnAtKG8rMTQpKUouZGgoYSkKZWxzZXtwPXIudG9wCnAudG9TdHJpbmcKaWYocDxx
+KzE0KUouZGgoYSl9fSwKZkc6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyLHEscCxvCmlmKGEhPW51bGwpe3M9
+ZG9jdW1lbnQKcj1zLmdldEVsZW1lbnRCeUlkKCJvIitILkVqKGEpKQpxPXMucXVlcnlTZWxlY3Rvcigi
+LmxpbmUtIitILkVqKGIpKQppZihyIT1udWxsKXtMLnFPKHIpCkouZFIocikuaSgwLCJ0YXJnZXQiKX1l
+bHNlIGlmKHEhPW51bGwpTC5xTyhxLnBhcmVudEVsZW1lbnQpCmlmKHEhPW51bGwpSi5kUih0LmcuYShx
+LnBhcmVudE5vZGUpKS5pKDAsImhpZ2hsaWdodCIpfWVsc2V7cz1kb2N1bWVudApwPXQuZwpILkRoKHAs
+dC5oLCJUIiwicXVlcnlTZWxlY3RvckFsbCIpCnM9cy5xdWVyeVNlbGVjdG9yQWxsKCIubGluZS1ubyIp
+Cm89bmV3IFcud3oocyx0LlcpCmlmKG8uZ0Eobyk9PT0wKXJldHVybgpMLnFPKHAuYShDLnQ1Lmd0SChz
+KSkpfX0sCmFmOmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIHMscixxPUwuRzYod2luZG93LmxvY2F0aW9u
+LmhyZWYpLHA9TC5hSyh3aW5kb3cubG9jYXRpb24uaHJlZikKaWYocSE9bnVsbCl7cz1kb2N1bWVudC5n
+ZXRFbGVtZW50QnlJZCgibyIrSC5FaihxKSkKaWYocyE9bnVsbClKLmRSKHMpLlIoMCwidGFyZ2V0Iil9
+aWYocCE9bnVsbCl7cj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIubGluZS0iK0guRWoocCkpCmlmKHIh
+PW51bGwpSi5kUihyLnBhcmVudEVsZW1lbnQpLlIoMCwiaGlnaGxpZ2h0Iil9aWYoYT09d2luZG93Lmxv
+Y2F0aW9uLnBhdGhuYW1lKXtMLmZHKGIsYykKZS4kMCgpfWVsc2UgTC5HNyhhLGIsYyxkLGUpfSwKUTQ6
+ZnVuY3Rpb24oYSxiKXt2YXIgcyxyLHE9UC5oSyhhKSxwPXQuWApwPVAuRmwocCxwKQpmb3Iocz1xLmdo
+WSgpLHM9cy5nUHUocykscz1zLmdtKHMpO3MuRigpOyl7cj1zLmdsKCkKcC5ZKDAsci5hLHIuYil9Zm9y
+KHM9Yi5nUHUoYikscz1zLmdtKHMpO3MuRigpOyl7cj1zLmdsKCkKcC5ZKDAsci5hLHIuYil9cC5ZKDAs
+ImF1dGhUb2tlbiIsJC5VRSgpKQpyZXR1cm4gcS5ubSgwLHApLmduRCgpfSwKVDE6ZnVuY3Rpb24oYSl7
+dmFyIHMscixxLHAsbyxuLG0sbCxrLGo9JC5oTCgpCkoubDUoaiwiIikKaWYoYT09bnVsbCl7cz1kb2N1
+bWVudC5jcmVhdGVFbGVtZW50KCJwIikKQy5MdC5zYTQocywiU2VlIGRldGFpbHMgYWJvdXQgYSBwcm9w
+b3NlZCBlZGl0LiIpCkMuTHQuc0QocyxILlZNKFsicGxhY2Vob2xkZXIiXSx0LmkpKQpqLmFwcGVuZENo
+aWxkKHMpCkMuTHQuRkYocykKcmV0dXJufXI9YS5kCnE9JC5uVSgpCnA9cS56ZihyKQpvPWEuYgpuPWRv
+Y3VtZW50Cm09cS5IUChyLEouVDAobi5xdWVyeVNlbGVjdG9yKCIucm9vdCIpLnRleHRDb250ZW50KSkK
+bD1hLmMKaz1uLmNyZWF0ZUVsZW1lbnQoInAiKQpqLmFwcGVuZENoaWxkKGspCmsuYXBwZW5kQ2hpbGQo
+bi5jcmVhdGVUZXh0Tm9kZShILkVqKG8pKyIgYXQgIikpCnE9dC5YCnE9Vy5KNihMLlE0KGEuZSxQLkVG
+KFsibGluZSIsSi5qKGwpXSxxLHEpKSkKcS5hcHBlbmRDaGlsZChuLmNyZWF0ZVRleHROb2RlKEguRWoo
+bSkrIjoiK0guRWoobCkrIi4iKSkKay5hcHBlbmRDaGlsZChxKQpKLmRoKGspCkwuQ0MoYSxqLHApCkwu
+RnooYSxqKX0sCkxIOmZ1bmN0aW9uKGEsYixjKXt2YXIgcyxyLHEscCxvLG4sbSxsLGssaixpLGgsZyxm
+LGU9JC55UCgpCkoubDUoZSwiIikKaWYoYi5nQShiKT09PTApe3M9ZG9jdW1lbnQKcj1zLmNyZWF0ZUVs
+ZW1lbnQoInAiKQplLmFwcGVuZENoaWxkKHIpCnIuYXBwZW5kQ2hpbGQocy5jcmVhdGVUZXh0Tm9kZSgi
+Tm8gcHJvcG9zZWQgZWRpdHMiKSl9ZWxzZSBmb3IoZT1iLmdQdShiKSxlPWUuZ20oZSkscz10LlgscT10
+LmsscD1xLkMoIn4oMSk/Iiksbz10LloscT1xLmM7ZS5GKCk7KXtuPWUuZ2woKQptPWRvY3VtZW50CnI9
+bS5jcmVhdGVFbGVtZW50KCJwIikKbD0kLnlQKCkKbC5hcHBlbmRDaGlsZChyKQpyLmFwcGVuZENoaWxk
+KG0uY3JlYXRlVGV4dE5vZGUoSC5FaihuLmEpKyI6IikpCms9bS5jcmVhdGVFbGVtZW50KCJ1bCIpCmwu
+YXBwZW5kQ2hpbGQoaykKZm9yKG49Si5JVChuLmIpO24uRigpOyl7bD1uLmdsKCkKaj1tLmNyZWF0ZUVs
+ZW1lbnQoImxpIikKay5hcHBlbmRDaGlsZChqKQpKLmRSKGopLmkoMCwiZWRpdCIpCmk9bS5jcmVhdGVF
+bGVtZW50KCJhIikKai5hcHBlbmRDaGlsZChpKQppLmNsYXNzTGlzdC5hZGQoImVkaXQtbGluayIpCmg9
+bC5jCmc9SC5FaihoKQppLnNldEF0dHJpYnV0ZSgiZGF0YS0iK25ldyBXLlN5KG5ldyBXLmk3KGkpKS5P
+KCJvZmZzZXQiKSxnKQpmPWwuYQpnPUguRWooZikKaS5zZXRBdHRyaWJ1dGUoImRhdGEtIituZXcgVy5T
+eShuZXcgVy5pNyhpKSkuTygibGluZSIpLGcpCmkuYXBwZW5kQ2hpbGQobS5jcmVhdGVUZXh0Tm9kZSgi
+bGluZSAiK0guRWooZikpKQppLnNldEF0dHJpYnV0ZSgiaHJlZiIsTC5RNCh3aW5kb3cubG9jYXRpb24u
+cGF0aG5hbWUsUC5FRihbImxpbmUiLEguRWooZiksIm9mZnNldCIsSC5FaihoKV0scyxzKSkpCmc9cC5h
+KG5ldyBMLkVFKGgsZixhKSkKby5hKG51bGwpClcuSkUoaSwiY2xpY2siLGcsITEscSkKai5hcHBlbmRD
+aGlsZChtLmNyZWF0ZVRleHROb2RlKCI6ICIrSC5FaihsLmIpKSl9fWlmKGMpTC5UMShudWxsKX0sCkZy
+OmZ1bmN0aW9uKGEsYixjKXt2YXIgcyxyLHE9d2luZG93LmxvY2F0aW9uLHA9UC5oSygocSYmQy5FeCku
+Z0RyKHEpK0guRWooYSkpCnE9dC5YCnE9UC5GbChxLHEpCmlmKGIhPW51bGwpcS5ZKDAsIm9mZnNldCIs
+SC5FaihiKSkKaWYoYyE9bnVsbClxLlkoMCwibGluZSIsSC5FaihjKSkKcS5ZKDAsImF1dGhUb2tlbiIs
+JC5VRSgpKQpwPXAubm0oMCxxKQpxPXdpbmRvdy5oaXN0b3J5CnM9dC56CnI9cC5nbkQoKQpxLnRvU3Ry
+aW5nCnEucHVzaFN0YXRlKG5ldyBQLkJmKFtdLFtdKS5QdihQLkZsKHMscykpLCIiLHIpfSwKRW46ZnVu
+Y3Rpb24oYSl7dmFyIHM9Si5iYihkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIucm9vdCIpLnRleHRDb250
+ZW50LCIvIikKaWYoQy54Qi5uKGEscykpcmV0dXJuIEMueEIuRyhhLHMubGVuZ3RoKQplbHNlIHJldHVy
+biBhfSwKQlg6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyPXt9CnIuYT1hCmE9TC5FbihhKQpyLmE9YQpKLmRy
+KCQuRDkoKSxhKQpzPWRvY3VtZW50CkguRGgodC5nLHQuaCwiVCIsInF1ZXJ5U2VsZWN0b3JBbGwiKQpz
+PW5ldyBXLnd6KHMucXVlcnlTZWxlY3RvckFsbCgiLm5hdi1wYW5lbCAubmF2LWxpbmsiKSx0LlcpCnMu
+SyhzLG5ldyBMLlZTKHIpKX0sCkJFOmZ1bmN0aW9uKGEsYixjKXt2YXIgcz0iLnJlZ2lvbnMiLHI9ZG9j
+dW1lbnQscT1yLnF1ZXJ5U2VsZWN0b3IocykscD1yLnF1ZXJ5U2VsZWN0b3IoIi5jb2RlIikKSi50SChx
+LGIuYSwkLktHKCkpCkoudEgocCxiLmIsJC5LRygpKQpMLkxIKGEsYi5kLGMpCkwudlUoKQpMLnlYKCIu
+Y29kZSIsITApCkwueVgocywhMCl9LAp0WDpmdW5jdGlvbihhLGIpe3ZhciBzLHIscSxwLG8sbixtLGws
+ayxqLGksaCxnLGYsZT1kb2N1bWVudCxkPWUuY3JlYXRlRWxlbWVudCgidWwiKQphLmFwcGVuZENoaWxk
+KGQpCmZvcihzPWIubGVuZ3RoLHI9dC5YLHE9dC5aLHA9MDtwPGIubGVuZ3RoO2IubGVuZ3RoPT09c3x8
+KDAsSC5saykoYiksKytwKXtvPWJbcF0Kbj1lLmNyZWF0ZUVsZW1lbnQoImxpIikKZC5hcHBlbmRDaGls
+ZChuKQptPUouWUUobikKaWYoby5hPT09Qy5ZMil7bS5nRChuKS5pKDAsImRpciIpCmw9ZS5jcmVhdGVF
+bGVtZW50KCJzcGFuIikKbi5hcHBlbmRDaGlsZChsKQptPUouWUUobCkKbS5nRChsKS5pKDAsImFycm93
+IikKbS5zaGYobCwiJiN4MjVCQzsiKQprPWUuY3JlYXRlRWxlbWVudCgic3BhbiIpCm4uYXBwZW5kQ2hp
+bGQoaykKSi5sNShrLCc8c3BhbiBjbGFzcz0ibWF0ZXJpYWwtaWNvbnMiPmZvbGRlcl9vcGVuPC9zcGFu
+PicpCm4uYXBwZW5kQ2hpbGQoZS5jcmVhdGVUZXh0Tm9kZShvLmIpKQpMLnRYKG4sby5jKQpMLmt6KGwp
+fWVsc2V7bS5zaGYobiwnPHNwYW4gY2xhc3M9Im1hdGVyaWFsLWljb25zIj5pbnNlcnRfZHJpdmVfZmls
+ZTwvc3Bhbj4nKQpqPWUuY3JlYXRlRWxlbWVudCgiYSIpCm4uYXBwZW5kQ2hpbGQoaikKbT1KLllFKGop
+Cm0uZ0QoaikuaSgwLCJuYXYtbGluayIpCmouc2V0QXR0cmlidXRlKCJkYXRhLSIrbmV3IFcuU3kobmV3
+IFcuaTcoaikpLk8oIm5hbWUiKSxvLmQpCmouc2V0QXR0cmlidXRlKCJocmVmIixMLlE0KG8uZSxQLkZs
+KHIscikpKQpqLmFwcGVuZENoaWxkKGUuY3JlYXRlVGV4dE5vZGUoby5iKSkKbT1tLmdWbChqKQppPW0u
+JHRpCmg9aS5DKCJ+KDEpPyIpLmEobmV3IEwuVEQoKSkKcS5hKG51bGwpClcuSkUobS5hLG0uYixoLCEx
+LGkuYykKZz1vLmYKaWYodHlwZW9mIGchPT0ibnVtYmVyIilyZXR1cm4gZy5vcygpCmlmKGc+MCl7Zj1l
+LmNyZWF0ZUVsZW1lbnQoInNwYW4iKQpuLmFwcGVuZENoaWxkKGYpCkouZFIoZikuaSgwLCJlZGl0LWNv
+dW50IikKbT0iIitnKyIgIgppZihnPT09MSlpPSJlZGl0IgplbHNlIGk9ImVkaXRzIgpmLnNldEF0dHJp
+YnV0ZSgidGl0bGUiLG0raSkKZi5hcHBlbmRDaGlsZChlLmNyZWF0ZVRleHROb2RlKEMuam4udyhnKSkp
+fX19fSwKdXo6ZnVuY3Rpb24oYSxiLGMpe3ZhciBzPWRvY3VtZW50LHI9cy5jcmVhdGVFbGVtZW50KCJi
+dXR0b24iKSxxPXQuayxwPXEuQygifigxKT8iKS5hKG5ldyBMLm0yKGEsYykpCnQuWi5hKG51bGwpClcu
+SkUociwiY2xpY2siLHAsITEscS5jKQpyLmFwcGVuZENoaWxkKHMuY3JlYXRlVGV4dE5vZGUoTS5PWChh
+LmEpKSkKYi5hcHBlbmRDaGlsZChyKX0sCkZ6OmZ1bmN0aW9uKGEsYil7dmFyIHMscixxLHAsbyxuLG0s
+bCxrLGosaSxoPWEuYQppZihoPT1udWxsKXJldHVybgpzPWRvY3VtZW50CnI9cy5jcmVhdGVFbGVtZW50
+KCJwIikKcT1iLmFwcGVuZENoaWxkKHIpCnI9cy5jcmVhdGVFbGVtZW50KCJzcGFuIikKcD10LmkKSi5N
+dShyLEguVk0oWyJ0eXBlLWRlc2NyaXB0aW9uIl0scCkpCnIuYXBwZW5kQ2hpbGQocy5jcmVhdGVUZXh0
+Tm9kZSgiQWN0aW9ucyIpKQpxLmFwcGVuZENoaWxkKHIpCnEuYXBwZW5kQ2hpbGQocy5jcmVhdGVUZXh0
+Tm9kZSgiOiIpKQpvPXMuY3JlYXRlRWxlbWVudCgicCIpCmIuYXBwZW5kQ2hpbGQobykKZm9yKHI9aC5s
+ZW5ndGgsbj10LlEsbT0wO208aC5sZW5ndGg7aC5sZW5ndGg9PT1yfHwoMCxILmxrKShoKSwrK20pe2w9
+aFttXQprPXMuY3JlYXRlRWxlbWVudCgiYSIpCm8uYXBwZW5kQ2hpbGQoaykKay5hcHBlbmRDaGlsZChz
+LmNyZWF0ZVRleHROb2RlKGwuYSkpCmsuc2V0QXR0cmlidXRlKCJocmVmIixsLmIpCmo9bi5hKEguVk0o
+WyJhZGQtaGludC1saW5rIiwiYmVmb3JlLWFwcGx5IiwiYnV0dG9uIl0scCkpCmk9Si5kUihrKQppLlYx
+KDApCmkuRlYoMCxqKX19LApDQzpmdW5jdGlvbihhNCxhNSxhNil7dmFyIHMscixxLHAsbyxuLG0sbCxr
+LGosaSxoLGcsZixlLGQsYyxiLGEsYTAsYTEsYTIsYTMKZm9yKHM9YTQuZixyPXMubGVuZ3RoLHE9dC5p
+LHA9dC5RLG89MDtvPHMubGVuZ3RoO3MubGVuZ3RoPT09cnx8KDAsSC5saykocyksKytvKXtuPXNbb10K
+bT1kb2N1bWVudApsPW0uY3JlYXRlRWxlbWVudCgicCIpCms9cC5hKEguVk0oWyJ0cmFjZSJdLHEpKQpq
+PUouZFIobCkKai5WMSgwKQpqLkZWKDAsaykKaT1hNS5hcHBlbmRDaGlsZChsKQpsPW0uY3JlYXRlRWxl
+bWVudCgic3BhbiIpCms9cC5hKEguVk0oWyJ0eXBlLWRlc2NyaXB0aW9uIl0scSkpCmo9Si5kUihsKQpq
+LlYxKDApCmouRlYoMCxrKQpsLmFwcGVuZENoaWxkKG0uY3JlYXRlVGV4dE5vZGUobi5hKSkKaS5hcHBl
+bmRDaGlsZChsKQppLmFwcGVuZENoaWxkKG0uY3JlYXRlVGV4dE5vZGUoIjoiKSkKbD1tLmNyZWF0ZUVs
+ZW1lbnQoInVsIikKaz1wLmEoSC5WTShbInRyYWNlIl0scSkpCmo9Si5kUihsKQpqLlYxKDApCmouRlYo
+MCxrKQpoPWkuYXBwZW5kQ2hpbGQobCkKZm9yKGw9bi5iLGs9bC5sZW5ndGgsZz0wO2c8bC5sZW5ndGg7
+bC5sZW5ndGg9PT1rfHwoMCxILmxrKShsKSwrK2cpe2Y9bFtnXQplPW0uY3JlYXRlRWxlbWVudCgibGki
+KQpoLmFwcGVuZENoaWxkKGUpCmQ9bS5jcmVhdGVFbGVtZW50KCJzcGFuIikKYz1wLmEoSC5WTShbImZ1
+bmN0aW9uIl0scSkpCmo9Si5kUihkKQpqLlYxKDApCmouRlYoMCxjKQpjPWYuYgpMLmtEKGQsYz09bnVs
+bD8idW5rbm93biI6YykKZS5hcHBlbmRDaGlsZChkKQpiPWYuYwppZihiIT1udWxsKXtlLmFwcGVuZENo
+aWxkKG0uY3JlYXRlVGV4dE5vZGUoIiAoIikpCmE9Yi5iCmEwPW0uY3JlYXRlRWxlbWVudCgiYSIpCmEw
+LmFwcGVuZENoaWxkKG0uY3JlYXRlVGV4dE5vZGUoSC5FaihiLmMpKyI6IitILkVqKGEpKSkKYTAuc2V0
+QXR0cmlidXRlKCJocmVmIixiLmEpCmEwLmNsYXNzTGlzdC5hZGQoIm5hdi1saW5rIikKZS5hcHBlbmRD
+aGlsZChhMCkKZS5hcHBlbmRDaGlsZChtLmNyZWF0ZVRleHROb2RlKCIpIikpfWUuYXBwZW5kQ2hpbGQo
+bS5jcmVhdGVUZXh0Tm9kZSgiOiAiKSkKZD1mLmEKTC5rRChlLGQ9PW51bGw/InVua25vd24iOmQpCmQ9
+Zi5kCmlmKGQubGVuZ3RoIT09MCl7Yz1tLmNyZWF0ZUVsZW1lbnQoInAiKQphMT1wLmEoSC5WTShbImRy
+YXdlciIsImJlZm9yZS1hcHBseSJdLHEpKQpqPUouZFIoYykKai5WMSgwKQpqLkZWKDAsYTEpCmEyPWUu
+YXBwZW5kQ2hpbGQoYykKZm9yKGM9ZC5sZW5ndGgsYTM9MDthMzxkLmxlbmd0aDtkLmxlbmd0aD09PWN8
+fCgwLEgubGspKGQpLCsrYTMpTC51eihkW2EzXSxhMixiKX19fX0sClVzOmZ1bmN0aW9uKGEpe3JldHVy
+biBKLlU2KGEpLnRnKGEsIj8iKT9DLnhCLk5qKGEsMCxDLnhCLk9ZKGEsIj8iKSk6YX0sCmtEOmZ1bmN0
+aW9uKGEsYil7dmFyIHMscixxPUguVk0oYi5zcGxpdCgiLiIpLHQucykscD1DLk5tLmd0SChxKSxvPWRv
+Y3VtZW50CmEuYXBwZW5kQ2hpbGQoby5jcmVhdGVUZXh0Tm9kZShwKSkKZm9yKHA9SC5xQyhxLDEsbnVs
+bCx0Lk4pLHA9bmV3IEguYTcocCxwLmdBKHApLHAuJHRpLkMoImE3PGFMLkU+IikpLHM9Si5ZRShhKTtw
+LkYoKTspe3I9cC5kCnMubnooYSwiYmVmb3JlZW5kIiwiJiM4MjAzOy4iLG51bGwsbnVsbCkKYS5hcHBl
+bmRDaGlsZChvLmNyZWF0ZVRleHROb2RlKHIpKX19LAplOmZ1bmN0aW9uIGUoKXt9LApWVzpmdW5jdGlv
+biBWVyhhLGIsYyl7dGhpcy5hPWEKdGhpcy5iPWIKdGhpcy5jPWN9LApvWjpmdW5jdGlvbiBvWigpe30s
+CmpyOmZ1bmN0aW9uIGpyKCl7fSwKcWw6ZnVuY3Rpb24gcWwoKXt9LApIaTpmdW5jdGlvbiBIaSgpe30s
+CkJUOmZ1bmN0aW9uIEJUKCl7fSwKUFk6ZnVuY3Rpb24gUFkoKXt9LApMOmZ1bmN0aW9uIEwoKXt9LApX
+eDpmdW5jdGlvbiBXeChhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKQU86ZnVuY3Rpb24gQU8oYSl7dGhp
+cy5hPWF9LApkTjpmdW5jdGlvbiBkTihhKXt0aGlzLmE9YX0sCkhvOmZ1bmN0aW9uIEhvKGEpe3RoaXMu
+YT1hfSwKeHo6ZnVuY3Rpb24geHooYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCklDOmZ1bmN0aW9uIElD
+KCl7fSwKZkM6ZnVuY3Rpb24gZkMoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCm5UOmZ1bmN0aW9uIG5U
+KGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9Y30sCk5ZOmZ1bmN0aW9uIE5ZKGEpe3RoaXMu
+YT1hfSwKdWU6ZnVuY3Rpb24gdWUoKXt9LAplWDpmdW5jdGlvbiBlWCgpe30sCkVFOmZ1bmN0aW9uIEVF
+KGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9Y30sClFMOmZ1bmN0aW9uIFFMKGEsYil7dGhp
+cy5hPWEKdGhpcy5iPWJ9LApWUzpmdW5jdGlvbiBWUyhhKXt0aGlzLmE9YX0sClREOmZ1bmN0aW9uIFRE
+KCl7fSwKbTI6ZnVuY3Rpb24gbTIoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sClhBOmZ1bmN0aW9uIFhB
+KCl7fSwKbUs6ZnVuY3Rpb24oYSl7dmFyIHMscixxLHAsbyxuLG09SC5WTShbXSx0LmNRKQpmb3Iocz1K
+LklUKHQuVS5hKGEpKTtzLkYoKTspe3I9cy5nbCgpCnE9Si5VNihyKQpwPUwucDIoSC5oKHEucShyLCJ0
+eXBlIikpKQpvPUguaChxLnEociwibmFtZSIpKQpuPXEucShyLCJzdWJ0cmVlIikKbj1uPT1udWxsP251
+bGw6TC5tSyhuKQpDLk5tLmkobSxuZXcgTC5aWihwLG8sbixILmgocS5xKHIsInBhdGgiKSksSC5oKHEu
+cShyLCJocmVmIikpLEgudVAocS5xKHIsImVkaXRDb3VudCIpKSkpfXJldHVybiBtfSwKVkQ6ZnVuY3Rp
+b24oYSl7dmFyIHMscixxPUguVk0oW10sdC5HKQpmb3Iocz1hLmxlbmd0aCxyPTA7cjxhLmxlbmd0aDth
+Lmxlbmd0aD09PXN8fCgwLEgubGspKGEpLCsrcilDLk5tLmkocSxhW3JdLkx0KCkpCnJldHVybiBxfSwK
+cDI6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UiZGlyZWN0b3J5IjpyZXR1cm4gQy5ZMgpjYXNlImZp
+bGUiOnJldHVybiBDLnJmCmRlZmF1bHQ6dGhyb3cgSC5iKFAuUFYoIlVucmVjb2duaXplZCBuYXZpZ2F0
+aW9uIHRyZWUgbm9kZSB0eXBlOiAiK0guRWooYSkpKX19LAp2eTpmdW5jdGlvbihhKXtzd2l0Y2goYSl7
+Y2FzZSBDLlkyOnJldHVybiJkaXJlY3RvcnkiCmNhc2UgQy5yZjpyZXR1cm4iZmlsZSJ9dGhyb3cgSC5i
+KFAuUFYoIlVucmVjb2duaXplZCBuYXZpZ2F0aW9uIHRyZWUgbm9kZSB0eXBlOiAiK2EudygwKSkpfSwK
+Wlo6ZnVuY3Rpb24gWlooYSxiLGMsZCxlLGYpe3ZhciBfPXRoaXMKXy5hPWEKXy5iPWIKXy5jPWMKXy5k
+PWQKXy5lPWUKXy5mPWZ9LApPOTpmdW5jdGlvbiBPOShhKXt0aGlzLmI9YX0sCklWOmZ1bmN0aW9uIElW
+KGEsYixjLGQpe3ZhciBfPXRoaXMKXy5kPWEKXy5lPWIKXy5mPWMKXy5yPWR9fSxYPXsKQ0w6ZnVuY3Rp
+b24oYSxiKXt2YXIgcyxyLHEscCxvLG49Yi54WihhKQpiLmhLKGEpCmlmKG4hPW51bGwpYT1KLktWKGEs
+bi5sZW5ndGgpCnM9dC5zCnI9SC5WTShbXSxzKQpxPUguVk0oW10scykKcz1hLmxlbmd0aAppZihzIT09
+MCYmYi5yNChDLnhCLlcoYSwwKSkpe2lmKDA+PXMpcmV0dXJuIEguT0goYSwwKQpDLk5tLmkocSxhWzBd
+KQpwPTF9ZWxzZXtDLk5tLmkocSwiIikKcD0wfWZvcihvPXA7bzxzOysrbylpZihiLnI0KEMueEIuVyhh
+LG8pKSl7Qy5ObS5pKHIsQy54Qi5OaihhLHAsbykpCkMuTm0uaShxLGFbb10pCnA9bysxfWlmKHA8cyl7
+Qy5ObS5pKHIsQy54Qi5HKGEscCkpCkMuTm0uaShxLCIiKX1yZXR1cm4gbmV3IFguV0QoYixuLHIscSl9
+LApXRDpmdW5jdGlvbiBXRChhLGIsYyxkKXt2YXIgXz10aGlzCl8uYT1hCl8uYj1iCl8uZD1jCl8uZT1k
+fSwKSTc6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBYLmR2KGEpfSwKZHY6ZnVuY3Rpb24gZHYoYSl7dGhp
+cy5hPWF9fSxPPXsKUmg6ZnVuY3Rpb24oKXt2YXIgcyxyPW51bGwKaWYoUC51bygpLmdGaSgpIT09ImZp
+bGUiKXJldHVybiAkLkViKCkKcz1QLnVvKCkKaWYoIUMueEIuVGMocy5nSWkocyksIi8iKSlyZXR1cm4g
+JC5FYigpCmlmKFAuS0wociwiYS9iIixyLHIscixyLHIpLnQ0KCk9PT0iYVxcYiIpcmV0dXJuICQuS2so
+KQpyZXR1cm4gJC5iRCgpfSwKekw6ZnVuY3Rpb24gekwoKXt9fSxFPXtPRjpmdW5jdGlvbiBPRihhLGIs
+Yyl7dGhpcy5kPWEKdGhpcy5lPWIKdGhpcy5mPWN9fSxGPXtydTpmdW5jdGlvbiBydShhLGIsYyxkKXt2
+YXIgXz10aGlzCl8uZD1hCl8uZT1iCl8uZj1jCl8ucj1kfX0sRD17CmFiOmZ1bmN0aW9uKCl7dmFyIHMs
+cixxLHAsbz1udWxsCnRyeXtvPVAudW8oKX1jYXRjaChzKXtpZih0Lmc4LmIoSC5SdShzKSkpe3I9JC5G
+ZgppZihyIT1udWxsKXJldHVybiByCnRocm93IHN9ZWxzZSB0aHJvdyBzfWlmKEouUk0obywkLkk2KSl7
+cj0kLkZmCnIudG9TdHJpbmcKcmV0dXJuIHJ9JC5JNj1vCmlmKCQuSGsoKT09JC5FYigpKXI9JC5GZj1v
+LlpJKCIuIikudygwKQplbHNle3E9by50NCgpCnA9cS5sZW5ndGgtMQpyPSQuRmY9cD09PTA/cTpDLnhC
+Lk5qKHEsMCxwKX1yLnRvU3RyaW5nCnJldHVybiByfX0KdmFyIHc9W0MsSCxKLFAsVyxNLFUsQixULEws
+WCxPLEUsRixEXQpodW5rSGVscGVycy5zZXRGdW5jdGlvbk5hbWVzSWZOZWNlc3NhcnkodykKdmFyICQ9
+e30KSC5GSy5wcm90b3R5cGU9e30KSi52Qi5wcm90b3R5cGU9ewpETjpmdW5jdGlvbihhLGIpe3JldHVy
+biBhPT09Yn0sCmdpTzpmdW5jdGlvbihhKXtyZXR1cm4gSC5lUShhKX0sCnc6ZnVuY3Rpb24oYSl7cmV0
+dXJuIkluc3RhbmNlIG9mICciK0guRWooSC5NKGEpKSsiJyJ9LAplNzpmdW5jdGlvbihhLGIpe3Quby5h
+KGIpCnRocm93IEguYihQLmxyKGEsYi5nV2EoKSxiLmduZCgpLGIuZ1ZtKCkpKX19CkoueUUucHJvdG90
+eXBlPXsKdzpmdW5jdGlvbihhKXtyZXR1cm4gU3RyaW5nKGEpfSwKZ2lPOmZ1bmN0aW9uKGEpe3JldHVy
+biBhPzUxOTAxODoyMTgxNTl9LAokaWEyOjF9Ckoud2UucHJvdG90eXBlPXsKRE46ZnVuY3Rpb24oYSxi
+KXtyZXR1cm4gbnVsbD09Yn0sCnc6ZnVuY3Rpb24oYSl7cmV0dXJuIm51bGwifSwKZ2lPOmZ1bmN0aW9u
+KGEpe3JldHVybiAwfSwKZTc6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5TaihhLHQuby5hKGIpKX0s
+CiRpYzg6MX0KSi5NRi5wcm90b3R5cGU9ewpnaU86ZnVuY3Rpb24oYSl7cmV0dXJuIDB9LAp3OmZ1bmN0
+aW9uKGEpe3JldHVybiBTdHJpbmcoYSl9LAokaXZtOjF9CkouaUMucHJvdG90eXBlPXt9Ckoua2QucHJv
+dG90eXBlPXt9CkouYzUucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXt2YXIgcz1hWyQudygpXQppZihz
+PT1udWxsKXJldHVybiB0aGlzLnQoYSkKcmV0dXJuIkphdmFTY3JpcHQgZnVuY3Rpb24gZm9yICIrSC5F
+aihKLmoocykpfSwKJGlFSDoxfQpKLmpkLnByb3RvdHlwZT17CmRyOmZ1bmN0aW9uKGEsYil7cmV0dXJu
+IG5ldyBILmpWKGEsSC50NihhKS5DKCJAPDE+IikuS3EoYikuQygialY8MSwyPiIpKX0sCmk6ZnVuY3Rp
+b24oYSxiKXtILnQ2KGEpLmMuYShiKQppZighIWEuZml4ZWQkbGVuZ3RoKUgudihQLkw0KCJhZGQiKSkK
+YS5wdXNoKGIpfSwKVzQ6ZnVuY3Rpb24oYSxiKXt2YXIgcwppZighIWEuZml4ZWQkbGVuZ3RoKUgudihQ
+Lkw0KCJyZW1vdmVBdCIpKQpzPWEubGVuZ3RoCmlmKGI+PXMpdGhyb3cgSC5iKFAuTzcoYixudWxsKSkK
+cmV0dXJuIGEuc3BsaWNlKGIsMSlbMF19LApVRzpmdW5jdGlvbihhLGIsYyl7dmFyIHMscgpILnQ2KGEp
+LkMoImNYPDE+IikuYShjKQppZighIWEuZml4ZWQkbGVuZ3RoKUgudihQLkw0KCJpbnNlcnRBbGwiKSkK
+UC53QShiLDAsYS5sZW5ndGgsImluZGV4IikKaWYoIXQuYi5iKGMpKWM9Si5SWChjKQpzPUouSG0oYykK
+YS5sZW5ndGg9YS5sZW5ndGgrcwpyPWIrcwp0aGlzLllXKGEscixhLmxlbmd0aCxhLGIpCnRoaXMudmco
+YSxiLHIsYyl9LApGVjpmdW5jdGlvbihhLGIpe3ZhciBzCkgudDYoYSkuQygiY1g8MT4iKS5hKGIpCmlm
+KCEhYS5maXhlZCRsZW5ndGgpSC52KFAuTDQoImFkZEFsbCIpKQpmb3Iocz1KLklUKGIpO3MuRigpOylh
+LnB1c2gocy5nbCgpKX0sCkUyOmZ1bmN0aW9uKGEsYixjKXt2YXIgcz1ILnQ2KGEpCnJldHVybiBuZXcg
+SC5sSihhLHMuS3EoYykuQygiMSgyKSIpLmEoYikscy5DKCJAPDE+IikuS3EoYykuQygibEo8MSwyPiIp
+KX0sCkg6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyPVAuTzgoYS5sZW5ndGgsIiIsITEsdC5OKQpmb3Iocz0w
+O3M8YS5sZW5ndGg7KytzKXRoaXMuWShyLHMsSC5FaihhW3NdKSkKcmV0dXJuIHIuam9pbihiKX0sCmVS
+OmZ1bmN0aW9uKGEsYil7cmV0dXJuIEgucUMoYSxiLG51bGwsSC50NihhKS5jKX0sCk4wOmZ1bmN0aW9u
+KGEsYixjLGQpe3ZhciBzLHIscQpkLmEoYikKSC50NihhKS5LcShkKS5DKCIxKDEsMikiKS5hKGMpCnM9
+YS5sZW5ndGgKZm9yKHI9YixxPTA7cTxzOysrcSl7cj1jLiQyKHIsYVtxXSkKaWYoYS5sZW5ndGghPT1z
+KXRocm93IEguYihQLmE0KGEpKX1yZXR1cm4gcn0sCkh0OmZ1bmN0aW9uKGEsYil7dmFyIHMscixxLHAs
+bwpILnQ2KGEpLkMoImEyKDEpIikuYShiKQpzPWEubGVuZ3RoCmZvcihyPW51bGwscT0hMSxwPTA7cDxz
+OysrcCl7bz1hW3BdCmlmKEgub1QoYi4kMShvKSkpe2lmKHEpdGhyb3cgSC5iKEguQW0oKSkKcj1vCnE9
+ITB9aWYocyE9PWEubGVuZ3RoKXRocm93IEguYihQLmE0KGEpKX1pZihxKXJldHVybiByCnRocm93IEgu
+YihILldwKCkpfSwKRTpmdW5jdGlvbihhLGIpe2lmKGI8MHx8Yj49YS5sZW5ndGgpcmV0dXJuIEguT0go
+YSxiKQpyZXR1cm4gYVtiXX0sCmd0SDpmdW5jdGlvbihhKXtpZihhLmxlbmd0aD4wKXJldHVybiBhWzBd
+CnRocm93IEguYihILldwKCkpfSwKZ3JaOmZ1bmN0aW9uKGEpe3ZhciBzPWEubGVuZ3RoCmlmKHM+MCly
+ZXR1cm4gYVtzLTFdCnRocm93IEguYihILldwKCkpfSwKWVc6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIg
+cyxyLHEscCxvCkgudDYoYSkuQygiY1g8MT4iKS5hKGQpCmlmKCEhYS5pbW11dGFibGUkbGlzdClILnYo
+UC5MNCgic2V0UmFuZ2UiKSkKUC5qQihiLGMsYS5sZW5ndGgpCnM9Yy1iCmlmKHM9PT0wKXJldHVybgpQ
+LmsxKGUsInNraXBDb3VudCIpCmlmKHQuai5iKGQpKXtyPWQKcT1lfWVsc2V7cj1KLkE1KGQsZSkudHQo
+MCwhMSkKcT0wfXA9Si5VNihyKQppZihxK3M+cC5nQShyKSl0aHJvdyBILmIoSC5hcigpKQppZihxPGIp
+Zm9yKG89cy0xO28+PTA7LS1vKWFbYitvXT1wLnEocixxK28pCmVsc2UgZm9yKG89MDtvPHM7KytvKWFb
+YitvXT1wLnEocixxK28pfSwKdmc6ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIHRoaXMuWVcoYSxiLGMs
+ZCwwKX0sClZyOmZ1bmN0aW9uKGEsYil7dmFyIHMscgpILnQ2KGEpLkMoImEyKDEpIikuYShiKQpzPWEu
+bGVuZ3RoCmZvcihyPTA7cjxzOysrcil7aWYoSC5vVChiLiQxKGFbcl0pKSlyZXR1cm4hMAppZihhLmxl
+bmd0aCE9PXMpdGhyb3cgSC5iKFAuYTQoYSkpfXJldHVybiExfSwKdGc6ZnVuY3Rpb24oYSxiKXt2YXIg
+cwpmb3Iocz0wO3M8YS5sZW5ndGg7KytzKWlmKEouUk0oYVtzXSxiKSlyZXR1cm4hMApyZXR1cm4hMX0s
+CmdsMDpmdW5jdGlvbihhKXtyZXR1cm4gYS5sZW5ndGg9PT0wfSwKZ29yOmZ1bmN0aW9uKGEpe3JldHVy
+biBhLmxlbmd0aCE9PTB9LAp3OmZ1bmN0aW9uKGEpe3JldHVybiBQLldFKGEsIlsiLCJdIil9LAp0dDpm
+dW5jdGlvbihhLGIpe3ZhciBzPUguVk0oYS5zbGljZSgwKSxILnQ2KGEpKQpyZXR1cm4gc30sCmJyOmZ1
+bmN0aW9uKGEpe3JldHVybiB0aGlzLnR0KGEsITApfSwKZ206ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBK
+Lm0xKGEsYS5sZW5ndGgsSC50NihhKS5DKCJtMTwxPiIpKX0sCmdpTzpmdW5jdGlvbihhKXtyZXR1cm4g
+SC5lUShhKX0sCmdBOmZ1bmN0aW9uKGEpe3JldHVybiBhLmxlbmd0aH0sCnNBOmZ1bmN0aW9uKGEsYil7
+aWYoISFhLmZpeGVkJGxlbmd0aClILnYoUC5MNCgic2V0IGxlbmd0aCIpKQppZihiPDApdGhyb3cgSC5i
+KFAuVEUoYiwwLG51bGwsIm5ld0xlbmd0aCIsbnVsbCkpCmEubGVuZ3RoPWJ9LApxOmZ1bmN0aW9uKGEs
+Yil7SC51UChiKQppZihiPj1hLmxlbmd0aHx8YjwwKXRocm93IEguYihILkhZKGEsYikpCnJldHVybiBh
+W2JdfSwKWTpmdW5jdGlvbihhLGIsYyl7SC50NihhKS5jLmEoYykKaWYoISFhLmltbXV0YWJsZSRsaXN0
+KUgudihQLkw0KCJpbmRleGVkIHNldCIpKQppZihiPj1hLmxlbmd0aHx8YjwwKXRocm93IEguYihILkhZ
+KGEsYikpCmFbYl09Y30sCiRpYlE6MSwKJGljWDoxLAokaXpNOjF9CkouUG8ucHJvdG90eXBlPXt9Ckou
+bTEucHJvdG90eXBlPXsKZ2w6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kfSwKRjpmdW5jdGlvbigpe3Zh
+ciBzLHI9dGhpcyxxPXIuYSxwPXEubGVuZ3RoCmlmKHIuYiE9PXApdGhyb3cgSC5iKEgubGsocSkpCnM9
+ci5jCmlmKHM+PXApe3Iuc00obnVsbCkKcmV0dXJuITF9ci5zTShxW3NdKTsrK3IuYwpyZXR1cm4hMH0s
+CnNNOmZ1bmN0aW9uKGEpe3RoaXMuZD10aGlzLiR0aS5DKCIxPyIpLmEoYSl9LAokaUFuOjF9CkoucUku
+cHJvdG90eXBlPXsKelE6ZnVuY3Rpb24oYSl7aWYoYT4wKXtpZihhIT09MS8wKXJldHVybiBNYXRoLnJv
+dW5kKGEpfWVsc2UgaWYoYT4tMS8wKXJldHVybiAwLU1hdGgucm91bmQoMC1hKQp0aHJvdyBILmIoUC5M
+NCgiIithKyIucm91bmQoKSIpKX0sCnc6ZnVuY3Rpb24oYSl7aWYoYT09PTAmJjEvYTwwKXJldHVybiIt
+MC4wIgplbHNlIHJldHVybiIiK2F9LApnaU86ZnVuY3Rpb24oYSl7dmFyIHMscixxLHAsbz1hfDAKaWYo
+YT09PW8pcmV0dXJuIG8mNTM2ODcwOTExCnM9TWF0aC5hYnMoYSkKcj1NYXRoLmxvZyhzKS8wLjY5MzE0
+NzE4MDU1OTk0NTN8MApxPU1hdGgucG93KDIscikKcD1zPDE/cy9xOnEvcwpyZXR1cm4oKHAqOTAwNzE5
+OTI1NDc0MDk5MnwwKSsocCozNTQyMjQzMTgxMTc2NTIxfDApKSo1OTkxOTcrcioxMjU5JjUzNjg3MDkx
+MX0sCnpZOmZ1bmN0aW9uKGEsYil7dmFyIHM9YSViCmlmKHM9PT0wKXJldHVybiAwCmlmKHM+MClyZXR1
+cm4gcwppZihiPDApcmV0dXJuIHMtYgplbHNlIHJldHVybiBzK2J9LApCVTpmdW5jdGlvbihhLGIpe3Jl
+dHVybihhfDApPT09YT9hL2J8MDp0aGlzLkRKKGEsYil9LApESjpmdW5jdGlvbihhLGIpe3ZhciBzPWEv
+YgppZihzPj0tMjE0NzQ4MzY0OCYmczw9MjE0NzQ4MzY0NylyZXR1cm4gc3wwCmlmKHM+MCl7aWYocyE9
+PTEvMClyZXR1cm4gTWF0aC5mbG9vcihzKX1lbHNlIGlmKHM+LTEvMClyZXR1cm4gTWF0aC5jZWlsKHMp
+CnRocm93IEguYihQLkw0KCJSZXN1bHQgb2YgdHJ1bmNhdGluZyBkaXZpc2lvbiBpcyAiK0guRWoocykr
+IjogIitILkVqKGEpKyIgfi8gIitiKSl9LAp3RzpmdW5jdGlvbihhLGIpe3ZhciBzCmlmKGE+MClzPXRo
+aXMucDMoYSxiKQplbHNle3M9Yj4zMT8zMTpiCnM9YT4+cz4+PjB9cmV0dXJuIHN9LApiZjpmdW5jdGlv
+bihhLGIpe2lmKGI8MCl0aHJvdyBILmIoSC50TChiKSkKcmV0dXJuIHRoaXMucDMoYSxiKX0sCnAzOmZ1
+bmN0aW9uKGEsYil7cmV0dXJuIGI+MzE/MDphPj4+Yn0sCiRpQ1A6MSwKJGlMWjoxfQpKLmJVLnByb3Rv
+dHlwZT17JGlJZjoxfQpKLlZBLnByb3RvdHlwZT17fQpKLkRyLnByb3RvdHlwZT17Ck8yOmZ1bmN0aW9u
+KGEsYil7aWYoYjwwKXRocm93IEguYihILkhZKGEsYikpCmlmKGI+PWEubGVuZ3RoKUgudihILkhZKGEs
+YikpCnJldHVybiBhLmNoYXJDb2RlQXQoYil9LApXOmZ1bmN0aW9uKGEsYil7aWYoYj49YS5sZW5ndGgp
+dGhyb3cgSC5iKEguSFkoYSxiKSkKcmV0dXJuIGEuY2hhckNvZGVBdChiKX0sCmRkOmZ1bmN0aW9uKGEs
+Yil7cmV0dXJuIG5ldyBILnVuKGIsYSwwKX0sCmg6ZnVuY3Rpb24oYSxiKXtpZih0eXBlb2YgYiE9InN0
+cmluZyIpdGhyb3cgSC5iKFAuTDMoYixudWxsLG51bGwpKQpyZXR1cm4gYStifSwKVGM6ZnVuY3Rpb24o
+YSxiKXt2YXIgcz1iLmxlbmd0aCxyPWEubGVuZ3RoCmlmKHM+cilyZXR1cm4hMQpyZXR1cm4gYj09PXRo
+aXMuRyhhLHItcyl9LAppNzpmdW5jdGlvbihhLGIsYyxkKXt2YXIgcz1QLmpCKGIsYyxhLmxlbmd0aCks
+cj1hLnN1YnN0cmluZygwLGIpLHE9YS5zdWJzdHJpbmcocykKcmV0dXJuIHIrZCtxfSwKUWk6ZnVuY3Rp
+b24oYSxiLGMpe3ZhciBzCmlmKGM8MHx8Yz5hLmxlbmd0aCl0aHJvdyBILmIoUC5URShjLDAsYS5sZW5n
+dGgsbnVsbCxudWxsKSkKcz1jK2IubGVuZ3RoCmlmKHM+YS5sZW5ndGgpcmV0dXJuITEKcmV0dXJuIGI9
+PT1hLnN1YnN0cmluZyhjLHMpfSwKbjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLlFpKGEsYiwwKX0s
+Ck5qOmZ1bmN0aW9uKGEsYixjKXtpZihjPT1udWxsKWM9YS5sZW5ndGgKaWYoYjwwKXRocm93IEguYihQ
+Lk83KGIsbnVsbCkpCmlmKGI+Yyl0aHJvdyBILmIoUC5PNyhiLG51bGwpKQppZihjPmEubGVuZ3RoKXRo
+cm93IEguYihQLk83KGMsbnVsbCkpCnJldHVybiBhLnN1YnN0cmluZyhiLGMpfSwKRzpmdW5jdGlvbihh
+LGIpe3JldHVybiB0aGlzLk5qKGEsYixudWxsKX0sCmhjOmZ1bmN0aW9uKGEpe3JldHVybiBhLnRvTG93
+ZXJDYXNlKCl9LApiUzpmdW5jdGlvbihhKXt2YXIgcyxyLHEscD1hLnRyaW0oKSxvPXAubGVuZ3RoCmlm
+KG89PT0wKXJldHVybiBwCmlmKHRoaXMuVyhwLDApPT09MTMzKXtzPUoubW0ocCwxKQppZihzPT09byly
+ZXR1cm4iIn1lbHNlIHM9MApyPW8tMQpxPXRoaXMuTzIocCxyKT09PTEzMz9KLmMxKHAscik6bwppZihz
+PT09MCYmcT09PW8pcmV0dXJuIHAKcmV0dXJuIHAuc3Vic3RyaW5nKHMscSl9LApJeDpmdW5jdGlvbihh
+LGIpe3ZhciBzLHIKaWYoMD49YilyZXR1cm4iIgppZihiPT09MXx8YS5sZW5ndGg9PT0wKXJldHVybiBh
+CmlmKGIhPT1iPj4+MCl0aHJvdyBILmIoQy5FcSkKZm9yKHM9YSxyPSIiOyEwOyl7aWYoKGImMSk9PT0x
+KXI9cytyCmI9Yj4+PjEKaWYoYj09PTApYnJlYWsKcys9c31yZXR1cm4gcn0sClhVOmZ1bmN0aW9uKGEs
+YixjKXt2YXIgcwppZihjPDB8fGM+YS5sZW5ndGgpdGhyb3cgSC5iKFAuVEUoYywwLGEubGVuZ3RoLG51
+bGwsbnVsbCkpCnM9YS5pbmRleE9mKGIsYykKcmV0dXJuIHN9LApPWTpmdW5jdGlvbihhLGIpe3JldHVy
+biB0aGlzLlhVKGEsYiwwKX0sClBrOmZ1bmN0aW9uKGEsYixjKXt2YXIgcyxyCmlmKGM9PW51bGwpYz1h
+Lmxlbmd0aAplbHNlIGlmKGM8MHx8Yz5hLmxlbmd0aCl0aHJvdyBILmIoUC5URShjLDAsYS5sZW5ndGgs
+bnVsbCxudWxsKSkKcz1iLmxlbmd0aApyPWEubGVuZ3RoCmlmKGMrcz5yKWM9ci1zCnJldHVybiBhLmxh
+c3RJbmRleE9mKGIsYyl9LApjbjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLlBrKGEsYixudWxsKX0s
+CklzOmZ1bmN0aW9uKGEsYixjKXt2YXIgcz1hLmxlbmd0aAppZihjPnMpdGhyb3cgSC5iKFAuVEUoYyww
+LHMsbnVsbCxudWxsKSkKcmV0dXJuIEguU1EoYSxiLGMpfSwKdGc6ZnVuY3Rpb24oYSxiKXtyZXR1cm4g
+dGhpcy5JcyhhLGIsMCl9LAp3OmZ1bmN0aW9uKGEpe3JldHVybiBhfSwKZ2lPOmZ1bmN0aW9uKGEpe3Zh
+ciBzLHIscQpmb3Iocz1hLmxlbmd0aCxyPTAscT0wO3E8czsrK3Epe3I9cithLmNoYXJDb2RlQXQocSkm
+NTM2ODcwOTExCnI9cisoKHImNTI0Mjg3KTw8MTApJjUzNjg3MDkxMQpyXj1yPj42fXI9cisoKHImNjcx
+MDg4NjMpPDwzKSY1MzY4NzA5MTEKcl49cj4+MTEKcmV0dXJuIHIrKChyJjE2MzgzKTw8MTUpJjUzNjg3
+MDkxMX0sCmdBOmZ1bmN0aW9uKGEpe3JldHVybiBhLmxlbmd0aH0sCnE6ZnVuY3Rpb24oYSxiKXtILnVQ
+KGIpCmlmKGI+PWEubGVuZ3RofHwhMSl0aHJvdyBILmIoSC5IWShhLGIpKQpyZXR1cm4gYVtiXX0sCiRp
+dlg6MSwKJGlxVToxfQpILkJSLnByb3RvdHlwZT17CmdtOmZ1bmN0aW9uKGEpe3ZhciBzPUguTGgodGhp
+cykKcmV0dXJuIG5ldyBILkU3KEouSVQodGhpcy5nT04oKSkscy5DKCJAPDE+IikuS3Eocy5RWzFdKS5D
+KCJFNzwxLDI+IikpfSwKZ0E6ZnVuY3Rpb24oYSl7cmV0dXJuIEouSG0odGhpcy5nT04oKSl9LApnbDA6
+ZnVuY3Rpb24oYSl7cmV0dXJuIEoudVUodGhpcy5nT04oKSl9LApnb3I6ZnVuY3Rpb24oYSl7cmV0dXJu
+IEouRjcodGhpcy5nT04oKSl9LAplUjpmdW5jdGlvbihhLGIpe3ZhciBzPUguTGgodGhpcykKcmV0dXJu
+IEguR0ooSi5BNSh0aGlzLmdPTigpLGIpLHMuYyxzLlFbMV0pfSwKRTpmdW5jdGlvbihhLGIpe3JldHVy
+biBILkxoKHRoaXMpLlFbMV0uYShKLkdBKHRoaXMuZ09OKCksYikpfSwKdzpmdW5jdGlvbihhKXtyZXR1
+cm4gSi5qKHRoaXMuZ09OKCkpfX0KSC5FNy5wcm90b3R5cGU9ewpGOmZ1bmN0aW9uKCl7cmV0dXJuIHRo
+aXMuYS5GKCl9LApnbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLiR0aS5RWzFdLmEodGhpcy5hLmdsKCkp
+fSwKJGlBbjoxfQpILlp5LnByb3RvdHlwZT17CmdPTjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmF9fQpI
+Lm9sLnByb3RvdHlwZT17JGliUToxfQpILlVxLnByb3RvdHlwZT17CnE6ZnVuY3Rpb24oYSxiKXtyZXR1
+cm4gdGhpcy4kdGkuUVsxXS5hKEoueDkodGhpcy5hLEgudVAoYikpKX0sClk6ZnVuY3Rpb24oYSxiLGMp
+e3ZhciBzPXRoaXMuJHRpCkoudTkodGhpcy5hLGIscy5jLmEocy5RWzFdLmEoYykpKX0sCiRpYlE6MSwK
+JGl6TToxfQpILmpWLnByb3RvdHlwZT17CmRyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyBILmpWKHRo
+aXMuYSx0aGlzLiR0aS5DKCJAPDE+IikuS3EoYikuQygialY8MSwyPiIpKX0sCmdPTjpmdW5jdGlvbigp
+e3JldHVybiB0aGlzLmF9fQpILm4ucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXt2YXIgcz10aGlzLmEK
+cmV0dXJuIHMhPW51bGw/IkxhdGVJbml0aWFsaXphdGlvbkVycm9yOiAiK3M6IkxhdGVJbml0aWFsaXph
+dGlvbkVycm9yIn19CkgucjMucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXt2YXIgcz0iUmVhY2hhYmls
+aXR5RXJyb3I6ICIrdGhpcy5hCnJldHVybiBzfX0KSC5xai5wcm90b3R5cGU9ewpnQTpmdW5jdGlvbihh
+KXtyZXR1cm4gdGhpcy5hLmxlbmd0aH0sCnE6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gQy54Qi5PMih0aGlz
+LmEsSC51UChiKSl9fQpILmJRLnByb3RvdHlwZT17fQpILmFMLnByb3RvdHlwZT17CmdtOmZ1bmN0aW9u
+KGEpe3ZhciBzPXRoaXMKcmV0dXJuIG5ldyBILmE3KHMscy5nQShzKSxILkxoKHMpLkMoImE3PGFMLkU+
+IikpfSwKZ2wwOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmdBKHRoaXMpPT09MH0sCkg6ZnVuY3Rpb24o
+YSxiKXt2YXIgcyxyLHEscD10aGlzLG89cC5nQShwKQppZihiLmxlbmd0aCE9PTApe2lmKG89PT0wKXJl
+dHVybiIiCnM9SC5FaihwLkUoMCwwKSkKaWYobyE9PXAuZ0EocCkpdGhyb3cgSC5iKFAuYTQocCkpCmZv
+cihyPXMscT0xO3E8bzsrK3Epe3I9citiK0guRWoocC5FKDAscSkpCmlmKG8hPT1wLmdBKHApKXRocm93
+IEguYihQLmE0KHApKX1yZXR1cm4gci5jaGFyQ29kZUF0KDApPT0wP3I6cn1lbHNle2ZvcihxPTAscj0i
+IjtxPG87KytxKXtyKz1ILkVqKHAuRSgwLHEpKQppZihvIT09cC5nQShwKSl0aHJvdyBILmIoUC5hNChw
+KSl9cmV0dXJuIHIuY2hhckNvZGVBdCgwKT09MD9yOnJ9fSwKZXY6ZnVuY3Rpb24oYSxiKXtyZXR1cm4g
+dGhpcy5HRygwLEguTGgodGhpcykuQygiYTIoYUwuRSkiKS5hKGIpKX0sCkUyOmZ1bmN0aW9uKGEsYixj
+KXt2YXIgcz1ILkxoKHRoaXMpCnJldHVybiBuZXcgSC5sSih0aGlzLHMuS3EoYykuQygiMShhTC5FKSIp
+LmEoYikscy5DKCJAPGFMLkU+IikuS3EoYykuQygibEo8MSwyPiIpKX0sCmVSOmZ1bmN0aW9uKGEsYil7
+cmV0dXJuIEgucUModGhpcyxiLG51bGwsSC5MaCh0aGlzKS5DKCJhTC5FIikpfSwKdHQ6ZnVuY3Rpb24o
+YSxiKXtyZXR1cm4gUC5DSCh0aGlzLCEwLEguTGgodGhpcykuQygiYUwuRSIpKX0sCmJyOmZ1bmN0aW9u
+KGEpe3JldHVybiB0aGlzLnR0KGEsITApfX0KSC5uSC5wcm90b3R5cGU9ewpIZDpmdW5jdGlvbihhLGIs
+YyxkKXt2YXIgcyxyPXRoaXMuYgpQLmsxKHIsInN0YXJ0IikKcz10aGlzLmMKaWYocyE9bnVsbCl7UC5r
+MShzLCJlbmQiKQppZihyPnMpdGhyb3cgSC5iKFAuVEUociwwLHMsInN0YXJ0IixudWxsKSl9fSwKZ1VE
+OmZ1bmN0aW9uKCl7dmFyIHM9Si5IbSh0aGlzLmEpLHI9dGhpcy5jCmlmKHI9PW51bGx8fHI+cylyZXR1
+cm4gcwpyZXR1cm4gcn0sCmdBczpmdW5jdGlvbigpe3ZhciBzPUouSG0odGhpcy5hKSxyPXRoaXMuYgpp
+ZihyPnMpcmV0dXJuIHMKcmV0dXJuIHJ9LApnQTpmdW5jdGlvbihhKXt2YXIgcyxyPUouSG0odGhpcy5h
+KSxxPXRoaXMuYgppZihxPj1yKXJldHVybiAwCnM9dGhpcy5jCmlmKHM9PW51bGx8fHM+PXIpcmV0dXJu
+IHItcQppZih0eXBlb2YgcyE9PSJudW1iZXIiKXJldHVybiBzLkhOKCkKcmV0dXJuIHMtcX0sCkU6ZnVu
+Y3Rpb24oYSxiKXt2YXIgcz10aGlzLHI9cy5nQXMoKStiCmlmKGI8MHx8cj49cy5nVUQoKSl0aHJvdyBI
+LmIoUC5DZihiLHMsImluZGV4IixudWxsLG51bGwpKQpyZXR1cm4gSi5HQShzLmEscil9LAplUjpmdW5j
+dGlvbihhLGIpe3ZhciBzLHIscT10aGlzClAuazEoYiwiY291bnQiKQpzPXEuYitiCnI9cS5jCmlmKHIh
+PW51bGwmJnM+PXIpcmV0dXJuIG5ldyBILk1CKHEuJHRpLkMoIk1CPDE+IikpCnJldHVybiBILnFDKHEu
+YSxzLHIscS4kdGkuYyl9LAp0dDpmdW5jdGlvbihhLGIpe3ZhciBzLHIscSxwPXRoaXMsbz1wLmIsbj1w
+LmEsbT1KLlU2KG4pLGw9bS5nQShuKSxrPXAuYwppZihrIT1udWxsJiZrPGwpbD1rCmlmKHR5cGVvZiBs
+IT09Im51bWJlciIpcmV0dXJuIGwuSE4oKQpzPWwtbwppZihzPD0wKXtuPUouUWkoMCxwLiR0aS5jKQpy
+ZXR1cm4gbn1yPVAuTzgocyxtLkUobixvKSwhMSxwLiR0aS5jKQpmb3IocT0xO3E8czsrK3Epe0MuTm0u
+WShyLHEsbS5FKG4sbytxKSkKaWYobS5nQShuKTxsKXRocm93IEguYihQLmE0KHApKX1yZXR1cm4gcn19
+CkguYTcucHJvdG90eXBlPXsKZ2w6ZnVuY3Rpb24oKXt2YXIgcz10aGlzLmQKcmV0dXJuIHN9LApGOmZ1
+bmN0aW9uKCl7dmFyIHMscj10aGlzLHE9ci5hLHA9Si5VNihxKSxvPXAuZ0EocSkKaWYoci5iIT09byl0
+aHJvdyBILmIoUC5hNChxKSkKcz1yLmMKaWYocz49byl7ci5zSShudWxsKQpyZXR1cm4hMX1yLnNJKHAu
+RShxLHMpKTsrK3IuYwpyZXR1cm4hMH0sCnNJOmZ1bmN0aW9uKGEpe3RoaXMuZD10aGlzLiR0aS5DKCIx
+PyIpLmEoYSl9LAokaUFuOjF9CkguaTEucHJvdG90eXBlPXsKZ206ZnVuY3Rpb24oYSl7dmFyIHM9SC5M
+aCh0aGlzKQpyZXR1cm4gbmV3IEguTUgoSi5JVCh0aGlzLmEpLHRoaXMuYixzLkMoIkA8MT4iKS5LcShz
+LlFbMV0pLkMoIk1IPDEsMj4iKSl9LApnQTpmdW5jdGlvbihhKXtyZXR1cm4gSi5IbSh0aGlzLmEpfSwK
+Z2wwOmZ1bmN0aW9uKGEpe3JldHVybiBKLnVVKHRoaXMuYSl9LApFOmZ1bmN0aW9uKGEsYil7cmV0dXJu
+IHRoaXMuYi4kMShKLkdBKHRoaXMuYSxiKSl9fQpILnh5LnByb3RvdHlwZT17JGliUToxfQpILk1ILnBy
+b3RvdHlwZT17CkY6ZnVuY3Rpb24oKXt2YXIgcz10aGlzLHI9cy5iCmlmKHIuRigpKXtzLnNJKHMuYy4k
+MShyLmdsKCkpKQpyZXR1cm4hMH1zLnNJKG51bGwpCnJldHVybiExfSwKZ2w6ZnVuY3Rpb24oKXt2YXIg
+cz10aGlzLmEKcmV0dXJuIHN9LApzSTpmdW5jdGlvbihhKXt0aGlzLmE9dGhpcy4kdGkuQygiMj8iKS5h
+KGEpfX0KSC5sSi5wcm90b3R5cGU9ewpnQTpmdW5jdGlvbihhKXtyZXR1cm4gSi5IbSh0aGlzLmEpfSwK
+RTpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmIuJDEoSi5HQSh0aGlzLmEsYikpfX0KSC5VNS5wcm90
+b3R5cGU9ewpnbTpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IEguU08oSi5JVCh0aGlzLmEpLHRoaXMuYix0
+aGlzLiR0aS5DKCJTTzwxPiIpKX19CkguU08ucHJvdG90eXBlPXsKRjpmdW5jdGlvbigpe3ZhciBzLHIK
+Zm9yKHM9dGhpcy5hLHI9dGhpcy5iO3MuRigpOylpZihILm9UKHIuJDEocy5nbCgpKSkpcmV0dXJuITAK
+cmV0dXJuITF9LApnbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmEuZ2woKX19CkguQU0ucHJvdG90eXBl
+PXsKZVI6ZnVuY3Rpb24oYSxiKXtQLlVJKGIsImNvdW50Iix0LlMpClAuazEoYiwiY291bnQiKQpyZXR1
+cm4gbmV3IEguQU0odGhpcy5hLHRoaXMuYitiLEguTGgodGhpcykuQygiQU08MT4iKSl9LApnbTpmdW5j
+dGlvbihhKXtyZXR1cm4gbmV3IEguVTEoSi5JVCh0aGlzLmEpLHRoaXMuYixILkxoKHRoaXMpLkMoIlUx
+PDE+IikpfX0KSC5kNS5wcm90b3R5cGU9ewpnQTpmdW5jdGlvbihhKXt2YXIgcz1KLkhtKHRoaXMuYSkt
+dGhpcy5iCmlmKHM+PTApcmV0dXJuIHMKcmV0dXJuIDB9LAplUjpmdW5jdGlvbihhLGIpe1AuVUkoYiwi
+Y291bnQiLHQuUykKUC5rMShiLCJjb3VudCIpCnJldHVybiBuZXcgSC5kNSh0aGlzLmEsdGhpcy5iK2Is
+dGhpcy4kdGkpfSwKJGliUToxfQpILlUxLnByb3RvdHlwZT17CkY6ZnVuY3Rpb24oKXt2YXIgcyxyCmZv
+cihzPXRoaXMuYSxyPTA7cjx0aGlzLmI7KytyKXMuRigpCnRoaXMuYj0wCnJldHVybiBzLkYoKX0sCmds
+OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYS5nbCgpfX0KSC5NQi5wcm90b3R5cGU9ewpnbTpmdW5jdGlv
+bihhKXtyZXR1cm4gQy5Hd30sCmdsMDpmdW5jdGlvbihhKXtyZXR1cm4hMH0sCmdBOmZ1bmN0aW9uKGEp
+e3JldHVybiAwfSwKRTpmdW5jdGlvbihhLGIpe3Rocm93IEguYihQLlRFKGIsMCwwLCJpbmRleCIsbnVs
+bCkpfSwKZVI6ZnVuY3Rpb24oYSxiKXtQLmsxKGIsImNvdW50IikKcmV0dXJuIHRoaXN9fQpILkZ1LnBy
+b3RvdHlwZT17CkY6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sCmdsOmZ1bmN0aW9uKCl7dGhyb3cgSC5iKEgu
+V3AoKSl9LAokaUFuOjF9CkgudTYucHJvdG90eXBlPXsKZ206ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBI
+LkpCKEouSVQodGhpcy5hKSx0aGlzLiR0aS5DKCJKQjwxPiIpKX19CkguSkIucHJvdG90eXBlPXsKRjpm
+dW5jdGlvbigpe3ZhciBzLHIKZm9yKHM9dGhpcy5hLHI9dGhpcy4kdGkuYztzLkYoKTspaWYoci5iKHMu
+Z2woKSkpcmV0dXJuITAKcmV0dXJuITF9LApnbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLiR0aS5jLmEo
+dGhpcy5hLmdsKCkpfSwKJGlBbjoxfQpILlNVLnByb3RvdHlwZT17fQpILlJlLnByb3RvdHlwZT17Clk6
+ZnVuY3Rpb24oYSxiLGMpe0guTGgodGhpcykuQygiUmUuRSIpLmEoYykKdGhyb3cgSC5iKFAuTDQoIkNh
+bm5vdCBtb2RpZnkgYW4gdW5tb2RpZmlhYmxlIGxpc3QiKSl9fQpILncyLnByb3RvdHlwZT17fQpILnd2
+LnByb3RvdHlwZT17CmdpTzpmdW5jdGlvbihhKXt2YXIgcz10aGlzLl9oYXNoQ29kZQppZihzIT1udWxs
+KXJldHVybiBzCnM9NjY0NTk3KkouaGYodGhpcy5hKSY1MzY4NzA5MTEKdGhpcy5faGFzaENvZGU9cwpy
+ZXR1cm4gc30sCnc6ZnVuY3Rpb24oYSl7cmV0dXJuJ1N5bWJvbCgiJytILkVqKHRoaXMuYSkrJyIpJ30s
+CkROOmZ1bmN0aW9uKGEsYil7aWYoYj09bnVsbClyZXR1cm4hMQpyZXR1cm4gYiBpbnN0YW5jZW9mIEgu
+d3YmJnRoaXMuYT09Yi5hfSwKJGlHRDoxfQpILlFDLnByb3RvdHlwZT17fQpILlBELnByb3RvdHlwZT17
+fQpILldVLnByb3RvdHlwZT17CmdsMDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5nQSh0aGlzKT09PTB9
+LAp3OmZ1bmN0aW9uKGEpe3JldHVybiBQLm5PKHRoaXMpfSwKWTpmdW5jdGlvbihhLGIsYyl7dmFyIHM9
+SC5MaCh0aGlzKQpzLmMuYShiKQpzLlFbMV0uYShjKQpILmRjKCkKSC5CaSh1LmcpfSwKZ1B1OmZ1bmN0
+aW9uKGEpe3JldHVybiB0aGlzLnE0KGEsSC5MaCh0aGlzKS5DKCJOMzwxLDI+IikpfSwKcTQ6ZnVuY3Rp
+b24oYSxiKXt2YXIgcz10aGlzCnJldHVybiBQLmwwKGZ1bmN0aW9uKCl7dmFyIHI9YQp2YXIgcT0wLHA9
+MSxvLG4sbSxsLGsKcmV0dXJuIGZ1bmN0aW9uICRhc3luYyRnUHUoYyxkKXtpZihjPT09MSl7bz1kCnE9
+cH13aGlsZSh0cnVlKXN3aXRjaChxKXtjYXNlIDA6bj1zLmdWKCksbj1uLmdtKG4pLG09SC5MaChzKSxt
+PW0uQygiQDwxPiIpLktxKG0uUVsxXSkuQygiTjM8MSwyPiIpCmNhc2UgMjppZighbi5GKCkpe3E9Mwpi
+cmVha31sPW4uZ2woKQprPXMucSgwLGwpCmsudG9TdHJpbmcKcT00CnJldHVybiBuZXcgUC5OMyhsLGss
+bSkKY2FzZSA0OnE9MgpicmVhawpjYXNlIDM6cmV0dXJuIFAuVGgoKQpjYXNlIDE6cmV0dXJuIFAuWW0o
+byl9fX0sYil9LAokaVowOjF9CkguTFAucHJvdG90eXBlPXsKZ0E6ZnVuY3Rpb24oYSl7cmV0dXJuIHRo
+aXMuYX0sCng0OmZ1bmN0aW9uKGEpe2lmKHR5cGVvZiBhIT0ic3RyaW5nIilyZXR1cm4hMQppZigiX19w
+cm90b19fIj09PWEpcmV0dXJuITEKcmV0dXJuIHRoaXMuYi5oYXNPd25Qcm9wZXJ0eShhKX0sCnE6ZnVu
+Y3Rpb24oYSxiKXtpZighdGhpcy54NChiKSlyZXR1cm4gbnVsbApyZXR1cm4gdGhpcy5xUChiKX0sCnFQ
+OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmJbSC5oKGEpXX0sCks6ZnVuY3Rpb24oYSxiKXt2YXIgcyxy
+LHEscCxvPUguTGgodGhpcykKby5DKCJ+KDEsMikiKS5hKGIpCnM9dGhpcy5jCmZvcihyPXMubGVuZ3Ro
+LG89by5RWzFdLHE9MDtxPHI7KytxKXtwPXNbcV0KYi4kMihwLG8uYSh0aGlzLnFQKHApKSl9fSwKZ1Y6
+ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEguWFIodGhpcyxILkxoKHRoaXMpLkMoIlhSPDE+IikpfX0KSC5Y
+Ui5wcm90b3R5cGU9ewpnbTpmdW5jdGlvbihhKXt2YXIgcz10aGlzLmEuYwpyZXR1cm4gbmV3IEoubTEo
+cyxzLmxlbmd0aCxILnQ2KHMpLkMoIm0xPDE+IikpfSwKZ0E6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMu
+YS5jLmxlbmd0aH19CkguTEkucHJvdG90eXBlPXsKZ1dhOmZ1bmN0aW9uKCl7dmFyIHM9dGhpcy5hCnJl
+dHVybiBzfSwKZ25kOmZ1bmN0aW9uKCl7dmFyIHMscixxLHAsbz10aGlzCmlmKG8uYz09PTEpcmV0dXJu
+IEMuaFUKcz1vLmQKcj1zLmxlbmd0aC1vLmUubGVuZ3RoLW8uZgppZihyPT09MClyZXR1cm4gQy5oVQpx
+PVtdCmZvcihwPTA7cDxyOysrcCl7aWYocD49cy5sZW5ndGgpcmV0dXJuIEguT0gocyxwKQpxLnB1c2go
+c1twXSl9cmV0dXJuIEouekMocSl9LApnVm06ZnVuY3Rpb24oKXt2YXIgcyxyLHEscCxvLG4sbSxsLGs9
+dGhpcwppZihrLmMhPT0wKXJldHVybiBDLldPCnM9ay5lCnI9cy5sZW5ndGgKcT1rLmQKcD1xLmxlbmd0
+aC1yLWsuZgppZihyPT09MClyZXR1cm4gQy5XTwpvPW5ldyBILk41KHQuZW8pCmZvcihuPTA7bjxyOysr
+bil7aWYobj49cy5sZW5ndGgpcmV0dXJuIEguT0gocyxuKQptPXNbbl0KbD1wK24KaWYobDwwfHxsPj1x
+Lmxlbmd0aClyZXR1cm4gSC5PSChxLGwpCm8uWSgwLG5ldyBILnd2KG0pLHFbbF0pfXJldHVybiBuZXcg
+SC5QRChvLHQuZ0YpfSwKJGl2UToxfQpILkNqLnByb3RvdHlwZT17CiQyOmZ1bmN0aW9uKGEsYil7dmFy
+IHMKSC5oKGEpCnM9dGhpcy5hCnMuYj1zLmIrIiQiK0guRWooYSkKQy5ObS5pKHRoaXMuYixhKQpDLk5t
+LmkodGhpcy5jLGIpOysrcy5hfSwKJFM6MTN9CkguZjkucHJvdG90eXBlPXsKcVM6ZnVuY3Rpb24oYSl7
+dmFyIHMscixxPXRoaXMscD1uZXcgUmVnRXhwKHEuYSkuZXhlYyhhKQppZihwPT1udWxsKXJldHVybiBu
+dWxsCnM9T2JqZWN0LmNyZWF0ZShudWxsKQpyPXEuYgppZihyIT09LTEpcy5hcmd1bWVudHM9cFtyKzFd
+CnI9cS5jCmlmKHIhPT0tMSlzLmFyZ3VtZW50c0V4cHI9cFtyKzFdCnI9cS5kCmlmKHIhPT0tMSlzLmV4
+cHI9cFtyKzFdCnI9cS5lCmlmKHIhPT0tMSlzLm1ldGhvZD1wW3IrMV0Kcj1xLmYKaWYociE9PS0xKXMu
+cmVjZWl2ZXI9cFtyKzFdCnJldHVybiBzfX0KSC5XMC5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3Zh
+ciBzPXRoaXMuYgppZihzPT1udWxsKXJldHVybiJOb1N1Y2hNZXRob2RFcnJvcjogIitILkVqKHRoaXMu
+YSkKcmV0dXJuIk5vU3VjaE1ldGhvZEVycm9yOiBtZXRob2Qgbm90IGZvdW5kOiAnIitzKyInIG9uIG51
+bGwifX0KSC5hei5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3ZhciBzLHI9dGhpcyxxPSJOb1N1Y2hN
+ZXRob2RFcnJvcjogbWV0aG9kIG5vdCBmb3VuZDogJyIscD1yLmIKaWYocD09bnVsbClyZXR1cm4iTm9T
+dWNoTWV0aG9kRXJyb3I6ICIrSC5FaihyLmEpCnM9ci5jCmlmKHM9PW51bGwpcmV0dXJuIHErcCsiJyAo
+IitILkVqKHIuYSkrIikiCnJldHVybiBxK3ArIicgb24gJyIrcysiJyAoIitILkVqKHIuYSkrIikifX0K
+SC52Vi5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3ZhciBzPXRoaXMuYQpyZXR1cm4gcy5sZW5ndGg9
+PT0wPyJFcnJvciI6IkVycm9yOiAiK3N9fQpILnRlLnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7cmV0
+dXJuIlRocm93IG9mIG51bGwgKCciKyh0aGlzLmE9PT1udWxsPyJudWxsIjoidW5kZWZpbmVkIikrIicg
+ZnJvbSBKYXZhU2NyaXB0KSJ9LAokaVJ6OjF9CkguYnEucHJvdG90eXBlPXt9CkguWE8ucHJvdG90eXBl
+PXsKdzpmdW5jdGlvbihhKXt2YXIgcyxyPXRoaXMuYgppZihyIT1udWxsKXJldHVybiByCnI9dGhpcy5h
+CnM9ciE9PW51bGwmJnR5cGVvZiByPT09Im9iamVjdCI/ci5zdGFjazpudWxsCnJldHVybiB0aGlzLmI9
+cz09bnVsbD8iIjpzfSwKJGlHejoxfQpILlRwLnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7dmFyIHM9
+dGhpcy5jb25zdHJ1Y3RvcixyPXM9PW51bGw/bnVsbDpzLm5hbWUKcmV0dXJuIkNsb3N1cmUgJyIrSC5O
+UShyPT1udWxsPyJ1bmtub3duIjpyKSsiJyJ9LAokaUVIOjEsCmdLdTpmdW5jdGlvbigpe3JldHVybiB0
+aGlzfSwKJEM6IiQxIiwKJFI6MSwKJEQ6bnVsbH0KSC5sYy5wcm90b3R5cGU9e30KSC56eC5wcm90b3R5
+cGU9ewp3OmZ1bmN0aW9uKGEpe3ZhciBzPXRoaXMuJHN0YXRpY19uYW1lCmlmKHM9PW51bGwpcmV0dXJu
+IkNsb3N1cmUgb2YgdW5rbm93biBzdGF0aWMgbWV0aG9kIgpyZXR1cm4iQ2xvc3VyZSAnIitILk5RKHMp
+KyInIn19CkguclQucHJvdG90eXBlPXsKRE46ZnVuY3Rpb24oYSxiKXt2YXIgcz10aGlzCmlmKGI9PW51
+bGwpcmV0dXJuITEKaWYocz09PWIpcmV0dXJuITAKaWYoIShiIGluc3RhbmNlb2YgSC5yVCkpcmV0dXJu
+ITEKcmV0dXJuIHMuYT09PWIuYSYmcy5iPT09Yi5iJiZzLmM9PT1iLmN9LApnaU86ZnVuY3Rpb24oYSl7
+dmFyIHMscj10aGlzLmMKaWYocj09bnVsbClzPUguZVEodGhpcy5hKQplbHNlIHM9dHlwZW9mIHIhPT0i
+b2JqZWN0Ij9KLmhmKHIpOkguZVEocikKcj1ILmVRKHRoaXMuYikKaWYodHlwZW9mIHMhPT0ibnVtYmVy
+IilyZXR1cm4gcy53TygpCnJldHVybihzXnIpPj4+MH0sCnc6ZnVuY3Rpb24oYSl7dmFyIHM9dGhpcy5j
+CmlmKHM9PW51bGwpcz10aGlzLmEKcmV0dXJuIkNsb3N1cmUgJyIrSC5Faih0aGlzLmQpKyInIG9mICIr
+KCJJbnN0YW5jZSBvZiAnIitILkVqKEguTShzKSkrIiciKX19CkguRXEucHJvdG90eXBlPXsKdzpmdW5j
+dGlvbihhKXtyZXR1cm4iUnVudGltZUVycm9yOiAiK3RoaXMuYX19Ckgua1kucHJvdG90eXBlPXsKdzpm
+dW5jdGlvbihhKXtyZXR1cm4iQXNzZXJ0aW9uIGZhaWxlZDogIitQLmhsKHRoaXMuYSl9fQpILmtyLnBy
+b3RvdHlwZT17fQpILk41LnByb3RvdHlwZT17CmdBOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmF9LApn
+bDA6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYT09PTB9LApnVjpmdW5jdGlvbigpe3JldHVybiBuZXcg
+SC5pNSh0aGlzLEguTGgodGhpcykuQygiaTU8MT4iKSl9LAp4NDpmdW5jdGlvbihhKXt2YXIgcyxyCmlm
+KHR5cGVvZiBhPT0ic3RyaW5nIil7cz10aGlzLmIKaWYocz09bnVsbClyZXR1cm4hMQpyZXR1cm4gdGhp
+cy5YdShzLGEpfWVsc2V7cj10aGlzLkNYKGEpCnJldHVybiByfX0sCkNYOmZ1bmN0aW9uKGEpe3ZhciBz
+PXRoaXMuZAppZihzPT1udWxsKXJldHVybiExCnJldHVybiB0aGlzLkZoKHRoaXMuQnQocyxKLmhmKGEp
+JjB4M2ZmZmZmZiksYSk+PTB9LApxOmZ1bmN0aW9uKGEsYil7dmFyIHMscixxLHAsbz10aGlzLG49bnVs
+bAppZih0eXBlb2YgYj09InN0cmluZyIpe3M9by5iCmlmKHM9PW51bGwpcmV0dXJuIG4Kcj1vLmoyKHMs
+YikKcT1yPT1udWxsP246ci5iCnJldHVybiBxfWVsc2UgaWYodHlwZW9mIGI9PSJudW1iZXIiJiYoYiYw
+eDNmZmZmZmYpPT09Yil7cD1vLmMKaWYocD09bnVsbClyZXR1cm4gbgpyPW8uajIocCxiKQpxPXI9PW51
+bGw/bjpyLmIKcmV0dXJuIHF9ZWxzZSByZXR1cm4gby5hYShiKX0sCmFhOmZ1bmN0aW9uKGEpe3ZhciBz
+LHIscT10aGlzLmQKaWYocT09bnVsbClyZXR1cm4gbnVsbApzPXRoaXMuQnQocSxKLmhmKGEpJjB4M2Zm
+ZmZmZikKcj10aGlzLkZoKHMsYSkKaWYocjwwKXJldHVybiBudWxsCnJldHVybiBzW3JdLmJ9LApZOmZ1
+bmN0aW9uKGEsYixjKXt2YXIgcyxyLHEscCxvLG4sbT10aGlzLGw9SC5MaChtKQpsLmMuYShiKQpsLlFb
+MV0uYShjKQppZih0eXBlb2YgYj09InN0cmluZyIpe3M9bS5iCm0uRUgocz09bnVsbD9tLmI9bS56Sygp
+OnMsYixjKX1lbHNlIGlmKHR5cGVvZiBiPT0ibnVtYmVyIiYmKGImMHgzZmZmZmZmKT09PWIpe3I9bS5j
+Cm0uRUgocj09bnVsbD9tLmM9bS56SygpOnIsYixjKX1lbHNle3E9bS5kCmlmKHE9PW51bGwpcT1tLmQ9
+bS56SygpCnA9Si5oZihiKSYweDNmZmZmZmYKbz1tLkJ0KHEscCkKaWYobz09bnVsbCltLkVJKHEscCxb
+bS5IbihiLGMpXSkKZWxzZXtuPW0uRmgobyxiKQppZihuPj0wKW9bbl0uYj1jCmVsc2Ugby5wdXNoKG0u
+SG4oYixjKSl9fX0sCks6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyLHE9dGhpcwpILkxoKHEpLkMoIn4oMSwy
+KSIpLmEoYikKcz1xLmUKcj1xLnIKZm9yKDtzIT1udWxsOyl7Yi4kMihzLmEscy5iKQppZihyIT09cS5y
+KXRocm93IEguYihQLmE0KHEpKQpzPXMuY319LApFSDpmdW5jdGlvbihhLGIsYyl7dmFyIHMscj10aGlz
+LHE9SC5MaChyKQpxLmMuYShiKQpxLlFbMV0uYShjKQpzPXIuajIoYSxiKQppZihzPT1udWxsKXIuRUko
+YSxiLHIuSG4oYixjKSkKZWxzZSBzLmI9Y30sCmtzOmZ1bmN0aW9uKCl7dGhpcy5yPXRoaXMucisxJjY3
+MTA4ODYzfSwKSG46ZnVuY3Rpb24oYSxiKXt2YXIgcz10aGlzLHI9SC5MaChzKSxxPW5ldyBILnZoKHIu
+Yy5hKGEpLHIuUVsxXS5hKGIpKQppZihzLmU9PW51bGwpcy5lPXMuZj1xCmVsc2V7cj1zLmYKci50b1N0
+cmluZwpxLmQ9cgpzLmY9ci5jPXF9KytzLmEKcy5rcygpCnJldHVybiBxfSwKRmg6ZnVuY3Rpb24oYSxi
+KXt2YXIgcyxyCmlmKGE9PW51bGwpcmV0dXJuLTEKcz1hLmxlbmd0aApmb3Iocj0wO3I8czsrK3IpaWYo
+Si5STShhW3JdLmEsYikpcmV0dXJuIHIKcmV0dXJuLTF9LAp3OmZ1bmN0aW9uKGEpe3JldHVybiBQLm5P
+KHRoaXMpfSwKajI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYVtiXX0sCkJ0OmZ1bmN0aW9uKGEsYil7cmV0
+dXJuIGFbYl19LApFSTpmdW5jdGlvbihhLGIsYyl7YVtiXT1jfSwKcm46ZnVuY3Rpb24oYSxiKXtkZWxl
+dGUgYVtiXX0sClh1OmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuajIoYSxiKSE9bnVsbH0sCnpLOmZ1
+bmN0aW9uKCl7dmFyIHM9Ijxub24taWRlbnRpZmllci1rZXk+IixyPU9iamVjdC5jcmVhdGUobnVsbCkK
+dGhpcy5FSShyLHMscikKdGhpcy5ybihyLHMpCnJldHVybiByfSwKJGlGbzoxfQpILnZoLnByb3RvdHlw
+ZT17fQpILmk1LnByb3RvdHlwZT17CmdBOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmEuYX0sCmdsMDpm
+dW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hLmE9PT0wfSwKZ206ZnVuY3Rpb24oYSl7dmFyIHM9dGhpcy5h
+LHI9bmV3IEguTjYocyxzLnIsdGhpcy4kdGkuQygiTjY8MT4iKSkKci5jPXMuZQpyZXR1cm4gcn0sCnRn
+OmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuYS54NChiKX19CkguTjYucHJvdG90eXBlPXsKZ2w6ZnVu
+Y3Rpb24oKXtyZXR1cm4gdGhpcy5kfSwKRjpmdW5jdGlvbigpe3ZhciBzLHI9dGhpcyxxPXIuYQppZihy
+LmIhPT1xLnIpdGhyb3cgSC5iKFAuYTQocSkpCnM9ci5jCmlmKHM9PW51bGwpe3Iuc3FZKG51bGwpCnJl
+dHVybiExfWVsc2V7ci5zcVkocy5hKQpyLmM9cy5jCnJldHVybiEwfX0sCnNxWTpmdW5jdGlvbihhKXt0
+aGlzLmQ9dGhpcy4kdGkuQygiMT8iKS5hKGEpfSwKJGlBbjoxfQpILmRDLnByb3RvdHlwZT17CiQxOmZ1
+bmN0aW9uKGEpe3JldHVybiB0aGlzLmEoYSl9LAokUzo0fQpILndOLnByb3RvdHlwZT17CiQyOmZ1bmN0
+aW9uKGEsYil7cmV0dXJuIHRoaXMuYShhLGIpfSwKJFM6NDJ9CkguVlgucHJvdG90eXBlPXsKJDE6ZnVu
+Y3Rpb24oYSl7cmV0dXJuIHRoaXMuYShILmgoYSkpfSwKJFM6MzV9CkguVlIucHJvdG90eXBlPXsKdzpm
+dW5jdGlvbihhKXtyZXR1cm4iUmVnRXhwLyIrdGhpcy5hKyIvIit0aGlzLmIuZmxhZ3N9LApnSGM6ZnVu
+Y3Rpb24oKXt2YXIgcz10aGlzLHI9cy5jCmlmKHIhPW51bGwpcmV0dXJuIHIKcj1zLmIKcmV0dXJuIHMu
+Yz1ILnY0KHMuYSxyLm11bHRpbGluZSwhci5pZ25vcmVDYXNlLHIudW5pY29kZSxyLmRvdEFsbCwhMCl9
+LApkZDpmdW5jdGlvbihhLGIpe3JldHVybiBuZXcgSC5LVyh0aGlzLGIsMCl9LApVWjpmdW5jdGlvbihh
+LGIpe3ZhciBzLHI9dGhpcy5nSGMoKQpyLmxhc3RJbmRleD1iCnM9ci5leGVjKGEpCmlmKHM9PW51bGwp
+cmV0dXJuIG51bGwKcmV0dXJuIG5ldyBILkVLKHMpfSwKJGl2WDoxLAokaXdMOjF9CkguRUsucHJvdG90
+eXBlPXsKcTpmdW5jdGlvbihhLGIpe3ZhciBzCkgudVAoYikKcz10aGlzLmIKaWYoYj49cy5sZW5ndGgp
+cmV0dXJuIEguT0gocyxiKQpyZXR1cm4gc1tiXX0sCiRpT2Q6MSwKJGlpYjoxfQpILktXLnByb3RvdHlw
+ZT17CmdtOmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgSC5QYih0aGlzLmEsdGhpcy5iLHRoaXMuYyl9fQpI
+LlBiLnByb3RvdHlwZT17CmdsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZH0sCkY6ZnVuY3Rpb24oKXt2
+YXIgcyxyLHEscCxvLG4sbT10aGlzLGw9bS5iCmlmKGw9PW51bGwpcmV0dXJuITEKcz1tLmMKcj1sLmxl
+bmd0aAppZihzPD1yKXtxPW0uYQpwPXEuVVoobCxzKQppZihwIT1udWxsKXttLmQ9cApzPXAuYgpvPXMu
+aW5kZXgKbj1vK3NbMF0ubGVuZ3RoCmlmKG89PT1uKXtpZihxLmIudW5pY29kZSl7cz1tLmMKcT1zKzEK
+aWYocTxyKXtzPUMueEIuTzIobCxzKQppZihzPj01NTI5NiYmczw9NTYzMTkpe3M9Qy54Qi5PMihsLHEp
+CnM9cz49NTYzMjAmJnM8PTU3MzQzfWVsc2Ugcz0hMX1lbHNlIHM9ITF9ZWxzZSBzPSExCm49KHM/bisx
+Om4pKzF9bS5jPW4KcmV0dXJuITB9fW0uYj1tLmQ9bnVsbApyZXR1cm4hMX0sCiRpQW46MX0KSC50US5w
+cm90b3R5cGU9ewpxOmZ1bmN0aW9uKGEsYil7SC51UChiKQppZihiIT09MClILnYoUC5PNyhiLG51bGwp
+KQpyZXR1cm4gdGhpcy5jfSwKJGlPZDoxfQpILnVuLnByb3RvdHlwZT17CmdtOmZ1bmN0aW9uKGEpe3Jl
+dHVybiBuZXcgSC5TZCh0aGlzLmEsdGhpcy5iLHRoaXMuYyl9fQpILlNkLnByb3RvdHlwZT17CkY6ZnVu
+Y3Rpb24oKXt2YXIgcyxyLHE9dGhpcyxwPXEuYyxvPXEuYixuPW8ubGVuZ3RoLG09cS5hLGw9bS5sZW5n
+dGgKaWYocCtuPmwpe3EuZD1udWxsCnJldHVybiExfXM9bS5pbmRleE9mKG8scCkKaWYoczwwKXtxLmM9
+bCsxCnEuZD1udWxsCnJldHVybiExfXI9cytuCnEuZD1uZXcgSC50UShzLG8pCnEuYz1yPT09cS5jP3Ir
+MTpyCnJldHVybiEwfSwKZ2w6ZnVuY3Rpb24oKXt2YXIgcz10aGlzLmQKcy50b1N0cmluZwpyZXR1cm4g
+c30sCiRpQW46MX0KSC5FVC5wcm90b3R5cGU9eyRpRVQ6MSwkaUFTOjF9CkguWEgucHJvdG90eXBlPXsK
+Z0E6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubGVuZ3RofSwKJGlYajoxfQpILkRnLnByb3RvdHlwZT17CnE6
+ZnVuY3Rpb24oYSxiKXtILnVQKGIpCkgub2QoYixhLGEubGVuZ3RoKQpyZXR1cm4gYVtiXX0sClk6ZnVu
+Y3Rpb24oYSxiLGMpe0guR0goYykKSC5vZChiLGEsYS5sZW5ndGgpCmFbYl09Y30sCiRpYlE6MSwKJGlj
+WDoxLAokaXpNOjF9CkguUGcucHJvdG90eXBlPXsKWTpmdW5jdGlvbihhLGIsYyl7SC51UChjKQpILm9k
+KGIsYSxhLmxlbmd0aCkKYVtiXT1jfSwKJGliUToxLAokaWNYOjEsCiRpek06MX0KSC54ai5wcm90b3R5
+cGU9ewpxOmZ1bmN0aW9uKGEsYil7SC51UChiKQpILm9kKGIsYSxhLmxlbmd0aCkKcmV0dXJuIGFbYl19
+fQpILmRFLnByb3RvdHlwZT17CnE6ZnVuY3Rpb24oYSxiKXtILnVQKGIpCkgub2QoYixhLGEubGVuZ3Ro
+KQpyZXR1cm4gYVtiXX19CkguWkEucHJvdG90eXBlPXsKcTpmdW5jdGlvbihhLGIpe0gudVAoYikKSC5v
+ZChiLGEsYS5sZW5ndGgpCnJldHVybiBhW2JdfX0KSC5kVC5wcm90b3R5cGU9ewpxOmZ1bmN0aW9uKGEs
+Yil7SC51UChiKQpILm9kKGIsYSxhLmxlbmd0aCkKcmV0dXJuIGFbYl19fQpILlBxLnByb3RvdHlwZT17
+CnE6ZnVuY3Rpb24oYSxiKXtILnVQKGIpCkgub2QoYixhLGEubGVuZ3RoKQpyZXR1cm4gYVtiXX19Ckgu
+ZUUucHJvdG90eXBlPXsKZ0E6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubGVuZ3RofSwKcTpmdW5jdGlvbihh
+LGIpe0gudVAoYikKSC5vZChiLGEsYS5sZW5ndGgpCnJldHVybiBhW2JdfX0KSC5WNi5wcm90b3R5cGU9
+ewpnQTpmdW5jdGlvbihhKXtyZXR1cm4gYS5sZW5ndGh9LApxOmZ1bmN0aW9uKGEsYil7SC51UChiKQpI
+Lm9kKGIsYSxhLmxlbmd0aCkKcmV0dXJuIGFbYl19LAokaVY2OjEsCiRpbjY6MX0KSC5SRy5wcm90b3R5
+cGU9e30KSC5WUC5wcm90b3R5cGU9e30KSC5XQi5wcm90b3R5cGU9e30KSC5aRy5wcm90b3R5cGU9e30K
+SC5KYy5wcm90b3R5cGU9ewpDOmZ1bmN0aW9uKGEpe3JldHVybiBILmNFKHYudHlwZVVuaXZlcnNlLHRo
+aXMsYSl9LApLcTpmdW5jdGlvbihhKXtyZXR1cm4gSC52NSh2LnR5cGVVbml2ZXJzZSx0aGlzLGEpfX0K
+SC5HLnByb3RvdHlwZT17fQpILmtTLnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMu
+YX19CkguaU0ucHJvdG90eXBlPXt9ClAudGgucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dmFyIHM9
+dGhpcy5hLHI9cy5hCnMuYT1udWxsCnIuJDAoKX0sCiRTOjl9ClAuaGEucHJvdG90eXBlPXsKJDE6ZnVu
+Y3Rpb24oYSl7dmFyIHMscgp0aGlzLmEuYT10Lk0uYShhKQpzPXRoaXMuYgpyPXRoaXMuYwpzLmZpcnN0
+Q2hpbGQ/cy5yZW1vdmVDaGlsZChyKTpzLmFwcGVuZENoaWxkKHIpfSwKJFM6NTN9ClAuVnMucHJvdG90
+eXBlPXsKJDA6ZnVuY3Rpb24oKXt0aGlzLmEuJDAoKX0sCiRDOiIkMCIsCiRSOjAsCiRTOjF9ClAuRnQu
+cHJvdG90eXBlPXsKJDA6ZnVuY3Rpb24oKXt0aGlzLmEuJDAoKX0sCiRDOiIkMCIsCiRSOjAsCiRTOjF9
+ClAuVzMucHJvdG90eXBlPXsKQ1k6ZnVuY3Rpb24oYSxiKXtpZihzZWxmLnNldFRpbWVvdXQhPW51bGwp
+c2VsZi5zZXRUaW1lb3V0KEgudFIobmV3IFAueUgodGhpcyxiKSwwKSxhKQplbHNlIHRocm93IEguYihQ
+Lkw0KCJgc2V0VGltZW91dCgpYCBub3QgZm91bmQuIikpfX0KUC55SC5wcm90b3R5cGU9ewokMDpmdW5j
+dGlvbigpe3RoaXMuYi4kMCgpfSwKJEM6IiQwIiwKJFI6MCwKJFM6MH0KUC5paC5wcm90b3R5cGU9ewph
+TTpmdW5jdGlvbihhLGIpe3ZhciBzLHI9dGhpcyxxPXIuJHRpCnEuQygiMS8/IikuYShiKQppZighci5i
+KXIuYS5YZihiKQplbHNle3M9ci5hCmlmKHEuQygiYjg8MT4iKS5iKGIpKXMuY1UoYikKZWxzZSBzLlgy
+KHEuYy5hKGIpKX19LAp3MDpmdW5jdGlvbihhLGIpe3ZhciBzCmlmKGI9PW51bGwpYj1QLnYwKGEpCnM9
+dGhpcy5hCmlmKHRoaXMuYilzLlpMKGEsYikKZWxzZSBzLk5rKGEsYil9fQpQLldNLnByb3RvdHlwZT17
+CiQxOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmEuJDIoMCxhKX0sCiRTOjQ3fQpQLlNYLnByb3RvdHlw
+ZT17CiQyOmZ1bmN0aW9uKGEsYil7dGhpcy5hLiQyKDEsbmV3IEguYnEoYSx0LmwuYShiKSkpfSwKJEM6
+IiQyIiwKJFI6MiwKJFM6Mjd9ClAuR3MucHJvdG90eXBlPXsKJDI6ZnVuY3Rpb24oYSxiKXt0aGlzLmEo
+SC51UChhKSxiKX0sCiRTOjI1fQpQLkZ5LnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7cmV0dXJuIkl0
+ZXJhdGlvbk1hcmtlcigiK3RoaXMuYisiLCAiK0guRWoodGhpcy5hKSsiKSJ9fQpQLkdWLnByb3RvdHlw
+ZT17CmdsOmZ1bmN0aW9uKCl7dmFyIHM9dGhpcy5jCmlmKHM9PW51bGwpcmV0dXJuIHRoaXMuJHRpLmMu
+YSh0aGlzLmIpCnJldHVybiBzLmdsKCl9LApGOmZ1bmN0aW9uKCl7dmFyIHMscixxLHAsbyxuLG09dGhp
+cwpmb3Iocz1tLiR0aS5DKCJBbjwxPiIpOyEwOyl7cj1tLmMKaWYociE9bnVsbClpZihyLkYoKSlyZXR1
+cm4hMAplbHNlIG0uc1g5KG51bGwpCnE9ZnVuY3Rpb24oYSxiLGMpe3ZhciBsLGs9Ygp3aGlsZSh0cnVl
+KXRyeXtyZXR1cm4gYShrLGwpfWNhdGNoKGope2w9agprPWN9fShtLmEsMCwxKQppZihxIGluc3RhbmNl
+b2YgUC5GeSl7cD1xLmIKaWYocD09PTIpe289bS5kCmlmKG89PW51bGx8fG8ubGVuZ3RoPT09MCl7bS5z
+RUMobnVsbCkKcmV0dXJuITF9aWYoMD49by5sZW5ndGgpcmV0dXJuIEguT0gobywtMSkKbS5hPW8ucG9w
+KCkKY29udGludWV9ZWxzZXtyPXEuYQppZihwPT09Myl0aHJvdyByCmVsc2V7bj1zLmEoSi5JVChyKSkK
+aWYobiBpbnN0YW5jZW9mIFAuR1Ype3I9bS5kCmlmKHI9PW51bGwpcj1tLmQ9W10KQy5ObS5pKHIsbS5h
+KQptLmE9bi5hCmNvbnRpbnVlfWVsc2V7bS5zWDkobikKY29udGludWV9fX19ZWxzZXttLnNFQyhxKQpy
+ZXR1cm4hMH19cmV0dXJuITF9LApzRUM6ZnVuY3Rpb24oYSl7dGhpcy5iPXRoaXMuJHRpLkMoIjE/Iiku
+YShhKX0sCnNYOTpmdW5jdGlvbihhKXt0aGlzLmM9dGhpcy4kdGkuQygiQW48MT4/IikuYShhKX0sCiRp
+QW46MX0KUC5xNC5wcm90b3R5cGU9ewpnbTpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFAuR1YodGhpcy5h
+KCksdGhpcy4kdGkuQygiR1Y8MT4iKSl9fQpQLlBmLnByb3RvdHlwZT17CncwOmZ1bmN0aW9uKGEsYil7
+dmFyIHMKUC5VSShhLCJlcnJvciIsdC5LKQpzPXRoaXMuYQppZihzLmEhPT0wKXRocm93IEguYihQLlBW
+KCJGdXR1cmUgYWxyZWFkeSBjb21wbGV0ZWQiKSkKaWYoYj09bnVsbCliPVAudjAoYSkKcy5OayhhLGIp
+fSwKcG06ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMudzAoYSxudWxsKX19ClAuWmYucHJvdG90eXBlPXsK
+YU06ZnVuY3Rpb24oYSxiKXt2YXIgcyxyPXRoaXMuJHRpCnIuQygiMS8/IikuYShiKQpzPXRoaXMuYQpp
+ZihzLmEhPT0wKXRocm93IEguYihQLlBWKCJGdXR1cmUgYWxyZWFkeSBjb21wbGV0ZWQiKSkKcy5YZihy
+LkMoIjEvIikuYShiKSl9fQpQLkZlLnByb3RvdHlwZT17CkhSOmZ1bmN0aW9uKGEpe2lmKCh0aGlzLmMm
+MTUpIT09NilyZXR1cm4hMApyZXR1cm4gdGhpcy5iLmIuYnYodC5hbC5hKHRoaXMuZCksYS5hLHQueSx0
+LkspfSwKS3c6ZnVuY3Rpb24oYSl7dmFyIHM9dGhpcy5lLHI9dC56LHE9dC5LLHA9dGhpcy4kdGkuQygi
+Mi8iKSxvPXRoaXMuYi5iCmlmKHQuYWcuYihzKSlyZXR1cm4gcC5hKG8ucnAocyxhLmEsYS5iLHIscSx0
+LmwpKQplbHNlIHJldHVybiBwLmEoby5idih0LmJJLmEocyksYS5hLHIscSkpfX0KUC52cy5wcm90b3R5
+cGU9ewpTcTpmdW5jdGlvbihhLGIsYyl7dmFyIHMscixxLHA9dGhpcy4kdGkKcC5LcShjKS5DKCIxLygy
+KSIpLmEoYSkKcz0kLlgzCmlmKHMhPT1DLk5VKXtjLkMoIkA8MC8+IikuS3EocC5jKS5DKCIxKDIpIiku
+YShhKQppZihiIT1udWxsKWI9UC5WSChiLHMpfXI9bmV3IFAudnMocyxjLkMoInZzPDA+IikpCnE9Yj09
+bnVsbD8xOjMKdGhpcy54ZihuZXcgUC5GZShyLHEsYSxiLHAuQygiQDwxPiIpLktxKGMpLkMoIkZlPDEs
+Mj4iKSkpCnJldHVybiByfSwKVzc6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5TcShhLG51bGwsYil9
+LApRZDpmdW5jdGlvbihhLGIsYyl7dmFyIHMscj10aGlzLiR0aQpyLktxKGMpLkMoIjEvKDIpIikuYShh
+KQpzPW5ldyBQLnZzKCQuWDMsYy5DKCJ2czwwPiIpKQp0aGlzLnhmKG5ldyBQLkZlKHMsMTksYSxiLHIu
+QygiQDwxPiIpLktxKGMpLkMoIkZlPDEsMj4iKSkpCnJldHVybiBzfSwKeGY6ZnVuY3Rpb24oYSl7dmFy
+IHMscj10aGlzLHE9ci5hCmlmKHE8PTEpe2EuYT10LkYuYShyLmMpCnIuYz1hfWVsc2V7aWYocT09PTIp
+e3M9dC5jLmEoci5jKQpxPXMuYQppZihxPDQpe3MueGYoYSkKcmV0dXJufXIuYT1xCnIuYz1zLmN9UC5U
+ayhudWxsLG51bGwsci5iLHQuTS5hKG5ldyBQLmRhKHIsYSkpKX19LApqUTpmdW5jdGlvbihhKXt2YXIg
+cyxyLHEscCxvLG4sbT10aGlzLGw9e30KbC5hPWEKaWYoYT09bnVsbClyZXR1cm4Kcz1tLmEKaWYoczw9
+MSl7cj10LkYuYShtLmMpCm0uYz1hCmlmKHIhPW51bGwpe3E9YS5hCmZvcihwPWE7cSE9bnVsbDtwPXEs
+cT1vKW89cS5hCnAuYT1yfX1lbHNle2lmKHM9PT0yKXtuPXQuYy5hKG0uYykKcz1uLmEKaWYoczw0KXtu
+LmpRKGEpCnJldHVybn1tLmE9cwptLmM9bi5jfWwuYT1tLk44KGEpClAuVGsobnVsbCxudWxsLG0uYix0
+Lk0uYShuZXcgUC5vUShsLG0pKSl9fSwKYWg6ZnVuY3Rpb24oKXt2YXIgcz10LkYuYSh0aGlzLmMpCnRo
+aXMuYz1udWxsCnJldHVybiB0aGlzLk44KHMpfSwKTjg6ZnVuY3Rpb24oYSl7dmFyIHMscixxCmZvcihz
+PWEscj1udWxsO3MhPW51bGw7cj1zLHM9cSl7cT1zLmEKcy5hPXJ9cmV0dXJuIHJ9LApISDpmdW5jdGlv
+bihhKXt2YXIgcyxyPXRoaXMscT1yLiR0aQpxLkMoIjEvIikuYShhKQppZihxLkMoImI4PDE+IikuYihh
+KSlpZihxLmIoYSkpUC5BOShhLHIpCmVsc2UgUC5rMyhhLHIpCmVsc2V7cz1yLmFoKCkKcS5jLmEoYSkK
+ci5hPTQKci5jPWEKUC5IWihyLHMpfX0sClgyOmZ1bmN0aW9uKGEpe3ZhciBzLHI9dGhpcwpyLiR0aS5j
+LmEoYSkKcz1yLmFoKCkKci5hPTQKci5jPWEKUC5IWihyLHMpfSwKWkw6ZnVuY3Rpb24oYSxiKXt2YXIg
+cyxyLHE9dGhpcwp0LmwuYShiKQpzPXEuYWgoKQpyPVAuVGwoYSxiKQpxLmE9OApxLmM9cgpQLkhaKHEs
+cyl9LApYZjpmdW5jdGlvbihhKXt2YXIgcz10aGlzLiR0aQpzLkMoIjEvIikuYShhKQppZihzLkMoImI4
+PDE+IikuYihhKSl7dGhpcy5jVShhKQpyZXR1cm59dGhpcy53VShzLmMuYShhKSl9LAp3VTpmdW5jdGlv
+bihhKXt2YXIgcz10aGlzCnMuJHRpLmMuYShhKQpzLmE9MQpQLlRrKG51bGwsbnVsbCxzLmIsdC5NLmEo
+bmV3IFAucnQocyxhKSkpfSwKY1U6ZnVuY3Rpb24oYSl7dmFyIHM9dGhpcyxyPXMuJHRpCnIuQygiYjg8
+MT4iKS5hKGEpCmlmKHIuYihhKSl7aWYoYS5hPT09OCl7cy5hPTEKUC5UayhudWxsLG51bGwscy5iLHQu
+TS5hKG5ldyBQLktGKHMsYSkpKX1lbHNlIFAuQTkoYSxzKQpyZXR1cm59UC5rMyhhLHMpfSwKTms6ZnVu
+Y3Rpb24oYSxiKXt0aGlzLmE9MQpQLlRrKG51bGwsbnVsbCx0aGlzLmIsdC5NLmEobmV3IFAuWkwodGhp
+cyxhLGIpKSl9LAokaWI4OjF9ClAuZGEucHJvdG90eXBlPXsKJDA6ZnVuY3Rpb24oKXtQLkhaKHRoaXMu
+YSx0aGlzLmIpfSwKJFM6MH0KUC5vUS5wcm90b3R5cGU9ewokMDpmdW5jdGlvbigpe1AuSFoodGhpcy5i
+LHRoaXMuYS5hKX0sCiRTOjB9ClAucFYucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dmFyIHM9dGhp
+cy5hCnMuYT0wCnMuSEgoYSl9LAokUzo5fQpQLlU3LnByb3RvdHlwZT17CiQyOmZ1bmN0aW9uKGEsYil7
+dGhpcy5hLlpMKGEsdC5sLmEoYikpfSwKJEM6IiQyIiwKJFI6MiwKJFM6MzB9ClAudnIucHJvdG90eXBl
+PXsKJDA6ZnVuY3Rpb24oKXt0aGlzLmEuWkwodGhpcy5iLHRoaXMuYyl9LAokUzowfQpQLnJ0LnByb3Rv
+dHlwZT17CiQwOmZ1bmN0aW9uKCl7dGhpcy5hLlgyKHRoaXMuYil9LAokUzowfQpQLktGLnByb3RvdHlw
+ZT17CiQwOmZ1bmN0aW9uKCl7UC5BOSh0aGlzLmIsdGhpcy5hKX0sCiRTOjB9ClAuWkwucHJvdG90eXBl
+PXsKJDA6ZnVuY3Rpb24oKXt0aGlzLmEuWkwodGhpcy5iLHRoaXMuYyl9LAokUzowfQpQLlJULnByb3Rv
+dHlwZT17CiQwOmZ1bmN0aW9uKCl7dmFyIHMscixxLHAsbyxuLG09dGhpcyxsPW51bGwKdHJ5e3E9bS5h
+LmEKbD1xLmIuYi56eih0LmZPLmEocS5kKSx0LnopfWNhdGNoKHApe3M9SC5SdShwKQpyPUgudHMocCkK
+aWYobS5jKXtxPXQubi5hKG0uYi5hLmMpLmEKbz1zCm89cT09bnVsbD9vPT1udWxsOnE9PT1vCnE9b31l
+bHNlIHE9ITEKbz1tLmEKaWYocSlvLmM9dC5uLmEobS5iLmEuYykKZWxzZSBvLmM9UC5UbChzLHIpCm8u
+Yj0hMApyZXR1cm59aWYobCBpbnN0YW5jZW9mIFAudnMmJmwuYT49NCl7aWYobC5hPT09OCl7cT1tLmEK
+cS5jPXQubi5hKGwuYykKcS5iPSEwfXJldHVybn1pZih0LmQuYihsKSl7bj1tLmIuYQpxPW0uYQpxLmM9
+bC5XNyhuZXcgUC5qWihuKSx0LnopCnEuYj0hMX19LAokUzowfQpQLmpaLnByb3RvdHlwZT17CiQxOmZ1
+bmN0aW9uKGEpe3JldHVybiB0aGlzLmF9LAokUzozM30KUC5ycS5wcm90b3R5cGU9ewokMDpmdW5jdGlv
+bigpe3ZhciBzLHIscSxwLG8sbixtLGwKdHJ5e3E9dGhpcy5hCnA9cS5hCm89cC4kdGkKbj1vLmMKbT1u
+LmEodGhpcy5iKQpxLmM9cC5iLmIuYnYoby5DKCIyLygxKSIpLmEocC5kKSxtLG8uQygiMi8iKSxuKX1j
+YXRjaChsKXtzPUguUnUobCkKcj1ILnRzKGwpCnE9dGhpcy5hCnEuYz1QLlRsKHMscikKcS5iPSEwfX0s
+CiRTOjB9ClAuUlcucHJvdG90eXBlPXsKJDA6ZnVuY3Rpb24oKXt2YXIgcyxyLHEscCxvLG4sbSxsLGs9
+dGhpcwp0cnl7cz10Lm4uYShrLmEuYS5jKQpwPWsuYgppZihILm9UKHAuYS5IUihzKSkmJnAuYS5lIT1u
+dWxsKXtwLmM9cC5hLkt3KHMpCnAuYj0hMX19Y2F0Y2gobyl7cj1ILlJ1KG8pCnE9SC50cyhvKQpwPXQu
+bi5hKGsuYS5hLmMpCm49cC5hCm09cgpsPWsuYgppZihuPT1udWxsP209PW51bGw6bj09PW0pbC5jPXAK
+ZWxzZSBsLmM9UC5UbChyLHEpCmwuYj0hMH19LAokUzowfQpQLk9NLnByb3RvdHlwZT17fQpQLnFoLnBy
+b3RvdHlwZT17CmdBOmZ1bmN0aW9uKGEpe3ZhciBzLHIscT10aGlzLHA9e30sbz1uZXcgUC52cygkLlgz
+LHQuZkopCnAuYT0wCnM9SC5MaChxKQpyPXMuQygifigxKT8iKS5hKG5ldyBQLkI1KHAscSkpCnQuWi5h
+KG5ldyBQLnVPKHAsbykpClcuSkUocS5hLHEuYixyLCExLHMuYykKcmV0dXJuIG99fQpQLkI1LnByb3Rv
+dHlwZT17CiQxOmZ1bmN0aW9uKGEpe0guTGgodGhpcy5iKS5jLmEoYSk7Kyt0aGlzLmEuYX0sCiRTOmZ1
+bmN0aW9uKCl7cmV0dXJuIEguTGgodGhpcy5iKS5DKCJ+KDEpIil9fQpQLnVPLnByb3RvdHlwZT17CiQw
+OmZ1bmN0aW9uKCl7dGhpcy5iLkhIKHRoaXMuYS5hKX0sCiRTOjB9ClAuTU8ucHJvdG90eXBlPXt9ClAu
+a1QucHJvdG90eXBlPXt9ClAueEkucHJvdG90eXBlPXt9ClAuQ3cucHJvdG90eXBlPXsKdzpmdW5jdGlv
+bihhKXtyZXR1cm4gSC5Faih0aGlzLmEpfSwKJGlYUzoxLApnSUk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhp
+cy5ifX0KUC5tMC5wcm90b3R5cGU9eyRpUW06MX0KUC5wSy5wcm90b3R5cGU9ewokMDpmdW5jdGlvbigp
+e3ZhciBzPUguYih0aGlzLmEpCnMuc3RhY2s9Si5qKHRoaXMuYikKdGhyb3cgc30sCiRTOjB9ClAuSmku
+cHJvdG90eXBlPXsKYkg6ZnVuY3Rpb24oYSl7dmFyIHMscixxLHA9bnVsbAp0Lk0uYShhKQp0cnl7aWYo
+Qy5OVT09PSQuWDMpe2EuJDAoKQpyZXR1cm59UC5UOChwLHAsdGhpcyxhLHQuSCl9Y2F0Y2gocSl7cz1I
+LlJ1KHEpCnI9SC50cyhxKQpQLkwyKHAscCx0aGlzLHMsdC5sLmEocikpfX0sCkRsOmZ1bmN0aW9uKGEs
+YixjKXt2YXIgcyxyLHEscD1udWxsCmMuQygifigwKSIpLmEoYSkKYy5hKGIpCnRyeXtpZihDLk5VPT09
+JC5YMyl7YS4kMShiKQpyZXR1cm59UC55dihwLHAsdGhpcyxhLGIsdC5ILGMpfWNhdGNoKHEpe3M9SC5S
+dShxKQpyPUgudHMocSkKUC5MMihwLHAsdGhpcyxzLHQubC5hKHIpKX19LApSVDpmdW5jdGlvbihhLGIp
+e3JldHVybiBuZXcgUC5oaih0aGlzLGIuQygiMCgpIikuYShhKSxiKX0sCkdZOmZ1bmN0aW9uKGEpe3Jl
+dHVybiBuZXcgUC5WcCh0aGlzLHQuTS5hKGEpKX0sClB5OmZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyBQ
+Lk9SKHRoaXMsYi5DKCJ+KDApIikuYShhKSxiKX0sCnE6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbnVsbH0s
+Cnp6OmZ1bmN0aW9uKGEsYil7Yi5DKCIwKCkiKS5hKGEpCmlmKCQuWDM9PT1DLk5VKXJldHVybiBhLiQw
+KCkKcmV0dXJuIFAuVDgobnVsbCxudWxsLHRoaXMsYSxiKX0sCmJ2OmZ1bmN0aW9uKGEsYixjLGQpe2Mu
+QygiQDwwPiIpLktxKGQpLkMoIjEoMikiKS5hKGEpCmQuYShiKQppZigkLlgzPT09Qy5OVSlyZXR1cm4g
+YS4kMShiKQpyZXR1cm4gUC55dihudWxsLG51bGwsdGhpcyxhLGIsYyxkKX0sCnJwOmZ1bmN0aW9uKGEs
+YixjLGQsZSxmKXtkLkMoIkA8MD4iKS5LcShlKS5LcShmKS5DKCIxKDIsMykiKS5hKGEpCmUuYShiKQpm
+LmEoYykKaWYoJC5YMz09PUMuTlUpcmV0dXJuIGEuJDIoYixjKQpyZXR1cm4gUC5ReChudWxsLG51bGws
+dGhpcyxhLGIsYyxkLGUsZil9LApMajpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gYi5DKCJAPDA+Iiku
+S3EoYykuS3EoZCkuQygiMSgyLDMpIikuYShhKX19ClAuaGoucHJvdG90eXBlPXsKJDA6ZnVuY3Rpb24o
+KXtyZXR1cm4gdGhpcy5hLnp6KHRoaXMuYix0aGlzLmMpfSwKJFM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhp
+cy5jLkMoIjAoKSIpfX0KUC5WcC5wcm90b3R5cGU9ewokMDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmEu
+YkgodGhpcy5iKX0sCiRTOjB9ClAuT1IucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dmFyIHM9dGhp
+cy5jCnJldHVybiB0aGlzLmEuRGwodGhpcy5iLHMuYShhKSxzKX0sCiRTOmZ1bmN0aW9uKCl7cmV0dXJu
+IHRoaXMuYy5DKCJ+KDApIil9fQpQLmI2LnByb3RvdHlwZT17CmdtOmZ1bmN0aW9uKGEpe3ZhciBzPXRo
+aXMscj1uZXcgUC5sbShzLHMucixILkxoKHMpLkMoImxtPDE+IikpCnIuYz1zLmUKcmV0dXJuIHJ9LApn
+QTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hfSwKZ2wwOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmE9
+PT0wfSwKZ29yOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmEhPT0wfSwKdGc6ZnVuY3Rpb24oYSxiKXt2
+YXIgcyxyCmlmKHR5cGVvZiBiPT0ic3RyaW5nIiYmYiE9PSJfX3Byb3RvX18iKXtzPXRoaXMuYgppZihz
+PT1udWxsKXJldHVybiExCnJldHVybiB0LmUuYShzW2JdKSE9bnVsbH1lbHNle3I9dGhpcy5QUihiKQpy
+ZXR1cm4gcn19LApQUjpmdW5jdGlvbihhKXt2YXIgcz10aGlzLmQKaWYocz09bnVsbClyZXR1cm4hMQpy
+ZXR1cm4gdGhpcy5ERihzW3RoaXMuTihhKV0sYSk+PTB9LAppOmZ1bmN0aW9uKGEsYil7dmFyIHMscixx
+PXRoaXMKSC5MaChxKS5jLmEoYikKaWYodHlwZW9mIGI9PSJzdHJpbmciJiZiIT09Il9fcHJvdG9fXyIp
+e3M9cS5iCnJldHVybiBxLmJRKHM9PW51bGw/cS5iPVAuVDIoKTpzLGIpfWVsc2UgaWYodHlwZW9mIGI9
+PSJudW1iZXIiJiYoYiYxMDczNzQxODIzKT09PWIpe3I9cS5jCnJldHVybiBxLmJRKHI9PW51bGw/cS5j
+PVAuVDIoKTpyLGIpfWVsc2UgcmV0dXJuIHEuQjcoYil9LApCNzpmdW5jdGlvbihhKXt2YXIgcyxyLHEs
+cD10aGlzCkguTGgocCkuYy5hKGEpCnM9cC5kCmlmKHM9PW51bGwpcz1wLmQ9UC5UMigpCnI9cC5OKGEp
+CnE9c1tyXQppZihxPT1udWxsKXNbcl09W3AueW8oYSldCmVsc2V7aWYocC5ERihxLGEpPj0wKXJldHVy
+biExCnEucHVzaChwLnlvKGEpKX1yZXR1cm4hMH0sClI6ZnVuY3Rpb24oYSxiKXt2YXIgcz10aGlzCmlm
+KHR5cGVvZiBiPT0ic3RyaW5nIiYmYiE9PSJfX3Byb3RvX18iKXJldHVybiBzLkwocy5iLGIpCmVsc2Ug
+aWYodHlwZW9mIGI9PSJudW1iZXIiJiYoYiYxMDczNzQxODIzKT09PWIpcmV0dXJuIHMuTChzLmMsYikK
+ZWxzZSByZXR1cm4gcy5xZyhiKX0sCnFnOmZ1bmN0aW9uKGEpe3ZhciBzLHIscSxwLG89dGhpcyxuPW8u
+ZAppZihuPT1udWxsKXJldHVybiExCnM9by5OKGEpCnI9bltzXQpxPW8uREYocixhKQppZihxPDApcmV0
+dXJuITEKcD1yLnNwbGljZShxLDEpWzBdCmlmKDA9PT1yLmxlbmd0aClkZWxldGUgbltzXQpvLkdTKHAp
+CnJldHVybiEwfSwKYlE6ZnVuY3Rpb24oYSxiKXtILkxoKHRoaXMpLmMuYShiKQppZih0LmUuYShhW2Jd
+KSE9bnVsbClyZXR1cm4hMQphW2JdPXRoaXMueW8oYikKcmV0dXJuITB9LApMOmZ1bmN0aW9uKGEsYil7
+dmFyIHMKaWYoYT09bnVsbClyZXR1cm4hMQpzPXQuZS5hKGFbYl0pCmlmKHM9PW51bGwpcmV0dXJuITEK
+dGhpcy5HUyhzKQpkZWxldGUgYVtiXQpyZXR1cm4hMH0sClM6ZnVuY3Rpb24oKXt0aGlzLnI9dGhpcy5y
+KzEmMTA3Mzc0MTgyM30sCnlvOmZ1bmN0aW9uKGEpe3ZhciBzLHI9dGhpcyxxPW5ldyBQLmJuKEguTGgo
+cikuYy5hKGEpKQppZihyLmU9PW51bGwpci5lPXIuZj1xCmVsc2V7cz1yLmYKcy50b1N0cmluZwpxLmM9
+cwpyLmY9cy5iPXF9KytyLmEKci5TKCkKcmV0dXJuIHF9LApHUzpmdW5jdGlvbihhKXt2YXIgcz10aGlz
+LHI9YS5jLHE9YS5iCmlmKHI9PW51bGwpcy5lPXEKZWxzZSByLmI9cQppZihxPT1udWxsKXMuZj1yCmVs
+c2UgcS5jPXI7LS1zLmEKcy5TKCl9LApOOmZ1bmN0aW9uKGEpe3JldHVybiBKLmhmKGEpJjEwNzM3NDE4
+MjN9LApERjpmdW5jdGlvbihhLGIpe3ZhciBzLHIKaWYoYT09bnVsbClyZXR1cm4tMQpzPWEubGVuZ3Ro
+CmZvcihyPTA7cjxzOysrcilpZihKLlJNKGFbcl0uYSxiKSlyZXR1cm4gcgpyZXR1cm4tMX19ClAuYm4u
+cHJvdG90eXBlPXt9ClAubG0ucHJvdG90eXBlPXsKZ2w6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kfSwK
+RjpmdW5jdGlvbigpe3ZhciBzPXRoaXMscj1zLmMscT1zLmEKaWYocy5iIT09cS5yKXRocm93IEguYihQ
+LmE0KHEpKQplbHNlIGlmKHI9PW51bGwpe3Muc2oobnVsbCkKcmV0dXJuITF9ZWxzZXtzLnNqKHMuJHRp
+LkMoIjE/IikuYShyLmEpKQpzLmM9ci5iCnJldHVybiEwfX0sCnNqOmZ1bmN0aW9uKGEpe3RoaXMuZD10
+aGlzLiR0aS5DKCIxPyIpLmEoYSl9LAokaUFuOjF9ClAubVcucHJvdG90eXBlPXt9ClAudXkucHJvdG90
+eXBlPXskaWJROjEsJGljWDoxLCRpek06MX0KUC5sRC5wcm90b3R5cGU9ewpnbTpmdW5jdGlvbihhKXty
+ZXR1cm4gbmV3IEguYTcoYSx0aGlzLmdBKGEpLEgueihhKS5DKCJhNzxsRC5FPiIpKX0sCkU6ZnVuY3Rp
+b24oYSxiKXtyZXR1cm4gdGhpcy5xKGEsYil9LApLOmZ1bmN0aW9uKGEsYil7dmFyIHMscgpILnooYSku
+QygifihsRC5FKSIpLmEoYikKcz10aGlzLmdBKGEpCmZvcihyPTA7cjxzOysrcil7Yi4kMSh0aGlzLnEo
+YSxyKSkKaWYocyE9PXRoaXMuZ0EoYSkpdGhyb3cgSC5iKFAuYTQoYSkpfX0sCmdsMDpmdW5jdGlvbihh
+KXtyZXR1cm4gdGhpcy5nQShhKT09PTB9LApnb3I6ZnVuY3Rpb24oYSl7cmV0dXJuIXRoaXMuZ2wwKGEp
+fSwKRTI6ZnVuY3Rpb24oYSxiLGMpe3ZhciBzPUgueihhKQpyZXR1cm4gbmV3IEgubEooYSxzLktxKGMp
+LkMoIjEobEQuRSkiKS5hKGIpLHMuQygiQDxsRC5FPiIpLktxKGMpLkMoImxKPDEsMj4iKSl9LAplUjpm
+dW5jdGlvbihhLGIpe3JldHVybiBILnFDKGEsYixudWxsLEgueihhKS5DKCJsRC5FIikpfSwKZHI6ZnVu
+Y3Rpb24oYSxiKXtyZXR1cm4gbmV3IEgualYoYSxILnooYSkuQygiQDxsRC5FPiIpLktxKGIpLkMoImpW
+PDEsMj4iKSl9LApkdTpmdW5jdGlvbihhLGIsYyxkKXt2YXIgcwpILnooYSkuQygibEQuRT8iKS5hKGQp
+ClAuakIoYixjLHRoaXMuZ0EoYSkpCmZvcihzPWI7czxjOysrcyl0aGlzLlkoYSxzLGQpfSwKdzpmdW5j
+dGlvbihhKXtyZXR1cm4gUC5XRShhLCJbIiwiXSIpfX0KUC5pbC5wcm90b3R5cGU9e30KUC5yYS5wcm90
+b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe3ZhciBzLHI9dGhpcy5hCmlmKCFyLmEpdGhpcy5iLmErPSIs
+ICIKci5hPSExCnI9dGhpcy5iCnM9ci5hKz1ILkVqKGEpCnIuYT1zKyI6ICIKci5hKz1ILkVqKGIpfSwK
+JFM6MTF9ClAuWWsucHJvdG90eXBlPXsKSzpmdW5jdGlvbihhLGIpe3ZhciBzLHIKSC5MaCh0aGlzKS5D
+KCJ+KFlrLkssWWsuVikiKS5hKGIpCmZvcihzPUouSVQodGhpcy5nVigpKTtzLkYoKTspe3I9cy5nbCgp
+CmIuJDIocix0aGlzLnEoMCxyKSl9fSwKZ1B1OmZ1bmN0aW9uKGEpe3JldHVybiBKLk0xKHRoaXMuZ1Yo
+KSxuZXcgUC55USh0aGlzKSxILkxoKHRoaXMpLkMoIk4zPFlrLkssWWsuVj4iKSl9LAp4NDpmdW5jdGlv
+bihhKXtyZXR1cm4gSi56bCh0aGlzLmdWKCksYSl9LApnQTpmdW5jdGlvbihhKXtyZXR1cm4gSi5IbSh0
+aGlzLmdWKCkpfSwKZ2wwOmZ1bmN0aW9uKGEpe3JldHVybiBKLnVVKHRoaXMuZ1YoKSl9LAp3OmZ1bmN0
+aW9uKGEpe3JldHVybiBQLm5PKHRoaXMpfSwKJGlaMDoxfQpQLnlRLnByb3RvdHlwZT17CiQxOmZ1bmN0
+aW9uKGEpe3ZhciBzPXRoaXMuYSxyPUguTGgocykKci5DKCJZay5LIikuYShhKQpyZXR1cm4gbmV3IFAu
+TjMoYSxzLnEoMCxhKSxyLkMoIkA8WWsuSz4iKS5LcShyLkMoIllrLlYiKSkuQygiTjM8MSwyPiIpKX0s
+CiRTOmZ1bmN0aW9uKCl7cmV0dXJuIEguTGgodGhpcy5hKS5DKCJOMzxZay5LLFlrLlY+KFlrLkspIil9
+fQpQLktQLnByb3RvdHlwZT17Clk6ZnVuY3Rpb24oYSxiLGMpe3ZhciBzPUguTGgodGhpcykKcy5jLmEo
+YikKcy5RWzFdLmEoYykKdGhyb3cgSC5iKFAuTDQoIkNhbm5vdCBtb2RpZnkgdW5tb2RpZmlhYmxlIG1h
+cCIpKX19ClAuUG4ucHJvdG90eXBlPXsKcTpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmEucSgwLGIp
+fSwKWTpmdW5jdGlvbihhLGIsYyl7dmFyIHM9SC5MaCh0aGlzKQp0aGlzLmEuWSgwLHMuYy5hKGIpLHMu
+UVsxXS5hKGMpKX0sCng0OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmEueDQoYSl9LApLOmZ1bmN0aW9u
+KGEsYil7dGhpcy5hLksoMCxILkxoKHRoaXMpLkMoIn4oMSwyKSIpLmEoYikpfSwKZ2wwOmZ1bmN0aW9u
+KGEpe3ZhciBzPXRoaXMuYQpyZXR1cm4gcy5nbDAocyl9LApnQTpmdW5jdGlvbihhKXt2YXIgcz10aGlz
+LmEKcmV0dXJuIHMuZ0Eocyl9LAp3OmZ1bmN0aW9uKGEpe3JldHVybiBKLmoodGhpcy5hKX0sCmdQdTpm
+dW5jdGlvbihhKXt2YXIgcz10aGlzLmEKcmV0dXJuIHMuZ1B1KHMpfSwKJGlaMDoxfQpQLkdqLnByb3Rv
+dHlwZT17fQpQLmxmLnByb3RvdHlwZT17CmdsMDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5nQSh0aGlz
+KT09PTB9LApnb3I6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZ0EodGhpcykhPT0wfSwKRlY6ZnVuY3Rp
+b24oYSxiKXt2YXIgcwpmb3Iocz1KLklUKEguTGgodGhpcykuQygiY1g8bGYuRT4iKS5hKGIpKTtzLkYo
+KTspdGhpcy5pKDAscy5nbCgpKX0sCnc6ZnVuY3Rpb24oYSl7cmV0dXJuIFAuV0UodGhpcywieyIsIn0i
+KX0sCkg6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyPXRoaXMuZ20odGhpcykKaWYoIXIuRigpKXJldHVybiIi
+CmlmKGI9PT0iIil7cz0iIgpkbyBzKz1ILkVqKHIuZCkKd2hpbGUoci5GKCkpfWVsc2V7cz1ILkVqKHIu
+ZCkKZm9yKDtyLkYoKTspcz1zK2IrSC5FaihyLmQpfXJldHVybiBzLmNoYXJDb2RlQXQoMCk9PTA/czpz
+fSwKZVI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSC5iSyh0aGlzLGIsSC5MaCh0aGlzKS5DKCJsZi5FIikp
+fSwKRTpmdW5jdGlvbihhLGIpe3ZhciBzLHIscSxwPSJpbmRleCIKUC5VSShiLHAsdC5TKQpQLmsxKGIs
+cCkKZm9yKHM9dGhpcy5nbSh0aGlzKSxyPTA7cy5GKCk7KXtxPXMuZAppZihiPT09cilyZXR1cm4gcTsr
+K3J9dGhyb3cgSC5iKFAuQ2YoYix0aGlzLHAsbnVsbCxyKSl9fQpQLlZqLnByb3RvdHlwZT17JGliUTox
+LCRpY1g6MSwkaXh1OjF9ClAuWHYucHJvdG90eXBlPXskaWJROjEsJGljWDoxLCRpeHU6MX0KUC5uWS5w
+cm90b3R5cGU9e30KUC5XWS5wcm90b3R5cGU9e30KUC5SVS5wcm90b3R5cGU9e30KUC5wUi5wcm90b3R5
+cGU9e30KUC51dy5wcm90b3R5cGU9ewpxOmZ1bmN0aW9uKGEsYil7dmFyIHMscj10aGlzLmIKaWYocj09
+bnVsbClyZXR1cm4gdGhpcy5jLnEoMCxiKQplbHNlIGlmKHR5cGVvZiBiIT0ic3RyaW5nIilyZXR1cm4g
+bnVsbAplbHNle3M9cltiXQpyZXR1cm4gdHlwZW9mIHM9PSJ1bmRlZmluZWQiP3RoaXMuZmIoYik6c319
+LApnQTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5iPT1udWxsP3RoaXMuYy5hOnRoaXMuQ2YoKS5sZW5n
+dGh9LApnbDA6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZ0EodGhpcyk9PT0wfSwKZ1Y6ZnVuY3Rpb24o
+KXtpZih0aGlzLmI9PW51bGwpe3ZhciBzPXRoaXMuYwpyZXR1cm4gbmV3IEguaTUocyxILkxoKHMpLkMo
+Imk1PDE+IikpfXJldHVybiBuZXcgUC5pOCh0aGlzKX0sClk6ZnVuY3Rpb24oYSxiLGMpe3ZhciBzLHIs
+cT10aGlzCmlmKHEuYj09bnVsbClxLmMuWSgwLGIsYykKZWxzZSBpZihxLng0KGIpKXtzPXEuYgpzW2Jd
+PWMKcj1xLmEKaWYocj09bnVsbD9zIT1udWxsOnIhPT1zKXJbYl09bnVsbH1lbHNlIHEuWEsoKS5ZKDAs
+YixjKX0sCng0OmZ1bmN0aW9uKGEpe2lmKHRoaXMuYj09bnVsbClyZXR1cm4gdGhpcy5jLng0KGEpCnJl
+dHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy5hLGEpfSwKSzpmdW5j
+dGlvbihhLGIpe3ZhciBzLHIscSxwLG89dGhpcwp0LmNBLmEoYikKaWYoby5iPT1udWxsKXJldHVybiBv
+LmMuSygwLGIpCnM9by5DZigpCmZvcihyPTA7cjxzLmxlbmd0aDsrK3Ipe3E9c1tyXQpwPW8uYltxXQpp
+Zih0eXBlb2YgcD09InVuZGVmaW5lZCIpe3A9UC5RZShvLmFbcV0pCm8uYltxXT1wfWIuJDIocSxwKQpp
+ZihzIT09by5jKXRocm93IEguYihQLmE0KG8pKX19LApDZjpmdW5jdGlvbigpe3ZhciBzPXQuYk0uYSh0
+aGlzLmMpCmlmKHM9PW51bGwpcz10aGlzLmM9SC5WTShPYmplY3Qua2V5cyh0aGlzLmEpLHQucykKcmV0
+dXJuIHN9LApYSzpmdW5jdGlvbigpe3ZhciBzLHIscSxwLG8sbj10aGlzCmlmKG4uYj09bnVsbClyZXR1
+cm4gbi5jCnM9UC5GbCh0Lk4sdC56KQpyPW4uQ2YoKQpmb3IocT0wO3A9ci5sZW5ndGgscTxwOysrcSl7
+bz1yW3FdCnMuWSgwLG8sbi5xKDAsbykpfWlmKHA9PT0wKUMuTm0uaShyLCIiKQplbHNlIEMuTm0uc0Eo
+ciwwKQpuLmE9bi5iPW51bGwKcmV0dXJuIG4uYz1zfSwKZmI6ZnVuY3Rpb24oYSl7dmFyIHMKaWYoIU9i
+amVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLmEsYSkpcmV0dXJuIG51bGwKcz1Q
+LlFlKHRoaXMuYVthXSkKcmV0dXJuIHRoaXMuYlthXT1zfX0KUC5pOC5wcm90b3R5cGU9ewpnQTpmdW5j
+dGlvbihhKXt2YXIgcz10aGlzLmEKcmV0dXJuIHMuZ0Eocyl9LApFOmZ1bmN0aW9uKGEsYil7dmFyIHM9
+dGhpcy5hCmlmKHMuYj09bnVsbClzPXMuZ1YoKS5FKDAsYikKZWxzZXtzPXMuQ2YoKQppZihiPDB8fGI+
+PXMubGVuZ3RoKXJldHVybiBILk9IKHMsYikKcz1zW2JdfXJldHVybiBzfSwKZ206ZnVuY3Rpb24oYSl7
+dmFyIHM9dGhpcy5hCmlmKHMuYj09bnVsbCl7cz1zLmdWKCkKcz1zLmdtKHMpfWVsc2V7cz1zLkNmKCkK
+cz1uZXcgSi5tMShzLHMubGVuZ3RoLEgudDYocykuQygibTE8MT4iKSl9cmV0dXJuIHN9LAp0ZzpmdW5j
+dGlvbihhLGIpe3JldHVybiB0aGlzLmEueDQoYil9fQpQLnBnLnByb3RvdHlwZT17CiQwOmZ1bmN0aW9u
+KCl7dmFyIHMscgp0cnl7cz1uZXcgVGV4dERlY29kZXIoInV0Zi04Iix7ZmF0YWw6dHJ1ZX0pCnJldHVy
+biBzfWNhdGNoKHIpe0guUnUocil9cmV0dXJuIG51bGx9LAokUzoxMn0KUC5jMi5wcm90b3R5cGU9ewok
+MDpmdW5jdGlvbigpe3ZhciBzLHIKdHJ5e3M9bmV3IFRleHREZWNvZGVyKCJ1dGYtOCIse2ZhdGFsOmZh
+bHNlfSkKcmV0dXJuIHN9Y2F0Y2gocil7SC5SdShyKX1yZXR1cm4gbnVsbH0sCiRTOjEyfQpQLkNWLnBy
+b3RvdHlwZT17CnlyOmZ1bmN0aW9uKGEwLGExLGEyKXt2YXIgcyxyLHEscCxvLG4sbSxsLGssaixpLGgs
+ZyxmLGUsZCxjLGIsYT0iSW52YWxpZCBiYXNlNjQgZW5jb2RpbmcgbGVuZ3RoICIKYTI9UC5qQihhMSxh
+MixhMC5sZW5ndGgpCnM9JC5WNygpCmZvcihyPWExLHE9cixwPW51bGwsbz0tMSxuPS0xLG09MDtyPGEy
+O3I9bCl7bD1yKzEKaz1DLnhCLlcoYTAscikKaWYoaz09PTM3KXtqPWwrMgppZihqPD1hMil7aT1ILm9v
+KEMueEIuVyhhMCxsKSkKaD1ILm9vKEMueEIuVyhhMCxsKzEpKQpnPWkqMTYraC0oaCYyNTYpCmlmKGc9
+PT0zNylnPS0xCmw9an1lbHNlIGc9LTF9ZWxzZSBnPWsKaWYoMDw9ZyYmZzw9MTI3KXtpZihnPDB8fGc+
+PXMubGVuZ3RoKXJldHVybiBILk9IKHMsZykKZj1zW2ddCmlmKGY+PTApe2c9Qy54Qi5PMigiQUJDREVG
+R0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyIs
+ZikKaWYoZz09PWspY29udGludWUKaz1nfWVsc2V7aWYoZj09PS0xKXtpZihvPDApe2U9cD09bnVsbD9u
+dWxsOnAuYS5sZW5ndGgKaWYoZT09bnVsbCllPTAKbz1lKyhyLXEpCm49cn0rK20KaWYoaz09PTYxKWNv
+bnRpbnVlfWs9Z31pZihmIT09LTIpe2lmKHA9PW51bGwpe3A9bmV3IFAuUm4oIiIpCmU9cH1lbHNlIGU9
+cAplLmErPUMueEIuTmooYTAscSxyKQplLmErPUguTHcoaykKcT1sCmNvbnRpbnVlfX10aHJvdyBILmIo
+UC5ycigiSW52YWxpZCBiYXNlNjQgZGF0YSIsYTAscikpfWlmKHAhPW51bGwpe2U9cC5hKz1DLnhCLk5q
+KGEwLHEsYTIpCmQ9ZS5sZW5ndGgKaWYobz49MClQLnhNKGEwLG4sYTIsbyxtLGQpCmVsc2V7Yz1DLmpu
+LnpZKGQtMSw0KSsxCmlmKGM9PT0xKXRocm93IEguYihQLnJyKGEsYTAsYTIpKQpmb3IoO2M8NDspe2Ur
+PSI9IgpwLmE9ZTsrK2N9fWU9cC5hCnJldHVybiBDLnhCLmk3KGEwLGExLGEyLGUuY2hhckNvZGVBdCgw
+KT09MD9lOmUpfWI9YTItYTEKaWYobz49MClQLnhNKGEwLG4sYTIsbyxtLGIpCmVsc2V7Yz1DLmpuLnpZ
+KGIsNCkKaWYoYz09PTEpdGhyb3cgSC5iKFAucnIoYSxhMCxhMikpCmlmKGM+MSlhMD1DLnhCLmk3KGEw
+LGEyLGEyLGM9PT0yPyI9PSI6Ij0iKX1yZXR1cm4gYTB9fQpQLlU4LnByb3RvdHlwZT17fQpQLlVrLnBy
+b3RvdHlwZT17fQpQLndJLnByb3RvdHlwZT17fQpQLlppLnByb3RvdHlwZT17fQpQLlVkLnByb3RvdHlw
+ZT17Cnc6ZnVuY3Rpb24oYSl7dmFyIHM9UC5obCh0aGlzLmEpCnJldHVybih0aGlzLmIhPW51bGw/IkNv
+bnZlcnRpbmcgb2JqZWN0IHRvIGFuIGVuY29kYWJsZSBvYmplY3QgZmFpbGVkOiI6IkNvbnZlcnRpbmcg
+b2JqZWN0IGRpZCBub3QgcmV0dXJuIGFuIGVuY29kYWJsZSBvYmplY3Q6IikrIiAiK3N9fQpQLks4LnBy
+b3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7cmV0dXJuIkN5Y2xpYyBlcnJvciBpbiBKU09OIHN0cmluZ2lm
+eSJ9fQpQLmJ5LnByb3RvdHlwZT17CnBXOmZ1bmN0aW9uKGEsYixjKXt2YXIgcwp0LmZWLmEoYykKcz1Q
+LkJTKGIsdGhpcy5nSGUoKS5hKQpyZXR1cm4gc30sCk9COmZ1bmN0aW9uKGEsYil7dmFyIHMKdC5kQS5h
+KGIpCnM9UC51WChhLHRoaXMuZ1pFKCkuYixudWxsKQpyZXR1cm4gc30sCmdaRTpmdW5jdGlvbigpe3Jl
+dHVybiBDLm5YfSwKZ0hlOmZ1bmN0aW9uKCl7cmV0dXJuIEMuQTN9fQpQLm9qLnByb3RvdHlwZT17fQpQ
+Lk14LnByb3RvdHlwZT17fQpQLlNoLnByb3RvdHlwZT17CnZwOmZ1bmN0aW9uKGEpe3ZhciBzLHIscSxw
+LG8sbixtLGw9YS5sZW5ndGgKZm9yKHM9Si5yWShhKSxyPXRoaXMuYyxxPTAscD0wO3A8bDsrK3Ape289
+cy5XKGEscCkKaWYobz45Mil7aWYobz49NTUyOTYpe249byY2NDUxMgppZihuPT09NTUyOTYpe209cCsx
+Cm09IShtPGwmJihDLnhCLlcoYSxtKSY2NDUxMik9PT01NjMyMCl9ZWxzZSBtPSExCmlmKCFtKWlmKG49
+PT01NjMyMCl7bj1wLTEKbj0hKG4+PTAmJihDLnhCLk8yKGEsbikmNjQ1MTIpPT09NTUyOTYpfWVsc2Ug
+bj0hMQplbHNlIG49ITAKaWYobil7aWYocD5xKXIuYSs9Qy54Qi5OaihhLHEscCkKcT1wKzEKci5hKz1I
+Lkx3KDkyKQpyLmErPUguTHcoMTE3KQpyLmErPUguTHcoMTAwKQpuPW8+Pj44JjE1CnIuYSs9SC5Mdyhu
+PDEwPzQ4K246ODcrbikKbj1vPj4+NCYxNQpyLmErPUguTHcobjwxMD80OCtuOjg3K24pCm49byYxNQpy
+LmErPUguTHcobjwxMD80OCtuOjg3K24pfX1jb250aW51ZX1pZihvPDMyKXtpZihwPnEpci5hKz1DLnhC
+Lk5qKGEscSxwKQpxPXArMQpyLmErPUguTHcoOTIpCnN3aXRjaChvKXtjYXNlIDg6ci5hKz1ILkx3KDk4
+KQpicmVhawpjYXNlIDk6ci5hKz1ILkx3KDExNikKYnJlYWsKY2FzZSAxMDpyLmErPUguTHcoMTEwKQpi
+cmVhawpjYXNlIDEyOnIuYSs9SC5MdygxMDIpCmJyZWFrCmNhc2UgMTM6ci5hKz1ILkx3KDExNCkKYnJl
+YWsKZGVmYXVsdDpyLmErPUguTHcoMTE3KQpyLmErPUguTHcoNDgpCnIuYSs9SC5Mdyg0OCkKbj1vPj4+
+NCYxNQpyLmErPUguTHcobjwxMD80OCtuOjg3K24pCm49byYxNQpyLmErPUguTHcobjwxMD80OCtuOjg3
+K24pCmJyZWFrfX1lbHNlIGlmKG89PT0zNHx8bz09PTkyKXtpZihwPnEpci5hKz1DLnhCLk5qKGEscSxw
+KQpxPXArMQpyLmErPUguTHcoOTIpCnIuYSs9SC5MdyhvKX19aWYocT09PTApci5hKz1ILkVqKGEpCmVs
+c2UgaWYocTxsKXIuYSs9cy5OaihhLHEsbCl9LApKbjpmdW5jdGlvbihhKXt2YXIgcyxyLHEscApmb3Io
+cz10aGlzLmEscj1zLmxlbmd0aCxxPTA7cTxyOysrcSl7cD1zW3FdCmlmKGE9PW51bGw/cD09bnVsbDph
+PT09cCl0aHJvdyBILmIobmV3IFAuSzgoYSxudWxsKSl9Qy5ObS5pKHMsYSl9LAppVTpmdW5jdGlvbihh
+KXt2YXIgcyxyLHEscCxvPXRoaXMKaWYoby50TShhKSlyZXR1cm4Kby5KbihhKQp0cnl7cz1vLmIuJDEo
+YSkKaWYoIW8udE0ocykpe3E9UC5HeShhLG51bGwsby5nVksoKSkKdGhyb3cgSC5iKHEpfXE9by5hCmlm
+KDA+PXEubGVuZ3RoKXJldHVybiBILk9IKHEsLTEpCnEucG9wKCl9Y2F0Y2gocCl7cj1ILlJ1KHApCnE9
+UC5HeShhLHIsby5nVksoKSkKdGhyb3cgSC5iKHEpfX0sCnRNOmZ1bmN0aW9uKGEpe3ZhciBzLHIscT10
+aGlzCmlmKHR5cGVvZiBhPT0ibnVtYmVyIil7aWYoIWlzRmluaXRlKGEpKXJldHVybiExCnEuYy5hKz1D
+LkNELncoYSkKcmV0dXJuITB9ZWxzZSBpZihhPT09ITApe3EuYy5hKz0idHJ1ZSIKcmV0dXJuITB9ZWxz
+ZSBpZihhPT09ITEpe3EuYy5hKz0iZmFsc2UiCnJldHVybiEwfWVsc2UgaWYoYT09bnVsbCl7cS5jLmEr
+PSJudWxsIgpyZXR1cm4hMH1lbHNlIGlmKHR5cGVvZiBhPT0ic3RyaW5nIil7cz1xLmMKcy5hKz0nIicK
+cS52cChhKQpzLmErPSciJwpyZXR1cm4hMH1lbHNlIGlmKHQuai5iKGEpKXtxLkpuKGEpCnEubEsoYSkK
+cz1xLmEKaWYoMD49cy5sZW5ndGgpcmV0dXJuIEguT0gocywtMSkKcy5wb3AoKQpyZXR1cm4hMH1lbHNl
+IGlmKHQuZi5iKGEpKXtxLkpuKGEpCnI9cS5qdyhhKQpzPXEuYQppZigwPj1zLmxlbmd0aClyZXR1cm4g
+SC5PSChzLC0xKQpzLnBvcCgpCnJldHVybiByfWVsc2UgcmV0dXJuITF9LApsSzpmdW5jdGlvbihhKXt2
+YXIgcyxyLHE9dGhpcy5jCnEuYSs9IlsiCnM9Si5VNihhKQppZihzLmdvcihhKSl7dGhpcy5pVShzLnEo
+YSwwKSkKZm9yKHI9MTtyPHMuZ0EoYSk7KytyKXtxLmErPSIsIgp0aGlzLmlVKHMucShhLHIpKX19cS5h
+Kz0iXSJ9LApqdzpmdW5jdGlvbihhKXt2YXIgcyxyLHEscCxvLG4sbT10aGlzLGw9e30KaWYoYS5nbDAo
+YSkpe20uYy5hKz0ie30iCnJldHVybiEwfXM9YS5nQShhKSoyCnI9UC5POChzLG51bGwsITEsdC5SKQpx
+PWwuYT0wCmwuYj0hMAphLksoMCxuZXcgUC50aShsLHIpKQppZighbC5iKXJldHVybiExCnA9bS5jCnAu
+YSs9InsiCmZvcihvPSciJztxPHM7cSs9MixvPScsIicpe3AuYSs9bwptLnZwKEguaChyW3FdKSkKcC5h
+Kz0nIjonCm49cSsxCmlmKG4+PXMpcmV0dXJuIEguT0gocixuKQptLmlVKHJbbl0pfXAuYSs9In0iCnJl
+dHVybiEwfX0KUC50aS5wcm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe3ZhciBzLHIKaWYodHlwZW9m
+IGEhPSJzdHJpbmciKXRoaXMuYS5iPSExCnM9dGhpcy5iCnI9dGhpcy5hCkMuTm0uWShzLHIuYSsrLGEp
+CkMuTm0uWShzLHIuYSsrLGIpfSwKJFM6MTF9ClAudHUucHJvdG90eXBlPXsKZ1ZLOmZ1bmN0aW9uKCl7
+dmFyIHM9dGhpcy5jLmEKcmV0dXJuIHMuY2hhckNvZGVBdCgwKT09MD9zOnN9fQpQLnU1LnByb3RvdHlw
+ZT17CmdaRTpmdW5jdGlvbigpe3JldHVybiBDLlFrfX0KUC5FMy5wcm90b3R5cGU9ewpXSjpmdW5jdGlv
+bihhKXt2YXIgcyxyLHEscD1QLmpCKDAsbnVsbCxhLmxlbmd0aCksbz1wLTAKaWYobz09PTApcmV0dXJu
+IG5ldyBVaW50OEFycmF5KDApCnM9byozCnI9bmV3IFVpbnQ4QXJyYXkocykKcT1uZXcgUC5SdyhyKQpp
+ZihxLkd4KGEsMCxwKSE9PXApe0ouYTYoYSxwLTEpCnEuUk8oKX1yZXR1cm4gbmV3IFVpbnQ4QXJyYXko
+ci5zdWJhcnJheSgwLEguck0oMCxxLmIscykpKX19ClAuUncucHJvdG90eXBlPXsKUk86ZnVuY3Rpb24o
+KXt2YXIgcz10aGlzLHI9cy5jLHE9cy5iLHA9cy5iPXErMSxvPXIubGVuZ3RoCmlmKHE+PW8pcmV0dXJu
+IEguT0gocixxKQpyW3FdPTIzOQpxPXMuYj1wKzEKaWYocD49bylyZXR1cm4gSC5PSChyLHApCnJbcF09
+MTkxCnMuYj1xKzEKaWYocT49bylyZXR1cm4gSC5PSChyLHEpCnJbcV09MTg5fSwKTzY6ZnVuY3Rpb24o
+YSxiKXt2YXIgcyxyLHEscCxvLG49dGhpcwppZigoYiY2NDUxMik9PT01NjMyMCl7cz02NTUzNisoKGEm
+MTAyMyk8PDEwKXxiJjEwMjMKcj1uLmMKcT1uLmIKcD1uLmI9cSsxCm89ci5sZW5ndGgKaWYocT49byly
+ZXR1cm4gSC5PSChyLHEpCnJbcV09cz4+PjE4fDI0MApxPW4uYj1wKzEKaWYocD49bylyZXR1cm4gSC5P
+SChyLHApCnJbcF09cz4+PjEyJjYzfDEyOApwPW4uYj1xKzEKaWYocT49bylyZXR1cm4gSC5PSChyLHEp
+CnJbcV09cz4+PjYmNjN8MTI4Cm4uYj1wKzEKaWYocD49bylyZXR1cm4gSC5PSChyLHApCnJbcF09cyY2
+M3wxMjgKcmV0dXJuITB9ZWxzZXtuLlJPKCkKcmV0dXJuITF9fSwKR3g6ZnVuY3Rpb24oYSxiLGMpe3Zh
+ciBzLHIscSxwLG8sbixtLGw9dGhpcwppZihiIT09YyYmKEMueEIuTzIoYSxjLTEpJjY0NTEyKT09PTU1
+Mjk2KS0tYwpmb3Iocz1sLmMscj1zLmxlbmd0aCxxPWI7cTxjOysrcSl7cD1DLnhCLlcoYSxxKQppZihw
+PD0xMjcpe289bC5iCmlmKG8+PXIpYnJlYWsKbC5iPW8rMQpzW29dPXB9ZWxzZXtvPXAmNjQ1MTIKaWYo
+bz09PTU1Mjk2KXtpZihsLmIrND5yKWJyZWFrCm49cSsxCmlmKGwuTzYocCxDLnhCLlcoYSxuKSkpcT1u
+fWVsc2UgaWYobz09PTU2MzIwKXtpZihsLmIrMz5yKWJyZWFrCmwuUk8oKX1lbHNlIGlmKHA8PTIwNDcp
+e289bC5iCm09bysxCmlmKG0+PXIpYnJlYWsKbC5iPW0KaWYobz49cilyZXR1cm4gSC5PSChzLG8pCnNb
+b109cD4+PjZ8MTkyCmwuYj1tKzEKc1ttXT1wJjYzfDEyOH1lbHNle289bC5iCmlmKG8rMj49cilicmVh
+awptPWwuYj1vKzEKaWYobz49cilyZXR1cm4gSC5PSChzLG8pCnNbb109cD4+PjEyfDIyNApvPWwuYj1t
+KzEKaWYobT49cilyZXR1cm4gSC5PSChzLG0pCnNbbV09cD4+PjYmNjN8MTI4CmwuYj1vKzEKaWYobz49
+cilyZXR1cm4gSC5PSChzLG8pCnNbb109cCY2M3wxMjh9fX1yZXR1cm4gcX19ClAuR1kucHJvdG90eXBl
+PXsKV0o6ZnVuY3Rpb24oYSl7dmFyIHMscgp0LkwuYShhKQpzPXRoaXMuYQpyPVAua3kocyxhLDAsbnVs
+bCkKaWYociE9bnVsbClyZXR1cm4gcgpyZXR1cm4gbmV3IFAuYnoocykuTmUoYSwwLG51bGwsITApfX0K
+UC5iei5wcm90b3R5cGU9ewpOZTpmdW5jdGlvbihhLGIsYyxkKXt2YXIgcyxyLHEscCxvLG49dGhpcwp0
+LkwuYShhKQpzPVAuakIoYixjLEouSG0oYSkpCmlmKGI9PT1zKXJldHVybiIiCnI9UC5qeShhLGIscykK
+cT1uLmhPKHIsMCxzLWIsITApCnA9bi5iCmlmKChwJjEpIT09MCl7bz1QLmo0KHApCm4uYj0wCnRocm93
+IEguYihQLnJyKG8sYSxiK24uYykpfXJldHVybiBxfSwKaE86ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHMs
+cixxPXRoaXMKaWYoYy1iPjEwMDApe3M9Qy5qbi5CVShiK2MsMikKcj1xLmhPKGEsYixzLCExKQppZigo
+cS5iJjEpIT09MClyZXR1cm4gcgpyZXR1cm4gcitxLmhPKGEscyxjLGQpfXJldHVybiBxLkVoKGEsYixj
+LGQpfSwKRWg6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHMscixxLHAsbyxuLG0sbCxrPXRoaXMsaj02NTUz
+MyxpPWsuYixoPWsuYyxnPW5ldyBQLlJuKCIiKSxmPWIrMSxlPWEubGVuZ3RoCmlmKGI8MHx8Yj49ZSly
+ZXR1cm4gSC5PSChhLGIpCnM9YVtiXQokbGFiZWwwJDA6Zm9yKHI9ay5hOyEwOyl7Zm9yKDshMDtmPW8p
+e3E9Qy54Qi5XKCJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
 QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
-QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRkZGRkZG
-RkZGRkZGRkZGRkdHR0dHR0dHR0dHR0dHR0dISEhISEhISEhISEhISEhISEhISEhISEhISEhJSEhISkVF
-QkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS0NDQ0NDQ0NDQ0NDQ0RDTE9OTk5NRUVFRUVFRUVF
-RUUiLHMpJjMxCmg9aTw9MzI/cyY2MTY5ND4+PnE6KHMmNjN8aDw8Nik+Pj4wCmk9Qy54Qi5XKCIgXHgw
-MDA6WEVDQ0NDQ046bERiIFx4MDAwOlhFQ0NDQ0NOdmxEYiBceDAwMDpYRUNDQ0NDTjpsRGIgQUFBQUFc
-eDAwXHgwMFx4MDBceDAwXHgwMEFBQUFBMDAwMDBBQUFBQTo6Ojo6QUFBQUFHRzAwMEFBQUFBMDBLS0tB
-QUFBQUc6Ojo6QUFBQUE6SUlJSUFBQUFBMDAwXHg4MDBBQUFBQVx4MDBceDAwXHgwMFx4MDAgQUFBQUEi
-LGkrcSkKaWYoaT09PTApe2cuYSs9SC5MdyhoKQppZihmPT09YylicmVhayAkbGFiZWwwJDAKYnJlYWt9
-ZWxzZSBpZigoaSYxKSE9PTApe2lmKHIpc3dpdGNoKGkpe2Nhc2UgNjk6Y2FzZSA2NzpnLmErPUguTHco
-aikKYnJlYWsKY2FzZSA2NTpnLmErPUguTHcoaik7LS1mCmJyZWFrCmRlZmF1bHQ6cD1nLmErPUguTHco
-aikKZy5hPXArSC5MdyhqKQpicmVha31lbHNle2suYj1pCmsuYz1mLTEKcmV0dXJuIiJ9aT0wfWlmKGY9
-PT1jKWJyZWFrICRsYWJlbDAkMApvPWYrMQppZihmPDB8fGY+PWUpcmV0dXJuIEguT0goYSxmKQpzPWFb
-Zl19bz1mKzEKaWYoZjwwfHxmPj1lKXJldHVybiBILk9IKGEsZikKcz1hW2ZdCmlmKHM8MTI4KXt3aGls
-ZSghMCl7aWYoIShvPGMpKXtuPWMKYnJlYWt9bT1vKzEKaWYobzwwfHxvPj1lKXJldHVybiBILk9IKGEs
-bykKcz1hW29dCmlmKHM+PTEyOCl7bj1tLTEKbz1tCmJyZWFrfW89bX1pZihuLWY8MjApZm9yKGw9Zjts
-PG47KytsKXtpZihsPj1lKXJldHVybiBILk9IKGEsbCkKZy5hKz1ILkx3KGFbbF0pfWVsc2UgZy5hKz1Q
-LkhNKGEsZixuKQppZihuPT09YylicmVhayAkbGFiZWwwJDAKZj1vfWVsc2UgZj1vfWlmKGQmJmk+MzIp
-aWYocilnLmErPUguTHcoaikKZWxzZXtrLmI9NzcKay5jPWMKcmV0dXJuIiJ9ay5iPWkKay5jPWgKZT1n
-LmEKcmV0dXJuIGUuY2hhckNvZGVBdCgwKT09MD9lOmV9fQpQLldGLnByb3RvdHlwZT17CiQyOmZ1bmN0
-aW9uKGEsYil7dmFyIHMscixxCnQuZm8uYShhKQpzPXRoaXMuYgpyPXRoaXMuYQpzLmErPXIuYQpxPXMu
-YSs9SC5FaihhLmEpCnMuYT1xKyI6ICIKcy5hKz1QLmhsKGIpCnIuYT0iLCAifSwKJFM6NDJ9ClAuaVAu
-cHJvdG90eXBlPXsKRE46ZnVuY3Rpb24oYSxiKXtpZihiPT1udWxsKXJldHVybiExCnJldHVybiBiIGlu
-c3RhbmNlb2YgUC5pUCYmdGhpcy5hPT09Yi5hJiYhMH0sCmdpTzpmdW5jdGlvbihhKXt2YXIgcz10aGlz
-LmEKcmV0dXJuKHNeQy5qbi53RyhzLDMwKSkmMTA3Mzc0MTgyM30sCnc6ZnVuY3Rpb24oYSl7dmFyIHM9
-dGhpcyxyPVAuR3EoSC50SihzKSkscT1QLmgwKEguTlMocykpLHA9UC5oMChILmpBKHMpKSxvPVAuaDAo
-SC5JWChzKSksbj1QLmgwKEguY2gocykpLG09UC5oMChILkpkKHMpKSxsPVAuVngoSC5vMShzKSksaz1y
-KyItIitxKyItIitwKyIgIitvKyI6IituKyI6IittKyIuIitsCnJldHVybiBrfX0KUC5YUy5wcm90b3R5
-cGU9ewpnSUk6ZnVuY3Rpb24oKXtyZXR1cm4gSC50cyh0aGlzLiR0aHJvd25Kc0Vycm9yKX19ClAuQzYu
-cHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXt2YXIgcz10aGlzLmEKaWYocyE9bnVsbClyZXR1cm4iQXNz
-ZXJ0aW9uIGZhaWxlZDogIitQLmhsKHMpCnJldHVybiJBc3NlcnRpb24gZmFpbGVkIn19ClAuRXoucHJv
-dG90eXBlPXt9ClAuRi5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3JldHVybiJUaHJvdyBvZiBudWxs
-LiJ9fQpQLnUucHJvdG90eXBlPXsKZ1o6ZnVuY3Rpb24oKXtyZXR1cm4iSW52YWxpZCBhcmd1bWVudCIr
-KCF0aGlzLmE/IihzKSI6IiIpfSwKZ3U6ZnVuY3Rpb24oKXtyZXR1cm4iIn0sCnc6ZnVuY3Rpb24oYSl7
-dmFyIHMscixxPXRoaXMscD1xLmMsbz1wPT1udWxsPyIiOiIgKCIrcCsiKSIsbj1xLmQsbT1uPT1udWxs
-PyIiOiI6ICIrSC5FaihuKSxsPXEuZ1ooKStvK20KaWYoIXEuYSlyZXR1cm4gbApzPXEuZ3UoKQpyPVAu
-aGwocS5iKQpyZXR1cm4gbCtzKyI6ICIrcn19ClAuYkoucHJvdG90eXBlPXsKZ1o6ZnVuY3Rpb24oKXty
-ZXR1cm4iUmFuZ2VFcnJvciJ9LApndTpmdW5jdGlvbigpe3ZhciBzLHI9dGhpcy5lLHE9dGhpcy5mCmlm
-KHI9PW51bGwpcz1xIT1udWxsPyI6IE5vdCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gIitILkVqKHEpOiIi
-CmVsc2UgaWYocT09bnVsbClzPSI6IE5vdCBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gIitILkVqKHIp
-CmVsc2UgaWYocT5yKXM9IjogTm90IGluIGluY2x1c2l2ZSByYW5nZSAiK0guRWoocikrIi4uIitILkVq
-KHEpCmVsc2Ugcz1xPHI/IjogVmFsaWQgdmFsdWUgcmFuZ2UgaXMgZW1wdHkiOiI6IE9ubHkgdmFsaWQg
-dmFsdWUgaXMgIitILkVqKHIpCnJldHVybiBzfX0KUC5lWS5wcm90b3R5cGU9ewpnWjpmdW5jdGlvbigp
-e3JldHVybiJSYW5nZUVycm9yIn0sCmd1OmZ1bmN0aW9uKCl7dmFyIHMscj1ILnVQKHRoaXMuYikKaWYo
-dHlwZW9mIHIhPT0ibnVtYmVyIilyZXR1cm4gci5KKCkKaWYocjwwKXJldHVybiI6IGluZGV4IG11c3Qg
-bm90IGJlIG5lZ2F0aXZlIgpzPXRoaXMuZgppZihzPT09MClyZXR1cm4iOiBubyBpbmRpY2VzIGFyZSB2
-YWxpZCIKcmV0dXJuIjogaW5kZXggc2hvdWxkIGJlIGxlc3MgdGhhbiAiK0guRWoocyl9LApnQTpmdW5j
-dGlvbihhKXtyZXR1cm4gdGhpcy5mfX0KUC5tcC5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3ZhciBz
-LHIscSxwLG8sbixtLGwsaz10aGlzLGo9e30saT1uZXcgUC5SbigiIikKai5hPSIiCnM9ay5jCmZvcihy
-PXMubGVuZ3RoLHE9MCxwPSIiLG89IiI7cTxyOysrcSxvPSIsICIpe249c1txXQppLmE9cCtvCnA9aS5h
-Kz1QLmhsKG4pCmouYT0iLCAifWsuZC5LKDAsbmV3IFAuV0YoaixpKSkKbT1QLmhsKGsuYSkKbD1pLnco
-MCkKcj0iTm9TdWNoTWV0aG9kRXJyb3I6IG1ldGhvZCBub3QgZm91bmQ6ICciK0guRWooay5iLmEpKyIn
-XG5SZWNlaXZlcjogIittKyJcbkFyZ3VtZW50czogWyIrbCsiXSIKcmV0dXJuIHJ9fQpQLnViLnByb3Rv
-dHlwZT17Cnc6ZnVuY3Rpb24oYSl7cmV0dXJuIlVuc3VwcG9ydGVkIG9wZXJhdGlvbjogIit0aGlzLmF9
-fQpQLmRzLnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7dmFyIHM9dGhpcy5hCnJldHVybiBzIT1udWxs
-PyJVbmltcGxlbWVudGVkRXJyb3I6ICIrczoiVW5pbXBsZW1lbnRlZEVycm9yIn19ClAubGoucHJvdG90
-eXBlPXsKdzpmdW5jdGlvbihhKXtyZXR1cm4iQmFkIHN0YXRlOiAiK3RoaXMuYX19ClAuVVYucHJvdG90
-eXBlPXsKdzpmdW5jdGlvbihhKXt2YXIgcz10aGlzLmEKaWYocz09bnVsbClyZXR1cm4iQ29uY3VycmVu
-dCBtb2RpZmljYXRpb24gZHVyaW5nIGl0ZXJhdGlvbi4iCnJldHVybiJDb25jdXJyZW50IG1vZGlmaWNh
-dGlvbiBkdXJpbmcgaXRlcmF0aW9uOiAiK1AuaGwocykrIi4ifX0KUC5rNS5wcm90b3R5cGU9ewp3OmZ1
-bmN0aW9uKGEpe3JldHVybiJPdXQgb2YgTWVtb3J5In0sCmdJSTpmdW5jdGlvbigpe3JldHVybiBudWxs
-fSwKJGlYUzoxfQpQLktZLnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7cmV0dXJuIlN0YWNrIE92ZXJm
-bG93In0sCmdJSTpmdW5jdGlvbigpe3JldHVybiBudWxsfSwKJGlYUzoxfQpQLnAucHJvdG90eXBlPXsK
-dzpmdW5jdGlvbihhKXt2YXIgcz10aGlzLmEKcmV0dXJuIHM9PW51bGw/IlJlYWRpbmcgc3RhdGljIHZh
-cmlhYmxlIGR1cmluZyBpdHMgaW5pdGlhbGl6YXRpb24iOiJSZWFkaW5nIHN0YXRpYyB2YXJpYWJsZSAn
-IitzKyInIGR1cmluZyBpdHMgaW5pdGlhbGl6YXRpb24ifX0KUC5DRC5wcm90b3R5cGU9ewp3OmZ1bmN0
-aW9uKGEpe3JldHVybiJFeGNlcHRpb246ICIrdGhpcy5hfSwKJGlSejoxfQpQLmFFLnByb3RvdHlwZT17
-Cnc6ZnVuY3Rpb24oYSl7dmFyIHMscixxLHAsbyxuLG0sbCxrLGosaSxoLGc9dGhpcy5hLGY9ZyE9bnVs
-bCYmIiIhPT1nPyJGb3JtYXRFeGNlcHRpb246ICIrSC5FaihnKToiRm9ybWF0RXhjZXB0aW9uIixlPXRo
-aXMuYyxkPXRoaXMuYgppZih0eXBlb2YgZD09InN0cmluZyIpe2lmKGUhPW51bGwpcz1lPDB8fGU+ZC5s
-ZW5ndGgKZWxzZSBzPSExCmlmKHMpZT1udWxsCmlmKGU9PW51bGwpe2lmKGQubGVuZ3RoPjc4KWQ9Qy54
-Qi5OaihkLDAsNzUpKyIuLi4iCnJldHVybiBmKyJcbiIrZH1mb3Iocj0xLHE9MCxwPSExLG89MDtvPGU7
-KytvKXtuPUMueEIuVyhkLG8pCmlmKG49PT0xMCl7aWYocSE9PW98fCFwKSsrcgpxPW8rMQpwPSExfWVs
-c2UgaWYobj09PTEzKXsrK3IKcT1vKzEKcD0hMH19Zj1yPjE/ZisoIiAoYXQgbGluZSAiK3IrIiwgY2hh
-cmFjdGVyICIrKGUtcSsxKSsiKVxuIik6ZisoIiAoYXQgY2hhcmFjdGVyICIrKGUrMSkrIilcbiIpCm09
-ZC5sZW5ndGgKZm9yKG89ZTtvPG07KytvKXtuPUMueEIubShkLG8pCmlmKG49PT0xMHx8bj09PTEzKXtt
-PW8KYnJlYWt9fWlmKG0tcT43OClpZihlLXE8NzUpe2w9cSs3NQprPXEKaj0iIgppPSIuLi4ifWVsc2V7
-aWYobS1lPDc1KXtrPW0tNzUKbD1tCmk9IiJ9ZWxzZXtrPWUtMzYKbD1lKzM2Cmk9Ii4uLiJ9aj0iLi4u
-In1lbHNle2w9bQprPXEKaj0iIgppPSIifWg9Qy54Qi5OaihkLGssbCkKcmV0dXJuIGYraitoK2krIlxu
-IitDLnhCLkl4KCIgIixlLWsrai5sZW5ndGgpKyJeXG4ifWVsc2UgcmV0dXJuIGUhPW51bGw/ZisoIiAo
-YXQgb2Zmc2V0ICIrSC5FaihlKSsiKSIpOmZ9LAokaVJ6OjF9ClAuY1gucHJvdG90eXBlPXsKZHI6ZnVu
-Y3Rpb24oYSxiKXtyZXR1cm4gSC5HSih0aGlzLEguTGgodGhpcykuQygiY1guRSIpLGIpfSwKRTI6ZnVu
-Y3Rpb24oYSxiLGMpe3ZhciBzPUguTGgodGhpcykKcmV0dXJuIEguSzEodGhpcyxzLktxKGMpLkMoIjEo
-Y1guRSkiKS5hKGIpLHMuQygiY1guRSIpLGMpfSwKZXY6ZnVuY3Rpb24oYSxiKXt2YXIgcz1ILkxoKHRo
-aXMpCnJldHVybiBuZXcgSC5VNSh0aGlzLHMuQygiYTIoY1guRSkiKS5hKGIpLHMuQygiVTU8Y1guRT4i
-KSl9LAp0dDpmdW5jdGlvbihhLGIpe3JldHVybiBQLkNIKHRoaXMsYixILkxoKHRoaXMpLkMoImNYLkUi
-KSl9LApicjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy50dChhLCEwKX0sCmdBOmZ1bmN0aW9uKGEpe3Zh
-ciBzLHI9dGhpcy5na3oodGhpcykKZm9yKHM9MDtyLkYoKTspKytzCnJldHVybiBzfSwKZ2wwOmZ1bmN0
-aW9uKGEpe3JldHVybiF0aGlzLmdreih0aGlzKS5GKCl9LApnb3I6ZnVuY3Rpb24oYSl7cmV0dXJuIXRo
-aXMuZ2wwKHRoaXMpfSwKZVI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSC5iSyh0aGlzLGIsSC5MaCh0aGlz
-KS5DKCJjWC5FIikpfSwKZ3I4OmZ1bmN0aW9uKGEpe3ZhciBzLHI9dGhpcy5na3oodGhpcykKaWYoIXIu
-RigpKXRocm93IEguYihILldwKCkpCnM9ci5nbCgpCmlmKHIuRigpKXRocm93IEguYihILkFtKCkpCnJl
-dHVybiBzfSwKRTpmdW5jdGlvbihhLGIpe3ZhciBzLHIscQpQLmsxKGIsImluZGV4IikKZm9yKHM9dGhp
-cy5na3oodGhpcykscj0wO3MuRigpOyl7cT1zLmdsKCkKaWYoYj09PXIpcmV0dXJuIHE7KytyfXRocm93
-IEguYihQLkNmKGIsdGhpcywiaW5kZXgiLG51bGwscikpfSwKdzpmdW5jdGlvbihhKXtyZXR1cm4gUC5F
-UCh0aGlzLCIoIiwiKSIpfX0KUC5Bbi5wcm90b3R5cGU9e30KUC5OMy5wcm90b3R5cGU9ewp3OmZ1bmN0
-aW9uKGEpe3JldHVybiJNYXBFbnRyeSgiK0guRWooSi5qKHRoaXMuYSkpKyI6ICIrSC5FaihKLmoodGhp
-cy5iKSkrIikifX0KUC5jOC5wcm90b3R5cGU9ewpnaU86ZnVuY3Rpb24oYSl7cmV0dXJuIFAuTWgucHJv
-dG90eXBlLmdpTy5jYWxsKEMuak4sdGhpcyl9LAp3OmZ1bmN0aW9uKGEpe3JldHVybiJudWxsIn19ClAu
-TWgucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpQLk1oLCRpTWg6MSwKRE46ZnVuY3Rpb24oYSxiKXtyZXR1
-cm4gdGhpcz09PWJ9LApnaU86ZnVuY3Rpb24oYSl7cmV0dXJuIEguZVEodGhpcyl9LAp3OmZ1bmN0aW9u
-KGEpe3JldHVybiJJbnN0YW5jZSBvZiAnIitILkVqKEguTSh0aGlzKSkrIicifSwKZTc6ZnVuY3Rpb24o
-YSxiKXt0Lm8uYShiKQp0aHJvdyBILmIoUC5scih0aGlzLGIuZ1dhKCksYi5nbmQoKSxiLmdWbSgpKSl9
-LAp0b1N0cmluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLncodGhpcyl9fQpQLlpkLnByb3RvdHlwZT17
-Cnc6ZnVuY3Rpb24oYSl7cmV0dXJuIiJ9LAokaUd6OjF9ClAuUm4ucHJvdG90eXBlPXsKZ0E6ZnVuY3Rp
-b24oYSl7cmV0dXJuIHRoaXMuYS5sZW5ndGh9LAp3OmZ1bmN0aW9uKGEpe3ZhciBzPXRoaXMuYQpyZXR1
-cm4gcy5jaGFyQ29kZUF0KDApPT0wP3M6c30sCiRpQkw6MX0KUC5uMS5wcm90b3R5cGU9ewokMjpmdW5j
-dGlvbihhLGIpe3ZhciBzLHIscSxwCnQuSi5hKGEpCkguaChiKQpzPUouclkoYikuT1koYiwiPSIpCmlm
-KHM9PT0tMSl7aWYoYiE9PSIiKWEuWSgwLFAua3UoYiwwLGIubGVuZ3RoLHRoaXMuYSwhMCksIiIpfWVs
-c2UgaWYocyE9PTApe3I9Qy54Qi5OaihiLDAscykKcT1DLnhCLkcoYixzKzEpCnA9dGhpcy5hCmEuWSgw
-LFAua3UociwwLHIubGVuZ3RoLHAsITApLFAua3UocSwwLHEubGVuZ3RoLHAsITApKX1yZXR1cm4gYX0s
-CiRTOjQ0fQpQLmNTLnByb3RvdHlwZT17CiQyOmZ1bmN0aW9uKGEsYil7dGhyb3cgSC5iKFAucnIoIkls
-bGVnYWwgSVB2NCBhZGRyZXNzLCAiK2EsdGhpcy5hLGIpKX0sCiRTOjIxfQpQLlZDLnByb3RvdHlwZT17
-CiQyOmZ1bmN0aW9uKGEsYil7dGhyb3cgSC5iKFAucnIoIklsbGVnYWwgSVB2NiBhZGRyZXNzLCAiK2Es
-dGhpcy5hLGIpKX0sCiQxOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLiQyKGEsbnVsbCl9LAokUzo0OX0K
-UC5KVC5wcm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe3ZhciBzCmlmKGItYT40KXRoaXMuYS4kMigi
-YW4gSVB2NiBwYXJ0IGNhbiBvbmx5IGNvbnRhaW4gYSBtYXhpbXVtIG9mIDQgaGV4IGRpZ2l0cyIsYSkK
-cz1QLlFBKEMueEIuTmoodGhpcy5iLGEsYiksMTYpCmlmKHM8MHx8cz42NTUzNSl0aGlzLmEuJDIoImVh
-Y2ggcGFydCBtdXN0IGJlIGluIHRoZSByYW5nZSBvZiBgMHgwLi4weEZGRkZgIixhKQpyZXR1cm4gc30s
-CiRTOjUxfQpQLkRuLnByb3RvdHlwZT17CmduRDpmdW5jdGlvbigpe3ZhciBzLHIscSxwPXRoaXMsbz1w
-LngKaWYobz09bnVsbCl7bz1wLmEKcz1vLmxlbmd0aCE9PTA/bysiOiI6IiIKcj1wLmMKcT1yPT1udWxs
-CmlmKCFxfHxvPT09ImZpbGUiKXtvPXMrIi8vIgpzPXAuYgppZihzLmxlbmd0aCE9PTApbz1vK3MrIkAi
-CmlmKCFxKW8rPXIKcz1wLmQKaWYocyE9bnVsbClvPW8rIjoiK0guRWoocyl9ZWxzZSBvPXMKbys9cC5l
-CnM9cC5mCmlmKHMhPW51bGwpbz1vKyI/IitzCnM9cC5yCmlmKHMhPW51bGwpbz1vKyIjIitzCm89by5j
-aGFyQ29kZUF0KDApPT0wP286bwppZihwLng9PW51bGwpcC54PW8KZWxzZSBvPUgudihILmMoIkZpZWxk
-ICdfdGV4dCcgaGFzIGJlZW4gYXNzaWduZWQgZHVyaW5nIGluaXRpYWxpemF0aW9uLiIpKX1yZXR1cm4g
-b30sCmdGajpmdW5jdGlvbigpe3ZhciBzLHI9dGhpcyxxPXIueQppZihxPT1udWxsKXtzPXIuZQppZihz
-Lmxlbmd0aCE9PTAmJkMueEIuVyhzLDApPT09NDcpcz1DLnhCLkcocywxKQpxPXMubGVuZ3RoPT09MD9D
-LnhEOlAuQUYobmV3IEgubEooSC5WTShzLnNwbGl0KCIvIiksdC5zKSx0LmRPLmEoUC5QSCgpKSx0LmRv
-KSx0Lk4pCmlmKHIueT09bnVsbClyLnNLcChxKQplbHNlIHE9SC52KEguYygiRmllbGQgJ3BhdGhTZWdt
-ZW50cycgaGFzIGJlZW4gYXNzaWduZWQgZHVyaW5nIGluaXRpYWxpemF0aW9uLiIpKX1yZXR1cm4gcX0s
-CmdpTzpmdW5jdGlvbihhKXt2YXIgcz10aGlzLHI9cy56CmlmKHI9PW51bGwpe3I9Qy54Qi5naU8ocy5n
-bkQoKSkKaWYocy56PT1udWxsKXMuej1yCmVsc2Ugcj1ILnYoSC5jKCJGaWVsZCAnaGFzaENvZGUnIGhh
-cyBiZWVuIGFzc2lnbmVkIGR1cmluZyBpbml0aWFsaXphdGlvbi4iKSl9cmV0dXJuIHJ9LApnaFk6ZnVu
-Y3Rpb24oKXt2YXIgcz10aGlzLHI9cy5RCmlmKHI9PW51bGwpe3I9bmV3IFAuR2ooUC5XWChzLmd0UCgp
-KSx0LmR3KQppZihzLlE9PW51bGwpcy5zTk0ocikKZWxzZSByPUgudihILmMoIkZpZWxkICdxdWVyeVBh
-cmFtZXRlcnMnIGhhcyBiZWVuIGFzc2lnbmVkIGR1cmluZyBpbml0aWFsaXphdGlvbi4iKSl9cmV0dXJu
-IHJ9LApna3U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ifSwKZ0pmOmZ1bmN0aW9uKGEpe3ZhciBzPXRo
-aXMuYwppZihzPT1udWxsKXJldHVybiIiCmlmKEMueEIubihzLCJbIikpcmV0dXJuIEMueEIuTmoocywx
-LHMubGVuZ3RoLTEpCnJldHVybiBzfSwKZ3RwOmZ1bmN0aW9uKGEpe3ZhciBzPXRoaXMuZApyZXR1cm4g
-cz09bnVsbD9QLndLKHRoaXMuYSk6c30sCmd0UDpmdW5jdGlvbigpe3ZhciBzPXRoaXMuZgpyZXR1cm4g
-cz09bnVsbD8iIjpzfSwKZ0thOmZ1bmN0aW9uKCl7dmFyIHM9dGhpcy5yCnJldHVybiBzPT1udWxsPyIi
-OnN9LApubTpmdW5jdGlvbihhLGIpe3ZhciBzLHIscSxwLG8sbixtLGwsayxqPXRoaXMKdC5jOS5hKGIp
-CnM9ai5hCnI9cz09PSJmaWxlIgpxPWouYgpwPWouZApvPWouYwppZighKG8hPW51bGwpKW89cS5sZW5n
-dGghPT0wfHxwIT1udWxsfHxyPyIiOm51bGwKbj1qLmUKaWYoIXIpbT1vIT1udWxsJiZuLmxlbmd0aCE9
-PTAKZWxzZSBtPSEwCmlmKG0mJiFDLnhCLm4obiwiLyIpKW49Ii8iK24KbD1uCms9UC5sZShudWxsLDAs
-MCxiKQpyZXR1cm4gbmV3IFAuRG4ocyxxLG8scCxsLGssai5yKX0sCkpoOmZ1bmN0aW9uKGEsYil7dmFy
-IHMscixxLHAsbyxuCmZvcihzPTAscj0wO0MueEIuUWkoYiwiLi4vIixyKTspe3IrPTM7KytzfXE9Qy54
-Qi5jbihhLCIvIikKd2hpbGUoITApe2lmKCEocT4wJiZzPjApKWJyZWFrCnA9Qy54Qi5QayhhLCIvIixx
-LTEpCmlmKHA8MClicmVhawpvPXEtcApuPW8hPT0yCmlmKCFufHxvPT09MylpZihDLnhCLm0oYSxwKzEp
-PT09NDYpbj0hbnx8Qy54Qi5tKGEscCsyKT09PTQ2CmVsc2Ugbj0hMQplbHNlIG49ITEKaWYobilicmVh
-azstLXMKcT1wfXJldHVybiBDLnhCLmk3KGEscSsxLG51bGwsQy54Qi5HKGIsci0zKnMpKX0sClpJOmZ1
-bmN0aW9uKGEpe3JldHVybiB0aGlzLm1TKFAuaEsoYSkpfSwKbVM6ZnVuY3Rpb24oYSl7dmFyIHMscixx
-LHAsbyxuLG0sbCxrLGo9dGhpcyxpPW51bGwKaWYoYS5nRmkoKS5sZW5ndGghPT0wKXtzPWEuZ0ZpKCkK
-aWYoYS5nY2ooKSl7cj1hLmdrdSgpCnE9YS5nSmYoYSkKcD1hLmd4QSgpP2EuZ3RwKGEpOml9ZWxzZXtw
-PWkKcT1wCnI9IiJ9bz1QLnhlKGEuZ0lpKGEpKQpuPWEuZ1FEKCk/YS5ndFAoKTppfWVsc2V7cz1qLmEK
-aWYoYS5nY2ooKSl7cj1hLmdrdSgpCnE9YS5nSmYoYSkKcD1QLndCKGEuZ3hBKCk/YS5ndHAoYSk6aSxz
-KQpvPVAueGUoYS5nSWkoYSkpCm49YS5nUUQoKT9hLmd0UCgpOml9ZWxzZXtyPWouYgpxPWouYwpwPWou
-ZAppZihhLmdJaShhKT09PSIiKXtvPWouZQpuPWEuZ1FEKCk/YS5ndFAoKTpqLmZ9ZWxzZXtpZihhLmd0
-VCgpKW89UC54ZShhLmdJaShhKSkKZWxzZXttPWouZQppZihtLmxlbmd0aD09PTApaWYocT09bnVsbClv
-PXMubGVuZ3RoPT09MD9hLmdJaShhKTpQLnhlKGEuZ0lpKGEpKQplbHNlIG89UC54ZSgiLyIrYS5nSWko
-YSkpCmVsc2V7bD1qLkpoKG0sYS5nSWkoYSkpCms9cy5sZW5ndGg9PT0wCmlmKCFrfHxxIT1udWxsfHxD
-LnhCLm4obSwiLyIpKW89UC54ZShsKQplbHNlIG89UC53RihsLCFrfHxxIT1udWxsKX19bj1hLmdRRCgp
-P2EuZ3RQKCk6aX19fXJldHVybiBuZXcgUC5EbihzLHIscSxwLG8sbixhLmdaOCgpP2EuZ0thKCk6aSl9
-LApnY2o6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jIT1udWxsfSwKZ3hBOmZ1bmN0aW9uKCl7cmV0dXJu
-IHRoaXMuZCE9bnVsbH0sCmdRRDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmYhPW51bGx9LApnWjg6ZnVu
-Y3Rpb24oKXtyZXR1cm4gdGhpcy5yIT1udWxsfSwKZ3RUOmZ1bmN0aW9uKCl7cmV0dXJuIEMueEIubih0
-aGlzLmUsIi8iKX0sCnQ0OmZ1bmN0aW9uKCl7dmFyIHMscj10aGlzLHE9ci5hCmlmKHEhPT0iIiYmcSE9
-PSJmaWxlIil0aHJvdyBILmIoUC5MNCgiQ2Fubm90IGV4dHJhY3QgYSBmaWxlIHBhdGggZnJvbSBhICIr
-cSsiIFVSSSIpKQppZihyLmd0UCgpIT09IiIpdGhyb3cgSC5iKFAuTDQodS5pKSkKaWYoci5nS2EoKSE9
-PSIiKXRocm93IEguYihQLkw0KHUubCkpCnE9JC53USgpCmlmKEgub1QocSkpcT1QLm1uKHIpCmVsc2V7
-aWYoci5jIT1udWxsJiZyLmdKZihyKSE9PSIiKUgudihQLkw0KHUuaikpCnM9ci5nRmooKQpQLmtFKHMs
-ITEpCnE9UC52ZyhDLnhCLm4oci5lLCIvIik/Ii8iOiIiLHMsIi8iKQpxPXEuY2hhckNvZGVBdCgwKT09
-MD9xOnF9cmV0dXJuIHF9LAp3OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmduRCgpfSwKRE46ZnVuY3Rp
-b24oYSxiKXt2YXIgcz10aGlzCmlmKGI9PW51bGwpcmV0dXJuITEKaWYocz09PWIpcmV0dXJuITAKcmV0
-dXJuIHQuZEQuYihiKSYmcy5hPT09Yi5nRmkoKSYmcy5jIT1udWxsPT09Yi5nY2ooKSYmcy5iPT09Yi5n
-a3UoKSYmcy5nSmYocyk9PT1iLmdKZihiKSYmcy5ndHAocyk9PT1iLmd0cChiKSYmcy5lPT09Yi5nSWko
-YikmJnMuZiE9bnVsbD09PWIuZ1FEKCkmJnMuZ3RQKCk9PT1iLmd0UCgpJiZzLnIhPW51bGw9PT1iLmda
-OCgpJiZzLmdLYSgpPT09Yi5nS2EoKX0sCnNLcDpmdW5jdGlvbihhKXt0aGlzLnk9dC5iay5hKGEpfSwK
-c05NOmZ1bmN0aW9uKGEpe3RoaXMuUT10LmNaLmEoYSl9LAokaWlEOjEsCmdGaTpmdW5jdGlvbigpe3Jl
-dHVybiB0aGlzLmF9LApnSWk6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZX19ClAuUloucHJvdG90eXBl
-PXsKJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIFAuZVAoQy5aSixILmgoYSksQy54TSwhMSl9LAokUzo1fQpQ
-Lk1FLnByb3RvdHlwZT17CiQyOmZ1bmN0aW9uKGEsYil7dmFyIHM9dGhpcy5iLHI9dGhpcy5hCnMuYSs9
-ci5hCnIuYT0iJiIKcj1zLmErPUguRWooUC5lUChDLkYzLGEsQy54TSwhMCkpCmlmKGIhPW51bGwmJmIu
-bGVuZ3RoIT09MCl7cy5hPXIrIj0iCnMuYSs9SC5FaihQLmVQKEMuRjMsYixDLnhNLCEwKSl9fSwKJFM6
-MjJ9ClAueTUucHJvdG90eXBlPXsKJDI6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyCkguaChhKQppZihiPT1u
-dWxsfHx0eXBlb2YgYj09InN0cmluZyIpdGhpcy5hLiQyKGEsSC5rKGIpKQplbHNlIGZvcihzPUouSVQo
-dC51LmEoYikpLHI9dGhpcy5hO3MuRigpOylyLiQyKGEsSC5oKHMuZ2woKSkpfSwKJFM6MTR9ClAuUEUu
-cHJvdG90eXBlPXsKZ2xSOmZ1bmN0aW9uKCl7dmFyIHMscixxLHAsbz10aGlzLG49bnVsbCxtPW8uYwpp
-ZihtPT1udWxsKXttPW8uYgppZigwPj1tLmxlbmd0aClyZXR1cm4gSC5PSChtLDApCnM9by5hCm09bVsw
-XSsxCnI9Qy54Qi5YVShzLCI/IixtKQpxPXMubGVuZ3RoCmlmKHI+PTApe3A9UC5QSShzLHIrMSxxLEMu
-VkMsITEpCnE9cn1lbHNlIHA9bgptPW8uYz1uZXcgUC5xZSgiZGF0YSIsIiIsbixuLFAuUEkocyxtLHEs
-Qy5XZCwhMSkscCxuKX1yZXR1cm4gbX0sCnc6ZnVuY3Rpb24oYSl7dmFyIHMscj10aGlzLmIKaWYoMD49
-ci5sZW5ndGgpcmV0dXJuIEguT0gociwwKQpzPXRoaXMuYQpyZXR1cm4gclswXT09PS0xPyJkYXRhOiIr
-czpzfX0KUC5xMy5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFVpbnQ4QXJyYXko
-OTYpfSwKJFM6MjN9ClAueUkucHJvdG90eXBlPXsKJDI6ZnVuY3Rpb24oYSxiKXt2YXIgcz10aGlzLmEK
-aWYoYT49MjIpcmV0dXJuIEguT0gocyxhKQpzPXNbYV0KSi5DTShzLDAsOTYsYikKcmV0dXJuIHN9LAok
-UzoyNH0KUC5jNi5wcm90b3R5cGU9ewokMzpmdW5jdGlvbihhLGIsYyl7dmFyIHMscixxLHAKZm9yKHM9
-Yi5sZW5ndGgscj1hLmxlbmd0aCxxPTA7cTxzOysrcSl7cD1DLnhCLlcoYixxKV45NgppZihwPj1yKXJl
-dHVybiBILk9IKGEscCkKYVtwXT1jfX0sCiRTOjE1fQpQLnFkLnByb3RvdHlwZT17CiQzOmZ1bmN0aW9u
-KGEsYixjKXt2YXIgcyxyLHEscApmb3Iocz1DLnhCLlcoYiwwKSxyPUMueEIuVyhiLDEpLHE9YS5sZW5n
-dGg7czw9cjsrK3Mpe3A9KHNeOTYpPj4+MAppZihwPj1xKXJldHVybiBILk9IKGEscCkKYVtwXT1jfX0s
-CiRTOjE1fQpQLlVmLnByb3RvdHlwZT17CmdjajpmdW5jdGlvbigpe3JldHVybiB0aGlzLmM+MH0sCmd4
-QTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmM+MCYmdGhpcy5kKzE8dGhpcy5lfSwKZ1FEOmZ1bmN0aW9u
-KCl7cmV0dXJuIHRoaXMuZjx0aGlzLnJ9LApnWjg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yPHRoaXMu
-YS5sZW5ndGh9LApnTnc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iPT09NCYmQy54Qi5uKHRoaXMuYSwi
-ZmlsZSIpfSwKZ1daOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYj09PTQmJkMueEIubih0aGlzLmEsImh0
-dHAiKX0sCmdSZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmI9PT01JiZDLnhCLm4odGhpcy5hLCJodHRw
-cyIpfSwKZ3RUOmZ1bmN0aW9uKCl7cmV0dXJuIEMueEIuUWkodGhpcy5hLCIvIix0aGlzLmUpfSwKZ0Zp
-OmZ1bmN0aW9uKCl7dmFyIHM9dGhpcy54CnJldHVybiBzPT1udWxsP3RoaXMueD10aGlzLlUyKCk6c30s
-ClUyOmZ1bmN0aW9uKCl7dmFyIHM9dGhpcyxyPXMuYgppZihyPD0wKXJldHVybiIiCmlmKHMuZ1daKCkp
-cmV0dXJuImh0dHAiCmlmKHMuZ1JlKCkpcmV0dXJuImh0dHBzIgppZihzLmdOdygpKXJldHVybiJmaWxl
-IgppZihyPT09NyYmQy54Qi5uKHMuYSwicGFja2FnZSIpKXJldHVybiJwYWNrYWdlIgpyZXR1cm4gQy54
-Qi5OaihzLmEsMCxyKX0sCmdrdTpmdW5jdGlvbigpe3ZhciBzPXRoaXMuYyxyPXRoaXMuYiszCnJldHVy
-biBzPnI/Qy54Qi5Oaih0aGlzLmEscixzLTEpOiIifSwKZ0pmOmZ1bmN0aW9uKGEpe3ZhciBzPXRoaXMu
-YwpyZXR1cm4gcz4wP0MueEIuTmoodGhpcy5hLHMsdGhpcy5kKToiIn0sCmd0cDpmdW5jdGlvbihhKXt2
-YXIgcz10aGlzCmlmKHMuZ3hBKCkpcmV0dXJuIFAuUUEoQy54Qi5OaihzLmEscy5kKzEscy5lKSxudWxs
-KQppZihzLmdXWigpKXJldHVybiA4MAppZihzLmdSZSgpKXJldHVybiA0NDMKcmV0dXJuIDB9LApnSWk6
-ZnVuY3Rpb24oYSl7cmV0dXJuIEMueEIuTmoodGhpcy5hLHRoaXMuZSx0aGlzLmYpfSwKZ3RQOmZ1bmN0
-aW9uKCl7dmFyIHM9dGhpcy5mLHI9dGhpcy5yCnJldHVybiBzPHI/Qy54Qi5Oaih0aGlzLmEscysxLHIp
-OiIifSwKZ0thOmZ1bmN0aW9uKCl7dmFyIHM9dGhpcy5yLHI9dGhpcy5hCnJldHVybiBzPHIubGVuZ3Ro
-P0MueEIuRyhyLHMrMSk6IiJ9LApnRmo6ZnVuY3Rpb24oKXt2YXIgcyxyLHE9dGhpcy5lLHA9dGhpcy5m
-LG89dGhpcy5hCmlmKEMueEIuUWkobywiLyIscSkpKytxCmlmKHE9PT1wKXJldHVybiBDLnhECnM9SC5W
-TShbXSx0LnMpCmZvcihyPXE7cjxwOysrcilpZihDLnhCLm0obyxyKT09PTQ3KXtDLk5tLmkocyxDLnhC
-Lk5qKG8scSxyKSkKcT1yKzF9Qy5ObS5pKHMsQy54Qi5OaihvLHEscCkpCnJldHVybiBQLkFGKHMsdC5O
-KX0sCmdoWTpmdW5jdGlvbigpe2lmKHRoaXMuZj49dGhpcy5yKXJldHVybiBDLkNNCnJldHVybiBuZXcg
-UC5HaihQLldYKHRoaXMuZ3RQKCkpLHQuZHcpfSwKa1g6ZnVuY3Rpb24oYSl7dmFyIHM9dGhpcy5kKzEK
-cmV0dXJuIHMrYS5sZW5ndGg9PT10aGlzLmUmJkMueEIuUWkodGhpcy5hLGEscyl9LApOOTpmdW5jdGlv
-bigpe3ZhciBzPXRoaXMscj1zLnIscT1zLmEKaWYocj49cS5sZW5ndGgpcmV0dXJuIHMKcmV0dXJuIG5l
-dyBQLlVmKEMueEIuTmoocSwwLHIpLHMuYixzLmMscy5kLHMuZSxzLmYscixzLngpfSwKbm06ZnVuY3Rp
-b24oYSxiKXt2YXIgcyxyLHEscCxvLG4sbSxsLGssaixpPXRoaXMsaD1udWxsCnQuYzkuYShiKQpzPWku
-Z0ZpKCkKcj1zPT09ImZpbGUiCnE9aS5jCnA9cT4wP0MueEIuTmooaS5hLGkuYiszLHEpOiIiCm89aS5n
-eEEoKT9pLmd0cChpKTpoCnE9aS5jCmlmKHE+MCluPUMueEIuTmooaS5hLHEsaS5kKQplbHNlIG49cC5s
-ZW5ndGghPT0wfHxvIT1udWxsfHxyPyIiOmgKcT1pLmEKbT1DLnhCLk5qKHEsaS5lLGkuZikKaWYoIXIp
-bD1uIT1udWxsJiZtLmxlbmd0aCE9PTAKZWxzZSBsPSEwCmlmKGwmJiFDLnhCLm4obSwiLyIpKW09Ii8i
-K20Kaz1QLmxlKGgsMCwwLGIpCmw9aS5yCmo9bDxxLmxlbmd0aD9DLnhCLkcocSxsKzEpOmgKcmV0dXJu
-IG5ldyBQLkRuKHMscCxuLG8sbSxrLGopfSwKWkk6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubVMoUC5o
-SyhhKSl9LAptUzpmdW5jdGlvbihhKXtpZihhIGluc3RhbmNlb2YgUC5VZilyZXR1cm4gdGhpcy51MSh0
-aGlzLGEpCnJldHVybiB0aGlzLnZzKCkubVMoYSl9LAp1MTpmdW5jdGlvbihhLGIpe3ZhciBzLHIscSxw
-LG8sbixtLGwsayxqLGksaCxnPWIuYgppZihnPjApcmV0dXJuIGIKcz1iLmMKaWYocz4wKXtyPWEuYgpp
-ZihyPD0wKXJldHVybiBiCmlmKGEuZ053KCkpcT1iLmUhPT1iLmYKZWxzZSBpZihhLmdXWigpKXE9IWIu
-a1goIjgwIikKZWxzZSBxPSFhLmdSZSgpfHwhYi5rWCgiNDQzIikKaWYocSl7cD1yKzEKcmV0dXJuIG5l
-dyBQLlVmKEMueEIuTmooYS5hLDAscCkrQy54Qi5HKGIuYSxnKzEpLHIscytwLGIuZCtwLGIuZStwLGIu
-ZitwLGIucitwLGEueCl9ZWxzZSByZXR1cm4gdGhpcy52cygpLm1TKGIpfW89Yi5lCmc9Yi5mCmlmKG89
-PT1nKXtzPWIucgppZihnPHMpe3I9YS5mCnA9ci1nCnJldHVybiBuZXcgUC5VZihDLnhCLk5qKGEuYSww
-LHIpK0MueEIuRyhiLmEsZyksYS5iLGEuYyxhLmQsYS5lLGcrcCxzK3AsYS54KX1nPWIuYQppZihzPGcu
-bGVuZ3RoKXtyPWEucgpyZXR1cm4gbmV3IFAuVWYoQy54Qi5OaihhLmEsMCxyKStDLnhCLkcoZyxzKSxh
-LmIsYS5jLGEuZCxhLmUsYS5mLHMrKHItcyksYS54KX1yZXR1cm4gYS5OOSgpfXM9Yi5hCmlmKEMueEIu
-UWkocywiLyIsbykpe3I9YS5lCnA9ci1vCnJldHVybiBuZXcgUC5VZihDLnhCLk5qKGEuYSwwLHIpK0Mu
-eEIuRyhzLG8pLGEuYixhLmMsYS5kLHIsZytwLGIucitwLGEueCl9bj1hLmUKbT1hLmYKaWYobj09PW0m
-JmEuYz4wKXtmb3IoO0MueEIuUWkocywiLi4vIixvKTspbys9MwpwPW4tbysxCnJldHVybiBuZXcgUC5V
-ZihDLnhCLk5qKGEuYSwwLG4pKyIvIitDLnhCLkcocyxvKSxhLmIsYS5jLGEuZCxuLGcrcCxiLnIrcCxh
-LngpfWw9YS5hCmZvcihrPW47Qy54Qi5RaShsLCIuLi8iLGspOylrKz0zCmo9MAp3aGlsZSghMCl7aT1v
-KzMKaWYoIShpPD1nJiZDLnhCLlFpKHMsIi4uLyIsbykpKWJyZWFrOysragpvPWl9Zm9yKGg9IiI7bT5r
-Oyl7LS1tCmlmKEMueEIubShsLG0pPT09NDcpe2lmKGo9PT0wKXtoPSIvIgpicmVha30tLWoKaD0iLyJ9
-fWlmKG09PT1rJiZhLmI8PTAmJiFDLnhCLlFpKGwsIi8iLG4pKXtvLT1qKjMKaD0iIn1wPW0tbytoLmxl
-bmd0aApyZXR1cm4gbmV3IFAuVWYoQy54Qi5OaihsLDAsbSkraCtDLnhCLkcocyxvKSxhLmIsYS5jLGEu
-ZCxuLGcrcCxiLnIrcCxhLngpfSwKdDQ6ZnVuY3Rpb24oKXt2YXIgcyxyLHEscD10aGlzCmlmKHAuYj49
-MCYmIXAuZ053KCkpdGhyb3cgSC5iKFAuTDQoIkNhbm5vdCBleHRyYWN0IGEgZmlsZSBwYXRoIGZyb20g
-YSAiK3AuZ0ZpKCkrIiBVUkkiKSkKcz1wLmYKcj1wLmEKaWYoczxyLmxlbmd0aCl7aWYoczxwLnIpdGhy
-b3cgSC5iKFAuTDQodS5pKSkKdGhyb3cgSC5iKFAuTDQodS5sKSl9cT0kLndRKCkKaWYoSC5vVChxKSlz
-PVAubW4ocCkKZWxzZXtpZihwLmM8cC5kKUgudihQLkw0KHUuaikpCnM9Qy54Qi5OaihyLHAuZSxzKX1y
-ZXR1cm4gc30sCmdpTzpmdW5jdGlvbihhKXt2YXIgcz10aGlzLnkKcmV0dXJuIHM9PW51bGw/dGhpcy55
-PUMueEIuZ2lPKHRoaXMuYSk6c30sCkROOmZ1bmN0aW9uKGEsYil7aWYoYj09bnVsbClyZXR1cm4hMQpp
-Zih0aGlzPT09YilyZXR1cm4hMApyZXR1cm4gdC5kRC5iKGIpJiZ0aGlzLmE9PT1iLncoMCl9LAp2czpm
-dW5jdGlvbigpe3ZhciBzPXRoaXMscj1udWxsLHE9cy5nRmkoKSxwPXMuZ2t1KCksbz1zLmM+MD9zLmdK
-ZihzKTpyLG49cy5neEEoKT9zLmd0cChzKTpyLG09cy5hLGw9cy5mLGs9Qy54Qi5OaihtLHMuZSxsKSxq
-PXMucgpsPWw8aj9zLmd0UCgpOnIKcmV0dXJuIG5ldyBQLkRuKHEscCxvLG4sayxsLGo8bS5sZW5ndGg/
-cy5nS2EoKTpyKX0sCnc6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYX0sCiRpaUQ6MX0KUC5xZS5wcm90
-b3R5cGU9e30KVy5xRS5wcm90b3R5cGU9e30KVy5HaC5wcm90b3R5cGU9ewpzTFU6ZnVuY3Rpb24oYSxi
-KXthLmhyZWY9Yn0sCnc6ZnVuY3Rpb24oYSl7cmV0dXJuIFN0cmluZyhhKX0sCiRpR2g6MX0KVy5mWS5w
-cm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3JldHVybiBTdHJpbmcoYSl9fQpXLm5CLnByb3RvdHlwZT17
-JGluQjoxfQpXLkF6LnByb3RvdHlwZT17JGlBejoxfQpXLlFQLnByb3RvdHlwZT17JGlRUDoxfQpXLm54
-LnByb3RvdHlwZT17CmdBOmZ1bmN0aW9uKGEpe3JldHVybiBhLmxlbmd0aH19Clcub0oucHJvdG90eXBl
-PXsKZ0E6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubGVuZ3RofX0KVy5pZC5wcm90b3R5cGU9e30KVy5RRi5w
-cm90b3R5cGU9e30KVy5OaC5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3JldHVybiBTdHJpbmcoYSl9
-fQpXLmFlLnByb3RvdHlwZT17CkRjOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuY3JlYXRlSFRNTERvY3Vt
-ZW50KGIpfX0KVy5JQi5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3ZhciBzLHI9YS5sZWZ0CnIudG9T
-dHJpbmcKcj0iUmVjdGFuZ2xlICgiK0guRWoocikrIiwgIgpzPWEudG9wCnMudG9TdHJpbmcKcz1yK0gu
-RWoocykrIikgIgpyPWEud2lkdGgKci50b1N0cmluZwpyPXMrSC5FaihyKSsiIHggIgpzPWEuaGVpZ2h0
-CnMudG9TdHJpbmcKcmV0dXJuIHIrSC5FaihzKX0sCkROOmZ1bmN0aW9uKGEsYil7dmFyIHMscgppZihi
-PT1udWxsKXJldHVybiExCmlmKHQucS5iKGIpKXtzPWEubGVmdApzLnRvU3RyaW5nCnI9Yi5sZWZ0CnIu
-dG9TdHJpbmcKaWYocz09PXIpe3M9YS50b3AKcy50b1N0cmluZwpyPWIudG9wCnIudG9TdHJpbmcKaWYo
-cz09PXIpe3M9YS53aWR0aApzLnRvU3RyaW5nCnI9Yi53aWR0aApyLnRvU3RyaW5nCmlmKHM9PT1yKXtz
-PWEuaGVpZ2h0CnMudG9TdHJpbmcKcj1iLmhlaWdodApyLnRvU3RyaW5nCnI9cz09PXIKcz1yfWVsc2Ug
-cz0hMX1lbHNlIHM9ITF9ZWxzZSBzPSExfWVsc2Ugcz0hMQpyZXR1cm4gc30sCmdpTzpmdW5jdGlvbihh
-KXt2YXIgcyxyLHEscD1hLmxlZnQKcC50b1N0cmluZwpwPUMuQ0QuZ2lPKHApCnM9YS50b3AKcy50b1N0
-cmluZwpzPUMuQ0QuZ2lPKHMpCnI9YS53aWR0aApyLnRvU3RyaW5nCnI9Qy5DRC5naU8ocikKcT1hLmhl
-aWdodApxLnRvU3RyaW5nCnJldHVybiBXLnJFKHAscyxyLEMuQ0QuZ2lPKHEpKX0sCiRpdG46MX0KVy5u
-Ny5wcm90b3R5cGU9ewpnQTpmdW5jdGlvbihhKXtyZXR1cm4gYS5sZW5ndGh9fQpXLnd6LnByb3RvdHlw
-ZT17CmdBOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmEubGVuZ3RofSwKcTpmdW5jdGlvbihhLGIpe3Zh
-ciBzCkgudVAoYikKcz10aGlzLmEKaWYoYjwwfHxiPj1zLmxlbmd0aClyZXR1cm4gSC5PSChzLGIpCnJl
-dHVybiB0aGlzLiR0aS5jLmEoc1tiXSl9LApZOmZ1bmN0aW9uKGEsYixjKXt0aGlzLiR0aS5jLmEoYykK
-dGhyb3cgSC5iKFAuTDQoIkNhbm5vdCBtb2RpZnkgbGlzdCIpKX19ClcuY3YucHJvdG90eXBlPXsKZ1Fn
-OmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgVy5pNyhhKX0sCmdEOmZ1bmN0aW9uKGEpe3JldHVybiBuZXcg
-Vy5JNChhKX0sCnNEOmZ1bmN0aW9uKGEsYil7dmFyIHMKdC5RLmEoYikKcz10aGlzLmdEKGEpCnMuVjEo
-MCkKcy5GVigwLGIpfSwKdzpmdW5jdGlvbihhKXtyZXR1cm4gYS5sb2NhbE5hbWV9LApGRjpmdW5jdGlv
-bihhKXt2YXIgcz0hIWEuc2Nyb2xsSW50b1ZpZXdJZk5lZWRlZAppZihzKWEuc2Nyb2xsSW50b1ZpZXdJ
-Zk5lZWRlZCgpCmVsc2UgYS5zY3JvbGxJbnRvVmlldygpfSwKbno6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2
-YXIgcyxyPXRoaXMucjYoYSxjLGQsZSkKc3dpdGNoKGIudG9Mb3dlckNhc2UoKSl7Y2FzZSJiZWZvcmVi
-ZWdpbiI6cz1hLnBhcmVudE5vZGUKcy50b1N0cmluZwpKLkVoKHMscixhKQpicmVhawpjYXNlImFmdGVy
-YmVnaW4iOnM9YS5jaGlsZE5vZGVzCnRoaXMubUsoYSxyLHMubGVuZ3RoPjA/c1swXTpudWxsKQpicmVh
-awpjYXNlImJlZm9yZWVuZCI6YS5hcHBlbmRDaGlsZChyKQpicmVhawpjYXNlImFmdGVyZW5kIjpzPWEu
-cGFyZW50Tm9kZQpzLnRvU3RyaW5nCkouRWgocyxyLGEubmV4dFNpYmxpbmcpCmJyZWFrCmRlZmF1bHQ6
-SC52KFAueFkoIkludmFsaWQgcG9zaXRpb24gIitiKSl9fSwKcjY6ZnVuY3Rpb24oYSxiLGMsZCl7dmFy
-IHMscixxLHAKaWYoYz09bnVsbCl7aWYoZD09bnVsbCl7cz0kLmx0CmlmKHM9PW51bGwpe3M9SC5WTShb
-XSx0LnYpCnI9bmV3IFcudkQocykKQy5ObS5pKHMsVy5UdyhudWxsKSkKQy5ObS5pKHMsVy5CbCgpKQok
-Lmx0PXIKZD1yfWVsc2UgZD1zfXM9JC5FVQppZihzPT1udWxsKXtzPW5ldyBXLktvKGQpCiQuRVU9cwpj
-PXN9ZWxzZXtzLmE9ZApjPXN9fWVsc2UgaWYoZCE9bnVsbCl0aHJvdyBILmIoUC54WSgidmFsaWRhdG9y
-IGNhbiBvbmx5IGJlIHBhc3NlZCBpZiB0cmVlU2FuaXRpemVyIGlzIG51bGwiKSkKaWYoJC54bz09bnVs
-bCl7cz1kb2N1bWVudApyPXMuaW1wbGVtZW50YXRpb24Kci50b1N0cmluZwpyPUMubUguRGMociwiIikK
-JC54bz1yCiQuQk89ci5jcmVhdGVSYW5nZSgpCnI9JC54by5jcmVhdGVFbGVtZW50KCJiYXNlIikKdC5j
-Ui5hKHIpCnM9cy5iYXNlVVJJCnMudG9TdHJpbmcKci5ocmVmPXMKJC54by5oZWFkLmFwcGVuZENoaWxk
-KHIpfXM9JC54bwppZihzLmJvZHk9PW51bGwpe3I9cy5jcmVhdGVFbGVtZW50KCJib2R5IikKQy5CWi5z
-WEcocyx0LnAuYShyKSl9cz0kLnhvCmlmKHQucC5iKGEpKXtzPXMuYm9keQpzLnRvU3RyaW5nCnE9c31l
-bHNle3MudG9TdHJpbmcKcT1zLmNyZWF0ZUVsZW1lbnQoYS50YWdOYW1lKQokLnhvLmJvZHkuYXBwZW5k
-Q2hpbGQocSl9aWYoImNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudCIgaW4gd2luZG93LlJhbmdlLnByb3Rv
-dHlwZSYmIUMuTm0udGcoQy5TcSxhLnRhZ05hbWUpKXskLkJPLnNlbGVjdE5vZGVDb250ZW50cyhxKQpz
-PSQuQk8Kcy50b1N0cmluZwpwPXMuY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50KGI9PW51bGw/Im51bGwi
-OmIpfWVsc2V7Si53ZihxLGIpCnA9JC54by5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCkKZm9yKDtzPXEu
-Zmlyc3RDaGlsZCxzIT1udWxsOylwLmFwcGVuZENoaWxkKHMpfWlmKHEhPT0kLnhvLmJvZHkpSi5MdChx
-KQpjLlBuKHApCmRvY3VtZW50LmFkb3B0Tm9kZShwKQpyZXR1cm4gcH0sCkFIOmZ1bmN0aW9uKGEsYixj
-KXtyZXR1cm4gdGhpcy5yNihhLGIsYyxudWxsKX0sCnNoZjpmdW5jdGlvbihhLGIpe3RoaXMuWUMoYSxi
-KX0sCnBrOmZ1bmN0aW9uKGEsYixjKXt0aGlzLnNhNChhLG51bGwpCmEuYXBwZW5kQ2hpbGQodGhpcy5y
-NihhLGIsbnVsbCxjKSl9LApZQzpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLnBrKGEsYixudWxsKX0s
-CnNSTjpmdW5jdGlvbihhLGIpe2EuaW5uZXJIVE1MPWJ9LApnbnM6ZnVuY3Rpb24oYSl7cmV0dXJuIGEu
-dGFnTmFtZX0sCmdWbDpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFcuZXUoYSwiY2xpY2siLCExLHQuayl9
-LAokaWN2OjF9ClcuQ3YucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIHQuaC5iKHQuQS5h
-KGEpKX0sCiRTOjI2fQpXLmVhLnByb3RvdHlwZT17JGllYToxfQpXLkQwLnByb3RvdHlwZT17Ck9uOmZ1
-bmN0aW9uKGEsYixjLGQpe3QuYncuYShjKQppZihjIT1udWxsKXRoaXMudihhLGIsYyxkKX0sCkI6ZnVu
-Y3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLk9uKGEsYixjLG51bGwpfSwKdjpmdW5jdGlvbihhLGIsYyxk
-KXtyZXR1cm4gYS5hZGRFdmVudExpc3RlbmVyKGIsSC50Uih0LmJ3LmEoYyksMSksZCl9LAokaUQwOjF9
-ClcuaEgucHJvdG90eXBlPXskaWhIOjF9ClcuaDQucHJvdG90eXBlPXsKZ0E6ZnVuY3Rpb24oYSl7cmV0
-dXJuIGEubGVuZ3RofX0KVy5ici5wcm90b3R5cGU9ewpnQTpmdW5jdGlvbihhKXtyZXR1cm4gYS5sZW5n
-dGh9fQpXLlZiLnByb3RvdHlwZT17CnNYRzpmdW5jdGlvbihhLGIpe2EuYm9keT1ifX0KVy5mSi5wcm90
-b3R5cGU9ewplbzpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gYS5vcGVuKGIsYywhMCl9LAokaWZKOjF9
-Clcud2EucHJvdG90eXBlPXt9ClcuU2cucHJvdG90eXBlPXskaVNnOjF9ClcudTgucHJvdG90eXBlPXsK
-Z0RyOmZ1bmN0aW9uKGEpe2lmKCJvcmlnaW4iIGluIGEpcmV0dXJuIGEub3JpZ2luCnJldHVybiBILkVq
-KGEucHJvdG9jb2wpKyIvLyIrSC5FaihhLmhvc3QpfSwKdzpmdW5jdGlvbihhKXtyZXR1cm4gU3RyaW5n
-KGEpfSwKJGl1ODoxfQpXLkFqLnByb3RvdHlwZT17JGlBajoxfQpXLmU3LnByb3RvdHlwZT17CmdyODpm
-dW5jdGlvbihhKXt2YXIgcz10aGlzLmEscj1zLmNoaWxkTm9kZXMubGVuZ3RoCmlmKHI9PT0wKXRocm93
-IEguYihQLlBWKCJObyBlbGVtZW50cyIpKQppZihyPjEpdGhyb3cgSC5iKFAuUFYoIk1vcmUgdGhhbiBv
-bmUgZWxlbWVudCIpKQpzPXMuZmlyc3RDaGlsZApzLnRvU3RyaW5nCnJldHVybiBzfSwKRlY6ZnVuY3Rp
-b24oYSxiKXt2YXIgcyxyLHEscCxvCnQuZWguYShiKQppZihiIGluc3RhbmNlb2YgVy5lNyl7cz1iLmEK
-cj10aGlzLmEKaWYocyE9PXIpZm9yKHE9cy5jaGlsZE5vZGVzLmxlbmd0aCxwPTA7cDxxOysrcCl7bz1z
-LmZpcnN0Q2hpbGQKby50b1N0cmluZwpyLmFwcGVuZENoaWxkKG8pfXJldHVybn1mb3Iocz1iLmdreihi
-KSxyPXRoaXMuYTtzLkYoKTspci5hcHBlbmRDaGlsZChzLmdsKCkpfSwKWTpmdW5jdGlvbihhLGIsYyl7
-dmFyIHMscgp0LkEuYShjKQpzPXRoaXMuYQpyPXMuY2hpbGROb2RlcwppZihiPDB8fGI+PXIubGVuZ3Ro
-KXJldHVybiBILk9IKHIsYikKcy5yZXBsYWNlQ2hpbGQoYyxyW2JdKX0sCmdrejpmdW5jdGlvbihhKXt2
-YXIgcz10aGlzLmEuY2hpbGROb2RlcwpyZXR1cm4gbmV3IFcuVzkocyxzLmxlbmd0aCxILnoocykuQygi
-Vzk8R20uRT4iKSl9LApnQTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hLmNoaWxkTm9kZXMubGVuZ3Ro
-fSwKcTpmdW5jdGlvbihhLGIpe3ZhciBzCkgudVAoYikKcz10aGlzLmEuY2hpbGROb2RlcwppZihiPDB8
-fGI+PXMubGVuZ3RoKXJldHVybiBILk9IKHMsYikKcmV0dXJuIHNbYl19fQpXLnVILnByb3RvdHlwZT17
-CndnOmZ1bmN0aW9uKGEpe3ZhciBzPWEucGFyZW50Tm9kZQppZihzIT1udWxsKXMucmVtb3ZlQ2hpbGQo
-YSl9LApENDpmdW5jdGlvbihhKXt2YXIgcwpmb3IoO3M9YS5maXJzdENoaWxkLHMhPW51bGw7KWEucmVt
-b3ZlQ2hpbGQocyl9LAp3OmZ1bmN0aW9uKGEpe3ZhciBzPWEubm9kZVZhbHVlCnJldHVybiBzPT1udWxs
-P3RoaXMuVShhKTpzfSwKc2E0OmZ1bmN0aW9uKGEsYil7YS50ZXh0Q29udGVudD1ifSwKbUs6ZnVuY3Rp
-b24oYSxiLGMpe3JldHVybiBhLmluc2VydEJlZm9yZShiLGMpfSwKJGl1SDoxfQpXLkJILnByb3RvdHlw
-ZT17CmdBOmZ1bmN0aW9uKGEpe3JldHVybiBhLmxlbmd0aH0sCnE6ZnVuY3Rpb24oYSxiKXtILnVQKGIp
-CmlmKGI+Pj4wIT09Ynx8Yj49YS5sZW5ndGgpdGhyb3cgSC5iKFAuQ2YoYixhLG51bGwsbnVsbCxudWxs
-KSkKcmV0dXJuIGFbYl19LApZOmZ1bmN0aW9uKGEsYixjKXt0LkEuYShjKQp0aHJvdyBILmIoUC5MNCgi
-Q2Fubm90IGFzc2lnbiBlbGVtZW50IG9mIGltbXV0YWJsZSBMaXN0LiIpKX0sCmd0SDpmdW5jdGlvbihh
-KXtpZihhLmxlbmd0aD4wKXJldHVybiBhWzBdCnRocm93IEguYihQLlBWKCJObyBlbGVtZW50cyIpKX0s
-CkU6ZnVuY3Rpb24oYSxiKXtpZihiPDB8fGI+PWEubGVuZ3RoKXJldHVybiBILk9IKGEsYikKcmV0dXJu
-IGFbYl19LAokaWJROjEsCiRpWGo6MSwKJGljWDoxLAokaXpNOjF9ClcuU04ucHJvdG90eXBlPXt9Clcu
-ZXcucHJvdG90eXBlPXskaWV3OjF9ClcubHAucHJvdG90eXBlPXsKZ0E6ZnVuY3Rpb24oYSl7cmV0dXJu
-IGEubGVuZ3RofX0KVy5UYi5wcm90b3R5cGU9ewpyNjpmdW5jdGlvbihhLGIsYyxkKXt2YXIgcyxyCmlm
-KCJjcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQiIGluIHdpbmRvdy5SYW5nZS5wcm90b3R5cGUpcmV0dXJu
-IHRoaXMuRFcoYSxiLGMsZCkKcz1XLlU5KCI8dGFibGU+IitILkVqKGIpKyI8L3RhYmxlPiIsYyxkKQpy
-PWRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKQpyLnRvU3RyaW5nCnMudG9TdHJpbmcKbmV3
-IFcuZTcocikuRlYoMCxuZXcgVy5lNyhzKSkKcmV0dXJuIHJ9fQpXLkl2LnByb3RvdHlwZT17CnI2OmZ1
-bmN0aW9uKGEsYixjLGQpe3ZhciBzLHIscSxwCmlmKCJjcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQiIGlu
-IHdpbmRvdy5SYW5nZS5wcm90b3R5cGUpcmV0dXJuIHRoaXMuRFcoYSxiLGMsZCkKcz1kb2N1bWVudApy
-PXMuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpCnM9Qy5JZS5yNihzLmNyZWF0ZUVsZW1lbnQoInRhYmxl
-IiksYixjLGQpCnMudG9TdHJpbmcKcz1uZXcgVy5lNyhzKQpxPXMuZ3I4KHMpCnEudG9TdHJpbmcKcz1u
-ZXcgVy5lNyhxKQpwPXMuZ3I4KHMpCnIudG9TdHJpbmcKcC50b1N0cmluZwpuZXcgVy5lNyhyKS5GVigw
-LG5ldyBXLmU3KHApKQpyZXR1cm4gcn19ClcuV1AucHJvdG90eXBlPXsKcjY6ZnVuY3Rpb24oYSxiLGMs
-ZCl7dmFyIHMscixxCmlmKCJjcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQiIGluIHdpbmRvdy5SYW5nZS5w
+QUFBQUFBQUFBQUFBQUFBQUFBQUZGRkZGRkZGRkZGRkZGRkZHR0dHR0dHR0dHR0dHR0dHSEhISEhISEhI
+SEhISEhISEhISEhISEhISEhISUhISEpFRUJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQktDQ0ND
+Q0NDQ0NDQ0NEQ0xPTk5OTUVFRUVFRUVFRUVFIixzKSYzMQpoPWk8PTMyP3MmNjE2OTQ+Pj5xOihzJjYz
+fGg8PDYpPj4+MAppPUMueEIuVygiIFx4MDAwOlhFQ0NDQ0NOOmxEYiBceDAwMDpYRUNDQ0NDTnZsRGIg
+XHgwMDA6WEVDQ0NDQ046bERiIEFBQUFBXHgwMFx4MDBceDAwXHgwMFx4MDBBQUFBQTAwMDAwQUFBQUE6
+Ojo6OkFBQUFBR0cwMDBBQUFBQTAwS0tLQUFBQUFHOjo6OkFBQUFBOklJSUlBQUFBQTAwMFx4ODAwQUFB
+QUFceDAwXHgwMFx4MDBceDAwIEFBQUFBIixpK3EpCmlmKGk9PT0wKXtnLmErPUguTHcoaCkKaWYoZj09
+PWMpYnJlYWsgJGxhYmVsMCQwCmJyZWFrfWVsc2UgaWYoKGkmMSkhPT0wKXtpZihyKXN3aXRjaChpKXtj
+YXNlIDY5OmNhc2UgNjc6Zy5hKz1ILkx3KGopCmJyZWFrCmNhc2UgNjU6Zy5hKz1ILkx3KGopOy0tZgpi
+cmVhawpkZWZhdWx0OnA9Zy5hKz1ILkx3KGopCmcuYT1wK0guTHcoaikKYnJlYWt9ZWxzZXtrLmI9aQpr
+LmM9Zi0xCnJldHVybiIifWk9MH1pZihmPT09YylicmVhayAkbGFiZWwwJDAKbz1mKzEKaWYoZjwwfHxm
+Pj1lKXJldHVybiBILk9IKGEsZikKcz1hW2ZdfW89ZisxCmlmKGY8MHx8Zj49ZSlyZXR1cm4gSC5PSChh
+LGYpCnM9YVtmXQppZihzPDEyOCl7d2hpbGUoITApe2lmKCEobzxjKSl7bj1jCmJyZWFrfW09bysxCmlm
+KG88MHx8bz49ZSlyZXR1cm4gSC5PSChhLG8pCnM9YVtvXQppZihzPj0xMjgpe249bS0xCm89bQpicmVh
+a31vPW19aWYobi1mPDIwKWZvcihsPWY7bDxuOysrbCl7aWYobD49ZSlyZXR1cm4gSC5PSChhLGwpCmcu
+YSs9SC5MdyhhW2xdKX1lbHNlIGcuYSs9UC5ITShhLGYsbikKaWYobj09PWMpYnJlYWsgJGxhYmVsMCQw
+CmY9b31lbHNlIGY9b31pZihkJiZpPjMyKWlmKHIpZy5hKz1ILkx3KGopCmVsc2V7ay5iPTc3CmsuYz1j
+CnJldHVybiIifWsuYj1pCmsuYz1oCmU9Zy5hCnJldHVybiBlLmNoYXJDb2RlQXQoMCk9PTA/ZTplfX0K
+UC5XRi5wcm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe3ZhciBzLHIscQp0LmZvLmEoYSkKcz10aGlz
+LmIKcj10aGlzLmEKcy5hKz1yLmEKcT1zLmErPUguRWooYS5hKQpzLmE9cSsiOiAiCnMuYSs9UC5obChi
+KQpyLmE9IiwgIn0sCiRTOjQzfQpQLmlQLnByb3RvdHlwZT17CkROOmZ1bmN0aW9uKGEsYil7aWYoYj09
+bnVsbClyZXR1cm4hMQpyZXR1cm4gYiBpbnN0YW5jZW9mIFAuaVAmJnRoaXMuYT09PWIuYSYmITB9LApn
+aU86ZnVuY3Rpb24oYSl7dmFyIHM9dGhpcy5hCnJldHVybihzXkMuam4ud0cocywzMCkpJjEwNzM3NDE4
+MjN9LAp3OmZ1bmN0aW9uKGEpe3ZhciBzPXRoaXMscj1QLkdxKEgudEoocykpLHE9UC5oMChILk5TKHMp
+KSxwPVAuaDAoSC5qQShzKSksbz1QLmgwKEguSVgocykpLG49UC5oMChILmNoKHMpKSxtPVAuaDAoSC5K
+ZChzKSksbD1QLlZ4KEgubzEocykpLGs9cisiLSIrcSsiLSIrcCsiICIrbysiOiIrbisiOiIrbSsiLiIr
+bApyZXR1cm4ga319ClAuWFMucHJvdG90eXBlPXsKZ0lJOmZ1bmN0aW9uKCl7cmV0dXJuIEgudHModGhp
+cy4kdGhyb3duSnNFcnJvcil9fQpQLkM2LnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7dmFyIHM9dGhp
+cy5hCmlmKHMhPW51bGwpcmV0dXJuIkFzc2VydGlvbiBmYWlsZWQ6ICIrUC5obChzKQpyZXR1cm4iQXNz
+ZXJ0aW9uIGZhaWxlZCJ9fQpQLkV6LnByb3RvdHlwZT17fQpQLkYucHJvdG90eXBlPXsKdzpmdW5jdGlv
+bihhKXtyZXR1cm4iVGhyb3cgb2YgbnVsbC4ifX0KUC51LnByb3RvdHlwZT17CmdaOmZ1bmN0aW9uKCl7
+cmV0dXJuIkludmFsaWQgYXJndW1lbnQiKyghdGhpcy5hPyIocykiOiIiKX0sCmd1OmZ1bmN0aW9uKCl7
+cmV0dXJuIiJ9LAp3OmZ1bmN0aW9uKGEpe3ZhciBzLHIscT10aGlzLHA9cS5jLG89cD09bnVsbD8iIjoi
+ICgiK3ArIikiLG49cS5kLG09bj09bnVsbD8iIjoiOiAiK0guRWoobiksbD1xLmdaKCkrbyttCmlmKCFx
+LmEpcmV0dXJuIGwKcz1xLmd1KCkKcj1QLmhsKHEuYikKcmV0dXJuIGwrcysiOiAiK3J9fQpQLmJKLnBy
+b3RvdHlwZT17CmdaOmZ1bmN0aW9uKCl7cmV0dXJuIlJhbmdlRXJyb3IifSwKZ3U6ZnVuY3Rpb24oKXt2
+YXIgcyxyPXRoaXMuZSxxPXRoaXMuZgppZihyPT1udWxsKXM9cSE9bnVsbD8iOiBOb3QgbGVzcyB0aGFu
+IG9yIGVxdWFsIHRvICIrSC5FaihxKToiIgplbHNlIGlmKHE9PW51bGwpcz0iOiBOb3QgZ3JlYXRlciB0
+aGFuIG9yIGVxdWFsIHRvICIrSC5FaihyKQplbHNlIGlmKHE+cilzPSI6IE5vdCBpbiBpbmNsdXNpdmUg
+cmFuZ2UgIitILkVqKHIpKyIuLiIrSC5FaihxKQplbHNlIHM9cTxyPyI6IFZhbGlkIHZhbHVlIHJhbmdl
+IGlzIGVtcHR5IjoiOiBPbmx5IHZhbGlkIHZhbHVlIGlzICIrSC5FaihyKQpyZXR1cm4gc319ClAuZVku
+cHJvdG90eXBlPXsKZ1o6ZnVuY3Rpb24oKXtyZXR1cm4iUmFuZ2VFcnJvciJ9LApndTpmdW5jdGlvbigp
+e3ZhciBzLHI9SC51UCh0aGlzLmIpCmlmKHR5cGVvZiByIT09Im51bWJlciIpcmV0dXJuIHIuSigpCmlm
+KHI8MClyZXR1cm4iOiBpbmRleCBtdXN0IG5vdCBiZSBuZWdhdGl2ZSIKcz10aGlzLmYKaWYocz09PTAp
+cmV0dXJuIjogbm8gaW5kaWNlcyBhcmUgdmFsaWQiCnJldHVybiI6IGluZGV4IHNob3VsZCBiZSBsZXNz
+IHRoYW4gIitILkVqKHMpfSwKZ0E6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZn19ClAubXAucHJvdG90
+eXBlPXsKdzpmdW5jdGlvbihhKXt2YXIgcyxyLHEscCxvLG4sbSxsLGs9dGhpcyxqPXt9LGk9bmV3IFAu
+Um4oIiIpCmouYT0iIgpzPWsuYwpmb3Iocj1zLmxlbmd0aCxxPTAscD0iIixvPSIiO3E8cjsrK3Esbz0i
+LCAiKXtuPXNbcV0KaS5hPXArbwpwPWkuYSs9UC5obChuKQpqLmE9IiwgIn1rLmQuSygwLG5ldyBQLldG
+KGosaSkpCm09UC5obChrLmEpCmw9aS53KDApCnI9Ik5vU3VjaE1ldGhvZEVycm9yOiBtZXRob2Qgbm90
+IGZvdW5kOiAnIitILkVqKGsuYi5hKSsiJ1xuUmVjZWl2ZXI6ICIrbSsiXG5Bcmd1bWVudHM6IFsiK2wr
+Il0iCnJldHVybiByfX0KUC51Yi5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3JldHVybiJVbnN1cHBv
+cnRlZCBvcGVyYXRpb246ICIrdGhpcy5hfX0KUC5kcy5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3Zh
+ciBzPXRoaXMuYQpyZXR1cm4gcyE9bnVsbD8iVW5pbXBsZW1lbnRlZEVycm9yOiAiK3M6IlVuaW1wbGVt
+ZW50ZWRFcnJvciJ9fQpQLmxqLnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7cmV0dXJuIkJhZCBzdGF0
+ZTogIit0aGlzLmF9fQpQLlVWLnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7dmFyIHM9dGhpcy5hCmlm
+KHM9PW51bGwpcmV0dXJuIkNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uIGR1cmluZyBpdGVyYXRpb24uIgpy
+ZXR1cm4iQ29uY3VycmVudCBtb2RpZmljYXRpb24gZHVyaW5nIGl0ZXJhdGlvbjogIitQLmhsKHMpKyIu
+In19ClAuazUucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXtyZXR1cm4iT3V0IG9mIE1lbW9yeSJ9LApn
+SUk6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbH0sCiRpWFM6MX0KUC5LWS5wcm90b3R5cGU9ewp3OmZ1bmN0
+aW9uKGEpe3JldHVybiJTdGFjayBPdmVyZmxvdyJ9LApnSUk6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbH0s
+CiRpWFM6MX0KUC5wLnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7dmFyIHM9dGhpcy5hCnJldHVybiBz
+PT1udWxsPyJSZWFkaW5nIHN0YXRpYyB2YXJpYWJsZSBkdXJpbmcgaXRzIGluaXRpYWxpemF0aW9uIjoi
+UmVhZGluZyBzdGF0aWMgdmFyaWFibGUgJyIrcysiJyBkdXJpbmcgaXRzIGluaXRpYWxpemF0aW9uIn19
+ClAuQ0QucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXtyZXR1cm4iRXhjZXB0aW9uOiAiK3RoaXMuYX0s
+CiRpUno6MX0KUC5hRS5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3ZhciBzLHIscSxwLG8sbixtLGws
+ayxqLGksaCxnPXRoaXMuYSxmPWchPW51bGwmJiIiIT09Zz8iRm9ybWF0RXhjZXB0aW9uOiAiK0guRWoo
+Zyk6IkZvcm1hdEV4Y2VwdGlvbiIsZT10aGlzLmMsZD10aGlzLmIKaWYodHlwZW9mIGQ9PSJzdHJpbmci
+KXtpZihlIT1udWxsKXM9ZTwwfHxlPmQubGVuZ3RoCmVsc2Ugcz0hMQppZihzKWU9bnVsbAppZihlPT1u
+dWxsKXtpZihkLmxlbmd0aD43OClkPUMueEIuTmooZCwwLDc1KSsiLi4uIgpyZXR1cm4gZisiXG4iK2R9
+Zm9yKHI9MSxxPTAscD0hMSxvPTA7bzxlOysrbyl7bj1DLnhCLlcoZCxvKQppZihuPT09MTApe2lmKHEh
+PT1vfHwhcCkrK3IKcT1vKzEKcD0hMX1lbHNlIGlmKG49PT0xMyl7KytyCnE9bysxCnA9ITB9fWY9cj4x
+P2YrKCIgKGF0IGxpbmUgIityKyIsIGNoYXJhY3RlciAiKyhlLXErMSkrIilcbiIpOmYrKCIgKGF0IGNo
+YXJhY3RlciAiKyhlKzEpKyIpXG4iKQptPWQubGVuZ3RoCmZvcihvPWU7bzxtOysrbyl7bj1DLnhCLk8y
+KGQsbykKaWYobj09PTEwfHxuPT09MTMpe209bwpicmVha319aWYobS1xPjc4KWlmKGUtcTw3NSl7bD1x
+Kzc1Cms9cQpqPSIiCmk9Ii4uLiJ9ZWxzZXtpZihtLWU8NzUpe2s9bS03NQpsPW0KaT0iIn1lbHNle2s9
+ZS0zNgpsPWUrMzYKaT0iLi4uIn1qPSIuLi4ifWVsc2V7bD1tCms9cQpqPSIiCmk9IiJ9aD1DLnhCLk5q
+KGQsayxsKQpyZXR1cm4gZitqK2graSsiXG4iK0MueEIuSXgoIiAiLGUtaytqLmxlbmd0aCkrIl5cbiJ9
+ZWxzZSByZXR1cm4gZSE9bnVsbD9mKygiIChhdCBvZmZzZXQgIitILkVqKGUpKyIpIik6Zn0sCiRpUno6
+MX0KUC5jWC5wcm90b3R5cGU9ewpkcjpmdW5jdGlvbihhLGIpe3JldHVybiBILkdKKHRoaXMsSC5MaCh0
+aGlzKS5DKCJjWC5FIiksYil9LApFMjpmdW5jdGlvbihhLGIsYyl7dmFyIHM9SC5MaCh0aGlzKQpyZXR1
+cm4gSC5LMSh0aGlzLHMuS3EoYykuQygiMShjWC5FKSIpLmEoYikscy5DKCJjWC5FIiksYyl9LApldjpm
+dW5jdGlvbihhLGIpe3ZhciBzPUguTGgodGhpcykKcmV0dXJuIG5ldyBILlU1KHRoaXMscy5DKCJhMihj
+WC5FKSIpLmEoYikscy5DKCJVNTxjWC5FPiIpKX0sCnR0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIFAuQ0go
+dGhpcyxiLEguTGgodGhpcykuQygiY1guRSIpKX0sCmJyOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnR0
+KGEsITApfSwKZ0E6ZnVuY3Rpb24oYSl7dmFyIHMscj10aGlzLmdtKHRoaXMpCmZvcihzPTA7ci5GKCk7
+KSsrcwpyZXR1cm4gc30sCmdsMDpmdW5jdGlvbihhKXtyZXR1cm4hdGhpcy5nbSh0aGlzKS5GKCl9LApn
+b3I6ZnVuY3Rpb24oYSl7cmV0dXJuIXRoaXMuZ2wwKHRoaXMpfSwKZVI6ZnVuY3Rpb24oYSxiKXtyZXR1
+cm4gSC5iSyh0aGlzLGIsSC5MaCh0aGlzKS5DKCJjWC5FIikpfSwKZ3I4OmZ1bmN0aW9uKGEpe3ZhciBz
+LHI9dGhpcy5nbSh0aGlzKQppZighci5GKCkpdGhyb3cgSC5iKEguV3AoKSkKcz1yLmdsKCkKaWYoci5G
+KCkpdGhyb3cgSC5iKEguQW0oKSkKcmV0dXJuIHN9LApFOmZ1bmN0aW9uKGEsYil7dmFyIHMscixxClAu
+azEoYiwiaW5kZXgiKQpmb3Iocz10aGlzLmdtKHRoaXMpLHI9MDtzLkYoKTspe3E9cy5nbCgpCmlmKGI9
+PT1yKXJldHVybiBxOysrcn10aHJvdyBILmIoUC5DZihiLHRoaXMsImluZGV4IixudWxsLHIpKX0sCnc6
+ZnVuY3Rpb24oYSl7cmV0dXJuIFAuRVAodGhpcywiKCIsIikiKX19ClAuQW4ucHJvdG90eXBlPXt9ClAu
+TjMucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXtyZXR1cm4iTWFwRW50cnkoIitILkVqKEouaih0aGlz
+LmEpKSsiOiAiK0guRWooSi5qKHRoaXMuYikpKyIpIn19ClAuYzgucHJvdG90eXBlPXsKZ2lPOmZ1bmN0
+aW9uKGEpe3JldHVybiBQLk1oLnByb3RvdHlwZS5naU8uY2FsbChDLmpOLHRoaXMpfSwKdzpmdW5jdGlv
+bihhKXtyZXR1cm4ibnVsbCJ9fQpQLk1oLnByb3RvdHlwZT17Y29uc3RydWN0b3I6UC5NaCwkaU1oOjEs
+CkROOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXM9PT1ifSwKZ2lPOmZ1bmN0aW9uKGEpe3JldHVybiBI
+LmVRKHRoaXMpfSwKdzpmdW5jdGlvbihhKXtyZXR1cm4iSW5zdGFuY2Ugb2YgJyIrSC5FaihILk0odGhp
+cykpKyInIn0sCmU3OmZ1bmN0aW9uKGEsYil7dC5vLmEoYikKdGhyb3cgSC5iKFAubHIodGhpcyxiLmdX
+YSgpLGIuZ25kKCksYi5nVm0oKSkpfSwKdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy53KHRo
+aXMpfX0KUC5aZC5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3JldHVybiIifSwKJGlHejoxfQpQLlJu
+LnByb3RvdHlwZT17CmdBOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmEubGVuZ3RofSwKdzpmdW5jdGlv
+bihhKXt2YXIgcz10aGlzLmEKcmV0dXJuIHMuY2hhckNvZGVBdCgwKT09MD9zOnN9LAokaUJMOjF9ClAu
+bjEucHJvdG90eXBlPXsKJDI6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyLHEscAp0LkouYShhKQpILmgoYikK
+cz1KLnJZKGIpLk9ZKGIsIj0iKQppZihzPT09LTEpe2lmKGIhPT0iIilhLlkoMCxQLmt1KGIsMCxiLmxl
+bmd0aCx0aGlzLmEsITApLCIiKX1lbHNlIGlmKHMhPT0wKXtyPUMueEIuTmooYiwwLHMpCnE9Qy54Qi5H
+KGIscysxKQpwPXRoaXMuYQphLlkoMCxQLmt1KHIsMCxyLmxlbmd0aCxwLCEwKSxQLmt1KHEsMCxxLmxl
+bmd0aCxwLCEwKSl9cmV0dXJuIGF9LAokUzo0NX0KUC5jUy5wcm90b3R5cGU9ewokMjpmdW5jdGlvbihh
+LGIpe3Rocm93IEguYihQLnJyKCJJbGxlZ2FsIElQdjQgYWRkcmVzcywgIithLHRoaXMuYSxiKSl9LAok
+UzoyMX0KUC5WQy5wcm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe3Rocm93IEguYihQLnJyKCJJbGxl
+Z2FsIElQdjYgYWRkcmVzcywgIithLHRoaXMuYSxiKSl9LAokMTpmdW5jdGlvbihhKXtyZXR1cm4gdGhp
+cy4kMihhLG51bGwpfSwKJFM6NTB9ClAuSlQucHJvdG90eXBlPXsKJDI6ZnVuY3Rpb24oYSxiKXt2YXIg
+cwppZihiLWE+NCl0aGlzLmEuJDIoImFuIElQdjYgcGFydCBjYW4gb25seSBjb250YWluIGEgbWF4aW11
+bSBvZiA0IGhleCBkaWdpdHMiLGEpCnM9UC5RQShDLnhCLk5qKHRoaXMuYixhLGIpLDE2KQppZihzPDB8
+fHM+NjU1MzUpdGhpcy5hLiQyKCJlYWNoIHBhcnQgbXVzdCBiZSBpbiB0aGUgcmFuZ2Ugb2YgYDB4MC4u
+MHhGRkZGYCIsYSkKcmV0dXJuIHN9LAokUzo1Mn0KUC5Ebi5wcm90b3R5cGU9ewpnbkQ6ZnVuY3Rpb24o
+KXt2YXIgcyxyLHEscCxvPXRoaXMKaWYoIW8ueSl7cz1vLmEKcj1zLmxlbmd0aCE9PTA/cysiOiI6IiIK
+cT1vLmMKcD1xPT1udWxsCmlmKCFwfHxzPT09ImZpbGUiKXtzPXIrIi8vIgpyPW8uYgppZihyLmxlbmd0
+aCE9PTApcz1zK3IrIkAiCmlmKCFwKXMrPXEKcj1vLmQKaWYociE9bnVsbClzPXMrIjoiK0guRWoocil9
+ZWxzZSBzPXIKcys9by5lCnI9by5mCmlmKHIhPW51bGwpcz1zKyI/IityCnI9by5yCmlmKHIhPW51bGwp
+cz1zKyIjIityCmlmKG8ueSl0aHJvdyBILmIoSC5jKCJGaWVsZCAnX3RleHQnIGhhcyBiZWVuIGFzc2ln
+bmVkIGR1cmluZyBpbml0aWFsaXphdGlvbi4iKSkKby54PXMuY2hhckNvZGVBdCgwKT09MD9zOnMKby55
+PSEwfXJldHVybiBvLnh9LApnRmo6ZnVuY3Rpb24oKXt2YXIgcyxyLHE9dGhpcwppZighcS5RKXtzPXEu
+ZQppZihzLmxlbmd0aCE9PTAmJkMueEIuVyhzLDApPT09NDcpcz1DLnhCLkcocywxKQpyPXMubGVuZ3Ro
+PT09MD9DLnhEOlAuQUYobmV3IEgubEooSC5WTShzLnNwbGl0KCIvIiksdC5zKSx0LmRPLmEoUC5QSCgp
+KSx0LmRvKSx0Lk4pCmlmKHEuUSl0aHJvdyBILmIoSC5jKCJGaWVsZCAncGF0aFNlZ21lbnRzJyBoYXMg
+YmVlbiBhc3NpZ25lZCBkdXJpbmcgaW5pdGlhbGl6YXRpb24uIikpCnEuc0twKHIpCnEuUT0hMH1yZXR1
+cm4gcS56fSwKZ2lPOmZ1bmN0aW9uKGEpe3ZhciBzLHI9dGhpcwppZighci5jeCl7cz1KLmhmKHIuZ25E
+KCkpCmlmKHIuY3gpdGhyb3cgSC5iKEguYygiRmllbGQgJ2hhc2hDb2RlJyBoYXMgYmVlbiBhc3NpZ25l
+ZCBkdXJpbmcgaW5pdGlhbGl6YXRpb24uIikpCnIuY2g9cwpyLmN4PSEwfXJldHVybiByLmNofSwKZ2hZ
+OmZ1bmN0aW9uKCl7dmFyIHMscj10aGlzCmlmKCFyLmRiKXtzPVAuV1goci5ndFAoKSkKaWYoci5kYil0
+aHJvdyBILmIoSC5jKCJGaWVsZCAncXVlcnlQYXJhbWV0ZXJzJyBoYXMgYmVlbiBhc3NpZ25lZCBkdXJp
+bmcgaW5pdGlhbGl6YXRpb24uIikpCnIuc05NKG5ldyBQLkdqKHMsdC5kdykpCnIuZGI9ITB9cmV0dXJu
+IHIuY3l9LApna3U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ifSwKZ0pmOmZ1bmN0aW9uKGEpe3ZhciBz
+PXRoaXMuYwppZihzPT1udWxsKXJldHVybiIiCmlmKEMueEIubihzLCJbIikpcmV0dXJuIEMueEIuTmoo
+cywxLHMubGVuZ3RoLTEpCnJldHVybiBzfSwKZ3RwOmZ1bmN0aW9uKGEpe3ZhciBzPXRoaXMuZApyZXR1
+cm4gcz09bnVsbD9QLndLKHRoaXMuYSk6c30sCmd0UDpmdW5jdGlvbigpe3ZhciBzPXRoaXMuZgpyZXR1
+cm4gcz09bnVsbD8iIjpzfSwKZ0thOmZ1bmN0aW9uKCl7dmFyIHM9dGhpcy5yCnJldHVybiBzPT1udWxs
+PyIiOnN9LApubTpmdW5jdGlvbihhLGIpe3ZhciBzLHIscSxwLG8sbixtLGwsayxqPXRoaXMKdC5jOS5h
+KGIpCnM9ai5hCnI9cz09PSJmaWxlIgpxPWouYgpwPWouZApvPWouYwppZighKG8hPW51bGwpKW89cS5s
+ZW5ndGghPT0wfHxwIT1udWxsfHxyPyIiOm51bGwKbj1qLmUKaWYoIXIpbT1vIT1udWxsJiZuLmxlbmd0
+aCE9PTAKZWxzZSBtPSEwCmlmKG0mJiFDLnhCLm4obiwiLyIpKW49Ii8iK24KbD1uCms9UC5sZShudWxs
+LDAsMCxiKQpyZXR1cm4gbmV3IFAuRG4ocyxxLG8scCxsLGssai5yKX0sCkpoOmZ1bmN0aW9uKGEsYil7
+dmFyIHMscixxLHAsbyxuCmZvcihzPTAscj0wO0MueEIuUWkoYiwiLi4vIixyKTspe3IrPTM7KytzfXE9
+Qy54Qi5jbihhLCIvIikKd2hpbGUoITApe2lmKCEocT4wJiZzPjApKWJyZWFrCnA9Qy54Qi5QayhhLCIv
+IixxLTEpCmlmKHA8MClicmVhawpvPXEtcApuPW8hPT0yCmlmKCFufHxvPT09MylpZihDLnhCLk8yKGEs
+cCsxKT09PTQ2KW49IW58fEMueEIuTzIoYSxwKzIpPT09NDYKZWxzZSBuPSExCmVsc2Ugbj0hMQppZihu
+KWJyZWFrOy0tcwpxPXB9cmV0dXJuIEMueEIuaTcoYSxxKzEsbnVsbCxDLnhCLkcoYixyLTMqcykpfSwK
+Wkk6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubVMoUC5oSyhhKSl9LAptUzpmdW5jdGlvbihhKXt2YXIg
+cyxyLHEscCxvLG4sbSxsLGssaj10aGlzLGk9bnVsbAppZihhLmdGaSgpLmxlbmd0aCE9PTApe3M9YS5n
+RmkoKQppZihhLmdjaigpKXtyPWEuZ2t1KCkKcT1hLmdKZihhKQpwPWEuZ3hBKCk/YS5ndHAoYSk6aX1l
+bHNle3A9aQpxPXAKcj0iIn1vPVAueGUoYS5nSWkoYSkpCm49YS5nUUQoKT9hLmd0UCgpOml9ZWxzZXtz
+PWouYQppZihhLmdjaigpKXtyPWEuZ2t1KCkKcT1hLmdKZihhKQpwPVAud0IoYS5neEEoKT9hLmd0cChh
+KTppLHMpCm89UC54ZShhLmdJaShhKSkKbj1hLmdRRCgpP2EuZ3RQKCk6aX1lbHNle3I9ai5iCnE9ai5j
+CnA9ai5kCmlmKGEuZ0lpKGEpPT09IiIpe289ai5lCm49YS5nUUQoKT9hLmd0UCgpOmouZn1lbHNle2lm
+KGEuZ3RUKCkpbz1QLnhlKGEuZ0lpKGEpKQplbHNle209ai5lCmlmKG0ubGVuZ3RoPT09MClpZihxPT1u
+dWxsKW89cy5sZW5ndGg9PT0wP2EuZ0lpKGEpOlAueGUoYS5nSWkoYSkpCmVsc2Ugbz1QLnhlKCIvIith
+LmdJaShhKSkKZWxzZXtsPWouSmgobSxhLmdJaShhKSkKaz1zLmxlbmd0aD09PTAKaWYoIWt8fHEhPW51
+bGx8fEMueEIubihtLCIvIikpbz1QLnhlKGwpCmVsc2Ugbz1QLndGKGwsIWt8fHEhPW51bGwpfX1uPWEu
+Z1FEKCk/YS5ndFAoKTppfX19cmV0dXJuIG5ldyBQLkRuKHMscixxLHAsbyxuLGEuZ1o4KCk/YS5nS2Eo
+KTppKX0sCmdjajpmdW5jdGlvbigpe3JldHVybiB0aGlzLmMhPW51bGx9LApneEE6ZnVuY3Rpb24oKXty
+ZXR1cm4gdGhpcy5kIT1udWxsfSwKZ1FEOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZiE9bnVsbH0sCmda
+ODpmdW5jdGlvbigpe3JldHVybiB0aGlzLnIhPW51bGx9LApndFQ6ZnVuY3Rpb24oKXtyZXR1cm4gQy54
+Qi5uKHRoaXMuZSwiLyIpfSwKdDQ6ZnVuY3Rpb24oKXt2YXIgcyxyPXRoaXMscT1yLmEKaWYocSE9PSIi
+JiZxIT09ImZpbGUiKXRocm93IEguYihQLkw0KCJDYW5ub3QgZXh0cmFjdCBhIGZpbGUgcGF0aCBmcm9t
+IGEgIitxKyIgVVJJIikpCmlmKHIuZ3RQKCkhPT0iIil0aHJvdyBILmIoUC5MNCh1LmkpKQppZihyLmdL
+YSgpIT09IiIpdGhyb3cgSC5iKFAuTDQodS5sKSkKcT0kLndRKCkKaWYoSC5vVChxKSlxPVAubW4ocikK
+ZWxzZXtpZihyLmMhPW51bGwmJnIuZ0pmKHIpIT09IiIpSC52KFAuTDQodS5qKSkKcz1yLmdGaigpClAu
+a0UocywhMSkKcT1QLnZnKEMueEIubihyLmUsIi8iKT8iLyI6IiIscywiLyIpCnE9cS5jaGFyQ29kZUF0
+KDApPT0wP3E6cX1yZXR1cm4gcX0sCnc6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZ25EKCl9LApETjpm
+dW5jdGlvbihhLGIpe3ZhciBzPXRoaXMKaWYoYj09bnVsbClyZXR1cm4hMQppZihzPT09YilyZXR1cm4h
+MApyZXR1cm4gdC5kRC5iKGIpJiZzLmE9PT1iLmdGaSgpJiZzLmMhPW51bGw9PT1iLmdjaigpJiZzLmI9
+PT1iLmdrdSgpJiZzLmdKZihzKT09PWIuZ0pmKGIpJiZzLmd0cChzKT09PWIuZ3RwKGIpJiZzLmU9PT1i
+LmdJaShiKSYmcy5mIT1udWxsPT09Yi5nUUQoKSYmcy5ndFAoKT09PWIuZ3RQKCkmJnMuciE9bnVsbD09
+PWIuZ1o4KCkmJnMuZ0thKCk9PT1iLmdLYSgpfSwKc0twOmZ1bmN0aW9uKGEpe3RoaXMuej10LmJrLmEo
+YSl9LApzTk06ZnVuY3Rpb24oYSl7dGhpcy5jeT10LmNaLmEoYSl9LAokaWlEOjEsCmdGaTpmdW5jdGlv
+bigpe3JldHVybiB0aGlzLmF9LApnSWk6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZX19ClAuUloucHJv
+dG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIFAuZVAoQy5aSixILmgoYSksQy54TSwhMSl9LAok
+Uzo1fQpQLk1FLnByb3RvdHlwZT17CiQyOmZ1bmN0aW9uKGEsYil7dmFyIHM9dGhpcy5iLHI9dGhpcy5h
+CnMuYSs9ci5hCnIuYT0iJiIKcj1zLmErPUguRWooUC5lUChDLkYzLGEsQy54TSwhMCkpCmlmKGIhPW51
+bGwmJmIubGVuZ3RoIT09MCl7cy5hPXIrIj0iCnMuYSs9SC5FaihQLmVQKEMuRjMsYixDLnhNLCEwKSl9
+fSwKJFM6MjJ9ClAueTUucHJvdG90eXBlPXsKJDI6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyCkguaChhKQpp
+ZihiPT1udWxsfHx0eXBlb2YgYj09InN0cmluZyIpdGhpcy5hLiQyKGEsSC5rKGIpKQplbHNlIGZvcihz
+PUouSVQodC51LmEoYikpLHI9dGhpcy5hO3MuRigpOylyLiQyKGEsSC5oKHMuZ2woKSkpfSwKJFM6MTN9
+ClAuUEUucHJvdG90eXBlPXsKZ2xSOmZ1bmN0aW9uKCl7dmFyIHMscixxLHAsbz10aGlzLG49bnVsbCxt
+PW8uYwppZihtPT1udWxsKXttPW8uYgppZigwPj1tLmxlbmd0aClyZXR1cm4gSC5PSChtLDApCnM9by5h
+Cm09bVswXSsxCnI9Qy54Qi5YVShzLCI/IixtKQpxPXMubGVuZ3RoCmlmKHI+PTApe3A9UC5QSShzLHIr
+MSxxLEMuVkMsITEpCnE9cn1lbHNlIHA9bgptPW8uYz1uZXcgUC5xZSgiZGF0YSIsIiIsbixuLFAuUEko
+cyxtLHEsQy5XZCwhMSkscCxuKX1yZXR1cm4gbX0sCnc6ZnVuY3Rpb24oYSl7dmFyIHMscj10aGlzLmIK
+aWYoMD49ci5sZW5ndGgpcmV0dXJuIEguT0gociwwKQpzPXRoaXMuYQpyZXR1cm4gclswXT09PS0xPyJk
+YXRhOiIrczpzfX0KUC5xMy5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFVpbnQ4
+QXJyYXkoOTYpfSwKJFM6MjN9ClAueUkucHJvdG90eXBlPXsKJDI6ZnVuY3Rpb24oYSxiKXt2YXIgcz10
+aGlzLmEKaWYoYT49MjIpcmV0dXJuIEguT0gocyxhKQpzPXNbYV0KQy5OQS5kdShzLDAsOTYsYikKcmV0
+dXJuIHN9LAokUzoyNH0KUC5jNi5wcm90b3R5cGU9ewokMzpmdW5jdGlvbihhLGIsYyl7dmFyIHMscixx
+CmZvcihzPWIubGVuZ3RoLHI9MDtyPHM7KytyKXtxPUMueEIuVyhiLHIpXjk2CmlmKHE+PTk2KXJldHVy
+biBILk9IKGEscSkKYVtxXT1jfX0sCiRTOjE0fQpQLnFkLnByb3RvdHlwZT17CiQzOmZ1bmN0aW9uKGEs
+YixjKXt2YXIgcyxyLHEKZm9yKHM9Qy54Qi5XKGIsMCkscj1DLnhCLlcoYiwxKTtzPD1yOysrcyl7cT0o
+c145Nik+Pj4wCmlmKHE+PTk2KXJldHVybiBILk9IKGEscSkKYVtxXT1jfX0sCiRTOjE0fQpQLlVmLnBy
+b3RvdHlwZT17CmdjajpmdW5jdGlvbigpe3JldHVybiB0aGlzLmM+MH0sCmd4QTpmdW5jdGlvbigpe3Jl
+dHVybiB0aGlzLmM+MCYmdGhpcy5kKzE8dGhpcy5lfSwKZ1FEOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMu
+Zjx0aGlzLnJ9LApnWjg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yPHRoaXMuYS5sZW5ndGh9LApnTnc6
+ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iPT09NCYmQy54Qi5uKHRoaXMuYSwiZmlsZSIpfSwKZ1daOmZ1
+bmN0aW9uKCl7cmV0dXJuIHRoaXMuYj09PTQmJkMueEIubih0aGlzLmEsImh0dHAiKX0sCmdSZTpmdW5j
+dGlvbigpe3JldHVybiB0aGlzLmI9PT01JiZDLnhCLm4odGhpcy5hLCJodHRwcyIpfSwKZ3RUOmZ1bmN0
+aW9uKCl7cmV0dXJuIEMueEIuUWkodGhpcy5hLCIvIix0aGlzLmUpfSwKZ0ZpOmZ1bmN0aW9uKCl7dmFy
+IHM9dGhpcy54CnJldHVybiBzPT1udWxsP3RoaXMueD10aGlzLlUyKCk6c30sClUyOmZ1bmN0aW9uKCl7
+dmFyIHM9dGhpcyxyPXMuYgppZihyPD0wKXJldHVybiIiCmlmKHMuZ1daKCkpcmV0dXJuImh0dHAiCmlm
+KHMuZ1JlKCkpcmV0dXJuImh0dHBzIgppZihzLmdOdygpKXJldHVybiJmaWxlIgppZihyPT09NyYmQy54
+Qi5uKHMuYSwicGFja2FnZSIpKXJldHVybiJwYWNrYWdlIgpyZXR1cm4gQy54Qi5OaihzLmEsMCxyKX0s
+CmdrdTpmdW5jdGlvbigpe3ZhciBzPXRoaXMuYyxyPXRoaXMuYiszCnJldHVybiBzPnI/Qy54Qi5Oaih0
+aGlzLmEscixzLTEpOiIifSwKZ0pmOmZ1bmN0aW9uKGEpe3ZhciBzPXRoaXMuYwpyZXR1cm4gcz4wP0Mu
+eEIuTmoodGhpcy5hLHMsdGhpcy5kKToiIn0sCmd0cDpmdW5jdGlvbihhKXt2YXIgcz10aGlzCmlmKHMu
+Z3hBKCkpcmV0dXJuIFAuUUEoQy54Qi5OaihzLmEscy5kKzEscy5lKSxudWxsKQppZihzLmdXWigpKXJl
+dHVybiA4MAppZihzLmdSZSgpKXJldHVybiA0NDMKcmV0dXJuIDB9LApnSWk6ZnVuY3Rpb24oYSl7cmV0
+dXJuIEMueEIuTmoodGhpcy5hLHRoaXMuZSx0aGlzLmYpfSwKZ3RQOmZ1bmN0aW9uKCl7dmFyIHM9dGhp
+cy5mLHI9dGhpcy5yCnJldHVybiBzPHI/Qy54Qi5Oaih0aGlzLmEscysxLHIpOiIifSwKZ0thOmZ1bmN0
+aW9uKCl7dmFyIHM9dGhpcy5yLHI9dGhpcy5hCnJldHVybiBzPHIubGVuZ3RoP0MueEIuRyhyLHMrMSk6
+IiJ9LApnRmo6ZnVuY3Rpb24oKXt2YXIgcyxyLHE9dGhpcy5lLHA9dGhpcy5mLG89dGhpcy5hCmlmKEMu
+eEIuUWkobywiLyIscSkpKytxCmlmKHE9PT1wKXJldHVybiBDLnhECnM9SC5WTShbXSx0LnMpCmZvcihy
+PXE7cjxwOysrcilpZihDLnhCLk8yKG8scik9PT00Nyl7Qy5ObS5pKHMsQy54Qi5OaihvLHEscikpCnE9
+cisxfUMuTm0uaShzLEMueEIuTmoobyxxLHApKQpyZXR1cm4gUC5BRihzLHQuTil9LApnaFk6ZnVuY3Rp
+b24oKXtpZih0aGlzLmY+PXRoaXMucilyZXR1cm4gQy5DTQpyZXR1cm4gbmV3IFAuR2ooUC5XWCh0aGlz
+Lmd0UCgpKSx0LmR3KX0sCmtYOmZ1bmN0aW9uKGEpe3ZhciBzPXRoaXMuZCsxCnJldHVybiBzK2EubGVu
+Z3RoPT09dGhpcy5lJiZDLnhCLlFpKHRoaXMuYSxhLHMpfSwKTjk6ZnVuY3Rpb24oKXt2YXIgcz10aGlz
+LHI9cy5yLHE9cy5hCmlmKHI+PXEubGVuZ3RoKXJldHVybiBzCnJldHVybiBuZXcgUC5VZihDLnhCLk5q
+KHEsMCxyKSxzLmIscy5jLHMuZCxzLmUscy5mLHIscy54KX0sCm5tOmZ1bmN0aW9uKGEsYil7dmFyIHMs
+cixxLHAsbyxuLG0sbCxrLGosaT10aGlzLGg9bnVsbAp0LmM5LmEoYikKcz1pLmdGaSgpCnI9cz09PSJm
+aWxlIgpxPWkuYwpwPXE+MD9DLnhCLk5qKGkuYSxpLmIrMyxxKToiIgpvPWkuZ3hBKCk/aS5ndHAoaSk6
+aApxPWkuYwppZihxPjApbj1DLnhCLk5qKGkuYSxxLGkuZCkKZWxzZSBuPXAubGVuZ3RoIT09MHx8byE9
+bnVsbHx8cj8iIjpoCnE9aS5hCm09Qy54Qi5OaihxLGkuZSxpLmYpCmlmKCFyKWw9biE9bnVsbCYmbS5s
+ZW5ndGghPT0wCmVsc2UgbD0hMAppZihsJiYhQy54Qi5uKG0sIi8iKSltPSIvIittCms9UC5sZShoLDAs
+MCxiKQpsPWkucgpqPWw8cS5sZW5ndGg/Qy54Qi5HKHEsbCsxKTpoCnJldHVybiBuZXcgUC5EbihzLHAs
+bixvLG0sayxqKX0sClpJOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm1TKFAuaEsoYSkpfSwKbVM6ZnVu
+Y3Rpb24oYSl7aWYoYSBpbnN0YW5jZW9mIFAuVWYpcmV0dXJuIHRoaXMudTEodGhpcyxhKQpyZXR1cm4g
+dGhpcy52cygpLm1TKGEpfSwKdTE6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyLHEscCxvLG4sbSxsLGssaixp
+LGgsZz1iLmIKaWYoZz4wKXJldHVybiBiCnM9Yi5jCmlmKHM+MCl7cj1hLmIKaWYocjw9MClyZXR1cm4g
+YgppZihhLmdOdygpKXE9Yi5lIT09Yi5mCmVsc2UgaWYoYS5nV1ooKSlxPSFiLmtYKCI4MCIpCmVsc2Ug
+cT0hYS5nUmUoKXx8IWIua1goIjQ0MyIpCmlmKHEpe3A9cisxCnJldHVybiBuZXcgUC5VZihDLnhCLk5q
+KGEuYSwwLHApK0MueEIuRyhiLmEsZysxKSxyLHMrcCxiLmQrcCxiLmUrcCxiLmYrcCxiLnIrcCxhLngp
+fWVsc2UgcmV0dXJuIHRoaXMudnMoKS5tUyhiKX1vPWIuZQpnPWIuZgppZihvPT09Zyl7cz1iLnIKaWYo
+ZzxzKXtyPWEuZgpwPXItZwpyZXR1cm4gbmV3IFAuVWYoQy54Qi5OaihhLmEsMCxyKStDLnhCLkcoYi5h
+LGcpLGEuYixhLmMsYS5kLGEuZSxnK3AscytwLGEueCl9Zz1iLmEKaWYoczxnLmxlbmd0aCl7cj1hLnIK
+cmV0dXJuIG5ldyBQLlVmKEMueEIuTmooYS5hLDAscikrQy54Qi5HKGcscyksYS5iLGEuYyxhLmQsYS5l
+LGEuZixzKyhyLXMpLGEueCl9cmV0dXJuIGEuTjkoKX1zPWIuYQppZihDLnhCLlFpKHMsIi8iLG8pKXty
+PWEuZQpwPXItbwpyZXR1cm4gbmV3IFAuVWYoQy54Qi5OaihhLmEsMCxyKStDLnhCLkcocyxvKSxhLmIs
+YS5jLGEuZCxyLGcrcCxiLnIrcCxhLngpfW49YS5lCm09YS5mCmlmKG49PT1tJiZhLmM+MCl7Zm9yKDtD
+LnhCLlFpKHMsIi4uLyIsbyk7KW8rPTMKcD1uLW8rMQpyZXR1cm4gbmV3IFAuVWYoQy54Qi5OaihhLmEs
+MCxuKSsiLyIrQy54Qi5HKHMsbyksYS5iLGEuYyxhLmQsbixnK3AsYi5yK3AsYS54KX1sPWEuYQpmb3Io
+az1uO0MueEIuUWkobCwiLi4vIixrKTspays9MwpqPTAKd2hpbGUoITApe2k9byszCmlmKCEoaTw9ZyYm
+Qy54Qi5RaShzLCIuLi8iLG8pKSlicmVhazsrK2oKbz1pfWZvcihoPSIiO20+azspey0tbQppZihDLnhC
+Lk8yKGwsbSk9PT00Nyl7aWYoaj09PTApe2g9Ii8iCmJyZWFrfS0tagpoPSIvIn19aWYobT09PWsmJmEu
+Yjw9MCYmIUMueEIuUWkobCwiLyIsbikpe28tPWoqMwpoPSIifXA9bS1vK2gubGVuZ3RoCnJldHVybiBu
+ZXcgUC5VZihDLnhCLk5qKGwsMCxtKStoK0MueEIuRyhzLG8pLGEuYixhLmMsYS5kLG4sZytwLGIucitw
+LGEueCl9LAp0NDpmdW5jdGlvbigpe3ZhciBzLHIscSxwPXRoaXMKaWYocC5iPj0wJiYhcC5nTncoKSl0
+aHJvdyBILmIoUC5MNCgiQ2Fubm90IGV4dHJhY3QgYSBmaWxlIHBhdGggZnJvbSBhICIrcC5nRmkoKSsi
+IFVSSSIpKQpzPXAuZgpyPXAuYQppZihzPHIubGVuZ3RoKXtpZihzPHAucil0aHJvdyBILmIoUC5MNCh1
+LmkpKQp0aHJvdyBILmIoUC5MNCh1LmwpKX1xPSQud1EoKQppZihILm9UKHEpKXM9UC5tbihwKQplbHNl
+e2lmKHAuYzxwLmQpSC52KFAuTDQodS5qKSkKcz1DLnhCLk5qKHIscC5lLHMpfXJldHVybiBzfSwKZ2lP
+OmZ1bmN0aW9uKGEpe3ZhciBzPXRoaXMueQpyZXR1cm4gcz09bnVsbD90aGlzLnk9Qy54Qi5naU8odGhp
+cy5hKTpzfSwKRE46ZnVuY3Rpb24oYSxiKXtpZihiPT1udWxsKXJldHVybiExCmlmKHRoaXM9PT1iKXJl
+dHVybiEwCnJldHVybiB0LmRELmIoYikmJnRoaXMuYT09PWIudygwKX0sCnZzOmZ1bmN0aW9uKCl7dmFy
+IHM9dGhpcyxyPW51bGwscT1zLmdGaSgpLHA9cy5na3UoKSxvPXMuYz4wP3MuZ0pmKHMpOnIsbj1zLmd4
+QSgpP3MuZ3RwKHMpOnIsbT1zLmEsbD1zLmYsaz1DLnhCLk5qKG0scy5lLGwpLGo9cy5yCmw9bDxqP3Mu
+Z3RQKCk6cgpyZXR1cm4gbmV3IFAuRG4ocSxwLG8sbixrLGwsajxtLmxlbmd0aD9zLmdLYSgpOnIpfSwK
+dzpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hfSwKJGlpRDoxfQpQLnFlLnByb3RvdHlwZT17fQpXLnFF
+LnByb3RvdHlwZT17fQpXLkdoLnByb3RvdHlwZT17CnNMVTpmdW5jdGlvbihhLGIpe2EuaHJlZj1ifSwK
+dzpmdW5jdGlvbihhKXtyZXR1cm4gU3RyaW5nKGEpfSwKJGlHaDoxfQpXLmZZLnByb3RvdHlwZT17Cnc6
+ZnVuY3Rpb24oYSl7cmV0dXJuIFN0cmluZyhhKX19ClcubkIucHJvdG90eXBlPXskaW5COjF9ClcuQXou
+cHJvdG90eXBlPXskaUF6OjF9ClcuUVAucHJvdG90eXBlPXskaVFQOjF9ClcubngucHJvdG90eXBlPXsK
+Z0E6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubGVuZ3RofX0KVy5vSi5wcm90b3R5cGU9ewpnQTpmdW5jdGlv
+bihhKXtyZXR1cm4gYS5sZW5ndGh9fQpXLmlkLnByb3RvdHlwZT17fQpXLlFGLnByb3RvdHlwZT17fQpX
+Lk5oLnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7cmV0dXJuIFN0cmluZyhhKX19ClcuYWUucHJvdG90
+eXBlPXsKRGM6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5jcmVhdGVIVE1MRG9jdW1lbnQoYil9fQpXLklC
+LnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7dmFyIHMscj1hLmxlZnQKci50b1N0cmluZwpyPSJSZWN0
+YW5nbGUgKCIrSC5FaihyKSsiLCAiCnM9YS50b3AKcy50b1N0cmluZwpzPXIrSC5FaihzKSsiKSAiCnI9
+YS53aWR0aApyLnRvU3RyaW5nCnI9cytILkVqKHIpKyIgeCAiCnM9YS5oZWlnaHQKcy50b1N0cmluZwpy
+ZXR1cm4gcitILkVqKHMpfSwKRE46ZnVuY3Rpb24oYSxiKXt2YXIgcyxyCmlmKGI9PW51bGwpcmV0dXJu
+ITEKaWYodC5xLmIoYikpe3M9YS5sZWZ0CnMudG9TdHJpbmcKcj1iLmxlZnQKci50b1N0cmluZwppZihz
+PT09cil7cz1hLnRvcApzLnRvU3RyaW5nCnI9Yi50b3AKci50b1N0cmluZwppZihzPT09cil7cz1hLndp
+ZHRoCnMudG9TdHJpbmcKcj1iLndpZHRoCnIudG9TdHJpbmcKaWYocz09PXIpe3M9YS5oZWlnaHQKcy50
+b1N0cmluZwpyPWIuaGVpZ2h0CnIudG9TdHJpbmcKcj1zPT09cgpzPXJ9ZWxzZSBzPSExfWVsc2Ugcz0h
+MX1lbHNlIHM9ITF9ZWxzZSBzPSExCnJldHVybiBzfSwKZ2lPOmZ1bmN0aW9uKGEpe3ZhciBzLHIscSxw
+PWEubGVmdApwLnRvU3RyaW5nCnA9Qy5DRC5naU8ocCkKcz1hLnRvcApzLnRvU3RyaW5nCnM9Qy5DRC5n
+aU8ocykKcj1hLndpZHRoCnIudG9TdHJpbmcKcj1DLkNELmdpTyhyKQpxPWEuaGVpZ2h0CnEudG9TdHJp
+bmcKcmV0dXJuIFcuckUocCxzLHIsQy5DRC5naU8ocSkpfSwKJGl0bjoxfQpXLm43LnByb3RvdHlwZT17
+CmdBOmZ1bmN0aW9uKGEpe3JldHVybiBhLmxlbmd0aH19Clcud3oucHJvdG90eXBlPXsKZ0E6ZnVuY3Rp
+b24oYSl7cmV0dXJuIHRoaXMuYS5sZW5ndGh9LApxOmZ1bmN0aW9uKGEsYil7dmFyIHMKSC51UChiKQpz
+PXRoaXMuYQppZihiPDB8fGI+PXMubGVuZ3RoKXJldHVybiBILk9IKHMsYikKcmV0dXJuIHRoaXMuJHRp
+LmMuYShzW2JdKX0sClk6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuJHRpLmMuYShjKQp0aHJvdyBILmIoUC5M
+NCgiQ2Fubm90IG1vZGlmeSBsaXN0IikpfX0KVy5jdi5wcm90b3R5cGU9ewpnUWc6ZnVuY3Rpb24oYSl7
+cmV0dXJuIG5ldyBXLmk3KGEpfSwKZ0Q6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBXLkk0KGEpfSwKc0Q6
+ZnVuY3Rpb24oYSxiKXt2YXIgcwp0LlEuYShiKQpzPXRoaXMuZ0QoYSkKcy5WMSgwKQpzLkZWKDAsYil9
+LAp3OmZ1bmN0aW9uKGEpe3JldHVybiBhLmxvY2FsTmFtZX0sCkZGOmZ1bmN0aW9uKGEpe3ZhciBzPSEh
+YS5zY3JvbGxJbnRvVmlld0lmTmVlZGVkCmlmKHMpYS5zY3JvbGxJbnRvVmlld0lmTmVlZGVkKCkKZWxz
+ZSBhLnNjcm9sbEludG9WaWV3KCl9LApuejpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBzLHI9dGhpcy5y
+NihhLGMsZCxlKQpzd2l0Y2goYi50b0xvd2VyQ2FzZSgpKXtjYXNlImJlZm9yZWJlZ2luIjpzPWEucGFy
+ZW50Tm9kZQpzLnRvU3RyaW5nCkouRWgocyxyLGEpCmJyZWFrCmNhc2UiYWZ0ZXJiZWdpbiI6cz1hLmNo
+aWxkTm9kZXMKdGhpcy5tSyhhLHIscy5sZW5ndGg+MD9zWzBdOm51bGwpCmJyZWFrCmNhc2UiYmVmb3Jl
+ZW5kIjphLmFwcGVuZENoaWxkKHIpCmJyZWFrCmNhc2UiYWZ0ZXJlbmQiOnM9YS5wYXJlbnROb2RlCnMu
+dG9TdHJpbmcKSi5FaChzLHIsYS5uZXh0U2libGluZykKYnJlYWsKZGVmYXVsdDpILnYoUC54WSgiSW52
+YWxpZCBwb3NpdGlvbiAiK2IpKX19LApyNjpmdW5jdGlvbihhLGIsYyxkKXt2YXIgcyxyLHEscAppZihj
+PT1udWxsKXtpZihkPT1udWxsKXtzPSQubHQKaWYocz09bnVsbCl7cz1ILlZNKFtdLHQudikKcj1uZXcg
+Vy52RChzKQpDLk5tLmkocyxXLlR3KG51bGwpKQpDLk5tLmkocyxXLkJsKCkpCiQubHQ9cgpkPXJ9ZWxz
+ZSBkPXN9cz0kLkVVCmlmKHM9PW51bGwpe3M9bmV3IFcuS28oZCkKJC5FVT1zCmM9c31lbHNle3MuYT1k
+CmM9c319ZWxzZSBpZihkIT1udWxsKXRocm93IEguYihQLnhZKCJ2YWxpZGF0b3IgY2FuIG9ubHkgYmUg
+cGFzc2VkIGlmIHRyZWVTYW5pdGl6ZXIgaXMgbnVsbCIpKQppZigkLnhvPT1udWxsKXtzPWRvY3VtZW50
+CnI9cy5pbXBsZW1lbnRhdGlvbgpyLnRvU3RyaW5nCnI9Qy5tSC5EYyhyLCIiKQokLnhvPXIKJC5CTz1y
+LmNyZWF0ZVJhbmdlKCkKcj0kLnhvLmNyZWF0ZUVsZW1lbnQoImJhc2UiKQp0LmNSLmEocikKcz1zLmJh
+c2VVUkkKcy50b1N0cmluZwpyLmhyZWY9cwokLnhvLmhlYWQuYXBwZW5kQ2hpbGQocil9cz0kLnhvCmlm
+KHMuYm9keT09bnVsbCl7cj1zLmNyZWF0ZUVsZW1lbnQoImJvZHkiKQpDLkJaLnNYRyhzLHQucC5hKHIp
+KX1zPSQueG8KaWYodC5wLmIoYSkpe3M9cy5ib2R5CnMudG9TdHJpbmcKcT1zfWVsc2V7cy50b1N0cmlu
+ZwpxPXMuY3JlYXRlRWxlbWVudChhLnRhZ05hbWUpCiQueG8uYm9keS5hcHBlbmRDaGlsZChxKX1pZigi
+Y3JlYXRlQ29udGV4dHVhbEZyYWdtZW50IiBpbiB3aW5kb3cuUmFuZ2UucHJvdG90eXBlJiYhQy5ObS50
+ZyhDLlNxLGEudGFnTmFtZSkpeyQuQk8uc2VsZWN0Tm9kZUNvbnRlbnRzKHEpCnM9JC5CTwpzLnRvU3Ry
+aW5nCnA9cy5jcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQoYj09bnVsbD8ibnVsbCI6Yil9ZWxzZXtKLndm
+KHEsYikKcD0kLnhvLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKQpmb3IoO3M9cS5maXJzdENoaWxkLHMh
+PW51bGw7KXAuYXBwZW5kQ2hpbGQocyl9aWYocSE9PSQueG8uYm9keSlKLkx0KHEpCmMuUG4ocCkKZG9j
+dW1lbnQuYWRvcHROb2RlKHApCnJldHVybiBwfSwKQUg6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlz
+LnI2KGEsYixjLG51bGwpfSwKc2hmOmZ1bmN0aW9uKGEsYil7dGhpcy5ZQyhhLGIpfSwKcGs6ZnVuY3Rp
+b24oYSxiLGMpe3RoaXMuc2E0KGEsbnVsbCkKYS5hcHBlbmRDaGlsZCh0aGlzLnI2KGEsYixudWxsLGMp
+KX0sCllDOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMucGsoYSxiLG51bGwpfSwKc1JOOmZ1bmN0aW9u
+KGEsYil7YS5pbm5lckhUTUw9Yn0sCmduczpmdW5jdGlvbihhKXtyZXR1cm4gYS50YWdOYW1lfSwKZ1Zs
+OmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgVy5ldShhLCJjbGljayIsITEsdC5rKX0sCiRpY3Y6MX0KVy5D
+di5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXtyZXR1cm4gdC5oLmIodC5BLmEoYSkpfSwKJFM6MjZ9
+ClcuZWEucHJvdG90eXBlPXskaWVhOjF9ClcuRDAucHJvdG90eXBlPXsKT246ZnVuY3Rpb24oYSxiLGMs
+ZCl7dC5idy5hKGMpCmlmKGMhPW51bGwpdGhpcy52KGEsYixjLGQpfSwKQjpmdW5jdGlvbihhLGIsYyl7
+cmV0dXJuIHRoaXMuT24oYSxiLGMsbnVsbCl9LAp2OmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBhLmFk
+ZEV2ZW50TGlzdGVuZXIoYixILnRSKHQuYncuYShjKSwxKSxkKX0sCiRpRDA6MX0KVy5oSC5wcm90b3R5
+cGU9eyRpaEg6MX0KVy5oNC5wcm90b3R5cGU9ewpnQTpmdW5jdGlvbihhKXtyZXR1cm4gYS5sZW5ndGh9
+fQpXLmJyLnByb3RvdHlwZT17CmdBOmZ1bmN0aW9uKGEpe3JldHVybiBhLmxlbmd0aH19ClcuVmIucHJv
+dG90eXBlPXsKc1hHOmZ1bmN0aW9uKGEsYil7YS5ib2R5PWJ9fQpXLmZKLnByb3RvdHlwZT17CmVvOmZ1
+bmN0aW9uKGEsYixjLGQpe3JldHVybiBhLm9wZW4oYixjLCEwKX0sCiRpZko6MX0KVy53YS5wcm90b3R5
+cGU9e30KVy5TZy5wcm90b3R5cGU9eyRpU2c6MX0KVy51OC5wcm90b3R5cGU9ewpnRHI6ZnVuY3Rpb24o
+YSl7aWYoIm9yaWdpbiIgaW4gYSlyZXR1cm4gYS5vcmlnaW4KcmV0dXJuIEguRWooYS5wcm90b2NvbCkr
+Ii8vIitILkVqKGEuaG9zdCl9LAp3OmZ1bmN0aW9uKGEpe3JldHVybiBTdHJpbmcoYSl9LAokaXU4OjF9
+ClcuQWoucHJvdG90eXBlPXskaUFqOjF9ClcuZTcucHJvdG90eXBlPXsKZ3I4OmZ1bmN0aW9uKGEpe3Zh
+ciBzPXRoaXMuYSxyPXMuY2hpbGROb2Rlcy5sZW5ndGgKaWYocj09PTApdGhyb3cgSC5iKFAuUFYoIk5v
+IGVsZW1lbnRzIikpCmlmKHI+MSl0aHJvdyBILmIoUC5QVigiTW9yZSB0aGFuIG9uZSBlbGVtZW50Iikp
+CnM9cy5maXJzdENoaWxkCnMudG9TdHJpbmcKcmV0dXJuIHN9LApGVjpmdW5jdGlvbihhLGIpe3ZhciBz
+LHIscSxwLG8KdC5laC5hKGIpCmlmKGIgaW5zdGFuY2VvZiBXLmU3KXtzPWIuYQpyPXRoaXMuYQppZihz
+IT09cilmb3IocT1zLmNoaWxkTm9kZXMubGVuZ3RoLHA9MDtwPHE7KytwKXtvPXMuZmlyc3RDaGlsZApv
+LnRvU3RyaW5nCnIuYXBwZW5kQ2hpbGQobyl9cmV0dXJufWZvcihzPWIuZ20oYikscj10aGlzLmE7cy5G
+KCk7KXIuYXBwZW5kQ2hpbGQocy5nbCgpKX0sClk6ZnVuY3Rpb24oYSxiLGMpe3ZhciBzLHIKdC5BLmEo
+YykKcz10aGlzLmEKcj1zLmNoaWxkTm9kZXMKaWYoYjwwfHxiPj1yLmxlbmd0aClyZXR1cm4gSC5PSChy
+LGIpCnMucmVwbGFjZUNoaWxkKGMscltiXSl9LApnbTpmdW5jdGlvbihhKXt2YXIgcz10aGlzLmEuY2hp
+bGROb2RlcwpyZXR1cm4gbmV3IFcuVzkocyxzLmxlbmd0aCxILnoocykuQygiVzk8R20uRT4iKSl9LApn
+QTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hLmNoaWxkTm9kZXMubGVuZ3RofSwKcTpmdW5jdGlvbihh
+LGIpe3ZhciBzCkgudVAoYikKcz10aGlzLmEuY2hpbGROb2RlcwppZihiPDB8fGI+PXMubGVuZ3RoKXJl
+dHVybiBILk9IKHMsYikKcmV0dXJuIHNbYl19fQpXLnVILnByb3RvdHlwZT17CndnOmZ1bmN0aW9uKGEp
+e3ZhciBzPWEucGFyZW50Tm9kZQppZihzIT1udWxsKXMucmVtb3ZlQ2hpbGQoYSl9LApENDpmdW5jdGlv
+bihhKXt2YXIgcwpmb3IoO3M9YS5maXJzdENoaWxkLHMhPW51bGw7KWEucmVtb3ZlQ2hpbGQocyl9LAp3
+OmZ1bmN0aW9uKGEpe3ZhciBzPWEubm9kZVZhbHVlCnJldHVybiBzPT1udWxsP3RoaXMuVShhKTpzfSwK
+c2E0OmZ1bmN0aW9uKGEsYil7YS50ZXh0Q29udGVudD1ifSwKbUs6ZnVuY3Rpb24oYSxiLGMpe3JldHVy
+biBhLmluc2VydEJlZm9yZShiLGMpfSwKJGl1SDoxfQpXLkJILnByb3RvdHlwZT17CmdBOmZ1bmN0aW9u
+KGEpe3JldHVybiBhLmxlbmd0aH0sCnE6ZnVuY3Rpb24oYSxiKXtILnVQKGIpCmlmKGI+Pj4wIT09Ynx8
+Yj49YS5sZW5ndGgpdGhyb3cgSC5iKFAuQ2YoYixhLG51bGwsbnVsbCxudWxsKSkKcmV0dXJuIGFbYl19
+LApZOmZ1bmN0aW9uKGEsYixjKXt0LkEuYShjKQp0aHJvdyBILmIoUC5MNCgiQ2Fubm90IGFzc2lnbiBl
+bGVtZW50IG9mIGltbXV0YWJsZSBMaXN0LiIpKX0sCmd0SDpmdW5jdGlvbihhKXtpZihhLmxlbmd0aD4w
+KXJldHVybiBhWzBdCnRocm93IEguYihQLlBWKCJObyBlbGVtZW50cyIpKX0sCkU6ZnVuY3Rpb24oYSxi
+KXtpZihiPDB8fGI+PWEubGVuZ3RoKXJldHVybiBILk9IKGEsYikKcmV0dXJuIGFbYl19LAokaWJROjEs
+CiRpWGo6MSwKJGljWDoxLAokaXpNOjF9ClcuU04ucHJvdG90eXBlPXt9ClcuZXcucHJvdG90eXBlPXsk
+aWV3OjF9ClcubHAucHJvdG90eXBlPXsKZ0E6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubGVuZ3RofX0KVy5U
+Yi5wcm90b3R5cGU9ewpyNjpmdW5jdGlvbihhLGIsYyxkKXt2YXIgcyxyCmlmKCJjcmVhdGVDb250ZXh0
+dWFsRnJhZ21lbnQiIGluIHdpbmRvdy5SYW5nZS5wcm90b3R5cGUpcmV0dXJuIHRoaXMuRFcoYSxiLGMs
+ZCkKcz1XLlU5KCI8dGFibGU+IitILkVqKGIpKyI8L3RhYmxlPiIsYyxkKQpyPWRvY3VtZW50LmNyZWF0
+ZURvY3VtZW50RnJhZ21lbnQoKQpyLnRvU3RyaW5nCnMudG9TdHJpbmcKbmV3IFcuZTcocikuRlYoMCxu
+ZXcgVy5lNyhzKSkKcmV0dXJuIHJ9fQpXLkl2LnByb3RvdHlwZT17CnI2OmZ1bmN0aW9uKGEsYixjLGQp
+e3ZhciBzLHIscSxwCmlmKCJjcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQiIGluIHdpbmRvdy5SYW5nZS5w
 cm90b3R5cGUpcmV0dXJuIHRoaXMuRFcoYSxiLGMsZCkKcz1kb2N1bWVudApyPXMuY3JlYXRlRG9jdW1l
 bnRGcmFnbWVudCgpCnM9Qy5JZS5yNihzLmNyZWF0ZUVsZW1lbnQoInRhYmxlIiksYixjLGQpCnMudG9T
-dHJpbmcKcz1uZXcgVy5lNyhzKQpxPXMuZ3I4KHMpCnIudG9TdHJpbmcKcS50b1N0cmluZwpuZXcgVy5l
-NyhyKS5GVigwLG5ldyBXLmU3KHEpKQpyZXR1cm4gcn19ClcueVkucHJvdG90eXBlPXsKcGs6ZnVuY3Rp
-b24oYSxiLGMpe3ZhciBzLHIKdGhpcy5zYTQoYSxudWxsKQpzPWEuY29udGVudApzLnRvU3RyaW5nCkou
-YlQocykKcj10aGlzLnI2KGEsYixudWxsLGMpCmEuY29udGVudC5hcHBlbmRDaGlsZChyKX0sCllDOmZ1
-bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMucGsoYSxiLG51bGwpfSwKJGl5WToxfQpXLnc2LnByb3RvdHlw
-ZT17fQpXLks1LnByb3RvdHlwZT17ClBvOmZ1bmN0aW9uKGEsYixjKXt2YXIgcz1XLlAxKGEub3Blbihi
-LGMpKQpyZXR1cm4gc30sCmdtVzpmdW5jdGlvbihhKXtyZXR1cm4gYS5sb2NhdGlvbn0sCnVzOmZ1bmN0
-aW9uKGEsYil7cmV0dXJuIGEuY29uZmlybShiKX0sCiRpSzU6MSwKJGl2NjoxfQpXLkNtLnByb3RvdHlw
-ZT17JGlDbToxfQpXLkNRLnByb3RvdHlwZT17JGlDUToxfQpXLnc0LnByb3RvdHlwZT17Cnc6ZnVuY3Rp
-b24oYSl7dmFyIHMscj1hLmxlZnQKci50b1N0cmluZwpyPSJSZWN0YW5nbGUgKCIrSC5FaihyKSsiLCAi
-CnM9YS50b3AKcy50b1N0cmluZwpzPXIrSC5FaihzKSsiKSAiCnI9YS53aWR0aApyLnRvU3RyaW5nCnI9
-cytILkVqKHIpKyIgeCAiCnM9YS5oZWlnaHQKcy50b1N0cmluZwpyZXR1cm4gcitILkVqKHMpfSwKRE46
-ZnVuY3Rpb24oYSxiKXt2YXIgcyxyCmlmKGI9PW51bGwpcmV0dXJuITEKaWYodC5xLmIoYikpe3M9YS5s
-ZWZ0CnMudG9TdHJpbmcKcj1iLmxlZnQKci50b1N0cmluZwppZihzPT09cil7cz1hLnRvcApzLnRvU3Ry
-aW5nCnI9Yi50b3AKci50b1N0cmluZwppZihzPT09cil7cz1hLndpZHRoCnMudG9TdHJpbmcKcj1iLndp
-ZHRoCnIudG9TdHJpbmcKaWYocz09PXIpe3M9YS5oZWlnaHQKcy50b1N0cmluZwpyPWIuaGVpZ2h0CnIu
-dG9TdHJpbmcKcj1zPT09cgpzPXJ9ZWxzZSBzPSExfWVsc2Ugcz0hMX1lbHNlIHM9ITF9ZWxzZSBzPSEx
-CnJldHVybiBzfSwKZ2lPOmZ1bmN0aW9uKGEpe3ZhciBzLHIscSxwPWEubGVmdApwLnRvU3RyaW5nCnA9
-Qy5DRC5naU8ocCkKcz1hLnRvcApzLnRvU3RyaW5nCnM9Qy5DRC5naU8ocykKcj1hLndpZHRoCnIudG9T
-dHJpbmcKcj1DLkNELmdpTyhyKQpxPWEuaGVpZ2h0CnEudG9TdHJpbmcKcmV0dXJuIFcuckUocCxzLHIs
-Qy5DRC5naU8ocSkpfX0KVy5yaC5wcm90b3R5cGU9ewpnQTpmdW5jdGlvbihhKXtyZXR1cm4gYS5sZW5n
-dGh9LApxOmZ1bmN0aW9uKGEsYil7SC51UChiKQppZihiPj4+MCE9PWJ8fGI+PWEubGVuZ3RoKXRocm93
-IEguYihQLkNmKGIsYSxudWxsLG51bGwsbnVsbCkpCnJldHVybiBhW2JdfSwKWTpmdW5jdGlvbihhLGIs
-Yyl7dC5BLmEoYykKdGhyb3cgSC5iKFAuTDQoIkNhbm5vdCBhc3NpZ24gZWxlbWVudCBvZiBpbW11dGFi
-bGUgTGlzdC4iKSl9LApFOmZ1bmN0aW9uKGEsYil7aWYoYjwwfHxiPj1hLmxlbmd0aClyZXR1cm4gSC5P
-SChhLGIpCnJldHVybiBhW2JdfSwKJGliUToxLAokaVhqOjEsCiRpY1g6MSwKJGl6TToxfQpXLmNmLnBy
-b3RvdHlwZT17Cks6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyLHEscCxvCnQuZUEuYShiKQpmb3Iocz10aGlz
-LmdWKCkscj1zLmxlbmd0aCxxPXRoaXMuYSxwPTA7cDxzLmxlbmd0aDtzLmxlbmd0aD09PXJ8fCgwLEgu
-bGspKHMpLCsrcCl7bz1zW3BdCmIuJDIobyxxLmdldEF0dHJpYnV0ZShvKSl9fSwKZ1Y6ZnVuY3Rpb24o
-KXt2YXIgcyxyLHEscCxvLG4sbT10aGlzLmEuYXR0cmlidXRlcwptLnRvU3RyaW5nCnM9SC5WTShbXSx0
-LnMpCmZvcihyPW0ubGVuZ3RoLHE9dC5oOSxwPTA7cDxyOysrcCl7aWYocD49bS5sZW5ndGgpcmV0dXJu
-IEguT0gobSxwKQpvPXEuYShtW3BdKQppZihvLm5hbWVzcGFjZVVSST09bnVsbCl7bj1vLm5hbWUKbi50
-b1N0cmluZwpDLk5tLmkocyxuKX19cmV0dXJuIHN9LApnbDA6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMu
-Z1YoKS5sZW5ndGg9PT0wfX0KVy5pNy5wcm90b3R5cGU9ewp4NDpmdW5jdGlvbihhKXt2YXIgcz1ILm9U
-KHRoaXMuYS5oYXNBdHRyaWJ1dGUoYSkpCnJldHVybiBzfSwKcTpmdW5jdGlvbihhLGIpe3JldHVybiB0
-aGlzLmEuZ2V0QXR0cmlidXRlKEguaChiKSl9LApZOmZ1bmN0aW9uKGEsYixjKXt0aGlzLmEuc2V0QXR0
-cmlidXRlKGIsYyl9LApnQTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5nVigpLmxlbmd0aH19ClcuU3ku
-cHJvdG90eXBlPXsKeDQ6ZnVuY3Rpb24oYSl7dmFyIHM9SC5vVCh0aGlzLmEuYS5oYXNBdHRyaWJ1dGUo
-ImRhdGEtIit0aGlzLk8oYSkpKQpyZXR1cm4gc30sCnE6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5h
-LmEuZ2V0QXR0cmlidXRlKCJkYXRhLSIrdGhpcy5PKEguaChiKSkpfSwKWTpmdW5jdGlvbihhLGIsYyl7
-dGhpcy5hLmEuc2V0QXR0cmlidXRlKCJkYXRhLSIrdGhpcy5PKGIpLGMpfSwKSzpmdW5jdGlvbihhLGIp
-e3RoaXMuYS5LKDAsbmV3IFcuS1ModGhpcyx0LmVBLmEoYikpKX0sCmdWOmZ1bmN0aW9uKCl7dmFyIHM9
-SC5WTShbXSx0LnMpCnRoaXMuYS5LKDAsbmV3IFcuQTModGhpcyxzKSkKcmV0dXJuIHN9LApnQTpmdW5j
-dGlvbihhKXtyZXR1cm4gdGhpcy5nVigpLmxlbmd0aH0sCmdsMDpmdW5jdGlvbihhKXtyZXR1cm4gdGhp
-cy5nVigpLmxlbmd0aD09PTB9LAprOmZ1bmN0aW9uKGEpe3ZhciBzLHIscT1ILlZNKGEuc3BsaXQoIi0i
-KSx0LnMpCmZvcihzPTE7czxxLmxlbmd0aDsrK3Mpe3I9cVtzXQppZihyLmxlbmd0aD4wKUMuTm0uWShx
-LHMsclswXS50b1VwcGVyQ2FzZSgpK0ouS1YociwxKSl9cmV0dXJuIEMuTm0uSChxLCIiKX0sCk86ZnVu
-Y3Rpb24oYSl7dmFyIHMscixxLHAsbwpmb3Iocz1hLmxlbmd0aCxyPTAscT0iIjtyPHM7KytyKXtwPWFb
-cl0Kbz1wLnRvTG93ZXJDYXNlKCkKcT0ocCE9PW8mJnI+MD9xKyItIjpxKStvfXJldHVybiBxLmNoYXJD
-b2RlQXQoMCk9PTA/cTpxfX0KVy5LUy5wcm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe2lmKEouclko
-YSkubihhLCJkYXRhLSIpKXRoaXMuYi4kMih0aGlzLmEuayhDLnhCLkcoYSw1KSksYil9LAokUzoxMX0K
-Vy5BMy5wcm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe2lmKEouclkoYSkubihhLCJkYXRhLSIpKUMu
-Tm0uaSh0aGlzLmIsdGhpcy5hLmsoQy54Qi5HKGEsNSkpKX0sCiRTOjExfQpXLkk0LnByb3RvdHlwZT17
-ClA6ZnVuY3Rpb24oKXt2YXIgcyxyLHEscCxvPVAuTHModC5OKQpmb3Iocz10aGlzLmEuY2xhc3NOYW1l
-LnNwbGl0KCIgIikscj1zLmxlbmd0aCxxPTA7cTxyOysrcSl7cD1KLlQwKHNbcV0pCmlmKHAubGVuZ3Ro
-IT09MClvLmkoMCxwKX1yZXR1cm4gb30sClg6ZnVuY3Rpb24oYSl7dGhpcy5hLmNsYXNzTmFtZT10LkMu
-YShhKS5IKDAsIiAiKX0sCmdBOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmEuY2xhc3NMaXN0Lmxlbmd0
-aH0sCmdsMDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hLmNsYXNzTGlzdC5sZW5ndGg9PT0wfSwKZ29y
-OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmEuY2xhc3NMaXN0Lmxlbmd0aCE9PTB9LApWMTpmdW5jdGlv
-bihhKXt0aGlzLmEuY2xhc3NOYW1lPSIifSwKdGc6ZnVuY3Rpb24oYSxiKXt2YXIgcz10aGlzLmEuY2xh
-c3NMaXN0LmNvbnRhaW5zKGIpCnJldHVybiBzfSwKaTpmdW5jdGlvbihhLGIpe3ZhciBzPXRoaXMuYS5j
-bGFzc0xpc3Qscj1zLmNvbnRhaW5zKGIpCnMuYWRkKGIpCnJldHVybiFyfSwKUjpmdW5jdGlvbihhLGIp
-e3ZhciBzPXRoaXMuYS5jbGFzc0xpc3Qscj1zLmNvbnRhaW5zKGIpCnMucmVtb3ZlKGIpCnJldHVybiBy
-fSwKRlY6ZnVuY3Rpb24oYSxiKXtXLlROKHRoaXMuYSx0LlEuYShiKSl9fQpXLkZrLnByb3RvdHlwZT17
-fQpXLlJPLnByb3RvdHlwZT17fQpXLmV1LnByb3RvdHlwZT17fQpXLnhDLnByb3RvdHlwZT17fQpXLnZO
-LnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmEuJDEodC5CLmEoYSkpfSwKJFM6
-Mjh9ClcuSlEucHJvdG90eXBlPXsKQ1k6ZnVuY3Rpb24oYSl7dmFyIHMKaWYoJC5vci5hPT09MCl7Zm9y
-KHM9MDtzPDI2MjsrK3MpJC5vci5ZKDAsQy5jbVtzXSxXLnBTKCkpCmZvcihzPTA7czwxMjsrK3MpJC5v
-ci5ZKDAsQy5CSVtzXSxXLlY0KCkpfX0sCmkwOmZ1bmN0aW9uKGEpe3JldHVybiAkLkFOKCkudGcoMCxX
-LnJTKGEpKX0sCkViOmZ1bmN0aW9uKGEsYixjKXt2YXIgcz0kLm9yLnEoMCxILkVqKFcuclMoYSkpKyI6
-OiIrYikKaWYocz09bnVsbClzPSQub3IucSgwLCIqOjoiK2IpCmlmKHM9PW51bGwpcmV0dXJuITEKcmV0
-dXJuIEgueTgocy4kNChhLGIsYyx0aGlzKSl9LAokaWtGOjF9ClcuR20ucHJvdG90eXBlPXsKZ2t6OmZ1
-bmN0aW9uKGEpe3JldHVybiBuZXcgVy5XOShhLHRoaXMuZ0EoYSksSC56KGEpLkMoIlc5PEdtLkU+Iikp
-fX0KVy52RC5wcm90b3R5cGU9ewppMDpmdW5jdGlvbihhKXtyZXR1cm4gQy5ObS5Wcih0aGlzLmEsbmV3
-IFcuVXYoYSkpfSwKRWI6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBDLk5tLlZyKHRoaXMuYSxuZXcgVy5F
-ZyhhLGIsYykpfSwKJGlrRjoxfQpXLlV2LnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3JldHVybiB0
-LmY2LmEoYSkuaTAodGhpcy5hKX0sCiRTOjE2fQpXLkVnLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEp
-e3JldHVybiB0LmY2LmEoYSkuRWIodGhpcy5hLHRoaXMuYix0aGlzLmMpfSwKJFM6MTZ9ClcubTYucHJv
-dG90eXBlPXsKQ1k6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHMscixxCnRoaXMuYS5GVigwLGMpCnM9Yi5l
-digwLG5ldyBXLkVvKCkpCnI9Yi5ldigwLG5ldyBXLldrKCkpCnRoaXMuYi5GVigwLHMpCnE9dGhpcy5j
-CnEuRlYoMCxDLnhEKQpxLkZWKDAscil9LAppMDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hLnRnKDAs
-Vy5yUyhhKSl9LApFYjpmdW5jdGlvbihhLGIsYyl7dmFyIHM9dGhpcyxyPVcuclMoYSkscT1zLmMKaWYo
-cS50ZygwLEguRWoocikrIjo6IitiKSlyZXR1cm4gcy5kLkR0KGMpCmVsc2UgaWYocS50ZygwLCIqOjoi
-K2IpKXJldHVybiBzLmQuRHQoYykKZWxzZXtxPXMuYgppZihxLnRnKDAsSC5FaihyKSsiOjoiK2IpKXJl
-dHVybiEwCmVsc2UgaWYocS50ZygwLCIqOjoiK2IpKXJldHVybiEwCmVsc2UgaWYocS50ZygwLEguRWoo
-cikrIjo6KiIpKXJldHVybiEwCmVsc2UgaWYocS50ZygwLCIqOjoqIikpcmV0dXJuITB9cmV0dXJuITF9
-LAokaWtGOjF9ClcuRW8ucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIUMuTm0udGcoQy5C
-SSxILmgoYSkpfSwKJFM6Nn0KVy5Xay5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXtyZXR1cm4gQy5O
-bS50ZyhDLkJJLEguaChhKSl9LAokUzo2fQpXLmN0LnByb3RvdHlwZT17CkViOmZ1bmN0aW9uKGEsYixj
-KXtpZih0aGlzLmpGKGEsYixjKSlyZXR1cm4hMAppZihiPT09InRlbXBsYXRlIiYmYz09PSIiKXJldHVy
-biEwCmlmKGEuZ2V0QXR0cmlidXRlKCJ0ZW1wbGF0ZSIpPT09IiIpcmV0dXJuIHRoaXMuZS50ZygwLGIp
-CnJldHVybiExfX0KVy5JQS5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXtyZXR1cm4iVEVNUExBVEU6
-OiIrSC5FaihILmgoYSkpfSwKJFM6NX0KVy5Pdy5wcm90b3R5cGU9ewppMDpmdW5jdGlvbihhKXt2YXIg
-cwppZih0LmV3LmIoYSkpcmV0dXJuITEKcz10Lmc3LmIoYSkKaWYocyYmVy5yUyhhKT09PSJmb3JlaWdu
-T2JqZWN0IilyZXR1cm4hMQppZihzKXJldHVybiEwCnJldHVybiExfSwKRWI6ZnVuY3Rpb24oYSxiLGMp
-e2lmKGI9PT0iaXMifHxDLnhCLm4oYiwib24iKSlyZXR1cm4hMQpyZXR1cm4gdGhpcy5pMChhKX0sCiRp
-a0Y6MX0KVy5XOS5wcm90b3R5cGU9ewpGOmZ1bmN0aW9uKCl7dmFyIHM9dGhpcyxyPXMuYysxLHE9cy5i
-CmlmKHI8cSl7cy5zcChKLng5KHMuYSxyKSkKcy5jPXIKcmV0dXJuITB9cy5zcChudWxsKQpzLmM9cQpy
-ZXR1cm4hMX0sCmdsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZH0sCnNwOmZ1bmN0aW9uKGEpe3RoaXMu
-ZD10aGlzLiR0aS5DKCIxPyIpLmEoYSl9LAokaUFuOjF9ClcuZFcucHJvdG90eXBlPXsKZ21XOmZ1bmN0
-aW9uKGEpe3JldHVybiBXLkhIKHRoaXMuYS5sb2NhdGlvbil9LAokaUQwOjEsCiRpdjY6MX0KVy5GYi5w
-cm90b3R5cGU9e30KVy5tay5wcm90b3R5cGU9eyRpeTA6MX0KVy5Lby5wcm90b3R5cGU9ewpQbjpmdW5j
-dGlvbihhKXt2YXIgcz10aGlzLHI9bmV3IFcuZm0ocykKcy5iPSExCnIuJDIoYSxudWxsKQpmb3IoO3Mu
-Yjspe3MuYj0hMQpyLiQyKGEsbnVsbCl9fSwKRVA6ZnVuY3Rpb24oYSxiKXt2YXIgcz10aGlzLmI9ITAK
-aWYoYiE9bnVsbD9iIT09YS5wYXJlbnROb2RlOnMpSi5MdChhKQplbHNlIGIucmVtb3ZlQ2hpbGQoYSl9
-LApJNDpmdW5jdGlvbihhLGIpe3ZhciBzLHIscSxwLG8sbj0hMCxtPW51bGwsbD1udWxsCnRyeXttPUou
-aWcoYSkKbD1tLmEuZ2V0QXR0cmlidXRlKCJpcyIpCnQuaC5hKGEpCnM9ZnVuY3Rpb24oYyl7aWYoIShj
-LmF0dHJpYnV0ZXMgaW5zdGFuY2VvZiBOYW1lZE5vZGVNYXApKXJldHVybiB0cnVlCmlmKGMuaWQ9PSds
-YXN0Q2hpbGQnfHxjLm5hbWU9PSdsYXN0Q2hpbGQnfHxjLmlkPT0ncHJldmlvdXNTaWJsaW5nJ3x8Yy5u
-YW1lPT0ncHJldmlvdXNTaWJsaW5nJ3x8Yy5pZD09J2NoaWxkcmVuJ3x8Yy5uYW1lPT0nY2hpbGRyZW4n
-KXJldHVybiB0cnVlCnZhciBrPWMuY2hpbGROb2RlcwppZihjLmxhc3RDaGlsZCYmYy5sYXN0Q2hpbGQh
-PT1rW2subGVuZ3RoLTFdKXJldHVybiB0cnVlCmlmKGMuY2hpbGRyZW4paWYoIShjLmNoaWxkcmVuIGlu
-c3RhbmNlb2YgSFRNTENvbGxlY3Rpb258fGMuY2hpbGRyZW4gaW5zdGFuY2VvZiBOb2RlTGlzdCkpcmV0
-dXJuIHRydWUKdmFyIGo9MAppZihjLmNoaWxkcmVuKWo9Yy5jaGlsZHJlbi5sZW5ndGgKZm9yKHZhciBp
-PTA7aTxqO2krKyl7dmFyIGg9Yy5jaGlsZHJlbltpXQppZihoLmlkPT0nYXR0cmlidXRlcyd8fGgubmFt
-ZT09J2F0dHJpYnV0ZXMnfHxoLmlkPT0nbGFzdENoaWxkJ3x8aC5uYW1lPT0nbGFzdENoaWxkJ3x8aC5p
-ZD09J3ByZXZpb3VzU2libGluZyd8fGgubmFtZT09J3ByZXZpb3VzU2libGluZyd8fGguaWQ9PSdjaGls
-ZHJlbid8fGgubmFtZT09J2NoaWxkcmVuJylyZXR1cm4gdHJ1ZX1yZXR1cm4gZmFsc2V9KGEpCm49SC5v
-VChzKT8hMDohKGEuYXR0cmlidXRlcyBpbnN0YW5jZW9mIE5hbWVkTm9kZU1hcCl9Y2F0Y2gocCl7SC5S
-dShwKX1yPSJlbGVtZW50IHVucHJpbnRhYmxlIgp0cnl7cj1KLmooYSl9Y2F0Y2gocCl7SC5SdShwKX10
-cnl7cT1XLnJTKGEpCnRoaXMua1IodC5oLmEoYSksYixuLHIscSx0LmYuYShtKSxILmsobCkpfWNhdGNo
-KHApe2lmKEguUnUocCkgaW5zdGFuY2VvZiBQLnUpdGhyb3cgcAplbHNle3RoaXMuRVAoYSxiKQp3aW5k
-b3cKbz0iUmVtb3ZpbmcgY29ycnVwdGVkIGVsZW1lbnQgIitILkVqKHIpCmlmKHR5cGVvZiBjb25zb2xl
-IT0idW5kZWZpbmVkIil3aW5kb3cuY29uc29sZS53YXJuKG8pfX19LAprUjpmdW5jdGlvbihhLGIsYyxk
-LGUsZixnKXt2YXIgcyxyLHEscCxvLG4sbT10aGlzCmlmKGMpe20uRVAoYSxiKQp3aW5kb3cKcz0iUmVt
-b3ZpbmcgZWxlbWVudCBkdWUgdG8gY29ycnVwdGVkIGF0dHJpYnV0ZXMgb24gPCIrZCsiPiIKaWYodHlw
-ZW9mIGNvbnNvbGUhPSJ1bmRlZmluZWQiKXdpbmRvdy5jb25zb2xlLndhcm4ocykKcmV0dXJufWlmKCFt
-LmEuaTAoYSkpe20uRVAoYSxiKQp3aW5kb3cKcz0iUmVtb3ZpbmcgZGlzYWxsb3dlZCBlbGVtZW50IDwi
-K0guRWooZSkrIj4gZnJvbSAiK0guRWooYikKaWYodHlwZW9mIGNvbnNvbGUhPSJ1bmRlZmluZWQiKXdp
-bmRvdy5jb25zb2xlLndhcm4ocykKcmV0dXJufWlmKGchPW51bGwpaWYoIW0uYS5FYihhLCJpcyIsZykp
-e20uRVAoYSxiKQp3aW5kb3cKcz0iUmVtb3ZpbmcgZGlzYWxsb3dlZCB0eXBlIGV4dGVuc2lvbiA8IitI
-LkVqKGUpKycgaXM9IicrZysnIj4nCmlmKHR5cGVvZiBjb25zb2xlIT0idW5kZWZpbmVkIil3aW5kb3cu
-Y29uc29sZS53YXJuKHMpCnJldHVybn1zPWYuZ1YoKQpyPUguVk0ocy5zbGljZSgwKSxILnQ2KHMpLkMo
-ImpkPDE+IikpCmZvcihxPWYuZ1YoKS5sZW5ndGgtMSxzPWYuYTtxPj0wOy0tcSl7aWYocT49ci5sZW5n
-dGgpcmV0dXJuIEguT0gocixxKQpwPXJbcV0Kbz1tLmEKbj1KLmNIKHApCkguaChwKQppZighby5FYihh
-LG4scy5nZXRBdHRyaWJ1dGUocCkpKXt3aW5kb3cKbz0iUmVtb3ZpbmcgZGlzYWxsb3dlZCBhdHRyaWJ1
-dGUgPCIrSC5FaihlKSsiICIrcCsnPSInK0guRWoocy5nZXRBdHRyaWJ1dGUocCkpKyciPicKaWYodHlw
-ZW9mIGNvbnNvbGUhPSJ1bmRlZmluZWQiKXdpbmRvdy5jb25zb2xlLndhcm4obykKcy5yZW1vdmVBdHRy
-aWJ1dGUocCl9fWlmKHQuYVcuYihhKSl7cz1hLmNvbnRlbnQKcy50b1N0cmluZwptLlBuKHMpfX0sCiRp
-b246MX0KVy5mbS5wcm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe3ZhciBzLHIscSxwLG8sbixtPXRo
-aXMuYQpzd2l0Y2goYS5ub2RlVHlwZSl7Y2FzZSAxOm0uSTQoYSxiKQpicmVhawpjYXNlIDg6Y2FzZSAx
-MTpjYXNlIDM6Y2FzZSA0OmJyZWFrCmRlZmF1bHQ6bS5FUChhLGIpfXM9YS5sYXN0Q2hpbGQKZm9yKHE9
-dC5BO251bGwhPXM7KXtyPW51bGwKdHJ5e3I9cy5wcmV2aW91c1NpYmxpbmcKaWYociE9bnVsbCl7cD1y
-Lm5leHRTaWJsaW5nCm89cwpvPXA9PW51bGw/byE9bnVsbDpwIT09bwpwPW99ZWxzZSBwPSExCmlmKHAp
-e3A9UC5QVigiQ29ycnVwdCBIVE1MIikKdGhyb3cgSC5iKHApfX1jYXRjaChuKXtILlJ1KG4pCnA9cS5h
-KHMpCm0uYj0hMApvPXAucGFyZW50Tm9kZQpvPWE9PW51bGw/byE9bnVsbDphIT09bwppZihvKXtvPXAu
-cGFyZW50Tm9kZQppZihvIT1udWxsKW8ucmVtb3ZlQ2hpbGQocCl9ZWxzZSBhLnJlbW92ZUNoaWxkKHAp
-CnM9bnVsbApyPWEubGFzdENoaWxkfWlmKHMhPW51bGwpdGhpcy4kMihzLGEpCnM9cn19LAokUzozMX0K
-Vy5MZS5wcm90b3R5cGU9e30KVy5LNy5wcm90b3R5cGU9e30KVy5yQi5wcm90b3R5cGU9e30KVy5YVy5w
-cm90b3R5cGU9e30KVy5vYS5wcm90b3R5cGU9e30KUC5pSi5wcm90b3R5cGU9ewpWSDpmdW5jdGlvbihh
-KXt2YXIgcyxyPXRoaXMuYSxxPXIubGVuZ3RoCmZvcihzPTA7czxxOysrcylpZihyW3NdPT09YSlyZXR1
-cm4gcwpDLk5tLmkocixhKQpDLk5tLmkodGhpcy5iLG51bGwpCnJldHVybiBxfSwKUHY6ZnVuY3Rpb24o
-YSl7dmFyIHMscixxLHA9dGhpcyxvPXt9CmlmKGE9PW51bGwpcmV0dXJuIGEKaWYoSC5sKGEpKXJldHVy
-biBhCmlmKHR5cGVvZiBhPT0ibnVtYmVyIilyZXR1cm4gYQppZih0eXBlb2YgYT09InN0cmluZyIpcmV0
-dXJuIGEKaWYoYSBpbnN0YW5jZW9mIFAuaVApcmV0dXJuIG5ldyBEYXRlKGEuYSkKaWYodC5mdi5iKGEp
-KXRocm93IEguYihQLlNZKCJzdHJ1Y3R1cmVkIGNsb25lIG9mIFJlZ0V4cCIpKQppZih0LmM4LmIoYSkp
-cmV0dXJuIGEKaWYodC53LmIoYSkpcmV0dXJuIGEKaWYodC5JLmIoYSkpcmV0dXJuIGEKcz10LmRFLmIo
-YSl8fCExCmlmKHMpcmV0dXJuIGEKaWYodC5mLmIoYSkpe3I9cC5WSChhKQpzPXAuYgppZihyPj1zLmxl
-bmd0aClyZXR1cm4gSC5PSChzLHIpCnE9by5hPXNbcl0KaWYocSE9bnVsbClyZXR1cm4gcQpxPXt9Cm8u
-YT1xCkMuTm0uWShzLHIscSkKYS5LKDAsbmV3IFAuamcobyxwKSkKcmV0dXJuIG8uYX1pZih0LmouYihh
-KSl7cj1wLlZIKGEpCm89cC5iCmlmKHI+PW8ubGVuZ3RoKXJldHVybiBILk9IKG8scikKcT1vW3JdCmlm
-KHEhPW51bGwpcmV0dXJuIHEKcmV0dXJuIHAuZWsoYSxyKX1pZih0LmVILmIoYSkpe3I9cC5WSChhKQpz
-PXAuYgppZihyPj1zLmxlbmd0aClyZXR1cm4gSC5PSChzLHIpCnE9by5iPXNbcl0KaWYocSE9bnVsbCly
-ZXR1cm4gcQpxPXt9Cm8uYj1xCkMuTm0uWShzLHIscSkKcC5pbShhLG5ldyBQLlRhKG8scCkpCnJldHVy
-biBvLmJ9dGhyb3cgSC5iKFAuU1koInN0cnVjdHVyZWQgY2xvbmUgb2Ygb3RoZXIgdHlwZSIpKX0sCmVr
-OmZ1bmN0aW9uKGEsYil7dmFyIHMscj1KLlU2KGEpLHE9ci5nQShhKSxwPW5ldyBBcnJheShxKQpDLk5t
-LlkodGhpcy5iLGIscCkKZm9yKHM9MDtzPHE7KytzKUMuTm0uWShwLHMsdGhpcy5QdihyLnEoYSxzKSkp
-CnJldHVybiBwfX0KUC5qZy5wcm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe3RoaXMuYS5hW2FdPXRo
-aXMuYi5QdihiKX0sCiRTOjd9ClAuVGEucHJvdG90eXBlPXsKJDI6ZnVuY3Rpb24oYSxiKXt0aGlzLmEu
-YlthXT10aGlzLmIuUHYoYil9LAokUzo3fQpQLkJmLnByb3RvdHlwZT17CmltOmZ1bmN0aW9uKGEsYil7
-dmFyIHMscixxLHAKdC5iOC5hKGIpCmZvcihzPU9iamVjdC5rZXlzKGEpLHI9cy5sZW5ndGgscT0wO3E8
-cjsrK3Epe3A9c1txXQpiLiQyKHAsYVtwXSl9fX0KUC5Bcy5wcm90b3R5cGU9ewpUOmZ1bmN0aW9uKGEp
-e3ZhciBzCkguaChhKQpzPSQuaEcoKS5iCmlmKHR5cGVvZiBhIT0ic3RyaW5nIilILnYoSC50TChhKSkK
-aWYocy50ZXN0KGEpKXJldHVybiBhCnRocm93IEguYihQLkwzKGEsInZhbHVlIiwiTm90IGEgdmFsaWQg
-Y2xhc3MgdG9rZW4iKSl9LAp3OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLlAoKS5IKDAsIiAiKX0sCmdr
-ejpmdW5jdGlvbihhKXt2YXIgcz10aGlzLlAoKQpyZXR1cm4gUC5yaihzLHMucixILkxoKHMpLmMpfSwK
-Z2wwOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLlAoKS5hPT09MH0sCmdvcjpmdW5jdGlvbihhKXtyZXR1
-cm4gdGhpcy5QKCkuYSE9PTB9LApnQTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5QKCkuYX0sCnRnOmZ1
-bmN0aW9uKGEsYil7dGhpcy5UKGIpCnJldHVybiB0aGlzLlAoKS50ZygwLGIpfSwKaTpmdW5jdGlvbihh
-LGIpe3ZhciBzCnRoaXMuVChiKQpzPXRoaXMuT1MobmV3IFAuR0UoYikpCnJldHVybiBILnk4KHM9PW51
-bGw/ITE6cyl9LApSOmZ1bmN0aW9uKGEsYil7dmFyIHMscgp0aGlzLlQoYikKcz10aGlzLlAoKQpyPXMu
-UigwLGIpCnRoaXMuWChzKQpyZXR1cm4gcn0sCkZWOmZ1bmN0aW9uKGEsYil7dGhpcy5PUyhuZXcgUC5O
-Nyh0aGlzLHQuUS5hKGIpKSl9LAplUjpmdW5jdGlvbihhLGIpe3ZhciBzPXRoaXMuUCgpCnJldHVybiBI
-LmJLKHMsYixILkxoKHMpLmMpfSwKRTpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLlAoKS5FKDAsYil9
-LApWMTpmdW5jdGlvbihhKXt0aGlzLk9TKG5ldyBQLnVRKCkpfSwKT1M6ZnVuY3Rpb24oYSl7dmFyIHMs
-cgp0LmJVLmEoYSkKcz10aGlzLlAoKQpyPWEuJDEocykKdGhpcy5YKHMpCnJldHVybiByfX0KUC5HRS5w
-cm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXtyZXR1cm4gdC5DLmEoYSkuaSgwLHRoaXMuYSl9LAokUzoz
-M30KUC5ONy5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXt2YXIgcz10aGlzLmIscj1ILnQ2KHMpCnJl
-dHVybiB0LkMuYShhKS5GVigwLG5ldyBILmxKKHMsci5DKCJxVSgxKSIpLmEodGhpcy5hLmd1TSgpKSxy
-LkMoImxKPDEscVU+IikpKX0sCiRTOjE3fQpQLnVRLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3Qu
-Qy5hKGEpCmlmKGEuYT4wKXthLmI9YS5jPWEuZD1hLmU9YS5mPW51bGwKYS5hPTAKYS5TKCl9cmV0dXJu
-IG51bGx9LAokUzoxN30KUC5oRi5wcm90b3R5cGU9eyRpaEY6MX0KUC5QQy5wcm90b3R5cGU9ewokMTpm
-dW5jdGlvbihhKXt2YXIgcwp0LlkuYShhKQpzPWZ1bmN0aW9uKGIsYyxkKXtyZXR1cm4gZnVuY3Rpb24o
-KXtyZXR1cm4gYihjLGQsdGhpcyxBcnJheS5wcm90b3R5cGUuc2xpY2UuYXBwbHkoYXJndW1lbnRzKSl9
-fShQLlI0LGEsITEpClAuRG0ocywkLncoKSxhKQpyZXR1cm4gc30sCiRTOjR9ClAubXQucHJvdG90eXBl
-PXsKJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyB0aGlzLmEoYSl9LAokUzo0fQpQLk56LnByb3RvdHlw
-ZT17CiQxOmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgUC5yNyhhKX0sCiRTOjM1fQpQLlFTLnByb3RvdHlw
-ZT17CiQxOmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgUC5UeihhLHQuYW0pfSwKJFM6NTR9ClAubnAucHJv
-dG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBQLkU0KGEpfSwKJFM6Mzd9ClAuRTQucHJv
-dG90eXBlPXsKcTpmdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBiIT0ic3RyaW5nIiYmdHlwZW9mIGIhPSJu
-dW1iZXIiKXRocm93IEguYihQLnhZKCJwcm9wZXJ0eSBpcyBub3QgYSBTdHJpbmcgb3IgbnVtIikpCnJl
-dHVybiBQLmRVKHRoaXMuYVtiXSl9LApZOmZ1bmN0aW9uKGEsYixjKXtpZih0eXBlb2YgYiE9InN0cmlu
-ZyImJnR5cGVvZiBiIT0ibnVtYmVyIil0aHJvdyBILmIoUC54WSgicHJvcGVydHkgaXMgbm90IGEgU3Ry
-aW5nIG9yIG51bSIpKQp0aGlzLmFbYl09UC53WShjKX0sCkROOmZ1bmN0aW9uKGEsYil7aWYoYj09bnVs
-bClyZXR1cm4hMQpyZXR1cm4gYiBpbnN0YW5jZW9mIFAuRTQmJnRoaXMuYT09PWIuYX0sCnc6ZnVuY3Rp
-b24oYSl7dmFyIHMscgp0cnl7cz1TdHJpbmcodGhpcy5hKQpyZXR1cm4gc31jYXRjaChyKXtILlJ1KHIp
-CnM9dGhpcy54YigwKQpyZXR1cm4gc319LApWNzpmdW5jdGlvbihhLGIpe3ZhciBzLHI9dGhpcy5hCmlm
-KGI9PW51bGwpcz1udWxsCmVsc2V7cz1ILnQ2KGIpCnM9UC5DSChuZXcgSC5sSihiLHMuQygiQCgxKSIp
-LmEoUC5pRygpKSxzLkMoImxKPDEsQD4iKSksITAsdC56KX1yZXR1cm4gUC5kVShyW2FdLmFwcGx5KHIs
-cykpfSwKZ2lPOmZ1bmN0aW9uKGEpe3JldHVybiAwfX0KUC5yNy5wcm90b3R5cGU9e30KUC5Uei5wcm90
-b3R5cGU9ewpjUDpmdW5jdGlvbihhKXt2YXIgcz10aGlzLHI9YTwwfHxhPj1zLmdBKHMpCmlmKHIpdGhy
-b3cgSC5iKFAuVEUoYSwwLHMuZ0EocyksbnVsbCxudWxsKSl9LApxOmZ1bmN0aW9uKGEsYil7aWYoSC5v
-ayhiKSl0aGlzLmNQKGIpCnJldHVybiB0aGlzLiR0aS5jLmEodGhpcy5VcigwLGIpKX0sClk6ZnVuY3Rp
-b24oYSxiLGMpe3RoaXMuY1AoYikKdGhpcy5lNCgwLGIsYyl9LApnQTpmdW5jdGlvbihhKXt2YXIgcz10
-aGlzLmEubGVuZ3RoCmlmKHR5cGVvZiBzPT09Im51bWJlciImJnM+Pj4wPT09cylyZXR1cm4gcwp0aHJv
-dyBILmIoUC5QVigiQmFkIEpzQXJyYXkgbGVuZ3RoIikpfSwKJGliUToxLAokaWNYOjEsCiRpek06MX0K
-UC5jby5wcm90b3R5cGU9e30KUC5uZC5wcm90b3R5cGU9eyRpbmQ6MX0KUC5LZS5wcm90b3R5cGU9ewpQ
-OmZ1bmN0aW9uKCl7dmFyIHMscixxLHAsbz10aGlzLmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpLG49UC5M
-cyh0Lk4pCmlmKG89PW51bGwpcmV0dXJuIG4KZm9yKHM9by5zcGxpdCgiICIpLHI9cy5sZW5ndGgscT0w
-O3E8cjsrK3Epe3A9Si5UMChzW3FdKQppZihwLmxlbmd0aCE9PTApbi5pKDAscCl9cmV0dXJuIG59LApY
-OmZ1bmN0aW9uKGEpe3RoaXMuYS5zZXRBdHRyaWJ1dGUoImNsYXNzIixhLkgoMCwiICIpKX19ClAuaGku
-cHJvdG90eXBlPXsKZ0Q6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBQLktlKGEpfSwKc2hmOmZ1bmN0aW9u
-KGEsYil7dGhpcy5ZQyhhLGIpfSwKcjY6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHMscixxLHAsbyxuCmlm
-KGQ9PW51bGwpe3M9SC5WTShbXSx0LnYpCmQ9bmV3IFcudkQocykKQy5ObS5pKHMsVy5UdyhudWxsKSkK
-Qy5ObS5pKHMsVy5CbCgpKQpDLk5tLmkocyxuZXcgVy5PdygpKX1jPW5ldyBXLktvKGQpCnI9Jzxzdmcg
-dmVyc2lvbj0iMS4xIj4nK0guRWooYikrIjwvc3ZnPiIKcz1kb2N1bWVudApxPXMuYm9keQpxLnRvU3Ry
-aW5nCnA9Qy5SWS5BSChxLHIsYykKbz1zLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKQpwLnRvU3RyaW5n
-CnM9bmV3IFcuZTcocCkKbj1zLmdyOChzKQpmb3IoO3M9bi5maXJzdENoaWxkLHMhPW51bGw7KW8uYXBw
-ZW5kQ2hpbGQocykKcmV0dXJuIG99LApuejpmdW5jdGlvbihhLGIsYyxkLGUpe3Rocm93IEguYihQLkw0
-KCJDYW5ub3QgaW52b2tlIGluc2VydEFkamFjZW50SHRtbCBvbiBTVkcuIikpfSwKZ1ZsOmZ1bmN0aW9u
-KGEpe3JldHVybiBuZXcgVy5ldShhLCJjbGljayIsITEsdC5rKX0sCiRpaGk6MX0KTS5INy5wcm90b3R5
-cGU9ewp3OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmJ9fQpVLkxMLnByb3RvdHlwZT17Ckx0OmZ1bmN0
-aW9uKCl7cmV0dXJuIFAuRUYoWyJub2RlSWQiLHRoaXMuYiwia2luZCIsdGhpcy5hLmFdLHQuWCx0Ll8p
-fX0KVS5NRC5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXtyZXR1cm4gdC5mRS5hKGEpLmE9PT10aGlz
-LmEucSgwLCJraW5kIil9LAokUzozOH0KVS5kMi5wcm90b3R5cGU9ewpMdDpmdW5jdGlvbigpe3ZhciBz
-LHIscSxwLG89dGhpcyxuPXQuWCxtPXQuXyxsPVAuRmwobixtKSxrPW8uYQppZihrIT1udWxsKXtzPUgu
-Vk0oW10sdC5HKQpmb3Iocj1rLmxlbmd0aCxxPTA7cTxrLmxlbmd0aDtrLmxlbmd0aD09PXJ8fCgwLEgu
-bGspKGspLCsrcSl7cD1rW3FdCkMuTm0uaShzLFAuRUYoWyJkZXNjcmlwdGlvbiIscC5hLCJocmVmIixw
-LmJdLG4sbSkpfWwuWSgwLCJlZGl0cyIscyl9bC5ZKDAsImV4cGxhbmF0aW9uIixvLmIpCmwuWSgwLCJs
-aW5lIixvLmMpCmwuWSgwLCJkaXNwbGF5UGF0aCIsby5kKQpsLlkoMCwidXJpUGF0aCIsby5lKQpuPW8u
-ZgppZihuIT1udWxsKXttPUguVk0oW10sdC5HKQpmb3Ioaz1uLmxlbmd0aCxxPTA7cTxuLmxlbmd0aDtu
-Lmxlbmd0aD09PWt8fCgwLEgubGspKG4pLCsrcSlDLk5tLmkobSxuW3FdLkx0KCkpCmwuWSgwLCJ0cmFj
-ZXMiLG0pfXJldHVybiBsfX0KVS5TZS5wcm90b3R5cGU9ewpMdDpmdW5jdGlvbigpe3JldHVybiBQLkVG
-KFsiZGVzY3JpcHRpb24iLHRoaXMuYSwiaHJlZiIsdGhpcy5iXSx0LlgsdC5fKX19ClUuTWwucHJvdG90
-eXBlPXsKTHQ6ZnVuY3Rpb24oKXtyZXR1cm4gUC5FRihbImhyZWYiLHRoaXMuYSwibGluZSIsdGhpcy5i
-LCJwYXRoIix0aGlzLmNdLHQuWCx0Ll8pfX0KVS55RC5wcm90b3R5cGU9ewpMdDpmdW5jdGlvbigpe3Zh
-ciBzLHIscSxwPUguVk0oW10sdC5HKQpmb3Iocz10aGlzLmIscj1zLmxlbmd0aCxxPTA7cTxzLmxlbmd0
-aDtzLmxlbmd0aD09PXJ8fCgwLEgubGspKHMpLCsrcSlDLk5tLmkocCxzW3FdLkx0KCkpCnJldHVybiBQ
-LkVGKFsiZGVzY3JpcHRpb24iLHRoaXMuYSwiZW50cmllcyIscF0sdC5YLHQuXyl9fQpVLndiLnByb3Rv
-dHlwZT17Ckx0OmZ1bmN0aW9uKCl7dmFyIHMscixxLHA9dGhpcyxvPVAuRmwodC5YLHQuXykKby5ZKDAs
-ImRlc2NyaXB0aW9uIixwLmEpCnM9cC5iCmlmKHMhPW51bGwpby5ZKDAsImZ1bmN0aW9uIixzKQpzPXAu
-YwppZihzIT1udWxsKW8uWSgwLCJsaW5rIixzLkx0KCkpCnM9cC5kCmlmKHMubGVuZ3RoIT09MCl7cj1I
-LnQ2KHMpCnE9ci5DKCJsSjwxLFowPHFVKixNaCo+Kj4iKQpvLlkoMCwiaGludEFjdGlvbnMiLFAuQ0go
-bmV3IEgubEoocyxyLkMoIlowPHFVKixNaCo+KigxKSIpLmEobmV3IFUuYjAoKSkscSksITAscS5DKCJh
-TC5FIikpKX1yZXR1cm4gb319ClUuYU4ucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIFUu
-bnoodC50LmEoYSkpfSwKJFM6Mzl9ClUuYjAucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7cmV0dXJu
-IHQuYVguYShhKS5MdCgpfSwKJFM6NDB9CkIuajgucHJvdG90eXBlPXsKTHQ6ZnVuY3Rpb24oKXtyZXR1
-cm4gUC5FRihbImxpbmUiLHRoaXMuYSwiZXhwbGFuYXRpb24iLHRoaXMuYiwib2Zmc2V0Iix0aGlzLmNd
-LHQuWCx0Ll8pfX0KQi5xcC5wcm90b3R5cGU9ewpMdDpmdW5jdGlvbigpe3ZhciBzLHIscSxwLG8sbixt
-LGw9dGhpcyxrPXQuWCxqPVAuRmwoayx0LmRwKQpmb3Iocz1sLmQscz1zLmdQdShzKSxzPXMuZ2t6KHMp
-LHI9dC5fLHE9dC5HO3MuRigpOyl7cD1zLmdsKCkKbz1wLmEKbj1ILlZNKFtdLHEpCmZvcihwPUouSVQo
-cC5iKTtwLkYoKTspe209cC5nbCgpCkMuTm0uaShuLFAuRUYoWyJsaW5lIixtLmEsImV4cGxhbmF0aW9u
-IixtLmIsIm9mZnNldCIsbS5jXSxrLHIpKX1qLlkoMCxvLG4pfXJldHVybiBQLkVGKFsicmVnaW9ucyIs
-bC5hLCJuYXZpZ2F0aW9uQ29udGVudCIsbC5iLCJzb3VyY2VDb2RlIixsLmMsImVkaXRzIixqXSxrLHIp
-fX0KVC5tUS5wcm90b3R5cGU9e30KTC5lLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3ZhciBzLHIs
-cSxwLG8sbixtCnQuYUwuYShhKQpzPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZQpyPUwuRzYod2luZG93
-LmxvY2F0aW9uLmhyZWYpCnE9TC5hSyh3aW5kb3cubG9jYXRpb24uaHJlZikKTC5HZSgpCmlmKHMhPT0i
-LyImJnMhPT1KLlQwKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5yb290IikudGV4dENvbnRlbnQpKUwu
-RzcocyxyLHEsITAsbmV3IEwuVlcocyxyLHEpKQpwPWRvY3VtZW50Cm89Si5xRihwLnF1ZXJ5U2VsZWN0
-b3IoIi5hcHBseS1taWdyYXRpb24iKSkKbj1vLiR0aQptPW4uQygifigxKT8iKS5hKG5ldyBMLm9aKCkp
-CnQuWi5hKG51bGwpClcuSkUoby5hLG8uYixtLCExLG4uYykKbj1KLnFGKHAucXVlcnlTZWxlY3Rvcigi
-LnJlcnVuLW1pZ3JhdGlvbiIpKQptPW4uJHRpClcuSkUobi5hLG4uYixtLkMoIn4oMSk/IikuYShuZXcg
-TC5IaSgpKSwhMSxtLmMpCm09Si5xRihwLnF1ZXJ5U2VsZWN0b3IoIi5yZXBvcnQtcHJvYmxlbSIpKQpu
-PW0uJHRpClcuSkUobS5hLG0uYixuLkMoIn4oMSk/IikuYShuZXcgTC5CVCgpKSwhMSxuLmMpCnA9Si5x
-RihwLnF1ZXJ5U2VsZWN0b3IoIi5wb3B1cC1wYW5lIC5jbG9zZSIpKQpuPXAuJHRpClcuSkUocC5hLHAu
-YixuLkMoIn4oMSk/IikuYShuZXcgTC5QWSgpKSwhMSxuLmMpfSwKJFM6MTh9CkwuVlcucHJvdG90eXBl
-PXsKJDA6ZnVuY3Rpb24oKXtMLkZyKHRoaXMuYSx0aGlzLmIsdGhpcy5jKX0sCiRTOjB9Ckwub1oucHJv
-dG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dmFyIHMscixxLHAKdC5PLmEoYSkKaWYoSC5vVChDLm9sLnVz
-KHdpbmRvdywiVGhpcyB3aWxsIGFwcGx5IHRoZSBjaGFuZ2VzIHlvdSd2ZSBwcmV2aWV3ZWQgdG8geW91
-ciB3b3JraW5nIGRpcmVjdG9yeS4gSXQgaXMgcmVjb21tZW5kZWQgeW91IGNvbW1pdCBhbnkgY2hhbmdl
-cyB5b3UgbWFkZSBiZWZvcmUgZG9pbmcgdGhpcy4iKSkpe3M9TC50eSgiL2FwcGx5LW1pZ3JhdGlvbiIs
-bnVsbCkuVzcobmV3IEwuanIoKSx0LlApCnI9bmV3IEwucWwoKQp0LmI3LmEobnVsbCkKcT1zLiR0aQpw
-PSQuWDMKaWYocCE9PUMuTlUpcj1QLlZIKHIscCkKcy54ZihuZXcgUC5GZShuZXcgUC52cyhwLHEpLDIs
-bnVsbCxyLHEuQygiQDwxPiIpLktxKHEuYykuQygiRmU8MSwyPiIpKSl9fSwKJFM6Mn0KTC5qci5wcm90
-b3R5cGU9ewokMTpmdW5jdGlvbihhKXt2YXIgcwp0LnQuYShhKQpzPWRvY3VtZW50LmJvZHkKcy5jbGFz
-c0xpc3QucmVtb3ZlKCJwcm9wb3NlZCIpCnMuY2xhc3NMaXN0LmFkZCgiYXBwbGllZCIpfSwKJFM6NDN9
-CkwucWwucHJvdG90eXBlPXsKJDI6ZnVuY3Rpb24oYSxiKXtMLkMyKCJDb3VsZCBub3QgYXBwbHkgbWln
-cmF0aW9uIixhLGIpfSwKJEM6IiQyIiwKJFI6MiwKJFM6N30KTC5IaS5wcm90b3R5cGU9ewokMTpmdW5j
-dGlvbihhKXtyZXR1cm4gdGhpcy54bih0Lk8uYShhKSl9LAp4bjpmdW5jdGlvbihhKXt2YXIgcz0wLHI9
-UC5GWCh0LlApLHE9MSxwLG89W10sbixtLGwsayxqCnZhciAkYXN5bmMkJDE9UC5seihmdW5jdGlvbihi
-LGMpe2lmKGI9PT0xKXtwPWMKcz1xfXdoaWxlKHRydWUpc3dpdGNoKHMpe2Nhc2UgMDpxPTMKZG9jdW1l
-bnQuYm9keS5jbGFzc0xpc3QuYWRkKCJyZXJ1bm5pbmciKQpzPTYKcmV0dXJuIFAualEoTC50eSgiL3Jl
-cnVuLW1pZ3JhdGlvbiIsbnVsbCksJGFzeW5jJCQxKQpjYXNlIDY6bj1jCmlmKEgub1QoSC55OChKLng5
-KG4sInN1Y2Nlc3MiKSkpKXdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKQplbHNlIEwuSzAodC5tLmEoSi54
-OShuLCJlcnJvcnMiKSkpCm8ucHVzaCg1KQpzPTQKYnJlYWsKY2FzZSAzOnE9MgpqPXAKbT1ILlJ1KGop
-Cmw9SC50cyhqKQpMLkMyKCJGYWlsZWQgdG8gcmVydW4gbWlncmF0aW9uIixtLGwpCm8ucHVzaCg1KQpz
-PTQKYnJlYWsKY2FzZSAyOm89WzFdCmNhc2UgNDpxPTEKZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVt
-b3ZlKCJyZXJ1bm5pbmciKQpzPW8ucG9wKCkKYnJlYWsKY2FzZSA1OnJldHVybiBQLnlDKG51bGwscikK
-Y2FzZSAxOnJldHVybiBQLmYzKHAscil9fSkKcmV0dXJuIFAuREkoJGFzeW5jJCQxLHIpfSwKJFM6MTl9
-CkwuQlQucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dmFyIHMKdC5PLmEoYSkKcz10LlgKQy5vbC5Q
-byh3aW5kb3csUC5YZCgiaHR0cHMiLCJnaXRodWIuY29tIiwiZGFydC1sYW5nL3Nkay9pc3N1ZXMvbmV3
-IixQLkVGKFsidGl0bGUiLCJDdXN0b21lci1yZXBvcnRlZCBpc3N1ZSB3aXRoIE5OQkQgbWlncmF0aW9u
-IHRvb2wiLCJsYWJlbHMiLHUuZCwiYm9keSIsIiMjIyMgU3RlcHMgdG8gcmVwcm9kdWNlXG5cbiMjIyMg
-V2hhdCBkaWQgeW91IGV4cGVjdCB0byBoYXBwZW4/XG5cbiMjIyMgV2hhdCBhY3R1YWxseSBoYXBwZW5l
-ZD9cblxuX1NjcmVlbnNob3RzIGFyZSBhcHByZWNpYXRlZF9cblxuKipEYXJ0IFNESyB2ZXJzaW9uKio6
-ICIrSC5Faihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic2RrLXZlcnNpb24iKS50ZXh0Q29udGVudCkr
-IlxuXG5UaGFua3MgZm9yIGZpbGluZyFcbiJdLHMscykpLmduRCgpLCJyZXBvcnQtcHJvYmxlbSIpfSwK
-JFM6Mn0KTC5QWS5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXt2YXIgcwp0Lk8uYShhKQpzPWRvY3Vt
-ZW50LnF1ZXJ5U2VsZWN0b3IoIi5wb3B1cC1wYW5lIikuc3R5bGUKcy5kaXNwbGF5PSJub25lIgpyZXR1
-cm4ibm9uZSJ9LAokUzo0NX0KTC5MLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3ZhciBzLHIscQp0
-LmFMLmEoYSkKcz13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUKcj1MLkc2KHdpbmRvdy5sb2NhdGlvbi5o
-cmVmKQpxPUwuYUsod2luZG93LmxvY2F0aW9uLmhyZWYpCmlmKHMubGVuZ3RoPjEpTC5HNyhzLHIscSwh
-MSxudWxsKQplbHNle0wuQkUocyxCLndSKCksITApCkwuQlgoIiZuYnNwOyIsbnVsbCl9fSwKJFM6MTh9
-CkwuV3gucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dmFyIHMscixxLHA9ImNvbGxhcHNlZCIKdC5P
-LmEoYSkKcz10aGlzLmEKcj1KLllFKHMpCnE9dGhpcy5iCmlmKCFyLmdEKHMpLnRnKDAscCkpe3IuZ0Qo
-cykuaSgwLHApCkouZFIocSkuaSgwLHApfWVsc2V7ci5nRChzKS5SKDAscCkKSi5kUihxKS5SKDAscCl9
-fSwKJFM6Mn0KTC5BTy5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXt2YXIgcz1KLnFGKHQuZy5hKGEp
-KSxyPXMuJHRpLHE9ci5DKCJ+KDEpPyIpLmEobmV3IEwuZE4odGhpcy5hKSkKdC5aLmEobnVsbCkKVy5K
-RShzLmEscy5iLHEsITEsci5jKX0sCiRTOjN9CkwuZE4ucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7
-dmFyIHMKdC5PLmEoYSkKcz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJ0YWJsZVtkYXRhLXBhdGhdIikK
-cy50b1N0cmluZwpMLnQyKGEsdGhpcy5hLHMuZ2V0QXR0cmlidXRlKCJkYXRhLSIrbmV3IFcuU3kobmV3
-IFcuaTcocykpLk8oInBhdGgiKSkpfSwKJFM6Mn0KTC5Iby5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihh
-KXt2YXIgcyxyLHEKdC5nLmEoYSkKcz1KLnFGKGEpCnI9cy4kdGkKcT1yLkMoIn4oMSk/IikuYShuZXcg
-TC54eihhLHRoaXMuYSkpCnQuWi5hKG51bGwpClcuSkUocy5hLHMuYixxLCExLHIuYyl9LAokUzozfQpM
-Lnh6LnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3ZhciBzCnQuTy5hKGEpCnM9dGhpcy5hCkwuaFgo
-dGhpcy5iLFAuUUEocy5nZXRBdHRyaWJ1dGUoImRhdGEtIituZXcgVy5TeShuZXcgVy5pNyhzKSkuTygi
-b2Zmc2V0IikpLG51bGwpLFAuUUEocy5nZXRBdHRyaWJ1dGUoImRhdGEtIituZXcgVy5TeShuZXcgVy5p
-NyhzKSkuTygibGluZSIpKSxudWxsKSl9LAokUzoyfQpMLklDLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9u
-KGEpe3ZhciBzPUoucUYodC5nLmEoYSkpLHI9cy4kdGkKci5DKCJ+KDEpPyIpLmEoTC5pUygpKQp0Llou
-YShudWxsKQpXLkpFKHMuYSxzLmIsTC5pUygpLCExLHIuYyl9LAokUzozfQpMLmZDLnByb3RvdHlwZT17
-CiQxOmZ1bmN0aW9uKGEpe3QuZVEuYShhKQp0aGlzLmEuYU0oMCx0aGlzLmIpfSwKJFM6NDd9CkwudWUu
-cHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dC5hdy5hKGEpCnJldHVybiBILkVqKGEucSgwLCJzZXZl
-cml0eSIpKSsiIC0gIitILkVqKGEucSgwLCJtZXNzYWdlIikpKyIgYXQgIitILkVqKGEucSgwLCJsb2Nh
-dGlvbiIpKSsiIC0gKCIrSC5FaihhLnEoMCwiY29kZSIpKSsiKSJ9LAokUzo0OH0KTC5uVC5wcm90b3R5
-cGU9ewokMDpmdW5jdGlvbigpe0wuRnIodGhpcy5hLHRoaXMuYix0aGlzLmMpfSwKJFM6MH0KTC5OWS5w
-cm90b3R5cGU9ewokMDpmdW5jdGlvbigpe0wuRnIodGhpcy5hLG51bGwsbnVsbCl9LAokUzowfQpMLmVY
-LnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3QuZy5hKGEpCiQuekIoKS50b1N0cmluZwp0LmRILmEo
-JC5vdygpLnEoMCwiaGxqcyIpKS5WNygiaGlnaGxpZ2h0QmxvY2siLFthXSl9LAokUzozfQpMLkVFLnBy
-b3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3ZhciBzLHIKdC5PLmEoYSkucHJldmVudERlZmF1bHQoKQpz
-PXRoaXMuYQpyPXRoaXMuYgpMLmFmKHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSxzLHIsITAsbmV3IEwu
-UUwocyxyKSkKTC5oWCh0aGlzLmMscyxyKX0sCiRTOjJ9CkwuUUwucHJvdG90eXBlPXsKJDA6ZnVuY3Rp
-b24oKXtMLkZyKHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSx0aGlzLmEsdGhpcy5iKX0sCiRTOjB9Ckwu
-VlMucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dmFyIHMscj0ic2VsZWN0ZWQtZmlsZSIKdC5nLmEo
-YSkKYS50b1N0cmluZwpzPUouWUUoYSkKaWYoYS5nZXRBdHRyaWJ1dGUoImRhdGEtIituZXcgVy5TeShu
-ZXcgVy5pNyhhKSkuTygibmFtZSIpKT09PXRoaXMuYS5hKXMuZ0QoYSkuaSgwLHIpCmVsc2Ugcy5nRChh
-KS5SKDAscil9LAokUzozfQpMLlRELnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3JldHVybiBMLnQy
-KHQuTy5hKGEpLCEwLG51bGwpfSwKJFM6MjB9CkwuQVMucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7
-cmV0dXJuIHRoaXMuUEwodC5PLmEoYSkpfSwKUEw6ZnVuY3Rpb24oYSl7dmFyIHM9MCxyPVAuRlgodC5Q
-KSxxPTEscCxvPVtdLG49dGhpcyxtLGwsayxqLGksaAp2YXIgJGFzeW5jJCQxPVAubHooZnVuY3Rpb24o
-YixjKXtpZihiPT09MSl7cD1jCnM9cX13aGlsZSh0cnVlKXN3aXRjaChzKXtjYXNlIDA6cT0zCmo9dC5Y
-CnM9NgpyZXR1cm4gUC5qUShMLnR5KEwuUTQoIi9hcHBseS1oaW50IixQLkZsKGosaikpLG4uYS5MdCgp
-KSwkYXN5bmMkJDEpCmNhc2UgNjpqPW4uYgptPUwuVXMoai5hKQpMLkc3KG0sbnVsbCxqLmIsITEsbnVs
-bCkKZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCJuZWVkcy1yZXJ1biIpCnE9MQpzPTUKYnJlYWsK
-Y2FzZSAzOnE9MgpoPXAKbD1ILlJ1KGgpCms9SC50cyhoKQpMLkMyKCJDb3VsZCBub3QgYXBwbHkgaGlu
-dCIsbCxrKQpzPTUKYnJlYWsKY2FzZSAyOnM9MQpicmVhawpjYXNlIDU6cmV0dXJuIFAueUMobnVsbCxy
-KQpjYXNlIDE6cmV0dXJuIFAuZjMocCxyKX19KQpyZXR1cm4gUC5ESSgkYXN5bmMkJDEscil9LAokUzox
-OX0KTC5YQS5wcm90b3R5cGU9ewpFYjpmdW5jdGlvbihhLGIsYyl7cmV0dXJuITB9LAppMDpmdW5jdGlv
-bihhKXtyZXR1cm4hMH0sCiRpa0Y6MX0KTC5aWi5wcm90b3R5cGU9ewpMdDpmdW5jdGlvbigpe3ZhciBz
-LHI9dGhpcyxxPVAuRmwodC5YLHQuXykKcS5ZKDAsInR5cGUiLEwudnkoci5hKSkKcS5ZKDAsIm5hbWUi
-LHIuYikKcz1yLmMKaWYocyE9bnVsbClxLlkoMCwic3VidHJlZSIsTC5WRChzKSkKcz1yLmQKaWYocyE9
-bnVsbClxLlkoMCwicGF0aCIscykKcz1yLmUKaWYocyE9bnVsbClxLlkoMCwiaHJlZiIscykKcz1yLmYK
-aWYocyE9bnVsbClxLlkoMCwiZWRpdENvdW50IixzKQpyZXR1cm4gcX19CkwuTzkucHJvdG90eXBlPXsK
-dzpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5ifX0KTS5sSS5wcm90b3R5cGU9ewpnbDpmdW5jdGlvbigp
-e3ZhciBzPUQuYWIoKQpyZXR1cm4gc30sCldPOmZ1bmN0aW9uKGEsYil7dmFyIHMscixxPXQuZDQKTS5Z
-RigiYWJzb2x1dGUiLEguVk0oW2IsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGxdLHEpKQpzPXRo
-aXMuYQpzPXMuWXIoYik+MCYmIXMuaEsoYikKaWYocylyZXR1cm4gYgpyPUguVk0oW3RoaXMuZ2woKSxi
-LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsXSxxKQpNLllGKCJqb2luIixyKQpyZXR1cm4gdGhp
-cy5JUChuZXcgSC51NihyLHQuZUopKX0sCnpmOmZ1bmN0aW9uKGEpe3ZhciBzLHIscT1YLkNMKGEsdGhp
-cy5hKQpxLklWKCkKcz1xLmQKcj1zLmxlbmd0aAppZihyPT09MCl7cz1xLmIKcmV0dXJuIHM9PW51bGw/
-Ii4iOnN9aWYocj09PTEpe3M9cS5iCnJldHVybiBzPT1udWxsPyIuIjpzfWlmKDA+PXIpcmV0dXJuIEgu
-T0gocywtMSkKcy5wb3AoKQpzPXEuZQppZigwPj1zLmxlbmd0aClyZXR1cm4gSC5PSChzLC0xKQpzLnBv
-cCgpCnEuSVYoKQpyZXR1cm4gcS53KDApfSwKSVA6ZnVuY3Rpb24oYSl7dmFyIHMscixxLHAsbyxuLG0s
-bCxrLGoKdC5RLmEoYSkKZm9yKHM9YS4kdGkscj1zLkMoImEyKGNYLkUpIikuYShuZXcgTS5xNygpKSxx
-PWEuZ2t6KGEpLHM9bmV3IEguU08ocSxyLHMuQygiU088Y1guRT4iKSkscj10aGlzLmEscD0hMSxvPSEx
-LG49IiI7cy5GKCk7KXttPXEuZ2woKQppZihyLmhLKG0pJiZvKXtsPVguQ0wobSxyKQprPW4uY2hhckNv
-ZGVBdCgwKT09MD9uOm4Kbj1DLnhCLk5qKGssMCxyLlNwKGssITApKQpsLmI9bgppZihyLmRzKG4pKUMu
-Tm0uWShsLmUsMCxyLmdtSSgpKQpuPWwudygwKX1lbHNlIGlmKHIuWXIobSk+MCl7bz0hci5oSyhtKQpu
-PUguRWoobSl9ZWxzZXtqPW0ubGVuZ3RoCmlmKGohPT0wKXtpZigwPj1qKXJldHVybiBILk9IKG0sMCkK
-aj1yLlVkKG1bMF0pfWVsc2Ugaj0hMQppZighailpZihwKW4rPXIuZ21JKCkKbis9bX1wPXIuZHMobSl9
-cmV0dXJuIG4uY2hhckNvZGVBdCgwKT09MD9uOm59LApvNTpmdW5jdGlvbihhKXt2YXIgcwppZighdGhp
-cy55MyhhKSlyZXR1cm4gYQpzPVguQ0woYSx0aGlzLmEpCnMuclIoKQpyZXR1cm4gcy53KDApfSwKeTM6
-ZnVuY3Rpb24oYSl7dmFyIHMscixxLHAsbyxuLG0sbCxrLGoKYS50b1N0cmluZwpzPXRoaXMuYQpyPXMu
-WXIoYSkKaWYociE9PTApe2lmKHM9PT0kLktrKCkpZm9yKHE9MDtxPHI7KytxKWlmKEMueEIuVyhhLHEp
-PT09NDcpcmV0dXJuITAKcD1yCm89NDd9ZWxzZXtwPTAKbz1udWxsfWZvcihuPW5ldyBILnFqKGEpLmEs
-bT1uLmxlbmd0aCxxPXAsbD1udWxsO3E8bTsrK3EsbD1vLG89ayl7az1DLnhCLm0obixxKQppZihzLnI0
-KGspKXtpZihzPT09JC5LaygpJiZrPT09NDcpcmV0dXJuITAKaWYobyE9bnVsbCYmcy5yNChvKSlyZXR1
-cm4hMAppZihvPT09NDYpaj1sPT1udWxsfHxsPT09NDZ8fHMucjQobCkKZWxzZSBqPSExCmlmKGopcmV0
-dXJuITB9fWlmKG89PW51bGwpcmV0dXJuITAKaWYocy5yNChvKSlyZXR1cm4hMAppZihvPT09NDYpcz1s
-PT1udWxsfHxzLnI0KGwpfHxsPT09NDYKZWxzZSBzPSExCmlmKHMpcmV0dXJuITAKcmV0dXJuITF9LApI
-UDpmdW5jdGlvbihhLGIpe3ZhciBzLHIscSxwLG8sbixtLGw9dGhpcyxrPSdVbmFibGUgdG8gZmluZCBh
-IHBhdGggdG8gIicKYj1sLldPKDAsYikKcz1sLmEKaWYocy5ZcihiKTw9MCYmcy5ZcihhKT4wKXJldHVy
-biBsLm81KGEpCmlmKHMuWXIoYSk8PTB8fHMuaEsoYSkpYT1sLldPKDAsYSkKaWYocy5ZcihhKTw9MCYm
-cy5ZcihiKT4wKXRocm93IEguYihYLkk3KGsrSC5FaihhKSsnIiBmcm9tICInK0guRWooYikrJyIuJykp
-CnI9WC5DTChiLHMpCnIuclIoKQpxPVguQ0woYSxzKQpxLnJSKCkKcD1yLmQKbz1wLmxlbmd0aAppZihv
-IT09MCl7aWYoMD49bylyZXR1cm4gSC5PSChwLDApCnA9Si5STShwWzBdLCIuIil9ZWxzZSBwPSExCmlm
-KHApcmV0dXJuIHEudygwKQpwPXIuYgpvPXEuYgppZihwIT1vKXA9cD09bnVsbHx8bz09bnVsbHx8IXMu
-TmMocCxvKQplbHNlIHA9ITEKaWYocClyZXR1cm4gcS53KDApCndoaWxlKCEwKXtwPXIuZApvPXAubGVu
-Z3RoCmlmKG8hPT0wKXtuPXEuZAptPW4ubGVuZ3RoCmlmKG0hPT0wKXtpZigwPj1vKXJldHVybiBILk9I
-KHAsMCkKcD1wWzBdCmlmKDA+PW0pcmV0dXJuIEguT0gobiwwKQpuPXMuTmMocCxuWzBdKQpwPW59ZWxz
-ZSBwPSExfWVsc2UgcD0hMQppZighcClicmVhawpDLk5tLlc0KHIuZCwwKQpDLk5tLlc0KHIuZSwxKQpD
-Lk5tLlc0KHEuZCwwKQpDLk5tLlc0KHEuZSwxKX1wPXIuZApvPXAubGVuZ3RoCmlmKG8hPT0wKXtpZigw
-Pj1vKXJldHVybiBILk9IKHAsMCkKcD1KLlJNKHBbMF0sIi4uIil9ZWxzZSBwPSExCmlmKHApdGhyb3cg
-SC5iKFguSTcoaytILkVqKGEpKyciIGZyb20gIicrSC5FaihiKSsnIi4nKSkKcD10Lk4KQy5ObS5VRyhx
-LmQsMCxQLk84KHIuZC5sZW5ndGgsIi4uIiwhMSxwKSkKQy5ObS5ZKHEuZSwwLCIiKQpDLk5tLlVHKHEu
-ZSwxLFAuTzgoci5kLmxlbmd0aCxzLmdtSSgpLCExLHApKQpzPXEuZApwPXMubGVuZ3RoCmlmKHA9PT0w
-KXJldHVybiIuIgppZihwPjEmJkouUk0oQy5ObS5ncloocyksIi4iKSl7cz1xLmQKaWYoMD49cy5sZW5n
-dGgpcmV0dXJuIEguT0gocywtMSkKcy5wb3AoKQpzPXEuZQppZigwPj1zLmxlbmd0aClyZXR1cm4gSC5P
-SChzLC0xKQpzLnBvcCgpCmlmKDA+PXMubGVuZ3RoKXJldHVybiBILk9IKHMsLTEpCnMucG9wKCkKQy5O
-bS5pKHMsIiIpfXEuYj0iIgpxLklWKCkKcmV0dXJuIHEudygwKX19Ck0ucTcucHJvdG90eXBlPXsKJDE6
-ZnVuY3Rpb24oYSl7cmV0dXJuIEguaChhKSE9PSIifSwKJFM6Nn0KTS5Oby5wcm90b3R5cGU9ewokMTpm
-dW5jdGlvbihhKXtILmsoYSkKcmV0dXJuIGE9PW51bGw/Im51bGwiOiciJythKyciJ30sCiRTOjUwfQpC
-LmZ2LnByb3RvdHlwZT17CnhaOmZ1bmN0aW9uKGEpe3ZhciBzLHI9dGhpcy5ZcihhKQppZihyPjApcmV0
-dXJuIEoubGQoYSwwLHIpCmlmKHRoaXMuaEsoYSkpe2lmKDA+PWEubGVuZ3RoKXJldHVybiBILk9IKGEs
-MCkKcz1hWzBdfWVsc2Ugcz1udWxsCnJldHVybiBzfSwKTmM6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYT09
-Yn19ClguV0QucHJvdG90eXBlPXsKSVY6ZnVuY3Rpb24oKXt2YXIgcyxyLHE9dGhpcwp3aGlsZSghMCl7
-cz1xLmQKaWYoIShzLmxlbmd0aCE9PTAmJkouUk0oQy5ObS5ncloocyksIiIpKSlicmVhawpzPXEuZApp
-ZigwPj1zLmxlbmd0aClyZXR1cm4gSC5PSChzLC0xKQpzLnBvcCgpCnM9cS5lCmlmKDA+PXMubGVuZ3Ro
-KXJldHVybiBILk9IKHMsLTEpCnMucG9wKCl9cz1xLmUKcj1zLmxlbmd0aAppZihyIT09MClDLk5tLlko
-cyxyLTEsIiIpfSwKclI6ZnVuY3Rpb24oKXt2YXIgcyxyLHEscCxvLG4sbT10aGlzLGw9SC5WTShbXSx0
-LnMpCmZvcihzPW0uZCxyPXMubGVuZ3RoLHE9MCxwPTA7cDxzLmxlbmd0aDtzLmxlbmd0aD09PXJ8fCgw
-LEgubGspKHMpLCsrcCl7bz1zW3BdCm49Si5pYShvKQppZighKG4uRE4obywiLiIpfHxuLkROKG8sIiIp
-KSlpZihuLkROKG8sIi4uIikpe249bC5sZW5ndGgKaWYobiE9PTApe2lmKDA+PW4pcmV0dXJuIEguT0go
-bCwtMSkKbC5wb3AoKX1lbHNlICsrcX1lbHNlIEMuTm0uaShsLG8pfWlmKG0uYj09bnVsbClDLk5tLlVH
-KGwsMCxQLk84KHEsIi4uIiwhMSx0Lk4pKQppZihsLmxlbmd0aD09PTAmJm0uYj09bnVsbClDLk5tLmko
-bCwiLiIpCm0uc25KKGwpCnM9bS5hCm0uc1BoKFAuTzgobC5sZW5ndGgrMSxzLmdtSSgpLCEwLHQuTikp
-CnI9bS5iCmlmKHI9PW51bGx8fGwubGVuZ3RoPT09MHx8IXMuZHMocikpQy5ObS5ZKG0uZSwwLCIiKQpy
-PW0uYgppZihyIT1udWxsJiZzPT09JC5LaygpKXtyLnRvU3RyaW5nCm0uYj1ILnlzKHIsIi8iLCJcXCIp
-fW0uSVYoKX0sCnc6ZnVuY3Rpb24oYSl7dmFyIHMscixxPXRoaXMscD1xLmIKcD1wIT1udWxsP3A6IiIK
-Zm9yKHM9MDtzPHEuZC5sZW5ndGg7KytzKXtyPXEuZQppZihzPj1yLmxlbmd0aClyZXR1cm4gSC5PSChy
-LHMpCnI9cCtILkVqKHJbc10pCnA9cS5kCmlmKHM+PXAubGVuZ3RoKXJldHVybiBILk9IKHAscykKcD1y
-K0guRWoocFtzXSl9cCs9SC5FaihDLk5tLmdyWihxLmUpKQpyZXR1cm4gcC5jaGFyQ29kZUF0KDApPT0w
-P3A6cH0sCnNuSjpmdW5jdGlvbihhKXt0aGlzLmQ9dC5FLmEoYSl9LApzUGg6ZnVuY3Rpb24oYSl7dGhp
-cy5lPXQuRS5hKGEpfX0KWC5kdi5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3JldHVybiJQYXRoRXhj
-ZXB0aW9uOiAiK3RoaXMuYX0sCiRpUno6MX0KTy56TC5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3Jl
-dHVybiB0aGlzLmdvYyh0aGlzKX19CkUuT0YucHJvdG90eXBlPXsKVWQ6ZnVuY3Rpb24oYSl7cmV0dXJu
-IEMueEIudGcoYSwiLyIpfSwKcjQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT00N30sCmRzOmZ1bmN0aW9u
-KGEpe3ZhciBzPWEubGVuZ3RoCnJldHVybiBzIT09MCYmQy54Qi5tKGEscy0xKSE9PTQ3fSwKU3A6ZnVu
-Y3Rpb24oYSxiKXtpZihhLmxlbmd0aCE9PTAmJkMueEIuVyhhLDApPT09NDcpcmV0dXJuIDEKcmV0dXJu
-IDB9LApZcjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5TcChhLCExKX0sCmhLOmZ1bmN0aW9uKGEpe3Jl
-dHVybiExfSwKZ29jOmZ1bmN0aW9uKCl7cmV0dXJuInBvc2l4In0sCmdtSTpmdW5jdGlvbigpe3JldHVy
-biIvIn19CkYucnUucHJvdG90eXBlPXsKVWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIEMueEIudGcoYSwiLyIp
-fSwKcjQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT00N30sCmRzOmZ1bmN0aW9uKGEpe3ZhciBzPWEubGVu
-Z3RoCmlmKHM9PT0wKXJldHVybiExCmlmKEMueEIubShhLHMtMSkhPT00NylyZXR1cm4hMApyZXR1cm4g
-Qy54Qi5UYyhhLCI6Ly8iKSYmdGhpcy5ZcihhKT09PXN9LApTcDpmdW5jdGlvbihhLGIpe3ZhciBzLHIs
-cSxwLG89YS5sZW5ndGgKaWYobz09PTApcmV0dXJuIDAKaWYoQy54Qi5XKGEsMCk9PT00NylyZXR1cm4g
-MQpmb3Iocz0wO3M8bzsrK3Mpe3I9Qy54Qi5XKGEscykKaWYocj09PTQ3KXJldHVybiAwCmlmKHI9PT01
-OCl7aWYocz09PTApcmV0dXJuIDAKcT1DLnhCLlhVKGEsIi8iLEMueEIuUWkoYSwiLy8iLHMrMSk/cysz
-OnMpCmlmKHE8PTApcmV0dXJuIG8KaWYoIWJ8fG88cSszKXJldHVybiBxCmlmKCFDLnhCLm4oYSwiZmls
-ZTovLyIpKXJldHVybiBxCmlmKCFCLll1KGEscSsxKSlyZXR1cm4gcQpwPXErMwpyZXR1cm4gbz09PXA/
-cDpxKzR9fXJldHVybiAwfSwKWXI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuU3AoYSwhMSl9LApoSzpm
-dW5jdGlvbihhKXtyZXR1cm4gYS5sZW5ndGghPT0wJiZDLnhCLlcoYSwwKT09PTQ3fSwKZ29jOmZ1bmN0
-aW9uKCl7cmV0dXJuInVybCJ9LApnbUk6ZnVuY3Rpb24oKXtyZXR1cm4iLyJ9fQpMLklWLnByb3RvdHlw
+dHJpbmcKcz1uZXcgVy5lNyhzKQpxPXMuZ3I4KHMpCnEudG9TdHJpbmcKcz1uZXcgVy5lNyhxKQpwPXMu
+Z3I4KHMpCnIudG9TdHJpbmcKcC50b1N0cmluZwpuZXcgVy5lNyhyKS5GVigwLG5ldyBXLmU3KHApKQpy
+ZXR1cm4gcn19ClcuV1AucHJvdG90eXBlPXsKcjY6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHMscixxCmlm
+KCJjcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQiIGluIHdpbmRvdy5SYW5nZS5wcm90b3R5cGUpcmV0dXJu
+IHRoaXMuRFcoYSxiLGMsZCkKcz1kb2N1bWVudApyPXMuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpCnM9
+Qy5JZS5yNihzLmNyZWF0ZUVsZW1lbnQoInRhYmxlIiksYixjLGQpCnMudG9TdHJpbmcKcz1uZXcgVy5l
+NyhzKQpxPXMuZ3I4KHMpCnIudG9TdHJpbmcKcS50b1N0cmluZwpuZXcgVy5lNyhyKS5GVigwLG5ldyBX
+LmU3KHEpKQpyZXR1cm4gcn19ClcueVkucHJvdG90eXBlPXsKcGs6ZnVuY3Rpb24oYSxiLGMpe3ZhciBz
+LHIKdGhpcy5zYTQoYSxudWxsKQpzPWEuY29udGVudApzLnRvU3RyaW5nCkouYlQocykKcj10aGlzLnI2
+KGEsYixudWxsLGMpCmEuY29udGVudC5hcHBlbmRDaGlsZChyKX0sCllDOmZ1bmN0aW9uKGEsYil7cmV0
+dXJuIHRoaXMucGsoYSxiLG51bGwpfSwKJGl5WToxfQpXLnc2LnByb3RvdHlwZT17fQpXLks1LnByb3Rv
+dHlwZT17ClBvOmZ1bmN0aW9uKGEsYixjKXt2YXIgcz1XLlAxKGEub3BlbihiLGMpKQpyZXR1cm4gc30s
+CmdtVzpmdW5jdGlvbihhKXtyZXR1cm4gYS5sb2NhdGlvbn0sCnVzOmZ1bmN0aW9uKGEsYil7cmV0dXJu
+IGEuY29uZmlybShiKX0sCiRpSzU6MSwKJGl2NjoxfQpXLkNtLnByb3RvdHlwZT17JGlDbToxfQpXLkNR
+LnByb3RvdHlwZT17JGlDUToxfQpXLnc0LnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7dmFyIHMscj1h
+LmxlZnQKci50b1N0cmluZwpyPSJSZWN0YW5nbGUgKCIrSC5FaihyKSsiLCAiCnM9YS50b3AKcy50b1N0
+cmluZwpzPXIrSC5FaihzKSsiKSAiCnI9YS53aWR0aApyLnRvU3RyaW5nCnI9cytILkVqKHIpKyIgeCAi
+CnM9YS5oZWlnaHQKcy50b1N0cmluZwpyZXR1cm4gcitILkVqKHMpfSwKRE46ZnVuY3Rpb24oYSxiKXt2
+YXIgcyxyCmlmKGI9PW51bGwpcmV0dXJuITEKaWYodC5xLmIoYikpe3M9YS5sZWZ0CnMudG9TdHJpbmcK
+cj1iLmxlZnQKci50b1N0cmluZwppZihzPT09cil7cz1hLnRvcApzLnRvU3RyaW5nCnI9Yi50b3AKci50
+b1N0cmluZwppZihzPT09cil7cz1hLndpZHRoCnMudG9TdHJpbmcKcj1iLndpZHRoCnIudG9TdHJpbmcK
+aWYocz09PXIpe3M9YS5oZWlnaHQKcy50b1N0cmluZwpyPWIuaGVpZ2h0CnIudG9TdHJpbmcKcj1zPT09
+cgpzPXJ9ZWxzZSBzPSExfWVsc2Ugcz0hMX1lbHNlIHM9ITF9ZWxzZSBzPSExCnJldHVybiBzfSwKZ2lP
+OmZ1bmN0aW9uKGEpe3ZhciBzLHIscSxwPWEubGVmdApwLnRvU3RyaW5nCnA9Qy5DRC5naU8ocCkKcz1h
+LnRvcApzLnRvU3RyaW5nCnM9Qy5DRC5naU8ocykKcj1hLndpZHRoCnIudG9TdHJpbmcKcj1DLkNELmdp
+TyhyKQpxPWEuaGVpZ2h0CnEudG9TdHJpbmcKcmV0dXJuIFcuckUocCxzLHIsQy5DRC5naU8ocSkpfX0K
+Vy5yaC5wcm90b3R5cGU9ewpnQTpmdW5jdGlvbihhKXtyZXR1cm4gYS5sZW5ndGh9LApxOmZ1bmN0aW9u
+KGEsYil7SC51UChiKQppZihiPj4+MCE9PWJ8fGI+PWEubGVuZ3RoKXRocm93IEguYihQLkNmKGIsYSxu
+dWxsLG51bGwsbnVsbCkpCnJldHVybiBhW2JdfSwKWTpmdW5jdGlvbihhLGIsYyl7dC5BLmEoYykKdGhy
+b3cgSC5iKFAuTDQoIkNhbm5vdCBhc3NpZ24gZWxlbWVudCBvZiBpbW11dGFibGUgTGlzdC4iKSl9LApF
+OmZ1bmN0aW9uKGEsYil7aWYoYjwwfHxiPj1hLmxlbmd0aClyZXR1cm4gSC5PSChhLGIpCnJldHVybiBh
+W2JdfSwKJGliUToxLAokaVhqOjEsCiRpY1g6MSwKJGl6TToxfQpXLmNmLnByb3RvdHlwZT17Cks6ZnVu
+Y3Rpb24oYSxiKXt2YXIgcyxyLHEscCxvCnQuZUEuYShiKQpmb3Iocz10aGlzLmdWKCkscj1zLmxlbmd0
+aCxxPXRoaXMuYSxwPTA7cDxzLmxlbmd0aDtzLmxlbmd0aD09PXJ8fCgwLEgubGspKHMpLCsrcCl7bz1z
+W3BdCmIuJDIobyxxLmdldEF0dHJpYnV0ZShvKSl9fSwKZ1Y6ZnVuY3Rpb24oKXt2YXIgcyxyLHEscCxv
+LG4sbT10aGlzLmEuYXR0cmlidXRlcwptLnRvU3RyaW5nCnM9SC5WTShbXSx0LnMpCmZvcihyPW0ubGVu
+Z3RoLHE9dC5oOSxwPTA7cDxyOysrcCl7aWYocD49bS5sZW5ndGgpcmV0dXJuIEguT0gobSxwKQpvPXEu
+YShtW3BdKQppZihvLm5hbWVzcGFjZVVSST09bnVsbCl7bj1vLm5hbWUKbi50b1N0cmluZwpDLk5tLmko
+cyxuKX19cmV0dXJuIHN9LApnbDA6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZ1YoKS5sZW5ndGg9PT0w
+fX0KVy5pNy5wcm90b3R5cGU9ewp4NDpmdW5jdGlvbihhKXt2YXIgcz1ILm9UKHRoaXMuYS5oYXNBdHRy
+aWJ1dGUoYSkpCnJldHVybiBzfSwKcTpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmEuZ2V0QXR0cmli
+dXRlKEguaChiKSl9LApZOmZ1bmN0aW9uKGEsYixjKXt0aGlzLmEuc2V0QXR0cmlidXRlKGIsYyl9LApn
+QTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5nVigpLmxlbmd0aH19ClcuU3kucHJvdG90eXBlPXsKeDQ6
+ZnVuY3Rpb24oYSl7dmFyIHM9SC5vVCh0aGlzLmEuYS5oYXNBdHRyaWJ1dGUoImRhdGEtIit0aGlzLk8o
+YSkpKQpyZXR1cm4gc30sCnE6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5hLmEuZ2V0QXR0cmlidXRl
+KCJkYXRhLSIrdGhpcy5PKEguaChiKSkpfSwKWTpmdW5jdGlvbihhLGIsYyl7dGhpcy5hLmEuc2V0QXR0
+cmlidXRlKCJkYXRhLSIrdGhpcy5PKGIpLGMpfSwKSzpmdW5jdGlvbihhLGIpe3RoaXMuYS5LKDAsbmV3
+IFcuS1ModGhpcyx0LmVBLmEoYikpKX0sCmdWOmZ1bmN0aW9uKCl7dmFyIHM9SC5WTShbXSx0LnMpCnRo
+aXMuYS5LKDAsbmV3IFcuQTModGhpcyxzKSkKcmV0dXJuIHN9LApnQTpmdW5jdGlvbihhKXtyZXR1cm4g
+dGhpcy5nVigpLmxlbmd0aH0sCmdsMDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5nVigpLmxlbmd0aD09
+PTB9LAprOmZ1bmN0aW9uKGEpe3ZhciBzLHIscT1ILlZNKGEuc3BsaXQoIi0iKSx0LnMpCmZvcihzPTE7
+czxxLmxlbmd0aDsrK3Mpe3I9cVtzXQppZihyLmxlbmd0aD4wKUMuTm0uWShxLHMsclswXS50b1VwcGVy
+Q2FzZSgpK0ouS1YociwxKSl9cmV0dXJuIEMuTm0uSChxLCIiKX0sCk86ZnVuY3Rpb24oYSl7dmFyIHMs
+cixxLHAsbwpmb3Iocz1hLmxlbmd0aCxyPTAscT0iIjtyPHM7KytyKXtwPWFbcl0Kbz1wLnRvTG93ZXJD
+YXNlKCkKcT0ocCE9PW8mJnI+MD9xKyItIjpxKStvfXJldHVybiBxLmNoYXJDb2RlQXQoMCk9PTA/cTpx
+fX0KVy5LUy5wcm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe2lmKEouclkoYSkubihhLCJkYXRhLSIp
+KXRoaXMuYi4kMih0aGlzLmEuayhDLnhCLkcoYSw1KSksYil9LAokUzoxMH0KVy5BMy5wcm90b3R5cGU9
+ewokMjpmdW5jdGlvbihhLGIpe2lmKEouclkoYSkubihhLCJkYXRhLSIpKUMuTm0uaSh0aGlzLmIsdGhp
+cy5hLmsoQy54Qi5HKGEsNSkpKX0sCiRTOjEwfQpXLkk0LnByb3RvdHlwZT17ClA6ZnVuY3Rpb24oKXt2
+YXIgcyxyLHEscCxvPVAuTHModC5OKQpmb3Iocz10aGlzLmEuY2xhc3NOYW1lLnNwbGl0KCIgIikscj1z
+Lmxlbmd0aCxxPTA7cTxyOysrcSl7cD1KLlQwKHNbcV0pCmlmKHAubGVuZ3RoIT09MClvLmkoMCxwKX1y
+ZXR1cm4gb30sClg6ZnVuY3Rpb24oYSl7dGhpcy5hLmNsYXNzTmFtZT10LkMuYShhKS5IKDAsIiAiKX0s
+CmdBOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmEuY2xhc3NMaXN0Lmxlbmd0aH0sCmdsMDpmdW5jdGlv
+bihhKXtyZXR1cm4gdGhpcy5hLmNsYXNzTGlzdC5sZW5ndGg9PT0wfSwKZ29yOmZ1bmN0aW9uKGEpe3Jl
+dHVybiB0aGlzLmEuY2xhc3NMaXN0Lmxlbmd0aCE9PTB9LApWMTpmdW5jdGlvbihhKXt0aGlzLmEuY2xh
+c3NOYW1lPSIifSwKdGc6ZnVuY3Rpb24oYSxiKXt2YXIgcz10aGlzLmEuY2xhc3NMaXN0LmNvbnRhaW5z
+KGIpCnJldHVybiBzfSwKaTpmdW5jdGlvbihhLGIpe3ZhciBzLHIKSC5oKGIpCnM9dGhpcy5hLmNsYXNz
+TGlzdApyPXMuY29udGFpbnMoYikKcy5hZGQoYikKcmV0dXJuIXJ9LApSOmZ1bmN0aW9uKGEsYil7dmFy
+IHMscixxCmlmKHR5cGVvZiBiPT0ic3RyaW5nIil7cz10aGlzLmEuY2xhc3NMaXN0CnI9cy5jb250YWlu
+cyhiKQpzLnJlbW92ZShiKQpxPXJ9ZWxzZSBxPSExCnJldHVybiBxfSwKRlY6ZnVuY3Rpb24oYSxiKXtX
+LlROKHRoaXMuYSx0LlEuYShiKSl9fQpXLkZrLnByb3RvdHlwZT17fQpXLlJPLnByb3RvdHlwZT17fQpX
+LmV1LnByb3RvdHlwZT17fQpXLnhDLnByb3RvdHlwZT17fQpXLnZOLnByb3RvdHlwZT17CiQxOmZ1bmN0
+aW9uKGEpe3JldHVybiB0aGlzLmEuJDEodC5CLmEoYSkpfSwKJFM6Mjh9ClcuSlEucHJvdG90eXBlPXsK
+Q1k6ZnVuY3Rpb24oYSl7dmFyIHMKaWYoJC5vci5hPT09MCl7Zm9yKHM9MDtzPDI2MjsrK3MpJC5vci5Z
+KDAsQy5jbVtzXSxXLnBTKCkpCmZvcihzPTA7czwxMjsrK3MpJC5vci5ZKDAsQy5CSVtzXSxXLlY0KCkp
+fX0sCmkwOmZ1bmN0aW9uKGEpe3JldHVybiAkLkFOKCkudGcoMCxXLnJTKGEpKX0sCkViOmZ1bmN0aW9u
+KGEsYixjKXt2YXIgcz0kLm9yLnEoMCxILkVqKFcuclMoYSkpKyI6OiIrYikKaWYocz09bnVsbClzPSQu
+b3IucSgwLCIqOjoiK2IpCmlmKHM9PW51bGwpcmV0dXJuITEKcmV0dXJuIEgueTgocy4kNChhLGIsYyx0
+aGlzKSl9LAokaWtGOjF9ClcuR20ucHJvdG90eXBlPXsKZ206ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBX
+Llc5KGEsdGhpcy5nQShhKSxILnooYSkuQygiVzk8R20uRT4iKSl9fQpXLnZELnByb3RvdHlwZT17Cmkw
+OmZ1bmN0aW9uKGEpe3JldHVybiBDLk5tLlZyKHRoaXMuYSxuZXcgVy5VdihhKSl9LApFYjpmdW5jdGlv
+bihhLGIsYyl7cmV0dXJuIEMuTm0uVnIodGhpcy5hLG5ldyBXLkVnKGEsYixjKSl9LAokaWtGOjF9Clcu
+VXYucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIHQuZjYuYShhKS5pMCh0aGlzLmEpfSwK
+JFM6MTV9ClcuRWcucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIHQuZjYuYShhKS5FYih0
+aGlzLmEsdGhpcy5iLHRoaXMuYyl9LAokUzoxNX0KVy5tNi5wcm90b3R5cGU9ewpDWTpmdW5jdGlvbihh
+LGIsYyxkKXt2YXIgcyxyLHEKdGhpcy5hLkZWKDAsYykKcz1iLmV2KDAsbmV3IFcuRW8oKSkKcj1iLmV2
+KDAsbmV3IFcuV2soKSkKdGhpcy5iLkZWKDAscykKcT10aGlzLmMKcS5GVigwLEMueEQpCnEuRlYoMCxy
+KX0sCmkwOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmEudGcoMCxXLnJTKGEpKX0sCkViOmZ1bmN0aW9u
+KGEsYixjKXt2YXIgcz10aGlzLHI9Vy5yUyhhKSxxPXMuYwppZihxLnRnKDAsSC5FaihyKSsiOjoiK2Ip
+KXJldHVybiBzLmQuRHQoYykKZWxzZSBpZihxLnRnKDAsIio6OiIrYikpcmV0dXJuIHMuZC5EdChjKQpl
+bHNle3E9cy5iCmlmKHEudGcoMCxILkVqKHIpKyI6OiIrYikpcmV0dXJuITAKZWxzZSBpZihxLnRnKDAs
+Iio6OiIrYikpcmV0dXJuITAKZWxzZSBpZihxLnRnKDAsSC5FaihyKSsiOjoqIikpcmV0dXJuITAKZWxz
+ZSBpZihxLnRnKDAsIio6OioiKSlyZXR1cm4hMH1yZXR1cm4hMX0sCiRpa0Y6MX0KVy5Fby5wcm90b3R5
+cGU9ewokMTpmdW5jdGlvbihhKXtyZXR1cm4hQy5ObS50ZyhDLkJJLEguaChhKSl9LAokUzo2fQpXLldr
+LnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3JldHVybiBDLk5tLnRnKEMuQkksSC5oKGEpKX0sCiRT
+OjZ9ClcuY3QucHJvdG90eXBlPXsKRWI6ZnVuY3Rpb24oYSxiLGMpe2lmKHRoaXMuakYoYSxiLGMpKXJl
+dHVybiEwCmlmKGI9PT0idGVtcGxhdGUiJiZjPT09IiIpcmV0dXJuITAKaWYoYS5nZXRBdHRyaWJ1dGUo
+InRlbXBsYXRlIik9PT0iIilyZXR1cm4gdGhpcy5lLnRnKDAsYikKcmV0dXJuITF9fQpXLklBLnByb3Rv
+dHlwZT17CiQxOmZ1bmN0aW9uKGEpe3JldHVybiJURU1QTEFURTo6IitILkVqKEguaChhKSl9LAokUzo1
+fQpXLk93LnByb3RvdHlwZT17CmkwOmZ1bmN0aW9uKGEpe3ZhciBzCmlmKHQuZXcuYihhKSlyZXR1cm4h
+MQpzPXQuZzcuYihhKQppZihzJiZXLnJTKGEpPT09ImZvcmVpZ25PYmplY3QiKXJldHVybiExCmlmKHMp
+cmV0dXJuITAKcmV0dXJuITF9LApFYjpmdW5jdGlvbihhLGIsYyl7aWYoYj09PSJpcyJ8fEMueEIubihi
+LCJvbiIpKXJldHVybiExCnJldHVybiB0aGlzLmkwKGEpfSwKJGlrRjoxfQpXLlc5LnByb3RvdHlwZT17
+CkY6ZnVuY3Rpb24oKXt2YXIgcz10aGlzLHI9cy5jKzEscT1zLmIKaWYocjxxKXtzLnNwKEoueDkocy5h
+LHIpKQpzLmM9cgpyZXR1cm4hMH1zLnNwKG51bGwpCnMuYz1xCnJldHVybiExfSwKZ2w6ZnVuY3Rpb24o
+KXtyZXR1cm4gdGhpcy5kfSwKc3A6ZnVuY3Rpb24oYSl7dGhpcy5kPXRoaXMuJHRpLkMoIjE/IikuYShh
+KX0sCiRpQW46MX0KVy5kVy5wcm90b3R5cGU9eyRpRDA6MSwkaXY2OjF9ClcubWsucHJvdG90eXBlPXsk
+aXkwOjF9ClcuS28ucHJvdG90eXBlPXsKUG46ZnVuY3Rpb24oYSl7dmFyIHM9dGhpcyxyPW5ldyBXLmZt
+KHMpCnMuYj0hMQpyLiQyKGEsbnVsbCkKZm9yKDtzLmI7KXtzLmI9ITEKci4kMihhLG51bGwpfX0sCkVQ
+OmZ1bmN0aW9uKGEsYil7dmFyIHM9dGhpcy5iPSEwCmlmKGIhPW51bGw/YiE9PWEucGFyZW50Tm9kZTpz
+KUouTHQoYSkKZWxzZSBiLnJlbW92ZUNoaWxkKGEpfSwKSTQ6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyLHEs
+cCxvLG49ITAsbT1udWxsLGw9bnVsbAp0cnl7bT1KLmlnKGEpCmw9bS5hLmdldEF0dHJpYnV0ZSgiaXMi
+KQp0LmguYShhKQpzPWZ1bmN0aW9uKGMpe2lmKCEoYy5hdHRyaWJ1dGVzIGluc3RhbmNlb2YgTmFtZWRO
+b2RlTWFwKSlyZXR1cm4gdHJ1ZQppZihjLmlkPT0nbGFzdENoaWxkJ3x8Yy5uYW1lPT0nbGFzdENoaWxk
+J3x8Yy5pZD09J3ByZXZpb3VzU2libGluZyd8fGMubmFtZT09J3ByZXZpb3VzU2libGluZyd8fGMuaWQ9
+PSdjaGlsZHJlbid8fGMubmFtZT09J2NoaWxkcmVuJylyZXR1cm4gdHJ1ZQp2YXIgaz1jLmNoaWxkTm9k
+ZXMKaWYoYy5sYXN0Q2hpbGQmJmMubGFzdENoaWxkIT09a1trLmxlbmd0aC0xXSlyZXR1cm4gdHJ1ZQpp
+ZihjLmNoaWxkcmVuKWlmKCEoYy5jaGlsZHJlbiBpbnN0YW5jZW9mIEhUTUxDb2xsZWN0aW9ufHxjLmNo
+aWxkcmVuIGluc3RhbmNlb2YgTm9kZUxpc3QpKXJldHVybiB0cnVlCnZhciBqPTAKaWYoYy5jaGlsZHJl
+bilqPWMuY2hpbGRyZW4ubGVuZ3RoCmZvcih2YXIgaT0wO2k8ajtpKyspe3ZhciBoPWMuY2hpbGRyZW5b
+aV0KaWYoaC5pZD09J2F0dHJpYnV0ZXMnfHxoLm5hbWU9PSdhdHRyaWJ1dGVzJ3x8aC5pZD09J2xhc3RD
+aGlsZCd8fGgubmFtZT09J2xhc3RDaGlsZCd8fGguaWQ9PSdwcmV2aW91c1NpYmxpbmcnfHxoLm5hbWU9
+PSdwcmV2aW91c1NpYmxpbmcnfHxoLmlkPT0nY2hpbGRyZW4nfHxoLm5hbWU9PSdjaGlsZHJlbicpcmV0
+dXJuIHRydWV9cmV0dXJuIGZhbHNlfShhKQpuPUgub1Qocyk/ITA6IShhLmF0dHJpYnV0ZXMgaW5zdGFu
+Y2VvZiBOYW1lZE5vZGVNYXApfWNhdGNoKHApe0guUnUocCl9cj0iZWxlbWVudCB1bnByaW50YWJsZSIK
+dHJ5e3I9Si5qKGEpfWNhdGNoKHApe0guUnUocCl9dHJ5e3E9Vy5yUyhhKQp0aGlzLmtSKHQuaC5hKGEp
+LGIsbixyLHEsdC5mLmEobSksSC5rKGwpKX1jYXRjaChwKXtpZihILlJ1KHApIGluc3RhbmNlb2YgUC51
+KXRocm93IHAKZWxzZXt0aGlzLkVQKGEsYikKd2luZG93Cm89IlJlbW92aW5nIGNvcnJ1cHRlZCBlbGVt
+ZW50ICIrSC5FaihyKQppZih0eXBlb2YgY29uc29sZSE9InVuZGVmaW5lZCIpd2luZG93LmNvbnNvbGUu
+d2FybihvKX19fSwKa1I6ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyl7dmFyIHMscixxLHAsbyxuLG09dGhp
+cwppZihjKXttLkVQKGEsYikKd2luZG93CnM9IlJlbW92aW5nIGVsZW1lbnQgZHVlIHRvIGNvcnJ1cHRl
+ZCBhdHRyaWJ1dGVzIG9uIDwiK2QrIj4iCmlmKHR5cGVvZiBjb25zb2xlIT0idW5kZWZpbmVkIil3aW5k
+b3cuY29uc29sZS53YXJuKHMpCnJldHVybn1pZighbS5hLmkwKGEpKXttLkVQKGEsYikKd2luZG93CnM9
+IlJlbW92aW5nIGRpc2FsbG93ZWQgZWxlbWVudCA8IitILkVqKGUpKyI+IGZyb20gIitILkVqKGIpCmlm
+KHR5cGVvZiBjb25zb2xlIT0idW5kZWZpbmVkIil3aW5kb3cuY29uc29sZS53YXJuKHMpCnJldHVybn1p
+ZihnIT1udWxsKWlmKCFtLmEuRWIoYSwiaXMiLGcpKXttLkVQKGEsYikKd2luZG93CnM9IlJlbW92aW5n
+IGRpc2FsbG93ZWQgdHlwZSBleHRlbnNpb24gPCIrSC5FaihlKSsnIGlzPSInK2crJyI+JwppZih0eXBl
+b2YgY29uc29sZSE9InVuZGVmaW5lZCIpd2luZG93LmNvbnNvbGUud2FybihzKQpyZXR1cm59cz1mLmdW
+KCkKcj1ILlZNKHMuc2xpY2UoMCksSC50NihzKSkKZm9yKHE9Zi5nVigpLmxlbmd0aC0xLHM9Zi5hO3E+
+PTA7LS1xKXtpZihxPj1yLmxlbmd0aClyZXR1cm4gSC5PSChyLHEpCnA9cltxXQpvPW0uYQpuPUouY0go
+cCkKSC5oKHApCmlmKCFvLkViKGEsbixzLmdldEF0dHJpYnV0ZShwKSkpe3dpbmRvdwpvPSJSZW1vdmlu
+ZyBkaXNhbGxvd2VkIGF0dHJpYnV0ZSA8IitILkVqKGUpKyIgIitwKyc9IicrSC5FaihzLmdldEF0dHJp
+YnV0ZShwKSkrJyI+JwppZih0eXBlb2YgY29uc29sZSE9InVuZGVmaW5lZCIpd2luZG93LmNvbnNvbGUu
+d2FybihvKQpzLnJlbW92ZUF0dHJpYnV0ZShwKX19aWYodC5hVy5iKGEpKXtzPWEuY29udGVudApzLnRv
+U3RyaW5nCm0uUG4ocyl9fSwKJGlvbjoxfQpXLmZtLnByb3RvdHlwZT17CiQyOmZ1bmN0aW9uKGEsYil7
+dmFyIHMscixxLHAsbyxuLG09dGhpcy5hCnN3aXRjaChhLm5vZGVUeXBlKXtjYXNlIDE6bS5JNChhLGIp
+CmJyZWFrCmNhc2UgODpjYXNlIDExOmNhc2UgMzpjYXNlIDQ6YnJlYWsKZGVmYXVsdDptLkVQKGEsYil9
+cz1hLmxhc3RDaGlsZApmb3IocT10LkE7bnVsbCE9czspe3I9bnVsbAp0cnl7cj1zLnByZXZpb3VzU2li
+bGluZwppZihyIT1udWxsKXtwPXIubmV4dFNpYmxpbmcKbz1zCm89cD09bnVsbD9vIT1udWxsOnAhPT1v
+CnA9b31lbHNlIHA9ITEKaWYocCl7cD1QLlBWKCJDb3JydXB0IEhUTUwiKQp0aHJvdyBILmIocCl9fWNh
+dGNoKG4pe0guUnUobikKcD1xLmEocykKbS5iPSEwCm89cC5wYXJlbnROb2RlCm89YT09bnVsbD9vIT1u
+dWxsOmEhPT1vCmlmKG8pe289cC5wYXJlbnROb2RlCmlmKG8hPW51bGwpby5yZW1vdmVDaGlsZChwKX1l
+bHNlIGEucmVtb3ZlQ2hpbGQocCkKcz1udWxsCnI9YS5sYXN0Q2hpbGR9aWYocyE9bnVsbCl0aGlzLiQy
+KHMsYSkKcz1yfX0sCiRTOjMxfQpXLkxlLnByb3RvdHlwZT17fQpXLks3LnByb3RvdHlwZT17fQpXLnJC
+LnByb3RvdHlwZT17fQpXLlhXLnByb3RvdHlwZT17fQpXLm9hLnByb3RvdHlwZT17fQpQLmlKLnByb3Rv
+dHlwZT17ClZIOmZ1bmN0aW9uKGEpe3ZhciBzLHI9dGhpcy5hLHE9ci5sZW5ndGgKZm9yKHM9MDtzPHE7
+KytzKWlmKHJbc109PT1hKXJldHVybiBzCkMuTm0uaShyLGEpCkMuTm0uaSh0aGlzLmIsbnVsbCkKcmV0
+dXJuIHF9LApQdjpmdW5jdGlvbihhKXt2YXIgcyxyLHEscD10aGlzLG89e30KaWYoYT09bnVsbClyZXR1
+cm4gYQppZihILmwoYSkpcmV0dXJuIGEKaWYodHlwZW9mIGE9PSJudW1iZXIiKXJldHVybiBhCmlmKHR5
+cGVvZiBhPT0ic3RyaW5nIilyZXR1cm4gYQppZihhIGluc3RhbmNlb2YgUC5pUClyZXR1cm4gbmV3IERh
+dGUoYS5hKQppZih0LmZ2LmIoYSkpdGhyb3cgSC5iKFAuU1koInN0cnVjdHVyZWQgY2xvbmUgb2YgUmVn
+RXhwIikpCmlmKHQuYzguYihhKSlyZXR1cm4gYQppZih0LncuYihhKSlyZXR1cm4gYQppZih0LkkuYihh
+KSlyZXR1cm4gYQpzPXQuZEUuYihhKXx8ITEKaWYocylyZXR1cm4gYQppZih0LmYuYihhKSl7cj1wLlZI
+KGEpCnM9cC5iCmlmKHI+PXMubGVuZ3RoKXJldHVybiBILk9IKHMscikKcT1vLmE9c1tyXQppZihxIT1u
+dWxsKXJldHVybiBxCnE9e30Kby5hPXEKQy5ObS5ZKHMscixxKQphLksoMCxuZXcgUC5qZyhvLHApKQpy
+ZXR1cm4gby5hfWlmKHQuai5iKGEpKXtyPXAuVkgoYSkKbz1wLmIKaWYocj49by5sZW5ndGgpcmV0dXJu
+IEguT0gobyxyKQpxPW9bcl0KaWYocSE9bnVsbClyZXR1cm4gcQpyZXR1cm4gcC5layhhLHIpfWlmKHQu
+ZUguYihhKSl7cj1wLlZIKGEpCnM9cC5iCmlmKHI+PXMubGVuZ3RoKXJldHVybiBILk9IKHMscikKcT1v
+LmI9c1tyXQppZihxIT1udWxsKXJldHVybiBxCnE9e30Kby5iPXEKQy5ObS5ZKHMscixxKQpwLmltKGEs
+bmV3IFAuVGEobyxwKSkKcmV0dXJuIG8uYn10aHJvdyBILmIoUC5TWSgic3RydWN0dXJlZCBjbG9uZSBv
+ZiBvdGhlciB0eXBlIikpfSwKZWs6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyPUouVTYoYSkscT1yLmdBKGEp
+LHA9bmV3IEFycmF5KHEpCkMuTm0uWSh0aGlzLmIsYixwKQpmb3Iocz0wO3M8cTsrK3MpQy5ObS5ZKHAs
+cyx0aGlzLlB2KHIucShhLHMpKSkKcmV0dXJuIHB9fQpQLmpnLnByb3RvdHlwZT17CiQyOmZ1bmN0aW9u
+KGEsYil7dGhpcy5hLmFbYV09dGhpcy5iLlB2KGIpfSwKJFM6MzJ9ClAuVGEucHJvdG90eXBlPXsKJDI6
+ZnVuY3Rpb24oYSxiKXt0aGlzLmEuYlthXT10aGlzLmIuUHYoYil9LAokUzoxNn0KUC5CZi5wcm90b3R5
+cGU9ewppbTpmdW5jdGlvbihhLGIpe3ZhciBzLHIscSxwCnQuYjguYShiKQpmb3Iocz1PYmplY3Qua2V5
+cyhhKSxyPXMubGVuZ3RoLHE9MDtxPHI7KytxKXtwPXNbcV0KYi4kMihwLGFbcF0pfX19ClAuQXMucHJv
+dG90eXBlPXsKVDpmdW5jdGlvbihhKXt2YXIgcwpILmgoYSkKcz0kLmhHKCkuYgppZih0eXBlb2YgYSE9
+InN0cmluZyIpSC52KEgudEwoYSkpCmlmKHMudGVzdChhKSlyZXR1cm4gYQp0aHJvdyBILmIoUC5MMyhh
+LCJ2YWx1ZSIsIk5vdCBhIHZhbGlkIGNsYXNzIHRva2VuIikpfSwKdzpmdW5jdGlvbihhKXtyZXR1cm4g
+dGhpcy5QKCkuSCgwLCIgIil9LApnbTpmdW5jdGlvbihhKXt2YXIgcz10aGlzLlAoKQpyZXR1cm4gUC5y
+aihzLHMucixILkxoKHMpLmMpfSwKZ2wwOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLlAoKS5hPT09MH0s
+CmdvcjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5QKCkuYSE9PTB9LApnQTpmdW5jdGlvbihhKXtyZXR1
+cm4gdGhpcy5QKCkuYX0sCnRnOmZ1bmN0aW9uKGEsYil7dGhpcy5UKGIpCnJldHVybiB0aGlzLlAoKS50
+ZygwLGIpfSwKaTpmdW5jdGlvbihhLGIpe3ZhciBzCkguaChiKQp0aGlzLlQoYikKcz10aGlzLk9TKG5l
+dyBQLkdFKGIpKQpyZXR1cm4gSC55OChzPT1udWxsPyExOnMpfSwKUjpmdW5jdGlvbihhLGIpe3ZhciBz
+LHIKaWYodHlwZW9mIGIhPSJzdHJpbmciKXJldHVybiExCnRoaXMuVChiKQpzPXRoaXMuUCgpCnI9cy5S
+KDAsYikKdGhpcy5YKHMpCnJldHVybiByfSwKRlY6ZnVuY3Rpb24oYSxiKXt0aGlzLk9TKG5ldyBQLk43
+KHRoaXMsdC5RLmEoYikpKX0sCmVSOmZ1bmN0aW9uKGEsYil7dmFyIHM9dGhpcy5QKCkKcmV0dXJuIEgu
+YksocyxiLEguTGgocykuQygibGYuRSIpKX0sCkU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5QKCku
+RSgwLGIpfSwKVjE6ZnVuY3Rpb24oYSl7dGhpcy5PUyhuZXcgUC51USgpKX0sCk9TOmZ1bmN0aW9uKGEp
+e3ZhciBzLHIKdC5iVS5hKGEpCnM9dGhpcy5QKCkKcj1hLiQxKHMpCnRoaXMuWChzKQpyZXR1cm4gcn19
+ClAuR0UucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIHQuQy5hKGEpLmkoMCx0aGlzLmEp
+fSwKJFM6MzR9ClAuTjcucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dmFyIHM9dGhpcy5iLHI9SC50
+NihzKQpyZXR1cm4gdC5DLmEoYSkuRlYoMCxuZXcgSC5sSihzLHIuQygicVUoMSkiKS5hKHRoaXMuYS5n
+dU0oKSksci5DKCJsSjwxLHFVPiIpKSl9LAokUzoxN30KUC51US5wcm90b3R5cGU9ewokMTpmdW5jdGlv
+bihhKXt0LkMuYShhKQppZihhLmE+MCl7YS5iPWEuYz1hLmQ9YS5lPWEuZj1udWxsCmEuYT0wCmEuUygp
+fXJldHVybiBudWxsfSwKJFM6MTd9ClAuaEYucHJvdG90eXBlPXskaWhGOjF9ClAuUEMucHJvdG90eXBl
+PXsKJDE6ZnVuY3Rpb24oYSl7dmFyIHMKdC5ZLmEoYSkKcz1mdW5jdGlvbihiLGMsZCl7cmV0dXJuIGZ1
+bmN0aW9uKCl7cmV0dXJuIGIoYyxkLHRoaXMsQXJyYXkucHJvdG90eXBlLnNsaWNlLmFwcGx5KGFyZ3Vt
+ZW50cykpfX0oUC5SNCxhLCExKQpQLkRtKHMsJC53KCksYSkKcmV0dXJuIHN9LAokUzo0fQpQLm10LnBy
+b3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgdGhpcy5hKGEpfSwKJFM6NH0KUC5Oei5w
+cm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFAucjcoYSl9LAokUzo1NX0KUC5RUy5w
+cm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFAuVHooYSx0LmFtKX0sCiRTOjM3fQpQ
+Lm5wLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgUC5FNChhKX0sCiRTOjM4fQpQ
+LkU0LnByb3RvdHlwZT17CnE6ZnVuY3Rpb24oYSxiKXtpZih0eXBlb2YgYiE9InN0cmluZyImJnR5cGVv
+ZiBiIT0ibnVtYmVyIil0aHJvdyBILmIoUC54WSgicHJvcGVydHkgaXMgbm90IGEgU3RyaW5nIG9yIG51
+bSIpKQpyZXR1cm4gUC5kVSh0aGlzLmFbYl0pfSwKWTpmdW5jdGlvbihhLGIsYyl7aWYodHlwZW9mIGIh
+PSJzdHJpbmciJiZ0eXBlb2YgYiE9Im51bWJlciIpdGhyb3cgSC5iKFAueFkoInByb3BlcnR5IGlzIG5v
+dCBhIFN0cmluZyBvciBudW0iKSkKdGhpcy5hW2JdPVAud1koYyl9LApETjpmdW5jdGlvbihhLGIpe2lm
+KGI9PW51bGwpcmV0dXJuITEKcmV0dXJuIGIgaW5zdGFuY2VvZiBQLkU0JiZ0aGlzLmE9PT1iLmF9LAp3
+OmZ1bmN0aW9uKGEpe3ZhciBzLHIKdHJ5e3M9U3RyaW5nKHRoaXMuYSkKcmV0dXJuIHN9Y2F0Y2gocil7
+SC5SdShyKQpzPXRoaXMueGIoMCkKcmV0dXJuIHN9fSwKVjc6ZnVuY3Rpb24oYSxiKXt2YXIgcyxyPXRo
+aXMuYQppZihiPT1udWxsKXM9bnVsbAplbHNle3M9SC50NihiKQpzPVAuQ0gobmV3IEgubEooYixzLkMo
+IkAoMSkiKS5hKFAuaUcoKSkscy5DKCJsSjwxLEA+IikpLCEwLHQueil9cmV0dXJuIFAuZFUoclthXS5h
+cHBseShyLHMpKX0sCmdpTzpmdW5jdGlvbihhKXtyZXR1cm4gMH19ClAucjcucHJvdG90eXBlPXt9ClAu
+VHoucHJvdG90eXBlPXsKY1A6ZnVuY3Rpb24oYSl7dmFyIHM9dGhpcyxyPWE8MHx8YT49cy5nQShzKQpp
+ZihyKXRocm93IEguYihQLlRFKGEsMCxzLmdBKHMpLG51bGwsbnVsbCkpfSwKcTpmdW5jdGlvbihhLGIp
+e2lmKEgub2soYikpdGhpcy5jUChiKQpyZXR1cm4gdGhpcy4kdGkuYy5hKHRoaXMuVXIoMCxiKSl9LApZ
+OmZ1bmN0aW9uKGEsYixjKXt0aGlzLmNQKGIpCnRoaXMuZTQoMCxiLGMpfSwKZ0E6ZnVuY3Rpb24oYSl7
+dmFyIHM9dGhpcy5hLmxlbmd0aAppZih0eXBlb2Ygcz09PSJudW1iZXIiJiZzPj4+MD09PXMpcmV0dXJu
+IHMKdGhyb3cgSC5iKFAuUFYoIkJhZCBKc0FycmF5IGxlbmd0aCIpKX0sCiRpYlE6MSwKJGljWDoxLAok
+aXpNOjF9ClAuY28ucHJvdG90eXBlPXt9ClAubmQucHJvdG90eXBlPXskaW5kOjF9ClAuS2UucHJvdG90
+eXBlPXsKUDpmdW5jdGlvbigpe3ZhciBzLHIscSxwLG89dGhpcy5hLmdldEF0dHJpYnV0ZSgiY2xhc3Mi
+KSxuPVAuTHModC5OKQppZihvPT1udWxsKXJldHVybiBuCmZvcihzPW8uc3BsaXQoIiAiKSxyPXMubGVu
+Z3RoLHE9MDtxPHI7KytxKXtwPUouVDAoc1txXSkKaWYocC5sZW5ndGghPT0wKW4uaSgwLHApfXJldHVy
+biBufSwKWDpmdW5jdGlvbihhKXt0aGlzLmEuc2V0QXR0cmlidXRlKCJjbGFzcyIsYS5IKDAsIiAiKSl9
+fQpQLmhpLnByb3RvdHlwZT17CmdEOmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgUC5LZShhKX0sCnNoZjpm
+dW5jdGlvbihhLGIpe3RoaXMuWUMoYSxiKX0sCnI2OmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBzLHIscSxw
+LG8sbgppZihkPT1udWxsKXtzPUguVk0oW10sdC52KQpkPW5ldyBXLnZEKHMpCkMuTm0uaShzLFcuVHco
+bnVsbCkpCkMuTm0uaShzLFcuQmwoKSkKQy5ObS5pKHMsbmV3IFcuT3coKSl9Yz1uZXcgVy5LbyhkKQpy
+PSc8c3ZnIHZlcnNpb249IjEuMSI+JytILkVqKGIpKyI8L3N2Zz4iCnM9ZG9jdW1lbnQKcT1zLmJvZHkK
+cS50b1N0cmluZwpwPUMuUlkuQUgocSxyLGMpCm89cy5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCkKcC50
+b1N0cmluZwpzPW5ldyBXLmU3KHApCm49cy5ncjgocykKZm9yKDtzPW4uZmlyc3RDaGlsZCxzIT1udWxs
+OylvLmFwcGVuZENoaWxkKHMpCnJldHVybiBvfSwKbno6ZnVuY3Rpb24oYSxiLGMsZCxlKXt0aHJvdyBI
+LmIoUC5MNCgiQ2Fubm90IGludm9rZSBpbnNlcnRBZGphY2VudEh0bWwgb24gU1ZHLiIpKX0sCmdWbDpm
+dW5jdGlvbihhKXtyZXR1cm4gbmV3IFcuZXUoYSwiY2xpY2siLCExLHQuayl9LAokaWhpOjF9Ck0uSDcu
+cHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5ifX0KVS5MTC5wcm90b3R5cGU9ewpM
+dDpmdW5jdGlvbigpe3JldHVybiBQLkVGKFsibm9kZUlkIix0aGlzLmIsImtpbmQiLHRoaXMuYS5hXSx0
+LlgsdC5fKX19ClUuTUQucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIHQuZkUuYShhKS5h
+PT09dGhpcy5hLnEoMCwia2luZCIpfSwKJFM6Mzl9ClUuZDIucHJvdG90eXBlPXsKTHQ6ZnVuY3Rpb24o
+KXt2YXIgcyxyLHEscCxvPXRoaXMsbj10LlgsbT10Ll8sbD1QLkZsKG4sbSksaz1vLmEKaWYoayE9bnVs
+bCl7cz1ILlZNKFtdLHQuRykKZm9yKHI9ay5sZW5ndGgscT0wO3E8ay5sZW5ndGg7ay5sZW5ndGg9PT1y
+fHwoMCxILmxrKShrKSwrK3Epe3A9a1txXQpDLk5tLmkocyxQLkVGKFsiZGVzY3JpcHRpb24iLHAuYSwi
+aHJlZiIscC5iXSxuLG0pKX1sLlkoMCwiZWRpdHMiLHMpfWwuWSgwLCJleHBsYW5hdGlvbiIsby5iKQps
+LlkoMCwibGluZSIsby5jKQpsLlkoMCwiZGlzcGxheVBhdGgiLG8uZCkKbC5ZKDAsInVyaVBhdGgiLG8u
+ZSkKbj1vLmYKaWYobiE9bnVsbCl7bT1ILlZNKFtdLHQuRykKZm9yKGs9bi5sZW5ndGgscT0wO3E8bi5s
+ZW5ndGg7bi5sZW5ndGg9PT1rfHwoMCxILmxrKShuKSwrK3EpQy5ObS5pKG0sbltxXS5MdCgpKQpsLlko
+MCwidHJhY2VzIixtKX1yZXR1cm4gbH19ClUuU2UucHJvdG90eXBlPXsKTHQ6ZnVuY3Rpb24oKXtyZXR1
+cm4gUC5FRihbImRlc2NyaXB0aW9uIix0aGlzLmEsImhyZWYiLHRoaXMuYl0sdC5YLHQuXyl9fQpVLk1s
+LnByb3RvdHlwZT17Ckx0OmZ1bmN0aW9uKCl7cmV0dXJuIFAuRUYoWyJocmVmIix0aGlzLmEsImxpbmUi
+LHRoaXMuYiwicGF0aCIsdGhpcy5jXSx0LlgsdC5fKX19ClUueUQucHJvdG90eXBlPXsKTHQ6ZnVuY3Rp
+b24oKXt2YXIgcyxyLHEscD1ILlZNKFtdLHQuRykKZm9yKHM9dGhpcy5iLHI9cy5sZW5ndGgscT0wO3E8
+cy5sZW5ndGg7cy5sZW5ndGg9PT1yfHwoMCxILmxrKShzKSwrK3EpQy5ObS5pKHAsc1txXS5MdCgpKQpy
+ZXR1cm4gUC5FRihbImRlc2NyaXB0aW9uIix0aGlzLmEsImVudHJpZXMiLHBdLHQuWCx0Ll8pfX0KVS53
+Yi5wcm90b3R5cGU9ewpMdDpmdW5jdGlvbigpe3ZhciBzLHIscSxwPXRoaXMsbz1QLkZsKHQuWCx0Ll8p
+Cm8uWSgwLCJkZXNjcmlwdGlvbiIscC5hKQpzPXAuYgppZihzIT1udWxsKW8uWSgwLCJmdW5jdGlvbiIs
+cykKcz1wLmMKaWYocyE9bnVsbClvLlkoMCwibGluayIscy5MdCgpKQpzPXAuZAppZihzLmxlbmd0aCE9
+PTApe3I9SC50NihzKQpxPXIuQygibEo8MSxaMDxxVSosTWgqPio+IikKby5ZKDAsImhpbnRBY3Rpb25z
+IixQLkNIKG5ldyBILmxKKHMsci5DKCJaMDxxVSosTWgqPiooMSkiKS5hKG5ldyBVLmIwKCkpLHEpLCEw
+LHEuQygiYUwuRSIpKSl9cmV0dXJuIG99fQpVLmFOLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3Jl
+dHVybiBVLm56KHQudC5hKGEpKX0sCiRTOjQwfQpVLmIwLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEp
+e3JldHVybiB0LmFYLmEoYSkuTHQoKX0sCiRTOjQxfQpCLmo4LnByb3RvdHlwZT17Ckx0OmZ1bmN0aW9u
+KCl7cmV0dXJuIFAuRUYoWyJsaW5lIix0aGlzLmEsImV4cGxhbmF0aW9uIix0aGlzLmIsIm9mZnNldCIs
+dGhpcy5jXSx0LlgsdC5fKX19CkIucXAucHJvdG90eXBlPXsKTHQ6ZnVuY3Rpb24oKXt2YXIgcyxyLHEs
+cCxvLG4sbSxsPXRoaXMsaz10Llgsaj1QLkZsKGssdC5kcCkKZm9yKHM9bC5kLHM9cy5nUHUocykscz1z
+LmdtKHMpLHI9dC5fLHE9dC5HO3MuRigpOyl7cD1zLmdsKCkKbz1wLmEKbj1ILlZNKFtdLHEpCmZvcihw
+PUouSVQocC5iKTtwLkYoKTspe209cC5nbCgpCkMuTm0uaShuLFAuRUYoWyJsaW5lIixtLmEsImV4cGxh
+bmF0aW9uIixtLmIsIm9mZnNldCIsbS5jXSxrLHIpKX1qLlkoMCxvLG4pfXJldHVybiBQLkVGKFsicmVn
+aW9ucyIsbC5hLCJuYXZpZ2F0aW9uQ29udGVudCIsbC5iLCJzb3VyY2VDb2RlIixsLmMsImVkaXRzIixq
+XSxrLHIpfX0KVC5tUS5wcm90b3R5cGU9e30KTC5lLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3Zh
+ciBzLHIscSxwLG8sbixtCnQuYUwuYShhKQpzPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZQpyPUwuRzYo
+d2luZG93LmxvY2F0aW9uLmhyZWYpCnE9TC5hSyh3aW5kb3cubG9jYXRpb24uaHJlZikKTC5HZSgpCmlm
+KHMhPT0iLyImJnMhPT1KLlQwKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5yb290IikudGV4dENvbnRl
+bnQpKUwuRzcocyxyLHEsITAsbmV3IEwuVlcocyxyLHEpKQpwPWRvY3VtZW50Cm89Si5xRihwLnF1ZXJ5
+U2VsZWN0b3IoIi5hcHBseS1taWdyYXRpb24iKSkKbj1vLiR0aQptPW4uQygifigxKT8iKS5hKG5ldyBM
+Lm9aKCkpCnQuWi5hKG51bGwpClcuSkUoby5hLG8uYixtLCExLG4uYykKbj1KLnFGKHAucXVlcnlTZWxl
+Y3RvcigiLnJlcnVuLW1pZ3JhdGlvbiIpKQptPW4uJHRpClcuSkUobi5hLG4uYixtLkMoIn4oMSk/Iiku
+YShuZXcgTC5IaSgpKSwhMSxtLmMpCm09Si5xRihwLnF1ZXJ5U2VsZWN0b3IoIi5yZXBvcnQtcHJvYmxl
+bSIpKQpuPW0uJHRpClcuSkUobS5hLG0uYixuLkMoIn4oMSk/IikuYShuZXcgTC5CVCgpKSwhMSxuLmMp
+CnA9Si5xRihwLnF1ZXJ5U2VsZWN0b3IoIi5wb3B1cC1wYW5lIC5jbG9zZSIpKQpuPXAuJHRpClcuSkUo
+cC5hLHAuYixuLkMoIn4oMSk/IikuYShuZXcgTC5QWSgpKSwhMSxuLmMpfSwKJFM6MTh9CkwuVlcucHJv
+dG90eXBlPXsKJDA6ZnVuY3Rpb24oKXtMLkZyKHRoaXMuYSx0aGlzLmIsdGhpcy5jKX0sCiRTOjF9Ckwu
+b1oucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dmFyIHMscixxLHAKdC5PLmEoYSkKaWYoSC5vVChD
+Lm9sLnVzKHdpbmRvdywiVGhpcyB3aWxsIGFwcGx5IHRoZSBjaGFuZ2VzIHlvdSd2ZSBwcmV2aWV3ZWQg
+dG8geW91ciB3b3JraW5nIGRpcmVjdG9yeS4gSXQgaXMgcmVjb21tZW5kZWQgeW91IGNvbW1pdCBhbnkg
+Y2hhbmdlcyB5b3UgbWFkZSBiZWZvcmUgZG9pbmcgdGhpcy4iKSkpe3M9TC50eSgiL2FwcGx5LW1pZ3Jh
+dGlvbiIsbnVsbCkuVzcobmV3IEwuanIoKSx0LlApCnI9bmV3IEwucWwoKQp0LmI3LmEobnVsbCkKcT1z
+LiR0aQpwPSQuWDMKaWYocCE9PUMuTlUpcj1QLlZIKHIscCkKcy54ZihuZXcgUC5GZShuZXcgUC52cyhw
+LHEpLDIsbnVsbCxyLHEuQygiQDwxPiIpLktxKHEuYykuQygiRmU8MSwyPiIpKSl9fSwKJFM6Mn0KTC5q
+ci5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXt2YXIgcwp0LnQuYShhKQpzPWRvY3VtZW50LmJvZHkK
+cy5jbGFzc0xpc3QucmVtb3ZlKCJwcm9wb3NlZCIpCnMuY2xhc3NMaXN0LmFkZCgiYXBwbGllZCIpfSwK
+JFM6NDR9CkwucWwucHJvdG90eXBlPXsKJDI6ZnVuY3Rpb24oYSxiKXtMLkMyKCJDb3VsZCBub3QgYXBw
+bHkgbWlncmF0aW9uIixhLGIpfSwKJEM6IiQyIiwKJFI6MiwKJFM6MTZ9CkwuSGkucHJvdG90eXBlPXsK
+JDE6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMueG4odC5PLmEoYSkpfSwKeG46ZnVuY3Rpb24oYSl7dmFy
+IHM9MCxyPVAuRlgodC5QKSxxPTEscCxvPVtdLG4sbSxsLGssagp2YXIgJGFzeW5jJCQxPVAubHooZnVu
+Y3Rpb24oYixjKXtpZihiPT09MSl7cD1jCnM9cX13aGlsZSh0cnVlKXN3aXRjaChzKXtjYXNlIDA6cT0z
+CmRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgicmVydW5uaW5nIikKcz02CnJldHVybiBQLmpRKEwu
+dHkoIi9yZXJ1bi1taWdyYXRpb24iLG51bGwpLCRhc3luYyQkMSkKY2FzZSA2Om49YwppZihILm9UKEgu
+eTgoSi54OShuLCJzdWNjZXNzIikpKSl3aW5kb3cubG9jYXRpb24ucmVsb2FkKCkKZWxzZSBMLkswKHQu
+bS5hKEoueDkobiwiZXJyb3JzIikpKQpvLnB1c2goNSkKcz00CmJyZWFrCmNhc2UgMzpxPTIKaj1wCm09
+SC5SdShqKQpsPUgudHMoaikKTC5DMigiRmFpbGVkIHRvIHJlcnVuIG1pZ3JhdGlvbiIsbSxsKQpvLnB1
+c2goNSkKcz00CmJyZWFrCmNhc2UgMjpvPVsxXQpjYXNlIDQ6cT0xCmRvY3VtZW50LmJvZHkuY2xhc3NM
+aXN0LnJlbW92ZSgicmVydW5uaW5nIikKcz1vLnBvcCgpCmJyZWFrCmNhc2UgNTpyZXR1cm4gUC55Qyhu
+dWxsLHIpCmNhc2UgMTpyZXR1cm4gUC5mMyhwLHIpfX0pCnJldHVybiBQLkRJKCRhc3luYyQkMSxyKX0s
+CiRTOjE5fQpMLkJULnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3ZhciBzCnQuTy5hKGEpCnM9dC5Y
+CkMub2wuUG8od2luZG93LFAuWGQoImh0dHBzIiwiZ2l0aHViLmNvbSIsImRhcnQtbGFuZy9zZGsvaXNz
+dWVzL25ldyIsUC5FRihbInRpdGxlIiwiQ3VzdG9tZXItcmVwb3J0ZWQgaXNzdWUgd2l0aCBOTkJEIG1p
+Z3JhdGlvbiB0b29sIiwibGFiZWxzIix1LmQsImJvZHkiLCIjIyMjIFN0ZXBzIHRvIHJlcHJvZHVjZVxu
+XG4jIyMjIFdoYXQgZGlkIHlvdSBleHBlY3QgdG8gaGFwcGVuP1xuXG4jIyMjIFdoYXQgYWN0dWFsbHkg
+aGFwcGVuZWQ/XG5cbl9TY3JlZW5zaG90cyBhcmUgYXBwcmVjaWF0ZWRfXG5cbioqRGFydCBTREsgdmVy
+c2lvbioqOiAiK0guRWooZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNkay12ZXJzaW9uIikudGV4dENv
+bnRlbnQpKyJcblxuVGhhbmtzIGZvciBmaWxpbmchXG4iXSxzLHMpKS5nbkQoKSwicmVwb3J0LXByb2Js
+ZW0iKX0sCiRTOjJ9CkwuUFkucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dmFyIHMKdC5PLmEoYSkK
+cz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIucG9wdXAtcGFuZSIpLnN0eWxlCnMuZGlzcGxheT0ibm9u
+ZSIKcmV0dXJuIm5vbmUifSwKJFM6NDZ9CkwuTC5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXt2YXIg
+cyxyLHEKdC5hTC5hKGEpCnM9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lCnI9TC5HNih3aW5kb3cubG9j
+YXRpb24uaHJlZikKcT1MLmFLKHdpbmRvdy5sb2NhdGlvbi5ocmVmKQppZihzLmxlbmd0aD4xKUwuRzco
+cyxyLHEsITEsbnVsbCkKZWxzZXtMLkJFKHMsQi53UigpLCEwKQpMLkJYKCImbmJzcDsiLG51bGwpfX0s
+CiRTOjE4fQpMLld4LnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3ZhciBzLHIscSxwPSJjb2xsYXBz
+ZWQiCnQuTy5hKGEpCnM9dGhpcy5hCnI9Si5ZRShzKQpxPXRoaXMuYgppZighci5nRChzKS50ZygwLHAp
+KXtyLmdEKHMpLmkoMCxwKQpKLmRSKHEpLmkoMCxwKX1lbHNle3IuZ0QocykuUigwLHApCkouZFIocSku
+UigwLHApfX0sCiRTOjJ9CkwuQU8ucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dmFyIHM9Si5xRih0
+LmcuYShhKSkscj1zLiR0aSxxPXIuQygifigxKT8iKS5hKG5ldyBMLmROKHRoaXMuYSkpCnQuWi5hKG51
+bGwpClcuSkUocy5hLHMuYixxLCExLHIuYyl9LAokUzozfQpMLmROLnByb3RvdHlwZT17CiQxOmZ1bmN0
+aW9uKGEpe3ZhciBzCnQuTy5hKGEpCnM9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigidGFibGVbZGF0YS1w
+YXRoXSIpCnMudG9TdHJpbmcKTC50MihhLHRoaXMuYSxzLmdldEF0dHJpYnV0ZSgiZGF0YS0iK25ldyBX
+LlN5KG5ldyBXLmk3KHMpKS5PKCJwYXRoIikpKX0sCiRTOjJ9CkwuSG8ucHJvdG90eXBlPXsKJDE6ZnVu
+Y3Rpb24oYSl7dmFyIHMscixxCnQuZy5hKGEpCnM9Si5xRihhKQpyPXMuJHRpCnE9ci5DKCJ+KDEpPyIp
+LmEobmV3IEwueHooYSx0aGlzLmEpKQp0LlouYShudWxsKQpXLkpFKHMuYSxzLmIscSwhMSxyLmMpfSwK
+JFM6M30KTC54ei5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXt2YXIgcwp0Lk8uYShhKQpzPXRoaXMu
+YQpMLmhYKHRoaXMuYixQLlFBKHMuZ2V0QXR0cmlidXRlKCJkYXRhLSIrbmV3IFcuU3kobmV3IFcuaTco
+cykpLk8oIm9mZnNldCIpKSxudWxsKSxQLlFBKHMuZ2V0QXR0cmlidXRlKCJkYXRhLSIrbmV3IFcuU3ko
+bmV3IFcuaTcocykpLk8oImxpbmUiKSksbnVsbCkpfSwKJFM6Mn0KTC5JQy5wcm90b3R5cGU9ewokMTpm
+dW5jdGlvbihhKXt2YXIgcz1KLnFGKHQuZy5hKGEpKSxyPXMuJHRpCnIuQygifigxKT8iKS5hKEwuaVMo
+KSkKdC5aLmEobnVsbCkKVy5KRShzLmEscy5iLEwuaVMoKSwhMSxyLmMpfSwKJFM6M30KTC5mQy5wcm90
+b3R5cGU9ewokMTpmdW5jdGlvbihhKXt0LmVRLmEoYSkKdGhpcy5hLmFNKDAsdGhpcy5iKX0sCiRTOjQ4
+fQpMLm5ULnByb3RvdHlwZT17CiQwOmZ1bmN0aW9uKCl7TC5Gcih0aGlzLmEsdGhpcy5iLHRoaXMuYyl9
+LAokUzoxfQpMLk5ZLnByb3RvdHlwZT17CiQwOmZ1bmN0aW9uKCl7TC5Gcih0aGlzLmEsbnVsbCxudWxs
+KX0sCiRTOjF9CkwudWUucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dC5hdy5hKGEpCnJldHVybiBI
+LkVqKGEucSgwLCJzZXZlcml0eSIpKSsiIC0gIitILkVqKGEucSgwLCJtZXNzYWdlIikpKyIgYXQgIitI
+LkVqKGEucSgwLCJsb2NhdGlvbiIpKSsiIC0gKCIrSC5FaihhLnEoMCwiY29kZSIpKSsiKSJ9LAokUzo0
+OX0KTC5lWC5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXt0LmcuYShhKQokLnpCKCkudG9TdHJpbmcK
+dC5kSC5hKCQub3coKS5xKDAsImhsanMiKSkuVjcoImhpZ2hsaWdodEJsb2NrIixbYV0pfSwKJFM6M30K
+TC5FRS5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXt2YXIgcyxyCnQuTy5hKGEpLnByZXZlbnREZWZh
+dWx0KCkKcz10aGlzLmEKcj10aGlzLmIKTC5hZih3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUscyxyLCEw
+LG5ldyBMLlFMKHMscikpCkwuaFgodGhpcy5jLHMscil9LAokUzoyfQpMLlFMLnByb3RvdHlwZT17CiQw
+OmZ1bmN0aW9uKCl7TC5Gcih3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsdGhpcy5hLHRoaXMuYil9LAok
+UzoxfQpMLlZTLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3ZhciBzLHI9InNlbGVjdGVkLWZpbGUi
+CnQuZy5hKGEpCmEudG9TdHJpbmcKcz1KLllFKGEpCmlmKGEuZ2V0QXR0cmlidXRlKCJkYXRhLSIrbmV3
+IFcuU3kobmV3IFcuaTcoYSkpLk8oIm5hbWUiKSk9PT10aGlzLmEuYSlzLmdEKGEpLmkoMCxyKQplbHNl
+IHMuZ0QoYSkuUigwLHIpfSwKJFM6M30KTC5URC5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXtyZXR1
+cm4gTC50Mih0Lk8uYShhKSwhMCxudWxsKX0sCiRTOjIwfQpMLm0yLnByb3RvdHlwZT17CiQxOmZ1bmN0
+aW9uKGEpe3JldHVybiB0aGlzLlJJKHQuTy5hKGEpKX0sClJJOmZ1bmN0aW9uKGEpe3ZhciBzPTAscj1Q
+LkZYKHQuUCkscT0xLHAsbz1bXSxuPXRoaXMsbSxsLGssaixpLGgsZyxmCnZhciAkYXN5bmMkJDE9UC5s
+eihmdW5jdGlvbihiLGMpe2lmKGI9PT0xKXtwPWMKcz1xfXdoaWxlKHRydWUpc3dpdGNoKHMpe2Nhc2Ug
+MDpxPTMKaT1kb2N1bWVudAptPUMuQ0QuelEoaS5xdWVyeVNlbGVjdG9yKCIuY29udGVudCIpLnNjcm9s
+bFRvcCkKaD10LlgKcz02CnJldHVybiBQLmpRKEwudHkoTC5RNCgiL2FwcGx5LWhpbnQiLFAuRmwoaCxo
+KSksbi5hLkx0KCkpLCRhc3luYyQkMSkKY2FzZSA2Omg9bi5iCmw9TC5VcyhoLmEpCnM9NwpyZXR1cm4g
+UC5qUShMLkc3KGwsbnVsbCxoLmIsITEsbnVsbCksJGFzeW5jJCQxKQpjYXNlIDc6aS5ib2R5LmNsYXNz
+TGlzdC5hZGQoIm5lZWRzLXJlcnVuIikKaT1pLnF1ZXJ5U2VsZWN0b3IoIi5jb250ZW50IikKaS50b1N0
+cmluZwppLnNjcm9sbFRvcD1KLlZ1KG0pCnE9MQpzPTUKYnJlYWsKY2FzZSAzOnE9MgpmPXAKaz1ILlJ1
+KGYpCmo9SC50cyhmKQpMLkMyKCJDb3VsZCBub3QgYXBwbHkgaGludCIsayxqKQpzPTUKYnJlYWsKY2Fz
+ZSAyOnM9MQpicmVhawpjYXNlIDU6cmV0dXJuIFAueUMobnVsbCxyKQpjYXNlIDE6cmV0dXJuIFAuZjMo
+cCxyKX19KQpyZXR1cm4gUC5ESSgkYXN5bmMkJDEscil9LAokUzoxOX0KTC5YQS5wcm90b3R5cGU9ewpF
+YjpmdW5jdGlvbihhLGIsYyl7cmV0dXJuITB9LAppMDpmdW5jdGlvbihhKXtyZXR1cm4hMH0sCiRpa0Y6
+MX0KTC5aWi5wcm90b3R5cGU9ewpMdDpmdW5jdGlvbigpe3ZhciBzLHI9dGhpcyxxPVAuRmwodC5YLHQu
+XykKcS5ZKDAsInR5cGUiLEwudnkoci5hKSkKcS5ZKDAsIm5hbWUiLHIuYikKcz1yLmMKaWYocyE9bnVs
+bClxLlkoMCwic3VidHJlZSIsTC5WRChzKSkKcz1yLmQKaWYocyE9bnVsbClxLlkoMCwicGF0aCIscykK
+cz1yLmUKaWYocyE9bnVsbClxLlkoMCwiaHJlZiIscykKcz1yLmYKaWYocyE9bnVsbClxLlkoMCwiZWRp
+dENvdW50IixzKQpyZXR1cm4gcX19CkwuTzkucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXtyZXR1cm4g
+dGhpcy5ifX0KTS5sSS5wcm90b3R5cGU9ewpnbDpmdW5jdGlvbigpe3ZhciBzPUQuYWIoKQpyZXR1cm4g
+c30sCldPOmZ1bmN0aW9uKGEsYil7dmFyIHMscixxPXQuZDQKTS5ZRigiYWJzb2x1dGUiLEguVk0oW2Is
+bnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGxdLHEpKQpzPXRoaXMuYQpzPXMuWXIoYik+MCYmIXMu
+aEsoYikKaWYocylyZXR1cm4gYgpyPUguVk0oW3RoaXMuZ2woKSxiLG51bGwsbnVsbCxudWxsLG51bGws
+bnVsbCxudWxsXSxxKQpNLllGKCJqb2luIixyKQpyZXR1cm4gdGhpcy5JUChuZXcgSC51NihyLHQuZUop
+KX0sCnpmOmZ1bmN0aW9uKGEpe3ZhciBzLHIscT1YLkNMKGEsdGhpcy5hKQpxLklWKCkKcz1xLmQKcj1z
+Lmxlbmd0aAppZihyPT09MCl7cz1xLmIKcmV0dXJuIHM9PW51bGw/Ii4iOnN9aWYocj09PTEpe3M9cS5i
+CnJldHVybiBzPT1udWxsPyIuIjpzfWlmKDA+PXIpcmV0dXJuIEguT0gocywtMSkKcy5wb3AoKQpzPXEu
+ZQppZigwPj1zLmxlbmd0aClyZXR1cm4gSC5PSChzLC0xKQpzLnBvcCgpCnEuSVYoKQpyZXR1cm4gcS53
+KDApfSwKSVA6ZnVuY3Rpb24oYSl7dmFyIHMscixxLHAsbyxuLG0sbCxrLGoKdC5RLmEoYSkKZm9yKHM9
+YS4kdGkscj1zLkMoImEyKGNYLkUpIikuYShuZXcgTS5xNygpKSxxPWEuZ20oYSkscz1uZXcgSC5TTyhx
+LHIscy5DKCJTTzxjWC5FPiIpKSxyPXRoaXMuYSxwPSExLG89ITEsbj0iIjtzLkYoKTspe209cS5nbCgp
+CmlmKHIuaEsobSkmJm8pe2w9WC5DTChtLHIpCms9bi5jaGFyQ29kZUF0KDApPT0wP246bgpuPUMueEIu
+TmooaywwLHIuU3AoaywhMCkpCmwuYj1uCmlmKHIuZHMobikpQy5ObS5ZKGwuZSwwLHIuZ21JKCkpCm49
+bC53KDApfWVsc2UgaWYoci5ZcihtKT4wKXtvPSFyLmhLKG0pCm49SC5FaihtKX1lbHNle2o9bS5sZW5n
+dGgKaWYoaiE9PTApe2lmKDA+PWopcmV0dXJuIEguT0gobSwwKQpqPXIuVWQobVswXSl9ZWxzZSBqPSEx
+CmlmKCFqKWlmKHApbis9ci5nbUkoKQpuKz1tfXA9ci5kcyhtKX1yZXR1cm4gbi5jaGFyQ29kZUF0KDAp
+PT0wP246bn0sCm81OmZ1bmN0aW9uKGEpe3ZhciBzCmlmKCF0aGlzLnkzKGEpKXJldHVybiBhCnM9WC5D
+TChhLHRoaXMuYSkKcy5yUigpCnJldHVybiBzLncoMCl9LAp5MzpmdW5jdGlvbihhKXt2YXIgcyxyLHEs
+cCxvLG4sbSxsLGssagphLnRvU3RyaW5nCnM9dGhpcy5hCnI9cy5ZcihhKQppZihyIT09MCl7aWYocz09
+PSQuS2soKSlmb3IocT0wO3E8cjsrK3EpaWYoQy54Qi5XKGEscSk9PT00NylyZXR1cm4hMApwPXIKbz00
+N31lbHNle3A9MApvPW51bGx9Zm9yKG49bmV3IEgucWooYSkuYSxtPW4ubGVuZ3RoLHE9cCxsPW51bGw7
+cTxtOysrcSxsPW8sbz1rKXtrPUMueEIuTzIobixxKQppZihzLnI0KGspKXtpZihzPT09JC5LaygpJiZr
+PT09NDcpcmV0dXJuITAKaWYobyE9bnVsbCYmcy5yNChvKSlyZXR1cm4hMAppZihvPT09NDYpaj1sPT1u
+dWxsfHxsPT09NDZ8fHMucjQobCkKZWxzZSBqPSExCmlmKGopcmV0dXJuITB9fWlmKG89PW51bGwpcmV0
+dXJuITAKaWYocy5yNChvKSlyZXR1cm4hMAppZihvPT09NDYpcz1sPT1udWxsfHxzLnI0KGwpfHxsPT09
+NDYKZWxzZSBzPSExCmlmKHMpcmV0dXJuITAKcmV0dXJuITF9LApIUDpmdW5jdGlvbihhLGIpe3ZhciBz
+LHIscSxwLG8sbixtLGw9dGhpcyxrPSdVbmFibGUgdG8gZmluZCBhIHBhdGggdG8gIicKYj1sLldPKDAs
+YikKcz1sLmEKaWYocy5ZcihiKTw9MCYmcy5ZcihhKT4wKXJldHVybiBsLm81KGEpCmlmKHMuWXIoYSk8
+PTB8fHMuaEsoYSkpYT1sLldPKDAsYSkKaWYocy5ZcihhKTw9MCYmcy5ZcihiKT4wKXRocm93IEguYihY
+Lkk3KGsrSC5FaihhKSsnIiBmcm9tICInK0guRWooYikrJyIuJykpCnI9WC5DTChiLHMpCnIuclIoKQpx
+PVguQ0woYSxzKQpxLnJSKCkKcD1yLmQKbz1wLmxlbmd0aAppZihvIT09MCl7aWYoMD49bylyZXR1cm4g
+SC5PSChwLDApCnA9Si5STShwWzBdLCIuIil9ZWxzZSBwPSExCmlmKHApcmV0dXJuIHEudygwKQpwPXIu
+YgpvPXEuYgppZihwIT1vKXA9cD09bnVsbHx8bz09bnVsbHx8IXMuTmMocCxvKQplbHNlIHA9ITEKaWYo
+cClyZXR1cm4gcS53KDApCndoaWxlKCEwKXtwPXIuZApvPXAubGVuZ3RoCmlmKG8hPT0wKXtuPXEuZApt
+PW4ubGVuZ3RoCmlmKG0hPT0wKXtpZigwPj1vKXJldHVybiBILk9IKHAsMCkKcD1wWzBdCmlmKDA+PW0p
+cmV0dXJuIEguT0gobiwwKQpuPXMuTmMocCxuWzBdKQpwPW59ZWxzZSBwPSExfWVsc2UgcD0hMQppZigh
+cClicmVhawpDLk5tLlc0KHIuZCwwKQpDLk5tLlc0KHIuZSwxKQpDLk5tLlc0KHEuZCwwKQpDLk5tLlc0
+KHEuZSwxKX1wPXIuZApvPXAubGVuZ3RoCmlmKG8hPT0wKXtpZigwPj1vKXJldHVybiBILk9IKHAsMCkK
+cD1KLlJNKHBbMF0sIi4uIil9ZWxzZSBwPSExCmlmKHApdGhyb3cgSC5iKFguSTcoaytILkVqKGEpKyci
+IGZyb20gIicrSC5FaihiKSsnIi4nKSkKcD10Lk4KQy5ObS5VRyhxLmQsMCxQLk84KHIuZC5sZW5ndGgs
+Ii4uIiwhMSxwKSkKQy5ObS5ZKHEuZSwwLCIiKQpDLk5tLlVHKHEuZSwxLFAuTzgoci5kLmxlbmd0aCxz
+LmdtSSgpLCExLHApKQpzPXEuZApwPXMubGVuZ3RoCmlmKHA9PT0wKXJldHVybiIuIgppZihwPjEmJkou
+Uk0oQy5ObS5ncloocyksIi4iKSl7cz1xLmQKaWYoMD49cy5sZW5ndGgpcmV0dXJuIEguT0gocywtMSkK
+cy5wb3AoKQpzPXEuZQppZigwPj1zLmxlbmd0aClyZXR1cm4gSC5PSChzLC0xKQpzLnBvcCgpCmlmKDA+
+PXMubGVuZ3RoKXJldHVybiBILk9IKHMsLTEpCnMucG9wKCkKQy5ObS5pKHMsIiIpfXEuYj0iIgpxLklW
+KCkKcmV0dXJuIHEudygwKX19Ck0ucTcucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEgu
+aChhKSE9PSIifSwKJFM6Nn0KTS5Oby5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXtILmsoYSkKcmV0
+dXJuIGE9PW51bGw/Im51bGwiOiciJythKyciJ30sCiRTOjUxfQpCLmZ2LnByb3RvdHlwZT17CnhaOmZ1
+bmN0aW9uKGEpe3ZhciBzLHI9dGhpcy5ZcihhKQppZihyPjApcmV0dXJuIEoubGQoYSwwLHIpCmlmKHRo
+aXMuaEsoYSkpe2lmKDA+PWEubGVuZ3RoKXJldHVybiBILk9IKGEsMCkKcz1hWzBdfWVsc2Ugcz1udWxs
+CnJldHVybiBzfSwKTmM6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYT09Yn19ClguV0QucHJvdG90eXBlPXsK
+SVY6ZnVuY3Rpb24oKXt2YXIgcyxyLHE9dGhpcwp3aGlsZSghMCl7cz1xLmQKaWYoIShzLmxlbmd0aCE9
+PTAmJkouUk0oQy5ObS5ncloocyksIiIpKSlicmVhawpzPXEuZAppZigwPj1zLmxlbmd0aClyZXR1cm4g
+SC5PSChzLC0xKQpzLnBvcCgpCnM9cS5lCmlmKDA+PXMubGVuZ3RoKXJldHVybiBILk9IKHMsLTEpCnMu
+cG9wKCl9cz1xLmUKcj1zLmxlbmd0aAppZihyIT09MClDLk5tLlkocyxyLTEsIiIpfSwKclI6ZnVuY3Rp
+b24oKXt2YXIgcyxyLHEscCxvLG4sbT10aGlzLGw9SC5WTShbXSx0LnMpCmZvcihzPW0uZCxyPXMubGVu
+Z3RoLHE9MCxwPTA7cDxzLmxlbmd0aDtzLmxlbmd0aD09PXJ8fCgwLEgubGspKHMpLCsrcCl7bz1zW3Bd
+Cm49Si5pYShvKQppZighKG4uRE4obywiLiIpfHxuLkROKG8sIiIpKSlpZihuLkROKG8sIi4uIikpe249
+bC5sZW5ndGgKaWYobiE9PTApe2lmKDA+PW4pcmV0dXJuIEguT0gobCwtMSkKbC5wb3AoKX1lbHNlICsr
+cX1lbHNlIEMuTm0uaShsLG8pfWlmKG0uYj09bnVsbClDLk5tLlVHKGwsMCxQLk84KHEsIi4uIiwhMSx0
+Lk4pKQppZihsLmxlbmd0aD09PTAmJm0uYj09bnVsbClDLk5tLmkobCwiLiIpCm0uc25KKGwpCnM9bS5h
+Cm0uc1BoKFAuTzgobC5sZW5ndGgrMSxzLmdtSSgpLCEwLHQuTikpCnI9bS5iCmlmKHI9PW51bGx8fGwu
+bGVuZ3RoPT09MHx8IXMuZHMocikpQy5ObS5ZKG0uZSwwLCIiKQpyPW0uYgppZihyIT1udWxsJiZzPT09
+JC5LaygpKXtyLnRvU3RyaW5nCm0uYj1ILnlzKHIsIi8iLCJcXCIpfW0uSVYoKX0sCnc6ZnVuY3Rpb24o
+YSl7dmFyIHMscixxPXRoaXMscD1xLmIKcD1wIT1udWxsP3A6IiIKZm9yKHM9MDtzPHEuZC5sZW5ndGg7
+KytzKXtyPXEuZQppZihzPj1yLmxlbmd0aClyZXR1cm4gSC5PSChyLHMpCnI9cCtILkVqKHJbc10pCnA9
+cS5kCmlmKHM+PXAubGVuZ3RoKXJldHVybiBILk9IKHAscykKcD1yK0guRWoocFtzXSl9cCs9SC5FaihD
+Lk5tLmdyWihxLmUpKQpyZXR1cm4gcC5jaGFyQ29kZUF0KDApPT0wP3A6cH0sCnNuSjpmdW5jdGlvbihh
+KXt0aGlzLmQ9dC5FLmEoYSl9LApzUGg6ZnVuY3Rpb24oYSl7dGhpcy5lPXQuRS5hKGEpfX0KWC5kdi5w
+cm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3JldHVybiJQYXRoRXhjZXB0aW9uOiAiK3RoaXMuYX0sCiRp
+Uno6MX0KTy56TC5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmdvYyh0aGlzKX19
+CkUuT0YucHJvdG90eXBlPXsKVWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIEMueEIudGcoYSwiLyIpfSwKcjQ6
+ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT00N30sCmRzOmZ1bmN0aW9uKGEpe3ZhciBzPWEubGVuZ3RoCnJl
+dHVybiBzIT09MCYmQy54Qi5PMihhLHMtMSkhPT00N30sClNwOmZ1bmN0aW9uKGEsYil7aWYoYS5sZW5n
+dGghPT0wJiZDLnhCLlcoYSwwKT09PTQ3KXJldHVybiAxCnJldHVybiAwfSwKWXI6ZnVuY3Rpb24oYSl7
+cmV0dXJuIHRoaXMuU3AoYSwhMSl9LApoSzpmdW5jdGlvbihhKXtyZXR1cm4hMX0sCmdvYzpmdW5jdGlv
+bigpe3JldHVybiJwb3NpeCJ9LApnbUk6ZnVuY3Rpb24oKXtyZXR1cm4iLyJ9fQpGLnJ1LnByb3RvdHlw
 ZT17ClVkOmZ1bmN0aW9uKGEpe3JldHVybiBDLnhCLnRnKGEsIi8iKX0sCnI0OmZ1bmN0aW9uKGEpe3Jl
-dHVybiBhPT09NDd8fGE9PT05Mn0sCmRzOmZ1bmN0aW9uKGEpe3ZhciBzPWEubGVuZ3RoCmlmKHM9PT0w
-KXJldHVybiExCnM9Qy54Qi5tKGEscy0xKQpyZXR1cm4hKHM9PT00N3x8cz09PTkyKX0sClNwOmZ1bmN0
-aW9uKGEsYil7dmFyIHMscixxPWEubGVuZ3RoCmlmKHE9PT0wKXJldHVybiAwCnM9Qy54Qi5XKGEsMCkK
-aWYocz09PTQ3KXJldHVybiAxCmlmKHM9PT05Mil7aWYocTwyfHxDLnhCLlcoYSwxKSE9PTkyKXJldHVy
-biAxCnI9Qy54Qi5YVShhLCJcXCIsMikKaWYocj4wKXtyPUMueEIuWFUoYSwiXFwiLHIrMSkKaWYocj4w
-KXJldHVybiByfXJldHVybiBxfWlmKHE8MylyZXR1cm4gMAppZighQi5PUyhzKSlyZXR1cm4gMAppZihD
-LnhCLlcoYSwxKSE9PTU4KXJldHVybiAwCnE9Qy54Qi5XKGEsMikKaWYoIShxPT09NDd8fHE9PT05Mikp
-cmV0dXJuIDAKcmV0dXJuIDN9LApZcjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5TcChhLCExKX0sCmhL
-OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLllyKGEpPT09MX0sCk90OmZ1bmN0aW9uKGEsYil7dmFyIHMK
-aWYoYT09PWIpcmV0dXJuITAKaWYoYT09PTQ3KXJldHVybiBiPT09OTIKaWYoYT09PTkyKXJldHVybiBi
-PT09NDcKaWYoKGFeYikhPT0zMilyZXR1cm4hMQpzPWF8MzIKcmV0dXJuIHM+PTk3JiZzPD0xMjJ9LApO
-YzpmdW5jdGlvbihhLGIpe3ZhciBzLHIscQppZihhPT1iKXJldHVybiEwCnM9YS5sZW5ndGgKaWYocyE9
-PWIubGVuZ3RoKXJldHVybiExCmZvcihyPUouclkoYikscT0wO3E8czsrK3EpaWYoIXRoaXMuT3QoQy54
-Qi5XKGEscSksci5XKGIscSkpKXJldHVybiExCnJldHVybiEwfSwKZ29jOmZ1bmN0aW9uKCl7cmV0dXJu
-IndpbmRvd3MifSwKZ21JOmZ1bmN0aW9uKCl7cmV0dXJuIlxcIn19OyhmdW5jdGlvbiBhbGlhc2VzKCl7
-dmFyIHM9Si52Qi5wcm90b3R5cGUKcy5VPXMudwpzLlNqPXMuZTcKcz1KLk1GLnByb3RvdHlwZQpzLnQ9
-cy53CnM9UC5jWC5wcm90b3R5cGUKcy5HRz1zLmV2CnM9UC5NaC5wcm90b3R5cGUKcy54Yj1zLncKcz1X
-LmN2LnByb3RvdHlwZQpzLkRXPXMucjYKcz1XLm02LnByb3RvdHlwZQpzLmpGPXMuRWIKcz1QLkU0LnBy
-b3RvdHlwZQpzLlVyPXMucQpzLmU0PXMuWX0pKCk7KGZ1bmN0aW9uIGluc3RhbGxUZWFyT2Zmcygpe3Zh
-ciBzPWh1bmtIZWxwZXJzLl9zdGF0aWNfMSxyPWh1bmtIZWxwZXJzLl9zdGF0aWNfMCxxPWh1bmtIZWxw
-ZXJzLmluc3RhbGxJbnN0YW5jZVRlYXJPZmYscD1odW5rSGVscGVycy5pbnN0YWxsU3RhdGljVGVhck9m
-ZixvPWh1bmtIZWxwZXJzLl9pbnN0YW5jZV8xdQpzKFAsIkVYIiwiWlYiLDgpCnMoUCwieXQiLCJvQSIs
-OCkKcyhQLCJxVyIsIkJ6Iiw4KQpyKFAsIlY5IiwiZU4iLDEpCnEoUC5QZi5wcm90b3R5cGUsImdZSiIs
-MCwxLG51bGwsWyIkMiIsIiQxIl0sWyJ3MCIsInBtIl0sMjksMCkKcyhQLCJDeSIsIk5DIiw0KQpzKFAs
-IlBIIiwiTXQiLDUpCnAoVywicFMiLDQsbnVsbCxbIiQ0Il0sWyJxRCJdLDksMCkKcChXLCJWNCIsNCxu
-dWxsLFsiJDQiXSxbIlFXIl0sOSwwKQpvKFAuQXMucHJvdG90eXBlLCJndU0iLCJUIiw1KQpzKFAsImlH
-Iiwid1kiLDUzKQpzKFAsIncwIiwiZFUiLDM2KQpzKEwsImlTIiwiaTYiLDIwKX0pKCk7KGZ1bmN0aW9u
-IGluaGVyaXRhbmNlKCl7dmFyIHM9aHVua0hlbHBlcnMubWl4aW4scj1odW5rSGVscGVycy5pbmhlcml0
-LHE9aHVua0hlbHBlcnMuaW5oZXJpdE1hbnkKcihQLk1oLG51bGwpCnEoUC5NaCxbSC5GSyxKLnZCLEou
-bTEsUC5jWCxILkU3LFAuWFMsUC5uWSxILmE3LFAuQW4sSC5GdSxILkpCLEguU1UsSC5SZSxILnd2LFAu
-UG4sSC5XVSxILkxJLEguVHAsSC5mOSxILnRlLEguYnEsSC5YTyxILmtyLFAuWWssSC52aCxILk42LEgu
-VlIsSC5FSyxILlBiLEgudFEsSC5TZCxILkpjLEguRyxQLlczLFAuaWgsUC5GeSxQLkdWLFAuUGYsUC5G
-ZSxQLnZzLFAuT00sUC5xaCxQLk1PLFAua1QsUC54SSxQLkN3LFAubTAsUC5YdixQLmJuLFAubG0sUC5s
-RCxQLktQLFAubGYsUC5XWSxQLlVrLFAuU2gsUC5SdyxQLmJ6LFAuaVAsUC5rNSxQLktZLFAuQ0QsUC5h
-RSxQLk4zLFAuYzgsUC5aZCxQLlJuLFAuRG4sUC5QRSxQLlVmLFcuaWQsVy5GayxXLkpRLFcuR20sVy52
-RCxXLm02LFcuT3csVy5XOSxXLmRXLFcuRmIsVy5tayxXLktvLFAuaUosUC5FNCxNLkg3LFUuTEwsVS5k
-MixVLlNlLFUuTWwsVS55RCxVLndiLEIuajgsQi5xcCxULm1RLEwuWEEsTC5aWixMLk85LE0ubEksTy56
-TCxYLldELFguZHZdKQpxKEoudkIsW0oueUUsSi53ZSxKLk1GLEouamQsSi5xSSxKLkRyLEguRVQsVy5E
-MCxXLkF6LFcuTGUsVy5OaCxXLmFlLFcuSUIsVy5uNyxXLmVhLFcuYnIsVy5TZyxXLnU4LFcuSzcsVy5Y
-VyxQLmhGXSkKcShKLk1GLFtKLmlDLEoua2QsSi5jNV0pCnIoSi5QbyxKLmpkKQpxKEoucUksW0ouYlUs
-Si5WQV0pCnEoUC5jWCxbSC5CUixILmJRLEguaTEsSC5VNSxILkFNLEgudTYsSC5YUixQLm1XLEgudW5d
-KQpxKEguQlIsW0guWnksSC5RQ10pCnIoSC5vbCxILlp5KQpyKEguVXEsSC5RQykKcihILmpWLEguVXEp
-CnEoUC5YUyxbSC5uLFAuRXosSC5heixILnZWLEguRXEsUC5DNixILmtTLFAuVWQsUC5GLFAudSxQLm1w
-LFAudWIsUC5kcyxQLmxqLFAuVVYsUC5wXSkKcihQLnV5LFAublkpCnEoUC51eSxbSC53MixXLnd6LFcu
-ZTddKQpyKEgucWosSC53MikKcShILmJRLFtILmFMLEguTUIsSC5pNV0pCnEoSC5hTCxbSC5uSCxILmxK
-LFAuaThdKQpyKEgueHksSC5pMSkKcShQLkFuLFtILk1ILEguU08sSC5VMV0pCnIoSC5kNSxILkFNKQpy
-KFAuUlUsUC5QbikKcihQLkdqLFAuUlUpCnIoSC5QRCxQLkdqKQpyKEguTFAsSC5XVSkKcShILlRwLFtI
-LkNqLEgubGMsSC5kQyxILndOLEguVlgsUC50aCxQLmhhLFAuVnMsUC5GdCxQLnlILFAuV00sUC5TWCxQ
-LkdzLFAuZGEsUC5vUSxQLnBWLFAuVTcsUC52cixQLnJ0LFAuS0YsUC5aTCxQLlJULFAualosUC5ycSxQ
-LlJXLFAuQjUsUC51TyxQLnBLLFAuaGosUC5WcCxQLk9SLFAucmEsUC55USxQLnBnLFAuYzIsUC50aSxQ
-LldGLFAubjEsUC5jUyxQLlZDLFAuSlQsUC5SWixQLk1FLFAueTUsUC5xMyxQLnlJLFAuYzYsUC5xZCxX
-LkN2LFcuS1MsVy5BMyxXLnZOLFcuVXYsVy5FZyxXLkVvLFcuV2ssVy5JQSxXLmZtLFAuamcsUC5UYSxQ
-LkdFLFAuTjcsUC51USxQLlBDLFAubXQsUC5OeixQLlFTLFAubnAsVS5NRCxVLmFOLFUuYjAsTC5lLEwu
-VlcsTC5vWixMLmpyLEwucWwsTC5IaSxMLkJULEwuUFksTC5MLEwuV3gsTC5BTyxMLmROLEwuSG8sTC54
-eixMLklDLEwuZkMsTC51ZSxMLm5ULEwuTlksTC5lWCxMLkVFLEwuUUwsTC5WUyxMLlRELEwuQVMsTS5x
-NyxNLk5vXSkKcihILlcwLFAuRXopCnEoSC5sYyxbSC56eCxILnJUXSkKcihILmtZLFAuQzYpCnIoUC5p
-bCxQLllrKQpxKFAuaWwsW0guTjUsUC51dyxXLmNmLFcuU3ldKQpxKFAubVcsW0guS1csUC5xNF0pCnIo
-SC5YSCxILkVUKQpxKEguWEgsW0guUkcsSC5XQl0pCnIoSC5WUCxILlJHKQpyKEguRGcsSC5WUCkKcihI
-LlpHLEguV0IpCnIoSC5QZyxILlpHKQpxKEguUGcsW0gueGosSC5kRSxILlpBLEguZFQsSC5QcSxILmVF
-LEguVjZdKQpyKEguaU0sSC5rUykKcihQLlpmLFAuUGYpCnIoUC5KaSxQLm0wKQpyKFAuYjYsUC5YdikK
-cihQLlZqLFAuV1kpCnEoUC5VayxbUC5DVixQLlppLFAuYnldKQpyKFAud0ksUC5rVCkKcShQLndJLFtQ
-LlU4LFAub2osUC5NeCxQLkUzLFAuR1ldKQpyKFAuSzgsUC5VZCkKcihQLnR1LFAuU2gpCnIoUC51NSxQ
-LlppKQpxKFAudSxbUC5iSixQLmVZXSkKcihQLnFlLFAuRG4pCnEoVy5EMCxbVy51SCxXLndhLFcuSzUs
-Vy5DbV0pCnEoVy51SCxbVy5jdixXLm54LFcuUUYsVy5DUV0pCnEoVy5jdixbVy5xRSxQLmhpXSkKcShX
-LnFFLFtXLkdoLFcuZlksVy5uQixXLlFQLFcuaDQsVy5TTixXLmxwLFcuVGIsVy5JdixXLldQLFcueVld
-KQpyKFcub0osVy5MZSkKcihXLmhILFcuQXopCnIoVy5WYixXLlFGKQpyKFcuZkosVy53YSkKcShXLmVh
-LFtXLnc2LFcuZXddKQpyKFcuQWosVy53NikKcihXLnJCLFcuSzcpCnIoVy5CSCxXLnJCKQpyKFcudzQs
-Vy5JQikKcihXLm9hLFcuWFcpCnIoVy5yaCxXLm9hKQpyKFcuaTcsVy5jZikKcihQLkFzLFAuVmopCnEo
-UC5BcyxbVy5JNCxQLktlXSkKcihXLlJPLFAucWgpCnIoVy5ldSxXLlJPKQpyKFcueEMsUC5NTykKcihX
-LmN0LFcubTYpCnIoUC5CZixQLmlKKQpxKFAuRTQsW1AucjcsUC5jb10pCnIoUC5UeixQLmNvKQpyKFAu
-bmQsUC5oaSkKcihCLmZ2LE8uekwpCnEoQi5mdixbRS5PRixGLnJ1LEwuSVZdKQpzKEgudzIsSC5SZSkK
-cyhILlFDLFAubEQpCnMoSC5SRyxQLmxEKQpzKEguVlAsSC5TVSkKcyhILldCLFAubEQpCnMoSC5aRyxI
-LlNVKQpzKFAublksUC5sRCkKcyhQLldZLFAubGYpCnMoUC5SVSxQLktQKQpzKFcuTGUsVy5pZCkKcyhX
-Lks3LFAubEQpCnMoVy5yQixXLkdtKQpzKFcuWFcsUC5sRCkKcyhXLm9hLFcuR20pCnMoUC5jbyxQLmxE
-KX0pKCkKdmFyIHY9e3R5cGVVbml2ZXJzZTp7ZUM6bmV3IE1hcCgpLHRSOnt9LGVUOnt9LHRQVjp7fSxz
-RUE6W119LG1hbmdsZWRHbG9iYWxOYW1lczp7SWY6ImludCIsQ1A6ImRvdWJsZSIsTFo6Im51bSIscVU6
-IlN0cmluZyIsYTI6ImJvb2wiLGM4OiJOdWxsIix6TToiTGlzdCJ9LG1hbmdsZWROYW1lczp7fSxnZXRU
-eXBlRnJvbU5hbWU6Z2V0R2xvYmFsRnJvbU5hbWUsbWV0YWRhdGE6W10sdHlwZXM6WyJjOCgpIiwifigp
-IiwiYzgoQWoqKSIsImM4KGN2KikiLCJAKEApIiwicVUocVUpIiwiYTIocVUpIiwiYzgoQCxAKSIsIn4o
-figpKSIsImEyKGN2LHFVLHFVLEpRKSIsImM4KEApIiwiYzgocVUscVUpIiwiYzgoTWg/LE1oPykiLCJA
-KCkiLCJjOChxVSxAKSIsIn4objYscVUsSWYpIiwiYTIoa0YpIiwifih4dTxxVT4pIiwiYzgoZWEqKSIs
-ImI4PGM4PiooQWoqKSIsIn4oQWoqKSIsIn4ocVUsSWYpIiwifihxVSxxVT8pIiwibjYoSWYpIiwibjYo
-QCxAKSIsImM4KElmLEApIiwiYTIodUgpIiwiYzgoQCxHeikiLCJAKGVhKSIsIn4oTWhbR3o/XSkiLCJj
-OChNaCxHeikiLCJ+KHVILHVIPykiLCJ2czxAPihAKSIsImEyKHh1PHFVPikiLCJAKHFVKSIsInI3KEAp
-IiwiTWg/KEApIiwiRTQoQCkiLCJhMiooSDcqKSIsIkxMKihAKSIsIlowPHFVKixNaCo+KihMTCopIiwi
-QChALHFVKSIsImM4KEdELEApIiwiYzgoWjA8cVUqLE1oKj4qKSIsIlowPHFVLHFVPihaMDxxVSxxVT4s
-cVUpIiwicVUqKEFqKikiLCJ+KEApIiwiYzgoZXcqKSIsInFVKihaMDxALEA+KikiLCJ+KHFVW0BdKSIs
-InFVKHFVPykiLCJJZihJZixJZikiLCJjOCh+KCkpIiwiTWg/KE1oPykiLCJUejxAPihAKSJdLGludGVy
-Y2VwdG9yc0J5VGFnOm51bGwsbGVhZlRhZ3M6bnVsbCxhcnJheVJ0aTp0eXBlb2YgU3ltYm9sPT0iZnVu
-Y3Rpb24iJiZ0eXBlb2YgU3ltYm9sKCk9PSJzeW1ib2wiP1N5bWJvbCgiJHRpIik6IiR0aSJ9CkgueGIo
-di50eXBlVW5pdmVyc2UsSlNPTi5wYXJzZSgneyJjNSI6Ik1GIiwiaUMiOiJNRiIsImtkIjoiTUYiLCJy
-eCI6ImVhIiwiZTUiOiJlYSIsIlkwIjoiaGkiLCJ0cCI6ImhpIiwiRzgiOiJldyIsIk1yIjoicUUiLCJl
-TCI6InFFIiwiSTAiOiJ1SCIsImhzIjoidUgiLCJYZyI6IlFGIiwibnIiOiJBaiIsInk0IjoidzYiLCJh
-UCI6IkNtIiwieGMiOiJueCIsImtKIjoibngiLCJ6VSI6IkRnIiwiZGYiOiJFVCIsInlFIjp7ImEyIjpb
-XX0sIndlIjp7ImM4IjpbXX0sIk1GIjp7InZtIjpbXSwiRUgiOltdfSwiamQiOnsiek0iOlsiMSJdLCJi
-USI6WyIxIl0sImNYIjpbIjEiXX0sIlBvIjp7ImpkIjpbIjEiXSwiek0iOlsiMSJdLCJiUSI6WyIxIl0s
-ImNYIjpbIjEiXX0sIm0xIjp7IkFuIjpbIjEiXX0sInFJIjp7IkNQIjpbXSwiTFoiOltdfSwiYlUiOnsi
-Q1AiOltdLCJJZiI6W10sIkxaIjpbXX0sIlZBIjp7IkNQIjpbXSwiTFoiOltdfSwiRHIiOnsicVUiOltd
-LCJ2WCI6W119LCJCUiI6eyJjWCI6WyIyIl19LCJFNyI6eyJBbiI6WyIyIl19LCJaeSI6eyJCUiI6WyIx
-IiwiMiJdLCJjWCI6WyIyIl0sImNYLkUiOiIyIn0sIm9sIjp7Ilp5IjpbIjEiLCIyIl0sIkJSIjpbIjEi
-LCIyIl0sImJRIjpbIjIiXSwiY1giOlsiMiJdLCJjWC5FIjoiMiJ9LCJVcSI6eyJsRCI6WyIyIl0sInpN
-IjpbIjIiXSwiQlIiOlsiMSIsIjIiXSwiYlEiOlsiMiJdLCJjWCI6WyIyIl19LCJqViI6eyJVcSI6WyIx
-IiwiMiJdLCJsRCI6WyIyIl0sInpNIjpbIjIiXSwiQlIiOlsiMSIsIjIiXSwiYlEiOlsiMiJdLCJjWCI6
-WyIyIl0sImxELkUiOiIyIiwiY1guRSI6IjIifSwibiI6eyJYUyI6W119LCJxaiI6eyJsRCI6WyJJZiJd
-LCJSZSI6WyJJZiJdLCJ6TSI6WyJJZiJdLCJiUSI6WyJJZiJdLCJjWCI6WyJJZiJdLCJsRC5FIjoiSWYi
-LCJSZS5FIjoiSWYifSwiYlEiOnsiY1giOlsiMSJdfSwiYUwiOnsiYlEiOlsiMSJdLCJjWCI6WyIxIl19
-LCJuSCI6eyJhTCI6WyIxIl0sImJRIjpbIjEiXSwiY1giOlsiMSJdLCJhTC5FIjoiMSIsImNYLkUiOiIx
-In0sImE3Ijp7IkFuIjpbIjEiXX0sImkxIjp7ImNYIjpbIjIiXSwiY1guRSI6IjIifSwieHkiOnsiaTEi
-OlsiMSIsIjIiXSwiYlEiOlsiMiJdLCJjWCI6WyIyIl0sImNYLkUiOiIyIn0sIk1IIjp7IkFuIjpbIjIi
-XX0sImxKIjp7ImFMIjpbIjIiXSwiYlEiOlsiMiJdLCJjWCI6WyIyIl0sImFMLkUiOiIyIiwiY1guRSI6
-IjIifSwiVTUiOnsiY1giOlsiMSJdLCJjWC5FIjoiMSJ9LCJTTyI6eyJBbiI6WyIxIl19LCJBTSI6eyJj
-WCI6WyIxIl0sImNYLkUiOiIxIn0sImQ1Ijp7IkFNIjpbIjEiXSwiYlEiOlsiMSJdLCJjWCI6WyIxIl0s
-ImNYLkUiOiIxIn0sIlUxIjp7IkFuIjpbIjEiXX0sIk1CIjp7ImJRIjpbIjEiXSwiY1giOlsiMSJdLCJj
-WC5FIjoiMSJ9LCJGdSI6eyJBbiI6WyIxIl19LCJ1NiI6eyJjWCI6WyIxIl0sImNYLkUiOiIxIn0sIkpC
-Ijp7IkFuIjpbIjEiXX0sIncyIjp7ImxEIjpbIjEiXSwiUmUiOlsiMSJdLCJ6TSI6WyIxIl0sImJRIjpb
-IjEiXSwiY1giOlsiMSJdfSwid3YiOnsiR0QiOltdfSwiUEQiOnsiR2oiOlsiMSIsIjIiXSwiUlUiOlsi
-MSIsIjIiXSwiUG4iOlsiMSIsIjIiXSwiS1AiOlsiMSIsIjIiXSwiWjAiOlsiMSIsIjIiXX0sIldVIjp7
-IlowIjpbIjEiLCIyIl19LCJMUCI6eyJXVSI6WyIxIiwiMiJdLCJaMCI6WyIxIiwiMiJdfSwiWFIiOnsi
-Y1giOlsiMSJdLCJjWC5FIjoiMSJ9LCJMSSI6eyJ2USI6W119LCJXMCI6eyJYUyI6W119LCJheiI6eyJY
-UyI6W119LCJ2ViI6eyJYUyI6W119LCJ0ZSI6eyJSeiI6W119LCJYTyI6eyJHeiI6W119LCJUcCI6eyJF
-SCI6W119LCJsYyI6eyJFSCI6W119LCJ6eCI6eyJFSCI6W119LCJyVCI6eyJFSCI6W119LCJFcSI6eyJY
-UyI6W119LCJrWSI6eyJYUyI6W119LCJONSI6eyJZayI6WyIxIiwiMiJdLCJGbyI6WyIxIiwiMiJdLCJa
-MCI6WyIxIiwiMiJdLCJZay5LIjoiMSIsIllrLlYiOiIyIn0sImk1Ijp7ImJRIjpbIjEiXSwiY1giOlsi
-MSJdLCJjWC5FIjoiMSJ9LCJONiI6eyJBbiI6WyIxIl19LCJWUiI6eyJ3TCI6W10sInZYIjpbXX0sIkVL
-Ijp7ImliIjpbXSwiT2QiOltdfSwiS1ciOnsiY1giOlsiaWIiXSwiY1guRSI6ImliIn0sIlBiIjp7IkFu
-IjpbImliIl19LCJ0USI6eyJPZCI6W119LCJ1biI6eyJjWCI6WyJPZCJdLCJjWC5FIjoiT2QifSwiU2Qi
-OnsiQW4iOlsiT2QiXX0sIkVUIjp7ImVxIjpbXX0sIlhIIjp7IlhqIjpbIjEiXSwiRVQiOltdLCJlcSI6
-W119LCJEZyI6eyJsRCI6WyJDUCJdLCJYaiI6WyJDUCJdLCJ6TSI6WyJDUCJdLCJFVCI6W10sImJRIjpb
-IkNQIl0sImVxIjpbXSwiY1giOlsiQ1AiXSwiU1UiOlsiQ1AiXSwibEQuRSI6IkNQIn0sIlBnIjp7ImxE
-IjpbIklmIl0sIlhqIjpbIklmIl0sInpNIjpbIklmIl0sIkVUIjpbXSwiYlEiOlsiSWYiXSwiZXEiOltd
-LCJjWCI6WyJJZiJdLCJTVSI6WyJJZiJdfSwieGoiOnsibEQiOlsiSWYiXSwiWGoiOlsiSWYiXSwiek0i
-OlsiSWYiXSwiRVQiOltdLCJiUSI6WyJJZiJdLCJlcSI6W10sImNYIjpbIklmIl0sIlNVIjpbIklmIl0s
-ImxELkUiOiJJZiJ9LCJkRSI6eyJsRCI6WyJJZiJdLCJYaiI6WyJJZiJdLCJ6TSI6WyJJZiJdLCJFVCI6
-W10sImJRIjpbIklmIl0sImVxIjpbXSwiY1giOlsiSWYiXSwiU1UiOlsiSWYiXSwibEQuRSI6IklmIn0s
-IlpBIjp7ImxEIjpbIklmIl0sIlhqIjpbIklmIl0sInpNIjpbIklmIl0sIkVUIjpbXSwiYlEiOlsiSWYi
-XSwiZXEiOltdLCJjWCI6WyJJZiJdLCJTVSI6WyJJZiJdLCJsRC5FIjoiSWYifSwiZFQiOnsibEQiOlsi
-SWYiXSwiWGoiOlsiSWYiXSwiek0iOlsiSWYiXSwiRVQiOltdLCJiUSI6WyJJZiJdLCJlcSI6W10sImNY
-IjpbIklmIl0sIlNVIjpbIklmIl0sImxELkUiOiJJZiJ9LCJQcSI6eyJsRCI6WyJJZiJdLCJYaiI6WyJJ
-ZiJdLCJ6TSI6WyJJZiJdLCJFVCI6W10sImJRIjpbIklmIl0sImVxIjpbXSwiY1giOlsiSWYiXSwiU1Ui
-OlsiSWYiXSwibEQuRSI6IklmIn0sImVFIjp7ImxEIjpbIklmIl0sIlhqIjpbIklmIl0sInpNIjpbIklm
-Il0sIkVUIjpbXSwiYlEiOlsiSWYiXSwiZXEiOltdLCJjWCI6WyJJZiJdLCJTVSI6WyJJZiJdLCJsRC5F
-IjoiSWYifSwiVjYiOnsibEQiOlsiSWYiXSwibjYiOltdLCJYaiI6WyJJZiJdLCJ6TSI6WyJJZiJdLCJF
-VCI6W10sImJRIjpbIklmIl0sImVxIjpbXSwiY1giOlsiSWYiXSwiU1UiOlsiSWYiXSwibEQuRSI6Iklm
-In0sImtTIjp7IlhTIjpbXX0sImlNIjp7IlhTIjpbXX0sIkdWIjp7IkFuIjpbIjEiXX0sInE0Ijp7ImNY
-IjpbIjEiXSwiY1guRSI6IjEifSwiWmYiOnsiUGYiOlsiMSJdfSwidnMiOnsiYjgiOlsiMSJdfSwiQ3ci
-OnsiWFMiOltdfSwibTAiOnsiUW0iOltdfSwiSmkiOnsibTAiOltdLCJRbSI6W119LCJiNiI6eyJYdiI6
-WyIxIl0sInh1IjpbIjEiXSwiYlEiOlsiMSJdLCJjWCI6WyIxIl19LCJsbSI6eyJBbiI6WyIxIl19LCJt
-VyI6eyJjWCI6WyIxIl19LCJ1eSI6eyJsRCI6WyIxIl0sInpNIjpbIjEiXSwiYlEiOlsiMSJdLCJjWCI6
-WyIxIl19LCJpbCI6eyJZayI6WyIxIiwiMiJdLCJaMCI6WyIxIiwiMiJdfSwiWWsiOnsiWjAiOlsiMSIs
-IjIiXX0sIlBuIjp7IlowIjpbIjEiLCIyIl19LCJHaiI6eyJSVSI6WyIxIiwiMiJdLCJQbiI6WyIxIiwi
-MiJdLCJLUCI6WyIxIiwiMiJdLCJaMCI6WyIxIiwiMiJdfSwiVmoiOnsibGYiOlsiMSJdLCJ4dSI6WyIx
-Il0sImJRIjpbIjEiXSwiY1giOlsiMSJdfSwiWHYiOnsieHUiOlsiMSJdLCJiUSI6WyIxIl0sImNYIjpb
-IjEiXX0sInV3Ijp7IllrIjpbInFVIiwiQCJdLCJaMCI6WyJxVSIsIkAiXSwiWWsuSyI6InFVIiwiWWsu
-ViI6IkAifSwiaTgiOnsiYUwiOlsicVUiXSwiYlEiOlsicVUiXSwiY1giOlsicVUiXSwiYUwuRSI6InFV
-IiwiY1guRSI6InFVIn0sIkNWIjp7IlVrIjpbInpNPElmPiIsInFVIl0sIlVrLlMiOiJ6TTxJZj4ifSwi
-VTgiOnsid0kiOlsiek08SWY+IiwicVUiXX0sIlppIjp7IlVrIjpbInFVIiwiek08SWY+Il19LCJVZCI6
-eyJYUyI6W119LCJLOCI6eyJYUyI6W119LCJieSI6eyJVayI6WyJNaD8iLCJxVSJdLCJVay5TIjoiTWg/
-In0sIm9qIjp7IndJIjpbIk1oPyIsInFVIl19LCJNeCI6eyJ3SSI6WyJxVSIsIk1oPyJdfSwidTUiOnsi
-VWsiOlsicVUiLCJ6TTxJZj4iXSwiVWsuUyI6InFVIn0sIkUzIjp7IndJIjpbInFVIiwiek08SWY+Il19
-LCJHWSI6eyJ3SSI6WyJ6TTxJZj4iLCJxVSJdfSwiQ1AiOnsiTFoiOltdfSwiSWYiOnsiTFoiOltdfSwi
-ek0iOnsiYlEiOlsiMSJdLCJjWCI6WyIxIl19LCJpYiI6eyJPZCI6W119LCJ4dSI6eyJiUSI6WyIxIl0s
-ImNYIjpbIjEiXX0sInFVIjp7InZYIjpbXX0sIkM2Ijp7IlhTIjpbXX0sIkV6Ijp7IlhTIjpbXX0sIkYi
-OnsiWFMiOltdfSwidSI6eyJYUyI6W119LCJiSiI6eyJYUyI6W119LCJlWSI6eyJYUyI6W119LCJtcCI6
-eyJYUyI6W119LCJ1YiI6eyJYUyI6W119LCJkcyI6eyJYUyI6W119LCJsaiI6eyJYUyI6W119LCJVViI6
-eyJYUyI6W119LCJrNSI6eyJYUyI6W119LCJLWSI6eyJYUyI6W119LCJwIjp7IlhTIjpbXX0sIkNEIjp7
-IlJ6IjpbXX0sImFFIjp7IlJ6IjpbXX0sIlpkIjp7Ikd6IjpbXX0sIlJuIjp7IkJMIjpbXX0sIkRuIjp7
-ImlEIjpbXX0sIlVmIjp7ImlEIjpbXX0sInFlIjp7ImlEIjpbXX0sInFFIjp7ImN2IjpbXSwidUgiOltd
-LCJEMCI6W119LCJHaCI6eyJjdiI6W10sInVIIjpbXSwiRDAiOltdfSwiZlkiOnsiY3YiOltdLCJ1SCI6
-W10sIkQwIjpbXX0sIm5CIjp7ImN2IjpbXSwidUgiOltdLCJEMCI6W119LCJRUCI6eyJjdiI6W10sInVI
-IjpbXSwiRDAiOltdfSwibngiOnsidUgiOltdLCJEMCI6W119LCJRRiI6eyJ1SCI6W10sIkQwIjpbXX0s
-IklCIjp7InRuIjpbIkxaIl19LCJ3eiI6eyJsRCI6WyIxIl0sInpNIjpbIjEiXSwiYlEiOlsiMSJdLCJj
-WCI6WyIxIl0sImxELkUiOiIxIn0sImN2Ijp7InVIIjpbXSwiRDAiOltdfSwiaEgiOnsiQXoiOltdfSwi
-aDQiOnsiY3YiOltdLCJ1SCI6W10sIkQwIjpbXX0sIlZiIjp7InVIIjpbXSwiRDAiOltdfSwiZkoiOnsi
-RDAiOltdfSwid2EiOnsiRDAiOltdfSwiQWoiOnsiZWEiOltdfSwiZTciOnsibEQiOlsidUgiXSwiek0i
-OlsidUgiXSwiYlEiOlsidUgiXSwiY1giOlsidUgiXSwibEQuRSI6InVIIn0sInVIIjp7IkQwIjpbXX0s
-IkJIIjp7ImxEIjpbInVIIl0sIkdtIjpbInVIIl0sInpNIjpbInVIIl0sIlhqIjpbInVIIl0sImJRIjpb
-InVIIl0sImNYIjpbInVIIl0sImxELkUiOiJ1SCIsIkdtLkUiOiJ1SCJ9LCJTTiI6eyJjdiI6W10sInVI
-IjpbXSwiRDAiOltdfSwiZXciOnsiZWEiOltdfSwibHAiOnsiY3YiOltdLCJ1SCI6W10sIkQwIjpbXX0s
-IlRiIjp7ImN2IjpbXSwidUgiOltdLCJEMCI6W119LCJJdiI6eyJjdiI6W10sInVIIjpbXSwiRDAiOltd
-fSwiV1AiOnsiY3YiOltdLCJ1SCI6W10sIkQwIjpbXX0sInlZIjp7ImN2IjpbXSwidUgiOltdLCJEMCI6
-W119LCJ3NiI6eyJlYSI6W119LCJLNSI6eyJ2NiI6W10sIkQwIjpbXX0sIkNtIjp7IkQwIjpbXX0sIkNR
-Ijp7InVIIjpbXSwiRDAiOltdfSwidzQiOnsidG4iOlsiTFoiXX0sInJoIjp7ImxEIjpbInVIIl0sIkdt
-IjpbInVIIl0sInpNIjpbInVIIl0sIlhqIjpbInVIIl0sImJRIjpbInVIIl0sImNYIjpbInVIIl0sImxE
-LkUiOiJ1SCIsIkdtLkUiOiJ1SCJ9LCJjZiI6eyJZayI6WyJxVSIsInFVIl0sIlowIjpbInFVIiwicVUi
-XX0sImk3Ijp7IllrIjpbInFVIiwicVUiXSwiWjAiOlsicVUiLCJxVSJdLCJZay5LIjoicVUiLCJZay5W
-IjoicVUifSwiU3kiOnsiWWsiOlsicVUiLCJxVSJdLCJaMCI6WyJxVSIsInFVIl0sIllrLksiOiJxVSIs
-IllrLlYiOiJxVSJ9LCJJNCI6eyJsZiI6WyJxVSJdLCJ4dSI6WyJxVSJdLCJiUSI6WyJxVSJdLCJjWCI6
-WyJxVSJdLCJsZi5FIjoicVUifSwiUk8iOnsicWgiOlsiMSJdfSwiZXUiOnsiUk8iOlsiMSJdLCJxaCI6
-WyIxIl19LCJ4QyI6eyJNTyI6WyIxIl19LCJKUSI6eyJrRiI6W119LCJ2RCI6eyJrRiI6W119LCJtNiI6
-eyJrRiI6W119LCJjdCI6eyJrRiI6W119LCJPdyI6eyJrRiI6W119LCJXOSI6eyJBbiI6WyIxIl19LCJk
-VyI6eyJ2NiI6W10sIkQwIjpbXX0sIm1rIjp7InkwIjpbXX0sIktvIjp7Im9uIjpbXX0sIkFzIjp7Imxm
-IjpbInFVIl0sInh1IjpbInFVIl0sImJRIjpbInFVIl0sImNYIjpbInFVIl19LCJyNyI6eyJFNCI6W119
-LCJUeiI6eyJsRCI6WyIxIl0sInpNIjpbIjEiXSwiYlEiOlsiMSJdLCJFNCI6W10sImNYIjpbIjEiXSwi
-bEQuRSI6IjEifSwibmQiOnsiaGkiOltdLCJjdiI6W10sInVIIjpbXSwiRDAiOltdfSwiS2UiOnsibGYi
-OlsicVUiXSwieHUiOlsicVUiXSwiYlEiOlsicVUiXSwiY1giOlsicVUiXSwibGYuRSI6InFVIn0sImhp
-Ijp7ImN2IjpbXSwidUgiOltdLCJEMCI6W119LCJYQSI6eyJrRiI6W119LCJkdiI6eyJSeiI6W119LCJP
-RiI6eyJmdiI6W119LCJydSI6eyJmdiI6W119LCJJViI6eyJmdiI6W119LCJuNiI6eyJ6TSI6WyJJZiJd
-LCJiUSI6WyJJZiJdLCJjWCI6WyJJZiJdLCJlcSI6W119fScpKQpILkZGKHYudHlwZVVuaXZlcnNlLEpT
-T04ucGFyc2UoJ3sidzIiOjEsIlFDIjoyLCJYSCI6MSwia1QiOjIsIm1XIjoxLCJ1eSI6MSwiaWwiOjIs
-IlZqIjoxLCJuWSI6MSwiV1kiOjEsImNvIjoxfScpKQp2YXIgdT17bDoiQ2Fubm90IGV4dHJhY3QgYSBm
-aWxlIHBhdGggZnJvbSBhIFVSSSB3aXRoIGEgZnJhZ21lbnQgY29tcG9uZW50IixpOiJDYW5ub3QgZXh0
-cmFjdCBhIGZpbGUgcGF0aCBmcm9tIGEgVVJJIHdpdGggYSBxdWVyeSBjb21wb25lbnQiLGo6IkNhbm5v
-dCBleHRyYWN0IGEgbm9uLVdpbmRvd3MgZmlsZSBwYXRoIGZyb20gYSBmaWxlIFVSSSB3aXRoIGFuIGF1
-dGhvcml0eSIsZDoiYXJlYS1hbmFseXplcixhbmFseXplci1ubmJkLW1pZ3JhdGlvbix0eXBlLWJ1ZyJ9
-CnZhciB0PShmdW5jdGlvbiBydGlpKCl7dmFyIHM9SC5OMApyZXR1cm57bjpzKCJDdyIpLGNSOnMoIm5C
-IiksdzpzKCJBeiIpLHA6cygiUVAiKSxnRjpzKCJQRDxHRCxAPiIpLGI6cygiYlE8QD4iKSxoOnMoImN2
-IikscjpzKCJYUyIpLEI6cygiZWEiKSxhUzpzKCJEMCIpLGc4OnMoIlJ6IiksYzg6cygiaEgiKSxZOnMo
-IkVIIiksZDpzKCJiODxAPiIpLEk6cygiU2ciKSxvOnMoInZRIiksZWg6cygiY1g8dUg+IiksUTpzKCJj
-WDxxVT4iKSx1OnMoImNYPEA+IiksdjpzKCJqZDxrRj4iKSxzOnMoImpkPHFVPiIpLHg6cygiamQ8QD4i
-KSxhOnMoImpkPElmPiIpLGQ3OnMoImpkPFNlKj4iKSxoNDpzKCJqZDxqOCo+IiksRzpzKCJqZDxaMDxx
-VSosTWgqPio+IiksY1E6cygiamQ8WloqPiIpLGk6cygiamQ8cVUqPiIpLGFBOnMoImpkPHlEKj4iKSxh
-SjpzKCJqZDx3Yio+IiksVjpzKCJqZDxJZio+IiksZDQ6cygiamQ8cVU/PiIpLFQ6cygid2UiKSxlSDpz
-KCJ2bSIpLEQ6cygiYzUiKSxhVTpzKCJYajxAPiIpLGFtOnMoIlR6PEA+IiksZW86cygiTjU8R0QsQD4i
-KSxkejpzKCJoRiIpLEU6cygiek08cVU+IiksajpzKCJ6TTxAPiIpLEw6cygiek08SWY+IiksSjpzKCJa
-MDxxVSxxVT4iKSxmOnMoIlowPEAsQD4iKSxkbzpzKCJsSjxxVSxAPiIpLGZqOnMoImxKPHFVKixxVT4i
-KSxkRTpzKCJFVCIpLGJtOnMoIlY2IiksQTpzKCJ1SCIpLGY2OnMoImtGIiksUDpzKCJjOCIpLEs6cygi
-TWgiKSxxOnMoInRuPExaPiIpLGZ2OnMoIndMIiksZXc6cygibmQiKSxDOnMoInh1PHFVPiIpLGw6cygi
-R3oiKSxOOnMoInFVIiksZDA6cygicVUocVUqKSIpLGc3OnMoImhpIiksZm86cygiR0QiKSxhVzpzKCJ5
-WSIpLGFrOnMoImVxIiksZ2M6cygibjYiKSxiSjpzKCJrZCIpLGR3OnMoIkdqPHFVLHFVPiIpLGREOnMo
-ImlEIiksZUo6cygidTY8cVU+IiksZzQ6cygiSzUiKSxjaTpzKCJ2NiIpLGcyOnMoIkNtIiksYkM6cygi
-WmY8ZkoqPiIpLGg5OnMoIkNRIiksYWM6cygiZTciKSxrOnMoImV1PEFqKj4iKSxSOnMoInd6PGN2Kj4i
-KSxjOnMoInZzPEA+IiksZko6cygidnM8SWY+IiksZ1Y6cygidnM8ZkoqPiIpLGNyOnMoIkpRIikseTpz
-KCJhMiIpLGFsOnMoImEyKE1oKSIpLGdSOnMoIkNQIiksejpzKCJAIiksZk86cygiQCgpIiksYkk6cygi
-QChNaCkiKSxhZzpzKCJAKE1oLEd6KSIpLGJVOnMoIkAoeHU8cVU+KSIpLGRPOnMoIkAocVUpIiksYjg6
-cygiQChALEApIiksUzpzKCJJZiIpLGRkOnMoIkdoKiIpLGc6cygiY3YqIiksYUw6cygiZWEqIiksYVg6
-cygiTEwqIiksZkU6cygiSDcqIiksVTpzKCJjWDxAPioiKSxkSDpzKCJFNCoiKSxmSzpzKCJ6TTxAPioi
-KSxkXzpzKCJ6TTxqOCo+KiIpLGRwOnMoInpNPFowPHFVKixNaCo+Kj4qIiksbTpzKCJ6TTxNaCo+KiIp
-LGJaOnMoInU4KiIpLGF3OnMoIlowPEAsQD4qIiksdDpzKCJaMDxxVSosTWgqPioiKSxPOnMoIkFqKiIp
-LGNGOnMoIjAmKiIpLF86cygiTWgqIiksZVE6cygiZXcqIiksWDpzKCJxVSoiKSxjaDpzKCJEMD8iKSxi
-RzpzKCJiODxjOD4/IiksYms6cygiek08cVU+PyIpLGJNOnMoInpNPEA+PyIpLGNaOnMoIlowPHFVLHFV
-Pj8iKSxjOTpzKCJaMDxxVSxAPj8iKSxXOnMoIk1oPyIpLEY6cygiRmU8QCxAPj8iKSxlOnMoImJuPyIp
-LGI3OnMoImEyKE1oKT8iKSxidzpzKCJAKGVhKT8iKSxmVjpzKCJNaD8oTWg/LE1oPyk/IiksZEE6cygi
-TWg/KEApPyIpLFo6cygifigpPyIpLGViOnMoIn4oZXcqKT8iKSxkaTpzKCJMWiIpLEg6cygifiIpLE06
-cygifigpIiksZUE6cygifihxVSxxVSkiKSxjQTpzKCJ+KHFVLEApIil9fSkoKTsoZnVuY3Rpb24gY29u
-c3RhbnRzKCl7dmFyIHM9aHVua0hlbHBlcnMubWFrZUNvbnN0TGlzdApDLnhuPVcuR2gucHJvdG90eXBl
-CkMuUlk9Vy5RUC5wcm90b3R5cGUKQy5tSD1XLmFlLnByb3RvdHlwZQpDLkJaPVcuVmIucHJvdG90eXBl
-CkMuRHQ9Vy5mSi5wcm90b3R5cGUKQy5Paz1KLnZCLnByb3RvdHlwZQpDLk5tPUouamQucHJvdG90eXBl
-CkMuam49Si5iVS5wcm90b3R5cGUKQy5qTj1KLndlLnByb3RvdHlwZQpDLkNEPUoucUkucHJvdG90eXBl
-CkMueEI9Si5Eci5wcm90b3R5cGUKQy5ERz1KLmM1LnByb3RvdHlwZQpDLkV4PVcudTgucHJvdG90eXBl
-CkMudDU9Vy5CSC5wcm90b3R5cGUKQy5MdD1XLlNOLnByb3RvdHlwZQpDLlpRPUouaUMucHJvdG90eXBl
-CkMuSWU9Vy5UYi5wcm90b3R5cGUKQy52Qj1KLmtkLnByb3RvdHlwZQpDLm9sPVcuSzUucHJvdG90eXBl
-CkMueTg9bmV3IFAuVTgoKQpDLmg5PW5ldyBQLkNWKCkKQy5Hdz1uZXcgSC5GdShILk4wKCJGdTxjOD4i
-KSkKQy5PND1mdW5jdGlvbiBnZXRUYWdGYWxsYmFjayhvKSB7CiAgdmFyIHMgPSBPYmplY3QucHJvdG90
-eXBlLnRvU3RyaW5nLmNhbGwobyk7CiAgcmV0dXJuIHMuc3Vic3RyaW5nKDgsIHMubGVuZ3RoIC0gMSk7
-Cn0KQy5ZcT1mdW5jdGlvbigpIHsKICB2YXIgdG9TdHJpbmdGdW5jdGlvbiA9IE9iamVjdC5wcm90b3R5
-cGUudG9TdHJpbmc7CiAgZnVuY3Rpb24gZ2V0VGFnKG8pIHsKICAgIHZhciBzID0gdG9TdHJpbmdGdW5j
-dGlvbi5jYWxsKG8pOwogICAgcmV0dXJuIHMuc3Vic3RyaW5nKDgsIHMubGVuZ3RoIC0gMSk7CiAgfQog
-IGZ1bmN0aW9uIGdldFVua25vd25UYWcob2JqZWN0LCB0YWcpIHsKICAgIGlmICgvXkhUTUxbQS1aXS4q
-RWxlbWVudCQvLnRlc3QodGFnKSkgewogICAgICB2YXIgbmFtZSA9IHRvU3RyaW5nRnVuY3Rpb24uY2Fs
-bChvYmplY3QpOwogICAgICBpZiAobmFtZSA9PSAiW29iamVjdCBPYmplY3RdIikgcmV0dXJuIG51bGw7
-CiAgICAgIHJldHVybiAiSFRNTEVsZW1lbnQiOwogICAgfQogIH0KICBmdW5jdGlvbiBnZXRVbmtub3du
-VGFnR2VuZXJpY0Jyb3dzZXIob2JqZWN0LCB0YWcpIHsKICAgIGlmIChzZWxmLkhUTUxFbGVtZW50ICYm
-IG9iamVjdCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSByZXR1cm4gIkhUTUxFbGVtZW50IjsKICAgIHJl
-dHVybiBnZXRVbmtub3duVGFnKG9iamVjdCwgdGFnKTsKICB9CiAgZnVuY3Rpb24gcHJvdG90eXBlRm9y
-VGFnKHRhZykgewogICAgaWYgKHR5cGVvZiB3aW5kb3cgPT0gInVuZGVmaW5lZCIpIHJldHVybiBudWxs
-OwogICAgaWYgKHR5cGVvZiB3aW5kb3dbdGFnXSA9PSAidW5kZWZpbmVkIikgcmV0dXJuIG51bGw7CiAg
-ICB2YXIgY29uc3RydWN0b3IgPSB3aW5kb3dbdGFnXTsKICAgIGlmICh0eXBlb2YgY29uc3RydWN0b3Ig
-IT0gImZ1bmN0aW9uIikgcmV0dXJuIG51bGw7CiAgICByZXR1cm4gY29uc3RydWN0b3IucHJvdG90eXBl
-OwogIH0KICBmdW5jdGlvbiBkaXNjcmltaW5hdG9yKHRhZykgeyByZXR1cm4gbnVsbDsgfQogIHZhciBp
-c0Jyb3dzZXIgPSB0eXBlb2YgbmF2aWdhdG9yID09ICJvYmplY3QiOwogIHJldHVybiB7CiAgICBnZXRU
-YWc6IGdldFRhZywKICAgIGdldFVua25vd25UYWc6IGlzQnJvd3NlciA/IGdldFVua25vd25UYWdHZW5l
-cmljQnJvd3NlciA6IGdldFVua25vd25UYWcsCiAgICBwcm90b3R5cGVGb3JUYWc6IHByb3RvdHlwZUZv
-clRhZywKICAgIGRpc2NyaW1pbmF0b3I6IGRpc2NyaW1pbmF0b3IgfTsKfQpDLndiPWZ1bmN0aW9uKGdl
-dFRhZ0ZhbGxiYWNrKSB7CiAgcmV0dXJuIGZ1bmN0aW9uKGhvb2tzKSB7CiAgICBpZiAodHlwZW9mIG5h
-dmlnYXRvciAhPSAib2JqZWN0IikgcmV0dXJuIGhvb2tzOwogICAgdmFyIHVhID0gbmF2aWdhdG9yLnVz
-ZXJBZ2VudDsKICAgIGlmICh1YS5pbmRleE9mKCJEdW1wUmVuZGVyVHJlZSIpID49IDApIHJldHVybiBo
-b29rczsKICAgIGlmICh1YS5pbmRleE9mKCJDaHJvbWUiKSA+PSAwKSB7CiAgICAgIGZ1bmN0aW9uIGNv
-bmZpcm0ocCkgewogICAgICAgIHJldHVybiB0eXBlb2Ygd2luZG93ID09ICJvYmplY3QiICYmIHdpbmRv
-d1twXSAmJiB3aW5kb3dbcF0ubmFtZSA9PSBwOwogICAgICB9CiAgICAgIGlmIChjb25maXJtKCJXaW5k
-b3ciKSAmJiBjb25maXJtKCJIVE1MRWxlbWVudCIpKSByZXR1cm4gaG9va3M7CiAgICB9CiAgICBob29r
-cy5nZXRUYWcgPSBnZXRUYWdGYWxsYmFjazsKICB9Owp9CkMuS1U9ZnVuY3Rpb24oaG9va3MpIHsKICBp
-ZiAodHlwZW9mIGRhcnRFeHBlcmltZW50YWxGaXh1cEdldFRhZyAhPSAiZnVuY3Rpb24iKSByZXR1cm4g
-aG9va3M7CiAgaG9va3MuZ2V0VGFnID0gZGFydEV4cGVyaW1lbnRhbEZpeHVwR2V0VGFnKGhvb2tzLmdl
-dFRhZyk7Cn0KQy5mUT1mdW5jdGlvbihob29rcykgewogIHZhciBnZXRUYWcgPSBob29rcy5nZXRUYWc7
-CiAgdmFyIHByb3RvdHlwZUZvclRhZyA9IGhvb2tzLnByb3RvdHlwZUZvclRhZzsKICBmdW5jdGlvbiBn
-ZXRUYWdGaXhlZChvKSB7CiAgICB2YXIgdGFnID0gZ2V0VGFnKG8pOwogICAgaWYgKHRhZyA9PSAiRG9j
-dW1lbnQiKSB7CiAgICAgIGlmICghIW8ueG1sVmVyc2lvbikgcmV0dXJuICIhRG9jdW1lbnQiOwogICAg
-ICByZXR1cm4gIiFIVE1MRG9jdW1lbnQiOwogICAgfQogICAgcmV0dXJuIHRhZzsKICB9CiAgZnVuY3Rp
-b24gcHJvdG90eXBlRm9yVGFnRml4ZWQodGFnKSB7CiAgICBpZiAodGFnID09ICJEb2N1bWVudCIpIHJl
-dHVybiBudWxsOwogICAgcmV0dXJuIHByb3RvdHlwZUZvclRhZyh0YWcpOwogIH0KICBob29rcy5nZXRU
-YWcgPSBnZXRUYWdGaXhlZDsKICBob29rcy5wcm90b3R5cGVGb3JUYWcgPSBwcm90b3R5cGVGb3JUYWdG
-aXhlZDsKfQpDLmRrPWZ1bmN0aW9uKGhvb2tzKSB7CiAgdmFyIHVzZXJBZ2VudCA9IHR5cGVvZiBuYXZp
-Z2F0b3IgPT0gIm9iamVjdCIgPyBuYXZpZ2F0b3IudXNlckFnZW50IDogIiI7CiAgaWYgKHVzZXJBZ2Vu
-dC5pbmRleE9mKCJGaXJlZm94IikgPT0gLTEpIHJldHVybiBob29rczsKICB2YXIgZ2V0VGFnID0gaG9v
-a3MuZ2V0VGFnOwogIHZhciBxdWlja01hcCA9IHsKICAgICJCZWZvcmVVbmxvYWRFdmVudCI6ICJFdmVu
-dCIsCiAgICAiRGF0YVRyYW5zZmVyIjogIkNsaXBib2FyZCIsCiAgICAiR2VvR2VvbG9jYXRpb24iOiAi
-R2VvbG9jYXRpb24iLAogICAgIkxvY2F0aW9uIjogIiFMb2NhdGlvbiIsCiAgICAiV29ya2VyTWVzc2Fn
-ZUV2ZW50IjogIk1lc3NhZ2VFdmVudCIsCiAgICAiWE1MRG9jdW1lbnQiOiAiIURvY3VtZW50In07CiAg
-ZnVuY3Rpb24gZ2V0VGFnRmlyZWZveChvKSB7CiAgICB2YXIgdGFnID0gZ2V0VGFnKG8pOwogICAgcmV0
-dXJuIHF1aWNrTWFwW3RhZ10gfHwgdGFnOwogIH0KICBob29rcy5nZXRUYWcgPSBnZXRUYWdGaXJlZm94
-Owp9CkMueGk9ZnVuY3Rpb24oaG9va3MpIHsKICB2YXIgdXNlckFnZW50ID0gdHlwZW9mIG5hdmlnYXRv
-ciA9PSAib2JqZWN0IiA/IG5hdmlnYXRvci51c2VyQWdlbnQgOiAiIjsKICBpZiAodXNlckFnZW50Lmlu
-ZGV4T2YoIlRyaWRlbnQvIikgPT0gLTEpIHJldHVybiBob29rczsKICB2YXIgZ2V0VGFnID0gaG9va3Mu
-Z2V0VGFnOwogIHZhciBxdWlja01hcCA9IHsKICAgICJCZWZvcmVVbmxvYWRFdmVudCI6ICJFdmVudCIs
-CiAgICAiRGF0YVRyYW5zZmVyIjogIkNsaXBib2FyZCIsCiAgICAiSFRNTERERWxlbWVudCI6ICJIVE1M
-RWxlbWVudCIsCiAgICAiSFRNTERURWxlbWVudCI6ICJIVE1MRWxlbWVudCIsCiAgICAiSFRNTFBocmFz
-ZUVsZW1lbnQiOiAiSFRNTEVsZW1lbnQiLAogICAgIlBvc2l0aW9uIjogIkdlb3Bvc2l0aW9uIgogIH07
-CiAgZnVuY3Rpb24gZ2V0VGFnSUUobykgewogICAgdmFyIHRhZyA9IGdldFRhZyhvKTsKICAgIHZhciBu
-ZXdUYWcgPSBxdWlja01hcFt0YWddOwogICAgaWYgKG5ld1RhZykgcmV0dXJuIG5ld1RhZzsKICAgIGlm
-ICh0YWcgPT0gIk9iamVjdCIpIHsKICAgICAgaWYgKHdpbmRvdy5EYXRhVmlldyAmJiAobyBpbnN0YW5j
-ZW9mIHdpbmRvdy5EYXRhVmlldykpIHJldHVybiAiRGF0YVZpZXciOwogICAgfQogICAgcmV0dXJuIHRh
-ZzsKICB9CiAgZnVuY3Rpb24gcHJvdG90eXBlRm9yVGFnSUUodGFnKSB7CiAgICB2YXIgY29uc3RydWN0
-b3IgPSB3aW5kb3dbdGFnXTsKICAgIGlmIChjb25zdHJ1Y3RvciA9PSBudWxsKSByZXR1cm4gbnVsbDsK
-ICAgIHJldHVybiBjb25zdHJ1Y3Rvci5wcm90b3R5cGU7CiAgfQogIGhvb2tzLmdldFRhZyA9IGdldFRh
-Z0lFOwogIGhvb2tzLnByb3RvdHlwZUZvclRhZyA9IHByb3RvdHlwZUZvclRhZ0lFOwp9CkMuaTc9ZnVu
-Y3Rpb24oaG9va3MpIHsgcmV0dXJuIGhvb2tzOyB9CgpDLkN0PW5ldyBQLmJ5KCkKQy5FcT1uZXcgUC5r
-NSgpCkMueE09bmV3IFAudTUoKQpDLlFrPW5ldyBQLkUzKCkKQy5Odj1uZXcgSC5rcigpCkMuTlU9bmV3
-IFAuSmkoKQpDLnBkPW5ldyBQLlpkKCkKQy5BZD1uZXcgTS5INygwLCJIaW50QWN0aW9uS2luZC5hZGRO
-dWxsYWJsZUhpbnQiKQpDLm5lPW5ldyBNLkg3KDEsIkhpbnRBY3Rpb25LaW5kLmFkZE5vbk51bGxhYmxl
-SGludCIpCkMubXk9bmV3IE0uSDcoMiwiSGludEFjdGlvbktpbmQuY2hhbmdlVG9OdWxsYWJsZUhpbnQi
-KQpDLnJ4PW5ldyBNLkg3KDMsIkhpbnRBY3Rpb25LaW5kLmNoYW5nZVRvTm9uTnVsbGFibGVIaW50IikK
-Qy53Vj1uZXcgTS5INyg0LCJIaW50QWN0aW9uS2luZC5yZW1vdmVOdWxsYWJsZUhpbnQiKQpDLmZSPW5l
-dyBNLkg3KDUsIkhpbnRBY3Rpb25LaW5kLnJlbW92ZU5vbk51bGxhYmxlSGludCIpCkMuQTM9bmV3IFAu
-TXgobnVsbCkKQy5uWD1uZXcgUC5vaihudWxsKQpDLmFrPUguVk0ocyhbMCwwLDMyNzc2LDMzNzkyLDEs
-MTAyNDAsMCwwXSksdC5WKQpDLmNtPUguVk0ocyhbIio6OmNsYXNzIiwiKjo6ZGlyIiwiKjo6ZHJhZ2dh
-YmxlIiwiKjo6aGlkZGVuIiwiKjo6aWQiLCIqOjppbmVydCIsIio6Oml0ZW1wcm9wIiwiKjo6aXRlbXJl
-ZiIsIio6Oml0ZW1zY29wZSIsIio6OmxhbmciLCIqOjpzcGVsbGNoZWNrIiwiKjo6dGl0bGUiLCIqOjp0
-cmFuc2xhdGUiLCJBOjphY2Nlc3NrZXkiLCJBOjpjb29yZHMiLCJBOjpocmVmbGFuZyIsIkE6Om5hbWUi
-LCJBOjpzaGFwZSIsIkE6OnRhYmluZGV4IiwiQTo6dGFyZ2V0IiwiQTo6dHlwZSIsIkFSRUE6OmFjY2Vz
-c2tleSIsIkFSRUE6OmFsdCIsIkFSRUE6OmNvb3JkcyIsIkFSRUE6Om5vaHJlZiIsIkFSRUE6OnNoYXBl
-IiwiQVJFQTo6dGFiaW5kZXgiLCJBUkVBOjp0YXJnZXQiLCJBVURJTzo6Y29udHJvbHMiLCJBVURJTzo6
-bG9vcCIsIkFVRElPOjptZWRpYWdyb3VwIiwiQVVESU86Om11dGVkIiwiQVVESU86OnByZWxvYWQiLCJC
-RE86OmRpciIsIkJPRFk6OmFsaW5rIiwiQk9EWTo6Ymdjb2xvciIsIkJPRFk6OmxpbmsiLCJCT0RZOjp0
-ZXh0IiwiQk9EWTo6dmxpbmsiLCJCUjo6Y2xlYXIiLCJCVVRUT046OmFjY2Vzc2tleSIsIkJVVFRPTjo6
-ZGlzYWJsZWQiLCJCVVRUT046Om5hbWUiLCJCVVRUT046OnRhYmluZGV4IiwiQlVUVE9OOjp0eXBlIiwi
-QlVUVE9OOjp2YWx1ZSIsIkNBTlZBUzo6aGVpZ2h0IiwiQ0FOVkFTOjp3aWR0aCIsIkNBUFRJT046OmFs
-aWduIiwiQ09MOjphbGlnbiIsIkNPTDo6Y2hhciIsIkNPTDo6Y2hhcm9mZiIsIkNPTDo6c3BhbiIsIkNP
-TDo6dmFsaWduIiwiQ09MOjp3aWR0aCIsIkNPTEdST1VQOjphbGlnbiIsIkNPTEdST1VQOjpjaGFyIiwi
-Q09MR1JPVVA6OmNoYXJvZmYiLCJDT0xHUk9VUDo6c3BhbiIsIkNPTEdST1VQOjp2YWxpZ24iLCJDT0xH
-Uk9VUDo6d2lkdGgiLCJDT01NQU5EOjpjaGVja2VkIiwiQ09NTUFORDo6Y29tbWFuZCIsIkNPTU1BTkQ6
-OmRpc2FibGVkIiwiQ09NTUFORDo6bGFiZWwiLCJDT01NQU5EOjpyYWRpb2dyb3VwIiwiQ09NTUFORDo6
-dHlwZSIsIkRBVEE6OnZhbHVlIiwiREVMOjpkYXRldGltZSIsIkRFVEFJTFM6Om9wZW4iLCJESVI6OmNv
-bXBhY3QiLCJESVY6OmFsaWduIiwiREw6OmNvbXBhY3QiLCJGSUVMRFNFVDo6ZGlzYWJsZWQiLCJGT05U
-Ojpjb2xvciIsIkZPTlQ6OmZhY2UiLCJGT05UOjpzaXplIiwiRk9STTo6YWNjZXB0IiwiRk9STTo6YXV0
-b2NvbXBsZXRlIiwiRk9STTo6ZW5jdHlwZSIsIkZPUk06Om1ldGhvZCIsIkZPUk06Om5hbWUiLCJGT1JN
-Ojpub3ZhbGlkYXRlIiwiRk9STTo6dGFyZ2V0IiwiRlJBTUU6Om5hbWUiLCJIMTo6YWxpZ24iLCJIMjo6
-YWxpZ24iLCJIMzo6YWxpZ24iLCJINDo6YWxpZ24iLCJINTo6YWxpZ24iLCJINjo6YWxpZ24iLCJIUjo6
-YWxpZ24iLCJIUjo6bm9zaGFkZSIsIkhSOjpzaXplIiwiSFI6OndpZHRoIiwiSFRNTDo6dmVyc2lvbiIs
-IklGUkFNRTo6YWxpZ24iLCJJRlJBTUU6OmZyYW1lYm9yZGVyIiwiSUZSQU1FOjpoZWlnaHQiLCJJRlJB
-TUU6Om1hcmdpbmhlaWdodCIsIklGUkFNRTo6bWFyZ2lud2lkdGgiLCJJRlJBTUU6OndpZHRoIiwiSU1H
-OjphbGlnbiIsIklNRzo6YWx0IiwiSU1HOjpib3JkZXIiLCJJTUc6OmhlaWdodCIsIklNRzo6aHNwYWNl
-IiwiSU1HOjppc21hcCIsIklNRzo6bmFtZSIsIklNRzo6dXNlbWFwIiwiSU1HOjp2c3BhY2UiLCJJTUc6
-OndpZHRoIiwiSU5QVVQ6OmFjY2VwdCIsIklOUFVUOjphY2Nlc3NrZXkiLCJJTlBVVDo6YWxpZ24iLCJJ
-TlBVVDo6YWx0IiwiSU5QVVQ6OmF1dG9jb21wbGV0ZSIsIklOUFVUOjphdXRvZm9jdXMiLCJJTlBVVDo6
-Y2hlY2tlZCIsIklOUFVUOjpkaXNhYmxlZCIsIklOUFVUOjppbnB1dG1vZGUiLCJJTlBVVDo6aXNtYXAi
-LCJJTlBVVDo6bGlzdCIsIklOUFVUOjptYXgiLCJJTlBVVDo6bWF4bGVuZ3RoIiwiSU5QVVQ6Om1pbiIs
-IklOUFVUOjptdWx0aXBsZSIsIklOUFVUOjpuYW1lIiwiSU5QVVQ6OnBsYWNlaG9sZGVyIiwiSU5QVVQ6
-OnJlYWRvbmx5IiwiSU5QVVQ6OnJlcXVpcmVkIiwiSU5QVVQ6OnNpemUiLCJJTlBVVDo6c3RlcCIsIklO
-UFVUOjp0YWJpbmRleCIsIklOUFVUOjp0eXBlIiwiSU5QVVQ6OnVzZW1hcCIsIklOUFVUOjp2YWx1ZSIs
-IklOUzo6ZGF0ZXRpbWUiLCJLRVlHRU46OmRpc2FibGVkIiwiS0VZR0VOOjprZXl0eXBlIiwiS0VZR0VO
-OjpuYW1lIiwiTEFCRUw6OmFjY2Vzc2tleSIsIkxBQkVMOjpmb3IiLCJMRUdFTkQ6OmFjY2Vzc2tleSIs
-IkxFR0VORDo6YWxpZ24iLCJMSTo6dHlwZSIsIkxJOjp2YWx1ZSIsIkxJTks6OnNpemVzIiwiTUFQOjpu
-YW1lIiwiTUVOVTo6Y29tcGFjdCIsIk1FTlU6OmxhYmVsIiwiTUVOVTo6dHlwZSIsIk1FVEVSOjpoaWdo
-IiwiTUVURVI6OmxvdyIsIk1FVEVSOjptYXgiLCJNRVRFUjo6bWluIiwiTUVURVI6OnZhbHVlIiwiT0JK
-RUNUOjp0eXBlbXVzdG1hdGNoIiwiT0w6OmNvbXBhY3QiLCJPTDo6cmV2ZXJzZWQiLCJPTDo6c3RhcnQi
-LCJPTDo6dHlwZSIsIk9QVEdST1VQOjpkaXNhYmxlZCIsIk9QVEdST1VQOjpsYWJlbCIsIk9QVElPTjo6
-ZGlzYWJsZWQiLCJPUFRJT046OmxhYmVsIiwiT1BUSU9OOjpzZWxlY3RlZCIsIk9QVElPTjo6dmFsdWUi
-LCJPVVRQVVQ6OmZvciIsIk9VVFBVVDo6bmFtZSIsIlA6OmFsaWduIiwiUFJFOjp3aWR0aCIsIlBST0dS
-RVNTOjptYXgiLCJQUk9HUkVTUzo6bWluIiwiUFJPR1JFU1M6OnZhbHVlIiwiU0VMRUNUOjphdXRvY29t
-cGxldGUiLCJTRUxFQ1Q6OmRpc2FibGVkIiwiU0VMRUNUOjptdWx0aXBsZSIsIlNFTEVDVDo6bmFtZSIs
-IlNFTEVDVDo6cmVxdWlyZWQiLCJTRUxFQ1Q6OnNpemUiLCJTRUxFQ1Q6OnRhYmluZGV4IiwiU09VUkNF
-Ojp0eXBlIiwiVEFCTEU6OmFsaWduIiwiVEFCTEU6OmJnY29sb3IiLCJUQUJMRTo6Ym9yZGVyIiwiVEFC
-TEU6OmNlbGxwYWRkaW5nIiwiVEFCTEU6OmNlbGxzcGFjaW5nIiwiVEFCTEU6OmZyYW1lIiwiVEFCTEU6
-OnJ1bGVzIiwiVEFCTEU6OnN1bW1hcnkiLCJUQUJMRTo6d2lkdGgiLCJUQk9EWTo6YWxpZ24iLCJUQk9E
-WTo6Y2hhciIsIlRCT0RZOjpjaGFyb2ZmIiwiVEJPRFk6OnZhbGlnbiIsIlREOjphYmJyIiwiVEQ6OmFs
-aWduIiwiVEQ6OmF4aXMiLCJURDo6Ymdjb2xvciIsIlREOjpjaGFyIiwiVEQ6OmNoYXJvZmYiLCJURDo6
-Y29sc3BhbiIsIlREOjpoZWFkZXJzIiwiVEQ6OmhlaWdodCIsIlREOjpub3dyYXAiLCJURDo6cm93c3Bh
-biIsIlREOjpzY29wZSIsIlREOjp2YWxpZ24iLCJURDo6d2lkdGgiLCJURVhUQVJFQTo6YWNjZXNza2V5
-IiwiVEVYVEFSRUE6OmF1dG9jb21wbGV0ZSIsIlRFWFRBUkVBOjpjb2xzIiwiVEVYVEFSRUE6OmRpc2Fi
-bGVkIiwiVEVYVEFSRUE6OmlucHV0bW9kZSIsIlRFWFRBUkVBOjpuYW1lIiwiVEVYVEFSRUE6OnBsYWNl
-aG9sZGVyIiwiVEVYVEFSRUE6OnJlYWRvbmx5IiwiVEVYVEFSRUE6OnJlcXVpcmVkIiwiVEVYVEFSRUE6
-OnJvd3MiLCJURVhUQVJFQTo6dGFiaW5kZXgiLCJURVhUQVJFQTo6d3JhcCIsIlRGT09UOjphbGlnbiIs
-IlRGT09UOjpjaGFyIiwiVEZPT1Q6OmNoYXJvZmYiLCJURk9PVDo6dmFsaWduIiwiVEg6OmFiYnIiLCJU
-SDo6YWxpZ24iLCJUSDo6YXhpcyIsIlRIOjpiZ2NvbG9yIiwiVEg6OmNoYXIiLCJUSDo6Y2hhcm9mZiIs
-IlRIOjpjb2xzcGFuIiwiVEg6OmhlYWRlcnMiLCJUSDo6aGVpZ2h0IiwiVEg6Om5vd3JhcCIsIlRIOjpy
-b3dzcGFuIiwiVEg6OnNjb3BlIiwiVEg6OnZhbGlnbiIsIlRIOjp3aWR0aCIsIlRIRUFEOjphbGlnbiIs
-IlRIRUFEOjpjaGFyIiwiVEhFQUQ6OmNoYXJvZmYiLCJUSEVBRDo6dmFsaWduIiwiVFI6OmFsaWduIiwi
-VFI6OmJnY29sb3IiLCJUUjo6Y2hhciIsIlRSOjpjaGFyb2ZmIiwiVFI6OnZhbGlnbiIsIlRSQUNLOjpk
-ZWZhdWx0IiwiVFJBQ0s6OmtpbmQiLCJUUkFDSzo6bGFiZWwiLCJUUkFDSzo6c3JjbGFuZyIsIlVMOjpj
-b21wYWN0IiwiVUw6OnR5cGUiLCJWSURFTzo6Y29udHJvbHMiLCJWSURFTzo6aGVpZ2h0IiwiVklERU86
-Omxvb3AiLCJWSURFTzo6bWVkaWFncm91cCIsIlZJREVPOjptdXRlZCIsIlZJREVPOjpwcmVsb2FkIiwi
-VklERU86OndpZHRoIl0pLHQuaSkKQy5WQz1ILlZNKHMoWzAsMCw2NTQ5MCw0NTA1NSw2NTUzNSwzNDgx
-NSw2NTUzNCwxODQzMV0pLHQuVikKQy5tSz1ILlZNKHMoWzAsMCwyNjYyNCwxMDIzLDY1NTM0LDIwNDcs
-NjU1MzQsMjA0N10pLHQuVikKQy5TcT1ILlZNKHMoWyJIRUFEIiwiQVJFQSIsIkJBU0UiLCJCQVNFRk9O
-VCIsIkJSIiwiQ09MIiwiQ09MR1JPVVAiLCJFTUJFRCIsIkZSQU1FIiwiRlJBTUVTRVQiLCJIUiIsIklN
-QUdFIiwiSU1HIiwiSU5QVVQiLCJJU0lOREVYIiwiTElOSyIsIk1FVEEiLCJQQVJBTSIsIlNPVVJDRSIs
-IlNUWUxFIiwiVElUTEUiLCJXQlIiXSksdC5pKQpDLmhVPUguVk0ocyhbXSksdC54KQpDLmRuPUguVk0o
-cyhbXSksSC5OMCgiamQ8TEwqPiIpKQpDLnhEPUguVk0ocyhbXSksdC5pKQpDLnRvPUguVk0ocyhbMCww
-LDMyNzIyLDEyMjg3LDY1NTM0LDM0ODE1LDY1NTM0LDE4NDMxXSksdC5WKQpDLnJrPUguVk0ocyhbQy5B
-ZCxDLm5lLEMubXksQy5yeCxDLndWLEMuZlJdKSxILk4wKCJqZDxINyo+IikpCkMuRjM9SC5WTShzKFsw
-LDAsMjQ1NzYsMTAyMyw2NTUzNCwzNDgxNSw2NTUzNCwxODQzMV0pLHQuVikKQy5lYT1ILlZNKHMoWzAs
-MCwzMjc1NCwxMTI2Myw2NTUzNCwzNDgxNSw2NTUzNCwxODQzMV0pLHQuVikKQy5aSj1ILlZNKHMoWzAs
-MCwzMjcyMiwxMjI4Nyw2NTUzNSwzNDgxNSw2NTUzNCwxODQzMV0pLHQuVikKQy5XZD1ILlZNKHMoWzAs
-MCw2NTQ5MCwxMjI4Nyw2NTUzNSwzNDgxNSw2NTUzNCwxODQzMV0pLHQuVikKQy5ReD1ILlZNKHMoWyJi
-aW5kIiwiaWYiLCJyZWYiLCJyZXBlYXQiLCJzeW50YXgiXSksdC5pKQpDLkJJPUguVk0ocyhbIkE6Omhy
-ZWYiLCJBUkVBOjpocmVmIiwiQkxPQ0tRVU9URTo6Y2l0ZSIsIkJPRFk6OmJhY2tncm91bmQiLCJDT01N
-QU5EOjppY29uIiwiREVMOjpjaXRlIiwiRk9STTo6YWN0aW9uIiwiSU1HOjpzcmMiLCJJTlBVVDo6c3Jj
-IiwiSU5TOjpjaXRlIiwiUTo6Y2l0ZSIsIlZJREVPOjpwb3N0ZXIiXSksdC5pKQpDLkR4PW5ldyBILkxQ
-KDAse30sQy54RCxILk4wKCJMUDxxVSosek08ajgqPio+IikpCkMuQ009bmV3IEguTFAoMCx7fSxDLnhE
-LEguTjAoIkxQPHFVKixxVSo+IikpCkMuaUg9SC5WTShzKFtdKSxILk4wKCJqZDxHRCo+IikpCkMuV089
-bmV3IEguTFAoMCx7fSxDLmlILEguTjAoIkxQPEdEKixAPiIpKQpDLlkyPW5ldyBMLk85KCJOYXZpZ2F0
-aW9uVHJlZU5vZGVUeXBlLmRpcmVjdG9yeSIpCkMucmY9bmV3IEwuTzkoIk5hdmlnYXRpb25UcmVlTm9k
-ZVR5cGUuZmlsZSIpCkMuVGU9bmV3IEgud3YoImNhbGwiKQpDLm9FPW5ldyBQLkdZKCExKQpDLndRPW5l
-dyBQLkZ5KG51bGwsMil9KSgpOyhmdW5jdGlvbiBzdGF0aWNGaWVsZHMoKXskLnptPW51bGwKJC55aj0w
-CiQubUo9bnVsbAokLlA0PW51bGwKJC5ORj1udWxsCiQuVFg9bnVsbAokLng3PW51bGwKJC5udz1udWxs
-CiQudnY9bnVsbAokLkJ2PW51bGwKJC5TNj1udWxsCiQuazg9bnVsbAokLm1nPW51bGwKJC5VRD0hMQok
-LlgzPUMuTlUKJC54Zz1ILlZNKFtdLEguTjAoImpkPE1oPiIpKQokLnhvPW51bGwKJC5CTz1udWxsCiQu
-bHQ9bnVsbAokLkVVPW51bGwKJC5vcj1QLkZsKHQuTix0LlkpCiQuSTY9bnVsbAokLkZmPW51bGx9KSgp
-OyhmdW5jdGlvbiBsYXp5SW5pdGlhbGl6ZXJzKCl7dmFyIHM9aHVua0hlbHBlcnMubGF6eUZpbmFsLHI9
-aHVua0hlbHBlcnMubGF6eU9sZApzKCQsImZhIiwidyIsZnVuY3Rpb24oKXtyZXR1cm4gSC5ZZygiXyRk
-YXJ0X2RhcnRDbG9zdXJlIil9KQpzKCQsIlUyIiwiU24iLGZ1bmN0aW9uKCl7cmV0dXJuIEguY00oSC5T
-Nyh7CnRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIiRyZWNlaXZlciQifX0pKX0pCnMoJCwieHEiLCJs
-cSIsZnVuY3Rpb24oKXtyZXR1cm4gSC5jTShILlM3KHskbWV0aG9kJDpudWxsLAp0b1N0cmluZzpmdW5j
-dGlvbigpe3JldHVybiIkcmVjZWl2ZXIkIn19KSl9KQpzKCQsIlIxIiwiTjkiLGZ1bmN0aW9uKCl7cmV0
-dXJuIEguY00oSC5TNyhudWxsKSl9KQpzKCQsImZOIiwiaUkiLGZ1bmN0aW9uKCl7cmV0dXJuIEguY00o
-ZnVuY3Rpb24oKXt2YXIgJGFyZ3VtZW50c0V4cHIkPSckYXJndW1lbnRzJCcKdHJ5e251bGwuJG1ldGhv
-ZCQoJGFyZ3VtZW50c0V4cHIkKX1jYXRjaChxKXtyZXR1cm4gcS5tZXNzYWdlfX0oKSl9KQpzKCQsInFp
-IiwiVU4iLGZ1bmN0aW9uKCl7cmV0dXJuIEguY00oSC5TNyh2b2lkIDApKX0pCnMoJCwicloiLCJaaCIs
+dHVybiBhPT09NDd9LApkczpmdW5jdGlvbihhKXt2YXIgcz1hLmxlbmd0aAppZihzPT09MClyZXR1cm4h
+MQppZihDLnhCLk8yKGEscy0xKSE9PTQ3KXJldHVybiEwCnJldHVybiBDLnhCLlRjKGEsIjovLyIpJiZ0
+aGlzLllyKGEpPT09c30sClNwOmZ1bmN0aW9uKGEsYil7dmFyIHMscixxLHAsbz1hLmxlbmd0aAppZihv
+PT09MClyZXR1cm4gMAppZihDLnhCLlcoYSwwKT09PTQ3KXJldHVybiAxCmZvcihzPTA7czxvOysrcyl7
+cj1DLnhCLlcoYSxzKQppZihyPT09NDcpcmV0dXJuIDAKaWYocj09PTU4KXtpZihzPT09MClyZXR1cm4g
+MApxPUMueEIuWFUoYSwiLyIsQy54Qi5RaShhLCIvLyIscysxKT9zKzM6cykKaWYocTw9MClyZXR1cm4g
+bwppZighYnx8bzxxKzMpcmV0dXJuIHEKaWYoIUMueEIubihhLCJmaWxlOi8vIikpcmV0dXJuIHEKaWYo
+IUIuWXUoYSxxKzEpKXJldHVybiBxCnA9cSszCnJldHVybiBvPT09cD9wOnErNH19cmV0dXJuIDB9LApZ
+cjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5TcChhLCExKX0sCmhLOmZ1bmN0aW9uKGEpe3JldHVybiBh
+Lmxlbmd0aCE9PTAmJkMueEIuVyhhLDApPT09NDd9LApnb2M6ZnVuY3Rpb24oKXtyZXR1cm4idXJsIn0s
+CmdtSTpmdW5jdGlvbigpe3JldHVybiIvIn19CkwuSVYucHJvdG90eXBlPXsKVWQ6ZnVuY3Rpb24oYSl7
+cmV0dXJuIEMueEIudGcoYSwiLyIpfSwKcjQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT00N3x8YT09PTky
+fSwKZHM6ZnVuY3Rpb24oYSl7dmFyIHM9YS5sZW5ndGgKaWYocz09PTApcmV0dXJuITEKcz1DLnhCLk8y
+KGEscy0xKQpyZXR1cm4hKHM9PT00N3x8cz09PTkyKX0sClNwOmZ1bmN0aW9uKGEsYil7dmFyIHMscixx
+PWEubGVuZ3RoCmlmKHE9PT0wKXJldHVybiAwCnM9Qy54Qi5XKGEsMCkKaWYocz09PTQ3KXJldHVybiAx
+CmlmKHM9PT05Mil7aWYocTwyfHxDLnhCLlcoYSwxKSE9PTkyKXJldHVybiAxCnI9Qy54Qi5YVShhLCJc
+XCIsMikKaWYocj4wKXtyPUMueEIuWFUoYSwiXFwiLHIrMSkKaWYocj4wKXJldHVybiByfXJldHVybiBx
+fWlmKHE8MylyZXR1cm4gMAppZighQi5PUyhzKSlyZXR1cm4gMAppZihDLnhCLlcoYSwxKSE9PTU4KXJl
+dHVybiAwCnE9Qy54Qi5XKGEsMikKaWYoIShxPT09NDd8fHE9PT05MikpcmV0dXJuIDAKcmV0dXJuIDN9
+LApZcjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5TcChhLCExKX0sCmhLOmZ1bmN0aW9uKGEpe3JldHVy
+biB0aGlzLllyKGEpPT09MX0sCk90OmZ1bmN0aW9uKGEsYil7dmFyIHMKaWYoYT09PWIpcmV0dXJuITAK
+aWYoYT09PTQ3KXJldHVybiBiPT09OTIKaWYoYT09PTkyKXJldHVybiBiPT09NDcKaWYoKGFeYikhPT0z
+MilyZXR1cm4hMQpzPWF8MzIKcmV0dXJuIHM+PTk3JiZzPD0xMjJ9LApOYzpmdW5jdGlvbihhLGIpe3Zh
+ciBzLHIscQppZihhPT1iKXJldHVybiEwCnM9YS5sZW5ndGgKaWYocyE9PWIubGVuZ3RoKXJldHVybiEx
+CmZvcihyPUouclkoYikscT0wO3E8czsrK3EpaWYoIXRoaXMuT3QoQy54Qi5XKGEscSksci5XKGIscSkp
+KXJldHVybiExCnJldHVybiEwfSwKZ29jOmZ1bmN0aW9uKCl7cmV0dXJuIndpbmRvd3MifSwKZ21JOmZ1
+bmN0aW9uKCl7cmV0dXJuIlxcIn19OyhmdW5jdGlvbiBhbGlhc2VzKCl7dmFyIHM9Si52Qi5wcm90b3R5
+cGUKcy5VPXMudwpzLlNqPXMuZTcKcz1KLk1GLnByb3RvdHlwZQpzLnQ9cy53CnM9UC5jWC5wcm90b3R5
+cGUKcy5HRz1zLmV2CnM9UC5NaC5wcm90b3R5cGUKcy54Yj1zLncKcz1XLmN2LnByb3RvdHlwZQpzLkRX
+PXMucjYKcz1XLm02LnByb3RvdHlwZQpzLmpGPXMuRWIKcz1QLkU0LnByb3RvdHlwZQpzLlVyPXMucQpz
+LmU0PXMuWX0pKCk7KGZ1bmN0aW9uIGluc3RhbGxUZWFyT2Zmcygpe3ZhciBzPWh1bmtIZWxwZXJzLl9z
+dGF0aWNfMSxyPWh1bmtIZWxwZXJzLl9zdGF0aWNfMCxxPWh1bmtIZWxwZXJzLmluc3RhbGxJbnN0YW5j
+ZVRlYXJPZmYscD1odW5rSGVscGVycy5pbnN0YWxsU3RhdGljVGVhck9mZixvPWh1bmtIZWxwZXJzLl9p
+bnN0YW5jZV8xdQpzKFAsIkVYIiwiWlYiLDcpCnMoUCwieXQiLCJvQSIsNykKcyhQLCJxVyIsIkJ6Iiw3
+KQpyKFAsIlY5IiwiZU4iLDApCnEoUC5QZi5wcm90b3R5cGUsImdZSiIsMCwxLG51bGwsWyIkMiIsIiQx
+Il0sWyJ3MCIsInBtIl0sMjksMCkKcyhQLCJDeSIsIk5DIiw0KQpzKFAsIlBIIiwiTXQiLDUpCnAoVywi
+cFMiLDQsbnVsbCxbIiQ0Il0sWyJxRCJdLDgsMCkKcChXLCJWNCIsNCxudWxsLFsiJDQiXSxbIlFXIl0s
+OCwwKQpvKFAuQXMucHJvdG90eXBlLCJndU0iLCJUIiw1KQpzKFAsImlHIiwid1kiLDU0KQpzKFAsIncw
+IiwiZFUiLDM2KQpzKEwsImlTIiwiaTYiLDIwKX0pKCk7KGZ1bmN0aW9uIGluaGVyaXRhbmNlKCl7dmFy
+IHM9aHVua0hlbHBlcnMubWl4aW4scj1odW5rSGVscGVycy5pbmhlcml0LHE9aHVua0hlbHBlcnMuaW5o
+ZXJpdE1hbnkKcihQLk1oLG51bGwpCnEoUC5NaCxbSC5GSyxKLnZCLEoubTEsUC5jWCxILkU3LFAuWFMs
+UC5uWSxILmE3LFAuQW4sSC5GdSxILkpCLEguU1UsSC5SZSxILnd2LFAuUG4sSC5XVSxILkxJLEguVHAs
+SC5mOSxILnRlLEguYnEsSC5YTyxILmtyLFAuWWssSC52aCxILk42LEguVlIsSC5FSyxILlBiLEgudFEs
+SC5TZCxILkpjLEguRyxQLlczLFAuaWgsUC5GeSxQLkdWLFAuUGYsUC5GZSxQLnZzLFAuT00sUC5xaCxQ
+Lk1PLFAua1QsUC54SSxQLkN3LFAubTAsUC5wUixQLmJuLFAubG0sUC5sRCxQLktQLFAubGYsUC5XWSxQ
+LlVrLFAuU2gsUC5SdyxQLmJ6LFAuaVAsUC5rNSxQLktZLFAuQ0QsUC5hRSxQLk4zLFAuYzgsUC5aZCxQ
+LlJuLFAuRG4sUC5QRSxQLlVmLFcuaWQsVy5GayxXLkpRLFcuR20sVy52RCxXLm02LFcuT3csVy5XOSxX
+LmRXLFcubWssVy5LbyxQLmlKLFAuRTQsTS5INyxVLkxMLFUuZDIsVS5TZSxVLk1sLFUueUQsVS53YixC
+Lmo4LEIucXAsVC5tUSxMLlhBLEwuWlosTC5POSxNLmxJLE8uekwsWC5XRCxYLmR2XSkKcShKLnZCLFtK
+LnlFLEoud2UsSi5NRixKLmpkLEoucUksSi5EcixILkVULFcuRDAsVy5BeixXLkxlLFcuTmgsVy5hZSxX
+LklCLFcubjcsVy5lYSxXLmJyLFcuU2csVy51OCxXLks3LFcuWFcsUC5oRl0pCnEoSi5NRixbSi5pQyxK
+LmtkLEouYzVdKQpyKEouUG8sSi5qZCkKcShKLnFJLFtKLmJVLEouVkFdKQpxKFAuY1gsW0guQlIsSC5i
+USxILmkxLEguVTUsSC5BTSxILnU2LEguWFIsUC5tVyxILnVuXSkKcShILkJSLFtILlp5LEguUUNdKQpy
+KEgub2wsSC5aeSkKcihILlVxLEguUUMpCnIoSC5qVixILlVxKQpxKFAuWFMsW0gubixILnIzLFAuRXos
+SC5heixILnZWLEguRXEsUC5DNixILmtTLFAuVWQsUC5GLFAudSxQLm1wLFAudWIsUC5kcyxQLmxqLFAu
+VVYsUC5wXSkKcihQLnV5LFAublkpCnEoUC51eSxbSC53MixXLnd6LFcuZTddKQpyKEgucWosSC53MikK
+cShILmJRLFtILmFMLEguTUIsSC5pNV0pCnEoSC5hTCxbSC5uSCxILmxKLFAuaThdKQpyKEgueHksSC5p
+MSkKcShQLkFuLFtILk1ILEguU08sSC5VMV0pCnIoSC5kNSxILkFNKQpyKFAuUlUsUC5QbikKcihQLkdq
+LFAuUlUpCnIoSC5QRCxQLkdqKQpyKEguTFAsSC5XVSkKcShILlRwLFtILkNqLEgubGMsSC5kQyxILndO
+LEguVlgsUC50aCxQLmhhLFAuVnMsUC5GdCxQLnlILFAuV00sUC5TWCxQLkdzLFAuZGEsUC5vUSxQLnBW
+LFAuVTcsUC52cixQLnJ0LFAuS0YsUC5aTCxQLlJULFAualosUC5ycSxQLlJXLFAuQjUsUC51TyxQLnBL
+LFAuaGosUC5WcCxQLk9SLFAucmEsUC55USxQLnBnLFAuYzIsUC50aSxQLldGLFAubjEsUC5jUyxQLlZD
+LFAuSlQsUC5SWixQLk1FLFAueTUsUC5xMyxQLnlJLFAuYzYsUC5xZCxXLkN2LFcuS1MsVy5BMyxXLnZO
+LFcuVXYsVy5FZyxXLkVvLFcuV2ssVy5JQSxXLmZtLFAuamcsUC5UYSxQLkdFLFAuTjcsUC51USxQLlBD
+LFAubXQsUC5OeixQLlFTLFAubnAsVS5NRCxVLmFOLFUuYjAsTC5lLEwuVlcsTC5vWixMLmpyLEwucWws
+TC5IaSxMLkJULEwuUFksTC5MLEwuV3gsTC5BTyxMLmROLEwuSG8sTC54eixMLklDLEwuZkMsTC5uVCxM
+Lk5ZLEwudWUsTC5lWCxMLkVFLEwuUUwsTC5WUyxMLlRELEwubTIsTS5xNyxNLk5vXSkKcihILlcwLFAu
+RXopCnEoSC5sYyxbSC56eCxILnJUXSkKcihILmtZLFAuQzYpCnIoUC5pbCxQLllrKQpxKFAuaWwsW0gu
+TjUsUC51dyxXLmNmLFcuU3ldKQpxKFAubVcsW0guS1csUC5xNF0pCnIoSC5YSCxILkVUKQpxKEguWEgs
+W0guUkcsSC5XQl0pCnIoSC5WUCxILlJHKQpyKEguRGcsSC5WUCkKcihILlpHLEguV0IpCnIoSC5QZyxI
+LlpHKQpxKEguUGcsW0gueGosSC5kRSxILlpBLEguZFQsSC5QcSxILmVFLEguVjZdKQpyKEguaU0sSC5r
+UykKcihQLlpmLFAuUGYpCnIoUC5KaSxQLm0wKQpyKFAuWHYsUC5wUikKcihQLmI2LFAuWHYpCnIoUC5W
+aixQLldZKQpxKFAuVWssW1AuQ1YsUC5aaSxQLmJ5XSkKcihQLndJLFAua1QpCnEoUC53SSxbUC5VOCxQ
+Lm9qLFAuTXgsUC5FMyxQLkdZXSkKcihQLks4LFAuVWQpCnIoUC50dSxQLlNoKQpyKFAudTUsUC5aaSkK
+cShQLnUsW1AuYkosUC5lWV0pCnIoUC5xZSxQLkRuKQpxKFcuRDAsW1cudUgsVy53YSxXLks1LFcuQ21d
+KQpxKFcudUgsW1cuY3YsVy5ueCxXLlFGLFcuQ1FdKQpxKFcuY3YsW1cucUUsUC5oaV0pCnEoVy5xRSxb
+Vy5HaCxXLmZZLFcubkIsVy5RUCxXLmg0LFcuU04sVy5scCxXLlRiLFcuSXYsVy5XUCxXLnlZXSkKcihX
+Lm9KLFcuTGUpCnIoVy5oSCxXLkF6KQpyKFcuVmIsVy5RRikKcihXLmZKLFcud2EpCnEoVy5lYSxbVy53
+NixXLmV3XSkKcihXLkFqLFcudzYpCnIoVy5yQixXLks3KQpyKFcuQkgsVy5yQikKcihXLnc0LFcuSUIp
+CnIoVy5vYSxXLlhXKQpyKFcucmgsVy5vYSkKcihXLmk3LFcuY2YpCnIoUC5BcyxQLlZqKQpxKFAuQXMs
+W1cuSTQsUC5LZV0pCnIoVy5STyxQLnFoKQpyKFcuZXUsVy5STykKcihXLnhDLFAuTU8pCnIoVy5jdCxX
+Lm02KQpyKFAuQmYsUC5pSikKcShQLkU0LFtQLnI3LFAuY29dKQpyKFAuVHosUC5jbykKcihQLm5kLFAu
+aGkpCnIoQi5mdixPLnpMKQpxKEIuZnYsW0UuT0YsRi5ydSxMLklWXSkKcyhILncyLEguUmUpCnMoSC5R
+QyxQLmxEKQpzKEguUkcsUC5sRCkKcyhILlZQLEguU1UpCnMoSC5XQixQLmxEKQpzKEguWkcsSC5TVSkK
+cyhQLm5ZLFAubEQpCnMoUC5XWSxQLmxmKQpzKFAuUlUsUC5LUCkKcyhQLnBSLFAubGYpCnMoVy5MZSxX
+LmlkKQpzKFcuSzcsUC5sRCkKcyhXLnJCLFcuR20pCnMoVy5YVyxQLmxEKQpzKFcub2EsVy5HbSkKcyhQ
+LmNvLFAubEQpfSkoKQp2YXIgdj17dHlwZVVuaXZlcnNlOntlQzpuZXcgTWFwKCksdFI6e30sZVQ6e30s
+dFBWOnt9LHNFQTpbXX0sbWFuZ2xlZEdsb2JhbE5hbWVzOntJZjoiaW50IixDUDoiZG91YmxlIixMWjoi
+bnVtIixxVToiU3RyaW5nIixhMjoiYm9vbCIsYzg6Ik51bGwiLHpNOiJMaXN0In0sbWFuZ2xlZE5hbWVz
+Ont9LGdldFR5cGVGcm9tTmFtZTpnZXRHbG9iYWxGcm9tTmFtZSxtZXRhZGF0YTpbXSx0eXBlczpbIn4o
+KSIsImM4KCkiLCJjOChBaiopIiwiYzgoY3YqKSIsIkAoQCkiLCJxVShxVSkiLCJhMihxVSkiLCJ+KH4o
+KSkiLCJhMihjdixxVSxxVSxKUSkiLCJjOChAKSIsIn4ocVUscVUpIiwifihNaD8sTWg/KSIsIkAoKSIs
+In4ocVUsQCkiLCJ+KG42LHFVLElmKSIsImEyKGtGKSIsImM4KEAsQCkiLCJ+KHh1PHFVPikiLCJjOChl
+YSopIiwiYjg8Yzg+KihBaiopIiwifihBaiopIiwifihxVSxJZikiLCJ+KHFVLHFVPykiLCJuNihJZiki
+LCJuNihALEApIiwifihJZixAKSIsImEyKHVIKSIsImM4KEAsR3opIiwifihlYSkiLCJ+KE1oW0d6P10p
+IiwiYzgoTWgsR3opIiwifih1SCx1SD8pIiwifihALEApIiwidnM8QD4oQCkiLCJhMih4dTxxVT4pIiwi
+QChxVSkiLCJNaD8oQCkiLCJUejxAPihAKSIsIkU0KEApIiwiYTIqKEg3KikiLCJMTCooQCkiLCJaMDxx
+VSosTWgqPiooTEwqKSIsIkAoQCxxVSkiLCJ+KEdELEApIiwiYzgoWjA8cVUqLE1oKj4qKSIsIlowPHFV
+LHFVPihaMDxxVSxxVT4scVUpIiwicVUqKEFqKikiLCJ+KEApIiwiYzgoZXcqKSIsInFVKihaMDxALEA+
+KikiLCJ+KHFVW0BdKSIsInFVKHFVPykiLCJJZihJZixJZikiLCJjOCh+KCkpIiwiTWg/KE1oPykiLCJy
+NyhAKSJdLGludGVyY2VwdG9yc0J5VGFnOm51bGwsbGVhZlRhZ3M6bnVsbCxhcnJheVJ0aTp0eXBlb2Yg
+U3ltYm9sPT0iZnVuY3Rpb24iJiZ0eXBlb2YgU3ltYm9sKCk9PSJzeW1ib2wiP1N5bWJvbCgiJHRpIik6
+IiR0aSJ9CkgueGIodi50eXBlVW5pdmVyc2UsSlNPTi5wYXJzZSgneyJjNSI6Ik1GIiwiaUMiOiJNRiIs
+ImtkIjoiTUYiLCJyeCI6ImVhIiwiZTUiOiJlYSIsIlkwIjoiaGkiLCJ0cCI6ImhpIiwiRzgiOiJldyIs
+Ik1yIjoicUUiLCJlTCI6InFFIiwiSTAiOiJ1SCIsImhzIjoidUgiLCJYZyI6IlFGIiwibnIiOiJBaiIs
+Ink0IjoidzYiLCJhUCI6IkNtIiwieGMiOiJueCIsImtKIjoibngiLCJ6VSI6IkRnIiwiZGYiOiJFVCIs
+InlFIjp7ImEyIjpbXX0sIndlIjp7ImM4IjpbXX0sIk1GIjp7InZtIjpbXSwiRUgiOltdfSwiamQiOnsi
+ek0iOlsiMSJdLCJiUSI6WyIxIl0sImNYIjpbIjEiXX0sIlBvIjp7ImpkIjpbIjEiXSwiek0iOlsiMSJd
+LCJiUSI6WyIxIl0sImNYIjpbIjEiXX0sIm0xIjp7IkFuIjpbIjEiXX0sInFJIjp7IkNQIjpbXSwiTFoi
+OltdfSwiYlUiOnsiQ1AiOltdLCJJZiI6W10sIkxaIjpbXX0sIlZBIjp7IkNQIjpbXSwiTFoiOltdfSwi
+RHIiOnsicVUiOltdLCJ2WCI6W119LCJCUiI6eyJjWCI6WyIyIl19LCJFNyI6eyJBbiI6WyIyIl19LCJa
+eSI6eyJCUiI6WyIxIiwiMiJdLCJjWCI6WyIyIl0sImNYLkUiOiIyIn0sIm9sIjp7Ilp5IjpbIjEiLCIy
+Il0sIkJSIjpbIjEiLCIyIl0sImJRIjpbIjIiXSwiY1giOlsiMiJdLCJjWC5FIjoiMiJ9LCJVcSI6eyJs
+RCI6WyIyIl0sInpNIjpbIjIiXSwiQlIiOlsiMSIsIjIiXSwiYlEiOlsiMiJdLCJjWCI6WyIyIl19LCJq
+ViI6eyJVcSI6WyIxIiwiMiJdLCJsRCI6WyIyIl0sInpNIjpbIjIiXSwiQlIiOlsiMSIsIjIiXSwiYlEi
+OlsiMiJdLCJjWCI6WyIyIl0sImxELkUiOiIyIiwiY1guRSI6IjIifSwibiI6eyJYUyI6W119LCJyMyI6
+eyJYUyI6W119LCJxaiI6eyJsRCI6WyJJZiJdLCJSZSI6WyJJZiJdLCJ6TSI6WyJJZiJdLCJiUSI6WyJJ
+ZiJdLCJjWCI6WyJJZiJdLCJsRC5FIjoiSWYiLCJSZS5FIjoiSWYifSwiYlEiOnsiY1giOlsiMSJdfSwi
+YUwiOnsiYlEiOlsiMSJdLCJjWCI6WyIxIl19LCJuSCI6eyJhTCI6WyIxIl0sImJRIjpbIjEiXSwiY1gi
+OlsiMSJdLCJhTC5FIjoiMSIsImNYLkUiOiIxIn0sImE3Ijp7IkFuIjpbIjEiXX0sImkxIjp7ImNYIjpb
+IjIiXSwiY1guRSI6IjIifSwieHkiOnsiaTEiOlsiMSIsIjIiXSwiYlEiOlsiMiJdLCJjWCI6WyIyIl0s
+ImNYLkUiOiIyIn0sIk1IIjp7IkFuIjpbIjIiXX0sImxKIjp7ImFMIjpbIjIiXSwiYlEiOlsiMiJdLCJj
+WCI6WyIyIl0sImFMLkUiOiIyIiwiY1guRSI6IjIifSwiVTUiOnsiY1giOlsiMSJdLCJjWC5FIjoiMSJ9
+LCJTTyI6eyJBbiI6WyIxIl19LCJBTSI6eyJjWCI6WyIxIl0sImNYLkUiOiIxIn0sImQ1Ijp7IkFNIjpb
+IjEiXSwiYlEiOlsiMSJdLCJjWCI6WyIxIl0sImNYLkUiOiIxIn0sIlUxIjp7IkFuIjpbIjEiXX0sIk1C
+Ijp7ImJRIjpbIjEiXSwiY1giOlsiMSJdLCJjWC5FIjoiMSJ9LCJGdSI6eyJBbiI6WyIxIl19LCJ1NiI6
+eyJjWCI6WyIxIl0sImNYLkUiOiIxIn0sIkpCIjp7IkFuIjpbIjEiXX0sIncyIjp7ImxEIjpbIjEiXSwi
+UmUiOlsiMSJdLCJ6TSI6WyIxIl0sImJRIjpbIjEiXSwiY1giOlsiMSJdfSwid3YiOnsiR0QiOltdfSwi
+UEQiOnsiR2oiOlsiMSIsIjIiXSwiUlUiOlsiMSIsIjIiXSwiUG4iOlsiMSIsIjIiXSwiS1AiOlsiMSIs
+IjIiXSwiWjAiOlsiMSIsIjIiXX0sIldVIjp7IlowIjpbIjEiLCIyIl19LCJMUCI6eyJXVSI6WyIxIiwi
+MiJdLCJaMCI6WyIxIiwiMiJdfSwiWFIiOnsiY1giOlsiMSJdLCJjWC5FIjoiMSJ9LCJMSSI6eyJ2USI6
+W119LCJXMCI6eyJYUyI6W119LCJheiI6eyJYUyI6W119LCJ2ViI6eyJYUyI6W119LCJ0ZSI6eyJSeiI6
+W119LCJYTyI6eyJHeiI6W119LCJUcCI6eyJFSCI6W119LCJsYyI6eyJFSCI6W119LCJ6eCI6eyJFSCI6
+W119LCJyVCI6eyJFSCI6W119LCJFcSI6eyJYUyI6W119LCJrWSI6eyJYUyI6W119LCJONSI6eyJZayI6
+WyIxIiwiMiJdLCJGbyI6WyIxIiwiMiJdLCJaMCI6WyIxIiwiMiJdLCJZay5LIjoiMSIsIllrLlYiOiIy
+In0sImk1Ijp7ImJRIjpbIjEiXSwiY1giOlsiMSJdLCJjWC5FIjoiMSJ9LCJONiI6eyJBbiI6WyIxIl19
+LCJWUiI6eyJ3TCI6W10sInZYIjpbXX0sIkVLIjp7ImliIjpbXSwiT2QiOltdfSwiS1ciOnsiY1giOlsi
+aWIiXSwiY1guRSI6ImliIn0sIlBiIjp7IkFuIjpbImliIl19LCJ0USI6eyJPZCI6W119LCJ1biI6eyJj
+WCI6WyJPZCJdLCJjWC5FIjoiT2QifSwiU2QiOnsiQW4iOlsiT2QiXX0sIkVUIjp7IkFTIjpbXX0sIlhI
+Ijp7IlhqIjpbIjEiXSwiRVQiOltdLCJBUyI6W119LCJEZyI6eyJsRCI6WyJDUCJdLCJYaiI6WyJDUCJd
+LCJ6TSI6WyJDUCJdLCJFVCI6W10sImJRIjpbIkNQIl0sIkFTIjpbXSwiY1giOlsiQ1AiXSwiU1UiOlsi
+Q1AiXSwibEQuRSI6IkNQIn0sIlBnIjp7ImxEIjpbIklmIl0sIlhqIjpbIklmIl0sInpNIjpbIklmIl0s
+IkVUIjpbXSwiYlEiOlsiSWYiXSwiQVMiOltdLCJjWCI6WyJJZiJdLCJTVSI6WyJJZiJdfSwieGoiOnsi
+bEQiOlsiSWYiXSwiWGoiOlsiSWYiXSwiek0iOlsiSWYiXSwiRVQiOltdLCJiUSI6WyJJZiJdLCJBUyI6
+W10sImNYIjpbIklmIl0sIlNVIjpbIklmIl0sImxELkUiOiJJZiJ9LCJkRSI6eyJsRCI6WyJJZiJdLCJY
+aiI6WyJJZiJdLCJ6TSI6WyJJZiJdLCJFVCI6W10sImJRIjpbIklmIl0sIkFTIjpbXSwiY1giOlsiSWYi
+XSwiU1UiOlsiSWYiXSwibEQuRSI6IklmIn0sIlpBIjp7ImxEIjpbIklmIl0sIlhqIjpbIklmIl0sInpN
+IjpbIklmIl0sIkVUIjpbXSwiYlEiOlsiSWYiXSwiQVMiOltdLCJjWCI6WyJJZiJdLCJTVSI6WyJJZiJd
+LCJsRC5FIjoiSWYifSwiZFQiOnsibEQiOlsiSWYiXSwiWGoiOlsiSWYiXSwiek0iOlsiSWYiXSwiRVQi
+OltdLCJiUSI6WyJJZiJdLCJBUyI6W10sImNYIjpbIklmIl0sIlNVIjpbIklmIl0sImxELkUiOiJJZiJ9
+LCJQcSI6eyJsRCI6WyJJZiJdLCJYaiI6WyJJZiJdLCJ6TSI6WyJJZiJdLCJFVCI6W10sImJRIjpbIklm
+Il0sIkFTIjpbXSwiY1giOlsiSWYiXSwiU1UiOlsiSWYiXSwibEQuRSI6IklmIn0sImVFIjp7ImxEIjpb
+IklmIl0sIlhqIjpbIklmIl0sInpNIjpbIklmIl0sIkVUIjpbXSwiYlEiOlsiSWYiXSwiQVMiOltdLCJj
+WCI6WyJJZiJdLCJTVSI6WyJJZiJdLCJsRC5FIjoiSWYifSwiVjYiOnsibEQiOlsiSWYiXSwibjYiOltd
+LCJYaiI6WyJJZiJdLCJ6TSI6WyJJZiJdLCJFVCI6W10sImJRIjpbIklmIl0sIkFTIjpbXSwiY1giOlsi
+SWYiXSwiU1UiOlsiSWYiXSwibEQuRSI6IklmIn0sImtTIjp7IlhTIjpbXX0sImlNIjp7IlhTIjpbXX0s
+IkdWIjp7IkFuIjpbIjEiXX0sInE0Ijp7ImNYIjpbIjEiXSwiY1guRSI6IjEifSwiWmYiOnsiUGYiOlsi
+MSJdfSwidnMiOnsiYjgiOlsiMSJdfSwiQ3ciOnsiWFMiOltdfSwibTAiOnsiUW0iOltdfSwiSmkiOnsi
+bTAiOltdLCJRbSI6W119LCJiNiI6eyJsZiI6WyIxIl0sInh1IjpbIjEiXSwiYlEiOlsiMSJdLCJjWCI6
+WyIxIl0sImxmLkUiOiIxIn0sImxtIjp7IkFuIjpbIjEiXX0sIm1XIjp7ImNYIjpbIjEiXX0sInV5Ijp7
+ImxEIjpbIjEiXSwiek0iOlsiMSJdLCJiUSI6WyIxIl0sImNYIjpbIjEiXX0sImlsIjp7IllrIjpbIjEi
+LCIyIl0sIlowIjpbIjEiLCIyIl19LCJZayI6eyJaMCI6WyIxIiwiMiJdfSwiUG4iOnsiWjAiOlsiMSIs
+IjIiXX0sIkdqIjp7IlJVIjpbIjEiLCIyIl0sIlBuIjpbIjEiLCIyIl0sIktQIjpbIjEiLCIyIl0sIlow
+IjpbIjEiLCIyIl19LCJWaiI6eyJsZiI6WyIxIl0sInh1IjpbIjEiXSwiYlEiOlsiMSJdLCJjWCI6WyIx
+Il19LCJYdiI6eyJsZiI6WyIxIl0sInh1IjpbIjEiXSwiYlEiOlsiMSJdLCJjWCI6WyIxIl19LCJ1dyI6
+eyJZayI6WyJxVSIsIkAiXSwiWjAiOlsicVUiLCJAIl0sIllrLksiOiJxVSIsIllrLlYiOiJAIn0sImk4
+Ijp7ImFMIjpbInFVIl0sImJRIjpbInFVIl0sImNYIjpbInFVIl0sImFMLkUiOiJxVSIsImNYLkUiOiJx
+VSJ9LCJDViI6eyJVayI6WyJ6TTxJZj4iLCJxVSJdLCJVay5TIjoiek08SWY+In0sIlU4Ijp7IndJIjpb
+InpNPElmPiIsInFVIl19LCJaaSI6eyJVayI6WyJxVSIsInpNPElmPiJdfSwiVWQiOnsiWFMiOltdfSwi
+SzgiOnsiWFMiOltdfSwiYnkiOnsiVWsiOlsiTWg/IiwicVUiXSwiVWsuUyI6Ik1oPyJ9LCJvaiI6eyJ3
+SSI6WyJNaD8iLCJxVSJdfSwiTXgiOnsid0kiOlsicVUiLCJNaD8iXX0sInU1Ijp7IlVrIjpbInFVIiwi
+ek08SWY+Il0sIlVrLlMiOiJxVSJ9LCJFMyI6eyJ3SSI6WyJxVSIsInpNPElmPiJdfSwiR1kiOnsid0ki
+Olsiek08SWY+IiwicVUiXX0sIkNQIjp7IkxaIjpbXX0sIklmIjp7IkxaIjpbXX0sInpNIjp7ImJRIjpb
+IjEiXSwiY1giOlsiMSJdfSwiaWIiOnsiT2QiOltdfSwieHUiOnsiYlEiOlsiMSJdLCJjWCI6WyIxIl19
+LCJxVSI6eyJ2WCI6W119LCJDNiI6eyJYUyI6W119LCJFeiI6eyJYUyI6W119LCJGIjp7IlhTIjpbXX0s
+InUiOnsiWFMiOltdfSwiYkoiOnsiWFMiOltdfSwiZVkiOnsiWFMiOltdfSwibXAiOnsiWFMiOltdfSwi
+dWIiOnsiWFMiOltdfSwiZHMiOnsiWFMiOltdfSwibGoiOnsiWFMiOltdfSwiVVYiOnsiWFMiOltdfSwi
+azUiOnsiWFMiOltdfSwiS1kiOnsiWFMiOltdfSwicCI6eyJYUyI6W119LCJDRCI6eyJSeiI6W119LCJh
+RSI6eyJSeiI6W119LCJaZCI6eyJHeiI6W119LCJSbiI6eyJCTCI6W119LCJEbiI6eyJpRCI6W119LCJV
+ZiI6eyJpRCI6W119LCJxZSI6eyJpRCI6W119LCJxRSI6eyJjdiI6W10sInVIIjpbXSwiRDAiOltdfSwi
+R2giOnsiY3YiOltdLCJ1SCI6W10sIkQwIjpbXX0sImZZIjp7ImN2IjpbXSwidUgiOltdLCJEMCI6W119
+LCJuQiI6eyJjdiI6W10sInVIIjpbXSwiRDAiOltdfSwiUVAiOnsiY3YiOltdLCJ1SCI6W10sIkQwIjpb
+XX0sIm54Ijp7InVIIjpbXSwiRDAiOltdfSwiUUYiOnsidUgiOltdLCJEMCI6W119LCJJQiI6eyJ0biI6
+WyJMWiJdfSwid3oiOnsibEQiOlsiMSJdLCJ6TSI6WyIxIl0sImJRIjpbIjEiXSwiY1giOlsiMSJdLCJs
+RC5FIjoiMSJ9LCJjdiI6eyJ1SCI6W10sIkQwIjpbXX0sImhIIjp7IkF6IjpbXX0sImg0Ijp7ImN2Ijpb
+XSwidUgiOltdLCJEMCI6W119LCJWYiI6eyJ1SCI6W10sIkQwIjpbXX0sImZKIjp7IkQwIjpbXX0sIndh
+Ijp7IkQwIjpbXX0sIkFqIjp7ImVhIjpbXX0sImU3Ijp7ImxEIjpbInVIIl0sInpNIjpbInVIIl0sImJR
+IjpbInVIIl0sImNYIjpbInVIIl0sImxELkUiOiJ1SCJ9LCJ1SCI6eyJEMCI6W119LCJCSCI6eyJsRCI6
+WyJ1SCJdLCJHbSI6WyJ1SCJdLCJ6TSI6WyJ1SCJdLCJYaiI6WyJ1SCJdLCJiUSI6WyJ1SCJdLCJjWCI6
+WyJ1SCJdLCJsRC5FIjoidUgiLCJHbS5FIjoidUgifSwiU04iOnsiY3YiOltdLCJ1SCI6W10sIkQwIjpb
+XX0sImV3Ijp7ImVhIjpbXX0sImxwIjp7ImN2IjpbXSwidUgiOltdLCJEMCI6W119LCJUYiI6eyJjdiI6
+W10sInVIIjpbXSwiRDAiOltdfSwiSXYiOnsiY3YiOltdLCJ1SCI6W10sIkQwIjpbXX0sIldQIjp7ImN2
+IjpbXSwidUgiOltdLCJEMCI6W119LCJ5WSI6eyJjdiI6W10sInVIIjpbXSwiRDAiOltdfSwidzYiOnsi
+ZWEiOltdfSwiSzUiOnsidjYiOltdLCJEMCI6W119LCJDbSI6eyJEMCI6W119LCJDUSI6eyJ1SCI6W10s
+IkQwIjpbXX0sInc0Ijp7InRuIjpbIkxaIl19LCJyaCI6eyJsRCI6WyJ1SCJdLCJHbSI6WyJ1SCJdLCJ6
+TSI6WyJ1SCJdLCJYaiI6WyJ1SCJdLCJiUSI6WyJ1SCJdLCJjWCI6WyJ1SCJdLCJsRC5FIjoidUgiLCJH
+bS5FIjoidUgifSwiY2YiOnsiWWsiOlsicVUiLCJxVSJdLCJaMCI6WyJxVSIsInFVIl19LCJpNyI6eyJZ
+ayI6WyJxVSIsInFVIl0sIlowIjpbInFVIiwicVUiXSwiWWsuSyI6InFVIiwiWWsuViI6InFVIn0sIlN5
+Ijp7IllrIjpbInFVIiwicVUiXSwiWjAiOlsicVUiLCJxVSJdLCJZay5LIjoicVUiLCJZay5WIjoicVUi
+fSwiSTQiOnsibGYiOlsicVUiXSwieHUiOlsicVUiXSwiYlEiOlsicVUiXSwiY1giOlsicVUiXSwibGYu
+RSI6InFVIn0sIlJPIjp7InFoIjpbIjEiXX0sImV1Ijp7IlJPIjpbIjEiXSwicWgiOlsiMSJdfSwieEMi
+OnsiTU8iOlsiMSJdfSwiSlEiOnsia0YiOltdfSwidkQiOnsia0YiOltdfSwibTYiOnsia0YiOltdfSwi
+Y3QiOnsia0YiOltdfSwiT3ciOnsia0YiOltdfSwiVzkiOnsiQW4iOlsiMSJdfSwiZFciOnsidjYiOltd
+LCJEMCI6W119LCJtayI6eyJ5MCI6W119LCJLbyI6eyJvbiI6W119LCJBcyI6eyJsZiI6WyJxVSJdLCJ4
+dSI6WyJxVSJdLCJiUSI6WyJxVSJdLCJjWCI6WyJxVSJdfSwicjciOnsiRTQiOltdfSwiVHoiOnsibEQi
+OlsiMSJdLCJ6TSI6WyIxIl0sImJRIjpbIjEiXSwiRTQiOltdLCJjWCI6WyIxIl0sImxELkUiOiIxIn0s
+Im5kIjp7ImhpIjpbXSwiY3YiOltdLCJ1SCI6W10sIkQwIjpbXX0sIktlIjp7ImxmIjpbInFVIl0sInh1
+IjpbInFVIl0sImJRIjpbInFVIl0sImNYIjpbInFVIl0sImxmLkUiOiJxVSJ9LCJoaSI6eyJjdiI6W10s
+InVIIjpbXSwiRDAiOltdfSwiWEEiOnsia0YiOltdfSwiZHYiOnsiUnoiOltdfSwiT0YiOnsiZnYiOltd
+fSwicnUiOnsiZnYiOltdfSwiSVYiOnsiZnYiOltdfSwibjYiOnsiek0iOlsiSWYiXSwiYlEiOlsiSWYi
+XSwiY1giOlsiSWYiXSwiQVMiOltdfX0nKSkKSC5GRih2LnR5cGVVbml2ZXJzZSxKU09OLnBhcnNlKCd7
+IncyIjoxLCJRQyI6MiwiWEgiOjEsImtUIjoyLCJtVyI6MSwidXkiOjEsImlsIjoyLCJWaiI6MSwiWHYi
+OjEsIm5ZIjoxLCJXWSI6MSwicFIiOjEsImNvIjoxfScpKQp2YXIgdT17bDoiQ2Fubm90IGV4dHJhY3Qg
+YSBmaWxlIHBhdGggZnJvbSBhIFVSSSB3aXRoIGEgZnJhZ21lbnQgY29tcG9uZW50IixpOiJDYW5ub3Qg
+ZXh0cmFjdCBhIGZpbGUgcGF0aCBmcm9tIGEgVVJJIHdpdGggYSBxdWVyeSBjb21wb25lbnQiLGo6IkNh
+bm5vdCBleHRyYWN0IGEgbm9uLVdpbmRvd3MgZmlsZSBwYXRoIGZyb20gYSBmaWxlIFVSSSB3aXRoIGFu
+IGF1dGhvcml0eSIsZzoiYG51bGxgIGVuY291bnRlcmVkIGFzIHRoZSByZXN1bHQgZnJvbSBleHByZXNz
+aW9uIHdpdGggdHlwZSBgTmV2ZXJgLiIsZDoiYXJlYS1hbmFseXplcixhbmFseXplci1ubmJkLW1pZ3Jh
+dGlvbix0eXBlLWJ1ZyJ9CnZhciB0PShmdW5jdGlvbiBydGlpKCl7dmFyIHM9SC5OMApyZXR1cm57bjpz
+KCJDdyIpLGNSOnMoIm5CIiksdzpzKCJBeiIpLHA6cygiUVAiKSxnRjpzKCJQRDxHRCxAPiIpLGI6cygi
+YlE8QD4iKSxoOnMoImN2IikscjpzKCJYUyIpLEI6cygiZWEiKSxhUzpzKCJEMCIpLGc4OnMoIlJ6Iiks
+Yzg6cygiaEgiKSxZOnMoIkVIIiksZDpzKCJiODxAPiIpLEk6cygiU2ciKSxvOnMoInZRIiksZWg6cygi
+Y1g8dUg+IiksUTpzKCJjWDxxVT4iKSx1OnMoImNYPEA+IiksdjpzKCJqZDxrRj4iKSxzOnMoImpkPHFV
+PiIpLHg6cygiamQ8QD4iKSxhOnMoImpkPElmPiIpLGQ3OnMoImpkPFNlKj4iKSxoNDpzKCJqZDxqOCo+
+IiksRzpzKCJqZDxaMDxxVSosTWgqPio+IiksY1E6cygiamQ8WloqPiIpLGk6cygiamQ8cVUqPiIpLGFB
+OnMoImpkPHlEKj4iKSxhSjpzKCJqZDx3Yio+IiksVjpzKCJqZDxJZio+IiksZDQ6cygiamQ8cVU/PiIp
+LFQ6cygid2UiKSxlSDpzKCJ2bSIpLEQ6cygiYzUiKSxhVTpzKCJYajxAPiIpLGFtOnMoIlR6PEA+Iiks
+ZW86cygiTjU8R0QsQD4iKSxkejpzKCJoRiIpLEU6cygiek08cVU+IiksajpzKCJ6TTxAPiIpLEw6cygi
+ek08SWY+IiksSjpzKCJaMDxxVSxxVT4iKSxmOnMoIlowPEAsQD4iKSxkbzpzKCJsSjxxVSxAPiIpLGZq
+OnMoImxKPHFVKixxVT4iKSxkRTpzKCJFVCIpLGJtOnMoIlY2IiksQTpzKCJ1SCIpLGY2OnMoImtGIiks
+UDpzKCJjOCIpLEs6cygiTWgiKSxxOnMoInRuPExaPiIpLGZ2OnMoIndMIiksZXc6cygibmQiKSxDOnMo
+Inh1PHFVPiIpLGw6cygiR3oiKSxOOnMoInFVIiksZDA6cygicVUocVUqKSIpLGc3OnMoImhpIiksZm86
+cygiR0QiKSxhVzpzKCJ5WSIpLGFrOnMoIkFTIiksZ2M6cygibjYiKSxiSjpzKCJrZCIpLGR3OnMoIkdq
+PHFVLHFVPiIpLGREOnMoImlEIiksZUo6cygidTY8cVU+IiksZzQ6cygiSzUiKSxjaTpzKCJ2NiIpLGcy
+OnMoIkNtIiksYkM6cygiWmY8ZkoqPiIpLGg5OnMoIkNRIiksYWM6cygiZTciKSxrOnMoImV1PEFqKj4i
+KSxXOnMoInd6PGN2Kj4iKSxjOnMoInZzPEA+IiksZko6cygidnM8SWY+IiksZ1Y6cygidnM8ZkoqPiIp
+LGNyOnMoIkpRIikseTpzKCJhMiIpLGFsOnMoImEyKE1oKSIpLGdSOnMoIkNQIiksejpzKCJAIiksZk86
+cygiQCgpIiksYkk6cygiQChNaCkiKSxhZzpzKCJAKE1oLEd6KSIpLGJVOnMoIkAoeHU8cVU+KSIpLGRP
+OnMoIkAocVUpIiksYjg6cygiQChALEApIiksUzpzKCJJZiIpLGRkOnMoIkdoKiIpLGc6cygiY3YqIiks
+YUw6cygiZWEqIiksYVg6cygiTEwqIiksZkU6cygiSDcqIiksVTpzKCJjWDxAPioiKSxkSDpzKCJFNCoi
+KSxmSzpzKCJ6TTxAPioiKSxkXzpzKCJ6TTxqOCo+KiIpLGRwOnMoInpNPFowPHFVKixNaCo+Kj4qIiks
+bTpzKCJ6TTxNaCo+KiIpLGF3OnMoIlowPEAsQD4qIiksdDpzKCJaMDxxVSosTWgqPioiKSxPOnMoIkFq
+KiIpLGNGOnMoIjAmKiIpLF86cygiTWgqIiksZVE6cygiZXcqIiksWDpzKCJxVSoiKSxjaDpzKCJEMD8i
+KSxiRzpzKCJiODxjOD4/IiksYms6cygiek08cVU+PyIpLGJNOnMoInpNPEA+PyIpLGNaOnMoIlowPHFV
+LHFVPj8iKSxjOTpzKCJaMDxxVSxAPj8iKSxSOnMoIk1oPyIpLEY6cygiRmU8QCxAPj8iKSxlOnMoImJu
+PyIpLGI3OnMoImEyKE1oKT8iKSxidzpzKCJAKGVhKT8iKSxmVjpzKCJNaD8oTWg/LE1oPyk/IiksZEE6
+cygiTWg/KEApPyIpLFo6cygifigpPyIpLGViOnMoIn4oZXcqKT8iKSxkaTpzKCJMWiIpLEg6cygifiIp
+LE06cygifigpIiksZUE6cygifihxVSxxVSkiKSxjQTpzKCJ+KHFVLEApIil9fSkoKTsoZnVuY3Rpb24g
+Y29uc3RhbnRzKCl7dmFyIHM9aHVua0hlbHBlcnMubWFrZUNvbnN0TGlzdApDLnhuPVcuR2gucHJvdG90
+eXBlCkMuUlk9Vy5RUC5wcm90b3R5cGUKQy5tSD1XLmFlLnByb3RvdHlwZQpDLkJaPVcuVmIucHJvdG90
+eXBlCkMuRHQ9Vy5mSi5wcm90b3R5cGUKQy5Paz1KLnZCLnByb3RvdHlwZQpDLk5tPUouamQucHJvdG90
+eXBlCkMuam49Si5iVS5wcm90b3R5cGUKQy5qTj1KLndlLnByb3RvdHlwZQpDLkNEPUoucUkucHJvdG90
+eXBlCkMueEI9Si5Eci5wcm90b3R5cGUKQy5ERz1KLmM1LnByb3RvdHlwZQpDLkV4PVcudTgucHJvdG90
+eXBlCkMuTkE9SC5WNi5wcm90b3R5cGUKQy50NT1XLkJILnByb3RvdHlwZQpDLkx0PVcuU04ucHJvdG90
+eXBlCkMuWlE9Si5pQy5wcm90b3R5cGUKQy5JZT1XLlRiLnByb3RvdHlwZQpDLnZCPUoua2QucHJvdG90
+eXBlCkMub2w9Vy5LNS5wcm90b3R5cGUKQy55OD1uZXcgUC5VOCgpCkMuaDk9bmV3IFAuQ1YoKQpDLkd3
+PW5ldyBILkZ1KEguTjAoIkZ1PGM4PiIpKQpDLk80PWZ1bmN0aW9uIGdldFRhZ0ZhbGxiYWNrKG8pIHsK
+ICB2YXIgcyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKTsKICByZXR1cm4gcy5zdWJz
+dHJpbmcoOCwgcy5sZW5ndGggLSAxKTsKfQpDLllxPWZ1bmN0aW9uKCkgewogIHZhciB0b1N0cmluZ0Z1
+bmN0aW9uID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZzsKICBmdW5jdGlvbiBnZXRUYWcobykgewog
+ICAgdmFyIHMgPSB0b1N0cmluZ0Z1bmN0aW9uLmNhbGwobyk7CiAgICByZXR1cm4gcy5zdWJzdHJpbmco
+OCwgcy5sZW5ndGggLSAxKTsKICB9CiAgZnVuY3Rpb24gZ2V0VW5rbm93blRhZyhvYmplY3QsIHRhZykg
+ewogICAgaWYgKC9eSFRNTFtBLVpdLipFbGVtZW50JC8udGVzdCh0YWcpKSB7CiAgICAgIHZhciBuYW1l
+ID0gdG9TdHJpbmdGdW5jdGlvbi5jYWxsKG9iamVjdCk7CiAgICAgIGlmIChuYW1lID09ICJbb2JqZWN0
+IE9iamVjdF0iKSByZXR1cm4gbnVsbDsKICAgICAgcmV0dXJuICJIVE1MRWxlbWVudCI7CiAgICB9CiAg
+fQogIGZ1bmN0aW9uIGdldFVua25vd25UYWdHZW5lcmljQnJvd3NlcihvYmplY3QsIHRhZykgewogICAg
+aWYgKHNlbGYuSFRNTEVsZW1lbnQgJiYgb2JqZWN0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHJldHVy
+biAiSFRNTEVsZW1lbnQiOwogICAgcmV0dXJuIGdldFVua25vd25UYWcob2JqZWN0LCB0YWcpOwogIH0K
+ICBmdW5jdGlvbiBwcm90b3R5cGVGb3JUYWcodGFnKSB7CiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PSAi
+dW5kZWZpbmVkIikgcmV0dXJuIG51bGw7CiAgICBpZiAodHlwZW9mIHdpbmRvd1t0YWddID09ICJ1bmRl
+ZmluZWQiKSByZXR1cm4gbnVsbDsKICAgIHZhciBjb25zdHJ1Y3RvciA9IHdpbmRvd1t0YWddOwogICAg
+aWYgKHR5cGVvZiBjb25zdHJ1Y3RvciAhPSAiZnVuY3Rpb24iKSByZXR1cm4gbnVsbDsKICAgIHJldHVy
+biBjb25zdHJ1Y3Rvci5wcm90b3R5cGU7CiAgfQogIGZ1bmN0aW9uIGRpc2NyaW1pbmF0b3IodGFnKSB7
+IHJldHVybiBudWxsOyB9CiAgdmFyIGlzQnJvd3NlciA9IHR5cGVvZiBuYXZpZ2F0b3IgPT0gIm9iamVj
+dCI7CiAgcmV0dXJuIHsKICAgIGdldFRhZzogZ2V0VGFnLAogICAgZ2V0VW5rbm93blRhZzogaXNCcm93
+c2VyID8gZ2V0VW5rbm93blRhZ0dlbmVyaWNCcm93c2VyIDogZ2V0VW5rbm93blRhZywKICAgIHByb3Rv
+dHlwZUZvclRhZzogcHJvdG90eXBlRm9yVGFnLAogICAgZGlzY3JpbWluYXRvcjogZGlzY3JpbWluYXRv
+ciB9Owp9CkMud2I9ZnVuY3Rpb24oZ2V0VGFnRmFsbGJhY2spIHsKICByZXR1cm4gZnVuY3Rpb24oaG9v
+a3MpIHsKICAgIGlmICh0eXBlb2YgbmF2aWdhdG9yICE9ICJvYmplY3QiKSByZXR1cm4gaG9va3M7CiAg
+ICB2YXIgdWEgPSBuYXZpZ2F0b3IudXNlckFnZW50OwogICAgaWYgKHVhLmluZGV4T2YoIkR1bXBSZW5k
+ZXJUcmVlIikgPj0gMCkgcmV0dXJuIGhvb2tzOwogICAgaWYgKHVhLmluZGV4T2YoIkNocm9tZSIpID49
+IDApIHsKICAgICAgZnVuY3Rpb24gY29uZmlybShwKSB7CiAgICAgICAgcmV0dXJuIHR5cGVvZiB3aW5k
+b3cgPT0gIm9iamVjdCIgJiYgd2luZG93W3BdICYmIHdpbmRvd1twXS5uYW1lID09IHA7CiAgICAgIH0K
+ICAgICAgaWYgKGNvbmZpcm0oIldpbmRvdyIpICYmIGNvbmZpcm0oIkhUTUxFbGVtZW50IikpIHJldHVy
+biBob29rczsKICAgIH0KICAgIGhvb2tzLmdldFRhZyA9IGdldFRhZ0ZhbGxiYWNrOwogIH07Cn0KQy5L
+VT1mdW5jdGlvbihob29rcykgewogIGlmICh0eXBlb2YgZGFydEV4cGVyaW1lbnRhbEZpeHVwR2V0VGFn
+ICE9ICJmdW5jdGlvbiIpIHJldHVybiBob29rczsKICBob29rcy5nZXRUYWcgPSBkYXJ0RXhwZXJpbWVu
+dGFsRml4dXBHZXRUYWcoaG9va3MuZ2V0VGFnKTsKfQpDLmZRPWZ1bmN0aW9uKGhvb2tzKSB7CiAgdmFy
+IGdldFRhZyA9IGhvb2tzLmdldFRhZzsKICB2YXIgcHJvdG90eXBlRm9yVGFnID0gaG9va3MucHJvdG90
+eXBlRm9yVGFnOwogIGZ1bmN0aW9uIGdldFRhZ0ZpeGVkKG8pIHsKICAgIHZhciB0YWcgPSBnZXRUYWco
+byk7CiAgICBpZiAodGFnID09ICJEb2N1bWVudCIpIHsKICAgICAgaWYgKCEhby54bWxWZXJzaW9uKSBy
+ZXR1cm4gIiFEb2N1bWVudCI7CiAgICAgIHJldHVybiAiIUhUTUxEb2N1bWVudCI7CiAgICB9CiAgICBy
+ZXR1cm4gdGFnOwogIH0KICBmdW5jdGlvbiBwcm90b3R5cGVGb3JUYWdGaXhlZCh0YWcpIHsKICAgIGlm
+ICh0YWcgPT0gIkRvY3VtZW50IikgcmV0dXJuIG51bGw7CiAgICByZXR1cm4gcHJvdG90eXBlRm9yVGFn
+KHRhZyk7CiAgfQogIGhvb2tzLmdldFRhZyA9IGdldFRhZ0ZpeGVkOwogIGhvb2tzLnByb3RvdHlwZUZv
+clRhZyA9IHByb3RvdHlwZUZvclRhZ0ZpeGVkOwp9CkMuZGs9ZnVuY3Rpb24oaG9va3MpIHsKICB2YXIg
+dXNlckFnZW50ID0gdHlwZW9mIG5hdmlnYXRvciA9PSAib2JqZWN0IiA/IG5hdmlnYXRvci51c2VyQWdl
+bnQgOiAiIjsKICBpZiAodXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSA9PSAtMSkgcmV0dXJuIGhv
+b2tzOwogIHZhciBnZXRUYWcgPSBob29rcy5nZXRUYWc7CiAgdmFyIHF1aWNrTWFwID0gewogICAgIkJl
+Zm9yZVVubG9hZEV2ZW50IjogIkV2ZW50IiwKICAgICJEYXRhVHJhbnNmZXIiOiAiQ2xpcGJvYXJkIiwK
+ICAgICJHZW9HZW9sb2NhdGlvbiI6ICJHZW9sb2NhdGlvbiIsCiAgICAiTG9jYXRpb24iOiAiIUxvY2F0
+aW9uIiwKICAgICJXb3JrZXJNZXNzYWdlRXZlbnQiOiAiTWVzc2FnZUV2ZW50IiwKICAgICJYTUxEb2N1
+bWVudCI6ICIhRG9jdW1lbnQifTsKICBmdW5jdGlvbiBnZXRUYWdGaXJlZm94KG8pIHsKICAgIHZhciB0
+YWcgPSBnZXRUYWcobyk7CiAgICByZXR1cm4gcXVpY2tNYXBbdGFnXSB8fCB0YWc7CiAgfQogIGhvb2tz
+LmdldFRhZyA9IGdldFRhZ0ZpcmVmb3g7Cn0KQy54aT1mdW5jdGlvbihob29rcykgewogIHZhciB1c2Vy
+QWdlbnQgPSB0eXBlb2YgbmF2aWdhdG9yID09ICJvYmplY3QiID8gbmF2aWdhdG9yLnVzZXJBZ2VudCA6
+ICIiOwogIGlmICh1c2VyQWdlbnQuaW5kZXhPZigiVHJpZGVudC8iKSA9PSAtMSkgcmV0dXJuIGhvb2tz
+OwogIHZhciBnZXRUYWcgPSBob29rcy5nZXRUYWc7CiAgdmFyIHF1aWNrTWFwID0gewogICAgIkJlZm9y
+ZVVubG9hZEV2ZW50IjogIkV2ZW50IiwKICAgICJEYXRhVHJhbnNmZXIiOiAiQ2xpcGJvYXJkIiwKICAg
+ICJIVE1MRERFbGVtZW50IjogIkhUTUxFbGVtZW50IiwKICAgICJIVE1MRFRFbGVtZW50IjogIkhUTUxF
+bGVtZW50IiwKICAgICJIVE1MUGhyYXNlRWxlbWVudCI6ICJIVE1MRWxlbWVudCIsCiAgICAiUG9zaXRp
+b24iOiAiR2VvcG9zaXRpb24iCiAgfTsKICBmdW5jdGlvbiBnZXRUYWdJRShvKSB7CiAgICB2YXIgdGFn
+ID0gZ2V0VGFnKG8pOwogICAgdmFyIG5ld1RhZyA9IHF1aWNrTWFwW3RhZ107CiAgICBpZiAobmV3VGFn
+KSByZXR1cm4gbmV3VGFnOwogICAgaWYgKHRhZyA9PSAiT2JqZWN0IikgewogICAgICBpZiAod2luZG93
+LkRhdGFWaWV3ICYmIChvIGluc3RhbmNlb2Ygd2luZG93LkRhdGFWaWV3KSkgcmV0dXJuICJEYXRhVmll
+dyI7CiAgICB9CiAgICByZXR1cm4gdGFnOwogIH0KICBmdW5jdGlvbiBwcm90b3R5cGVGb3JUYWdJRSh0
+YWcpIHsKICAgIHZhciBjb25zdHJ1Y3RvciA9IHdpbmRvd1t0YWddOwogICAgaWYgKGNvbnN0cnVjdG9y
+ID09IG51bGwpIHJldHVybiBudWxsOwogICAgcmV0dXJuIGNvbnN0cnVjdG9yLnByb3RvdHlwZTsKICB9
+CiAgaG9va3MuZ2V0VGFnID0gZ2V0VGFnSUU7CiAgaG9va3MucHJvdG90eXBlRm9yVGFnID0gcHJvdG90
+eXBlRm9yVGFnSUU7Cn0KQy5pNz1mdW5jdGlvbihob29rcykgeyByZXR1cm4gaG9va3M7IH0KCkMuQ3Q9
+bmV3IFAuYnkoKQpDLkVxPW5ldyBQLms1KCkKQy54TT1uZXcgUC51NSgpCkMuUWs9bmV3IFAuRTMoKQpD
+Lk52PW5ldyBILmtyKCkKQy5OVT1uZXcgUC5KaSgpCkMucGQ9bmV3IFAuWmQoKQpDLkFkPW5ldyBNLkg3
+KDAsIkhpbnRBY3Rpb25LaW5kLmFkZE51bGxhYmxlSGludCIpCkMubmU9bmV3IE0uSDcoMSwiSGludEFj
+dGlvbktpbmQuYWRkTm9uTnVsbGFibGVIaW50IikKQy5teT1uZXcgTS5INygyLCJIaW50QWN0aW9uS2lu
+ZC5jaGFuZ2VUb051bGxhYmxlSGludCIpCkMucng9bmV3IE0uSDcoMywiSGludEFjdGlvbktpbmQuY2hh
+bmdlVG9Ob25OdWxsYWJsZUhpbnQiKQpDLndWPW5ldyBNLkg3KDQsIkhpbnRBY3Rpb25LaW5kLnJlbW92
+ZU51bGxhYmxlSGludCIpCkMuZlI9bmV3IE0uSDcoNSwiSGludEFjdGlvbktpbmQucmVtb3ZlTm9uTnVs
+bGFibGVIaW50IikKQy5BMz1uZXcgUC5NeChudWxsKQpDLm5YPW5ldyBQLm9qKG51bGwpCkMuYWs9SC5W
+TShzKFswLDAsMzI3NzYsMzM3OTIsMSwxMDI0MCwwLDBdKSx0LlYpCkMuY209SC5WTShzKFsiKjo6Y2xh
+c3MiLCIqOjpkaXIiLCIqOjpkcmFnZ2FibGUiLCIqOjpoaWRkZW4iLCIqOjppZCIsIio6OmluZXJ0Iiwi
+Kjo6aXRlbXByb3AiLCIqOjppdGVtcmVmIiwiKjo6aXRlbXNjb3BlIiwiKjo6bGFuZyIsIio6OnNwZWxs
+Y2hlY2siLCIqOjp0aXRsZSIsIio6OnRyYW5zbGF0ZSIsIkE6OmFjY2Vzc2tleSIsIkE6OmNvb3JkcyIs
+IkE6OmhyZWZsYW5nIiwiQTo6bmFtZSIsIkE6OnNoYXBlIiwiQTo6dGFiaW5kZXgiLCJBOjp0YXJnZXQi
+LCJBOjp0eXBlIiwiQVJFQTo6YWNjZXNza2V5IiwiQVJFQTo6YWx0IiwiQVJFQTo6Y29vcmRzIiwiQVJF
+QTo6bm9ocmVmIiwiQVJFQTo6c2hhcGUiLCJBUkVBOjp0YWJpbmRleCIsIkFSRUE6OnRhcmdldCIsIkFV
+RElPOjpjb250cm9scyIsIkFVRElPOjpsb29wIiwiQVVESU86Om1lZGlhZ3JvdXAiLCJBVURJTzo6bXV0
+ZWQiLCJBVURJTzo6cHJlbG9hZCIsIkJETzo6ZGlyIiwiQk9EWTo6YWxpbmsiLCJCT0RZOjpiZ2NvbG9y
+IiwiQk9EWTo6bGluayIsIkJPRFk6OnRleHQiLCJCT0RZOjp2bGluayIsIkJSOjpjbGVhciIsIkJVVFRP
+Tjo6YWNjZXNza2V5IiwiQlVUVE9OOjpkaXNhYmxlZCIsIkJVVFRPTjo6bmFtZSIsIkJVVFRPTjo6dGFi
+aW5kZXgiLCJCVVRUT046OnR5cGUiLCJCVVRUT046OnZhbHVlIiwiQ0FOVkFTOjpoZWlnaHQiLCJDQU5W
+QVM6OndpZHRoIiwiQ0FQVElPTjo6YWxpZ24iLCJDT0w6OmFsaWduIiwiQ09MOjpjaGFyIiwiQ09MOjpj
+aGFyb2ZmIiwiQ09MOjpzcGFuIiwiQ09MOjp2YWxpZ24iLCJDT0w6OndpZHRoIiwiQ09MR1JPVVA6OmFs
+aWduIiwiQ09MR1JPVVA6OmNoYXIiLCJDT0xHUk9VUDo6Y2hhcm9mZiIsIkNPTEdST1VQOjpzcGFuIiwi
+Q09MR1JPVVA6OnZhbGlnbiIsIkNPTEdST1VQOjp3aWR0aCIsIkNPTU1BTkQ6OmNoZWNrZWQiLCJDT01N
+QU5EOjpjb21tYW5kIiwiQ09NTUFORDo6ZGlzYWJsZWQiLCJDT01NQU5EOjpsYWJlbCIsIkNPTU1BTkQ6
+OnJhZGlvZ3JvdXAiLCJDT01NQU5EOjp0eXBlIiwiREFUQTo6dmFsdWUiLCJERUw6OmRhdGV0aW1lIiwi
+REVUQUlMUzo6b3BlbiIsIkRJUjo6Y29tcGFjdCIsIkRJVjo6YWxpZ24iLCJETDo6Y29tcGFjdCIsIkZJ
+RUxEU0VUOjpkaXNhYmxlZCIsIkZPTlQ6OmNvbG9yIiwiRk9OVDo6ZmFjZSIsIkZPTlQ6OnNpemUiLCJG
+T1JNOjphY2NlcHQiLCJGT1JNOjphdXRvY29tcGxldGUiLCJGT1JNOjplbmN0eXBlIiwiRk9STTo6bWV0
+aG9kIiwiRk9STTo6bmFtZSIsIkZPUk06Om5vdmFsaWRhdGUiLCJGT1JNOjp0YXJnZXQiLCJGUkFNRTo6
+bmFtZSIsIkgxOjphbGlnbiIsIkgyOjphbGlnbiIsIkgzOjphbGlnbiIsIkg0OjphbGlnbiIsIkg1Ojph
+bGlnbiIsIkg2OjphbGlnbiIsIkhSOjphbGlnbiIsIkhSOjpub3NoYWRlIiwiSFI6OnNpemUiLCJIUjo6
+d2lkdGgiLCJIVE1MOjp2ZXJzaW9uIiwiSUZSQU1FOjphbGlnbiIsIklGUkFNRTo6ZnJhbWVib3JkZXIi
+LCJJRlJBTUU6OmhlaWdodCIsIklGUkFNRTo6bWFyZ2luaGVpZ2h0IiwiSUZSQU1FOjptYXJnaW53aWR0
+aCIsIklGUkFNRTo6d2lkdGgiLCJJTUc6OmFsaWduIiwiSU1HOjphbHQiLCJJTUc6OmJvcmRlciIsIklN
+Rzo6aGVpZ2h0IiwiSU1HOjpoc3BhY2UiLCJJTUc6OmlzbWFwIiwiSU1HOjpuYW1lIiwiSU1HOjp1c2Vt
+YXAiLCJJTUc6OnZzcGFjZSIsIklNRzo6d2lkdGgiLCJJTlBVVDo6YWNjZXB0IiwiSU5QVVQ6OmFjY2Vz
+c2tleSIsIklOUFVUOjphbGlnbiIsIklOUFVUOjphbHQiLCJJTlBVVDo6YXV0b2NvbXBsZXRlIiwiSU5Q
+VVQ6OmF1dG9mb2N1cyIsIklOUFVUOjpjaGVja2VkIiwiSU5QVVQ6OmRpc2FibGVkIiwiSU5QVVQ6Omlu
+cHV0bW9kZSIsIklOUFVUOjppc21hcCIsIklOUFVUOjpsaXN0IiwiSU5QVVQ6Om1heCIsIklOUFVUOjpt
+YXhsZW5ndGgiLCJJTlBVVDo6bWluIiwiSU5QVVQ6Om11bHRpcGxlIiwiSU5QVVQ6Om5hbWUiLCJJTlBV
+VDo6cGxhY2Vob2xkZXIiLCJJTlBVVDo6cmVhZG9ubHkiLCJJTlBVVDo6cmVxdWlyZWQiLCJJTlBVVDo6
+c2l6ZSIsIklOUFVUOjpzdGVwIiwiSU5QVVQ6OnRhYmluZGV4IiwiSU5QVVQ6OnR5cGUiLCJJTlBVVDo6
+dXNlbWFwIiwiSU5QVVQ6OnZhbHVlIiwiSU5TOjpkYXRldGltZSIsIktFWUdFTjo6ZGlzYWJsZWQiLCJL
+RVlHRU46OmtleXR5cGUiLCJLRVlHRU46Om5hbWUiLCJMQUJFTDo6YWNjZXNza2V5IiwiTEFCRUw6OmZv
+ciIsIkxFR0VORDo6YWNjZXNza2V5IiwiTEVHRU5EOjphbGlnbiIsIkxJOjp0eXBlIiwiTEk6OnZhbHVl
+IiwiTElOSzo6c2l6ZXMiLCJNQVA6Om5hbWUiLCJNRU5VOjpjb21wYWN0IiwiTUVOVTo6bGFiZWwiLCJN
+RU5VOjp0eXBlIiwiTUVURVI6OmhpZ2giLCJNRVRFUjo6bG93IiwiTUVURVI6Om1heCIsIk1FVEVSOjpt
+aW4iLCJNRVRFUjo6dmFsdWUiLCJPQkpFQ1Q6OnR5cGVtdXN0bWF0Y2giLCJPTDo6Y29tcGFjdCIsIk9M
+OjpyZXZlcnNlZCIsIk9MOjpzdGFydCIsIk9MOjp0eXBlIiwiT1BUR1JPVVA6OmRpc2FibGVkIiwiT1BU
+R1JPVVA6OmxhYmVsIiwiT1BUSU9OOjpkaXNhYmxlZCIsIk9QVElPTjo6bGFiZWwiLCJPUFRJT046OnNl
+bGVjdGVkIiwiT1BUSU9OOjp2YWx1ZSIsIk9VVFBVVDo6Zm9yIiwiT1VUUFVUOjpuYW1lIiwiUDo6YWxp
+Z24iLCJQUkU6OndpZHRoIiwiUFJPR1JFU1M6Om1heCIsIlBST0dSRVNTOjptaW4iLCJQUk9HUkVTUzo6
+dmFsdWUiLCJTRUxFQ1Q6OmF1dG9jb21wbGV0ZSIsIlNFTEVDVDo6ZGlzYWJsZWQiLCJTRUxFQ1Q6Om11
+bHRpcGxlIiwiU0VMRUNUOjpuYW1lIiwiU0VMRUNUOjpyZXF1aXJlZCIsIlNFTEVDVDo6c2l6ZSIsIlNF
+TEVDVDo6dGFiaW5kZXgiLCJTT1VSQ0U6OnR5cGUiLCJUQUJMRTo6YWxpZ24iLCJUQUJMRTo6Ymdjb2xv
+ciIsIlRBQkxFOjpib3JkZXIiLCJUQUJMRTo6Y2VsbHBhZGRpbmciLCJUQUJMRTo6Y2VsbHNwYWNpbmci
+LCJUQUJMRTo6ZnJhbWUiLCJUQUJMRTo6cnVsZXMiLCJUQUJMRTo6c3VtbWFyeSIsIlRBQkxFOjp3aWR0
+aCIsIlRCT0RZOjphbGlnbiIsIlRCT0RZOjpjaGFyIiwiVEJPRFk6OmNoYXJvZmYiLCJUQk9EWTo6dmFs
+aWduIiwiVEQ6OmFiYnIiLCJURDo6YWxpZ24iLCJURDo6YXhpcyIsIlREOjpiZ2NvbG9yIiwiVEQ6OmNo
+YXIiLCJURDo6Y2hhcm9mZiIsIlREOjpjb2xzcGFuIiwiVEQ6OmhlYWRlcnMiLCJURDo6aGVpZ2h0Iiwi
+VEQ6Om5vd3JhcCIsIlREOjpyb3dzcGFuIiwiVEQ6OnNjb3BlIiwiVEQ6OnZhbGlnbiIsIlREOjp3aWR0
+aCIsIlRFWFRBUkVBOjphY2Nlc3NrZXkiLCJURVhUQVJFQTo6YXV0b2NvbXBsZXRlIiwiVEVYVEFSRUE6
+OmNvbHMiLCJURVhUQVJFQTo6ZGlzYWJsZWQiLCJURVhUQVJFQTo6aW5wdXRtb2RlIiwiVEVYVEFSRUE6
+Om5hbWUiLCJURVhUQVJFQTo6cGxhY2Vob2xkZXIiLCJURVhUQVJFQTo6cmVhZG9ubHkiLCJURVhUQVJF
+QTo6cmVxdWlyZWQiLCJURVhUQVJFQTo6cm93cyIsIlRFWFRBUkVBOjp0YWJpbmRleCIsIlRFWFRBUkVB
+Ojp3cmFwIiwiVEZPT1Q6OmFsaWduIiwiVEZPT1Q6OmNoYXIiLCJURk9PVDo6Y2hhcm9mZiIsIlRGT09U
+Ojp2YWxpZ24iLCJUSDo6YWJiciIsIlRIOjphbGlnbiIsIlRIOjpheGlzIiwiVEg6OmJnY29sb3IiLCJU
+SDo6Y2hhciIsIlRIOjpjaGFyb2ZmIiwiVEg6OmNvbHNwYW4iLCJUSDo6aGVhZGVycyIsIlRIOjpoZWln
+aHQiLCJUSDo6bm93cmFwIiwiVEg6OnJvd3NwYW4iLCJUSDo6c2NvcGUiLCJUSDo6dmFsaWduIiwiVEg6
+OndpZHRoIiwiVEhFQUQ6OmFsaWduIiwiVEhFQUQ6OmNoYXIiLCJUSEVBRDo6Y2hhcm9mZiIsIlRIRUFE
+Ojp2YWxpZ24iLCJUUjo6YWxpZ24iLCJUUjo6Ymdjb2xvciIsIlRSOjpjaGFyIiwiVFI6OmNoYXJvZmYi
+LCJUUjo6dmFsaWduIiwiVFJBQ0s6OmRlZmF1bHQiLCJUUkFDSzo6a2luZCIsIlRSQUNLOjpsYWJlbCIs
+IlRSQUNLOjpzcmNsYW5nIiwiVUw6OmNvbXBhY3QiLCJVTDo6dHlwZSIsIlZJREVPOjpjb250cm9scyIs
+IlZJREVPOjpoZWlnaHQiLCJWSURFTzo6bG9vcCIsIlZJREVPOjptZWRpYWdyb3VwIiwiVklERU86Om11
+dGVkIiwiVklERU86OnByZWxvYWQiLCJWSURFTzo6d2lkdGgiXSksdC5pKQpDLlZDPUguVk0ocyhbMCww
+LDY1NDkwLDQ1MDU1LDY1NTM1LDM0ODE1LDY1NTM0LDE4NDMxXSksdC5WKQpDLm1LPUguVk0ocyhbMCww
+LDI2NjI0LDEwMjMsNjU1MzQsMjA0Nyw2NTUzNCwyMDQ3XSksdC5WKQpDLlNxPUguVk0ocyhbIkhFQUQi
+LCJBUkVBIiwiQkFTRSIsIkJBU0VGT05UIiwiQlIiLCJDT0wiLCJDT0xHUk9VUCIsIkVNQkVEIiwiRlJB
+TUUiLCJGUkFNRVNFVCIsIkhSIiwiSU1BR0UiLCJJTUciLCJJTlBVVCIsIklTSU5ERVgiLCJMSU5LIiwi
+TUVUQSIsIlBBUkFNIiwiU09VUkNFIiwiU1RZTEUiLCJUSVRMRSIsIldCUiJdKSx0LmkpCkMuaFU9SC5W
+TShzKFtdKSx0LngpCkMuZG49SC5WTShzKFtdKSxILk4wKCJqZDxMTCo+IikpCkMueEQ9SC5WTShzKFtd
+KSx0LmkpCkMudG89SC5WTShzKFswLDAsMzI3MjIsMTIyODcsNjU1MzQsMzQ4MTUsNjU1MzQsMTg0MzFd
+KSx0LlYpCkMucms9SC5WTShzKFtDLkFkLEMubmUsQy5teSxDLnJ4LEMud1YsQy5mUl0pLEguTjAoImpk
+PEg3Kj4iKSkKQy5GMz1ILlZNKHMoWzAsMCwyNDU3NiwxMDIzLDY1NTM0LDM0ODE1LDY1NTM0LDE4NDMx
+XSksdC5WKQpDLmVhPUguVk0ocyhbMCwwLDMyNzU0LDExMjYzLDY1NTM0LDM0ODE1LDY1NTM0LDE4NDMx
+XSksdC5WKQpDLlpKPUguVk0ocyhbMCwwLDMyNzIyLDEyMjg3LDY1NTM1LDM0ODE1LDY1NTM0LDE4NDMx
+XSksdC5WKQpDLldkPUguVk0ocyhbMCwwLDY1NDkwLDEyMjg3LDY1NTM1LDM0ODE1LDY1NTM0LDE4NDMx
+XSksdC5WKQpDLlF4PUguVk0ocyhbImJpbmQiLCJpZiIsInJlZiIsInJlcGVhdCIsInN5bnRheCJdKSx0
+LmkpCkMuQkk9SC5WTShzKFsiQTo6aHJlZiIsIkFSRUE6OmhyZWYiLCJCTE9DS1FVT1RFOjpjaXRlIiwi
+Qk9EWTo6YmFja2dyb3VuZCIsIkNPTU1BTkQ6Omljb24iLCJERUw6OmNpdGUiLCJGT1JNOjphY3Rpb24i
+LCJJTUc6OnNyYyIsIklOUFVUOjpzcmMiLCJJTlM6OmNpdGUiLCJROjpjaXRlIiwiVklERU86OnBvc3Rl
+ciJdKSx0LmkpCkMuRHg9bmV3IEguTFAoMCx7fSxDLnhELEguTjAoIkxQPHFVKix6TTxqOCo+Kj4iKSkK
+Qy5DTT1uZXcgSC5MUCgwLHt9LEMueEQsSC5OMCgiTFA8cVUqLHFVKj4iKSkKQy5pSD1ILlZNKHMoW10p
+LEguTjAoImpkPEdEKj4iKSkKQy5XTz1uZXcgSC5MUCgwLHt9LEMuaUgsSC5OMCgiTFA8R0QqLEA+Iikp
+CkMuWTI9bmV3IEwuTzkoIk5hdmlnYXRpb25UcmVlTm9kZVR5cGUuZGlyZWN0b3J5IikKQy5yZj1uZXcg
+TC5POSgiTmF2aWdhdGlvblRyZWVOb2RlVHlwZS5maWxlIikKQy5UZT1uZXcgSC53digiY2FsbCIpCkMu
+b0U9bmV3IFAuR1koITEpCkMud1E9bmV3IFAuRnkobnVsbCwyKX0pKCk7KGZ1bmN0aW9uIHN0YXRpY0Zp
+ZWxkcygpeyQuem09bnVsbAokLnlqPTAKJC5tSj1udWxsCiQuUDQ9bnVsbAokLk5GPW51bGwKJC5UWD1u
+dWxsCiQueDc9bnVsbAokLm53PW51bGwKJC52dj1udWxsCiQuQnY9bnVsbAokLlM2PW51bGwKJC5rOD1u
+dWxsCiQubWc9bnVsbAokLlVEPSExCiQuWDM9Qy5OVQokLnhnPUguVk0oW10sSC5OMCgiamQ8TWg+Iikp
+CiQueG89bnVsbAokLkJPPW51bGwKJC5sdD1udWxsCiQuRVU9bnVsbAokLm9yPVAuRmwodC5OLHQuWSkK
+JC5JNj1udWxsCiQuRmY9bnVsbH0pKCk7KGZ1bmN0aW9uIGxhenlJbml0aWFsaXplcnMoKXt2YXIgcz1o
+dW5rSGVscGVycy5sYXp5RmluYWwscj1odW5rSGVscGVycy5sYXp5T2xkCnMoJCwiZmEiLCJ3IixmdW5j
+dGlvbigpe3JldHVybiBILllnKCJfJGRhcnRfZGFydENsb3N1cmUiKX0pCnMoJCwiVTIiLCJTbiIsZnVu
+Y3Rpb24oKXtyZXR1cm4gSC5jTShILlM3KHsKdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4iJHJlY2Vp
+dmVyJCJ9fSkpfSkKcygkLCJ4cSIsImxxIixmdW5jdGlvbigpe3JldHVybiBILmNNKEguUzcoeyRtZXRo
+b2QkOm51bGwsCnRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIiRyZWNlaXZlciQifX0pKX0pCnMoJCwi
+UjEiLCJOOSIsZnVuY3Rpb24oKXtyZXR1cm4gSC5jTShILlM3KG51bGwpKX0pCnMoJCwiZk4iLCJpSSIs
 ZnVuY3Rpb24oKXtyZXR1cm4gSC5jTShmdW5jdGlvbigpe3ZhciAkYXJndW1lbnRzRXhwciQ9JyRhcmd1
-bWVudHMkJwp0cnl7KHZvaWQgMCkuJG1ldGhvZCQoJGFyZ3VtZW50c0V4cHIkKX1jYXRjaChxKXtyZXR1
-cm4gcS5tZXNzYWdlfX0oKSl9KQpzKCQsImtxIiwick4iLGZ1bmN0aW9uKCl7cmV0dXJuIEguY00oSC5N
-aihudWxsKSl9KQpzKCQsInR0IiwiYzMiLGZ1bmN0aW9uKCl7cmV0dXJuIEguY00oZnVuY3Rpb24oKXt0
-cnl7bnVsbC4kbWV0aG9kJH1jYXRjaChxKXtyZXR1cm4gcS5tZXNzYWdlfX0oKSl9KQpzKCQsImR0Iiwi
-SEsiLGZ1bmN0aW9uKCl7cmV0dXJuIEguY00oSC5Naih2b2lkIDApKX0pCnMoJCwiQTciLCJyMSIsZnVu
-Y3Rpb24oKXtyZXR1cm4gSC5jTShmdW5jdGlvbigpe3RyeXsodm9pZCAwKS4kbWV0aG9kJH1jYXRjaChx
-KXtyZXR1cm4gcS5tZXNzYWdlfX0oKSl9KQpzKCQsIldjIiwidXQiLGZ1bmN0aW9uKCl7cmV0dXJuIFAu
-T2ooKX0pCnMoJCwia2giLCJyZiIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFAucGcoKS4kMCgpfSkKcygk
-LCJhWCIsIkhHIixmdW5jdGlvbigpe3JldHVybiBuZXcgUC5jMigpLiQwKCl9KQpzKCQsImJ0IiwiVjci
-LGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBJbnQ4QXJyYXkoSC5YRihILlZNKFstMiwtMiwtMiwtMiwtMiwt
-MiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwt
-MiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMSwtMiwtMiwtMiwtMiwtMiw2MiwtMiw2
-MiwtMiw2Myw1Miw1Myw1NCw1NSw1Niw1Nyw1OCw1OSw2MCw2MSwtMiwtMiwtMiwtMSwtMiwtMiwtMiww
-LDEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0LDE1LDE2LDE3LDE4LDE5LDIwLDIxLDIyLDIz
-LDI0LDI1LC0yLC0yLC0yLC0yLDYzLC0yLDI2LDI3LDI4LDI5LDMwLDMxLDMyLDMzLDM0LDM1LDM2LDM3
-LDM4LDM5LDQwLDQxLDQyLDQzLDQ0LDQ1LDQ2LDQ3LDQ4LDQ5LDUwLDUxLC0yLC0yLC0yLC0yLC0yXSx0
-LmEpKSl9KQpzKCQsIk01Iiwid1EiLGZ1bmN0aW9uKCl7cmV0dXJuIHR5cGVvZiBwcm9jZXNzIT0idW5k
-ZWZpbmVkIiYmT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHByb2Nlc3MpPT0iW29iamVjdCBw
-cm9jZXNzXSImJnByb2Nlc3MucGxhdGZvcm09PSJ3aW4zMiJ9KQpzKCQsIm1mIiwiejQiLGZ1bmN0aW9u
-KCl7cmV0dXJuIFAubnUoIl5bXFwtXFwuMC05QS1aX2Eten5dKiQiKX0pCnMoJCwiT1EiLCJ2WiIsZnVu
-Y3Rpb24oKXtyZXR1cm4gUC5LTigpfSkKcygkLCJTQyIsIkFOIixmdW5jdGlvbigpe3JldHVybiBQLnRN
-KFsiQSIsIkFCQlIiLCJBQ1JPTllNIiwiQUREUkVTUyIsIkFSRUEiLCJBUlRJQ0xFIiwiQVNJREUiLCJB
-VURJTyIsIkIiLCJCREkiLCJCRE8iLCJCSUciLCJCTE9DS1FVT1RFIiwiQlIiLCJCVVRUT04iLCJDQU5W
-QVMiLCJDQVBUSU9OIiwiQ0VOVEVSIiwiQ0lURSIsIkNPREUiLCJDT0wiLCJDT0xHUk9VUCIsIkNPTU1B
-TkQiLCJEQVRBIiwiREFUQUxJU1QiLCJERCIsIkRFTCIsIkRFVEFJTFMiLCJERk4iLCJESVIiLCJESVYi
-LCJETCIsIkRUIiwiRU0iLCJGSUVMRFNFVCIsIkZJR0NBUFRJT04iLCJGSUdVUkUiLCJGT05UIiwiRk9P
-VEVSIiwiRk9STSIsIkgxIiwiSDIiLCJIMyIsIkg0IiwiSDUiLCJINiIsIkhFQURFUiIsIkhHUk9VUCIs
-IkhSIiwiSSIsIklGUkFNRSIsIklNRyIsIklOUFVUIiwiSU5TIiwiS0JEIiwiTEFCRUwiLCJMRUdFTkQi
-LCJMSSIsIk1BUCIsIk1BUksiLCJNRU5VIiwiTUVURVIiLCJOQVYiLCJOT0JSIiwiT0wiLCJPUFRHUk9V
-UCIsIk9QVElPTiIsIk9VVFBVVCIsIlAiLCJQUkUiLCJQUk9HUkVTUyIsIlEiLCJTIiwiU0FNUCIsIlNF
-Q1RJT04iLCJTRUxFQ1QiLCJTTUFMTCIsIlNPVVJDRSIsIlNQQU4iLCJTVFJJS0UiLCJTVFJPTkciLCJT
-VUIiLCJTVU1NQVJZIiwiU1VQIiwiVEFCTEUiLCJUQk9EWSIsIlREIiwiVEVYVEFSRUEiLCJURk9PVCIs
-IlRIIiwiVEhFQUQiLCJUSU1FIiwiVFIiLCJUUkFDSyIsIlRUIiwiVSIsIlVMIiwiVkFSIiwiVklERU8i
-LCJXQlIiXSx0Lk4pfSkKcygkLCJYNCIsImhHIixmdW5jdGlvbigpe3JldHVybiBQLm51KCJeXFxTKyQi
-KX0pCnMoJCwid08iLCJvdyIsZnVuY3Rpb24oKXtyZXR1cm4gUC5ORChzZWxmKX0pCnMoJCwia3QiLCJS
-OCIsZnVuY3Rpb24oKXtyZXR1cm4gSC5ZZygiXyRkYXJ0X2RhcnRPYmplY3QiKX0pCnMoJCwiZksiLCJr
-SSIsZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24gRGFydE9iamVjdChhKXt0aGlzLm89YX19KQpyKCQs
-InF0IiwiekIiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBULm1RKCl9KQpyKCQsIk9sIiwiVUUiLGZ1bmN0
-aW9uKCl7cmV0dXJuIFAuaEsoQy5vbC5nbVcoVy54MygpKS5ocmVmKS5naFkoKS5xKDAsImF1dGhUb2tl
-biIpfSkKcigkLCJoVCIsInlQIixmdW5jdGlvbigpe3JldHVybiBXLlpyKCkucXVlcnlTZWxlY3Rvcigi
-LmVkaXQtbGlzdCAucGFuZWwtY29udGVudCIpfSkKcigkLCJXNiIsImhMIixmdW5jdGlvbigpe3JldHVy
-biBXLlpyKCkucXVlcnlTZWxlY3RvcigiLmVkaXQtcGFuZWwgLnBhbmVsLWNvbnRlbnQiKX0pCnIoJCwi
-VFIiLCJEVyIsZnVuY3Rpb24oKXtyZXR1cm4gVy5acigpLnF1ZXJ5U2VsZWN0b3IoImZvb3RlciIpfSkK
-cigkLCJFWSIsImZpIixmdW5jdGlvbigpe3JldHVybiBXLlpyKCkucXVlcnlTZWxlY3RvcigiaGVhZGVy
-Iil9KQpyKCQsImF2IiwiRDkiLGZ1bmN0aW9uKCl7cmV0dXJuIFcuWnIoKS5xdWVyeVNlbGVjdG9yKCIj
-dW5pdC1uYW1lIil9KQpyKCQsImZlIiwiS0ciLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBMLlhBKCl9KQpz
-KCQsImVvIiwiblUiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBNLmxJKCQuSGsoKSl9KQpzKCQsInlyIiwi
-YkQiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBFLk9GKFAubnUoIi8iKSxQLm51KCJbXi9dJCIpLFAubnUo
-Il4vIikpfSkKcygkLCJNayIsIktrIixmdW5jdGlvbigpe3JldHVybiBuZXcgTC5JVihQLm51KCJbL1xc
-XFxdIiksUC5udSgiW14vXFxcXF0kIiksUC5udSgiXihcXFxcXFxcXFteXFxcXF0rXFxcXFteXFxcXC9d
-K3xbYS16QS1aXTpbL1xcXFxdKSIpLFAubnUoIl5bL1xcXFxdKD8hWy9cXFxcXSkiKSl9KQpzKCQsImFr
-IiwiRWIiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBGLnJ1KFAubnUoIi8iKSxQLm51KCIoXlthLXpBLVpd
-Wy0rLmEtekEtWlxcZF0qOi8vfFteL10pJCIpLFAubnUoIlthLXpBLVpdWy0rLmEtekEtWlxcZF0qOi8v
-W14vXSoiKSxQLm51KCJeLyIpKX0pCnMoJCwibHMiLCJIayIsZnVuY3Rpb24oKXtyZXR1cm4gTy5SaCgp
-fSl9KSgpOyhmdW5jdGlvbiBuYXRpdmVTdXBwb3J0KCl7IWZ1bmN0aW9uKCl7dmFyIHM9ZnVuY3Rpb24o
-YSl7dmFyIG09e30KbVthXT0xCnJldHVybiBPYmplY3Qua2V5cyhodW5rSGVscGVycy5jb252ZXJ0VG9G
-YXN0T2JqZWN0KG0pKVswXX0Kdi5nZXRJc29sYXRlVGFnPWZ1bmN0aW9uKGEpe3JldHVybiBzKCJfX19k
-YXJ0XyIrYSt2Lmlzb2xhdGVUYWcpfQp2YXIgcj0iX19fZGFydF9pc29sYXRlX3RhZ3NfIgp2YXIgcT1P
-YmplY3Rbcl18fChPYmplY3Rbcl09T2JqZWN0LmNyZWF0ZShudWxsKSkKdmFyIHA9Il9aeFl4WCIKZm9y
-KHZhciBvPTA7O28rKyl7dmFyIG49cyhwKyJfIitvKyJfIikKaWYoIShuIGluIHEpKXtxW25dPTEKdi5p
-c29sYXRlVGFnPW4KYnJlYWt9fXYuZGlzcGF0Y2hQcm9wZXJ0eU5hbWU9di5nZXRJc29sYXRlVGFnKCJk
-aXNwYXRjaF9yZWNvcmQiKX0oKQpodW5rSGVscGVycy5zZXRPclVwZGF0ZUludGVyY2VwdG9yc0J5VGFn
-KHtET01FcnJvcjpKLnZCLE1lZGlhRXJyb3I6Si52QixOYXZpZ2F0b3I6Si52QixOYXZpZ2F0b3JDb25j
-dXJyZW50SGFyZHdhcmU6Si52QixOYXZpZ2F0b3JVc2VyTWVkaWFFcnJvcjpKLnZCLE92ZXJjb25zdHJh
-aW5lZEVycm9yOkoudkIsUG9zaXRpb25FcnJvcjpKLnZCLFJhbmdlOkoudkIsU1FMRXJyb3I6Si52QixE
-YXRhVmlldzpILkVULEFycmF5QnVmZmVyVmlldzpILkVULEZsb2F0MzJBcnJheTpILkRnLEZsb2F0NjRB
-cnJheTpILkRnLEludDE2QXJyYXk6SC54aixJbnQzMkFycmF5OkguZEUsSW50OEFycmF5OkguWkEsVWlu
-dDE2QXJyYXk6SC5kVCxVaW50MzJBcnJheTpILlBxLFVpbnQ4Q2xhbXBlZEFycmF5OkguZUUsQ2FudmFz
-UGl4ZWxBcnJheTpILmVFLFVpbnQ4QXJyYXk6SC5WNixIVE1MQXVkaW9FbGVtZW50OlcucUUsSFRNTEJS
-RWxlbWVudDpXLnFFLEhUTUxCdXR0b25FbGVtZW50OlcucUUsSFRNTENhbnZhc0VsZW1lbnQ6Vy5xRSxI
-VE1MQ29udGVudEVsZW1lbnQ6Vy5xRSxIVE1MRExpc3RFbGVtZW50OlcucUUsSFRNTERhdGFFbGVtZW50
-OlcucUUsSFRNTERhdGFMaXN0RWxlbWVudDpXLnFFLEhUTUxEZXRhaWxzRWxlbWVudDpXLnFFLEhUTUxE
-aWFsb2dFbGVtZW50OlcucUUsSFRNTERpdkVsZW1lbnQ6Vy5xRSxIVE1MRW1iZWRFbGVtZW50OlcucUUs
-SFRNTEZpZWxkU2V0RWxlbWVudDpXLnFFLEhUTUxIUkVsZW1lbnQ6Vy5xRSxIVE1MSGVhZEVsZW1lbnQ6
-Vy5xRSxIVE1MSGVhZGluZ0VsZW1lbnQ6Vy5xRSxIVE1MSHRtbEVsZW1lbnQ6Vy5xRSxIVE1MSUZyYW1l
-RWxlbWVudDpXLnFFLEhUTUxJbWFnZUVsZW1lbnQ6Vy5xRSxIVE1MSW5wdXRFbGVtZW50OlcucUUsSFRN
-TExJRWxlbWVudDpXLnFFLEhUTUxMYWJlbEVsZW1lbnQ6Vy5xRSxIVE1MTGVnZW5kRWxlbWVudDpXLnFF
-LEhUTUxMaW5rRWxlbWVudDpXLnFFLEhUTUxNYXBFbGVtZW50OlcucUUsSFRNTE1lZGlhRWxlbWVudDpX
-LnFFLEhUTUxNZW51RWxlbWVudDpXLnFFLEhUTUxNZXRhRWxlbWVudDpXLnFFLEhUTUxNZXRlckVsZW1l
-bnQ6Vy5xRSxIVE1MTW9kRWxlbWVudDpXLnFFLEhUTUxPTGlzdEVsZW1lbnQ6Vy5xRSxIVE1MT2JqZWN0
-RWxlbWVudDpXLnFFLEhUTUxPcHRHcm91cEVsZW1lbnQ6Vy5xRSxIVE1MT3B0aW9uRWxlbWVudDpXLnFF
-LEhUTUxPdXRwdXRFbGVtZW50OlcucUUsSFRNTFBhcmFtRWxlbWVudDpXLnFFLEhUTUxQaWN0dXJlRWxl
-bWVudDpXLnFFLEhUTUxQcmVFbGVtZW50OlcucUUsSFRNTFByb2dyZXNzRWxlbWVudDpXLnFFLEhUTUxR
-dW90ZUVsZW1lbnQ6Vy5xRSxIVE1MU2NyaXB0RWxlbWVudDpXLnFFLEhUTUxTaGFkb3dFbGVtZW50Olcu
-cUUsSFRNTFNsb3RFbGVtZW50OlcucUUsSFRNTFNvdXJjZUVsZW1lbnQ6Vy5xRSxIVE1MU3BhbkVsZW1l
-bnQ6Vy5xRSxIVE1MU3R5bGVFbGVtZW50OlcucUUsSFRNTFRhYmxlQ2FwdGlvbkVsZW1lbnQ6Vy5xRSxI
-VE1MVGFibGVDZWxsRWxlbWVudDpXLnFFLEhUTUxUYWJsZURhdGFDZWxsRWxlbWVudDpXLnFFLEhUTUxU
-YWJsZUhlYWRlckNlbGxFbGVtZW50OlcucUUsSFRNTFRhYmxlQ29sRWxlbWVudDpXLnFFLEhUTUxUZXh0
-QXJlYUVsZW1lbnQ6Vy5xRSxIVE1MVGltZUVsZW1lbnQ6Vy5xRSxIVE1MVGl0bGVFbGVtZW50OlcucUUs
-SFRNTFRyYWNrRWxlbWVudDpXLnFFLEhUTUxVTGlzdEVsZW1lbnQ6Vy5xRSxIVE1MVW5rbm93bkVsZW1l
-bnQ6Vy5xRSxIVE1MVmlkZW9FbGVtZW50OlcucUUsSFRNTERpcmVjdG9yeUVsZW1lbnQ6Vy5xRSxIVE1M
-Rm9udEVsZW1lbnQ6Vy5xRSxIVE1MRnJhbWVFbGVtZW50OlcucUUsSFRNTEZyYW1lU2V0RWxlbWVudDpX
-LnFFLEhUTUxNYXJxdWVlRWxlbWVudDpXLnFFLEhUTUxFbGVtZW50OlcucUUsSFRNTEFuY2hvckVsZW1l
-bnQ6Vy5HaCxIVE1MQXJlYUVsZW1lbnQ6Vy5mWSxIVE1MQmFzZUVsZW1lbnQ6Vy5uQixCbG9iOlcuQXos
-SFRNTEJvZHlFbGVtZW50OlcuUVAsQ0RBVEFTZWN0aW9uOlcubngsQ2hhcmFjdGVyRGF0YTpXLm54LENv
-bW1lbnQ6Vy5ueCxQcm9jZXNzaW5nSW5zdHJ1Y3Rpb246Vy5ueCxUZXh0OlcubngsQ1NTU3R5bGVEZWNs
-YXJhdGlvbjpXLm9KLE1TU3R5bGVDU1NQcm9wZXJ0aWVzOlcub0osQ1NTMlByb3BlcnRpZXM6Vy5vSixY
-TUxEb2N1bWVudDpXLlFGLERvY3VtZW50OlcuUUYsRE9NRXhjZXB0aW9uOlcuTmgsRE9NSW1wbGVtZW50
-YXRpb246Vy5hZSxET01SZWN0UmVhZE9ubHk6Vy5JQixET01Ub2tlbkxpc3Q6Vy5uNyxFbGVtZW50Olcu
-Y3YsQWJvcnRQYXltZW50RXZlbnQ6Vy5lYSxBbmltYXRpb25FdmVudDpXLmVhLEFuaW1hdGlvblBsYXli
-YWNrRXZlbnQ6Vy5lYSxBcHBsaWNhdGlvbkNhY2hlRXJyb3JFdmVudDpXLmVhLEJhY2tncm91bmRGZXRj
-aENsaWNrRXZlbnQ6Vy5lYSxCYWNrZ3JvdW5kRmV0Y2hFdmVudDpXLmVhLEJhY2tncm91bmRGZXRjaEZh
-aWxFdmVudDpXLmVhLEJhY2tncm91bmRGZXRjaGVkRXZlbnQ6Vy5lYSxCZWZvcmVJbnN0YWxsUHJvbXB0
-RXZlbnQ6Vy5lYSxCZWZvcmVVbmxvYWRFdmVudDpXLmVhLEJsb2JFdmVudDpXLmVhLENhbk1ha2VQYXlt
-ZW50RXZlbnQ6Vy5lYSxDbGlwYm9hcmRFdmVudDpXLmVhLENsb3NlRXZlbnQ6Vy5lYSxDdXN0b21FdmVu
-dDpXLmVhLERldmljZU1vdGlvbkV2ZW50OlcuZWEsRGV2aWNlT3JpZW50YXRpb25FdmVudDpXLmVhLEVy
-cm9yRXZlbnQ6Vy5lYSxFeHRlbmRhYmxlRXZlbnQ6Vy5lYSxFeHRlbmRhYmxlTWVzc2FnZUV2ZW50Olcu
-ZWEsRmV0Y2hFdmVudDpXLmVhLEZvbnRGYWNlU2V0TG9hZEV2ZW50OlcuZWEsRm9yZWlnbkZldGNoRXZl
-bnQ6Vy5lYSxHYW1lcGFkRXZlbnQ6Vy5lYSxIYXNoQ2hhbmdlRXZlbnQ6Vy5lYSxJbnN0YWxsRXZlbnQ6
-Vy5lYSxNZWRpYUVuY3J5cHRlZEV2ZW50OlcuZWEsTWVkaWFLZXlNZXNzYWdlRXZlbnQ6Vy5lYSxNZWRp
-YVF1ZXJ5TGlzdEV2ZW50OlcuZWEsTWVkaWFTdHJlYW1FdmVudDpXLmVhLE1lZGlhU3RyZWFtVHJhY2tF
-dmVudDpXLmVhLE1lc3NhZ2VFdmVudDpXLmVhLE1JRElDb25uZWN0aW9uRXZlbnQ6Vy5lYSxNSURJTWVz
-c2FnZUV2ZW50OlcuZWEsTXV0YXRpb25FdmVudDpXLmVhLE5vdGlmaWNhdGlvbkV2ZW50OlcuZWEsUGFn
-ZVRyYW5zaXRpb25FdmVudDpXLmVhLFBheW1lbnRSZXF1ZXN0RXZlbnQ6Vy5lYSxQYXltZW50UmVxdWVz
-dFVwZGF0ZUV2ZW50OlcuZWEsUG9wU3RhdGVFdmVudDpXLmVhLFByZXNlbnRhdGlvbkNvbm5lY3Rpb25B
-dmFpbGFibGVFdmVudDpXLmVhLFByZXNlbnRhdGlvbkNvbm5lY3Rpb25DbG9zZUV2ZW50OlcuZWEsUHJv
-bWlzZVJlamVjdGlvbkV2ZW50OlcuZWEsUHVzaEV2ZW50OlcuZWEsUlRDRGF0YUNoYW5uZWxFdmVudDpX
-LmVhLFJUQ0RUTUZUb25lQ2hhbmdlRXZlbnQ6Vy5lYSxSVENQZWVyQ29ubmVjdGlvbkljZUV2ZW50Olcu
-ZWEsUlRDVHJhY2tFdmVudDpXLmVhLFNlY3VyaXR5UG9saWN5VmlvbGF0aW9uRXZlbnQ6Vy5lYSxTZW5z
-b3JFcnJvckV2ZW50OlcuZWEsU3BlZWNoUmVjb2duaXRpb25FcnJvcjpXLmVhLFNwZWVjaFJlY29nbml0
-aW9uRXZlbnQ6Vy5lYSxTcGVlY2hTeW50aGVzaXNFdmVudDpXLmVhLFN0b3JhZ2VFdmVudDpXLmVhLFN5
-bmNFdmVudDpXLmVhLFRyYWNrRXZlbnQ6Vy5lYSxUcmFuc2l0aW9uRXZlbnQ6Vy5lYSxXZWJLaXRUcmFu
-c2l0aW9uRXZlbnQ6Vy5lYSxWUkRldmljZUV2ZW50OlcuZWEsVlJEaXNwbGF5RXZlbnQ6Vy5lYSxWUlNl
-c3Npb25FdmVudDpXLmVhLE1vam9JbnRlcmZhY2VSZXF1ZXN0RXZlbnQ6Vy5lYSxVU0JDb25uZWN0aW9u
-RXZlbnQ6Vy5lYSxJREJWZXJzaW9uQ2hhbmdlRXZlbnQ6Vy5lYSxBdWRpb1Byb2Nlc3NpbmdFdmVudDpX
-LmVhLE9mZmxpbmVBdWRpb0NvbXBsZXRpb25FdmVudDpXLmVhLFdlYkdMQ29udGV4dEV2ZW50OlcuZWEs
-RXZlbnQ6Vy5lYSxJbnB1dEV2ZW50OlcuZWEsU3VibWl0RXZlbnQ6Vy5lYSxFdmVudFRhcmdldDpXLkQw
-LEZpbGU6Vy5oSCxIVE1MRm9ybUVsZW1lbnQ6Vy5oNCxIaXN0b3J5OlcuYnIsSFRNTERvY3VtZW50Olcu
-VmIsWE1MSHR0cFJlcXVlc3Q6Vy5mSixYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0Olcud2EsSW1hZ2VE
-YXRhOlcuU2csTG9jYXRpb246Vy51OCxNb3VzZUV2ZW50OlcuQWosRHJhZ0V2ZW50OlcuQWosUG9pbnRl
-ckV2ZW50OlcuQWosV2hlZWxFdmVudDpXLkFqLERvY3VtZW50RnJhZ21lbnQ6Vy51SCxTaGFkb3dSb290
-OlcudUgsRG9jdW1lbnRUeXBlOlcudUgsTm9kZTpXLnVILE5vZGVMaXN0OlcuQkgsUmFkaW9Ob2RlTGlz
-dDpXLkJILEhUTUxQYXJhZ3JhcGhFbGVtZW50OlcuU04sUHJvZ3Jlc3NFdmVudDpXLmV3LFJlc291cmNl
-UHJvZ3Jlc3NFdmVudDpXLmV3LEhUTUxTZWxlY3RFbGVtZW50OlcubHAsSFRNTFRhYmxlRWxlbWVudDpX
-LlRiLEhUTUxUYWJsZVJvd0VsZW1lbnQ6Vy5JdixIVE1MVGFibGVTZWN0aW9uRWxlbWVudDpXLldQLEhU
-TUxUZW1wbGF0ZUVsZW1lbnQ6Vy55WSxDb21wb3NpdGlvbkV2ZW50OlcudzYsRm9jdXNFdmVudDpXLnc2
-LEtleWJvYXJkRXZlbnQ6Vy53NixUZXh0RXZlbnQ6Vy53NixUb3VjaEV2ZW50OlcudzYsVUlFdmVudDpX
-Lnc2LFdpbmRvdzpXLks1LERPTVdpbmRvdzpXLks1LERlZGljYXRlZFdvcmtlckdsb2JhbFNjb3BlOlcu
-Q20sU2VydmljZVdvcmtlckdsb2JhbFNjb3BlOlcuQ20sU2hhcmVkV29ya2VyR2xvYmFsU2NvcGU6Vy5D
-bSxXb3JrZXJHbG9iYWxTY29wZTpXLkNtLEF0dHI6Vy5DUSxDbGllbnRSZWN0OlcudzQsRE9NUmVjdDpX
-Lnc0LE5hbWVkTm9kZU1hcDpXLnJoLE1vek5hbWVkQXR0ck1hcDpXLnJoLElEQktleVJhbmdlOlAuaEYs
-U1ZHU2NyaXB0RWxlbWVudDpQLm5kLFNWR0FFbGVtZW50OlAuaGksU1ZHQW5pbWF0ZUVsZW1lbnQ6UC5o
-aSxTVkdBbmltYXRlTW90aW9uRWxlbWVudDpQLmhpLFNWR0FuaW1hdGVUcmFuc2Zvcm1FbGVtZW50OlAu
-aGksU1ZHQW5pbWF0aW9uRWxlbWVudDpQLmhpLFNWR0NpcmNsZUVsZW1lbnQ6UC5oaSxTVkdDbGlwUGF0
-aEVsZW1lbnQ6UC5oaSxTVkdEZWZzRWxlbWVudDpQLmhpLFNWR0Rlc2NFbGVtZW50OlAuaGksU1ZHRGlz
-Y2FyZEVsZW1lbnQ6UC5oaSxTVkdFbGxpcHNlRWxlbWVudDpQLmhpLFNWR0ZFQmxlbmRFbGVtZW50OlAu
-aGksU1ZHRkVDb2xvck1hdHJpeEVsZW1lbnQ6UC5oaSxTVkdGRUNvbXBvbmVudFRyYW5zZmVyRWxlbWVu
-dDpQLmhpLFNWR0ZFQ29tcG9zaXRlRWxlbWVudDpQLmhpLFNWR0ZFQ29udm9sdmVNYXRyaXhFbGVtZW50
-OlAuaGksU1ZHRkVEaWZmdXNlTGlnaHRpbmdFbGVtZW50OlAuaGksU1ZHRkVEaXNwbGFjZW1lbnRNYXBF
-bGVtZW50OlAuaGksU1ZHRkVEaXN0YW50TGlnaHRFbGVtZW50OlAuaGksU1ZHRkVGbG9vZEVsZW1lbnQ6
-UC5oaSxTVkdGRUZ1bmNBRWxlbWVudDpQLmhpLFNWR0ZFRnVuY0JFbGVtZW50OlAuaGksU1ZHRkVGdW5j
-R0VsZW1lbnQ6UC5oaSxTVkdGRUZ1bmNSRWxlbWVudDpQLmhpLFNWR0ZFR2F1c3NpYW5CbHVyRWxlbWVu
-dDpQLmhpLFNWR0ZFSW1hZ2VFbGVtZW50OlAuaGksU1ZHRkVNZXJnZUVsZW1lbnQ6UC5oaSxTVkdGRU1l
-cmdlTm9kZUVsZW1lbnQ6UC5oaSxTVkdGRU1vcnBob2xvZ3lFbGVtZW50OlAuaGksU1ZHRkVPZmZzZXRF
-bGVtZW50OlAuaGksU1ZHRkVQb2ludExpZ2h0RWxlbWVudDpQLmhpLFNWR0ZFU3BlY3VsYXJMaWdodGlu
-Z0VsZW1lbnQ6UC5oaSxTVkdGRVNwb3RMaWdodEVsZW1lbnQ6UC5oaSxTVkdGRVRpbGVFbGVtZW50OlAu
-aGksU1ZHRkVUdXJidWxlbmNlRWxlbWVudDpQLmhpLFNWR0ZpbHRlckVsZW1lbnQ6UC5oaSxTVkdGb3Jl
-aWduT2JqZWN0RWxlbWVudDpQLmhpLFNWR0dFbGVtZW50OlAuaGksU1ZHR2VvbWV0cnlFbGVtZW50OlAu
-aGksU1ZHR3JhcGhpY3NFbGVtZW50OlAuaGksU1ZHSW1hZ2VFbGVtZW50OlAuaGksU1ZHTGluZUVsZW1l
-bnQ6UC5oaSxTVkdMaW5lYXJHcmFkaWVudEVsZW1lbnQ6UC5oaSxTVkdNYXJrZXJFbGVtZW50OlAuaGks
-U1ZHTWFza0VsZW1lbnQ6UC5oaSxTVkdNZXRhZGF0YUVsZW1lbnQ6UC5oaSxTVkdQYXRoRWxlbWVudDpQ
-LmhpLFNWR1BhdHRlcm5FbGVtZW50OlAuaGksU1ZHUG9seWdvbkVsZW1lbnQ6UC5oaSxTVkdQb2x5bGlu
-ZUVsZW1lbnQ6UC5oaSxTVkdSYWRpYWxHcmFkaWVudEVsZW1lbnQ6UC5oaSxTVkdSZWN0RWxlbWVudDpQ
-LmhpLFNWR1NldEVsZW1lbnQ6UC5oaSxTVkdTdG9wRWxlbWVudDpQLmhpLFNWR1N0eWxlRWxlbWVudDpQ
-LmhpLFNWR1NWR0VsZW1lbnQ6UC5oaSxTVkdTd2l0Y2hFbGVtZW50OlAuaGksU1ZHU3ltYm9sRWxlbWVu
-dDpQLmhpLFNWR1RTcGFuRWxlbWVudDpQLmhpLFNWR1RleHRDb250ZW50RWxlbWVudDpQLmhpLFNWR1Rl
-eHRFbGVtZW50OlAuaGksU1ZHVGV4dFBhdGhFbGVtZW50OlAuaGksU1ZHVGV4dFBvc2l0aW9uaW5nRWxl
-bWVudDpQLmhpLFNWR1RpdGxlRWxlbWVudDpQLmhpLFNWR1VzZUVsZW1lbnQ6UC5oaSxTVkdWaWV3RWxl
-bWVudDpQLmhpLFNWR0dyYWRpZW50RWxlbWVudDpQLmhpLFNWR0NvbXBvbmVudFRyYW5zZmVyRnVuY3Rp
-b25FbGVtZW50OlAuaGksU1ZHRkVEcm9wU2hhZG93RWxlbWVudDpQLmhpLFNWR01QYXRoRWxlbWVudDpQ
-LmhpLFNWR0VsZW1lbnQ6UC5oaX0pCmh1bmtIZWxwZXJzLnNldE9yVXBkYXRlTGVhZlRhZ3Moe0RPTUVy
-cm9yOnRydWUsTWVkaWFFcnJvcjp0cnVlLE5hdmlnYXRvcjp0cnVlLE5hdmlnYXRvckNvbmN1cnJlbnRI
-YXJkd2FyZTp0cnVlLE5hdmlnYXRvclVzZXJNZWRpYUVycm9yOnRydWUsT3ZlcmNvbnN0cmFpbmVkRXJy
-b3I6dHJ1ZSxQb3NpdGlvbkVycm9yOnRydWUsUmFuZ2U6dHJ1ZSxTUUxFcnJvcjp0cnVlLERhdGFWaWV3
-OnRydWUsQXJyYXlCdWZmZXJWaWV3OmZhbHNlLEZsb2F0MzJBcnJheTp0cnVlLEZsb2F0NjRBcnJheTp0
-cnVlLEludDE2QXJyYXk6dHJ1ZSxJbnQzMkFycmF5OnRydWUsSW50OEFycmF5OnRydWUsVWludDE2QXJy
-YXk6dHJ1ZSxVaW50MzJBcnJheTp0cnVlLFVpbnQ4Q2xhbXBlZEFycmF5OnRydWUsQ2FudmFzUGl4ZWxB
-cnJheTp0cnVlLFVpbnQ4QXJyYXk6ZmFsc2UsSFRNTEF1ZGlvRWxlbWVudDp0cnVlLEhUTUxCUkVsZW1l
-bnQ6dHJ1ZSxIVE1MQnV0dG9uRWxlbWVudDp0cnVlLEhUTUxDYW52YXNFbGVtZW50OnRydWUsSFRNTENv
-bnRlbnRFbGVtZW50OnRydWUsSFRNTERMaXN0RWxlbWVudDp0cnVlLEhUTUxEYXRhRWxlbWVudDp0cnVl
-LEhUTUxEYXRhTGlzdEVsZW1lbnQ6dHJ1ZSxIVE1MRGV0YWlsc0VsZW1lbnQ6dHJ1ZSxIVE1MRGlhbG9n
-RWxlbWVudDp0cnVlLEhUTUxEaXZFbGVtZW50OnRydWUsSFRNTEVtYmVkRWxlbWVudDp0cnVlLEhUTUxG
-aWVsZFNldEVsZW1lbnQ6dHJ1ZSxIVE1MSFJFbGVtZW50OnRydWUsSFRNTEhlYWRFbGVtZW50OnRydWUs
-SFRNTEhlYWRpbmdFbGVtZW50OnRydWUsSFRNTEh0bWxFbGVtZW50OnRydWUsSFRNTElGcmFtZUVsZW1l
-bnQ6dHJ1ZSxIVE1MSW1hZ2VFbGVtZW50OnRydWUsSFRNTElucHV0RWxlbWVudDp0cnVlLEhUTUxMSUVs
-ZW1lbnQ6dHJ1ZSxIVE1MTGFiZWxFbGVtZW50OnRydWUsSFRNTExlZ2VuZEVsZW1lbnQ6dHJ1ZSxIVE1M
-TGlua0VsZW1lbnQ6dHJ1ZSxIVE1MTWFwRWxlbWVudDp0cnVlLEhUTUxNZWRpYUVsZW1lbnQ6dHJ1ZSxI
-VE1MTWVudUVsZW1lbnQ6dHJ1ZSxIVE1MTWV0YUVsZW1lbnQ6dHJ1ZSxIVE1MTWV0ZXJFbGVtZW50OnRy
-dWUsSFRNTE1vZEVsZW1lbnQ6dHJ1ZSxIVE1MT0xpc3RFbGVtZW50OnRydWUsSFRNTE9iamVjdEVsZW1l
-bnQ6dHJ1ZSxIVE1MT3B0R3JvdXBFbGVtZW50OnRydWUsSFRNTE9wdGlvbkVsZW1lbnQ6dHJ1ZSxIVE1M
-T3V0cHV0RWxlbWVudDp0cnVlLEhUTUxQYXJhbUVsZW1lbnQ6dHJ1ZSxIVE1MUGljdHVyZUVsZW1lbnQ6
-dHJ1ZSxIVE1MUHJlRWxlbWVudDp0cnVlLEhUTUxQcm9ncmVzc0VsZW1lbnQ6dHJ1ZSxIVE1MUXVvdGVF
-bGVtZW50OnRydWUsSFRNTFNjcmlwdEVsZW1lbnQ6dHJ1ZSxIVE1MU2hhZG93RWxlbWVudDp0cnVlLEhU
-TUxTbG90RWxlbWVudDp0cnVlLEhUTUxTb3VyY2VFbGVtZW50OnRydWUsSFRNTFNwYW5FbGVtZW50OnRy
-dWUsSFRNTFN0eWxlRWxlbWVudDp0cnVlLEhUTUxUYWJsZUNhcHRpb25FbGVtZW50OnRydWUsSFRNTFRh
-YmxlQ2VsbEVsZW1lbnQ6dHJ1ZSxIVE1MVGFibGVEYXRhQ2VsbEVsZW1lbnQ6dHJ1ZSxIVE1MVGFibGVI
-ZWFkZXJDZWxsRWxlbWVudDp0cnVlLEhUTUxUYWJsZUNvbEVsZW1lbnQ6dHJ1ZSxIVE1MVGV4dEFyZWFF
-bGVtZW50OnRydWUsSFRNTFRpbWVFbGVtZW50OnRydWUsSFRNTFRpdGxlRWxlbWVudDp0cnVlLEhUTUxU
-cmFja0VsZW1lbnQ6dHJ1ZSxIVE1MVUxpc3RFbGVtZW50OnRydWUsSFRNTFVua25vd25FbGVtZW50OnRy
-dWUsSFRNTFZpZGVvRWxlbWVudDp0cnVlLEhUTUxEaXJlY3RvcnlFbGVtZW50OnRydWUsSFRNTEZvbnRF
-bGVtZW50OnRydWUsSFRNTEZyYW1lRWxlbWVudDp0cnVlLEhUTUxGcmFtZVNldEVsZW1lbnQ6dHJ1ZSxI
-VE1MTWFycXVlZUVsZW1lbnQ6dHJ1ZSxIVE1MRWxlbWVudDpmYWxzZSxIVE1MQW5jaG9yRWxlbWVudDp0
-cnVlLEhUTUxBcmVhRWxlbWVudDp0cnVlLEhUTUxCYXNlRWxlbWVudDp0cnVlLEJsb2I6ZmFsc2UsSFRN
-TEJvZHlFbGVtZW50OnRydWUsQ0RBVEFTZWN0aW9uOnRydWUsQ2hhcmFjdGVyRGF0YTp0cnVlLENvbW1l
-bnQ6dHJ1ZSxQcm9jZXNzaW5nSW5zdHJ1Y3Rpb246dHJ1ZSxUZXh0OnRydWUsQ1NTU3R5bGVEZWNsYXJh
-dGlvbjp0cnVlLE1TU3R5bGVDU1NQcm9wZXJ0aWVzOnRydWUsQ1NTMlByb3BlcnRpZXM6dHJ1ZSxYTUxE
-b2N1bWVudDp0cnVlLERvY3VtZW50OmZhbHNlLERPTUV4Y2VwdGlvbjp0cnVlLERPTUltcGxlbWVudGF0
-aW9uOnRydWUsRE9NUmVjdFJlYWRPbmx5OmZhbHNlLERPTVRva2VuTGlzdDp0cnVlLEVsZW1lbnQ6ZmFs
-c2UsQWJvcnRQYXltZW50RXZlbnQ6dHJ1ZSxBbmltYXRpb25FdmVudDp0cnVlLEFuaW1hdGlvblBsYXli
-YWNrRXZlbnQ6dHJ1ZSxBcHBsaWNhdGlvbkNhY2hlRXJyb3JFdmVudDp0cnVlLEJhY2tncm91bmRGZXRj
-aENsaWNrRXZlbnQ6dHJ1ZSxCYWNrZ3JvdW5kRmV0Y2hFdmVudDp0cnVlLEJhY2tncm91bmRGZXRjaEZh
-aWxFdmVudDp0cnVlLEJhY2tncm91bmRGZXRjaGVkRXZlbnQ6dHJ1ZSxCZWZvcmVJbnN0YWxsUHJvbXB0
-RXZlbnQ6dHJ1ZSxCZWZvcmVVbmxvYWRFdmVudDp0cnVlLEJsb2JFdmVudDp0cnVlLENhbk1ha2VQYXlt
-ZW50RXZlbnQ6dHJ1ZSxDbGlwYm9hcmRFdmVudDp0cnVlLENsb3NlRXZlbnQ6dHJ1ZSxDdXN0b21FdmVu
-dDp0cnVlLERldmljZU1vdGlvbkV2ZW50OnRydWUsRGV2aWNlT3JpZW50YXRpb25FdmVudDp0cnVlLEVy
-cm9yRXZlbnQ6dHJ1ZSxFeHRlbmRhYmxlRXZlbnQ6dHJ1ZSxFeHRlbmRhYmxlTWVzc2FnZUV2ZW50OnRy
-dWUsRmV0Y2hFdmVudDp0cnVlLEZvbnRGYWNlU2V0TG9hZEV2ZW50OnRydWUsRm9yZWlnbkZldGNoRXZl
-bnQ6dHJ1ZSxHYW1lcGFkRXZlbnQ6dHJ1ZSxIYXNoQ2hhbmdlRXZlbnQ6dHJ1ZSxJbnN0YWxsRXZlbnQ6
-dHJ1ZSxNZWRpYUVuY3J5cHRlZEV2ZW50OnRydWUsTWVkaWFLZXlNZXNzYWdlRXZlbnQ6dHJ1ZSxNZWRp
-YVF1ZXJ5TGlzdEV2ZW50OnRydWUsTWVkaWFTdHJlYW1FdmVudDp0cnVlLE1lZGlhU3RyZWFtVHJhY2tF
-dmVudDp0cnVlLE1lc3NhZ2VFdmVudDp0cnVlLE1JRElDb25uZWN0aW9uRXZlbnQ6dHJ1ZSxNSURJTWVz
-c2FnZUV2ZW50OnRydWUsTXV0YXRpb25FdmVudDp0cnVlLE5vdGlmaWNhdGlvbkV2ZW50OnRydWUsUGFn
-ZVRyYW5zaXRpb25FdmVudDp0cnVlLFBheW1lbnRSZXF1ZXN0RXZlbnQ6dHJ1ZSxQYXltZW50UmVxdWVz
-dFVwZGF0ZUV2ZW50OnRydWUsUG9wU3RhdGVFdmVudDp0cnVlLFByZXNlbnRhdGlvbkNvbm5lY3Rpb25B
-dmFpbGFibGVFdmVudDp0cnVlLFByZXNlbnRhdGlvbkNvbm5lY3Rpb25DbG9zZUV2ZW50OnRydWUsUHJv
-bWlzZVJlamVjdGlvbkV2ZW50OnRydWUsUHVzaEV2ZW50OnRydWUsUlRDRGF0YUNoYW5uZWxFdmVudDp0
-cnVlLFJUQ0RUTUZUb25lQ2hhbmdlRXZlbnQ6dHJ1ZSxSVENQZWVyQ29ubmVjdGlvbkljZUV2ZW50OnRy
-dWUsUlRDVHJhY2tFdmVudDp0cnVlLFNlY3VyaXR5UG9saWN5VmlvbGF0aW9uRXZlbnQ6dHJ1ZSxTZW5z
-b3JFcnJvckV2ZW50OnRydWUsU3BlZWNoUmVjb2duaXRpb25FcnJvcjp0cnVlLFNwZWVjaFJlY29nbml0
-aW9uRXZlbnQ6dHJ1ZSxTcGVlY2hTeW50aGVzaXNFdmVudDp0cnVlLFN0b3JhZ2VFdmVudDp0cnVlLFN5
-bmNFdmVudDp0cnVlLFRyYWNrRXZlbnQ6dHJ1ZSxUcmFuc2l0aW9uRXZlbnQ6dHJ1ZSxXZWJLaXRUcmFu
-c2l0aW9uRXZlbnQ6dHJ1ZSxWUkRldmljZUV2ZW50OnRydWUsVlJEaXNwbGF5RXZlbnQ6dHJ1ZSxWUlNl
-c3Npb25FdmVudDp0cnVlLE1vam9JbnRlcmZhY2VSZXF1ZXN0RXZlbnQ6dHJ1ZSxVU0JDb25uZWN0aW9u
-RXZlbnQ6dHJ1ZSxJREJWZXJzaW9uQ2hhbmdlRXZlbnQ6dHJ1ZSxBdWRpb1Byb2Nlc3NpbmdFdmVudDp0
-cnVlLE9mZmxpbmVBdWRpb0NvbXBsZXRpb25FdmVudDp0cnVlLFdlYkdMQ29udGV4dEV2ZW50OnRydWUs
-RXZlbnQ6ZmFsc2UsSW5wdXRFdmVudDpmYWxzZSxTdWJtaXRFdmVudDpmYWxzZSxFdmVudFRhcmdldDpm
-YWxzZSxGaWxlOnRydWUsSFRNTEZvcm1FbGVtZW50OnRydWUsSGlzdG9yeTp0cnVlLEhUTUxEb2N1bWVu
-dDp0cnVlLFhNTEh0dHBSZXF1ZXN0OnRydWUsWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldDpmYWxzZSxJ
-bWFnZURhdGE6dHJ1ZSxMb2NhdGlvbjp0cnVlLE1vdXNlRXZlbnQ6dHJ1ZSxEcmFnRXZlbnQ6dHJ1ZSxQ
-b2ludGVyRXZlbnQ6dHJ1ZSxXaGVlbEV2ZW50OnRydWUsRG9jdW1lbnRGcmFnbWVudDp0cnVlLFNoYWRv
-d1Jvb3Q6dHJ1ZSxEb2N1bWVudFR5cGU6dHJ1ZSxOb2RlOmZhbHNlLE5vZGVMaXN0OnRydWUsUmFkaW9O
-b2RlTGlzdDp0cnVlLEhUTUxQYXJhZ3JhcGhFbGVtZW50OnRydWUsUHJvZ3Jlc3NFdmVudDp0cnVlLFJl
-c291cmNlUHJvZ3Jlc3NFdmVudDp0cnVlLEhUTUxTZWxlY3RFbGVtZW50OnRydWUsSFRNTFRhYmxlRWxl
-bWVudDp0cnVlLEhUTUxUYWJsZVJvd0VsZW1lbnQ6dHJ1ZSxIVE1MVGFibGVTZWN0aW9uRWxlbWVudDp0
-cnVlLEhUTUxUZW1wbGF0ZUVsZW1lbnQ6dHJ1ZSxDb21wb3NpdGlvbkV2ZW50OnRydWUsRm9jdXNFdmVu
-dDp0cnVlLEtleWJvYXJkRXZlbnQ6dHJ1ZSxUZXh0RXZlbnQ6dHJ1ZSxUb3VjaEV2ZW50OnRydWUsVUlF
-dmVudDpmYWxzZSxXaW5kb3c6dHJ1ZSxET01XaW5kb3c6dHJ1ZSxEZWRpY2F0ZWRXb3JrZXJHbG9iYWxT
-Y29wZTp0cnVlLFNlcnZpY2VXb3JrZXJHbG9iYWxTY29wZTp0cnVlLFNoYXJlZFdvcmtlckdsb2JhbFNj
-b3BlOnRydWUsV29ya2VyR2xvYmFsU2NvcGU6dHJ1ZSxBdHRyOnRydWUsQ2xpZW50UmVjdDp0cnVlLERP
-TVJlY3Q6dHJ1ZSxOYW1lZE5vZGVNYXA6dHJ1ZSxNb3pOYW1lZEF0dHJNYXA6dHJ1ZSxJREJLZXlSYW5n
-ZTp0cnVlLFNWR1NjcmlwdEVsZW1lbnQ6dHJ1ZSxTVkdBRWxlbWVudDp0cnVlLFNWR0FuaW1hdGVFbGVt
-ZW50OnRydWUsU1ZHQW5pbWF0ZU1vdGlvbkVsZW1lbnQ6dHJ1ZSxTVkdBbmltYXRlVHJhbnNmb3JtRWxl
-bWVudDp0cnVlLFNWR0FuaW1hdGlvbkVsZW1lbnQ6dHJ1ZSxTVkdDaXJjbGVFbGVtZW50OnRydWUsU1ZH
-Q2xpcFBhdGhFbGVtZW50OnRydWUsU1ZHRGVmc0VsZW1lbnQ6dHJ1ZSxTVkdEZXNjRWxlbWVudDp0cnVl
-LFNWR0Rpc2NhcmRFbGVtZW50OnRydWUsU1ZHRWxsaXBzZUVsZW1lbnQ6dHJ1ZSxTVkdGRUJsZW5kRWxl
-bWVudDp0cnVlLFNWR0ZFQ29sb3JNYXRyaXhFbGVtZW50OnRydWUsU1ZHRkVDb21wb25lbnRUcmFuc2Zl
-ckVsZW1lbnQ6dHJ1ZSxTVkdGRUNvbXBvc2l0ZUVsZW1lbnQ6dHJ1ZSxTVkdGRUNvbnZvbHZlTWF0cml4
-RWxlbWVudDp0cnVlLFNWR0ZFRGlmZnVzZUxpZ2h0aW5nRWxlbWVudDp0cnVlLFNWR0ZFRGlzcGxhY2Vt
-ZW50TWFwRWxlbWVudDp0cnVlLFNWR0ZFRGlzdGFudExpZ2h0RWxlbWVudDp0cnVlLFNWR0ZFRmxvb2RF
-bGVtZW50OnRydWUsU1ZHRkVGdW5jQUVsZW1lbnQ6dHJ1ZSxTVkdGRUZ1bmNCRWxlbWVudDp0cnVlLFNW
-R0ZFRnVuY0dFbGVtZW50OnRydWUsU1ZHRkVGdW5jUkVsZW1lbnQ6dHJ1ZSxTVkdGRUdhdXNzaWFuQmx1
-ckVsZW1lbnQ6dHJ1ZSxTVkdGRUltYWdlRWxlbWVudDp0cnVlLFNWR0ZFTWVyZ2VFbGVtZW50OnRydWUs
-U1ZHRkVNZXJnZU5vZGVFbGVtZW50OnRydWUsU1ZHRkVNb3JwaG9sb2d5RWxlbWVudDp0cnVlLFNWR0ZF
-T2Zmc2V0RWxlbWVudDp0cnVlLFNWR0ZFUG9pbnRMaWdodEVsZW1lbnQ6dHJ1ZSxTVkdGRVNwZWN1bGFy
-TGlnaHRpbmdFbGVtZW50OnRydWUsU1ZHRkVTcG90TGlnaHRFbGVtZW50OnRydWUsU1ZHRkVUaWxlRWxl
-bWVudDp0cnVlLFNWR0ZFVHVyYnVsZW5jZUVsZW1lbnQ6dHJ1ZSxTVkdGaWx0ZXJFbGVtZW50OnRydWUs
-U1ZHRm9yZWlnbk9iamVjdEVsZW1lbnQ6dHJ1ZSxTVkdHRWxlbWVudDp0cnVlLFNWR0dlb21ldHJ5RWxl
-bWVudDp0cnVlLFNWR0dyYXBoaWNzRWxlbWVudDp0cnVlLFNWR0ltYWdlRWxlbWVudDp0cnVlLFNWR0xp
-bmVFbGVtZW50OnRydWUsU1ZHTGluZWFyR3JhZGllbnRFbGVtZW50OnRydWUsU1ZHTWFya2VyRWxlbWVu
-dDp0cnVlLFNWR01hc2tFbGVtZW50OnRydWUsU1ZHTWV0YWRhdGFFbGVtZW50OnRydWUsU1ZHUGF0aEVs
-ZW1lbnQ6dHJ1ZSxTVkdQYXR0ZXJuRWxlbWVudDp0cnVlLFNWR1BvbHlnb25FbGVtZW50OnRydWUsU1ZH
-UG9seWxpbmVFbGVtZW50OnRydWUsU1ZHUmFkaWFsR3JhZGllbnRFbGVtZW50OnRydWUsU1ZHUmVjdEVs
-ZW1lbnQ6dHJ1ZSxTVkdTZXRFbGVtZW50OnRydWUsU1ZHU3RvcEVsZW1lbnQ6dHJ1ZSxTVkdTdHlsZUVs
-ZW1lbnQ6dHJ1ZSxTVkdTVkdFbGVtZW50OnRydWUsU1ZHU3dpdGNoRWxlbWVudDp0cnVlLFNWR1N5bWJv
-bEVsZW1lbnQ6dHJ1ZSxTVkdUU3BhbkVsZW1lbnQ6dHJ1ZSxTVkdUZXh0Q29udGVudEVsZW1lbnQ6dHJ1
-ZSxTVkdUZXh0RWxlbWVudDp0cnVlLFNWR1RleHRQYXRoRWxlbWVudDp0cnVlLFNWR1RleHRQb3NpdGlv
-bmluZ0VsZW1lbnQ6dHJ1ZSxTVkdUaXRsZUVsZW1lbnQ6dHJ1ZSxTVkdVc2VFbGVtZW50OnRydWUsU1ZH
-Vmlld0VsZW1lbnQ6dHJ1ZSxTVkdHcmFkaWVudEVsZW1lbnQ6dHJ1ZSxTVkdDb21wb25lbnRUcmFuc2Zl
-ckZ1bmN0aW9uRWxlbWVudDp0cnVlLFNWR0ZFRHJvcFNoYWRvd0VsZW1lbnQ6dHJ1ZSxTVkdNUGF0aEVs
-ZW1lbnQ6dHJ1ZSxTVkdFbGVtZW50OmZhbHNlfSkKSC5YSC4kbmF0aXZlU3VwZXJjbGFzc1RhZz0iQXJy
-YXlCdWZmZXJWaWV3IgpILlJHLiRuYXRpdmVTdXBlcmNsYXNzVGFnPSJBcnJheUJ1ZmZlclZpZXciCkgu
-VlAuJG5hdGl2ZVN1cGVyY2xhc3NUYWc9IkFycmF5QnVmZmVyVmlldyIKSC5EZy4kbmF0aXZlU3VwZXJj
-bGFzc1RhZz0iQXJyYXlCdWZmZXJWaWV3IgpILldCLiRuYXRpdmVTdXBlcmNsYXNzVGFnPSJBcnJheUJ1
-ZmZlclZpZXciCkguWkcuJG5hdGl2ZVN1cGVyY2xhc3NUYWc9IkFycmF5QnVmZmVyVmlldyIKSC5QZy4k
-bmF0aXZlU3VwZXJjbGFzc1RhZz0iQXJyYXlCdWZmZXJWaWV3In0pKCkKY29udmVydEFsbFRvRmFzdE9i
-amVjdCh3KQpjb252ZXJ0VG9GYXN0T2JqZWN0KCQpOyhmdW5jdGlvbihhKXtpZih0eXBlb2YgZG9jdW1l
-bnQ9PT0idW5kZWZpbmVkIil7YShudWxsKQpyZXR1cm59aWYodHlwZW9mIGRvY3VtZW50LmN1cnJlbnRT
-Y3JpcHQhPSd1bmRlZmluZWQnKXthKGRvY3VtZW50LmN1cnJlbnRTY3JpcHQpCnJldHVybn12YXIgcz1k
-b2N1bWVudC5zY3JpcHRzCmZ1bmN0aW9uIG9uTG9hZChiKXtmb3IodmFyIHE9MDtxPHMubGVuZ3RoOysr
-cSlzW3FdLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWQiLG9uTG9hZCxmYWxzZSkKYShiLnRhcmdldCl9
-Zm9yKHZhciByPTA7cjxzLmxlbmd0aDsrK3Ipc1tyXS5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixvbkxv
-YWQsZmFsc2UpfSkoZnVuY3Rpb24oYSl7di5jdXJyZW50U2NyaXB0PWEKaWYodHlwZW9mIGRhcnRNYWlu
-UnVubmVyPT09ImZ1bmN0aW9uIilkYXJ0TWFpblJ1bm5lcihMLklxLFtdKQplbHNlIEwuSXEoW10pfSl9
-KSgpCi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1pZ3JhdGlvbi5qcy5tYXAK
+bWVudHMkJwp0cnl7bnVsbC4kbWV0aG9kJCgkYXJndW1lbnRzRXhwciQpfWNhdGNoKHEpe3JldHVybiBx
+Lm1lc3NhZ2V9fSgpKX0pCnMoJCwicWkiLCJVTiIsZnVuY3Rpb24oKXtyZXR1cm4gSC5jTShILlM3KHZv
+aWQgMCkpfSkKcygkLCJyWiIsIlpoIixmdW5jdGlvbigpe3JldHVybiBILmNNKGZ1bmN0aW9uKCl7dmFy
+ICRhcmd1bWVudHNFeHByJD0nJGFyZ3VtZW50cyQnCnRyeXsodm9pZCAwKS4kbWV0aG9kJCgkYXJndW1l
+bnRzRXhwciQpfWNhdGNoKHEpe3JldHVybiBxLm1lc3NhZ2V9fSgpKX0pCnMoJCwia3EiLCJyTiIsZnVu
+Y3Rpb24oKXtyZXR1cm4gSC5jTShILk1qKG51bGwpKX0pCnMoJCwidHQiLCJjMyIsZnVuY3Rpb24oKXty
+ZXR1cm4gSC5jTShmdW5jdGlvbigpe3RyeXtudWxsLiRtZXRob2QkfWNhdGNoKHEpe3JldHVybiBxLm1l
+c3NhZ2V9fSgpKX0pCnMoJCwiZHQiLCJISyIsZnVuY3Rpb24oKXtyZXR1cm4gSC5jTShILk1qKHZvaWQg
+MCkpfSkKcygkLCJBNyIsInIxIixmdW5jdGlvbigpe3JldHVybiBILmNNKGZ1bmN0aW9uKCl7dHJ5eyh2
+b2lkIDApLiRtZXRob2QkfWNhdGNoKHEpe3JldHVybiBxLm1lc3NhZ2V9fSgpKX0pCnMoJCwiV2MiLCJ1
+dCIsZnVuY3Rpb24oKXtyZXR1cm4gUC5PaigpfSkKcygkLCJraCIsInJmIixmdW5jdGlvbigpe3JldHVy
+biBuZXcgUC5wZygpLiQwKCl9KQpzKCQsImFYIiwiSEciLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBQLmMy
+KCkuJDAoKX0pCnMoJCwiYnQiLCJWNyIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEludDhBcnJheShILlhG
+KEguVk0oWy0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0y
+LC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0x
+LC0yLC0yLC0yLC0yLC0yLDYyLC0yLDYyLC0yLDYzLDUyLDUzLDU0LDU1LDU2LDU3LDU4LDU5LDYwLDYx
+LC0yLC0yLC0yLC0xLC0yLC0yLC0yLDAsMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQsMTUs
+MTYsMTcsMTgsMTksMjAsMjEsMjIsMjMsMjQsMjUsLTIsLTIsLTIsLTIsNjMsLTIsMjYsMjcsMjgsMjks
+MzAsMzEsMzIsMzMsMzQsMzUsMzYsMzcsMzgsMzksNDAsNDEsNDIsNDMsNDQsNDUsNDYsNDcsNDgsNDks
+NTAsNTEsLTIsLTIsLTIsLTIsLTJdLHQuYSkpKX0pCnMoJCwiTTUiLCJ3USIsZnVuY3Rpb24oKXtyZXR1
+cm4gdHlwZW9mIHByb2Nlc3MhPSJ1bmRlZmluZWQiJiZPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNh
+bGwocHJvY2Vzcyk9PSJbb2JqZWN0IHByb2Nlc3NdIiYmcHJvY2Vzcy5wbGF0Zm9ybT09IndpbjMyIn0p
+CnMoJCwibWYiLCJ6NCIsZnVuY3Rpb24oKXtyZXR1cm4gUC5udSgiXltcXC1cXC4wLTlBLVpfYS16fl0q
+JCIpfSkKcygkLCJPUSIsInZaIixmdW5jdGlvbigpe3JldHVybiBQLktOKCl9KQpzKCQsIlNDIiwiQU4i
+LGZ1bmN0aW9uKCl7cmV0dXJuIFAudE0oWyJBIiwiQUJCUiIsIkFDUk9OWU0iLCJBRERSRVNTIiwiQVJF
+QSIsIkFSVElDTEUiLCJBU0lERSIsIkFVRElPIiwiQiIsIkJESSIsIkJETyIsIkJJRyIsIkJMT0NLUVVP
+VEUiLCJCUiIsIkJVVFRPTiIsIkNBTlZBUyIsIkNBUFRJT04iLCJDRU5URVIiLCJDSVRFIiwiQ09ERSIs
+IkNPTCIsIkNPTEdST1VQIiwiQ09NTUFORCIsIkRBVEEiLCJEQVRBTElTVCIsIkREIiwiREVMIiwiREVU
+QUlMUyIsIkRGTiIsIkRJUiIsIkRJViIsIkRMIiwiRFQiLCJFTSIsIkZJRUxEU0VUIiwiRklHQ0FQVElP
+TiIsIkZJR1VSRSIsIkZPTlQiLCJGT09URVIiLCJGT1JNIiwiSDEiLCJIMiIsIkgzIiwiSDQiLCJINSIs
+Ikg2IiwiSEVBREVSIiwiSEdST1VQIiwiSFIiLCJJIiwiSUZSQU1FIiwiSU1HIiwiSU5QVVQiLCJJTlMi
+LCJLQkQiLCJMQUJFTCIsIkxFR0VORCIsIkxJIiwiTUFQIiwiTUFSSyIsIk1FTlUiLCJNRVRFUiIsIk5B
+ViIsIk5PQlIiLCJPTCIsIk9QVEdST1VQIiwiT1BUSU9OIiwiT1VUUFVUIiwiUCIsIlBSRSIsIlBST0dS
+RVNTIiwiUSIsIlMiLCJTQU1QIiwiU0VDVElPTiIsIlNFTEVDVCIsIlNNQUxMIiwiU09VUkNFIiwiU1BB
+TiIsIlNUUklLRSIsIlNUUk9ORyIsIlNVQiIsIlNVTU1BUlkiLCJTVVAiLCJUQUJMRSIsIlRCT0RZIiwi
+VEQiLCJURVhUQVJFQSIsIlRGT09UIiwiVEgiLCJUSEVBRCIsIlRJTUUiLCJUUiIsIlRSQUNLIiwiVFQi
+LCJVIiwiVUwiLCJWQVIiLCJWSURFTyIsIldCUiJdLHQuTil9KQpzKCQsIlg0IiwiaEciLGZ1bmN0aW9u
+KCl7cmV0dXJuIFAubnUoIl5cXFMrJCIpfSkKcygkLCJ3TyIsIm93IixmdW5jdGlvbigpe3JldHVybiBQ
+Lk5EKHNlbGYpfSkKcygkLCJrdCIsIlI4IixmdW5jdGlvbigpe3JldHVybiBILllnKCJfJGRhcnRfZGFy
+dE9iamVjdCIpfSkKcygkLCJmSyIsImtJIixmdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbiBEYXJ0T2Jq
+ZWN0KGEpe3RoaXMubz1hfX0pCnIoJCwicXQiLCJ6QiIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFQubVEo
+KX0pCnIoJCwiT2wiLCJVRSIsZnVuY3Rpb24oKXtyZXR1cm4gUC5oSyhDLm9sLmdtVyhXLngzKCkpLmhy
+ZWYpLmdoWSgpLnEoMCwiYXV0aFRva2VuIil9KQpyKCQsImhUIiwieVAiLGZ1bmN0aW9uKCl7cmV0dXJu
+IFcuWnIoKS5xdWVyeVNlbGVjdG9yKCIuZWRpdC1saXN0IC5wYW5lbC1jb250ZW50Iil9KQpyKCQsIlc2
+IiwiaEwiLGZ1bmN0aW9uKCl7cmV0dXJuIFcuWnIoKS5xdWVyeVNlbGVjdG9yKCIuZWRpdC1wYW5lbCAu
+cGFuZWwtY29udGVudCIpfSkKcigkLCJUUiIsIkRXIixmdW5jdGlvbigpe3JldHVybiBXLlpyKCkucXVl
+cnlTZWxlY3RvcigiZm9vdGVyIil9KQpyKCQsIkVZIiwiZmkiLGZ1bmN0aW9uKCl7cmV0dXJuIFcuWnIo
+KS5xdWVyeVNlbGVjdG9yKCJoZWFkZXIiKX0pCnIoJCwiYXYiLCJEOSIsZnVuY3Rpb24oKXtyZXR1cm4g
+Vy5acigpLnF1ZXJ5U2VsZWN0b3IoIiN1bml0LW5hbWUiKX0pCnIoJCwiZmUiLCJLRyIsZnVuY3Rpb24o
+KXtyZXR1cm4gbmV3IEwuWEEoKX0pCnMoJCwiZW8iLCJuVSIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IE0u
+bEkoJC5IaygpKX0pCnMoJCwieXIiLCJiRCIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEUuT0YoUC5udSgi
+LyIpLFAubnUoIlteL10kIiksUC5udSgiXi8iKSl9KQpzKCQsIk1rIiwiS2siLGZ1bmN0aW9uKCl7cmV0
+dXJuIG5ldyBMLklWKFAubnUoIlsvXFxcXF0iKSxQLm51KCJbXi9cXFxcXSQiKSxQLm51KCJeKFxcXFxc
+XFxcW15cXFxcXStcXFxcW15cXFxcL10rfFthLXpBLVpdOlsvXFxcXF0pIiksUC5udSgiXlsvXFxcXF0o
+PyFbL1xcXFxdKSIpKX0pCnMoJCwiYWsiLCJFYiIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEYucnUoUC5u
+dSgiLyIpLFAubnUoIiheW2EtekEtWl1bLSsuYS16QS1aXFxkXSo6Ly98W14vXSkkIiksUC5udSgiW2Et
+ekEtWl1bLSsuYS16QS1aXFxkXSo6Ly9bXi9dKiIpLFAubnUoIl4vIikpfSkKcygkLCJscyIsIkhrIixm
+dW5jdGlvbigpe3JldHVybiBPLlJoKCl9KX0pKCk7KGZ1bmN0aW9uIG5hdGl2ZVN1cHBvcnQoKXshZnVu
+Y3Rpb24oKXt2YXIgcz1mdW5jdGlvbihhKXt2YXIgbT17fQptW2FdPTEKcmV0dXJuIE9iamVjdC5rZXlz
+KGh1bmtIZWxwZXJzLmNvbnZlcnRUb0Zhc3RPYmplY3QobSkpWzBdfQp2LmdldElzb2xhdGVUYWc9ZnVu
+Y3Rpb24oYSl7cmV0dXJuIHMoIl9fX2RhcnRfIithK3YuaXNvbGF0ZVRhZyl9CnZhciByPSJfX19kYXJ0
+X2lzb2xhdGVfdGFnc18iCnZhciBxPU9iamVjdFtyXXx8KE9iamVjdFtyXT1PYmplY3QuY3JlYXRlKG51
+bGwpKQp2YXIgcD0iX1p4WXhYIgpmb3IodmFyIG89MDs7bysrKXt2YXIgbj1zKHArIl8iK28rIl8iKQpp
+ZighKG4gaW4gcSkpe3Fbbl09MQp2Lmlzb2xhdGVUYWc9bgpicmVha319di5kaXNwYXRjaFByb3BlcnR5
+TmFtZT12LmdldElzb2xhdGVUYWcoImRpc3BhdGNoX3JlY29yZCIpfSgpCmh1bmtIZWxwZXJzLnNldE9y
+VXBkYXRlSW50ZXJjZXB0b3JzQnlUYWcoe0RPTUVycm9yOkoudkIsTWVkaWFFcnJvcjpKLnZCLE5hdmln
+YXRvcjpKLnZCLE5hdmlnYXRvckNvbmN1cnJlbnRIYXJkd2FyZTpKLnZCLE5hdmlnYXRvclVzZXJNZWRp
+YUVycm9yOkoudkIsT3ZlcmNvbnN0cmFpbmVkRXJyb3I6Si52QixQb3NpdGlvbkVycm9yOkoudkIsUmFu
+Z2U6Si52QixTUUxFcnJvcjpKLnZCLERhdGFWaWV3OkguRVQsQXJyYXlCdWZmZXJWaWV3OkguRVQsRmxv
+YXQzMkFycmF5OkguRGcsRmxvYXQ2NEFycmF5OkguRGcsSW50MTZBcnJheTpILnhqLEludDMyQXJyYXk6
+SC5kRSxJbnQ4QXJyYXk6SC5aQSxVaW50MTZBcnJheTpILmRULFVpbnQzMkFycmF5OkguUHEsVWludDhD
+bGFtcGVkQXJyYXk6SC5lRSxDYW52YXNQaXhlbEFycmF5OkguZUUsVWludDhBcnJheTpILlY2LEhUTUxB
+dWRpb0VsZW1lbnQ6Vy5xRSxIVE1MQlJFbGVtZW50OlcucUUsSFRNTEJ1dHRvbkVsZW1lbnQ6Vy5xRSxI
+VE1MQ2FudmFzRWxlbWVudDpXLnFFLEhUTUxDb250ZW50RWxlbWVudDpXLnFFLEhUTUxETGlzdEVsZW1l
+bnQ6Vy5xRSxIVE1MRGF0YUVsZW1lbnQ6Vy5xRSxIVE1MRGF0YUxpc3RFbGVtZW50OlcucUUsSFRNTERl
+dGFpbHNFbGVtZW50OlcucUUsSFRNTERpYWxvZ0VsZW1lbnQ6Vy5xRSxIVE1MRGl2RWxlbWVudDpXLnFF
+LEhUTUxFbWJlZEVsZW1lbnQ6Vy5xRSxIVE1MRmllbGRTZXRFbGVtZW50OlcucUUsSFRNTEhSRWxlbWVu
+dDpXLnFFLEhUTUxIZWFkRWxlbWVudDpXLnFFLEhUTUxIZWFkaW5nRWxlbWVudDpXLnFFLEhUTUxIdG1s
+RWxlbWVudDpXLnFFLEhUTUxJRnJhbWVFbGVtZW50OlcucUUsSFRNTEltYWdlRWxlbWVudDpXLnFFLEhU
+TUxJbnB1dEVsZW1lbnQ6Vy5xRSxIVE1MTElFbGVtZW50OlcucUUsSFRNTExhYmVsRWxlbWVudDpXLnFF
+LEhUTUxMZWdlbmRFbGVtZW50OlcucUUsSFRNTExpbmtFbGVtZW50OlcucUUsSFRNTE1hcEVsZW1lbnQ6
+Vy5xRSxIVE1MTWVkaWFFbGVtZW50OlcucUUsSFRNTE1lbnVFbGVtZW50OlcucUUsSFRNTE1ldGFFbGVt
+ZW50OlcucUUsSFRNTE1ldGVyRWxlbWVudDpXLnFFLEhUTUxNb2RFbGVtZW50OlcucUUsSFRNTE9MaXN0
+RWxlbWVudDpXLnFFLEhUTUxPYmplY3RFbGVtZW50OlcucUUsSFRNTE9wdEdyb3VwRWxlbWVudDpXLnFF
+LEhUTUxPcHRpb25FbGVtZW50OlcucUUsSFRNTE91dHB1dEVsZW1lbnQ6Vy5xRSxIVE1MUGFyYW1FbGVt
+ZW50OlcucUUsSFRNTFBpY3R1cmVFbGVtZW50OlcucUUsSFRNTFByZUVsZW1lbnQ6Vy5xRSxIVE1MUHJv
+Z3Jlc3NFbGVtZW50OlcucUUsSFRNTFF1b3RlRWxlbWVudDpXLnFFLEhUTUxTY3JpcHRFbGVtZW50Olcu
+cUUsSFRNTFNoYWRvd0VsZW1lbnQ6Vy5xRSxIVE1MU2xvdEVsZW1lbnQ6Vy5xRSxIVE1MU291cmNlRWxl
+bWVudDpXLnFFLEhUTUxTcGFuRWxlbWVudDpXLnFFLEhUTUxTdHlsZUVsZW1lbnQ6Vy5xRSxIVE1MVGFi
+bGVDYXB0aW9uRWxlbWVudDpXLnFFLEhUTUxUYWJsZUNlbGxFbGVtZW50OlcucUUsSFRNTFRhYmxlRGF0
+YUNlbGxFbGVtZW50OlcucUUsSFRNTFRhYmxlSGVhZGVyQ2VsbEVsZW1lbnQ6Vy5xRSxIVE1MVGFibGVD
+b2xFbGVtZW50OlcucUUsSFRNTFRleHRBcmVhRWxlbWVudDpXLnFFLEhUTUxUaW1lRWxlbWVudDpXLnFF
+LEhUTUxUaXRsZUVsZW1lbnQ6Vy5xRSxIVE1MVHJhY2tFbGVtZW50OlcucUUsSFRNTFVMaXN0RWxlbWVu
+dDpXLnFFLEhUTUxVbmtub3duRWxlbWVudDpXLnFFLEhUTUxWaWRlb0VsZW1lbnQ6Vy5xRSxIVE1MRGly
+ZWN0b3J5RWxlbWVudDpXLnFFLEhUTUxGb250RWxlbWVudDpXLnFFLEhUTUxGcmFtZUVsZW1lbnQ6Vy5x
+RSxIVE1MRnJhbWVTZXRFbGVtZW50OlcucUUsSFRNTE1hcnF1ZWVFbGVtZW50OlcucUUsSFRNTEVsZW1l
+bnQ6Vy5xRSxIVE1MQW5jaG9yRWxlbWVudDpXLkdoLEhUTUxBcmVhRWxlbWVudDpXLmZZLEhUTUxCYXNl
+RWxlbWVudDpXLm5CLEJsb2I6Vy5BeixIVE1MQm9keUVsZW1lbnQ6Vy5RUCxDREFUQVNlY3Rpb246Vy5u
+eCxDaGFyYWN0ZXJEYXRhOlcubngsQ29tbWVudDpXLm54LFByb2Nlc3NpbmdJbnN0cnVjdGlvbjpXLm54
+LFRleHQ6Vy5ueCxDU1NTdHlsZURlY2xhcmF0aW9uOlcub0osTVNTdHlsZUNTU1Byb3BlcnRpZXM6Vy5v
+SixDU1MyUHJvcGVydGllczpXLm9KLFhNTERvY3VtZW50OlcuUUYsRG9jdW1lbnQ6Vy5RRixET01FeGNl
+cHRpb246Vy5OaCxET01JbXBsZW1lbnRhdGlvbjpXLmFlLERPTVJlY3RSZWFkT25seTpXLklCLERPTVRv
+a2VuTGlzdDpXLm43LEVsZW1lbnQ6Vy5jdixBYm9ydFBheW1lbnRFdmVudDpXLmVhLEFuaW1hdGlvbkV2
+ZW50OlcuZWEsQW5pbWF0aW9uUGxheWJhY2tFdmVudDpXLmVhLEFwcGxpY2F0aW9uQ2FjaGVFcnJvckV2
+ZW50OlcuZWEsQmFja2dyb3VuZEZldGNoQ2xpY2tFdmVudDpXLmVhLEJhY2tncm91bmRGZXRjaEV2ZW50
+OlcuZWEsQmFja2dyb3VuZEZldGNoRmFpbEV2ZW50OlcuZWEsQmFja2dyb3VuZEZldGNoZWRFdmVudDpX
+LmVhLEJlZm9yZUluc3RhbGxQcm9tcHRFdmVudDpXLmVhLEJlZm9yZVVubG9hZEV2ZW50OlcuZWEsQmxv
+YkV2ZW50OlcuZWEsQ2FuTWFrZVBheW1lbnRFdmVudDpXLmVhLENsaXBib2FyZEV2ZW50OlcuZWEsQ2xv
+c2VFdmVudDpXLmVhLEN1c3RvbUV2ZW50OlcuZWEsRGV2aWNlTW90aW9uRXZlbnQ6Vy5lYSxEZXZpY2VP
+cmllbnRhdGlvbkV2ZW50OlcuZWEsRXJyb3JFdmVudDpXLmVhLEV4dGVuZGFibGVFdmVudDpXLmVhLEV4
+dGVuZGFibGVNZXNzYWdlRXZlbnQ6Vy5lYSxGZXRjaEV2ZW50OlcuZWEsRm9udEZhY2VTZXRMb2FkRXZl
+bnQ6Vy5lYSxGb3JlaWduRmV0Y2hFdmVudDpXLmVhLEdhbWVwYWRFdmVudDpXLmVhLEhhc2hDaGFuZ2VF
+dmVudDpXLmVhLEluc3RhbGxFdmVudDpXLmVhLE1lZGlhRW5jcnlwdGVkRXZlbnQ6Vy5lYSxNZWRpYUtl
+eU1lc3NhZ2VFdmVudDpXLmVhLE1lZGlhUXVlcnlMaXN0RXZlbnQ6Vy5lYSxNZWRpYVN0cmVhbUV2ZW50
+OlcuZWEsTWVkaWFTdHJlYW1UcmFja0V2ZW50OlcuZWEsTWVzc2FnZUV2ZW50OlcuZWEsTUlESUNvbm5l
+Y3Rpb25FdmVudDpXLmVhLE1JRElNZXNzYWdlRXZlbnQ6Vy5lYSxNdXRhdGlvbkV2ZW50OlcuZWEsTm90
+aWZpY2F0aW9uRXZlbnQ6Vy5lYSxQYWdlVHJhbnNpdGlvbkV2ZW50OlcuZWEsUGF5bWVudFJlcXVlc3RF
+dmVudDpXLmVhLFBheW1lbnRSZXF1ZXN0VXBkYXRlRXZlbnQ6Vy5lYSxQb3BTdGF0ZUV2ZW50OlcuZWEs
+UHJlc2VudGF0aW9uQ29ubmVjdGlvbkF2YWlsYWJsZUV2ZW50OlcuZWEsUHJlc2VudGF0aW9uQ29ubmVj
+dGlvbkNsb3NlRXZlbnQ6Vy5lYSxQcm9taXNlUmVqZWN0aW9uRXZlbnQ6Vy5lYSxQdXNoRXZlbnQ6Vy5l
+YSxSVENEYXRhQ2hhbm5lbEV2ZW50OlcuZWEsUlRDRFRNRlRvbmVDaGFuZ2VFdmVudDpXLmVhLFJUQ1Bl
+ZXJDb25uZWN0aW9uSWNlRXZlbnQ6Vy5lYSxSVENUcmFja0V2ZW50OlcuZWEsU2VjdXJpdHlQb2xpY3lW
+aW9sYXRpb25FdmVudDpXLmVhLFNlbnNvckVycm9yRXZlbnQ6Vy5lYSxTcGVlY2hSZWNvZ25pdGlvbkVy
+cm9yOlcuZWEsU3BlZWNoUmVjb2duaXRpb25FdmVudDpXLmVhLFNwZWVjaFN5bnRoZXNpc0V2ZW50Olcu
+ZWEsU3RvcmFnZUV2ZW50OlcuZWEsU3luY0V2ZW50OlcuZWEsVHJhY2tFdmVudDpXLmVhLFRyYW5zaXRp
+b25FdmVudDpXLmVhLFdlYktpdFRyYW5zaXRpb25FdmVudDpXLmVhLFZSRGV2aWNlRXZlbnQ6Vy5lYSxW
+UkRpc3BsYXlFdmVudDpXLmVhLFZSU2Vzc2lvbkV2ZW50OlcuZWEsTW9qb0ludGVyZmFjZVJlcXVlc3RF
+dmVudDpXLmVhLFVTQkNvbm5lY3Rpb25FdmVudDpXLmVhLElEQlZlcnNpb25DaGFuZ2VFdmVudDpXLmVh
+LEF1ZGlvUHJvY2Vzc2luZ0V2ZW50OlcuZWEsT2ZmbGluZUF1ZGlvQ29tcGxldGlvbkV2ZW50OlcuZWEs
+V2ViR0xDb250ZXh0RXZlbnQ6Vy5lYSxFdmVudDpXLmVhLElucHV0RXZlbnQ6Vy5lYSxTdWJtaXRFdmVu
+dDpXLmVhLEV2ZW50VGFyZ2V0OlcuRDAsRmlsZTpXLmhILEhUTUxGb3JtRWxlbWVudDpXLmg0LEhpc3Rv
+cnk6Vy5icixIVE1MRG9jdW1lbnQ6Vy5WYixYTUxIdHRwUmVxdWVzdDpXLmZKLFhNTEh0dHBSZXF1ZXN0
+RXZlbnRUYXJnZXQ6Vy53YSxJbWFnZURhdGE6Vy5TZyxMb2NhdGlvbjpXLnU4LE1vdXNlRXZlbnQ6Vy5B
+aixEcmFnRXZlbnQ6Vy5BaixQb2ludGVyRXZlbnQ6Vy5BaixXaGVlbEV2ZW50OlcuQWosRG9jdW1lbnRG
+cmFnbWVudDpXLnVILFNoYWRvd1Jvb3Q6Vy51SCxEb2N1bWVudFR5cGU6Vy51SCxOb2RlOlcudUgsTm9k
+ZUxpc3Q6Vy5CSCxSYWRpb05vZGVMaXN0OlcuQkgsSFRNTFBhcmFncmFwaEVsZW1lbnQ6Vy5TTixQcm9n
+cmVzc0V2ZW50OlcuZXcsUmVzb3VyY2VQcm9ncmVzc0V2ZW50OlcuZXcsSFRNTFNlbGVjdEVsZW1lbnQ6
+Vy5scCxIVE1MVGFibGVFbGVtZW50OlcuVGIsSFRNTFRhYmxlUm93RWxlbWVudDpXLkl2LEhUTUxUYWJs
+ZVNlY3Rpb25FbGVtZW50OlcuV1AsSFRNTFRlbXBsYXRlRWxlbWVudDpXLnlZLENvbXBvc2l0aW9uRXZl
+bnQ6Vy53NixGb2N1c0V2ZW50OlcudzYsS2V5Ym9hcmRFdmVudDpXLnc2LFRleHRFdmVudDpXLnc2LFRv
+dWNoRXZlbnQ6Vy53NixVSUV2ZW50OlcudzYsV2luZG93OlcuSzUsRE9NV2luZG93OlcuSzUsRGVkaWNh
+dGVkV29ya2VyR2xvYmFsU2NvcGU6Vy5DbSxTZXJ2aWNlV29ya2VyR2xvYmFsU2NvcGU6Vy5DbSxTaGFy
+ZWRXb3JrZXJHbG9iYWxTY29wZTpXLkNtLFdvcmtlckdsb2JhbFNjb3BlOlcuQ20sQXR0cjpXLkNRLENs
+aWVudFJlY3Q6Vy53NCxET01SZWN0OlcudzQsTmFtZWROb2RlTWFwOlcucmgsTW96TmFtZWRBdHRyTWFw
+OlcucmgsSURCS2V5UmFuZ2U6UC5oRixTVkdTY3JpcHRFbGVtZW50OlAubmQsU1ZHQUVsZW1lbnQ6UC5o
+aSxTVkdBbmltYXRlRWxlbWVudDpQLmhpLFNWR0FuaW1hdGVNb3Rpb25FbGVtZW50OlAuaGksU1ZHQW5p
+bWF0ZVRyYW5zZm9ybUVsZW1lbnQ6UC5oaSxTVkdBbmltYXRpb25FbGVtZW50OlAuaGksU1ZHQ2lyY2xl
+RWxlbWVudDpQLmhpLFNWR0NsaXBQYXRoRWxlbWVudDpQLmhpLFNWR0RlZnNFbGVtZW50OlAuaGksU1ZH
+RGVzY0VsZW1lbnQ6UC5oaSxTVkdEaXNjYXJkRWxlbWVudDpQLmhpLFNWR0VsbGlwc2VFbGVtZW50OlAu
+aGksU1ZHRkVCbGVuZEVsZW1lbnQ6UC5oaSxTVkdGRUNvbG9yTWF0cml4RWxlbWVudDpQLmhpLFNWR0ZF
+Q29tcG9uZW50VHJhbnNmZXJFbGVtZW50OlAuaGksU1ZHRkVDb21wb3NpdGVFbGVtZW50OlAuaGksU1ZH
+RkVDb252b2x2ZU1hdHJpeEVsZW1lbnQ6UC5oaSxTVkdGRURpZmZ1c2VMaWdodGluZ0VsZW1lbnQ6UC5o
+aSxTVkdGRURpc3BsYWNlbWVudE1hcEVsZW1lbnQ6UC5oaSxTVkdGRURpc3RhbnRMaWdodEVsZW1lbnQ6
+UC5oaSxTVkdGRUZsb29kRWxlbWVudDpQLmhpLFNWR0ZFRnVuY0FFbGVtZW50OlAuaGksU1ZHRkVGdW5j
+QkVsZW1lbnQ6UC5oaSxTVkdGRUZ1bmNHRWxlbWVudDpQLmhpLFNWR0ZFRnVuY1JFbGVtZW50OlAuaGks
+U1ZHRkVHYXVzc2lhbkJsdXJFbGVtZW50OlAuaGksU1ZHRkVJbWFnZUVsZW1lbnQ6UC5oaSxTVkdGRU1l
+cmdlRWxlbWVudDpQLmhpLFNWR0ZFTWVyZ2VOb2RlRWxlbWVudDpQLmhpLFNWR0ZFTW9ycGhvbG9neUVs
+ZW1lbnQ6UC5oaSxTVkdGRU9mZnNldEVsZW1lbnQ6UC5oaSxTVkdGRVBvaW50TGlnaHRFbGVtZW50OlAu
+aGksU1ZHRkVTcGVjdWxhckxpZ2h0aW5nRWxlbWVudDpQLmhpLFNWR0ZFU3BvdExpZ2h0RWxlbWVudDpQ
+LmhpLFNWR0ZFVGlsZUVsZW1lbnQ6UC5oaSxTVkdGRVR1cmJ1bGVuY2VFbGVtZW50OlAuaGksU1ZHRmls
+dGVyRWxlbWVudDpQLmhpLFNWR0ZvcmVpZ25PYmplY3RFbGVtZW50OlAuaGksU1ZHR0VsZW1lbnQ6UC5o
+aSxTVkdHZW9tZXRyeUVsZW1lbnQ6UC5oaSxTVkdHcmFwaGljc0VsZW1lbnQ6UC5oaSxTVkdJbWFnZUVs
+ZW1lbnQ6UC5oaSxTVkdMaW5lRWxlbWVudDpQLmhpLFNWR0xpbmVhckdyYWRpZW50RWxlbWVudDpQLmhp
+LFNWR01hcmtlckVsZW1lbnQ6UC5oaSxTVkdNYXNrRWxlbWVudDpQLmhpLFNWR01ldGFkYXRhRWxlbWVu
+dDpQLmhpLFNWR1BhdGhFbGVtZW50OlAuaGksU1ZHUGF0dGVybkVsZW1lbnQ6UC5oaSxTVkdQb2x5Z29u
+RWxlbWVudDpQLmhpLFNWR1BvbHlsaW5lRWxlbWVudDpQLmhpLFNWR1JhZGlhbEdyYWRpZW50RWxlbWVu
+dDpQLmhpLFNWR1JlY3RFbGVtZW50OlAuaGksU1ZHU2V0RWxlbWVudDpQLmhpLFNWR1N0b3BFbGVtZW50
+OlAuaGksU1ZHU3R5bGVFbGVtZW50OlAuaGksU1ZHU1ZHRWxlbWVudDpQLmhpLFNWR1N3aXRjaEVsZW1l
+bnQ6UC5oaSxTVkdTeW1ib2xFbGVtZW50OlAuaGksU1ZHVFNwYW5FbGVtZW50OlAuaGksU1ZHVGV4dENv
+bnRlbnRFbGVtZW50OlAuaGksU1ZHVGV4dEVsZW1lbnQ6UC5oaSxTVkdUZXh0UGF0aEVsZW1lbnQ6UC5o
+aSxTVkdUZXh0UG9zaXRpb25pbmdFbGVtZW50OlAuaGksU1ZHVGl0bGVFbGVtZW50OlAuaGksU1ZHVXNl
+RWxlbWVudDpQLmhpLFNWR1ZpZXdFbGVtZW50OlAuaGksU1ZHR3JhZGllbnRFbGVtZW50OlAuaGksU1ZH
+Q29tcG9uZW50VHJhbnNmZXJGdW5jdGlvbkVsZW1lbnQ6UC5oaSxTVkdGRURyb3BTaGFkb3dFbGVtZW50
+OlAuaGksU1ZHTVBhdGhFbGVtZW50OlAuaGksU1ZHRWxlbWVudDpQLmhpfSkKaHVua0hlbHBlcnMuc2V0
+T3JVcGRhdGVMZWFmVGFncyh7RE9NRXJyb3I6dHJ1ZSxNZWRpYUVycm9yOnRydWUsTmF2aWdhdG9yOnRy
+dWUsTmF2aWdhdG9yQ29uY3VycmVudEhhcmR3YXJlOnRydWUsTmF2aWdhdG9yVXNlck1lZGlhRXJyb3I6
+dHJ1ZSxPdmVyY29uc3RyYWluZWRFcnJvcjp0cnVlLFBvc2l0aW9uRXJyb3I6dHJ1ZSxSYW5nZTp0cnVl
+LFNRTEVycm9yOnRydWUsRGF0YVZpZXc6dHJ1ZSxBcnJheUJ1ZmZlclZpZXc6ZmFsc2UsRmxvYXQzMkFy
+cmF5OnRydWUsRmxvYXQ2NEFycmF5OnRydWUsSW50MTZBcnJheTp0cnVlLEludDMyQXJyYXk6dHJ1ZSxJ
+bnQ4QXJyYXk6dHJ1ZSxVaW50MTZBcnJheTp0cnVlLFVpbnQzMkFycmF5OnRydWUsVWludDhDbGFtcGVk
+QXJyYXk6dHJ1ZSxDYW52YXNQaXhlbEFycmF5OnRydWUsVWludDhBcnJheTpmYWxzZSxIVE1MQXVkaW9F
+bGVtZW50OnRydWUsSFRNTEJSRWxlbWVudDp0cnVlLEhUTUxCdXR0b25FbGVtZW50OnRydWUsSFRNTENh
+bnZhc0VsZW1lbnQ6dHJ1ZSxIVE1MQ29udGVudEVsZW1lbnQ6dHJ1ZSxIVE1MRExpc3RFbGVtZW50OnRy
+dWUsSFRNTERhdGFFbGVtZW50OnRydWUsSFRNTERhdGFMaXN0RWxlbWVudDp0cnVlLEhUTUxEZXRhaWxz
+RWxlbWVudDp0cnVlLEhUTUxEaWFsb2dFbGVtZW50OnRydWUsSFRNTERpdkVsZW1lbnQ6dHJ1ZSxIVE1M
+RW1iZWRFbGVtZW50OnRydWUsSFRNTEZpZWxkU2V0RWxlbWVudDp0cnVlLEhUTUxIUkVsZW1lbnQ6dHJ1
+ZSxIVE1MSGVhZEVsZW1lbnQ6dHJ1ZSxIVE1MSGVhZGluZ0VsZW1lbnQ6dHJ1ZSxIVE1MSHRtbEVsZW1l
+bnQ6dHJ1ZSxIVE1MSUZyYW1lRWxlbWVudDp0cnVlLEhUTUxJbWFnZUVsZW1lbnQ6dHJ1ZSxIVE1MSW5w
+dXRFbGVtZW50OnRydWUsSFRNTExJRWxlbWVudDp0cnVlLEhUTUxMYWJlbEVsZW1lbnQ6dHJ1ZSxIVE1M
+TGVnZW5kRWxlbWVudDp0cnVlLEhUTUxMaW5rRWxlbWVudDp0cnVlLEhUTUxNYXBFbGVtZW50OnRydWUs
+SFRNTE1lZGlhRWxlbWVudDp0cnVlLEhUTUxNZW51RWxlbWVudDp0cnVlLEhUTUxNZXRhRWxlbWVudDp0
+cnVlLEhUTUxNZXRlckVsZW1lbnQ6dHJ1ZSxIVE1MTW9kRWxlbWVudDp0cnVlLEhUTUxPTGlzdEVsZW1l
+bnQ6dHJ1ZSxIVE1MT2JqZWN0RWxlbWVudDp0cnVlLEhUTUxPcHRHcm91cEVsZW1lbnQ6dHJ1ZSxIVE1M
+T3B0aW9uRWxlbWVudDp0cnVlLEhUTUxPdXRwdXRFbGVtZW50OnRydWUsSFRNTFBhcmFtRWxlbWVudDp0
+cnVlLEhUTUxQaWN0dXJlRWxlbWVudDp0cnVlLEhUTUxQcmVFbGVtZW50OnRydWUsSFRNTFByb2dyZXNz
+RWxlbWVudDp0cnVlLEhUTUxRdW90ZUVsZW1lbnQ6dHJ1ZSxIVE1MU2NyaXB0RWxlbWVudDp0cnVlLEhU
+TUxTaGFkb3dFbGVtZW50OnRydWUsSFRNTFNsb3RFbGVtZW50OnRydWUsSFRNTFNvdXJjZUVsZW1lbnQ6
+dHJ1ZSxIVE1MU3BhbkVsZW1lbnQ6dHJ1ZSxIVE1MU3R5bGVFbGVtZW50OnRydWUsSFRNTFRhYmxlQ2Fw
+dGlvbkVsZW1lbnQ6dHJ1ZSxIVE1MVGFibGVDZWxsRWxlbWVudDp0cnVlLEhUTUxUYWJsZURhdGFDZWxs
+RWxlbWVudDp0cnVlLEhUTUxUYWJsZUhlYWRlckNlbGxFbGVtZW50OnRydWUsSFRNTFRhYmxlQ29sRWxl
+bWVudDp0cnVlLEhUTUxUZXh0QXJlYUVsZW1lbnQ6dHJ1ZSxIVE1MVGltZUVsZW1lbnQ6dHJ1ZSxIVE1M
+VGl0bGVFbGVtZW50OnRydWUsSFRNTFRyYWNrRWxlbWVudDp0cnVlLEhUTUxVTGlzdEVsZW1lbnQ6dHJ1
+ZSxIVE1MVW5rbm93bkVsZW1lbnQ6dHJ1ZSxIVE1MVmlkZW9FbGVtZW50OnRydWUsSFRNTERpcmVjdG9y
+eUVsZW1lbnQ6dHJ1ZSxIVE1MRm9udEVsZW1lbnQ6dHJ1ZSxIVE1MRnJhbWVFbGVtZW50OnRydWUsSFRN
+TEZyYW1lU2V0RWxlbWVudDp0cnVlLEhUTUxNYXJxdWVlRWxlbWVudDp0cnVlLEhUTUxFbGVtZW50OmZh
+bHNlLEhUTUxBbmNob3JFbGVtZW50OnRydWUsSFRNTEFyZWFFbGVtZW50OnRydWUsSFRNTEJhc2VFbGVt
+ZW50OnRydWUsQmxvYjpmYWxzZSxIVE1MQm9keUVsZW1lbnQ6dHJ1ZSxDREFUQVNlY3Rpb246dHJ1ZSxD
+aGFyYWN0ZXJEYXRhOnRydWUsQ29tbWVudDp0cnVlLFByb2Nlc3NpbmdJbnN0cnVjdGlvbjp0cnVlLFRl
+eHQ6dHJ1ZSxDU1NTdHlsZURlY2xhcmF0aW9uOnRydWUsTVNTdHlsZUNTU1Byb3BlcnRpZXM6dHJ1ZSxD
+U1MyUHJvcGVydGllczp0cnVlLFhNTERvY3VtZW50OnRydWUsRG9jdW1lbnQ6ZmFsc2UsRE9NRXhjZXB0
+aW9uOnRydWUsRE9NSW1wbGVtZW50YXRpb246dHJ1ZSxET01SZWN0UmVhZE9ubHk6ZmFsc2UsRE9NVG9r
+ZW5MaXN0OnRydWUsRWxlbWVudDpmYWxzZSxBYm9ydFBheW1lbnRFdmVudDp0cnVlLEFuaW1hdGlvbkV2
+ZW50OnRydWUsQW5pbWF0aW9uUGxheWJhY2tFdmVudDp0cnVlLEFwcGxpY2F0aW9uQ2FjaGVFcnJvckV2
+ZW50OnRydWUsQmFja2dyb3VuZEZldGNoQ2xpY2tFdmVudDp0cnVlLEJhY2tncm91bmRGZXRjaEV2ZW50
+OnRydWUsQmFja2dyb3VuZEZldGNoRmFpbEV2ZW50OnRydWUsQmFja2dyb3VuZEZldGNoZWRFdmVudDp0
+cnVlLEJlZm9yZUluc3RhbGxQcm9tcHRFdmVudDp0cnVlLEJlZm9yZVVubG9hZEV2ZW50OnRydWUsQmxv
+YkV2ZW50OnRydWUsQ2FuTWFrZVBheW1lbnRFdmVudDp0cnVlLENsaXBib2FyZEV2ZW50OnRydWUsQ2xv
+c2VFdmVudDp0cnVlLEN1c3RvbUV2ZW50OnRydWUsRGV2aWNlTW90aW9uRXZlbnQ6dHJ1ZSxEZXZpY2VP
+cmllbnRhdGlvbkV2ZW50OnRydWUsRXJyb3JFdmVudDp0cnVlLEV4dGVuZGFibGVFdmVudDp0cnVlLEV4
+dGVuZGFibGVNZXNzYWdlRXZlbnQ6dHJ1ZSxGZXRjaEV2ZW50OnRydWUsRm9udEZhY2VTZXRMb2FkRXZl
+bnQ6dHJ1ZSxGb3JlaWduRmV0Y2hFdmVudDp0cnVlLEdhbWVwYWRFdmVudDp0cnVlLEhhc2hDaGFuZ2VF
+dmVudDp0cnVlLEluc3RhbGxFdmVudDp0cnVlLE1lZGlhRW5jcnlwdGVkRXZlbnQ6dHJ1ZSxNZWRpYUtl
+eU1lc3NhZ2VFdmVudDp0cnVlLE1lZGlhUXVlcnlMaXN0RXZlbnQ6dHJ1ZSxNZWRpYVN0cmVhbUV2ZW50
+OnRydWUsTWVkaWFTdHJlYW1UcmFja0V2ZW50OnRydWUsTWVzc2FnZUV2ZW50OnRydWUsTUlESUNvbm5l
+Y3Rpb25FdmVudDp0cnVlLE1JRElNZXNzYWdlRXZlbnQ6dHJ1ZSxNdXRhdGlvbkV2ZW50OnRydWUsTm90
+aWZpY2F0aW9uRXZlbnQ6dHJ1ZSxQYWdlVHJhbnNpdGlvbkV2ZW50OnRydWUsUGF5bWVudFJlcXVlc3RF
+dmVudDp0cnVlLFBheW1lbnRSZXF1ZXN0VXBkYXRlRXZlbnQ6dHJ1ZSxQb3BTdGF0ZUV2ZW50OnRydWUs
+UHJlc2VudGF0aW9uQ29ubmVjdGlvbkF2YWlsYWJsZUV2ZW50OnRydWUsUHJlc2VudGF0aW9uQ29ubmVj
+dGlvbkNsb3NlRXZlbnQ6dHJ1ZSxQcm9taXNlUmVqZWN0aW9uRXZlbnQ6dHJ1ZSxQdXNoRXZlbnQ6dHJ1
+ZSxSVENEYXRhQ2hhbm5lbEV2ZW50OnRydWUsUlRDRFRNRlRvbmVDaGFuZ2VFdmVudDp0cnVlLFJUQ1Bl
+ZXJDb25uZWN0aW9uSWNlRXZlbnQ6dHJ1ZSxSVENUcmFja0V2ZW50OnRydWUsU2VjdXJpdHlQb2xpY3lW
+aW9sYXRpb25FdmVudDp0cnVlLFNlbnNvckVycm9yRXZlbnQ6dHJ1ZSxTcGVlY2hSZWNvZ25pdGlvbkVy
+cm9yOnRydWUsU3BlZWNoUmVjb2duaXRpb25FdmVudDp0cnVlLFNwZWVjaFN5bnRoZXNpc0V2ZW50OnRy
+dWUsU3RvcmFnZUV2ZW50OnRydWUsU3luY0V2ZW50OnRydWUsVHJhY2tFdmVudDp0cnVlLFRyYW5zaXRp
+b25FdmVudDp0cnVlLFdlYktpdFRyYW5zaXRpb25FdmVudDp0cnVlLFZSRGV2aWNlRXZlbnQ6dHJ1ZSxW
+UkRpc3BsYXlFdmVudDp0cnVlLFZSU2Vzc2lvbkV2ZW50OnRydWUsTW9qb0ludGVyZmFjZVJlcXVlc3RF
+dmVudDp0cnVlLFVTQkNvbm5lY3Rpb25FdmVudDp0cnVlLElEQlZlcnNpb25DaGFuZ2VFdmVudDp0cnVl
+LEF1ZGlvUHJvY2Vzc2luZ0V2ZW50OnRydWUsT2ZmbGluZUF1ZGlvQ29tcGxldGlvbkV2ZW50OnRydWUs
+V2ViR0xDb250ZXh0RXZlbnQ6dHJ1ZSxFdmVudDpmYWxzZSxJbnB1dEV2ZW50OmZhbHNlLFN1Ym1pdEV2
+ZW50OmZhbHNlLEV2ZW50VGFyZ2V0OmZhbHNlLEZpbGU6dHJ1ZSxIVE1MRm9ybUVsZW1lbnQ6dHJ1ZSxI
+aXN0b3J5OnRydWUsSFRNTERvY3VtZW50OnRydWUsWE1MSHR0cFJlcXVlc3Q6dHJ1ZSxYTUxIdHRwUmVx
+dWVzdEV2ZW50VGFyZ2V0OmZhbHNlLEltYWdlRGF0YTp0cnVlLExvY2F0aW9uOnRydWUsTW91c2VFdmVu
+dDp0cnVlLERyYWdFdmVudDp0cnVlLFBvaW50ZXJFdmVudDp0cnVlLFdoZWVsRXZlbnQ6dHJ1ZSxEb2N1
+bWVudEZyYWdtZW50OnRydWUsU2hhZG93Um9vdDp0cnVlLERvY3VtZW50VHlwZTp0cnVlLE5vZGU6ZmFs
+c2UsTm9kZUxpc3Q6dHJ1ZSxSYWRpb05vZGVMaXN0OnRydWUsSFRNTFBhcmFncmFwaEVsZW1lbnQ6dHJ1
+ZSxQcm9ncmVzc0V2ZW50OnRydWUsUmVzb3VyY2VQcm9ncmVzc0V2ZW50OnRydWUsSFRNTFNlbGVjdEVs
+ZW1lbnQ6dHJ1ZSxIVE1MVGFibGVFbGVtZW50OnRydWUsSFRNTFRhYmxlUm93RWxlbWVudDp0cnVlLEhU
+TUxUYWJsZVNlY3Rpb25FbGVtZW50OnRydWUsSFRNTFRlbXBsYXRlRWxlbWVudDp0cnVlLENvbXBvc2l0
+aW9uRXZlbnQ6dHJ1ZSxGb2N1c0V2ZW50OnRydWUsS2V5Ym9hcmRFdmVudDp0cnVlLFRleHRFdmVudDp0
+cnVlLFRvdWNoRXZlbnQ6dHJ1ZSxVSUV2ZW50OmZhbHNlLFdpbmRvdzp0cnVlLERPTVdpbmRvdzp0cnVl
+LERlZGljYXRlZFdvcmtlckdsb2JhbFNjb3BlOnRydWUsU2VydmljZVdvcmtlckdsb2JhbFNjb3BlOnRy
+dWUsU2hhcmVkV29ya2VyR2xvYmFsU2NvcGU6dHJ1ZSxXb3JrZXJHbG9iYWxTY29wZTp0cnVlLEF0dHI6
+dHJ1ZSxDbGllbnRSZWN0OnRydWUsRE9NUmVjdDp0cnVlLE5hbWVkTm9kZU1hcDp0cnVlLE1vek5hbWVk
+QXR0ck1hcDp0cnVlLElEQktleVJhbmdlOnRydWUsU1ZHU2NyaXB0RWxlbWVudDp0cnVlLFNWR0FFbGVt
+ZW50OnRydWUsU1ZHQW5pbWF0ZUVsZW1lbnQ6dHJ1ZSxTVkdBbmltYXRlTW90aW9uRWxlbWVudDp0cnVl
+LFNWR0FuaW1hdGVUcmFuc2Zvcm1FbGVtZW50OnRydWUsU1ZHQW5pbWF0aW9uRWxlbWVudDp0cnVlLFNW
+R0NpcmNsZUVsZW1lbnQ6dHJ1ZSxTVkdDbGlwUGF0aEVsZW1lbnQ6dHJ1ZSxTVkdEZWZzRWxlbWVudDp0
+cnVlLFNWR0Rlc2NFbGVtZW50OnRydWUsU1ZHRGlzY2FyZEVsZW1lbnQ6dHJ1ZSxTVkdFbGxpcHNlRWxl
+bWVudDp0cnVlLFNWR0ZFQmxlbmRFbGVtZW50OnRydWUsU1ZHRkVDb2xvck1hdHJpeEVsZW1lbnQ6dHJ1
+ZSxTVkdGRUNvbXBvbmVudFRyYW5zZmVyRWxlbWVudDp0cnVlLFNWR0ZFQ29tcG9zaXRlRWxlbWVudDp0
+cnVlLFNWR0ZFQ29udm9sdmVNYXRyaXhFbGVtZW50OnRydWUsU1ZHRkVEaWZmdXNlTGlnaHRpbmdFbGVt
+ZW50OnRydWUsU1ZHRkVEaXNwbGFjZW1lbnRNYXBFbGVtZW50OnRydWUsU1ZHRkVEaXN0YW50TGlnaHRF
+bGVtZW50OnRydWUsU1ZHRkVGbG9vZEVsZW1lbnQ6dHJ1ZSxTVkdGRUZ1bmNBRWxlbWVudDp0cnVlLFNW
+R0ZFRnVuY0JFbGVtZW50OnRydWUsU1ZHRkVGdW5jR0VsZW1lbnQ6dHJ1ZSxTVkdGRUZ1bmNSRWxlbWVu
+dDp0cnVlLFNWR0ZFR2F1c3NpYW5CbHVyRWxlbWVudDp0cnVlLFNWR0ZFSW1hZ2VFbGVtZW50OnRydWUs
+U1ZHRkVNZXJnZUVsZW1lbnQ6dHJ1ZSxTVkdGRU1lcmdlTm9kZUVsZW1lbnQ6dHJ1ZSxTVkdGRU1vcnBo
+b2xvZ3lFbGVtZW50OnRydWUsU1ZHRkVPZmZzZXRFbGVtZW50OnRydWUsU1ZHRkVQb2ludExpZ2h0RWxl
+bWVudDp0cnVlLFNWR0ZFU3BlY3VsYXJMaWdodGluZ0VsZW1lbnQ6dHJ1ZSxTVkdGRVNwb3RMaWdodEVs
+ZW1lbnQ6dHJ1ZSxTVkdGRVRpbGVFbGVtZW50OnRydWUsU1ZHRkVUdXJidWxlbmNlRWxlbWVudDp0cnVl
+LFNWR0ZpbHRlckVsZW1lbnQ6dHJ1ZSxTVkdGb3JlaWduT2JqZWN0RWxlbWVudDp0cnVlLFNWR0dFbGVt
+ZW50OnRydWUsU1ZHR2VvbWV0cnlFbGVtZW50OnRydWUsU1ZHR3JhcGhpY3NFbGVtZW50OnRydWUsU1ZH
+SW1hZ2VFbGVtZW50OnRydWUsU1ZHTGluZUVsZW1lbnQ6dHJ1ZSxTVkdMaW5lYXJHcmFkaWVudEVsZW1l
+bnQ6dHJ1ZSxTVkdNYXJrZXJFbGVtZW50OnRydWUsU1ZHTWFza0VsZW1lbnQ6dHJ1ZSxTVkdNZXRhZGF0
+YUVsZW1lbnQ6dHJ1ZSxTVkdQYXRoRWxlbWVudDp0cnVlLFNWR1BhdHRlcm5FbGVtZW50OnRydWUsU1ZH
+UG9seWdvbkVsZW1lbnQ6dHJ1ZSxTVkdQb2x5bGluZUVsZW1lbnQ6dHJ1ZSxTVkdSYWRpYWxHcmFkaWVu
+dEVsZW1lbnQ6dHJ1ZSxTVkdSZWN0RWxlbWVudDp0cnVlLFNWR1NldEVsZW1lbnQ6dHJ1ZSxTVkdTdG9w
+RWxlbWVudDp0cnVlLFNWR1N0eWxlRWxlbWVudDp0cnVlLFNWR1NWR0VsZW1lbnQ6dHJ1ZSxTVkdTd2l0
+Y2hFbGVtZW50OnRydWUsU1ZHU3ltYm9sRWxlbWVudDp0cnVlLFNWR1RTcGFuRWxlbWVudDp0cnVlLFNW
+R1RleHRDb250ZW50RWxlbWVudDp0cnVlLFNWR1RleHRFbGVtZW50OnRydWUsU1ZHVGV4dFBhdGhFbGVt
+ZW50OnRydWUsU1ZHVGV4dFBvc2l0aW9uaW5nRWxlbWVudDp0cnVlLFNWR1RpdGxlRWxlbWVudDp0cnVl
+LFNWR1VzZUVsZW1lbnQ6dHJ1ZSxTVkdWaWV3RWxlbWVudDp0cnVlLFNWR0dyYWRpZW50RWxlbWVudDp0
+cnVlLFNWR0NvbXBvbmVudFRyYW5zZmVyRnVuY3Rpb25FbGVtZW50OnRydWUsU1ZHRkVEcm9wU2hhZG93
+RWxlbWVudDp0cnVlLFNWR01QYXRoRWxlbWVudDp0cnVlLFNWR0VsZW1lbnQ6ZmFsc2V9KQpILlhILiRu
+YXRpdmVTdXBlcmNsYXNzVGFnPSJBcnJheUJ1ZmZlclZpZXciCkguUkcuJG5hdGl2ZVN1cGVyY2xhc3NU
+YWc9IkFycmF5QnVmZmVyVmlldyIKSC5WUC4kbmF0aXZlU3VwZXJjbGFzc1RhZz0iQXJyYXlCdWZmZXJW
+aWV3IgpILkRnLiRuYXRpdmVTdXBlcmNsYXNzVGFnPSJBcnJheUJ1ZmZlclZpZXciCkguV0IuJG5hdGl2
+ZVN1cGVyY2xhc3NUYWc9IkFycmF5QnVmZmVyVmlldyIKSC5aRy4kbmF0aXZlU3VwZXJjbGFzc1RhZz0i
+QXJyYXlCdWZmZXJWaWV3IgpILlBnLiRuYXRpdmVTdXBlcmNsYXNzVGFnPSJBcnJheUJ1ZmZlclZpZXci
+fSkoKQpjb252ZXJ0QWxsVG9GYXN0T2JqZWN0KHcpCmNvbnZlcnRUb0Zhc3RPYmplY3QoJCk7KGZ1bmN0
+aW9uKGEpe2lmKHR5cGVvZiBkb2N1bWVudD09PSJ1bmRlZmluZWQiKXthKG51bGwpCnJldHVybn1pZih0
+eXBlb2YgZG9jdW1lbnQuY3VycmVudFNjcmlwdCE9J3VuZGVmaW5lZCcpe2EoZG9jdW1lbnQuY3VycmVu
+dFNjcmlwdCkKcmV0dXJufXZhciBzPWRvY3VtZW50LnNjcmlwdHMKZnVuY3Rpb24gb25Mb2FkKGIpe2Zv
+cih2YXIgcT0wO3E8cy5sZW5ndGg7KytxKXNbcV0ucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZCIsb25M
+b2FkLGZhbHNlKQphKGIudGFyZ2V0KX1mb3IodmFyIHI9MDtyPHMubGVuZ3RoOysrcilzW3JdLmFkZEV2
+ZW50TGlzdGVuZXIoImxvYWQiLG9uTG9hZCxmYWxzZSl9KShmdW5jdGlvbihhKXt2LmN1cnJlbnRTY3Jp
+cHQ9YQppZih0eXBlb2YgZGFydE1haW5SdW5uZXI9PT0iZnVuY3Rpb24iKWRhcnRNYWluUnVubmVyKEwu
+SXEsW10pCmVsc2UgTC5JcShbXSl9KX0pKCkKLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWlncmF0aW9uLmpz
+Lm1hcAo=
 ''';
diff --git a/pkg/nnbd_migration/lib/src/front_end/unit_renderer.dart b/pkg/nnbd_migration/lib/src/front_end/unit_renderer.dart
index fbd5c8d..cddd307 100644
--- a/pkg/nnbd_migration/lib/src/front_end/unit_renderer.dart
+++ b/pkg/nnbd_migration/lib/src/front_end/unit_renderer.dart
@@ -23,6 +23,7 @@
   /// "proposed edits" area, in the order in which they should be displayed.
   @visibleForTesting
   static const List<NullabilityFixKind> kindPriorityOrder = [
+    NullabilityFixKind.noValidMigrationForNull,
     NullabilityFixKind.compoundAssignmentHasBadCombinedType,
     NullabilityFixKind.compoundAssignmentHasNullableSource,
     NullabilityFixKind.removeDeadCode,
@@ -31,6 +32,7 @@
     NullabilityFixKind.nullAwareAssignmentUnnecessaryInStrongMode,
     NullabilityFixKind.nullAwarenessUnnecessaryInStrongMode,
     NullabilityFixKind.otherCastExpression,
+    NullabilityFixKind.changeMethodName,
     NullabilityFixKind.checkExpression,
     NullabilityFixKind.addRequired,
     NullabilityFixKind.makeTypeNullable,
@@ -41,8 +43,10 @@
     NullabilityFixKind.addLate,
     NullabilityFixKind.addLateDueToTestSetup,
     NullabilityFixKind.addLateDueToHint,
+    NullabilityFixKind.addLateFinalDueToHint,
     NullabilityFixKind.checkExpressionDueToHint,
     NullabilityFixKind.makeTypeNullableDueToHint,
+    NullabilityFixKind.addImport,
     NullabilityFixKind.removeLanguageVersionComment
   ];
 
@@ -182,38 +186,48 @@
   /// HTML-escaped.
   String _computeRegionContent(UnitInfo unit) {
     var content = unitInfo.content;
-    var regions = StringBuffer();
+    var rows = <String>[];
+    var currentTextCell = StringBuffer();
+    bool isAddedLine = false;
     var lineNumber = 1;
 
+    void finishRow(bool isAddedText) {
+      var line = currentTextCell?.toString();
+      if (isAddedLine) {
+        rows.add('<tr><td class="line-no">(new)</td><td>$line</td></tr>');
+      } else {
+        rows.add('<tr><td class="line-no">$lineNumber</td>'
+            '<td class="line-$lineNumber">$line</td></tr>');
+        lineNumber++;
+      }
+      currentTextCell = StringBuffer();
+      isAddedLine = isAddedText;
+    }
+
     void writeSplitLines(
       String lines, {
       String perLineOpeningTag = '',
       String perLineClosingTag = '',
+      bool isAddedText = false,
     }) {
       var lineIterator = LineSplitter.split(lines).iterator;
       lineIterator.moveNext();
 
       while (true) {
-        regions.write(perLineOpeningTag);
-        regions.write(_htmlEscape.convert(lineIterator.current));
-        regions.write(perLineClosingTag);
+        currentTextCell.write(perLineOpeningTag);
+        currentTextCell.write(_htmlEscape.convert(lineIterator.current));
+        currentTextCell.write(perLineClosingTag);
         if (lineIterator.moveNext()) {
-          // If we're not on the last element, end this table row, and start a
-          // new table row.
-          lineNumber++;
-          regions.write('</td></tr>'
-              '<tr><td class="line-no">$lineNumber</td>'
-              '<td class="line-$lineNumber">');
+          // If we're not on the last element, end this row, and get ready to
+          // start a new row.
+          finishRow(isAddedText);
         } else {
           break;
         }
       }
 
       if (lines.endsWith('\n')) {
-        lineNumber++;
-        regions.write('</td></tr>'
-            '<tr><td class="line-no">$lineNumber</td>'
-            '<td class="line-$lineNumber">');
+        finishRow(isAddedText);
       }
     }
 
@@ -231,8 +245,6 @@
     }
 
     var previousOffset = 0;
-    regions.write('<table data-path="${pathMapper.map(unit.path)}"><tbody>');
-    regions.write('<tr><td class="line-no">$lineNumber</td><td>');
     for (var region in unitInfo.regions) {
       var offset = region.offset;
       var length = region.length;
@@ -241,34 +253,46 @@
         writeSplitLines(content.substring(previousOffset, offset));
       }
       previousOffset = offset + length;
+      var shouldBeShown = region.kind != null;
       var regionClass = classForRegion(region.regionType);
-      var regionSpanTag = '<span class="region $regionClass" '
-          'data-offset="$offset" data-line="$lineNumber">';
+      var regionSpanTag = shouldBeShown
+          ? '<span class="region $regionClass" '
+              'data-offset="$offset" data-line="$lineNumber">'
+          : '';
       writeSplitLines(content.substring(offset, offset + length),
-          perLineOpeningTag: regionSpanTag, perLineClosingTag: '</span>');
+          perLineOpeningTag: regionSpanTag,
+          perLineClosingTag: shouldBeShown ? '</span>' : '',
+          isAddedText: region.regionType == RegionType.add);
     }
     if (previousOffset < content.length) {
       // Last region of unmodified content.
       writeSplitLines(content.substring(previousOffset));
     }
-    regions.write('</td></tr></tbody></table>');
-    return regions.toString();
+    finishRow(false);
+    return '<table data-path="${pathMapper.map(unit.path)}"><tbody>'
+        '${rows.join()}</tbody></table>';
   }
 
   String _headerForKind(NullabilityFixKind kind, int count) {
     var s = count == 1 ? '' : 's';
     var es = count == 1 ? '' : 'es';
     switch (kind) {
+      case NullabilityFixKind.addImport:
+        return '$count import$s added';
       case NullabilityFixKind.addLate:
         return '$count late keyword$s added';
       case NullabilityFixKind.addLateDueToHint:
         return '$count late hint$s converted to late keyword$s';
       case NullabilityFixKind.addLateDueToTestSetup:
         return '$count late keyword$s added, due to assignment in `setUp`';
+      case NullabilityFixKind.addLateFinalDueToHint:
+        return '$count late final hint$s converted to late and final keywords';
       case NullabilityFixKind.addRequired:
         return '$count required keyword$s added';
       case NullabilityFixKind.addType:
         return '$count type$s added';
+      case NullabilityFixKind.changeMethodName:
+        return '$count method name$s changed';
       case NullabilityFixKind.downcastExpression:
         return '$count downcast$s added';
       case NullabilityFixKind.otherCastExpression:
@@ -293,6 +317,8 @@
         return '$count type$s made nullable';
       case NullabilityFixKind.makeTypeNullableDueToHint:
         return '$count nullability hint$s converted to ?$s';
+      case NullabilityFixKind.noValidMigrationForNull:
+        return '$count literal `null`$s could not be migrated';
       case NullabilityFixKind.nullAwarenessUnnecessaryInStrongMode:
         return '$count null-aware access$es will be unnecessary in strong '
             'checking mode';
diff --git a/pkg/nnbd_migration/lib/src/front_end/web/file_details.dart b/pkg/nnbd_migration/lib/src/front_end/web/file_details.dart
index 7b140cf..1bf9e26 100644
--- a/pkg/nnbd_migration/lib/src/front_end/web/file_details.dart
+++ b/pkg/nnbd_migration/lib/src/front_end/web/file_details.dart
@@ -38,6 +38,9 @@
   /// HTML representation of the source file with links added to allow
   /// navigation through source files.
   ///
+  /// Also contains line number text and the anchors targeted by links that link
+  /// to a specific line number.
+  ///
   /// TODO(paulberry): this should be replaced by a more neutral data structure.
   final String navigationContent;
 
diff --git a/pkg/nnbd_migration/lib/src/front_end/web/migration.dart b/pkg/nnbd_migration/lib/src/front_end/web/migration.dart
index bbb473c..ec45fbb 100644
--- a/pkg/nnbd_migration/lib/src/front_end/web/migration.dart
+++ b/pkg/nnbd_migration/lib/src/front_end/web/migration.dart
@@ -7,6 +7,7 @@
 import 'dart:html';
 
 import 'package:nnbd_migration/instrumentation.dart';
+import 'package:nnbd_migration/src/front_end/migration_info.dart';
 import 'package:nnbd_migration/src/front_end/web/edit_details.dart';
 import 'package:nnbd_migration/src/front_end/web/file_details.dart';
 import 'package:nnbd_migration/src/front_end/web/navigation_tree.dart';
@@ -282,32 +283,17 @@
   event.preventDefault();
 
   try {
-    // Directing the server to produce an edit; request it, then do work with the
-    // response.
+    var previousScrollPosition = _getCurrentScrollPosition();
+    // Directing the server to produce an edit; request it, then do work with
+    // the response.
     await doPost(path);
-    // TODO(mfairhurst): Only refresh the regions/dart code, not the window.
-    (document.window.location as Location).reload();
+    await loadFile(window.location.pathname, null, null, false);
+    _scrollContentTo(previousScrollPosition);
   } catch (e, st) {
     handleError('Could not add/remove hint', e, st);
   }
 }
 
-void handleRerunFailure(List<Object> errors) {
-  final popupPane = document.querySelector('.popup-pane');
-  popupPane.querySelector('h2').innerText = 'Failed to rerun from sources';
-  popupPane.querySelector('p').innerText =
-      'Sources contain static analysis errors:';
-  popupPane.querySelector('pre').innerText = errors.cast<Map>().map((error) {
-    return '${error['severity']} - ${error['message']} '
-        'at ${error['location']} - (${error['code']})';
-  }).join('\n');
-  popupPane.querySelector('a.bottom').style.display = 'none';
-  popupPane.style.display = 'initial';
-
-  // TODO(srawlins): I think we should lock down the entire web UI, except for
-  //  the "Rerun from source" button.
-}
-
 void handleError(String header, Object exception, Object stackTrace) {
   String subheader;
   if (exception is Map<String, Object> &&
@@ -331,9 +317,6 @@
   logError('$header: $exception', stackTrace);
 }
 
-String _stripQuery(String path) =>
-    path.contains('?') ? path.substring(0, path.indexOf('?')) : path;
-
 void handleNavLinkClick(
   MouseEvent event,
   bool clearEditDetails, {
@@ -359,6 +342,22 @@
   }
 }
 
+void handleRerunFailure(List<Object> errors) {
+  final popupPane = document.querySelector('.popup-pane');
+  popupPane.querySelector('h2').innerText = 'Failed to rerun from sources';
+  popupPane.querySelector('p').innerText =
+      'Sources contain static analysis errors:';
+  popupPane.querySelector('pre').innerText = errors.cast<Map>().map((error) {
+    return '${error['severity']} - ${error['message']} '
+        'at ${error['location']} - (${error['code']})';
+  }).join('\n');
+  popupPane.querySelector('a.bottom').style.display = 'none';
+  popupPane.style.display = 'initial';
+
+  // TODO(srawlins): I think we should lock down the entire web UI, except for
+  //  the "Rerun from source" button.
+}
+
 void highlightAllCode() {
   document.querySelectorAll('.code').forEach((Element block) {
     hljs.highlightBlock(block);
@@ -379,9 +378,9 @@
   }
 }
 
-/// Load the file at [path] from the server, optionally scrolling [offset] into
+/// Loads the file at [path] from the server, optionally scrolling [offset] into
 /// view.
-void loadFile(
+Future<void> loadFile(
   String path,
   int offset,
   int line,
@@ -452,13 +451,14 @@
   }
 }
 
-/// Scroll target with id [offset] into view if it is not currently in view.
+/// Scrolls target with id [offset] into view if it is not currently in view.
 ///
-/// If [offset] is null, instead scroll the "unit-name" header, at the top of
-/// the page, into view.
+/// Falls back to [lineNumber] if a target with id "o$offset" does not exist.
 ///
-/// Also add the "target" class, highlighting the target. Also add the
-/// "highlight" class to the entire line on which the target lies.
+/// Also adds the "target" class, highlighting the target, and the "highlight"
+/// class to the entire line on which the target lies.
+///
+/// If [offset] is null, instead scrolls to the top of the file.
 void maybeScrollToAndHighlight(int offset, int lineNumber) {
   Element target;
   Element line;
@@ -732,6 +732,24 @@
   }
 }
 
+void _addHintAction(HintAction hintAction, Node drawer, TargetLink link) {
+  drawer.append(ButtonElement()
+    ..onClick.listen((event) async {
+      try {
+        var previousScrollPosition = _getCurrentScrollPosition();
+        await doPost(
+            pathWithQueryParameters('/apply-hint', {}), hintAction.toJson());
+        var path = _stripQuery(link.href);
+        await loadFile(path, null, link.line, false);
+        document.body.classes.add('needs-rerun');
+        _scrollContentTo(previousScrollPosition);
+      } catch (e, st) {
+        handleError('Could not apply hint', e, st);
+      }
+    })
+    ..appendText(hintAction.kind.description));
+}
+
 AnchorElement _aElementForLink(TargetLink link) {
   var targetLine = link.line;
   AnchorElement a = AnchorElement();
@@ -741,6 +759,8 @@
   return a;
 }
 
+int _getCurrentScrollPosition() => document.querySelector('.content').scrollTop;
+
 void _populateEditLinks(EditDetails response, Element editPanel) {
   if (response.edits == null) {
     return;
@@ -793,25 +813,19 @@
         var drawer = li.append(
             document.createElement('p')..classes = ['drawer', 'before-apply']);
         for (final hintAction in entry.hintActions) {
-          drawer.append(ButtonElement()
-            ..onClick.listen((event) async {
-              try {
-                await doPost(pathWithQueryParameters('/apply-hint', {}),
-                    hintAction.toJson());
-                var path = _stripQuery(link.href);
-                loadFile(path, null, link.line, false);
-                document.body.classes.add('needs-rerun');
-              } catch (e, st) {
-                handleError('Could not apply hint', e, st);
-              }
-            })
-            ..appendText(hintAction.kind.description));
+          _addHintAction(hintAction, drawer, link);
         }
       }
     }
   }
 }
 
+void _scrollContentTo(int top) =>
+    document.querySelector('.content').scrollTop = top;
+
+String _stripQuery(String path) =>
+    path.contains('?') ? path.substring(0, path.indexOf('?')) : path;
+
 class _PermissiveNodeValidator implements NodeValidator {
   static _PermissiveNodeValidator instance = _PermissiveNodeValidator();
 
diff --git a/pkg/nnbd_migration/lib/src/messages.dart b/pkg/nnbd_migration/lib/src/messages.dart
index 41497f2..f4796c1 100644
--- a/pkg/nnbd_migration/lib/src/messages.dart
+++ b/pkg/nnbd_migration/lib/src/messages.dart
@@ -2,6 +2,8 @@
 // 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:nnbd_migration/migration_cli.dart';
+
 const String migratedAlready =
     "Seem to be migrating code that's already migrated";
 const String nnbdExperimentOff =
@@ -10,3 +12,30 @@
 const String sdkPathEnvironmentVariableSet =
     r'Note: $SDK_PATH environment variable is set and may point to outdated '
     'dart:core sources';
+const String _skipImportCheckFlag =
+    '--${CommandLineOptions.skipImportCheckFlag}';
+const String unmigratedDependenciesWarning = '''
+Warning: package has unmigrated dependencies.
+
+Continuing due to the presence of `$_skipImportCheckFlag`.  To see a complete
+list of the unmigrated dependencies, re-run without the `$_skipImportCheckFlag`
+flag.
+''';
+
+String unmigratedDependenciesError(List<String> uris) => '''
+Error: package has unmigrated dependencies.
+
+Before migrating your package, we recommend ensuring that every library it
+imports (either directly or indirectly) has been migrated to null safety, so
+that you will be able to run your unit tests in sound null checking mode.  You
+are currently importing the following non-null-safe libraries:
+
+  ${uris.join('\n  ')}
+
+Please upgrade the packages containing these libraries to null safe versions
+before continuing.  To see what null safe package versions are available, run
+the following command: `dart pub outdated --mode=null-safety --prereleases`.
+
+To skip this check and try to migrate anyway, re-run with the flag
+`$_skipImportCheckFlag`.
+''';
diff --git a/pkg/nnbd_migration/lib/src/node_builder.dart b/pkg/nnbd_migration/lib/src/node_builder.dart
index dd52503..25a697c 100644
--- a/pkg/nnbd_migration/lib/src/node_builder.dart
+++ b/pkg/nnbd_migration/lib/src/node_builder.dart
@@ -228,11 +228,15 @@
   @override
   DecoratedType visitDefaultFormalParameter(DefaultFormalParameter node) {
     var decoratedType = node.parameter.accept(this);
+    var hint = getPrefixHint(node.firstTokenAfterCommentAndMetadata);
     if (node.defaultValue != null) {
       node.defaultValue.accept(this);
       return null;
     } else if (node.declaredElement.hasRequired) {
       return null;
+    } else if (hint != null && hint.kind == HintCommentKind.required) {
+      _variables.recordRequiredHint(source, node, hint);
+      return null;
     }
     if (decoratedType == null) {
       throw StateError('No type computed for ${node.parameter.runtimeType} '
@@ -418,7 +422,7 @@
       decoratedFunctionType = node.functionType.accept(this);
     });
     _variables.recordDecoratedElementType(
-        (node.declaredElement as GenericTypeAliasElement).function,
+        (node.declaredElement as FunctionTypeAliasElement).function,
         decoratedFunctionType);
     return null;
   }
@@ -633,6 +637,9 @@
     if (hint != null && hint.kind == HintCommentKind.late_) {
       _variables.recordLateHint(source, node, hint);
     }
+    if (hint != null && hint.kind == HintCommentKind.lateFinal) {
+      _variables.recordLateHint(source, node, hint);
+    }
     for (var variable in node.variables) {
       variable.metadata.accept(this);
       var declaredElement = variable.declaredElement;
diff --git a/pkg/nnbd_migration/lib/src/nullability_migration_impl.dart b/pkg/nnbd_migration/lib/src/nullability_migration_impl.dart
index 4a9aad9..81a3079 100644
--- a/pkg/nnbd_migration/lib/src/nullability_migration_impl.dart
+++ b/pkg/nnbd_migration/lib/src/nullability_migration_impl.dart
@@ -2,7 +2,9 @@
 // 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:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/dart/analysis/results.dart';
+import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/file_system/physical_file_system.dart';
 import 'package:analyzer/src/dart/analysis/session.dart';
 import 'package:analyzer/src/dart/element/type_system.dart';
@@ -58,6 +60,17 @@
 
   final LineInfo Function(String) _getLineInfo;
 
+  /// Indicates whether we should transform iterable methods taking an "orElse"
+  /// parameter into their "OrNull" equivalents if possible.
+  final bool transformWhereOrNull;
+
+  /// Map from [Source] object to a boolean indicating whether the source is
+  /// opted in to null safety.
+  final Map<Source, bool> _libraryOptInStatus = {};
+
+  /// Indicates whether the client has used the [unmigratedDependencies] getter.
+  bool _queriedUnmigratedDependencies = false;
+
   /// Prepares to perform nullability migration.
   ///
   /// If [permissive] is `true`, exception handling logic will try to proceed
@@ -71,12 +84,18 @@
   /// Optional parameter [warnOnWeakCode] indicates whether weak-only code
   /// should be warned about or removed (in the way specified by
   /// [removeViaComments]).
+  ///
+  /// Optional parameter [transformWhereOrNull] indicates whether Iterable
+  /// methods should be transformed to their "OrNull" equivalents when possible.
+  /// This feature is a work in progress, so by default they are not
+  /// transformed.
   NullabilityMigrationImpl(NullabilityMigrationListener listener,
       LineInfo Function(String) getLineInfo,
       {bool permissive = false,
       NullabilityMigrationInstrumentation instrumentation,
       bool removeViaComments = false,
-      bool warnOnWeakCode = true})
+      bool warnOnWeakCode = true,
+      bool transformWhereOrNull = true})
       : this._(
             listener,
             NullabilityGraph(instrumentation: instrumentation),
@@ -84,7 +103,8 @@
             instrumentation,
             removeViaComments,
             warnOnWeakCode,
-            getLineInfo);
+            getLineInfo,
+            transformWhereOrNull);
 
   NullabilityMigrationImpl._(
       this.listener,
@@ -93,7 +113,8 @@
       this._instrumentation,
       this.removeViaComments,
       this.warnOnWeakCode,
-      this._getLineInfo) {
+      this._getLineInfo,
+      this.transformWhereOrNull) {
     _instrumentation?.immutableNodes(_graph.never, _graph.always);
     _postmortemFileWriter?.graph = _graph;
   }
@@ -102,7 +123,28 @@
   bool get isPermissive => _permissive;
 
   @override
+  List<String> get unmigratedDependencies {
+    _queriedUnmigratedDependencies = true;
+    var unmigratedDependencies = <Source>[];
+    for (var entry in _libraryOptInStatus.entries) {
+      if (_graph.isBeingMigrated(entry.key)) continue;
+      if (!entry.value) {
+        unmigratedDependencies.add(entry.key);
+      }
+    }
+    var badUris = {
+      for (var dependency in unmigratedDependencies) dependency.uri.toString()
+    }.toList();
+    badUris.sort();
+    return badUris;
+  }
+
+  @override
   void finalizeInput(ResolvedUnitResult result) {
+    if (result.unit.featureSet.isEnabled(Feature.non_nullable)) {
+      // This library has already been migrated; nothing more to do.
+      return;
+    }
     ExperimentStatusException.sanityCheck(result);
     if (!_propagated) {
       _propagated = true;
@@ -126,7 +168,8 @@
         _permissive ? listener : null,
         unit,
         warnOnWeakCode,
-        _graph);
+        _graph,
+        transformWhereOrNull);
     try {
       DecoratedTypeParameterBounds.current = _decoratedTypeParameterBounds;
       fixBuilder.visitAll();
@@ -154,12 +197,30 @@
   }
 
   void finish() {
+    if (!_propagated) {
+      // [finalizeInput] sets this field to `true`, so if it's still false, that
+      // means it was never called; this probably means that all the code fed
+      // to the migration tool was already migrated.
+      throw ExperimentStatusException.migratedAlready();
+    }
     _postmortemFileWriter?.write();
     _instrumentation?.finished();
   }
 
   void prepareInput(ResolvedUnitResult result) {
+    assert(
+        !_queriedUnmigratedDependencies,
+        'Should only query unmigratedDependencies after all calls to '
+        'prepareInput');
+    if (result.unit.featureSet.isEnabled(Feature.non_nullable)) {
+      // This library has already been migrated; nothing more to do.
+      return;
+    }
     ExperimentStatusException.sanityCheck(result);
+    _recordTransitiveImportExportOptInStatus(
+        result.libraryElement.importedLibraries);
+    _recordTransitiveImportExportOptInStatus(
+        result.libraryElement.exportedLibraries);
     if (_variables == null) {
       _variables = Variables(_graph, result.typeProvider, _getLineInfo,
           instrumentation: _instrumentation,
@@ -183,6 +244,10 @@
   }
 
   void processInput(ResolvedUnitResult result) {
+    if (result.unit.featureSet.isEnabled(Feature.non_nullable)) {
+      // This library has already been migrated; nothing more to do.
+      return;
+    }
     ExperimentStatusException.sanityCheck(result);
     var unit = result.unit;
     try {
@@ -195,6 +260,7 @@
           unit.declaredElement.source,
           _permissive ? listener : null,
           _decoratedClassHierarchy,
+          transformWhereOrNull,
           instrumentation: _instrumentation));
     } finally {
       DecoratedTypeParameterBounds.current = null;
@@ -206,6 +272,20 @@
     _graph.update(_postmortemFileWriter);
   }
 
+  /// Records the opt in/out status of all libraries in [libraries], and any
+  /// libraries they transitively import or export, in [_libraryOptInStatus].
+  void _recordTransitiveImportExportOptInStatus(
+      Iterable<LibraryElement> libraries) {
+    var librariesToCheck = libraries.toList();
+    while (librariesToCheck.isNotEmpty) {
+      var library = librariesToCheck.removeLast();
+      if (_libraryOptInStatus.containsKey(library.source)) continue;
+      _libraryOptInStatus[library.source] = library.isNonNullableByDefault;
+      librariesToCheck.addAll(library.importedLibraries);
+      librariesToCheck.addAll(library.exportedLibraries);
+    }
+  }
+
   static Location _computeLocation(
       LineInfo lineInfo, SourceEdit edit, Source source) {
     final locationInfo = lineInfo.getLocation(edit.offset);
diff --git a/pkg/nnbd_migration/lib/src/preview/preview_site.dart b/pkg/nnbd_migration/lib/src/preview/preview_site.dart
index 8d95d77..f433446 100644
--- a/pkg/nnbd_migration/lib/src/preview/preview_site.dart
+++ b/pkg/nnbd_migration/lib/src/preview/preview_site.dart
@@ -315,7 +315,7 @@
     unitInfo.diskContent = newContent;
   }
 
-  /// Perform the edit indicated by the [uri].
+  /// Perform the hint edit indicated by the [hintAction].
   Future<void> performHintAction(HintAction hintAction) async {
     final node = migrationState.nodeMapper.nodeForId(hintAction.nodeId);
     final edits = node.hintActions[hintAction.kind];
diff --git a/pkg/nnbd_migration/lib/src/utilities/hint_utils.dart b/pkg/nnbd_migration/lib/src/utilities/hint_utils.dart
index 020cdf4..9f9a8c7 100644
--- a/pkg/nnbd_migration/lib/src/utilities/hint_utils.dart
+++ b/pkg/nnbd_migration/lib/src/utilities/hint_utils.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:_fe_analyzer_shared/src/scanner/token.dart';
+import 'package:analyzer/dart/ast/ast.dart';
 import 'package:nnbd_migration/src/edit_plan.dart';
 
 /// Determines if the given [token] is followed by a nullability hint, and if
@@ -43,11 +44,11 @@
     var lexeme = commentToken.lexeme;
     if (lexeme.startsWith('/*') &&
         lexeme.endsWith('*/') &&
-        lexeme.length > 'late'.length) {
+        lexeme.length >= '/*late*/'.length) {
       var commentText =
           lexeme.substring('/*'.length, lexeme.length - '*/'.length).trim();
+      var commentOffset = commentToken.offset;
       if (commentText == 'late') {
-        var commentOffset = commentToken.offset;
         var lateOffset = commentOffset + commentToken.lexeme.indexOf('late');
         return HintComment(
             HintCommentKind.late_,
@@ -57,6 +58,27 @@
             lateOffset + 'late'.length,
             commentToken.end,
             token.offset);
+      } else if (commentText == 'late final') {
+        var lateOffset = commentOffset + commentToken.lexeme.indexOf('late');
+        return HintComment(
+            HintCommentKind.lateFinal,
+            commentOffset,
+            commentOffset,
+            lateOffset,
+            lateOffset + 'late final'.length,
+            commentToken.end,
+            token.offset);
+      } else if (commentText == 'required') {
+        var requiredOffset =
+            commentOffset + commentToken.lexeme.indexOf('required');
+        return HintComment(
+            HintCommentKind.required,
+            commentOffset,
+            commentOffset,
+            requiredOffset,
+            requiredOffset + 'required'.length,
+            commentToken.end,
+            token.offset);
       }
     }
   }
@@ -196,4 +218,49 @@
   /// The comment `/*late*/`, which indicates that the variable declaration
   /// should be late.
   late_,
+
+  /// The comment `/*late final*/`, which indicates that the variable
+  /// declaration should be late and final.
+  lateFinal,
+
+  /// The comment `/*required*/`, which indicates that the parameter should be
+  /// required.
+  required,
+}
+
+extension FormalParameterExtensions on FormalParameter {
+  // TODO(srawlins): Add this to FormalParameter interface.
+  Token get firstTokenAfterCommentAndMetadata {
+    var parameter = this is DefaultFormalParameter
+        ? (this as DefaultFormalParameter).parameter
+        : this as NormalFormalParameter;
+    if (parameter is FieldFormalParameter) {
+      if (parameter.keyword != null) {
+        return parameter.keyword;
+      } else if (parameter.type != null) {
+        return parameter.type.beginToken;
+      } else {
+        return parameter.thisKeyword;
+      }
+    } else if (parameter is FunctionTypedFormalParameter) {
+      if (parameter.covariantKeyword != null) {
+        return parameter.covariantKeyword;
+      } else if (parameter.returnType != null) {
+        return parameter.returnType.beginToken;
+      } else {
+        return parameter.identifier.token;
+      }
+    } else if (parameter is SimpleFormalParameter) {
+      if (parameter.covariantKeyword != null) {
+        return parameter.covariantKeyword;
+      } else if (parameter.keyword != null) {
+        return parameter.keyword;
+      } else if (parameter.type != null) {
+        return parameter.type.beginToken;
+      } else {
+        return parameter.identifier.token;
+      }
+    }
+    return null;
+  }
 }
diff --git a/pkg/nnbd_migration/lib/src/utilities/progress_bar.dart b/pkg/nnbd_migration/lib/src/utilities/progress_bar.dart
new file mode 100644
index 0000000..e1b7931
--- /dev/null
+++ b/pkg/nnbd_migration/lib/src/utilities/progress_bar.dart
@@ -0,0 +1,83 @@
+// Copyright (c) 2020, 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' hide File;
+import 'dart:math';
+
+import 'package:cli_util/cli_logging.dart';
+
+/// A facility for drawing a progress bar in the terminal.
+///
+/// The bar is instantiated with the total number of "ticks" to be completed,
+/// and progress is made by calling [tick]. The bar is drawn across one entire
+/// line, like so:
+///
+///     [----------                                                   ]
+///
+/// The hyphens represent completed progress, and the whitespace represents
+/// remaining progress.
+///
+/// If there is no terminal, the progress bar will not be drawn.
+class ProgressBar {
+  /// Whether the progress bar should be drawn.
+  /*late*/ bool _shouldDrawProgress;
+
+  /// The width of the terminal, in terms of characters.
+  /*late*/ int _width;
+
+  final Logger _logger;
+
+  /// The inner width of the terminal, in terms of characters.
+  ///
+  /// This represents the number of characters available for drawing progress.
+  /*late*/ int _innerWidth;
+
+  final int _totalTickCount;
+
+  int _tickCount = 0;
+
+  ProgressBar(this._logger, this._totalTickCount) {
+    if (!stdout.hasTerminal) {
+      _shouldDrawProgress = false;
+    } else {
+      _shouldDrawProgress = true;
+      _width = stdout.terminalColumns;
+      _innerWidth = stdout.terminalColumns - 2;
+      _logger.write('[' + ' ' * _innerWidth + ']');
+    }
+  }
+
+  /// Clear the progress bar from the terminal, allowing other logging to be
+  /// printed.
+  void clear() {
+    if (!_shouldDrawProgress) {
+      return;
+    }
+    _logger.write('\r' + ' ' * _width + '\r');
+  }
+
+  /// Draw the progress bar as complete, and print two newlines.
+  void complete() {
+    if (!_shouldDrawProgress) {
+      return;
+    }
+    _logger.write('\r[' + '-' * _innerWidth + ']\n\n');
+  }
+
+  /// Progress the bar by one tick.
+  void tick() {
+    if (!_shouldDrawProgress) {
+      return;
+    }
+    _tickCount++;
+    var fractionComplete =
+        max(0, _tickCount * _innerWidth ~/ _totalTickCount - 1);
+    var remaining = _innerWidth - fractionComplete - 1;
+    _logger.write('\r[' + // Bring cursor back to the start of the line.
+        '-' * fractionComplete + // Print complete work.
+        AnsiProgress.kAnimationItems[_tickCount % 4] + // Print spinner.
+        ' ' * remaining + // Print remaining work.
+        ']');
+  }
+}
diff --git a/pkg/nnbd_migration/lib/src/utilities/where_or_null_transformer.dart b/pkg/nnbd_migration/lib/src/utilities/where_or_null_transformer.dart
new file mode 100644
index 0000000..067ee7d
--- /dev/null
+++ b/pkg/nnbd_migration/lib/src/utilities/where_or_null_transformer.dart
@@ -0,0 +1,148 @@
+// Copyright (c) 2020, 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:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/dart/element/type_provider.dart';
+import 'package:analyzer/dart/element/type_system.dart';
+
+/// Information about a method call that we might want to transform into its
+/// "OrNull" counterpart.  See [WhereOrNullTransformer] for more information.
+class WhereOrNullTransformationInfo {
+  /// AST node of the method invocation.
+  final MethodInvocation methodInvocation;
+
+  /// AST node of the "orElse" argument of the method invocation.
+  final NamedExpression orElseArgument;
+
+  /// Original name of the method being called, prior to transformation.
+  final String originalName;
+
+  /// New method to call, after transformation.
+  final String replacementName;
+
+  WhereOrNullTransformationInfo(this.methodInvocation, this.orElseArgument,
+      this.originalName, this.replacementName);
+}
+
+/// Methods to assist in transforming calls to the `Iterable` methods
+/// `firstWhere`, `lastWhere`, and `singleWhere` into calls to the
+/// `package:collection` methods `firstWhereOrNull`, `lastWhereOrNull`, or
+/// `singleWhereOrNull`, where possible.
+///
+/// An example of the kind of code that can be transformed is:
+///
+///     int firstEven(Iterable<int> x)
+///         => x.firstWhere((x) => x.isEven, orElse: () => null);
+///
+/// We transform this into:
+///
+///     int firstEven(Iterable<int> x)
+///         => x.firstWhereOrNull((x) => x.isEven);
+///
+/// Without this transformation, the migrated result would have been:
+///
+///     int firstEven(Iterable<int?> x)
+///         => x.firstWhere((x) => x.isEven, orElse: () => null);
+///
+/// Which would have placed an otherwise unnecessary nullability requirement on
+/// the type argument of the type of `x`.
+class WhereOrNullTransformer {
+  static const _replacementNames = {
+    'firstWhere': 'firstWhereOrNull',
+    'lastWhere': 'lastWhereOrNull',
+    'singleWhere': 'singleWhereOrNull'
+  };
+
+  final TypeProvider _typeProvider;
+
+  final TypeSystem _typeSystem;
+
+  WhereOrNullTransformer(this._typeProvider, this._typeSystem);
+
+  /// If [expression] is the expression part of the `orElse` argument of a call
+  /// that can be transformed, returns information about the transformable call;
+  /// otherwise returns `null`.
+  WhereOrNullTransformationInfo tryTransformOrElseArgument(
+      Expression expression) {
+    var transformationInfo =
+        _tryTransformMethodInvocation(expression?.parent?.parent?.parent);
+    if (transformationInfo != null &&
+        identical(transformationInfo.orElseArgument.expression, expression)) {
+      return transformationInfo;
+    } else {
+      return null;
+    }
+  }
+
+  /// Searches [argumentList] for a named argument with the name "orElse".  If
+  /// such an argument is found, and no other named arguments are found, it is
+  /// returned; otherwise `null` is returned.
+  NamedExpression _findOrElseArgument(ArgumentList argumentList) {
+    NamedExpression orElseArgument;
+    for (var argument in argumentList.arguments) {
+      if (argument is NamedExpression) {
+        if (argument.name.label.name == 'orElse') {
+          orElseArgument = argument;
+        } else {
+          // The presence of an unexpected named argument means the user is
+          // calling their own override of the method, and presumably they are
+          // using this named argument to trigger a special behavior of their
+          // override.  So don't try to replace it.
+          return null;
+        }
+      }
+    }
+    return orElseArgument;
+  }
+
+  /// Determines if [element] is a method that can be transformed; if it can,
+  /// the name of the replacement is returned; otherwise, `null` is returned.
+  String _getTransformableMethodReplacementName(Element element) {
+    if (element is MethodElement) {
+      if (element.isStatic) return null;
+      var replacementName = _replacementNames[element.name];
+      if (replacementName == null) return null;
+      var enclosingElement = element.declaration.enclosingElement;
+      if (enclosingElement is ClassElement) {
+        // If the class is `Iterable` or a subtype of it, we consider the user
+        // to be calling a transformable method.
+        if (_typeSystem.isSubtypeOf(
+            enclosingElement.thisType, _typeProvider.iterableDynamicType)) {
+          return replacementName;
+        }
+      }
+    }
+    return null;
+  }
+
+  /// Checks whether [expression] is of the form `() => null`.
+  bool _isClosureReturningNull(Expression expression) {
+    if (expression is FunctionExpression) {
+      if (expression.typeParameters != null) return false;
+      if (expression.parameters.parameters.isNotEmpty) return false;
+      var body = expression.body;
+      if (body is ExpressionFunctionBody) {
+        if (body.expression is NullLiteral) return true;
+      }
+    }
+    return false;
+  }
+
+  /// If [node] is a call that can be transformed, returns information about the
+  /// transformable call; otherwise returns `null`.
+  WhereOrNullTransformationInfo _tryTransformMethodInvocation(AstNode node) {
+    if (node is MethodInvocation) {
+      var replacementName =
+          _getTransformableMethodReplacementName(node.methodName.staticElement);
+      if (replacementName == null) return null;
+      var orElseArgument = _findOrElseArgument(node.argumentList);
+      if (orElseArgument == null) return null;
+      if (!_isClosureReturningNull(orElseArgument.expression)) return null;
+      return WhereOrNullTransformationInfo(
+          node, orElseArgument, node.methodName.name, replacementName);
+    }
+    return null;
+  }
+}
diff --git a/pkg/nnbd_migration/lib/src/variables.dart b/pkg/nnbd_migration/lib/src/variables.dart
index c054c01..a3ddc70 100644
--- a/pkg/nnbd_migration/lib/src/variables.dart
+++ b/pkg/nnbd_migration/lib/src/variables.dart
@@ -62,6 +62,8 @@
 
   final _nullabilityHints = <Source, Map<int, HintComment>>{};
 
+  final _requiredHints = <Source, Map<int, HintComment>>{};
+
   final _unnecessaryCasts = <Source, Set<int>>{};
 
   final AlreadyMigratedCodeDecorator _alreadyMigratedCodeDecorator;
@@ -185,6 +187,12 @@
         {})[uniqueIdentifierForSpan(node.offset, node.end)];
   }
 
+  /// If the given [node] is preceded by a `/*required*/` hint, returns the
+  /// HintComment for it; otherwise returns `null`.  See [recordRequiredHint].
+  HintComment getRequiredHint(Source source, FormalParameter node) {
+    return (_requiredHints[source] ?? {})[node.offset];
+  }
+
   /// If the given [expression] is followed by a null check hint (`/*!*/`),
   /// returns the HintComment for it; otherwise returns `null`.  See
   /// [recordNullCheckHint].
@@ -260,6 +268,12 @@
         {})[uniqueIdentifierForSpan(node.offset, node.end)] = hintComment;
   }
 
+  /// Records that the given [node] was preceded by a `/*required*/` hint.
+  void recordRequiredHint(
+      Source source, FormalParameter node, HintComment hint) {
+    (_requiredHints[source] ??= {})[node.offset] = hint;
+  }
+
   /// Records that the given [expression] is followed by a null check hint
   /// (`/*!*/`), for later recall by [hasNullCheckHint].
   void recordNullCheckHint(
diff --git a/pkg/nnbd_migration/pubspec.yaml b/pkg/nnbd_migration/pubspec.yaml
index ac8b395..5f57739 100644
--- a/pkg/nnbd_migration/pubspec.yaml
+++ b/pkg/nnbd_migration/pubspec.yaml
@@ -1,15 +1,16 @@
 name: nnbd_migration
-description: Null Safety Migration Tooling
-homepage: https://github.com/dart-lang/sdk/blob/master/pkg/nnbd_migration/README.md
-version: 0.1.0
+
+# This package is not intended for consumption on pub.dev. DO NOT publish.
+publish_to: none
+
 environment:
   sdk: '>=2.6.0 <3.0.0'
+
 dependencies:
   _fe_analyzer_shared: ^4.0.0
   analyzer: ^0.40.4
   analyzer_plugin: ^0.2.4
   args: ^1.4.4
-  charcode: ^1.1.2
   cli_util: ^0.2.0
   collection: ^1.14.11
   crypto: ^2.0.6
@@ -18,6 +19,7 @@
   pub_semver: ^1.4.2
   source_span: ^1.4.1
   yaml: ^2.1.15
+
 dev_dependencies:
   http: '>=0.11.3+17 <0.13.0'
   pedantic: ^1.9.0
diff --git a/pkg/nnbd_migration/test/abstract_context.dart b/pkg/nnbd_migration/test/abstract_context.dart
index d04f358..a52c469 100644
--- a/pkg/nnbd_migration/test/abstract_context.dart
+++ b/pkg/nnbd_migration/test/abstract_context.dart
@@ -2,6 +2,8 @@
 // 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:convert';
+
 import 'package:analyzer/dart/analysis/analysis_context.dart';
 import 'package:analyzer/dart/analysis/analysis_context_collection.dart';
 import 'package:analyzer/dart/analysis/session.dart';
@@ -18,18 +20,31 @@
 /// TODO(paulberry): this logic is duplicated from other packages.  Find a way
 /// share it, or avoid relying on it.
 class AbstractContextTest with ResourceProviderMixin {
-  static const _homePath = '/home';
-  static const testsPath = '$_homePath/tests';
-
   OverlayResourceProvider overlayResourceProvider;
 
   AnalysisContextCollection _analysisContextCollection;
   AnalysisDriver _driver;
 
-  AnalysisDriver get driver => _driver;
+  final Set<String> knownPackages = {};
+
+  /// Whether the test should perform analysis with NNBD enabled.
+  ///
+  /// `false` by default.  May be overridden in derived test classes.
+  bool get analyzeWithNnbd => false;
+
+  AnalysisDriver get driver {
+    if (_driver == null) {
+      _createAnalysisContexts();
+    }
+    return _driver;
+  }
+
+  String get homePath => '/home';
 
   AnalysisSession get session => driver.currentSession;
 
+  String get testsPath => '$homePath/tests';
+
   void addMetaPackage() {
     addPackageFile('meta', 'meta.dart', r'''
 library meta;
@@ -48,7 +63,7 @@
   /// package.
   File addPackageFile(String packageName, String pathInLib, String content) {
     var packagePath = '/.pub-cache/$packageName';
-    _addTestPackageDependency(packageName, packagePath);
+    knownPackages.add(packageName);
     return newFile('$packagePath/lib/$pathInLib', content: content);
   }
 
@@ -90,22 +105,13 @@
 ''');
   }
 
-  /// Create all analysis contexts in [_homePath].
-  void createAnalysisContexts() {
-    _analysisContextCollection = AnalysisContextCollectionImpl(
-      includedPaths: [convertPath(_homePath)],
-      enableIndex: true,
-      resourceProvider: overlayResourceProvider,
-      sdkPath: convertPath('/sdk'),
-    );
-
-    _driver = getDriver(convertPath(testsPath));
-  }
-
   /// Return the existing analysis context that should be used to analyze the
   /// given [path], or throw [StateError] if the [path] is not analyzed in any
   /// of the created analysis contexts.
   AnalysisContext getContext(String path) {
+    if (_analysisContextCollection == null) {
+      _createAnalysisContexts();
+    }
     path = convertPath(path);
     return _analysisContextCollection.contextFor(path);
   }
@@ -131,8 +137,16 @@
     newFile('$testsPath/.packages', content: '''
 tests:file://$testsPath/lib
 ''');
-
-    createAnalysisContexts();
+    var pubspecPath = '$testsPath/pubspec.yaml';
+    // Subclasses may write out a different file first.
+    if (!getFile(pubspecPath).exists) {
+      newFile(pubspecPath, content: '''
+name: tests
+version: 1.0.0
+environment:
+  sdk: '>=2.9.0 <3.0.0'
+''');
+    }
   }
 
   void setupResourceProvider() {}
@@ -141,33 +155,38 @@
     AnalysisEngine.instance.clearCaches();
   }
 
-  void _addTestPackageDependency(String name, String rootPath) {
-    var packagesFile = getFile('$testsPath/.packages');
-    var packagesContent = packagesFile.readAsStringSync();
-
-    // Ignore if there is already the same package dependency.
-    if (packagesContent.contains('$name:file://')) {
-      return;
-    }
-
-    packagesContent += '$name:${toUri('$rootPath/lib')}\n';
-
-    packagesFile.writeAsStringSync(packagesContent);
-
-    _createDriver();
-  }
-
-  void _createDriver() {
-    var collection = AnalysisContextCollectionImpl(
-      includedPaths: [convertPath(_homePath)],
+  /// Create all analysis contexts in [_homePath].
+  void _createAnalysisContexts() {
+    var packageConfigJson = {
+      'configVersion': 2,
+      'packages': [
+        for (var packageName in knownPackages)
+          {
+            'name': packageName,
+            'rootUri': toUriStr('/.pub-cache/$packageName'),
+            'packageUri': 'lib/',
+            'languageVersion': '2.12'
+          },
+        {
+          'name': 'tests',
+          'rootUri': '../',
+          'packageUri': 'lib/',
+          'languageVersion': analyzeWithNnbd ? '2.12' : '2.9'
+        }
+      ],
+      'generated': '2020-10-21T21:13:05.186004Z',
+      'generator': 'pub',
+      'generatorVersion': '2.10.0'
+    };
+    newFile('$testsPath/.dart_tool/package_config.json',
+        content: JsonEncoder.withIndent('  ').convert(packageConfigJson));
+    _analysisContextCollection = AnalysisContextCollectionImpl(
+      includedPaths: [convertPath(homePath)],
       enableIndex: true,
-      resourceProvider: resourceProvider,
+      resourceProvider: overlayResourceProvider,
       sdkPath: convertPath('/sdk'),
     );
 
-    var testPath = convertPath(testsPath);
-    var context = collection.contextFor(testPath) as DriverBasedAnalysisContext;
-
-    _driver = context.driver;
+    _driver = getDriver(convertPath(testsPath));
   }
 }
diff --git a/pkg/nnbd_migration/test/abstract_single_unit.dart b/pkg/nnbd_migration/test/abstract_single_unit.dart
index 16f0f45..a9dad66 100644
--- a/pkg/nnbd_migration/test/abstract_single_unit.dart
+++ b/pkg/nnbd_migration/test/abstract_single_unit.dart
@@ -30,13 +30,6 @@
   FindNode findNode;
   FindElement findElement;
 
-  /// Whether the test should perform analysis with NNBD enabled.
-  ///
-  /// `false` by default.  May be overridden in derived test classes.
-  ///
-  /// TODO(paulberry): once NNBD ships, this should no longer be needed.
-  bool get analyzeWithNnbd => false;
-
   void addTestSource(String code, [Uri uri]) {
     testCode = code;
     testSource = addSource(testFile, code, uri);
@@ -66,7 +59,7 @@
 
   @override
   void setUp() {
-    var testRoot = AbstractContextTest.testsPath;
+    var testRoot = testsPath;
     if (analyzeWithNnbd) {
       newFile('$testRoot/analysis_options.yaml', content: '''
 analyzer:
@@ -74,6 +67,14 @@
     - non-nullable
 ''');
     }
+    if (analyzeWithNnbd) {
+      newFile('$testRoot/pubspec.yaml', content: '''
+name: tests
+version: 1.0.0
+environment:
+  sdk: '>=2.12.0 <3.0.0'
+''');
+    }
     super.setUp();
     testFile = convertPath('$testRoot/lib/test.dart');
     testUri = Uri.parse('package:tests/test.dart');
diff --git a/pkg/nnbd_migration/test/api_test.dart b/pkg/nnbd_migration/test/api_test.dart
index 2140235..1e86235 100644
--- a/pkg/nnbd_migration/test/api_test.dart
+++ b/pkg/nnbd_migration/test/api_test.dart
@@ -28,8 +28,15 @@
 
 /// Base class for provisional API tests.
 abstract class _ProvisionalApiTestBase extends AbstractContextTest {
+  String projectPath;
+
   bool get _usePermissiveMode;
 
+  void setUp() {
+    projectPath = convertPath(testsPath);
+    super.setUp();
+  }
+
   /// Hook invoked between stages of processing inputs.
   void _betweenStages() {}
 
@@ -53,7 +60,8 @@
     var migration = NullabilityMigration(listener, getLineInfo,
         permissive: _usePermissiveMode,
         removeViaComments: removeViaComments,
-        warnOnWeakCode: warnOnWeakCode);
+        warnOnWeakCode: warnOnWeakCode,
+        transformWhereOrNull: true);
     for (var path in input.keys) {
       if (!(session.getFile(path)).isPart) {
         for (var unit in (await session.getResolvedLibrary(path)).units) {
@@ -61,6 +69,7 @@
         }
       }
     }
+    expect(migration.unmigratedDependencies, isEmpty);
     _betweenStages();
     for (var path in input.keys) {
       if (!(session.getFile(path)).isPart) {
@@ -101,7 +110,7 @@
       {Map<String, String> migratedInput = const {},
       bool removeViaComments = false,
       bool warnOnWeakCode = false}) async {
-    var sourcePath = convertPath('/home/test/lib/test.dart');
+    var sourcePath = convertPath('$testsPath/lib/test.dart');
     await _checkMultipleFileChanges(
         {sourcePath: content}, {sourcePath: expected},
         migratedInput: migratedInput,
@@ -386,6 +395,7 @@
 }
 ''';
     var alreadyMigrated = '''
+// @dart=2.12
 extension Ext<T> on List<T> {
   g() {}
 }
@@ -397,7 +407,7 @@
 }
 ''';
     await _checkSingleFileChanges(content, expected, migratedInput: {
-      '/home/test/lib/already_migrated.dart': alreadyMigrated
+      '$projectPath/lib/already_migrated.dart': alreadyMigrated
     });
   }
 
@@ -777,27 +787,27 @@
 
   Future<void> test_conditional_expression_guard_subexpression() async {
     var content = '''
-void f(String s, int x) {
-  s == null ? (x = null) : (x = s.length);
+void f(String s, int x, int/*?*/ n) {
+  s == null ? (x = n) : (x = s.length);
 }
 ''';
     var expected = '''
-void f(String s, int x) {
-  s == null ? (x = null!) : (x = s.length);
+void f(String s, int x, int? n) {
+  s == null ? (x = n!) : (x = s.length);
 }
 ''';
     await _checkSingleFileChanges(content, expected, warnOnWeakCode: true);
   }
 
   Future<void> test_conditional_expression_guard_value_ifFalse() async {
-    var content = 'int f(String s) => s != null ? s.length : null;';
-    var expected = 'int f(String s) => s != null ? s.length : null!;';
+    var content = 'int f(String s, int/*?*/ n) => s != null ? s.length : n;';
+    var expected = 'int f(String s, int? n) => s != null ? s.length : n!;';
     await _checkSingleFileChanges(content, expected, warnOnWeakCode: true);
   }
 
   Future<void> test_conditional_expression_guard_value_ifTrue() async {
-    var content = 'int f(String s) => s == null ? null : s.length;';
-    var expected = 'int f(String s) => s == null ? null! : s.length;';
+    var content = 'int f(String s, int/*?*/ n) => s == null ? n : s.length;';
+    var expected = 'int f(String s, int? n) => s == null ? n! : s.length;';
     await _checkSingleFileChanges(content, expected, warnOnWeakCode: true);
   }
 
@@ -2749,6 +2759,99 @@
     await _checkSingleFileChanges(content, expected);
   }
 
+  Future<void> test_firstWhere_complex_target() async {
+    // See https://github.com/dart-lang/sdk/issues/43956
+    var content = '''
+Iterable<Match> allMatches(String str) => 'x'.allMatches(str);
+
+Match matchAsPrefix(String str, [int start = 0]) {
+  return allMatches(str)
+      .firstWhere((match) => match.start == start, orElse: () => null);
+}
+''';
+    var expected = '''
+import 'package:collection/collection.dart' show IterableExtension;
+
+Iterable<Match> allMatches(String str) => 'x'.allMatches(str);
+
+Match? matchAsPrefix(String str, [int start = 0]) {
+  return allMatches(str)
+      .firstWhereOrNull((match) => match.start == start);
+}
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
+  Future<void> test_firstWhere_non_nullable() async {
+    var content = '''
+int firstEven(Iterable<int> x)
+    => x.firstWhere((x) => x.isEven, orElse: () => null);
+''';
+    var expected = '''
+import 'package:collection/collection.dart' show IterableExtension;
+
+int? firstEven(Iterable<int> x)
+    => x.firstWhereOrNull((x) => x.isEven);
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
+  Future<void> test_firstWhere_non_nullable_with_cast() async {
+    var content = '''
+int firstNonZero(Iterable<num> x)
+    => x.firstWhere((x) => x != 0, orElse: () => null);
+''';
+    var expected = '''
+import 'package:collection/collection.dart' show IterableExtension;
+
+int? firstNonZero(Iterable<num> x)
+    => x.firstWhereOrNull((x) => x != 0) as int?;
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
+  Future<void> test_firstWhere_non_nullable_with_non_null_assertion() async {
+    var content = '''
+int/*!*/ firstEven(Iterable<int> x)
+    => x.firstWhere((x) => x.isEven, orElse: () => null);
+''';
+    var expected = '''
+import 'package:collection/collection.dart' show IterableExtension;
+
+int firstEven(Iterable<int> x)
+    => x.firstWhereOrNull((x) => x.isEven)!;
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
+  Future<void> test_firstWhere_nullable() async {
+    var content = '''
+int firstEven(Iterable<int> x)
+    => x.firstWhere((x) => x.isEven, orElse: () => null);
+f() => firstEven([null]);
+''';
+    var expected = '''
+int? firstEven(Iterable<int?> x)
+    => x.firstWhere((x) => x!.isEven, orElse: () => null);
+f() => firstEven([null]);
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
+  Future<void> test_firstWhere_nullable_with_cast() async {
+    var content = '''
+int firstNonZero(Iterable<num> x)
+    => x.firstWhere((x) => x != 0, orElse: () => null);
+f() => firstNonZero([null]);
+''';
+    var expected = '''
+int? firstNonZero(Iterable<num?> x)
+    => x.firstWhere((x) => x != 0, orElse: () => null) as int?;
+f() => firstNonZero([null]);
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
   Future<void> test_flow_analysis_complex() async {
     var content = '''
 int f(int x) {
@@ -3801,16 +3904,16 @@
 class C<T extends Object/*!*/> {
   C(T/*!*/ t);
 }
-main() {
-  C<int> c = C<int>(null);
+test(int/*?*/ n) {
+  C<int> c = C<int>(n);
 }
 ''';
     var expected = '''
 class C<T extends Object> {
   C(T t);
 }
-main() {
-  C<int> c = C<int>(null!);
+test(int? n) {
+  C<int> c = C<int>(n!);
 }
 ''';
     await _checkSingleFileChanges(content, expected);
@@ -3842,16 +3945,16 @@
 class C<T extends Object/*!*/> {
   C(T/*!*/ t);
 }
-main() {
-  C<int> c = C(null);
+test(int/*?*/ n) {
+  C<int> c = C(n);
 }
 ''';
     var expected = '''
 class C<T extends Object> {
   C(T t);
 }
-main() {
-  C<int> c = C(null!);
+test(int? n) {
+  C<int> c = C(n!);
 }
 ''';
     await _checkSingleFileChanges(content, expected);
@@ -4012,6 +4115,102 @@
     await _checkSingleFileChanges(content, expected);
   }
 
+  Future<void> test_lastWhere_non_nullable() async {
+    var content = '''
+int lastEven(Iterable<int> x)
+    => x.lastWhere((x) => x.isEven, orElse: () => null);
+''';
+    var expected = '''
+import 'package:collection/collection.dart' show IterableExtension;
+
+int? lastEven(Iterable<int> x)
+    => x.lastWhereOrNull((x) => x.isEven);
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
+  Future<void> test_lastWhere_nullable() async {
+    var content = '''
+int lastEven(Iterable<int> x)
+    => x.lastWhere((x) => x.isEven, orElse: () => null);
+f() => lastEven([null]);
+''';
+    var expected = '''
+int? lastEven(Iterable<int?> x)
+    => x.lastWhere((x) => x!.isEven, orElse: () => null);
+f() => lastEven([null]);
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
+  Future<void> test_late_final_hint_instance_field_without_constructor() async {
+    var content = '''
+class C {
+  /*late final*/ int x;
+  f() {
+    x = 1;
+  }
+  int g() => x;
+}
+''';
+    var expected = '''
+class C {
+  late final int x;
+  f() {
+    x = 1;
+  }
+  int g() => x;
+}
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
+  Future<void> test_late_final_hint_local_variable() async {
+    var content = '''
+int f(bool b1, bool b2) {
+  /*late final*/ int x;
+  if (b1) {
+    x = 1;
+  }
+  if (b2) {
+    return x;
+  }
+  return 0;
+}
+''';
+    var expected = '''
+int f(bool b1, bool b2) {
+  late final int x;
+  if (b1) {
+    x = 1;
+  }
+  if (b2) {
+    return x;
+  }
+  return 0;
+}
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
+  Future<void> test_late_final_hint_top_level_var() async {
+    var content = '''
+/*late final*/ int x;
+f() {
+  x = 1;
+}
+int g() => x;
+''';
+    var expected = '''
+late final int x;
+f() {
+  x = 1;
+}
+int g() => x;
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
   Future<void> test_late_hint_followed_by_underscore() async {
     var content = '''
 class _C {}
@@ -4145,7 +4344,7 @@
   }
 
   Future<void> test_libraryWithParts() async {
-    var root = '/home/test/lib';
+    var root = '$projectPath/lib';
     var path1 = convertPath('$root/lib.dart');
     var file1 = '''
 part 'src/foo/part.dart';
@@ -4171,7 +4370,7 @@
   }
 
   Future<void> test_libraryWithParts_add_questions() async {
-    var root = '/home/test/lib';
+    var root = '$projectPath/lib';
     var path1 = convertPath('$root/lib.dart');
     var file1 = '''
 part 'src/foo/part.dart';
@@ -4198,6 +4397,22 @@
         {path2: file2, path1: file1}, {path1: expected1, path2: expected2});
   }
 
+  Future<void> test_literal_null_without_valid_migration() async {
+    var content = '''
+void f(int/*!*/ x) {}
+void g() {
+  f(null);
+}
+''';
+    var expected = '''
+void f(int x) {}
+void g() {
+  f(null);
+}
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
   Future<void> test_literals_maintain_nullability() async {
     // See #40590. Without exact nullability, this would migrate to
     // `List<int?> list = <int>[1, 2]`. While the function of exact nullability
@@ -4408,6 +4623,33 @@
     await _checkSingleFileChanges(content, expected);
   }
 
+  Future<void> test_many_type_variables() async {
+    try {
+      assert(false);
+    } catch (_) {
+      // When assertions are enabled, this test fails, so skip it.
+      // See https://github.com/dart-lang/sdk/issues/43945.
+      return;
+    }
+    var content = '''
+void test(C<int> x, double Function<S>(C<S>) y) {
+  x.f<double>(y);
+}
+class C<T> {
+  U f<U>(U Function<V>(C<V>) z) => throw 'foo';
+}
+''';
+    var expected = '''
+void test(C<int> x, double Function<S>(C<S>) y) {
+  x.f<double>(y);
+}
+class C<T> {
+  U f<U>(U Function<V>(C<V>) z) => throw 'foo';
+}
+''';
+    await _checkSingleFileChanges(content, expected, warnOnWeakCode: true);
+  }
+
   Future<void> test_map_nullable_input() async {
     var content = '''
 Iterable<int> f(List<int> x) => x.map((y) => g(y));
@@ -4504,14 +4746,14 @@
       test_methodInvocation_typeArguments_explicit_nonNullable() async {
     var content = '''
 T f<T extends Object/*!*/>(T/*!*/ t) => t;
-void g() {
-  int x = f<int>(null);
+void g(int/*?*/ n) {
+  int x = f<int>(n);
 }
 ''';
     var expected = '''
 T f<T extends Object>(T t) => t;
-void g() {
-  int x = f<int>(null!);
+void g(int? n) {
+  int x = f<int>(n!);
 }
 ''';
     await _checkSingleFileChanges(content, expected);
@@ -4554,14 +4796,14 @@
       test_methodInvocation_typeArguments_inferred_nonNullable() async {
     var content = '''
 T f<T extends Object/*!*/>(T/*!*/ t) => t;
-void g() {
-  int x = f(null);
+void g(int/*?*/ n) {
+  int x = f(n);
 }
 ''';
     var expected = '''
 T f<T extends Object>(T t) => t;
-void g() {
-  int x = f(null!);
+void g(int? n) {
+  int x = f(n!);
 }
 ''';
     await _checkSingleFileChanges(content, expected);
@@ -4991,6 +5233,33 @@
     await _checkSingleFileChanges(content, expected);
   }
 
+  Future<void> test_null_aware_call_followed_by_if_null() async {
+    var content = '''
+typedef MapGetter = Map<String, String> Function();
+void f(Map<String, String> m) {}
+void g(MapGetter/*?*/ mapGetter) {
+  f(mapGetter?.call() ?? {});
+}
+''';
+    var expected = '''
+typedef MapGetter = Map<String, String> Function();
+void f(Map<String, String> m) {}
+void g(MapGetter? mapGetter) {
+  f(mapGetter?.call() ?? {});
+}
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
+  Future<void> test_null_aware_call_tearoff() async {
+    // Kind of a weird use case because `f?.call` is equivalent to `f`, but
+    // let's make sure we analyze it correctly.
+    var content =
+        'int Function(int) g(int/*?*/ Function(int)/*?*/ f) => f?.call;';
+    var expected = 'int? Function(int)? g(int? Function(int)? f) => f?.call;';
+    await _checkSingleFileChanges(content, expected);
+  }
+
   Future<void> test_null_aware_getter_invocation() async {
     var content = '''
 bool f(int i) => i?.isEven;
@@ -5414,7 +5683,7 @@
   }
 
   Future<void> test_prefixes() async {
-    var root = '/home/test/lib';
+    var root = '$projectPath/lib';
     var path1 = convertPath('$root/file1.dart');
     var file1 = '''
 import 'file2.dart';
@@ -5945,6 +6214,34 @@
     await _checkSingleFileChanges(content, expected);
   }
 
+  Future<void> test_singleWhere_non_nullable() async {
+    var content = '''
+int singleEven(Iterable<int> x)
+    => x.singleWhere((x) => x.isEven, orElse: () => null);
+''';
+    var expected = '''
+import 'package:collection/collection.dart' show IterableExtension;
+
+int? singleEven(Iterable<int> x)
+    => x.singleWhereOrNull((x) => x.isEven);
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
+  Future<void> test_singleWhere_nullable() async {
+    var content = '''
+int singleEven(Iterable<int> x)
+    => x.singleWhere((x) => x.isEven, orElse: () => null);
+f() => singleEven([null]);
+''';
+    var expected = '''
+int? singleEven(Iterable<int?> x)
+    => x.singleWhere((x) => x!.isEven, orElse: () => null);
+f() => singleEven([null]);
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
   @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/40728')
   Future<void> test_soft_edge_for_assigned_variable() async {
     var content = '''
@@ -6213,7 +6510,7 @@
   }
 
   Future<void> test_two_files() async {
-    var root = '/home/test/lib';
+    var root = '$projectPath/lib';
     var path1 = convertPath('$root/file1.dart');
     var file1 = '''
 import 'file2.dart';
@@ -6314,7 +6611,10 @@
 }
 ''';
     await _checkSingleFileChanges(content, expected, migratedInput: {
-      '/home/test/lib/migrated_typedef.dart': 'typedef F<R> = Function(R);'
+      '$projectPath/lib/migrated_typedef.dart': '''
+// @dart=2.12
+typedef F<R> = Function(R);
+'''
     });
   }
 
@@ -6350,8 +6650,10 @@
 }
 ''';
     await _checkSingleFileChanges(content, expected, migratedInput: {
-      '/home/test/lib/migrated_typedef.dart':
-          'typedef F<T> = Function<R>(T, R);'
+      '$projectPath/lib/migrated_typedef.dart': '''
+// @dart=2.12
+typedef F<T> = Function<R>(T, R);
+'''
     });
   }
 
@@ -6369,7 +6671,10 @@
 }
 ''';
     await _checkSingleFileChanges(content, expected, migratedInput: {
-      '/home/test/lib/migrated_typedef.dart': 'typedef F = Function<R>(R);'
+      '$projectPath/lib/migrated_typedef.dart': '''
+// @dart=2.12
+typedef F = Function<R>(R);
+'''
     });
   }
 
@@ -6850,8 +7155,8 @@
   }
   i4.toDouble();
 }
-main() {
-  g(false, null, null);
+test(int/*?*/ n) {
+  g(false, n, null);
 }
 ''';
     var expected = '''
@@ -6868,8 +7173,8 @@
   }
   i4!.toDouble();
 }
-main() {
-  g(false, null!, null);
+test(int? n) {
+  g(false, n!, null);
 }
 ''';
     await _checkSingleFileChanges(content, expected);
@@ -7102,6 +7407,30 @@
     await _checkSingleFileChanges(content, expected);
   }
 
+  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/44012')
+  Future<void> test_use_import_prefix_when_adding_re_exported_type() async {
+    addPackageFile('http', 'http.dart', '''
+export 'src/base_client.dart';
+export 'src/client.dart';
+''');
+    addPackageFile('http', 'src/base_client.dart', '''
+import 'client.dart';
+abstract class BaseClient implements Client {}
+''');
+    addPackageFile('http', 'src/client.dart', '''
+abstract class Client {}
+''');
+    var content = '''
+import 'package:http/http.dart' as http;
+http.BaseClient downcast(http.Client x) => x;
+''';
+    var expected = '''
+import 'package:http/http.dart' as http;
+http.BaseClient downcast(http.Client x) => x as http.BaseClient;
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
   Future<void> test_weak_if_visit_weak_subexpression() async {
     var content = '''
 int f(int x, int/*?*/ y) {
diff --git a/pkg/nnbd_migration/test/edge_builder_test.dart b/pkg/nnbd_migration/test/edge_builder_test.dart
index 8f9c943..001a94b 100644
--- a/pkg/nnbd_migration/test/edge_builder_test.dart
+++ b/pkg/nnbd_migration/test/edge_builder_test.dart
@@ -61,7 +61,7 @@
   final AssignmentCheckerForTesting checker;
 
   factory AssignmentCheckerTest() {
-    var typeProvider = TestTypeProvider();
+    var typeProvider = TestTypeProvider().asLegacy;
     _setCoreLibrariesTypeSystem(typeProvider);
 
     var graph = NullabilityGraphForTesting();
@@ -489,7 +489,7 @@
     _myLibrary.definingCompilationUnit = definingUnit;
   }
 
-  static void _setCoreLibrariesTypeSystem(TestTypeProvider typeProvider) {
+  static void _setCoreLibrariesTypeSystem(TypeProviderImpl typeProvider) {
     var typeSystem = TypeSystemImpl(
       isNonNullableByDefault: false,
       implicitCasts: true,
@@ -3126,6 +3126,40 @@
         hard: true);
   }
 
+  Future<void> test_firstWhere_edges() async {
+    await analyze('''
+int firstEven(Iterable<int> x)
+    => x.firstWhere((x) => x.isEven, orElse: () => null);
+''');
+
+    // Normally there would be an edge from the return type of `() => null` to
+    // a substitution node that pointed to the type argument to the type of `x`,
+    // and another substitution node would point from this to the return type of
+    // `firstEven`.  However, since we may replace `firstWhere` with
+    // `firstWhereOrNull` in order to avoid having to make `x`'s type argument
+    // nullable, we need a synthetic edge to ensure that the return type of
+    // `firstEven` is nullable.
+    var closureReturnType = decoratedExpressionType('() => null').returnType;
+    var firstWhereReturnType = variables
+        .decoratedExpressionType(findNode.methodInvocation('firstWhere'));
+    assertEdge(closureReturnType.node, firstWhereReturnType.node, hard: false);
+
+    // There should also be an edge from a substitution node to the return type
+    // of `firstWhere`, to account for the normal data flow (when the element is
+    // found).
+    var typeParameterType = decoratedTypeAnnotation('int>');
+    var firstWhereType = variables.decoratedElementType(findNode
+        .methodInvocation('firstWhere')
+        .methodName
+        .staticElement
+        .declaration);
+    assertEdge(
+        substitutionNode(
+            typeParameterType.node, firstWhereType.returnType.node),
+        firstWhereReturnType.node,
+        hard: false);
+  }
+
   Future<void> test_for_each_element_with_declaration() async {
     await analyze('''
 void f(List<int> l) {
@@ -3435,6 +3469,15 @@
   }
 
   Future<void>
+      test_functionDeclaration_parameter_named_no_default_required_hint() async {
+    await analyze('''
+void f({/*required*/ int i}) {}
+''');
+
+    assertNoUpstreamNullability(decoratedTypeAnnotation('int').node);
+  }
+
+  Future<void>
       test_functionDeclaration_parameter_positionalOptional_default_notNull() async {
     await analyze('''
 void f([int i = 1]) {}
@@ -3584,6 +3627,20 @@
     assertNoUpstreamNullability(nullable_i);
   }
 
+  Future<void>
+      test_functionInvocation_parameter_named_missing_required_hint() async {
+    verifyNoTestUnitErrors = false;
+    await analyze('''
+void f({/*required*/ int i}) {}
+void g() {
+  f();
+}
+''');
+    // The call at `f()` is presumed to be in error; no constraint is recorded.
+    var nullable_i = decoratedTypeAnnotation('int i').node;
+    assertNoUpstreamNullability(nullable_i);
+  }
+
   Future<void> test_functionInvocation_parameter_null() async {
     await analyze('''
 void f(int i) {}
@@ -4635,6 +4692,29 @@
     expect(hasNullCheckHint(findNode.methodInvocation('c.m2')), isTrue);
   }
 
+  Future<void> test_methodInvocation_call_functionTyped() async {
+    await analyze('''
+void f(void Function(int x) callback, int y) => callback.call(y);
+''');
+    assertEdge(decoratedTypeAnnotation('int y').node,
+        decoratedTypeAnnotation('int x').node,
+        hard: true);
+  }
+
+  Future<void> test_methodInvocation_call_interfaceTyped() async {
+    // Make sure that we don't try to treat all methods called `call` as though
+    // the underlying type is a function type.
+    await analyze('''
+abstract class C {
+  void call(int x);
+}
+void f(C c, int y) => c.call(y);
+''');
+    assertEdge(decoratedTypeAnnotation('int y').node,
+        decoratedTypeAnnotation('int x').node,
+        hard: true);
+  }
+
   Future<void> test_methodInvocation_dynamic() async {
     await analyze('''
 class C {
@@ -4984,13 +5064,13 @@
   }
 
   Future<void> test_methodInvocation_parameter_named_differentPackage() async {
-    addPackageFile('pkgC', 'c.dart', '''
+    addPackageFile('foo', 'c.dart', '''
 class C {
   void f({int i}) {}
 }
 ''');
     await analyze('''
-import "package:pkgC/c.dart";
+import "package:foo/c.dart";
 void g(C c, int j) {
   c.f(i: j/*check*/);
 }
@@ -6533,6 +6613,47 @@
     expect(hasNullCheckHint(findNode.propertyAccess('(c).i2')), isTrue);
   }
 
+  Future<void> test_propertyAccess_call_functionTyped() async {
+    await analyze('''
+String/*1*/ Function(int/*2*/) f(String/*3*/ Function(int/*4*/) callback)
+    => callback.call;
+''');
+    assertEdge(decoratedTypeAnnotation('String/*3*/').node,
+        decoratedTypeAnnotation('String/*1*/').node,
+        hard: false, checkable: false);
+    assertEdge(decoratedTypeAnnotation('int/*2*/').node,
+        decoratedTypeAnnotation('int/*4*/').node,
+        hard: false, checkable: false);
+    var tearOffNodeMatcher = anyNode;
+    assertEdge(
+        tearOffNodeMatcher,
+        decoratedGenericFunctionTypeAnnotation('String/*1*/ Function(int/*2*/)')
+            .node,
+        hard: false);
+    assertEdge(never, tearOffNodeMatcher.matchingNode,
+        hard: true, checkable: false);
+  }
+
+  Future<void> test_propertyAccess_call_interfaceTyped() async {
+    // Make sure that we don't try to treat all methods called `call` as though
+    // the underlying type is a function type.
+    await analyze('''
+abstract class C {
+  String call(int x);
+}
+String Function(int) f(C c) => c.call;
+''');
+    assertEdge(decoratedTypeAnnotation('String call').node,
+        decoratedTypeAnnotation('String Function').node,
+        hard: false, checkable: false);
+    assertEdge(decoratedTypeAnnotation('int) f').node,
+        decoratedTypeAnnotation('int x').node,
+        hard: false, checkable: false);
+    assertEdge(never,
+        decoratedGenericFunctionTypeAnnotation('String Function(int)').node,
+        hard: false);
+  }
+
   Future<void> test_propertyAccess_dynamic() async {
     await analyze('''
 class C {
@@ -6560,6 +6681,16 @@
     assertNoEdge(decoratedTypeAnnotation('int i').node, never);
   }
 
+  Future<void> test_propertyAccess_object_property_on_function_type() async {
+    await analyze('int f(void Function() g) => g.hashCode;');
+    var hashCodeReturnType = variables
+        .decoratedElementType(
+            typeProvider.objectType.element.getGetter('hashCode'))
+        .returnType;
+    assertEdge(hashCodeReturnType.node, decoratedTypeAnnotation('int f').node,
+        hard: false);
+  }
+
   Future<void> test_propertyAccess_return_type() async {
     await analyze('''
 class C {
@@ -7629,11 +7760,11 @@
   }
 
   Future<void> test_topLevelVar_reference_differentPackage() async {
-    addPackageFile('pkgPi', 'piConst.dart', '''
+    addPackageFile('foo', 'piConst.dart', '''
 double pi = 3.1415;
 ''');
     await analyze('''
-import "package:pkgPi/piConst.dart";
+import "package:foo/piConst.dart";
 double get myPi => pi;
 ''');
     var myPiType = decoratedTypeAnnotation('double get');
diff --git a/pkg/nnbd_migration/test/edit_plan_test.dart b/pkg/nnbd_migration/test/edit_plan_test.dart
index 224da57..64ff882 100644
--- a/pkg/nnbd_migration/test/edit_plan_test.dart
+++ b/pkg/nnbd_migration/test/edit_plan_test.dart
@@ -332,11 +332,11 @@
   }
 
   Future<void> test_addUnaryPostfix_outer_precedence() async {
-    await analyze('f(x) => x!;');
+    await analyze('f(x) => x/*!*/;');
     checkPlan(
-        planner.addUnaryPostfix(
-            planner.passThrough(findNode.simple('x!')), TokenType.PLUS_PLUS),
-        'f(x) => x++!;');
+        planner.addUnaryPostfix(planner.passThrough(findNode.simple('x/*!*/')),
+            TokenType.PLUS_PLUS),
+        'f(x) => x++/*!*/;');
   }
 
   Future<void> test_addUnaryPrefix_inner_precedence_add_parens() async {
diff --git a/pkg/nnbd_migration/test/fix_aggregator_test.dart b/pkg/nnbd_migration/test/fix_aggregator_test.dart
index 7486bc1..c3eb5f2 100644
--- a/pkg/nnbd_migration/test/fix_aggregator_test.dart
+++ b/pkg/nnbd_migration/test/fix_aggregator_test.dart
@@ -32,6 +32,209 @@
       (testAnalysisResult.typeProvider as TypeProviderImpl)
           .asNonNullableByDefault;
 
+  Future<void> test_addImport_after_library() async {
+    await analyze('''
+library foo;
+
+main() {}
+''');
+    var previewInfo = run({
+      findNode.unit: NodeChangeForCompilationUnit()
+        ..addImport('package:collection/collection.dart', 'IterableExtension')
+    });
+    expect(previewInfo.applyTo(code), '''
+library foo;
+
+import 'package:collection/collection.dart' show IterableExtension;
+
+main() {}
+''');
+  }
+
+  Future<void> test_addImport_after_library_before_other() async {
+    addPackageFile('fixnum', 'fixnum.dart', '');
+    await analyze('''
+library foo;
+
+import 'package:fixnum/fixnum.dart';
+
+main() {}
+''');
+    var previewInfo = run({
+      findNode.unit: NodeChangeForCompilationUnit()
+        ..addImport('package:collection/collection.dart', 'IterableExtension')
+    });
+    expect(previewInfo.applyTo(code), '''
+library foo;
+
+import 'package:collection/collection.dart' show IterableExtension;
+import 'package:fixnum/fixnum.dart';
+
+main() {}
+''');
+  }
+
+  Future<void> test_addImport_atEnd_multiple() async {
+    addPackageFile('args', 'args.dart', '');
+    await analyze('''
+import 'package:args/args.dart';
+
+main() {}
+''');
+    var previewInfo = run({
+      findNode.unit: NodeChangeForCompilationUnit()
+        ..addImport('package:fixnum/fixnum.dart', 'Int32')
+        ..addImport('package:collection/collection.dart', 'IterableExtension')
+    });
+    expect(previewInfo.applyTo(code), '''
+import 'package:args/args.dart';
+import 'package:collection/collection.dart' show IterableExtension;
+import 'package:fixnum/fixnum.dart' show Int32;
+
+main() {}
+''');
+  }
+
+  Future<void> test_addImport_atStart_multiple() async {
+    addPackageFile('fixnum', 'fixnum.dart', '');
+    await analyze('''
+import 'package:fixnum/fixnum.dart';
+
+main() {}
+''');
+    var previewInfo = run({
+      findNode.unit: NodeChangeForCompilationUnit()
+        ..addImport('package:collection/collection.dart', 'IterableExtension')
+        ..addImport('package:args/args.dart', 'ArgParser')
+    });
+    expect(previewInfo.applyTo(code), '''
+import 'package:args/args.dart' show ArgParser;
+import 'package:collection/collection.dart' show IterableExtension;
+import 'package:fixnum/fixnum.dart';
+
+main() {}
+''');
+  }
+
+  Future<void> test_addImport_before_export() async {
+    await analyze('''
+export 'dart:async';
+
+main() {}
+''');
+    var previewInfo = run({
+      findNode.unit: NodeChangeForCompilationUnit()
+        ..addImport('package:collection/collection.dart', 'IterableExtension')
+    });
+    expect(previewInfo.applyTo(code), '''
+import 'package:collection/collection.dart' show IterableExtension;
+export 'dart:async';
+
+main() {}
+''');
+  }
+
+  Future<void> test_addImport_no_previous_imports_multiple() async {
+    await analyze('''
+main() {}
+''');
+    var previewInfo = run({
+      findNode.unit: NodeChangeForCompilationUnit()
+        ..addImport('dart:async', 'Future')
+        ..addImport('dart:math', 'sin')
+    });
+    expect(previewInfo.applyTo(code), '''
+import 'dart:async' show Future;
+import 'dart:math' show sin;
+
+main() {}
+''');
+  }
+
+  Future<void> test_addImport_recursive() async {
+    addPackageFile('args', 'args.dart', '');
+    addPackageFile('fixnum', 'fixnum.dart', 'class Int32 {}');
+    await analyze('''
+import 'package:args/args.dart';
+import 'package:fixnum/fixnum.dart' show Int32;
+
+main() => null;
+''');
+    var previewInfo = run({
+      findNode.unit: NodeChangeForCompilationUnit()
+        ..addImport('package:collection/collection.dart', 'IterableExtension'),
+      findNode.import('package:fixnum').combinators[0]:
+          NodeChangeForShowCombinator()..addName('Int64'),
+      findNode.expression('null'): NodeChangeForExpression()..addNullCheck(null)
+    });
+    expect(previewInfo.applyTo(code), '''
+import 'package:args/args.dart';
+import 'package:collection/collection.dart' show IterableExtension;
+import 'package:fixnum/fixnum.dart' show Int32, Int64;
+
+main() => null!;
+''');
+  }
+
+  Future<void> test_addImport_sort_shown_names() async {
+    await analyze('''
+main() {}
+''');
+    var previewInfo = run({
+      findNode.unit: NodeChangeForCompilationUnit()
+        ..addImport('dart:async', 'Stream')
+        ..addImport('dart:async', 'Future')
+    });
+    expect(previewInfo.applyTo(code), '''
+import 'dart:async' show Future, Stream;
+
+main() {}
+''');
+  }
+
+  Future<void> test_addImport_sorted() async {
+    addPackageFile('args', 'args.dart', '');
+    addPackageFile('fixnum', 'fixnum.dart', '');
+    await analyze('''
+import 'package:args/args.dart';
+import 'package:fixnum/fixnum.dart';
+
+main() {}
+''');
+    var previewInfo = run({
+      findNode.unit: NodeChangeForCompilationUnit()
+        ..addImport('package:collection/collection.dart', 'IterableExtension')
+    });
+    expect(previewInfo.applyTo(code), '''
+import 'package:args/args.dart';
+import 'package:collection/collection.dart' show IterableExtension;
+import 'package:fixnum/fixnum.dart';
+
+main() {}
+''');
+  }
+
+  Future<void> test_addImport_sorted_multiple() async {
+    addPackageFile('collection', 'collection.dart', '');
+    await analyze('''
+import 'package:collection/collection.dart';
+
+main() {}
+''');
+    var previewInfo = run({
+      findNode.unit: NodeChangeForCompilationUnit()
+        ..addImport('package:fixnum/fixnum.dart', 'Int32')
+        ..addImport('package:args/args.dart', 'ArgParser')
+    });
+    expect(previewInfo.applyTo(code), '''
+import 'package:args/args.dart' show ArgParser;
+import 'package:collection/collection.dart';
+import 'package:fixnum/fixnum.dart' show Int32;
+
+main() {}
+''');
+  }
+
   Future<void> test_addRequired() async {
     await analyze('f({int x}) => 0;');
     var previewInfo = run({
@@ -41,6 +244,99 @@
     expect(previewInfo.applyTo(code), 'f({required int x}) => 0;');
   }
 
+  Future<void> test_addRequired_afterMetadata() async {
+    await analyze('f({@deprecated int x}) => 0;');
+    var previewInfo = run({
+      findNode.defaultParameter('int x'): NodeChangeForDefaultFormalParameter()
+        ..addRequiredKeyword = true
+    });
+    expect(previewInfo.applyTo(code), 'f({@deprecated required int x}) => 0;');
+  }
+
+  Future<void> test_addRequired_afterMetadata_andRequiredAnnotation() async {
+    addMetaPackage();
+    var content = '''
+import 'package:meta/meta.dart';
+f({@required @deprecated int x}) {}
+''';
+    await analyze(content);
+    var annotation = findNode.annotation('required');
+    var previewInfo = run({
+      findNode.defaultParameter('int x'): NodeChangeForDefaultFormalParameter()
+        ..addRequiredKeyword = true
+        ..annotationToRemove = annotation
+    });
+    expect(previewInfo.applyTo(code), '''
+import 'package:meta/meta.dart';
+f({@deprecated required int x}) {}
+''');
+    expect(previewInfo.values, hasLength(2));
+
+    expect(previewInfo[content.indexOf('int ')], hasLength(1));
+    expect(previewInfo[content.indexOf('int ')].single.isInsertion, true);
+    expect(previewInfo[content.indexOf('@required')], isNotNull);
+    expect(previewInfo[content.indexOf('@required')].single.isDeletion, true);
+  }
+
+  Future<void> test_addRequired_afterMetadata_beforeFinal() async {
+    await analyze('f({@deprecated final int x}) => 0;');
+    var previewInfo = run({
+      findNode.defaultParameter('int x'): NodeChangeForDefaultFormalParameter()
+        ..addRequiredKeyword = true
+    });
+    expect(previewInfo.applyTo(code),
+        'f({@deprecated required final int x}) => 0;');
+  }
+
+  Future<void> test_addRequired_afterMetadata_beforeFunctionTyped() async {
+    await analyze('f({@deprecated int x()}) => 0;');
+    var previewInfo = run({
+      findNode.defaultParameter('int x'): NodeChangeForDefaultFormalParameter()
+        ..addRequiredKeyword = true
+    });
+    expect(
+        previewInfo.applyTo(code), 'f({@deprecated required int x()}) => 0;');
+  }
+
+  Future<void> test_addShownName_atEnd_multiple() async {
+    await analyze("import 'dart:math' show cos;");
+    var previewInfo = run({
+      findNode.import('dart:math').combinators[0]: NodeChangeForShowCombinator()
+        ..addName('tan')
+        ..addName('sin')
+    });
+    expect(previewInfo.applyTo(code), "import 'dart:math' show cos, sin, tan;");
+  }
+
+  Future<void> test_addShownName_atStart_multiple() async {
+    await analyze("import 'dart:math' show tan;");
+    var previewInfo = run({
+      findNode.import('dart:math').combinators[0]: NodeChangeForShowCombinator()
+        ..addName('sin')
+        ..addName('cos')
+    });
+    expect(previewInfo.applyTo(code), "import 'dart:math' show cos, sin, tan;");
+  }
+
+  Future<void> test_addShownName_sorted() async {
+    await analyze("import 'dart:math' show cos, tan;");
+    var previewInfo = run({
+      findNode.import('dart:math').combinators[0]: NodeChangeForShowCombinator()
+        ..addName('sin')
+    });
+    expect(previewInfo.applyTo(code), "import 'dart:math' show cos, sin, tan;");
+  }
+
+  Future<void> test_addShownName_sorted_multiple() async {
+    await analyze("import 'dart:math' show sin;");
+    var previewInfo = run({
+      findNode.import('dart:math').combinators[0]: NodeChangeForShowCombinator()
+        ..addName('tan')
+        ..addName('cos')
+    });
+    expect(previewInfo.applyTo(code), "import 'dart:math' show cos, sin, tan;");
+  }
+
   Future<void> test_adjacentFixes() async {
     await analyze('f(a, b) => a + b;');
     var aRef = findNode.simple('a +');
@@ -54,6 +350,56 @@
     expect(previewInfo.applyTo(code), 'f(a, b) => (a! + b!)!;');
   }
 
+  Future<void> test_argument_list_drop_all_arguments() async {
+    var content = '''
+f([int x, int y]) => null;
+g(int x, int y) => f(x, y);
+''';
+    await analyze(content);
+    var previewInfo = run({
+      findNode.methodInvocation('f(x').argumentList: NodeChangeForArgumentList()
+        ..dropArgument(findNode.simple('y);'), null)
+        ..dropArgument(findNode.simple('x, y'), null)
+    });
+    expect(previewInfo.applyTo(code), '''
+f([int x, int y]) => null;
+g(int x, int y) => f();
+''');
+  }
+
+  Future<void> test_argument_list_drop_one_argument() async {
+    var content = '''
+f([int x, int y]) => null;
+g(int x, int y) => f(x, y);
+''';
+    await analyze(content);
+    var previewInfo = run({
+      findNode.methodInvocation('f(x').argumentList: NodeChangeForArgumentList()
+        ..dropArgument(findNode.simple('y);'), null)
+    });
+    expect(previewInfo.applyTo(code), '''
+f([int x, int y]) => null;
+g(int x, int y) => f(x);
+''');
+  }
+
+  Future<void> test_argument_list_recursive_changes() async {
+    var content = '''
+f([int x, int y]) => null;
+g(int x, int y) => f(x, y);
+''';
+    await analyze(content);
+    var previewInfo = run({
+      findNode.methodInvocation('f(x').argumentList: NodeChangeForArgumentList()
+        ..dropArgument(findNode.simple('y);'), null),
+      findNode.simple('x, y'): NodeChangeForExpression()..addNullCheck(null)
+    });
+    expect(previewInfo.applyTo(code), '''
+f([int x, int y]) => null;
+g(int x, int y) => f(x!);
+''');
+  }
+
   Future<void> test_assignment_add_null_check() async {
     var content = 'f(int x, int y) => x += y;';
     await analyze(content);
@@ -802,6 +1148,23 @@
     expect(previewInfo.applyTo(code), 'f(int? x) {}');
   }
 
+  Future<void> test_methodName_change() async {
+    await analyze('f() => f();');
+    var previewInfo = run({
+      findNode.methodInvocation('f();').methodName: NodeChangeForMethodName()
+        ..replaceWith('g', null)
+    });
+    expect(previewInfo.applyTo(code), 'f() => g();');
+  }
+
+  Future<void> test_methodName_no_change() async {
+    await analyze('f() => f();');
+    var previewInfo = run({
+      findNode.methodInvocation('f();').methodName: NodeChangeForMethodName()
+    });
+    expect(previewInfo, isNull);
+  }
+
   Future<void> test_noChangeToTypeAnnotation() async {
     await analyze('int x = 0;');
     var typeName = findNode.typeName('int');
@@ -825,6 +1188,16 @@
     expect(previewInfo, null);
   }
 
+  Future<void> test_noValidMigration() async {
+    await analyze('f(a) => null;');
+    var literal = findNode.nullLiteral('null');
+    var previewInfo = run(
+        {literal: NodeChangeForExpression()..addNoValidMigration(_MockInfo())});
+    expect(previewInfo.applyTo(code), code);
+    expect(previewInfo.applyTo(code, includeInformative: true),
+        'f(a) => null /* no valid migration */;');
+  }
+
   Future<void> test_nullCheck_index_cascadeResult() async {
     await analyze('f(a) => a..[0].c;');
     var index = findNode.index('[0]');
@@ -1409,6 +1782,24 @@
     expect(previewInfo.applyTo(code), 'f(x) => x.y;');
   }
 
+  Future<void>
+      test_requiredAnnotationToRequiredKeyword_leadingAnnotations() async {
+    addMetaPackage();
+    await analyze('''
+import 'package:meta/meta.dart';
+f({@deprecated @required int x}) {}
+''');
+    var annotation = findNode.annotation('required');
+    var previewInfo = run({
+      annotation: NodeChangeForAnnotation()..changeToRequiredKeyword = true
+    });
+    expect(previewInfo.applyTo(code), '''
+import 'package:meta/meta.dart';
+f({@deprecated required int x}) {}
+''');
+    expect(previewInfo.values.single.single.isDeletion, true);
+  }
+
   Future<void> test_requiredAnnotationToRequiredKeyword_prefixed() async {
     addMetaPackage();
     await analyze('''
diff --git a/pkg/nnbd_migration/test/fix_builder_test.dart b/pkg/nnbd_migration/test/fix_builder_test.dart
index 4e3e6e9..29e39622 100644
--- a/pkg/nnbd_migration/test/fix_builder_test.dart
+++ b/pkg/nnbd_migration/test/fix_builder_test.dart
@@ -68,6 +68,9 @@
   static final isNodeChangeForExpression =
       TypeMatcher<NodeChangeForExpression>();
 
+  static final isNoValidMigration =
+      isNodeChangeForExpression.havingNoValidMigrationWithInfo(anything);
+
   static final isNullCheck =
       isNodeChangeForExpression.havingNullCheckWithInfo(anything);
 
@@ -77,6 +80,16 @@
           'removeLanguageVersionComment',
           true);
 
+  static final isAddImportOfIterableExtension =
+      TypeMatcher<NodeChangeForCompilationUnit>()
+          .having((c) => c.addImports, 'addImports', {
+    'package:collection/collection.dart': {'IterableExtension'}
+  });
+
+  static final isAddShowOfIterableExtension =
+      TypeMatcher<NodeChangeForShowCombinator>().having((c) => c.addNames,
+          'addNames', unorderedEquals(['IterableExtension']));
+
   static final isRemoveNullAwareness =
       TypeMatcher<NodeChangeForPropertyAccess>()
           .having((c) => c.removeNullAwareness, 'removeNullAwareness', true);
@@ -106,11 +119,21 @@
     return unit;
   }
 
+  TypeMatcher<NodeChangeForArgumentList> isDropArgument(
+          dynamic argumentsToDrop) =>
+      TypeMatcher<NodeChangeForArgumentList>()
+          .having((c) => c.argumentsToDrop, 'argumentsToDrop', argumentsToDrop);
+
   TypeMatcher<AtomicEditInfo> isInfo(description, fixReasons) =>
       TypeMatcher<AtomicEditInfo>()
           .having((i) => i.description, 'description', description)
           .having((i) => i.fixReasons, 'fixReasons', fixReasons);
 
+  TypeMatcher<NodeChangeForMethodName> isMethodNameChange(
+          dynamic replacement) =>
+      TypeMatcher<NodeChangeForMethodName>()
+          .having((c) => c.replacement, 'replacement', replacement);
+
   Map<AstNode, NodeChange> scopedChanges(
           FixBuilder fixBuilder, AstNode scope) =>
       {
@@ -1342,6 +1365,24 @@
         changes: {findNode.simple('y;'): isNullCheck});
   }
 
+  Future<void> test_firstWhere_transform() async {
+    await analyze('''
+_f(Iterable<int> x) => x.firstWhere((n) => n.isEven, orElse: () => null);
+''');
+    var methodInvocation = findNode.methodInvocation('firstWhere');
+    var functionExpression = findNode.functionExpression('() => null');
+    var fixBuilder = visitSubexpression(methodInvocation, 'int?', changes: {
+      methodInvocation.methodName: isMethodNameChange('firstWhereOrNull'),
+      methodInvocation.argumentList:
+          isDropArgument({functionExpression.parent: anything}),
+      // Behavior of the function expression and its subexpression don't matter
+      // because they're being dropped.
+      functionExpression.parent: anything,
+      findNode.nullLiteral('null'): anything
+    });
+    expect(fixBuilder.needsIterableExtension, true);
+  }
+
   Future<void> test_functionExpressionInvocation_dynamic() async {
     await analyze('''
 _f(dynamic d) => d();
@@ -1543,6 +1584,75 @@
     });
   }
 
+  Future<void> test_import_IterableExtension_already_imported_add_show() async {
+    addPackageFile('collection', 'collection.dart', 'class PriorityQueue {}');
+    await analyze('''
+import 'package:collection/collection.dart' show PriorityQueue;
+
+main() {}
+''');
+    visitAll(injectNeedsIterableExtension: true, changes: {
+      findNode.import('package:collection').combinators[0]:
+          isAddShowOfIterableExtension
+    });
+  }
+
+  Future<void> test_import_IterableExtension_already_imported_all() async {
+    addPackageFile('collection', 'collection.dart', '');
+    await analyze('''
+import 'package:collection/collection.dart';
+
+main() {}
+''');
+    visitAll(injectNeedsIterableExtension: true, changes: {});
+  }
+
+  Future<void>
+      test_import_IterableExtension_already_imported_and_shown() async {
+    addPackageFile('collection', 'collection.dart',
+        'extension IterableExtension<T> on Iterable<T> {}');
+    await analyze('''
+import 'package:collection/collection.dart' show IterableExtension;
+
+main() {}
+''');
+    visitAll(injectNeedsIterableExtension: true, changes: {});
+  }
+
+  Future<void> test_import_IterableExtension_already_imported_prefixed() async {
+    addPackageFile('collection', 'collection.dart', '');
+    await analyze('''
+import 'package:collection/collection.dart' as c;
+
+main() {}
+''');
+    visitAll(
+        injectNeedsIterableExtension: true,
+        changes: {findNode.unit: isAddImportOfIterableExtension});
+  }
+
+  Future<void> test_import_IterableExtension_other_import() async {
+    addPackageFile(
+        'foo', 'foo.dart', 'extension IterableExtension<T> on Iterable<T> {}');
+    await analyze('''
+import 'package:foo/foo.dart' show IterableExtension;
+
+main() {}
+''');
+    visitAll(
+        injectNeedsIterableExtension: true,
+        changes: {findNode.unit: isAddImportOfIterableExtension});
+  }
+
+  Future<void> test_import_IterableExtension_simple() async {
+    await analyze('''
+main() {}
+''');
+    visitAll(
+        injectNeedsIterableExtension: true,
+        changes: {findNode.unit: isAddImportOfIterableExtension});
+  }
+
   Future<void> test_indexExpression_dynamic() async {
     await analyze('''
 Object/*!*/ _f(dynamic d, int/*?*/ i) => d[i];
@@ -1953,6 +2063,16 @@
     visitSubexpression(assignment, 'int?');
   }
 
+  Future<void> test_nullable_value_in_null_context() async {
+    await analyze('int/*!*/ f(int/*?*/ i) => i;');
+    var iRef = findNode.simple('i;');
+    visitSubexpression(iRef, 'int', changes: {
+      iRef: isNodeChangeForExpression.havingNullCheckWithInfo(isInfo(
+          NullabilityFixDescription.checkExpression,
+          {FixReasonTarget.root: TypeMatcher<NullabilityEdge>()}))
+    });
+  }
+
   Future<void> test_nullAssertion_promotes() async {
     await analyze('''
 _f(bool/*?*/ x) => x && x;
@@ -1970,6 +2090,36 @@
     visitSubexpression(findNode.nullLiteral('null'), 'Null');
   }
 
+  Future<void> test_nullLiteral_hinted() async {
+    await analyze('''
+int/*!*/ f() => null/*!*/;
+''');
+    var literal = findNode.nullLiteral('null');
+    // Normally we would leave the null literal alone and add an informative
+    // comment saying there's no valid migration for it.  But since the user
+    // specifically hinted that `!` should be added, we respect that.
+    visitSubexpression(literal, 'Never', changes: {
+      literal: isNodeChangeForExpression.havingNullCheckWithInfo(isInfo(
+          NullabilityFixDescription.checkExpressionDueToHint,
+          {FixReasonTarget.root: TypeMatcher<FixReason_NullCheckHint>()}))
+    });
+  }
+
+  Future<void> test_nullLiteral_noValidMigration() async {
+    await analyze('''
+int/*!*/ f() => null;
+''');
+    var literal = findNode.nullLiteral('null');
+    // Note: in spite of the fact that we leave the literal as `null`, we
+    // analyze it as though it has type `Never`, because it's in a context where
+    // `null` doesn't work.
+    visitSubexpression(literal, 'Never', changes: {
+      literal: isNodeChangeForExpression.havingNoValidMigrationWithInfo(isInfo(
+          NullabilityFixDescription.noValidMigrationForNull,
+          {FixReasonTarget.root: TypeMatcher<NullabilityEdge>()}))
+    });
+  }
+
   Future<void> test_parenthesizedExpression() async {
     await analyze('''
 f() => (1);
@@ -3295,8 +3445,12 @@
 
   void visitAll(
       {Map<AstNode, Matcher> changes = const <Expression, Matcher>{},
-      Map<AstNode, Set<Problem>> problems = const <AstNode, Set<Problem>>{}}) {
+      Map<AstNode, Set<Problem>> problems = const <AstNode, Set<Problem>>{},
+      bool injectNeedsIterableExtension = false}) {
     var fixBuilder = _createFixBuilder(testUnit);
+    if (injectNeedsIterableExtension) {
+      fixBuilder.needsIterableExtension = true;
+    }
     fixBuilder.visitAll();
     expect(scopedChanges(fixBuilder, testUnit), changes);
     expect(scopedProblems(fixBuilder, testUnit), problems);
@@ -3330,7 +3484,7 @@
     expect(scopedProblems(fixBuilder, node), problems);
   }
 
-  void visitSubexpression(Expression node, String expectedType,
+  FixBuilder visitSubexpression(Expression node, String expectedType,
       {Map<AstNode, Matcher> changes = const <Expression, Matcher>{},
       Map<AstNode, Set<Problem>> problems = const <AstNode, Set<Problem>>{},
       bool warnOnWeakCode = false}) {
@@ -3340,6 +3494,7 @@
     expect(type.getDisplayString(withNullability: true), expectedType);
     expect(scopedChanges(fixBuilder, node), changes);
     expect(scopedProblems(fixBuilder, node), problems);
+    return fixBuilder;
   }
 
   void visitTypeAnnotation(TypeAnnotation node, String expectedType,
@@ -3383,7 +3538,8 @@
         null,
         scope.thisOrAncestorOfType<CompilationUnit>(),
         warnOnWeakCode,
-        graph);
+        graph,
+        true);
   }
 
   bool _isInScope(AstNode node, AstNode scope) {
@@ -3403,6 +3559,12 @@
       having((c) => c.addsNullCheck, 'addsNullCheck', true)
           .having((c) => c.addNullCheckInfo, 'addNullCheckInfo', matcher);
 
+  TypeMatcher<NodeChangeForExpression> havingNoValidMigrationWithInfo(
+          dynamic matcher) =>
+      having((c) => c.addsNoValidMigration, 'addsNoValidMigration', true)
+          .having((c) => c.addNoValidMigrationInfo, 'addNoValidMigrationInfo',
+              matcher);
+
   TypeMatcher<NodeChangeForExpression> havingIndroduceAsWithInfo(
           dynamic typeStringMatcher, dynamic infoMatcher) =>
       having((c) => c.introducesAsType.toString(), 'introducesAsType (string)',
diff --git a/pkg/nnbd_migration/test/front_end/analysis_abstract.dart b/pkg/nnbd_migration/test/front_end/analysis_abstract.dart
index 7daaddd..1302e28 100644
--- a/pkg/nnbd_migration/test/front_end/analysis_abstract.dart
+++ b/pkg/nnbd_migration/test/front_end/analysis_abstract.dart
@@ -2,14 +2,12 @@
 // 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:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:test/test.dart';
 
 import '../abstract_context.dart';
 
 /// An abstract base for all 'analysis' domain tests.
-class AbstractAnalysisTest extends AbstractContextTest
-    with ResourceProviderMixin {
+class AbstractAnalysisTest extends AbstractContextTest {
   String projectPath;
   String testFolder;
   String testFile;
@@ -73,8 +71,8 @@
 
   void setUp() {
     super.setUp();
-    projectPath = convertPath(AbstractContextTest.testsPath);
-    testFolder = convertPath('${AbstractContextTest.testsPath}/bin');
-    testFile = convertPath('${AbstractContextTest.testsPath}/bin/test.dart');
+    projectPath = convertPath(testsPath);
+    testFolder = convertPath('$testsPath/bin');
+    testFile = convertPath('$testsPath/bin/test.dart');
   }
 }
diff --git a/pkg/nnbd_migration/test/front_end/info_builder_test.dart b/pkg/nnbd_migration/test/front_end/info_builder_test.dart
index 8d7ad3c..b4f76ed 100644
--- a/pkg/nnbd_migration/test/front_end/info_builder_test.dart
+++ b/pkg/nnbd_migration/test/front_end/info_builder_test.dart
@@ -360,6 +360,28 @@
         kind: NullabilityFixKind.addLateDueToTestSetup);
   }
 
+  Future<void> test_addLateFinal_dueToHint() async {
+    var content = '/*late final*/ int x = 0;';
+    var migratedContent = '/*late final*/ int  x = 0;';
+    var unit = await buildInfoForSingleTestFile(content,
+        migratedContent: migratedContent);
+    var regions = unit.fixRegions;
+    expect(regions, hasLength(2));
+    var textToRemove = '/*late final*/ ';
+    assertRegionPair(regions, 0,
+        offset1: migratedContent.indexOf('/*'),
+        length1: 2,
+        offset2: migratedContent.indexOf('*/'),
+        length2: 2,
+        explanation: 'Added late and final keywords, due to a hint',
+        kind: NullabilityFixKind.addLateFinalDueToHint,
+        edits: (List<EditDetail> edits) => assertEdit(
+            edit: edits.single,
+            offset: content.indexOf(textToRemove),
+            length: textToRemove.length,
+            replacement: ''));
+  }
+
   Future<void> test_compound_assignment_nullable_result() async {
     var unit = await buildInfoForSingleTestFile('''
 abstract class C {
@@ -774,7 +796,7 @@
         edits: isEmpty);
   }
 
-  Future<void> test_insertedRequired_fieldFormal() async {
+  Future<void> test_insertedRequired_fieldFormal_hint() async {
     var unit = await buildInfoForSingleTestFile('''
 class C {
   int level;
@@ -799,10 +821,41 @@
         explanation: "Add 'required' keyword to parameter 'level' in 'C.'",
         kind: NullabilityFixKind.addRequired);
     assertEdit(
-        edit: edits[0], offset: 42, length: 0, replacement: '@required ');
+        edit: edits[0], offset: 42, length: 0, replacement: '/*required*/ ');
   }
 
-  Future<void> test_insertedRequired_parameter() async {
+  Future<void> test_insertedRequired_fieldFormal() async {
+    addMetaPackage();
+    var unit = await buildInfoForSingleTestFile('''
+import 'package:meta/meta.dart';
+class C {
+  int level;
+  int level2;
+  C({this.level}) : this.level2 = level + 1;
+}
+''', migratedContent: '''
+import 'package:meta/meta.dart';
+class C {
+  int  level;
+  int  level2;
+  C({required this.level}) : this.level2 = level + 1;
+}
+''');
+    var regions = unit.fixRegions;
+    expect(regions, hasLength(1));
+    var region = regions[0];
+    var edits = region.edits;
+    assertRegion(
+        region: region,
+        offset: 77,
+        length: 9,
+        explanation: "Add 'required' keyword to parameter 'level' in 'C.'",
+        kind: NullabilityFixKind.addRequired);
+    assertEdit(
+        edit: edits[0], offset: 75, length: 0, replacement: '@required ');
+  }
+
+  Future<void> test_insertedRequired_parameter_hint() async {
     var unit = await buildInfoForSingleTestFile('''
 class C {
   int level = 0;
@@ -825,7 +878,59 @@
         explanation: "Add 'required' keyword to parameter 'lvl' in 'C.f'",
         kind: NullabilityFixKind.addRequired);
     assertEdit(
-        edit: edits[0], offset: 37, length: 0, replacement: '@required ');
+        edit: edits[0], offset: 37, length: 0, replacement: '/*required*/ ');
+  }
+
+  Future<void> test_insertedRequired_parameter_metaPrefixed() async {
+    addMetaPackage();
+    var unit = await buildInfoForSingleTestFile('''
+import 'package:meta/meta.dart' as meta;
+class C {
+  int level = 0;
+  bool f({int lvl}) => lvl >= level;
+}
+''', migratedContent: '''
+import 'package:meta/meta.dart' as meta;
+class C {
+  int  level = 0;
+  bool  f({required int  lvl}) => lvl >= level;
+}
+''');
+    var regions = unit.fixRegions;
+    expect(regions, hasLength(1));
+    var region = regions[0];
+    var edits = region.edits;
+    assertEdit(
+        edit: edits[0], offset: 78, length: 0, replacement: '@meta.required ');
+  }
+
+  Future<void> test_insertedRequired_parameter() async {
+    addMetaPackage();
+    var unit = await buildInfoForSingleTestFile('''
+import 'package:meta/meta.dart';
+class C {
+  int level = 0;
+  bool f({int lvl}) => lvl >= level;
+}
+''', migratedContent: '''
+import 'package:meta/meta.dart';
+class C {
+  int  level = 0;
+  bool  f({required int  lvl}) => lvl >= level;
+}
+''');
+    var regions = unit.fixRegions;
+    expect(regions, hasLength(1));
+    var region = regions[0];
+    var edits = region.edits;
+    assertRegion(
+        region: region,
+        offset: 72,
+        length: 9,
+        explanation: "Add 'required' keyword to parameter 'lvl' in 'C.f'",
+        kind: NullabilityFixKind.addRequired);
+    assertEdit(
+        edit: edits[0], offset: 70, length: 0, replacement: '@required ');
   }
 
   Future<void> test_insertParens() async {
@@ -864,6 +969,26 @@
         kind: NullabilityFixKind.checkExpression);
   }
 
+  Future<void> test_method_name_change() async {
+    addPackageFile('collection', 'collection.dart', '');
+    var content = '''
+import 'package:collection/collection.dart';
+
+int f(List<int> values, int/*?*/ x)
+    => values.firstWhere((i) => (i + x).isEven,
+        orElse: () => null);
+''';
+    var migratedContent = '''
+import 'package:collection/collection.dart';
+
+int? f(List<int >  values, int/*?*/ x)
+    => values.firstWherefirstWhereOrNull((i) => (i + x!).isEven,
+        orElse: () => null);
+''';
+    await buildInfoForSingleTestFile(content,
+        migratedContent: migratedContent, removeViaComments: false);
+  }
+
   void test_nullAwareAssignment_remove() async {
     var unit = await buildInfoForSingleTestFile('''
 int f(int/*!*/ x, int y) => x ??= y;
diff --git a/pkg/nnbd_migration/test/front_end/instrumentation_renderer_test.dart b/pkg/nnbd_migration/test/front_end/instrumentation_renderer_test.dart
index 5c456f8..452d4d0 100644
--- a/pkg/nnbd_migration/test/front_end/instrumentation_renderer_test.dart
+++ b/pkg/nnbd_migration/test/front_end/instrumentation_renderer_test.dart
@@ -19,44 +19,36 @@
 @reflectiveTest
 class InstrumentationRendererTest extends NnbdMigrationTestBase {
   /// Render the instrumentation view for [files].
-  Future<String> renderViewForTestFiles(Map<String, String> files,
+  Future<String> renderViewForTestFiles(
       {bool applied = false, bool needsRerun = false}) async {
-    var packageRoot = convertPath('/project');
-    await buildInfoForTestFiles(files, includedRoot: packageRoot);
+    var files = {convertPath('$projectPath/lib/a.dart'): 'int a = null;'};
+    await buildInfoForTestFiles(files, includedRoot: projectPath);
     var migrationInfo =
-        MigrationInfo(infos, {}, resourceProvider.pathContext, packageRoot);
+        MigrationInfo(infos, {}, resourceProvider.pathContext, projectPath);
     var instrumentationRenderer = InstrumentationRenderer(
         migrationInfo, PathMapper(resourceProvider), applied, needsRerun);
     return instrumentationRenderer.render();
   }
 
   Future<void> test_appliedStyle() async {
-    var renderedView = await renderViewForTestFiles(
-        {convertPath('/project/lib/a.dart'): 'int a = null;'},
-        applied: true);
+    var renderedView = await renderViewForTestFiles(applied: true);
     // harmless space in class list due to other potential classes here.
     expect(renderedView, contains('<body class="applied ">'));
   }
 
   Future<void> test_navigation_containsRoot() async {
-    var renderedView = await renderViewForTestFiles(
-        {convertPath('/project/lib/a.dart'): 'int a = null;'});
-    var expectedPath = convertPath('/project');
+    var renderedView = await renderViewForTestFiles();
     // harmless space in class list due to other potential classes here.
-    expect(renderedView, contains('<p class="root">$expectedPath</p>'));
+    expect(renderedView, contains('<p class="root">$projectPath</p>'));
   }
 
   Future<void> test_needsRerunStyle() async {
-    var renderedView = await renderViewForTestFiles(
-        {convertPath('/project/lib/a.dart'): 'int a = null;'},
-        needsRerun: true);
+    var renderedView = await renderViewForTestFiles(needsRerun: true);
     expect(renderedView, contains('<body class="proposed needs-rerun">'));
   }
 
   Future<void> test_notAppliedStyle() async {
-    var renderedView = await renderViewForTestFiles(
-        {convertPath('/project/lib/a.dart'): 'int a = null;'},
-        applied: false);
+    var renderedView = await renderViewForTestFiles(applied: false);
     // harmless space in class list due to other potential classes here.
     expect(renderedView, contains('<body class="proposed ">'));
   }
diff --git a/pkg/nnbd_migration/test/front_end/navigation_tree_renderer_test.dart b/pkg/nnbd_migration/test/front_end/navigation_tree_renderer_test.dart
index 77ca56e..2781783 100644
--- a/pkg/nnbd_migration/test/front_end/navigation_tree_renderer_test.dart
+++ b/pkg/nnbd_migration/test/front_end/navigation_tree_renderer_test.dart
@@ -26,19 +26,18 @@
   /// Render the navigation tree view for [files].
   Future<List<NavigationTreeNode>> renderNavigationTree(
       Map<String, String> files) async {
-    var packageRoot = convertPath('/project');
-    await buildInfoForTestFiles(files, includedRoot: packageRoot);
+    await buildInfoForTestFiles(files, includedRoot: projectPath);
     var migrationInfo =
-        MigrationInfo(infos, {}, resourceProvider.pathContext, packageRoot);
+        MigrationInfo(infos, {}, resourceProvider.pathContext, projectPath);
     pathMapper = PathMapper(resourceProvider);
     return NavigationTreeRenderer(migrationInfo, pathMapper).render();
   }
 
   Future<void> test_containsEditCounts() async {
     var response = await renderNavigationTree({
-      convertPath('/project/lib/a.dart'): 'int a = 1;',
-      convertPath('/project/lib/b.dart'): 'int b = null;',
-      convertPath('/project/lib/c.dart'): 'int c = null;\nint d = null;',
+      convertPath('$projectPath/lib/a.dart'): 'int a = 1;',
+      convertPath('$projectPath/lib/b.dart'): 'int b = null;',
+      convertPath('$projectPath/lib/c.dart'): 'int c = null;\nint d = null;',
     });
 
     var libNode = response[0];
@@ -53,9 +52,9 @@
 
   Future<void> test_containsHrefs() async {
     var response = await renderNavigationTree({
-      convertPath('/project/lib/a.dart'): 'int a = null;',
-      convertPath('/project/lib/src/b.dart'): 'int b = null;',
-      convertPath('/project/tool.dart'): 'int c = null;',
+      convertPath('$projectPath/lib/a.dart'): 'int a = null;',
+      convertPath('$projectPath/lib/src/b.dart'): 'int b = null;',
+      convertPath('$projectPath/tool.dart'): 'int c = null;',
     });
 
     var libNode = response[0];
@@ -64,20 +63,21 @@
         isNavigationTreeNode.named('lib').havingSubtree([
           isNavigationTreeNode.named('src').havingSubtree([
             isNavigationTreeNode.havingHref(
-                '/project/lib/src/b.dart', pathMapper)
+                '$projectPath/lib/src/b.dart', pathMapper)
           ]),
-          isNavigationTreeNode.havingHref('/project/lib/a.dart', pathMapper)
+          isNavigationTreeNode.havingHref('$projectPath/lib/a.dart', pathMapper)
         ]));
 
     var toolNode = response[1];
-    expect(toolNode.href, pathMapper.map(convertPath('/project/tool.dart')));
+    expect(
+        toolNode.href, pathMapper.map(convertPath('$projectPath/tool.dart')));
   }
 
   Future<void> test_containsMultipleLinks_multipleDepths() async {
     var response = await renderNavigationTree({
-      convertPath('/project/lib/a.dart'): 'int a = null;',
-      convertPath('/project/lib/src/b.dart'): 'int b = null;',
-      convertPath('/project/tool.dart'): 'int c = null;',
+      convertPath('$projectPath/lib/a.dart'): 'int a = null;',
+      convertPath('$projectPath/lib/src/b.dart'): 'int b = null;',
+      convertPath('$projectPath/tool.dart'): 'int c = null;',
     });
     expect(response, hasLength(2));
 
@@ -97,8 +97,8 @@
 
   Future<void> test_containsMultipleLinks_multipleRoots() async {
     var response = await renderNavigationTree({
-      convertPath('/project/bin/bin.dart'): 'int c = null;',
-      convertPath('/project/lib/a.dart'): 'int a = null;',
+      convertPath('$projectPath/bin/bin.dart'): 'int c = null;',
+      convertPath('$projectPath/lib/a.dart'): 'int a = null;',
     });
     expect(response, hasLength(2));
 
@@ -115,8 +115,8 @@
 
   Future<void> test_containsMultipleLinks_sameDepth() async {
     var response = await renderNavigationTree({
-      convertPath('/project/lib/a.dart'): 'int a = null;',
-      convertPath('/project/lib/b.dart'): 'int b = null;',
+      convertPath('$projectPath/lib/a.dart'): 'int a = null;',
+      convertPath('$projectPath/lib/b.dart'): 'int b = null;',
     });
     expect(response, hasLength(1));
 
@@ -127,19 +127,19 @@
           isNavigationTreeNode
               .named('a.dart')
               .havingPath(convertPath('lib/a.dart'))
-              .havingHref('/project/lib/a.dart', pathMapper),
+              .havingHref('$projectPath/lib/a.dart', pathMapper),
           isNavigationTreeNode
               .named('b.dart')
               .havingPath(convertPath('lib/b.dart'))
-              .havingHref('/project/lib/b.dart', pathMapper)
+              .havingHref('$projectPath/lib/b.dart', pathMapper)
         ]));
   }
 
   Future<void> test_containsPaths() async {
     var response = await renderNavigationTree({
-      convertPath('/project/lib/a.dart'): 'int a = null;',
-      convertPath('/project/lib/src/b.dart'): 'int b = null;',
-      convertPath('/project/tool.dart'): 'int c = null;',
+      convertPath('$projectPath/lib/a.dart'): 'int a = null;',
+      convertPath('$projectPath/lib/src/b.dart'): 'int b = null;',
+      convertPath('$projectPath/tool.dart'): 'int c = null;',
     });
 
     var libNode = response[0];
@@ -157,7 +157,7 @@
 
   Future<void> test_containsSingleLink_deep() async {
     var response = await renderNavigationTree({
-      convertPath('/project/lib/src/a.dart'): 'int a = null;',
+      convertPath('$projectPath/lib/src/a.dart'): 'int a = null;',
     });
     expect(response, hasLength(1));
 
@@ -169,21 +169,21 @@
             isNavigationTreeNode
                 .named('a.dart')
                 .havingPath(convertPath('lib/src/a.dart'))
-                .havingHref('/project/lib/src/a.dart', pathMapper)
+                .havingHref('$projectPath/lib/src/a.dart', pathMapper)
           ])
         ]));
   }
 
   Future<void> test_containsSingleLink_shallow() async {
     var response = await renderNavigationTree({
-      convertPath('/project/a.dart'): 'int a = null;',
+      convertPath('$projectPath/a.dart'): 'int a = null;',
     });
     expect(response, hasLength(1));
 
     var aNode = response[0];
     expect(aNode.name, 'a.dart');
     expect(aNode.path, 'a.dart');
-    expect(aNode.href, pathMapper.map(convertPath('/project/a.dart')));
+    expect(aNode.href, pathMapper.map(convertPath('$projectPath/a.dart')));
   }
 }
 
diff --git a/pkg/nnbd_migration/test/front_end/nnbd_migration_test_base.dart b/pkg/nnbd_migration/test/front_end/nnbd_migration_test_base.dart
index 972c478..6f87f89 100644
--- a/pkg/nnbd_migration/test/front_end/nnbd_migration_test_base.dart
+++ b/pkg/nnbd_migration/test/front_end/nnbd_migration_test_base.dart
@@ -18,6 +18,7 @@
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import 'analysis_abstract.dart';
+import '../utilities/test_logger.dart';
 
 @reflectiveTest
 class NnbdMigrationTestBase extends AbstractAnalysisTest {
@@ -167,10 +168,9 @@
     return unit;
   }
 
-  /// Uses the InfoBuilder to build information for test files.
+  /// Uses the [InfoBuilder] to build information for test files.
   ///
-  /// Returns
-  /// the singular UnitInfo which was built.
+  /// Returns the singular [UnitInfo] which was built.
   Future<List<UnitInfo>> buildInfoForTestFiles(Map<String, String> files,
       {String includedRoot}) async {
     var testPaths = <String>[];
@@ -208,7 +208,8 @@
         permissive: false,
         instrumentation: instrumentationListener,
         removeViaComments: removeViaComments,
-        warnOnWeakCode: warnOnWeakCode);
+        warnOnWeakCode: warnOnWeakCode,
+        transformWhereOrNull: true);
     Future<void> _forEachPath(
         void Function(ResolvedUnitResult) callback) async {
       for (var testPath in testPaths) {
@@ -218,13 +219,15 @@
     }
 
     await _forEachPath(migration.prepareInput);
+    expect(migration.unmigratedDependencies, isEmpty);
     await _forEachPath(migration.processInput);
     await _forEachPath(migration.finalizeInput);
     migration.finish();
     // Build the migration info.
     var info = instrumentationListener.data;
-    var builder = InfoBuilder(
-        resourceProvider, includedRoot, info, listener, migration, nodeMapper);
+    var logger = TestLogger(false);
+    var builder = InfoBuilder(resourceProvider, includedRoot, info, listener,
+        migration, nodeMapper, logger);
     infos = await builder.explainMigration();
   }
 
diff --git a/pkg/nnbd_migration/test/front_end/region_renderer_test.dart b/pkg/nnbd_migration/test/front_end/region_renderer_test.dart
index 7fad2e6..d2e4953 100644
--- a/pkg/nnbd_migration/test/front_end/region_renderer_test.dart
+++ b/pkg/nnbd_migration/test/front_end/region_renderer_test.dart
@@ -15,30 +15,16 @@
 void main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(RegionRendererTest);
+    defineReflectiveTests(RegionRendererTestDriveD);
   });
 }
 
 @reflectiveTest
-class RegionRendererTest extends NnbdMigrationTestBase {
-  PathMapper pathMapper;
-
+class RegionRendererTest extends RegionRendererTestBase {
   /// Returns the basename of [testFile], used in traces.
   String get _testFileBasename =>
       resourceProvider.pathContext.basename(testFile);
 
-  /// Render the region at [offset], using a [MigrationInfo] which knows only
-  /// about the library at `infos.single`.
-  EditDetails renderRegion(int offset) {
-    var migrationInfo =
-        MigrationInfo(infos, {}, resourceProvider.pathContext, projectPath);
-    var unitInfo = infos.single;
-    var region = unitInfo.regionAt(offset);
-    pathMapper = PathMapper(resourceProvider);
-    return RegionRenderer(
-            region, unitInfo, migrationInfo, pathMapper, 'AUTH_TOKEN')
-        .render();
-  }
-
   Future<void> test_informationalRegion_containsTrace() async {
     await buildInfoForSingleTestFile('f(int a) => a.isEven;',
         migratedContent: 'f(int  a) => a.isEven;');
@@ -75,50 +61,6 @@
         equals(resourceProvider.pathContext.toUri(_testFileBasename).path));
   }
 
-  Future<void>
-      test_informationalRegion_containsTraceLinks_separateDrive() async {
-    // See https://github.com/dart-lang/sdk/issues/43178. Linking from a file on
-    // one drive to a file on another drive can cause problems.
-    projectPath = _switchToDriveD(projectPath);
-    testFolder = _switchToDriveD(testFolder);
-    testFile = _switchToDriveD(testFile);
-    await buildInfoForSingleTestFile(r'''
-f(List<int> a) {
-  if (1 == 2) List.from(a);
-}
-g() {
-  f(null);
-}
-''', migratedContent: r'''
-f(List<int >? a) {
-  if (1 == 2) List.from(a!);
-}
-g() {
-  f(null);
-}
-''');
-    var response = renderRegion(44); // The inserted null-check.
-    expect(response.displayPath,
-        equals(_switchToDriveD(convertPath('/home/tests/bin/test.dart'))));
-    expect(response.traces, hasLength(2));
-    var trace = response.traces[1];
-    expect(trace.description, equals('Non-nullability reason'));
-    expect(trace.entries, hasLength(1));
-    var entry = trace.entries[0];
-    expect(entry.link, isNotNull);
-    var sdkCoreLib = convertPath('/sdk/lib/core/core.dart');
-    var sdkCoreLibUriPath = resourceProvider.pathContext.toUri(sdkCoreLib).path;
-    expect(entry.link.href,
-        equals('$sdkCoreLibUriPath?offset=3730&line=166&authToken=AUTH_TOKEN'));
-    // On Windows, the path will simply be the absolute path to the core
-    // library, because there is no relative route from C:\ to D:\. On Posix,
-    // the path is relative.
-    var expectedLinkPath = resourceProvider.pathContext.style == p.Style.windows
-        ? sdkCoreLibUriPath
-        : '../../..$sdkCoreLibUriPath';
-    expect(entry.link.path, equals(expectedLinkPath));
-  }
-
   Future<void> test_modifiedOutput_containsExplanation() async {
     await buildInfoForSingleTestFile('int a = null;',
         migratedContent: 'int? a = null;');
@@ -165,6 +107,84 @@
     expect(response.uriPath, equals(pathMapper.map(testFile)));
     expect(response.line, equals(1));
   }
+}
+
+class RegionRendererTestBase extends NnbdMigrationTestBase {
+  PathMapper pathMapper;
+
+  /// Render the region at [offset], using a [MigrationInfo] which knows only
+  /// about the library at `infos.single`.
+  EditDetails renderRegion(int offset) {
+    var migrationInfo =
+        MigrationInfo(infos, {}, resourceProvider.pathContext, projectPath);
+    var unitInfo = infos.single;
+    var region = unitInfo.regionAt(offset);
+    pathMapper = PathMapper(resourceProvider);
+    return RegionRenderer(
+            region, unitInfo, migrationInfo, pathMapper, 'AUTH_TOKEN')
+        .render();
+  }
+}
+
+@reflectiveTest
+class RegionRendererTestDriveD extends RegionRendererTestBase {
+  @override
+  String get homePath => _switchToDriveD(super.homePath);
+
+  @override
+  void setUp() {
+    super.setUp();
+  }
+
+  Future<void>
+      test_informationalRegion_containsTraceLinks_separateDrive() async {
+    // See https://github.com/dart-lang/sdk/issues/43178. Linking from a file on
+    // one drive to a file on another drive can cause problems.
+    await buildInfoForSingleTestFile(r'''
+f(List<int> a) {
+  if (1 == 2) List.from(a);
+}
+g() {
+  f(null);
+}
+''', migratedContent: r'''
+f(List<int >? a) {
+  if (1 == 2) List.from(a!);
+}
+g() {
+  f(null);
+}
+''');
+    var response = renderRegion(44); // The inserted null-check.
+    expect(response.displayPath,
+        equals(_switchToDriveD(convertPath('/home/tests/bin/test.dart'))));
+    expect(response.traces, hasLength(2));
+    var trace = response.traces[1];
+    expect(trace.description, equals('Non-nullability reason'));
+    expect(trace.entries, hasLength(1));
+    var entry = trace.entries[0];
+    expect(entry.link, isNotNull);
+    var sdkCoreLib = convertPath('/sdk/lib/core/core.dart');
+    var sdkCoreLibUriPath = resourceProvider.pathContext.toUri(sdkCoreLib).path;
+    var coreLibText = resourceProvider.getFile(sdkCoreLib).readAsStringSync();
+    var expectedOffset =
+        'List.from'.allMatches(coreLibText).single.start + 'List.'.length;
+    var expectedLine =
+        '\n'.allMatches(coreLibText.substring(0, expectedOffset)).length + 1;
+    expect(
+        entry.link.href,
+        equals('$sdkCoreLibUriPath?'
+            'offset=$expectedOffset&'
+            'line=$expectedLine&'
+            'authToken=AUTH_TOKEN'));
+    // On Windows, the path will simply be the absolute path to the core
+    // library, because there is no relative route from C:\ to D:\. On Posix,
+    // the path is relative.
+    var expectedLinkPath = resourceProvider.pathContext.style == p.Style.windows
+        ? sdkCoreLibUriPath
+        : '../../..$sdkCoreLibUriPath';
+    expect(entry.link.path, equals(expectedLinkPath));
+  }
 
   /// On Windows, replace the C:\ relative root in [path] with the D:\ relative
   /// root.
@@ -172,6 +192,8 @@
   /// On Posix, nothing is be replaced.
   String _switchToDriveD(String path) {
     assert(resourceProvider.pathContext.isAbsolute(path));
-    return path.replaceFirst(RegExp('^C:\\\\'), 'D:\\');
+    return resourceProvider
+        .convertPath(path)
+        .replaceFirst(RegExp('^C:\\\\'), 'D:\\');
   }
 }
diff --git a/pkg/nnbd_migration/test/front_end/unit_renderer_test.dart b/pkg/nnbd_migration/test/front_end/unit_renderer_test.dart
index 2604c89..79a0fbf 100644
--- a/pkg/nnbd_migration/test/front_end/unit_renderer_test.dart
+++ b/pkg/nnbd_migration/test/front_end/unit_renderer_test.dart
@@ -151,6 +151,16 @@
         unorderedEquals(['1 late hint converted to late keyword']));
   }
 
+  Future<void> test_editList_countsHintAcceptanceSingly_lateFinal() async {
+    await buildInfoForSingleTestFile('/*late final*/ int x = 0;',
+        migratedContent: '/*late final*/ int  x = 0;');
+    var output = renderUnits()[0];
+    expect(
+        output.edits.keys,
+        unorderedEquals(
+            ['1 late final hint converted to late and final keywords']));
+  }
+
   Future<void> test_editList_pluralHeader() async {
     await buildInfoForSingleTestFile('''
 int a = null;
@@ -234,6 +244,40 @@
 ''');
   }
 
+  Future<void> test_inserted_lines() async {
+    await buildInfoForSingleTestFile('''
+int f(List<int> values)
+    => values.firstWhere((i) => i.isEven, orElse: () => null);
+''', migratedContent: '''
+import 'package:collection/collection.dart' show IterableExtension;
+
+int? f(List<int >  values)
+    => values.firstWherefirstWhereOrNull((i) => i.isEven/* , orElse: () => null */);
+''');
+    var output = renderUnits()[0];
+    var regions = output.regions;
+    // We're not testing the correctness of the data path, so drop it.
+    regions = regions.replaceAll(RegExp(' data-path="[^"]*"'), '');
+    // Split the output into table rows.
+    var rows = regions.split(RegExp('(?=<tr)'));
+    // The table should begin with an added region for the added import; since
+    // adding the import involves adding 2 lines, the second and third lines
+    // should have a line number of "(new)", and then lines should resume
+    // counting at 2 after that.
+    expect(rows[0], '<table><tbody>');
+    expect(
+        rows[1],
+        '<tr><td class="line-no">1</td>'
+        '<td class="line-1">'
+        '<span class="region added-region" data-offset="0" data-line="1">'
+        "import 'package:collection/collection.dart' show IterableExtension;"
+        '</span></td></tr>');
+    expect(rows[2], '<tr><td class="line-no">(new)</td><td></td></tr>');
+    expect(rows[3], startsWith('<tr><td class="line-no">(new)</td><td>int'));
+    expect(rows[4],
+        startsWith('<tr><td class="line-no">2</td><td class="line-2">'));
+  }
+
   void test_kindPriorityOrder() {
     var nonDisplayedKinds = NullabilityFixKind.values.toSet();
     for (var kind in UnitRenderer.kindPriorityOrder) {
@@ -247,6 +291,33 @@
     });
   }
 
+  Future<void> test_method_name_change() async {
+    addPackageFile('collection', 'collection.dart', '');
+    await buildInfoForSingleTestFile(
+        '''
+import 'package:collection/collection.dart';
+
+int f(List<int> values)
+    => values.firstWhere((i) => i.isEven, orElse: () => null);
+''',
+        removeViaComments: false,
+        migratedContent: '''
+import 'package:collection/collection.dart';
+
+int? f(List<int >  values)
+    => values.firstWherefirstWhereOrNull((i) => i.isEven, orElse: () => null);
+''');
+    var output = renderUnits()[0];
+    var regions = output.regions;
+    // We aren't testing data-offset or data-line behaviors.
+    regions = regions.replaceAll(RegExp(' data-offset="[^"]*"'), '');
+    regions = regions.replaceAll(RegExp(' data-line="[^"]*"'), '');
+    expect(
+        regions,
+        contains('<span class="region removed-region">firstWhere</span>'
+            '<span class="region added-region">firstWhereOrNull</span>('));
+  }
+
   Future<void> test_navContentContainsEscapedHtml() async {
     await buildInfoForSingleTestFile('List<String> a = null;',
         migratedContent: 'List<String >? a = null;');
@@ -340,19 +411,18 @@
     // addition of a `?`, but at different offsets.  We make sure the `?`s get
     // added at the correct locations in each file.
     var files = {
-      convertPath('/project/lib/a.dart'): '''
+      convertPath('$projectPath/lib/a.dart'): '''
 part 'b.dart';
 
 int f() => null;
 ''',
-      convertPath('/project/lib/b.dart'): '''
+      convertPath('$projectPath/lib/b.dart'): '''
 part of 'a.dart';
 
 int g() => null;
 ''',
     };
-    var packageRoot = convertPath('/project');
-    await buildInfoForTestFiles(files, includedRoot: packageRoot);
+    await buildInfoForTestFiles(files, includedRoot: projectPath);
     var output = renderUnits();
     expect(output[0].sourceCode, contains('int?'));
     expect(output[1].sourceCode, contains('int?'));
diff --git a/pkg/nnbd_migration/test/instrumentation_test.dart b/pkg/nnbd_migration/test/instrumentation_test.dart
index 19cfacf..6e8cd37 100644
--- a/pkg/nnbd_migration/test/instrumentation_test.dart
+++ b/pkg/nnbd_migration/test/instrumentation_test.dart
@@ -140,7 +140,7 @@
 
   Future<void> analyze(String content,
       {bool removeViaComments = false, bool warnOnWeakCode = true}) async {
-    var sourcePath = convertPath('/home/test/lib/test.dart');
+    var sourcePath = convertPath('$testsPath/lib/test.dart');
     newFile(sourcePath, content: content);
     var listener = TestMigrationListener();
     var migration = NullabilityMigration(listener, getLineInfo,
@@ -151,6 +151,7 @@
     source = result.unit.declaredElement.source;
     findNode = FindNode(content, result.unit);
     migration.prepareInput(result);
+    expect(migration.unmigratedDependencies, isEmpty);
     migration.processInput(result);
     migration.finalizeInput(result);
     migration.finish();
diff --git a/pkg/nnbd_migration/test/migration_cli_test.dart b/pkg/nnbd_migration/test/migration_cli_test.dart
index e9393df..ce0ec97 100644
--- a/pkg/nnbd_migration/test/migration_cli_test.dart
+++ b/pkg/nnbd_migration/test/migration_cli_test.dart
@@ -6,6 +6,7 @@
 import 'dart:convert';
 import 'dart:io';
 
+import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/file_system/file_system.dart' show ResourceProvider;
 import 'package:analyzer/file_system/memory_file_system.dart';
@@ -32,6 +33,8 @@
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import 'utilities/test_logger.dart';
+
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(_MigrationCliTestPosix);
@@ -64,13 +67,16 @@
       ResourceProvider resourceProvider,
       LineInfo Function(String) getLineInfo,
       Object bindAddress,
+      Logger logger,
       {List<String> included = const <String>[],
       int preferredPort,
-      String summaryPath})
-      : super(listener, resourceProvider, getLineInfo, bindAddress,
+      String summaryPath,
+      @required String sdkPath})
+      : super(listener, resourceProvider, getLineInfo, bindAddress, logger,
             included: included,
             preferredPort: preferredPort,
-            summaryPath: summaryPath);
+            summaryPath: summaryPath,
+            sdkPath: sdkPath);
 
   @override
   InstrumentationListener createInstrumentationListener(
@@ -89,11 +95,10 @@
   _MigrationCli(this._test)
       : super(
             binaryName: 'nnbd_migration',
-            loggerFactory: (isVerbose) => _test.logger = _TestLogger(isVerbose),
+            loggerFactory: (isVerbose) => _test.logger = TestLogger(isVerbose),
             defaultSdkPathOverride:
                 _test.resourceProvider.convertPath(mock_sdk.sdkRoot),
             resourceProvider: _test.resourceProvider,
-            processManager: _test.processManager,
             environmentVariables: _test.environmentVariables);
 
   _MigrationCliRunner decodeCommandLineArgs(ArgResults argResults,
@@ -149,19 +154,22 @@
       Object bindAddress,
       {List<String> included = const <String>[],
       int preferredPort,
-      String summaryPath}) {
+      String summaryPath,
+      @required String sdkPath}) {
     if (cli._test.injectArtificialException) {
       return _ExceptionGeneratingNonNullableFix(
-          listener, resourceProvider, getLineInfo, bindAddress,
+          listener, resourceProvider, getLineInfo, bindAddress, logger,
           included: included,
           preferredPort: preferredPort,
-          summaryPath: summaryPath);
+          summaryPath: summaryPath,
+          sdkPath: sdkPath);
     } else {
       return super.createNonNullableFix(
           listener, resourceProvider, getLineInfo, bindAddress,
           included: included,
           preferredPort: preferredPort,
-          summaryPath: summaryPath);
+          summaryPath: summaryPath,
+          sdkPath: sdkPath);
     }
   }
 
@@ -192,21 +200,24 @@
 
   bool Function(String) overrideShouldBeMigrated;
 
-  set logger(_TestLogger logger);
-
-  _MockProcessManager get processManager;
+  set logger(TestLogger logger);
 
   MemoryResourceProvider get resourceProvider;
 }
 
 mixin _MigrationCliTestMethods on _MigrationCliTestBase {
   @override
-  /*late*/ _TestLogger logger;
+  /*late*/ TestLogger logger;
 
   final hasVerboseHelpMessage = contains('for verbose help output');
 
   final hasUsageText = contains('Usage: nnbd_migration');
 
+  final urlStartRegexp = RegExp('https?:');
+
+  final dartVersionIsNullSafeByDefault =
+      Feature.non_nullable.releaseVersion != null;
+
   String assertDecodeArgsFailure(List<String> args) {
     var cli = _createCli();
     try {
@@ -276,7 +287,7 @@
   }
 
   Future assertPreviewServerResponsive(String url) async {
-    var response = await http.get(url);
+    var response = await httpGet(url);
     assertHttpSuccess(response);
   }
 
@@ -291,36 +302,6 @@
     }
   }
 
-  void assertPubOutdatedFailure(
-      {int pubOutdatedExitCode = 0,
-      String pubOutdatedStdout = '',
-      String pubOutdatedStderr = ''}) {
-    processManager._mockResult = ProcessResult(123 /* pid */,
-        pubOutdatedExitCode, pubOutdatedStdout, pubOutdatedStderr);
-    logger = _TestLogger(true);
-    var projectContents = simpleProject(sourceText: 'int x;');
-    var projectDir = createProjectDir(projectContents);
-    var success = DependencyChecker(
-            projectDir, resourceProvider.pathContext, logger, processManager)
-        .check();
-    expect(success, isFalse);
-  }
-
-  void assertPubOutdatedSuccess(
-      {int pubOutdatedExitCode = 0,
-      String pubOutdatedStdout = '',
-      String pubOutdatedStderr = ''}) {
-    processManager._mockResult = ProcessResult(123 /* pid */,
-        pubOutdatedExitCode, pubOutdatedStdout, pubOutdatedStderr);
-    logger = _TestLogger(true);
-    var projectContents = simpleProject(sourceText: 'int x;');
-    var projectDir = createProjectDir(projectContents);
-    var success = DependencyChecker(
-            projectDir, resourceProvider.pathContext, logger, processManager)
-        .check();
-    expect(success, isTrue);
-  }
-
   Future<String> assertRunFailure(List<String> args,
       {MigrationCli cli,
       bool withUsage = false,
@@ -348,6 +329,19 @@
     return stderrText;
   }
 
+  /// Wraps a future containing an HTTP response so that when that response is
+  /// received, we will verify that it is reasonable.
+  Future<http.Response> checkHttpResponse(
+      Future<http.Response> futureResponse) async {
+    var response = await futureResponse;
+    // Check that all "http:" and "https:" URLs in the given HTTP response are
+    // absolute (guards against https://github.com/dart-lang/sdk/issues/43545).
+    for (var match in urlStartRegexp.allMatches(response.body)) {
+      expect(response.body.substring(match.end), startsWith('//'));
+    }
+    return response;
+  }
+
   String createProjectDir(Map<String, String> contents,
       {String posixPath = '/test_project'}) {
     for (var entry in contents.entries) {
@@ -366,6 +360,23 @@
     return jsonDecode(response.body)['sourceCode'] as String;
   }
 
+  /// Performs an HTTP get, verifying that the response received (if any) is
+  /// reasonable.
+  Future<http.Response> httpGet(dynamic url, {Map<String, String> headers}) {
+    return checkHttpResponse(http.get(url, headers: headers));
+  }
+
+  /// Performs an HTTP post, verifying that the response received (if any) is
+  /// reasonable.
+  Future<http.Response> httpPost(dynamic url,
+      {Map<String, String> headers, dynamic body, Encoding encoding}) {
+    return checkHttpResponse(
+        http.post(url, headers: headers, body: body, encoding: encoding));
+  }
+
+  String packagePath(String path) =>
+      resourceProvider.convertPath('/.pub-cache/$path');
+
   Future<void> runWithPreviewServer(_MigrationCli cli, List<String> args,
       Future<void> Function(String) callback) async {
     String url;
@@ -378,7 +389,7 @@
         await callback(url);
       });
       // Server should be stopped now
-      expect(http.get(url), throwsA(anything));
+      expect(httpGet(url), throwsA(anything));
       assertNormalExit(cliRunner);
     }
   }
@@ -392,32 +403,23 @@
       {bool migrated = false,
       String sourceText,
       String pubspecText,
-      String packageConfigText}) {
+      String packageConfigText,
+      String analysisOptionsText}) {
     return {
       'pubspec.yaml': pubspecText ??
           '''
 name: test
 environment:
-  sdk: '${migrated ? '>=2.9.0 <2.10.0' : '>=2.6.0 <3.0.0'}'
+  sdk: '${migrated ? '>=2.12.0 <3.0.0' : '>=2.6.0 <3.0.0'}'
 ''',
-      '.dart_tool/package_config.json': packageConfigText ??
-          '''
-{
-  "configVersion": 2,
-  "packages": [
-    {
-      "name": "test",
-      "rootUri": "../",
-      "packageUri": "lib/",
-      "languageVersion": "${migrated ? '2.9' : '2.6'}"
-    }
-  ]
-}
-''',
+      '.dart_tool/package_config.json':
+          packageConfigText ?? _getPackageConfigText(migrated: migrated),
       'lib/test.dart': sourceText ??
           '''
 int${migrated ? '?' : ''} f() => null;
-'''
+''',
+      if (analysisOptionsText != null)
+        'analysis_options.yaml': analysisOptionsText,
     };
   }
 
@@ -474,6 +476,7 @@
 
   test_flag_apply_changes_default() {
     expect(assertParseArgsSuccess([]).applyChanges, isFalse);
+    expect(assertParseArgsSuccess([]).webPreview, isTrue);
   }
 
   test_flag_apply_changes_disable() async {
@@ -482,6 +485,12 @@
   }
 
   test_flag_apply_changes_enable() {
+    var options = assertParseArgsSuccess(['--apply-changes']);
+    expect(options.applyChanges, isTrue);
+    expect(options.webPreview, isFalse);
+  }
+
+  test_flag_apply_changes_enable_with_no_web_preview() {
     expect(
         assertParseArgsSuccess(['--no-web-preview', '--apply-changes'])
             .applyChanges,
@@ -536,17 +545,17 @@
     expect(_getHelpText(verbose: true), contains(flagName));
   }
 
-  test_flag_skip_pub_outdated_default() {
-    expect(assertParseArgsSuccess([]).skipPubOutdated, isFalse);
+  test_flag_skip_import_check_default() {
+    expect(assertParseArgsSuccess([]).skipImportCheck, isFalse);
   }
 
-  test_flag_skip_pub_outdated_disable() async {
-    // "--no-skip-pub-outdated" is not an option.
-    await assertParseArgsFailure(['--no-skip-pub-outdated']);
+  test_flag_skip_import_check_disable() async {
+    // "--no-skip-import-check" is not an option.
+    await assertParseArgsFailure(['--no-skip-import_check']);
   }
 
-  test_flag_skip_pub_outdated_enable() {
-    expect(assertParseArgsSuccess(['--skip-pub-outdated']).skipPubOutdated,
+  test_flag_skip_import_check_enable() {
+    expect(assertParseArgsSuccess(['--skip-import-check']).skipImportCheck,
         isTrue);
   }
 
@@ -562,12 +571,45 @@
     expect(assertParseArgsSuccess(['--web-preview']).webPreview, isTrue);
   }
 
+  test_lifecycle_already_migrated_file() async {
+    Map<String, String> createProject({bool migrated = false}) {
+      var projectContents = simpleProject(sourceText: '''
+${migrated ? '' : '// @dart = 2.6'}
+import 'already_migrated.dart';
+int${migrated ? '?' : ''} x = y;
+''', migrated: true);
+      projectContents['lib/already_migrated.dart'] = '''
+int? y = 0;
+''';
+      return projectContents;
+    }
+
+    var projectContents = createProject();
+    var projectDir = createProjectDir(projectContents);
+    var cliRunner = _createCli(nullSafePackages: ['test'])
+        .decodeCommandLineArgs(_parseArgs(['--apply-changes', projectDir]));
+    await cliRunner.run();
+    assertNormalExit(cliRunner);
+    // Check that a summary was printed
+    expect(logger.stdoutBuffer.toString(), contains('Applying changes'));
+    // And that it refers to test.dart, but not pubspec.yaml or
+    // already_migrated.dart.
+    expect(logger.stdoutBuffer.toString(), contains('test.dart'));
+    expect(logger.stdoutBuffer.toString(), isNot(contains('pubspec.yaml')));
+    expect(logger.stdoutBuffer.toString(),
+        isNot(contains('already_migrated.dart')));
+    // And that it does not tell the user they can rerun with `--apply-changes`
+    expect(logger.stdoutBuffer.toString(), isNot(contains('--apply-changes')));
+    // Check that the non-migrated library was changed but not the migrated one
+    assertProjectContents(projectDir, createProject(migrated: true));
+  }
+
   test_lifecycle_apply_changes() async {
     var projectContents = simpleProject();
     var projectDir = createProjectDir(projectContents);
     var cli = _createCli();
-    var cliRunner = cli.decodeCommandLineArgs(
-        _parseArgs(['--no-web-preview', '--apply-changes', projectDir]));
+    var cliRunner =
+        cli.decodeCommandLineArgs(_parseArgs(['--apply-changes', projectDir]));
     bool applyHookCalled = false;
     cli._onApplyHook = () {
       expect(applyHookCalled, false);
@@ -720,6 +762,50 @@
     });
   }
 
+  test_lifecycle_import_check_via_export() async {
+    // If the user's code exports a library that imports a non-migrated library,
+    // that's a problem too.
+    var projectContents = simpleProject(
+        sourceText: "export 'package:foo/foo.dart';",
+        packageConfigText: _getPackageConfigText(
+            migrated: false, packagesMigrated: {'foo': true, 'bar': false}));
+    var projectDir = createProjectDir(projectContents);
+    resourceProvider.newFile(
+        packagePath('foo/lib/foo.dart'), "import 'package:bar/bar.dart';");
+    resourceProvider.newFile(packagePath('bar/lib/bar.dart'), '');
+    await assertRunFailure([projectDir], expectedExitCode: 1);
+    var output = logger.stdoutBuffer.toString();
+    expect(output, contains('Error: package has unmigrated dependencies'));
+    // Output should mention bar.dart, since it's unmigrated
+    expect(output, contains('package:bar/bar.dart'));
+    // But it should not mention foo.dart, which is migrated
+    expect(output, isNot(contains('package:foo/foo.dart')));
+  }
+
+  test_lifecycle_import_check_via_indirect_export() async {
+    // If the user's code imports a library that exports a library that imports
+    // a non-migrated library, that's a problem too.
+    var projectContents = simpleProject(
+        sourceText: "import 'package:foo/foo.dart';",
+        packageConfigText: _getPackageConfigText(
+            migrated: false,
+            packagesMigrated: {'foo': true, 'bar': true, 'baz': false}));
+    var projectDir = createProjectDir(projectContents);
+    resourceProvider.newFile(
+        packagePath('foo/lib/foo.dart'), "export 'package:bar/bar.dart';");
+    resourceProvider.newFile(
+        packagePath('bar/lib/bar.dart'), "import 'package:baz/baz.dart';");
+    resourceProvider.newFile(packagePath('baz/lib/baz.dart'), '');
+    await assertRunFailure([projectDir], expectedExitCode: 1);
+    var output = logger.stdoutBuffer.toString();
+    expect(output, contains('Error: package has unmigrated dependencies'));
+    // Output should mention baz.dart, since it's unmigrated
+    expect(output, contains('package:baz/baz.dart'));
+    // But it should not mention foo.dart or bar.dart, which are migrated
+    expect(output, isNot(contains('package:foo/foo.dart')));
+    expect(output, isNot(contains('package:bar/bar.dart')));
+  }
+
   test_lifecycle_no_preview() async {
     var projectContents = simpleProject();
     var projectDir = createProjectDir(projectContents);
@@ -729,7 +815,7 @@
     assertNormalExit(cliRunner);
     // Check that a summary was printed
     var output = logger.stdoutBuffer.toString();
-    expect(output, contains('Summary'));
+    expect(output, contains('Diff of changes'));
     // And that it refers to test.dart and pubspec.yaml
     expect(output, contains('test.dart'));
     expect(output, contains('pubspec.yaml'));
@@ -771,8 +857,12 @@
         .join(projectDir, 'lib', 'analyze_but_do_not_migrate.dart');
     overridePathsToProcess = {testPath, analyzeButDoNotMigratePath};
     overrideShouldBeMigrated = (path) => path == testPath;
-    var cliRunner = _createCli().decodeCommandLineArgs(
-        _parseArgs(['--no-web-preview', '--apply-changes', projectDir]));
+    var cliRunner = _createCli().decodeCommandLineArgs(_parseArgs([
+      '--no-web-preview',
+      '--apply-changes',
+      '--skip-import-check',
+      projectDir
+    ]));
     await cliRunner.run();
     assertNormalExit(cliRunner);
     // Check that a summary was printed
@@ -814,7 +904,7 @@
       await assertPreviewServerResponsive(url);
       var uri = Uri.parse(url);
       var authToken = uri.queryParameters['authToken'];
-      var response = await http.post(
+      var response = await httpPost(
           uri.replace(
               path: resourceProvider.pathContext
                   .toUri(resourceProvider.pathContext
@@ -850,7 +940,7 @@
       await assertPreviewServerResponsive(url);
       var uri = Uri.parse(url);
       var authToken = uri.queryParameters['authToken'];
-      var response = await http.post(
+      var response = await httpPost(
           uri.replace(
               path: PreviewSite.applyMigrationPath,
               queryParameters: {'authToken': authToken}),
@@ -881,7 +971,7 @@
       await assertPreviewServerResponsive(url);
       final uri = Uri.parse(url);
       final authToken = uri.queryParameters['authToken'];
-      final fileResponse = await http.get(
+      final fileResponse = await httpGet(
           uri.replace(
               path: resourceProvider.pathContext
                   .toUri(resourceProvider.pathContext
@@ -894,8 +984,7 @@
       final aLink = RegExp(r'<a href="([^"]+)" class="nav-link">');
       for (final match in aLink.allMatches(navigation)) {
         var href = match.group(1);
-        print(href);
-        final contentsResponse = await http.get(
+        final contentsResponse = await httpGet(
             uri.replace(
                 path: Uri.parse(href).path,
                 queryParameters: {'inline': 'true', 'authToken': authToken}),
@@ -915,7 +1004,7 @@
       await assertPreviewServerResponsive(url);
       var uri = Uri.parse(url);
       var authToken = uri.queryParameters['authToken'];
-      var treeResponse = await http.get(
+      var treeResponse = await httpGet(
           uri.replace(
               path: '/_preview/navigationTree.json',
               queryParameters: {'authToken': authToken}),
@@ -925,8 +1014,7 @@
         var navTree = NavigationTreeNode.fromJson(root);
         for (final file in navTree.subtree) {
           if (file.href != null) {
-            print(file.href);
-            final contentsResponse = await http.get(
+            final contentsResponse = await httpGet(
                 uri
                     .resolve(file.href)
                     .replace(queryParameters: {'authToken': authToken}),
@@ -961,7 +1049,7 @@
       await assertPreviewServerResponsive(url);
       var uri = Uri.parse(url);
       var authToken = uri.queryParameters['authToken'];
-      var regionResponse = await http.get(
+      var regionResponse = await httpGet(
           uri.replace(
               path: resourceProvider.pathContext
                   .toUri(resourceProvider.pathContext
@@ -977,7 +1065,7 @@
       final displayPath = regionJson.displayPath;
       final uriPath = regionJson.uriPath;
       // uriPath should be a working URI
-      final contentsResponse = await http.get(
+      final contentsResponse = await httpGet(
           uri.replace(
               path: uriPath,
               queryParameters: {'inline': 'true', 'authToken': authToken}),
@@ -1002,7 +1090,7 @@
       await assertPreviewServerResponsive(url);
       final uri = Uri.parse(url);
       final authToken = uri.queryParameters['authToken'];
-      final fileResponse = await http.get(
+      final fileResponse = await httpGet(
           uri.replace(
               path: resourceProvider.pathContext
                   .toUri(resourceProvider.pathContext
@@ -1015,7 +1103,7 @@
       final regionsPathRegex = RegExp(r'<table data-path="([^"]+)">');
       expect(regionsPathRegex.hasMatch(regions), true);
       final regionsPath = regionsPathRegex.matchAsPrefix(regions).group(1);
-      final contentsResponse = await http.get(
+      final contentsResponse = await httpGet(
           uri.replace(
               path: Uri.parse(regionsPath).path,
               queryParameters: {'inline': 'true', 'authToken': authToken}),
@@ -1039,7 +1127,7 @@
       // We haven't rerun, so getting the file details from the server should
       // still yield the original source text
       expect(await getSourceFromServer(uri, testPath), origSourceText);
-      var response = await http.post(uri.replace(path: 'rerun-migration'),
+      var response = await httpPost(uri.replace(path: 'rerun-migration'),
           headers: {'Content-Type': 'application/json; charset=UTF-8'});
       assertHttpSuccess(response);
       // Now that we've rerun, the server should yield the new source text
@@ -1062,7 +1150,7 @@
       // fail
       var response = await tryGetSourceFromServer(uri, test2Path);
       expect(response.statusCode, 404);
-      response = await http.post(uri.replace(path: 'rerun-migration'),
+      response = await httpPost(uri.replace(path: 'rerun-migration'),
           headers: {'Content-Type': 'application/json; charset=UTF-8'});
       assertHttpSuccess(response);
       // Now that we've rerun, the server should yield the new source text
@@ -1071,7 +1159,7 @@
   }
 
   test_lifecycle_preview_rerun_deleted_file() async {
-    var projectContents = simpleProject();
+    var projectContents = {...simpleProject(), 'lib/other.dart': ''};
     var projectDir = createProjectDir(projectContents);
     var cli = _createCli();
     // Note: we use the summary to verify that the deletion was noticed
@@ -1092,7 +1180,7 @@
           contains('lib${separator}test.dart'));
       // Now delete the lib file and rerun
       resourceProvider.deleteFile(testPath);
-      var response = await http.post(uri.replace(path: 'rerun-migration'),
+      var response = await httpPost(uri.replace(path: 'rerun-migration'),
           headers: {'Content-Type': 'application/json; charset=UTF-8'});
       assertHttpSuccess(response);
       // lib/test.dart should no longer be readable from the server and
@@ -1121,7 +1209,7 @@
       // We haven't rerun, so getting the file details from the server should
       // still yield the original source text, with informational space.
       expect(await getSourceFromServer(uri, testPath), 'void f(int  i) {}');
-      var response = await http.post(uri.replace(path: 'rerun-migration'),
+      var response = await httpPost(uri.replace(path: 'rerun-migration'),
           headers: {'Content-Type': 'application/json; charset=UTF-8'});
       assertHttpSuccess(response);
       var body = jsonDecode(response.body);
@@ -1182,7 +1270,7 @@
       await assertPreviewServerResponsive(url);
       var uri = Uri.parse(url);
       var authToken = uri.queryParameters['authToken'];
-      var regionResponse = await http.get(
+      var regionResponse = await httpGet(
           uri.replace(
               path: resourceProvider.pathContext
                   .toUri(resourceProvider.pathContext
@@ -1195,7 +1283,7 @@
               }),
           headers: {'Content-Type': 'application/json; charset=UTF-8'});
       var regionJson = jsonDecode(regionResponse.body);
-      var response = await http.post(
+      var response = await httpPost(
           uri.replace(
               path: 'apply-hint', queryParameters: {'authToken': authToken}),
           headers: {'Content-Type': 'application/json; charset=UTF-8'},
@@ -1227,13 +1315,13 @@
             'offset': '3',
             'authToken': authToken
           });
-      var regionResponse = await http.get(regionUri,
+      var regionResponse = await httpGet(regionUri,
           headers: {'Content-Type': 'application/json; charset=UTF-8'});
       var regionJson = EditDetails.fromJson(jsonDecode(regionResponse.body));
       final traceEntry = regionJson.traces[0].entries[0];
       final uriPath = traceEntry.link.href;
       // uriPath should be a working URI
-      final contentsResponse = await http.get(
+      final contentsResponse = await httpGet(
           regionUri
               .resolve(uriPath)
               .replace(queryParameters: {'authToken': authToken}),
@@ -1242,46 +1330,54 @@
     });
   }
 
-  test_lifecycle_skip_pub_outdated_disable() async {
-    var projectContents = simpleProject(sourceText: '''
+  test_lifecycle_skip_import_check_disable() async {
+    var projectContents = simpleProject(
+        sourceText: '''
+import 'package:foo/foo.dart';
+import 'package:foo/bar.dart';
+
 int f() => null;
-''');
+''',
+        packageConfigText: _getPackageConfigText(
+            migrated: false, packagesMigrated: {'foo': false}));
     var projectDir = createProjectDir(projectContents);
-    processManager._mockResult = ProcessResult(
-        123 /* pid */,
-        0 /* exitCode */,
-        '''
-{ "packages":
-  [
-    { "package": "abc", "current": { "version": "1.0.0", "nullSafety": false } }
-  ]
-}
-''' /* stdout */,
-        '' /* stderr */);
-    var output = await assertRunFailure([projectDir], expectedExitCode: 1);
-    expect(output, contains('Warning: dependencies are outdated.'));
+    resourceProvider.newFile(packagePath('foo/lib/foo.dart'), '');
+    resourceProvider.newFile(packagePath('foo/lib/bar.dart'), '');
+    await assertRunFailure([projectDir], expectedExitCode: 1);
+    var output = logger.stdoutBuffer.toString();
+    expect(output, contains('Error: package has unmigrated dependencies'));
+    // Output should contain an indented, sorted list of all unmigrated
+    // dependencies.
+    expect(
+        output, contains('\n  package:foo/bar.dart\n  package:foo/foo.dart'));
+    // Output should mention that the user can rerun with `--skip-import-check`.
+    expect(output, contains('`--${CommandLineOptions.skipImportCheckFlag}`'));
   }
 
-  test_lifecycle_skip_pub_outdated_enable() async {
-    var projectContents = simpleProject(sourceText: '''
+  test_lifecycle_skip_import_check_enable() async {
+    var projectContents = simpleProject(
+        sourceText: '''
+import 'package:foo/foo.dart';
+import 'package:foo/bar.dart';
+
 int f() => null;
-''');
+''',
+        packageConfigText: _getPackageConfigText(
+            migrated: false, packagesMigrated: {'foo': false}));
     var projectDir = createProjectDir(projectContents);
-    processManager._mockResult = ProcessResult(
-        123 /* pid */,
-        0 /* exitCode */,
-        '''
-{ "packages":
-  [
-    { "package": "abc", "current": { "version": "1.0.0", "nullSafety": false } }
-  ]
-}
-''' /* stdout */,
-        '' /* stderr */);
+    resourceProvider.newFile(packagePath('foo/lib/foo.dart'), '');
+    resourceProvider.newFile(packagePath('foo/lib/bar.dart'), '');
     var cli = _createCli();
-    await runWithPreviewServer(cli, ['--skip-pub-outdated', projectDir],
+    await runWithPreviewServer(cli, ['--skip-import-check', projectDir],
         (url) async {
       await assertPreviewServerResponsive(url);
+      var output = logger.stdoutBuffer.toString();
+      expect(output, contains('Warning: package has unmigrated dependencies'));
+      // Output should not mention the particular unmigrated dependencies.
+      expect(output, isNot(contains('package:foo')));
+      // Output should mention that the user can rerun without
+      // `--skip-import-check`.
+      expect(output, contains('`--${CommandLineOptions.skipImportCheckFlag}`'));
     });
   }
 
@@ -1333,7 +1429,7 @@
       resourceProvider.getFile(testPath).writeAsStringSync(newSourceText);
       // Rerunning should create a new summary
       var uri = Uri.parse(url);
-      var response = await http.post(uri.replace(path: 'rerun-migration'),
+      var response = await httpPost(uri.replace(path: 'rerun-migration'),
           headers: {'Content-Type': 'application/json; charset=UTF-8'});
       assertHttpSuccess(response);
       summaryData =
@@ -1465,20 +1561,28 @@
     var projectContents = simpleProject()
       ..remove('.dart_tool/package_config.json');
     var projectDir = createProjectDir(projectContents);
-    var cliRunner = _createCli().decodeCommandLineArgs(
-        _parseArgs(['--no-web-preview', '--apply-changes', projectDir]));
-    await cliRunner.run();
-    // The Dart source code should still be migrated.
-    assertProjectContents(
-        projectDir,
-        simpleProject(migrated: true)
-          ..remove('.dart_tool/package_config.json'));
+
+    if (dartVersionIsNullSafeByDefault) {
+      // The lack of a package config file means the test file is already opted
+      // in.
+      await assertRunFailure(['--apply-changes', projectDir]);
+      _expectErrorIndicatingCodeIsAlreadyOptedIn();
+    } else {
+      var cliRunner = _createCli()
+          .decodeCommandLineArgs(_parseArgs(['--apply-changes', projectDir]));
+      await cliRunner.run();
+      // The Dart source code should still be migrated.
+      assertProjectContents(
+          projectDir,
+          simpleProject(migrated: true)
+            ..remove('.dart_tool/package_config.json'));
+    }
   }
 
   test_package_config_is_missing_languageVersion() async {
     var packageConfigText = '''
 {
-  "configVersion": 3,
+  "configVersion": 2,
   "packages": [
     {
       "name": "test",
@@ -1490,30 +1594,46 @@
 ''';
     var projectContents = simpleProject(packageConfigText: packageConfigText);
     var projectDir = createProjectDir(projectContents);
-    var cliRunner = _createCli().decodeCommandLineArgs(
-        _parseArgs(['--no-web-preview', '--apply-changes', projectDir]));
-    await cliRunner.run();
-    // The Dart source code should still be migrated.
-    assertProjectContents(projectDir,
-        simpleProject(migrated: true, packageConfigText: packageConfigText));
+
+    if (dartVersionIsNullSafeByDefault) {
+      // An omitted languageVersion field means the code is opted in to null
+      // safety.
+      await assertRunFailure(['--apply-changes', projectDir]);
+      _expectErrorIndicatingCodeIsAlreadyOptedIn();
+    } else {
+      var cliRunner = _createCli()
+          .decodeCommandLineArgs(_parseArgs(['--apply-changes', projectDir]));
+      await cliRunner.run();
+      // The Dart source code should still be migrated.
+      assertProjectContents(projectDir,
+          simpleProject(migrated: true, packageConfigText: packageConfigText));
+    }
   }
 
   test_package_config_is_missing_this_package() async {
     var packageConfigText = '''
 {
-  "configVersion": 3,
+  "configVersion": 2,
   "packages": [
   ]
 }
 ''';
     var projectContents = simpleProject(packageConfigText: packageConfigText);
     var projectDir = createProjectDir(projectContents);
-    var cliRunner = _createCli().decodeCommandLineArgs(
-        _parseArgs(['--no-web-preview', '--apply-changes', projectDir]));
-    await cliRunner.run();
-    // The Dart source code should still be migrated.
-    assertProjectContents(projectDir,
-        simpleProject(migrated: true, packageConfigText: packageConfigText));
+
+    if (dartVersionIsNullSafeByDefault) {
+      // An omitted entry in the package config means the code is opted in to null
+      // safety.
+      await assertRunFailure(['--apply-changes', projectDir]);
+      _expectErrorIndicatingCodeIsAlreadyOptedIn();
+    } else {
+      var cliRunner = _createCli()
+          .decodeCommandLineArgs(_parseArgs(['--apply-changes', projectDir]));
+      await cliRunner.run();
+      // The Dart source code should still be migrated.
+      assertProjectContents(projectDir,
+          simpleProject(migrated: true, packageConfigText: packageConfigText));
+    }
   }
 
   test_package_config_is_wrong_version() async {
@@ -1532,156 +1652,35 @@
 ''';
     var projectContents = simpleProject(packageConfigText: packageConfigText);
     var projectDir = createProjectDir(projectContents);
-    var cliRunner = _createCli().decodeCommandLineArgs(
-        _parseArgs(['--no-web-preview', '--apply-changes', projectDir]));
-    await cliRunner.run();
-    // The Dart source code should still be migrated.
-    assertProjectContents(projectDir,
-        simpleProject(migrated: true, packageConfigText: packageConfigText));
-  }
 
-  test_pub_outdated_has_malformed_json() {
-    assertPubOutdatedSuccess(pubOutdatedStdout: '{ "packages": }');
-    expect(logger.stderrBuffer.toString(), startsWith('Warning:'));
-  }
-
-  test_pub_outdated_has_no_packages() {
-    assertPubOutdatedSuccess(pubOutdatedStdout: '{}');
-    expect(logger.stderrBuffer.toString(), startsWith('Warning:'));
-  }
-
-  test_pub_outdated_has_no_pre_null_safety_packages() {
-    assertPubOutdatedSuccess(pubOutdatedStdout: '''
-{
-  "packages": [
-    {
-      "package": "abc",
-      "current": { "version": "1.0.0", "nullSafety": true }
-    },
-    {
-      "package": "def",
-      "current": { "version": "2.0.0", "nullSafety": true }
+    if (dartVersionIsNullSafeByDefault) {
+      // An unreadable package config means the code is opted in to null safety.
+      await assertRunFailure(['--apply-changes', projectDir]);
+      _expectErrorIndicatingCodeIsAlreadyOptedIn();
+    } else {
+      var cliRunner = _createCli()
+          .decodeCommandLineArgs(_parseArgs(['--apply-changes', projectDir]));
+      await cliRunner.run();
+      // The Dart source code should still be migrated.
+      assertProjectContents(projectDir,
+          simpleProject(migrated: true, packageConfigText: packageConfigText));
     }
-  ]
-}
-''');
-  }
-
-  test_pub_outdated_has_one_pre_null_safety_package() {
-    assertPubOutdatedFailure(pubOutdatedStdout: '''
-{
-  "packages": [
-    {
-      "package": "abc",
-      "current": { "version": "1.0.0", "nullSafety": false }
-    },
-    {
-      "package": "def",
-      "current": { "version": "2.0.0", "nullSafety": true }
-    }
-  ]
-}
-''');
-    var stderrText = logger.stderrBuffer.toString();
-    expect(stderrText, contains('Warning:'));
-    expect(stderrText, contains('abc'));
-    expect(stderrText, contains('1.0.0'));
-  }
-
-  test_pub_outdated_has_package_with_missing_current() {
-    assertPubOutdatedSuccess(pubOutdatedStdout: '''
-{
-  "packages": [
-    {
-      "package": "abc"
-    }
-  ]
-}
-''');
-    expect(logger.stderrBuffer.toString(), startsWith('Warning:'));
-  }
-
-  test_pub_outdated_has_package_with_missing_name() {
-    assertPubOutdatedSuccess(pubOutdatedStdout: '''
-{
-  "packages": [
-    {
-      "current": {
-        "version": "1.0.0",
-        "nullSafety": false
-      }
-    }
-  ]
-}
-''');
-    expect(logger.stderrBuffer.toString(), startsWith('Warning:'));
-  }
-
-  test_pub_outdated_has_package_with_missing_nullSafety() {
-    assertPubOutdatedSuccess(pubOutdatedStdout: '''
-{
-  "packages": [
-    {
-      "package": "abc",
-      "current": {
-        "version": "1.0.0"
-      }
-    }
-  ]
-}
-''');
-    expect(logger.stderrBuffer.toString(), startsWith('Warning:'));
-  }
-
-  test_pub_outdated_has_package_with_missing_version() {
-    assertPubOutdatedSuccess(pubOutdatedStdout: '''
-{
-  "packages": [
-    {
-      "package": "abc",
-      "current": {
-        "nullSafety": false
-      }
-    }
-  ]
-}
-''');
-    expect(logger.stderrBuffer.toString(), startsWith('Warning:'));
-  }
-
-  test_pub_outdated_has_package_with_null_current() {
-    assertPubOutdatedSuccess(pubOutdatedStdout: '''
-{
-  "packages": [
-    {
-      "package": "abc",
-      "current": null
-    }
-  ]
-}
-''');
-    expect(logger.stderrBuffer.toString(), isEmpty);
-  }
-
-  test_pub_outdated_has_stderr() {
-    assertPubOutdatedSuccess(pubOutdatedStderr: 'anything');
-    expect(logger.stderrBuffer.toString(), startsWith('Warning:'));
   }
 
   test_pubspec_does_not_exist() async {
-    var projectContents = simpleProject()
-      ..remove('pubspec.yaml')
-      ..remove('.dart_tool/package_config.json');
+    var projectContents = simpleProject()..remove('pubspec.yaml');
     var projectDir = createProjectDir(projectContents);
-    var cliRunner = _createCli().decodeCommandLineArgs(
-        _parseArgs(['--no-web-preview', '--apply-changes', projectDir]));
+    var cliRunner = _createCli()
+        .decodeCommandLineArgs(_parseArgs(['--apply-changes', projectDir]));
     await cliRunner.run();
     // The Dart source code should still be migrated.
     assertProjectContents(
         projectDir,
-        simpleProject(migrated: true)
-          ..remove('pubspec.yaml')
-          ..remove('.dart_tool/package_config.json'));
+        simpleProject(
+            migrated: true,
+            // The package config file should not have been touched.
+            packageConfigText: _getPackageConfigText(migrated: false))
+          ..remove('pubspec.yaml'));
   }
 
   test_pubspec_environment_is_missing_sdk() async {
@@ -1691,8 +1690,8 @@
   foo: 1
 ''');
     var projectDir = createProjectDir(projectContents);
-    var cliRunner = _createCli().decodeCommandLineArgs(
-        _parseArgs(['--no-web-preview', '--apply-changes', projectDir]));
+    var cliRunner = _createCli()
+        .decodeCommandLineArgs(_parseArgs(['--apply-changes', projectDir]));
     await cliRunner.run();
     // The Dart source code should still be migrated.
     assertProjectContents(
@@ -1700,7 +1699,7 @@
 name: test
 environment:
   foo: 1
-  sdk: '>=2.9.0 <2.10.0'
+  sdk: '>=2.12.0 <3.0.0'
 '''));
   }
 
@@ -1711,8 +1710,8 @@
 ''';
     var projectContents = simpleProject(pubspecText: pubspecText);
     var projectDir = createProjectDir(projectContents);
-    var cliRunner = _createCli().decodeCommandLineArgs(
-        _parseArgs(['--no-web-preview', '--apply-changes', projectDir]));
+    var cliRunner = _createCli()
+        .decodeCommandLineArgs(_parseArgs(['--apply-changes', projectDir]));
     await cliRunner.run();
     // The Dart source code should still be migrated.
     assertProjectContents(
@@ -1725,17 +1724,40 @@
 environment:
   sdk: 1
 ''';
-    var projectContents = simpleProject(pubspecText: pubspecText)
-      ..remove('.dart_tool/package_config.json');
+    var projectContents = simpleProject(pubspecText: pubspecText);
     var projectDir = createProjectDir(projectContents);
-    var cliRunner = _createCli().decodeCommandLineArgs(
-        _parseArgs(['--no-web-preview', '--apply-changes', projectDir]));
+    var cliRunner = _createCli()
+        .decodeCommandLineArgs(_parseArgs(['--apply-changes', projectDir]));
     await cliRunner.run();
     // The Dart source code should still be migrated.
     assertProjectContents(
         projectDir,
-        simpleProject(migrated: true, pubspecText: pubspecText)
-          ..remove('.dart_tool/package_config.json'));
+        simpleProject(
+            migrated: true,
+            pubspecText: pubspecText,
+            // The package config file should not have been touched.
+            packageConfigText: _getPackageConfigText(migrated: false)));
+  }
+
+  test_pubspec_has_unusual_max_sdk_constraint() async {
+    // No one should be using a weird max SDK constraint like this.  If they are
+    // doing so, we'll fix it to 3.0.0.
+    var projectContents = simpleProject(pubspecText: '''
+name: test
+environment:
+  sdk: '>=2.6.0 <2.17.4'
+''');
+    var projectDir = createProjectDir(projectContents);
+    var cliRunner = _createCli()
+        .decodeCommandLineArgs(_parseArgs(['--apply-changes', projectDir]));
+    await cliRunner.run();
+    // The Dart source code should still be migrated.
+    assertProjectContents(
+        projectDir, simpleProject(migrated: true, pubspecText: '''
+name: test
+environment:
+  sdk: '>=2.12.0 <3.0.0'
+'''));
   }
 
   test_pubspec_is_missing_environment() async {
@@ -1743,15 +1765,15 @@
 name: test
 ''');
     var projectDir = createProjectDir(projectContents);
-    var cliRunner = _createCli().decodeCommandLineArgs(
-        _parseArgs(['--no-web-preview', '--apply-changes', projectDir]));
+    var cliRunner = _createCli()
+        .decodeCommandLineArgs(_parseArgs(['--apply-changes', projectDir]));
     await cliRunner.run();
     // The Dart source code should still be migrated.
     assertProjectContents(projectDir, simpleProject(migrated: true, pubspecText:
         // This is strange-looking, but valid.
         '''
 environment:
-  sdk: '>=2.9.0 <2.10.0'
+  sdk: '>=2.12.0 <3.0.0'
 
 name: test
 '''));
@@ -1760,11 +1782,63 @@
   test_pubspec_is_not_a_map() async {
     var projectContents = simpleProject(pubspecText: 'not-a-map');
     var projectDir = createProjectDir(projectContents);
-    var cliRunner = _createCli().decodeCommandLineArgs(
-        _parseArgs(['--no-web-preview', '--apply-changes', projectDir]));
+    var cliRunner = _createCli()
+        .decodeCommandLineArgs(_parseArgs(['--apply-changes', projectDir]));
     expect(() async => await cliRunner.run(), throwsUnsupportedError);
   }
 
+  test_pubspec_with_sdk_version_beta() async {
+    var projectDir = createProjectDir(simpleProject());
+    var cliRunner = _createCli(sdkVersion: '2.12.0-1.2.beta')
+        .decodeCommandLineArgs(_parseArgs(['--apply-changes', projectDir]));
+    await cliRunner.run();
+    assertProjectContents(
+        projectDir, simpleProject(migrated: true, pubspecText: '''
+name: test
+environment:
+  sdk: '>=2.12.0-1.2.beta <3.0.0'
+'''));
+  }
+
+  test_pubspec_with_sdk_version_dev() async {
+    var projectDir = createProjectDir(simpleProject());
+    var cliRunner = _createCli(sdkVersion: '2.12.0-1.2.dev')
+        .decodeCommandLineArgs(_parseArgs(['--apply-changes', projectDir]));
+    await cliRunner.run();
+    assertProjectContents(
+        projectDir, simpleProject(migrated: true, pubspecText: '''
+name: test
+environment:
+  sdk: '>=2.12.0-0 <3.0.0'
+'''));
+  }
+
+  test_pubspec_with_sdk_version_edge() async {
+    var projectDir = createProjectDir(simpleProject());
+    var cliRunner = _createCli(sdkVersion: '2.12.0-edge.1234567')
+        .decodeCommandLineArgs(_parseArgs(['--apply-changes', projectDir]));
+    await cliRunner.run();
+    assertProjectContents(
+        projectDir, simpleProject(migrated: true, pubspecText: '''
+name: test
+environment:
+  sdk: '>=2.12.0-0 <3.0.0'
+'''));
+  }
+
+  test_pubspec_with_sdk_version_internal() async {
+    var projectDir = createProjectDir(simpleProject());
+    var cliRunner = _createCli(sdkVersion: '2.12.0-1234567')
+        .decodeCommandLineArgs(_parseArgs(['--apply-changes', projectDir]));
+    await cliRunner.run();
+    assertProjectContents(
+        projectDir, simpleProject(migrated: true, pubspecText: '''
+name: test
+environment:
+  sdk: '>=2.12.0-0 <3.0.0'
+'''));
+  }
+
   test_uses_physical_resource_provider_by_default() {
     var cli = MigrationCli(binaryName: 'nnbd_migration');
     expect(cli.resourceProvider, same(PhysicalResourceProvider.INSTANCE));
@@ -1772,18 +1846,31 @@
 
   Future<http.Response> tryGetSourceFromServer(Uri uri, String path) async {
     var authToken = uri.queryParameters['authToken'];
-    return await http.get(
+    return await httpGet(
         uri.replace(
             path: resourceProvider.pathContext.toUri(path).path,
             queryParameters: {'inline': 'true', 'authToken': authToken}),
         headers: {'Content-Type': 'application/json; charset=UTF-8'});
   }
 
-  _MigrationCli _createCli() {
-    mock_sdk.MockSdk(resourceProvider: resourceProvider);
+  _MigrationCli _createCli(
+      {List<String> nullSafePackages = const [], String sdkVersion}) {
+    mock_sdk.MockSdk(
+        resourceProvider: resourceProvider,
+        nullSafePackages: nullSafePackages,
+        sdkVersion: sdkVersion);
     return _MigrationCli(this);
   }
 
+  void _expectErrorIndicatingCodeIsAlreadyOptedIn() {
+    var errorOutput = logger.stdoutBuffer.toString();
+    expect(errorOutput, contains('1 analysis issue found:'));
+    expect(
+        errorOutput,
+        contains("A value of type 'Null' can't be returned from function 'f' "
+            "because it has a return type of 'int'"));
+  }
+
   String _getHelpText({@required bool verbose}) {
     var cliRunner = _createCli().decodeCommandLineArgs(_parseArgs(
         ['--${CommandLineOptions.helpFlag}', if (verbose) '--verbose']));
@@ -1792,6 +1879,31 @@
     return helpText;
   }
 
+  String _getPackageConfigText(
+      {@required bool migrated,
+      Map<String, bool> packagesMigrated = const {}}) {
+    Object makePackageEntry(String name, bool migrated, {String rootUri}) {
+      rootUri ??=
+          resourceProvider.pathContext.toUri(packagePath(name)).toString();
+      return {
+        'name': name,
+        'rootUri': rootUri,
+        'packageUri': 'lib/',
+        'languageVersion': migrated ? '2.12' : '2.6'
+      };
+    }
+
+    var json = {
+      'configVersion': 2,
+      'packages': [
+        makePackageEntry('test', migrated, rootUri: '../'),
+        for (var entry in packagesMigrated.entries)
+          makePackageEntry(entry.key, entry.value)
+      ]
+    };
+    return JsonEncoder.withIndent('  ').convert(json) + '\n';
+  }
+
   ArgResults _parseArgs(List<String> args) {
     return MigrationCli.createParser().parse(args);
   }
@@ -1803,16 +1915,12 @@
   @override
   final resourceProvider;
 
-  @override
-  final processManager;
-
   _MigrationCliTestPosix()
       : resourceProvider = MemoryResourceProvider(
             context: path.style == path.Style.posix
                 ? null
                 : path.Context(
-                    style: path.Style.posix, current: '/working_dir')),
-        processManager = _MockProcessManager();
+                    style: path.Style.posix, current: '/working_dir'));
 }
 
 @reflectiveTest
@@ -1821,79 +1929,10 @@
   @override
   final resourceProvider;
 
-  @override
-  final processManager;
-
   _MigrationCliTestWindows()
       : resourceProvider = MemoryResourceProvider(
             context: path.style == path.Style.windows
                 ? null
                 : path.Context(
-                    style: path.Style.windows, current: 'C:\\working_dir')),
-        processManager = _MockProcessManager();
-}
-
-class _MockProcessManager implements ProcessManager {
-  ProcessResult _mockResult;
-
-  dynamic noSuchMethod(Invocation invocation) {}
-
-  ProcessResult runSync(String executable, List<String> arguments,
-          {String workingDirectory}) =>
-      _mockResult ??
-      ProcessResult(
-        123 /* pid */,
-        0 /* exitCode */,
-        jsonEncode({'packages': []}) /* stdout */,
-        '' /* stderr */,
-      );
-}
-
-/// TODO(paulberry): move into cli_util
-class _TestLogger implements Logger {
-  final stderrBuffer = StringBuffer();
-
-  final stdoutBuffer = StringBuffer();
-
-  final bool isVerbose;
-
-  _TestLogger(this.isVerbose);
-
-  @override
-  Ansi get ansi => Ansi(false);
-
-  @override
-  void flush() {
-    throw UnimplementedError('TODO(paulberry)');
-  }
-
-  @override
-  Progress progress(String message) {
-    return SimpleProgress(this, message);
-  }
-
-  @override
-  void stderr(String message) {
-    stderrBuffer.writeln(message);
-  }
-
-  @override
-  void stdout(String message) {
-    stdoutBuffer.writeln(message);
-  }
-
-  @override
-  void trace(String message) {
-    throw UnimplementedError('TODO(paulberry)');
-  }
-
-  @override
-  void write(String message) {
-    stdoutBuffer.write(message);
-  }
-
-  @override
-  void writeCharCode(int charCode) {
-    stdoutBuffer.writeCharCode(charCode);
-  }
+                    style: path.Style.windows, current: 'C:\\working_dir'));
 }
diff --git a/pkg/nnbd_migration/test/migration_visitor_test_base.dart b/pkg/nnbd_migration/test/migration_visitor_test_base.dart
index 9fd3eeb..f853f96 100644
--- a/pkg/nnbd_migration/test/migration_visitor_test_base.dart
+++ b/pkg/nnbd_migration/test/migration_visitor_test_base.dart
@@ -149,7 +149,7 @@
     var unit = await super.analyze(code);
     decoratedClassHierarchy = DecoratedClassHierarchy(variables, graph);
     unit.accept(EdgeBuilder(typeProvider, typeSystem, variables, graph,
-        testSource, null, decoratedClassHierarchy));
+        testSource, null, decoratedClassHierarchy, true));
     return unit;
   }
 }
@@ -236,7 +236,7 @@
   void assertNoEdge(Object source, Object destination) {
     var edges = getEdges(source, destination);
     if (edges.isNotEmpty) {
-      fail('Expected no edge $source -> $destination, found ${edges.length}');
+      fail('Expected no edge $source -> $destination, found $edges');
     }
   }
 
diff --git a/pkg/nnbd_migration/test/node_builder_test.dart b/pkg/nnbd_migration/test/node_builder_test.dart
index 24737b9..f729846 100644
--- a/pkg/nnbd_migration/test/node_builder_test.dart
+++ b/pkg/nnbd_migration/test/node_builder_test.dart
@@ -829,6 +829,62 @@
     expect(ctorParamType.returnType.node.isImmutable, false);
   }
 
+  Future<void>
+      test_fieldFormalParameter_named_no_default_required_hint() async {
+    await analyze('''
+class C {
+  String s;
+  C({/*required*/ this.s});
+}
+''');
+    expect(
+        variables.getRequiredHint(
+            testSource, findNode.fieldFormalParameter('this.s')),
+        isNotNull);
+  }
+
+  Future<void>
+      test_fieldFormalParameter_named_no_default_required_hint_annotation() async {
+    await analyze('''
+class C {
+  String s;
+  C({@deprecated /*required*/ this.s});
+}
+''');
+    expect(
+        variables.getRequiredHint(
+            testSource, findNode.fieldFormalParameter('this.s')),
+        isNotNull);
+  }
+
+  Future<void>
+      test_fieldFormalParameter_named_no_default_required_hint_function_typed() async {
+    await analyze('''
+class C {
+  String Function() s;
+  C({/*required*/ String this.s()});
+}
+''');
+    expect(
+        variables.getRequiredHint(
+            testSource, findNode.fieldFormalParameter('this.s')),
+        isNotNull);
+  }
+
+  Future<void>
+      test_fieldFormalParameter_named_no_default_required_hint_type() async {
+    await analyze('''
+class C {
+  String s;
+  C({/*required*/ String this.s});
+}
+''');
+    expect(
+        variables.getRequiredHint(
+            testSource, findNode.fieldFormalParameter('this.s')),
+        isNotNull);
+  }
+
   Future<void> test_fieldFormalParameter_typed() async {
     await analyze('''
 class C {
@@ -863,6 +919,62 @@
     // field.
   }
 
+  Future<void> test_formalParameter_named_no_default_required_hint() async {
+    await analyze('''
+void f({/*required*/ String s}) {}
+''');
+    expect(variables.getRequiredHint(testSource, findNode.simpleParameter('s')),
+        isNotNull);
+  }
+
+  Future<void>
+      test_formalParameter_named_no_default_required_hint_annotation() async {
+    await analyze('''
+void f({@deprecated /*required*/ String s}) {}
+''');
+    expect(variables.getRequiredHint(testSource, findNode.simpleParameter('s')),
+        isNotNull);
+  }
+
+  Future<void>
+      test_formalParameter_named_no_default_required_hint_covariant() async {
+    await analyze('''
+class C {
+  void f({/*required*/ covariant String s}) {}
+}
+''');
+    expect(
+        variables.getRequiredHint(
+            testSource, findNode.simpleParameter('String s')),
+        isNotNull);
+  }
+
+  Future<void>
+      test_formalParameter_named_no_default_required_hint_final_type() async {
+    await analyze('''
+void f({/*required*/ final String s}) {}
+''');
+    expect(variables.getRequiredHint(testSource, findNode.simpleParameter('s')),
+        isNotNull);
+  }
+
+  Future<void>
+      test_formalParameter_named_no_default_required_hint_no_type() async {
+    await analyze('''
+void f({/*required*/ s}) {}
+''');
+    expect(variables.getRequiredHint(testSource, findNode.simpleParameter('s')),
+        isNotNull);
+  }
+
+  Future<void> test_formalParameter_named_no_default_required_hint_var() async {
+    await analyze('''
+void f({/*required*/ var s}) {}
+''');
+    expect(variables.getRequiredHint(testSource, findNode.simpleParameter('s')),
+        isNotNull);
+  }
+
   Future<void> test_function_explicit_returnType() async {
     await analyze('''
 class C {
@@ -985,6 +1097,28 @@
         same(decoratedTypeAnnotation('String')));
   }
 
+  Future<void>
+      test_functionTypedFormalParameter_named_no_default_required_hint() async {
+    await analyze('''
+void f({/*required*/ void s()}) {}
+''');
+    expect(
+        variables.getRequiredHint(
+            testSource, findNode.functionTypedFormalParameter('s')),
+        isNotNull);
+  }
+
+  Future<void>
+      test_functionTypedFormalParameter_named_no_default_required_hint_no_return() async {
+    await analyze('''
+void f({/*required*/ s()}) {}
+''');
+    expect(
+        variables.getRequiredHint(
+            testSource, findNode.functionTypedFormalParameter('s')),
+        isNotNull);
+  }
+
   Future<void> test_functionTypedFormalParameter_namedParameter_typed() async {
     await analyze('''
 void f(void g({int i})) {}
@@ -1701,6 +1835,24 @@
     expect(functionType.namedParameters['s'].node.isPossiblyOptional, false);
   }
 
+  Future<void>
+      test_topLevelFunction_parameterType_named_no_default_required_hint() async {
+    addMetaPackage();
+    await analyze('''
+import 'package:meta/meta.dart';
+void f({/*required*/ String s}) {}
+''');
+    var decoratedType = decoratedTypeAnnotation('String');
+    var functionType = decoratedFunctionType('f');
+    expect(functionType.namedParameters['s'], same(decoratedType));
+    expect(decoratedType.node, isNotNull);
+    expect(decoratedType.node, isNot(never));
+    expect(decoratedType.node, isNot(always));
+    expect(functionType.namedParameters['s'].node.isPossiblyOptional, false);
+    expect(variables.getRequiredHint(testSource, findNode.simpleParameter('s')),
+        isNotNull);
+  }
+
   Future<void> test_topLevelFunction_parameterType_named_with_default() async {
     await analyze('''
 void f({String s: 'x'}) {}
@@ -2030,6 +2182,14 @@
     expect(decorated.node, same(never));
   }
 
+  Future<void> test_variableDeclaration_late_final_hint_simple() async {
+    await analyze('/*late final*/ int i;');
+    expect(
+        variables.getLateHint(
+            testSource, findNode.variableDeclarationList('int i')),
+        isNotNull);
+  }
+
   Future<void> test_variableDeclaration_late_hint_after_metadata() async {
     await analyze('@deprecated /*late*/ int i;');
     expect(
diff --git a/pkg/nnbd_migration/test/utilities/test_all.dart b/pkg/nnbd_migration/test/utilities/test_all.dart
index 8a172cc..dd93187 100644
--- a/pkg/nnbd_migration/test/utilities/test_all.dart
+++ b/pkg/nnbd_migration/test/utilities/test_all.dart
@@ -6,12 +6,17 @@
 
 import 'multi_future_tracker_test.dart' as multi_future_tracker_test;
 import 'scoped_set_test.dart' as scoped_set_test;
+import 'source_edit_diff_formatter_test.dart'
+    as source_edit_diff_formatter_test;
 import 'subprocess_launcher_test.dart' as subprocess_launcher_test;
+import 'where_or_null_transformer_test.dart' as where_or_null_transformer_test;
 
 main() {
   defineReflectiveSuite(() {
     multi_future_tracker_test.main();
     scoped_set_test.main();
+    source_edit_diff_formatter_test.main();
     subprocess_launcher_test.main();
+    where_or_null_transformer_test.main();
   });
 }
diff --git a/pkg/nnbd_migration/test/utilities/test_logger.dart b/pkg/nnbd_migration/test/utilities/test_logger.dart
new file mode 100644
index 0000000..5d997c3
--- /dev/null
+++ b/pkg/nnbd_migration/test/utilities/test_logger.dart
@@ -0,0 +1,54 @@
+// Copyright (c) 2020, 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:cli_util/cli_logging.dart';
+
+/// TODO(paulberry): move into cli_util
+class TestLogger implements Logger {
+  final stderrBuffer = StringBuffer();
+
+  final stdoutBuffer = StringBuffer();
+
+  final bool isVerbose;
+
+  TestLogger(this.isVerbose);
+
+  @override
+  Ansi get ansi => Ansi(false);
+
+  @override
+  void flush() {
+    throw UnimplementedError('TODO(paulberry)');
+  }
+
+  @override
+  Progress progress(String message) {
+    return SimpleProgress(this, message);
+  }
+
+  @override
+  void stderr(String message) {
+    stderrBuffer.writeln(message);
+  }
+
+  @override
+  void stdout(String message) {
+    stdoutBuffer.writeln(message);
+  }
+
+  @override
+  void trace(String message) {
+    throw UnimplementedError('TODO(paulberry)');
+  }
+
+  @override
+  void write(String message) {
+    stdoutBuffer.write(message);
+  }
+
+  @override
+  void writeCharCode(int charCode) {
+    stdoutBuffer.writeCharCode(charCode);
+  }
+}
diff --git a/pkg/nnbd_migration/test/utilities/where_or_null_transformer_test.dart b/pkg/nnbd_migration/test/utilities/where_or_null_transformer_test.dart
new file mode 100644
index 0000000..8360432
--- /dev/null
+++ b/pkg/nnbd_migration/test/utilities/where_or_null_transformer_test.dart
@@ -0,0 +1,157 @@
+// Copyright (c) 2020, 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:analyzer/dart/element/type_provider.dart';
+import 'package:analyzer/dart/element/type_system.dart';
+import 'package:nnbd_migration/src/utilities/where_or_null_transformer.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../abstract_single_unit.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(WhereOrNullTransformerTest);
+  });
+}
+
+@reflectiveTest
+class WhereOrNullTransformerTest extends AbstractSingleUnitTest {
+  WhereOrNullTransformer transformer;
+
+  TypeProvider get typeProvider => testAnalysisResult.typeProvider;
+
+  TypeSystem get typeSystem => testAnalysisResult.typeSystem;
+
+  Future<void> analyze(String code) async {
+    await resolveTestUnit(code);
+    transformer = WhereOrNullTransformer(typeProvider, typeSystem);
+  }
+
+  Future<void> test_match() async {
+    await analyze('''
+f(List<int> x) => x.firstWhere((i) => i.isEven, orElse: () => null);
+''');
+    var orElseExpression = findNode.functionExpression('() => null');
+    var transformationInfo =
+        transformer.tryTransformOrElseArgument(orElseExpression);
+    expect(transformationInfo, isNotNull);
+    expect(transformationInfo.methodInvocation,
+        same(findNode.methodInvocation('firstWhere')));
+    expect(transformationInfo.orElseArgument, same(orElseExpression.parent));
+    expect(transformationInfo.originalName, 'firstWhere');
+    expect(transformationInfo.replacementName, 'firstWhereOrNull');
+  }
+
+  Future<void> test_match_extended() async {
+    await analyze('''
+abstract class C implements Iterable<int> {
+  int firstWhere(bool test(int element), {int orElse()}) => null;
+}
+f(C c) => c.firstWhere((i) => i.isEven, orElse: () => null);
+''');
+    var orElseExpression = findNode.functionExpression('() => null');
+    var transformationInfo =
+        transformer.tryTransformOrElseArgument(orElseExpression);
+    expect(transformationInfo, isNotNull);
+    expect(transformationInfo.methodInvocation,
+        same(findNode.methodInvocation('firstWhere((')));
+    expect(transformationInfo.orElseArgument, same(orElseExpression.parent));
+    expect(transformationInfo.originalName, 'firstWhere');
+    expect(transformationInfo.replacementName, 'firstWhereOrNull');
+  }
+
+  Future<void> test_mismatch_misnamed_method() async {
+    await analyze('''
+abstract class C extends Iterable<int> {
+  int fooBar(bool test(int element), {int orElse()});
+}
+f(C c) => c.fooBar((i) => i.isEven, orElse: () => null);
+''');
+    expect(
+        transformer.tryTransformOrElseArgument(
+            findNode.functionExpression('() => null')),
+        isNull);
+  }
+
+  Future<void> test_mismatch_orElse_expression() async {
+    await analyze('''
+f(List<int> x) => x.firstWhere((i) => i.isEven, orElse: () => 0);
+''');
+    expect(
+        transformer
+            .tryTransformOrElseArgument(findNode.functionExpression('() => 0')),
+        isNull);
+  }
+
+  Future<void> test_mismatch_orElse_name() async {
+    await analyze('''
+abstract class C extends Iterable<int> {
+  @override
+  int firstWhere(bool test(int element), {int orElse(), int ifSo()});
+}
+f(C c) => c.firstWhere((i) => i.isEven, ifSo: () => null);
+''');
+    expect(
+        transformer.tryTransformOrElseArgument(
+            findNode.functionExpression('() => null')),
+        isNull);
+  }
+
+  Future<void> test_mismatch_orElse_named_parameter() async {
+    await analyze('''
+f(List<int> x) => x.firstWhere((i) => i.isEven, orElse: ({int x}) => null);
+''');
+    expect(
+        transformer.tryTransformOrElseArgument(
+            findNode.functionExpression(') => null')),
+        isNull);
+  }
+
+  Future<void> test_mismatch_orElse_optional_parameter() async {
+    await analyze('''
+f(List<int> x) => x.firstWhere((i) => i.isEven, orElse: ([int x]) => null);
+''');
+    expect(
+        transformer.tryTransformOrElseArgument(
+            findNode.functionExpression(') => null')),
+        isNull);
+  }
+
+  Future<void> test_mismatch_orElse_presence_of_other_arg() async {
+    await analyze('''
+abstract class C extends Iterable<int> {
+  @override
+  int firstWhere(bool test(int element), {int orElse(), int ifSo()});
+}
+f(C c) => c.firstWhere((i) => i.isEven, orElse: () => null, ifSo: () => null);
+''');
+    expect(
+        transformer.tryTransformOrElseArgument(
+            findNode.functionExpression('() => null,')),
+        isNull);
+  }
+
+  Future<void> test_mismatch_other_subexpression() async {
+    await analyze('''
+List<int> f(List<int> x) => x;
+g(List<int> x) => f(x).firstWhere((i) => i.isEven, orElse: () => null);
+''');
+    var xExpression = findNode.simple('x).firstWhere');
+    expect(transformer.tryTransformOrElseArgument(xExpression), isNull);
+  }
+
+  Future<void> test_mismatch_unrelated_type() async {
+    await analyze('''
+abstract class C {
+  int firstWhere(bool test(int element), {int orElse()});
+}
+f(C c) => c.firstWhere((i) => i.isEven, orElse: () => null);
+''');
+    expect(
+        transformer.tryTransformOrElseArgument(
+            findNode.functionExpression('() => null')),
+        isNull);
+  }
+}
diff --git a/pkg/scrape/.gitignore b/pkg/scrape/.gitignore
new file mode 100644
index 0000000..37c2b44
--- /dev/null
+++ b/pkg/scrape/.gitignore
@@ -0,0 +1,6 @@
+# Files and directories created by pub
+.packages
+.dart_tool/
+
+# Remove the following pattern if you wish to check in your lock file
+pubspec.lock
diff --git a/pkg/scrape/README.md b/pkg/scrape/README.md
new file mode 100644
index 0000000..58b0cda
--- /dev/null
+++ b/pkg/scrape/README.md
@@ -0,0 +1,108 @@
+# Scrape
+
+The scrape package is sort of a micro-framework to make it easier to write
+little scripts that parse and traverse Dart code and gather statistics about the
+contents.
+
+For example, say you want to find out how many if statements in a body of Dart
+code contain else clauses. A script using this package to measure that is:
+
+```dart
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:scrape/scrape.dart';
+
+void main(List<String> arguments) {
+  Scrape()
+    ..addHistogram("If")
+    ..addVisitor(() => IfVisitor())
+    ..runCommandLine(arguments);
+}
+
+class IfVisitor extends ScrapeVisitor {
+  @override
+  void visitIfStatement(IfStatement node) {
+    if (node.elseStatement != null) {
+      record("If", "else");
+    } else {
+      record("If", "no else");
+    }
+    super.visitIfStatement(node);
+  }
+}
+```
+
+Run that script on the package itself:
+
+```
+$ dart example/if.dart .
+```
+
+And it prints out:
+
+```
+-- If (137 total) --
+    104 ( 75.912%): no else  =======================================
+     33 ( 24.088%): else     =============
+Took 262ms to scrape 1349 lines in 12 files.
+```
+
+So it looks like if statements without elses are about three times more common
+than ones with elses. We use data like this to inform how we design and evolve
+the language.
+
+## A scrape script
+
+I wanted to make scrape flexible enough to let you write whatever kinds of
+logic to analyze code. That meant that instead of scrape being a *tool you run*,
+it is more like a *library you consume*. This way, inside your script, you have
+access to the full Dart language. At the same time, I didn't want every script
+to have to copy/paste the same boring argument parsing and other code.
+
+The compromise between those is the Scrape class. It is a builder for an
+analysis over some code. It has a few methods you call on it to set up an
+analysis:
+
+*   `addHistogram()` registers a new named histogram. This is the main way you
+    count occurences of datapoints you care about in the code you are analyzing.
+    Each histogram is a named collection of datapoints. When the analysis
+    completes, scrape prints out each histogram, buckets the datapoints, and
+    shows how many of each datapoint occurred.
+
+    In the example above, we have one histogram named "If" and we count two
+    different datapoints, "no else", and "else".
+
+*   `addVisitor()` registers a callback that creates a visitor. This is the
+    main way you analyze code. When the analysis runs, scrape parses every
+    Dart file you specify. For each file and each registered visitor callback,
+    it invokes the callback to create a visitor and then runs that to walk over
+    the parsed code.
+
+    You call this passing in a callback that creates an instance of your own
+    visitor class, which should extend `ScrapeVisitor`.
+
+*   Then at the end call `runCommandLine()`, passing in your script's command
+    line arguments. This reads the file paths the user wants to analyze and
+    a few other command line options and flags that scrape automatically
+    supports. To learn more, call that with `--help`.
+
+## A visitor class
+
+The way your script analyzes code is through one or more custom subclasses of
+`ScrapeVisitor`. That base class itself extends the analyzer package's
+[`RecursiveAstVisitor`][visitor] class. It will walk over every single syntax
+tree node in the parsed Dart file and invoke visit methods specific to each one.
+You override the visit methods for the AST nodes you care about and put
+whatever logic you want in there to analyze the code.
+
+An important limitation of scrape is that it only *parses* Dart files. It does
+not to any static analysis, name resolution, or type checking. This makes it
+lightweight and fast to run (for example you can run it on a pub package
+without needing to download its dependencies), but significantly limits the
+kinds of analysis you can do.
+
+It's good for syntax and tolerable for things like API usage if you're willing
+to assume that certain names do refer to the API you think they do. If you look
+in the examples directory, you'll get a sense for what kinds of tasks scrape is
+well suited for.
+
+[visitor]: https://pub.dev/documentation/analyzer/0.40.0/dart_ast_visitor/RecursiveAstVisitor-class.html
diff --git a/pkg/scrape/analysis_options.yaml b/pkg/scrape/analysis_options.yaml
new file mode 100644
index 0000000..f6dcda64
--- /dev/null
+++ b/pkg/scrape/analysis_options.yaml
@@ -0,0 +1,5 @@
+include: package:pedantic/analysis_options.yaml
+analyzer:
+  strong-mode:
+    implicit-casts: false
+    implicit-dynamic: false
diff --git a/pkg/scrape/example/build_control_flow.dart b/pkg/scrape/example/build_control_flow.dart
new file mode 100644
index 0000000..bdd851a
--- /dev/null
+++ b/pkg/scrape/example/build_control_flow.dart
@@ -0,0 +1,119 @@
+// Copyright (c) 2020, 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:analyzer/dart/ast/ast.dart';
+
+import 'package:scrape/scrape.dart';
+
+/// Known cases where an "if" statement could instead be an "if" element inside
+/// a list or map literal. Usually this is an optional child widget in a list
+/// of children.
+final _knownCollection = {'flutter/examples/layers/widgets/styled_text.dart'};
+
+final _buildMethods = <String>[];
+
+void main(List<String> arguments) {
+  Scrape()
+    ..addHistogram('build methods')
+    ..addVisitor(() => ControlFlowVisitor())
+    ..runCommandLine(arguments);
+
+  _buildMethods.shuffle();
+  _buildMethods.take(100).forEach(print);
+}
+
+class ControlFlowVisitor extends ScrapeVisitor {
+  final List<String> _controlFlow = [];
+
+  @override
+  void beforeVisitBuildMethod(Declaration node) {
+    _controlFlow.clear();
+  }
+
+  @override
+  void afterVisitBuildMethod(Declaration node) {
+    if (_controlFlow.isNotEmpty) {
+      _buildMethods.add(nodeToString(node));
+
+      var hasIf = _controlFlow.any((s) => s.startsWith('if'));
+      var hasConditional = _controlFlow.any((s) => s.startsWith('conditional'));
+
+      if (hasIf && hasConditional) {
+        record('build methods', 'both');
+      } else if (hasIf) {
+        record('build methods', 'if');
+      } else {
+        record('build methods', 'conditional');
+      }
+    } else {
+      record('build methods', 'no control flow');
+    }
+  }
+
+  @override
+  void visitConditionalExpression(ConditionalExpression node) {
+    super.visitConditionalExpression(node);
+
+    if (!isInFlutterBuildMethod) return;
+
+    if (node.parent is NamedExpression) {
+      _controlFlow.add('conditional named arg');
+    } else if (node.parent is ArgumentList) {
+      _controlFlow.add('conditional positional arg');
+    } else if (node.parent is VariableDeclaration) {
+      _controlFlow.add('conditional variable');
+    } else if (node.parent is InterpolationExpression) {
+      _controlFlow.add('conditional interpolation');
+    } else {
+      _controlFlow.add('conditional');
+    }
+  }
+
+  @override
+  void visitIfStatement(IfStatement node) {
+    super.visitIfStatement(node);
+
+    if (!isInFlutterBuildMethod) return;
+
+    if (_isReturn(node.thenStatement) && _isReturn(node.elseStatement)) {
+      _controlFlow.add('if return');
+    } else if (_isAdd(node.thenStatement) && _isAdd(node.elseStatement)) {
+      _controlFlow.add('if add');
+    } else if (_knownCollection.contains(path)) {
+      _controlFlow.add('if collection');
+    } else {
+      _controlFlow.add('if');
+    }
+  }
+
+  bool _isReturn(Statement statement) {
+    // Ignore empty "else" clauses.
+    if (statement == null) return true;
+
+    if (statement is ReturnStatement) return true;
+
+    if (statement is Block && statement.statements.length == 1) {
+      return _isReturn(statement.statements.first);
+    }
+
+    return false;
+  }
+
+  bool _isAdd(Statement statement) {
+    // Ignore empty "else" clauses.
+    if (statement == null) return true;
+
+    if (statement is ExpressionStatement) {
+      var expr = statement.expression;
+      if (expr is MethodInvocation) {
+        if (expr.methodName.name == 'add' || expr.methodName.name == 'addAll') {
+          return true;
+        }
+      }
+    } else if (statement is Block && statement.statements.length == 1) {
+      return _isAdd(statement.statements.first);
+    }
+
+    return false;
+  }
+}
diff --git a/pkg/scrape/example/class_reuse.dart b/pkg/scrape/example/class_reuse.dart
new file mode 100644
index 0000000..8fb60c6
--- /dev/null
+++ b/pkg/scrape/example/class_reuse.dart
@@ -0,0 +1,46 @@
+// Copyright (c) 2020, 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:analyzer/dart/ast/ast.dart';
+import 'package:scrape/scrape.dart';
+
+void main(List<String> arguments) {
+  Scrape()
+    ..addHistogram('Declarations')
+    ..addHistogram('Uses')
+    ..addHistogram('Superclass names')
+    ..addHistogram('Superinterface names')
+    ..addHistogram('Mixin names')
+    ..addVisitor(() => ClassReuseVisitor())
+    ..runCommandLine(arguments);
+}
+
+class ClassReuseVisitor extends ScrapeVisitor {
+  @override
+  void visitClassDeclaration(ClassDeclaration node) {
+    if (node.isAbstract) {
+      record('Declarations', 'abstract class');
+    } else {
+      record('Declarations', 'class');
+    }
+
+    if (node.extendsClause != null) {
+      record('Uses', 'extend');
+      record('Superclass names', node.extendsClause.superclass.toString());
+    }
+
+    if (node.withClause != null) {
+      for (var mixin in node.withClause.mixinTypes) {
+        record('Uses', 'mixin');
+        record('Mixin names', mixin.toString());
+      }
+    }
+
+    if (node.implementsClause != null) {
+      for (var type in node.implementsClause.interfaces) {
+        record('Uses', 'implement');
+        record('Superinterface names', type.toString());
+      }
+    }
+  }
+}
diff --git a/pkg/scrape/example/control_flow.dart b/pkg/scrape/example/control_flow.dart
new file mode 100644
index 0000000..e8c9dacf
--- /dev/null
+++ b/pkg/scrape/example/control_flow.dart
@@ -0,0 +1,52 @@
+// Copyright (c) 2020, 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:analyzer/dart/ast/ast.dart';
+import 'package:scrape/scrape.dart';
+
+void main(List<String> arguments) {
+  Scrape()
+    ..addHistogram('Statements')
+    ..addVisitor(() => ControlFlowVisitor())
+    ..runCommandLine(arguments);
+}
+
+class ControlFlowVisitor extends ScrapeVisitor {
+  @override
+  void visitDoStatement(DoStatement node) {
+    record('Statements', 'do while');
+    super.visitDoStatement(node);
+  }
+
+  @override
+  void visitForStatement(ForStatement node) {
+    if (node.forLoopParts is ForEachParts) {
+      record('Statements', 'for in');
+    } else {
+      record('Statements', 'for ;;');
+    }
+    super.visitForStatement(node);
+  }
+
+  @override
+  void visitIfStatement(IfStatement node) {
+    if (node.elseStatement != null) {
+      record('Statements', 'if else');
+    } else {
+      record('Statements', 'if');
+    }
+    super.visitIfStatement(node);
+  }
+
+  @override
+  void visitSwitchStatement(SwitchStatement node) {
+    record('Statements', 'switch');
+    super.visitSwitchStatement(node);
+  }
+
+  @override
+  void visitWhileStatement(WhileStatement node) {
+    record('Statements', 'while');
+    super.visitWhileStatement(node);
+  }
+}
diff --git a/pkg/scrape/example/generic_classes.dart b/pkg/scrape/example/generic_classes.dart
new file mode 100644
index 0000000..09ecc32
--- /dev/null
+++ b/pkg/scrape/example/generic_classes.dart
@@ -0,0 +1,30 @@
+// Copyright (c) 2020, 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:analyzer/dart/ast/ast.dart';
+
+import 'package:scrape/scrape.dart';
+
+void main(List<String> arguments) {
+  Scrape()
+    ..addHistogram('Classes', order: SortOrder.numeric)
+    ..addVisitor(() => GenericClassVisitor())
+    ..runCommandLine(arguments);
+}
+
+class GenericClassVisitor extends ScrapeVisitor {
+  @override
+  void visitCompilationUnit(CompilationUnit node) {
+    super.visitCompilationUnit(node);
+  }
+
+  @override
+  void visitClassDeclaration(ClassDeclaration node) {
+    if (node.typeParameters == null) {
+      record('Classes', 0);
+    } else {
+      record('Classes', node.typeParameters.typeParameters.length);
+    }
+    super.visitClassDeclaration(node);
+  }
+}
diff --git a/pkg/scrape/example/if.dart b/pkg/scrape/example/if.dart
new file mode 100644
index 0000000..57573ff
--- /dev/null
+++ b/pkg/scrape/example/if.dart
@@ -0,0 +1,24 @@
+// Copyright (c) 2020, 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:analyzer/dart/ast/ast.dart';
+import 'package:scrape/scrape.dart';
+
+void main(List<String> arguments) {
+  Scrape()
+    ..addHistogram('If')
+    ..addVisitor(() => IfVisitor())
+    ..runCommandLine(arguments);
+}
+
+class IfVisitor extends ScrapeVisitor {
+  @override
+  void visitIfStatement(IfStatement node) {
+    if (node.elseStatement != null) {
+      record('If', 'else');
+    } else {
+      record('If', 'no else');
+    }
+    super.visitIfStatement(node);
+  }
+}
diff --git a/pkg/scrape/example/nesting.dart b/pkg/scrape/example/nesting.dart
new file mode 100644
index 0000000..6541d6d
--- /dev/null
+++ b/pkg/scrape/example/nesting.dart
@@ -0,0 +1,164 @@
+// Copyright (c) 2020, 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:math' as math;
+
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/token.dart';
+
+import 'package:scrape/scrape.dart';
+
+/// The paths to each build() method and its maximum nesting level.
+final buildMethods = <String, int>{};
+
+bool simplifyNames = false;
+
+void main(List<String> arguments) {
+  arguments = arguments.toList();
+  simplifyNames = arguments.remove('--simplify');
+  var allCode = arguments.remove('--all');
+
+  Scrape()
+    // The number of levels of nesting active when each argument appears.
+    ..addHistogram('Nesting depth')
+    // The number of levels of nesting active when each argument appears without
+    // counting lists.
+    ..addHistogram('Ignoring lists')
+    // The number of levels of "child" or "children" named parameter nesting
+    // when each argument appears.
+    ..addHistogram('Child nesting depth')
+    ..addHistogram('Argument names')
+    // Strings that describe the structure of each nested argument.
+    ..addHistogram('Argument nesting')
+    ..addVisitor(() => NestingVisitor(allCode: allCode))
+    ..runCommandLine(arguments);
+
+  var methods = buildMethods.keys.toList();
+  methods.sort((a, b) => buildMethods[b].compareTo(buildMethods[a]));
+  for (var method in methods) {
+    print('${buildMethods[method].toString().padLeft(3)}: $method');
+  }
+  print('${buildMethods.length} build() methods');
+}
+
+class NestingVisitor extends ScrapeVisitor {
+  final List<String> _stack = [];
+
+  final bool _allCode;
+  bool _pushed = false;
+  int _deepestNesting = 0;
+
+  NestingVisitor({bool allCode}) : _allCode = allCode ?? false;
+
+  @override
+  void beforeVisitBuildMethod(Declaration node) {
+    _deepestNesting = 0;
+  }
+
+  @override
+  void afterVisitBuildMethod(Declaration node) {
+    var startLine = lineInfo.getLocation(node.offset).lineNumber;
+    buildMethods['$path:$startLine'] = _deepestNesting;
+  }
+
+  @override
+  void visitArgumentList(ArgumentList node) {
+    // Only argument lists with trailing commas get indentation.
+    if (node.arguments.isNotEmpty &&
+        node.arguments.last.endToken.next.type == TokenType.COMMA) {
+      String name;
+      var parent = node.parent;
+      if (parent is MethodInvocation) {
+        name = parent.methodName.name;
+      } else if (parent is InstanceCreationExpression) {
+        name = parent.constructorName.toString();
+      } else if (parent is SuperConstructorInvocation) {
+        name = 'super.${parent.constructorName}';
+      } else {
+        name = '?(${parent.runtimeType})?';
+      }
+
+      if (simplifyNames) {
+        name = '';
+      }
+
+      for (var argument in node.arguments) {
+        var argName =
+            argument is NamedExpression ? argument.name.label.name : '';
+
+        if (_allCode || isInFlutterBuildMethod) {
+          record('Argument names', argName);
+        }
+
+        if (simplifyNames && argName != 'child' && argName != 'children') {
+          argName = '_';
+        }
+
+        _push('$name($argName:');
+        argument.accept(this);
+        _pop();
+      }
+    } else {
+      node.visitChildren(this);
+    }
+  }
+
+  @override
+  void visitBlock(Block node) {
+    var isFunction = node.parent is BlockFunctionBody;
+    if (!isFunction) _push('{');
+    node.visitChildren(this);
+    if (!isFunction) _pop();
+  }
+
+  @override
+  void visitExpressionFunctionBody(ExpressionFunctionBody node) {
+    _push('=>');
+    node.visitChildren(this);
+    _pop();
+  }
+
+  @override
+  void visitFunctionExpression(FunctionExpression node) {
+    var isDeclaration = node.parent is FunctionDeclaration;
+    if (!isDeclaration) _push('(){');
+    node.visitChildren(this);
+    if (!isDeclaration) _pop();
+  }
+
+  @override
+  void visitListLiteral(ListLiteral node) {
+    for (var element in node.elements) {
+      _push('[');
+      element.accept(this);
+      _pop();
+    }
+  }
+
+  @override
+  void visitSetOrMapLiteral(SetOrMapLiteral node) {
+    for (var element in node.elements) {
+      _push('{');
+      element.accept(this);
+      _pop();
+    }
+  }
+
+  void _push(String string) {
+    _stack.add(string);
+    _pushed = true;
+    _deepestNesting = math.max(_deepestNesting, _stack.length);
+  }
+
+  void _pop() {
+    if (_pushed && (_allCode || isInFlutterBuildMethod)) {
+      record('Argument nesting', _stack.join(' '));
+      record('Nesting depth', _stack.length);
+      record('Ignoring lists', _stack.where((s) => s != '[').length);
+      record('Child nesting depth',
+          _stack.where((s) => s.contains('child')).length);
+    }
+    _pushed = false;
+    _stack.removeLast();
+  }
+}
diff --git a/pkg/scrape/example/null_aware.dart b/pkg/scrape/example/null_aware.dart
new file mode 100644
index 0000000..392798e
--- /dev/null
+++ b/pkg/scrape/example/null_aware.dart
@@ -0,0 +1,307 @@
+// Copyright (c) 2020, 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:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/token.dart';
+
+import 'package:scrape/scrape.dart';
+
+void main(List<String> arguments) {
+  Scrape()
+    ..addHistogram('Null-aware types')
+    ..addHistogram('Null-aware chain lengths')
+    // Boolean contexts where null-aware operators are used.
+    ..addHistogram('Boolean contexts')
+    // Expressions used to convert a null-aware expression to a Boolean for use in
+    // a Boolean context.
+    ..addHistogram('Boolean conversions')
+    ..addVisitor(() => NullVisitor())
+    ..runCommandLine(arguments);
+}
+
+class NullVisitor extends ScrapeVisitor {
+  @override
+  void visitMethodInvocation(MethodInvocation node) {
+    if (node.operator != null &&
+        node.operator.type == TokenType.QUESTION_PERIOD) {
+      _nullAware(node);
+    }
+
+    super.visitMethodInvocation(node);
+  }
+
+  @override
+  void visitPropertyAccess(PropertyAccess node) {
+    if (node.operator.type == TokenType.QUESTION_PERIOD) {
+      _nullAware(node);
+    }
+
+    super.visitPropertyAccess(node);
+  }
+
+  void _nullAware(AstNode node) {
+    var parent = node.parent;
+
+    // Parentheses are purely syntactic.
+    if (parent is ParenthesizedExpression) parent = parent.parent;
+
+    // We want to treat a chain of null-aware operators as a single unit. We
+    // use the top-most node (the last method in the chain) as the "real" one
+    // because its parent is the context where the whole chain appears.
+    if (parent is PropertyAccess &&
+            parent.operator.type == TokenType.QUESTION_PERIOD &&
+            parent.target == node ||
+        parent is MethodInvocation &&
+            parent.operator != null &&
+            parent.operator.type == TokenType.QUESTION_PERIOD &&
+            parent.target == node) {
+      // This node is not the root of a null-aware chain, so skip it.
+      return;
+    }
+
+    // This node is the root of a null-aware chain. See how long the chain is.
+    var length = 0;
+    var chain = node;
+    while (true) {
+      if (chain is PropertyAccess &&
+          chain.operator.type == TokenType.QUESTION_PERIOD) {
+        chain = (chain as PropertyAccess).target;
+      } else if (chain is MethodInvocation &&
+          chain.operator != null &&
+          chain.operator.type == TokenType.QUESTION_PERIOD) {
+        chain = (chain as MethodInvocation).target;
+      } else {
+        break;
+      }
+
+      length++;
+    }
+
+    record('Null-aware chain lengths', length.toString());
+
+    void recordType(String label) {
+      record('Null-aware types', label);
+    }
+
+    // See if the expression is an if condition.
+    _checkCondition(node);
+
+    if (parent is ExpressionStatement) {
+      recordType("Expression statement 'foo?.bar();'");
+      return;
+    }
+
+    if (parent is ReturnStatement) {
+      recordType("Return statement 'return foo?.bar();'");
+      return;
+    }
+
+    if (parent is BinaryExpression &&
+        parent.operator.type == TokenType.BANG_EQ &&
+        parent.leftOperand == node &&
+        parent.rightOperand is BooleanLiteral &&
+        (parent.rightOperand as BooleanLiteral).value == true) {
+      recordType("Compare to true 'foo?.bar() != true'");
+      return;
+    }
+
+    if (parent is BinaryExpression &&
+        parent.operator.type == TokenType.EQ_EQ &&
+        parent.leftOperand == node &&
+        parent.rightOperand is BooleanLiteral &&
+        (parent.rightOperand as BooleanLiteral).value == true) {
+      recordType("Compare to true 'foo?.bar() == true'");
+      return;
+    }
+
+    if (parent is BinaryExpression &&
+        parent.operator.type == TokenType.BANG_EQ &&
+        parent.leftOperand == node &&
+        parent.rightOperand is BooleanLiteral &&
+        (parent.rightOperand as BooleanLiteral).value == false) {
+      recordType("Compare to false 'foo?.bar() != false'");
+      return;
+    }
+
+    if (parent is BinaryExpression &&
+        parent.operator.type == TokenType.EQ_EQ &&
+        parent.leftOperand == node &&
+        parent.rightOperand is BooleanLiteral &&
+        (parent.rightOperand as BooleanLiteral).value == false) {
+      recordType("Compare to false 'foo?.bar() == false'");
+      return;
+    }
+
+    if (parent is BinaryExpression &&
+        parent.operator.type == TokenType.BANG_EQ &&
+        parent.leftOperand == node &&
+        parent.rightOperand is NullLiteral) {
+      recordType("Compare to null 'foo?.bar() != null'");
+      return;
+    }
+
+    if (parent is BinaryExpression &&
+        parent.operator.type == TokenType.EQ_EQ &&
+        parent.leftOperand == node &&
+        parent.rightOperand is NullLiteral) {
+      recordType("Compare to null 'foo?.bar() == null'");
+      return;
+    }
+
+    if (parent is BinaryExpression && parent.operator.type == TokenType.EQ_EQ) {
+      recordType("Compare to other expression 'foo?.bar() == bang'");
+      return;
+    }
+
+    if (parent is BinaryExpression &&
+        parent.operator.type == TokenType.BANG_EQ) {
+      recordType("Compare to other expression 'foo?.bar() != bang'");
+      return;
+    }
+
+    if (parent is BinaryExpression &&
+        parent.operator.type == TokenType.QUESTION_QUESTION &&
+        parent.leftOperand == node) {
+      recordType("Coalesce 'foo?.bar() ?? baz'");
+      return;
+    }
+
+    if (parent is BinaryExpression &&
+        parent.operator.type == TokenType.QUESTION_QUESTION &&
+        parent.rightOperand == node) {
+      recordType("Reverse coalesce 'baz ?? foo?.bar()'");
+      return;
+    }
+
+    if (parent is ConditionalExpression && parent.condition == node) {
+      recordType(
+          "Condition in conditional expression 'foo?.bar() ? baz : bang");
+      return;
+    }
+
+    if (parent is ConditionalExpression) {
+      recordType("Then or else branch of conditional 'baz ? foo?.bar() : bang");
+      return;
+    }
+
+    if (parent is AsExpression && parent.expression == node) {
+      recordType("Cast expression 'foo?.bar as Baz'");
+      return;
+    }
+
+    if (parent is AssignmentExpression && parent.leftHandSide == node) {
+      recordType("Assign target 'foo?.bar ${parent.operator} baz'");
+      return;
+    }
+
+    if (parent is AssignmentExpression && parent.rightHandSide == node) {
+      recordType("Assign value 'baz = foo?.bar()'");
+      return;
+    }
+
+    if (parent is VariableDeclaration && parent.initializer == node) {
+      recordType("Variable initializer 'var baz = foo?.bar();'");
+      return;
+    }
+
+    if (parent is NamedExpression) {
+      recordType("Named argument 'fn(name: foo?.bar())'");
+      return;
+    }
+
+    if (parent is ArgumentList && parent.arguments.contains(node)) {
+      recordType("Positional argument 'fn(foo?.bar())'");
+      return;
+    }
+
+    if (parent is AwaitExpression) {
+      recordType("Await 'await foo?.bar()'");
+      return;
+    }
+
+    if (parent is MapLiteralEntry || parent is ListLiteral) {
+      recordType("Collection literal element '[foo?.bar()]'");
+      return;
+    }
+
+    if (parent is ExpressionFunctionBody) {
+      recordType("Member body 'member() => foo?.bar();'");
+      return;
+    }
+
+    if (parent is InterpolationExpression) {
+      recordType("String interpolation '\"blah \${foo?.bar()}\"'");
+      return;
+    }
+
+    if (parent is BinaryExpression) {
+      recordType('Uncategorized ${parent}');
+      return;
+    }
+
+    recordType('Uncategorized ${parent.runtimeType}');
+
+    // Find the surrounding statement containing the null-aware.
+    while (node is Expression) {
+      node = node.parent;
+    }
+
+    printNode(node);
+  }
+
+  void _checkCondition(AstNode node) {
+    String expression;
+
+    // Look at the expression that immediately wraps the null-aware to see if
+    // it deals with it somehow, like "foo?.bar ?? otherwise".
+    var parent = node.parent;
+    if (parent is ParenthesizedExpression) parent = parent.parent;
+
+    if (parent is BinaryExpression &&
+        (parent.operator.type == TokenType.EQ_EQ ||
+            parent.operator.type == TokenType.BANG_EQ ||
+            parent.operator.type == TokenType.QUESTION_QUESTION) &&
+        (parent.rightOperand is NullLiteral ||
+            parent.rightOperand is BooleanLiteral)) {
+      var binary = parent as BinaryExpression;
+      expression = 'foo?.bar ${binary.operator} ${binary.rightOperand}';
+
+      // This does handle it, so see the context where it appears.
+      node = parent as Expression;
+      if (node is ParenthesizedExpression) node = node.parent as Expression;
+      parent = node.parent;
+      if (parent is ParenthesizedExpression) parent = parent.parent;
+    }
+
+    String context;
+    if (parent is IfStatement && node == parent.condition) {
+      context = 'if';
+    } else if (parent is BinaryExpression &&
+        parent.operator.type == TokenType.AMPERSAND_AMPERSAND) {
+      context = '&&';
+    } else if (parent is BinaryExpression &&
+        parent.operator.type == TokenType.BAR_BAR) {
+      context = '||';
+    } else if (parent is WhileStatement && node == parent.condition) {
+      context = 'while';
+    } else if (parent is DoStatement && node == parent.condition) {
+      context = 'do';
+    } else if (parent is ForStatement &&
+        parent.forLoopParts is ForParts &&
+        node == (parent.forLoopParts as ForParts).condition) {
+      context = 'for';
+    } else if (parent is ConditionalExpression && node == parent.condition) {
+      context = '?:';
+    }
+
+    if (context != null) {
+      record('Boolean contexts', context);
+
+      if (expression != null) {
+        record('Boolean conversions', expression);
+      } else {
+        record('Boolean conversions', 'unknown: $node');
+      }
+    }
+  }
+}
diff --git a/pkg/scrape/example/spread_sizes.dart b/pkg/scrape/example/spread_sizes.dart
new file mode 100644
index 0000000..d1257e1
--- /dev/null
+++ b/pkg/scrape/example/spread_sizes.dart
@@ -0,0 +1,56 @@
+// Copyright (c) 2020, 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:analyzer/dart/ast/ast.dart';
+
+import 'package:scrape/scrape.dart';
+
+/// Looks at expressions that could likely be converted to spread operators and
+/// measures their length. "Likely" means calls to `addAll()` where the
+/// receiver is a list or map literal.
+void main(List<String> arguments) {
+  Scrape()
+    ..addHistogram('Arguments')
+    ..addHistogram('Lengths', order: SortOrder.numeric)
+    ..addVisitor(() => SpreadVisitor())
+    ..runCommandLine(arguments);
+}
+
+class SpreadVisitor extends ScrapeVisitor {
+  @override
+  void visitCascadeExpression(CascadeExpression node) {
+    for (var section in node.cascadeSections) {
+      if (section is MethodInvocation) {
+        _countCall(node, section.methodName, node.target, section.argumentList);
+      }
+    }
+
+    super.visitCascadeExpression(node);
+  }
+
+  @override
+  void visitMethodInvocation(MethodInvocation node) {
+    _countCall(node, node.methodName, node.target, node.argumentList);
+    super.visitMethodInvocation(node);
+  }
+
+  void _countCall(Expression node, SimpleIdentifier name, Expression target,
+      ArgumentList args) {
+    if (name.name != 'addAll') return;
+
+    // See if the target is a collection literal.
+    while (target is MethodInvocation) {
+      target = (target as MethodInvocation).target;
+    }
+
+    if (target is ListLiteral || target is SetOrMapLiteral) {
+      if (args.arguments.length == 1) {
+        var arg = args.arguments[0];
+        record('Arguments', arg.toString());
+        record('Lengths', arg.length);
+      }
+
+      printNode(node);
+    }
+  }
+}
diff --git a/pkg/scrape/lib/scrape.dart b/pkg/scrape/lib/scrape.dart
new file mode 100644
index 0000000..6359494
--- /dev/null
+++ b/pkg/scrape/lib/scrape.dart
@@ -0,0 +1,291 @@
+// Copyright (c) 2020, 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';
+import 'dart:math' as math;
+
+import 'package:analyzer/dart/analysis/features.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/source/line_info.dart';
+import 'package:analyzer/src/dart/scanner/reader.dart';
+import 'package:analyzer/src/dart/scanner/scanner.dart';
+import 'package:analyzer/src/generated/parser.dart';
+import 'package:analyzer/src/string_source.dart';
+import 'package:args/args.dart';
+import 'package:path/path.dart' as p;
+
+import 'src/error_listener.dart';
+import 'src/histogram.dart';
+import 'src/scrape_visitor.dart';
+
+export 'src/histogram.dart';
+export 'src/scrape_visitor.dart' hide bindVisitor;
+
+class Scrape {
+  final List<ScrapeVisitor Function()> _visitorFactories = [];
+
+  /// What percent of files should be processed.
+  int _percent;
+
+  /// Process package test files.
+  bool _includeTests = true;
+
+  /// Process Dart SDK language tests.
+  bool _includeLanguageTests = true;
+
+  /// Process Dart files generated from protobufs.
+  bool _includeProtobufs = false;
+
+  /// Whether every file should be printed before being processed.
+  bool _printFiles = true;
+
+  /// Whether parse errors should be printed.
+  bool _printErrors = true;
+
+  /// The number of files that have been processed.
+  int get scrapedFileCount => _scrapedFileCount;
+  int _scrapedFileCount = 0;
+
+  /// The number of lines of code that have been processed.
+  int get scrapedLineCount => _scrapedLineCount;
+  int _scrapedLineCount = 0;
+
+  final Map<String, Histogram> _histograms = {};
+
+  /// Whether we're in the middle of writing the running file count and need a
+  /// newline before any other output should be shown.
+  bool _needClearLine = false;
+
+  /// Register a new visitor factory.
+  ///
+  /// This function will be called for each scraped file and the resulting
+  /// [ScrapeVisitor] will traverse the parsed file's AST.
+  void addVisitor(ScrapeVisitor Function() createVisitor) {
+    _visitorFactories.add(createVisitor);
+  }
+
+  /// Defines a new histogram with [name] to collect occurrences.
+  ///
+  /// After the scrape completes, each defined histogram's collected counts
+  /// are shown, ordered by [order]. If [showBar] is not `false`, then shows an
+  /// ASCII bar chart for the counts.
+  ///
+  /// If [showAll] is `true`, then every item that occurred is shown. Otherwise,
+  /// only shows the first 100 items or occurrences that represent at least
+  /// 0.1% of the total, whichever is longer.
+  ///
+  /// If [minCount] is passed, then only shows items that occurred at least
+  /// that many times.
+  void addHistogram(String name,
+      {SortOrder order = SortOrder.descending,
+      bool showBar,
+      bool showAll,
+      int minCount}) {
+    _histograms.putIfAbsent(
+        name,
+        () => Histogram(
+            order: order,
+            showBar: showBar,
+            showAll: showAll,
+            minCount: minCount));
+  }
+
+  /// Add an occurrence of [item] to [histogram].
+  void record(String histogram, Object item) {
+    _histograms[histogram].add(item);
+  }
+
+  /// Run the scrape using the given set of command line arguments.
+  void runCommandLine(List<String> arguments) {
+    var parser = ArgParser(allowTrailingOptions: true);
+    parser.addOption('percent',
+        help: 'Only process a randomly selected percentage of files.');
+    parser.addFlag('tests',
+        defaultsTo: true, help: 'Process package test files.');
+    parser.addFlag('language-tests',
+        help: 'Process Dart SDK language test files.');
+    parser.addFlag('protobufs',
+        help: 'Process Dart files generated from protobufs.');
+    parser.addFlag('print-files',
+        defaultsTo: true, help: 'Print the path for each parsed file.');
+    parser.addFlag('print-errors',
+        defaultsTo: true, help: 'Print parse errors.');
+    parser.addFlag('help', negatable: false, help: 'Print help text.');
+
+    var results = parser.parse(arguments);
+
+    if (results['help'] as bool) {
+      var script = p.url.basename(Platform.script.toString());
+      print('Usage: $script [options] <paths...>');
+      print(parser.usage);
+      return;
+    }
+
+    _includeTests = results['tests'] as bool;
+    _includeLanguageTests = results['language-tests'] as bool;
+    _includeProtobufs = results['protobufs'] as bool;
+    _printFiles = results['print-files'] as bool;
+    _printErrors = results['print-errors'] as bool;
+
+    if (results.wasParsed('percent')) {
+      _percent = int.tryParse(results['percent'] as String);
+      if (_percent == null) {
+        print("--percent must be an integer, was '${results["percent"]}'.");
+        exit(1);
+      }
+    }
+
+    if (results.rest.isEmpty) {
+      print('Must pass at least one path to process.');
+      exit(1);
+    }
+
+    var watch = Stopwatch()..start();
+    for (var path in results.rest) {
+      _processPath(path);
+    }
+    watch.stop();
+
+    clearLine();
+    _histograms.forEach((name, histogram) {
+      histogram.printCounts(name);
+    });
+
+    var elapsed = _formatDuration(watch.elapsed);
+    var lines = _scrapedLineCount != 1 ? '$_scrapedLineCount lines' : '1 line';
+    var files = _scrapedFileCount != 1 ? '$_scrapedFileCount files' : '1 file';
+    print('Took $elapsed to scrape $lines in $files.');
+  }
+
+  /// Display [message], clearing the line if necessary.
+  void log(Object message) {
+    // TODO(rnystrom): Consider using cli_util package.
+    clearLine();
+    print(message);
+  }
+
+  /// Clear the current line if it needs it.
+  void clearLine() {
+    if (!_needClearLine) return;
+    stdout.write('\u001b[2K\r');
+    _needClearLine = false;
+  }
+
+  String _formatDuration(Duration duration) {
+    String pad(int width, int n) => n.toString().padLeft(width, '0');
+
+    if (duration.inMinutes >= 1) {
+      var minutes = duration.inMinutes;
+      var seconds = duration.inSeconds % 60;
+      var ms = duration.inMilliseconds % 1000;
+      return '$minutes:${pad(2, seconds)}.${pad(3, ms)}';
+    } else if (duration.inSeconds >= 1) {
+      return '${(duration.inMilliseconds / 1000).toStringAsFixed(3)}s';
+    } else {
+      return '${duration.inMilliseconds}ms';
+    }
+  }
+
+  void _processPath(String path) {
+    var random = math.Random();
+
+    if (File(path).existsSync()) {
+      _parseFile(File(path), path);
+      return;
+    }
+
+    for (var entry in Directory(path).listSync(recursive: true)) {
+      if (entry is! File) continue;
+
+      if (!entry.path.endsWith('.dart')) continue;
+
+      // For unknown reasons, some READMEs have a ".dart" extension. They aren't
+      // Dart files.
+      if (entry.path.endsWith('README.dart')) continue;
+
+      if (!_includeLanguageTests) {
+        if (entry.path.contains('/sdk/tests/')) continue;
+        if (entry.path.contains('/testcases/')) continue;
+        if (entry.path.contains('/sdk/runtime/tests/')) continue;
+        if (entry.path.contains('/linter/test/_data/')) continue;
+        if (entry.path.contains('/analyzer/test/')) continue;
+        if (entry.path.contains('/dev_compiler/test/')) continue;
+        if (entry.path.contains('/analyzer_cli/test/')) continue;
+        if (entry.path.contains('/analysis_server/test/')) continue;
+        if (entry.path.contains('/kernel/test/')) continue;
+      }
+
+      if (!_includeTests) {
+        if (entry.path.contains('/test/')) continue;
+        if (entry.path.endsWith('_test.dart')) continue;
+      }
+
+      // Don't care about cached packages.
+      if (entry.path.contains('sdk/third_party/pkg/')) continue;
+      if (entry.path.contains('sdk/third_party/pkg_tested/')) continue;
+      if (entry.path.contains('/.dart_tool/')) continue;
+
+      // Don't care about generated protobuf code.
+      if (!_includeProtobufs) {
+        if (entry.path.endsWith('.pb.dart')) continue;
+        if (entry.path.endsWith('.pbenum.dart')) continue;
+      }
+
+      if (_percent != null && random.nextInt(100) >= _percent) continue;
+
+      var relative = p.relative(entry.path, from: path);
+      _parseFile(entry as File, relative);
+    }
+  }
+
+  void _parseFile(File file, String shortPath) {
+    var source = file.readAsStringSync();
+
+    var errorListener = ErrorListener(this, _printErrors);
+
+    // Tokenize the source.
+    var reader = CharSequenceReader(source);
+    var stringSource = StringSource(source, file.path);
+    var scanner = Scanner(stringSource, reader, errorListener);
+    var startToken = scanner.tokenize();
+
+    // Parse it.
+    var parser = Parser(stringSource, errorListener,
+        featureSet: FeatureSet.latestLanguageVersion());
+    parser.enableOptionalNewAndConst = true;
+    parser.enableSetLiterals = true;
+
+    if (_printFiles) {
+      var line =
+          '[$_scrapedFileCount files, $_scrapedLineCount lines] ' '$shortPath';
+      if (Platform.isWindows) {
+        // No ANSI escape codes on Windows.
+        print(line);
+      } else {
+        // Overwrite the same line.
+        stdout.write('\u001b[2K\r'
+            '[$_scrapedFileCount files, $_scrapedLineCount lines] $shortPath');
+        _needClearLine = true;
+      }
+    }
+
+    AstNode node;
+    try {
+      node = parser.parseCompilationUnit(startToken);
+    } catch (error) {
+      print('Got exception parsing $shortPath:\n$error');
+      return;
+    }
+
+    var lineInfo = LineInfo(scanner.lineStarts);
+
+    _scrapedFileCount++;
+    _scrapedLineCount += lineInfo.lineCount;
+
+    for (var visitorFactory in _visitorFactories) {
+      var visitor = visitorFactory();
+      bindVisitor(visitor, this, shortPath, source, lineInfo);
+      node.accept(visitor);
+    }
+  }
+}
diff --git a/pkg/scrape/lib/src/error_listener.dart b/pkg/scrape/lib/src/error_listener.dart
new file mode 100644
index 0000000..69c9118
--- /dev/null
+++ b/pkg/scrape/lib/src/error_listener.dart
@@ -0,0 +1,21 @@
+// Copyright (c) 2020, 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:analyzer/error/error.dart';
+import 'package:analyzer/error/listener.dart';
+import 'package:scrape/scrape.dart';
+
+/// A simple [AnalysisErrorListener] that just collects the reported errors.
+class ErrorListener implements AnalysisErrorListener {
+  final Scrape _scrape;
+  final bool _printErrors;
+
+  ErrorListener(this._scrape, this._printErrors);
+
+  @override
+  void onError(AnalysisError error) {
+    if (_printErrors) {
+      _scrape.log(error);
+    }
+  }
+}
diff --git a/pkg/scrape/lib/src/histogram.dart b/pkg/scrape/lib/src/histogram.dart
new file mode 100644
index 0000000..12f2b9f
--- /dev/null
+++ b/pkg/scrape/lib/src/histogram.dart
@@ -0,0 +1,100 @@
+// Copyright (c) 2020, 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:math' as math;
+
+enum SortOrder {
+  /// From fewest occurrences to most.
+  ascending,
+
+  /// From most occurrences to fewest.
+  descending,
+
+  /// Lexicographically sorted by name.
+  alphabetical,
+
+  /// Keys are parsed as integers and sorted by value.
+  numeric,
+}
+
+/// Counts occurrences of strings and displays the results as a histogram.
+class Histogram {
+  final Map<Object, int> _counts = {};
+  final SortOrder _order;
+  final bool _showBar;
+  final bool _showAll;
+  final int _minCount;
+
+  int get totalCount => _counts.values.fold(0, (a, b) => a + b);
+
+  Histogram({SortOrder order, bool showBar, bool showAll, int minCount})
+      : _order = order ?? SortOrder.descending,
+        _showBar = showBar ?? true,
+        _showAll = showAll ?? false,
+        _minCount = minCount ?? 0;
+
+  void add(Object item) {
+    _counts.putIfAbsent(item, () => 0);
+    _counts[item]++;
+  }
+
+  void printCounts(String label) {
+    var total = totalCount;
+    print('');
+    print('-- $label ($total total) --');
+
+    var keys = _counts.keys.toList();
+    switch (_order) {
+      case SortOrder.ascending:
+        keys.sort((a, b) => _counts[a].compareTo(_counts[b]));
+        break;
+      case SortOrder.descending:
+        keys.sort((a, b) => _counts[b].compareTo(_counts[a]));
+        break;
+      case SortOrder.alphabetical:
+        keys.sort();
+        break;
+      case SortOrder.numeric:
+        // TODO(rnystrom): Using string keys but treating them as integers is
+        // kind of hokey. But it keeps the [ScrapeVisitor] API simpler.
+        keys.sort((a, b) => (a as int).compareTo(b as int));
+        break;
+    }
+
+    var longest = keys.fold<int>(
+        0, (length, key) => math.max(length, key.toString().length));
+    var barScale = 80 - 22 - longest;
+
+    var shown = 0;
+    var skipped = 0;
+    for (var object in keys) {
+      var count = _counts[object];
+      var countString = count.toString().padLeft(7);
+      var percent = 100 * count / total;
+      var percentString = percent.toStringAsFixed(3).padLeft(7);
+
+      if (_showAll || ((shown < 100 || percent >= 0.1) && count >= _minCount)) {
+        var line = '$countString ($percentString%): $object';
+        if (_showBar && barScale > 1) {
+          line = line.padRight(longest + 22);
+          line += '=' * (percent / 100 * barScale).ceil();
+        }
+        print(line);
+        shown++;
+      } else {
+        skipped++;
+      }
+    }
+
+    if (skipped > 0) print('And $skipped more less than 0.1%...');
+
+    // If we're counting numeric keys, show other statistics too.
+    if (_order == SortOrder.numeric && keys.isNotEmpty) {
+      var sum = keys.fold<int>(
+          0, (result, key) => result + (key as int) * _counts[key]);
+      var average = sum / total;
+      var median = _counts[keys[keys.length ~/ 2]];
+      print('Sum $sum, average ${average.toStringAsFixed(3)}, median $median');
+    }
+  }
+}
diff --git a/pkg/scrape/lib/src/scrape_visitor.dart b/pkg/scrape/lib/src/scrape_visitor.dart
new file mode 100644
index 0000000..0b8a405
--- /dev/null
+++ b/pkg/scrape/lib/src/scrape_visitor.dart
@@ -0,0 +1,139 @@
+// Copyright (c) 2020, 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:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/visitor.dart';
+import 'package:analyzer/source/line_info.dart';
+
+import '../scrape.dart';
+
+/// Wire up [visitor] to [scrape] the given [path] containing [source] with
+/// [info].
+///
+/// This is a top-level function instead of an instance method so that we can
+/// hide it and not export it from scrape's public API. Only [Scrape] itself
+/// should call this. We bind separately instead of passing these through the
+/// [ScrapeVisitor] constructor so that subclasses of [ScrapeVisitor] don't
+/// need to define a pass-through constructor.
+void bindVisitor(ScrapeVisitor visitor, Scrape scrape, String path,
+    String source, LineInfo info) {
+  assert(visitor._scrape == null, 'Should only bind once.');
+  visitor._scrape = scrape;
+  visitor._path = path;
+  visitor._source = source;
+  visitor.lineInfo = info;
+}
+
+/// Base Visitor class with some utility functionality.
+class ScrapeVisitor extends RecursiveAstVisitor<void> {
+  // These final-ish fields are initialized by [bindVisitor()].
+  Scrape _scrape;
+  String _path;
+  String _source;
+  LineInfo lineInfo;
+
+  /// How many levels deep the visitor is currently nested inside build methods.
+  int _inFlutterBuildMethods = 0;
+
+  String get path => _path;
+
+  // TODO(rnystrom): Remove this in favor of using surveyor for these kinds of
+  // analyses.
+  /// Whether the visitor is currently inside a Flutter "build" method,
+  /// either directly or nested inside some other function inside one.
+  ///
+  /// This is only an approximate guess. It assumes a method is a "build"-like
+  /// method if it returns "Widget", or has a parameter list that starts with
+  /// "BuildContext context".
+  bool get isInFlutterBuildMethod => _inFlutterBuildMethods > 0;
+
+  bool _isBuildMethod(TypeAnnotation returnType, SimpleIdentifier name,
+      FormalParameterList parameters) {
+    var parameterString = parameters.toString();
+
+    if (returnType.toString() == 'void') return false;
+    if (parameterString.startsWith('(BuildContext context')) return true;
+    if (returnType.toString() == 'Widget') return true;
+
+    return false;
+  }
+
+  /// Add an occurrence of [item] to [histogram].
+  void record(String histogram, Object item) {
+    _scrape.record(histogram, item);
+  }
+
+  /// Write [message] to stdout, clearing the current line if needed.
+  void log(Object message) {
+    _scrape.log(message);
+  }
+
+  /// Print a nice representation of [node].
+  void printNode(AstNode node) {
+    log(nodeToString(node));
+  }
+
+  /// Generate a nice string representation of [node] include file path and
+  /// line information.
+  String nodeToString(AstNode node) {
+    var startLine = lineInfo.getLocation(node.offset).lineNumber;
+    var endLine = lineInfo.getLocation(node.end).lineNumber;
+
+    startLine = startLine.clamp(0, lineInfo.lineCount - 1) as int;
+    endLine = endLine.clamp(0, lineInfo.lineCount - 1) as int;
+
+    var buffer = StringBuffer();
+    buffer.writeln('// $path:$startLine');
+    for (var line = startLine; line <= endLine; line++) {
+      // Note that getLocation() returns 1-based lines, but getOffsetOfLine()
+      // expects 0-based.
+      var offset = lineInfo.getOffsetOfLine(line - 1);
+      // -1 to not include the newline.
+      var end = lineInfo.getOffsetOfLine(line) - 1;
+
+      buffer.writeln(_source.substring(offset, end));
+    }
+
+    return buffer.toString();
+  }
+
+  /// Get the line number of the code at [offset].
+  int getLine(int offset) => lineInfo.getLocation(offset).lineNumber;
+
+  /// Override this to execute custom code before visiting a Flutter build
+  /// method.
+  void beforeVisitBuildMethod(Declaration node) {}
+
+  /// Override this to execute custom code after visiting a Flutter build
+  /// method.
+  void afterVisitBuildMethod(Declaration node) {}
+
+  @override
+  void visitMethodDeclaration(MethodDeclaration node) {
+    var isBuild = _isBuildMethod(node.returnType, node.name, node.parameters);
+    if (isBuild) _inFlutterBuildMethods++;
+
+    try {
+      if (isBuild) beforeVisitBuildMethod(node);
+      super.visitMethodDeclaration(node);
+      if (isBuild) afterVisitBuildMethod(node);
+    } finally {
+      if (isBuild) _inFlutterBuildMethods--;
+    }
+  }
+
+  @override
+  void visitFunctionDeclaration(FunctionDeclaration node) {
+    var isBuild = _isBuildMethod(
+        node.returnType, node.name, node.functionExpression.parameters);
+    if (isBuild) _inFlutterBuildMethods++;
+
+    try {
+      if (isBuild) beforeVisitBuildMethod(node);
+      super.visitFunctionDeclaration(node);
+      if (isBuild) afterVisitBuildMethod(node);
+    } finally {
+      if (isBuild) _inFlutterBuildMethods--;
+    }
+  }
+}
diff --git a/pkg/scrape/pubspec.yaml b/pkg/scrape/pubspec.yaml
new file mode 100644
index 0000000..a011644
--- /dev/null
+++ b/pkg/scrape/pubspec.yaml
@@ -0,0 +1,12 @@
+name: scrape
+description: Helper package for analyzing the syntax of Dart programs.
+# This package is not intended for consumption on pub.dev. DO NOT publish.
+publish_to: none
+environment:
+  sdk: ^2.10.0
+dependencies:
+  args: ^1.6.0
+  analyzer: ^0.40.4
+  path: ^1.7.0
+dev_dependencies:
+  pedantic: ^1.9.2
diff --git a/pkg/smith/lib/configuration.dart b/pkg/smith/lib/configuration.dart
index b96782c..846d39d 100644
--- a/pkg/smith/lib/configuration.dart
+++ b/pkg/smith/lib/configuration.dart
@@ -611,7 +611,6 @@
   static const appJitk = Compiler._('app_jitk');
   static const dartk = Compiler._('dartk');
   static const dartkp = Compiler._('dartkp');
-  static const dartkb = Compiler._('dartkb');
   static const specParser = Compiler._('spec_parser');
   static const fasta = Compiler._('fasta');
 
@@ -627,7 +626,6 @@
     appJitk,
     dartk,
     dartkp,
-    dartkb,
     specParser,
     fasta,
   ], key: (compiler) => (compiler as Compiler).name);
@@ -680,7 +678,6 @@
         return const [Runtime.none];
       case Compiler.appJitk:
       case Compiler.dartk:
-      case Compiler.dartkb:
         return const [Runtime.vm, Runtime.selfCheck];
       case Compiler.dartkp:
         return const [Runtime.dartPrecompiled];
@@ -709,7 +706,6 @@
         return Runtime.none;
       case Compiler.appJitk:
       case Compiler.dartk:
-      case Compiler.dartkb:
         return Runtime.vm;
       case Compiler.dartkp:
         return Runtime.dartPrecompiled;
diff --git a/pkg/test_runner/lib/src/command.dart b/pkg/test_runner/lib/src/command.dart
index 348ae03..27ca02d 100644
--- a/pkg/test_runner/lib/src/command.dart
+++ b/pkg/test_runner/lib/src/command.dart
@@ -10,6 +10,7 @@
 import 'command_output.dart';
 import 'configuration.dart';
 import 'path.dart';
+import 'test_case.dart';
 import 'utils.dart';
 
 /// A command executed as a step in a test case.
@@ -531,6 +532,75 @@
   }
 }
 
+// Run a VM test under RR, and copy the trace if it crashes. Using a helper
+// script like the precompiler does not work because the RR traces are large
+// and we must diligently erase them for non-crashes even if the test times
+// out and would be killed by the harness, so the copying and cleanup logic
+// must be in the harness.
+class RRCommand extends Command {
+  VMCommand originalCommand;
+  VMCommand wrappedCommand;
+  io.Directory recordingDir;
+  io.Directory savedDir;
+
+  RRCommand(this.originalCommand)
+      : super._("rr", index: originalCommand.index) {
+    final suffix = "/rr-trace-" + originalCommand.hashCode.toString();
+    recordingDir = io.Directory(io.Directory.systemTemp.path + suffix);
+    savedDir = io.Directory("out" + suffix);
+    final executable = "rr";
+    final arguments = <String>[
+      "record",
+      "--chaos",
+      "--output-trace-dir=" + recordingDir.path,
+    ];
+    arguments.add(originalCommand.executable);
+    arguments.addAll(originalCommand.arguments);
+    wrappedCommand = VMCommand(
+        executable, arguments, originalCommand.environmentOverrides,
+        index: originalCommand.index);
+  }
+
+  RRCommand indexedCopy(int index) =>
+      RRCommand(originalCommand.indexedCopy(index));
+
+  Future<CommandOutput> run(int timeout) async {
+    // rr will fail if the output trace directory already exists. Delete any
+    // that might be leftover from interrupting the harness.
+    if (await recordingDir.exists()) {
+      await recordingDir.delete(recursive: true);
+    }
+    final output = await RunningProcess(wrappedCommand, timeout).run();
+    if (output.hasCrashed) {
+      if (await savedDir.exists()) {
+        await savedDir.delete(recursive: true);
+      }
+      await recordingDir.rename(savedDir.path);
+      await io.File(savedDir.path + "/command.txt")
+          .writeAsString(wrappedCommand.reproductionCommand);
+      await io.File(savedDir.path + "/stdout.txt").writeAsBytes(output.stdout);
+      await io.File(savedDir.path + "/stderr.txt").writeAsBytes(output.stderr);
+    } else {
+      await recordingDir.delete(recursive: true);
+    }
+
+    return VMCommandOutput(this, output.exitCode, output.hasTimedOut,
+        output.stdout, output.stderr, output.time, output.pid);
+  }
+
+  String get reproductionCommand =>
+      wrappedCommand.reproductionCommand + " (rr replay " + savedDir.path + ")";
+
+  void _buildHashCode(HashCodeBuilder builder) {
+    originalCommand._buildHashCode(builder);
+    builder.add(42);
+  }
+
+  bool _equal(RRCommand other) =>
+      hashCode == other.hashCode &&
+      originalCommand._equal(other.originalCommand);
+}
+
 abstract class AdbCommand {
   String get buildPath;
   List<String> get extraLibraries;
diff --git a/pkg/test_runner/lib/src/compiler_configuration.dart b/pkg/test_runner/lib/src/compiler_configuration.dart
index 4698cc2..6ea866c 100644
--- a/pkg/test_runner/lib/src/compiler_configuration.dart
+++ b/pkg/test_runner/lib/src/compiler_configuration.dart
@@ -28,8 +28,6 @@
   var experiments = {
     ...configuration.experiments,
     ...testFile.experiments,
-    if (configuration.nnbdMode != NnbdMode.legacy)
-      'non-nullable',
   };
   if (experiments.isEmpty) {
     return const [];
@@ -100,7 +98,6 @@
         return AppJitCompilerConfiguration(configuration);
 
       case Compiler.dartk:
-      case Compiler.dartkb:
         if (configuration.architecture == Architecture.simarm ||
             configuration.architecture == Architecture.simarm64 ||
             configuration.system == System.android) {
@@ -1088,8 +1085,7 @@
 }
 
 abstract class VMKernelCompilerMixin {
-  static final noCausalAsyncStacksRegExp =
-      RegExp('--no[_-]causal[_-]async[_-]stacks');
+  static final causalAsyncStacksRegExp = RegExp('--causal[_-]async[_-]stacks');
 
   TestConfiguration get _configuration;
 
@@ -1120,7 +1116,7 @@
 
     var isProductMode = _configuration.configuration.mode == Mode.product;
 
-    var causalAsyncStacks = !arguments.any(noCausalAsyncStacksRegExp.hasMatch);
+    var causalAsyncStacks = arguments.any(causalAsyncStacksRegExp.hasMatch);
 
     var args = [
       _isAot ? '--aot' : '--no-aot',
@@ -1192,6 +1188,7 @@
 
     var compilerArguments = [
       '--verify',
+      '--verify-skip-platform',
       "-o",
       outputFileName,
       "--platform",
diff --git a/pkg/test_runner/lib/src/configuration.dart b/pkg/test_runner/lib/src/configuration.dart
index c5d61b0..a0bafae 100644
--- a/pkg/test_runner/lib/src/configuration.dart
+++ b/pkg/test_runner/lib/src/configuration.dart
@@ -32,6 +32,7 @@
       this.batch,
       this.batchDart2JS,
       this.copyCoreDumps,
+      this.rr,
       this.isVerbose,
       this.listTests,
       this.listStatusFiles,
@@ -82,6 +83,7 @@
   final bool batch;
   final bool batchDart2JS;
   final bool copyCoreDumps;
+  final bool rr;
   final bool fastTestsOnly;
   final bool isVerbose;
   final bool listTests;
@@ -198,7 +200,6 @@
       Compiler.appJitk,
       Compiler.dartdevk,
       Compiler.dartk,
-      Compiler.dartkb,
       Compiler.dartkp,
       Compiler.fasta,
       Compiler.dart2js,
diff --git a/pkg/test_runner/lib/src/options.dart b/pkg/test_runner/lib/src/options.dart
index e0c78fc..231dd81 100644
--- a/pkg/test_runner/lib/src/options.dart
+++ b/pkg/test_runner/lib/src/options.dart
@@ -106,8 +106,6 @@
 app_jitk:             Compile the Dart code into Kernel and then into an app
                       snapshot.
 dartk:                Compile the Dart code into Kernel before running test.
-dartkb:               Compile the Dart code into Kernel with bytecode before
-                      running test.
 dartkp:               Compile the Dart code into Kernel and then Kernel into
                       AOT snapshot before running the test.
 spec_parser:          Parse Dart code using the specification parser.
@@ -293,6 +291,8 @@
         '''If we see a crash that we did not expect, copy the core dumps to
 "/tmp".''',
         hide: true),
+    _Option.bool('rr', '''Run VM tests under rr and save traces from crashes''',
+        hide: true),
     _Option(
         'local_ip',
         '''IP address the HTTP servers should listen on. This address is also
@@ -385,12 +385,31 @@
   };
 
   /// The set of objects which the named configuration should imply.
-  static final _namedConfigurationOptions = {
+  static const _namedConfigurationOptions = {
     'system',
     'arch',
     'mode',
     'compiler',
     'runtime',
+    'timeout',
+    'nnbd',
+    'sanitizer',
+    'enable_asserts',
+    'use_cfe',
+    'analyzer_use_fasta_parser',
+    'use_elf',
+    'use_sdk',
+    'hot_reload',
+    'hot_reload_rollback',
+    'host_checked',
+    'csp',
+    'minified',
+    'vm_options',
+    'dart2js_options',
+    'experiments',
+    'babel',
+    'builder_tag',
+    'use_qemu'
   };
 
   /// Parses a list of strings as test options.
@@ -555,8 +574,8 @@
       for (var optionName in _namedConfigurationOptions) {
         if (options.containsKey(optionName)) {
           var namedConfig = options['named_configuration'];
-          _fail("The named configuration '$namedConfig' implies "
-              "'$optionName'. Try removing '$optionName'.");
+          _fail("Can't pass '--$optionName' since it is determined by the "
+              "named configuration '$namedConfig'.");
         }
       }
     }
@@ -735,6 +754,7 @@
           batch: !(data["noBatch"] as bool),
           batchDart2JS: data["dart2js_batch"] as bool,
           copyCoreDumps: data["copy_coredumps"] as bool,
+          rr: data["rr"] as bool,
           isVerbose: data["verbose"] as bool,
           listTests: data["list"] as bool,
           listStatusFiles: data["list_status_files"] as bool,
diff --git a/pkg/test_runner/lib/src/process_queue.dart b/pkg/test_runner/lib/src/process_queue.dart
index 6d7a58c..947666f 100644
--- a/pkg/test_runner/lib/src/process_queue.dart
+++ b/pkg/test_runner/lib/src/process_queue.dart
@@ -614,6 +614,8 @@
       return RunningProcess(command, timeout,
               configuration: globalConfiguration)
           .run();
+    } else if (command is RRCommand) {
+      return command.run(timeout);
     } else {
       throw ArgumentError("Unknown command type ${command.runtimeType}.");
     }
diff --git a/pkg/test_runner/lib/src/runtime_configuration.dart b/pkg/test_runner/lib/src/runtime_configuration.dart
index cb2c9c4..1aa0891 100644
--- a/pkg/test_runner/lib/src/runtime_configuration.dart
+++ b/pkg/test_runner/lib/src/runtime_configuration.dart
@@ -251,9 +251,6 @@
         break;
     }
 
-    if (_configuration.compiler == Compiler.dartkb) {
-      multiplier *= 4;
-    }
     if (mode.isDebug) {
       multiplier *= 2;
     }
@@ -263,6 +260,9 @@
     if (_configuration.sanitizer != Sanitizer.none) {
       multiplier *= 2;
     }
+    if (_configuration.rr) {
+      multiplier *= 2;
+    }
     return multiplier;
   }
 }
@@ -297,7 +297,11 @@
       arguments.insertAll(0, config.arguments);
       executable = config.executable;
     }
-    return [VMCommand(executable, arguments, environmentOverrides)];
+    var command = VMCommand(executable, arguments, environmentOverrides);
+    if (_configuration.rr && !isCrashExpected) {
+      return [RRCommand(command)];
+    }
+    return [command];
   }
 }
 
@@ -326,7 +330,11 @@
       executable = config.executable;
     }
 
-    return [VMCommand(executable, arguments, environmentOverrides)];
+    var command = VMCommand(executable, arguments, environmentOverrides);
+    if (_configuration.rr && !isCrashExpected) {
+      return [RRCommand(command)];
+    }
+    return [command];
   }
 }
 
diff --git a/pkg/test_runner/lib/src/test_configurations.dart b/pkg/test_runner/lib/src/test_configurations.dart
index 36024d9..0b3fb76 100644
--- a/pkg/test_runner/lib/src/test_configurations.dart
+++ b/pkg/test_runner/lib/src/test_configurations.dart
@@ -141,8 +141,7 @@
         if (key == 'co19_2' || key == 'co19') {
           testSuites.add(Co19TestSuite(configuration, key));
         } else if ((configuration.compiler == Compiler.none ||
-                configuration.compiler == Compiler.dartk ||
-                configuration.compiler == Compiler.dartkb) &&
+                configuration.compiler == Compiler.dartk) &&
             configuration.runtime == Runtime.vm &&
             key == 'vm') {
           // vm tests contain both cc tests (added here) and dart tests (added
diff --git a/pkg/test_runner/lib/src/test_suite.dart b/pkg/test_runner/lib/src/test_suite.dart
index 400f88b..e788744 100644
--- a/pkg/test_runner/lib/src/test_suite.dart
+++ b/pkg/test_runner/lib/src/test_suite.dart
@@ -600,14 +600,12 @@
     for (var vmOptionsVariant = 0;
         vmOptionsVariant < vmOptionsList.length;
         vmOptionsVariant++) {
-      var vmOptions = vmOptionsList[vmOptionsVariant];
-      var allVmOptions = vmOptions;
-      if (extraVmOptions.isNotEmpty) {
-        allVmOptions = vmOptions.toList()..addAll(extraVmOptions);
-      }
-
+      var vmOptions = [
+        ...vmOptionsList[vmOptionsVariant],
+        ...extraVmOptions,
+      ];
       var isCrashExpected = expectations.contains(Expectation.crash);
-      var commands = _makeCommands(testFile, vmOptionsVariant, allVmOptions,
+      var commands = _makeCommands(testFile, vmOptionsVariant, vmOptions,
           commonArguments, isCrashExpected);
       var variantTestName = testFile.name;
       if (vmOptionsList.length > 1) {
@@ -630,25 +628,22 @@
       for (var vmOptionsVariant = 0;
           vmOptionsVariant < vmOptionsList.length;
           vmOptionsVariant++) {
-        var vmOptions = vmOptionsList[vmOptionsVariant];
-        var allVmOptions = vmOptions;
-        if (extraVmOptions.isNotEmpty) {
-          allVmOptions = vmOptions.toList()..addAll(extraVmOptions);
-        }
-        if (emitDdsTest) {
-          allVmOptions.add('-DUSE_DDS=true');
-        }
+        var vmOptions = [
+          ...vmOptionsList[vmOptionsVariant],
+          ...extraVmOptions,
+          if (emitDdsTest) '-DUSE_DDS=true',
+        ];
         var isCrashExpected = expectations.contains(Expectation.crash);
         var commands = _makeCommands(
             testFile,
             vmOptionsVariant + (vmOptionsList.length * i),
-            allVmOptions,
+            vmOptions,
             commonArguments,
             isCrashExpected);
         var variantTestName =
             testFile.name + '/${emitDdsTest ? 'dds' : 'service'}';
         if (vmOptionsList.length > 1) {
-          variantTestName = "${testFile.name}_$vmOptionsVariant";
+          variantTestName = "${variantTestName}_$vmOptionsVariant";
         }
 
         _addTestCase(testFile, variantTestName, commands, expectations, onTest);
@@ -894,7 +889,6 @@
     const compilers = [
       Compiler.none,
       Compiler.dartk,
-      Compiler.dartkb,
       Compiler.dartkp,
       Compiler.appJitk,
     ];
diff --git a/pkg/test_runner/lib/src/utils.dart b/pkg/test_runner/lib/src/utils.dart
index ba61a15..b1c41171 100644
--- a/pkg/test_runner/lib/src/utils.dart
+++ b/pkg/test_runner/lib/src/utils.dart
@@ -413,7 +413,6 @@
 
   static void deleteTempSnapshotDirectory(TestConfiguration configuration) {
     if (configuration.compiler == Compiler.dartk ||
-        configuration.compiler == Compiler.dartkb ||
         configuration.compiler == Compiler.dartkp) {
       var checked = configuration.isChecked ? '-checked' : '';
       var minified = configuration.isMinified ? '-minified' : '';
diff --git a/pkg/test_runner/test/test_suite_test.dart b/pkg/test_runner/test/test_suite_test.dart
index 30304d1..b9b1bb8 100644
--- a/pkg/test_runner/test/test_suite_test.dart
+++ b/pkg/test_runner/test/test_suite_test.dart
@@ -9,6 +9,8 @@
 
 void main() {
   testNnbdRequirements();
+  testVmOptions();
+  testServiceTestVmOptions();
 }
 
 void testNnbdRequirements() {
@@ -23,31 +25,74 @@
   ];
 
   expectTestCases(
-      [], testFiles, ["language_2/none_test", "language_2/legacy_test"]);
+      [], testFiles, ["language/none_test", "language/legacy_test"]);
 
   expectTestCases(["--nnbd=legacy"], testFiles,
-      ["language_2/none_test", "language_2/legacy_test"]);
+      ["language/none_test", "language/legacy_test"]);
 
   expectTestCases(["--nnbd=weak"], testFiles,
-      ["language_2/none_test", "language_2/nnbd_test", "language_2/weak_test"]);
+      ["language/none_test", "language/nnbd_test", "language/weak_test"]);
+
+  expectTestCases(["--nnbd=strong"], testFiles,
+      ["language/none_test", "language/nnbd_test", "language/strong_test"]);
+}
+
+void testVmOptions() {
+  // Note: The backslashes are to avoid the test_runner thinking these are
+  // Requirements markers for this file itself.
+  var testFiles = [
+    parseTestFile("", path: "vm_no_options_test.dart"),
+    parseTestFile("/\/ VMOptions=--a", path: "vm_one_option_test.dart"),
+    parseTestFile("/\/ VMOptions=--a --b\n/\/ VMOptions=--c",
+        path: "vm_options_test.dart"),
+  ];
 
   expectTestCases(
-      ["--nnbd=strong"],
+      [],
       testFiles,
       [
-        "language_2/none_test",
-        "language_2/nnbd_test",
-        "language_2/strong_test"
+        "language/vm_no_options_test",
+        "language/vm_one_option_test",
+        "language/vm_options_test/0",
+        "language/vm_options_test/1",
       ]);
 }
 
+void testServiceTestVmOptions() {
+  // Note: The backslashes are to avoid the test_runner thinking these are
+  // Requirements markers for this file itself.
+  var testFiles = [
+    parseTestFile("", path: "service_no_options_test.dart", suite: "service"),
+    parseTestFile("/\/ VMOptions=--a",
+        path: "service_one_option_test.dart", suite: "service"),
+    parseTestFile("/\/ VMOptions=--a --b\n/\/ VMOptions=--c",
+        path: "service_options_test.dart", suite: "service"),
+  ];
+
+  expectTestCases(
+      [],
+      testFiles,
+      [
+        "service/service_no_options_test/service",
+        "service/service_no_options_test/dds",
+        "service/service_one_option_test/service",
+        "service/service_one_option_test/dds",
+        "service/service_options_test/service_0",
+        "service/service_options_test/service_1",
+        "service/service_options_test/dds_0",
+        "service/service_options_test/dds_1",
+      ],
+      suite: "service");
+}
+
 void expectTestCases(List<String> options, List<TestFile> testFiles,
-    List<String> expectedCaseNames) {
-  var configuration = makeConfiguration(options);
-  var suite = makeTestSuite(configuration, testFiles);
+    List<String> expectedCaseNames,
+    {String suite = "language"}) {
+  var configuration = makeConfiguration(options, suite);
+  var testSuite = makeTestSuite(configuration, testFiles, suite);
 
   var testCaseNames = <String>[];
-  suite.findTestCases((testCase) {
+  testSuite.findTestCases((testCase) {
     testCaseNames.add(testCase.displayName);
   }, {});
 
diff --git a/pkg/test_runner/test/utils.dart b/pkg/test_runner/test/utils.dart
index 8c1e83a..b88d7ab 100644
--- a/pkg/test_runner/test/utils.dart
+++ b/pkg/test_runner/test/utils.dart
@@ -8,22 +8,23 @@
 import 'package:test_runner/src/test_file.dart';
 import 'package:test_runner/src/test_suite.dart';
 
-final Path _suiteDirectory = Path("language_2");
-
-TestFile parseTestFile(String source, {String path = "some_test.dart"}) {
-  path = _suiteDirectory.absolute.append(path).toNativePath();
-  return TestFile.parse(_suiteDirectory.absolute, path, source);
+TestFile parseTestFile(String source,
+    {String path = "some_test.dart", String suite = "language"}) {
+  final suiteDirectory = Path(suite);
+  path = suiteDirectory.absolute.append(path).toNativePath();
+  return TestFile.parse(suiteDirectory.absolute, path, source);
 }
 
 // TODO(rnystrom): Would be nice if there was a simpler way to create a
 // configuration for use in unit tests.
-TestConfiguration makeConfiguration(List<String> arguments) =>
-    OptionsParser().parse([...arguments, "language_2"]).first;
+TestConfiguration makeConfiguration(List<String> arguments, String suite) {
+  return OptionsParser().parse([...arguments, suite]).first;
+}
 
 /// Creates a [StandardTestSuite] hardcoded to contain [testFiles].
-StandardTestSuite makeTestSuite(
-        TestConfiguration configuration, List<TestFile> testFiles) =>
-    _MockTestSuite(configuration, testFiles);
+StandardTestSuite makeTestSuite(TestConfiguration configuration,
+        List<TestFile> testFiles, String suite) =>
+    _MockTestSuite(configuration, testFiles, suite);
 
 StaticError makeError(
     {int line = 1,
@@ -43,8 +44,8 @@
 class _MockTestSuite extends StandardTestSuite {
   final List<TestFile> _testFiles;
 
-  _MockTestSuite(TestConfiguration configuration, this._testFiles)
-      : super(configuration, "language_2", _suiteDirectory, []);
+  _MockTestSuite(TestConfiguration configuration, this._testFiles, String suite)
+      : super(configuration, suite, Path(suite), []);
 
   @override
   Iterable<TestFile> findTests() => _testFiles;
diff --git a/pkg/test_runner/tool/update_static_error_tests.dart b/pkg/test_runner/tool/update_static_error_tests.dart
index 6b7379a..5364fc2 100644
--- a/pkg/test_runner/tool/update_static_error_tests.dart
+++ b/pkg/test_runner/tool/update_static_error_tests.dart
@@ -303,7 +303,7 @@
 
 /// Find the most recently-built [binary] in any of the build directories.
 String _findBinary(String name, String windowsExtension) {
-  String binary = Platform.isWindows ? "$name.$windowsExtension" : name;
+  var binary = Platform.isWindows ? "$name.$windowsExtension" : name;
 
   String newestPath;
   DateTime newestTime;
diff --git a/pkg/testing/lib/src/chain.dart b/pkg/testing/lib/src/chain.dart
index a6c982d..c6f6c16 100644
--- a/pkg/testing/lib/src/chain.dart
+++ b/pkg/testing/lib/src/chain.dart
@@ -358,16 +358,18 @@
   /// update the test to match new expectations.
   final String autoFixCommand;
 
-  Result(this.output, this.outcome, this.error, this.trace,
-      {this.autoFixCommand});
+  Result(this.output, this.outcome, this.error,
+      {this.trace, this.autoFixCommand});
 
-  Result.pass(O output) : this(output, Expectation.Pass, null, null);
+  Result.pass(O output) : this(output, Expectation.Pass, null);
 
   Result.crash(error, StackTrace trace)
-      : this(null, Expectation.Crash, error, trace);
+      : this(null, Expectation.Crash, error, trace: trace);
 
   Result.fail(O output, [error, StackTrace trace])
-      : this(output, Expectation.Fail, error, trace);
+      : this(output, Expectation.Fail, error, trace: trace);
+
+  bool get isPass => outcome == Expectation.Pass;
 
   String get log => logs.join();
 
@@ -376,7 +378,14 @@
   }
 
   Result<O> copyWithOutcome(Expectation outcome) {
-    return new Result<O>(output, outcome, error, trace)..logs.addAll(logs);
+    return new Result<O>(output, outcome, error, trace: trace)
+      ..logs.addAll(logs);
+  }
+
+  Result<O2> copyWithOutput<O2>(O2 output) {
+    return new Result<O2>(output, outcome, error,
+        trace: trace, autoFixCommand: autoFixCommand)
+      ..logs.addAll(logs);
   }
 }
 
diff --git a/pkg/testing/lib/src/expectation.dart b/pkg/testing/lib/src/expectation.dart
index 8c8e7e9..58efce8 100644
--- a/pkg/testing/lib/src/expectation.dart
+++ b/pkg/testing/lib/src/expectation.dart
@@ -34,6 +34,8 @@
 
   const Expectation(this.name, this.group);
 
+  const Expectation.fail(this.name) : group = ExpectationGroup.Fail;
+
   /// Returns the canonical expectation representing [group]. That is, one of
   /// the above expectations (except for `Meta` which returns `this`).
   Expectation get canonical => fromGroup(group) ?? this;
diff --git a/pkg/testing/lib/src/run.dart b/pkg/testing/lib/src/run.dart
index 49d0b12..1930c45 100644
--- a/pkg/testing/lib/src/run.dart
+++ b/pkg/testing/lib/src/run.dart
@@ -196,6 +196,8 @@
     if (!hasRunnableTests) return null;
 
     return """
+// @dart=2.9
+
 library testing.generated;
 
 import 'dart:async' show Future;
diff --git a/pkg/testing/lib/src/stdio_process.dart b/pkg/testing/lib/src/stdio_process.dart
index 72b534a..16bbfdf 100644
--- a/pkg/testing/lib/src/stdio_process.dart
+++ b/pkg/testing/lib/src/stdio_process.dart
@@ -28,7 +28,7 @@
       return new Result<int>.pass(exitCode);
     } else {
       return new Result<int>(
-          exitCode, ExpectationSet.Default["RuntimeError"], output, null);
+          exitCode, ExpectationSet.Default["RuntimeError"], output);
     }
   }
 
diff --git a/pkg/testing/lib/src/zone_helper.dart b/pkg/testing/lib/src/zone_helper.dart
index e2d106d..d8d7d39 100644
--- a/pkg/testing/lib/src/zone_helper.dart
+++ b/pkg/testing/lib/src/zone_helper.dart
@@ -5,7 +5,7 @@
 /// Helper functions for running code in a Zone.
 library testing.zone_helper;
 
-import 'dart:async' show Completer, Future, ZoneSpecification, runZoned;
+import 'dart:async' show Completer, Future, ZoneSpecification, runZonedGuarded;
 
 import 'dart:io' show exit, stderr;
 
@@ -63,8 +63,11 @@
   Isolate.current.setErrorsFatal(false);
   Isolate.current.addErrorListener(errorPort.sendPort);
   return acknowledgeControlMessages(Isolate.current).then((_) {
-    runZoned(() => new Future(f).then(completer.complete),
-        zoneSpecification: specification, onError: handleUncaughtError);
+    runZonedGuarded(
+      () => new Future(f).then(completer.complete),
+      handleUncaughtError,
+      zoneSpecification: specification,
+    );
 
     return completer.future.whenComplete(() {
       errorPort.close();
diff --git a/pkg/vm/bin/dump_bytecode_ngrams.dart b/pkg/vm/bin/dump_bytecode_ngrams.dart
deleted file mode 100644
index 50ec2a4..0000000
--- a/pkg/vm/bin/dump_bytecode_ngrams.dart
+++ /dev/null
@@ -1,64 +0,0 @@
-// Copyright (c) 2018, 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' as io;
-
-import 'package:args/args.dart' show ArgParser, ArgResults;
-import 'package:vm/bytecode/ngrams.dart';
-
-final ArgParser _argParser = new ArgParser(allowTrailingOptions: true)
-  ..addFlag('basic-blocks',
-      help: 'Only allow control flow as the last instruction in a window',
-      defaultsTo: true)
-  ..addOption('output',
-      abbr: 'o', help: 'Path to output file', defaultsTo: null)
-  ..addFlag('merge-pushes',
-      help: 'Do not distinguish among different kinds of Push opcodes',
-      defaultsTo: false)
-  ..addFlag('sort',
-      abbr: 's', help: 'Sort the output by ngram frequency', defaultsTo: true)
-  ..addOption('threshold',
-      abbr: 't', help: 'Minimum ngram count threshold', defaultsTo: "1")
-  ..addOption('window', abbr: 'w', help: 'Window size', defaultsTo: "3");
-
-final String _usage = '''
-Usage: dump_bytecode_ngrams [options] input.trace
-
-Dumps stats about a dynamic bytecode instruction trace produced with the
-Dart VM option --interpreter-trace-file, e.g.:
-
-\$ dart --enable-interpreter --interpreter-trace-file=trace program.dart
-
-Options:
-${_argParser.usage}
-''';
-
-const int _badUsageExitCode = 1;
-
-void main(List<String> arguments) {
-  final ArgResults options = _argParser.parse(arguments);
-  if ((options.rest.length != 1) || (options['output'] == null)) {
-    print(_usage);
-    io.exit(_badUsageExitCode);
-  }
-
-  final basicBlocks = options['basic-blocks'];
-  final input = options.rest.single;
-  final output = options['output'];
-  final mergePushes = options['merge-pushes'];
-  final windowSize = int.parse(options['window']);
-  final sort = options['sort'];
-  final threshold = int.parse(options['threshold']);
-
-  if (!(new io.File(input).existsSync())) {
-    print("The file '$input' does not exist");
-    print(_usage);
-    io.exit(_badUsageExitCode);
-  }
-
-  NGramReader nGramReader = new NGramReader(input);
-  nGramReader.readAllNGrams(windowSize,
-      basicBlocks: basicBlocks, mergePushes: mergePushes);
-  nGramReader.writeNGramStats(output, sort: sort, minCount: threshold);
-}
diff --git a/pkg/vm/bin/dump_kernel.dart b/pkg/vm/bin/dump_kernel.dart
index 852c073..d41077f 100644
--- a/pkg/vm/bin/dump_kernel.dart
+++ b/pkg/vm/bin/dump_kernel.dart
@@ -8,7 +8,6 @@
 import 'package:kernel/binary/ast_from_binary.dart'
     show BinaryBuilderWithMetadata;
 
-import 'package:vm/metadata/bytecode.dart' show BytecodeMetadataRepository;
 import 'package:vm/metadata/direct_call.dart' show DirectCallMetadataRepository;
 import 'package:vm/metadata/inferred_type.dart'
     show InferredTypeMetadataRepository;
@@ -48,7 +47,6 @@
   component.addMetadataRepository(new TableSelectorMetadataRepository());
   component.addMetadataRepository(new UnboxingInfoMetadataRepository());
   component.addMetadataRepository(new UnreachableNodeMetadataRepository());
-  component.addMetadataRepository(new BytecodeMetadataRepository());
   component.addMetadataRepository(new CallSiteAttributesMetadataRepository());
   component.addMetadataRepository(new LoadingUnitsMetadataRepository());
 
diff --git a/pkg/vm/bin/kernel_service.dart b/pkg/vm/bin/kernel_service.dart
index f0bda92..fb5d3f1 100644
--- a/pkg/vm/bin/kernel_service.dart
+++ b/pkg/vm/bin/kernel_service.dart
@@ -39,15 +39,9 @@
 import 'package:kernel/core_types.dart' show CoreTypes;
 import 'package:kernel/kernel.dart' show Component, Library, Procedure;
 import 'package:kernel/target/targets.dart' show TargetFlags;
-import 'package:vm/bytecode/gen_bytecode.dart'
-    show createFreshComponentWithBytecode, generateBytecode;
-import 'package:vm/bytecode/options.dart' show BytecodeOptions;
 import 'package:vm/incremental_compiler.dart';
 import 'package:vm/kernel_front_end.dart'
-    show
-        autoDetectNullSafetyMode,
-        createLoadedLibrariesSet,
-        runWithFrontEndCompilerContext;
+    show autoDetectNullSafetyMode, createLoadedLibrariesSet;
 import 'package:vm/http_filesystem.dart';
 import 'package:vm/target/vm.dart' show VmTarget;
 import 'package:front_end/src/api_prototype/compiler_options.dart'
@@ -99,7 +93,6 @@
     bool enableAsserts,
     int nullSafety,
     List<String> experimentalFlags,
-    bool bytecode,
     Uri packagesUri,
     List<String> errors) {
   final expFlags = <String>[];
@@ -117,8 +110,7 @@
     ..sdkSummary = platformKernelPath
     ..verbose = verbose
     ..omitPlatform = true
-    ..bytecode = bytecode
-    ..experimentalFlags = parseExperimentalFlags(
+    ..explicitExperimentalFlags = parseExperimentalFlags(
         parseExperimentalArguments(expFlags),
         onError: (msg) => errors.add(msg))
     ..environmentDefines = new EnvironmentMap()
@@ -156,7 +148,6 @@
   final bool enableAsserts;
   final int nullSafety;
   final List<String> experimentalFlags;
-  final bool bytecode;
   final String packageConfig;
 
   // Code coverage and hot reload are only supported by incremental compiler,
@@ -173,7 +164,6 @@
       this.enableAsserts: false,
       this.nullSafety: kNullSafetyOptionUnspecified,
       this.experimentalFlags: null,
-      this.bytecode: false,
       this.supportCodeCoverage: false,
       this.supportHotReload: false,
       this.packageConfig: null}) {
@@ -198,67 +188,20 @@
         enableAsserts,
         nullSafety,
         experimentalFlags,
-        bytecode,
         packagesUri,
         errors);
   }
 
   Future<CompilerResult> compile(Uri script) {
     return runWithPrintToStderr(() async {
-      CompilerResult compilerResult = await compileInternal(script);
-      Component component = compilerResult.component;
+      final CompilerResult compilerResult = await compileInternal(script);
+      final Component component = compilerResult.component;
 
       if (errors.isEmpty) {
-        // Record dependencies only if compilation was error free, and before
-        // createFreshComponentWithBytecode drops the uriToSource table.
+        // Record dependencies only if compilation was error free.
         _recordDependencies(isolateId, component, options.packagesFileUri);
       }
 
-      if (options.bytecode && errors.isEmpty) {
-        final List<Library> libraries = new List<Library>();
-        final Set<Library> loadedLibraries = compilerResult.loadedLibraries;
-        for (Library library in component.libraries) {
-          if (loadedLibraries.contains(library)) continue;
-          libraries.add(library);
-        }
-
-        await runWithFrontEndCompilerContext(script, options, component, () {
-          // TODO(alexmarkov): disable local variables info,
-          //  debugger stops and source files in VM PRODUCT mode.
-          // TODO(rmacnak): disable annotations if mirrors are not enabled.
-          generateBytecode(component,
-              libraries: libraries,
-              coreTypes: compilerResult.coreTypes,
-              hierarchy: compilerResult.classHierarchy,
-              options: new BytecodeOptions(
-                enableAsserts: enableAsserts,
-                environmentDefines: options.environmentDefines,
-                // Needed both for stack traces and the debugger.
-                emitSourcePositions: true,
-                // Only needed when the debugger is available.
-                emitLocalVarInfo: true,
-                // Only needed when the debugger is available.
-                emitDebuggerStops: true,
-                // Only needed when the VM service is available.
-                emitSourceFiles: true,
-                // Only needed when reload is available.
-                emitInstanceFieldInitializers: supportHotReload,
-                // Only needed when mirrors are available.
-                emitAnnotations: true,
-                // Only needed when observatory (source report) is available.
-                keepUnreachableCode: supportCodeCoverage,
-                avoidClosureCallInstructions: supportCodeCoverage,
-              ));
-          Component freshComponent =
-              createFreshComponentWithBytecode(component);
-          compilerResult = new CompilerResult(
-              freshComponent,
-              compilerResult.loadedLibraries,
-              compilerResult.classHierarchy,
-              compilerResult.coreTypes);
-        });
-      }
-
       return compilerResult;
     });
   }
@@ -336,14 +279,12 @@
       bool enableAsserts: false,
       int nullSafety: kNullSafetyOptionUnspecified,
       List<String> experimentalFlags: null,
-      bool bytecode: false,
       String packageConfig: null})
       : super(isolateId, fileSystem, platformKernelPath,
             suppressWarnings: suppressWarnings,
             enableAsserts: enableAsserts,
             nullSafety: nullSafety,
             experimentalFlags: experimentalFlags,
-            bytecode: bytecode,
             supportHotReload: true,
             supportCodeCoverage: true,
             packageConfig: packageConfig);
@@ -356,14 +297,12 @@
       {bool suppressWarnings: false,
       bool enableAsserts: false,
       List<String> experimentalFlags: null,
-      bool bytecode: false,
       String packageConfig: null}) {
     IncrementalCompilerWrapper result = IncrementalCompilerWrapper(
         isolateId, fileSystem, platformKernelPath,
         suppressWarnings: suppressWarnings,
         enableAsserts: enableAsserts,
         experimentalFlags: experimentalFlags,
-        bytecode: bytecode,
         packageConfig: packageConfig);
     result.generator = new IncrementalCompiler.forExpressionCompilationOnly(
         component,
@@ -393,7 +332,6 @@
         enableAsserts: enableAsserts,
         nullSafety: nullSafety,
         experimentalFlags: experimentalFlags,
-        bytecode: bytecode,
         packageConfig: packageConfig);
 
     generator.resetDeltaState();
@@ -424,14 +362,12 @@
       bool enableAsserts: false,
       int nullSafety: kNullSafetyOptionUnspecified,
       List<String> experimentalFlags: null,
-      bool bytecode: false,
       String packageConfig: null})
       : super(isolateId, fileSystem, platformKernelPath,
             suppressWarnings: suppressWarnings,
             enableAsserts: enableAsserts,
             nullSafety: nullSafety,
             experimentalFlags: experimentalFlags,
-            bytecode: bytecode,
             packageConfig: packageConfig);
 
   @override
@@ -466,7 +402,6 @@
     bool enableAsserts: false,
     int nullSafety: kNullSafetyOptionUnspecified,
     List<String> experimentalFlags: null,
-    bool bytecode: false,
     String packageConfig: null,
     String multirootFilepaths,
     String multirootScheme}) async {
@@ -498,7 +433,6 @@
           enableAsserts: enableAsserts,
           nullSafety: nullSafety,
           experimentalFlags: experimentalFlags,
-          bytecode: bytecode,
           packageConfig: packageConfig);
     }
     isolateCompilers[isolateId] = compiler;
@@ -552,7 +486,6 @@
   final bool enableAsserts = request[13];
   final List<String> experimentalFlags =
       request[14] != null ? request[14].cast<String>() : null;
-  final bool bytecode = request[15];
 
   IncrementalCompilerWrapper compiler = isolateCompilers[isolateId];
 
@@ -635,7 +568,6 @@
             suppressWarnings: suppressWarnings,
             enableAsserts: enableAsserts,
             experimentalFlags: experimentalFlags,
-            bytecode: bytecode,
             packageConfig: dotPackagesFile);
         isolateCompilers[isolateId] = compiler;
         await compiler.compile(
@@ -678,19 +610,6 @@
       result = new CompilationResult.errors(compiler.errors, null);
     } else {
       Component component = createExpressionEvaluationComponent(procedure);
-      if (compiler.bytecode) {
-        await runWithFrontEndCompilerContext(
-            compiler.generator.entryPoint, compiler.options, component, () {
-          generateBytecode(component,
-              coreTypes: compiler.generator.getCoreTypes(),
-              hierarchy: compiler.generator.getClassHierarchy(),
-              options: new BytecodeOptions(
-                enableAsserts: compiler.enableAsserts,
-                environmentDefines: compiler.options.environmentDefines,
-              ));
-          component = createFreshComponentWithBytecode(component);
-        });
-      }
       result = new CompilationResult.ok(serializeComponent(component));
     }
   } catch (error, stack) {
@@ -813,11 +732,10 @@
   final bool enableAsserts = request[9];
   final List<String> experimentalFlags =
       request[10] != null ? request[10].cast<String>() : null;
-  final bool bytecode = request[11];
-  final String packageConfig = request[12];
-  final String multirootFilepaths = request[13];
-  final String multirootScheme = request[14];
-  final String workingDirectory = request[15];
+  final String packageConfig = request[11];
+  final String multirootFilepaths = request[12];
+  final String multirootScheme = request[13];
+  final String workingDirectory = request[14];
 
   Uri platformKernelPath = null;
   List<int> platformKernel = null;
@@ -876,7 +794,7 @@
     }
     final List<String> errors = <String>[];
     var options = setupCompilerOptions(fileSystem, platformKernelPath, false,
-        false, nullSafety, experimentalFlags, false, packagesUri, errors);
+        false, nullSafety, experimentalFlags, packagesUri, errors);
 
     // script should only be null for kUpdateSourcesTag.
     assert(script != null);
@@ -900,7 +818,6 @@
         enableAsserts: enableAsserts,
         nullSafety: nullSafety,
         experimentalFlags: experimentalFlags,
-        bytecode: bytecode,
         packageConfig: packageConfig,
         multirootFilepaths: multirootFilepaths,
         multirootScheme: multirootScheme);
@@ -914,7 +831,6 @@
         enableAsserts: enableAsserts,
         nullSafety: nullSafety,
         experimentalFlags: experimentalFlags,
-        bytecode: bytecode,
         packageConfig: packageConfig);
   }
 
@@ -1016,9 +932,9 @@
   return fileSystem;
 }
 
-train(String scriptUri, String platformKernelPath, bool bytecode) async {
+train(String scriptUri, String platformKernelPath) async {
   // Train on program asked to train on.
-  await trainInternal(scriptUri, platformKernelPath, bytecode);
+  await trainInternal(scriptUri, platformKernelPath);
 
   // Also train a few times on a hello-world program to make sure we exercise
   // the startup sequence.
@@ -1032,16 +948,14 @@
           """);
   try {
     for (int i = 0; i < 10; i++) {
-      await trainInternal(
-          helloDart.uri.toString(), platformKernelPath, bytecode);
+      await trainInternal(helloDart.uri.toString(), platformKernelPath);
     }
   } finally {
     tmpDir.deleteSync(recursive: true);
   }
 }
 
-Future trainInternal(
-    String scriptUri, String platformKernelPath, bool bytecode) async {
+Future trainInternal(String scriptUri, String platformKernelPath) async {
   var tag = kTrainTag;
   var responsePort = new RawReceivePort();
   responsePort.handler = (response) {
@@ -1067,7 +981,6 @@
     false /* suppress warnings */,
     false /* enable asserts */,
     null /* experimental_flags */,
-    bytecode,
     null /* package_config */,
     null /* multirootFilepaths */,
     null /* multirootScheme */,
@@ -1081,17 +994,11 @@
     // This entry point is used when creating an app snapshot.
     // It takes the following extra arguments:
     // 1) Script to compile.
-    // 2) Optional '--bytecode' argument to train bytecode generation.
-    // 3) Optional platform kernel path.
+    // 2) Optional platform kernel path.
     int argIndex = 1;
     final String script = args[argIndex++];
-    bool bytecode = false;
-    if ((argIndex < args.length) && (args[argIndex] == '--bytecode')) {
-      bytecode = true;
-      ++argIndex;
-    }
     final String platform = (argIndex < args.length) ? args[argIndex] : null;
-    train(script, platform, bytecode);
+    train(script, platform);
   } else {
     // Entry point for the Kernel isolate.
     return new RawReceivePort()..handler = _processLoadRequest;
diff --git a/pkg/vm/bin/protobuf_aware_treeshaker.dart b/pkg/vm/bin/protobuf_aware_treeshaker.dart
index 143a4c6..d1fa2d1 100644
--- a/pkg/vm/bin/protobuf_aware_treeshaker.dart
+++ b/pkg/vm/bin/protobuf_aware_treeshaker.dart
@@ -52,9 +52,6 @@
         help: 'If set, produces kernel file for AOT compilation (enables '
             'global transformations). Otherwise, writes regular dill.',
         defaultsTo: false)
-    ..addFlag('gen-bytecode',
-        help:
-            'If true, the kernel file will be output in bytecode format. Defaults to true if --aot, false otherwise')
     ..addFlag('write-txt',
         help: 'Also write the result in kernel-text format as <out.dill>.txt',
         defaultsTo: false)
diff --git a/pkg/vm/lib/bytecode/assembler.dart b/pkg/vm/lib/bytecode/assembler.dart
deleted file mode 100644
index be95068..0000000
--- a/pkg/vm/lib/bytecode/assembler.dart
+++ /dev/null
@@ -1,759 +0,0 @@
-// Copyright (c) 2018, 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.
-
-library vm.bytecode.assembler;
-
-import 'package:kernel/ast.dart' show TreeNode;
-import 'package:vm/bytecode/options.dart';
-
-import 'dbc.dart';
-import 'exceptions.dart' show ExceptionsTable;
-import 'local_variable_table.dart' show LocalVariableTable;
-import 'source_positions.dart' show SourcePositions;
-
-import 'dart:typed_data' show Uint8List;
-
-class Label {
-  final bool allowsBackwardJumps;
-  List<int> _jumps = <int>[];
-  int offset = -1;
-
-  Label({this.allowsBackwardJumps: false});
-
-  bool get isBound => offset >= 0;
-
-  int jumpOperand(int jumpOffset) {
-    if (isBound) {
-      if (offset <= jumpOffset && !allowsBackwardJumps) {
-        throw 'Backward jump to this label is not allowed';
-      }
-      // Jump instruction takes a relative offset.
-      return offset - jumpOffset;
-    }
-    _jumps.add(jumpOffset);
-    return 0;
-  }
-
-  List<int> bind(int offset) {
-    assert(!isBound);
-    this.offset = offset;
-    final jumps = _jumps;
-    _jumps = null;
-    return jumps;
-  }
-}
-
-class BytecodeAssembler {
-  static const int kByteMask = 0xFF;
-  static const int kUint32Mask = 0xFFFFFFFF;
-  static const int kMinInt8 = -0x80;
-  static const int kMaxInt8 = 0x7F;
-  static const int kMinInt24 = -0x800000;
-  static const int kMaxInt24 = 0x7FFFFF;
-  static const int kMinInt32 = -0x80000000;
-  static const int kMaxInt32 = 0x7FFFFFFF;
-
-  static const int kInitialCapacity = 32;
-
-  int _length = 0;
-  Uint8List _buffer = new Uint8List(kInitialCapacity);
-
-  final ExceptionsTable exceptionsTable = new ExceptionsTable();
-  final LocalVariableTable localVariableTable = new LocalVariableTable();
-  final SourcePositions sourcePositions = new SourcePositions();
-  final bool _emitSourcePositions;
-  bool isUnreachable = false;
-  int currentSourcePosition = TreeNode.noOffset;
-
-  BytecodeAssembler(BytecodeOptions options)
-      : _emitSourcePositions = options.emitSourcePositions;
-
-  int get offset => _length;
-
-  Uint8List get bytecode => new Uint8List.view(_buffer.buffer, 0, _length);
-
-  void bind(Label label) {
-    final List<int> jumps = label.bind(offset);
-    for (int jumpOffset in jumps) {
-      _patchJump(jumpOffset, label.jumpOperand(jumpOffset));
-    }
-    if (jumps.isNotEmpty || label.allowsBackwardJumps) {
-      isUnreachable = false;
-    }
-  }
-
-  @pragma('vm:prefer-inline')
-  void emitSourcePosition() {
-    if (_emitSourcePositions &&
-        !isUnreachable &&
-        currentSourcePosition != TreeNode.noOffset) {
-      sourcePositions.add(offset, currentSourcePosition);
-    }
-  }
-
-  // TreeNode.noOffset (-1) source position on calls is used to mark synthetic
-  // calls without corresponding source position. Debugger uses the absence of
-  // source position to distinguish these calls and avoid stopping at them
-  // while single stepping.
-  @pragma('vm:prefer-inline')
-  void emitSourcePositionForCall() {
-    if (_emitSourcePositions && !isUnreachable) {
-      sourcePositions.add(
-          offset,
-          currentSourcePosition == TreeNode.noOffset
-              ? SourcePositions.syntheticCodeMarker
-              : currentSourcePosition);
-    }
-  }
-
-  void emitYieldPointSourcePosition(int yieldSourcePosition) {
-    if (!isUnreachable) {
-      sourcePositions.addYieldPoint(offset, yieldSourcePosition);
-    }
-  }
-
-  void _grow() {
-    final newSize = _buffer.length << 1;
-    final newBuffer = new Uint8List(newSize);
-    newBuffer.setRange(0, _buffer.length, _buffer);
-    _buffer = newBuffer;
-  }
-
-  void _growAndEmitBytes(int b0, [int b1, int b2, int b3, int b4, int b5]) {
-    _grow();
-    assert(_length + 6 < _buffer.length);
-    _buffer[_length] = b0;
-    ++_length;
-    if (b1 != null) {
-      _buffer[_length] = b1;
-      ++_length;
-      if (b2 != null) {
-        _buffer[_length] = b2;
-        ++_length;
-        if (b3 != null) {
-          _buffer[_length] = b3;
-          ++_length;
-          if (b4 != null) {
-            _buffer[_length] = b4;
-            ++_length;
-            if (b5 != null) {
-              _buffer[_length] = b5;
-              ++_length;
-            }
-          }
-        }
-      }
-    }
-  }
-
-  @pragma('vm:prefer-inline')
-  void _emitByte(int abyte) {
-    assert(_isUint8(abyte));
-    if (_length < _buffer.length) {
-      _buffer[_length] = abyte;
-      ++_length;
-    } else {
-      _growAndEmitBytes(abyte);
-    }
-  }
-
-  @pragma('vm:prefer-inline')
-  void _emitBytes2(int b0, int b1) {
-    assert(_isUint8(b0) && _isUint8(b1));
-    if (_length + 1 < _buffer.length) {
-      _buffer[_length] = b0;
-      _buffer[_length + 1] = b1;
-      _length += 2;
-    } else {
-      _growAndEmitBytes(b0, b1);
-    }
-  }
-
-  @pragma('vm:prefer-inline')
-  void _emitBytes3(int b0, int b1, int b2) {
-    assert(_isUint8(b0) && _isUint8(b1) && _isUint8(b2));
-    if (_length + 2 < _buffer.length) {
-      _buffer[_length] = b0;
-      _buffer[_length + 1] = b1;
-      _buffer[_length + 2] = b2;
-      _length += 3;
-    } else {
-      _growAndEmitBytes(b0, b1, b2);
-    }
-  }
-
-  @pragma('vm:prefer-inline')
-  void _emitBytes4(int b0, int b1, int b2, int b3) {
-    assert(_isUint8(b0) && _isUint8(b1) && _isUint8(b2) && _isUint8(b3));
-    if (_length + 3 < _buffer.length) {
-      _buffer[_length] = b0;
-      _buffer[_length + 1] = b1;
-      _buffer[_length + 2] = b2;
-      _buffer[_length + 3] = b3;
-      _length += 4;
-    } else {
-      _growAndEmitBytes(b0, b1, b2, b3);
-    }
-  }
-
-  void _emitBytes5(int b0, int b1, int b2, int b3, int b4) {
-    assert(_isUint8(b0) &&
-        _isUint8(b1) &&
-        _isUint8(b2) &&
-        _isUint8(b3) &&
-        _isUint8(b4));
-    if (_length + 4 < _buffer.length) {
-      _buffer[_length] = b0;
-      _buffer[_length + 1] = b1;
-      _buffer[_length + 2] = b2;
-      _buffer[_length + 3] = b3;
-      _buffer[_length + 4] = b4;
-      _length += 5;
-    } else {
-      _growAndEmitBytes(b0, b1, b2, b3, b4);
-    }
-  }
-
-  void _emitBytes6(int b0, int b1, int b2, int b3, int b4, int b5) {
-    assert(_isUint8(b0) &&
-        _isUint8(b1) &&
-        _isUint8(b2) &&
-        _isUint8(b3) &&
-        _isUint8(b4) &&
-        _isUint8(b5));
-    if (_length + 5 < _buffer.length) {
-      _buffer[_length] = b0;
-      _buffer[_length + 1] = b1;
-      _buffer[_length + 2] = b2;
-      _buffer[_length + 3] = b3;
-      _buffer[_length + 4] = b4;
-      _buffer[_length + 5] = b5;
-      _length += 6;
-    } else {
-      _growAndEmitBytes(b0, b1, b2, b3, b4, b5);
-    }
-  }
-
-  int _byteAt(int pos) {
-    return _buffer[pos];
-  }
-
-  void _setByteAt(int pos, int value) {
-    assert(_isUint8(value));
-    _buffer[pos] = value;
-  }
-
-  @pragma('vm:prefer-inline')
-  int _byte0(int v) => v & kByteMask;
-
-  @pragma('vm:prefer-inline')
-  int _byte1(int v) => (v >> 8) & kByteMask;
-
-  @pragma('vm:prefer-inline')
-  int _byte2(int v) => (v >> 16) & kByteMask;
-
-  @pragma('vm:prefer-inline')
-  int _byte3(int v) => (v >> 24) & kByteMask;
-
-  @pragma('vm:prefer-inline')
-  bool _isInt8(int v) => (kMinInt8 <= v) && (v <= kMaxInt8);
-
-  @pragma('vm:prefer-inline')
-  bool _isInt24(int v) => (kMinInt24 <= v) && (v <= kMaxInt24);
-
-  @pragma('vm:prefer-inline')
-  bool _isInt32(int v) => (kMinInt32 <= v) && (v <= kMaxInt32);
-
-  @pragma('vm:prefer-inline')
-  bool _isUint8(int v) => (v & kByteMask) == v;
-
-  @pragma('vm:prefer-inline')
-  bool _isUint32(int v) => (v & kUint32Mask) == v;
-
-  @pragma('vm:prefer-inline')
-  void _emitInstruction0(Opcode opcode) {
-    if (isUnreachable) {
-      return;
-    }
-    _emitByte(opcode.index);
-  }
-
-  @pragma('vm:prefer-inline')
-  void _emitInstructionA(Opcode opcode, int ra) {
-    if (isUnreachable) {
-      return;
-    }
-    _emitBytes2(opcode.index, ra);
-  }
-
-  @pragma('vm:prefer-inline')
-  void _emitInstructionD(Opcode opcode, int rd) {
-    if (isUnreachable) {
-      return;
-    }
-    if (_isUint8(rd)) {
-      _emitBytes2(opcode.index, rd);
-    } else {
-      assert(_isUint32(rd));
-      _emitBytes5(opcode.index + kWideModifier, _byte0(rd), _byte1(rd),
-          _byte2(rd), _byte3(rd));
-    }
-  }
-
-  @pragma('vm:prefer-inline')
-  void _emitInstructionX(Opcode opcode, int rx) {
-    if (isUnreachable) {
-      return;
-    }
-    if (_isInt8(rx)) {
-      _emitBytes2(opcode.index, rx & kByteMask);
-    } else {
-      assert(_isInt32(rx));
-      _emitBytes5(opcode.index + kWideModifier, _byte0(rx), _byte1(rx),
-          _byte2(rx), _byte3(rx));
-    }
-  }
-
-  @pragma('vm:prefer-inline')
-  void _emitInstructionAE(Opcode opcode, int ra, int re) {
-    if (isUnreachable) {
-      return;
-    }
-    if (_isUint8(re)) {
-      _emitBytes3(opcode.index, ra, re);
-    } else {
-      assert(_isUint32(re));
-      _emitBytes6(opcode.index + kWideModifier, ra, _byte0(re), _byte1(re),
-          _byte2(re), _byte3(re));
-    }
-  }
-
-  @pragma('vm:prefer-inline')
-  void _emitInstructionAY(Opcode opcode, int ra, int ry) {
-    if (isUnreachable) {
-      return;
-    }
-    if (_isInt8(ry)) {
-      _emitBytes3(opcode.index, ra, ry & kByteMask);
-    } else {
-      assert(_isInt32(ry));
-      _emitBytes6(opcode.index + kWideModifier, ra, _byte0(ry), _byte1(ry),
-          _byte2(ry), _byte3(ry));
-    }
-  }
-
-  @pragma('vm:prefer-inline')
-  void _emitInstructionDF(Opcode opcode, int rd, int rf) {
-    if (isUnreachable) {
-      return;
-    }
-    if (_isUint8(rd)) {
-      _emitBytes3(opcode.index, rd, rf);
-    } else {
-      assert(_isUint32(rd));
-      _emitBytes6(opcode.index + kWideModifier, _byte0(rd), _byte1(rd),
-          _byte2(rd), _byte3(rd), rf);
-    }
-  }
-
-  @pragma('vm:prefer-inline')
-  void _emitInstructionABC(Opcode opcode, int ra, int rb, int rc) {
-    if (isUnreachable) {
-      return;
-    }
-    _emitBytes4(opcode.index, ra, rb, rc);
-  }
-
-  @pragma('vm:prefer-inline')
-  void emitSpecializedBytecode(Opcode opcode) {
-    assert(BytecodeFormats[opcode].encoding == Encoding.k0);
-    emitSourcePosition();
-    _emitInstruction0(opcode);
-  }
-
-  @pragma('vm:prefer-inline')
-  void _emitJumpInstruction(Opcode opcode, Label label) {
-    assert(isJump(opcode));
-    if (isUnreachable) {
-      return;
-    }
-    final int target = label.jumpOperand(offset);
-    // Use compact representation only for backwards jumps.
-    // TODO(alexmarkov): generate compact forward jumps as well.
-    if (label.isBound && _isInt8(target)) {
-      _emitBytes2(opcode.index, target & kByteMask);
-    } else {
-      assert(_isInt24(target));
-      _emitBytes4(opcode.index + kWideModifier, _byte0(target), _byte1(target),
-          _byte2(target));
-    }
-  }
-
-  void _patchJump(int pos, int rt) {
-    final Opcode opcode = Opcode.values[_byteAt(pos) - kWideModifier];
-    assert(hasWideVariant(opcode));
-    assert(isJump(opcode));
-    assert(_isInt24(rt));
-    _setByteAt(pos + 1, _byte0(rt));
-    _setByteAt(pos + 2, _byte1(rt));
-    _setByteAt(pos + 3, _byte2(rt));
-  }
-
-  void emitTrap() {
-    _emitInstruction0(Opcode.kTrap);
-    isUnreachable = true;
-  }
-
-  @pragma('vm:prefer-inline')
-  void emitDrop1() {
-    _emitInstruction0(Opcode.kDrop1);
-  }
-
-  @pragma('vm:prefer-inline')
-  void emitJump(Label label) {
-    _emitJumpInstruction(Opcode.kJump, label);
-    isUnreachable = true;
-  }
-
-  @pragma('vm:prefer-inline')
-  void emitJumpIfNoAsserts(Label label) {
-    _emitJumpInstruction(Opcode.kJumpIfNoAsserts, label);
-  }
-
-  @pragma('vm:prefer-inline')
-  void emitJumpIfNotZeroTypeArgs(Label label) {
-    _emitJumpInstruction(Opcode.kJumpIfNotZeroTypeArgs, label);
-  }
-
-  @pragma('vm:prefer-inline')
-  void emitJumpIfEqStrict(Label label) {
-    _emitJumpInstruction(Opcode.kJumpIfEqStrict, label);
-  }
-
-  @pragma('vm:prefer-inline')
-  void emitJumpIfNeStrict(Label label) {
-    _emitJumpInstruction(Opcode.kJumpIfNeStrict, label);
-  }
-
-  @pragma('vm:prefer-inline')
-  void emitJumpIfTrue(Label label) {
-    _emitJumpInstruction(Opcode.kJumpIfTrue, label);
-  }
-
-  @pragma('vm:prefer-inline')
-  void emitJumpIfFalse(Label label) {
-    _emitJumpInstruction(Opcode.kJumpIfFalse, label);
-  }
-
-  @pragma('vm:prefer-inline')
-  void emitJumpIfNull(Label label) {
-    _emitJumpInstruction(Opcode.kJumpIfNull, label);
-  }
-
-  @pragma('vm:prefer-inline')
-  void emitJumpIfNotNull(Label label) {
-    _emitJumpInstruction(Opcode.kJumpIfNotNull, label);
-  }
-
-  @pragma('vm:prefer-inline')
-  void emitJumpIfUnchecked(Label label) {
-    _emitJumpInstruction(Opcode.kJumpIfUnchecked, label);
-  }
-
-  @pragma('vm:prefer-inline')
-  void emitReturnTOS() {
-    emitSourcePosition();
-    _emitInstruction0(Opcode.kReturnTOS);
-    isUnreachable = true;
-  }
-
-  @pragma('vm:prefer-inline')
-  void emitPush(int rx) {
-    _emitInstructionX(Opcode.kPush, rx);
-  }
-
-  @pragma('vm:prefer-inline')
-  void emitLoadConstant(int ra, int re) {
-    _emitInstructionAE(Opcode.kLoadConstant, ra, re);
-  }
-
-  @pragma('vm:prefer-inline')
-  void emitPushConstant(int rd) {
-    _emitInstructionD(Opcode.kPushConstant, rd);
-  }
-
-  @pragma('vm:prefer-inline')
-  void emitPushNull() {
-    _emitInstruction0(Opcode.kPushNull);
-  }
-
-  @pragma('vm:prefer-inline')
-  void emitPushTrue() {
-    _emitInstruction0(Opcode.kPushTrue);
-  }
-
-  @pragma('vm:prefer-inline')
-  void emitPushFalse() {
-    _emitInstruction0(Opcode.kPushFalse);
-  }
-
-  @pragma('vm:prefer-inline')
-  void emitPushInt(int rx) {
-    _emitInstructionX(Opcode.kPushInt, rx);
-  }
-
-  @pragma('vm:prefer-inline')
-  void emitStoreLocal(int rx) {
-    _emitInstructionX(Opcode.kStoreLocal, rx);
-  }
-
-  @pragma('vm:prefer-inline')
-  void emitPopLocal(int rx) {
-    _emitInstructionX(Opcode.kPopLocal, rx);
-  }
-
-  @pragma('vm:prefer-inline')
-  void emitDirectCall(int rd, int rf) {
-    emitSourcePositionForCall();
-    _emitInstructionDF(Opcode.kDirectCall, rd, rf);
-  }
-
-  @pragma('vm:prefer-inline')
-  void emitUncheckedDirectCall(int rd, int rf) {
-    emitSourcePositionForCall();
-    _emitInstructionDF(Opcode.kUncheckedDirectCall, rd, rf);
-  }
-
-  @pragma('vm:prefer-inline')
-  void emitInterfaceCall(int rd, int rf) {
-    emitSourcePositionForCall();
-    _emitInstructionDF(Opcode.kInterfaceCall, rd, rf);
-  }
-
-  @pragma('vm:prefer-inline')
-  void emitInstantiatedInterfaceCall(int rd, int rf) {
-    emitSourcePositionForCall();
-    _emitInstructionDF(Opcode.kInstantiatedInterfaceCall, rd, rf);
-  }
-
-  @pragma('vm:prefer-inline')
-  void emitUncheckedClosureCall(int rd, int rf) {
-    emitSourcePositionForCall();
-    _emitInstructionDF(Opcode.kUncheckedClosureCall, rd, rf);
-  }
-
-  @pragma('vm:prefer-inline')
-  void emitUncheckedInterfaceCall(int rd, int rf) {
-    emitSourcePositionForCall();
-    _emitInstructionDF(Opcode.kUncheckedInterfaceCall, rd, rf);
-  }
-
-  @pragma('vm:prefer-inline')
-  void emitDynamicCall(int rd, int rf) {
-    emitSourcePositionForCall();
-    _emitInstructionDF(Opcode.kDynamicCall, rd, rf);
-  }
-
-  @pragma('vm:prefer-inline')
-  void emitNativeCall(int rd) {
-    _emitInstructionD(Opcode.kNativeCall, rd);
-  }
-
-  @pragma('vm:prefer-inline')
-  void emitLoadStatic(int rd) {
-    _emitInstructionD(Opcode.kLoadStatic, rd);
-  }
-
-  @pragma('vm:prefer-inline')
-  void emitStoreStaticTOS(int rd) {
-    emitSourcePosition();
-    _emitInstructionD(Opcode.kStoreStaticTOS, rd);
-  }
-
-  @pragma('vm:prefer-inline')
-  void emitCreateArrayTOS() {
-    _emitInstruction0(Opcode.kCreateArrayTOS);
-  }
-
-  @pragma('vm:prefer-inline')
-  void emitAllocate(int rd) {
-    emitSourcePosition();
-    _emitInstructionD(Opcode.kAllocate, rd);
-  }
-
-  @pragma('vm:prefer-inline')
-  void emitAllocateT() {
-    emitSourcePosition();
-    _emitInstruction0(Opcode.kAllocateT);
-  }
-
-  @pragma('vm:prefer-inline')
-  void emitStoreIndexedTOS() {
-    _emitInstruction0(Opcode.kStoreIndexedTOS);
-  }
-
-  @pragma('vm:prefer-inline')
-  void emitStoreFieldTOS(int rd) {
-    emitSourcePosition();
-    _emitInstructionD(Opcode.kStoreFieldTOS, rd);
-  }
-
-  @pragma('vm:prefer-inline')
-  void emitStoreContextParent() {
-    _emitInstruction0(Opcode.kStoreContextParent);
-  }
-
-  @pragma('vm:prefer-inline')
-  void emitStoreContextVar(int ra, int re) {
-    _emitInstructionAE(Opcode.kStoreContextVar, ra, re);
-  }
-
-  @pragma('vm:prefer-inline')
-  void emitLoadFieldTOS(int rd) {
-    _emitInstructionD(Opcode.kLoadFieldTOS, rd);
-  }
-
-  @pragma('vm:prefer-inline')
-  void emitLoadTypeArgumentsField(int rd) {
-    _emitInstructionD(Opcode.kLoadTypeArgumentsField, rd);
-  }
-
-  @pragma('vm:prefer-inline')
-  void emitLoadContextParent() {
-    _emitInstruction0(Opcode.kLoadContextParent);
-  }
-
-  @pragma('vm:prefer-inline')
-  void emitLoadContextVar(int ra, int re) {
-    _emitInstructionAE(Opcode.kLoadContextVar, ra, re);
-  }
-
-  @pragma('vm:prefer-inline')
-  void emitBooleanNegateTOS() {
-    _emitInstruction0(Opcode.kBooleanNegateTOS);
-  }
-
-  @pragma('vm:prefer-inline')
-  void emitThrow(int ra) {
-    emitSourcePosition();
-    _emitInstructionA(Opcode.kThrow, ra);
-    isUnreachable = true;
-  }
-
-  @pragma('vm:prefer-inline')
-  void emitEntry(int rd) {
-    _emitInstructionD(Opcode.kEntry, rd);
-  }
-
-  @pragma('vm:prefer-inline')
-  void emitFrame(int rd) {
-    _emitInstructionD(Opcode.kFrame, rd);
-  }
-
-  @pragma('vm:prefer-inline')
-  void emitSetFrame(int ra) {
-    _emitInstructionA(Opcode.kSetFrame, ra);
-  }
-
-  @pragma('vm:prefer-inline')
-  void emitAllocateContext(int ra, int re) {
-    _emitInstructionAE(Opcode.kAllocateContext, ra, re);
-  }
-
-  @pragma('vm:prefer-inline')
-  void emitCloneContext(int ra, int re) {
-    _emitInstructionAE(Opcode.kCloneContext, ra, re);
-  }
-
-  @pragma('vm:prefer-inline')
-  void emitMoveSpecial(SpecialIndex ra, int ry) {
-    _emitInstructionAY(Opcode.kMoveSpecial, ra.index, ry);
-  }
-
-  @pragma('vm:prefer-inline')
-  void emitInstantiateType(int rd) {
-    emitSourcePosition();
-    _emitInstructionD(Opcode.kInstantiateType, rd);
-  }
-
-  @pragma('vm:prefer-inline')
-  void emitInstantiateTypeArgumentsTOS(int ra, int re) {
-    emitSourcePosition();
-    _emitInstructionAE(Opcode.kInstantiateTypeArgumentsTOS, ra, re);
-  }
-
-  @pragma('vm:prefer-inline')
-  void emitAssertAssignable(int ra, int re) {
-    emitSourcePosition();
-    _emitInstructionAE(Opcode.kAssertAssignable, ra, re);
-  }
-
-  @pragma('vm:prefer-inline')
-  void emitAssertSubtype() {
-    emitSourcePosition();
-    _emitInstruction0(Opcode.kAssertSubtype);
-  }
-
-  @pragma('vm:prefer-inline')
-  void emitAssertBoolean(int ra) {
-    emitSourcePosition();
-    _emitInstructionA(Opcode.kAssertBoolean, ra);
-  }
-
-  @pragma('vm:prefer-inline')
-  void emitCheckStack(int ra) {
-    emitSourcePosition();
-    _emitInstructionA(Opcode.kCheckStack, ra);
-  }
-
-  @pragma('vm:prefer-inline')
-  void emitDebugCheck() {
-    emitSourcePosition();
-    _emitInstruction0(Opcode.kDebugCheck);
-  }
-
-  @pragma('vm:prefer-inline')
-  void emitCheckFunctionTypeArgs(int ra, int re) {
-    emitSourcePosition();
-    _emitInstructionAE(Opcode.kCheckFunctionTypeArgs, ra, re);
-  }
-
-  @pragma('vm:prefer-inline')
-  void emitEntryFixed(int ra, int re) {
-    _emitInstructionAE(Opcode.kEntryFixed, ra, re);
-  }
-
-  @pragma('vm:prefer-inline')
-  void emitEntryOptional(int ra, int rb, int rc) {
-    _emitInstructionABC(Opcode.kEntryOptional, ra, rb, rc);
-  }
-
-  @pragma('vm:prefer-inline')
-  void emitAllocateClosure(int rd) {
-    emitSourcePosition();
-    _emitInstructionD(Opcode.kAllocateClosure, rd);
-  }
-
-  @pragma('vm:prefer-inline')
-  void emitNullCheck(int rd) {
-    emitSourcePosition();
-    _emitInstructionD(Opcode.kNullCheck, rd);
-  }
-
-  @pragma('vm:prefer-inline')
-  void emitInitLateField(int rd) {
-    emitSourcePosition();
-    _emitInstructionD(Opcode.kInitLateField, rd);
-  }
-
-  @pragma('vm:prefer-inline')
-  void emitPushUninitializedSentinel() {
-    _emitInstruction0(Opcode.kPushUninitializedSentinel);
-  }
-
-  @pragma('vm:prefer-inline')
-  void emitJumpIfInitialized(Label label) {
-    _emitJumpInstruction(Opcode.kJumpIfInitialized, label);
-  }
-}
diff --git a/pkg/vm/lib/bytecode/bytecode_serialization.dart b/pkg/vm/lib/bytecode/bytecode_serialization.dart
deleted file mode 100644
index 671cf16..0000000
--- a/pkg/vm/lib/bytecode/bytecode_serialization.dart
+++ /dev/null
@@ -1,690 +0,0 @@
-// Copyright (c) 2018, 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.
-
-library vm.bytecode.bytecode_serialization;
-
-import 'package:kernel/ast.dart' show BinarySink;
-import 'dart:typed_data' show ByteData, Endian, Uint8List, Uint16List;
-
-abstract class StringWriter {
-  int put(String string);
-}
-
-abstract class StringReader {
-  String get(int ref);
-}
-
-abstract class BytecodeObject {}
-
-abstract class ObjectWriter {
-  void writeObject(BytecodeObject object, BufferedWriter writer);
-}
-
-abstract class ObjectReader {
-  BytecodeObject readObject(BufferedReader reader);
-}
-
-class BufferedWriter {
-  /// Initial size of the buffer in BufferedWriter.
-  static const int initialSize = 1024;
-
-  /// Lists less than this size are copied into the buffer.
-  /// Larger lists are appended without copying.
-  static const int avoidCopyingSize = 1024;
-
-  /// Keep buffers with this remaining bytes or more, instead of
-  /// creating a new buffer.
-  static const int minRemainderToKeep = 256;
-
-  final int formatVersion;
-  final StringWriter stringWriter;
-  final ObjectWriter objectWriter;
-  final LinkWriter linkWriter;
-
-  // Prefix of the data stored in this writer.
-  // List of pairs Uint8List buffer, int length.
-  List<dynamic> _buffers;
-  // Total length of data in [_buffers].
-  int _buffersLength = 0;
-
-  Uint8List _currentBuffer = new Uint8List(initialSize);
-  int _currentLength = 0;
-  int _nextBufferSize = initialSize << 1;
-
-  BufferedWriter(this.formatVersion, this.stringWriter, this.objectWriter,
-      this.linkWriter);
-
-  factory BufferedWriter.fromWriter(BufferedWriter writer) =>
-      new BufferedWriter(writer.formatVersion, writer.stringWriter,
-          writer.objectWriter, writer.linkWriter);
-
-  Uint8List getContents() {
-    if (_buffers == null) {
-      return new Uint8List.view(
-          _currentBuffer.buffer, _currentBuffer.offsetInBytes, _currentLength);
-    }
-    final Uint8List result = new Uint8List(_buffersLength + _currentLength);
-    int position = 0;
-    for (int i = 0; i < _buffers.length; i += 2) {
-      final Uint8List buf = _buffers[i];
-      final int len = _buffers[i + 1];
-      result.setRange(position, position + len, buf);
-      position += len;
-    }
-    assert(position == _buffersLength);
-    result.setRange(position, position + _currentLength, _currentBuffer);
-    return result;
-  }
-
-  void writeContentsToBinarySink(BinarySink sink) {
-    if (_buffers != null) {
-      for (int i = 0; i < _buffers.length; i += 2) {
-        Uint8List buf = _buffers[i];
-        final int len = _buffers[i + 1];
-        if (len != buf.length) {
-          buf = new Uint8List.view(buf.buffer, buf.offsetInBytes, len);
-        }
-        sink.writeBytes(buf);
-      }
-    }
-    Uint8List buf = _currentBuffer;
-    if (_currentLength != buf.length) {
-      buf = new Uint8List.view(buf.buffer, buf.offsetInBytes, _currentLength);
-    }
-    sink.writeBytes(buf);
-  }
-
-  int get offset => _buffersLength + _currentLength;
-
-  @pragma('vm:prefer-inline')
-  void _addByte(int value) {
-    assert((value >> 8) == 0);
-    _currentBuffer[_currentLength] = value;
-    ++_currentLength;
-  }
-
-  void _flushBuffer(Uint8List buf, int len) {
-    _buffers ??= <dynamic>[];
-    _buffers.add(buf);
-    _buffers.add(len);
-    _buffersLength += len;
-  }
-
-  void _flushCurrentBuffer() {
-    _flushBuffer(_currentBuffer, _currentLength);
-    _currentBuffer = null;
-    _currentLength = 0;
-  }
-
-  @pragma('vm:never-inline')
-  void _grow() {
-    _flushCurrentBuffer();
-    // Callers of _grow() expect up to avoidCopyingSize bytes to be available.
-    assert(_nextBufferSize >= avoidCopyingSize);
-    _currentBuffer = new Uint8List(_nextBufferSize);
-    _nextBufferSize = _nextBufferSize << 1;
-  }
-
-  @pragma('vm:prefer-inline')
-  void writeByte(int value) {
-    if (_currentLength == _currentBuffer.length) {
-      _grow();
-    }
-    _addByte(value);
-  }
-
-  void appendUint8List(Uint8List src) {
-    if (src.length < avoidCopyingSize) {
-      if (_currentLength > _currentBuffer.length - src.length) {
-        _grow();
-      }
-      _currentBuffer.setRange(_currentLength, _currentLength + src.length, src);
-      _currentLength += src.length;
-    } else {
-      final int remainingBytes = _currentBuffer.length - _currentLength;
-      if (remainingBytes >= minRemainderToKeep) {
-        final Uint8List remainder = new Uint8List.view(_currentBuffer.buffer,
-            _currentBuffer.offsetInBytes + _currentLength, remainingBytes);
-        _flushCurrentBuffer();
-        _flushBuffer(src, src.length);
-        _currentBuffer = remainder;
-        _currentLength = 0;
-      } else {
-        _flushCurrentBuffer();
-        _currentBuffer = src;
-        _currentLength = src.length;
-      }
-    }
-  }
-
-  void appendWriter(BufferedWriter other) {
-    final int remainingBytes = _currentBuffer.length - _currentLength;
-    Uint8List remainder;
-    if (remainingBytes >= minRemainderToKeep &&
-        remainingBytes > (other._currentBuffer.length - other._currentLength)) {
-      remainder = new Uint8List.view(_currentBuffer.buffer,
-          _currentBuffer.offsetInBytes + _currentLength, remainingBytes);
-    }
-    _flushCurrentBuffer();
-    if (other._buffers != null) {
-      _buffers.addAll(other._buffers);
-      _buffersLength += other._buffersLength;
-    }
-    if (remainder != null) {
-      _flushBuffer(other._currentBuffer, other._currentLength);
-      _currentBuffer = remainder;
-      _currentLength = 0;
-    } else {
-      _currentBuffer = other._currentBuffer;
-      _currentLength = other._currentLength;
-    }
-    // Reset [other] to make sure it is no longer used.
-    other._buffers = null;
-    other._buffersLength = 0;
-    other._currentBuffer = null;
-    other._currentLength = 0;
-  }
-
-  @pragma('vm:prefer-inline')
-  void writeUInt32(int value) {
-    if ((value >> 32) != 0) {
-      throw 'Unable to write $value as 32-bit unsigned integer';
-    }
-    if (_currentLength > _currentBuffer.length - 4) {
-      _grow();
-    }
-    // TODO(alexmarkov): consider using native byte order
-    _addByte((value >> 24) & 0xFF);
-    _addByte((value >> 16) & 0xFF);
-    _addByte((value >> 8) & 0xFF);
-    _addByte(value & 0xFF);
-  }
-
-  @pragma('vm:prefer-inline')
-  void writePackedUInt30(int value) {
-    if ((value >> 30) != 0) {
-      throw 'Unable to write $value as 30-bit unsigned integer';
-    }
-    if (value < 0x80) {
-      writeByte(value);
-    } else if (value < 0x4000) {
-      if (_currentLength > _currentBuffer.length - 2) {
-        _grow();
-      }
-      _addByte((value >> 8) | 0x80);
-      _addByte(value & 0xFF);
-    } else {
-      if (_currentLength > _currentBuffer.length - 4) {
-        _grow();
-      }
-      _addByte((value >> 24) | 0xC0);
-      _addByte((value >> 16) & 0xFF);
-      _addByte((value >> 8) & 0xFF);
-      _addByte(value & 0xFF);
-    }
-  }
-
-  @pragma('vm:prefer-inline')
-  void writeSLEB128(int value) {
-    bool last = false;
-    do {
-      int part = value & 0x7f;
-      value >>= 7;
-      if ((value == 0 && (part & 0x40) == 0) ||
-          (value == -1 && (part & 0x40) != 0)) {
-        last = true;
-      } else {
-        part |= 0x80;
-      }
-      writeByte(part);
-    } while (!last);
-  }
-
-  @pragma('vm:prefer-inline')
-  void writePackedStringReference(String value) {
-    writePackedUInt30(stringWriter.put(value));
-  }
-
-  @pragma('vm:prefer-inline')
-  void writePackedObject(BytecodeObject object) {
-    objectWriter.writeObject(object, this);
-  }
-
-  @pragma('vm:prefer-inline')
-  void writePackedList(List<BytecodeObject> objects) {
-    writePackedUInt30(objects.length);
-    for (var obj in objects) {
-      writePackedObject(obj);
-    }
-  }
-
-  @pragma('vm:prefer-inline')
-  void writeLinkOffset(Object target) {
-    final offset = linkWriter.getOffset(target);
-    writePackedUInt30(offset);
-  }
-}
-
-class BufferedReader {
-  int formatVersion;
-  StringReader stringReader;
-  ObjectReader objectReader;
-  LinkReader linkReader;
-  final List<int> bytes;
-  final int baseOffset;
-
-  /// Position within [bytes], already includes [baseOffset].
-  int _pos;
-
-  BufferedReader(this.formatVersion, this.stringReader, this.objectReader,
-      this.linkReader, this.bytes,
-      {this.baseOffset: 0})
-      : _pos = baseOffset {
-    assert((0 <= _pos) && (_pos <= bytes.length));
-  }
-
-  int get offset => _pos - baseOffset;
-
-  set offset(int offs) {
-    _pos = baseOffset + offs;
-    assert((0 <= _pos) && (_pos <= bytes.length));
-  }
-
-  int readByte() => bytes[_pos++];
-
-  int readUInt32() {
-    return (readByte() << 24) |
-        (readByte() << 16) |
-        (readByte() << 8) |
-        readByte();
-  }
-
-  int readPackedUInt30() {
-    var byte = readByte();
-    if (byte & 0x80 == 0) {
-      // 0xxxxxxx
-      return byte;
-    } else if (byte & 0x40 == 0) {
-      // 10xxxxxx
-      return ((byte & 0x3F) << 8) | readByte();
-    } else {
-      // 11xxxxxx
-      return ((byte & 0x3F) << 24) |
-          (readByte() << 16) |
-          (readByte() << 8) |
-          readByte();
-    }
-  }
-
-  int readSLEB128() {
-    int value = 0;
-    int shift = 0;
-    int part = 0;
-    do {
-      part = readByte();
-      value |= (part & 0x7f) << shift;
-      shift += 7;
-    } while ((part & 0x80) != 0);
-    const int kBitsPerInt = 64;
-    if ((shift < kBitsPerInt) && ((part & 0x40) != 0)) {
-      value |= (-1) << shift;
-    }
-    return value;
-  }
-
-  String readPackedStringReference() {
-    return stringReader.get(readPackedUInt30());
-  }
-
-  BytecodeObject readPackedObject() {
-    return objectReader.readObject(this);
-  }
-
-  List<T> readPackedList<T extends BytecodeObject>() {
-    final int len = readPackedUInt30();
-    final list = new List<T>(len);
-    for (int i = 0; i < len; ++i) {
-      list[i] = readPackedObject();
-    }
-    return list;
-  }
-
-  Uint8List readBytesAsUint8List(int count) {
-    final Uint8List result = new Uint8List(count);
-    result.setRange(0, result.length, bytes, _pos);
-    _pos += count;
-    return result;
-  }
-
-  Uint16List readBytesAsUint16List(int count) {
-    final Uint16List result = new Uint16List(count);
-    int pos = _pos;
-    for (int i = 0; i < count; ++i) {
-      result[i] = bytes[pos] | (bytes[pos + 1] << 8);
-      pos += 2;
-    }
-    _pos += count << 1;
-    return result;
-  }
-
-  T readLinkOffset<T extends BytecodeDeclaration>() {
-    final offset = readPackedUInt30();
-    return linkReader.get<T>(offset);
-  }
-
-  ForwardReference<T>
-      readLinkOffsetAsForwardReference<T extends BytecodeDeclaration>() {
-    final offset = readPackedUInt30();
-    return new ForwardReference<T>(offset, linkReader);
-  }
-
-  void align(int alignment) {
-    assert(alignment & (alignment - 1) == 0);
-    _pos = ((_pos + alignment - 1) & -alignment);
-  }
-}
-
-class StringTable implements StringWriter, StringReader {
-  // Bit 0 in string reference is set for two-byte strings.
-  static const int flagTwoByteString = 1;
-
-  Map<String, int> _map = <String, int>{};
-  List<String> _oneByteStrings = <String>[];
-  List<String> _twoByteStrings = <String>[];
-  bool _written = false;
-
-  StringTable();
-
-  @override
-  int put(String string) {
-    int ref = _map[string];
-    if (ref == null) {
-      if (_written) {
-        throw 'Unable to add a string to string table after it was written';
-      }
-      if (isOneByteString(string)) {
-        ref = (_oneByteStrings.length << 1);
-        _oneByteStrings.add(string);
-      } else {
-        ref = (_twoByteStrings.length << 1) | flagTwoByteString;
-        _twoByteStrings.add(string);
-      }
-      _map[string] = ref;
-    }
-    return ref;
-  }
-
-  @override
-  String get(int ref) {
-    if ((ref & flagTwoByteString) == 0) {
-      return _oneByteStrings[ref >> 1];
-    } else {
-      return _twoByteStrings[ref >> 1];
-    }
-  }
-
-  bool isOneByteString(String value) {
-    const int maxLatin1 = 0xff;
-    for (int i = 0; i < value.length; ++i) {
-      if (value.codeUnitAt(i) > maxLatin1) {
-        return false;
-      }
-    }
-    return true;
-  }
-
-  void write(BufferedWriter writer) {
-    final start = writer.offset;
-    writer.writeUInt32(_oneByteStrings.length);
-    writer.writeUInt32(_twoByteStrings.length);
-    int endOffset = 0;
-    for (var str in _oneByteStrings) {
-      endOffset += str.length;
-      writer.writeUInt32(endOffset);
-    }
-    for (var str in _twoByteStrings) {
-      endOffset += str.length << 1;
-      writer.writeUInt32(endOffset);
-    }
-    for (var str in _oneByteStrings) {
-      for (int i = 0; i < str.length; ++i) {
-        writer.writeByte(str.codeUnitAt(i));
-      }
-    }
-    for (var str in _twoByteStrings) {
-      for (int i = 0; i < str.length; ++i) {
-        int utf16codeUnit = str.codeUnitAt(i);
-        writer.writeByte(utf16codeUnit & 0xFF);
-        writer.writeByte(utf16codeUnit >> 8);
-      }
-    }
-    _written = true;
-    BytecodeSizeStatistics.stringTableSize += (writer.offset - start);
-  }
-
-  StringTable.read(BufferedReader reader) {
-    final int numOneByteStrings = reader.readUInt32();
-    final int numTwoByteStrings = reader.readUInt32();
-    final List<int> oneByteEndOffsets = new List<int>(numOneByteStrings);
-    for (int i = 0; i < oneByteEndOffsets.length; ++i) {
-      oneByteEndOffsets[i] = reader.readUInt32();
-    }
-    List<int> twoByteEndOffsets = new List<int>(numTwoByteStrings);
-    for (int i = 0; i < twoByteEndOffsets.length; ++i) {
-      twoByteEndOffsets[i] = reader.readUInt32();
-    }
-    int start = 0;
-    if (numOneByteStrings > 0) {
-      _oneByteStrings = new List<String>(numOneByteStrings);
-      final charCodes = reader.readBytesAsUint8List(oneByteEndOffsets.last);
-      for (int i = 0; i < _oneByteStrings.length; ++i) {
-        final end = oneByteEndOffsets[i];
-        final str = new String.fromCharCodes(charCodes, start, end);
-        _oneByteStrings[i] = str;
-        _map[str] = i << 1;
-        start = end;
-      }
-    }
-    final int twoByteBaseOffset = start;
-    if (numTwoByteStrings > 0) {
-      int start = 0;
-      _twoByteStrings = new List<String>(numTwoByteStrings);
-      final charCodes = reader.readBytesAsUint16List(
-          (twoByteEndOffsets.last - twoByteBaseOffset) >> 1);
-      for (int i = 0; i < _twoByteStrings.length; ++i) {
-        final end = (twoByteEndOffsets[i] - twoByteBaseOffset) >> 1;
-        final str = new String.fromCharCodes(charCodes, start, end);
-        _twoByteStrings[i] = str;
-        _map[str] = (i << 1) | flagTwoByteString;
-        start = end;
-      }
-    }
-  }
-
-  @override
-  String toString() {
-    StringBuffer sb = new StringBuffer();
-    sb.writeln('StringTable {');
-    sb.writeln('  // One Byte Strings');
-    for (String str in _oneByteStrings) {
-      sb.writeln('  "$str"');
-    }
-    sb.writeln('  // Two Byte Strings');
-    for (String str in _twoByteStrings) {
-      sb.writeln('  "$str"');
-    }
-    sb.writeln('}');
-    return sb.toString();
-  }
-}
-
-int doubleToIntBits(double value) {
-  final buf = new ByteData(8);
-  buf.setFloat64(0, value, Endian.little);
-  return buf.getInt64(0, Endian.little);
-}
-
-double intBitsToDouble(int bits) {
-  final buf = new ByteData(8);
-  buf.setInt64(0, bits, Endian.little);
-  return buf.getFloat64(0, Endian.little);
-}
-
-class PackedUInt30DeltaEncoder {
-  int _last = 0;
-
-  void write(BufferedWriter write, int value) {
-    write.writePackedUInt30(value - _last);
-    _last = value;
-  }
-}
-
-class PackedUInt30DeltaDecoder {
-  int _last = 0;
-
-  int read(BufferedReader reader) {
-    int value = reader.readPackedUInt30() + _last;
-    _last = value;
-    return value;
-  }
-}
-
-class SLEB128DeltaEncoder {
-  int _last = 0;
-
-  void write(BufferedWriter writer, int value) {
-    writer.writeSLEB128(value - _last);
-    _last = value;
-  }
-}
-
-class SLEB128DeltaDecoder {
-  int _last = 0;
-
-  int read(BufferedReader reader) {
-    int value = reader.readSLEB128() + _last;
-    _last = value;
-    return value;
-  }
-}
-
-class BytecodeDeclaration {
-  int _offset;
-}
-
-class LinkWriter {
-  void put(BytecodeDeclaration target, int offset) {
-    target._offset = offset;
-  }
-
-  int getOffset(BytecodeDeclaration target) {
-    return target._offset ??
-        (throw 'Offset of ${target.runtimeType} $target is not set');
-  }
-}
-
-class LinkReader {
-  final _map = <Type, Map<int, BytecodeDeclaration>>{};
-
-  void setOffset<T extends BytecodeDeclaration>(T target, int offset) {
-    final offsetToObject = (_map[T] ??= <int, BytecodeDeclaration>{});
-    final previous = offsetToObject[offset];
-    if (previous != null) {
-      throw 'Unable to associate offset $T/$offset with ${target.runtimeType} $target.'
-          ' It is already associated with ${previous.runtimeType} $previous';
-    }
-    offsetToObject[offset] = target;
-  }
-
-  T get<T extends BytecodeDeclaration>(int offset) {
-    return _map[T][offset] ?? (throw 'No object at offset $T/$offset');
-  }
-}
-
-// Placeholder for an object which will be read in future.
-class ForwardReference<T extends BytecodeDeclaration> {
-  final int offset;
-  final LinkReader linkReader;
-
-  ForwardReference(this.offset, this.linkReader);
-
-  T get() => linkReader.get<T>(offset);
-}
-
-class NamedEntryStatistics {
-  final String name;
-  int size = 0;
-  int count = 0;
-
-  NamedEntryStatistics(this.name);
-
-  String toString() => "${name.padRight(40)}:    ${size.toString().padLeft(10)}"
-      "  (count: ${count.toString().padLeft(8)})";
-}
-
-class BytecodeSizeStatistics {
-  static int componentSize = 0;
-  static int objectTableSize = 0;
-  static int objectTableEntriesCount = 0;
-  static int stringTableSize = 0;
-  static int librariesSize = 0;
-  static int classesSize = 0;
-  static int membersSize = 0;
-  static int codeSize = 0;
-  static int sourcePositionsSize = 0;
-  static int sourceFilesSize = 0;
-  static int lineStartsSize = 0;
-  static int localVariablesSize = 0;
-  static int annotationsSize = 0;
-  static int constantPoolSize = 0;
-  static int instructionsSize = 0;
-  static List<NamedEntryStatistics> constantPoolStats =
-      <NamedEntryStatistics>[];
-  static List<NamedEntryStatistics> objectTableStats = <NamedEntryStatistics>[];
-
-  static void reset() {
-    componentSize = 0;
-    objectTableSize = 0;
-    objectTableEntriesCount = 0;
-    stringTableSize = 0;
-    librariesSize = 0;
-    classesSize = 0;
-    membersSize = 0;
-    codeSize = 0;
-    sourcePositionsSize = 0;
-    sourceFilesSize = 0;
-    lineStartsSize = 0;
-    localVariablesSize = 0;
-    annotationsSize = 0;
-    constantPoolSize = 0;
-    instructionsSize = 0;
-    constantPoolStats = <NamedEntryStatistics>[];
-    objectTableStats = <NamedEntryStatistics>[];
-  }
-
-  static void dump() {
-    print("Bytecode size statistics:");
-    print("  Bytecode component:  $componentSize");
-    print(
-        "   - object table:     $objectTableSize   (count: $objectTableEntriesCount)");
-    for (var entry in objectTableStats) {
-      print("       - $entry");
-    }
-    print("   - string table:     $stringTableSize");
-    print("  Libraries:           $librariesSize");
-    print("  Classes:             $classesSize");
-    print("  Members:             $membersSize");
-    print("  Source positions:    $sourcePositionsSize");
-    print("  Source files:        $sourceFilesSize");
-    print("  Line starts:         $lineStartsSize");
-    print("  Local variables:     $localVariablesSize");
-    print("  Annotations:         $annotationsSize");
-    print("  Code:                $codeSize");
-    print("   - constant pool:    $constantPoolSize");
-    for (var entry in constantPoolStats) {
-      print("       - $entry");
-    }
-    print("   - instructions:     $instructionsSize");
-  }
-}
diff --git a/pkg/vm/lib/bytecode/constant_pool.dart b/pkg/vm/lib/bytecode/constant_pool.dart
deleted file mode 100644
index ee869ec..0000000
--- a/pkg/vm/lib/bytecode/constant_pool.dart
+++ /dev/null
@@ -1,911 +0,0 @@
-// Copyright (c) 2018, 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.
-
-library vm.bytecode.constant_pool;
-
-import 'package:kernel/ast.dart' hide MapEntry;
-
-import 'dbc.dart' show constantPoolIndexLimit, BytecodeLimitExceededException;
-import 'bytecode_serialization.dart'
-    show
-        BufferedWriter,
-        BufferedReader,
-        BytecodeSizeStatistics,
-        NamedEntryStatistics,
-        StringTable;
-import 'object_table.dart' show ObjectHandle, ObjectTable;
-
-/*
-
-In kernel binary, constant pool is encoded in the following way
-(using notation from pkg/kernel/binary.md):
-
-type ConstantPool {
-  List<ConstantPoolEntry>
-}
-
-type ConstantIndex = UInt;
-
-abstract type ConstantPoolEntry {
-  Byte tag;
-}
-
-type ConstantStaticField extends ConstantPoolEntry {
-  Byte tag = 9;
-  PackedObject field;
-}
-
-// Occupies 2 entries in the constant pool.
-type ConstantInstanceField extends ConstantPoolEntry {
-  Byte tag = 10;
-  PackedObject field;
-}
-
-type ConstantClass extends ConstantPoolEntry {
-  Byte tag = 11;
-  PackedObject class;
-}
-
-type ConstantTypeArgumentsField extends ConstantPoolEntry {
-  Byte tag = 12;
-  PackedObject class;
-}
-
-type ConstantType extends ConstantPoolEntry {
-  Byte tag = 14;
-  PackedObject type;
-}
-
-type ConstantClosureFunction extends ConstantPoolEntry {
-  Byte tag = 19;
-  UInt closureIndex;
-}
-
-type ConstantEndClosureFunctionScope extends ConstantPoolEntry {
-  Byte tag = 20;
-}
-
-type ConstantNativeEntry extends ConstantPoolEntry {
-  Byte tag = 21;
-  PackedString nativeName;
-}
-
-type ConstantSubtypeTestCache extends ConstantPoolEntry {
-  Byte tag = 22;
-}
-
-type ConstantEmptyTypeArguments extends ConstantPoolEntry {
-  Byte tag = 24;
-}
-
-type ConstantObjectRef extends ConstantPoolEntry {
-  Byte tag = 27;
-  PackedObject object;
-}
-
-// Occupies 2 entries in the constant pool.
-type ConstantDirectCall extends ConstantPoolEntry {
-  Byte tag = 28;
-  PackedObject target;
-  PackedObject argDesc;
-}
-
-// Occupies 2 entries in the constant pool.
-type ConstantInterfaceCall extends ConstantPoolEntry {
-  Byte tag = 29;
-  PackedObject target;
-  PackedObject argDesc;
-}
-
-// Occupies 3 entries in the constant pool.
-type ConstantInstantiatedInterfaceCall extends ConstantPoolEntry {
-  Byte tag = 30;
-  PackedObject target;
-  PackedObject argDesc;
-  PackedObject staticReceiverType;
-}
-
-// Occupies 2 entries in the constant pool
-type ConstantDynamicCall extends ConstantPoolEntry {
-  Byte tag = 31;
-  PackedObject selectorName;
-  PackedObject argDesc;
-}
-
-// Occupies 2 entries in the constant pool.
-type ConstantDirectCallViaDynamicForwarder extends ConstantPoolEntry {
-  Byte tag = 32;
-  PackedObject target;
-  PackedObject argDesc;
-}
-
-*/
-
-enum ConstantTag {
-  kInvalid,
-  kUnused1,
-  kUnused2,
-  kUnused3,
-  kUnused4,
-  kUnused5,
-  kUnused6,
-  kUnused6a,
-  kUnused7,
-  kStaticField,
-  kInstanceField,
-  kClass,
-  kTypeArgumentsField,
-  kUnused8,
-  kType,
-  kUnused9,
-  kUnused10,
-  kUnused11,
-  kUnused12,
-  kClosureFunction,
-  kEndClosureFunctionScope,
-  kNativeEntry,
-  kSubtypeTestCache,
-  kUnused13,
-  kEmptyTypeArguments,
-  kUnused14,
-  kUnused15,
-  kObjectRef,
-  kDirectCall,
-  kInterfaceCall,
-  kInstantiatedInterfaceCall,
-  kDynamicCall,
-  kDirectCallViaDynamicForwarder,
-}
-
-String constantTagToString(ConstantTag tag) =>
-    tag.toString().substring('ConstantTag.k'.length);
-
-abstract class ConstantPoolEntry {
-  const ConstantPoolEntry();
-
-  ConstantTag get tag;
-
-  // Returns number of extra reserved constant pool entries
-  // following this entry.
-  int get numReservedEntries => 0;
-
-  void write(BufferedWriter writer) {
-    writer.writeByte(tag.index);
-    writeValue(writer);
-  }
-
-  void writeValue(BufferedWriter writer);
-
-  factory ConstantPoolEntry.read(BufferedReader reader) {
-    ConstantTag tag = ConstantTag.values[reader.readByte()];
-    switch (tag) {
-      case ConstantTag.kInvalid:
-        break;
-      case ConstantTag.kStaticField:
-        return new ConstantStaticField.read(reader);
-      case ConstantTag.kInstanceField:
-        return new ConstantInstanceField.read(reader);
-      case ConstantTag.kClass:
-        return new ConstantClass.read(reader);
-      case ConstantTag.kTypeArgumentsField:
-        return new ConstantTypeArgumentsField.read(reader);
-      case ConstantTag.kType:
-        return new ConstantType.read(reader);
-      case ConstantTag.kClosureFunction:
-        return new ConstantClosureFunction.read(reader);
-      case ConstantTag.kEndClosureFunctionScope:
-        return new ConstantEndClosureFunctionScope.read(reader);
-      case ConstantTag.kNativeEntry:
-        return new ConstantNativeEntry.read(reader);
-      case ConstantTag.kSubtypeTestCache:
-        return new ConstantSubtypeTestCache.read(reader);
-      case ConstantTag.kEmptyTypeArguments:
-        return new ConstantEmptyTypeArguments.read(reader);
-      case ConstantTag.kObjectRef:
-        return new ConstantObjectRef.read(reader);
-      case ConstantTag.kDirectCall:
-        return new ConstantDirectCall.read(reader);
-      case ConstantTag.kInterfaceCall:
-        return new ConstantInterfaceCall.read(reader);
-      case ConstantTag.kInstantiatedInterfaceCall:
-        return new ConstantInstantiatedInterfaceCall.read(reader);
-      case ConstantTag.kDynamicCall:
-        return new ConstantDynamicCall.read(reader);
-      case ConstantTag.kDirectCallViaDynamicForwarder:
-        return new ConstantDirectCallViaDynamicForwarder.read(reader);
-      // Make analyzer happy.
-      case ConstantTag.kUnused1:
-      case ConstantTag.kUnused2:
-      case ConstantTag.kUnused3:
-      case ConstantTag.kUnused4:
-      case ConstantTag.kUnused5:
-      case ConstantTag.kUnused6:
-      case ConstantTag.kUnused6a:
-      case ConstantTag.kUnused7:
-      case ConstantTag.kUnused8:
-      case ConstantTag.kUnused9:
-      case ConstantTag.kUnused10:
-      case ConstantTag.kUnused11:
-      case ConstantTag.kUnused12:
-      case ConstantTag.kUnused13:
-      case ConstantTag.kUnused14:
-      case ConstantTag.kUnused15:
-        break;
-    }
-    throw 'Unexpected constant tag $tag';
-  }
-}
-
-enum InvocationKind {
-  method, // x.foo(...) or foo(...)
-  getter, // x.foo
-  setter // x.foo = ...
-}
-
-class ConstantStaticField extends ConstantPoolEntry {
-  final ObjectHandle field;
-
-  ConstantStaticField(this.field);
-
-  @override
-  ConstantTag get tag => ConstantTag.kStaticField;
-
-  @override
-  void writeValue(BufferedWriter writer) {
-    writer.writePackedObject(field);
-  }
-
-  ConstantStaticField.read(BufferedReader reader)
-      : field = reader.readPackedObject();
-
-  @override
-  String toString() => 'StaticField $field';
-
-  @override
-  int get hashCode => field.hashCode;
-
-  @override
-  bool operator ==(other) =>
-      other is ConstantStaticField && this.field == other.field;
-}
-
-class ConstantInstanceField extends ConstantPoolEntry {
-  final ObjectHandle field;
-
-  int get numReservedEntries => 1;
-
-  ConstantInstanceField(this.field);
-
-  @override
-  ConstantTag get tag => ConstantTag.kInstanceField;
-
-  @override
-  void writeValue(BufferedWriter writer) {
-    writer.writePackedObject(field);
-  }
-
-  ConstantInstanceField.read(BufferedReader reader)
-      : field = reader.readPackedObject();
-
-  @override
-  String toString() => 'InstanceField $field';
-
-  @override
-  int get hashCode => field.hashCode;
-
-  @override
-  bool operator ==(other) =>
-      other is ConstantInstanceField && this.field == other.field;
-}
-
-class ConstantClass extends ConstantPoolEntry {
-  final ObjectHandle classHandle;
-
-  ConstantClass(this.classHandle);
-
-  @override
-  ConstantTag get tag => ConstantTag.kClass;
-
-  @override
-  void writeValue(BufferedWriter writer) {
-    writer.writePackedObject(classHandle);
-  }
-
-  ConstantClass.read(BufferedReader reader)
-      : classHandle = reader.readPackedObject();
-
-  @override
-  String toString() => 'Class $classHandle';
-
-  @override
-  int get hashCode => classHandle.hashCode;
-
-  @override
-  bool operator ==(other) =>
-      other is ConstantClass && this.classHandle == other.classHandle;
-}
-
-class ConstantTypeArgumentsField extends ConstantPoolEntry {
-  final ObjectHandle classHandle;
-
-  ConstantTypeArgumentsField(this.classHandle);
-
-  @override
-  ConstantTag get tag => ConstantTag.kTypeArgumentsField;
-
-  @override
-  void writeValue(BufferedWriter writer) {
-    writer.writePackedObject(classHandle);
-  }
-
-  ConstantTypeArgumentsField.read(BufferedReader reader)
-      : classHandle = reader.readPackedObject();
-
-  @override
-  String toString() => 'TypeArgumentsField $classHandle';
-
-  @override
-  int get hashCode => classHandle.hashCode;
-
-  @override
-  bool operator ==(other) =>
-      other is ConstantTypeArgumentsField &&
-      this.classHandle == other.classHandle;
-}
-
-class ConstantType extends ConstantPoolEntry {
-  final ObjectHandle type;
-
-  ConstantType(this.type);
-
-  @override
-  ConstantTag get tag => ConstantTag.kType;
-
-  @override
-  void writeValue(BufferedWriter writer) {
-    writer.writePackedObject(type);
-  }
-
-  ConstantType.read(BufferedReader reader) : type = reader.readPackedObject();
-
-  @override
-  String toString() => 'Type $type';
-
-  @override
-  int get hashCode => type.hashCode;
-
-  @override
-  bool operator ==(other) => other is ConstantType && this.type == other.type;
-}
-
-class ConstantClosureFunction extends ConstantPoolEntry {
-  final int closureIndex;
-
-  ConstantClosureFunction(this.closureIndex);
-
-  @override
-  ConstantTag get tag => ConstantTag.kClosureFunction;
-
-  @override
-  void writeValue(BufferedWriter writer) {
-    writer.writePackedUInt30(closureIndex);
-  }
-
-  ConstantClosureFunction.read(BufferedReader reader)
-      : closureIndex = reader.readPackedUInt30();
-
-  @override
-  String toString() {
-    return 'ClosureFunction $closureIndex';
-  }
-
-  @override
-  int get hashCode => closureIndex;
-
-  @override
-  bool operator ==(other) =>
-      other is ConstantClosureFunction &&
-      this.closureIndex == other.closureIndex;
-}
-
-class ConstantEndClosureFunctionScope extends ConstantPoolEntry {
-  ConstantEndClosureFunctionScope();
-
-  @override
-  ConstantTag get tag => ConstantTag.kEndClosureFunctionScope;
-
-  @override
-  void writeValue(BufferedWriter writer) {}
-
-  ConstantEndClosureFunctionScope.read(BufferedReader reader) {}
-
-  @override
-  String toString() => 'EndClosureFunctionScope';
-
-  // ConstantEndClosureFunctionScope entries are created per closure and should
-  // not be merged, so ConstantEndClosureFunctionScope class uses identity
-  // [hashCode] and [operator ==].
-}
-
-class ConstantNativeEntry extends ConstantPoolEntry {
-  final String nativeName;
-
-  ConstantNativeEntry(this.nativeName);
-
-  @override
-  ConstantTag get tag => ConstantTag.kNativeEntry;
-
-  @override
-  void writeValue(BufferedWriter writer) {
-    writer.writePackedStringReference(nativeName);
-  }
-
-  ConstantNativeEntry.read(BufferedReader reader)
-      : nativeName = reader.readPackedStringReference();
-
-  @override
-  String toString() => 'NativeEntry $nativeName';
-
-  @override
-  int get hashCode => nativeName.hashCode;
-
-  @override
-  bool operator ==(other) =>
-      other is ConstantNativeEntry && this.nativeName == other.nativeName;
-}
-
-class ConstantSubtypeTestCache extends ConstantPoolEntry {
-  ConstantSubtypeTestCache();
-
-  @override
-  ConstantTag get tag => ConstantTag.kSubtypeTestCache;
-
-  @override
-  void writeValue(BufferedWriter writer) {}
-
-  ConstantSubtypeTestCache.read(BufferedReader reader);
-
-  @override
-  String toString() => 'SubtypeTestCache';
-
-  // ConstantSubtypeTestCache entries are created per subtype test site and
-  // should not be merged, so ConstantSubtypeTestCache class uses identity
-  // [hashCode] and [operator ==].
-
-  @override
-  int get hashCode => identityHashCode(this);
-
-  @override
-  bool operator ==(other) => identical(this, other);
-}
-
-class ConstantEmptyTypeArguments extends ConstantPoolEntry {
-  const ConstantEmptyTypeArguments();
-
-  @override
-  ConstantTag get tag => ConstantTag.kEmptyTypeArguments;
-
-  @override
-  void writeValue(BufferedWriter writer) {}
-
-  ConstantEmptyTypeArguments.read(BufferedReader reader);
-
-  @override
-  String toString() => 'EmptyTypeArguments';
-
-  @override
-  int get hashCode => 997;
-
-  @override
-  bool operator ==(other) => other is ConstantEmptyTypeArguments;
-}
-
-class ConstantObjectRef extends ConstantPoolEntry {
-  final ObjectHandle object;
-
-  ConstantObjectRef(this.object);
-
-  @override
-  ConstantTag get tag => ConstantTag.kObjectRef;
-
-  @override
-  void writeValue(BufferedWriter writer) {
-    writer.writePackedObject(object);
-  }
-
-  ConstantObjectRef.read(BufferedReader reader)
-      : object = reader.readPackedObject();
-
-  @override
-  String toString() => 'ObjectRef $object';
-
-  @override
-  int get hashCode => object.hashCode;
-
-  @override
-  bool operator ==(other) =>
-      other is ConstantObjectRef && this.object == other.object;
-}
-
-class ConstantDirectCall extends ConstantPoolEntry {
-  final ObjectHandle target;
-  final ObjectHandle argDesc;
-
-  ConstantDirectCall(this.target, this.argDesc);
-
-  // Reserve 1 extra slot for arguments descriptor, following target slot.
-  int get numReservedEntries => 1;
-
-  @override
-  ConstantTag get tag => ConstantTag.kDirectCall;
-
-  @override
-  void writeValue(BufferedWriter writer) {
-    writer.writePackedObject(target);
-    writer.writePackedObject(argDesc);
-  }
-
-  ConstantDirectCall.read(BufferedReader reader)
-      : target = reader.readPackedObject(),
-        argDesc = reader.readPackedObject();
-
-  @override
-  String toString() => "DirectCall '$target', $argDesc";
-
-  @override
-  int get hashCode => _combineHashes(target.hashCode, argDesc.hashCode);
-
-  @override
-  bool operator ==(other) =>
-      other is ConstantDirectCall &&
-      this.target == other.target &&
-      this.argDesc == other.argDesc;
-}
-
-class ConstantDirectCallViaDynamicForwarder extends ConstantPoolEntry {
-  final ObjectHandle target;
-  final ObjectHandle argDesc;
-
-  ConstantDirectCallViaDynamicForwarder(this.target, this.argDesc);
-
-  // Reserve 1 extra slot for arguments descriptor, following target slot.
-  int get numReservedEntries => 1;
-
-  @override
-  ConstantTag get tag => ConstantTag.kDirectCallViaDynamicForwarder;
-
-  @override
-  void writeValue(BufferedWriter writer) {
-    writer.writePackedObject(target);
-    writer.writePackedObject(argDesc);
-  }
-
-  ConstantDirectCallViaDynamicForwarder.read(BufferedReader reader)
-      : target = reader.readPackedObject(),
-        argDesc = reader.readPackedObject();
-
-  @override
-  String toString() => "DirectCallViaDynamicForwarder '$target', $argDesc";
-
-  @override
-  int get hashCode => _combineHashes(target.hashCode, argDesc.hashCode);
-
-  @override
-  bool operator ==(other) =>
-      other is ConstantDirectCallViaDynamicForwarder &&
-      this.target == other.target &&
-      this.argDesc == other.argDesc;
-}
-
-class ConstantInterfaceCall extends ConstantPoolEntry {
-  final ObjectHandle target;
-  final ObjectHandle argDesc;
-
-  ConstantInterfaceCall(this.target, this.argDesc);
-
-  // Reserve 1 extra slot for arguments descriptor, following target slot.
-  int get numReservedEntries => 1;
-
-  @override
-  ConstantTag get tag => ConstantTag.kInterfaceCall;
-
-  @override
-  void writeValue(BufferedWriter writer) {
-    writer.writePackedObject(target);
-    writer.writePackedObject(argDesc);
-  }
-
-  ConstantInterfaceCall.read(BufferedReader reader)
-      : target = reader.readPackedObject(),
-        argDesc = reader.readPackedObject();
-
-  @override
-  String toString() => "InterfaceCall '$target', $argDesc";
-
-  @override
-  int get hashCode => _combineHashes(target.hashCode, argDesc.hashCode);
-
-  @override
-  bool operator ==(other) =>
-      other is ConstantInterfaceCall &&
-      this.target == other.target &&
-      this.argDesc == other.argDesc;
-}
-
-class ConstantInstantiatedInterfaceCall extends ConstantPoolEntry {
-  final ObjectHandle target;
-  final ObjectHandle argDesc;
-  final ObjectHandle staticReceiverType;
-
-  ConstantInstantiatedInterfaceCall(
-      this.target, this.argDesc, this.staticReceiverType);
-
-  // Reserve 2 extra slots (3 slots total).
-  int get numReservedEntries => 2;
-
-  @override
-  ConstantTag get tag => ConstantTag.kInstantiatedInterfaceCall;
-
-  @override
-  void writeValue(BufferedWriter writer) {
-    writer.writePackedObject(target);
-    writer.writePackedObject(argDesc);
-    writer.writePackedObject(staticReceiverType);
-  }
-
-  ConstantInstantiatedInterfaceCall.read(BufferedReader reader)
-      : target = reader.readPackedObject(),
-        argDesc = reader.readPackedObject(),
-        staticReceiverType = reader.readPackedObject();
-
-  @override
-  String toString() =>
-      "InstantiatedInterfaceCall '$target', $argDesc, receiver $staticReceiverType";
-
-  @override
-  int get hashCode => _combineHashes(
-      _combineHashes(target.hashCode, argDesc.hashCode),
-      staticReceiverType.hashCode);
-
-  @override
-  bool operator ==(other) =>
-      other is ConstantInstantiatedInterfaceCall &&
-      this.target == other.target &&
-      this.argDesc == other.argDesc &&
-      this.staticReceiverType == other.staticReceiverType;
-}
-
-class ConstantDynamicCall extends ConstantPoolEntry {
-  final ObjectHandle selectorName;
-  final ObjectHandle argDesc;
-
-  ConstantDynamicCall(this.selectorName, this.argDesc);
-
-  // Reserve 1 extra slot for arguments descriptor, following selector slot.
-  int get numReservedEntries => 1;
-
-  @override
-  ConstantTag get tag => ConstantTag.kDynamicCall;
-
-  @override
-  void writeValue(BufferedWriter writer) {
-    writer.writePackedObject(selectorName);
-    writer.writePackedObject(argDesc);
-  }
-
-  ConstantDynamicCall.read(BufferedReader reader)
-      : selectorName = reader.readPackedObject(),
-        argDesc = reader.readPackedObject();
-
-  @override
-  String toString() => 'DynamicCall $selectorName, $argDesc';
-
-  @override
-  int get hashCode => _combineHashes(selectorName.hashCode, argDesc.hashCode);
-
-  @override
-  bool operator ==(other) =>
-      other is ConstantDynamicCall &&
-      this.selectorName == other.selectorName &&
-      this.argDesc == other.argDesc;
-}
-
-/// Reserved constant pool entry.
-class _ReservedConstantPoolEntry extends ConstantPoolEntry {
-  const _ReservedConstantPoolEntry();
-
-  ConstantTag get tag => throw 'This constant pool entry is reserved';
-  void writeValue(BufferedWriter writer) =>
-      throw 'This constant pool entry is reserved';
-
-  @override
-  String toString() => 'Reserved';
-}
-
-class ConstantPool {
-  final StringTable stringTable;
-  final ObjectTable objectTable;
-  final List<ConstantPoolEntry> entries = <ConstantPoolEntry>[];
-  final Map<ConstantPoolEntry, int> _canonicalizationCache =
-      <ConstantPoolEntry, int>{};
-
-  ConstantPool(this.stringTable, this.objectTable);
-
-  int addString(String value) => addObjectRef(new StringConstant(value));
-
-  int addName(String name) =>
-      _add(new ConstantObjectRef(objectTable.getPublicNameHandle(name)));
-
-  int addArgDesc(int numArguments,
-          {int numTypeArgs = 0, List<String> argNames = const <String>[]}) =>
-      _add(new ConstantObjectRef(
-          objectTable.getArgDescHandle(numArguments, numTypeArgs, argNames)));
-
-  int addArgDescByArguments(Arguments args,
-          {bool hasReceiver: false, bool isFactory: false}) =>
-      _add(new ConstantObjectRef(objectTable.getArgDescHandleByArguments(args,
-          hasReceiver: hasReceiver, isFactory: isFactory)));
-
-  int addDirectCall(
-      InvocationKind invocationKind, Member target, ObjectHandle argDesc,
-      [bool isDynamicForwarder = false]) {
-    final targetHandle = objectTable.getMemberHandle(target,
-        isGetter: invocationKind == InvocationKind.getter,
-        isSetter: invocationKind == InvocationKind.setter);
-    return _add(isDynamicForwarder
-        ? new ConstantDirectCallViaDynamicForwarder(targetHandle, argDesc)
-        : new ConstantDirectCall(targetHandle, argDesc));
-  }
-
-  int addInterfaceCall(
-          InvocationKind invocationKind, Member target, ObjectHandle argDesc) =>
-      _add(new ConstantInterfaceCall(
-          objectTable.getMemberHandle(target,
-              isGetter: invocationKind == InvocationKind.getter,
-              isSetter: invocationKind == InvocationKind.setter),
-          argDesc));
-
-  int addInstantiatedInterfaceCall(InvocationKind invocationKind, Member target,
-          ObjectHandle argDesc, DartType staticReceiverType) =>
-      _add(new ConstantInstantiatedInterfaceCall(
-          objectTable.getMemberHandle(target,
-              isGetter: invocationKind == InvocationKind.getter,
-              isSetter: invocationKind == InvocationKind.setter),
-          argDesc,
-          objectTable.getHandle(staticReceiverType)));
-
-  int addDynamicCall(
-          InvocationKind invocationKind, Name selector, ObjectHandle argDesc) =>
-      _add(new ConstantDynamicCall(
-          objectTable.getSelectorNameHandle(selector,
-              isGetter: invocationKind == InvocationKind.getter,
-              isSetter: invocationKind == InvocationKind.setter),
-          argDesc));
-
-  int addInstanceCall(InvocationKind invocationKind, Member target,
-          Name targetName, ObjectHandle argDesc) =>
-      (target == null)
-          ? addDynamicCall(invocationKind, targetName, argDesc)
-          : addInterfaceCall(invocationKind, target, argDesc);
-
-  int addStaticField(Field field) =>
-      _add(new ConstantStaticField(objectTable.getHandle(field)));
-
-  int addInstanceField(Field field) =>
-      _add(new ConstantInstanceField(objectTable.getHandle(field)));
-
-  int addClass(Class node) =>
-      _add(new ConstantClass(objectTable.getHandle(node)));
-
-  int addTypeArgumentsField(Class node) =>
-      _add(new ConstantTypeArgumentsField(objectTable.getHandle(node)));
-
-  int addType(DartType type) =>
-      _add(new ConstantType(objectTable.getHandle(type)));
-
-  int addTypeArguments(List<DartType> typeArgs) =>
-      _add(new ConstantObjectRef(objectTable.getTypeArgumentsHandle(typeArgs)));
-
-  int addClosureFunction(int closureIndex) =>
-      _add(new ConstantClosureFunction(closureIndex));
-
-  int addEndClosureFunctionScope() =>
-      _add(new ConstantEndClosureFunctionScope());
-
-  int addNativeEntry(String nativeName) =>
-      _add(new ConstantNativeEntry(_indexString(nativeName)));
-
-  int addSubtypeTestCache() => _add(new ConstantSubtypeTestCache());
-
-  int addEmptyTypeArguments() => _add(const ConstantEmptyTypeArguments());
-
-  int addObjectRef(Node node) =>
-      _add(new ConstantObjectRef(objectTable.getHandle(node)));
-
-  int addSelectorName(Name name, InvocationKind invocationKind) =>
-      _add(new ConstantObjectRef(objectTable.getSelectorNameHandle(name,
-          isGetter: invocationKind == InvocationKind.getter,
-          isSetter: invocationKind == InvocationKind.setter)));
-
-  int _add(ConstantPoolEntry entry) {
-    int index = _canonicalizationCache[entry];
-    if (index == null) {
-      index = entries.length;
-      if (index >= constantPoolIndexLimit) {
-        throw new ConstantPoolIndexOverflowException();
-      }
-      _addEntry(entry);
-      _canonicalizationCache[entry] = index;
-    }
-    return index;
-  }
-
-  void _addEntry(ConstantPoolEntry entry) {
-    entries.add(entry);
-    for (int i = 0; i < entry.numReservedEntries; ++i) {
-      entries.add(const _ReservedConstantPoolEntry());
-    }
-  }
-
-  // Currently, string table is written as a part of Component's metadata
-  // *before* constant pools are written.
-  // So we need to index all strings when filling up constant pools.
-  String _indexString(String str) {
-    stringTable.put(str);
-    return str;
-  }
-
-  void write(BufferedWriter writer) {
-    final start = writer.offset;
-    if (BytecodeSizeStatistics.constantPoolStats.isEmpty) {
-      for (var tag in ConstantTag.values) {
-        BytecodeSizeStatistics.constantPoolStats
-            .add(new NamedEntryStatistics(constantTagToString(tag)));
-      }
-    }
-    writer.writePackedUInt30(entries.length);
-    entries.forEach((e) {
-      if (e is _ReservedConstantPoolEntry) {
-        return;
-      }
-
-      final entryStart = writer.offset;
-
-      e.write(writer);
-
-      final entryStat = BytecodeSizeStatistics.constantPoolStats[e.tag.index];
-      entryStat.size += (writer.offset - entryStart);
-      ++entryStat.count;
-    });
-    BytecodeSizeStatistics.constantPoolSize += (writer.offset - start);
-  }
-
-  ConstantPool.read(BufferedReader reader)
-      : stringTable = reader.stringReader,
-        objectTable = reader.objectReader {
-    int len = reader.readPackedUInt30();
-    for (int i = 0; i < len; i++) {
-      final e = new ConstantPoolEntry.read(reader);
-      _addEntry(e);
-      i += e.numReservedEntries;
-    }
-  }
-
-  @override
-  String toString() {
-    StringBuffer sb = new StringBuffer();
-    sb.writeln('ConstantPool {');
-    for (int i = 0; i < entries.length; i++) {
-      sb.writeln('  [$i] = ${entries[i]}');
-    }
-    sb.writeln('}');
-    return sb.toString();
-  }
-}
-
-int _combineHashes(int hash1, int hash2) =>
-    (((hash1 * 31) & 0x3fffffff) + hash2) & 0x3fffffff;
-
-class ConstantPoolIndexOverflowException
-    extends BytecodeLimitExceededException {}
diff --git a/pkg/vm/lib/bytecode/dbc.dart b/pkg/vm/lib/bytecode/dbc.dart
deleted file mode 100644
index 39ae12a..0000000
--- a/pkg/vm/lib/bytecode/dbc.dart
+++ /dev/null
@@ -1,677 +0,0 @@
-// Copyright (c) 2018, 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.
-
-/// Dart kernel bytecode instructions (described in runtime/vm/constants_kbc.h).
-
-library vm.bytecode.dbc;
-
-/// Version of bytecode format, produced by default.
-/// Before bumping current bytecode version format, make sure that
-/// all users have switched to a VM which is able to consume new
-/// version of bytecode.
-const int currentBytecodeFormatVersion = 28;
-
-enum Opcode {
-  kUnusedOpcode000,
-  kUnusedOpcode001,
-  kUnusedOpcode002,
-  kUnusedOpcode003,
-  kUnusedOpcode004,
-  kUnusedOpcode005,
-  kUnusedOpcode006,
-  kUnusedOpcode007,
-  kUnusedOpcode008,
-  kUnusedOpcode009,
-  kUnusedOpcode010,
-  kUnusedOpcode011,
-  kUnusedOpcode012,
-  kUnusedOpcode013,
-  kUnusedOpcode014,
-  kUnusedOpcode015,
-  kUnusedOpcode016,
-  kUnusedOpcode017,
-  kUnusedOpcode018,
-  kUnusedOpcode019,
-  kUnusedOpcode020,
-  kUnusedOpcode021,
-  kUnusedOpcode022,
-  kUnusedOpcode023,
-  kUnusedOpcode024,
-  kUnusedOpcode025,
-  kUnusedOpcode026,
-  kUnusedOpcode027,
-  kUnusedOpcode028,
-  kUnusedOpcode029,
-  kUnusedOpcode030,
-  kUnusedOpcode031,
-  kUnusedOpcode032,
-  kUnusedOpcode033,
-  kUnusedOpcode034,
-  kUnusedOpcode035,
-  kUnusedOpcode036,
-  kUnusedOpcode037,
-  kUnusedOpcode038,
-  kUnusedOpcode039,
-  kUnusedOpcode040,
-  kUnusedOpcode041,
-  kUnusedOpcode042,
-  kUnusedOpcode043,
-  kUnusedOpcode044,
-  kUnusedOpcode045,
-  kUnusedOpcode046,
-  kUnusedOpcode047,
-  kUnusedOpcode048,
-  kUnusedOpcode049,
-  kUnusedOpcode050,
-  kUnusedOpcode051,
-  kUnusedOpcode052,
-  kUnusedOpcode053,
-  kUnusedOpcode054,
-  kUnusedOpcode055,
-  kUnusedOpcode056,
-  kUnusedOpcode057,
-  kUnusedOpcode058,
-  kUnusedOpcode059,
-  kUnusedOpcode060,
-  kUnusedOpcode061,
-  kUnusedOpcode062,
-  kUnusedOpcode063,
-  kUnusedOpcode064,
-  kUnusedOpcode065,
-  kUnusedOpcode066,
-  kUnusedOpcode067,
-  kUnusedOpcode068,
-  kUnusedOpcode069,
-  kUnusedOpcode070,
-  kUnusedOpcode071,
-  kUnusedOpcode072,
-  kUnusedOpcode073,
-  kUnusedOpcode074,
-  kUnusedOpcode075,
-  kUnusedOpcode076,
-  kUnusedOpcode077,
-  kUnusedOpcode078,
-  kUnusedOpcode079,
-  kUnusedOpcode080,
-  kUnusedOpcode081,
-
-  // Late variables.
-  kJumpIfInitialized,
-  kJumpIfInitialized_Wide,
-  kPushUninitializedSentinel,
-
-  kTrap,
-
-  // Prologue and stack management.
-  kEntry,
-  kEntry_Wide,
-  // TODO(alexmarkov): cleanup now unused EntryFixed instruction.
-  kEntryFixed,
-  kEntryFixed_Wide,
-  kEntryOptional,
-  kUnused00, // Reserved for EntryNoLocals.
-  kLoadConstant,
-  kLoadConstant_Wide,
-  kFrame,
-  kFrame_Wide,
-  kCheckFunctionTypeArgs,
-  kCheckFunctionTypeArgs_Wide,
-  kCheckStack,
-  kDebugCheck,
-  kJumpIfUnchecked,
-  kJumpIfUnchecked_Wide,
-
-  // Object allocation.
-  kAllocate,
-  kAllocate_Wide,
-  kAllocateT,
-  kCreateArrayTOS,
-  kAllocateClosure,
-  kAllocateClosure_Wide,
-
-  // Context allocation and access.
-  kAllocateContext,
-  kAllocateContext_Wide,
-  kCloneContext,
-  kCloneContext_Wide,
-  kLoadContextParent,
-  kStoreContextParent,
-  kLoadContextVar,
-  kLoadContextVar_Wide,
-  kUnused04, // Reserved for LoadContextVar0
-  kUnused05,
-  kStoreContextVar,
-  kStoreContextVar_Wide,
-
-  // Constants.
-  kPushConstant,
-  kPushConstant_Wide,
-  kUnused06, // Reserved for PushConstant0
-  kUnused07,
-  kPushTrue,
-  kPushFalse,
-  kPushInt,
-  kPushInt_Wide,
-  kUnused08, // Reserved for PushInt0
-  kUnused09, // Reserved for PushInt1
-  kUnused10, // Reserved for PushInt2
-  kUnused11,
-  kPushNull,
-
-  // Locals and expression stack.
-  kDrop1,
-  kPush,
-  kPush_Wide,
-  kUnused12, // Reserved for PushLocal0
-  kUnused13, // Reserved for PushLocal1
-  kUnused14, // Reserved for PushLocal2
-  kUnused15, // Reserved for PushLocal3
-  kUnused16, // Reserved for PushParamLast0
-  kUnused17, // Reserved for PushParamLast1
-  kPopLocal,
-  kPopLocal_Wide,
-  kLoadStatic,
-  kLoadStatic_Wide,
-  kStoreLocal,
-  kStoreLocal_Wide,
-
-  // Instance fields and arrays.
-  kLoadFieldTOS,
-  kLoadFieldTOS_Wide,
-  kStoreFieldTOS,
-  kStoreFieldTOS_Wide,
-  kStoreIndexedTOS,
-  kUnused20,
-
-  // Late fields.
-  kInitLateField,
-  kInitLateField_Wide,
-
-  // Static fields.
-  kStoreStaticTOS,
-  kStoreStaticTOS_Wide,
-
-  // Jumps.
-  kJump,
-  kJump_Wide,
-  kJumpIfNoAsserts,
-  kJumpIfNoAsserts_Wide,
-  kJumpIfNotZeroTypeArgs,
-  kJumpIfNotZeroTypeArgs_Wide,
-  kJumpIfEqStrict,
-  kJumpIfEqStrict_Wide,
-  kJumpIfNeStrict,
-  kJumpIfNeStrict_Wide,
-  kJumpIfTrue,
-  kJumpIfTrue_Wide,
-  kJumpIfFalse,
-  kJumpIfFalse_Wide,
-  kJumpIfNull,
-  kJumpIfNull_Wide,
-  kJumpIfNotNull,
-  kJumpIfNotNull_Wide,
-
-  // Calls.
-  kDirectCall,
-  kDirectCall_Wide,
-  kUncheckedDirectCall,
-  kUncheckedDirectCall_Wide,
-  kInterfaceCall,
-  kInterfaceCall_Wide,
-  kUnused23, // Reserved for InterfaceCall1
-  kUnused24, // Reserved for InterfaceCall1_Wide
-  kInstantiatedInterfaceCall,
-  kInstantiatedInterfaceCall_Wide,
-  kUncheckedClosureCall,
-  kUncheckedClosureCall_Wide,
-  kUncheckedInterfaceCall,
-  kUncheckedInterfaceCall_Wide,
-  kDynamicCall,
-  kDynamicCall_Wide,
-  kNativeCall,
-  kNativeCall_Wide,
-  kReturnTOS,
-  kUnused29,
-
-  // Types and type checks.
-  kAssertAssignable,
-  kAssertAssignable_Wide,
-  kUnused30, // Reserved for AsSimpleType
-  kUnused31, // Reserved for AsSimpleType_Wide
-  kAssertBoolean,
-  kAssertSubtype,
-  kLoadTypeArgumentsField,
-  kLoadTypeArgumentsField_Wide,
-  kInstantiateType,
-  kInstantiateType_Wide,
-  kInstantiateTypeArgumentsTOS,
-  kInstantiateTypeArgumentsTOS_Wide,
-  kUnused32, // Reserved for IsType
-  kUnused33, // Reserved for IsType_Wide
-  kUnused34, // Reserved for IsSimpleType
-  kUnused35, // Reserved for IsSimpleType_Wide
-
-  // Exception handling.
-  kThrow,
-  kSetFrame,
-  kMoveSpecial,
-  kMoveSpecial_Wide,
-
-  // Bool operations.
-  kBooleanNegateTOS,
-
-  // Null operations.
-  kEqualsNull,
-  kNullCheck,
-  kNullCheck_Wide,
-
-  // Int operations.
-  kNegateInt,
-  kAddInt,
-  kSubInt,
-  kMulInt,
-  kTruncDivInt,
-  kModInt,
-  kBitAndInt,
-  kBitOrInt,
-  kBitXorInt,
-  kShlInt,
-  kShrInt,
-  kCompareIntEq,
-  kCompareIntGt,
-  kCompareIntLt,
-  kCompareIntGe,
-  kCompareIntLe,
-
-  // Double operations.
-  kNegateDouble,
-  kAddDouble,
-  kSubDouble,
-  kMulDouble,
-  kDivDouble,
-  kCompareDoubleEq,
-  kCompareDoubleGt,
-  kCompareDoubleLt,
-  kCompareDoubleGe,
-  kCompareDoubleLe,
-}
-
-/// Compact variants of opcodes are always even.
-/// Wide variant = opcode + kWideModifier.
-const int kWideModifier = 1;
-
-/// Opcode should fit into 1 byte.
-const int kMaxOpcodes = 256;
-
-enum Encoding {
-  k0, // No operands.
-  kA, // 1 operand: A = 8-bit unsigned.
-  kD, // 1 operand: D = 8/32-bit unsigned.
-  kX, // 1 operand: X = 8/32-bit signed.
-  kT, // 1 operand: T = 8/24-bit signed.
-  kAE, // 2 operands: A = 8-bit unsigned, E = 8/32-bit unsigned
-  kAY, // 2 operands: A = 8-bit unsigned, Y = 8/32-bit signed
-  kDF, // 2 operands: D = 8/32-bit unsigned, F = 8-bit unsigned
-  kABC, // 3 operands: A, B, C - 8-bit unsigned.
-}
-
-int instructionSize(Encoding encoding, bool isWide) {
-  switch (encoding) {
-    case Encoding.k0:
-      return 1;
-    case Encoding.kA:
-      return 2;
-    case Encoding.kD:
-      return isWide ? 5 : 2;
-    case Encoding.kX:
-      return isWide ? 5 : 2;
-    case Encoding.kT:
-      return isWide ? 4 : 2;
-    case Encoding.kAE:
-      return isWide ? 6 : 3;
-    case Encoding.kAY:
-      return isWide ? 6 : 3;
-    case Encoding.kDF:
-      return isWide ? 6 : 3;
-    case Encoding.kABC:
-      return 4;
-  }
-  throw 'Unexpected instruction encoding $encoding';
-}
-
-enum Operand {
-  none, // ignored / non-existent operand
-  imm, // immediate operand
-  lit, // constant literal from object pool
-  reg, // register (unsigned FP relative local)
-  xeg, // x-register (signed FP relative local)
-  tgt, // jump target relative to the PC of the current instruction
-  spe, // SpecialIndex
-}
-
-class Format {
-  final Encoding encoding;
-  final List<Operand> operands;
-  const Format(this.encoding, this.operands);
-}
-
-const Map<Opcode, Format> BytecodeFormats = const {
-  Opcode.kTrap: const Format(
-      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
-  Opcode.kEntry: const Format(
-      Encoding.kD, const [Operand.imm, Operand.none, Operand.none]),
-  Opcode.kEntryFixed: const Format(
-      Encoding.kAE, const [Operand.imm, Operand.imm, Operand.none]),
-  Opcode.kEntryOptional: const Format(
-      Encoding.kABC, const [Operand.imm, Operand.imm, Operand.imm]),
-  Opcode.kLoadConstant: const Format(
-      Encoding.kAE, const [Operand.reg, Operand.lit, Operand.none]),
-  Opcode.kFrame: const Format(
-      Encoding.kD, const [Operand.imm, Operand.none, Operand.none]),
-  Opcode.kCheckFunctionTypeArgs: const Format(
-      Encoding.kAE, const [Operand.imm, Operand.reg, Operand.none]),
-  Opcode.kCheckStack: const Format(
-      Encoding.kA, const [Operand.imm, Operand.none, Operand.none]),
-  Opcode.kDebugCheck: const Format(
-      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
-  Opcode.kAllocate: const Format(
-      Encoding.kD, const [Operand.lit, Operand.none, Operand.none]),
-  Opcode.kAllocateT: const Format(
-      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
-  Opcode.kCreateArrayTOS: const Format(
-      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
-  Opcode.kAllocateContext: const Format(
-      Encoding.kAE, const [Operand.imm, Operand.imm, Operand.none]),
-  Opcode.kCloneContext: const Format(
-      Encoding.kAE, const [Operand.imm, Operand.imm, Operand.none]),
-  Opcode.kLoadContextParent: const Format(
-      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
-  Opcode.kStoreContextParent: const Format(
-      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
-  Opcode.kLoadContextVar: const Format(
-      Encoding.kAE, const [Operand.imm, Operand.imm, Operand.none]),
-  Opcode.kStoreContextVar: const Format(
-      Encoding.kAE, const [Operand.imm, Operand.imm, Operand.none]),
-  Opcode.kPushConstant: const Format(
-      Encoding.kD, const [Operand.lit, Operand.none, Operand.none]),
-  Opcode.kPushNull: const Format(
-      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
-  Opcode.kPushTrue: const Format(
-      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
-  Opcode.kPushFalse: const Format(
-      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
-  Opcode.kPushInt: const Format(
-      Encoding.kX, const [Operand.imm, Operand.none, Operand.none]),
-  Opcode.kDrop1: const Format(
-      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
-  Opcode.kPush: const Format(
-      Encoding.kX, const [Operand.xeg, Operand.none, Operand.none]),
-  Opcode.kPopLocal: const Format(
-      Encoding.kX, const [Operand.xeg, Operand.none, Operand.none]),
-  Opcode.kStoreLocal: const Format(
-      Encoding.kX, const [Operand.xeg, Operand.none, Operand.none]),
-  Opcode.kLoadFieldTOS: const Format(
-      Encoding.kD, const [Operand.lit, Operand.none, Operand.none]),
-  Opcode.kStoreFieldTOS: const Format(
-      Encoding.kD, const [Operand.lit, Operand.none, Operand.none]),
-  Opcode.kStoreIndexedTOS: const Format(
-      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
-  Opcode.kInitLateField: const Format(
-      Encoding.kD, const [Operand.lit, Operand.none, Operand.none]),
-  Opcode.kPushUninitializedSentinel: const Format(
-      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
-  Opcode.kJumpIfInitialized: const Format(
-      Encoding.kT, const [Operand.tgt, Operand.none, Operand.none]),
-  Opcode.kLoadStatic: const Format(
-      Encoding.kD, const [Operand.lit, Operand.none, Operand.none]),
-  Opcode.kStoreStaticTOS: const Format(
-      Encoding.kD, const [Operand.lit, Operand.none, Operand.none]),
-  Opcode.kJump: const Format(
-      Encoding.kT, const [Operand.tgt, Operand.none, Operand.none]),
-  Opcode.kJumpIfNoAsserts: const Format(
-      Encoding.kT, const [Operand.tgt, Operand.none, Operand.none]),
-  Opcode.kJumpIfNotZeroTypeArgs: const Format(
-      Encoding.kT, const [Operand.tgt, Operand.none, Operand.none]),
-  Opcode.kJumpIfEqStrict: const Format(
-      Encoding.kT, const [Operand.tgt, Operand.none, Operand.none]),
-  Opcode.kJumpIfNeStrict: const Format(
-      Encoding.kT, const [Operand.tgt, Operand.none, Operand.none]),
-  Opcode.kJumpIfTrue: const Format(
-      Encoding.kT, const [Operand.tgt, Operand.none, Operand.none]),
-  Opcode.kJumpIfFalse: const Format(
-      Encoding.kT, const [Operand.tgt, Operand.none, Operand.none]),
-  Opcode.kJumpIfNull: const Format(
-      Encoding.kT, const [Operand.tgt, Operand.none, Operand.none]),
-  Opcode.kJumpIfNotNull: const Format(
-      Encoding.kT, const [Operand.tgt, Operand.none, Operand.none]),
-  Opcode.kJumpIfUnchecked: const Format(
-      Encoding.kT, const [Operand.tgt, Operand.none, Operand.none]),
-  Opcode.kInterfaceCall: const Format(
-      Encoding.kDF, const [Operand.lit, Operand.imm, Operand.none]),
-  Opcode.kInstantiatedInterfaceCall: const Format(
-      Encoding.kDF, const [Operand.lit, Operand.imm, Operand.none]),
-  Opcode.kDynamicCall: const Format(
-      Encoding.kDF, const [Operand.lit, Operand.imm, Operand.none]),
-  Opcode.kNativeCall: const Format(
-      Encoding.kD, const [Operand.lit, Operand.none, Operand.none]),
-  Opcode.kReturnTOS: const Format(
-      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
-  Opcode.kAssertAssignable: const Format(
-      Encoding.kAE, const [Operand.imm, Operand.lit, Operand.none]),
-  Opcode.kAssertBoolean: const Format(
-      Encoding.kA, const [Operand.imm, Operand.none, Operand.none]),
-  Opcode.kAssertSubtype: const Format(
-      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
-  Opcode.kLoadTypeArgumentsField: const Format(
-      Encoding.kD, const [Operand.lit, Operand.none, Operand.none]),
-  Opcode.kInstantiateType: const Format(
-      Encoding.kD, const [Operand.lit, Operand.none, Operand.none]),
-  Opcode.kInstantiateTypeArgumentsTOS: const Format(
-      Encoding.kAE, const [Operand.imm, Operand.lit, Operand.none]),
-  Opcode.kThrow: const Format(
-      Encoding.kA, const [Operand.imm, Operand.none, Operand.none]),
-  Opcode.kMoveSpecial: const Format(
-      Encoding.kAY, const [Operand.spe, Operand.xeg, Operand.none]),
-  Opcode.kSetFrame: const Format(
-      Encoding.kA, const [Operand.imm, Operand.none, Operand.none]),
-  Opcode.kBooleanNegateTOS: const Format(
-      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
-  Opcode.kEqualsNull: const Format(
-      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
-  Opcode.kNullCheck: const Format(
-      Encoding.kD, const [Operand.lit, Operand.none, Operand.none]),
-  Opcode.kNegateInt: const Format(
-      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
-  Opcode.kAddInt: const Format(
-      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
-  Opcode.kSubInt: const Format(
-      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
-  Opcode.kMulInt: const Format(
-      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
-  Opcode.kTruncDivInt: const Format(
-      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
-  Opcode.kModInt: const Format(
-      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
-  Opcode.kBitAndInt: const Format(
-      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
-  Opcode.kBitOrInt: const Format(
-      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
-  Opcode.kBitXorInt: const Format(
-      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
-  Opcode.kShlInt: const Format(
-      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
-  Opcode.kShrInt: const Format(
-      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
-  Opcode.kCompareIntEq: const Format(
-      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
-  Opcode.kCompareIntGt: const Format(
-      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
-  Opcode.kCompareIntLt: const Format(
-      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
-  Opcode.kCompareIntGe: const Format(
-      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
-  Opcode.kCompareIntLe: const Format(
-      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
-  Opcode.kDirectCall: const Format(
-      Encoding.kDF, const [Operand.lit, Operand.imm, Operand.none]),
-  Opcode.kUncheckedDirectCall: const Format(
-      Encoding.kDF, const [Operand.lit, Operand.imm, Operand.none]),
-  Opcode.kAllocateClosure: const Format(
-      Encoding.kD, const [Operand.lit, Operand.none, Operand.none]),
-  Opcode.kUncheckedClosureCall: const Format(
-      Encoding.kDF, const [Operand.lit, Operand.imm, Operand.none]),
-  Opcode.kUncheckedInterfaceCall: const Format(
-      Encoding.kDF, const [Operand.lit, Operand.imm, Operand.none]),
-  Opcode.kNegateDouble: const Format(
-      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
-  Opcode.kAddDouble: const Format(
-      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
-  Opcode.kSubDouble: const Format(
-      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
-  Opcode.kMulDouble: const Format(
-      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
-  Opcode.kDivDouble: const Format(
-      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
-  Opcode.kCompareDoubleEq: const Format(
-      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
-  Opcode.kCompareDoubleGt: const Format(
-      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
-  Opcode.kCompareDoubleLt: const Format(
-      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
-  Opcode.kCompareDoubleGe: const Format(
-      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
-  Opcode.kCompareDoubleLe: const Format(
-      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
-};
-
-// Should match constant in runtime/vm/stack_frame_kbc.h.
-const int kParamEndSlotFromFp = 4;
-
-enum SpecialIndex {
-  exception,
-  stackTrace,
-}
-
-/// Returns [true] if there is a wide variant for the given opcode.
-bool hasWideVariant(Opcode opcode) {
-  final encoding = BytecodeFormats[opcode].encoding;
-  switch (encoding) {
-    case Encoding.k0:
-    case Encoding.kA:
-    case Encoding.kABC:
-      return false;
-    case Encoding.kD:
-    case Encoding.kX:
-    case Encoding.kT:
-    case Encoding.kAE:
-    case Encoding.kAY:
-    case Encoding.kDF:
-      return true;
-  }
-  throw 'Unexpected instruction encoding $encoding';
-}
-
-bool isWideOpcode(Opcode opcode) {
-  return (BytecodeFormats[opcode] == null) &&
-      hasWideVariant(Opcode.values[opcode.index - kWideModifier]);
-}
-
-Opcode fromWideOpcode(Opcode opcode) {
-  assert(isWideOpcode(opcode));
-  return Opcode.values[opcode.index - kWideModifier];
-}
-
-void verifyBytecodeInstructionDeclarations() {
-  const String kWideSuffix = '_Wide';
-  for (Opcode opcode in Opcode.values) {
-    final format = BytecodeFormats[opcode];
-    if (opcode.toString().endsWith(kWideSuffix)) {
-      if (format != null) {
-        throw 'Bytecode format should not be defined for wide opcode $opcode.';
-      }
-      final Opcode compact = Opcode.values[opcode.index - kWideModifier];
-      if (compact.toString() + kWideSuffix != opcode.toString()) {
-        throw 'Wide opcode $opcode should immediately follow its compact opcode (previous opcode is $compact).';
-      }
-      if (!hasWideVariant(compact)) {
-        throw 'Wide opcode $opcode should not be defined for opcode $compact with encoding ${BytecodeFormats[compact].encoding}.';
-      }
-    }
-    if (format == null) {
-      continue;
-    }
-    if (hasWideVariant(opcode)) {
-      if (Opcode.values[opcode.index + kWideModifier].toString() !=
-          opcode.toString() + kWideSuffix) {
-        throw 'Opcode $opcode$kWideSuffix should immedialy follow $opcode.';
-      }
-      if (opcode.index.isOdd) {
-        throw 'Opcode $opcode (${format.encoding}) has a wide variant and should be even';
-      }
-    }
-  }
-  if (Opcode.values.length > kMaxOpcodes) {
-    throw 'Too many opcodes';
-  }
-}
-
-bool isJump(Opcode opcode) => BytecodeFormats[opcode].encoding == Encoding.kT;
-
-bool isThrow(Opcode opcode) => opcode == Opcode.kThrow;
-
-bool isCall(Opcode opcode) {
-  switch (opcode) {
-    case Opcode.kDirectCall:
-    case Opcode.kUncheckedDirectCall:
-    case Opcode.kInterfaceCall:
-    case Opcode.kInstantiatedInterfaceCall:
-    case Opcode.kUncheckedClosureCall:
-    case Opcode.kUncheckedInterfaceCall:
-    case Opcode.kDynamicCall:
-    case Opcode.kNativeCall:
-      return true;
-    default:
-      return false;
-  }
-}
-
-bool isReturn(Opcode opcode) => opcode == Opcode.kReturnTOS;
-
-bool isControlFlow(Opcode opcode) =>
-    isJump(opcode) || isThrow(opcode) || isCall(opcode) || isReturn(opcode);
-
-bool isPush(Opcode opcode) {
-  switch (opcode) {
-    case Opcode.kPush:
-    case Opcode.kPushConstant:
-    case Opcode.kPushNull:
-    case Opcode.kPushTrue:
-    case Opcode.kPushFalse:
-    case Opcode.kPushInt:
-    case Opcode.kPushUninitializedSentinel:
-      return true;
-    default:
-      return false;
-  }
-}
-
-// Bytecode instructions reference constant pool indices using
-// unsigned 32-bit operands.
-const int constantPoolIndexLimit = 1 << 32;
-
-// Local variables are referenced using 32-bit signed operands.
-const int localVariableIndexLimit = 1 << 31;
-
-// Captured variables are referenced using 32-bit unsigned operands.
-const int capturedVariableIndexLimit = 1 << 32;
-
-// Context IDs are referenced using 8-bit unsigned operands.
-const int contextIdLimit = 1 << 8;
-
-// Number of arguments is encoded as 8-bit unsigned operand.
-const int argumentsLimit = 1 << 8;
-
-// Base class for exceptions thrown when certain limit of bytecode
-// format is exceeded.
-abstract class BytecodeLimitExceededException {}
diff --git a/pkg/vm/lib/bytecode/declarations.dart b/pkg/vm/lib/bytecode/declarations.dart
deleted file mode 100644
index 9b247c9..0000000
--- a/pkg/vm/lib/bytecode/declarations.dart
+++ /dev/null
@@ -1,1659 +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.
-
-library vm.bytecode.declarations;
-
-import 'package:kernel/ast.dart' show TreeNode, listHashCode, listEquals;
-import 'package:kernel/core_types.dart' show CoreTypes;
-import 'bytecode_serialization.dart'
-    show
-        BufferedWriter,
-        BufferedReader,
-        BytecodeDeclaration,
-        BytecodeSizeStatistics,
-        StringTable;
-import 'constant_pool.dart' show ConstantPool;
-import 'dbc.dart' show currentBytecodeFormatVersion;
-import 'disassembler.dart' show BytecodeDisassembler;
-import 'exceptions.dart' show ExceptionsTable;
-import 'local_variable_table.dart' show LocalVariableTable;
-import 'object_table.dart' show ObjectTable, ObjectHandle, NameAndType;
-import 'source_positions.dart' show LineStarts, SourcePositions;
-
-import 'dart:typed_data' show Uint8List;
-
-class LibraryDeclaration extends BytecodeDeclaration {
-  static const usesDartMirrorsFlag = 1 << 0;
-  static const usesDartFfiFlag = 1 << 1;
-  static const hasExtensionsFlag = 1 << 2;
-  static const isNonNullableByDefaultFlag = 1 << 3;
-
-  ObjectHandle importUri;
-  final int flags;
-  final ObjectHandle name;
-  final ObjectHandle script;
-  final List<ObjectHandle> extensionUris;
-  final List<ClassDeclaration> classes;
-
-  LibraryDeclaration(this.importUri, this.flags, this.name, this.script,
-      this.extensionUris, this.classes);
-
-  void write(BufferedWriter writer) {
-    final start = writer.offset;
-    writer.writePackedUInt30(flags);
-    writer.writePackedObject(name);
-    writer.writePackedObject(script);
-    if ((flags & hasExtensionsFlag) != 0) {
-      writer.writePackedList(extensionUris);
-    }
-    writer.writePackedUInt30(classes.length);
-    for (var cls in classes) {
-      writer.writePackedObject(cls.name);
-      writer.writeLinkOffset(cls);
-    }
-    BytecodeSizeStatistics.librariesSize += (writer.offset - start);
-  }
-
-  factory LibraryDeclaration.read(BufferedReader reader) {
-    final flags = reader.readPackedUInt30();
-    final name = reader.readPackedObject();
-    final script = reader.readPackedObject();
-    final classes =
-        List<ClassDeclaration>.generate(reader.readPackedUInt30(), (_) {
-      final className = reader.readPackedObject();
-      return reader.readLinkOffset<ClassDeclaration>()..name = className;
-    });
-    final extensionUris = ((flags & hasExtensionsFlag) != 0)
-        ? reader.readPackedList<ObjectHandle>()
-        : const <ObjectHandle>[];
-    return new LibraryDeclaration(
-        null, flags, name, script, extensionUris, classes);
-  }
-
-  @override
-  String toString() {
-    final StringBuffer sb = new StringBuffer();
-    sb.writeln('Library $importUri');
-    sb.writeln('    name $name');
-    sb.writeln('    script $script');
-    if ((flags & usesDartMirrorsFlag) != 0) {
-      sb.writeln('    uses dart:mirrors');
-    }
-    if ((flags & usesDartFfiFlag) != 0) {
-      sb.writeln('    uses dart:ffi');
-    }
-    if ((flags & hasExtensionsFlag) != 0) {
-      sb.writeln('    extensions: $extensionUris');
-    }
-    if ((flags & isNonNullableByDefaultFlag) != 0) {
-      sb.writeln('    is nnbd');
-    }
-    sb.writeln();
-    for (var cls in classes) {
-      sb.write(cls);
-    }
-    return sb.toString();
-  }
-}
-
-class ClassDeclaration extends BytecodeDeclaration {
-  static const isAbstractFlag = 1 << 0;
-  static const isEnumFlag = 1 << 1;
-  static const hasTypeParamsFlag = 1 << 2;
-  static const hasTypeArgumentsFlag = 1 << 3;
-  static const isTransformedMixinApplicationFlag = 1 << 4;
-  static const hasSourcePositionsFlag = 1 << 5;
-  static const hasAnnotationsFlag = 1 << 6;
-  static const hasPragmaFlag = 1 << 7;
-
-  ObjectHandle name;
-  final int flags;
-  final ObjectHandle script;
-  final int position;
-  final int endPosition;
-  final TypeParametersDeclaration typeParameters;
-  final int numTypeArguments;
-  final ObjectHandle superType;
-  final List<ObjectHandle> interfaces;
-  final Members members;
-  final AnnotationsDeclaration annotations;
-
-  ClassDeclaration(
-      this.name,
-      this.flags,
-      this.script,
-      this.position,
-      this.endPosition,
-      this.typeParameters,
-      this.numTypeArguments,
-      this.superType,
-      this.interfaces,
-      this.members,
-      this.annotations);
-
-  void write(BufferedWriter writer) {
-    final start = writer.offset;
-    writer.writePackedUInt30(flags);
-    writer.writePackedObject(script);
-
-    if ((flags & hasSourcePositionsFlag) != 0) {
-      writer.writePackedUInt30(position + 1);
-      writer.writePackedUInt30(endPosition + 1);
-    }
-    if ((flags & hasTypeArgumentsFlag) != 0) {
-      writer.writePackedUInt30(numTypeArguments);
-    }
-    if ((flags & hasTypeParamsFlag) != 0) {
-      typeParameters.write(writer);
-    }
-    writer.writePackedObject(superType);
-    writer.writePackedList(interfaces);
-    if ((flags & hasAnnotationsFlag) != 0) {
-      writer.writeLinkOffset(annotations);
-    }
-    writer.writeLinkOffset(members);
-    BytecodeSizeStatistics.classesSize += (writer.offset - start);
-  }
-
-  factory ClassDeclaration.read(BufferedReader reader) {
-    final flags = reader.readPackedUInt30();
-    final script = reader.readPackedObject();
-    final position = ((flags & hasSourcePositionsFlag) != 0)
-        ? reader.readPackedUInt30() - 1
-        : TreeNode.noOffset;
-    final endPosition = ((flags & hasSourcePositionsFlag) != 0)
-        ? reader.readPackedUInt30() - 1
-        : TreeNode.noOffset;
-    final numTypeArguments =
-        ((flags & hasTypeArgumentsFlag) != 0) ? reader.readPackedUInt30() : 0;
-    final typeParameters = ((flags & hasTypeParamsFlag) != 0)
-        ? new TypeParametersDeclaration.read(reader)
-        : null;
-    final superType = reader.readPackedObject();
-    final interfaces = reader.readPackedList<ObjectHandle>();
-    final annotations = ((flags & hasAnnotationsFlag) != 0)
-        ? reader.readLinkOffset<AnnotationsDeclaration>()
-        : null;
-    final members = reader.readLinkOffset<Members>();
-    return new ClassDeclaration(
-        null,
-        flags,
-        script,
-        position,
-        endPosition,
-        typeParameters,
-        numTypeArguments,
-        superType,
-        interfaces,
-        members,
-        annotations);
-  }
-
-  @override
-  String toString() {
-    final StringBuffer sb = new StringBuffer();
-    sb.write('Class $name, script = $script');
-    if ((flags & isAbstractFlag) != 0) {
-      sb.write(', abstract');
-    }
-    if ((flags & isEnumFlag) != 0) {
-      sb.write(', enum');
-    }
-    if ((flags & isTransformedMixinApplicationFlag) != 0) {
-      sb.write(', mixin-application');
-    }
-    if ((flags & hasPragmaFlag) != 0) {
-      sb.write(', has-pragma');
-    }
-    if ((flags & hasSourcePositionsFlag) != 0) {
-      sb.write(', pos = $position, end-pos = $endPosition');
-    }
-    sb.writeln();
-    if ((flags & hasTypeParamsFlag) != 0) {
-      sb.write('    type-params $typeParameters (args: $numTypeArguments)\n');
-    }
-    if (superType != null) {
-      sb.write('    extends $superType\n');
-    }
-    if (interfaces.isNotEmpty) {
-      sb.write('    implements $interfaces\n');
-    }
-    if ((flags & hasAnnotationsFlag) != 0) {
-      sb.write('    annotations $annotations\n');
-    }
-    sb.writeln();
-    sb.write(members.toString());
-    return sb.toString();
-  }
-}
-
-class SourceFile extends BytecodeDeclaration {
-  static const hasLineStartsFlag = 1 << 0;
-  static const hasSourceFlag = 1 << 1;
-
-  final ObjectHandle importUri;
-  LineStarts lineStarts;
-  String source;
-
-  SourceFile(this.importUri, [this.lineStarts, this.source]);
-
-  void write(BufferedWriter writer) {
-    int flags = 0;
-    if (lineStarts != null) {
-      flags |= hasLineStartsFlag;
-    }
-    if (source != null && source != '') {
-      flags |= hasSourceFlag;
-    }
-    writer.writePackedUInt30(flags);
-    writer.writePackedObject(importUri);
-    if ((flags & hasLineStartsFlag) != 0) {
-      writer.writeLinkOffset(lineStarts);
-    }
-    if ((flags & hasSourceFlag) != 0) {
-      writer.writePackedStringReference(source);
-    }
-  }
-
-  factory SourceFile.read(BufferedReader reader) {
-    final flags = reader.readPackedUInt30();
-    final importUri = reader.readPackedObject();
-    final lineStarts = ((flags & hasLineStartsFlag) != 0)
-        ? reader.readLinkOffset<LineStarts>()
-        : null;
-    final source = ((flags & hasSourceFlag) != 0)
-        ? reader.readPackedStringReference()
-        : null;
-    return new SourceFile(importUri, lineStarts, source);
-  }
-
-  @override
-  String toString() {
-    final StringBuffer sb = new StringBuffer();
-    sb.write('source: import-uri $importUri');
-    if (source != null && source != '') {
-      sb.write(', ${source.length} text chars');
-    }
-    if (lineStarts != null) {
-      sb.write(', ${lineStarts.lineStarts.length} line starts');
-    }
-    return sb.toString();
-  }
-}
-
-class Members extends BytecodeDeclaration {
-  final List<FieldDeclaration> fields;
-  final List<FunctionDeclaration> functions;
-
-  Members(this.fields, this.functions);
-
-  int countFunctions() {
-    int count = functions.length;
-    for (var field in fields) {
-      if ((field.flags & FieldDeclaration.hasGetterFlag) != 0) {
-        ++count;
-      }
-      if ((field.flags & FieldDeclaration.hasSetterFlag) != 0) {
-        ++count;
-      }
-    }
-    return count;
-  }
-
-  void write(BufferedWriter writer) {
-    final start = writer.offset;
-    writer.writePackedUInt30(countFunctions());
-    writer.writePackedUInt30(fields.length);
-    for (var field in fields) {
-      field.write(writer);
-    }
-    writer.writePackedUInt30(functions.length);
-    for (var func in functions) {
-      func.write(writer);
-    }
-    BytecodeSizeStatistics.membersSize += (writer.offset - start);
-  }
-
-  factory Members.read(BufferedReader reader) {
-    reader.readPackedUInt30(); // numFunctions
-    final fields = new List<FieldDeclaration>.generate(
-        reader.readPackedUInt30(), (_) => new FieldDeclaration.read(reader));
-    final functions = new List<FunctionDeclaration>.generate(
-        reader.readPackedUInt30(), (_) => new FunctionDeclaration.read(reader));
-    return new Members(fields, functions);
-  }
-
-  @override
-  String toString() => "${fields.join('\n')}\n"
-      "${functions.join('\n')}";
-}
-
-class FieldDeclaration {
-  static const hasNontrivialInitializerFlag = 1 << 0;
-  static const hasGetterFlag = 1 << 1;
-  static const hasSetterFlag = 1 << 2;
-  static const isReflectableFlag = 1 << 3;
-  static const isStaticFlag = 1 << 4;
-  static const isConstFlag = 1 << 5;
-  static const isFinalFlag = 1 << 6;
-  static const isCovariantFlag = 1 << 7;
-  static const isGenericCovariantImplFlag = 1 << 8;
-  static const hasSourcePositionsFlag = 1 << 9;
-  static const hasAnnotationsFlag = 1 << 10;
-  static const hasPragmaFlag = 1 << 11;
-  static const hasCustomScriptFlag = 1 << 12;
-  static const hasInitializerCodeFlag = 1 << 13;
-  static const hasAttributesFlag = 1 << 14;
-  static const isLateFlag = 1 << 15;
-  static const isExtensionMemberFlag = 1 << 16;
-  static const hasInitializerFlag = 1 << 17;
-
-  final int flags;
-  final ObjectHandle name;
-  final ObjectHandle type;
-  final ObjectHandle value;
-  final ObjectHandle script;
-  final int position;
-  final int endPosition;
-  final ObjectHandle getterName;
-  final ObjectHandle setterName;
-  final Code initializerCode;
-  final AnnotationsDeclaration annotations;
-  final ObjectHandle attributes;
-
-  FieldDeclaration(
-      this.flags,
-      this.name,
-      this.type,
-      this.value,
-      this.script,
-      this.position,
-      this.endPosition,
-      this.getterName,
-      this.setterName,
-      this.initializerCode,
-      this.annotations,
-      this.attributes);
-
-  void write(BufferedWriter writer) {
-    writer.writePackedUInt30(flags);
-    writer.writePackedObject(name);
-    writer.writePackedObject(type);
-
-    if ((flags & hasCustomScriptFlag) != 0) {
-      writer.writePackedObject(script);
-    }
-    if ((flags & hasSourcePositionsFlag) != 0) {
-      writer.writePackedUInt30(position + 1);
-      writer.writePackedUInt30(endPosition + 1);
-    }
-    if ((flags & hasInitializerCodeFlag) != 0) {
-      writer.writeLinkOffset(initializerCode);
-    }
-    if ((flags & hasNontrivialInitializerFlag) == 0) {
-      writer.writePackedObject(value);
-    }
-    if ((flags & hasGetterFlag) != 0) {
-      writer.writePackedObject(getterName);
-    }
-    if ((flags & hasSetterFlag) != 0) {
-      writer.writePackedObject(setterName);
-    }
-    if ((flags & hasAnnotationsFlag) != 0) {
-      writer.writeLinkOffset(annotations);
-    }
-    if ((flags & hasAttributesFlag) != 0) {
-      writer.writePackedObject(attributes);
-    }
-  }
-
-  factory FieldDeclaration.read(BufferedReader reader) {
-    final flags = reader.readPackedUInt30();
-    final name = reader.readPackedObject();
-    final type = reader.readPackedObject();
-    final script =
-        ((flags & hasCustomScriptFlag) != 0) ? reader.readPackedObject() : null;
-    final position = ((flags & hasSourcePositionsFlag) != 0)
-        ? reader.readPackedUInt30() - 1
-        : TreeNode.noOffset;
-    final endPosition = ((flags & hasSourcePositionsFlag) != 0)
-        ? reader.readPackedUInt30() - 1
-        : TreeNode.noOffset;
-    final initializerCode = ((flags & hasInitializerCodeFlag) != 0)
-        ? reader.readLinkOffset<Code>()
-        : null;
-    final value = ((flags & hasNontrivialInitializerFlag) == 0)
-        ? reader.readPackedObject()
-        : null;
-    final getterName =
-        ((flags & hasGetterFlag) != 0) ? reader.readPackedObject() : null;
-    final setterName =
-        ((flags & hasSetterFlag) != 0) ? reader.readPackedObject() : null;
-    final annotations = ((flags & hasAnnotationsFlag) != 0)
-        ? reader.readLinkOffset<AnnotationsDeclaration>()
-        : null;
-    final attributes =
-        ((flags & hasAttributesFlag) != 0) ? reader.readPackedObject() : null;
-    return new FieldDeclaration(
-        flags,
-        name,
-        type,
-        value,
-        script,
-        position,
-        endPosition,
-        getterName,
-        setterName,
-        initializerCode,
-        annotations,
-        attributes);
-  }
-
-  @override
-  String toString() {
-    final StringBuffer sb = new StringBuffer();
-    sb.write('Field $name, type = $type');
-    if ((flags & hasGetterFlag) != 0) {
-      sb.write(', getter = $getterName');
-    }
-    if ((flags & hasSetterFlag) != 0) {
-      sb.write(', setter = $setterName');
-    }
-    if ((flags & isReflectableFlag) != 0) {
-      sb.write(', reflectable');
-    }
-    if ((flags & isStaticFlag) != 0) {
-      sb.write(', static');
-    }
-    if ((flags & isConstFlag) != 0) {
-      sb.write(', const');
-    }
-    if ((flags & isFinalFlag) != 0) {
-      sb.write(', final');
-    }
-    if ((flags & isLateFlag) != 0) {
-      sb.write(', is-late');
-    }
-    if ((flags & isExtensionMemberFlag) != 0) {
-      sb.write(', extension-member');
-    }
-    if ((flags & hasPragmaFlag) != 0) {
-      sb.write(', has-pragma');
-    }
-    if ((flags & hasCustomScriptFlag) != 0) {
-      sb.write(', custom-script = $script');
-    }
-    if ((flags & hasSourcePositionsFlag) != 0) {
-      sb.write(', pos = $position, end-pos = $endPosition');
-    }
-    if ((flags & hasInitializerFlag) != 0) {
-      sb.write(', has-initializer');
-    }
-    sb.writeln();
-    if ((flags & hasInitializerCodeFlag) != 0) {
-      sb.write('    initializer\n$initializerCode\n');
-    }
-    if ((flags & hasNontrivialInitializerFlag) == 0) {
-      sb.write('    value = $value\n');
-    }
-    if ((flags & hasAnnotationsFlag) != 0) {
-      sb.write('    annotations $annotations\n');
-    }
-    if ((flags & hasAttributesFlag) != 0) {
-      sb.write('    attributes $attributes\n');
-    }
-    return sb.toString();
-  }
-}
-
-class FunctionDeclaration {
-  static const isConstructorFlag = 1 << 0;
-  static const isGetterFlag = 1 << 1;
-  static const isSetterFlag = 1 << 2;
-  static const isFactoryFlag = 1 << 3;
-  static const isStaticFlag = 1 << 4;
-  static const isAbstractFlag = 1 << 5;
-  static const isConstFlag = 1 << 6;
-  static const hasOptionalPositionalParamsFlag = 1 << 7;
-  static const hasOptionalNamedParamsFlag = 1 << 8;
-  static const hasTypeParamsFlag = 1 << 9;
-  static const isReflectableFlag = 1 << 10;
-  static const isDebuggableFlag = 1 << 11;
-  static const isAsyncFlag = 1 << 12;
-  static const isAsyncStarFlag = 1 << 13;
-  static const isSyncStarFlag = 1 << 14;
-  static const isForwardingStubFlag = 1 << 15;
-  static const isNoSuchMethodForwarderFlag = 1 << 16;
-  static const isNativeFlag = 1 << 17;
-  static const isExternalFlag = 1 << 18;
-  static const hasSourcePositionsFlag = 1 << 19;
-  static const hasAnnotationsFlag = 1 << 20;
-  static const hasPragmaFlag = 1 << 21;
-  static const hasCustomScriptFlag = 1 << 22;
-  static const hasAttributesFlag = 1 << 23;
-  static const isExtensionMemberFlag = 1 << 24;
-  static const hasParameterFlagsFlag = 1 << 25;
-
-  final int flags;
-  final ObjectHandle name;
-  final ObjectHandle script;
-  final int position;
-  final int endPosition;
-  final TypeParametersDeclaration typeParameters;
-  final int numRequiredParameters;
-  final List<ParameterDeclaration> parameters;
-  // Only contains the required flag for parameters when present.
-  final List<int> parameterFlags;
-  final ObjectHandle returnType;
-  final ObjectHandle nativeName;
-  final Code code;
-  final AnnotationsDeclaration annotations;
-  final ObjectHandle attributes;
-
-  FunctionDeclaration(
-      this.flags,
-      this.name,
-      this.script,
-      this.position,
-      this.endPosition,
-      this.typeParameters,
-      this.numRequiredParameters,
-      this.parameters,
-      this.parameterFlags,
-      this.returnType,
-      this.nativeName,
-      this.code,
-      this.annotations,
-      this.attributes);
-
-  void write(BufferedWriter writer) {
-    writer.writePackedUInt30(flags);
-    writer.writePackedObject(name);
-    if ((flags & hasCustomScriptFlag) != 0) {
-      writer.writePackedObject(script);
-    }
-    if ((flags & hasSourcePositionsFlag) != 0) {
-      writer.writePackedUInt30(position + 1);
-      writer.writePackedUInt30(endPosition + 1);
-    }
-    if ((flags & hasTypeParamsFlag) != 0) {
-      typeParameters.write(writer);
-    }
-    writer.writePackedUInt30(parameters.length);
-    if ((flags & hasOptionalPositionalParamsFlag) != 0 ||
-        (flags & hasOptionalNamedParamsFlag) != 0) {
-      writer.writePackedUInt30(numRequiredParameters);
-    }
-    for (var param in parameters) {
-      param.write(writer);
-    }
-    if ((flags & hasParameterFlagsFlag) != 0) {
-      writer.writePackedUInt30(parameterFlags.length);
-      parameterFlags.forEach((flags) => writer.writePackedUInt30(flags));
-    }
-    writer.writePackedObject(returnType);
-    if ((flags & isNativeFlag) != 0) {
-      writer.writePackedObject(nativeName);
-    }
-    if ((flags & isAbstractFlag) == 0) {
-      writer.writeLinkOffset(code);
-    }
-    if ((flags & hasAnnotationsFlag) != 0) {
-      writer.writeLinkOffset(annotations);
-    }
-    if ((flags & hasAttributesFlag) != 0) {
-      writer.writePackedObject(attributes);
-    }
-  }
-
-  factory FunctionDeclaration.read(BufferedReader reader) {
-    final flags = reader.readPackedUInt30();
-    final name = reader.readPackedObject();
-
-    final script =
-        ((flags & hasCustomScriptFlag) != 0) ? reader.readPackedObject() : null;
-    final position = ((flags & hasSourcePositionsFlag) != 0)
-        ? reader.readPackedUInt30() - 1
-        : TreeNode.noOffset;
-    final endPosition = ((flags & hasSourcePositionsFlag) != 0)
-        ? reader.readPackedUInt30() - 1
-        : TreeNode.noOffset;
-    final typeParameters = ((flags & hasTypeParamsFlag) != 0)
-        ? new TypeParametersDeclaration.read(reader)
-        : null;
-
-    final numParameters = reader.readPackedUInt30();
-    final numRequiredParameters =
-        ((flags & hasOptionalPositionalParamsFlag) != 0 ||
-                (flags & hasOptionalNamedParamsFlag) != 0)
-            ? reader.readPackedUInt30()
-            : numParameters;
-
-    final parameters = new List<ParameterDeclaration>.generate(
-        numParameters, (_) => new ParameterDeclaration.read(reader));
-    final parameterFlags = ((flags & hasParameterFlagsFlag) != 0)
-        ? List<int>.generate(
-            reader.readPackedUInt30(), (_) => reader.readPackedUInt30())
-        : null;
-    final returnType = reader.readPackedObject();
-    final nativeName =
-        ((flags & isNativeFlag) != 0) ? reader.readPackedObject() : null;
-    final code =
-        ((flags & isAbstractFlag) == 0) ? reader.readLinkOffset<Code>() : null;
-    final annotations = ((flags & hasAnnotationsFlag) != 0)
-        ? reader.readLinkOffset<AnnotationsDeclaration>()
-        : null;
-    final attributes =
-        ((flags & hasAttributesFlag) != 0) ? reader.readPackedObject() : null;
-    return new FunctionDeclaration(
-        flags,
-        name,
-        script,
-        position,
-        endPosition,
-        typeParameters,
-        numRequiredParameters,
-        parameters,
-        parameterFlags,
-        returnType,
-        nativeName,
-        code,
-        annotations,
-        attributes);
-  }
-
-  @override
-  String toString() {
-    final StringBuffer sb = new StringBuffer();
-    sb.write('Function $name');
-    if ((flags & isConstructorFlag) != 0) {
-      sb.write(', constructor');
-    }
-    if ((flags & isGetterFlag) != 0) {
-      sb.write(', getter');
-    }
-    if ((flags & isSetterFlag) != 0) {
-      sb.write(', setter');
-    }
-    if ((flags & isFactoryFlag) != 0) {
-      sb.write(', factory');
-    }
-    if ((flags & isStaticFlag) != 0) {
-      sb.write(', static');
-    }
-    if ((flags & isAbstractFlag) != 0) {
-      sb.write(', abstract');
-    }
-    if ((flags & isConstFlag) != 0) {
-      sb.write(', const');
-    }
-    if ((flags & isExtensionMemberFlag) != 0) {
-      sb.write(', extension-member');
-    }
-    if ((flags & hasOptionalPositionalParamsFlag) != 0) {
-      sb.write(', has-optional-positional-params');
-    }
-    if ((flags & hasOptionalNamedParamsFlag) != 0) {
-      sb.write(', has-optional-named-params');
-    }
-    if ((flags & isReflectableFlag) != 0) {
-      sb.write(', reflectable');
-    }
-    if ((flags & isDebuggableFlag) != 0) {
-      sb.write(', debuggable');
-    }
-    if ((flags & isAsyncFlag) != 0) {
-      sb.write(', async');
-    }
-    if ((flags & isAsyncStarFlag) != 0) {
-      sb.write(', async*');
-    }
-    if ((flags & isSyncStarFlag) != 0) {
-      sb.write(', sync*');
-    }
-    if ((flags & isForwardingStubFlag) != 0) {
-      sb.write(', forwarding-stub');
-    }
-    if ((flags & isNoSuchMethodForwarderFlag) != 0) {
-      sb.write(', no-such-method-forwarder');
-    }
-    if ((flags & isNativeFlag) != 0) {
-      sb.write(', native $nativeName');
-    }
-    if ((flags & isExternalFlag) != 0) {
-      sb.write(', external');
-    }
-    if ((flags & hasPragmaFlag) != 0) {
-      sb.write(', has-pragma');
-    }
-    if ((flags & hasCustomScriptFlag) != 0) {
-      sb.write(', custom-script = $script');
-    }
-    if ((flags & hasSourcePositionsFlag) != 0) {
-      sb.write(', pos = $position, end-pos = $endPosition');
-    }
-    sb.writeln();
-    if ((flags & hasTypeParamsFlag) != 0) {
-      sb.write('    type-params $typeParameters\n');
-    }
-    sb.write('    parameters $parameters (required: $numRequiredParameters)\n');
-    if ((flags & hasParameterFlagsFlag) != 0) {
-      sb.write('    parameter-flags $parameterFlags\n');
-    }
-    sb.write('    return-type $returnType\n');
-    if ((flags & hasAnnotationsFlag) != 0) {
-      sb.write('    annotations $annotations\n');
-    }
-    if ((flags & hasAttributesFlag) != 0) {
-      sb.write('    attributes $attributes\n');
-    }
-    if ((flags & isAbstractFlag) == 0 && (flags & isExternalFlag) == 0) {
-      sb.write('\n$code\n');
-    }
-    return sb.toString();
-  }
-}
-
-class TypeParametersDeclaration {
-  final List<NameAndType> typeParams;
-
-  TypeParametersDeclaration(this.typeParams);
-
-  void write(BufferedWriter writer) {
-    writer.writePackedUInt30(typeParams.length);
-    for (var tp in typeParams) {
-      writer.writePackedObject(tp.name);
-    }
-    for (var tp in typeParams) {
-      writer.writePackedObject(tp.type);
-    }
-  }
-
-  factory TypeParametersDeclaration.read(BufferedReader reader) {
-    final int numTypeParams = reader.readPackedUInt30();
-    List<ObjectHandle> names = new List<ObjectHandle>.generate(
-        numTypeParams, (_) => reader.readPackedObject());
-    List<ObjectHandle> bounds = new List<ObjectHandle>.generate(
-        numTypeParams, (_) => reader.readPackedObject());
-    return new TypeParametersDeclaration(new List<NameAndType>.generate(
-        numTypeParams, (int i) => new NameAndType(names[i], bounds[i])));
-  }
-
-  @override
-  int get hashCode => listHashCode(typeParams);
-
-  @override
-  bool operator ==(other) =>
-      other is TypeParametersDeclaration &&
-      listEquals(this.typeParams, other.typeParams);
-
-  @override
-  String toString() => '<${typeParams.join(', ')}>';
-}
-
-class ParameterDeclaration {
-  // Parameter flags are written separately (in Code).
-  static const isCovariantFlag = 1 << 0;
-  static const isGenericCovariantImplFlag = 1 << 1;
-  static const isFinalFlag = 1 << 2;
-  static const isRequiredFlag = 1 << 3;
-
-  final ObjectHandle name;
-  final ObjectHandle type;
-
-  ParameterDeclaration(this.name, this.type);
-
-  void write(BufferedWriter writer) {
-    writer.writePackedObject(name);
-    writer.writePackedObject(type);
-  }
-
-  factory ParameterDeclaration.read(BufferedReader reader) {
-    final name = reader.readPackedObject();
-    final type = reader.readPackedObject();
-    return new ParameterDeclaration(name, type);
-  }
-
-  @override
-  String toString() => '$type $name';
-}
-
-class Code extends BytecodeDeclaration {
-  static const hasExceptionsTableFlag = 1 << 0;
-  static const hasSourcePositionsFlag = 1 << 1;
-  static const hasNullableFieldsFlag = 1 << 2;
-  static const hasClosuresFlag = 1 << 3;
-  static const hasParameterFlagsFlag = 1 << 4;
-  static const hasForwardingStubTargetFlag = 1 << 5;
-  static const hasDefaultFunctionTypeArgsFlag = 1 << 6;
-  static const hasLocalVariablesFlag = 1 << 7;
-
-  final ConstantPool constantPool;
-  final Uint8List bytecodes;
-  final ExceptionsTable exceptionsTable;
-  final SourcePositions sourcePositions;
-  final LocalVariableTable localVariables;
-  final List<ObjectHandle> nullableFields;
-  final List<ClosureDeclaration> closures;
-  // Contains all parameter flags except for the required flags, which are
-  // kept instead in the FunctionDeclaration and ClosureDeclaration.
-  final List<int> parameterFlags;
-  final int forwardingStubTargetCpIndex;
-  final int defaultFunctionTypeArgsCpIndex;
-
-  bool get hasExceptionsTable => exceptionsTable.blocks.isNotEmpty;
-  bool get hasSourcePositions =>
-      sourcePositions != null && sourcePositions.isNotEmpty;
-  bool get hasLocalVariables =>
-      localVariables != null && localVariables.isNotEmpty;
-  bool get hasNullableFields => nullableFields.isNotEmpty;
-  bool get hasClosures => closures.isNotEmpty;
-
-  int get flags =>
-      (hasExceptionsTable ? hasExceptionsTableFlag : 0) |
-      (hasSourcePositions ? hasSourcePositionsFlag : 0) |
-      (hasNullableFields ? hasNullableFieldsFlag : 0) |
-      (hasClosures ? hasClosuresFlag : 0) |
-      (parameterFlags != null ? hasParameterFlagsFlag : 0) |
-      (forwardingStubTargetCpIndex != null ? hasForwardingStubTargetFlag : 0) |
-      (defaultFunctionTypeArgsCpIndex != null
-          ? hasDefaultFunctionTypeArgsFlag
-          : 0) |
-      (hasLocalVariables ? hasLocalVariablesFlag : 0);
-
-  Code(
-      this.constantPool,
-      this.bytecodes,
-      this.exceptionsTable,
-      this.sourcePositions,
-      this.localVariables,
-      this.nullableFields,
-      this.closures,
-      this.parameterFlags,
-      this.forwardingStubTargetCpIndex,
-      this.defaultFunctionTypeArgsCpIndex);
-
-  void write(BufferedWriter writer) {
-    final start = writer.offset;
-    writer.writePackedUInt30(flags);
-    if (parameterFlags != null) {
-      writer.writePackedUInt30(parameterFlags.length);
-      parameterFlags.forEach((flags) => writer.writePackedUInt30(flags));
-    }
-    if (forwardingStubTargetCpIndex != null) {
-      writer.writePackedUInt30(forwardingStubTargetCpIndex);
-    }
-    if (defaultFunctionTypeArgsCpIndex != null) {
-      writer.writePackedUInt30(defaultFunctionTypeArgsCpIndex);
-    }
-    if (hasClosures) {
-      writer.writePackedUInt30(closures.length);
-      closures.forEach((c) => c.write(writer));
-    }
-    constantPool.write(writer);
-    _writeBytecodeInstructions(writer, bytecodes);
-    if (hasExceptionsTable) {
-      exceptionsTable.write(writer);
-    }
-    if (hasSourcePositions) {
-      writer.writeLinkOffset(sourcePositions);
-    }
-    if (hasLocalVariables) {
-      writer.writeLinkOffset(localVariables);
-    }
-    if (hasNullableFields) {
-      writer.writePackedList(nullableFields);
-    }
-    if (hasClosures) {
-      closures.forEach((c) => c.code.write(writer));
-    }
-    BytecodeSizeStatistics.codeSize += (writer.offset - start);
-  }
-
-  factory Code.read(BufferedReader reader) {
-    int flags = reader.readPackedUInt30();
-    final parameterFlags = ((flags & hasParameterFlagsFlag) != 0)
-        ? new List<int>.generate(
-            reader.readPackedUInt30(), (_) => reader.readPackedUInt30())
-        : null;
-    final forwardingStubTargetCpIndex =
-        ((flags & hasForwardingStubTargetFlag) != 0)
-            ? reader.readPackedUInt30()
-            : null;
-    final defaultFunctionTypeArgsCpIndex =
-        ((flags & hasDefaultFunctionTypeArgsFlag) != 0)
-            ? reader.readPackedUInt30()
-            : null;
-    final List<ClosureDeclaration> closures = ((flags & hasClosuresFlag) != 0)
-        ? new List<ClosureDeclaration>.generate(reader.readPackedUInt30(),
-            (_) => new ClosureDeclaration.read(reader))
-        : const <ClosureDeclaration>[];
-    final ConstantPool constantPool = new ConstantPool.read(reader);
-    final Uint8List bytecodes = _readBytecodeInstructions(reader);
-    final exceptionsTable = ((flags & hasExceptionsTableFlag) != 0)
-        ? new ExceptionsTable.read(reader)
-        : new ExceptionsTable();
-    final sourcePositions = ((flags & hasSourcePositionsFlag) != 0)
-        ? reader.readLinkOffset<SourcePositions>()
-        : null;
-    final localVariables = ((flags & hasLocalVariablesFlag) != 0)
-        ? reader.readLinkOffset<LocalVariableTable>()
-        : null;
-    final List<ObjectHandle> nullableFields =
-        ((flags & hasNullableFieldsFlag) != 0)
-            ? reader.readPackedList<ObjectHandle>()
-            : const <ObjectHandle>[];
-    for (var c in closures) {
-      c.code = new ClosureCode.read(reader);
-    }
-    return new Code(
-        constantPool,
-        bytecodes,
-        exceptionsTable,
-        sourcePositions,
-        localVariables,
-        nullableFields,
-        closures,
-        parameterFlags,
-        forwardingStubTargetCpIndex,
-        defaultFunctionTypeArgsCpIndex);
-  }
-
-  // TODO(alexmarkov): Consider printing constant pool before bytecode.
-  @override
-  String toString() => "Bytecode {\n"
-      "${new BytecodeDisassembler().disassemble(bytecodes, exceptionsTable, annotations: [
-        hasSourcePositions
-            ? sourcePositions.getBytecodeAnnotations()
-            : const <int, String>{},
-        hasLocalVariables
-            ? localVariables.getBytecodeAnnotations()
-            : const <int, String>{}
-      ])}}\n"
-      "$exceptionsTable"
-      "${nullableFields.isEmpty ? '' : 'Nullable fields: $nullableFields\n'}"
-      "${parameterFlags == null ? '' : 'Parameter flags: $parameterFlags\n'}"
-      "${forwardingStubTargetCpIndex == null ? '' : 'Forwarding stub target: CP#$forwardingStubTargetCpIndex\n'}"
-      "${defaultFunctionTypeArgsCpIndex == null ? '' : 'Default function type arguments: CP#$defaultFunctionTypeArgsCpIndex\n'}"
-      "$constantPool"
-      "${closures.join('\n')}";
-}
-
-class ClosureDeclaration {
-  static const hasOptionalPositionalParamsFlag = 1 << 0;
-  static const hasOptionalNamedParamsFlag = 1 << 1;
-  static const hasTypeParamsFlag = 1 << 2;
-  static const hasSourcePositionsFlag = 1 << 3;
-  static const isAsyncFlag = 1 << 4;
-  static const isAsyncStarFlag = 1 << 5;
-  static const isSyncStarFlag = 1 << 6;
-  static const isDebuggableFlag = 1 << 7;
-  static const hasAttributesFlag = 1 << 8;
-  static const hasParameterFlagsFlag = 1 << 9;
-
-  int flags;
-  final ObjectHandle parent;
-  final ObjectHandle name;
-  final int position;
-  final int endPosition;
-  final List<NameAndType> typeParams;
-  final int numRequiredParams;
-  final int numNamedParams;
-  final List<NameAndType> parameters;
-  // Only contains the required flag for parameters when present.
-  final List<int> parameterFlags;
-  final ObjectHandle returnType;
-  ObjectHandle attributes;
-  ClosureCode code;
-
-  ClosureDeclaration(
-      this.flags,
-      this.parent,
-      this.name,
-      this.position,
-      this.endPosition,
-      this.typeParams,
-      this.numRequiredParams,
-      this.numNamedParams,
-      this.parameters,
-      this.parameterFlags,
-      this.returnType,
-      [this.attributes]);
-
-  void write(BufferedWriter writer) {
-    writer.writePackedUInt30(flags);
-    writer.writePackedObject(parent);
-    writer.writePackedObject(name);
-
-    if (flags & hasSourcePositionsFlag != 0) {
-      writer.writePackedUInt30(position + 1);
-      writer.writePackedUInt30(endPosition + 1);
-    }
-
-    if (flags & hasTypeParamsFlag != 0) {
-      writer.writePackedUInt30(typeParams.length);
-      for (var tp in typeParams) {
-        writer.writePackedObject(tp.name);
-      }
-      for (var tp in typeParams) {
-        writer.writePackedObject(tp.type);
-      }
-    }
-    writer.writePackedUInt30(parameters.length);
-    if (flags &
-            (hasOptionalPositionalParamsFlag | hasOptionalNamedParamsFlag) !=
-        0) {
-      writer.writePackedUInt30(numRequiredParams);
-    }
-    for (var param in parameters) {
-      writer.writePackedObject(param.name);
-      writer.writePackedObject(param.type);
-    }
-    if ((flags & hasParameterFlagsFlag) != 0) {
-      writer.writePackedUInt30(parameterFlags.length);
-      for (var pf in parameterFlags) {
-        writer.writePackedUInt30(pf);
-      }
-    }
-    writer.writePackedObject(returnType);
-    if ((flags & hasAttributesFlag) != 0) {
-      writer.writePackedObject(attributes);
-    }
-  }
-
-  factory ClosureDeclaration.read(BufferedReader reader) {
-    final int flags = reader.readPackedUInt30();
-    final parent = reader.readPackedObject();
-    final name = reader.readPackedObject();
-    final position = ((flags & hasSourcePositionsFlag) != 0)
-        ? reader.readPackedUInt30() - 1
-        : TreeNode.noOffset;
-    final endPosition = ((flags & hasSourcePositionsFlag) != 0)
-        ? reader.readPackedUInt30() - 1
-        : TreeNode.noOffset;
-    List<NameAndType> typeParams;
-    if ((flags & hasTypeParamsFlag) != 0) {
-      final int numTypeParams = reader.readPackedUInt30();
-      List<ObjectHandle> names = new List<ObjectHandle>.generate(
-          numTypeParams, (_) => reader.readPackedObject());
-      List<ObjectHandle> bounds = new List<ObjectHandle>.generate(
-          numTypeParams, (_) => reader.readPackedObject());
-      typeParams = new List<NameAndType>.generate(
-          numTypeParams, (int i) => new NameAndType(names[i], bounds[i]));
-    } else {
-      typeParams = const <NameAndType>[];
-    }
-    final numParams = reader.readPackedUInt30();
-    final numRequiredParams = (flags &
-                (hasOptionalPositionalParamsFlag |
-                    hasOptionalNamedParamsFlag) !=
-            0)
-        ? reader.readPackedUInt30()
-        : numParams;
-    final numNamedParams = (flags & hasOptionalNamedParamsFlag != 0)
-        ? (numParams - numRequiredParams)
-        : 0;
-    final List<NameAndType> parameters = new List<NameAndType>.generate(
-        numParams,
-        (_) => new NameAndType(
-            reader.readPackedObject(), reader.readPackedObject()));
-    List<int> parameterFlags;
-    if ((flags & hasParameterFlagsFlag) != 0) {
-      final int numParameterFlags = reader.readPackedUInt30();
-      new List<int>.generate(
-          numParameterFlags, (_) => reader.readPackedUInt30());
-    } else {
-      parameterFlags = const <int>[];
-    }
-    final returnType = reader.readPackedObject();
-    final attributes =
-        ((flags & hasAttributesFlag) != 0) ? reader.readPackedObject() : null;
-    return new ClosureDeclaration(
-        flags,
-        parent,
-        name,
-        position,
-        endPosition,
-        typeParams,
-        numRequiredParams,
-        numNamedParams,
-        parameters,
-        parameterFlags,
-        returnType,
-        attributes);
-  }
-
-  void _writeParamsToBuffer(
-      StringBuffer sb, List<NameAndType> params, List<int> flags) {
-    assert(flags == null || (params.length == flags.length));
-    for (int i = 0; i < params.length; i++) {
-      if (i != 0) {
-        sb.write(', ');
-      }
-      // We only store the required flag for ClosureDeclarations.
-      if (flags != null && flags[i] != 0) {
-        sb.write('required ');
-      }
-      sb.write(params[i]);
-    }
-  }
-
-  @override
-  String toString() {
-    final StringBuffer sb = new StringBuffer();
-    sb.write('Closure $parent::$name');
-    if ((flags & isAsyncFlag) != 0) {
-      sb.write(' async');
-    }
-    if ((flags & isAsyncStarFlag) != 0) {
-      sb.write(' async*');
-    }
-    if ((flags & isSyncStarFlag) != 0) {
-      sb.write(' sync*');
-    }
-    if (position != TreeNode.noOffset) {
-      sb.write(' pos = $position, end-pos = $endPosition');
-    }
-    if (typeParams.isNotEmpty) {
-      sb.write(' <${typeParams.join(', ')}>');
-    }
-    sb.write(' (');
-    final requiredFlags = (flags & hasParameterFlagsFlag) != 0
-        ? parameterFlags.sublist(0, numRequiredParams)
-        : null;
-    _writeParamsToBuffer(
-        sb, parameters.sublist(0, numRequiredParams), requiredFlags);
-    if (numRequiredParams != parameters.length) {
-      if (numRequiredParams > 0) {
-        sb.write(', ');
-      }
-      sb.write(numNamedParams > 0 ? '{ ' : '[ ');
-      final optionalFlags = (flags & hasParameterFlagsFlag) != 0
-          ? parameterFlags.sublist(numRequiredParams)
-          : null;
-      _writeParamsToBuffer(
-          sb, parameters.sublist(numRequiredParams), optionalFlags);
-      sb.write(numNamedParams > 0 ? ' }' : ' ]');
-    }
-    sb.write(') -> ');
-    sb.writeln(returnType);
-    if ((flags & hasAttributesFlag) != 0) {
-      sb.write('    attributes $attributes\n');
-    }
-    if (code != null) {
-      sb.write(code.toString());
-    }
-    return sb.toString();
-  }
-}
-
-/// Bytecode of a nested function (closure).
-/// Closures share the constant pool of a top-level member.
-class ClosureCode {
-  static const hasExceptionsTableFlag = 1 << 0;
-  static const hasSourcePositionsFlag = 1 << 1;
-  static const hasLocalVariablesFlag = 1 << 2;
-
-  final Uint8List bytecodes;
-  final ExceptionsTable exceptionsTable;
-  final SourcePositions sourcePositions;
-  final LocalVariableTable localVariables;
-
-  bool get hasExceptionsTable => exceptionsTable.blocks.isNotEmpty;
-  bool get hasSourcePositions =>
-      sourcePositions != null && sourcePositions.isNotEmpty;
-  bool get hasLocalVariables =>
-      localVariables != null && localVariables.isNotEmpty;
-
-  int get flags =>
-      (hasExceptionsTable ? hasExceptionsTableFlag : 0) |
-      (hasSourcePositions ? hasSourcePositionsFlag : 0) |
-      (hasLocalVariables ? hasLocalVariablesFlag : 0);
-
-  ClosureCode(this.bytecodes, this.exceptionsTable, this.sourcePositions,
-      this.localVariables);
-
-  void write(BufferedWriter writer) {
-    writer.writePackedUInt30(flags);
-    _writeBytecodeInstructions(writer, bytecodes);
-    if (hasExceptionsTable) {
-      exceptionsTable.write(writer);
-    }
-    if (hasSourcePositions) {
-      writer.writeLinkOffset(sourcePositions);
-    }
-    if (hasLocalVariables) {
-      writer.writeLinkOffset(localVariables);
-    }
-  }
-
-  factory ClosureCode.read(BufferedReader reader) {
-    final int flags = reader.readPackedUInt30();
-    final Uint8List bytecodes = _readBytecodeInstructions(reader);
-    final exceptionsTable = ((flags & hasExceptionsTableFlag) != 0)
-        ? new ExceptionsTable.read(reader)
-        : new ExceptionsTable();
-    final sourcePositions = ((flags & hasSourcePositionsFlag) != 0)
-        ? reader.readLinkOffset<SourcePositions>()
-        : null;
-    final localVariables = ((flags & hasLocalVariablesFlag) != 0)
-        ? reader.readLinkOffset<LocalVariableTable>()
-        : null;
-    return new ClosureCode(
-        bytecodes, exceptionsTable, sourcePositions, localVariables);
-  }
-
-  @override
-  String toString() {
-    StringBuffer sb = new StringBuffer();
-    sb.writeln('ClosureCode {');
-    sb.write(new BytecodeDisassembler()
-        .disassemble(bytecodes, exceptionsTable, annotations: [
-      hasSourcePositions
-          ? sourcePositions.getBytecodeAnnotations()
-          : const <int, String>{},
-      hasLocalVariables
-          ? localVariables.getBytecodeAnnotations()
-          : const <int, String>{}
-    ]));
-    sb.writeln('}');
-    return sb.toString();
-  }
-}
-
-class AnnotationsDeclaration extends BytecodeDeclaration {
-  final ObjectHandle object;
-
-  AnnotationsDeclaration(this.object);
-
-  void write(BufferedWriter writer) {
-    writer.writePackedObject(object);
-  }
-
-  factory AnnotationsDeclaration.read(BufferedReader reader) {
-    return new AnnotationsDeclaration(reader.readPackedObject());
-  }
-
-  @override
-  String toString() => object.toString();
-}
-
-class _Section {
-  int numItems;
-  int offset;
-  BufferedWriter writer;
-
-  _Section(this.numItems, this.writer);
-
-  int get size => writer.offset;
-}
-
-class Component {
-  static const int magicValue = 0x44424332; // 'DBC2'
-  static const int numSections = 14;
-  static const int sectionAlignment = 4;
-
-  //  UInt32 magic, version, numSections x (numItems, offset)
-  static const int headerSize = (2 + numSections * 2) * 4;
-
-  int version;
-  StringTable stringTable;
-  ObjectTable objectTable;
-  final List<LibraryDeclaration> libraries = <LibraryDeclaration>[];
-  final List<ClassDeclaration> classes = <ClassDeclaration>[];
-  final List<Members> members = <Members>[];
-  final List<Code> codes = <Code>[];
-  final List<SourcePositions> sourcePositions = <SourcePositions>[];
-  final List<LineStarts> lineStarts = <LineStarts>[];
-  final List<SourceFile> sourceFiles = <SourceFile>[];
-  final Map<Uri, SourceFile> uriToSource = <Uri, SourceFile>{};
-  final List<LocalVariableTable> localVariables = <LocalVariableTable>[];
-  final List<AnnotationsDeclaration> annotations = <AnnotationsDeclaration>[];
-  Set<String> protectedNames;
-  ObjectHandle mainLibrary;
-
-  Component(this.version, CoreTypes coreTypes)
-      : stringTable = new StringTable(),
-        objectTable = new ObjectTable(coreTypes);
-
-  void write(BufferedWriter writer) {
-    objectTable.allocateIndexTable();
-
-    // Write sections to their own buffers in reverse order as section may
-    // reference data structures from successor sections by offsets.
-
-    final protectedNamesWriter = new BufferedWriter.fromWriter(writer);
-    if (protectedNames != null && protectedNames.isNotEmpty) {
-      for (var name in protectedNames) {
-        protectedNamesWriter.writePackedStringReference(name);
-      }
-    }
-
-    final annotationsWriter = new BufferedWriter.fromWriter(writer);
-    for (var annot in annotations) {
-      writer.linkWriter.put(annot, annotationsWriter.offset);
-      annot.write(annotationsWriter);
-    }
-    BytecodeSizeStatistics.annotationsSize += annotationsWriter.offset;
-
-    final localVariablesWriter = new BufferedWriter.fromWriter(writer);
-    for (var lv in localVariables) {
-      writer.linkWriter.put(lv, localVariablesWriter.offset);
-      lv.write(localVariablesWriter);
-    }
-    BytecodeSizeStatistics.localVariablesSize += localVariablesWriter.offset;
-
-    final lineStartsWriter = new BufferedWriter.fromWriter(writer);
-    for (var ls in lineStarts) {
-      writer.linkWriter.put(ls, lineStartsWriter.offset);
-      ls.write(lineStartsWriter);
-    }
-    BytecodeSizeStatistics.lineStartsSize += lineStartsWriter.offset;
-
-    final sourceFilesWriter = new BufferedWriter.fromWriter(writer);
-    for (var sf in sourceFiles) {
-      writer.linkWriter.put(sf, sourceFilesWriter.offset);
-      sf.write(sourceFilesWriter);
-    }
-    BytecodeSizeStatistics.sourceFilesSize += sourceFilesWriter.offset;
-
-    final sourcePositionsWriter = new BufferedWriter.fromWriter(writer);
-    for (var sp in sourcePositions) {
-      writer.linkWriter.put(sp, sourcePositionsWriter.offset);
-      sp.write(sourcePositionsWriter);
-    }
-    BytecodeSizeStatistics.sourcePositionsSize += sourcePositionsWriter.offset;
-
-    final codesWriter = new BufferedWriter.fromWriter(writer);
-    for (var code in codes) {
-      writer.linkWriter.put(code, codesWriter.offset);
-      code.write(codesWriter);
-    }
-
-    final membersWriter = new BufferedWriter.fromWriter(writer);
-    for (var m in members) {
-      writer.linkWriter.put(m, membersWriter.offset);
-      m.write(membersWriter);
-    }
-
-    final classesWriter = new BufferedWriter.fromWriter(writer);
-    for (var cls in classes) {
-      writer.linkWriter.put(cls, classesWriter.offset);
-      cls.write(classesWriter);
-    }
-
-    final librariesWriter = new BufferedWriter.fromWriter(writer);
-    for (var library in libraries) {
-      writer.linkWriter.put(library, librariesWriter.offset);
-      library.write(librariesWriter);
-    }
-
-    final libraryIndexWriter = new BufferedWriter.fromWriter(writer);
-    for (var library in libraries) {
-      libraryIndexWriter.writePackedObject(library.importUri);
-      libraryIndexWriter.writeLinkOffset(library);
-    }
-    BytecodeSizeStatistics.librariesSize += libraryIndexWriter.offset;
-
-    BufferedWriter mainWriter;
-    if (mainLibrary != null) {
-      mainWriter = new BufferedWriter.fromWriter(writer);
-      mainWriter.writePackedObject(mainLibrary);
-    }
-
-    final objectsWriter = new BufferedWriter.fromWriter(writer);
-    objectTable.write(objectsWriter);
-
-    final stringsWriter = new BufferedWriter.fromWriter(writer);
-    stringTable.write(stringsWriter);
-
-    List<_Section> sections = [
-      new _Section(0, stringsWriter),
-      new _Section(0, objectsWriter),
-      new _Section(0, mainWriter),
-      new _Section(libraries.length, libraryIndexWriter),
-      new _Section(libraries.length, librariesWriter),
-      new _Section(classes.length, classesWriter),
-      new _Section(members.length, membersWriter),
-      new _Section(codes.length, codesWriter),
-      new _Section(sourcePositions.length, sourcePositionsWriter),
-      new _Section(sourceFiles.length, sourceFilesWriter),
-      new _Section(lineStarts.length, lineStartsWriter),
-      new _Section(localVariables.length, localVariablesWriter),
-      new _Section(annotations.length, annotationsWriter),
-      new _Section(protectedNames != null ? protectedNames.length : 0,
-          protectedNamesWriter),
-    ];
-    assert(sections.length == numSections);
-
-    int offset = headerSize;
-    for (var section in sections) {
-      if (section.writer != null) {
-        section.offset = offset;
-        offset += section.size;
-      } else {
-        section.offset = 0;
-      }
-    }
-
-    final start = writer.offset;
-
-    writer.writeUInt32(magicValue);
-    writer.writeUInt32(version);
-    for (var section in sections) {
-      writer.writeUInt32(section.numItems);
-      writer.writeUInt32(section.offset);
-    }
-    assert(writer.offset - start == headerSize);
-    for (var section in sections) {
-      if (section.writer != null) {
-        assert(writer.offset - start == section.offset);
-        writer.appendWriter(section.writer);
-      }
-    }
-
-    BytecodeSizeStatistics.componentSize += (writer.offset - start);
-  }
-
-  Component.read(BufferedReader reader) {
-    final int start = reader.offset;
-
-    final int magic = reader.readUInt32();
-    if (magic != magicValue) {
-      throw 'Error: unexpected bytecode magic $magic';
-    }
-
-    version = reader.readUInt32();
-    if (version != currentBytecodeFormatVersion) {
-      throw 'Error: unexpected bytecode format version $version';
-    }
-
-    reader.formatVersion = version;
-
-    reader.readUInt32();
-    final stringTableOffset = reader.readUInt32();
-
-    reader.readUInt32();
-    final objectTableOffset = reader.readUInt32();
-
-    reader.readUInt32();
-    final mainOffset = reader.readUInt32();
-
-    final librariesNum = reader.readUInt32();
-    final libraryIndexOffset = reader.readUInt32();
-
-    reader.readUInt32();
-    final librariesOffset = reader.readUInt32();
-
-    final classesNum = reader.readUInt32();
-    final classesOffset = reader.readUInt32();
-
-    final membersNum = reader.readUInt32();
-    final membersOffset = reader.readUInt32();
-
-    final codesNum = reader.readUInt32();
-    final codesOffset = reader.readUInt32();
-
-    final sourcePositionsNum = reader.readUInt32();
-    final sourcePositionsOffset = reader.readUInt32();
-
-    final sourceFilesNum = reader.readUInt32();
-    final sourceFilesOffset = reader.readUInt32();
-
-    final lineStartsNum = reader.readUInt32();
-    final lineStartsOffset = reader.readUInt32();
-
-    final localVariablesNum = reader.readUInt32();
-    final localVariablesOffset = reader.readUInt32();
-
-    final annotationsNum = reader.readUInt32();
-    final annotationsOffset = reader.readUInt32();
-
-    final protectedNamesNum = reader.readUInt32();
-    final protectedNamesOffset = reader.readUInt32();
-
-    reader.offset = start + stringTableOffset;
-    stringTable = new StringTable.read(reader);
-    reader.stringReader = stringTable;
-
-    reader.offset = start + objectTableOffset;
-    objectTable = new ObjectTable.read(reader);
-    reader.objectReader = objectTable;
-
-    // Read sections in the reverse order as section may reference
-    // successor sections by offsets.
-
-    if (protectedNamesNum != 0) {
-      protectedNames = new Set<String>();
-      reader.offset = start + protectedNamesOffset;
-      for (int i = 0; i < protectedNamesNum; ++i) {
-        protectedNames.add(reader.readPackedStringReference());
-      }
-    }
-
-    final annotationsStart = start + annotationsOffset;
-    reader.offset = annotationsStart;
-    for (int i = 0; i < annotationsNum; ++i) {
-      int offset = reader.offset - annotationsStart;
-      AnnotationsDeclaration annot = new AnnotationsDeclaration.read(reader);
-      reader.linkReader.setOffset(annot, offset);
-      annotations.add(annot);
-    }
-
-    final lineStartsStart = start + lineStartsOffset;
-    reader.offset = lineStartsStart;
-    for (int i = 0; i < lineStartsNum; ++i) {
-      int offset = reader.offset - lineStartsStart;
-      LineStarts ls = new LineStarts.read(reader);
-      reader.linkReader.setOffset(ls, offset);
-      lineStarts.add(ls);
-    }
-
-    final sourceFilesStart = start + sourceFilesOffset;
-    reader.offset = sourceFilesStart;
-    for (int i = 0; i < sourceFilesNum; ++i) {
-      int offset = reader.offset - sourceFilesStart;
-      SourceFile sf = new SourceFile.read(reader);
-      reader.linkReader.setOffset(sf, offset);
-      sourceFiles.add(sf);
-    }
-
-    final sourcePositionsStart = start + sourcePositionsOffset;
-    reader.offset = sourcePositionsStart;
-    for (int i = 0; i < sourcePositionsNum; ++i) {
-      int offset = reader.offset - sourcePositionsStart;
-      SourcePositions sp = new SourcePositions.read(reader);
-      reader.linkReader.setOffset(sp, offset);
-      sourcePositions.add(sp);
-    }
-
-    final localVariablesStart = start + localVariablesOffset;
-    reader.offset = localVariablesStart;
-    for (int i = 0; i < localVariablesNum; ++i) {
-      int offset = reader.offset - localVariablesStart;
-      LocalVariableTable lv = new LocalVariableTable.read(reader);
-      reader.linkReader.setOffset(lv, offset);
-      localVariables.add(lv);
-    }
-
-    final codesStart = start + codesOffset;
-    reader.offset = codesStart;
-    for (int i = 0; i < codesNum; ++i) {
-      int offset = reader.offset - codesStart;
-      Code code = new Code.read(reader);
-      reader.linkReader.setOffset(code, offset);
-      codes.add(code);
-    }
-
-    final membersStart = start + membersOffset;
-    reader.offset = membersStart;
-    for (int i = 0; i < membersNum; ++i) {
-      int offset = reader.offset - membersStart;
-      Members m = new Members.read(reader);
-      reader.linkReader.setOffset(m, offset);
-      members.add(m);
-    }
-
-    final classesStart = start + classesOffset;
-    reader.offset = classesStart;
-    for (int i = 0; i < classesNum; ++i) {
-      int offset = reader.offset - classesStart;
-      ClassDeclaration cls = new ClassDeclaration.read(reader);
-      reader.linkReader.setOffset(cls, offset);
-      classes.add(cls);
-    }
-
-    final librariesStart = start + librariesOffset;
-    reader.offset = librariesStart;
-    for (int i = 0; i < librariesNum; ++i) {
-      int offset = reader.offset - librariesStart;
-      LibraryDeclaration library = new LibraryDeclaration.read(reader);
-      reader.linkReader.setOffset(library, offset);
-      libraries.add(library);
-    }
-
-    final libraryIndexStart = start + libraryIndexOffset;
-    reader.offset = libraryIndexStart;
-    for (int i = 0; i < librariesNum; ++i) {
-      final importUri = reader.readPackedObject();
-      final library = reader.readLinkOffset<LibraryDeclaration>();
-      library.importUri = importUri;
-    }
-
-    if (mainOffset != 0) {
-      reader.offset = start + mainOffset;
-      mainLibrary = reader.readPackedObject();
-    }
-  }
-
-  @override
-  String toString() {
-    final StringBuffer sb = new StringBuffer();
-    sb.write("Bytecode (version: ");
-    if (version == currentBytecodeFormatVersion) {
-      sb.write("stable");
-    } else {
-      sb.write("v$version");
-    }
-    sb.writeln(")");
-    if (mainLibrary != null) {
-      sb.writeln("Main library: $mainLibrary");
-    }
-    for (var library in libraries) {
-      sb.write(library);
-    }
-    return sb.toString();
-  }
-}
-
-void _writeBytecodeInstructions(BufferedWriter writer, Uint8List bytecodes) {
-  writer.writePackedUInt30(bytecodes.length);
-  writer.appendUint8List(bytecodes);
-  BytecodeSizeStatistics.instructionsSize += bytecodes.length;
-}
-
-Uint8List _readBytecodeInstructions(BufferedReader reader) {
-  int len = reader.readPackedUInt30();
-  return reader.readBytesAsUint8List(len);
-}
diff --git a/pkg/vm/lib/bytecode/disassembler.dart b/pkg/vm/lib/bytecode/disassembler.dart
deleted file mode 100644
index 5d53446..0000000
--- a/pkg/vm/lib/bytecode/disassembler.dart
+++ /dev/null
@@ -1,242 +0,0 @@
-// Copyright (c) 2018, 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.
-
-library vm.bytecode.disassembler;
-
-import 'dart:typed_data';
-
-import 'package:kernel/ast.dart' show listEquals, listHashCode;
-
-import 'dbc.dart';
-import 'exceptions.dart';
-
-class Instruction {
-  final Opcode opcode;
-  final bool isWide;
-  final List<int> operands;
-  final int pc;
-
-  Instruction(this.opcode, this.isWide, this.operands, this.pc);
-
-  Format get format => BytecodeFormats[opcode];
-
-  int get length => instructionSize(format.encoding, isWide);
-
-  @override
-  int get hashCode => opcode.index.hashCode ^ listHashCode(operands);
-
-  @override
-  bool operator ==(other) {
-    return (other is Instruction) &&
-        (opcode == other.opcode) &&
-        listEquals(operands, other.operands);
-  }
-}
-
-class BytecodeDisassembler {
-  Uint8List _bytecode;
-  List<Instruction> _instructions;
-  int _labelCount;
-  Map<int, String> _labels;
-  Map<int, List<String>> _markers;
-
-  String disassemble(List<int> bytecode, ExceptionsTable exceptionsTable,
-      {List<Map<int, String>> annotations}) {
-    _init(bytecode);
-    _scanForJumpTargets();
-    _markTryBlocks(exceptionsTable);
-    if (annotations != null) {
-      _markAnnotations(annotations);
-    }
-    return _disasm();
-  }
-
-  List<Instruction> decode(Uint8List bytecode) {
-    _init(bytecode);
-    return _instructions;
-  }
-
-  void _init(List<int> bytecode) {
-    _bytecode = new Uint8List.fromList(bytecode);
-
-    _instructions = new List<Instruction>();
-    for (int pos = 0; pos < _bytecode.length;) {
-      final instr = decodeInstructionAt(pos);
-      _instructions.add(instr);
-      pos += instr.length;
-    }
-
-    _labelCount = 0;
-    _labels = <int, String>{};
-    _markers = <int, List<String>>{};
-  }
-
-  Instruction decodeInstructionAt(int pos) {
-    Opcode opcode = Opcode.values[_bytecode[pos]];
-    bool isWide = isWideOpcode(opcode);
-    if (isWide) {
-      opcode = fromWideOpcode(opcode);
-    }
-
-    final format = BytecodeFormats[opcode];
-    final operands = _decodeOperands(format, pos, isWide);
-    return new Instruction(opcode, isWide, operands, pos);
-  }
-
-  List<int> _decodeOperands(Format format, int pos, bool isWide) {
-    switch (format.encoding) {
-      case Encoding.k0:
-        return const [];
-      case Encoding.kA:
-        return [_bytecode[pos + 1]];
-      case Encoding.kD:
-        return isWide ? [_decodeUint32At(pos + 1)] : [_bytecode[pos + 1]];
-      case Encoding.kX:
-        return isWide
-            ? [_decodeUint32At(pos + 1).toSigned(32)]
-            : [_bytecode[pos + 1].toSigned(8)];
-      case Encoding.kT:
-        return isWide
-            ? [
-                (_bytecode[pos + 1] +
-                        (_bytecode[pos + 2] << 8) +
-                        (_bytecode[pos + 3] << 16))
-                    .toSigned(24)
-              ]
-            : [_bytecode[pos + 1].toSigned(8)];
-      case Encoding.kAE:
-        return [
-          _bytecode[pos + 1],
-          isWide ? _decodeUint32At(pos + 2) : _bytecode[pos + 2],
-        ];
-      case Encoding.kAY:
-        return [
-          _bytecode[pos + 1],
-          isWide
-              ? _decodeUint32At(pos + 2).toSigned(32)
-              : _bytecode[pos + 2].toSigned(8)
-        ];
-      case Encoding.kDF:
-        return isWide
-            ? [_decodeUint32At(pos + 1), _bytecode[pos + 5]]
-            : [_bytecode[pos + 1], _bytecode[pos + 2]];
-      case Encoding.kABC:
-        return [_bytecode[pos + 1], _bytecode[pos + 2], _bytecode[pos + 3]];
-    }
-    throw 'Unexpected format $format';
-  }
-
-  _decodeUint32At(int pos) =>
-      _bytecode[pos] +
-      (_bytecode[pos + 1] << 8) +
-      (_bytecode[pos + 2] << 16) +
-      (_bytecode[pos + 3] << 24);
-
-  void _scanForJumpTargets() {
-    for (int i = 0; i < _instructions.length; i++) {
-      final instr = _instructions[i];
-      if (isJump(instr.opcode)) {
-        final target = instr.pc + instr.operands[0];
-        assert(0 <= target && target < _bytecode.length);
-        if (!_labels.containsKey(target)) {
-          final label = 'L${++_labelCount}';
-          _labels[target] = label;
-          _addMarker(target, '$label:');
-        }
-      }
-    }
-  }
-
-  void _markTryBlocks(ExceptionsTable exceptionsTable) {
-    for (var tryBlock in exceptionsTable.blocks) {
-      final int tryIndex = tryBlock.tryIndex;
-      _addMarker(tryBlock.startPC, 'Try #$tryIndex start:');
-      _addMarker(tryBlock.endPC, 'Try #$tryIndex end:');
-      _addMarker(tryBlock.handlerPC, 'Try #$tryIndex handler:');
-    }
-  }
-
-  void _markAnnotations(List<Map<int, String>> annotations) {
-    for (var map in annotations) {
-      map.forEach((int pc, String annotation) {
-        _addMarker(pc, '# $annotation');
-      });
-    }
-  }
-
-  void _addMarker(int pc, String marker) {
-    final markers = (_markers[pc] ??= <String>[]);
-    markers.add(marker);
-  }
-
-  String _disasm() {
-    StringBuffer out = new StringBuffer();
-    for (Instruction instr in _instructions) {
-      List<String> markers = _markers[instr.pc];
-      if (markers != null) {
-        markers.forEach(out.writeln);
-      }
-      writeInstruction(out, instr);
-    }
-    return out.toString();
-  }
-
-  void writeInstruction(StringBuffer out, Instruction instr) {
-    final format = BytecodeFormats[instr.opcode];
-    assert(format != null);
-
-    out.write('  ');
-
-    const int kOpcodeWidth = 20;
-    const String kOpcodePrefix = 'Opcode.k';
-
-    String opcode = instr.opcode.toString();
-    assert(opcode.startsWith(kOpcodePrefix));
-    opcode = opcode.substring(kOpcodePrefix.length);
-
-    if (instr.operands.isEmpty) {
-      out.writeln(opcode);
-      return;
-    }
-
-    out.write(opcode.padRight(kOpcodeWidth));
-
-    for (int i = 0; i < instr.operands.length; i++) {
-      if (i == 0) {
-        out.write(' ');
-      } else {
-        out.write(', ');
-      }
-      final operand =
-          _formatOperand(instr.pc, format.operands[i], instr.operands[i]);
-      out.write(operand);
-    }
-
-    out.writeln();
-  }
-
-  String _formatOperand(int pc, Operand fmt, int value) {
-    switch (fmt) {
-      case Operand.none:
-        break;
-      case Operand.imm:
-        return '$value';
-      case Operand.lit:
-        return 'CP#$value';
-      case Operand.reg:
-        return 'r$value';
-      case Operand.xeg:
-        return (value < 0) ? 'FP[$value]' : 'r$value';
-      case Operand.tgt:
-        return (_labels == null)
-            ? value.toString()
-            : _labels[pc + value] ?? (throw 'Label not found');
-      case Operand.spe:
-        return SpecialIndex.values[value]
-            .toString()
-            .substring('SpecialIndex.'.length);
-    }
-    throw 'Unexpected operand format $fmt';
-  }
-}
diff --git a/pkg/vm/lib/bytecode/exceptions.dart b/pkg/vm/lib/bytecode/exceptions.dart
deleted file mode 100644
index 3ae6e1c..0000000
--- a/pkg/vm/lib/bytecode/exceptions.dart
+++ /dev/null
@@ -1,139 +0,0 @@
-// Copyright (c) 2018, 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.
-
-library vm.bytecode.exceptions;
-
-import 'bytecode_serialization.dart' show BufferedWriter, BufferedReader;
-
-/*
-
-In kernel binary, try blocks are encoded in the following way
-(using notation from pkg/kernel/binary.md):
-
-// Offset of a bytecode instruction.
-type BytecodeOffset = UInt;
-
-type TryBlock {
-  UInt outerTryIndexPlus1;
-  BytecodeOffset startPC; // Inclusive.
-  BytecodeOffset endPC; // Exclusive.
-  BytecodeOffset handlerPC;
-  Byte flags (needsStackTrace, isSynthetic);
-  List<ConstantIndex> types;
-}
-
-type ExceptionsTable {
-  // Ordered by startPC, then by nesting (outer precedes inner).
-  // Try blocks are properly nested. It means there are no partially
-  // overlapping try blocks - each pair of try block regions either
-  // has no intersection or one try block region encloses another.
-  List<TryBlock> tryBlocks;
-}
-
-*/
-
-class TryBlock {
-  static const int flagNeedsStackTrace = 1 << 0;
-  static const int flagIsSynthetic = 1 << 1;
-
-  final int tryIndex;
-  final int outerTryIndex;
-  final int startPC;
-  int endPC;
-  int handlerPC;
-  int flags = 0;
-  List<int> types = <int>[];
-
-  TryBlock._(this.tryIndex, this.outerTryIndex, this.startPC);
-
-  bool get needsStackTrace => (flags & flagNeedsStackTrace) != 0;
-
-  void set needsStackTrace(bool value) {
-    flags = (flags & ~flagNeedsStackTrace) | (value ? flagNeedsStackTrace : 0);
-  }
-
-  bool get isSynthetic => (flags & flagIsSynthetic) != 0;
-
-  void set isSynthetic(bool value) {
-    flags = (flags & ~flagIsSynthetic) | (value ? flagIsSynthetic : 0);
-  }
-
-  void write(BufferedWriter writer) {
-    writer.writePackedUInt30(outerTryIndex + 1);
-    writer.writePackedUInt30(startPC);
-    writer.writePackedUInt30(endPC);
-    writer.writePackedUInt30(handlerPC);
-    writer.writeByte(flags);
-    writer.writePackedUInt30(types.length);
-    types.forEach(writer.writePackedUInt30);
-  }
-
-  factory TryBlock.read(BufferedReader reader, int tryIndex) {
-    final outerTryIndex = reader.readPackedUInt30() - 1;
-    final startPC = reader.readPackedUInt30();
-    final tryBlock = new TryBlock._(tryIndex, outerTryIndex, startPC);
-
-    tryBlock.endPC = reader.readPackedUInt30();
-    tryBlock.handlerPC = reader.readPackedUInt30();
-    tryBlock.flags = reader.readByte();
-    tryBlock.types = new List<int>.generate(
-        reader.readPackedUInt30(), (_) => reader.readPackedUInt30());
-
-    return tryBlock;
-  }
-
-  @override
-  String toString() => 'try-index $tryIndex, outer $outerTryIndex, '
-      'start $startPC, end $endPC, handler $handlerPC, '
-      '${needsStackTrace ? 'needs-stack-trace, ' : ''}'
-      '${isSynthetic ? 'synthetic, ' : ''}'
-      'types ${types.map((t) => 'CP#$t').toList()}';
-}
-
-class ExceptionsTable {
-  List<TryBlock> blocks = <TryBlock>[];
-
-  ExceptionsTable();
-
-  TryBlock enterTryBlock(int startPC) {
-    assert(blocks.isEmpty || blocks.last.startPC <= startPC);
-    final tryBlock =
-        new TryBlock._(blocks.length, _outerTryBlockIndex(startPC), startPC);
-    blocks.add(tryBlock);
-    return tryBlock;
-  }
-
-  int _outerTryBlockIndex(int startPC) {
-    for (int i = blocks.length - 1; i >= 0; --i) {
-      final tryBlock = blocks[i];
-      if (tryBlock.endPC == null || tryBlock.endPC > startPC) {
-        return i;
-      }
-    }
-    return -1;
-  }
-
-  void write(BufferedWriter writer) {
-    writer.writePackedUInt30(blocks.length);
-    blocks.forEach((b) => b.write(writer));
-  }
-
-  ExceptionsTable.read(BufferedReader reader)
-      : blocks = new List<TryBlock>.generate(reader.readPackedUInt30(),
-            (int index) => new TryBlock.read(reader, index));
-
-  @override
-  String toString() {
-    if (blocks.isEmpty) {
-      return '';
-    }
-    StringBuffer sb = new StringBuffer();
-    sb.writeln('ExceptionsTable {');
-    for (var tryBlock in blocks) {
-      sb.writeln('  $tryBlock');
-    }
-    sb.writeln('}');
-    return sb.toString();
-  }
-}
diff --git a/pkg/vm/lib/bytecode/gen_bytecode.dart b/pkg/vm/lib/bytecode/gen_bytecode.dart
deleted file mode 100644
index 94a02db..0000000
--- a/pkg/vm/lib/bytecode/gen_bytecode.dart
+++ /dev/null
@@ -1,4658 +0,0 @@
-// Copyright (c) 2018, 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.
-
-library vm.bytecode.gen_bytecode;
-
-import 'package:front_end/src/api_unstable/vm.dart'
-    show
-        CompilerContext,
-        Severity,
-        isRedirectingFactoryField,
-        messageBytecodeLimitExceededTooManyArguments,
-        noLength,
-        templateIllegalRecursiveType;
-
-import 'package:kernel/ast.dart' hide MapEntry, Component, FunctionDeclaration;
-import 'package:kernel/ast.dart' as ast show Component, FunctionDeclaration;
-import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
-import 'package:kernel/core_types.dart' show CoreTypes;
-import 'package:kernel/external_name.dart'
-    show getExternalName, getNativeExtensionUris;
-import 'package:kernel/library_index.dart' show LibraryIndex;
-import 'package:kernel/text/ast_to_text.dart'
-    show globalDebuggingNames, NameSystem;
-import 'package:kernel/type_algebra.dart'
-    show Substitution, containsTypeVariable;
-import 'package:kernel/type_environment.dart'
-    show StatefulStaticTypeContext, SubtypeCheckMode, TypeEnvironment;
-import 'assembler.dart';
-import 'bytecode_serialization.dart' show StringTable;
-import 'constant_pool.dart';
-import 'dbc.dart';
-import 'declarations.dart';
-import 'exceptions.dart';
-import 'generics.dart'
-    show
-        flattenInstantiatorTypeArguments,
-        getDefaultFunctionTypeArguments,
-        getInstantiatorTypeArguments,
-        getStaticType,
-        getTypeParameterTypes,
-        hasFreeTypeParameters,
-        hasInstantiatorTypeArguments,
-        isAllDynamic,
-        isInstantiatedInterfaceCall,
-        isUncheckedCall,
-        isUncheckedClosureCall;
-import 'local_variable_table.dart' show LocalVariableTable;
-import 'local_vars.dart' show LocalVariables;
-import 'nullability_detector.dart' show NullabilityDetector;
-import 'object_table.dart'
-    show ObjectHandle, ObjectTable, NameAndType, topLevelClassName;
-import 'options.dart' show BytecodeOptions;
-import 'recognized_methods.dart' show RecognizedMethods;
-import 'recursive_types_validator.dart' show IllegalRecursiveTypeException;
-import 'source_positions.dart' show LineStarts, SourcePositions;
-import '../metadata/bytecode.dart';
-import '../metadata/direct_call.dart'
-    show DirectCallMetadata, DirectCallMetadataRepository;
-import '../metadata/inferred_type.dart'
-    show InferredType, InferredTypeMetadataRepository;
-import '../metadata/obfuscation_prohibitions.dart'
-    show ObfuscationProhibitionsMetadataRepository;
-import '../metadata/procedure_attributes.dart'
-    show ProcedureAttributesMetadata, ProcedureAttributesMetadataRepository;
-
-import 'dart:convert' show utf8;
-import 'dart:developer';
-import 'dart:math' as math;
-
-// This symbol is used as the name in assert assignable's to indicate it comes
-// from an explicit 'as' check.  This will cause the runtime to throw the right
-// exception.
-const String symbolForTypeCast = ' in type cast';
-
-void generateBytecode(
-  ast.Component component, {
-  BytecodeOptions options,
-  List<Library> libraries,
-  CoreTypes coreTypes,
-  ClassHierarchy hierarchy,
-}) {
-  Timeline.timeSync("generateBytecode", () {
-    options ??= new BytecodeOptions();
-    verifyBytecodeInstructionDeclarations();
-    coreTypes ??= new CoreTypes(component);
-    void ignoreAmbiguousSupertypes(Class cls, Supertype a, Supertype b) {}
-    hierarchy ??= new ClassHierarchy(component, coreTypes,
-        onAmbiguousSupertypes: ignoreAmbiguousSupertypes);
-    final typeEnvironment = new TypeEnvironment(coreTypes, hierarchy);
-    libraries ??= component.libraries;
-
-    // Save/restore global NameSystem to avoid accumulating garbage.
-    // NameSystem holds the whole AST as it is strongly connected due to
-    // parent pointers. Objects are added to NameSystem when toString()
-    // is called from AST nodes.  Bytecode generator widely uses
-    // Expression.getStaticType, which calls Expression.getStaticTypeAsInstanceOf,
-    // which uses toString() when it crashes due to http://dartbug.com/34496.
-    final savedGlobalDebuggingNames = globalDebuggingNames;
-    globalDebuggingNames = new NameSystem();
-
-    Library library;
-    try {
-      final bytecodeGenerator = new BytecodeGenerator(
-          component, coreTypes, hierarchy, typeEnvironment, options);
-      for (library in libraries) {
-        bytecodeGenerator.visitLibrary(library);
-      }
-    } on IllegalRecursiveTypeException catch (e) {
-      CompilerContext.current.options.report(
-          templateIllegalRecursiveType
-              .withArguments(e.type, library.isNonNullableByDefault)
-              .withoutLocation(),
-          Severity.error);
-    } finally {
-      globalDebuggingNames = savedGlobalDebuggingNames;
-    }
-  });
-}
-
-class BytecodeGenerator extends RecursiveVisitor<Null> {
-  static final Name callName = new Name('call');
-  static final Name noSuchMethodName = new Name('noSuchMethod');
-
-  final CoreTypes coreTypes;
-  final ClassHierarchy hierarchy;
-  final TypeEnvironment typeEnvironment;
-  final StatefulStaticTypeContext staticTypeContext;
-  final BytecodeOptions options;
-  final BytecodeMetadataRepository metadata = new BytecodeMetadataRepository();
-  final RecognizedMethods recognizedMethods;
-  final int formatVersion;
-  final Map<Uri, Source> astUriToSource;
-  StringTable stringTable;
-  ObjectTable objectTable;
-  Component bytecodeComponent;
-  NullabilityDetector nullabilityDetector;
-  Map<TreeNode, DirectCallMetadata> directCallMetadata;
-  ProcedureAttributesMetadataRepository procedureAttributesMetadataRepository;
-  ProcedureAttributesMetadata procedureAttributesMetadata;
-  Map<TreeNode, InferredType> inferredTypeMetadata;
-  List<Constant> inferredTypesAttribute;
-
-  List<ClassDeclaration> classDeclarations;
-  List<FieldDeclaration> fieldDeclarations;
-  List<FunctionDeclaration> functionDeclarations;
-  Class enclosingClass;
-  Member enclosingMember;
-  FunctionNode enclosingFunction;
-  FunctionNode parentFunction;
-  bool isClosure;
-  Set<TypeParameter> classTypeParameters;
-  List<TypeParameter> functionTypeParameters;
-  Set<TypeParameter> functionTypeParametersSet;
-  List<DartType> instantiatorTypeArguments;
-  LocalVariables locals;
-  Map<LabeledStatement, Label> labeledStatements;
-  Map<SwitchCase, Label> switchCases;
-  Map<TryCatch, TryBlock> tryCatches;
-  Map<TryFinally, List<FinallyBlock>> finallyBlocks;
-  List<Label> yieldPoints;
-  Map<TreeNode, int> contextLevels;
-  List<ClosureDeclaration> closures;
-  Set<Field> initializedFields;
-  List<ObjectHandle> nullableFields;
-  ConstantPool cp;
-  BytecodeAssembler asm;
-  List<BytecodeAssembler> savedAssemblers;
-  bool hasErrors;
-  int currentLoopDepth;
-  List<int> savedMaxSourcePositions;
-  int maxSourcePosition;
-
-  BytecodeGenerator(
-      ast.Component component,
-      CoreTypes coreTypes,
-      ClassHierarchy hierarchy,
-      TypeEnvironment typeEnvironment,
-      BytecodeOptions options)
-      : this._internal(component, coreTypes, hierarchy, typeEnvironment,
-            options, new StatefulStaticTypeContext.flat(typeEnvironment));
-
-  BytecodeGenerator._internal(
-      ast.Component component,
-      this.coreTypes,
-      this.hierarchy,
-      this.typeEnvironment,
-      this.options,
-      this.staticTypeContext)
-      : recognizedMethods = new RecognizedMethods(staticTypeContext),
-        formatVersion = currentBytecodeFormatVersion,
-        astUriToSource = component.uriToSource {
-    nullabilityDetector = new NullabilityDetector(recognizedMethods);
-    component.addMetadataRepository(metadata);
-
-    bytecodeComponent = new Component(formatVersion, coreTypes);
-    metadata.mapping[component] = new BytecodeMetadata(bytecodeComponent);
-
-    stringTable = bytecodeComponent.stringTable;
-    objectTable = bytecodeComponent.objectTable;
-
-    if (component.mainMethod != null) {
-      bytecodeComponent.mainLibrary =
-          objectTable.getHandle(component.mainMethod.enclosingLibrary);
-    }
-
-    directCallMetadata =
-        component.metadata[DirectCallMetadataRepository.repositoryTag]?.mapping;
-
-    procedureAttributesMetadataRepository =
-        component.metadata[ProcedureAttributesMetadataRepository.repositoryTag];
-
-    inferredTypeMetadata = component
-        .metadata[InferredTypeMetadataRepository.repositoryTag]?.mapping;
-
-    final obfuscationProhibitionsMetadataRepository = component
-        .metadata[ObfuscationProhibitionsMetadataRepository.repositoryTag];
-    if (obfuscationProhibitionsMetadataRepository != null) {
-      bytecodeComponent.protectedNames =
-          obfuscationProhibitionsMetadataRepository
-              .mapping[component]?.protectedNames;
-    }
-  }
-
-  @override
-  visitLibrary(Library node) {
-    staticTypeContext.enterLibrary(node);
-
-    startMembers();
-    visitList(node.procedures, this);
-    visitList(node.fields, this);
-    final members = endMembers(node);
-
-    classDeclarations = <ClassDeclaration>[
-      getTopLevelClassDeclaration(node, members)
-    ];
-
-    visitList(node.classes, this);
-
-    bytecodeComponent.libraries
-        .add(getLibraryDeclaration(node, classDeclarations));
-    classDeclarations = null;
-    staticTypeContext.leaveLibrary(node);
-  }
-
-  @override
-  visitClass(Class node) {
-    startMembers();
-    visitList(node.constructors, this);
-    visitList(node.procedures, this);
-    visitList(node.fields, this);
-    final members = endMembers(node);
-
-    classDeclarations.add(getClassDeclaration(node, members));
-  }
-
-  void startMembers() {
-    fieldDeclarations = <FieldDeclaration>[];
-    functionDeclarations = <FunctionDeclaration>[];
-  }
-
-  Members endMembers(TreeNode node) {
-    final members = new Members(fieldDeclarations, functionDeclarations);
-    bytecodeComponent.members.add(members);
-    fieldDeclarations = null;
-    functionDeclarations = null;
-    return members;
-  }
-
-  ObjectHandle getScript(Uri uri, bool includeSourceInfo) {
-    SourceFile source;
-    if (options.emitSourceFiles || options.emitSourcePositions) {
-      final astSource = astUriToSource[uri];
-      if (astSource != null) {
-        source = bytecodeComponent.uriToSource[uri];
-        if (source == null) {
-          final importUri =
-              objectTable.getConstStringHandle(astSource.importUri.toString());
-          source = new SourceFile(importUri);
-          bytecodeComponent.sourceFiles.add(source);
-          bytecodeComponent.uriToSource[uri] = source;
-        }
-        if (options.emitSourcePositions &&
-            includeSourceInfo &&
-            source.lineStarts == null) {
-          LineStarts lineStarts = new LineStarts(astSource.lineStarts);
-          bytecodeComponent.lineStarts.add(lineStarts);
-          source.lineStarts = lineStarts;
-        }
-        if (options.emitSourceFiles &&
-            includeSourceInfo &&
-            source.source == null) {
-          String text = astSource.cachedText ??
-              utf8.decode(astSource.source, allowMalformed: true);
-          source.source = text;
-        }
-      }
-    }
-    return objectTable.getScriptHandle(uri, source);
-  }
-
-  LibraryDeclaration getLibraryDeclaration(
-      Library library, List<ClassDeclaration> classes) {
-    final importUri =
-        objectTable.getConstStringHandle(library.importUri.toString());
-    int flags = 0;
-    for (var dependency in library.dependencies) {
-      final targetLibrary = dependency.targetLibrary;
-      assert(targetLibrary != null);
-      if (targetLibrary == coreTypes.mirrorsLibrary) {
-        flags |= LibraryDeclaration.usesDartMirrorsFlag;
-      } else if (targetLibrary == dartFfiLibrary) {
-        flags |= LibraryDeclaration.usesDartFfiFlag;
-      }
-    }
-    final name = objectTable.getPublicNameHandle(library.name ?? '');
-    final script = getScript(library.fileUri, true);
-    final extensionUris =
-        objectTable.getConstStringHandles(getNativeExtensionUris(library));
-    if (extensionUris.isNotEmpty) {
-      flags |= LibraryDeclaration.hasExtensionsFlag;
-    }
-    if (library.isNonNullableByDefault) {
-      flags |= LibraryDeclaration.isNonNullableByDefaultFlag;
-    }
-    return new LibraryDeclaration(
-        importUri, flags, name, script, extensionUris, classes);
-  }
-
-  ClassDeclaration getClassDeclaration(Class cls, Members members) {
-    int flags = 0;
-    if (cls.isAbstract) {
-      flags |= ClassDeclaration.isAbstractFlag;
-    }
-    if (cls.isEnum) {
-      flags |= ClassDeclaration.isEnumFlag;
-    }
-    int numTypeArguments = 0;
-    TypeParametersDeclaration typeParameters;
-    if (hasInstantiatorTypeArguments(cls)) {
-      flags |= ClassDeclaration.hasTypeArgumentsFlag;
-      numTypeArguments = flattenInstantiatorTypeArguments(
-              cls, getTypeParameterTypes(cls.typeParameters))
-          .length;
-      assert(numTypeArguments > 0);
-      if (cls.typeParameters.isNotEmpty) {
-        flags |= ClassDeclaration.hasTypeParamsFlag;
-        typeParameters = getTypeParametersDeclaration(cls.typeParameters);
-      }
-    }
-    if (cls.isEliminatedMixin) {
-      flags |= ClassDeclaration.isTransformedMixinApplicationFlag;
-    }
-    int position = TreeNode.noOffset;
-    int endPosition = TreeNode.noOffset;
-    if (options.emitSourcePositions && cls.fileOffset != TreeNode.noOffset) {
-      flags |= ClassDeclaration.hasSourcePositionsFlag;
-      position = cls.startFileOffset;
-      endPosition = cls.fileEndOffset;
-    }
-    Annotations annotations = getAnnotations(cls.annotations);
-    if (annotations.object != null) {
-      flags |= ClassDeclaration.hasAnnotationsFlag;
-      if (annotations.hasPragma) {
-        flags |= ClassDeclaration.hasPragmaFlag;
-      }
-    }
-
-    final nameHandle = objectTable.getNameHandle(
-        cls.name.startsWith('_') ? cls.enclosingLibrary : null, cls.name);
-    final script = getScript(cls.fileUri, !cls.isAnonymousMixin);
-    final superType = objectTable.getHandle(cls.supertype?.asInterfaceType);
-    final interfaces = objectTable.getHandles(
-        cls.implementedTypes.map((t) => t.asInterfaceType).toList());
-
-    final classDeclaration = new ClassDeclaration(
-        nameHandle,
-        flags,
-        script,
-        position,
-        endPosition,
-        typeParameters,
-        numTypeArguments,
-        superType,
-        interfaces,
-        members,
-        annotations.object);
-    bytecodeComponent.classes.add(classDeclaration);
-    return classDeclaration;
-  }
-
-  ClassDeclaration getTopLevelClassDeclaration(
-      Library library, Members members) {
-    int flags = 0;
-    int position = TreeNode.noOffset;
-    if (options.emitSourcePositions &&
-        library.fileOffset != TreeNode.noOffset) {
-      flags |= ClassDeclaration.hasSourcePositionsFlag;
-      position = library.fileOffset;
-    }
-    Annotations annotations = getLibraryAnnotations(library);
-    if (annotations.object != null) {
-      flags |= ClassDeclaration.hasAnnotationsFlag;
-      if (annotations.hasPragma) {
-        flags |= ClassDeclaration.hasPragmaFlag;
-      }
-    }
-
-    final nameHandle = objectTable.getPublicNameHandle(topLevelClassName);
-    final script = getScript(library.fileUri, true);
-
-    final classDeclaration = new ClassDeclaration(
-        nameHandle,
-        flags,
-        script,
-        position,
-        /* endPosition */ TreeNode.noOffset,
-        /* typeParameters */ null,
-        /* numTypeArguments */ 0,
-        /* superType */ null,
-        /* interfaces */ const <ObjectHandle>[],
-        members,
-        annotations.object);
-    bytecodeComponent.classes.add(classDeclaration);
-    return classDeclaration;
-  }
-
-  bool _isPragma(Constant annotation) =>
-      annotation is InstanceConstant &&
-      annotation.classNode == coreTypes.pragmaClass;
-
-  Annotations getAnnotations(List<Expression> nodes) {
-    if (nodes.isEmpty) {
-      return const Annotations(null, false);
-    }
-    List<Constant> constants = nodes.map(_getConstant).toList();
-    bool hasPragma = constants.any(_isPragma);
-    if (!options.emitAnnotations) {
-      if (hasPragma) {
-        constants = constants.where(_isPragma).toList();
-      } else {
-        return const Annotations(null, false);
-      }
-    }
-    final object =
-        objectTable.getHandle(new ListConstant(const DynamicType(), constants));
-    final decl = new AnnotationsDeclaration(object);
-    bytecodeComponent.annotations.add(decl);
-    return new Annotations(decl, hasPragma);
-  }
-
-  ObjectHandle getMemberAttributes() {
-    if (procedureAttributesMetadata == null && inferredTypesAttribute == null) {
-      return null;
-    }
-    // List of pairs (tag, value).
-    final attrs = <Constant>[];
-    if (procedureAttributesMetadata != null) {
-      final attribute = procedureAttributesMetadataRepository
-          .getBytecodeAttribute(procedureAttributesMetadata);
-      attrs.add(
-          StringConstant(ProcedureAttributesMetadataRepository.repositoryTag));
-      attrs.add(attribute);
-    }
-    if (inferredTypesAttribute != null) {
-      attrs.add(StringConstant(InferredTypeMetadataRepository.repositoryTag));
-      attrs.add(ListConstant(const DynamicType(), inferredTypesAttribute));
-    }
-    return objectTable.getHandle(ListConstant(const DynamicType(), attrs));
-  }
-
-  ObjectHandle getClosureAttributes() {
-    if (inferredTypesAttribute == null) {
-      return null;
-    }
-    final attrs = <Constant>[
-      StringConstant(InferredTypeMetadataRepository.repositoryTag),
-      ListConstant(const DynamicType(), inferredTypesAttribute),
-    ];
-    return objectTable.getHandle(ListConstant(const DynamicType(), attrs));
-  }
-
-  // Insert annotations for the function and its parameters into the annotations
-  // section. Return the annotations for the function only. The bytecode reader
-  // will implicitly find the parameter annotations by reading N packed objects
-  // after reading the function's annotations, one for each parameter.
-  Annotations getFunctionAnnotations(Member member) {
-    final functionNodes = member.annotations;
-    final parameterNodeLists = new List<List<Expression>>();
-    for (VariableDeclaration variable in member.function.positionalParameters) {
-      parameterNodeLists.add(variable.annotations);
-    }
-    for (VariableDeclaration variable in member.function.namedParameters) {
-      parameterNodeLists.add(variable.annotations);
-    }
-
-    if (functionNodes.isEmpty &&
-        parameterNodeLists.every((nodes) => nodes.isEmpty)) {
-      return const Annotations(null, false);
-    }
-
-    List<Constant> functionConstants = functionNodes.map(_getConstant).toList();
-    bool hasPragma = functionConstants.any(_isPragma);
-    if (!options.emitAnnotations && !hasPragma) {
-      return const Annotations(null, false);
-    }
-
-    final functionObject = objectTable
-        .getHandle(new ListConstant(const DynamicType(), functionConstants));
-    final functionDecl = new AnnotationsDeclaration(functionObject);
-    bytecodeComponent.annotations.add(functionDecl);
-
-    for (final parameterNodes in parameterNodeLists) {
-      List<Constant> parameterConstants =
-          parameterNodes.map(_getConstant).toList();
-      final parameterObject = objectTable
-          .getHandle(new ListConstant(const DynamicType(), parameterConstants));
-      final parameterDecl = new AnnotationsDeclaration(parameterObject);
-      bytecodeComponent.annotations.add(parameterDecl);
-    }
-
-    return new Annotations(functionDecl, hasPragma);
-  }
-
-  // Insert annotations for library and its dependencies into the
-  // annotations section. Returns annotations for the library only.
-  // Bytecode reader will implicitly find library dependencies by reading
-  // an extra object after reading library annotations.
-  Annotations getLibraryAnnotations(Library library) {
-    Annotations annotations = getAnnotations(library.annotations);
-    final bool emitDependencies =
-        options.emitAnnotations && library.dependencies.isNotEmpty;
-    if (annotations.object == null && !emitDependencies) {
-      return annotations;
-    }
-
-    // We need to emit both annotations and dependencies objects, appending
-    // null if an object is missing.
-    if (annotations.object == null) {
-      final annotationsDecl = new AnnotationsDeclaration(null);
-      bytecodeComponent.annotations.add(annotationsDecl);
-      annotations = new Annotations(annotationsDecl, false);
-    }
-    if (!emitDependencies) {
-      bytecodeComponent.annotations.add(new AnnotationsDeclaration(null));
-      return annotations;
-    }
-
-    // Create a constant object representing library dependencies.
-    // These objects are used by dart:mirrors and vm-service implementation.
-    final deps = <Constant>[];
-    for (var dependency in library.dependencies) {
-      final prefix = dependency.name != null
-          ? StringConstant(dependency.name)
-          : NullConstant();
-      final showNames = dependency.combinators
-          .where((c) => c.isShow)
-          .expand((c) => c.names)
-          .map((name) => StringConstant(name))
-          .toList();
-      final hideNames = dependency.combinators
-          .where((c) => c.isHide)
-          .expand((c) => c.names)
-          .map((name) => StringConstant(name))
-          .toList();
-      final depAnnots = dependency.annotations.map(_getConstant).toList();
-      deps.add(ListConstant(const DynamicType(), <Constant>[
-        StringConstant(dependency.targetLibrary.importUri.toString()),
-        BoolConstant(dependency.isExport),
-        BoolConstant(dependency.isDeferred),
-        prefix,
-        ListConstant(const DynamicType(), showNames),
-        ListConstant(const DynamicType(), hideNames),
-        ListConstant(const DynamicType(), depAnnots),
-      ]));
-    }
-    final ObjectHandle dependenciesObject =
-        objectTable.getHandle(ListConstant(const DynamicType(), deps));
-    final dependenciesDecl = new AnnotationsDeclaration(dependenciesObject);
-    bytecodeComponent.annotations.add(dependenciesDecl);
-
-    return annotations;
-  }
-
-  FieldDeclaration getFieldDeclaration(Field field, Code initializer) {
-    int flags = 0;
-    Constant value;
-    if (_hasNonTrivialInitializer(field)) {
-      flags |= FieldDeclaration.hasNontrivialInitializerFlag;
-    } else if (field.initializer != null) {
-      value = _getConstant(field.initializer);
-    }
-    if (initializer != null) {
-      flags |= FieldDeclaration.hasInitializerCodeFlag;
-    }
-    if (field.initializer != null) {
-      flags |= FieldDeclaration.hasInitializerFlag;
-    }
-    final name = objectTable.getNameHandle(
-        field.name.library, objectTable.mangleMemberName(field, false, false));
-    ObjectHandle getterName;
-    ObjectHandle setterName;
-    if (_needsGetter(field)) {
-      flags |= FieldDeclaration.hasGetterFlag;
-      getterName = objectTable.getNameHandle(
-          field.name.library, objectTable.mangleMemberName(field, true, false));
-    }
-    if (_needsSetter(field)) {
-      flags |= FieldDeclaration.hasSetterFlag;
-      setterName = objectTable.getNameHandle(
-          field.name.library, objectTable.mangleMemberName(field, false, true));
-    }
-    if (isReflectable(field)) {
-      flags |= FieldDeclaration.isReflectableFlag;
-    }
-    if (field.isStatic) {
-      flags |= FieldDeclaration.isStaticFlag;
-    }
-    if (field.isConst) {
-      flags |= FieldDeclaration.isConstFlag;
-    }
-    // Const fields are implicitly final.
-    if (field.isConst || field.isFinal) {
-      flags |= FieldDeclaration.isFinalFlag;
-    }
-    if (field.isCovariant) {
-      flags |= FieldDeclaration.isCovariantFlag;
-    }
-    if (field.isGenericCovariantImpl) {
-      flags |= FieldDeclaration.isGenericCovariantImplFlag;
-    }
-    if (field.isExtensionMember) {
-      flags |= FieldDeclaration.isExtensionMemberFlag;
-    }
-    // In NNBD libraries, static fields with initializers are implicitly late.
-    if (field.isLate ||
-        (field.isStatic &&
-            field.initializer != null &&
-            field.isNonNullableByDefault)) {
-      flags |= FieldDeclaration.isLateFlag;
-    }
-    int position = TreeNode.noOffset;
-    int endPosition = TreeNode.noOffset;
-    if (options.emitSourcePositions && field.fileOffset != TreeNode.noOffset) {
-      flags |= FieldDeclaration.hasSourcePositionsFlag;
-      position = field.fileOffset;
-      endPosition = field.fileEndOffset;
-    }
-    Annotations annotations = getAnnotations(field.annotations);
-    if (annotations.object != null) {
-      flags |= FieldDeclaration.hasAnnotationsFlag;
-      if (annotations.hasPragma) {
-        flags |= FieldDeclaration.hasPragmaFlag;
-      }
-    }
-    final ObjectHandle attributes = getMemberAttributes();
-    if (attributes != null) {
-      flags |= FieldDeclaration.hasAttributesFlag;
-    }
-    ObjectHandle script;
-    if (field.fileUri != null &&
-        field.fileUri != (field.parent as FileUriNode).fileUri) {
-      final isInAnonymousMixin =
-          enclosingClass != null && enclosingClass.isAnonymousMixin;
-      script = getScript(field.fileUri, !isInAnonymousMixin);
-      flags |= FieldDeclaration.hasCustomScriptFlag;
-    }
-    return new FieldDeclaration(
-        flags,
-        name,
-        objectTable.getHandle(field.type),
-        objectTable.getHandle(value),
-        script,
-        position,
-        endPosition,
-        getterName,
-        setterName,
-        initializer,
-        annotations.object,
-        attributes);
-  }
-
-  FunctionDeclaration getFunctionDeclaration(Member member, Code code) {
-    int flags = 0;
-    if (member is Constructor) {
-      flags |= FunctionDeclaration.isConstructorFlag;
-    }
-    if (member is Procedure) {
-      if (member.isGetter) {
-        flags |= FunctionDeclaration.isGetterFlag;
-      } else if (member.isSetter) {
-        flags |= FunctionDeclaration.isSetterFlag;
-      } else if (member.isFactory) {
-        flags |= FunctionDeclaration.isFactoryFlag;
-      }
-      if (member.isStatic) {
-        flags |= FunctionDeclaration.isStaticFlag;
-      }
-      if (member.isForwardingStub) {
-        flags |= FunctionDeclaration.isForwardingStubFlag;
-      }
-      if (member.isNoSuchMethodForwarder) {
-        flags |= FunctionDeclaration.isNoSuchMethodForwarderFlag;
-      }
-    }
-    if (member.isAbstract && !_hasCode(member)) {
-      flags |= FunctionDeclaration.isAbstractFlag;
-    }
-    if (member.isConst) {
-      flags |= FunctionDeclaration.isConstFlag;
-    }
-    if (member.isExtensionMember) {
-      flags |= FunctionDeclaration.isExtensionMemberFlag;
-    }
-
-    FunctionNode function = member.function;
-    if (function.requiredParameterCount !=
-        function.positionalParameters.length) {
-      flags |= FunctionDeclaration.hasOptionalPositionalParamsFlag;
-    }
-    if (function.namedParameters.isNotEmpty) {
-      flags |= FunctionDeclaration.hasOptionalNamedParamsFlag;
-    }
-    TypeParametersDeclaration typeParameters;
-    if (function.typeParameters.isNotEmpty) {
-      flags |= FunctionDeclaration.hasTypeParamsFlag;
-      typeParameters = getTypeParametersDeclaration(function.typeParameters);
-    }
-    if (isReflectable(member)) {
-      flags |= FunctionDeclaration.isReflectableFlag;
-    }
-    if (isDebuggable(member)) {
-      flags |= FunctionDeclaration.isDebuggableFlag;
-    }
-    switch (function.dartAsyncMarker) {
-      case AsyncMarker.Async:
-        flags |= FunctionDeclaration.isAsyncFlag;
-        break;
-      case AsyncMarker.AsyncStar:
-        flags |= FunctionDeclaration.isAsyncStarFlag;
-        break;
-      case AsyncMarker.SyncStar:
-        flags |= FunctionDeclaration.isSyncStarFlag;
-        break;
-      default:
-        break;
-    }
-    ObjectHandle nativeName;
-    if (member.isExternal) {
-      final String externalName = getExternalName(member);
-      if (externalName == null) {
-        flags |= FunctionDeclaration.isExternalFlag;
-      } else {
-        flags |= FunctionDeclaration.isNativeFlag;
-        nativeName = objectTable.getConstStringHandle(externalName);
-      }
-    }
-    int position = TreeNode.noOffset;
-    int endPosition = TreeNode.noOffset;
-    if (options.emitSourcePositions && member.fileOffset != TreeNode.noOffset) {
-      flags |= FunctionDeclaration.hasSourcePositionsFlag;
-      position = (member as dynamic).startFileOffset;
-      endPosition = member.fileEndOffset;
-    }
-    final Annotations annotations = getFunctionAnnotations(member);
-    if (annotations.object != null) {
-      flags |= FunctionDeclaration.hasAnnotationsFlag;
-      if (annotations.hasPragma) {
-        flags |= FunctionDeclaration.hasPragmaFlag;
-      }
-    }
-    final ObjectHandle attributes = getMemberAttributes();
-    if (attributes != null) {
-      flags |= FunctionDeclaration.hasAttributesFlag;
-    }
-    ObjectHandle script;
-    if (member.fileUri != null &&
-        member.fileUri != (member.parent as FileUriNode).fileUri) {
-      final isInAnonymousMixin =
-          enclosingClass != null && enclosingClass.isAnonymousMixin;
-      final isSynthetic = member is Procedure &&
-          (member.isNoSuchMethodForwarder || member.isSyntheticForwarder);
-      script = getScript(member.fileUri, !isInAnonymousMixin && !isSynthetic);
-      flags |= FunctionDeclaration.hasCustomScriptFlag;
-    }
-
-    final name = objectTable.getNameHandle(member.name.library,
-        objectTable.mangleMemberName(member, false, false));
-
-    final parameters = <ParameterDeclaration>[];
-    for (var param in function.positionalParameters) {
-      parameters.add(getParameterDeclaration(param));
-    }
-    for (var param in function.namedParameters) {
-      parameters.add(getParameterDeclaration(param));
-    }
-    // We only need the required flags when loading the function declaration.
-    final parameterFlags =
-        getParameterFlags(function, mask: ParameterDeclaration.isRequiredFlag);
-    if (parameterFlags != null) {
-      flags |= FunctionDeclaration.hasParameterFlagsFlag;
-    }
-
-    return new FunctionDeclaration(
-        flags,
-        name,
-        script,
-        position,
-        endPosition,
-        typeParameters,
-        function.requiredParameterCount,
-        parameters,
-        parameterFlags,
-        objectTable.getHandle(function.returnType),
-        nativeName,
-        code,
-        annotations.object,
-        attributes);
-  }
-
-  bool isReflectable(Member member) {
-    if (member is Field && member.fileOffset == TreeNode.noOffset) {
-      return false;
-    }
-    final library = member.enclosingLibrary;
-    if (library.importUri.scheme == 'dart' && member.name.isPrivate) {
-      return false;
-    }
-    if (member is Procedure &&
-        member.isStatic &&
-        library.importUri.toString() == 'dart:_internal') {
-      return false;
-    }
-    if (member is Procedure && member.isMemberSignature) {
-      return false;
-    }
-    return true;
-  }
-
-  bool isDebuggable(Member member) {
-    if (member is Constructor && member.isSynthetic) {
-      return false;
-    }
-    if (member.function.dartAsyncMarker != AsyncMarker.Sync) {
-      return false;
-    }
-    if (member == asyncAwaitCompleterGetFuture) {
-      return false;
-    }
-    return true;
-  }
-
-  TypeParametersDeclaration getTypeParametersDeclaration(
-      List<TypeParameter> typeParams) {
-    return new TypeParametersDeclaration(
-        objectTable.getTypeParameterHandles(typeParams));
-  }
-
-  ParameterDeclaration getParameterDeclaration(VariableDeclaration variable) {
-    final name = variable.name;
-    final lib = name.startsWith('_') ? enclosingMember.enclosingLibrary : null;
-    final nameHandle = objectTable.getNameHandle(lib, name);
-    final typeHandle = objectTable.getHandle(variable.type);
-    return new ParameterDeclaration(nameHandle, typeHandle);
-  }
-
-  // Most uses of parameter flags in the VM only nee a subset of the flags,
-  // so the optional [mask] argument allows the caller to specify the subset
-  // that should be retained.
-  List<int> getParameterFlags(FunctionNode function, {int mask = -1}) {
-    int getFlags(VariableDeclaration variable, int mask) {
-      int flags = 0;
-      if (variable.isCovariant) {
-        flags |= ParameterDeclaration.isCovariantFlag;
-      }
-      if (variable.isGenericCovariantImpl) {
-        flags |= ParameterDeclaration.isGenericCovariantImplFlag;
-      }
-      if (variable.isFinal) {
-        flags |= ParameterDeclaration.isFinalFlag;
-      }
-      if (variable.isRequired) {
-        flags |= ParameterDeclaration.isRequiredFlag;
-      }
-      return flags & mask;
-    }
-
-    final List<int> paramFlags = <int>[];
-    for (var param in function.positionalParameters) {
-      paramFlags.add(getFlags(param, mask));
-    }
-    for (var param in function.namedParameters) {
-      paramFlags.add(getFlags(param, mask));
-    }
-
-    for (int flags in paramFlags) {
-      if (flags != 0) {
-        return paramFlags;
-      }
-    }
-    return null;
-  }
-
-  @override
-  defaultMember(Member node) {
-    if (node is Procedure && node.isRedirectingFactoryConstructor) {
-      return;
-    }
-    try {
-      final bool hasCode = _hasCode(node);
-      start(node, hasCode);
-      if (node is Field) {
-        if (hasCode) {
-          if (node.isConst) {
-            _genPushConstExpr(node.initializer);
-          } else {
-            _generateNode(node.initializer);
-          }
-          _genReturnTOS();
-        }
-      } else if ((node is Procedure && !node.isRedirectingFactoryConstructor) ||
-          (node is Constructor)) {
-        if (hasCode) {
-          if (node is Constructor) {
-            _genConstructorInitializers(node);
-          }
-          if (node.isExternal) {
-            final String nativeName = getExternalName(node);
-            if (nativeName != null) {
-              _genNativeCall(nativeName);
-            } else {
-              // TODO(alexmarkov): generate throwing UnimplementedError
-              //  ("No definition given for external method Foo.bar").
-              asm.emitPushNull();
-            }
-          } else {
-            _generateNode(node.function?.body);
-            // BytecodeAssembler eliminates this bytecode if it is unreachable.
-            asm.emitPushNull();
-          }
-          if (node.function != null) {
-            _recordSourcePosition(node.function.fileEndOffset);
-          }
-          _genReturnTOS();
-        }
-      } else {
-        throw 'Unexpected member ${node.runtimeType} $node';
-      }
-      end(node, hasCode);
-    } on TooManyArgumentsException catch (e) {
-      CompilerContext.current.options.report(
-          messageBytecodeLimitExceededTooManyArguments.withLocation(
-              node.fileUri, e.fileOffset, noLength),
-          Severity.error);
-      hasErrors = true;
-      end(node, false);
-    }
-  }
-
-  bool _hasCode(Member member) {
-    if (member is Procedure && member.isRedirectingFactoryConstructor) {
-      return false;
-    }
-    // Front-end might set abstract flag on static external procedures,
-    // but they can be called and should have a body.
-    if (member is Procedure && member.isStatic && member.isExternal) {
-      return true;
-    }
-    if (member.isAbstract) {
-      return false;
-    }
-    if (member is Field) {
-      // TODO(dartbug.com/34277)
-      // Front-end inserts synthetic static fields "_redirecting#" to record
-      // information about redirecting constructors in kernel.
-      // The problem is that initializers of these synthetic static fields
-      // contain incorrect kernel AST, e.g. StaticGet which takes tear-off
-      // of a constructor. Do not generate bytecode for them, as they should
-      // never be used.
-      if (isRedirectingFactoryField(member)) {
-        return false;
-      }
-      return hasInitializerCode(member);
-    }
-    return true;
-  }
-
-  bool hasInitializerCode(Field field) =>
-      (field.isStatic ||
-          field.isLate ||
-          options.emitInstanceFieldInitializers) &&
-      _hasNonTrivialInitializer(field);
-
-  bool _needsGetter(Field field) {
-    // All instance fields need a getter.
-    if (!field.isStatic) return true;
-
-    // Static fields also need a getter if they have a non-trivial initializer,
-    // because it needs to be initialized lazily.
-    if (_hasNonTrivialInitializer(field)) return true;
-
-    // Static late fields with no initializer also need a getter, to check if
-    // it's been initialized.
-    return field.isLate && field.initializer == null;
-  }
-
-  bool _needsSetter(Field field) {
-    // Late fields always need a setter, unless they're static and non-final, or
-    // final with an initializer.
-    if (field.isLate) {
-      if (field.isStatic && !field.isFinal) return false;
-      if (field.isFinal && field.initializer != null) return false;
-      return true;
-    }
-
-    // Non-late static fields never need a setter.
-    if (field.isStatic) return false;
-
-    // Otherwise, the field only needs a setter if it isn't final.
-    return !field.isFinal;
-  }
-
-  void _genNativeCall(String nativeName) {
-    final function = enclosingMember.function;
-    assert(function != null);
-
-    if (locals.hasFactoryTypeArgsVar) {
-      asm.emitPush(locals.getVarIndexInFrame(locals.factoryTypeArgsVar));
-    } else if (locals.hasFunctionTypeArgsVar) {
-      asm.emitPush(locals.functionTypeArgsVarIndexInFrame);
-    }
-    if (locals.hasReceiver) {
-      asm.emitPush(locals.getVarIndexInFrame(locals.receiverVar));
-    }
-    for (var param in function.positionalParameters) {
-      asm.emitPush(locals.getVarIndexInFrame(param));
-    }
-    // Native methods access their parameters by indices, so
-    // native wrappers should pass arguments in the original declaration
-    // order instead of sorted order.
-    for (var param in locals.originalNamedParameters) {
-      asm.emitPush(locals.getVarIndexInFrame(param));
-    }
-
-    final nativeEntryCpIndex = cp.addNativeEntry(nativeName);
-    asm.emitNativeCall(nativeEntryCpIndex);
-  }
-
-  LibraryIndex get libraryIndex => coreTypes.index;
-
-  Procedure _listFromLiteral;
-  Procedure get listFromLiteral => _listFromLiteral ??=
-      libraryIndex.getMember('dart:core', 'List', '_fromLiteral');
-
-  Procedure _mapFromLiteral;
-  Procedure get mapFromLiteral => _mapFromLiteral ??=
-      libraryIndex.getMember('dart:core', 'Map', '_fromLiteral');
-
-  Procedure _interpolateSingle;
-  Procedure get interpolateSingle => _interpolateSingle ??=
-      libraryIndex.getMember('dart:core', '_StringBase', '_interpolateSingle');
-
-  Procedure _interpolate;
-  Procedure get interpolate => _interpolate ??=
-      libraryIndex.getMember('dart:core', '_StringBase', '_interpolate');
-
-  Class _closureClass;
-  Class get closureClass =>
-      _closureClass ??= libraryIndex.getClass('dart:core', '_Closure');
-
-  Procedure _objectInstanceOf;
-  Procedure get objectInstanceOf => _objectInstanceOf ??=
-      libraryIndex.getMember('dart:core', 'Object', '_instanceOf');
-
-  Procedure _objectSimpleInstanceOf;
-  Procedure get objectSimpleInstanceOf => _objectSimpleInstanceOf ??=
-      libraryIndex.getMember('dart:core', 'Object', '_simpleInstanceOf');
-
-  Field _closureInstantiatorTypeArguments;
-  Field get closureInstantiatorTypeArguments =>
-      _closureInstantiatorTypeArguments ??= libraryIndex.getMember(
-          'dart:core', '_Closure', '_instantiator_type_arguments');
-
-  Field _closureFunctionTypeArguments;
-  Field get closureFunctionTypeArguments =>
-      _closureFunctionTypeArguments ??= libraryIndex.getMember(
-          'dart:core', '_Closure', '_function_type_arguments');
-
-  Field _closureDelayedTypeArguments;
-  Field get closureDelayedTypeArguments =>
-      _closureDelayedTypeArguments ??= libraryIndex.getMember(
-          'dart:core', '_Closure', '_delayed_type_arguments');
-
-  Field _closureFunction;
-  Field get closureFunction => _closureFunction ??=
-      libraryIndex.getMember('dart:core', '_Closure', '_function');
-
-  Field _closureContext;
-  Field get closureContext => _closureContext ??=
-      libraryIndex.getMember('dart:core', '_Closure', '_context');
-
-  Procedure _prependTypeArguments;
-  Procedure get prependTypeArguments => _prependTypeArguments ??=
-      libraryIndex.getTopLevelMember('dart:_internal', '_prependTypeArguments');
-
-  Procedure _boundsCheckForPartialInstantiation;
-  Procedure get boundsCheckForPartialInstantiation =>
-      _boundsCheckForPartialInstantiation ??= libraryIndex.getTopLevelMember(
-          'dart:_internal', '_boundsCheckForPartialInstantiation');
-
-  Procedure _futureValue;
-  Procedure get futureValue =>
-      _futureValue ??= libraryIndex.getMember('dart:async', 'Future', 'value');
-
-  Procedure _throwNewLateInitializationError;
-  Procedure get throwNewLateInitializationError =>
-      _throwNewLateInitializationError ??= libraryIndex.getMember(
-          'dart:core', '_LateInitializationError', '_throwNew');
-
-  Procedure _throwNewAssertionError;
-  Procedure get throwNewAssertionError => _throwNewAssertionError ??=
-      libraryIndex.getMember('dart:core', '_AssertionError', '_throwNew');
-
-  Procedure _allocateInvocationMirror;
-  Procedure get allocateInvocationMirror =>
-      _allocateInvocationMirror ??= libraryIndex.getMember(
-          'dart:core', '_InvocationMirror', '_allocateInvocationMirror');
-
-  Procedure _unsafeCast;
-  Procedure get unsafeCast => _unsafeCast ??=
-      libraryIndex.getTopLevelMember('dart:_internal', 'unsafeCast');
-
-  Procedure _iterableIterator;
-  Procedure get iterableIterator => _iterableIterator ??=
-      libraryIndex.getMember('dart:core', 'Iterable', 'get:iterator');
-
-  Procedure _iteratorMoveNext;
-  Procedure get iteratorMoveNext => _iteratorMoveNext ??=
-      libraryIndex.getMember('dart:core', 'Iterator', 'moveNext');
-
-  Procedure _iteratorCurrent;
-  Procedure get iteratorCurrent => _iteratorCurrent ??=
-      libraryIndex.getMember('dart:core', 'Iterator', 'get:current');
-
-  Procedure _asyncAwaitCompleterGetFuture;
-  Procedure get asyncAwaitCompleterGetFuture =>
-      _asyncAwaitCompleterGetFuture ??= libraryIndex.tryGetMember(
-          'dart:async', '_AsyncAwaitCompleter', 'get:future');
-
-  Procedure _setAsyncThreadStackTrace;
-  Procedure get setAsyncThreadStackTrace => _setAsyncThreadStackTrace ??=
-      libraryIndex.getTopLevelMember('dart:async', '_setAsyncThreadStackTrace');
-
-  Procedure _clearAsyncThreadStackTrace;
-  Procedure get clearAsyncThreadStackTrace =>
-      _clearAsyncThreadStackTrace ??= libraryIndex.getTopLevelMember(
-          'dart:async', '_clearAsyncThreadStackTrace');
-
-  Library _dartFfiLibrary;
-  Library get dartFfiLibrary =>
-      _dartFfiLibrary ??= libraryIndex.tryGetLibrary('dart:ffi');
-
-  void _recordSourcePosition(int fileOffset) {
-    asm.currentSourcePosition = fileOffset;
-    maxSourcePosition = math.max(maxSourcePosition, fileOffset);
-  }
-
-  void _generateNode(TreeNode node) {
-    if (node == null) {
-      return;
-    }
-    final savedSourcePosition = asm.currentSourcePosition;
-    _recordSourcePosition(node.fileOffset);
-    node.accept(this);
-    asm.currentSourcePosition = savedSourcePosition;
-  }
-
-  void _generateNodeList(List<TreeNode> nodes) {
-    nodes.forEach(_generateNode);
-  }
-
-  void _genConstructorInitializers(Constructor node) {
-    bool isRedirecting = false;
-    Set<Field> initializedInInitializersList = new Set<Field>();
-    for (var initializer in node.initializers) {
-      if (initializer is RedirectingInitializer) {
-        isRedirecting = true;
-      } else if (initializer is FieldInitializer) {
-        initializedInInitializersList.add(initializer.field);
-      }
-    }
-
-    if (!isRedirecting) {
-      initializedFields = new Set<Field>();
-      for (var field in node.enclosingClass.fields) {
-        if (!field.isStatic) {
-          if (field.isLate) {
-            if (!initializedInInitializersList.contains(field)) {
-              _genLateFieldInitializer(field);
-            }
-          } else if (field.initializer != null) {
-            if (initializedInInitializersList.contains(field)) {
-              // Do not store a value into the field as it is going to be
-              // overwritten by initializers list.
-              _generateNode(field.initializer);
-              asm.emitDrop1();
-            } else {
-              _genFieldInitializer(field, field.initializer);
-            }
-          }
-        }
-      }
-    }
-
-    _generateNodeList(node.initializers);
-
-    if (!isRedirecting) {
-      nullableFields = <ObjectHandle>[];
-      for (var field in node.enclosingClass.fields) {
-        if (!field.isStatic &&
-            !field.isLate &&
-            !initializedFields.contains(field)) {
-          nullableFields.add(objectTable.getHandle(field));
-        }
-      }
-      initializedFields = null; // No more initialized fields, please.
-    }
-  }
-
-  void _genFieldInitializer(Field field, Expression initializer) {
-    assert(!field.isStatic);
-
-    if (initializer is NullLiteral && !initializedFields.contains(field)) {
-      return;
-    }
-
-    _genPushReceiver();
-    _generateNode(initializer);
-
-    final int cpIndex = cp.addInstanceField(field);
-    asm.emitStoreFieldTOS(cpIndex);
-
-    initializedFields.add(field);
-  }
-
-  void _genLateFieldInitializer(Field field) {
-    assert(!field.isStatic);
-
-    if (_isTrivialInitializer(field.initializer)) {
-      _genFieldInitializer(field, field.initializer);
-      return;
-    }
-
-    _genPushReceiver();
-
-    final int cpIndex = cp.addInstanceField(field);
-    asm.emitInitLateField(cpIndex);
-
-    initializedFields.add(field);
-  }
-
-  void _genArguments(Expression receiver, Arguments arguments,
-      {int storeReceiverToLocal}) {
-    if (arguments.types.isNotEmpty) {
-      _genTypeArguments(arguments.types);
-    }
-    _generateNode(receiver);
-    if (storeReceiverToLocal != null) {
-      asm.emitStoreLocal(storeReceiverToLocal);
-    }
-    _generateNodeList(arguments.positional);
-    arguments.named.forEach((NamedExpression ne) => _generateNode(ne.value));
-  }
-
-  void _genPushBool(bool value) {
-    if (value) {
-      asm.emitPushTrue();
-    } else {
-      asm.emitPushFalse();
-    }
-  }
-
-  void _genPushInt(int value) {
-    // TODO(alexmarkov): relax this constraint as PushInt instruction can
-    // hold up to 32-bit signed operand (note that interpreter assumes
-    // it is Smi).
-    if (value.bitLength + 1 <= 16) {
-      asm.emitPushInt(value);
-    } else {
-      asm.emitPushConstant(cp.addObjectRef(new IntConstant(value)));
-    }
-  }
-
-  Constant _getConstant(Expression expr) {
-    if (expr is ConstantExpression) {
-      return expr.constant;
-    }
-
-    // Literals outside of const expressions are not transformed by the
-    // constant transformer, but they need to be treated as constants here.
-    if (expr is BoolLiteral) return new BoolConstant(expr.value);
-    if (expr is DoubleLiteral) return new DoubleConstant(expr.value);
-    if (expr is IntLiteral) return new IntConstant(expr.value);
-    if (expr is NullLiteral) return new NullConstant();
-    if (expr is StringLiteral) return new StringConstant(expr.value);
-
-    throw 'Expected constant, got ${expr.runtimeType}';
-  }
-
-  void _genPushConstant(Constant constant) {
-    if (constant is NullConstant) {
-      asm.emitPushNull();
-    } else if (constant is BoolConstant) {
-      _genPushBool(constant.value);
-    } else if (constant is IntConstant) {
-      _genPushInt(constant.value);
-    } else {
-      asm.emitPushConstant(cp.addObjectRef(constant));
-    }
-  }
-
-  void _genPushConstExpr(Expression expr) {
-    if (expr is ConstantExpression) {
-      _genPushConstant(expr.constant);
-    } else if (expr is NullLiteral) {
-      asm.emitPushNull();
-    } else if (expr is BoolLiteral) {
-      _genPushBool(expr.value);
-    } else if (expr is IntLiteral) {
-      _genPushInt(expr.value);
-    } else {
-      _genPushConstant(_getConstant(expr));
-    }
-  }
-
-  void _genReturnTOS([int yieldSourcePosition = null]) {
-    if (options.causalAsyncStacks &&
-        parentFunction != null &&
-        (parentFunction.dartAsyncMarker == AsyncMarker.Async ||
-            parentFunction.dartAsyncMarker == AsyncMarker.AsyncStar)) {
-      final savedSourcePosition = asm.currentSourcePosition;
-      _recordSourcePosition(TreeNode.noOffset);
-      _genDirectCall(
-          clearAsyncThreadStackTrace, objectTable.getArgDescHandle(0), 0);
-      asm.emitDrop1();
-      asm.currentSourcePosition = savedSourcePosition;
-    }
-
-    if (yieldSourcePosition != null && options.emitSourcePositions) {
-      asm.emitYieldPointSourcePosition(yieldSourcePosition);
-    }
-    asm.emitReturnTOS();
-  }
-
-  void _genDirectCall(Member target, ObjectHandle argDesc, int totalArgCount,
-      {bool isGet: false,
-      bool isSet: false,
-      bool isDynamicForwarder: false,
-      bool isUnchecked: false,
-      TreeNode node}) {
-    assert(!isGet || !isSet);
-    final kind = isGet
-        ? InvocationKind.getter
-        : (isSet ? InvocationKind.setter : InvocationKind.method);
-    final cpIndex = cp.addDirectCall(kind, target, argDesc, isDynamicForwarder);
-
-    if (totalArgCount >= argumentsLimit) {
-      throw new TooManyArgumentsException(node.fileOffset);
-    }
-    if (inferredTypeMetadata != null && node != null) {
-      _appendInferredType(node, asm.offset);
-    }
-    if (isUnchecked) {
-      asm.emitUncheckedDirectCall(cpIndex, totalArgCount);
-    } else {
-      asm.emitDirectCall(cpIndex, totalArgCount);
-    }
-    if (inferredTypeMetadata != null && node != null) {
-      _replaceWithConstantValue(node);
-    }
-  }
-
-  void _genDirectCallWithArgs(Member target, Arguments args,
-      {bool hasReceiver: false,
-      bool isFactory: false,
-      bool isUnchecked: false,
-      TreeNode node}) {
-    final argDesc = objectTable.getArgDescHandleByArguments(args,
-        hasReceiver: hasReceiver, isFactory: isFactory);
-
-    int totalArgCount = args.positional.length + args.named.length;
-    if (hasReceiver) {
-      totalArgCount++;
-    }
-    if (args.types.isNotEmpty || isFactory) {
-      // VM needs type arguments for every invocation of a factory constructor.
-      // TODO(alexmarkov): Clean this up.
-      totalArgCount++;
-    }
-
-    _genDirectCall(target, argDesc, totalArgCount,
-        isUnchecked: isUnchecked, node: node);
-  }
-
-  void _genTypeArguments(List<DartType> typeArgs, {Class instantiatingClass}) {
-    int typeArgsCPIndex() {
-      if (instantiatingClass != null) {
-        typeArgs = getInstantiatorTypeArguments(instantiatingClass, typeArgs);
-      }
-      return cp.addTypeArguments(typeArgs);
-    }
-
-    if (typeArgs.isEmpty || !hasFreeTypeParameters(typeArgs)) {
-      asm.emitPushConstant(typeArgsCPIndex());
-    } else {
-      final flattenedTypeArgs = (instantiatingClass != null &&
-              (instantiatorTypeArguments != null ||
-                  functionTypeParameters != null))
-          ? flattenInstantiatorTypeArguments(instantiatingClass, typeArgs)
-          : typeArgs;
-      if (_canReuseInstantiatorTypeArguments(flattenedTypeArgs)) {
-        _genPushInstantiatorTypeArguments();
-      } else if (_canReuseFunctionTypeArguments(flattenedTypeArgs)) {
-        _genPushFunctionTypeArguments();
-      } else {
-        _genPushInstantiatorAndFunctionTypeArguments(typeArgs);
-        // TODO(alexmarkov): Optimize type arguments instantiation
-        // by passing rA = 1 in InstantiateTypeArgumentsTOS.
-        // For this purpose, we need to detect if type arguments
-        // would be all-dynamic in case of all-dynamic instantiator and
-        // function type arguments.
-        // Corresponding check is implemented in VM in
-        // TypeArguments::IsRawWhenInstantiatedFromRaw.
-        asm.emitInstantiateTypeArgumentsTOS(0, typeArgsCPIndex());
-      }
-    }
-  }
-
-  void _genPushInstantiatorAndFunctionTypeArguments(List<DartType> types) {
-    if (classTypeParameters != null &&
-        types.any((t) => containsTypeVariable(t, classTypeParameters))) {
-      assert(instantiatorTypeArguments != null);
-      _genPushInstantiatorTypeArguments();
-    } else {
-      asm.emitPushNull();
-    }
-    if (functionTypeParametersSet != null &&
-        types.any((t) => containsTypeVariable(t, functionTypeParametersSet))) {
-      _genPushFunctionTypeArguments();
-    } else {
-      asm.emitPushNull();
-    }
-  }
-
-  void _genPushInstantiatorTypeArguments() {
-    if (instantiatorTypeArguments != null) {
-      if (locals.hasFactoryTypeArgsVar) {
-        assert(enclosingMember is Procedure &&
-            (enclosingMember as Procedure).isFactory);
-        _genLoadVar(locals.factoryTypeArgsVar);
-      } else {
-        _genPushReceiver();
-        final int cpIndex = cp.addTypeArgumentsField(enclosingClass);
-        asm.emitLoadTypeArgumentsField(cpIndex);
-      }
-    } else {
-      asm.emitPushNull();
-    }
-  }
-
-  bool _canReuseInstantiatorTypeArguments(List<DartType> typeArgs) {
-    if (instantiatorTypeArguments == null) {
-      return false;
-    }
-
-    if (typeArgs.length > instantiatorTypeArguments.length) {
-      return false;
-    }
-
-    for (int i = 0; i < typeArgs.length; ++i) {
-      if (typeArgs[i] != instantiatorTypeArguments[i]) {
-        return false;
-      }
-    }
-
-    return true;
-  }
-
-  bool _canReuseFunctionTypeArguments(List<DartType> typeArgs) {
-    if (functionTypeParameters == null) {
-      return false;
-    }
-
-    if (typeArgs.length > functionTypeParameters.length) {
-      return false;
-    }
-
-    for (int i = 0; i < typeArgs.length; ++i) {
-      final typeArg = typeArgs[i];
-      if (!(typeArg is TypeParameterType &&
-          typeArg.parameter == functionTypeParameters[i] &&
-          (typeArg.nullability == Nullability.nonNullable ||
-              typeArg.nullability == Nullability.undetermined))) {
-        return false;
-      }
-    }
-
-    return true;
-  }
-
-  void _genPushFunctionTypeArguments() {
-    if (locals.hasFunctionTypeArgsVar) {
-      asm.emitPush(locals.functionTypeArgsVarIndexInFrame);
-    } else {
-      asm.emitPushNull();
-    }
-  }
-
-  void _genPushContextForVariable(VariableDeclaration variable,
-      {int currentContextLevel}) {
-    currentContextLevel ??= locals.currentContextLevel;
-    int depth = currentContextLevel - locals.getContextLevelOfVar(variable);
-    assert(depth >= 0);
-
-    asm.emitPush(locals.contextVarIndexInFrame);
-    if (depth > 0) {
-      for (; depth > 0; --depth) {
-        asm.emitLoadContextParent();
-      }
-    }
-  }
-
-  void _genPushContextIfCaptured(VariableDeclaration variable) {
-    if (locals.isCaptured(variable)) {
-      _genPushContextForVariable(variable);
-    }
-  }
-
-  void _genLoadVar(VariableDeclaration v, {int currentContextLevel}) {
-    if (locals.isCaptured(v)) {
-      _genPushContextForVariable(v, currentContextLevel: currentContextLevel);
-      asm.emitLoadContextVar(
-          locals.getVarContextId(v), locals.getVarIndexInContext(v));
-    } else {
-      asm.emitPush(locals.getVarIndexInFrame(v));
-    }
-  }
-
-  void _genPushReceiver() {
-    // TODO(alexmarkov): generate more efficient access to receiver
-    // even if it is captured.
-    _genLoadVar(locals.receiverVar);
-  }
-
-  // Stores value into variable.
-  // If variable is captured, context should be pushed before value.
-  void _genStoreVar(VariableDeclaration variable) {
-    if (locals.isCaptured(variable)) {
-      asm.emitStoreContextVar(locals.getVarContextId(variable),
-          locals.getVarIndexInContext(variable));
-    } else {
-      asm.emitPopLocal(locals.getVarIndexInFrame(variable));
-    }
-  }
-
-  /// Generates bool condition. Returns `true` if condition is negated.
-  bool _genCondition(Expression condition) {
-    bool negated = false;
-    if (condition is Not) {
-      condition = (condition as Not).operand;
-      negated = true;
-    }
-    _generateNode(condition);
-    if (nullabilityDetector.isNullable(condition)) {
-      asm.emitAssertBoolean(0);
-    }
-    return negated;
-  }
-
-  /// Returns value of the given expression if it is a bool constant.
-  /// Otherwise, returns `null`.
-  bool _constantConditionValue(Expression condition) {
-    if (options.keepUnreachableCode) {
-      return null;
-    }
-    // TODO(dartbug.com/34585): use constant evaluator to evaluate
-    // expressions in a non-constant context.
-    if (condition is Not) {
-      final operand = _constantConditionValue(condition.operand);
-      return (operand != null) ? !operand : null;
-    }
-    if (condition is BoolLiteral) {
-      return condition.value;
-    }
-    if (condition is ConstantExpression) {
-      Constant constant = condition.constant;
-      if (constant is BoolConstant) {
-        return constant.value;
-      }
-    }
-    return null;
-  }
-
-  void _genConditionAndJumpIf(Expression condition, bool value, Label dest) {
-    final bool constantValue = _constantConditionValue(condition);
-    if (constantValue != null) {
-      if (constantValue == value) {
-        asm.emitJump(dest);
-      }
-      return;
-    }
-    if (condition is MethodInvocation &&
-        condition.name.text == '==' &&
-        (condition.receiver is NullLiteral ||
-            condition.arguments.positional.single is NullLiteral)) {
-      if (condition.receiver is NullLiteral) {
-        _generateNode(condition.arguments.positional.single);
-      } else {
-        _generateNode(condition.receiver);
-      }
-      if (options.emitDebuggerStops &&
-          condition.fileOffset != TreeNode.noOffset) {
-        final savedSourcePosition = asm.currentSourcePosition;
-        _recordSourcePosition(condition.fileOffset);
-        asm.emitDebugCheck();
-        asm.currentSourcePosition = savedSourcePosition;
-      }
-      if (value) {
-        asm.emitJumpIfNull(dest);
-      } else {
-        asm.emitJumpIfNotNull(dest);
-      }
-      return;
-    }
-    if (condition is Not) {
-      _genConditionAndJumpIf(condition.operand, !value, dest);
-    } else if (condition is LogicalExpression) {
-      final isOR = (condition.operatorEnum == LogicalExpressionOperator.OR);
-
-      Label shortCircuit, done;
-      if (isOR == value) {
-        shortCircuit = dest;
-      } else {
-        shortCircuit = done = new Label();
-      }
-      _genConditionAndJumpIf(condition.left, isOR, shortCircuit);
-      _genConditionAndJumpIf(condition.right, value, dest);
-      if (done != null) {
-        asm.bind(done);
-      }
-    } else {
-      bool negated = _genCondition(condition);
-      if (negated) {
-        value = !value;
-      }
-      if (value) {
-        asm.emitJumpIfTrue(dest);
-      } else {
-        asm.emitJumpIfFalse(dest);
-      }
-    }
-  }
-
-  int _getDefaultParamConstIndex(VariableDeclaration param) {
-    if (param.initializer == null) {
-      return cp.addObjectRef(null);
-    }
-    final constant = _getConstant(param.initializer);
-    return cp.addObjectRef(constant);
-  }
-
-  // Duplicates value on top of the stack using temporary variable with
-  // given index.
-  void _genDupTOS(int tempIndexInFrame) {
-    // TODO(alexmarkov): Consider introducing Dup bytecode or keeping track of
-    // expression stack depth.
-    asm.emitStoreLocal(tempIndexInFrame);
-    asm.emitPush(tempIndexInFrame);
-  }
-
-  /// Generates is-test for the value at TOS.
-  void _genInstanceOf(DartType type) {
-    if (typeEnvironment.isTop(type)) {
-      asm.emitDrop1();
-      asm.emitPushTrue();
-      return;
-    }
-
-    if (type is InterfaceType &&
-        (type.typeArguments.isEmpty || isAllDynamic(type.typeArguments))) {
-      asm.emitPushConstant(cp.addType(type));
-      final argDesc = objectTable.getArgDescHandle(2);
-      final cpIndex = cp.addInterfaceCall(
-          InvocationKind.method, objectSimpleInstanceOf, argDesc);
-      asm.emitInterfaceCall(cpIndex, 2);
-      return;
-    }
-
-    if (hasFreeTypeParameters([type])) {
-      _genPushInstantiatorAndFunctionTypeArguments([type]);
-    } else {
-      asm.emitPushNull(); // Instantiator type arguments.
-      asm.emitPushNull(); // Function type arguments.
-    }
-    asm.emitPushConstant(cp.addType(type));
-    final argDesc = objectTable.getArgDescHandle(4);
-    final cpIndex =
-        cp.addInterfaceCall(InvocationKind.method, objectInstanceOf, argDesc);
-    asm.emitInterfaceCall(cpIndex, 4);
-  }
-
-  void start(Member node, bool hasCode) {
-    enclosingClass = node.enclosingClass;
-    enclosingMember = node;
-    enclosingFunction = node.function;
-    parentFunction = null;
-    isClosure = false;
-    hasErrors = false;
-    staticTypeContext.enterMember(node);
-    final isFactory = node is Procedure && node.isFactory;
-    if (node.isInstanceMember || node is Constructor || isFactory) {
-      if (enclosingClass.typeParameters.isNotEmpty) {
-        classTypeParameters =
-            new Set<TypeParameter>.from(enclosingClass.typeParameters);
-        // Treat type arguments of factory constructors as class
-        // type parameters.
-        if (isFactory) {
-          classTypeParameters.addAll(node.function.typeParameters);
-        }
-      }
-      if (hasInstantiatorTypeArguments(enclosingClass)) {
-        final typeParameters = getTypeParameterTypes(isFactory
-            ? node.function.typeParameters
-            : enclosingClass.typeParameters);
-        instantiatorTypeArguments =
-            flattenInstantiatorTypeArguments(enclosingClass, typeParameters);
-      }
-    }
-    if (enclosingFunction != null &&
-        enclosingFunction.typeParameters.isNotEmpty) {
-      functionTypeParameters =
-          new List<TypeParameter>.from(enclosingFunction.typeParameters);
-      functionTypeParametersSet = functionTypeParameters.toSet();
-    }
-    procedureAttributesMetadata = procedureAttributesMetadataRepository != null
-        ? procedureAttributesMetadataRepository.mapping[node]
-        : null;
-
-    if (inferredTypeMetadata != null) {
-      if (node is Field) {
-        // Field type is at PC = -1.
-        _appendInferredType(node, -1);
-      } else if (enclosingFunction != null && hasCode) {
-        assert(node is Procedure || node is Constructor);
-        // Parameter types are at PC = -N,..,-1 where N - number of declared
-        // (explicit) parameters.
-        int i = -(enclosingFunction.positionalParameters.length +
-            enclosingFunction.namedParameters.length);
-        for (var v in enclosingFunction.positionalParameters) {
-          _appendInferredType(v, i);
-          ++i;
-        }
-        for (var v in enclosingFunction.namedParameters) {
-          _appendInferredType(v, i);
-          ++i;
-        }
-      }
-    }
-
-    if (!hasCode) {
-      return;
-    }
-
-    labeledStatements = null;
-    switchCases = null;
-    tryCatches = null;
-    finallyBlocks = null;
-    yieldPoints = null; // Initialized when entering sync-yielding closure.
-    contextLevels = null;
-    closures = null;
-    initializedFields = null; // Tracked for constructors only.
-    nullableFields = const <ObjectHandle>[];
-    cp = new ConstantPool(stringTable, objectTable);
-    asm = new BytecodeAssembler(options);
-    savedAssemblers = null;
-    currentLoopDepth = 0;
-    savedMaxSourcePositions = <int>[];
-    maxSourcePosition = node.fileOffset;
-
-    locals = new LocalVariables(
-        node, options, staticTypeContext, directCallMetadata);
-    locals.enterScope(node);
-    assert(!locals.isSyncYieldingFrame);
-
-    int position;
-    if (node is Procedure) {
-      position = node.startFileOffset;
-    } else if (node is Constructor) {
-      position = node.startFileOffset;
-    } else {
-      position = node.fileOffset;
-    }
-    _recordSourcePosition(position);
-    _genPrologue(node, node.function);
-    _setupInitialContext(node.function);
-    _emitFirstDebugCheck(node.function);
-    if (node is Procedure && node.isInstanceMember) {
-      _checkArguments(node.function);
-    }
-    _genEqualsOperatorNullHandling(node);
-  }
-
-  void _appendInferredType(TreeNode node, int pc) {
-    final InferredType md = inferredTypeMetadata[node];
-    if (md == null || (pc >= 0 && asm.isUnreachable)) {
-      return;
-    }
-    inferredTypesAttribute ??= <Constant>[];
-    // List of triplets (PC, concreteClass, flags).
-    // Verify that PCs are monotonically increasing.
-    assert(inferredTypesAttribute.isEmpty ||
-        (inferredTypesAttribute[inferredTypesAttribute.length - 3]
-                    as IntConstant)
-                .value <
-            pc);
-    inferredTypesAttribute.add(IntConstant(pc));
-    Class concreteClass = md.concreteClass;
-    // VM uses more specific function type and doesn't expect to
-    // see inferred _Closure class.
-    if (concreteClass != null && concreteClass != closureClass) {
-      inferredTypesAttribute.add(TypeLiteralConstant(coreTypes.rawType(
-          concreteClass,
-          (concreteClass == coreTypes.nullClass)
-              ? Nullability.nullable
-              : staticTypeContext.nonNullable)));
-    } else {
-      inferredTypesAttribute.add(NullConstant());
-    }
-    // Inferred constant values are handled in bytecode generator
-    // (_replaceWithConstantValue, _initConstantParameters) and
-    // not propagated to VM.
-    final flags = md.flags & ~InferredType.flagConstant;
-    inferredTypesAttribute.add(IntConstant(flags));
-  }
-
-  void _replaceWithConstantValue(TreeNode node) {
-    final InferredType md = inferredTypeMetadata[node];
-    if (md == null || md.constantValue == null || asm.isUnreachable) {
-      return;
-    }
-    asm.emitDrop1();
-    _genPushConstant(md.constantValue);
-  }
-
-  // Generate additional code for 'operator ==' to handle nulls.
-  void _genEqualsOperatorNullHandling(Member member) {
-    if (member.name.text != '==' ||
-        locals.numParameters != 2 ||
-        member.enclosingClass == coreTypes.objectClass) {
-      return;
-    }
-
-    Label done = new Label();
-
-    _genLoadVar(member.function.positionalParameters[0]);
-    asm.emitJumpIfNotNull(done);
-
-    asm.emitPushFalse();
-    _genReturnTOS();
-
-    asm.bind(done);
-  }
-
-  void end(Member node, bool hasCode) {
-    if (!hasErrors) {
-      Code code;
-      if (hasCode) {
-        if (options.emitLocalVarInfo) {
-          // Leave the scopes which were entered in _genPrologue and
-          // _setupInitialContext.
-          asm.localVariableTable.leaveAllScopes(
-              asm.offset,
-              node.function != null
-                  ? node.function.fileEndOffset
-                  : node.fileEndOffset);
-        }
-
-        List<int> parameterFlags = null;
-        int forwardingStubTargetCpIndex = null;
-        int defaultFunctionTypeArgsCpIndex = null;
-
-        // We don't need the required flag when loading the code, but do need
-        // all other parameter flags.
-        final parameterFlagMask = ~ParameterDeclaration.isRequiredFlag;
-
-        if (node is Constructor) {
-          parameterFlags =
-              getParameterFlags(node.function, mask: parameterFlagMask);
-        } else if (node is Procedure) {
-          parameterFlags =
-              getParameterFlags(node.function, mask: parameterFlagMask);
-
-          if (node.isForwardingStub) {
-            forwardingStubTargetCpIndex =
-                cp.addObjectRef(node.forwardingStubSuperTarget);
-          }
-
-          final defaultTypes = getDefaultFunctionTypeArguments(node.function);
-          if (defaultTypes != null) {
-            defaultFunctionTypeArgsCpIndex = cp.addTypeArguments(defaultTypes);
-          }
-        }
-        code = new Code(
-            cp,
-            asm.bytecode,
-            asm.exceptionsTable,
-            finalizeSourcePositions(),
-            finalizeLocalVariables(),
-            nullableFields,
-            closures ?? const <ClosureDeclaration>[],
-            parameterFlags,
-            forwardingStubTargetCpIndex,
-            defaultFunctionTypeArgsCpIndex);
-        bytecodeComponent.codes.add(code);
-      }
-      if (node is Field) {
-        fieldDeclarations.add(getFieldDeclaration(node, code));
-      } else {
-        functionDeclarations.add(getFunctionDeclaration(node, code));
-      }
-    }
-
-    staticTypeContext.leaveMember(node);
-    enclosingClass = null;
-    enclosingMember = null;
-    enclosingFunction = null;
-    parentFunction = null;
-    isClosure = null;
-    classTypeParameters = null;
-    functionTypeParameters = null;
-    functionTypeParametersSet = null;
-    instantiatorTypeArguments = null;
-    locals = null;
-    labeledStatements = null;
-    switchCases = null;
-    tryCatches = null;
-    finallyBlocks = null;
-    yieldPoints = null;
-    contextLevels = null;
-    closures = null;
-    initializedFields = null;
-    nullableFields = null;
-    cp = null;
-    asm = null;
-    savedAssemblers = null;
-    hasErrors = false;
-    procedureAttributesMetadata = null;
-    inferredTypesAttribute = null;
-  }
-
-  SourcePositions finalizeSourcePositions() {
-    if (asm.sourcePositions.isEmpty) {
-      return null;
-    }
-    bytecodeComponent.sourcePositions.add(asm.sourcePositions);
-    return asm.sourcePositions;
-  }
-
-  LocalVariableTable finalizeLocalVariables() {
-    final localVariables = asm.localVariableTable;
-    assert(!localVariables.hasActiveScopes);
-    if (localVariables.isEmpty) {
-      return null;
-    }
-    bytecodeComponent.localVariables.add(localVariables);
-    return localVariables;
-  }
-
-  void _genPrologue(Node node, FunctionNode function) {
-    if (locals.hasOptionalParameters) {
-      final int numOptionalPositional = function.positionalParameters.length -
-          function.requiredParameterCount;
-      final int numOptionalNamed = function.namedParameters.length;
-      final int numFixed =
-          locals.numParameters - (numOptionalPositional + numOptionalNamed);
-
-      asm.emitEntryOptional(numFixed, numOptionalPositional, numOptionalNamed);
-
-      if (numOptionalPositional != 0) {
-        assert(numOptionalNamed == 0);
-        for (int i = 0; i < numOptionalPositional; i++) {
-          final param = function
-              .positionalParameters[function.requiredParameterCount + i];
-          asm.emitLoadConstant(numFixed + i, _getDefaultParamConstIndex(param));
-        }
-      } else {
-        assert(numOptionalNamed != 0);
-        for (int i = 0; i < numOptionalNamed; i++) {
-          final param = locals.sortedNamedParameters[i];
-          asm.emitLoadConstant(numFixed + i, cp.addName(param.name));
-          asm.emitLoadConstant(numFixed + i, _getDefaultParamConstIndex(param));
-        }
-      }
-
-      asm.emitFrame(locals.frameSize - locals.numParameters);
-    } else {
-      asm.emitEntry(locals.frameSize);
-    }
-
-    if (isClosure) {
-      asm.emitPush(locals.closureVarIndexInFrame);
-      asm.emitLoadFieldTOS(cp.addInstanceField(closureContext));
-      asm.emitPopLocal(locals.contextVarIndexInFrame);
-    }
-
-    if (locals.hasFunctionTypeArgsVar && function.typeParameters.isNotEmpty) {
-      assert(!(node is Procedure && node.isFactory));
-
-      Label done = new Label();
-
-      if (isClosure) {
-        _handleDelayedTypeArguments(done);
-      }
-
-      asm.emitCheckFunctionTypeArgs(function.typeParameters.length,
-          locals.functionTypeArgsVarIndexInFrame);
-
-      _handleDefaultTypeArguments(function, done);
-
-      asm.bind(done);
-    }
-
-    // Open initial scope before the first CheckStack, as VM might
-    // need to know context level.
-    if (options.emitLocalVarInfo && function != null) {
-      asm.localVariableTable.enterScope(
-          asm.offset,
-          isClosure ? locals.contextLevelAtEntry : locals.currentContextLevel,
-          function.fileOffset);
-      if (locals.hasContextVar) {
-        asm.localVariableTable
-            .recordContextVariable(asm.offset, locals.contextVarIndexInFrame);
-      }
-      if (locals.hasReceiver &&
-          (!isClosure || locals.isCaptured(locals.receiverVar))) {
-        _declareLocalVariable(locals.receiverVar, function.fileOffset);
-      }
-      for (var v in function.positionalParameters) {
-        if (!locals.isCaptured(v)) {
-          _declareLocalVariable(v, function.fileOffset);
-        }
-      }
-      for (var v in locals.sortedNamedParameters) {
-        if (!locals.isCaptured(v)) {
-          _declareLocalVariable(v, function.fileOffset);
-        }
-      }
-      if (locals.hasFunctionTypeArgsVar) {
-        _declareLocalVariable(locals.functionTypeArgsVar, function.fileOffset);
-      }
-    }
-
-    // CheckStack must see a properly initialized context when stress-testing
-    // stack trace collection.
-    asm.emitCheckStack(0);
-
-    if (locals.hasFunctionTypeArgsVar && isClosure) {
-      if (function.typeParameters.isNotEmpty) {
-        final int numParentTypeArgs = locals.numParentTypeArguments;
-        asm.emitPush(locals.functionTypeArgsVarIndexInFrame);
-        asm.emitPush(locals.closureVarIndexInFrame);
-        asm.emitLoadFieldTOS(cp.addInstanceField(closureFunctionTypeArguments));
-        _genPushInt(numParentTypeArgs);
-        _genPushInt(numParentTypeArgs + function.typeParameters.length);
-        _genDirectCall(
-            prependTypeArguments, objectTable.getArgDescHandle(4), 4);
-        asm.emitPopLocal(locals.functionTypeArgsVarIndexInFrame);
-      } else {
-        asm.emitPush(locals.closureVarIndexInFrame);
-        asm.emitLoadFieldTOS(cp.addInstanceField(closureFunctionTypeArguments));
-        asm.emitPopLocal(locals.functionTypeArgsVarIndexInFrame);
-      }
-    }
-
-    if (inferredTypeMetadata != null && function != null) {
-      _initConstantParameters(function);
-    }
-  }
-
-  void _handleDelayedTypeArguments(Label doneCheckingTypeArguments) {
-    Label noDelayedTypeArgs = new Label();
-
-    asm.emitPush(locals.closureVarIndexInFrame);
-    asm.emitLoadFieldTOS(cp.addInstanceField(closureDelayedTypeArguments));
-    asm.emitStoreLocal(locals.functionTypeArgsVarIndexInFrame);
-    asm.emitPushConstant(cp.addEmptyTypeArguments());
-    asm.emitJumpIfEqStrict(noDelayedTypeArgs);
-
-    // There are non-empty delayed type arguments, and they are stored
-    // into function type args variable already.
-    // Just verify that there are no passed type arguments.
-    asm.emitCheckFunctionTypeArgs(0, locals.scratchVarIndexInFrame);
-    asm.emitJump(doneCheckingTypeArguments);
-
-    asm.bind(noDelayedTypeArgs);
-  }
-
-  void _handleDefaultTypeArguments(
-      FunctionNode function, Label doneCheckingTypeArguments) {
-    List<DartType> defaultTypes = getDefaultFunctionTypeArguments(function);
-    if (defaultTypes == null) {
-      return;
-    }
-
-    asm.emitJumpIfNotZeroTypeArgs(doneCheckingTypeArguments);
-
-    // Load parent function type arguments if they are used to
-    // instantiate default types.
-    if (isClosure &&
-        defaultTypes
-            .any((t) => containsTypeVariable(t, functionTypeParametersSet))) {
-      asm.emitPush(locals.closureVarIndexInFrame);
-      asm.emitLoadFieldTOS(cp.addInstanceField(closureFunctionTypeArguments));
-      asm.emitPopLocal(locals.functionTypeArgsVarIndexInFrame);
-    }
-
-    _genTypeArguments(defaultTypes);
-    asm.emitPopLocal(locals.functionTypeArgsVarIndexInFrame);
-  }
-
-  void _initConstantParameters(FunctionNode function) {
-    function.positionalParameters.forEach(_initParameterIfConstant);
-    locals.sortedNamedParameters.forEach(_initParameterIfConstant);
-  }
-
-  void _initParameterIfConstant(VariableDeclaration variable) {
-    final md = inferredTypeMetadata[variable];
-    if (md != null && md.constantValue != null) {
-      _genPushConstant(md.constantValue);
-      asm.emitPopLocal(locals.isCaptured(variable)
-          ? locals.getOriginalParamSlotIndex(variable)
-          : locals.getVarIndexInFrame(variable));
-    }
-  }
-
-  void _setupInitialContext(FunctionNode function) {
-    _allocateContextIfNeeded();
-
-    if (options.emitLocalVarInfo && locals.currentContextSize > 0) {
-      // Open a new scope after allocating context.
-      asm.localVariableTable.enterScope(asm.offset, locals.currentContextLevel,
-          function != null ? function.fileOffset : enclosingMember.fileOffset);
-    }
-
-    if (locals.hasCapturedParameters) {
-      // Copy captured parameters to their respective locations in the context.
-      if (!isClosure) {
-        if (locals.hasFactoryTypeArgsVar) {
-          _copyParamIfCaptured(locals.factoryTypeArgsVar);
-        }
-        if (locals.hasCapturedReceiverVar) {
-          _genPushContextForVariable(locals.capturedReceiverVar);
-          asm.emitPush(locals.getVarIndexInFrame(locals.receiverVar));
-          _genStoreVar(locals.capturedReceiverVar);
-        }
-      }
-      if (function != null) {
-        function.positionalParameters.forEach(_copyParamIfCaptured);
-        locals.sortedNamedParameters.forEach(_copyParamIfCaptured);
-      }
-    }
-  }
-
-  void _emitFirstDebugCheck(FunctionNode function) {
-    if (options.emitDebuggerStops) {
-      // DebugCheck instruction should be emitted after parameter variables
-      // are declared and copied into context.
-      // The debugger expects the source position to correspond to the
-      // declaration position of the last parameter, if any, or of the function.
-      // The DebugCheck must be encountered each time an async op is reentered.
-      if (options.emitSourcePositions && function != null) {
-        var pos = TreeNode.noOffset;
-        if (function.namedParameters.isNotEmpty) {
-          pos = function.namedParameters.last.fileOffset;
-        } else if (function.positionalParameters.isNotEmpty) {
-          pos = function.positionalParameters.last.fileOffset;
-        }
-        if (pos == TreeNode.noOffset) {
-          pos = function.fileOffset;
-        }
-        _recordSourcePosition(pos);
-      }
-      asm.emitDebugCheck();
-    }
-  }
-
-  void _copyParamIfCaptured(VariableDeclaration variable) {
-    if (locals.isCaptured(variable)) {
-      if (options.emitLocalVarInfo) {
-        _declareLocalVariable(variable, enclosingFunction.fileOffset);
-      }
-      _genPushContextForVariable(variable);
-      asm.emitPush(locals.getOriginalParamSlotIndex(variable));
-      _genStoreVar(variable);
-      // TODO(alexmarkov): We need to store null at the original parameter
-      // location, because the original value may need to be GC'ed.
-    }
-  }
-
-  void _declareLocalVariable(
-      VariableDeclaration variable, int initializedPosition) {
-    assert(variable.name != null);
-    bool isCaptured = locals.isCaptured(variable);
-    asm.localVariableTable.declareVariable(
-        asm.offset,
-        isCaptured,
-        isCaptured
-            ? locals.getVarIndexInContext(variable)
-            : locals.getVarIndexInFrame(variable),
-        cp.addName(variable.name),
-        cp.addType(variable.type),
-        variable.fileOffset,
-        initializedPosition);
-  }
-
-  // TODO(dartbug.com/40813): Remove the closure case when we move the
-  // type checks out of closure bodies.
-  bool get canSkipTypeChecksForNonCovariantArguments => !isClosure;
-
-  bool get skipTypeChecksForGenericCovariantImplArguments =>
-      procedureAttributesMetadata != null &&
-      !procedureAttributesMetadata.hasNonThisUses &&
-      // TODO(alexmarkov): fix building of flow graph for implicit closures so
-      // it would include missing checks and remove this condition.
-      !procedureAttributesMetadata.hasTearOffUses;
-
-  Member _getForwardingStubSuperTarget() {
-    if (!isClosure) {
-      final member = enclosingMember;
-      if (member.isInstanceMember &&
-          member is Procedure &&
-          member.isForwardingStub) {
-        return member.forwardingStubSuperTarget;
-      }
-    }
-    return null;
-  }
-
-  // Types in a target of a forwarding stub are encoded in terms of target type
-  // parameters. Substitute them with host type parameters to be able
-  // to use them (e.g. instantiate) in the context of host.
-  Substitution _getForwardingSubstitution(
-      FunctionNode host, Member forwardingTarget) {
-    if (forwardingTarget == null) {
-      return null;
-    }
-    final Class targetClass = forwardingTarget.enclosingClass;
-    final Supertype instantiatedTargetClass =
-        hierarchy.getClassAsInstanceOf(enclosingClass, targetClass);
-    if (instantiatedTargetClass == null) {
-      throw 'Class $targetClass is not found among implemented interfaces of'
-          ' $enclosingClass (for forwarding stub $enclosingMember)';
-    }
-    assert(instantiatedTargetClass.classNode == targetClass);
-    assert(instantiatedTargetClass.typeArguments.length ==
-        targetClass.typeParameters.length);
-    final Map<TypeParameter, DartType> map =
-        new Map<TypeParameter, DartType>.fromIterables(
-            targetClass.typeParameters, instantiatedTargetClass.typeArguments);
-    if (forwardingTarget.function != null) {
-      final targetTypeParameters = forwardingTarget.function.typeParameters;
-      assert(host.typeParameters.length == targetTypeParameters.length);
-      for (int i = 0; i < targetTypeParameters.length; ++i) {
-        map[targetTypeParameters[i]] =
-            new TypeParameterType(host.typeParameters[i], Nullability.legacy);
-      }
-    }
-    return Substitution.fromMap(map);
-  }
-
-  /// If member being compiled is a forwarding stub, then returns type
-  /// parameter bounds to check for the forwarding stub target.
-  Map<TypeParameter, DartType> _getForwardingBounds(FunctionNode function,
-      Member forwardingTarget, Substitution forwardingSubstitution) {
-    if (function.typeParameters.isEmpty || forwardingTarget == null) {
-      return null;
-    }
-    final forwardingBounds = <TypeParameter, DartType>{};
-    for (int i = 0; i < function.typeParameters.length; ++i) {
-      DartType bound = forwardingSubstitution
-          .substituteType(forwardingTarget.function.typeParameters[i].bound);
-      forwardingBounds[function.typeParameters[i]] = bound;
-    }
-    return forwardingBounds;
-  }
-
-  /// If member being compiled is a forwarding stub, then returns parameter
-  /// types to check for the forwarding stub target.
-  Map<VariableDeclaration, DartType> _getForwardingParameterTypes(
-      FunctionNode function,
-      Member forwardingTarget,
-      Substitution forwardingSubstitution) {
-    if (forwardingTarget == null) {
-      return null;
-    }
-
-    if (forwardingTarget is Field) {
-      if ((enclosingMember as Procedure).isGetter) {
-        return const <VariableDeclaration, DartType>{};
-      } else {
-        // Forwarding stub for a covariant field setter.
-        assert((enclosingMember as Procedure).isSetter);
-        assert(function.typeParameters.isEmpty &&
-            function.positionalParameters.length == 1 &&
-            function.namedParameters.length == 0);
-        return <VariableDeclaration, DartType>{
-          function.positionalParameters.single:
-              forwardingSubstitution.substituteType(forwardingTarget.type)
-        };
-      }
-    }
-
-    final forwardingParams = <VariableDeclaration, DartType>{};
-    for (int i = 0; i < function.positionalParameters.length; ++i) {
-      DartType type = forwardingSubstitution.substituteType(
-          forwardingTarget.function.positionalParameters[i].type);
-      forwardingParams[function.positionalParameters[i]] = type;
-    }
-    for (var hostParam in function.namedParameters) {
-      VariableDeclaration targetParam = forwardingTarget
-          .function.namedParameters
-          .firstWhere((p) => p.name == hostParam.name);
-      forwardingParams[hostParam] =
-          forwardingSubstitution.substituteType(targetParam.type);
-    }
-    return forwardingParams;
-  }
-
-  void _checkArguments(FunctionNode function) {
-    // When checking arguments of a forwarding stub, we need to use parameter
-    // types (and bounds of type parameters) from stub's target.
-    // These more accurate type checks is the sole purpose of a forwarding stub.
-    final forwardingTarget = _getForwardingStubSuperTarget();
-    final forwardingSubstitution =
-        _getForwardingSubstitution(function, forwardingTarget);
-    final forwardingBounds = _getForwardingBounds(
-        function, forwardingTarget, forwardingSubstitution);
-    final forwardingParamTypes = _getForwardingParameterTypes(
-        function, forwardingTarget, forwardingSubstitution);
-
-    if (_hasSkippableTypeChecks(
-        function, forwardingBounds, forwardingParamTypes)) {
-      final Label skipChecks = new Label();
-      asm.emitJumpIfUnchecked(skipChecks);
-
-      // We can skip bounds checks of type parameter and type checks of
-      // non-covariant parameters if function is called via unchecked call.
-
-      for (var typeParam in function.typeParameters) {
-        if (_typeParameterNeedsBoundCheck(typeParam, forwardingBounds)) {
-          _genTypeParameterBoundCheck(typeParam, forwardingBounds);
-        }
-      }
-      for (var param in function.positionalParameters) {
-        if (!param.isCovariant &&
-            _parameterNeedsTypeCheck(param, forwardingParamTypes)) {
-          _genArgumentTypeCheck(param, forwardingParamTypes);
-        }
-      }
-      for (var param in locals.sortedNamedParameters) {
-        if (!param.isCovariant &&
-            _parameterNeedsTypeCheck(param, forwardingParamTypes)) {
-          _genArgumentTypeCheck(param, forwardingParamTypes);
-        }
-      }
-
-      asm.bind(skipChecks);
-    }
-
-    // Covariant parameters need to be checked even if function is called
-    // via unchecked call, so they are generated outside of JumpIfUnchecked.
-
-    for (var param in function.positionalParameters) {
-      if (param.isCovariant &&
-          _parameterNeedsTypeCheck(param, forwardingParamTypes)) {
-        _genArgumentTypeCheck(param, forwardingParamTypes);
-      }
-    }
-    for (var param in locals.sortedNamedParameters) {
-      if (param.isCovariant &&
-          _parameterNeedsTypeCheck(param, forwardingParamTypes)) {
-        _genArgumentTypeCheck(param, forwardingParamTypes);
-      }
-    }
-  }
-
-  /// Returns true if bound of [typeParam] should be checked.
-  bool _typeParameterNeedsBoundCheck(TypeParameter typeParam,
-      Map<TypeParameter, DartType> forwardingTypeParameterBounds) {
-    if (canSkipTypeChecksForNonCovariantArguments &&
-        (!typeParam.isGenericCovariantImpl ||
-            skipTypeChecksForGenericCovariantImplArguments)) {
-      return false;
-    }
-    final DartType bound = (forwardingTypeParameterBounds != null)
-        ? forwardingTypeParameterBounds[typeParam]
-        : typeParam.bound;
-    if (typeEnvironment.isTop(bound)) {
-      return false;
-    }
-    return true;
-  }
-
-  /// Returns true if type of [param] should be checked.
-  bool _parameterNeedsTypeCheck(VariableDeclaration param,
-      Map<VariableDeclaration, DartType> forwardingParameterTypes) {
-    if (canSkipTypeChecksForNonCovariantArguments &&
-        !param.isCovariant &&
-        (!param.isGenericCovariantImpl ||
-            skipTypeChecksForGenericCovariantImplArguments)) {
-      return false;
-    }
-    final DartType type = (forwardingParameterTypes != null)
-        ? forwardingParameterTypes[param]
-        : param.type;
-    if (typeEnvironment.isTop(type)) {
-      return false;
-    }
-    return true;
-  }
-
-  /// Returns true if there are parameter type/bound checks which can
-  /// be skipped on unchecked call.
-  bool _hasSkippableTypeChecks(
-      FunctionNode function,
-      Map<TypeParameter, DartType> forwardingBounds,
-      Map<VariableDeclaration, DartType> forwardingParamTypes) {
-    for (var typeParam in function.typeParameters) {
-      if (_typeParameterNeedsBoundCheck(typeParam, forwardingBounds)) {
-        return true;
-      }
-    }
-    for (var param in function.positionalParameters) {
-      if (!param.isCovariant &&
-          _parameterNeedsTypeCheck(param, forwardingParamTypes)) {
-        return true;
-      }
-    }
-    for (var param in locals.sortedNamedParameters) {
-      if (!param.isCovariant &&
-          _parameterNeedsTypeCheck(param, forwardingParamTypes)) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  void _genTypeParameterBoundCheck(TypeParameter typeParam,
-      Map<TypeParameter, DartType> forwardingTypeParameterBounds) {
-    final DartType bound = (forwardingTypeParameterBounds != null)
-        ? forwardingTypeParameterBounds[typeParam]
-        : typeParam.bound;
-    final DartType type = new TypeParameterType(typeParam, Nullability.legacy);
-    _genPushInstantiatorAndFunctionTypeArguments([type, bound]);
-    asm.emitPushConstant(cp.addType(type));
-    asm.emitPushConstant(cp.addType(bound));
-    asm.emitPushConstant(cp.addName(typeParam.name));
-    asm.emitAssertSubtype();
-  }
-
-  void _genArgumentTypeCheck(VariableDeclaration variable,
-      Map<VariableDeclaration, DartType> forwardingParameterTypes) {
-    final DartType type = (forwardingParameterTypes != null)
-        ? forwardingParameterTypes[variable]
-        : variable.type;
-    if (locals.isCaptured(variable)) {
-      asm.emitPush(locals.getOriginalParamSlotIndex(variable));
-    } else {
-      asm.emitPush(locals.getVarIndexInFrame(variable));
-    }
-    _genAssertAssignable(type, name: variable.name);
-    asm.emitDrop1();
-  }
-
-  void _genAssertAssignable(DartType type, {String name, String message}) {
-    assert(!typeEnvironment.isTop(type));
-    asm.emitPushConstant(cp.addType(type));
-    _genPushInstantiatorAndFunctionTypeArguments([type]);
-    asm.emitPushConstant(
-        name != null ? cp.addName(name) : cp.addString(message));
-    bool isIntOk = typeEnvironment.isSubtypeOf(
-        typeEnvironment.coreTypes.intLegacyRawType,
-        type,
-        SubtypeCheckMode.ignoringNullabilities);
-    int subtypeTestCacheCpIndex = cp.addSubtypeTestCache();
-    asm.emitAssertAssignable(isIntOk ? 1 : 0, subtypeTestCacheCpIndex);
-  }
-
-  void _pushAssemblerState() {
-    savedAssemblers ??= <BytecodeAssembler>[];
-    savedAssemblers.add(asm);
-    asm = new BytecodeAssembler(options);
-  }
-
-  void _popAssemblerState() {
-    asm = savedAssemblers.removeLast();
-  }
-
-  int _genClosureBytecode(
-      LocalFunction node, String name, FunctionNode function) {
-    _pushAssemblerState();
-
-    locals.enterScope(node);
-
-    final savedParentFunction = parentFunction;
-    parentFunction = enclosingFunction;
-    final savedIsClosure = isClosure;
-    isClosure = true;
-    enclosingFunction = function;
-    final savedLoopDepth = currentLoopDepth;
-    currentLoopDepth = 0;
-    final savedInferredTypesAttribute = inferredTypesAttribute;
-    inferredTypesAttribute = null;
-
-    if (function.typeParameters.isNotEmpty) {
-      functionTypeParameters ??= new List<TypeParameter>();
-      functionTypeParameters.addAll(function.typeParameters);
-      functionTypeParametersSet = functionTypeParameters.toSet();
-    }
-
-    List<Label> savedYieldPoints = yieldPoints;
-    yieldPoints = locals.isSyncYieldingFrame ? <Label>[] : null;
-
-    closures ??= <ClosureDeclaration>[];
-    final int closureIndex = closures.length;
-    final closure = getClosureDeclaration(node, function, name, closureIndex,
-        savedIsClosure ? parentFunction : enclosingMember);
-    closures.add(closure);
-
-    final int closureFunctionIndex = cp.addClosureFunction(closureIndex);
-
-    _recordSourcePosition(function.fileOffset);
-    _genPrologue(node, function);
-
-    if (options.causalAsyncStacks &&
-        parentFunction != null &&
-        (parentFunction.dartAsyncMarker == AsyncMarker.Async ||
-            parentFunction.dartAsyncMarker == AsyncMarker.AsyncStar)) {
-      final savedSourcePosition = asm.currentSourcePosition;
-      _recordSourcePosition(TreeNode.noOffset);
-      _genLoadVar(locals.asyncStackTraceVar,
-          currentContextLevel: locals.contextLevelAtEntry);
-      _genDirectCall(
-          setAsyncThreadStackTrace, objectTable.getArgDescHandle(1), 1);
-      asm.emitDrop1();
-      asm.currentSourcePosition = savedSourcePosition;
-    }
-
-    Label continuationSwitchLabel;
-    int continuationSwitchVar;
-    if (locals.isSyncYieldingFrame) {
-      continuationSwitchLabel = new Label();
-      continuationSwitchVar = locals.scratchVarIndexInFrame;
-      _genSyncYieldingPrologue(
-          function, continuationSwitchLabel, continuationSwitchVar);
-    } else {
-      _setupInitialContext(function);
-      _emitFirstDebugCheck(function);
-    }
-    _checkArguments(function);
-
-    _generateNode(function.body);
-
-    // BytecodeAssembler eliminates this bytecode if it is unreachable.
-    _recordSourcePosition(function.fileEndOffset);
-    asm.emitPushNull();
-    _genReturnTOS();
-
-    if (locals.isSyncYieldingFrame) {
-      _genSyncYieldingEpilogue(
-          function, continuationSwitchLabel, continuationSwitchVar);
-    }
-
-    if (options.emitLocalVarInfo) {
-      // Leave the scopes which were entered in _genPrologue and
-      // _setupInitialContext.
-      asm.localVariableTable.leaveAllScopes(asm.offset, function.fileEndOffset);
-    }
-
-    cp.addEndClosureFunctionScope();
-
-    if (function.typeParameters.isNotEmpty) {
-      functionTypeParameters.length -= function.typeParameters.length;
-      functionTypeParametersSet = functionTypeParameters.toSet();
-    }
-
-    enclosingFunction = parentFunction;
-    parentFunction = savedParentFunction;
-    isClosure = savedIsClosure;
-    currentLoopDepth = savedLoopDepth;
-
-    final attributes = getClosureAttributes();
-    if (attributes != null) {
-      closure.attributes = attributes;
-      closure.flags |= ClosureDeclaration.hasAttributesFlag;
-    }
-    inferredTypesAttribute = savedInferredTypesAttribute;
-
-    locals.leaveScope();
-
-    closure.code = new ClosureCode(asm.bytecode, asm.exceptionsTable,
-        finalizeSourcePositions(), finalizeLocalVariables());
-
-    _popAssemblerState();
-    yieldPoints = savedYieldPoints;
-
-    return closureFunctionIndex;
-  }
-
-  ClosureDeclaration getClosureDeclaration(LocalFunction node,
-      FunctionNode function, String name, int closureIndex, TreeNode parent) {
-    objectTable.declareClosure(function, enclosingMember, closureIndex);
-
-    int flags = 0;
-    int position = TreeNode.noOffset;
-    int endPosition = TreeNode.noOffset;
-    if (options.emitSourcePositions) {
-      position = (node is ast.FunctionDeclaration)
-          ? node.fileOffset
-          : function.fileOffset;
-      endPosition = function.fileEndOffset;
-      if (position != TreeNode.noOffset) {
-        flags |= ClosureDeclaration.hasSourcePositionsFlag;
-      }
-    }
-
-    switch (function.dartAsyncMarker) {
-      case AsyncMarker.Async:
-        flags |= ClosureDeclaration.isAsyncFlag;
-        break;
-      case AsyncMarker.AsyncStar:
-        flags |= ClosureDeclaration.isAsyncStarFlag;
-        break;
-      case AsyncMarker.SyncStar:
-        flags |= ClosureDeclaration.isSyncStarFlag;
-        break;
-      default:
-        flags |= ClosureDeclaration.isDebuggableFlag;
-        break;
-    }
-
-    final List<NameAndType> parameters = <NameAndType>[];
-    for (var v in function.positionalParameters) {
-      parameters.add(new NameAndType(objectTable.getPublicNameHandle(v.name),
-          objectTable.getHandle(v.type)));
-    }
-    for (var v in function.namedParameters) {
-      parameters.add(new NameAndType(objectTable.getPublicNameHandle(v.name),
-          objectTable.getHandle(v.type)));
-    }
-    if (function.requiredParameterCount != parameters.length) {
-      if (function.namedParameters.isNotEmpty) {
-        flags |= ClosureDeclaration.hasOptionalNamedParamsFlag;
-      } else {
-        flags |= ClosureDeclaration.hasOptionalPositionalParamsFlag;
-      }
-    }
-
-    final typeParams =
-        objectTable.getTypeParameterHandles(function.typeParameters);
-    if (typeParams.isNotEmpty) {
-      flags |= ClosureDeclaration.hasTypeParamsFlag;
-    }
-
-    // We only need the required flags when loading the closure declaration.
-    final parameterFlags =
-        getParameterFlags(function, mask: ParameterDeclaration.isRequiredFlag);
-    if (parameterFlags != null) {
-      flags |= ClosureDeclaration.hasParameterFlagsFlag;
-    }
-
-    return new ClosureDeclaration(
-        flags,
-        objectTable.getHandle(parent),
-        objectTable.getPublicNameHandle(name),
-        position,
-        endPosition,
-        typeParams,
-        function.requiredParameterCount,
-        function.namedParameters.length,
-        parameters,
-        parameterFlags,
-        objectTable.getHandle(function.returnType));
-  }
-
-  void _genSyncYieldingPrologue(FunctionNode function, Label continuationLabel,
-      int switchVarIndexInFrame) {
-    Label debugCheckLabel = new Label();
-
-    // switch_var = :await_jump_var
-    _genLoadVar(locals.awaitJumpVar);
-    asm.emitStoreLocal(switchVarIndexInFrame);
-
-    _genPushInt(0);
-
-    if (options.emitDebuggerStops) {
-      // if (switch_var != 0) goto debugCheckLabel
-      asm.emitJumpIfNeStrict(debugCheckLabel);
-
-      _setupInitialContext(function);
-
-      asm.bind(debugCheckLabel);
-      // The debugger may set a breakpoint on this DebugCheck opcode and it
-      // expects to hit it on the first entry to the async op, as well as on
-      // each subsequent reentry.
-      _emitFirstDebugCheck(function);
-
-      _genLoadVar(locals.awaitJumpVar);
-
-      // if (switch_var != 0) goto continuationLabel
-      _genPushInt(0);
-      asm.emitJumpIfNeStrict(continuationLabel);
-    } else {
-      // if (switch_var != 0) goto continuationLabel
-      asm.emitJumpIfNeStrict(continuationLabel);
-
-      _setupInitialContext(function);
-    }
-
-    // Proceed to normal entry.
-  }
-
-  void _genSyncYieldingEpilogue(FunctionNode function, Label continuationLabel,
-      int switchVarIndexInFrame) {
-    asm.bind(continuationLabel);
-
-    if (yieldPoints.isEmpty) {
-      asm.emitTrap();
-      return;
-    }
-
-    // context = :await_ctx_var
-    _genLoadVar(locals.awaitContextVar);
-    asm.emitPopLocal(locals.contextVarIndexInFrame);
-
-    for (int i = 0; i < yieldPoints.length; i++) {
-      // 0 is reserved for normal entry, yield points are counted from 1.
-      final int index = i + 1;
-
-      // if (switch_var == #index) goto yieldPoints[i]
-      // There is no need to test switch_var for the last yield statement.
-      if (i != yieldPoints.length - 1) {
-        asm.emitPush(switchVarIndexInFrame);
-        _genPushInt(index);
-        asm.emitJumpIfEqStrict(yieldPoints[i]);
-      } else {
-        asm.emitJump(yieldPoints[i]);
-      }
-    }
-  }
-
-  void _genAllocateClosureInstance(
-      TreeNode node, int closureFunctionIndex, FunctionNode function) {
-    asm.emitAllocateClosure(closureFunctionIndex);
-
-    final int temp = locals.tempIndexInFrame(node);
-    asm.emitStoreLocal(temp);
-
-    // TODO(alexmarkov): We need to fill _instantiator_type_arguments field
-    // only if function signature uses instantiator type arguments.
-    asm.emitPush(temp);
-    _genPushInstantiatorTypeArguments();
-    asm.emitStoreFieldTOS(
-        cp.addInstanceField(closureInstantiatorTypeArguments));
-
-    asm.emitPush(temp);
-    _genPushFunctionTypeArguments();
-    asm.emitStoreFieldTOS(cp.addInstanceField(closureFunctionTypeArguments));
-
-    // Delayed type arguments are only used by generic closures.
-    if (function.typeParameters.isNotEmpty) {
-      asm.emitPush(temp);
-      asm.emitPushConstant(cp.addEmptyTypeArguments());
-      asm.emitStoreFieldTOS(cp.addInstanceField(closureDelayedTypeArguments));
-    }
-
-    asm.emitPush(temp);
-    asm.emitPushConstant(closureFunctionIndex);
-    asm.emitStoreFieldTOS(cp.addInstanceField(closureFunction));
-
-    asm.emitPush(temp);
-    asm.emitPush(locals.contextVarIndexInFrame);
-    asm.emitStoreFieldTOS(cp.addInstanceField(closureContext));
-  }
-
-  void _genClosure(LocalFunction node, String name, FunctionNode function) {
-    final int closureFunctionIndex = _genClosureBytecode(node, name, function);
-    _genAllocateClosureInstance(node, closureFunctionIndex, function);
-  }
-
-  void _allocateContextIfNeeded() {
-    final int contextSize = locals.currentContextSize;
-    if (contextSize > 0) {
-      asm.emitAllocateContext(locals.currentContextId, contextSize);
-
-      if (locals.currentContextLevel > 0) {
-        _genDupTOS(locals.scratchVarIndexInFrame);
-        asm.emitPush(locals.contextVarIndexInFrame);
-        asm.emitStoreContextParent();
-      }
-
-      asm.emitPopLocal(locals.contextVarIndexInFrame);
-    }
-  }
-
-  void _enterScope(TreeNode node) {
-    locals.enterScope(node);
-    _allocateContextIfNeeded();
-    if (options.emitLocalVarInfo) {
-      asm.localVariableTable
-          .enterScope(asm.offset, locals.currentContextLevel, node.fileOffset);
-      _startRecordingMaxPosition(node.fileOffset);
-    }
-  }
-
-  void _leaveScope() {
-    if (options.emitLocalVarInfo) {
-      asm.localVariableTable.leaveScope(asm.offset, _endRecordingMaxPosition());
-    }
-    if (locals.currentContextSize > 0) {
-      _genUnwindContext(locals.currentContextLevel - 1);
-    }
-    locals.leaveScope();
-  }
-
-  void _startRecordingMaxPosition(int fileOffset) {
-    savedMaxSourcePositions.add(maxSourcePosition);
-    maxSourcePosition = fileOffset;
-  }
-
-  int _endRecordingMaxPosition() {
-    int localMax = maxSourcePosition;
-    maxSourcePosition =
-        math.max(localMax, savedMaxSourcePositions.removeLast());
-    return localMax;
-  }
-
-  void _genUnwindContext(int targetContextLevel) {
-    int currentContextLevel = locals.currentContextLevel;
-    assert(currentContextLevel >= targetContextLevel);
-    while (currentContextLevel > targetContextLevel) {
-      asm.emitPush(locals.contextVarIndexInFrame);
-      asm.emitLoadContextParent();
-      asm.emitPopLocal(locals.contextVarIndexInFrame);
-      --currentContextLevel;
-    }
-  }
-
-  /// Returns the list of try-finally blocks between [from] and [to],
-  /// ordered from inner to outer. If [to] is null, returns all enclosing
-  /// try-finally blocks up to the function boundary.
-  List<TryFinally> _getEnclosingTryFinallyBlocks(TreeNode from, TreeNode to) {
-    List<TryFinally> blocks = <TryFinally>[];
-    TreeNode node = from;
-    for (;;) {
-      if (node == to) {
-        return blocks;
-      }
-      if (node == null || node is FunctionNode || node is Member) {
-        if (to == null) {
-          return blocks;
-        } else {
-          throw 'Unable to find node $to up from $from';
-        }
-      }
-      // Inspect parent as we only need try-finally blocks enclosing [node]
-      // in the body, and not in the finally-block.
-      final parent = node.parent;
-      if (parent is TryFinally && parent.body == node) {
-        blocks.add(parent);
-      }
-      node = parent;
-    }
-  }
-
-  /// Appends chained [FinallyBlock]s to each try-finally in the given
-  /// list [tryFinallyBlocks] (ordered from inner to outer).
-  /// [continuation] is invoked to generate control transfer code following
-  /// the last finally block.
-  void _addFinallyBlocks(
-      List<TryFinally> tryFinallyBlocks, GenerateContinuation continuation) {
-    // Add finally blocks to all try-finally from outer to inner.
-    // The outermost finally block should generate continuation, each inner
-    // finally block should proceed to a corresponding outer block.
-    for (var tryFinally in tryFinallyBlocks.reversed) {
-      final finallyBlock = new FinallyBlock(continuation);
-      finallyBlocks[tryFinally].add(finallyBlock);
-
-      final Label nextFinally = finallyBlock.entry;
-      continuation = () {
-        asm.emitJump(nextFinally);
-      };
-    }
-
-    // Generate jump to the innermost finally (or to the original
-    // continuation if there are no try-finally blocks).
-    continuation();
-  }
-
-  /// Generates non-local transfer from inner node [from] into the outer
-  /// node, executing finally blocks on the way out. [to] can be null,
-  /// in such case all enclosing finally blocks are executed.
-  /// [continuation] is invoked to generate control transfer code following
-  /// the last finally block.
-  void _generateNonLocalControlTransfer(
-      TreeNode from, TreeNode to, GenerateContinuation continuation) {
-    if (options.emitDebuggerStops && from.fileOffset != TreeNode.noOffset) {
-      asm.emitDebugCheck(); // Before context is unwound.
-    }
-    List<TryFinally> tryFinallyBlocks = _getEnclosingTryFinallyBlocks(from, to);
-    _addFinallyBlocks(tryFinallyBlocks, continuation);
-  }
-
-  // For certain expressions wrapped into ExpressionStatement we can
-  // omit pushing result on the stack.
-  bool isExpressionWithoutResult(Expression expr) =>
-      expr.parent is ExpressionStatement &&
-      (expr is VariableSet ||
-          expr is PropertySet ||
-          expr is StaticSet ||
-          expr is SuperPropertySet);
-
-  void _createArgumentsArray(int temp, List<DartType> typeArgs,
-      List<Expression> args, bool storeLastArgumentToTemp) {
-    final int totalCount = (typeArgs.isNotEmpty ? 1 : 0) + args.length;
-
-    _genTypeArguments([const DynamicType()]);
-    _genPushInt(totalCount);
-    asm.emitCreateArrayTOS();
-
-    asm.emitStoreLocal(temp);
-
-    int index = 0;
-    if (typeArgs.isNotEmpty) {
-      asm.emitPush(temp);
-      _genPushInt(index++);
-      _genTypeArguments(typeArgs);
-      asm.emitStoreIndexedTOS();
-    }
-
-    for (Expression arg in args) {
-      asm.emitPush(temp);
-      _genPushInt(index++);
-      _generateNode(arg);
-      if (storeLastArgumentToTemp && index == totalCount) {
-        // Arguments array in 'temp' is replaced with the last argument
-        // in order to return result of RHS value in case of setter.
-        asm.emitStoreLocal(temp);
-      }
-      asm.emitStoreIndexedTOS();
-    }
-  }
-
-  void _genNoSuchMethodForSuperCall(String name, int temp, int argDescCpIndex,
-      List<DartType> typeArgs, List<Expression> args,
-      {bool storeLastArgumentToTemp: false}) {
-    // Receiver for noSuchMethod() call.
-    _genPushReceiver();
-
-    // Argument 0 for _allocateInvocationMirror(): function name.
-    asm.emitPushConstant(cp.addName(name));
-
-    // Argument 1 for _allocateInvocationMirror(): arguments descriptor.
-    asm.emitPushConstant(argDescCpIndex);
-
-    // Argument 2 for _allocateInvocationMirror(): list of arguments.
-    _createArgumentsArray(temp, typeArgs, args, storeLastArgumentToTemp);
-
-    // Argument 3 for _allocateInvocationMirror(): isSuperInvocation flag.
-    asm.emitPushTrue();
-
-    _genDirectCall(
-        allocateInvocationMirror, objectTable.getArgDescHandle(4), 4);
-
-    final Member target = hierarchy.getDispatchTarget(
-        enclosingClass.superclass, noSuchMethodName);
-    assert(target != null);
-    _genDirectCall(target, objectTable.getArgDescHandle(2), 2);
-  }
-
-  @override
-  defaultTreeNode(Node node) => throw new UnsupportedOperationError(
-      'Unsupported node ${node.runtimeType}');
-
-  @override
-  visitAsExpression(AsExpression node) {
-    _generateNode(node.operand);
-
-    final type = node.type;
-    if (typeEnvironment.isTop(type)) {
-      return;
-    }
-
-    _genAssertAssignable(type,
-        message: node.isTypeError ? '' : symbolForTypeCast);
-  }
-
-  @override
-  visitBoolLiteral(BoolLiteral node) {
-    _genPushBool(node.value);
-  }
-
-  @override
-  visitIntLiteral(IntLiteral node) {
-    _genPushInt(node.value);
-  }
-
-  @override
-  visitDoubleLiteral(DoubleLiteral node) {
-    final cpIndex = cp.addObjectRef(new DoubleConstant(node.value));
-    asm.emitPushConstant(cpIndex);
-  }
-
-  @override
-  visitConditionalExpression(ConditionalExpression node) {
-    final Label otherwisePart = new Label();
-    final Label done = new Label();
-    final int temp = locals.tempIndexInFrame(node);
-
-    _genConditionAndJumpIf(node.condition, false, otherwisePart);
-
-    _generateNode(node.then);
-    asm.emitPopLocal(temp);
-    asm.emitJump(done);
-
-    asm.bind(otherwisePart);
-    _generateNode(node.otherwise);
-    asm.emitPopLocal(temp);
-
-    asm.bind(done);
-    asm.emitPush(temp);
-  }
-
-  @override
-  visitConstructorInvocation(ConstructorInvocation node) {
-    if (node.isConst) {
-      _genPushConstExpr(node);
-      return;
-    }
-
-    final constructedClass = node.constructedType.classNode;
-    final classIndex = cp.addClass(constructedClass);
-
-    if (hasInstantiatorTypeArguments(constructedClass)) {
-      _genTypeArguments(node.arguments.types,
-          instantiatingClass: constructedClass);
-      asm.emitPushConstant(cp.addClass(constructedClass));
-      asm.emitAllocateT();
-    } else {
-      assert(node.arguments.types.isEmpty);
-      asm.emitAllocate(classIndex);
-    }
-
-    _genDupTOS(locals.tempIndexInFrame(node));
-
-    // Remove type arguments as they are only passed to instance allocation,
-    // and not passed to a constructor.
-    final args =
-        new Arguments(node.arguments.positional, named: node.arguments.named)
-          ..parent = node;
-    _genArguments(null, args);
-    _genDirectCallWithArgs(node.target, args, hasReceiver: true, node: node);
-    asm.emitDrop1();
-  }
-
-  @override
-  visitFunctionExpression(FunctionExpression node) {
-    _genClosure(node, '<anonymous closure>', node.function);
-  }
-
-  @override
-  visitInstantiation(Instantiation node) {
-    final int oldClosure = locals.tempIndexInFrame(node, tempIndex: 0);
-    final int newClosure = locals.tempIndexInFrame(node, tempIndex: 1);
-    final int typeArguments = locals.tempIndexInFrame(node, tempIndex: 2);
-
-    _generateNode(node.expression);
-    asm.emitStoreLocal(oldClosure);
-
-    _genTypeArguments(node.typeArguments);
-    asm.emitStoreLocal(typeArguments);
-
-    _genDirectCall(
-        boundsCheckForPartialInstantiation, objectTable.getArgDescHandle(2), 2);
-    asm.emitDrop1();
-
-    assert(closureClass.typeParameters.isEmpty);
-    asm.emitAllocate(cp.addClass(closureClass));
-    asm.emitStoreLocal(newClosure);
-
-    asm.emitPush(typeArguments);
-    asm.emitStoreFieldTOS(cp.addInstanceField(closureDelayedTypeArguments));
-
-    // Copy the rest of the fields from old closure to a new closure.
-    final fieldsToCopy = <Field>[
-      closureInstantiatorTypeArguments,
-      closureFunctionTypeArguments,
-      closureFunction,
-      closureContext,
-    ];
-
-    for (Field field in fieldsToCopy) {
-      final fieldOffsetCpIndex = cp.addInstanceField(field);
-      asm.emitPush(newClosure);
-      asm.emitPush(oldClosure);
-      asm.emitLoadFieldTOS(fieldOffsetCpIndex);
-      asm.emitStoreFieldTOS(fieldOffsetCpIndex);
-    }
-
-    asm.emitPush(newClosure);
-  }
-
-  @override
-  visitIsExpression(IsExpression node) {
-    _generateNode(node.operand);
-    _genInstanceOf(node.type);
-  }
-
-  @override
-  visitLet(Let node) {
-    _enterScope(node);
-    _generateNode(node.variable);
-    _generateNode(node.body);
-    _leaveScope();
-  }
-
-  @override
-  visitListLiteral(ListLiteral node) {
-    if (node.isConst) {
-      _genPushConstExpr(node);
-      return;
-    }
-
-    _genTypeArguments([node.typeArgument]);
-
-    if (node.expressions.isEmpty) {
-      asm.emitPushConstant(
-          cp.addObjectRef(new ListConstant(const DynamicType(), const [])));
-    } else {
-      _genDupTOS(locals.tempIndexInFrame(node));
-      _genPushInt(node.expressions.length);
-      asm.emitCreateArrayTOS();
-      final int temp = locals.tempIndexInFrame(node);
-      asm.emitStoreLocal(temp);
-
-      for (int i = 0; i < node.expressions.length; i++) {
-        asm.emitPush(temp);
-        _genPushInt(i);
-        _generateNode(node.expressions[i]);
-        asm.emitStoreIndexedTOS();
-      }
-    }
-
-    // List._fromLiteral is a factory constructor.
-    // Type arguments passed to a factory constructor are counted as a normal
-    // argument and not counted in number of type arguments.
-    assert(listFromLiteral.isFactory);
-    _genDirectCall(listFromLiteral, objectTable.getArgDescHandle(2), 2);
-  }
-
-  @override
-  visitLogicalExpression(LogicalExpression node) {
-    final Label shortCircuit = new Label();
-    final Label done = new Label();
-    final int temp = locals.tempIndexInFrame(node);
-    final isOR = (node.operatorEnum == LogicalExpressionOperator.OR);
-
-    _genConditionAndJumpIf(node.left, isOR, shortCircuit);
-
-    bool negated = _genCondition(node.right);
-    if (negated) {
-      asm.emitBooleanNegateTOS();
-    }
-    asm.emitPopLocal(temp);
-    asm.emitJump(done);
-
-    asm.bind(shortCircuit);
-    _genPushBool(isOR);
-    asm.emitPopLocal(temp);
-
-    asm.bind(done);
-    asm.emitPush(temp);
-  }
-
-  @override
-  visitMapLiteral(MapLiteral node) {
-    if (node.isConst) {
-      _genPushConstExpr(node);
-      return;
-    }
-
-    _genTypeArguments([node.keyType, node.valueType]);
-
-    if (node.entries.isEmpty) {
-      asm.emitPushConstant(
-          cp.addObjectRef(new ListConstant(const DynamicType(), const [])));
-    } else {
-      _genTypeArguments([const DynamicType()]);
-      _genPushInt(node.entries.length * 2);
-      asm.emitCreateArrayTOS();
-
-      final int temp = locals.tempIndexInFrame(node);
-      asm.emitStoreLocal(temp);
-
-      for (int i = 0; i < node.entries.length; i++) {
-        // key
-        asm.emitPush(temp);
-        _genPushInt(i * 2);
-        _generateNode(node.entries[i].key);
-        asm.emitStoreIndexedTOS();
-        // value
-        asm.emitPush(temp);
-        _genPushInt(i * 2 + 1);
-        _generateNode(node.entries[i].value);
-        asm.emitStoreIndexedTOS();
-      }
-    }
-
-    // Map._fromLiteral is a factory constructor.
-    // Type arguments passed to a factory constructor are counted as a normal
-    // argument and not counted in number of type arguments.
-    assert(mapFromLiteral.isFactory);
-    _genDirectCall(mapFromLiteral, objectTable.getArgDescHandle(2), 2);
-  }
-
-  void _genMethodInvocationUsingSpecializedBytecode(
-      Opcode opcode, MethodInvocation node) {
-    switch (opcode) {
-      case Opcode.kEqualsNull:
-        if (node.receiver is NullLiteral) {
-          _generateNode(node.arguments.positional.single);
-        } else {
-          _generateNode(node.receiver);
-        }
-        break;
-
-      case Opcode.kNegateInt:
-      case Opcode.kNegateDouble:
-        _generateNode(node.receiver);
-        break;
-
-      case Opcode.kAddInt:
-      case Opcode.kSubInt:
-      case Opcode.kMulInt:
-      case Opcode.kTruncDivInt:
-      case Opcode.kModInt:
-      case Opcode.kBitAndInt:
-      case Opcode.kBitOrInt:
-      case Opcode.kBitXorInt:
-      case Opcode.kShlInt:
-      case Opcode.kShrInt:
-      case Opcode.kCompareIntEq:
-      case Opcode.kCompareIntGt:
-      case Opcode.kCompareIntLt:
-      case Opcode.kCompareIntGe:
-      case Opcode.kCompareIntLe:
-      case Opcode.kAddDouble:
-      case Opcode.kSubDouble:
-      case Opcode.kMulDouble:
-      case Opcode.kDivDouble:
-      case Opcode.kCompareDoubleEq:
-      case Opcode.kCompareDoubleGt:
-      case Opcode.kCompareDoubleLt:
-      case Opcode.kCompareDoubleGe:
-      case Opcode.kCompareDoubleLe:
-        _generateNode(node.receiver);
-        _generateNode(node.arguments.positional.single);
-        break;
-
-      default:
-        throw 'Unexpected specialized bytecode $opcode';
-    }
-
-    asm.emitSpecializedBytecode(opcode);
-  }
-
-  bool _isUncheckedCall(
-          Node node, Member interfaceTarget, Expression receiver) =>
-      isUncheckedCall(interfaceTarget, receiver, staticTypeContext) ||
-      (inferredTypeMetadata != null &&
-          inferredTypeMetadata[node]?.skipCheck == true);
-
-  void _genInstanceCall(
-      Node node,
-      InvocationKind invocationKind,
-      Member interfaceTarget,
-      Name targetName,
-      Expression receiver,
-      int totalArgCount,
-      ObjectHandle argDesc) {
-    final isDynamic = interfaceTarget == null;
-    final isUnchecked = invocationKind != InvocationKind.getter &&
-        _isUncheckedCall(node, interfaceTarget, receiver);
-
-    if (inferredTypeMetadata != null && node != null) {
-      _appendInferredType(node, asm.offset);
-    }
-
-    bool generated = false;
-    if (invocationKind != InvocationKind.getter && !isDynamic && !isUnchecked) {
-      final staticReceiverType = getStaticType(receiver, staticTypeContext);
-      if (isInstantiatedInterfaceCall(interfaceTarget, staticReceiverType)) {
-        final callCpIndex = cp.addInstantiatedInterfaceCall(
-            invocationKind, interfaceTarget, argDesc, staticReceiverType);
-        asm.emitInstantiatedInterfaceCall(callCpIndex, totalArgCount);
-        generated = true;
-      }
-    }
-
-    if (!generated) {
-      final callCpIndex = cp.addInstanceCall(
-          invocationKind, interfaceTarget, targetName, argDesc);
-      if (isDynamic) {
-        assert(!isUnchecked);
-        asm.emitDynamicCall(callCpIndex, totalArgCount);
-      } else if (isUnchecked) {
-        asm.emitUncheckedInterfaceCall(callCpIndex, totalArgCount);
-      } else {
-        asm.emitInterfaceCall(callCpIndex, totalArgCount);
-      }
-    }
-
-    if (inferredTypeMetadata != null && node != null) {
-      _replaceWithConstantValue(node);
-    }
-  }
-
-  @override
-  visitMethodInvocation(MethodInvocation node) {
-    final directCall =
-        directCallMetadata != null ? directCallMetadata[node] : null;
-    final Opcode opcode = recognizedMethods.specializedBytecodeFor(node);
-    if (opcode != null && directCall == null) {
-      _genMethodInvocationUsingSpecializedBytecode(opcode, node);
-      return;
-    }
-    final args = node.arguments;
-    final totalArgCount = args.positional.length +
-        args.named.length +
-        1 /* receiver */ +
-        (args.types.isNotEmpty ? 1 : 0) /* type arguments */;
-    if (totalArgCount >= argumentsLimit) {
-      throw new TooManyArgumentsException(node.fileOffset);
-    }
-    // Front-end guarantees that all calls with known function type
-    // do not need any argument type checks.
-    if (isUncheckedClosureCall(node, staticTypeContext, options)) {
-      final int receiverTemp = locals.tempIndexInFrame(node);
-      _genArguments(node.receiver, args, storeReceiverToLocal: receiverTemp);
-      // Duplicate receiver (closure) for UncheckedClosureCall.
-      asm.emitPush(receiverTemp);
-      final argDescCpIndex = cp.addArgDescByArguments(args, hasReceiver: true);
-      asm.emitUncheckedClosureCall(argDescCpIndex, totalArgCount);
-      return;
-    }
-
-    final Member interfaceTarget = node.interfaceTarget;
-    if (!(interfaceTarget == null ||
-        interfaceTarget is Procedure && !interfaceTarget.isGetter)) {
-      throw new UnsupportedOperationError(
-          'Unsupported MethodInvocation with interface target ${interfaceTarget.runtimeType} $interfaceTarget');
-    }
-
-    if (directCall != null && directCall.checkReceiverForNull) {
-      final int receiverTemp = locals.tempIndexInFrame(node);
-      _genArguments(node.receiver, args, storeReceiverToLocal: receiverTemp);
-      asm.emitPush(receiverTemp);
-      asm.emitNullCheck(cp.addSelectorName(node.name, InvocationKind.method));
-    } else {
-      _genArguments(node.receiver, args);
-    }
-
-    final argDesc =
-        objectTable.getArgDescHandleByArguments(args, hasReceiver: true);
-
-    if (directCall != null) {
-      final isDynamicForwarder = (interfaceTarget == null);
-      final isUnchecked =
-          _isUncheckedCall(node, interfaceTarget, node.receiver);
-      _genDirectCall(directCall.target, argDesc, totalArgCount,
-          isDynamicForwarder: isDynamicForwarder,
-          isUnchecked: isUnchecked,
-          node: node);
-    } else {
-      _genInstanceCall(node, InvocationKind.method, interfaceTarget, node.name,
-          node.receiver, totalArgCount, argDesc);
-    }
-  }
-
-  @override
-  visitPropertyGet(PropertyGet node) {
-    _generateNode(node.receiver);
-    final argDesc = objectTable.getArgDescHandle(1);
-
-    final directCall =
-        directCallMetadata != null ? directCallMetadata[node] : null;
-    if (directCall != null) {
-      if (directCall.checkReceiverForNull) {
-        final int receiverTemp = locals.tempIndexInFrame(node);
-        asm.emitStoreLocal(receiverTemp);
-        asm.emitPush(receiverTemp);
-        asm.emitNullCheck(cp.addSelectorName(node.name, InvocationKind.getter));
-      }
-      _genDirectCall(directCall.target, argDesc, 1, isGet: true, node: node);
-    } else {
-      _genInstanceCall(node, InvocationKind.getter, node.interfaceTarget,
-          node.name, node.receiver, 1, argDesc);
-    }
-  }
-
-  @override
-  visitPropertySet(PropertySet node) {
-    final int temp = locals.tempIndexInFrame(node);
-    final bool hasResult = !isExpressionWithoutResult(node);
-
-    _generateNode(node.receiver);
-
-    final directCall =
-        directCallMetadata != null ? directCallMetadata[node] : null;
-    if (directCall != null && directCall.checkReceiverForNull) {
-      asm.emitStoreLocal(temp);
-      _generateNode(node.value);
-      asm.emitPush(temp);
-      asm.emitNullCheck(cp.addSelectorName(node.name, InvocationKind.setter));
-    } else {
-      _generateNode(node.value);
-    }
-
-    if (hasResult) {
-      asm.emitStoreLocal(temp);
-    }
-
-    const int numArguments = 2;
-    final argDesc = objectTable.getArgDescHandle(numArguments);
-
-    if (directCall != null) {
-      final isDynamicForwarder = (node.interfaceTarget == null);
-      final isUnchecked =
-          _isUncheckedCall(node, node.interfaceTarget, node.receiver);
-      _genDirectCall(directCall.target, argDesc, numArguments,
-          isSet: true,
-          isDynamicForwarder: isDynamicForwarder,
-          isUnchecked: isUnchecked,
-          node: node);
-    } else {
-      _genInstanceCall(node, InvocationKind.setter, node.interfaceTarget,
-          node.name, node.receiver, numArguments, argDesc);
-    }
-
-    asm.emitDrop1();
-
-    if (hasResult) {
-      asm.emitPush(temp);
-    }
-  }
-
-  @override
-  visitSuperMethodInvocation(SuperMethodInvocation node) {
-    final args = node.arguments;
-    final Member target =
-        hierarchy.getDispatchTarget(enclosingClass.superclass, node.name);
-    if (target == null) {
-      final int temp = locals.tempIndexInFrame(node);
-      _genNoSuchMethodForSuperCall(
-          node.name.text,
-          temp,
-          cp.addArgDescByArguments(args, hasReceiver: true),
-          args.types,
-          <Expression>[new ThisExpression()]
-            ..addAll(args.positional)
-            ..addAll(args.named.map((x) => x.value)));
-      return;
-    }
-    if (!(target is Procedure && !target.isGetter)) {
-      throw new UnsupportedOperationError(
-          'Unsupported SuperMethodInvocation with target ${target.runtimeType} $target');
-    }
-    _genArguments(new ThisExpression(), args);
-    _genDirectCallWithArgs(target, args,
-        hasReceiver: true, isUnchecked: true, node: node);
-  }
-
-  @override
-  visitSuperPropertyGet(SuperPropertyGet node) {
-    final Member target =
-        hierarchy.getDispatchTarget(enclosingClass.superclass, node.name);
-    if (target == null) {
-      final int temp = locals.tempIndexInFrame(node);
-      _genNoSuchMethodForSuperCall(node.name.text, temp, cp.addArgDesc(1), [],
-          <Expression>[new ThisExpression()]);
-      return;
-    }
-    _genPushReceiver();
-    _genDirectCall(target, objectTable.getArgDescHandle(1), 1,
-        isGet: true, node: node);
-  }
-
-  @override
-  visitSuperPropertySet(SuperPropertySet node) {
-    final int temp = locals.tempIndexInFrame(node);
-    final bool hasResult = !isExpressionWithoutResult(node);
-
-    final Member target = hierarchy
-        .getDispatchTarget(enclosingClass.superclass, node.name, setter: true);
-    if (target == null) {
-      _genNoSuchMethodForSuperCall(node.name.text, temp, cp.addArgDesc(2), [],
-          <Expression>[new ThisExpression(), node.value],
-          storeLastArgumentToTemp: hasResult);
-    } else {
-      _genPushReceiver();
-      _generateNode(node.value);
-
-      if (hasResult) {
-        asm.emitStoreLocal(temp);
-      }
-
-      assert(target is Field || (target is Procedure && target.isSetter));
-      _genDirectCall(target, objectTable.getArgDescHandle(2), 2,
-          isSet: true, isUnchecked: true, node: node);
-    }
-
-    asm.emitDrop1();
-
-    if (hasResult) {
-      asm.emitPush(temp);
-    }
-  }
-
-  @override
-  visitNot(Not node) {
-    bool negated = _genCondition(node.operand);
-    if (!negated) {
-      asm.emitBooleanNegateTOS();
-    }
-  }
-
-  @override
-  visitNullCheck(NullCheck node) {
-    _generateNode(node.operand);
-    final operandTemp = locals.tempIndexInFrame(node);
-    asm.emitStoreLocal(operandTemp);
-    asm.emitPush(operandTemp);
-    asm.emitNullCheck(cp.addObjectRef(null));
-  }
-
-  @override
-  visitNullLiteral(NullLiteral node) {
-    asm.emitPushNull();
-  }
-
-  @override
-  visitRethrow(Rethrow node) {
-    TryCatch tryCatch;
-    for (var parent = node.parent;; parent = parent.parent) {
-      if (parent is Catch) {
-        tryCatch = parent.parent as TryCatch;
-        break;
-      }
-      if (parent == null || parent is FunctionNode) {
-        throw 'Unable to find enclosing catch for $node';
-      }
-    }
-    tryCatches[tryCatch].needsStackTrace = true;
-
-    if (options.emitDebuggerStops) {
-      asm.emitDebugCheck(); // Allow breakpoint on explicit rethrow statement.
-    }
-    _genRethrow(tryCatch);
-  }
-
-  bool _hasNonTrivialInitializer(Field field) {
-    if (field.initializer == null) return false;
-    return !_isTrivialInitializer(field.initializer);
-  }
-
-  bool _isTrivialInitializer(Expression initializer) {
-    if (initializer == null) return false;
-    if (initializer is StringLiteral ||
-        initializer is BoolLiteral ||
-        initializer is IntLiteral ||
-        initializer is DoubleLiteral ||
-        initializer is NullLiteral) {
-      return true;
-    }
-    if (initializer is ConstantExpression &&
-        initializer.constant is PrimitiveConstant) {
-      return true;
-    }
-    return false;
-  }
-
-  @override
-  visitStaticGet(StaticGet node) {
-    final target = node.target;
-    if (target is Field) {
-      if (target.isConst) {
-        _genPushConstExpr(target.initializer);
-      } else if (!_needsGetter(target)) {
-        if (inferredTypeMetadata != null) {
-          final InferredType md = inferredTypeMetadata[node];
-          if (md != null && md.constantValue != null) {
-            _genPushConstant(md.constantValue);
-            return;
-          }
-        }
-        asm.emitLoadStatic(cp.addStaticField(target));
-      } else {
-        _genDirectCall(target, objectTable.getArgDescHandle(0), 0,
-            isGet: true, node: node);
-      }
-    } else if (target is Procedure) {
-      if (target.isGetter) {
-        _genDirectCall(target, objectTable.getArgDescHandle(0), 0,
-            isGet: true, node: node);
-      } else if (target.isFactory || target.isRedirectingFactoryConstructor) {
-        throw 'Unexpected target for StaticGet: factory $target';
-      } else {
-        asm.emitPushConstant(cp.addObjectRef(new TearOffConstant(target)));
-      }
-    } else {
-      throw 'Unexpected target for StaticGet: ${target.runtimeType} $target';
-    }
-  }
-
-  @override
-  visitStaticInvocation(StaticInvocation node) {
-    if (node.isConst) {
-      _genPushConstExpr(node);
-      return;
-    }
-    Arguments args = node.arguments;
-    final target = node.target;
-    if (target == unsafeCast) {
-      // The result of the unsafeCast() intrinsic method is its sole argument,
-      // without any additional checks or type casts.
-      assert(args.named.isEmpty);
-      _generateNode(args.positional.single);
-      return;
-    }
-    if (!options.causalAsyncStacks &&
-        target == coreTypes.asyncStackTraceHelperProcedure) {
-      // Eliminate calls to _asyncStackTraceHelper as causal async stacks are
-      // disabled. These calls are inserted by async transformation
-      // (pkg/kernel/lib/transformations/continuation.dart), but they should be
-      // consistent with _setAsyncThreadStackTrace and
-      // _clearAsyncThreadStackTrace calls generated by bytecode generator.
-      //
-      // Push null as _asyncStackTraceHelper call should leave result
-      // on the stack.
-      asm.emitPushNull();
-      return;
-    }
-    if (target.isFactory) {
-      final constructedClass = target.enclosingClass;
-      if (hasInstantiatorTypeArguments(constructedClass)) {
-        _genTypeArguments(args.types, instantiatingClass: constructedClass);
-      } else {
-        assert(args.types.isEmpty);
-        // VM needs type arguments for every invocation of a factory
-        // constructor. TODO(alexmarkov): Clean this up.
-        asm.emitPushNull();
-      }
-      args =
-          new Arguments(node.arguments.positional, named: node.arguments.named)
-            ..parent = node;
-    }
-    _genArguments(null, args);
-    _genDirectCallWithArgs(target, args,
-        isFactory: target.isFactory, node: node);
-  }
-
-  @override
-  visitStaticSet(StaticSet node) {
-    final bool hasResult = !isExpressionWithoutResult(node);
-
-    _generateNode(node.value);
-
-    if (hasResult) {
-      _genDupTOS(locals.tempIndexInFrame(node));
-    }
-
-    final target = node.target;
-    if (target is Field && !_needsSetter(target)) {
-      if (options.emitDebuggerStops &&
-          _variableSetNeedsDebugCheck(node.value)) {
-        asm.emitDebugCheck();
-      }
-      int cpIndex = cp.addStaticField(target);
-      asm.emitStoreStaticTOS(cpIndex);
-    } else {
-      _genDirectCall(target, objectTable.getArgDescHandle(1), 1,
-          isSet: true, node: node);
-      asm.emitDrop1();
-    }
-  }
-
-  @override
-  visitStringConcatenation(StringConcatenation node) {
-    if (node.expressions.length == 1) {
-      _generateNode(node.expressions.single);
-      _genDirectCall(interpolateSingle, objectTable.getArgDescHandle(1), 1);
-    } else {
-      asm.emitPushNull();
-      _genPushInt(node.expressions.length);
-      asm.emitCreateArrayTOS();
-
-      final int temp = locals.tempIndexInFrame(node);
-      asm.emitStoreLocal(temp);
-
-      for (int i = 0; i < node.expressions.length; i++) {
-        asm.emitPush(temp);
-        _genPushInt(i);
-        _generateNode(node.expressions[i]);
-        asm.emitStoreIndexedTOS();
-      }
-
-      _genDirectCall(interpolate, objectTable.getArgDescHandle(1), 1);
-    }
-  }
-
-  @override
-  visitStringLiteral(StringLiteral node) {
-    final cpIndex = cp.addString(node.value);
-    asm.emitPushConstant(cpIndex);
-  }
-
-  @override
-  visitSymbolLiteral(SymbolLiteral node) {
-    _genPushConstExpr(node);
-  }
-
-  @override
-  visitThisExpression(ThisExpression node) {
-    _genPushReceiver();
-  }
-
-  @override
-  visitThrow(Throw node) {
-    _generateNode(node.expression);
-
-    if (options.emitDebuggerStops) {
-      asm.emitDebugCheck();
-    }
-    asm.emitThrow(0);
-  }
-
-  @override
-  visitTypeLiteral(TypeLiteral node) {
-    final DartType type = node.type;
-    final int typeCPIndex = cp.addType(type);
-    if (!hasFreeTypeParameters([type])) {
-      asm.emitPushConstant(typeCPIndex);
-    } else {
-      _genPushInstantiatorAndFunctionTypeArguments([type]);
-      asm.emitInstantiateType(typeCPIndex);
-    }
-  }
-
-  @override
-  visitVariableGet(VariableGet node) {
-    final v = node.variable;
-    if (v.isConst) {
-      _genPushConstExpr(v.initializer);
-    } else if (v.isLate) {
-      _genLoadVar(v);
-
-      final Label done = new Label();
-      asm.emitJumpIfInitialized(done);
-
-      if (v.initializer != null) {
-        final init = v.initializer;
-        _genPushContextIfCaptured(v);
-        // Late local variable initializers are transformed to wrap the
-        // initializer in a closure (see late_var_init_transformer.dart). The
-        // closure call needs one temporary, so withTemp lets us use this
-        // VariableGet's temporary when visiting the initializer.
-        assert(init is MethodInvocation &&
-            init.name.text == "call" &&
-            init.arguments.positional.length == 0);
-        locals.withTemp(
-            init, locals.tempIndexInFrame(node), () => _generateNode(init));
-        _genStoreVar(v);
-      } else {
-        asm.emitPushConstant(cp.addName(v.name));
-        _genDirectCall(throwNewLateInitializationError,
-            objectTable.getArgDescHandle(1), 1);
-        asm.emitDrop1();
-      }
-
-      asm.bind(done);
-      _genLoadVar(v);
-    } else {
-      _genLoadVar(v);
-    }
-  }
-
-  @override
-  visitVariableSet(VariableSet node) {
-    final v = node.variable;
-    final bool hasResult = !isExpressionWithoutResult(node);
-    final bool isLateFinal = v.isLate && v.isFinal;
-
-    if (!isLateFinal) {
-      _genPushContextIfCaptured(v);
-    }
-
-    _generateNode(node.value);
-
-    if (options.emitDebuggerStops && _variableSetNeedsDebugCheck(node.value)) {
-      asm.emitDebugCheck();
-    }
-
-    if (isLateFinal) {
-      final int temp = locals.tempIndexInFrame(node);
-      asm.emitPopLocal(temp);
-
-      final Label error = new Label();
-      final Label done = new Label();
-      _genLoadVar(v);
-      asm.emitJumpIfInitialized(error);
-
-      _genPushContextIfCaptured(v);
-      asm.emitPush(temp);
-      _genStoreVar(v);
-      asm.emitJump(done);
-
-      asm.bind(error);
-      asm.emitPushConstant(cp.addName(v.name));
-      _genDirectCall(
-          throwNewLateInitializationError, objectTable.getArgDescHandle(1), 1);
-      asm.emitDrop1();
-
-      asm.bind(done);
-
-      if (hasResult) {
-        asm.emitPush(temp);
-      }
-    } else if (locals.isCaptured(v)) {
-      final int temp = locals.tempIndexInFrame(node);
-      if (hasResult) {
-        asm.emitStoreLocal(temp);
-      }
-
-      _genStoreVar(v);
-
-      if (hasResult) {
-        asm.emitPush(temp);
-      }
-    } else {
-      final int localIndex = locals.getVarIndexInFrame(v);
-      if (hasResult) {
-        asm.emitStoreLocal(localIndex);
-      } else {
-        asm.emitPopLocal(localIndex);
-      }
-    }
-  }
-
-  bool _variableSetNeedsDebugCheck(Expression rhs) =>
-      rhs is BasicLiteral ||
-      rhs is ConstantExpression ||
-      rhs is StaticGet ||
-      rhs is FunctionExpression ||
-      rhs is VariableGet ||
-      rhs is AsExpression;
-
-  void _genFutureNull() {
-    asm.emitPushNull();
-    _genDirectCall(futureValue, objectTable.getArgDescHandle(1), 1);
-  }
-
-  @override
-  visitLoadLibrary(LoadLibrary node) {
-    _genFutureNull();
-  }
-
-  @override
-  visitCheckLibraryIsLoaded(CheckLibraryIsLoaded node) {
-    _genFutureNull();
-  }
-
-  @override
-  visitAssertStatement(AssertStatement node) {
-    if (!options.enableAsserts) {
-      return;
-    }
-
-    final Label done = new Label();
-    asm.emitJumpIfNoAsserts(done);
-
-    _genConditionAndJumpIf(node.condition, true, done);
-
-    _genPushInt(
-        options.omitAssertSourcePositions ? 0 : node.conditionStartOffset);
-    _genPushInt(
-        options.omitAssertSourcePositions ? 0 : node.conditionEndOffset);
-
-    if (node.message != null) {
-      _generateNode(node.message);
-    } else {
-      asm.emitPushNull();
-    }
-
-    _genDirectCall(throwNewAssertionError, objectTable.getArgDescHandle(3), 3);
-    asm.emitDrop1();
-
-    asm.bind(done);
-  }
-
-  @override
-  visitBlock(Block node) {
-    _enterScope(node);
-    _generateNodeList(node.statements);
-    _leaveScope();
-  }
-
-  @override
-  visitAssertBlock(AssertBlock node) {
-    if (!options.enableAsserts) {
-      return;
-    }
-
-    final Label done = new Label();
-    asm.emitJumpIfNoAsserts(done);
-
-    _enterScope(node);
-    _generateNodeList(node.statements);
-    _leaveScope();
-
-    asm.bind(done);
-  }
-
-  @override
-  visitBlockExpression(BlockExpression node) {
-    _enterScope(node);
-    _generateNodeList(node.body.statements);
-    _generateNode(node.value);
-    _leaveScope();
-  }
-
-  @override
-  visitBreakStatement(BreakStatement node) {
-    final targetLabel = labeledStatements[node.target] ??
-        (throw 'Target label ${node.target} was not registered for break $node');
-    final targetContextLevel = contextLevels[node.target];
-
-    _generateNonLocalControlTransfer(node, node.target, () {
-      _genUnwindContext(targetContextLevel);
-      asm.emitJump(targetLabel);
-    });
-  }
-
-  @override
-  visitContinueSwitchStatement(ContinueSwitchStatement node) {
-    final targetLabel = switchCases[node.target] ??
-        (throw 'Target label ${node.target} was not registered for continue-switch $node');
-    final targetContextLevel = contextLevels[node.target.parent];
-
-    _generateNonLocalControlTransfer(node, node.target.parent, () {
-      _genUnwindContext(targetContextLevel);
-      asm.emitJump(targetLabel);
-    });
-  }
-
-  @override
-  visitDoStatement(DoStatement node) {
-    if (asm.isUnreachable) {
-      // Bail out before binding a label which allows backward jumps,
-      // as it is not handled by local unreachable code elimination.
-      return;
-    }
-
-    final Label join = new Label(allowsBackwardJumps: true);
-    asm.bind(join);
-
-    asm.emitCheckStack(++currentLoopDepth);
-
-    _generateNode(node.body);
-
-    _genConditionAndJumpIf(node.condition, true, join);
-
-    --currentLoopDepth;
-  }
-
-  @override
-  visitEmptyStatement(EmptyStatement node) {
-    // no-op
-  }
-
-  @override
-  visitExpressionStatement(ExpressionStatement node) {
-    final expr = node.expression;
-    _generateNode(expr);
-    if (!isExpressionWithoutResult(expr)) {
-      asm.emitDrop1();
-    }
-  }
-
-  @override
-  visitForInStatement(ForInStatement node) {
-    // Should be lowered by the async transformation.
-    throw "unreachable";
-  }
-
-  @override
-  visitForStatement(ForStatement node) {
-    _enterScope(node);
-    try {
-      _generateNodeList(node.variables);
-
-      if (asm.isUnreachable) {
-        // Bail out before binding a label which allows backward jumps,
-        // as it is not handled by local unreachable code elimination.
-        return;
-      }
-
-      final Label done = new Label();
-      final Label join = new Label(allowsBackwardJumps: true);
-      asm.bind(join);
-
-      asm.emitCheckStack(++currentLoopDepth);
-
-      if (node.condition != null) {
-        _genConditionAndJumpIf(node.condition, false, done);
-      }
-
-      _generateNode(node.body);
-
-      if (locals.currentContextSize > 0) {
-        asm.emitPush(locals.contextVarIndexInFrame);
-        asm.emitCloneContext(
-            locals.currentContextId, locals.currentContextSize);
-        asm.emitPopLocal(locals.contextVarIndexInFrame);
-      }
-
-      for (var update in node.updates) {
-        _generateNode(update);
-        asm.emitDrop1();
-      }
-
-      asm.emitJump(join);
-
-      asm.bind(done);
-      --currentLoopDepth;
-    } finally {
-      _leaveScope();
-    }
-  }
-
-  @override
-  visitFunctionDeclaration(ast.FunctionDeclaration node) {
-    if (options.emitDebuggerStops) {
-      asm.emitDebugCheck();
-    }
-    _genPushContextIfCaptured(node.variable);
-    _genClosure(node, node.variable.name, node.function);
-    _genStoreVar(node.variable);
-  }
-
-  @override
-  visitIfStatement(IfStatement node) {
-    final Label otherwisePart = new Label();
-
-    _genConditionAndJumpIf(node.condition, false, otherwisePart);
-
-    _generateNode(node.then);
-
-    if (node.otherwise != null) {
-      final Label done = new Label();
-      asm.emitJump(done);
-      asm.bind(otherwisePart);
-      _generateNode(node.otherwise);
-      asm.bind(done);
-    } else {
-      asm.bind(otherwisePart);
-    }
-  }
-
-  @override
-  visitLabeledStatement(LabeledStatement node) {
-    final label = new Label();
-    labeledStatements ??= new Map<LabeledStatement, Label>();
-    labeledStatements[node] = label;
-    contextLevels ??= new Map<TreeNode, int>();
-    contextLevels[node] = locals.currentContextLevel;
-    _generateNode(node.body);
-    asm.bind(label);
-    labeledStatements.remove(node);
-    contextLevels.remove(node);
-  }
-
-  @override
-  visitReturnStatement(ReturnStatement node) {
-    final expr = node.expression ?? new NullLiteral();
-
-    final List<TryFinally> tryFinallyBlocks =
-        _getEnclosingTryFinallyBlocks(node, null);
-    if (tryFinallyBlocks.isEmpty) {
-      _generateNode(expr);
-      _genReturnTOS();
-    } else {
-      if (options.emitDebuggerStops) {
-        // Stop on the return statement before executing finally blocks.
-        asm.emitDebugCheck();
-      }
-      if (expr is BasicLiteral) {
-        _addFinallyBlocks(tryFinallyBlocks, () {
-          _generateNode(expr);
-          _genReturnTOS();
-        });
-      } else {
-        // Keep return value in a variable as try-catch statements
-        // inside finally can zap expression stack.
-        _generateNode(node.expression);
-        asm.emitPopLocal(locals.returnVarIndexInFrame);
-
-        _addFinallyBlocks(tryFinallyBlocks, () {
-          asm.emitPush(locals.returnVarIndexInFrame);
-          _genReturnTOS();
-        });
-      }
-    }
-  }
-
-  @override
-  visitSwitchStatement(SwitchStatement node) {
-    contextLevels ??= new Map<TreeNode, int>();
-    contextLevels[node] = locals.currentContextLevel;
-
-    _generateNode(node.expression);
-
-    if (asm.isUnreachable) {
-      // Bail out before binding labels which allow backward jumps,
-      // as they are not handled by local unreachable code elimination.
-      return;
-    }
-
-    final int temp = locals.tempIndexInFrame(node);
-    asm.emitPopLocal(temp);
-
-    final Label done = new Label();
-    final List<Label> caseLabels = new List<Label>.generate(
-        node.cases.length, (_) => new Label(allowsBackwardJumps: true));
-    final equalsArgDesc = objectTable.getArgDescHandle(2);
-
-    switchCases ??= new Map<SwitchCase, Label>();
-
-    Label defaultLabel = done;
-    for (int i = 0; i < node.cases.length; i++) {
-      final SwitchCase switchCase = node.cases[i];
-      final Label caseLabel = caseLabels[i];
-      switchCases[switchCase] = caseLabel;
-
-      if (switchCase.isDefault) {
-        defaultLabel = caseLabel;
-      } else {
-        final savedSourcePosition = asm.currentSourcePosition;
-        for (int i = 0; i < switchCase.expressions.length; ++i) {
-          _recordSourcePosition(switchCase.expressionOffsets[i]);
-          _genPushConstExpr(switchCase.expressions[i]);
-          asm.emitPush(temp);
-          asm.emitInterfaceCall(
-              cp.addInterfaceCall(
-                  InvocationKind.method, coreTypes.objectEquals, equalsArgDesc),
-              2);
-          asm.emitJumpIfTrue(caseLabel);
-        }
-        asm.currentSourcePosition = savedSourcePosition;
-      }
-    }
-
-    asm.emitJump(defaultLabel);
-
-    for (int i = 0; i < node.cases.length; i++) {
-      final SwitchCase switchCase = node.cases[i];
-      final Label caseLabel = caseLabels[i];
-
-      asm.bind(caseLabel);
-      _generateNode(switchCase.body);
-
-      // Front-end issues a compile-time error if there is a fallthrough
-      // between cases. Also, default case should be the last one.
-    }
-
-    asm.bind(done);
-    node.cases.forEach(switchCases.remove);
-    contextLevels.remove(node);
-  }
-
-  bool _isTryBlock(TreeNode node) => node is TryCatch || node is TryFinally;
-
-  int _savedContextVar(TreeNode node) {
-    assert(_isTryBlock(node));
-    assert(locals.capturedSavedContextVar(node) == null);
-    return locals.tempIndexInFrame(node, tempIndex: 0);
-  }
-
-  // Exception var occupies the same slot as saved context, so context
-  // should be restored first, before loading exception.
-  int _exceptionVar(TreeNode node) {
-    assert(_isTryBlock(node));
-    return locals.tempIndexInFrame(node, tempIndex: 0);
-  }
-
-  int _stackTraceVar(TreeNode node) {
-    assert(_isTryBlock(node));
-    return locals.tempIndexInFrame(node, tempIndex: 1);
-  }
-
-  _saveContextForTryBlock(TreeNode node) {
-    if (!locals.hasContextVar) {
-      return;
-    }
-    final capturedSavedContextVar = locals.capturedSavedContextVar(node);
-    if (capturedSavedContextVar != null) {
-      assert(locals.isSyncYieldingFrame);
-      _genPushContextForVariable(capturedSavedContextVar);
-      asm.emitPush(locals.contextVarIndexInFrame);
-      _genStoreVar(capturedSavedContextVar);
-    } else {
-      asm.emitPush(locals.contextVarIndexInFrame);
-      asm.emitPopLocal(_savedContextVar(node));
-    }
-  }
-
-  _restoreContextForTryBlock(TreeNode node) {
-    if (!locals.hasContextVar) {
-      return;
-    }
-    final capturedSavedContextVar = locals.capturedSavedContextVar(node);
-    if (capturedSavedContextVar != null) {
-      // 1. Restore context from closure var.
-      // This context has a context level at frame entry.
-      asm.emitPush(locals.closureVarIndexInFrame);
-      asm.emitLoadFieldTOS(cp.addInstanceField(closureContext));
-      asm.emitPopLocal(locals.contextVarIndexInFrame);
-
-      // 2. Restore context from captured :saved_try_context_var${depth}.
-      assert(locals.isCaptured(capturedSavedContextVar));
-      _genLoadVar(capturedSavedContextVar,
-          currentContextLevel: locals.contextLevelAtEntry);
-    } else {
-      asm.emitPush(_savedContextVar(node));
-    }
-    asm.emitPopLocal(locals.contextVarIndexInFrame);
-  }
-
-  /// Start try block
-  TryBlock _startTryBlock(TreeNode node) {
-    assert(_isTryBlock(node));
-
-    _saveContextForTryBlock(node);
-
-    return asm.exceptionsTable.enterTryBlock(asm.offset);
-  }
-
-  /// End try block and start its handler.
-  void _endTryBlock(TreeNode node, TryBlock tryBlock) {
-    tryBlock.endPC = asm.offset;
-    tryBlock.handlerPC = asm.offset;
-
-    // Exception handlers are reachable although there are no labels or jumps.
-    asm.isUnreachable = false;
-
-    asm.emitSetFrame(locals.frameSize);
-
-    _restoreContextForTryBlock(node);
-
-    asm.emitMoveSpecial(SpecialIndex.exception, _exceptionVar(node));
-    asm.emitMoveSpecial(SpecialIndex.stackTrace, _stackTraceVar(node));
-
-    final capturedExceptionVar = locals.capturedExceptionVar(node);
-    if (capturedExceptionVar != null) {
-      _genPushContextForVariable(capturedExceptionVar);
-      asm.emitPush(_exceptionVar(node));
-      _genStoreVar(capturedExceptionVar);
-    }
-
-    final capturedStackTraceVar = locals.capturedStackTraceVar(node);
-    if (capturedStackTraceVar != null) {
-      _genPushContextForVariable(capturedStackTraceVar);
-      asm.emitPush(_stackTraceVar(node));
-      _genStoreVar(capturedStackTraceVar);
-    }
-  }
-
-  void _genRethrow(TreeNode node) {
-    final capturedExceptionVar = locals.capturedExceptionVar(node);
-    if (capturedExceptionVar != null) {
-      assert(locals.isCaptured(capturedExceptionVar));
-      _genLoadVar(capturedExceptionVar);
-    } else {
-      asm.emitPush(_exceptionVar(node));
-    }
-
-    final capturedStackTraceVar = locals.capturedStackTraceVar(node);
-    if (capturedStackTraceVar != null) {
-      assert(locals.isCaptured(capturedStackTraceVar));
-      _genLoadVar(capturedStackTraceVar);
-    } else {
-      asm.emitPush(_stackTraceVar(node));
-    }
-
-    asm.emitThrow(1);
-  }
-
-  @override
-  visitTryCatch(TryCatch node) {
-    if (asm.isUnreachable) {
-      return;
-    }
-
-    final Label done = new Label();
-
-    final TryBlock tryBlock = _startTryBlock(node);
-    tryBlock.isSynthetic = node.isSynthetic;
-    tryCatches ??= new Map<TryCatch, TryBlock>();
-    tryCatches[node] = tryBlock; // Used by rethrow.
-
-    _generateNode(node.body);
-    asm.emitJump(done);
-
-    _endTryBlock(node, tryBlock);
-
-    final int exception = _exceptionVar(node);
-    final int stackTrace = _stackTraceVar(node);
-
-    bool hasCatchAll = false;
-
-    final savedSourcePosition = asm.currentSourcePosition;
-    for (Catch catchClause in node.catches) {
-      _recordSourcePosition(catchClause.fileOffset);
-      tryBlock.types.add(cp.addType(catchClause.guard));
-
-      Label skipCatch;
-      final guardType = catchClause.guard;
-      // Exception objects are guaranteed to be non-nullable, so
-      // non-nullable Object is also a catch-all type.
-      if (guardType is DynamicType ||
-          (guardType is InterfaceType &&
-              guardType.classNode == coreTypes.objectClass)) {
-        hasCatchAll = true;
-      } else {
-        asm.emitPush(exception);
-        _genInstanceOf(catchClause.guard);
-
-        skipCatch = new Label();
-        asm.emitJumpIfFalse(skipCatch);
-      }
-
-      _enterScope(catchClause);
-
-      if (catchClause.exception != null) {
-        _genPushContextIfCaptured(catchClause.exception);
-        asm.emitPush(exception);
-        _genStoreVar(catchClause.exception);
-      }
-
-      if (catchClause.stackTrace != null) {
-        tryBlock.needsStackTrace = true;
-        _genPushContextIfCaptured(catchClause.stackTrace);
-        asm.emitPush(stackTrace);
-        _genStoreVar(catchClause.stackTrace);
-      }
-
-      _generateNode(catchClause.body);
-
-      _leaveScope();
-      asm.emitJump(done);
-
-      if (skipCatch != null) {
-        asm.bind(skipCatch);
-      }
-    }
-    asm.currentSourcePosition = savedSourcePosition;
-
-    if (!hasCatchAll) {
-      tryBlock.needsStackTrace = true;
-      _genRethrow(node);
-    }
-
-    asm.bind(done);
-    tryCatches.remove(node);
-  }
-
-  @override
-  visitTryFinally(TryFinally node) {
-    if (asm.isUnreachable) {
-      return;
-    }
-
-    final TryBlock tryBlock = _startTryBlock(node);
-    tryBlock.isSynthetic = true;
-    finallyBlocks ??= new Map<TryFinally, List<FinallyBlock>>();
-    finallyBlocks[node] = <FinallyBlock>[];
-
-    _generateNode(node.body);
-
-    if (!asm.isUnreachable) {
-      final normalContinuation = new FinallyBlock(() {
-        /* do nothing (fall through) */
-      });
-      finallyBlocks[node].add(normalContinuation);
-      asm.emitJump(normalContinuation.entry);
-    }
-
-    _endTryBlock(node, tryBlock);
-
-    tryBlock.types.add(cp.addType(const DynamicType()));
-
-    _generateNode(node.finalizer);
-
-    tryBlock.needsStackTrace = true; // For rethrowing.
-    _genRethrow(node);
-
-    for (var finallyBlock in finallyBlocks[node]) {
-      asm.bind(finallyBlock.entry);
-      _restoreContextForTryBlock(node);
-      _generateNode(node.finalizer);
-      finallyBlock.generateContinuation();
-    }
-
-    finallyBlocks.remove(node);
-  }
-
-  bool _skipVariableInitialization(VariableDeclaration v, bool isCaptured) {
-    // We can skip variable initialization if the variable is supposed to be
-    // initialized to null and it's captured. This is because all the slots in
-    // the capture context are implicitly initialized to null.
-
-    // Check if the variable is supposed to be initialized to null.
-    if (!(v.initializer == null || v.initializer is NullLiteral)) {
-      return false;
-    }
-
-    // Late variables need to be initialized to a sentinel, not null.
-    if (v.isLate) return false;
-
-    // Non-captured variables go in stack slots that aren't implicitly nulled.
-    return isCaptured;
-  }
-
-  @override
-  visitVariableDeclaration(VariableDeclaration node) {
-    if (!node.isConst) {
-      final bool isCaptured = locals.isCaptured(node);
-      final initializer = node.initializer;
-      final bool emitStore = !_skipVariableInitialization(node, isCaptured);
-      int maxInitializerPosition = node.fileOffset;
-      if (emitStore) {
-        if (isCaptured) {
-          _genPushContextForVariable(node);
-        }
-        if (node.isLate && !_isTrivialInitializer(initializer)) {
-          asm.emitPushUninitializedSentinel();
-        } else if (initializer != null) {
-          _startRecordingMaxPosition(node.fileOffset);
-          _generateNode(initializer);
-          maxInitializerPosition = _endRecordingMaxPosition();
-        } else {
-          asm.emitPushNull();
-        }
-      }
-
-      if (options.emitDebuggerStops &&
-          (initializer == null || _variableSetNeedsDebugCheck(initializer))) {
-        final savedSourcePosition = asm.currentSourcePosition;
-        if (node.fileEqualsOffset != TreeNode.noOffset) {
-          _recordSourcePosition(node.fileEqualsOffset);
-        }
-        asm.emitDebugCheck();
-        asm.currentSourcePosition = savedSourcePosition;
-      }
-
-      if (options.emitLocalVarInfo && !asm.isUnreachable && node.name != null) {
-        _declareLocalVariable(node, maxInitializerPosition + 1);
-      }
-
-      if (emitStore) {
-        _genStoreVar(node);
-      }
-    }
-  }
-
-  @override
-  visitWhileStatement(WhileStatement node) {
-    if (asm.isUnreachable) {
-      // Bail out before binding a label which allows backward jumps,
-      // as it is not handled by local unreachable code elimination.
-      return;
-    }
-
-    final Label done = new Label();
-    final Label join = new Label(allowsBackwardJumps: true);
-    asm.bind(join);
-
-    asm.emitCheckStack(++currentLoopDepth);
-
-    _genConditionAndJumpIf(node.condition, false, done);
-
-    _generateNode(node.body);
-
-    asm.emitJump(join);
-    --currentLoopDepth;
-
-    asm.bind(done);
-  }
-
-  @override
-  visitYieldStatement(YieldStatement node) {
-    if (!node.isNative) {
-      throw 'YieldStatement must be desugared: $node';
-    }
-
-    if (asm.isUnreachable) {
-      return;
-    }
-
-    // 0 is reserved for normal entry, yield points are counted from 1.
-    final int yieldIndex = yieldPoints.length + 1;
-    final Label continuationLabel = new Label(allowsBackwardJumps: true);
-    yieldPoints.add(continuationLabel);
-
-    // :await_jump_var = #index
-    assert(locals.isCaptured(locals.awaitJumpVar));
-    _genPushContextForVariable(locals.awaitJumpVar);
-    _genPushInt(yieldIndex);
-    _genStoreVar(locals.awaitJumpVar);
-
-    // :await_ctx_var = context
-    assert(locals.isCaptured(locals.awaitContextVar));
-    _genPushContextForVariable(locals.awaitContextVar);
-    asm.emitPush(locals.contextVarIndexInFrame);
-    _genStoreVar(locals.awaitContextVar);
-
-    // return <expression>
-    // Note: finally blocks are *not* executed on the way out.
-    _generateNode(node.expression);
-    _genReturnTOS(node.fileOffset);
-
-    asm.bind(continuationLabel);
-
-    if (parentFunction.dartAsyncMarker == AsyncMarker.Async ||
-        parentFunction.dartAsyncMarker == AsyncMarker.AsyncStar) {
-      final int exceptionParam = locals.asyncExceptionParamIndexInFrame;
-      final int stackTraceParam = locals.asyncStackTraceParamIndexInFrame;
-
-      // if (:exception != null) rethrow (:exception, :stack_trace)
-      final Label cont = new Label();
-      asm.emitPush(exceptionParam);
-      asm.emitJumpIfNull(cont);
-
-      asm.emitPush(exceptionParam);
-      asm.emitPush(stackTraceParam);
-      asm.emitThrow(1);
-
-      asm.bind(cont);
-    }
-  }
-
-  @override
-  visitFieldInitializer(FieldInitializer node) {
-    _genFieldInitializer(node.field, node.value);
-  }
-
-  @override
-  visitRedirectingInitializer(RedirectingInitializer node) {
-    final args = node.arguments;
-    assert(args.types.isEmpty);
-    _genArguments(new ThisExpression(), args);
-    _genDirectCallWithArgs(node.target, args, hasReceiver: true, node: node);
-    asm.emitDrop1();
-  }
-
-  @override
-  visitSuperInitializer(SuperInitializer node) {
-    final args = node.arguments;
-    assert(args.types.isEmpty);
-    _genArguments(new ThisExpression(), args);
-    // Re-resolve target due to partial mixin resolution.
-    Member target;
-    for (var replacement in enclosingClass.superclass.constructors) {
-      if (node.target.name == replacement.name) {
-        target = replacement;
-        break;
-      }
-    }
-    assert(target != null);
-    _genDirectCallWithArgs(target, args, hasReceiver: true, node: node);
-    asm.emitDrop1();
-  }
-
-  @override
-  visitLocalInitializer(LocalInitializer node) {
-    _generateNode(node.variable);
-  }
-
-  @override
-  visitAssertInitializer(AssertInitializer node) {
-    _generateNode(node.statement);
-  }
-
-  @override
-  visitConstantExpression(ConstantExpression node) {
-    _genPushConstant(node.constant);
-  }
-}
-
-class UnsupportedOperationError {
-  final String message;
-  UnsupportedOperationError(this.message);
-
-  @override
-  String toString() => message;
-}
-
-class TooManyArgumentsException extends BytecodeLimitExceededException {
-  final int fileOffset;
-  TooManyArgumentsException(this.fileOffset);
-}
-
-typedef void GenerateContinuation();
-
-class FinallyBlock {
-  final Label entry = new Label();
-  final GenerateContinuation generateContinuation;
-
-  FinallyBlock(this.generateContinuation);
-}
-
-class Annotations {
-  final AnnotationsDeclaration object;
-  final bool hasPragma;
-
-  const Annotations(this.object, this.hasPragma);
-}
-
-ast.Component createFreshComponentWithBytecode(ast.Component component) {
-  final newComponent = new ast.Component();
-  final newRepository = new BytecodeMetadataRepository();
-  newComponent.addMetadataRepository(newRepository);
-
-  final oldRepository = component.metadata.remove(newRepository.tag);
-  final metadata = oldRepository.mapping[component];
-  newRepository.mapping[newComponent] = metadata;
-
-  return newComponent;
-}
diff --git a/pkg/vm/lib/bytecode/generics.dart b/pkg/vm/lib/bytecode/generics.dart
deleted file mode 100644
index 6fc5829..0000000
--- a/pkg/vm/lib/bytecode/generics.dart
+++ /dev/null
@@ -1,311 +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.
-
-library vm.bytecode.generics;
-
-import 'dart:math' show min;
-
-import 'package:kernel/ast.dart' hide MapEntry;
-import 'package:kernel/core_types.dart' show CoreTypes;
-import 'package:kernel/type_algebra.dart' show Substitution;
-import 'package:kernel/type_environment.dart' show StaticTypeContext;
-
-import 'options.dart' show BytecodeOptions;
-
-bool hasInstantiatorTypeArguments(Class c) {
-  for (; c != null; c = c.superclass) {
-    if (c.typeParameters.isNotEmpty) {
-      return true;
-    }
-  }
-  return false;
-}
-
-List<DartType> getTypeParameterTypes(List<TypeParameter> typeParameters) {
-  if (typeParameters.isEmpty) {
-    return const <DartType>[];
-  }
-  final types = new List<DartType>(typeParameters.length);
-  for (int i = 0; i < typeParameters.length; ++i) {
-    final tp = typeParameters[i];
-    types[i] = new TypeParameterType(
-        tp, TypeParameterType.computeNullabilityFromBound(tp));
-  }
-  return types;
-}
-
-bool _canReuseSuperclassTypeArguments(List<DartType> superTypeArgs,
-    List<TypeParameter> typeParameters, int overlap) {
-  for (int i = 0; i < overlap; ++i) {
-    final superTypeArg = superTypeArgs[superTypeArgs.length - overlap + i];
-    final typeParam = typeParameters[i];
-    if (!(superTypeArg is TypeParameterType &&
-        superTypeArg.parameter == typeParameters[i] &&
-        superTypeArg.nullability ==
-            TypeParameterType.computeNullabilityFromBound(typeParam))) {
-      return false;
-    }
-  }
-  return true;
-}
-
-List<DartType> flattenInstantiatorTypeArguments(
-    Class instantiatedClass, List<DartType> typeArgs) {
-  final typeParameters = instantiatedClass.typeParameters;
-  assert(typeArgs.length == typeParameters.length);
-
-  final supertype = instantiatedClass.supertype;
-  if (supertype == null) {
-    return typeArgs;
-  }
-
-  final superTypeArgs = flattenInstantiatorTypeArguments(
-      supertype.classNode, supertype.typeArguments);
-
-  // Shrink type arguments by reusing portion of superclass type arguments
-  // if there is an overlapping. This optimization should be consistent with
-  // VM in order to correctly reuse instantiator type arguments.
-  int overlap = min(superTypeArgs.length, typeArgs.length);
-  for (; overlap > 0; --overlap) {
-    if (_canReuseSuperclassTypeArguments(
-        superTypeArgs, typeParameters, overlap)) {
-      break;
-    }
-  }
-
-  assert(typeParameters.length == typeArgs.length);
-
-  final substitution = Substitution.fromPairs(typeParameters, typeArgs);
-
-  List<DartType> flatTypeArgs = <DartType>[];
-  for (var type in superTypeArgs) {
-    flatTypeArgs.add(substitution.substituteType(type));
-  }
-  flatTypeArgs.addAll(typeArgs.getRange(overlap, typeArgs.length));
-
-  return flatTypeArgs;
-}
-
-List<DartType> getInstantiatorTypeArguments(
-    Class instantiatedClass, List<DartType> typeArgs) {
-  final flatTypeArgs =
-      flattenInstantiatorTypeArguments(instantiatedClass, typeArgs);
-  if (isAllDynamic(flatTypeArgs)) {
-    return null;
-  }
-  return flatTypeArgs;
-}
-
-List<DartType> getDefaultFunctionTypeArguments(FunctionNode function) {
-  final typeParameters = function.typeParameters;
-  if (typeParameters.isEmpty) {
-    return null;
-  }
-  bool dynamicOnly = true;
-  for (var tp in typeParameters) {
-    if (tp.defaultType != null && tp.defaultType != const DynamicType()) {
-      dynamicOnly = false;
-      break;
-    }
-  }
-  if (dynamicOnly) {
-    return null;
-  }
-  List<DartType> defaultTypes = <DartType>[];
-  for (var tp in typeParameters) {
-    defaultTypes.add(tp.defaultType ?? const DynamicType());
-  }
-  return defaultTypes;
-}
-
-bool isAllDynamic(List<DartType> typeArgs) {
-  for (var t in typeArgs) {
-    if (t != const DynamicType()) {
-      return false;
-    }
-  }
-  return true;
-}
-
-bool isInstantiatedGenericType(DartType type) =>
-    (type is InterfaceType) &&
-    type.typeArguments.isNotEmpty &&
-    !hasFreeTypeParameters(type.typeArguments);
-
-bool hasFreeTypeParameters(List<DartType> typeArgs) {
-  final findTypeParams = new FindFreeTypeParametersVisitor();
-  return typeArgs.any((t) => t.accept(findTypeParams));
-}
-
-class FindFreeTypeParametersVisitor extends DartTypeVisitor<bool> {
-  Set<TypeParameter> _declaredTypeParameters;
-
-  bool visit(DartType type) => type.accept(this);
-
-  @override
-  bool defaultDartType(DartType node) =>
-      throw 'Unexpected type ${node.runtimeType} $node';
-
-  @override
-  bool visitInvalidType(InvalidType node) => false;
-
-  @override
-  bool visitDynamicType(DynamicType node) => false;
-
-  @override
-  bool visitVoidType(VoidType node) => false;
-
-  @override
-  bool visitBottomType(BottomType node) => false;
-
-  @override
-  bool visitNeverType(NeverType node) => false;
-
-  @override
-  bool visitTypeParameterType(TypeParameterType node) =>
-      _declaredTypeParameters == null ||
-      !_declaredTypeParameters.contains(node.parameter);
-
-  @override
-  bool visitInterfaceType(InterfaceType node) =>
-      node.typeArguments.any((t) => t.accept(this));
-
-  @override
-  bool visitFutureOrType(FutureOrType node) => node.typeArgument.accept(this);
-
-  @override
-  bool visitTypedefType(TypedefType node) =>
-      node.typeArguments.any((t) => t.accept(this));
-
-  @override
-  bool visitFunctionType(FunctionType node) {
-    if (node.typeParameters.isNotEmpty) {
-      _declaredTypeParameters ??= new Set<TypeParameter>();
-      _declaredTypeParameters.addAll(node.typeParameters);
-    }
-
-    final bool result = node.positionalParameters.any((t) => t.accept(this)) ||
-        node.namedParameters.any((p) => p.type.accept(this)) ||
-        node.returnType.accept(this);
-
-    if (node.typeParameters.isNotEmpty) {
-      _declaredTypeParameters.removeAll(node.typeParameters);
-    }
-
-    return result;
-  }
-}
-
-/// Returns static type of [expr].
-DartType getStaticType(Expression expr, StaticTypeContext staticTypeContext) =>
-    expr.getStaticType(staticTypeContext);
-
-/// Returns `true` if [type] cannot be extended in user code.
-bool isSealedType(DartType type, CoreTypes coreTypes) {
-  if (type is InterfaceType) {
-    final cls = type.classNode;
-    return cls == coreTypes.intClass ||
-        cls == coreTypes.doubleClass ||
-        cls == coreTypes.boolClass ||
-        cls == coreTypes.stringClass ||
-        cls == coreTypes.nullClass;
-  }
-  return false;
-}
-
-/// Returns true if an instance call to [interfaceTarget] with given
-/// [receiver] can omit argument type checks needed due to generic-covariant
-/// parameters.
-bool isUncheckedCall(Member interfaceTarget, Expression receiver,
-    StaticTypeContext staticTypeContext) {
-  if (interfaceTarget == null) {
-    // Dynamic call cannot be unchecked.
-    return false;
-  }
-
-  if (!_hasGenericCovariantParameters(interfaceTarget)) {
-    // Unchecked call makes sense only if there are generic-covariant parameters.
-    return false;
-  }
-
-  // Calls via [this] do not require checks.
-  if (receiver is ThisExpression) {
-    return true;
-  }
-
-  DartType receiverStaticType = getStaticType(receiver, staticTypeContext);
-  if (receiverStaticType is InterfaceType) {
-    final typeArguments = receiverStaticType.typeArguments;
-    if (typeArguments.isEmpty) {
-      return true;
-    }
-
-    final typeParameters = receiverStaticType.classNode.typeParameters;
-    assert(typeArguments.length == typeParameters.length);
-    for (int i = 0; i < typeArguments.length; ++i) {
-      switch (typeParameters[i].variance) {
-        case Variance.covariant:
-          if (!isSealedType(
-              typeArguments[i], staticTypeContext.typeEnvironment.coreTypes)) {
-            return false;
-          }
-          break;
-        case Variance.invariant:
-          break;
-        case Variance.contravariant:
-          return false;
-        default:
-          throw 'Unexpected variance ${typeParameters[i].variance} of '
-              '${typeParameters[i]} in ${receiverStaticType.classNode}';
-      }
-    }
-    return true;
-  }
-  return false;
-}
-
-/// If receiver type at run time matches static type we can omit argument type
-/// checks. This condition can be efficiently tested if static receiver type is
-/// fully instantiated (e.g. doesn't have type parameters).
-/// [isInstantiatedInterfaceCall] tests if an instance call to
-/// [interfaceTarget] with given [staticReceiverType] may benefit from
-/// this optimization.
-bool isInstantiatedInterfaceCall(
-    Member interfaceTarget, DartType staticReceiverType) {
-  // Providing instantiated receiver type wouldn't help in case of a
-  // dynamic call or call without any parameter type checks.
-  if (interfaceTarget == null ||
-      !_hasGenericCovariantParameters(interfaceTarget)) {
-    return false;
-  }
-  return isInstantiatedGenericType(staticReceiverType);
-}
-
-bool _hasGenericCovariantParameters(Member target) {
-  if (target is Field) {
-    return target.isGenericCovariantImpl;
-  } else if (target is Procedure) {
-    for (var param in target.function.positionalParameters) {
-      if (param.isGenericCovariantImpl) {
-        return true;
-      }
-    }
-    for (var param in target.function.namedParameters) {
-      if (param.isGenericCovariantImpl) {
-        return true;
-      }
-    }
-    return false;
-  } else {
-    throw 'Unexpected instance call target ${target.runtimeType} $target';
-  }
-}
-
-/// Returns true if invocation [node] is a closure call with statically known
-/// function type. Such invocations can omit argument type checks.
-bool isUncheckedClosureCall(MethodInvocation node,
-        StaticTypeContext staticTypeContext, BytecodeOptions options) =>
-    node.name.text == 'call' &&
-    getStaticType(node.receiver, staticTypeContext) is FunctionType &&
-    !options.avoidClosureCallInstructions;
diff --git a/pkg/vm/lib/bytecode/local_variable_table.dart b/pkg/vm/lib/bytecode/local_variable_table.dart
deleted file mode 100644
index cdbeb45..0000000
--- a/pkg/vm/lib/bytecode/local_variable_table.dart
+++ /dev/null
@@ -1,242 +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.
-
-library vm.bytecode.local_variable_table;
-
-import 'bytecode_serialization.dart';
-
-enum LocalVariableEntryKind {
-  invalid,
-  scope,
-  variableDeclaration,
-  contextVariable,
-}
-
-abstract class LocalVariableEntry {
-  static const KindMask = 0x0F;
-  static const IsCapturedFlag = 1 << 4;
-
-  LocalVariableEntryKind get kind;
-  int get flags => 0;
-  final int startPC;
-  void writeContents(BufferedWriter writer);
-
-  LocalVariableEntry(this.startPC);
-}
-
-class Scope extends LocalVariableEntry {
-  int endPC;
-  int contextLevel;
-  int position;
-  int endPosition;
-  final List<VariableDeclaration> variables = <VariableDeclaration>[];
-
-  Scope(int startPC, this.endPC, this.contextLevel, this.position,
-      this.endPosition)
-      : super(startPC);
-
-  @override
-  LocalVariableEntryKind get kind => LocalVariableEntryKind.scope;
-
-  @override
-  void writeContents(BufferedWriter writer) {
-    if (endPC == null) {
-      throw '$this is not closed';
-    }
-    writer.writePackedUInt30(endPC - startPC);
-    writer.writeSLEB128(contextLevel);
-    writer.writePackedUInt30(position + 1);
-    writer.writePackedUInt30(endPosition + 1);
-  }
-
-  Scope.readContents(BufferedReader reader, int startPC) : super(startPC) {
-    endPC = startPC + reader.readPackedUInt30();
-    contextLevel = reader.readSLEB128();
-    position = reader.readPackedUInt30() - 1;
-    endPosition = reader.readPackedUInt30() - 1;
-  }
-
-  @override
-  String toString() =>
-      'scope (pc $startPC-$endPC pos $position-$endPosition context-level $contextLevel)';
-}
-
-class VariableDeclaration extends LocalVariableEntry {
-  bool isCaptured;
-  int index;
-  int name;
-  int type;
-  int position;
-  int initializedPosition;
-
-  VariableDeclaration(int startPC, this.isCaptured, this.index, this.name,
-      this.type, this.position, this.initializedPosition)
-      : super(startPC);
-
-  @override
-  LocalVariableEntryKind get kind => LocalVariableEntryKind.variableDeclaration;
-
-  @override
-  int get flags => (isCaptured ? LocalVariableEntry.IsCapturedFlag : 0);
-
-  @override
-  void writeContents(BufferedWriter writer) {
-    writer.writeSLEB128(index);
-    writer.writePackedUInt30(name);
-    writer.writePackedUInt30(type);
-    writer.writePackedUInt30(position + 1);
-    writer.writePackedUInt30(initializedPosition + 1);
-  }
-
-  VariableDeclaration.readContents(
-      BufferedReader reader, int startPC, int flags)
-      : super(startPC) {
-    isCaptured = (flags & LocalVariableEntry.IsCapturedFlag) != 0;
-    index = reader.readSLEB128();
-    name = reader.readPackedUInt30();
-    type = reader.readPackedUInt30();
-    position = reader.readPackedUInt30() - 1;
-    initializedPosition = reader.readPackedUInt30() - 1;
-  }
-
-  @override
-  String toString() =>
-      'variable $index${isCaptured ? ' (captured)' : ''} pc $startPC, name CP#$name, type CP#$type, pos $position, init-pos $initializedPosition';
-}
-
-class ContextVariable extends LocalVariableEntry {
-  int index;
-
-  ContextVariable(int startPC, this.index) : super(startPC);
-
-  @override
-  LocalVariableEntryKind get kind => LocalVariableEntryKind.contextVariable;
-
-  @override
-  void writeContents(BufferedWriter writer) {
-    writer.writeSLEB128(index);
-  }
-
-  ContextVariable.readContents(BufferedReader reader, int startPC)
-      : super(startPC) {
-    index = reader.readSLEB128();
-  }
-
-  @override
-  String toString() => 'context variable $index';
-}
-
-/// Keeps information about declared local variables.
-class LocalVariableTable extends BytecodeDeclaration {
-  final scopes = <Scope>[];
-  final activeScopes = <Scope>[];
-  ContextVariable contextVariable;
-
-  LocalVariableTable();
-
-  void enterScope(int pc, int contextLevel, int position) {
-    final scope = new Scope(pc, null, contextLevel, position, null);
-    activeScopes.add(scope);
-    scopes.add(scope);
-  }
-
-  void declareVariable(int pc, bool isCaptured, int index, int nameCpIndex,
-      int typeCpIndex, int position, int initializedPosition) {
-    final variable = new VariableDeclaration(pc, isCaptured, index, nameCpIndex,
-        typeCpIndex, position, initializedPosition);
-    activeScopes.last.variables.add(variable);
-  }
-
-  void leaveScope(int pc, int endPosition) {
-    final scope = activeScopes.removeLast();
-    scope.endPC = pc;
-    scope.endPosition = endPosition;
-    if (scope.variables.isEmpty &&
-        activeScopes.isNotEmpty &&
-        scope.contextLevel == activeScopes.last.contextLevel) {
-      scopes.remove(scope);
-    }
-  }
-
-  void leaveAllScopes(int pc, int endPosition) {
-    while (activeScopes.isNotEmpty) {
-      leaveScope(pc, endPosition);
-    }
-  }
-
-  void recordContextVariable(int pc, int index) {
-    assert(contextVariable == null);
-    contextVariable = new ContextVariable(pc, index);
-  }
-
-  bool get isEmpty => scopes.isEmpty && contextVariable == null;
-
-  bool get isNotEmpty => !isEmpty;
-
-  bool get hasActiveScopes => activeScopes.isNotEmpty;
-
-  List<LocalVariableEntry> getEntries() {
-    final entries = <LocalVariableEntry>[];
-    if (contextVariable != null) {
-      entries.add(contextVariable);
-    }
-    for (Scope scope in scopes) {
-      entries.add(scope);
-      entries.addAll(scope.variables);
-    }
-    return entries;
-  }
-
-  void write(BufferedWriter writer) {
-    final entries = getEntries();
-    writer.writePackedUInt30(entries.length);
-    final encodeStartPC = new SLEB128DeltaEncoder();
-    for (var entry in entries) {
-      writer.writeByte(entry.kind.index | entry.flags);
-      encodeStartPC.write(writer, entry.startPC);
-      entry.writeContents(writer);
-    }
-  }
-
-  LocalVariableTable.read(BufferedReader reader) {
-    final int numEntries = reader.readPackedUInt30();
-    final decodeStartPC = new SLEB128DeltaDecoder();
-    Scope scope;
-    for (int i = 0; i < numEntries; ++i) {
-      final int kindAndFlags = reader.readByte();
-      final LocalVariableEntryKind kind = LocalVariableEntryKind
-          .values[kindAndFlags & LocalVariableEntry.KindMask];
-      final int flags = kindAndFlags & ~LocalVariableEntry.KindMask;
-      final int startPC = decodeStartPC.read(reader);
-      switch (kind) {
-        case LocalVariableEntryKind.scope:
-          scope = new Scope.readContents(reader, startPC);
-          scopes.add(scope);
-          break;
-        case LocalVariableEntryKind.variableDeclaration:
-          scope.variables.add(
-              new VariableDeclaration.readContents(reader, startPC, flags));
-          break;
-        case LocalVariableEntryKind.contextVariable:
-          contextVariable = new ContextVariable.readContents(reader, startPC);
-          break;
-        default:
-          throw 'Unexpected entry kind ${kind}';
-      }
-    }
-  }
-
-  Map<int, String> getBytecodeAnnotations() {
-    final map = <int, String>{};
-    for (var entry in getEntries()) {
-      final pc = entry.startPC;
-      if (map[pc] == null) {
-        map[pc] = entry.toString();
-      } else {
-        map[pc] = "${map[pc]}; $entry";
-      }
-    }
-    return map;
-  }
-}
diff --git a/pkg/vm/lib/bytecode/local_vars.dart b/pkg/vm/lib/bytecode/local_vars.dart
deleted file mode 100644
index 882fb58..0000000
--- a/pkg/vm/lib/bytecode/local_vars.dart
+++ /dev/null
@@ -1,1430 +0,0 @@
-// Copyright (c) 2018, 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.
-
-library vm.bytecode.local_vars;
-
-import 'dart:math' show min, max;
-
-import 'package:kernel/ast.dart';
-import 'package:kernel/transformations/continuation.dart'
-    show ContinuationVariables;
-import 'package:kernel/type_environment.dart';
-import 'package:vm/bytecode/generics.dart';
-
-import 'dbc.dart';
-import 'options.dart' show BytecodeOptions;
-import '../metadata/direct_call.dart' show DirectCallMetadata;
-
-// Keep in sync with runtime/vm/object.h:Context::kAwaitJumpVarIndex.
-const int awaitJumpVarContextIndex = 0;
-const int asyncCompleterContextIndex = 1;
-const int controllerContextIndex = 1;
-
-class LocalVariables {
-  final _scopes = new Map<TreeNode, Scope>();
-  final _vars = new Map<VariableDeclaration, VarDesc>();
-  Map<TreeNode, List<int>> _temps;
-  Map<TreeNode, VariableDeclaration> _capturedSavedContextVars;
-  Map<TreeNode, VariableDeclaration> _capturedExceptionVars;
-  Map<TreeNode, VariableDeclaration> _capturedStackTraceVars;
-  Map<ForInStatement, VariableDeclaration> _capturedIteratorVars;
-  final BytecodeOptions options;
-  final StaticTypeContext staticTypeContext;
-  final Map<TreeNode, DirectCallMetadata> directCallMetadata;
-
-  Scope _currentScope;
-  Frame _currentFrame;
-
-  VarDesc _getVarDesc(VariableDeclaration variable) =>
-      _vars[variable] ??
-      (throw 'Variable descriptor is not created for $variable');
-
-  int _getVarIndex(VariableDeclaration variable, bool isCaptured) {
-    final v = _getVarDesc(variable);
-    if (v.isCaptured != isCaptured) {
-      throw 'Mismatch in captured state of $variable';
-    }
-    return v.index ?? (throw 'Variable $variable is not allocated');
-  }
-
-  bool isCaptured(VariableDeclaration variable) =>
-      _getVarDesc(variable).isCaptured;
-
-  int getVarIndexInFrame(VariableDeclaration variable) =>
-      _getVarIndex(variable, false);
-
-  int getVarIndexInContext(VariableDeclaration variable) =>
-      _getVarIndex(variable, true);
-
-  int getOriginalParamSlotIndex(VariableDeclaration variable) =>
-      _getVarDesc(variable).originalParamSlotIndex ??
-      (throw 'Variable $variable does not have originalParamSlotIndex');
-
-  int tempIndexInFrame(TreeNode node, {int tempIndex: 0}) {
-    final temps = _temps[node];
-    if (temps == null) {
-      throw 'Temp is not allocated for node ${node.runtimeType} $node';
-    }
-    return temps[tempIndex];
-  }
-
-  int get currentContextSize => _currentScope.contextSize;
-  int get currentContextLevel => _currentScope.contextLevel;
-  int get currentContextId => _currentScope.contextId;
-
-  int get contextLevelAtEntry =>
-      _currentFrame.contextLevelAtEntry ??
-      (throw "Current frame is top level and it doesn't have a context at entry");
-
-  int getContextLevelOfVar(VariableDeclaration variable) {
-    final v = _getVarDesc(variable);
-    assert(v.isCaptured);
-    return v.scope.contextLevel;
-  }
-
-  int getVarContextId(VariableDeclaration variable) {
-    final v = _getVarDesc(variable);
-    assert(v.isCaptured);
-    return v.scope.contextId;
-  }
-
-  int get closureVarIndexInFrame => getVarIndexInFrame(_currentFrame
-          .closureVar ??
-      (throw 'Closure variable is not declared in ${_currentFrame.function}'));
-
-  int get contextVarIndexInFrame => getVarIndexInFrame(_currentFrame
-          .contextVar ??
-      (throw 'Context variable is not declared in ${_currentFrame.function}'));
-
-  bool get hasContextVar => _currentFrame.contextVar != null;
-
-  int get scratchVarIndexInFrame => getVarIndexInFrame(_currentFrame
-          .scratchVar ??
-      (throw 'Scratch variable is not declared in ${_currentFrame.function}'));
-
-  int get returnVarIndexInFrame => getVarIndexInFrame(_currentFrame.returnVar ??
-      (throw 'Return variable is not declared in ${_currentFrame.function}'));
-
-  VariableDeclaration get functionTypeArgsVar =>
-      _currentFrame.functionTypeArgsVar ??
-      (throw 'FunctionTypeArgs variable is not declared in ${_currentFrame.function}');
-
-  int get functionTypeArgsVarIndexInFrame =>
-      getVarIndexInFrame(functionTypeArgsVar);
-
-  bool get hasFunctionTypeArgsVar => _currentFrame.functionTypeArgsVar != null;
-
-  VariableDeclaration get factoryTypeArgsVar =>
-      _currentFrame.factoryTypeArgsVar ??
-      (throw 'FactoryTypeArgs variable is not declared in ${_currentFrame.function}');
-
-  bool get hasFactoryTypeArgsVar => _currentFrame.factoryTypeArgsVar != null;
-
-  VariableDeclaration get receiverVar =>
-      _currentFrame.receiverVar ??
-      (throw 'Receiver variable is not declared in ${_currentFrame.function}');
-
-  bool get hasCapturedReceiverVar => _currentFrame.capturedReceiverVar != null;
-
-  VariableDeclaration get capturedReceiverVar =>
-      _currentFrame.capturedReceiverVar ??
-      (throw 'Captured receiver variable is not declared in ${_currentFrame.function}');
-
-  bool get hasReceiver => _currentFrame.receiverVar != null;
-
-  bool get isSyncYieldingFrame => _currentFrame.isSyncYielding;
-
-  VariableDeclaration get awaitJumpVar {
-    assert(_currentFrame.isSyncYielding);
-    return _currentFrame.parent
-        .getSyntheticVar(ContinuationVariables.awaitJumpVar);
-  }
-
-  VariableDeclaration get awaitContextVar {
-    assert(_currentFrame.isSyncYielding);
-    return _currentFrame.parent
-        .getSyntheticVar(ContinuationVariables.awaitContextVar);
-  }
-
-  VariableDeclaration get asyncStackTraceVar {
-    assert(options.causalAsyncStacks);
-    assert(_currentFrame.isSyncYielding);
-    return _currentFrame.parent
-        .getSyntheticVar(ContinuationVariables.asyncStackTraceVar);
-  }
-
-  VariableDeclaration capturedSavedContextVar(TreeNode node) =>
-      _capturedSavedContextVars != null
-          ? _capturedSavedContextVars[node]
-          : null;
-  VariableDeclaration capturedExceptionVar(TreeNode node) =>
-      _capturedExceptionVars != null ? _capturedExceptionVars[node] : null;
-  VariableDeclaration capturedStackTraceVar(TreeNode node) =>
-      _capturedStackTraceVars != null ? _capturedStackTraceVars[node] : null;
-  VariableDeclaration capturedIteratorVar(ForInStatement node) =>
-      _capturedIteratorVars != null ? _capturedIteratorVars[node] : null;
-
-  int get asyncExceptionParamIndexInFrame {
-    assert(_currentFrame.isSyncYielding);
-    final function = (_currentFrame.function as FunctionDeclaration).function;
-    final param = function.positionalParameters
-        .firstWhere((p) => p.name == ContinuationVariables.exceptionParam);
-    return getVarIndexInFrame(param);
-  }
-
-  int get asyncStackTraceParamIndexInFrame {
-    assert(_currentFrame.isSyncYielding);
-    final function = (_currentFrame.function as FunctionDeclaration).function;
-    final param = function.positionalParameters
-        .firstWhere((p) => p.name == ContinuationVariables.stackTraceParam);
-    return getVarIndexInFrame(param);
-  }
-
-  int get frameSize => _currentFrame.frameSize;
-
-  int get numParameters => _currentFrame.numParameters;
-
-  int get numParentTypeArguments => _currentFrame.parent?.numTypeArguments ?? 0;
-
-  bool get hasOptionalParameters => _currentFrame.hasOptionalParameters;
-  bool get hasCapturedParameters => _currentFrame.hasCapturedParameters;
-
-  List<VariableDeclaration> get originalNamedParameters =>
-      _currentFrame.originalNamedParameters;
-  List<VariableDeclaration> get sortedNamedParameters =>
-      _currentFrame.sortedNamedParameters;
-
-  LocalVariables(Member node, this.options, this.staticTypeContext,
-      this.directCallMetadata) {
-    final scopeBuilder = new _ScopeBuilder(this);
-    node.accept(scopeBuilder);
-
-    final allocator = new _Allocator(this);
-    node.accept(allocator);
-  }
-
-  void enterScope(TreeNode node) {
-    _currentScope = _scopes[node];
-    _currentFrame = _currentScope.frame;
-  }
-
-  void leaveScope() {
-    _currentScope = _currentScope.parent;
-    _currentFrame = _currentScope?.frame;
-  }
-
-  void withTemp(TreeNode node, int temp, void action()) {
-    final old = _temps[node];
-    assert(old == null || old.length == 1);
-    _temps[node] = [temp];
-    action();
-    _temps[node] = old;
-  }
-}
-
-class VarDesc {
-  final VariableDeclaration declaration;
-  Scope scope;
-  bool isCaptured = false;
-  int index;
-  int originalParamSlotIndex;
-
-  VarDesc(this.declaration, this.scope) {
-    scope.vars.add(this);
-  }
-
-  Frame get frame => scope.frame;
-
-  bool get isAllocated => index != null;
-
-  void capture() {
-    assert(!isAllocated);
-    isCaptured = true;
-  }
-
-  void moveToScope(Scope newScope) {
-    assert(index == null);
-    scope.vars.remove(this);
-    newScope.vars.add(this);
-    scope = newScope;
-  }
-
-  String toString() => 'var ${declaration.name}';
-}
-
-class Frame {
-  final TreeNode function;
-  final Frame parent;
-  Scope topScope;
-
-  List<VariableDeclaration> originalNamedParameters;
-  List<VariableDeclaration> sortedNamedParameters;
-  int numParameters = 0;
-  int numTypeArguments = 0;
-  bool hasOptionalParameters = false;
-  bool hasCapturedParameters = false;
-  bool hasClosures = false;
-  AsyncMarker dartAsyncMarker = AsyncMarker.Sync;
-  bool isSyncYielding = false;
-  VariableDeclaration receiverVar;
-  VariableDeclaration capturedReceiverVar;
-  VariableDeclaration functionTypeArgsVar;
-  VariableDeclaration factoryTypeArgsVar;
-  VariableDeclaration closureVar;
-  VariableDeclaration contextVar;
-  VariableDeclaration scratchVar;
-  VariableDeclaration returnVar;
-  Map<String, VariableDeclaration> syntheticVars;
-  int frameSize = 0;
-  List<int> temporaries = <int>[];
-  int contextLevelAtEntry;
-
-  Frame(this.function, this.parent);
-
-  VariableDeclaration getSyntheticVar(String name) {
-    if (syntheticVars == null) {
-      throw 'No synthetic variables declared in ${function}!';
-    }
-    if (syntheticVars[name] == null) {
-      throw '${name} variable is not declared in ${function}';
-    }
-    return syntheticVars[name];
-  }
-}
-
-class Scope {
-  final Scope parent;
-  final Frame frame;
-  final int loopDepth;
-  final List<VarDesc> vars = <VarDesc>[];
-
-  int localsUsed;
-  int tempsUsed;
-
-  Scope contextOwner;
-  int contextUsed = 0;
-  int contextSize = 0;
-  int contextLevel;
-  int contextId;
-
-  Scope(this.parent, this.frame, this.loopDepth);
-
-  bool get hasContext => contextSize > 0;
-}
-
-bool _hasReceiverParameter(TreeNode node) {
-  return node is Constructor ||
-      (node is Procedure && !node.isStatic) ||
-      (node is Field && !node.isStatic);
-}
-
-class _ScopeBuilder extends RecursiveVisitor<Null> {
-  final LocalVariables locals;
-
-  // Set of synthetic variables we need to keep track of in Frame.
-  static final registeredSyntheticVars = RegExp(r'^(' +
-      '${ContinuationVariables.awaitJumpVar}|' +
-      '${ContinuationVariables.awaitContextVar}|' +
-      '${ContinuationVariables.asyncCompleter}|' +
-      '${ContinuationVariables.asyncStackTraceVar}|' +
-      '${ContinuationVariables.controller}|' +
-      '${ContinuationVariables.controllerStreamVar}|' +
-      // :exception0, :stack_trace17, etc..
-      '${ContinuationVariables.savedTryContextVarPrefix}[0-9]+|' +
-      '${ContinuationVariables.exceptionVarPrefix}[0-9]+|' +
-      '${ContinuationVariables.stackTraceVarPrefix}[0-9]+' +
-      r')$');
-
-  Scope _currentScope;
-  Frame _currentFrame;
-  List<TreeNode> _enclosingTryBlocks;
-  List<TreeNode> _enclosingTryCatches;
-  int _loopDepth;
-
-  _ScopeBuilder(this.locals);
-
-  List<VariableDeclaration> _sortNamedParameters(FunctionNode function) {
-    final params = function.namedParameters.toList();
-    params.sort((VariableDeclaration a, VariableDeclaration b) =>
-        a.name.compareTo(b.name));
-    return params;
-  }
-
-  void _visitFunction(TreeNode node) {
-    final savedEnclosingTryBlocks = _enclosingTryBlocks;
-    _enclosingTryBlocks = <TreeNode>[];
-    final savedEnclosingTryCatches = _enclosingTryCatches;
-    _enclosingTryCatches = <TreeNode>[];
-    final saveLoopDepth = _loopDepth;
-    _loopDepth = 0;
-
-    _enterFrame(node);
-
-    if (node is Field) {
-      if (_hasReceiverParameter(node)) {
-        _currentFrame.receiverVar = new VariableDeclaration('this');
-        _declareVariable(_currentFrame.receiverVar);
-      }
-      node.initializer?.accept(this);
-    } else {
-      assert(node is Procedure ||
-          node is Constructor ||
-          node is FunctionDeclaration ||
-          node is FunctionExpression);
-
-      FunctionNode function = (node as dynamic).function;
-      assert(function != null);
-
-      _currentFrame.dartAsyncMarker = function.dartAsyncMarker;
-
-      _currentFrame.isSyncYielding =
-          function.asyncMarker == AsyncMarker.SyncYielding;
-
-      if (node is Procedure && node.isFactory) {
-        assert(_currentFrame.parent == null);
-        _currentFrame.numTypeArguments = 0;
-        _currentFrame.factoryTypeArgsVar =
-            new VariableDeclaration(':type_arguments');
-        _declareVariable(_currentFrame.factoryTypeArgsVar);
-      } else {
-        _currentFrame.numTypeArguments =
-            (_currentFrame.parent?.numTypeArguments ?? 0) +
-                function.typeParameters.length;
-
-        if (_currentFrame.numTypeArguments > 0) {
-          _currentFrame.functionTypeArgsVar =
-              new VariableDeclaration(':function_type_arguments_var')
-                ..fileOffset = function.fileOffset;
-          _declareVariable(_currentFrame.functionTypeArgsVar);
-        }
-
-        if (_currentFrame.parent?.factoryTypeArgsVar != null) {
-          _currentFrame.factoryTypeArgsVar =
-              _currentFrame.parent.factoryTypeArgsVar;
-        }
-      }
-
-      if (_hasReceiverParameter(node)) {
-        _currentFrame.receiverVar = new VariableDeclaration('this');
-        _declareVariable(_currentFrame.receiverVar);
-      } else if (_currentFrame.parent?.receiverVar != null) {
-        _currentFrame.receiverVar = _currentFrame.parent.receiverVar;
-      }
-      if (node is FunctionDeclaration || node is FunctionExpression) {
-        _currentFrame.closureVar = new VariableDeclaration(':closure');
-        _declareVariable(_currentFrame.closureVar);
-      }
-
-      _currentFrame.originalNamedParameters = function.namedParameters;
-      _currentFrame.sortedNamedParameters = _sortNamedParameters(function);
-
-      visitList(function.positionalParameters, this);
-      visitList(_currentFrame.sortedNamedParameters, this);
-
-      // Inner (a)sync_op(..).
-      if (_currentFrame.isSyncYielding) {
-        // The following variables from parent frame are used implicitly and need
-        // to be captured to preserve state across closure invocations.
-        _useVariable(_currentFrame.parent
-            .getSyntheticVar(ContinuationVariables.awaitJumpVar));
-        _useVariable(_currentFrame.parent
-            .getSyntheticVar(ContinuationVariables.awaitContextVar));
-
-        // Debugger looks for :controller_stream variable among captured
-        // variables in a context, so make sure to capture it.
-        if (_currentFrame.parent.dartAsyncMarker == AsyncMarker.AsyncStar) {
-          _useVariable(_currentFrame.parent
-              .getSyntheticVar(ContinuationVariables.controllerStreamVar));
-        }
-
-        if (locals.options.causalAsyncStacks &&
-            (_currentFrame.parent.dartAsyncMarker == AsyncMarker.Async ||
-                _currentFrame.parent.dartAsyncMarker ==
-                    AsyncMarker.AsyncStar)) {
-          _useVariable(_currentFrame.parent
-              .getSyntheticVar(ContinuationVariables.asyncStackTraceVar));
-        }
-      } // _currentFrame.isSyncYielding
-
-      if (node is Constructor) {
-        for (var field in node.enclosingClass.fields) {
-          if (!field.isStatic && field.initializer != null) {
-            field.initializer.accept(this);
-          }
-        }
-        visitList(node.initializers, this);
-      }
-
-      function.body?.accept(this);
-
-      // sync* is transformed to have two nested synthetic functions.
-      // The first such function defines :await_jump_var, which needs to be
-      // made part of the outer function's scope.
-      if (_currentFrame.parent?.dartAsyncMarker == AsyncMarker.SyncStar) {
-        locals
-            ._getVarDesc(_currentFrame
-                .getSyntheticVar(ContinuationVariables.awaitJumpVar))
-            .moveToScope(_currentScope);
-      }
-
-      // Outer, original async/async*.
-      if (_currentFrame.dartAsyncMarker == AsyncMarker.Async ||
-          _currentFrame.dartAsyncMarker == AsyncMarker.AsyncStar) {
-        locals
-            ._getVarDesc(_currentFrame
-                .getSyntheticVar(ContinuationVariables.awaitJumpVar))
-            .moveToScope(_currentScope);
-
-        // Depending on the type of async, an additional synth. var. is needed.
-        if (_currentFrame.dartAsyncMarker == AsyncMarker.Async) {
-          locals
-              ._getVarDesc(_currentFrame
-                  .getSyntheticVar(ContinuationVariables.asyncCompleter))
-              .moveToScope(_currentScope);
-        } else if (_currentFrame.dartAsyncMarker == AsyncMarker.AsyncStar) {
-          locals
-              ._getVarDesc(_currentFrame
-                  .getSyntheticVar(ContinuationVariables.controller))
-              .moveToScope(_currentScope);
-        }
-      }
-    }
-
-    if (node is FunctionDeclaration ||
-        node is FunctionExpression ||
-        _currentFrame.hasClosures) {
-      _currentFrame.contextVar = new VariableDeclaration(':context');
-      _declareVariable(_currentFrame.contextVar);
-      _currentFrame.scratchVar = new VariableDeclaration(':scratch');
-      _declareVariable(_currentFrame.scratchVar);
-    }
-
-    if (_hasReceiverParameter(node)) {
-      if (locals.isCaptured(_currentFrame.receiverVar)) {
-        // Duplicate receiver variable for local use.
-        _currentFrame.capturedReceiverVar = _currentFrame.receiverVar;
-        _currentFrame.receiverVar = new VariableDeclaration('this');
-        _declareVariable(_currentFrame.receiverVar);
-      }
-    }
-
-    _leaveFrame();
-
-    _enclosingTryBlocks = savedEnclosingTryBlocks;
-    _enclosingTryCatches = savedEnclosingTryCatches;
-    _loopDepth = saveLoopDepth;
-  }
-
-  _enterFrame(TreeNode node) {
-    _currentFrame = new Frame(node, _currentFrame);
-    _enterScope(node);
-    _currentFrame.topScope = _currentScope;
-  }
-
-  _leaveFrame() {
-    _leaveScope();
-    _currentFrame = _currentFrame.parent;
-  }
-
-  void _enterScope(TreeNode node) {
-    _currentScope = new Scope(_currentScope, _currentFrame, _loopDepth);
-    assert(locals._scopes[node] == null);
-    locals._scopes[node] = _currentScope;
-  }
-
-  void _leaveScope() {
-    _currentScope = _currentScope.parent;
-  }
-
-  void _declareVariable(VariableDeclaration variable, [Scope scope]) {
-    if (scope == null) {
-      scope = _currentScope;
-    }
-    final VarDesc v = new VarDesc(variable, scope);
-    assert(locals._vars[variable] == null,
-        'Double declaring variable ${variable}!');
-    locals._vars[variable] = v;
-  }
-
-  void _useVariable(VariableDeclaration variable) {
-    assert(variable != null);
-    final VarDesc v = locals._vars[variable];
-    if (v == null) {
-      throw 'Variable $variable is used before declared';
-    }
-    if (v.frame != _currentFrame) {
-      v.capture();
-    }
-  }
-
-  void _useThis() {
-    assert(_currentFrame.receiverVar != null);
-    _useVariable(_currentFrame.receiverVar);
-  }
-
-  void _captureAllVisibleVariablesInCurrentFrame() {
-    assert(_currentFrame.isSyncYielding);
-    final transient = new Set<VariableDeclaration>();
-    transient
-      ..addAll([
-        _currentFrame.functionTypeArgsVar,
-        _currentFrame.closureVar,
-        _currentFrame.contextVar,
-        _currentFrame.scratchVar,
-        _currentFrame.returnVar,
-      ]);
-    transient.addAll((_currentFrame.function as LocalFunction)
-        .function
-        .positionalParameters);
-    for (Scope scope = _currentScope;
-        scope != null && scope.frame == _currentFrame;
-        scope = scope.parent) {
-      for (VarDesc v in scope.vars) {
-        if (!transient.contains(v.declaration)) {
-          v.capture();
-        }
-      }
-    }
-  }
-
-  // Capture synthetic variables for control flow statements.
-  void _captureSyntheticVariables() {
-    int depth = 0;
-    for (TreeNode tryBlock in _enclosingTryBlocks) {
-      locals._capturedSavedContextVars ??=
-          new Map<TreeNode, VariableDeclaration>();
-      _captureSyntheticVariable(ContinuationVariables.savedTryContextVar(depth),
-          tryBlock, locals._capturedSavedContextVars);
-      ++depth;
-    }
-    depth = 0;
-    for (TreeNode tryBlock in _enclosingTryCatches) {
-      locals._capturedExceptionVars ??=
-          new Map<TreeNode, VariableDeclaration>();
-      locals._capturedStackTraceVars ??=
-          new Map<TreeNode, VariableDeclaration>();
-      _captureSyntheticVariable(ContinuationVariables.exceptionVar(depth),
-          tryBlock, locals._capturedExceptionVars);
-      _captureSyntheticVariable(ContinuationVariables.stackTraceVar(depth),
-          tryBlock, locals._capturedStackTraceVars);
-      ++depth;
-    }
-  }
-
-  void _captureSyntheticVariable(
-      String name, TreeNode node, Map<TreeNode, VariableDeclaration> map) {
-    final variable = _currentFrame.parent.getSyntheticVar(name);
-    _useVariable(variable);
-    assert(map[node] == null || map[node] == variable);
-    map[node] = variable;
-  }
-
-  void _visitWithScope(TreeNode node) {
-    _enterScope(node);
-    node.visitChildren(this);
-    _leaveScope();
-  }
-
-  @override
-  defaultMember(Member node) {
-    _visitFunction(node);
-  }
-
-  @override
-  visitFunctionDeclaration(FunctionDeclaration node) {
-    _currentFrame.hasClosures = true;
-    if (_currentFrame.receiverVar != null) {
-      // Closure creation may load receiver to get instantiator type arguments.
-      _useThis();
-    }
-    node.variable.accept(this);
-    _visitFunction(node);
-  }
-
-  @override
-  visitFunctionExpression(FunctionExpression node) {
-    _currentFrame.hasClosures = true;
-    if (_currentFrame.receiverVar != null) {
-      // Closure creation may load receiver to get instantiator type arguments.
-      _useThis();
-    }
-    _visitFunction(node);
-  }
-
-  @override
-  visitVariableDeclaration(VariableDeclaration node) {
-    _declareVariable(node);
-    // Register synthetic variables so we can reference them later where
-    // they're implicitely used.
-    if (node.name != null && registeredSyntheticVars.hasMatch(node.name)) {
-      _currentFrame.syntheticVars ??= <String, VariableDeclaration>{};
-      assert(_currentFrame.syntheticVars[node.name] == null,
-          "Synthetic variable ${node} double declared!");
-      _currentFrame.syntheticVars[node.name] = node;
-    }
-
-    node.visitChildren(this);
-  }
-
-  @override
-  visitVariableGet(VariableGet node) {
-    _useVariable(node.variable);
-    if (node.variable.isLate && node.variable.initializer != null) {
-      node.variable.initializer.accept(this);
-    }
-  }
-
-  @override
-  visitVariableSet(VariableSet node) {
-    _useVariable(node.variable);
-    node.visitChildren(this);
-  }
-
-  @override
-  visitThisExpression(ThisExpression node) {
-    _useThis();
-  }
-
-  @override
-  visitSuperMethodInvocation(SuperMethodInvocation node) {
-    _useThis();
-    node.visitChildren(this);
-  }
-
-  @override
-  visitSuperPropertyGet(SuperPropertyGet node) {
-    _useThis();
-    node.visitChildren(this);
-  }
-
-  @override
-  visitSuperPropertySet(SuperPropertySet node) {
-    _useThis();
-    node.visitChildren(this);
-  }
-
-  @override
-  visitTypeParameterType(TypeParameterType node) {
-    var parent = node.parameter.parent;
-    if (parent is Class) {
-      _useThis();
-    } else if (parent is FunctionNode) {
-      parent = parent.parent;
-      if (parent is Procedure && parent.isFactory) {
-        assert(_currentFrame.factoryTypeArgsVar != null);
-        _useVariable(_currentFrame.factoryTypeArgsVar);
-      }
-    }
-
-    // Erase promoted bound in type parameter types as it makes no
-    // difference at run time, but types which are different only in
-    // promoted bounds are not equal when compared using DartType.operator==,
-    // which prevents reusing of type arguments.
-    // See dartbug.com/39240 for context.
-    node.promotedBound = null;
-
-    node.visitChildren(this);
-  }
-
-  @override
-  visitBlock(Block node) {
-    _visitWithScope(node);
-  }
-
-  @override
-  visitBlockExpression(BlockExpression node) {
-    // Not using _visitWithScope as Block inside BlockExpression does not have
-    // a scope.
-    _enterScope(node);
-    visitList(node.body.statements, this);
-    node.value.accept(this);
-    _leaveScope();
-  }
-
-  @override
-  visitAssertStatement(AssertStatement node) {
-    if (!locals.options.enableAsserts) {
-      return;
-    }
-    super.visitAssertStatement(node);
-  }
-
-  @override
-  visitAssertBlock(AssertBlock node) {
-    if (!locals.options.enableAsserts) {
-      return;
-    }
-    _visitWithScope(node);
-  }
-
-  @override
-  visitForStatement(ForStatement node) {
-    ++_loopDepth;
-    _visitWithScope(node);
-    --_loopDepth;
-  }
-
-  @override
-  visitForInStatement(ForInStatement node) {
-    node.iterable.accept(this);
-
-    VariableDeclaration iteratorVar;
-    if (_currentFrame.isSyncYielding) {
-      // Declare a variable to hold 'iterator' so it could be captured.
-      iteratorVar = VariableDeclaration(':for-in-iterator');
-      _declareVariable(iteratorVar);
-      locals._capturedIteratorVars ??=
-          new Map<ForInStatement, VariableDeclaration>();
-      locals._capturedIteratorVars[node] = iteratorVar;
-    }
-
-    ++_loopDepth;
-    _enterScope(node);
-    node.variable.accept(this);
-    node.body.accept(this);
-    _leaveScope();
-    --_loopDepth;
-
-    if (_currentFrame.isSyncYielding && !locals.isCaptured(iteratorVar)) {
-      // Iterator variable was not captured, as there are no yield points
-      // inside for-in statement body. The variable is needed only if captured,
-      // so undeclare it.
-      assert(_currentScope.vars.last == locals._vars[iteratorVar]);
-      _currentScope.vars.removeLast();
-      locals._vars.remove(iteratorVar);
-      locals._capturedIteratorVars.remove(node);
-    }
-  }
-
-  @override
-  visitCatch(Catch node) {
-    _visitWithScope(node);
-  }
-
-  @override
-  visitLet(Let node) {
-    _visitWithScope(node);
-  }
-
-  @override
-  visitYieldStatement(YieldStatement node) {
-    assert(_currentFrame.isSyncYielding);
-    _captureAllVisibleVariablesInCurrentFrame();
-    _captureSyntheticVariables();
-    node.visitChildren(this);
-  }
-
-  @override
-  visitTryCatch(TryCatch node) {
-    _enclosingTryBlocks.add(node);
-    node.body?.accept(this);
-    _enclosingTryBlocks.removeLast();
-
-    _enclosingTryCatches.add(node);
-    visitList(node.catches, this);
-    _enclosingTryCatches.removeLast();
-  }
-
-  @override
-  visitTryFinally(TryFinally node) {
-    _enclosingTryBlocks.add(node);
-    node.body?.accept(this);
-    _enclosingTryBlocks.removeLast();
-
-    _enclosingTryCatches.add(node);
-    node.finalizer?.accept(this);
-    _enclosingTryCatches.removeLast();
-  }
-
-  @override
-  visitReturnStatement(ReturnStatement node) {
-    // If returning from within a try-finally block, need to allocate
-    // an extra variable to hold a return value.
-    // Return value can't be kept on the stack as try-catch statements
-    // inside finally can zap expression stack.
-    // Literals (including implicit 'null' in 'return;') do not require
-    // an extra variable as they can be generated after all finally blocks.
-    if (_enclosingTryBlocks.isNotEmpty &&
-        (node.expression != null && node.expression is! BasicLiteral)) {
-      _currentFrame.returnVar = new VariableDeclaration(':return');
-      _declareVariable(_currentFrame.returnVar, _currentFrame.topScope);
-    }
-    node.visitChildren(this);
-  }
-
-  @override
-  visitWhileStatement(WhileStatement node) {
-    ++_loopDepth;
-    node.visitChildren(this);
-    --_loopDepth;
-  }
-
-  @override
-  visitDoStatement(DoStatement node) {
-    ++_loopDepth;
-    node.visitChildren(this);
-    --_loopDepth;
-  }
-}
-
-// Allocate context slots for each local variable.
-class _Allocator extends RecursiveVisitor<Null> {
-  final LocalVariables locals;
-
-  Scope _currentScope;
-  Frame _currentFrame;
-  int _contextIdCounter = 0;
-
-  _Allocator(this.locals);
-
-  void _enterScope(TreeNode node) {
-    final scope = locals._scopes[node];
-    assert(scope != null);
-    assert(scope.parent == _currentScope);
-    _currentScope = scope;
-
-    if (_currentScope.frame != _currentFrame) {
-      _currentFrame = _currentScope.frame;
-
-      if (_currentScope.parent != null) {
-        _currentFrame.contextLevelAtEntry = _currentScope.parent.contextLevel;
-      }
-
-      _currentScope.localsUsed = 0;
-      _currentScope.tempsUsed = 0;
-    } else {
-      _currentScope.localsUsed = _currentScope.parent.localsUsed;
-      _currentScope.tempsUsed = _currentScope.parent.tempsUsed;
-    }
-
-    assert(_currentScope.contextOwner == null);
-    assert(_currentScope.contextLevel == null);
-    assert(_currentScope.contextId == null);
-
-    final int parentContextLevel =
-        _currentScope.parent != null ? _currentScope.parent.contextLevel : -1;
-
-    assert(parentContextLevel != null);
-
-    final int numCaptured =
-        _currentScope.vars.where((v) => v.isCaptured).length;
-    if (numCaptured > 0) {
-      // Share contexts between scopes which belong to the same frame and
-      // have the same loop depth.
-      _currentScope.contextOwner = _currentScope;
-      for (Scope contextOwner = _currentScope;
-          contextOwner != null &&
-              contextOwner.frame == _currentScope.frame &&
-              contextOwner.loopDepth == _currentScope.loopDepth;
-          contextOwner = contextOwner.parent) {
-        if (contextOwner.hasContext) {
-          _currentScope.contextOwner = contextOwner;
-          break;
-        }
-      }
-
-      _currentScope.contextOwner.contextSize += numCaptured;
-
-      if (_currentScope.contextOwner == _currentScope) {
-        _currentScope.contextLevel = parentContextLevel + 1;
-        int saturatedContextId = min(_contextIdCounter++, contextIdLimit - 1);
-        _currentScope.contextId = saturatedContextId;
-      } else {
-        _currentScope.contextLevel = _currentScope.contextOwner.contextLevel;
-        _currentScope.contextId = _currentScope.contextOwner.contextId;
-      }
-    } else {
-      _currentScope.contextLevel = parentContextLevel;
-    }
-  }
-
-  void _leaveScope() {
-    assert(_currentScope.contextUsed == _currentScope.contextSize);
-
-    _currentScope = _currentScope.parent;
-    _currentFrame = _currentScope?.frame;
-
-    // Remove temporary variables which are out of scope.
-    if (_currentScope != null) {
-      int tempsToRetain = _currentFrame.temporaries.length;
-      while (tempsToRetain > 0 &&
-          _currentFrame.temporaries[tempsToRetain - 1] >=
-              _currentScope.localsUsed) {
-        --tempsToRetain;
-      }
-      assert(tempsToRetain >= _currentScope.tempsUsed);
-      _currentFrame.temporaries.length = tempsToRetain;
-      assert(_currentFrame.temporaries
-          .every((index) => index < _currentScope.localsUsed));
-    }
-  }
-
-  void _updateFrameSize() {
-    _currentFrame.frameSize =
-        max(_currentFrame.frameSize, _currentScope.localsUsed);
-  }
-
-  void _allocateTemp(TreeNode node, {int count: 1}) {
-    locals._temps ??= new Map<TreeNode, List<int>>();
-    assert(locals._temps[node] == null);
-    if (_currentScope.tempsUsed + count > _currentFrame.temporaries.length) {
-      // Allocate new local slots for temporary variables.
-      final int newSlots =
-          (_currentScope.tempsUsed + count) - _currentFrame.temporaries.length;
-      int local = _currentScope.localsUsed;
-      _currentScope.localsUsed += newSlots;
-      if (_currentScope.localsUsed > localVariableIndexLimit) {
-        throw new LocalVariableIndexOverflowException();
-      }
-      _updateFrameSize();
-      for (int i = 0; i < newSlots; i++) {
-        _currentFrame.temporaries.add(local + i);
-      }
-    }
-    locals._temps[node] = _currentFrame.temporaries
-        .sublist(_currentScope.tempsUsed, _currentScope.tempsUsed + count);
-    _currentScope.tempsUsed += count;
-  }
-
-  void _freeTemp(TreeNode node, {int count: 1}) {
-    assert(_currentScope.tempsUsed >= count);
-    _currentScope.tempsUsed -= count;
-    assert(listEquals(
-        locals._temps[node],
-        _currentFrame.temporaries.sublist(
-            _currentScope.tempsUsed, _currentScope.tempsUsed + count)));
-  }
-
-  void _allocateVariable(VariableDeclaration variable, {int paramSlotIndex}) {
-    final VarDesc v = locals._getVarDesc(variable);
-
-    assert(!v.isAllocated);
-    assert(v.scope == _currentScope);
-
-    if (v.isCaptured) {
-      v.index = _currentScope.contextOwner.contextUsed++;
-      if (v.index >= capturedVariableIndexLimit) {
-        throw new LocalVariableIndexOverflowException();
-      }
-      v.originalParamSlotIndex = paramSlotIndex;
-      return;
-    }
-
-    if (paramSlotIndex != null) {
-      assert(paramSlotIndex < 0 ||
-          (_currentFrame.hasOptionalParameters &&
-              paramSlotIndex < _currentFrame.numParameters));
-      v.index = paramSlotIndex;
-    } else {
-      v.index = _currentScope.localsUsed++;
-      if (v.index >= localVariableIndexLimit) {
-        throw new LocalVariableIndexOverflowException();
-      }
-    }
-    _updateFrameSize();
-  }
-
-  void _ensureVariableAllocated(VariableDeclaration variable) {
-    if (variable != null) {
-      final VarDesc v = locals._getVarDesc(variable);
-      if (!v.isAllocated) {
-        _allocateVariable(variable);
-      }
-    }
-  }
-
-  void _allocateParameter(VariableDeclaration node, int i) {
-    final numParameters = _currentFrame.numParameters;
-    assert(0 <= i && i < numParameters);
-    int paramSlotIndex = _currentFrame.hasOptionalParameters
-        ? i
-        : -kParamEndSlotFromFp - numParameters + i;
-    _allocateVariable(node, paramSlotIndex: paramSlotIndex);
-  }
-
-  void _allocateParameters(TreeNode node, FunctionNode function) {
-    final bool isFactory = node is Procedure && node.isFactory;
-    final bool hasReceiver = _hasReceiverParameter(node);
-    final bool hasClosureArg =
-        node is FunctionDeclaration || node is FunctionExpression;
-
-    _currentFrame.numParameters = function.positionalParameters.length +
-        function.namedParameters.length +
-        (isFactory ? 1 : 0) +
-        (hasReceiver ? 1 : 0) +
-        (hasClosureArg ? 1 : 0);
-
-    _currentFrame.hasOptionalParameters = function.requiredParameterCount <
-            function.positionalParameters.length ||
-        function.namedParameters.isNotEmpty;
-
-    _currentFrame.hasCapturedParameters =
-        (isFactory && locals.isCaptured(_currentFrame.factoryTypeArgsVar)) ||
-            (hasReceiver && _currentFrame.capturedReceiverVar != null) ||
-            function.positionalParameters.any(locals.isCaptured) ||
-            function.namedParameters.any(locals.isCaptured);
-
-    int count = 0;
-    if (isFactory) {
-      _allocateParameter(_currentFrame.factoryTypeArgsVar, count++);
-    }
-    if (hasReceiver) {
-      assert(!locals.isCaptured(_currentFrame.receiverVar));
-      _allocateParameter(_currentFrame.receiverVar, count++);
-
-      if (_currentFrame.capturedReceiverVar != null) {
-        _allocateVariable(_currentFrame.capturedReceiverVar);
-      }
-    }
-    if (hasClosureArg) {
-      assert(!locals.isCaptured(_currentFrame.closureVar));
-      _allocateParameter(_currentFrame.closureVar, count++);
-    }
-    for (var param in function.positionalParameters) {
-      _allocateParameter(param, count++);
-    }
-    for (var param in _currentFrame.sortedNamedParameters) {
-      _allocateParameter(param, count++);
-    }
-    assert(count == _currentFrame.numParameters);
-
-    if (_currentFrame.hasOptionalParameters) {
-      _currentScope.localsUsed = _currentFrame.numParameters;
-      _updateFrameSize();
-    }
-  }
-
-  void _allocateSpecialVariables() {
-    _ensureVariableAllocated(_currentFrame.functionTypeArgsVar);
-    _ensureVariableAllocated(_currentFrame.contextVar);
-    _ensureVariableAllocated(_currentFrame.scratchVar);
-    _ensureVariableAllocated(_currentFrame.returnVar);
-  }
-
-  void _visitFunction(TreeNode node) {
-    _enterScope(node);
-
-    if (node is Field) {
-      if (_hasReceiverParameter(node)) {
-        _currentFrame.numParameters = 1;
-        _allocateParameter(_currentFrame.receiverVar, 0);
-        if (_currentFrame.capturedReceiverVar != null) {
-          _allocateVariable(_currentFrame.capturedReceiverVar);
-        }
-      }
-      _allocateSpecialVariables();
-      node.initializer?.accept(this);
-    } else {
-      assert(node is Procedure ||
-          node is Constructor ||
-          node is FunctionDeclaration ||
-          node is FunctionExpression);
-
-      final FunctionNode function = (node as dynamic).function;
-      assert(function != null);
-
-      // Specially allocate implicit variables before anything else to ensure
-      // reserved spot in context.
-
-      // Outer async/async* function.
-      if (_currentFrame.dartAsyncMarker == AsyncMarker.Async ||
-          _currentFrame.dartAsyncMarker == AsyncMarker.AsyncStar) {
-        final awaitJumpVar =
-            _currentFrame.getSyntheticVar(ContinuationVariables.awaitJumpVar);
-        _allocateVariable(awaitJumpVar);
-        assert(
-            locals._getVarDesc(awaitJumpVar).index == awaitJumpVarContextIndex);
-      }
-
-      // :await_jump_var is declared in sync_op_gen, and implicitely used in sync_op.
-      if (_currentFrame.parent?.dartAsyncMarker == AsyncMarker.SyncStar) {
-        final awaitJumpVar =
-            _currentFrame.getSyntheticVar(ContinuationVariables.awaitJumpVar);
-        _allocateVariable(awaitJumpVar);
-        assert(
-            locals._getVarDesc(awaitJumpVar).index == awaitJumpVarContextIndex);
-      }
-
-      if (_currentFrame.dartAsyncMarker == AsyncMarker.Async) {
-        final asyncCompleter =
-            _currentFrame.getSyntheticVar(ContinuationVariables.asyncCompleter);
-        _allocateVariable(asyncCompleter);
-        assert(locals._getVarDesc(asyncCompleter).index ==
-            asyncCompleterContextIndex);
-      } else if (_currentFrame.dartAsyncMarker == AsyncMarker.AsyncStar) {
-        final controller =
-            _currentFrame.getSyntheticVar(ContinuationVariables.controller);
-        _allocateVariable(controller);
-        assert(locals._getVarDesc(controller).index == controllerContextIndex);
-      }
-
-      _allocateParameters(node, function);
-      _allocateSpecialVariables();
-
-      if (node is Constructor) {
-        for (var field in node.enclosingClass.fields) {
-          if (!field.isStatic && field.initializer != null) {
-            field.initializer.accept(this);
-          }
-        }
-        visitList(node.initializers, this);
-      }
-
-      // The visit the function body.
-      function.body?.accept(this);
-    }
-
-    _leaveScope();
-  }
-
-  void _visit(TreeNode node, {bool scope: false, int temps: 0}) {
-    if (scope) {
-      _enterScope(node);
-    }
-    if (temps > 0) {
-      _allocateTemp(node, count: temps);
-    }
-
-    node.visitChildren(this);
-
-    if (temps > 0) {
-      _freeTemp(node, count: temps);
-    }
-    if (scope) {
-      _leaveScope();
-    }
-  }
-
-  @override
-  defaultMember(Member node) {
-    _visitFunction(node);
-  }
-
-  @override
-  visitFunctionDeclaration(FunctionDeclaration node) {
-    _allocateVariable(node.variable);
-    _allocateTemp(node);
-    _visitFunction(node);
-    _freeTemp(node);
-  }
-
-  @override
-  visitFunctionExpression(FunctionExpression node) {
-    _allocateTemp(node);
-    _visitFunction(node);
-    _freeTemp(node);
-  }
-
-  @override
-  visitVariableDeclaration(VariableDeclaration node) {
-    // Since these synthetic vars are specially allocated at a set index,
-    // verify these slots, and only allocate normal vars.
-    if (node.name == ContinuationVariables.awaitJumpVar) {
-      assert(locals._getVarDesc(node).index == awaitJumpVarContextIndex);
-    } else if (node.name == ContinuationVariables.asyncCompleter) {
-      assert(locals._getVarDesc(node).index == asyncCompleterContextIndex);
-    } else if (node.name == ContinuationVariables.controller) {
-      assert(locals._getVarDesc(node).index == controllerContextIndex);
-    } else {
-      _allocateVariable(node);
-    }
-
-    node.visitChildren(this);
-  }
-
-  @override
-  visitBlock(Block node) {
-    _visit(node, scope: true);
-  }
-
-  @override
-  visitBlockExpression(BlockExpression node) {
-    // Not using _visit as Block inside BlockExpression does not have a scope.
-    _enterScope(node);
-    visitList(node.body.statements, this);
-    node.value.accept(this);
-    _leaveScope();
-  }
-
-  @override
-  visitAssertStatement(AssertStatement node) {
-    if (!locals.options.enableAsserts) {
-      return;
-    }
-    super.visitAssertStatement(node);
-  }
-
-  @override
-  visitAssertBlock(AssertBlock node) {
-    if (!locals.options.enableAsserts) {
-      return;
-    }
-    _visit(node, scope: true);
-  }
-
-  @override
-  visitForStatement(ForStatement node) {
-    _visit(node, scope: true);
-  }
-
-  @override
-  visitForInStatement(ForInStatement node) {
-    _allocateTemp(node);
-    if (locals._capturedIteratorVars != null) {
-      _ensureVariableAllocated(locals._capturedIteratorVars[node]);
-    }
-
-    node.iterable.accept(this);
-
-    _enterScope(node);
-    node.variable.accept(this);
-    node.body.accept(this);
-    _leaveScope();
-
-    _freeTemp(node);
-  }
-
-  @override
-  visitCatch(Catch node) {
-    _visit(node, scope: true);
-  }
-
-  @override
-  visitLet(Let node) {
-    _visit(node, scope: true);
-  }
-
-  // -------------- Allocation of temporaries --------------
-
-  @override
-  visitConstructorInvocation(ConstructorInvocation node) {
-    if (node.isConst) {
-      return;
-    }
-    _visit(node, temps: 1);
-  }
-
-  @override
-  visitListLiteral(ListLiteral node) {
-    if (node.isConst) {
-      return;
-    }
-    _visit(node, temps: 1);
-  }
-
-  @override
-  visitMapLiteral(MapLiteral node) {
-    if (node.isConst) {
-      return;
-    }
-    _visit(node, temps: 1);
-  }
-
-  @override
-  visitStringConcatenation(StringConcatenation node) {
-    _visit(node, temps: 1);
-  }
-
-  @override
-  visitConditionalExpression(ConditionalExpression node) {
-    _visit(node, temps: 1);
-  }
-
-  @override
-  visitLogicalExpression(LogicalExpression node) {
-    _visit(node, temps: 1);
-  }
-
-  @override
-  visitMethodInvocation(MethodInvocation node) {
-    int numTemps = 0;
-    if (isUncheckedClosureCall(
-        node, locals.staticTypeContext, locals.options)) {
-      numTemps = 1;
-    } else if (locals.directCallMetadata != null) {
-      final directCall = locals.directCallMetadata[node];
-      if (directCall != null && directCall.checkReceiverForNull) {
-        numTemps = 1;
-      }
-    }
-    _visit(node, temps: numTemps);
-  }
-
-  @override
-  visitPropertySet(PropertySet node) {
-    _visit(node, temps: 1);
-  }
-
-  @override
-  visitPropertyGet(PropertyGet node) {
-    int numTemps = 0;
-    if (locals.directCallMetadata != null) {
-      final directCall = locals.directCallMetadata[node];
-      if (directCall != null && directCall.checkReceiverForNull) {
-        numTemps = 1;
-      }
-    }
-    _visit(node, temps: numTemps);
-  }
-
-  @override
-  visitSuperMethodInvocation(SuperMethodInvocation node) {
-    _visit(node, temps: 1);
-  }
-
-  @override
-  visitSuperPropertyGet(SuperPropertyGet node) {
-    _visit(node, temps: 1);
-  }
-
-  @override
-  visitSuperPropertySet(SuperPropertySet node) {
-    _visit(node, temps: 1);
-  }
-
-  @override
-  visitSwitchStatement(SwitchStatement node) {
-    _visit(node, temps: 1);
-  }
-
-  @override
-  visitVariableGet(VariableGet node) {
-    _visit(node, temps: node.variable.isLate ? 1 : 0);
-  }
-
-  @override
-  visitVariableSet(VariableSet node) {
-    final v = node.variable;
-    final bool needsTemp = locals.isCaptured(v) || v.isLate && v.isFinal;
-    _visit(node, temps: needsTemp ? 1 : 0);
-  }
-
-  @override
-  visitStaticSet(StaticSet node) {
-    _visit(node, temps: 1);
-  }
-
-  @override
-  visitTryCatch(TryCatch node) {
-    _visit(node, temps: 2);
-  }
-
-  @override
-  visitTryFinally(TryFinally node) {
-    _visit(node, temps: 2);
-  }
-
-  @override
-  visitInstantiation(Instantiation node) {
-    _visit(node, temps: 3);
-  }
-
-  @override
-  visitNullCheck(NullCheck node) {
-    _visit(node, temps: 1);
-  }
-}
-
-class LocalVariableIndexOverflowException
-    extends BytecodeLimitExceededException {}
diff --git a/pkg/vm/lib/bytecode/ngrams.dart b/pkg/vm/lib/bytecode/ngrams.dart
deleted file mode 100644
index 54e028b..0000000
--- a/pkg/vm/lib/bytecode/ngrams.dart
+++ /dev/null
@@ -1,142 +0,0 @@
-// Copyright (c) 2018, 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.
-
-library vm.bytecode.ngrams;
-
-import 'dart:io';
-import 'dart:typed_data';
-
-import 'package:kernel/ast.dart' show listEquals, listHashCode;
-
-import 'dbc.dart';
-import 'disassembler.dart' show Instruction, BytecodeDisassembler;
-
-bool isControlFlowInstr(Instruction instr) => isControlFlow(instr.opcode);
-
-class NGram {
-  List<Instruction> instrs;
-  BytecodeDisassembler _disassembler;
-
-  NGram(this.instrs, {bool mergePushes = false}) {
-    if (mergePushes) {
-      _mergePushes(instrs);
-    }
-    _canonicalize(instrs);
-  }
-
-  /// Tests if any instructions that are not the last instruction in the window
-  /// are a jump, throw, or call.
-  bool get controlFlowIsNotLast =>
-      instrs.sublist(0, instrs.length - 1).any(isControlFlowInstr);
-
-  @override
-  int get hashCode => listHashCode(instrs);
-
-  @override
-  bool operator ==(other) =>
-      (other is NGram) && listEquals(instrs, other.instrs);
-
-  @override
-  String toString() {
-    StringBuffer out = new StringBuffer();
-    for (var instr in instrs) {
-      _disassembler.writeInstruction(out, instr);
-    }
-    return out.toString();
-  }
-
-  /// Rewrites all Push-like instructions as 'Push r0'.
-  static void _mergePushes(List<Instruction> instrs) {
-    for (int i = 0; i < instrs.length; i++) {
-      if (isPush(instrs[i].opcode)) {
-        instrs[i] = new Instruction(Opcode.kPush, false, <int>[0], 0);
-      }
-    }
-  }
-
-  /// Rewrites the operands of instructions so that ngrams that differ only in
-  /// operands can be considered the same.
-  ///
-  /// Each type of operand is considered to come from a different space, and
-  /// each operand is re-indexed in that space starting from 0 such that each
-  /// distinct operand before canonicalization remains distinct afterwords. E.g.
-  ///
-  /// Push r3
-  /// Push r3
-  /// Push r4
-  ///
-  /// Becomes
-  ///
-  /// Push r0
-  /// Push r0
-  /// Push r1
-  static void _canonicalize(List<Instruction> instrs) {
-    Map<Operand, Map<int, int>> operandMaps = <Operand, Map<int, int>>{
-      // No mapping for Operand.none.
-      Operand.imm: <int, int>{},
-      Operand.lit: <int, int>{},
-      Operand.reg: <int, int>{},
-      Operand.xeg: <int, int>{},
-      Operand.tgt: <int, int>{},
-      // No mapping for Operand.spe.
-    };
-    for (Instruction instr in instrs) {
-      Format fmt = BytecodeFormats[instr.opcode];
-      for (int i = 0; i < instr.operands.length; i++) {
-        Operand op = fmt.operands[i];
-        if (!operandMaps.containsKey(op)) {
-          continue;
-        }
-        int newOperand = operandMaps[op]
-            .putIfAbsent(instr.operands[i], () => operandMaps[op].length);
-        instr.operands[i] = newOperand;
-      }
-    }
-  }
-}
-
-class NGramReader {
-  List<Instruction> _instructions;
-
-  Map<NGram, int> _ngramCounts = <NGram, int>{};
-
-  NGramReader(String traceFilename) {
-    File traceFile = File(traceFilename);
-    Uint8List bytecode = traceFile.readAsBytesSync();
-    final disassembler = new BytecodeDisassembler();
-    _instructions = disassembler.decode(bytecode);
-  }
-
-  Map<NGram, int> get ngramCounts => _ngramCounts;
-
-  void readAllNGrams(int windowSize,
-      {bool basicBlocks: true, bool mergePushes: false}) {
-    int offset = 0;
-    while (offset + windowSize < _instructions.length) {
-      List<Instruction> window =
-          _instructions.sublist(offset, offset + windowSize);
-      offset += 1;
-      NGram ngram = new NGram(window, mergePushes: mergePushes);
-      if (basicBlocks && ngram.controlFlowIsNotLast) {
-        continue;
-      }
-      _ngramCounts.update(ngram, (count) => count + 1, ifAbsent: () => 1);
-    }
-  }
-
-  void writeNGramStats(String outputFilename,
-      {bool sort = true, int minCount = 1000}) {
-    File outputFile = new File(outputFilename);
-    IOSink file = outputFile.openWrite();
-    List<MapEntry<NGram, int>> entries =
-        _ngramCounts.entries.where((e) => e.value > minCount).toList();
-    if (sort) {
-      entries.sort((e1, e2) => e2.value - e1.value);
-    }
-    entries.forEach((e) {
-      file.write("count: ${e.value}\n${e.key}\n");
-    });
-    file.close();
-  }
-}
diff --git a/pkg/vm/lib/bytecode/nullability_detector.dart b/pkg/vm/lib/bytecode/nullability_detector.dart
deleted file mode 100644
index 414807b..0000000
--- a/pkg/vm/lib/bytecode/nullability_detector.dart
+++ /dev/null
@@ -1,142 +0,0 @@
-// Copyright (c) 2018, 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.
-
-library vm.bytecode.nullability_detector;
-
-import 'package:kernel/ast.dart';
-import 'dbc.dart';
-import 'recognized_methods.dart' show RecognizedMethods;
-
-class NullabilityDetector {
-  final _IsNullableVisitor _isNullableVisitor;
-
-  NullabilityDetector(RecognizedMethods recognizedMethods)
-      : _isNullableVisitor = new _IsNullableVisitor(recognizedMethods);
-
-  bool isNullable(Expression expr) => expr.accept(_isNullableVisitor);
-}
-
-class _IsNullableVisitor extends ExpressionVisitor<bool> {
-  final RecognizedMethods recognizedMethods;
-
-  _IsNullableVisitor(this.recognizedMethods);
-
-  @override
-  bool defaultExpression(Expression node) => true;
-
-  @override
-  bool visitNullLiteral(NullLiteral node) => true;
-
-  // All basic literals except NullLiteral are non-nullable.
-  @override
-  bool defaultBasicLiteral(BasicLiteral node) => false;
-
-  @override
-  bool visitVariableGet(VariableGet node) {
-    final v = node.variable;
-    if ((v.isConst || v.isFinal) && v.initializer != null) {
-      return v.initializer.accept(this);
-    }
-    return true;
-  }
-
-  @override
-  bool visitVariableSet(VariableSet node) => node.value.accept(this);
-
-  @override
-  bool visitMethodInvocation(MethodInvocation node) {
-    final Opcode opcode = recognizedMethods.specializedBytecodeFor(node);
-    if (opcode != null) {
-      return !_nonNullableBytecodeInstructions.contains(opcode);
-    }
-    return true;
-  }
-
-  @override
-  bool visitConstructorInvocation(ConstructorInvocation node) => false;
-
-  @override
-  bool visitNot(Not node) => false;
-
-  @override
-  bool visitLogicalExpression(LogicalExpression node) => false;
-
-  @override
-  bool visitConditionalExpression(ConditionalExpression node) =>
-      node.then.accept(this) || node.otherwise.accept(this);
-
-  @override
-  bool visitStringConcatenation(StringConcatenation node) => false;
-
-  @override
-  bool visitIsExpression(IsExpression node) => false;
-
-  @override
-  bool visitAsExpression(AsExpression node) => node.operand.accept(this);
-
-  @override
-  bool visitSymbolLiteral(SymbolLiteral node) => false;
-
-  @override
-  bool visitTypeLiteral(TypeLiteral node) => false;
-
-  @override
-  bool visitThisExpression(ThisExpression node) => false;
-
-  @override
-  bool visitRethrow(Rethrow node) => false;
-
-  @override
-  bool visitThrow(Throw node) => false;
-
-  @override
-  bool visitListLiteral(ListLiteral node) => false;
-
-  @override
-  bool visitMapLiteral(MapLiteral node) => false;
-
-  @override
-  bool visitFunctionExpression(FunctionExpression node) => false;
-
-  @override
-  bool visitConstantExpression(ConstantExpression node) =>
-      node.constant is NullConstant;
-
-  @override
-  bool visitLet(Let node) => node.body.accept(this);
-
-  @override
-  bool visitInstantiation(Instantiation node) => false;
-}
-
-final _nonNullableBytecodeInstructions = new Set<Opcode>.from([
-  Opcode.kBooleanNegateTOS,
-  Opcode.kEqualsNull,
-  Opcode.kNegateInt,
-  Opcode.kAddInt,
-  Opcode.kSubInt,
-  Opcode.kMulInt,
-  Opcode.kTruncDivInt,
-  Opcode.kModInt,
-  Opcode.kBitAndInt,
-  Opcode.kBitOrInt,
-  Opcode.kBitXorInt,
-  Opcode.kShlInt,
-  Opcode.kShrInt,
-  Opcode.kCompareIntEq,
-  Opcode.kCompareIntGt,
-  Opcode.kCompareIntLt,
-  Opcode.kCompareIntGe,
-  Opcode.kCompareIntLe,
-  Opcode.kNegateDouble,
-  Opcode.kAddDouble,
-  Opcode.kSubDouble,
-  Opcode.kMulDouble,
-  Opcode.kDivDouble,
-  Opcode.kCompareDoubleEq,
-  Opcode.kCompareDoubleGt,
-  Opcode.kCompareDoubleLt,
-  Opcode.kCompareDoubleGe,
-  Opcode.kCompareDoubleLe,
-]);
diff --git a/pkg/vm/lib/bytecode/object_table.dart b/pkg/vm/lib/bytecode/object_table.dart
deleted file mode 100644
index 8db0792..0000000
--- a/pkg/vm/lib/bytecode/object_table.dart
+++ /dev/null
@@ -1,2376 +0,0 @@
-// Copyright (c) 2018, 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.
-
-library vm.bytecode.object_table;
-
-import 'package:kernel/ast.dart' hide MapEntry;
-import 'package:kernel/core_types.dart' show CoreTypes;
-
-import 'bytecode_serialization.dart'
-    show
-        BufferedWriter,
-        BufferedReader,
-        BytecodeObject,
-        BytecodeSizeStatistics,
-        ForwardReference,
-        NamedEntryStatistics,
-        doubleToIntBits,
-        intBitsToDouble,
-        ObjectReader,
-        ObjectWriter,
-        StringWriter;
-import 'generics.dart'
-    show getInstantiatorTypeArguments, hasInstantiatorTypeArguments;
-import 'declarations.dart' show SourceFile, TypeParametersDeclaration;
-import 'recursive_types_validator.dart' show RecursiveTypesValidator;
-
-/*
-
-Bytecode object table is encoded in the following way
-(using notation from pkg/kernel/binary.md):
-
-type ObjectTable {
-  UInt numEntries
-
-  // Total size of ‘objects’ in bytes.
-  UInt objectsSize
-
-  ObjectContents[numEntries] objects
-
-  // Offsets relative to ‘objects’.
-  UInt[numEntries] objectOffsets
-}
-
-
-// Either reference to an object in object table, or object contents
-// written inline (determined by bit 0).
-PackedObject = ObjectReference | ObjectContents
-
-type ObjectReference {
-  // Bit 0 (reference bit): 1
-  // Bits 1+: index in object table
-  UInt reference
-}
-
-type ObjectContents {
-  // Bit 0 (reference bit): 0
-  // Bits 1-4: object kind
-  // Bits 5+ object flags
-  UInt header
-}
-
-// Invalid/null object (always present at index 0).
-type InvalidObject extends ObjectContents {
-  kind = 0;
-}
-
-type Library extends ObjectContents {
-  kind = 1;
-  PackedObject importUri;
-}
-
-type Class extends ObjectContents {
-  kind = 2;
-  PackedObject library;
-  // Empty name is used for artificial class containing top-level
-  // members of a library.
-  PackedObject name;
-}
-
-type Member extends ObjectContents {
-  kind = 3;
-  flags = (isField, isConstructor);
-  PackedObject class;
-  PackedObject name;
-}
-
-type Closure extends ObjectContents {
-  kind = 4;
-  PackedObject enclosingMember;
-  UInt closureIndex;
-}
-
-type Name extends ObjectContents {
-  kind = 9;
-
-  // Invalid for public names
-  PackedObject library;
-
-  // Getters are prefixed with 'get:'.
-  // Setters are prefixed with 'set:'.
-  PackedString string;
-}
-
-// Type arguments vector.
-type TypeArguments extends ObjectContents {
-  kind = 10;
-  List<PackedObject> args;
-}
-
-abstract type ConstObject extends ObjectContents {
-  kind = 12;
-  flags = constantTag (4 bits)
-}
-
-type ConstInstance extends ConstObject {
-  kind = 12
-  constantTag (flags) = 1
-  PackedObject type;
-  List<Pair<PackedObject, PackedObject>> fieldValues;
-}
-
-type ConstInt extends ConstValue {
-  kind = 12
-  constantTag (flags) = 2
-  SLEB128 value;
-}
-
-type ConstDouble extends ConstValue {
-  kind = 12
-  constantTag (flags) = 3
-  // double bits are reinterpreted as 64-bit int
-  SLEB128 value;
-}
-
-type ConstList extends ConstObject {
-  kind = 12
-  constantTag (flags) = 4
-  PackedObject elemType;
-  List<PackedObject> entries;
-}
-
-type ConstTearOff extends ConstObject {
-  kind = 12
-  constantTag (flags) = 5
-  PackedObject target;
-}
-
-type ConstBool extends ConstValue {
-  kind = 12
-  constantTag = 6
-  Byte isTrue;
-}
-
-type ConstSymbol extends ConstObject {
-  kind = 12
-  constantTag (flags) = 7
-  PackedObject name;
-}
-
-type ConstTearOffInstantiation extends ConstObject {
-  kind = 12
-  constantTag (flags) = 8
-  PackedObject tearOff;
-  PackedObject typeArguments;
-}
-
-type ArgDesc extends ObjectContents {
-  kind = 13;
-  flags = (hasNamedArgs, hasTypeArgs)
-
-  UInt numArguments
-
- if hasTypeArgs
-   UInt numTypeArguments
-
- if hasNamedArgs
-   List<PackedObject> argNames;
-}
-
-type Script extends ObjectContents {
-  kind = 14
-  flags = (hasSourceFile)
-  PackedObject uri
-  if hasSourceFile
-    UInt sourceFileOffset
-}
-
-abstract type Type extends ObjectContents {
-  kind = 15
-  flags = typeTag (4 bits)
-}
-
-type DynamicType extends Type {
-  kind = 15
-  typeTag (flags) = 1
-}
-
-type VoidType extends Type {
-  kind = 15
-  typeTag (flags) = 2
-}
-
-type NeverType extends Type {
-  kind = 15
-  typeTag (flags) = 9
-}
-
-// SimpleType can be used only for types without instantiator type arguments.
-type SimpleType extends Type {
-  kind = 15
-  typeTag (flags) = 3
-  PackedObject class
-}
-
-type TypeParameter extends Type {
-  kind = 15
-  typeTag (flags) = 4
-  // Class, Member or Closure declaring this type parameter.
-  // Null (Invalid) if declared by function type.
-  PackedObject parent
-  UInt indexInParent
-}
-
-// Non-recursive finalized generic type.
-type GenericType extends Type {
-  kind = 15
-  typeTag (flags) = 5
-  PackedObject class
-  // Flattened type arguments vector.
-  PackedObject typeArgs
-}
-
-// Recursive finalized generic type.
-type RecursiveGenericType extends Type {
-  kind = 15
-  typeTag (flags) = 6
-  // This id is used to reference recursive types using RecursiveTypeRef.
-  // Type should be declared using RecursiveGenericType before it can be referenced.
-  // The root type should have zero recursiveId.
-  UInt recursiveId
-  PackedObject class
-  // Flattened type arguments vector.
-  PackedObject typeArgs
-}
-
-type RecursiveTypeRef extends Type {
-  kind = 15
-  typeTag (flags) = 7
-  UInt recursiveId
-}
-
-type FunctionType extends Type {
-  kind = 15
-  typeTag (flags) = 8
-
-  UInt functionTypeFlags(hasOptionalPositionalParams,
-                         hasOptionalNamedParams,
-                         hasTypeParams)
-
-  if hasTypeParams
-    TypeParametersDeclaration typeParameters
-
-  UInt numParameters
-
-  if hasOptionalPositionalParams || hasOptionalNamedParams
-    UInt numRequiredParameters
-
-  Type[] positionalParameters
-  NameAndType[] namedParameters
-  PackedObject returnType
-}
-
-type TypeParametersDeclaration {
-   UInt numTypeParameters
-   PackedObject[numTypeParameters] typeParameterNames
-   PackedObject[numTypeParameters] typeParameterBounds
-}
-
-type NameAndType {
-  PackedObject name;
-  PackedObject type;
-}
-
-*/
-
-enum ObjectKind {
-  kInvalid,
-  kLibrary,
-  kClass,
-  kMember,
-  kClosure,
-  kUnused1,
-  kUnused2,
-  kUnused3,
-  kUnused4,
-  kName,
-  kTypeArguments,
-  kUnused5,
-  kConstObject,
-  kArgDesc,
-  kScript,
-  kType,
-}
-
-enum ConstTag {
-  kInvalid,
-  kInstance,
-  kInt,
-  kDouble,
-  kList,
-  kTearOff,
-  kBool,
-  kSymbol,
-  kTearOffInstantiation,
-  kString,
-}
-
-enum TypeTag {
-  kInvalid,
-  kDynamic,
-  kVoid,
-  kSimpleType,
-  kTypeParameter,
-  kGenericType,
-  kRecursiveGenericType,
-  kRecursiveTypeRef,
-  kFunctionType,
-  kNever,
-}
-
-/// Name of artificial class containing top-level members of a library.
-const String topLevelClassName = '';
-
-String objectKindToString(ObjectKind kind) =>
-    kind.toString().substring('ObjectKind.k'.length);
-
-String nullabilityToString(Nullability nullability) {
-  switch (nullability) {
-    case Nullability.legacy:
-      return '*';
-    case Nullability.nullable:
-      return '?';
-    case Nullability.undetermined:
-      return '%';
-    case Nullability.nonNullable:
-      return '';
-  }
-  throw "Unknown Nullability: $nullability";
-}
-
-/// Represents object (library, class, member, closure, type or name) in the
-/// object table.
-abstract class ObjectHandle extends BytecodeObject {
-  static const int referenceBit = 1 << 0;
-  static const int indexShift = 1;
-  static const int inlineObject = -1;
-
-  static const int kindShift = 1;
-  static const int kindMask = 0x0F;
-
-  static const int flagBit0 = 1 << 5;
-  static const int flagBit1 = 1 << 6;
-  static const int flagBit2 = 1 << 7;
-  static const int flagBit3 = 1 << 8;
-  static const int flagBit4 = 1 << 9;
-  static const int flagBit5 = 1 << 10;
-  static const int flagsMask =
-      flagBit0 | flagBit1 | flagBit2 | flagBit3 | flagBit4 | flagBit5;
-
-  static int _makeReference(int index) => (index << indexShift) | referenceBit;
-
-  static int _getIndexFromReference(int reference) {
-    assert((reference & referenceBit) != 0);
-    return reference >> indexShift;
-  }
-
-  static int _makeHeader(ObjectKind kind, int flags) {
-    assert((kind.index & kindMask) == kind.index);
-    assert((flags & flagsMask) == flags);
-    return (kind.index << kindShift) | flags;
-  }
-
-  static ObjectKind _getKindFromHeader(int header) {
-    assert((header & referenceBit) == 0);
-    return ObjectKind.values[(header >> kindShift) & kindMask];
-  }
-
-  static int _getFlagsFromHeader(int header) {
-    assert((header & referenceBit) == 0);
-    return header & flagsMask;
-  }
-
-  int _useCount = 0;
-  int _reference;
-
-  ObjectHandle();
-
-  ObjectKind get kind;
-
-  int get flags => 0;
-  set flags(int value) {}
-
-  bool get isCacheable => true;
-  bool get shouldBeIncludedIntoIndexTable =>
-      _useCount >= ObjectTable.indexTableUseCountThreshold && isCacheable;
-
-  factory ObjectHandle._empty(ObjectKind kind, int flags) {
-    switch (kind) {
-      case ObjectKind.kInvalid:
-        return new _InvalidHandle();
-      case ObjectKind.kLibrary:
-        return new _LibraryHandle._empty();
-      case ObjectKind.kClass:
-        return new _ClassHandle._empty();
-      case ObjectKind.kMember:
-        return new _MemberHandle._empty();
-      case ObjectKind.kClosure:
-        return new _ClosureHandle._empty();
-      case ObjectKind.kName:
-        return ((flags & _NameHandle.flagIsPublic) != 0)
-            ? new _PublicNameHandle._empty()
-            : _PrivateNameHandle._empty();
-      case ObjectKind.kTypeArguments:
-        return new _TypeArgumentsHandle._empty();
-      case ObjectKind.kConstObject:
-        return new _ConstObjectHandle._empty();
-      case ObjectKind.kArgDesc:
-        return new _ArgDescHandle._empty();
-      case ObjectKind.kScript:
-        return new _ScriptHandle._empty();
-      case ObjectKind.kType:
-        Nullability nullability = Nullability
-            .values[(flags & _TypeHandle.nullabilityMask) ~/ flagBit4];
-        switch (TypeTag.values[(flags & _TypeHandle.tagMask) ~/ flagBit0]) {
-          case TypeTag.kInvalid:
-            break;
-          case TypeTag.kDynamic:
-            return new _DynamicTypeHandle();
-          case TypeTag.kVoid:
-            return new _VoidTypeHandle();
-          case TypeTag.kNever:
-            return new _NeverTypeHandle(nullability);
-          case TypeTag.kSimpleType:
-            return new _SimpleTypeHandle._empty(nullability);
-          case TypeTag.kTypeParameter:
-            return new _TypeParameterHandle._empty(nullability);
-          case TypeTag.kGenericType:
-            return new _GenericTypeHandle._empty(nullability);
-          case TypeTag.kRecursiveGenericType:
-            return new _RecursiveGenericTypeHandle._empty(nullability);
-          case TypeTag.kRecursiveTypeRef:
-            return new _RecursiveTypeRefHandle._empty(nullability);
-          case TypeTag.kFunctionType:
-            return new _FunctionTypeHandle._empty(nullability);
-        }
-        throw 'Unexpected type tag $flags';
-      case ObjectKind.kUnused1:
-      case ObjectKind.kUnused2:
-      case ObjectKind.kUnused3:
-      case ObjectKind.kUnused4:
-      case ObjectKind.kUnused5:
-        break;
-    }
-    throw 'Unexpected object kind $kind';
-  }
-
-  void _write(BufferedWriter writer) {
-    int header = _makeHeader(kind, flags);
-    assert((header & referenceBit) == 0);
-    writer.writePackedUInt30(header);
-    writeContents(writer);
-  }
-
-  void writeContents(BufferedWriter writer);
-
-  factory ObjectHandle._read(BufferedReader reader, int header) {
-    assert((header & referenceBit) == 0);
-    final ObjectKind kind = _getKindFromHeader(header);
-    final int flags = _getFlagsFromHeader(header);
-    final obj = new ObjectHandle._empty(kind, flags);
-    obj.flags = flags;
-    obj.readContents(reader);
-    return obj;
-  }
-
-  void readContents(BufferedReader reader);
-
-  void accountUsesForObjectCopies(int numCopies) {}
-
-  void indexStrings(StringWriter strings) {}
-}
-
-class _InvalidHandle extends ObjectHandle {
-  _InvalidHandle();
-
-  @override
-  ObjectKind get kind => ObjectKind.kInvalid;
-
-  @override
-  void writeContents(BufferedWriter writer) {}
-
-  @override
-  void readContents(BufferedReader reader) {}
-
-  @override
-  String toString() => 'Invalid';
-}
-
-class _LibraryHandle extends ObjectHandle {
-  _ConstObjectHandle uri;
-
-  _LibraryHandle._empty();
-
-  _LibraryHandle(this.uri);
-
-  @override
-  ObjectKind get kind => ObjectKind.kLibrary;
-
-  @override
-  void writeContents(BufferedWriter writer) {
-    writer.writePackedObject(uri);
-  }
-
-  @override
-  void readContents(BufferedReader reader) {
-    uri = reader.readPackedObject();
-  }
-
-  @override
-  void accountUsesForObjectCopies(int numCopies) {
-    uri._useCount += numCopies;
-  }
-
-  @override
-  int get hashCode => uri.hashCode + 11;
-
-  @override
-  bool operator ==(other) => other is _LibraryHandle && this.uri == other.uri;
-
-  @override
-  String toString() => uri.value;
-}
-
-class _ClassHandle extends ObjectHandle {
-  _LibraryHandle library;
-  _NameHandle name;
-
-  _ClassHandle._empty();
-
-  _ClassHandle(this.library, this.name);
-
-  @override
-  ObjectKind get kind => ObjectKind.kClass;
-
-  @override
-  void writeContents(BufferedWriter writer) {
-    writer.writePackedObject(library);
-    writer.writePackedObject(name);
-  }
-
-  @override
-  void readContents(BufferedReader reader) {
-    library = reader.readPackedObject();
-    name = reader.readPackedObject();
-  }
-
-  @override
-  void accountUsesForObjectCopies(int numCopies) {
-    library._useCount += numCopies;
-    name._useCount += numCopies;
-  }
-
-  @override
-  int get hashCode => _combineHashes(library.hashCode, name.hashCode);
-
-  @override
-  bool operator ==(other) =>
-      other is _ClassHandle &&
-      this.library == other.library &&
-      this.name == other.name;
-
-  @override
-  String toString() =>
-      name.name == topLevelClassName ? '$library' : '$library::${name.name}';
-}
-
-class _MemberHandle extends ObjectHandle {
-  static const int flagIsField = ObjectHandle.flagBit0;
-  static const int flagIsConstructor = ObjectHandle.flagBit1;
-
-  int _flags = 0;
-  _ClassHandle parent;
-  _NameHandle name;
-
-  _MemberHandle._empty();
-  _MemberHandle(this.parent, this.name, bool isField, bool isConstructor) {
-    if (isField) {
-      _flags |= flagIsField;
-    }
-    if (isConstructor) {
-      _flags |= flagIsConstructor;
-    }
-  }
-
-  @override
-  ObjectKind get kind => ObjectKind.kMember;
-
-  @override
-  int get flags => _flags;
-
-  @override
-  set flags(int value) {
-    _flags = value;
-  }
-
-  @override
-  void writeContents(BufferedWriter writer) {
-    writer.writePackedObject(parent);
-    writer.writePackedObject(name);
-  }
-
-  @override
-  void readContents(BufferedReader reader) {
-    parent = reader.readPackedObject();
-    name = reader.readPackedObject();
-  }
-
-  @override
-  void accountUsesForObjectCopies(int numCopies) {
-    parent._useCount += numCopies;
-    name._useCount += numCopies;
-  }
-
-  @override
-  int get hashCode => _combineHashes(parent.hashCode, name.hashCode);
-
-  @override
-  bool operator ==(other) =>
-      other is _MemberHandle &&
-      this.parent == other.parent &&
-      this.name == other.name &&
-      this.flags == other.flags;
-
-  @override
-  String toString() =>
-      '$parent::${name.name}' +
-      (flags & flagIsField != 0 ? ' (field)' : '') +
-      (flags & flagIsConstructor != 0 ? ' (constructor)' : '');
-}
-
-class _ClosureHandle extends ObjectHandle {
-  _MemberHandle enclosingMember;
-  int closureIndex;
-
-  _ClosureHandle._empty();
-
-  _ClosureHandle(this.enclosingMember, this.closureIndex) {
-    assert(closureIndex >= 0);
-  }
-
-  @override
-  ObjectKind get kind => ObjectKind.kClosure;
-
-  @override
-  void writeContents(BufferedWriter writer) {
-    writer.writePackedObject(enclosingMember);
-    writer.writePackedUInt30(closureIndex);
-  }
-
-  @override
-  void readContents(BufferedReader reader) {
-    enclosingMember = reader.readPackedObject();
-    closureIndex = reader.readPackedUInt30();
-  }
-
-  @override
-  void accountUsesForObjectCopies(int numCopies) {
-    enclosingMember._useCount += numCopies;
-  }
-
-  @override
-  int get hashCode => _combineHashes(enclosingMember.hashCode, closureIndex);
-
-  @override
-  bool operator ==(other) =>
-      other is _ClosureHandle &&
-      this.enclosingMember == other.enclosingMember &&
-      this.closureIndex == other.closureIndex;
-
-  @override
-  String toString() => '$enclosingMember::Closure/$closureIndex';
-}
-
-abstract class _TypeHandle extends ObjectHandle {
-  static const int tagMask = ObjectHandle.flagBit0 |
-      ObjectHandle.flagBit1 |
-      ObjectHandle.flagBit2 |
-      ObjectHandle.flagBit3;
-  static const int nullabilityMask =
-      ObjectHandle.flagBit4 | ObjectHandle.flagBit5;
-
-  final TypeTag tag;
-  Nullability nullability;
-
-  _TypeHandle(this.tag, this.nullability);
-
-  @override
-  ObjectKind get kind => ObjectKind.kType;
-
-  @override
-  int get flags =>
-      (tag.index * ObjectHandle.flagBit0) |
-      (nullability.index * ObjectHandle.flagBit4);
-
-  @override
-  set flags(int value) {
-    if (value != flags) {
-      throw 'Unable to set flags for _TypeHandle (they are occupied by type tag and nnbd)';
-    }
-  }
-}
-
-class _DynamicTypeHandle extends _TypeHandle {
-  _DynamicTypeHandle() : super(TypeTag.kDynamic, Nullability.nullable);
-
-  @override
-  void writeContents(BufferedWriter writer) {}
-
-  @override
-  void readContents(BufferedReader reader) {}
-
-  @override
-  int get hashCode => 2029;
-
-  @override
-  bool operator ==(other) => other is _DynamicTypeHandle;
-
-  @override
-  String toString() => 'dynamic';
-}
-
-class _VoidTypeHandle extends _TypeHandle {
-  _VoidTypeHandle() : super(TypeTag.kVoid, Nullability.nullable);
-
-  @override
-  void writeContents(BufferedWriter writer) {}
-
-  @override
-  void readContents(BufferedReader reader) {}
-
-  @override
-  int get hashCode => 2039;
-
-  @override
-  bool operator ==(other) => other is _VoidTypeHandle;
-
-  @override
-  String toString() => 'void';
-}
-
-class _NeverTypeHandle extends _TypeHandle {
-  _NeverTypeHandle(Nullability nullability)
-      : super(TypeTag.kNever, nullability);
-
-  @override
-  void writeContents(BufferedWriter writer) {}
-
-  @override
-  void readContents(BufferedReader reader) {}
-
-  @override
-  int get hashCode => _combineHashes(2049, nullability.index);
-
-  @override
-  bool operator ==(other) =>
-      other is _NeverTypeHandle && this.nullability == other.nullability;
-
-  @override
-  String toString() => 'Never${nullabilityToString(nullability)}';
-}
-
-class _SimpleTypeHandle extends _TypeHandle {
-  _ClassHandle class_;
-
-  _SimpleTypeHandle._empty(Nullability nullability)
-      : super(TypeTag.kSimpleType, nullability);
-
-  _SimpleTypeHandle(this.class_, Nullability nullability)
-      : super(TypeTag.kSimpleType, nullability);
-
-  @override
-  void writeContents(BufferedWriter writer) {
-    writer.writePackedObject(class_);
-  }
-
-  @override
-  void readContents(BufferedReader reader) {
-    class_ = reader.readPackedObject();
-  }
-
-  @override
-  void accountUsesForObjectCopies(int numCopies) {
-    if (class_ != null) {
-      class_._useCount += numCopies;
-    }
-  }
-
-  @override
-  int get hashCode => _combineHashes(class_.hashCode, nullability.index);
-
-  @override
-  bool operator ==(other) =>
-      other is _SimpleTypeHandle &&
-      this.class_ == other.class_ &&
-      this.nullability == other.nullability;
-
-  @override
-  String toString() => '$class_${nullabilityToString(nullability)}';
-}
-
-class _TypeParameterHandle extends _TypeHandle {
-  ObjectHandle parent;
-  int indexInParent;
-
-  _TypeParameterHandle._empty(Nullability nullability)
-      : super(TypeTag.kTypeParameter, nullability);
-
-  _TypeParameterHandle(this.parent, this.indexInParent, Nullability nullability)
-      : super(TypeTag.kTypeParameter, nullability) {
-    assert(parent is _ClassHandle ||
-        parent is _MemberHandle ||
-        parent is _ClosureHandle ||
-        parent == null);
-    assert(indexInParent >= 0);
-  }
-
-  @override
-  bool get isCacheable => (parent != null);
-
-  @override
-  void writeContents(BufferedWriter writer) {
-    writer.writePackedObject(parent);
-    writer.writePackedUInt30(indexInParent);
-  }
-
-  @override
-  void readContents(BufferedReader reader) {
-    parent = reader.readPackedObject();
-    indexInParent = reader.readPackedUInt30();
-  }
-
-  @override
-  void accountUsesForObjectCopies(int numCopies) {
-    if (parent != null) {
-      parent._useCount += numCopies;
-    }
-  }
-
-  @override
-  int get hashCode => _combineHashes(
-      parent.hashCode, _combineHashes(indexInParent, nullability.index));
-
-  @override
-  bool operator ==(other) =>
-      other is _TypeParameterHandle &&
-      this.parent == other.parent &&
-      this.indexInParent == other.indexInParent &&
-      this.nullability == other.nullability;
-
-  @override
-  String toString() =>
-      '$parent::TypeParam/$indexInParent${nullabilityToString(nullability)}';
-}
-
-class _GenericTypeHandle extends _TypeHandle {
-  _ClassHandle class_;
-  _TypeArgumentsHandle typeArgs;
-
-  _GenericTypeHandle._empty(Nullability nullability)
-      : super(TypeTag.kGenericType, nullability);
-
-  _GenericTypeHandle(this.class_, this.typeArgs, Nullability nullability)
-      : super(TypeTag.kGenericType, nullability);
-
-  @override
-  void writeContents(BufferedWriter writer) {
-    writer.writePackedObject(class_);
-    writer.writePackedObject(typeArgs);
-  }
-
-  @override
-  void readContents(BufferedReader reader) {
-    class_ = reader.readPackedObject();
-    typeArgs = reader.readPackedObject();
-  }
-
-  @override
-  void accountUsesForObjectCopies(int numCopies) {
-    class_._useCount += numCopies;
-    if (typeArgs != null) {
-      typeArgs._useCount += numCopies;
-    }
-  }
-
-  @override
-  int get hashCode => _combineHashes(
-      class_.hashCode, _combineHashes(typeArgs.hashCode, nullability.index));
-
-  @override
-  bool operator ==(other) =>
-      other is _GenericTypeHandle &&
-      this.class_ == other.class_ &&
-      this.typeArgs == other.typeArgs &&
-      this.nullability == other.nullability;
-
-  @override
-  String toString() => '$class_ $typeArgs${nullabilityToString(nullability)}';
-}
-
-class _RecursiveGenericTypeHandle extends _TypeHandle {
-  int id;
-  _ClassHandle class_;
-  _TypeArgumentsHandle typeArgs;
-
-  _RecursiveGenericTypeHandle._empty(Nullability nullability)
-      : super(TypeTag.kRecursiveGenericType, nullability);
-
-  _RecursiveGenericTypeHandle(
-      this.id, this.class_, this.typeArgs, Nullability nullability)
-      : super(TypeTag.kRecursiveGenericType, nullability);
-
-  @override
-  bool get isCacheable => (id == 0);
-
-  @override
-  void writeContents(BufferedWriter writer) {
-    writer.writePackedUInt30(id);
-    writer.writePackedObject(class_);
-    writer.writePackedObject(typeArgs);
-  }
-
-  @override
-  void readContents(BufferedReader reader) {
-    id = reader.readPackedUInt30();
-    class_ = reader.readPackedObject();
-    typeArgs = reader.readPackedObject();
-  }
-
-  @override
-  void accountUsesForObjectCopies(int numCopies) {
-    class_._useCount += numCopies;
-    if (typeArgs != null) {
-      typeArgs._useCount += numCopies;
-    }
-  }
-
-  @override
-  int get hashCode => _combineHashes(
-      class_.hashCode, _combineHashes(typeArgs.hashCode, nullability.index));
-
-  @override
-  bool operator ==(other) =>
-      other is _RecursiveGenericTypeHandle &&
-      this.class_ == other.class_ &&
-      this.typeArgs == other.typeArgs &&
-      this.nullability == other.nullability;
-
-  @override
-  String toString() =>
-      '(recursive #$id) $class_ $typeArgs${nullabilityToString(nullability)}';
-}
-
-class _RecursiveTypeRefHandle extends _TypeHandle {
-  int id;
-
-  _RecursiveTypeRefHandle._empty(Nullability nullability)
-      : super(TypeTag.kRecursiveTypeRef, nullability);
-
-  _RecursiveTypeRefHandle(this.id)
-      : super(TypeTag.kRecursiveTypeRef, Nullability.legacy);
-
-  @override
-  bool get isCacheable => false;
-
-  @override
-  void writeContents(BufferedWriter writer) {
-    writer.writePackedUInt30(id);
-  }
-
-  @override
-  void readContents(BufferedReader reader) {
-    id = reader.readPackedUInt30();
-  }
-
-  @override
-  int get hashCode => id;
-
-  @override
-  bool operator ==(other) =>
-      other is _RecursiveTypeRefHandle && this.id == other.id;
-
-  @override
-  String toString() => 'recursive-ref #$id';
-}
-
-class NameAndType {
-  _NameHandle name;
-  _TypeHandle type;
-
-  NameAndType(this.name, this.type);
-
-  @override
-  int get hashCode => _combineHashes(name.hashCode, type.hashCode);
-
-  @override
-  bool operator ==(other) =>
-      other is NameAndType &&
-      this.name == other.name &&
-      this.type == other.type;
-
-  @override
-  String toString() => '$type ${name.name}';
-}
-
-class _FunctionTypeHandle extends _TypeHandle {
-  static const int flagHasOptionalPositionalParams = 1 << 0;
-  static const int flagHasOptionalNamedParams = 1 << 1;
-  static const int flagHasTypeParams = 1 << 2;
-
-  int functionTypeFlags = 0;
-  List<NameAndType> typeParams;
-  int numRequiredParams;
-  List<_TypeHandle> positionalParams;
-  List<NameAndType> namedParams;
-  _TypeHandle returnType;
-
-  _FunctionTypeHandle._empty(Nullability nullability)
-      : super(TypeTag.kFunctionType, nullability);
-
-  _FunctionTypeHandle(
-      this.typeParams,
-      this.numRequiredParams,
-      this.positionalParams,
-      this.namedParams,
-      this.returnType,
-      Nullability nullability)
-      : super(TypeTag.kFunctionType, nullability) {
-    assert(numRequiredParams <= positionalParams.length + namedParams.length);
-    if (numRequiredParams < positionalParams.length) {
-      assert(namedParams.isEmpty);
-      functionTypeFlags |= flagHasOptionalPositionalParams;
-    }
-    if (namedParams.isNotEmpty) {
-      assert(numRequiredParams == positionalParams.length);
-      functionTypeFlags |= flagHasOptionalNamedParams;
-    }
-    if (typeParams.isNotEmpty) {
-      functionTypeFlags |= flagHasTypeParams;
-    }
-  }
-
-  @override
-  void writeContents(BufferedWriter writer) {
-    writer.writePackedUInt30(functionTypeFlags);
-    if ((functionTypeFlags & flagHasTypeParams) != 0) {
-      new TypeParametersDeclaration(typeParams).write(writer);
-    }
-    writer.writePackedUInt30(positionalParams.length + namedParams.length);
-    if (functionTypeFlags &
-            (flagHasOptionalPositionalParams | flagHasOptionalNamedParams) !=
-        0) {
-      writer.writePackedUInt30(numRequiredParams);
-    }
-    for (var param in positionalParams) {
-      writer.writePackedObject(param);
-    }
-    for (var param in namedParams) {
-      writer.writePackedObject(param.name);
-      writer.writePackedObject(param.type);
-    }
-    writer.writePackedObject(returnType);
-  }
-
-  @override
-  void readContents(BufferedReader reader) {
-    functionTypeFlags = reader.readPackedUInt30();
-    if ((functionTypeFlags & flagHasTypeParams) != 0) {
-      typeParams = new TypeParametersDeclaration.read(reader).typeParams;
-    } else {
-      typeParams = const <NameAndType>[];
-    }
-    final int numParams = reader.readPackedUInt30();
-    numRequiredParams = numParams;
-    if ((functionTypeFlags &
-            (flagHasOptionalPositionalParams | flagHasOptionalNamedParams)) !=
-        0) {
-      numRequiredParams = reader.readPackedUInt30();
-    }
-    final bool hasNamedParams =
-        (functionTypeFlags & flagHasOptionalNamedParams) != 0;
-    positionalParams = new List<_TypeHandle>.generate(
-        hasNamedParams ? numRequiredParams : numParams,
-        (_) => reader.readPackedObject());
-    if (hasNamedParams) {
-      namedParams = new List<NameAndType>.generate(
-          numParams - numRequiredParams,
-          (_) => new NameAndType(
-              reader.readPackedObject(), reader.readPackedObject()));
-    } else {
-      namedParams = const <NameAndType>[];
-    }
-    returnType = reader.readPackedObject();
-  }
-
-  @override
-  void accountUsesForObjectCopies(int numCopies) {
-    positionalParams.forEach((p) {
-      p._useCount += numCopies;
-    });
-    namedParams.forEach((p) {
-      p.name._useCount += numCopies;
-      p.type._useCount += numCopies;
-    });
-  }
-
-  @override
-  bool get isCacheable {
-    for (var param in positionalParams) {
-      if (!param.isCacheable) {
-        return false;
-      }
-    }
-    for (var param in namedParams) {
-      if (!param.type.isCacheable) {
-        return false;
-      }
-    }
-    if (!returnType.isCacheable) {
-      return false;
-    }
-    return true;
-  }
-
-  @override
-  int get hashCode {
-    int hash = listHashCode(typeParams);
-    hash = _combineHashes(hash, numRequiredParams);
-    hash = _combineHashes(hash, listHashCode(positionalParams));
-    hash = _combineHashes(hash, listHashCode(namedParams));
-    hash = _combineHashes(hash, returnType.hashCode);
-    hash = _combineHashes(hash, nullability.index);
-    return hash;
-  }
-
-  @override
-  bool operator ==(other) =>
-      other is _FunctionTypeHandle &&
-      listEquals(this.typeParams, other.typeParams) &&
-      this.numRequiredParams == other.numRequiredParams &&
-      listEquals(this.positionalParams, other.positionalParams) &&
-      listEquals(this.namedParams, other.namedParams) &&
-      this.returnType == other.returnType &&
-      this.nullability == other.nullability;
-
-  @override
-  String toString() {
-    StringBuffer sb = new StringBuffer();
-    sb.write('FunctionType');
-    if (typeParams.isNotEmpty) {
-      sb.write(' <${typeParams.join(', ')}>');
-    }
-    sb.write(' (');
-    sb.write(positionalParams.sublist(0, numRequiredParams).join(', '));
-    if (numRequiredParams != positionalParams.length) {
-      if (numRequiredParams > 0) {
-        sb.write(', ');
-      }
-      sb.write('[ ${positionalParams.sublist(numRequiredParams).join(', ')} ]');
-    }
-    if (namedParams.isNotEmpty) {
-      if (numRequiredParams > 0) {
-        sb.write(', ');
-      }
-      sb.write('{ ${namedParams.join(', ')} }');
-    }
-    sb.write(')${nullabilityToString(nullability)} -> ');
-    sb.write(returnType);
-    return sb.toString();
-  }
-}
-
-abstract class _NameHandle extends ObjectHandle {
-  static const int flagIsPublic = ObjectHandle.flagBit0;
-
-  String get name;
-
-  @override
-  ObjectKind get kind => ObjectKind.kName;
-
-  @override
-  void indexStrings(StringWriter strings) {
-    strings.put(name);
-  }
-
-  @override
-  String toString() => "'$name'";
-}
-
-class _PublicNameHandle extends _NameHandle {
-  String name;
-
-  _PublicNameHandle._empty();
-
-  _PublicNameHandle(this.name);
-
-  @override
-  int get flags => _NameHandle.flagIsPublic;
-
-  @override
-  void writeContents(BufferedWriter writer) {
-    writer.writePackedStringReference(name);
-  }
-
-  @override
-  void readContents(BufferedReader reader) {
-    name = reader.readPackedStringReference();
-  }
-
-  @override
-  int get hashCode => name.hashCode;
-
-  @override
-  bool operator ==(other) =>
-      other is _PublicNameHandle && this.name == other.name;
-
-  @override
-  String toString() => "'$name'";
-}
-
-class _PrivateNameHandle extends _NameHandle {
-  _LibraryHandle library;
-  String name;
-
-  _PrivateNameHandle._empty();
-
-  _PrivateNameHandle(this.library, this.name) {
-    assert(library != null);
-  }
-
-  @override
-  void writeContents(BufferedWriter writer) {
-    writer.writePackedObject(library);
-    writer.writePackedStringReference(name);
-  }
-
-  @override
-  void readContents(BufferedReader reader) {
-    library = reader.readPackedObject();
-    name = reader.readPackedStringReference();
-  }
-
-  @override
-  void accountUsesForObjectCopies(int numCopies) {
-    library._useCount += numCopies;
-  }
-
-  @override
-  int get hashCode => _combineHashes(name.hashCode, library.hashCode);
-
-  @override
-  bool operator ==(other) =>
-      other is _PrivateNameHandle &&
-      this.name == other.name &&
-      this.library == other.library;
-
-  @override
-  String toString() => "'$name'";
-}
-
-class _TypeArgumentsHandle extends ObjectHandle {
-  List<_TypeHandle> args;
-
-  _TypeArgumentsHandle._empty();
-
-  _TypeArgumentsHandle(this.args);
-
-  @override
-  ObjectKind get kind => ObjectKind.kTypeArguments;
-
-  @override
-  bool get isCacheable {
-    for (var arg in args) {
-      if (!arg.isCacheable) {
-        return false;
-      }
-    }
-    return true;
-  }
-
-  @override
-  void writeContents(BufferedWriter writer) {
-    writer.writePackedList(args);
-  }
-
-  @override
-  void readContents(BufferedReader reader) {
-    args = reader.readPackedList<_TypeHandle>();
-  }
-
-  @override
-  void accountUsesForObjectCopies(int numCopies) {
-    args.forEach((t) {
-      t._useCount += numCopies;
-    });
-  }
-
-  @override
-  int get hashCode => listHashCode(args);
-
-  @override
-  bool operator ==(other) =>
-      other is _TypeArgumentsHandle && listEquals(this.args, other.args);
-
-  @override
-  String toString() => '< ${args.join(', ')} >';
-}
-
-class _ConstObjectHandle extends ObjectHandle {
-  ConstTag tag;
-  dynamic value;
-  ObjectHandle type;
-  int _hashCode = 0;
-
-  _ConstObjectHandle._empty();
-
-  _ConstObjectHandle(this.tag, this.value, [this.type]);
-
-  @override
-  ObjectKind get kind => ObjectKind.kConstObject;
-
-  @override
-  int get flags => tag.index * ObjectHandle.flagBit0;
-
-  @override
-  set flags(int value) {
-    tag = ConstTag.values[value ~/ ObjectHandle.flagBit0];
-    assert(tag != ConstTag.kInvalid);
-  }
-
-  bool get isCacheable => (tag != ConstTag.kInt) && (tag != ConstTag.kBool);
-
-  @override
-  void writeContents(BufferedWriter writer) {
-    switch (tag) {
-      case ConstTag.kInt:
-        writer.writeSLEB128(value as int);
-        break;
-      case ConstTag.kDouble:
-        writer.writeSLEB128(doubleToIntBits(value as double));
-        break;
-      case ConstTag.kBool:
-        writer.writeByte((value as bool) ? 1 : 0);
-        break;
-      case ConstTag.kInstance:
-        {
-          final fieldValues = value as Map<ObjectHandle, ObjectHandle>;
-          writer.writePackedObject(type);
-          writer.writePackedUInt30(fieldValues.length);
-          fieldValues.forEach((ObjectHandle field, ObjectHandle value) {
-            writer.writePackedObject(field);
-            writer.writePackedObject(value);
-          });
-        }
-        break;
-      case ConstTag.kList:
-        {
-          final elems = value as List<ObjectHandle>;
-          writer.writePackedObject(type);
-          writer.writePackedList(elems);
-        }
-        break;
-      case ConstTag.kTearOff:
-        {
-          final target = value as ObjectHandle;
-          writer.writePackedObject(target);
-        }
-        break;
-      case ConstTag.kSymbol:
-        {
-          final name = value as ObjectHandle;
-          writer.writePackedObject(name);
-        }
-        break;
-      case ConstTag.kTearOffInstantiation:
-        {
-          final tearOff = value as ObjectHandle;
-          writer.writePackedObject(tearOff);
-          writer.writePackedObject(type as _TypeArgumentsHandle);
-        }
-        break;
-      case ConstTag.kString:
-        writer.writePackedStringReference(value as String);
-        break;
-      default:
-        throw 'Unexpected constant tag: $tag';
-    }
-  }
-
-  @override
-  void readContents(BufferedReader reader) {
-    switch (tag) {
-      case ConstTag.kInt:
-        value = reader.readSLEB128();
-        break;
-      case ConstTag.kDouble:
-        value = intBitsToDouble(reader.readSLEB128());
-        break;
-      case ConstTag.kBool:
-        value = reader.readByte() != 0;
-        break;
-      case ConstTag.kInstance:
-        type = reader.readPackedObject();
-        value = Map<ObjectHandle, ObjectHandle>.fromEntries(
-            new List<MapEntry<ObjectHandle, ObjectHandle>>.generate(
-                reader.readPackedUInt30(),
-                (_) => new MapEntry<ObjectHandle, ObjectHandle>(
-                    reader.readPackedObject(), reader.readPackedObject())));
-        break;
-      case ConstTag.kList:
-        type = reader.readPackedObject();
-        value = reader.readPackedList<ObjectHandle>();
-        break;
-      case ConstTag.kTearOff:
-        value = reader.readPackedObject();
-        break;
-      case ConstTag.kSymbol:
-        value = reader.readPackedObject();
-        break;
-      case ConstTag.kTearOffInstantiation:
-        value = reader.readPackedObject();
-        type = reader.readPackedObject();
-        break;
-      case ConstTag.kString:
-        value = reader.readPackedStringReference();
-        break;
-      default:
-        throw 'Unexpected constant tag: $tag';
-    }
-  }
-
-  @override
-  void accountUsesForObjectCopies(int numCopies) {
-    switch (tag) {
-      case ConstTag.kInt:
-      case ConstTag.kDouble:
-      case ConstTag.kBool:
-      case ConstTag.kString:
-        break;
-      case ConstTag.kInstance:
-        {
-          type._useCount += numCopies;
-          final fieldValues = value as Map<ObjectHandle, ObjectHandle>;
-          fieldValues.forEach((ObjectHandle field, ObjectHandle value) {
-            field._useCount += numCopies;
-            value?._useCount += numCopies;
-          });
-        }
-        break;
-      case ConstTag.kList:
-        {
-          final elems = value as List<ObjectHandle>;
-          for (var elem in elems) {
-            elem?._useCount += numCopies;
-          }
-          type._useCount += numCopies;
-        }
-        break;
-      case ConstTag.kTearOff:
-        {
-          final target = value as ObjectHandle;
-          target._useCount += numCopies;
-        }
-        break;
-      case ConstTag.kSymbol:
-        {
-          final name = value as ObjectHandle;
-          name._useCount += numCopies;
-        }
-        break;
-      case ConstTag.kTearOffInstantiation:
-        {
-          final tearOff = value as ObjectHandle;
-          tearOff._useCount += numCopies;
-          if (type != null) {
-            type._useCount += numCopies;
-          }
-        }
-        break;
-      default:
-        throw 'Unexpected constant tag: $tag';
-    }
-  }
-
-  @override
-  int get hashCode {
-    if (_hashCode != 0) {
-      return _hashCode;
-    }
-    switch (tag) {
-      case ConstTag.kInt:
-      case ConstTag.kDouble:
-      case ConstTag.kBool:
-      case ConstTag.kTearOff:
-      case ConstTag.kSymbol:
-      case ConstTag.kString:
-        return _hashCode = value.hashCode;
-      case ConstTag.kInstance:
-        {
-          final fieldValues = value as Map<ObjectHandle, ObjectHandle>;
-          return _hashCode =
-              _combineHashes(type.hashCode, mapHashCode(fieldValues));
-        }
-        break;
-      case ConstTag.kList:
-        {
-          final elems = value as List<ObjectHandle>;
-          return _hashCode = _combineHashes(type.hashCode, listHashCode(elems));
-        }
-        break;
-      case ConstTag.kTearOffInstantiation:
-        return _hashCode = _combineHashes(value.hashCode, type.hashCode);
-      default:
-        throw 'Unexpected constant tag: $tag';
-    }
-  }
-
-  @override
-  bool operator ==(other) {
-    if (identical(this, other)) {
-      return true;
-    }
-    if (other is _ConstObjectHandle && this.tag == other.tag) {
-      switch (tag) {
-        case ConstTag.kInt:
-        case ConstTag.kBool:
-        case ConstTag.kTearOff:
-        case ConstTag.kSymbol:
-        case ConstTag.kString:
-          return this.value == other.value;
-        case ConstTag.kDouble:
-          return this.value.compareTo(other.value) == 0;
-        case ConstTag.kInstance:
-          return this.type == other.type && mapEquals(this.value, other.value);
-        case ConstTag.kList:
-          return this.type == other.type && listEquals(this.value, other.value);
-        case ConstTag.kTearOffInstantiation:
-          return this.type == other.type && this.value == other.value;
-        default:
-          throw 'Unexpected constant tag: $tag';
-      }
-    }
-    return false;
-  }
-
-  @override
-  String toString() {
-    switch (tag) {
-      case ConstTag.kInt:
-      case ConstTag.kDouble:
-      case ConstTag.kBool:
-      case ConstTag.kSymbol:
-        return 'const $value';
-      case ConstTag.kInstance:
-        return 'const $type $value';
-      case ConstTag.kList:
-        return 'const <$type> $value';
-      case ConstTag.kTearOff:
-        return 'const tear-off $value';
-      case ConstTag.kTearOffInstantiation:
-        return 'const $type $value';
-      case ConstTag.kString:
-        return "'$value'";
-      default:
-        throw 'Unexpected constant tag: $tag';
-    }
-  }
-}
-
-class _ArgDescHandle extends ObjectHandle {
-  static const int flagHasNamedArgs = ObjectHandle.flagBit0;
-  static const int flagHasTypeArgs = ObjectHandle.flagBit1;
-
-  int _flags = 0;
-  int numArguments;
-  int numTypeArguments;
-  List<_PublicNameHandle> argNames;
-
-  _ArgDescHandle._empty();
-
-  _ArgDescHandle(this.numArguments, this.numTypeArguments, this.argNames) {
-    if (argNames.isNotEmpty) {
-      _flags |= flagHasNamedArgs;
-    }
-    if (numTypeArguments > 0) {
-      _flags |= flagHasTypeArgs;
-    }
-  }
-
-  @override
-  ObjectKind get kind => ObjectKind.kArgDesc;
-
-  @override
-  int get flags => _flags;
-
-  @override
-  set flags(int value) {
-    _flags = value;
-  }
-
-  @override
-  void writeContents(BufferedWriter writer) {
-    writer.writePackedUInt30(numArguments);
-    if ((_flags & flagHasTypeArgs) != 0) {
-      writer.writePackedUInt30(numTypeArguments);
-    }
-    if ((_flags & flagHasNamedArgs) != 0) {
-      writer.writePackedList(argNames);
-    }
-  }
-
-  @override
-  void readContents(BufferedReader reader) {
-    numArguments = reader.readPackedUInt30();
-    numTypeArguments =
-        ((_flags & flagHasTypeArgs) != 0) ? reader.readPackedUInt30() : 0;
-    argNames = ((_flags & flagHasNamedArgs) != 0)
-        ? reader.readPackedList<_PublicNameHandle>()
-        : null;
-  }
-
-  @override
-  void accountUsesForObjectCopies(int numCopies) {
-    if (argNames != null) {
-      for (var name in argNames) {
-        name._useCount += numCopies;
-      }
-    }
-  }
-
-  @override
-  int get hashCode => _combineHashes(
-      numArguments, _combineHashes(numTypeArguments, listHashCode(argNames)));
-
-  @override
-  bool operator ==(other) =>
-      other is _ArgDescHandle &&
-      this.numArguments == other.numArguments &&
-      this.numTypeArguments == other.numTypeArguments &&
-      listEquals(this.argNames, other.argNames);
-
-  @override
-  String toString() =>
-      'ArgDesc num-args $numArguments, num-type-args $numTypeArguments, names $argNames';
-}
-
-class _ScriptHandle extends ObjectHandle {
-  static const int flagHasSourceFile = ObjectHandle.flagBit0;
-
-  int _flags = 0;
-  ObjectHandle uri;
-  SourceFile _source;
-  ForwardReference<SourceFile> _sourceForwardReference;
-
-  _ScriptHandle._empty();
-
-  _ScriptHandle(this.uri, this._source) {
-    if (_source != null) {
-      _flags |= flagHasSourceFile;
-    }
-  }
-
-  @override
-  ObjectKind get kind => ObjectKind.kScript;
-
-  // Include scripts into index table if there are more than 1 reference
-  // in order to make sure there are no duplicated script objects within the
-  // same bytecode component.
-  @override
-  bool get shouldBeIncludedIntoIndexTable => _useCount > 1;
-
-  @override
-  int get flags => _flags;
-
-  @override
-  set flags(int value) {
-    _flags = value;
-  }
-
-  SourceFile get source {
-    // Unwrap forward reference on the first access.
-    if (_sourceForwardReference != null) {
-      _source = _sourceForwardReference.get();
-      _sourceForwardReference = null;
-    }
-    return _source;
-  }
-
-  set source(SourceFile sourceFile) {
-    _source = sourceFile;
-    if (_source != null) {
-      _flags |= flagHasSourceFile;
-    } else {
-      _flags &= ~flagHasSourceFile;
-    }
-  }
-
-  @override
-  void writeContents(BufferedWriter writer) {
-    writer.writePackedObject(uri);
-    if ((_flags & flagHasSourceFile) != 0) {
-      writer.writeLinkOffset(source);
-    }
-  }
-
-  @override
-  void readContents(BufferedReader reader) {
-    uri = reader.readPackedObject();
-    if ((_flags & flagHasSourceFile) != 0) {
-      // Script handles in the object table may be read before source files,
-      // so use forwarding reference here.
-      _sourceForwardReference =
-          reader.readLinkOffsetAsForwardReference<SourceFile>();
-    }
-  }
-
-  @override
-  int get hashCode => uri.hashCode;
-
-  @override
-  bool operator ==(other) => other is _ScriptHandle && this.uri == other.uri;
-
-  @override
-  String toString() => "$uri${source != null ? '($source)' : ''}";
-}
-
-class ObjectTable implements ObjectWriter, ObjectReader {
-  /// Object is added to an index table if it is used more than this
-  /// number of times.
-  static const int indexTableUseCountThreshold = 3;
-
-  final List<ObjectHandle> _objects = new List<ObjectHandle>();
-  final Map<ObjectHandle, ObjectHandle> _canonicalizationCache =
-      <ObjectHandle, ObjectHandle>{};
-  final Map<Node, ObjectHandle> _nodeCache = <Node, ObjectHandle>{};
-  final Map<String, _PublicNameHandle> _publicNames =
-      <String, _PublicNameHandle>{};
-  List<ObjectHandle> _indexTable;
-  _TypeHandle _dynamicType;
-  _TypeHandle _voidType;
-  _NodeVisitor _nodeVisitor;
-
-  ObjectTable(CoreTypes coreTypes) {
-    _dynamicType = getOrAddObject(new _DynamicTypeHandle());
-    _voidType = getOrAddObject(new _VoidTypeHandle());
-    _nodeVisitor = new _NodeVisitor(this, coreTypes);
-  }
-
-  ObjectHandle getHandle(Node node) {
-    if (node == null) {
-      return null;
-    }
-    ObjectHandle handle = _nodeCache[node];
-    if (handle == null) {
-      handle = node.accept(_nodeVisitor);
-      if (handle != null && handle.isCacheable) {
-        _nodeCache[node] = handle;
-      }
-    } else {
-      ++handle._useCount;
-    }
-    return handle;
-  }
-
-  List<ObjectHandle> getHandles(List<Node> nodes) {
-    final handles = new List<ObjectHandle>(nodes.length);
-    for (int i = 0; i < nodes.length; ++i) {
-      handles[i] = getHandle(nodes[i]);
-    }
-    return handles;
-  }
-
-  String mangleGetterName(String name) => 'get:$name';
-
-  String mangleSetterName(String name) => 'set:$name';
-
-  String mangleSelectorName(String name, bool isGetter, bool isSetter) {
-    if (isGetter) {
-      return mangleGetterName(name);
-    } else if (isSetter) {
-      return mangleSetterName(name);
-    } else {
-      return name;
-    }
-  }
-
-  String mangleMemberName(Member member, bool isGetter, bool isSetter) {
-    final name = member.name.text;
-    if (isGetter || (member is Procedure && member.isGetter)) {
-      return mangleGetterName(name);
-    }
-    if (isSetter || (member is Procedure && member.isSetter)) {
-      return mangleSetterName(name);
-    }
-    return name;
-  }
-
-  ObjectHandle getPublicNameHandle(String name) {
-    assert(name != null);
-    _PublicNameHandle handle = _publicNames[name];
-    if (handle == null) {
-      handle = getOrAddObject(new _PublicNameHandle(name));
-      _publicNames[name] = handle;
-    }
-    return handle;
-  }
-
-  ObjectHandle getNameHandle(Library library, String name) {
-    if (library == null) {
-      return getPublicNameHandle(name);
-    }
-    assert(name != null);
-    final libraryHandle = library != null ? getHandle(library) : null;
-    return getOrAddObject(new _PrivateNameHandle(libraryHandle, name));
-  }
-
-  List<_PublicNameHandle> getPublicNameHandles(List<String> names) {
-    if (names.isEmpty) {
-      return const <_PublicNameHandle>[];
-    }
-    final handles = new List<_PublicNameHandle>(names.length);
-    for (int i = 0; i < names.length; ++i) {
-      handles[i] = getPublicNameHandle(names[i]);
-    }
-    return handles;
-  }
-
-  ObjectHandle getConstStringHandle(String value) =>
-      getOrAddObject(new _ConstObjectHandle(ConstTag.kString, value));
-
-  List<ObjectHandle> getConstStringHandles(List<String> values) {
-    if (values.isEmpty) {
-      return const <ObjectHandle>[];
-    }
-    final handles = new List<ObjectHandle>(values.length);
-    for (int i = 0; i < values.length; ++i) {
-      handles[i] = getConstStringHandle(values[i]);
-    }
-    return handles;
-  }
-
-  ObjectHandle getSelectorNameHandle(Name name,
-      {bool isGetter: false, bool isSetter: false}) {
-    return getNameHandle(
-        name.library, mangleSelectorName(name.text, isGetter, isSetter));
-  }
-
-  ObjectHandle getTopLevelClassHandle(Library library) {
-    final libraryHandle = getHandle(library);
-    final name = getPublicNameHandle(topLevelClassName);
-    return getOrAddObject(new _ClassHandle(libraryHandle, name));
-  }
-
-  ObjectHandle getMemberHandle(Member member,
-      {bool isGetter: false, bool isSetter: false}) {
-    final parent = member.parent;
-    ObjectHandle classHandle;
-    if (parent is Class) {
-      classHandle = getHandle(parent);
-    } else if (parent is Library) {
-      classHandle = getTopLevelClassHandle(parent);
-    } else {
-      throw "Unexpected Member's parent ${parent.runtimeType} $parent";
-    }
-    final nameHandle = getNameHandle(
-        member.name.library, mangleMemberName(member, isGetter, isSetter));
-    bool isField = member is Field && !isGetter && !isSetter;
-    bool isConstructor =
-        member is Constructor || (member is Procedure && member.isFactory);
-    return getOrAddObject(
-        new _MemberHandle(classHandle, nameHandle, isField, isConstructor));
-  }
-
-  ObjectHandle getTypeArgumentsHandle(List<DartType> typeArgs) {
-    if (typeArgs == null) {
-      return null;
-    }
-    final handles = new List<_TypeHandle>(typeArgs.length);
-    for (int i = 0; i < typeArgs.length; ++i) {
-      handles[i] = getHandle(typeArgs[i]) as _TypeHandle;
-    }
-    return getOrAddObject(new _TypeArgumentsHandle(handles));
-  }
-
-  ObjectHandle getArgDescHandle(int numArguments,
-      [int numTypeArguments = 0, List<String> argNames = const <String>[]]) {
-    return getOrAddObject(new _ArgDescHandle(
-        numArguments, numTypeArguments, getPublicNameHandles(argNames)));
-  }
-
-  ObjectHandle getArgDescHandleByArguments(Arguments args,
-      {bool hasReceiver: false, bool isFactory: false}) {
-    List<_PublicNameHandle> argNames = const <_PublicNameHandle>[];
-    final namedArguments = args.named;
-    if (namedArguments.isNotEmpty) {
-      argNames = new List<_PublicNameHandle>(namedArguments.length);
-      for (int i = 0; i < namedArguments.length; ++i) {
-        argNames[i] = getPublicNameHandle(namedArguments[i].name);
-      }
-    }
-    final int numArguments = args.positional.length +
-        args.named.length +
-        (hasReceiver ? 1 : 0) +
-        // VM expects that type arguments vector passed to a factory
-        // constructor is counted in numArguments, and not counted in
-        // numTypeArgs.
-        // TODO(alexmarkov): Clean this up.
-        (isFactory ? 1 : 0);
-    final int numTypeArguments = isFactory ? 0 : args.types.length;
-    return getOrAddObject(
-        new _ArgDescHandle(numArguments, numTypeArguments, argNames));
-  }
-
-  ObjectHandle getScriptHandle(Uri uri, SourceFile source) {
-    ObjectHandle uriHandle = getPublicNameHandle(uri.toString());
-    _ScriptHandle handle = getOrAddObject(new _ScriptHandle(uriHandle, source));
-    if (handle.source == null && source != null) {
-      handle.source = source;
-    }
-    return handle;
-  }
-
-  List<NameAndType> getTypeParameterHandles(List<TypeParameter> typeParams) {
-    if (typeParams.isEmpty) {
-      return const <NameAndType>[];
-    }
-    final namesAndBounds = new List<NameAndType>();
-    for (TypeParameter tp in typeParams) {
-      namesAndBounds.add(
-          new NameAndType(getPublicNameHandle(tp.name), getHandle(tp.bound)));
-    }
-    return namesAndBounds;
-  }
-
-  void declareClosure(
-      FunctionNode function, Member enclosingMember, int closureIndex) {
-    final handle = getOrAddObject(
-        new _ClosureHandle(getHandle(enclosingMember), closureIndex));
-    _nodeCache[function] = handle;
-  }
-
-  ObjectHandle getOrAddObject(ObjectHandle obj) {
-    assert(obj._useCount == 0);
-    ObjectHandle canonical = _canonicalizationCache[obj];
-    if (canonical == null) {
-      assert(_indexTable == null);
-      _objects.add(obj);
-      _canonicalizationCache[obj] = obj;
-      canonical = obj;
-    }
-    ++canonical._useCount;
-    return canonical;
-  }
-
-  void allocateIndexTable() {
-    int tableSize = 1; // Reserve invalid entry.
-    for (var obj in _objects.reversed) {
-      assert(obj._reference == null);
-      if (obj.shouldBeIncludedIntoIndexTable) {
-        // This object will be included into index table.
-        ++tableSize;
-      } else {
-        // This object will be copied and written inline. Bump use count for
-        // objects referenced from this one for each copy after the first.
-        obj._reference = ObjectHandle.inlineObject;
-        obj.accountUsesForObjectCopies(obj._useCount - 1);
-      }
-    }
-    _indexTable = new List<ObjectHandle>(tableSize);
-    int count = 0;
-    _indexTable[count++] = new _InvalidHandle()
-      .._reference = ObjectHandle._makeReference(0);
-    for (var obj in _objects) {
-      if (obj._reference == null) {
-        obj._reference = ObjectHandle._makeReference(count);
-        _indexTable[count++] = obj;
-      } else {
-        assert(obj._reference == ObjectHandle.inlineObject);
-      }
-    }
-    assert(count == tableSize);
-  }
-
-  @override
-  void writeObject(BytecodeObject object, BufferedWriter writer) {
-    ObjectHandle handle = object as ObjectHandle;
-    if (handle == null) {
-      writer.writePackedUInt30(ObjectHandle._makeReference(0));
-      return;
-    }
-    if (handle._reference == ObjectHandle.inlineObject) {
-      handle._write(writer);
-    } else {
-      assert(handle._reference >= 0);
-      assert((handle._reference & ObjectHandle.referenceBit) != 0);
-      writer.writePackedUInt30(handle._reference);
-    }
-  }
-
-  @override
-  BytecodeObject readObject(BufferedReader reader) {
-    final int header = reader.readPackedUInt30();
-    if ((header & ObjectHandle.referenceBit) == 0) {
-      return new ObjectHandle._read(reader, header);
-    } else {
-      final int index = ObjectHandle._getIndexFromReference(header);
-      return (index == 0) ? null : _indexTable[index];
-    }
-  }
-
-  void write(BufferedWriter writer) {
-    assert(writer.objectWriter == this);
-    assert(_indexTable != null);
-    final start = writer.offset;
-    if (BytecodeSizeStatistics.objectTableStats.isEmpty) {
-      for (var kind in ObjectKind.values) {
-        BytecodeSizeStatistics.objectTableStats
-            .add(new NamedEntryStatistics(objectKindToString(kind)));
-      }
-    }
-
-    BufferedWriter contentsWriter = new BufferedWriter.fromWriter(writer);
-    List<int> offsets = new List<int>(_indexTable.length);
-
-    for (int i = 0; i < _indexTable.length; ++i) {
-      offsets[i] = contentsWriter.offset;
-      _indexTable[i]._write(contentsWriter);
-
-      final entryStat =
-          BytecodeSizeStatistics.objectTableStats[_indexTable[i].kind.index];
-      entryStat.size += (contentsWriter.offset - offsets[i]);
-      ++entryStat.count;
-    }
-
-    writer.writePackedUInt30(_indexTable.length);
-    writer.writePackedUInt30(contentsWriter.offset);
-    writer.appendWriter(contentsWriter);
-    for (var offs in offsets) {
-      writer.writePackedUInt30(offs);
-    }
-
-    // Index strings in objects which will be written inline
-    // in constant pool entries.
-    for (var obj in _objects) {
-      if (obj._reference == ObjectHandle.inlineObject) {
-        obj.indexStrings(writer.stringWriter);
-      }
-    }
-
-    BytecodeSizeStatistics.objectTableSize += (writer.offset - start);
-    BytecodeSizeStatistics.objectTableEntriesCount += _indexTable.length;
-  }
-
-  ObjectTable.read(BufferedReader reader) {
-    reader.objectReader = this;
-
-    final int numEntries = reader.readPackedUInt30();
-    reader.readPackedUInt30(); // Contents length
-
-    _indexTable = new List<ObjectHandle>(numEntries);
-    for (int i = 0; i < numEntries; ++i) {
-      final int header = reader.readPackedUInt30();
-      _indexTable[i] = new ObjectHandle._read(reader, header)
-        .._reference = ObjectHandle._makeReference(i);
-    }
-    // Skip index table.
-    for (int i = 0; i < numEntries; ++i) {
-      reader.readPackedUInt30();
-    }
-  }
-
-  @override
-  String toString() {
-    StringBuffer sb = new StringBuffer();
-    sb.writeln('ObjectTable {');
-    for (int i = 0; i < _indexTable.length; ++i) {
-      final obj = _indexTable[i];
-      sb.writeln('  [$i] = ${objectKindToString(obj.kind)} $obj');
-    }
-    sb.writeln('}');
-    return sb.toString();
-  }
-}
-
-class _NodeVisitor extends Visitor<ObjectHandle> {
-  final ObjectTable objectTable;
-  final CoreTypes coreTypes;
-  final _typeParameters = <TypeParameter, ObjectHandle>{};
-  final Map<DartType, int> _recursiveTypeIds = <DartType, int>{};
-  final recursiveTypesValidator;
-
-  _NodeVisitor(this.objectTable, this.coreTypes)
-      : recursiveTypesValidator = new RecursiveTypesValidator(coreTypes);
-
-  @override
-  ObjectHandle defaultNode(Node node) =>
-      throw 'Unexpected node ${node.runtimeType} $node';
-
-  @override
-  ObjectHandle visitLibrary(Library node) {
-    final uri = objectTable.getConstStringHandle(node.importUri.toString());
-    return objectTable.getOrAddObject(new _LibraryHandle(uri));
-  }
-
-  @override
-  ObjectHandle visitClass(Class node) {
-    final ObjectHandle library = objectTable.getHandle(node.enclosingLibrary);
-    final name = node.name.startsWith('_')
-        ? objectTable.getOrAddObject(new _PrivateNameHandle(library, node.name))
-        : objectTable.getPublicNameHandle(node.name);
-    return objectTable.getOrAddObject(new _ClassHandle(library, name));
-  }
-
-  @override
-  ObjectHandle defaultMember(Member node) => objectTable.getMemberHandle(node);
-
-  @override
-  ObjectHandle visitDynamicType(DynamicType node) => objectTable._dynamicType;
-
-  @override
-  ObjectHandle visitVoidType(VoidType node) => objectTable._voidType;
-
-  @override
-  ObjectHandle visitNeverType(NeverType node) =>
-      objectTable.getOrAddObject(new _NeverTypeHandle(node.nullability));
-
-  @override
-  ObjectHandle visitBottomType(BottomType node) =>
-      // Map Bottom type to Null type until not emitted by CFE anymore.
-      objectTable.getHandle(coreTypes.nullType);
-
-  @override
-  ObjectHandle visitInterfaceType(InterfaceType node) {
-    final classHandle = objectTable.getHandle(node.classNode);
-    if (!hasInstantiatorTypeArguments(node.classNode)) {
-      return objectTable
-          .getOrAddObject(new _SimpleTypeHandle(classHandle, node.nullability));
-    }
-
-    // Non-finalized types are not recursive, but finalization of
-    // generic types includes flattening of type arguments and types could
-    // become recursive. Consider the following example:
-    //
-    //  class Base<T> {}
-    //  class Foo<T> extends Base<Foo<T>> {}
-    //
-    //  Foo<int> is not recursive, but finalized type is recursive:
-    //  Foo<int>* = Foo [ Base [ Foo<int>* ], int ]
-    //
-    // Object table serialization/deserialization cannot handle cycles between
-    // objects, so recursive types require extra care when serializing.
-    // Back references to the already serialized types are represented as
-    // _RecursiveTypeRefHandle objects, which are only valid in the context
-    // of enclosing top-level _RecursiveGenericType.
-    //
-    int recursiveId = _recursiveTypeIds[node];
-    if (recursiveId != null) {
-      return objectTable
-          .getOrAddObject(new _RecursiveTypeRefHandle(recursiveId));
-    }
-
-    recursiveTypesValidator.validateType(node);
-
-    final isRecursive = recursiveTypesValidator.isRecursive(node);
-    if (isRecursive) {
-      recursiveId = _recursiveTypeIds.length;
-      _recursiveTypeIds[node] = recursiveId;
-    }
-
-    List<DartType> instantiatorArgs =
-        getInstantiatorTypeArguments(node.classNode, node.typeArguments);
-    ObjectHandle typeArgsHandle =
-        objectTable.getTypeArgumentsHandle(instantiatorArgs);
-
-    final result = objectTable.getOrAddObject(isRecursive
-        ? new _RecursiveGenericTypeHandle(
-            recursiveId, classHandle, typeArgsHandle, node.nullability)
-        : new _GenericTypeHandle(
-            classHandle, typeArgsHandle, node.nullability));
-
-    if (isRecursive) {
-      _recursiveTypeIds.remove(node);
-    }
-
-    return result;
-  }
-
-  @override
-  ObjectHandle visitFutureOrType(FutureOrType node) {
-    final classNode = coreTypes.deprecatedFutureOrClass;
-    final classHandle = objectTable.getHandle(classNode);
-    List<DartType> instantiatorArgs =
-        getInstantiatorTypeArguments(classNode, [node.typeArgument]);
-    ObjectHandle typeArgsHandle =
-        objectTable.getTypeArgumentsHandle(instantiatorArgs);
-    final result = objectTable.getOrAddObject(
-        new _GenericTypeHandle(classHandle, typeArgsHandle, node.nullability));
-    return result;
-  }
-
-  @override
-  ObjectHandle visitTypeParameterType(TypeParameterType node) {
-    final param = node.parameter;
-    final handle = _typeParameters[param];
-    if (handle != null) {
-      final typeParameterHandle = handle as _TypeParameterHandle;
-      if (typeParameterHandle.nullability == node.nullability) {
-        return handle;
-      }
-      return objectTable.getOrAddObject(new _TypeParameterHandle(
-          typeParameterHandle.parent,
-          typeParameterHandle.indexInParent,
-          node.nullability));
-    }
-
-    final parent = param.parent;
-    if (parent == null) {
-      throw 'Type parameter $param without parent, but not declared by function type';
-    }
-
-    ObjectHandle parentHandle;
-    int indexInParent;
-    if (parent is Class) {
-      parentHandle = objectTable.getHandle(parent);
-      indexInParent = parent.typeParameters.indexOf(param);
-      if (indexInParent < 0) {
-        throw 'Type parameter $param is not found in its parent class $parent';
-      }
-    } else if (parent is FunctionNode) {
-      final funcParent = parent.parent;
-      if (funcParent is Member) {
-        parentHandle = objectTable.getHandle(funcParent);
-      } else if (funcParent is FunctionExpression ||
-          funcParent is FunctionDeclaration) {
-        parentHandle = objectTable.getHandle(parent);
-      } else {
-        throw 'Unexpected parent of FunctionNode: ${funcParent.runtimeType} $funcParent';
-      }
-      indexInParent = parent.typeParameters.indexOf(node.parameter);
-      if (indexInParent < 0) {
-        throw 'Type parameter $param is not found in its parent function $parent';
-      }
-    } else {
-      throw 'Unexpected parent of TypeParameter: ${parent.runtimeType} $parent';
-    }
-    return objectTable.getOrAddObject(new _TypeParameterHandle(
-        parentHandle, indexInParent, node.nullability));
-  }
-
-  @override
-  ObjectHandle visitFunctionType(FunctionType node) {
-    final int numEnclosingTypeParameters = _typeParameters.length;
-    for (int i = 0; i < node.typeParameters.length; ++i) {
-      _typeParameters[node.typeParameters[i]] = objectTable.getOrAddObject(
-          new _TypeParameterHandle(
-              null, numEnclosingTypeParameters + i, Nullability.legacy));
-      // Nullability.legacy is a dummy value, since TypeParameter does not
-      // specify nullability, only the reference to a TypeParameter does, i.e.
-      // TypeParameterType.
-    }
-
-    final positionalParams = new List<_TypeHandle>();
-    for (var param in node.positionalParameters) {
-      positionalParams.add(objectTable.getHandle(param));
-    }
-    final namedParams = new List<NameAndType>();
-    for (var param in node.namedParameters) {
-      namedParams.add(new NameAndType(
-          objectTable.getPublicNameHandle(param.name),
-          objectTable.getHandle(param.type)));
-    }
-    final returnType = objectTable.getHandle(node.returnType);
-
-    final result = objectTable.getOrAddObject(new _FunctionTypeHandle(
-        objectTable.getTypeParameterHandles(node.typeParameters),
-        node.requiredParameterCount,
-        positionalParams,
-        namedParams,
-        returnType,
-        node.nullability));
-
-    for (int i = 0; i < node.typeParameters.length; ++i) {
-      _typeParameters.remove(node.typeParameters[i]);
-    }
-
-    return result;
-  }
-
-  @override
-  ObjectHandle visitTypedefType(TypedefType node) =>
-      objectTable.getHandle(node.unalias);
-
-  @override
-  ObjectHandle visitNullConstant(NullConstant node) => null;
-
-  @override
-  ObjectHandle visitBoolConstant(BoolConstant node) => objectTable
-      .getOrAddObject(new _ConstObjectHandle(ConstTag.kBool, node.value));
-
-  @override
-  ObjectHandle visitIntConstant(IntConstant node) => objectTable
-      .getOrAddObject(new _ConstObjectHandle(ConstTag.kInt, node.value));
-
-  @override
-  ObjectHandle visitDoubleConstant(DoubleConstant node) => objectTable
-      .getOrAddObject(new _ConstObjectHandle(ConstTag.kDouble, node.value));
-
-  @override
-  ObjectHandle visitStringConstant(StringConstant node) =>
-      objectTable.getConstStringHandle(node.value);
-
-  @override
-  ObjectHandle visitSymbolConstant(SymbolConstant node) =>
-      objectTable.getOrAddObject(new _ConstObjectHandle(
-          ConstTag.kSymbol,
-          objectTable.getNameHandle(
-              node.libraryReference?.asLibrary, node.name)));
-
-  @override
-  ObjectHandle visitListConstant(ListConstant node) =>
-      objectTable.getOrAddObject(new _ConstObjectHandle(
-          ConstTag.kList,
-          objectTable.getHandles(node.entries),
-          objectTable.getHandle(node.typeArgument)));
-
-  @override
-  ObjectHandle visitInstanceConstant(InstanceConstant node) =>
-      objectTable.getOrAddObject(new _ConstObjectHandle(
-          ConstTag.kInstance,
-          node.fieldValues.map<ObjectHandle, ObjectHandle>(
-              (Reference fieldRef, Constant value) => new MapEntry(
-                  objectTable.getHandle(fieldRef.asField),
-                  objectTable.getHandle(value))),
-          objectTable.getHandle(new InterfaceType(
-              node.classNode, Nullability.legacy, node.typeArguments))));
-
-  @override
-  ObjectHandle visitTearOffConstant(TearOffConstant node) =>
-      objectTable.getOrAddObject(new _ConstObjectHandle(
-          ConstTag.kTearOff, objectTable.getHandle(node.procedure)));
-
-  @override
-  ObjectHandle visitTypeLiteralConstant(TypeLiteralConstant node) =>
-      objectTable.getHandle(node.type);
-
-  @override
-  ObjectHandle visitPartialInstantiationConstant(
-          PartialInstantiationConstant node) =>
-      objectTable.getOrAddObject(new _ConstObjectHandle(
-          ConstTag.kTearOffInstantiation,
-          objectTable.getHandle(node.tearOffConstant),
-          objectTable.getTypeArgumentsHandle(node.types)));
-}
-
-int _combineHashes(int hash1, int hash2) =>
-    (((hash1 * 31) & 0x3fffffff) + hash2) & 0x3fffffff;
diff --git a/pkg/vm/lib/bytecode/options.dart b/pkg/vm/lib/bytecode/options.dart
deleted file mode 100644
index 1eedd8d..0000000
--- a/pkg/vm/lib/bytecode/options.dart
+++ /dev/null
@@ -1,97 +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.
-
-library vm.bytecode.options;
-
-/// Collection of options for bytecode generator.
-class BytecodeOptions {
-  static Map<String, String> commandLineFlags = {
-    'annotations': 'Emit Dart annotations',
-    'local-var-info': 'Emit debug information about local variables',
-    'debugger-stops': 'Emit bytecode instructions for stopping in the debugger',
-    'show-bytecode-size-stat': 'Show bytecode size breakdown',
-    'source-positions': 'Emit source positions',
-    'instance-field-initializers': 'Emit separate instance field initializers',
-    'keep-unreachable-code':
-        'Do not remove unreachable code (useful if collecting code coverage)',
-    'avoid-closure-call-instructions':
-        'Do not emit closure call instructions (useful if collecting code '
-            'coverage, as closure call instructions are not tracked by code '
-            'coverage)',
-  };
-
-  bool enableAsserts;
-  bool causalAsyncStacks;
-  bool emitSourcePositions;
-  bool emitSourceFiles;
-  bool emitLocalVarInfo;
-  bool emitDebuggerStops;
-  bool emitAnnotations;
-  bool emitInstanceFieldInitializers;
-  bool omitAssertSourcePositions;
-  bool keepUnreachableCode;
-  bool avoidClosureCallInstructions;
-  bool showBytecodeSizeStatistics;
-  Map<String, String> environmentDefines;
-
-  BytecodeOptions(
-      {this.enableAsserts = false,
-      this.causalAsyncStacks,
-      this.emitSourcePositions = false,
-      this.emitSourceFiles = false,
-      this.emitLocalVarInfo = false,
-      this.emitDebuggerStops = false,
-      this.emitAnnotations = false,
-      this.emitInstanceFieldInitializers = false,
-      this.omitAssertSourcePositions = false,
-      this.keepUnreachableCode = false,
-      this.avoidClosureCallInstructions = false,
-      this.showBytecodeSizeStatistics = false,
-      bool aot = false,
-      this.environmentDefines = const <String, String>{}}) {
-    causalAsyncStacks ??=
-        environmentDefines['dart.developer.causal_async_stacks'] == 'true';
-    if (aot) {
-      emitSourcePositions = true;
-      emitLocalVarInfo = true;
-      causalAsyncStacks = true;
-    }
-  }
-
-  void parseCommandLineFlags(List<String> flags) {
-    if (flags == null) {
-      return;
-    }
-    for (String flag in flags) {
-      switch (flag) {
-        case 'source-positions':
-          emitSourcePositions = true;
-          break;
-        case 'local-var-info':
-          emitLocalVarInfo = true;
-          break;
-        case 'debugger-stops':
-          emitDebuggerStops = true;
-          break;
-        case 'annotations':
-          emitAnnotations = true;
-          break;
-        case 'instance-field-initializers':
-          emitInstanceFieldInitializers = true;
-          break;
-        case 'keep-unreachable-code':
-          keepUnreachableCode = true;
-          break;
-        case 'avoid-closure-call-instructions':
-          avoidClosureCallInstructions = true;
-          break;
-        case 'show-bytecode-size-stat':
-          showBytecodeSizeStatistics = true;
-          break;
-        default:
-          throw 'Unexpected bytecode flag $flag';
-      }
-    }
-  }
-}
diff --git a/pkg/vm/lib/bytecode/recognized_methods.dart b/pkg/vm/lib/bytecode/recognized_methods.dart
deleted file mode 100644
index f73ce50..0000000
--- a/pkg/vm/lib/bytecode/recognized_methods.dart
+++ /dev/null
@@ -1,107 +0,0 @@
-// Copyright (c) 2018, 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.
-
-library vm.bytecode.recognized_methods;
-
-import 'package:kernel/ast.dart';
-import 'package:kernel/type_environment.dart' show StaticTypeContext;
-
-import 'dbc.dart';
-import 'generics.dart' show getStaticType;
-
-class RecognizedMethods {
-  static const binaryIntOps = <String, Opcode>{
-    '+': Opcode.kAddInt,
-    '-': Opcode.kSubInt,
-    '*': Opcode.kMulInt,
-    '~/': Opcode.kTruncDivInt,
-    '%': Opcode.kModInt,
-    '&': Opcode.kBitAndInt,
-    '|': Opcode.kBitOrInt,
-    '^': Opcode.kBitXorInt,
-    '<<': Opcode.kShlInt,
-    '>>': Opcode.kShrInt,
-    '==': Opcode.kCompareIntEq,
-    '>': Opcode.kCompareIntGt,
-    '<': Opcode.kCompareIntLt,
-    '>=': Opcode.kCompareIntGe,
-    '<=': Opcode.kCompareIntLe,
-  };
-
-  static const binaryDoubleOps = <String, Opcode>{
-    '+': Opcode.kAddDouble,
-    '-': Opcode.kSubDouble,
-    '*': Opcode.kMulDouble,
-    '/': Opcode.kDivDouble,
-    '==': Opcode.kCompareDoubleEq,
-    '>': Opcode.kCompareDoubleGt,
-    '<': Opcode.kCompareDoubleLt,
-    '>=': Opcode.kCompareDoubleGe,
-    '<=': Opcode.kCompareDoubleLe,
-  };
-
-  final StaticTypeContext staticTypeContext;
-
-  RecognizedMethods(this.staticTypeContext);
-
-  DartType staticType(Expression expr) =>
-      getStaticType(expr, staticTypeContext);
-
-  bool isInt(DartType type) =>
-      type == staticTypeContext.typeEnvironment.coreTypes.intLegacyRawType;
-
-  bool isDouble(DartType type) =>
-      type == staticTypeContext.typeEnvironment.coreTypes.doubleLegacyRawType;
-
-  Opcode specializedBytecodeFor(MethodInvocation node) {
-    final args = node.arguments;
-    if (!args.named.isEmpty) {
-      return null;
-    }
-
-    final Expression receiver = node.receiver;
-    final String selector = node.name.text;
-
-    switch (args.positional.length) {
-      case 0:
-        return specializedBytecodeForUnaryOp(selector, receiver);
-      case 1:
-        return specializedBytecodeForBinaryOp(
-            selector, receiver, args.positional.single);
-      default:
-        return null;
-    }
-  }
-
-  Opcode specializedBytecodeForUnaryOp(String selector, Expression arg) {
-    if (selector == 'unary-') {
-      final argType = staticType(arg);
-      if (isInt(argType)) {
-        return Opcode.kNegateInt;
-      } else if (isDouble(argType)) {
-        return Opcode.kNegateDouble;
-      }
-    }
-
-    return null;
-  }
-
-  Opcode specializedBytecodeForBinaryOp(
-      String selector, Expression a, Expression b) {
-    if (selector == '==' && (a is NullLiteral || b is NullLiteral)) {
-      return Opcode.kEqualsNull;
-    }
-
-    final aType = staticType(a);
-    final bType = staticType(b);
-
-    if (isInt(aType) && isInt(bType)) {
-      return binaryIntOps[selector];
-    }
-    if (isDouble(aType) && isDouble(bType)) {
-      return binaryDoubleOps[selector];
-    }
-    return null;
-  }
-}
diff --git a/pkg/vm/lib/bytecode/recursive_types_validator.dart b/pkg/vm/lib/bytecode/recursive_types_validator.dart
deleted file mode 100644
index 66512be..0000000
--- a/pkg/vm/lib/bytecode/recursive_types_validator.dart
+++ /dev/null
@@ -1,188 +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.
-
-library vm.bytecode.recursive_types_validator;
-
-import 'package:kernel/ast.dart' hide MapEntry;
-import 'package:kernel/core_types.dart' show CoreTypes;
-import 'package:kernel/type_algebra.dart' show Substitution;
-
-import 'generics.dart'
-    show flattenInstantiatorTypeArguments, hasFreeTypeParameters;
-
-/// Detect recursive types and validates that finalized (flattened)
-/// representation of generic types is valid (finite).
-class RecursiveTypesValidator {
-  final CoreTypes coreTypes;
-  final Set<DartType> _validatedTypes = <DartType>{};
-  final Set<DartType> _recursiveTypes = <DartType>{};
-  final Set<Class> _validatedClases = <Class>{};
-
-  RecursiveTypesValidator(this.coreTypes);
-
-  /// Validates [type].
-  void validateType(DartType type) {
-    if (!isValidated(type)) {
-      final visitor = new _RecursiveTypesVisitor(this);
-      visitor.visit(type);
-      _validatedTypes.addAll(visitor.validated);
-      _recursiveTypes.addAll(visitor.recursive);
-    }
-  }
-
-  bool isValidated(DartType type) => _validatedTypes.contains(type);
-
-  /// Returns true if [type] is recursive.
-  /// Should be called only after validating [type].
-  bool isRecursive(DartType type) {
-    assert(isValidated(type));
-    return _recursiveTypes.contains(type);
-  }
-
-  void validateClass(Class cls) {
-    if (_validatedClases.add(cls)) {
-      try {
-        validateType(
-            cls.getThisType(coreTypes, cls.enclosingLibrary.nonNullable));
-      } on IllegalRecursiveTypeException catch (e) {
-        _validatedClases.remove(cls);
-        throw e;
-      }
-    }
-  }
-}
-
-class IllegalRecursiveTypeException {
-  final DartType type;
-  IllegalRecursiveTypeException(this.type);
-}
-
-class _RecursiveTypesVisitor extends DartTypeVisitor<void> {
-  final RecursiveTypesValidator validator;
-  final Set<DartType> validated = <DartType>{};
-  final Set<DartType> recursive = <DartType>{};
-  final Set<DartType> _visited = new Set<DartType>();
-  final List<DartType> _stack = <DartType>[];
-
-  _RecursiveTypesVisitor(this.validator);
-
-  void visit(DartType type) {
-    if (validator.isValidated(type)) {
-      return;
-    }
-
-    if (!_visited.add(type)) {
-      final int start = _stack.lastIndexOf(type);
-      _verifyRecursiveType(start, type);
-      for (int i = start; i < _stack.length; ++i) {
-        recursive.add(_stack[i]);
-      }
-      return;
-    }
-
-    _stack.add(type);
-
-    type.accept(this);
-
-    _stack.removeLast();
-    _visited.remove(type);
-
-    validated.add(type);
-  }
-
-  @override
-  void defaultDartType(DartType node) =>
-      throw 'Unexpected type ${node.runtimeType} $node';
-
-  @override
-  void visitInvalidType(InvalidType node) {}
-
-  @override
-  void visitDynamicType(DynamicType node) {}
-
-  @override
-  void visitVoidType(VoidType node) {}
-
-  @override
-  void visitBottomType(BottomType node) {}
-
-  @override
-  void visitNeverType(NeverType node) {}
-
-  @override
-  void visitTypeParameterType(TypeParameterType node) {}
-
-  @override
-  void visitInterfaceType(InterfaceType node) {
-    // Validate class declaration type separately
-    // to avoid failures due to types in the current _stack.
-    validator.validateClass(node.classNode);
-
-    for (var typeArg in node.typeArguments) {
-      visit(typeArg);
-    }
-    final flatTypeArgs =
-        flattenInstantiatorTypeArguments(node.classNode, node.typeArguments);
-    for (var typeArg in flatTypeArgs.getRange(
-        0, flatTypeArgs.length - node.typeArguments.length)) {
-      visit(typeArg);
-    }
-  }
-
-  @override
-  void visitFutureOrType(FutureOrType node) {
-    visit(node.typeArgument);
-  }
-
-  @override
-  void visitTypedefType(TypedefType node) => visit(node.unalias);
-
-  @override
-  void visitFunctionType(FunctionType node) {
-    for (var p in node.positionalParameters) {
-      visit(p);
-    }
-    for (var p in node.namedParameters) {
-      visit(p.type);
-    }
-    visit(node.returnType);
-  }
-
-  void _verifyRecursiveType(int start, DartType type) {
-    if (type is InterfaceType) {
-      if (!hasFreeTypeParameters(type.typeArguments)) {
-        return;
-      }
-
-      for (int i = start + 1; i < _stack.length; ++i) {
-        final other = _stack[i];
-        if (other is InterfaceType &&
-            other.classNode == type.classNode &&
-            hasFreeTypeParameters(other.typeArguments)) {
-          if (!listEquals(_eraseTypeParameters(type.typeArguments),
-              _eraseTypeParameters(other.typeArguments))) {
-            throw IllegalRecursiveTypeException(type);
-          }
-        }
-      }
-    } else {
-      throw 'Unexpected recursive type ${type.runtimeType} $type';
-    }
-  }
-
-  List<DartType> _eraseTypeParameters(List<DartType> typeArgs) {
-    return typeArgs
-        .map((DartType t) =>
-            const _EraseTypeParametersToDynamic().substituteType(t))
-        .toList();
-  }
-}
-
-class _EraseTypeParametersToDynamic extends Substitution {
-  const _EraseTypeParametersToDynamic();
-
-  DartType getSubstitute(TypeParameter parameter, bool upperBound) {
-    return const DynamicType();
-  }
-}
diff --git a/pkg/vm/lib/bytecode/source_positions.dart b/pkg/vm/lib/bytecode/source_positions.dart
deleted file mode 100644
index 9cf138c..0000000
--- a/pkg/vm/lib/bytecode/source_positions.dart
+++ /dev/null
@@ -1,125 +0,0 @@
-// Copyright (c) 2018, 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.
-
-library vm.bytecode.source_positions;
-
-import 'bytecode_serialization.dart'
-    show
-        BufferedWriter,
-        BufferedReader,
-        BytecodeDeclaration,
-        PackedUInt30DeltaEncoder,
-        PackedUInt30DeltaDecoder,
-        SLEB128DeltaEncoder,
-        SLEB128DeltaDecoder;
-
-/// Maintains mapping between bytecode instructions and source positions.
-class SourcePositions extends BytecodeDeclaration {
-  // Special value of fileOffset which marks synthetic code without source
-  // position.
-  static const syntheticCodeMarker = -1;
-  // Special value of fileOffset which marks yield point.
-  static const yieldPointMarker = -2;
-
-  final List<int> _positions = <int>[]; // Pairs (PC, fileOffset).
-  int _lastPc = 0;
-  int _lastOffset = 0;
-
-  SourcePositions();
-
-  void add(int pc, int fileOffset) {
-    assert(pc > _lastPc);
-    assert((fileOffset >= 0) || (fileOffset == syntheticCodeMarker));
-    if (fileOffset != _lastOffset) {
-      _positions.add(pc);
-      _positions.add(fileOffset);
-      _lastPc = pc;
-      _lastOffset = fileOffset;
-    }
-  }
-
-  void addYieldPoint(int pc, int fileOffset) {
-    assert(pc > _lastPc);
-    assert((fileOffset >= 0) || (fileOffset == syntheticCodeMarker));
-    _positions.add(pc);
-    _positions.add(yieldPointMarker);
-    _positions.add(pc);
-    _positions.add(fileOffset);
-    _lastPc = pc;
-    _lastOffset = fileOffset;
-  }
-
-  bool get isEmpty => _positions.isEmpty;
-  bool get isNotEmpty => !isEmpty;
-
-  void write(BufferedWriter writer) {
-    writer.writePackedUInt30(_positions.length ~/ 2);
-    final encodePC = new PackedUInt30DeltaEncoder();
-    final encodeOffset = new SLEB128DeltaEncoder();
-    for (int i = 0; i < _positions.length; i += 2) {
-      final int pc = _positions[i];
-      final int fileOffset = _positions[i + 1];
-      encodePC.write(writer, pc);
-      encodeOffset.write(writer, fileOffset);
-    }
-  }
-
-  SourcePositions.read(BufferedReader reader) {
-    final int length = reader.readPackedUInt30();
-    final decodePC = new PackedUInt30DeltaDecoder();
-    final decodeOffset = new SLEB128DeltaDecoder();
-    for (int i = 0; i < length; ++i) {
-      int pc = decodePC.read(reader);
-      int fileOffset = decodeOffset.read(reader);
-      _positions.add(pc);
-      _positions.add(fileOffset);
-    }
-  }
-
-  @override
-  String toString() => _positions.toString();
-
-  Map<int, String> getBytecodeAnnotations() {
-    final map = <int, String>{};
-    for (int i = 0; i < _positions.length; i += 2) {
-      final int pc = _positions[i];
-      final int fileOffset = _positions[i + 1];
-      final entry = (fileOffset == yieldPointMarker)
-          ? 'yield point'
-          : 'source position $fileOffset';
-      if (map[pc] == null) {
-        map[pc] = entry;
-      } else {
-        map[pc] = "${map[pc]}; $entry";
-      }
-    }
-    return map;
-  }
-}
-
-/// Keeps file offsets of line starts. This information is used to
-/// decode source positions to line/column.
-class LineStarts extends BytecodeDeclaration {
-  final List<int> lineStarts;
-
-  LineStarts(this.lineStarts);
-
-  void write(BufferedWriter writer) {
-    writer.writePackedUInt30(lineStarts.length);
-    final encodeLineStarts = new PackedUInt30DeltaEncoder();
-    for (int lineStart in lineStarts) {
-      encodeLineStarts.write(writer, lineStart);
-    }
-  }
-
-  factory LineStarts.read(BufferedReader reader) {
-    final decodeLineStarts = new PackedUInt30DeltaDecoder();
-    final lineStarts = new List<int>.generate(
-        reader.readPackedUInt30(), (_) => decodeLineStarts.read(reader));
-    return new LineStarts(lineStarts);
-  }
-
-  @override
-  String toString() => 'Line starts: $lineStarts';
-}
diff --git a/pkg/vm/lib/kernel_front_end.dart b/pkg/vm/lib/kernel_front_end.dart
index 254c56e..c123f75 100644
--- a/pkg/vm/lib/kernel_front_end.dart
+++ b/pkg/vm/lib/kernel_front_end.dart
@@ -47,10 +47,6 @@
 import 'package:kernel/target/targets.dart' show Target, TargetFlags, getTarget;
 import 'package:package_config/package_config.dart' show loadPackageConfigUri;
 
-import 'bytecode/bytecode_serialization.dart' show BytecodeSizeStatistics;
-import 'bytecode/gen_bytecode.dart'
-    show generateBytecode, createFreshComponentWithBytecode;
-import 'bytecode/options.dart' show BytecodeOptions;
 import 'http_filesystem.dart' show HttpAwareFileSystem;
 import 'target/install.dart' show installAdditionalTargets;
 import 'transformations/devirtualization.dart' as devirtualization
@@ -129,14 +125,6 @@
   args.addOption('data-dir',
       help: 'Name of the subdirectory of //data for output files');
   args.addOption('manifest', help: 'Path to output Fuchsia package manifest');
-  args.addFlag('gen-bytecode', help: 'Generate bytecode', defaultsTo: false);
-  args.addMultiOption('bytecode-options',
-      help: 'Specify options for bytecode generation:',
-      valueHelp: 'opt1,opt2,...',
-      allowed: BytecodeOptions.commandLineFlags.keys,
-      allowedHelp: BytecodeOptions.commandLineFlags);
-  args.addFlag('drop-ast',
-      help: 'Include only bytecode into the output file', defaultsTo: true);
   args.addMultiOption('enable-experiment',
       help: 'Comma separated list of experimental features to enable.');
   args.addFlag('help',
@@ -184,8 +172,6 @@
   final bool tfa = options['tfa'];
   final bool linkPlatform = options['link-platform'];
   final bool embedSources = options['embed-sources'];
-  final bool genBytecode = options['gen-bytecode'];
-  final bool dropAST = options['drop-ast'];
   final bool enableAsserts = options['enable-asserts'];
   final bool nullSafety = options['sound-null-safety'];
   final bool useProtobufTreeShaker = options['protobuf-tree-shaker'];
@@ -215,13 +201,6 @@
     }
   }
 
-  final BytecodeOptions bytecodeOptions = new BytecodeOptions(
-    enableAsserts: enableAsserts,
-    emitSourceFiles: embedSources,
-    environmentDefines: environmentDefines,
-    aot: aot,
-  )..parseCommandLineFlags(options['bytecode-options']);
-
   final fileSystem =
       createFrontEndFileSystem(fileSystemScheme, fileSystemRoots);
 
@@ -246,7 +225,7 @@
     ..fileSystem = fileSystem
     ..additionalDills = additionalDills
     ..packagesFileUri = packagesUri
-    ..experimentalFlags = parseExperimentalFlags(
+    ..explicitExperimentalFlags = parseExperimentalFlags(
         parseExperimentalArguments(experimentalFlags),
         onError: print)
     ..nnbdMode = (nullSafety == true) ? NnbdMode.Strong : NnbdMode.Weak
@@ -256,7 +235,7 @@
     ..embedSourceText = embedSources;
 
   if (nullSafety == null &&
-      compilerOptions.experimentalFlags[ExperimentalFlag.nonNullable]) {
+      compilerOptions.isExperimentEnabled(ExperimentalFlag.nonNullable)) {
     await autoDetectNullSafetyMode(mainUri, compilerOptions);
   }
 
@@ -276,9 +255,6 @@
       useGlobalTypeFlowAnalysis: tfa,
       environmentDefines: environmentDefines,
       enableAsserts: enableAsserts,
-      genBytecode: genBytecode,
-      bytecodeOptions: bytecodeOptions,
-      dropAST: dropAST && !splitOutputByPackages,
       useProtobufTreeShaker: useProtobufTreeShaker,
       useProtobufTreeShakerV2: useProtobufTreeShakerV2,
       minimalKernel: minimalKernel,
@@ -291,20 +267,12 @@
     return compileTimeErrorExitCode;
   }
 
-  if (bytecodeOptions.showBytecodeSizeStatistics && !splitOutputByPackages) {
-    BytecodeSizeStatistics.reset();
-  }
-
   final IOSink sink = new File(outputFileName).openWrite();
   final BinaryPrinter printer = new BinaryPrinter(sink,
       libraryFilter: (lib) => !results.loadedLibraries.contains(lib));
   printer.writeComponentFile(results.component);
   await sink.close();
 
-  if (bytecodeOptions.showBytecodeSizeStatistics && !splitOutputByPackages) {
-    BytecodeSizeStatistics.dump();
-  }
-
   if (depfile != null) {
     await writeDepfile(
         fileSystem, results.compiledSources, outputFileName, depfile);
@@ -316,9 +284,6 @@
       compilerOptions,
       results,
       outputFileName,
-      genBytecode: genBytecode,
-      bytecodeOptions: bytecodeOptions,
-      dropAST: dropAST,
     );
   }
 
@@ -357,9 +322,6 @@
     bool useGlobalTypeFlowAnalysis: false,
     Map<String, String> environmentDefines,
     bool enableAsserts: true,
-    bool genBytecode: false,
-    BytecodeOptions bytecodeOptions,
-    bool dropAST: false,
     bool useProtobufTreeShaker: false,
     bool useProtobufTreeShakerV2: false,
     bool minimalKernel: false,
@@ -411,26 +373,6 @@
     }
   }
 
-  if (genBytecode && !errorDetector.hasCompilationErrors && component != null) {
-    List<Library> libraries = new List<Library>();
-    for (Library library in component.libraries) {
-      if (loadedLibraries.contains(library)) continue;
-      libraries.add(library);
-    }
-
-    await runWithFrontEndCompilerContext(source, options, component, () {
-      generateBytecode(component,
-          libraries: libraries,
-          hierarchy: compilerResult.classHierarchy,
-          coreTypes: compilerResult.coreTypes,
-          options: bytecodeOptions);
-    });
-
-    if (dropAST) {
-      component = createFreshComponentWithBytecode(component);
-    }
-  }
-
   // Restore error handler (in case 'options' are reused).
   options.onDiagnostic = errorDetector.previousErrorHandler;
 
@@ -683,21 +625,8 @@
 /// Write a separate kernel binary for each package. The name of the
 /// output kernel binary is '[outputFileName]-$package.dilp'.
 /// The list of package names is written into a file '[outputFileName]-packages'.
-///
-/// Generates bytecode for each package if requested.
-Future writeOutputSplitByPackages(
-  Uri source,
-  CompilerOptions compilerOptions,
-  KernelCompilationResults compilationResults,
-  String outputFileName, {
-  bool genBytecode: false,
-  BytecodeOptions bytecodeOptions,
-  bool dropAST: false,
-}) async {
-  if (bytecodeOptions.showBytecodeSizeStatistics) {
-    BytecodeSizeStatistics.reset();
-  }
-
+Future writeOutputSplitByPackages(Uri source, CompilerOptions compilerOptions,
+    KernelCompilationResults compilationResults, String outputFileName) async {
   final packages = new List<String>();
   await runWithFrontEndCompilerContext(
       source, compilerOptions, compilationResults.component, () async {
@@ -710,17 +639,6 @@
       final IOSink sink = new File(filename).openWrite();
 
       Component partComponent = compilationResults.component;
-      if (genBytecode) {
-        generateBytecode(partComponent,
-            options: bytecodeOptions,
-            libraries: libraries,
-            hierarchy: compilationResults.classHierarchy,
-            coreTypes: compilationResults.coreTypes);
-
-        if (dropAST) {
-          partComponent = createFreshComponentWithBytecode(partComponent);
-        }
-      }
 
       final BinaryPrinter printer = new BinaryPrinter(sink,
           libraryFilter: (lib) =>
@@ -731,10 +649,6 @@
     }, mainFirst: false);
   });
 
-  if (bytecodeOptions.showBytecodeSizeStatistics) {
-    BytecodeSizeStatistics.dump();
-  }
-
   final IOSink packagesList = new File('$outputFileName-packages').openWrite();
   for (String package in packages) {
     packagesList.writeln(package);
diff --git a/pkg/vm/lib/metadata/binary_cache.dart b/pkg/vm/lib/metadata/binary_cache.dart
deleted file mode 100644
index e2151ef..0000000
--- a/pkg/vm/lib/metadata/binary_cache.dart
+++ /dev/null
@@ -1,37 +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.
-
-library vm.metadata.binary_cache;
-
-import 'package:kernel/ast.dart'
-    show BinarySink, BinarySource, MetadataRepository, Node, TreeNode;
-
-class BinaryCacheMetadataRepository extends MetadataRepository<List<int>> {
-  static const repositoryTag = 'vm.binary_cache';
-
-  @override
-  String get tag => repositoryTag;
-
-  @override
-  final Map<TreeNode, List<int>> mapping = <TreeNode, List<int>>{};
-
-  @override
-  void writeToBinary(List<int> metadata, Node node, BinarySink sink) {
-    sink.writeByteList(metadata);
-  }
-
-  @override
-  List<int> readFromBinary(Node node, BinarySource source) {
-    List<int> result = source.readByteList();
-    _weakMap[node] = result;
-    return result;
-  }
-
-  static List<int> lookup(Node node) => _weakMap[node];
-  static void insert(Node node, List<int> metadata) {
-    _weakMap[node] = metadata;
-  }
-
-  static final _weakMap = new Expando<List<int>>();
-}
diff --git a/pkg/vm/lib/metadata/bytecode.dart b/pkg/vm/lib/metadata/bytecode.dart
deleted file mode 100644
index fc91879..0000000
--- a/pkg/vm/lib/metadata/bytecode.dart
+++ /dev/null
@@ -1,69 +0,0 @@
-// Copyright (c) 2018, 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.
-
-library vm.metadata.bytecode;
-
-import 'package:kernel/ast.dart'
-    show BinarySink, BinarySource, MetadataRepository, Node, TreeNode;
-import '../bytecode/bytecode_serialization.dart'
-    show BufferedWriter, BufferedReader, LinkWriter, LinkReader;
-import '../bytecode/declarations.dart' show Component;
-
-import 'dart:developer';
-
-class BytecodeMetadata {
-  final Component component;
-
-  BytecodeMetadata(this.component);
-
-  void write(BufferedWriter writer) {
-    Timeline.timeSync("BytecodeMetadata.write", () {
-      component.write(writer);
-    });
-  }
-
-  factory BytecodeMetadata.read(BufferedReader reader) {
-    return Timeline.timeSync("BytecodeMetadata.read", () {
-      return new BytecodeMetadata(new Component.read(reader));
-    });
-  }
-
-  @override
-  String toString() => "\n"
-      "BytecodeMetadata {\n"
-      "$component\n"
-      "}\n";
-}
-
-/// Repository for [BytecodeMetadata].
-class BytecodeMetadataRepository extends MetadataRepository<BytecodeMetadata> {
-  @override
-  final String tag = 'vm.bytecode';
-
-  @override
-  final Map<TreeNode, BytecodeMetadata> mapping =
-      <TreeNode, BytecodeMetadata>{};
-
-  @override
-  void writeToBinary(BytecodeMetadata metadata, Node node, BinarySink sink) {
-    final bytecodeComponent = metadata.component;
-    final linkWriter = new LinkWriter();
-    final writer = new BufferedWriter(
-        bytecodeComponent.version,
-        bytecodeComponent.stringTable,
-        bytecodeComponent.objectTable,
-        linkWriter);
-    metadata.write(writer);
-    writer.writeContentsToBinarySink(sink);
-  }
-
-  @override
-  BytecodeMetadata readFromBinary(Node node, BinarySource source) {
-    final linkReader = new LinkReader();
-    final reader = new BufferedReader(-1, null, null, linkReader, source.bytes,
-        baseOffset: source.currentOffset);
-    final bytecodeComponent = new Component.read(reader);
-    return new BytecodeMetadata(bytecodeComponent);
-  }
-}
diff --git a/pkg/vm/lib/metadata/direct_call.dart b/pkg/vm/lib/metadata/direct_call.dart
index 17eb4e8..b7e8277 100644
--- a/pkg/vm/lib/metadata/direct_call.dart
+++ b/pkg/vm/lib/metadata/direct_call.dart
@@ -13,7 +13,8 @@
   final bool checkReceiverForNull;
 
   DirectCallMetadata(Member target, bool checkReceiverForNull)
-      : this.byReference(getMemberReference(target), checkReceiverForNull);
+      : this.byReference(
+            getMemberReferenceGetter(target), checkReceiverForNull);
 
   DirectCallMetadata.byReference(
       this._targetReference, this.checkReceiverForNull);
@@ -40,7 +41,7 @@
   @override
   void writeToBinary(DirectCallMetadata metadata, Node node, BinarySink sink) {
     sink.writeNullAllowedCanonicalNameReference(
-        getCanonicalNameOfMember(metadata.target));
+        getCanonicalNameOfMemberGetter(metadata.target));
     sink.writeByte(metadata.checkReceiverForNull ? 1 : 0);
   }
 
diff --git a/pkg/vm/lib/metadata/procedure_attributes.dart b/pkg/vm/lib/metadata/procedure_attributes.dart
index 99a0023..d6840f2 100644
--- a/pkg/vm/lib/metadata/procedure_attributes.dart
+++ b/pkg/vm/lib/metadata/procedure_attributes.dart
@@ -122,13 +122,4 @@
         methodOrSetterSelectorId: methodOrSetterSelectorId,
         getterSelectorId: getterSelectorId);
   }
-
-  /// Converts [metadata] into a bytecode attribute.
-  Constant getBytecodeAttribute(ProcedureAttributesMetadata metadata) {
-    return ListConstant(const DynamicType(), [
-      IntConstant(_getFlags(metadata)),
-      IntConstant(metadata.methodOrSetterSelectorId),
-      IntConstant(metadata.getterSelectorId),
-    ]);
-  }
 }
diff --git a/pkg/vm/lib/target/vm.dart b/pkg/vm/lib/target/vm.dart
index 59a24ab..97cf03a 100644
--- a/pkg/vm/lib/target/vm.dart
+++ b/pkg/vm/lib/target/vm.dart
@@ -20,7 +20,6 @@
 import 'package:kernel/vm/constants_native_effects.dart'
     show VmConstantsBackend;
 
-import '../metadata/binary_cache.dart' show BinaryCacheMetadataRepository;
 import '../transformations/call_site_annotator.dart' as callSiteAnnotator;
 import '../transformations/lowering.dart' as lowering show transformLibraries;
 import '../transformations/ffi.dart' as transformFfi show ReplacedMembers;
@@ -133,8 +132,6 @@
         // need to index dart:collection, as it is only needed for desugaring of
         // const sets. We can remove it from this list at that time.
         "dart:collection",
-        // The bytecode pipeline uses the index to check if dart:ffi is used.
-        "dart:ffi",
         // TODO(askesc): This is for the VM host endian optimization, which
         // could possibly be done more cleanly after the VM no longer supports
         // doing constant evaluation on its own. See http://dartbug.com/32836
@@ -400,7 +397,6 @@
   @override
   Component configureComponent(Component component) {
     callSiteAnnotator.addRepositoryTo(component);
-    component.addMetadataRepository(new BinaryCacheMetadataRepository());
     return super.configureComponent(component);
   }
 
diff --git a/pkg/vm/lib/transformations/ffi.dart b/pkg/vm/lib/transformations/ffi.dart
index 716ba06..2752c23 100644
--- a/pkg/vm/lib/transformations/ffi.dart
+++ b/pkg/vm/lib/transformations/ffi.dart
@@ -192,6 +192,7 @@
   final Class intClass;
   final Class doubleClass;
   final Class listClass;
+  final Class typeClass;
   final Class pragmaClass;
   final Field pragmaName;
   final Field pragmaOptions;
@@ -233,6 +234,7 @@
         intClass = coreTypes.intClass,
         doubleClass = coreTypes.doubleClass,
         listClass = coreTypes.listClass,
+        typeClass = coreTypes.typeClass,
         pragmaClass = coreTypes.pragmaClass,
         pragmaName = coreTypes.pragmaName,
         pragmaOptions = coreTypes.pragmaOptions,
diff --git a/pkg/vm/lib/transformations/ffi_definitions.dart b/pkg/vm/lib/transformations/ffi_definitions.dart
index 13498bc..4f96426 100644
--- a/pkg/vm/lib/transformations/ffi_definitions.dart
+++ b/pkg/vm/lib/transformations/ffi_definitions.dart
@@ -227,9 +227,9 @@
             f.fileUri);
       } else {
         final DartType nativeType = InterfaceType(
-            nativeTypesClasses[nativeTypeAnnos.first.index],
+            nativeTypesClasses[_getFieldType(nativeTypeAnnos.first).index],
             Nullability.legacy);
-        // TODO(36730): Support structs inside structs.
+        // TODO(dartbug.com/37271): Support structs inside structs.
         final DartType shouldBeDartType = convertNativeTypeToDartType(
             nativeType, /*allowStructs=*/ false, /*allowHandle=*/ false);
         if (shouldBeDartType == null ||
@@ -286,7 +286,7 @@
       ..fileOffset = node.fileOffset
       ..isNonNullableByDefault = node.enclosingLibrary.isNonNullableByDefault;
     _makeEntryPoint(ctor);
-    node.addMember(ctor);
+    node.addConstructor(ctor);
   }
 
   /// Computes the field offsets (for all ABIs) in the struct and replaces the
@@ -294,6 +294,7 @@
   ///
   /// Returns the total size of the struct (for all ABIs).
   Map<Abi, int> _replaceFields(Class node, IndexedClass indexedClass) {
+    final classes = <Class>[];
     final types = <NativeType>[];
     final fields = <int, Field>{};
     final getters = <int, Procedure>{};
@@ -304,18 +305,22 @@
       final dartType = _structFieldMemberType(m);
 
       NativeType nativeType;
+      Class clazz;
       if (_isPointerType(dartType)) {
         nativeType = NativeType.kPointer;
+        clazz = pointerClass;
       } else {
         final nativeTypeAnnos = _getNativeTypeAnnotations(m).toList();
         if (nativeTypeAnnos.length == 1) {
-          nativeType = nativeTypeAnnos.first;
+          clazz = nativeTypeAnnos.first;
+          nativeType = _getFieldType(clazz);
         }
       }
 
       if ((m is Field || (m is Procedure && m.isGetter)) &&
           nativeType != null) {
         types.add(nativeType);
+        classes.add(clazz);
         if (m is Field) {
           fields[i] = m;
         }
@@ -332,6 +337,8 @@
       }
     }
 
+    _annoteStructWithFields(node, classes);
+
     final sizeAndOffsets = <Abi, SizeAndOffsets>{};
     for (final Abi abi in Abi.values) {
       sizeAndOffsets[abi] = _calculateSizeAndOffsets(types, abi);
@@ -342,7 +349,7 @@
           .map((Abi abi, SizeAndOffsets v) => MapEntry(abi, v.offsets[i]));
       final methods = _generateMethodsForField(
           fields[i], types[i], fieldOffsets, indexedClass);
-      methods.forEach((p) => node.addMember(p));
+      methods.forEach((p) => node.addProcedure(p));
     }
 
     for (final Field f in fields.values) {
@@ -377,6 +384,29 @@
     return sizeAndOffsets.map((k, v) => MapEntry(k, v.size));
   }
 
+  void _annoteStructWithFields(Class node, List<Class> fieldTypes) {
+    final types = fieldTypes.map((Class c) {
+      List<DartType> typeArg = const [];
+      if (c == pointerClass) {
+        typeArg = [
+          InterfaceType(pointerClass.superclass, Nullability.nonNullable)
+        ];
+      }
+      return TypeLiteralConstant(
+          InterfaceType(c, Nullability.nonNullable, typeArg));
+    }).toList();
+
+    node.addAnnotation(ConstantExpression(
+        InstanceConstant(pragmaClass.reference, [], {
+          pragmaName.getterReference: StringConstant("vm:ffi:struct-fields"),
+          // TODO(dartbug.com/38158): Wrap list in class to be able to encode
+          // more information when needed.
+          pragmaOptions.getterReference: ListConstant(
+              InterfaceType(typeClass, Nullability.nonNullable), types)
+        }),
+        InterfaceType(pragmaClass, Nullability.nonNullable, [])));
+  }
+
   /// Expression that queries VM internals at runtime to figure out on which ABI
   /// we are.
   Expression _runtimeBranchOnLayout(Map<Abi, int> values) {
@@ -498,16 +528,18 @@
   void _replaceSizeOfMethod(
       Class struct, Map<Abi, int> sizes, IndexedClass indexedClass) {
     var name = Name("#sizeOf");
+    var lookupField = indexedClass?.lookupField(name.text);
     final Field sizeOf = Field(name,
         isStatic: true,
         isFinal: true,
         initializer: _runtimeBranchOnLayout(sizes),
         type: InterfaceType(intClass, Nullability.legacy),
         fileUri: struct.fileUri,
-        reference: indexedClass?.lookupField(name.text)?.reference)
+        getterReference: lookupField?.getterReference,
+        setterReference: lookupField?.setterReference)
       ..fileOffset = struct.fileOffset;
     _makeEntryPoint(sizeOf);
-    struct.addMember(sizeOf);
+    struct.addField(sizeOf);
   }
 
   int _sizeInBytes(NativeType type, Abi abi) {
@@ -555,8 +587,8 @@
   void _makeEntryPoint(Annotatable node) {
     node.addAnnotation(ConstantExpression(
         InstanceConstant(pragmaClass.reference, [], {
-          pragmaName.reference: StringConstant("vm:entry-point"),
-          pragmaOptions.reference: NullConstant()
+          pragmaName.getterReference: StringConstant("vm:entry-point"),
+          pragmaOptions.getterReference: NullConstant()
         }),
         InterfaceType(pragmaClass, Nullability.legacy, [])));
   }
@@ -571,14 +603,13 @@
     return fieldType;
   }
 
-  Iterable<NativeType> _getNativeTypeAnnotations(Member node) {
+  Iterable<Class> _getNativeTypeAnnotations(Member node) {
     return node.annotations
         .whereType<ConstantExpression>()
         .map((expr) => expr.constant)
         .whereType<InstanceConstant>()
         .map((constant) => constant.classNode)
-        .map((klass) => _getFieldType(klass))
-        .where((type) => type != null);
+        .where((klass) => _getFieldType(klass) != null);
   }
 }
 
diff --git a/pkg/vm/lib/transformations/ffi_use_sites.dart b/pkg/vm/lib/transformations/ffi_use_sites.dart
index e198b10..16e31c7 100644
--- a/pkg/vm/lib/transformations/ffi_use_sites.dart
+++ b/pkg/vm/lib/transformations/ffi_use_sites.dart
@@ -171,17 +171,18 @@
             nativeFunctionClass, Nullability.legacy, [node.arguments.types[0]]);
         final DartType dartType = node.arguments.types[1];
 
-        _ensureNativeTypeValid(nativeType, node);
-        _ensureNativeTypeToDartType(nativeType, dartType, node);
-
+        _ensureNativeTypeValid(nativeType, node, allowStructs: false);
+        _ensureNativeTypeToDartType(nativeType, dartType, node,
+            allowStructs: false);
         return _replaceLookupFunction(node);
       } else if (target == asFunctionMethod) {
         final DartType dartType = node.arguments.types[1];
         final DartType nativeType = InterfaceType(
             nativeFunctionClass, Nullability.legacy, [node.arguments.types[0]]);
 
-        _ensureNativeTypeValid(nativeType, node);
-        _ensureNativeTypeToDartType(nativeType, dartType, node);
+        _ensureNativeTypeValid(nativeType, node, allowStructs: false);
+        _ensureNativeTypeToDartType(nativeType, dartType, node,
+            allowStructs: false);
 
         final DartType nativeSignature =
             (nativeType as InterfaceType).typeArguments[0];
@@ -198,20 +199,22 @@
 
         _ensureIsStaticFunction(func);
 
-        // TODO(36730): Allow passing/returning structs by value.
-        _ensureNativeTypeValid(nativeType, node);
-        _ensureNativeTypeToDartType(nativeType, dartType, node);
+        _ensureNativeTypeValid(nativeType, node, allowStructs: false);
+        _ensureNativeTypeToDartType(nativeType, dartType, node,
+            allowStructs: false);
 
         // Check `exceptionalReturn`'s type.
         final FunctionType funcType = dartType;
-        final NativeType expectedReturn = getType(
+        final Class expectedReturnClass =
             ((node.arguments.types[0] as FunctionType).returnType
                     as InterfaceType)
-                .classNode);
+                .classNode;
+        final NativeType expectedReturn = getType(expectedReturnClass);
 
         if (expectedReturn == NativeType.kVoid ||
             expectedReturn == NativeType.kPointer ||
-            expectedReturn == NativeType.kHandle) {
+            expectedReturn == NativeType.kHandle ||
+            expectedReturnClass.superclass == structClass) {
           if (node.arguments.positional.length > 1) {
             diagnosticReporter.report(
                 templateFfiExpectedNoExceptionalReturn.withArguments(
@@ -329,6 +332,7 @@
     final nativeFunctionType = InterfaceType(
         nativeFunctionClass, Nullability.legacy, node.arguments.types);
     var name = Name("_#ffiCallback${callbackCount++}", currentLibrary);
+    var lookupField = currentLibraryIndex?.lookupField(name.text);
     final Field field = Field(name,
         type: InterfaceType(
             pointerClass, Nullability.legacy, [nativeFunctionType]),
@@ -342,9 +346,10 @@
         isStatic: true,
         isFinal: true,
         fileUri: currentLibrary.fileUri,
-        reference: currentLibraryIndex?.lookupField(name.text)?.reference)
+        getterReference: lookupField?.getterReference,
+        setterReference: lookupField?.setterReference)
       ..fileOffset = node.fileOffset;
-    currentLibrary.addMember(field);
+    currentLibrary.addField(field);
     return StaticGet(field);
   }
 
diff --git a/pkg/vm/lib/transformations/pragma.dart b/pkg/vm/lib/transformations/pragma.dart
index b12e44e..ce3055b 100644
--- a/pkg/vm/lib/transformations/pragma.dart
+++ b/pkg/vm/lib/transformations/pragma.dart
@@ -66,7 +66,8 @@
     if (pragmaConstant == null) return null;
 
     String pragmaName;
-    Constant name = pragmaConstant.fieldValues[coreTypes.pragmaName.reference];
+    Constant name =
+        pragmaConstant.fieldValues[coreTypes.pragmaName.getterReference];
     if (name is StringConstant) {
       pragmaName = name.value;
     } else {
@@ -74,7 +75,7 @@
     }
 
     Constant options =
-        pragmaConstant.fieldValues[coreTypes.pragmaOptions.reference];
+        pragmaConstant.fieldValues[coreTypes.pragmaOptions.getterReference];
     assert(options != null);
 
     switch (pragmaName) {
diff --git a/pkg/vm/lib/transformations/protobuf_aware_treeshaker/transformer.dart b/pkg/vm/lib/transformations/protobuf_aware_treeshaker/transformer.dart
index 7aad1d8..245d77d 100644
--- a/pkg/vm/lib/transformations/protobuf_aware_treeshaker/transformer.dart
+++ b/pkg/vm/lib/transformations/protobuf_aware_treeshaker/transformer.dart
@@ -126,7 +126,7 @@
       this.addMethod, Set<Selector> dynamicSelectors, this.coreTypes, this.info)
       : tagNumberField = tagNumberClass.fields
             .firstWhere((f) => f.name.text == 'tagNumber')
-            .reference {
+            .getterReference {
     dynamicNames.addAll(dynamicSelectors.map((sel) => sel.target.text));
   }
 
@@ -243,9 +243,7 @@
               NullLiteral(), // valueOf
               NullLiteral(), // enumValues
             ],
-            types: <DartType>[
-              InterfaceType(coreTypes.nullClass, Nullability.nullable)
-            ],
+            types: <DartType>[const NullType()],
           ),
         );
       }
diff --git a/pkg/vm/lib/transformations/type_flow/analysis.dart b/pkg/vm/lib/transformations/type_flow/analysis.dart
index bad218c..36da3b6 100644
--- a/pkg/vm/lib/transformations/type_flow/analysis.dart
+++ b/pkg/vm/lib/transformations/type_flow/analysis.dart
@@ -529,7 +529,8 @@
   // TODO(alexmarkov): Consider caching targets for Null type.
   void _collectTargetsForNull(Map<Member, _ReceiverTypeBuilder> targets,
       TypeFlowAnalysis typeFlowAnalysis) {
-    Class nullClass = typeFlowAnalysis.environment.coreTypes.nullClass;
+    Class nullClass =
+        typeFlowAnalysis.environment.coreTypes.deprecatedNullClass;
 
     Member target = typeFlowAnalysis.hierarchyCache.hierarchy
         .getDispatchTarget(nullClass, selector.name, setter: selector.isSetter);
@@ -1535,14 +1536,13 @@
 
   Args<Type> argumentTypes(Member member) => _summaries[member]?.argumentTypes;
 
+  Type argumentType(Member member, VariableDeclaration memberParam) {
+    return _summaries[member]?.argumentType(member, memberParam);
+  }
+
   List<VariableDeclaration> uncheckedParameters(Member member) =>
       _summaries[member]?.uncheckedParameters;
 
-  // The set of optional and named parameters to this procedure which
-  // are passed at all call-sites.
-  Set<String> alwaysPassedOptionalParameters(Member member) =>
-      _summaries[member]?.alwaysPassedOptionalParameters() ?? const {};
-
   bool isTearOffTaken(Member member) => _tearOffTaken.contains(member);
 
   /// Returns true if this member is called on a receiver with static type
@@ -1565,6 +1565,12 @@
       _methodsAndSettersCalledDynamically.contains(member) ||
       _calledViaInterfaceSelector.contains(member);
 
+  /// Update the summary parameters to reflect a signature change with moved
+  /// and/or removed parameters.
+  void adjustFunctionParameters(Member member) {
+    _summaries[member]?.adjustFunctionParameters(member);
+  }
+
   /// ---- Implementation of [CallHandler] interface. ----
 
   @override
@@ -1648,4 +1654,9 @@
   void recordMemberCalledViaThis(Member target) {
     _calledViaThis.add(target);
   }
+
+  @override
+  void recordTearOff(Procedure target) {
+    _tearOffTaken.add(target);
+  }
 }
diff --git a/pkg/vm/lib/transformations/type_flow/calls.dart b/pkg/vm/lib/transformations/type_flow/calls.dart
index cdd0d0a..f935383 100644
--- a/pkg/vm/lib/transformations/type_flow/calls.dart
+++ b/pkg/vm/lib/transformations/type_flow/calls.dart
@@ -187,20 +187,15 @@
   final List<T> values;
   final List<String> names;
 
-  // Whether it is not known which optional arguments are passed or not.
-  final bool unknownArity;
-
   int _hashCode;
 
-  Args(this.values,
-      {this.names = const <String>[], this.unknownArity = false}) {
+  Args(this.values, {this.names = const <String>[]}) {
     assert(isSorted(names));
   }
 
   Args.withReceiver(Args<T> args, T receiver)
       : values = new List.from(args.values),
-        names = args.names,
-        unknownArity = args.unknownArity {
+        names = args.names {
     values[0] = receiver;
   }
 
@@ -220,7 +215,6 @@
     for (var n in names) {
       hash = (((hash * 31) & kHashMask) + n.hashCode) & kHashMask;
     }
-    if (unknownArity) hash ^= -1;
     return hash;
   }
 
@@ -240,7 +234,7 @@
           return false;
         }
       }
-      return unknownArity == other.unknownArity;
+      return true;
     }
     return false;
   }
@@ -263,11 +257,7 @@
       buf.write(': ');
       buf.write(values[positionalCount + i]);
     }
-    if (unknownArity) {
-      buf.write(", <unknown arity>)");
-    } else {
-      buf.write(")");
-    }
+    buf.write(")");
     return buf.toString();
   }
 }
diff --git a/pkg/vm/lib/transformations/type_flow/native_code.dart b/pkg/vm/lib/transformations/type_flow/native_code.dart
index 0d00188..ba8a56d 100644
--- a/pkg/vm/lib/transformations/type_flow/native_code.dart
+++ b/pkg/vm/lib/transformations/type_flow/native_code.dart
@@ -32,6 +32,9 @@
 
   /// Record the fact that given member is called from this.
   void recordMemberCalledViaThis(Member target);
+
+  /// Record the fact that given method is torn off.
+  void recordTearOff(Procedure target) {}
 }
 
 class PragmaEntryPointsVisitor extends RecursiveVisitor {
diff --git a/pkg/vm/lib/transformations/type_flow/protobuf_handler.dart b/pkg/vm/lib/transformations/type_flow/protobuf_handler.dart
index 003bb2f..7643e45 100644
--- a/pkg/vm/lib/transformations/type_flow/protobuf_handler.dart
+++ b/pkg/vm/lib/transformations/type_flow/protobuf_handler.dart
@@ -103,9 +103,9 @@
         final constant = (annotation as ConstantExpression).constant;
         if (constant is InstanceConstant &&
             constant.classReference == _tagNumberClass.reference) {
-          if (messageClass._usedTags.add(
-              (constant.fieldValues[_tagNumberField.reference] as IntConstant)
-                  .value)) {
+          if (messageClass._usedTags.add((constant
+                  .fieldValues[_tagNumberField.getterReference] as IntConstant)
+              .value)) {
             _invalidatedClasses.add(messageClass);
           }
         }
@@ -192,7 +192,7 @@
             NullLiteral(), // valueOf
             NullLiteral(), // enumValues
           ],
-          types: <DartType>[ph.coreTypes.nullType],
+          types: <DartType>[const NullType()],
         ),
         ph._builderInfoAddMethod)
       ..fileOffset = node.fileOffset;
diff --git a/pkg/vm/lib/transformations/type_flow/signature_shaking.dart b/pkg/vm/lib/transformations/type_flow/signature_shaking.dart
new file mode 100644
index 0000000..e1a947c
--- /dev/null
+++ b/pkg/vm/lib/transformations/type_flow/signature_shaking.dart
@@ -0,0 +1,523 @@
+// Copyright (c) 2020, 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:kernel/ast.dart';
+import 'package:kernel/external_name.dart';
+import 'package:kernel/type_environment.dart';
+
+import 'analysis.dart';
+import 'table_selector_assigner.dart';
+import 'types.dart';
+import 'utils.dart';
+import '../../metadata/procedure_attributes.dart';
+
+/// Transform parameters from optional to required when they are always passed,
+/// and remove parameters which are never passed or never used.
+///
+/// Signatures of static functions are considered on their own. Instance methods
+/// are grouped by table selector ID and thus can cover several implementations.
+///
+/// Definitions:
+/// - A parameter is used if it is mentioned in the body (or, for constructors,
+///   an initializer) of any implementation.
+/// - A parameter can be eliminated if either:
+///   1. it is not used; or
+///   2. it is never passed and is not written to in any implementation.
+/// - A function is eligible if it is not external and is guaranteed to not be
+///   called with an unknown call signature.
+///
+/// All eligible signatures are transformed such that they contain, in order:
+/// 1. All used positional parameters that are always passed, as required
+///    positional parameters.
+/// 2. All used named parameters that are always passed, as required positional
+///    parameters, alphabetically by name.
+/// 3. All used positional parameters that are not always passed and can't be
+///    eliminated, as positional parameters, each one required iff it was
+///    originally required.
+/// 4. All used named parameters that are not always passed and can't be
+///    eliminated, as named parameters in alphabetical order.
+class SignatureShaker {
+  final TypeFlowAnalysis typeFlowAnalysis;
+  final TableSelectorAssigner tableSelectorAssigner;
+
+  final Map<Member, _ProcedureInfo> _memberInfo = {};
+  final Map<int, _ProcedureInfo> _selectorInfo = {};
+
+  SignatureShaker(this.typeFlowAnalysis, this.tableSelectorAssigner);
+
+  _ProcedureInfo _infoForMember(Member member) {
+    if (!(member is Procedure &&
+            (member.kind == ProcedureKind.Method ||
+                member.kind == ProcedureKind.Factory) ||
+        member is Constructor)) {
+      return null;
+    }
+    if (member.isInstanceMember) {
+      final selectorId = tableSelectorAssigner.methodOrSetterSelectorId(member);
+      assert(selectorId != ProcedureAttributesMetadata.kInvalidSelectorId);
+      return _selectorInfo.putIfAbsent(selectorId, () => _ProcedureInfo());
+    } else {
+      return _memberInfo.putIfAbsent(member, () => _ProcedureInfo());
+    }
+  }
+
+  void transformComponent(Component component) {
+    _Collect(this).visitComponent(component);
+    _Transform(this).visitComponent(component);
+  }
+}
+
+class _ProcedureInfo {
+  final List<_ParameterInfo> positional = [];
+  final Map<String, _ParameterInfo> named = {};
+  int callCount = 0;
+  bool eligible = true;
+
+  _ParameterInfo ensurePositional(int i) {
+    if (positional.length <= i) {
+      assert(positional.length == i);
+      positional.add(_ParameterInfo(this, i));
+    }
+    return positional[i];
+  }
+
+  _ParameterInfo ensureNamed(String name) {
+    return named.putIfAbsent(name, () => _ParameterInfo(this, null));
+  }
+
+  bool transformNeeded(FunctionNode function) {
+    return positional.any((param) =>
+            param.canBeEliminated ||
+            (param.isAlwaysPassed &&
+                param.index >= function.requiredParameterCount)) ||
+        named.values
+            .any((param) => param.canBeEliminated || param.isAlwaysPassed);
+  }
+}
+
+class _ParameterInfo {
+  final _ProcedureInfo info;
+  final int index;
+
+  int passCount = 0;
+  bool isRead = false;
+  bool isWritten = false;
+
+  _ParameterInfo(this.info, this.index);
+
+  bool get isNamed => index == null;
+
+  bool get isUsed => isRead || isWritten;
+
+  bool get isAlwaysPassed => passCount == info.callCount;
+
+  bool get isNeverPassed => passCount == 0;
+
+  bool get canBeEliminated => !isUsed || isNeverPassed && !isWritten;
+
+  void observeImplicitChecks(
+      Member member, VariableDeclaration param, SignatureShaker shaker) {
+    if (param.isCovariant || param.isGenericCovariantImpl) {
+      // Covariant parameters have implicit type checks, which count as reads.
+      isRead = true;
+    } else if (param.type.nullability == Nullability.nonNullable) {
+      // When run in weak mode with null assertions enabled, parameters with
+      // non-nullable types have implicit null checks, which count as reads.
+      Type type = shaker.typeFlowAnalysis.argumentType(member, param);
+      if (type == null || type is NullableType) {
+        // TFA can't guarantee that the value isn't null. Preserve check.
+        isRead = true;
+      }
+    }
+  }
+}
+
+class _Collect extends RecursiveVisitor<void> {
+  final SignatureShaker shaker;
+
+  final Map<VariableDeclaration, _ParameterInfo> localParameters = {};
+
+  _Collect(this.shaker);
+
+  void enterFunction(Member member) {
+    final _ProcedureInfo info = shaker._infoForMember(member);
+    if (info == null) return;
+
+    localParameters.clear();
+    final FunctionNode fun = member.function;
+    for (int i = 0; i < fun.positionalParameters.length; i++) {
+      final VariableDeclaration param = fun.positionalParameters[i];
+      localParameters[param] = info.ensurePositional(i)
+        ..observeImplicitChecks(member, param, shaker);
+    }
+    for (VariableDeclaration param in fun.namedParameters) {
+      localParameters[param] = info.ensureNamed(param.name)
+        ..observeImplicitChecks(member, param, shaker);
+    }
+
+    if (shaker.typeFlowAnalysis.isCalledDynamically(member) ||
+        shaker.typeFlowAnalysis.isTearOffTaken(member) ||
+        shaker.typeFlowAnalysis.nativeCodeOracle
+            .isMemberReferencedFromNativeCode(member) ||
+        getExternalName(member) != null) {
+      info.eligible = false;
+    }
+  }
+
+  @override
+  void visitProcedure(Procedure node) {
+    enterFunction(node);
+    super.visitProcedure(node);
+  }
+
+  @override
+  void visitConstructor(Constructor node) {
+    enterFunction(node);
+    super.visitConstructor(node);
+  }
+
+  @override
+  void visitVariableGet(VariableGet node) {
+    localParameters[node.variable]?.isRead = true;
+    super.visitVariableGet(node);
+  }
+
+  @override
+  void visitVariableSet(VariableSet node) {
+    localParameters[node.variable]?.isWritten = true;
+    super.visitVariableSet(node);
+  }
+
+  void collectCall(Member member, Arguments args) {
+    final _ProcedureInfo info = shaker._infoForMember(member);
+    if (info == null) return;
+
+    for (int i = 0; i < args.positional.length; i++) {
+      info.ensurePositional(i).passCount++;
+    }
+    for (NamedExpression named in args.named) {
+      info.ensureNamed(named.name).passCount++;
+    }
+    info.callCount++;
+  }
+
+  @override
+  void visitMethodInvocation(MethodInvocation node) {
+    collectCall(node.interfaceTarget, node.arguments);
+    super.visitMethodInvocation(node);
+  }
+
+  @override
+  void visitSuperMethodInvocation(SuperMethodInvocation node) {
+    collectCall(node.interfaceTarget, node.arguments);
+    super.visitSuperMethodInvocation(node);
+  }
+
+  @override
+  void visitStaticInvocation(StaticInvocation node) {
+    collectCall(node.target, node.arguments);
+    super.visitStaticInvocation(node);
+  }
+
+  @override
+  void visitConstructorInvocation(ConstructorInvocation node) {
+    collectCall(node.target, node.arguments);
+    super.visitConstructorInvocation(node);
+  }
+
+  @override
+  void visitRedirectingInitializer(RedirectingInitializer node) {
+    collectCall(node.target, node.arguments);
+    super.visitRedirectingInitializer(node);
+  }
+
+  @override
+  void visitSuperInitializer(SuperInitializer node) {
+    collectCall(node.target, node.arguments);
+    super.visitSuperInitializer(node);
+  }
+}
+
+class _Transform extends RecursiveVisitor<void> {
+  final SignatureShaker shaker;
+
+  StaticTypeContext typeContext;
+  final Set<VariableDeclaration> eliminatedParams = {};
+  final List<LocalInitializer> addedInitializers = [];
+
+  _Transform(this.shaker);
+
+  void transformMemberSignature(Member member) {
+    typeContext =
+        StaticTypeContext(member, shaker.typeFlowAnalysis.environment);
+    eliminatedParams.clear();
+
+    final _ProcedureInfo info = shaker._infoForMember(member);
+    if (info == null || !info.eligible || info.callCount == 0) return;
+
+    final FunctionNode function = member.function;
+
+    if (!info.transformNeeded(function)) return;
+
+    final List<VariableDeclaration> positional = [];
+    final List<VariableDeclaration> named = [];
+    // 1. All used positional parameters that are always passed, as required
+    //    positional parameters.
+    for (int i = 0; i < function.positionalParameters.length; i++) {
+      final _ParameterInfo param = info.positional[i];
+      if (!param.isAlwaysPassed) break;
+      if (param.isUsed) {
+        final VariableDeclaration variable = function.positionalParameters[i];
+        positional.add(variable);
+        variable.initializer = null;
+      }
+    }
+    // 2. All used named parameters that are always passed, as required
+    //    positional parameters, alphabetically by name.
+    final List<VariableDeclaration> sortedNamed = function.namedParameters
+        .toList()
+          ..sort((var1, var2) => var1.name.compareTo(var2.name));
+    for (VariableDeclaration variable in sortedNamed) {
+      final _ParameterInfo param = info.named[variable.name];
+      if (param.isUsed && param.isAlwaysPassed) {
+        variable.initializer = null;
+        variable.isRequired = false;
+        positional.add(variable);
+      }
+    }
+    int requiredParameterCount = positional.length;
+    // 3. All used positional parameters that are not always passed and can't be
+    //    eliminated, as positional parameters, each one required iff it was
+    //    originally required.
+    for (int i = 0; i < function.positionalParameters.length; i++) {
+      final _ParameterInfo param = info.positional[i];
+      if (param.isUsed) {
+        final VariableDeclaration variable = function.positionalParameters[i];
+        if (param.canBeEliminated) {
+          assert(variable.initializer == null ||
+              variable.initializer is ConstantExpression);
+          eliminatedParams.add(variable);
+        } else if (!param.isAlwaysPassed) {
+          positional.add(variable);
+          if (i < function.requiredParameterCount) {
+            // The parameter is required, but it is not always passed. This is
+            // possible if the method is overridden by a method which makes the
+            // parameter optional.
+            assert(variable.initializer == null);
+            requiredParameterCount++;
+          }
+        }
+      }
+    }
+    // 4. All used named parameters that are not always passed and can't be
+    //    eliminated, as named parameters in alphabetical order.
+    for (VariableDeclaration variable in sortedNamed) {
+      final _ParameterInfo param = info.named[variable.name];
+      if (param.isUsed) {
+        if (param.canBeEliminated) {
+          assert(variable.initializer == null ||
+              variable.initializer is ConstantExpression);
+          eliminatedParams.add(variable);
+        } else if (!param.isAlwaysPassed) {
+          named.add(variable);
+        }
+      }
+    }
+
+    assert(requiredParameterCount <= positional.length);
+    function.requiredParameterCount = requiredParameterCount;
+    function.positionalParameters = positional;
+    function.namedParameters = named;
+
+    shaker.typeFlowAnalysis.adjustFunctionParameters(member);
+  }
+
+  @override
+  void visitVariableGet(VariableGet node) {
+    if (eliminatedParams.contains(node.variable)) {
+      final ConstantExpression initializer = node.variable.initializer;
+      node.replaceWith(
+          ConstantExpression(initializer?.constant ?? NullConstant()));
+    }
+  }
+
+  @override
+  void visitConstructor(Constructor node) {
+    transformMemberSignature(node);
+    super.visitConstructor(node);
+    if (addedInitializers.isNotEmpty) {
+      // Insert hoisted constructor arguments before this/super initializer.
+      assert(node.initializers.last is RedirectingInitializer ||
+          node.initializers.last is SuperInitializer);
+      node.initializers
+          .insertAll(node.initializers.length - 1, addedInitializers.reversed);
+      addedInitializers.clear();
+    }
+  }
+
+  @override
+  void visitProcedure(Procedure node) {
+    transformMemberSignature(node);
+    super.visitProcedure(node);
+  }
+
+  static void forEachArgumentRev(Arguments args, _ProcedureInfo info,
+      void Function(Expression, _ParameterInfo) fun) {
+    for (int i = args.named.length - 1; i >= 0; i--) {
+      final NamedExpression namedExp = args.named[i];
+      fun(namedExp.value, info.named[namedExp.name]);
+    }
+    for (int i = args.positional.length - 1; i >= 0; i--) {
+      fun(args.positional[i], info.positional[i]);
+    }
+  }
+
+  void transformCall(
+      Member target, TreeNode call, Expression receiver, Arguments args) {
+    final _ProcedureInfo info = shaker._infoForMember(target);
+    if (info == null || !info.eligible) return;
+
+    bool transformNeeded = false;
+    bool hoistingNeeded = false;
+    forEachArgumentRev(args, info, (Expression arg, _ParameterInfo param) {
+      assert(!param.isNeverPassed);
+      if (!param.isUsed || param.isNamed && param.isAlwaysPassed) {
+        transformNeeded = true;
+        if (mayHaveSideEffects(arg)) {
+          hoistingNeeded = true;
+        }
+      }
+    });
+
+    if (!transformNeeded) return;
+
+    Map<Expression, VariableDeclaration> hoisted = {};
+    if (hoistingNeeded) {
+      if (call is Initializer) {
+        final Constructor constructor = call.parent;
+        forEachArgumentRev(args, info, (Expression arg, _ParameterInfo param) {
+          if (mayHaveOrSeeSideEffects(arg)) {
+            VariableDeclaration argVar = VariableDeclaration(null,
+                initializer: arg,
+                type: arg.getStaticType(typeContext),
+                isFinal: true);
+            addedInitializers
+                .add(LocalInitializer(argVar)..parent = constructor);
+            hoisted[arg] = argVar;
+          }
+        });
+      } else {
+        final TreeNode parent = call.parent;
+        Expression current = call;
+        forEachArgumentRev(args, info, (Expression arg, _ParameterInfo param) {
+          if (mayHaveOrSeeSideEffects(arg)) {
+            VariableDeclaration argVar = VariableDeclaration(null,
+                initializer: arg,
+                type: arg.getStaticType(typeContext),
+                isFinal: true);
+            current = Let(argVar, current);
+            hoisted[arg] = argVar;
+          }
+        });
+        if (receiver != null && mayHaveOrSeeSideEffects(receiver)) {
+          assert(receiver.parent == call);
+          final VariableDeclaration receiverVar = VariableDeclaration(null,
+              initializer: receiver,
+              type: receiver.getStaticType(typeContext),
+              isFinal: true);
+          current = Let(receiverVar, current);
+          call.replaceChild(receiver, VariableGet(receiverVar));
+        }
+
+        parent.replaceChild(call, current);
+      }
+    }
+
+    Expression getMaybeHoistedArg(Expression arg) {
+      final variable = hoisted[arg];
+      if (variable == null) return arg;
+      return VariableGet(variable);
+    }
+
+    final List<Expression> positional = [];
+    final List<NamedExpression> named = [];
+    // 1. All used positional parameters that are always passed, as required
+    //    positional parameters.
+    for (int i = 0; i < args.positional.length; i++) {
+      final _ParameterInfo param = info.positional[i];
+      final Expression arg = args.positional[i];
+      if (param.isUsed && param.isAlwaysPassed) {
+        positional.add(getMaybeHoistedArg(arg));
+      }
+    }
+    // 2. All used named parameters that are always passed, as required
+    //    positional parameters, alphabetically by name.
+    final List<NamedExpression> sortedNamed = args.named.toList()
+      ..sort((var1, var2) => var1.name.compareTo(var2.name));
+    for (NamedExpression arg in sortedNamed) {
+      final _ParameterInfo param = info.named[arg.name];
+      if (param.isUsed && param.isAlwaysPassed) {
+        positional.add(getMaybeHoistedArg(arg.value));
+      }
+    }
+    // 3. All used positional parameters that are not always passed and can't be
+    //    eliminated, as positional parameters, each one required iff it was
+    //    originally required.
+    for (int i = 0; i < args.positional.length; i++) {
+      final _ParameterInfo param = info.positional[i];
+      final Expression arg = args.positional[i];
+      if (param.isUsed && !param.isAlwaysPassed) {
+        positional.add(getMaybeHoistedArg(arg));
+      }
+    }
+    // 4. All used named parameters that are not always passed and can't be
+    //    eliminated, as named parameters in alphabetical order.
+    //    (Arguments are kept in original order.)
+    for (NamedExpression arg in args.named) {
+      final _ParameterInfo param = info.named[arg.name];
+      if (param.isUsed && !param.isAlwaysPassed) {
+        arg.value = getMaybeHoistedArg(arg.value)..parent = arg;
+        named.add(arg);
+      }
+    }
+
+    args.replaceWith(Arguments(positional, named: named, types: args.types));
+  }
+
+  @override
+  void visitMethodInvocation(MethodInvocation node) {
+    super.visitMethodInvocation(node);
+    transformCall(node.interfaceTarget, node, node.receiver, node.arguments);
+  }
+
+  @override
+  void visitSuperMethodInvocation(SuperMethodInvocation node) {
+    super.visitSuperMethodInvocation(node);
+    transformCall(node.interfaceTarget, node, null, node.arguments);
+  }
+
+  @override
+  void visitStaticInvocation(StaticInvocation node) {
+    super.visitStaticInvocation(node);
+    transformCall(node.target, node, null, node.arguments);
+  }
+
+  @override
+  void visitConstructorInvocation(ConstructorInvocation node) {
+    super.visitConstructorInvocation(node);
+    transformCall(node.target, node, null, node.arguments);
+  }
+
+  @override
+  void visitRedirectingInitializer(RedirectingInitializer node) {
+    super.visitRedirectingInitializer(node);
+    transformCall(node.target, node, null, node.arguments);
+  }
+
+  @override
+  void visitSuperInitializer(SuperInitializer node) {
+    super.visitSuperInitializer(node);
+    transformCall(node.target, node, null, node.arguments);
+  }
+}
diff --git a/pkg/vm/lib/transformations/type_flow/summary.dart b/pkg/vm/lib/transformations/type_flow/summary.dart
index ef97516..d529e68 100644
--- a/pkg/vm/lib/transformations/type_flow/summary.dart
+++ b/pkg/vm/lib/transformations/type_flow/summary.dart
@@ -74,9 +74,6 @@
   Type defaultValue;
   Type _argumentType = const EmptyType();
 
-  // Whether this parameter is passed at all call-sites.
-  bool isAlwaysPassed = true;
-
   Parameter(this.name, this.staticTypeForNarrowing);
 
   @override
@@ -108,7 +105,6 @@
   }
 
   Type _observeNotPassed(TypeHierarchy typeHierarchy) {
-    isAlwaysPassed = false;
     final Type argType = defaultValue.specialize(typeHierarchy);
     _observeArgumentType(argType, typeHierarchy);
     return argType;
@@ -590,9 +586,9 @@
 /// Summary is a linear sequence of statements representing a type flow in
 /// one member, function or initializer.
 class Summary {
-  final int parameterCount;
-  final int positionalParameterCount;
-  final int requiredParameterCount;
+  int parameterCount;
+  int positionalParameterCount;
+  int requiredParameterCount;
 
   List<Statement> _statements = <Statement>[];
   TypeExpr result = null;
@@ -643,12 +639,6 @@
 
     List<Type> types = new List<Type>(_statements.length);
 
-    if (arguments.unknownArity) {
-      for (int i = 0; i < parameterCount; ++i) {
-        (_statements[i] as Parameter).isAlwaysPassed = false;
-      }
-    }
-
     for (int i = 0; i < positionalArgCount; i++) {
       final Parameter param = _statements[i] as Parameter;
       if (args[i] is RuntimeType) {
@@ -726,6 +716,26 @@
     return new Args<Type>(argTypes, names: argNames);
   }
 
+  Type argumentType(Member member, VariableDeclaration memberParam) {
+    final int firstParamIndex =
+        numTypeParams(member) + (hasReceiverArg(member) ? 1 : 0);
+    final positional = member.function.positionalParameters;
+    for (int i = 0; i < positional.length; i++) {
+      if (positional[i] == memberParam) {
+        final Parameter param = _statements[firstParamIndex + i] as Parameter;
+        assert(param.name == memberParam.name);
+        return param.argumentType;
+      }
+    }
+    for (int i = positionalParameterCount; i < parameterCount; i++) {
+      final Parameter param = _statements[i] as Parameter;
+      if (param.name == memberParam.name) {
+        return param.argumentType;
+      }
+    }
+    throw "Could not find argument type of parameter ${memberParam.name}";
+  }
+
   List<VariableDeclaration> get uncheckedParameters {
     final params = List<VariableDeclaration>();
     for (Statement statement in _statements) {
@@ -738,14 +748,29 @@
     return params;
   }
 
-  Set<String> alwaysPassedOptionalParameters() {
-    final params = Set<String>();
-    for (int i = requiredParameterCount; i < parameterCount; ++i) {
-      final Parameter p = _statements[i] as Parameter;
-      if (p.isAlwaysPassed) {
-        params.add(p.name);
-      }
+  /// Update the summary parameters to reflect a signature change with moved
+  /// and/or removed parameters.
+  void adjustFunctionParameters(Member member) {
+    // Just keep the parameters part of the summary, assuming that the rest is
+    // not used in later phases. The index values in the statements will be
+    // incorrect, but those are assumed to be not used either.
+    final int implicit =
+        (hasReceiverArg(member) ? 1 : 0) + numTypeParams(member);
+    final Map<String, Parameter> paramsByName = {};
+    for (int i = implicit; i < parameterCount; i++) {
+      final Parameter param = statements[i];
+      paramsByName[param.name] = param;
     }
-    return params;
+    FunctionNode function = member.function;
+    statements.length = implicit;
+    for (VariableDeclaration param in function.positionalParameters) {
+      statements.add(paramsByName[param.name]);
+    }
+    positionalParameterCount = statements.length;
+    for (VariableDeclaration param in function.namedParameters) {
+      statements.add(paramsByName[param.name]);
+    }
+    parameterCount = statements.length;
+    requiredParameterCount = implicit + function.requiredParameterCount;
   }
 }
diff --git a/pkg/vm/lib/transformations/type_flow/summary_collector.dart b/pkg/vm/lib/transformations/type_flow/summary_collector.dart
index b545936..68162e7 100644
--- a/pkg/vm/lib/transformations/type_flow/summary_collector.dart
+++ b/pkg/vm/lib/transformations/type_flow/summary_collector.dart
@@ -587,10 +587,10 @@
     assert(_genericInterfacesInfo != null);
     constantAllocationCollector = new ConstantAllocationCollector(this);
     _nullMethodsAndGetters.addAll(getSelectors(
-        _hierarchy, _environment.coreTypes.nullClass,
+        _hierarchy, _environment.coreTypes.deprecatedNullClass,
         setters: false));
     _nullSetters.addAll(getSelectors(
-        _hierarchy, _environment.coreTypes.nullClass,
+        _hierarchy, _environment.coreTypes.deprecatedNullClass,
         setters: true));
   }
 
@@ -847,7 +847,7 @@
         break;
     }
 
-    return new Args<Type>(args, names: names, unknownArity: true);
+    return new Args<Type>(args, names: names);
   }
 
   TypeExpr _visit(TreeNode node) => node.accept(this);
@@ -2423,6 +2423,7 @@
     final Procedure procedure = constant.procedure;
     summaryCollector._entryPointsListener
         .addRawCall(new DirectSelector(procedure));
+    summaryCollector._entryPointsListener.recordTearOff(procedure);
     return _getStaticType(constant);
   }
 
diff --git a/pkg/vm/lib/transformations/type_flow/transformer.dart b/pkg/vm/lib/transformations/type_flow/transformer.dart
index cf64db8..68688fd 100644
--- a/pkg/vm/lib/transformations/type_flow/transformer.dart
+++ b/pkg/vm/lib/transformations/type_flow/transformer.dart
@@ -13,10 +13,10 @@
 import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
 import 'package:kernel/library_index.dart' show LibraryIndex;
 import 'package:kernel/type_environment.dart';
-import 'package:kernel/external_name.dart';
 
 import 'analysis.dart';
 import 'calls.dart';
+import 'signature_shaking.dart';
 import 'protobuf_handler.dart' show ProtobufHandler;
 import 'summary.dart';
 import 'table_selector_assigner.dart';
@@ -86,7 +86,6 @@
   final transformsStopWatch = new Stopwatch()..start();
 
   final treeShaker = new TreeShaker(component, typeFlowAnalysis,
-      treeShakeSignatures: treeShakeSignatures,
       treeShakeWriteOnlyFields: treeShakeWriteOnlyFields);
   treeShaker.transformComponent(component);
 
@@ -96,6 +95,12 @@
 
   final tableSelectorAssigner = new TableSelectorAssigner(component);
 
+  if (treeShakeSignatures) {
+    final signatureShaker =
+        new SignatureShaker(typeFlowAnalysis, tableSelectorAssigner);
+    signatureShaker.transformComponent(component);
+  }
+
   final unboxingInfo = new UnboxingInfoManager(typeFlowAnalysis)
     ..analyzeComponent(component, typeFlowAnalysis, tableSelectorAssigner);
 
@@ -103,8 +108,6 @@
           tableSelectorAssigner, unboxingInfo)
       .visitComponent(component);
 
-  treeShaker.finalizeSignatures();
-
   transformsStopWatch.stop();
 
   statPrint("TF analysis took ${analysisStopWatch.elapsedMilliseconds}ms");
@@ -192,7 +195,8 @@
     }
 
     if (nullable && type == const EmptyType()) {
-      concreteClass = _typeFlowAnalysis.environment.coreTypes.nullClass;
+      concreteClass =
+          _typeFlowAnalysis.environment.coreTypes.deprecatedNullClass;
       constantValue = _nullConstant ??= new NullConstant();
     } else {
       concreteClass = type.getConcreteClass(_typeFlowAnalysis.hierarchyCache);
@@ -510,17 +514,14 @@
   _TreeShakerConstantVisitor constantVisitor;
   _TreeShakerPass1 _pass1;
   _TreeShakerPass2 _pass2;
-  _SignatureShaker _signatureShaker;
 
   TreeShaker(Component component, this.typeFlowAnalysis,
-      {bool treeShakeSignatures: true, this.treeShakeWriteOnlyFields: true}) {
+      {this.treeShakeWriteOnlyFields: true}) {
     fieldMorpher = new FieldMorpher(this);
     typeVisitor = new _TreeShakerTypeVisitor(this);
     constantVisitor = new _TreeShakerConstantVisitor(this, typeVisitor);
     _pass1 = new _TreeShakerPass1(this);
     _pass2 = new _TreeShakerPass2(this);
-    _signatureShaker = new _SignatureShaker(this.typeFlowAnalysis,
-        treeShakeSignatures: treeShakeSignatures);
   }
 
   transformComponent(Component component) {
@@ -528,10 +529,6 @@
     _pass2.transform(component);
   }
 
-  finalizeSignatures() {
-    _signatureShaker.transform();
-  }
-
   bool isClassReferencedFromNativeCode(Class c) =>
       typeFlowAnalysis.nativeCodeOracle.isClassReferencedFromNativeCode(c);
   bool isClassUsed(Class c) => _usedClasses.contains(c);
@@ -699,7 +696,7 @@
           isAbstract: true, fileUri: field.fileUri);
     }
     accessor.fileOffset = field.fileOffset;
-    field.enclosingClass.addMember(accessor);
+    field.enclosingClass.addProcedure(accessor);
     _removedFields[accessor] = field;
     shaker.addUsedMember(accessor);
     return accessor;
@@ -795,7 +792,6 @@
   final TreeShaker shaker;
   final FieldMorpher fieldMorpher;
   final TypeEnvironment environment;
-  final List<Initializer> additionalInitializers = [];
   Procedure _unsafeCast;
 
   StaticTypeContext _staticTypeContext;
@@ -923,20 +919,6 @@
   }
 
   @override
-  Constructor visitConstructor(Constructor node) {
-    additionalInitializers.clear();
-    node = defaultMember(node);
-    if (additionalInitializers.isNotEmpty) {
-      assert(node.initializers.last is SuperInitializer ||
-          node.initializers.last is RedirectingInitializer);
-      additionalInitializers.forEach((i) => i.parent = node);
-      node.initializers
-          .insertAll(node.initializers.length - 1, additionalInitializers);
-    }
-    return node;
-  }
-
-  @override
   TreeNode defaultMember(Member node) {
     currentMember = node;
     if (shaker.isMemberBodyReachable(node)) {
@@ -1078,83 +1060,6 @@
     }
   }
 
-  Expression _fixArgumentEvaluationOrder(
-      Expression invocation, Arguments args) {
-    if (args.named.isEmpty) return invocation;
-
-    Expression outer = invocation;
-    for (int i = args.named.length - 1; i >= 0; --i) {
-      final arg = args.named[i];
-      final variable = VariableDeclaration(null,
-          initializer: arg.value,
-          type: arg.value.getStaticType(staticTypeContext));
-      arg.value = VariableGet(variable)..parent = arg;
-      outer = Let(variable, outer);
-    }
-    for (int i = args.positional.length - 1; i >= 0; --i) {
-      final variable = VariableDeclaration(null,
-          initializer: args.positional[i],
-          type: args.positional[i].getStaticType(staticTypeContext));
-      args.positional[i] = VariableGet(variable)..parent = args;
-      outer = Let(variable, outer);
-    }
-    return outer;
-  }
-
-  void _fixArgumentEvaluationOrderInInitializer(Arguments args) {
-    if (args.named.isEmpty) return;
-
-    for (int i = 0; i < args.positional.length; ++i) {
-      final variable =
-          VariableDeclaration(null, initializer: args.positional[i]);
-      args.positional[i] = VariableGet(variable)..parent = args;
-      additionalInitializers.add(LocalInitializer(variable));
-    }
-    for (int i = 0; i < args.named.length; ++i) {
-      final variable =
-          VariableDeclaration(null, initializer: args.named[i].value);
-      args.named[i].value = VariableGet(variable)..parent = args.named[i];
-      additionalInitializers.add(LocalInitializer(variable));
-    }
-  }
-
-  void _rewriteArguments(Arguments args, Member member) {
-    final alwaysPassedParams =
-        shaker.typeFlowAnalysis.alwaysPassedOptionalParameters(member);
-    final func = member.function;
-    final positional = args.positional.toList();
-    final newPositional = args.positional;
-    newPositional.removeRange(
-        func.requiredParameterCount, newPositional.length);
-
-    for (int i = func.requiredParameterCount; i < positional.length; ++i) {
-      if (alwaysPassedParams.contains(func.positionalParameters[i].name)) {
-        newPositional.add(positional[i]);
-      }
-    }
-
-    final newNamed = <NamedExpression>[];
-    final namedPositionals = <NamedExpression>[];
-    for (int i = 0; i < args.named.length; i++) {
-      final arg = args.named[i];
-      if (alwaysPassedParams.contains(arg.name)) {
-        namedPositionals.add(arg);
-      } else {
-        newNamed.add(arg);
-      }
-    }
-    args.named = newNamed;
-    namedPositionals.sort((x, y) => x.name.compareTo(y.name));
-    newPositional
-        .addAll(namedPositionals.map((expr) => expr.value..parent = args));
-
-    for (int i = func.requiredParameterCount; i < positional.length; ++i) {
-      if (!alwaysPassedParams.contains(func.positionalParameters[i].name)) {
-        newPositional.add(positional[i]);
-      }
-    }
-  }
-
   @override
   TreeNode visitStaticInvocation(StaticInvocation node) {
     node.transformChildren(this);
@@ -1166,10 +1071,7 @@
     assert(shaker.isMemberBodyReachable(target),
         "Member body is not reachable: $target");
 
-    if (!shaker._signatureShaker.isShakingSignature(target)) return node;
-    final result = _fixArgumentEvaluationOrder(node, node.arguments);
-    _rewriteArguments(node.arguments, target);
-    return result;
+    return node;
   }
 
   @override
@@ -1220,10 +1122,7 @@
         assert(node.isConst);
         shaker.addUsedMember(node.target);
       }
-      if (!shaker._signatureShaker.isShakingSignature(node.target)) return node;
-      final result = _fixArgumentEvaluationOrder(node, node.arguments);
-      _rewriteArguments(node.arguments, node.target);
-      return result;
+      return node;
     }
   }
 
@@ -1235,9 +1134,6 @@
     } else {
       assert(shaker.isMemberBodyReachable(node.target),
           "Target should be reachable: ${node.target}");
-      if (!shaker._signatureShaker.isShakingSignature(node.target)) return node;
-      _fixArgumentEvaluationOrderInInitializer(node.arguments);
-      _rewriteArguments(node.arguments, node.target);
       return node;
     }
   }
@@ -1249,9 +1145,6 @@
       return _makeUnreachableInitializer(_flattenArguments(node.arguments));
     } else {
       // Can't assert that node.target is used due to partial mixin resolution.
-      if (!shaker._signatureShaker.isShakingSignature(node.target)) return node;
-      _fixArgumentEvaluationOrderInInitializer(node.arguments);
-      _rewriteArguments(node.arguments, node.target);
       return node;
     }
   }
@@ -1408,34 +1301,6 @@
       node.enclosingClass.isEnum;
 
   @override
-  Member visitProcedure(Procedure proc) {
-    proc = defaultMember(proc);
-    if (proc == null || !shaker._signatureShaker.isShakingSignature(proc)) {
-      return proc;
-    }
-    final optionals =
-        shaker.typeFlowAnalysis.alwaysPassedOptionalParameters(proc);
-    if (optionals.isNotEmpty) {
-      shaker._signatureShaker.defer(proc);
-    }
-    return proc;
-  }
-
-  @override
-  Member visitConstructor(Constructor ctor) {
-    ctor = defaultMember(ctor);
-    if (ctor == null || !shaker._signatureShaker.isShakingSignature(ctor)) {
-      return ctor;
-    }
-    final optionals =
-        shaker.typeFlowAnalysis.alwaysPassedOptionalParameters(ctor);
-    if (optionals.isNotEmpty) {
-      shaker._signatureShaker.defer(ctor);
-    }
-    return ctor;
-  }
-
-  @override
   Member defaultMember(Member node) {
     if (!shaker.isMemberUsed(node) && !_preserveSpecialMember(node)) {
       // Ensure that kernel file writer will not be able to
@@ -1514,86 +1379,6 @@
   }
 }
 
-// Transform signatures of functions to convert optional named and
-// positional parameters to required parameters if we know that all call sites
-// will pass them.
-//
-// Because the AnnotateKernel pass expects signatures to match up with the
-// corresponding summaries, we enqueue the functions which need to be transformed
-// during the _TreeShakerPass1 and delay the actual transformation until after
-// AnnotateKernel has run.
-class _SignatureShaker {
-  final TypeFlowAnalysis analysis;
-  final List<Member> deferred = [];
-  final bool treeShakeSignatures;
-  _SignatureShaker(this.analysis, {this.treeShakeSignatures});
-
-  bool isShakingSignature(Member member) {
-    if (!treeShakeSignatures) return false;
-    if (member is Procedure && member.isStatic || member is Constructor) {
-      if (getExternalName(member) != null) {
-        // This member has a native implementation which we cannot rewrite
-        // to accomodate the new signature.
-        return false;
-      }
-    } else {
-      return false;
-    }
-    final alwaysPassedParams = analysis.alwaysPassedOptionalParameters(member);
-    return alwaysPassedParams.isNotEmpty;
-  }
-
-  void defer(Member m) {
-    assert(isShakingSignature(m));
-    deferred.add(m);
-  }
-
-  void transform() => deferred.forEach(_update);
-
-  void _update(Member member) {
-    final alwaysPassedOptionals =
-        analysis.alwaysPassedOptionalParameters(member);
-    assert(alwaysPassedOptionals.isNotEmpty);
-
-    final func = member.function;
-    final newPositional =
-        func.positionalParameters.sublist(0, func.requiredParameterCount);
-    final optionalPositional =
-        func.positionalParameters.sublist(func.requiredParameterCount);
-
-    for (final param in optionalPositional) {
-      if (alwaysPassedOptionals.contains(param.name)) {
-        newPositional.add(param..initializer = null);
-      }
-    }
-
-    final namedPositionals = <VariableDeclaration>[];
-    final namedParameters = <VariableDeclaration>[];
-    for (final param in func.namedParameters) {
-      if (alwaysPassedOptionals.contains(param.name)) {
-        // Make sure to clear the isRequired flag in case it was set.
-        param.isRequired = false;
-        namedPositionals.add(param..initializer = null);
-      } else {
-        namedParameters.add(param);
-      }
-    }
-    namedPositionals.sort((x, y) => x.name.compareTo(y.name));
-    newPositional.addAll(namedPositionals);
-
-    func.requiredParameterCount = newPositional.length;
-
-    for (final param in optionalPositional) {
-      if (!alwaysPassedOptionals.contains(param.name)) {
-        newPositional.add(param);
-      }
-    }
-
-    func.positionalParameters = newPositional;
-    func.namedParameters = namedParameters;
-  }
-}
-
 class _TreeShakerConstantVisitor extends ConstantVisitor<Null> {
   final TreeShaker shaker;
   final _TreeShakerTypeVisitor typeVisitor;
@@ -1671,26 +1456,3 @@
     constant.type.accept(typeVisitor);
   }
 }
-
-bool mayHaveSideEffects(Expression node) {
-  if (node is BasicLiteral ||
-      node is ConstantExpression ||
-      node is ThisExpression) {
-    return false;
-  }
-  if (node is VariableGet && !node.variable.isLate) {
-    return false;
-  }
-  if (node is StaticGet) {
-    final target = node.target;
-    if (target is Field && !target.isLate) {
-      final initializer = target.initializer;
-      if (initializer == null ||
-          initializer is BasicLiteral ||
-          initializer is ConstantExpression) {
-        return false;
-      }
-    }
-  }
-  return true;
-}
diff --git a/pkg/vm/lib/transformations/type_flow/types.dart b/pkg/vm/lib/transformations/type_flow/types.dart
index e7e0c1d..c5754ed 100644
--- a/pkg/vm/lib/transformations/type_flow/types.dart
+++ b/pkg/vm/lib/transformations/type_flow/types.dart
@@ -79,12 +79,12 @@
     Type result;
     if (type is InterfaceType) {
       final cls = type.classNode;
-      result = (cls == coreTypes.nullClass)
-          ? const EmptyType()
-          : new ConeType(getTFClass(cls));
+      result = new ConeType(getTFClass(cls));
     } else if (type == const DynamicType() || type == const VoidType()) {
       result = const AnyType();
-    } else if (type == const BottomType() || type is NeverType) {
+    } else if (type == const BottomType() ||
+        type is NeverType ||
+        type is NullType) {
       result = const EmptyType();
     } else if (type is FunctionType) {
       // TODO(alexmarkov): support function types
diff --git a/pkg/vm/lib/transformations/type_flow/utils.dart b/pkg/vm/lib/transformations/type_flow/utils.dart
index ca2e212..2502904 100644
--- a/pkg/vm/lib/transformations/type_flow/utils.dart
+++ b/pkg/vm/lib/transformations/type_flow/utils.dart
@@ -329,3 +329,45 @@
 
 bool isComparisonWithNull(MethodInvocation node) =>
     getArgumentOfComparisonWithNull(node) != null;
+
+bool mayHaveSideEffects(Expression node) {
+  // Keep this function in sync with mayHaveOrSeeSideEffects:
+  // If new false cases are added here, add the corresponding visibility cases
+  // to mayHaveOrSeeSideEffects.
+  if (node is BasicLiteral ||
+      node is ConstantExpression ||
+      node is ThisExpression) {
+    return false;
+  }
+  if (node is VariableGet && !node.variable.isLate) {
+    return false;
+  }
+  if (node is StaticGet) {
+    final target = node.target;
+    if (target is Field && !target.isLate) {
+      final initializer = target.initializer;
+      if (initializer == null ||
+          initializer is BasicLiteral ||
+          initializer is ConstantExpression) {
+        return false;
+      }
+    }
+  }
+  return true;
+}
+
+bool mayHaveOrSeeSideEffects(Expression node) {
+  if (mayHaveSideEffects(node)) {
+    return true;
+  }
+  if (node is VariableGet && !node.variable.isFinal) {
+    return true;
+  }
+  if (node is StaticGet) {
+    final target = node.target;
+    if (target is Field && !target.isFinal) {
+      return true;
+    }
+  }
+  return false;
+}
diff --git a/pkg/vm/pubspec.yaml b/pkg/vm/pubspec.yaml
index 26d0bc7..9a2d487 100644
--- a/pkg/vm/pubspec.yaml
+++ b/pkg/vm/pubspec.yaml
@@ -11,7 +11,7 @@
   build_integration:
     path: ../build_integration
   crypto: any
-  front_end: ^0.1.6
+  front_end: any
   kernel: ^0.3.6
   meta: any
   package_config: any
@@ -23,3 +23,7 @@
   path: any
   test: any
   web_socket_channel: any
+
+dependency_overrides:
+  front_end:
+    path: ../front_end
diff --git a/pkg/vm/test/bytecode/gen_bytecode_test.dart b/pkg/vm/test/bytecode/gen_bytecode_test.dart
deleted file mode 100644
index 673a16e..0000000
--- a/pkg/vm/test/bytecode/gen_bytecode_test.dart
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright (c) 2018, 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';
-
-import 'package:front_end/src/api_unstable/vm.dart'
-    show CompilerOptions, DiagnosticMessage;
-import 'package:kernel/ast.dart';
-import 'package:kernel/kernel.dart';
-import 'package:test/test.dart';
-import 'package:vm/bytecode/gen_bytecode.dart' show generateBytecode;
-import 'package:vm/bytecode/options.dart' show BytecodeOptions;
-import 'package:vm/kernel_front_end.dart' show runWithFrontEndCompilerContext;
-
-import '../common_test_utils.dart';
-
-final String pkgVmDir = Platform.script.resolve('../..').toFilePath();
-
-runTestCase(Uri source) async {
-  // Certain tests require super-mixin semantics which is used in Flutter.
-  bool enableSuperMixins = source.pathSegments.last == 'super_calls.dart';
-
-  Component component = await compileTestCaseToKernelProgram(source,
-      enableSuperMixins: enableSuperMixins);
-
-  final options = new CompilerOptions()
-    ..onDiagnostic = (DiagnosticMessage message) {
-      fail("Compilation error: ${message.plainTextFormatted.join('\n')}");
-    };
-
-  final mainLibrary = component.mainMethod.enclosingLibrary;
-
-  await runWithFrontEndCompilerContext(source, options, component, () {
-    // Need to omit source positions from bytecode as they are different on
-    // Linux and Windows (due to differences in newline characters).
-    generateBytecode(component,
-        options: new BytecodeOptions(
-            enableAsserts: true, omitAssertSourcePositions: true),
-        libraries: [mainLibrary]);
-  });
-
-  component.libraries.removeWhere((lib) => lib != mainLibrary);
-  String actual = kernelComponentToString(component);
-
-  // Remove absolute library URIs.
-  actual = actual.replaceAll(new Uri.file(pkgVmDir).toString(), '#pkg/vm');
-
-  compareResultWithExpectationsFile(source, actual);
-}
-
-main() {
-  group('gen-bytecode', () {
-    final testCasesDir = new Directory(pkgVmDir + '/testcases/bytecode');
-
-    for (var entry
-        in testCasesDir.listSync(recursive: true, followLinks: false)) {
-      if (entry.path.endsWith(".dart")) {
-        test(entry.path, () => runTestCase(entry.uri));
-      }
-    }
-  });
-}
diff --git a/pkg/vm/test/bytecode/object_table_test.dart b/pkg/vm/test/bytecode/object_table_test.dart
deleted file mode 100644
index 84f1001..0000000
--- a/pkg/vm/test/bytecode/object_table_test.dart
+++ /dev/null
@@ -1,129 +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 'package:kernel/ast.dart';
-import 'package:kernel/core_types.dart' show CoreTypes;
-import 'package:kernel/testing/mock_sdk_component.dart';
-import 'package:test/test.dart';
-import 'package:expect/expect.dart';
-import 'package:vm/bytecode/object_table.dart';
-
-main() {
-  Library lib1;
-  Library lib2;
-  CoreTypes coreTypes;
-  Supertype objectSupertype;
-  ObjectTable objectTable;
-
-  Class addClass(Library lib, String name,
-      [List<TypeParameter> typeParameters = const []]) {
-    Class cls = new Class(
-        name: name, supertype: objectSupertype, typeParameters: typeParameters);
-    cls.parent = lib;
-    lib.addClass(cls);
-    return cls;
-  }
-
-  setUp(() {
-    // Start with mock SDK libraries.
-    Component component = createMockSdkComponent();
-    coreTypes = new CoreTypes(component);
-    objectSupertype = coreTypes.objectClass.asThisSupertype;
-
-    // Add test libraries.
-    lib1 = new Library(Uri.parse('org-dartlang:///test1.dart'), name: 'lib1');
-    lib1.parent = component;
-    component.libraries.add(lib1);
-
-    lib2 = new Library(Uri.parse('org-dartlang:///test2.dart'), name: 'lib2');
-    lib2.parent = component;
-    component.libraries.add(lib2);
-
-    objectTable = new ObjectTable(coreTypes);
-  });
-
-  tearDown(() {});
-
-  test('libraries', () {
-    final h1 = objectTable.getHandle(lib1);
-    final h2 = objectTable.getHandle(lib2);
-    Expect.notEquals(h1, h2);
-    Expect.identical(h1, objectTable.getHandle(lib1));
-    Expect.identical(h2, objectTable.getHandle(lib2));
-    Expect.equals(true, h1.isCacheable);
-    Expect.equals(true, h2.isCacheable);
-    Expect.equals(false, h1.shouldBeIncludedIntoIndexTable); // 2 uses
-    Expect.identical(h1, objectTable.getHandle(lib1));
-    Expect.equals(true, h1.shouldBeIncludedIntoIndexTable); // 3 uses
-  });
-
-  test('classes', () {
-    final Class c1 = addClass(lib1, 'A');
-    final Class c2 = addClass(lib1, 'B');
-    final Class c3 = addClass(lib2, 'A');
-    final h1 = objectTable.getHandle(c1);
-    final h2 = objectTable.getHandle(c2);
-    final h3 = objectTable.getHandle(c3);
-    Expect.notEquals(h1, h2);
-    Expect.notEquals(h1, h3);
-    Expect.notEquals(h2, h3);
-    Expect.identical(h1, objectTable.getHandle(c1));
-    Expect.identical(h2, objectTable.getHandle(c2));
-    Expect.identical(h3, objectTable.getHandle(c3));
-    Expect.equals(true, h1.isCacheable);
-    Expect.equals(true, h2.isCacheable);
-    Expect.equals(true, h3.isCacheable);
-    final lib1h = objectTable.getHandle(lib1);
-    final lib2h = objectTable.getHandle(lib2);
-    Expect.equals(true, lib1h.shouldBeIncludedIntoIndexTable); // 3 uses
-    Expect.equals(false, lib2h.shouldBeIncludedIntoIndexTable); // 2 uses
-  });
-
-  test('simple-types', () {
-    final h1a = objectTable
-        .getHandle(new InterfaceType(coreTypes.intClass, Nullability.legacy));
-    final h1b = objectTable
-        .getHandle(new InterfaceType(coreTypes.intClass, Nullability.legacy));
-    final h2a = objectTable.getHandle(const DynamicType());
-    final h2b = objectTable.getHandle(new DynamicType());
-    Expect.identical(h1a, h1b);
-    Expect.identical(h2a, h2b);
-    Expect.notEquals(h1a, h2a);
-    Expect.equals(true, h1a.isCacheable);
-    Expect.equals(true, h2a.isCacheable);
-    Expect.equals(false, h1a.shouldBeIncludedIntoIndexTable); // 2 uses
-    objectTable.getHandle(new InterfaceType(
-        coreTypes.listClass,
-        Nullability.legacy,
-        [new InterfaceType(coreTypes.intClass, Nullability.legacy)]));
-    Expect.equals(true, h1a.shouldBeIncludedIntoIndexTable); // 3 uses
-  });
-
-  test('recursive-types', () {
-    final base = addClass(lib1, "Base", [new TypeParameter("T")]);
-    final derived1 = addClass(lib1, "Derived");
-    derived1.supertype =
-        new Supertype(base, [new InterfaceType(derived1, Nullability.legacy)]);
-    final derived2 = addClass(lib2, "Derived");
-    derived2.supertype =
-        new Supertype(base, [new InterfaceType(derived2, Nullability.legacy)]);
-    final h1a =
-        objectTable.getHandle(new InterfaceType(derived1, Nullability.legacy));
-    final h1b =
-        objectTable.getHandle(new InterfaceType(derived1, Nullability.legacy));
-    final h2a =
-        objectTable.getHandle(new InterfaceType(derived2, Nullability.legacy));
-    final h2b =
-        objectTable.getHandle(new InterfaceType(derived2, Nullability.legacy));
-    Expect.identical(h1a, h1b);
-    Expect.identical(h2a, h2b);
-    Expect.notEquals(h1a, h2a);
-    Expect.equals(true, h1a.isCacheable);
-    Expect.equals(true, h2a.isCacheable);
-    final typeArgs1 = (h1a as dynamic).typeArgs;
-    final typeArgs2 = (h2a as dynamic).typeArgs;
-    Expect.equals(false, typeArgs1.isCacheable);
-    Expect.equals(false, typeArgs2.isCacheable);
-  });
-}
diff --git a/pkg/vm/test/bytecode/recursive_types_validator_test.dart b/pkg/vm/test/bytecode/recursive_types_validator_test.dart
deleted file mode 100644
index 6927492..0000000
--- a/pkg/vm/test/bytecode/recursive_types_validator_test.dart
+++ /dev/null
@@ -1,175 +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 'package:kernel/ast.dart';
-import 'package:kernel/core_types.dart' show CoreTypes;
-import 'package:kernel/testing/mock_sdk_component.dart';
-import 'package:test/test.dart';
-import 'package:expect/expect.dart';
-import 'package:vm/bytecode/recursive_types_validator.dart';
-
-main() {
-  CoreTypes coreTypes;
-  Library lib;
-  Supertype objectSuper;
-  DartType intType;
-  DartType doubleType;
-  Class base;
-  RecursiveTypesValidator validator;
-
-  Class addClass(String name, List<TypeParameter> typeParameters) {
-    Class cls = new Class(
-        name: name, supertype: objectSuper, typeParameters: typeParameters);
-    lib.addClass(cls);
-    return cls;
-  }
-
-  setUp(() {
-    // Start with mock SDK libraries.
-    Component component = createMockSdkComponent();
-    coreTypes = new CoreTypes(component);
-    objectSuper = coreTypes.objectClass.asThisSupertype;
-    intType = new InterfaceType(coreTypes.intClass, Nullability.legacy);
-    doubleType = new InterfaceType(coreTypes.doubleClass, Nullability.legacy);
-
-    // Add the test library.
-    lib = new Library(Uri.parse('org-dartlang:///test.dart'), name: 'lib');
-    lib.parent = component;
-    component.libraries.add(lib);
-
-    // class Base<T>
-    base = addClass('Base', [new TypeParameter('T')]);
-
-    validator = new RecursiveTypesValidator(coreTypes);
-  });
-
-  tearDown(() {});
-
-  test('simple-recursive-type', () async {
-    // class Derived<T> extends Base<Derived<T>>
-    TypeParameter t = new TypeParameter('T');
-    Class derived = addClass('Derived', [t]);
-    DartType derivedOfT = new InterfaceType(derived, Nullability.legacy,
-        [new TypeParameterType(t, Nullability.legacy)]);
-    DartType derivedOfInt =
-        new InterfaceType(derived, Nullability.legacy, [intType]);
-    derived.supertype = new Supertype(base, [derivedOfT]);
-
-    validator.validateType(derivedOfT);
-    Expect.isTrue(validator.isRecursive(derivedOfT));
-
-    validator.validateType(derivedOfInt);
-    Expect.isTrue(validator.isRecursive(derivedOfInt));
-  });
-
-  test('recursive-type-extends-instantiated', () async {
-    // class Derived<T> extends Base<Derived<Derived<int>>>
-    TypeParameter t = new TypeParameter('T');
-    Class derived = addClass('Derived', [t]);
-    DartType derivedOfT = new InterfaceType(derived, Nullability.legacy,
-        [new TypeParameterType(t, Nullability.legacy)]);
-    DartType derivedOfInt =
-        new InterfaceType(derived, Nullability.legacy, [intType]);
-    DartType derivedOfDerivedOfInt =
-        new InterfaceType(derived, Nullability.legacy, [derivedOfInt]);
-    derived.supertype = new Supertype(base, [derivedOfDerivedOfInt]);
-
-    validator.validateType(derivedOfT);
-    validator.validateType(derivedOfInt);
-
-    Expect.isFalse(validator.isRecursive(derivedOfT));
-    Expect.isTrue(validator.isRecursive(derivedOfInt));
-    Expect.isTrue(validator.isRecursive(derivedOfDerivedOfInt));
-  });
-
-  test('recursive-non-contractive-type', () async {
-    // class Derived<T> extends Base<Derived<Derived<T>>>
-    TypeParameter t = new TypeParameter('T');
-    Class derived = addClass('Derived', [t]);
-    DartType derivedOfT = new InterfaceType(derived, Nullability.legacy,
-        [new TypeParameterType(t, Nullability.legacy)]);
-    DartType derivedOfInt =
-        new InterfaceType(derived, Nullability.legacy, [intType]);
-    DartType derivedOfDerivedOfT =
-        new InterfaceType(derived, Nullability.legacy, [derivedOfT]);
-    derived.supertype = new Supertype(base, [derivedOfDerivedOfT]);
-
-    Expect.throws(() {
-      validator.validateType(derivedOfT);
-    });
-    Expect.throws(() {
-      validator.validateType(derivedOfDerivedOfT);
-    });
-    Expect.throws(() {
-      validator.validateType(derivedOfInt);
-    });
-  });
-
-  test('mutually-recursive-types', () async {
-    // class Derived1<U> extends Base<Derived2<U>>
-    // class Derived2<V> extends Base<Derived1<V>>
-    TypeParameter u = new TypeParameter('U');
-    Class derived1 = addClass('Derived1', [u]);
-
-    TypeParameter v = new TypeParameter('V');
-    Class derived2 = addClass('Derived2', [v]);
-
-    DartType derived2OfU = new InterfaceType(derived2, Nullability.legacy,
-        [new TypeParameterType(u, Nullability.legacy)]);
-    derived1.supertype = new Supertype(base, [derived2OfU]);
-
-    DartType derived1OfV = new InterfaceType(derived1, Nullability.legacy,
-        [new TypeParameterType(v, Nullability.legacy)]);
-    derived2.supertype = new Supertype(base, [derived1OfV]);
-
-    DartType derived1OfU = new InterfaceType(derived1, Nullability.legacy,
-        [new TypeParameterType(u, Nullability.legacy)]);
-    DartType derived1OfInt =
-        new InterfaceType(derived1, Nullability.legacy, [intType]);
-
-    DartType derived2OfV = new InterfaceType(derived2, Nullability.legacy,
-        [new TypeParameterType(v, Nullability.legacy)]);
-    DartType derived2OfInt =
-        new InterfaceType(derived2, Nullability.legacy, [intType]);
-
-    validator.validateType(derived1OfU);
-    Expect.isTrue(validator.isRecursive(derived1OfU));
-
-    validator.validateType(derived1OfInt);
-    Expect.isTrue(validator.isRecursive(derived1OfInt));
-
-    validator.validateType(derived2OfV);
-    Expect.isTrue(validator.isRecursive(derived2OfV));
-
-    validator.validateType(derived2OfInt);
-    Expect.isTrue(validator.isRecursive(derived2OfInt));
-  });
-
-  test('recursive-two-type-params', () async {
-    // class F<P1, P2> {}
-    // class E<Q1, Q2> extends F<E<Q1, int>, Q2> {}
-    TypeParameter p1 = new TypeParameter('P1');
-    TypeParameter p2 = new TypeParameter('P2');
-    Class f = addClass('F', [p1, p2]);
-
-    TypeParameter q1 = new TypeParameter('Q1');
-    TypeParameter q2 = new TypeParameter('Q2');
-    Class e = addClass('E', [q1, q2]);
-
-    DartType eOfQ1Int = new InterfaceType(e, Nullability.legacy,
-        [new TypeParameterType(q1, Nullability.legacy), intType]);
-    e.supertype = new Supertype(
-        f, [eOfQ1Int, new TypeParameterType(q2, Nullability.legacy)]);
-
-    DartType eOfIntDouble =
-        new InterfaceType(e, Nullability.legacy, [intType, doubleType]);
-
-    validator.validateType(eOfIntDouble);
-    validator.validateType(e.getThisType(coreTypes, lib.nonNullable));
-
-    Expect.isFalse(validator.isRecursive(eOfIntDouble));
-    Expect.isFalse(
-        validator.isRecursive(e.getThisType(coreTypes, lib.nonNullable)));
-  });
-}
diff --git a/pkg/vm/test/common_test_utils.dart b/pkg/vm/test/common_test_utils.dart
index 6233aa5..f9c70a7 100644
--- a/pkg/vm/test/common_test_utils.dart
+++ b/pkg/vm/test/common_test_utils.dart
@@ -48,7 +48,7 @@
     ..target = target
     ..additionalDills = <Uri>[platformKernel]
     ..environmentDefines = environmentDefines
-    ..experimentalFlags =
+    ..explicitExperimentalFlags =
         parseExperimentalFlags(parseExperimentalArguments(experimentalFlags),
             onError: (String message) {
       throw message;
diff --git a/pkg/vm/test/incremental_compiler_test.dart b/pkg/vm/test/incremental_compiler_test.dart
index 59416a2..52a98e6 100644
--- a/pkg/vm/test/incremental_compiler_test.dart
+++ b/pkg/vm/test/incremental_compiler_test.dart
@@ -71,7 +71,7 @@
           .writeLibraryFile(component.mainMethod.enclosingLibrary);
       expect(
           buffer.toString(),
-          equals('library;\n'
+          equals('library /*isNonNullableByDefault*/;\n'
               'import self as self;\n'
               '\n'
               'static method main() → dynamic {}\n'));
@@ -93,7 +93,7 @@
           .writeLibraryFile(component.mainMethod.enclosingLibrary);
       expect(
           buffer.toString(),
-          equals('library;\n'
+          equals('library /*isNonNullableByDefault*/;\n'
               'import self as self;\n'
               '\n'
               'static method main() → dynamic {}\n'));
@@ -642,7 +642,7 @@
           "}\n");
 
       var fileBar = new File('${mytest.path}/bar.dart')..createSync();
-      fileBar.writeAsStringSync("class A<T> { int _a; }\n");
+      fileBar.writeAsStringSync("class A<T> { int _a = 0; }\n");
 
       var fileBaz = new File('${mytest.path}/baz.dart')..createSync();
       fileBaz.writeAsStringSync("import 'dart:isolate';\n"
@@ -703,7 +703,7 @@
       expect(reloadResult['details']['loadedLibraryCount'], equals(0));
 
       // Introduce a change that force VM to reject the change.
-      fileBar.writeAsStringSync("class A<T,U> { int _a; }\n");
+      fileBar.writeAsStringSync("class A<T,U> { int _a = 0; }\n");
       compiler.invalidate(fileBar.uri);
       component = await compiler.compile();
       await _writeProgramToFile(component, outputFile);
@@ -711,7 +711,7 @@
       expect(reloadResult['success'], isFalse);
 
       // Fix a change so VM is happy to accept the change.
-      fileBar.writeAsStringSync("class A<T> { int _a; hi() => _a; }\n");
+      fileBar.writeAsStringSync("class A<T> { int _a = 0; hi() => _a; }\n");
       compiler.invalidate(fileBar.uri);
       component = await compiler.compile();
       await _writeProgramToFile(component, outputFile);
@@ -816,7 +816,7 @@
         """);
 
       final CompilerOptions optionsModified = getFreshOptions();
-      optionsModified.experimentalFlags[
+      optionsModified.explicitExperimentalFlags[
           ExperimentalFlag.alternativeInvalidationStrategy] = true;
 
       final IncrementalCompiler compiler =
@@ -1057,7 +1057,7 @@
         import 'dart:async';
         import 'helper.dart';
         main() {
-          int latestReloadTime;
+          int latestReloadTime = -1;
           int noChangeCount = 0;
           int numChanges = 0;
           new Timer.periodic(new Duration(milliseconds: 5), (timer) async {
diff --git a/pkg/vm/test/kernel_front_end_test.dart b/pkg/vm/test/kernel_front_end_test.dart
index 2bc2815..711b616 100644
--- a/pkg/vm/test/kernel_front_end_test.dart
+++ b/pkg/vm/test/kernel_front_end_test.dart
@@ -101,39 +101,6 @@
     ]);
   }, timeout: Timeout.none);
 
-  test('compile-bytecode', () async {
-    await testCompile([
-      '--platform',
-      platformPath(),
-      '--packages',
-      '$sdkDir/$packagesFile',
-      '--output',
-      outputDill(),
-      '--gen-bytecode',
-      '--drop-ast',
-      '$sdkDir/$mainScript',
-    ]);
-  }, timeout: Timeout.none);
-
-  test('compile-bytecode-package-split', () async {
-    await testCompile([
-      '--platform',
-      platformPath(),
-      '--packages',
-      '$sdkDir/$packagesFile',
-      '--output',
-      outputDill(),
-      '--gen-bytecode',
-      '--drop-ast',
-      '--split-output-by-packages',
-      '--manifest',
-      outputManifest(),
-      '--component-name',
-      'foo_component',
-      '$sdkDir/$mainScript',
-    ]);
-  }, timeout: Timeout.none);
-
   test('compile-package-config', () async {
     await testCompile([
       '--platform',
diff --git a/pkg/vm/test/transformations/type_flow/summary_collector_test.dart b/pkg/vm/test/transformations/type_flow/summary_collector_test.dart
index 969556a..1e63109 100644
--- a/pkg/vm/test/transformations/type_flow/summary_collector_test.dart
+++ b/pkg/vm/test/transformations/type_flow/summary_collector_test.dart
@@ -56,6 +56,9 @@
 
   @override
   void recordMemberCalledViaThis(Member target) {}
+
+  @override
+  void recordTearOff(Procedure target) {}
 }
 
 class PrintSummaries extends RecursiveVisitor<Null> {
diff --git a/pkg/vm/test/transformations/type_flow/types_test.dart b/pkg/vm/test/transformations/type_flow/types_test.dart
index 27c288d..326ce81 100644
--- a/pkg/vm/test/transformations/type_flow/types_test.dart
+++ b/pkg/vm/test/transformations/type_flow/types_test.dart
@@ -66,8 +66,7 @@
     final InterfaceType t2Raw = new InterfaceType(c2, Nullability.legacy);
     final InterfaceType t2Generic =
         new InterfaceType(c2, Nullability.legacy, [t1]);
-    final InterfaceType t3 =
-        new InterfaceType(coreTypes.nullClass, Nullability.nullable);
+    final DartType t3 = const NullType();
     final FunctionType f1 =
         new FunctionType([t1], const VoidType(), Nullability.legacy);
 
diff --git a/pkg/vm/testcases/bytecode/asserts.dart b/pkg/vm/testcases/bytecode/asserts.dart
deleted file mode 100644
index 2778c8d..0000000
--- a/pkg/vm/testcases/bytecode/asserts.dart
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright (c) 2018, 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.
-
-void test1(bool condition) {
-  assert(condition);
-}
-
-void test2(bool condition(), String message()) {
-  assert(condition(), message());
-}
-
-main() {}
diff --git a/pkg/vm/testcases/bytecode/asserts.dart.expect b/pkg/vm/testcases/bytecode/asserts.dart.expect
deleted file mode 100644
index 39a0d1e..0000000
--- a/pkg/vm/testcases/bytecode/asserts.dart.expect
+++ /dev/null
@@ -1,96 +0,0 @@
-main = #lib::main;
- [@vm.bytecode=
-BytecodeMetadata {
-Bytecode (version: stable)
-Main library: #lib
-Library '#lib'
-    name '#lib'
-    script '#lib'
-
-Class '', script = '#lib'
-
-
-Function 'test1', static, reflectable, debuggable
-    parameters [dart:core::bool* 'condition'] (required: 1)
-    return-type void
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  JumpIfNoAsserts      L1
-  Push                 FP[-5]
-  AssertBoolean        0
-  JumpIfTrue           L1
-  PushInt              0
-  PushInt              0
-  PushNull
-  DirectCall           CP#0, 3
-  Drop1
-L1:
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-  [0] = DirectCall 'dart:core::_AssertionError::_throwNew', ArgDesc num-args 3, num-type-args 0, names []
-  [1] = Reserved
-}
-
-
-Function 'test2', static, reflectable, debuggable
-    parameters [FunctionType ()* -> dart:core::bool* 'condition', FunctionType ()* -> dart:core::String* 'message'] (required: 2)
-    return-type void
-
-Bytecode {
-  Entry                1
-  CheckStack           0
-  JumpIfNoAsserts      L1
-  Push                 FP[-6]
-  StoreLocal           r0
-  Push                 r0
-  UncheckedClosureCall CP#0, 1
-  AssertBoolean        0
-  JumpIfTrue           L1
-  PushInt              0
-  PushInt              0
-  Push                 FP[-5]
-  StoreLocal           r0
-  Push                 r0
-  UncheckedClosureCall CP#0, 1
-  DirectCall           CP#1, 3
-  Drop1
-L1:
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-  [0] = ObjectRef ArgDesc num-args 1, num-type-args 0, names []
-  [1] = DirectCall 'dart:core::_AssertionError::_throwNew', ArgDesc num-args 3, num-type-args 0, names []
-  [2] = Reserved
-}
-
-
-Function 'main', static, reflectable, debuggable
-    parameters [] (required: 0)
-    return-type dynamic
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-}
-
-
-}
-]library #lib from "#lib" as #lib {
-
-  static method test1(dart.core::bool* condition) → void {
-    assert(condition);
-  }
-  static method test2(() →* dart.core::bool* condition, () →* dart.core::String* message) → void {
-    assert([@vm.call-site-attributes.metadata=receiverType:dart.core::bool* Function()*] condition.call(), [@vm.call-site-attributes.metadata=receiverType:dart.core::String* Function()*] message.call());
-  }
-  static method main() → dynamic {}
-}
diff --git a/pkg/vm/testcases/bytecode/async.dart b/pkg/vm/testcases/bytecode/async.dart
deleted file mode 100644
index 6ccf357..0000000
--- a/pkg/vm/testcases/bytecode/async.dart
+++ /dev/null
@@ -1,68 +0,0 @@
-// Copyright (c) 2018, 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:async';
-
-Future<int> foo() async => 42;
-
-Future<int> simpleAsyncAwait(Future<int> a, Future<int> b) async {
-  return (await a) + (await b);
-}
-
-Future<int> loops(List<int> list) async {
-  int sum = 0;
-  for (int i = 0; i < 10; ++i) {
-    for (var j in list) {
-      sum += i + j + await foo();
-    }
-  }
-  for (int k = 0; k < 10; ++k) {
-    sum += k;
-  }
-  return sum;
-}
-
-Future<int> tryCatchRethrow(Future<int> a, Future<int> b, Future<int> c) async {
-  int x = 1;
-  try {
-    x = x + await a;
-  } catch (e) {
-    if (e is Error) {
-      return 42;
-    }
-    x = x + await b;
-    rethrow;
-  } finally {
-    print('fin');
-    x = x + await c;
-    return x;
-  }
-}
-
-closure(Future<int> a) {
-  int x = 3;
-  Future<int> nested() async {
-    int y = 4;
-    try {
-      x = 5;
-      y = await a;
-      return x + y;
-    } finally {
-      print('fin');
-    }
-  }
-
-  return nested;
-}
-
-Future<int> testAssert(Future<int> a) async {
-  assert((await a) == 42);
-  return 7;
-}
-
-var asyncInFieldInitializer = (Future<int> x) async {
-  await x;
-};
-
-main() {}
diff --git a/pkg/vm/testcases/bytecode/async.dart.expect b/pkg/vm/testcases/bytecode/async.dart.expect
deleted file mode 100644
index 54765bc..0000000
--- a/pkg/vm/testcases/bytecode/async.dart.expect
+++ /dev/null
@@ -1,2265 +0,0 @@
-main = #lib::main;
- [@vm.bytecode=
-BytecodeMetadata {
-Bytecode (version: stable)
-Main library: #lib
-Library '#lib'
-    name '#lib'
-    script '#lib'
-
-Class '', script = '#lib'
-
-Field 'asyncInFieldInitializer', type = FunctionType (dart:async::Future < dart:core::int* >*)* -> dart:async::Future < dart:core::Null? >*, getter = 'get:asyncInFieldInitializer', reflectable, static, has-initializer
-    initializer
-Bytecode {
-  Entry                3
-  CheckStack           0
-  AllocateClosure      CP#0
-  StoreLocal           r2
-  Push                 r2
-  PushNull
-  StoreFieldTOS        CP#20
-  Push                 r2
-  PushNull
-  StoreFieldTOS        CP#22
-  Push                 r2
-  PushConstant         CP#0
-  StoreFieldTOS        CP#24
-  Push                 r2
-  Push                 r0
-  StoreFieldTOS        CP#1
-  ReturnTOS
-}
-ConstantPool {
-  [0] = ClosureFunction 0
-  [1] = InstanceField dart:core::_Closure::_context (field)
-  [2] = Reserved
-  [3] = Type dart:async::Future < dart:core::int* >*
-  [4] = ObjectRef 'x'
-  [5] = SubtypeTestCache
-  [6] = Class dart:async::_AsyncAwaitCompleter
-  [7] = ObjectRef < dart:core::Null? >
-  [8] = DirectCall 'dart:async::_AsyncAwaitCompleter:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
-  [9] = Reserved
-  [10] = ClosureFunction 1
-  [11] = ObjectRef null
-  [12] = DirectCall 'dart:async::_awaitHelper', ArgDesc num-args 4, num-type-args 0, names []
-  [13] = Reserved
-  [14] = DirectCall 'dart:async::_completeOnAsyncReturn', ArgDesc num-args 2, num-type-args 0, names []
-  [15] = Reserved
-  [16] = Type dynamic
-  [17] = InterfaceCall 'dart:async::Completer::completeError', ArgDesc num-args 3, num-type-args 0, names []
-  [18] = Reserved
-  [19] = EndClosureFunctionScope
-  [20] = InstanceField dart:core::_Closure::_instantiator_type_arguments (field)
-  [21] = Reserved
-  [22] = InstanceField dart:core::_Closure::_function_type_arguments (field)
-  [23] = Reserved
-  [24] = InstanceField dart:core::_Closure::_function (field)
-  [25] = Reserved
-  [26] = DirectCall 'dart:async::_asyncThenWrapperHelper', ArgDesc num-args 1, num-type-args 0, names []
-  [27] = Reserved
-  [28] = DirectCall 'dart:async::_asyncErrorWrapperHelper', ArgDesc num-args 1, num-type-args 0, names []
-  [29] = Reserved
-  [30] = InterfaceCall 'dart:async::_AsyncAwaitCompleter::start', ArgDesc num-args 2, num-type-args 0, names []
-  [31] = Reserved
-  [32] = InterfaceCall 'dart:async::Completer::get:future', ArgDesc num-args 1, num-type-args 0, names []
-  [33] = Reserved
-  [34] = EndClosureFunctionScope
-}
-Closure #lib::asyncInFieldInitializer (field)::'<anonymous closure>' async (dart:async::Future < dart:core::int* >* x) -> dart:async::Future < dart:core::Null? >*
-ClosureCode {
-  Entry                4
-  Push                 FP[-6]
-  LoadFieldTOS         CP#1
-  PopLocal             r0
-  CheckStack           0
-  AllocateContext      0, 9
-  PopLocal             r0
-  Push                 r0
-  Push                 FP[-5]
-  StoreContextVar      0, 2
-  JumpIfUnchecked      L1
-  Push                 FP[-5]
-  PushConstant         CP#3
-  PushNull
-  PushNull
-  PushConstant         CP#4
-  AssertAssignable     0, CP#5
-  Drop1
-L1:
-  Push                 r0
-  PushConstant         CP#7
-  PushConstant         CP#6
-  AllocateT
-  StoreLocal           r2
-  Push                 r2
-  DirectCall           CP#8, 1
-  Drop1
-  StoreContextVar      0, 1
-  PushNull
-  PopLocal             r3
-  Push                 r0
-  PushInt              0
-  StoreContextVar      0, 0
-  Push                 r0
-  AllocateClosure      CP#10
-  StoreLocal           r2
-  Push                 r2
-  PushNull
-  StoreFieldTOS        CP#20
-  Push                 r2
-  PushNull
-  StoreFieldTOS        CP#22
-  Push                 r2
-  PushConstant         CP#10
-  StoreFieldTOS        CP#24
-  Push                 r2
-  Push                 r0
-  StoreFieldTOS        CP#1
-  StoreContextVar      0, 8
-  PushNull
-  PopLocal             r3
-  Push                 r0
-  Push                 r0
-  LoadContextVar       0, 8
-  DirectCall           CP#26, 1
-  StoreContextVar      0, 4
-  Push                 r0
-  Push                 r0
-  LoadContextVar       0, 8
-  DirectCall           CP#28, 1
-  StoreContextVar      0, 5
-  Push                 r0
-  LoadContextVar       0, 1
-  Push                 r0
-  LoadContextVar       0, 8
-  InterfaceCall        CP#30, 2
-  Drop1
-  Push                 r0
-  LoadContextVar       0, 1
-  InterfaceCall        CP#32, 1
-  ReturnTOS
-}
-
-Closure #lib::asyncInFieldInitializer (field)::Closure/0::':async_op' ([ dynamic :result, dynamic :exception, dynamic :stack_trace ]) -> dynamic
-ClosureCode {
-  EntryOptional        1, 3, 0
-  LoadConstant         r1, CP#11
-  LoadConstant         r2, CP#11
-  LoadConstant         r3, CP#11
-  Frame                6
-  Push                 r0
-  LoadFieldTOS         CP#1
-  PopLocal             r4
-  CheckStack           0
-  Push                 r4
-  LoadContextVar       0, 0
-  StoreLocal           r5
-  PushInt              0
-  JumpIfNeStrict       L1
-  Push                 r4
-  Push                 r4
-  StoreContextVar      0, 7
-Try #0 start:
-  Push                 r4
-  PushInt              1
-  StoreContextVar      0, 0
-  Push                 r4
-  Push                 r4
-  StoreContextVar      0, 6
-  Push                 r4
-  LoadContextVar       0, 2
-  Push                 r4
-  LoadContextVar       0, 4
-  Push                 r4
-  LoadContextVar       0, 5
-  Push                 r4
-  LoadContextVar       0, 8
-  DirectCall           CP#12, 4
-  PopLocal             r8
-  PushNull
-  ReturnTOS
-L4:
-  Push                 r2
-  JumpIfNull           L2
-  Push                 r2
-  Push                 r3
-  Throw                1
-L2:
-  Push                 r1
-  Drop1
-  Push                 r4
-  LoadContextVar       0, 1
-  Push                 r4
-  LoadContextVar       0, 3
-  DirectCall           CP#14, 2
-  Drop1
-  PushNull
-  ReturnTOS
-Try #0 end:
-Try #0 handler:
-  SetFrame             10
-  Push                 r0
-  LoadFieldTOS         CP#1
-  PopLocal             r4
-  Push                 r4
-  LoadContextVar       0, 7
-  PopLocal             r4
-  MoveSpecial          exception, r6
-  MoveSpecial          stackTrace, r7
-  Push                 r6
-  PopLocal             r8
-  Push                 r7
-  PopLocal             r9
-  Push                 r4
-  LoadContextVar       0, 1
-  Push                 r8
-  Push                 r9
-  InterfaceCall        CP#17, 3
-  Drop1
-  Jump                 L3
-L3:
-  PushNull
-  ReturnTOS
-L1:
-  Push                 r4
-  LoadContextVar       0, 6
-  PopLocal             r4
-  Jump                 L4
-}
-
-
-Function 'foo', static, reflectable, async
-    parameters [] (required: 0)
-    return-type dart:async::Future < dart:core::int* >*
-
-Bytecode {
-  Entry                7
-  CheckStack           0
-  AllocateContext      0, 4
-  PopLocal             r0
-  Push                 r0
-  PushConstant         CP#1
-  PushConstant         CP#0
-  AllocateT
-  StoreLocal           r2
-  Push                 r2
-  DirectCall           CP#2, 1
-  Drop1
-  StoreContextVar      0, 1
-  PushNull
-  PopLocal             r3
-  PushNull
-  PopLocal             r4
-  PushNull
-  PopLocal             r5
-  Push                 r0
-  PushInt              0
-  StoreContextVar      0, 0
-  AllocateClosure      CP#4
-  StoreLocal           r2
-  Push                 r2
-  PushNull
-  StoreFieldTOS        CP#14
-  Push                 r2
-  PushNull
-  StoreFieldTOS        CP#16
-  Push                 r2
-  PushConstant         CP#4
-  StoreFieldTOS        CP#18
-  Push                 r2
-  Push                 r0
-  StoreFieldTOS        CP#6
-  PopLocal             r6
-  PushNull
-  PopLocal             r3
-  Push                 r6
-  DirectCall           CP#20, 1
-  PopLocal             r4
-  Push                 r6
-  DirectCall           CP#22, 1
-  PopLocal             r5
-  Push                 r0
-  LoadContextVar       0, 1
-  Push                 r6
-  InterfaceCall        CP#24, 2
-  Drop1
-  Push                 r0
-  LoadContextVar       0, 1
-  InterfaceCall        CP#26, 1
-  ReturnTOS
-}
-ConstantPool {
-  [0] = Class dart:async::_AsyncAwaitCompleter
-  [1] = ObjectRef < dart:core::int* >
-  [2] = DirectCall 'dart:async::_AsyncAwaitCompleter:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
-  [3] = Reserved
-  [4] = ClosureFunction 0
-  [5] = ObjectRef null
-  [6] = InstanceField dart:core::_Closure::_context (field)
-  [7] = Reserved
-  [8] = DirectCall 'dart:async::_completeOnAsyncReturn', ArgDesc num-args 2, num-type-args 0, names []
-  [9] = Reserved
-  [10] = Type dynamic
-  [11] = InterfaceCall 'dart:async::Completer::completeError', ArgDesc num-args 3, num-type-args 0, names []
-  [12] = Reserved
-  [13] = EndClosureFunctionScope
-  [14] = InstanceField dart:core::_Closure::_instantiator_type_arguments (field)
-  [15] = Reserved
-  [16] = InstanceField dart:core::_Closure::_function_type_arguments (field)
-  [17] = Reserved
-  [18] = InstanceField dart:core::_Closure::_function (field)
-  [19] = Reserved
-  [20] = DirectCall 'dart:async::_asyncThenWrapperHelper', ArgDesc num-args 1, num-type-args 0, names []
-  [21] = Reserved
-  [22] = DirectCall 'dart:async::_asyncErrorWrapperHelper', ArgDesc num-args 1, num-type-args 0, names []
-  [23] = Reserved
-  [24] = InterfaceCall 'dart:async::_AsyncAwaitCompleter::start', ArgDesc num-args 2, num-type-args 0, names []
-  [25] = Reserved
-  [26] = InterfaceCall 'dart:async::Completer::get:future', ArgDesc num-args 1, num-type-args 0, names []
-  [27] = Reserved
-}
-Closure #lib::foo::':async_op' ([ dynamic :result, dynamic :exception, dynamic :stack_trace ]) -> dynamic
-ClosureCode {
-  EntryOptional        1, 3, 0
-  LoadConstant         r1, CP#5
-  LoadConstant         r2, CP#5
-  LoadConstant         r3, CP#5
-  Frame                6
-  Push                 r0
-  LoadFieldTOS         CP#6
-  PopLocal             r4
-  CheckStack           0
-  Push                 r4
-  LoadContextVar       0, 0
-  StoreLocal           r5
-  PushInt              0
-  JumpIfNeStrict       L1
-  Push                 r4
-  PopLocal             r6
-Try #0 start:
-  Push                 r4
-  PushInt              42
-  StoreContextVar      0, 2
-  Jump                 L2
-L2:
-  Push                 r4
-  LoadContextVar       0, 1
-  Push                 r4
-  LoadContextVar       0, 2
-  DirectCall           CP#8, 2
-  Drop1
-  PushNull
-  ReturnTOS
-Try #0 end:
-Try #0 handler:
-  SetFrame             10
-  Push                 r6
-  PopLocal             r4
-  MoveSpecial          exception, r6
-  MoveSpecial          stackTrace, r7
-  Push                 r6
-  PopLocal             r8
-  Push                 r7
-  PopLocal             r9
-  Push                 r4
-  LoadContextVar       0, 1
-  Push                 r8
-  Push                 r9
-  InterfaceCall        CP#11, 3
-  Drop1
-  Jump                 L3
-L3:
-  PushNull
-  ReturnTOS
-L1:
-  Trap
-}
-
-
-Function 'simpleAsyncAwait', static, reflectable, async
-    parameters [dart:async::Future < dart:core::int* >* 'a', dart:async::Future < dart:core::int* >* 'b'] (required: 2)
-    return-type dart:async::Future < dart:core::int* >*
-
-Bytecode {
-  Entry                4
-  CheckStack           0
-  AllocateContext      0, 11
-  PopLocal             r0
-  Push                 r0
-  Push                 FP[-6]
-  StoreContextVar      0, 2
-  Push                 r0
-  Push                 FP[-5]
-  StoreContextVar      0, 3
-  Push                 r0
-  PushConstant         CP#1
-  PushConstant         CP#0
-  AllocateT
-  StoreLocal           r2
-  Push                 r2
-  DirectCall           CP#2, 1
-  Drop1
-  StoreContextVar      0, 1
-  PushNull
-  PopLocal             r3
-  Push                 r0
-  PushInt              0
-  StoreContextVar      0, 0
-  Push                 r0
-  AllocateClosure      CP#4
-  StoreLocal           r2
-  Push                 r2
-  PushNull
-  StoreFieldTOS        CP#16
-  Push                 r2
-  PushNull
-  StoreFieldTOS        CP#18
-  Push                 r2
-  PushConstant         CP#4
-  StoreFieldTOS        CP#20
-  Push                 r2
-  Push                 r0
-  StoreFieldTOS        CP#6
-  StoreContextVar      0, 10
-  PushNull
-  PopLocal             r3
-  Push                 r0
-  Push                 r0
-  LoadContextVar       0, 10
-  DirectCall           CP#22, 1
-  StoreContextVar      0, 5
-  Push                 r0
-  Push                 r0
-  LoadContextVar       0, 10
-  DirectCall           CP#24, 1
-  StoreContextVar      0, 6
-  Push                 r0
-  LoadContextVar       0, 1
-  Push                 r0
-  LoadContextVar       0, 10
-  InterfaceCall        CP#26, 2
-  Drop1
-  Push                 r0
-  LoadContextVar       0, 1
-  InterfaceCall        CP#28, 1
-  ReturnTOS
-}
-ConstantPool {
-  [0] = Class dart:async::_AsyncAwaitCompleter
-  [1] = ObjectRef < dart:core::int* >
-  [2] = DirectCall 'dart:async::_AsyncAwaitCompleter:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
-  [3] = Reserved
-  [4] = ClosureFunction 0
-  [5] = ObjectRef null
-  [6] = InstanceField dart:core::_Closure::_context (field)
-  [7] = Reserved
-  [8] = DirectCall 'dart:async::_awaitHelper', ArgDesc num-args 4, num-type-args 0, names []
-  [9] = Reserved
-  [10] = DirectCall 'dart:async::_completeOnAsyncReturn', ArgDesc num-args 2, num-type-args 0, names []
-  [11] = Reserved
-  [12] = Type dynamic
-  [13] = InterfaceCall 'dart:async::Completer::completeError', ArgDesc num-args 3, num-type-args 0, names []
-  [14] = Reserved
-  [15] = EndClosureFunctionScope
-  [16] = InstanceField dart:core::_Closure::_instantiator_type_arguments (field)
-  [17] = Reserved
-  [18] = InstanceField dart:core::_Closure::_function_type_arguments (field)
-  [19] = Reserved
-  [20] = InstanceField dart:core::_Closure::_function (field)
-  [21] = Reserved
-  [22] = DirectCall 'dart:async::_asyncThenWrapperHelper', ArgDesc num-args 1, num-type-args 0, names []
-  [23] = Reserved
-  [24] = DirectCall 'dart:async::_asyncErrorWrapperHelper', ArgDesc num-args 1, num-type-args 0, names []
-  [25] = Reserved
-  [26] = InterfaceCall 'dart:async::_AsyncAwaitCompleter::start', ArgDesc num-args 2, num-type-args 0, names []
-  [27] = Reserved
-  [28] = InterfaceCall 'dart:async::Completer::get:future', ArgDesc num-args 1, num-type-args 0, names []
-  [29] = Reserved
-}
-Closure #lib::simpleAsyncAwait::':async_op' ([ dynamic :result, dynamic :exception, dynamic :stack_trace ]) -> dynamic
-ClosureCode {
-  EntryOptional        1, 3, 0
-  LoadConstant         r1, CP#5
-  LoadConstant         r2, CP#5
-  LoadConstant         r3, CP#5
-  Frame                6
-  Push                 r0
-  LoadFieldTOS         CP#6
-  PopLocal             r4
-  CheckStack           0
-  Push                 r4
-  LoadContextVar       0, 0
-  StoreLocal           r5
-  PushInt              0
-  JumpIfNeStrict       L1
-  Push                 r4
-  Push                 r4
-  StoreContextVar      0, 8
-Try #0 start:
-  Push                 r4
-  PushInt              1
-  StoreContextVar      0, 0
-  Push                 r4
-  Push                 r4
-  StoreContextVar      0, 7
-  Push                 r4
-  LoadContextVar       0, 2
-  Push                 r4
-  LoadContextVar       0, 5
-  Push                 r4
-  LoadContextVar       0, 6
-  Push                 r4
-  LoadContextVar       0, 10
-  DirectCall           CP#8, 4
-  PopLocal             r8
-  PushNull
-  ReturnTOS
-L6:
-  Push                 r2
-  JumpIfNull           L2
-  Push                 r2
-  Push                 r3
-  Throw                1
-L2:
-  Push                 r4
-  Push                 r1
-  StoreContextVar      0, 9
-  Push                 r4
-  PushInt              2
-  StoreContextVar      0, 0
-  Push                 r4
-  Push                 r4
-  StoreContextVar      0, 7
-  Push                 r4
-  LoadContextVar       0, 3
-  Push                 r4
-  LoadContextVar       0, 5
-  Push                 r4
-  LoadContextVar       0, 6
-  Push                 r4
-  LoadContextVar       0, 10
-  DirectCall           CP#8, 4
-  PopLocal             r9
-  PushNull
-  ReturnTOS
-L7:
-  Push                 r2
-  JumpIfNull           L3
-  Push                 r2
-  Push                 r3
-  Throw                1
-L3:
-  Push                 r4
-  Push                 r4
-  LoadContextVar       0, 9
-  Push                 r1
-  AddInt
-  StoreContextVar      0, 4
-  Jump                 L4
-L4:
-  Push                 r4
-  LoadContextVar       0, 1
-  Push                 r4
-  LoadContextVar       0, 4
-  DirectCall           CP#10, 2
-  Drop1
-  PushNull
-  ReturnTOS
-Try #0 end:
-Try #0 handler:
-  SetFrame             10
-  Push                 r0
-  LoadFieldTOS         CP#6
-  PopLocal             r4
-  Push                 r4
-  LoadContextVar       0, 8
-  PopLocal             r4
-  MoveSpecial          exception, r6
-  MoveSpecial          stackTrace, r7
-  Push                 r6
-  PopLocal             r8
-  Push                 r7
-  PopLocal             r9
-  Push                 r4
-  LoadContextVar       0, 1
-  Push                 r8
-  Push                 r9
-  InterfaceCall        CP#13, 3
-  Drop1
-  Jump                 L5
-L5:
-  PushNull
-  ReturnTOS
-L1:
-  Push                 r4
-  LoadContextVar       0, 7
-  PopLocal             r4
-  Push                 r5
-  PushInt              1
-  JumpIfEqStrict       L6
-  Jump                 L7
-}
-
-
-Function 'loops', static, reflectable, async
-    parameters [dart:core::List < dart:core::int* >* 'list'] (required: 1)
-    return-type dart:async::Future < dart:core::int* >*
-
-Bytecode {
-  Entry                4
-  CheckStack           0
-  AllocateContext      0, 11
-  PopLocal             r0
-  Push                 r0
-  Push                 FP[-5]
-  StoreContextVar      0, 2
-  Push                 r0
-  PushConstant         CP#1
-  PushConstant         CP#0
-  AllocateT
-  StoreLocal           r2
-  Push                 r2
-  DirectCall           CP#2, 1
-  Drop1
-  StoreContextVar      0, 1
-  PushNull
-  PopLocal             r3
-  Push                 r0
-  PushInt              0
-  StoreContextVar      0, 0
-  Push                 r0
-  AllocateClosure      CP#4
-  StoreLocal           r2
-  Push                 r2
-  PushNull
-  StoreFieldTOS        CP#24
-  Push                 r2
-  PushNull
-  StoreFieldTOS        CP#26
-  Push                 r2
-  PushConstant         CP#4
-  StoreFieldTOS        CP#28
-  Push                 r2
-  Push                 r0
-  StoreFieldTOS        CP#6
-  StoreContextVar      0, 10
-  PushNull
-  PopLocal             r3
-  Push                 r0
-  Push                 r0
-  LoadContextVar       0, 10
-  DirectCall           CP#30, 1
-  StoreContextVar      0, 4
-  Push                 r0
-  Push                 r0
-  LoadContextVar       0, 10
-  DirectCall           CP#32, 1
-  StoreContextVar      0, 5
-  Push                 r0
-  LoadContextVar       0, 1
-  Push                 r0
-  LoadContextVar       0, 10
-  InterfaceCall        CP#34, 2
-  Drop1
-  Push                 r0
-  LoadContextVar       0, 1
-  InterfaceCall        CP#36, 1
-  ReturnTOS
-}
-ConstantPool {
-  [0] = Class dart:async::_AsyncAwaitCompleter
-  [1] = ObjectRef < dart:core::int* >
-  [2] = DirectCall 'dart:async::_AsyncAwaitCompleter:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
-  [3] = Reserved
-  [4] = ClosureFunction 0
-  [5] = ObjectRef null
-  [6] = InstanceField dart:core::_Closure::_context (field)
-  [7] = Reserved
-  [8] = InterfaceCall 'dart:core::Iterable::get:iterator', ArgDesc num-args 1, num-type-args 0, names []
-  [9] = Reserved
-  [10] = InterfaceCall 'dart:core::Iterator::moveNext', ArgDesc num-args 1, num-type-args 0, names []
-  [11] = Reserved
-  [12] = InterfaceCall 'dart:core::Iterator::get:current', ArgDesc num-args 1, num-type-args 0, names []
-  [13] = Reserved
-  [14] = DirectCall '#lib::foo', ArgDesc num-args 0, num-type-args 0, names []
-  [15] = Reserved
-  [16] = DirectCall 'dart:async::_awaitHelper', ArgDesc num-args 4, num-type-args 0, names []
-  [17] = Reserved
-  [18] = DirectCall 'dart:async::_completeOnAsyncReturn', ArgDesc num-args 2, num-type-args 0, names []
-  [19] = Reserved
-  [20] = Type dynamic
-  [21] = InterfaceCall 'dart:async::Completer::completeError', ArgDesc num-args 3, num-type-args 0, names []
-  [22] = Reserved
-  [23] = EndClosureFunctionScope
-  [24] = InstanceField dart:core::_Closure::_instantiator_type_arguments (field)
-  [25] = Reserved
-  [26] = InstanceField dart:core::_Closure::_function_type_arguments (field)
-  [27] = Reserved
-  [28] = InstanceField dart:core::_Closure::_function (field)
-  [29] = Reserved
-  [30] = DirectCall 'dart:async::_asyncThenWrapperHelper', ArgDesc num-args 1, num-type-args 0, names []
-  [31] = Reserved
-  [32] = DirectCall 'dart:async::_asyncErrorWrapperHelper', ArgDesc num-args 1, num-type-args 0, names []
-  [33] = Reserved
-  [34] = InterfaceCall 'dart:async::_AsyncAwaitCompleter::start', ArgDesc num-args 2, num-type-args 0, names []
-  [35] = Reserved
-  [36] = InterfaceCall 'dart:async::Completer::get:future', ArgDesc num-args 1, num-type-args 0, names []
-  [37] = Reserved
-}
-Closure #lib::loops::':async_op' ([ dynamic :result, dynamic :exception, dynamic :stack_trace ]) -> dynamic
-ClosureCode {
-  EntryOptional        1, 3, 0
-  LoadConstant         r1, CP#5
-  LoadConstant         r2, CP#5
-  LoadConstant         r3, CP#5
-  Frame                6
-  Push                 r0
-  LoadFieldTOS         CP#6
-  PopLocal             r4
-  CheckStack           0
-  Push                 r4
-  LoadContextVar       0, 0
-  StoreLocal           r5
-  PushInt              0
-  JumpIfNeStrict       L1
-  Push                 r4
-  Push                 r4
-  StoreContextVar      0, 7
-Try #0 start:
-  AllocateContext      1, 1
-  StoreLocal           r5
-  Push                 r5
-  Push                 r4
-  StoreContextParent
-  PopLocal             r4
-  Push                 r4
-  PushInt              0
-  StoreContextVar      1, 0
-  AllocateContext      2, 2
-  StoreLocal           r5
-  Push                 r5
-  Push                 r4
-  StoreContextParent
-  PopLocal             r4
-  Push                 r4
-  PushInt              0
-  StoreContextVar      2, 0
-L6:
-  CheckStack           1
-  Push                 r4
-  LoadContextVar       2, 0
-  PushInt              10
-  CompareIntLt
-  JumpIfFalse          L2
-  Push                 r4
-  Push                 r4
-  LoadContextParent
-  LoadContextParent
-  LoadContextVar       0, 2
-  InterfaceCall        CP#8, 1
-  StoreContextVar      2, 1
-L5:
-  CheckStack           2
-  Push                 r4
-  LoadContextVar       2, 1
-  InterfaceCall        CP#10, 1
-  AssertBoolean        0
-  JumpIfFalse          L3
-  AllocateContext      3, 1
-  StoreLocal           r5
-  Push                 r5
-  Push                 r4
-  StoreContextParent
-  PopLocal             r4
-  Push                 r4
-  Push                 r4
-  LoadContextParent
-  LoadContextVar       2, 1
-  InterfaceCall        CP#12, 1
-  StoreContextVar      3, 0
-  Push                 r4
-  LoadContextParent
-  LoadContextParent
-  LoadContextParent
-  Push                 r4
-  LoadContextParent
-  LoadContextParent
-  LoadContextVar       1, 0
-  StoreContextVar      0, 9
-  Push                 r4
-  LoadContextParent
-  LoadContextParent
-  LoadContextParent
-  Push                 r4
-  LoadContextParent
-  LoadContextVar       2, 0
-  Push                 r4
-  LoadContextVar       3, 0
-  AddInt
-  StoreContextVar      0, 8
-  Push                 r4
-  LoadContextParent
-  LoadContextParent
-  LoadContextParent
-  PushInt              1
-  StoreContextVar      0, 0
-  Push                 r4
-  LoadContextParent
-  LoadContextParent
-  LoadContextParent
-  Push                 r4
-  StoreContextVar      0, 6
-  DirectCall           CP#14, 0
-  Push                 r4
-  LoadContextParent
-  LoadContextParent
-  LoadContextParent
-  LoadContextVar       0, 4
-  Push                 r4
-  LoadContextParent
-  LoadContextParent
-  LoadContextParent
-  LoadContextVar       0, 5
-  Push                 r4
-  LoadContextParent
-  LoadContextParent
-  LoadContextParent
-  LoadContextVar       0, 10
-  DirectCall           CP#16, 4
-  PopLocal             r9
-  PushNull
-  ReturnTOS
-L11:
-  Push                 r2
-  JumpIfNull           L4
-  Push                 r2
-  Push                 r3
-  Throw                1
-L4:
-  Push                 r4
-  LoadContextParent
-  LoadContextParent
-  Push                 r4
-  LoadContextParent
-  LoadContextParent
-  LoadContextParent
-  LoadContextVar       0, 9
-  Push                 r4
-  LoadContextParent
-  LoadContextParent
-  LoadContextParent
-  LoadContextVar       0, 8
-  Push                 r1
-  AddInt
-  AddInt
-  StoreContextVar      1, 0
-  Push                 r4
-  LoadContextParent
-  PopLocal             r4
-  Jump                 L5
-L3:
-  Push                 r4
-  CloneContext         2, 2
-  PopLocal             r4
-  Push                 r4
-  Push                 r4
-  LoadContextVar       2, 0
-  PushInt              1
-  AddInt
-  StoreLocal           r8
-  StoreContextVar      2, 0
-  Push                 r8
-  Drop1
-  Jump                 L6
-L2:
-  Push                 r4
-  LoadContextParent
-  PopLocal             r4
-  PushInt              0
-  PopLocal             r8
-L8:
-  CheckStack           1
-  Push                 r8
-  PushInt              10
-  CompareIntLt
-  JumpIfFalse          L7
-  Push                 r4
-  Push                 r4
-  LoadContextVar       1, 0
-  Push                 r8
-  AddInt
-  StoreContextVar      1, 0
-  Push                 r8
-  PushInt              1
-  AddInt
-  StoreLocal           r8
-  Drop1
-  Jump                 L8
-L7:
-  Push                 r4
-  LoadContextParent
-  Push                 r4
-  LoadContextVar       1, 0
-  StoreContextVar      0, 3
-  Push                 r4
-  LoadContextParent
-  PopLocal             r4
-  Jump                 L9
-L9:
-  Push                 r4
-  LoadContextVar       0, 1
-  Push                 r4
-  LoadContextVar       0, 3
-  DirectCall           CP#18, 2
-  Drop1
-  PushNull
-  ReturnTOS
-Try #0 end:
-Try #0 handler:
-  SetFrame             10
-  Push                 r0
-  LoadFieldTOS         CP#6
-  PopLocal             r4
-  Push                 r4
-  LoadContextVar       0, 7
-  PopLocal             r4
-  MoveSpecial          exception, r6
-  MoveSpecial          stackTrace, r7
-  Push                 r6
-  PopLocal             r8
-  Push                 r7
-  PopLocal             r9
-  Push                 r4
-  LoadContextVar       0, 1
-  Push                 r8
-  Push                 r9
-  InterfaceCall        CP#21, 3
-  Drop1
-  Jump                 L10
-L10:
-  PushNull
-  ReturnTOS
-L1:
-  Push                 r4
-  LoadContextVar       0, 6
-  PopLocal             r4
-  Jump                 L11
-}
-
-
-Function 'tryCatchRethrow', static, reflectable, async
-    parameters [dart:async::Future < dart:core::int* >* 'a', dart:async::Future < dart:core::int* >* 'b', dart:async::Future < dart:core::int* >* 'c'] (required: 3)
-    return-type dart:async::Future < dart:core::int* >*
-
-Bytecode {
-  Entry                4
-  CheckStack           0
-  AllocateContext      0, 18
-  PopLocal             r0
-  Push                 r0
-  Push                 FP[-7]
-  StoreContextVar      0, 2
-  Push                 r0
-  Push                 FP[-6]
-  StoreContextVar      0, 3
-  Push                 r0
-  Push                 FP[-5]
-  StoreContextVar      0, 4
-  Push                 r0
-  PushConstant         CP#1
-  PushConstant         CP#0
-  AllocateT
-  StoreLocal           r2
-  Push                 r2
-  DirectCall           CP#2, 1
-  Drop1
-  StoreContextVar      0, 1
-  PushNull
-  PopLocal             r3
-  Push                 r0
-  PushInt              0
-  StoreContextVar      0, 0
-  Push                 r0
-  AllocateClosure      CP#4
-  StoreLocal           r2
-  Push                 r2
-  PushNull
-  StoreFieldTOS        CP#22
-  Push                 r2
-  PushNull
-  StoreFieldTOS        CP#24
-  Push                 r2
-  PushConstant         CP#4
-  StoreFieldTOS        CP#26
-  Push                 r2
-  Push                 r0
-  StoreFieldTOS        CP#6
-  StoreContextVar      0, 17
-  PushNull
-  PopLocal             r3
-  Push                 r0
-  Push                 r0
-  LoadContextVar       0, 17
-  DirectCall           CP#28, 1
-  StoreContextVar      0, 6
-  Push                 r0
-  Push                 r0
-  LoadContextVar       0, 17
-  DirectCall           CP#30, 1
-  StoreContextVar      0, 7
-  Push                 r0
-  LoadContextVar       0, 1
-  Push                 r0
-  LoadContextVar       0, 17
-  InterfaceCall        CP#32, 2
-  Drop1
-  Push                 r0
-  LoadContextVar       0, 1
-  InterfaceCall        CP#34, 1
-  ReturnTOS
-}
-ConstantPool {
-  [0] = Class dart:async::_AsyncAwaitCompleter
-  [1] = ObjectRef < dart:core::int* >
-  [2] = DirectCall 'dart:async::_AsyncAwaitCompleter:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
-  [3] = Reserved
-  [4] = ClosureFunction 0
-  [5] = ObjectRef null
-  [6] = InstanceField dart:core::_Closure::_context (field)
-  [7] = Reserved
-  [8] = DirectCall 'dart:async::_awaitHelper', ArgDesc num-args 4, num-type-args 0, names []
-  [9] = Reserved
-  [10] = Type dynamic
-  [11] = Type dart:core::Error*
-  [12] = InterfaceCall 'dart:core::Object::_simpleInstanceOf', ArgDesc num-args 2, num-type-args 0, names []
-  [13] = Reserved
-  [14] = ObjectRef 'fin'
-  [15] = DirectCall 'dart:core::print', ArgDesc num-args 1, num-type-args 0, names []
-  [16] = Reserved
-  [17] = DirectCall 'dart:async::_completeOnAsyncReturn', ArgDesc num-args 2, num-type-args 0, names []
-  [18] = Reserved
-  [19] = InterfaceCall 'dart:async::Completer::completeError', ArgDesc num-args 3, num-type-args 0, names []
-  [20] = Reserved
-  [21] = EndClosureFunctionScope
-  [22] = InstanceField dart:core::_Closure::_instantiator_type_arguments (field)
-  [23] = Reserved
-  [24] = InstanceField dart:core::_Closure::_function_type_arguments (field)
-  [25] = Reserved
-  [26] = InstanceField dart:core::_Closure::_function (field)
-  [27] = Reserved
-  [28] = DirectCall 'dart:async::_asyncThenWrapperHelper', ArgDesc num-args 1, num-type-args 0, names []
-  [29] = Reserved
-  [30] = DirectCall 'dart:async::_asyncErrorWrapperHelper', ArgDesc num-args 1, num-type-args 0, names []
-  [31] = Reserved
-  [32] = InterfaceCall 'dart:async::_AsyncAwaitCompleter::start', ArgDesc num-args 2, num-type-args 0, names []
-  [33] = Reserved
-  [34] = InterfaceCall 'dart:async::Completer::get:future', ArgDesc num-args 1, num-type-args 0, names []
-  [35] = Reserved
-}
-Closure #lib::tryCatchRethrow::':async_op' ([ dynamic :result, dynamic :exception, dynamic :stack_trace ]) -> dynamic
-ClosureCode {
-  EntryOptional        1, 3, 0
-  LoadConstant         r1, CP#5
-  LoadConstant         r2, CP#5
-  LoadConstant         r3, CP#5
-  Frame                10
-  Push                 r0
-  LoadFieldTOS         CP#6
-  PopLocal             r4
-  CheckStack           0
-  Push                 r4
-  LoadContextVar       0, 0
-  StoreLocal           r5
-  PushInt              0
-  JumpIfNeStrict       L1
-  Push                 r4
-  Push                 r4
-  StoreContextVar      0, 9
-Try #0 start:
-  AllocateContext      1, 2
-  StoreLocal           r5
-  Push                 r5
-  Push                 r4
-  StoreContextParent
-  PopLocal             r4
-  Push                 r4
-  PushInt              1
-  StoreContextVar      1, 0
-  Push                 r4
-  LoadContextParent
-  Push                 r4
-  StoreContextVar      0, 10
-Try #1 start:
-  Push                 r4
-  LoadContextParent
-  Push                 r4
-  StoreContextVar      0, 11
-Try #2 start:
-  Push                 r4
-  LoadContextParent
-  Push                 r4
-  LoadContextVar       1, 0
-  StoreContextVar      0, 14
-  Push                 r4
-  LoadContextParent
-  PushInt              1
-  StoreContextVar      0, 0
-  Push                 r4
-  LoadContextParent
-  Push                 r4
-  StoreContextVar      0, 8
-  Push                 r4
-  LoadContextParent
-  LoadContextVar       0, 2
-  Push                 r4
-  LoadContextParent
-  LoadContextVar       0, 6
-  Push                 r4
-  LoadContextParent
-  LoadContextVar       0, 7
-  Push                 r4
-  LoadContextParent
-  LoadContextVar       0, 17
-  DirectCall           CP#8, 4
-  PopLocal             r13
-  PushNull
-  ReturnTOS
-L13:
-  Push                 r2
-  JumpIfNull           L2
-  Push                 r2
-  Push                 r3
-  Throw                1
-L2:
-  Push                 r4
-  Push                 r4
-  LoadContextParent
-  LoadContextVar       0, 14
-  Push                 r1
-  AddInt
-  StoreContextVar      1, 0
-  Jump                 L3
-Try #2 end:
-Try #2 handler:
-  SetFrame             14
-  Push                 r0
-  LoadFieldTOS         CP#6
-  PopLocal             r4
-  Push                 r4
-  LoadContextVar       0, 11
-  PopLocal             r4
-  MoveSpecial          exception, r10
-  MoveSpecial          stackTrace, r11
-  Push                 r4
-  LoadContextParent
-  Push                 r10
-  StoreContextVar      0, 12
-  Push                 r4
-  LoadContextParent
-  Push                 r11
-  StoreContextVar      0, 13
-  Push                 r4
-  Push                 r10
-  StoreContextVar      1, 1
-  Push                 r4
-  LoadContextVar       1, 1
-  PushConstant         CP#11
-  InterfaceCall        CP#12, 2
-  JumpIfFalse          L4
-  Push                 r4
-  LoadContextParent
-  PushInt              42
-  StoreContextVar      0, 5
-  Jump                 L5
-L4:
-  Push                 r4
-  LoadContextParent
-  Push                 r4
-  LoadContextVar       1, 0
-  StoreContextVar      0, 15
-  Push                 r4
-  LoadContextParent
-  PushInt              2
-  StoreContextVar      0, 0
-  Push                 r4
-  LoadContextParent
-  Push                 r4
-  StoreContextVar      0, 8
-  Push                 r4
-  LoadContextParent
-  LoadContextVar       0, 3
-  Push                 r4
-  LoadContextParent
-  LoadContextVar       0, 6
-  Push                 r4
-  LoadContextParent
-  LoadContextVar       0, 7
-  Push                 r4
-  LoadContextParent
-  LoadContextVar       0, 17
-  DirectCall           CP#8, 4
-  PopLocal             r13
-  PushNull
-  ReturnTOS
-L14:
-  Push                 r2
-  JumpIfNull           L6
-  Push                 r2
-  Push                 r3
-  Throw                1
-L6:
-  Push                 r4
-  Push                 r4
-  LoadContextParent
-  LoadContextVar       0, 15
-  Push                 r1
-  AddInt
-  StoreContextVar      1, 0
-  Push                 r4
-  LoadContextParent
-  LoadContextVar       0, 12
-  Push                 r4
-  LoadContextParent
-  LoadContextVar       0, 13
-  Throw                1
-L3:
-  Jump                 L7
-Try #1 end:
-Try #1 handler:
-  SetFrame             14
-  Push                 r0
-  LoadFieldTOS         CP#6
-  PopLocal             r4
-  Push                 r4
-  LoadContextVar       0, 10
-  PopLocal             r4
-  MoveSpecial          exception, r8
-  MoveSpecial          stackTrace, r9
-  Push                 r4
-  LoadContextParent
-  Push                 r8
-  StoreContextVar      0, 12
-  Push                 r4
-  LoadContextParent
-  Push                 r9
-  StoreContextVar      0, 13
-  PushConstant         CP#14
-  DirectCall           CP#15, 1
-  Drop1
-  Push                 r4
-  LoadContextParent
-  Push                 r4
-  LoadContextVar       1, 0
-  StoreContextVar      0, 16
-  Push                 r4
-  LoadContextParent
-  PushInt              3
-  StoreContextVar      0, 0
-  Push                 r4
-  LoadContextParent
-  Push                 r4
-  StoreContextVar      0, 8
-  Push                 r4
-  LoadContextParent
-  LoadContextVar       0, 4
-  Push                 r4
-  LoadContextParent
-  LoadContextVar       0, 6
-  Push                 r4
-  LoadContextParent
-  LoadContextVar       0, 7
-  Push                 r4
-  LoadContextParent
-  LoadContextVar       0, 17
-  DirectCall           CP#8, 4
-  PopLocal             r12
-  PushNull
-  ReturnTOS
-L15:
-  Push                 r2
-  JumpIfNull           L8
-  Push                 r2
-  Push                 r3
-  Throw                1
-L8:
-  Push                 r4
-  Push                 r4
-  LoadContextParent
-  LoadContextVar       0, 16
-  Push                 r1
-  AddInt
-  StoreContextVar      1, 0
-  Push                 r4
-  LoadContextParent
-  Push                 r4
-  LoadContextVar       1, 0
-  StoreContextVar      0, 5
-  Push                 r4
-  LoadContextParent
-  PopLocal             r4
-  Jump                 L9
-L5:
-  Push                 r0
-  LoadFieldTOS         CP#6
-  PopLocal             r4
-  Push                 r4
-  LoadContextVar       0, 10
-  PopLocal             r4
-  PushConstant         CP#14
-  DirectCall           CP#15, 1
-  Drop1
-  Push                 r4
-  LoadContextParent
-  Push                 r4
-  LoadContextVar       1, 0
-  StoreContextVar      0, 16
-  Push                 r4
-  LoadContextParent
-  PushInt              4
-  StoreContextVar      0, 0
-  Push                 r4
-  LoadContextParent
-  Push                 r4
-  StoreContextVar      0, 8
-  Push                 r4
-  LoadContextParent
-  LoadContextVar       0, 4
-  Push                 r4
-  LoadContextParent
-  LoadContextVar       0, 6
-  Push                 r4
-  LoadContextParent
-  LoadContextVar       0, 7
-  Push                 r4
-  LoadContextParent
-  LoadContextVar       0, 17
-  DirectCall           CP#8, 4
-  PopLocal             r12
-  PushNull
-  ReturnTOS
-L16:
-  Push                 r2
-  JumpIfNull           L10
-  Push                 r2
-  Push                 r3
-  Throw                1
-L10:
-  Push                 r4
-  Push                 r4
-  LoadContextParent
-  LoadContextVar       0, 16
-  Push                 r1
-  AddInt
-  StoreContextVar      1, 0
-  Push                 r4
-  LoadContextParent
-  Push                 r4
-  LoadContextVar       1, 0
-  StoreContextVar      0, 5
-  Push                 r4
-  LoadContextParent
-  PopLocal             r4
-  Jump                 L9
-L7:
-  Push                 r0
-  LoadFieldTOS         CP#6
-  PopLocal             r4
-  Push                 r4
-  LoadContextVar       0, 10
-  PopLocal             r4
-  PushConstant         CP#14
-  DirectCall           CP#15, 1
-  Drop1
-  Push                 r4
-  LoadContextParent
-  Push                 r4
-  LoadContextVar       1, 0
-  StoreContextVar      0, 16
-  Push                 r4
-  LoadContextParent
-  PushInt              5
-  StoreContextVar      0, 0
-  Push                 r4
-  LoadContextParent
-  Push                 r4
-  StoreContextVar      0, 8
-  Push                 r4
-  LoadContextParent
-  LoadContextVar       0, 4
-  Push                 r4
-  LoadContextParent
-  LoadContextVar       0, 6
-  Push                 r4
-  LoadContextParent
-  LoadContextVar       0, 7
-  Push                 r4
-  LoadContextParent
-  LoadContextVar       0, 17
-  DirectCall           CP#8, 4
-  PopLocal             r12
-  PushNull
-  ReturnTOS
-L17:
-  Push                 r2
-  JumpIfNull           L11
-  Push                 r2
-  Push                 r3
-  Throw                1
-L11:
-  Push                 r4
-  Push                 r4
-  LoadContextParent
-  LoadContextVar       0, 16
-  Push                 r1
-  AddInt
-  StoreContextVar      1, 0
-  Push                 r4
-  LoadContextParent
-  Push                 r4
-  LoadContextVar       1, 0
-  StoreContextVar      0, 5
-  Push                 r4
-  LoadContextParent
-  PopLocal             r4
-  Jump                 L9
-L9:
-  Push                 r4
-  LoadContextVar       0, 1
-  Push                 r4
-  LoadContextVar       0, 5
-  DirectCall           CP#17, 2
-  Drop1
-  PushNull
-  ReturnTOS
-Try #0 end:
-Try #0 handler:
-  SetFrame             14
-  Push                 r0
-  LoadFieldTOS         CP#6
-  PopLocal             r4
-  Push                 r4
-  LoadContextVar       0, 9
-  PopLocal             r4
-  MoveSpecial          exception, r6
-  MoveSpecial          stackTrace, r7
-  Push                 r6
-  PopLocal             r8
-  Push                 r7
-  PopLocal             r9
-  Push                 r4
-  LoadContextVar       0, 1
-  Push                 r8
-  Push                 r9
-  InterfaceCall        CP#19, 3
-  Drop1
-  Jump                 L12
-L12:
-  PushNull
-  ReturnTOS
-L1:
-  Push                 r4
-  LoadContextVar       0, 8
-  PopLocal             r4
-  Push                 r5
-  PushInt              1
-  JumpIfEqStrict       L13
-  Push                 r5
-  PushInt              2
-  JumpIfEqStrict       L14
-  Push                 r5
-  PushInt              3
-  JumpIfEqStrict       L15
-  Push                 r5
-  PushInt              4
-  JumpIfEqStrict       L16
-  Jump                 L17
-}
-
-
-Function 'closure', static, reflectable, debuggable
-    parameters [dart:async::Future < dart:core::int* >* 'a'] (required: 1)
-    return-type dynamic
-
-Bytecode {
-  Entry                4
-  CheckStack           0
-  AllocateContext      0, 2
-  PopLocal             r0
-  Push                 r0
-  Push                 FP[-5]
-  StoreContextVar      0, 0
-  Push                 r0
-  PushInt              3
-  StoreContextVar      0, 1
-  AllocateClosure      CP#0
-  StoreLocal           r3
-  Push                 r3
-  PushNull
-  StoreFieldTOS        CP#20
-  Push                 r3
-  PushNull
-  StoreFieldTOS        CP#22
-  Push                 r3
-  PushConstant         CP#0
-  StoreFieldTOS        CP#24
-  Push                 r3
-  Push                 r0
-  StoreFieldTOS        CP#1
-  PopLocal             r2
-  Push                 r2
-  ReturnTOS
-}
-ConstantPool {
-  [0] = ClosureFunction 0
-  [1] = InstanceField dart:core::_Closure::_context (field)
-  [2] = Reserved
-  [3] = Class dart:async::_AsyncAwaitCompleter
-  [4] = ObjectRef < dart:core::int* >
-  [5] = DirectCall 'dart:async::_AsyncAwaitCompleter:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
-  [6] = Reserved
-  [7] = ClosureFunction 1
-  [8] = ObjectRef null
-  [9] = DirectCall 'dart:async::_awaitHelper', ArgDesc num-args 4, num-type-args 0, names []
-  [10] = Reserved
-  [11] = Type dynamic
-  [12] = ObjectRef 'fin'
-  [13] = DirectCall 'dart:core::print', ArgDesc num-args 1, num-type-args 0, names []
-  [14] = Reserved
-  [15] = DirectCall 'dart:async::_completeOnAsyncReturn', ArgDesc num-args 2, num-type-args 0, names []
-  [16] = Reserved
-  [17] = InterfaceCall 'dart:async::Completer::completeError', ArgDesc num-args 3, num-type-args 0, names []
-  [18] = Reserved
-  [19] = EndClosureFunctionScope
-  [20] = InstanceField dart:core::_Closure::_instantiator_type_arguments (field)
-  [21] = Reserved
-  [22] = InstanceField dart:core::_Closure::_function_type_arguments (field)
-  [23] = Reserved
-  [24] = InstanceField dart:core::_Closure::_function (field)
-  [25] = Reserved
-  [26] = DirectCall 'dart:async::_asyncThenWrapperHelper', ArgDesc num-args 1, num-type-args 0, names []
-  [27] = Reserved
-  [28] = DirectCall 'dart:async::_asyncErrorWrapperHelper', ArgDesc num-args 1, num-type-args 0, names []
-  [29] = Reserved
-  [30] = InterfaceCall 'dart:async::_AsyncAwaitCompleter::start', ArgDesc num-args 2, num-type-args 0, names []
-  [31] = Reserved
-  [32] = InterfaceCall 'dart:async::Completer::get:future', ArgDesc num-args 1, num-type-args 0, names []
-  [33] = Reserved
-  [34] = EndClosureFunctionScope
-}
-Closure #lib::closure::'nested' async () -> dart:async::Future < dart:core::int* >*
-ClosureCode {
-  Entry                4
-  Push                 FP[-5]
-  LoadFieldTOS         CP#1
-  PopLocal             r0
-  CheckStack           0
-  AllocateContext      1, 9
-  StoreLocal           r1
-  Push                 r1
-  Push                 r0
-  StoreContextParent
-  PopLocal             r0
-  Push                 r0
-  PushConstant         CP#4
-  PushConstant         CP#3
-  AllocateT
-  StoreLocal           r2
-  Push                 r2
-  DirectCall           CP#5, 1
-  Drop1
-  StoreContextVar      1, 1
-  PushNull
-  PopLocal             r3
-  Push                 r0
-  PushInt              0
-  StoreContextVar      1, 0
-  Push                 r0
-  AllocateClosure      CP#7
-  StoreLocal           r2
-  Push                 r2
-  PushNull
-  StoreFieldTOS        CP#20
-  Push                 r2
-  PushNull
-  StoreFieldTOS        CP#22
-  Push                 r2
-  PushConstant         CP#7
-  StoreFieldTOS        CP#24
-  Push                 r2
-  Push                 r0
-  StoreFieldTOS        CP#1
-  StoreContextVar      1, 8
-  PushNull
-  PopLocal             r3
-  Push                 r0
-  Push                 r0
-  LoadContextVar       1, 8
-  DirectCall           CP#26, 1
-  StoreContextVar      1, 3
-  Push                 r0
-  Push                 r0
-  LoadContextVar       1, 8
-  DirectCall           CP#28, 1
-  StoreContextVar      1, 4
-  Push                 r0
-  LoadContextVar       1, 1
-  Push                 r0
-  LoadContextVar       1, 8
-  InterfaceCall        CP#30, 2
-  Drop1
-  Push                 r0
-  LoadContextVar       1, 1
-  InterfaceCall        CP#32, 1
-  ReturnTOS
-}
-
-Closure #lib::closure::Closure/0::':async_op' ([ dynamic :result, dynamic :exception, dynamic :stack_trace ]) -> dynamic
-ClosureCode {
-  EntryOptional        1, 3, 0
-  LoadConstant         r1, CP#8
-  LoadConstant         r2, CP#8
-  LoadConstant         r3, CP#8
-  Frame                8
-  Push                 r0
-  LoadFieldTOS         CP#1
-  PopLocal             r4
-  CheckStack           0
-  Push                 r4
-  LoadContextVar       1, 0
-  StoreLocal           r5
-  PushInt              0
-  JumpIfNeStrict       L1
-  Push                 r4
-  Push                 r4
-  StoreContextVar      1, 6
-Try #0 start:
-  AllocateContext      2, 1
-  StoreLocal           r5
-  Push                 r5
-  Push                 r4
-  StoreContextParent
-  PopLocal             r4
-  Push                 r4
-  PushInt              4
-  StoreContextVar      2, 0
-  Push                 r4
-  LoadContextParent
-  Push                 r4
-  StoreContextVar      1, 7
-Try #1 start:
-  Push                 r4
-  LoadContextParent
-  LoadContextParent
-  PushInt              5
-  StoreContextVar      0, 1
-  Push                 r4
-  LoadContextParent
-  PushInt              1
-  StoreContextVar      1, 0
-  Push                 r4
-  LoadContextParent
-  Push                 r4
-  StoreContextVar      1, 5
-  Push                 r4
-  LoadContextParent
-  LoadContextParent
-  LoadContextVar       0, 0
-  Push                 r4
-  LoadContextParent
-  LoadContextVar       1, 3
-  Push                 r4
-  LoadContextParent
-  LoadContextVar       1, 4
-  Push                 r4
-  LoadContextParent
-  LoadContextVar       1, 8
-  DirectCall           CP#9, 4
-  PopLocal             r11
-  PushNull
-  ReturnTOS
-L6:
-  Push                 r2
-  JumpIfNull           L2
-  Push                 r2
-  Push                 r3
-  Throw                1
-L2:
-  Push                 r4
-  Push                 r1
-  StoreContextVar      2, 0
-  Push                 r4
-  LoadContextParent
-  Push                 r4
-  LoadContextParent
-  LoadContextParent
-  LoadContextVar       0, 1
-  Push                 r4
-  LoadContextVar       2, 0
-  AddInt
-  StoreContextVar      1, 2
-  Jump                 L3
-Try #1 end:
-Try #1 handler:
-  SetFrame             12
-  Push                 r0
-  LoadFieldTOS         CP#1
-  PopLocal             r4
-  Push                 r4
-  LoadContextVar       1, 7
-  PopLocal             r4
-  MoveSpecial          exception, r8
-  MoveSpecial          stackTrace, r9
-  PushConstant         CP#12
-  DirectCall           CP#13, 1
-  Drop1
-  Push                 r8
-  Push                 r9
-  Throw                1
-L3:
-  Push                 r0
-  LoadFieldTOS         CP#1
-  PopLocal             r4
-  Push                 r4
-  LoadContextVar       1, 7
-  PopLocal             r4
-  PushConstant         CP#12
-  DirectCall           CP#13, 1
-  Drop1
-  Push                 r4
-  LoadContextParent
-  PopLocal             r4
-  Jump                 L4
-L4:
-  Push                 r4
-  LoadContextVar       1, 1
-  Push                 r4
-  LoadContextVar       1, 2
-  DirectCall           CP#15, 2
-  Drop1
-  PushNull
-  ReturnTOS
-Try #0 end:
-Try #0 handler:
-  SetFrame             12
-  Push                 r0
-  LoadFieldTOS         CP#1
-  PopLocal             r4
-  Push                 r4
-  LoadContextVar       1, 6
-  PopLocal             r4
-  MoveSpecial          exception, r6
-  MoveSpecial          stackTrace, r7
-  Push                 r6
-  PopLocal             r8
-  Push                 r7
-  PopLocal             r9
-  Push                 r4
-  LoadContextVar       1, 1
-  Push                 r8
-  Push                 r9
-  InterfaceCall        CP#17, 3
-  Drop1
-  Jump                 L5
-L5:
-  PushNull
-  ReturnTOS
-L1:
-  Push                 r4
-  LoadContextVar       1, 5
-  PopLocal             r4
-  Jump                 L6
-}
-
-
-Function 'testAssert', static, reflectable, async
-    parameters [dart:async::Future < dart:core::int* >* 'a'] (required: 1)
-    return-type dart:async::Future < dart:core::int* >*
-
-Bytecode {
-  Entry                4
-  CheckStack           0
-  AllocateContext      0, 9
-  PopLocal             r0
-  Push                 r0
-  Push                 FP[-5]
-  StoreContextVar      0, 2
-  Push                 r0
-  PushConstant         CP#1
-  PushConstant         CP#0
-  AllocateT
-  StoreLocal           r2
-  Push                 r2
-  DirectCall           CP#2, 1
-  Drop1
-  StoreContextVar      0, 1
-  PushNull
-  PopLocal             r3
-  Push                 r0
-  PushInt              0
-  StoreContextVar      0, 0
-  Push                 r0
-  AllocateClosure      CP#4
-  StoreLocal           r2
-  Push                 r2
-  PushNull
-  StoreFieldTOS        CP#18
-  Push                 r2
-  PushNull
-  StoreFieldTOS        CP#20
-  Push                 r2
-  PushConstant         CP#4
-  StoreFieldTOS        CP#22
-  Push                 r2
-  Push                 r0
-  StoreFieldTOS        CP#6
-  StoreContextVar      0, 8
-  PushNull
-  PopLocal             r3
-  Push                 r0
-  Push                 r0
-  LoadContextVar       0, 8
-  DirectCall           CP#24, 1
-  StoreContextVar      0, 4
-  Push                 r0
-  Push                 r0
-  LoadContextVar       0, 8
-  DirectCall           CP#26, 1
-  StoreContextVar      0, 5
-  Push                 r0
-  LoadContextVar       0, 1
-  Push                 r0
-  LoadContextVar       0, 8
-  InterfaceCall        CP#28, 2
-  Drop1
-  Push                 r0
-  LoadContextVar       0, 1
-  InterfaceCall        CP#30, 1
-  ReturnTOS
-}
-ConstantPool {
-  [0] = Class dart:async::_AsyncAwaitCompleter
-  [1] = ObjectRef < dart:core::int* >
-  [2] = DirectCall 'dart:async::_AsyncAwaitCompleter:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
-  [3] = Reserved
-  [4] = ClosureFunction 0
-  [5] = ObjectRef null
-  [6] = InstanceField dart:core::_Closure::_context (field)
-  [7] = Reserved
-  [8] = DirectCall 'dart:async::_awaitHelper', ArgDesc num-args 4, num-type-args 0, names []
-  [9] = Reserved
-  [10] = DirectCall 'dart:core::_AssertionError::_throwNew', ArgDesc num-args 3, num-type-args 0, names []
-  [11] = Reserved
-  [12] = DirectCall 'dart:async::_completeOnAsyncReturn', ArgDesc num-args 2, num-type-args 0, names []
-  [13] = Reserved
-  [14] = Type dynamic
-  [15] = InterfaceCall 'dart:async::Completer::completeError', ArgDesc num-args 3, num-type-args 0, names []
-  [16] = Reserved
-  [17] = EndClosureFunctionScope
-  [18] = InstanceField dart:core::_Closure::_instantiator_type_arguments (field)
-  [19] = Reserved
-  [20] = InstanceField dart:core::_Closure::_function_type_arguments (field)
-  [21] = Reserved
-  [22] = InstanceField dart:core::_Closure::_function (field)
-  [23] = Reserved
-  [24] = DirectCall 'dart:async::_asyncThenWrapperHelper', ArgDesc num-args 1, num-type-args 0, names []
-  [25] = Reserved
-  [26] = DirectCall 'dart:async::_asyncErrorWrapperHelper', ArgDesc num-args 1, num-type-args 0, names []
-  [27] = Reserved
-  [28] = InterfaceCall 'dart:async::_AsyncAwaitCompleter::start', ArgDesc num-args 2, num-type-args 0, names []
-  [29] = Reserved
-  [30] = InterfaceCall 'dart:async::Completer::get:future', ArgDesc num-args 1, num-type-args 0, names []
-  [31] = Reserved
-}
-Closure #lib::testAssert::':async_op' ([ dynamic :result, dynamic :exception, dynamic :stack_trace ]) -> dynamic
-ClosureCode {
-  EntryOptional        1, 3, 0
-  LoadConstant         r1, CP#5
-  LoadConstant         r2, CP#5
-  LoadConstant         r3, CP#5
-  Frame                6
-  Push                 r0
-  LoadFieldTOS         CP#6
-  PopLocal             r4
-  CheckStack           0
-  Push                 r4
-  LoadContextVar       0, 0
-  StoreLocal           r5
-  PushInt              0
-  JumpIfNeStrict       L1
-  Push                 r4
-  Push                 r4
-  StoreContextVar      0, 7
-Try #0 start:
-  JumpIfNoAsserts      L2
-  Push                 r4
-  PushInt              1
-  StoreContextVar      0, 0
-  Push                 r4
-  Push                 r4
-  StoreContextVar      0, 6
-  Push                 r4
-  LoadContextVar       0, 2
-  Push                 r4
-  LoadContextVar       0, 4
-  Push                 r4
-  LoadContextVar       0, 5
-  Push                 r4
-  LoadContextVar       0, 8
-  DirectCall           CP#8, 4
-  PopLocal             r8
-  PushNull
-  ReturnTOS
-L6:
-  Push                 r2
-  JumpIfNull           L3
-  Push                 r2
-  Push                 r3
-  Throw                1
-L3:
-  JumpIfNoAsserts      L2
-  Push                 r1
-  PushInt              42
-  CompareIntEq
-  JumpIfTrue           L2
-  PushInt              0
-  PushInt              0
-  PushNull
-  DirectCall           CP#10, 3
-  Drop1
-L2:
-  Push                 r4
-  PushInt              7
-  StoreContextVar      0, 3
-  Jump                 L4
-L4:
-  Push                 r4
-  LoadContextVar       0, 1
-  Push                 r4
-  LoadContextVar       0, 3
-  DirectCall           CP#12, 2
-  Drop1
-  PushNull
-  ReturnTOS
-Try #0 end:
-Try #0 handler:
-  SetFrame             10
-  Push                 r0
-  LoadFieldTOS         CP#6
-  PopLocal             r4
-  Push                 r4
-  LoadContextVar       0, 7
-  PopLocal             r4
-  MoveSpecial          exception, r6
-  MoveSpecial          stackTrace, r7
-  Push                 r6
-  PopLocal             r8
-  Push                 r7
-  PopLocal             r9
-  Push                 r4
-  LoadContextVar       0, 1
-  Push                 r8
-  Push                 r9
-  InterfaceCall        CP#15, 3
-  Drop1
-  Jump                 L5
-L5:
-  PushNull
-  ReturnTOS
-L1:
-  Push                 r4
-  LoadContextVar       0, 6
-  PopLocal             r4
-  Jump                 L6
-}
-
-
-Function 'main', static, reflectable, debuggable
-    parameters [] (required: 0)
-    return-type dynamic
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-}
-
-
-}
-]library #lib from "#lib" as #lib {
-
-  import "dart:async";
-
-  static field (dart.async::Future<dart.core::int*>*) →* dart.async::Future<dart.core::Null?>* asyncInFieldInitializer = (dart.async::Future<dart.core::int*>* x) → dart.async::Future<dart.core::Null?>* /* originally async */ {
-    final dart.async::_AsyncAwaitCompleter<dart.core::Null?>* :async_completer = new dart.async::_AsyncAwaitCompleter::•<dart.core::Null?>();
-    FutureOr<dart.core::Null?>* :return_value;
-    dynamic :async_stack_trace;
-    (dynamic) →* dynamic :async_op_then;
-    (dart.core::Object*, dart.core::StackTrace*) →* dynamic :async_op_error;
-    dart.core::int* :await_jump_var = 0;
-    dynamic :await_ctx_var;
-    dynamic :saved_try_context_var0;
-    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-      try {
-        #L1:
-        {
-          [yield] let dynamic #t1 = dart.async::_awaitHelper(x, :async_op_then, :async_op_error, :async_op) in null;
-          dart._internal::unsafeCast<dart.core::int*>(:result);
-        }
-        dart.async::_completeOnAsyncReturn(:async_completer, :return_value);
-        return;
-      }
-      on dynamic catch(dynamic exception, dart.core::StackTrace* stack_trace) {
-        :async_completer.{dart.async::Completer::completeError}(exception, stack_trace);
-      }
-    :async_stack_trace = dart.async::_asyncStackTraceHelper(:async_op);
-    :async_op_then = dart.async::_asyncThenWrapperHelper(:async_op);
-    :async_op_error = dart.async::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{dart.async::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{dart.async::Completer::future};
-  };
-  static method foo() → dart.async::Future<dart.core::int*>* /* originally async */ {
-    final dart.async::_AsyncAwaitCompleter<dart.core::int*>* :async_completer = new dart.async::_AsyncAwaitCompleter::•<dart.core::int*>();
-    FutureOr<dart.core::int*>* :return_value;
-    dynamic :async_stack_trace;
-    (dynamic) →* dynamic :async_op_then;
-    (dart.core::Object*, dart.core::StackTrace*) →* dynamic :async_op_error;
-    dart.core::int* :await_jump_var = 0;
-    dynamic :await_ctx_var;
-    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-      try {
-        #L2:
-        {
-          :return_value = 42;
-          break #L2;
-        }
-        dart.async::_completeOnAsyncReturn(:async_completer, :return_value);
-        return;
-      }
-      on dynamic catch(dynamic exception, dart.core::StackTrace* stack_trace) {
-        :async_completer.{dart.async::Completer::completeError}(exception, stack_trace);
-      }
-    :async_stack_trace = dart.async::_asyncStackTraceHelper(:async_op);
-    :async_op_then = dart.async::_asyncThenWrapperHelper(:async_op);
-    :async_op_error = dart.async::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{dart.async::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{dart.async::Completer::future};
-  }
-  static method simpleAsyncAwait(dart.async::Future<dart.core::int*>* a, dart.async::Future<dart.core::int*>* b) → dart.async::Future<dart.core::int*>* /* originally async */ {
-    final dart.async::_AsyncAwaitCompleter<dart.core::int*>* :async_completer = new dart.async::_AsyncAwaitCompleter::•<dart.core::int*>();
-    FutureOr<dart.core::int*>* :return_value;
-    dynamic :async_stack_trace;
-    (dynamic) →* dynamic :async_op_then;
-    (dart.core::Object*, dart.core::StackTrace*) →* dynamic :async_op_error;
-    dart.core::int* :await_jump_var = 0;
-    dynamic :await_ctx_var;
-    dynamic :saved_try_context_var0;
-    dynamic :async_temporary_0;
-    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-      try {
-        #L3:
-        {
-          [yield] let dynamic #t2 = dart.async::_awaitHelper(a, :async_op_then, :async_op_error, :async_op) in null;
-          :async_temporary_0 = dart._internal::unsafeCast<dart.core::int*>(:result);
-          [yield] let dynamic #t3 = dart.async::_awaitHelper(b, :async_op_then, :async_op_error, :async_op) in null;
-          :return_value = dart._internal::unsafeCast<dart.core::int*>(:async_temporary_0).{dart.core::num::+}(dart._internal::unsafeCast<dart.core::int*>(:result));
-          break #L3;
-        }
-        dart.async::_completeOnAsyncReturn(:async_completer, :return_value);
-        return;
-      }
-      on dynamic catch(dynamic exception, dart.core::StackTrace* stack_trace) {
-        :async_completer.{dart.async::Completer::completeError}(exception, stack_trace);
-      }
-    :async_stack_trace = dart.async::_asyncStackTraceHelper(:async_op);
-    :async_op_then = dart.async::_asyncThenWrapperHelper(:async_op);
-    :async_op_error = dart.async::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{dart.async::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{dart.async::Completer::future};
-  }
-  static method loops(dart.core::List<dart.core::int*>* list) → dart.async::Future<dart.core::int*>* /* originally async */ {
-    final dart.async::_AsyncAwaitCompleter<dart.core::int*>* :async_completer = new dart.async::_AsyncAwaitCompleter::•<dart.core::int*>();
-    FutureOr<dart.core::int*>* :return_value;
-    dynamic :async_stack_trace;
-    (dynamic) →* dynamic :async_op_then;
-    (dart.core::Object*, dart.core::StackTrace*) →* dynamic :async_op_error;
-    dart.core::int* :await_jump_var = 0;
-    dynamic :await_ctx_var;
-    dynamic :saved_try_context_var0;
-    dynamic :async_temporary_0;
-    dynamic :async_temporary_1;
-    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-      try {
-        #L4:
-        {
-          dart.core::int* sum = 0;
-          for (dart.core::int* i = 0; i.{dart.core::num::<}(10); i = i.{dart.core::num::+}(1)) {
-            {
-              dart.core::Iterator<dart.core::int*>* :sync-for-iterator = list.{dart.core::Iterable::iterator};
-              for (; :sync-for-iterator.{dart.core::Iterator::moveNext}(); ) {
-                dart.core::int* j = :sync-for-iterator.{dart.core::Iterator::current};
-                {
-                  :async_temporary_1 = sum;
-                  :async_temporary_0 = i.{dart.core::num::+}(j);
-                  [yield] let dynamic #t4 = dart.async::_awaitHelper(#lib::foo(), :async_op_then, :async_op_error, :async_op) in null;
-                  sum = dart._internal::unsafeCast<dart.core::int*>(:async_temporary_1).{dart.core::num::+}(dart._internal::unsafeCast<dart.core::int*>(:async_temporary_0).{dart.core::num::+}(dart._internal::unsafeCast<dart.core::int*>(:result)));
-                }
-              }
-            }
-          }
-          for (dart.core::int* k = 0; k.{dart.core::num::<}(10); k = k.{dart.core::num::+}(1)) {
-            sum = sum.{dart.core::num::+}(k);
-          }
-          :return_value = sum;
-          break #L4;
-        }
-        dart.async::_completeOnAsyncReturn(:async_completer, :return_value);
-        return;
-      }
-      on dynamic catch(dynamic exception, dart.core::StackTrace* stack_trace) {
-        :async_completer.{dart.async::Completer::completeError}(exception, stack_trace);
-      }
-    :async_stack_trace = dart.async::_asyncStackTraceHelper(:async_op);
-    :async_op_then = dart.async::_asyncThenWrapperHelper(:async_op);
-    :async_op_error = dart.async::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{dart.async::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{dart.async::Completer::future};
-  }
-  static method tryCatchRethrow(dart.async::Future<dart.core::int*>* a, dart.async::Future<dart.core::int*>* b, dart.async::Future<dart.core::int*>* c) → dart.async::Future<dart.core::int*>* /* originally async */ {
-    final dart.async::_AsyncAwaitCompleter<dart.core::int*>* :async_completer = new dart.async::_AsyncAwaitCompleter::•<dart.core::int*>();
-    FutureOr<dart.core::int*>* :return_value;
-    dynamic :async_stack_trace;
-    (dynamic) →* dynamic :async_op_then;
-    (dart.core::Object*, dart.core::StackTrace*) →* dynamic :async_op_error;
-    dart.core::int* :await_jump_var = 0;
-    dynamic :await_ctx_var;
-    dynamic :saved_try_context_var0;
-    dynamic :saved_try_context_var1;
-    dynamic :saved_try_context_var2;
-    dynamic :exception0;
-    dynamic :stack_trace0;
-    dynamic :async_temporary_0;
-    dynamic :async_temporary_1;
-    dynamic :async_temporary_2;
-    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-      try {
-        #L5:
-        {
-          dart.core::int* x = 1;
-          try
-            try {
-              :async_temporary_0 = x;
-              [yield] let dynamic #t5 = dart.async::_awaitHelper(a, :async_op_then, :async_op_error, :async_op) in null;
-              x = dart._internal::unsafeCast<dart.core::int*>(:async_temporary_0).{dart.core::num::+}(dart._internal::unsafeCast<dart.core::int*>(:result));
-            }
-            on dynamic catch(final dynamic e) {
-              if(e is dart.core::Error*) {
-                :return_value = 42;
-                break #L5;
-              }
-              :async_temporary_1 = x;
-              [yield] let dynamic #t6 = dart.async::_awaitHelper(b, :async_op_then, :async_op_error, :async_op) in null;
-              x = dart._internal::unsafeCast<dart.core::int*>(:async_temporary_1).{dart.core::num::+}(dart._internal::unsafeCast<dart.core::int*>(:result));
-              rethrow;
-            }
-          finally {
-            dart.core::print("fin");
-            :async_temporary_2 = x;
-            [yield] let dynamic #t7 = dart.async::_awaitHelper(c, :async_op_then, :async_op_error, :async_op) in null;
-            x = dart._internal::unsafeCast<dart.core::int*>(:async_temporary_2).{dart.core::num::+}(dart._internal::unsafeCast<dart.core::int*>(:result));
-            :return_value = x;
-            break #L5;
-          }
-        }
-        dart.async::_completeOnAsyncReturn(:async_completer, :return_value);
-        return;
-      }
-      on dynamic catch(dynamic exception, dart.core::StackTrace* stack_trace) {
-        :async_completer.{dart.async::Completer::completeError}(exception, stack_trace);
-      }
-    :async_stack_trace = dart.async::_asyncStackTraceHelper(:async_op);
-    :async_op_then = dart.async::_asyncThenWrapperHelper(:async_op);
-    :async_op_error = dart.async::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{dart.async::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{dart.async::Completer::future};
-  }
-  static method closure(dart.async::Future<dart.core::int*>* a) → dynamic {
-    dart.core::int* x = 3;
-    function nested() → dart.async::Future<dart.core::int*>* /* originally async */ {
-      final dart.async::_AsyncAwaitCompleter<dart.core::int*>* :async_completer = new dart.async::_AsyncAwaitCompleter::•<dart.core::int*>();
-      FutureOr<dart.core::int*>* :return_value;
-      dynamic :async_stack_trace;
-      (dynamic) →* dynamic :async_op_then;
-      (dart.core::Object*, dart.core::StackTrace*) →* dynamic :async_op_error;
-      dart.core::int* :await_jump_var = 0;
-      dynamic :await_ctx_var;
-      dynamic :saved_try_context_var0;
-      dynamic :saved_try_context_var1;
-      function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-        try {
-          #L6:
-          {
-            dart.core::int* y = 4;
-            try {
-              x = 5;
-              [yield] let dynamic #t8 = dart.async::_awaitHelper(a, :async_op_then, :async_op_error, :async_op) in null;
-              y = dart._internal::unsafeCast<dart.core::int*>(:result);
-              :return_value = x.{dart.core::num::+}(y);
-              break #L6;
-            }
-            finally {
-              dart.core::print("fin");
-            }
-          }
-          dart.async::_completeOnAsyncReturn(:async_completer, :return_value);
-          return;
-        }
-        on dynamic catch(dynamic exception, dart.core::StackTrace* stack_trace) {
-          :async_completer.{dart.async::Completer::completeError}(exception, stack_trace);
-        }
-      :async_stack_trace = dart.async::_asyncStackTraceHelper(:async_op);
-      :async_op_then = dart.async::_asyncThenWrapperHelper(:async_op);
-      :async_op_error = dart.async::_asyncErrorWrapperHelper(:async_op);
-      :async_completer.{dart.async::_AsyncAwaitCompleter::start}(:async_op);
-      return :async_completer.{dart.async::Completer::future};
-    }
-    return nested;
-  }
-  static method testAssert(dart.async::Future<dart.core::int*>* a) → dart.async::Future<dart.core::int*>* /* originally async */ {
-    final dart.async::_AsyncAwaitCompleter<dart.core::int*>* :async_completer = new dart.async::_AsyncAwaitCompleter::•<dart.core::int*>();
-    FutureOr<dart.core::int*>* :return_value;
-    dynamic :async_stack_trace;
-    (dynamic) →* dynamic :async_op_then;
-    (dart.core::Object*, dart.core::StackTrace*) →* dynamic :async_op_error;
-    dart.core::int* :await_jump_var = 0;
-    dynamic :await_ctx_var;
-    dynamic :saved_try_context_var0;
-    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-      try {
-        #L7:
-        {
-          assert {
-            [yield] let dynamic #t9 = dart.async::_awaitHelper(a, :async_op_then, :async_op_error, :async_op) in null;
-            assert(dart._internal::unsafeCast<dart.core::int*>(:result).{dart.core::num::==}(42));
-          }
-          :return_value = 7;
-          break #L7;
-        }
-        dart.async::_completeOnAsyncReturn(:async_completer, :return_value);
-        return;
-      }
-      on dynamic catch(dynamic exception, dart.core::StackTrace* stack_trace) {
-        :async_completer.{dart.async::Completer::completeError}(exception, stack_trace);
-      }
-    :async_stack_trace = dart.async::_asyncStackTraceHelper(:async_op);
-    :async_op_then = dart.async::_asyncThenWrapperHelper(:async_op);
-    :async_op_error = dart.async::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{dart.async::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{dart.async::Completer::future};
-  }
-  static method main() → dynamic {}
-}
diff --git a/pkg/vm/testcases/bytecode/bootstrapping.dart b/pkg/vm/testcases/bytecode/bootstrapping.dart
deleted file mode 100644
index 3f8c850..0000000
--- a/pkg/vm/testcases/bytecode/bootstrapping.dart
+++ /dev/null
@@ -1,155 +0,0 @@
-// Copyright (c) 2018, 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.
-
-// Selection of methods used during bootstrapping.
-
-// ignore_for_file: native_function_body_in_non_sdk_code
-// ignore_for_file: unused_element, unused_field
-
-// -----------------------------------------------------------------
-
-void _printString(String s) native "Builtin_PrintString";
-
-void _print(arg) {
-  _printString(arg.toString());
-}
-
-_getPrintClosure() => _print;
-
-// -----------------------------------------------------------------
-
-typedef void _ScheduleImmediateClosure(void callback());
-
-class _ScheduleImmediate {
-  static _ScheduleImmediateClosure _closure;
-}
-
-void _setScheduleImmediateClosure(_ScheduleImmediateClosure closure) {
-  _ScheduleImmediate._closure = closure;
-}
-
-// -----------------------------------------------------------------
-
-class _NamespaceImpl implements _Namespace {
-  _NamespaceImpl._();
-
-  static _NamespaceImpl _create(_NamespaceImpl namespace, var n)
-      native "Namespace_Create";
-  static int _getPointer(_NamespaceImpl namespace)
-      native "Namespace_GetPointer";
-  static int _getDefault() native "Namespace_GetDefault";
-
-  // If the platform supports "namespaces", this method is called by the
-  // embedder with the platform-specific namespace information.
-  static _NamespaceImpl _cachedNamespace = null;
-  static void _setupNamespace(var namespace) {
-    _cachedNamespace = _create(new _NamespaceImpl._(), namespace);
-  }
-
-  static _NamespaceImpl get _namespace {
-    if (_cachedNamespace == null) {
-      // The embedder has not supplied a namespace before one is needed, so
-      // instead use a safe-ish default value.
-      _cachedNamespace = _create(new _NamespaceImpl._(), _getDefault());
-    }
-    return _cachedNamespace;
-  }
-
-  static int get _namespacePointer => _getPointer(_namespace);
-}
-
-class _Namespace {
-  static void _setupNamespace(var namespace) {
-    _NamespaceImpl._setupNamespace(namespace);
-  }
-
-  static _Namespace get _namespace => _NamespaceImpl._namespace;
-
-  static int get _namespacePointer => _NamespaceImpl._namespacePointer;
-}
-
-// -----------------------------------------------------------------
-
-// These may be set to different values by the embedder by calling
-// _setStdioFDs when initializing dart:io.
-int _stdinFD = 0;
-int _stdoutFD = 1;
-int _stderrFD = 2;
-
-// This is an embedder entrypoint.
-void _setStdioFDs(int stdin, int stdout, int stderr) {
-  _stdinFD = stdin;
-  _stdoutFD = stdout;
-  _stderrFD = stderr;
-}
-
-// -----------------------------------------------------------------
-
-class VMLibraryHooks {
-  // Example: "dart:isolate _Timer._factory"
-  static var timerFactory;
-
-  // Example: "dart:io _EventHandler._sendData"
-  static var eventHandlerSendData;
-
-  // A nullary closure that answers the current clock value in milliseconds.
-  // Example: "dart:io _EventHandler._timerMillisecondClock"
-  static var timerMillisecondClock;
-
-  // Implementation of Resource.readAsBytes.
-  static var resourceReadAsBytes;
-
-  // Implementation of package root/map provision.
-  static var packageRootString;
-  static var packageConfigString;
-  static var packageRootUriFuture;
-  static var packageConfigUriFuture;
-  static var resolvePackageUriFuture;
-
-  static var _computeScriptUri;
-  static var _cachedScript;
-  static set platformScript(var f) {
-    _computeScriptUri = f;
-    _cachedScript = null;
-  }
-
-  static get platformScript {
-    if (_cachedScript == null && _computeScriptUri != null) {
-      _cachedScript = _computeScriptUri();
-    }
-    return _cachedScript;
-  }
-}
-
-String _rawScript;
-Uri _scriptUri() {
-  if (_rawScript.startsWith('http:') ||
-      _rawScript.startsWith('https:') ||
-      _rawScript.startsWith('file:')) {
-    return Uri.parse(_rawScript);
-  } else {
-    return Uri.base.resolveUri(new Uri.file(_rawScript));
-  }
-}
-
-_setupHooks() {
-  VMLibraryHooks.platformScript = _scriptUri;
-}
-
-class Stdin {}
-
-Stdin _stdin;
-
-class _StdIOUtils {
-  static Stdin _getStdioInputStream(int fd) => null;
-}
-
-Stdin get stdin {
-  _stdin ??= _StdIOUtils._getStdioInputStream(_stdinFD);
-  return _stdin;
-}
-
-// -----------------------------------------------------------------
-
-main() {}
diff --git a/pkg/vm/testcases/bytecode/bootstrapping.dart.expect b/pkg/vm/testcases/bytecode/bootstrapping.dart.expect
deleted file mode 100644
index 31c46a2..0000000
--- a/pkg/vm/testcases/bytecode/bootstrapping.dart.expect
+++ /dev/null
@@ -1,1078 +0,0 @@
-main = #lib::main;
- [@vm.bytecode=
-BytecodeMetadata {
-Bytecode (version: stable)
-Main library: #lib
-Library '#lib'
-    name '#lib'
-    script '#lib'
-
-Class '', script = '#lib'
-
-Field '_stdinFD', type = dart:core::int*, reflectable, static, has-initializer
-    value = const 0
-
-Field '_stdoutFD', type = dart:core::int*, reflectable, static, has-initializer
-    value = const 1
-
-Field '_stderrFD', type = dart:core::int*, reflectable, static, has-initializer
-    value = const 2
-
-Field '_rawScript', type = dart:core::String*, reflectable, static
-    value = null
-
-Field '_stdin', type = #lib::Stdin*, reflectable, static
-    value = null
-
-Function '_printString', static, reflectable, debuggable, native 'Builtin_PrintString'
-    parameters [dart:core::String* 's'] (required: 1)
-    return-type void
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  Push                 FP[-5]
-  NativeCall           CP#0
-  ReturnTOS
-}
-ConstantPool {
-  [0] = NativeEntry Builtin_PrintString
-}
-
-
-Function '_print', static, reflectable, debuggable
-    parameters [dynamic 'arg'] (required: 1)
-    return-type void
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  Push                 FP[-5]
-  InterfaceCall        CP#0, 1
-  DirectCall           CP#2, 1
-  Drop1
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-  [0] = InterfaceCall 'dart:core::Object::toString', ArgDesc num-args 1, num-type-args 0, names []
-  [1] = Reserved
-  [2] = DirectCall '#lib::_printString', ArgDesc num-args 1, num-type-args 0, names []
-  [3] = Reserved
-}
-
-
-Function '_getPrintClosure', static, reflectable, debuggable
-    parameters [] (required: 0)
-    return-type dynamic
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  PushConstant         CP#0
-  ReturnTOS
-}
-ConstantPool {
-  [0] = ObjectRef const tear-off #lib::_print
-}
-
-
-Function '_setScheduleImmediateClosure', static, reflectable, debuggable
-    parameters [FunctionType (FunctionType ()* -> void)* -> void 'closure'] (required: 1)
-    return-type void
-
-Bytecode {
-  Entry                1
-  CheckStack           0
-  Push                 FP[-5]
-  StoreStaticTOS       CP#0
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-  [0] = StaticField #lib::_ScheduleImmediate::_closure (field)
-}
-
-
-Function '_setStdioFDs', static, reflectable, debuggable
-    parameters [dart:core::int* 'stdin', dart:core::int* 'stdout', dart:core::int* 'stderr'] (required: 3)
-    return-type void
-
-Bytecode {
-  Entry                1
-  CheckStack           0
-  Push                 FP[-7]
-  StoreStaticTOS       CP#0
-  Push                 FP[-6]
-  StoreStaticTOS       CP#1
-  Push                 FP[-5]
-  StoreStaticTOS       CP#2
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-  [0] = StaticField #lib::_stdinFD (field)
-  [1] = StaticField #lib::_stdoutFD (field)
-  [2] = StaticField #lib::_stderrFD (field)
-}
-
-
-Function '_scriptUri', static, reflectable, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::Uri*
-
-Bytecode {
-  Entry                2
-  CheckStack           0
-  LoadStatic           CP#0
-  PushConstant         CP#1
-  InterfaceCall        CP#2, 2
-  AssertBoolean        0
-  JumpIfTrue           L1
-  LoadStatic           CP#0
-  PushConstant         CP#4
-  InterfaceCall        CP#2, 2
-  AssertBoolean        0
-  JumpIfTrue           L1
-  LoadStatic           CP#0
-  PushConstant         CP#5
-  InterfaceCall        CP#2, 2
-  AssertBoolean        0
-  JumpIfFalse          L2
-L1:
-  LoadStatic           CP#0
-  DirectCall           CP#6, 1
-  ReturnTOS
-L2:
-  DirectCall           CP#8, 0
-  PushNull
-  LoadStatic           CP#0
-  DirectCall           CP#10, 2
-  InterfaceCall        CP#12, 2
-  ReturnTOS
-}
-ConstantPool {
-  [0] = StaticField #lib::_rawScript (field)
-  [1] = ObjectRef 'http:'
-  [2] = InterfaceCall 'dart:core::String::startsWith', ArgDesc num-args 2, num-type-args 0, names []
-  [3] = Reserved
-  [4] = ObjectRef 'https:'
-  [5] = ObjectRef 'file:'
-  [6] = DirectCall 'dart:core::Uri::parse', ArgDesc num-args 1, num-type-args 0, names []
-  [7] = Reserved
-  [8] = DirectCall 'dart:core::Uri::get:base', ArgDesc num-args 0, num-type-args 0, names []
-  [9] = Reserved
-  [10] = DirectCall 'dart:core::_Uri::file (constructor)', ArgDesc num-args 2, num-type-args 0, names []
-  [11] = Reserved
-  [12] = InterfaceCall 'dart:core::Uri::resolveUri', ArgDesc num-args 2, num-type-args 0, names []
-  [13] = Reserved
-}
-
-
-Function '_setupHooks', static, reflectable, debuggable
-    parameters [] (required: 0)
-    return-type dynamic
-
-Bytecode {
-  Entry                1
-  CheckStack           0
-  PushConstant         CP#0
-  DirectCall           CP#1, 1
-  Drop1
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-  [0] = ObjectRef const tear-off #lib::_scriptUri
-  [1] = DirectCall '#lib::VMLibraryHooks::set:platformScript', ArgDesc num-args 1, num-type-args 0, names []
-  [2] = Reserved
-}
-
-
-Function 'get:stdin', getter, static, reflectable, debuggable
-    parameters [] (required: 0)
-    return-type #lib::Stdin*
-
-Bytecode {
-  Entry                2
-  CheckStack           0
-  LoadStatic           CP#0
-  JumpIfNotNull        L1
-  LoadStatic           CP#1
-  DirectCall           CP#2, 1
-  StoreLocal           r1
-  Push                 r1
-  StoreStaticTOS       CP#0
-  PopLocal             r0
-  Jump                 L2
-L1:
-  PushNull
-  PopLocal             r0
-L2:
-  Push                 r0
-  Drop1
-  LoadStatic           CP#0
-  ReturnTOS
-}
-ConstantPool {
-  [0] = StaticField #lib::_stdin (field)
-  [1] = StaticField #lib::_stdinFD (field)
-  [2] = DirectCall '#lib::_StdIOUtils::_getStdioInputStream', ArgDesc num-args 1, num-type-args 0, names []
-  [3] = Reserved
-}
-
-
-Function 'main', static, reflectable, debuggable
-    parameters [] (required: 0)
-    return-type dynamic
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-}
-
-Class '_ScheduleImmediate', script = '#lib'
-    extends dart:core::Object*
-
-Field '_closure', type = FunctionType (FunctionType ()* -> void)* -> void, reflectable, static, has-initializer
-    value = null
-
-Function '', constructor, reflectable
-    parameters [] (required: 0)
-    return-type #lib::_ScheduleImmediate*
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  Push                 FP[-5]
-  DirectCall           CP#0, 1
-  Drop1
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-  [0] = DirectCall 'dart:core::Object:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
-  [1] = Reserved
-}
-
-
-Function 'get:_identityHashCode', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::int*
-
-Function '_instanceOf', abstract, debuggable
-    parameters [dynamic 'instantiatorTypeArguments', dynamic 'functionTypeArguments', dynamic 'type'] (required: 3)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOf', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOfTrue', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOfFalse', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '==', abstract, debuggable
-    parameters [dynamic 'other'] (required: 1)
-    return-type dart:core::bool*
-
-Function 'get:hashCode', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::int*
-
-Function 'toString', abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::String*
-
-Function 'noSuchMethod', abstract, debuggable
-    parameters [dart:core::Invocation* 'invocation'] (required: 1)
-    return-type dynamic
-
-Function 'get:runtimeType', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::Type*
-Class '_NamespaceImpl', script = '#lib'
-    extends dart:core::Object*
-    implements [#lib::_Namespace*]
-
-Field '_cachedNamespace', type = #lib::_NamespaceImpl*, reflectable, static, has-initializer
-    value = null
-
-Function '_', constructor, reflectable, debuggable
-    parameters [] (required: 0)
-    return-type #lib::_NamespaceImpl*
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  Push                 FP[-5]
-  DirectCall           CP#0, 1
-  Drop1
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-  [0] = DirectCall 'dart:core::Object:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
-  [1] = Reserved
-}
-
-
-Function '_create', static, reflectable, debuggable, native 'Namespace_Create'
-    parameters [#lib::_NamespaceImpl* 'namespace', dynamic 'n'] (required: 2)
-    return-type #lib::_NamespaceImpl*
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  Push                 FP[-6]
-  Push                 FP[-5]
-  NativeCall           CP#0
-  ReturnTOS
-}
-ConstantPool {
-  [0] = NativeEntry Namespace_Create
-}
-
-
-Function '_getPointer', static, reflectable, debuggable, native 'Namespace_GetPointer'
-    parameters [#lib::_NamespaceImpl* 'namespace'] (required: 1)
-    return-type dart:core::int*
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  Push                 FP[-5]
-  NativeCall           CP#0
-  ReturnTOS
-}
-ConstantPool {
-  [0] = NativeEntry Namespace_GetPointer
-}
-
-
-Function '_getDefault', static, reflectable, debuggable, native 'Namespace_GetDefault'
-    parameters [] (required: 0)
-    return-type dart:core::int*
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  NativeCall           CP#0
-  ReturnTOS
-}
-ConstantPool {
-  [0] = NativeEntry Namespace_GetDefault
-}
-
-
-Function '_setupNamespace', static, reflectable, debuggable
-    parameters [dynamic 'namespace'] (required: 1)
-    return-type void
-
-Bytecode {
-  Entry                2
-  CheckStack           0
-  Allocate             CP#0
-  StoreLocal           r1
-  Push                 r1
-  DirectCall           CP#1, 1
-  Drop1
-  Push                 FP[-5]
-  DirectCall           CP#3, 2
-  StoreStaticTOS       CP#5
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-  [0] = Class #lib::_NamespaceImpl
-  [1] = DirectCall '#lib::_NamespaceImpl::_ (constructor)', ArgDesc num-args 1, num-type-args 0, names []
-  [2] = Reserved
-  [3] = DirectCall '#lib::_NamespaceImpl::_create', ArgDesc num-args 2, num-type-args 0, names []
-  [4] = Reserved
-  [5] = StaticField #lib::_NamespaceImpl::_cachedNamespace (field)
-}
-
-
-Function 'get:_namespace', getter, static, reflectable, debuggable
-    parameters [] (required: 0)
-    return-type #lib::_NamespaceImpl*
-
-Bytecode {
-  Entry                2
-  CheckStack           0
-  LoadStatic           CP#0
-  JumpIfNotNull        L1
-  Allocate             CP#1
-  StoreLocal           r1
-  Push                 r1
-  DirectCall           CP#2, 1
-  Drop1
-  DirectCall           CP#4, 0
-  DirectCall           CP#6, 2
-  StoreStaticTOS       CP#0
-L1:
-  LoadStatic           CP#0
-  ReturnTOS
-}
-ConstantPool {
-  [0] = StaticField #lib::_NamespaceImpl::_cachedNamespace (field)
-  [1] = Class #lib::_NamespaceImpl
-  [2] = DirectCall '#lib::_NamespaceImpl::_ (constructor)', ArgDesc num-args 1, num-type-args 0, names []
-  [3] = Reserved
-  [4] = DirectCall '#lib::_NamespaceImpl::_getDefault', ArgDesc num-args 0, num-type-args 0, names []
-  [5] = Reserved
-  [6] = DirectCall '#lib::_NamespaceImpl::_create', ArgDesc num-args 2, num-type-args 0, names []
-  [7] = Reserved
-}
-
-
-Function 'get:_namespacePointer', getter, static, reflectable, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::int*
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  DirectCall           CP#0, 0
-  DirectCall           CP#2, 1
-  ReturnTOS
-}
-ConstantPool {
-  [0] = DirectCall '#lib::_NamespaceImpl::get:_namespace', ArgDesc num-args 0, num-type-args 0, names []
-  [1] = Reserved
-  [2] = DirectCall '#lib::_NamespaceImpl::_getPointer', ArgDesc num-args 1, num-type-args 0, names []
-  [3] = Reserved
-}
-
-
-Function 'get:_identityHashCode', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::int*
-
-Function '_instanceOf', abstract, debuggable
-    parameters [dynamic 'instantiatorTypeArguments', dynamic 'functionTypeArguments', dynamic 'type'] (required: 3)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOf', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOfTrue', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOfFalse', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '==', abstract, debuggable
-    parameters [dynamic 'other'] (required: 1)
-    return-type dart:core::bool*
-
-Function 'get:hashCode', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::int*
-
-Function 'toString', abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::String*
-
-Function 'noSuchMethod', abstract, debuggable
-    parameters [dart:core::Invocation* 'invocation'] (required: 1)
-    return-type dynamic
-
-Function 'get:runtimeType', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::Type*
-Class '_Namespace', script = '#lib'
-    extends dart:core::Object*
-
-
-Function '', constructor, reflectable
-    parameters [] (required: 0)
-    return-type #lib::_Namespace*
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  Push                 FP[-5]
-  DirectCall           CP#0, 1
-  Drop1
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-  [0] = DirectCall 'dart:core::Object:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
-  [1] = Reserved
-}
-
-
-Function '_setupNamespace', static, reflectable, debuggable
-    parameters [dynamic 'namespace'] (required: 1)
-    return-type void
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  Push                 FP[-5]
-  DirectCall           CP#0, 1
-  Drop1
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-  [0] = DirectCall '#lib::_NamespaceImpl::_setupNamespace', ArgDesc num-args 1, num-type-args 0, names []
-  [1] = Reserved
-}
-
-
-Function 'get:_namespace', getter, static, reflectable, debuggable
-    parameters [] (required: 0)
-    return-type #lib::_Namespace*
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  DirectCall           CP#0, 0
-  ReturnTOS
-}
-ConstantPool {
-  [0] = DirectCall '#lib::_NamespaceImpl::get:_namespace', ArgDesc num-args 0, num-type-args 0, names []
-  [1] = Reserved
-}
-
-
-Function 'get:_namespacePointer', getter, static, reflectable, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::int*
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  DirectCall           CP#0, 0
-  ReturnTOS
-}
-ConstantPool {
-  [0] = DirectCall '#lib::_NamespaceImpl::get:_namespacePointer', ArgDesc num-args 0, num-type-args 0, names []
-  [1] = Reserved
-}
-
-
-Function 'get:_identityHashCode', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::int*
-
-Function '_instanceOf', abstract, debuggable
-    parameters [dynamic 'instantiatorTypeArguments', dynamic 'functionTypeArguments', dynamic 'type'] (required: 3)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOf', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOfTrue', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOfFalse', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '==', abstract, debuggable
-    parameters [dynamic 'other'] (required: 1)
-    return-type dart:core::bool*
-
-Function 'get:hashCode', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::int*
-
-Function 'toString', abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::String*
-
-Function 'noSuchMethod', abstract, debuggable
-    parameters [dart:core::Invocation* 'invocation'] (required: 1)
-    return-type dynamic
-
-Function 'get:runtimeType', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::Type*
-Class 'VMLibraryHooks', script = '#lib'
-    extends dart:core::Object*
-
-Field 'timerFactory', type = dynamic, reflectable, static, has-initializer
-    value = null
-
-Field 'eventHandlerSendData', type = dynamic, reflectable, static, has-initializer
-    value = null
-
-Field 'timerMillisecondClock', type = dynamic, reflectable, static, has-initializer
-    value = null
-
-Field 'resourceReadAsBytes', type = dynamic, reflectable, static, has-initializer
-    value = null
-
-Field 'packageRootString', type = dynamic, reflectable, static, has-initializer
-    value = null
-
-Field 'packageConfigString', type = dynamic, reflectable, static, has-initializer
-    value = null
-
-Field 'packageRootUriFuture', type = dynamic, reflectable, static, has-initializer
-    value = null
-
-Field 'packageConfigUriFuture', type = dynamic, reflectable, static, has-initializer
-    value = null
-
-Field 'resolvePackageUriFuture', type = dynamic, reflectable, static, has-initializer
-    value = null
-
-Field '_computeScriptUri', type = dynamic, reflectable, static, has-initializer
-    value = null
-
-Field '_cachedScript', type = dynamic, reflectable, static, has-initializer
-    value = null
-
-Function '', constructor, reflectable
-    parameters [] (required: 0)
-    return-type #lib::VMLibraryHooks*
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  Push                 FP[-5]
-  DirectCall           CP#0, 1
-  Drop1
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-  [0] = DirectCall 'dart:core::Object:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
-  [1] = Reserved
-}
-
-
-Function 'set:platformScript', setter, static, reflectable, debuggable
-    parameters [dynamic 'f'] (required: 1)
-    return-type void
-
-Bytecode {
-  Entry                1
-  CheckStack           0
-  Push                 FP[-5]
-  StoreStaticTOS       CP#0
-  PushNull
-  StoreStaticTOS       CP#1
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-  [0] = StaticField #lib::VMLibraryHooks::_computeScriptUri (field)
-  [1] = StaticField #lib::VMLibraryHooks::_cachedScript (field)
-}
-
-
-Function 'get:platformScript', getter, static, reflectable, debuggable
-    parameters [] (required: 0)
-    return-type dynamic
-
-Bytecode {
-  Entry                1
-  CheckStack           0
-  LoadStatic           CP#0
-  JumpIfNotNull        L1
-  LoadStatic           CP#1
-  JumpIfNull           L1
-  LoadStatic           CP#1
-  DynamicCall          CP#2, 1
-  StoreStaticTOS       CP#0
-L1:
-  LoadStatic           CP#0
-  ReturnTOS
-}
-ConstantPool {
-  [0] = StaticField #lib::VMLibraryHooks::_cachedScript (field)
-  [1] = StaticField #lib::VMLibraryHooks::_computeScriptUri (field)
-  [2] = DynamicCall 'call', ArgDesc num-args 1, num-type-args 0, names []
-  [3] = Reserved
-}
-
-
-Function 'get:_identityHashCode', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::int*
-
-Function '_instanceOf', abstract, debuggable
-    parameters [dynamic 'instantiatorTypeArguments', dynamic 'functionTypeArguments', dynamic 'type'] (required: 3)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOf', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOfTrue', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOfFalse', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '==', abstract, debuggable
-    parameters [dynamic 'other'] (required: 1)
-    return-type dart:core::bool*
-
-Function 'get:hashCode', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::int*
-
-Function 'toString', abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::String*
-
-Function 'noSuchMethod', abstract, debuggable
-    parameters [dart:core::Invocation* 'invocation'] (required: 1)
-    return-type dynamic
-
-Function 'get:runtimeType', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::Type*
-Class 'Stdin', script = '#lib'
-    extends dart:core::Object*
-
-
-Function '', constructor, reflectable
-    parameters [] (required: 0)
-    return-type #lib::Stdin*
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  Push                 FP[-5]
-  DirectCall           CP#0, 1
-  Drop1
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-  [0] = DirectCall 'dart:core::Object:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
-  [1] = Reserved
-}
-
-
-Function 'get:_identityHashCode', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::int*
-
-Function '_instanceOf', abstract, debuggable
-    parameters [dynamic 'instantiatorTypeArguments', dynamic 'functionTypeArguments', dynamic 'type'] (required: 3)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOf', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOfTrue', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOfFalse', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '==', abstract, debuggable
-    parameters [dynamic 'other'] (required: 1)
-    return-type dart:core::bool*
-
-Function 'get:hashCode', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::int*
-
-Function 'toString', abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::String*
-
-Function 'noSuchMethod', abstract, debuggable
-    parameters [dart:core::Invocation* 'invocation'] (required: 1)
-    return-type dynamic
-
-Function 'get:runtimeType', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::Type*
-Class '_StdIOUtils', script = '#lib'
-    extends dart:core::Object*
-
-
-Function '', constructor, reflectable
-    parameters [] (required: 0)
-    return-type #lib::_StdIOUtils*
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  Push                 FP[-5]
-  DirectCall           CP#0, 1
-  Drop1
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-  [0] = DirectCall 'dart:core::Object:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
-  [1] = Reserved
-}
-
-
-Function '_getStdioInputStream', static, reflectable, debuggable
-    parameters [dart:core::int* 'fd'] (required: 1)
-    return-type #lib::Stdin*
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-}
-
-
-Function 'get:_identityHashCode', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::int*
-
-Function '_instanceOf', abstract, debuggable
-    parameters [dynamic 'instantiatorTypeArguments', dynamic 'functionTypeArguments', dynamic 'type'] (required: 3)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOf', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOfTrue', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOfFalse', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '==', abstract, debuggable
-    parameters [dynamic 'other'] (required: 1)
-    return-type dart:core::bool*
-
-Function 'get:hashCode', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::int*
-
-Function 'toString', abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::String*
-
-Function 'noSuchMethod', abstract, debuggable
-    parameters [dart:core::Invocation* 'invocation'] (required: 1)
-    return-type dynamic
-
-Function 'get:runtimeType', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::Type*
-
-}
-]library #lib from "#lib" as #lib {
-
-  typedef _ScheduleImmediateClosure = (() →* void) →* void;
-  class _ScheduleImmediate extends dart.core::Object {
-    static field (() →* void) →* void _closure = null;
-    synthetic constructor •() → #lib::_ScheduleImmediate*
-      : super dart.core::Object::•()
-      ;
-    abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
-    abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
-    abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
-    abstract member-signature method _simpleInstanceOfTrue(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfTrue
-    abstract member-signature method _simpleInstanceOfFalse(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfFalse
-    abstract member-signature operator ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
-    abstract member-signature get hashCode() → dart.core::int*; -> dart.core::Object::hashCode
-    abstract member-signature method toString() → dart.core::String*; -> dart.core::Object::toString
-    abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
-    abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
-  }
-  class _NamespaceImpl extends dart.core::Object implements #lib::_Namespace {
-    static field #lib::_NamespaceImpl* _cachedNamespace = null;
-    constructor _() → #lib::_NamespaceImpl*
-      : super dart.core::Object::•()
-      ;
-    @#C2
-    external static method _create(#lib::_NamespaceImpl* namespace, dynamic n) → #lib::_NamespaceImpl*;
-    @#C4
-    external static method _getPointer(#lib::_NamespaceImpl* namespace) → dart.core::int*;
-    @#C6
-    external static method _getDefault() → dart.core::int*;
-    static method _setupNamespace(dynamic namespace) → void {
-      #lib::_NamespaceImpl::_cachedNamespace = #lib::_NamespaceImpl::_create(new #lib::_NamespaceImpl::_(), namespace);
-    }
-    static get _namespace() → #lib::_NamespaceImpl* {
-      if(#lib::_NamespaceImpl::_cachedNamespace.{#lib::_NamespaceImpl::==}(null)) {
-        #lib::_NamespaceImpl::_cachedNamespace = #lib::_NamespaceImpl::_create(new #lib::_NamespaceImpl::_(), #lib::_NamespaceImpl::_getDefault());
-      }
-      return #lib::_NamespaceImpl::_cachedNamespace;
-    }
-    static get _namespacePointer() → dart.core::int*
-      return #lib::_NamespaceImpl::_getPointer(#lib::_NamespaceImpl::_namespace);
-    abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
-    abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
-    abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
-    abstract member-signature method _simpleInstanceOfTrue(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfTrue
-    abstract member-signature method _simpleInstanceOfFalse(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfFalse
-    abstract member-signature operator ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
-    abstract member-signature get hashCode() → dart.core::int*; -> dart.core::Object::hashCode
-    abstract member-signature method toString() → dart.core::String*; -> dart.core::Object::toString
-    abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
-    abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
-  }
-  class _Namespace extends dart.core::Object {
-    synthetic constructor •() → #lib::_Namespace*
-      : super dart.core::Object::•()
-      ;
-    static method _setupNamespace(dynamic namespace) → void {
-      #lib::_NamespaceImpl::_setupNamespace(namespace);
-    }
-    static get _namespace() → #lib::_Namespace*
-      return #lib::_NamespaceImpl::_namespace;
-    static get _namespacePointer() → dart.core::int*
-      return #lib::_NamespaceImpl::_namespacePointer;
-    abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
-    abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
-    abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
-    abstract member-signature method _simpleInstanceOfTrue(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfTrue
-    abstract member-signature method _simpleInstanceOfFalse(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfFalse
-    abstract member-signature operator ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
-    abstract member-signature get hashCode() → dart.core::int*; -> dart.core::Object::hashCode
-    abstract member-signature method toString() → dart.core::String*; -> dart.core::Object::toString
-    abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
-    abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
-  }
-  class VMLibraryHooks extends dart.core::Object {
-    static field dynamic timerFactory = null;
-    static field dynamic eventHandlerSendData = null;
-    static field dynamic timerMillisecondClock = null;
-    static field dynamic resourceReadAsBytes = null;
-    static field dynamic packageRootString = null;
-    static field dynamic packageConfigString = null;
-    static field dynamic packageRootUriFuture = null;
-    static field dynamic packageConfigUriFuture = null;
-    static field dynamic resolvePackageUriFuture = null;
-    static field dynamic _computeScriptUri = null;
-    static field dynamic _cachedScript = null;
-    synthetic constructor •() → #lib::VMLibraryHooks*
-      : super dart.core::Object::•()
-      ;
-    static set platformScript(dynamic f) → void {
-      #lib::VMLibraryHooks::_computeScriptUri = f;
-      #lib::VMLibraryHooks::_cachedScript = null;
-    }
-    static get platformScript() → dynamic {
-      if(#lib::VMLibraryHooks::_cachedScript.{dart.core::Object::==}(null) && !#lib::VMLibraryHooks::_computeScriptUri.{dart.core::Object::==}(null)) {
-        #lib::VMLibraryHooks::_cachedScript = [@vm.call-site-attributes.metadata=receiverType:dynamic] #lib::VMLibraryHooks::_computeScriptUri.call();
-      }
-      return #lib::VMLibraryHooks::_cachedScript;
-    }
-    abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
-    abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
-    abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
-    abstract member-signature method _simpleInstanceOfTrue(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfTrue
-    abstract member-signature method _simpleInstanceOfFalse(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfFalse
-    abstract member-signature operator ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
-    abstract member-signature get hashCode() → dart.core::int*; -> dart.core::Object::hashCode
-    abstract member-signature method toString() → dart.core::String*; -> dart.core::Object::toString
-    abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
-    abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
-  }
-  class Stdin extends dart.core::Object {
-    synthetic constructor •() → #lib::Stdin*
-      : super dart.core::Object::•()
-      ;
-    abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
-    abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
-    abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
-    abstract member-signature method _simpleInstanceOfTrue(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfTrue
-    abstract member-signature method _simpleInstanceOfFalse(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfFalse
-    abstract member-signature operator ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
-    abstract member-signature get hashCode() → dart.core::int*; -> dart.core::Object::hashCode
-    abstract member-signature method toString() → dart.core::String*; -> dart.core::Object::toString
-    abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
-    abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
-  }
-  class _StdIOUtils extends dart.core::Object {
-    synthetic constructor •() → #lib::_StdIOUtils*
-      : super dart.core::Object::•()
-      ;
-    static method _getStdioInputStream(dart.core::int* fd) → #lib::Stdin*
-      return null;
-    abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
-    abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
-    abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
-    abstract member-signature method _simpleInstanceOfTrue(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfTrue
-    abstract member-signature method _simpleInstanceOfFalse(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfFalse
-    abstract member-signature operator ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
-    abstract member-signature get hashCode() → dart.core::int*; -> dart.core::Object::hashCode
-    abstract member-signature method toString() → dart.core::String*; -> dart.core::Object::toString
-    abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
-    abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
-  }
-  static field dart.core::int* _stdinFD = 0;
-  static field dart.core::int* _stdoutFD = 1;
-  static field dart.core::int* _stderrFD = 2;
-  static field dart.core::String* _rawScript;
-  static field #lib::Stdin* _stdin;
-  @#C8
-  external static method _printString(dart.core::String* s) → void;
-  static method _print(dynamic arg) → void {
-    #lib::_printString(arg.{dart.core::Object::toString}());
-  }
-  static method _getPrintClosure() → dynamic
-    return #C9;
-  static method _setScheduleImmediateClosure((() →* void) →* void closure) → void {
-    #lib::_ScheduleImmediate::_closure = closure;
-  }
-  static method _setStdioFDs(dart.core::int* stdin, dart.core::int* stdout, dart.core::int* stderr) → void {
-    #lib::_stdinFD = stdin;
-    #lib::_stdoutFD = stdout;
-    #lib::_stderrFD = stderr;
-  }
-  static method _scriptUri() → dart.core::Uri* {
-    if(#lib::_rawScript.{dart.core::String::startsWith}("http:") || #lib::_rawScript.{dart.core::String::startsWith}("https:") || #lib::_rawScript.{dart.core::String::startsWith}("file:")) {
-      return dart.core::Uri::parse(#lib::_rawScript);
-    }
-    else {
-      return dart.core::Uri::base.{dart.core::Uri::resolveUri}(dart.core::_Uri::file(#lib::_rawScript));
-    }
-  }
-  static method _setupHooks() → dynamic {
-    #lib::VMLibraryHooks::platformScript = #C10;
-  }
-  static get stdin() → #lib::Stdin* {
-    #lib::_stdin.{#lib::Stdin::==}(null) ?{#lib::Stdin*} #lib::_stdin = #lib::_StdIOUtils::_getStdioInputStream(#lib::_stdinFD) : null;
-    return #lib::_stdin;
-  }
-  static method main() → dynamic {}
-}
-constants  {
-  #C1 = "Namespace_Create"
-  #C2 = dart._internal::ExternalName {name:#C1}
-  #C3 = "Namespace_GetPointer"
-  #C4 = dart._internal::ExternalName {name:#C3}
-  #C5 = "Namespace_GetDefault"
-  #C6 = dart._internal::ExternalName {name:#C5}
-  #C7 = "Builtin_PrintString"
-  #C8 = dart._internal::ExternalName {name:#C7}
-  #C9 = tearoff #lib::_print
-  #C10 = tearoff #lib::_scriptUri
-}
diff --git a/pkg/vm/testcases/bytecode/closures.dart b/pkg/vm/testcases/bytecode/closures.dart
deleted file mode 100644
index 669a8f2..0000000
--- a/pkg/vm/testcases/bytecode/closures.dart
+++ /dev/null
@@ -1,168 +0,0 @@
-// Copyright (c) 2018, 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.
-
-int simpleClosure() {
-  int x = 5;
-  var inc = (int y) {
-    x = x + y;
-  };
-  inc(3);
-  return x;
-}
-
-class C1 {}
-
-class C2 {}
-
-class C3 {}
-
-class C4 {}
-
-class C5 {}
-
-class C6 {}
-
-class C7 {}
-
-class C8 {}
-
-class A<T1, T2> {
-  void foo<T3, T4>() {
-    void nested1<T5, T6>() {
-      void nested2<T7, T8>() {
-        var nested3 = () {
-          print([T1, T2, T3, T4, T5, T6, T7, T8]);
-          callWithArgs<T1, T2, T3, T4, T5, T6, T7, T8>();
-        };
-        nested3();
-      }
-
-      nested2<C7, C8>();
-      nested2<List<C7>, List<C8>>();
-    }
-
-    nested1<C5, C6>();
-    nested1<List<C5>, List<C6>>();
-  }
-}
-
-void callWithArgs<T1, T2, T3, T4, T5, T6, T7, T8>() {
-  print([T1, T2, T3, T4, T5, T6, T7, T8]);
-}
-
-void callA() {
-  new A<C1, C2>().foo<C3, C4>();
-  new A<C1, C2>().foo<List<C3>, List<C4>>();
-  new A<List<C1>, List<C2>>().foo<List<C3>, List<C4>>();
-}
-
-class B {
-  int foo;
-
-  void topLevel() {
-    {
-      int x = 1;
-
-      {
-        int y = 2;
-        int z = 3;
-
-        var closure1 = (int y) {
-          x = y + 1;
-
-          if (x > 5) {
-            int w = 4;
-
-            void closure2() {
-              z = x + 2;
-              w = foo + y;
-            }
-
-            closure2();
-
-            print(w);
-          }
-        };
-
-        closure1(10);
-        closure1(11);
-
-        print(y);
-        print(z);
-      }
-
-      print(x);
-    }
-
-    {
-      int x = 42;
-
-      var closure3 = () {
-        foo = x;
-      };
-
-      closure3();
-    }
-  }
-}
-
-class C {
-  void testForLoop() {
-    int delta = 0;
-    List<Function> getI = <Function>[];
-    List<Function> setI = <Function>[];
-    for (int i = 0; i < 10; i++) {
-      getI.add(() => i + delta);
-      setI.add((int ii) {
-        i = ii + delta;
-      });
-    }
-  }
-
-  void testForInLoop(List<int> list) {
-    for (var i in list) {
-      var inc = () {
-        i = i + 1;
-      };
-      inc();
-      print(i);
-    }
-  }
-}
-
-typedef IntFunc(int arg);
-
-IntFunc testPartialInstantiation() {
-  void foo<T>(T t) {}
-  IntFunc intFunc = foo;
-  return intFunc;
-}
-
-class D<T> {
-  foo(T t) {
-    return () => t;
-  }
-
-  bar() {
-    return () {
-      inner() {}
-
-      inner();
-    };
-  }
-}
-
-abstract class E {
-  int Function(int x, int y) foo1;
-  int Function<T>(T x, T y) get foo2;
-  int evalArg1();
-  int evalArg2();
-  E getE();
-
-  int testCallThroughGetter1() => foo1(evalArg1(), evalArg2());
-  int testCallThroughGetter2() => foo2<int>(evalArg1(), evalArg2());
-  int testCallThroughGetter3() => getE().foo2<int>(evalArg1(), evalArg2());
-}
-
-main() {}
diff --git a/pkg/vm/testcases/bytecode/closures.dart.expect b/pkg/vm/testcases/bytecode/closures.dart.expect
deleted file mode 100644
index d3939fb..0000000
--- a/pkg/vm/testcases/bytecode/closures.dart.expect
+++ /dev/null
@@ -1,2543 +0,0 @@
-main = #lib::main;
- [@vm.bytecode=
-BytecodeMetadata {
-Bytecode (version: stable)
-Main library: #lib
-Library '#lib'
-    name '#lib'
-    script '#lib'
-
-Class '', script = '#lib'
-
-
-Function 'simpleClosure', static, reflectable, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::int*
-
-Bytecode {
-  Entry                4
-  CheckStack           0
-  AllocateContext      0, 1
-  PopLocal             r0
-  Push                 r0
-  PushInt              5
-  StoreContextVar      0, 0
-  AllocateClosure      CP#0
-  StoreLocal           r3
-  Push                 r3
-  PushNull
-  StoreFieldTOS        CP#7
-  Push                 r3
-  PushNull
-  StoreFieldTOS        CP#9
-  Push                 r3
-  PushConstant         CP#0
-  StoreFieldTOS        CP#11
-  Push                 r3
-  Push                 r0
-  StoreFieldTOS        CP#1
-  PopLocal             r2
-  Push                 r2
-  StoreLocal           r3
-  PushInt              3
-  Push                 r3
-  UncheckedClosureCall CP#13, 2
-  Drop1
-  Push                 r0
-  LoadContextVar       0, 0
-  ReturnTOS
-}
-ConstantPool {
-  [0] = ClosureFunction 0
-  [1] = InstanceField dart:core::_Closure::_context (field)
-  [2] = Reserved
-  [3] = Type dart:core::int*
-  [4] = ObjectRef 'y'
-  [5] = SubtypeTestCache
-  [6] = EndClosureFunctionScope
-  [7] = InstanceField dart:core::_Closure::_instantiator_type_arguments (field)
-  [8] = Reserved
-  [9] = InstanceField dart:core::_Closure::_function_type_arguments (field)
-  [10] = Reserved
-  [11] = InstanceField dart:core::_Closure::_function (field)
-  [12] = Reserved
-  [13] = ObjectRef ArgDesc num-args 2, num-type-args 0, names []
-}
-Closure #lib::simpleClosure::'<anonymous closure>' (dart:core::int* y) -> dart:core::Null?
-ClosureCode {
-  Entry                3
-  Push                 FP[-6]
-  LoadFieldTOS         CP#1
-  PopLocal             r0
-  CheckStack           0
-  JumpIfUnchecked      L1
-  Push                 FP[-5]
-  PushConstant         CP#3
-  PushNull
-  PushNull
-  PushConstant         CP#4
-  AssertAssignable     1, CP#5
-  Drop1
-L1:
-  Push                 r0
-  Push                 r0
-  LoadContextVar       0, 0
-  Push                 FP[-5]
-  AddInt
-  StoreContextVar      0, 0
-  PushNull
-  ReturnTOS
-}
-
-
-Function 'callWithArgs', static, reflectable, debuggable
-    type-params <dart:core::Object* T1, dart:core::Object* T2, dart:core::Object* T3, dart:core::Object* T4, dart:core::Object* T5, dart:core::Object* T6, dart:core::Object* T7, dart:core::Object* T8>
-    parameters [] (required: 0)
-    return-type void
-
-Bytecode {
-  Entry                2
-  CheckFunctionTypeArgs 8, r0
-  CheckStack           0
-  PushConstant         CP#0
-  StoreLocal           r1
-  Push                 r1
-  PushInt              8
-  CreateArrayTOS
-  StoreLocal           r1
-  Push                 r1
-  PushInt              0
-  PushNull
-  Push                 r0
-  InstantiateType      CP#1
-  StoreIndexedTOS
-  Push                 r1
-  PushInt              1
-  PushNull
-  Push                 r0
-  InstantiateType      CP#2
-  StoreIndexedTOS
-  Push                 r1
-  PushInt              2
-  PushNull
-  Push                 r0
-  InstantiateType      CP#3
-  StoreIndexedTOS
-  Push                 r1
-  PushInt              3
-  PushNull
-  Push                 r0
-  InstantiateType      CP#4
-  StoreIndexedTOS
-  Push                 r1
-  PushInt              4
-  PushNull
-  Push                 r0
-  InstantiateType      CP#5
-  StoreIndexedTOS
-  Push                 r1
-  PushInt              5
-  PushNull
-  Push                 r0
-  InstantiateType      CP#6
-  StoreIndexedTOS
-  Push                 r1
-  PushInt              6
-  PushNull
-  Push                 r0
-  InstantiateType      CP#7
-  StoreIndexedTOS
-  Push                 r1
-  PushInt              7
-  PushNull
-  Push                 r0
-  InstantiateType      CP#8
-  StoreIndexedTOS
-  DirectCall           CP#9, 2
-  DirectCall           CP#11, 1
-  Drop1
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-  [0] = ObjectRef < dart:core::Type* >
-  [1] = Type #lib::callWithArgs::TypeParam/0*
-  [2] = Type #lib::callWithArgs::TypeParam/1*
-  [3] = Type #lib::callWithArgs::TypeParam/2*
-  [4] = Type #lib::callWithArgs::TypeParam/3*
-  [5] = Type #lib::callWithArgs::TypeParam/4*
-  [6] = Type #lib::callWithArgs::TypeParam/5*
-  [7] = Type #lib::callWithArgs::TypeParam/6*
-  [8] = Type #lib::callWithArgs::TypeParam/7*
-  [9] = DirectCall 'dart:core::List::_fromLiteral (constructor)', ArgDesc num-args 2, num-type-args 0, names []
-  [10] = Reserved
-  [11] = DirectCall 'dart:core::print', ArgDesc num-args 1, num-type-args 0, names []
-  [12] = Reserved
-}
-
-
-Function 'callA', static, reflectable, debuggable
-    parameters [] (required: 0)
-    return-type void
-
-Bytecode {
-  Entry                1
-  CheckStack           0
-  PushConstant         CP#0
-  PushConstant         CP#2
-  PushConstant         CP#1
-  AllocateT
-  StoreLocal           r0
-  Push                 r0
-  DirectCall           CP#3, 1
-  Drop1
-  InterfaceCall        CP#5, 2
-  Drop1
-  PushConstant         CP#7
-  PushConstant         CP#2
-  PushConstant         CP#1
-  AllocateT
-  StoreLocal           r0
-  Push                 r0
-  DirectCall           CP#3, 1
-  Drop1
-  InterfaceCall        CP#5, 2
-  Drop1
-  PushConstant         CP#7
-  PushConstant         CP#8
-  PushConstant         CP#1
-  AllocateT
-  StoreLocal           r0
-  Push                 r0
-  DirectCall           CP#3, 1
-  Drop1
-  InterfaceCall        CP#5, 2
-  Drop1
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-  [0] = ObjectRef < #lib::C3*, #lib::C4* >
-  [1] = Class #lib::A
-  [2] = ObjectRef < #lib::C1*, #lib::C2* >
-  [3] = DirectCall '#lib::A:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
-  [4] = Reserved
-  [5] = InterfaceCall '#lib::A::foo', ArgDesc num-args 1, num-type-args 2, names []
-  [6] = Reserved
-  [7] = ObjectRef < dart:core::List < #lib::C3* >*, dart:core::List < #lib::C4* >* >
-  [8] = ObjectRef < dart:core::List < #lib::C1* >*, dart:core::List < #lib::C2* >* >
-}
-
-
-Function 'testPartialInstantiation', static, reflectable, debuggable
-    parameters [] (required: 0)
-    return-type FunctionType (dart:core::int*)* -> dynamic
-
-Bytecode {
-  Entry                7
-  CheckStack           0
-  AllocateClosure      CP#0
-  StoreLocal           r3
-  Push                 r3
-  PushNull
-  StoreFieldTOS        CP#14
-  Push                 r3
-  PushNull
-  StoreFieldTOS        CP#6
-  Push                 r3
-  PushConstant         CP#5
-  StoreFieldTOS        CP#3
-  Push                 r3
-  PushConstant         CP#0
-  StoreFieldTOS        CP#16
-  Push                 r3
-  Push                 r0
-  StoreFieldTOS        CP#1
-  PopLocal             r2
-  Push                 r2
-  StoreLocal           r3
-  PushConstant         CP#18
-  StoreLocal           r6
-  DirectCall           CP#19, 2
-  Drop1
-  Allocate             CP#21
-  StoreLocal           r5
-  Push                 r6
-  StoreFieldTOS        CP#3
-  Push                 r5
-  Push                 r3
-  LoadFieldTOS         CP#14
-  StoreFieldTOS        CP#14
-  Push                 r5
-  Push                 r3
-  LoadFieldTOS         CP#6
-  StoreFieldTOS        CP#6
-  Push                 r5
-  Push                 r3
-  LoadFieldTOS         CP#16
-  StoreFieldTOS        CP#16
-  Push                 r5
-  Push                 r3
-  LoadFieldTOS         CP#1
-  StoreFieldTOS        CP#1
-  Push                 r5
-  PopLocal             r4
-  Push                 r4
-  ReturnTOS
-}
-ConstantPool {
-  [0] = ClosureFunction 0
-  [1] = InstanceField dart:core::_Closure::_context (field)
-  [2] = Reserved
-  [3] = InstanceField dart:core::_Closure::_delayed_type_arguments (field)
-  [4] = Reserved
-  [5] = EmptyTypeArguments
-  [6] = InstanceField dart:core::_Closure::_function_type_arguments (field)
-  [7] = Reserved
-  [8] = DirectCall 'dart:_internal::_prependTypeArguments', ArgDesc num-args 4, num-type-args 0, names []
-  [9] = Reserved
-  [10] = Type #lib::testPartialInstantiation::Closure/0::TypeParam/0*
-  [11] = ObjectRef 't'
-  [12] = SubtypeTestCache
-  [13] = EndClosureFunctionScope
-  [14] = InstanceField dart:core::_Closure::_instantiator_type_arguments (field)
-  [15] = Reserved
-  [16] = InstanceField dart:core::_Closure::_function (field)
-  [17] = Reserved
-  [18] = ObjectRef < dart:core::int* >
-  [19] = DirectCall 'dart:_internal::_boundsCheckForPartialInstantiation', ArgDesc num-args 2, num-type-args 0, names []
-  [20] = Reserved
-  [21] = Class dart:core::_Closure
-}
-Closure #lib::testPartialInstantiation::'foo' <dart:core::Object* T> (#lib::testPartialInstantiation::Closure/0::TypeParam/0* t) -> void
-ClosureCode {
-  Entry                3
-  Push                 FP[-6]
-  LoadFieldTOS         CP#1
-  PopLocal             r1
-  Push                 FP[-6]
-  LoadFieldTOS         CP#3
-  StoreLocal           r0
-  PushConstant         CP#5
-  JumpIfEqStrict       L1
-  CheckFunctionTypeArgs 0, r2
-  Jump                 L2
-L1:
-  CheckFunctionTypeArgs 1, r0
-L2:
-  CheckStack           0
-  Push                 r0
-  Push                 FP[-6]
-  LoadFieldTOS         CP#6
-  PushInt              0
-  PushInt              1
-  DirectCall           CP#8, 4
-  PopLocal             r0
-  JumpIfUnchecked      L3
-  Push                 FP[-5]
-  PushConstant         CP#10
-  PushNull
-  Push                 r0
-  PushConstant         CP#11
-  AssertAssignable     0, CP#12
-  Drop1
-L3:
-  PushNull
-  ReturnTOS
-}
-
-
-Function 'main', static, reflectable, debuggable
-    parameters [] (required: 0)
-    return-type dynamic
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-}
-
-Class 'C1', script = '#lib'
-    extends dart:core::Object*
-
-
-Function '', constructor, reflectable
-    parameters [] (required: 0)
-    return-type #lib::C1*
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  Push                 FP[-5]
-  DirectCall           CP#0, 1
-  Drop1
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-  [0] = DirectCall 'dart:core::Object:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
-  [1] = Reserved
-}
-
-
-Function 'get:_identityHashCode', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::int*
-
-Function '_instanceOf', abstract, debuggable
-    parameters [dynamic 'instantiatorTypeArguments', dynamic 'functionTypeArguments', dynamic 'type'] (required: 3)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOf', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOfTrue', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOfFalse', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '==', abstract, debuggable
-    parameters [dynamic 'other'] (required: 1)
-    return-type dart:core::bool*
-
-Function 'get:hashCode', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::int*
-
-Function 'toString', abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::String*
-
-Function 'noSuchMethod', abstract, debuggable
-    parameters [dart:core::Invocation* 'invocation'] (required: 1)
-    return-type dynamic
-
-Function 'get:runtimeType', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::Type*
-Class 'C2', script = '#lib'
-    extends dart:core::Object*
-
-
-Function '', constructor, reflectable
-    parameters [] (required: 0)
-    return-type #lib::C2*
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  Push                 FP[-5]
-  DirectCall           CP#0, 1
-  Drop1
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-  [0] = DirectCall 'dart:core::Object:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
-  [1] = Reserved
-}
-
-
-Function 'get:_identityHashCode', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::int*
-
-Function '_instanceOf', abstract, debuggable
-    parameters [dynamic 'instantiatorTypeArguments', dynamic 'functionTypeArguments', dynamic 'type'] (required: 3)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOf', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOfTrue', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOfFalse', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '==', abstract, debuggable
-    parameters [dynamic 'other'] (required: 1)
-    return-type dart:core::bool*
-
-Function 'get:hashCode', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::int*
-
-Function 'toString', abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::String*
-
-Function 'noSuchMethod', abstract, debuggable
-    parameters [dart:core::Invocation* 'invocation'] (required: 1)
-    return-type dynamic
-
-Function 'get:runtimeType', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::Type*
-Class 'C3', script = '#lib'
-    extends dart:core::Object*
-
-
-Function '', constructor, reflectable
-    parameters [] (required: 0)
-    return-type #lib::C3*
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  Push                 FP[-5]
-  DirectCall           CP#0, 1
-  Drop1
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-  [0] = DirectCall 'dart:core::Object:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
-  [1] = Reserved
-}
-
-
-Function 'get:_identityHashCode', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::int*
-
-Function '_instanceOf', abstract, debuggable
-    parameters [dynamic 'instantiatorTypeArguments', dynamic 'functionTypeArguments', dynamic 'type'] (required: 3)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOf', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOfTrue', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOfFalse', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '==', abstract, debuggable
-    parameters [dynamic 'other'] (required: 1)
-    return-type dart:core::bool*
-
-Function 'get:hashCode', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::int*
-
-Function 'toString', abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::String*
-
-Function 'noSuchMethod', abstract, debuggable
-    parameters [dart:core::Invocation* 'invocation'] (required: 1)
-    return-type dynamic
-
-Function 'get:runtimeType', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::Type*
-Class 'C4', script = '#lib'
-    extends dart:core::Object*
-
-
-Function '', constructor, reflectable
-    parameters [] (required: 0)
-    return-type #lib::C4*
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  Push                 FP[-5]
-  DirectCall           CP#0, 1
-  Drop1
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-  [0] = DirectCall 'dart:core::Object:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
-  [1] = Reserved
-}
-
-
-Function 'get:_identityHashCode', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::int*
-
-Function '_instanceOf', abstract, debuggable
-    parameters [dynamic 'instantiatorTypeArguments', dynamic 'functionTypeArguments', dynamic 'type'] (required: 3)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOf', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOfTrue', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOfFalse', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '==', abstract, debuggable
-    parameters [dynamic 'other'] (required: 1)
-    return-type dart:core::bool*
-
-Function 'get:hashCode', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::int*
-
-Function 'toString', abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::String*
-
-Function 'noSuchMethod', abstract, debuggable
-    parameters [dart:core::Invocation* 'invocation'] (required: 1)
-    return-type dynamic
-
-Function 'get:runtimeType', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::Type*
-Class 'C5', script = '#lib'
-    extends dart:core::Object*
-
-
-Function '', constructor, reflectable
-    parameters [] (required: 0)
-    return-type #lib::C5*
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  Push                 FP[-5]
-  DirectCall           CP#0, 1
-  Drop1
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-  [0] = DirectCall 'dart:core::Object:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
-  [1] = Reserved
-}
-
-
-Function 'get:_identityHashCode', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::int*
-
-Function '_instanceOf', abstract, debuggable
-    parameters [dynamic 'instantiatorTypeArguments', dynamic 'functionTypeArguments', dynamic 'type'] (required: 3)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOf', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOfTrue', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOfFalse', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '==', abstract, debuggable
-    parameters [dynamic 'other'] (required: 1)
-    return-type dart:core::bool*
-
-Function 'get:hashCode', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::int*
-
-Function 'toString', abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::String*
-
-Function 'noSuchMethod', abstract, debuggable
-    parameters [dart:core::Invocation* 'invocation'] (required: 1)
-    return-type dynamic
-
-Function 'get:runtimeType', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::Type*
-Class 'C6', script = '#lib'
-    extends dart:core::Object*
-
-
-Function '', constructor, reflectable
-    parameters [] (required: 0)
-    return-type #lib::C6*
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  Push                 FP[-5]
-  DirectCall           CP#0, 1
-  Drop1
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-  [0] = DirectCall 'dart:core::Object:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
-  [1] = Reserved
-}
-
-
-Function 'get:_identityHashCode', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::int*
-
-Function '_instanceOf', abstract, debuggable
-    parameters [dynamic 'instantiatorTypeArguments', dynamic 'functionTypeArguments', dynamic 'type'] (required: 3)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOf', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOfTrue', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOfFalse', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '==', abstract, debuggable
-    parameters [dynamic 'other'] (required: 1)
-    return-type dart:core::bool*
-
-Function 'get:hashCode', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::int*
-
-Function 'toString', abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::String*
-
-Function 'noSuchMethod', abstract, debuggable
-    parameters [dart:core::Invocation* 'invocation'] (required: 1)
-    return-type dynamic
-
-Function 'get:runtimeType', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::Type*
-Class 'C7', script = '#lib'
-    extends dart:core::Object*
-
-
-Function '', constructor, reflectable
-    parameters [] (required: 0)
-    return-type #lib::C7*
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  Push                 FP[-5]
-  DirectCall           CP#0, 1
-  Drop1
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-  [0] = DirectCall 'dart:core::Object:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
-  [1] = Reserved
-}
-
-
-Function 'get:_identityHashCode', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::int*
-
-Function '_instanceOf', abstract, debuggable
-    parameters [dynamic 'instantiatorTypeArguments', dynamic 'functionTypeArguments', dynamic 'type'] (required: 3)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOf', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOfTrue', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOfFalse', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '==', abstract, debuggable
-    parameters [dynamic 'other'] (required: 1)
-    return-type dart:core::bool*
-
-Function 'get:hashCode', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::int*
-
-Function 'toString', abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::String*
-
-Function 'noSuchMethod', abstract, debuggable
-    parameters [dart:core::Invocation* 'invocation'] (required: 1)
-    return-type dynamic
-
-Function 'get:runtimeType', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::Type*
-Class 'C8', script = '#lib'
-    extends dart:core::Object*
-
-
-Function '', constructor, reflectable
-    parameters [] (required: 0)
-    return-type #lib::C8*
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  Push                 FP[-5]
-  DirectCall           CP#0, 1
-  Drop1
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-  [0] = DirectCall 'dart:core::Object:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
-  [1] = Reserved
-}
-
-
-Function 'get:_identityHashCode', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::int*
-
-Function '_instanceOf', abstract, debuggable
-    parameters [dynamic 'instantiatorTypeArguments', dynamic 'functionTypeArguments', dynamic 'type'] (required: 3)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOf', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOfTrue', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOfFalse', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '==', abstract, debuggable
-    parameters [dynamic 'other'] (required: 1)
-    return-type dart:core::bool*
-
-Function 'get:hashCode', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::int*
-
-Function 'toString', abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::String*
-
-Function 'noSuchMethod', abstract, debuggable
-    parameters [dart:core::Invocation* 'invocation'] (required: 1)
-    return-type dynamic
-
-Function 'get:runtimeType', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::Type*
-Class 'A', script = '#lib'
-    type-params <dart:core::Object* T1, dart:core::Object* T2> (args: 2)
-    extends dart:core::Object*
-
-
-Function '', constructor, reflectable
-    parameters [] (required: 0)
-    return-type #lib::A < #lib::A::TypeParam/0*, #lib::A::TypeParam/1* >*
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  Push                 FP[-5]
-  DirectCall           CP#0, 1
-  Drop1
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-  [0] = DirectCall 'dart:core::Object:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
-  [1] = Reserved
-}
-
-
-Function 'foo', reflectable, debuggable
-    type-params <dart:core::Object* T3, dart:core::Object* T4>
-    parameters [] (required: 0)
-    return-type void
-
-Bytecode {
-  Entry                5
-  CheckFunctionTypeArgs 2, r0
-  CheckStack           0
-  AllocateContext      0, 1
-  PopLocal             r1
-  Push                 r1
-  Push                 FP[-5]
-  StoreContextVar      0, 0
-  AllocateClosure      CP#0
-  StoreLocal           r4
-  Push                 r4
-  Push                 FP[-5]
-  LoadTypeArgumentsField CP#14
-  StoreFieldTOS        CP#30
-  Push                 r4
-  Push                 r0
-  StoreFieldTOS        CP#6
-  Push                 r4
-  PushConstant         CP#5
-  StoreFieldTOS        CP#3
-  Push                 r4
-  PushConstant         CP#0
-  StoreFieldTOS        CP#32
-  Push                 r4
-  Push                 r1
-  StoreFieldTOS        CP#1
-  PopLocal             r3
-  PushConstant         CP#40
-  Push                 r3
-  StoreLocal           r4
-  Push                 r4
-  UncheckedClosureCall CP#37, 2
-  Drop1
-  PushConstant         CP#41
-  Push                 r3
-  StoreLocal           r4
-  Push                 r4
-  UncheckedClosureCall CP#37, 2
-  Drop1
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-  [0] = ClosureFunction 0
-  [1] = InstanceField dart:core::_Closure::_context (field)
-  [2] = Reserved
-  [3] = InstanceField dart:core::_Closure::_delayed_type_arguments (field)
-  [4] = Reserved
-  [5] = EmptyTypeArguments
-  [6] = InstanceField dart:core::_Closure::_function_type_arguments (field)
-  [7] = Reserved
-  [8] = DirectCall 'dart:_internal::_prependTypeArguments', ArgDesc num-args 4, num-type-args 0, names []
-  [9] = Reserved
-  [10] = ClosureFunction 1
-  [11] = ClosureFunction 2
-  [12] = ObjectRef < dart:core::Type* >
-  [13] = Type #lib::A::TypeParam/0*
-  [14] = TypeArgumentsField #lib::A
-  [15] = Type #lib::A::TypeParam/1*
-  [16] = Type #lib::A::foo::TypeParam/0*
-  [17] = Type #lib::A::foo::TypeParam/1*
-  [18] = Type #lib::A::foo::Closure/0::TypeParam/0*
-  [19] = Type #lib::A::foo::Closure/0::TypeParam/1*
-  [20] = Type #lib::A::foo::Closure/1::TypeParam/0*
-  [21] = Type #lib::A::foo::Closure/1::TypeParam/1*
-  [22] = DirectCall 'dart:core::List::_fromLiteral (constructor)', ArgDesc num-args 2, num-type-args 0, names []
-  [23] = Reserved
-  [24] = DirectCall 'dart:core::print', ArgDesc num-args 1, num-type-args 0, names []
-  [25] = Reserved
-  [26] = ObjectRef < #lib::A::TypeParam/0*, #lib::A::TypeParam/1*, #lib::A::foo::TypeParam/0*, #lib::A::foo::TypeParam/1*, #lib::A::foo::Closure/0::TypeParam/0*, #lib::A::foo::Closure/0::TypeParam/1*, #lib::A::foo::Closure/1::TypeParam/0*, #lib::A::foo::Closure/1::TypeParam/1* >
-  [27] = DirectCall '#lib::callWithArgs', ArgDesc num-args 0, num-type-args 8, names []
-  [28] = Reserved
-  [29] = EndClosureFunctionScope
-  [30] = InstanceField dart:core::_Closure::_instantiator_type_arguments (field)
-  [31] = Reserved
-  [32] = InstanceField dart:core::_Closure::_function (field)
-  [33] = Reserved
-  [34] = ObjectRef ArgDesc num-args 1, num-type-args 0, names []
-  [35] = EndClosureFunctionScope
-  [36] = ObjectRef < #lib::C7*, #lib::C8* >
-  [37] = ObjectRef ArgDesc num-args 1, num-type-args 2, names []
-  [38] = ObjectRef < dart:core::List < #lib::C7* >*, dart:core::List < #lib::C8* >* >
-  [39] = EndClosureFunctionScope
-  [40] = ObjectRef < #lib::C5*, #lib::C6* >
-  [41] = ObjectRef < dart:core::List < #lib::C5* >*, dart:core::List < #lib::C6* >* >
-}
-Closure #lib::A::foo::'nested1' <dart:core::Object* T5, dart:core::Object* T6> () -> void
-ClosureCode {
-  Entry                5
-  Push                 FP[-5]
-  LoadFieldTOS         CP#1
-  PopLocal             r1
-  Push                 FP[-5]
-  LoadFieldTOS         CP#3
-  StoreLocal           r0
-  PushConstant         CP#5
-  JumpIfEqStrict       L1
-  CheckFunctionTypeArgs 0, r2
-  Jump                 L2
-L1:
-  CheckFunctionTypeArgs 2, r0
-L2:
-  CheckStack           0
-  Push                 r0
-  Push                 FP[-5]
-  LoadFieldTOS         CP#6
-  PushInt              2
-  PushInt              4
-  DirectCall           CP#8, 4
-  PopLocal             r0
-  AllocateClosure      CP#10
-  StoreLocal           r4
-  Push                 r4
-  Push                 r1
-  LoadContextVar       0, 0
-  LoadTypeArgumentsField CP#14
-  StoreFieldTOS        CP#30
-  Push                 r4
-  Push                 r0
-  StoreFieldTOS        CP#6
-  Push                 r4
-  PushConstant         CP#5
-  StoreFieldTOS        CP#3
-  Push                 r4
-  PushConstant         CP#10
-  StoreFieldTOS        CP#32
-  Push                 r4
-  Push                 r1
-  StoreFieldTOS        CP#1
-  PopLocal             r3
-  PushConstant         CP#36
-  Push                 r3
-  StoreLocal           r4
-  Push                 r4
-  UncheckedClosureCall CP#37, 2
-  Drop1
-  PushConstant         CP#38
-  Push                 r3
-  StoreLocal           r4
-  Push                 r4
-  UncheckedClosureCall CP#37, 2
-  Drop1
-  PushNull
-  ReturnTOS
-}
-
-Closure #lib::A::foo::Closure/0::'nested2' <dart:core::Object* T7, dart:core::Object* T8> () -> void
-ClosureCode {
-  Entry                5
-  Push                 FP[-5]
-  LoadFieldTOS         CP#1
-  PopLocal             r1
-  Push                 FP[-5]
-  LoadFieldTOS         CP#3
-  StoreLocal           r0
-  PushConstant         CP#5
-  JumpIfEqStrict       L1
-  CheckFunctionTypeArgs 0, r2
-  Jump                 L2
-L1:
-  CheckFunctionTypeArgs 2, r0
-L2:
-  CheckStack           0
-  Push                 r0
-  Push                 FP[-5]
-  LoadFieldTOS         CP#6
-  PushInt              4
-  PushInt              6
-  DirectCall           CP#8, 4
-  PopLocal             r0
-  AllocateClosure      CP#11
-  StoreLocal           r4
-  Push                 r4
-  Push                 r1
-  LoadContextVar       0, 0
-  LoadTypeArgumentsField CP#14
-  StoreFieldTOS        CP#30
-  Push                 r4
-  Push                 r0
-  StoreFieldTOS        CP#6
-  Push                 r4
-  PushConstant         CP#11
-  StoreFieldTOS        CP#32
-  Push                 r4
-  Push                 r1
-  StoreFieldTOS        CP#1
-  PopLocal             r3
-  Push                 r3
-  StoreLocal           r4
-  Push                 r4
-  UncheckedClosureCall CP#34, 1
-  Drop1
-  PushNull
-  ReturnTOS
-}
-
-Closure #lib::A::foo::Closure/1::'<anonymous closure>' () -> dart:core::Null?
-ClosureCode {
-  Entry                4
-  Push                 FP[-5]
-  LoadFieldTOS         CP#1
-  PopLocal             r1
-  CheckStack           0
-  Push                 FP[-5]
-  LoadFieldTOS         CP#6
-  PopLocal             r0
-  PushConstant         CP#12
-  StoreLocal           r3
-  Push                 r3
-  PushInt              8
-  CreateArrayTOS
-  StoreLocal           r3
-  Push                 r3
-  PushInt              0
-  Push                 r1
-  LoadContextVar       0, 0
-  LoadTypeArgumentsField CP#14
-  PushNull
-  InstantiateType      CP#13
-  StoreIndexedTOS
-  Push                 r3
-  PushInt              1
-  Push                 r1
-  LoadContextVar       0, 0
-  LoadTypeArgumentsField CP#14
-  PushNull
-  InstantiateType      CP#15
-  StoreIndexedTOS
-  Push                 r3
-  PushInt              2
-  PushNull
-  Push                 r0
-  InstantiateType      CP#16
-  StoreIndexedTOS
-  Push                 r3
-  PushInt              3
-  PushNull
-  Push                 r0
-  InstantiateType      CP#17
-  StoreIndexedTOS
-  Push                 r3
-  PushInt              4
-  PushNull
-  Push                 r0
-  InstantiateType      CP#18
-  StoreIndexedTOS
-  Push                 r3
-  PushInt              5
-  PushNull
-  Push                 r0
-  InstantiateType      CP#19
-  StoreIndexedTOS
-  Push                 r3
-  PushInt              6
-  PushNull
-  Push                 r0
-  InstantiateType      CP#20
-  StoreIndexedTOS
-  Push                 r3
-  PushInt              7
-  PushNull
-  Push                 r0
-  InstantiateType      CP#21
-  StoreIndexedTOS
-  DirectCall           CP#22, 2
-  DirectCall           CP#24, 1
-  Drop1
-  Push                 r1
-  LoadContextVar       0, 0
-  LoadTypeArgumentsField CP#14
-  Push                 r0
-  InstantiateTypeArgumentsTOS 0, CP#26
-  DirectCall           CP#27, 1
-  Drop1
-  PushNull
-  ReturnTOS
-}
-
-
-Function 'get:_identityHashCode', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::int*
-
-Function '_instanceOf', abstract, debuggable
-    parameters [dynamic 'instantiatorTypeArguments', dynamic 'functionTypeArguments', dynamic 'type'] (required: 3)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOf', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOfTrue', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOfFalse', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '==', abstract, debuggable
-    parameters [dynamic 'other'] (required: 1)
-    return-type dart:core::bool*
-
-Function 'get:hashCode', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::int*
-
-Function 'toString', abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::String*
-
-Function 'noSuchMethod', abstract, debuggable
-    parameters [dart:core::Invocation* 'invocation'] (required: 1)
-    return-type dynamic
-
-Function 'get:runtimeType', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::Type*
-Class 'B', script = '#lib'
-    extends dart:core::Object*
-
-Field 'foo', type = dart:core::int*, getter = 'get:foo', setter = 'set:foo', reflectable, has-initializer
-    value = null
-
-Function '', constructor, reflectable
-    parameters [] (required: 0)
-    return-type #lib::B*
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  Push                 FP[-5]
-  DirectCall           CP#0, 1
-  Drop1
-  PushNull
-  ReturnTOS
-}
-Nullable fields: [#lib::B::foo (field)]
-ConstantPool {
-  [0] = DirectCall 'dart:core::Object:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
-  [1] = Reserved
-}
-
-
-Function 'topLevel', reflectable, debuggable
-    parameters [] (required: 0)
-    return-type void
-
-Bytecode {
-  Entry                5
-  CheckStack           0
-  AllocateContext      0, 4
-  PopLocal             r0
-  Push                 r0
-  Push                 FP[-5]
-  StoreContextVar      0, 0
-  Push                 r0
-  PushInt              1
-  StoreContextVar      0, 1
-  PushInt              2
-  PopLocal             r2
-  Push                 r0
-  PushInt              3
-  StoreContextVar      0, 2
-  AllocateClosure      CP#0
-  StoreLocal           r4
-  Push                 r4
-  PushNull
-  StoreFieldTOS        CP#10
-  Push                 r4
-  PushNull
-  StoreFieldTOS        CP#12
-  Push                 r4
-  PushConstant         CP#0
-  StoreFieldTOS        CP#14
-  Push                 r4
-  Push                 r0
-  StoreFieldTOS        CP#1
-  PopLocal             r3
-  Push                 r3
-  StoreLocal           r4
-  PushInt              10
-  Push                 r4
-  UncheckedClosureCall CP#20, 2
-  Drop1
-  Push                 r3
-  StoreLocal           r4
-  PushInt              11
-  Push                 r4
-  UncheckedClosureCall CP#20, 2
-  Drop1
-  Push                 r2
-  DirectCall           CP#17, 1
-  Drop1
-  Push                 r0
-  LoadContextVar       0, 2
-  DirectCall           CP#17, 1
-  Drop1
-  Push                 r0
-  LoadContextVar       0, 1
-  DirectCall           CP#17, 1
-  Drop1
-  Push                 r0
-  PushInt              42
-  StoreContextVar      0, 3
-  AllocateClosure      CP#21
-  StoreLocal           r3
-  Push                 r3
-  PushNull
-  StoreFieldTOS        CP#10
-  Push                 r3
-  PushNull
-  StoreFieldTOS        CP#12
-  Push                 r3
-  PushConstant         CP#21
-  StoreFieldTOS        CP#14
-  Push                 r3
-  Push                 r0
-  StoreFieldTOS        CP#1
-  PopLocal             r2
-  Push                 r2
-  StoreLocal           r3
-  Push                 r3
-  UncheckedClosureCall CP#16, 1
-  Drop1
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-  [0] = ClosureFunction 0
-  [1] = InstanceField dart:core::_Closure::_context (field)
-  [2] = Reserved
-  [3] = Type dart:core::int*
-  [4] = ObjectRef 'y'
-  [5] = SubtypeTestCache
-  [6] = ClosureFunction 1
-  [7] = InterfaceCall '#lib::B::get:foo', ArgDesc num-args 1, num-type-args 0, names []
-  [8] = Reserved
-  [9] = EndClosureFunctionScope
-  [10] = InstanceField dart:core::_Closure::_instantiator_type_arguments (field)
-  [11] = Reserved
-  [12] = InstanceField dart:core::_Closure::_function_type_arguments (field)
-  [13] = Reserved
-  [14] = InstanceField dart:core::_Closure::_function (field)
-  [15] = Reserved
-  [16] = ObjectRef ArgDesc num-args 1, num-type-args 0, names []
-  [17] = DirectCall 'dart:core::print', ArgDesc num-args 1, num-type-args 0, names []
-  [18] = Reserved
-  [19] = EndClosureFunctionScope
-  [20] = ObjectRef ArgDesc num-args 2, num-type-args 0, names []
-  [21] = ClosureFunction 2
-  [22] = InterfaceCall '#lib::B::set:foo', ArgDesc num-args 2, num-type-args 0, names []
-  [23] = Reserved
-  [24] = EndClosureFunctionScope
-}
-Closure #lib::B::topLevel::'<anonymous closure>' (dart:core::int* y) -> dart:core::Null?
-ClosureCode {
-  Entry                4
-  Push                 FP[-6]
-  LoadFieldTOS         CP#1
-  PopLocal             r0
-  CheckStack           0
-  AllocateContext      1, 2
-  StoreLocal           r1
-  Push                 r1
-  Push                 r0
-  StoreContextParent
-  PopLocal             r0
-  Push                 r0
-  Push                 FP[-5]
-  StoreContextVar      1, 0
-  JumpIfUnchecked      L1
-  Push                 FP[-5]
-  PushConstant         CP#3
-  PushNull
-  PushNull
-  PushConstant         CP#4
-  AssertAssignable     1, CP#5
-  Drop1
-L1:
-  Push                 r0
-  LoadContextParent
-  Push                 r0
-  LoadContextVar       1, 0
-  PushInt              1
-  AddInt
-  StoreContextVar      0, 1
-  Push                 r0
-  LoadContextParent
-  LoadContextVar       0, 1
-  PushInt              5
-  CompareIntGt
-  JumpIfFalse          L2
-  Push                 r0
-  PushInt              4
-  StoreContextVar      1, 1
-  AllocateClosure      CP#6
-  StoreLocal           r2
-  Push                 r2
-  PushNull
-  StoreFieldTOS        CP#10
-  Push                 r2
-  PushNull
-  StoreFieldTOS        CP#12
-  Push                 r2
-  PushConstant         CP#6
-  StoreFieldTOS        CP#14
-  Push                 r2
-  Push                 r0
-  StoreFieldTOS        CP#1
-  PopLocal             r3
-  Push                 r3
-  StoreLocal           r2
-  Push                 r2
-  UncheckedClosureCall CP#16, 1
-  Drop1
-  Push                 r0
-  LoadContextVar       1, 1
-  DirectCall           CP#17, 1
-  Drop1
-L2:
-  PushNull
-  ReturnTOS
-}
-
-Closure #lib::B::topLevel::Closure/0::'closure2' () -> void
-ClosureCode {
-  Entry                3
-  Push                 FP[-5]
-  LoadFieldTOS         CP#1
-  PopLocal             r0
-  CheckStack           0
-  Push                 r0
-  LoadContextParent
-  Push                 r0
-  LoadContextParent
-  LoadContextVar       0, 1
-  PushInt              2
-  AddInt
-  StoreContextVar      0, 2
-  Push                 r0
-  Push                 r0
-  LoadContextParent
-  LoadContextVar       0, 0
-  InterfaceCall        CP#7, 1
-  Push                 r0
-  LoadContextVar       1, 0
-  AddInt
-  StoreContextVar      1, 1
-  PushNull
-  ReturnTOS
-}
-
-Closure #lib::B::topLevel::'<anonymous closure>' () -> dart:core::Null?
-ClosureCode {
-  Entry                3
-  Push                 FP[-5]
-  LoadFieldTOS         CP#1
-  PopLocal             r0
-  CheckStack           0
-  Push                 r0
-  LoadContextVar       0, 0
-  Push                 r0
-  LoadContextVar       0, 3
-  InterfaceCall        CP#22, 2
-  Drop1
-  PushNull
-  ReturnTOS
-}
-
-
-Function 'get:_identityHashCode', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::int*
-
-Function '_instanceOf', abstract, debuggable
-    parameters [dynamic 'instantiatorTypeArguments', dynamic 'functionTypeArguments', dynamic 'type'] (required: 3)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOf', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOfTrue', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOfFalse', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '==', abstract, debuggable
-    parameters [dynamic 'other'] (required: 1)
-    return-type dart:core::bool*
-
-Function 'get:hashCode', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::int*
-
-Function 'toString', abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::String*
-
-Function 'noSuchMethod', abstract, debuggable
-    parameters [dart:core::Invocation* 'invocation'] (required: 1)
-    return-type dynamic
-
-Function 'get:runtimeType', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::Type*
-Class 'C', script = '#lib'
-    extends dart:core::Object*
-
-
-Function '', constructor, reflectable
-    parameters [] (required: 0)
-    return-type #lib::C*
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  Push                 FP[-5]
-  DirectCall           CP#0, 1
-  Drop1
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-  [0] = DirectCall 'dart:core::Object:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
-  [1] = Reserved
-}
-
-
-Function 'testForLoop', reflectable, debuggable
-    parameters [] (required: 0)
-    return-type void
-
-Bytecode {
-  Entry                5
-  CheckStack           0
-  AllocateContext      0, 1
-  PopLocal             r0
-  Push                 r0
-  PushInt              0
-  StoreContextVar      0, 0
-  PushConstant         CP#0
-  PushConstant         CP#1
-  DirectCall           CP#2, 2
-  PopLocal             r2
-  PushConstant         CP#0
-  PushConstant         CP#1
-  DirectCall           CP#2, 2
-  PopLocal             r4
-  AllocateContext      1, 1
-  StoreLocal           r1
-  Push                 r1
-  Push                 r0
-  StoreContextParent
-  PopLocal             r0
-  Push                 r0
-  PushInt              0
-  StoreContextVar      1, 0
-L2:
-  CheckStack           1
-  Push                 r0
-  LoadContextVar       1, 0
-  PushInt              10
-  CompareIntLt
-  JumpIfFalse          L1
-  Push                 r2
-  AllocateClosure      CP#4
-  StoreLocal           r3
-  Push                 r3
-  PushNull
-  StoreFieldTOS        CP#8
-  Push                 r3
-  PushNull
-  StoreFieldTOS        CP#10
-  Push                 r3
-  PushConstant         CP#4
-  StoreFieldTOS        CP#12
-  Push                 r3
-  Push                 r0
-  StoreFieldTOS        CP#5
-  InstantiatedInterfaceCall CP#14, 2
-  Drop1
-  Push                 r4
-  AllocateClosure      CP#17
-  StoreLocal           r3
-  Push                 r3
-  PushNull
-  StoreFieldTOS        CP#8
-  Push                 r3
-  PushNull
-  StoreFieldTOS        CP#10
-  Push                 r3
-  PushConstant         CP#17
-  StoreFieldTOS        CP#12
-  Push                 r3
-  Push                 r0
-  StoreFieldTOS        CP#5
-  InstantiatedInterfaceCall CP#14, 2
-  Drop1
-  Push                 r0
-  CloneContext         1, 1
-  PopLocal             r0
-  Push                 r0
-  Push                 r0
-  LoadContextVar       1, 0
-  PushInt              1
-  AddInt
-  StoreLocal           r3
-  StoreContextVar      1, 0
-  Push                 r3
-  Drop1
-  Jump                 L2
-L1:
-  Push                 r0
-  LoadContextParent
-  PopLocal             r0
-  Push                 r0
-  LoadContextParent
-  PopLocal             r0
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-  [0] = ObjectRef < dart:core::Function* >
-  [1] = ObjectRef const <dynamic> []
-  [2] = DirectCall 'dart:core::List::_fromLiteral (constructor)', ArgDesc num-args 2, num-type-args 0, names []
-  [3] = Reserved
-  [4] = ClosureFunction 0
-  [5] = InstanceField dart:core::_Closure::_context (field)
-  [6] = Reserved
-  [7] = EndClosureFunctionScope
-  [8] = InstanceField dart:core::_Closure::_instantiator_type_arguments (field)
-  [9] = Reserved
-  [10] = InstanceField dart:core::_Closure::_function_type_arguments (field)
-  [11] = Reserved
-  [12] = InstanceField dart:core::_Closure::_function (field)
-  [13] = Reserved
-  [14] = InstantiatedInterfaceCall 'dart:core::List::add', ArgDesc num-args 2, num-type-args 0, names [], receiver dart:core::List < dart:core::Function* >*
-  [15] = Reserved
-  [16] = Reserved
-  [17] = ClosureFunction 1
-  [18] = Type dart:core::int*
-  [19] = ObjectRef 'ii'
-  [20] = SubtypeTestCache
-  [21] = EndClosureFunctionScope
-}
-Closure #lib::C::testForLoop::'<anonymous closure>' () -> dart:core::int*
-ClosureCode {
-  Entry                2
-  Push                 FP[-5]
-  LoadFieldTOS         CP#5
-  PopLocal             r0
-  CheckStack           0
-  Push                 r0
-  LoadContextVar       1, 0
-  Push                 r0
-  LoadContextParent
-  LoadContextVar       0, 0
-  AddInt
-  ReturnTOS
-}
-
-Closure #lib::C::testForLoop::'<anonymous closure>' (dart:core::int* ii) -> dart:core::Null?
-ClosureCode {
-  Entry                3
-  Push                 FP[-6]
-  LoadFieldTOS         CP#5
-  PopLocal             r0
-  CheckStack           0
-  JumpIfUnchecked      L1
-  Push                 FP[-5]
-  PushConstant         CP#18
-  PushNull
-  PushNull
-  PushConstant         CP#19
-  AssertAssignable     1, CP#20
-  Drop1
-L1:
-  Push                 r0
-  Push                 FP[-5]
-  Push                 r0
-  LoadContextParent
-  LoadContextVar       0, 0
-  AddInt
-  StoreContextVar      1, 0
-  PushNull
-  ReturnTOS
-}
-
-
-Function 'testForInLoop', reflectable, debuggable
-    parameters [dart:core::List < dart:core::int* >* 'list'] (required: 1)
-    return-type void
-
-Bytecode {
-  Entry                5
-  CheckStack           0
-  Push                 FP[-5]
-  InterfaceCall        CP#0, 1
-  PopLocal             r2
-L2:
-  CheckStack           1
-  Push                 r2
-  InterfaceCall        CP#2, 1
-  AssertBoolean        0
-  JumpIfFalse          L1
-  AllocateContext      0, 1
-  PopLocal             r0
-  Push                 r0
-  Push                 r2
-  InterfaceCall        CP#4, 1
-  StoreContextVar      0, 0
-  AllocateClosure      CP#6
-  StoreLocal           r4
-  Push                 r4
-  PushNull
-  StoreFieldTOS        CP#10
-  Push                 r4
-  PushNull
-  StoreFieldTOS        CP#12
-  Push                 r4
-  PushConstant         CP#6
-  StoreFieldTOS        CP#14
-  Push                 r4
-  Push                 r0
-  StoreFieldTOS        CP#7
-  PopLocal             r3
-  Push                 r3
-  StoreLocal           r4
-  Push                 r4
-  UncheckedClosureCall CP#16, 1
-  Drop1
-  Push                 r0
-  LoadContextVar       0, 0
-  DirectCall           CP#17, 1
-  Drop1
-  Push                 r0
-  LoadContextParent
-  PopLocal             r0
-  Jump                 L2
-L1:
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-  [0] = InterfaceCall 'dart:core::Iterable::get:iterator', ArgDesc num-args 1, num-type-args 0, names []
-  [1] = Reserved
-  [2] = InterfaceCall 'dart:core::Iterator::moveNext', ArgDesc num-args 1, num-type-args 0, names []
-  [3] = Reserved
-  [4] = InterfaceCall 'dart:core::Iterator::get:current', ArgDesc num-args 1, num-type-args 0, names []
-  [5] = Reserved
-  [6] = ClosureFunction 0
-  [7] = InstanceField dart:core::_Closure::_context (field)
-  [8] = Reserved
-  [9] = EndClosureFunctionScope
-  [10] = InstanceField dart:core::_Closure::_instantiator_type_arguments (field)
-  [11] = Reserved
-  [12] = InstanceField dart:core::_Closure::_function_type_arguments (field)
-  [13] = Reserved
-  [14] = InstanceField dart:core::_Closure::_function (field)
-  [15] = Reserved
-  [16] = ObjectRef ArgDesc num-args 1, num-type-args 0, names []
-  [17] = DirectCall 'dart:core::print', ArgDesc num-args 1, num-type-args 0, names []
-  [18] = Reserved
-}
-Closure #lib::C::testForInLoop::'<anonymous closure>' () -> dart:core::Null?
-ClosureCode {
-  Entry                3
-  Push                 FP[-5]
-  LoadFieldTOS         CP#7
-  PopLocal             r0
-  CheckStack           0
-  Push                 r0
-  Push                 r0
-  LoadContextVar       0, 0
-  PushInt              1
-  AddInt
-  StoreContextVar      0, 0
-  PushNull
-  ReturnTOS
-}
-
-
-Function 'get:_identityHashCode', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::int*
-
-Function '_instanceOf', abstract, debuggable
-    parameters [dynamic 'instantiatorTypeArguments', dynamic 'functionTypeArguments', dynamic 'type'] (required: 3)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOf', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOfTrue', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOfFalse', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '==', abstract, debuggable
-    parameters [dynamic 'other'] (required: 1)
-    return-type dart:core::bool*
-
-Function 'get:hashCode', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::int*
-
-Function 'toString', abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::String*
-
-Function 'noSuchMethod', abstract, debuggable
-    parameters [dart:core::Invocation* 'invocation'] (required: 1)
-    return-type dynamic
-
-Function 'get:runtimeType', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::Type*
-Class 'D', script = '#lib'
-    type-params <dart:core::Object* T> (args: 1)
-    extends dart:core::Object*
-
-
-Function '', constructor, reflectable
-    parameters [] (required: 0)
-    return-type #lib::D < #lib::D::TypeParam/0* >*
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  Push                 FP[-5]
-  DirectCall           CP#0, 1
-  Drop1
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-  [0] = DirectCall 'dart:core::Object:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
-  [1] = Reserved
-}
-
-
-Function 'foo', reflectable, debuggable
-    parameters [#lib::D::TypeParam/0* 't'] (required: 1)
-    return-type dynamic
-
-Bytecode {
-  Entry                3
-  CheckStack           0
-  AllocateContext      0, 1
-  PopLocal             r0
-  Push                 r0
-  Push                 FP[-5]
-  StoreContextVar      0, 0
-  JumpIfUnchecked      L1
-  Push                 FP[-5]
-  PushConstant         CP#0
-  Push                 FP[-6]
-  LoadTypeArgumentsField CP#1
-  PushNull
-  PushConstant         CP#2
-  AssertAssignable     0, CP#3
-  Drop1
-L1:
-  AllocateClosure      CP#4
-  StoreLocal           r2
-  Push                 r2
-  Push                 FP[-6]
-  LoadTypeArgumentsField CP#1
-  StoreFieldTOS        CP#8
-  Push                 r2
-  PushNull
-  StoreFieldTOS        CP#10
-  Push                 r2
-  PushConstant         CP#4
-  StoreFieldTOS        CP#12
-  Push                 r2
-  Push                 r0
-  StoreFieldTOS        CP#5
-  ReturnTOS
-}
-Parameter flags: [2]
-ConstantPool {
-  [0] = Type #lib::D::TypeParam/0*
-  [1] = TypeArgumentsField #lib::D
-  [2] = ObjectRef 't'
-  [3] = SubtypeTestCache
-  [4] = ClosureFunction 0
-  [5] = InstanceField dart:core::_Closure::_context (field)
-  [6] = Reserved
-  [7] = EndClosureFunctionScope
-  [8] = InstanceField dart:core::_Closure::_instantiator_type_arguments (field)
-  [9] = Reserved
-  [10] = InstanceField dart:core::_Closure::_function_type_arguments (field)
-  [11] = Reserved
-  [12] = InstanceField dart:core::_Closure::_function (field)
-  [13] = Reserved
-}
-Closure #lib::D::foo::'<anonymous closure>' () -> #lib::D::TypeParam/0*
-ClosureCode {
-  Entry                2
-  Push                 FP[-5]
-  LoadFieldTOS         CP#5
-  PopLocal             r0
-  CheckStack           0
-  Push                 r0
-  LoadContextVar       0, 0
-  ReturnTOS
-}
-
-
-Function 'bar', reflectable, debuggable
-    parameters [] (required: 0)
-    return-type dynamic
-
-Bytecode {
-  Entry                3
-  CheckStack           0
-  AllocateContext      0, 1
-  PopLocal             r0
-  Push                 r0
-  Push                 FP[-5]
-  StoreContextVar      0, 0
-  AllocateClosure      CP#0
-  StoreLocal           r2
-  Push                 r2
-  Push                 FP[-5]
-  LoadTypeArgumentsField CP#5
-  StoreFieldTOS        CP#6
-  Push                 r2
-  PushNull
-  StoreFieldTOS        CP#8
-  Push                 r2
-  PushConstant         CP#0
-  StoreFieldTOS        CP#10
-  Push                 r2
-  Push                 r0
-  StoreFieldTOS        CP#1
-  ReturnTOS
-}
-ConstantPool {
-  [0] = ClosureFunction 0
-  [1] = InstanceField dart:core::_Closure::_context (field)
-  [2] = Reserved
-  [3] = ClosureFunction 1
-  [4] = EndClosureFunctionScope
-  [5] = TypeArgumentsField #lib::D
-  [6] = InstanceField dart:core::_Closure::_instantiator_type_arguments (field)
-  [7] = Reserved
-  [8] = InstanceField dart:core::_Closure::_function_type_arguments (field)
-  [9] = Reserved
-  [10] = InstanceField dart:core::_Closure::_function (field)
-  [11] = Reserved
-  [12] = ObjectRef ArgDesc num-args 1, num-type-args 0, names []
-  [13] = EndClosureFunctionScope
-}
-Closure #lib::D::bar::'<anonymous closure>' () -> dart:core::Null?
-ClosureCode {
-  Entry                4
-  Push                 FP[-5]
-  LoadFieldTOS         CP#1
-  PopLocal             r0
-  CheckStack           0
-  AllocateClosure      CP#3
-  StoreLocal           r3
-  Push                 r3
-  Push                 r0
-  LoadContextVar       0, 0
-  LoadTypeArgumentsField CP#5
-  StoreFieldTOS        CP#6
-  Push                 r3
-  PushNull
-  StoreFieldTOS        CP#8
-  Push                 r3
-  PushConstant         CP#3
-  StoreFieldTOS        CP#10
-  Push                 r3
-  Push                 r0
-  StoreFieldTOS        CP#1
-  PopLocal             r2
-  Push                 r2
-  StoreLocal           r3
-  Push                 r3
-  UncheckedClosureCall CP#12, 1
-  Drop1
-  PushNull
-  ReturnTOS
-}
-
-Closure #lib::D::bar::Closure/0::'inner' () -> dart:core::Null?
-ClosureCode {
-  Entry                2
-  Push                 FP[-5]
-  LoadFieldTOS         CP#1
-  PopLocal             r0
-  CheckStack           0
-  PushNull
-  ReturnTOS
-}
-
-
-Function 'get:_identityHashCode', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::int*
-
-Function '_instanceOf', abstract, debuggable
-    parameters [dynamic 'instantiatorTypeArguments', dynamic 'functionTypeArguments', dynamic 'type'] (required: 3)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOf', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOfTrue', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOfFalse', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '==', abstract, debuggable
-    parameters [dynamic 'other'] (required: 1)
-    return-type dart:core::bool*
-
-Function 'get:hashCode', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::int*
-
-Function 'toString', abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::String*
-
-Function 'noSuchMethod', abstract, debuggable
-    parameters [dart:core::Invocation* 'invocation'] (required: 1)
-    return-type dynamic
-
-Function 'get:runtimeType', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::Type*
-Class 'E', script = '#lib', abstract
-    extends dart:core::Object*
-
-Field 'foo1', type = FunctionType (dart:core::int*, dart:core::int*)* -> dart:core::int*, getter = 'get:foo1', setter = 'set:foo1', reflectable, has-initializer
-    value = null
-
-Function '', constructor, reflectable
-    parameters [] (required: 0)
-    return-type #lib::E*
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  Push                 FP[-5]
-  DirectCall           CP#0, 1
-  Drop1
-  PushNull
-  ReturnTOS
-}
-Nullable fields: [#lib::E::foo1 (field)]
-ConstantPool {
-  [0] = DirectCall 'dart:core::Object:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
-  [1] = Reserved
-}
-
-
-Function 'get:foo2', getter, abstract, reflectable, debuggable
-    parameters [] (required: 0)
-    return-type FunctionType <dart:core::Object* T> (null::TypeParam/0*, null::TypeParam/0*)* -> dart:core::int*
-
-Function 'evalArg1', abstract, reflectable, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::int*
-
-Function 'evalArg2', abstract, reflectable, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::int*
-
-Function 'getE', abstract, reflectable, debuggable
-    parameters [] (required: 0)
-    return-type #lib::E*
-
-Function 'testCallThroughGetter1', reflectable, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::int*
-
-Bytecode {
-  Entry                3
-  CheckStack           0
-  Push                 FP[-5]
-  InterfaceCall        CP#0, 1
-  PopLocal             r0
-  Push                 FP[-5]
-  InterfaceCall        CP#2, 1
-  PopLocal             r1
-  Push                 FP[-5]
-  InterfaceCall        CP#4, 1
-  StoreLocal           r2
-  Push                 r0
-  Push                 r1
-  Push                 r2
-  UncheckedClosureCall CP#6, 3
-  ReturnTOS
-}
-ConstantPool {
-  [0] = InterfaceCall '#lib::E::evalArg1', ArgDesc num-args 1, num-type-args 0, names []
-  [1] = Reserved
-  [2] = InterfaceCall '#lib::E::evalArg2', ArgDesc num-args 1, num-type-args 0, names []
-  [3] = Reserved
-  [4] = InterfaceCall '#lib::E::get:foo1', ArgDesc num-args 1, num-type-args 0, names []
-  [5] = Reserved
-  [6] = ObjectRef ArgDesc num-args 3, num-type-args 0, names []
-}
-
-
-Function 'testCallThroughGetter2', reflectable, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::int*
-
-Bytecode {
-  Entry                3
-  CheckStack           0
-  Push                 FP[-5]
-  InterfaceCall        CP#0, 1
-  PopLocal             r0
-  Push                 FP[-5]
-  InterfaceCall        CP#2, 1
-  PopLocal             r1
-  PushConstant         CP#4
-  Push                 FP[-5]
-  InterfaceCall        CP#5, 1
-  StoreLocal           r2
-  Push                 r0
-  Push                 r1
-  Push                 r2
-  UncheckedClosureCall CP#7, 4
-  ReturnTOS
-}
-ConstantPool {
-  [0] = InterfaceCall '#lib::E::evalArg1', ArgDesc num-args 1, num-type-args 0, names []
-  [1] = Reserved
-  [2] = InterfaceCall '#lib::E::evalArg2', ArgDesc num-args 1, num-type-args 0, names []
-  [3] = Reserved
-  [4] = ObjectRef < dart:core::int* >
-  [5] = InterfaceCall '#lib::E::get:foo2', ArgDesc num-args 1, num-type-args 0, names []
-  [6] = Reserved
-  [7] = ObjectRef ArgDesc num-args 3, num-type-args 1, names []
-}
-
-
-Function 'testCallThroughGetter3', reflectable, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::int*
-
-Bytecode {
-  Entry                4
-  CheckStack           0
-  Push                 FP[-5]
-  InterfaceCall        CP#0, 1
-  PopLocal             r0
-  Push                 FP[-5]
-  InterfaceCall        CP#2, 1
-  PopLocal             r1
-  Push                 FP[-5]
-  InterfaceCall        CP#4, 1
-  PopLocal             r2
-  PushConstant         CP#6
-  Push                 r0
-  InterfaceCall        CP#7, 1
-  StoreLocal           r3
-  Push                 r1
-  Push                 r2
-  Push                 r3
-  UncheckedClosureCall CP#9, 4
-  ReturnTOS
-}
-ConstantPool {
-  [0] = InterfaceCall '#lib::E::getE', ArgDesc num-args 1, num-type-args 0, names []
-  [1] = Reserved
-  [2] = InterfaceCall '#lib::E::evalArg1', ArgDesc num-args 1, num-type-args 0, names []
-  [3] = Reserved
-  [4] = InterfaceCall '#lib::E::evalArg2', ArgDesc num-args 1, num-type-args 0, names []
-  [5] = Reserved
-  [6] = ObjectRef < dart:core::int* >
-  [7] = InterfaceCall '#lib::E::get:foo2', ArgDesc num-args 1, num-type-args 0, names []
-  [8] = Reserved
-  [9] = ObjectRef ArgDesc num-args 3, num-type-args 1, names []
-}
-
-
-Function 'get:_identityHashCode', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::int*
-
-Function '_instanceOf', abstract, debuggable
-    parameters [dynamic 'instantiatorTypeArguments', dynamic 'functionTypeArguments', dynamic 'type'] (required: 3)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOf', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOfTrue', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOfFalse', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '==', abstract, debuggable
-    parameters [dynamic 'other'] (required: 1)
-    return-type dart:core::bool*
-
-Function 'get:hashCode', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::int*
-
-Function 'toString', abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::String*
-
-Function 'noSuchMethod', abstract, debuggable
-    parameters [dart:core::Invocation* 'invocation'] (required: 1)
-    return-type dynamic
-
-Function 'get:runtimeType', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::Type*
-
-}
-]library #lib from "#lib" as #lib {
-
-  typedef IntFunc = (dart.core::int*) →* dynamic;
-  class C1 extends dart.core::Object {
-    synthetic constructor •() → #lib::C1*
-      : super dart.core::Object::•()
-      ;
-    abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
-    abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
-    abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
-    abstract member-signature method _simpleInstanceOfTrue(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfTrue
-    abstract member-signature method _simpleInstanceOfFalse(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfFalse
-    abstract member-signature operator ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
-    abstract member-signature get hashCode() → dart.core::int*; -> dart.core::Object::hashCode
-    abstract member-signature method toString() → dart.core::String*; -> dart.core::Object::toString
-    abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
-    abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
-  }
-  class C2 extends dart.core::Object {
-    synthetic constructor •() → #lib::C2*
-      : super dart.core::Object::•()
-      ;
-    abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
-    abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
-    abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
-    abstract member-signature method _simpleInstanceOfTrue(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfTrue
-    abstract member-signature method _simpleInstanceOfFalse(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfFalse
-    abstract member-signature operator ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
-    abstract member-signature get hashCode() → dart.core::int*; -> dart.core::Object::hashCode
-    abstract member-signature method toString() → dart.core::String*; -> dart.core::Object::toString
-    abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
-    abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
-  }
-  class C3 extends dart.core::Object {
-    synthetic constructor •() → #lib::C3*
-      : super dart.core::Object::•()
-      ;
-    abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
-    abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
-    abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
-    abstract member-signature method _simpleInstanceOfTrue(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfTrue
-    abstract member-signature method _simpleInstanceOfFalse(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfFalse
-    abstract member-signature operator ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
-    abstract member-signature get hashCode() → dart.core::int*; -> dart.core::Object::hashCode
-    abstract member-signature method toString() → dart.core::String*; -> dart.core::Object::toString
-    abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
-    abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
-  }
-  class C4 extends dart.core::Object {
-    synthetic constructor •() → #lib::C4*
-      : super dart.core::Object::•()
-      ;
-    abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
-    abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
-    abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
-    abstract member-signature method _simpleInstanceOfTrue(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfTrue
-    abstract member-signature method _simpleInstanceOfFalse(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfFalse
-    abstract member-signature operator ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
-    abstract member-signature get hashCode() → dart.core::int*; -> dart.core::Object::hashCode
-    abstract member-signature method toString() → dart.core::String*; -> dart.core::Object::toString
-    abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
-    abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
-  }
-  class C5 extends dart.core::Object {
-    synthetic constructor •() → #lib::C5*
-      : super dart.core::Object::•()
-      ;
-    abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
-    abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
-    abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
-    abstract member-signature method _simpleInstanceOfTrue(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfTrue
-    abstract member-signature method _simpleInstanceOfFalse(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfFalse
-    abstract member-signature operator ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
-    abstract member-signature get hashCode() → dart.core::int*; -> dart.core::Object::hashCode
-    abstract member-signature method toString() → dart.core::String*; -> dart.core::Object::toString
-    abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
-    abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
-  }
-  class C6 extends dart.core::Object {
-    synthetic constructor •() → #lib::C6*
-      : super dart.core::Object::•()
-      ;
-    abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
-    abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
-    abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
-    abstract member-signature method _simpleInstanceOfTrue(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfTrue
-    abstract member-signature method _simpleInstanceOfFalse(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfFalse
-    abstract member-signature operator ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
-    abstract member-signature get hashCode() → dart.core::int*; -> dart.core::Object::hashCode
-    abstract member-signature method toString() → dart.core::String*; -> dart.core::Object::toString
-    abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
-    abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
-  }
-  class C7 extends dart.core::Object {
-    synthetic constructor •() → #lib::C7*
-      : super dart.core::Object::•()
-      ;
-    abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
-    abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
-    abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
-    abstract member-signature method _simpleInstanceOfTrue(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfTrue
-    abstract member-signature method _simpleInstanceOfFalse(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfFalse
-    abstract member-signature operator ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
-    abstract member-signature get hashCode() → dart.core::int*; -> dart.core::Object::hashCode
-    abstract member-signature method toString() → dart.core::String*; -> dart.core::Object::toString
-    abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
-    abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
-  }
-  class C8 extends dart.core::Object {
-    synthetic constructor •() → #lib::C8*
-      : super dart.core::Object::•()
-      ;
-    abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
-    abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
-    abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
-    abstract member-signature method _simpleInstanceOfTrue(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfTrue
-    abstract member-signature method _simpleInstanceOfFalse(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfFalse
-    abstract member-signature operator ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
-    abstract member-signature get hashCode() → dart.core::int*; -> dart.core::Object::hashCode
-    abstract member-signature method toString() → dart.core::String*; -> dart.core::Object::toString
-    abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
-    abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
-  }
-  class A<T1 extends dart.core::Object* = dynamic, T2 extends dart.core::Object* = dynamic> extends dart.core::Object {
-    synthetic constructor •() → #lib::A<#lib::A::T1*, #lib::A::T2*>*
-      : super dart.core::Object::•()
-      ;
-    method foo<T3 extends dart.core::Object* = dynamic, T4 extends dart.core::Object* = dynamic>() → void {
-      function nested1<T5 extends dart.core::Object* = dynamic, T6 extends dart.core::Object* = dynamic>() → void {
-        function nested2<T7 extends dart.core::Object* = dynamic, T8 extends dart.core::Object* = dynamic>() → void {
-          () →* dart.core::Null? nested3 = () → dart.core::Null? {
-            dart.core::print(<dart.core::Type*>[#lib::A::T1*, #lib::A::T2*, #lib::A::foo::T3*, #lib::A::foo::T4*, T5*, T6*, T7*, T8*]);
-            #lib::callWithArgs<#lib::A::T1*, #lib::A::T2*, #lib::A::foo::T3*, #lib::A::foo::T4*, T5*, T6*, T7*, T8*>();
-          };
-          [@vm.call-site-attributes.metadata=receiverType:dart.core::Null? Function()*] nested3.call();
-        }
-        [@vm.call-site-attributes.metadata=receiverType:void Function<T7, T8>()*] nested2.call<#lib::C7*, #lib::C8*>();
-        [@vm.call-site-attributes.metadata=receiverType:void Function<T7, T8>()*] nested2.call<dart.core::List<#lib::C7*>*, dart.core::List<#lib::C8*>*>();
-      }
-      [@vm.call-site-attributes.metadata=receiverType:void Function<T5, T6>()*] nested1.call<#lib::C5*, #lib::C6*>();
-      [@vm.call-site-attributes.metadata=receiverType:void Function<T5, T6>()*] nested1.call<dart.core::List<#lib::C5*>*, dart.core::List<#lib::C6*>*>();
-    }
-    abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
-    abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
-    abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
-    abstract member-signature method _simpleInstanceOfTrue(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfTrue
-    abstract member-signature method _simpleInstanceOfFalse(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfFalse
-    abstract member-signature operator ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
-    abstract member-signature get hashCode() → dart.core::int*; -> dart.core::Object::hashCode
-    abstract member-signature method toString() → dart.core::String*; -> dart.core::Object::toString
-    abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
-    abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
-  }
-  class B extends dart.core::Object {
-    field dart.core::int* foo = null;
-    synthetic constructor •() → #lib::B*
-      : super dart.core::Object::•()
-      ;
-    method topLevel() → void {
-      {
-        dart.core::int* x = 1;
-        {
-          dart.core::int* y = 2;
-          dart.core::int* z = 3;
-          (dart.core::int*) →* dart.core::Null? closure1 = (dart.core::int* y) → dart.core::Null? {
-            x = y.{dart.core::num::+}(1);
-            if(x.{dart.core::num::>}(5)) {
-              dart.core::int* w = 4;
-              function closure2() → void {
-                z = x.{dart.core::num::+}(2);
-                w = this.{#lib::B::foo}.{dart.core::num::+}(y);
-              }
-              [@vm.call-site-attributes.metadata=receiverType:void Function()*] closure2.call();
-              dart.core::print(w);
-            }
-          };
-          [@vm.call-site-attributes.metadata=receiverType:dart.core::Null? Function(dart.core::int*)*] closure1.call(10);
-          [@vm.call-site-attributes.metadata=receiverType:dart.core::Null? Function(dart.core::int*)*] closure1.call(11);
-          dart.core::print(y);
-          dart.core::print(z);
-        }
-        dart.core::print(x);
-      }
-      {
-        dart.core::int* x = 42;
-        () →* dart.core::Null? closure3 = () → dart.core::Null? {
-          this.{#lib::B::foo} = x;
-        };
-        [@vm.call-site-attributes.metadata=receiverType:dart.core::Null? Function()*] closure3.call();
-      }
-    }
-    abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
-    abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
-    abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
-    abstract member-signature method _simpleInstanceOfTrue(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfTrue
-    abstract member-signature method _simpleInstanceOfFalse(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfFalse
-    abstract member-signature operator ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
-    abstract member-signature get hashCode() → dart.core::int*; -> dart.core::Object::hashCode
-    abstract member-signature method toString() → dart.core::String*; -> dart.core::Object::toString
-    abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
-    abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
-  }
-  class C extends dart.core::Object {
-    synthetic constructor •() → #lib::C*
-      : super dart.core::Object::•()
-      ;
-    method testForLoop() → void {
-      dart.core::int* delta = 0;
-      dart.core::List<dart.core::Function*>* getI = <dart.core::Function*>[];
-      dart.core::List<dart.core::Function*>* setI = <dart.core::Function*>[];
-      for (dart.core::int* i = 0; i.{dart.core::num::<}(10); i = i.{dart.core::num::+}(1)) {
-        [@vm.call-site-attributes.metadata=receiverType:dart.core::List<dart.core::Function*>*] getI.{dart.core::List::add}(() → dart.core::int* => i.{dart.core::num::+}(delta));
-        [@vm.call-site-attributes.metadata=receiverType:dart.core::List<dart.core::Function*>*] setI.{dart.core::List::add}((dart.core::int* ii) → dart.core::Null? {
-          i = ii.{dart.core::num::+}(delta);
-        });
-      }
-    }
-    method testForInLoop(dart.core::List<dart.core::int*>* list) → void {
-      {
-        dart.core::Iterator<dart.core::int*>* :sync-for-iterator = list.{dart.core::Iterable::iterator};
-        for (; :sync-for-iterator.{dart.core::Iterator::moveNext}(); ) {
-          dart.core::int* i = :sync-for-iterator.{dart.core::Iterator::current};
-          {
-            () →* dart.core::Null? inc = () → dart.core::Null? {
-              i = i.{dart.core::num::+}(1);
-            };
-            [@vm.call-site-attributes.metadata=receiverType:dart.core::Null? Function()*] inc.call();
-            dart.core::print(i);
-          }
-        }
-      }
-    }
-    abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
-    abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
-    abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
-    abstract member-signature method _simpleInstanceOfTrue(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfTrue
-    abstract member-signature method _simpleInstanceOfFalse(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfFalse
-    abstract member-signature operator ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
-    abstract member-signature get hashCode() → dart.core::int*; -> dart.core::Object::hashCode
-    abstract member-signature method toString() → dart.core::String*; -> dart.core::Object::toString
-    abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
-    abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
-  }
-  class D<T extends dart.core::Object* = dynamic> extends dart.core::Object {
-    synthetic constructor •() → #lib::D<#lib::D::T*>*
-      : super dart.core::Object::•()
-      ;
-    method foo(generic-covariant-impl #lib::D::T* t) → dynamic {
-      return () → #lib::D::T* => t;
-    }
-    method bar() → dynamic {
-      return () → dart.core::Null? {
-        function inner() → dart.core::Null? {}
-        [@vm.call-site-attributes.metadata=receiverType:dart.core::Null? Function()*] inner.call();
-      };
-    }
-    abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
-    abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
-    abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
-    abstract member-signature method _simpleInstanceOfTrue(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfTrue
-    abstract member-signature method _simpleInstanceOfFalse(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfFalse
-    abstract member-signature operator ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
-    abstract member-signature get hashCode() → dart.core::int*; -> dart.core::Object::hashCode
-    abstract member-signature method toString() → dart.core::String*; -> dart.core::Object::toString
-    abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
-    abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
-  }
-  abstract class E extends dart.core::Object {
-    field (dart.core::int*, dart.core::int*) →* dart.core::int* foo1 = null;
-    synthetic constructor •() → #lib::E*
-      : super dart.core::Object::•()
-      ;
-    abstract get foo2() → <T extends dart.core::Object* = dynamic>(T*, T*) →* dart.core::int*;
-    abstract method evalArg1() → dart.core::int*;
-    abstract method evalArg2() → dart.core::int*;
-    abstract method getE() → #lib::E*;
-    method testCallThroughGetter1() → dart.core::int*
-      return let final dart.core::int* #t1 = this.{#lib::E::evalArg1}() in let final dart.core::int* #t2 = this.{#lib::E::evalArg2}() in [@vm.call-site-attributes.metadata=receiverType:dart.core::int* Function(dart.core::int*, dart.core::int*)*] this.{#lib::E::foo1}.call(#t1, #t2);
-    method testCallThroughGetter2() → dart.core::int*
-      return let final dart.core::int* #t3 = this.{#lib::E::evalArg1}() in let final dart.core::int* #t4 = this.{#lib::E::evalArg2}() in [@vm.call-site-attributes.metadata=receiverType:dart.core::int* Function<T>(T*, T*)*] this.{#lib::E::foo2}.call<dart.core::int*>(#t3, #t4);
-    method testCallThroughGetter3() → dart.core::int*
-      return let final #lib::E* #t5 = this.{#lib::E::getE}() in let final dart.core::int* #t6 = this.{#lib::E::evalArg1}() in let final dart.core::int* #t7 = this.{#lib::E::evalArg2}() in [@vm.call-site-attributes.metadata=receiverType:dart.core::int* Function<T>(T*, T*)*] #t5.{#lib::E::foo2}.call<dart.core::int*>(#t6, #t7);
-    abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
-    abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
-    abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
-    abstract member-signature method _simpleInstanceOfTrue(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfTrue
-    abstract member-signature method _simpleInstanceOfFalse(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfFalse
-    abstract member-signature operator ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
-    abstract member-signature get hashCode() → dart.core::int*; -> dart.core::Object::hashCode
-    abstract member-signature method toString() → dart.core::String*; -> dart.core::Object::toString
-    abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
-    abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
-  }
-  static method simpleClosure() → dart.core::int* {
-    dart.core::int* x = 5;
-    (dart.core::int*) →* dart.core::Null? inc = (dart.core::int* y) → dart.core::Null? {
-      x = x.{dart.core::num::+}(y);
-    };
-    [@vm.call-site-attributes.metadata=receiverType:dart.core::Null? Function(dart.core::int*)*] inc.call(3);
-    return x;
-  }
-  static method callWithArgs<T1 extends dart.core::Object* = dynamic, T2 extends dart.core::Object* = dynamic, T3 extends dart.core::Object* = dynamic, T4 extends dart.core::Object* = dynamic, T5 extends dart.core::Object* = dynamic, T6 extends dart.core::Object* = dynamic, T7 extends dart.core::Object* = dynamic, T8 extends dart.core::Object* = dynamic>() → void {
-    dart.core::print(<dart.core::Type*>[#lib::callWithArgs::T1*, #lib::callWithArgs::T2*, #lib::callWithArgs::T3*, #lib::callWithArgs::T4*, #lib::callWithArgs::T5*, #lib::callWithArgs::T6*, #lib::callWithArgs::T7*, #lib::callWithArgs::T8*]);
-  }
-  static method callA() → void {
-    new #lib::A::•<#lib::C1*, #lib::C2*>().{#lib::A::foo}<#lib::C3*, #lib::C4*>();
-    new #lib::A::•<#lib::C1*, #lib::C2*>().{#lib::A::foo}<dart.core::List<#lib::C3*>*, dart.core::List<#lib::C4*>*>();
-    new #lib::A::•<dart.core::List<#lib::C1*>*, dart.core::List<#lib::C2*>*>().{#lib::A::foo}<dart.core::List<#lib::C3*>*, dart.core::List<#lib::C4*>*>();
-  }
-  static method testPartialInstantiation() → (dart.core::int*) →* dynamic {
-    function foo<T extends dart.core::Object* = dynamic>(T* t) → void {}
-    (dart.core::int*) →* dynamic intFunc = foo<dart.core::int*>;
-    return intFunc;
-  }
-  static method main() → dynamic {}
-}
diff --git a/pkg/vm/testcases/bytecode/deferred_lib.dart b/pkg/vm/testcases/bytecode/deferred_lib.dart
deleted file mode 100644
index b93cc06..0000000
--- a/pkg/vm/testcases/bytecode/deferred_lib.dart
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright (c) 2018, 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 "hello.dart" deferred as lib;
-
-callDeferred() => lib.main();
-
-testLoadLibrary() => lib.loadLibrary();
-
-main() {}
diff --git a/pkg/vm/testcases/bytecode/deferred_lib.dart.expect b/pkg/vm/testcases/bytecode/deferred_lib.dart.expect
deleted file mode 100644
index a3a1685..0000000
--- a/pkg/vm/testcases/bytecode/deferred_lib.dart.expect
+++ /dev/null
@@ -1,75 +0,0 @@
-main = #lib::main;
- [@vm.bytecode=
-BytecodeMetadata {
-Bytecode (version: stable)
-Main library: #lib
-Library '#lib'
-    name '#lib'
-    script '#lib'
-
-Class '', script = '#lib'
-
-
-Function 'callDeferred', static, reflectable, debuggable
-    parameters [] (required: 0)
-    return-type dynamic
-
-Bytecode {
-  Entry                1
-  CheckStack           0
-  PushNull
-  DirectCall           CP#0, 1
-  PopLocal             r0
-  DirectCall           CP#2, 0
-  ReturnTOS
-}
-ConstantPool {
-  [0] = DirectCall 'dart:async::Future::value (constructor)', ArgDesc num-args 1, num-type-args 0, names []
-  [1] = Reserved
-  [2] = DirectCall '#pkg/vm/testcases/bytecode/hello.dart::main', ArgDesc num-args 0, num-type-args 0, names []
-  [3] = Reserved
-}
-
-
-Function 'testLoadLibrary', static, reflectable, debuggable
-    parameters [] (required: 0)
-    return-type dynamic
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  PushNull
-  DirectCall           CP#0, 1
-  ReturnTOS
-}
-ConstantPool {
-  [0] = DirectCall 'dart:async::Future::value (constructor)', ArgDesc num-args 1, num-type-args 0, names []
-  [1] = Reserved
-}
-
-
-Function 'main', static, reflectable, debuggable
-    parameters [] (required: 0)
-    return-type dynamic
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-}
-
-
-}
-]library #lib from "#lib" as #lib {
-
-  import "#pkg/vm/testcases/bytecode/hello.dart" deferred as lib;
-
-  static method callDeferred() → dynamic
-    return let final dynamic #t1 = CheckLibraryIsLoaded(lib) in #lib1::main();
-  static method testLoadLibrary() → dynamic
-    return LoadLibrary(lib);
-  static method main() → dynamic {}
-}
diff --git a/pkg/vm/testcases/bytecode/field_initializers.dart b/pkg/vm/testcases/bytecode/field_initializers.dart
deleted file mode 100644
index 6d9f57e..0000000
--- a/pkg/vm/testcases/bytecode/field_initializers.dart
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright (c) 2018, 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.
-
-class A {
-  int foo1;
-  int foo2 = null;
-  int foo3 = 42;
-  int foo4;
-  int foo5 = 43;
-
-  A(this.foo4) : foo5 = 44;
-  A.constr2(int x, int y)
-      : foo1 = x,
-        foo5 = y + 1;
-
-  A.redirecting1() : this(45);
-  A.redirecting2(int a, int b, int c) : this.constr2(a, b * c);
-}
-
-class B extends A {
-  int foo6 = 46;
-  static int foo7 = 47;
-  static const int foo8 = 48;
-
-  B() : super(49);
-  B.c2(int i, int j)
-      : foo6 = 50,
-        super.redirecting2(i, j, 51);
-}
-
-main() {}
diff --git a/pkg/vm/testcases/bytecode/field_initializers.dart.expect b/pkg/vm/testcases/bytecode/field_initializers.dart.expect
deleted file mode 100644
index a49da6b..0000000
--- a/pkg/vm/testcases/bytecode/field_initializers.dart.expect
+++ /dev/null
@@ -1,315 +0,0 @@
-main = #lib::main;
- [@vm.bytecode=
-BytecodeMetadata {
-Bytecode (version: stable)
-Main library: #lib
-Library '#lib'
-    name '#lib'
-    script '#lib'
-
-Class '', script = '#lib'
-
-
-Function 'main', static, reflectable, debuggable
-    parameters [] (required: 0)
-    return-type dynamic
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-}
-
-Class 'A', script = '#lib'
-    extends dart:core::Object*
-
-Field 'foo1', type = dart:core::int*, getter = 'get:foo1', setter = 'set:foo1', reflectable
-    value = null
-
-Field 'foo2', type = dart:core::int*, getter = 'get:foo2', setter = 'set:foo2', reflectable, has-initializer
-    value = null
-
-Field 'foo3', type = dart:core::int*, getter = 'get:foo3', setter = 'set:foo3', reflectable, has-initializer
-    value = const 42
-
-Field 'foo4', type = dart:core::int*, getter = 'get:foo4', setter = 'set:foo4', reflectable
-    value = null
-
-Field 'foo5', type = dart:core::int*, getter = 'get:foo5', setter = 'set:foo5', reflectable, has-initializer
-    value = const 43
-
-Function '', constructor, reflectable, debuggable
-    parameters [dart:core::int* 'foo4'] (required: 1)
-    return-type #lib::A*
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  Push                 FP[-6]
-  PushInt              42
-  StoreFieldTOS        CP#0
-  PushInt              43
-  Drop1
-  Push                 FP[-6]
-  Push                 FP[-5]
-  StoreFieldTOS        CP#2
-  Push                 FP[-6]
-  PushInt              44
-  StoreFieldTOS        CP#4
-  Push                 FP[-6]
-  DirectCall           CP#6, 1
-  Drop1
-  PushNull
-  ReturnTOS
-}
-Nullable fields: [#lib::A::foo1 (field), #lib::A::foo2 (field)]
-ConstantPool {
-  [0] = InstanceField #lib::A::foo3 (field)
-  [1] = Reserved
-  [2] = InstanceField #lib::A::foo4 (field)
-  [3] = Reserved
-  [4] = InstanceField #lib::A::foo5 (field)
-  [5] = Reserved
-  [6] = DirectCall 'dart:core::Object:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
-  [7] = Reserved
-}
-
-
-Function 'constr2', constructor, reflectable, debuggable
-    parameters [dart:core::int* 'x', dart:core::int* 'y'] (required: 2)
-    return-type #lib::A*
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  Push                 FP[-7]
-  PushInt              42
-  StoreFieldTOS        CP#0
-  PushInt              43
-  Drop1
-  Push                 FP[-7]
-  Push                 FP[-6]
-  StoreFieldTOS        CP#2
-  Push                 FP[-7]
-  Push                 FP[-5]
-  PushInt              1
-  AddInt
-  StoreFieldTOS        CP#4
-  Push                 FP[-7]
-  DirectCall           CP#6, 1
-  Drop1
-  PushNull
-  ReturnTOS
-}
-Nullable fields: [#lib::A::foo2 (field), #lib::A::foo4 (field)]
-ConstantPool {
-  [0] = InstanceField #lib::A::foo3 (field)
-  [1] = Reserved
-  [2] = InstanceField #lib::A::foo1 (field)
-  [3] = Reserved
-  [4] = InstanceField #lib::A::foo5 (field)
-  [5] = Reserved
-  [6] = DirectCall 'dart:core::Object:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
-  [7] = Reserved
-}
-
-
-Function 'redirecting1', constructor, reflectable, debuggable
-    parameters [] (required: 0)
-    return-type #lib::A*
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  Push                 FP[-5]
-  PushInt              45
-  DirectCall           CP#0, 2
-  Drop1
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-  [0] = DirectCall '#lib::A:: (constructor)', ArgDesc num-args 2, num-type-args 0, names []
-  [1] = Reserved
-}
-
-
-Function 'redirecting2', constructor, reflectable, debuggable
-    parameters [dart:core::int* 'a', dart:core::int* 'b', dart:core::int* 'c'] (required: 3)
-    return-type #lib::A*
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  Push                 FP[-8]
-  Push                 FP[-7]
-  Push                 FP[-6]
-  Push                 FP[-5]
-  MulInt
-  DirectCall           CP#0, 3
-  Drop1
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-  [0] = DirectCall '#lib::A::constr2 (constructor)', ArgDesc num-args 3, num-type-args 0, names []
-  [1] = Reserved
-}
-
-
-Function 'get:_identityHashCode', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::int*
-
-Function '_instanceOf', abstract, debuggable
-    parameters [dynamic 'instantiatorTypeArguments', dynamic 'functionTypeArguments', dynamic 'type'] (required: 3)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOf', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOfTrue', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOfFalse', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '==', abstract, debuggable
-    parameters [dynamic 'other'] (required: 1)
-    return-type dart:core::bool*
-
-Function 'get:hashCode', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::int*
-
-Function 'toString', abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::String*
-
-Function 'noSuchMethod', abstract, debuggable
-    parameters [dart:core::Invocation* 'invocation'] (required: 1)
-    return-type dynamic
-
-Function 'get:runtimeType', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::Type*
-Class 'B', script = '#lib'
-    extends #lib::A*
-
-Field 'foo6', type = dart:core::int*, getter = 'get:foo6', setter = 'set:foo6', reflectable, has-initializer
-    value = const 46
-
-Field 'foo7', type = dart:core::int*, reflectable, static, has-initializer
-    value = const 47
-
-Field 'foo8', type = dart:core::int*, reflectable, static, const, final, has-initializer
-    value = const 48
-
-Function '', constructor, reflectable, debuggable
-    parameters [] (required: 0)
-    return-type #lib::B*
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  Push                 FP[-5]
-  PushInt              46
-  StoreFieldTOS        CP#0
-  Push                 FP[-5]
-  PushInt              49
-  DirectCall           CP#2, 2
-  Drop1
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-  [0] = InstanceField #lib::B::foo6 (field)
-  [1] = Reserved
-  [2] = DirectCall '#lib::A:: (constructor)', ArgDesc num-args 2, num-type-args 0, names []
-  [3] = Reserved
-}
-
-
-Function 'c2', constructor, reflectable, debuggable
-    parameters [dart:core::int* 'i', dart:core::int* 'j'] (required: 2)
-    return-type #lib::B*
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  PushInt              46
-  Drop1
-  Push                 FP[-7]
-  PushInt              50
-  StoreFieldTOS        CP#0
-  Push                 FP[-7]
-  Push                 FP[-6]
-  Push                 FP[-5]
-  PushInt              51
-  DirectCall           CP#2, 4
-  Drop1
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-  [0] = InstanceField #lib::B::foo6 (field)
-  [1] = Reserved
-  [2] = DirectCall '#lib::A::redirecting2 (constructor)', ArgDesc num-args 4, num-type-args 0, names []
-  [3] = Reserved
-}
-
-
-}
-]library #lib from "#lib" as #lib {
-
-  class A extends dart.core::Object {
-    field dart.core::int* foo1;
-    field dart.core::int* foo2 = null;
-    field dart.core::int* foo3 = 42;
-    field dart.core::int* foo4;
-    field dart.core::int* foo5 = 43;
-    constructor •(dart.core::int* foo4) → #lib::A*
-      : #lib::A::foo1 = null, #lib::A::foo4 = foo4, #lib::A::foo5 = 44, super dart.core::Object::•()
-      ;
-    constructor constr2(dart.core::int* x, dart.core::int* y) → #lib::A*
-      : #lib::A::foo4 = null, #lib::A::foo1 = x, #lib::A::foo5 = y.{dart.core::num::+}(1), super dart.core::Object::•()
-      ;
-    constructor redirecting1() → #lib::A*
-      : this #lib::A::•(45)
-      ;
-    constructor redirecting2(dart.core::int* a, dart.core::int* b, dart.core::int* c) → #lib::A*
-      : this #lib::A::constr2(a, b.{dart.core::num::*}(c))
-      ;
-    abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
-    abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
-    abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
-    abstract member-signature method _simpleInstanceOfTrue(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfTrue
-    abstract member-signature method _simpleInstanceOfFalse(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfFalse
-    abstract member-signature operator ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
-    abstract member-signature get hashCode() → dart.core::int*; -> dart.core::Object::hashCode
-    abstract member-signature method toString() → dart.core::String*; -> dart.core::Object::toString
-    abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
-    abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
-  }
-  class B extends #lib::A {
-    field dart.core::int* foo6 = 46;
-    static field dart.core::int* foo7 = 47;
-    static const field dart.core::int* foo8 = #C1;
-    constructor •() → #lib::B*
-      : super #lib::A::•(49)
-      ;
-    constructor c2(dart.core::int* i, dart.core::int* j) → #lib::B*
-      : #lib::B::foo6 = 50, super #lib::A::redirecting2(i, j, 51)
-      ;
-  }
-  static method main() → dynamic {}
-}
-constants  {
-  #C1 = 48
-}
diff --git a/pkg/vm/testcases/bytecode/hello.dart b/pkg/vm/testcases/bytecode/hello.dart
deleted file mode 100644
index 65a1a2a..0000000
--- a/pkg/vm/testcases/bytecode/hello.dart
+++ /dev/null
@@ -1,7 +0,0 @@
-// Copyright (c) 2018, 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.
-
-main() {
-  print('Hello, Dart Bytecode!');
-}
diff --git a/pkg/vm/testcases/bytecode/hello.dart.expect b/pkg/vm/testcases/bytecode/hello.dart.expect
deleted file mode 100644
index 12f2f55..0000000
--- a/pkg/vm/testcases/bytecode/hello.dart.expect
+++ /dev/null
@@ -1,39 +0,0 @@
-main = #lib::main;
- [@vm.bytecode=
-BytecodeMetadata {
-Bytecode (version: stable)
-Main library: #lib
-Library '#lib'
-    name '#lib'
-    script '#lib'
-
-Class '', script = '#lib'
-
-
-Function 'main', static, reflectable, debuggable
-    parameters [] (required: 0)
-    return-type dynamic
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  PushConstant         CP#0
-  DirectCall           CP#1, 1
-  Drop1
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-  [0] = ObjectRef 'Hello, Dart Bytecode!'
-  [1] = DirectCall 'dart:core::print', ArgDesc num-args 1, num-type-args 0, names []
-  [2] = Reserved
-}
-
-
-}
-]library #lib from "#lib" as #lib {
-
-  static method main() → dynamic {
-    dart.core::print("Hello, Dart Bytecode!");
-  }
-}
diff --git a/pkg/vm/testcases/bytecode/instance_creation.dart b/pkg/vm/testcases/bytecode/instance_creation.dart
deleted file mode 100644
index 8bfa5d7..0000000
--- a/pkg/vm/testcases/bytecode/instance_creation.dart
+++ /dev/null
@@ -1,90 +0,0 @@
-// Copyright (c) 2018, 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.
-
-// ignore_for_file: native_function_body_in_non_sdk_code
-
-class Base<T1, T2> {
-  T1 t1;
-  T2 t2;
-
-  Base() {
-    print('Base: $T1, $T2');
-  }
-}
-
-class A extends Base<int, String> {
-  A(String s);
-}
-
-class B<T> extends Base<List<T>, String> {
-  B() {
-    print('B: $T');
-  }
-}
-
-class C {
-  C(String s) {
-    print('C: $s');
-  }
-}
-
-foo1() => new C('hello');
-
-void foo2() {
-  new A('hi');
-  new B<int>();
-}
-
-void foo3<T>() {
-  new B<List<T>>();
-}
-
-class E<K, V> {
-  test_reuse1() => new Map<K, V>();
-}
-
-class F<K, V> extends E<String, List<V>> {
-  test_reuse2() => new Map<String, List<V>>();
-}
-
-class G<K, V> {
-  G();
-  factory G.test_factory() => new H<String, K, V>();
-}
-
-class H<P1, P2, P3> extends G<P2, P3> {}
-
-void foo4() {
-  new G<int, List<String>>.test_factory();
-}
-
-class I {
-  I(param);
-  factory I.test_factory2({param}) => new I(param);
-}
-
-void foo5() {
-  new I.test_factory2();
-  new I.test_factory2(param: 42);
-}
-
-class J {
-  factory J() native "agent_J";
-}
-
-abstract class K<A, B> {
-  factory K() => new TestTypeArgReuse<A, B>();
-}
-
-class TestTypeArgReuse<P, Q> extends Base<P, Q> implements K<P, Q> {}
-
-foo6() => new List<String>();
-
-foo7(int n) => new List<int>(n);
-
-main() {
-  foo1();
-  foo2();
-  foo3<String>();
-}
diff --git a/pkg/vm/testcases/bytecode/instance_creation.dart.expect b/pkg/vm/testcases/bytecode/instance_creation.dart.expect
deleted file mode 100644
index 643f2f5..0000000
--- a/pkg/vm/testcases/bytecode/instance_creation.dart.expect
+++ /dev/null
@@ -1,1127 +0,0 @@
-main = #lib::main;
- [@vm.bytecode=
-BytecodeMetadata {
-Bytecode (version: stable)
-Main library: #lib
-Library '#lib'
-    name '#lib'
-    script '#lib'
-
-Class '', script = '#lib'
-
-
-Function 'foo1', static, reflectable, debuggable
-    parameters [] (required: 0)
-    return-type dynamic
-
-Bytecode {
-  Entry                1
-  CheckStack           0
-  Allocate             CP#0
-  StoreLocal           r0
-  Push                 r0
-  PushConstant         CP#1
-  DirectCall           CP#2, 2
-  Drop1
-  ReturnTOS
-}
-ConstantPool {
-  [0] = Class #lib::C
-  [1] = ObjectRef 'hello'
-  [2] = DirectCall '#lib::C:: (constructor)', ArgDesc num-args 2, num-type-args 0, names []
-  [3] = Reserved
-}
-
-
-Function 'foo2', static, reflectable, debuggable
-    parameters [] (required: 0)
-    return-type void
-
-Bytecode {
-  Entry                1
-  CheckStack           0
-  PushConstant         CP#1
-  PushConstant         CP#0
-  AllocateT
-  StoreLocal           r0
-  Push                 r0
-  PushConstant         CP#2
-  DirectCall           CP#3, 2
-  Drop1
-  Drop1
-  PushConstant         CP#6
-  PushConstant         CP#5
-  AllocateT
-  StoreLocal           r0
-  Push                 r0
-  DirectCall           CP#7, 1
-  Drop1
-  Drop1
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-  [0] = Class #lib::A
-  [1] = ObjectRef < dart:core::int*, dart:core::String* >
-  [2] = ObjectRef 'hi'
-  [3] = DirectCall '#lib::A:: (constructor)', ArgDesc num-args 2, num-type-args 0, names []
-  [4] = Reserved
-  [5] = Class #lib::B
-  [6] = ObjectRef < dart:core::List < dart:core::int* >*, dart:core::String*, dart:core::int* >
-  [7] = DirectCall '#lib::B:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
-  [8] = Reserved
-}
-
-
-Function 'foo3', static, reflectable, debuggable
-    type-params <dart:core::Object* T>
-    parameters [] (required: 0)
-    return-type void
-
-Bytecode {
-  Entry                2
-  CheckFunctionTypeArgs 1, r0
-  CheckStack           0
-  PushNull
-  Push                 r0
-  InstantiateTypeArgumentsTOS 0, CP#1
-  PushConstant         CP#0
-  AllocateT
-  StoreLocal           r1
-  Push                 r1
-  DirectCall           CP#2, 1
-  Drop1
-  Drop1
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-  [0] = Class #lib::B
-  [1] = ObjectRef < dart:core::List < dart:core::List < #lib::foo3::TypeParam/0* >* >*, dart:core::String*, dart:core::List < #lib::foo3::TypeParam/0* >* >
-  [2] = DirectCall '#lib::B:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
-  [3] = Reserved
-}
-
-
-Function 'foo4', static, reflectable, debuggable
-    parameters [] (required: 0)
-    return-type void
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  PushConstant         CP#0
-  DirectCall           CP#1, 1
-  Drop1
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-  [0] = ObjectRef < dart:core::int*, dart:core::List < dart:core::String* >* >
-  [1] = DirectCall '#lib::G::test_factory (constructor)', ArgDesc num-args 1, num-type-args 0, names []
-  [2] = Reserved
-}
-
-
-Function 'foo5', static, reflectable, debuggable
-    parameters [] (required: 0)
-    return-type void
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  PushNull
-  DirectCall           CP#0, 1
-  Drop1
-  PushNull
-  PushInt              42
-  DirectCall           CP#2, 2
-  Drop1
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-  [0] = DirectCall '#lib::I::test_factory2 (constructor)', ArgDesc num-args 1, num-type-args 0, names []
-  [1] = Reserved
-  [2] = DirectCall '#lib::I::test_factory2 (constructor)', ArgDesc num-args 2, num-type-args 0, names ['param']
-  [3] = Reserved
-}
-
-
-Function 'foo6', static, reflectable, debuggable
-    parameters [] (required: 0)
-    return-type dynamic
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  PushConstant         CP#0
-  PushInt              0
-  DirectCall           CP#1, 2
-  ReturnTOS
-}
-ConstantPool {
-  [0] = ObjectRef < dart:core::String* >
-  [1] = DirectCall 'dart:core::_GrowableList:: (constructor)', ArgDesc num-args 2, num-type-args 0, names []
-  [2] = Reserved
-}
-
-
-Function 'foo7', static, reflectable, debuggable
-    parameters [dart:core::int* 'n'] (required: 1)
-    return-type dynamic
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  PushConstant         CP#0
-  Push                 FP[-5]
-  DirectCall           CP#1, 2
-  ReturnTOS
-}
-ConstantPool {
-  [0] = ObjectRef < dart:core::int* >
-  [1] = DirectCall 'dart:core::_List:: (constructor)', ArgDesc num-args 2, num-type-args 0, names []
-  [2] = Reserved
-}
-
-
-Function 'main', static, reflectable, debuggable
-    parameters [] (required: 0)
-    return-type dynamic
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  DirectCall           CP#0, 0
-  Drop1
-  DirectCall           CP#2, 0
-  Drop1
-  PushConstant         CP#4
-  DirectCall           CP#5, 1
-  Drop1
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-  [0] = DirectCall '#lib::foo1', ArgDesc num-args 0, num-type-args 0, names []
-  [1] = Reserved
-  [2] = DirectCall '#lib::foo2', ArgDesc num-args 0, num-type-args 0, names []
-  [3] = Reserved
-  [4] = ObjectRef < dart:core::String* >
-  [5] = DirectCall '#lib::foo3', ArgDesc num-args 0, num-type-args 1, names []
-  [6] = Reserved
-}
-
-Class 'Base', script = '#lib'
-    type-params <dart:core::Object* T1, dart:core::Object* T2> (args: 2)
-    extends dart:core::Object*
-
-Field 't1', type = #lib::Base::TypeParam/0*, getter = 'get:t1', setter = 'set:t1', reflectable, has-initializer
-    value = null
-
-Field 't2', type = #lib::Base::TypeParam/1*, getter = 'get:t2', setter = 'set:t2', reflectable, has-initializer
-    value = null
-
-Function '', constructor, reflectable, debuggable
-    parameters [] (required: 0)
-    return-type #lib::Base < #lib::Base::TypeParam/0*, #lib::Base::TypeParam/1* >*
-
-Bytecode {
-  Entry                1
-  CheckStack           0
-  Push                 FP[-5]
-  DirectCall           CP#0, 1
-  Drop1
-  PushNull
-  PushInt              4
-  CreateArrayTOS
-  StoreLocal           r0
-  Push                 r0
-  PushInt              0
-  PushConstant         CP#2
-  StoreIndexedTOS
-  Push                 r0
-  PushInt              1
-  Push                 FP[-5]
-  LoadTypeArgumentsField CP#4
-  PushNull
-  InstantiateType      CP#3
-  StoreIndexedTOS
-  Push                 r0
-  PushInt              2
-  PushConstant         CP#5
-  StoreIndexedTOS
-  Push                 r0
-  PushInt              3
-  Push                 FP[-5]
-  LoadTypeArgumentsField CP#4
-  PushNull
-  InstantiateType      CP#6
-  StoreIndexedTOS
-  DirectCall           CP#7, 1
-  DirectCall           CP#9, 1
-  Drop1
-  PushNull
-  ReturnTOS
-}
-Nullable fields: [#lib::Base::t1 (field), #lib::Base::t2 (field)]
-ConstantPool {
-  [0] = DirectCall 'dart:core::Object:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
-  [1] = Reserved
-  [2] = ObjectRef 'Base: '
-  [3] = Type #lib::Base::TypeParam/0*
-  [4] = TypeArgumentsField #lib::Base
-  [5] = ObjectRef ', '
-  [6] = Type #lib::Base::TypeParam/1*
-  [7] = DirectCall 'dart:core::_StringBase::_interpolate', ArgDesc num-args 1, num-type-args 0, names []
-  [8] = Reserved
-  [9] = DirectCall 'dart:core::print', ArgDesc num-args 1, num-type-args 0, names []
-  [10] = Reserved
-}
-
-
-Function 'get:_identityHashCode', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::int*
-
-Function '_instanceOf', abstract, debuggable
-    parameters [dynamic 'instantiatorTypeArguments', dynamic 'functionTypeArguments', dynamic 'type'] (required: 3)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOf', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOfTrue', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOfFalse', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '==', abstract, debuggable
-    parameters [dynamic 'other'] (required: 1)
-    return-type dart:core::bool*
-
-Function 'get:hashCode', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::int*
-
-Function 'toString', abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::String*
-
-Function 'noSuchMethod', abstract, debuggable
-    parameters [dart:core::Invocation* 'invocation'] (required: 1)
-    return-type dynamic
-
-Function 'get:runtimeType', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::Type*
-Class 'A', script = '#lib'
-    extends #lib::Base < dart:core::int*, dart:core::String* >*
-
-
-Function '', constructor, reflectable, debuggable
-    parameters [dart:core::String* 's'] (required: 1)
-    return-type #lib::A < dart:core::int*, dart:core::String* >*
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  Push                 FP[-6]
-  DirectCall           CP#0, 1
-  Drop1
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-  [0] = DirectCall '#lib::Base:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
-  [1] = Reserved
-}
-
-Class 'B', script = '#lib'
-    type-params <dart:core::Object* T> (args: 3)
-    extends #lib::Base < dart:core::List < #lib::B::TypeParam/0* >*, dart:core::String* >*
-
-
-Function '', constructor, reflectable, debuggable
-    parameters [] (required: 0)
-    return-type #lib::B < dart:core::List < #lib::B::TypeParam/0* >*, dart:core::String*, #lib::B::TypeParam/0* >*
-
-Bytecode {
-  Entry                1
-  CheckStack           0
-  Push                 FP[-5]
-  DirectCall           CP#0, 1
-  Drop1
-  PushNull
-  PushInt              2
-  CreateArrayTOS
-  StoreLocal           r0
-  Push                 r0
-  PushInt              0
-  PushConstant         CP#2
-  StoreIndexedTOS
-  Push                 r0
-  PushInt              1
-  Push                 FP[-5]
-  LoadTypeArgumentsField CP#4
-  PushNull
-  InstantiateType      CP#3
-  StoreIndexedTOS
-  DirectCall           CP#5, 1
-  DirectCall           CP#7, 1
-  Drop1
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-  [0] = DirectCall '#lib::Base:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
-  [1] = Reserved
-  [2] = ObjectRef 'B: '
-  [3] = Type #lib::B::TypeParam/0*
-  [4] = TypeArgumentsField #lib::B
-  [5] = DirectCall 'dart:core::_StringBase::_interpolate', ArgDesc num-args 1, num-type-args 0, names []
-  [6] = Reserved
-  [7] = DirectCall 'dart:core::print', ArgDesc num-args 1, num-type-args 0, names []
-  [8] = Reserved
-}
-
-Class 'C', script = '#lib'
-    extends dart:core::Object*
-
-
-Function '', constructor, reflectable, debuggable
-    parameters [dart:core::String* 's'] (required: 1)
-    return-type #lib::C*
-
-Bytecode {
-  Entry                1
-  CheckStack           0
-  Push                 FP[-6]
-  DirectCall           CP#0, 1
-  Drop1
-  PushNull
-  PushInt              2
-  CreateArrayTOS
-  StoreLocal           r0
-  Push                 r0
-  PushInt              0
-  PushConstant         CP#2
-  StoreIndexedTOS
-  Push                 r0
-  PushInt              1
-  Push                 FP[-5]
-  StoreIndexedTOS
-  DirectCall           CP#3, 1
-  DirectCall           CP#5, 1
-  Drop1
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-  [0] = DirectCall 'dart:core::Object:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
-  [1] = Reserved
-  [2] = ObjectRef 'C: '
-  [3] = DirectCall 'dart:core::_StringBase::_interpolate', ArgDesc num-args 1, num-type-args 0, names []
-  [4] = Reserved
-  [5] = DirectCall 'dart:core::print', ArgDesc num-args 1, num-type-args 0, names []
-  [6] = Reserved
-}
-
-
-Function 'get:_identityHashCode', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::int*
-
-Function '_instanceOf', abstract, debuggable
-    parameters [dynamic 'instantiatorTypeArguments', dynamic 'functionTypeArguments', dynamic 'type'] (required: 3)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOf', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOfTrue', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOfFalse', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '==', abstract, debuggable
-    parameters [dynamic 'other'] (required: 1)
-    return-type dart:core::bool*
-
-Function 'get:hashCode', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::int*
-
-Function 'toString', abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::String*
-
-Function 'noSuchMethod', abstract, debuggable
-    parameters [dart:core::Invocation* 'invocation'] (required: 1)
-    return-type dynamic
-
-Function 'get:runtimeType', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::Type*
-Class 'E', script = '#lib'
-    type-params <dart:core::Object* K, dart:core::Object* V> (args: 2)
-    extends dart:core::Object*
-
-
-Function '', constructor, reflectable
-    parameters [] (required: 0)
-    return-type #lib::E < #lib::E::TypeParam/0*, #lib::E::TypeParam/1* >*
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  Push                 FP[-5]
-  DirectCall           CP#0, 1
-  Drop1
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-  [0] = DirectCall 'dart:core::Object:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
-  [1] = Reserved
-}
-
-
-Function 'test_reuse1', reflectable, debuggable
-    parameters [] (required: 0)
-    return-type dynamic
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  Push                 FP[-5]
-  LoadTypeArgumentsField CP#0
-  DirectCall           CP#1, 1
-  ReturnTOS
-}
-ConstantPool {
-  [0] = TypeArgumentsField #lib::E
-  [1] = DirectCall 'dart:core::Map:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
-  [2] = Reserved
-}
-
-
-Function 'get:_identityHashCode', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::int*
-
-Function '_instanceOf', abstract, debuggable
-    parameters [dynamic 'instantiatorTypeArguments', dynamic 'functionTypeArguments', dynamic 'type'] (required: 3)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOf', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOfTrue', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOfFalse', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '==', abstract, debuggable
-    parameters [dynamic 'other'] (required: 1)
-    return-type dart:core::bool*
-
-Function 'get:hashCode', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::int*
-
-Function 'toString', abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::String*
-
-Function 'noSuchMethod', abstract, debuggable
-    parameters [dart:core::Invocation* 'invocation'] (required: 1)
-    return-type dynamic
-
-Function 'get:runtimeType', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::Type*
-Class 'F', script = '#lib'
-    type-params <dart:core::Object* K, dart:core::Object* V> (args: 4)
-    extends #lib::E < dart:core::String*, dart:core::List < #lib::F::TypeParam/1* >* >*
-
-
-Function '', constructor, reflectable
-    parameters [] (required: 0)
-    return-type #lib::F < dart:core::String*, dart:core::List < #lib::F::TypeParam/1* >*, #lib::F::TypeParam/0*, #lib::F::TypeParam/1* >*
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  Push                 FP[-5]
-  DirectCall           CP#0, 1
-  Drop1
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-  [0] = DirectCall '#lib::E:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
-  [1] = Reserved
-}
-
-
-Function 'test_reuse2', reflectable, debuggable
-    parameters [] (required: 0)
-    return-type dynamic
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  Push                 FP[-5]
-  LoadTypeArgumentsField CP#0
-  DirectCall           CP#1, 1
-  ReturnTOS
-}
-ConstantPool {
-  [0] = TypeArgumentsField #lib::F
-  [1] = DirectCall 'dart:core::Map:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
-  [2] = Reserved
-}
-
-Class 'G', script = '#lib'
-    type-params <dart:core::Object* K, dart:core::Object* V> (args: 2)
-    extends dart:core::Object*
-
-
-Function '', constructor, reflectable, debuggable
-    parameters [] (required: 0)
-    return-type #lib::G < #lib::G::TypeParam/0*, #lib::G::TypeParam/1* >*
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  Push                 FP[-5]
-  DirectCall           CP#0, 1
-  Drop1
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-  [0] = DirectCall 'dart:core::Object:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
-  [1] = Reserved
-}
-
-
-Function 'test_factory', factory, static, reflectable, debuggable
-    type-params <dart:core::Object* K, dart:core::Object* V>
-    parameters [] (required: 0)
-    return-type #lib::G < #lib::G::test_factory (constructor)::TypeParam/0*, #lib::G::test_factory (constructor)::TypeParam/1* >*
-
-Bytecode {
-  Entry                1
-  CheckStack           0
-  Push                 FP[-5]
-  PushNull
-  InstantiateTypeArgumentsTOS 0, CP#1
-  PushConstant         CP#0
-  AllocateT
-  StoreLocal           r0
-  Push                 r0
-  DirectCall           CP#2, 1
-  Drop1
-  ReturnTOS
-}
-ConstantPool {
-  [0] = Class #lib::H
-  [1] = ObjectRef < #lib::G::test_factory (constructor)::TypeParam/0*, #lib::G::test_factory (constructor)::TypeParam/1*, dart:core::String*, #lib::G::test_factory (constructor)::TypeParam/0*, #lib::G::test_factory (constructor)::TypeParam/1* >
-  [2] = DirectCall '#lib::H:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
-  [3] = Reserved
-}
-
-
-Function 'get:_identityHashCode', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::int*
-
-Function '_instanceOf', abstract, debuggable
-    parameters [dynamic 'instantiatorTypeArguments', dynamic 'functionTypeArguments', dynamic 'type'] (required: 3)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOf', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOfTrue', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOfFalse', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '==', abstract, debuggable
-    parameters [dynamic 'other'] (required: 1)
-    return-type dart:core::bool*
-
-Function 'get:hashCode', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::int*
-
-Function 'toString', abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::String*
-
-Function 'noSuchMethod', abstract, debuggable
-    parameters [dart:core::Invocation* 'invocation'] (required: 1)
-    return-type dynamic
-
-Function 'get:runtimeType', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::Type*
-Class 'H', script = '#lib'
-    type-params <dart:core::Object* P1, dart:core::Object* P2, dart:core::Object* P3> (args: 5)
-    extends #lib::G < #lib::H::TypeParam/1*, #lib::H::TypeParam/2* >*
-
-
-Function '', constructor, reflectable
-    parameters [] (required: 0)
-    return-type #lib::H < #lib::H::TypeParam/1*, #lib::H::TypeParam/2*, #lib::H::TypeParam/0*, #lib::H::TypeParam/1*, #lib::H::TypeParam/2* >*
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  Push                 FP[-5]
-  DirectCall           CP#0, 1
-  Drop1
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-  [0] = DirectCall '#lib::G:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
-  [1] = Reserved
-}
-
-Class 'I', script = '#lib'
-    extends dart:core::Object*
-
-
-Function '', constructor, reflectable, debuggable
-    parameters [dynamic 'param'] (required: 1)
-    return-type #lib::I*
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  Push                 FP[-6]
-  DirectCall           CP#0, 1
-  Drop1
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-  [0] = DirectCall 'dart:core::Object:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
-  [1] = Reserved
-}
-
-
-Function 'test_factory2', factory, static, has-optional-named-params, reflectable, debuggable
-    parameters [dynamic 'param'] (required: 0)
-    return-type #lib::I*
-
-Bytecode {
-  EntryOptional        1, 0, 1
-  LoadConstant         r1, CP#0
-  LoadConstant         r1, CP#1
-  Frame                1
-  CheckStack           0
-  Allocate             CP#2
-  StoreLocal           r2
-  Push                 r2
-  Push                 r1
-  DirectCall           CP#3, 2
-  Drop1
-  ReturnTOS
-}
-ConstantPool {
-  [0] = ObjectRef 'param'
-  [1] = ObjectRef null
-  [2] = Class #lib::I
-  [3] = DirectCall '#lib::I:: (constructor)', ArgDesc num-args 2, num-type-args 0, names []
-  [4] = Reserved
-}
-
-
-Function 'get:_identityHashCode', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::int*
-
-Function '_instanceOf', abstract, debuggable
-    parameters [dynamic 'instantiatorTypeArguments', dynamic 'functionTypeArguments', dynamic 'type'] (required: 3)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOf', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOfTrue', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOfFalse', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '==', abstract, debuggable
-    parameters [dynamic 'other'] (required: 1)
-    return-type dart:core::bool*
-
-Function 'get:hashCode', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::int*
-
-Function 'toString', abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::String*
-
-Function 'noSuchMethod', abstract, debuggable
-    parameters [dart:core::Invocation* 'invocation'] (required: 1)
-    return-type dynamic
-
-Function 'get:runtimeType', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::Type*
-Class 'J', script = '#lib'
-    extends dart:core::Object*
-
-
-Function '', factory, static, reflectable, debuggable, native 'agent_J'
-    parameters [] (required: 0)
-    return-type #lib::J*
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  Push                 FP[-5]
-  NativeCall           CP#0
-  ReturnTOS
-}
-ConstantPool {
-  [0] = NativeEntry agent_J
-}
-
-
-Function 'get:_identityHashCode', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::int*
-
-Function '_instanceOf', abstract, debuggable
-    parameters [dynamic 'instantiatorTypeArguments', dynamic 'functionTypeArguments', dynamic 'type'] (required: 3)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOf', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOfTrue', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOfFalse', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '==', abstract, debuggable
-    parameters [dynamic 'other'] (required: 1)
-    return-type dart:core::bool*
-
-Function 'get:hashCode', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::int*
-
-Function 'toString', abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::String*
-
-Function 'noSuchMethod', abstract, debuggable
-    parameters [dart:core::Invocation* 'invocation'] (required: 1)
-    return-type dynamic
-
-Function 'get:runtimeType', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::Type*
-Class 'K', script = '#lib', abstract
-    type-params <dart:core::Object* A, dart:core::Object* B> (args: 2)
-    extends dart:core::Object*
-
-
-Function '', factory, static, reflectable, debuggable
-    type-params <dart:core::Object* A, dart:core::Object* B>
-    parameters [] (required: 0)
-    return-type #lib::K < #lib::K:: (constructor)::TypeParam/0*, #lib::K:: (constructor)::TypeParam/1* >*
-
-Bytecode {
-  Entry                1
-  CheckStack           0
-  Push                 FP[-5]
-  PushConstant         CP#0
-  AllocateT
-  StoreLocal           r0
-  Push                 r0
-  DirectCall           CP#1, 1
-  Drop1
-  ReturnTOS
-}
-ConstantPool {
-  [0] = Class #lib::TestTypeArgReuse
-  [1] = DirectCall '#lib::TestTypeArgReuse:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
-  [2] = Reserved
-}
-
-
-Function 'get:_identityHashCode', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::int*
-
-Function '_instanceOf', abstract, debuggable
-    parameters [dynamic 'instantiatorTypeArguments', dynamic 'functionTypeArguments', dynamic 'type'] (required: 3)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOf', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOfTrue', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOfFalse', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '==', abstract, debuggable
-    parameters [dynamic 'other'] (required: 1)
-    return-type dart:core::bool*
-
-Function 'get:hashCode', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::int*
-
-Function 'toString', abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::String*
-
-Function 'noSuchMethod', abstract, debuggable
-    parameters [dart:core::Invocation* 'invocation'] (required: 1)
-    return-type dynamic
-
-Function 'get:runtimeType', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::Type*
-Class 'TestTypeArgReuse', script = '#lib'
-    type-params <dart:core::Object* P, dart:core::Object* Q> (args: 2)
-    extends #lib::Base < #lib::TestTypeArgReuse::TypeParam/0*, #lib::TestTypeArgReuse::TypeParam/1* >*
-    implements [#lib::K < #lib::TestTypeArgReuse::TypeParam/0*, #lib::TestTypeArgReuse::TypeParam/1* >*]
-
-
-Function '', constructor, reflectable
-    parameters [] (required: 0)
-    return-type #lib::TestTypeArgReuse < #lib::TestTypeArgReuse::TypeParam/0*, #lib::TestTypeArgReuse::TypeParam/1* >*
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  Push                 FP[-5]
-  DirectCall           CP#0, 1
-  Drop1
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-  [0] = DirectCall '#lib::Base:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
-  [1] = Reserved
-}
-
-
-}
-]library #lib from "#lib" as #lib {
-
-  class Base<T1 extends dart.core::Object* = dynamic, T2 extends dart.core::Object* = dynamic> extends dart.core::Object {
-    generic-covariant-impl field #lib::Base::T1* t1 = null;
-    generic-covariant-impl field #lib::Base::T2* t2 = null;
-    constructor •() → #lib::Base<#lib::Base::T1*, #lib::Base::T2*>*
-      : super dart.core::Object::•() {
-      dart.core::print("Base: ${#lib::Base::T1*}, ${#lib::Base::T2*}");
-    }
-    abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
-    abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
-    abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
-    abstract member-signature method _simpleInstanceOfTrue(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfTrue
-    abstract member-signature method _simpleInstanceOfFalse(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfFalse
-    abstract member-signature operator ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
-    abstract member-signature get hashCode() → dart.core::int*; -> dart.core::Object::hashCode
-    abstract member-signature method toString() → dart.core::String*; -> dart.core::Object::toString
-    abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
-    abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
-  }
-  class A extends #lib::Base<dart.core::int*, dart.core::String*> {
-    constructor •(dart.core::String* s) → #lib::A*
-      : super #lib::Base::•()
-      ;
-  }
-  class B<T extends dart.core::Object* = dynamic> extends #lib::Base<dart.core::List<#lib::B::T*>*, dart.core::String*> {
-    constructor •() → #lib::B<#lib::B::T*>*
-      : super #lib::Base::•() {
-      dart.core::print("B: ${#lib::B::T*}");
-    }
-  }
-  class C extends dart.core::Object {
-    constructor •(dart.core::String* s) → #lib::C*
-      : super dart.core::Object::•() {
-      dart.core::print("C: ${s}");
-    }
-    abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
-    abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
-    abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
-    abstract member-signature method _simpleInstanceOfTrue(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfTrue
-    abstract member-signature method _simpleInstanceOfFalse(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfFalse
-    abstract member-signature operator ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
-    abstract member-signature get hashCode() → dart.core::int*; -> dart.core::Object::hashCode
-    abstract member-signature method toString() → dart.core::String*; -> dart.core::Object::toString
-    abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
-    abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
-  }
-  class E<K extends dart.core::Object* = dynamic, V extends dart.core::Object* = dynamic> extends dart.core::Object {
-    synthetic constructor •() → #lib::E<#lib::E::K*, #lib::E::V*>*
-      : super dart.core::Object::•()
-      ;
-    method test_reuse1() → dynamic
-      return dart.core::Map::•<#lib::E::K*, #lib::E::V*>();
-    abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
-    abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
-    abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
-    abstract member-signature method _simpleInstanceOfTrue(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfTrue
-    abstract member-signature method _simpleInstanceOfFalse(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfFalse
-    abstract member-signature operator ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
-    abstract member-signature get hashCode() → dart.core::int*; -> dart.core::Object::hashCode
-    abstract member-signature method toString() → dart.core::String*; -> dart.core::Object::toString
-    abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
-    abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
-  }
-  class F<K extends dart.core::Object* = dynamic, V extends dart.core::Object* = dynamic> extends #lib::E<dart.core::String*, dart.core::List<#lib::F::V*>*> {
-    synthetic constructor •() → #lib::F<#lib::F::K*, #lib::F::V*>*
-      : super #lib::E::•()
-      ;
-    method test_reuse2() → dynamic
-      return dart.core::Map::•<dart.core::String*, dart.core::List<#lib::F::V*>*>();
-  }
-  class G<K extends dart.core::Object* = dynamic, V extends dart.core::Object* = dynamic> extends dart.core::Object {
-    constructor •() → #lib::G<#lib::G::K*, #lib::G::V*>*
-      : super dart.core::Object::•()
-      ;
-    static factory test_factory<K extends dart.core::Object* = dynamic, V extends dart.core::Object* = dynamic>() → #lib::G<#lib::G::test_factory::K*, #lib::G::test_factory::V*>*
-      return new #lib::H::•<dart.core::String*, #lib::G::test_factory::K*, #lib::G::test_factory::V*>();
-    abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
-    abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
-    abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
-    abstract member-signature method _simpleInstanceOfTrue(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfTrue
-    abstract member-signature method _simpleInstanceOfFalse(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfFalse
-    abstract member-signature operator ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
-    abstract member-signature get hashCode() → dart.core::int*; -> dart.core::Object::hashCode
-    abstract member-signature method toString() → dart.core::String*; -> dart.core::Object::toString
-    abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
-    abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
-  }
-  class H<P1 extends dart.core::Object* = dynamic, P2 extends dart.core::Object* = dynamic, P3 extends dart.core::Object* = dynamic> extends #lib::G<#lib::H::P2*, #lib::H::P3*> {
-    synthetic constructor •() → #lib::H<#lib::H::P1*, #lib::H::P2*, #lib::H::P3*>*
-      : super #lib::G::•()
-      ;
-  }
-  class I extends dart.core::Object {
-    constructor •(dynamic param) → #lib::I*
-      : super dart.core::Object::•()
-      ;
-    static factory test_factory2({dynamic param = #C1}) → #lib::I*
-      return new #lib::I::•(param);
-    abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
-    abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
-    abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
-    abstract member-signature method _simpleInstanceOfTrue(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfTrue
-    abstract member-signature method _simpleInstanceOfFalse(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfFalse
-    abstract member-signature operator ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
-    abstract member-signature get hashCode() → dart.core::int*; -> dart.core::Object::hashCode
-    abstract member-signature method toString() → dart.core::String*; -> dart.core::Object::toString
-    abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
-    abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
-  }
-  class J extends dart.core::Object {
-    @#C3
-    external static factory •() → #lib::J*;
-    abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
-    abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
-    abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
-    abstract member-signature method _simpleInstanceOfTrue(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfTrue
-    abstract member-signature method _simpleInstanceOfFalse(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfFalse
-    abstract member-signature operator ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
-    abstract member-signature get hashCode() → dart.core::int*; -> dart.core::Object::hashCode
-    abstract member-signature method toString() → dart.core::String*; -> dart.core::Object::toString
-    abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
-    abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
-  }
-  abstract class K<A extends dart.core::Object* = dynamic, B extends dart.core::Object* = dynamic> extends dart.core::Object {
-    static factory •<A extends dart.core::Object* = dynamic, B extends dart.core::Object* = dynamic>() → #lib::K<#lib::K::•::A*, #lib::K::•::B*>*
-      return new #lib::TestTypeArgReuse::•<#lib::K::•::A*, #lib::K::•::B*>();
-    abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
-    abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
-    abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
-    abstract member-signature method _simpleInstanceOfTrue(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfTrue
-    abstract member-signature method _simpleInstanceOfFalse(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfFalse
-    abstract member-signature operator ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
-    abstract member-signature get hashCode() → dart.core::int*; -> dart.core::Object::hashCode
-    abstract member-signature method toString() → dart.core::String*; -> dart.core::Object::toString
-    abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
-    abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
-  }
-  class TestTypeArgReuse<P extends dart.core::Object* = dynamic, Q extends dart.core::Object* = dynamic> extends #lib::Base<#lib::TestTypeArgReuse::P*, #lib::TestTypeArgReuse::Q*> implements #lib::K<#lib::TestTypeArgReuse::P*, #lib::TestTypeArgReuse::Q*> {
-    synthetic constructor •() → #lib::TestTypeArgReuse<#lib::TestTypeArgReuse::P*, #lib::TestTypeArgReuse::Q*>*
-      : super #lib::Base::•()
-      ;
-  }
-  static method foo1() → dynamic
-    return new #lib::C::•("hello");
-  static method foo2() → void {
-    new #lib::A::•("hi");
-    new #lib::B::•<dart.core::int*>();
-  }
-  static method foo3<T extends dart.core::Object* = dynamic>() → void {
-    new #lib::B::•<dart.core::List<#lib::foo3::T*>*>();
-  }
-  static method foo4() → void {
-    #lib::G::test_factory<dart.core::int*, dart.core::List<dart.core::String*>*>();
-  }
-  static method foo5() → void {
-    #lib::I::test_factory2();
-    #lib::I::test_factory2(param: 42);
-  }
-  static method foo6() → dynamic
-    return dart.core::_GrowableList::•<dart.core::String*>(0);
-  static method foo7(dart.core::int* n) → dynamic
-    return dart.core::_List::•<dart.core::int*>(n);
-  static method main() → dynamic {
-    #lib::foo1();
-    #lib::foo2();
-    #lib::foo3<dart.core::String*>();
-  }
-}
-constants  {
-  #C1 = null
-  #C2 = "agent_J"
-  #C3 = dart._internal::ExternalName {name:#C2}
-}
diff --git a/pkg/vm/testcases/bytecode/literals.dart b/pkg/vm/testcases/bytecode/literals.dart
deleted file mode 100644
index c4c3ea8..0000000
--- a/pkg/vm/testcases/bytecode/literals.dart
+++ /dev/null
@@ -1,92 +0,0 @@
-// Copyright (c) 2018, 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.
-
-enum A {
-  elem1,
-  elem2,
-  elem3,
-  elem4,
-}
-
-class B {
-  final int i;
-  const B(this.i);
-}
-
-class C extends B {
-  final int j;
-  const C(int a, int b, int c)
-      : j = a + b,
-        super(c * 5);
-}
-
-class D {
-  final x;
-  final y;
-  const D(this.x, [this.y]);
-}
-
-const c1 = A.elem3;
-const c2 = 'hello!';
-const c3 = c2.length;
-const c4 = const C(1, 2, 3);
-const c5 = const D(const B(4));
-
-void test_constants1() {
-  print(c1);
-  print(c2);
-  print(c3);
-  print(c4);
-  print(c5);
-}
-
-void test_constants2() {
-  print(42);
-  print('foo');
-  print(A.elem2);
-  print(const [42, 'foo', int]);
-  print(const <String, A>{'E2': A.elem2, 'E4': A.elem4});
-  print(
-      const D(const C(4, 5, 6), const {'foo': 42, 'bar': const B(c2.length)}));
-}
-
-void test_list_literal(int a) {
-  print([1, a, 3]);
-  print(<String>['a', a.toString(), 'b']);
-}
-
-void test_map_literal<T>(int a, int b, T c) {
-  print({1: a, b: 2});
-  print(<String, int>{'foo': a, b.toString(): 3});
-  print(<String, T>{});
-  print(<T, int>{c: 4});
-}
-
-void test_symbol() {
-  print(#test_symbol);
-  print(#_private_symbol);
-}
-
-void test_type_literal<T>() {
-  print(String);
-  print(T);
-}
-
-class E<T> {
-  const E();
-}
-
-class F<P, Q> extends E<Map<P, Q>> {
-  const F();
-}
-
-testGenericConstInstance() => const F<int, String>();
-
-typedef GenericFunctionType = X Function<X>(X);
-testGenericFunctionTypeLiteral() => GenericFunctionType;
-
-double fieldWithDoubleLiteralInitializer = 1.0;
-testFieldWithDoubleLiteralInitializer() => fieldWithDoubleLiteralInitializer;
-
-main() {}
diff --git a/pkg/vm/testcases/bytecode/literals.dart.expect b/pkg/vm/testcases/bytecode/literals.dart.expect
deleted file mode 100644
index 5e58043..0000000
--- a/pkg/vm/testcases/bytecode/literals.dart.expect
+++ /dev/null
@@ -1,1013 +0,0 @@
-main = #lib::main;
- [@vm.bytecode=
-BytecodeMetadata {
-Bytecode (version: stable)
-Main library: #lib
-Library '#lib'
-    name '#lib'
-    script '#lib'
-
-Class '', script = '#lib'
-
-Field 'c1', type = #lib::A*, getter = 'get:c1', reflectable, static, const, final, has-initializer
-    initializer
-Bytecode {
-  Entry                0
-  CheckStack           0
-  PushConstant         CP#0
-  ReturnTOS
-}
-ConstantPool {
-  [0] = ObjectRef const #lib::A* {#lib::A::index (field): const 2, #lib::A::_name (field): 'A.elem3'}
-}
-
-
-Field 'c2', type = dart:core::String*, reflectable, static, const, final, has-initializer
-    value = 'hello!'
-
-Field 'c3', type = dart:core::int*, reflectable, static, const, final, has-initializer
-    value = const 6
-
-Field 'c4', type = #lib::C*, getter = 'get:c4', reflectable, static, const, final, has-initializer
-    initializer
-Bytecode {
-  Entry                0
-  CheckStack           0
-  PushConstant         CP#0
-  ReturnTOS
-}
-ConstantPool {
-  [0] = ObjectRef const #lib::C* {#lib::C::j (field): const 3, #lib::B::i (field): const 15}
-}
-
-
-Field 'c5', type = #lib::D*, getter = 'get:c5', reflectable, static, const, final, has-initializer
-    initializer
-Bytecode {
-  Entry                0
-  CheckStack           0
-  PushConstant         CP#0
-  ReturnTOS
-}
-ConstantPool {
-  [0] = ObjectRef const #lib::D* {#lib::D::x (field): const #lib::B* {#lib::B::i (field): const 4}, #lib::D::y (field): null}
-}
-
-
-Field 'fieldWithDoubleLiteralInitializer', type = dart:core::double*, reflectable, static, has-initializer
-    value = const 1.0
-
-Function 'test_constants1', static, reflectable, debuggable
-    parameters [] (required: 0)
-    return-type void
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  PushConstant         CP#0
-  DirectCall           CP#1, 1
-  Drop1
-  PushConstant         CP#3
-  DirectCall           CP#1, 1
-  Drop1
-  PushInt              6
-  DirectCall           CP#1, 1
-  Drop1
-  PushConstant         CP#4
-  DirectCall           CP#1, 1
-  Drop1
-  PushConstant         CP#5
-  DirectCall           CP#1, 1
-  Drop1
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-  [0] = ObjectRef const #lib::A* {#lib::A::index (field): const 2, #lib::A::_name (field): 'A.elem3'}
-  [1] = DirectCall 'dart:core::print', ArgDesc num-args 1, num-type-args 0, names []
-  [2] = Reserved
-  [3] = ObjectRef 'hello!'
-  [4] = ObjectRef const #lib::C* {#lib::C::j (field): const 3, #lib::B::i (field): const 15}
-  [5] = ObjectRef const #lib::D* {#lib::D::x (field): const #lib::B* {#lib::B::i (field): const 4}, #lib::D::y (field): null}
-}
-
-
-Function 'test_constants2', static, reflectable, debuggable
-    parameters [] (required: 0)
-    return-type void
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  PushInt              42
-  DirectCall           CP#0, 1
-  Drop1
-  PushConstant         CP#2
-  DirectCall           CP#0, 1
-  Drop1
-  PushConstant         CP#3
-  DirectCall           CP#0, 1
-  Drop1
-  PushConstant         CP#4
-  DirectCall           CP#0, 1
-  Drop1
-  PushConstant         CP#5
-  DirectCall           CP#0, 1
-  Drop1
-  PushConstant         CP#6
-  DirectCall           CP#0, 1
-  Drop1
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-  [0] = DirectCall 'dart:core::print', ArgDesc num-args 1, num-type-args 0, names []
-  [1] = Reserved
-  [2] = ObjectRef 'foo'
-  [3] = ObjectRef const #lib::A* {#lib::A::index (field): const 1, #lib::A::_name (field): 'A.elem2'}
-  [4] = ObjectRef const <dart:core::Object*> [const 42, 'foo', dart:core::int*]
-  [5] = ObjectRef const dart:core::_ImmutableMap < dart:core::String*, #lib::A* >* {dart:core::_ImmutableMap::_kvPairs (field): const <dynamic> ['E2', const #lib::A* {#lib::A::index (field): const 1, #lib::A::_name (field): 'A.elem2'}, 'E4', const #lib::A* {#lib::A::index (field): const 3, #lib::A::_name (field): 'A.elem4'}]}
-  [6] = ObjectRef const #lib::D* {#lib::D::x (field): const #lib::C* {#lib::C::j (field): const 9, #lib::B::i (field): const 30}, #lib::D::y (field): const dart:core::_ImmutableMap < dart:core::String*, dart:core::Object* >* {dart:core::_ImmutableMap::_kvPairs (field): const <dynamic> ['foo', const 42, 'bar', const #lib::B* {#lib::B::i (field): const 6}]}}
-}
-
-
-Function 'test_list_literal', static, reflectable, debuggable
-    parameters [dart:core::int* 'a'] (required: 1)
-    return-type void
-
-Bytecode {
-  Entry                1
-  CheckStack           0
-  PushConstant         CP#0
-  StoreLocal           r0
-  Push                 r0
-  PushInt              3
-  CreateArrayTOS
-  StoreLocal           r0
-  Push                 r0
-  PushInt              0
-  PushInt              1
-  StoreIndexedTOS
-  Push                 r0
-  PushInt              1
-  Push                 FP[-5]
-  StoreIndexedTOS
-  Push                 r0
-  PushInt              2
-  PushInt              3
-  StoreIndexedTOS
-  DirectCall           CP#1, 2
-  DirectCall           CP#3, 1
-  Drop1
-  PushConstant         CP#5
-  StoreLocal           r0
-  Push                 r0
-  PushInt              3
-  CreateArrayTOS
-  StoreLocal           r0
-  Push                 r0
-  PushInt              0
-  PushConstant         CP#6
-  StoreIndexedTOS
-  Push                 r0
-  PushInt              1
-  Push                 FP[-5]
-  InterfaceCall        CP#7, 1
-  StoreIndexedTOS
-  Push                 r0
-  PushInt              2
-  PushConstant         CP#9
-  StoreIndexedTOS
-  DirectCall           CP#1, 2
-  DirectCall           CP#3, 1
-  Drop1
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-  [0] = ObjectRef < dart:core::int* >
-  [1] = DirectCall 'dart:core::List::_fromLiteral (constructor)', ArgDesc num-args 2, num-type-args 0, names []
-  [2] = Reserved
-  [3] = DirectCall 'dart:core::print', ArgDesc num-args 1, num-type-args 0, names []
-  [4] = Reserved
-  [5] = ObjectRef < dart:core::String* >
-  [6] = ObjectRef 'a'
-  [7] = InterfaceCall 'dart:core::int::toString', ArgDesc num-args 1, num-type-args 0, names []
-  [8] = Reserved
-  [9] = ObjectRef 'b'
-}
-
-
-Function 'test_map_literal', static, reflectable, debuggable
-    type-params <dart:core::Object* T>
-    parameters [dart:core::int* 'a', dart:core::int* 'b', #lib::test_map_literal::TypeParam/0* 'c'] (required: 3)
-    return-type void
-
-Bytecode {
-  Entry                2
-  CheckFunctionTypeArgs 1, r0
-  CheckStack           0
-  PushConstant         CP#0
-  PushConstant         CP#1
-  PushInt              4
-  CreateArrayTOS
-  StoreLocal           r1
-  Push                 r1
-  PushInt              0
-  PushInt              1
-  StoreIndexedTOS
-  Push                 r1
-  PushInt              1
-  Push                 FP[-7]
-  StoreIndexedTOS
-  Push                 r1
-  PushInt              2
-  Push                 FP[-6]
-  StoreIndexedTOS
-  Push                 r1
-  PushInt              3
-  PushInt              2
-  StoreIndexedTOS
-  DirectCall           CP#2, 2
-  DirectCall           CP#4, 1
-  Drop1
-  PushConstant         CP#6
-  PushConstant         CP#1
-  PushInt              4
-  CreateArrayTOS
-  StoreLocal           r1
-  Push                 r1
-  PushInt              0
-  PushConstant         CP#7
-  StoreIndexedTOS
-  Push                 r1
-  PushInt              1
-  Push                 FP[-7]
-  StoreIndexedTOS
-  Push                 r1
-  PushInt              2
-  Push                 FP[-6]
-  InterfaceCall        CP#8, 1
-  StoreIndexedTOS
-  Push                 r1
-  PushInt              3
-  PushInt              3
-  StoreIndexedTOS
-  DirectCall           CP#2, 2
-  DirectCall           CP#4, 1
-  Drop1
-  PushNull
-  Push                 r0
-  InstantiateTypeArgumentsTOS 0, CP#10
-  PushConstant         CP#11
-  DirectCall           CP#2, 2
-  DirectCall           CP#4, 1
-  Drop1
-  PushNull
-  Push                 r0
-  InstantiateTypeArgumentsTOS 0, CP#12
-  PushConstant         CP#1
-  PushInt              2
-  CreateArrayTOS
-  StoreLocal           r1
-  Push                 r1
-  PushInt              0
-  Push                 FP[-5]
-  StoreIndexedTOS
-  Push                 r1
-  PushInt              1
-  PushInt              4
-  StoreIndexedTOS
-  DirectCall           CP#2, 2
-  DirectCall           CP#4, 1
-  Drop1
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-  [0] = ObjectRef < dart:core::int*, dart:core::int* >
-  [1] = ObjectRef < dynamic >
-  [2] = DirectCall 'dart:core::Map::_fromLiteral (constructor)', ArgDesc num-args 2, num-type-args 0, names []
-  [3] = Reserved
-  [4] = DirectCall 'dart:core::print', ArgDesc num-args 1, num-type-args 0, names []
-  [5] = Reserved
-  [6] = ObjectRef < dart:core::String*, dart:core::int* >
-  [7] = ObjectRef 'foo'
-  [8] = InterfaceCall 'dart:core::int::toString', ArgDesc num-args 1, num-type-args 0, names []
-  [9] = Reserved
-  [10] = ObjectRef < dart:core::String*, #lib::test_map_literal::TypeParam/0* >
-  [11] = ObjectRef const <dynamic> []
-  [12] = ObjectRef < #lib::test_map_literal::TypeParam/0*, dart:core::int* >
-}
-
-
-Function 'test_symbol', static, reflectable, debuggable
-    parameters [] (required: 0)
-    return-type void
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  PushConstant         CP#0
-  DirectCall           CP#1, 1
-  Drop1
-  PushConstant         CP#3
-  DirectCall           CP#1, 1
-  Drop1
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-  [0] = ObjectRef const 'test_symbol'
-  [1] = DirectCall 'dart:core::print', ArgDesc num-args 1, num-type-args 0, names []
-  [2] = Reserved
-  [3] = ObjectRef const '_private_symbol'
-}
-
-
-Function 'test_type_literal', static, reflectable, debuggable
-    type-params <dart:core::Object* T>
-    parameters [] (required: 0)
-    return-type void
-
-Bytecode {
-  Entry                1
-  CheckFunctionTypeArgs 1, r0
-  CheckStack           0
-  PushConstant         CP#0
-  DirectCall           CP#1, 1
-  Drop1
-  PushNull
-  Push                 r0
-  InstantiateType      CP#3
-  DirectCall           CP#1, 1
-  Drop1
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-  [0] = Type dart:core::String*
-  [1] = DirectCall 'dart:core::print', ArgDesc num-args 1, num-type-args 0, names []
-  [2] = Reserved
-  [3] = Type #lib::test_type_literal::TypeParam/0*
-}
-
-
-Function 'testGenericConstInstance', static, reflectable, debuggable
-    parameters [] (required: 0)
-    return-type dynamic
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  PushConstant         CP#0
-  ReturnTOS
-}
-ConstantPool {
-  [0] = ObjectRef const #lib::F < dart:core::Map < dart:core::int*, dart:core::String* >*, dart:core::int*, dart:core::String* >* {}
-}
-
-
-Function 'testGenericFunctionTypeLiteral', static, reflectable, debuggable
-    parameters [] (required: 0)
-    return-type dynamic
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  PushConstant         CP#0
-  ReturnTOS
-}
-ConstantPool {
-  [0] = Type FunctionType <dart:core::Object* X> (null::TypeParam/0*)* -> null::TypeParam/0*
-}
-
-
-Function 'testFieldWithDoubleLiteralInitializer', static, reflectable, debuggable
-    parameters [] (required: 0)
-    return-type dynamic
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  LoadStatic           CP#0
-  ReturnTOS
-}
-ConstantPool {
-  [0] = StaticField #lib::fieldWithDoubleLiteralInitializer (field)
-}
-
-
-Function 'main', static, reflectable, debuggable
-    parameters [] (required: 0)
-    return-type dynamic
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-}
-
-Class 'A', script = '#lib', enum
-    extends dart:core::Object*
-
-Field 'index', type = dart:core::int*, getter = 'get:index', reflectable, final
-    value = null
-
-Field '_name', type = dart:core::String*, getter = 'get:_name', reflectable, final
-    value = null
-
-Field 'values', type = dart:core::List < #lib::A* >*, getter = 'get:values', reflectable, static, const, final, has-initializer
-    initializer
-Bytecode {
-  Entry                0
-  CheckStack           0
-  PushConstant         CP#0
-  ReturnTOS
-}
-ConstantPool {
-  [0] = ObjectRef const <#lib::A*> [const #lib::A* {#lib::A::index (field): const 0, #lib::A::_name (field): 'A.elem1'}, const #lib::A* {#lib::A::index (field): const 1, #lib::A::_name (field): 'A.elem2'}, const #lib::A* {#lib::A::index (field): const 2, #lib::A::_name (field): 'A.elem3'}, const #lib::A* {#lib::A::index (field): const 3, #lib::A::_name (field): 'A.elem4'}]
-}
-
-
-Field 'elem1', type = #lib::A*, getter = 'get:elem1', reflectable, static, const, final, has-initializer
-    initializer
-Bytecode {
-  Entry                0
-  CheckStack           0
-  PushConstant         CP#0
-  ReturnTOS
-}
-ConstantPool {
-  [0] = ObjectRef const #lib::A* {#lib::A::index (field): const 0, #lib::A::_name (field): 'A.elem1'}
-}
-
-
-Field 'elem2', type = #lib::A*, getter = 'get:elem2', reflectable, static, const, final, has-initializer
-    initializer
-Bytecode {
-  Entry                0
-  CheckStack           0
-  PushConstant         CP#0
-  ReturnTOS
-}
-ConstantPool {
-  [0] = ObjectRef const #lib::A* {#lib::A::index (field): const 1, #lib::A::_name (field): 'A.elem2'}
-}
-
-
-Field 'elem3', type = #lib::A*, getter = 'get:elem3', reflectable, static, const, final, has-initializer
-    initializer
-Bytecode {
-  Entry                0
-  CheckStack           0
-  PushConstant         CP#0
-  ReturnTOS
-}
-ConstantPool {
-  [0] = ObjectRef const #lib::A* {#lib::A::index (field): const 2, #lib::A::_name (field): 'A.elem3'}
-}
-
-
-Field 'elem4', type = #lib::A*, getter = 'get:elem4', reflectable, static, const, final, has-initializer
-    initializer
-Bytecode {
-  Entry                0
-  CheckStack           0
-  PushConstant         CP#0
-  ReturnTOS
-}
-ConstantPool {
-  [0] = ObjectRef const #lib::A* {#lib::A::index (field): const 3, #lib::A::_name (field): 'A.elem4'}
-}
-
-
-Function '', constructor, const, reflectable, debuggable
-    parameters [dart:core::int* 'index', dart:core::String* '_name'] (required: 2)
-    return-type #lib::A*
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  Push                 FP[-7]
-  Push                 FP[-6]
-  StoreFieldTOS        CP#0
-  Push                 FP[-7]
-  Push                 FP[-5]
-  StoreFieldTOS        CP#2
-  Push                 FP[-7]
-  DirectCall           CP#4, 1
-  Drop1
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-  [0] = InstanceField #lib::A::index (field)
-  [1] = Reserved
-  [2] = InstanceField #lib::A::_name (field)
-  [3] = Reserved
-  [4] = DirectCall 'dart:core::Object:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
-  [5] = Reserved
-}
-
-
-Function 'toString', reflectable, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::String*
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  Push                 FP[-5]
-  InterfaceCall        CP#0, 1
-  ReturnTOS
-}
-ConstantPool {
-  [0] = InterfaceCall '#lib::A::get:_name', ArgDesc num-args 1, num-type-args 0, names []
-  [1] = Reserved
-}
-
-
-Function 'get:_identityHashCode', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::int*
-
-Function '_instanceOf', abstract, debuggable
-    parameters [dynamic 'instantiatorTypeArguments', dynamic 'functionTypeArguments', dynamic 'type'] (required: 3)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOf', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOfTrue', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOfFalse', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '==', abstract, debuggable
-    parameters [dynamic 'other'] (required: 1)
-    return-type dart:core::bool*
-
-Function 'get:hashCode', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::int*
-
-Function 'noSuchMethod', abstract, debuggable
-    parameters [dart:core::Invocation* 'invocation'] (required: 1)
-    return-type dynamic
-
-Function 'get:runtimeType', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::Type*
-Class 'B', script = '#lib'
-    extends dart:core::Object*
-
-Field 'i', type = dart:core::int*, getter = 'get:i', reflectable, final
-    value = null
-
-Function '', constructor, const, reflectable, debuggable
-    parameters [dart:core::int* 'i'] (required: 1)
-    return-type #lib::B*
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  Push                 FP[-6]
-  Push                 FP[-5]
-  StoreFieldTOS        CP#0
-  Push                 FP[-6]
-  DirectCall           CP#2, 1
-  Drop1
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-  [0] = InstanceField #lib::B::i (field)
-  [1] = Reserved
-  [2] = DirectCall 'dart:core::Object:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
-  [3] = Reserved
-}
-
-
-Function 'get:_identityHashCode', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::int*
-
-Function '_instanceOf', abstract, debuggable
-    parameters [dynamic 'instantiatorTypeArguments', dynamic 'functionTypeArguments', dynamic 'type'] (required: 3)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOf', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOfTrue', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOfFalse', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '==', abstract, debuggable
-    parameters [dynamic 'other'] (required: 1)
-    return-type dart:core::bool*
-
-Function 'get:hashCode', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::int*
-
-Function 'toString', abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::String*
-
-Function 'noSuchMethod', abstract, debuggable
-    parameters [dart:core::Invocation* 'invocation'] (required: 1)
-    return-type dynamic
-
-Function 'get:runtimeType', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::Type*
-Class 'C', script = '#lib'
-    extends #lib::B*
-
-Field 'j', type = dart:core::int*, getter = 'get:j', reflectable, final
-    value = null
-
-Function '', constructor, const, reflectable, debuggable
-    parameters [dart:core::int* 'a', dart:core::int* 'b', dart:core::int* 'c'] (required: 3)
-    return-type #lib::C*
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  Push                 FP[-8]
-  Push                 FP[-7]
-  Push                 FP[-6]
-  AddInt
-  StoreFieldTOS        CP#0
-  Push                 FP[-8]
-  Push                 FP[-5]
-  PushInt              5
-  MulInt
-  DirectCall           CP#2, 2
-  Drop1
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-  [0] = InstanceField #lib::C::j (field)
-  [1] = Reserved
-  [2] = DirectCall '#lib::B:: (constructor)', ArgDesc num-args 2, num-type-args 0, names []
-  [3] = Reserved
-}
-
-Class 'D', script = '#lib'
-    extends dart:core::Object*
-
-Field 'x', type = dynamic, getter = 'get:x', reflectable, final
-    value = null
-
-Field 'y', type = dynamic, getter = 'get:y', reflectable, final
-    value = null
-
-Function '', constructor, const, has-optional-positional-params, reflectable, debuggable
-    parameters [dynamic 'x', dynamic 'y'] (required: 1)
-    return-type #lib::D*
-
-Bytecode {
-  EntryOptional        2, 1, 0
-  LoadConstant         r2, CP#0
-  Frame                0
-  CheckStack           0
-  Push                 r0
-  Push                 r1
-  StoreFieldTOS        CP#1
-  Push                 r0
-  Push                 r2
-  StoreFieldTOS        CP#3
-  Push                 r0
-  DirectCall           CP#5, 1
-  Drop1
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-  [0] = ObjectRef null
-  [1] = InstanceField #lib::D::x (field)
-  [2] = Reserved
-  [3] = InstanceField #lib::D::y (field)
-  [4] = Reserved
-  [5] = DirectCall 'dart:core::Object:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
-  [6] = Reserved
-}
-
-
-Function 'get:_identityHashCode', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::int*
-
-Function '_instanceOf', abstract, debuggable
-    parameters [dynamic 'instantiatorTypeArguments', dynamic 'functionTypeArguments', dynamic 'type'] (required: 3)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOf', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOfTrue', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOfFalse', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '==', abstract, debuggable
-    parameters [dynamic 'other'] (required: 1)
-    return-type dart:core::bool*
-
-Function 'get:hashCode', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::int*
-
-Function 'toString', abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::String*
-
-Function 'noSuchMethod', abstract, debuggable
-    parameters [dart:core::Invocation* 'invocation'] (required: 1)
-    return-type dynamic
-
-Function 'get:runtimeType', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::Type*
-Class 'E', script = '#lib'
-    type-params <dart:core::Object* T> (args: 1)
-    extends dart:core::Object*
-
-
-Function '', constructor, const, reflectable, debuggable
-    parameters [] (required: 0)
-    return-type #lib::E < #lib::E::TypeParam/0* >*
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  Push                 FP[-5]
-  DirectCall           CP#0, 1
-  Drop1
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-  [0] = DirectCall 'dart:core::Object:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
-  [1] = Reserved
-}
-
-
-Function 'get:_identityHashCode', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::int*
-
-Function '_instanceOf', abstract, debuggable
-    parameters [dynamic 'instantiatorTypeArguments', dynamic 'functionTypeArguments', dynamic 'type'] (required: 3)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOf', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOfTrue', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOfFalse', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '==', abstract, debuggable
-    parameters [dynamic 'other'] (required: 1)
-    return-type dart:core::bool*
-
-Function 'get:hashCode', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::int*
-
-Function 'toString', abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::String*
-
-Function 'noSuchMethod', abstract, debuggable
-    parameters [dart:core::Invocation* 'invocation'] (required: 1)
-    return-type dynamic
-
-Function 'get:runtimeType', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::Type*
-Class 'F', script = '#lib'
-    type-params <dart:core::Object* P, dart:core::Object* Q> (args: 3)
-    extends #lib::E < dart:core::Map < #lib::F::TypeParam/0*, #lib::F::TypeParam/1* >* >*
-
-
-Function '', constructor, const, reflectable, debuggable
-    parameters [] (required: 0)
-    return-type #lib::F < dart:core::Map < #lib::F::TypeParam/0*, #lib::F::TypeParam/1* >*, #lib::F::TypeParam/0*, #lib::F::TypeParam/1* >*
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  Push                 FP[-5]
-  DirectCall           CP#0, 1
-  Drop1
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-  [0] = DirectCall '#lib::E:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
-  [1] = Reserved
-}
-
-
-}
-]library #lib from "#lib" as #lib {
-
-  typedef GenericFunctionType = <X extends dart.core::Object* = dynamic>(X*) →* X*;
-  class A extends dart.core::Object /*isEnum*/  {
-    final field dart.core::int* index;
-    final field dart.core::String* _name;
-    static const field dart.core::List<#lib::A*>* values = #C13;
-    static const field #lib::A* elem1 = #C3;
-    static const field #lib::A* elem2 = #C6;
-    static const field #lib::A* elem3 = #C9;
-    static const field #lib::A* elem4 = #C12;
-    const constructor •(dart.core::int* index, dart.core::String* _name) → #lib::A*
-      : #lib::A::index = index, #lib::A::_name = _name, super dart.core::Object::•()
-      ;
-    method toString() → dart.core::String*
-      return this.{#lib::A::_name};
-    abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
-    abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
-    abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
-    abstract member-signature method _simpleInstanceOfTrue(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfTrue
-    abstract member-signature method _simpleInstanceOfFalse(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfFalse
-    abstract member-signature operator ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
-    abstract member-signature get hashCode() → dart.core::int*; -> dart.core::Object::hashCode
-    abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
-    abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
-  }
-  class B extends dart.core::Object /*hasConstConstructor*/  {
-    final field dart.core::int* i;
-    const constructor •(dart.core::int* i) → #lib::B*
-      : #lib::B::i = i, super dart.core::Object::•()
-      ;
-    abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
-    abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
-    abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
-    abstract member-signature method _simpleInstanceOfTrue(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfTrue
-    abstract member-signature method _simpleInstanceOfFalse(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfFalse
-    abstract member-signature operator ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
-    abstract member-signature get hashCode() → dart.core::int*; -> dart.core::Object::hashCode
-    abstract member-signature method toString() → dart.core::String*; -> dart.core::Object::toString
-    abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
-    abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
-  }
-  class C extends #lib::B /*hasConstConstructor*/  {
-    final field dart.core::int* j;
-    const constructor •(dart.core::int* a, dart.core::int* b, dart.core::int* c) → #lib::C*
-      : #lib::C::j = a.{dart.core::num::+}(b), super #lib::B::•(c.{dart.core::num::*}(5))
-      ;
-  }
-  class D extends dart.core::Object /*hasConstConstructor*/  {
-    final field dynamic x;
-    final field dynamic y;
-    const constructor •(dynamic x, [dynamic y = #C14]) → #lib::D*
-      : #lib::D::x = x, #lib::D::y = y, super dart.core::Object::•()
-      ;
-    abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
-    abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
-    abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
-    abstract member-signature method _simpleInstanceOfTrue(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfTrue
-    abstract member-signature method _simpleInstanceOfFalse(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfFalse
-    abstract member-signature operator ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
-    abstract member-signature get hashCode() → dart.core::int*; -> dart.core::Object::hashCode
-    abstract member-signature method toString() → dart.core::String*; -> dart.core::Object::toString
-    abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
-    abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
-  }
-  class E<T extends dart.core::Object* = dynamic> extends dart.core::Object /*hasConstConstructor*/  {
-    const constructor •() → #lib::E<#lib::E::T*>*
-      : super dart.core::Object::•()
-      ;
-    abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
-    abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
-    abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
-    abstract member-signature method _simpleInstanceOfTrue(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfTrue
-    abstract member-signature method _simpleInstanceOfFalse(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfFalse
-    abstract member-signature operator ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
-    abstract member-signature get hashCode() → dart.core::int*; -> dart.core::Object::hashCode
-    abstract member-signature method toString() → dart.core::String*; -> dart.core::Object::toString
-    abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
-    abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
-  }
-  class F<P extends dart.core::Object* = dynamic, Q extends dart.core::Object* = dynamic> extends #lib::E<dart.core::Map<#lib::F::P*, #lib::F::Q*>*> /*hasConstConstructor*/  {
-    const constructor •() → #lib::F<#lib::F::P*, #lib::F::Q*>*
-      : super #lib::E::•()
-      ;
-  }
-  static const field #lib::A* c1 = #C9;
-  static const field dart.core::String* c2 = #C15;
-  static const field dart.core::int* c3 = #C16;
-  static const field #lib::C* c4 = #C18;
-  static const field #lib::D* c5 = #C21;
-  static field dart.core::double* fieldWithDoubleLiteralInitializer = 1.0;
-  static method test_constants1() → void {
-    dart.core::print(#C9);
-    dart.core::print(#C15);
-    dart.core::print(#C16);
-    dart.core::print(#C18);
-    dart.core::print(#C21);
-  }
-  static method test_constants2() → void {
-    dart.core::print(42);
-    dart.core::print("foo");
-    dart.core::print(#C6);
-    dart.core::print(#C25);
-    dart.core::print(#C29);
-    dart.core::print(#C37);
-  }
-  static method test_list_literal(dart.core::int* a) → void {
-    dart.core::print(<dart.core::int*>[1, a, 3]);
-    dart.core::print(<dart.core::String*>["a", a.{dart.core::int::toString}(), "b"]);
-  }
-  static method test_map_literal<T extends dart.core::Object* = dynamic>(dart.core::int* a, dart.core::int* b, #lib::test_map_literal::T* c) → void {
-    dart.core::print(<dart.core::int*, dart.core::int*>{1: a, b: 2});
-    dart.core::print(<dart.core::String*, dart.core::int*>{"foo": a, b.{dart.core::int::toString}(): 3});
-    dart.core::print(<dart.core::String*, #lib::test_map_literal::T*>{});
-    dart.core::print(<#lib::test_map_literal::T*, dart.core::int*>{c: 4});
-  }
-  static method test_symbol() → void {
-    dart.core::print(#C38);
-    dart.core::print(#C39);
-  }
-  static method test_type_literal<T extends dart.core::Object* = dynamic>() → void {
-    dart.core::print(dart.core::String*);
-    dart.core::print(#lib::test_type_literal::T*);
-  }
-  static method testGenericConstInstance() → dynamic
-    return #C40;
-  static method testGenericFunctionTypeLiteral() → dynamic
-    return <X extends dart.core::Object* = dynamic>(X*) →* X*;
-  static method testFieldWithDoubleLiteralInitializer() → dynamic
-    return #lib::fieldWithDoubleLiteralInitializer;
-  static method main() → dynamic {}
-}
-constants  {
-  #C1 = 0
-  #C2 = "A.elem1"
-  #C3 = #lib::A {index:#C1, _name:#C2}
-  #C4 = 1
-  #C5 = "A.elem2"
-  #C6 = #lib::A {index:#C4, _name:#C5}
-  #C7 = 2
-  #C8 = "A.elem3"
-  #C9 = #lib::A {index:#C7, _name:#C8}
-  #C10 = 3
-  #C11 = "A.elem4"
-  #C12 = #lib::A {index:#C10, _name:#C11}
-  #C13 = <#lib::A*>[#C3, #C6, #C9, #C12]
-  #C14 = null
-  #C15 = "hello!"
-  #C16 = 6
-  #C17 = 15
-  #C18 = #lib::C {j:#C10, i:#C17}
-  #C19 = 4
-  #C20 = #lib::B {i:#C19}
-  #C21 = #lib::D {x:#C20, y:#C14}
-  #C22 = 42
-  #C23 = "foo"
-  #C24 = TypeLiteralConstant(dart.core::int*)
-  #C25 = <dart.core::Object*>[#C22, #C23, #C24]
-  #C26 = "E2"
-  #C27 = "E4"
-  #C28 = <dynamic>[#C26, #C6, #C27, #C12]
-  #C29 = dart.core::_ImmutableMap<dart.core::String*, #lib::A*> {_kvPairs:#C28}
-  #C30 = 9
-  #C31 = 30
-  #C32 = #lib::C {j:#C30, i:#C31}
-  #C33 = "bar"
-  #C34 = #lib::B {i:#C16}
-  #C35 = <dynamic>[#C23, #C22, #C33, #C34]
-  #C36 = dart.core::_ImmutableMap<dart.core::String*, dart.core::Object*> {_kvPairs:#C35}
-  #C37 = #lib::D {x:#C32, y:#C36}
-  #C38 = #test_symbol
-  #C39 = ##lib::_private_symbol
-  #C40 = #lib::F<dart.core::int*, dart.core::String*> {}
-}
diff --git a/pkg/vm/testcases/bytecode/loops.dart b/pkg/vm/testcases/bytecode/loops.dart
deleted file mode 100644
index 4d9dd1b..0000000
--- a/pkg/vm/testcases/bytecode/loops.dart
+++ /dev/null
@@ -1,71 +0,0 @@
-// Copyright (c) 2018, 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.
-
-int test_for(List<int> list) {
-  int sum = 0;
-  for (int i = 0; i < list.length; i++) {
-    sum = sum + list[i];
-  }
-  return sum;
-}
-
-int test_for_break(List<int> list) {
-  int sum = 0;
-  for (int i = 0; i >= 0; i++) {
-    if (i >= list.length) {
-      break;
-    }
-    sum = sum + list[i];
-  }
-  return sum;
-}
-
-int test_for_continue(List<int> list) {
-  int sum = 0;
-  for (int i = -100; i < list.length; i++) {
-    if (i < 0) {
-      continue;
-    }
-    sum = sum + list[i];
-  }
-  return sum;
-}
-
-int test_while(List<int> list) {
-  int sum = 0;
-  int i = 0;
-  while (i < list.length) {
-    sum = sum + list[i++];
-  }
-  return sum;
-}
-
-int test_do_while(List<int> list) {
-  int sum = 0;
-  int i = 0;
-  do {
-    sum = sum + list[i];
-    ++i;
-  } while (i < list.length);
-  return sum;
-}
-
-int test_for_in(List<int> list) {
-  int sum = 0;
-  for (var e in list) {
-    sum = sum + e;
-  }
-  return sum;
-}
-
-int test_for_in_with_outer_var(List<int> list) {
-  int sum = 0;
-  int e = 42;
-  for (e in list) {
-    sum = sum + e;
-  }
-  return sum;
-}
-
-main() {}
diff --git a/pkg/vm/testcases/bytecode/loops.dart.expect b/pkg/vm/testcases/bytecode/loops.dart.expect
deleted file mode 100644
index 11d1d08..0000000
--- a/pkg/vm/testcases/bytecode/loops.dart.expect
+++ /dev/null
@@ -1,429 +0,0 @@
-main = #lib::main;
- [@vm.bytecode=
-BytecodeMetadata {
-Bytecode (version: stable)
-Main library: #lib
-Library '#lib'
-    name '#lib'
-    script '#lib'
-
-Class '', script = '#lib'
-
-
-Function 'test_for', static, reflectable, debuggable
-    parameters [dart:core::List < dart:core::int* >* 'list'] (required: 1)
-    return-type dart:core::int*
-
-Bytecode {
-  Entry                2
-  CheckStack           0
-  PushInt              0
-  PopLocal             r0
-  PushInt              0
-  PopLocal             r1
-L2:
-  CheckStack           1
-  Push                 r1
-  Push                 FP[-5]
-  InterfaceCall        CP#0, 1
-  InterfaceCall        CP#2, 2
-  AssertBoolean        0
-  JumpIfFalse          L1
-  Push                 r0
-  Push                 FP[-5]
-  Push                 r1
-  InterfaceCall        CP#4, 2
-  AddInt
-  PopLocal             r0
-  Push                 r1
-  PushInt              1
-  AddInt
-  StoreLocal           r1
-  Drop1
-  Jump                 L2
-L1:
-  Push                 r0
-  ReturnTOS
-}
-ConstantPool {
-  [0] = InterfaceCall 'dart:core::List::get:length', ArgDesc num-args 1, num-type-args 0, names []
-  [1] = Reserved
-  [2] = InterfaceCall 'dart:core::num::<', ArgDesc num-args 2, num-type-args 0, names []
-  [3] = Reserved
-  [4] = InterfaceCall 'dart:core::List::[]', ArgDesc num-args 2, num-type-args 0, names []
-  [5] = Reserved
-}
-
-
-Function 'test_for_break', static, reflectable, debuggable
-    parameters [dart:core::List < dart:core::int* >* 'list'] (required: 1)
-    return-type dart:core::int*
-
-Bytecode {
-  Entry                2
-  CheckStack           0
-  PushInt              0
-  PopLocal             r0
-  PushInt              0
-  PopLocal             r1
-L3:
-  CheckStack           1
-  Push                 r1
-  PushInt              0
-  CompareIntGe
-  JumpIfFalse          L1
-  Push                 r1
-  Push                 FP[-5]
-  InterfaceCall        CP#0, 1
-  InterfaceCall        CP#2, 2
-  AssertBoolean        0
-  JumpIfFalse          L2
-  Jump                 L1
-L2:
-  Push                 r0
-  Push                 FP[-5]
-  Push                 r1
-  InterfaceCall        CP#4, 2
-  AddInt
-  PopLocal             r0
-  Push                 r1
-  PushInt              1
-  AddInt
-  StoreLocal           r1
-  Drop1
-  Jump                 L3
-L1:
-  Push                 r0
-  ReturnTOS
-}
-ConstantPool {
-  [0] = InterfaceCall 'dart:core::List::get:length', ArgDesc num-args 1, num-type-args 0, names []
-  [1] = Reserved
-  [2] = InterfaceCall 'dart:core::num::>=', ArgDesc num-args 2, num-type-args 0, names []
-  [3] = Reserved
-  [4] = InterfaceCall 'dart:core::List::[]', ArgDesc num-args 2, num-type-args 0, names []
-  [5] = Reserved
-}
-
-
-Function 'test_for_continue', static, reflectable, debuggable
-    parameters [dart:core::List < dart:core::int* >* 'list'] (required: 1)
-    return-type dart:core::int*
-
-Bytecode {
-  Entry                2
-  CheckStack           0
-  PushInt              0
-  PopLocal             r0
-  PushInt              100
-  NegateInt
-  PopLocal             r1
-L4:
-  CheckStack           1
-  Push                 r1
-  Push                 FP[-5]
-  InterfaceCall        CP#0, 1
-  InterfaceCall        CP#2, 2
-  AssertBoolean        0
-  JumpIfFalse          L1
-  Push                 r1
-  PushInt              0
-  CompareIntLt
-  JumpIfFalse          L2
-  Jump                 L3
-L2:
-  Push                 r0
-  Push                 FP[-5]
-  Push                 r1
-  InterfaceCall        CP#4, 2
-  AddInt
-  PopLocal             r0
-L3:
-  Push                 r1
-  PushInt              1
-  AddInt
-  StoreLocal           r1
-  Drop1
-  Jump                 L4
-L1:
-  Push                 r0
-  ReturnTOS
-}
-ConstantPool {
-  [0] = InterfaceCall 'dart:core::List::get:length', ArgDesc num-args 1, num-type-args 0, names []
-  [1] = Reserved
-  [2] = InterfaceCall 'dart:core::num::<', ArgDesc num-args 2, num-type-args 0, names []
-  [3] = Reserved
-  [4] = InterfaceCall 'dart:core::List::[]', ArgDesc num-args 2, num-type-args 0, names []
-  [5] = Reserved
-}
-
-
-Function 'test_while', static, reflectable, debuggable
-    parameters [dart:core::List < dart:core::int* >* 'list'] (required: 1)
-    return-type dart:core::int*
-
-Bytecode {
-  Entry                4
-  CheckStack           0
-  PushInt              0
-  PopLocal             r0
-  PushInt              0
-  PopLocal             r1
-L2:
-  CheckStack           1
-  Push                 r1
-  Push                 FP[-5]
-  InterfaceCall        CP#0, 1
-  InterfaceCall        CP#2, 2
-  AssertBoolean        0
-  JumpIfFalse          L1
-  Push                 r0
-  Push                 FP[-5]
-  Push                 r1
-  PopLocal             r2
-  Push                 r2
-  PushInt              1
-  AddInt
-  StoreLocal           r1
-  PopLocal             r3
-  Push                 r2
-  InterfaceCall        CP#4, 2
-  AddInt
-  PopLocal             r0
-  Jump                 L2
-L1:
-  Push                 r0
-  ReturnTOS
-}
-ConstantPool {
-  [0] = InterfaceCall 'dart:core::List::get:length', ArgDesc num-args 1, num-type-args 0, names []
-  [1] = Reserved
-  [2] = InterfaceCall 'dart:core::num::<', ArgDesc num-args 2, num-type-args 0, names []
-  [3] = Reserved
-  [4] = InterfaceCall 'dart:core::List::[]', ArgDesc num-args 2, num-type-args 0, names []
-  [5] = Reserved
-}
-
-
-Function 'test_do_while', static, reflectable, debuggable
-    parameters [dart:core::List < dart:core::int* >* 'list'] (required: 1)
-    return-type dart:core::int*
-
-Bytecode {
-  Entry                2
-  CheckStack           0
-  PushInt              0
-  PopLocal             r0
-  PushInt              0
-  PopLocal             r1
-L1:
-  CheckStack           1
-  Push                 r0
-  Push                 FP[-5]
-  Push                 r1
-  InterfaceCall        CP#0, 2
-  AddInt
-  PopLocal             r0
-  Push                 r1
-  PushInt              1
-  AddInt
-  PopLocal             r1
-  Push                 r1
-  Push                 FP[-5]
-  InterfaceCall        CP#2, 1
-  InterfaceCall        CP#4, 2
-  AssertBoolean        0
-  JumpIfTrue           L1
-  Push                 r0
-  ReturnTOS
-}
-ConstantPool {
-  [0] = InterfaceCall 'dart:core::List::[]', ArgDesc num-args 2, num-type-args 0, names []
-  [1] = Reserved
-  [2] = InterfaceCall 'dart:core::List::get:length', ArgDesc num-args 1, num-type-args 0, names []
-  [3] = Reserved
-  [4] = InterfaceCall 'dart:core::num::<', ArgDesc num-args 2, num-type-args 0, names []
-  [5] = Reserved
-}
-
-
-Function 'test_for_in', static, reflectable, debuggable
-    parameters [dart:core::List < dart:core::int* >* 'list'] (required: 1)
-    return-type dart:core::int*
-
-Bytecode {
-  Entry                3
-  CheckStack           0
-  PushInt              0
-  PopLocal             r0
-  Push                 FP[-5]
-  InterfaceCall        CP#0, 1
-  PopLocal             r1
-L2:
-  CheckStack           1
-  Push                 r1
-  InterfaceCall        CP#2, 1
-  AssertBoolean        0
-  JumpIfFalse          L1
-  Push                 r1
-  InterfaceCall        CP#4, 1
-  PopLocal             r2
-  Push                 r0
-  Push                 r2
-  AddInt
-  PopLocal             r0
-  Jump                 L2
-L1:
-  Push                 r0
-  ReturnTOS
-}
-ConstantPool {
-  [0] = InterfaceCall 'dart:core::Iterable::get:iterator', ArgDesc num-args 1, num-type-args 0, names []
-  [1] = Reserved
-  [2] = InterfaceCall 'dart:core::Iterator::moveNext', ArgDesc num-args 1, num-type-args 0, names []
-  [3] = Reserved
-  [4] = InterfaceCall 'dart:core::Iterator::get:current', ArgDesc num-args 1, num-type-args 0, names []
-  [5] = Reserved
-}
-
-
-Function 'test_for_in_with_outer_var', static, reflectable, debuggable
-    parameters [dart:core::List < dart:core::int* >* 'list'] (required: 1)
-    return-type dart:core::int*
-
-Bytecode {
-  Entry                4
-  CheckStack           0
-  PushInt              0
-  PopLocal             r0
-  PushInt              42
-  PopLocal             r1
-  Push                 FP[-5]
-  InterfaceCall        CP#0, 1
-  PopLocal             r2
-L2:
-  CheckStack           1
-  Push                 r2
-  InterfaceCall        CP#2, 1
-  AssertBoolean        0
-  JumpIfFalse          L1
-  Push                 r2
-  InterfaceCall        CP#4, 1
-  PopLocal             r3
-  Push                 r3
-  PopLocal             r1
-  Push                 r0
-  Push                 r1
-  AddInt
-  PopLocal             r0
-  Jump                 L2
-L1:
-  Push                 r0
-  ReturnTOS
-}
-ConstantPool {
-  [0] = InterfaceCall 'dart:core::Iterable::get:iterator', ArgDesc num-args 1, num-type-args 0, names []
-  [1] = Reserved
-  [2] = InterfaceCall 'dart:core::Iterator::moveNext', ArgDesc num-args 1, num-type-args 0, names []
-  [3] = Reserved
-  [4] = InterfaceCall 'dart:core::Iterator::get:current', ArgDesc num-args 1, num-type-args 0, names []
-  [5] = Reserved
-}
-
-
-Function 'main', static, reflectable, debuggable
-    parameters [] (required: 0)
-    return-type dynamic
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-}
-
-
-}
-]library #lib from "#lib" as #lib {
-
-  static method test_for(dart.core::List<dart.core::int*>* list) → dart.core::int* {
-    dart.core::int* sum = 0;
-    for (dart.core::int* i = 0; i.{dart.core::num::<}(list.{dart.core::List::length}); i = i.{dart.core::num::+}(1)) {
-      sum = sum.{dart.core::num::+}(list.{dart.core::List::[]}(i));
-    }
-    return sum;
-  }
-  static method test_for_break(dart.core::List<dart.core::int*>* list) → dart.core::int* {
-    dart.core::int* sum = 0;
-    #L1:
-    for (dart.core::int* i = 0; i.{dart.core::num::>=}(0); i = i.{dart.core::num::+}(1)) {
-      if(i.{dart.core::num::>=}(list.{dart.core::List::length})) {
-        break #L1;
-      }
-      sum = sum.{dart.core::num::+}(list.{dart.core::List::[]}(i));
-    }
-    return sum;
-  }
-  static method test_for_continue(dart.core::List<dart.core::int*>* list) → dart.core::int* {
-    dart.core::int* sum = 0;
-    for (dart.core::int* i = 100.{dart.core::int::unary-}(); i.{dart.core::num::<}(list.{dart.core::List::length}); i = i.{dart.core::num::+}(1))
-      #L2:
-      {
-        if(i.{dart.core::num::<}(0)) {
-          break #L2;
-        }
-        sum = sum.{dart.core::num::+}(list.{dart.core::List::[]}(i));
-      }
-    return sum;
-  }
-  static method test_while(dart.core::List<dart.core::int*>* list) → dart.core::int* {
-    dart.core::int* sum = 0;
-    dart.core::int* i = 0;
-    while (i.{dart.core::num::<}(list.{dart.core::List::length})) {
-      sum = sum.{dart.core::num::+}(list.{dart.core::List::[]}(let final dart.core::int* #t1 = i in let final dart.core::int* #t2 = i = #t1.{dart.core::num::+}(1) in #t1));
-    }
-    return sum;
-  }
-  static method test_do_while(dart.core::List<dart.core::int*>* list) → dart.core::int* {
-    dart.core::int* sum = 0;
-    dart.core::int* i = 0;
-    do {
-      sum = sum.{dart.core::num::+}(list.{dart.core::List::[]}(i));
-      i = i.{dart.core::num::+}(1);
-    }
-    while (i.{dart.core::num::<}(list.{dart.core::List::length}))
-    return sum;
-  }
-  static method test_for_in(dart.core::List<dart.core::int*>* list) → dart.core::int* {
-    dart.core::int* sum = 0;
-    {
-      dart.core::Iterator<dart.core::int*>* :sync-for-iterator = list.{dart.core::Iterable::iterator};
-      for (; :sync-for-iterator.{dart.core::Iterator::moveNext}(); ) {
-        dart.core::int* e = :sync-for-iterator.{dart.core::Iterator::current};
-        {
-          sum = sum.{dart.core::num::+}(e);
-        }
-      }
-    }
-    return sum;
-  }
-  static method test_for_in_with_outer_var(dart.core::List<dart.core::int*>* list) → dart.core::int* {
-    dart.core::int* sum = 0;
-    dart.core::int* e = 42;
-    {
-      dart.core::Iterator<dart.core::int*>* :sync-for-iterator = list.{dart.core::Iterable::iterator};
-      for (; :sync-for-iterator.{dart.core::Iterator::moveNext}(); ) {
-        final dart.core::int* #t3 = :sync-for-iterator.{dart.core::Iterator::current};
-        {
-          e = #t3;
-          sum = sum.{dart.core::num::+}(e);
-        }
-      }
-    }
-    return sum;
-  }
-  static method main() → dynamic {}
-}
diff --git a/pkg/vm/testcases/bytecode/optional_params.dart b/pkg/vm/testcases/bytecode/optional_params.dart
deleted file mode 100644
index 908f596..0000000
--- a/pkg/vm/testcases/bytecode/optional_params.dart
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright (c) 2018, 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.
-
-void foo1(x, [a = 'default_a', b = 'default_b']) {
-  print('x = $x');
-  print('a = $a');
-  print('b = $b');
-}
-
-void foo2(y, z, {c = 'default_c', a = 42, b = const ['default_b']}) {
-  print('y = $y');
-  print('z = $z');
-  print('a = $a');
-  print('b = $b');
-  print('c = $c');
-}
-
-void foo3<P, Q>(z, y, {bool a: false, Map<P, Q> b}) {
-  print(P);
-  print(y);
-  print(b);
-}
-
-main() {
-  foo1('fixed_x', 'concrete_a');
-  foo2('fixed_y', 'fixed_z', a: 'concrete_a');
-}
diff --git a/pkg/vm/testcases/bytecode/optional_params.dart.expect b/pkg/vm/testcases/bytecode/optional_params.dart.expect
deleted file mode 100644
index 5e959bc..0000000
--- a/pkg/vm/testcases/bytecode/optional_params.dart.expect
+++ /dev/null
@@ -1,298 +0,0 @@
-main = #lib::main;
- [@vm.bytecode=
-BytecodeMetadata {
-Bytecode (version: stable)
-Main library: #lib
-Library '#lib'
-    name '#lib'
-    script '#lib'
-
-Class '', script = '#lib'
-
-
-Function 'foo1', static, has-optional-positional-params, reflectable, debuggable
-    parameters [dynamic 'x', dynamic 'a', dynamic 'b'] (required: 1)
-    return-type void
-
-Bytecode {
-  EntryOptional        1, 2, 0
-  LoadConstant         r1, CP#0
-  LoadConstant         r2, CP#1
-  Frame                1
-  CheckStack           0
-  PushNull
-  PushInt              2
-  CreateArrayTOS
-  StoreLocal           r3
-  Push                 r3
-  PushInt              0
-  PushConstant         CP#2
-  StoreIndexedTOS
-  Push                 r3
-  PushInt              1
-  Push                 r0
-  StoreIndexedTOS
-  DirectCall           CP#3, 1
-  DirectCall           CP#5, 1
-  Drop1
-  PushNull
-  PushInt              2
-  CreateArrayTOS
-  StoreLocal           r3
-  Push                 r3
-  PushInt              0
-  PushConstant         CP#7
-  StoreIndexedTOS
-  Push                 r3
-  PushInt              1
-  Push                 r1
-  StoreIndexedTOS
-  DirectCall           CP#3, 1
-  DirectCall           CP#5, 1
-  Drop1
-  PushNull
-  PushInt              2
-  CreateArrayTOS
-  StoreLocal           r3
-  Push                 r3
-  PushInt              0
-  PushConstant         CP#8
-  StoreIndexedTOS
-  Push                 r3
-  PushInt              1
-  Push                 r2
-  StoreIndexedTOS
-  DirectCall           CP#3, 1
-  DirectCall           CP#5, 1
-  Drop1
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-  [0] = ObjectRef 'default_a'
-  [1] = ObjectRef 'default_b'
-  [2] = ObjectRef 'x = '
-  [3] = DirectCall 'dart:core::_StringBase::_interpolate', ArgDesc num-args 1, num-type-args 0, names []
-  [4] = Reserved
-  [5] = DirectCall 'dart:core::print', ArgDesc num-args 1, num-type-args 0, names []
-  [6] = Reserved
-  [7] = ObjectRef 'a = '
-  [8] = ObjectRef 'b = '
-}
-
-
-Function 'foo2', static, has-optional-named-params, reflectable, debuggable
-    parameters [dynamic 'y', dynamic 'z', dynamic 'c', dynamic 'a', dynamic 'b'] (required: 2)
-    return-type void
-
-Bytecode {
-  EntryOptional        2, 0, 3
-  LoadConstant         r2, CP#0
-  LoadConstant         r2, CP#1
-  LoadConstant         r3, CP#2
-  LoadConstant         r3, CP#3
-  LoadConstant         r4, CP#4
-  LoadConstant         r4, CP#5
-  Frame                1
-  CheckStack           0
-  PushNull
-  PushInt              2
-  CreateArrayTOS
-  StoreLocal           r5
-  Push                 r5
-  PushInt              0
-  PushConstant         CP#6
-  StoreIndexedTOS
-  Push                 r5
-  PushInt              1
-  Push                 r0
-  StoreIndexedTOS
-  DirectCall           CP#7, 1
-  DirectCall           CP#9, 1
-  Drop1
-  PushNull
-  PushInt              2
-  CreateArrayTOS
-  StoreLocal           r5
-  Push                 r5
-  PushInt              0
-  PushConstant         CP#11
-  StoreIndexedTOS
-  Push                 r5
-  PushInt              1
-  Push                 r1
-  StoreIndexedTOS
-  DirectCall           CP#7, 1
-  DirectCall           CP#9, 1
-  Drop1
-  PushNull
-  PushInt              2
-  CreateArrayTOS
-  StoreLocal           r5
-  Push                 r5
-  PushInt              0
-  PushConstant         CP#12
-  StoreIndexedTOS
-  Push                 r5
-  PushInt              1
-  Push                 r2
-  StoreIndexedTOS
-  DirectCall           CP#7, 1
-  DirectCall           CP#9, 1
-  Drop1
-  PushNull
-  PushInt              2
-  CreateArrayTOS
-  StoreLocal           r5
-  Push                 r5
-  PushInt              0
-  PushConstant         CP#13
-  StoreIndexedTOS
-  Push                 r5
-  PushInt              1
-  Push                 r3
-  StoreIndexedTOS
-  DirectCall           CP#7, 1
-  DirectCall           CP#9, 1
-  Drop1
-  PushNull
-  PushInt              2
-  CreateArrayTOS
-  StoreLocal           r5
-  Push                 r5
-  PushInt              0
-  PushConstant         CP#14
-  StoreIndexedTOS
-  Push                 r5
-  PushInt              1
-  Push                 r4
-  StoreIndexedTOS
-  DirectCall           CP#7, 1
-  DirectCall           CP#9, 1
-  Drop1
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-  [0] = ObjectRef 'a'
-  [1] = ObjectRef const 42
-  [2] = ObjectRef 'b'
-  [3] = ObjectRef const <dart:core::String*> ['default_b']
-  [4] = ObjectRef 'c'
-  [5] = ObjectRef 'default_c'
-  [6] = ObjectRef 'y = '
-  [7] = DirectCall 'dart:core::_StringBase::_interpolate', ArgDesc num-args 1, num-type-args 0, names []
-  [8] = Reserved
-  [9] = DirectCall 'dart:core::print', ArgDesc num-args 1, num-type-args 0, names []
-  [10] = Reserved
-  [11] = ObjectRef 'z = '
-  [12] = ObjectRef 'a = '
-  [13] = ObjectRef 'b = '
-  [14] = ObjectRef 'c = '
-}
-
-
-Function 'foo3', static, has-optional-named-params, reflectable, debuggable
-    type-params <dart:core::Object* P, dart:core::Object* Q>
-    parameters [dynamic 'z', dynamic 'y', dart:core::bool* 'a', dart:core::Map < #lib::foo3::TypeParam/0*, #lib::foo3::TypeParam/1* >* 'b'] (required: 2)
-    return-type void
-
-Bytecode {
-  EntryOptional        2, 0, 2
-  LoadConstant         r2, CP#0
-  LoadConstant         r2, CP#1
-  LoadConstant         r3, CP#2
-  LoadConstant         r3, CP#3
-  Frame                1
-  CheckFunctionTypeArgs 2, r4
-  CheckStack           0
-  PushNull
-  Push                 r4
-  InstantiateType      CP#4
-  DirectCall           CP#5, 1
-  Drop1
-  Push                 r1
-  DirectCall           CP#5, 1
-  Drop1
-  Push                 r3
-  DirectCall           CP#5, 1
-  Drop1
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-  [0] = ObjectRef 'a'
-  [1] = ObjectRef const false
-  [2] = ObjectRef 'b'
-  [3] = ObjectRef null
-  [4] = Type #lib::foo3::TypeParam/0*
-  [5] = DirectCall 'dart:core::print', ArgDesc num-args 1, num-type-args 0, names []
-  [6] = Reserved
-}
-
-
-Function 'main', static, reflectable, debuggable
-    parameters [] (required: 0)
-    return-type dynamic
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  PushConstant         CP#0
-  PushConstant         CP#1
-  DirectCall           CP#2, 2
-  Drop1
-  PushConstant         CP#4
-  PushConstant         CP#5
-  PushConstant         CP#1
-  DirectCall           CP#6, 3
-  Drop1
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-  [0] = ObjectRef 'fixed_x'
-  [1] = ObjectRef 'concrete_a'
-  [2] = DirectCall '#lib::foo1', ArgDesc num-args 2, num-type-args 0, names []
-  [3] = Reserved
-  [4] = ObjectRef 'fixed_y'
-  [5] = ObjectRef 'fixed_z'
-  [6] = DirectCall '#lib::foo2', ArgDesc num-args 3, num-type-args 0, names ['a']
-  [7] = Reserved
-}
-
-
-}
-]library #lib from "#lib" as #lib {
-
-  static method foo1(dynamic x, [dynamic a = #C1, dynamic b = #C2]) → void {
-    dart.core::print("x = ${x}");
-    dart.core::print("a = ${a}");
-    dart.core::print("b = ${b}");
-  }
-  static method foo2(dynamic y, dynamic z, {dynamic c = #C3, dynamic a = #C4, dynamic b = #C5}) → void {
-    dart.core::print("y = ${y}");
-    dart.core::print("z = ${z}");
-    dart.core::print("a = ${a}");
-    dart.core::print("b = ${b}");
-    dart.core::print("c = ${c}");
-  }
-  static method foo3<P extends dart.core::Object* = dynamic, Q extends dart.core::Object* = dynamic>(dynamic z, dynamic y, {dart.core::bool* a = #C6, dart.core::Map<#lib::foo3::P*, #lib::foo3::Q*>* b = #C7}) → void {
-    dart.core::print(#lib::foo3::P*);
-    dart.core::print(y);
-    dart.core::print(b);
-  }
-  static method main() → dynamic {
-    #lib::foo1("fixed_x", "concrete_a");
-    #lib::foo2("fixed_y", "fixed_z", a: "concrete_a");
-  }
-}
-constants  {
-  #C1 = "default_a"
-  #C2 = "default_b"
-  #C3 = "default_c"
-  #C4 = 42
-  #C5 = <dart.core::String*>[#C2]
-  #C6 = false
-  #C7 = null
-}
diff --git a/pkg/vm/testcases/bytecode/super_calls.dart b/pkg/vm/testcases/bytecode/super_calls.dart
deleted file mode 100644
index 8bd86b7..0000000
--- a/pkg/vm/testcases/bytecode/super_calls.dart
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright (c) 2018, 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.
-
-// Tests various super-calls.
-// Class B requires super-mixin semantics (used in Flutter).
-
-class Base1 {
-  void foo<T>(T a1, int a2) {}
-  get bar => 42;
-  set bazz(int x) {}
-}
-
-class A extends Base1 {
-  testSuperCall(int x) => super.foo<String>('a1', 2);
-  testSuperTearOff() => super.foo;
-  testSuperGet() => super.bar;
-  testSuperCallViaGetter() => super.bar<int>('param');
-  testSuperSet() {
-    super.bazz = 3;
-  }
-}
-
-abstract class Base2 {
-  void foo<T>(String a1, T a2, int a3);
-  get bar;
-  set bazz(int x);
-}
-
-abstract class B extends Base2 {
-  testSuperCall(int x) => super.foo<double>('a1', 3.14, 5);
-  testSuperTearOff() => super.foo;
-  testSuperGet() => super.bar;
-  testSuperCallViaGetter() => super.bar<int>('param');
-  testSuperSet() {
-    super.bazz = 3;
-  }
-}
-
-main() {}
diff --git a/pkg/vm/testcases/bytecode/super_calls.dart.expect b/pkg/vm/testcases/bytecode/super_calls.dart.expect
deleted file mode 100644
index 8b7ed4c..0000000
--- a/pkg/vm/testcases/bytecode/super_calls.dart.expect
+++ /dev/null
@@ -1,627 +0,0 @@
-main = #lib::main;
- [@vm.bytecode=
-BytecodeMetadata {
-Bytecode (version: stable)
-Main library: #lib
-Library '#lib'
-    name '#lib'
-    script '#lib'
-
-Class '', script = '#lib'
-
-
-Function 'main', static, reflectable, debuggable
-    parameters [] (required: 0)
-    return-type dynamic
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-}
-
-Class 'Base1', script = '#lib'
-    extends dart:core::Object*
-
-
-Function '', constructor, reflectable
-    parameters [] (required: 0)
-    return-type #lib::Base1*
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  Push                 FP[-5]
-  DirectCall           CP#0, 1
-  Drop1
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-  [0] = DirectCall 'dart:core::Object:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
-  [1] = Reserved
-}
-
-
-Function 'foo', reflectable, debuggable
-    type-params <dart:core::Object* T>
-    parameters [#lib::Base1::foo::TypeParam/0* 'a1', dart:core::int* 'a2'] (required: 2)
-    return-type void
-
-Bytecode {
-  Entry                1
-  CheckFunctionTypeArgs 1, r0
-  CheckStack           0
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-}
-
-
-Function 'get:bar', getter, reflectable, debuggable
-    parameters [] (required: 0)
-    return-type dynamic
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  PushInt              42
-  ReturnTOS
-}
-ConstantPool {
-}
-
-
-Function 'set:bazz', setter, reflectable, debuggable
-    parameters [dart:core::int* 'x'] (required: 1)
-    return-type void
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-}
-
-
-Function 'get:_identityHashCode', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::int*
-
-Function '_instanceOf', abstract, debuggable
-    parameters [dynamic 'instantiatorTypeArguments', dynamic 'functionTypeArguments', dynamic 'type'] (required: 3)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOf', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOfTrue', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOfFalse', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '==', abstract, debuggable
-    parameters [dynamic 'other'] (required: 1)
-    return-type dart:core::bool*
-
-Function 'get:hashCode', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::int*
-
-Function 'toString', abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::String*
-
-Function 'noSuchMethod', abstract, debuggable
-    parameters [dart:core::Invocation* 'invocation'] (required: 1)
-    return-type dynamic
-
-Function 'get:runtimeType', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::Type*
-Class 'A', script = '#lib'
-    extends #lib::Base1*
-
-
-Function '', constructor, reflectable
-    parameters [] (required: 0)
-    return-type #lib::A*
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  Push                 FP[-5]
-  DirectCall           CP#0, 1
-  Drop1
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-  [0] = DirectCall '#lib::Base1:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
-  [1] = Reserved
-}
-
-
-Function 'testSuperCall', reflectable, debuggable
-    parameters [dart:core::int* 'x'] (required: 1)
-    return-type dynamic
-
-Bytecode {
-  Entry                1
-  CheckStack           0
-  PushConstant         CP#0
-  Push                 FP[-6]
-  PushConstant         CP#1
-  PushInt              2
-  UncheckedDirectCall  CP#2, 4
-  ReturnTOS
-}
-ConstantPool {
-  [0] = ObjectRef < dart:core::String* >
-  [1] = ObjectRef 'a1'
-  [2] = DirectCall '#lib::Base1::foo', ArgDesc num-args 3, num-type-args 1, names []
-  [3] = Reserved
-}
-
-
-Function 'testSuperTearOff', reflectable, debuggable
-    parameters [] (required: 0)
-    return-type dynamic
-
-Bytecode {
-  Entry                1
-  CheckStack           0
-  Push                 FP[-5]
-  DirectCall           CP#0, 1
-  ReturnTOS
-}
-ConstantPool {
-  [0] = DirectCall '#lib::Base1::get:foo', ArgDesc num-args 1, num-type-args 0, names []
-  [1] = Reserved
-}
-
-
-Function 'testSuperGet', reflectable, debuggable
-    parameters [] (required: 0)
-    return-type dynamic
-
-Bytecode {
-  Entry                1
-  CheckStack           0
-  Push                 FP[-5]
-  DirectCall           CP#0, 1
-  ReturnTOS
-}
-ConstantPool {
-  [0] = DirectCall '#lib::Base1::get:bar', ArgDesc num-args 1, num-type-args 0, names []
-  [1] = Reserved
-}
-
-
-Function 'testSuperCallViaGetter', reflectable, debuggable
-    parameters [] (required: 0)
-    return-type dynamic
-
-Bytecode {
-  Entry                1
-  CheckStack           0
-  PushConstant         CP#0
-  Push                 FP[-5]
-  DirectCall           CP#1, 1
-  PushConstant         CP#3
-  DynamicCall          CP#4, 3
-  ReturnTOS
-}
-ConstantPool {
-  [0] = ObjectRef < dart:core::int* >
-  [1] = DirectCall '#lib::Base1::get:bar', ArgDesc num-args 1, num-type-args 0, names []
-  [2] = Reserved
-  [3] = ObjectRef 'param'
-  [4] = DynamicCall 'call', ArgDesc num-args 2, num-type-args 1, names []
-  [5] = Reserved
-}
-
-
-Function 'testSuperSet', reflectable, debuggable
-    parameters [] (required: 0)
-    return-type dynamic
-
-Bytecode {
-  Entry                1
-  CheckStack           0
-  Push                 FP[-5]
-  PushInt              3
-  UncheckedDirectCall  CP#0, 2
-  Drop1
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-  [0] = DirectCall '#lib::Base1::set:bazz', ArgDesc num-args 2, num-type-args 0, names []
-  [1] = Reserved
-}
-
-Class 'Base2', script = '#lib', abstract
-    extends dart:core::Object*
-
-
-Function '', constructor, reflectable
-    parameters [] (required: 0)
-    return-type #lib::Base2*
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  Push                 FP[-5]
-  DirectCall           CP#0, 1
-  Drop1
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-  [0] = DirectCall 'dart:core::Object:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
-  [1] = Reserved
-}
-
-
-Function 'foo', abstract, reflectable, debuggable
-    type-params <dart:core::Object* T>
-    parameters [dart:core::String* 'a1', #lib::Base2::foo::TypeParam/0* 'a2', dart:core::int* 'a3'] (required: 3)
-    return-type void
-
-Function 'get:bar', getter, abstract, reflectable, debuggable
-    parameters [] (required: 0)
-    return-type dynamic
-
-Function 'set:bazz', setter, abstract, reflectable, debuggable
-    parameters [dart:core::int* 'x'] (required: 1)
-    return-type void
-
-Function 'get:_identityHashCode', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::int*
-
-Function '_instanceOf', abstract, debuggable
-    parameters [dynamic 'instantiatorTypeArguments', dynamic 'functionTypeArguments', dynamic 'type'] (required: 3)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOf', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOfTrue', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOfFalse', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '==', abstract, debuggable
-    parameters [dynamic 'other'] (required: 1)
-    return-type dart:core::bool*
-
-Function 'get:hashCode', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::int*
-
-Function 'toString', abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::String*
-
-Function 'noSuchMethod', abstract, debuggable
-    parameters [dart:core::Invocation* 'invocation'] (required: 1)
-    return-type dynamic
-
-Function 'get:runtimeType', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::Type*
-Class 'B', script = '#lib', abstract
-    extends #lib::Base2*
-
-
-Function '', constructor, reflectable
-    parameters [] (required: 0)
-    return-type #lib::B*
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  Push                 FP[-5]
-  DirectCall           CP#0, 1
-  Drop1
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-  [0] = DirectCall '#lib::Base2:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
-  [1] = Reserved
-}
-
-
-Function 'testSuperCall', reflectable, debuggable
-    parameters [dart:core::int* 'x'] (required: 1)
-    return-type dynamic
-
-Bytecode {
-  Entry                1
-  CheckStack           0
-  Push                 FP[-6]
-  PushConstant         CP#1
-  PushConstant         CP#0
-  PushConstant         CP#2
-  PushInt              5
-  CreateArrayTOS
-  StoreLocal           r0
-  Push                 r0
-  PushInt              0
-  PushConstant         CP#3
-  StoreIndexedTOS
-  Push                 r0
-  PushInt              1
-  Push                 FP[-6]
-  StoreIndexedTOS
-  Push                 r0
-  PushInt              2
-  PushConstant         CP#4
-  StoreIndexedTOS
-  Push                 r0
-  PushInt              3
-  PushConstant         CP#5
-  StoreIndexedTOS
-  Push                 r0
-  PushInt              4
-  PushInt              5
-  StoreIndexedTOS
-  PushTrue
-  DirectCall           CP#6, 4
-  DirectCall           CP#8, 2
-  ReturnTOS
-}
-ConstantPool {
-  [0] = ObjectRef ArgDesc num-args 4, num-type-args 1, names []
-  [1] = ObjectRef 'foo'
-  [2] = ObjectRef < dynamic >
-  [3] = ObjectRef < dart:core::double* >
-  [4] = ObjectRef 'a1'
-  [5] = ObjectRef const 3.14
-  [6] = DirectCall 'dart:core::_InvocationMirror::_allocateInvocationMirror', ArgDesc num-args 4, num-type-args 0, names []
-  [7] = Reserved
-  [8] = DirectCall 'dart:core::Object::noSuchMethod', ArgDesc num-args 2, num-type-args 0, names []
-  [9] = Reserved
-}
-
-
-Function 'testSuperTearOff', reflectable, debuggable
-    parameters [] (required: 0)
-    return-type dynamic
-
-Bytecode {
-  Entry                1
-  CheckStack           0
-  Push                 FP[-5]
-  PushConstant         CP#1
-  PushConstant         CP#0
-  PushConstant         CP#2
-  PushInt              1
-  CreateArrayTOS
-  StoreLocal           r0
-  Push                 r0
-  PushInt              0
-  Push                 FP[-5]
-  StoreIndexedTOS
-  PushTrue
-  DirectCall           CP#3, 4
-  DirectCall           CP#5, 2
-  ReturnTOS
-}
-ConstantPool {
-  [0] = ObjectRef ArgDesc num-args 1, num-type-args 0, names []
-  [1] = ObjectRef 'foo'
-  [2] = ObjectRef < dynamic >
-  [3] = DirectCall 'dart:core::_InvocationMirror::_allocateInvocationMirror', ArgDesc num-args 4, num-type-args 0, names []
-  [4] = Reserved
-  [5] = DirectCall 'dart:core::Object::noSuchMethod', ArgDesc num-args 2, num-type-args 0, names []
-  [6] = Reserved
-}
-
-
-Function 'testSuperGet', reflectable, debuggable
-    parameters [] (required: 0)
-    return-type dynamic
-
-Bytecode {
-  Entry                1
-  CheckStack           0
-  Push                 FP[-5]
-  PushConstant         CP#1
-  PushConstant         CP#0
-  PushConstant         CP#2
-  PushInt              1
-  CreateArrayTOS
-  StoreLocal           r0
-  Push                 r0
-  PushInt              0
-  Push                 FP[-5]
-  StoreIndexedTOS
-  PushTrue
-  DirectCall           CP#3, 4
-  DirectCall           CP#5, 2
-  ReturnTOS
-}
-ConstantPool {
-  [0] = ObjectRef ArgDesc num-args 1, num-type-args 0, names []
-  [1] = ObjectRef 'bar'
-  [2] = ObjectRef < dynamic >
-  [3] = DirectCall 'dart:core::_InvocationMirror::_allocateInvocationMirror', ArgDesc num-args 4, num-type-args 0, names []
-  [4] = Reserved
-  [5] = DirectCall 'dart:core::Object::noSuchMethod', ArgDesc num-args 2, num-type-args 0, names []
-  [6] = Reserved
-}
-
-
-Function 'testSuperCallViaGetter', reflectable, debuggable
-    parameters [] (required: 0)
-    return-type dynamic
-
-Bytecode {
-  Entry                1
-  CheckStack           0
-  PushConstant         CP#0
-  Push                 FP[-5]
-  PushConstant         CP#2
-  PushConstant         CP#1
-  PushConstant         CP#3
-  PushInt              1
-  CreateArrayTOS
-  StoreLocal           r0
-  Push                 r0
-  PushInt              0
-  Push                 FP[-5]
-  StoreIndexedTOS
-  PushTrue
-  DirectCall           CP#4, 4
-  DirectCall           CP#6, 2
-  PushConstant         CP#8
-  DynamicCall          CP#9, 3
-  ReturnTOS
-}
-ConstantPool {
-  [0] = ObjectRef < dart:core::int* >
-  [1] = ObjectRef ArgDesc num-args 1, num-type-args 0, names []
-  [2] = ObjectRef 'bar'
-  [3] = ObjectRef < dynamic >
-  [4] = DirectCall 'dart:core::_InvocationMirror::_allocateInvocationMirror', ArgDesc num-args 4, num-type-args 0, names []
-  [5] = Reserved
-  [6] = DirectCall 'dart:core::Object::noSuchMethod', ArgDesc num-args 2, num-type-args 0, names []
-  [7] = Reserved
-  [8] = ObjectRef 'param'
-  [9] = DynamicCall 'call', ArgDesc num-args 2, num-type-args 1, names []
-  [10] = Reserved
-}
-
-
-Function 'testSuperSet', reflectable, debuggable
-    parameters [] (required: 0)
-    return-type dynamic
-
-Bytecode {
-  Entry                1
-  CheckStack           0
-  Push                 FP[-5]
-  PushConstant         CP#1
-  PushConstant         CP#0
-  PushConstant         CP#2
-  PushInt              2
-  CreateArrayTOS
-  StoreLocal           r0
-  Push                 r0
-  PushInt              0
-  Push                 FP[-5]
-  StoreIndexedTOS
-  Push                 r0
-  PushInt              1
-  PushInt              3
-  StoreIndexedTOS
-  PushTrue
-  DirectCall           CP#3, 4
-  DirectCall           CP#5, 2
-  Drop1
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-  [0] = ObjectRef ArgDesc num-args 2, num-type-args 0, names []
-  [1] = ObjectRef 'bazz'
-  [2] = ObjectRef < dynamic >
-  [3] = DirectCall 'dart:core::_InvocationMirror::_allocateInvocationMirror', ArgDesc num-args 4, num-type-args 0, names []
-  [4] = Reserved
-  [5] = DirectCall 'dart:core::Object::noSuchMethod', ArgDesc num-args 2, num-type-args 0, names []
-  [6] = Reserved
-}
-
-
-}
-]library #lib from "#lib" as #lib {
-
-  class Base1 extends dart.core::Object {
-    synthetic constructor •() → #lib::Base1*
-      : super dart.core::Object::•()
-      ;
-    method foo<T extends dart.core::Object* = dynamic>(#lib::Base1::foo::T* a1, dart.core::int* a2) → void {}
-    get bar() → dynamic
-      return 42;
-    set bazz(dart.core::int* x) → void {}
-    abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
-    abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
-    abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
-    abstract member-signature method _simpleInstanceOfTrue(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfTrue
-    abstract member-signature method _simpleInstanceOfFalse(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfFalse
-    abstract member-signature operator ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
-    abstract member-signature get hashCode() → dart.core::int*; -> dart.core::Object::hashCode
-    abstract member-signature method toString() → dart.core::String*; -> dart.core::Object::toString
-    abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
-    abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
-  }
-  class A extends #lib::Base1 {
-    synthetic constructor •() → #lib::A*
-      : super #lib::Base1::•()
-      ;
-    method testSuperCall(dart.core::int* x) → dynamic
-      return super.{#lib::Base1::foo}<dart.core::String*>("a1", 2);
-    method testSuperTearOff() → dynamic
-      return super.{#lib::Base1::foo};
-    method testSuperGet() → dynamic
-      return super.{#lib::Base1::bar};
-    method testSuperCallViaGetter() → dynamic
-      return [@vm.call-site-attributes.metadata=receiverType:dynamic] super.{#lib::Base1::bar}.call<dart.core::int*>("param");
-    method testSuperSet() → dynamic {
-      super.{#lib::Base1::bazz} = 3;
-    }
-  }
-  abstract class Base2 extends dart.core::Object {
-    synthetic constructor •() → #lib::Base2*
-      : super dart.core::Object::•()
-      ;
-    abstract method foo<T extends dart.core::Object* = dynamic>(dart.core::String* a1, #lib::Base2::foo::T* a2, dart.core::int* a3) → void;
-    abstract get bar() → dynamic;
-    abstract set bazz(dart.core::int* x) → void;
-    abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
-    abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
-    abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
-    abstract member-signature method _simpleInstanceOfTrue(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfTrue
-    abstract member-signature method _simpleInstanceOfFalse(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfFalse
-    abstract member-signature operator ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
-    abstract member-signature get hashCode() → dart.core::int*; -> dart.core::Object::hashCode
-    abstract member-signature method toString() → dart.core::String*; -> dart.core::Object::toString
-    abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
-    abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
-  }
-  abstract class B extends #lib::Base2 {
-    synthetic constructor •() → #lib::B*
-      : super #lib::Base2::•()
-      ;
-    method testSuperCall(dart.core::int* x) → dynamic
-      return super.{#lib::Base2::foo}<dart.core::double*>("a1", 3.14, 5);
-    method testSuperTearOff() → dynamic
-      return super.{#lib::Base2::foo};
-    method testSuperGet() → dynamic
-      return super.{#lib::Base2::bar};
-    method testSuperCallViaGetter() → dynamic
-      return [@vm.call-site-attributes.metadata=receiverType:dynamic] super.{#lib::Base2::bar}.call<dart.core::int*>("param");
-    method testSuperSet() → dynamic {
-      super.{#lib::Base2::bazz} = 3;
-    }
-  }
-  static method main() → dynamic {}
-}
diff --git a/pkg/vm/testcases/bytecode/switch.dart b/pkg/vm/testcases/bytecode/switch.dart
deleted file mode 100644
index da20adb..0000000
--- a/pkg/vm/testcases/bytecode/switch.dart
+++ /dev/null
@@ -1,60 +0,0 @@
-// Copyright (c) 2018, 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.
-
-int foo1(int x) {
-  int y;
-  switch (x) {
-    case 1:
-      y = 11;
-      break;
-    case 2:
-      y = 22;
-      break;
-    case 3:
-      y = 33;
-      break;
-  }
-  return y;
-}
-
-int foo2(int x) {
-  int y;
-  switch (x) {
-    case 1:
-    case 2:
-    case 3:
-      y = 11;
-      break;
-    case 4:
-    case 5:
-    case 6:
-      y = 22;
-      break;
-    default:
-      y = 33;
-  }
-  return y;
-}
-
-int foo3(int x) {
-  int y;
-  switch (x) {
-    case 1:
-    case 2:
-    case 3:
-      y = 11;
-      continue L5;
-    case 4:
-    L5:
-    case 5:
-    case 6:
-      y = 22;
-      return 42;
-    default:
-      y = 33;
-  }
-  return y;
-}
-
-main() {}
diff --git a/pkg/vm/testcases/bytecode/switch.dart.expect b/pkg/vm/testcases/bytecode/switch.dart.expect
deleted file mode 100644
index 555f7a8..0000000
--- a/pkg/vm/testcases/bytecode/switch.dart.expect
+++ /dev/null
@@ -1,279 +0,0 @@
-main = #lib::main;
- [@vm.bytecode=
-BytecodeMetadata {
-Bytecode (version: stable)
-Main library: #lib
-Library '#lib'
-    name '#lib'
-    script '#lib'
-
-Class '', script = '#lib'
-
-
-Function 'foo1', static, reflectable, debuggable
-    parameters [dart:core::int* 'x'] (required: 1)
-    return-type dart:core::int*
-
-Bytecode {
-  Entry                2
-  CheckStack           0
-  PushNull
-  PopLocal             r0
-  Push                 FP[-5]
-  PopLocal             r1
-  PushInt              1
-  Push                 r1
-  InterfaceCall        CP#0, 2
-  JumpIfTrue           L1
-  PushInt              2
-  Push                 r1
-  InterfaceCall        CP#0, 2
-  JumpIfTrue           L2
-  PushInt              3
-  Push                 r1
-  InterfaceCall        CP#0, 2
-  JumpIfTrue           L3
-  Jump                 L4
-L1:
-  PushInt              11
-  PopLocal             r0
-  Jump                 L4
-L2:
-  PushInt              22
-  PopLocal             r0
-  Jump                 L4
-L3:
-  PushInt              33
-  PopLocal             r0
-  Jump                 L4
-L4:
-  Push                 r0
-  ReturnTOS
-}
-ConstantPool {
-  [0] = InterfaceCall 'dart:core::Object::==', ArgDesc num-args 2, num-type-args 0, names []
-  [1] = Reserved
-}
-
-
-Function 'foo2', static, reflectable, debuggable
-    parameters [dart:core::int* 'x'] (required: 1)
-    return-type dart:core::int*
-
-Bytecode {
-  Entry                2
-  CheckStack           0
-  PushNull
-  PopLocal             r0
-  Push                 FP[-5]
-  PopLocal             r1
-  PushInt              1
-  Push                 r1
-  InterfaceCall        CP#0, 2
-  JumpIfTrue           L1
-  PushInt              2
-  Push                 r1
-  InterfaceCall        CP#0, 2
-  JumpIfTrue           L1
-  PushInt              3
-  Push                 r1
-  InterfaceCall        CP#0, 2
-  JumpIfTrue           L1
-  PushInt              4
-  Push                 r1
-  InterfaceCall        CP#0, 2
-  JumpIfTrue           L2
-  PushInt              5
-  Push                 r1
-  InterfaceCall        CP#0, 2
-  JumpIfTrue           L2
-  PushInt              6
-  Push                 r1
-  InterfaceCall        CP#0, 2
-  JumpIfTrue           L2
-  Jump                 L3
-L1:
-  PushInt              11
-  PopLocal             r0
-  Jump                 L4
-L2:
-  PushInt              22
-  PopLocal             r0
-  Jump                 L4
-L3:
-  PushInt              33
-  PopLocal             r0
-L4:
-  Push                 r0
-  ReturnTOS
-}
-ConstantPool {
-  [0] = InterfaceCall 'dart:core::Object::==', ArgDesc num-args 2, num-type-args 0, names []
-  [1] = Reserved
-}
-
-
-Function 'foo3', static, reflectable, debuggable
-    parameters [dart:core::int* 'x'] (required: 1)
-    return-type dart:core::int*
-
-Bytecode {
-  Entry                2
-  CheckStack           0
-  PushNull
-  PopLocal             r0
-  Push                 FP[-5]
-  PopLocal             r1
-  PushInt              1
-  Push                 r1
-  InterfaceCall        CP#0, 2
-  JumpIfTrue           L1
-  PushInt              2
-  Push                 r1
-  InterfaceCall        CP#0, 2
-  JumpIfTrue           L1
-  PushInt              3
-  Push                 r1
-  InterfaceCall        CP#0, 2
-  JumpIfTrue           L1
-  PushInt              4
-  Push                 r1
-  InterfaceCall        CP#0, 2
-  JumpIfTrue           L2
-  PushInt              5
-  Push                 r1
-  InterfaceCall        CP#0, 2
-  JumpIfTrue           L2
-  PushInt              6
-  Push                 r1
-  InterfaceCall        CP#0, 2
-  JumpIfTrue           L2
-  Jump                 L3
-L1:
-  PushInt              11
-  PopLocal             r0
-  Jump                 L2
-L2:
-  PushInt              22
-  PopLocal             r0
-  PushInt              42
-  ReturnTOS
-L3:
-  PushInt              33
-  PopLocal             r0
-  Push                 r0
-  ReturnTOS
-}
-ConstantPool {
-  [0] = InterfaceCall 'dart:core::Object::==', ArgDesc num-args 2, num-type-args 0, names []
-  [1] = Reserved
-}
-
-
-Function 'main', static, reflectable, debuggable
-    parameters [] (required: 0)
-    return-type dynamic
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-}
-
-
-}
-]library #lib from "#lib" as #lib {
-
-  static method foo1(dart.core::int* x) → dart.core::int* {
-    dart.core::int* y;
-    #L1:
-    switch(x) {
-      #L2:
-      case #C1:
-        {
-          y = 11;
-          break #L1;
-        }
-      #L3:
-      case #C2:
-        {
-          y = 22;
-          break #L1;
-        }
-      #L4:
-      case #C3:
-        {
-          y = 33;
-          break #L1;
-        }
-    }
-    return y;
-  }
-  static method foo2(dart.core::int* x) → dart.core::int* {
-    dart.core::int* y;
-    #L5:
-    switch(x) {
-      #L6:
-      case #C1:
-      case #C2:
-      case #C3:
-        {
-          y = 11;
-          break #L5;
-        }
-      #L7:
-      case #C4:
-      case #C5:
-      case #C6:
-        {
-          y = 22;
-          break #L5;
-        }
-      #L8:
-      default:
-        {
-          y = 33;
-        }
-    }
-    return y;
-  }
-  static method foo3(dart.core::int* x) → dart.core::int* {
-    dart.core::int* y;
-    switch(x) {
-      #L9:
-      case #C1:
-      case #C2:
-      case #C3:
-        {
-          y = 11;
-          continue #L10;
-        }
-      #L10:
-      case #C4:
-      case #C5:
-      case #C6:
-        {
-          y = 22;
-          return 42;
-        }
-      #L11:
-      default:
-        {
-          y = 33;
-        }
-    }
-    return y;
-  }
-  static method main() → dynamic {}
-}
-constants  {
-  #C1 = 1
-  #C2 = 2
-  #C3 = 3
-  #C4 = 4
-  #C5 = 5
-  #C6 = 6
-}
diff --git a/pkg/vm/testcases/bytecode/try_blocks.dart b/pkg/vm/testcases/bytecode/try_blocks.dart
deleted file mode 100644
index d07c18f..0000000
--- a/pkg/vm/testcases/bytecode/try_blocks.dart
+++ /dev/null
@@ -1,153 +0,0 @@
-// Copyright (c) 2018, 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.
-
-testTryCatch1() {
-  try {
-    print('danger!');
-  } catch (e) {
-    print('caught $e');
-  }
-}
-
-testTryCatch2() {
-  try {
-    print('danger!');
-  } on TypeError {
-    print('caught type error');
-  } on AssertionError catch (e) {
-    print('caught assertion error $e');
-  } on Error catch (e, st) {
-    print('caught error $e $st');
-  } catch (e, st) {
-    print('caught something $e $st');
-  }
-}
-
-testTryCatch3() {
-  int x = 1;
-  try {
-    int y = 2;
-    void foo() {
-      try {
-        print('danger foo');
-      } catch (e) {
-        print(x);
-        y = 3;
-      }
-    }
-
-    foo();
-    print(y);
-  } catch (e, st) {
-    print('caught $e $st');
-
-    void bar() {
-      try {
-        print('danger bar');
-      } on Error catch (e) {
-        print('error $e, captured stack trace: $st');
-      }
-    }
-
-    return bar;
-  }
-}
-
-testRethrow(bool cond) {
-  try {
-    try {
-      print('try 1 > try 2');
-    } catch (e) {
-      try {
-        print('try 1 > catch 2 > try 3');
-        if (cond) {
-          rethrow;
-        }
-      } catch (e) {
-        print('try 1 > catch 2 > catch 3');
-      }
-    }
-  } catch (e, st) {
-    print('catch 1');
-    print(st);
-  }
-}
-
-testTryFinally1() {
-  for (int i = 0; i < 10; i++) {
-    try {
-      if (i > 5) {
-        break;
-      }
-    } finally {
-      print(i);
-    }
-  }
-}
-
-testTryFinally2(int x) {
-  switch (x) {
-    case 1:
-      try {
-        print('before try 1');
-        int y = 3;
-        try {
-          print('try');
-          void foo() {
-            print(x);
-            print(y);
-          }
-
-          foo();
-          continue L;
-        } finally {
-          print('finally 1');
-        }
-        print('after try 1');
-      } finally {
-        print('finally 2');
-      }
-      break;
-    L:
-    case 2:
-      print('case 2');
-      break;
-  }
-}
-
-testTryFinally3() {
-  int x = 11;
-  var y;
-  try {
-    y = () {
-      print(x);
-      try {
-        print('try 1');
-        return 42;
-      } finally {
-        try {
-          print('try 2');
-          return 43;
-        } finally {
-          print(x);
-        }
-      }
-    };
-  } finally {
-    print(x);
-    y();
-  }
-}
-
-testTryCatchFinally() {
-  try {
-    print('try');
-  } catch (e) {
-    print('catch');
-  } finally {
-    print('finally');
-  }
-}
-
-main() {}
diff --git a/pkg/vm/testcases/bytecode/try_blocks.dart.expect b/pkg/vm/testcases/bytecode/try_blocks.dart.expect
deleted file mode 100644
index 8ce1cbf..0000000
--- a/pkg/vm/testcases/bytecode/try_blocks.dart.expect
+++ /dev/null
@@ -1,1162 +0,0 @@
-main = #lib::main;
- [@vm.bytecode=
-BytecodeMetadata {
-Bytecode (version: stable)
-Main library: #lib
-Library '#lib'
-    name '#lib'
-    script '#lib'
-
-Class '', script = '#lib'
-
-
-Function 'testTryCatch1', static, reflectable, debuggable
-    parameters [] (required: 0)
-    return-type dynamic
-
-Bytecode {
-  Entry                4
-  CheckStack           0
-Try #0 start:
-  PushConstant         CP#0
-  DirectCall           CP#1, 1
-  Drop1
-  Jump                 L1
-Try #0 end:
-Try #0 handler:
-  SetFrame             4
-  MoveSpecial          exception, r0
-  MoveSpecial          stackTrace, r1
-  Push                 r0
-  PopLocal             r2
-  PushNull
-  PushInt              2
-  CreateArrayTOS
-  StoreLocal           r3
-  Push                 r3
-  PushInt              0
-  PushConstant         CP#4
-  StoreIndexedTOS
-  Push                 r3
-  PushInt              1
-  Push                 r2
-  StoreIndexedTOS
-  DirectCall           CP#5, 1
-  DirectCall           CP#1, 1
-  Drop1
-  Jump                 L1
-L1:
-  PushNull
-  ReturnTOS
-}
-ExceptionsTable {
-  try-index 0, outer -1, start 4, end 14, handler 14, types [CP#3]
-}
-ConstantPool {
-  [0] = ObjectRef 'danger!'
-  [1] = DirectCall 'dart:core::print', ArgDesc num-args 1, num-type-args 0, names []
-  [2] = Reserved
-  [3] = Type dynamic
-  [4] = ObjectRef 'caught '
-  [5] = DirectCall 'dart:core::_StringBase::_interpolate', ArgDesc num-args 1, num-type-args 0, names []
-  [6] = Reserved
-}
-
-
-Function 'testTryCatch2', static, reflectable, debuggable
-    parameters [] (required: 0)
-    return-type dynamic
-
-Bytecode {
-  Entry                5
-  CheckStack           0
-Try #0 start:
-  PushConstant         CP#0
-  DirectCall           CP#1, 1
-  Drop1
-  Jump                 L1
-Try #0 end:
-Try #0 handler:
-  SetFrame             5
-  MoveSpecial          exception, r0
-  MoveSpecial          stackTrace, r1
-  Push                 r0
-  PushConstant         CP#3
-  InterfaceCall        CP#4, 2
-  JumpIfFalse          L2
-  PushConstant         CP#6
-  DirectCall           CP#1, 1
-  Drop1
-  Jump                 L1
-L2:
-  Push                 r0
-  PushConstant         CP#7
-  InterfaceCall        CP#4, 2
-  JumpIfFalse          L3
-  Push                 r0
-  PopLocal             r2
-  PushNull
-  PushInt              2
-  CreateArrayTOS
-  StoreLocal           r3
-  Push                 r3
-  PushInt              0
-  PushConstant         CP#8
-  StoreIndexedTOS
-  Push                 r3
-  PushInt              1
-  Push                 r2
-  StoreIndexedTOS
-  DirectCall           CP#9, 1
-  DirectCall           CP#1, 1
-  Drop1
-  Jump                 L1
-L3:
-  Push                 r0
-  PushConstant         CP#11
-  InterfaceCall        CP#4, 2
-  JumpIfFalse          L4
-  Push                 r0
-  PopLocal             r2
-  Push                 r1
-  PopLocal             r3
-  PushNull
-  PushInt              4
-  CreateArrayTOS
-  StoreLocal           r4
-  Push                 r4
-  PushInt              0
-  PushConstant         CP#12
-  StoreIndexedTOS
-  Push                 r4
-  PushInt              1
-  Push                 r2
-  StoreIndexedTOS
-  Push                 r4
-  PushInt              2
-  PushConstant         CP#13
-  StoreIndexedTOS
-  Push                 r4
-  PushInt              3
-  Push                 r3
-  StoreIndexedTOS
-  DirectCall           CP#9, 1
-  DirectCall           CP#1, 1
-  Drop1
-  Jump                 L1
-L4:
-  Push                 r0
-  PopLocal             r2
-  Push                 r1
-  PopLocal             r3
-  PushNull
-  PushInt              4
-  CreateArrayTOS
-  StoreLocal           r4
-  Push                 r4
-  PushInt              0
-  PushConstant         CP#15
-  StoreIndexedTOS
-  Push                 r4
-  PushInt              1
-  Push                 r2
-  StoreIndexedTOS
-  Push                 r4
-  PushInt              2
-  PushConstant         CP#13
-  StoreIndexedTOS
-  Push                 r4
-  PushInt              3
-  Push                 r3
-  StoreIndexedTOS
-  DirectCall           CP#9, 1
-  DirectCall           CP#1, 1
-  Drop1
-  Jump                 L1
-L1:
-  PushNull
-  ReturnTOS
-}
-ExceptionsTable {
-  try-index 0, outer -1, start 4, end 14, handler 14, needs-stack-trace, types [CP#3, CP#7, CP#11, CP#14]
-}
-ConstantPool {
-  [0] = ObjectRef 'danger!'
-  [1] = DirectCall 'dart:core::print', ArgDesc num-args 1, num-type-args 0, names []
-  [2] = Reserved
-  [3] = Type dart:core::TypeError*
-  [4] = InterfaceCall 'dart:core::Object::_simpleInstanceOf', ArgDesc num-args 2, num-type-args 0, names []
-  [5] = Reserved
-  [6] = ObjectRef 'caught type error'
-  [7] = Type dart:core::AssertionError*
-  [8] = ObjectRef 'caught assertion error '
-  [9] = DirectCall 'dart:core::_StringBase::_interpolate', ArgDesc num-args 1, num-type-args 0, names []
-  [10] = Reserved
-  [11] = Type dart:core::Error*
-  [12] = ObjectRef 'caught error '
-  [13] = ObjectRef ' '
-  [14] = Type dynamic
-  [15] = ObjectRef 'caught something '
-}
-
-
-Function 'testTryCatch3', static, reflectable, debuggable
-    parameters [] (required: 0)
-    return-type dynamic
-
-Bytecode {
-  Entry                7
-  CheckStack           0
-  AllocateContext      0, 3
-  PopLocal             r0
-  Push                 r0
-  PushInt              1
-  StoreContextVar      0, 0
-  Push                 r0
-  PopLocal             r2
-Try #0 start:
-  Push                 r0
-  PushInt              2
-  StoreContextVar      0, 1
-  AllocateClosure      CP#0
-  StoreLocal           r5
-  Push                 r5
-  PushNull
-  StoreFieldTOS        CP#8
-  Push                 r5
-  PushNull
-  StoreFieldTOS        CP#10
-  Push                 r5
-  PushConstant         CP#0
-  StoreFieldTOS        CP#12
-  Push                 r5
-  Push                 r0
-  StoreFieldTOS        CP#1
-  PopLocal             r4
-  Push                 r4
-  StoreLocal           r5
-  Push                 r5
-  UncheckedClosureCall CP#14, 1
-  Drop1
-  Push                 r0
-  LoadContextVar       0, 1
-  DirectCall           CP#4, 1
-  Drop1
-  Jump                 L1
-Try #0 end:
-Try #0 handler:
-  SetFrame             7
-  Push                 r2
-  PopLocal             r0
-  MoveSpecial          exception, r2
-  MoveSpecial          stackTrace, r3
-  Push                 r2
-  PopLocal             r4
-  Push                 r0
-  Push                 r3
-  StoreContextVar      0, 2
-  PushNull
-  PushInt              4
-  CreateArrayTOS
-  StoreLocal           r5
-  Push                 r5
-  PushInt              0
-  PushConstant         CP#15
-  StoreIndexedTOS
-  Push                 r5
-  PushInt              1
-  Push                 r4
-  StoreIndexedTOS
-  Push                 r5
-  PushInt              2
-  PushConstant         CP#16
-  StoreIndexedTOS
-  Push                 r5
-  PushInt              3
-  Push                 r0
-  LoadContextVar       0, 2
-  StoreIndexedTOS
-  DirectCall           CP#17, 1
-  DirectCall           CP#4, 1
-  Drop1
-  AllocateClosure      CP#19
-  StoreLocal           r5
-  Push                 r5
-  PushNull
-  StoreFieldTOS        CP#8
-  Push                 r5
-  PushNull
-  StoreFieldTOS        CP#10
-  Push                 r5
-  PushConstant         CP#19
-  StoreFieldTOS        CP#12
-  Push                 r5
-  Push                 r0
-  StoreFieldTOS        CP#1
-  PopLocal             r6
-  Push                 r6
-  ReturnTOS
-L1:
-  Push                 r0
-  LoadContextParent
-  PopLocal             r0
-  PushNull
-  ReturnTOS
-}
-ExceptionsTable {
-  try-index 0, outer -1, start 20, end 78, handler 78, needs-stack-trace, types [CP#6]
-}
-ConstantPool {
-  [0] = ClosureFunction 0
-  [1] = InstanceField dart:core::_Closure::_context (field)
-  [2] = Reserved
-  [3] = ObjectRef 'danger foo'
-  [4] = DirectCall 'dart:core::print', ArgDesc num-args 1, num-type-args 0, names []
-  [5] = Reserved
-  [6] = Type dynamic
-  [7] = EndClosureFunctionScope
-  [8] = InstanceField dart:core::_Closure::_instantiator_type_arguments (field)
-  [9] = Reserved
-  [10] = InstanceField dart:core::_Closure::_function_type_arguments (field)
-  [11] = Reserved
-  [12] = InstanceField dart:core::_Closure::_function (field)
-  [13] = Reserved
-  [14] = ObjectRef ArgDesc num-args 1, num-type-args 0, names []
-  [15] = ObjectRef 'caught '
-  [16] = ObjectRef ' '
-  [17] = DirectCall 'dart:core::_StringBase::_interpolate', ArgDesc num-args 1, num-type-args 0, names []
-  [18] = Reserved
-  [19] = ClosureFunction 1
-  [20] = ObjectRef 'danger bar'
-  [21] = Type dart:core::Error*
-  [22] = InterfaceCall 'dart:core::Object::_simpleInstanceOf', ArgDesc num-args 2, num-type-args 0, names []
-  [23] = Reserved
-  [24] = ObjectRef 'error '
-  [25] = ObjectRef ', captured stack trace: '
-  [26] = EndClosureFunctionScope
-}
-Closure #lib::testTryCatch3::'foo' () -> void
-ClosureCode {
-  Entry                6
-  Push                 FP[-5]
-  LoadFieldTOS         CP#1
-  PopLocal             r0
-  CheckStack           0
-  Push                 r0
-  PopLocal             r2
-Try #0 start:
-  PushConstant         CP#3
-  DirectCall           CP#4, 1
-  Drop1
-  Jump                 L1
-Try #0 end:
-Try #0 handler:
-  SetFrame             6
-  Push                 r2
-  PopLocal             r0
-  MoveSpecial          exception, r2
-  MoveSpecial          stackTrace, r3
-  Push                 r2
-  PopLocal             r4
-  Push                 r0
-  LoadContextVar       0, 0
-  DirectCall           CP#4, 1
-  Drop1
-  Push                 r0
-  PushInt              3
-  StoreContextVar      0, 1
-  Jump                 L1
-L1:
-  PushNull
-  ReturnTOS
-}
-
-Closure #lib::testTryCatch3::'bar' () -> void
-ClosureCode {
-  Entry                6
-  Push                 FP[-5]
-  LoadFieldTOS         CP#1
-  PopLocal             r0
-  CheckStack           0
-  Push                 r0
-  PopLocal             r2
-Try #0 start:
-  PushConstant         CP#20
-  DirectCall           CP#4, 1
-  Drop1
-  Jump                 L1
-Try #0 end:
-Try #0 handler:
-  SetFrame             6
-  Push                 r2
-  PopLocal             r0
-  MoveSpecial          exception, r2
-  MoveSpecial          stackTrace, r3
-  Push                 r2
-  PushConstant         CP#21
-  InterfaceCall        CP#22, 2
-  JumpIfFalse          L2
-  Push                 r2
-  PopLocal             r4
-  PushNull
-  PushInt              4
-  CreateArrayTOS
-  StoreLocal           r5
-  Push                 r5
-  PushInt              0
-  PushConstant         CP#24
-  StoreIndexedTOS
-  Push                 r5
-  PushInt              1
-  Push                 r4
-  StoreIndexedTOS
-  Push                 r5
-  PushInt              2
-  PushConstant         CP#25
-  StoreIndexedTOS
-  Push                 r5
-  PushInt              3
-  Push                 r0
-  LoadContextVar       0, 2
-  StoreIndexedTOS
-  DirectCall           CP#17, 1
-  DirectCall           CP#4, 1
-  Drop1
-  Jump                 L1
-L2:
-  Push                 r2
-  Push                 r3
-  Throw                1
-L1:
-  PushNull
-  ReturnTOS
-}
-
-
-Function 'testRethrow', static, reflectable, debuggable
-    parameters [dart:core::bool* 'cond'] (required: 1)
-    return-type dynamic
-
-Bytecode {
-  Entry                8
-  CheckStack           0
-Try #0 start:
-Try #1 start:
-  PushConstant         CP#0
-  DirectCall           CP#1, 1
-  Drop1
-  Jump                 L1
-Try #1 end:
-Try #1 handler:
-  SetFrame             8
-  MoveSpecial          exception, r2
-  MoveSpecial          stackTrace, r3
-  Push                 r2
-  PopLocal             r4
-Try #2 start:
-  PushConstant         CP#4
-  DirectCall           CP#1, 1
-  Drop1
-  Push                 FP[-5]
-  AssertBoolean        0
-  JumpIfFalse          L2
-  Push                 r2
-  Push                 r3
-  Throw                1
-L2:
-  Jump                 L3
-Try #2 end:
-Try #2 handler:
-  SetFrame             8
-  MoveSpecial          exception, r5
-  MoveSpecial          stackTrace, r6
-  Push                 r5
-  PopLocal             r7
-  PushConstant         CP#5
-  DirectCall           CP#1, 1
-  Drop1
-  Jump                 L3
-L3:
-  Jump                 L1
-L1:
-  Jump                 L4
-Try #0 end:
-Try #0 handler:
-  SetFrame             8
-  MoveSpecial          exception, r0
-  MoveSpecial          stackTrace, r1
-  Push                 r0
-  PopLocal             r2
-  Push                 r1
-  PopLocal             r3
-  PushConstant         CP#6
-  DirectCall           CP#1, 1
-  Drop1
-  Push                 r3
-  DirectCall           CP#1, 1
-  Drop1
-  Jump                 L4
-L4:
-  PushNull
-  ReturnTOS
-}
-ExceptionsTable {
-  try-index 0, outer -1, start 4, end 80, handler 80, needs-stack-trace, types [CP#3]
-  try-index 1, outer 0, start 4, end 14, handler 14, needs-stack-trace, types [CP#3]
-  try-index 2, outer 0, start 26, end 50, handler 50, types [CP#3]
-}
-ConstantPool {
-  [0] = ObjectRef 'try 1 > try 2'
-  [1] = DirectCall 'dart:core::print', ArgDesc num-args 1, num-type-args 0, names []
-  [2] = Reserved
-  [3] = Type dynamic
-  [4] = ObjectRef 'try 1 > catch 2 > try 3'
-  [5] = ObjectRef 'try 1 > catch 2 > catch 3'
-  [6] = ObjectRef 'catch 1'
-}
-
-
-Function 'testTryFinally1', static, reflectable, debuggable
-    parameters [] (required: 0)
-    return-type dynamic
-
-Bytecode {
-  Entry                3
-  CheckStack           0
-  PushInt              0
-  PopLocal             r0
-L5:
-  CheckStack           1
-  Push                 r0
-  PushInt              10
-  CompareIntLt
-  JumpIfFalse          L1
-Try #0 start:
-  Push                 r0
-  PushInt              5
-  CompareIntGt
-  JumpIfFalse          L2
-  Jump                 L3
-L2:
-  Jump                 L4
-Try #0 end:
-Try #0 handler:
-  SetFrame             3
-  MoveSpecial          exception, r1
-  MoveSpecial          stackTrace, r2
-  Push                 r0
-  DirectCall           CP#1, 1
-  Drop1
-  Push                 r1
-  Push                 r2
-  Throw                1
-L3:
-  Push                 r0
-  DirectCall           CP#1, 1
-  Drop1
-  Jump                 L1
-L4:
-  Push                 r0
-  DirectCall           CP#1, 1
-  Drop1
-  Push                 r0
-  PushInt              1
-  AddInt
-  StoreLocal           r0
-  Drop1
-  Jump                 L5
-L1:
-  PushNull
-  ReturnTOS
-}
-ExceptionsTable {
-  try-index 0, outer -1, start 19, end 36, handler 36, needs-stack-trace, synthetic, types [CP#0]
-}
-ConstantPool {
-  [0] = Type dynamic
-  [1] = DirectCall 'dart:core::print', ArgDesc num-args 1, num-type-args 0, names []
-  [2] = Reserved
-}
-
-
-Function 'testTryFinally2', static, reflectable, debuggable
-    parameters [dart:core::int* 'x'] (required: 1)
-    return-type dynamic
-
-Bytecode {
-  Entry                9
-  CheckStack           0
-  AllocateContext      0, 2
-  PopLocal             r0
-  Push                 r0
-  Push                 FP[-5]
-  StoreContextVar      0, 0
-  Push                 r0
-  LoadContextVar       0, 0
-  PopLocal             r2
-  PushInt              1
-  Push                 r2
-  InterfaceCall        CP#0, 2
-  JumpIfTrue           L1
-  PushInt              2
-  Push                 r2
-  InterfaceCall        CP#0, 2
-  JumpIfTrue           L2
-  Jump                 L3
-L1:
-  Push                 r0
-  PopLocal             r3
-Try #0 start:
-  PushConstant         CP#2
-  DirectCall           CP#3, 1
-  Drop1
-  Push                 r0
-  PushInt              3
-  StoreContextVar      0, 1
-  Push                 r0
-  PopLocal             r5
-Try #1 start:
-  PushConstant         CP#5
-  DirectCall           CP#3, 1
-  Drop1
-  AllocateClosure      CP#6
-  StoreLocal           r8
-  Push                 r8
-  PushNull
-  StoreFieldTOS        CP#10
-  Push                 r8
-  PushNull
-  StoreFieldTOS        CP#12
-  Push                 r8
-  PushConstant         CP#6
-  StoreFieldTOS        CP#14
-  Push                 r8
-  Push                 r0
-  StoreFieldTOS        CP#7
-  PopLocal             r7
-  Push                 r7
-  StoreLocal           r8
-  Push                 r8
-  UncheckedClosureCall CP#16, 1
-  Drop1
-  Jump                 L4
-Try #1 end:
-Try #1 handler:
-  SetFrame             9
-  Push                 r5
-  PopLocal             r0
-  MoveSpecial          exception, r5
-  MoveSpecial          stackTrace, r6
-  PushConstant         CP#18
-  DirectCall           CP#3, 1
-  Drop1
-  Push                 r5
-  Push                 r6
-  Throw                1
-L4:
-  Push                 r5
-  PopLocal             r0
-  PushConstant         CP#18
-  DirectCall           CP#3, 1
-  Drop1
-  Jump                 L5
-Try #0 end:
-Try #0 handler:
-  SetFrame             9
-  Push                 r3
-  PopLocal             r0
-  MoveSpecial          exception, r3
-  MoveSpecial          stackTrace, r4
-  PushConstant         CP#20
-  DirectCall           CP#3, 1
-  Drop1
-  Push                 r3
-  Push                 r4
-  Throw                1
-L5:
-  Push                 r3
-  PopLocal             r0
-  PushConstant         CP#20
-  DirectCall           CP#3, 1
-  Drop1
-  Jump                 L2
-L2:
-  PushConstant         CP#21
-  DirectCall           CP#3, 1
-  Drop1
-  Jump                 L3
-L3:
-  PushNull
-  ReturnTOS
-}
-ExceptionsTable {
-  try-index 0, outer -1, start 53, end 156, handler 156, needs-stack-trace, synthetic, types [CP#17]
-  try-index 1, outer 0, start 70, end 118, handler 118, needs-stack-trace, synthetic, types [CP#17]
-}
-ConstantPool {
-  [0] = InterfaceCall 'dart:core::Object::==', ArgDesc num-args 2, num-type-args 0, names []
-  [1] = Reserved
-  [2] = ObjectRef 'before try 1'
-  [3] = DirectCall 'dart:core::print', ArgDesc num-args 1, num-type-args 0, names []
-  [4] = Reserved
-  [5] = ObjectRef 'try'
-  [6] = ClosureFunction 0
-  [7] = InstanceField dart:core::_Closure::_context (field)
-  [8] = Reserved
-  [9] = EndClosureFunctionScope
-  [10] = InstanceField dart:core::_Closure::_instantiator_type_arguments (field)
-  [11] = Reserved
-  [12] = InstanceField dart:core::_Closure::_function_type_arguments (field)
-  [13] = Reserved
-  [14] = InstanceField dart:core::_Closure::_function (field)
-  [15] = Reserved
-  [16] = ObjectRef ArgDesc num-args 1, num-type-args 0, names []
-  [17] = Type dynamic
-  [18] = ObjectRef 'finally 1'
-  [19] = ObjectRef 'after try 1'
-  [20] = ObjectRef 'finally 2'
-  [21] = ObjectRef 'case 2'
-}
-Closure #lib::testTryFinally2::'foo' () -> void
-ClosureCode {
-  Entry                2
-  Push                 FP[-5]
-  LoadFieldTOS         CP#7
-  PopLocal             r0
-  CheckStack           0
-  Push                 r0
-  LoadContextVar       0, 0
-  DirectCall           CP#3, 1
-  Drop1
-  Push                 r0
-  LoadContextVar       0, 1
-  DirectCall           CP#3, 1
-  Drop1
-  PushNull
-  ReturnTOS
-}
-
-
-Function 'testTryFinally3', static, reflectable, debuggable
-    parameters [] (required: 0)
-    return-type dynamic
-
-Bytecode {
-  Entry                6
-  CheckStack           0
-  AllocateContext      0, 1
-  PopLocal             r0
-  Push                 r0
-  PushInt              11
-  StoreContextVar      0, 0
-  PushNull
-  PopLocal             r2
-  Push                 r0
-  PopLocal             r3
-Try #0 start:
-  AllocateClosure      CP#0
-  StoreLocal           r5
-  Push                 r5
-  PushNull
-  StoreFieldTOS        CP#9
-  Push                 r5
-  PushNull
-  StoreFieldTOS        CP#11
-  Push                 r5
-  PushConstant         CP#0
-  StoreFieldTOS        CP#13
-  Push                 r5
-  Push                 r0
-  StoreFieldTOS        CP#1
-  PopLocal             r2
-  Jump                 L1
-Try #0 end:
-Try #0 handler:
-  SetFrame             6
-  Push                 r3
-  PopLocal             r0
-  MoveSpecial          exception, r3
-  MoveSpecial          stackTrace, r4
-  Push                 r0
-  LoadContextVar       0, 0
-  DirectCall           CP#3, 1
-  Drop1
-  Push                 r2
-  DynamicCall          CP#15, 1
-  Drop1
-  Push                 r3
-  Push                 r4
-  Throw                1
-L1:
-  Push                 r3
-  PopLocal             r0
-  Push                 r0
-  LoadContextVar       0, 0
-  DirectCall           CP#3, 1
-  Drop1
-  Push                 r2
-  DynamicCall          CP#15, 1
-  Drop1
-  Push                 r0
-  LoadContextParent
-  PopLocal             r0
-  PushNull
-  ReturnTOS
-}
-ExceptionsTable {
-  try-index 0, outer -1, start 23, end 55, handler 55, needs-stack-trace, synthetic, types [CP#6]
-}
-ConstantPool {
-  [0] = ClosureFunction 0
-  [1] = InstanceField dart:core::_Closure::_context (field)
-  [2] = Reserved
-  [3] = DirectCall 'dart:core::print', ArgDesc num-args 1, num-type-args 0, names []
-  [4] = Reserved
-  [5] = ObjectRef 'try 1'
-  [6] = Type dynamic
-  [7] = ObjectRef 'try 2'
-  [8] = EndClosureFunctionScope
-  [9] = InstanceField dart:core::_Closure::_instantiator_type_arguments (field)
-  [10] = Reserved
-  [11] = InstanceField dart:core::_Closure::_function_type_arguments (field)
-  [12] = Reserved
-  [13] = InstanceField dart:core::_Closure::_function (field)
-  [14] = Reserved
-  [15] = DynamicCall 'call', ArgDesc num-args 1, num-type-args 0, names []
-  [16] = Reserved
-}
-Closure #lib::testTryFinally3::'<anonymous closure>' () -> dart:core::int*
-ClosureCode {
-  Entry                6
-  Push                 FP[-5]
-  LoadFieldTOS         CP#1
-  PopLocal             r0
-  CheckStack           0
-  Push                 r0
-  LoadContextVar       0, 0
-  DirectCall           CP#3, 1
-  Drop1
-  Push                 r0
-  PopLocal             r2
-Try #0 start:
-  PushConstant         CP#5
-  DirectCall           CP#3, 1
-  Drop1
-  Jump                 L1
-Try #0 end:
-Try #0 handler:
-  SetFrame             6
-  Push                 r2
-  PopLocal             r0
-  MoveSpecial          exception, r2
-  MoveSpecial          stackTrace, r3
-  Push                 r0
-  PopLocal             r4
-Try #1 start:
-  PushConstant         CP#7
-  DirectCall           CP#3, 1
-  Drop1
-  Jump                 L2
-Try #1 end:
-Try #1 handler:
-  SetFrame             6
-  Push                 r4
-  PopLocal             r0
-  MoveSpecial          exception, r4
-  MoveSpecial          stackTrace, r5
-  Push                 r0
-  LoadContextVar       0, 0
-  DirectCall           CP#3, 1
-  Drop1
-  Push                 r4
-  Push                 r5
-  Throw                1
-L2:
-  Push                 r4
-  PopLocal             r0
-  Push                 r0
-  LoadContextVar       0, 0
-  DirectCall           CP#3, 1
-  Drop1
-  PushInt              43
-  ReturnTOS
-L1:
-  Push                 r2
-  PopLocal             r0
-  Push                 r0
-  PopLocal             r4
-Try #2 start:
-  PushConstant         CP#7
-  DirectCall           CP#3, 1
-  Drop1
-  Jump                 L3
-Try #2 end:
-Try #2 handler:
-  SetFrame             6
-  Push                 r4
-  PopLocal             r0
-  MoveSpecial          exception, r4
-  MoveSpecial          stackTrace, r5
-  Push                 r0
-  LoadContextVar       0, 0
-  DirectCall           CP#3, 1
-  Drop1
-  Push                 r4
-  Push                 r5
-  Throw                1
-L3:
-  Push                 r4
-  PopLocal             r0
-  Push                 r0
-  LoadContextVar       0, 0
-  DirectCall           CP#3, 1
-  Drop1
-  PushInt              43
-  ReturnTOS
-}
-
-
-Function 'testTryCatchFinally', static, reflectable, debuggable
-    parameters [] (required: 0)
-    return-type dynamic
-
-Bytecode {
-  Entry                5
-  CheckStack           0
-Try #0 start:
-Try #1 start:
-  PushConstant         CP#0
-  DirectCall           CP#1, 1
-  Drop1
-  Jump                 L1
-Try #1 end:
-Try #1 handler:
-  SetFrame             5
-  MoveSpecial          exception, r2
-  MoveSpecial          stackTrace, r3
-  Push                 r2
-  PopLocal             r4
-  PushConstant         CP#4
-  DirectCall           CP#1, 1
-  Drop1
-  Jump                 L1
-L1:
-  Jump                 L2
-Try #0 end:
-Try #0 handler:
-  SetFrame             5
-  MoveSpecial          exception, r0
-  MoveSpecial          stackTrace, r1
-  PushConstant         CP#5
-  DirectCall           CP#1, 1
-  Drop1
-  Push                 r0
-  Push                 r1
-  Throw                1
-L2:
-  PushConstant         CP#5
-  DirectCall           CP#1, 1
-  Drop1
-  PushNull
-  ReturnTOS
-}
-ExceptionsTable {
-  try-index 0, outer -1, start 4, end 40, handler 40, needs-stack-trace, synthetic, types [CP#3]
-  try-index 1, outer 0, start 4, end 14, handler 14, types [CP#3]
-}
-ConstantPool {
-  [0] = ObjectRef 'try'
-  [1] = DirectCall 'dart:core::print', ArgDesc num-args 1, num-type-args 0, names []
-  [2] = Reserved
-  [3] = Type dynamic
-  [4] = ObjectRef 'catch'
-  [5] = ObjectRef 'finally'
-}
-
-
-Function 'main', static, reflectable, debuggable
-    parameters [] (required: 0)
-    return-type dynamic
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-}
-
-
-}
-]library #lib from "#lib" as #lib {
-
-  static method testTryCatch1() → dynamic {
-    try {
-      dart.core::print("danger!");
-    }
-    on dynamic catch(final dynamic e) {
-      dart.core::print("caught ${e}");
-    }
-  }
-  static method testTryCatch2() → dynamic {
-    try {
-      dart.core::print("danger!");
-    }
-    on dart.core::TypeError* catch(no-exception-var) {
-      dart.core::print("caught type error");
-    }
-    on dart.core::AssertionError* catch(final dart.core::AssertionError* e) {
-      dart.core::print("caught assertion error ${e}");
-    }
-    on dart.core::Error* catch(final dart.core::Error* e, final dart.core::StackTrace* st) {
-      dart.core::print("caught error ${e} ${st}");
-    }
-    on dynamic catch(final dynamic e, final dart.core::StackTrace* st) {
-      dart.core::print("caught something ${e} ${st}");
-    }
-  }
-  static method testTryCatch3() → dynamic {
-    dart.core::int* x = 1;
-    try {
-      dart.core::int* y = 2;
-      function foo() → void {
-        try {
-          dart.core::print("danger foo");
-        }
-        on dynamic catch(final dynamic e) {
-          dart.core::print(x);
-          y = 3;
-        }
-      }
-      [@vm.call-site-attributes.metadata=receiverType:void Function()*] foo.call();
-      dart.core::print(y);
-    }
-    on dynamic catch(final dynamic e, final dart.core::StackTrace* st) {
-      dart.core::print("caught ${e} ${st}");
-      function bar() → void {
-        try {
-          dart.core::print("danger bar");
-        }
-        on dart.core::Error* catch(final dart.core::Error* e) {
-          dart.core::print("error ${e}, captured stack trace: ${st}");
-        }
-      }
-      return bar;
-    }
-  }
-  static method testRethrow(dart.core::bool* cond) → dynamic {
-    try {
-      try {
-        dart.core::print("try 1 > try 2");
-      }
-      on dynamic catch(final dynamic e) {
-        try {
-          dart.core::print("try 1 > catch 2 > try 3");
-          if(cond) {
-            rethrow;
-          }
-        }
-        on dynamic catch(final dynamic e) {
-          dart.core::print("try 1 > catch 2 > catch 3");
-        }
-      }
-    }
-    on dynamic catch(final dynamic e, final dart.core::StackTrace* st) {
-      dart.core::print("catch 1");
-      dart.core::print(st);
-    }
-  }
-  static method testTryFinally1() → dynamic {
-    #L1:
-    for (dart.core::int* i = 0; i.{dart.core::num::<}(10); i = i.{dart.core::num::+}(1)) {
-      try {
-        if(i.{dart.core::num::>}(5)) {
-          break #L1;
-        }
-      }
-      finally {
-        dart.core::print(i);
-      }
-    }
-  }
-  static method testTryFinally2(dart.core::int* x) → dynamic {
-    #L2:
-    switch(x) {
-      #L3:
-      case #C1:
-        {
-          try {
-            dart.core::print("before try 1");
-            dart.core::int* y = 3;
-            try {
-              dart.core::print("try");
-              function foo() → void {
-                dart.core::print(x);
-                dart.core::print(y);
-              }
-              [@vm.call-site-attributes.metadata=receiverType:void Function()*] foo.call();
-              continue #L4;
-            }
-            finally {
-              dart.core::print("finally 1");
-            }
-            dart.core::print("after try 1");
-          }
-          finally {
-            dart.core::print("finally 2");
-          }
-          break #L2;
-        }
-      #L4:
-      case #C2:
-        {
-          dart.core::print("case 2");
-          break #L2;
-        }
-    }
-  }
-  static method testTryFinally3() → dynamic {
-    dart.core::int* x = 11;
-    dynamic y;
-    try {
-      y = () → dart.core::int* {
-        dart.core::print(x);
-        try {
-          dart.core::print("try 1");
-          return 42;
-        }
-        finally {
-          try {
-            dart.core::print("try 2");
-            return 43;
-          }
-          finally {
-            dart.core::print(x);
-          }
-        }
-      };
-    }
-    finally {
-      dart.core::print(x);
-      [@vm.call-site-attributes.metadata=receiverType:dynamic] y.call();
-    }
-  }
-  static method testTryCatchFinally() → dynamic {
-    try
-      try {
-        dart.core::print("try");
-      }
-      on dynamic catch(final dynamic e) {
-        dart.core::print("catch");
-      }
-    finally {
-      dart.core::print("finally");
-    }
-  }
-  static method main() → dynamic {}
-}
-constants  {
-  #C1 = 1
-  #C2 = 2
-}
diff --git a/pkg/vm/testcases/bytecode/type_ops.dart b/pkg/vm/testcases/bytecode/type_ops.dart
deleted file mode 100644
index d9ff5eb..0000000
--- a/pkg/vm/testcases/bytecode/type_ops.dart
+++ /dev/null
@@ -1,76 +0,0 @@
-// Copyright (c) 2018, 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.
-
-class A<T> {}
-
-class B extends A<String> {}
-
-class C<T1, T2, T3> extends B {}
-
-foo1(x) {
-  if (x is B) {
-    print('11');
-  }
-  if (x is C<int, Object, dynamic>) {
-    print('12');
-  }
-  return x as A<int>;
-}
-
-class D<P, Q> extends C<int, Q, P> {
-  Map<P, Q> foo;
-
-  D(tt) : foo = tt;
-
-  foo2(y) {
-    if (y is A<P>) {
-      print('21');
-    }
-    if (y is C<dynamic, Q, List<P>>) {
-      print('22');
-    }
-    foo = y;
-  }
-
-  foo3<T1, T2>(z) {
-    if (z is A<T1>) {
-      print('31');
-    }
-    if (z is C<Map<T1, P>, List<T2>, Q>) {
-      print('32');
-    }
-    return (z as Map<T2, Q>).values;
-  }
-
-  Map<P, Q> foo4(w) {
-    List<Map<P, Q>> list = [w];
-    return w;
-  }
-}
-
-List<Iterable> globalVar;
-
-void foo5(x) {
-  globalVar = x;
-}
-
-class E<P extends String> {
-  factory E() => null;
-  void foo6<T extends P, U extends List<T>>(Map<T, U> map) {}
-}
-
-abstract class F<T> {
-  void foo7<Q extends T>(Q a, covariant num b, T c);
-  void foo8<Q extends T>(Q a, covariant num b, T c);
-}
-
-class G<T> {
-  void foo7<Q extends T>(Q a, int b, T c) {}
-}
-
-class H<T> extends G<T> implements F<T> {
-  void foo8<Q extends T>(Q a, int b, T c) {}
-}
-
-main() {}
diff --git a/pkg/vm/testcases/bytecode/type_ops.dart.expect b/pkg/vm/testcases/bytecode/type_ops.dart.expect
deleted file mode 100644
index 457e9e5..0000000
--- a/pkg/vm/testcases/bytecode/type_ops.dart.expect
+++ /dev/null
@@ -1,977 +0,0 @@
-main = #lib::main;
- [@vm.bytecode=
-BytecodeMetadata {
-Bytecode (version: stable)
-Main library: #lib
-Library '#lib'
-    name '#lib'
-    script '#lib'
-
-Class '', script = '#lib'
-
-Field 'globalVar', type = dart:core::List < dart:core::Iterable null* >*, reflectable, static
-    value = null
-
-Function 'foo1', static, reflectable, debuggable
-    parameters [dynamic 'x'] (required: 1)
-    return-type dynamic
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  Push                 FP[-5]
-  PushConstant         CP#0
-  InterfaceCall        CP#1, 2
-  JumpIfFalse          L1
-  PushConstant         CP#3
-  DirectCall           CP#4, 1
-  Drop1
-L1:
-  Push                 FP[-5]
-  PushNull
-  PushNull
-  PushConstant         CP#6
-  InterfaceCall        CP#7, 4
-  JumpIfFalse          L2
-  PushConstant         CP#9
-  DirectCall           CP#4, 1
-  Drop1
-L2:
-  Push                 FP[-5]
-  PushConstant         CP#10
-  PushNull
-  PushNull
-  PushConstant         CP#11
-  AssertAssignable     0, CP#12
-  ReturnTOS
-}
-ConstantPool {
-  [0] = Type #lib::B < dart:core::String* >*
-  [1] = InterfaceCall 'dart:core::Object::_simpleInstanceOf', ArgDesc num-args 2, num-type-args 0, names []
-  [2] = Reserved
-  [3] = ObjectRef '11'
-  [4] = DirectCall 'dart:core::print', ArgDesc num-args 1, num-type-args 0, names []
-  [5] = Reserved
-  [6] = Type #lib::C < dart:core::String*, dart:core::int*, dart:core::Object*, dynamic >*
-  [7] = InterfaceCall 'dart:core::Object::_instanceOf', ArgDesc num-args 4, num-type-args 0, names []
-  [8] = Reserved
-  [9] = ObjectRef '12'
-  [10] = Type #lib::A < dart:core::int* >*
-  [11] = ObjectRef ' in type cast'
-  [12] = SubtypeTestCache
-}
-
-
-Function 'foo5', static, reflectable, debuggable
-    parameters [dynamic 'x'] (required: 1)
-    return-type void
-
-Bytecode {
-  Entry                1
-  CheckStack           0
-  Push                 FP[-5]
-  PushConstant         CP#0
-  PushNull
-  PushNull
-  PushConstant         CP#1
-  AssertAssignable     0, CP#2
-  StoreStaticTOS       CP#3
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-  [0] = Type dart:core::List < dart:core::Iterable null* >*
-  [1] = ObjectRef ''
-  [2] = SubtypeTestCache
-  [3] = StaticField #lib::globalVar (field)
-}
-
-
-Function 'main', static, reflectable, debuggable
-    parameters [] (required: 0)
-    return-type dynamic
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-}
-
-Class 'A', script = '#lib'
-    type-params <dart:core::Object* T> (args: 1)
-    extends dart:core::Object*
-
-
-Function '', constructor, reflectable
-    parameters [] (required: 0)
-    return-type #lib::A < #lib::A::TypeParam/0* >*
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  Push                 FP[-5]
-  DirectCall           CP#0, 1
-  Drop1
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-  [0] = DirectCall 'dart:core::Object:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
-  [1] = Reserved
-}
-
-
-Function 'get:_identityHashCode', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::int*
-
-Function '_instanceOf', abstract, debuggable
-    parameters [dynamic 'instantiatorTypeArguments', dynamic 'functionTypeArguments', dynamic 'type'] (required: 3)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOf', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOfTrue', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOfFalse', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '==', abstract, debuggable
-    parameters [dynamic 'other'] (required: 1)
-    return-type dart:core::bool*
-
-Function 'get:hashCode', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::int*
-
-Function 'toString', abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::String*
-
-Function 'noSuchMethod', abstract, debuggable
-    parameters [dart:core::Invocation* 'invocation'] (required: 1)
-    return-type dynamic
-
-Function 'get:runtimeType', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::Type*
-Class 'B', script = '#lib'
-    extends #lib::A < dart:core::String* >*
-
-
-Function '', constructor, reflectable
-    parameters [] (required: 0)
-    return-type #lib::B < dart:core::String* >*
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  Push                 FP[-5]
-  DirectCall           CP#0, 1
-  Drop1
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-  [0] = DirectCall '#lib::A:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
-  [1] = Reserved
-}
-
-Class 'C', script = '#lib'
-    type-params <dart:core::Object* T1, dart:core::Object* T2, dart:core::Object* T3> (args: 4)
-    extends #lib::B < dart:core::String* >*
-
-
-Function '', constructor, reflectable
-    parameters [] (required: 0)
-    return-type #lib::C < dart:core::String*, #lib::C::TypeParam/0*, #lib::C::TypeParam/1*, #lib::C::TypeParam/2* >*
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  Push                 FP[-5]
-  DirectCall           CP#0, 1
-  Drop1
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-  [0] = DirectCall '#lib::B:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
-  [1] = Reserved
-}
-
-Class 'D', script = '#lib'
-    type-params <dart:core::Object* P, dart:core::Object* Q> (args: 5)
-    extends #lib::C < dart:core::String*, dart:core::int*, #lib::D::TypeParam/1*, #lib::D::TypeParam/0* >*
-
-Field 'foo', type = dart:core::Map < #lib::D::TypeParam/0*, #lib::D::TypeParam/1* >*, getter = 'get:foo', setter = 'set:foo', reflectable
-    value = null
-
-Function '', constructor, reflectable, debuggable
-    parameters [dynamic 'tt'] (required: 1)
-    return-type #lib::D < dart:core::String*, dart:core::int*, #lib::D::TypeParam/1*, #lib::D::TypeParam/0*, #lib::D::TypeParam/1* >*
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  Push                 FP[-6]
-  Push                 FP[-5]
-  PushConstant         CP#0
-  Push                 FP[-6]
-  LoadTypeArgumentsField CP#1
-  PushNull
-  PushConstant         CP#2
-  AssertAssignable     0, CP#3
-  StoreFieldTOS        CP#4
-  Push                 FP[-6]
-  DirectCall           CP#6, 1
-  Drop1
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-  [0] = Type dart:core::Map < #lib::D::TypeParam/0*, #lib::D::TypeParam/1* >*
-  [1] = TypeArgumentsField #lib::D
-  [2] = ObjectRef ''
-  [3] = SubtypeTestCache
-  [4] = InstanceField #lib::D::foo (field)
-  [5] = Reserved
-  [6] = DirectCall '#lib::C:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
-  [7] = Reserved
-}
-
-
-Function 'foo2', reflectable, debuggable
-    parameters [dynamic 'y'] (required: 1)
-    return-type dynamic
-
-Bytecode {
-  Entry                1
-  CheckStack           0
-  Push                 FP[-5]
-  Push                 FP[-6]
-  LoadTypeArgumentsField CP#0
-  PushNull
-  PushConstant         CP#1
-  InterfaceCall        CP#2, 4
-  JumpIfFalse          L1
-  PushConstant         CP#4
-  DirectCall           CP#5, 1
-  Drop1
-L1:
-  Push                 FP[-5]
-  Push                 FP[-6]
-  LoadTypeArgumentsField CP#0
-  PushNull
-  PushConstant         CP#7
-  InterfaceCall        CP#2, 4
-  JumpIfFalse          L2
-  PushConstant         CP#8
-  DirectCall           CP#5, 1
-  Drop1
-L2:
-  Push                 FP[-6]
-  Push                 FP[-5]
-  PushConstant         CP#9
-  Push                 FP[-6]
-  LoadTypeArgumentsField CP#0
-  PushNull
-  PushConstant         CP#10
-  AssertAssignable     0, CP#11
-  UncheckedInterfaceCall CP#12, 2
-  Drop1
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-  [0] = TypeArgumentsField #lib::D
-  [1] = Type #lib::A < #lib::D::TypeParam/0* >*
-  [2] = InterfaceCall 'dart:core::Object::_instanceOf', ArgDesc num-args 4, num-type-args 0, names []
-  [3] = Reserved
-  [4] = ObjectRef '21'
-  [5] = DirectCall 'dart:core::print', ArgDesc num-args 1, num-type-args 0, names []
-  [6] = Reserved
-  [7] = Type #lib::C < dart:core::String*, dynamic, #lib::D::TypeParam/1*, dart:core::List < #lib::D::TypeParam/0* >* >*
-  [8] = ObjectRef '22'
-  [9] = Type dart:core::Map < #lib::D::TypeParam/0*, #lib::D::TypeParam/1* >*
-  [10] = ObjectRef ''
-  [11] = SubtypeTestCache
-  [12] = InterfaceCall '#lib::D::set:foo', ArgDesc num-args 2, num-type-args 0, names []
-  [13] = Reserved
-}
-
-
-Function 'foo3', reflectable, debuggable
-    type-params <dart:core::Object* T1, dart:core::Object* T2>
-    parameters [dynamic 'z'] (required: 1)
-    return-type dynamic
-
-Bytecode {
-  Entry                1
-  CheckFunctionTypeArgs 2, r0
-  CheckStack           0
-  Push                 FP[-5]
-  PushNull
-  Push                 r0
-  PushConstant         CP#0
-  InterfaceCall        CP#1, 4
-  JumpIfFalse          L1
-  PushConstant         CP#3
-  DirectCall           CP#4, 1
-  Drop1
-L1:
-  Push                 FP[-5]
-  Push                 FP[-6]
-  LoadTypeArgumentsField CP#6
-  Push                 r0
-  PushConstant         CP#7
-  InterfaceCall        CP#1, 4
-  JumpIfFalse          L2
-  PushConstant         CP#8
-  DirectCall           CP#4, 1
-  Drop1
-L2:
-  Push                 FP[-5]
-  PushConstant         CP#9
-  Push                 FP[-6]
-  LoadTypeArgumentsField CP#6
-  Push                 r0
-  PushConstant         CP#10
-  AssertAssignable     0, CP#11
-  InterfaceCall        CP#12, 1
-  ReturnTOS
-}
-ConstantPool {
-  [0] = Type #lib::A < #lib::D::foo3::TypeParam/0* >*
-  [1] = InterfaceCall 'dart:core::Object::_instanceOf', ArgDesc num-args 4, num-type-args 0, names []
-  [2] = Reserved
-  [3] = ObjectRef '31'
-  [4] = DirectCall 'dart:core::print', ArgDesc num-args 1, num-type-args 0, names []
-  [5] = Reserved
-  [6] = TypeArgumentsField #lib::D
-  [7] = Type #lib::C < dart:core::String*, dart:core::Map < #lib::D::foo3::TypeParam/0*, #lib::D::TypeParam/0* >*, dart:core::List < #lib::D::foo3::TypeParam/1* >*, #lib::D::TypeParam/1* >*
-  [8] = ObjectRef '32'
-  [9] = Type dart:core::Map < #lib::D::foo3::TypeParam/1*, #lib::D::TypeParam/1* >*
-  [10] = ObjectRef ' in type cast'
-  [11] = SubtypeTestCache
-  [12] = InterfaceCall 'dart:core::Map::get:values', ArgDesc num-args 1, num-type-args 0, names []
-  [13] = Reserved
-}
-
-
-Function 'foo4', reflectable, debuggable
-    parameters [dynamic 'w'] (required: 1)
-    return-type dart:core::Map < #lib::D::TypeParam/0*, #lib::D::TypeParam/1* >*
-
-Bytecode {
-  Entry                2
-  CheckStack           0
-  Push                 FP[-6]
-  LoadTypeArgumentsField CP#0
-  PushNull
-  InstantiateTypeArgumentsTOS 0, CP#1
-  StoreLocal           r1
-  Push                 r1
-  PushInt              1
-  CreateArrayTOS
-  StoreLocal           r1
-  Push                 r1
-  PushInt              0
-  Push                 FP[-5]
-  PushConstant         CP#2
-  Push                 FP[-6]
-  LoadTypeArgumentsField CP#0
-  PushNull
-  PushConstant         CP#3
-  AssertAssignable     0, CP#4
-  StoreIndexedTOS
-  DirectCall           CP#5, 2
-  PopLocal             r0
-  Push                 FP[-5]
-  PushConstant         CP#2
-  Push                 FP[-6]
-  LoadTypeArgumentsField CP#0
-  PushNull
-  PushConstant         CP#3
-  AssertAssignable     0, CP#7
-  ReturnTOS
-}
-ConstantPool {
-  [0] = TypeArgumentsField #lib::D
-  [1] = ObjectRef < dart:core::Map < #lib::D::TypeParam/0*, #lib::D::TypeParam/1* >* >
-  [2] = Type dart:core::Map < #lib::D::TypeParam/0*, #lib::D::TypeParam/1* >*
-  [3] = ObjectRef ''
-  [4] = SubtypeTestCache
-  [5] = DirectCall 'dart:core::List::_fromLiteral (constructor)', ArgDesc num-args 2, num-type-args 0, names []
-  [6] = Reserved
-  [7] = SubtypeTestCache
-}
-
-Class 'E', script = '#lib'
-    type-params <dart:core::String* P> (args: 1)
-    extends dart:core::Object*
-
-
-Function '', factory, static, reflectable, debuggable
-    type-params <dart:core::String* P>
-    parameters [] (required: 0)
-    return-type #lib::E < #lib::E:: (constructor)::TypeParam/0* >*
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  PushNull
-  ReturnTOS
-}
-Default function type arguments: CP#0
-ConstantPool {
-  [0] = ObjectRef < dart:core::String* >
-}
-
-
-Function 'foo6', reflectable, debuggable
-    type-params <#lib::E::TypeParam/0* T, dart:core::List < #lib::E::foo6::TypeParam/0* >* U>
-    parameters [dart:core::Map < #lib::E::foo6::TypeParam/0*, #lib::E::foo6::TypeParam/1* >* 'map'] (required: 1)
-    return-type void
-
-Bytecode {
-  Entry                1
-  CheckFunctionTypeArgs 2, r0
-  JumpIfNotZeroTypeArgs L1
-  Push                 FP[-6]
-  LoadTypeArgumentsField CP#0
-  PushNull
-  InstantiateTypeArgumentsTOS 0, CP#1
-  PopLocal             r0
-L1:
-  CheckStack           0
-  JumpIfUnchecked      L2
-  Push                 FP[-6]
-  LoadTypeArgumentsField CP#0
-  Push                 r0
-  PushConstant         CP#2
-  PushConstant         CP#3
-  PushConstant         CP#4
-  AssertSubtype
-L2:
-  PushNull
-  ReturnTOS
-}
-Default function type arguments: CP#1
-ConstantPool {
-  [0] = TypeArgumentsField #lib::E
-  [1] = ObjectRef < #lib::E::TypeParam/0*, dart:core::List < #lib::E::TypeParam/0* >* >
-  [2] = Type #lib::E::foo6::TypeParam/0*
-  [3] = Type #lib::E::TypeParam/0*
-  [4] = ObjectRef 'T'
-}
-
-
-Function 'get:_identityHashCode', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::int*
-
-Function '_instanceOf', abstract, debuggable
-    parameters [dynamic 'instantiatorTypeArguments', dynamic 'functionTypeArguments', dynamic 'type'] (required: 3)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOf', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOfTrue', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOfFalse', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '==', abstract, debuggable
-    parameters [dynamic 'other'] (required: 1)
-    return-type dart:core::bool*
-
-Function 'get:hashCode', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::int*
-
-Function 'toString', abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::String*
-
-Function 'noSuchMethod', abstract, debuggable
-    parameters [dart:core::Invocation* 'invocation'] (required: 1)
-    return-type dynamic
-
-Function 'get:runtimeType', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::Type*
-Class 'F', script = '#lib', abstract
-    type-params <dart:core::Object* T> (args: 1)
-    extends dart:core::Object*
-
-
-Function '', constructor, reflectable
-    parameters [] (required: 0)
-    return-type #lib::F < #lib::F::TypeParam/0* >*
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  Push                 FP[-5]
-  DirectCall           CP#0, 1
-  Drop1
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-  [0] = DirectCall 'dart:core::Object:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
-  [1] = Reserved
-}
-
-
-Function 'foo7', abstract, reflectable, debuggable
-    type-params <#lib::F::TypeParam/0* Q>
-    parameters [#lib::F::foo7::TypeParam/0* 'a', dart:core::num* 'b', #lib::F::TypeParam/0* 'c'] (required: 3)
-    return-type void
-
-Function 'foo8', abstract, reflectable, debuggable
-    type-params <#lib::F::TypeParam/0* Q>
-    parameters [#lib::F::foo8::TypeParam/0* 'a', dart:core::num* 'b', #lib::F::TypeParam/0* 'c'] (required: 3)
-    return-type void
-
-Function 'get:_identityHashCode', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::int*
-
-Function '_instanceOf', abstract, debuggable
-    parameters [dynamic 'instantiatorTypeArguments', dynamic 'functionTypeArguments', dynamic 'type'] (required: 3)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOf', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOfTrue', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOfFalse', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '==', abstract, debuggable
-    parameters [dynamic 'other'] (required: 1)
-    return-type dart:core::bool*
-
-Function 'get:hashCode', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::int*
-
-Function 'toString', abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::String*
-
-Function 'noSuchMethod', abstract, debuggable
-    parameters [dart:core::Invocation* 'invocation'] (required: 1)
-    return-type dynamic
-
-Function 'get:runtimeType', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::Type*
-Class 'G', script = '#lib'
-    type-params <dart:core::Object* T> (args: 1)
-    extends dart:core::Object*
-
-
-Function '', constructor, reflectable
-    parameters [] (required: 0)
-    return-type #lib::G < #lib::G::TypeParam/0* >*
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  Push                 FP[-5]
-  DirectCall           CP#0, 1
-  Drop1
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-  [0] = DirectCall 'dart:core::Object:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
-  [1] = Reserved
-}
-
-
-Function 'foo7', reflectable, debuggable
-    type-params <#lib::G::TypeParam/0* Q>
-    parameters [#lib::G::foo7::TypeParam/0* 'a', dart:core::int* 'b', #lib::G::TypeParam/0* 'c'] (required: 3)
-    return-type void
-
-Bytecode {
-  Entry                1
-  CheckFunctionTypeArgs 1, r0
-  JumpIfNotZeroTypeArgs L1
-  Push                 FP[-8]
-  LoadTypeArgumentsField CP#0
-  PopLocal             r0
-L1:
-  CheckStack           0
-  JumpIfUnchecked      L2
-  Push                 FP[-8]
-  LoadTypeArgumentsField CP#0
-  Push                 r0
-  PushConstant         CP#1
-  PushConstant         CP#2
-  PushConstant         CP#3
-  AssertSubtype
-  Push                 FP[-5]
-  PushConstant         CP#2
-  Push                 FP[-8]
-  LoadTypeArgumentsField CP#0
-  PushNull
-  PushConstant         CP#4
-  AssertAssignable     0, CP#5
-  Drop1
-L2:
-  PushNull
-  ReturnTOS
-}
-Parameter flags: [0, 0, 2]
-Default function type arguments: CP#6
-ConstantPool {
-  [0] = TypeArgumentsField #lib::G
-  [1] = Type #lib::G::foo7::TypeParam/0*
-  [2] = Type #lib::G::TypeParam/0*
-  [3] = ObjectRef 'Q'
-  [4] = ObjectRef 'c'
-  [5] = SubtypeTestCache
-  [6] = ObjectRef < #lib::G::TypeParam/0* >
-}
-
-
-Function 'get:_identityHashCode', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::int*
-
-Function '_instanceOf', abstract, debuggable
-    parameters [dynamic 'instantiatorTypeArguments', dynamic 'functionTypeArguments', dynamic 'type'] (required: 3)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOf', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOfTrue', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '_simpleInstanceOfFalse', abstract, debuggable
-    parameters [dynamic 'type'] (required: 1)
-    return-type dart:core::bool*
-
-Function '==', abstract, debuggable
-    parameters [dynamic 'other'] (required: 1)
-    return-type dart:core::bool*
-
-Function 'get:hashCode', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::int*
-
-Function 'toString', abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::String*
-
-Function 'noSuchMethod', abstract, debuggable
-    parameters [dart:core::Invocation* 'invocation'] (required: 1)
-    return-type dynamic
-
-Function 'get:runtimeType', getter, abstract, debuggable
-    parameters [] (required: 0)
-    return-type dart:core::Type*
-Class 'H', script = '#lib'
-    type-params <dart:core::Object* T> (args: 1)
-    extends #lib::G < #lib::H::TypeParam/0* >*
-    implements [#lib::F < #lib::H::TypeParam/0* >*]
-
-
-Function '', constructor, reflectable
-    parameters [] (required: 0)
-    return-type #lib::H < #lib::H::TypeParam/0* >*
-
-Bytecode {
-  Entry                0
-  CheckStack           0
-  Push                 FP[-5]
-  DirectCall           CP#0, 1
-  Drop1
-  PushNull
-  ReturnTOS
-}
-ConstantPool {
-  [0] = DirectCall '#lib::G:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
-  [1] = Reserved
-}
-
-
-Function 'foo8', reflectable, debuggable
-    type-params <#lib::H::TypeParam/0* Q>
-    parameters [#lib::H::foo8::TypeParam/0* 'a', dart:core::int* 'b', #lib::H::TypeParam/0* 'c'] (required: 3)
-    return-type void
-
-Bytecode {
-  Entry                1
-  CheckFunctionTypeArgs 1, r0
-  JumpIfNotZeroTypeArgs L1
-  Push                 FP[-8]
-  LoadTypeArgumentsField CP#0
-  PopLocal             r0
-L1:
-  CheckStack           0
-  JumpIfUnchecked      L2
-  Push                 FP[-8]
-  LoadTypeArgumentsField CP#0
-  Push                 r0
-  PushConstant         CP#1
-  PushConstant         CP#2
-  PushConstant         CP#3
-  AssertSubtype
-  Push                 FP[-5]
-  PushConstant         CP#2
-  Push                 FP[-8]
-  LoadTypeArgumentsField CP#0
-  PushNull
-  PushConstant         CP#4
-  AssertAssignable     0, CP#5
-  Drop1
-L2:
-  Push                 FP[-6]
-  PushConstant         CP#6
-  PushNull
-  PushNull
-  PushConstant         CP#7
-  AssertAssignable     1, CP#8
-  Drop1
-  PushNull
-  ReturnTOS
-}
-Parameter flags: [0, 1, 2]
-Default function type arguments: CP#9
-ConstantPool {
-  [0] = TypeArgumentsField #lib::H
-  [1] = Type #lib::H::foo8::TypeParam/0*
-  [2] = Type #lib::H::TypeParam/0*
-  [3] = ObjectRef 'Q'
-  [4] = ObjectRef 'c'
-  [5] = SubtypeTestCache
-  [6] = Type dart:core::int*
-  [7] = ObjectRef 'b'
-  [8] = SubtypeTestCache
-  [9] = ObjectRef < #lib::H::TypeParam/0* >
-}
-
-
-Function 'foo7', reflectable, debuggable, forwarding-stub
-    type-params <#lib::H::TypeParam/0* Q>
-    parameters [#lib::H::foo7::TypeParam/0* 'a', dart:core::num* 'b', #lib::H::TypeParam/0* 'c'] (required: 3)
-    return-type void
-
-Bytecode {
-  Entry                2
-  CheckFunctionTypeArgs 1, r0
-  JumpIfNotZeroTypeArgs L1
-  Push                 FP[-8]
-  LoadTypeArgumentsField CP#0
-  PopLocal             r0
-L1:
-  CheckStack           0
-  JumpIfUnchecked      L2
-  Push                 FP[-8]
-  LoadTypeArgumentsField CP#0
-  Push                 r0
-  PushConstant         CP#1
-  PushConstant         CP#2
-  PushConstant         CP#3
-  AssertSubtype
-  Push                 FP[-5]
-  PushConstant         CP#2
-  Push                 FP[-8]
-  LoadTypeArgumentsField CP#0
-  PushNull
-  PushConstant         CP#4
-  AssertAssignable     0, CP#5
-  Drop1
-L2:
-  Push                 FP[-6]
-  PushConstant         CP#6
-  PushNull
-  PushNull
-  PushConstant         CP#7
-  AssertAssignable     1, CP#8
-  Drop1
-  PushNull
-  Push                 r0
-  InstantiateTypeArgumentsTOS 0, CP#9
-  Push                 FP[-8]
-  Push                 FP[-7]
-  Push                 FP[-6]
-  Push                 FP[-5]
-  UncheckedDirectCall  CP#10, 5
-  ReturnTOS
-}
-Parameter flags: [0, 1, 2]
-Forwarding stub target: CP#12
-Default function type arguments: CP#13
-ConstantPool {
-  [0] = TypeArgumentsField #lib::H
-  [1] = Type #lib::H::foo7::TypeParam/0*
-  [2] = Type #lib::H::TypeParam/0*
-  [3] = ObjectRef 'Q'
-  [4] = ObjectRef 'c'
-  [5] = SubtypeTestCache
-  [6] = Type dart:core::int*
-  [7] = ObjectRef 'b'
-  [8] = SubtypeTestCache
-  [9] = ObjectRef < #lib::H::foo7::TypeParam/0* >
-  [10] = DirectCall '#lib::G::foo7', ArgDesc num-args 4, num-type-args 1, names []
-  [11] = Reserved
-  [12] = ObjectRef #lib::G::foo7
-  [13] = ObjectRef < #lib::H::TypeParam/0* >
-}
-
-
-}
-]library #lib from "#lib" as #lib {
-
-  class A<T extends dart.core::Object* = dynamic> extends dart.core::Object {
-    synthetic constructor •() → #lib::A<#lib::A::T*>*
-      : super dart.core::Object::•()
-      ;
-    abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
-    abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
-    abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
-    abstract member-signature method _simpleInstanceOfTrue(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfTrue
-    abstract member-signature method _simpleInstanceOfFalse(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfFalse
-    abstract member-signature operator ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
-    abstract member-signature get hashCode() → dart.core::int*; -> dart.core::Object::hashCode
-    abstract member-signature method toString() → dart.core::String*; -> dart.core::Object::toString
-    abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
-    abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
-  }
-  class B extends #lib::A<dart.core::String*> {
-    synthetic constructor •() → #lib::B*
-      : super #lib::A::•()
-      ;
-  }
-  class C<T1 extends dart.core::Object* = dynamic, T2 extends dart.core::Object* = dynamic, T3 extends dart.core::Object* = dynamic> extends #lib::B {
-    synthetic constructor •() → #lib::C<#lib::C::T1*, #lib::C::T2*, #lib::C::T3*>*
-      : super #lib::B::•()
-      ;
-  }
-  class D<P extends dart.core::Object* = dynamic, Q extends dart.core::Object* = dynamic> extends #lib::C<dart.core::int*, #lib::D::Q*, #lib::D::P*> {
-    generic-covariant-impl field dart.core::Map<#lib::D::P*, #lib::D::Q*>* foo;
-    constructor •(dynamic tt) → #lib::D<#lib::D::P*, #lib::D::Q*>*
-      : #lib::D::foo = tt as{TypeError,ForDynamic} dart.core::Map<#lib::D::P*, #lib::D::Q*>*, super #lib::C::•()
-      ;
-    method foo2(dynamic y) → dynamic {
-      if(y is #lib::A<#lib::D::P*>*) {
-        dart.core::print("21");
-      }
-      if(y is #lib::C<dynamic, #lib::D::Q*, dart.core::List<#lib::D::P*>*>*) {
-        dart.core::print("22");
-      }
-      [@vm.call-site-attributes.metadata=receiverType:#lib::D<#lib::D.P*, #lib::D.Q*>*] this.{#lib::D::foo} = y as{TypeError,ForDynamic} dart.core::Map<#lib::D::P*, #lib::D::Q*>*;
-    }
-    method foo3<T1 extends dart.core::Object* = dynamic, T2 extends dart.core::Object* = dynamic>(dynamic z) → dynamic {
-      if(z is #lib::A<#lib::D::foo3::T1*>*) {
-        dart.core::print("31");
-      }
-      if(z is #lib::C<dart.core::Map<#lib::D::foo3::T1*, #lib::D::P*>*, dart.core::List<#lib::D::foo3::T2*>*, #lib::D::Q*>*) {
-        dart.core::print("32");
-      }
-      return (z as dart.core::Map<#lib::D::foo3::T2*, #lib::D::Q*>*).{dart.core::Map::values};
-    }
-    method foo4(dynamic w) → dart.core::Map<#lib::D::P*, #lib::D::Q*>* {
-      dart.core::List<dart.core::Map<#lib::D::P*, #lib::D::Q*>*>* list = <dart.core::Map<#lib::D::P*, #lib::D::Q*>*>[w as{TypeError,ForDynamic} dart.core::Map<#lib::D::P*, #lib::D::Q*>*];
-      return w as{TypeError,ForDynamic} dart.core::Map<#lib::D::P*, #lib::D::Q*>*;
-    }
-  }
-  class E<P extends dart.core::String* = dart.core::String*> extends dart.core::Object {
-    static factory •<P extends dart.core::String* = dart.core::String*>() → #lib::E<#lib::E::•::P*>*
-      return null;
-    method foo6<generic-covariant-impl T extends #lib::E::P* = #lib::E::P*, U extends dart.core::List<#lib::E::foo6::T*>* = dart.core::List<#lib::E::P*>*>(dart.core::Map<#lib::E::foo6::T*, #lib::E::foo6::U*>* map) → void {}
-    abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
-    abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
-    abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
-    abstract member-signature method _simpleInstanceOfTrue(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfTrue
-    abstract member-signature method _simpleInstanceOfFalse(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfFalse
-    abstract member-signature operator ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
-    abstract member-signature get hashCode() → dart.core::int*; -> dart.core::Object::hashCode
-    abstract member-signature method toString() → dart.core::String*; -> dart.core::Object::toString
-    abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
-    abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
-  }
-  abstract class F<T extends dart.core::Object* = dynamic> extends dart.core::Object {
-    synthetic constructor •() → #lib::F<#lib::F::T*>*
-      : super dart.core::Object::•()
-      ;
-    abstract method foo7<generic-covariant-impl Q extends #lib::F::T* = #lib::F::T*>(#lib::F::foo7::Q* a, covariant dart.core::num* b, generic-covariant-impl #lib::F::T* c) → void;
-    abstract method foo8<generic-covariant-impl Q extends #lib::F::T* = #lib::F::T*>(#lib::F::foo8::Q* a, covariant dart.core::num* b, generic-covariant-impl #lib::F::T* c) → void;
-    abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
-    abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
-    abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
-    abstract member-signature method _simpleInstanceOfTrue(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfTrue
-    abstract member-signature method _simpleInstanceOfFalse(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfFalse
-    abstract member-signature operator ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
-    abstract member-signature get hashCode() → dart.core::int*; -> dart.core::Object::hashCode
-    abstract member-signature method toString() → dart.core::String*; -> dart.core::Object::toString
-    abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
-    abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
-  }
-  class G<T extends dart.core::Object* = dynamic> extends dart.core::Object {
-    synthetic constructor •() → #lib::G<#lib::G::T*>*
-      : super dart.core::Object::•()
-      ;
-    method foo7<generic-covariant-impl Q extends #lib::G::T* = #lib::G::T*>(#lib::G::foo7::Q* a, dart.core::int* b, generic-covariant-impl #lib::G::T* c) → void {}
-    abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
-    abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
-    abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
-    abstract member-signature method _simpleInstanceOfTrue(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfTrue
-    abstract member-signature method _simpleInstanceOfFalse(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfFalse
-    abstract member-signature operator ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
-    abstract member-signature get hashCode() → dart.core::int*; -> dart.core::Object::hashCode
-    abstract member-signature method toString() → dart.core::String*; -> dart.core::Object::toString
-    abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
-    abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
-  }
-  class H<T extends dart.core::Object* = dynamic> extends #lib::G<#lib::H::T*> implements #lib::F<#lib::H::T*> {
-    synthetic constructor •() → #lib::H<#lib::H::T*>*
-      : super #lib::G::•()
-      ;
-    method foo8<generic-covariant-impl Q extends #lib::H::T* = #lib::H::T*>(#lib::H::foo8::Q* a, covariant dart.core::int* b, generic-covariant-impl #lib::H::T* c) → void {}
-    forwarding-stub method foo7<generic-covariant-impl Q extends #lib::H::T* = #lib::H::T*>(#lib::H::foo7::Q* a, covariant dart.core::num* b, generic-covariant-impl #lib::H::T* c) → void
-      return super.{#lib::G::foo7}<#lib::H::foo7::Q*>(a, b, c);
-  }
-  static field dart.core::List<dart.core::Iterable<dynamic>*>* globalVar;
-  static method foo1(dynamic x) → dynamic {
-    if(x is #lib::B*) {
-      dart.core::print("11");
-    }
-    if(x is #lib::C<dart.core::int*, dart.core::Object*, dynamic>*) {
-      dart.core::print("12");
-    }
-    return x as #lib::A<dart.core::int*>*;
-  }
-  static method foo5(dynamic x) → void {
-    #lib::globalVar = x as{TypeError,ForDynamic} dart.core::List<dart.core::Iterable<dynamic>*>*;
-  }
-  static method main() → dynamic {}
-}
diff --git a/pkg/vm/testcases/transformations/deferred_loading/main.dart.expect b/pkg/vm/testcases/transformations/deferred_loading/main.dart.expect
index f6484af..e069735 100644
--- a/pkg/vm/testcases/transformations/deferred_loading/main.dart.expect
+++ b/pkg/vm/testcases/transformations/deferred_loading/main.dart.expect
@@ -47,7 +47,8 @@
   import "#pkg/vm/testcases/transformations/deferred_loading/a.dart" as a;
 
   static method j() → dynamic /* originally async */ {
-    final dart.async::_AsyncAwaitCompleter<dynamic>* :async_completer = new dart.async::_AsyncAwaitCompleter::•<dynamic>();
+    final dart.async::_Future<dynamic>* :async_future = new dart.async::_Future::•<dynamic>();
+    dart.core::bool* :is_sync = false;
     FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -60,17 +61,18 @@
         {
           dart.core::print("J");
         }
-        dart.async::_completeOnAsyncReturn(:async_completer, :return_value);
+        dart.async::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, dart.core::StackTrace* stack_trace) {
-        :async_completer.{dart.async::Completer::completeError}(exception, stack_trace);
+        dart.async::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = dart.async::_asyncStackTraceHelper(:async_op);
     :async_op_then = dart.async::_asyncThenWrapperHelper(:async_op);
     :async_op_error = dart.async::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{dart.async::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{dart.async::Completer::future};
+    [@vm.call-site-attributes.metadata=receiverType:dynamic Function([dynamic, dynamic, dart.core::StackTrace*])*] :async_op.call();
+    :is_sync = true;
+    return :async_future;
   }
 }
 library h from "#pkg/vm/testcases/transformations/deferred_loading/h.dart" as h {
@@ -78,7 +80,8 @@
   import "#pkg/vm/testcases/transformations/deferred_loading/g.dart" as g;
 
   static method h() → dynamic /* originally async */ {
-    final dart.async::_AsyncAwaitCompleter<dynamic>* :async_completer = new dart.async::_AsyncAwaitCompleter::•<dynamic>();
+    final dart.async::_Future<dynamic>* :async_future = new dart.async::_Future::•<dynamic>();
+    dart.core::bool* :is_sync = false;
     FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -91,17 +94,18 @@
         {
           dart.core::print("H");
         }
-        dart.async::_completeOnAsyncReturn(:async_completer, :return_value);
+        dart.async::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, dart.core::StackTrace* stack_trace) {
-        :async_completer.{dart.async::Completer::completeError}(exception, stack_trace);
+        dart.async::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = dart.async::_asyncStackTraceHelper(:async_op);
     :async_op_then = dart.async::_asyncThenWrapperHelper(:async_op);
     :async_op_error = dart.async::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{dart.async::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{dart.async::Completer::future};
+    [@vm.call-site-attributes.metadata=receiverType:dynamic Function([dynamic, dynamic, dart.core::StackTrace*])*] :async_op.call();
+    :is_sync = true;
+    return :async_future;
   }
 }
 library i from "#pkg/vm/testcases/transformations/deferred_loading/i.dart" as i {
@@ -110,7 +114,8 @@
   import "#pkg/vm/testcases/transformations/deferred_loading/b.dart" as b;
 
   static method i() → dynamic /* originally async */ {
-    final dart.async::_AsyncAwaitCompleter<dynamic>* :async_completer = new dart.async::_AsyncAwaitCompleter::•<dynamic>();
+    final dart.async::_Future<dynamic>* :async_future = new dart.async::_Future::•<dynamic>();
+    dart.core::bool* :is_sync = false;
     FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -128,17 +133,18 @@
           :return_value = let final dynamic #t2 = CheckLibraryIsLoaded(j) in j::j();
           break #L3;
         }
-        dart.async::_completeOnAsyncReturn(:async_completer, :return_value);
+        dart.async::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, dart.core::StackTrace* stack_trace) {
-        :async_completer.{dart.async::Completer::completeError}(exception, stack_trace);
+        dart.async::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = dart.async::_asyncStackTraceHelper(:async_op);
     :async_op_then = dart.async::_asyncThenWrapperHelper(:async_op);
     :async_op_error = dart.async::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{dart.async::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{dart.async::Completer::future};
+    [@vm.call-site-attributes.metadata=receiverType:dynamic Function([dynamic, dynamic, dart.core::StackTrace*])*] :async_op.call();
+    :is_sync = true;
+    return :async_future;
   }
 }
 library g from "#pkg/vm/testcases/transformations/deferred_loading/g.dart" as g {
@@ -146,7 +152,8 @@
   import "#pkg/vm/testcases/transformations/deferred_loading/h.dart" as h;
 
   static method g() → dynamic /* originally async */ {
-    final dart.async::_AsyncAwaitCompleter<dynamic>* :async_completer = new dart.async::_AsyncAwaitCompleter::•<dynamic>();
+    final dart.async::_Future<dynamic>* :async_future = new dart.async::_Future::•<dynamic>();
+    dart.core::bool* :is_sync = false;
     FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -159,17 +166,18 @@
         {
           dart.core::print("G");
         }
-        dart.async::_completeOnAsyncReturn(:async_completer, :return_value);
+        dart.async::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, dart.core::StackTrace* stack_trace) {
-        :async_completer.{dart.async::Completer::completeError}(exception, stack_trace);
+        dart.async::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = dart.async::_asyncStackTraceHelper(:async_op);
     :async_op_then = dart.async::_asyncThenWrapperHelper(:async_op);
     :async_op_error = dart.async::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{dart.async::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{dart.async::Completer::future};
+    [@vm.call-site-attributes.metadata=receiverType:dynamic Function([dynamic, dynamic, dart.core::StackTrace*])*] :async_op.call();
+    :is_sync = true;
+    return :async_future;
   }
 }
 library f from "#pkg/vm/testcases/transformations/deferred_loading/f.dart" as f {
@@ -178,7 +186,8 @@
   import "#pkg/vm/testcases/transformations/deferred_loading/i.dart" deferred as i;
 
   static method f() → dynamic /* originally async */ {
-    final dart.async::_AsyncAwaitCompleter<dynamic>* :async_completer = new dart.async::_AsyncAwaitCompleter::•<dynamic>();
+    final dart.async::_Future<dynamic>* :async_future = new dart.async::_Future::•<dynamic>();
+    dart.core::bool* :is_sync = false;
     FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -200,17 +209,18 @@
           :return_value = let final dynamic #t6 = CheckLibraryIsLoaded(i) in i::i();
           break #L5;
         }
-        dart.async::_completeOnAsyncReturn(:async_completer, :return_value);
+        dart.async::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, dart.core::StackTrace* stack_trace) {
-        :async_completer.{dart.async::Completer::completeError}(exception, stack_trace);
+        dart.async::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = dart.async::_asyncStackTraceHelper(:async_op);
     :async_op_then = dart.async::_asyncThenWrapperHelper(:async_op);
     :async_op_error = dart.async::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{dart.async::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{dart.async::Completer::future};
+    [@vm.call-site-attributes.metadata=receiverType:dynamic Function([dynamic, dynamic, dart.core::StackTrace*])*] :async_op.call();
+    :is_sync = true;
+    return :async_future;
   }
 }
 library e from "#pkg/vm/testcases/transformations/deferred_loading/e.dart" as e {
@@ -218,7 +228,8 @@
   import "#pkg/vm/testcases/transformations/deferred_loading/g.dart" deferred as g;
 
   static method e() → dynamic /* originally async */ {
-    final dart.async::_AsyncAwaitCompleter<dynamic>* :async_completer = new dart.async::_AsyncAwaitCompleter::•<dynamic>();
+    final dart.async::_Future<dynamic>* :async_future = new dart.async::_Future::•<dynamic>();
+    dart.core::bool* :is_sync = false;
     FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -236,17 +247,18 @@
           :return_value = let final dynamic #t8 = CheckLibraryIsLoaded(g) in g::g();
           break #L6;
         }
-        dart.async::_completeOnAsyncReturn(:async_completer, :return_value);
+        dart.async::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, dart.core::StackTrace* stack_trace) {
-        :async_completer.{dart.async::Completer::completeError}(exception, stack_trace);
+        dart.async::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = dart.async::_asyncStackTraceHelper(:async_op);
     :async_op_then = dart.async::_asyncThenWrapperHelper(:async_op);
     :async_op_error = dart.async::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{dart.async::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{dart.async::Completer::future};
+    [@vm.call-site-attributes.metadata=receiverType:dynamic Function([dynamic, dynamic, dart.core::StackTrace*])*] :async_op.call();
+    :is_sync = true;
+    return :async_future;
   }
 }
 library c from "#pkg/vm/testcases/transformations/deferred_loading/c.dart" as c {
@@ -255,7 +267,8 @@
   import "#pkg/vm/testcases/transformations/deferred_loading/f.dart" deferred as f;
 
   static method c() → dynamic /* originally async */ {
-    final dart.async::_AsyncAwaitCompleter<dynamic>* :async_completer = new dart.async::_AsyncAwaitCompleter::•<dynamic>();
+    final dart.async::_Future<dynamic>* :async_future = new dart.async::_Future::•<dynamic>();
+    dart.core::bool* :is_sync = false;
     FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -273,17 +286,18 @@
           :return_value = let final dynamic #t10 = CheckLibraryIsLoaded(f) in f::f();
           break #L7;
         }
-        dart.async::_completeOnAsyncReturn(:async_completer, :return_value);
+        dart.async::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, dart.core::StackTrace* stack_trace) {
-        :async_completer.{dart.async::Completer::completeError}(exception, stack_trace);
+        dart.async::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = dart.async::_asyncStackTraceHelper(:async_op);
     :async_op_then = dart.async::_asyncThenWrapperHelper(:async_op);
     :async_op_error = dart.async::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{dart.async::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{dart.async::Completer::future};
+    [@vm.call-site-attributes.metadata=receiverType:dynamic Function([dynamic, dynamic, dart.core::StackTrace*])*] :async_op.call();
+    :is_sync = true;
+    return :async_future;
   }
 }
 library d from "#pkg/vm/testcases/transformations/deferred_loading/d.dart" as d {
@@ -291,7 +305,8 @@
   import "#pkg/vm/testcases/transformations/deferred_loading/e.dart" as e;
 
   static method d() → dynamic /* originally async */ {
-    final dart.async::_AsyncAwaitCompleter<dynamic>* :async_completer = new dart.async::_AsyncAwaitCompleter::•<dynamic>();
+    final dart.async::_Future<dynamic>* :async_future = new dart.async::_Future::•<dynamic>();
+    dart.core::bool* :is_sync = false;
     FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -306,17 +321,18 @@
           :return_value = e::e();
           break #L8;
         }
-        dart.async::_completeOnAsyncReturn(:async_completer, :return_value);
+        dart.async::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, dart.core::StackTrace* stack_trace) {
-        :async_completer.{dart.async::Completer::completeError}(exception, stack_trace);
+        dart.async::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = dart.async::_asyncStackTraceHelper(:async_op);
     :async_op_then = dart.async::_asyncThenWrapperHelper(:async_op);
     :async_op_error = dart.async::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{dart.async::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{dart.async::Completer::future};
+    [@vm.call-site-attributes.metadata=receiverType:dynamic Function([dynamic, dynamic, dart.core::StackTrace*])*] :async_op.call();
+    :is_sync = true;
+    return :async_future;
   }
 }
 library b from "#pkg/vm/testcases/transformations/deferred_loading/b.dart" as b {
@@ -324,7 +340,8 @@
   import "#pkg/vm/testcases/transformations/deferred_loading/c.dart" as c;
 
   static method b() → dynamic /* originally async */ {
-    final dart.async::_AsyncAwaitCompleter<dynamic>* :async_completer = new dart.async::_AsyncAwaitCompleter::•<dynamic>();
+    final dart.async::_Future<dynamic>* :async_future = new dart.async::_Future::•<dynamic>();
+    dart.core::bool* :is_sync = false;
     FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -339,17 +356,18 @@
           :return_value = c::c();
           break #L9;
         }
-        dart.async::_completeOnAsyncReturn(:async_completer, :return_value);
+        dart.async::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, dart.core::StackTrace* stack_trace) {
-        :async_completer.{dart.async::Completer::completeError}(exception, stack_trace);
+        dart.async::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = dart.async::_asyncStackTraceHelper(:async_op);
     :async_op_then = dart.async::_asyncThenWrapperHelper(:async_op);
     :async_op_error = dart.async::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{dart.async::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{dart.async::Completer::future};
+    [@vm.call-site-attributes.metadata=receiverType:dynamic Function([dynamic, dynamic, dart.core::StackTrace*])*] :async_op.call();
+    :is_sync = true;
+    return :async_future;
   }
 }
 library a from "#pkg/vm/testcases/transformations/deferred_loading/a.dart" as a {
@@ -357,7 +375,8 @@
   import "#pkg/vm/testcases/transformations/deferred_loading/d.dart" deferred as d;
 
   static method a() → dynamic /* originally async */ {
-    final dart.async::_AsyncAwaitCompleter<dynamic>* :async_completer = new dart.async::_AsyncAwaitCompleter::•<dynamic>();
+    final dart.async::_Future<dynamic>* :async_future = new dart.async::_Future::•<dynamic>();
+    dart.core::bool* :is_sync = false;
     FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -375,17 +394,18 @@
           :return_value = let final dynamic #t12 = CheckLibraryIsLoaded(d) in d::d();
           break #L10;
         }
-        dart.async::_completeOnAsyncReturn(:async_completer, :return_value);
+        dart.async::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, dart.core::StackTrace* stack_trace) {
-        :async_completer.{dart.async::Completer::completeError}(exception, stack_trace);
+        dart.async::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = dart.async::_asyncStackTraceHelper(:async_op);
     :async_op_then = dart.async::_asyncThenWrapperHelper(:async_op);
     :async_op_error = dart.async::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{dart.async::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{dart.async::Completer::future};
+    [@vm.call-site-attributes.metadata=receiverType:dynamic Function([dynamic, dynamic, dart.core::StackTrace*])*] :async_op.call();
+    :is_sync = true;
+    return :async_future;
   }
 }
 library #lib from "#lib" as #lib {
@@ -394,7 +414,8 @@
   import "#pkg/vm/testcases/transformations/deferred_loading/b.dart";
 
   static method main() → dynamic /* originally async */ {
-    final dart.async::_AsyncAwaitCompleter<dynamic>* :async_completer = new dart.async::_AsyncAwaitCompleter::•<dynamic>();
+    final dart.async::_Future<dynamic>* :async_future = new dart.async::_Future::•<dynamic>();
+    dart.core::bool* :is_sync = false;
     FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -411,16 +432,17 @@
           [yield] let dynamic #t14 = dart.async::_awaitHelper(b::b(), :async_op_then, :async_op_error, :async_op) in null;
           :result;
         }
-        dart.async::_completeOnAsyncReturn(:async_completer, :return_value);
+        dart.async::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, dart.core::StackTrace* stack_trace) {
-        :async_completer.{dart.async::Completer::completeError}(exception, stack_trace);
+        dart.async::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = dart.async::_asyncStackTraceHelper(:async_op);
     :async_op_then = dart.async::_asyncThenWrapperHelper(:async_op);
     :async_op_error = dart.async::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{dart.async::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{dart.async::Completer::future};
+    [@vm.call-site-attributes.metadata=receiverType:dynamic Function([dynamic, dynamic, dart.core::StackTrace*])*] :async_op.call();
+    :is_sync = true;
+    return :async_future;
   }
 }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/annotation.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/annotation.dart.expect
index a67cf66..28378be 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/annotation.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/annotation.dart.expect
@@ -28,7 +28,7 @@
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:4,getterSelectorId:5]  @#C8
   method instanceMethod() → void {}
 }
-[@vm.unboxing-info.metadata=(b)->i]static method foo([@vm.inferred-type.metadata=dart.core::Null? (value: null)] (core::List<core::int*>*) →* void a) → core::int* {
+[@vm.unboxing-info.metadata=()->i]static method foo() → core::int* {
   @#C9 core::int* x = 2;
   return [@vm.direct-call.metadata=dart.core::_IntegerImplementation.+] [@vm.inferred-type.metadata=int (skip check)] x.{core::num::+}(2);
 }
@@ -36,5 +36,5 @@
 static method main(core::List<core::String*>* args) → dynamic {
   self::A::staticMethod();
   [@vm.direct-call.metadata=#lib::B.instanceMethod] [@vm.inferred-type.metadata=!? (skip check)] new self::B::•().{self::B::instanceMethod}();
-  self::foo(null);
+  self::foo();
 }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/async_await.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/async_await.dart.expect
index 92436bf..f1dfad8 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/async_await.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/async_await.dart.expect
@@ -9,7 +9,8 @@
     : super core::Object::•()
     ;
 [@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2]  method bar(dynamic x) → asy::Future<dynamic>* /* originally async */ {
-    final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    final asy::_Future<dynamic>* :async_future = new asy::_Future::•<dynamic>();
+    core::bool* :is_sync = false;
     FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     (dynamic) →* dynamic :async_op_then;
@@ -23,17 +24,18 @@
           :return_value = [@vm.inferred-type.metadata=dart.core::Null? (value: null)] core::print(x);
           break #L1;
         }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
         return;
       }
       on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-        [@vm.direct-call.metadata=dart.async::_AsyncAwaitCompleter.completeError] [@vm.inferred-type.metadata=!? (skip check)] :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+        asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    [@vm.direct-call.metadata=dart.async::_AsyncAwaitCompleter.start] [@vm.inferred-type.metadata=!? (skip check)] :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-    return [@vm.direct-call.metadata=dart.async::_AsyncAwaitCompleter.future] [@vm.inferred-type.metadata=dart.async::_Future] :async_completer.{asy::Completer::future};
+    [@vm.call-site-attributes.metadata=receiverType:dynamic Function([dynamic, dynamic, dart.core::StackTrace*])*] :async_op.call();
+    :is_sync = true;
+    return :async_future;
   }
 }
 class B extends core::Object {
@@ -44,7 +46,8 @@
 static method foo() → dynamic
   return new self::A::•();
 static method baz() → asy::Future<dynamic>* /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic>* :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -58,20 +61,22 @@
         :return_value = new self::B::•();
         break #L2;
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      [@vm.direct-call.metadata=dart.async::_AsyncAwaitCompleter.completeError] [@vm.inferred-type.metadata=!? (skip check)] :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  [@vm.direct-call.metadata=dart.async::_AsyncAwaitCompleter.start] [@vm.inferred-type.metadata=!? (skip check)] :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return [@vm.direct-call.metadata=dart.async::_AsyncAwaitCompleter.future] [@vm.inferred-type.metadata=dart.async::_Future] :async_completer.{asy::Completer::future};
+  [@vm.call-site-attributes.metadata=receiverType:dynamic Function([dynamic, dynamic, dart.core::StackTrace*])*] :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
 static method main() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  final asy::_Future<dynamic>* :async_future = new asy::_Future::•<dynamic>();
+  core::bool* :is_sync = false;
   FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   (dynamic) →* dynamic :async_op_then;
@@ -85,19 +90,20 @@
       #L3:
       {
         :async_temporary_0 = [@vm.inferred-type.metadata=#lib::A] self::foo();
-        [yield] let dynamic #t1 = asy::_awaitHelper([@vm.inferred-type.metadata=dart.async::_Future] self::baz(), :async_op_then, :async_op_error, :async_op) in null;
-        [yield] let dynamic #t2 = asy::_awaitHelper([@vm.direct-call.metadata=#lib::A.bar??] [@vm.inferred-type.metadata=dart.async::_Future (receiver not int)] _in::unsafeCast<dynamic>(:async_temporary_0).bar(:result), :async_op_then, :async_op_error, :async_op) in null;
+        [yield] let dynamic #t1 = asy::_awaitHelper([@vm.inferred-type.metadata=dart.async::_Future<dynamic>] self::baz(), :async_op_then, :async_op_error, :async_op) in null;
+        [yield] let dynamic #t2 = asy::_awaitHelper([@vm.direct-call.metadata=#lib::A.bar??] [@vm.inferred-type.metadata=dart.async::_Future<dynamic> (receiver not int)] _in::unsafeCast<dynamic>(:async_temporary_0).bar(:result), :async_op_then, :async_op_error, :async_op) in null;
         :result;
       }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
     }
     on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
-      [@vm.direct-call.metadata=dart.async::_AsyncAwaitCompleter.completeError] [@vm.inferred-type.metadata=!? (skip check)] :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  [@vm.direct-call.metadata=dart.async::_AsyncAwaitCompleter.start] [@vm.inferred-type.metadata=!? (skip check)] :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
-  return [@vm.direct-call.metadata=dart.async::_AsyncAwaitCompleter.future] [@vm.inferred-type.metadata=dart.async::_Future] :async_completer.{asy::Completer::future};
+  [@vm.call-site-attributes.metadata=receiverType:dynamic Function([dynamic, dynamic, dart.core::StackTrace*])*] :async_op.call();
+  :is_sync = true;
+  return :async_future;
 }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/const_prop.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/const_prop.dart.expect
index 76d2329..8d122c1 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/const_prop.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/const_prop.dart.expect
@@ -20,11 +20,11 @@
 [@vm.unboxing-info.metadata=(i)->b]static method test0([@vm.inferred-type.metadata=dart.core::_Smi (value: 40)] core::int* arg) → void {
   core::print(arg);
 }
-static method test1([[@vm.inferred-type.metadata=dart.core::_Smi (value: 42)] core::int* arg = #C1]) → void {
-  core::print(arg);
+static method test1() → void {
+  core::print(#C1);
 }
-static method test2({[@vm.inferred-type.metadata=dart.core::_Smi (value: 43)] core::int* arg = #C2}) → void {
-  core::print(arg);
+static method test2() → void {
+  core::print(#C2);
 }
 [@vm.unboxing-info.metadata=()->d]static get getD() → dynamic
   return 100.0;
@@ -45,9 +45,9 @@
 }
 static method getList() → dynamic
   return #C6;
-static method testList([@vm.inferred-type.metadata=dart.core::_ImmutableList (value: const <dart.core::int*>[1, 2, 3])] dynamic arg1, [[@vm.inferred-type.metadata=dart.core::_ImmutableList (value: const <dart.core::int*>[4, 5])] dynamic arg2 = #C9]) → void {
+static method testList([@vm.inferred-type.metadata=dart.core::_ImmutableList (value: const <dart.core::int*>[1, 2, 3])] dynamic arg1) → void {
   core::print(arg1);
-  core::print(arg2);
+  core::print(#C9);
 }
 static method main() → dynamic {
   self::test0(40);
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/devirt.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/devirt.dart.expect
index 4c6d0e1..79e29be 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/devirt.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/devirt.dart.expect
@@ -58,7 +58,7 @@
   self::callerA1(new self::B::•());
   self::callerA1(new self::C::•());
   self::callerA2(new self::B::•());
-  let self::C* #t1 = new self::C::•() in self::callerA3(#t1);
+  let final self::C* #t1 = new self::C::•() in self::callerA3(#t1);
   self::callerA4([@vm.inferred-type.metadata=#lib::D?] self::dd);
   self::dd = new self::D::•();
   self::callerE1("abc");
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/future_or.dart b/pkg/vm/testcases/transformations/type_flow/transformer/future_or.dart
index 3fb1a95..f253547 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/future_or.dart
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/future_or.dart
@@ -4,14 +4,31 @@
 
 import 'dart:async';
 
+dynamic usedObject;
+
+void use(dynamic object) {
+  usedObject ??= object;
+}
+
 class A {}
 
 class B extends A {}
 
-void foo1_a1(x) {}
-void foo1_a2(x) {}
-void foo1_a3(x) {}
-void foo1_a4(x) {}
+void foo1_a1(x) {
+  use(x);
+}
+
+void foo1_a2(x) {
+  use(x);
+}
+
+void foo1_a3(x) {
+  use(x);
+}
+
+void foo1_a4(x) {
+  use(x);
+}
 
 void foo1(Future<A> a1, A a2, FutureOr<A> a3, FutureOr<A> a4) {
   foo1_a1(a1);
@@ -20,10 +37,21 @@
   foo1_a4(a4);
 }
 
-void foo2_a1(x) {}
-void foo2_a2(x) {}
-void foo2_a3(x) {}
-void foo2_a4(x) {}
+void foo2_a1(x) {
+  use(x);
+}
+
+void foo2_a2(x) {
+  use(x);
+}
+
+void foo2_a3(x) {
+  use(x);
+}
+
+void foo2_a4(x) {
+  use(x);
+}
 
 void foo2(Future<A> a1, A a2, FutureOr<A> a3, FutureOr<A> a4) {
   foo2_a1(a1);
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/future_or.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/future_or.dart.expect
index be9cfcc..32c6fb4 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/future_or.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/future_or.dart.expect
@@ -15,21 +15,41 @@
     : super self::A::•()
     ;
 }
+static field dynamic usedObject;
 [@vm.inferred-type.metadata=dart.core::Null? (value: null)]static field core::Function* unknown;
-static method foo1_a1([@vm.inferred-type.metadata=dart.async::_Future<#lib::B*>] dynamic x) → void {}
-static method foo1_a2([@vm.inferred-type.metadata=#lib::B] dynamic x) → void {}
-static method foo1_a3([@vm.inferred-type.metadata=dart.async::_Future<#lib::B*>] dynamic x) → void {}
-static method foo1_a4([@vm.inferred-type.metadata=#lib::B] dynamic x) → void {}
+static method use(dynamic object) → void {
+  [@vm.inferred-type.metadata=!? (receiver not int)] self::usedObject.{core::Object::==}(null) ?{dynamic} self::usedObject = object : null;
+}
+static method foo1_a1([@vm.inferred-type.metadata=dart.async::_Future<#lib::B*>] dynamic x) → void {
+  self::use(x);
+}
+static method foo1_a2([@vm.inferred-type.metadata=#lib::B] dynamic x) → void {
+  self::use(x);
+}
+static method foo1_a3([@vm.inferred-type.metadata=dart.async::_Future<#lib::B*>] dynamic x) → void {
+  self::use(x);
+}
+static method foo1_a4([@vm.inferred-type.metadata=#lib::B] dynamic x) → void {
+  self::use(x);
+}
 static method foo1([@vm.inferred-type.metadata=dart.async::_Future<#lib::B*>] asy::Future<self::A*>* a1, [@vm.inferred-type.metadata=#lib::B] self::A* a2, [@vm.inferred-type.metadata=dart.async::_Future<#lib::B*>] FutureOr<self::A*>* a3, [@vm.inferred-type.metadata=#lib::B] FutureOr<self::A*>* a4) → void {
   self::foo1_a1(a1);
   self::foo1_a2(a2);
   self::foo1_a3(a3);
   self::foo1_a4(a4);
 }
-static method foo2_a1([@vm.inferred-type.metadata=dart.async::_Future?] dynamic x) → void {}
-static method foo2_a2([@vm.inferred-type.metadata=#lib::B?] dynamic x) → void {}
-static method foo2_a3(dynamic x) → void {}
-static method foo2_a4(dynamic x) → void {}
+static method foo2_a1([@vm.inferred-type.metadata=dart.async::_Future?] dynamic x) → void {
+  self::use(x);
+}
+static method foo2_a2([@vm.inferred-type.metadata=#lib::B?] dynamic x) → void {
+  self::use(x);
+}
+static method foo2_a3(dynamic x) → void {
+  self::use(x);
+}
+static method foo2_a4(dynamic x) → void {
+  self::use(x);
+}
 static method foo2([@vm.inferred-type.metadata=dart.async::_Future?] asy::Future<self::A*>* a1, [@vm.inferred-type.metadata=#lib::B?] self::A* a2, FutureOr<self::A*>* a3, FutureOr<self::A*>* a4) → void {
   self::foo2_a1(a1);
   self::foo2_a2(a2);
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_cycle.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_cycle.dart.expect
index 089aa81..387080e 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_cycle.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_cycle.dart.expect
@@ -67,8 +67,8 @@
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:9,getterSelectorId:10]  method super_foobar2([@vm.inferred-type.metadata=dart.core::Null? (value: null)] (dynamic) →* void onData) → dynamic {
     super.{self::StreamView::foobar}(onData);
   }
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:11,getterSelectorId:12]  method super_foobar3({[@vm.inferred-type.metadata=dart.core::Null? (value: null)] (dynamic) →* void onData = #C1, [@vm.inferred-type.metadata=dart.core::Null? (value: null)] core::Function* onError = #C1}) → dynamic {
-    super.{self::StreamView::foobar}(onData, onError: onError);
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:11,getterSelectorId:12]  method super_foobar3() → dynamic {
+    super.{self::StreamView::foobar}(#C1, onError: #C1);
   }
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:13]  get super_stream() → self::Stream*
     return [@vm.inferred-type.metadata=!] super.{self::StreamView::_stream};
@@ -81,28 +81,28 @@
 static method round0() → void {
   new self::ByteStream::•(new self::ByteStream::•(new self::_GeneratedStreamImpl::•()));
 }
-static method round1({[@vm.inferred-type.metadata=dart.core::Null? (value: null)] (dynamic) →* void onData = #C1}) → void {
+static method round1() → void {
   self::ByteStream* x = new self::ByteStream::•(new self::ByteStream::•(new self::_GeneratedStreamImpl::•()));
-  [@vm.direct-call.metadata=#lib::ByteStream.super_foobar1] [@vm.inferred-type.metadata=!? (skip check)] x.{self::ByteStream::super_foobar1}(onData);
+  [@vm.direct-call.metadata=#lib::ByteStream.super_foobar1] [@vm.inferred-type.metadata=!? (skip check)] x.{self::ByteStream::super_foobar1}(#C1);
 }
-static method round2({[@vm.inferred-type.metadata=dart.core::Null? (value: null)] (dynamic) →* void onData = #C1, [@vm.inferred-type.metadata=dart.core::Null? (value: null)] core::Function* onError = #C1}) → void {
+static method round2() → void {
   new self::_ControllerStream::•();
   self::Stream* x = new self::_GeneratedStreamImpl::•();
   x = new self::ByteStream::•(x);
-  [@vm.direct-call.metadata=#lib::StreamView.foobar] [@vm.inferred-type.metadata=!? (skip check)] x.{self::Stream::foobar}(onData, onError: onError);
+  [@vm.direct-call.metadata=#lib::StreamView.foobar] [@vm.inferred-type.metadata=!? (skip check)] x.{self::Stream::foobar}(#C1, onError: #C1);
 }
-static method round3({[@vm.inferred-type.metadata=dart.core::Null? (value: null)] (dynamic) →* void onData = #C1, [@vm.inferred-type.metadata=dart.core::Null? (value: null)] core::Function* onError = #C1}) → void {
+static method round3() → void {
   self::Stream* x = new self::_GeneratedStreamImpl::•();
   x = new self::ByteStream::•(x);
   x = new self::_ControllerStream::•();
-  [@vm.direct-call.metadata=#lib::_StreamImpl.foobar] [@vm.inferred-type.metadata=!? (skip check)] x.{self::Stream::foobar}(onData, onError: onError);
+  [@vm.direct-call.metadata=#lib::_StreamImpl.foobar] [@vm.inferred-type.metadata=!? (skip check)] x.{self::Stream::foobar}(#C1, onError: #C1);
 }
-static method round4({[@vm.inferred-type.metadata=dart.core::Null? (value: null)] (dynamic) →* void onData = #C1}) → void {
+static method round4() → void {
   self::ByteStream* x = new self::ByteStream::•(new self::_ControllerStream::•());
   self::Stream* y = [@vm.direct-call.metadata=#lib::ByteStream.super_stream] [@vm.inferred-type.metadata=!] x.{self::ByteStream::super_stream};
   self::Stream* z = [@vm.direct-call.metadata=#lib::StreamView._stream] [@vm.inferred-type.metadata=!] x.{self::StreamView::_stream};
   if([@vm.direct-call.metadata=dart.core::Object.==] [@vm.inferred-type.metadata=dart.core::bool (skip check)] y.{self::Stream::==}(z)) {
-    [@vm.direct-call.metadata=#lib::ByteStream.super_foobar2] [@vm.inferred-type.metadata=!? (skip check)] x.{self::ByteStream::super_foobar2}(onData);
+    [@vm.direct-call.metadata=#lib::ByteStream.super_foobar2] [@vm.inferred-type.metadata=!? (skip check)] x.{self::ByteStream::super_foobar2}(#C1);
   }
 }
 static method round5() → void {
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/lists.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/lists.dart.expect
index a639710..0fd6e10 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/lists.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/lists.dart.expect
@@ -13,15 +13,15 @@
 [@vm.inferred-type.metadata=dart.core::_List<dart.core::int*>] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:7]  final field core::List<core::int*>* filledFactory1 = [@vm.inferred-type.metadata=dart.core::_List<dart.core::int*>] core::_List::filled<core::int*>(2, 0);
 [@vm.inferred-type.metadata=dart.core::_GrowableList<dart.core::int*>] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:8]  final field core::List<core::int*>* filledFactory2 = [@vm.inferred-type.metadata=dart.core::_GrowableList<dart.core::int*>] core::_GrowableList::filled<core::int*>(2, 0);
 [@vm.inferred-type.metadata=dart.core::_List<dart.core::int*>] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:9]  final field core::List<core::int*>* filledFactory3 = [@vm.inferred-type.metadata=dart.core::_List<dart.core::int*>] core::_List::filled<core::int*>(2, 0);
-[@vm.inferred-type.metadata=!] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:10]  final field core::List<core::int*>* filledFactory4 = let core::int* #t1 = 2 in let core::int* #t2 = 0 in let core::bool #t3 = _in::unsafeCast<core::bool>([@vm.inferred-type.metadata=dart.core::bool] self::nonConstant()) in [@vm.inferred-type.metadata=!] core::List::filled<core::int*>(#t1, #t2, #t3);
+[@vm.inferred-type.metadata=!] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:10]  final field core::List<core::int*>* filledFactory4 = let final core::bool #t1 = _in::unsafeCast<core::bool>([@vm.inferred-type.metadata=dart.core::bool] self::nonConstant()) in [@vm.inferred-type.metadata=!] core::List::filled<core::int*>(2, 0, #t1);
 [@vm.inferred-type.metadata=dart.core::_List<dart.core::int*>] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:11]  final field core::List<core::int*>* filledFactory5 = [@vm.inferred-type.metadata=dart.core::_List<dart.core::int*>] core::_List::•<core::int*>(2);
 [@vm.inferred-type.metadata=dart.core::_GrowableList<dart.core::int*>] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:12]  final field core::List<core::int*>* filledFactory6 = [@vm.inferred-type.metadata=dart.core::_GrowableList<dart.core::int*>] core::_GrowableList::•<core::int*>(2);
 [@vm.inferred-type.metadata=dart.core::_List<dart.core::int*>] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:13]  final field core::List<core::int*>* filledFactory7 = [@vm.inferred-type.metadata=dart.core::_List<dart.core::int*>] core::_List::•<core::int*>(2);
-[@vm.inferred-type.metadata=!] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:14]  final field core::List<core::int*>* filledFactory8 = let core::int* #t4 = 2 in let core::Null? #t5 = null in let core::bool #t6 = _in::unsafeCast<core::bool>([@vm.inferred-type.metadata=dart.core::bool] self::nonConstant()) in [@vm.inferred-type.metadata=!] core::List::filled<core::int*>(#t4, #t5, #t6);
+[@vm.inferred-type.metadata=!] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:14]  final field core::List<core::int*>* filledFactory8 = let final core::bool #t2 = _in::unsafeCast<core::bool>([@vm.inferred-type.metadata=dart.core::bool] self::nonConstant()) in [@vm.inferred-type.metadata=!] core::List::filled<core::int*>(2, null, #t2);
 [@vm.inferred-type.metadata=dart.core::_GrowableList<dart.core::int*>] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:15]  final field core::List<core::int*>* generateFactory1 = [@vm.inferred-type.metadata=dart.core::_GrowableList<dart.core::int*>] core::_GrowableList::generate<core::int*>(2, (core::int* i) → core::int* => i);
 [@vm.inferred-type.metadata=dart.core::_GrowableList<dart.core::int*>] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:16]  final field core::List<core::int*>* generateFactory2 = [@vm.inferred-type.metadata=dart.core::_GrowableList<dart.core::int*>] core::_GrowableList::generate<core::int*>(2, (core::int* i) → core::int* => i);
 [@vm.inferred-type.metadata=dart.core::_List<dart.core::int*>] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:17]  final field core::List<core::int*>* generateFactory3 = [@vm.inferred-type.metadata=dart.core::_List<dart.core::int*>] core::_List::generate<core::int*>(2, (core::int* i) → core::int* => i);
-[@vm.inferred-type.metadata=!] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:18]  final field core::List<core::int*>* generateFactory4 = let core::int* #t7 = 2 in let (core::int*) →* core::int* #t8 = (core::int* i) → core::int* => i in let core::bool #t9 = _in::unsafeCast<core::bool>([@vm.inferred-type.metadata=dart.core::bool] self::nonConstant()) in [@vm.inferred-type.metadata=!] core::List::generate<core::int*>(#t7, #t8, #t9);
+[@vm.inferred-type.metadata=!] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:18]  final field core::List<core::int*>* generateFactory4 = let final (core::int*) →* core::int* #t3 = (core::int* i) → core::int* => i in let final core::bool #t4 = _in::unsafeCast<core::bool>([@vm.inferred-type.metadata=dart.core::bool] self::nonConstant()) in [@vm.inferred-type.metadata=!] core::List::generate<core::int*>(2, #t3, #t4);
 [@vm.inferred-type.metadata=dart.core::_GrowableList<dart.core::List<dart.core::int*>*>] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:19]  final field core::List<core::List<core::int*>*>* generateFactory5 = [@vm.inferred-type.metadata=dart.core::_GrowableList<dart.core::List<dart.core::int*>*>] core::_GrowableList::generate<core::List<core::int*>*>(2, (core::int* _) → core::List<core::int*>* => <core::int*>[]);
   synthetic constructor •() → self::A*
     : super core::Object::•()
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/lists_nnbd.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/lists_nnbd.dart.expect
index fa6d7c9..8a54bb1 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/lists_nnbd.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/lists_nnbd.dart.expect
@@ -11,15 +11,15 @@
 [@vm.inferred-type.metadata=dart.core::_List<dart.core::int>] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:5]  final field core::List<core::int> filledFactory1 = [@vm.inferred-type.metadata=dart.core::_List<dart.core::int>] core::_List::filled<core::int>(2, 0);
 [@vm.inferred-type.metadata=dart.core::_GrowableList<dart.core::int>] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:6]  final field core::List<core::int> filledFactory2 = [@vm.inferred-type.metadata=dart.core::_GrowableList<dart.core::int>] core::_GrowableList::filled<core::int>(2, 0);
 [@vm.inferred-type.metadata=dart.core::_List<dart.core::int>] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:7]  final field core::List<core::int> filledFactory3 = [@vm.inferred-type.metadata=dart.core::_List<dart.core::int>] core::_List::filled<core::int>(2, 0);
-[@vm.inferred-type.metadata=!] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:8]  final field core::List<core::int> filledFactory4 = let core::int #t1 = 2 in let core::int #t2 = 0 in let core::bool #t3 = _in::unsafeCast<core::bool>([@vm.inferred-type.metadata=dart.core::bool] self::nonConstant()) in [@vm.inferred-type.metadata=!] core::List::filled<core::int>(#t1, #t2, #t3);
+[@vm.inferred-type.metadata=!] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:8]  final field core::List<core::int> filledFactory4 = let final core::bool #t1 = _in::unsafeCast<core::bool>([@vm.inferred-type.metadata=dart.core::bool] self::nonConstant()) in [@vm.inferred-type.metadata=!] core::List::filled<core::int>(2, 0, #t1);
 [@vm.inferred-type.metadata=dart.core::_List<dart.core::int?>] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:9]  final field core::List<core::int?> filledFactory5 = [@vm.inferred-type.metadata=dart.core::_List<dart.core::int?>] core::_List::•<core::int?>(2);
 [@vm.inferred-type.metadata=dart.core::_GrowableList<dart.core::int?>] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:10]  final field core::List<core::int?> filledFactory6 = [@vm.inferred-type.metadata=dart.core::_GrowableList<dart.core::int?>] core::_GrowableList::•<core::int?>(2);
 [@vm.inferred-type.metadata=dart.core::_List<dart.core::int?>] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:11]  final field core::List<core::int?> filledFactory7 = [@vm.inferred-type.metadata=dart.core::_List<dart.core::int?>] core::_List::•<core::int?>(2);
-[@vm.inferred-type.metadata=!] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:12]  final field core::List<core::int?> filledFactory8 = let core::int #t4 = 2 in let core::Null? #t5 = null in let core::bool #t6 = _in::unsafeCast<core::bool>([@vm.inferred-type.metadata=dart.core::bool] self::nonConstant()) in [@vm.inferred-type.metadata=!] core::List::filled<core::int?>(#t4, #t5, #t6);
+[@vm.inferred-type.metadata=!] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:12]  final field core::List<core::int?> filledFactory8 = let final core::bool #t2 = _in::unsafeCast<core::bool>([@vm.inferred-type.metadata=dart.core::bool] self::nonConstant()) in [@vm.inferred-type.metadata=!] core::List::filled<core::int?>(2, null, #t2);
 [@vm.inferred-type.metadata=dart.core::_GrowableList<dart.core::int>] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:13]  final field core::List<core::int> generateFactory1 = [@vm.inferred-type.metadata=dart.core::_GrowableList<dart.core::int>] core::_GrowableList::generate<core::int>(2, (core::int i) → core::int => i);
 [@vm.inferred-type.metadata=dart.core::_GrowableList<dart.core::int>] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:14]  final field core::List<core::int> generateFactory2 = [@vm.inferred-type.metadata=dart.core::_GrowableList<dart.core::int>] core::_GrowableList::generate<core::int>(2, (core::int i) → core::int => i);
 [@vm.inferred-type.metadata=dart.core::_List<dart.core::int>] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:15]  final field core::List<core::int> generateFactory3 = [@vm.inferred-type.metadata=dart.core::_List<dart.core::int>] core::_List::generate<core::int>(2, (core::int i) → core::int => i);
-[@vm.inferred-type.metadata=!] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:16]  final field core::List<core::int> generateFactory4 = let core::int #t7 = 2 in let (core::int) → core::int #t8 = (core::int i) → core::int => i in let core::bool #t9 = _in::unsafeCast<core::bool>([@vm.inferred-type.metadata=dart.core::bool] self::nonConstant()) in [@vm.inferred-type.metadata=!] core::List::generate<core::int>(#t7, #t8, #t9);
+[@vm.inferred-type.metadata=!] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:16]  final field core::List<core::int> generateFactory4 = let final (core::int) → core::int #t3 = (core::int i) → core::int => i in let final core::bool #t4 = _in::unsafeCast<core::bool>([@vm.inferred-type.metadata=dart.core::bool] self::nonConstant()) in [@vm.inferred-type.metadata=!] core::List::generate<core::int>(2, #t3, #t4);
 [@vm.inferred-type.metadata=dart.core::_GrowableList<dart.core::List<dart.core::int>>] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:17]  final field core::List<core::List<core::int>> generateFactory5 = [@vm.inferred-type.metadata=dart.core::_GrowableList<dart.core::List<dart.core::int>>] core::_GrowableList::generate<core::List<core::int>>(2, (core::int _) → core::List<core::int> => <core::int>[]);
   synthetic constructor •() → self::A
     : super core::Object::•()
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/named_params_shaking_test.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/named_params_shaking_test.dart.expect
index 1eb445c..4aff357 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/named_params_shaking_test.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/named_params_shaking_test.dart.expect
@@ -9,15 +9,15 @@
 import "package:expect/expect.dart";
 
 abstract class TestNamedOrderBase extends core::Object {
-[@vm.unboxing-info.metadata=(i)->b]  constructor •([@vm.inferred-type.metadata=int] dynamic w, [@vm.inferred-type.metadata=int] core::int* x, [@vm.inferred-type.metadata=int] core::int* y, [@vm.inferred-type.metadata=int] core::int* z) → self::TestNamedOrderBase*
+[@vm.unboxing-info.metadata=(i,i,i,i)->b]  constructor •([@vm.inferred-type.metadata=int] dynamic w, [@vm.inferred-type.metadata=int] core::int* x, [@vm.inferred-type.metadata=int] core::int* y, [@vm.inferred-type.metadata=int] core::int* z) → self::TestNamedOrderBase*
     : super core::Object::•() {
-    let core::int* #t1 = _in::unsafeCast<core::int*>(w) in let core::int* #t2 = z in let core::int* #t3 = y in let core::int* #t4 = x in self::testNamedOrder(#t1, #t4, #t3, #t2);
+    self::testNamedOrder(_in::unsafeCast<core::int*>(w), x, y, z);
   }
 }
 class TestNamedOrderSub extends self::TestNamedOrderBase {
 [@vm.inferred-type.metadata=int] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2] [@vm.unboxing-info.metadata=(i)->i]  field core::int* x;
   constructor •() → self::TestNamedOrderSub*
-    : self::TestNamedOrderSub::x = [@vm.inferred-type.metadata=int] self::dec(), dynamic #t5 = [@vm.inferred-type.metadata=int] self::inc(), dynamic #t6 = [@vm.inferred-type.metadata=int] self::inc(), dynamic #t7 = [@vm.inferred-type.metadata=int] self::inc(), dynamic #t8 = [@vm.inferred-type.metadata=int] self::dec(), super self::TestNamedOrderBase::•(#t5, #t8, #t7, #t6) {
+    : self::TestNamedOrderSub::x = [@vm.inferred-type.metadata=int] self::dec(), final core::int* #t1 = [@vm.inferred-type.metadata=int] self::inc(), final core::int* #t2 = [@vm.inferred-type.metadata=int] self::inc(), final core::int* #t3 = [@vm.inferred-type.metadata=int] self::inc(), final core::int* #t4 = [@vm.inferred-type.metadata=int] self::dec(), super self::TestNamedOrderBase::•(#t1, #t4, #t3, #t2) {
     exp::Expect::equals([@vm.direct-call.metadata=#lib::TestNamedOrderSub.x] [@vm.inferred-type.metadata=int] this.{self::TestNamedOrderSub::x}, 0);
   }
 }
@@ -26,14 +26,14 @@
   return self::global = [@vm.direct-call.metadata=dart.core::_IntegerImplementation.+??] [@vm.inferred-type.metadata=int (skip check)] [@vm.inferred-type.metadata=int?] self::global.{core::num::+}(1);
 [@vm.unboxing-info.metadata=()->i]static method dec() → core::int*
   return self::global = [@vm.inferred-type.metadata=int] math::max<core::int*>(0, self::global = [@vm.direct-call.metadata=dart.core::_IntegerImplementation.-??] [@vm.inferred-type.metadata=int (skip check)] [@vm.inferred-type.metadata=int?] self::global.{core::num::-}(1));
-[@vm.unboxing-info.metadata=(i)->b]static method testNamedOrder([@vm.inferred-type.metadata=int] core::int* w, [@vm.inferred-type.metadata=int] core::int* x, [@vm.inferred-type.metadata=int] core::int* y, [@vm.inferred-type.metadata=int] core::int* z) → void {
+[@vm.unboxing-info.metadata=(i,i,i,i)->b]static method testNamedOrder([@vm.inferred-type.metadata=int] core::int* w, [@vm.inferred-type.metadata=int] core::int* x, [@vm.inferred-type.metadata=int] core::int* y, [@vm.inferred-type.metadata=int] core::int* z) → void {
   exp::Expect::equals(w, 1);
   exp::Expect::equals(z, 2);
   exp::Expect::equals(y, 3);
   exp::Expect::equals(x, 2);
 }
 static method main() → dynamic {
-  let core::int* #t9 = [@vm.inferred-type.metadata=int] self::inc() in let core::int* #t10 = [@vm.inferred-type.metadata=int] self::inc() in let core::int* #t11 = [@vm.inferred-type.metadata=int] self::inc() in let core::int* #t12 = [@vm.inferred-type.metadata=int] self::dec() in self::testNamedOrder(#t9, #t12, #t11, #t10);
+  let final core::int* #t5 = [@vm.inferred-type.metadata=int] self::inc() in let final core::int* #t6 = [@vm.inferred-type.metadata=int] self::inc() in let final core::int* #t7 = [@vm.inferred-type.metadata=int] self::inc() in let final core::int* #t8 = [@vm.inferred-type.metadata=int] self::dec() in self::testNamedOrder(#t5, #t8, #t7, #t6);
   self::global = 1;
   new self::TestNamedOrderSub::•();
 }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/no_such_method.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/no_such_method.dart.expect
index c1f1292e..5b69347 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/no_such_method.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/no_such_method.dart.expect
@@ -39,7 +39,7 @@
     ;
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2]  abstract method foo() → dynamic;
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:3]  abstract get bar() → dynamic;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:4,getterSelectorId:5] [@vm.unboxing-info.metadata=(i,i,i)->b]  abstract method bazz(dynamic a1, dynamic a2, dynamic a3, [dynamic a4 = #C1, dynamic a5 = #C1]) → dynamic;
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:4,getterSelectorId:5] [@vm.unboxing-info.metadata=(i,i,i,i)->b]  abstract method bazz(dynamic a1, dynamic a2, dynamic a3, dynamic a4) → dynamic;
 }
 class B extends self::A {
   synthetic constructor •() → self::B*
@@ -49,11 +49,11 @@
     return new self::T1::•();
   }
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:3]  no-such-method-forwarder get bar() → dynamic
-    return _in::unsafeCast<dynamic>([@vm.direct-call.metadata=#lib::B.noSuchMethod] [@vm.inferred-type.metadata=#lib::T1 (skip check)] this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#C2, 1, #C3, #C4, [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol*, dynamic>] core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))));
+    return _in::unsafeCast<dynamic>([@vm.direct-call.metadata=#lib::B.noSuchMethod] [@vm.inferred-type.metadata=#lib::T1 (skip check)] this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 1, #C2, #C3, [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol*, dynamic>] core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))));
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2]  no-such-method-forwarder method foo() → dynamic
-    return _in::unsafeCast<dynamic>([@vm.direct-call.metadata=#lib::B.noSuchMethod] [@vm.inferred-type.metadata=#lib::T1 (skip check)] this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#C6, 0, #C3, #C4, [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol*, dynamic>] core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))));
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:4,getterSelectorId:5] [@vm.unboxing-info.metadata=(i,i,i)->b]  no-such-method-forwarder method bazz([@vm.inferred-type.metadata=dart.core::_Smi (value: 1)] dynamic a1, [@vm.inferred-type.metadata=dart.core::_Smi (value: 2)] dynamic a2, [@vm.inferred-type.metadata=dart.core::_Smi (value: 3)] dynamic a3, [[@vm.inferred-type.metadata=dart.core::_Smi (value: 4)] dynamic a4 = #C1, [@vm.inferred-type.metadata=dart.core::Null? (value: null)] dynamic a5 = #C1]) → dynamic
-    return _in::unsafeCast<dynamic>([@vm.direct-call.metadata=#lib::B.noSuchMethod] [@vm.inferred-type.metadata=#lib::T1 (skip check)] this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#C7, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[a1, a2, a3, a4, a5]), [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol*, dynamic>] core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))));
+    return _in::unsafeCast<dynamic>([@vm.direct-call.metadata=#lib::B.noSuchMethod] [@vm.inferred-type.metadata=#lib::T1 (skip check)] this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#C5, 0, #C2, #C3, [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol*, dynamic>] core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))));
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:4,getterSelectorId:5] [@vm.unboxing-info.metadata=(i,i,i,i)->b]  no-such-method-forwarder method bazz([@vm.inferred-type.metadata=dart.core::_Smi (value: 1)] dynamic a1, [@vm.inferred-type.metadata=dart.core::_Smi (value: 2)] dynamic a2, [@vm.inferred-type.metadata=dart.core::_Smi (value: 3)] dynamic a3, [@vm.inferred-type.metadata=dart.core::_Smi (value: 4)] dynamic a4) → dynamic
+    return _in::unsafeCast<dynamic>([@vm.direct-call.metadata=#lib::B.noSuchMethod] [@vm.inferred-type.metadata=#lib::T1 (skip check)] this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#C6, 0, #C2, core::List::unmodifiable<dynamic>(<dynamic>[a1, a2, a3, a4, #C7]), [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol*, dynamic>] core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))));
 }
 abstract class C extends core::Object {
   synthetic constructor •() → self::C*
@@ -68,11 +68,11 @@
     : super self::C::•()
     ;
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:3]  no-such-method-forwarder get bar() → dynamic
-    return _in::unsafeCast<dynamic>([@vm.direct-call.metadata=#lib::C.noSuchMethod] [@vm.inferred-type.metadata=#lib::T2 (skip check)] this.{self::C::noSuchMethod}(new core::_InvocationMirror::_withType(#C2, 1, #C3, #C4, [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol*, dynamic>] core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))));
+    return _in::unsafeCast<dynamic>([@vm.direct-call.metadata=#lib::C.noSuchMethod] [@vm.inferred-type.metadata=#lib::T2 (skip check)] this.{self::C::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 1, #C2, #C3, [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol*, dynamic>] core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))));
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2]  no-such-method-forwarder method foo() → dynamic
-    return _in::unsafeCast<dynamic>([@vm.direct-call.metadata=#lib::C.noSuchMethod] [@vm.inferred-type.metadata=#lib::T2 (skip check)] this.{self::C::noSuchMethod}(new core::_InvocationMirror::_withType(#C6, 0, #C3, #C4, [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol*, dynamic>] core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))));
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:4,getterSelectorId:5] [@vm.unboxing-info.metadata=(i,i,i)->b]  no-such-method-forwarder method bazz([@vm.inferred-type.metadata=dart.core::_Smi (value: 1)] dynamic a1, [@vm.inferred-type.metadata=dart.core::_Smi (value: 2)] dynamic a2, [@vm.inferred-type.metadata=dart.core::_Smi (value: 3)] dynamic a3, [[@vm.inferred-type.metadata=dart.core::_Smi (value: 4)] dynamic a4 = #C1, [@vm.inferred-type.metadata=dart.core::Null? (value: null)] dynamic a5 = #C1]) → dynamic
-    return _in::unsafeCast<dynamic>([@vm.direct-call.metadata=#lib::C.noSuchMethod] [@vm.inferred-type.metadata=#lib::T2 (skip check)] this.{self::C::noSuchMethod}(new core::_InvocationMirror::_withType(#C7, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[a1, a2, a3, a4, a5]), [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol*, dynamic>] core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))));
+    return _in::unsafeCast<dynamic>([@vm.direct-call.metadata=#lib::C.noSuchMethod] [@vm.inferred-type.metadata=#lib::T2 (skip check)] this.{self::C::noSuchMethod}(new core::_InvocationMirror::_withType(#C5, 0, #C2, #C3, [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol*, dynamic>] core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))));
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:4,getterSelectorId:5] [@vm.unboxing-info.metadata=(i,i,i,i)->b]  no-such-method-forwarder method bazz([@vm.inferred-type.metadata=dart.core::_Smi (value: 1)] dynamic a1, [@vm.inferred-type.metadata=dart.core::_Smi (value: 2)] dynamic a2, [@vm.inferred-type.metadata=dart.core::_Smi (value: 3)] dynamic a3, [@vm.inferred-type.metadata=dart.core::_Smi (value: 4)] dynamic a4) → dynamic
+    return _in::unsafeCast<dynamic>([@vm.direct-call.metadata=#lib::C.noSuchMethod] [@vm.inferred-type.metadata=#lib::T2 (skip check)] this.{self::C::noSuchMethod}(new core::_InvocationMirror::_withType(#C6, 0, #C2, core::List::unmodifiable<dynamic>(<dynamic>[a1, a2, a3, a4, #C7]), [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol*, dynamic>] core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))));
 }
 class E extends core::Object implements self::A {
   synthetic constructor •() → self::E*
@@ -82,7 +82,7 @@
     return new self::T4::•();
   }
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:3]  no-such-method-forwarder get bar() → dynamic
-    return _in::unsafeCast<dynamic>([@vm.direct-call.metadata=#lib::E.noSuchMethod] [@vm.inferred-type.metadata=#lib::T4 (skip check)] this.{self::E::noSuchMethod}(new core::_InvocationMirror::_withType(#C2, 1, #C3, #C4, [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol*, dynamic>] core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))));
+    return _in::unsafeCast<dynamic>([@vm.direct-call.metadata=#lib::E.noSuchMethod] [@vm.inferred-type.metadata=#lib::T4 (skip check)] this.{self::E::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 1, #C2, #C3, [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol*, dynamic>] core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))));
 }
 class F extends core::Object {
   synthetic constructor •() → self::F*
@@ -104,7 +104,7 @@
   synthetic constructor •() → self::H*
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:8,getterSelectorId:9]  method foo({[@vm.inferred-type.metadata=dart.core::_Smi (value: 1)] dynamic left = #C1, [@vm.inferred-type.metadata=dart.core::_Smi (value: 2)] dynamic right = #C1}) → dynamic
+[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:8,getterSelectorId:9]  method foo({[@vm.inferred-type.metadata=dart.core::_Smi (value: 1)] dynamic left = #C7, [@vm.inferred-type.metadata=dart.core::_Smi (value: 2)] dynamic right = #C7}) → dynamic
     return new self::T6::•();
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:6,getterSelectorId:7]  method noSuchMethod(core::Invocation* invocation) → dynamic {
     return new self::T7::•();
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/null_check_elimination_nnbd.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/null_check_elimination_nnbd.dart.expect
index 9d38510..d80f88a 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/null_check_elimination_nnbd.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/null_check_elimination_nnbd.dart.expect
@@ -11,7 +11,7 @@
     : self::A::nonNullable = nonNullable, self::A::nullable = nullable, self::A::alwaysNull = alwaysNull, super core::Object::•()
     ;
 }
-[@vm.inferred-type.metadata=#lib::A?]static field self::A staticField = let core::String #t1 = "hi" in let core::String #t2 = "bye" in new self::A::•(#t1, #t2);
+[@vm.inferred-type.metadata=#lib::A?]static field self::A staticField = new self::A::•("hi", "bye");
 static method testNonNullable([@vm.inferred-type.metadata=#lib::A?] self::A a) → dynamic
   return _in::unsafeCast<core::String>([@vm.direct-call.metadata=#lib::A.nonNullable??] [@vm.inferred-type.metadata=dart.core::_OneByteString] a.{self::A::nonNullable});
 static method testNullable([@vm.inferred-type.metadata=#lib::A?] self::A a) → dynamic
@@ -19,7 +19,7 @@
 static method testAlwaysNull([@vm.inferred-type.metadata=#lib::A?] self::A a) → dynamic
   return [@vm.direct-call.metadata=#lib::A.alwaysNull??] [@vm.inferred-type.metadata=dart.core::Null? (value: null)] a.{self::A::alwaysNull}!;
 static method main() → void {
-  final core::List<self::A> list = <self::A>[let core::String #t3 = "foo" in let core::Null? #t4 = null in let core::Null? #t5 = null in new self::A::•(#t3, #t4, alwaysNull: #t5), self::staticField];
+  final core::List<self::A> list = <self::A>[new self::A::•("foo", null, alwaysNull: null), self::staticField];
   {
     core::Iterator<self::A> :sync-for-iterator = [@vm.direct-call.metadata=dart.core::_GrowableList.iterator] [@vm.inferred-type.metadata=dart._internal::ListIterator<#lib::A>] list.{core::Iterable::iterator};
     for (; [@vm.direct-call.metadata=dart._internal::ListIterator.moveNext] [@vm.inferred-type.metadata=dart.core::bool (skip check)] :sync-for-iterator.{core::Iterator::moveNext}(); ) {
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/null_test_elimination.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/null_test_elimination.dart.expect
index 1e8033d2..615c0d7 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/null_test_elimination.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/null_test_elimination.dart.expect
@@ -11,9 +11,9 @@
     : self::A::nonNullable = nonNullable, self::A::nullable = nullable, self::A::alwaysNull = alwaysNull, super core::Object::•()
     ;
 }
-[@vm.inferred-type.metadata=#lib::A?]static field self::A* staticField = let core::String* #t1 = "hi" in let core::String* #t2 = "bye" in new self::A::•(#t1, #t2);
+[@vm.inferred-type.metadata=#lib::A?]static field self::A* staticField = new self::A::•("hi", "bye");
 static method testNonNullableIf1([@vm.inferred-type.metadata=#lib::A?] self::A* a) → dynamic {
-  if(let dynamic #t3 = [@vm.direct-call.metadata=#lib::A.nonNullable??] [@vm.inferred-type.metadata=dart.core::_OneByteString] a.{self::A::nonNullable} in false) {
+  if(let dynamic #t1 = [@vm.direct-call.metadata=#lib::A.nonNullable??] [@vm.inferred-type.metadata=dart.core::_OneByteString] a.{self::A::nonNullable} in false) {
     core::print("null");
   }
 }
@@ -23,12 +23,12 @@
   }
 }
 static method testAlwaysNullIf1([@vm.inferred-type.metadata=#lib::A?] self::A* a) → dynamic {
-  if(let dynamic #t4 = [@vm.direct-call.metadata=#lib::A.alwaysNull??] [@vm.inferred-type.metadata=dart.core::Null? (value: null)] a.{self::A::alwaysNull} in true) {
+  if(let dynamic #t2 = [@vm.direct-call.metadata=#lib::A.alwaysNull??] [@vm.inferred-type.metadata=dart.core::Null? (value: null)] a.{self::A::alwaysNull} in true) {
     core::print("null");
   }
 }
 static method testNonNullableIf2([@vm.inferred-type.metadata=#lib::A?] self::A* a) → dynamic {
-  if(!(let dynamic #t5 = [@vm.direct-call.metadata=#lib::A.nonNullable??] [@vm.inferred-type.metadata=dart.core::_OneByteString] a.{self::A::nonNullable} in false) && _in::unsafeCast<core::bool*>([@vm.inferred-type.metadata=dart.core::bool] self::someCondition())) {
+  if(!(let dynamic #t3 = [@vm.direct-call.metadata=#lib::A.nonNullable??] [@vm.inferred-type.metadata=dart.core::_OneByteString] a.{self::A::nonNullable} in false) && _in::unsafeCast<core::bool*>([@vm.inferred-type.metadata=dart.core::bool] self::someCondition())) {
     core::print("not null");
   }
 }
@@ -38,20 +38,20 @@
   }
 }
 static method testAlwaysNullIf2([@vm.inferred-type.metadata=#lib::A?] self::A* a) → dynamic {
-  if(!(let dynamic #t6 = [@vm.direct-call.metadata=#lib::A.alwaysNull??] [@vm.inferred-type.metadata=dart.core::Null? (value: null)] a.{self::A::alwaysNull} in true) && _in::unsafeCast<core::bool*>([@vm.inferred-type.metadata=dart.core::bool] self::someCondition())) {
+  if(!(let dynamic #t4 = [@vm.direct-call.metadata=#lib::A.alwaysNull??] [@vm.inferred-type.metadata=dart.core::Null? (value: null)] a.{self::A::alwaysNull} in true) && _in::unsafeCast<core::bool*>([@vm.inferred-type.metadata=dart.core::bool] self::someCondition())) {
     core::print("not null");
   }
 }
 static method testNonNullableCondExpr([@vm.inferred-type.metadata=#lib::A?] self::A* a) → dynamic
-  return !(let dynamic #t7 = [@vm.direct-call.metadata=#lib::A.nonNullable??] [@vm.inferred-type.metadata=dart.core::_OneByteString] a.{self::A::nonNullable} in false) ?{core::String*} "not null" : "null";
+  return !(let dynamic #t5 = [@vm.direct-call.metadata=#lib::A.nonNullable??] [@vm.inferred-type.metadata=dart.core::_OneByteString] a.{self::A::nonNullable} in false) ?{core::String*} "not null" : "null";
 static method testNullableCondExpr([@vm.inferred-type.metadata=#lib::A?] self::A* a) → dynamic
   return ![@vm.direct-call.metadata=#lib::A.nullable??] [@vm.inferred-type.metadata=dart.core::_OneByteString?] a.{self::A::nullable}.{core::String::==}(null) ?{core::String*} "not null" : "null";
 static method testAlwaysNullCondExpr([@vm.inferred-type.metadata=#lib::A?] self::A* a) → dynamic
-  return !(let dynamic #t8 = [@vm.direct-call.metadata=#lib::A.alwaysNull??] [@vm.inferred-type.metadata=dart.core::Null? (value: null)] a.{self::A::alwaysNull} in true) ?{core::String*} "not null" : "null";
+  return !(let dynamic #t6 = [@vm.direct-call.metadata=#lib::A.alwaysNull??] [@vm.inferred-type.metadata=dart.core::Null? (value: null)] a.{self::A::alwaysNull} in true) ?{core::String*} "not null" : "null";
 static method someCondition() → dynamic
   return [@vm.direct-call.metadata=dart.core::_IntegerImplementation.==] [@vm.inferred-type.metadata=dart.core::bool (skip check)] [@vm.inferred-type.metadata=int] core::int::parse("1").{core::num::==}(1);
 static method main() → void {
-  final core::List<self::A*>* list = <self::A*>[let core::String* #t9 = "foo" in let core::Null? #t10 = null in let core::Null? #t11 = null in new self::A::•(#t9, #t10, alwaysNull: #t11), self::staticField];
+  final core::List<self::A*>* list = <self::A*>[new self::A::•("foo", null, alwaysNull: null), self::staticField];
   {
     core::Iterator<self::A*>* :sync-for-iterator = [@vm.direct-call.metadata=dart.core::_GrowableList.iterator] [@vm.inferred-type.metadata=dart._internal::ListIterator<#lib::A*>] list.{core::Iterable::iterator};
     for (; [@vm.direct-call.metadata=dart._internal::ListIterator.moveNext] [@vm.inferred-type.metadata=dart.core::bool (skip check)] :sync-for-iterator.{core::Iterator::moveNext}(); ) {
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/create_test.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/create_test.dart.expect
index 2e584fa..8726004 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/create_test.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/create_test.dart.expect
@@ -18,7 +18,7 @@
     } =>#t3);
     [@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep.aKeep] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pb::FooKeep::aKeep} = 43;
   } =>#t1;
-  tes::test("retrieving values", () → core::Null? {
+  tes::test("retrieving values", () → Null {
     exp::expect([@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::BarKeep.aKeep??] [@vm.inferred-type.metadata=int] [@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep.barKeep] [@vm.inferred-type.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::BarKeep?] foo.{pb::FooKeep::barKeep}.{pb::BarKeep::aKeep}, 5);
     exp::expect([@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::BarKeep.aKeep??] [@vm.inferred-type.metadata=int] [@vm.inferred-type.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::BarKeep?] [@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep.mapKeep] [@vm.inferred-type.metadata=!] foo.{pb::FooKeep::mapKeep}.{core::Map::[]}("foo").{pb::BarKeep::aKeep}, 2);
     exp::expect([@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep.hasHasKeep] [@vm.inferred-type.metadata=dart.core::bool (skip check)] foo.{pb::FooKeep::hasHasKeep}(), false);
@@ -35,14 +35,14 @@
 import "package:protobuf/protobuf.dart" as $pb;
 
 class FooKeep extends pro::GeneratedMessage {
-[@vm.inferred-type.metadata=protobuf::BuilderInfo?]  static final field pro::BuilderInfo* _i = let final pro::BuilderInfo* #t1 = new pro::BuilderInfo::•("FooKeep", createEmptyInstance: #C1) in block {
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.aOM] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::aOM}<self::BarKeep*>(1, "barKeep", protoName: "barKeep", subBuilder: #C2);
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.add] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::add}<core::Null?>(0, null, null, null, null, null, null);
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.m] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::m}<core::String*, self::BarKeep*>(3, "mapKeep", protoName: "mapKeep", entryClassName: "FooKeep.MapKeepEntry", keyFieldType: #C3, valueFieldType: #C4, valueCreator: #C2);
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.add] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::add}<core::Null?>(0, null, null, null, null, null, null);
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.a] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::a}<core::int*>(5, "aKeep", #C5, protoName: "aKeep");
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.aOM] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::aOM}<self::HasKeep*>(6, "hasKeep", protoName: "hasKeep", subBuilder: #C6);
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.aOM] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::aOM}<self::ClearKeep*>(7, "clearKeep", protoName: "clearKeep", subBuilder: #C7);
+[@vm.inferred-type.metadata=protobuf::BuilderInfo?]  static final field pro::BuilderInfo* _i = let final pro::BuilderInfo* #t1 = new pro::BuilderInfo::•("FooKeep") in block {
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.aOM] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::aOM}<self::BarKeep*>(1, "barKeep", #C1);
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.add] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::add}<Null>(0, null, null, null, null, null, null);
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.m] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::m}<core::String*, self::BarKeep*>(3, "mapKeep", "FooKeep.MapKeepEntry", #C2, "mapKeep", #C1, #C3);
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.add] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::add}<Null>(0, null, null, null, null, null, null);
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.a] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::a}<core::int*>(5, "aKeep", #C4);
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.aOM] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::aOM}<self::HasKeep*>(6, "hasKeep", #C5);
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.aOM] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::aOM}<self::ClearKeep*>(7, "clearKeep", #C6);
     [@vm.direct-call.metadata=protobuf::BuilderInfo.hasRequiredFields] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::hasRequiredFields} = false;
   } =>#t1;
   constructor _() → self::FooKeep*
@@ -52,37 +52,37 @@
     return [@vm.inferred-type.metadata=foo.pb.dart::FooKeep] self::FooKeep::create();
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:1]  get info_() → pro::BuilderInfo*
     return [@vm.inferred-type.metadata=protobuf::BuilderInfo?] self::FooKeep::_i;
-  @#C10
+  @#C9
   static method create() → self::FooKeep*
     return new self::FooKeep::_();
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:2,getterSelectorId:3]  @#C12
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:2,getterSelectorId:3]  @#C11
   get barKeep() → self::BarKeep*
     return [@vm.direct-call.metadata=protobuf::GeneratedMessage.$_getN] [@vm.inferred-type.metadata=foo.pb.dart::BarKeep? (skip check)] this.{pro::GeneratedMessage::$_getN}<self::BarKeep*>(0);
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:2,getterSelectorId:3]  @#C12
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:2,getterSelectorId:3]  @#C11
   set barKeep([@vm.inferred-type.metadata=foo.pb.dart::BarKeep] self::BarKeep* v) → void {
     [@vm.direct-call.metadata=protobuf::GeneratedMessage.setField] [@vm.inferred-type.metadata=!? (skip check)] this.{pro::GeneratedMessage::setField}(1, v);
   }
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:4]  @#C14
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:4]  @#C13
   get mapKeep() → core::Map<core::String*, self::BarKeep*>*
     return [@vm.direct-call.metadata=protobuf::GeneratedMessage.$_getMap] [@vm.inferred-type.metadata=! (skip check)] this.{pro::GeneratedMessage::$_getMap}<core::String*, self::BarKeep*>(2);
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6] [@vm.unboxing-info.metadata=()->i]  @#C16
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6] [@vm.unboxing-info.metadata=()->i]  @#C15
   get aKeep() → core::int*
     return [@vm.direct-call.metadata=protobuf::GeneratedMessage.$_getIZ] [@vm.inferred-type.metadata=int (skip check)] this.{pro::GeneratedMessage::$_getIZ}(4);
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6] [@vm.unboxing-info.metadata=(i)->b]  @#C16
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6] [@vm.unboxing-info.metadata=(i)->b]  @#C15
   set aKeep([@vm.inferred-type.metadata=dart.core::_Smi (value: 43)] core::int* v) → void {
     [@vm.direct-call.metadata=protobuf::GeneratedMessage.$_setSignedInt32] [@vm.inferred-type.metadata=!? (skip check)] this.{pro::GeneratedMessage::$_setSignedInt32}(4, v);
   }
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:7,getterSelectorId:8]  @#C18
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:7,getterSelectorId:8]  @#C17
   method hasHasKeep() → core::bool*
     return [@vm.direct-call.metadata=protobuf::GeneratedMessage.$_has] [@vm.inferred-type.metadata=dart.core::bool (skip check)] this.{pro::GeneratedMessage::$_has}(5);
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:9,getterSelectorId:10]  @#C20
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:9,getterSelectorId:10]  @#C19
   method clearClearKeep() → void
     return [@vm.direct-call.metadata=protobuf::GeneratedMessage.clearField] [@vm.inferred-type.metadata=dart.core::Null? (skip check) (value: null)] this.{pro::GeneratedMessage::clearField}(7);
 }
 class BarKeep extends pro::GeneratedMessage {
-[@vm.inferred-type.metadata=protobuf::BuilderInfo?]  static final field pro::BuilderInfo* _i = let final pro::BuilderInfo* #t2 = new pro::BuilderInfo::•("BarKeep", createEmptyInstance: #C2) in block {
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.a] [@vm.inferred-type.metadata=!? (skip check)] #t2.{pro::BuilderInfo::a}<core::int*>(1, "aKeep", #C5, protoName: "aKeep");
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.add] [@vm.inferred-type.metadata=!? (skip check)] #t2.{pro::BuilderInfo::add}<core::Null?>(0, null, null, null, null, null, null);
+[@vm.inferred-type.metadata=protobuf::BuilderInfo?]  static final field pro::BuilderInfo* _i = let final pro::BuilderInfo* #t2 = new pro::BuilderInfo::•("BarKeep") in block {
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.a] [@vm.inferred-type.metadata=!? (skip check)] #t2.{pro::BuilderInfo::a}<core::int*>(1, "aKeep", #C4);
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.add] [@vm.inferred-type.metadata=!? (skip check)] #t2.{pro::BuilderInfo::add}<Null>(0, null, null, null, null, null, null);
     [@vm.direct-call.metadata=protobuf::BuilderInfo.hasRequiredFields] [@vm.inferred-type.metadata=!? (skip check)] #t2.{pro::BuilderInfo::hasRequiredFields} = false;
   } =>#t2;
   constructor _() → self::BarKeep*
@@ -92,20 +92,20 @@
     return [@vm.inferred-type.metadata=foo.pb.dart::BarKeep] self::BarKeep::create();
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:1]  get info_() → pro::BuilderInfo*
     return [@vm.inferred-type.metadata=protobuf::BuilderInfo?] self::BarKeep::_i;
-  @#C10
+  @#C9
   static method create() → self::BarKeep*
     return new self::BarKeep::_();
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:11,getterSelectorId:12] [@vm.unboxing-info.metadata=()->i]  @#C12
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:11,getterSelectorId:12] [@vm.unboxing-info.metadata=()->i]  @#C11
   get aKeep() → core::int*
     return [@vm.direct-call.metadata=protobuf::GeneratedMessage.$_getIZ] [@vm.inferred-type.metadata=int (skip check)] this.{pro::GeneratedMessage::$_getIZ}(0);
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:11,getterSelectorId:12] [@vm.unboxing-info.metadata=(i)->b]  @#C12
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:11,getterSelectorId:12] [@vm.unboxing-info.metadata=(i)->b]  @#C11
   set aKeep([@vm.inferred-type.metadata=dart.core::_Smi] core::int* v) → void {
     [@vm.direct-call.metadata=protobuf::GeneratedMessage.$_setSignedInt32] [@vm.inferred-type.metadata=!? (skip check)] this.{pro::GeneratedMessage::$_setSignedInt32}(0, v);
   }
 }
 class HasKeep extends pro::GeneratedMessage {
-[@vm.inferred-type.metadata=protobuf::BuilderInfo?]  static final field pro::BuilderInfo* _i = let final pro::BuilderInfo* #t3 = new pro::BuilderInfo::•("HasKeep", createEmptyInstance: #C6) in block {
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.add] [@vm.inferred-type.metadata=!? (skip check)] #t3.{pro::BuilderInfo::add}<core::Null?>(0, null, null, null, null, null, null);
+[@vm.inferred-type.metadata=protobuf::BuilderInfo?]  static final field pro::BuilderInfo* _i = let final pro::BuilderInfo* #t3 = new pro::BuilderInfo::•("HasKeep") in block {
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.add] [@vm.inferred-type.metadata=!? (skip check)] #t3.{pro::BuilderInfo::add}<Null>(0, null, null, null, null, null, null);
     [@vm.direct-call.metadata=protobuf::BuilderInfo.hasRequiredFields] [@vm.inferred-type.metadata=!? (skip check)] #t3.{pro::BuilderInfo::hasRequiredFields} = false;
   } =>#t3;
   constructor _() → self::HasKeep*
@@ -113,13 +113,13 @@
     ;
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:1]  get info_() → pro::BuilderInfo*
     return [@vm.inferred-type.metadata=protobuf::BuilderInfo?] self::HasKeep::_i;
-  @#C10
+  @#C9
   static method create() → self::HasKeep*
     return new self::HasKeep::_();
 }
 class ClearKeep extends pro::GeneratedMessage {
-[@vm.inferred-type.metadata=protobuf::BuilderInfo?]  static final field pro::BuilderInfo* _i = let final pro::BuilderInfo* #t4 = new pro::BuilderInfo::•("ClearKeep", createEmptyInstance: #C7) in block {
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.add] [@vm.inferred-type.metadata=!? (skip check)] #t4.{pro::BuilderInfo::add}<core::Null?>(0, null, null, null, null, null, null);
+[@vm.inferred-type.metadata=protobuf::BuilderInfo?]  static final field pro::BuilderInfo* _i = let final pro::BuilderInfo* #t4 = new pro::BuilderInfo::•("ClearKeep") in block {
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.add] [@vm.inferred-type.metadata=!? (skip check)] #t4.{pro::BuilderInfo::add}<Null>(0, null, null, null, null, null, null);
     [@vm.direct-call.metadata=protobuf::BuilderInfo.hasRequiredFields] [@vm.inferred-type.metadata=!? (skip check)] #t4.{pro::BuilderInfo::hasRequiredFields} = false;
   } =>#t4;
   constructor _() → self::ClearKeep*
@@ -127,7 +127,7 @@
     ;
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:1]  get info_() → pro::BuilderInfo*
     return [@vm.inferred-type.metadata=protobuf::BuilderInfo?] self::ClearKeep::_i;
-  @#C10
+  @#C9
   static method create() → self::ClearKeep*
     return new self::ClearKeep::_();
 }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/decode_test.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/decode_test.dart.expect
index 7ce67f5..f59d5b9 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/decode_test.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/decode_test.dart.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "generated/foo.pb.dart" as pb;
 import "package:test_core/test_core.dart" as tes;
-import "dart:core" as core;
 import "package:test_api/src/frontend/expect.dart" as exp;
+import "dart:core" as core;
 
 import "package:test/test.dart";
 import "file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart";
@@ -11,7 +11,7 @@
 [@vm.inferred-type.metadata=dart.core::_GrowableList?<dart.core::int*>]static field core::List<core::int*>* buffer = <core::int*>[10, 4, 8, 5, 16, 4, 26, 9, 10, 3, 102, 111, 111, 18, 2, 8, 42, 34, 9, 10, 3, 122, 111, 112, 18, 2, 8, 3, 40, 43, 50, 0, 58, 0];
 static method main() → dynamic {
   pb::FooKeep* foo = [@vm.inferred-type.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep] pb::FooKeep::fromBuffer([@vm.inferred-type.metadata=dart.core::_GrowableList?<dart.core::int*>] self::buffer);
-  tes::test("Kept values are restored correctly", () → core::Null? {
+  tes::test("Kept values are restored correctly", () → Null {
     exp::expect([@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::BarKeep.aKeep??] [@vm.inferred-type.metadata=int] [@vm.inferred-type.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::BarKeep?] [@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep.mapKeep] [@vm.inferred-type.metadata=!] foo.{pb::FooKeep::mapKeep}.{core::Map::[]}("foo").{pb::BarKeep::aKeep}, 42);
     exp::expect([@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::BarKeep.aKeep??] [@vm.inferred-type.metadata=int] [@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep.barKeep] [@vm.inferred-type.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::BarKeep?] foo.{pb::FooKeep::barKeep}.{pb::BarKeep::aKeep}, 5);
     exp::expect([@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep.aKeep] [@vm.inferred-type.metadata=int] foo.{pb::FooKeep::aKeep}, 43);
@@ -28,14 +28,14 @@
 import "package:protobuf/protobuf.dart" as $pb;
 
 class FooKeep extends pro::GeneratedMessage {
-[@vm.inferred-type.metadata=protobuf::BuilderInfo?]  static final field pro::BuilderInfo* _i = let final pro::BuilderInfo* #t1 = new pro::BuilderInfo::•("FooKeep", createEmptyInstance: #C1) in block {
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.aOM] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::aOM}<self::BarKeep*>(1, "barKeep", protoName: "barKeep", subBuilder: #C2);
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.add] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::add}<core::Null?>(0, null, null, null, null, null, null);
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.m] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::m}<core::String*, self::BarKeep*>(3, "mapKeep", protoName: "mapKeep", entryClassName: "FooKeep.MapKeepEntry", keyFieldType: #C3, valueFieldType: #C4, valueCreator: #C2);
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.add] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::add}<core::Null?>(0, null, null, null, null, null, null);
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.a] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::a}<core::int*>(5, "aKeep", #C5, protoName: "aKeep");
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.aOM] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::aOM}<self::HasKeep*>(6, "hasKeep", protoName: "hasKeep", subBuilder: #C6);
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.aOM] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::aOM}<self::ClearKeep*>(7, "clearKeep", protoName: "clearKeep", subBuilder: #C7);
+[@vm.inferred-type.metadata=protobuf::BuilderInfo?]  static final field pro::BuilderInfo* _i = let final pro::BuilderInfo* #t1 = new pro::BuilderInfo::•("FooKeep") in block {
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.aOM] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::aOM}<self::BarKeep*>(1, "barKeep", #C1);
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.add] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::add}<Null>(0, null, null, null, null, null, null);
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.m] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::m}<core::String*, self::BarKeep*>(3, "mapKeep", "FooKeep.MapKeepEntry", #C2, "mapKeep", #C1, #C3);
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.add] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::add}<Null>(0, null, null, null, null, null, null);
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.a] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::a}<core::int*>(5, "aKeep", #C4);
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.aOM] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::aOM}<self::HasKeep*>(6, "hasKeep", #C5);
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.aOM] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::aOM}<self::ClearKeep*>(7, "clearKeep", #C6);
     [@vm.direct-call.metadata=protobuf::BuilderInfo.hasRequiredFields] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::hasRequiredFields} = false;
   } =>#t1;
   constructor _() → self::FooKeep*
@@ -43,9 +43,9 @@
     ;
   static factory •() → self::FooKeep*
     return [@vm.inferred-type.metadata=foo.pb.dart::FooKeep] self::FooKeep::create();
-  static factory fromBuffer([@vm.inferred-type.metadata=dart.core::_GrowableList?<dart.core::int*>] core::List<core::int*>* i, [[@vm.inferred-type.metadata=protobuf::_EmptyExtensionRegistry (value: const protobuf::_EmptyExtensionRegistry{})] pro::ExtensionRegistry* r = #C8]) → self::FooKeep*
+  static factory fromBuffer([@vm.inferred-type.metadata=dart.core::_GrowableList?<dart.core::int*>] core::List<core::int*>* i) → self::FooKeep*
     return let final self::FooKeep* #t2 = [@vm.inferred-type.metadata=foo.pb.dart::FooKeep] self::FooKeep::create() in block {
-      [@vm.direct-call.metadata=protobuf::GeneratedMessage.mergeFromBuffer] [@vm.inferred-type.metadata=!? (skip check)] #t2.{pro::GeneratedMessage::mergeFromBuffer}(i, r);
+      [@vm.direct-call.metadata=protobuf::GeneratedMessage.mergeFromBuffer] [@vm.inferred-type.metadata=!? (skip check)] #t2.{pro::GeneratedMessage::mergeFromBuffer}(i, #C7);
     } =>#t2;
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2]  method clone() → self::FooKeep*
     return let final self::FooKeep* #t3 = [@vm.inferred-type.metadata=foo.pb.dart::FooKeep] self::FooKeep::•() in block {
@@ -53,29 +53,29 @@
     } =>#t3;
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:3]  get info_() → pro::BuilderInfo*
     return [@vm.inferred-type.metadata=protobuf::BuilderInfo?] self::FooKeep::_i;
-  @#C11
+  @#C10
   static method create() → self::FooKeep*
     return new self::FooKeep::_();
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:4]  @#C13
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:4]  @#C12
   get barKeep() → self::BarKeep*
     return [@vm.direct-call.metadata=protobuf::GeneratedMessage.$_getN] [@vm.inferred-type.metadata=foo.pb.dart::BarKeep? (skip check)] this.{pro::GeneratedMessage::$_getN}<self::BarKeep*>(0);
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:5]  @#C15
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:5]  @#C14
   get mapKeep() → core::Map<core::String*, self::BarKeep*>*
     return [@vm.direct-call.metadata=protobuf::GeneratedMessage.$_getMap] [@vm.inferred-type.metadata=! (skip check)] this.{pro::GeneratedMessage::$_getMap}<core::String*, self::BarKeep*>(2);
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:6] [@vm.unboxing-info.metadata=()->i]  @#C17
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:6] [@vm.unboxing-info.metadata=()->i]  @#C16
   get aKeep() → core::int*
     return [@vm.direct-call.metadata=protobuf::GeneratedMessage.$_getIZ] [@vm.inferred-type.metadata=int (skip check)] this.{pro::GeneratedMessage::$_getIZ}(4);
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:7,getterSelectorId:8]  @#C19
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:7,getterSelectorId:8]  @#C18
   method hasHasKeep() → core::bool*
     return [@vm.direct-call.metadata=protobuf::GeneratedMessage.$_has] [@vm.inferred-type.metadata=dart.core::bool (skip check)] this.{pro::GeneratedMessage::$_has}(5);
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:9,getterSelectorId:10]  @#C21
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:9,getterSelectorId:10]  @#C20
   method clearClearKeep() → void
     return [@vm.direct-call.metadata=protobuf::GeneratedMessage.clearField] [@vm.inferred-type.metadata=dart.core::Null? (skip check) (value: null)] this.{pro::GeneratedMessage::clearField}(7);
 }
 class BarKeep extends pro::GeneratedMessage {
-[@vm.inferred-type.metadata=protobuf::BuilderInfo?]  static final field pro::BuilderInfo* _i = let final pro::BuilderInfo* #t4 = new pro::BuilderInfo::•("BarKeep", createEmptyInstance: #C2) in block {
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.a] [@vm.inferred-type.metadata=!? (skip check)] #t4.{pro::BuilderInfo::a}<core::int*>(1, "aKeep", #C5, protoName: "aKeep");
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.add] [@vm.inferred-type.metadata=!? (skip check)] #t4.{pro::BuilderInfo::add}<core::Null?>(0, null, null, null, null, null, null);
+[@vm.inferred-type.metadata=protobuf::BuilderInfo?]  static final field pro::BuilderInfo* _i = let final pro::BuilderInfo* #t4 = new pro::BuilderInfo::•("BarKeep") in block {
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.a] [@vm.inferred-type.metadata=!? (skip check)] #t4.{pro::BuilderInfo::a}<core::int*>(1, "aKeep", #C4);
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.add] [@vm.inferred-type.metadata=!? (skip check)] #t4.{pro::BuilderInfo::add}<Null>(0, null, null, null, null, null, null);
     [@vm.direct-call.metadata=protobuf::BuilderInfo.hasRequiredFields] [@vm.inferred-type.metadata=!? (skip check)] #t4.{pro::BuilderInfo::hasRequiredFields} = false;
   } =>#t4;
   constructor _() → self::BarKeep*
@@ -89,16 +89,16 @@
     } =>#t5;
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:3]  get info_() → pro::BuilderInfo*
     return [@vm.inferred-type.metadata=protobuf::BuilderInfo?] self::BarKeep::_i;
-  @#C11
+  @#C10
   static method create() → self::BarKeep*
     return new self::BarKeep::_();
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:11] [@vm.unboxing-info.metadata=()->i]  @#C13
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:11] [@vm.unboxing-info.metadata=()->i]  @#C12
   get aKeep() → core::int*
     return [@vm.direct-call.metadata=protobuf::GeneratedMessage.$_getIZ] [@vm.inferred-type.metadata=int (skip check)] this.{pro::GeneratedMessage::$_getIZ}(0);
 }
 class HasKeep extends pro::GeneratedMessage {
-[@vm.inferred-type.metadata=protobuf::BuilderInfo?]  static final field pro::BuilderInfo* _i = let final pro::BuilderInfo* #t6 = new pro::BuilderInfo::•("HasKeep", createEmptyInstance: #C6) in block {
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.add] [@vm.inferred-type.metadata=!? (skip check)] #t6.{pro::BuilderInfo::add}<core::Null?>(0, null, null, null, null, null, null);
+[@vm.inferred-type.metadata=protobuf::BuilderInfo?]  static final field pro::BuilderInfo* _i = let final pro::BuilderInfo* #t6 = new pro::BuilderInfo::•("HasKeep") in block {
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.add] [@vm.inferred-type.metadata=!? (skip check)] #t6.{pro::BuilderInfo::add}<Null>(0, null, null, null, null, null, null);
     [@vm.direct-call.metadata=protobuf::BuilderInfo.hasRequiredFields] [@vm.inferred-type.metadata=!? (skip check)] #t6.{pro::BuilderInfo::hasRequiredFields} = false;
   } =>#t6;
   constructor _() → self::HasKeep*
@@ -112,13 +112,13 @@
     } =>#t7;
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:3]  get info_() → pro::BuilderInfo*
     return [@vm.inferred-type.metadata=protobuf::BuilderInfo?] self::HasKeep::_i;
-  @#C11
+  @#C10
   static method create() → self::HasKeep*
     return new self::HasKeep::_();
 }
 class ClearKeep extends pro::GeneratedMessage {
-[@vm.inferred-type.metadata=protobuf::BuilderInfo?]  static final field pro::BuilderInfo* _i = let final pro::BuilderInfo* #t8 = new pro::BuilderInfo::•("ClearKeep", createEmptyInstance: #C7) in block {
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.add] [@vm.inferred-type.metadata=!? (skip check)] #t8.{pro::BuilderInfo::add}<core::Null?>(0, null, null, null, null, null, null);
+[@vm.inferred-type.metadata=protobuf::BuilderInfo?]  static final field pro::BuilderInfo* _i = let final pro::BuilderInfo* #t8 = new pro::BuilderInfo::•("ClearKeep") in block {
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.add] [@vm.inferred-type.metadata=!? (skip check)] #t8.{pro::BuilderInfo::add}<Null>(0, null, null, null, null, null, null);
     [@vm.direct-call.metadata=protobuf::BuilderInfo.hasRequiredFields] [@vm.inferred-type.metadata=!? (skip check)] #t8.{pro::BuilderInfo::hasRequiredFields} = false;
   } =>#t8;
   constructor _() → self::ClearKeep*
@@ -132,7 +132,7 @@
     } =>#t9;
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:3]  get info_() → pro::BuilderInfo*
     return [@vm.inferred-type.metadata=protobuf::BuilderInfo?] self::ClearKeep::_i;
-  @#C11
+  @#C10
   static method create() → self::ClearKeep*
     return new self::ClearKeep::_();
 }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/encode_all_fields.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/encode_all_fields.dart.expect
index ebf9b06..66a360a 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/encode_all_fields.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/encode_all_fields.dart.expect
@@ -42,14 +42,14 @@
 import "package:protobuf/protobuf.dart" as $pb;
 
 class FooKeep extends pro::GeneratedMessage {
-[@vm.inferred-type.metadata=protobuf::BuilderInfo?]  static final field pro::BuilderInfo* _i = let final pro::BuilderInfo* #t1 = new pro::BuilderInfo::•("FooKeep", createEmptyInstance: #C1) in block {
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.aOM] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::aOM}<self::BarKeep*>(1, "barKeep", protoName: "barKeep", subBuilder: #C2);
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.add] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::add}<core::Null?>(0, null, null, null, null, null, null);
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.m] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::m}<core::String*, self::BarKeep*>(3, "mapKeep", protoName: "mapKeep", entryClassName: "FooKeep.MapKeepEntry", keyFieldType: #C3, valueFieldType: #C4, valueCreator: #C2);
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.m] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::m}<core::String*, self::ZopDrop*>(4, "mapDrop", protoName: "mapDrop", entryClassName: "FooKeep.MapDropEntry", keyFieldType: #C3, valueFieldType: #C4, valueCreator: #C5);
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.a] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::a}<core::int*>(5, "aKeep", #C6, protoName: "aKeep");
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.aOM] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::aOM}<self::HasKeep*>(6, "hasKeep", protoName: "hasKeep", subBuilder: #C7);
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.aOM] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::aOM}<self::ClearKeep*>(7, "clearKeep", protoName: "clearKeep", subBuilder: #C8);
+[@vm.inferred-type.metadata=protobuf::BuilderInfo?]  static final field pro::BuilderInfo* _i = let final pro::BuilderInfo* #t1 = new pro::BuilderInfo::•("FooKeep") in block {
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.aOM] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::aOM}<self::BarKeep*>(1, "barKeep", #C1);
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.add] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::add}<Null>(0, null, null, null, null, null, null);
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.m] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::m}<core::String*, self::BarKeep*>(3, "mapKeep", "FooKeep.MapKeepEntry", #C2, "mapKeep", #C1, #C3);
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.m] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::m}<core::String*, self::ZopDrop*>(4, "mapDrop", "FooKeep.MapDropEntry", #C2, "mapDrop", #C4, #C3);
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.a] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::a}<core::int*>(5, "aKeep", #C5);
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.aOM] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::aOM}<self::HasKeep*>(6, "hasKeep", #C6);
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.aOM] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::aOM}<self::ClearKeep*>(7, "clearKeep", #C7);
     [@vm.direct-call.metadata=protobuf::BuilderInfo.hasRequiredFields] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::hasRequiredFields} = false;
   } =>#t1;
   constructor _() → self::FooKeep*
@@ -59,36 +59,36 @@
     return [@vm.inferred-type.metadata=foo.pb.dart::FooKeep] self::FooKeep::create();
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:1]  get info_() → pro::BuilderInfo*
     return [@vm.inferred-type.metadata=protobuf::BuilderInfo?] self::FooKeep::_i;
-  @#C11
+  @#C10
   static method create() → self::FooKeep*
     return new self::FooKeep::_();
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:2]  @#C13
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:2]  @#C12
   set barKeep([@vm.inferred-type.metadata=foo.pb.dart::BarKeep] self::BarKeep* v) → void {
     [@vm.direct-call.metadata=protobuf::GeneratedMessage.setField] [@vm.inferred-type.metadata=!? (skip check)] this.{pro::GeneratedMessage::setField}(1, v);
   }
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:3]  @#C15
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:3]  @#C14
   get mapKeep() → core::Map<core::String*, self::BarKeep*>*
     return [@vm.direct-call.metadata=protobuf::GeneratedMessage.$_getMap] [@vm.inferred-type.metadata=! (skip check)] this.{pro::GeneratedMessage::$_getMap}<core::String*, self::BarKeep*>(2);
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:4]  @#C17
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:4]  @#C16
   get mapDrop() → core::Map<core::String*, self::ZopDrop*>*
     return [@vm.direct-call.metadata=protobuf::GeneratedMessage.$_getMap] [@vm.inferred-type.metadata=! (skip check)] this.{pro::GeneratedMessage::$_getMap}<core::String*, self::ZopDrop*>(3);
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5] [@vm.unboxing-info.metadata=(i)->b]  @#C19
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5] [@vm.unboxing-info.metadata=(i)->b]  @#C18
   set aKeep([@vm.inferred-type.metadata=dart.core::_Smi (value: 43)] core::int* v) → void {
     [@vm.direct-call.metadata=protobuf::GeneratedMessage.$_setSignedInt32] [@vm.inferred-type.metadata=!? (skip check)] this.{pro::GeneratedMessage::$_setSignedInt32}(4, v);
   }
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:6]  @#C21
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:6]  @#C20
   set hasKeep([@vm.inferred-type.metadata=foo.pb.dart::HasKeep] self::HasKeep* v) → void {
     [@vm.direct-call.metadata=protobuf::GeneratedMessage.setField] [@vm.inferred-type.metadata=!? (skip check)] this.{pro::GeneratedMessage::setField}(6, v);
   }
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:7]  @#C23
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:7]  @#C22
   set clearKeep([@vm.inferred-type.metadata=foo.pb.dart::ClearKeep] self::ClearKeep* v) → void {
     [@vm.direct-call.metadata=protobuf::GeneratedMessage.setField] [@vm.inferred-type.metadata=!? (skip check)] this.{pro::GeneratedMessage::setField}(7, v);
   }
 }
 class BarKeep extends pro::GeneratedMessage {
-[@vm.inferred-type.metadata=protobuf::BuilderInfo?]  static final field pro::BuilderInfo* _i = let final pro::BuilderInfo* #t2 = new pro::BuilderInfo::•("BarKeep", createEmptyInstance: #C2) in block {
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.a] [@vm.inferred-type.metadata=!? (skip check)] #t2.{pro::BuilderInfo::a}<core::int*>(1, "aKeep", #C6, protoName: "aKeep");
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.a] [@vm.inferred-type.metadata=!? (skip check)] #t2.{pro::BuilderInfo::a}<core::int*>(2, "bDrop", #C6, protoName: "bDrop");
+[@vm.inferred-type.metadata=protobuf::BuilderInfo?]  static final field pro::BuilderInfo* _i = let final pro::BuilderInfo* #t2 = new pro::BuilderInfo::•("BarKeep") in block {
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.a] [@vm.inferred-type.metadata=!? (skip check)] #t2.{pro::BuilderInfo::a}<core::int*>(1, "aKeep", #C5);
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.a] [@vm.inferred-type.metadata=!? (skip check)] #t2.{pro::BuilderInfo::a}<core::int*>(2, "bDrop", #C5);
     [@vm.direct-call.metadata=protobuf::BuilderInfo.hasRequiredFields] [@vm.inferred-type.metadata=!? (skip check)] #t2.{pro::BuilderInfo::hasRequiredFields} = false;
   } =>#t2;
   constructor _() → self::BarKeep*
@@ -98,21 +98,21 @@
     return [@vm.inferred-type.metadata=foo.pb.dart::BarKeep] self::BarKeep::create();
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:1]  get info_() → pro::BuilderInfo*
     return [@vm.inferred-type.metadata=protobuf::BuilderInfo?] self::BarKeep::_i;
-  @#C11
+  @#C10
   static method create() → self::BarKeep*
     return new self::BarKeep::_();
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:8] [@vm.unboxing-info.metadata=(i)->b]  @#C13
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:8] [@vm.unboxing-info.metadata=(i)->b]  @#C12
   set aKeep([@vm.inferred-type.metadata=dart.core::_Smi] core::int* v) → void {
     [@vm.direct-call.metadata=protobuf::GeneratedMessage.$_setSignedInt32] [@vm.inferred-type.metadata=!? (skip check)] this.{pro::GeneratedMessage::$_setSignedInt32}(0, v);
   }
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:9] [@vm.unboxing-info.metadata=(i)->b]  @#C25
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:9] [@vm.unboxing-info.metadata=(i)->b]  @#C24
   set bDrop([@vm.inferred-type.metadata=dart.core::_Smi (value: 4)] core::int* v) → void {
     [@vm.direct-call.metadata=protobuf::GeneratedMessage.$_setSignedInt32] [@vm.inferred-type.metadata=!? (skip check)] this.{pro::GeneratedMessage::$_setSignedInt32}(1, v);
   }
 }
 class HasKeep extends pro::GeneratedMessage {
-[@vm.inferred-type.metadata=protobuf::BuilderInfo?]  static final field pro::BuilderInfo* _i = let final pro::BuilderInfo* #t3 = new pro::BuilderInfo::•("HasKeep", createEmptyInstance: #C7) in block {
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.add] [@vm.inferred-type.metadata=!? (skip check)] #t3.{pro::BuilderInfo::add}<core::Null?>(0, null, null, null, null, null, null);
+[@vm.inferred-type.metadata=protobuf::BuilderInfo?]  static final field pro::BuilderInfo* _i = let final pro::BuilderInfo* #t3 = new pro::BuilderInfo::•("HasKeep") in block {
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.add] [@vm.inferred-type.metadata=!? (skip check)] #t3.{pro::BuilderInfo::add}<Null>(0, null, null, null, null, null, null);
     [@vm.direct-call.metadata=protobuf::BuilderInfo.hasRequiredFields] [@vm.inferred-type.metadata=!? (skip check)] #t3.{pro::BuilderInfo::hasRequiredFields} = false;
   } =>#t3;
   constructor _() → self::HasKeep*
@@ -122,13 +122,13 @@
     return [@vm.inferred-type.metadata=foo.pb.dart::HasKeep] self::HasKeep::create();
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:1]  get info_() → pro::BuilderInfo*
     return [@vm.inferred-type.metadata=protobuf::BuilderInfo?] self::HasKeep::_i;
-  @#C11
+  @#C10
   static method create() → self::HasKeep*
     return new self::HasKeep::_();
 }
 class ClearKeep extends pro::GeneratedMessage {
-[@vm.inferred-type.metadata=protobuf::BuilderInfo?]  static final field pro::BuilderInfo* _i = let final pro::BuilderInfo* #t4 = new pro::BuilderInfo::•("ClearKeep", createEmptyInstance: #C8) in block {
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.add] [@vm.inferred-type.metadata=!? (skip check)] #t4.{pro::BuilderInfo::add}<core::Null?>(0, null, null, null, null, null, null);
+[@vm.inferred-type.metadata=protobuf::BuilderInfo?]  static final field pro::BuilderInfo* _i = let final pro::BuilderInfo* #t4 = new pro::BuilderInfo::•("ClearKeep") in block {
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.add] [@vm.inferred-type.metadata=!? (skip check)] #t4.{pro::BuilderInfo::add}<Null>(0, null, null, null, null, null, null);
     [@vm.direct-call.metadata=protobuf::BuilderInfo.hasRequiredFields] [@vm.inferred-type.metadata=!? (skip check)] #t4.{pro::BuilderInfo::hasRequiredFields} = false;
   } =>#t4;
   constructor _() → self::ClearKeep*
@@ -138,13 +138,13 @@
     return [@vm.inferred-type.metadata=foo.pb.dart::ClearKeep] self::ClearKeep::create();
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:1]  get info_() → pro::BuilderInfo*
     return [@vm.inferred-type.metadata=protobuf::BuilderInfo?] self::ClearKeep::_i;
-  @#C11
+  @#C10
   static method create() → self::ClearKeep*
     return new self::ClearKeep::_();
 }
 class ZopDrop extends pro::GeneratedMessage {
-[@vm.inferred-type.metadata=protobuf::BuilderInfo?]  static final field pro::BuilderInfo* _i = let final pro::BuilderInfo* #t5 = new pro::BuilderInfo::•("ZopDrop", createEmptyInstance: #C5) in block {
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.a] [@vm.inferred-type.metadata=!? (skip check)] #t5.{pro::BuilderInfo::a}<core::int*>(1, "aDrop", #C6, protoName: "aDrop");
+[@vm.inferred-type.metadata=protobuf::BuilderInfo?]  static final field pro::BuilderInfo* _i = let final pro::BuilderInfo* #t5 = new pro::BuilderInfo::•("ZopDrop") in block {
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.a] [@vm.inferred-type.metadata=!? (skip check)] #t5.{pro::BuilderInfo::a}<core::int*>(1, "aDrop", #C5);
     [@vm.direct-call.metadata=protobuf::BuilderInfo.hasRequiredFields] [@vm.inferred-type.metadata=!? (skip check)] #t5.{pro::BuilderInfo::hasRequiredFields} = false;
   } =>#t5;
   constructor _() → self::ZopDrop*
@@ -154,10 +154,10 @@
     return [@vm.inferred-type.metadata=foo.pb.dart::ZopDrop] self::ZopDrop::create();
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:1]  get info_() → pro::BuilderInfo*
     return [@vm.inferred-type.metadata=protobuf::BuilderInfo?] self::ZopDrop::_i;
-  @#C11
+  @#C10
   static method create() → self::ZopDrop*
     return new self::ZopDrop::_();
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:10] [@vm.unboxing-info.metadata=(i)->b]  @#C13
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:10] [@vm.unboxing-info.metadata=(i)->b]  @#C12
   set aDrop([@vm.inferred-type.metadata=dart.core::_Smi (value: 3)] core::int* v) → void {
     [@vm.direct-call.metadata=protobuf::GeneratedMessage.$_setSignedInt32] [@vm.inferred-type.metadata=!? (skip check)] this.{pro::GeneratedMessage::$_setSignedInt32}(0, v);
   }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/freeze_test.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/freeze_test.dart.expect
index b0155db..6423786 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/freeze_test.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/freeze_test.dart.expect
@@ -21,7 +21,7 @@
     } =>#t3);
     [@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep.aKeep] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pb::FooKeep::aKeep} = 43;
   } =>#t1;
-  tes::test("Freezing a message works", () → core::Null? {
+  tes::test("Freezing a message works", () → Null {
     [@vm.direct-call.metadata=protobuf::GeneratedMessage.freeze] [@vm.inferred-type.metadata=!? (skip check)] foo.{pro::GeneratedMessage::freeze}();
     exp::expect([@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::BarKeep.aKeep??] [@vm.inferred-type.metadata=int] [@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep.barKeep] [@vm.inferred-type.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::BarKeep?] foo.{pb::FooKeep::barKeep}.{pb::BarKeep::aKeep}, 5);
     exp::expect([@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::BarKeep.aKeep??] [@vm.inferred-type.metadata=int] [@vm.inferred-type.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::BarKeep?] [@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep.mapKeep] [@vm.inferred-type.metadata=!] foo.{pb::FooKeep::mapKeep}.{core::Map::[]}("foo").{pb::BarKeep::aKeep}, 2);
@@ -39,14 +39,14 @@
 import "package:protobuf/protobuf.dart" as $pb;
 
 class FooKeep extends pro::GeneratedMessage {
-[@vm.inferred-type.metadata=protobuf::BuilderInfo?]  static final field pro::BuilderInfo* _i = let final pro::BuilderInfo* #t1 = new pro::BuilderInfo::•("FooKeep", createEmptyInstance: #C1) in block {
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.aOM] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::aOM}<self::BarKeep*>(1, "barKeep", protoName: "barKeep", subBuilder: #C2);
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.add] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::add}<core::Null?>(0, null, null, null, null, null, null);
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.m] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::m}<core::String*, self::BarKeep*>(3, "mapKeep", protoName: "mapKeep", entryClassName: "FooKeep.MapKeepEntry", keyFieldType: #C3, valueFieldType: #C4, valueCreator: #C2);
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.add] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::add}<core::Null?>(0, null, null, null, null, null, null);
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.a] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::a}<core::int*>(5, "aKeep", #C5, protoName: "aKeep");
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.aOM] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::aOM}<self::HasKeep*>(6, "hasKeep", protoName: "hasKeep", subBuilder: #C6);
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.aOM] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::aOM}<self::ClearKeep*>(7, "clearKeep", protoName: "clearKeep", subBuilder: #C7);
+[@vm.inferred-type.metadata=protobuf::BuilderInfo?]  static final field pro::BuilderInfo* _i = let final pro::BuilderInfo* #t1 = new pro::BuilderInfo::•("FooKeep") in block {
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.aOM] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::aOM}<self::BarKeep*>(1, "barKeep", #C1);
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.add] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::add}<Null>(0, null, null, null, null, null, null);
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.m] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::m}<core::String*, self::BarKeep*>(3, "mapKeep", "FooKeep.MapKeepEntry", #C2, "mapKeep", #C1, #C3);
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.add] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::add}<Null>(0, null, null, null, null, null, null);
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.a] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::a}<core::int*>(5, "aKeep", #C4);
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.aOM] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::aOM}<self::HasKeep*>(6, "hasKeep", #C5);
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.aOM] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::aOM}<self::ClearKeep*>(7, "clearKeep", #C6);
     [@vm.direct-call.metadata=protobuf::BuilderInfo.hasRequiredFields] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::hasRequiredFields} = false;
   } =>#t1;
   constructor _() → self::FooKeep*
@@ -56,37 +56,37 @@
     return [@vm.inferred-type.metadata=foo.pb.dart::FooKeep] self::FooKeep::create();
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:1]  get info_() → pro::BuilderInfo*
     return [@vm.inferred-type.metadata=protobuf::BuilderInfo?] self::FooKeep::_i;
-  @#C10
+  @#C9
   static method create() → self::FooKeep*
     return new self::FooKeep::_();
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:2,getterSelectorId:3]  @#C12
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:2,getterSelectorId:3]  @#C11
   get barKeep() → self::BarKeep*
     return [@vm.direct-call.metadata=protobuf::GeneratedMessage.$_getN] [@vm.inferred-type.metadata=foo.pb.dart::BarKeep? (skip check)] this.{pro::GeneratedMessage::$_getN}<self::BarKeep*>(0);
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:2,getterSelectorId:3]  @#C12
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:2,getterSelectorId:3]  @#C11
   set barKeep([@vm.inferred-type.metadata=foo.pb.dart::BarKeep] self::BarKeep* v) → void {
     [@vm.direct-call.metadata=protobuf::GeneratedMessage.setField] [@vm.inferred-type.metadata=!? (skip check)] this.{pro::GeneratedMessage::setField}(1, v);
   }
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:4]  @#C14
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:4]  @#C13
   get mapKeep() → core::Map<core::String*, self::BarKeep*>*
     return [@vm.direct-call.metadata=protobuf::GeneratedMessage.$_getMap] [@vm.inferred-type.metadata=! (skip check)] this.{pro::GeneratedMessage::$_getMap}<core::String*, self::BarKeep*>(2);
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6] [@vm.unboxing-info.metadata=()->i]  @#C16
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6] [@vm.unboxing-info.metadata=()->i]  @#C15
   get aKeep() → core::int*
     return [@vm.direct-call.metadata=protobuf::GeneratedMessage.$_getIZ] [@vm.inferred-type.metadata=int (skip check)] this.{pro::GeneratedMessage::$_getIZ}(4);
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6] [@vm.unboxing-info.metadata=(i)->b]  @#C16
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6] [@vm.unboxing-info.metadata=(i)->b]  @#C15
   set aKeep([@vm.inferred-type.metadata=dart.core::_Smi (value: 43)] core::int* v) → void {
     [@vm.direct-call.metadata=protobuf::GeneratedMessage.$_setSignedInt32] [@vm.inferred-type.metadata=!? (skip check)] this.{pro::GeneratedMessage::$_setSignedInt32}(4, v);
   }
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:7,getterSelectorId:8]  @#C18
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:7,getterSelectorId:8]  @#C17
   method hasHasKeep() → core::bool*
     return [@vm.direct-call.metadata=protobuf::GeneratedMessage.$_has] [@vm.inferred-type.metadata=dart.core::bool (skip check)] this.{pro::GeneratedMessage::$_has}(5);
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:9,getterSelectorId:10]  @#C20
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:9,getterSelectorId:10]  @#C19
   method clearClearKeep() → void
     return [@vm.direct-call.metadata=protobuf::GeneratedMessage.clearField] [@vm.inferred-type.metadata=dart.core::Null? (skip check) (value: null)] this.{pro::GeneratedMessage::clearField}(7);
 }
 class BarKeep extends pro::GeneratedMessage {
-[@vm.inferred-type.metadata=protobuf::BuilderInfo?]  static final field pro::BuilderInfo* _i = let final pro::BuilderInfo* #t2 = new pro::BuilderInfo::•("BarKeep", createEmptyInstance: #C2) in block {
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.a] [@vm.inferred-type.metadata=!? (skip check)] #t2.{pro::BuilderInfo::a}<core::int*>(1, "aKeep", #C5, protoName: "aKeep");
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.add] [@vm.inferred-type.metadata=!? (skip check)] #t2.{pro::BuilderInfo::add}<core::Null?>(0, null, null, null, null, null, null);
+[@vm.inferred-type.metadata=protobuf::BuilderInfo?]  static final field pro::BuilderInfo* _i = let final pro::BuilderInfo* #t2 = new pro::BuilderInfo::•("BarKeep") in block {
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.a] [@vm.inferred-type.metadata=!? (skip check)] #t2.{pro::BuilderInfo::a}<core::int*>(1, "aKeep", #C4);
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.add] [@vm.inferred-type.metadata=!? (skip check)] #t2.{pro::BuilderInfo::add}<Null>(0, null, null, null, null, null, null);
     [@vm.direct-call.metadata=protobuf::BuilderInfo.hasRequiredFields] [@vm.inferred-type.metadata=!? (skip check)] #t2.{pro::BuilderInfo::hasRequiredFields} = false;
   } =>#t2;
   constructor _() → self::BarKeep*
@@ -96,20 +96,20 @@
     return [@vm.inferred-type.metadata=foo.pb.dart::BarKeep] self::BarKeep::create();
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:1]  get info_() → pro::BuilderInfo*
     return [@vm.inferred-type.metadata=protobuf::BuilderInfo?] self::BarKeep::_i;
-  @#C10
+  @#C9
   static method create() → self::BarKeep*
     return new self::BarKeep::_();
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:11,getterSelectorId:12] [@vm.unboxing-info.metadata=()->i]  @#C12
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:11,getterSelectorId:12] [@vm.unboxing-info.metadata=()->i]  @#C11
   get aKeep() → core::int*
     return [@vm.direct-call.metadata=protobuf::GeneratedMessage.$_getIZ] [@vm.inferred-type.metadata=int (skip check)] this.{pro::GeneratedMessage::$_getIZ}(0);
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:11,getterSelectorId:12] [@vm.unboxing-info.metadata=(i)->b]  @#C12
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:11,getterSelectorId:12] [@vm.unboxing-info.metadata=(i)->b]  @#C11
   set aKeep([@vm.inferred-type.metadata=dart.core::_Smi] core::int* v) → void {
     [@vm.direct-call.metadata=protobuf::GeneratedMessage.$_setSignedInt32] [@vm.inferred-type.metadata=!? (skip check)] this.{pro::GeneratedMessage::$_setSignedInt32}(0, v);
   }
 }
 class HasKeep extends pro::GeneratedMessage {
-[@vm.inferred-type.metadata=protobuf::BuilderInfo?]  static final field pro::BuilderInfo* _i = let final pro::BuilderInfo* #t3 = new pro::BuilderInfo::•("HasKeep", createEmptyInstance: #C6) in block {
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.add] [@vm.inferred-type.metadata=!? (skip check)] #t3.{pro::BuilderInfo::add}<core::Null?>(0, null, null, null, null, null, null);
+[@vm.inferred-type.metadata=protobuf::BuilderInfo?]  static final field pro::BuilderInfo* _i = let final pro::BuilderInfo* #t3 = new pro::BuilderInfo::•("HasKeep") in block {
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.add] [@vm.inferred-type.metadata=!? (skip check)] #t3.{pro::BuilderInfo::add}<Null>(0, null, null, null, null, null, null);
     [@vm.direct-call.metadata=protobuf::BuilderInfo.hasRequiredFields] [@vm.inferred-type.metadata=!? (skip check)] #t3.{pro::BuilderInfo::hasRequiredFields} = false;
   } =>#t3;
   constructor _() → self::HasKeep*
@@ -117,13 +117,13 @@
     ;
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:1]  get info_() → pro::BuilderInfo*
     return [@vm.inferred-type.metadata=protobuf::BuilderInfo?] self::HasKeep::_i;
-  @#C10
+  @#C9
   static method create() → self::HasKeep*
     return new self::HasKeep::_();
 }
 class ClearKeep extends pro::GeneratedMessage {
-[@vm.inferred-type.metadata=protobuf::BuilderInfo?]  static final field pro::BuilderInfo* _i = let final pro::BuilderInfo* #t4 = new pro::BuilderInfo::•("ClearKeep", createEmptyInstance: #C7) in block {
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.add] [@vm.inferred-type.metadata=!? (skip check)] #t4.{pro::BuilderInfo::add}<core::Null?>(0, null, null, null, null, null, null);
+[@vm.inferred-type.metadata=protobuf::BuilderInfo?]  static final field pro::BuilderInfo* _i = let final pro::BuilderInfo* #t4 = new pro::BuilderInfo::•("ClearKeep") in block {
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.add] [@vm.inferred-type.metadata=!? (skip check)] #t4.{pro::BuilderInfo::add}<Null>(0, null, null, null, null, null, null);
     [@vm.direct-call.metadata=protobuf::BuilderInfo.hasRequiredFields] [@vm.inferred-type.metadata=!? (skip check)] #t4.{pro::BuilderInfo::hasRequiredFields} = false;
   } =>#t4;
   constructor _() → self::ClearKeep*
@@ -131,7 +131,7 @@
     ;
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:1]  get info_() → pro::BuilderInfo*
     return [@vm.inferred-type.metadata=protobuf::BuilderInfo?] self::ClearKeep::_i;
-  @#C10
+  @#C9
   static method create() → self::ClearKeep*
     return new self::ClearKeep::_();
 }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/name_mangling_test.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/name_mangling_test.dart.expect
index c392e78..599d0eb 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/name_mangling_test.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/name_mangling_test.dart.expect
@@ -21,7 +21,7 @@
 import "package:protobuf/protobuf.dart" as $pb;
 
 class AKeep extends pro::GeneratedMessage {
-[@vm.inferred-type.metadata=protobuf::BuilderInfo?]  static final field pro::BuilderInfo* _i = let final pro::BuilderInfo* #t1 = let core::String* #t2 = "AKeep" in let () →* self::AKeep* #t3 = #C1 in new pro::BuilderInfo::•(#t2, #t3) in block {
+[@vm.inferred-type.metadata=protobuf::BuilderInfo?]  static final field pro::BuilderInfo* _i = let final pro::BuilderInfo* #t1 = new pro::BuilderInfo::•("AKeep") in block {
     [@vm.direct-call.metadata=protobuf::BuilderInfo.hasRequiredFields] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::hasRequiredFields} = false;
   } =>#t1;
   constructor _() → self::AKeep*
@@ -30,39 +30,39 @@
   static factory •() → self::AKeep*
     return [@vm.inferred-type.metadata=name_mangling.pb.dart::AKeep] self::AKeep::create();
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2]  method clone() → self::AKeep*
-    return let final self::AKeep* #t4 = [@vm.inferred-type.metadata=name_mangling.pb.dart::AKeep] self::AKeep::•() in block {
-      [@vm.direct-call.metadata=protobuf::GeneratedMessage.mergeFromMessage] [@vm.inferred-type.metadata=!? (skip check)] #t4.{pro::GeneratedMessage::mergeFromMessage}(this);
-    } =>#t4;
+    return let final self::AKeep* #t2 = [@vm.inferred-type.metadata=name_mangling.pb.dart::AKeep] self::AKeep::•() in block {
+      [@vm.direct-call.metadata=protobuf::GeneratedMessage.mergeFromMessage] [@vm.inferred-type.metadata=!? (skip check)] #t2.{pro::GeneratedMessage::mergeFromMessage}(this);
+    } =>#t2;
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:3]  get info_() → pro::BuilderInfo*
     return [@vm.inferred-type.metadata=protobuf::BuilderInfo?] self::AKeep::_i;
-  @#C4
+  @#C3
   static method create() → self::AKeep*
     return new self::AKeep::_();
 }
 class NameManglingKeep extends pro::GeneratedMessage {
-[@vm.inferred-type.metadata=protobuf::BuilderInfo?]  static final field pro::BuilderInfo* _i = let final pro::BuilderInfo* #t5 = let core::String* #t6 = "NameManglingKeep" in let () →* self::NameManglingKeep* #t7 = #C5 in new pro::BuilderInfo::•(#t6, #t7) in block {
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.aOM] [@vm.inferred-type.metadata=!? (skip check)] #t5.{pro::BuilderInfo::aOM}<self::AKeep*>(10, "clone", subBuilder: #C1);
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.hasRequiredFields] [@vm.inferred-type.metadata=!? (skip check)] #t5.{pro::BuilderInfo::hasRequiredFields} = false;
-  } =>#t5;
+[@vm.inferred-type.metadata=protobuf::BuilderInfo?]  static final field pro::BuilderInfo* _i = let final pro::BuilderInfo* #t3 = new pro::BuilderInfo::•("NameManglingKeep") in block {
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.aOM] [@vm.inferred-type.metadata=!? (skip check)] #t3.{pro::BuilderInfo::aOM}<self::AKeep*>(10, "clone", #C4);
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.hasRequiredFields] [@vm.inferred-type.metadata=!? (skip check)] #t3.{pro::BuilderInfo::hasRequiredFields} = false;
+  } =>#t3;
   constructor _() → self::NameManglingKeep*
     : super pro::GeneratedMessage::•()
     ;
   static factory •() → self::NameManglingKeep*
     return [@vm.inferred-type.metadata=name_mangling.pb.dart::NameManglingKeep] self::NameManglingKeep::create();
-  static factory fromBuffer([@vm.inferred-type.metadata=dart.core::_GrowableList<dart.core::int*>] core::List<core::int*>* i, [[@vm.inferred-type.metadata=protobuf::_EmptyExtensionRegistry (value: const protobuf::_EmptyExtensionRegistry{})] pro::ExtensionRegistry* r = #C6]) → self::NameManglingKeep*
-    return let final self::NameManglingKeep* #t8 = [@vm.inferred-type.metadata=name_mangling.pb.dart::NameManglingKeep] self::NameManglingKeep::create() in block {
-      [@vm.direct-call.metadata=protobuf::GeneratedMessage.mergeFromBuffer] [@vm.inferred-type.metadata=!? (skip check)] #t8.{pro::GeneratedMessage::mergeFromBuffer}(i, r);
-    } =>#t8;
+  static factory fromBuffer([@vm.inferred-type.metadata=dart.core::_GrowableList<dart.core::int*>] core::List<core::int*>* i) → self::NameManglingKeep*
+    return let final self::NameManglingKeep* #t4 = [@vm.inferred-type.metadata=name_mangling.pb.dart::NameManglingKeep] self::NameManglingKeep::create() in block {
+      [@vm.direct-call.metadata=protobuf::GeneratedMessage.mergeFromBuffer] [@vm.inferred-type.metadata=!? (skip check)] #t4.{pro::GeneratedMessage::mergeFromBuffer}(i, #C5);
+    } =>#t4;
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2]  method clone() → self::NameManglingKeep*
-    return let final self::NameManglingKeep* #t9 = [@vm.inferred-type.metadata=name_mangling.pb.dart::NameManglingKeep] self::NameManglingKeep::•() in block {
-      [@vm.direct-call.metadata=protobuf::GeneratedMessage.mergeFromMessage] [@vm.inferred-type.metadata=!? (skip check)] #t9.{pro::GeneratedMessage::mergeFromMessage}(this);
-    } =>#t9;
+    return let final self::NameManglingKeep* #t5 = [@vm.inferred-type.metadata=name_mangling.pb.dart::NameManglingKeep] self::NameManglingKeep::•() in block {
+      [@vm.direct-call.metadata=protobuf::GeneratedMessage.mergeFromMessage] [@vm.inferred-type.metadata=!? (skip check)] #t5.{pro::GeneratedMessage::mergeFromMessage}(this);
+    } =>#t5;
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:3]  get info_() → pro::BuilderInfo*
     return [@vm.inferred-type.metadata=protobuf::BuilderInfo?] self::NameManglingKeep::_i;
-  @#C4
+  @#C3
   static method create() → self::NameManglingKeep*
     return new self::NameManglingKeep::_();
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:4,getterSelectorId:5]  @#C8
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:4,getterSelectorId:5]  @#C7
   method hasClone_10() → core::bool*
     return [@vm.direct-call.metadata=protobuf::GeneratedMessage.$_has] [@vm.inferred-type.metadata=dart.core::bool (skip check)] this.{pro::GeneratedMessage::$_has}(0);
 }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/set_map_constructor_concrete.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/set_map_constructor_concrete.dart.expect
index fa2eda6..413720d 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/set_map_constructor_concrete.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/set_map_constructor_concrete.dart.expect
@@ -9,15 +9,15 @@
 [@vm.inferred-type.metadata=dart.collection::_CompactLinkedHashSet?<dynamic>]static field core::Set<dynamic>* globalSet = new col::_CompactLinkedHashSet::•<dynamic>();
 [@vm.inferred-type.metadata=dart.collection::_CompactLinkedIdentityHashSet?<dynamic>]static field core::Set<dynamic>* identitySet = [@vm.inferred-type.metadata=dart.collection::_CompactLinkedIdentityHashSet<dynamic>] col::LinkedHashSet::identity<dynamic>();
 [@vm.inferred-type.metadata=dart.collection::_CompactLinkedHashSet?<dart.core::String*>]static field core::Set<core::String*>* linkedSet = new col::_CompactLinkedHashSet::•<core::String*>();
-static field core::Set<core::String*>* linkedIdentitySet = let (core::Object?, core::Object?) → core::bool #t1 = #C1 in let (core::Object?) → core::int #t2 = #C2 in [@vm.inferred-type.metadata=!] col::LinkedHashSet::•<core::String*>(#t1, #t2);
-static field core::Set<core::String*>* linkedCustomSet = let (core::String*, core::String*) →* core::bool* #t3 = (core::String* a, core::String* b) → core::bool* => a.{core::String::==}(b) in let (core::String*) →* core::int* #t4 = (core::String* o) → core::int* => o.{core::String::hashCode} in let (dynamic) →* core::bool* #t5 = (dynamic o) → core::bool* => true in [@vm.inferred-type.metadata=!] col::LinkedHashSet::•<core::String*>(#t3, #t4, isValidKey: #t5);
+static field core::Set<core::String*>* linkedIdentitySet = [@vm.inferred-type.metadata=!] col::LinkedHashSet::•<core::String*>(#C1, #C2);
+static field core::Set<core::String*>* linkedCustomSet = let final (core::String*, core::String*) →* core::bool* #t1 = (core::String* a, core::String* b) → core::bool* => a.{core::String::==}(b) in let final (core::String*) →* core::int* #t2 = (core::String* o) → core::int* => o.{core::String::hashCode} in let final (dynamic) →* core::bool* #t3 = (dynamic o) → core::bool* => true in [@vm.inferred-type.metadata=!] col::LinkedHashSet::•<core::String*>(#t1, #t2, isValidKey: #t3);
 [@vm.inferred-type.metadata=dart.collection::_InternalLinkedHashMap?<dynamic, dynamic>]static field core::Map<dynamic, dynamic>* globalMap = [@vm.inferred-type.metadata=dart.collection::_InternalLinkedHashMap<dynamic, dynamic>] core::Map::•<dynamic, dynamic>();
 [@vm.inferred-type.metadata=dart.collection::_CompactLinkedIdentityHashMap?<dynamic, dynamic>]static field core::Map<dynamic, dynamic>* identityMap = [@vm.inferred-type.metadata=dart.collection::_CompactLinkedIdentityHashMap<dynamic, dynamic>] col::LinkedHashMap::identity<dynamic, dynamic>();
 [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView?<dynamic, dynamic>]static field core::Map<dynamic, dynamic>* unmodifiableMap = [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dynamic, dynamic>] core::Map::unmodifiable<dynamic, dynamic>([@vm.inferred-type.metadata=dart.collection::_CompactLinkedIdentityHashMap?<dynamic, dynamic>] self::identityMap);
 [@vm.inferred-type.metadata=dart.collection::_InternalLinkedHashMap?<dynamic, dynamic>]static field core::Map<dynamic, dynamic>* globalMapLiteral = <dynamic, dynamic>{};
 [@vm.inferred-type.metadata=dart.collection::_InternalLinkedHashMap?<dart.core::String*, dart.core::String*>]static field core::Map<core::String*, core::String*>* linkedMap = new col::_InternalLinkedHashMap::•<core::String*, core::String*>();
-static field core::Map<core::String*, core::String*>* linkedIdentityMap = let (core::Object?, core::Object?) → core::bool #t6 = #C1 in let (core::Object?) → core::int #t7 = #C2 in [@vm.inferred-type.metadata=!] col::LinkedHashMap::•<core::String*, core::String*>(#t6, #t7);
-static field core::Map<core::String*, core::String*>* linkedCustomMap = let (core::String*, core::String*) →* core::bool* #t8 = (core::String* a, core::String* b) → core::bool* => a.{core::String::==}(b) in let (core::String*) →* core::int* #t9 = (core::String* o) → core::int* => o.{core::String::hashCode} in let (dynamic) →* core::bool* #t10 = (dynamic o) → core::bool* => true in [@vm.inferred-type.metadata=!] col::LinkedHashMap::•<core::String*, core::String*>(#t8, #t9, isValidKey: #t10);
+static field core::Map<core::String*, core::String*>* linkedIdentityMap = [@vm.inferred-type.metadata=!] col::LinkedHashMap::•<core::String*, core::String*>(#C1, #C2);
+static field core::Map<core::String*, core::String*>* linkedCustomMap = let final (core::String*, core::String*) →* core::bool* #t4 = (core::String* a, core::String* b) → core::bool* => a.{core::String::==}(b) in let final (core::String*) →* core::int* #t5 = (core::String* o) → core::int* => o.{core::String::hashCode} in let final (dynamic) →* core::bool* #t6 = (dynamic o) → core::bool* => true in [@vm.inferred-type.metadata=!] col::LinkedHashMap::•<core::String*, core::String*>(#t4, #t5, isValidKey: #t6);
 static method main() → dynamic {
   core::print([@vm.inferred-type.metadata=dart.collection::_CompactLinkedHashSet?<dynamic>] self::globalSet);
   core::print([@vm.inferred-type.metadata=dart.collection::_CompactLinkedIdentityHashSet?<dynamic>] self::identitySet);
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/unboxed_getters.dart b/pkg/vm/testcases/transformations/type_flow/transformer/unboxed_getters.dart
index 4de6f85..726b6c9 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/unboxed_getters.dart
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/unboxed_getters.dart
@@ -6,6 +6,11 @@
 final bool kFalse = int.parse('1') == 2 ? true : false;
 int get mint => 0xaabbccddaabbccdd;
 int get smiOrMint => kTrue ? 1 : mint;
+dynamic usedObject;
+
+void use(dynamic object) {
+  usedObject ??= object;
+}
 
 abstract class BI1 {
   int get value;
@@ -86,5 +91,3 @@
   final ubib = UBIB(); // getter returns smiOrMint
   use((kTrue ? ubia : ubib).value);
 }
-
-void use(dynamic object) {}
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/unboxed_getters.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/unboxed_getters.dart.expect
index be40648..4dbd258 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/unboxed_getters.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/unboxed_getters.dart.expect
@@ -69,10 +69,14 @@
     return [@vm.inferred-type.metadata=int] self::smiOrMint;
 }
 [@vm.inferred-type.metadata=dart.core::bool?]static final field core::bool* kTrue = [@vm.direct-call.metadata=dart.core::_IntegerImplementation.==] [@vm.inferred-type.metadata=dart.core::bool (skip check)] [@vm.inferred-type.metadata=int] core::int::parse("1").{core::num::==}(1) ?{core::bool*} true : false;
+[@vm.inferred-type.metadata=int?]static field dynamic usedObject;
 [@vm.unboxing-info.metadata=()->i]static get mint() → core::int*
   return -6144092014192636707;
 [@vm.unboxing-info.metadata=()->i]static get smiOrMint() → core::int*
   return [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::int*} 1 : [@vm.inferred-type.metadata=int] self::mint;
+static method use([@vm.inferred-type.metadata=int?] dynamic object) → void {
+  [@vm.inferred-type.metadata=!? (receiver not int)] [@vm.inferred-type.metadata=int?] self::usedObject.{core::Object::==}(null) ?{dynamic} self::usedObject = object : null;
+}
 static method main() → dynamic {
   final self::BI1A* bi1a = new self::BI1A::•([@vm.inferred-type.metadata=int] self::smiOrMint);
   final self::BI1B* bi1b = new self::BI1B::•();
@@ -88,4 +92,3 @@
   final self::UBIB* ubib = new self::UBIB::•();
   self::use([@vm.inferred-type.metadata=int]([@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{self::UBI*} ubia : ubib).{self::UBI::value});
 }
-static method use([@vm.inferred-type.metadata=int?] dynamic object) → void {}
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/unboxed_instance_fields.dart b/pkg/vm/testcases/transformations/type_flow/transformer/unboxed_instance_fields.dart
index 8ab5bc9..ff1a20e 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/unboxed_instance_fields.dart
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/unboxed_instance_fields.dart
@@ -6,6 +6,11 @@
 final bool kFalse = int.parse('1') == 2 ? true : false;
 int get mint => 0xaabbccddaabbccdd;
 int get smiOrMint => kTrue ? 1 : mint;
+dynamic usedObject;
+
+void use(dynamic object) {
+  usedObject ??= object;
+}
 
 class X {}
 
@@ -64,5 +69,3 @@
   use(a.boxedNullableX);
   use(a.boxedX);
 }
-
-void use(dynamic object) {}
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/unboxed_instance_fields.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/unboxed_instance_fields.dart.expect
index bce3568..65b0969 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/unboxed_instance_fields.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/unboxed_instance_fields.dart.expect
@@ -23,10 +23,14 @@
 }
 [@vm.inferred-type.metadata=dart.core::bool?]static final field core::bool* kTrue = [@vm.direct-call.metadata=dart.core::_IntegerImplementation.==] [@vm.inferred-type.metadata=dart.core::bool (skip check)] [@vm.inferred-type.metadata=int] core::int::parse("1").{core::num::==}(1) ?{core::bool*} true : false;
 [@vm.inferred-type.metadata=dart.core::bool?]static final field core::bool* kFalse = [@vm.direct-call.metadata=dart.core::_IntegerImplementation.==] [@vm.inferred-type.metadata=dart.core::bool (skip check)] [@vm.inferred-type.metadata=int] core::int::parse("1").{core::num::==}(2) ?{core::bool*} true : false;
+static field dynamic usedObject;
 [@vm.unboxing-info.metadata=()->i]static get mint() → core::int*
   return -6144092014192636707;
 [@vm.unboxing-info.metadata=()->i]static get smiOrMint() → core::int*
   return [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::int*} 1 : [@vm.inferred-type.metadata=int] self::mint;
+static method use(dynamic object) → void {
+  [@vm.inferred-type.metadata=!? (receiver not int)] self::usedObject.{core::Object::==}(null) ?{dynamic} self::usedObject = object : null;
+}
 static method main() → dynamic {
   final self::A* a = new self::A::•([@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::int*} 1 : 2, [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::int*} [@vm.inferred-type.metadata=int] self::smiOrMint : 2, [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::double*} 1.1 : 2.2, [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::int*} [@vm.inferred-type.metadata=int] self::smiOrMint : null, [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::double*} 1.1 : null, [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::num*} [@vm.inferred-type.metadata=int] self::smiOrMint : 1.1, [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::num*} [@vm.inferred-type.metadata=dart.core::bool?] self::kFalse ?{core::num*} [@vm.inferred-type.metadata=int] self::smiOrMint : 1.1 : null, [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{self::X*} new self::X::•() : null, new self::X::•());
   [@vm.direct-call.metadata=#lib::A.unboxedSmi] [@vm.inferred-type.metadata=!? (skip check)] a.{self::A::unboxedSmi} = [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::int*} 1 : 2;
@@ -48,4 +52,3 @@
   self::use([@vm.direct-call.metadata=#lib::A.boxedNullableX] [@vm.inferred-type.metadata=#lib::X?] a.{self::A::boxedNullableX});
   self::use([@vm.direct-call.metadata=#lib::A.boxedX] [@vm.inferred-type.metadata=#lib::X] a.{self::A::boxedX});
 }
-static method use(dynamic object) → void {}
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/unboxed_instance_method.dart b/pkg/vm/testcases/transformations/type_flow/transformer/unboxed_instance_method.dart
index bf63d64..f37b67e 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/unboxed_instance_method.dart
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/unboxed_instance_method.dart
@@ -6,6 +6,11 @@
 final bool kFalse = int.parse('1') == 2 ? true : false;
 int get mint => 0xaabbccddaabbccdd;
 int get smiOrMint => kTrue ? 1 : mint;
+dynamic usedObject;
+
+void use(dynamic object) {
+  usedObject ??= object;
+}
 
 class X {}
 
@@ -42,7 +47,16 @@
       dynamic boxedNonNullableIntOrDouble,
       dynamic boxedNullableIntOrDouble,
       dynamic boxedNullableX,
-      dynamic boxedX) {}
+      dynamic boxedX) {
+    use(unboxedInt);
+    use(unboxedDouble);
+    use(boxedNullableInt);
+    use(boxedNullableDouble);
+    use(boxedNonNullableIntOrDouble);
+    use(boxedNullableIntOrDouble);
+    use(boxedNullableX);
+    use(boxedX);
+  }
 
   dynamic returnUnboxedSmi(X ignored) => 1;
   dynamic returnUnboxedInt(X ignored) => 1;
@@ -65,7 +79,16 @@
       dynamic boxedNonNullableIntOrDouble,
       dynamic boxedNullableIntOrDouble,
       dynamic boxedNullableX,
-      dynamic boxedX) {}
+      dynamic boxedX) {
+    use(unboxedInt);
+    use(unboxedDouble);
+    use(boxedNullableInt);
+    use(boxedNullableDouble);
+    use(boxedNonNullableIntOrDouble);
+    use(boxedNullableIntOrDouble);
+    use(boxedNullableX);
+    use(boxedX);
+  }
 
   dynamic returnUnboxedSmi(X ignored) => 2;
   dynamic returnUnboxedInt(X ignored) => mint;
@@ -88,7 +111,16 @@
       dynamic boxedNonNullableIntOrDouble,
       dynamic boxedNullableIntOrDouble,
       dynamic boxedNullableX,
-      dynamic boxedX) {}
+      dynamic boxedX) {
+    use(unboxedInt);
+    use(unboxedDouble);
+    use(boxedNullableInt);
+    use(boxedNullableDouble);
+    use(boxedNonNullableIntOrDouble);
+    use(boxedNullableIntOrDouble);
+    use(boxedNullableX);
+    use(boxedX);
+  }
 
   dynamic returnUnboxedSmi(X ignored) => 3;
   dynamic returnUnboxedInt(X ignored) => mint;
@@ -154,5 +186,3 @@
   use(d.returnBoxedNullableX(null));
   use(d.returnBoxedX(null));
 }
-
-void use(dynamic value) {}
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/unboxed_instance_method.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/unboxed_instance_method.dart.expect
index e019e26..34bb4b0 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/unboxed_instance_method.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/unboxed_instance_method.dart.expect
@@ -8,136 +8,166 @@
     ;
 }
 abstract class Interface extends core::Object {
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2] [@vm.unboxing-info.metadata=(i,i,d,b,b,b,b,b,b)->b]  abstract method takePositional(core::int* unboxedSmi, dynamic unboxedInt, dynamic unboxedDouble, dynamic boxedNullableInt, dynamic boxedNullableDouble, dynamic boxedNonNullableIntOrDouble, dynamic boxedNullableIntOrDouble, dynamic boxedNullableX, dynamic boxedX) → void;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4] [@vm.unboxing-info.metadata=(b)->i]  abstract method returnUnboxedSmi(self::X* ignored) → dynamic;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6] [@vm.unboxing-info.metadata=(b)->i]  abstract method returnUnboxedInt(self::X* ignored) → dynamic;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:7,getterSelectorId:8] [@vm.unboxing-info.metadata=(b)->d]  abstract method returnUnboxedDouble(self::X* ignored) → dynamic;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:9,getterSelectorId:10]  abstract method returnBoxedNullableInt(self::X* ignored) → dynamic;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:11,getterSelectorId:12]  abstract method returnBoxedNullableDouble(self::X* ignored) → dynamic;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:13,getterSelectorId:14]  abstract method returnBoxedIntOrDouble(self::X* ignored) → dynamic;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:15,getterSelectorId:16]  abstract method returnBoxedNullableIntOrDouble(self::X* ignored) → dynamic;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:17,getterSelectorId:18]  abstract method returnBoxedNullableX(self::X* ignored) → dynamic;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:19,getterSelectorId:20]  abstract method returnBoxedX(self::X* ignored) → dynamic;
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2] [@vm.unboxing-info.metadata=(i,d,b,b,b,b,b,b)->b]  abstract method takePositional(dynamic unboxedInt, dynamic unboxedDouble, dynamic boxedNullableInt, dynamic boxedNullableDouble, dynamic boxedNonNullableIntOrDouble, dynamic boxedNullableIntOrDouble, dynamic boxedNullableX, dynamic boxedX) → void;
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4] [@vm.unboxing-info.metadata=()->i]  abstract method returnUnboxedSmi() → dynamic;
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6] [@vm.unboxing-info.metadata=()->i]  abstract method returnUnboxedInt() → dynamic;
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:7,getterSelectorId:8] [@vm.unboxing-info.metadata=()->d]  abstract method returnUnboxedDouble() → dynamic;
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:9,getterSelectorId:10]  abstract method returnBoxedNullableInt() → dynamic;
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:11,getterSelectorId:12]  abstract method returnBoxedNullableDouble() → dynamic;
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:13,getterSelectorId:14]  abstract method returnBoxedIntOrDouble() → dynamic;
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:15,getterSelectorId:16]  abstract method returnBoxedNullableIntOrDouble() → dynamic;
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:17,getterSelectorId:18]  abstract method returnBoxedNullableX() → dynamic;
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:19,getterSelectorId:20]  abstract method returnBoxedX() → dynamic;
 }
 class Impl1 extends core::Object implements self::Interface {
   synthetic constructor •() → self::Impl1*
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2] [@vm.unboxing-info.metadata=(i,i,d,b,b,b,b,b,b)->b]  method takePositional([@vm.inferred-type.metadata=dart.core::_Smi] core::int* unboxedSmi, [@vm.inferred-type.metadata=int] dynamic unboxedInt, [@vm.inferred-type.metadata=dart.core::_Double] dynamic unboxedDouble, [@vm.inferred-type.metadata=int?] dynamic boxedNullableInt, [@vm.inferred-type.metadata=dart.core::_Double?] dynamic boxedNullableDouble, [@vm.inferred-type.metadata=!] dynamic boxedNonNullableIntOrDouble, [@vm.inferred-type.metadata=dart.core::_Double?] dynamic boxedNullableIntOrDouble, [@vm.inferred-type.metadata=#lib::X?] dynamic boxedNullableX, [@vm.inferred-type.metadata=#lib::X] dynamic boxedX) → void {}
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4] [@vm.unboxing-info.metadata=(b)->i]  method returnUnboxedSmi([@vm.inferred-type.metadata=dart.core::Null? (value: null)] self::X* ignored) → dynamic
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2] [@vm.unboxing-info.metadata=(i,d,b,b,b,b,b,b)->b]  method takePositional([@vm.inferred-type.metadata=int] dynamic unboxedInt, [@vm.inferred-type.metadata=dart.core::_Double] dynamic unboxedDouble, [@vm.inferred-type.metadata=int?] dynamic boxedNullableInt, [@vm.inferred-type.metadata=dart.core::_Double?] dynamic boxedNullableDouble, [@vm.inferred-type.metadata=!] dynamic boxedNonNullableIntOrDouble, [@vm.inferred-type.metadata=dart.core::_Double?] dynamic boxedNullableIntOrDouble, [@vm.inferred-type.metadata=#lib::X?] dynamic boxedNullableX, [@vm.inferred-type.metadata=#lib::X] dynamic boxedX) → void {
+    self::use(unboxedInt);
+    self::use(unboxedDouble);
+    self::use(boxedNullableInt);
+    self::use(boxedNullableDouble);
+    self::use(boxedNonNullableIntOrDouble);
+    self::use(boxedNullableIntOrDouble);
+    self::use(boxedNullableX);
+    self::use(boxedX);
+  }
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4] [@vm.unboxing-info.metadata=()->i]  method returnUnboxedSmi() → dynamic
     return 1;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6] [@vm.unboxing-info.metadata=(b)->i]  method returnUnboxedInt([@vm.inferred-type.metadata=dart.core::Null? (value: null)] self::X* ignored) → dynamic
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6] [@vm.unboxing-info.metadata=()->i]  method returnUnboxedInt() → dynamic
     return 1;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:7,getterSelectorId:8] [@vm.unboxing-info.metadata=(b)->d]  method returnUnboxedDouble([@vm.inferred-type.metadata=dart.core::Null? (value: null)] self::X* ignored) → dynamic
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:7,getterSelectorId:8] [@vm.unboxing-info.metadata=()->d]  method returnUnboxedDouble() → dynamic
     return 1.1;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:9,getterSelectorId:10]  method returnBoxedNullableInt([@vm.inferred-type.metadata=dart.core::Null? (value: null)] self::X* ignored) → dynamic
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:9,getterSelectorId:10]  method returnBoxedNullableInt() → dynamic
     return null;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:11,getterSelectorId:12]  method returnBoxedNullableDouble([@vm.inferred-type.metadata=dart.core::Null? (value: null)] self::X* ignored) → dynamic
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:11,getterSelectorId:12]  method returnBoxedNullableDouble() → dynamic
     return null;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:13,getterSelectorId:14]  method returnBoxedIntOrDouble([@vm.inferred-type.metadata=dart.core::Null? (value: null)] self::X* ignored) → dynamic
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:13,getterSelectorId:14]  method returnBoxedIntOrDouble() → dynamic
     return 1;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:15,getterSelectorId:16]  method returnBoxedNullableIntOrDouble([@vm.inferred-type.metadata=dart.core::Null? (value: null)] self::X* ignored) → dynamic
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:15,getterSelectorId:16]  method returnBoxedNullableIntOrDouble() → dynamic
     return null;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:17,getterSelectorId:18]  method returnBoxedNullableX([@vm.inferred-type.metadata=dart.core::Null? (value: null)] self::X* ignored) → dynamic
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:17,getterSelectorId:18]  method returnBoxedNullableX() → dynamic
     return null;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:19,getterSelectorId:20]  method returnBoxedX([@vm.inferred-type.metadata=dart.core::Null? (value: null)] self::X* ignored) → dynamic
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:19,getterSelectorId:20]  method returnBoxedX() → dynamic
     return new self::X::•();
 }
 class BaseImpl2 extends core::Object {
   synthetic constructor •() → self::BaseImpl2*
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2] [@vm.unboxing-info.metadata=(i,i,d,b,b,b,b,b,b)->b]  method takePositional([@vm.inferred-type.metadata=dart.core::_Smi (value: 2)] core::int* unboxedSmi, [@vm.inferred-type.metadata=dart.core::_Smi (value: 2)] dynamic unboxedInt, [@vm.inferred-type.metadata=dart.core::_Double (value: 2.2)] dynamic unboxedDouble, [@vm.inferred-type.metadata=dart.core::_Smi (value: 2)] dynamic boxedNullableInt, [@vm.inferred-type.metadata=dart.core::_Double (value: 2.2)] dynamic boxedNullableDouble, [@vm.inferred-type.metadata=dart.core::_Double (value: 2.2)] dynamic boxedNonNullableIntOrDouble, [@vm.inferred-type.metadata=dart.core::_Smi (value: 2)] dynamic boxedNullableIntOrDouble, [@vm.inferred-type.metadata=#lib::X] dynamic boxedNullableX, [@vm.inferred-type.metadata=#lib::X] dynamic boxedX) → void {}
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4] [@vm.unboxing-info.metadata=(b)->i]  method returnUnboxedSmi([@vm.inferred-type.metadata=dart.core::Null? (value: null)] self::X* ignored) → dynamic
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2] [@vm.unboxing-info.metadata=(i,d,b,b,b,b,b,b)->b]  method takePositional([@vm.inferred-type.metadata=dart.core::_Smi (value: 2)] dynamic unboxedInt, [@vm.inferred-type.metadata=dart.core::_Double (value: 2.2)] dynamic unboxedDouble, [@vm.inferred-type.metadata=dart.core::_Smi (value: 2)] dynamic boxedNullableInt, [@vm.inferred-type.metadata=dart.core::_Double (value: 2.2)] dynamic boxedNullableDouble, [@vm.inferred-type.metadata=dart.core::_Double (value: 2.2)] dynamic boxedNonNullableIntOrDouble, [@vm.inferred-type.metadata=dart.core::_Smi (value: 2)] dynamic boxedNullableIntOrDouble, [@vm.inferred-type.metadata=#lib::X] dynamic boxedNullableX, [@vm.inferred-type.metadata=#lib::X] dynamic boxedX) → void {
+    self::use(unboxedInt);
+    self::use(unboxedDouble);
+    self::use(boxedNullableInt);
+    self::use(boxedNullableDouble);
+    self::use(boxedNonNullableIntOrDouble);
+    self::use(boxedNullableIntOrDouble);
+    self::use(boxedNullableX);
+    self::use(boxedX);
+  }
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4] [@vm.unboxing-info.metadata=()->i]  method returnUnboxedSmi() → dynamic
     return 2;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6] [@vm.unboxing-info.metadata=(b)->i]  method returnUnboxedInt([@vm.inferred-type.metadata=dart.core::Null? (value: null)] self::X* ignored) → dynamic
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6] [@vm.unboxing-info.metadata=()->i]  method returnUnboxedInt() → dynamic
     return [@vm.inferred-type.metadata=int] self::mint;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:7,getterSelectorId:8] [@vm.unboxing-info.metadata=(b)->d]  method returnUnboxedDouble([@vm.inferred-type.metadata=dart.core::Null? (value: null)] self::X* ignored) → dynamic
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:7,getterSelectorId:8] [@vm.unboxing-info.metadata=()->d]  method returnUnboxedDouble() → dynamic
     return 2.2;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:9,getterSelectorId:10]  method returnBoxedNullableInt([@vm.inferred-type.metadata=dart.core::Null? (value: null)] self::X* ignored) → dynamic
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:9,getterSelectorId:10]  method returnBoxedNullableInt() → dynamic
     return 2;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:11,getterSelectorId:12]  method returnBoxedNullableDouble([@vm.inferred-type.metadata=dart.core::Null? (value: null)] self::X* ignored) → dynamic
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:11,getterSelectorId:12]  method returnBoxedNullableDouble() → dynamic
     return 2.2;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:13,getterSelectorId:14]  method returnBoxedIntOrDouble([@vm.inferred-type.metadata=dart.core::Null? (value: null)] self::X* ignored) → dynamic
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:13,getterSelectorId:14]  method returnBoxedIntOrDouble() → dynamic
     return 2.2;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:15,getterSelectorId:16]  method returnBoxedNullableIntOrDouble([@vm.inferred-type.metadata=dart.core::Null? (value: null)] self::X* ignored) → dynamic
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:15,getterSelectorId:16]  method returnBoxedNullableIntOrDouble() → dynamic
     return 2;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:17,getterSelectorId:18]  method returnBoxedNullableX([@vm.inferred-type.metadata=dart.core::Null? (value: null)] self::X* ignored) → dynamic
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:17,getterSelectorId:18]  method returnBoxedNullableX() → dynamic
     return new self::X::•();
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:19,getterSelectorId:20]  method returnBoxedX([@vm.inferred-type.metadata=dart.core::Null? (value: null)] self::X* ignored) → dynamic
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:19,getterSelectorId:20]  method returnBoxedX() → dynamic
     return new self::X::•();
 }
 class SubImpl3 extends self::BaseImpl2 implements self::Interface {
   synthetic constructor •() → self::SubImpl3*
     : super self::BaseImpl2::•()
     ;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2] [@vm.unboxing-info.metadata=(i,i,d,b,b,b,b,b,b)->b]  method takePositional([@vm.inferred-type.metadata=dart.core::_Smi] core::int* unboxedSmi, [@vm.inferred-type.metadata=int] dynamic unboxedInt, [@vm.inferred-type.metadata=dart.core::_Double] dynamic unboxedDouble, [@vm.inferred-type.metadata=int] dynamic boxedNullableInt, [@vm.inferred-type.metadata=dart.core::_Double] dynamic boxedNullableDouble, [@vm.inferred-type.metadata=dart.core::_Double] dynamic boxedNonNullableIntOrDouble, [@vm.inferred-type.metadata=!] dynamic boxedNullableIntOrDouble, [@vm.inferred-type.metadata=#lib::X] dynamic boxedNullableX, [@vm.inferred-type.metadata=#lib::X] dynamic boxedX) → void {}
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4] [@vm.unboxing-info.metadata=(b)->i]  method returnUnboxedSmi([@vm.inferred-type.metadata=dart.core::Null? (value: null)] self::X* ignored) → dynamic
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2] [@vm.unboxing-info.metadata=(i,d,b,b,b,b,b,b)->b]  method takePositional([@vm.inferred-type.metadata=int] dynamic unboxedInt, [@vm.inferred-type.metadata=dart.core::_Double] dynamic unboxedDouble, [@vm.inferred-type.metadata=int] dynamic boxedNullableInt, [@vm.inferred-type.metadata=dart.core::_Double] dynamic boxedNullableDouble, [@vm.inferred-type.metadata=dart.core::_Double] dynamic boxedNonNullableIntOrDouble, [@vm.inferred-type.metadata=!] dynamic boxedNullableIntOrDouble, [@vm.inferred-type.metadata=#lib::X] dynamic boxedNullableX, [@vm.inferred-type.metadata=#lib::X] dynamic boxedX) → void {
+    self::use(unboxedInt);
+    self::use(unboxedDouble);
+    self::use(boxedNullableInt);
+    self::use(boxedNullableDouble);
+    self::use(boxedNonNullableIntOrDouble);
+    self::use(boxedNullableIntOrDouble);
+    self::use(boxedNullableX);
+    self::use(boxedX);
+  }
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4] [@vm.unboxing-info.metadata=()->i]  method returnUnboxedSmi() → dynamic
     return 3;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6] [@vm.unboxing-info.metadata=(b)->i]  method returnUnboxedInt([@vm.inferred-type.metadata=dart.core::Null? (value: null)] self::X* ignored) → dynamic
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6] [@vm.unboxing-info.metadata=()->i]  method returnUnboxedInt() → dynamic
     return [@vm.inferred-type.metadata=int] self::mint;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:7,getterSelectorId:8] [@vm.unboxing-info.metadata=(b)->d]  method returnUnboxedDouble([@vm.inferred-type.metadata=dart.core::Null? (value: null)] self::X* ignored) → dynamic
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:7,getterSelectorId:8] [@vm.unboxing-info.metadata=()->d]  method returnUnboxedDouble() → dynamic
     return 3.3;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:9,getterSelectorId:10]  method returnBoxedNullableInt([@vm.inferred-type.metadata=dart.core::Null? (value: null)] self::X* ignored) → dynamic
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:9,getterSelectorId:10]  method returnBoxedNullableInt() → dynamic
     return [@vm.inferred-type.metadata=int] self::mint;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:11,getterSelectorId:12]  method returnBoxedNullableDouble([@vm.inferred-type.metadata=dart.core::Null? (value: null)] self::X* ignored) → dynamic
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:11,getterSelectorId:12]  method returnBoxedNullableDouble() → dynamic
     return 3.3;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:13,getterSelectorId:14]  method returnBoxedIntOrDouble([@vm.inferred-type.metadata=dart.core::Null? (value: null)] self::X* ignored) → dynamic
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:13,getterSelectorId:14]  method returnBoxedIntOrDouble() → dynamic
     return 3.3;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:15,getterSelectorId:16]  method returnBoxedNullableIntOrDouble([@vm.inferred-type.metadata=dart.core::Null? (value: null)] self::X* ignored) → dynamic
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:15,getterSelectorId:16]  method returnBoxedNullableIntOrDouble() → dynamic
     return 3.3;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:17,getterSelectorId:18]  method returnBoxedNullableX([@vm.inferred-type.metadata=dart.core::Null? (value: null)] self::X* ignored) → dynamic
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:17,getterSelectorId:18]  method returnBoxedNullableX() → dynamic
     return new self::X::•();
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:19,getterSelectorId:20]  method returnBoxedX([@vm.inferred-type.metadata=dart.core::Null? (value: null)] self::X* ignored) → dynamic
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:19,getterSelectorId:20]  method returnBoxedX() → dynamic
     return new self::X::•();
 }
+static field dynamic usedObject;
 [@vm.unboxing-info.metadata=()->i]static get mint() → core::int*
   return -6144092014192636707;
+static method use(dynamic object) → void {
+  [@vm.inferred-type.metadata=!? (receiver not int)] self::usedObject.{core::Object::==}(null) ?{dynamic} self::usedObject = object : null;
+}
 static method main() → dynamic {
   final core::List<core::Object*>* values = <core::Object*>[new self::Impl1::•(), new self::BaseImpl2::•(), new self::SubImpl3::•()];
   final self::Impl1* a = [@vm.direct-call.metadata=dart.core::_GrowableList.[]] [@vm.inferred-type.metadata=!? (skip check)] values.{core::List::[]}([@vm.inferred-type.metadata=int] core::int::parse("0")) as self::Impl1*;
   final self::BaseImpl2* b = [@vm.direct-call.metadata=dart.core::_GrowableList.[]] [@vm.inferred-type.metadata=!? (skip check)] values.{core::List::[]}([@vm.inferred-type.metadata=int] core::int::parse("1")) as self::BaseImpl2*;
   final self::SubImpl3* c = [@vm.direct-call.metadata=dart.core::_GrowableList.[]] [@vm.inferred-type.metadata=!? (skip check)] values.{core::List::[]}([@vm.inferred-type.metadata=int] core::int::parse("2")) as self::SubImpl3*;
   final self::Interface* d = [@vm.direct-call.metadata=dart.core::_GrowableList.[]] [@vm.inferred-type.metadata=!? (skip check)] values.{core::List::[]}([@vm.inferred-type.metadata=int] core::int::parse("2")) as self::Interface*;
-  [@vm.direct-call.metadata=#lib::Impl1.takePositional??] [@vm.inferred-type.metadata=!? (skip check)] a.{self::Impl1::takePositional}(1, 1, 1.1, null, null, 1, null, null, new self::X::•());
-  b.{self::BaseImpl2::takePositional}(2, 2, 2.2, 2, 2.2, 2.2, 2, new self::X::•(), new self::X::•());
-  [@vm.direct-call.metadata=#lib::SubImpl3.takePositional??] [@vm.inferred-type.metadata=!? (skip check)] c.{self::SubImpl3::takePositional}(3, [@vm.inferred-type.metadata=int] self::mint, 3.3, [@vm.inferred-type.metadata=int] self::mint, 3.3, 3.3, 3.3, new self::X::•(), new self::X::•());
-  d.{self::Interface::takePositional}(3, [@vm.inferred-type.metadata=int] self::mint, 3.3, [@vm.inferred-type.metadata=int] self::mint, 3.3, 3.3, 3.3, new self::X::•(), new self::X::•());
-  self::use([@vm.direct-call.metadata=#lib::Impl1.returnUnboxedSmi] [@vm.inferred-type.metadata=dart.core::_Smi (skip check) (value: 1)] a.{self::Impl1::returnUnboxedSmi}(null));
-  self::use([@vm.direct-call.metadata=#lib::Impl1.returnUnboxedInt] [@vm.inferred-type.metadata=dart.core::_Smi (skip check) (value: 1)] a.{self::Impl1::returnUnboxedInt}(null));
-  self::use([@vm.direct-call.metadata=#lib::Impl1.returnUnboxedDouble] [@vm.inferred-type.metadata=dart.core::_Double (skip check) (value: 1.1)] a.{self::Impl1::returnUnboxedDouble}(null));
-  self::use([@vm.direct-call.metadata=#lib::Impl1.returnBoxedNullableInt] [@vm.inferred-type.metadata=dart.core::Null? (skip check) (value: null)] a.{self::Impl1::returnBoxedNullableInt}(null));
-  self::use([@vm.direct-call.metadata=#lib::Impl1.returnBoxedNullableDouble] [@vm.inferred-type.metadata=dart.core::Null? (skip check) (value: null)] a.{self::Impl1::returnBoxedNullableDouble}(null));
-  self::use([@vm.direct-call.metadata=#lib::Impl1.returnBoxedIntOrDouble] [@vm.inferred-type.metadata=dart.core::_Smi (skip check) (value: 1)] a.{self::Impl1::returnBoxedIntOrDouble}(null));
-  self::use([@vm.direct-call.metadata=#lib::Impl1.returnBoxedNullableIntOrDouble] [@vm.inferred-type.metadata=dart.core::Null? (skip check) (value: null)] a.{self::Impl1::returnBoxedNullableIntOrDouble}(null));
-  self::use([@vm.direct-call.metadata=#lib::Impl1.returnBoxedNullableX] [@vm.inferred-type.metadata=dart.core::Null? (skip check) (value: null)] a.{self::Impl1::returnBoxedNullableX}(null));
-  self::use([@vm.direct-call.metadata=#lib::Impl1.returnBoxedX] [@vm.inferred-type.metadata=#lib::X (skip check)] a.{self::Impl1::returnBoxedX}(null));
-  self::use([@vm.inferred-type.metadata=dart.core::_Smi] b.{self::BaseImpl2::returnUnboxedSmi}(null));
-  self::use([@vm.inferred-type.metadata=int] b.{self::BaseImpl2::returnUnboxedInt}(null));
-  self::use([@vm.inferred-type.metadata=dart.core::_Double] b.{self::BaseImpl2::returnUnboxedDouble}(null));
-  self::use([@vm.inferred-type.metadata=int] b.{self::BaseImpl2::returnBoxedNullableInt}(null));
-  self::use([@vm.inferred-type.metadata=dart.core::_Double] b.{self::BaseImpl2::returnBoxedNullableDouble}(null));
-  self::use([@vm.inferred-type.metadata=dart.core::_Double] b.{self::BaseImpl2::returnBoxedIntOrDouble}(null));
-  self::use([@vm.inferred-type.metadata=!] b.{self::BaseImpl2::returnBoxedNullableIntOrDouble}(null));
-  self::use([@vm.inferred-type.metadata=#lib::X] b.{self::BaseImpl2::returnBoxedNullableX}(null));
-  self::use([@vm.inferred-type.metadata=#lib::X] b.{self::BaseImpl2::returnBoxedX}(null));
-  self::use([@vm.direct-call.metadata=#lib::SubImpl3.returnUnboxedSmi] [@vm.inferred-type.metadata=dart.core::_Smi (skip check) (value: 3)] c.{self::SubImpl3::returnUnboxedSmi}(null));
-  self::use([@vm.direct-call.metadata=#lib::SubImpl3.returnUnboxedInt] [@vm.inferred-type.metadata=int (skip check)] c.{self::SubImpl3::returnUnboxedInt}(null));
-  self::use([@vm.direct-call.metadata=#lib::SubImpl3.returnUnboxedDouble] [@vm.inferred-type.metadata=dart.core::_Double (skip check) (value: 3.3)] c.{self::SubImpl3::returnUnboxedDouble}(null));
-  self::use([@vm.direct-call.metadata=#lib::SubImpl3.returnBoxedNullableInt] [@vm.inferred-type.metadata=int (skip check)] c.{self::SubImpl3::returnBoxedNullableInt}(null));
-  self::use([@vm.direct-call.metadata=#lib::SubImpl3.returnBoxedNullableDouble] [@vm.inferred-type.metadata=dart.core::_Double (skip check) (value: 3.3)] c.{self::SubImpl3::returnBoxedNullableDouble}(null));
-  self::use([@vm.direct-call.metadata=#lib::SubImpl3.returnBoxedIntOrDouble] [@vm.inferred-type.metadata=dart.core::_Double (skip check) (value: 3.3)] c.{self::SubImpl3::returnBoxedIntOrDouble}(null));
-  self::use([@vm.direct-call.metadata=#lib::SubImpl3.returnBoxedNullableIntOrDouble] [@vm.inferred-type.metadata=dart.core::_Double (skip check) (value: 3.3)] c.{self::SubImpl3::returnBoxedNullableIntOrDouble}(null));
-  self::use([@vm.direct-call.metadata=#lib::SubImpl3.returnBoxedNullableX] [@vm.inferred-type.metadata=#lib::X (skip check)] c.{self::SubImpl3::returnBoxedNullableX}(null));
-  self::use([@vm.direct-call.metadata=#lib::SubImpl3.returnBoxedX] [@vm.inferred-type.metadata=#lib::X (skip check)] c.{self::SubImpl3::returnBoxedX}(null));
-  self::use([@vm.inferred-type.metadata=dart.core::_Smi] d.{self::Interface::returnUnboxedSmi}(null));
-  self::use([@vm.inferred-type.metadata=int] d.{self::Interface::returnUnboxedInt}(null));
-  self::use([@vm.inferred-type.metadata=dart.core::_Double] d.{self::Interface::returnUnboxedDouble}(null));
-  self::use([@vm.inferred-type.metadata=int?] d.{self::Interface::returnBoxedNullableInt}(null));
-  self::use([@vm.inferred-type.metadata=dart.core::_Double?] d.{self::Interface::returnBoxedNullableDouble}(null));
-  self::use([@vm.inferred-type.metadata=!] d.{self::Interface::returnBoxedIntOrDouble}(null));
-  self::use([@vm.inferred-type.metadata=dart.core::_Double?] d.{self::Interface::returnBoxedNullableIntOrDouble}(null));
-  self::use([@vm.inferred-type.metadata=#lib::X?] d.{self::Interface::returnBoxedNullableX}(null));
-  self::use([@vm.inferred-type.metadata=#lib::X] d.{self::Interface::returnBoxedX}(null));
+  [@vm.direct-call.metadata=#lib::Impl1.takePositional??] [@vm.inferred-type.metadata=!? (skip check)] a.{self::Impl1::takePositional}(1, 1.1, null, null, 1, null, null, new self::X::•());
+  b.{self::BaseImpl2::takePositional}(2, 2.2, 2, 2.2, 2.2, 2, new self::X::•(), new self::X::•());
+  [@vm.direct-call.metadata=#lib::SubImpl3.takePositional??] [@vm.inferred-type.metadata=!? (skip check)] c.{self::SubImpl3::takePositional}([@vm.inferred-type.metadata=int] self::mint, 3.3, [@vm.inferred-type.metadata=int] self::mint, 3.3, 3.3, 3.3, new self::X::•(), new self::X::•());
+  d.{self::Interface::takePositional}([@vm.inferred-type.metadata=int] self::mint, 3.3, [@vm.inferred-type.metadata=int] self::mint, 3.3, 3.3, 3.3, new self::X::•(), new self::X::•());
+  self::use([@vm.direct-call.metadata=#lib::Impl1.returnUnboxedSmi] [@vm.inferred-type.metadata=dart.core::_Smi (skip check) (value: 1)] a.{self::Impl1::returnUnboxedSmi}());
+  self::use([@vm.direct-call.metadata=#lib::Impl1.returnUnboxedInt] [@vm.inferred-type.metadata=dart.core::_Smi (skip check) (value: 1)] a.{self::Impl1::returnUnboxedInt}());
+  self::use([@vm.direct-call.metadata=#lib::Impl1.returnUnboxedDouble] [@vm.inferred-type.metadata=dart.core::_Double (skip check) (value: 1.1)] a.{self::Impl1::returnUnboxedDouble}());
+  self::use([@vm.direct-call.metadata=#lib::Impl1.returnBoxedNullableInt] [@vm.inferred-type.metadata=dart.core::Null? (skip check) (value: null)] a.{self::Impl1::returnBoxedNullableInt}());
+  self::use([@vm.direct-call.metadata=#lib::Impl1.returnBoxedNullableDouble] [@vm.inferred-type.metadata=dart.core::Null? (skip check) (value: null)] a.{self::Impl1::returnBoxedNullableDouble}());
+  self::use([@vm.direct-call.metadata=#lib::Impl1.returnBoxedIntOrDouble] [@vm.inferred-type.metadata=dart.core::_Smi (skip check) (value: 1)] a.{self::Impl1::returnBoxedIntOrDouble}());
+  self::use([@vm.direct-call.metadata=#lib::Impl1.returnBoxedNullableIntOrDouble] [@vm.inferred-type.metadata=dart.core::Null? (skip check) (value: null)] a.{self::Impl1::returnBoxedNullableIntOrDouble}());
+  self::use([@vm.direct-call.metadata=#lib::Impl1.returnBoxedNullableX] [@vm.inferred-type.metadata=dart.core::Null? (skip check) (value: null)] a.{self::Impl1::returnBoxedNullableX}());
+  self::use([@vm.direct-call.metadata=#lib::Impl1.returnBoxedX] [@vm.inferred-type.metadata=#lib::X (skip check)] a.{self::Impl1::returnBoxedX}());
+  self::use([@vm.inferred-type.metadata=dart.core::_Smi] b.{self::BaseImpl2::returnUnboxedSmi}());
+  self::use([@vm.inferred-type.metadata=int] b.{self::BaseImpl2::returnUnboxedInt}());
+  self::use([@vm.inferred-type.metadata=dart.core::_Double] b.{self::BaseImpl2::returnUnboxedDouble}());
+  self::use([@vm.inferred-type.metadata=int] b.{self::BaseImpl2::returnBoxedNullableInt}());
+  self::use([@vm.inferred-type.metadata=dart.core::_Double] b.{self::BaseImpl2::returnBoxedNullableDouble}());
+  self::use([@vm.inferred-type.metadata=dart.core::_Double] b.{self::BaseImpl2::returnBoxedIntOrDouble}());
+  self::use([@vm.inferred-type.metadata=!] b.{self::BaseImpl2::returnBoxedNullableIntOrDouble}());
+  self::use([@vm.inferred-type.metadata=#lib::X] b.{self::BaseImpl2::returnBoxedNullableX}());
+  self::use([@vm.inferred-type.metadata=#lib::X] b.{self::BaseImpl2::returnBoxedX}());
+  self::use([@vm.direct-call.metadata=#lib::SubImpl3.returnUnboxedSmi] [@vm.inferred-type.metadata=dart.core::_Smi (skip check) (value: 3)] c.{self::SubImpl3::returnUnboxedSmi}());
+  self::use([@vm.direct-call.metadata=#lib::SubImpl3.returnUnboxedInt] [@vm.inferred-type.metadata=int (skip check)] c.{self::SubImpl3::returnUnboxedInt}());
+  self::use([@vm.direct-call.metadata=#lib::SubImpl3.returnUnboxedDouble] [@vm.inferred-type.metadata=dart.core::_Double (skip check) (value: 3.3)] c.{self::SubImpl3::returnUnboxedDouble}());
+  self::use([@vm.direct-call.metadata=#lib::SubImpl3.returnBoxedNullableInt] [@vm.inferred-type.metadata=int (skip check)] c.{self::SubImpl3::returnBoxedNullableInt}());
+  self::use([@vm.direct-call.metadata=#lib::SubImpl3.returnBoxedNullableDouble] [@vm.inferred-type.metadata=dart.core::_Double (skip check) (value: 3.3)] c.{self::SubImpl3::returnBoxedNullableDouble}());
+  self::use([@vm.direct-call.metadata=#lib::SubImpl3.returnBoxedIntOrDouble] [@vm.inferred-type.metadata=dart.core::_Double (skip check) (value: 3.3)] c.{self::SubImpl3::returnBoxedIntOrDouble}());
+  self::use([@vm.direct-call.metadata=#lib::SubImpl3.returnBoxedNullableIntOrDouble] [@vm.inferred-type.metadata=dart.core::_Double (skip check) (value: 3.3)] c.{self::SubImpl3::returnBoxedNullableIntOrDouble}());
+  self::use([@vm.direct-call.metadata=#lib::SubImpl3.returnBoxedNullableX] [@vm.inferred-type.metadata=#lib::X (skip check)] c.{self::SubImpl3::returnBoxedNullableX}());
+  self::use([@vm.direct-call.metadata=#lib::SubImpl3.returnBoxedX] [@vm.inferred-type.metadata=#lib::X (skip check)] c.{self::SubImpl3::returnBoxedX}());
+  self::use([@vm.inferred-type.metadata=dart.core::_Smi] d.{self::Interface::returnUnboxedSmi}());
+  self::use([@vm.inferred-type.metadata=int] d.{self::Interface::returnUnboxedInt}());
+  self::use([@vm.inferred-type.metadata=dart.core::_Double] d.{self::Interface::returnUnboxedDouble}());
+  self::use([@vm.inferred-type.metadata=int?] d.{self::Interface::returnBoxedNullableInt}());
+  self::use([@vm.inferred-type.metadata=dart.core::_Double?] d.{self::Interface::returnBoxedNullableDouble}());
+  self::use([@vm.inferred-type.metadata=!] d.{self::Interface::returnBoxedIntOrDouble}());
+  self::use([@vm.inferred-type.metadata=dart.core::_Double?] d.{self::Interface::returnBoxedNullableIntOrDouble}());
+  self::use([@vm.inferred-type.metadata=#lib::X?] d.{self::Interface::returnBoxedNullableX}());
+  self::use([@vm.inferred-type.metadata=#lib::X] d.{self::Interface::returnBoxedX}());
 }
-static method use(dynamic value) → void {}
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/unboxed_instance_method_tearoff.dart b/pkg/vm/testcases/transformations/type_flow/transformer/unboxed_instance_method_tearoff.dart
index fa87b74..ddbf2a0 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/unboxed_instance_method_tearoff.dart
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/unboxed_instance_method_tearoff.dart
@@ -6,6 +6,11 @@
 final bool kFalse = int.parse('1') == 2 ? true : false;
 int get mint => 0xaabbccddaabbccdd;
 int get smiOrMint => kTrue ? 1 : mint;
+dynamic usedObject;
+
+void use(dynamic object) {
+  usedObject ??= object;
+}
 
 class X {}
 
@@ -42,7 +47,16 @@
       dynamic boxedNonNullableIntOrDouble,
       dynamic boxedNullableIntOrDouble,
       dynamic boxedNullableX,
-      dynamic boxedX) {}
+      dynamic boxedX) {
+    use(unboxedInt);
+    use(unboxedDouble);
+    use(boxedNullableInt);
+    use(boxedNullableDouble);
+    use(boxedNonNullableIntOrDouble);
+    use(boxedNullableIntOrDouble);
+    use(boxedNullableX);
+    use(boxedX);
+  }
 
   dynamic returnUnboxedSmi(X ignored) => 1;
   dynamic returnUnboxedInt(X ignored) => 1;
@@ -65,7 +79,16 @@
       dynamic boxedNonNullableIntOrDouble,
       dynamic boxedNullableIntOrDouble,
       dynamic boxedNullableX,
-      dynamic boxedX) {}
+      dynamic boxedX) {
+    use(unboxedInt);
+    use(unboxedDouble);
+    use(boxedNullableInt);
+    use(boxedNullableDouble);
+    use(boxedNonNullableIntOrDouble);
+    use(boxedNullableIntOrDouble);
+    use(boxedNullableX);
+    use(boxedX);
+  }
 
   dynamic returnUnboxedSmi(X ignored) => 2;
   dynamic returnUnboxedInt(X ignored) => mint;
@@ -88,7 +111,16 @@
       dynamic boxedNonNullableIntOrDouble,
       dynamic boxedNullableIntOrDouble,
       dynamic boxedNullableX,
-      dynamic boxedX) {}
+      dynamic boxedX) {
+    use(unboxedInt);
+    use(unboxedDouble);
+    use(boxedNullableInt);
+    use(boxedNullableDouble);
+    use(boxedNonNullableIntOrDouble);
+    use(boxedNullableIntOrDouble);
+    use(boxedNullableX);
+    use(boxedX);
+  }
 
   dynamic returnUnboxedSmi(X ignored) => 3;
   dynamic returnUnboxedInt(X ignored) => mint;
@@ -166,5 +198,3 @@
   use(d.returnBoxedNullableX);
   use(d.returnBoxedX);
 }
-
-void use(dynamic value) {}
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/unboxed_instance_method_tearoff.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/unboxed_instance_method_tearoff.dart.expect
index bed2172..0b24d0e 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/unboxed_instance_method_tearoff.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/unboxed_instance_method_tearoff.dart.expect
@@ -23,7 +23,16 @@
   synthetic constructor •() → self::Impl1*
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,methodOrSetterSelectorId:1,getterSelectorId:2]  method takePositional(core::int* unboxedSmi, dynamic unboxedInt, dynamic unboxedDouble, dynamic boxedNullableInt, dynamic boxedNullableDouble, dynamic boxedNonNullableIntOrDouble, dynamic boxedNullableIntOrDouble, dynamic boxedNullableX, dynamic boxedX) → void {}
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,methodOrSetterSelectorId:1,getterSelectorId:2]  method takePositional(core::int* unboxedSmi, dynamic unboxedInt, dynamic unboxedDouble, dynamic boxedNullableInt, dynamic boxedNullableDouble, dynamic boxedNonNullableIntOrDouble, dynamic boxedNullableIntOrDouble, dynamic boxedNullableX, dynamic boxedX) → void {
+    self::use(unboxedInt);
+    self::use(unboxedDouble);
+    self::use(boxedNullableInt);
+    self::use(boxedNullableDouble);
+    self::use(boxedNonNullableIntOrDouble);
+    self::use(boxedNullableIntOrDouble);
+    self::use(boxedNullableX);
+    self::use(boxedX);
+  }
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,methodOrSetterSelectorId:3,getterSelectorId:4] [@vm.unboxing-info.metadata=(b)->i]  method returnUnboxedSmi(self::X* ignored) → dynamic
     return 1;
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,methodOrSetterSelectorId:5,getterSelectorId:6] [@vm.unboxing-info.metadata=(b)->i]  method returnUnboxedInt(self::X* ignored) → dynamic
@@ -47,7 +56,16 @@
   synthetic constructor •() → self::BaseImpl2*
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2]  method takePositional([@vm.inferred-type.metadata=dart.core::_Smi (value: 2)] core::int* unboxedSmi, [@vm.inferred-type.metadata=dart.core::_Smi (value: 2)] dynamic unboxedInt, [@vm.inferred-type.metadata=dart.core::_Double (value: 2.2)] dynamic unboxedDouble, [@vm.inferred-type.metadata=dart.core::_Smi (value: 2)] dynamic boxedNullableInt, [@vm.inferred-type.metadata=dart.core::_Double (value: 2.2)] dynamic boxedNullableDouble, [@vm.inferred-type.metadata=dart.core::_Double (value: 2.2)] dynamic boxedNonNullableIntOrDouble, [@vm.inferred-type.metadata=dart.core::_Smi (value: 2)] dynamic boxedNullableIntOrDouble, [@vm.inferred-type.metadata=#lib::X] dynamic boxedNullableX, [@vm.inferred-type.metadata=#lib::X] dynamic boxedX) → void {}
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2]  method takePositional([@vm.inferred-type.metadata=dart.core::_Smi (value: 2)] core::int* unboxedSmi, [@vm.inferred-type.metadata=dart.core::_Smi (value: 2)] dynamic unboxedInt, [@vm.inferred-type.metadata=dart.core::_Double (value: 2.2)] dynamic unboxedDouble, [@vm.inferred-type.metadata=dart.core::_Smi (value: 2)] dynamic boxedNullableInt, [@vm.inferred-type.metadata=dart.core::_Double (value: 2.2)] dynamic boxedNullableDouble, [@vm.inferred-type.metadata=dart.core::_Double (value: 2.2)] dynamic boxedNonNullableIntOrDouble, [@vm.inferred-type.metadata=dart.core::_Smi (value: 2)] dynamic boxedNullableIntOrDouble, [@vm.inferred-type.metadata=#lib::X] dynamic boxedNullableX, [@vm.inferred-type.metadata=#lib::X] dynamic boxedX) → void {
+    self::use(unboxedInt);
+    self::use(unboxedDouble);
+    self::use(boxedNullableInt);
+    self::use(boxedNullableDouble);
+    self::use(boxedNonNullableIntOrDouble);
+    self::use(boxedNullableIntOrDouble);
+    self::use(boxedNullableX);
+    self::use(boxedX);
+  }
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4] [@vm.unboxing-info.metadata=(b)->i]  method returnUnboxedSmi([@vm.inferred-type.metadata=dart.core::Null? (value: null)] self::X* ignored) → dynamic
     return 2;
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6] [@vm.unboxing-info.metadata=(b)->i]  method returnUnboxedInt([@vm.inferred-type.metadata=dart.core::Null? (value: null)] self::X* ignored) → dynamic
@@ -71,7 +89,16 @@
   synthetic constructor •() → self::SubImpl3*
     : super self::BaseImpl2::•()
     ;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,methodOrSetterSelectorId:1,getterSelectorId:2]  method takePositional(core::int* unboxedSmi, dynamic unboxedInt, dynamic unboxedDouble, dynamic boxedNullableInt, dynamic boxedNullableDouble, dynamic boxedNonNullableIntOrDouble, dynamic boxedNullableIntOrDouble, dynamic boxedNullableX, dynamic boxedX) → void {}
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,methodOrSetterSelectorId:1,getterSelectorId:2]  method takePositional(core::int* unboxedSmi, dynamic unboxedInt, dynamic unboxedDouble, dynamic boxedNullableInt, dynamic boxedNullableDouble, dynamic boxedNonNullableIntOrDouble, dynamic boxedNullableIntOrDouble, dynamic boxedNullableX, dynamic boxedX) → void {
+    self::use(unboxedInt);
+    self::use(unboxedDouble);
+    self::use(boxedNullableInt);
+    self::use(boxedNullableDouble);
+    self::use(boxedNonNullableIntOrDouble);
+    self::use(boxedNullableIntOrDouble);
+    self::use(boxedNullableX);
+    self::use(boxedX);
+  }
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,methodOrSetterSelectorId:3,getterSelectorId:4] [@vm.unboxing-info.metadata=(b)->i]  method returnUnboxedSmi(self::X* ignored) → dynamic
     return 3;
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,methodOrSetterSelectorId:5,getterSelectorId:6] [@vm.unboxing-info.metadata=(b)->i]  method returnUnboxedInt(self::X* ignored) → dynamic
@@ -91,8 +118,12 @@
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,methodOrSetterSelectorId:19,getterSelectorId:20]  method returnBoxedX(self::X* ignored) → dynamic
     return new self::X::•();
 }
+static field dynamic usedObject;
 [@vm.unboxing-info.metadata=()->i]static get mint() → core::int*
   return -6144092014192636707;
+static method use(dynamic object) → void {
+  [@vm.inferred-type.metadata=!? (receiver not int)] self::usedObject.{core::Object::==}(null) ?{dynamic} self::usedObject = object : null;
+}
 static method main() → dynamic {
   final core::List<core::Object*>* values = <core::Object*>[new self::Impl1::•(), new self::BaseImpl2::•(), new self::SubImpl3::•()];
   final self::Impl1* a = [@vm.direct-call.metadata=dart.core::_GrowableList.[]] [@vm.inferred-type.metadata=!? (skip check)] values.{core::List::[]}([@vm.inferred-type.metadata=int] core::int::parse("0")) as self::Impl1*;
@@ -150,4 +181,3 @@
   self::use(d.{self::Interface::returnBoxedNullableX});
   self::use(d.{self::Interface::returnBoxedX});
 }
-static method use(dynamic value) → void {}
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/unboxed_static_method.dart b/pkg/vm/testcases/transformations/type_flow/transformer/unboxed_static_method.dart
index 49c6b9f..5151f2e 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/unboxed_static_method.dart
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/unboxed_static_method.dart
@@ -6,6 +6,11 @@
 final bool kFalse = int.parse('1') == 2 ? true : false;
 int get mint => 0xaabbccddaabbccdd;
 int get smiOrMint => kTrue ? 1 : mint;
+dynamic usedObject;
+
+void use(dynamic object) {
+  usedObject ??= object;
+}
 
 class X {}
 
@@ -18,7 +23,16 @@
     dynamic boxedIntOrDouble,
     dynamic boxedNullableIntOrDouble,
     dynamic boxedNullableX,
-    dynamic boxedX) {}
+    dynamic boxedX) {
+  use(unboxedInt);
+  use(unboxedDouble);
+  use(boxedNullableInt);
+  use(boxedNullableDouble);
+  use(boxedIntOrDouble);
+  use(boxedNullableIntOrDouble);
+  use(boxedNullableX);
+  use(boxedX);
+}
 
 void takeOptional(
     [int unboxedSmi,
@@ -29,7 +43,16 @@
     dynamic boxedIntOrDouble,
     dynamic boxedNullableIntOrDouble,
     dynamic boxedNullableX,
-    dynamic boxedX]) {}
+    dynamic boxedX]) {
+  use(unboxedInt);
+  use(unboxedDouble);
+  use(boxedNullableInt);
+  use(boxedNullableDouble);
+  use(boxedIntOrDouble);
+  use(boxedNullableIntOrDouble);
+  use(boxedNullableX);
+  use(boxedX);
+}
 
 void takeNamed(
     {int unboxedSmi,
@@ -40,7 +63,16 @@
     dynamic boxedIntOrDouble,
     dynamic boxedNullableIntOrDouble,
     dynamic boxedNullableX,
-    dynamic boxedX}) {}
+    dynamic boxedX}) {
+  use(unboxedInt);
+  use(unboxedDouble);
+  use(boxedNullableInt);
+  use(boxedNullableDouble);
+  use(boxedIntOrDouble);
+  use(boxedNullableIntOrDouble);
+  use(boxedNullableX);
+  use(boxedX);
+}
 
 dynamic returnUnboxedSmi() => kTrue ? 1 : 2;
 dynamic returnUnboxedInt() => kTrue ? smiOrMint : 2;
@@ -106,5 +138,3 @@
   use(returnBoxedX());
   use(returnBoxedSmiFromEntryPoint());
 }
-
-void use(dynamic value) {}
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/unboxed_static_method.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/unboxed_static_method.dart.expect
index 8074925..934befa 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/unboxed_static_method.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/unboxed_static_method.dart.expect
@@ -9,13 +9,44 @@
 }
 [@vm.inferred-type.metadata=dart.core::bool?]static final field core::bool* kTrue = [@vm.direct-call.metadata=dart.core::_IntegerImplementation.==] [@vm.inferred-type.metadata=dart.core::bool (skip check)] [@vm.inferred-type.metadata=int] core::int::parse("1").{core::num::==}(1) ?{core::bool*} true : false;
 [@vm.inferred-type.metadata=dart.core::bool?]static final field core::bool* kFalse = [@vm.direct-call.metadata=dart.core::_IntegerImplementation.==] [@vm.inferred-type.metadata=dart.core::bool (skip check)] [@vm.inferred-type.metadata=int] core::int::parse("1").{core::num::==}(2) ?{core::bool*} true : false;
+static field dynamic usedObject;
 [@vm.unboxing-info.metadata=()->i]static get mint() → core::int*
   return -6144092014192636707;
 [@vm.unboxing-info.metadata=()->i]static get smiOrMint() → core::int*
   return [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::int*} 1 : [@vm.inferred-type.metadata=int] self::mint;
-[@vm.unboxing-info.metadata=(i,i,d,b,b,b,b,b,b)->b]static method takePositional([@vm.inferred-type.metadata=dart.core::_Smi] core::int* unboxedSmi, [@vm.inferred-type.metadata=int] dynamic unboxedInt, [@vm.inferred-type.metadata=dart.core::_Double] dynamic unboxedDouble, [@vm.inferred-type.metadata=int?] dynamic boxedNullableInt, [@vm.inferred-type.metadata=dart.core::_Double?] dynamic boxedNullableDouble, [@vm.inferred-type.metadata=!] dynamic boxedIntOrDouble, dynamic boxedNullableIntOrDouble, [@vm.inferred-type.metadata=#lib::X?] dynamic boxedNullableX, [@vm.inferred-type.metadata=#lib::X] dynamic boxedX) → void {}
-static method takeOptional([@vm.inferred-type.metadata=dart.core::_Smi] core::int* unboxedSmi, [@vm.inferred-type.metadata=int] dynamic unboxedInt, [@vm.inferred-type.metadata=dart.core::_Double] dynamic unboxedDouble, [@vm.inferred-type.metadata=int?] dynamic boxedNullableInt, [@vm.inferred-type.metadata=dart.core::_Double?] dynamic boxedNullableDouble, [@vm.inferred-type.metadata=!] dynamic boxedIntOrDouble, dynamic boxedNullableIntOrDouble, [@vm.inferred-type.metadata=#lib::X?] dynamic boxedNullableX, [@vm.inferred-type.metadata=#lib::X] dynamic boxedX) → void {}
-static method takeNamed([@vm.inferred-type.metadata=!] dynamic boxedIntOrDouble, [@vm.inferred-type.metadata=dart.core::_Double?] dynamic boxedNullableDouble, [@vm.inferred-type.metadata=int?] dynamic boxedNullableInt, dynamic boxedNullableIntOrDouble, [@vm.inferred-type.metadata=#lib::X?] dynamic boxedNullableX, [@vm.inferred-type.metadata=#lib::X] dynamic boxedX, [@vm.inferred-type.metadata=dart.core::_Double] dynamic unboxedDouble, [@vm.inferred-type.metadata=int] dynamic unboxedInt, [@vm.inferred-type.metadata=dart.core::_Smi] core::int* unboxedSmi) → void {}
+static method use(dynamic object) → void {
+  [@vm.inferred-type.metadata=!? (receiver not int)] self::usedObject.{core::Object::==}(null) ?{dynamic} self::usedObject = object : null;
+}
+[@vm.unboxing-info.metadata=(i,d,b,b,b,b,b,b)->b]static method takePositional([@vm.inferred-type.metadata=int] dynamic unboxedInt, [@vm.inferred-type.metadata=dart.core::_Double] dynamic unboxedDouble, [@vm.inferred-type.metadata=int?] dynamic boxedNullableInt, [@vm.inferred-type.metadata=dart.core::_Double?] dynamic boxedNullableDouble, [@vm.inferred-type.metadata=!] dynamic boxedIntOrDouble, dynamic boxedNullableIntOrDouble, [@vm.inferred-type.metadata=#lib::X?] dynamic boxedNullableX, [@vm.inferred-type.metadata=#lib::X] dynamic boxedX) → void {
+  self::use(unboxedInt);
+  self::use(unboxedDouble);
+  self::use(boxedNullableInt);
+  self::use(boxedNullableDouble);
+  self::use(boxedIntOrDouble);
+  self::use(boxedNullableIntOrDouble);
+  self::use(boxedNullableX);
+  self::use(boxedX);
+}
+[@vm.unboxing-info.metadata=(i,d,b,b,b,b,b,b)->b]static method takeOptional([@vm.inferred-type.metadata=int] dynamic unboxedInt, [@vm.inferred-type.metadata=dart.core::_Double] dynamic unboxedDouble, [@vm.inferred-type.metadata=int?] dynamic boxedNullableInt, [@vm.inferred-type.metadata=dart.core::_Double?] dynamic boxedNullableDouble, [@vm.inferred-type.metadata=!] dynamic boxedIntOrDouble, dynamic boxedNullableIntOrDouble, [@vm.inferred-type.metadata=#lib::X?] dynamic boxedNullableX, [@vm.inferred-type.metadata=#lib::X] dynamic boxedX) → void {
+  self::use(unboxedInt);
+  self::use(unboxedDouble);
+  self::use(boxedNullableInt);
+  self::use(boxedNullableDouble);
+  self::use(boxedIntOrDouble);
+  self::use(boxedNullableIntOrDouble);
+  self::use(boxedNullableX);
+  self::use(boxedX);
+}
+[@vm.unboxing-info.metadata=(b,b,b,b,b,b,d,i)->b]static method takeNamed([@vm.inferred-type.metadata=!] dynamic boxedIntOrDouble, [@vm.inferred-type.metadata=dart.core::_Double?] dynamic boxedNullableDouble, [@vm.inferred-type.metadata=int?] dynamic boxedNullableInt, dynamic boxedNullableIntOrDouble, [@vm.inferred-type.metadata=#lib::X?] dynamic boxedNullableX, [@vm.inferred-type.metadata=#lib::X] dynamic boxedX, [@vm.inferred-type.metadata=dart.core::_Double] dynamic unboxedDouble, [@vm.inferred-type.metadata=int] dynamic unboxedInt) → void {
+  self::use(unboxedInt);
+  self::use(unboxedDouble);
+  self::use(boxedNullableInt);
+  self::use(boxedNullableDouble);
+  self::use(boxedIntOrDouble);
+  self::use(boxedNullableIntOrDouble);
+  self::use(boxedNullableX);
+  self::use(boxedX);
+}
 [@vm.unboxing-info.metadata=()->i]static method returnUnboxedSmi() → dynamic
   return [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::int*} 1 : 2;
 [@vm.unboxing-info.metadata=()->i]static method returnUnboxedInt() → dynamic
@@ -40,9 +71,9 @@
 @#C3
 static method takeBoxedSmiFromEntryPoint(core::int* value) → void {}
 static method main() → dynamic {
-  self::takePositional([@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::int*} 1 : 2, [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::int*} [@vm.inferred-type.metadata=int] self::smiOrMint : 2, [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::double*} 1.1 : 2.2, [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::int*} [@vm.inferred-type.metadata=int] self::smiOrMint : null, [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::double*} 1.1 : null, [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::num*} [@vm.inferred-type.metadata=int] self::smiOrMint : 1.1, [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::num*} [@vm.inferred-type.metadata=dart.core::bool?] self::kFalse ?{core::num*} [@vm.inferred-type.metadata=int] self::smiOrMint : 1.1 : null, [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{self::X*} new self::X::•() : null, new self::X::•());
-  self::takeOptional([@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::int*} 1 : 2, [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::int*} [@vm.inferred-type.metadata=int] self::smiOrMint : 2, [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::double*} 1.1 : 2.2, [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::int*} [@vm.inferred-type.metadata=int] self::smiOrMint : null, [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::double*} 1.1 : null, [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::num*} [@vm.inferred-type.metadata=int] self::smiOrMint : 1.1, [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::num*} [@vm.inferred-type.metadata=dart.core::bool?] self::kFalse ?{core::num*} [@vm.inferred-type.metadata=int] self::smiOrMint : 1.1 : null, [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{self::X*} new self::X::•() : null, new self::X::•());
-  let core::int* #t1 = [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::int*} 1 : 2 in let core::int* #t2 = [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::int*} [@vm.inferred-type.metadata=int] self::smiOrMint : 2 in let core::double* #t3 = [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::double*} 1.1 : 2.2 in let core::int* #t4 = [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::int*} [@vm.inferred-type.metadata=int] self::smiOrMint : null in let core::double* #t5 = [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::double*} 1.1 : null in let core::num* #t6 = [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::num*} [@vm.inferred-type.metadata=int] self::smiOrMint : 1.1 in let core::num* #t7 = [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::num*} [@vm.inferred-type.metadata=dart.core::bool?] self::kFalse ?{core::num*} [@vm.inferred-type.metadata=int] self::smiOrMint : 1.1 : null in let self::X* #t8 = [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{self::X*} new self::X::•() : null in let self::X* #t9 = new self::X::•() in self::takeNamed(#t6, #t5, #t4, #t7, #t8, #t9, #t3, #t2, #t1);
+  let final core::int* #t1 = [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::int*} 1 : 2 in let final core::int* #t2 = [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::int*} [@vm.inferred-type.metadata=int] self::smiOrMint : 2 in let final core::double* #t3 = [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::double*} 1.1 : 2.2 in let final core::int* #t4 = [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::int*} [@vm.inferred-type.metadata=int] self::smiOrMint : null in let final core::double* #t5 = [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::double*} 1.1 : null in let final core::num* #t6 = [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::num*} [@vm.inferred-type.metadata=int] self::smiOrMint : 1.1 in let final core::num* #t7 = [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::num*} [@vm.inferred-type.metadata=dart.core::bool?] self::kFalse ?{core::num*} [@vm.inferred-type.metadata=int] self::smiOrMint : 1.1 : null in let final self::X* #t8 = [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{self::X*} new self::X::•() : null in let final self::X* #t9 = new self::X::•() in self::takePositional(#t2, #t3, #t4, #t5, #t6, #t7, #t8, #t9);
+  let final core::int* #t10 = [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::int*} 1 : 2 in let final core::int* #t11 = [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::int*} [@vm.inferred-type.metadata=int] self::smiOrMint : 2 in let final core::double* #t12 = [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::double*} 1.1 : 2.2 in let final core::int* #t13 = [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::int*} [@vm.inferred-type.metadata=int] self::smiOrMint : null in let final core::double* #t14 = [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::double*} 1.1 : null in let final core::num* #t15 = [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::num*} [@vm.inferred-type.metadata=int] self::smiOrMint : 1.1 in let final core::num* #t16 = [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::num*} [@vm.inferred-type.metadata=dart.core::bool?] self::kFalse ?{core::num*} [@vm.inferred-type.metadata=int] self::smiOrMint : 1.1 : null in let final self::X* #t17 = [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{self::X*} new self::X::•() : null in let final self::X* #t18 = new self::X::•() in self::takeOptional(#t11, #t12, #t13, #t14, #t15, #t16, #t17, #t18);
+  let final core::int* #t19 = [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::int*} 1 : 2 in let final core::int* #t20 = [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::int*} [@vm.inferred-type.metadata=int] self::smiOrMint : 2 in let final core::double* #t21 = [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::double*} 1.1 : 2.2 in let final core::int* #t22 = [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::int*} [@vm.inferred-type.metadata=int] self::smiOrMint : null in let final core::double* #t23 = [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::double*} 1.1 : null in let final core::num* #t24 = [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::num*} [@vm.inferred-type.metadata=int] self::smiOrMint : 1.1 in let final core::num* #t25 = [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::num*} [@vm.inferred-type.metadata=dart.core::bool?] self::kFalse ?{core::num*} [@vm.inferred-type.metadata=int] self::smiOrMint : 1.1 : null in let final self::X* #t26 = [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{self::X*} new self::X::•() : null in let final self::X* #t27 = new self::X::•() in self::takeNamed(#t24, #t23, #t22, #t25, #t26, #t27, #t21, #t20);
   self::takeBoxedSmiFromEntryPoint([@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::int*} 1 : 2);
   self::use([@vm.inferred-type.metadata=dart.core::_Smi] self::returnUnboxedSmi());
   self::use([@vm.inferred-type.metadata=int] self::returnUnboxedInt());
@@ -55,4 +86,3 @@
   self::use([@vm.inferred-type.metadata=#lib::X] self::returnBoxedX());
   self::use([@vm.inferred-type.metadata=dart.core::_Smi] self::returnBoxedSmiFromEntryPoint());
 }
-static method use(dynamic value) → void {}
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/unboxed_static_method_tearoff.dart b/pkg/vm/testcases/transformations/type_flow/transformer/unboxed_static_method_tearoff.dart
index 16bdbe5..f20e0ce 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/unboxed_static_method_tearoff.dart
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/unboxed_static_method_tearoff.dart
@@ -6,6 +6,11 @@
 final bool kFalse = int.parse('1') == 2 ? true : false;
 int get mint => 0xaabbccddaabbccdd;
 int get smiOrMint => kTrue ? 1 : mint;
+dynamic usedObject;
+
+void use(dynamic object) {
+  usedObject ??= object;
+}
 
 class X {}
 
@@ -18,7 +23,16 @@
     dynamic boxedIntOrDouble,
     dynamic boxedNullableIntOrDouble,
     dynamic boxedNullableX,
-    dynamic boxedX) {}
+    dynamic boxedX) {
+  use(unboxedInt);
+  use(unboxedDouble);
+  use(boxedNullableInt);
+  use(boxedNullableDouble);
+  use(boxedIntOrDouble);
+  use(boxedNullableIntOrDouble);
+  use(boxedNullableX);
+  use(boxedX);
+}
 
 void takeOptional(
     [int unboxedSmi,
@@ -29,7 +43,16 @@
     dynamic boxedIntOrDouble,
     dynamic boxedNullableIntOrDouble,
     dynamic boxedNullableX,
-    dynamic boxedX]) {}
+    dynamic boxedX]) {
+  use(unboxedInt);
+  use(unboxedDouble);
+  use(boxedNullableInt);
+  use(boxedNullableDouble);
+  use(boxedIntOrDouble);
+  use(boxedNullableIntOrDouble);
+  use(boxedNullableX);
+  use(boxedX);
+}
 
 void takeNamed(
     {int unboxedSmi,
@@ -40,7 +63,16 @@
     dynamic boxedIntOrDouble,
     dynamic boxedNullableIntOrDouble,
     dynamic boxedNullableX,
-    dynamic boxedX}) {}
+    dynamic boxedX}) {
+  use(unboxedInt);
+  use(unboxedDouble);
+  use(boxedNullableInt);
+  use(boxedNullableDouble);
+  use(boxedIntOrDouble);
+  use(boxedNullableIntOrDouble);
+  use(boxedNullableX);
+  use(boxedX);
+}
 
 dynamic returnUnboxedSmi() => kTrue ? 1 : 2;
 dynamic returnUnboxedInt() => kTrue ? smiOrMint : 2;
@@ -99,6 +131,8 @@
 
   // Use as tear-offs.
   use(takePositional);
+  use(takeOptional);
+  use(takeNamed);
   use(returnUnboxedSmi);
   use(returnUnboxedInt);
   use(returnUnboxedDouble);
@@ -109,5 +143,3 @@
   use(returnBoxedNullableX);
   use(returnBoxedX);
 }
-
-void use(dynamic value) {}
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/unboxed_static_method_tearoff.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/unboxed_static_method_tearoff.dart.expect
index 62e1f32..10fcb7a 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/unboxed_static_method_tearoff.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/unboxed_static_method_tearoff.dart.expect
@@ -9,13 +9,44 @@
 }
 [@vm.inferred-type.metadata=dart.core::bool?]static final field core::bool* kTrue = [@vm.direct-call.metadata=dart.core::_IntegerImplementation.==] [@vm.inferred-type.metadata=dart.core::bool (skip check)] [@vm.inferred-type.metadata=int] core::int::parse("1").{core::num::==}(1) ?{core::bool*} true : false;
 [@vm.inferred-type.metadata=dart.core::bool?]static final field core::bool* kFalse = [@vm.direct-call.metadata=dart.core::_IntegerImplementation.==] [@vm.inferred-type.metadata=dart.core::bool (skip check)] [@vm.inferred-type.metadata=int] core::int::parse("1").{core::num::==}(2) ?{core::bool*} true : false;
+static field dynamic usedObject;
 [@vm.unboxing-info.metadata=()->i]static get mint() → core::int*
   return -6144092014192636707;
 [@vm.unboxing-info.metadata=()->i]static get smiOrMint() → core::int*
   return [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::int*} 1 : [@vm.inferred-type.metadata=int] self::mint;
-static method takePositional(core::int* unboxedSmi, dynamic unboxedInt, dynamic unboxedDouble, dynamic boxedNullableInt, dynamic boxedNullableDouble, dynamic boxedIntOrDouble, dynamic boxedNullableIntOrDouble, dynamic boxedNullableX, dynamic boxedX) → void {}
-static method takeOptional([@vm.inferred-type.metadata=dart.core::_Smi] core::int* unboxedSmi, [@vm.inferred-type.metadata=int] dynamic unboxedInt, [@vm.inferred-type.metadata=dart.core::_Double] dynamic unboxedDouble, [@vm.inferred-type.metadata=int?] dynamic boxedNullableInt, [@vm.inferred-type.metadata=dart.core::_Double?] dynamic boxedNullableDouble, [@vm.inferred-type.metadata=!] dynamic boxedIntOrDouble, dynamic boxedNullableIntOrDouble, [@vm.inferred-type.metadata=#lib::X?] dynamic boxedNullableX, [@vm.inferred-type.metadata=#lib::X] dynamic boxedX) → void {}
-static method takeNamed([@vm.inferred-type.metadata=!] dynamic boxedIntOrDouble, [@vm.inferred-type.metadata=dart.core::_Double?] dynamic boxedNullableDouble, [@vm.inferred-type.metadata=int?] dynamic boxedNullableInt, dynamic boxedNullableIntOrDouble, [@vm.inferred-type.metadata=#lib::X?] dynamic boxedNullableX, [@vm.inferred-type.metadata=#lib::X] dynamic boxedX, [@vm.inferred-type.metadata=dart.core::_Double] dynamic unboxedDouble, [@vm.inferred-type.metadata=int] dynamic unboxedInt, [@vm.inferred-type.metadata=dart.core::_Smi] core::int* unboxedSmi) → void {}
+static method use(dynamic object) → void {
+  [@vm.inferred-type.metadata=!? (receiver not int)] self::usedObject.{core::Object::==}(null) ?{dynamic} self::usedObject = object : null;
+}
+static method takePositional(core::int* unboxedSmi, dynamic unboxedInt, dynamic unboxedDouble, dynamic boxedNullableInt, dynamic boxedNullableDouble, dynamic boxedIntOrDouble, dynamic boxedNullableIntOrDouble, dynamic boxedNullableX, dynamic boxedX) → void {
+  self::use(unboxedInt);
+  self::use(unboxedDouble);
+  self::use(boxedNullableInt);
+  self::use(boxedNullableDouble);
+  self::use(boxedIntOrDouble);
+  self::use(boxedNullableIntOrDouble);
+  self::use(boxedNullableX);
+  self::use(boxedX);
+}
+static method takeOptional([core::int* unboxedSmi = #C1, dynamic unboxedInt = #C1, dynamic unboxedDouble = #C1, dynamic boxedNullableInt = #C1, dynamic boxedNullableDouble = #C1, dynamic boxedIntOrDouble = #C1, dynamic boxedNullableIntOrDouble = #C1, dynamic boxedNullableX = #C1, dynamic boxedX = #C1]) → void {
+  self::use(unboxedInt);
+  self::use(unboxedDouble);
+  self::use(boxedNullableInt);
+  self::use(boxedNullableDouble);
+  self::use(boxedIntOrDouble);
+  self::use(boxedNullableIntOrDouble);
+  self::use(boxedNullableX);
+  self::use(boxedX);
+}
+static method takeNamed({core::int* unboxedSmi = #C1, dynamic unboxedInt = #C1, dynamic unboxedDouble = #C1, dynamic boxedNullableInt = #C1, dynamic boxedNullableDouble = #C1, dynamic boxedIntOrDouble = #C1, dynamic boxedNullableIntOrDouble = #C1, dynamic boxedNullableX = #C1, dynamic boxedX = #C1}) → void {
+  self::use(unboxedInt);
+  self::use(unboxedDouble);
+  self::use(boxedNullableInt);
+  self::use(boxedNullableDouble);
+  self::use(boxedIntOrDouble);
+  self::use(boxedNullableIntOrDouble);
+  self::use(boxedNullableX);
+  self::use(boxedX);
+}
 [@vm.unboxing-info.metadata=()->i]static method returnUnboxedSmi() → dynamic
   return [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::int*} 1 : 2;
 [@vm.unboxing-info.metadata=()->i]static method returnUnboxedInt() → dynamic
@@ -37,7 +68,7 @@
 static method main() → dynamic {
   self::takePositional([@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::int*} 1 : 2, [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::int*} [@vm.inferred-type.metadata=int] self::smiOrMint : 2, [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::double*} 1.1 : 2.2, [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::int*} [@vm.inferred-type.metadata=int] self::smiOrMint : null, [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::double*} 1.1 : null, [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::num*} [@vm.inferred-type.metadata=int] self::smiOrMint : 1.1, [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::num*} [@vm.inferred-type.metadata=dart.core::bool?] self::kFalse ?{core::num*} [@vm.inferred-type.metadata=int] self::smiOrMint : 1.1 : null, [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{self::X*} new self::X::•() : null, new self::X::•());
   self::takeOptional([@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::int*} 1 : 2, [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::int*} [@vm.inferred-type.metadata=int] self::smiOrMint : 2, [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::double*} 1.1 : 2.2, [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::int*} [@vm.inferred-type.metadata=int] self::smiOrMint : null, [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::double*} 1.1 : null, [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::num*} [@vm.inferred-type.metadata=int] self::smiOrMint : 1.1, [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::num*} [@vm.inferred-type.metadata=dart.core::bool?] self::kFalse ?{core::num*} [@vm.inferred-type.metadata=int] self::smiOrMint : 1.1 : null, [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{self::X*} new self::X::•() : null, new self::X::•());
-  let core::int* #t1 = [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::int*} 1 : 2 in let core::int* #t2 = [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::int*} [@vm.inferred-type.metadata=int] self::smiOrMint : 2 in let core::double* #t3 = [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::double*} 1.1 : 2.2 in let core::int* #t4 = [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::int*} [@vm.inferred-type.metadata=int] self::smiOrMint : null in let core::double* #t5 = [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::double*} 1.1 : null in let core::num* #t6 = [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::num*} [@vm.inferred-type.metadata=int] self::smiOrMint : 1.1 in let core::num* #t7 = [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::num*} [@vm.inferred-type.metadata=dart.core::bool?] self::kFalse ?{core::num*} [@vm.inferred-type.metadata=int] self::smiOrMint : 1.1 : null in let self::X* #t8 = [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{self::X*} new self::X::•() : null in let self::X* #t9 = new self::X::•() in self::takeNamed(#t6, #t5, #t4, #t7, #t8, #t9, #t3, #t2, #t1);
+  self::takeNamed(unboxedSmi: [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::int*} 1 : 2, unboxedInt: [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::int*} [@vm.inferred-type.metadata=int] self::smiOrMint : 2, unboxedDouble: [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::double*} 1.1 : 2.2, boxedNullableInt: [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::int*} [@vm.inferred-type.metadata=int] self::smiOrMint : null, boxedNullableDouble: [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::double*} 1.1 : null, boxedIntOrDouble: [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::num*} [@vm.inferred-type.metadata=int] self::smiOrMint : 1.1, boxedNullableIntOrDouble: [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::num*} [@vm.inferred-type.metadata=dart.core::bool?] self::kFalse ?{core::num*} [@vm.inferred-type.metadata=int] self::smiOrMint : 1.1 : null, boxedNullableX: [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{self::X*} new self::X::•() : null, boxedX: new self::X::•());
   self::use([@vm.inferred-type.metadata=dart.core::_Smi] self::returnUnboxedSmi());
   self::use([@vm.inferred-type.metadata=int] self::returnUnboxedInt());
   self::use([@vm.inferred-type.metadata=dart.core::_Double] self::returnUnboxedDouble());
@@ -47,7 +78,6 @@
   self::use(self::returnBoxedNullableIntOrDouble());
   self::use([@vm.inferred-type.metadata=#lib::X?] self::returnBoxedNullableX());
   self::use([@vm.inferred-type.metadata=#lib::X] self::returnBoxedX());
-  self::use(#C1);
   self::use(#C2);
   self::use(#C3);
   self::use(#C4);
@@ -57,5 +87,7 @@
   self::use(#C8);
   self::use(#C9);
   self::use(#C10);
+  self::use(#C11);
+  self::use(#C12);
+  self::use(#C13);
 }
-static method use(dynamic value) → void {}
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/write_only_field2.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/write_only_field2.dart.expect
index 082ed50..c2f2f87 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/write_only_field2.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/write_only_field2.dart.expect
@@ -12,7 +12,7 @@
     ;
 }
 class B extends core::Object {
-  constructor •([@vm.inferred-type.metadata=dart.core::_OneByteString (value: "hi")] dynamic unused4) → self::B*
+  constructor •() → self::B*
     : dynamic #t1 = [@vm.inferred-type.metadata=dart.core::Null? (value: null)] self::foo(), super core::Object::•()
     ;
 }
@@ -55,9 +55,9 @@
 static method foo() → dynamic {}
 static method main() → void {
   new self::A::•();
-  new self::B::•("hi");
+  new self::B::•();
   self::C<core::num*>* c = new self::D::•();
-  exp::Expect::throws<dynamic>(() → core::Null? {
+  exp::Expect::throws<dynamic>(() → Null {
     [@vm.call-site-attributes.metadata=receiverType:#lib::C<dart.core::num*>*] [@vm.direct-call.metadata=#lib::D.bar] c.{self::C::bar} = 3.14;
   });
   self::E* e = new self::F::•();
diff --git a/pkg/vm/tool/precompiler2 b/pkg/vm/tool/precompiler2
index b1199c1..6010ee8 100755
--- a/pkg/vm/tool/precompiler2
+++ b/pkg/vm/tool/precompiler2
@@ -36,9 +36,6 @@
     --no-tfa | \
     --protobuf-tree-shaker | \
     --protobuf-tree-shaker-v2 | \
-    --gen-bytecode | \
-    --no-gen-bytecode | \
-    --bytecode-options=* | \
     --minimal-kernel | \
     --no-embed-sources | \
     -D* )
@@ -101,7 +98,7 @@
 export DART_CONFIGURATION=${DART_CONFIGURATION:-ReleaseX64}
 BIN_DIR="$OUT_DIR/$DART_CONFIGURATION"
 
-DART="tools/sdks/dart-sdk/bin/dart"
+DART="${SDK_DIR}/tools/sdks/dart-sdk/bin/dart"
 if [ ! -f "$DART" ]; then
   DART="$BIN_DIR/dart"
 fi
diff --git a/pkg/vm_service/CHANGELOG.md b/pkg/vm_service/CHANGELOG.md
index ca07f4f..4b6ac4a 100644
--- a/pkg/vm_service/CHANGELOG.md
+++ b/pkg/vm_service/CHANGELOG.md
@@ -1,7 +1,23 @@
 # Changelog
 
+## 5.5.0
+- Update to version `3.42.0` of the spec.
+- Added optional `limit` parameter to `getStack` RPC.
+
+## 5.4.0
+- Update to version `3.41.0` of the spec.
+- Added `PortList` class.
+- Added `getPorts` RPC.
+- Added optional properties `portId`, `allocationLocation`, and `debugName` to
+  `InstanceRef` and `Instance`.
+
+## 5.3.1
+- Rename `State` class to `_State` to avoid class name conflicts with Flutter.
+
 ## 5.3.0
-- Added support for `dart:io` extensions version 1.4.
+- Added support for `dart:io` extensions version 1.5.
+- Added combination getter/setter `socketProfilingEnabled`.
+- Deprecated `startSocketProfiling` and `pauseSocketProfiling`.
 - Update to version `3.40.0` of the spec.
 - Added `IsolateFlag` class.
 - Added `isolateFlags` property to `Isolate`.
diff --git a/pkg/vm_service/example/vm_service_assert.dart b/pkg/vm_service/example/vm_service_assert.dart
index e2ae6d1..0243d12 100644
--- a/pkg/vm_service/example/vm_service_assert.dart
+++ b/pkg/vm_service/example/vm_service_assert.dart
@@ -192,6 +192,7 @@
   if (obj == "MirrorReference") return obj;
   if (obj == "Null") return obj;
   if (obj == "PlainInstance") return obj;
+  if (obj == "ReceivePort") return obj;
   if (obj == "RegExp") return obj;
   if (obj == "StackTrace") return obj;
   if (obj == "String") return obj;
@@ -912,6 +913,13 @@
   return obj;
 }
 
+vms.PortList assertPortList(vms.PortList obj) {
+  assertNotNull(obj);
+  assertString(obj.type);
+  assertListOfInstanceRef(obj.ports);
+  return obj;
+}
+
 vms.ProfileFunction assertProfileFunction(vms.ProfileFunction obj) {
   assertNotNull(obj);
   assertString(obj.kind);
@@ -1097,6 +1105,7 @@
   assertString(obj.type);
   assertListOfFrame(obj.frames);
   assertListOfMessage(obj.messages);
+  assertBool(obj.truncated);
   return obj;
 }
 
diff --git a/pkg/vm_service/java/.gitignore b/pkg/vm_service/java/.gitignore
index ae6691f..8803d45 100644
--- a/pkg/vm_service/java/.gitignore
+++ b/pkg/vm_service/java/.gitignore
@@ -25,6 +25,7 @@
 src/org/dartlang/vm/service/consumer/InvokeConsumer.java
 src/org/dartlang/vm/service/consumer/KillConsumer.java
 src/org/dartlang/vm/service/consumer/PauseConsumer.java
+src/org/dartlang/vm/service/consumer/PortListConsumer.java
 src/org/dartlang/vm/service/consumer/ProcessMemoryUsageConsumer.java
 src/org/dartlang/vm/service/consumer/ProtocolListConsumer.java
 src/org/dartlang/vm/service/consumer/ReloadSourcesConsumer.java
@@ -95,6 +96,7 @@
 src/org/dartlang/vm/service/element/NullRef.java
 src/org/dartlang/vm/service/element/Obj.java
 src/org/dartlang/vm/service/element/ObjRef.java
+src/org/dartlang/vm/service/element/PortList.java
 src/org/dartlang/vm/service/element/ProcessMemoryItem.java
 src/org/dartlang/vm/service/element/ProcessMemoryUsage.java
 src/org/dartlang/vm/service/element/ProfileFunction.java
diff --git a/pkg/vm_service/java/version.properties b/pkg/vm_service/java/version.properties
index d0564a6..742d603 100644
--- a/pkg/vm_service/java/version.properties
+++ b/pkg/vm_service/java/version.properties
@@ -1 +1 @@
-version=3.40
+version=3.42
diff --git a/pkg/vm_service/lib/src/dart_io_extensions.dart b/pkg/vm_service/lib/src/dart_io_extensions.dart
index 886b947..c184d3c 100644
--- a/pkg/vm_service/lib/src/dart_io_extensions.dart
+++ b/pkg/vm_service/lib/src/dart_io_extensions.dart
@@ -7,6 +7,7 @@
 import 'dart:collection';
 
 import 'package:meta/meta.dart';
+import 'package:vm_service/vm_service.dart';
 
 import 'vm_service.dart';
 
@@ -28,22 +29,37 @@
 
   /// Start profiling new socket connections. Statistics for sockets created
   /// before profiling was enabled will not be recorded.
+  @Deprecated('Use socketProfilingEnabled instead')
   Future<Success> startSocketProfiling(String isolateId) =>
       _callHelper('ext.dart.io.startSocketProfiling', isolateId);
 
   /// Pause recording socket statistics. [clearSocketProfile] must be called in
   /// order for collected statistics to be cleared.
+  @Deprecated('Use socketProfilingEnabled instead')
   Future<Success> pauseSocketProfiling(String isolateId) =>
       _callHelper('ext.dart.io.pauseSocketProfiling', isolateId);
 
+  /// The _socketProfilingEnabled_ RPC is used to enable/disable the socket profiler
+  /// and query its current state. If `enabled` is provided, the profiler state will
+  /// be updated to reflect the value of `enabled`.
+  ///
+  /// If the state of the socket profiler is changed, a `SocketProfilingStateChange`
+  /// event will be sent on the `Extension` stream.
+  Future<SocketProfilingState> socketProfilingEnabled(String isolateId,
+      [bool enabled]) async {
+    return _callHelper('ext.dart.io.socketProfilingEnabled', isolateId, args: {
+      if (enabled != null) 'enabled': enabled,
+    });
+  }
+
   /// Removes all statistics associated with prior and current sockets.
   Future<Success> clearSocketProfile(String isolateId) =>
       _callHelper('ext.dart.io.clearSocketProfile', isolateId);
 
   /// The `getSocketProfile` RPC is used to retrieve socket statistics collected
   /// by the socket profiler. Only samples collected after the initial
-  /// [startSocketProfiling] or the last call to [clearSocketProfiling] will be
-  /// reported.
+  /// [socketProfilingEnabled] call or the last call to [clearSocketProfile]
+  /// will be reported.
   Future<SocketProfile> getSocketProfile(String isolateId) =>
       _callHelper('ext.dart.io.getSocketProfile', isolateId);
 
@@ -148,6 +164,7 @@
     addTypeFactory('@SpawnedProcess', SpawnedProcessRef.parse);
     addTypeFactory('SocketProfile', SocketProfile.parse);
     addTypeFactory('SocketStatistic', SocketStatistic.parse);
+    addTypeFactory('SocketProfilingState', SocketProfilingState.parse);
     _factoriesRegistered = true;
   }
 }
@@ -219,25 +236,43 @@
   }
 }
 
-/// A [HttpTimelineLoggingState] provides information about the current state of HTTP
-/// request logging for a given isolate.
-class HttpTimelineLoggingState extends Response {
-  static HttpTimelineLoggingState parse(Map json) =>
-      json == null ? null : HttpTimelineLoggingState._fromJson(json);
-
-  HttpTimelineLoggingState({@required this.enabled});
+/// A [Response] containing the enabled state of a service extension.
+abstract class _State extends Response {
+  _State({@required this.enabled});
 
   // TODO(bkonyi): make this part of the vm_service.dart library so we can
   // call super._fromJson.
-  HttpTimelineLoggingState._fromJson(Map<String, dynamic> json)
-      : enabled = json['enabled'] {
+  _State._fromJson(Map<String, dynamic> json) : enabled = json['enabled'] {
     type = json['type'];
   }
 
-  /// Whether or not HttpClient.enableTimelineLogging is set to true for a given isolate.
   final bool enabled;
 }
 
+/// A [HttpTimelineLoggingState] provides information about the current state of HTTP
+/// request logging for a given isolate.
+class HttpTimelineLoggingState extends _State {
+  static HttpTimelineLoggingState parse(Map json) =>
+      json == null ? null : HttpTimelineLoggingState._fromJson(json);
+
+  HttpTimelineLoggingState({@required bool enabled}) : super(enabled: enabled);
+
+  HttpTimelineLoggingState._fromJson(Map<String, dynamic> json)
+      : super._fromJson(json);
+}
+
+/// A [SocketProfilingState] provides information about the current state of
+/// socket profiling for a given isolate.
+class SocketProfilingState extends _State {
+  static SocketProfilingState parse(Map json) =>
+      json == null ? null : SocketProfilingState._fromJson(json);
+
+  SocketProfilingState({@required bool enabled}) : super(enabled: enabled);
+
+  SocketProfilingState._fromJson(Map<String, dynamic> json)
+      : super._fromJson(json);
+}
+
 /// A [SpawnedProcessRef] contains identifying information about a spawned process.
 class SpawnedProcessRef {
   static SpawnedProcessRef parse(Map json) =>
diff --git a/pkg/vm_service/lib/src/vm_service.dart b/pkg/vm_service/lib/src/vm_service.dart
index fd20c5b..6bb049a 100644
--- a/pkg/vm_service/lib/src/vm_service.dart
+++ b/pkg/vm_service/lib/src/vm_service.dart
@@ -28,7 +28,7 @@
         HeapSnapshotObjectNoData,
         HeapSnapshotObjectNullData;
 
-const String vmServiceVersion = '3.40.0';
+const String vmServiceVersion = '3.42.0';
 
 /// @optional
 const String optional = 'optional';
@@ -157,6 +157,7 @@
   'Null': NullVal.parse,
   '@Object': ObjRef.parse,
   'Object': Obj.parse,
+  'PortList': PortList.parse,
   'ProfileFunction': ProfileFunction.parse,
   'ProtocolList': ProtocolList.parse,
   'Protocol': Protocol.parse,
@@ -209,6 +210,7 @@
   'getIsolateGroupMemoryUsage': const ['MemoryUsage'],
   'getScripts': const ['ScriptList'],
   'getObject': const ['Obj'],
+  'getPorts': const ['PortList'],
   'getRetainingPath': const ['RetainingPath'],
   'getProcessMemoryUsage': const ['ProcessMemoryUsage'],
   'getStack': const ['Stack'],
@@ -688,6 +690,12 @@
     int count,
   });
 
+  /// The `getPorts` RPC is used to retrieve the list of `ReceivePort` instances
+  /// for a given isolate.
+  ///
+  /// See [PortList].
+  Future<PortList> getPorts(String isolateId);
+
   /// The `getRetainingPath` RPC is used to lookup a path from an object
   /// specified by `targetId` to a GC root (i.e., the object which is preventing
   /// this object from being garbage collected).
@@ -725,6 +733,12 @@
   /// The `getStack` RPC is used to retrieve the current execution stack and
   /// message queue for an isolate. The isolate does not need to be paused.
   ///
+  /// If `limit` is provided, up to `limit` frames from the top of the stack
+  /// will be returned. If the stack depth is smaller than `limit` the entire
+  /// stack is returned. Note: this limit also applies to the
+  /// `asyncCausalFrames` and `awaiterFrames` stack representations in the
+  /// `Stack` response.
+  ///
   /// If `isolateId` refers to an isolate which has exited, then the `Collected`
   /// [Sentinel] is returned.
   ///
@@ -732,7 +746,7 @@
   ///
   /// This method will throw a [SentinelException] in the case a [Sentinel] is
   /// returned.
-  Future<Stack> getStack(String isolateId);
+  Future<Stack> getStack(String isolateId, {int limit});
 
   /// The `getSupportedProtocols` RPC is used to determine which protocols are
   /// supported by the current server.
@@ -1318,6 +1332,11 @@
             count: params['count'],
           );
           break;
+        case 'getPorts':
+          response = await _serviceImplementation.getPorts(
+            params['isolateId'],
+          );
+          break;
         case 'getRetainingPath':
           response = await _serviceImplementation.getRetainingPath(
             params['isolateId'],
@@ -1331,6 +1350,7 @@
         case 'getStack':
           response = await _serviceImplementation.getStack(
             params['isolateId'],
+            limit: params['limit'],
           );
           break;
         case 'getSupportedProtocols':
@@ -1771,6 +1791,10 @@
       });
 
   @override
+  Future<PortList> getPorts(String isolateId) =>
+      _call('getPorts', {'isolateId': isolateId});
+
+  @override
   Future<RetainingPath> getRetainingPath(
           String isolateId, String targetId, int limit) =>
       _call('getRetainingPath',
@@ -1781,8 +1805,10 @@
       _call('getProcessMemoryUsage');
 
   @override
-  Future<Stack> getStack(String isolateId) =>
-      _call('getStack', {'isolateId': isolateId});
+  Future<Stack> getStack(String isolateId, {int limit}) => _call('getStack', {
+        'isolateId': isolateId,
+        if (limit != null) 'limit': limit,
+      });
 
   @override
   Future<ProtocolList> getSupportedProtocols() =>
@@ -2432,6 +2458,9 @@
 
   /// An instance of the Dart class BoundedType.
   static const String kBoundedType = 'BoundedType';
+
+  /// An instance of the Dart class ReceivePort.
+  static const String kReceivePort = 'ReceivePort';
 }
 
 /// A `SentinelKind` is used to distinguish different kinds of `Sentinel`
@@ -4239,6 +4268,27 @@
   @optional
   ContextRef closureContext;
 
+  /// The port ID for a ReceivePort.
+  ///
+  /// Provided for instance kinds:
+  ///  - ReceivePort
+  @optional
+  int portId;
+
+  /// The stack trace associated with the allocation of a ReceivePort.
+  ///
+  /// Provided for instance kinds:
+  ///  - ReceivePort
+  @optional
+  InstanceRef allocationLocation;
+
+  /// A name associated with a ReceivePort used for debugging purposes.
+  ///
+  /// Provided for instance kinds:
+  ///  - ReceivePort
+  @optional
+  String debugName;
+
   InstanceRef({
     @required this.kind,
     @required this.classRef,
@@ -4252,6 +4302,9 @@
     this.pattern,
     this.closureFunction,
     this.closureContext,
+    this.portId,
+    this.allocationLocation,
+    this.debugName,
   }) : super(id: id);
 
   InstanceRef._fromJson(Map<String, dynamic> json) : super._fromJson(json) {
@@ -4269,6 +4322,10 @@
         createServiceObject(json['closureFunction'], const ['FuncRef']);
     closureContext =
         createServiceObject(json['closureContext'], const ['ContextRef']);
+    portId = json['portId'];
+    allocationLocation =
+        createServiceObject(json['allocationLocation'], const ['InstanceRef']);
+    debugName = json['debugName'];
   }
 
   @override
@@ -4288,6 +4345,9 @@
     _setIfNotNull(json, 'pattern', pattern?.toJson());
     _setIfNotNull(json, 'closureFunction', closureFunction?.toJson());
     _setIfNotNull(json, 'closureContext', closureContext?.toJson());
+    _setIfNotNull(json, 'portId', portId);
+    _setIfNotNull(json, 'allocationLocation', allocationLocation?.toJson());
+    _setIfNotNull(json, 'debugName', debugName);
     return json;
   }
 
@@ -4318,6 +4378,7 @@
   ///  - Double (suitable for passing to Double.parse())
   ///  - Int (suitable for passing to int.parse())
   ///  - String (value may be truncated)
+  ///  - StackTrace
   @optional
   String valueAsString;
 
@@ -4554,6 +4615,27 @@
   @optional
   InstanceRef bound;
 
+  /// The port ID for a ReceivePort.
+  ///
+  /// Provided for instance kinds:
+  ///  - ReceivePort
+  @optional
+  int portId;
+
+  /// The stack trace associated with the allocation of a ReceivePort.
+  ///
+  /// Provided for instance kinds:
+  ///  - ReceivePort
+  @optional
+  InstanceRef allocationLocation;
+
+  /// A name associated with a ReceivePort used for debugging purposes.
+  ///
+  /// Provided for instance kinds:
+  ///  - ReceivePort
+  @optional
+  String debugName;
+
   Instance({
     @required this.kind,
     @required this.classRef,
@@ -4582,6 +4664,9 @@
     this.parameterIndex,
     this.targetType,
     this.bound,
+    this.portId,
+    this.allocationLocation,
+    this.debugName,
   }) : super(id: id);
 
   Instance._fromJson(Map<String, dynamic> json) : super._fromJson(json) {
@@ -4627,6 +4712,10 @@
     parameterIndex = json['parameterIndex'];
     targetType = createServiceObject(json['targetType'], const ['InstanceRef']);
     bound = createServiceObject(json['bound'], const ['InstanceRef']);
+    portId = json['portId'];
+    allocationLocation =
+        createServiceObject(json['allocationLocation'], const ['InstanceRef']);
+    debugName = json['debugName'];
   }
 
   @override
@@ -4663,6 +4752,9 @@
     _setIfNotNull(json, 'parameterIndex', parameterIndex);
     _setIfNotNull(json, 'targetType', targetType?.toJson());
     _setIfNotNull(json, 'bound', bound?.toJson());
+    _setIfNotNull(json, 'portId', portId);
+    _setIfNotNull(json, 'allocationLocation', allocationLocation?.toJson());
+    _setIfNotNull(json, 'debugName', debugName);
     return json;
   }
 
@@ -5743,6 +5835,37 @@
   String toString() => '[Obj type: ${type}, id: ${id}]';
 }
 
+/// A `PortList` contains a list of ports associated with some isolate.
+///
+/// See [getPort].
+class PortList extends Response {
+  static PortList parse(Map<String, dynamic> json) =>
+      json == null ? null : PortList._fromJson(json);
+
+  List<InstanceRef> ports;
+
+  PortList({
+    @required this.ports,
+  });
+
+  PortList._fromJson(Map<String, dynamic> json) : super._fromJson(json) {
+    ports = List<InstanceRef>.from(
+        createServiceObject(json['ports'], const ['InstanceRef']) ?? []);
+  }
+
+  @override
+  Map<String, dynamic> toJson() {
+    var json = <String, dynamic>{};
+    json['type'] = 'PortList';
+    json.addAll({
+      'ports': ports.map((f) => f.toJson()).toList(),
+    });
+    return json;
+  }
+
+  String toString() => '[PortList type: ${type}, ports: ${ports}]';
+}
+
 /// A `ProfileFunction` contains profiling information about a Dart or native
 /// function.
 ///
@@ -6550,23 +6673,40 @@
       'compiled: ${compiled}]';
 }
 
+/// The `Stack` class represents the various components of a Dart stack trace
+/// for a given isolate.
+///
+/// See [getStack].
 class Stack extends Response {
   static Stack parse(Map<String, dynamic> json) =>
       json == null ? null : Stack._fromJson(json);
 
+  /// A list of frames that make up the synchronous stack, rooted at the message
+  /// loop (i.e., the frames since the last asynchronous gap or the isolate's
+  /// entrypoint).
   List<Frame> frames;
 
+  /// A list of frames representing the asynchronous path. Comparable to
+  /// `awaiterFrames`, if provided, although some frames may be different.
   @optional
   List<Frame> asyncCausalFrames;
 
+  /// A list of frames representing the asynchronous path. Comparable to
+  /// `asyncCausalFrames`, if provided, although some frames may be different.
   @optional
   List<Frame> awaiterFrames;
 
+  /// A list of messages in the isolate's message queue.
   List<Message> messages;
 
+  /// Specifies whether or not this stack is complete or has been artificially
+  /// truncated.
+  bool truncated;
+
   Stack({
     @required this.frames,
     @required this.messages,
+    @required this.truncated,
     this.asyncCausalFrames,
     this.awaiterFrames,
   });
@@ -6584,6 +6724,7 @@
             createServiceObject(json['awaiterFrames'], const ['Frame']));
     messages = List<Message>.from(
         createServiceObject(json['messages'], const ['Message']) ?? []);
+    truncated = json['truncated'];
   }
 
   @override
@@ -6593,6 +6734,7 @@
     json.addAll({
       'frames': frames.map((f) => f.toJson()).toList(),
       'messages': messages.map((f) => f.toJson()).toList(),
+      'truncated': truncated,
     });
     _setIfNotNull(json, 'asyncCausalFrames',
         asyncCausalFrames?.map((f) => f?.toJson())?.toList());
@@ -6601,8 +6743,9 @@
     return json;
   }
 
-  String toString() =>
-      '[Stack type: ${type}, frames: ${frames}, messages: ${messages}]';
+  String toString() => '[Stack ' //
+      'type: ${type}, frames: ${frames}, messages: ${messages}, ' //
+      'truncated: ${truncated}]';
 }
 
 /// The `Success` type is used to indicate that an operation completed
@@ -6629,7 +6772,7 @@
   static Timeline parse(Map<String, dynamic> json) =>
       json == null ? null : Timeline._fromJson(json);
 
-  /// A list of timeline events. No order is guarenteed for these events; in
+  /// A list of timeline events. No order is guaranteed for these events; in
   /// particular, these events may be unordered with respect to their
   /// timestamps.
   List<TimelineEvent> traceEvents;
diff --git a/pkg/vm_service/pubspec.yaml b/pkg/vm_service/pubspec.yaml
index 690f8b6..3b14073 100644
--- a/pkg/vm_service/pubspec.yaml
+++ b/pkg/vm_service/pubspec.yaml
@@ -2,7 +2,7 @@
 description: >-
   A library to communicate with a service implementing the Dart VM
   service protocol.
-version: 5.3.0
+version: 5.5.0
 
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/vm_service
 
diff --git a/pkg/vm_service/test/network_profiling_test.dart b/pkg/vm_service/test/network_profiling_test.dart
index ecbad0d..d554d81 100644
--- a/pkg/vm_service/test/network_profiling_test.dart
+++ b/pkg/vm_service/test/network_profiling_test.dart
@@ -6,9 +6,11 @@
 import 'dart:convert';
 import 'dart:developer';
 import 'dart:io' as io;
-import 'package:vm_service/vm_service.dart';
-import 'package:vm_service/src/dart_io_extensions.dart';
+
 import 'package:test/test.dart';
+import 'package:vm_service/src/dart_io_extensions.dart';
+import 'package:vm_service/vm_service.dart';
+
 import 'common/service_test_common.dart';
 import 'common/test_helper.dart';
 
@@ -19,8 +21,37 @@
 const String kGetVersionRPC = 'ext.dart.io.getVersion';
 const String kPauseSocketProfilingRPC = 'ext.dart.io.pauseSocketProfiling';
 const String kStartSocketProfilingRPC = 'ext.dart.io.startSocketProfiling';
+const String kSocketProfilingEnabledRPC = 'ext.dart.io.socketProfilingEnabled';
 const String localhost = '127.0.0.1';
 
+Future<void> waitForStreamEvent(
+    VmService service, IsolateRef isolateRef, bool state,
+    {bool useSetter = true}) async {
+  final completer = Completer<void>();
+  final isolateId = isolateRef.id;
+  StreamSubscription sub;
+  sub = service.onExtensionEvent.listen((event) {
+    expect(event.extensionKind, 'SocketProfilingStateChange');
+    expect(event.extensionData.data['isolateId'], isolateRef.id);
+    expect(event.extensionData.data['enabled'], state);
+    sub.cancel();
+    completer.complete();
+  });
+  await service.streamListen(EventStreams.kExtension);
+
+  if (useSetter) {
+    state
+        // ignore: deprecated_member_use_from_same_package
+        ? await service.startSocketProfiling(isolateId)
+        // ignore: deprecated_member_use_from_same_package
+        : await service.pauseSocketProfiling(isolateId);
+  } else {
+    await service.socketProfilingEnabled(isolateId, state);
+  }
+  await completer.future;
+  await service.streamCancel(EventStreams.kExtension);
+}
+
 Future<void> setup() async {}
 
 Future<void> socketTest() async {
@@ -63,6 +94,7 @@
     expect(isolate.extensionRPCs.contains(kPauseSocketProfilingRPC), isTrue);
     expect(isolate.extensionRPCs.contains(kStartSocketProfilingRPC), isTrue);
     expect(isolate.extensionRPCs.contains(kPauseSocketProfilingRPC), isTrue);
+    expect(isolate.extensionRPCs.contains(kSocketProfilingEnabledRPC), isTrue);
   },
 
   // Test getSocketProfiler
@@ -70,16 +102,34 @@
     final socketProfile = await service.getSocketProfile(isolateRef.id);
     expect(socketProfile.sockets.isEmpty, isTrue);
   },
-  // Exercise all methods naively
+  // Exercise methods naively
   (VmService service, IsolateRef isolateRef) async {
     final version = await service.getDartIOVersion(isolateRef.id);
     expect(version.major >= 1, true);
     expect(version.minor >= 0, true);
-    await service.startSocketProfiling(isolateRef.id);
-    await service.pauseSocketProfiling(isolateRef.id);
     await service.clearSocketProfile(isolateRef.id);
     await service.getSocketProfile(isolateRef.id);
   },
+  (VmService service, IsolateRef isolateRef) async {
+    final initial =
+        (await service.socketProfilingEnabled(isolateRef.id)).enabled;
+    await waitForStreamEvent(service, isolateRef, !initial);
+    expect((await service.socketProfilingEnabled(isolateRef.id)).enabled,
+        !initial);
+    await waitForStreamEvent(service, isolateRef, initial);
+    expect(
+        (await service.socketProfilingEnabled(isolateRef.id)).enabled, initial);
+  },
+  (VmService service, IsolateRef isolateRef) async {
+    final initial =
+        (await service.socketProfilingEnabled(isolateRef.id)).enabled;
+    await waitForStreamEvent(service, isolateRef, !initial, useSetter: false);
+    expect((await service.socketProfilingEnabled(isolateRef.id)).enabled,
+        !initial);
+    await waitForStreamEvent(service, isolateRef, initial, useSetter: false);
+    expect(
+        (await service.socketProfilingEnabled(isolateRef.id)).enabled, initial);
+  }
   // TODO(bkonyi): fully port observatory test for socket profiling.
 ];
 
diff --git a/pkg/wasm/lib/src/function.dart b/pkg/wasm/lib/src/function.dart
index 4ac694e..82f07b8 100644
--- a/pkg/wasm/lib/src/function.dart
+++ b/pkg/wasm/lib/src/function.dart
@@ -10,37 +10,46 @@
 /// WasmFunction is a callable function from a WasmInstance.
 class WasmFunction {
   String _name;
-  Pointer<WasmerExportFunc> _func;
+  Pointer<WasmerFunc> _func;
   List<int> _argTypes;
   int _returnType;
-  Pointer<WasmerValue> _args;
-  Pointer<WasmerValue> _result;
+  Pointer<WasmerValVec> _args = allocate<WasmerValVec>();
+  Pointer<WasmerValVec> _results = allocate<WasmerValVec>();
 
-  WasmFunction(this._name, this._func, this._argTypes, this._returnType)
-      : _args = allocate<WasmerValue>(count: _argTypes.length),
-        _result = allocate<WasmerValue>() {
+  WasmFunction(this._name, this._func, this._argTypes, this._returnType) {
+    _args.ref.length = _argTypes.length;
+    _args.ref.data = _argTypes.length == 0
+        ? nullptr
+        : allocate<WasmerVal>(count: _argTypes.length);
+    _results.ref.length = _returnType == WasmerValKindVoid ? 0 : 1;
+    _results.ref.data =
+        _returnType == WasmerValKindVoid ? nullptr : allocate<WasmerVal>();
     for (var i = 0; i < _argTypes.length; ++i) {
-      _args[i].tag = _argTypes[i];
+      _args.ref.data[i].kind = _argTypes[i];
     }
   }
 
+  String toString() {
+    return WasmRuntime.getSignatureString(_name, _argTypes, _returnType);
+  }
+
   bool _fillArg(dynamic arg, int i) {
     switch (_argTypes[i]) {
-      case WasmerValueTagI32:
+      case WasmerValKindI32:
         if (arg is! int) return false;
-        _args[i].i32 = arg;
+        _args.ref.data[i].i32 = arg;
         return true;
-      case WasmerValueTagI64:
+      case WasmerValKindI64:
         if (arg is! int) return false;
-        _args[i].i64 = arg;
+        _args.ref.data[i].i64 = arg;
         return true;
-      case WasmerValueTagF32:
+      case WasmerValKindF32:
         if (arg is! num) return false;
-        _args[i].f32 = arg;
+        _args.ref.data[i].f32 = arg;
         return true;
-      case WasmerValueTagF64:
+      case WasmerValKindF64:
         if (arg is! num) return false;
-        _args[i].f64 = arg;
+        _args.ref.data[i].f64 = arg;
         return true;
     }
     return false;
@@ -48,29 +57,29 @@
 
   dynamic apply(List<dynamic> args) {
     if (args.length != _argTypes.length) {
-      throw ArgumentError("Wrong number arguments for WASM function: $_name");
+      throw ArgumentError("Wrong number arguments for WASM function: $this");
     }
     for (var i = 0; i < args.length; ++i) {
       if (!_fillArg(args[i], i)) {
-        throw ArgumentError("Bad argument type for WASM function: $_name");
+        throw ArgumentError("Bad argument type for WASM function: $this");
       }
     }
-    WasmRuntime().call(_func, _args, _argTypes.length, _result,
-        _returnType == WasmerValueTagVoid ? 0 : 1);
+    WasmRuntime().call(_func, _args, _results, toString());
 
-    if (_returnType == WasmerValueTagVoid) {
+    if (_returnType == WasmerValKindVoid) {
       return null;
     }
-    assert(_returnType == _result.ref.tag);
+    var result = _results.ref.data[0];
+    assert(_returnType == result.kind);
     switch (_returnType) {
-      case WasmerValueTagI32:
-        return _result.ref.i32;
-      case WasmerValueTagI64:
-        return _result.ref.i64;
-      case WasmerValueTagF32:
-        return _result.ref.f32;
-      case WasmerValueTagF64:
-        return _result.ref.f64;
+      case WasmerValKindI32:
+        return result.i32;
+      case WasmerValKindI64:
+        return result.i64;
+      case WasmerValKindF32:
+        return result.f32;
+      case WasmerValKindF64:
+        return result.f64;
     }
   }
 
diff --git a/pkg/wasm/lib/src/module.dart b/pkg/wasm/lib/src/module.dart
index 4013966..d60f9e8 100644
--- a/pkg/wasm/lib/src/module.dart
+++ b/pkg/wasm/lib/src/module.dart
@@ -11,14 +11,24 @@
 
 /// WasmModule is a compiled module that can be instantiated.
 class WasmModule {
-  Pointer<WasmerModule> _module;
+  Pointer<WasmerStore> _store;
+  late Pointer<WasmerModule> _module;
 
   /// Compile a module.
-  WasmModule(Uint8List data) : _module = WasmRuntime().compile(data) {}
+  WasmModule(Uint8List data) : _store = WasmRuntime().newStore() {
+    _module = WasmRuntime().compile(_store, data);
+  }
 
-  /// Instantiate the module with the given imports.
-  WasmInstance instantiate(WasmImports imports) {
-    return WasmInstance(_module, imports);
+  /// Returns a WasmInstanceBuilder that is used to add all the imports that the
+  /// module needs, and then instantiate it.
+  WasmInstanceBuilder instantiate() {
+    return WasmInstanceBuilder(this);
+  }
+
+  /// Create a new memory with the given number of initial pages, and optional
+  /// maximum number of pages.
+  WasmMemory createMemory(int pages, [int? maxPages]) {
+    return WasmMemory._create(_store, pages, maxPages);
   }
 
   /// Returns a description of all of the module's imports and exports, for
@@ -28,55 +38,204 @@
     var runtime = WasmRuntime();
     var imports = runtime.importDescriptors(_module);
     for (var imp in imports) {
-      var kind = wasmerImpExpKindName(imp.kind);
-      description.write('import $kind: ${imp.moduleName}::${imp.name}\n');
+      description.write("import $imp\n");
     }
     var exports = runtime.exportDescriptors(_module);
     for (var exp in exports) {
-      var kind = wasmerImpExpKindName(exp.kind);
-      description.write('export $kind: ${exp.name}\n');
+      description.write("export $exp\n");
     }
     return description.toString();
   }
 }
 
-/// WasmImports holds all the imports for a WasmInstance.
-class WasmImports {
-  Pointer<WasmerImport> _imports;
-  int _capacity;
-  int _length;
+Pointer<WasmerTrap> _wasmFnImportTrampoline(Pointer<_WasmFnImport> imp,
+    Pointer<WasmerValVec> args, Pointer<WasmerValVec> results) {
+  try {
+    _WasmFnImport._call(imp, args, results);
+  } catch (exception) {
+    return WasmRuntime().newTrap(imp.ref.store, exception);
+  }
+  return nullptr;
+}
 
-  /// Create an imports object.
-  WasmImports([this._capacity = 4])
-      : _imports = allocate<WasmerImport>(count: _capacity),
-        _length = 0 {}
+void _wasmFnImportFinalizer(Pointer<_WasmFnImport> imp) {
+  _wasmFnImportToFn.remove(imp.address);
+  free(imp);
+}
 
-  /// Returns the number of imports.
-  int get length => _length;
+final _wasmFnImportTrampolineNative = Pointer.fromFunction<
+    Pointer<WasmerTrap> Function(Pointer<_WasmFnImport>, Pointer<WasmerValVec>,
+        Pointer<WasmerValVec>)>(_wasmFnImportTrampoline);
+final _wasmFnImportToFn = <int, Function>{};
+final _wasmFnImportFinalizerNative =
+    Pointer.fromFunction<Void Function(Pointer<_WasmFnImport>)>(
+        _wasmFnImportFinalizer);
+
+class _WasmFnImport extends Struct {
+  @Int32()
+  external int returnType;
+
+  external Pointer<WasmerStore> store;
+
+  static void _call(Pointer<_WasmFnImport> imp, Pointer<WasmerValVec> rawArgs,
+      Pointer<WasmerValVec> rawResult) {
+    Function fn = _wasmFnImportToFn[imp.address] as Function;
+    var args = [];
+    for (var i = 0; i < rawArgs.ref.length; ++i) {
+      args.add(rawArgs.ref.data[i].toDynamic);
+    }
+    assert(
+        rawResult.ref.length == 1 || imp.ref.returnType == WasmerValKindVoid);
+    var result = Function.apply(fn, args);
+    if (imp.ref.returnType != WasmerValKindVoid) {
+      rawResult.ref.data[0].kind = imp.ref.returnType;
+      switch (imp.ref.returnType) {
+        case WasmerValKindI32:
+          rawResult.ref.data[0].i32 = result;
+          break;
+        case WasmerValKindI64:
+          rawResult.ref.data[0].i64 = result;
+          break;
+        case WasmerValKindF32:
+          rawResult.ref.data[0].f32 = result;
+          break;
+        case WasmerValKindF64:
+          rawResult.ref.data[0].f64 = result;
+          break;
+      }
+    }
+  }
+}
+
+/// WasmInstanceBuilder is used collect all the imports that a WasmModule
+/// requires before it is instantiated.
+class WasmInstanceBuilder {
+  WasmModule _module;
+  late List<WasmImportDescriptor> _importDescs;
+  Map<String, int> _importIndex;
+  Pointer<WasmerExternVec> _imports = allocate<WasmerExternVec>();
+  Pointer<WasmerWasiEnv> _wasiEnv = nullptr;
+
+  WasmInstanceBuilder(this._module) : _importIndex = {} {
+    _importDescs = WasmRuntime().importDescriptors(_module._module);
+    _imports.ref.length = _importDescs.length;
+    _imports.ref.data =
+        allocate<Pointer<WasmerExtern>>(count: _importDescs.length);
+    for (var i = 0; i < _importDescs.length; ++i) {
+      var imp = _importDescs[i];
+      _importIndex["${imp.moduleName}::${imp.name}"] = i;
+      _imports.ref.data[i] = nullptr;
+    }
+  }
+
+  int _getIndex(String moduleName, String name) {
+    var index = _importIndex["${moduleName}::${name}"];
+    if (index == null) {
+      throw Exception("Import not found: ${moduleName}::${name}");
+    } else if (_imports.ref.data[index] != nullptr) {
+      throw Exception("Import already filled: ${moduleName}::${name}");
+    } else {
+      return index;
+    }
+  }
+
+  /// Add a WasmMemory to the imports.
+  WasmInstanceBuilder addMemory(
+      String moduleName, String name, WasmMemory memory) {
+    var index = _getIndex(moduleName, name);
+    var imp = _importDescs[index];
+    if (imp.kind != WasmerExternKindMemory) {
+      throw Exception("Import is not a memory: $imp");
+    }
+    _imports.ref.data[index] = WasmRuntime().memoryToExtern(memory._mem);
+    return this;
+  }
+
+  /// Add a function to the imports.
+  WasmInstanceBuilder addFunction(String moduleName, String name, Function fn) {
+    var index = _getIndex(moduleName, name);
+    var imp = _importDescs[index];
+    var runtime = WasmRuntime();
+
+    if (imp.kind != WasmerExternKindFunction) {
+      throw Exception("Import is not a function: $imp");
+    }
+
+    var argTypes = runtime.getArgTypes(imp.funcType);
+    var returnType = runtime.getReturnType(imp.funcType);
+    var wasmFnImport = allocate<_WasmFnImport>();
+    wasmFnImport.ref.returnType = returnType;
+    wasmFnImport.ref.store = _module._store;
+    _wasmFnImportToFn[wasmFnImport.address] = fn;
+    var fnImp = runtime.newFunc(
+        _module._store,
+        imp.funcType,
+        _wasmFnImportTrampolineNative,
+        wasmFnImport,
+        _wasmFnImportFinalizerNative);
+    _imports.ref.data[index] = runtime.functionToExtern(fnImp);
+    return this;
+  }
+
+  /// Enable WASI and add the default WASI imports.
+  WasmInstanceBuilder enableWasi(
+      {bool captureStdout = false, bool captureStderr = false}) {
+    if (_wasiEnv != nullptr) {
+      throw Exception("WASI is already enabled.");
+    }
+    var runtime = WasmRuntime();
+    var config = runtime.newWasiConfig();
+    if (captureStdout) runtime.captureWasiStdout(config);
+    if (captureStderr) runtime.captureWasiStderr(config);
+    _wasiEnv = runtime.newWasiEnv(config);
+    runtime.getWasiImports(_module._store, _module._module, _wasiEnv, _imports);
+    return this;
+  }
+
+  /// Build the module instance.
+  WasmInstance build() {
+    for (var i = 0; i < _importDescs.length; ++i) {
+      if (_imports.ref.data[i] == nullptr) {
+        throw Exception("Missing import: ${_importDescs[i]}");
+      }
+    }
+    return WasmInstance(_module, _imports, _wasiEnv);
+  }
 }
 
 /// WasmInstance is an instantiated WasmModule.
 class WasmInstance {
-  Pointer<WasmerModule> _module;
+  WasmModule _module;
   Pointer<WasmerInstance> _instance;
   Pointer<WasmerMemory>? _exportedMemory;
+  Pointer<WasmerWasiEnv> _wasiEnv;
+  Stream<List<int>>? _stdout;
+  Stream<List<int>>? _stderr;
   Map<String, WasmFunction> _functions = {};
 
-  WasmInstance(this._module, WasmImports imports)
+  WasmInstance(this._module, Pointer<WasmerExternVec> imports, this._wasiEnv)
       : _instance = WasmRuntime()
-            .instantiate(_module, imports._imports, imports.length) {
+            .instantiate(_module._store, _module._module, imports) {
     var runtime = WasmRuntime();
-    var exps = runtime.exports(_instance);
-    for (var e in exps) {
-      var kind = runtime.exportKind(e);
-      String name = runtime.exportName(e);
-      if (kind == WasmerImpExpKindFunction) {
-        var f = runtime.exportToFunction(e);
+    var exports = runtime.exports(_instance);
+    var exportDescs = runtime.exportDescriptors(_module._module);
+    assert(exports.ref.length == exportDescs.length);
+    for (var i = 0; i < exports.ref.length; ++i) {
+      var e = exports.ref.data[i];
+      var kind = runtime.externKind(exports.ref.data[i]);
+      String name = exportDescs[i].name;
+      if (kind == WasmerExternKindFunction) {
+        var f = runtime.externToFunction(e);
+        var ft = exportDescs[i].funcType;
         _functions[name] = WasmFunction(
-            name, f, runtime.getArgTypes(f), runtime.getReturnType(f));
-      } else if (kind == WasmerImpExpKindMemory) {
+            name, f, runtime.getArgTypes(ft), runtime.getReturnType(ft));
+      } else if (kind == WasmerExternKindMemory) {
         // WASM currently allows only one memory per module.
-        _exportedMemory = runtime.exportToMemory(e);
+        var mem = runtime.externToMemory(e);
+        _exportedMemory = mem;
+        if (_wasiEnv != nullptr) {
+          runtime.wasiEnvSetMemory(_wasiEnv as Pointer<WasmerWasiEnv>, mem);
+        }
       }
     }
   }
@@ -94,6 +253,24 @@
     }
     return WasmMemory._fromExport(_exportedMemory as Pointer<WasmerMemory>);
   }
+
+  /// Returns a stream that reads from stdout. To use this, you must enable WASI
+  /// when instantiating the module, and set captureStdout to true.
+  Stream<List<int>> get stdout {
+    if (_wasiEnv == nullptr) {
+      throw Exception("Can't capture stdout without WASI enabled.");
+    }
+    return _stdout ??= WasmRuntime().getWasiStdoutStream(_wasiEnv);
+  }
+
+  /// Returns a stream that reads from stderr. To use this, you must enable WASI
+  /// when instantiating the module, and set captureStderr to true.
+  Stream<List<int>> get stderr {
+    if (_wasiEnv == nullptr) {
+      throw Exception("Can't capture stderr without WASI enabled.");
+    }
+    return _stderr ??= WasmRuntime().getWasiStderrStream(_wasiEnv);
+  }
 }
 
 /// WasmMemory contains the memory of a WasmInstance.
@@ -107,8 +284,8 @@
 
   /// Create a new memory with the given number of initial pages, and optional
   /// maximum number of pages.
-  WasmMemory(int pages, [int? maxPages])
-      : _mem = WasmRuntime().newMemory(pages, maxPages) {
+  WasmMemory._create(Pointer<WasmerStore> store, int pages, int? maxPages)
+      : _mem = WasmRuntime().newMemory(store, pages, maxPages) {
     _view = WasmRuntime().memoryView(_mem);
   }
 
diff --git a/pkg/wasm/lib/src/runtime.dart b/pkg/wasm/lib/src/runtime.dart
index 4ddec1d..ee83580 100644
--- a/pkg/wasm/lib/src/runtime.dart
+++ b/pkg/wasm/lib/src/runtime.dart
@@ -2,6 +2,11 @@
 // 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.
 
+// This file has been automatically generated. Please do not edit it manually.
+// To regenerate the file, use the following command
+// "generate_ffi_boilerplate.py".
+
+import 'dart:async';
 import 'dart:convert';
 import 'dart:ffi';
 import 'dart:io';
@@ -14,62 +19,131 @@
   int kind;
   String moduleName;
   String name;
-  WasmImportDescriptor(this.kind, this.moduleName, this.name);
+  Pointer<WasmerFunctype> funcType;
+  WasmImportDescriptor(this.kind, this.moduleName, this.name, this.funcType);
+
+  String toString() {
+    var kindName = wasmerExternKindName(kind);
+    if (kind == WasmerExternKindFunction) {
+      var runtime = WasmRuntime();
+      var sig = WasmRuntime.getSignatureString("${moduleName}::${name}",
+          runtime.getArgTypes(funcType), runtime.getReturnType(funcType));
+      return "$kindName: $sig";
+    } else {
+      return "$kindName: ${moduleName}::${name}";
+    }
+  }
 }
 
 class WasmExportDescriptor {
   int kind;
   String name;
-  WasmExportDescriptor(this.kind, this.name);
+  Pointer<WasmerFunctype> funcType;
+  WasmExportDescriptor(this.kind, this.name, this.funcType);
+
+  String toString() {
+    var kindName = wasmerExternKindName(kind);
+    if (kind == WasmerExternKindFunction) {
+      var runtime = WasmRuntime();
+      var sig = WasmRuntime.getSignatureString(
+          name, runtime.getArgTypes(funcType), runtime.getReturnType(funcType));
+      return "$kindName: $sig";
+    } else {
+      return "$kindName: ${name}";
+    }
+  }
 }
 
 class WasmRuntime {
   static WasmRuntime? _inst;
 
   DynamicLibrary _lib;
-  late WasmerCompileFn _compile;
-  late WasmerInstantiateFn _instantiate;
+  late Pointer<WasmerEngine> _engine;
+  Map<int, dynamic> traps = {};
+  late WasmerWasiConfigInheritStderrFn _wasi_config_inherit_stderr;
+  late WasmerWasiConfigInheritStdoutFn _wasi_config_inherit_stdout;
+  late WasmerWasiConfigNewFn _wasi_config_new;
+  late WasmerWasiEnvDeleteFn _wasi_env_delete;
+  late WasmerWasiEnvNewFn _wasi_env_new;
+  late WasmerWasiEnvReadStderrFn _wasi_env_read_stderr;
+  late WasmerWasiEnvReadStdoutFn _wasi_env_read_stdout;
+  late WasmerWasiEnvSetMemoryFn _wasi_env_set_memory;
+  late WasmerWasiGetImportsFn _wasi_get_imports;
+  late WasmerByteVecDeleteFn _byte_vec_delete;
+  late WasmerByteVecNewFn _byte_vec_new;
+  late WasmerByteVecNewEmptyFn _byte_vec_new_empty;
+  late WasmerByteVecNewUninitializedFn _byte_vec_new_uninitialized;
+  late WasmerEngineDeleteFn _engine_delete;
+  late WasmerEngineNewFn _engine_new;
+  late WasmerExporttypeNameFn _exporttype_name;
+  late WasmerExporttypeTypeFn _exporttype_type;
+  late WasmerExporttypeVecDeleteFn _exporttype_vec_delete;
+  late WasmerExporttypeVecNewFn _exporttype_vec_new;
+  late WasmerExporttypeVecNewEmptyFn _exporttype_vec_new_empty;
+  late WasmerExporttypeVecNewUninitializedFn _exporttype_vec_new_uninitialized;
+  late WasmerExternAsFuncFn _extern_as_func;
+  late WasmerExternAsMemoryFn _extern_as_memory;
+  late WasmerExternDeleteFn _extern_delete;
+  late WasmerExternKindFn _extern_kind;
+  late WasmerExternVecDeleteFn _extern_vec_delete;
+  late WasmerExternVecNewFn _extern_vec_new;
+  late WasmerExternVecNewEmptyFn _extern_vec_new_empty;
+  late WasmerExternVecNewUninitializedFn _extern_vec_new_uninitialized;
+  late WasmerExterntypeAsFunctypeFn _externtype_as_functype;
+  late WasmerExterntypeDeleteFn _externtype_delete;
+  late WasmerExterntypeKindFn _externtype_kind;
+  late WasmerFuncAsExternFn _func_as_extern;
+  late WasmerFuncCallFn _func_call;
+  late WasmerFuncDeleteFn _func_delete;
+  late WasmerFuncNewWithEnvFn _func_new_with_env;
+  late WasmerFunctypeDeleteFn _functype_delete;
+  late WasmerFunctypeParamsFn _functype_params;
+  late WasmerFunctypeResultsFn _functype_results;
+  late WasmerImporttypeModuleFn _importtype_module;
+  late WasmerImporttypeNameFn _importtype_name;
+  late WasmerImporttypeTypeFn _importtype_type;
+  late WasmerImporttypeVecDeleteFn _importtype_vec_delete;
+  late WasmerImporttypeVecNewFn _importtype_vec_new;
+  late WasmerImporttypeVecNewEmptyFn _importtype_vec_new_empty;
+  late WasmerImporttypeVecNewUninitializedFn _importtype_vec_new_uninitialized;
+  late WasmerInstanceDeleteFn _instance_delete;
   late WasmerInstanceExportsFn _instance_exports;
-  late WasmerExportsLenFn _exports_len;
-  late WasmerExportsGetFn _exports_get;
-  late WasmerExportKindFn _export_kind;
-  late WasmerExportToFuncFn _export_to_func;
-  late WasmerExportFuncReturnsArityFn _export_func_returns_arity;
-  late WasmerExportFuncReturnsFn _export_func_returns;
-  late WasmerExportFuncParamsArityFn _export_func_params_arity;
-  late WasmerExportFuncParamsFn _export_func_params;
-  late WasmerExportFuncCallFn _export_func_call;
-  late WasmerExportNamePtrFn _export_name_ptr;
-  late WasmerExportDescriptorsFn _export_descriptors;
-  late WasmerExportDescriptorsDestroyFn _export_descriptors_destroy;
-  late WasmerExportDescriptorsLenFn _export_descriptors_len;
-  late WasmerExportDescriptorsGetFn _export_descriptors_get;
-  late WasmerExportDescriptorKindFn _export_descriptor_kind;
-  late WasmerExportDescriptorNamePtrFn _export_descriptor_name_ptr;
-  late WasmerImportDescriptorModuleNamePtrFn _import_descriptor_module_name_ptr;
-  late WasmerImportDescriptorNamePtrFn _import_descriptor_name_ptr;
-  late WasmerImportDescriptorsFn _import_descriptors;
-  late WasmerImportDescriptorsDestroyFn _import_descriptors_destroy;
-  late WasmerImportDescriptorsLenFn _import_descriptors_len;
-  late WasmerImportDescriptorsGetFn _import_descriptors_get;
-  late WasmerImportDescriptorKindFn _import_descriptor_kind;
-  late WasmerExportToMemoryFn _export_to_memory;
-  late WasmerMemoryNewPtrFn _memory_new_ptr;
-  late WasmerMemoryGrowFn _memory_grow;
-  late WasmerMemoryLengthFn _memory_length;
+  late WasmerInstanceNewFn _instance_new;
+  late WasmerMemoryAsExternFn _memory_as_extern;
   late WasmerMemoryDataFn _memory_data;
-  late WasmerMemoryDataLengthFn _memory_data_length;
+  late WasmerMemoryDataSizeFn _memory_data_size;
+  late WasmerMemoryDeleteFn _memory_delete;
+  late WasmerMemoryGrowFn _memory_grow;
+  late WasmerMemoryNewFn _memory_new;
+  late WasmerMemorySizeFn _memory_size;
+  late WasmerMemorytypeDeleteFn _memorytype_delete;
+  late WasmerMemorytypeNewFn _memorytype_new;
+  late WasmerModuleDeleteFn _module_delete;
+  late WasmerModuleExportsFn _module_exports;
+  late WasmerModuleImportsFn _module_imports;
+  late WasmerModuleNewFn _module_new;
+  late WasmerStoreDeleteFn _store_delete;
+  late WasmerStoreNewFn _store_new;
+  late WasmerTrapDeleteFn _trap_delete;
+  late WasmerTrapMessageFn _trap_message;
+  late WasmerTrapNewFn _trap_new;
+  late WasmerValtypeDeleteFn _valtype_delete;
+  late WasmerValtypeKindFn _valtype_kind;
+  late WasmerValtypeVecDeleteFn _valtype_vec_delete;
+  late WasmerValtypeVecNewFn _valtype_vec_new;
+  late WasmerValtypeVecNewEmptyFn _valtype_vec_new_empty;
+  late WasmerValtypeVecNewUninitializedFn _valtype_vec_new_uninitialized;
+  late WasmerWasmerLastErrorLengthFn _wasmer_last_error_length;
+  late WasmerWasmerLastErrorMessageFn _wasmer_last_error_message;
 
   factory WasmRuntime() {
-    if (_inst == null) {
-      _inst = WasmRuntime._init();
-    }
-    return _inst as WasmRuntime;
+    return _inst ??= WasmRuntime._init();
   }
 
   static String _getLibName() {
-    if (Platform.isMacOS) return "libwasmer_wrapper.dylib";
-    if (Platform.isLinux) return "libwasmer_wrapper.so";
+    if (Platform.isMacOS) return "libwasmer.dylib";
+    if (Platform.isLinux) return "libwasmer.so";
+    // TODO(dartbug.com/37882): Support more platforms.
     throw Exception("Wasm not currently supported on this platform");
   }
 
@@ -104,296 +178,474 @@
 
   WasmRuntime._init()
       : _lib = DynamicLibrary.open(path.join(_getLibDir(), _getLibName())) {
-    _compile = _lib.lookupFunction<NativeWasmerCompileFn, WasmerCompileFn>(
-        'wasmer_compile');
-    _instantiate =
-        _lib.lookupFunction<NativeWasmerInstantiateFn, WasmerInstantiateFn>(
-            'wasmer_module_instantiate');
+    _wasi_config_inherit_stderr = _lib.lookupFunction<
+        NativeWasmerWasiConfigInheritStderrFn,
+        WasmerWasiConfigInheritStderrFn>('wasi_config_inherit_stderr');
+    _wasi_config_inherit_stdout = _lib.lookupFunction<
+        NativeWasmerWasiConfigInheritStdoutFn,
+        WasmerWasiConfigInheritStdoutFn>('wasi_config_inherit_stdout');
+    _wasi_config_new =
+        _lib.lookupFunction<NativeWasmerWasiConfigNewFn, WasmerWasiConfigNewFn>(
+            'wasi_config_new');
+    _wasi_env_delete =
+        _lib.lookupFunction<NativeWasmerWasiEnvDeleteFn, WasmerWasiEnvDeleteFn>(
+            'wasi_env_delete');
+    _wasi_env_new =
+        _lib.lookupFunction<NativeWasmerWasiEnvNewFn, WasmerWasiEnvNewFn>(
+            'wasi_env_new');
+    _wasi_env_read_stderr = _lib.lookupFunction<NativeWasmerWasiEnvReadStderrFn,
+        WasmerWasiEnvReadStderrFn>('wasi_env_read_stderr');
+    _wasi_env_read_stdout = _lib.lookupFunction<NativeWasmerWasiEnvReadStdoutFn,
+        WasmerWasiEnvReadStdoutFn>('wasi_env_read_stdout');
+    _wasi_env_set_memory = _lib.lookupFunction<NativeWasmerWasiEnvSetMemoryFn,
+        WasmerWasiEnvSetMemoryFn>('wasi_env_set_memory');
+    _wasi_get_imports = _lib.lookupFunction<NativeWasmerWasiGetImportsFn,
+        WasmerWasiGetImportsFn>('wasi_get_imports');
+    _byte_vec_delete =
+        _lib.lookupFunction<NativeWasmerByteVecDeleteFn, WasmerByteVecDeleteFn>(
+            'wasm_byte_vec_delete');
+    _byte_vec_new =
+        _lib.lookupFunction<NativeWasmerByteVecNewFn, WasmerByteVecNewFn>(
+            'wasm_byte_vec_new');
+    _byte_vec_new_empty = _lib.lookupFunction<NativeWasmerByteVecNewEmptyFn,
+        WasmerByteVecNewEmptyFn>('wasm_byte_vec_new_empty');
+    _byte_vec_new_uninitialized = _lib.lookupFunction<
+        NativeWasmerByteVecNewUninitializedFn,
+        WasmerByteVecNewUninitializedFn>('wasm_byte_vec_new_uninitialized');
+    _engine_delete =
+        _lib.lookupFunction<NativeWasmerEngineDeleteFn, WasmerEngineDeleteFn>(
+            'wasm_engine_delete');
+    _engine_new =
+        _lib.lookupFunction<NativeWasmerEngineNewFn, WasmerEngineNewFn>(
+            'wasm_engine_new');
+    _exporttype_name = _lib.lookupFunction<NativeWasmerExporttypeNameFn,
+        WasmerExporttypeNameFn>('wasm_exporttype_name');
+    _exporttype_type = _lib.lookupFunction<NativeWasmerExporttypeTypeFn,
+        WasmerExporttypeTypeFn>('wasm_exporttype_type');
+    _exporttype_vec_delete = _lib.lookupFunction<
+        NativeWasmerExporttypeVecDeleteFn,
+        WasmerExporttypeVecDeleteFn>('wasm_exporttype_vec_delete');
+    _exporttype_vec_new = _lib.lookupFunction<NativeWasmerExporttypeVecNewFn,
+        WasmerExporttypeVecNewFn>('wasm_exporttype_vec_new');
+    _exporttype_vec_new_empty = _lib.lookupFunction<
+        NativeWasmerExporttypeVecNewEmptyFn,
+        WasmerExporttypeVecNewEmptyFn>('wasm_exporttype_vec_new_empty');
+    _exporttype_vec_new_uninitialized = _lib.lookupFunction<
+            NativeWasmerExporttypeVecNewUninitializedFn,
+            WasmerExporttypeVecNewUninitializedFn>(
+        'wasm_exporttype_vec_new_uninitialized');
+    _extern_as_func =
+        _lib.lookupFunction<NativeWasmerExternAsFuncFn, WasmerExternAsFuncFn>(
+            'wasm_extern_as_func');
+    _extern_as_memory = _lib.lookupFunction<NativeWasmerExternAsMemoryFn,
+        WasmerExternAsMemoryFn>('wasm_extern_as_memory');
+    _extern_delete =
+        _lib.lookupFunction<NativeWasmerExternDeleteFn, WasmerExternDeleteFn>(
+            'wasm_extern_delete');
+    _extern_kind =
+        _lib.lookupFunction<NativeWasmerExternKindFn, WasmerExternKindFn>(
+            'wasm_extern_kind');
+    _extern_vec_delete = _lib.lookupFunction<NativeWasmerExternVecDeleteFn,
+        WasmerExternVecDeleteFn>('wasm_extern_vec_delete');
+    _extern_vec_new =
+        _lib.lookupFunction<NativeWasmerExternVecNewFn, WasmerExternVecNewFn>(
+            'wasm_extern_vec_new');
+    _extern_vec_new_empty = _lib.lookupFunction<NativeWasmerExternVecNewEmptyFn,
+        WasmerExternVecNewEmptyFn>('wasm_extern_vec_new_empty');
+    _extern_vec_new_uninitialized = _lib.lookupFunction<
+        NativeWasmerExternVecNewUninitializedFn,
+        WasmerExternVecNewUninitializedFn>('wasm_extern_vec_new_uninitialized');
+    _externtype_as_functype = _lib.lookupFunction<
+        NativeWasmerExterntypeAsFunctypeFn,
+        WasmerExterntypeAsFunctypeFn>('wasm_externtype_as_functype');
+    _externtype_delete = _lib.lookupFunction<NativeWasmerExterntypeDeleteFn,
+        WasmerExterntypeDeleteFn>('wasm_externtype_delete');
+    _externtype_kind = _lib.lookupFunction<NativeWasmerExterntypeKindFn,
+        WasmerExterntypeKindFn>('wasm_externtype_kind');
+    _func_as_extern =
+        _lib.lookupFunction<NativeWasmerFuncAsExternFn, WasmerFuncAsExternFn>(
+            'wasm_func_as_extern');
+    _func_call = _lib.lookupFunction<NativeWasmerFuncCallFn, WasmerFuncCallFn>(
+        'wasm_func_call');
+    _func_delete =
+        _lib.lookupFunction<NativeWasmerFuncDeleteFn, WasmerFuncDeleteFn>(
+            'wasm_func_delete');
+    _func_new_with_env = _lib.lookupFunction<NativeWasmerFuncNewWithEnvFn,
+        WasmerFuncNewWithEnvFn>('wasm_func_new_with_env');
+    _functype_delete = _lib.lookupFunction<NativeWasmerFunctypeDeleteFn,
+        WasmerFunctypeDeleteFn>('wasm_functype_delete');
+    _functype_params = _lib.lookupFunction<NativeWasmerFunctypeParamsFn,
+        WasmerFunctypeParamsFn>('wasm_functype_params');
+    _functype_results = _lib.lookupFunction<NativeWasmerFunctypeResultsFn,
+        WasmerFunctypeResultsFn>('wasm_functype_results');
+    _importtype_module = _lib.lookupFunction<NativeWasmerImporttypeModuleFn,
+        WasmerImporttypeModuleFn>('wasm_importtype_module');
+    _importtype_name = _lib.lookupFunction<NativeWasmerImporttypeNameFn,
+        WasmerImporttypeNameFn>('wasm_importtype_name');
+    _importtype_type = _lib.lookupFunction<NativeWasmerImporttypeTypeFn,
+        WasmerImporttypeTypeFn>('wasm_importtype_type');
+    _importtype_vec_delete = _lib.lookupFunction<
+        NativeWasmerImporttypeVecDeleteFn,
+        WasmerImporttypeVecDeleteFn>('wasm_importtype_vec_delete');
+    _importtype_vec_new = _lib.lookupFunction<NativeWasmerImporttypeVecNewFn,
+        WasmerImporttypeVecNewFn>('wasm_importtype_vec_new');
+    _importtype_vec_new_empty = _lib.lookupFunction<
+        NativeWasmerImporttypeVecNewEmptyFn,
+        WasmerImporttypeVecNewEmptyFn>('wasm_importtype_vec_new_empty');
+    _importtype_vec_new_uninitialized = _lib.lookupFunction<
+            NativeWasmerImporttypeVecNewUninitializedFn,
+            WasmerImporttypeVecNewUninitializedFn>(
+        'wasm_importtype_vec_new_uninitialized');
+    _instance_delete = _lib.lookupFunction<NativeWasmerInstanceDeleteFn,
+        WasmerInstanceDeleteFn>('wasm_instance_delete');
     _instance_exports = _lib.lookupFunction<NativeWasmerInstanceExportsFn,
-        WasmerInstanceExportsFn>('wasmer_instance_exports');
-    _exports_len =
-        _lib.lookupFunction<NativeWasmerExportsLenFn, WasmerExportsLenFn>(
-            'wasmer_exports_len');
-    _exports_get =
-        _lib.lookupFunction<NativeWasmerExportsGetFn, WasmerExportsGetFn>(
-            'wasmer_exports_get');
-    _export_kind =
-        _lib.lookupFunction<NativeWasmerExportKindFn, WasmerExportKindFn>(
-            'wasmer_export_kind');
-    _export_to_func =
-        _lib.lookupFunction<NativeWasmerExportToFuncFn, WasmerExportToFuncFn>(
-            'wasmer_export_to_func');
-    _export_func_returns_arity = _lib.lookupFunction<
-        NativeWasmerExportFuncReturnsArityFn,
-        WasmerExportFuncReturnsArityFn>('wasmer_export_func_returns_arity');
-    _export_func_returns = _lib.lookupFunction<NativeWasmerExportFuncReturnsFn,
-        WasmerExportFuncReturnsFn>('wasmer_export_func_returns');
-    _export_func_params_arity = _lib.lookupFunction<
-        NativeWasmerExportFuncParamsArityFn,
-        WasmerExportFuncParamsArityFn>('wasmer_export_func_params_arity');
-    _export_func_params = _lib.lookupFunction<NativeWasmerExportFuncParamsFn,
-        WasmerExportFuncParamsFn>('wasmer_export_func_params');
-    _export_func_call = _lib.lookupFunction<NativeWasmerExportFuncCallFn,
-        WasmerExportFuncCallFn>('wasmer_export_func_call');
-    _export_descriptors = _lib.lookupFunction<NativeWasmerExportDescriptorsFn,
-        WasmerExportDescriptorsFn>('wasmer_export_descriptors');
-    _export_descriptors_destroy = _lib.lookupFunction<
-        NativeWasmerExportDescriptorsDestroyFn,
-        WasmerExportDescriptorsDestroyFn>('wasmer_export_descriptors_destroy');
-    _export_descriptors_len = _lib.lookupFunction<
-        NativeWasmerExportDescriptorsLenFn,
-        WasmerExportDescriptorsLenFn>('wasmer_export_descriptors_len');
-    _export_descriptors_get = _lib.lookupFunction<
-        NativeWasmerExportDescriptorsGetFn,
-        WasmerExportDescriptorsGetFn>('wasmer_export_descriptors_get');
-    _export_descriptor_kind = _lib.lookupFunction<
-        NativeWasmerExportDescriptorKindFn,
-        WasmerExportDescriptorKindFn>('wasmer_export_descriptor_kind');
-    _export_name_ptr =
-        _lib.lookupFunction<NativeWasmerExportNamePtrFn, WasmerExportNamePtrFn>(
-            'wasmer_export_name_ptr');
-    _export_descriptor_name_ptr = _lib.lookupFunction<
-        NativeWasmerExportDescriptorNamePtrFn,
-        WasmerExportDescriptorNamePtrFn>('wasmer_export_descriptor_name_ptr');
-    _import_descriptors = _lib.lookupFunction<NativeWasmerImportDescriptorsFn,
-        WasmerImportDescriptorsFn>('wasmer_import_descriptors');
-    _import_descriptors_destroy = _lib.lookupFunction<
-        NativeWasmerImportDescriptorsDestroyFn,
-        WasmerImportDescriptorsDestroyFn>('wasmer_import_descriptors_destroy');
-    _import_descriptors_len = _lib.lookupFunction<
-        NativeWasmerImportDescriptorsLenFn,
-        WasmerImportDescriptorsLenFn>('wasmer_import_descriptors_len');
-    _import_descriptors_get = _lib.lookupFunction<
-        NativeWasmerImportDescriptorsGetFn,
-        WasmerImportDescriptorsGetFn>('wasmer_import_descriptors_get');
-    _import_descriptor_kind = _lib.lookupFunction<
-        NativeWasmerImportDescriptorKindFn,
-        WasmerImportDescriptorKindFn>('wasmer_import_descriptor_kind');
-    _import_descriptor_module_name_ptr = _lib.lookupFunction<
-            NativeWasmerImportDescriptorModuleNamePtrFn,
-            WasmerImportDescriptorModuleNamePtrFn>(
-        'wasmer_import_descriptor_module_name_ptr');
-    _import_descriptor_name_ptr = _lib.lookupFunction<
-        NativeWasmerImportDescriptorNamePtrFn,
-        WasmerImportDescriptorNamePtrFn>('wasmer_import_descriptor_name_ptr');
-    _export_to_memory = _lib.lookupFunction<NativeWasmerExportToMemoryFn,
-        WasmerExportToMemoryFn>('wasmer_export_to_memory');
-    _memory_new_ptr =
-        _lib.lookupFunction<NativeWasmerMemoryNewPtrFn, WasmerMemoryNewPtrFn>(
-            'wasmer_memory_new_ptr');
-    _memory_grow =
-        _lib.lookupFunction<NativeWasmerMemoryGrowFn, WasmerMemoryGrowFn>(
-            'wasmer_memory_grow');
-    _memory_length =
-        _lib.lookupFunction<NativeWasmerMemoryLengthFn, WasmerMemoryLengthFn>(
-            'wasmer_memory_length');
+        WasmerInstanceExportsFn>('wasm_instance_exports');
+    _instance_new =
+        _lib.lookupFunction<NativeWasmerInstanceNewFn, WasmerInstanceNewFn>(
+            'wasm_instance_new');
+    _memory_as_extern = _lib.lookupFunction<NativeWasmerMemoryAsExternFn,
+        WasmerMemoryAsExternFn>('wasm_memory_as_extern');
     _memory_data =
         _lib.lookupFunction<NativeWasmerMemoryDataFn, WasmerMemoryDataFn>(
-            'wasmer_memory_data');
-    _memory_data_length = _lib.lookupFunction<NativeWasmerMemoryDataLengthFn,
-        WasmerMemoryDataLengthFn>('wasmer_memory_data_length');
+            'wasm_memory_data');
+    _memory_data_size = _lib.lookupFunction<NativeWasmerMemoryDataSizeFn,
+        WasmerMemoryDataSizeFn>('wasm_memory_data_size');
+    _memory_delete =
+        _lib.lookupFunction<NativeWasmerMemoryDeleteFn, WasmerMemoryDeleteFn>(
+            'wasm_memory_delete');
+    _memory_grow =
+        _lib.lookupFunction<NativeWasmerMemoryGrowFn, WasmerMemoryGrowFn>(
+            'wasm_memory_grow');
+    _memory_new =
+        _lib.lookupFunction<NativeWasmerMemoryNewFn, WasmerMemoryNewFn>(
+            'wasm_memory_new');
+    _memory_size =
+        _lib.lookupFunction<NativeWasmerMemorySizeFn, WasmerMemorySizeFn>(
+            'wasm_memory_size');
+    _memorytype_delete = _lib.lookupFunction<NativeWasmerMemorytypeDeleteFn,
+        WasmerMemorytypeDeleteFn>('wasm_memorytype_delete');
+    _memorytype_new =
+        _lib.lookupFunction<NativeWasmerMemorytypeNewFn, WasmerMemorytypeNewFn>(
+            'wasm_memorytype_new');
+    _module_delete =
+        _lib.lookupFunction<NativeWasmerModuleDeleteFn, WasmerModuleDeleteFn>(
+            'wasm_module_delete');
+    _module_exports =
+        _lib.lookupFunction<NativeWasmerModuleExportsFn, WasmerModuleExportsFn>(
+            'wasm_module_exports');
+    _module_imports =
+        _lib.lookupFunction<NativeWasmerModuleImportsFn, WasmerModuleImportsFn>(
+            'wasm_module_imports');
+    _module_new =
+        _lib.lookupFunction<NativeWasmerModuleNewFn, WasmerModuleNewFn>(
+            'wasm_module_new');
+    _store_delete =
+        _lib.lookupFunction<NativeWasmerStoreDeleteFn, WasmerStoreDeleteFn>(
+            'wasm_store_delete');
+    _store_new = _lib.lookupFunction<NativeWasmerStoreNewFn, WasmerStoreNewFn>(
+        'wasm_store_new');
+    _trap_delete =
+        _lib.lookupFunction<NativeWasmerTrapDeleteFn, WasmerTrapDeleteFn>(
+            'wasm_trap_delete');
+    _trap_message =
+        _lib.lookupFunction<NativeWasmerTrapMessageFn, WasmerTrapMessageFn>(
+            'wasm_trap_message');
+    _trap_new = _lib.lookupFunction<NativeWasmerTrapNewFn, WasmerTrapNewFn>(
+        'wasm_trap_new');
+    _valtype_delete =
+        _lib.lookupFunction<NativeWasmerValtypeDeleteFn, WasmerValtypeDeleteFn>(
+            'wasm_valtype_delete');
+    _valtype_kind =
+        _lib.lookupFunction<NativeWasmerValtypeKindFn, WasmerValtypeKindFn>(
+            'wasm_valtype_kind');
+    _valtype_vec_delete = _lib.lookupFunction<NativeWasmerValtypeVecDeleteFn,
+        WasmerValtypeVecDeleteFn>('wasm_valtype_vec_delete');
+    _valtype_vec_new =
+        _lib.lookupFunction<NativeWasmerValtypeVecNewFn, WasmerValtypeVecNewFn>(
+            'wasm_valtype_vec_new');
+    _valtype_vec_new_empty = _lib.lookupFunction<
+        NativeWasmerValtypeVecNewEmptyFn,
+        WasmerValtypeVecNewEmptyFn>('wasm_valtype_vec_new_empty');
+    _valtype_vec_new_uninitialized = _lib.lookupFunction<
+            NativeWasmerValtypeVecNewUninitializedFn,
+            WasmerValtypeVecNewUninitializedFn>(
+        'wasm_valtype_vec_new_uninitialized');
+    _wasmer_last_error_length = _lib.lookupFunction<
+        NativeWasmerWasmerLastErrorLengthFn,
+        WasmerWasmerLastErrorLengthFn>('wasmer_last_error_length');
+    _wasmer_last_error_message = _lib.lookupFunction<
+        NativeWasmerWasmerLastErrorMessageFn,
+        WasmerWasmerLastErrorMessageFn>('wasmer_last_error_message');
+
+    _engine = _engine_new();
   }
 
-  Pointer<WasmerModule> compile(Uint8List data) {
+  Pointer<WasmerStore> newStore() {
+    return _store_new(_engine);
+  }
+
+  Pointer<WasmerModule> compile(Pointer<WasmerStore> store, Uint8List data) {
     var dataPtr = allocate<Uint8>(count: data.length);
     for (int i = 0; i < data.length; ++i) {
       dataPtr[i] = data[i];
     }
+    var dataVec = allocate<WasmerByteVec>();
+    dataVec.ref.data = dataPtr;
+    dataVec.ref.length = data.length;
 
-    var modulePtrPtr = allocate<Pointer<WasmerModule>>();
-    int result = _compile(modulePtrPtr, dataPtr, data.length);
-    Pointer<WasmerModule> modulePtr = modulePtrPtr.value;
+    var modulePtr = _module_new(store, dataVec);
 
-    free(modulePtrPtr);
     free(dataPtr);
+    free(dataVec);
 
-    if (result != WasmerResultOk) {
-      throw Exception("Wasm module compile failed");
-    }
-
-    return modulePtr;
-  }
-
-  String _callStringWrapperFunction(Function fn, dynamic arg) {
-    var strPtr = allocate<WasmerByteArray>();
-    fn(arg, strPtr);
-    var str = strPtr.ref.string;
-    free(strPtr);
-    return str;
+    return _checkNotEqual(modulePtr, nullptr, "Wasm module compile failed.");
   }
 
   List<WasmExportDescriptor> exportDescriptors(Pointer<WasmerModule> module) {
-    var exportsPtrPtr = allocate<Pointer<WasmerExportDescriptors>>();
-    _export_descriptors(module, exportsPtrPtr);
-    Pointer<WasmerExportDescriptors> exportsPtr = exportsPtrPtr.value;
-    free(exportsPtrPtr);
-    var n = _export_descriptors_len(exportsPtr);
+    var exportsVec = allocate<WasmerExporttypeVec>();
+    _module_exports(module, exportsVec);
     var exps = <WasmExportDescriptor>[];
-    for (var i = 0; i < n; ++i) {
-      var exp = _export_descriptors_get(exportsPtr, i);
-      exps.add(WasmExportDescriptor(_export_descriptor_kind(exp),
-          _callStringWrapperFunction(_export_descriptor_name_ptr, exp)));
+    for (var i = 0; i < exportsVec.ref.length; ++i) {
+      var exp = exportsVec.ref.data[i];
+      var extern = _exporttype_type(exp);
+      var kind = _externtype_kind(extern);
+      var fnType = kind == WasmerExternKindFunction
+          ? _externtype_as_functype(extern)
+          : nullptr;
+      exps.add(WasmExportDescriptor(
+          kind, _exporttype_name(exp).ref.toString(), fnType));
     }
-    _export_descriptors_destroy(exportsPtr);
+    free(exportsVec);
     return exps;
   }
 
   List<WasmImportDescriptor> importDescriptors(Pointer<WasmerModule> module) {
-    var importsPtrPtr = allocate<Pointer<WasmerImportDescriptors>>();
-    _import_descriptors(module, importsPtrPtr);
-    Pointer<WasmerImportDescriptors> importsPtr = importsPtrPtr.value;
-    free(importsPtrPtr);
-
-    var n = _import_descriptors_len(importsPtr);
+    var importsVec = allocate<WasmerImporttypeVec>();
+    _module_imports(module, importsVec);
     var imps = <WasmImportDescriptor>[];
-    for (var i = 0; i < n; ++i) {
-      var imp = _import_descriptors_get(importsPtr, i);
+    for (var i = 0; i < importsVec.ref.length; ++i) {
+      var imp = importsVec.ref.data[i];
+      var extern = _importtype_type(imp);
+      var kind = _externtype_kind(extern);
+      var fnType = kind == WasmerExternKindFunction
+          ? _externtype_as_functype(extern)
+          : nullptr;
       imps.add(WasmImportDescriptor(
-          _import_descriptor_kind(imp),
-          _callStringWrapperFunction(_import_descriptor_module_name_ptr, imp),
-          _callStringWrapperFunction(_import_descriptor_name_ptr, imp)));
+          kind,
+          _importtype_module(imp).ref.toString(),
+          _importtype_name(imp).ref.toString(),
+          fnType));
     }
-    _import_descriptors_destroy(importsPtr);
+    free(importsVec);
     return imps;
   }
 
-  Pointer<WasmerInstance> instantiate(Pointer<WasmerModule> module,
-      Pointer<WasmerImport> imports, int numImports) {
-    var instancePtrPtr = allocate<Pointer<WasmerInstance>>();
-    int result = _instantiate(module, instancePtrPtr, imports, numImports);
-    Pointer<WasmerInstance> instancePtr = instancePtrPtr.value;
-    free(instancePtrPtr);
-
-    if (result != WasmerResultOk) {
-      throw Exception("Wasm module instantiation failed");
+  void maybeThrowTrap(Pointer<WasmerTrap> trap, String source) {
+    if (trap != nullptr) {
+      var stashedException = traps[trap.address];
+      if (stashedException != null) {
+        traps.remove(stashedException);
+        throw stashedException;
+      } else {
+        var trapMessage = allocate<WasmerByteVec>();
+        _trap_message(trap, trapMessage);
+        var message = "Wasm trap when calling $source: ${trapMessage.ref}";
+        free(trapMessage.ref.data);
+        free(trapMessage);
+        throw Exception(message);
+      }
     }
-
-    return instancePtr;
   }
 
-  List<Pointer<WasmerExport>> exports(Pointer<WasmerInstance> instancePtr) {
-    var exportsPtrPtr = allocate<Pointer<WasmerExports>>();
-    _instance_exports(instancePtr, exportsPtrPtr);
-    Pointer<WasmerExports> exportsPtr = exportsPtrPtr.value;
-    free(exportsPtrPtr);
-
-    var n = _exports_len(exportsPtr);
-    var exps = <Pointer<WasmerExport>>[];
-    for (var i = 0; i < n; ++i) {
-      exps.add(_exports_get(exportsPtr, i));
-    }
-    return exps;
+  Pointer<WasmerInstance> instantiate(Pointer<WasmerStore> store,
+      Pointer<WasmerModule> module, Pointer<WasmerExternVec> imports) {
+    var trap = allocate<Pointer<WasmerTrap>>();
+    trap.value = nullptr;
+    var inst = _instance_new(store, module, imports, trap);
+    maybeThrowTrap(trap.value, "module initialization function");
+    free(trap);
+    return _checkNotEqual(inst, nullptr, "Wasm module instantiation failed.");
   }
 
-  int exportKind(Pointer<WasmerExport> export) {
-    return _export_kind(export);
+  Pointer<WasmerExternVec> exports(Pointer<WasmerInstance> instancePtr) {
+    var exports = allocate<WasmerExternVec>();
+    _instance_exports(instancePtr, exports);
+    return exports;
   }
 
-  String exportName(Pointer<WasmerExport> export) {
-    return _callStringWrapperFunction(_export_name_ptr, export);
+  int externKind(Pointer<WasmerExtern> extern) {
+    return _extern_kind(extern);
   }
 
-  Pointer<WasmerExportFunc> exportToFunction(Pointer<WasmerExport> export) {
-    return _export_to_func(export);
+  Pointer<WasmerFunc> externToFunction(Pointer<WasmerExtern> extern) {
+    return _extern_as_func(extern);
   }
 
-  List<int> getArgTypes(Pointer<WasmerExportFunc> func) {
+  Pointer<WasmerExtern> functionToExtern(Pointer<WasmerFunc> func) {
+    return _func_as_extern(func);
+  }
+
+  List<int> getArgTypes(Pointer<WasmerFunctype> funcType) {
     var types = <int>[];
-    var nPtr = allocate<Uint32>();
-    var result = _export_func_params_arity(func, nPtr);
-    if (result != WasmerResultOk) {
-      free(nPtr);
-      throw Exception("Failed to get number of WASM function args");
+    var args = _functype_params(funcType);
+    for (var i = 0; i < args.ref.length; ++i) {
+      types.add(_valtype_kind(args.ref.data[i]));
     }
-    var n = nPtr.value;
-    free(nPtr);
-    var argsPtr = allocate<Uint32>(count: n);
-    result = _export_func_params(func, argsPtr, n);
-    if (result != WasmerResultOk) {
-      free(argsPtr);
-      throw Exception("Failed to get WASM function args");
-    }
-    for (var i = 0; i < n; ++i) {
-      types.add(argsPtr[i]);
-    }
-    free(argsPtr);
     return types;
   }
 
-  int getReturnType(Pointer<WasmerExportFunc> func) {
-    var nPtr = allocate<Uint32>();
-    var result = _export_func_returns_arity(func, nPtr);
-    if (result != WasmerResultOk) {
-      free(nPtr);
-      throw Exception("Failed to get number of WASM function returns");
-    }
-    var n = nPtr.value;
-    free(nPtr);
-    if (n == 0) {
-      return WasmerValueTagVoid;
-    } else if (n > 1) {
+  int getReturnType(Pointer<WasmerFunctype> funcType) {
+    var rets = _functype_results(funcType);
+    if (rets.ref.length == 0) {
+      return WasmerValKindVoid;
+    } else if (rets.ref.length > 1) {
       throw Exception("Multiple return values are not supported");
     }
-    var returnsPtr = allocate<Uint32>();
-    result = _export_func_returns(func, returnsPtr, 1);
-    if (result != WasmerResultOk) {
-      free(returnsPtr);
-      throw Exception("Failed to get WASM function args");
-    }
-    var type = returnsPtr.value;
-    free(returnsPtr);
-    return type;
+    return _valtype_kind(rets.ref.data[0]);
   }
 
-  void call(Pointer<WasmerExportFunc> func, Pointer<WasmerValue> args,
-      int numArgs, Pointer<WasmerValue> results, int numResults) {
-    var result = _export_func_call(func, args, numArgs, results, numArgs);
-    if (result != WasmerResultOk) {
-      throw Exception("Failed to call WASM function");
-    }
+  void call(Pointer<WasmerFunc> func, Pointer<WasmerValVec> args,
+      Pointer<WasmerValVec> results, String source) {
+    maybeThrowTrap(_func_call(func, args, results), source);
   }
 
-  Pointer<WasmerMemory> exportToMemory(Pointer<WasmerExport> export) {
-    var memPtrPtr = allocate<Pointer<WasmerMemory>>();
-    var result = _export_to_memory(export, memPtrPtr);
-    if (result != WasmerResultOk) {
-      free(memPtrPtr);
-      throw Exception("Failed to get exported memory");
-    }
-    Pointer<WasmerMemory> memPtr = memPtrPtr.value;
-    free(memPtrPtr);
-    return memPtr;
+  Pointer<WasmerMemory> externToMemory(Pointer<WasmerExtern> extern) {
+    return _extern_as_memory(extern);
   }
 
-  Pointer<WasmerMemory> newMemory(int pages, int? maxPages) {
-    var memPtrPtr = allocate<Pointer<WasmerMemory>>();
+  Pointer<WasmerExtern> memoryToExtern(Pointer<WasmerMemory> memory) {
+    return _memory_as_extern(memory);
+  }
+
+  Pointer<WasmerMemory> newMemory(
+      Pointer<WasmerStore> store, int pages, int? maxPages) {
     var limPtr = allocate<WasmerLimits>();
     limPtr.ref.min = pages;
-    limPtr.ref.has_max = maxPages != null ? 1 : 0;
-    limPtr.ref.max = maxPages ?? 0;
-    var result = _memory_new_ptr(memPtrPtr, limPtr);
+    limPtr.ref.max = maxPages ?? wasm_limits_max_default;
+    var memType = _memorytype_new(limPtr);
     free(limPtr);
-    if (result != WasmerResultOk) {
-      free(memPtrPtr);
-      throw Exception("Failed to create memory");
-    }
-    Pointer<WasmerMemory> memPtr = memPtrPtr.value;
-    free(memPtrPtr);
-    return memPtr;
+    return _checkNotEqual(
+        _memory_new(store, memType), nullptr, "Failed to create memory.");
   }
 
   void growMemory(Pointer<WasmerMemory> memory, int deltaPages) {
-    var result = _memory_grow(memory, deltaPages);
-    if (result != WasmerResultOk) {
-      throw Exception("Failed to grow memory");
-    }
+    _checkNotEqual(
+        _memory_grow(memory, deltaPages), 0, "Failed to grow memory.");
   }
 
   int memoryLength(Pointer<WasmerMemory> memory) {
-    return _memory_length(memory);
+    return _memory_size(memory);
   }
 
   Uint8List memoryView(Pointer<WasmerMemory> memory) {
-    return _memory_data(memory).asTypedList(_memory_data_length(memory));
+    return _memory_data(memory).asTypedList(_memory_data_size(memory));
   }
+
+  Pointer<WasmerFunc> newFunc(
+      Pointer<WasmerStore> store,
+      Pointer<WasmerFunctype> funcType,
+      Pointer func,
+      Pointer env,
+      Pointer finalizer) {
+    return _func_new_with_env(
+        store, funcType, func.cast(), env.cast(), finalizer.cast());
+  }
+
+  Pointer<WasmerTrap> newTrap(Pointer<WasmerStore> store, dynamic exception) {
+    var msg = allocate<WasmerByteVec>();
+    msg.ref.data = allocate<Uint8>();
+    msg.ref.data[0] = 0;
+    msg.ref.length = 0;
+    var trap = _trap_new(store, msg);
+    traps[trap.address] = exception;
+    free(msg.ref.data);
+    free(msg);
+    return _checkNotEqual(trap, nullptr, "Failed to create trap.");
+  }
+
+  Pointer<WasmerWasiConfig> newWasiConfig() {
+    var name = allocate<Uint8>();
+    name[0] = 0;
+    var config = _wasi_config_new(name);
+    free(name);
+    return _checkNotEqual(config, nullptr, "Failed to create WASI config.");
+  }
+
+  void captureWasiStdout(Pointer<WasmerWasiConfig> config) {
+    _wasi_config_inherit_stdout(config);
+  }
+
+  void captureWasiStderr(Pointer<WasmerWasiConfig> config) {
+    _wasi_config_inherit_stderr(config);
+  }
+
+  Pointer<WasmerWasiEnv> newWasiEnv(Pointer<WasmerWasiConfig> config) {
+    return _checkNotEqual(
+        _wasi_env_new(config), nullptr, "Failed to create WASI environment.");
+  }
+
+  void wasiEnvSetMemory(
+      Pointer<WasmerWasiEnv> env, Pointer<WasmerMemory> memory) {
+    _wasi_env_set_memory(env, memory);
+  }
+
+  void getWasiImports(Pointer<WasmerStore> store, Pointer<WasmerModule> mod,
+      Pointer<WasmerWasiEnv> env, Pointer<WasmerExternVec> imports) {
+    _checkNotEqual(_wasi_get_imports(store, mod, env, imports), 0,
+        "Failed to fill WASI imports.");
+  }
+
+  Stream<List<int>> getWasiStdoutStream(Pointer<WasmerWasiEnv> env) {
+    return Stream.fromIterable(_WasiStreamIterable(env, _wasi_env_read_stdout));
+  }
+
+  Stream<List<int>> getWasiStderrStream(Pointer<WasmerWasiEnv> env) {
+    return Stream.fromIterable(_WasiStreamIterable(env, _wasi_env_read_stderr));
+  }
+
+  String _getLastError() {
+    var length = _wasmer_last_error_length();
+    var buf = allocate<Uint8>(count: length);
+    _wasmer_last_error_message(buf, length);
+    String message = utf8.decode(buf.asTypedList(length));
+    free(buf);
+    return message;
+  }
+
+  T _checkNotEqual<T>(T x, T y, String errorMessage) {
+    if (x == y) {
+      throw Exception("$errorMessage\n${_getLastError()}");
+    }
+    return x;
+  }
+
+  static String getSignatureString(
+      String name, List<int> argTypes, int returnType) {
+    return "${wasmerValKindName(returnType)} $name" +
+        "(${argTypes.map(wasmerValKindName).join(", ")})";
+  }
+}
+
+class _WasiStreamIterator implements Iterator<List<int>> {
+  static final int _bufferLength = 1024;
+  Pointer<WasmerWasiEnv> _env;
+  Function _reader;
+  Pointer<Uint8> _buf = allocate<Uint8>(count: _bufferLength);
+  int _length = 0;
+  _WasiStreamIterator(this._env, this._reader) {}
+
+  bool moveNext() {
+    _length = _reader(_env, _buf, _bufferLength);
+    return true;
+  }
+
+  List<int> get current => _buf.asTypedList(_length);
+}
+
+class _WasiStreamIterable extends Iterable<List<int>> {
+  Pointer<WasmerWasiEnv> _env;
+  Function _reader;
+  _WasiStreamIterable(this._env, this._reader) {}
+  @override
+  Iterator<List<int>> get iterator => _WasiStreamIterator(_env, _reader);
 }
diff --git a/pkg/wasm/lib/src/tools/generate_ffi_boilerplate.py b/pkg/wasm/lib/src/tools/generate_ffi_boilerplate.py
new file mode 100755
index 0000000..6251ee9
--- /dev/null
+++ b/pkg/wasm/lib/src/tools/generate_ffi_boilerplate.py
@@ -0,0 +1,373 @@
+#!/usr/bin/env python3
+#
+# Copyright (c) 2020, 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.
+
+# This is an ad-hoc script that generates FFI boilderplate for the Wasmer API.
+# The relevant functions from wasm.h have been copied below, and are parsed to
+# figure out the FFI boilerplate. The results are inserted into
+# wasmer_api_template.dart and runtime_template.dart to generate wasmer_api.dart
+# and runtime.dart.
+
+# Usage:
+# generate_ffi_boilerplate.py && dartfmt -w ../runtime.dart ../wasmer_api.dart
+
+import os
+import re
+
+predefTypes = {}
+opaqueTypes = set()
+vecTypes = {}
+fns = []
+unusedFns = set()
+
+
+def camel(t):
+    return ''.join([s[0].upper() + s[1:] for s in t.split('_')])
+
+
+def ptrWrap(t, n):
+    for i in range(n):
+        t = 'Pointer<%s>' % t
+    return t
+
+
+def removePrefix(t):
+    assert (t.startswith('wasm_') or t.startswith('wasi_') or
+            t.startswith('wasmer_'))
+    return t[(5 if t.startswith('wasm_') else 0):]
+
+
+def addPrefix(t):
+    if t.startswith('wasi_') or t.startswith('wasmer_'):
+        return t
+    return 'wasm_' + t
+
+
+def getDartType(t, i):
+    if t in predefTypes:
+        return predefTypes[t][i]
+    assert (t.endswith('_t'))
+    return 'Wasmer' + camel(removePrefix(t[:-2]))
+
+
+def dartArgType(a, i):
+    n, t = a
+    j = i if n == 0 else 0
+    return ptrWrap(getDartType(t, j), n)
+
+
+def dartFnType(r, a, i):
+    return '%s Function(%s)' % (dartArgType(r, i), ', '.join(
+        [dartArgType(t, i) for t in a]))
+
+
+def dartFnTypeName(n):
+    return camel(removePrefix(n))
+
+
+def dartFnMembName(n):
+    return '_' + removePrefix(n)
+
+
+def nativeTypeToFfi(n):
+    return getDartType(n, 0)
+
+
+def nativeTypeToDart(n):
+    return getDartType(n, 1)
+
+
+def getFns():
+    for name, retType, args in sorted(fns):
+        if name not in unusedFns:
+            yield name, retType, args
+
+
+opaqueTypeTemplate = '''// %s_t
+class Wasmer%s extends Struct {}'''
+
+vecTypeTemplate = '''// %s_vec_t
+class Wasmer%sVec extends Struct {
+  @Uint64()
+  external int length;
+
+  external Pointer<%s> data;
+
+  %s
+}'''
+
+byteVecToStringTemplate = '''
+  Uint8List get list => data.asTypedList(length);
+  String toString() => utf8.decode(list);
+'''
+
+fnApiTemplate = '''
+// %s
+typedef NativeWasmer%sFn = %s;
+typedef Wasmer%sFn = %s;'''
+
+
+def getWasmerApi():
+    return ('\n\n'.join([
+        opaqueTypeTemplate % (addPrefix(t), camel(t))
+        for t in sorted(opaqueTypes)
+    ]) + '\n\n' + '\n\n'.join([
+        vecTypeTemplate % (addPrefix(t), camel(t),
+                           ('Pointer<%s>' if ptr else '%s') % nativeTypeToFfi(
+                               '%s_t' % addPrefix(t)),
+                           (byteVecToStringTemplate if t == 'byte' else ''))
+        for t, ptr in sorted(vecTypes.items())
+    ]) + '\n' + '\n'.join([
+        fnApiTemplate %
+        (name, dartFnTypeName(name), dartFnType(retType, args, 0),
+         dartFnTypeName(name), dartFnType(retType, args, 1))
+        for name, retType, args in getFns()
+    ]))
+
+
+def getRuntimeMemb():
+    return '\n'.join([
+        "  late Wasmer%sFn %s;" % (dartFnTypeName(name), dartFnMembName(name))
+        for name, _, _ in getFns()
+    ])
+
+
+def getRuntimeLoad():
+    return '\n'.join([
+        "    %s = _lib.lookupFunction<NativeWasmer%sFn, Wasmer%sFn>('%s');" %
+        (dartFnMembName(name), dartFnTypeName(name), dartFnTypeName(name), name)
+        for name, _, _ in getFns()
+    ])
+
+
+def predefinedType(nativeType, ffiType, dartType):
+    predefTypes[nativeType] = (ffiType, dartType)
+
+
+def match(r, s):
+    return r.fullmatch(s).groups()
+
+
+reReplace = [(re.compile('\\b%s\\b' % k), v) for k, v in [
+    ('const', ''),
+    ('own', ''),
+    ('WASM_API_EXTERN', ''),
+    ('wasm_name_t', 'wasm_byte_vec_t'),
+    ('wasm_message_t', 'wasm_byte_vec_t'),
+    ('wasm_memory_pages_t', 'uint32_t'),
+    ('wasm_externkind_t', 'uint8_t'),
+    ('wasm_valkind_t', 'uint8_t'),
+]]
+reWord = re.compile(r'\b\w+\b')
+
+
+def parseType(s):
+    for r, t in reReplace:
+        s = r.sub(t, s)
+    s = s.strip()
+    numWords = len(reWord.findall(s))
+    assert (numWords == 1 or numWords == 2)
+    if numWords == 2:
+        i = 0
+
+        def lastWordRepl(m):
+            nonlocal i
+            i += 1
+            return '' if i == numWords else m.group(0)
+
+        s = reWord.sub(lastWordRepl, s)
+    numPtr = 0
+    while True:
+        s = s.strip()
+        if s.endswith('*'):
+            s = s[:-1]
+        elif s.endswith('[]'):
+            s = s[:-2]
+        else:
+            break
+        numPtr += 1
+    return (numPtr, s)
+
+
+reFnSig = re.compile(r'(.*) ([^ ]*)\((.*)\);?')
+
+
+def addFn(sig):
+    ret, name, argpack = match(reFnSig, sig)
+    retType = parseType(ret)
+    args = [parseType(a) for a in argpack.split(',') if len(a.strip()) > 0]
+    for _, t in args + [retType]:
+        if t not in predefTypes and removePrefix(
+                t[:-2]) not in opaqueTypes and removePrefix(
+                    t[:-6]) not in vecTypes:
+            print('Missing type: ' + t)
+    fns.append((name, retType, args))
+
+
+def declareOwn(name):
+    opaqueTypes.add(name)
+    n = addPrefix(name)
+    addFn('void %s_delete(%s_t*)' % (n, n))
+
+
+def declareVec(name, storePtr):
+    vecTypes[name] = storePtr
+    n = addPrefix(name)
+    addFn('void %s_vec_new_empty(%s_vec_t* out)' % (n, n))
+    addFn('void %s_vec_new_uninitialized(%s_vec_t* out, size_t)' % (n, n))
+    addFn('void %s_vec_new(%s_vec_t* out, size_t, %s_t %s[])' %
+          (n, n, n, '*' if storePtr else ''))
+    addFn('void %s_vec_copy(%s_vec_t* out, const %s_vec_t*)' % (n, n, n))
+    addFn('void %s_vec_delete(%s_vec_t*)' % (n, n))
+
+
+def declareType(name, withCopy=True):
+    declareOwn(name)
+    declareVec(name, True)
+    if withCopy:
+        n = addPrefix(name)
+        addFn('%s_t* %s_copy(%s_t*)' % (n, n, n))
+
+
+predefinedType('void', 'Void', 'void')
+predefinedType('bool', 'Uint8', 'int')
+predefinedType('int', 'Int64', 'int')
+predefinedType('byte_t', 'Uint8', 'int')
+predefinedType('wasm_byte_t', 'Uint8', 'int')
+predefinedType('uint8_t', 'Uint8', 'int')
+predefinedType('uint16_t', 'Uint16', 'int')
+predefinedType('uint32_t', 'Uint32', 'int')
+predefinedType('uint64_t', 'Uint64', 'int')
+predefinedType('size_t', 'Uint64', 'int')
+predefinedType('uintptr_t', 'Uint64', 'int')
+predefinedType('intptr_t', 'Int64', 'int')
+predefinedType('int8_t', 'Int8', 'int')
+predefinedType('int16_t', 'Int16', 'int')
+predefinedType('int32_t', 'Int32', 'int')
+predefinedType('int64_t', 'Int64', 'int')
+predefinedType('float32_t', 'Float32', 'double')
+predefinedType('float64_t', 'Float64', 'double')
+predefinedType('wasm_limits_t', 'WasmerLimits', 'WasmerLimits')
+predefinedType('wasm_val_t', 'WasmerVal', 'WasmerVal')
+
+declareOwn('engine')
+declareOwn('store')
+declareOwn('wasi_config')
+declareOwn('wasi_env')
+declareVec('byte', False)
+declareVec('val', False)
+declareType('importtype')
+declareType('exporttype')
+declareType('valtype')
+declareType('extern', False)
+
+# These are actually DECLARE_TYPE, but we don't need the vec or copy stuff.
+declareOwn('memorytype')
+declareOwn('externtype')
+declareOwn('functype')
+
+# These are actually DECLARE_SHARABLE_REF, but we don't need the ref stuff.
+declareOwn('module')
+
+# These are actually DECLARE_REF, but we don't need the ref stuff.
+declareOwn('memory')
+declareOwn('trap')
+declareOwn('instance')
+declareOwn('func')
+
+rawFns = '''
+WASM_API_EXTERN own wasm_engine_t* wasm_engine_new();
+WASM_API_EXTERN own wasm_store_t* wasm_store_new(wasm_engine_t*);
+WASM_API_EXTERN own wasm_memorytype_t* wasm_memorytype_new(const wasm_limits_t*);
+WASM_API_EXTERN own wasm_module_t* wasm_module_new(wasm_store_t*, const wasm_byte_vec_t* binary);
+WASM_API_EXTERN void wasm_module_imports(const wasm_module_t*, own wasm_importtype_vec_t* out);
+WASM_API_EXTERN const wasm_name_t* wasm_importtype_module(const wasm_importtype_t*);
+WASM_API_EXTERN const wasm_name_t* wasm_importtype_name(const wasm_importtype_t*);
+WASM_API_EXTERN const wasm_externtype_t* wasm_importtype_type(const wasm_importtype_t*);
+WASM_API_EXTERN wasm_functype_t* wasm_externtype_as_functype(wasm_externtype_t*);
+WASM_API_EXTERN void wasm_module_exports(const wasm_module_t*, own wasm_exporttype_vec_t* out);
+WASM_API_EXTERN const wasm_name_t* wasm_exporttype_name(const wasm_exporttype_t*);
+WASM_API_EXTERN const wasm_externtype_t* wasm_exporttype_type(const wasm_exporttype_t*);
+WASM_API_EXTERN wasm_externkind_t wasm_externtype_kind(const wasm_externtype_t*);
+WASM_API_EXTERN own wasm_instance_t* wasm_instance_new(wasm_store_t*, const wasm_module_t*, const wasm_extern_vec_t* imports, own wasm_trap_t**);
+WASM_API_EXTERN void wasm_instance_exports(const wasm_instance_t*, own wasm_extern_vec_t* out);
+WASM_API_EXTERN own wasm_memory_t* wasm_memory_new(wasm_store_t*, const wasm_memorytype_t*);
+WASM_API_EXTERN byte_t* wasm_memory_data(wasm_memory_t*);
+WASM_API_EXTERN size_t wasm_memory_data_size(const wasm_memory_t*);
+WASM_API_EXTERN wasm_memory_pages_t wasm_memory_size(const wasm_memory_t*);
+WASM_API_EXTERN bool wasm_memory_grow(wasm_memory_t*, wasm_memory_pages_t delta);
+WASM_API_EXTERN wasm_externkind_t wasm_extern_kind(const wasm_extern_t*);
+WASM_API_EXTERN wasm_func_t* wasm_extern_as_func(wasm_extern_t*);
+WASM_API_EXTERN wasm_extern_t* wasm_func_as_extern(wasm_func_t*);
+WASM_API_EXTERN wasm_memory_t* wasm_extern_as_memory(wasm_extern_t*);
+WASM_API_EXTERN wasm_extern_t* wasm_memory_as_extern(wasm_memory_t*);
+WASM_API_EXTERN const wasm_valtype_vec_t* wasm_functype_params(const wasm_functype_t*);
+WASM_API_EXTERN const wasm_valtype_vec_t* wasm_functype_results(const wasm_functype_t*);
+WASM_API_EXTERN own wasm_func_t* wasm_func_new_with_env( wasm_store_t*, const wasm_functype_t* type, void* fn, void* env, void *finalizer);
+WASM_API_EXTERN own wasm_trap_t* wasm_func_call(const wasm_func_t*, const wasm_val_vec_t* args, wasm_val_vec_t* results);
+WASM_API_EXTERN own wasm_trap_t* wasm_trap_new(wasm_store_t* store, const wasm_message_t*);
+WASM_API_EXTERN void wasm_trap_message(const wasm_trap_t*, own wasm_message_t* out);
+WASM_API_EXTERN wasm_valkind_t wasm_valtype_kind(const wasm_valtype_t*);
+wasi_config_t* wasi_config_new(const uint8_t* program_name);
+wasi_env_t* wasi_env_new(wasi_config_t* config);
+bool wasi_get_imports(const wasm_store_t* store, const wasm_module_t* module, const wasi_env_t* wasi_env, wasm_extern_vec_t* imports);
+int wasmer_last_error_message(uint8_t* buffer, int length);
+int wasmer_last_error_length();
+void wasi_env_set_memory(wasi_env_t* env, const wasm_memory_t* memory);
+void wasi_config_inherit_stdout(wasi_config_t* config);
+void wasi_config_inherit_stderr(wasi_config_t* config);
+intptr_t wasi_env_read_stderr(wasi_env_t* env, uint8_t* buffer, uintptr_t buffer_len);
+intptr_t wasi_env_read_stdout(wasi_env_t* env, uint8_t* buffer, uintptr_t buffer_len);
+'''
+for f in rawFns.split('\n'):
+    if len(f.strip()) > 0:
+        addFn(f)
+
+unusedFns = {
+    'wasm_byte_vec_copy',
+    'wasm_exporttype_delete',
+    'wasm_exporttype_copy',
+    'wasm_exporttype_vec_copy',
+    'wasm_extern_vec_copy',
+    'wasm_importtype_delete',
+    'wasm_importtype_copy',
+    'wasm_importtype_vec_copy',
+    'wasm_val_vec_copy',
+    'wasm_val_vec_delete',
+    'wasm_val_vec_new',
+    'wasm_val_vec_new_empty',
+    'wasm_val_vec_new_uninitialized',
+    'wasm_valtype_copy',
+    'wasm_valtype_vec_copy',
+    'wasi_config_delete',
+}
+
+genDoc = '''// This file has been automatically generated. Please do not edit it manually.
+// To regenerate the file, use the following command
+// "generate_ffi_boilerplate.py".'''
+
+thisDir = os.path.dirname(os.path.abspath(__file__))
+
+
+def readFile(filename):
+    with open(os.path.abspath(os.path.join(thisDir, filename)), 'r') as f:
+        return f.read()
+
+
+def writeFile(filename, content):
+    with open(os.path.abspath(os.path.join(thisDir, '..', filename)), 'w') as f:
+        f.write(content)
+
+
+wasmerApiText = readFile('wasmer_api_template.dart')
+wasmerApiText = wasmerApiText.replace('/* <WASMER_API> */', getWasmerApi())
+wasmerApiText = wasmerApiText.replace('/* <GEN_DOC> */', genDoc)
+writeFile('wasmer_api.dart', wasmerApiText)
+
+runtimeText = readFile('runtime_template.dart')
+runtimeText = runtimeText.replace('/* <RUNTIME_MEMB> */', getRuntimeMemb())
+runtimeText = runtimeText.replace('/* <RUNTIME_LOAD> */', getRuntimeLoad())
+runtimeText = runtimeText.replace('/* <GEN_DOC> */', genDoc)
+writeFile('runtime.dart', runtimeText)
diff --git a/pkg/wasm/lib/src/tools/runtime_template.dart b/pkg/wasm/lib/src/tools/runtime_template.dart
new file mode 100644
index 0000000..1f53a43
--- /dev/null
+++ b/pkg/wasm/lib/src/tools/runtime_template.dart
@@ -0,0 +1,378 @@
+// Copyright (c) 2020, 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.
+
+/* <GEN_DOC> */
+
+import 'dart:async';
+import 'dart:convert';
+import 'dart:ffi';
+import 'dart:io';
+import 'dart:typed_data';
+import 'package:ffi/ffi.dart';
+import 'package:path/path.dart' as path;
+import 'wasmer_api.dart';
+
+class WasmImportDescriptor {
+  int kind;
+  String moduleName;
+  String name;
+  Pointer<WasmerFunctype> funcType;
+  WasmImportDescriptor(this.kind, this.moduleName, this.name, this.funcType);
+
+  String toString() {
+    var kindName = wasmerExternKindName(kind);
+    if (kind == WasmerExternKindFunction) {
+      var runtime = WasmRuntime();
+      var sig = WasmRuntime.getSignatureString("${moduleName}::${name}",
+          runtime.getArgTypes(funcType), runtime.getReturnType(funcType));
+      return "$kindName: $sig";
+    } else {
+      return "$kindName: ${moduleName}::${name}";
+    }
+  }
+}
+
+class WasmExportDescriptor {
+  int kind;
+  String name;
+  Pointer<WasmerFunctype> funcType;
+  WasmExportDescriptor(this.kind, this.name, this.funcType);
+
+  String toString() {
+    var kindName = wasmerExternKindName(kind);
+    if (kind == WasmerExternKindFunction) {
+      var runtime = WasmRuntime();
+      var sig = WasmRuntime.getSignatureString(
+          name, runtime.getArgTypes(funcType), runtime.getReturnType(funcType));
+      return "$kindName: $sig";
+    } else {
+      return "$kindName: ${name}";
+    }
+  }
+}
+
+class WasmRuntime {
+  static WasmRuntime? _inst;
+
+  DynamicLibrary _lib;
+  late Pointer<WasmerEngine> _engine;
+  Map<int, dynamic> traps = {};
+/* <RUNTIME_MEMB> */
+
+  factory WasmRuntime() {
+    return _inst ??= WasmRuntime._init();
+  }
+
+  static String _getLibName() {
+    if (Platform.isMacOS) return "libwasmer.dylib";
+    if (Platform.isLinux) return "libwasmer.so";
+    // TODO(dartbug.com/37882): Support more platforms.
+    throw Exception("Wasm not currently supported on this platform");
+  }
+
+  static String _getLibDir() {
+    // The common case, and how cli_util.dart computes the Dart SDK directory,
+    // path.dirname called twice on Platform.resolvedExecutable.
+    var commonLibDir = path.join(
+        path.absolute(path.dirname(path.dirname(Platform.resolvedExecutable))),
+        'bin',
+        'third_party',
+        'wasmer');
+    if (Directory(commonLibDir).existsSync()) {
+      return commonLibDir;
+    }
+
+    // This is the less common case where the user is in the checked out Dart
+    // SDK, and is executing dart via:
+    // ./out/ReleaseX64/dart ...
+    var checkedOutLibDir = path.join(
+        path.absolute(path.dirname(Platform.resolvedExecutable)),
+        'dart-sdk',
+        'bin',
+        'third_party',
+        'wasmer');
+    if (Directory(checkedOutLibDir).existsSync()) {
+      return checkedOutLibDir;
+    }
+
+    // If neither returned above, we return the common case:
+    return commonLibDir;
+  }
+
+  WasmRuntime._init()
+      : _lib = DynamicLibrary.open(path.join(_getLibDir(), _getLibName())) {
+/* <RUNTIME_LOAD> */
+
+    _engine = _engine_new();
+  }
+
+  Pointer<WasmerStore> newStore() {
+    return _store_new(_engine);
+  }
+
+  Pointer<WasmerModule> compile(Pointer<WasmerStore> store, Uint8List data) {
+    var dataPtr = allocate<Uint8>(count: data.length);
+    for (int i = 0; i < data.length; ++i) {
+      dataPtr[i] = data[i];
+    }
+    var dataVec = allocate<WasmerByteVec>();
+    dataVec.ref.data = dataPtr;
+    dataVec.ref.length = data.length;
+
+    var modulePtr = _module_new(store, dataVec);
+
+    free(dataPtr);
+    free(dataVec);
+
+    return _checkNotEqual(modulePtr, nullptr, "Wasm module compile failed.");
+  }
+
+  List<WasmExportDescriptor> exportDescriptors(Pointer<WasmerModule> module) {
+    var exportsVec = allocate<WasmerExporttypeVec>();
+    _module_exports(module, exportsVec);
+    var exps = <WasmExportDescriptor>[];
+    for (var i = 0; i < exportsVec.ref.length; ++i) {
+      var exp = exportsVec.ref.data[i];
+      var extern = _exporttype_type(exp);
+      var kind = _externtype_kind(extern);
+      var fnType = kind == WasmerExternKindFunction
+          ? _externtype_as_functype(extern)
+          : nullptr;
+      exps.add(WasmExportDescriptor(
+          kind, _exporttype_name(exp).ref.toString(), fnType));
+    }
+    free(exportsVec);
+    return exps;
+  }
+
+  List<WasmImportDescriptor> importDescriptors(Pointer<WasmerModule> module) {
+    var importsVec = allocate<WasmerImporttypeVec>();
+    _module_imports(module, importsVec);
+    var imps = <WasmImportDescriptor>[];
+    for (var i = 0; i < importsVec.ref.length; ++i) {
+      var imp = importsVec.ref.data[i];
+      var extern = _importtype_type(imp);
+      var kind = _externtype_kind(extern);
+      var fnType = kind == WasmerExternKindFunction
+          ? _externtype_as_functype(extern)
+          : nullptr;
+      imps.add(WasmImportDescriptor(
+          kind,
+          _importtype_module(imp).ref.toString(),
+          _importtype_name(imp).ref.toString(),
+          fnType));
+    }
+    free(importsVec);
+    return imps;
+  }
+
+  void maybeThrowTrap(Pointer<WasmerTrap> trap, String source) {
+    if (trap != nullptr) {
+      var stashedException = traps[trap.address];
+      if (stashedException != null) {
+        traps.remove(stashedException);
+        throw stashedException;
+      } else {
+        var trapMessage = allocate<WasmerByteVec>();
+        _trap_message(trap, trapMessage);
+        var message = "Wasm trap when calling $source: ${trapMessage.ref}";
+        free(trapMessage.ref.data);
+        free(trapMessage);
+        throw Exception(message);
+      }
+    }
+  }
+
+  Pointer<WasmerInstance> instantiate(Pointer<WasmerStore> store,
+      Pointer<WasmerModule> module, Pointer<WasmerExternVec> imports) {
+    var trap = allocate<Pointer<WasmerTrap>>();
+    trap.value = nullptr;
+    var inst = _instance_new(store, module, imports, trap);
+    maybeThrowTrap(trap.value, "module initialization function");
+    free(trap);
+    return _checkNotEqual(inst, nullptr, "Wasm module instantiation failed.");
+  }
+
+  Pointer<WasmerExternVec> exports(Pointer<WasmerInstance> instancePtr) {
+    var exports = allocate<WasmerExternVec>();
+    _instance_exports(instancePtr, exports);
+    return exports;
+  }
+
+  int externKind(Pointer<WasmerExtern> extern) {
+    return _extern_kind(extern);
+  }
+
+  Pointer<WasmerFunc> externToFunction(Pointer<WasmerExtern> extern) {
+    return _extern_as_func(extern);
+  }
+
+  Pointer<WasmerExtern> functionToExtern(Pointer<WasmerFunc> func) {
+    return _func_as_extern(func);
+  }
+
+  List<int> getArgTypes(Pointer<WasmerFunctype> funcType) {
+    var types = <int>[];
+    var args = _functype_params(funcType);
+    for (var i = 0; i < args.ref.length; ++i) {
+      types.add(_valtype_kind(args.ref.data[i]));
+    }
+    return types;
+  }
+
+  int getReturnType(Pointer<WasmerFunctype> funcType) {
+    var rets = _functype_results(funcType);
+    if (rets.ref.length == 0) {
+      return WasmerValKindVoid;
+    } else if (rets.ref.length > 1) {
+      throw Exception("Multiple return values are not supported");
+    }
+    return _valtype_kind(rets.ref.data[0]);
+  }
+
+  void call(Pointer<WasmerFunc> func, Pointer<WasmerValVec> args,
+      Pointer<WasmerValVec> results, String source) {
+    maybeThrowTrap(_func_call(func, args, results), source);
+  }
+
+  Pointer<WasmerMemory> externToMemory(Pointer<WasmerExtern> extern) {
+    return _extern_as_memory(extern);
+  }
+
+  Pointer<WasmerExtern> memoryToExtern(Pointer<WasmerMemory> memory) {
+    return _memory_as_extern(memory);
+  }
+
+  Pointer<WasmerMemory> newMemory(
+      Pointer<WasmerStore> store, int pages, int? maxPages) {
+    var limPtr = allocate<WasmerLimits>();
+    limPtr.ref.min = pages;
+    limPtr.ref.max = maxPages ?? wasm_limits_max_default;
+    var memType = _memorytype_new(limPtr);
+    free(limPtr);
+    return _checkNotEqual(
+        _memory_new(store, memType), nullptr, "Failed to create memory.");
+  }
+
+  void growMemory(Pointer<WasmerMemory> memory, int deltaPages) {
+    _checkNotEqual(
+        _memory_grow(memory, deltaPages), 0, "Failed to grow memory.");
+  }
+
+  int memoryLength(Pointer<WasmerMemory> memory) {
+    return _memory_size(memory);
+  }
+
+  Uint8List memoryView(Pointer<WasmerMemory> memory) {
+    return _memory_data(memory).asTypedList(_memory_data_size(memory));
+  }
+
+  Pointer<WasmerFunc> newFunc(
+      Pointer<WasmerStore> store,
+      Pointer<WasmerFunctype> funcType,
+      Pointer func,
+      Pointer env,
+      Pointer finalizer) {
+    return _func_new_with_env(
+        store, funcType, func.cast(), env.cast(), finalizer.cast());
+  }
+
+  Pointer<WasmerTrap> newTrap(Pointer<WasmerStore> store, dynamic exception) {
+    var msg = allocate<WasmerByteVec>();
+    msg.ref.data = allocate<Uint8>();
+    msg.ref.data[0] = 0;
+    msg.ref.length = 0;
+    var trap = _trap_new(store, msg);
+    traps[trap.address] = exception;
+    free(msg.ref.data);
+    free(msg);
+    return _checkNotEqual(trap, nullptr, "Failed to create trap.");
+  }
+
+  Pointer<WasmerWasiConfig> newWasiConfig() {
+    var name = allocate<Uint8>();
+    name[0] = 0;
+    var config = _wasi_config_new(name);
+    free(name);
+    return _checkNotEqual(config, nullptr, "Failed to create WASI config.");
+  }
+
+  void captureWasiStdout(Pointer<WasmerWasiConfig> config) {
+    _wasi_config_inherit_stdout(config);
+  }
+
+  void captureWasiStderr(Pointer<WasmerWasiConfig> config) {
+    _wasi_config_inherit_stderr(config);
+  }
+
+  Pointer<WasmerWasiEnv> newWasiEnv(Pointer<WasmerWasiConfig> config) {
+    return _checkNotEqual(
+        _wasi_env_new(config), nullptr, "Failed to create WASI environment.");
+  }
+
+  void wasiEnvSetMemory(
+      Pointer<WasmerWasiEnv> env, Pointer<WasmerMemory> memory) {
+    _wasi_env_set_memory(env, memory);
+  }
+
+  void getWasiImports(Pointer<WasmerStore> store, Pointer<WasmerModule> mod,
+      Pointer<WasmerWasiEnv> env, Pointer<WasmerExternVec> imports) {
+    _checkNotEqual(_wasi_get_imports(store, mod, env, imports), 0,
+        "Failed to fill WASI imports.");
+  }
+
+  Stream<List<int>> getWasiStdoutStream(Pointer<WasmerWasiEnv> env) {
+    return Stream.fromIterable(_WasiStreamIterable(env, _wasi_env_read_stdout));
+  }
+
+  Stream<List<int>> getWasiStderrStream(Pointer<WasmerWasiEnv> env) {
+    return Stream.fromIterable(_WasiStreamIterable(env, _wasi_env_read_stderr));
+  }
+
+  String _getLastError() {
+    var length = _wasmer_last_error_length();
+    var buf = allocate<Uint8>(count: length);
+    _wasmer_last_error_message(buf, length);
+    String message = utf8.decode(buf.asTypedList(length));
+    free(buf);
+    return message;
+  }
+
+  T _checkNotEqual<T>(T x, T y, String errorMessage) {
+    if (x == y) {
+      throw Exception("$errorMessage\n${_getLastError()}");
+    }
+    return x;
+  }
+
+  static String getSignatureString(
+      String name, List<int> argTypes, int returnType) {
+    return "${wasmerValKindName(returnType)} $name" +
+        "(${argTypes.map(wasmerValKindName).join(", ")})";
+  }
+}
+
+class _WasiStreamIterator implements Iterator<List<int>> {
+  static final int _bufferLength = 1024;
+  Pointer<WasmerWasiEnv> _env;
+  Function _reader;
+  Pointer<Uint8> _buf = allocate<Uint8>(count: _bufferLength);
+  int _length = 0;
+  _WasiStreamIterator(this._env, this._reader) {}
+
+  bool moveNext() {
+    _length = _reader(_env, _buf, _bufferLength);
+    return true;
+  }
+
+  List<int> get current => _buf.asTypedList(_length);
+}
+
+class _WasiStreamIterable extends Iterable<List<int>> {
+  Pointer<WasmerWasiEnv> _env;
+  Function _reader;
+  _WasiStreamIterable(this._env, this._reader) {}
+  @override
+  Iterator<List<int>> get iterator => _WasiStreamIterator(_env, _reader);
+}
diff --git a/pkg/wasm/lib/src/tools/wasmer_api_template.dart b/pkg/wasm/lib/src/tools/wasmer_api_template.dart
new file mode 100644
index 0000000..62c2ac0
--- /dev/null
+++ b/pkg/wasm/lib/src/tools/wasmer_api_template.dart
@@ -0,0 +1,116 @@
+// Copyright (c) 2020, 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.
+
+/* <GEN_DOC> */
+
+import 'dart:convert';
+import 'dart:ffi';
+import 'dart:typed_data';
+
+// wasm_valkind_enum
+const int WasmerValKindI32 = 0;
+const int WasmerValKindI64 = 1;
+const int WasmerValKindF32 = 2;
+const int WasmerValKindF64 = 3;
+// The void tag is not part of the C API. It's used to represent the return type
+// of a void function.
+const int WasmerValKindVoid = -1;
+
+// wasm_externkind_enum
+const int WasmerExternKindFunction = 0;
+const int WasmerExternKindGlobal = 1;
+const int WasmerExternKindTable = 2;
+const int WasmerExternKindMemory = 3;
+
+String wasmerExternKindName(int kind) {
+  switch (kind) {
+    case WasmerExternKindFunction:
+      return "function";
+    case WasmerExternKindGlobal:
+      return "global";
+    case WasmerExternKindTable:
+      return "table";
+    case WasmerExternKindMemory:
+      return "memory";
+    default:
+      return "unknown";
+  }
+}
+
+String wasmerValKindName(int kind) {
+  switch (kind) {
+    case WasmerValKindI32:
+      return "int32";
+    case WasmerValKindI64:
+      return "int64";
+    case WasmerValKindF32:
+      return "float32";
+    case WasmerValKindF64:
+      return "float64";
+    case WasmerValKindVoid:
+      return "void";
+    default:
+      return "unknown";
+  }
+}
+
+// wasm_val_t
+class WasmerVal extends Struct {
+  // wasm_valkind_t
+  @Uint8()
+  external int kind;
+
+  // This is a union of int32_t, int64_t, float, and double. The kind determines
+  // which type it is. It's declared as an int64_t because that's large enough
+  // to hold all the types. We use ByteData to get the other types.
+  @Int64()
+  external int value;
+
+  int get _off32 => Endian.host == Endian.little ? 0 : 4;
+  int get i64 => value;
+  ByteData get _getterBytes => ByteData(8)..setInt64(0, value, Endian.host);
+  int get i32 => _getterBytes.getInt32(_off32, Endian.host);
+  double get f32 => _getterBytes.getFloat32(_off32, Endian.host);
+  double get f64 => _getterBytes.getFloat64(0, Endian.host);
+
+  set i64(int val) => value = val;
+  set _val(ByteData bytes) => value = bytes.getInt64(0, Endian.host);
+  set i32(int val) => _val = ByteData(8)..setInt32(_off32, val, Endian.host);
+  set f32(num val) =>
+      _val = ByteData(8)..setFloat32(_off32, val as double, Endian.host);
+  set f64(num val) =>
+      _val = ByteData(8)..setFloat64(0, val as double, Endian.host);
+
+  bool get isI32 => kind == WasmerValKindI32;
+  bool get isI64 => kind == WasmerValKindI64;
+  bool get isF32 => kind == WasmerValKindF32;
+  bool get isF64 => kind == WasmerValKindF64;
+
+  dynamic get toDynamic {
+    switch (kind) {
+      case WasmerValKindI32:
+        return i32;
+      case WasmerValKindI64:
+        return i64;
+      case WasmerValKindF32:
+        return f32;
+      case WasmerValKindF64:
+        return f64;
+    }
+  }
+}
+
+// wasmer_limits_t
+class WasmerLimits extends Struct {
+  @Uint32()
+  external int min;
+
+  @Uint32()
+  external int max;
+}
+
+// Default maximum, which indicates no upper limit.
+const int wasm_limits_max_default = 0xffffffff;
+
+/* <WASMER_API> */
diff --git a/pkg/wasm/lib/src/wasmer_api.dart b/pkg/wasm/lib/src/wasmer_api.dart
index 94dd651..ce9057e 100644
--- a/pkg/wasm/lib/src/wasmer_api.dart
+++ b/pkg/wasm/lib/src/wasmer_api.dart
@@ -2,116 +2,70 @@
 // 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.
 
+// This file has been automatically generated. Please do not edit it manually.
+// To regenerate the file, use the following command
+// "generate_ffi_boilerplate.py".
+
 import 'dart:convert';
 import 'dart:ffi';
 import 'dart:typed_data';
 
-// wasmer_result_t
-const int WasmerResultOk = 1;
-const int WasmerResultError = 2;
-
-// wasmer_value_tag
-const int WasmerValueTagI32 = 0;
-const int WasmerValueTagI64 = 1;
-const int WasmerValueTagF32 = 2;
-const int WasmerValueTagF64 = 3;
+// wasm_valkind_enum
+const int WasmerValKindI32 = 0;
+const int WasmerValKindI64 = 1;
+const int WasmerValKindF32 = 2;
+const int WasmerValKindF64 = 3;
 // The void tag is not part of the C API. It's used to represent the return type
 // of a void function.
-const int WasmerValueTagVoid = -1;
+const int WasmerValKindVoid = -1;
 
-// wasmer_import_export_kind
-const int WasmerImpExpKindFunction = 0;
-const int WasmerImpExpKindGlobal = 1;
-const int WasmerImpExpKindMemory = 2;
-const int WasmerImpExpKindTable = 3;
+// wasm_externkind_enum
+const int WasmerExternKindFunction = 0;
+const int WasmerExternKindGlobal = 1;
+const int WasmerExternKindTable = 2;
+const int WasmerExternKindMemory = 3;
 
-String wasmerImpExpKindName(int kind) {
+String wasmerExternKindName(int kind) {
   switch (kind) {
-    case WasmerImpExpKindFunction:
+    case WasmerExternKindFunction:
       return "function";
-    case WasmerImpExpKindGlobal:
+    case WasmerExternKindGlobal:
       return "global";
-    case WasmerImpExpKindMemory:
-      return "memory";
-    case WasmerImpExpKindTable:
+    case WasmerExternKindTable:
       return "table";
+    case WasmerExternKindMemory:
+      return "memory";
     default:
       return "unknown";
   }
 }
 
-// wasmer_module_t
-class WasmerModule extends Struct {}
-
-// wasmer_instance_t
-class WasmerInstance extends Struct {}
-
-// wasmer_exports_t
-class WasmerExports extends Struct {}
-
-// wasmer_export_t
-class WasmerExport extends Struct {}
-
-// wasmer_export_descriptors_t
-class WasmerExportDescriptors extends Struct {}
-
-// wasmer_export_descriptor_t
-class WasmerExportDescriptor extends Struct {}
-
-// wasmer_export_func_t
-class WasmerExportFunc extends Struct {}
-
-// wasmer_import_descriptors_t
-class WasmerImportDescriptors extends Struct {}
-
-// wasmer_import_descriptor_t
-class WasmerImportDescriptor extends Struct {}
-
-// wasmer_memory_t
-class WasmerMemory extends Struct {}
-
-// wasmer_import_t
-class WasmerImport extends Struct {
-  external Pointer<Uint8> module_name;
-
-  @Uint32()
-  external int module_name_length;
-
-  external Pointer<Uint8> import_name;
-
-  @Uint32()
-  external int import_name_length;
-
-  // wasmer_import_export_kind
-  @Uint32()
-  external int tag;
-
-  // wasmer_import_export_value, which is a union of wasmer_import_func_t*,
-  // wasmer_table_t*, wasmer_memory_t*, and wasmer_global_t*. The tag determines
-  // which type it is.
-  external Pointer<Void> value;
+String wasmerValKindName(int kind) {
+  switch (kind) {
+    case WasmerValKindI32:
+      return "int32";
+    case WasmerValKindI64:
+      return "int64";
+    case WasmerValKindF32:
+      return "float32";
+    case WasmerValKindF64:
+      return "float64";
+    case WasmerValKindVoid:
+      return "void";
+    default:
+      return "unknown";
+  }
 }
 
-// wasmer_byte_array
-class WasmerByteArray extends Struct {
-  external Pointer<Uint8> bytes;
+// wasm_val_t
+class WasmerVal extends Struct {
+  // wasm_valkind_t
+  @Uint8()
+  external int kind;
 
-  @Uint32()
-  external int length;
-
-  Uint8List get list => bytes.asTypedList(length);
-  String get string => utf8.decode(list);
-}
-
-// wasmer_value_t
-class WasmerValue extends Struct {
-  // wasmer_value_tag
-  @Uint32()
-  external int tag;
-
-  // wasmer_value, which is a union of int32_t, int64_t, float, and double. The
-  // tag determines which type it is. It's declared as an int64_t because that's
-  // large enough to hold all the types. We use ByteData to get the other types.
+  // This is a union of int32_t, int64_t, float, and double. The kind determines
+  // which type it is. It's declared as an int64_t because that's large enough
+  // to hold all the types. We use ByteData to get the other types.
   @Int64()
   external int value;
 
@@ -130,10 +84,23 @@
   set f64(num val) =>
       _val = ByteData(8)..setFloat64(0, val as double, Endian.host);
 
-  bool get isI32 => tag == WasmerValueTagI32;
-  bool get isI64 => tag == WasmerValueTagI64;
-  bool get isF32 => tag == WasmerValueTagF32;
-  bool get isF64 => tag == WasmerValueTagF64;
+  bool get isI32 => kind == WasmerValKindI32;
+  bool get isI64 => kind == WasmerValKindI64;
+  bool get isF32 => kind == WasmerValKindF32;
+  bool get isF64 => kind == WasmerValKindF64;
+
+  dynamic get toDynamic {
+    switch (kind) {
+      case WasmerValKindI32:
+        return i32;
+      case WasmerValKindI64:
+        return i64;
+      case WasmerValKindF32:
+        return f32;
+      case WasmerValKindF64:
+        return f64;
+    }
+  }
 }
 
 // wasmer_limits_t
@@ -141,196 +108,522 @@
   @Uint32()
   external int min;
 
-  // bool
-  @Uint8()
-  external int has_max;
-
   @Uint32()
   external int max;
 }
 
-// wasmer_compile
-typedef NativeWasmerCompileFn = Uint32 Function(
-    Pointer<Pointer<WasmerModule>>, Pointer<Uint8>, Uint32);
-typedef WasmerCompileFn = int Function(
-    Pointer<Pointer<WasmerModule>>, Pointer<Uint8>, int);
+// Default maximum, which indicates no upper limit.
+const int wasm_limits_max_default = 0xffffffff;
 
-// wasmer_module_instantiate
-typedef NativeWasmerInstantiateFn = Uint32 Function(Pointer<WasmerModule>,
-    Pointer<Pointer<WasmerInstance>>, Pointer<WasmerImport>, Int32);
-typedef WasmerInstantiateFn = int Function(Pointer<WasmerModule>,
-    Pointer<Pointer<WasmerInstance>>, Pointer<WasmerImport>, int);
+// wasm_engine_t
+class WasmerEngine extends Struct {}
 
-// wasmer_instance_exports
+// wasm_exporttype_t
+class WasmerExporttype extends Struct {}
+
+// wasm_extern_t
+class WasmerExtern extends Struct {}
+
+// wasm_externtype_t
+class WasmerExterntype extends Struct {}
+
+// wasm_func_t
+class WasmerFunc extends Struct {}
+
+// wasm_functype_t
+class WasmerFunctype extends Struct {}
+
+// wasm_importtype_t
+class WasmerImporttype extends Struct {}
+
+// wasm_instance_t
+class WasmerInstance extends Struct {}
+
+// wasm_memory_t
+class WasmerMemory extends Struct {}
+
+// wasm_memorytype_t
+class WasmerMemorytype extends Struct {}
+
+// wasm_module_t
+class WasmerModule extends Struct {}
+
+// wasm_store_t
+class WasmerStore extends Struct {}
+
+// wasm_trap_t
+class WasmerTrap extends Struct {}
+
+// wasm_valtype_t
+class WasmerValtype extends Struct {}
+
+// wasi_config_t
+class WasmerWasiConfig extends Struct {}
+
+// wasi_env_t
+class WasmerWasiEnv extends Struct {}
+
+// wasm_byte_vec_t
+class WasmerByteVec extends Struct {
+  @Uint64()
+  external int length;
+
+  external Pointer<Uint8> data;
+
+  Uint8List get list => data.asTypedList(length);
+  String toString() => utf8.decode(list);
+}
+
+// wasm_exporttype_vec_t
+class WasmerExporttypeVec extends Struct {
+  @Uint64()
+  external int length;
+
+  external Pointer<Pointer<WasmerExporttype>> data;
+}
+
+// wasm_extern_vec_t
+class WasmerExternVec extends Struct {
+  @Uint64()
+  external int length;
+
+  external Pointer<Pointer<WasmerExtern>> data;
+}
+
+// wasm_importtype_vec_t
+class WasmerImporttypeVec extends Struct {
+  @Uint64()
+  external int length;
+
+  external Pointer<Pointer<WasmerImporttype>> data;
+}
+
+// wasm_val_vec_t
+class WasmerValVec extends Struct {
+  @Uint64()
+  external int length;
+
+  external Pointer<WasmerVal> data;
+}
+
+// wasm_valtype_vec_t
+class WasmerValtypeVec extends Struct {
+  @Uint64()
+  external int length;
+
+  external Pointer<Pointer<WasmerValtype>> data;
+}
+
+// wasi_config_inherit_stderr
+typedef NativeWasmerWasiConfigInheritStderrFn = Void Function(
+    Pointer<WasmerWasiConfig>);
+typedef WasmerWasiConfigInheritStderrFn = void Function(
+    Pointer<WasmerWasiConfig>);
+
+// wasi_config_inherit_stdout
+typedef NativeWasmerWasiConfigInheritStdoutFn = Void Function(
+    Pointer<WasmerWasiConfig>);
+typedef WasmerWasiConfigInheritStdoutFn = void Function(
+    Pointer<WasmerWasiConfig>);
+
+// wasi_config_new
+typedef NativeWasmerWasiConfigNewFn = Pointer<WasmerWasiConfig> Function(
+    Pointer<Uint8>);
+typedef WasmerWasiConfigNewFn = Pointer<WasmerWasiConfig> Function(
+    Pointer<Uint8>);
+
+// wasi_env_delete
+typedef NativeWasmerWasiEnvDeleteFn = Void Function(Pointer<WasmerWasiEnv>);
+typedef WasmerWasiEnvDeleteFn = void Function(Pointer<WasmerWasiEnv>);
+
+// wasi_env_new
+typedef NativeWasmerWasiEnvNewFn = Pointer<WasmerWasiEnv> Function(
+    Pointer<WasmerWasiConfig>);
+typedef WasmerWasiEnvNewFn = Pointer<WasmerWasiEnv> Function(
+    Pointer<WasmerWasiConfig>);
+
+// wasi_env_read_stderr
+typedef NativeWasmerWasiEnvReadStderrFn = Int64 Function(
+    Pointer<WasmerWasiEnv>, Pointer<Uint8>, Uint64);
+typedef WasmerWasiEnvReadStderrFn = int Function(
+    Pointer<WasmerWasiEnv>, Pointer<Uint8>, int);
+
+// wasi_env_read_stdout
+typedef NativeWasmerWasiEnvReadStdoutFn = Int64 Function(
+    Pointer<WasmerWasiEnv>, Pointer<Uint8>, Uint64);
+typedef WasmerWasiEnvReadStdoutFn = int Function(
+    Pointer<WasmerWasiEnv>, Pointer<Uint8>, int);
+
+// wasi_env_set_memory
+typedef NativeWasmerWasiEnvSetMemoryFn = Void Function(
+    Pointer<WasmerWasiEnv>, Pointer<WasmerMemory>);
+typedef WasmerWasiEnvSetMemoryFn = void Function(
+    Pointer<WasmerWasiEnv>, Pointer<WasmerMemory>);
+
+// wasi_get_imports
+typedef NativeWasmerWasiGetImportsFn = Uint8 Function(Pointer<WasmerStore>,
+    Pointer<WasmerModule>, Pointer<WasmerWasiEnv>, Pointer<WasmerExternVec>);
+typedef WasmerWasiGetImportsFn = int Function(Pointer<WasmerStore>,
+    Pointer<WasmerModule>, Pointer<WasmerWasiEnv>, Pointer<WasmerExternVec>);
+
+// wasm_byte_vec_delete
+typedef NativeWasmerByteVecDeleteFn = Void Function(Pointer<WasmerByteVec>);
+typedef WasmerByteVecDeleteFn = void Function(Pointer<WasmerByteVec>);
+
+// wasm_byte_vec_new
+typedef NativeWasmerByteVecNewFn = Void Function(
+    Pointer<WasmerByteVec>, Uint64, Pointer<Uint8>);
+typedef WasmerByteVecNewFn = void Function(
+    Pointer<WasmerByteVec>, int, Pointer<Uint8>);
+
+// wasm_byte_vec_new_empty
+typedef NativeWasmerByteVecNewEmptyFn = Void Function(Pointer<WasmerByteVec>);
+typedef WasmerByteVecNewEmptyFn = void Function(Pointer<WasmerByteVec>);
+
+// wasm_byte_vec_new_uninitialized
+typedef NativeWasmerByteVecNewUninitializedFn = Void Function(
+    Pointer<WasmerByteVec>, Uint64);
+typedef WasmerByteVecNewUninitializedFn = void Function(
+    Pointer<WasmerByteVec>, int);
+
+// wasm_engine_delete
+typedef NativeWasmerEngineDeleteFn = Void Function(Pointer<WasmerEngine>);
+typedef WasmerEngineDeleteFn = void Function(Pointer<WasmerEngine>);
+
+// wasm_engine_new
+typedef NativeWasmerEngineNewFn = Pointer<WasmerEngine> Function();
+typedef WasmerEngineNewFn = Pointer<WasmerEngine> Function();
+
+// wasm_exporttype_name
+typedef NativeWasmerExporttypeNameFn = Pointer<WasmerByteVec> Function(
+    Pointer<WasmerExporttype>);
+typedef WasmerExporttypeNameFn = Pointer<WasmerByteVec> Function(
+    Pointer<WasmerExporttype>);
+
+// wasm_exporttype_type
+typedef NativeWasmerExporttypeTypeFn = Pointer<WasmerExterntype> Function(
+    Pointer<WasmerExporttype>);
+typedef WasmerExporttypeTypeFn = Pointer<WasmerExterntype> Function(
+    Pointer<WasmerExporttype>);
+
+// wasm_exporttype_vec_delete
+typedef NativeWasmerExporttypeVecDeleteFn = Void Function(
+    Pointer<WasmerExporttypeVec>);
+typedef WasmerExporttypeVecDeleteFn = void Function(
+    Pointer<WasmerExporttypeVec>);
+
+// wasm_exporttype_vec_new
+typedef NativeWasmerExporttypeVecNewFn = Void Function(
+    Pointer<WasmerExporttypeVec>, Uint64, Pointer<Pointer<WasmerExporttype>>);
+typedef WasmerExporttypeVecNewFn = void Function(
+    Pointer<WasmerExporttypeVec>, int, Pointer<Pointer<WasmerExporttype>>);
+
+// wasm_exporttype_vec_new_empty
+typedef NativeWasmerExporttypeVecNewEmptyFn = Void Function(
+    Pointer<WasmerExporttypeVec>);
+typedef WasmerExporttypeVecNewEmptyFn = void Function(
+    Pointer<WasmerExporttypeVec>);
+
+// wasm_exporttype_vec_new_uninitialized
+typedef NativeWasmerExporttypeVecNewUninitializedFn = Void Function(
+    Pointer<WasmerExporttypeVec>, Uint64);
+typedef WasmerExporttypeVecNewUninitializedFn = void Function(
+    Pointer<WasmerExporttypeVec>, int);
+
+// wasm_extern_as_func
+typedef NativeWasmerExternAsFuncFn = Pointer<WasmerFunc> Function(
+    Pointer<WasmerExtern>);
+typedef WasmerExternAsFuncFn = Pointer<WasmerFunc> Function(
+    Pointer<WasmerExtern>);
+
+// wasm_extern_as_memory
+typedef NativeWasmerExternAsMemoryFn = Pointer<WasmerMemory> Function(
+    Pointer<WasmerExtern>);
+typedef WasmerExternAsMemoryFn = Pointer<WasmerMemory> Function(
+    Pointer<WasmerExtern>);
+
+// wasm_extern_delete
+typedef NativeWasmerExternDeleteFn = Void Function(Pointer<WasmerExtern>);
+typedef WasmerExternDeleteFn = void Function(Pointer<WasmerExtern>);
+
+// wasm_extern_kind
+typedef NativeWasmerExternKindFn = Uint8 Function(Pointer<WasmerExtern>);
+typedef WasmerExternKindFn = int Function(Pointer<WasmerExtern>);
+
+// wasm_extern_vec_delete
+typedef NativeWasmerExternVecDeleteFn = Void Function(Pointer<WasmerExternVec>);
+typedef WasmerExternVecDeleteFn = void Function(Pointer<WasmerExternVec>);
+
+// wasm_extern_vec_new
+typedef NativeWasmerExternVecNewFn = Void Function(
+    Pointer<WasmerExternVec>, Uint64, Pointer<Pointer<WasmerExtern>>);
+typedef WasmerExternVecNewFn = void Function(
+    Pointer<WasmerExternVec>, int, Pointer<Pointer<WasmerExtern>>);
+
+// wasm_extern_vec_new_empty
+typedef NativeWasmerExternVecNewEmptyFn = Void Function(
+    Pointer<WasmerExternVec>);
+typedef WasmerExternVecNewEmptyFn = void Function(Pointer<WasmerExternVec>);
+
+// wasm_extern_vec_new_uninitialized
+typedef NativeWasmerExternVecNewUninitializedFn = Void Function(
+    Pointer<WasmerExternVec>, Uint64);
+typedef WasmerExternVecNewUninitializedFn = void Function(
+    Pointer<WasmerExternVec>, int);
+
+// wasm_externtype_as_functype
+typedef NativeWasmerExterntypeAsFunctypeFn = Pointer<WasmerFunctype> Function(
+    Pointer<WasmerExterntype>);
+typedef WasmerExterntypeAsFunctypeFn = Pointer<WasmerFunctype> Function(
+    Pointer<WasmerExterntype>);
+
+// wasm_externtype_delete
+typedef NativeWasmerExterntypeDeleteFn = Void Function(
+    Pointer<WasmerExterntype>);
+typedef WasmerExterntypeDeleteFn = void Function(Pointer<WasmerExterntype>);
+
+// wasm_externtype_kind
+typedef NativeWasmerExterntypeKindFn = Uint8 Function(
+    Pointer<WasmerExterntype>);
+typedef WasmerExterntypeKindFn = int Function(Pointer<WasmerExterntype>);
+
+// wasm_func_as_extern
+typedef NativeWasmerFuncAsExternFn = Pointer<WasmerExtern> Function(
+    Pointer<WasmerFunc>);
+typedef WasmerFuncAsExternFn = Pointer<WasmerExtern> Function(
+    Pointer<WasmerFunc>);
+
+// wasm_func_call
+typedef NativeWasmerFuncCallFn = Pointer<WasmerTrap> Function(
+    Pointer<WasmerFunc>, Pointer<WasmerValVec>, Pointer<WasmerValVec>);
+typedef WasmerFuncCallFn = Pointer<WasmerTrap> Function(
+    Pointer<WasmerFunc>, Pointer<WasmerValVec>, Pointer<WasmerValVec>);
+
+// wasm_func_delete
+typedef NativeWasmerFuncDeleteFn = Void Function(Pointer<WasmerFunc>);
+typedef WasmerFuncDeleteFn = void Function(Pointer<WasmerFunc>);
+
+// wasm_func_new_with_env
+typedef NativeWasmerFuncNewWithEnvFn = Pointer<WasmerFunc> Function(
+    Pointer<WasmerStore>,
+    Pointer<WasmerFunctype>,
+    Pointer<Void>,
+    Pointer<Void>,
+    Pointer<Void>);
+typedef WasmerFuncNewWithEnvFn = Pointer<WasmerFunc> Function(
+    Pointer<WasmerStore>,
+    Pointer<WasmerFunctype>,
+    Pointer<Void>,
+    Pointer<Void>,
+    Pointer<Void>);
+
+// wasm_functype_delete
+typedef NativeWasmerFunctypeDeleteFn = Void Function(Pointer<WasmerFunctype>);
+typedef WasmerFunctypeDeleteFn = void Function(Pointer<WasmerFunctype>);
+
+// wasm_functype_params
+typedef NativeWasmerFunctypeParamsFn = Pointer<WasmerValtypeVec> Function(
+    Pointer<WasmerFunctype>);
+typedef WasmerFunctypeParamsFn = Pointer<WasmerValtypeVec> Function(
+    Pointer<WasmerFunctype>);
+
+// wasm_functype_results
+typedef NativeWasmerFunctypeResultsFn = Pointer<WasmerValtypeVec> Function(
+    Pointer<WasmerFunctype>);
+typedef WasmerFunctypeResultsFn = Pointer<WasmerValtypeVec> Function(
+    Pointer<WasmerFunctype>);
+
+// wasm_importtype_module
+typedef NativeWasmerImporttypeModuleFn = Pointer<WasmerByteVec> Function(
+    Pointer<WasmerImporttype>);
+typedef WasmerImporttypeModuleFn = Pointer<WasmerByteVec> Function(
+    Pointer<WasmerImporttype>);
+
+// wasm_importtype_name
+typedef NativeWasmerImporttypeNameFn = Pointer<WasmerByteVec> Function(
+    Pointer<WasmerImporttype>);
+typedef WasmerImporttypeNameFn = Pointer<WasmerByteVec> Function(
+    Pointer<WasmerImporttype>);
+
+// wasm_importtype_type
+typedef NativeWasmerImporttypeTypeFn = Pointer<WasmerExterntype> Function(
+    Pointer<WasmerImporttype>);
+typedef WasmerImporttypeTypeFn = Pointer<WasmerExterntype> Function(
+    Pointer<WasmerImporttype>);
+
+// wasm_importtype_vec_delete
+typedef NativeWasmerImporttypeVecDeleteFn = Void Function(
+    Pointer<WasmerImporttypeVec>);
+typedef WasmerImporttypeVecDeleteFn = void Function(
+    Pointer<WasmerImporttypeVec>);
+
+// wasm_importtype_vec_new
+typedef NativeWasmerImporttypeVecNewFn = Void Function(
+    Pointer<WasmerImporttypeVec>, Uint64, Pointer<Pointer<WasmerImporttype>>);
+typedef WasmerImporttypeVecNewFn = void Function(
+    Pointer<WasmerImporttypeVec>, int, Pointer<Pointer<WasmerImporttype>>);
+
+// wasm_importtype_vec_new_empty
+typedef NativeWasmerImporttypeVecNewEmptyFn = Void Function(
+    Pointer<WasmerImporttypeVec>);
+typedef WasmerImporttypeVecNewEmptyFn = void Function(
+    Pointer<WasmerImporttypeVec>);
+
+// wasm_importtype_vec_new_uninitialized
+typedef NativeWasmerImporttypeVecNewUninitializedFn = Void Function(
+    Pointer<WasmerImporttypeVec>, Uint64);
+typedef WasmerImporttypeVecNewUninitializedFn = void Function(
+    Pointer<WasmerImporttypeVec>, int);
+
+// wasm_instance_delete
+typedef NativeWasmerInstanceDeleteFn = Void Function(Pointer<WasmerInstance>);
+typedef WasmerInstanceDeleteFn = void Function(Pointer<WasmerInstance>);
+
+// wasm_instance_exports
 typedef NativeWasmerInstanceExportsFn = Void Function(
-    Pointer<WasmerInstance>, Pointer<Pointer<WasmerExports>>);
+    Pointer<WasmerInstance>, Pointer<WasmerExternVec>);
 typedef WasmerInstanceExportsFn = void Function(
-    Pointer<WasmerInstance>, Pointer<Pointer<WasmerExports>>);
+    Pointer<WasmerInstance>, Pointer<WasmerExternVec>);
 
-// wasmer_exports_len
-typedef NativeWasmerExportsLenFn = Int32 Function(Pointer<WasmerExports>);
-typedef WasmerExportsLenFn = int Function(Pointer<WasmerExports>);
+// wasm_instance_new
+typedef NativeWasmerInstanceNewFn = Pointer<WasmerInstance> Function(
+    Pointer<WasmerStore>,
+    Pointer<WasmerModule>,
+    Pointer<WasmerExternVec>,
+    Pointer<Pointer<WasmerTrap>>);
+typedef WasmerInstanceNewFn = Pointer<WasmerInstance> Function(
+    Pointer<WasmerStore>,
+    Pointer<WasmerModule>,
+    Pointer<WasmerExternVec>,
+    Pointer<Pointer<WasmerTrap>>);
 
-// wasmer_exports_get
-typedef NativeWasmerExportsGetFn = Pointer<WasmerExport> Function(
-    Pointer<WasmerExports>, Int32);
-typedef WasmerExportsGetFn = Pointer<WasmerExport> Function(
-    Pointer<WasmerExports>, int);
+// wasm_memory_as_extern
+typedef NativeWasmerMemoryAsExternFn = Pointer<WasmerExtern> Function(
+    Pointer<WasmerMemory>);
+typedef WasmerMemoryAsExternFn = Pointer<WasmerExtern> Function(
+    Pointer<WasmerMemory>);
 
-// wasmer_export_descriptors
-typedef NativeWasmerExportDescriptorsFn = Void Function(
-    Pointer<WasmerModule>, Pointer<Pointer<WasmerExportDescriptors>>);
-typedef WasmerExportDescriptorsFn = void Function(
-    Pointer<WasmerModule>, Pointer<Pointer<WasmerExportDescriptors>>);
-
-// wasmer_export_descriptors_destroy
-typedef NativeWasmerExportDescriptorsDestroyFn = Void Function(
-    Pointer<WasmerExportDescriptors>);
-typedef WasmerExportDescriptorsDestroyFn = void Function(
-    Pointer<WasmerExportDescriptors>);
-
-// wasmer_export_descriptors_len
-typedef NativeWasmerExportDescriptorsLenFn = Int32 Function(
-    Pointer<WasmerExportDescriptors>);
-typedef WasmerExportDescriptorsLenFn = int Function(
-    Pointer<WasmerExportDescriptors>);
-
-// wasmer_export_descriptors_get
-typedef NativeWasmerExportDescriptorsGetFn = Pointer<WasmerExportDescriptor>
-    Function(Pointer<WasmerExportDescriptors>, Int32);
-typedef WasmerExportDescriptorsGetFn = Pointer<WasmerExportDescriptor> Function(
-    Pointer<WasmerExportDescriptors>, int);
-
-// wasmer_export_descriptor_kind
-typedef NativeWasmerExportDescriptorKindFn = Uint32 Function(
-    Pointer<WasmerExportDescriptor>);
-typedef WasmerExportDescriptorKindFn = int Function(
-    Pointer<WasmerExportDescriptor>);
-
-// wasmer_export_descriptor_name_ptr
-typedef NativeWasmerExportDescriptorNamePtrFn = Void Function(
-    Pointer<WasmerExportDescriptor>, Pointer<WasmerByteArray>);
-typedef WasmerExportDescriptorNamePtrFn = void Function(
-    Pointer<WasmerExportDescriptor>, Pointer<WasmerByteArray>);
-
-// wasmer_import_descriptors
-typedef NativeWasmerImportDescriptorsFn = Void Function(
-    Pointer<WasmerModule>, Pointer<Pointer<WasmerImportDescriptors>>);
-typedef WasmerImportDescriptorsFn = void Function(
-    Pointer<WasmerModule>, Pointer<Pointer<WasmerImportDescriptors>>);
-
-// wasmer_import_descriptors_destroy
-typedef NativeWasmerImportDescriptorsDestroyFn = Void Function(
-    Pointer<WasmerImportDescriptors>);
-typedef WasmerImportDescriptorsDestroyFn = void Function(
-    Pointer<WasmerImportDescriptors>);
-
-// wasmer_import_descriptors_len
-typedef NativeWasmerImportDescriptorsLenFn = Int32 Function(
-    Pointer<WasmerImportDescriptors>);
-typedef WasmerImportDescriptorsLenFn = int Function(
-    Pointer<WasmerImportDescriptors>);
-
-// wasmer_import_descriptors_get
-typedef NativeWasmerImportDescriptorsGetFn = Pointer<WasmerImportDescriptor>
-    Function(Pointer<WasmerImportDescriptors>, Int32);
-typedef WasmerImportDescriptorsGetFn = Pointer<WasmerImportDescriptor> Function(
-    Pointer<WasmerImportDescriptors>, int);
-
-// wasmer_import_descriptor_kind
-typedef NativeWasmerImportDescriptorKindFn = Uint32 Function(
-    Pointer<WasmerImportDescriptor>);
-typedef WasmerImportDescriptorKindFn = int Function(
-    Pointer<WasmerImportDescriptor>);
-
-// wasmer_import_descriptor_module_name_ptr
-typedef NativeWasmerImportDescriptorModuleNamePtrFn = Void Function(
-    Pointer<WasmerImportDescriptor>, Pointer<WasmerByteArray>);
-typedef WasmerImportDescriptorModuleNamePtrFn = void Function(
-    Pointer<WasmerImportDescriptor>, Pointer<WasmerByteArray>);
-
-// wasmer_import_descriptor_name_ptr
-typedef NativeWasmerImportDescriptorNamePtrFn = Void Function(
-    Pointer<WasmerImportDescriptor>, Pointer<WasmerByteArray>);
-typedef WasmerImportDescriptorNamePtrFn = void Function(
-    Pointer<WasmerImportDescriptor>, Pointer<WasmerByteArray>);
-
-// wasmer_export_name_ptr
-typedef NativeWasmerExportNamePtrFn = Void Function(
-    Pointer<WasmerExport>, Pointer<WasmerByteArray>);
-typedef WasmerExportNamePtrFn = void Function(
-    Pointer<WasmerExport>, Pointer<WasmerByteArray>);
-
-// wasmer_export_kind
-typedef NativeWasmerExportKindFn = Uint32 Function(Pointer<WasmerExport>);
-typedef WasmerExportKindFn = int Function(Pointer<WasmerExport>);
-
-// wasmer_export_to_func
-typedef NativeWasmerExportToFuncFn = Pointer<WasmerExportFunc> Function(
-    Pointer<WasmerExport>);
-typedef WasmerExportToFuncFn = Pointer<WasmerExportFunc> Function(
-    Pointer<WasmerExport>);
-
-// wasmer_export_func_returns_arity
-typedef NativeWasmerExportFuncReturnsArityFn = Uint32 Function(
-    Pointer<WasmerExportFunc>, Pointer<Uint32>);
-typedef WasmerExportFuncReturnsArityFn = int Function(
-    Pointer<WasmerExportFunc>, Pointer<Uint32>);
-
-// wasmer_export_func_returns
-typedef NativeWasmerExportFuncReturnsFn = Uint32 Function(
-    Pointer<WasmerExportFunc>, Pointer<Uint32>, Uint32);
-typedef WasmerExportFuncReturnsFn = int Function(
-    Pointer<WasmerExportFunc>, Pointer<Uint32>, int);
-
-// wasmer_export_func_params_arity
-typedef NativeWasmerExportFuncParamsArityFn = Uint32 Function(
-    Pointer<WasmerExportFunc>, Pointer<Uint32>);
-typedef WasmerExportFuncParamsArityFn = int Function(
-    Pointer<WasmerExportFunc>, Pointer<Uint32>);
-
-// wasmer_export_func_params
-typedef NativeWasmerExportFuncParamsFn = Uint32 Function(
-    Pointer<WasmerExportFunc>, Pointer<Uint32>, Uint32);
-typedef WasmerExportFuncParamsFn = int Function(
-    Pointer<WasmerExportFunc>, Pointer<Uint32>, int);
-
-// wasmer_export_func_call
-typedef NativeWasmerExportFuncCallFn = Uint32 Function(
-    Pointer<WasmerExportFunc>,
-    Pointer<WasmerValue>,
-    Uint32,
-    Pointer<WasmerValue>,
-    Uint32);
-typedef WasmerExportFuncCallFn = int Function(Pointer<WasmerExportFunc>,
-    Pointer<WasmerValue>, int, Pointer<WasmerValue>, int);
-
-// wasmer_export_to_memory
-typedef NativeWasmerExportToMemoryFn = Uint32 Function(
-    Pointer<WasmerExport>, Pointer<Pointer<WasmerMemory>>);
-typedef WasmerExportToMemoryFn = int Function(
-    Pointer<WasmerExport>, Pointer<Pointer<WasmerMemory>>);
-
-// wasmer_memory_new_ptr
-typedef NativeWasmerMemoryNewPtrFn = Uint32 Function(
-    Pointer<Pointer<WasmerMemory>>, Pointer<WasmerLimits>);
-typedef WasmerMemoryNewPtrFn = int Function(
-    Pointer<Pointer<WasmerMemory>>, Pointer<WasmerLimits>);
-
-// wasmer_memory_grow
-typedef NativeWasmerMemoryGrowFn = Uint32 Function(
-    Pointer<WasmerMemory>, Uint32);
-typedef WasmerMemoryGrowFn = int Function(Pointer<WasmerMemory>, int);
-
-// wasmer_memory_length
-typedef NativeWasmerMemoryLengthFn = Uint32 Function(Pointer<WasmerMemory>);
-typedef WasmerMemoryLengthFn = int Function(Pointer<WasmerMemory>);
-
-// wasmer_memory_data
+// wasm_memory_data
 typedef NativeWasmerMemoryDataFn = Pointer<Uint8> Function(
     Pointer<WasmerMemory>);
 typedef WasmerMemoryDataFn = Pointer<Uint8> Function(Pointer<WasmerMemory>);
 
-// wasmer_memory_data_length
-typedef NativeWasmerMemoryDataLengthFn = Uint32 Function(Pointer<WasmerMemory>);
-typedef WasmerMemoryDataLengthFn = int Function(Pointer<WasmerMemory>);
+// wasm_memory_data_size
+typedef NativeWasmerMemoryDataSizeFn = Uint64 Function(Pointer<WasmerMemory>);
+typedef WasmerMemoryDataSizeFn = int Function(Pointer<WasmerMemory>);
+
+// wasm_memory_delete
+typedef NativeWasmerMemoryDeleteFn = Void Function(Pointer<WasmerMemory>);
+typedef WasmerMemoryDeleteFn = void Function(Pointer<WasmerMemory>);
+
+// wasm_memory_grow
+typedef NativeWasmerMemoryGrowFn = Uint8 Function(
+    Pointer<WasmerMemory>, Uint32);
+typedef WasmerMemoryGrowFn = int Function(Pointer<WasmerMemory>, int);
+
+// wasm_memory_new
+typedef NativeWasmerMemoryNewFn = Pointer<WasmerMemory> Function(
+    Pointer<WasmerStore>, Pointer<WasmerMemorytype>);
+typedef WasmerMemoryNewFn = Pointer<WasmerMemory> Function(
+    Pointer<WasmerStore>, Pointer<WasmerMemorytype>);
+
+// wasm_memory_size
+typedef NativeWasmerMemorySizeFn = Uint32 Function(Pointer<WasmerMemory>);
+typedef WasmerMemorySizeFn = int Function(Pointer<WasmerMemory>);
+
+// wasm_memorytype_delete
+typedef NativeWasmerMemorytypeDeleteFn = Void Function(
+    Pointer<WasmerMemorytype>);
+typedef WasmerMemorytypeDeleteFn = void Function(Pointer<WasmerMemorytype>);
+
+// wasm_memorytype_new
+typedef NativeWasmerMemorytypeNewFn = Pointer<WasmerMemorytype> Function(
+    Pointer<WasmerLimits>);
+typedef WasmerMemorytypeNewFn = Pointer<WasmerMemorytype> Function(
+    Pointer<WasmerLimits>);
+
+// wasm_module_delete
+typedef NativeWasmerModuleDeleteFn = Void Function(Pointer<WasmerModule>);
+typedef WasmerModuleDeleteFn = void Function(Pointer<WasmerModule>);
+
+// wasm_module_exports
+typedef NativeWasmerModuleExportsFn = Void Function(
+    Pointer<WasmerModule>, Pointer<WasmerExporttypeVec>);
+typedef WasmerModuleExportsFn = void Function(
+    Pointer<WasmerModule>, Pointer<WasmerExporttypeVec>);
+
+// wasm_module_imports
+typedef NativeWasmerModuleImportsFn = Void Function(
+    Pointer<WasmerModule>, Pointer<WasmerImporttypeVec>);
+typedef WasmerModuleImportsFn = void Function(
+    Pointer<WasmerModule>, Pointer<WasmerImporttypeVec>);
+
+// wasm_module_new
+typedef NativeWasmerModuleNewFn = Pointer<WasmerModule> Function(
+    Pointer<WasmerStore>, Pointer<WasmerByteVec>);
+typedef WasmerModuleNewFn = Pointer<WasmerModule> Function(
+    Pointer<WasmerStore>, Pointer<WasmerByteVec>);
+
+// wasm_store_delete
+typedef NativeWasmerStoreDeleteFn = Void Function(Pointer<WasmerStore>);
+typedef WasmerStoreDeleteFn = void Function(Pointer<WasmerStore>);
+
+// wasm_store_new
+typedef NativeWasmerStoreNewFn = Pointer<WasmerStore> Function(
+    Pointer<WasmerEngine>);
+typedef WasmerStoreNewFn = Pointer<WasmerStore> Function(Pointer<WasmerEngine>);
+
+// wasm_trap_delete
+typedef NativeWasmerTrapDeleteFn = Void Function(Pointer<WasmerTrap>);
+typedef WasmerTrapDeleteFn = void Function(Pointer<WasmerTrap>);
+
+// wasm_trap_message
+typedef NativeWasmerTrapMessageFn = Void Function(
+    Pointer<WasmerTrap>, Pointer<WasmerByteVec>);
+typedef WasmerTrapMessageFn = void Function(
+    Pointer<WasmerTrap>, Pointer<WasmerByteVec>);
+
+// wasm_trap_new
+typedef NativeWasmerTrapNewFn = Pointer<WasmerTrap> Function(
+    Pointer<WasmerStore>, Pointer<WasmerByteVec>);
+typedef WasmerTrapNewFn = Pointer<WasmerTrap> Function(
+    Pointer<WasmerStore>, Pointer<WasmerByteVec>);
+
+// wasm_valtype_delete
+typedef NativeWasmerValtypeDeleteFn = Void Function(Pointer<WasmerValtype>);
+typedef WasmerValtypeDeleteFn = void Function(Pointer<WasmerValtype>);
+
+// wasm_valtype_kind
+typedef NativeWasmerValtypeKindFn = Uint8 Function(Pointer<WasmerValtype>);
+typedef WasmerValtypeKindFn = int Function(Pointer<WasmerValtype>);
+
+// wasm_valtype_vec_delete
+typedef NativeWasmerValtypeVecDeleteFn = Void Function(
+    Pointer<WasmerValtypeVec>);
+typedef WasmerValtypeVecDeleteFn = void Function(Pointer<WasmerValtypeVec>);
+
+// wasm_valtype_vec_new
+typedef NativeWasmerValtypeVecNewFn = Void Function(
+    Pointer<WasmerValtypeVec>, Uint64, Pointer<Pointer<WasmerValtype>>);
+typedef WasmerValtypeVecNewFn = void Function(
+    Pointer<WasmerValtypeVec>, int, Pointer<Pointer<WasmerValtype>>);
+
+// wasm_valtype_vec_new_empty
+typedef NativeWasmerValtypeVecNewEmptyFn = Void Function(
+    Pointer<WasmerValtypeVec>);
+typedef WasmerValtypeVecNewEmptyFn = void Function(Pointer<WasmerValtypeVec>);
+
+// wasm_valtype_vec_new_uninitialized
+typedef NativeWasmerValtypeVecNewUninitializedFn = Void Function(
+    Pointer<WasmerValtypeVec>, Uint64);
+typedef WasmerValtypeVecNewUninitializedFn = void Function(
+    Pointer<WasmerValtypeVec>, int);
+
+// wasmer_last_error_length
+typedef NativeWasmerWasmerLastErrorLengthFn = Int64 Function();
+typedef WasmerWasmerLastErrorLengthFn = int Function();
+
+// wasmer_last_error_message
+typedef NativeWasmerWasmerLastErrorMessageFn = Int64 Function(
+    Pointer<Uint8>, Int64);
+typedef WasmerWasmerLastErrorMessageFn = int Function(Pointer<Uint8>, int);
diff --git a/runtime/BUILD.gn b/runtime/BUILD.gn
index 5c2a3a9..1d06186 100644
--- a/runtime/BUILD.gn
+++ b/runtime/BUILD.gn
@@ -128,10 +128,6 @@
     include_dirs += [ "../third_party/tcmalloc/gperftools/src" ]
   }
 
-  if (dart_platform_bytecode) {
-    defines += [ "DART_USE_BYTECODE" ]
-  }
-
   if (is_fuchsia) {
     if (using_fuchsia_gn_sdk) {
       lib_dirs = [ root_out_dir + "/lib" ]
diff --git a/runtime/bin/BUILD.gn b/runtime/bin/BUILD.gn
index 88e037b..906eb34 100644
--- a/runtime/bin/BUILD.gn
+++ b/runtime/bin/BUILD.gn
@@ -663,10 +663,8 @@
 source_set("dart_kernel_platform_cc") {
   visibility = [ ":*" ]
   deps = [
-    ":gen_kernel_bytecode_dill",
     ":kernel_service_dill_linkable",
     ":platform_strong_dill_linkable",
-    "../../utils/kernel-service:kernel_service_bytecode_dill",
   ]
   sources = get_target_outputs(":kernel_service_dill_linkable") +
             get_target_outputs(":platform_strong_dill_linkable")
@@ -874,40 +872,6 @@
   sources = [ "process_test.cc" ]
 }
 
-prebuilt_dart_action("gen_kernel_bytecode_dill") {
-  deps = [ "../vm:vm_platform" ]
-  platform_dill = "$root_out_dir/vm_platform_strong.dill"
-
-  output = "$root_out_dir/gen_kernel_bytecode.dill"
-  depfile = "$target_gen_dir/gen_kernel_bytecode.dill.d"
-  outputs = [
-    output,
-    depfile,
-  ]
-
-  script = "../../pkg/vm/bin/gen_kernel.dart"
-
-  abs_depfile = rebase_path(depfile)
-  rebased_output = rebase_path(output, root_build_dir)
-
-  vm_args = [
-    "--depfile=$abs_depfile",
-    "--depfile_output_filename=$rebased_output",
-    "-Dsdk_hash=$sdk_hash",
-  ]
-
-  args = [
-    "--gen-bytecode",
-    "--drop-ast",
-    "--no-embed-sources",
-    "--platform",
-    rebase_path(platform_dill),
-    "--output",
-    rebase_path(output),
-    rebase_path(script),
-  ]
-}
-
 executable("run_vm_tests") {
   if (target_os == "fuchsia") {
     testonly = true
@@ -928,7 +892,6 @@
     ":crashpad",
     ":dart_kernel_platform_cc",
     ":dart_snapshot_cc",
-    ":gen_kernel_bytecode_dill",
     ":standalone_dart_io",
     "..:libdart_precompiler",
     "//third_party/zlib",
@@ -1065,11 +1028,12 @@
     # This file must be compiled in for dynamic linking.
     "../include/dart_api_dl.c",
 
-    # The two files here do not depend on each other.
-    # flutter/flutter integration tests will only use `ffi_test_functions.cc` -
-    # any test functionality using `dart_api.h` has to go into
-    # `ffi_test_functions_vmspecific.cc`.
+    # The three files here do not depend on each other.
+    # flutter/flutter integration tests will only use
+    # `ffi_test_functions{,_generated}.cc` - any test functionality using
+    # `dart_api.h` has to go into `ffi_test_functions_vmspecific.cc`.
     "ffi_test/ffi_test_functions.cc",
+    "ffi_test/ffi_test_functions_generated.cc",
     "ffi_test/ffi_test_functions_vmspecific.cc",
   ]
   if (is_win && current_cpu == "x64") {
diff --git a/runtime/bin/dartdev_isolate.cc b/runtime/bin/dartdev_isolate.cc
index c5a8908..0153f2f 100644
--- a/runtime/bin/dartdev_isolate.cc
+++ b/runtime/bin/dartdev_isolate.cc
@@ -145,9 +145,7 @@
 
       // If we're given a non-zero exit code, DartDev is signaling for us to
       // shutdown.
-      if (dartdev_exit_code != 0) {
-        Process::SetGlobalExitCode(dartdev_exit_code);
-      }
+      Process::SetGlobalExitCode(dartdev_exit_code);
 
       // If DartDev hasn't signaled for us to do anything else, we can assume
       // there's nothing else for the VM to run and that we can exit.
diff --git a/runtime/bin/dartutils.cc b/runtime/bin/dartutils.cc
index a47775c..4e0f338 100644
--- a/runtime/bin/dartutils.cc
+++ b/runtime/bin/dartutils.cc
@@ -905,11 +905,10 @@
   return cobject;
 }
 
-Dart_CObject* CObject::NewExternalUint8Array(
-    intptr_t length,
-    uint8_t* data,
-    void* peer,
-    Dart_WeakPersistentHandleFinalizer callback) {
+Dart_CObject* CObject::NewExternalUint8Array(intptr_t length,
+                                             uint8_t* data,
+                                             void* peer,
+                                             Dart_HandleFinalizer callback) {
   Dart_CObject* cobject = New(Dart_CObject_kExternalTypedData);
   cobject->value.as_external_typed_data.type = Dart_TypedData_kUint8;
   cobject->value.as_external_typed_data.length = length;
@@ -937,7 +936,7 @@
 void CObject::FreeIOBufferData(Dart_CObject* cobject) {
   ASSERT(cobject->type == Dart_CObject_kExternalTypedData);
   cobject->value.as_external_typed_data.callback(
-      NULL, NULL, cobject->value.as_external_typed_data.peer);
+      NULL, cobject->value.as_external_typed_data.peer);
   cobject->value.as_external_typed_data.data = NULL;
 }
 
diff --git a/runtime/bin/dartutils.h b/runtime/bin/dartutils.h
index 65ed5ae..66da23f 100644
--- a/runtime/bin/dartutils.h
+++ b/runtime/bin/dartutils.h
@@ -344,11 +344,10 @@
   static Dart_CObject* NewArray(intptr_t length);
   static Dart_CObject* NewUint8Array(intptr_t length);
   static Dart_CObject* NewUint32Array(intptr_t length);
-  static Dart_CObject* NewExternalUint8Array(
-      intptr_t length,
-      uint8_t* data,
-      void* peer,
-      Dart_WeakPersistentHandleFinalizer callback);
+  static Dart_CObject* NewExternalUint8Array(intptr_t length,
+                                             uint8_t* data,
+                                             void* peer,
+                                             Dart_HandleFinalizer callback);
 
   static Dart_CObject* NewIOBuffer(int64_t length);
   static void FreeIOBufferData(Dart_CObject* object);
@@ -571,7 +570,7 @@
   }
   uint8_t* Data() const { return cobject_->value.as_external_typed_data.data; }
   void* Peer() const { return cobject_->value.as_external_typed_data.peer; }
-  Dart_WeakPersistentHandleFinalizer Callback() const {
+  Dart_HandleFinalizer Callback() const {
     return cobject_->value.as_external_typed_data.callback;
   }
 
diff --git a/runtime/bin/ffi_test/ffi_test_functions.cc b/runtime/bin/ffi_test/ffi_test_functions.cc
index c9e39e9..3304154 100644
--- a/runtime/bin/ffi_test/ffi_test_functions.cc
+++ b/runtime/bin/ffi_test/ffi_test_functions.cc
@@ -750,12 +750,48 @@
   return retval;
 }
 
+// Can't easily share this with the generated file.
+struct Struct20BytesHomogeneousInt32Copy {
+  int32_t a0;
+  int32_t a1;
+  int32_t a2;
+  int32_t a3;
+  int32_t a4;
+};
+
+DART_EXPORT Struct20BytesHomogeneousInt32Copy PassStructRecursive(
+    int64_t recursionCounter,
+    Struct20BytesHomogeneousInt32Copy a0,
+    Struct20BytesHomogeneousInt32Copy (*f)(int64_t,
+                                           Struct20BytesHomogeneousInt32Copy)) {
+  std::cout << "PassStruct20BytesHomogeneousInt32x10"
+            << "(" << recursionCounter << ", (" << a0.a0 << ", " << a0.a1
+            << ", " << a0.a2 << ", " << a0.a3 << ", " << a0.a4 << "), "
+            << reinterpret_cast<void*>(f) << ")\n";
+  a0.a0++;
+  const int32_t a0_a0_saved = a0.a0;
+
+  if (recursionCounter <= 0) {
+    return a0;
+  }
+
+  Struct20BytesHomogeneousInt32Copy result = f(recursionCounter - 1, a0);
+  result.a0++;
+  if (a0_a0_saved != a0.a0) {
+    result.a4 = 0;
+  }
+
+  return result;
+}
+
 ////////////////////////////////////////////////////////////////////////////////
 // Tests for callbacks.
 
 // Sanity test.
 DART_EXPORT intptr_t TestSimpleAddition(intptr_t (*add)(int, int)) {
-  CHECK_EQ(add(10, 20), 30);
+  const intptr_t result = add(10, 20);
+  std::cout << "result " << result << "\n";
+  CHECK_EQ(result, 30);
   return 0;
 }
 
@@ -764,7 +800,9 @@
 
 DART_EXPORT intptr_t
 TestIntComputation(int64_t (*fn)(int8_t, int16_t, int32_t, int64_t)) {
-  CHECK_EQ(fn(125, 250, 500, 1000), 625);
+  const int64_t result = fn(125, 250, 500, 1000);
+  std::cout << "result " << result << "\n";
+  CHECK_EQ(result, 625);
   CHECK_EQ(0x7FFFFFFFFFFFFFFFLL, fn(0, 0, 0, 0x7FFFFFFFFFFFFFFFLL));
   CHECK_EQ(((int64_t)-0x8000000000000000LL),
            fn(0, 0, 0, -0x8000000000000000LL));
diff --git a/runtime/bin/ffi_test/ffi_test_functions_generated.cc b/runtime/bin/ffi_test/ffi_test_functions_generated.cc
new file mode 100644
index 0000000..74f27e4
--- /dev/null
+++ b/runtime/bin/ffi_test/ffi_test_functions_generated.cc
@@ -0,0 +1,9390 @@
+// Copyright (c) 2020, 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.
+//
+// This file has been automatically generated. Please do not edit it manually.
+
+#include <stddef.h>
+#include <stdlib.h>
+#include <sys/types.h>
+
+#include <cmath>
+#include <iostream>
+#include <limits>
+
+#if defined(_WIN32)
+#define DART_EXPORT extern "C" __declspec(dllexport)
+#else
+#define DART_EXPORT                                                            \
+  extern "C" __attribute__((visibility("default"))) __attribute((used))
+#endif
+
+namespace dart {
+
+#define CHECK(X)                                                               \
+  if (!(X)) {                                                                  \
+    fprintf(stderr, "%s\n", "Check failed: " #X);                              \
+    return 1;                                                                  \
+  }
+
+#define CHECK_EQ(X, Y) CHECK((X) == (Y))
+
+// Works for positive, negative and zero.
+#define CHECK_APPROX(EXPECTED, ACTUAL)                                         \
+  CHECK(((EXPECTED * 0.99) <= (ACTUAL) && (EXPECTED * 1.01) >= (ACTUAL)) ||    \
+        ((EXPECTED * 0.99) >= (ACTUAL) && (EXPECTED * 1.01) <= (ACTUAL)))
+
+struct Struct0Bytes {};
+
+struct Struct1ByteInt {
+  int8_t a0;
+};
+
+struct Struct3BytesHomogeneousUint8 {
+  uint8_t a0;
+  uint8_t a1;
+  uint8_t a2;
+};
+
+struct Struct3BytesInt2ByteAligned {
+  int16_t a0;
+  int8_t a1;
+};
+
+struct Struct4BytesHomogeneousInt16 {
+  int16_t a0;
+  int16_t a1;
+};
+
+struct Struct7BytesHomogeneousUint8 {
+  uint8_t a0;
+  uint8_t a1;
+  uint8_t a2;
+  uint8_t a3;
+  uint8_t a4;
+  uint8_t a5;
+  uint8_t a6;
+};
+
+struct Struct7BytesInt4ByteAligned {
+  int32_t a0;
+  int16_t a1;
+  int8_t a2;
+};
+
+struct Struct8BytesInt {
+  int16_t a0;
+  int16_t a1;
+  int32_t a2;
+};
+
+struct Struct8BytesHomogeneousFloat {
+  float a0;
+  float a1;
+};
+
+struct Struct8BytesMixed {
+  float a0;
+  int16_t a1;
+  int16_t a2;
+};
+
+struct Struct9BytesHomogeneousUint8 {
+  uint8_t a0;
+  uint8_t a1;
+  uint8_t a2;
+  uint8_t a3;
+  uint8_t a4;
+  uint8_t a5;
+  uint8_t a6;
+  uint8_t a7;
+  uint8_t a8;
+};
+
+struct Struct9BytesInt4Or8ByteAligned {
+  int64_t a0;
+  int8_t a1;
+};
+
+struct Struct12BytesHomogeneousFloat {
+  float a0;
+  float a1;
+  float a2;
+};
+
+struct Struct16BytesHomogeneousFloat {
+  float a0;
+  float a1;
+  float a2;
+  float a3;
+};
+
+struct Struct16BytesMixed {
+  double a0;
+  int64_t a1;
+};
+
+struct Struct16BytesMixed2 {
+  float a0;
+  float a1;
+  float a2;
+  int32_t a3;
+};
+
+struct Struct17BytesInt {
+  int64_t a0;
+  int64_t a1;
+  int8_t a2;
+};
+
+struct Struct19BytesHomogeneousUint8 {
+  uint8_t a0;
+  uint8_t a1;
+  uint8_t a2;
+  uint8_t a3;
+  uint8_t a4;
+  uint8_t a5;
+  uint8_t a6;
+  uint8_t a7;
+  uint8_t a8;
+  uint8_t a9;
+  uint8_t a10;
+  uint8_t a11;
+  uint8_t a12;
+  uint8_t a13;
+  uint8_t a14;
+  uint8_t a15;
+  uint8_t a16;
+  uint8_t a17;
+  uint8_t a18;
+};
+
+struct Struct20BytesHomogeneousInt32 {
+  int32_t a0;
+  int32_t a1;
+  int32_t a2;
+  int32_t a3;
+  int32_t a4;
+};
+
+struct Struct20BytesHomogeneousFloat {
+  float a0;
+  float a1;
+  float a2;
+  float a3;
+  float a4;
+};
+
+struct Struct32BytesHomogeneousDouble {
+  double a0;
+  double a1;
+  double a2;
+  double a3;
+};
+
+struct Struct40BytesHomogeneousDouble {
+  double a0;
+  double a1;
+  double a2;
+  double a3;
+  double a4;
+};
+
+struct Struct1024BytesHomogeneousUint64 {
+  uint64_t a0;
+  uint64_t a1;
+  uint64_t a2;
+  uint64_t a3;
+  uint64_t a4;
+  uint64_t a5;
+  uint64_t a6;
+  uint64_t a7;
+  uint64_t a8;
+  uint64_t a9;
+  uint64_t a10;
+  uint64_t a11;
+  uint64_t a12;
+  uint64_t a13;
+  uint64_t a14;
+  uint64_t a15;
+  uint64_t a16;
+  uint64_t a17;
+  uint64_t a18;
+  uint64_t a19;
+  uint64_t a20;
+  uint64_t a21;
+  uint64_t a22;
+  uint64_t a23;
+  uint64_t a24;
+  uint64_t a25;
+  uint64_t a26;
+  uint64_t a27;
+  uint64_t a28;
+  uint64_t a29;
+  uint64_t a30;
+  uint64_t a31;
+  uint64_t a32;
+  uint64_t a33;
+  uint64_t a34;
+  uint64_t a35;
+  uint64_t a36;
+  uint64_t a37;
+  uint64_t a38;
+  uint64_t a39;
+  uint64_t a40;
+  uint64_t a41;
+  uint64_t a42;
+  uint64_t a43;
+  uint64_t a44;
+  uint64_t a45;
+  uint64_t a46;
+  uint64_t a47;
+  uint64_t a48;
+  uint64_t a49;
+  uint64_t a50;
+  uint64_t a51;
+  uint64_t a52;
+  uint64_t a53;
+  uint64_t a54;
+  uint64_t a55;
+  uint64_t a56;
+  uint64_t a57;
+  uint64_t a58;
+  uint64_t a59;
+  uint64_t a60;
+  uint64_t a61;
+  uint64_t a62;
+  uint64_t a63;
+  uint64_t a64;
+  uint64_t a65;
+  uint64_t a66;
+  uint64_t a67;
+  uint64_t a68;
+  uint64_t a69;
+  uint64_t a70;
+  uint64_t a71;
+  uint64_t a72;
+  uint64_t a73;
+  uint64_t a74;
+  uint64_t a75;
+  uint64_t a76;
+  uint64_t a77;
+  uint64_t a78;
+  uint64_t a79;
+  uint64_t a80;
+  uint64_t a81;
+  uint64_t a82;
+  uint64_t a83;
+  uint64_t a84;
+  uint64_t a85;
+  uint64_t a86;
+  uint64_t a87;
+  uint64_t a88;
+  uint64_t a89;
+  uint64_t a90;
+  uint64_t a91;
+  uint64_t a92;
+  uint64_t a93;
+  uint64_t a94;
+  uint64_t a95;
+  uint64_t a96;
+  uint64_t a97;
+  uint64_t a98;
+  uint64_t a99;
+  uint64_t a100;
+  uint64_t a101;
+  uint64_t a102;
+  uint64_t a103;
+  uint64_t a104;
+  uint64_t a105;
+  uint64_t a106;
+  uint64_t a107;
+  uint64_t a108;
+  uint64_t a109;
+  uint64_t a110;
+  uint64_t a111;
+  uint64_t a112;
+  uint64_t a113;
+  uint64_t a114;
+  uint64_t a115;
+  uint64_t a116;
+  uint64_t a117;
+  uint64_t a118;
+  uint64_t a119;
+  uint64_t a120;
+  uint64_t a121;
+  uint64_t a122;
+  uint64_t a123;
+  uint64_t a124;
+  uint64_t a125;
+  uint64_t a126;
+  uint64_t a127;
+};
+
+struct StructAlignmentInt16 {
+  int8_t a0;
+  int16_t a1;
+  int8_t a2;
+};
+
+struct StructAlignmentInt32 {
+  int8_t a0;
+  int32_t a1;
+  int8_t a2;
+};
+
+struct StructAlignmentInt64 {
+  int8_t a0;
+  int64_t a1;
+  int8_t a2;
+};
+
+// Used for testing structs by value.
+// Smallest struct with data.
+// 10 struct arguments will exhaust available registers.
+DART_EXPORT int64_t PassStruct1ByteIntx10(Struct1ByteInt a0,
+                                          Struct1ByteInt a1,
+                                          Struct1ByteInt a2,
+                                          Struct1ByteInt a3,
+                                          Struct1ByteInt a4,
+                                          Struct1ByteInt a5,
+                                          Struct1ByteInt a6,
+                                          Struct1ByteInt a7,
+                                          Struct1ByteInt a8,
+                                          Struct1ByteInt a9) {
+  std::cout << "PassStruct1ByteIntx10"
+            << "((" << static_cast<int>(a0.a0) << "), ("
+            << static_cast<int>(a1.a0) << "), (" << static_cast<int>(a2.a0)
+            << "), (" << static_cast<int>(a3.a0) << "), ("
+            << static_cast<int>(a4.a0) << "), (" << static_cast<int>(a5.a0)
+            << "), (" << static_cast<int>(a6.a0) << "), ("
+            << static_cast<int>(a7.a0) << "), (" << static_cast<int>(a8.a0)
+            << "), (" << static_cast<int>(a9.a0) << "))"
+            << "\n";
+
+  int64_t result = 0;
+
+  result += a0.a0;
+  result += a1.a0;
+  result += a2.a0;
+  result += a3.a0;
+  result += a4.a0;
+  result += a5.a0;
+  result += a6.a0;
+  result += a7.a0;
+  result += a8.a0;
+  result += a9.a0;
+
+  std::cout << "result = " << result << "\n";
+
+  return result;
+}
+
+// Used for testing structs by value.
+// Not a multiple of word size, not a power of two.
+// 10 struct arguments will exhaust available registers.
+DART_EXPORT int64_t
+PassStruct3BytesHomogeneousUint8x10(Struct3BytesHomogeneousUint8 a0,
+                                    Struct3BytesHomogeneousUint8 a1,
+                                    Struct3BytesHomogeneousUint8 a2,
+                                    Struct3BytesHomogeneousUint8 a3,
+                                    Struct3BytesHomogeneousUint8 a4,
+                                    Struct3BytesHomogeneousUint8 a5,
+                                    Struct3BytesHomogeneousUint8 a6,
+                                    Struct3BytesHomogeneousUint8 a7,
+                                    Struct3BytesHomogeneousUint8 a8,
+                                    Struct3BytesHomogeneousUint8 a9) {
+  std::cout << "PassStruct3BytesHomogeneousUint8x10"
+            << "((" << static_cast<int>(a0.a0) << ", "
+            << static_cast<int>(a0.a1) << ", " << static_cast<int>(a0.a2)
+            << "), (" << static_cast<int>(a1.a0) << ", "
+            << static_cast<int>(a1.a1) << ", " << static_cast<int>(a1.a2)
+            << "), (" << static_cast<int>(a2.a0) << ", "
+            << static_cast<int>(a2.a1) << ", " << static_cast<int>(a2.a2)
+            << "), (" << static_cast<int>(a3.a0) << ", "
+            << static_cast<int>(a3.a1) << ", " << static_cast<int>(a3.a2)
+            << "), (" << static_cast<int>(a4.a0) << ", "
+            << static_cast<int>(a4.a1) << ", " << static_cast<int>(a4.a2)
+            << "), (" << static_cast<int>(a5.a0) << ", "
+            << static_cast<int>(a5.a1) << ", " << static_cast<int>(a5.a2)
+            << "), (" << static_cast<int>(a6.a0) << ", "
+            << static_cast<int>(a6.a1) << ", " << static_cast<int>(a6.a2)
+            << "), (" << static_cast<int>(a7.a0) << ", "
+            << static_cast<int>(a7.a1) << ", " << static_cast<int>(a7.a2)
+            << "), (" << static_cast<int>(a8.a0) << ", "
+            << static_cast<int>(a8.a1) << ", " << static_cast<int>(a8.a2)
+            << "), (" << static_cast<int>(a9.a0) << ", "
+            << static_cast<int>(a9.a1) << ", " << static_cast<int>(a9.a2)
+            << "))"
+            << "\n";
+
+  int64_t result = 0;
+
+  result += a0.a0;
+  result += a0.a1;
+  result += a0.a2;
+  result += a1.a0;
+  result += a1.a1;
+  result += a1.a2;
+  result += a2.a0;
+  result += a2.a1;
+  result += a2.a2;
+  result += a3.a0;
+  result += a3.a1;
+  result += a3.a2;
+  result += a4.a0;
+  result += a4.a1;
+  result += a4.a2;
+  result += a5.a0;
+  result += a5.a1;
+  result += a5.a2;
+  result += a6.a0;
+  result += a6.a1;
+  result += a6.a2;
+  result += a7.a0;
+  result += a7.a1;
+  result += a7.a2;
+  result += a8.a0;
+  result += a8.a1;
+  result += a8.a2;
+  result += a9.a0;
+  result += a9.a1;
+  result += a9.a2;
+
+  std::cout << "result = " << result << "\n";
+
+  return result;
+}
+
+// Used for testing structs by value.
+// Not a multiple of word size, not a power of two.
+// With alignment rules taken into account size is 4 bytes.
+// 10 struct arguments will exhaust available registers.
+DART_EXPORT int64_t
+PassStruct3BytesInt2ByteAlignedx10(Struct3BytesInt2ByteAligned a0,
+                                   Struct3BytesInt2ByteAligned a1,
+                                   Struct3BytesInt2ByteAligned a2,
+                                   Struct3BytesInt2ByteAligned a3,
+                                   Struct3BytesInt2ByteAligned a4,
+                                   Struct3BytesInt2ByteAligned a5,
+                                   Struct3BytesInt2ByteAligned a6,
+                                   Struct3BytesInt2ByteAligned a7,
+                                   Struct3BytesInt2ByteAligned a8,
+                                   Struct3BytesInt2ByteAligned a9) {
+  std::cout << "PassStruct3BytesInt2ByteAlignedx10"
+            << "((" << a0.a0 << ", " << static_cast<int>(a0.a1) << "), ("
+            << a1.a0 << ", " << static_cast<int>(a1.a1) << "), (" << a2.a0
+            << ", " << static_cast<int>(a2.a1) << "), (" << a3.a0 << ", "
+            << static_cast<int>(a3.a1) << "), (" << a4.a0 << ", "
+            << static_cast<int>(a4.a1) << "), (" << a5.a0 << ", "
+            << static_cast<int>(a5.a1) << "), (" << a6.a0 << ", "
+            << static_cast<int>(a6.a1) << "), (" << a7.a0 << ", "
+            << static_cast<int>(a7.a1) << "), (" << a8.a0 << ", "
+            << static_cast<int>(a8.a1) << "), (" << a9.a0 << ", "
+            << static_cast<int>(a9.a1) << "))"
+            << "\n";
+
+  int64_t result = 0;
+
+  result += a0.a0;
+  result += a0.a1;
+  result += a1.a0;
+  result += a1.a1;
+  result += a2.a0;
+  result += a2.a1;
+  result += a3.a0;
+  result += a3.a1;
+  result += a4.a0;
+  result += a4.a1;
+  result += a5.a0;
+  result += a5.a1;
+  result += a6.a0;
+  result += a6.a1;
+  result += a7.a0;
+  result += a7.a1;
+  result += a8.a0;
+  result += a8.a1;
+  result += a9.a0;
+  result += a9.a1;
+
+  std::cout << "result = " << result << "\n";
+
+  return result;
+}
+
+// Used for testing structs by value.
+// Exactly word size on 32-bit architectures.
+// 10 struct arguments will exhaust available registers.
+DART_EXPORT int64_t
+PassStruct4BytesHomogeneousInt16x10(Struct4BytesHomogeneousInt16 a0,
+                                    Struct4BytesHomogeneousInt16 a1,
+                                    Struct4BytesHomogeneousInt16 a2,
+                                    Struct4BytesHomogeneousInt16 a3,
+                                    Struct4BytesHomogeneousInt16 a4,
+                                    Struct4BytesHomogeneousInt16 a5,
+                                    Struct4BytesHomogeneousInt16 a6,
+                                    Struct4BytesHomogeneousInt16 a7,
+                                    Struct4BytesHomogeneousInt16 a8,
+                                    Struct4BytesHomogeneousInt16 a9) {
+  std::cout << "PassStruct4BytesHomogeneousInt16x10"
+            << "((" << a0.a0 << ", " << a0.a1 << "), (" << a1.a0 << ", "
+            << a1.a1 << "), (" << a2.a0 << ", " << a2.a1 << "), (" << a3.a0
+            << ", " << a3.a1 << "), (" << a4.a0 << ", " << a4.a1 << "), ("
+            << a5.a0 << ", " << a5.a1 << "), (" << a6.a0 << ", " << a6.a1
+            << "), (" << a7.a0 << ", " << a7.a1 << "), (" << a8.a0 << ", "
+            << a8.a1 << "), (" << a9.a0 << ", " << a9.a1 << "))"
+            << "\n";
+
+  int64_t result = 0;
+
+  result += a0.a0;
+  result += a0.a1;
+  result += a1.a0;
+  result += a1.a1;
+  result += a2.a0;
+  result += a2.a1;
+  result += a3.a0;
+  result += a3.a1;
+  result += a4.a0;
+  result += a4.a1;
+  result += a5.a0;
+  result += a5.a1;
+  result += a6.a0;
+  result += a6.a1;
+  result += a7.a0;
+  result += a7.a1;
+  result += a8.a0;
+  result += a8.a1;
+  result += a9.a0;
+  result += a9.a1;
+
+  std::cout << "result = " << result << "\n";
+
+  return result;
+}
+
+// Used for testing structs by value.
+// Sub word size on 64 bit architectures.
+// 10 struct arguments will exhaust available registers.
+DART_EXPORT int64_t
+PassStruct7BytesHomogeneousUint8x10(Struct7BytesHomogeneousUint8 a0,
+                                    Struct7BytesHomogeneousUint8 a1,
+                                    Struct7BytesHomogeneousUint8 a2,
+                                    Struct7BytesHomogeneousUint8 a3,
+                                    Struct7BytesHomogeneousUint8 a4,
+                                    Struct7BytesHomogeneousUint8 a5,
+                                    Struct7BytesHomogeneousUint8 a6,
+                                    Struct7BytesHomogeneousUint8 a7,
+                                    Struct7BytesHomogeneousUint8 a8,
+                                    Struct7BytesHomogeneousUint8 a9) {
+  std::cout
+      << "PassStruct7BytesHomogeneousUint8x10"
+      << "((" << static_cast<int>(a0.a0) << ", " << static_cast<int>(a0.a1)
+      << ", " << static_cast<int>(a0.a2) << ", " << static_cast<int>(a0.a3)
+      << ", " << static_cast<int>(a0.a4) << ", " << static_cast<int>(a0.a5)
+      << ", " << static_cast<int>(a0.a6) << "), (" << static_cast<int>(a1.a0)
+      << ", " << static_cast<int>(a1.a1) << ", " << static_cast<int>(a1.a2)
+      << ", " << static_cast<int>(a1.a3) << ", " << static_cast<int>(a1.a4)
+      << ", " << static_cast<int>(a1.a5) << ", " << static_cast<int>(a1.a6)
+      << "), (" << static_cast<int>(a2.a0) << ", " << static_cast<int>(a2.a1)
+      << ", " << static_cast<int>(a2.a2) << ", " << static_cast<int>(a2.a3)
+      << ", " << static_cast<int>(a2.a4) << ", " << static_cast<int>(a2.a5)
+      << ", " << static_cast<int>(a2.a6) << "), (" << static_cast<int>(a3.a0)
+      << ", " << static_cast<int>(a3.a1) << ", " << static_cast<int>(a3.a2)
+      << ", " << static_cast<int>(a3.a3) << ", " << static_cast<int>(a3.a4)
+      << ", " << static_cast<int>(a3.a5) << ", " << static_cast<int>(a3.a6)
+      << "), (" << static_cast<int>(a4.a0) << ", " << static_cast<int>(a4.a1)
+      << ", " << static_cast<int>(a4.a2) << ", " << static_cast<int>(a4.a3)
+      << ", " << static_cast<int>(a4.a4) << ", " << static_cast<int>(a4.a5)
+      << ", " << static_cast<int>(a4.a6) << "), (" << static_cast<int>(a5.a0)
+      << ", " << static_cast<int>(a5.a1) << ", " << static_cast<int>(a5.a2)
+      << ", " << static_cast<int>(a5.a3) << ", " << static_cast<int>(a5.a4)
+      << ", " << static_cast<int>(a5.a5) << ", " << static_cast<int>(a5.a6)
+      << "), (" << static_cast<int>(a6.a0) << ", " << static_cast<int>(a6.a1)
+      << ", " << static_cast<int>(a6.a2) << ", " << static_cast<int>(a6.a3)
+      << ", " << static_cast<int>(a6.a4) << ", " << static_cast<int>(a6.a5)
+      << ", " << static_cast<int>(a6.a6) << "), (" << static_cast<int>(a7.a0)
+      << ", " << static_cast<int>(a7.a1) << ", " << static_cast<int>(a7.a2)
+      << ", " << static_cast<int>(a7.a3) << ", " << static_cast<int>(a7.a4)
+      << ", " << static_cast<int>(a7.a5) << ", " << static_cast<int>(a7.a6)
+      << "), (" << static_cast<int>(a8.a0) << ", " << static_cast<int>(a8.a1)
+      << ", " << static_cast<int>(a8.a2) << ", " << static_cast<int>(a8.a3)
+      << ", " << static_cast<int>(a8.a4) << ", " << static_cast<int>(a8.a5)
+      << ", " << static_cast<int>(a8.a6) << "), (" << static_cast<int>(a9.a0)
+      << ", " << static_cast<int>(a9.a1) << ", " << static_cast<int>(a9.a2)
+      << ", " << static_cast<int>(a9.a3) << ", " << static_cast<int>(a9.a4)
+      << ", " << static_cast<int>(a9.a5) << ", " << static_cast<int>(a9.a6)
+      << "))"
+      << "\n";
+
+  int64_t result = 0;
+
+  result += a0.a0;
+  result += a0.a1;
+  result += a0.a2;
+  result += a0.a3;
+  result += a0.a4;
+  result += a0.a5;
+  result += a0.a6;
+  result += a1.a0;
+  result += a1.a1;
+  result += a1.a2;
+  result += a1.a3;
+  result += a1.a4;
+  result += a1.a5;
+  result += a1.a6;
+  result += a2.a0;
+  result += a2.a1;
+  result += a2.a2;
+  result += a2.a3;
+  result += a2.a4;
+  result += a2.a5;
+  result += a2.a6;
+  result += a3.a0;
+  result += a3.a1;
+  result += a3.a2;
+  result += a3.a3;
+  result += a3.a4;
+  result += a3.a5;
+  result += a3.a6;
+  result += a4.a0;
+  result += a4.a1;
+  result += a4.a2;
+  result += a4.a3;
+  result += a4.a4;
+  result += a4.a5;
+  result += a4.a6;
+  result += a5.a0;
+  result += a5.a1;
+  result += a5.a2;
+  result += a5.a3;
+  result += a5.a4;
+  result += a5.a5;
+  result += a5.a6;
+  result += a6.a0;
+  result += a6.a1;
+  result += a6.a2;
+  result += a6.a3;
+  result += a6.a4;
+  result += a6.a5;
+  result += a6.a6;
+  result += a7.a0;
+  result += a7.a1;
+  result += a7.a2;
+  result += a7.a3;
+  result += a7.a4;
+  result += a7.a5;
+  result += a7.a6;
+  result += a8.a0;
+  result += a8.a1;
+  result += a8.a2;
+  result += a8.a3;
+  result += a8.a4;
+  result += a8.a5;
+  result += a8.a6;
+  result += a9.a0;
+  result += a9.a1;
+  result += a9.a2;
+  result += a9.a3;
+  result += a9.a4;
+  result += a9.a5;
+  result += a9.a6;
+
+  std::cout << "result = " << result << "\n";
+
+  return result;
+}
+
+// Used for testing structs by value.
+// Sub word size on 64 bit architectures.
+// With alignment rules taken into account size is 8 bytes.
+// 10 struct arguments will exhaust available registers.
+DART_EXPORT int64_t
+PassStruct7BytesInt4ByteAlignedx10(Struct7BytesInt4ByteAligned a0,
+                                   Struct7BytesInt4ByteAligned a1,
+                                   Struct7BytesInt4ByteAligned a2,
+                                   Struct7BytesInt4ByteAligned a3,
+                                   Struct7BytesInt4ByteAligned a4,
+                                   Struct7BytesInt4ByteAligned a5,
+                                   Struct7BytesInt4ByteAligned a6,
+                                   Struct7BytesInt4ByteAligned a7,
+                                   Struct7BytesInt4ByteAligned a8,
+                                   Struct7BytesInt4ByteAligned a9) {
+  std::cout << "PassStruct7BytesInt4ByteAlignedx10"
+            << "((" << a0.a0 << ", " << a0.a1 << ", " << static_cast<int>(a0.a2)
+            << "), (" << a1.a0 << ", " << a1.a1 << ", "
+            << static_cast<int>(a1.a2) << "), (" << a2.a0 << ", " << a2.a1
+            << ", " << static_cast<int>(a2.a2) << "), (" << a3.a0 << ", "
+            << a3.a1 << ", " << static_cast<int>(a3.a2) << "), (" << a4.a0
+            << ", " << a4.a1 << ", " << static_cast<int>(a4.a2) << "), ("
+            << a5.a0 << ", " << a5.a1 << ", " << static_cast<int>(a5.a2)
+            << "), (" << a6.a0 << ", " << a6.a1 << ", "
+            << static_cast<int>(a6.a2) << "), (" << a7.a0 << ", " << a7.a1
+            << ", " << static_cast<int>(a7.a2) << "), (" << a8.a0 << ", "
+            << a8.a1 << ", " << static_cast<int>(a8.a2) << "), (" << a9.a0
+            << ", " << a9.a1 << ", " << static_cast<int>(a9.a2) << "))"
+            << "\n";
+
+  int64_t result = 0;
+
+  result += a0.a0;
+  result += a0.a1;
+  result += a0.a2;
+  result += a1.a0;
+  result += a1.a1;
+  result += a1.a2;
+  result += a2.a0;
+  result += a2.a1;
+  result += a2.a2;
+  result += a3.a0;
+  result += a3.a1;
+  result += a3.a2;
+  result += a4.a0;
+  result += a4.a1;
+  result += a4.a2;
+  result += a5.a0;
+  result += a5.a1;
+  result += a5.a2;
+  result += a6.a0;
+  result += a6.a1;
+  result += a6.a2;
+  result += a7.a0;
+  result += a7.a1;
+  result += a7.a2;
+  result += a8.a0;
+  result += a8.a1;
+  result += a8.a2;
+  result += a9.a0;
+  result += a9.a1;
+  result += a9.a2;
+
+  std::cout << "result = " << result << "\n";
+
+  return result;
+}
+
+// Used for testing structs by value.
+// Exactly word size struct on 64bit architectures.
+// 10 struct arguments will exhaust available registers.
+DART_EXPORT int64_t PassStruct8BytesIntx10(Struct8BytesInt a0,
+                                           Struct8BytesInt a1,
+                                           Struct8BytesInt a2,
+                                           Struct8BytesInt a3,
+                                           Struct8BytesInt a4,
+                                           Struct8BytesInt a5,
+                                           Struct8BytesInt a6,
+                                           Struct8BytesInt a7,
+                                           Struct8BytesInt a8,
+                                           Struct8BytesInt a9) {
+  std::cout << "PassStruct8BytesIntx10"
+            << "((" << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << "), ("
+            << a1.a0 << ", " << a1.a1 << ", " << a1.a2 << "), (" << a2.a0
+            << ", " << a2.a1 << ", " << a2.a2 << "), (" << a3.a0 << ", "
+            << a3.a1 << ", " << a3.a2 << "), (" << a4.a0 << ", " << a4.a1
+            << ", " << a4.a2 << "), (" << a5.a0 << ", " << a5.a1 << ", "
+            << a5.a2 << "), (" << a6.a0 << ", " << a6.a1 << ", " << a6.a2
+            << "), (" << a7.a0 << ", " << a7.a1 << ", " << a7.a2 << "), ("
+            << a8.a0 << ", " << a8.a1 << ", " << a8.a2 << "), (" << a9.a0
+            << ", " << a9.a1 << ", " << a9.a2 << "))"
+            << "\n";
+
+  int64_t result = 0;
+
+  result += a0.a0;
+  result += a0.a1;
+  result += a0.a2;
+  result += a1.a0;
+  result += a1.a1;
+  result += a1.a2;
+  result += a2.a0;
+  result += a2.a1;
+  result += a2.a2;
+  result += a3.a0;
+  result += a3.a1;
+  result += a3.a2;
+  result += a4.a0;
+  result += a4.a1;
+  result += a4.a2;
+  result += a5.a0;
+  result += a5.a1;
+  result += a5.a2;
+  result += a6.a0;
+  result += a6.a1;
+  result += a6.a2;
+  result += a7.a0;
+  result += a7.a1;
+  result += a7.a2;
+  result += a8.a0;
+  result += a8.a1;
+  result += a8.a2;
+  result += a9.a0;
+  result += a9.a1;
+  result += a9.a2;
+
+  std::cout << "result = " << result << "\n";
+
+  return result;
+}
+
+// Used for testing structs by value.
+// Arguments passed in FP registers as long as they fit.
+// 10 struct arguments will exhaust available registers.
+DART_EXPORT float PassStruct8BytesHomogeneousFloatx10(
+    Struct8BytesHomogeneousFloat a0,
+    Struct8BytesHomogeneousFloat a1,
+    Struct8BytesHomogeneousFloat a2,
+    Struct8BytesHomogeneousFloat a3,
+    Struct8BytesHomogeneousFloat a4,
+    Struct8BytesHomogeneousFloat a5,
+    Struct8BytesHomogeneousFloat a6,
+    Struct8BytesHomogeneousFloat a7,
+    Struct8BytesHomogeneousFloat a8,
+    Struct8BytesHomogeneousFloat a9) {
+  std::cout << "PassStruct8BytesHomogeneousFloatx10"
+            << "((" << a0.a0 << ", " << a0.a1 << "), (" << a1.a0 << ", "
+            << a1.a1 << "), (" << a2.a0 << ", " << a2.a1 << "), (" << a3.a0
+            << ", " << a3.a1 << "), (" << a4.a0 << ", " << a4.a1 << "), ("
+            << a5.a0 << ", " << a5.a1 << "), (" << a6.a0 << ", " << a6.a1
+            << "), (" << a7.a0 << ", " << a7.a1 << "), (" << a8.a0 << ", "
+            << a8.a1 << "), (" << a9.a0 << ", " << a9.a1 << "))"
+            << "\n";
+
+  float result = 0;
+
+  result += a0.a0;
+  result += a0.a1;
+  result += a1.a0;
+  result += a1.a1;
+  result += a2.a0;
+  result += a2.a1;
+  result += a3.a0;
+  result += a3.a1;
+  result += a4.a0;
+  result += a4.a1;
+  result += a5.a0;
+  result += a5.a1;
+  result += a6.a0;
+  result += a6.a1;
+  result += a7.a0;
+  result += a7.a1;
+  result += a8.a0;
+  result += a8.a1;
+  result += a9.a0;
+  result += a9.a1;
+
+  std::cout << "result = " << result << "\n";
+
+  return result;
+}
+
+// Used for testing structs by value.
+// On x64, arguments go in int registers because it is not only float.
+// 10 struct arguments will exhaust available registers.
+DART_EXPORT float PassStruct8BytesMixedx10(Struct8BytesMixed a0,
+                                           Struct8BytesMixed a1,
+                                           Struct8BytesMixed a2,
+                                           Struct8BytesMixed a3,
+                                           Struct8BytesMixed a4,
+                                           Struct8BytesMixed a5,
+                                           Struct8BytesMixed a6,
+                                           Struct8BytesMixed a7,
+                                           Struct8BytesMixed a8,
+                                           Struct8BytesMixed a9) {
+  std::cout << "PassStruct8BytesMixedx10"
+            << "((" << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << "), ("
+            << a1.a0 << ", " << a1.a1 << ", " << a1.a2 << "), (" << a2.a0
+            << ", " << a2.a1 << ", " << a2.a2 << "), (" << a3.a0 << ", "
+            << a3.a1 << ", " << a3.a2 << "), (" << a4.a0 << ", " << a4.a1
+            << ", " << a4.a2 << "), (" << a5.a0 << ", " << a5.a1 << ", "
+            << a5.a2 << "), (" << a6.a0 << ", " << a6.a1 << ", " << a6.a2
+            << "), (" << a7.a0 << ", " << a7.a1 << ", " << a7.a2 << "), ("
+            << a8.a0 << ", " << a8.a1 << ", " << a8.a2 << "), (" << a9.a0
+            << ", " << a9.a1 << ", " << a9.a2 << "))"
+            << "\n";
+
+  float result = 0;
+
+  result += a0.a0;
+  result += a0.a1;
+  result += a0.a2;
+  result += a1.a0;
+  result += a1.a1;
+  result += a1.a2;
+  result += a2.a0;
+  result += a2.a1;
+  result += a2.a2;
+  result += a3.a0;
+  result += a3.a1;
+  result += a3.a2;
+  result += a4.a0;
+  result += a4.a1;
+  result += a4.a2;
+  result += a5.a0;
+  result += a5.a1;
+  result += a5.a2;
+  result += a6.a0;
+  result += a6.a1;
+  result += a6.a2;
+  result += a7.a0;
+  result += a7.a1;
+  result += a7.a2;
+  result += a8.a0;
+  result += a8.a1;
+  result += a8.a2;
+  result += a9.a0;
+  result += a9.a1;
+  result += a9.a2;
+
+  std::cout << "result = " << result << "\n";
+
+  return result;
+}
+
+// Used for testing structs by value.
+// Argument is a single byte over a multiple of word size.
+// 10 struct arguments will exhaust available registers.
+// Struct only has 1-byte aligned fields to test struct alignment itself.
+// Tests upper bytes in the integer registers that are partly filled.
+// Tests stack alignment of non word size stack arguments.
+DART_EXPORT int64_t
+PassStruct9BytesHomogeneousUint8x10(Struct9BytesHomogeneousUint8 a0,
+                                    Struct9BytesHomogeneousUint8 a1,
+                                    Struct9BytesHomogeneousUint8 a2,
+                                    Struct9BytesHomogeneousUint8 a3,
+                                    Struct9BytesHomogeneousUint8 a4,
+                                    Struct9BytesHomogeneousUint8 a5,
+                                    Struct9BytesHomogeneousUint8 a6,
+                                    Struct9BytesHomogeneousUint8 a7,
+                                    Struct9BytesHomogeneousUint8 a8,
+                                    Struct9BytesHomogeneousUint8 a9) {
+  std::cout
+      << "PassStruct9BytesHomogeneousUint8x10"
+      << "((" << static_cast<int>(a0.a0) << ", " << static_cast<int>(a0.a1)
+      << ", " << static_cast<int>(a0.a2) << ", " << static_cast<int>(a0.a3)
+      << ", " << static_cast<int>(a0.a4) << ", " << static_cast<int>(a0.a5)
+      << ", " << static_cast<int>(a0.a6) << ", " << static_cast<int>(a0.a7)
+      << ", " << static_cast<int>(a0.a8) << "), (" << static_cast<int>(a1.a0)
+      << ", " << static_cast<int>(a1.a1) << ", " << static_cast<int>(a1.a2)
+      << ", " << static_cast<int>(a1.a3) << ", " << static_cast<int>(a1.a4)
+      << ", " << static_cast<int>(a1.a5) << ", " << static_cast<int>(a1.a6)
+      << ", " << static_cast<int>(a1.a7) << ", " << static_cast<int>(a1.a8)
+      << "), (" << static_cast<int>(a2.a0) << ", " << static_cast<int>(a2.a1)
+      << ", " << static_cast<int>(a2.a2) << ", " << static_cast<int>(a2.a3)
+      << ", " << static_cast<int>(a2.a4) << ", " << static_cast<int>(a2.a5)
+      << ", " << static_cast<int>(a2.a6) << ", " << static_cast<int>(a2.a7)
+      << ", " << static_cast<int>(a2.a8) << "), (" << static_cast<int>(a3.a0)
+      << ", " << static_cast<int>(a3.a1) << ", " << static_cast<int>(a3.a2)
+      << ", " << static_cast<int>(a3.a3) << ", " << static_cast<int>(a3.a4)
+      << ", " << static_cast<int>(a3.a5) << ", " << static_cast<int>(a3.a6)
+      << ", " << static_cast<int>(a3.a7) << ", " << static_cast<int>(a3.a8)
+      << "), (" << static_cast<int>(a4.a0) << ", " << static_cast<int>(a4.a1)
+      << ", " << static_cast<int>(a4.a2) << ", " << static_cast<int>(a4.a3)
+      << ", " << static_cast<int>(a4.a4) << ", " << static_cast<int>(a4.a5)
+      << ", " << static_cast<int>(a4.a6) << ", " << static_cast<int>(a4.a7)
+      << ", " << static_cast<int>(a4.a8) << "), (" << static_cast<int>(a5.a0)
+      << ", " << static_cast<int>(a5.a1) << ", " << static_cast<int>(a5.a2)
+      << ", " << static_cast<int>(a5.a3) << ", " << static_cast<int>(a5.a4)
+      << ", " << static_cast<int>(a5.a5) << ", " << static_cast<int>(a5.a6)
+      << ", " << static_cast<int>(a5.a7) << ", " << static_cast<int>(a5.a8)
+      << "), (" << static_cast<int>(a6.a0) << ", " << static_cast<int>(a6.a1)
+      << ", " << static_cast<int>(a6.a2) << ", " << static_cast<int>(a6.a3)
+      << ", " << static_cast<int>(a6.a4) << ", " << static_cast<int>(a6.a5)
+      << ", " << static_cast<int>(a6.a6) << ", " << static_cast<int>(a6.a7)
+      << ", " << static_cast<int>(a6.a8) << "), (" << static_cast<int>(a7.a0)
+      << ", " << static_cast<int>(a7.a1) << ", " << static_cast<int>(a7.a2)
+      << ", " << static_cast<int>(a7.a3) << ", " << static_cast<int>(a7.a4)
+      << ", " << static_cast<int>(a7.a5) << ", " << static_cast<int>(a7.a6)
+      << ", " << static_cast<int>(a7.a7) << ", " << static_cast<int>(a7.a8)
+      << "), (" << static_cast<int>(a8.a0) << ", " << static_cast<int>(a8.a1)
+      << ", " << static_cast<int>(a8.a2) << ", " << static_cast<int>(a8.a3)
+      << ", " << static_cast<int>(a8.a4) << ", " << static_cast<int>(a8.a5)
+      << ", " << static_cast<int>(a8.a6) << ", " << static_cast<int>(a8.a7)
+      << ", " << static_cast<int>(a8.a8) << "), (" << static_cast<int>(a9.a0)
+      << ", " << static_cast<int>(a9.a1) << ", " << static_cast<int>(a9.a2)
+      << ", " << static_cast<int>(a9.a3) << ", " << static_cast<int>(a9.a4)
+      << ", " << static_cast<int>(a9.a5) << ", " << static_cast<int>(a9.a6)
+      << ", " << static_cast<int>(a9.a7) << ", " << static_cast<int>(a9.a8)
+      << "))"
+      << "\n";
+
+  int64_t result = 0;
+
+  result += a0.a0;
+  result += a0.a1;
+  result += a0.a2;
+  result += a0.a3;
+  result += a0.a4;
+  result += a0.a5;
+  result += a0.a6;
+  result += a0.a7;
+  result += a0.a8;
+  result += a1.a0;
+  result += a1.a1;
+  result += a1.a2;
+  result += a1.a3;
+  result += a1.a4;
+  result += a1.a5;
+  result += a1.a6;
+  result += a1.a7;
+  result += a1.a8;
+  result += a2.a0;
+  result += a2.a1;
+  result += a2.a2;
+  result += a2.a3;
+  result += a2.a4;
+  result += a2.a5;
+  result += a2.a6;
+  result += a2.a7;
+  result += a2.a8;
+  result += a3.a0;
+  result += a3.a1;
+  result += a3.a2;
+  result += a3.a3;
+  result += a3.a4;
+  result += a3.a5;
+  result += a3.a6;
+  result += a3.a7;
+  result += a3.a8;
+  result += a4.a0;
+  result += a4.a1;
+  result += a4.a2;
+  result += a4.a3;
+  result += a4.a4;
+  result += a4.a5;
+  result += a4.a6;
+  result += a4.a7;
+  result += a4.a8;
+  result += a5.a0;
+  result += a5.a1;
+  result += a5.a2;
+  result += a5.a3;
+  result += a5.a4;
+  result += a5.a5;
+  result += a5.a6;
+  result += a5.a7;
+  result += a5.a8;
+  result += a6.a0;
+  result += a6.a1;
+  result += a6.a2;
+  result += a6.a3;
+  result += a6.a4;
+  result += a6.a5;
+  result += a6.a6;
+  result += a6.a7;
+  result += a6.a8;
+  result += a7.a0;
+  result += a7.a1;
+  result += a7.a2;
+  result += a7.a3;
+  result += a7.a4;
+  result += a7.a5;
+  result += a7.a6;
+  result += a7.a7;
+  result += a7.a8;
+  result += a8.a0;
+  result += a8.a1;
+  result += a8.a2;
+  result += a8.a3;
+  result += a8.a4;
+  result += a8.a5;
+  result += a8.a6;
+  result += a8.a7;
+  result += a8.a8;
+  result += a9.a0;
+  result += a9.a1;
+  result += a9.a2;
+  result += a9.a3;
+  result += a9.a4;
+  result += a9.a5;
+  result += a9.a6;
+  result += a9.a7;
+  result += a9.a8;
+
+  std::cout << "result = " << result << "\n";
+
+  return result;
+}
+
+// Used for testing structs by value.
+// Argument is a single byte over a multiple of word size.
+// With alignment rules taken into account size is 12 or 16 bytes.
+// 10 struct arguments will exhaust available registers.
+//
+DART_EXPORT int64_t
+PassStruct9BytesInt4Or8ByteAlignedx10(Struct9BytesInt4Or8ByteAligned a0,
+                                      Struct9BytesInt4Or8ByteAligned a1,
+                                      Struct9BytesInt4Or8ByteAligned a2,
+                                      Struct9BytesInt4Or8ByteAligned a3,
+                                      Struct9BytesInt4Or8ByteAligned a4,
+                                      Struct9BytesInt4Or8ByteAligned a5,
+                                      Struct9BytesInt4Or8ByteAligned a6,
+                                      Struct9BytesInt4Or8ByteAligned a7,
+                                      Struct9BytesInt4Or8ByteAligned a8,
+                                      Struct9BytesInt4Or8ByteAligned a9) {
+  std::cout << "PassStruct9BytesInt4Or8ByteAlignedx10"
+            << "((" << a0.a0 << ", " << static_cast<int>(a0.a1) << "), ("
+            << a1.a0 << ", " << static_cast<int>(a1.a1) << "), (" << a2.a0
+            << ", " << static_cast<int>(a2.a1) << "), (" << a3.a0 << ", "
+            << static_cast<int>(a3.a1) << "), (" << a4.a0 << ", "
+            << static_cast<int>(a4.a1) << "), (" << a5.a0 << ", "
+            << static_cast<int>(a5.a1) << "), (" << a6.a0 << ", "
+            << static_cast<int>(a6.a1) << "), (" << a7.a0 << ", "
+            << static_cast<int>(a7.a1) << "), (" << a8.a0 << ", "
+            << static_cast<int>(a8.a1) << "), (" << a9.a0 << ", "
+            << static_cast<int>(a9.a1) << "))"
+            << "\n";
+
+  int64_t result = 0;
+
+  result += a0.a0;
+  result += a0.a1;
+  result += a1.a0;
+  result += a1.a1;
+  result += a2.a0;
+  result += a2.a1;
+  result += a3.a0;
+  result += a3.a1;
+  result += a4.a0;
+  result += a4.a1;
+  result += a5.a0;
+  result += a5.a1;
+  result += a6.a0;
+  result += a6.a1;
+  result += a7.a0;
+  result += a7.a1;
+  result += a8.a0;
+  result += a8.a1;
+  result += a9.a0;
+  result += a9.a1;
+
+  std::cout << "result = " << result << "\n";
+
+  return result;
+}
+
+// Used for testing structs by value.
+// Arguments in FPU registers on arm hardfp and arm64.
+// Struct arguments will exhaust available registers, and leave some empty.
+// The last argument is to test whether arguments are backfilled.
+DART_EXPORT float PassStruct12BytesHomogeneousFloatx6(
+    Struct12BytesHomogeneousFloat a0,
+    Struct12BytesHomogeneousFloat a1,
+    Struct12BytesHomogeneousFloat a2,
+    Struct12BytesHomogeneousFloat a3,
+    Struct12BytesHomogeneousFloat a4,
+    Struct12BytesHomogeneousFloat a5) {
+  std::cout << "PassStruct12BytesHomogeneousFloatx6"
+            << "((" << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << "), ("
+            << a1.a0 << ", " << a1.a1 << ", " << a1.a2 << "), (" << a2.a0
+            << ", " << a2.a1 << ", " << a2.a2 << "), (" << a3.a0 << ", "
+            << a3.a1 << ", " << a3.a2 << "), (" << a4.a0 << ", " << a4.a1
+            << ", " << a4.a2 << "), (" << a5.a0 << ", " << a5.a1 << ", "
+            << a5.a2 << "))"
+            << "\n";
+
+  float result = 0;
+
+  result += a0.a0;
+  result += a0.a1;
+  result += a0.a2;
+  result += a1.a0;
+  result += a1.a1;
+  result += a1.a2;
+  result += a2.a0;
+  result += a2.a1;
+  result += a2.a2;
+  result += a3.a0;
+  result += a3.a1;
+  result += a3.a2;
+  result += a4.a0;
+  result += a4.a1;
+  result += a4.a2;
+  result += a5.a0;
+  result += a5.a1;
+  result += a5.a2;
+
+  std::cout << "result = " << result << "\n";
+
+  return result;
+}
+
+// Used for testing structs by value.
+// On Linux x64 argument is transferred on stack because it is over 16 bytes.
+// Arguments in FPU registers on arm hardfp and arm64.
+// 5 struct arguments will exhaust available registers.
+DART_EXPORT float PassStruct16BytesHomogeneousFloatx5(
+    Struct16BytesHomogeneousFloat a0,
+    Struct16BytesHomogeneousFloat a1,
+    Struct16BytesHomogeneousFloat a2,
+    Struct16BytesHomogeneousFloat a3,
+    Struct16BytesHomogeneousFloat a4) {
+  std::cout << "PassStruct16BytesHomogeneousFloatx5"
+            << "((" << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << ", " << a0.a3
+            << "), (" << a1.a0 << ", " << a1.a1 << ", " << a1.a2 << ", "
+            << a1.a3 << "), (" << a2.a0 << ", " << a2.a1 << ", " << a2.a2
+            << ", " << a2.a3 << "), (" << a3.a0 << ", " << a3.a1 << ", "
+            << a3.a2 << ", " << a3.a3 << "), (" << a4.a0 << ", " << a4.a1
+            << ", " << a4.a2 << ", " << a4.a3 << "))"
+            << "\n";
+
+  float result = 0;
+
+  result += a0.a0;
+  result += a0.a1;
+  result += a0.a2;
+  result += a0.a3;
+  result += a1.a0;
+  result += a1.a1;
+  result += a1.a2;
+  result += a1.a3;
+  result += a2.a0;
+  result += a2.a1;
+  result += a2.a2;
+  result += a2.a3;
+  result += a3.a0;
+  result += a3.a1;
+  result += a3.a2;
+  result += a3.a3;
+  result += a4.a0;
+  result += a4.a1;
+  result += a4.a2;
+  result += a4.a3;
+
+  std::cout << "result = " << result << "\n";
+
+  return result;
+}
+
+// Used for testing structs by value.
+// On x64, arguments are split over FP and int registers.
+// On x64, it will exhaust the integer registers with the 6th argument.
+// The rest goes on the stack.
+// On arm, arguments are 8 byte aligned.
+DART_EXPORT double PassStruct16BytesMixedx10(Struct16BytesMixed a0,
+                                             Struct16BytesMixed a1,
+                                             Struct16BytesMixed a2,
+                                             Struct16BytesMixed a3,
+                                             Struct16BytesMixed a4,
+                                             Struct16BytesMixed a5,
+                                             Struct16BytesMixed a6,
+                                             Struct16BytesMixed a7,
+                                             Struct16BytesMixed a8,
+                                             Struct16BytesMixed a9) {
+  std::cout << "PassStruct16BytesMixedx10"
+            << "((" << a0.a0 << ", " << a0.a1 << "), (" << a1.a0 << ", "
+            << a1.a1 << "), (" << a2.a0 << ", " << a2.a1 << "), (" << a3.a0
+            << ", " << a3.a1 << "), (" << a4.a0 << ", " << a4.a1 << "), ("
+            << a5.a0 << ", " << a5.a1 << "), (" << a6.a0 << ", " << a6.a1
+            << "), (" << a7.a0 << ", " << a7.a1 << "), (" << a8.a0 << ", "
+            << a8.a1 << "), (" << a9.a0 << ", " << a9.a1 << "))"
+            << "\n";
+
+  double result = 0;
+
+  result += a0.a0;
+  result += a0.a1;
+  result += a1.a0;
+  result += a1.a1;
+  result += a2.a0;
+  result += a2.a1;
+  result += a3.a0;
+  result += a3.a1;
+  result += a4.a0;
+  result += a4.a1;
+  result += a5.a0;
+  result += a5.a1;
+  result += a6.a0;
+  result += a6.a1;
+  result += a7.a0;
+  result += a7.a1;
+  result += a8.a0;
+  result += a8.a1;
+  result += a9.a0;
+  result += a9.a1;
+
+  std::cout << "result = " << result << "\n";
+
+  return result;
+}
+
+// Used for testing structs by value.
+// On x64, arguments are split over FP and int registers.
+// On x64, it will exhaust the integer registers with the 6th argument.
+// The rest goes on the stack.
+// On arm, arguments are 4 byte aligned.
+DART_EXPORT float PassStruct16BytesMixed2x10(Struct16BytesMixed2 a0,
+                                             Struct16BytesMixed2 a1,
+                                             Struct16BytesMixed2 a2,
+                                             Struct16BytesMixed2 a3,
+                                             Struct16BytesMixed2 a4,
+                                             Struct16BytesMixed2 a5,
+                                             Struct16BytesMixed2 a6,
+                                             Struct16BytesMixed2 a7,
+                                             Struct16BytesMixed2 a8,
+                                             Struct16BytesMixed2 a9) {
+  std::cout << "PassStruct16BytesMixed2x10"
+            << "((" << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << ", " << a0.a3
+            << "), (" << a1.a0 << ", " << a1.a1 << ", " << a1.a2 << ", "
+            << a1.a3 << "), (" << a2.a0 << ", " << a2.a1 << ", " << a2.a2
+            << ", " << a2.a3 << "), (" << a3.a0 << ", " << a3.a1 << ", "
+            << a3.a2 << ", " << a3.a3 << "), (" << a4.a0 << ", " << a4.a1
+            << ", " << a4.a2 << ", " << a4.a3 << "), (" << a5.a0 << ", "
+            << a5.a1 << ", " << a5.a2 << ", " << a5.a3 << "), (" << a6.a0
+            << ", " << a6.a1 << ", " << a6.a2 << ", " << a6.a3 << "), ("
+            << a7.a0 << ", " << a7.a1 << ", " << a7.a2 << ", " << a7.a3
+            << "), (" << a8.a0 << ", " << a8.a1 << ", " << a8.a2 << ", "
+            << a8.a3 << "), (" << a9.a0 << ", " << a9.a1 << ", " << a9.a2
+            << ", " << a9.a3 << "))"
+            << "\n";
+
+  float result = 0;
+
+  result += a0.a0;
+  result += a0.a1;
+  result += a0.a2;
+  result += a0.a3;
+  result += a1.a0;
+  result += a1.a1;
+  result += a1.a2;
+  result += a1.a3;
+  result += a2.a0;
+  result += a2.a1;
+  result += a2.a2;
+  result += a2.a3;
+  result += a3.a0;
+  result += a3.a1;
+  result += a3.a2;
+  result += a3.a3;
+  result += a4.a0;
+  result += a4.a1;
+  result += a4.a2;
+  result += a4.a3;
+  result += a5.a0;
+  result += a5.a1;
+  result += a5.a2;
+  result += a5.a3;
+  result += a6.a0;
+  result += a6.a1;
+  result += a6.a2;
+  result += a6.a3;
+  result += a7.a0;
+  result += a7.a1;
+  result += a7.a2;
+  result += a7.a3;
+  result += a8.a0;
+  result += a8.a1;
+  result += a8.a2;
+  result += a8.a3;
+  result += a9.a0;
+  result += a9.a1;
+  result += a9.a2;
+  result += a9.a3;
+
+  std::cout << "result = " << result << "\n";
+
+  return result;
+}
+
+// Used for testing structs by value.
+// Arguments are passed as pointer to copy on arm64.
+// Tests that the memory allocated for copies are rounded up to word size.
+DART_EXPORT int64_t PassStruct17BytesIntx10(Struct17BytesInt a0,
+                                            Struct17BytesInt a1,
+                                            Struct17BytesInt a2,
+                                            Struct17BytesInt a3,
+                                            Struct17BytesInt a4,
+                                            Struct17BytesInt a5,
+                                            Struct17BytesInt a6,
+                                            Struct17BytesInt a7,
+                                            Struct17BytesInt a8,
+                                            Struct17BytesInt a9) {
+  std::cout << "PassStruct17BytesIntx10"
+            << "((" << a0.a0 << ", " << a0.a1 << ", " << static_cast<int>(a0.a2)
+            << "), (" << a1.a0 << ", " << a1.a1 << ", "
+            << static_cast<int>(a1.a2) << "), (" << a2.a0 << ", " << a2.a1
+            << ", " << static_cast<int>(a2.a2) << "), (" << a3.a0 << ", "
+            << a3.a1 << ", " << static_cast<int>(a3.a2) << "), (" << a4.a0
+            << ", " << a4.a1 << ", " << static_cast<int>(a4.a2) << "), ("
+            << a5.a0 << ", " << a5.a1 << ", " << static_cast<int>(a5.a2)
+            << "), (" << a6.a0 << ", " << a6.a1 << ", "
+            << static_cast<int>(a6.a2) << "), (" << a7.a0 << ", " << a7.a1
+            << ", " << static_cast<int>(a7.a2) << "), (" << a8.a0 << ", "
+            << a8.a1 << ", " << static_cast<int>(a8.a2) << "), (" << a9.a0
+            << ", " << a9.a1 << ", " << static_cast<int>(a9.a2) << "))"
+            << "\n";
+
+  int64_t result = 0;
+
+  result += a0.a0;
+  result += a0.a1;
+  result += a0.a2;
+  result += a1.a0;
+  result += a1.a1;
+  result += a1.a2;
+  result += a2.a0;
+  result += a2.a1;
+  result += a2.a2;
+  result += a3.a0;
+  result += a3.a1;
+  result += a3.a2;
+  result += a4.a0;
+  result += a4.a1;
+  result += a4.a2;
+  result += a5.a0;
+  result += a5.a1;
+  result += a5.a2;
+  result += a6.a0;
+  result += a6.a1;
+  result += a6.a2;
+  result += a7.a0;
+  result += a7.a1;
+  result += a7.a2;
+  result += a8.a0;
+  result += a8.a1;
+  result += a8.a2;
+  result += a9.a0;
+  result += a9.a1;
+  result += a9.a2;
+
+  std::cout << "result = " << result << "\n";
+
+  return result;
+}
+
+// Used for testing structs by value.
+// The minimum alignment of this struct is only 1 byte based on its fields.
+// Test that the memory backing these structs is extended to the right size.
+//
+DART_EXPORT int64_t
+PassStruct19BytesHomogeneousUint8x10(Struct19BytesHomogeneousUint8 a0,
+                                     Struct19BytesHomogeneousUint8 a1,
+                                     Struct19BytesHomogeneousUint8 a2,
+                                     Struct19BytesHomogeneousUint8 a3,
+                                     Struct19BytesHomogeneousUint8 a4,
+                                     Struct19BytesHomogeneousUint8 a5,
+                                     Struct19BytesHomogeneousUint8 a6,
+                                     Struct19BytesHomogeneousUint8 a7,
+                                     Struct19BytesHomogeneousUint8 a8,
+                                     Struct19BytesHomogeneousUint8 a9) {
+  std::cout
+      << "PassStruct19BytesHomogeneousUint8x10"
+      << "((" << static_cast<int>(a0.a0) << ", " << static_cast<int>(a0.a1)
+      << ", " << static_cast<int>(a0.a2) << ", " << static_cast<int>(a0.a3)
+      << ", " << static_cast<int>(a0.a4) << ", " << static_cast<int>(a0.a5)
+      << ", " << static_cast<int>(a0.a6) << ", " << static_cast<int>(a0.a7)
+      << ", " << static_cast<int>(a0.a8) << ", " << static_cast<int>(a0.a9)
+      << ", " << static_cast<int>(a0.a10) << ", " << static_cast<int>(a0.a11)
+      << ", " << static_cast<int>(a0.a12) << ", " << static_cast<int>(a0.a13)
+      << ", " << static_cast<int>(a0.a14) << ", " << static_cast<int>(a0.a15)
+      << ", " << static_cast<int>(a0.a16) << ", " << static_cast<int>(a0.a17)
+      << ", " << static_cast<int>(a0.a18) << "), (" << static_cast<int>(a1.a0)
+      << ", " << static_cast<int>(a1.a1) << ", " << static_cast<int>(a1.a2)
+      << ", " << static_cast<int>(a1.a3) << ", " << static_cast<int>(a1.a4)
+      << ", " << static_cast<int>(a1.a5) << ", " << static_cast<int>(a1.a6)
+      << ", " << static_cast<int>(a1.a7) << ", " << static_cast<int>(a1.a8)
+      << ", " << static_cast<int>(a1.a9) << ", " << static_cast<int>(a1.a10)
+      << ", " << static_cast<int>(a1.a11) << ", " << static_cast<int>(a1.a12)
+      << ", " << static_cast<int>(a1.a13) << ", " << static_cast<int>(a1.a14)
+      << ", " << static_cast<int>(a1.a15) << ", " << static_cast<int>(a1.a16)
+      << ", " << static_cast<int>(a1.a17) << ", " << static_cast<int>(a1.a18)
+      << "), (" << static_cast<int>(a2.a0) << ", " << static_cast<int>(a2.a1)
+      << ", " << static_cast<int>(a2.a2) << ", " << static_cast<int>(a2.a3)
+      << ", " << static_cast<int>(a2.a4) << ", " << static_cast<int>(a2.a5)
+      << ", " << static_cast<int>(a2.a6) << ", " << static_cast<int>(a2.a7)
+      << ", " << static_cast<int>(a2.a8) << ", " << static_cast<int>(a2.a9)
+      << ", " << static_cast<int>(a2.a10) << ", " << static_cast<int>(a2.a11)
+      << ", " << static_cast<int>(a2.a12) << ", " << static_cast<int>(a2.a13)
+      << ", " << static_cast<int>(a2.a14) << ", " << static_cast<int>(a2.a15)
+      << ", " << static_cast<int>(a2.a16) << ", " << static_cast<int>(a2.a17)
+      << ", " << static_cast<int>(a2.a18) << "), (" << static_cast<int>(a3.a0)
+      << ", " << static_cast<int>(a3.a1) << ", " << static_cast<int>(a3.a2)
+      << ", " << static_cast<int>(a3.a3) << ", " << static_cast<int>(a3.a4)
+      << ", " << static_cast<int>(a3.a5) << ", " << static_cast<int>(a3.a6)
+      << ", " << static_cast<int>(a3.a7) << ", " << static_cast<int>(a3.a8)
+      << ", " << static_cast<int>(a3.a9) << ", " << static_cast<int>(a3.a10)
+      << ", " << static_cast<int>(a3.a11) << ", " << static_cast<int>(a3.a12)
+      << ", " << static_cast<int>(a3.a13) << ", " << static_cast<int>(a3.a14)
+      << ", " << static_cast<int>(a3.a15) << ", " << static_cast<int>(a3.a16)
+      << ", " << static_cast<int>(a3.a17) << ", " << static_cast<int>(a3.a18)
+      << "), (" << static_cast<int>(a4.a0) << ", " << static_cast<int>(a4.a1)
+      << ", " << static_cast<int>(a4.a2) << ", " << static_cast<int>(a4.a3)
+      << ", " << static_cast<int>(a4.a4) << ", " << static_cast<int>(a4.a5)
+      << ", " << static_cast<int>(a4.a6) << ", " << static_cast<int>(a4.a7)
+      << ", " << static_cast<int>(a4.a8) << ", " << static_cast<int>(a4.a9)
+      << ", " << static_cast<int>(a4.a10) << ", " << static_cast<int>(a4.a11)
+      << ", " << static_cast<int>(a4.a12) << ", " << static_cast<int>(a4.a13)
+      << ", " << static_cast<int>(a4.a14) << ", " << static_cast<int>(a4.a15)
+      << ", " << static_cast<int>(a4.a16) << ", " << static_cast<int>(a4.a17)
+      << ", " << static_cast<int>(a4.a18) << "), (" << static_cast<int>(a5.a0)
+      << ", " << static_cast<int>(a5.a1) << ", " << static_cast<int>(a5.a2)
+      << ", " << static_cast<int>(a5.a3) << ", " << static_cast<int>(a5.a4)
+      << ", " << static_cast<int>(a5.a5) << ", " << static_cast<int>(a5.a6)
+      << ", " << static_cast<int>(a5.a7) << ", " << static_cast<int>(a5.a8)
+      << ", " << static_cast<int>(a5.a9) << ", " << static_cast<int>(a5.a10)
+      << ", " << static_cast<int>(a5.a11) << ", " << static_cast<int>(a5.a12)
+      << ", " << static_cast<int>(a5.a13) << ", " << static_cast<int>(a5.a14)
+      << ", " << static_cast<int>(a5.a15) << ", " << static_cast<int>(a5.a16)
+      << ", " << static_cast<int>(a5.a17) << ", " << static_cast<int>(a5.a18)
+      << "), (" << static_cast<int>(a6.a0) << ", " << static_cast<int>(a6.a1)
+      << ", " << static_cast<int>(a6.a2) << ", " << static_cast<int>(a6.a3)
+      << ", " << static_cast<int>(a6.a4) << ", " << static_cast<int>(a6.a5)
+      << ", " << static_cast<int>(a6.a6) << ", " << static_cast<int>(a6.a7)
+      << ", " << static_cast<int>(a6.a8) << ", " << static_cast<int>(a6.a9)
+      << ", " << static_cast<int>(a6.a10) << ", " << static_cast<int>(a6.a11)
+      << ", " << static_cast<int>(a6.a12) << ", " << static_cast<int>(a6.a13)
+      << ", " << static_cast<int>(a6.a14) << ", " << static_cast<int>(a6.a15)
+      << ", " << static_cast<int>(a6.a16) << ", " << static_cast<int>(a6.a17)
+      << ", " << static_cast<int>(a6.a18) << "), (" << static_cast<int>(a7.a0)
+      << ", " << static_cast<int>(a7.a1) << ", " << static_cast<int>(a7.a2)
+      << ", " << static_cast<int>(a7.a3) << ", " << static_cast<int>(a7.a4)
+      << ", " << static_cast<int>(a7.a5) << ", " << static_cast<int>(a7.a6)
+      << ", " << static_cast<int>(a7.a7) << ", " << static_cast<int>(a7.a8)
+      << ", " << static_cast<int>(a7.a9) << ", " << static_cast<int>(a7.a10)
+      << ", " << static_cast<int>(a7.a11) << ", " << static_cast<int>(a7.a12)
+      << ", " << static_cast<int>(a7.a13) << ", " << static_cast<int>(a7.a14)
+      << ", " << static_cast<int>(a7.a15) << ", " << static_cast<int>(a7.a16)
+      << ", " << static_cast<int>(a7.a17) << ", " << static_cast<int>(a7.a18)
+      << "), (" << static_cast<int>(a8.a0) << ", " << static_cast<int>(a8.a1)
+      << ", " << static_cast<int>(a8.a2) << ", " << static_cast<int>(a8.a3)
+      << ", " << static_cast<int>(a8.a4) << ", " << static_cast<int>(a8.a5)
+      << ", " << static_cast<int>(a8.a6) << ", " << static_cast<int>(a8.a7)
+      << ", " << static_cast<int>(a8.a8) << ", " << static_cast<int>(a8.a9)
+      << ", " << static_cast<int>(a8.a10) << ", " << static_cast<int>(a8.a11)
+      << ", " << static_cast<int>(a8.a12) << ", " << static_cast<int>(a8.a13)
+      << ", " << static_cast<int>(a8.a14) << ", " << static_cast<int>(a8.a15)
+      << ", " << static_cast<int>(a8.a16) << ", " << static_cast<int>(a8.a17)
+      << ", " << static_cast<int>(a8.a18) << "), (" << static_cast<int>(a9.a0)
+      << ", " << static_cast<int>(a9.a1) << ", " << static_cast<int>(a9.a2)
+      << ", " << static_cast<int>(a9.a3) << ", " << static_cast<int>(a9.a4)
+      << ", " << static_cast<int>(a9.a5) << ", " << static_cast<int>(a9.a6)
+      << ", " << static_cast<int>(a9.a7) << ", " << static_cast<int>(a9.a8)
+      << ", " << static_cast<int>(a9.a9) << ", " << static_cast<int>(a9.a10)
+      << ", " << static_cast<int>(a9.a11) << ", " << static_cast<int>(a9.a12)
+      << ", " << static_cast<int>(a9.a13) << ", " << static_cast<int>(a9.a14)
+      << ", " << static_cast<int>(a9.a15) << ", " << static_cast<int>(a9.a16)
+      << ", " << static_cast<int>(a9.a17) << ", " << static_cast<int>(a9.a18)
+      << "))"
+      << "\n";
+
+  int64_t result = 0;
+
+  result += a0.a0;
+  result += a0.a1;
+  result += a0.a2;
+  result += a0.a3;
+  result += a0.a4;
+  result += a0.a5;
+  result += a0.a6;
+  result += a0.a7;
+  result += a0.a8;
+  result += a0.a9;
+  result += a0.a10;
+  result += a0.a11;
+  result += a0.a12;
+  result += a0.a13;
+  result += a0.a14;
+  result += a0.a15;
+  result += a0.a16;
+  result += a0.a17;
+  result += a0.a18;
+  result += a1.a0;
+  result += a1.a1;
+  result += a1.a2;
+  result += a1.a3;
+  result += a1.a4;
+  result += a1.a5;
+  result += a1.a6;
+  result += a1.a7;
+  result += a1.a8;
+  result += a1.a9;
+  result += a1.a10;
+  result += a1.a11;
+  result += a1.a12;
+  result += a1.a13;
+  result += a1.a14;
+  result += a1.a15;
+  result += a1.a16;
+  result += a1.a17;
+  result += a1.a18;
+  result += a2.a0;
+  result += a2.a1;
+  result += a2.a2;
+  result += a2.a3;
+  result += a2.a4;
+  result += a2.a5;
+  result += a2.a6;
+  result += a2.a7;
+  result += a2.a8;
+  result += a2.a9;
+  result += a2.a10;
+  result += a2.a11;
+  result += a2.a12;
+  result += a2.a13;
+  result += a2.a14;
+  result += a2.a15;
+  result += a2.a16;
+  result += a2.a17;
+  result += a2.a18;
+  result += a3.a0;
+  result += a3.a1;
+  result += a3.a2;
+  result += a3.a3;
+  result += a3.a4;
+  result += a3.a5;
+  result += a3.a6;
+  result += a3.a7;
+  result += a3.a8;
+  result += a3.a9;
+  result += a3.a10;
+  result += a3.a11;
+  result += a3.a12;
+  result += a3.a13;
+  result += a3.a14;
+  result += a3.a15;
+  result += a3.a16;
+  result += a3.a17;
+  result += a3.a18;
+  result += a4.a0;
+  result += a4.a1;
+  result += a4.a2;
+  result += a4.a3;
+  result += a4.a4;
+  result += a4.a5;
+  result += a4.a6;
+  result += a4.a7;
+  result += a4.a8;
+  result += a4.a9;
+  result += a4.a10;
+  result += a4.a11;
+  result += a4.a12;
+  result += a4.a13;
+  result += a4.a14;
+  result += a4.a15;
+  result += a4.a16;
+  result += a4.a17;
+  result += a4.a18;
+  result += a5.a0;
+  result += a5.a1;
+  result += a5.a2;
+  result += a5.a3;
+  result += a5.a4;
+  result += a5.a5;
+  result += a5.a6;
+  result += a5.a7;
+  result += a5.a8;
+  result += a5.a9;
+  result += a5.a10;
+  result += a5.a11;
+  result += a5.a12;
+  result += a5.a13;
+  result += a5.a14;
+  result += a5.a15;
+  result += a5.a16;
+  result += a5.a17;
+  result += a5.a18;
+  result += a6.a0;
+  result += a6.a1;
+  result += a6.a2;
+  result += a6.a3;
+  result += a6.a4;
+  result += a6.a5;
+  result += a6.a6;
+  result += a6.a7;
+  result += a6.a8;
+  result += a6.a9;
+  result += a6.a10;
+  result += a6.a11;
+  result += a6.a12;
+  result += a6.a13;
+  result += a6.a14;
+  result += a6.a15;
+  result += a6.a16;
+  result += a6.a17;
+  result += a6.a18;
+  result += a7.a0;
+  result += a7.a1;
+  result += a7.a2;
+  result += a7.a3;
+  result += a7.a4;
+  result += a7.a5;
+  result += a7.a6;
+  result += a7.a7;
+  result += a7.a8;
+  result += a7.a9;
+  result += a7.a10;
+  result += a7.a11;
+  result += a7.a12;
+  result += a7.a13;
+  result += a7.a14;
+  result += a7.a15;
+  result += a7.a16;
+  result += a7.a17;
+  result += a7.a18;
+  result += a8.a0;
+  result += a8.a1;
+  result += a8.a2;
+  result += a8.a3;
+  result += a8.a4;
+  result += a8.a5;
+  result += a8.a6;
+  result += a8.a7;
+  result += a8.a8;
+  result += a8.a9;
+  result += a8.a10;
+  result += a8.a11;
+  result += a8.a12;
+  result += a8.a13;
+  result += a8.a14;
+  result += a8.a15;
+  result += a8.a16;
+  result += a8.a17;
+  result += a8.a18;
+  result += a9.a0;
+  result += a9.a1;
+  result += a9.a2;
+  result += a9.a3;
+  result += a9.a4;
+  result += a9.a5;
+  result += a9.a6;
+  result += a9.a7;
+  result += a9.a8;
+  result += a9.a9;
+  result += a9.a10;
+  result += a9.a11;
+  result += a9.a12;
+  result += a9.a13;
+  result += a9.a14;
+  result += a9.a15;
+  result += a9.a16;
+  result += a9.a17;
+  result += a9.a18;
+
+  std::cout << "result = " << result << "\n";
+
+  return result;
+}
+
+// Used for testing structs by value.
+// Argument too big to go into integer registers on arm64.
+// The arguments are passed as pointers to copies.
+// The amount of arguments exhausts the number of integer registers, such that
+// pointers to copies are also passed on the stack.
+DART_EXPORT int32_t
+PassStruct20BytesHomogeneousInt32x10(Struct20BytesHomogeneousInt32 a0,
+                                     Struct20BytesHomogeneousInt32 a1,
+                                     Struct20BytesHomogeneousInt32 a2,
+                                     Struct20BytesHomogeneousInt32 a3,
+                                     Struct20BytesHomogeneousInt32 a4,
+                                     Struct20BytesHomogeneousInt32 a5,
+                                     Struct20BytesHomogeneousInt32 a6,
+                                     Struct20BytesHomogeneousInt32 a7,
+                                     Struct20BytesHomogeneousInt32 a8,
+                                     Struct20BytesHomogeneousInt32 a9) {
+  std::cout << "PassStruct20BytesHomogeneousInt32x10"
+            << "((" << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << ", " << a0.a3
+            << ", " << a0.a4 << "), (" << a1.a0 << ", " << a1.a1 << ", "
+            << a1.a2 << ", " << a1.a3 << ", " << a1.a4 << "), (" << a2.a0
+            << ", " << a2.a1 << ", " << a2.a2 << ", " << a2.a3 << ", " << a2.a4
+            << "), (" << a3.a0 << ", " << a3.a1 << ", " << a3.a2 << ", "
+            << a3.a3 << ", " << a3.a4 << "), (" << a4.a0 << ", " << a4.a1
+            << ", " << a4.a2 << ", " << a4.a3 << ", " << a4.a4 << "), ("
+            << a5.a0 << ", " << a5.a1 << ", " << a5.a2 << ", " << a5.a3 << ", "
+            << a5.a4 << "), (" << a6.a0 << ", " << a6.a1 << ", " << a6.a2
+            << ", " << a6.a3 << ", " << a6.a4 << "), (" << a7.a0 << ", "
+            << a7.a1 << ", " << a7.a2 << ", " << a7.a3 << ", " << a7.a4
+            << "), (" << a8.a0 << ", " << a8.a1 << ", " << a8.a2 << ", "
+            << a8.a3 << ", " << a8.a4 << "), (" << a9.a0 << ", " << a9.a1
+            << ", " << a9.a2 << ", " << a9.a3 << ", " << a9.a4 << "))"
+            << "\n";
+
+  int32_t result = 0;
+
+  result += a0.a0;
+  result += a0.a1;
+  result += a0.a2;
+  result += a0.a3;
+  result += a0.a4;
+  result += a1.a0;
+  result += a1.a1;
+  result += a1.a2;
+  result += a1.a3;
+  result += a1.a4;
+  result += a2.a0;
+  result += a2.a1;
+  result += a2.a2;
+  result += a2.a3;
+  result += a2.a4;
+  result += a3.a0;
+  result += a3.a1;
+  result += a3.a2;
+  result += a3.a3;
+  result += a3.a4;
+  result += a4.a0;
+  result += a4.a1;
+  result += a4.a2;
+  result += a4.a3;
+  result += a4.a4;
+  result += a5.a0;
+  result += a5.a1;
+  result += a5.a2;
+  result += a5.a3;
+  result += a5.a4;
+  result += a6.a0;
+  result += a6.a1;
+  result += a6.a2;
+  result += a6.a3;
+  result += a6.a4;
+  result += a7.a0;
+  result += a7.a1;
+  result += a7.a2;
+  result += a7.a3;
+  result += a7.a4;
+  result += a8.a0;
+  result += a8.a1;
+  result += a8.a2;
+  result += a8.a3;
+  result += a8.a4;
+  result += a9.a0;
+  result += a9.a1;
+  result += a9.a2;
+  result += a9.a3;
+  result += a9.a4;
+
+  std::cout << "result = " << result << "\n";
+
+  return result;
+}
+
+// Used for testing structs by value.
+// Argument too big to go into FPU registers in hardfp and arm64.
+DART_EXPORT float PassStruct20BytesHomogeneousFloat(
+    Struct20BytesHomogeneousFloat a0) {
+  std::cout << "PassStruct20BytesHomogeneousFloat"
+            << "((" << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << ", " << a0.a3
+            << ", " << a0.a4 << "))"
+            << "\n";
+
+  float result = 0;
+
+  result += a0.a0;
+  result += a0.a1;
+  result += a0.a2;
+  result += a0.a3;
+  result += a0.a4;
+
+  std::cout << "result = " << result << "\n";
+
+  return result;
+}
+
+// Used for testing structs by value.
+// Arguments in FPU registers on arm64.
+// 5 struct arguments will exhaust available registers.
+DART_EXPORT double PassStruct32BytesHomogeneousDoublex5(
+    Struct32BytesHomogeneousDouble a0,
+    Struct32BytesHomogeneousDouble a1,
+    Struct32BytesHomogeneousDouble a2,
+    Struct32BytesHomogeneousDouble a3,
+    Struct32BytesHomogeneousDouble a4) {
+  std::cout << "PassStruct32BytesHomogeneousDoublex5"
+            << "((" << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << ", " << a0.a3
+            << "), (" << a1.a0 << ", " << a1.a1 << ", " << a1.a2 << ", "
+            << a1.a3 << "), (" << a2.a0 << ", " << a2.a1 << ", " << a2.a2
+            << ", " << a2.a3 << "), (" << a3.a0 << ", " << a3.a1 << ", "
+            << a3.a2 << ", " << a3.a3 << "), (" << a4.a0 << ", " << a4.a1
+            << ", " << a4.a2 << ", " << a4.a3 << "))"
+            << "\n";
+
+  double result = 0;
+
+  result += a0.a0;
+  result += a0.a1;
+  result += a0.a2;
+  result += a0.a3;
+  result += a1.a0;
+  result += a1.a1;
+  result += a1.a2;
+  result += a1.a3;
+  result += a2.a0;
+  result += a2.a1;
+  result += a2.a2;
+  result += a2.a3;
+  result += a3.a0;
+  result += a3.a1;
+  result += a3.a2;
+  result += a3.a3;
+  result += a4.a0;
+  result += a4.a1;
+  result += a4.a2;
+  result += a4.a3;
+
+  std::cout << "result = " << result << "\n";
+
+  return result;
+}
+
+// Used for testing structs by value.
+// Argument too big to go into FPU registers in arm64.
+DART_EXPORT double PassStruct40BytesHomogeneousDouble(
+    Struct40BytesHomogeneousDouble a0) {
+  std::cout << "PassStruct40BytesHomogeneousDouble"
+            << "((" << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << ", " << a0.a3
+            << ", " << a0.a4 << "))"
+            << "\n";
+
+  double result = 0;
+
+  result += a0.a0;
+  result += a0.a1;
+  result += a0.a2;
+  result += a0.a3;
+  result += a0.a4;
+
+  std::cout << "result = " << result << "\n";
+
+  return result;
+}
+
+// Used for testing structs by value.
+// Test 1kb struct.
+DART_EXPORT uint64_t
+PassStruct1024BytesHomogeneousUint64(Struct1024BytesHomogeneousUint64 a0) {
+  std::cout << "PassStruct1024BytesHomogeneousUint64"
+            << "((" << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << ", " << a0.a3
+            << ", " << a0.a4 << ", " << a0.a5 << ", " << a0.a6 << ", " << a0.a7
+            << ", " << a0.a8 << ", " << a0.a9 << ", " << a0.a10 << ", "
+            << a0.a11 << ", " << a0.a12 << ", " << a0.a13 << ", " << a0.a14
+            << ", " << a0.a15 << ", " << a0.a16 << ", " << a0.a17 << ", "
+            << a0.a18 << ", " << a0.a19 << ", " << a0.a20 << ", " << a0.a21
+            << ", " << a0.a22 << ", " << a0.a23 << ", " << a0.a24 << ", "
+            << a0.a25 << ", " << a0.a26 << ", " << a0.a27 << ", " << a0.a28
+            << ", " << a0.a29 << ", " << a0.a30 << ", " << a0.a31 << ", "
+            << a0.a32 << ", " << a0.a33 << ", " << a0.a34 << ", " << a0.a35
+            << ", " << a0.a36 << ", " << a0.a37 << ", " << a0.a38 << ", "
+            << a0.a39 << ", " << a0.a40 << ", " << a0.a41 << ", " << a0.a42
+            << ", " << a0.a43 << ", " << a0.a44 << ", " << a0.a45 << ", "
+            << a0.a46 << ", " << a0.a47 << ", " << a0.a48 << ", " << a0.a49
+            << ", " << a0.a50 << ", " << a0.a51 << ", " << a0.a52 << ", "
+            << a0.a53 << ", " << a0.a54 << ", " << a0.a55 << ", " << a0.a56
+            << ", " << a0.a57 << ", " << a0.a58 << ", " << a0.a59 << ", "
+            << a0.a60 << ", " << a0.a61 << ", " << a0.a62 << ", " << a0.a63
+            << ", " << a0.a64 << ", " << a0.a65 << ", " << a0.a66 << ", "
+            << a0.a67 << ", " << a0.a68 << ", " << a0.a69 << ", " << a0.a70
+            << ", " << a0.a71 << ", " << a0.a72 << ", " << a0.a73 << ", "
+            << a0.a74 << ", " << a0.a75 << ", " << a0.a76 << ", " << a0.a77
+            << ", " << a0.a78 << ", " << a0.a79 << ", " << a0.a80 << ", "
+            << a0.a81 << ", " << a0.a82 << ", " << a0.a83 << ", " << a0.a84
+            << ", " << a0.a85 << ", " << a0.a86 << ", " << a0.a87 << ", "
+            << a0.a88 << ", " << a0.a89 << ", " << a0.a90 << ", " << a0.a91
+            << ", " << a0.a92 << ", " << a0.a93 << ", " << a0.a94 << ", "
+            << a0.a95 << ", " << a0.a96 << ", " << a0.a97 << ", " << a0.a98
+            << ", " << a0.a99 << ", " << a0.a100 << ", " << a0.a101 << ", "
+            << a0.a102 << ", " << a0.a103 << ", " << a0.a104 << ", " << a0.a105
+            << ", " << a0.a106 << ", " << a0.a107 << ", " << a0.a108 << ", "
+            << a0.a109 << ", " << a0.a110 << ", " << a0.a111 << ", " << a0.a112
+            << ", " << a0.a113 << ", " << a0.a114 << ", " << a0.a115 << ", "
+            << a0.a116 << ", " << a0.a117 << ", " << a0.a118 << ", " << a0.a119
+            << ", " << a0.a120 << ", " << a0.a121 << ", " << a0.a122 << ", "
+            << a0.a123 << ", " << a0.a124 << ", " << a0.a125 << ", " << a0.a126
+            << ", " << a0.a127 << "))"
+            << "\n";
+
+  uint64_t result = 0;
+
+  result += a0.a0;
+  result += a0.a1;
+  result += a0.a2;
+  result += a0.a3;
+  result += a0.a4;
+  result += a0.a5;
+  result += a0.a6;
+  result += a0.a7;
+  result += a0.a8;
+  result += a0.a9;
+  result += a0.a10;
+  result += a0.a11;
+  result += a0.a12;
+  result += a0.a13;
+  result += a0.a14;
+  result += a0.a15;
+  result += a0.a16;
+  result += a0.a17;
+  result += a0.a18;
+  result += a0.a19;
+  result += a0.a20;
+  result += a0.a21;
+  result += a0.a22;
+  result += a0.a23;
+  result += a0.a24;
+  result += a0.a25;
+  result += a0.a26;
+  result += a0.a27;
+  result += a0.a28;
+  result += a0.a29;
+  result += a0.a30;
+  result += a0.a31;
+  result += a0.a32;
+  result += a0.a33;
+  result += a0.a34;
+  result += a0.a35;
+  result += a0.a36;
+  result += a0.a37;
+  result += a0.a38;
+  result += a0.a39;
+  result += a0.a40;
+  result += a0.a41;
+  result += a0.a42;
+  result += a0.a43;
+  result += a0.a44;
+  result += a0.a45;
+  result += a0.a46;
+  result += a0.a47;
+  result += a0.a48;
+  result += a0.a49;
+  result += a0.a50;
+  result += a0.a51;
+  result += a0.a52;
+  result += a0.a53;
+  result += a0.a54;
+  result += a0.a55;
+  result += a0.a56;
+  result += a0.a57;
+  result += a0.a58;
+  result += a0.a59;
+  result += a0.a60;
+  result += a0.a61;
+  result += a0.a62;
+  result += a0.a63;
+  result += a0.a64;
+  result += a0.a65;
+  result += a0.a66;
+  result += a0.a67;
+  result += a0.a68;
+  result += a0.a69;
+  result += a0.a70;
+  result += a0.a71;
+  result += a0.a72;
+  result += a0.a73;
+  result += a0.a74;
+  result += a0.a75;
+  result += a0.a76;
+  result += a0.a77;
+  result += a0.a78;
+  result += a0.a79;
+  result += a0.a80;
+  result += a0.a81;
+  result += a0.a82;
+  result += a0.a83;
+  result += a0.a84;
+  result += a0.a85;
+  result += a0.a86;
+  result += a0.a87;
+  result += a0.a88;
+  result += a0.a89;
+  result += a0.a90;
+  result += a0.a91;
+  result += a0.a92;
+  result += a0.a93;
+  result += a0.a94;
+  result += a0.a95;
+  result += a0.a96;
+  result += a0.a97;
+  result += a0.a98;
+  result += a0.a99;
+  result += a0.a100;
+  result += a0.a101;
+  result += a0.a102;
+  result += a0.a103;
+  result += a0.a104;
+  result += a0.a105;
+  result += a0.a106;
+  result += a0.a107;
+  result += a0.a108;
+  result += a0.a109;
+  result += a0.a110;
+  result += a0.a111;
+  result += a0.a112;
+  result += a0.a113;
+  result += a0.a114;
+  result += a0.a115;
+  result += a0.a116;
+  result += a0.a117;
+  result += a0.a118;
+  result += a0.a119;
+  result += a0.a120;
+  result += a0.a121;
+  result += a0.a122;
+  result += a0.a123;
+  result += a0.a124;
+  result += a0.a125;
+  result += a0.a126;
+  result += a0.a127;
+
+  std::cout << "result = " << result << "\n";
+
+  return result;
+}
+
+// Used for testing structs by value.
+// Tests the alignment of structs in FPU registers and backfilling.
+DART_EXPORT float PassFloatStruct16BytesHomogeneousFloatFloatStruct1(
+    float a0,
+    Struct16BytesHomogeneousFloat a1,
+    float a2,
+    Struct16BytesHomogeneousFloat a3,
+    float a4,
+    Struct16BytesHomogeneousFloat a5,
+    float a6,
+    Struct16BytesHomogeneousFloat a7,
+    float a8) {
+  std::cout << "PassFloatStruct16BytesHomogeneousFloatFloatStruct1"
+            << "(" << a0 << ", (" << a1.a0 << ", " << a1.a1 << ", " << a1.a2
+            << ", " << a1.a3 << "), " << a2 << ", (" << a3.a0 << ", " << a3.a1
+            << ", " << a3.a2 << ", " << a3.a3 << "), " << a4 << ", (" << a5.a0
+            << ", " << a5.a1 << ", " << a5.a2 << ", " << a5.a3 << "), " << a6
+            << ", (" << a7.a0 << ", " << a7.a1 << ", " << a7.a2 << ", " << a7.a3
+            << "), " << a8 << ")"
+            << "\n";
+
+  float result = 0;
+
+  result += a0;
+  result += a1.a0;
+  result += a1.a1;
+  result += a1.a2;
+  result += a1.a3;
+  result += a2;
+  result += a3.a0;
+  result += a3.a1;
+  result += a3.a2;
+  result += a3.a3;
+  result += a4;
+  result += a5.a0;
+  result += a5.a1;
+  result += a5.a2;
+  result += a5.a3;
+  result += a6;
+  result += a7.a0;
+  result += a7.a1;
+  result += a7.a2;
+  result += a7.a3;
+  result += a8;
+
+  std::cout << "result = " << result << "\n";
+
+  return result;
+}
+
+// Used for testing structs by value.
+// Tests the alignment of structs in FPU registers and backfilling.
+DART_EXPORT double PassFloatStruct32BytesHomogeneousDoubleFloatStruct(
+    float a0,
+    Struct32BytesHomogeneousDouble a1,
+    float a2,
+    Struct32BytesHomogeneousDouble a3,
+    float a4,
+    Struct32BytesHomogeneousDouble a5,
+    float a6,
+    Struct32BytesHomogeneousDouble a7,
+    float a8) {
+  std::cout << "PassFloatStruct32BytesHomogeneousDoubleFloatStruct"
+            << "(" << a0 << ", (" << a1.a0 << ", " << a1.a1 << ", " << a1.a2
+            << ", " << a1.a3 << "), " << a2 << ", (" << a3.a0 << ", " << a3.a1
+            << ", " << a3.a2 << ", " << a3.a3 << "), " << a4 << ", (" << a5.a0
+            << ", " << a5.a1 << ", " << a5.a2 << ", " << a5.a3 << "), " << a6
+            << ", (" << a7.a0 << ", " << a7.a1 << ", " << a7.a2 << ", " << a7.a3
+            << "), " << a8 << ")"
+            << "\n";
+
+  double result = 0;
+
+  result += a0;
+  result += a1.a0;
+  result += a1.a1;
+  result += a1.a2;
+  result += a1.a3;
+  result += a2;
+  result += a3.a0;
+  result += a3.a1;
+  result += a3.a2;
+  result += a3.a3;
+  result += a4;
+  result += a5.a0;
+  result += a5.a1;
+  result += a5.a2;
+  result += a5.a3;
+  result += a6;
+  result += a7.a0;
+  result += a7.a1;
+  result += a7.a2;
+  result += a7.a3;
+  result += a8;
+
+  std::cout << "result = " << result << "\n";
+
+  return result;
+}
+
+// Used for testing structs by value.
+// Tests the alignment of structs in integers registers and on the stack.
+// Arm32 aligns this struct at 8.
+// Also, arm32 allocates the second struct partially in registers, partially
+// on stack.
+// Test backfilling of integer registers.
+DART_EXPORT double PassInt8Struct16BytesMixedInt8Struct16BytesMixedIn(
+    int8_t a0,
+    Struct16BytesMixed a1,
+    int8_t a2,
+    Struct16BytesMixed a3,
+    int8_t a4,
+    Struct16BytesMixed a5,
+    int8_t a6,
+    Struct16BytesMixed a7,
+    int8_t a8) {
+  std::cout << "PassInt8Struct16BytesMixedInt8Struct16BytesMixedIn"
+            << "(" << static_cast<int>(a0) << ", (" << a1.a0 << ", " << a1.a1
+            << "), " << static_cast<int>(a2) << ", (" << a3.a0 << ", " << a3.a1
+            << "), " << static_cast<int>(a4) << ", (" << a5.a0 << ", " << a5.a1
+            << "), " << static_cast<int>(a6) << ", (" << a7.a0 << ", " << a7.a1
+            << "), " << static_cast<int>(a8) << ")"
+            << "\n";
+
+  double result = 0;
+
+  result += a0;
+  result += a1.a0;
+  result += a1.a1;
+  result += a2;
+  result += a3.a0;
+  result += a3.a1;
+  result += a4;
+  result += a5.a0;
+  result += a5.a1;
+  result += a6;
+  result += a7.a0;
+  result += a7.a1;
+  result += a8;
+
+  std::cout << "result = " << result << "\n";
+
+  return result;
+}
+
+// Used for testing structs by value.
+// On Linux x64, it will exhaust xmm registers first, after 6 doubles and 2
+// structs. The rest of the structs will go on the stack.
+// The int will be backfilled into the int register.
+DART_EXPORT double PassDoublex6Struct16BytesMixedx4Int32(double a0,
+                                                         double a1,
+                                                         double a2,
+                                                         double a3,
+                                                         double a4,
+                                                         double a5,
+                                                         Struct16BytesMixed a6,
+                                                         Struct16BytesMixed a7,
+                                                         Struct16BytesMixed a8,
+                                                         Struct16BytesMixed a9,
+                                                         int32_t a10) {
+  std::cout << "PassDoublex6Struct16BytesMixedx4Int32"
+            << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ", " << a4
+            << ", " << a5 << ", (" << a6.a0 << ", " << a6.a1 << "), (" << a7.a0
+            << ", " << a7.a1 << "), (" << a8.a0 << ", " << a8.a1 << "), ("
+            << a9.a0 << ", " << a9.a1 << "), " << a10 << ")"
+            << "\n";
+
+  double result = 0;
+
+  result += a0;
+  result += a1;
+  result += a2;
+  result += a3;
+  result += a4;
+  result += a5;
+  result += a6.a0;
+  result += a6.a1;
+  result += a7.a0;
+  result += a7.a1;
+  result += a8.a0;
+  result += a8.a1;
+  result += a9.a0;
+  result += a9.a1;
+  result += a10;
+
+  std::cout << "result = " << result << "\n";
+
+  return result;
+}
+
+// Used for testing structs by value.
+// On Linux x64, it will exhaust int registers first.
+// The rest of the structs will go on the stack.
+// The double will be backfilled into the xmm register.
+DART_EXPORT double PassInt32x4Struct16BytesMixedx4Double(int32_t a0,
+                                                         int32_t a1,
+                                                         int32_t a2,
+                                                         int32_t a3,
+                                                         Struct16BytesMixed a4,
+                                                         Struct16BytesMixed a5,
+                                                         Struct16BytesMixed a6,
+                                                         Struct16BytesMixed a7,
+                                                         double a8) {
+  std::cout << "PassInt32x4Struct16BytesMixedx4Double"
+            << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ", ("
+            << a4.a0 << ", " << a4.a1 << "), (" << a5.a0 << ", " << a5.a1
+            << "), (" << a6.a0 << ", " << a6.a1 << "), (" << a7.a0 << ", "
+            << a7.a1 << "), " << a8 << ")"
+            << "\n";
+
+  double result = 0;
+
+  result += a0;
+  result += a1;
+  result += a2;
+  result += a3;
+  result += a4.a0;
+  result += a4.a1;
+  result += a5.a0;
+  result += a5.a1;
+  result += a6.a0;
+  result += a6.a1;
+  result += a7.a0;
+  result += a7.a1;
+  result += a8;
+
+  std::cout << "result = " << result << "\n";
+
+  return result;
+}
+
+// Used for testing structs by value.
+// On various architectures, first struct is allocated on stack.
+// Check that the other two arguments are allocated on registers.
+DART_EXPORT double PassStruct40BytesHomogeneousDoubleStruct4BytesHomo(
+    Struct40BytesHomogeneousDouble a0,
+    Struct4BytesHomogeneousInt16 a1,
+    Struct8BytesHomogeneousFloat a2) {
+  std::cout << "PassStruct40BytesHomogeneousDoubleStruct4BytesHomo"
+            << "((" << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << ", " << a0.a3
+            << ", " << a0.a4 << "), (" << a1.a0 << ", " << a1.a1 << "), ("
+            << a2.a0 << ", " << a2.a1 << "))"
+            << "\n";
+
+  double result = 0;
+
+  result += a0.a0;
+  result += a0.a1;
+  result += a0.a2;
+  result += a0.a3;
+  result += a0.a4;
+  result += a1.a0;
+  result += a1.a1;
+  result += a2.a0;
+  result += a2.a1;
+
+  std::cout << "result = " << result << "\n";
+
+  return result;
+}
+
+// Used for testing structs by value.
+// Test alignment and padding of 16 byte int within struct.
+DART_EXPORT double PassInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int(
+    int32_t a0,
+    int32_t a1,
+    int32_t a2,
+    int32_t a3,
+    int32_t a4,
+    int32_t a5,
+    int32_t a6,
+    int32_t a7,
+    double a8,
+    double a9,
+    double a10,
+    double a11,
+    double a12,
+    double a13,
+    double a14,
+    double a15,
+    int64_t a16,
+    int8_t a17,
+    Struct1ByteInt a18,
+    int64_t a19,
+    int8_t a20,
+    Struct4BytesHomogeneousInt16 a21,
+    int64_t a22,
+    int8_t a23,
+    Struct8BytesInt a24,
+    int64_t a25,
+    int8_t a26,
+    Struct8BytesHomogeneousFloat a27,
+    int64_t a28,
+    int8_t a29,
+    Struct8BytesMixed a30,
+    int64_t a31,
+    int8_t a32,
+    StructAlignmentInt16 a33,
+    int64_t a34,
+    int8_t a35,
+    StructAlignmentInt32 a36,
+    int64_t a37,
+    int8_t a38,
+    StructAlignmentInt64 a39) {
+  std::cout << "PassInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int"
+            << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ", " << a4
+            << ", " << a5 << ", " << a6 << ", " << a7 << ", " << a8 << ", "
+            << a9 << ", " << a10 << ", " << a11 << ", " << a12 << ", " << a13
+            << ", " << a14 << ", " << a15 << ", " << a16 << ", "
+            << static_cast<int>(a17) << ", (" << static_cast<int>(a18.a0)
+            << "), " << a19 << ", " << static_cast<int>(a20) << ", (" << a21.a0
+            << ", " << a21.a1 << "), " << a22 << ", " << static_cast<int>(a23)
+            << ", (" << a24.a0 << ", " << a24.a1 << ", " << a24.a2 << "), "
+            << a25 << ", " << static_cast<int>(a26) << ", (" << a27.a0 << ", "
+            << a27.a1 << "), " << a28 << ", " << static_cast<int>(a29) << ", ("
+            << a30.a0 << ", " << a30.a1 << ", " << a30.a2 << "), " << a31
+            << ", " << static_cast<int>(a32) << ", ("
+            << static_cast<int>(a33.a0) << ", " << a33.a1 << ", "
+            << static_cast<int>(a33.a2) << "), " << a34 << ", "
+            << static_cast<int>(a35) << ", (" << static_cast<int>(a36.a0)
+            << ", " << a36.a1 << ", " << static_cast<int>(a36.a2) << "), "
+            << a37 << ", " << static_cast<int>(a38) << ", ("
+            << static_cast<int>(a39.a0) << ", " << a39.a1 << ", "
+            << static_cast<int>(a39.a2) << "))"
+            << "\n";
+
+  double result = 0;
+
+  result += a0;
+  result += a1;
+  result += a2;
+  result += a3;
+  result += a4;
+  result += a5;
+  result += a6;
+  result += a7;
+  result += a8;
+  result += a9;
+  result += a10;
+  result += a11;
+  result += a12;
+  result += a13;
+  result += a14;
+  result += a15;
+  result += a16;
+  result += a17;
+  result += a18.a0;
+  result += a19;
+  result += a20;
+  result += a21.a0;
+  result += a21.a1;
+  result += a22;
+  result += a23;
+  result += a24.a0;
+  result += a24.a1;
+  result += a24.a2;
+  result += a25;
+  result += a26;
+  result += a27.a0;
+  result += a27.a1;
+  result += a28;
+  result += a29;
+  result += a30.a0;
+  result += a30.a1;
+  result += a30.a2;
+  result += a31;
+  result += a32;
+  result += a33.a0;
+  result += a33.a1;
+  result += a33.a2;
+  result += a34;
+  result += a35;
+  result += a36.a0;
+  result += a36.a1;
+  result += a36.a2;
+  result += a37;
+  result += a38;
+  result += a39.a0;
+  result += a39.a1;
+  result += a39.a2;
+
+  std::cout << "result = " << result << "\n";
+
+  return result;
+}
+
+// Used for testing structs by value.
+// Test alignment and padding of 16 byte int within struct.
+DART_EXPORT int64_t PassStructAlignmentInt16(StructAlignmentInt16 a0) {
+  std::cout << "PassStructAlignmentInt16"
+            << "((" << static_cast<int>(a0.a0) << ", " << a0.a1 << ", "
+            << static_cast<int>(a0.a2) << "))"
+            << "\n";
+
+  int64_t result = 0;
+
+  result += a0.a0;
+  result += a0.a1;
+  result += a0.a2;
+
+  std::cout << "result = " << result << "\n";
+
+  return result;
+}
+
+// Used for testing structs by value.
+// Test alignment and padding of 32 byte int within struct.
+DART_EXPORT int64_t PassStructAlignmentInt32(StructAlignmentInt32 a0) {
+  std::cout << "PassStructAlignmentInt32"
+            << "((" << static_cast<int>(a0.a0) << ", " << a0.a1 << ", "
+            << static_cast<int>(a0.a2) << "))"
+            << "\n";
+
+  int64_t result = 0;
+
+  result += a0.a0;
+  result += a0.a1;
+  result += a0.a2;
+
+  std::cout << "result = " << result << "\n";
+
+  return result;
+}
+
+// Used for testing structs by value.
+// Test alignment and padding of 64 byte int within struct.
+DART_EXPORT int64_t PassStructAlignmentInt64(StructAlignmentInt64 a0) {
+  std::cout << "PassStructAlignmentInt64"
+            << "((" << static_cast<int>(a0.a0) << ", " << a0.a1 << ", "
+            << static_cast<int>(a0.a2) << "))"
+            << "\n";
+
+  int64_t result = 0;
+
+  result += a0.a0;
+  result += a0.a1;
+  result += a0.a2;
+
+  std::cout << "result = " << result << "\n";
+
+  return result;
+}
+
+// Used for testing structs by value.
+// Smallest struct with data.
+DART_EXPORT Struct1ByteInt ReturnStruct1ByteInt(int8_t a0) {
+  std::cout << "ReturnStruct1ByteInt"
+            << "(" << static_cast<int>(a0) << ")"
+            << "\n";
+
+  Struct1ByteInt result;
+
+  result.a0 = a0;
+
+  std::cout << "result = "
+            << "(" << static_cast<int>(result.a0) << ")"
+            << "\n";
+
+  return result;
+}
+
+// Used for testing structs by value.
+// Smaller than word size return value on all architectures.
+DART_EXPORT Struct3BytesHomogeneousUint8
+ReturnStruct3BytesHomogeneousUint8(uint8_t a0, uint8_t a1, uint8_t a2) {
+  std::cout << "ReturnStruct3BytesHomogeneousUint8"
+            << "(" << static_cast<int>(a0) << ", " << static_cast<int>(a1)
+            << ", " << static_cast<int>(a2) << ")"
+            << "\n";
+
+  Struct3BytesHomogeneousUint8 result;
+
+  result.a0 = a0;
+  result.a1 = a1;
+  result.a2 = a2;
+
+  std::cout << "result = "
+            << "(" << static_cast<int>(result.a0) << ", "
+            << static_cast<int>(result.a1) << ", "
+            << static_cast<int>(result.a2) << ")"
+            << "\n";
+
+  return result;
+}
+
+// Used for testing structs by value.
+// Smaller than word size return value on all architectures.
+// With alignment rules taken into account size is 4 bytes.
+DART_EXPORT Struct3BytesInt2ByteAligned
+ReturnStruct3BytesInt2ByteAligned(int16_t a0, int8_t a1) {
+  std::cout << "ReturnStruct3BytesInt2ByteAligned"
+            << "(" << a0 << ", " << static_cast<int>(a1) << ")"
+            << "\n";
+
+  Struct3BytesInt2ByteAligned result;
+
+  result.a0 = a0;
+  result.a1 = a1;
+
+  std::cout << "result = "
+            << "(" << result.a0 << ", " << static_cast<int>(result.a1) << ")"
+            << "\n";
+
+  return result;
+}
+
+// Used for testing structs by value.
+// Word size return value on 32 bit architectures..
+DART_EXPORT Struct4BytesHomogeneousInt16
+ReturnStruct4BytesHomogeneousInt16(int16_t a0, int16_t a1) {
+  std::cout << "ReturnStruct4BytesHomogeneousInt16"
+            << "(" << a0 << ", " << a1 << ")"
+            << "\n";
+
+  Struct4BytesHomogeneousInt16 result;
+
+  result.a0 = a0;
+  result.a1 = a1;
+
+  std::cout << "result = "
+            << "(" << result.a0 << ", " << result.a1 << ")"
+            << "\n";
+
+  return result;
+}
+
+// Used for testing structs by value.
+// Non-wordsize return value.
+DART_EXPORT Struct7BytesHomogeneousUint8
+ReturnStruct7BytesHomogeneousUint8(uint8_t a0,
+                                   uint8_t a1,
+                                   uint8_t a2,
+                                   uint8_t a3,
+                                   uint8_t a4,
+                                   uint8_t a5,
+                                   uint8_t a6) {
+  std::cout << "ReturnStruct7BytesHomogeneousUint8"
+            << "(" << static_cast<int>(a0) << ", " << static_cast<int>(a1)
+            << ", " << static_cast<int>(a2) << ", " << static_cast<int>(a3)
+            << ", " << static_cast<int>(a4) << ", " << static_cast<int>(a5)
+            << ", " << static_cast<int>(a6) << ")"
+            << "\n";
+
+  Struct7BytesHomogeneousUint8 result;
+
+  result.a0 = a0;
+  result.a1 = a1;
+  result.a2 = a2;
+  result.a3 = a3;
+  result.a4 = a4;
+  result.a5 = a5;
+  result.a6 = a6;
+
+  std::cout << "result = "
+            << "(" << static_cast<int>(result.a0) << ", "
+            << static_cast<int>(result.a1) << ", "
+            << static_cast<int>(result.a2) << ", "
+            << static_cast<int>(result.a3) << ", "
+            << static_cast<int>(result.a4) << ", "
+            << static_cast<int>(result.a5) << ", "
+            << static_cast<int>(result.a6) << ")"
+            << "\n";
+
+  return result;
+}
+
+// Used for testing structs by value.
+// Non-wordsize return value.
+// With alignment rules taken into account size is 8 bytes.
+DART_EXPORT Struct7BytesInt4ByteAligned
+ReturnStruct7BytesInt4ByteAligned(int32_t a0, int16_t a1, int8_t a2) {
+  std::cout << "ReturnStruct7BytesInt4ByteAligned"
+            << "(" << a0 << ", " << a1 << ", " << static_cast<int>(a2) << ")"
+            << "\n";
+
+  Struct7BytesInt4ByteAligned result;
+
+  result.a0 = a0;
+  result.a1 = a1;
+  result.a2 = a2;
+
+  std::cout << "result = "
+            << "(" << result.a0 << ", " << result.a1 << ", "
+            << static_cast<int>(result.a2) << ")"
+            << "\n";
+
+  return result;
+}
+
+// Used for testing structs by value.
+// Return value in integer registers on many architectures.
+DART_EXPORT Struct8BytesInt ReturnStruct8BytesInt(int16_t a0,
+                                                  int16_t a1,
+                                                  int32_t a2) {
+  std::cout << "ReturnStruct8BytesInt"
+            << "(" << a0 << ", " << a1 << ", " << a2 << ")"
+            << "\n";
+
+  Struct8BytesInt result;
+
+  result.a0 = a0;
+  result.a1 = a1;
+  result.a2 = a2;
+
+  std::cout << "result = "
+            << "(" << result.a0 << ", " << result.a1 << ", " << result.a2 << ")"
+            << "\n";
+
+  return result;
+}
+
+// Used for testing structs by value.
+// Return value in FP registers on many architectures.
+DART_EXPORT Struct8BytesHomogeneousFloat
+ReturnStruct8BytesHomogeneousFloat(float a0, float a1) {
+  std::cout << "ReturnStruct8BytesHomogeneousFloat"
+            << "(" << a0 << ", " << a1 << ")"
+            << "\n";
+
+  Struct8BytesHomogeneousFloat result;
+
+  result.a0 = a0;
+  result.a1 = a1;
+
+  std::cout << "result = "
+            << "(" << result.a0 << ", " << result.a1 << ")"
+            << "\n";
+
+  return result;
+}
+
+// Used for testing structs by value.
+// Return value split over FP and integer register in x64.
+DART_EXPORT Struct8BytesMixed ReturnStruct8BytesMixed(float a0,
+                                                      int16_t a1,
+                                                      int16_t a2) {
+  std::cout << "ReturnStruct8BytesMixed"
+            << "(" << a0 << ", " << a1 << ", " << a2 << ")"
+            << "\n";
+
+  Struct8BytesMixed result;
+
+  result.a0 = a0;
+  result.a1 = a1;
+  result.a2 = a2;
+
+  std::cout << "result = "
+            << "(" << result.a0 << ", " << result.a1 << ", " << result.a2 << ")"
+            << "\n";
+
+  return result;
+}
+
+// Used for testing structs by value.
+// The minimum alignment of this struct is only 1 byte based on its fields.
+// Test that the memory backing these structs is the right size and that
+// dart:ffi trampolines do not write outside this size.
+DART_EXPORT Struct9BytesHomogeneousUint8
+ReturnStruct9BytesHomogeneousUint8(uint8_t a0,
+                                   uint8_t a1,
+                                   uint8_t a2,
+                                   uint8_t a3,
+                                   uint8_t a4,
+                                   uint8_t a5,
+                                   uint8_t a6,
+                                   uint8_t a7,
+                                   uint8_t a8) {
+  std::cout << "ReturnStruct9BytesHomogeneousUint8"
+            << "(" << static_cast<int>(a0) << ", " << static_cast<int>(a1)
+            << ", " << static_cast<int>(a2) << ", " << static_cast<int>(a3)
+            << ", " << static_cast<int>(a4) << ", " << static_cast<int>(a5)
+            << ", " << static_cast<int>(a6) << ", " << static_cast<int>(a7)
+            << ", " << static_cast<int>(a8) << ")"
+            << "\n";
+
+  Struct9BytesHomogeneousUint8 result;
+
+  result.a0 = a0;
+  result.a1 = a1;
+  result.a2 = a2;
+  result.a3 = a3;
+  result.a4 = a4;
+  result.a5 = a5;
+  result.a6 = a6;
+  result.a7 = a7;
+  result.a8 = a8;
+
+  std::cout << "result = "
+            << "(" << static_cast<int>(result.a0) << ", "
+            << static_cast<int>(result.a1) << ", "
+            << static_cast<int>(result.a2) << ", "
+            << static_cast<int>(result.a3) << ", "
+            << static_cast<int>(result.a4) << ", "
+            << static_cast<int>(result.a5) << ", "
+            << static_cast<int>(result.a6) << ", "
+            << static_cast<int>(result.a7) << ", "
+            << static_cast<int>(result.a8) << ")"
+            << "\n";
+
+  return result;
+}
+
+// Used for testing structs by value.
+// Return value in two integer registers on x64.
+// With alignment rules taken into account size is 12 or 16 bytes.
+DART_EXPORT Struct9BytesInt4Or8ByteAligned
+ReturnStruct9BytesInt4Or8ByteAligned(int64_t a0, int8_t a1) {
+  std::cout << "ReturnStruct9BytesInt4Or8ByteAligned"
+            << "(" << a0 << ", " << static_cast<int>(a1) << ")"
+            << "\n";
+
+  Struct9BytesInt4Or8ByteAligned result;
+
+  result.a0 = a0;
+  result.a1 = a1;
+
+  std::cout << "result = "
+            << "(" << result.a0 << ", " << static_cast<int>(result.a1) << ")"
+            << "\n";
+
+  return result;
+}
+
+// Used for testing structs by value.
+// Return value in FPU registers, but does not use all registers on arm hardfp
+// and arm64.
+DART_EXPORT Struct12BytesHomogeneousFloat
+ReturnStruct12BytesHomogeneousFloat(float a0, float a1, float a2) {
+  std::cout << "ReturnStruct12BytesHomogeneousFloat"
+            << "(" << a0 << ", " << a1 << ", " << a2 << ")"
+            << "\n";
+
+  Struct12BytesHomogeneousFloat result;
+
+  result.a0 = a0;
+  result.a1 = a1;
+  result.a2 = a2;
+
+  std::cout << "result = "
+            << "(" << result.a0 << ", " << result.a1 << ", " << result.a2 << ")"
+            << "\n";
+
+  return result;
+}
+
+// Used for testing structs by value.
+// Return value in FPU registers on arm hardfp and arm64.
+DART_EXPORT Struct16BytesHomogeneousFloat
+ReturnStruct16BytesHomogeneousFloat(float a0, float a1, float a2, float a3) {
+  std::cout << "ReturnStruct16BytesHomogeneousFloat"
+            << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ")"
+            << "\n";
+
+  Struct16BytesHomogeneousFloat result;
+
+  result.a0 = a0;
+  result.a1 = a1;
+  result.a2 = a2;
+  result.a3 = a3;
+
+  std::cout << "result = "
+            << "(" << result.a0 << ", " << result.a1 << ", " << result.a2
+            << ", " << result.a3 << ")"
+            << "\n";
+
+  return result;
+}
+
+// Used for testing structs by value.
+// Return value split over FP and integer register in x64.
+DART_EXPORT Struct16BytesMixed ReturnStruct16BytesMixed(double a0, int64_t a1) {
+  std::cout << "ReturnStruct16BytesMixed"
+            << "(" << a0 << ", " << a1 << ")"
+            << "\n";
+
+  Struct16BytesMixed result;
+
+  result.a0 = a0;
+  result.a1 = a1;
+
+  std::cout << "result = "
+            << "(" << result.a0 << ", " << result.a1 << ")"
+            << "\n";
+
+  return result;
+}
+
+// Used for testing structs by value.
+// Return value split over FP and integer register in x64.
+// The integer register contains half float half int.
+DART_EXPORT Struct16BytesMixed2 ReturnStruct16BytesMixed2(float a0,
+                                                          float a1,
+                                                          float a2,
+                                                          int32_t a3) {
+  std::cout << "ReturnStruct16BytesMixed2"
+            << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ")"
+            << "\n";
+
+  Struct16BytesMixed2 result;
+
+  result.a0 = a0;
+  result.a1 = a1;
+  result.a2 = a2;
+  result.a3 = a3;
+
+  std::cout << "result = "
+            << "(" << result.a0 << ", " << result.a1 << ", " << result.a2
+            << ", " << result.a3 << ")"
+            << "\n";
+
+  return result;
+}
+
+// Used for testing structs by value.
+// Rerturn value returned in preallocated space passed by pointer on most ABIs.
+// Is non word size on purpose, to test that structs are rounded up to word size
+// on all ABIs.
+DART_EXPORT Struct17BytesInt ReturnStruct17BytesInt(int64_t a0,
+                                                    int64_t a1,
+                                                    int8_t a2) {
+  std::cout << "ReturnStruct17BytesInt"
+            << "(" << a0 << ", " << a1 << ", " << static_cast<int>(a2) << ")"
+            << "\n";
+
+  Struct17BytesInt result;
+
+  result.a0 = a0;
+  result.a1 = a1;
+  result.a2 = a2;
+
+  std::cout << "result = "
+            << "(" << result.a0 << ", " << result.a1 << ", "
+            << static_cast<int>(result.a2) << ")"
+            << "\n";
+
+  return result;
+}
+
+// Used for testing structs by value.
+// The minimum alignment of this struct is only 1 byte based on its fields.
+// Test that the memory backing these structs is the right size and that
+// dart:ffi trampolines do not write outside this size.
+DART_EXPORT Struct19BytesHomogeneousUint8
+ReturnStruct19BytesHomogeneousUint8(uint8_t a0,
+                                    uint8_t a1,
+                                    uint8_t a2,
+                                    uint8_t a3,
+                                    uint8_t a4,
+                                    uint8_t a5,
+                                    uint8_t a6,
+                                    uint8_t a7,
+                                    uint8_t a8,
+                                    uint8_t a9,
+                                    uint8_t a10,
+                                    uint8_t a11,
+                                    uint8_t a12,
+                                    uint8_t a13,
+                                    uint8_t a14,
+                                    uint8_t a15,
+                                    uint8_t a16,
+                                    uint8_t a17,
+                                    uint8_t a18) {
+  std::cout << "ReturnStruct19BytesHomogeneousUint8"
+            << "(" << static_cast<int>(a0) << ", " << static_cast<int>(a1)
+            << ", " << static_cast<int>(a2) << ", " << static_cast<int>(a3)
+            << ", " << static_cast<int>(a4) << ", " << static_cast<int>(a5)
+            << ", " << static_cast<int>(a6) << ", " << static_cast<int>(a7)
+            << ", " << static_cast<int>(a8) << ", " << static_cast<int>(a9)
+            << ", " << static_cast<int>(a10) << ", " << static_cast<int>(a11)
+            << ", " << static_cast<int>(a12) << ", " << static_cast<int>(a13)
+            << ", " << static_cast<int>(a14) << ", " << static_cast<int>(a15)
+            << ", " << static_cast<int>(a16) << ", " << static_cast<int>(a17)
+            << ", " << static_cast<int>(a18) << ")"
+            << "\n";
+
+  Struct19BytesHomogeneousUint8 result;
+
+  result.a0 = a0;
+  result.a1 = a1;
+  result.a2 = a2;
+  result.a3 = a3;
+  result.a4 = a4;
+  result.a5 = a5;
+  result.a6 = a6;
+  result.a7 = a7;
+  result.a8 = a8;
+  result.a9 = a9;
+  result.a10 = a10;
+  result.a11 = a11;
+  result.a12 = a12;
+  result.a13 = a13;
+  result.a14 = a14;
+  result.a15 = a15;
+  result.a16 = a16;
+  result.a17 = a17;
+  result.a18 = a18;
+
+  std::cout << "result = "
+            << "(" << static_cast<int>(result.a0) << ", "
+            << static_cast<int>(result.a1) << ", "
+            << static_cast<int>(result.a2) << ", "
+            << static_cast<int>(result.a3) << ", "
+            << static_cast<int>(result.a4) << ", "
+            << static_cast<int>(result.a5) << ", "
+            << static_cast<int>(result.a6) << ", "
+            << static_cast<int>(result.a7) << ", "
+            << static_cast<int>(result.a8) << ", "
+            << static_cast<int>(result.a9) << ", "
+            << static_cast<int>(result.a10) << ", "
+            << static_cast<int>(result.a11) << ", "
+            << static_cast<int>(result.a12) << ", "
+            << static_cast<int>(result.a13) << ", "
+            << static_cast<int>(result.a14) << ", "
+            << static_cast<int>(result.a15) << ", "
+            << static_cast<int>(result.a16) << ", "
+            << static_cast<int>(result.a17) << ", "
+            << static_cast<int>(result.a18) << ")"
+            << "\n";
+
+  return result;
+}
+
+// Used for testing structs by value.
+// Return value too big to go in cpu registers on arm64.
+DART_EXPORT Struct20BytesHomogeneousInt32
+ReturnStruct20BytesHomogeneousInt32(int32_t a0,
+                                    int32_t a1,
+                                    int32_t a2,
+                                    int32_t a3,
+                                    int32_t a4) {
+  std::cout << "ReturnStruct20BytesHomogeneousInt32"
+            << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ", " << a4
+            << ")"
+            << "\n";
+
+  Struct20BytesHomogeneousInt32 result;
+
+  result.a0 = a0;
+  result.a1 = a1;
+  result.a2 = a2;
+  result.a3 = a3;
+  result.a4 = a4;
+
+  std::cout << "result = "
+            << "(" << result.a0 << ", " << result.a1 << ", " << result.a2
+            << ", " << result.a3 << ", " << result.a4 << ")"
+            << "\n";
+
+  return result;
+}
+
+// Used for testing structs by value.
+// Return value too big to go in FPU registers on x64, arm hardfp and arm64.
+DART_EXPORT Struct20BytesHomogeneousFloat
+ReturnStruct20BytesHomogeneousFloat(float a0,
+                                    float a1,
+                                    float a2,
+                                    float a3,
+                                    float a4) {
+  std::cout << "ReturnStruct20BytesHomogeneousFloat"
+            << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ", " << a4
+            << ")"
+            << "\n";
+
+  Struct20BytesHomogeneousFloat result;
+
+  result.a0 = a0;
+  result.a1 = a1;
+  result.a2 = a2;
+  result.a3 = a3;
+  result.a4 = a4;
+
+  std::cout << "result = "
+            << "(" << result.a0 << ", " << result.a1 << ", " << result.a2
+            << ", " << result.a3 << ", " << result.a4 << ")"
+            << "\n";
+
+  return result;
+}
+
+// Used for testing structs by value.
+// Return value in FPU registers on arm64.
+DART_EXPORT Struct32BytesHomogeneousDouble
+ReturnStruct32BytesHomogeneousDouble(double a0,
+                                     double a1,
+                                     double a2,
+                                     double a3) {
+  std::cout << "ReturnStruct32BytesHomogeneousDouble"
+            << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ")"
+            << "\n";
+
+  Struct32BytesHomogeneousDouble result;
+
+  result.a0 = a0;
+  result.a1 = a1;
+  result.a2 = a2;
+  result.a3 = a3;
+
+  std::cout << "result = "
+            << "(" << result.a0 << ", " << result.a1 << ", " << result.a2
+            << ", " << result.a3 << ")"
+            << "\n";
+
+  return result;
+}
+
+// Used for testing structs by value.
+// Return value too big to go in FPU registers on arm64.
+DART_EXPORT Struct40BytesHomogeneousDouble
+ReturnStruct40BytesHomogeneousDouble(double a0,
+                                     double a1,
+                                     double a2,
+                                     double a3,
+                                     double a4) {
+  std::cout << "ReturnStruct40BytesHomogeneousDouble"
+            << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ", " << a4
+            << ")"
+            << "\n";
+
+  Struct40BytesHomogeneousDouble result;
+
+  result.a0 = a0;
+  result.a1 = a1;
+  result.a2 = a2;
+  result.a3 = a3;
+  result.a4 = a4;
+
+  std::cout << "result = "
+            << "(" << result.a0 << ", " << result.a1 << ", " << result.a2
+            << ", " << result.a3 << ", " << result.a4 << ")"
+            << "\n";
+
+  return result;
+}
+
+// Used for testing structs by value.
+// Test 1kb struct.
+DART_EXPORT Struct1024BytesHomogeneousUint64
+ReturnStruct1024BytesHomogeneousUint64(uint64_t a0,
+                                       uint64_t a1,
+                                       uint64_t a2,
+                                       uint64_t a3,
+                                       uint64_t a4,
+                                       uint64_t a5,
+                                       uint64_t a6,
+                                       uint64_t a7,
+                                       uint64_t a8,
+                                       uint64_t a9,
+                                       uint64_t a10,
+                                       uint64_t a11,
+                                       uint64_t a12,
+                                       uint64_t a13,
+                                       uint64_t a14,
+                                       uint64_t a15,
+                                       uint64_t a16,
+                                       uint64_t a17,
+                                       uint64_t a18,
+                                       uint64_t a19,
+                                       uint64_t a20,
+                                       uint64_t a21,
+                                       uint64_t a22,
+                                       uint64_t a23,
+                                       uint64_t a24,
+                                       uint64_t a25,
+                                       uint64_t a26,
+                                       uint64_t a27,
+                                       uint64_t a28,
+                                       uint64_t a29,
+                                       uint64_t a30,
+                                       uint64_t a31,
+                                       uint64_t a32,
+                                       uint64_t a33,
+                                       uint64_t a34,
+                                       uint64_t a35,
+                                       uint64_t a36,
+                                       uint64_t a37,
+                                       uint64_t a38,
+                                       uint64_t a39,
+                                       uint64_t a40,
+                                       uint64_t a41,
+                                       uint64_t a42,
+                                       uint64_t a43,
+                                       uint64_t a44,
+                                       uint64_t a45,
+                                       uint64_t a46,
+                                       uint64_t a47,
+                                       uint64_t a48,
+                                       uint64_t a49,
+                                       uint64_t a50,
+                                       uint64_t a51,
+                                       uint64_t a52,
+                                       uint64_t a53,
+                                       uint64_t a54,
+                                       uint64_t a55,
+                                       uint64_t a56,
+                                       uint64_t a57,
+                                       uint64_t a58,
+                                       uint64_t a59,
+                                       uint64_t a60,
+                                       uint64_t a61,
+                                       uint64_t a62,
+                                       uint64_t a63,
+                                       uint64_t a64,
+                                       uint64_t a65,
+                                       uint64_t a66,
+                                       uint64_t a67,
+                                       uint64_t a68,
+                                       uint64_t a69,
+                                       uint64_t a70,
+                                       uint64_t a71,
+                                       uint64_t a72,
+                                       uint64_t a73,
+                                       uint64_t a74,
+                                       uint64_t a75,
+                                       uint64_t a76,
+                                       uint64_t a77,
+                                       uint64_t a78,
+                                       uint64_t a79,
+                                       uint64_t a80,
+                                       uint64_t a81,
+                                       uint64_t a82,
+                                       uint64_t a83,
+                                       uint64_t a84,
+                                       uint64_t a85,
+                                       uint64_t a86,
+                                       uint64_t a87,
+                                       uint64_t a88,
+                                       uint64_t a89,
+                                       uint64_t a90,
+                                       uint64_t a91,
+                                       uint64_t a92,
+                                       uint64_t a93,
+                                       uint64_t a94,
+                                       uint64_t a95,
+                                       uint64_t a96,
+                                       uint64_t a97,
+                                       uint64_t a98,
+                                       uint64_t a99,
+                                       uint64_t a100,
+                                       uint64_t a101,
+                                       uint64_t a102,
+                                       uint64_t a103,
+                                       uint64_t a104,
+                                       uint64_t a105,
+                                       uint64_t a106,
+                                       uint64_t a107,
+                                       uint64_t a108,
+                                       uint64_t a109,
+                                       uint64_t a110,
+                                       uint64_t a111,
+                                       uint64_t a112,
+                                       uint64_t a113,
+                                       uint64_t a114,
+                                       uint64_t a115,
+                                       uint64_t a116,
+                                       uint64_t a117,
+                                       uint64_t a118,
+                                       uint64_t a119,
+                                       uint64_t a120,
+                                       uint64_t a121,
+                                       uint64_t a122,
+                                       uint64_t a123,
+                                       uint64_t a124,
+                                       uint64_t a125,
+                                       uint64_t a126,
+                                       uint64_t a127) {
+  std::cout << "ReturnStruct1024BytesHomogeneousUint64"
+            << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ", " << a4
+            << ", " << a5 << ", " << a6 << ", " << a7 << ", " << a8 << ", "
+            << a9 << ", " << a10 << ", " << a11 << ", " << a12 << ", " << a13
+            << ", " << a14 << ", " << a15 << ", " << a16 << ", " << a17 << ", "
+            << a18 << ", " << a19 << ", " << a20 << ", " << a21 << ", " << a22
+            << ", " << a23 << ", " << a24 << ", " << a25 << ", " << a26 << ", "
+            << a27 << ", " << a28 << ", " << a29 << ", " << a30 << ", " << a31
+            << ", " << a32 << ", " << a33 << ", " << a34 << ", " << a35 << ", "
+            << a36 << ", " << a37 << ", " << a38 << ", " << a39 << ", " << a40
+            << ", " << a41 << ", " << a42 << ", " << a43 << ", " << a44 << ", "
+            << a45 << ", " << a46 << ", " << a47 << ", " << a48 << ", " << a49
+            << ", " << a50 << ", " << a51 << ", " << a52 << ", " << a53 << ", "
+            << a54 << ", " << a55 << ", " << a56 << ", " << a57 << ", " << a58
+            << ", " << a59 << ", " << a60 << ", " << a61 << ", " << a62 << ", "
+            << a63 << ", " << a64 << ", " << a65 << ", " << a66 << ", " << a67
+            << ", " << a68 << ", " << a69 << ", " << a70 << ", " << a71 << ", "
+            << a72 << ", " << a73 << ", " << a74 << ", " << a75 << ", " << a76
+            << ", " << a77 << ", " << a78 << ", " << a79 << ", " << a80 << ", "
+            << a81 << ", " << a82 << ", " << a83 << ", " << a84 << ", " << a85
+            << ", " << a86 << ", " << a87 << ", " << a88 << ", " << a89 << ", "
+            << a90 << ", " << a91 << ", " << a92 << ", " << a93 << ", " << a94
+            << ", " << a95 << ", " << a96 << ", " << a97 << ", " << a98 << ", "
+            << a99 << ", " << a100 << ", " << a101 << ", " << a102 << ", "
+            << a103 << ", " << a104 << ", " << a105 << ", " << a106 << ", "
+            << a107 << ", " << a108 << ", " << a109 << ", " << a110 << ", "
+            << a111 << ", " << a112 << ", " << a113 << ", " << a114 << ", "
+            << a115 << ", " << a116 << ", " << a117 << ", " << a118 << ", "
+            << a119 << ", " << a120 << ", " << a121 << ", " << a122 << ", "
+            << a123 << ", " << a124 << ", " << a125 << ", " << a126 << ", "
+            << a127 << ")"
+            << "\n";
+
+  Struct1024BytesHomogeneousUint64 result;
+
+  result.a0 = a0;
+  result.a1 = a1;
+  result.a2 = a2;
+  result.a3 = a3;
+  result.a4 = a4;
+  result.a5 = a5;
+  result.a6 = a6;
+  result.a7 = a7;
+  result.a8 = a8;
+  result.a9 = a9;
+  result.a10 = a10;
+  result.a11 = a11;
+  result.a12 = a12;
+  result.a13 = a13;
+  result.a14 = a14;
+  result.a15 = a15;
+  result.a16 = a16;
+  result.a17 = a17;
+  result.a18 = a18;
+  result.a19 = a19;
+  result.a20 = a20;
+  result.a21 = a21;
+  result.a22 = a22;
+  result.a23 = a23;
+  result.a24 = a24;
+  result.a25 = a25;
+  result.a26 = a26;
+  result.a27 = a27;
+  result.a28 = a28;
+  result.a29 = a29;
+  result.a30 = a30;
+  result.a31 = a31;
+  result.a32 = a32;
+  result.a33 = a33;
+  result.a34 = a34;
+  result.a35 = a35;
+  result.a36 = a36;
+  result.a37 = a37;
+  result.a38 = a38;
+  result.a39 = a39;
+  result.a40 = a40;
+  result.a41 = a41;
+  result.a42 = a42;
+  result.a43 = a43;
+  result.a44 = a44;
+  result.a45 = a45;
+  result.a46 = a46;
+  result.a47 = a47;
+  result.a48 = a48;
+  result.a49 = a49;
+  result.a50 = a50;
+  result.a51 = a51;
+  result.a52 = a52;
+  result.a53 = a53;
+  result.a54 = a54;
+  result.a55 = a55;
+  result.a56 = a56;
+  result.a57 = a57;
+  result.a58 = a58;
+  result.a59 = a59;
+  result.a60 = a60;
+  result.a61 = a61;
+  result.a62 = a62;
+  result.a63 = a63;
+  result.a64 = a64;
+  result.a65 = a65;
+  result.a66 = a66;
+  result.a67 = a67;
+  result.a68 = a68;
+  result.a69 = a69;
+  result.a70 = a70;
+  result.a71 = a71;
+  result.a72 = a72;
+  result.a73 = a73;
+  result.a74 = a74;
+  result.a75 = a75;
+  result.a76 = a76;
+  result.a77 = a77;
+  result.a78 = a78;
+  result.a79 = a79;
+  result.a80 = a80;
+  result.a81 = a81;
+  result.a82 = a82;
+  result.a83 = a83;
+  result.a84 = a84;
+  result.a85 = a85;
+  result.a86 = a86;
+  result.a87 = a87;
+  result.a88 = a88;
+  result.a89 = a89;
+  result.a90 = a90;
+  result.a91 = a91;
+  result.a92 = a92;
+  result.a93 = a93;
+  result.a94 = a94;
+  result.a95 = a95;
+  result.a96 = a96;
+  result.a97 = a97;
+  result.a98 = a98;
+  result.a99 = a99;
+  result.a100 = a100;
+  result.a101 = a101;
+  result.a102 = a102;
+  result.a103 = a103;
+  result.a104 = a104;
+  result.a105 = a105;
+  result.a106 = a106;
+  result.a107 = a107;
+  result.a108 = a108;
+  result.a109 = a109;
+  result.a110 = a110;
+  result.a111 = a111;
+  result.a112 = a112;
+  result.a113 = a113;
+  result.a114 = a114;
+  result.a115 = a115;
+  result.a116 = a116;
+  result.a117 = a117;
+  result.a118 = a118;
+  result.a119 = a119;
+  result.a120 = a120;
+  result.a121 = a121;
+  result.a122 = a122;
+  result.a123 = a123;
+  result.a124 = a124;
+  result.a125 = a125;
+  result.a126 = a126;
+  result.a127 = a127;
+
+  std::cout << "result = "
+            << "(" << result.a0 << ", " << result.a1 << ", " << result.a2
+            << ", " << result.a3 << ", " << result.a4 << ", " << result.a5
+            << ", " << result.a6 << ", " << result.a7 << ", " << result.a8
+            << ", " << result.a9 << ", " << result.a10 << ", " << result.a11
+            << ", " << result.a12 << ", " << result.a13 << ", " << result.a14
+            << ", " << result.a15 << ", " << result.a16 << ", " << result.a17
+            << ", " << result.a18 << ", " << result.a19 << ", " << result.a20
+            << ", " << result.a21 << ", " << result.a22 << ", " << result.a23
+            << ", " << result.a24 << ", " << result.a25 << ", " << result.a26
+            << ", " << result.a27 << ", " << result.a28 << ", " << result.a29
+            << ", " << result.a30 << ", " << result.a31 << ", " << result.a32
+            << ", " << result.a33 << ", " << result.a34 << ", " << result.a35
+            << ", " << result.a36 << ", " << result.a37 << ", " << result.a38
+            << ", " << result.a39 << ", " << result.a40 << ", " << result.a41
+            << ", " << result.a42 << ", " << result.a43 << ", " << result.a44
+            << ", " << result.a45 << ", " << result.a46 << ", " << result.a47
+            << ", " << result.a48 << ", " << result.a49 << ", " << result.a50
+            << ", " << result.a51 << ", " << result.a52 << ", " << result.a53
+            << ", " << result.a54 << ", " << result.a55 << ", " << result.a56
+            << ", " << result.a57 << ", " << result.a58 << ", " << result.a59
+            << ", " << result.a60 << ", " << result.a61 << ", " << result.a62
+            << ", " << result.a63 << ", " << result.a64 << ", " << result.a65
+            << ", " << result.a66 << ", " << result.a67 << ", " << result.a68
+            << ", " << result.a69 << ", " << result.a70 << ", " << result.a71
+            << ", " << result.a72 << ", " << result.a73 << ", " << result.a74
+            << ", " << result.a75 << ", " << result.a76 << ", " << result.a77
+            << ", " << result.a78 << ", " << result.a79 << ", " << result.a80
+            << ", " << result.a81 << ", " << result.a82 << ", " << result.a83
+            << ", " << result.a84 << ", " << result.a85 << ", " << result.a86
+            << ", " << result.a87 << ", " << result.a88 << ", " << result.a89
+            << ", " << result.a90 << ", " << result.a91 << ", " << result.a92
+            << ", " << result.a93 << ", " << result.a94 << ", " << result.a95
+            << ", " << result.a96 << ", " << result.a97 << ", " << result.a98
+            << ", " << result.a99 << ", " << result.a100 << ", " << result.a101
+            << ", " << result.a102 << ", " << result.a103 << ", " << result.a104
+            << ", " << result.a105 << ", " << result.a106 << ", " << result.a107
+            << ", " << result.a108 << ", " << result.a109 << ", " << result.a110
+            << ", " << result.a111 << ", " << result.a112 << ", " << result.a113
+            << ", " << result.a114 << ", " << result.a115 << ", " << result.a116
+            << ", " << result.a117 << ", " << result.a118 << ", " << result.a119
+            << ", " << result.a120 << ", " << result.a121 << ", " << result.a122
+            << ", " << result.a123 << ", " << result.a124 << ", " << result.a125
+            << ", " << result.a126 << ", " << result.a127 << ")"
+            << "\n";
+
+  return result;
+}
+
+// Used for testing structs by value.
+// Test that a struct passed in as argument can be returned.
+// Especially for ffi callbacks.
+// Struct is passed in int registers in most ABIs.
+DART_EXPORT Struct1ByteInt
+ReturnStructArgumentStruct1ByteInt(Struct1ByteInt a0) {
+  std::cout << "ReturnStructArgumentStruct1ByteInt"
+            << "((" << static_cast<int>(a0.a0) << "))"
+            << "\n";
+
+  Struct1ByteInt result = a0;
+
+  std::cout << "result = "
+            << "(" << static_cast<int>(result.a0) << ")"
+            << "\n";
+
+  return result;
+}
+
+// Used for testing structs by value.
+// Test that a struct passed in as argument can be returned.
+// Especially for ffi callbacks.
+// Struct is passed on stack on all ABIs.
+DART_EXPORT Struct1ByteInt
+ReturnStructArgumentInt32x8Struct1ByteInt(int32_t a0,
+                                          int32_t a1,
+                                          int32_t a2,
+                                          int32_t a3,
+                                          int32_t a4,
+                                          int32_t a5,
+                                          int32_t a6,
+                                          int32_t a7,
+                                          Struct1ByteInt a8) {
+  std::cout << "ReturnStructArgumentInt32x8Struct1ByteInt"
+            << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ", " << a4
+            << ", " << a5 << ", " << a6 << ", " << a7 << ", ("
+            << static_cast<int>(a8.a0) << "))"
+            << "\n";
+
+  Struct1ByteInt result = a8;
+
+  std::cout << "result = "
+            << "(" << static_cast<int>(result.a0) << ")"
+            << "\n";
+
+  return result;
+}
+
+// Used for testing structs by value.
+// Test that a struct passed in as argument can be returned.
+// Especially for ffi callbacks.
+// Struct is passed in float registers in most ABIs.
+DART_EXPORT Struct8BytesHomogeneousFloat
+ReturnStructArgumentStruct8BytesHomogeneousFloat(
+    Struct8BytesHomogeneousFloat a0) {
+  std::cout << "ReturnStructArgumentStruct8BytesHomogeneousFloat"
+            << "((" << a0.a0 << ", " << a0.a1 << "))"
+            << "\n";
+
+  Struct8BytesHomogeneousFloat result = a0;
+
+  std::cout << "result = "
+            << "(" << result.a0 << ", " << result.a1 << ")"
+            << "\n";
+
+  return result;
+}
+
+// Used for testing structs by value.
+// On arm64, both argument and return value are passed in by pointer.
+DART_EXPORT Struct20BytesHomogeneousInt32
+ReturnStructArgumentStruct20BytesHomogeneousInt32(
+    Struct20BytesHomogeneousInt32 a0) {
+  std::cout << "ReturnStructArgumentStruct20BytesHomogeneousInt32"
+            << "((" << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << ", " << a0.a3
+            << ", " << a0.a4 << "))"
+            << "\n";
+
+  Struct20BytesHomogeneousInt32 result = a0;
+
+  std::cout << "result = "
+            << "(" << result.a0 << ", " << result.a1 << ", " << result.a2
+            << ", " << result.a3 << ", " << result.a4 << ")"
+            << "\n";
+
+  return result;
+}
+
+// Used for testing structs by value.
+// On arm64, both argument and return value are passed in by pointer.
+// Ints exhaust registers, so that pointer is passed on stack.
+DART_EXPORT Struct20BytesHomogeneousInt32
+ReturnStructArgumentInt32x8Struct20BytesHomogeneou(
+    int32_t a0,
+    int32_t a1,
+    int32_t a2,
+    int32_t a3,
+    int32_t a4,
+    int32_t a5,
+    int32_t a6,
+    int32_t a7,
+    Struct20BytesHomogeneousInt32 a8) {
+  std::cout << "ReturnStructArgumentInt32x8Struct20BytesHomogeneou"
+            << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ", " << a4
+            << ", " << a5 << ", " << a6 << ", " << a7 << ", (" << a8.a0 << ", "
+            << a8.a1 << ", " << a8.a2 << ", " << a8.a3 << ", " << a8.a4 << "))"
+            << "\n";
+
+  Struct20BytesHomogeneousInt32 result = a8;
+
+  std::cout << "result = "
+            << "(" << result.a0 << ", " << result.a1 << ", " << result.a2
+            << ", " << result.a3 << ", " << result.a4 << ")"
+            << "\n";
+
+  return result;
+}
+
+// Used for testing structs by value.
+// Test alignment and padding of 16 byte int within struct.
+DART_EXPORT StructAlignmentInt16 ReturnStructAlignmentInt16(int8_t a0,
+                                                            int16_t a1,
+                                                            int8_t a2) {
+  std::cout << "ReturnStructAlignmentInt16"
+            << "(" << static_cast<int>(a0) << ", " << a1 << ", "
+            << static_cast<int>(a2) << ")"
+            << "\n";
+
+  StructAlignmentInt16 result;
+
+  result.a0 = a0;
+  result.a1 = a1;
+  result.a2 = a2;
+
+  std::cout << "result = "
+            << "(" << static_cast<int>(result.a0) << ", " << result.a1 << ", "
+            << static_cast<int>(result.a2) << ")"
+            << "\n";
+
+  return result;
+}
+
+// Used for testing structs by value.
+// Test alignment and padding of 32 byte int within struct.
+DART_EXPORT StructAlignmentInt32 ReturnStructAlignmentInt32(int8_t a0,
+                                                            int32_t a1,
+                                                            int8_t a2) {
+  std::cout << "ReturnStructAlignmentInt32"
+            << "(" << static_cast<int>(a0) << ", " << a1 << ", "
+            << static_cast<int>(a2) << ")"
+            << "\n";
+
+  StructAlignmentInt32 result;
+
+  result.a0 = a0;
+  result.a1 = a1;
+  result.a2 = a2;
+
+  std::cout << "result = "
+            << "(" << static_cast<int>(result.a0) << ", " << result.a1 << ", "
+            << static_cast<int>(result.a2) << ")"
+            << "\n";
+
+  return result;
+}
+
+// Used for testing structs by value.
+// Test alignment and padding of 64 byte int within struct.
+DART_EXPORT StructAlignmentInt64 ReturnStructAlignmentInt64(int8_t a0,
+                                                            int64_t a1,
+                                                            int8_t a2) {
+  std::cout << "ReturnStructAlignmentInt64"
+            << "(" << static_cast<int>(a0) << ", " << a1 << ", "
+            << static_cast<int>(a2) << ")"
+            << "\n";
+
+  StructAlignmentInt64 result;
+
+  result.a0 = a0;
+  result.a1 = a1;
+  result.a2 = a2;
+
+  std::cout << "result = "
+            << "(" << static_cast<int>(result.a0) << ", " << result.a1 << ", "
+            << static_cast<int>(result.a2) << ")"
+            << "\n";
+
+  return result;
+}
+
+// Used for testing structs by value.
+// Smallest struct with data.
+// 10 struct arguments will exhaust available registers.
+DART_EXPORT intptr_t TestPassStruct1ByteIntx10(
+    // NOLINTNEXTLINE(whitespace/parens)
+    int64_t (*f)(Struct1ByteInt a0,
+                 Struct1ByteInt a1,
+                 Struct1ByteInt a2,
+                 Struct1ByteInt a3,
+                 Struct1ByteInt a4,
+                 Struct1ByteInt a5,
+                 Struct1ByteInt a6,
+                 Struct1ByteInt a7,
+                 Struct1ByteInt a8,
+                 Struct1ByteInt a9)) {
+  Struct1ByteInt a0;
+  Struct1ByteInt a1;
+  Struct1ByteInt a2;
+  Struct1ByteInt a3;
+  Struct1ByteInt a4;
+  Struct1ByteInt a5;
+  Struct1ByteInt a6;
+  Struct1ByteInt a7;
+  Struct1ByteInt a8;
+  Struct1ByteInt a9;
+
+  a0.a0 = -1;
+  a1.a0 = 2;
+  a2.a0 = -3;
+  a3.a0 = 4;
+  a4.a0 = -5;
+  a5.a0 = 6;
+  a6.a0 = -7;
+  a7.a0 = 8;
+  a8.a0 = -9;
+  a9.a0 = 10;
+
+  std::cout << "Calling TestPassStruct1ByteIntx10("
+            << "((" << static_cast<int>(a0.a0) << "), ("
+            << static_cast<int>(a1.a0) << "), (" << static_cast<int>(a2.a0)
+            << "), (" << static_cast<int>(a3.a0) << "), ("
+            << static_cast<int>(a4.a0) << "), (" << static_cast<int>(a5.a0)
+            << "), (" << static_cast<int>(a6.a0) << "), ("
+            << static_cast<int>(a7.a0) << "), (" << static_cast<int>(a8.a0)
+            << "), (" << static_cast<int>(a9.a0) << "))"
+            << ")\n";
+
+  int64_t result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+  std::cout << "result = " << result << "\n";
+
+  CHECK_EQ(5, result);
+
+  // Pass argument that will make the Dart callback throw.
+  a0.a0 = 42;
+
+  result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+  CHECK_EQ(0, result);
+
+  // Pass argument that will make the Dart callback return null.
+  a0.a0 = 84;
+
+  result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+  CHECK_EQ(0, result);
+
+  return 0;
+}
+
+// Used for testing structs by value.
+// Not a multiple of word size, not a power of two.
+// 10 struct arguments will exhaust available registers.
+DART_EXPORT intptr_t TestPassStruct3BytesHomogeneousUint8x10(
+    // NOLINTNEXTLINE(whitespace/parens)
+    int64_t (*f)(Struct3BytesHomogeneousUint8 a0,
+                 Struct3BytesHomogeneousUint8 a1,
+                 Struct3BytesHomogeneousUint8 a2,
+                 Struct3BytesHomogeneousUint8 a3,
+                 Struct3BytesHomogeneousUint8 a4,
+                 Struct3BytesHomogeneousUint8 a5,
+                 Struct3BytesHomogeneousUint8 a6,
+                 Struct3BytesHomogeneousUint8 a7,
+                 Struct3BytesHomogeneousUint8 a8,
+                 Struct3BytesHomogeneousUint8 a9)) {
+  Struct3BytesHomogeneousUint8 a0;
+  Struct3BytesHomogeneousUint8 a1;
+  Struct3BytesHomogeneousUint8 a2;
+  Struct3BytesHomogeneousUint8 a3;
+  Struct3BytesHomogeneousUint8 a4;
+  Struct3BytesHomogeneousUint8 a5;
+  Struct3BytesHomogeneousUint8 a6;
+  Struct3BytesHomogeneousUint8 a7;
+  Struct3BytesHomogeneousUint8 a8;
+  Struct3BytesHomogeneousUint8 a9;
+
+  a0.a0 = 1;
+  a0.a1 = 2;
+  a0.a2 = 3;
+  a1.a0 = 4;
+  a1.a1 = 5;
+  a1.a2 = 6;
+  a2.a0 = 7;
+  a2.a1 = 8;
+  a2.a2 = 9;
+  a3.a0 = 10;
+  a3.a1 = 11;
+  a3.a2 = 12;
+  a4.a0 = 13;
+  a4.a1 = 14;
+  a4.a2 = 15;
+  a5.a0 = 16;
+  a5.a1 = 17;
+  a5.a2 = 18;
+  a6.a0 = 19;
+  a6.a1 = 20;
+  a6.a2 = 21;
+  a7.a0 = 22;
+  a7.a1 = 23;
+  a7.a2 = 24;
+  a8.a0 = 25;
+  a8.a1 = 26;
+  a8.a2 = 27;
+  a9.a0 = 28;
+  a9.a1 = 29;
+  a9.a2 = 30;
+
+  std::cout << "Calling TestPassStruct3BytesHomogeneousUint8x10("
+            << "((" << static_cast<int>(a0.a0) << ", "
+            << static_cast<int>(a0.a1) << ", " << static_cast<int>(a0.a2)
+            << "), (" << static_cast<int>(a1.a0) << ", "
+            << static_cast<int>(a1.a1) << ", " << static_cast<int>(a1.a2)
+            << "), (" << static_cast<int>(a2.a0) << ", "
+            << static_cast<int>(a2.a1) << ", " << static_cast<int>(a2.a2)
+            << "), (" << static_cast<int>(a3.a0) << ", "
+            << static_cast<int>(a3.a1) << ", " << static_cast<int>(a3.a2)
+            << "), (" << static_cast<int>(a4.a0) << ", "
+            << static_cast<int>(a4.a1) << ", " << static_cast<int>(a4.a2)
+            << "), (" << static_cast<int>(a5.a0) << ", "
+            << static_cast<int>(a5.a1) << ", " << static_cast<int>(a5.a2)
+            << "), (" << static_cast<int>(a6.a0) << ", "
+            << static_cast<int>(a6.a1) << ", " << static_cast<int>(a6.a2)
+            << "), (" << static_cast<int>(a7.a0) << ", "
+            << static_cast<int>(a7.a1) << ", " << static_cast<int>(a7.a2)
+            << "), (" << static_cast<int>(a8.a0) << ", "
+            << static_cast<int>(a8.a1) << ", " << static_cast<int>(a8.a2)
+            << "), (" << static_cast<int>(a9.a0) << ", "
+            << static_cast<int>(a9.a1) << ", " << static_cast<int>(a9.a2)
+            << "))"
+            << ")\n";
+
+  int64_t result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+  std::cout << "result = " << result << "\n";
+
+  CHECK_EQ(465, result);
+
+  // Pass argument that will make the Dart callback throw.
+  a0.a0 = 42;
+
+  result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+  CHECK_EQ(0, result);
+
+  // Pass argument that will make the Dart callback return null.
+  a0.a0 = 84;
+
+  result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+  CHECK_EQ(0, result);
+
+  return 0;
+}
+
+// Used for testing structs by value.
+// Not a multiple of word size, not a power of two.
+// With alignment rules taken into account size is 4 bytes.
+// 10 struct arguments will exhaust available registers.
+DART_EXPORT intptr_t TestPassStruct3BytesInt2ByteAlignedx10(
+    // NOLINTNEXTLINE(whitespace/parens)
+    int64_t (*f)(Struct3BytesInt2ByteAligned a0,
+                 Struct3BytesInt2ByteAligned a1,
+                 Struct3BytesInt2ByteAligned a2,
+                 Struct3BytesInt2ByteAligned a3,
+                 Struct3BytesInt2ByteAligned a4,
+                 Struct3BytesInt2ByteAligned a5,
+                 Struct3BytesInt2ByteAligned a6,
+                 Struct3BytesInt2ByteAligned a7,
+                 Struct3BytesInt2ByteAligned a8,
+                 Struct3BytesInt2ByteAligned a9)) {
+  Struct3BytesInt2ByteAligned a0;
+  Struct3BytesInt2ByteAligned a1;
+  Struct3BytesInt2ByteAligned a2;
+  Struct3BytesInt2ByteAligned a3;
+  Struct3BytesInt2ByteAligned a4;
+  Struct3BytesInt2ByteAligned a5;
+  Struct3BytesInt2ByteAligned a6;
+  Struct3BytesInt2ByteAligned a7;
+  Struct3BytesInt2ByteAligned a8;
+  Struct3BytesInt2ByteAligned a9;
+
+  a0.a0 = -1;
+  a0.a1 = 2;
+  a1.a0 = -3;
+  a1.a1 = 4;
+  a2.a0 = -5;
+  a2.a1 = 6;
+  a3.a0 = -7;
+  a3.a1 = 8;
+  a4.a0 = -9;
+  a4.a1 = 10;
+  a5.a0 = -11;
+  a5.a1 = 12;
+  a6.a0 = -13;
+  a6.a1 = 14;
+  a7.a0 = -15;
+  a7.a1 = 16;
+  a8.a0 = -17;
+  a8.a1 = 18;
+  a9.a0 = -19;
+  a9.a1 = 20;
+
+  std::cout << "Calling TestPassStruct3BytesInt2ByteAlignedx10("
+            << "((" << a0.a0 << ", " << static_cast<int>(a0.a1) << "), ("
+            << a1.a0 << ", " << static_cast<int>(a1.a1) << "), (" << a2.a0
+            << ", " << static_cast<int>(a2.a1) << "), (" << a3.a0 << ", "
+            << static_cast<int>(a3.a1) << "), (" << a4.a0 << ", "
+            << static_cast<int>(a4.a1) << "), (" << a5.a0 << ", "
+            << static_cast<int>(a5.a1) << "), (" << a6.a0 << ", "
+            << static_cast<int>(a6.a1) << "), (" << a7.a0 << ", "
+            << static_cast<int>(a7.a1) << "), (" << a8.a0 << ", "
+            << static_cast<int>(a8.a1) << "), (" << a9.a0 << ", "
+            << static_cast<int>(a9.a1) << "))"
+            << ")\n";
+
+  int64_t result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+  std::cout << "result = " << result << "\n";
+
+  CHECK_EQ(10, result);
+
+  // Pass argument that will make the Dart callback throw.
+  a0.a0 = 42;
+
+  result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+  CHECK_EQ(0, result);
+
+  // Pass argument that will make the Dart callback return null.
+  a0.a0 = 84;
+
+  result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+  CHECK_EQ(0, result);
+
+  return 0;
+}
+
+// Used for testing structs by value.
+// Exactly word size on 32-bit architectures.
+// 10 struct arguments will exhaust available registers.
+DART_EXPORT intptr_t TestPassStruct4BytesHomogeneousInt16x10(
+    // NOLINTNEXTLINE(whitespace/parens)
+    int64_t (*f)(Struct4BytesHomogeneousInt16 a0,
+                 Struct4BytesHomogeneousInt16 a1,
+                 Struct4BytesHomogeneousInt16 a2,
+                 Struct4BytesHomogeneousInt16 a3,
+                 Struct4BytesHomogeneousInt16 a4,
+                 Struct4BytesHomogeneousInt16 a5,
+                 Struct4BytesHomogeneousInt16 a6,
+                 Struct4BytesHomogeneousInt16 a7,
+                 Struct4BytesHomogeneousInt16 a8,
+                 Struct4BytesHomogeneousInt16 a9)) {
+  Struct4BytesHomogeneousInt16 a0;
+  Struct4BytesHomogeneousInt16 a1;
+  Struct4BytesHomogeneousInt16 a2;
+  Struct4BytesHomogeneousInt16 a3;
+  Struct4BytesHomogeneousInt16 a4;
+  Struct4BytesHomogeneousInt16 a5;
+  Struct4BytesHomogeneousInt16 a6;
+  Struct4BytesHomogeneousInt16 a7;
+  Struct4BytesHomogeneousInt16 a8;
+  Struct4BytesHomogeneousInt16 a9;
+
+  a0.a0 = -1;
+  a0.a1 = 2;
+  a1.a0 = -3;
+  a1.a1 = 4;
+  a2.a0 = -5;
+  a2.a1 = 6;
+  a3.a0 = -7;
+  a3.a1 = 8;
+  a4.a0 = -9;
+  a4.a1 = 10;
+  a5.a0 = -11;
+  a5.a1 = 12;
+  a6.a0 = -13;
+  a6.a1 = 14;
+  a7.a0 = -15;
+  a7.a1 = 16;
+  a8.a0 = -17;
+  a8.a1 = 18;
+  a9.a0 = -19;
+  a9.a1 = 20;
+
+  std::cout << "Calling TestPassStruct4BytesHomogeneousInt16x10("
+            << "((" << a0.a0 << ", " << a0.a1 << "), (" << a1.a0 << ", "
+            << a1.a1 << "), (" << a2.a0 << ", " << a2.a1 << "), (" << a3.a0
+            << ", " << a3.a1 << "), (" << a4.a0 << ", " << a4.a1 << "), ("
+            << a5.a0 << ", " << a5.a1 << "), (" << a6.a0 << ", " << a6.a1
+            << "), (" << a7.a0 << ", " << a7.a1 << "), (" << a8.a0 << ", "
+            << a8.a1 << "), (" << a9.a0 << ", " << a9.a1 << "))"
+            << ")\n";
+
+  int64_t result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+  std::cout << "result = " << result << "\n";
+
+  CHECK_EQ(10, result);
+
+  // Pass argument that will make the Dart callback throw.
+  a0.a0 = 42;
+
+  result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+  CHECK_EQ(0, result);
+
+  // Pass argument that will make the Dart callback return null.
+  a0.a0 = 84;
+
+  result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+  CHECK_EQ(0, result);
+
+  return 0;
+}
+
+// Used for testing structs by value.
+// Sub word size on 64 bit architectures.
+// 10 struct arguments will exhaust available registers.
+DART_EXPORT intptr_t TestPassStruct7BytesHomogeneousUint8x10(
+    // NOLINTNEXTLINE(whitespace/parens)
+    int64_t (*f)(Struct7BytesHomogeneousUint8 a0,
+                 Struct7BytesHomogeneousUint8 a1,
+                 Struct7BytesHomogeneousUint8 a2,
+                 Struct7BytesHomogeneousUint8 a3,
+                 Struct7BytesHomogeneousUint8 a4,
+                 Struct7BytesHomogeneousUint8 a5,
+                 Struct7BytesHomogeneousUint8 a6,
+                 Struct7BytesHomogeneousUint8 a7,
+                 Struct7BytesHomogeneousUint8 a8,
+                 Struct7BytesHomogeneousUint8 a9)) {
+  Struct7BytesHomogeneousUint8 a0;
+  Struct7BytesHomogeneousUint8 a1;
+  Struct7BytesHomogeneousUint8 a2;
+  Struct7BytesHomogeneousUint8 a3;
+  Struct7BytesHomogeneousUint8 a4;
+  Struct7BytesHomogeneousUint8 a5;
+  Struct7BytesHomogeneousUint8 a6;
+  Struct7BytesHomogeneousUint8 a7;
+  Struct7BytesHomogeneousUint8 a8;
+  Struct7BytesHomogeneousUint8 a9;
+
+  a0.a0 = 1;
+  a0.a1 = 2;
+  a0.a2 = 3;
+  a0.a3 = 4;
+  a0.a4 = 5;
+  a0.a5 = 6;
+  a0.a6 = 7;
+  a1.a0 = 8;
+  a1.a1 = 9;
+  a1.a2 = 10;
+  a1.a3 = 11;
+  a1.a4 = 12;
+  a1.a5 = 13;
+  a1.a6 = 14;
+  a2.a0 = 15;
+  a2.a1 = 16;
+  a2.a2 = 17;
+  a2.a3 = 18;
+  a2.a4 = 19;
+  a2.a5 = 20;
+  a2.a6 = 21;
+  a3.a0 = 22;
+  a3.a1 = 23;
+  a3.a2 = 24;
+  a3.a3 = 25;
+  a3.a4 = 26;
+  a3.a5 = 27;
+  a3.a6 = 28;
+  a4.a0 = 29;
+  a4.a1 = 30;
+  a4.a2 = 31;
+  a4.a3 = 32;
+  a4.a4 = 33;
+  a4.a5 = 34;
+  a4.a6 = 35;
+  a5.a0 = 36;
+  a5.a1 = 37;
+  a5.a2 = 38;
+  a5.a3 = 39;
+  a5.a4 = 40;
+  a5.a5 = 41;
+  a5.a6 = 42;
+  a6.a0 = 43;
+  a6.a1 = 44;
+  a6.a2 = 45;
+  a6.a3 = 46;
+  a6.a4 = 47;
+  a6.a5 = 48;
+  a6.a6 = 49;
+  a7.a0 = 50;
+  a7.a1 = 51;
+  a7.a2 = 52;
+  a7.a3 = 53;
+  a7.a4 = 54;
+  a7.a5 = 55;
+  a7.a6 = 56;
+  a8.a0 = 57;
+  a8.a1 = 58;
+  a8.a2 = 59;
+  a8.a3 = 60;
+  a8.a4 = 61;
+  a8.a5 = 62;
+  a8.a6 = 63;
+  a9.a0 = 64;
+  a9.a1 = 65;
+  a9.a2 = 66;
+  a9.a3 = 67;
+  a9.a4 = 68;
+  a9.a5 = 69;
+  a9.a6 = 70;
+
+  std::cout
+      << "Calling TestPassStruct7BytesHomogeneousUint8x10("
+      << "((" << static_cast<int>(a0.a0) << ", " << static_cast<int>(a0.a1)
+      << ", " << static_cast<int>(a0.a2) << ", " << static_cast<int>(a0.a3)
+      << ", " << static_cast<int>(a0.a4) << ", " << static_cast<int>(a0.a5)
+      << ", " << static_cast<int>(a0.a6) << "), (" << static_cast<int>(a1.a0)
+      << ", " << static_cast<int>(a1.a1) << ", " << static_cast<int>(a1.a2)
+      << ", " << static_cast<int>(a1.a3) << ", " << static_cast<int>(a1.a4)
+      << ", " << static_cast<int>(a1.a5) << ", " << static_cast<int>(a1.a6)
+      << "), (" << static_cast<int>(a2.a0) << ", " << static_cast<int>(a2.a1)
+      << ", " << static_cast<int>(a2.a2) << ", " << static_cast<int>(a2.a3)
+      << ", " << static_cast<int>(a2.a4) << ", " << static_cast<int>(a2.a5)
+      << ", " << static_cast<int>(a2.a6) << "), (" << static_cast<int>(a3.a0)
+      << ", " << static_cast<int>(a3.a1) << ", " << static_cast<int>(a3.a2)
+      << ", " << static_cast<int>(a3.a3) << ", " << static_cast<int>(a3.a4)
+      << ", " << static_cast<int>(a3.a5) << ", " << static_cast<int>(a3.a6)
+      << "), (" << static_cast<int>(a4.a0) << ", " << static_cast<int>(a4.a1)
+      << ", " << static_cast<int>(a4.a2) << ", " << static_cast<int>(a4.a3)
+      << ", " << static_cast<int>(a4.a4) << ", " << static_cast<int>(a4.a5)
+      << ", " << static_cast<int>(a4.a6) << "), (" << static_cast<int>(a5.a0)
+      << ", " << static_cast<int>(a5.a1) << ", " << static_cast<int>(a5.a2)
+      << ", " << static_cast<int>(a5.a3) << ", " << static_cast<int>(a5.a4)
+      << ", " << static_cast<int>(a5.a5) << ", " << static_cast<int>(a5.a6)
+      << "), (" << static_cast<int>(a6.a0) << ", " << static_cast<int>(a6.a1)
+      << ", " << static_cast<int>(a6.a2) << ", " << static_cast<int>(a6.a3)
+      << ", " << static_cast<int>(a6.a4) << ", " << static_cast<int>(a6.a5)
+      << ", " << static_cast<int>(a6.a6) << "), (" << static_cast<int>(a7.a0)
+      << ", " << static_cast<int>(a7.a1) << ", " << static_cast<int>(a7.a2)
+      << ", " << static_cast<int>(a7.a3) << ", " << static_cast<int>(a7.a4)
+      << ", " << static_cast<int>(a7.a5) << ", " << static_cast<int>(a7.a6)
+      << "), (" << static_cast<int>(a8.a0) << ", " << static_cast<int>(a8.a1)
+      << ", " << static_cast<int>(a8.a2) << ", " << static_cast<int>(a8.a3)
+      << ", " << static_cast<int>(a8.a4) << ", " << static_cast<int>(a8.a5)
+      << ", " << static_cast<int>(a8.a6) << "), (" << static_cast<int>(a9.a0)
+      << ", " << static_cast<int>(a9.a1) << ", " << static_cast<int>(a9.a2)
+      << ", " << static_cast<int>(a9.a3) << ", " << static_cast<int>(a9.a4)
+      << ", " << static_cast<int>(a9.a5) << ", " << static_cast<int>(a9.a6)
+      << "))"
+      << ")\n";
+
+  int64_t result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+  std::cout << "result = " << result << "\n";
+
+  CHECK_EQ(2485, result);
+
+  // Pass argument that will make the Dart callback throw.
+  a0.a0 = 42;
+
+  result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+  CHECK_EQ(0, result);
+
+  // Pass argument that will make the Dart callback return null.
+  a0.a0 = 84;
+
+  result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+  CHECK_EQ(0, result);
+
+  return 0;
+}
+
+// Used for testing structs by value.
+// Sub word size on 64 bit architectures.
+// With alignment rules taken into account size is 8 bytes.
+// 10 struct arguments will exhaust available registers.
+DART_EXPORT intptr_t TestPassStruct7BytesInt4ByteAlignedx10(
+    // NOLINTNEXTLINE(whitespace/parens)
+    int64_t (*f)(Struct7BytesInt4ByteAligned a0,
+                 Struct7BytesInt4ByteAligned a1,
+                 Struct7BytesInt4ByteAligned a2,
+                 Struct7BytesInt4ByteAligned a3,
+                 Struct7BytesInt4ByteAligned a4,
+                 Struct7BytesInt4ByteAligned a5,
+                 Struct7BytesInt4ByteAligned a6,
+                 Struct7BytesInt4ByteAligned a7,
+                 Struct7BytesInt4ByteAligned a8,
+                 Struct7BytesInt4ByteAligned a9)) {
+  Struct7BytesInt4ByteAligned a0;
+  Struct7BytesInt4ByteAligned a1;
+  Struct7BytesInt4ByteAligned a2;
+  Struct7BytesInt4ByteAligned a3;
+  Struct7BytesInt4ByteAligned a4;
+  Struct7BytesInt4ByteAligned a5;
+  Struct7BytesInt4ByteAligned a6;
+  Struct7BytesInt4ByteAligned a7;
+  Struct7BytesInt4ByteAligned a8;
+  Struct7BytesInt4ByteAligned a9;
+
+  a0.a0 = -1;
+  a0.a1 = 2;
+  a0.a2 = -3;
+  a1.a0 = 4;
+  a1.a1 = -5;
+  a1.a2 = 6;
+  a2.a0 = -7;
+  a2.a1 = 8;
+  a2.a2 = -9;
+  a3.a0 = 10;
+  a3.a1 = -11;
+  a3.a2 = 12;
+  a4.a0 = -13;
+  a4.a1 = 14;
+  a4.a2 = -15;
+  a5.a0 = 16;
+  a5.a1 = -17;
+  a5.a2 = 18;
+  a6.a0 = -19;
+  a6.a1 = 20;
+  a6.a2 = -21;
+  a7.a0 = 22;
+  a7.a1 = -23;
+  a7.a2 = 24;
+  a8.a0 = -25;
+  a8.a1 = 26;
+  a8.a2 = -27;
+  a9.a0 = 28;
+  a9.a1 = -29;
+  a9.a2 = 30;
+
+  std::cout << "Calling TestPassStruct7BytesInt4ByteAlignedx10("
+            << "((" << a0.a0 << ", " << a0.a1 << ", " << static_cast<int>(a0.a2)
+            << "), (" << a1.a0 << ", " << a1.a1 << ", "
+            << static_cast<int>(a1.a2) << "), (" << a2.a0 << ", " << a2.a1
+            << ", " << static_cast<int>(a2.a2) << "), (" << a3.a0 << ", "
+            << a3.a1 << ", " << static_cast<int>(a3.a2) << "), (" << a4.a0
+            << ", " << a4.a1 << ", " << static_cast<int>(a4.a2) << "), ("
+            << a5.a0 << ", " << a5.a1 << ", " << static_cast<int>(a5.a2)
+            << "), (" << a6.a0 << ", " << a6.a1 << ", "
+            << static_cast<int>(a6.a2) << "), (" << a7.a0 << ", " << a7.a1
+            << ", " << static_cast<int>(a7.a2) << "), (" << a8.a0 << ", "
+            << a8.a1 << ", " << static_cast<int>(a8.a2) << "), (" << a9.a0
+            << ", " << a9.a1 << ", " << static_cast<int>(a9.a2) << "))"
+            << ")\n";
+
+  int64_t result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+  std::cout << "result = " << result << "\n";
+
+  CHECK_EQ(15, result);
+
+  // Pass argument that will make the Dart callback throw.
+  a0.a0 = 42;
+
+  result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+  CHECK_EQ(0, result);
+
+  // Pass argument that will make the Dart callback return null.
+  a0.a0 = 84;
+
+  result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+  CHECK_EQ(0, result);
+
+  return 0;
+}
+
+// Used for testing structs by value.
+// Exactly word size struct on 64bit architectures.
+// 10 struct arguments will exhaust available registers.
+DART_EXPORT intptr_t TestPassStruct8BytesIntx10(
+    // NOLINTNEXTLINE(whitespace/parens)
+    int64_t (*f)(Struct8BytesInt a0,
+                 Struct8BytesInt a1,
+                 Struct8BytesInt a2,
+                 Struct8BytesInt a3,
+                 Struct8BytesInt a4,
+                 Struct8BytesInt a5,
+                 Struct8BytesInt a6,
+                 Struct8BytesInt a7,
+                 Struct8BytesInt a8,
+                 Struct8BytesInt a9)) {
+  Struct8BytesInt a0;
+  Struct8BytesInt a1;
+  Struct8BytesInt a2;
+  Struct8BytesInt a3;
+  Struct8BytesInt a4;
+  Struct8BytesInt a5;
+  Struct8BytesInt a6;
+  Struct8BytesInt a7;
+  Struct8BytesInt a8;
+  Struct8BytesInt a9;
+
+  a0.a0 = -1;
+  a0.a1 = 2;
+  a0.a2 = -3;
+  a1.a0 = 4;
+  a1.a1 = -5;
+  a1.a2 = 6;
+  a2.a0 = -7;
+  a2.a1 = 8;
+  a2.a2 = -9;
+  a3.a0 = 10;
+  a3.a1 = -11;
+  a3.a2 = 12;
+  a4.a0 = -13;
+  a4.a1 = 14;
+  a4.a2 = -15;
+  a5.a0 = 16;
+  a5.a1 = -17;
+  a5.a2 = 18;
+  a6.a0 = -19;
+  a6.a1 = 20;
+  a6.a2 = -21;
+  a7.a0 = 22;
+  a7.a1 = -23;
+  a7.a2 = 24;
+  a8.a0 = -25;
+  a8.a1 = 26;
+  a8.a2 = -27;
+  a9.a0 = 28;
+  a9.a1 = -29;
+  a9.a2 = 30;
+
+  std::cout << "Calling TestPassStruct8BytesIntx10("
+            << "((" << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << "), ("
+            << a1.a0 << ", " << a1.a1 << ", " << a1.a2 << "), (" << a2.a0
+            << ", " << a2.a1 << ", " << a2.a2 << "), (" << a3.a0 << ", "
+            << a3.a1 << ", " << a3.a2 << "), (" << a4.a0 << ", " << a4.a1
+            << ", " << a4.a2 << "), (" << a5.a0 << ", " << a5.a1 << ", "
+            << a5.a2 << "), (" << a6.a0 << ", " << a6.a1 << ", " << a6.a2
+            << "), (" << a7.a0 << ", " << a7.a1 << ", " << a7.a2 << "), ("
+            << a8.a0 << ", " << a8.a1 << ", " << a8.a2 << "), (" << a9.a0
+            << ", " << a9.a1 << ", " << a9.a2 << "))"
+            << ")\n";
+
+  int64_t result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+  std::cout << "result = " << result << "\n";
+
+  CHECK_EQ(15, result);
+
+  // Pass argument that will make the Dart callback throw.
+  a0.a0 = 42;
+
+  result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+  CHECK_EQ(0, result);
+
+  // Pass argument that will make the Dart callback return null.
+  a0.a0 = 84;
+
+  result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+  CHECK_EQ(0, result);
+
+  return 0;
+}
+
+// Used for testing structs by value.
+// Arguments passed in FP registers as long as they fit.
+// 10 struct arguments will exhaust available registers.
+DART_EXPORT intptr_t TestPassStruct8BytesHomogeneousFloatx10(
+    // NOLINTNEXTLINE(whitespace/parens)
+    float (*f)(Struct8BytesHomogeneousFloat a0,
+               Struct8BytesHomogeneousFloat a1,
+               Struct8BytesHomogeneousFloat a2,
+               Struct8BytesHomogeneousFloat a3,
+               Struct8BytesHomogeneousFloat a4,
+               Struct8BytesHomogeneousFloat a5,
+               Struct8BytesHomogeneousFloat a6,
+               Struct8BytesHomogeneousFloat a7,
+               Struct8BytesHomogeneousFloat a8,
+               Struct8BytesHomogeneousFloat a9)) {
+  Struct8BytesHomogeneousFloat a0;
+  Struct8BytesHomogeneousFloat a1;
+  Struct8BytesHomogeneousFloat a2;
+  Struct8BytesHomogeneousFloat a3;
+  Struct8BytesHomogeneousFloat a4;
+  Struct8BytesHomogeneousFloat a5;
+  Struct8BytesHomogeneousFloat a6;
+  Struct8BytesHomogeneousFloat a7;
+  Struct8BytesHomogeneousFloat a8;
+  Struct8BytesHomogeneousFloat a9;
+
+  a0.a0 = -1.0;
+  a0.a1 = 2.0;
+  a1.a0 = -3.0;
+  a1.a1 = 4.0;
+  a2.a0 = -5.0;
+  a2.a1 = 6.0;
+  a3.a0 = -7.0;
+  a3.a1 = 8.0;
+  a4.a0 = -9.0;
+  a4.a1 = 10.0;
+  a5.a0 = -11.0;
+  a5.a1 = 12.0;
+  a6.a0 = -13.0;
+  a6.a1 = 14.0;
+  a7.a0 = -15.0;
+  a7.a1 = 16.0;
+  a8.a0 = -17.0;
+  a8.a1 = 18.0;
+  a9.a0 = -19.0;
+  a9.a1 = 20.0;
+
+  std::cout << "Calling TestPassStruct8BytesHomogeneousFloatx10("
+            << "((" << a0.a0 << ", " << a0.a1 << "), (" << a1.a0 << ", "
+            << a1.a1 << "), (" << a2.a0 << ", " << a2.a1 << "), (" << a3.a0
+            << ", " << a3.a1 << "), (" << a4.a0 << ", " << a4.a1 << "), ("
+            << a5.a0 << ", " << a5.a1 << "), (" << a6.a0 << ", " << a6.a1
+            << "), (" << a7.a0 << ", " << a7.a1 << "), (" << a8.a0 << ", "
+            << a8.a1 << "), (" << a9.a0 << ", " << a9.a1 << "))"
+            << ")\n";
+
+  float result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+  std::cout << "result = " << result << "\n";
+
+  CHECK_APPROX(10.0, result);
+
+  // Pass argument that will make the Dart callback throw.
+  a0.a0 = 42;
+
+  result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+  CHECK_APPROX(0.0, result);
+
+  // Pass argument that will make the Dart callback return null.
+  a0.a0 = 84;
+
+  result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+  CHECK_APPROX(0.0, result);
+
+  return 0;
+}
+
+// Used for testing structs by value.
+// On x64, arguments go in int registers because it is not only float.
+// 10 struct arguments will exhaust available registers.
+DART_EXPORT intptr_t TestPassStruct8BytesMixedx10(
+    // NOLINTNEXTLINE(whitespace/parens)
+    float (*f)(Struct8BytesMixed a0,
+               Struct8BytesMixed a1,
+               Struct8BytesMixed a2,
+               Struct8BytesMixed a3,
+               Struct8BytesMixed a4,
+               Struct8BytesMixed a5,
+               Struct8BytesMixed a6,
+               Struct8BytesMixed a7,
+               Struct8BytesMixed a8,
+               Struct8BytesMixed a9)) {
+  Struct8BytesMixed a0;
+  Struct8BytesMixed a1;
+  Struct8BytesMixed a2;
+  Struct8BytesMixed a3;
+  Struct8BytesMixed a4;
+  Struct8BytesMixed a5;
+  Struct8BytesMixed a6;
+  Struct8BytesMixed a7;
+  Struct8BytesMixed a8;
+  Struct8BytesMixed a9;
+
+  a0.a0 = -1.0;
+  a0.a1 = 2;
+  a0.a2 = -3;
+  a1.a0 = 4.0;
+  a1.a1 = -5;
+  a1.a2 = 6;
+  a2.a0 = -7.0;
+  a2.a1 = 8;
+  a2.a2 = -9;
+  a3.a0 = 10.0;
+  a3.a1 = -11;
+  a3.a2 = 12;
+  a4.a0 = -13.0;
+  a4.a1 = 14;
+  a4.a2 = -15;
+  a5.a0 = 16.0;
+  a5.a1 = -17;
+  a5.a2 = 18;
+  a6.a0 = -19.0;
+  a6.a1 = 20;
+  a6.a2 = -21;
+  a7.a0 = 22.0;
+  a7.a1 = -23;
+  a7.a2 = 24;
+  a8.a0 = -25.0;
+  a8.a1 = 26;
+  a8.a2 = -27;
+  a9.a0 = 28.0;
+  a9.a1 = -29;
+  a9.a2 = 30;
+
+  std::cout << "Calling TestPassStruct8BytesMixedx10("
+            << "((" << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << "), ("
+            << a1.a0 << ", " << a1.a1 << ", " << a1.a2 << "), (" << a2.a0
+            << ", " << a2.a1 << ", " << a2.a2 << "), (" << a3.a0 << ", "
+            << a3.a1 << ", " << a3.a2 << "), (" << a4.a0 << ", " << a4.a1
+            << ", " << a4.a2 << "), (" << a5.a0 << ", " << a5.a1 << ", "
+            << a5.a2 << "), (" << a6.a0 << ", " << a6.a1 << ", " << a6.a2
+            << "), (" << a7.a0 << ", " << a7.a1 << ", " << a7.a2 << "), ("
+            << a8.a0 << ", " << a8.a1 << ", " << a8.a2 << "), (" << a9.a0
+            << ", " << a9.a1 << ", " << a9.a2 << "))"
+            << ")\n";
+
+  float result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+  std::cout << "result = " << result << "\n";
+
+  CHECK_APPROX(15.0, result);
+
+  // Pass argument that will make the Dart callback throw.
+  a0.a0 = 42;
+
+  result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+  CHECK_APPROX(0.0, result);
+
+  // Pass argument that will make the Dart callback return null.
+  a0.a0 = 84;
+
+  result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+  CHECK_APPROX(0.0, result);
+
+  return 0;
+}
+
+// Used for testing structs by value.
+// Argument is a single byte over a multiple of word size.
+// 10 struct arguments will exhaust available registers.
+// Struct only has 1-byte aligned fields to test struct alignment itself.
+// Tests upper bytes in the integer registers that are partly filled.
+// Tests stack alignment of non word size stack arguments.
+DART_EXPORT intptr_t TestPassStruct9BytesHomogeneousUint8x10(
+    // NOLINTNEXTLINE(whitespace/parens)
+    int64_t (*f)(Struct9BytesHomogeneousUint8 a0,
+                 Struct9BytesHomogeneousUint8 a1,
+                 Struct9BytesHomogeneousUint8 a2,
+                 Struct9BytesHomogeneousUint8 a3,
+                 Struct9BytesHomogeneousUint8 a4,
+                 Struct9BytesHomogeneousUint8 a5,
+                 Struct9BytesHomogeneousUint8 a6,
+                 Struct9BytesHomogeneousUint8 a7,
+                 Struct9BytesHomogeneousUint8 a8,
+                 Struct9BytesHomogeneousUint8 a9)) {
+  Struct9BytesHomogeneousUint8 a0;
+  Struct9BytesHomogeneousUint8 a1;
+  Struct9BytesHomogeneousUint8 a2;
+  Struct9BytesHomogeneousUint8 a3;
+  Struct9BytesHomogeneousUint8 a4;
+  Struct9BytesHomogeneousUint8 a5;
+  Struct9BytesHomogeneousUint8 a6;
+  Struct9BytesHomogeneousUint8 a7;
+  Struct9BytesHomogeneousUint8 a8;
+  Struct9BytesHomogeneousUint8 a9;
+
+  a0.a0 = 1;
+  a0.a1 = 2;
+  a0.a2 = 3;
+  a0.a3 = 4;
+  a0.a4 = 5;
+  a0.a5 = 6;
+  a0.a6 = 7;
+  a0.a7 = 8;
+  a0.a8 = 9;
+  a1.a0 = 10;
+  a1.a1 = 11;
+  a1.a2 = 12;
+  a1.a3 = 13;
+  a1.a4 = 14;
+  a1.a5 = 15;
+  a1.a6 = 16;
+  a1.a7 = 17;
+  a1.a8 = 18;
+  a2.a0 = 19;
+  a2.a1 = 20;
+  a2.a2 = 21;
+  a2.a3 = 22;
+  a2.a4 = 23;
+  a2.a5 = 24;
+  a2.a6 = 25;
+  a2.a7 = 26;
+  a2.a8 = 27;
+  a3.a0 = 28;
+  a3.a1 = 29;
+  a3.a2 = 30;
+  a3.a3 = 31;
+  a3.a4 = 32;
+  a3.a5 = 33;
+  a3.a6 = 34;
+  a3.a7 = 35;
+  a3.a8 = 36;
+  a4.a0 = 37;
+  a4.a1 = 38;
+  a4.a2 = 39;
+  a4.a3 = 40;
+  a4.a4 = 41;
+  a4.a5 = 42;
+  a4.a6 = 43;
+  a4.a7 = 44;
+  a4.a8 = 45;
+  a5.a0 = 46;
+  a5.a1 = 47;
+  a5.a2 = 48;
+  a5.a3 = 49;
+  a5.a4 = 50;
+  a5.a5 = 51;
+  a5.a6 = 52;
+  a5.a7 = 53;
+  a5.a8 = 54;
+  a6.a0 = 55;
+  a6.a1 = 56;
+  a6.a2 = 57;
+  a6.a3 = 58;
+  a6.a4 = 59;
+  a6.a5 = 60;
+  a6.a6 = 61;
+  a6.a7 = 62;
+  a6.a8 = 63;
+  a7.a0 = 64;
+  a7.a1 = 65;
+  a7.a2 = 66;
+  a7.a3 = 67;
+  a7.a4 = 68;
+  a7.a5 = 69;
+  a7.a6 = 70;
+  a7.a7 = 71;
+  a7.a8 = 72;
+  a8.a0 = 73;
+  a8.a1 = 74;
+  a8.a2 = 75;
+  a8.a3 = 76;
+  a8.a4 = 77;
+  a8.a5 = 78;
+  a8.a6 = 79;
+  a8.a7 = 80;
+  a8.a8 = 81;
+  a9.a0 = 82;
+  a9.a1 = 83;
+  a9.a2 = 84;
+  a9.a3 = 85;
+  a9.a4 = 86;
+  a9.a5 = 87;
+  a9.a6 = 88;
+  a9.a7 = 89;
+  a9.a8 = 90;
+
+  std::cout
+      << "Calling TestPassStruct9BytesHomogeneousUint8x10("
+      << "((" << static_cast<int>(a0.a0) << ", " << static_cast<int>(a0.a1)
+      << ", " << static_cast<int>(a0.a2) << ", " << static_cast<int>(a0.a3)
+      << ", " << static_cast<int>(a0.a4) << ", " << static_cast<int>(a0.a5)
+      << ", " << static_cast<int>(a0.a6) << ", " << static_cast<int>(a0.a7)
+      << ", " << static_cast<int>(a0.a8) << "), (" << static_cast<int>(a1.a0)
+      << ", " << static_cast<int>(a1.a1) << ", " << static_cast<int>(a1.a2)
+      << ", " << static_cast<int>(a1.a3) << ", " << static_cast<int>(a1.a4)
+      << ", " << static_cast<int>(a1.a5) << ", " << static_cast<int>(a1.a6)
+      << ", " << static_cast<int>(a1.a7) << ", " << static_cast<int>(a1.a8)
+      << "), (" << static_cast<int>(a2.a0) << ", " << static_cast<int>(a2.a1)
+      << ", " << static_cast<int>(a2.a2) << ", " << static_cast<int>(a2.a3)
+      << ", " << static_cast<int>(a2.a4) << ", " << static_cast<int>(a2.a5)
+      << ", " << static_cast<int>(a2.a6) << ", " << static_cast<int>(a2.a7)
+      << ", " << static_cast<int>(a2.a8) << "), (" << static_cast<int>(a3.a0)
+      << ", " << static_cast<int>(a3.a1) << ", " << static_cast<int>(a3.a2)
+      << ", " << static_cast<int>(a3.a3) << ", " << static_cast<int>(a3.a4)
+      << ", " << static_cast<int>(a3.a5) << ", " << static_cast<int>(a3.a6)
+      << ", " << static_cast<int>(a3.a7) << ", " << static_cast<int>(a3.a8)
+      << "), (" << static_cast<int>(a4.a0) << ", " << static_cast<int>(a4.a1)
+      << ", " << static_cast<int>(a4.a2) << ", " << static_cast<int>(a4.a3)
+      << ", " << static_cast<int>(a4.a4) << ", " << static_cast<int>(a4.a5)
+      << ", " << static_cast<int>(a4.a6) << ", " << static_cast<int>(a4.a7)
+      << ", " << static_cast<int>(a4.a8) << "), (" << static_cast<int>(a5.a0)
+      << ", " << static_cast<int>(a5.a1) << ", " << static_cast<int>(a5.a2)
+      << ", " << static_cast<int>(a5.a3) << ", " << static_cast<int>(a5.a4)
+      << ", " << static_cast<int>(a5.a5) << ", " << static_cast<int>(a5.a6)
+      << ", " << static_cast<int>(a5.a7) << ", " << static_cast<int>(a5.a8)
+      << "), (" << static_cast<int>(a6.a0) << ", " << static_cast<int>(a6.a1)
+      << ", " << static_cast<int>(a6.a2) << ", " << static_cast<int>(a6.a3)
+      << ", " << static_cast<int>(a6.a4) << ", " << static_cast<int>(a6.a5)
+      << ", " << static_cast<int>(a6.a6) << ", " << static_cast<int>(a6.a7)
+      << ", " << static_cast<int>(a6.a8) << "), (" << static_cast<int>(a7.a0)
+      << ", " << static_cast<int>(a7.a1) << ", " << static_cast<int>(a7.a2)
+      << ", " << static_cast<int>(a7.a3) << ", " << static_cast<int>(a7.a4)
+      << ", " << static_cast<int>(a7.a5) << ", " << static_cast<int>(a7.a6)
+      << ", " << static_cast<int>(a7.a7) << ", " << static_cast<int>(a7.a8)
+      << "), (" << static_cast<int>(a8.a0) << ", " << static_cast<int>(a8.a1)
+      << ", " << static_cast<int>(a8.a2) << ", " << static_cast<int>(a8.a3)
+      << ", " << static_cast<int>(a8.a4) << ", " << static_cast<int>(a8.a5)
+      << ", " << static_cast<int>(a8.a6) << ", " << static_cast<int>(a8.a7)
+      << ", " << static_cast<int>(a8.a8) << "), (" << static_cast<int>(a9.a0)
+      << ", " << static_cast<int>(a9.a1) << ", " << static_cast<int>(a9.a2)
+      << ", " << static_cast<int>(a9.a3) << ", " << static_cast<int>(a9.a4)
+      << ", " << static_cast<int>(a9.a5) << ", " << static_cast<int>(a9.a6)
+      << ", " << static_cast<int>(a9.a7) << ", " << static_cast<int>(a9.a8)
+      << "))"
+      << ")\n";
+
+  int64_t result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+  std::cout << "result = " << result << "\n";
+
+  CHECK_EQ(4095, result);
+
+  // Pass argument that will make the Dart callback throw.
+  a0.a0 = 42;
+
+  result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+  CHECK_EQ(0, result);
+
+  // Pass argument that will make the Dart callback return null.
+  a0.a0 = 84;
+
+  result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+  CHECK_EQ(0, result);
+
+  return 0;
+}
+
+// Used for testing structs by value.
+// Argument is a single byte over a multiple of word size.
+// With alignment rules taken into account size is 12 or 16 bytes.
+// 10 struct arguments will exhaust available registers.
+//
+DART_EXPORT intptr_t TestPassStruct9BytesInt4Or8ByteAlignedx10(
+    // NOLINTNEXTLINE(whitespace/parens)
+    int64_t (*f)(Struct9BytesInt4Or8ByteAligned a0,
+                 Struct9BytesInt4Or8ByteAligned a1,
+                 Struct9BytesInt4Or8ByteAligned a2,
+                 Struct9BytesInt4Or8ByteAligned a3,
+                 Struct9BytesInt4Or8ByteAligned a4,
+                 Struct9BytesInt4Or8ByteAligned a5,
+                 Struct9BytesInt4Or8ByteAligned a6,
+                 Struct9BytesInt4Or8ByteAligned a7,
+                 Struct9BytesInt4Or8ByteAligned a8,
+                 Struct9BytesInt4Or8ByteAligned a9)) {
+  Struct9BytesInt4Or8ByteAligned a0;
+  Struct9BytesInt4Or8ByteAligned a1;
+  Struct9BytesInt4Or8ByteAligned a2;
+  Struct9BytesInt4Or8ByteAligned a3;
+  Struct9BytesInt4Or8ByteAligned a4;
+  Struct9BytesInt4Or8ByteAligned a5;
+  Struct9BytesInt4Or8ByteAligned a6;
+  Struct9BytesInt4Or8ByteAligned a7;
+  Struct9BytesInt4Or8ByteAligned a8;
+  Struct9BytesInt4Or8ByteAligned a9;
+
+  a0.a0 = -1;
+  a0.a1 = 2;
+  a1.a0 = -3;
+  a1.a1 = 4;
+  a2.a0 = -5;
+  a2.a1 = 6;
+  a3.a0 = -7;
+  a3.a1 = 8;
+  a4.a0 = -9;
+  a4.a1 = 10;
+  a5.a0 = -11;
+  a5.a1 = 12;
+  a6.a0 = -13;
+  a6.a1 = 14;
+  a7.a0 = -15;
+  a7.a1 = 16;
+  a8.a0 = -17;
+  a8.a1 = 18;
+  a9.a0 = -19;
+  a9.a1 = 20;
+
+  std::cout << "Calling TestPassStruct9BytesInt4Or8ByteAlignedx10("
+            << "((" << a0.a0 << ", " << static_cast<int>(a0.a1) << "), ("
+            << a1.a0 << ", " << static_cast<int>(a1.a1) << "), (" << a2.a0
+            << ", " << static_cast<int>(a2.a1) << "), (" << a3.a0 << ", "
+            << static_cast<int>(a3.a1) << "), (" << a4.a0 << ", "
+            << static_cast<int>(a4.a1) << "), (" << a5.a0 << ", "
+            << static_cast<int>(a5.a1) << "), (" << a6.a0 << ", "
+            << static_cast<int>(a6.a1) << "), (" << a7.a0 << ", "
+            << static_cast<int>(a7.a1) << "), (" << a8.a0 << ", "
+            << static_cast<int>(a8.a1) << "), (" << a9.a0 << ", "
+            << static_cast<int>(a9.a1) << "))"
+            << ")\n";
+
+  int64_t result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+  std::cout << "result = " << result << "\n";
+
+  CHECK_EQ(10, result);
+
+  // Pass argument that will make the Dart callback throw.
+  a0.a0 = 42;
+
+  result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+  CHECK_EQ(0, result);
+
+  // Pass argument that will make the Dart callback return null.
+  a0.a0 = 84;
+
+  result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+  CHECK_EQ(0, result);
+
+  return 0;
+}
+
+// Used for testing structs by value.
+// Arguments in FPU registers on arm hardfp and arm64.
+// Struct arguments will exhaust available registers, and leave some empty.
+// The last argument is to test whether arguments are backfilled.
+DART_EXPORT intptr_t TestPassStruct12BytesHomogeneousFloatx6(
+    // NOLINTNEXTLINE(whitespace/parens)
+    float (*f)(Struct12BytesHomogeneousFloat a0,
+               Struct12BytesHomogeneousFloat a1,
+               Struct12BytesHomogeneousFloat a2,
+               Struct12BytesHomogeneousFloat a3,
+               Struct12BytesHomogeneousFloat a4,
+               Struct12BytesHomogeneousFloat a5)) {
+  Struct12BytesHomogeneousFloat a0;
+  Struct12BytesHomogeneousFloat a1;
+  Struct12BytesHomogeneousFloat a2;
+  Struct12BytesHomogeneousFloat a3;
+  Struct12BytesHomogeneousFloat a4;
+  Struct12BytesHomogeneousFloat a5;
+
+  a0.a0 = -1.0;
+  a0.a1 = 2.0;
+  a0.a2 = -3.0;
+  a1.a0 = 4.0;
+  a1.a1 = -5.0;
+  a1.a2 = 6.0;
+  a2.a0 = -7.0;
+  a2.a1 = 8.0;
+  a2.a2 = -9.0;
+  a3.a0 = 10.0;
+  a3.a1 = -11.0;
+  a3.a2 = 12.0;
+  a4.a0 = -13.0;
+  a4.a1 = 14.0;
+  a4.a2 = -15.0;
+  a5.a0 = 16.0;
+  a5.a1 = -17.0;
+  a5.a2 = 18.0;
+
+  std::cout << "Calling TestPassStruct12BytesHomogeneousFloatx6("
+            << "((" << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << "), ("
+            << a1.a0 << ", " << a1.a1 << ", " << a1.a2 << "), (" << a2.a0
+            << ", " << a2.a1 << ", " << a2.a2 << "), (" << a3.a0 << ", "
+            << a3.a1 << ", " << a3.a2 << "), (" << a4.a0 << ", " << a4.a1
+            << ", " << a4.a2 << "), (" << a5.a0 << ", " << a5.a1 << ", "
+            << a5.a2 << "))"
+            << ")\n";
+
+  float result = f(a0, a1, a2, a3, a4, a5);
+
+  std::cout << "result = " << result << "\n";
+
+  CHECK_APPROX(9.0, result);
+
+  // Pass argument that will make the Dart callback throw.
+  a0.a0 = 42;
+
+  result = f(a0, a1, a2, a3, a4, a5);
+
+  CHECK_APPROX(0.0, result);
+
+  // Pass argument that will make the Dart callback return null.
+  a0.a0 = 84;
+
+  result = f(a0, a1, a2, a3, a4, a5);
+
+  CHECK_APPROX(0.0, result);
+
+  return 0;
+}
+
+// Used for testing structs by value.
+// On Linux x64 argument is transferred on stack because it is over 16 bytes.
+// Arguments in FPU registers on arm hardfp and arm64.
+// 5 struct arguments will exhaust available registers.
+DART_EXPORT intptr_t TestPassStruct16BytesHomogeneousFloatx5(
+    // NOLINTNEXTLINE(whitespace/parens)
+    float (*f)(Struct16BytesHomogeneousFloat a0,
+               Struct16BytesHomogeneousFloat a1,
+               Struct16BytesHomogeneousFloat a2,
+               Struct16BytesHomogeneousFloat a3,
+               Struct16BytesHomogeneousFloat a4)) {
+  Struct16BytesHomogeneousFloat a0;
+  Struct16BytesHomogeneousFloat a1;
+  Struct16BytesHomogeneousFloat a2;
+  Struct16BytesHomogeneousFloat a3;
+  Struct16BytesHomogeneousFloat a4;
+
+  a0.a0 = -1.0;
+  a0.a1 = 2.0;
+  a0.a2 = -3.0;
+  a0.a3 = 4.0;
+  a1.a0 = -5.0;
+  a1.a1 = 6.0;
+  a1.a2 = -7.0;
+  a1.a3 = 8.0;
+  a2.a0 = -9.0;
+  a2.a1 = 10.0;
+  a2.a2 = -11.0;
+  a2.a3 = 12.0;
+  a3.a0 = -13.0;
+  a3.a1 = 14.0;
+  a3.a2 = -15.0;
+  a3.a3 = 16.0;
+  a4.a0 = -17.0;
+  a4.a1 = 18.0;
+  a4.a2 = -19.0;
+  a4.a3 = 20.0;
+
+  std::cout << "Calling TestPassStruct16BytesHomogeneousFloatx5("
+            << "((" << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << ", " << a0.a3
+            << "), (" << a1.a0 << ", " << a1.a1 << ", " << a1.a2 << ", "
+            << a1.a3 << "), (" << a2.a0 << ", " << a2.a1 << ", " << a2.a2
+            << ", " << a2.a3 << "), (" << a3.a0 << ", " << a3.a1 << ", "
+            << a3.a2 << ", " << a3.a3 << "), (" << a4.a0 << ", " << a4.a1
+            << ", " << a4.a2 << ", " << a4.a3 << "))"
+            << ")\n";
+
+  float result = f(a0, a1, a2, a3, a4);
+
+  std::cout << "result = " << result << "\n";
+
+  CHECK_APPROX(10.0, result);
+
+  // Pass argument that will make the Dart callback throw.
+  a0.a0 = 42;
+
+  result = f(a0, a1, a2, a3, a4);
+
+  CHECK_APPROX(0.0, result);
+
+  // Pass argument that will make the Dart callback return null.
+  a0.a0 = 84;
+
+  result = f(a0, a1, a2, a3, a4);
+
+  CHECK_APPROX(0.0, result);
+
+  return 0;
+}
+
+// Used for testing structs by value.
+// On x64, arguments are split over FP and int registers.
+// On x64, it will exhaust the integer registers with the 6th argument.
+// The rest goes on the stack.
+// On arm, arguments are 8 byte aligned.
+DART_EXPORT intptr_t TestPassStruct16BytesMixedx10(
+    // NOLINTNEXTLINE(whitespace/parens)
+    double (*f)(Struct16BytesMixed a0,
+                Struct16BytesMixed a1,
+                Struct16BytesMixed a2,
+                Struct16BytesMixed a3,
+                Struct16BytesMixed a4,
+                Struct16BytesMixed a5,
+                Struct16BytesMixed a6,
+                Struct16BytesMixed a7,
+                Struct16BytesMixed a8,
+                Struct16BytesMixed a9)) {
+  Struct16BytesMixed a0;
+  Struct16BytesMixed a1;
+  Struct16BytesMixed a2;
+  Struct16BytesMixed a3;
+  Struct16BytesMixed a4;
+  Struct16BytesMixed a5;
+  Struct16BytesMixed a6;
+  Struct16BytesMixed a7;
+  Struct16BytesMixed a8;
+  Struct16BytesMixed a9;
+
+  a0.a0 = -1.0;
+  a0.a1 = 2;
+  a1.a0 = -3.0;
+  a1.a1 = 4;
+  a2.a0 = -5.0;
+  a2.a1 = 6;
+  a3.a0 = -7.0;
+  a3.a1 = 8;
+  a4.a0 = -9.0;
+  a4.a1 = 10;
+  a5.a0 = -11.0;
+  a5.a1 = 12;
+  a6.a0 = -13.0;
+  a6.a1 = 14;
+  a7.a0 = -15.0;
+  a7.a1 = 16;
+  a8.a0 = -17.0;
+  a8.a1 = 18;
+  a9.a0 = -19.0;
+  a9.a1 = 20;
+
+  std::cout << "Calling TestPassStruct16BytesMixedx10("
+            << "((" << a0.a0 << ", " << a0.a1 << "), (" << a1.a0 << ", "
+            << a1.a1 << "), (" << a2.a0 << ", " << a2.a1 << "), (" << a3.a0
+            << ", " << a3.a1 << "), (" << a4.a0 << ", " << a4.a1 << "), ("
+            << a5.a0 << ", " << a5.a1 << "), (" << a6.a0 << ", " << a6.a1
+            << "), (" << a7.a0 << ", " << a7.a1 << "), (" << a8.a0 << ", "
+            << a8.a1 << "), (" << a9.a0 << ", " << a9.a1 << "))"
+            << ")\n";
+
+  double result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+  std::cout << "result = " << result << "\n";
+
+  CHECK_APPROX(10.0, result);
+
+  // Pass argument that will make the Dart callback throw.
+  a0.a0 = 42;
+
+  result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+  CHECK_APPROX(0.0, result);
+
+  // Pass argument that will make the Dart callback return null.
+  a0.a0 = 84;
+
+  result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+  CHECK_APPROX(0.0, result);
+
+  return 0;
+}
+
+// Used for testing structs by value.
+// On x64, arguments are split over FP and int registers.
+// On x64, it will exhaust the integer registers with the 6th argument.
+// The rest goes on the stack.
+// On arm, arguments are 4 byte aligned.
+DART_EXPORT intptr_t TestPassStruct16BytesMixed2x10(
+    // NOLINTNEXTLINE(whitespace/parens)
+    float (*f)(Struct16BytesMixed2 a0,
+               Struct16BytesMixed2 a1,
+               Struct16BytesMixed2 a2,
+               Struct16BytesMixed2 a3,
+               Struct16BytesMixed2 a4,
+               Struct16BytesMixed2 a5,
+               Struct16BytesMixed2 a6,
+               Struct16BytesMixed2 a7,
+               Struct16BytesMixed2 a8,
+               Struct16BytesMixed2 a9)) {
+  Struct16BytesMixed2 a0;
+  Struct16BytesMixed2 a1;
+  Struct16BytesMixed2 a2;
+  Struct16BytesMixed2 a3;
+  Struct16BytesMixed2 a4;
+  Struct16BytesMixed2 a5;
+  Struct16BytesMixed2 a6;
+  Struct16BytesMixed2 a7;
+  Struct16BytesMixed2 a8;
+  Struct16BytesMixed2 a9;
+
+  a0.a0 = -1.0;
+  a0.a1 = 2.0;
+  a0.a2 = -3.0;
+  a0.a3 = 4;
+  a1.a0 = -5.0;
+  a1.a1 = 6.0;
+  a1.a2 = -7.0;
+  a1.a3 = 8;
+  a2.a0 = -9.0;
+  a2.a1 = 10.0;
+  a2.a2 = -11.0;
+  a2.a3 = 12;
+  a3.a0 = -13.0;
+  a3.a1 = 14.0;
+  a3.a2 = -15.0;
+  a3.a3 = 16;
+  a4.a0 = -17.0;
+  a4.a1 = 18.0;
+  a4.a2 = -19.0;
+  a4.a3 = 20;
+  a5.a0 = -21.0;
+  a5.a1 = 22.0;
+  a5.a2 = -23.0;
+  a5.a3 = 24;
+  a6.a0 = -25.0;
+  a6.a1 = 26.0;
+  a6.a2 = -27.0;
+  a6.a3 = 28;
+  a7.a0 = -29.0;
+  a7.a1 = 30.0;
+  a7.a2 = -31.0;
+  a7.a3 = 32;
+  a8.a0 = -33.0;
+  a8.a1 = 34.0;
+  a8.a2 = -35.0;
+  a8.a3 = 36;
+  a9.a0 = -37.0;
+  a9.a1 = 38.0;
+  a9.a2 = -39.0;
+  a9.a3 = 40;
+
+  std::cout << "Calling TestPassStruct16BytesMixed2x10("
+            << "((" << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << ", " << a0.a3
+            << "), (" << a1.a0 << ", " << a1.a1 << ", " << a1.a2 << ", "
+            << a1.a3 << "), (" << a2.a0 << ", " << a2.a1 << ", " << a2.a2
+            << ", " << a2.a3 << "), (" << a3.a0 << ", " << a3.a1 << ", "
+            << a3.a2 << ", " << a3.a3 << "), (" << a4.a0 << ", " << a4.a1
+            << ", " << a4.a2 << ", " << a4.a3 << "), (" << a5.a0 << ", "
+            << a5.a1 << ", " << a5.a2 << ", " << a5.a3 << "), (" << a6.a0
+            << ", " << a6.a1 << ", " << a6.a2 << ", " << a6.a3 << "), ("
+            << a7.a0 << ", " << a7.a1 << ", " << a7.a2 << ", " << a7.a3
+            << "), (" << a8.a0 << ", " << a8.a1 << ", " << a8.a2 << ", "
+            << a8.a3 << "), (" << a9.a0 << ", " << a9.a1 << ", " << a9.a2
+            << ", " << a9.a3 << "))"
+            << ")\n";
+
+  float result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+  std::cout << "result = " << result << "\n";
+
+  CHECK_APPROX(20.0, result);
+
+  // Pass argument that will make the Dart callback throw.
+  a0.a0 = 42;
+
+  result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+  CHECK_APPROX(0.0, result);
+
+  // Pass argument that will make the Dart callback return null.
+  a0.a0 = 84;
+
+  result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+  CHECK_APPROX(0.0, result);
+
+  return 0;
+}
+
+// Used for testing structs by value.
+// Arguments are passed as pointer to copy on arm64.
+// Tests that the memory allocated for copies are rounded up to word size.
+DART_EXPORT intptr_t TestPassStruct17BytesIntx10(
+    // NOLINTNEXTLINE(whitespace/parens)
+    int64_t (*f)(Struct17BytesInt a0,
+                 Struct17BytesInt a1,
+                 Struct17BytesInt a2,
+                 Struct17BytesInt a3,
+                 Struct17BytesInt a4,
+                 Struct17BytesInt a5,
+                 Struct17BytesInt a6,
+                 Struct17BytesInt a7,
+                 Struct17BytesInt a8,
+                 Struct17BytesInt a9)) {
+  Struct17BytesInt a0;
+  Struct17BytesInt a1;
+  Struct17BytesInt a2;
+  Struct17BytesInt a3;
+  Struct17BytesInt a4;
+  Struct17BytesInt a5;
+  Struct17BytesInt a6;
+  Struct17BytesInt a7;
+  Struct17BytesInt a8;
+  Struct17BytesInt a9;
+
+  a0.a0 = -1;
+  a0.a1 = 2;
+  a0.a2 = -3;
+  a1.a0 = 4;
+  a1.a1 = -5;
+  a1.a2 = 6;
+  a2.a0 = -7;
+  a2.a1 = 8;
+  a2.a2 = -9;
+  a3.a0 = 10;
+  a3.a1 = -11;
+  a3.a2 = 12;
+  a4.a0 = -13;
+  a4.a1 = 14;
+  a4.a2 = -15;
+  a5.a0 = 16;
+  a5.a1 = -17;
+  a5.a2 = 18;
+  a6.a0 = -19;
+  a6.a1 = 20;
+  a6.a2 = -21;
+  a7.a0 = 22;
+  a7.a1 = -23;
+  a7.a2 = 24;
+  a8.a0 = -25;
+  a8.a1 = 26;
+  a8.a2 = -27;
+  a9.a0 = 28;
+  a9.a1 = -29;
+  a9.a2 = 30;
+
+  std::cout << "Calling TestPassStruct17BytesIntx10("
+            << "((" << a0.a0 << ", " << a0.a1 << ", " << static_cast<int>(a0.a2)
+            << "), (" << a1.a0 << ", " << a1.a1 << ", "
+            << static_cast<int>(a1.a2) << "), (" << a2.a0 << ", " << a2.a1
+            << ", " << static_cast<int>(a2.a2) << "), (" << a3.a0 << ", "
+            << a3.a1 << ", " << static_cast<int>(a3.a2) << "), (" << a4.a0
+            << ", " << a4.a1 << ", " << static_cast<int>(a4.a2) << "), ("
+            << a5.a0 << ", " << a5.a1 << ", " << static_cast<int>(a5.a2)
+            << "), (" << a6.a0 << ", " << a6.a1 << ", "
+            << static_cast<int>(a6.a2) << "), (" << a7.a0 << ", " << a7.a1
+            << ", " << static_cast<int>(a7.a2) << "), (" << a8.a0 << ", "
+            << a8.a1 << ", " << static_cast<int>(a8.a2) << "), (" << a9.a0
+            << ", " << a9.a1 << ", " << static_cast<int>(a9.a2) << "))"
+            << ")\n";
+
+  int64_t result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+  std::cout << "result = " << result << "\n";
+
+  CHECK_EQ(15, result);
+
+  // Pass argument that will make the Dart callback throw.
+  a0.a0 = 42;
+
+  result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+  CHECK_EQ(0, result);
+
+  // Pass argument that will make the Dart callback return null.
+  a0.a0 = 84;
+
+  result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+  CHECK_EQ(0, result);
+
+  return 0;
+}
+
+// Used for testing structs by value.
+// The minimum alignment of this struct is only 1 byte based on its fields.
+// Test that the memory backing these structs is extended to the right size.
+//
+DART_EXPORT intptr_t TestPassStruct19BytesHomogeneousUint8x10(
+    // NOLINTNEXTLINE(whitespace/parens)
+    int64_t (*f)(Struct19BytesHomogeneousUint8 a0,
+                 Struct19BytesHomogeneousUint8 a1,
+                 Struct19BytesHomogeneousUint8 a2,
+                 Struct19BytesHomogeneousUint8 a3,
+                 Struct19BytesHomogeneousUint8 a4,
+                 Struct19BytesHomogeneousUint8 a5,
+                 Struct19BytesHomogeneousUint8 a6,
+                 Struct19BytesHomogeneousUint8 a7,
+                 Struct19BytesHomogeneousUint8 a8,
+                 Struct19BytesHomogeneousUint8 a9)) {
+  Struct19BytesHomogeneousUint8 a0;
+  Struct19BytesHomogeneousUint8 a1;
+  Struct19BytesHomogeneousUint8 a2;
+  Struct19BytesHomogeneousUint8 a3;
+  Struct19BytesHomogeneousUint8 a4;
+  Struct19BytesHomogeneousUint8 a5;
+  Struct19BytesHomogeneousUint8 a6;
+  Struct19BytesHomogeneousUint8 a7;
+  Struct19BytesHomogeneousUint8 a8;
+  Struct19BytesHomogeneousUint8 a9;
+
+  a0.a0 = 1;
+  a0.a1 = 2;
+  a0.a2 = 3;
+  a0.a3 = 4;
+  a0.a4 = 5;
+  a0.a5 = 6;
+  a0.a6 = 7;
+  a0.a7 = 8;
+  a0.a8 = 9;
+  a0.a9 = 10;
+  a0.a10 = 11;
+  a0.a11 = 12;
+  a0.a12 = 13;
+  a0.a13 = 14;
+  a0.a14 = 15;
+  a0.a15 = 16;
+  a0.a16 = 17;
+  a0.a17 = 18;
+  a0.a18 = 19;
+  a1.a0 = 20;
+  a1.a1 = 21;
+  a1.a2 = 22;
+  a1.a3 = 23;
+  a1.a4 = 24;
+  a1.a5 = 25;
+  a1.a6 = 26;
+  a1.a7 = 27;
+  a1.a8 = 28;
+  a1.a9 = 29;
+  a1.a10 = 30;
+  a1.a11 = 31;
+  a1.a12 = 32;
+  a1.a13 = 33;
+  a1.a14 = 34;
+  a1.a15 = 35;
+  a1.a16 = 36;
+  a1.a17 = 37;
+  a1.a18 = 38;
+  a2.a0 = 39;
+  a2.a1 = 40;
+  a2.a2 = 41;
+  a2.a3 = 42;
+  a2.a4 = 43;
+  a2.a5 = 44;
+  a2.a6 = 45;
+  a2.a7 = 46;
+  a2.a8 = 47;
+  a2.a9 = 48;
+  a2.a10 = 49;
+  a2.a11 = 50;
+  a2.a12 = 51;
+  a2.a13 = 52;
+  a2.a14 = 53;
+  a2.a15 = 54;
+  a2.a16 = 55;
+  a2.a17 = 56;
+  a2.a18 = 57;
+  a3.a0 = 58;
+  a3.a1 = 59;
+  a3.a2 = 60;
+  a3.a3 = 61;
+  a3.a4 = 62;
+  a3.a5 = 63;
+  a3.a6 = 64;
+  a3.a7 = 65;
+  a3.a8 = 66;
+  a3.a9 = 67;
+  a3.a10 = 68;
+  a3.a11 = 69;
+  a3.a12 = 70;
+  a3.a13 = 71;
+  a3.a14 = 72;
+  a3.a15 = 73;
+  a3.a16 = 74;
+  a3.a17 = 75;
+  a3.a18 = 76;
+  a4.a0 = 77;
+  a4.a1 = 78;
+  a4.a2 = 79;
+  a4.a3 = 80;
+  a4.a4 = 81;
+  a4.a5 = 82;
+  a4.a6 = 83;
+  a4.a7 = 84;
+  a4.a8 = 85;
+  a4.a9 = 86;
+  a4.a10 = 87;
+  a4.a11 = 88;
+  a4.a12 = 89;
+  a4.a13 = 90;
+  a4.a14 = 91;
+  a4.a15 = 92;
+  a4.a16 = 93;
+  a4.a17 = 94;
+  a4.a18 = 95;
+  a5.a0 = 96;
+  a5.a1 = 97;
+  a5.a2 = 98;
+  a5.a3 = 99;
+  a5.a4 = 100;
+  a5.a5 = 101;
+  a5.a6 = 102;
+  a5.a7 = 103;
+  a5.a8 = 104;
+  a5.a9 = 105;
+  a5.a10 = 106;
+  a5.a11 = 107;
+  a5.a12 = 108;
+  a5.a13 = 109;
+  a5.a14 = 110;
+  a5.a15 = 111;
+  a5.a16 = 112;
+  a5.a17 = 113;
+  a5.a18 = 114;
+  a6.a0 = 115;
+  a6.a1 = 116;
+  a6.a2 = 117;
+  a6.a3 = 118;
+  a6.a4 = 119;
+  a6.a5 = 120;
+  a6.a6 = 121;
+  a6.a7 = 122;
+  a6.a8 = 123;
+  a6.a9 = 124;
+  a6.a10 = 125;
+  a6.a11 = 126;
+  a6.a12 = 127;
+  a6.a13 = 128;
+  a6.a14 = 129;
+  a6.a15 = 130;
+  a6.a16 = 131;
+  a6.a17 = 132;
+  a6.a18 = 133;
+  a7.a0 = 134;
+  a7.a1 = 135;
+  a7.a2 = 136;
+  a7.a3 = 137;
+  a7.a4 = 138;
+  a7.a5 = 139;
+  a7.a6 = 140;
+  a7.a7 = 141;
+  a7.a8 = 142;
+  a7.a9 = 143;
+  a7.a10 = 144;
+  a7.a11 = 145;
+  a7.a12 = 146;
+  a7.a13 = 147;
+  a7.a14 = 148;
+  a7.a15 = 149;
+  a7.a16 = 150;
+  a7.a17 = 151;
+  a7.a18 = 152;
+  a8.a0 = 153;
+  a8.a1 = 154;
+  a8.a2 = 155;
+  a8.a3 = 156;
+  a8.a4 = 157;
+  a8.a5 = 158;
+  a8.a6 = 159;
+  a8.a7 = 160;
+  a8.a8 = 161;
+  a8.a9 = 162;
+  a8.a10 = 163;
+  a8.a11 = 164;
+  a8.a12 = 165;
+  a8.a13 = 166;
+  a8.a14 = 167;
+  a8.a15 = 168;
+  a8.a16 = 169;
+  a8.a17 = 170;
+  a8.a18 = 171;
+  a9.a0 = 172;
+  a9.a1 = 173;
+  a9.a2 = 174;
+  a9.a3 = 175;
+  a9.a4 = 176;
+  a9.a5 = 177;
+  a9.a6 = 178;
+  a9.a7 = 179;
+  a9.a8 = 180;
+  a9.a9 = 181;
+  a9.a10 = 182;
+  a9.a11 = 183;
+  a9.a12 = 184;
+  a9.a13 = 185;
+  a9.a14 = 186;
+  a9.a15 = 187;
+  a9.a16 = 188;
+  a9.a17 = 189;
+  a9.a18 = 190;
+
+  std::cout
+      << "Calling TestPassStruct19BytesHomogeneousUint8x10("
+      << "((" << static_cast<int>(a0.a0) << ", " << static_cast<int>(a0.a1)
+      << ", " << static_cast<int>(a0.a2) << ", " << static_cast<int>(a0.a3)
+      << ", " << static_cast<int>(a0.a4) << ", " << static_cast<int>(a0.a5)
+      << ", " << static_cast<int>(a0.a6) << ", " << static_cast<int>(a0.a7)
+      << ", " << static_cast<int>(a0.a8) << ", " << static_cast<int>(a0.a9)
+      << ", " << static_cast<int>(a0.a10) << ", " << static_cast<int>(a0.a11)
+      << ", " << static_cast<int>(a0.a12) << ", " << static_cast<int>(a0.a13)
+      << ", " << static_cast<int>(a0.a14) << ", " << static_cast<int>(a0.a15)
+      << ", " << static_cast<int>(a0.a16) << ", " << static_cast<int>(a0.a17)
+      << ", " << static_cast<int>(a0.a18) << "), (" << static_cast<int>(a1.a0)
+      << ", " << static_cast<int>(a1.a1) << ", " << static_cast<int>(a1.a2)
+      << ", " << static_cast<int>(a1.a3) << ", " << static_cast<int>(a1.a4)
+      << ", " << static_cast<int>(a1.a5) << ", " << static_cast<int>(a1.a6)
+      << ", " << static_cast<int>(a1.a7) << ", " << static_cast<int>(a1.a8)
+      << ", " << static_cast<int>(a1.a9) << ", " << static_cast<int>(a1.a10)
+      << ", " << static_cast<int>(a1.a11) << ", " << static_cast<int>(a1.a12)
+      << ", " << static_cast<int>(a1.a13) << ", " << static_cast<int>(a1.a14)
+      << ", " << static_cast<int>(a1.a15) << ", " << static_cast<int>(a1.a16)
+      << ", " << static_cast<int>(a1.a17) << ", " << static_cast<int>(a1.a18)
+      << "), (" << static_cast<int>(a2.a0) << ", " << static_cast<int>(a2.a1)
+      << ", " << static_cast<int>(a2.a2) << ", " << static_cast<int>(a2.a3)
+      << ", " << static_cast<int>(a2.a4) << ", " << static_cast<int>(a2.a5)
+      << ", " << static_cast<int>(a2.a6) << ", " << static_cast<int>(a2.a7)
+      << ", " << static_cast<int>(a2.a8) << ", " << static_cast<int>(a2.a9)
+      << ", " << static_cast<int>(a2.a10) << ", " << static_cast<int>(a2.a11)
+      << ", " << static_cast<int>(a2.a12) << ", " << static_cast<int>(a2.a13)
+      << ", " << static_cast<int>(a2.a14) << ", " << static_cast<int>(a2.a15)
+      << ", " << static_cast<int>(a2.a16) << ", " << static_cast<int>(a2.a17)
+      << ", " << static_cast<int>(a2.a18) << "), (" << static_cast<int>(a3.a0)
+      << ", " << static_cast<int>(a3.a1) << ", " << static_cast<int>(a3.a2)
+      << ", " << static_cast<int>(a3.a3) << ", " << static_cast<int>(a3.a4)
+      << ", " << static_cast<int>(a3.a5) << ", " << static_cast<int>(a3.a6)
+      << ", " << static_cast<int>(a3.a7) << ", " << static_cast<int>(a3.a8)
+      << ", " << static_cast<int>(a3.a9) << ", " << static_cast<int>(a3.a10)
+      << ", " << static_cast<int>(a3.a11) << ", " << static_cast<int>(a3.a12)
+      << ", " << static_cast<int>(a3.a13) << ", " << static_cast<int>(a3.a14)
+      << ", " << static_cast<int>(a3.a15) << ", " << static_cast<int>(a3.a16)
+      << ", " << static_cast<int>(a3.a17) << ", " << static_cast<int>(a3.a18)
+      << "), (" << static_cast<int>(a4.a0) << ", " << static_cast<int>(a4.a1)
+      << ", " << static_cast<int>(a4.a2) << ", " << static_cast<int>(a4.a3)
+      << ", " << static_cast<int>(a4.a4) << ", " << static_cast<int>(a4.a5)
+      << ", " << static_cast<int>(a4.a6) << ", " << static_cast<int>(a4.a7)
+      << ", " << static_cast<int>(a4.a8) << ", " << static_cast<int>(a4.a9)
+      << ", " << static_cast<int>(a4.a10) << ", " << static_cast<int>(a4.a11)
+      << ", " << static_cast<int>(a4.a12) << ", " << static_cast<int>(a4.a13)
+      << ", " << static_cast<int>(a4.a14) << ", " << static_cast<int>(a4.a15)
+      << ", " << static_cast<int>(a4.a16) << ", " << static_cast<int>(a4.a17)
+      << ", " << static_cast<int>(a4.a18) << "), (" << static_cast<int>(a5.a0)
+      << ", " << static_cast<int>(a5.a1) << ", " << static_cast<int>(a5.a2)
+      << ", " << static_cast<int>(a5.a3) << ", " << static_cast<int>(a5.a4)
+      << ", " << static_cast<int>(a5.a5) << ", " << static_cast<int>(a5.a6)
+      << ", " << static_cast<int>(a5.a7) << ", " << static_cast<int>(a5.a8)
+      << ", " << static_cast<int>(a5.a9) << ", " << static_cast<int>(a5.a10)
+      << ", " << static_cast<int>(a5.a11) << ", " << static_cast<int>(a5.a12)
+      << ", " << static_cast<int>(a5.a13) << ", " << static_cast<int>(a5.a14)
+      << ", " << static_cast<int>(a5.a15) << ", " << static_cast<int>(a5.a16)
+      << ", " << static_cast<int>(a5.a17) << ", " << static_cast<int>(a5.a18)
+      << "), (" << static_cast<int>(a6.a0) << ", " << static_cast<int>(a6.a1)
+      << ", " << static_cast<int>(a6.a2) << ", " << static_cast<int>(a6.a3)
+      << ", " << static_cast<int>(a6.a4) << ", " << static_cast<int>(a6.a5)
+      << ", " << static_cast<int>(a6.a6) << ", " << static_cast<int>(a6.a7)
+      << ", " << static_cast<int>(a6.a8) << ", " << static_cast<int>(a6.a9)
+      << ", " << static_cast<int>(a6.a10) << ", " << static_cast<int>(a6.a11)
+      << ", " << static_cast<int>(a6.a12) << ", " << static_cast<int>(a6.a13)
+      << ", " << static_cast<int>(a6.a14) << ", " << static_cast<int>(a6.a15)
+      << ", " << static_cast<int>(a6.a16) << ", " << static_cast<int>(a6.a17)
+      << ", " << static_cast<int>(a6.a18) << "), (" << static_cast<int>(a7.a0)
+      << ", " << static_cast<int>(a7.a1) << ", " << static_cast<int>(a7.a2)
+      << ", " << static_cast<int>(a7.a3) << ", " << static_cast<int>(a7.a4)
+      << ", " << static_cast<int>(a7.a5) << ", " << static_cast<int>(a7.a6)
+      << ", " << static_cast<int>(a7.a7) << ", " << static_cast<int>(a7.a8)
+      << ", " << static_cast<int>(a7.a9) << ", " << static_cast<int>(a7.a10)
+      << ", " << static_cast<int>(a7.a11) << ", " << static_cast<int>(a7.a12)
+      << ", " << static_cast<int>(a7.a13) << ", " << static_cast<int>(a7.a14)
+      << ", " << static_cast<int>(a7.a15) << ", " << static_cast<int>(a7.a16)
+      << ", " << static_cast<int>(a7.a17) << ", " << static_cast<int>(a7.a18)
+      << "), (" << static_cast<int>(a8.a0) << ", " << static_cast<int>(a8.a1)
+      << ", " << static_cast<int>(a8.a2) << ", " << static_cast<int>(a8.a3)
+      << ", " << static_cast<int>(a8.a4) << ", " << static_cast<int>(a8.a5)
+      << ", " << static_cast<int>(a8.a6) << ", " << static_cast<int>(a8.a7)
+      << ", " << static_cast<int>(a8.a8) << ", " << static_cast<int>(a8.a9)
+      << ", " << static_cast<int>(a8.a10) << ", " << static_cast<int>(a8.a11)
+      << ", " << static_cast<int>(a8.a12) << ", " << static_cast<int>(a8.a13)
+      << ", " << static_cast<int>(a8.a14) << ", " << static_cast<int>(a8.a15)
+      << ", " << static_cast<int>(a8.a16) << ", " << static_cast<int>(a8.a17)
+      << ", " << static_cast<int>(a8.a18) << "), (" << static_cast<int>(a9.a0)
+      << ", " << static_cast<int>(a9.a1) << ", " << static_cast<int>(a9.a2)
+      << ", " << static_cast<int>(a9.a3) << ", " << static_cast<int>(a9.a4)
+      << ", " << static_cast<int>(a9.a5) << ", " << static_cast<int>(a9.a6)
+      << ", " << static_cast<int>(a9.a7) << ", " << static_cast<int>(a9.a8)
+      << ", " << static_cast<int>(a9.a9) << ", " << static_cast<int>(a9.a10)
+      << ", " << static_cast<int>(a9.a11) << ", " << static_cast<int>(a9.a12)
+      << ", " << static_cast<int>(a9.a13) << ", " << static_cast<int>(a9.a14)
+      << ", " << static_cast<int>(a9.a15) << ", " << static_cast<int>(a9.a16)
+      << ", " << static_cast<int>(a9.a17) << ", " << static_cast<int>(a9.a18)
+      << "))"
+      << ")\n";
+
+  int64_t result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+  std::cout << "result = " << result << "\n";
+
+  CHECK_EQ(18145, result);
+
+  // Pass argument that will make the Dart callback throw.
+  a0.a0 = 42;
+
+  result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+  CHECK_EQ(0, result);
+
+  // Pass argument that will make the Dart callback return null.
+  a0.a0 = 84;
+
+  result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+  CHECK_EQ(0, result);
+
+  return 0;
+}
+
+// Used for testing structs by value.
+// Argument too big to go into integer registers on arm64.
+// The arguments are passed as pointers to copies.
+// The amount of arguments exhausts the number of integer registers, such that
+// pointers to copies are also passed on the stack.
+DART_EXPORT intptr_t TestPassStruct20BytesHomogeneousInt32x10(
+    // NOLINTNEXTLINE(whitespace/parens)
+    int32_t (*f)(Struct20BytesHomogeneousInt32 a0,
+                 Struct20BytesHomogeneousInt32 a1,
+                 Struct20BytesHomogeneousInt32 a2,
+                 Struct20BytesHomogeneousInt32 a3,
+                 Struct20BytesHomogeneousInt32 a4,
+                 Struct20BytesHomogeneousInt32 a5,
+                 Struct20BytesHomogeneousInt32 a6,
+                 Struct20BytesHomogeneousInt32 a7,
+                 Struct20BytesHomogeneousInt32 a8,
+                 Struct20BytesHomogeneousInt32 a9)) {
+  Struct20BytesHomogeneousInt32 a0;
+  Struct20BytesHomogeneousInt32 a1;
+  Struct20BytesHomogeneousInt32 a2;
+  Struct20BytesHomogeneousInt32 a3;
+  Struct20BytesHomogeneousInt32 a4;
+  Struct20BytesHomogeneousInt32 a5;
+  Struct20BytesHomogeneousInt32 a6;
+  Struct20BytesHomogeneousInt32 a7;
+  Struct20BytesHomogeneousInt32 a8;
+  Struct20BytesHomogeneousInt32 a9;
+
+  a0.a0 = -1;
+  a0.a1 = 2;
+  a0.a2 = -3;
+  a0.a3 = 4;
+  a0.a4 = -5;
+  a1.a0 = 6;
+  a1.a1 = -7;
+  a1.a2 = 8;
+  a1.a3 = -9;
+  a1.a4 = 10;
+  a2.a0 = -11;
+  a2.a1 = 12;
+  a2.a2 = -13;
+  a2.a3 = 14;
+  a2.a4 = -15;
+  a3.a0 = 16;
+  a3.a1 = -17;
+  a3.a2 = 18;
+  a3.a3 = -19;
+  a3.a4 = 20;
+  a4.a0 = -21;
+  a4.a1 = 22;
+  a4.a2 = -23;
+  a4.a3 = 24;
+  a4.a4 = -25;
+  a5.a0 = 26;
+  a5.a1 = -27;
+  a5.a2 = 28;
+  a5.a3 = -29;
+  a5.a4 = 30;
+  a6.a0 = -31;
+  a6.a1 = 32;
+  a6.a2 = -33;
+  a6.a3 = 34;
+  a6.a4 = -35;
+  a7.a0 = 36;
+  a7.a1 = -37;
+  a7.a2 = 38;
+  a7.a3 = -39;
+  a7.a4 = 40;
+  a8.a0 = -41;
+  a8.a1 = 42;
+  a8.a2 = -43;
+  a8.a3 = 44;
+  a8.a4 = -45;
+  a9.a0 = 46;
+  a9.a1 = -47;
+  a9.a2 = 48;
+  a9.a3 = -49;
+  a9.a4 = 50;
+
+  std::cout << "Calling TestPassStruct20BytesHomogeneousInt32x10("
+            << "((" << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << ", " << a0.a3
+            << ", " << a0.a4 << "), (" << a1.a0 << ", " << a1.a1 << ", "
+            << a1.a2 << ", " << a1.a3 << ", " << a1.a4 << "), (" << a2.a0
+            << ", " << a2.a1 << ", " << a2.a2 << ", " << a2.a3 << ", " << a2.a4
+            << "), (" << a3.a0 << ", " << a3.a1 << ", " << a3.a2 << ", "
+            << a3.a3 << ", " << a3.a4 << "), (" << a4.a0 << ", " << a4.a1
+            << ", " << a4.a2 << ", " << a4.a3 << ", " << a4.a4 << "), ("
+            << a5.a0 << ", " << a5.a1 << ", " << a5.a2 << ", " << a5.a3 << ", "
+            << a5.a4 << "), (" << a6.a0 << ", " << a6.a1 << ", " << a6.a2
+            << ", " << a6.a3 << ", " << a6.a4 << "), (" << a7.a0 << ", "
+            << a7.a1 << ", " << a7.a2 << ", " << a7.a3 << ", " << a7.a4
+            << "), (" << a8.a0 << ", " << a8.a1 << ", " << a8.a2 << ", "
+            << a8.a3 << ", " << a8.a4 << "), (" << a9.a0 << ", " << a9.a1
+            << ", " << a9.a2 << ", " << a9.a3 << ", " << a9.a4 << "))"
+            << ")\n";
+
+  int32_t result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+  std::cout << "result = " << result << "\n";
+
+  CHECK_EQ(25, result);
+
+  // Pass argument that will make the Dart callback throw.
+  a0.a0 = 42;
+
+  result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+  CHECK_EQ(0, result);
+
+  // Pass argument that will make the Dart callback return null.
+  a0.a0 = 84;
+
+  result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+  CHECK_EQ(0, result);
+
+  return 0;
+}
+
+// Used for testing structs by value.
+// Argument too big to go into FPU registers in hardfp and arm64.
+DART_EXPORT intptr_t TestPassStruct20BytesHomogeneousFloat(
+    // NOLINTNEXTLINE(whitespace/parens)
+    float (*f)(Struct20BytesHomogeneousFloat a0)) {
+  Struct20BytesHomogeneousFloat a0;
+
+  a0.a0 = -1.0;
+  a0.a1 = 2.0;
+  a0.a2 = -3.0;
+  a0.a3 = 4.0;
+  a0.a4 = -5.0;
+
+  std::cout << "Calling TestPassStruct20BytesHomogeneousFloat("
+            << "((" << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << ", " << a0.a3
+            << ", " << a0.a4 << "))"
+            << ")\n";
+
+  float result = f(a0);
+
+  std::cout << "result = " << result << "\n";
+
+  CHECK_APPROX(-3.0, result);
+
+  // Pass argument that will make the Dart callback throw.
+  a0.a0 = 42;
+
+  result = f(a0);
+
+  CHECK_APPROX(0.0, result);
+
+  // Pass argument that will make the Dart callback return null.
+  a0.a0 = 84;
+
+  result = f(a0);
+
+  CHECK_APPROX(0.0, result);
+
+  return 0;
+}
+
+// Used for testing structs by value.
+// Arguments in FPU registers on arm64.
+// 5 struct arguments will exhaust available registers.
+DART_EXPORT intptr_t TestPassStruct32BytesHomogeneousDoublex5(
+    // NOLINTNEXTLINE(whitespace/parens)
+    double (*f)(Struct32BytesHomogeneousDouble a0,
+                Struct32BytesHomogeneousDouble a1,
+                Struct32BytesHomogeneousDouble a2,
+                Struct32BytesHomogeneousDouble a3,
+                Struct32BytesHomogeneousDouble a4)) {
+  Struct32BytesHomogeneousDouble a0;
+  Struct32BytesHomogeneousDouble a1;
+  Struct32BytesHomogeneousDouble a2;
+  Struct32BytesHomogeneousDouble a3;
+  Struct32BytesHomogeneousDouble a4;
+
+  a0.a0 = -1.0;
+  a0.a1 = 2.0;
+  a0.a2 = -3.0;
+  a0.a3 = 4.0;
+  a1.a0 = -5.0;
+  a1.a1 = 6.0;
+  a1.a2 = -7.0;
+  a1.a3 = 8.0;
+  a2.a0 = -9.0;
+  a2.a1 = 10.0;
+  a2.a2 = -11.0;
+  a2.a3 = 12.0;
+  a3.a0 = -13.0;
+  a3.a1 = 14.0;
+  a3.a2 = -15.0;
+  a3.a3 = 16.0;
+  a4.a0 = -17.0;
+  a4.a1 = 18.0;
+  a4.a2 = -19.0;
+  a4.a3 = 20.0;
+
+  std::cout << "Calling TestPassStruct32BytesHomogeneousDoublex5("
+            << "((" << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << ", " << a0.a3
+            << "), (" << a1.a0 << ", " << a1.a1 << ", " << a1.a2 << ", "
+            << a1.a3 << "), (" << a2.a0 << ", " << a2.a1 << ", " << a2.a2
+            << ", " << a2.a3 << "), (" << a3.a0 << ", " << a3.a1 << ", "
+            << a3.a2 << ", " << a3.a3 << "), (" << a4.a0 << ", " << a4.a1
+            << ", " << a4.a2 << ", " << a4.a3 << "))"
+            << ")\n";
+
+  double result = f(a0, a1, a2, a3, a4);
+
+  std::cout << "result = " << result << "\n";
+
+  CHECK_APPROX(10.0, result);
+
+  // Pass argument that will make the Dart callback throw.
+  a0.a0 = 42;
+
+  result = f(a0, a1, a2, a3, a4);
+
+  CHECK_APPROX(0.0, result);
+
+  // Pass argument that will make the Dart callback return null.
+  a0.a0 = 84;
+
+  result = f(a0, a1, a2, a3, a4);
+
+  CHECK_APPROX(0.0, result);
+
+  return 0;
+}
+
+// Used for testing structs by value.
+// Argument too big to go into FPU registers in arm64.
+DART_EXPORT intptr_t TestPassStruct40BytesHomogeneousDouble(
+    // NOLINTNEXTLINE(whitespace/parens)
+    double (*f)(Struct40BytesHomogeneousDouble a0)) {
+  Struct40BytesHomogeneousDouble a0;
+
+  a0.a0 = -1.0;
+  a0.a1 = 2.0;
+  a0.a2 = -3.0;
+  a0.a3 = 4.0;
+  a0.a4 = -5.0;
+
+  std::cout << "Calling TestPassStruct40BytesHomogeneousDouble("
+            << "((" << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << ", " << a0.a3
+            << ", " << a0.a4 << "))"
+            << ")\n";
+
+  double result = f(a0);
+
+  std::cout << "result = " << result << "\n";
+
+  CHECK_APPROX(-3.0, result);
+
+  // Pass argument that will make the Dart callback throw.
+  a0.a0 = 42;
+
+  result = f(a0);
+
+  CHECK_APPROX(0.0, result);
+
+  // Pass argument that will make the Dart callback return null.
+  a0.a0 = 84;
+
+  result = f(a0);
+
+  CHECK_APPROX(0.0, result);
+
+  return 0;
+}
+
+// Used for testing structs by value.
+// Test 1kb struct.
+DART_EXPORT intptr_t TestPassStruct1024BytesHomogeneousUint64(
+    // NOLINTNEXTLINE(whitespace/parens)
+    uint64_t (*f)(Struct1024BytesHomogeneousUint64 a0)) {
+  Struct1024BytesHomogeneousUint64 a0;
+
+  a0.a0 = 1;
+  a0.a1 = 2;
+  a0.a2 = 3;
+  a0.a3 = 4;
+  a0.a4 = 5;
+  a0.a5 = 6;
+  a0.a6 = 7;
+  a0.a7 = 8;
+  a0.a8 = 9;
+  a0.a9 = 10;
+  a0.a10 = 11;
+  a0.a11 = 12;
+  a0.a12 = 13;
+  a0.a13 = 14;
+  a0.a14 = 15;
+  a0.a15 = 16;
+  a0.a16 = 17;
+  a0.a17 = 18;
+  a0.a18 = 19;
+  a0.a19 = 20;
+  a0.a20 = 21;
+  a0.a21 = 22;
+  a0.a22 = 23;
+  a0.a23 = 24;
+  a0.a24 = 25;
+  a0.a25 = 26;
+  a0.a26 = 27;
+  a0.a27 = 28;
+  a0.a28 = 29;
+  a0.a29 = 30;
+  a0.a30 = 31;
+  a0.a31 = 32;
+  a0.a32 = 33;
+  a0.a33 = 34;
+  a0.a34 = 35;
+  a0.a35 = 36;
+  a0.a36 = 37;
+  a0.a37 = 38;
+  a0.a38 = 39;
+  a0.a39 = 40;
+  a0.a40 = 41;
+  a0.a41 = 42;
+  a0.a42 = 43;
+  a0.a43 = 44;
+  a0.a44 = 45;
+  a0.a45 = 46;
+  a0.a46 = 47;
+  a0.a47 = 48;
+  a0.a48 = 49;
+  a0.a49 = 50;
+  a0.a50 = 51;
+  a0.a51 = 52;
+  a0.a52 = 53;
+  a0.a53 = 54;
+  a0.a54 = 55;
+  a0.a55 = 56;
+  a0.a56 = 57;
+  a0.a57 = 58;
+  a0.a58 = 59;
+  a0.a59 = 60;
+  a0.a60 = 61;
+  a0.a61 = 62;
+  a0.a62 = 63;
+  a0.a63 = 64;
+  a0.a64 = 65;
+  a0.a65 = 66;
+  a0.a66 = 67;
+  a0.a67 = 68;
+  a0.a68 = 69;
+  a0.a69 = 70;
+  a0.a70 = 71;
+  a0.a71 = 72;
+  a0.a72 = 73;
+  a0.a73 = 74;
+  a0.a74 = 75;
+  a0.a75 = 76;
+  a0.a76 = 77;
+  a0.a77 = 78;
+  a0.a78 = 79;
+  a0.a79 = 80;
+  a0.a80 = 81;
+  a0.a81 = 82;
+  a0.a82 = 83;
+  a0.a83 = 84;
+  a0.a84 = 85;
+  a0.a85 = 86;
+  a0.a86 = 87;
+  a0.a87 = 88;
+  a0.a88 = 89;
+  a0.a89 = 90;
+  a0.a90 = 91;
+  a0.a91 = 92;
+  a0.a92 = 93;
+  a0.a93 = 94;
+  a0.a94 = 95;
+  a0.a95 = 96;
+  a0.a96 = 97;
+  a0.a97 = 98;
+  a0.a98 = 99;
+  a0.a99 = 100;
+  a0.a100 = 101;
+  a0.a101 = 102;
+  a0.a102 = 103;
+  a0.a103 = 104;
+  a0.a104 = 105;
+  a0.a105 = 106;
+  a0.a106 = 107;
+  a0.a107 = 108;
+  a0.a108 = 109;
+  a0.a109 = 110;
+  a0.a110 = 111;
+  a0.a111 = 112;
+  a0.a112 = 113;
+  a0.a113 = 114;
+  a0.a114 = 115;
+  a0.a115 = 116;
+  a0.a116 = 117;
+  a0.a117 = 118;
+  a0.a118 = 119;
+  a0.a119 = 120;
+  a0.a120 = 121;
+  a0.a121 = 122;
+  a0.a122 = 123;
+  a0.a123 = 124;
+  a0.a124 = 125;
+  a0.a125 = 126;
+  a0.a126 = 127;
+  a0.a127 = 128;
+
+  std::cout << "Calling TestPassStruct1024BytesHomogeneousUint64("
+            << "((" << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << ", " << a0.a3
+            << ", " << a0.a4 << ", " << a0.a5 << ", " << a0.a6 << ", " << a0.a7
+            << ", " << a0.a8 << ", " << a0.a9 << ", " << a0.a10 << ", "
+            << a0.a11 << ", " << a0.a12 << ", " << a0.a13 << ", " << a0.a14
+            << ", " << a0.a15 << ", " << a0.a16 << ", " << a0.a17 << ", "
+            << a0.a18 << ", " << a0.a19 << ", " << a0.a20 << ", " << a0.a21
+            << ", " << a0.a22 << ", " << a0.a23 << ", " << a0.a24 << ", "
+            << a0.a25 << ", " << a0.a26 << ", " << a0.a27 << ", " << a0.a28
+            << ", " << a0.a29 << ", " << a0.a30 << ", " << a0.a31 << ", "
+            << a0.a32 << ", " << a0.a33 << ", " << a0.a34 << ", " << a0.a35
+            << ", " << a0.a36 << ", " << a0.a37 << ", " << a0.a38 << ", "
+            << a0.a39 << ", " << a0.a40 << ", " << a0.a41 << ", " << a0.a42
+            << ", " << a0.a43 << ", " << a0.a44 << ", " << a0.a45 << ", "
+            << a0.a46 << ", " << a0.a47 << ", " << a0.a48 << ", " << a0.a49
+            << ", " << a0.a50 << ", " << a0.a51 << ", " << a0.a52 << ", "
+            << a0.a53 << ", " << a0.a54 << ", " << a0.a55 << ", " << a0.a56
+            << ", " << a0.a57 << ", " << a0.a58 << ", " << a0.a59 << ", "
+            << a0.a60 << ", " << a0.a61 << ", " << a0.a62 << ", " << a0.a63
+            << ", " << a0.a64 << ", " << a0.a65 << ", " << a0.a66 << ", "
+            << a0.a67 << ", " << a0.a68 << ", " << a0.a69 << ", " << a0.a70
+            << ", " << a0.a71 << ", " << a0.a72 << ", " << a0.a73 << ", "
+            << a0.a74 << ", " << a0.a75 << ", " << a0.a76 << ", " << a0.a77
+            << ", " << a0.a78 << ", " << a0.a79 << ", " << a0.a80 << ", "
+            << a0.a81 << ", " << a0.a82 << ", " << a0.a83 << ", " << a0.a84
+            << ", " << a0.a85 << ", " << a0.a86 << ", " << a0.a87 << ", "
+            << a0.a88 << ", " << a0.a89 << ", " << a0.a90 << ", " << a0.a91
+            << ", " << a0.a92 << ", " << a0.a93 << ", " << a0.a94 << ", "
+            << a0.a95 << ", " << a0.a96 << ", " << a0.a97 << ", " << a0.a98
+            << ", " << a0.a99 << ", " << a0.a100 << ", " << a0.a101 << ", "
+            << a0.a102 << ", " << a0.a103 << ", " << a0.a104 << ", " << a0.a105
+            << ", " << a0.a106 << ", " << a0.a107 << ", " << a0.a108 << ", "
+            << a0.a109 << ", " << a0.a110 << ", " << a0.a111 << ", " << a0.a112
+            << ", " << a0.a113 << ", " << a0.a114 << ", " << a0.a115 << ", "
+            << a0.a116 << ", " << a0.a117 << ", " << a0.a118 << ", " << a0.a119
+            << ", " << a0.a120 << ", " << a0.a121 << ", " << a0.a122 << ", "
+            << a0.a123 << ", " << a0.a124 << ", " << a0.a125 << ", " << a0.a126
+            << ", " << a0.a127 << "))"
+            << ")\n";
+
+  uint64_t result = f(a0);
+
+  std::cout << "result = " << result << "\n";
+
+  CHECK_EQ(8256, result);
+
+  // Pass argument that will make the Dart callback throw.
+  a0.a0 = 42;
+
+  result = f(a0);
+
+  CHECK_EQ(0, result);
+
+  // Pass argument that will make the Dart callback return null.
+  a0.a0 = 84;
+
+  result = f(a0);
+
+  CHECK_EQ(0, result);
+
+  return 0;
+}
+
+// Used for testing structs by value.
+// Tests the alignment of structs in FPU registers and backfilling.
+DART_EXPORT intptr_t TestPassFloatStruct16BytesHomogeneousFloatFloatStruct1(
+    // NOLINTNEXTLINE(whitespace/parens)
+    float (*f)(float a0,
+               Struct16BytesHomogeneousFloat a1,
+               float a2,
+               Struct16BytesHomogeneousFloat a3,
+               float a4,
+               Struct16BytesHomogeneousFloat a5,
+               float a6,
+               Struct16BytesHomogeneousFloat a7,
+               float a8)) {
+  float a0;
+  Struct16BytesHomogeneousFloat a1;
+  float a2;
+  Struct16BytesHomogeneousFloat a3;
+  float a4;
+  Struct16BytesHomogeneousFloat a5;
+  float a6;
+  Struct16BytesHomogeneousFloat a7;
+  float a8;
+
+  a0 = -1.0;
+  a1.a0 = 2.0;
+  a1.a1 = -3.0;
+  a1.a2 = 4.0;
+  a1.a3 = -5.0;
+  a2 = 6.0;
+  a3.a0 = -7.0;
+  a3.a1 = 8.0;
+  a3.a2 = -9.0;
+  a3.a3 = 10.0;
+  a4 = -11.0;
+  a5.a0 = 12.0;
+  a5.a1 = -13.0;
+  a5.a2 = 14.0;
+  a5.a3 = -15.0;
+  a6 = 16.0;
+  a7.a0 = -17.0;
+  a7.a1 = 18.0;
+  a7.a2 = -19.0;
+  a7.a3 = 20.0;
+  a8 = -21.0;
+
+  std::cout << "Calling TestPassFloatStruct16BytesHomogeneousFloatFloatStruct1("
+            << "(" << a0 << ", (" << a1.a0 << ", " << a1.a1 << ", " << a1.a2
+            << ", " << a1.a3 << "), " << a2 << ", (" << a3.a0 << ", " << a3.a1
+            << ", " << a3.a2 << ", " << a3.a3 << "), " << a4 << ", (" << a5.a0
+            << ", " << a5.a1 << ", " << a5.a2 << ", " << a5.a3 << "), " << a6
+            << ", (" << a7.a0 << ", " << a7.a1 << ", " << a7.a2 << ", " << a7.a3
+            << "), " << a8 << ")"
+            << ")\n";
+
+  float result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8);
+
+  std::cout << "result = " << result << "\n";
+
+  CHECK_APPROX(-11.0, result);
+
+  // Pass argument that will make the Dart callback throw.
+  a0 = 42;
+
+  result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8);
+
+  CHECK_APPROX(0.0, result);
+
+  // Pass argument that will make the Dart callback return null.
+  a0 = 84;
+
+  result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8);
+
+  CHECK_APPROX(0.0, result);
+
+  return 0;
+}
+
+// Used for testing structs by value.
+// Tests the alignment of structs in FPU registers and backfilling.
+DART_EXPORT intptr_t TestPassFloatStruct32BytesHomogeneousDoubleFloatStruct(
+    // NOLINTNEXTLINE(whitespace/parens)
+    double (*f)(float a0,
+                Struct32BytesHomogeneousDouble a1,
+                float a2,
+                Struct32BytesHomogeneousDouble a3,
+                float a4,
+                Struct32BytesHomogeneousDouble a5,
+                float a6,
+                Struct32BytesHomogeneousDouble a7,
+                float a8)) {
+  float a0;
+  Struct32BytesHomogeneousDouble a1;
+  float a2;
+  Struct32BytesHomogeneousDouble a3;
+  float a4;
+  Struct32BytesHomogeneousDouble a5;
+  float a6;
+  Struct32BytesHomogeneousDouble a7;
+  float a8;
+
+  a0 = -1.0;
+  a1.a0 = 2.0;
+  a1.a1 = -3.0;
+  a1.a2 = 4.0;
+  a1.a3 = -5.0;
+  a2 = 6.0;
+  a3.a0 = -7.0;
+  a3.a1 = 8.0;
+  a3.a2 = -9.0;
+  a3.a3 = 10.0;
+  a4 = -11.0;
+  a5.a0 = 12.0;
+  a5.a1 = -13.0;
+  a5.a2 = 14.0;
+  a5.a3 = -15.0;
+  a6 = 16.0;
+  a7.a0 = -17.0;
+  a7.a1 = 18.0;
+  a7.a2 = -19.0;
+  a7.a3 = 20.0;
+  a8 = -21.0;
+
+  std::cout << "Calling TestPassFloatStruct32BytesHomogeneousDoubleFloatStruct("
+            << "(" << a0 << ", (" << a1.a0 << ", " << a1.a1 << ", " << a1.a2
+            << ", " << a1.a3 << "), " << a2 << ", (" << a3.a0 << ", " << a3.a1
+            << ", " << a3.a2 << ", " << a3.a3 << "), " << a4 << ", (" << a5.a0
+            << ", " << a5.a1 << ", " << a5.a2 << ", " << a5.a3 << "), " << a6
+            << ", (" << a7.a0 << ", " << a7.a1 << ", " << a7.a2 << ", " << a7.a3
+            << "), " << a8 << ")"
+            << ")\n";
+
+  double result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8);
+
+  std::cout << "result = " << result << "\n";
+
+  CHECK_APPROX(-11.0, result);
+
+  // Pass argument that will make the Dart callback throw.
+  a0 = 42;
+
+  result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8);
+
+  CHECK_APPROX(0.0, result);
+
+  // Pass argument that will make the Dart callback return null.
+  a0 = 84;
+
+  result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8);
+
+  CHECK_APPROX(0.0, result);
+
+  return 0;
+}
+
+// Used for testing structs by value.
+// Tests the alignment of structs in integers registers and on the stack.
+// Arm32 aligns this struct at 8.
+// Also, arm32 allocates the second struct partially in registers, partially
+// on stack.
+// Test backfilling of integer registers.
+DART_EXPORT intptr_t TestPassInt8Struct16BytesMixedInt8Struct16BytesMixedIn(
+    // NOLINTNEXTLINE(whitespace/parens)
+    double (*f)(int8_t a0,
+                Struct16BytesMixed a1,
+                int8_t a2,
+                Struct16BytesMixed a3,
+                int8_t a4,
+                Struct16BytesMixed a5,
+                int8_t a6,
+                Struct16BytesMixed a7,
+                int8_t a8)) {
+  int8_t a0;
+  Struct16BytesMixed a1;
+  int8_t a2;
+  Struct16BytesMixed a3;
+  int8_t a4;
+  Struct16BytesMixed a5;
+  int8_t a6;
+  Struct16BytesMixed a7;
+  int8_t a8;
+
+  a0 = -1;
+  a1.a0 = 2.0;
+  a1.a1 = -3;
+  a2 = 4;
+  a3.a0 = -5.0;
+  a3.a1 = 6;
+  a4 = -7;
+  a5.a0 = 8.0;
+  a5.a1 = -9;
+  a6 = 10;
+  a7.a0 = -11.0;
+  a7.a1 = 12;
+  a8 = -13;
+
+  std::cout << "Calling TestPassInt8Struct16BytesMixedInt8Struct16BytesMixedIn("
+            << "(" << static_cast<int>(a0) << ", (" << a1.a0 << ", " << a1.a1
+            << "), " << static_cast<int>(a2) << ", (" << a3.a0 << ", " << a3.a1
+            << "), " << static_cast<int>(a4) << ", (" << a5.a0 << ", " << a5.a1
+            << "), " << static_cast<int>(a6) << ", (" << a7.a0 << ", " << a7.a1
+            << "), " << static_cast<int>(a8) << ")"
+            << ")\n";
+
+  double result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8);
+
+  std::cout << "result = " << result << "\n";
+
+  CHECK_APPROX(-7.0, result);
+
+  // Pass argument that will make the Dart callback throw.
+  a0 = 42;
+
+  result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8);
+
+  CHECK_APPROX(0.0, result);
+
+  // Pass argument that will make the Dart callback return null.
+  a0 = 84;
+
+  result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8);
+
+  CHECK_APPROX(0.0, result);
+
+  return 0;
+}
+
+// Used for testing structs by value.
+// On Linux x64, it will exhaust xmm registers first, after 6 doubles and 2
+// structs. The rest of the structs will go on the stack.
+// The int will be backfilled into the int register.
+DART_EXPORT intptr_t TestPassDoublex6Struct16BytesMixedx4Int32(
+    // NOLINTNEXTLINE(whitespace/parens)
+    double (*f)(double a0,
+                double a1,
+                double a2,
+                double a3,
+                double a4,
+                double a5,
+                Struct16BytesMixed a6,
+                Struct16BytesMixed a7,
+                Struct16BytesMixed a8,
+                Struct16BytesMixed a9,
+                int32_t a10)) {
+  double a0;
+  double a1;
+  double a2;
+  double a3;
+  double a4;
+  double a5;
+  Struct16BytesMixed a6;
+  Struct16BytesMixed a7;
+  Struct16BytesMixed a8;
+  Struct16BytesMixed a9;
+  int32_t a10;
+
+  a0 = -1.0;
+  a1 = 2.0;
+  a2 = -3.0;
+  a3 = 4.0;
+  a4 = -5.0;
+  a5 = 6.0;
+  a6.a0 = -7.0;
+  a6.a1 = 8;
+  a7.a0 = -9.0;
+  a7.a1 = 10;
+  a8.a0 = -11.0;
+  a8.a1 = 12;
+  a9.a0 = -13.0;
+  a9.a1 = 14;
+  a10 = -15;
+
+  std::cout << "Calling TestPassDoublex6Struct16BytesMixedx4Int32("
+            << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ", " << a4
+            << ", " << a5 << ", (" << a6.a0 << ", " << a6.a1 << "), (" << a7.a0
+            << ", " << a7.a1 << "), (" << a8.a0 << ", " << a8.a1 << "), ("
+            << a9.a0 << ", " << a9.a1 << "), " << a10 << ")"
+            << ")\n";
+
+  double result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10);
+
+  std::cout << "result = " << result << "\n";
+
+  CHECK_APPROX(-8.0, result);
+
+  // Pass argument that will make the Dart callback throw.
+  a0 = 42;
+
+  result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10);
+
+  CHECK_APPROX(0.0, result);
+
+  // Pass argument that will make the Dart callback return null.
+  a0 = 84;
+
+  result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10);
+
+  CHECK_APPROX(0.0, result);
+
+  return 0;
+}
+
+// Used for testing structs by value.
+// On Linux x64, it will exhaust int registers first.
+// The rest of the structs will go on the stack.
+// The double will be backfilled into the xmm register.
+DART_EXPORT intptr_t TestPassInt32x4Struct16BytesMixedx4Double(
+    // NOLINTNEXTLINE(whitespace/parens)
+    double (*f)(int32_t a0,
+                int32_t a1,
+                int32_t a2,
+                int32_t a3,
+                Struct16BytesMixed a4,
+                Struct16BytesMixed a5,
+                Struct16BytesMixed a6,
+                Struct16BytesMixed a7,
+                double a8)) {
+  int32_t a0;
+  int32_t a1;
+  int32_t a2;
+  int32_t a3;
+  Struct16BytesMixed a4;
+  Struct16BytesMixed a5;
+  Struct16BytesMixed a6;
+  Struct16BytesMixed a7;
+  double a8;
+
+  a0 = -1;
+  a1 = 2;
+  a2 = -3;
+  a3 = 4;
+  a4.a0 = -5.0;
+  a4.a1 = 6;
+  a5.a0 = -7.0;
+  a5.a1 = 8;
+  a6.a0 = -9.0;
+  a6.a1 = 10;
+  a7.a0 = -11.0;
+  a7.a1 = 12;
+  a8 = -13.0;
+
+  std::cout << "Calling TestPassInt32x4Struct16BytesMixedx4Double("
+            << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ", ("
+            << a4.a0 << ", " << a4.a1 << "), (" << a5.a0 << ", " << a5.a1
+            << "), (" << a6.a0 << ", " << a6.a1 << "), (" << a7.a0 << ", "
+            << a7.a1 << "), " << a8 << ")"
+            << ")\n";
+
+  double result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8);
+
+  std::cout << "result = " << result << "\n";
+
+  CHECK_APPROX(-7.0, result);
+
+  // Pass argument that will make the Dart callback throw.
+  a0 = 42;
+
+  result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8);
+
+  CHECK_APPROX(0.0, result);
+
+  // Pass argument that will make the Dart callback return null.
+  a0 = 84;
+
+  result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8);
+
+  CHECK_APPROX(0.0, result);
+
+  return 0;
+}
+
+// Used for testing structs by value.
+// On various architectures, first struct is allocated on stack.
+// Check that the other two arguments are allocated on registers.
+DART_EXPORT intptr_t TestPassStruct40BytesHomogeneousDoubleStruct4BytesHomo(
+    // NOLINTNEXTLINE(whitespace/parens)
+    double (*f)(Struct40BytesHomogeneousDouble a0,
+                Struct4BytesHomogeneousInt16 a1,
+                Struct8BytesHomogeneousFloat a2)) {
+  Struct40BytesHomogeneousDouble a0;
+  Struct4BytesHomogeneousInt16 a1;
+  Struct8BytesHomogeneousFloat a2;
+
+  a0.a0 = -1.0;
+  a0.a1 = 2.0;
+  a0.a2 = -3.0;
+  a0.a3 = 4.0;
+  a0.a4 = -5.0;
+  a1.a0 = 6;
+  a1.a1 = -7;
+  a2.a0 = 8.0;
+  a2.a1 = -9.0;
+
+  std::cout << "Calling TestPassStruct40BytesHomogeneousDoubleStruct4BytesHomo("
+            << "((" << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << ", " << a0.a3
+            << ", " << a0.a4 << "), (" << a1.a0 << ", " << a1.a1 << "), ("
+            << a2.a0 << ", " << a2.a1 << "))"
+            << ")\n";
+
+  double result = f(a0, a1, a2);
+
+  std::cout << "result = " << result << "\n";
+
+  CHECK_APPROX(-5.0, result);
+
+  // Pass argument that will make the Dart callback throw.
+  a0.a0 = 42;
+
+  result = f(a0, a1, a2);
+
+  CHECK_APPROX(0.0, result);
+
+  // Pass argument that will make the Dart callback return null.
+  a0.a0 = 84;
+
+  result = f(a0, a1, a2);
+
+  CHECK_APPROX(0.0, result);
+
+  return 0;
+}
+
+// Used for testing structs by value.
+// Test alignment and padding of 16 byte int within struct.
+DART_EXPORT intptr_t TestPassInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int(
+    // NOLINTNEXTLINE(whitespace/parens)
+    double (*f)(int32_t a0,
+                int32_t a1,
+                int32_t a2,
+                int32_t a3,
+                int32_t a4,
+                int32_t a5,
+                int32_t a6,
+                int32_t a7,
+                double a8,
+                double a9,
+                double a10,
+                double a11,
+                double a12,
+                double a13,
+                double a14,
+                double a15,
+                int64_t a16,
+                int8_t a17,
+                Struct1ByteInt a18,
+                int64_t a19,
+                int8_t a20,
+                Struct4BytesHomogeneousInt16 a21,
+                int64_t a22,
+                int8_t a23,
+                Struct8BytesInt a24,
+                int64_t a25,
+                int8_t a26,
+                Struct8BytesHomogeneousFloat a27,
+                int64_t a28,
+                int8_t a29,
+                Struct8BytesMixed a30,
+                int64_t a31,
+                int8_t a32,
+                StructAlignmentInt16 a33,
+                int64_t a34,
+                int8_t a35,
+                StructAlignmentInt32 a36,
+                int64_t a37,
+                int8_t a38,
+                StructAlignmentInt64 a39)) {
+  int32_t a0;
+  int32_t a1;
+  int32_t a2;
+  int32_t a3;
+  int32_t a4;
+  int32_t a5;
+  int32_t a6;
+  int32_t a7;
+  double a8;
+  double a9;
+  double a10;
+  double a11;
+  double a12;
+  double a13;
+  double a14;
+  double a15;
+  int64_t a16;
+  int8_t a17;
+  Struct1ByteInt a18;
+  int64_t a19;
+  int8_t a20;
+  Struct4BytesHomogeneousInt16 a21;
+  int64_t a22;
+  int8_t a23;
+  Struct8BytesInt a24;
+  int64_t a25;
+  int8_t a26;
+  Struct8BytesHomogeneousFloat a27;
+  int64_t a28;
+  int8_t a29;
+  Struct8BytesMixed a30;
+  int64_t a31;
+  int8_t a32;
+  StructAlignmentInt16 a33;
+  int64_t a34;
+  int8_t a35;
+  StructAlignmentInt32 a36;
+  int64_t a37;
+  int8_t a38;
+  StructAlignmentInt64 a39;
+
+  a0 = -1;
+  a1 = 2;
+  a2 = -3;
+  a3 = 4;
+  a4 = -5;
+  a5 = 6;
+  a6 = -7;
+  a7 = 8;
+  a8 = -9.0;
+  a9 = 10.0;
+  a10 = -11.0;
+  a11 = 12.0;
+  a12 = -13.0;
+  a13 = 14.0;
+  a14 = -15.0;
+  a15 = 16.0;
+  a16 = -17;
+  a17 = 18;
+  a18.a0 = -19;
+  a19 = 20;
+  a20 = -21;
+  a21.a0 = 22;
+  a21.a1 = -23;
+  a22 = 24;
+  a23 = -25;
+  a24.a0 = 26;
+  a24.a1 = -27;
+  a24.a2 = 28;
+  a25 = -29;
+  a26 = 30;
+  a27.a0 = -31.0;
+  a27.a1 = 32.0;
+  a28 = -33;
+  a29 = 34;
+  a30.a0 = -35.0;
+  a30.a1 = 36;
+  a30.a2 = -37;
+  a31 = 38;
+  a32 = -39;
+  a33.a0 = 40;
+  a33.a1 = -41;
+  a33.a2 = 42;
+  a34 = -43;
+  a35 = 44;
+  a36.a0 = -45;
+  a36.a1 = 46;
+  a36.a2 = -47;
+  a37 = 48;
+  a38 = -49;
+  a39.a0 = 50;
+  a39.a1 = -51;
+  a39.a2 = 52;
+
+  std::cout << "Calling TestPassInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int("
+            << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ", " << a4
+            << ", " << a5 << ", " << a6 << ", " << a7 << ", " << a8 << ", "
+            << a9 << ", " << a10 << ", " << a11 << ", " << a12 << ", " << a13
+            << ", " << a14 << ", " << a15 << ", " << a16 << ", "
+            << static_cast<int>(a17) << ", (" << static_cast<int>(a18.a0)
+            << "), " << a19 << ", " << static_cast<int>(a20) << ", (" << a21.a0
+            << ", " << a21.a1 << "), " << a22 << ", " << static_cast<int>(a23)
+            << ", (" << a24.a0 << ", " << a24.a1 << ", " << a24.a2 << "), "
+            << a25 << ", " << static_cast<int>(a26) << ", (" << a27.a0 << ", "
+            << a27.a1 << "), " << a28 << ", " << static_cast<int>(a29) << ", ("
+            << a30.a0 << ", " << a30.a1 << ", " << a30.a2 << "), " << a31
+            << ", " << static_cast<int>(a32) << ", ("
+            << static_cast<int>(a33.a0) << ", " << a33.a1 << ", "
+            << static_cast<int>(a33.a2) << "), " << a34 << ", "
+            << static_cast<int>(a35) << ", (" << static_cast<int>(a36.a0)
+            << ", " << a36.a1 << ", " << static_cast<int>(a36.a2) << "), "
+            << a37 << ", " << static_cast<int>(a38) << ", ("
+            << static_cast<int>(a39.a0) << ", " << a39.a1 << ", "
+            << static_cast<int>(a39.a2) << "))"
+            << ")\n";
+
+  double result =
+      f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15,
+        a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29,
+        a30, a31, a32, a33, a34, a35, a36, a37, a38, a39);
+
+  std::cout << "result = " << result << "\n";
+
+  CHECK_APPROX(26.0, result);
+
+  // Pass argument that will make the Dart callback throw.
+  a0 = 42;
+
+  result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14,
+             a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27,
+             a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39);
+
+  CHECK_APPROX(0.0, result);
+
+  // Pass argument that will make the Dart callback return null.
+  a0 = 84;
+
+  result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14,
+             a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27,
+             a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39);
+
+  CHECK_APPROX(0.0, result);
+
+  return 0;
+}
+
+// Used for testing structs by value.
+// Test alignment and padding of 16 byte int within struct.
+DART_EXPORT intptr_t TestPassStructAlignmentInt16(
+    // NOLINTNEXTLINE(whitespace/parens)
+    int64_t (*f)(StructAlignmentInt16 a0)) {
+  StructAlignmentInt16 a0;
+
+  a0.a0 = -1;
+  a0.a1 = 2;
+  a0.a2 = -3;
+
+  std::cout << "Calling TestPassStructAlignmentInt16("
+            << "((" << static_cast<int>(a0.a0) << ", " << a0.a1 << ", "
+            << static_cast<int>(a0.a2) << "))"
+            << ")\n";
+
+  int64_t result = f(a0);
+
+  std::cout << "result = " << result << "\n";
+
+  CHECK_EQ(-2, result);
+
+  // Pass argument that will make the Dart callback throw.
+  a0.a0 = 42;
+
+  result = f(a0);
+
+  CHECK_EQ(0, result);
+
+  // Pass argument that will make the Dart callback return null.
+  a0.a0 = 84;
+
+  result = f(a0);
+
+  CHECK_EQ(0, result);
+
+  return 0;
+}
+
+// Used for testing structs by value.
+// Test alignment and padding of 32 byte int within struct.
+DART_EXPORT intptr_t TestPassStructAlignmentInt32(
+    // NOLINTNEXTLINE(whitespace/parens)
+    int64_t (*f)(StructAlignmentInt32 a0)) {
+  StructAlignmentInt32 a0;
+
+  a0.a0 = -1;
+  a0.a1 = 2;
+  a0.a2 = -3;
+
+  std::cout << "Calling TestPassStructAlignmentInt32("
+            << "((" << static_cast<int>(a0.a0) << ", " << a0.a1 << ", "
+            << static_cast<int>(a0.a2) << "))"
+            << ")\n";
+
+  int64_t result = f(a0);
+
+  std::cout << "result = " << result << "\n";
+
+  CHECK_EQ(-2, result);
+
+  // Pass argument that will make the Dart callback throw.
+  a0.a0 = 42;
+
+  result = f(a0);
+
+  CHECK_EQ(0, result);
+
+  // Pass argument that will make the Dart callback return null.
+  a0.a0 = 84;
+
+  result = f(a0);
+
+  CHECK_EQ(0, result);
+
+  return 0;
+}
+
+// Used for testing structs by value.
+// Test alignment and padding of 64 byte int within struct.
+DART_EXPORT intptr_t TestPassStructAlignmentInt64(
+    // NOLINTNEXTLINE(whitespace/parens)
+    int64_t (*f)(StructAlignmentInt64 a0)) {
+  StructAlignmentInt64 a0;
+
+  a0.a0 = -1;
+  a0.a1 = 2;
+  a0.a2 = -3;
+
+  std::cout << "Calling TestPassStructAlignmentInt64("
+            << "((" << static_cast<int>(a0.a0) << ", " << a0.a1 << ", "
+            << static_cast<int>(a0.a2) << "))"
+            << ")\n";
+
+  int64_t result = f(a0);
+
+  std::cout << "result = " << result << "\n";
+
+  CHECK_EQ(-2, result);
+
+  // Pass argument that will make the Dart callback throw.
+  a0.a0 = 42;
+
+  result = f(a0);
+
+  CHECK_EQ(0, result);
+
+  // Pass argument that will make the Dart callback return null.
+  a0.a0 = 84;
+
+  result = f(a0);
+
+  CHECK_EQ(0, result);
+
+  return 0;
+}
+
+// Used for testing structs by value.
+// Smallest struct with data.
+DART_EXPORT intptr_t TestReturnStruct1ByteInt(
+    // NOLINTNEXTLINE(whitespace/parens)
+    Struct1ByteInt (*f)(int8_t a0)) {
+  int8_t a0;
+
+  a0 = -1;
+
+  std::cout << "Calling TestReturnStruct1ByteInt("
+            << "(" << static_cast<int>(a0) << ")"
+            << ")\n";
+
+  Struct1ByteInt result = f(a0);
+
+  std::cout << "result = "
+            << "(" << static_cast<int>(result.a0) << ")"
+            << "\n";
+
+  CHECK_EQ(a0, result.a0);
+
+  // Pass argument that will make the Dart callback throw.
+  a0 = 42;
+
+  result = f(a0);
+
+  CHECK_EQ(0, result.a0);
+
+  // Pass argument that will make the Dart callback return null.
+  a0 = 84;
+
+  result = f(a0);
+
+  CHECK_EQ(0, result.a0);
+
+  return 0;
+}
+
+// Used for testing structs by value.
+// Smaller than word size return value on all architectures.
+DART_EXPORT intptr_t TestReturnStruct3BytesHomogeneousUint8(
+    // NOLINTNEXTLINE(whitespace/parens)
+    Struct3BytesHomogeneousUint8 (*f)(uint8_t a0, uint8_t a1, uint8_t a2)) {
+  uint8_t a0;
+  uint8_t a1;
+  uint8_t a2;
+
+  a0 = 1;
+  a1 = 2;
+  a2 = 3;
+
+  std::cout << "Calling TestReturnStruct3BytesHomogeneousUint8("
+            << "(" << static_cast<int>(a0) << ", " << static_cast<int>(a1)
+            << ", " << static_cast<int>(a2) << ")"
+            << ")\n";
+
+  Struct3BytesHomogeneousUint8 result = f(a0, a1, a2);
+
+  std::cout << "result = "
+            << "(" << static_cast<int>(result.a0) << ", "
+            << static_cast<int>(result.a1) << ", "
+            << static_cast<int>(result.a2) << ")"
+            << "\n";
+
+  CHECK_EQ(a0, result.a0);
+  CHECK_EQ(a1, result.a1);
+  CHECK_EQ(a2, result.a2);
+
+  // Pass argument that will make the Dart callback throw.
+  a0 = 42;
+
+  result = f(a0, a1, a2);
+
+  CHECK_EQ(0, result.a0);
+  CHECK_EQ(0, result.a1);
+  CHECK_EQ(0, result.a2);
+
+  // Pass argument that will make the Dart callback return null.
+  a0 = 84;
+
+  result = f(a0, a1, a2);
+
+  CHECK_EQ(0, result.a0);
+  CHECK_EQ(0, result.a1);
+  CHECK_EQ(0, result.a2);
+
+  return 0;
+}
+
+// Used for testing structs by value.
+// Smaller than word size return value on all architectures.
+// With alignment rules taken into account size is 4 bytes.
+DART_EXPORT intptr_t TestReturnStruct3BytesInt2ByteAligned(
+    // NOLINTNEXTLINE(whitespace/parens)
+    Struct3BytesInt2ByteAligned (*f)(int16_t a0, int8_t a1)) {
+  int16_t a0;
+  int8_t a1;
+
+  a0 = -1;
+  a1 = 2;
+
+  std::cout << "Calling TestReturnStruct3BytesInt2ByteAligned("
+            << "(" << a0 << ", " << static_cast<int>(a1) << ")"
+            << ")\n";
+
+  Struct3BytesInt2ByteAligned result = f(a0, a1);
+
+  std::cout << "result = "
+            << "(" << result.a0 << ", " << static_cast<int>(result.a1) << ")"
+            << "\n";
+
+  CHECK_EQ(a0, result.a0);
+  CHECK_EQ(a1, result.a1);
+
+  // Pass argument that will make the Dart callback throw.
+  a0 = 42;
+
+  result = f(a0, a1);
+
+  CHECK_EQ(0, result.a0);
+  CHECK_EQ(0, result.a1);
+
+  // Pass argument that will make the Dart callback return null.
+  a0 = 84;
+
+  result = f(a0, a1);
+
+  CHECK_EQ(0, result.a0);
+  CHECK_EQ(0, result.a1);
+
+  return 0;
+}
+
+// Used for testing structs by value.
+// Word size return value on 32 bit architectures..
+DART_EXPORT intptr_t TestReturnStruct4BytesHomogeneousInt16(
+    // NOLINTNEXTLINE(whitespace/parens)
+    Struct4BytesHomogeneousInt16 (*f)(int16_t a0, int16_t a1)) {
+  int16_t a0;
+  int16_t a1;
+
+  a0 = -1;
+  a1 = 2;
+
+  std::cout << "Calling TestReturnStruct4BytesHomogeneousInt16("
+            << "(" << a0 << ", " << a1 << ")"
+            << ")\n";
+
+  Struct4BytesHomogeneousInt16 result = f(a0, a1);
+
+  std::cout << "result = "
+            << "(" << result.a0 << ", " << result.a1 << ")"
+            << "\n";
+
+  CHECK_EQ(a0, result.a0);
+  CHECK_EQ(a1, result.a1);
+
+  // Pass argument that will make the Dart callback throw.
+  a0 = 42;
+
+  result = f(a0, a1);
+
+  CHECK_EQ(0, result.a0);
+  CHECK_EQ(0, result.a1);
+
+  // Pass argument that will make the Dart callback return null.
+  a0 = 84;
+
+  result = f(a0, a1);
+
+  CHECK_EQ(0, result.a0);
+  CHECK_EQ(0, result.a1);
+
+  return 0;
+}
+
+// Used for testing structs by value.
+// Non-wordsize return value.
+DART_EXPORT intptr_t TestReturnStruct7BytesHomogeneousUint8(
+    // NOLINTNEXTLINE(whitespace/parens)
+    Struct7BytesHomogeneousUint8 (*f)(uint8_t a0,
+                                      uint8_t a1,
+                                      uint8_t a2,
+                                      uint8_t a3,
+                                      uint8_t a4,
+                                      uint8_t a5,
+                                      uint8_t a6)) {
+  uint8_t a0;
+  uint8_t a1;
+  uint8_t a2;
+  uint8_t a3;
+  uint8_t a4;
+  uint8_t a5;
+  uint8_t a6;
+
+  a0 = 1;
+  a1 = 2;
+  a2 = 3;
+  a3 = 4;
+  a4 = 5;
+  a5 = 6;
+  a6 = 7;
+
+  std::cout << "Calling TestReturnStruct7BytesHomogeneousUint8("
+            << "(" << static_cast<int>(a0) << ", " << static_cast<int>(a1)
+            << ", " << static_cast<int>(a2) << ", " << static_cast<int>(a3)
+            << ", " << static_cast<int>(a4) << ", " << static_cast<int>(a5)
+            << ", " << static_cast<int>(a6) << ")"
+            << ")\n";
+
+  Struct7BytesHomogeneousUint8 result = f(a0, a1, a2, a3, a4, a5, a6);
+
+  std::cout << "result = "
+            << "(" << static_cast<int>(result.a0) << ", "
+            << static_cast<int>(result.a1) << ", "
+            << static_cast<int>(result.a2) << ", "
+            << static_cast<int>(result.a3) << ", "
+            << static_cast<int>(result.a4) << ", "
+            << static_cast<int>(result.a5) << ", "
+            << static_cast<int>(result.a6) << ")"
+            << "\n";
+
+  CHECK_EQ(a0, result.a0);
+  CHECK_EQ(a1, result.a1);
+  CHECK_EQ(a2, result.a2);
+  CHECK_EQ(a3, result.a3);
+  CHECK_EQ(a4, result.a4);
+  CHECK_EQ(a5, result.a5);
+  CHECK_EQ(a6, result.a6);
+
+  // Pass argument that will make the Dart callback throw.
+  a0 = 42;
+
+  result = f(a0, a1, a2, a3, a4, a5, a6);
+
+  CHECK_EQ(0, result.a0);
+  CHECK_EQ(0, result.a1);
+  CHECK_EQ(0, result.a2);
+  CHECK_EQ(0, result.a3);
+  CHECK_EQ(0, result.a4);
+  CHECK_EQ(0, result.a5);
+  CHECK_EQ(0, result.a6);
+
+  // Pass argument that will make the Dart callback return null.
+  a0 = 84;
+
+  result = f(a0, a1, a2, a3, a4, a5, a6);
+
+  CHECK_EQ(0, result.a0);
+  CHECK_EQ(0, result.a1);
+  CHECK_EQ(0, result.a2);
+  CHECK_EQ(0, result.a3);
+  CHECK_EQ(0, result.a4);
+  CHECK_EQ(0, result.a5);
+  CHECK_EQ(0, result.a6);
+
+  return 0;
+}
+
+// Used for testing structs by value.
+// Non-wordsize return value.
+// With alignment rules taken into account size is 8 bytes.
+DART_EXPORT intptr_t TestReturnStruct7BytesInt4ByteAligned(
+    // NOLINTNEXTLINE(whitespace/parens)
+    Struct7BytesInt4ByteAligned (*f)(int32_t a0, int16_t a1, int8_t a2)) {
+  int32_t a0;
+  int16_t a1;
+  int8_t a2;
+
+  a0 = -1;
+  a1 = 2;
+  a2 = -3;
+
+  std::cout << "Calling TestReturnStruct7BytesInt4ByteAligned("
+            << "(" << a0 << ", " << a1 << ", " << static_cast<int>(a2) << ")"
+            << ")\n";
+
+  Struct7BytesInt4ByteAligned result = f(a0, a1, a2);
+
+  std::cout << "result = "
+            << "(" << result.a0 << ", " << result.a1 << ", "
+            << static_cast<int>(result.a2) << ")"
+            << "\n";
+
+  CHECK_EQ(a0, result.a0);
+  CHECK_EQ(a1, result.a1);
+  CHECK_EQ(a2, result.a2);
+
+  // Pass argument that will make the Dart callback throw.
+  a0 = 42;
+
+  result = f(a0, a1, a2);
+
+  CHECK_EQ(0, result.a0);
+  CHECK_EQ(0, result.a1);
+  CHECK_EQ(0, result.a2);
+
+  // Pass argument that will make the Dart callback return null.
+  a0 = 84;
+
+  result = f(a0, a1, a2);
+
+  CHECK_EQ(0, result.a0);
+  CHECK_EQ(0, result.a1);
+  CHECK_EQ(0, result.a2);
+
+  return 0;
+}
+
+// Used for testing structs by value.
+// Return value in integer registers on many architectures.
+DART_EXPORT intptr_t TestReturnStruct8BytesInt(
+    // NOLINTNEXTLINE(whitespace/parens)
+    Struct8BytesInt (*f)(int16_t a0, int16_t a1, int32_t a2)) {
+  int16_t a0;
+  int16_t a1;
+  int32_t a2;
+
+  a0 = -1;
+  a1 = 2;
+  a2 = -3;
+
+  std::cout << "Calling TestReturnStruct8BytesInt("
+            << "(" << a0 << ", " << a1 << ", " << a2 << ")"
+            << ")\n";
+
+  Struct8BytesInt result = f(a0, a1, a2);
+
+  std::cout << "result = "
+            << "(" << result.a0 << ", " << result.a1 << ", " << result.a2 << ")"
+            << "\n";
+
+  CHECK_EQ(a0, result.a0);
+  CHECK_EQ(a1, result.a1);
+  CHECK_EQ(a2, result.a2);
+
+  // Pass argument that will make the Dart callback throw.
+  a0 = 42;
+
+  result = f(a0, a1, a2);
+
+  CHECK_EQ(0, result.a0);
+  CHECK_EQ(0, result.a1);
+  CHECK_EQ(0, result.a2);
+
+  // Pass argument that will make the Dart callback return null.
+  a0 = 84;
+
+  result = f(a0, a1, a2);
+
+  CHECK_EQ(0, result.a0);
+  CHECK_EQ(0, result.a1);
+  CHECK_EQ(0, result.a2);
+
+  return 0;
+}
+
+// Used for testing structs by value.
+// Return value in FP registers on many architectures.
+DART_EXPORT intptr_t TestReturnStruct8BytesHomogeneousFloat(
+    // NOLINTNEXTLINE(whitespace/parens)
+    Struct8BytesHomogeneousFloat (*f)(float a0, float a1)) {
+  float a0;
+  float a1;
+
+  a0 = -1.0;
+  a1 = 2.0;
+
+  std::cout << "Calling TestReturnStruct8BytesHomogeneousFloat("
+            << "(" << a0 << ", " << a1 << ")"
+            << ")\n";
+
+  Struct8BytesHomogeneousFloat result = f(a0, a1);
+
+  std::cout << "result = "
+            << "(" << result.a0 << ", " << result.a1 << ")"
+            << "\n";
+
+  CHECK_APPROX(a0, result.a0);
+  CHECK_APPROX(a1, result.a1);
+
+  // Pass argument that will make the Dart callback throw.
+  a0 = 42;
+
+  result = f(a0, a1);
+
+  CHECK_APPROX(0.0, result.a0);
+  CHECK_APPROX(0.0, result.a1);
+
+  // Pass argument that will make the Dart callback return null.
+  a0 = 84;
+
+  result = f(a0, a1);
+
+  CHECK_APPROX(0.0, result.a0);
+  CHECK_APPROX(0.0, result.a1);
+
+  return 0;
+}
+
+// Used for testing structs by value.
+// Return value split over FP and integer register in x64.
+DART_EXPORT intptr_t TestReturnStruct8BytesMixed(
+    // NOLINTNEXTLINE(whitespace/parens)
+    Struct8BytesMixed (*f)(float a0, int16_t a1, int16_t a2)) {
+  float a0;
+  int16_t a1;
+  int16_t a2;
+
+  a0 = -1.0;
+  a1 = 2;
+  a2 = -3;
+
+  std::cout << "Calling TestReturnStruct8BytesMixed("
+            << "(" << a0 << ", " << a1 << ", " << a2 << ")"
+            << ")\n";
+
+  Struct8BytesMixed result = f(a0, a1, a2);
+
+  std::cout << "result = "
+            << "(" << result.a0 << ", " << result.a1 << ", " << result.a2 << ")"
+            << "\n";
+
+  CHECK_APPROX(a0, result.a0);
+  CHECK_EQ(a1, result.a1);
+  CHECK_EQ(a2, result.a2);
+
+  // Pass argument that will make the Dart callback throw.
+  a0 = 42;
+
+  result = f(a0, a1, a2);
+
+  CHECK_APPROX(0.0, result.a0);
+  CHECK_EQ(0, result.a1);
+  CHECK_EQ(0, result.a2);
+
+  // Pass argument that will make the Dart callback return null.
+  a0 = 84;
+
+  result = f(a0, a1, a2);
+
+  CHECK_APPROX(0.0, result.a0);
+  CHECK_EQ(0, result.a1);
+  CHECK_EQ(0, result.a2);
+
+  return 0;
+}
+
+// Used for testing structs by value.
+// The minimum alignment of this struct is only 1 byte based on its fields.
+// Test that the memory backing these structs is the right size and that
+// dart:ffi trampolines do not write outside this size.
+DART_EXPORT intptr_t TestReturnStruct9BytesHomogeneousUint8(
+    // NOLINTNEXTLINE(whitespace/parens)
+    Struct9BytesHomogeneousUint8 (*f)(uint8_t a0,
+                                      uint8_t a1,
+                                      uint8_t a2,
+                                      uint8_t a3,
+                                      uint8_t a4,
+                                      uint8_t a5,
+                                      uint8_t a6,
+                                      uint8_t a7,
+                                      uint8_t a8)) {
+  uint8_t a0;
+  uint8_t a1;
+  uint8_t a2;
+  uint8_t a3;
+  uint8_t a4;
+  uint8_t a5;
+  uint8_t a6;
+  uint8_t a7;
+  uint8_t a8;
+
+  a0 = 1;
+  a1 = 2;
+  a2 = 3;
+  a3 = 4;
+  a4 = 5;
+  a5 = 6;
+  a6 = 7;
+  a7 = 8;
+  a8 = 9;
+
+  std::cout << "Calling TestReturnStruct9BytesHomogeneousUint8("
+            << "(" << static_cast<int>(a0) << ", " << static_cast<int>(a1)
+            << ", " << static_cast<int>(a2) << ", " << static_cast<int>(a3)
+            << ", " << static_cast<int>(a4) << ", " << static_cast<int>(a5)
+            << ", " << static_cast<int>(a6) << ", " << static_cast<int>(a7)
+            << ", " << static_cast<int>(a8) << ")"
+            << ")\n";
+
+  Struct9BytesHomogeneousUint8 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8);
+
+  std::cout << "result = "
+            << "(" << static_cast<int>(result.a0) << ", "
+            << static_cast<int>(result.a1) << ", "
+            << static_cast<int>(result.a2) << ", "
+            << static_cast<int>(result.a3) << ", "
+            << static_cast<int>(result.a4) << ", "
+            << static_cast<int>(result.a5) << ", "
+            << static_cast<int>(result.a6) << ", "
+            << static_cast<int>(result.a7) << ", "
+            << static_cast<int>(result.a8) << ")"
+            << "\n";
+
+  CHECK_EQ(a0, result.a0);
+  CHECK_EQ(a1, result.a1);
+  CHECK_EQ(a2, result.a2);
+  CHECK_EQ(a3, result.a3);
+  CHECK_EQ(a4, result.a4);
+  CHECK_EQ(a5, result.a5);
+  CHECK_EQ(a6, result.a6);
+  CHECK_EQ(a7, result.a7);
+  CHECK_EQ(a8, result.a8);
+
+  // Pass argument that will make the Dart callback throw.
+  a0 = 42;
+
+  result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8);
+
+  CHECK_EQ(0, result.a0);
+  CHECK_EQ(0, result.a1);
+  CHECK_EQ(0, result.a2);
+  CHECK_EQ(0, result.a3);
+  CHECK_EQ(0, result.a4);
+  CHECK_EQ(0, result.a5);
+  CHECK_EQ(0, result.a6);
+  CHECK_EQ(0, result.a7);
+  CHECK_EQ(0, result.a8);
+
+  // Pass argument that will make the Dart callback return null.
+  a0 = 84;
+
+  result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8);
+
+  CHECK_EQ(0, result.a0);
+  CHECK_EQ(0, result.a1);
+  CHECK_EQ(0, result.a2);
+  CHECK_EQ(0, result.a3);
+  CHECK_EQ(0, result.a4);
+  CHECK_EQ(0, result.a5);
+  CHECK_EQ(0, result.a6);
+  CHECK_EQ(0, result.a7);
+  CHECK_EQ(0, result.a8);
+
+  return 0;
+}
+
+// Used for testing structs by value.
+// Return value in two integer registers on x64.
+// With alignment rules taken into account size is 12 or 16 bytes.
+DART_EXPORT intptr_t TestReturnStruct9BytesInt4Or8ByteAligned(
+    // NOLINTNEXTLINE(whitespace/parens)
+    Struct9BytesInt4Or8ByteAligned (*f)(int64_t a0, int8_t a1)) {
+  int64_t a0;
+  int8_t a1;
+
+  a0 = -1;
+  a1 = 2;
+
+  std::cout << "Calling TestReturnStruct9BytesInt4Or8ByteAligned("
+            << "(" << a0 << ", " << static_cast<int>(a1) << ")"
+            << ")\n";
+
+  Struct9BytesInt4Or8ByteAligned result = f(a0, a1);
+
+  std::cout << "result = "
+            << "(" << result.a0 << ", " << static_cast<int>(result.a1) << ")"
+            << "\n";
+
+  CHECK_EQ(a0, result.a0);
+  CHECK_EQ(a1, result.a1);
+
+  // Pass argument that will make the Dart callback throw.
+  a0 = 42;
+
+  result = f(a0, a1);
+
+  CHECK_EQ(0, result.a0);
+  CHECK_EQ(0, result.a1);
+
+  // Pass argument that will make the Dart callback return null.
+  a0 = 84;
+
+  result = f(a0, a1);
+
+  CHECK_EQ(0, result.a0);
+  CHECK_EQ(0, result.a1);
+
+  return 0;
+}
+
+// Used for testing structs by value.
+// Return value in FPU registers, but does not use all registers on arm hardfp
+// and arm64.
+DART_EXPORT intptr_t TestReturnStruct12BytesHomogeneousFloat(
+    // NOLINTNEXTLINE(whitespace/parens)
+    Struct12BytesHomogeneousFloat (*f)(float a0, float a1, float a2)) {
+  float a0;
+  float a1;
+  float a2;
+
+  a0 = -1.0;
+  a1 = 2.0;
+  a2 = -3.0;
+
+  std::cout << "Calling TestReturnStruct12BytesHomogeneousFloat("
+            << "(" << a0 << ", " << a1 << ", " << a2 << ")"
+            << ")\n";
+
+  Struct12BytesHomogeneousFloat result = f(a0, a1, a2);
+
+  std::cout << "result = "
+            << "(" << result.a0 << ", " << result.a1 << ", " << result.a2 << ")"
+            << "\n";
+
+  CHECK_APPROX(a0, result.a0);
+  CHECK_APPROX(a1, result.a1);
+  CHECK_APPROX(a2, result.a2);
+
+  // Pass argument that will make the Dart callback throw.
+  a0 = 42;
+
+  result = f(a0, a1, a2);
+
+  CHECK_APPROX(0.0, result.a0);
+  CHECK_APPROX(0.0, result.a1);
+  CHECK_APPROX(0.0, result.a2);
+
+  // Pass argument that will make the Dart callback return null.
+  a0 = 84;
+
+  result = f(a0, a1, a2);
+
+  CHECK_APPROX(0.0, result.a0);
+  CHECK_APPROX(0.0, result.a1);
+  CHECK_APPROX(0.0, result.a2);
+
+  return 0;
+}
+
+// Used for testing structs by value.
+// Return value in FPU registers on arm hardfp and arm64.
+DART_EXPORT intptr_t TestReturnStruct16BytesHomogeneousFloat(
+    // NOLINTNEXTLINE(whitespace/parens)
+    Struct16BytesHomogeneousFloat (
+        *f)(float a0, float a1, float a2, float a3)) {
+  float a0;
+  float a1;
+  float a2;
+  float a3;
+
+  a0 = -1.0;
+  a1 = 2.0;
+  a2 = -3.0;
+  a3 = 4.0;
+
+  std::cout << "Calling TestReturnStruct16BytesHomogeneousFloat("
+            << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ")"
+            << ")\n";
+
+  Struct16BytesHomogeneousFloat result = f(a0, a1, a2, a3);
+
+  std::cout << "result = "
+            << "(" << result.a0 << ", " << result.a1 << ", " << result.a2
+            << ", " << result.a3 << ")"
+            << "\n";
+
+  CHECK_APPROX(a0, result.a0);
+  CHECK_APPROX(a1, result.a1);
+  CHECK_APPROX(a2, result.a2);
+  CHECK_APPROX(a3, result.a3);
+
+  // Pass argument that will make the Dart callback throw.
+  a0 = 42;
+
+  result = f(a0, a1, a2, a3);
+
+  CHECK_APPROX(0.0, result.a0);
+  CHECK_APPROX(0.0, result.a1);
+  CHECK_APPROX(0.0, result.a2);
+  CHECK_APPROX(0.0, result.a3);
+
+  // Pass argument that will make the Dart callback return null.
+  a0 = 84;
+
+  result = f(a0, a1, a2, a3);
+
+  CHECK_APPROX(0.0, result.a0);
+  CHECK_APPROX(0.0, result.a1);
+  CHECK_APPROX(0.0, result.a2);
+  CHECK_APPROX(0.0, result.a3);
+
+  return 0;
+}
+
+// Used for testing structs by value.
+// Return value split over FP and integer register in x64.
+DART_EXPORT intptr_t TestReturnStruct16BytesMixed(
+    // NOLINTNEXTLINE(whitespace/parens)
+    Struct16BytesMixed (*f)(double a0, int64_t a1)) {
+  double a0;
+  int64_t a1;
+
+  a0 = -1.0;
+  a1 = 2;
+
+  std::cout << "Calling TestReturnStruct16BytesMixed("
+            << "(" << a0 << ", " << a1 << ")"
+            << ")\n";
+
+  Struct16BytesMixed result = f(a0, a1);
+
+  std::cout << "result = "
+            << "(" << result.a0 << ", " << result.a1 << ")"
+            << "\n";
+
+  CHECK_APPROX(a0, result.a0);
+  CHECK_EQ(a1, result.a1);
+
+  // Pass argument that will make the Dart callback throw.
+  a0 = 42;
+
+  result = f(a0, a1);
+
+  CHECK_APPROX(0.0, result.a0);
+  CHECK_EQ(0, result.a1);
+
+  // Pass argument that will make the Dart callback return null.
+  a0 = 84;
+
+  result = f(a0, a1);
+
+  CHECK_APPROX(0.0, result.a0);
+  CHECK_EQ(0, result.a1);
+
+  return 0;
+}
+
+// Used for testing structs by value.
+// Return value split over FP and integer register in x64.
+// The integer register contains half float half int.
+DART_EXPORT intptr_t TestReturnStruct16BytesMixed2(
+    // NOLINTNEXTLINE(whitespace/parens)
+    Struct16BytesMixed2 (*f)(float a0, float a1, float a2, int32_t a3)) {
+  float a0;
+  float a1;
+  float a2;
+  int32_t a3;
+
+  a0 = -1.0;
+  a1 = 2.0;
+  a2 = -3.0;
+  a3 = 4;
+
+  std::cout << "Calling TestReturnStruct16BytesMixed2("
+            << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ")"
+            << ")\n";
+
+  Struct16BytesMixed2 result = f(a0, a1, a2, a3);
+
+  std::cout << "result = "
+            << "(" << result.a0 << ", " << result.a1 << ", " << result.a2
+            << ", " << result.a3 << ")"
+            << "\n";
+
+  CHECK_APPROX(a0, result.a0);
+  CHECK_APPROX(a1, result.a1);
+  CHECK_APPROX(a2, result.a2);
+  CHECK_EQ(a3, result.a3);
+
+  // Pass argument that will make the Dart callback throw.
+  a0 = 42;
+
+  result = f(a0, a1, a2, a3);
+
+  CHECK_APPROX(0.0, result.a0);
+  CHECK_APPROX(0.0, result.a1);
+  CHECK_APPROX(0.0, result.a2);
+  CHECK_EQ(0, result.a3);
+
+  // Pass argument that will make the Dart callback return null.
+  a0 = 84;
+
+  result = f(a0, a1, a2, a3);
+
+  CHECK_APPROX(0.0, result.a0);
+  CHECK_APPROX(0.0, result.a1);
+  CHECK_APPROX(0.0, result.a2);
+  CHECK_EQ(0, result.a3);
+
+  return 0;
+}
+
+// Used for testing structs by value.
+// Rerturn value returned in preallocated space passed by pointer on most ABIs.
+// Is non word size on purpose, to test that structs are rounded up to word size
+// on all ABIs.
+DART_EXPORT intptr_t TestReturnStruct17BytesInt(
+    // NOLINTNEXTLINE(whitespace/parens)
+    Struct17BytesInt (*f)(int64_t a0, int64_t a1, int8_t a2)) {
+  int64_t a0;
+  int64_t a1;
+  int8_t a2;
+
+  a0 = -1;
+  a1 = 2;
+  a2 = -3;
+
+  std::cout << "Calling TestReturnStruct17BytesInt("
+            << "(" << a0 << ", " << a1 << ", " << static_cast<int>(a2) << ")"
+            << ")\n";
+
+  Struct17BytesInt result = f(a0, a1, a2);
+
+  std::cout << "result = "
+            << "(" << result.a0 << ", " << result.a1 << ", "
+            << static_cast<int>(result.a2) << ")"
+            << "\n";
+
+  CHECK_EQ(a0, result.a0);
+  CHECK_EQ(a1, result.a1);
+  CHECK_EQ(a2, result.a2);
+
+  // Pass argument that will make the Dart callback throw.
+  a0 = 42;
+
+  result = f(a0, a1, a2);
+
+  CHECK_EQ(0, result.a0);
+  CHECK_EQ(0, result.a1);
+  CHECK_EQ(0, result.a2);
+
+  // Pass argument that will make the Dart callback return null.
+  a0 = 84;
+
+  result = f(a0, a1, a2);
+
+  CHECK_EQ(0, result.a0);
+  CHECK_EQ(0, result.a1);
+  CHECK_EQ(0, result.a2);
+
+  return 0;
+}
+
+// Used for testing structs by value.
+// The minimum alignment of this struct is only 1 byte based on its fields.
+// Test that the memory backing these structs is the right size and that
+// dart:ffi trampolines do not write outside this size.
+DART_EXPORT intptr_t TestReturnStruct19BytesHomogeneousUint8(
+    // NOLINTNEXTLINE(whitespace/parens)
+    Struct19BytesHomogeneousUint8 (*f)(uint8_t a0,
+                                       uint8_t a1,
+                                       uint8_t a2,
+                                       uint8_t a3,
+                                       uint8_t a4,
+                                       uint8_t a5,
+                                       uint8_t a6,
+                                       uint8_t a7,
+                                       uint8_t a8,
+                                       uint8_t a9,
+                                       uint8_t a10,
+                                       uint8_t a11,
+                                       uint8_t a12,
+                                       uint8_t a13,
+                                       uint8_t a14,
+                                       uint8_t a15,
+                                       uint8_t a16,
+                                       uint8_t a17,
+                                       uint8_t a18)) {
+  uint8_t a0;
+  uint8_t a1;
+  uint8_t a2;
+  uint8_t a3;
+  uint8_t a4;
+  uint8_t a5;
+  uint8_t a6;
+  uint8_t a7;
+  uint8_t a8;
+  uint8_t a9;
+  uint8_t a10;
+  uint8_t a11;
+  uint8_t a12;
+  uint8_t a13;
+  uint8_t a14;
+  uint8_t a15;
+  uint8_t a16;
+  uint8_t a17;
+  uint8_t a18;
+
+  a0 = 1;
+  a1 = 2;
+  a2 = 3;
+  a3 = 4;
+  a4 = 5;
+  a5 = 6;
+  a6 = 7;
+  a7 = 8;
+  a8 = 9;
+  a9 = 10;
+  a10 = 11;
+  a11 = 12;
+  a12 = 13;
+  a13 = 14;
+  a14 = 15;
+  a15 = 16;
+  a16 = 17;
+  a17 = 18;
+  a18 = 19;
+
+  std::cout << "Calling TestReturnStruct19BytesHomogeneousUint8("
+            << "(" << static_cast<int>(a0) << ", " << static_cast<int>(a1)
+            << ", " << static_cast<int>(a2) << ", " << static_cast<int>(a3)
+            << ", " << static_cast<int>(a4) << ", " << static_cast<int>(a5)
+            << ", " << static_cast<int>(a6) << ", " << static_cast<int>(a7)
+            << ", " << static_cast<int>(a8) << ", " << static_cast<int>(a9)
+            << ", " << static_cast<int>(a10) << ", " << static_cast<int>(a11)
+            << ", " << static_cast<int>(a12) << ", " << static_cast<int>(a13)
+            << ", " << static_cast<int>(a14) << ", " << static_cast<int>(a15)
+            << ", " << static_cast<int>(a16) << ", " << static_cast<int>(a17)
+            << ", " << static_cast<int>(a18) << ")"
+            << ")\n";
+
+  Struct19BytesHomogeneousUint8 result =
+      f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15,
+        a16, a17, a18);
+
+  std::cout << "result = "
+            << "(" << static_cast<int>(result.a0) << ", "
+            << static_cast<int>(result.a1) << ", "
+            << static_cast<int>(result.a2) << ", "
+            << static_cast<int>(result.a3) << ", "
+            << static_cast<int>(result.a4) << ", "
+            << static_cast<int>(result.a5) << ", "
+            << static_cast<int>(result.a6) << ", "
+            << static_cast<int>(result.a7) << ", "
+            << static_cast<int>(result.a8) << ", "
+            << static_cast<int>(result.a9) << ", "
+            << static_cast<int>(result.a10) << ", "
+            << static_cast<int>(result.a11) << ", "
+            << static_cast<int>(result.a12) << ", "
+            << static_cast<int>(result.a13) << ", "
+            << static_cast<int>(result.a14) << ", "
+            << static_cast<int>(result.a15) << ", "
+            << static_cast<int>(result.a16) << ", "
+            << static_cast<int>(result.a17) << ", "
+            << static_cast<int>(result.a18) << ")"
+            << "\n";
+
+  CHECK_EQ(a0, result.a0);
+  CHECK_EQ(a1, result.a1);
+  CHECK_EQ(a2, result.a2);
+  CHECK_EQ(a3, result.a3);
+  CHECK_EQ(a4, result.a4);
+  CHECK_EQ(a5, result.a5);
+  CHECK_EQ(a6, result.a6);
+  CHECK_EQ(a7, result.a7);
+  CHECK_EQ(a8, result.a8);
+  CHECK_EQ(a9, result.a9);
+  CHECK_EQ(a10, result.a10);
+  CHECK_EQ(a11, result.a11);
+  CHECK_EQ(a12, result.a12);
+  CHECK_EQ(a13, result.a13);
+  CHECK_EQ(a14, result.a14);
+  CHECK_EQ(a15, result.a15);
+  CHECK_EQ(a16, result.a16);
+  CHECK_EQ(a17, result.a17);
+  CHECK_EQ(a18, result.a18);
+
+  // Pass argument that will make the Dart callback throw.
+  a0 = 42;
+
+  result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14,
+             a15, a16, a17, a18);
+
+  CHECK_EQ(0, result.a0);
+  CHECK_EQ(0, result.a1);
+  CHECK_EQ(0, result.a2);
+  CHECK_EQ(0, result.a3);
+  CHECK_EQ(0, result.a4);
+  CHECK_EQ(0, result.a5);
+  CHECK_EQ(0, result.a6);
+  CHECK_EQ(0, result.a7);
+  CHECK_EQ(0, result.a8);
+  CHECK_EQ(0, result.a9);
+  CHECK_EQ(0, result.a10);
+  CHECK_EQ(0, result.a11);
+  CHECK_EQ(0, result.a12);
+  CHECK_EQ(0, result.a13);
+  CHECK_EQ(0, result.a14);
+  CHECK_EQ(0, result.a15);
+  CHECK_EQ(0, result.a16);
+  CHECK_EQ(0, result.a17);
+  CHECK_EQ(0, result.a18);
+
+  // Pass argument that will make the Dart callback return null.
+  a0 = 84;
+
+  result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14,
+             a15, a16, a17, a18);
+
+  CHECK_EQ(0, result.a0);
+  CHECK_EQ(0, result.a1);
+  CHECK_EQ(0, result.a2);
+  CHECK_EQ(0, result.a3);
+  CHECK_EQ(0, result.a4);
+  CHECK_EQ(0, result.a5);
+  CHECK_EQ(0, result.a6);
+  CHECK_EQ(0, result.a7);
+  CHECK_EQ(0, result.a8);
+  CHECK_EQ(0, result.a9);
+  CHECK_EQ(0, result.a10);
+  CHECK_EQ(0, result.a11);
+  CHECK_EQ(0, result.a12);
+  CHECK_EQ(0, result.a13);
+  CHECK_EQ(0, result.a14);
+  CHECK_EQ(0, result.a15);
+  CHECK_EQ(0, result.a16);
+  CHECK_EQ(0, result.a17);
+  CHECK_EQ(0, result.a18);
+
+  return 0;
+}
+
+// Used for testing structs by value.
+// Return value too big to go in cpu registers on arm64.
+DART_EXPORT intptr_t TestReturnStruct20BytesHomogeneousInt32(
+    // NOLINTNEXTLINE(whitespace/parens)
+    Struct20BytesHomogeneousInt32 (
+        *f)(int32_t a0, int32_t a1, int32_t a2, int32_t a3, int32_t a4)) {
+  int32_t a0;
+  int32_t a1;
+  int32_t a2;
+  int32_t a3;
+  int32_t a4;
+
+  a0 = -1;
+  a1 = 2;
+  a2 = -3;
+  a3 = 4;
+  a4 = -5;
+
+  std::cout << "Calling TestReturnStruct20BytesHomogeneousInt32("
+            << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ", " << a4
+            << ")"
+            << ")\n";
+
+  Struct20BytesHomogeneousInt32 result = f(a0, a1, a2, a3, a4);
+
+  std::cout << "result = "
+            << "(" << result.a0 << ", " << result.a1 << ", " << result.a2
+            << ", " << result.a3 << ", " << result.a4 << ")"
+            << "\n";
+
+  CHECK_EQ(a0, result.a0);
+  CHECK_EQ(a1, result.a1);
+  CHECK_EQ(a2, result.a2);
+  CHECK_EQ(a3, result.a3);
+  CHECK_EQ(a4, result.a4);
+
+  // Pass argument that will make the Dart callback throw.
+  a0 = 42;
+
+  result = f(a0, a1, a2, a3, a4);
+
+  CHECK_EQ(0, result.a0);
+  CHECK_EQ(0, result.a1);
+  CHECK_EQ(0, result.a2);
+  CHECK_EQ(0, result.a3);
+  CHECK_EQ(0, result.a4);
+
+  // Pass argument that will make the Dart callback return null.
+  a0 = 84;
+
+  result = f(a0, a1, a2, a3, a4);
+
+  CHECK_EQ(0, result.a0);
+  CHECK_EQ(0, result.a1);
+  CHECK_EQ(0, result.a2);
+  CHECK_EQ(0, result.a3);
+  CHECK_EQ(0, result.a4);
+
+  return 0;
+}
+
+// Used for testing structs by value.
+// Return value too big to go in FPU registers on x64, arm hardfp and arm64.
+DART_EXPORT intptr_t TestReturnStruct20BytesHomogeneousFloat(
+    // NOLINTNEXTLINE(whitespace/parens)
+    Struct20BytesHomogeneousFloat (
+        *f)(float a0, float a1, float a2, float a3, float a4)) {
+  float a0;
+  float a1;
+  float a2;
+  float a3;
+  float a4;
+
+  a0 = -1.0;
+  a1 = 2.0;
+  a2 = -3.0;
+  a3 = 4.0;
+  a4 = -5.0;
+
+  std::cout << "Calling TestReturnStruct20BytesHomogeneousFloat("
+            << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ", " << a4
+            << ")"
+            << ")\n";
+
+  Struct20BytesHomogeneousFloat result = f(a0, a1, a2, a3, a4);
+
+  std::cout << "result = "
+            << "(" << result.a0 << ", " << result.a1 << ", " << result.a2
+            << ", " << result.a3 << ", " << result.a4 << ")"
+            << "\n";
+
+  CHECK_APPROX(a0, result.a0);
+  CHECK_APPROX(a1, result.a1);
+  CHECK_APPROX(a2, result.a2);
+  CHECK_APPROX(a3, result.a3);
+  CHECK_APPROX(a4, result.a4);
+
+  // Pass argument that will make the Dart callback throw.
+  a0 = 42;
+
+  result = f(a0, a1, a2, a3, a4);
+
+  CHECK_APPROX(0.0, result.a0);
+  CHECK_APPROX(0.0, result.a1);
+  CHECK_APPROX(0.0, result.a2);
+  CHECK_APPROX(0.0, result.a3);
+  CHECK_APPROX(0.0, result.a4);
+
+  // Pass argument that will make the Dart callback return null.
+  a0 = 84;
+
+  result = f(a0, a1, a2, a3, a4);
+
+  CHECK_APPROX(0.0, result.a0);
+  CHECK_APPROX(0.0, result.a1);
+  CHECK_APPROX(0.0, result.a2);
+  CHECK_APPROX(0.0, result.a3);
+  CHECK_APPROX(0.0, result.a4);
+
+  return 0;
+}
+
+// Used for testing structs by value.
+// Return value in FPU registers on arm64.
+DART_EXPORT intptr_t TestReturnStruct32BytesHomogeneousDouble(
+    // NOLINTNEXTLINE(whitespace/parens)
+    Struct32BytesHomogeneousDouble (
+        *f)(double a0, double a1, double a2, double a3)) {
+  double a0;
+  double a1;
+  double a2;
+  double a3;
+
+  a0 = -1.0;
+  a1 = 2.0;
+  a2 = -3.0;
+  a3 = 4.0;
+
+  std::cout << "Calling TestReturnStruct32BytesHomogeneousDouble("
+            << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ")"
+            << ")\n";
+
+  Struct32BytesHomogeneousDouble result = f(a0, a1, a2, a3);
+
+  std::cout << "result = "
+            << "(" << result.a0 << ", " << result.a1 << ", " << result.a2
+            << ", " << result.a3 << ")"
+            << "\n";
+
+  CHECK_APPROX(a0, result.a0);
+  CHECK_APPROX(a1, result.a1);
+  CHECK_APPROX(a2, result.a2);
+  CHECK_APPROX(a3, result.a3);
+
+  // Pass argument that will make the Dart callback throw.
+  a0 = 42;
+
+  result = f(a0, a1, a2, a3);
+
+  CHECK_APPROX(0.0, result.a0);
+  CHECK_APPROX(0.0, result.a1);
+  CHECK_APPROX(0.0, result.a2);
+  CHECK_APPROX(0.0, result.a3);
+
+  // Pass argument that will make the Dart callback return null.
+  a0 = 84;
+
+  result = f(a0, a1, a2, a3);
+
+  CHECK_APPROX(0.0, result.a0);
+  CHECK_APPROX(0.0, result.a1);
+  CHECK_APPROX(0.0, result.a2);
+  CHECK_APPROX(0.0, result.a3);
+
+  return 0;
+}
+
+// Used for testing structs by value.
+// Return value too big to go in FPU registers on arm64.
+DART_EXPORT intptr_t TestReturnStruct40BytesHomogeneousDouble(
+    // NOLINTNEXTLINE(whitespace/parens)
+    Struct40BytesHomogeneousDouble (
+        *f)(double a0, double a1, double a2, double a3, double a4)) {
+  double a0;
+  double a1;
+  double a2;
+  double a3;
+  double a4;
+
+  a0 = -1.0;
+  a1 = 2.0;
+  a2 = -3.0;
+  a3 = 4.0;
+  a4 = -5.0;
+
+  std::cout << "Calling TestReturnStruct40BytesHomogeneousDouble("
+            << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ", " << a4
+            << ")"
+            << ")\n";
+
+  Struct40BytesHomogeneousDouble result = f(a0, a1, a2, a3, a4);
+
+  std::cout << "result = "
+            << "(" << result.a0 << ", " << result.a1 << ", " << result.a2
+            << ", " << result.a3 << ", " << result.a4 << ")"
+            << "\n";
+
+  CHECK_APPROX(a0, result.a0);
+  CHECK_APPROX(a1, result.a1);
+  CHECK_APPROX(a2, result.a2);
+  CHECK_APPROX(a3, result.a3);
+  CHECK_APPROX(a4, result.a4);
+
+  // Pass argument that will make the Dart callback throw.
+  a0 = 42;
+
+  result = f(a0, a1, a2, a3, a4);
+
+  CHECK_APPROX(0.0, result.a0);
+  CHECK_APPROX(0.0, result.a1);
+  CHECK_APPROX(0.0, result.a2);
+  CHECK_APPROX(0.0, result.a3);
+  CHECK_APPROX(0.0, result.a4);
+
+  // Pass argument that will make the Dart callback return null.
+  a0 = 84;
+
+  result = f(a0, a1, a2, a3, a4);
+
+  CHECK_APPROX(0.0, result.a0);
+  CHECK_APPROX(0.0, result.a1);
+  CHECK_APPROX(0.0, result.a2);
+  CHECK_APPROX(0.0, result.a3);
+  CHECK_APPROX(0.0, result.a4);
+
+  return 0;
+}
+
+// Used for testing structs by value.
+// Test 1kb struct.
+DART_EXPORT intptr_t TestReturnStruct1024BytesHomogeneousUint64(
+    // NOLINTNEXTLINE(whitespace/parens)
+    Struct1024BytesHomogeneousUint64 (*f)(uint64_t a0,
+                                          uint64_t a1,
+                                          uint64_t a2,
+                                          uint64_t a3,
+                                          uint64_t a4,
+                                          uint64_t a5,
+                                          uint64_t a6,
+                                          uint64_t a7,
+                                          uint64_t a8,
+                                          uint64_t a9,
+                                          uint64_t a10,
+                                          uint64_t a11,
+                                          uint64_t a12,
+                                          uint64_t a13,
+                                          uint64_t a14,
+                                          uint64_t a15,
+                                          uint64_t a16,
+                                          uint64_t a17,
+                                          uint64_t a18,
+                                          uint64_t a19,
+                                          uint64_t a20,
+                                          uint64_t a21,
+                                          uint64_t a22,
+                                          uint64_t a23,
+                                          uint64_t a24,
+                                          uint64_t a25,
+                                          uint64_t a26,
+                                          uint64_t a27,
+                                          uint64_t a28,
+                                          uint64_t a29,
+                                          uint64_t a30,
+                                          uint64_t a31,
+                                          uint64_t a32,
+                                          uint64_t a33,
+                                          uint64_t a34,
+                                          uint64_t a35,
+                                          uint64_t a36,
+                                          uint64_t a37,
+                                          uint64_t a38,
+                                          uint64_t a39,
+                                          uint64_t a40,
+                                          uint64_t a41,
+                                          uint64_t a42,
+                                          uint64_t a43,
+                                          uint64_t a44,
+                                          uint64_t a45,
+                                          uint64_t a46,
+                                          uint64_t a47,
+                                          uint64_t a48,
+                                          uint64_t a49,
+                                          uint64_t a50,
+                                          uint64_t a51,
+                                          uint64_t a52,
+                                          uint64_t a53,
+                                          uint64_t a54,
+                                          uint64_t a55,
+                                          uint64_t a56,
+                                          uint64_t a57,
+                                          uint64_t a58,
+                                          uint64_t a59,
+                                          uint64_t a60,
+                                          uint64_t a61,
+                                          uint64_t a62,
+                                          uint64_t a63,
+                                          uint64_t a64,
+                                          uint64_t a65,
+                                          uint64_t a66,
+                                          uint64_t a67,
+                                          uint64_t a68,
+                                          uint64_t a69,
+                                          uint64_t a70,
+                                          uint64_t a71,
+                                          uint64_t a72,
+                                          uint64_t a73,
+                                          uint64_t a74,
+                                          uint64_t a75,
+                                          uint64_t a76,
+                                          uint64_t a77,
+                                          uint64_t a78,
+                                          uint64_t a79,
+                                          uint64_t a80,
+                                          uint64_t a81,
+                                          uint64_t a82,
+                                          uint64_t a83,
+                                          uint64_t a84,
+                                          uint64_t a85,
+                                          uint64_t a86,
+                                          uint64_t a87,
+                                          uint64_t a88,
+                                          uint64_t a89,
+                                          uint64_t a90,
+                                          uint64_t a91,
+                                          uint64_t a92,
+                                          uint64_t a93,
+                                          uint64_t a94,
+                                          uint64_t a95,
+                                          uint64_t a96,
+                                          uint64_t a97,
+                                          uint64_t a98,
+                                          uint64_t a99,
+                                          uint64_t a100,
+                                          uint64_t a101,
+                                          uint64_t a102,
+                                          uint64_t a103,
+                                          uint64_t a104,
+                                          uint64_t a105,
+                                          uint64_t a106,
+                                          uint64_t a107,
+                                          uint64_t a108,
+                                          uint64_t a109,
+                                          uint64_t a110,
+                                          uint64_t a111,
+                                          uint64_t a112,
+                                          uint64_t a113,
+                                          uint64_t a114,
+                                          uint64_t a115,
+                                          uint64_t a116,
+                                          uint64_t a117,
+                                          uint64_t a118,
+                                          uint64_t a119,
+                                          uint64_t a120,
+                                          uint64_t a121,
+                                          uint64_t a122,
+                                          uint64_t a123,
+                                          uint64_t a124,
+                                          uint64_t a125,
+                                          uint64_t a126,
+                                          uint64_t a127)) {
+  uint64_t a0;
+  uint64_t a1;
+  uint64_t a2;
+  uint64_t a3;
+  uint64_t a4;
+  uint64_t a5;
+  uint64_t a6;
+  uint64_t a7;
+  uint64_t a8;
+  uint64_t a9;
+  uint64_t a10;
+  uint64_t a11;
+  uint64_t a12;
+  uint64_t a13;
+  uint64_t a14;
+  uint64_t a15;
+  uint64_t a16;
+  uint64_t a17;
+  uint64_t a18;
+  uint64_t a19;
+  uint64_t a20;
+  uint64_t a21;
+  uint64_t a22;
+  uint64_t a23;
+  uint64_t a24;
+  uint64_t a25;
+  uint64_t a26;
+  uint64_t a27;
+  uint64_t a28;
+  uint64_t a29;
+  uint64_t a30;
+  uint64_t a31;
+  uint64_t a32;
+  uint64_t a33;
+  uint64_t a34;
+  uint64_t a35;
+  uint64_t a36;
+  uint64_t a37;
+  uint64_t a38;
+  uint64_t a39;
+  uint64_t a40;
+  uint64_t a41;
+  uint64_t a42;
+  uint64_t a43;
+  uint64_t a44;
+  uint64_t a45;
+  uint64_t a46;
+  uint64_t a47;
+  uint64_t a48;
+  uint64_t a49;
+  uint64_t a50;
+  uint64_t a51;
+  uint64_t a52;
+  uint64_t a53;
+  uint64_t a54;
+  uint64_t a55;
+  uint64_t a56;
+  uint64_t a57;
+  uint64_t a58;
+  uint64_t a59;
+  uint64_t a60;
+  uint64_t a61;
+  uint64_t a62;
+  uint64_t a63;
+  uint64_t a64;
+  uint64_t a65;
+  uint64_t a66;
+  uint64_t a67;
+  uint64_t a68;
+  uint64_t a69;
+  uint64_t a70;
+  uint64_t a71;
+  uint64_t a72;
+  uint64_t a73;
+  uint64_t a74;
+  uint64_t a75;
+  uint64_t a76;
+  uint64_t a77;
+  uint64_t a78;
+  uint64_t a79;
+  uint64_t a80;
+  uint64_t a81;
+  uint64_t a82;
+  uint64_t a83;
+  uint64_t a84;
+  uint64_t a85;
+  uint64_t a86;
+  uint64_t a87;
+  uint64_t a88;
+  uint64_t a89;
+  uint64_t a90;
+  uint64_t a91;
+  uint64_t a92;
+  uint64_t a93;
+  uint64_t a94;
+  uint64_t a95;
+  uint64_t a96;
+  uint64_t a97;
+  uint64_t a98;
+  uint64_t a99;
+  uint64_t a100;
+  uint64_t a101;
+  uint64_t a102;
+  uint64_t a103;
+  uint64_t a104;
+  uint64_t a105;
+  uint64_t a106;
+  uint64_t a107;
+  uint64_t a108;
+  uint64_t a109;
+  uint64_t a110;
+  uint64_t a111;
+  uint64_t a112;
+  uint64_t a113;
+  uint64_t a114;
+  uint64_t a115;
+  uint64_t a116;
+  uint64_t a117;
+  uint64_t a118;
+  uint64_t a119;
+  uint64_t a120;
+  uint64_t a121;
+  uint64_t a122;
+  uint64_t a123;
+  uint64_t a124;
+  uint64_t a125;
+  uint64_t a126;
+  uint64_t a127;
+
+  a0 = 1;
+  a1 = 2;
+  a2 = 3;
+  a3 = 4;
+  a4 = 5;
+  a5 = 6;
+  a6 = 7;
+  a7 = 8;
+  a8 = 9;
+  a9 = 10;
+  a10 = 11;
+  a11 = 12;
+  a12 = 13;
+  a13 = 14;
+  a14 = 15;
+  a15 = 16;
+  a16 = 17;
+  a17 = 18;
+  a18 = 19;
+  a19 = 20;
+  a20 = 21;
+  a21 = 22;
+  a22 = 23;
+  a23 = 24;
+  a24 = 25;
+  a25 = 26;
+  a26 = 27;
+  a27 = 28;
+  a28 = 29;
+  a29 = 30;
+  a30 = 31;
+  a31 = 32;
+  a32 = 33;
+  a33 = 34;
+  a34 = 35;
+  a35 = 36;
+  a36 = 37;
+  a37 = 38;
+  a38 = 39;
+  a39 = 40;
+  a40 = 41;
+  a41 = 42;
+  a42 = 43;
+  a43 = 44;
+  a44 = 45;
+  a45 = 46;
+  a46 = 47;
+  a47 = 48;
+  a48 = 49;
+  a49 = 50;
+  a50 = 51;
+  a51 = 52;
+  a52 = 53;
+  a53 = 54;
+  a54 = 55;
+  a55 = 56;
+  a56 = 57;
+  a57 = 58;
+  a58 = 59;
+  a59 = 60;
+  a60 = 61;
+  a61 = 62;
+  a62 = 63;
+  a63 = 64;
+  a64 = 65;
+  a65 = 66;
+  a66 = 67;
+  a67 = 68;
+  a68 = 69;
+  a69 = 70;
+  a70 = 71;
+  a71 = 72;
+  a72 = 73;
+  a73 = 74;
+  a74 = 75;
+  a75 = 76;
+  a76 = 77;
+  a77 = 78;
+  a78 = 79;
+  a79 = 80;
+  a80 = 81;
+  a81 = 82;
+  a82 = 83;
+  a83 = 84;
+  a84 = 85;
+  a85 = 86;
+  a86 = 87;
+  a87 = 88;
+  a88 = 89;
+  a89 = 90;
+  a90 = 91;
+  a91 = 92;
+  a92 = 93;
+  a93 = 94;
+  a94 = 95;
+  a95 = 96;
+  a96 = 97;
+  a97 = 98;
+  a98 = 99;
+  a99 = 100;
+  a100 = 101;
+  a101 = 102;
+  a102 = 103;
+  a103 = 104;
+  a104 = 105;
+  a105 = 106;
+  a106 = 107;
+  a107 = 108;
+  a108 = 109;
+  a109 = 110;
+  a110 = 111;
+  a111 = 112;
+  a112 = 113;
+  a113 = 114;
+  a114 = 115;
+  a115 = 116;
+  a116 = 117;
+  a117 = 118;
+  a118 = 119;
+  a119 = 120;
+  a120 = 121;
+  a121 = 122;
+  a122 = 123;
+  a123 = 124;
+  a124 = 125;
+  a125 = 126;
+  a126 = 127;
+  a127 = 128;
+
+  std::cout << "Calling TestReturnStruct1024BytesHomogeneousUint64("
+            << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ", " << a4
+            << ", " << a5 << ", " << a6 << ", " << a7 << ", " << a8 << ", "
+            << a9 << ", " << a10 << ", " << a11 << ", " << a12 << ", " << a13
+            << ", " << a14 << ", " << a15 << ", " << a16 << ", " << a17 << ", "
+            << a18 << ", " << a19 << ", " << a20 << ", " << a21 << ", " << a22
+            << ", " << a23 << ", " << a24 << ", " << a25 << ", " << a26 << ", "
+            << a27 << ", " << a28 << ", " << a29 << ", " << a30 << ", " << a31
+            << ", " << a32 << ", " << a33 << ", " << a34 << ", " << a35 << ", "
+            << a36 << ", " << a37 << ", " << a38 << ", " << a39 << ", " << a40
+            << ", " << a41 << ", " << a42 << ", " << a43 << ", " << a44 << ", "
+            << a45 << ", " << a46 << ", " << a47 << ", " << a48 << ", " << a49
+            << ", " << a50 << ", " << a51 << ", " << a52 << ", " << a53 << ", "
+            << a54 << ", " << a55 << ", " << a56 << ", " << a57 << ", " << a58
+            << ", " << a59 << ", " << a60 << ", " << a61 << ", " << a62 << ", "
+            << a63 << ", " << a64 << ", " << a65 << ", " << a66 << ", " << a67
+            << ", " << a68 << ", " << a69 << ", " << a70 << ", " << a71 << ", "
+            << a72 << ", " << a73 << ", " << a74 << ", " << a75 << ", " << a76
+            << ", " << a77 << ", " << a78 << ", " << a79 << ", " << a80 << ", "
+            << a81 << ", " << a82 << ", " << a83 << ", " << a84 << ", " << a85
+            << ", " << a86 << ", " << a87 << ", " << a88 << ", " << a89 << ", "
+            << a90 << ", " << a91 << ", " << a92 << ", " << a93 << ", " << a94
+            << ", " << a95 << ", " << a96 << ", " << a97 << ", " << a98 << ", "
+            << a99 << ", " << a100 << ", " << a101 << ", " << a102 << ", "
+            << a103 << ", " << a104 << ", " << a105 << ", " << a106 << ", "
+            << a107 << ", " << a108 << ", " << a109 << ", " << a110 << ", "
+            << a111 << ", " << a112 << ", " << a113 << ", " << a114 << ", "
+            << a115 << ", " << a116 << ", " << a117 << ", " << a118 << ", "
+            << a119 << ", " << a120 << ", " << a121 << ", " << a122 << ", "
+            << a123 << ", " << a124 << ", " << a125 << ", " << a126 << ", "
+            << a127 << ")"
+            << ")\n";
+
+  Struct1024BytesHomogeneousUint64 result = f(
+      a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16,
+      a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31,
+      a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, a45, a46,
+      a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, a59, a60, a61,
+      a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, a73, a74, a75, a76,
+      a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91,
+      a92, a93, a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104,
+      a105, a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116,
+      a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127);
+
+  std::cout << "result = "
+            << "(" << result.a0 << ", " << result.a1 << ", " << result.a2
+            << ", " << result.a3 << ", " << result.a4 << ", " << result.a5
+            << ", " << result.a6 << ", " << result.a7 << ", " << result.a8
+            << ", " << result.a9 << ", " << result.a10 << ", " << result.a11
+            << ", " << result.a12 << ", " << result.a13 << ", " << result.a14
+            << ", " << result.a15 << ", " << result.a16 << ", " << result.a17
+            << ", " << result.a18 << ", " << result.a19 << ", " << result.a20
+            << ", " << result.a21 << ", " << result.a22 << ", " << result.a23
+            << ", " << result.a24 << ", " << result.a25 << ", " << result.a26
+            << ", " << result.a27 << ", " << result.a28 << ", " << result.a29
+            << ", " << result.a30 << ", " << result.a31 << ", " << result.a32
+            << ", " << result.a33 << ", " << result.a34 << ", " << result.a35
+            << ", " << result.a36 << ", " << result.a37 << ", " << result.a38
+            << ", " << result.a39 << ", " << result.a40 << ", " << result.a41
+            << ", " << result.a42 << ", " << result.a43 << ", " << result.a44
+            << ", " << result.a45 << ", " << result.a46 << ", " << result.a47
+            << ", " << result.a48 << ", " << result.a49 << ", " << result.a50
+            << ", " << result.a51 << ", " << result.a52 << ", " << result.a53
+            << ", " << result.a54 << ", " << result.a55 << ", " << result.a56
+            << ", " << result.a57 << ", " << result.a58 << ", " << result.a59
+            << ", " << result.a60 << ", " << result.a61 << ", " << result.a62
+            << ", " << result.a63 << ", " << result.a64 << ", " << result.a65
+            << ", " << result.a66 << ", " << result.a67 << ", " << result.a68
+            << ", " << result.a69 << ", " << result.a70 << ", " << result.a71
+            << ", " << result.a72 << ", " << result.a73 << ", " << result.a74
+            << ", " << result.a75 << ", " << result.a76 << ", " << result.a77
+            << ", " << result.a78 << ", " << result.a79 << ", " << result.a80
+            << ", " << result.a81 << ", " << result.a82 << ", " << result.a83
+            << ", " << result.a84 << ", " << result.a85 << ", " << result.a86
+            << ", " << result.a87 << ", " << result.a88 << ", " << result.a89
+            << ", " << result.a90 << ", " << result.a91 << ", " << result.a92
+            << ", " << result.a93 << ", " << result.a94 << ", " << result.a95
+            << ", " << result.a96 << ", " << result.a97 << ", " << result.a98
+            << ", " << result.a99 << ", " << result.a100 << ", " << result.a101
+            << ", " << result.a102 << ", " << result.a103 << ", " << result.a104
+            << ", " << result.a105 << ", " << result.a106 << ", " << result.a107
+            << ", " << result.a108 << ", " << result.a109 << ", " << result.a110
+            << ", " << result.a111 << ", " << result.a112 << ", " << result.a113
+            << ", " << result.a114 << ", " << result.a115 << ", " << result.a116
+            << ", " << result.a117 << ", " << result.a118 << ", " << result.a119
+            << ", " << result.a120 << ", " << result.a121 << ", " << result.a122
+            << ", " << result.a123 << ", " << result.a124 << ", " << result.a125
+            << ", " << result.a126 << ", " << result.a127 << ")"
+            << "\n";
+
+  CHECK_EQ(a0, result.a0);
+  CHECK_EQ(a1, result.a1);
+  CHECK_EQ(a2, result.a2);
+  CHECK_EQ(a3, result.a3);
+  CHECK_EQ(a4, result.a4);
+  CHECK_EQ(a5, result.a5);
+  CHECK_EQ(a6, result.a6);
+  CHECK_EQ(a7, result.a7);
+  CHECK_EQ(a8, result.a8);
+  CHECK_EQ(a9, result.a9);
+  CHECK_EQ(a10, result.a10);
+  CHECK_EQ(a11, result.a11);
+  CHECK_EQ(a12, result.a12);
+  CHECK_EQ(a13, result.a13);
+  CHECK_EQ(a14, result.a14);
+  CHECK_EQ(a15, result.a15);
+  CHECK_EQ(a16, result.a16);
+  CHECK_EQ(a17, result.a17);
+  CHECK_EQ(a18, result.a18);
+  CHECK_EQ(a19, result.a19);
+  CHECK_EQ(a20, result.a20);
+  CHECK_EQ(a21, result.a21);
+  CHECK_EQ(a22, result.a22);
+  CHECK_EQ(a23, result.a23);
+  CHECK_EQ(a24, result.a24);
+  CHECK_EQ(a25, result.a25);
+  CHECK_EQ(a26, result.a26);
+  CHECK_EQ(a27, result.a27);
+  CHECK_EQ(a28, result.a28);
+  CHECK_EQ(a29, result.a29);
+  CHECK_EQ(a30, result.a30);
+  CHECK_EQ(a31, result.a31);
+  CHECK_EQ(a32, result.a32);
+  CHECK_EQ(a33, result.a33);
+  CHECK_EQ(a34, result.a34);
+  CHECK_EQ(a35, result.a35);
+  CHECK_EQ(a36, result.a36);
+  CHECK_EQ(a37, result.a37);
+  CHECK_EQ(a38, result.a38);
+  CHECK_EQ(a39, result.a39);
+  CHECK_EQ(a40, result.a40);
+  CHECK_EQ(a41, result.a41);
+  CHECK_EQ(a42, result.a42);
+  CHECK_EQ(a43, result.a43);
+  CHECK_EQ(a44, result.a44);
+  CHECK_EQ(a45, result.a45);
+  CHECK_EQ(a46, result.a46);
+  CHECK_EQ(a47, result.a47);
+  CHECK_EQ(a48, result.a48);
+  CHECK_EQ(a49, result.a49);
+  CHECK_EQ(a50, result.a50);
+  CHECK_EQ(a51, result.a51);
+  CHECK_EQ(a52, result.a52);
+  CHECK_EQ(a53, result.a53);
+  CHECK_EQ(a54, result.a54);
+  CHECK_EQ(a55, result.a55);
+  CHECK_EQ(a56, result.a56);
+  CHECK_EQ(a57, result.a57);
+  CHECK_EQ(a58, result.a58);
+  CHECK_EQ(a59, result.a59);
+  CHECK_EQ(a60, result.a60);
+  CHECK_EQ(a61, result.a61);
+  CHECK_EQ(a62, result.a62);
+  CHECK_EQ(a63, result.a63);
+  CHECK_EQ(a64, result.a64);
+  CHECK_EQ(a65, result.a65);
+  CHECK_EQ(a66, result.a66);
+  CHECK_EQ(a67, result.a67);
+  CHECK_EQ(a68, result.a68);
+  CHECK_EQ(a69, result.a69);
+  CHECK_EQ(a70, result.a70);
+  CHECK_EQ(a71, result.a71);
+  CHECK_EQ(a72, result.a72);
+  CHECK_EQ(a73, result.a73);
+  CHECK_EQ(a74, result.a74);
+  CHECK_EQ(a75, result.a75);
+  CHECK_EQ(a76, result.a76);
+  CHECK_EQ(a77, result.a77);
+  CHECK_EQ(a78, result.a78);
+  CHECK_EQ(a79, result.a79);
+  CHECK_EQ(a80, result.a80);
+  CHECK_EQ(a81, result.a81);
+  CHECK_EQ(a82, result.a82);
+  CHECK_EQ(a83, result.a83);
+  CHECK_EQ(a84, result.a84);
+  CHECK_EQ(a85, result.a85);
+  CHECK_EQ(a86, result.a86);
+  CHECK_EQ(a87, result.a87);
+  CHECK_EQ(a88, result.a88);
+  CHECK_EQ(a89, result.a89);
+  CHECK_EQ(a90, result.a90);
+  CHECK_EQ(a91, result.a91);
+  CHECK_EQ(a92, result.a92);
+  CHECK_EQ(a93, result.a93);
+  CHECK_EQ(a94, result.a94);
+  CHECK_EQ(a95, result.a95);
+  CHECK_EQ(a96, result.a96);
+  CHECK_EQ(a97, result.a97);
+  CHECK_EQ(a98, result.a98);
+  CHECK_EQ(a99, result.a99);
+  CHECK_EQ(a100, result.a100);
+  CHECK_EQ(a101, result.a101);
+  CHECK_EQ(a102, result.a102);
+  CHECK_EQ(a103, result.a103);
+  CHECK_EQ(a104, result.a104);
+  CHECK_EQ(a105, result.a105);
+  CHECK_EQ(a106, result.a106);
+  CHECK_EQ(a107, result.a107);
+  CHECK_EQ(a108, result.a108);
+  CHECK_EQ(a109, result.a109);
+  CHECK_EQ(a110, result.a110);
+  CHECK_EQ(a111, result.a111);
+  CHECK_EQ(a112, result.a112);
+  CHECK_EQ(a113, result.a113);
+  CHECK_EQ(a114, result.a114);
+  CHECK_EQ(a115, result.a115);
+  CHECK_EQ(a116, result.a116);
+  CHECK_EQ(a117, result.a117);
+  CHECK_EQ(a118, result.a118);
+  CHECK_EQ(a119, result.a119);
+  CHECK_EQ(a120, result.a120);
+  CHECK_EQ(a121, result.a121);
+  CHECK_EQ(a122, result.a122);
+  CHECK_EQ(a123, result.a123);
+  CHECK_EQ(a124, result.a124);
+  CHECK_EQ(a125, result.a125);
+  CHECK_EQ(a126, result.a126);
+  CHECK_EQ(a127, result.a127);
+
+  // Pass argument that will make the Dart callback throw.
+  a0 = 42;
+
+  result = f(
+      a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16,
+      a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31,
+      a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, a45, a46,
+      a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, a59, a60, a61,
+      a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, a73, a74, a75, a76,
+      a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91,
+      a92, a93, a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104,
+      a105, a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116,
+      a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127);
+
+  CHECK_EQ(0, result.a0);
+  CHECK_EQ(0, result.a1);
+  CHECK_EQ(0, result.a2);
+  CHECK_EQ(0, result.a3);
+  CHECK_EQ(0, result.a4);
+  CHECK_EQ(0, result.a5);
+  CHECK_EQ(0, result.a6);
+  CHECK_EQ(0, result.a7);
+  CHECK_EQ(0, result.a8);
+  CHECK_EQ(0, result.a9);
+  CHECK_EQ(0, result.a10);
+  CHECK_EQ(0, result.a11);
+  CHECK_EQ(0, result.a12);
+  CHECK_EQ(0, result.a13);
+  CHECK_EQ(0, result.a14);
+  CHECK_EQ(0, result.a15);
+  CHECK_EQ(0, result.a16);
+  CHECK_EQ(0, result.a17);
+  CHECK_EQ(0, result.a18);
+  CHECK_EQ(0, result.a19);
+  CHECK_EQ(0, result.a20);
+  CHECK_EQ(0, result.a21);
+  CHECK_EQ(0, result.a22);
+  CHECK_EQ(0, result.a23);
+  CHECK_EQ(0, result.a24);
+  CHECK_EQ(0, result.a25);
+  CHECK_EQ(0, result.a26);
+  CHECK_EQ(0, result.a27);
+  CHECK_EQ(0, result.a28);
+  CHECK_EQ(0, result.a29);
+  CHECK_EQ(0, result.a30);
+  CHECK_EQ(0, result.a31);
+  CHECK_EQ(0, result.a32);
+  CHECK_EQ(0, result.a33);
+  CHECK_EQ(0, result.a34);
+  CHECK_EQ(0, result.a35);
+  CHECK_EQ(0, result.a36);
+  CHECK_EQ(0, result.a37);
+  CHECK_EQ(0, result.a38);
+  CHECK_EQ(0, result.a39);
+  CHECK_EQ(0, result.a40);
+  CHECK_EQ(0, result.a41);
+  CHECK_EQ(0, result.a42);
+  CHECK_EQ(0, result.a43);
+  CHECK_EQ(0, result.a44);
+  CHECK_EQ(0, result.a45);
+  CHECK_EQ(0, result.a46);
+  CHECK_EQ(0, result.a47);
+  CHECK_EQ(0, result.a48);
+  CHECK_EQ(0, result.a49);
+  CHECK_EQ(0, result.a50);
+  CHECK_EQ(0, result.a51);
+  CHECK_EQ(0, result.a52);
+  CHECK_EQ(0, result.a53);
+  CHECK_EQ(0, result.a54);
+  CHECK_EQ(0, result.a55);
+  CHECK_EQ(0, result.a56);
+  CHECK_EQ(0, result.a57);
+  CHECK_EQ(0, result.a58);
+  CHECK_EQ(0, result.a59);
+  CHECK_EQ(0, result.a60);
+  CHECK_EQ(0, result.a61);
+  CHECK_EQ(0, result.a62);
+  CHECK_EQ(0, result.a63);
+  CHECK_EQ(0, result.a64);
+  CHECK_EQ(0, result.a65);
+  CHECK_EQ(0, result.a66);
+  CHECK_EQ(0, result.a67);
+  CHECK_EQ(0, result.a68);
+  CHECK_EQ(0, result.a69);
+  CHECK_EQ(0, result.a70);
+  CHECK_EQ(0, result.a71);
+  CHECK_EQ(0, result.a72);
+  CHECK_EQ(0, result.a73);
+  CHECK_EQ(0, result.a74);
+  CHECK_EQ(0, result.a75);
+  CHECK_EQ(0, result.a76);
+  CHECK_EQ(0, result.a77);
+  CHECK_EQ(0, result.a78);
+  CHECK_EQ(0, result.a79);
+  CHECK_EQ(0, result.a80);
+  CHECK_EQ(0, result.a81);
+  CHECK_EQ(0, result.a82);
+  CHECK_EQ(0, result.a83);
+  CHECK_EQ(0, result.a84);
+  CHECK_EQ(0, result.a85);
+  CHECK_EQ(0, result.a86);
+  CHECK_EQ(0, result.a87);
+  CHECK_EQ(0, result.a88);
+  CHECK_EQ(0, result.a89);
+  CHECK_EQ(0, result.a90);
+  CHECK_EQ(0, result.a91);
+  CHECK_EQ(0, result.a92);
+  CHECK_EQ(0, result.a93);
+  CHECK_EQ(0, result.a94);
+  CHECK_EQ(0, result.a95);
+  CHECK_EQ(0, result.a96);
+  CHECK_EQ(0, result.a97);
+  CHECK_EQ(0, result.a98);
+  CHECK_EQ(0, result.a99);
+  CHECK_EQ(0, result.a100);
+  CHECK_EQ(0, result.a101);
+  CHECK_EQ(0, result.a102);
+  CHECK_EQ(0, result.a103);
+  CHECK_EQ(0, result.a104);
+  CHECK_EQ(0, result.a105);
+  CHECK_EQ(0, result.a106);
+  CHECK_EQ(0, result.a107);
+  CHECK_EQ(0, result.a108);
+  CHECK_EQ(0, result.a109);
+  CHECK_EQ(0, result.a110);
+  CHECK_EQ(0, result.a111);
+  CHECK_EQ(0, result.a112);
+  CHECK_EQ(0, result.a113);
+  CHECK_EQ(0, result.a114);
+  CHECK_EQ(0, result.a115);
+  CHECK_EQ(0, result.a116);
+  CHECK_EQ(0, result.a117);
+  CHECK_EQ(0, result.a118);
+  CHECK_EQ(0, result.a119);
+  CHECK_EQ(0, result.a120);
+  CHECK_EQ(0, result.a121);
+  CHECK_EQ(0, result.a122);
+  CHECK_EQ(0, result.a123);
+  CHECK_EQ(0, result.a124);
+  CHECK_EQ(0, result.a125);
+  CHECK_EQ(0, result.a126);
+  CHECK_EQ(0, result.a127);
+
+  // Pass argument that will make the Dart callback return null.
+  a0 = 84;
+
+  result = f(
+      a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16,
+      a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31,
+      a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, a45, a46,
+      a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, a59, a60, a61,
+      a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, a73, a74, a75, a76,
+      a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91,
+      a92, a93, a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104,
+      a105, a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116,
+      a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127);
+
+  CHECK_EQ(0, result.a0);
+  CHECK_EQ(0, result.a1);
+  CHECK_EQ(0, result.a2);
+  CHECK_EQ(0, result.a3);
+  CHECK_EQ(0, result.a4);
+  CHECK_EQ(0, result.a5);
+  CHECK_EQ(0, result.a6);
+  CHECK_EQ(0, result.a7);
+  CHECK_EQ(0, result.a8);
+  CHECK_EQ(0, result.a9);
+  CHECK_EQ(0, result.a10);
+  CHECK_EQ(0, result.a11);
+  CHECK_EQ(0, result.a12);
+  CHECK_EQ(0, result.a13);
+  CHECK_EQ(0, result.a14);
+  CHECK_EQ(0, result.a15);
+  CHECK_EQ(0, result.a16);
+  CHECK_EQ(0, result.a17);
+  CHECK_EQ(0, result.a18);
+  CHECK_EQ(0, result.a19);
+  CHECK_EQ(0, result.a20);
+  CHECK_EQ(0, result.a21);
+  CHECK_EQ(0, result.a22);
+  CHECK_EQ(0, result.a23);
+  CHECK_EQ(0, result.a24);
+  CHECK_EQ(0, result.a25);
+  CHECK_EQ(0, result.a26);
+  CHECK_EQ(0, result.a27);
+  CHECK_EQ(0, result.a28);
+  CHECK_EQ(0, result.a29);
+  CHECK_EQ(0, result.a30);
+  CHECK_EQ(0, result.a31);
+  CHECK_EQ(0, result.a32);
+  CHECK_EQ(0, result.a33);
+  CHECK_EQ(0, result.a34);
+  CHECK_EQ(0, result.a35);
+  CHECK_EQ(0, result.a36);
+  CHECK_EQ(0, result.a37);
+  CHECK_EQ(0, result.a38);
+  CHECK_EQ(0, result.a39);
+  CHECK_EQ(0, result.a40);
+  CHECK_EQ(0, result.a41);
+  CHECK_EQ(0, result.a42);
+  CHECK_EQ(0, result.a43);
+  CHECK_EQ(0, result.a44);
+  CHECK_EQ(0, result.a45);
+  CHECK_EQ(0, result.a46);
+  CHECK_EQ(0, result.a47);
+  CHECK_EQ(0, result.a48);
+  CHECK_EQ(0, result.a49);
+  CHECK_EQ(0, result.a50);
+  CHECK_EQ(0, result.a51);
+  CHECK_EQ(0, result.a52);
+  CHECK_EQ(0, result.a53);
+  CHECK_EQ(0, result.a54);
+  CHECK_EQ(0, result.a55);
+  CHECK_EQ(0, result.a56);
+  CHECK_EQ(0, result.a57);
+  CHECK_EQ(0, result.a58);
+  CHECK_EQ(0, result.a59);
+  CHECK_EQ(0, result.a60);
+  CHECK_EQ(0, result.a61);
+  CHECK_EQ(0, result.a62);
+  CHECK_EQ(0, result.a63);
+  CHECK_EQ(0, result.a64);
+  CHECK_EQ(0, result.a65);
+  CHECK_EQ(0, result.a66);
+  CHECK_EQ(0, result.a67);
+  CHECK_EQ(0, result.a68);
+  CHECK_EQ(0, result.a69);
+  CHECK_EQ(0, result.a70);
+  CHECK_EQ(0, result.a71);
+  CHECK_EQ(0, result.a72);
+  CHECK_EQ(0, result.a73);
+  CHECK_EQ(0, result.a74);
+  CHECK_EQ(0, result.a75);
+  CHECK_EQ(0, result.a76);
+  CHECK_EQ(0, result.a77);
+  CHECK_EQ(0, result.a78);
+  CHECK_EQ(0, result.a79);
+  CHECK_EQ(0, result.a80);
+  CHECK_EQ(0, result.a81);
+  CHECK_EQ(0, result.a82);
+  CHECK_EQ(0, result.a83);
+  CHECK_EQ(0, result.a84);
+  CHECK_EQ(0, result.a85);
+  CHECK_EQ(0, result.a86);
+  CHECK_EQ(0, result.a87);
+  CHECK_EQ(0, result.a88);
+  CHECK_EQ(0, result.a89);
+  CHECK_EQ(0, result.a90);
+  CHECK_EQ(0, result.a91);
+  CHECK_EQ(0, result.a92);
+  CHECK_EQ(0, result.a93);
+  CHECK_EQ(0, result.a94);
+  CHECK_EQ(0, result.a95);
+  CHECK_EQ(0, result.a96);
+  CHECK_EQ(0, result.a97);
+  CHECK_EQ(0, result.a98);
+  CHECK_EQ(0, result.a99);
+  CHECK_EQ(0, result.a100);
+  CHECK_EQ(0, result.a101);
+  CHECK_EQ(0, result.a102);
+  CHECK_EQ(0, result.a103);
+  CHECK_EQ(0, result.a104);
+  CHECK_EQ(0, result.a105);
+  CHECK_EQ(0, result.a106);
+  CHECK_EQ(0, result.a107);
+  CHECK_EQ(0, result.a108);
+  CHECK_EQ(0, result.a109);
+  CHECK_EQ(0, result.a110);
+  CHECK_EQ(0, result.a111);
+  CHECK_EQ(0, result.a112);
+  CHECK_EQ(0, result.a113);
+  CHECK_EQ(0, result.a114);
+  CHECK_EQ(0, result.a115);
+  CHECK_EQ(0, result.a116);
+  CHECK_EQ(0, result.a117);
+  CHECK_EQ(0, result.a118);
+  CHECK_EQ(0, result.a119);
+  CHECK_EQ(0, result.a120);
+  CHECK_EQ(0, result.a121);
+  CHECK_EQ(0, result.a122);
+  CHECK_EQ(0, result.a123);
+  CHECK_EQ(0, result.a124);
+  CHECK_EQ(0, result.a125);
+  CHECK_EQ(0, result.a126);
+  CHECK_EQ(0, result.a127);
+
+  return 0;
+}
+
+// Used for testing structs by value.
+// Test that a struct passed in as argument can be returned.
+// Especially for ffi callbacks.
+// Struct is passed in int registers in most ABIs.
+DART_EXPORT intptr_t TestReturnStructArgumentStruct1ByteInt(
+    // NOLINTNEXTLINE(whitespace/parens)
+    Struct1ByteInt (*f)(Struct1ByteInt a0)) {
+  Struct1ByteInt a0;
+
+  a0.a0 = -1;
+
+  std::cout << "Calling TestReturnStructArgumentStruct1ByteInt("
+            << "((" << static_cast<int>(a0.a0) << "))"
+            << ")\n";
+
+  Struct1ByteInt result = f(a0);
+
+  std::cout << "result = "
+            << "(" << static_cast<int>(result.a0) << ")"
+            << "\n";
+
+  CHECK_EQ(a0.a0, result.a0);
+
+  // Pass argument that will make the Dart callback throw.
+  a0.a0 = 42;
+
+  result = f(a0);
+
+  CHECK_EQ(0, result.a0);
+
+  // Pass argument that will make the Dart callback return null.
+  a0.a0 = 84;
+
+  result = f(a0);
+
+  CHECK_EQ(0, result.a0);
+
+  return 0;
+}
+
+// Used for testing structs by value.
+// Test that a struct passed in as argument can be returned.
+// Especially for ffi callbacks.
+// Struct is passed on stack on all ABIs.
+DART_EXPORT intptr_t TestReturnStructArgumentInt32x8Struct1ByteInt(
+    // NOLINTNEXTLINE(whitespace/parens)
+    Struct1ByteInt (*f)(int32_t a0,
+                        int32_t a1,
+                        int32_t a2,
+                        int32_t a3,
+                        int32_t a4,
+                        int32_t a5,
+                        int32_t a6,
+                        int32_t a7,
+                        Struct1ByteInt a8)) {
+  int32_t a0;
+  int32_t a1;
+  int32_t a2;
+  int32_t a3;
+  int32_t a4;
+  int32_t a5;
+  int32_t a6;
+  int32_t a7;
+  Struct1ByteInt a8;
+
+  a0 = -1;
+  a1 = 2;
+  a2 = -3;
+  a3 = 4;
+  a4 = -5;
+  a5 = 6;
+  a6 = -7;
+  a7 = 8;
+  a8.a0 = -9;
+
+  std::cout << "Calling TestReturnStructArgumentInt32x8Struct1ByteInt("
+            << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ", " << a4
+            << ", " << a5 << ", " << a6 << ", " << a7 << ", ("
+            << static_cast<int>(a8.a0) << "))"
+            << ")\n";
+
+  Struct1ByteInt result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8);
+
+  std::cout << "result = "
+            << "(" << static_cast<int>(result.a0) << ")"
+            << "\n";
+
+  CHECK_EQ(a8.a0, result.a0);
+
+  // Pass argument that will make the Dart callback throw.
+  a0 = 42;
+
+  result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8);
+
+  CHECK_EQ(0, result.a0);
+
+  // Pass argument that will make the Dart callback return null.
+  a0 = 84;
+
+  result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8);
+
+  CHECK_EQ(0, result.a0);
+
+  return 0;
+}
+
+// Used for testing structs by value.
+// Test that a struct passed in as argument can be returned.
+// Especially for ffi callbacks.
+// Struct is passed in float registers in most ABIs.
+DART_EXPORT intptr_t TestReturnStructArgumentStruct8BytesHomogeneousFloat(
+    // NOLINTNEXTLINE(whitespace/parens)
+    Struct8BytesHomogeneousFloat (*f)(Struct8BytesHomogeneousFloat a0)) {
+  Struct8BytesHomogeneousFloat a0;
+
+  a0.a0 = -1.0;
+  a0.a1 = 2.0;
+
+  std::cout << "Calling TestReturnStructArgumentStruct8BytesHomogeneousFloat("
+            << "((" << a0.a0 << ", " << a0.a1 << "))"
+            << ")\n";
+
+  Struct8BytesHomogeneousFloat result = f(a0);
+
+  std::cout << "result = "
+            << "(" << result.a0 << ", " << result.a1 << ")"
+            << "\n";
+
+  CHECK_APPROX(a0.a0, result.a0);
+  CHECK_APPROX(a0.a1, result.a1);
+
+  // Pass argument that will make the Dart callback throw.
+  a0.a0 = 42;
+
+  result = f(a0);
+
+  CHECK_APPROX(0.0, result.a0);
+  CHECK_APPROX(0.0, result.a1);
+
+  // Pass argument that will make the Dart callback return null.
+  a0.a0 = 84;
+
+  result = f(a0);
+
+  CHECK_APPROX(0.0, result.a0);
+  CHECK_APPROX(0.0, result.a1);
+
+  return 0;
+}
+
+// Used for testing structs by value.
+// On arm64, both argument and return value are passed in by pointer.
+DART_EXPORT intptr_t TestReturnStructArgumentStruct20BytesHomogeneousInt32(
+    // NOLINTNEXTLINE(whitespace/parens)
+    Struct20BytesHomogeneousInt32 (*f)(Struct20BytesHomogeneousInt32 a0)) {
+  Struct20BytesHomogeneousInt32 a0;
+
+  a0.a0 = -1;
+  a0.a1 = 2;
+  a0.a2 = -3;
+  a0.a3 = 4;
+  a0.a4 = -5;
+
+  std::cout << "Calling TestReturnStructArgumentStruct20BytesHomogeneousInt32("
+            << "((" << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << ", " << a0.a3
+            << ", " << a0.a4 << "))"
+            << ")\n";
+
+  Struct20BytesHomogeneousInt32 result = f(a0);
+
+  std::cout << "result = "
+            << "(" << result.a0 << ", " << result.a1 << ", " << result.a2
+            << ", " << result.a3 << ", " << result.a4 << ")"
+            << "\n";
+
+  CHECK_EQ(a0.a0, result.a0);
+  CHECK_EQ(a0.a1, result.a1);
+  CHECK_EQ(a0.a2, result.a2);
+  CHECK_EQ(a0.a3, result.a3);
+  CHECK_EQ(a0.a4, result.a4);
+
+  // Pass argument that will make the Dart callback throw.
+  a0.a0 = 42;
+
+  result = f(a0);
+
+  CHECK_EQ(0, result.a0);
+  CHECK_EQ(0, result.a1);
+  CHECK_EQ(0, result.a2);
+  CHECK_EQ(0, result.a3);
+  CHECK_EQ(0, result.a4);
+
+  // Pass argument that will make the Dart callback return null.
+  a0.a0 = 84;
+
+  result = f(a0);
+
+  CHECK_EQ(0, result.a0);
+  CHECK_EQ(0, result.a1);
+  CHECK_EQ(0, result.a2);
+  CHECK_EQ(0, result.a3);
+  CHECK_EQ(0, result.a4);
+
+  return 0;
+}
+
+// Used for testing structs by value.
+// On arm64, both argument and return value are passed in by pointer.
+// Ints exhaust registers, so that pointer is passed on stack.
+DART_EXPORT intptr_t TestReturnStructArgumentInt32x8Struct20BytesHomogeneou(
+    // NOLINTNEXTLINE(whitespace/parens)
+    Struct20BytesHomogeneousInt32 (*f)(int32_t a0,
+                                       int32_t a1,
+                                       int32_t a2,
+                                       int32_t a3,
+                                       int32_t a4,
+                                       int32_t a5,
+                                       int32_t a6,
+                                       int32_t a7,
+                                       Struct20BytesHomogeneousInt32 a8)) {
+  int32_t a0;
+  int32_t a1;
+  int32_t a2;
+  int32_t a3;
+  int32_t a4;
+  int32_t a5;
+  int32_t a6;
+  int32_t a7;
+  Struct20BytesHomogeneousInt32 a8;
+
+  a0 = -1;
+  a1 = 2;
+  a2 = -3;
+  a3 = 4;
+  a4 = -5;
+  a5 = 6;
+  a6 = -7;
+  a7 = 8;
+  a8.a0 = -9;
+  a8.a1 = 10;
+  a8.a2 = -11;
+  a8.a3 = 12;
+  a8.a4 = -13;
+
+  std::cout << "Calling TestReturnStructArgumentInt32x8Struct20BytesHomogeneou("
+            << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ", " << a4
+            << ", " << a5 << ", " << a6 << ", " << a7 << ", (" << a8.a0 << ", "
+            << a8.a1 << ", " << a8.a2 << ", " << a8.a3 << ", " << a8.a4 << "))"
+            << ")\n";
+
+  Struct20BytesHomogeneousInt32 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8);
+
+  std::cout << "result = "
+            << "(" << result.a0 << ", " << result.a1 << ", " << result.a2
+            << ", " << result.a3 << ", " << result.a4 << ")"
+            << "\n";
+
+  CHECK_EQ(a8.a0, result.a0);
+  CHECK_EQ(a8.a1, result.a1);
+  CHECK_EQ(a8.a2, result.a2);
+  CHECK_EQ(a8.a3, result.a3);
+  CHECK_EQ(a8.a4, result.a4);
+
+  // Pass argument that will make the Dart callback throw.
+  a0 = 42;
+
+  result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8);
+
+  CHECK_EQ(0, result.a0);
+  CHECK_EQ(0, result.a1);
+  CHECK_EQ(0, result.a2);
+  CHECK_EQ(0, result.a3);
+  CHECK_EQ(0, result.a4);
+
+  // Pass argument that will make the Dart callback return null.
+  a0 = 84;
+
+  result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8);
+
+  CHECK_EQ(0, result.a0);
+  CHECK_EQ(0, result.a1);
+  CHECK_EQ(0, result.a2);
+  CHECK_EQ(0, result.a3);
+  CHECK_EQ(0, result.a4);
+
+  return 0;
+}
+
+// Used for testing structs by value.
+// Test alignment and padding of 16 byte int within struct.
+DART_EXPORT intptr_t TestReturnStructAlignmentInt16(
+    // NOLINTNEXTLINE(whitespace/parens)
+    StructAlignmentInt16 (*f)(int8_t a0, int16_t a1, int8_t a2)) {
+  int8_t a0;
+  int16_t a1;
+  int8_t a2;
+
+  a0 = -1;
+  a1 = 2;
+  a2 = -3;
+
+  std::cout << "Calling TestReturnStructAlignmentInt16("
+            << "(" << static_cast<int>(a0) << ", " << a1 << ", "
+            << static_cast<int>(a2) << ")"
+            << ")\n";
+
+  StructAlignmentInt16 result = f(a0, a1, a2);
+
+  std::cout << "result = "
+            << "(" << static_cast<int>(result.a0) << ", " << result.a1 << ", "
+            << static_cast<int>(result.a2) << ")"
+            << "\n";
+
+  CHECK_EQ(a0, result.a0);
+  CHECK_EQ(a1, result.a1);
+  CHECK_EQ(a2, result.a2);
+
+  // Pass argument that will make the Dart callback throw.
+  a0 = 42;
+
+  result = f(a0, a1, a2);
+
+  CHECK_EQ(0, result.a0);
+  CHECK_EQ(0, result.a1);
+  CHECK_EQ(0, result.a2);
+
+  // Pass argument that will make the Dart callback return null.
+  a0 = 84;
+
+  result = f(a0, a1, a2);
+
+  CHECK_EQ(0, result.a0);
+  CHECK_EQ(0, result.a1);
+  CHECK_EQ(0, result.a2);
+
+  return 0;
+}
+
+// Used for testing structs by value.
+// Test alignment and padding of 32 byte int within struct.
+DART_EXPORT intptr_t TestReturnStructAlignmentInt32(
+    // NOLINTNEXTLINE(whitespace/parens)
+    StructAlignmentInt32 (*f)(int8_t a0, int32_t a1, int8_t a2)) {
+  int8_t a0;
+  int32_t a1;
+  int8_t a2;
+
+  a0 = -1;
+  a1 = 2;
+  a2 = -3;
+
+  std::cout << "Calling TestReturnStructAlignmentInt32("
+            << "(" << static_cast<int>(a0) << ", " << a1 << ", "
+            << static_cast<int>(a2) << ")"
+            << ")\n";
+
+  StructAlignmentInt32 result = f(a0, a1, a2);
+
+  std::cout << "result = "
+            << "(" << static_cast<int>(result.a0) << ", " << result.a1 << ", "
+            << static_cast<int>(result.a2) << ")"
+            << "\n";
+
+  CHECK_EQ(a0, result.a0);
+  CHECK_EQ(a1, result.a1);
+  CHECK_EQ(a2, result.a2);
+
+  // Pass argument that will make the Dart callback throw.
+  a0 = 42;
+
+  result = f(a0, a1, a2);
+
+  CHECK_EQ(0, result.a0);
+  CHECK_EQ(0, result.a1);
+  CHECK_EQ(0, result.a2);
+
+  // Pass argument that will make the Dart callback return null.
+  a0 = 84;
+
+  result = f(a0, a1, a2);
+
+  CHECK_EQ(0, result.a0);
+  CHECK_EQ(0, result.a1);
+  CHECK_EQ(0, result.a2);
+
+  return 0;
+}
+
+// Used for testing structs by value.
+// Test alignment and padding of 64 byte int within struct.
+DART_EXPORT intptr_t TestReturnStructAlignmentInt64(
+    // NOLINTNEXTLINE(whitespace/parens)
+    StructAlignmentInt64 (*f)(int8_t a0, int64_t a1, int8_t a2)) {
+  int8_t a0;
+  int64_t a1;
+  int8_t a2;
+
+  a0 = -1;
+  a1 = 2;
+  a2 = -3;
+
+  std::cout << "Calling TestReturnStructAlignmentInt64("
+            << "(" << static_cast<int>(a0) << ", " << a1 << ", "
+            << static_cast<int>(a2) << ")"
+            << ")\n";
+
+  StructAlignmentInt64 result = f(a0, a1, a2);
+
+  std::cout << "result = "
+            << "(" << static_cast<int>(result.a0) << ", " << result.a1 << ", "
+            << static_cast<int>(result.a2) << ")"
+            << "\n";
+
+  CHECK_EQ(a0, result.a0);
+  CHECK_EQ(a1, result.a1);
+  CHECK_EQ(a2, result.a2);
+
+  // Pass argument that will make the Dart callback throw.
+  a0 = 42;
+
+  result = f(a0, a1, a2);
+
+  CHECK_EQ(0, result.a0);
+  CHECK_EQ(0, result.a1);
+  CHECK_EQ(0, result.a2);
+
+  // Pass argument that will make the Dart callback return null.
+  a0 = 84;
+
+  result = f(a0, a1, a2);
+
+  CHECK_EQ(0, result.a0);
+  CHECK_EQ(0, result.a1);
+  CHECK_EQ(0, result.a2);
+
+  return 0;
+}
+
+}  // namespace dart
diff --git a/runtime/bin/ffi_test/ffi_test_functions_vmspecific.cc b/runtime/bin/ffi_test/ffi_test_functions_vmspecific.cc
index e5762770..ace3747 100644
--- a/runtime/bin/ffi_test/ffi_test_functions_vmspecific.cc
+++ b/runtime/bin/ffi_test/ffi_test_functions_vmspecific.cc
@@ -475,7 +475,7 @@
 
 Dart_Port send_port_;
 
-static void FreeFinalizer(void*, Dart_WeakPersistentHandle, void* value) {
+static void FreeFinalizer(void*, void* value) {
   free(value);
 }
 
@@ -776,9 +776,7 @@
 // vmspecific_handle_test.dart (statically linked).
 // vmspecific_handle_dynamically_linked_test.dart (dynamically linked).
 
-static void RunFinalizer(void* isolate_callback_data,
-                         Dart_WeakPersistentHandle handle,
-                         void* peer) {
+static void RunFinalizer(void* isolate_callback_data, void* peer) {
   printf("Running finalizer for weak handle.\n");
 }
 
diff --git a/runtime/bin/file_win.cc b/runtime/bin/file_win.cc
index 46425dc..6e11076 100644
--- a/runtime/bin/file_win.cc
+++ b/runtime/bin/file_win.cc
@@ -350,7 +350,7 @@
   }
   if (full_path_length < kPathLength) {
     WideToUtf8Scope scope(buffer.buf());
-    return StringRAII(strdup(scope.utf8()));
+    return StringRAII(Utils::StrDup(scope.utf8()));
   }
 
   // Try again with bigger buffer.
@@ -363,7 +363,7 @@
     return StringRAII(path);
   }
   WideToUtf8Scope scope(bigger_buffer.buf());
-  return StringRAII(strdup(scope.utf8()));
+  return StringRAII(Utils::StrDup(scope.utf8()));
 }
 
 static StringRAII PrefixLongPathIfExceedLimit(
diff --git a/runtime/bin/gen_snapshot.cc b/runtime/bin/gen_snapshot.cc
index eba26b5..72e10c8 100644
--- a/runtime/bin/gen_snapshot.cc
+++ b/runtime/bin/gen_snapshot.cc
@@ -125,7 +125,6 @@
   V(compile_all, compile_all)                                                  \
   V(help, help)                                                                \
   V(obfuscate, obfuscate)                                                      \
-  V(read_all_bytecode, read_all_bytecode)                                      \
   V(strip, strip)                                                              \
   V(verbose, verbose)                                                          \
   V(version, version)
@@ -390,13 +389,6 @@
 }
 
 static void MaybeLoadCode() {
-  if (read_all_bytecode &&
-      ((snapshot_kind == kCore) || (snapshot_kind == kCoreJIT) ||
-       (snapshot_kind == kApp) || (snapshot_kind == kAppJIT))) {
-    Dart_Handle result = Dart_ReadAllBytecode();
-    CHECK_RESULT(result);
-  }
-
   if (compile_all &&
       ((snapshot_kind == kCoreJIT) || (snapshot_kind == kAppJIT))) {
     Dart_Handle result = Dart_CompileAll();
@@ -645,7 +637,7 @@
                             const char* main_filename,
                             const char* suffix) {
   char* filename = loading_unit_id == 1
-                       ? strdup(main_filename)
+                       ? Utils::StrDup(main_filename)
                        : Utils::SCreate("%s-%" Pd ".part.%s", main_filename,
                                         loading_unit_id, suffix);
   File* file = OpenFile(filename);
@@ -654,7 +646,7 @@
   if (debugging_info_filename != nullptr) {
     char* debug_filename =
         loading_unit_id == 1
-            ? strdup(debugging_info_filename)
+            ? Utils::StrDup(debugging_info_filename)
             : Utils::SCreate("%s-%" Pd ".part.so", debugging_info_filename,
                              loading_unit_id);
     File* debug_file = OpenFile(debug_filename);
diff --git a/runtime/bin/io_buffer.h b/runtime/bin/io_buffer.h
index 2df3086..79b4fb9 100644
--- a/runtime/bin/io_buffer.h
+++ b/runtime/bin/io_buffer.h
@@ -25,9 +25,7 @@
   static void Free(void* buffer) { free(buffer); }
 
   // Function for finalizing external byte arrays used as IO buffers.
-  static void Finalizer(void* isolate_callback_data,
-                        Dart_WeakPersistentHandle handle,
-                        void* buffer) {
+  static void Finalizer(void* isolate_callback_data, void* buffer) {
     Free(buffer);
   }
 
diff --git a/runtime/bin/main_options.cc b/runtime/bin/main_options.cc
index 1d2f619..452346f 100644
--- a/runtime/bin/main_options.cc
+++ b/runtime/bin/main_options.cc
@@ -36,8 +36,6 @@
 
 SnapshotKind Options::gen_snapshot_kind_ = kNone;
 bool Options::enable_vm_service_ = false;
-MallocGrowableArray<const char*> Options::enabled_experiments_ =
-    MallocGrowableArray<const char*>(4);
 
 #define OPTION_FIELD(variable) Options::variable##_
 
@@ -368,28 +366,6 @@
   return false;
 }
 
-bool Options::ProcessEnableExperimentOption(const char* arg,
-                                            CommandLineOptions* vm_options) {
-  const char* value =
-      OptionProcessor::ProcessOption(arg, "--enable_experiment=");
-  if (value == nullptr) {
-    value = OptionProcessor::ProcessOption(arg, "--enable-experiment=");
-  }
-  if (value == nullptr) {
-    return false;
-  }
-  vm_options->AddArgument(arg);
-  Utils::CStringUniquePtr tmp =
-      Utils::CreateCStringUniquePtr(Utils::StrDup(value));
-  char* save_ptr;  // Needed for strtok_r.
-  char* token = strtok_r(const_cast<char*>(tmp.get()), ",", &save_ptr);
-  while (token != NULL) {
-    enabled_experiments_.Add(Utils::StrDup(token));
-    token = strtok_r(NULL, ",", &save_ptr);
-  }
-  return true;
-}
-
 int Options::ParseArguments(int argc,
                             char** argv,
                             bool vm_run_app_snapshot,
@@ -480,6 +456,8 @@
 #if !defined(DART_IO_SECURE_SOCKET_DISABLED)
   SSLCertContext::set_root_certs_file(Options::root_certs_file());
   SSLCertContext::set_root_certs_cache(Options::root_certs_cache());
+  SSLCertContext::set_long_ssl_cert_evaluation(
+      Options::long_ssl_cert_evaluation());
 #endif  // !defined(DART_IO_SECURE_SOCKET_DISABLED)
 
   // The arguments to the VM are at positions 1 through i-1 in argv.
@@ -555,49 +533,22 @@
 
   vm_options->AddArguments(vm_argv, vm_argc);
 
-#if !defined(DART_PRECOMPILED_RUNTIME)
-  if (!enabled_experiments_.is_empty()) {
-    intptr_t num_experiments = enabled_experiments_.length();
-    if (!(Options::disable_dart_dev() || run_script)) {
-      const char* kEnableExperiment = "--enable-experiment=";
-      int option_size = strlen(kEnableExperiment);
-      for (intptr_t i = 0; i < num_experiments; ++i) {
-        const char* flag = enabled_experiments_.At(i);
-        option_size += strlen(flag);
-        if (i + 1 != num_experiments) {
-          // Account for comma if there's more experiments to add.
-          ++option_size;
-        }
-      }
-      // Make room for null terminator
-      ++option_size;
-
-      char* enabled_experiments_arg = new char[option_size];
-      int offset = snprintf(enabled_experiments_arg, option_size, "%s",
-                            kEnableExperiment);
-      for (intptr_t i = 0; i < num_experiments; ++i) {
-        const char* flag = enabled_experiments_.At(i);
-        const char* kFormat = (i + 1 != num_experiments) ? "%s," : "%s";
-        offset += snprintf(enabled_experiments_arg + offset,
-                           option_size - offset, kFormat, flag);
-        free(const_cast<char*>(flag));
-        ASSERT(offset < option_size);
-      }
-      DartDevIsolate::set_should_run_dart_dev(true);
-      dart_options->AddArgument(enabled_experiments_arg);
-    } else {
-      for (intptr_t i = 0; i < num_experiments; ++i) {
-        free(const_cast<char*>(enabled_experiments_.At(i)));
-      }
-    }
-  }
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-
   // If running with dartdev, attempt to parse VM flags which are part of the
   // dartdev command (e.g., --enable-vm-service, --observe, etc).
   if (!run_script) {
     int tmp_i = i;
+    // We only run the CLI implicitly if the service is enabled and the user
+    // didn't run with the 'run' command. If they did provide a command, we need
+    // to skip it here to continue parsing VM flags.
+    if (!implicitly_use_dart_dev) {
+      tmp_i++;
+    }
     while (tmp_i < argc) {
+      // Check if this flag is a potentially valid VM flag. If not, we've likely
+      // hit a script name and are done parsing VM flags.
+      if (!OptionProcessor::IsValidFlag(argv[tmp_i], kPrefix, kPrefixLen)) {
+        break;
+      }
       OptionProcessor::TryProcess(argv[tmp_i], vm_options);
       tmp_i++;
     }
diff --git a/runtime/bin/main_options.h b/runtime/bin/main_options.h
index 6f612fd..f900a3c 100644
--- a/runtime/bin/main_options.h
+++ b/runtime/bin/main_options.h
@@ -47,7 +47,8 @@
   V(preview_dart_2, nop_option)                                                \
   V(suppress_core_dump, suppress_core_dump)                                    \
   V(enable_service_port_fallback, enable_service_port_fallback)                \
-  V(disable_dart_dev, disable_dart_dev)
+  V(disable_dart_dev, disable_dart_dev)                                        \
+  V(long_ssl_cert_evaluation, long_ssl_cert_evaluation)
 
 // Boolean flags that have a short form.
 #define SHORT_BOOL_OPTIONS_LIST(V)                                             \
@@ -69,7 +70,6 @@
   V(ProcessEnvironmentOption)                                                  \
   V(ProcessEnableVmServiceOption)                                              \
   V(ProcessObserveOption)                                                      \
-  V(ProcessEnableExperimentOption)                                             \
   V(ProcessVMDebuggingOptions)
 
 // This enum must match the strings in kSnapshotKindNames in main_options.cc.
@@ -178,8 +178,6 @@
                                     int default_port,
                                     const char* default_ip);
 
-  static MallocGrowableArray<const char*> enabled_experiments_;
-
 #define OPTION_FRIEND(flag, variable) friend class OptionProcessor_##flag;
   STRING_OPTIONS_LIST(OPTION_FRIEND)
   BOOL_OPTIONS_LIST(OPTION_FRIEND)
diff --git a/runtime/bin/security_context.cc b/runtime/bin/security_context.cc
index 3b98b30..f5d3a00 100644
--- a/runtime/bin/security_context.cc
+++ b/runtime/bin/security_context.cc
@@ -34,6 +34,7 @@
 
 const char* SSLCertContext::root_certs_file_ = NULL;
 const char* SSLCertContext::root_certs_cache_ = NULL;
+bool SSLCertContext::long_ssl_cert_evaluation_ = false;
 
 int SSLCertContext::CertificateCallback(int preverify_ok,
                                         X509_STORE_CTX* store_ctx) {
diff --git a/runtime/bin/security_context.h b/runtime/bin/security_context.h
index 206a859..5090cdb 100644
--- a/runtime/bin/security_context.h
+++ b/runtime/bin/security_context.h
@@ -88,6 +88,11 @@
   void RegisterCallbacks(SSL* ssl);
   TrustEvaluateHandlerFunc GetTrustEvaluateHandler() const;
 
+  static bool long_ssl_cert_evaluation() { return long_ssl_cert_evaluation_; }
+  static void set_long_ssl_cert_evaluation(bool long_ssl_cert_evaluation) {
+    long_ssl_cert_evaluation_ = long_ssl_cert_evaluation;
+  }
+
  private:
   void AddCompiledInCerts();
   void LoadRootCertFile(const char* file);
@@ -101,6 +106,8 @@
 
   bool trust_builtin_;
 
+  static bool long_ssl_cert_evaluation_;
+
   DISALLOW_COPY_AND_ASSIGN(SSLCertContext);
 };
 
diff --git a/runtime/bin/security_context_macos.cc b/runtime/bin/security_context_macos.cc
index c130b6a..c934fc5 100644
--- a/runtime/bin/security_context_macos.cc
+++ b/runtime/bin/security_context_macos.cc
@@ -260,6 +260,12 @@
 
   SecTrustResultType trust_result;
 
+  // This is used for testing to confirm that trust evaluation doesn't block
+  // dart isolate.
+  if (SSLCertContext::long_ssl_cert_evaluation()) {
+    usleep(1000 * 1000 /*1 s*/);
+  }
+
   // Perform the certificate verification.
 #if ((defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && defined(__MAC_10_14_0) &&    \
       __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_14_0) ||                     \
diff --git a/runtime/include/dart_api.h b/runtime/include/dart_api.h
index 5d7d117..db0e630 100644
--- a/runtime/include/dart_api.h
+++ b/runtime/include/dart_api.h
@@ -244,8 +244,9 @@
  * the object is garbage collected. It is never safe to use these handles
  * unless you know the object is still reachable.
  *
- * WeakPersistentHandles are persistent handles which are auto deleted
- * when the object is garbage collected.
+ * WeakPersistentHandles are persistent handles which are automatically set
+ * to point Dart_Null when the object is garbage collected. They are not auto
+ * deleted, so it is safe to use them after the object has become unreachable.
  */
 typedef struct _Dart_Handle* Dart_Handle;
 typedef Dart_Handle Dart_PersistentHandle;
@@ -254,10 +255,6 @@
 // These structs are versioned by DART_API_DL_MAJOR_VERSION, bump the
 // version when changing this struct.
 
-typedef void (*Dart_WeakPersistentHandleFinalizer)(
-    void* isolate_callback_data,
-    Dart_WeakPersistentHandle handle,
-    void* peer);
 typedef void (*Dart_HandleFinalizer)(void* isolate_callback_data, void* peer);
 
 /**
@@ -423,6 +420,8 @@
 
 /**
  * Allocates a handle in the current scope from a weak persistent handle.
+ *
+ * This will be a handle to Dart_Null if the object has been garbage collected.
  */
 DART_EXPORT Dart_Handle
 Dart_HandleFromWeakPersistent(Dart_WeakPersistentHandle object);
@@ -461,24 +460,18 @@
 /**
  * Allocates a weak persistent handle for an object.
  *
- * This handle has the lifetime of the current isolate unless the object
- * pointed to by the handle is garbage collected, in this case the VM
- * automatically deletes the handle after invoking the callback associated
- * with the handle. The handle can also be explicitly deallocated by
- * calling Dart_DeleteWeakPersistentHandle.
+ * This handle has the lifetime of the current isolate. The handle can also be
+ * explicitly deallocated by calling Dart_DeleteWeakPersistentHandle.
  *
- * If the object becomes unreachable the callback is invoked with the weak
- * persistent handle and the peer as arguments. The callback can be executed on
- * any thread, will have an isolate group, but will not have a current isolate.
- * The callback can only call Dart_DeletePersistentHandle or
- * Dart_DeleteWeakPersistentHandle. The callback must not call
- * Dart_DeleteWeakPersistentHandle for the handle being finalized, as it is
- * automatically deleted by the VM after the callback returns. This gives the
- * embedder the ability to cleanup data associated with the object and clear
- * out any cached references to the handle. All references to this handle after
- * the callback will be invalid. It is illegal to call into the VM with any
- * other Dart_* functions from the callback. If the handle is deleted before
- * the object becomes unreachable, the callback is never invoked.
+ * If the object becomes unreachable the callback is invoked with the peer as
+ * argument. The callback can be executed on any thread, will have a current
+ * isolate group, but will not have a current isolate. The callback can only
+ * call Dart_DeletePersistentHandle or Dart_DeleteWeakPersistentHandle. This
+ * gives the embedder the ability to cleanup data associated with the object.
+ * The handle will point to the Dart_Null object after the finalizer has been
+ * run. It is illegal to call into the VM with any other Dart_* functions from
+ * the callback. If the handle is deleted before the object becomes
+ * unreachable, the callback is never invoked.
  *
  * Requires there to be a current isolate.
  *
@@ -498,7 +491,7 @@
 Dart_NewWeakPersistentHandle(Dart_Handle object,
                              void* peer,
                              intptr_t external_allocation_size,
-                             Dart_WeakPersistentHandleFinalizer callback);
+                             Dart_HandleFinalizer callback);
 
 /**
  * Deletes the given weak persistent [object] handle.
@@ -921,7 +914,7 @@
 /**
  * Initializes the VM.
  *
- * \param flags A struct containing initialization information. The version
+ * \param params A struct containing initialization information. The version
  *   field of the struct must be DART_INITIALIZE_PARAMS_CURRENT_VERSION.
  *
  * \return NULL if initialization is successful. Returns an error message
@@ -2046,7 +2039,7 @@
                              intptr_t length,
                              void* peer,
                              intptr_t external_allocation_size,
-                             Dart_WeakPersistentHandleFinalizer callback);
+                             Dart_HandleFinalizer callback);
 
 /**
  * Returns a String which references an external array of UTF-16 encoded
@@ -2067,7 +2060,7 @@
                             intptr_t length,
                             void* peer,
                             intptr_t external_allocation_size,
-                            Dart_WeakPersistentHandleFinalizer callback);
+                            Dart_HandleFinalizer callback);
 
 /**
  * Gets the C string representation of a String.
@@ -2440,13 +2433,13 @@
  * \return The TypedData object if no error occurs. Otherwise returns
  *   an error handle.
  */
-DART_EXPORT Dart_Handle Dart_NewExternalTypedDataWithFinalizer(
-    Dart_TypedData_Type type,
-    void* data,
-    intptr_t length,
-    void* peer,
-    intptr_t external_allocation_size,
-    Dart_WeakPersistentHandleFinalizer callback);
+DART_EXPORT Dart_Handle
+Dart_NewExternalTypedDataWithFinalizer(Dart_TypedData_Type type,
+                                       void* data,
+                                       intptr_t length,
+                                       void* peer,
+                                       intptr_t external_allocation_size,
+                                       Dart_HandleFinalizer callback);
 
 /**
  * Returns a ByteBuffer object for the typed data.
diff --git a/runtime/include/dart_api_dl.h b/runtime/include/dart_api_dl.h
index 391f441..0854d71 100644
--- a/runtime/include/dart_api_dl.h
+++ b/runtime/include/dart_api_dl.h
@@ -84,7 +84,7 @@
   F(Dart_DeletePersistentHandle, void, (Dart_PersistentHandle object))         \
   F(Dart_NewWeakPersistentHandle, Dart_WeakPersistentHandle,                   \
     (Dart_Handle object, void* peer, intptr_t external_allocation_size,        \
-     Dart_WeakPersistentHandleFinalizer callback))                             \
+     Dart_HandleFinalizer callback))                                           \
   F(Dart_DeleteWeakPersistentHandle, void, (Dart_WeakPersistentHandle object)) \
   F(Dart_UpdateExternalSize, void,                                             \
     (Dart_WeakPersistentHandle object, intptr_t external_allocation_size))     \
diff --git a/runtime/include/dart_native_api.h b/runtime/include/dart_native_api.h
index 495d454..a40c522 100644
--- a/runtime/include/dart_native_api.h
+++ b/runtime/include/dart_native_api.h
@@ -31,8 +31,7 @@
  * The data for kTypedData is copied on message send and ownership remains with
  * the caller. The ownership of data for kExternalTyped is passed to the VM on
  * message send and returned when the VM invokes the
- * Dart_WeakPersistentHandleFinalizer callback; a non-NULL callback must be
- * provided.
+ * Dart_HandleFinalizer callback; a non-NULL callback must be provided.
  */
 typedef enum {
   Dart_CObject_kNull = 0,
@@ -79,7 +78,7 @@
       intptr_t length;
       uint8_t* data;
       void* peer;
-      Dart_WeakPersistentHandleFinalizer callback;
+      Dart_HandleFinalizer callback;
     } as_external_typed_data;
   } value;
 } Dart_CObject;
@@ -178,8 +177,6 @@
  */
 DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle Dart_CompileAll();
 
-DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle Dart_ReadAllBytecode();
-
 /**
  * Finalizes all classes.
  */
diff --git a/runtime/include/dart_version.h b/runtime/include/dart_version.h
index d2d904d..b3b4924 100644
--- a/runtime/include/dart_version.h
+++ b/runtime/include/dart_version.h
@@ -10,7 +10,7 @@
 // On breaking changes the major version is increased.
 // On backwards compatible changes the minor version is increased.
 // The versioning covers the symbols exposed in dart_api_dl.h
-#define DART_API_DL_MAJOR_VERSION 1
-#define DART_API_DL_MINOR_VERSION 1
+#define DART_API_DL_MAJOR_VERSION 2
+#define DART_API_DL_MINOR_VERSION 0
 
 #endif /* RUNTIME_INCLUDE_DART_VERSION_H_ */ /* NOLINT */
diff --git a/runtime/lib/errors.cc b/runtime/lib/errors.cc
index 7106518..cce88cf 100644
--- a/runtime/lib/errors.cc
+++ b/runtime/lib/errors.cc
@@ -31,25 +31,21 @@
   ASSERT(!assert_error_class.IsNull());
   bool hit_assertion_error = false;
   for (; stack_frame != NULL; stack_frame = iterator->NextFrame()) {
-    if (stack_frame->is_interpreted()) {
-      func = stack_frame->LookupDartFunction();
-    } else {
-      code = stack_frame->LookupDartCode();
-      if (code.is_optimized()) {
-        InlinedFunctionsIterator inlined_iterator(code, stack_frame->pc());
-        while (!inlined_iterator.Done()) {
-          func = inlined_iterator.function();
-          if (hit_assertion_error) {
-            return func.script();
-          }
-          ASSERT(!hit_assertion_error);
-          hit_assertion_error = (func.Owner() == assert_error_class.raw());
-          inlined_iterator.Advance();
+    code = stack_frame->LookupDartCode();
+    if (code.is_optimized()) {
+      InlinedFunctionsIterator inlined_iterator(code, stack_frame->pc());
+      while (!inlined_iterator.Done()) {
+        func = inlined_iterator.function();
+        if (hit_assertion_error) {
+          return func.script();
         }
-        continue;
-      } else {
-        func = code.function();
+        ASSERT(!hit_assertion_error);
+        hit_assertion_error = (func.Owner() == assert_error_class.raw());
+        inlined_iterator.Advance();
       }
+      continue;
+    } else {
+      func = code.function();
     }
     ASSERT(!func.IsNull());
     if (hit_assertion_error) {
diff --git a/runtime/lib/ffi.cc b/runtime/lib/ffi.cc
index 3c4a07c..bb85a96 100644
--- a/runtime/lib/ffi.cc
+++ b/runtime/lib/ffi.cc
@@ -35,10 +35,6 @@
 // Some checks are only performed at runtime to allow for generic code, these
 // throw ArgumentExceptions.
 
-static bool IsPointerType(const AbstractType& type) {
-  return IsFfiPointerClassId(type.type_class_id());
-}
-
 static void CheckSized(const AbstractType& type_arg) {
   const classid_t type_cid = type_arg.type_class_id();
   if (IsFfiNativeTypeTypeClassId(type_cid) || IsFfiTypeVoidClassId(type_cid) ||
@@ -54,33 +50,13 @@
   }
 }
 
-// The following functions are runtime checks on arguments.
-
-static const Integer& AsInteger(const Instance& instance) {
-  if (!instance.IsInteger()) {
-    const String& error = String::Handle(String::NewFormatted(
-        "Expected an int but found %s", instance.ToCString()));
-    Exceptions::ThrowArgumentError(error);
-  }
-  return Integer::Cast(instance);
-}
-
-static const Double& AsDouble(const Instance& instance) {
-  if (!instance.IsDouble()) {
-    const String& error = String::Handle(String::NewFormatted(
-        "Expected a double but found %s", instance.ToCString()));
-    Exceptions::ThrowArgumentError(error);
-  }
-  return Double::Cast(instance);
-}
-
 // Calculate the size of a native type.
 //
 // You must check [IsConcreteNativeType] and [CheckSized] first to verify that
 // this type has a defined size.
-static size_t SizeOf(const AbstractType& type, Zone* zone) {
+static size_t SizeOf(Zone* zone, const AbstractType& type) {
   if (IsFfiTypeClassId(type.type_class_id())) {
-    return compiler::ffi::NativeType::FromAbstractType(type, zone)
+    return compiler::ffi::NativeType::FromAbstractType(zone, type)
         .SizeInBytes();
   } else {
     Class& struct_class = Class::Handle(type.type_class());
@@ -96,75 +72,20 @@
 // The remainder of this file implements the dart:ffi native methods.
 
 DEFINE_NATIVE_ENTRY(Ffi_fromAddress, 1, 1) {
-  GET_NATIVE_TYPE_ARGUMENT(type_arg, arguments->NativeTypeArgAt(0));
-  GET_NON_NULL_NATIVE_ARGUMENT(Integer, arg_ptr, arguments->NativeArgAt(0));
-  return Pointer::New(type_arg, arg_ptr.AsInt64Value());
+  UNREACHABLE();
 }
 
 DEFINE_NATIVE_ENTRY(Ffi_address, 0, 1) {
-  GET_NON_NULL_NATIVE_ARGUMENT(Pointer, pointer, arguments->NativeArgAt(0));
-  return Integer::New(pointer.NativeAddress());
-}
-
-static ObjectPtr LoadValueNumeric(Zone* zone,
-                                  const Pointer& target,
-                                  classid_t type_cid,
-                                  const Integer& offset) {
-  // TODO(36370): Make representation consistent with kUnboxedFfiIntPtr.
-  const size_t address =
-      target.NativeAddress() + static_cast<intptr_t>(offset.AsInt64Value());
-  switch (type_cid) {
-    case kFfiInt8Cid:
-      return Integer::New(*reinterpret_cast<int8_t*>(address));
-    case kFfiInt16Cid:
-      return Integer::New(*reinterpret_cast<int16_t*>(address));
-    case kFfiInt32Cid:
-      return Integer::New(*reinterpret_cast<int32_t*>(address));
-    case kFfiInt64Cid:
-      return Integer::New(*reinterpret_cast<int64_t*>(address));
-    case kFfiUint8Cid:
-      return Integer::NewFromUint64(*reinterpret_cast<uint8_t*>(address));
-    case kFfiUint16Cid:
-      return Integer::NewFromUint64(*reinterpret_cast<uint16_t*>(address));
-    case kFfiUint32Cid:
-      return Integer::NewFromUint64(*reinterpret_cast<uint32_t*>(address));
-    case kFfiUint64Cid:
-      return Integer::NewFromUint64(*reinterpret_cast<uint64_t*>(address));
-    case kFfiIntPtrCid:
-      return Integer::New(*reinterpret_cast<intptr_t*>(address));
-    case kFfiFloatCid:
-      return Double::New(*reinterpret_cast<float_t*>(address));
-    case kFfiDoubleCid:
-      return Double::New(*reinterpret_cast<double_t*>(address));
-    default:
-      UNREACHABLE();
-  }
+  UNREACHABLE();
 }
 
 #define DEFINE_NATIVE_ENTRY_LOAD(type)                                         \
-  DEFINE_NATIVE_ENTRY(Ffi_load##type, 0, 2) {                                  \
-    GET_NON_NULL_NATIVE_ARGUMENT(Pointer, pointer, arguments->NativeArgAt(0)); \
-    GET_NON_NULL_NATIVE_ARGUMENT(Integer, offset, arguments->NativeArgAt(1));  \
-    return LoadValueNumeric(zone, pointer, kFfi##type##Cid, offset);           \
-  }
+  DEFINE_NATIVE_ENTRY(Ffi_load##type, 0, 2) { UNREACHABLE(); }
 CLASS_LIST_FFI_NUMERIC(DEFINE_NATIVE_ENTRY_LOAD)
 #undef DEFINE_NATIVE_ENTRY_LOAD
 
 DEFINE_NATIVE_ENTRY(Ffi_loadPointer, 1, 2) {
-  GET_NON_NULL_NATIVE_ARGUMENT(Pointer, pointer, arguments->NativeArgAt(0));
-  GET_NON_NULL_NATIVE_ARGUMENT(Integer, offset, arguments->NativeArgAt(1));
-
-  const auto& pointer_type_arg =
-      AbstractType::Handle(zone, pointer.type_argument());
-  const AbstractType& type_arg =
-      AbstractType::Handle(TypeArguments::Handle(pointer_type_arg.arguments())
-                               .TypeAt(Pointer::kNativeTypeArgPos));
-
-  // TODO(36370): Make representation consistent with kUnboxedFfiIntPtr.
-  const size_t address =
-      pointer.NativeAddress() + static_cast<intptr_t>(offset.AsInt64Value());
-
-  return Pointer::New(type_arg, *reinterpret_cast<uword*>(address));
+  UNREACHABLE();
 }
 
 static ObjectPtr LoadValueStruct(Zone* zone,
@@ -201,141 +122,32 @@
   // TODO(36370): Make representation consistent with kUnboxedFfiIntPtr.
   const size_t address =
       pointer.NativeAddress() + static_cast<intptr_t>(index.AsInt64Value()) *
-                                    SizeOf(pointer_type_arg, zone);
+                                    SizeOf(zone, pointer_type_arg);
   const Pointer& pointer_offset =
       Pointer::Handle(zone, Pointer::New(pointer_type_arg, address));
 
   return LoadValueStruct(zone, pointer_offset, pointer_type_arg);
 }
 
-static void StoreValueNumeric(Zone* zone,
-                              const Pointer& pointer,
-                              classid_t type_cid,
-                              const Integer& offset,
-                              const Instance& new_value) {
-  // TODO(36370): Make representation consistent with kUnboxedFfiIntPtr.
-  const size_t address =
-      pointer.NativeAddress() + static_cast<intptr_t>(offset.AsInt64Value());
-  switch (type_cid) {
-    case kFfiInt8Cid:
-      *reinterpret_cast<int8_t*>(address) = AsInteger(new_value).AsInt64Value();
-      break;
-    case kFfiInt16Cid:
-      *reinterpret_cast<int16_t*>(address) =
-          AsInteger(new_value).AsInt64Value();
-      break;
-    case kFfiInt32Cid:
-      *reinterpret_cast<int32_t*>(address) =
-          AsInteger(new_value).AsInt64Value();
-      break;
-    case kFfiInt64Cid:
-      *reinterpret_cast<int64_t*>(address) =
-          AsInteger(new_value).AsInt64Value();
-      break;
-    case kFfiUint8Cid:
-      *reinterpret_cast<uint8_t*>(address) =
-          AsInteger(new_value).AsInt64Value();
-      break;
-    case kFfiUint16Cid:
-      *reinterpret_cast<uint16_t*>(address) =
-          AsInteger(new_value).AsInt64Value();
-      break;
-    case kFfiUint32Cid:
-      *reinterpret_cast<uint32_t*>(address) =
-          AsInteger(new_value).AsInt64Value();
-      break;
-    case kFfiUint64Cid:
-      *reinterpret_cast<uint64_t*>(address) =
-          AsInteger(new_value).AsInt64Value();
-      break;
-    case kFfiIntPtrCid:
-      *reinterpret_cast<intptr_t*>(address) =
-          AsInteger(new_value).AsInt64Value();
-      break;
-    case kFfiFloatCid:
-      *reinterpret_cast<float*>(address) = AsDouble(new_value).value();
-      break;
-    case kFfiDoubleCid:
-      *reinterpret_cast<double*>(address) = AsDouble(new_value).value();
-      break;
-    default:
-      UNREACHABLE();
-  }
-}
-
 #define DEFINE_NATIVE_ENTRY_STORE(type)                                        \
-  DEFINE_NATIVE_ENTRY(Ffi_store##type, 0, 3) {                                 \
-    GET_NON_NULL_NATIVE_ARGUMENT(Pointer, pointer, arguments->NativeArgAt(0)); \
-    GET_NON_NULL_NATIVE_ARGUMENT(Integer, offset, arguments->NativeArgAt(1));  \
-    GET_NON_NULL_NATIVE_ARGUMENT(Instance, value, arguments->NativeArgAt(2));  \
-    StoreValueNumeric(zone, pointer, kFfi##type##Cid, offset, value);          \
-    return Object::null();                                                     \
-  }
+  DEFINE_NATIVE_ENTRY(Ffi_store##type, 0, 3) { UNREACHABLE(); }
 CLASS_LIST_FFI_NUMERIC(DEFINE_NATIVE_ENTRY_STORE)
 #undef DEFINE_NATIVE_ENTRY_STORE
 
 DEFINE_NATIVE_ENTRY(Ffi_storePointer, 0, 3) {
-  GET_NON_NULL_NATIVE_ARGUMENT(Pointer, pointer, arguments->NativeArgAt(0));
-  GET_NON_NULL_NATIVE_ARGUMENT(Integer, offset, arguments->NativeArgAt(1));
-  GET_NON_NULL_NATIVE_ARGUMENT(Pointer, new_value, arguments->NativeArgAt(2));
-  AbstractType& pointer_type_arg =
-      AbstractType::Handle(pointer.type_argument());
-
-  auto& new_value_type =
-      AbstractType::Handle(zone, new_value.GetType(Heap::kNew));
-  if (!new_value_type.IsSubtypeOf(pointer_type_arg, Heap::kNew)) {
-    const String& error = String::Handle(String::NewFormatted(
-        "New value (%s) is not a subtype of '%s'.",
-        String::Handle(new_value_type.UserVisibleName()).ToCString(),
-        String::Handle(pointer_type_arg.UserVisibleName()).ToCString()));
-    Exceptions::ThrowArgumentError(error);
-  }
-
-  ASSERT(IsPointerType(pointer_type_arg));
-  // TODO(36370): Make representation consistent with kUnboxedFfiIntPtr.
-  const size_t address =
-      pointer.NativeAddress() + static_cast<intptr_t>(offset.AsInt64Value());
-  *reinterpret_cast<uword*>(address) = new_value.NativeAddress();
-  return Object::null();
+  UNREACHABLE();
 }
 
 DEFINE_NATIVE_ENTRY(Ffi_sizeOf, 1, 0) {
   GET_NATIVE_TYPE_ARGUMENT(type_arg, arguments->NativeTypeArgAt(0));
   CheckSized(type_arg);
 
-  return Integer::New(SizeOf(type_arg, zone));
+  return Integer::New(SizeOf(zone, type_arg));
 }
 
-// Static invocations to this method are translated directly in streaming FGB
-// and bytecode FGB. However, we can still reach this entrypoint in the bytecode
-// interpreter.
+// Static invocations to this method are translated directly in streaming FGB.
 DEFINE_NATIVE_ENTRY(Ffi_asFunctionInternal, 2, 1) {
-#if defined(DART_PRECOMPILED_RUNTIME) || defined(DART_PRECOMPILER)
   UNREACHABLE();
-#else
-  ASSERT(FLAG_enable_interpreter);
-
-  GET_NON_NULL_NATIVE_ARGUMENT(Pointer, pointer, arguments->NativeArgAt(0));
-  GET_NATIVE_TYPE_ARGUMENT(dart_type, arguments->NativeTypeArgAt(0));
-  GET_NATIVE_TYPE_ARGUMENT(native_type, arguments->NativeTypeArgAt(1));
-
-  const Function& dart_signature =
-      Function::Handle(zone, Type::Cast(dart_type).signature());
-  const Function& native_signature =
-      Function::Handle(zone, Type::Cast(native_type).signature());
-  const Function& function = Function::Handle(
-      compiler::ffi::TrampolineFunction(dart_signature, native_signature));
-
-  // Set the c function pointer in the context of the closure rather than in
-  // the function so that we can reuse the function for each c function with
-  // the same signature.
-  const Context& context = Context::Handle(Context::New(1));
-  context.SetAt(0, pointer);
-
-  return Closure::New(Object::null_type_arguments(),
-                      Object::null_type_arguments(), function, context,
-                      Heap::kOld);
-#endif
 }
 
 DEFINE_NATIVE_ENTRY(Ffi_asExternalTypedData, 0, 2) {
diff --git a/runtime/lib/function.cc b/runtime/lib/function.cc
index ed2c547..1ea506c 100644
--- a/runtime/lib/function.cc
+++ b/runtime/lib/function.cc
@@ -23,7 +23,7 @@
       zone, ArgumentsDescriptor::NewBoxed(kTypeArgsLen, fun_arguments.Length(),
                                           fun_arg_names));
   const Object& result = Object::Handle(
-      zone, DartEntry::InvokeClosure(fun_arguments, fun_args_desc));
+      zone, DartEntry::InvokeClosure(thread, fun_arguments, fun_args_desc));
   if (result.IsError()) {
     Exceptions::PropagateError(Error::Cast(result));
   }
@@ -71,27 +71,4 @@
   return Smi::New(receiver.ComputeHash());
 }
 
-DEFINE_NATIVE_ENTRY(Closure_clone, 0, 1) {
-  const Closure& receiver =
-      Closure::CheckedHandle(zone, arguments->NativeArgAt(0));
-  const TypeArguments& instantiator_type_arguments =
-      TypeArguments::Handle(zone, receiver.instantiator_type_arguments());
-  const TypeArguments& function_type_arguments =
-      TypeArguments::Handle(zone, receiver.function_type_arguments());
-  const Function& function = Function::Handle(zone, receiver.function());
-  const Context& context = Context::Handle(zone, receiver.context());
-  Context& cloned_context = Context::Handle(zone);
-  if (!context.IsNull()) {
-    cloned_context = Context::New(context.num_variables());
-    cloned_context.set_parent(Context::Handle(zone, context.parent()));
-    Object& instance = Object::Handle(zone);
-    for (int i = 0; i < context.num_variables(); i++) {
-      instance = context.At(i);
-      cloned_context.SetAt(i, instance);
-    }
-  }
-  return Closure::New(instantiator_type_arguments, function_type_arguments,
-                      function, cloned_context);
-}
-
 }  // namespace dart
diff --git a/runtime/lib/isolate.cc b/runtime/lib/isolate.cc
index 4b381cb..905cb26 100644
--- a/runtime/lib/isolate.cc
+++ b/runtime/lib/isolate.cc
@@ -51,11 +51,12 @@
   return Smi::New(hash);
 }
 
-DEFINE_NATIVE_ENTRY(RawReceivePortImpl_factory, 0, 1) {
+DEFINE_NATIVE_ENTRY(RawReceivePortImpl_factory, 0, 2) {
   ASSERT(
       TypeArguments::CheckedHandle(zone, arguments->NativeArgAt(0)).IsNull());
+  GET_NON_NULL_NATIVE_ARGUMENT(String, debug_name, arguments->NativeArgAt(1));
   Dart_Port port_id = PortMap::CreatePort(isolate->message_handler());
-  return ReceivePort::New(port_id, false /* not control port */);
+  return ReceivePort::New(port_id, debug_name, false /* not control port */);
 }
 
 DEFINE_NATIVE_ENTRY(RawReceivePortImpl_get_id, 0, 1) {
diff --git a/runtime/lib/mirrors.cc b/runtime/lib/mirrors.cc
index 34ccc5b..e1ab140 100644
--- a/runtime/lib/mirrors.cc
+++ b/runtime/lib/mirrors.cc
@@ -14,6 +14,7 @@
 #include "vm/object_store.h"
 #include "vm/parser.h"
 #include "vm/port.h"
+#include "vm/resolver.h"
 #include "vm/symbols.h"
 
 namespace dart {
@@ -455,76 +456,6 @@
                                        prefix_name, is_import, is_deferred);
 }
 
-static GrowableObjectArrayPtr CreateBytecodeLibraryDependencies(
-    Thread* thread,
-    const Library& lib,
-    const Instance& lib_mirror) {
-  ASSERT(lib.is_declared_in_bytecode());
-
-  // Make sure top level class (containing annotations) is fully loaded.
-  lib.EnsureTopLevelClassIsFinalized();
-
-  const auto& deps = GrowableObjectArray::Handle(GrowableObjectArray::New());
-  Array& metadata = Array::Handle(lib.GetExtendedMetadata(lib, 1));
-  if (metadata.Length() == 0) {
-    return deps.raw();
-  }
-
-  // Library has the only element in the extended metadata.
-  metadata ^= metadata.At(0);
-  if (metadata.IsNull()) {
-    return deps.raw();
-  }
-
-  auto& desc = Array::Handle();
-  auto& target_uri = String::Handle();
-  auto& importee = Library::Handle();
-  auto& is_export = Bool::Handle();
-  auto& is_deferred = Bool::Handle();
-  auto& prefix_name = String::Handle();
-  auto& show_names = Array::Handle();
-  auto& hide_names = Array::Handle();
-  auto& dep_metadata = Instance::Handle();
-  auto& dep = Instance::Handle();
-  const auto& no_prefix = LibraryPrefix::Handle();
-
-  for (intptr_t i = 0, n = metadata.Length(); i < n; ++i) {
-    desc ^= metadata.At(i);
-    // Each dependency is represented as an array with the following layout:
-    //  [0] = target library URI (String)
-    //  [1] = is_export (bool)
-    //  [2] = is_deferred (bool)
-    //  [3] = prefix (String or null)
-    //  [4] = list of show names (List<String>)
-    //  [5] = list of hide names (List<String>)
-    //  [6] = annotations
-    // The library dependencies are encoded by getLibraryAnnotations(),
-    // pkg/vm/lib/bytecode/gen_bytecode.dart.
-    target_uri ^= desc.At(0);
-    is_export ^= desc.At(1);
-    is_deferred ^= desc.At(2);
-    prefix_name ^= desc.At(3);
-    show_names ^= desc.At(4);
-    hide_names ^= desc.At(5);
-    dep_metadata ^= desc.At(6);
-
-    importee = Library::LookupLibrary(thread, target_uri);
-    if (importee.IsNull()) {
-      continue;
-    }
-    ASSERT(importee.Loaded());
-
-    dep = CreateLibraryDependencyMirror(
-        thread, lib_mirror, importee, show_names, hide_names, dep_metadata,
-        no_prefix, prefix_name, !is_export.value(), is_deferred.value());
-    if (!dep.IsNull()) {
-      deps.Add(dep);
-    }
-  }
-
-  return deps.raw();
-}
-
 DEFINE_NATIVE_ENTRY(LibraryMirror_fromPrefix, 0, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(LibraryPrefix, prefix,
                                arguments->NativeArgAt(0));
@@ -540,10 +471,6 @@
   GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(1));
   const Library& lib = Library::Handle(ref.GetLibraryReferent());
 
-  if (lib.is_declared_in_bytecode()) {
-    return CreateBytecodeLibraryDependencies(thread, lib, lib_mirror);
-  }
-
   Array& ports = Array::Handle();
   Namespace& ns = Namespace::Handle();
   Instance& dep = Instance::Handle();
@@ -900,7 +827,7 @@
 
   Type& instantiated_type =
       Type::Handle(Type::New(clz, type_args_obj, TokenPosition::kNoSource));
-  instantiated_type ^= ClassFinalizer::FinalizeType(clz, instantiated_type);
+  instantiated_type ^= ClassFinalizer::FinalizeType(instantiated_type);
   return instantiated_type.raw();
 }
 
@@ -1094,7 +1021,7 @@
   const Array& fields = Array::Handle(klass.fields());
   const intptr_t num_fields = fields.Length();
 
-  const Array& functions = Array::Handle(klass.functions());
+  const Array& functions = Array::Handle(klass.current_functions());
   const intptr_t num_functions = functions.Length();
 
   Instance& member_mirror = Instance::Handle();
@@ -1139,7 +1066,7 @@
     Exceptions::PropagateError(error);
   }
 
-  const Array& functions = Array::Handle(klass.functions());
+  const Array& functions = Array::Handle(klass.current_functions());
   const intptr_t num_functions = functions.Length();
 
   Instance& constructor_mirror = Instance::Handle();
@@ -1442,8 +1369,8 @@
     external_constructor_name = internal_constructor_name.raw();
   }
 
-  Function& lookup_constructor =
-      Function::Handle(klass.LookupFunction(internal_constructor_name));
+  Function& lookup_constructor = Function::Handle(
+      Resolver::ResolveFunction(zone, klass, internal_constructor_name));
 
   if (lookup_constructor.IsNull() ||
       (lookup_constructor.kind() != FunctionLayout::kConstructor) ||
diff --git a/runtime/lib/object.cc b/runtime/lib/object.cc
index f015232..cf1e6ff 100644
--- a/runtime/lib/object.cc
+++ b/runtime/lib/object.cc
@@ -255,7 +255,7 @@
 }
 
 DEFINE_NATIVE_ENTRY(Internal_reachabilityFence, 0, 1) {
-  return Object::null();
+  UNREACHABLE();
 }
 
 DEFINE_NATIVE_ENTRY(Internal_collectAllGarbage, 0, 0) {
@@ -385,7 +385,7 @@
     args.SetAt(1, extract);
   }
   const Object& result =
-      Object::Handle(zone, DartEntry::InvokeClosure(args, args_desc));
+      Object::Handle(zone, DartEntry::InvokeClosure(thread, args, args_desc));
   if (result.IsError()) {
     Exceptions::PropagateError(Error::Cast(result));
     UNREACHABLE();
diff --git a/runtime/lib/stacktrace.cc b/runtime/lib/stacktrace.cc
index c2d8657..eaa287c 100644
--- a/runtime/lib/stacktrace.cc
+++ b/runtime/lib/stacktrace.cc
@@ -63,6 +63,12 @@
   return StackTrace::New(code_array, pc_offset_array);
 }
 
+// Gets current stack trace for `thread`.
+// This functions itself handles the --causel-async-stacks case.
+// For --lazy-async-stacks see `CurrentSyncStackTraceLazy`.
+// For --no-causel-async-stacks see `CurrentSyncStackTrace`.
+// Extracts the causal async stack from the thread if any set, then prepends
+// the current sync. stack up until the current async function (if any).
 static StackTracePtr CurrentStackTrace(
     Thread* thread,
     bool for_async_function,
@@ -91,9 +97,13 @@
   // Determine the size of the stack trace.
   const intptr_t extra_frames = for_async_function ? 1 : 0;
   bool sync_async_end = false;
+  // Count frames until `async_function` and set whether the async function is
+  // running synchronously (i.e. hasn't yielded yet).
   const intptr_t synchronous_stack_trace_length = StackTraceUtils::CountFrames(
       thread, skip_frames, async_function, &sync_async_end);
 
+  ASSERT(synchronous_stack_trace_length > 0);
+
   const intptr_t capacity = synchronous_stack_trace_length +
                             extra_frames;  // For the asynchronous gap.
 
@@ -112,18 +122,21 @@
     write_cursor++;
   }
 
-  // Append the synchronous stack trace.
-  const intptr_t collected_frames_count = StackTraceUtils::CollectFrames(
-      thread, code_array, pc_offset_array, write_cursor,
-      synchronous_stack_trace_length, skip_frames);
+  // Prepend: synchronous stack trace + (cached) async stack trace.
 
-  write_cursor += collected_frames_count;
+  write_cursor +=
+      StackTraceUtils::CollectFrames(thread, code_array, pc_offset_array,
+                                     /*array_offset=*/write_cursor,
+                                     /*count=*/synchronous_stack_trace_length,
+                                     /*skip_frames=*/skip_frames);
 
   ASSERT(write_cursor == capacity);
 
   const StackTrace& result = StackTrace::Handle(
-      zone, StackTrace::New(code_array, pc_offset_array, async_stack_trace,
-                            sync_async_end));
+      zone,
+      StackTrace::New(code_array, pc_offset_array,
+                      /*async_link=*/async_stack_trace,
+                      /*skip_sync_start_in_parent_stack=*/sync_async_end));
 
   return result.raw();
 }
@@ -141,7 +154,7 @@
   if (!FLAG_causal_async_stacks) {
     // If causal async stacks are not enabled we should recognize this method
     // and never call to the NOP runtime.
-    // See kernel_to_il.cc/bytecode_reader.cc/interpreter.cc.
+    // See kernel_to_il.cc.
     UNREACHABLE();
   }
 #if !defined(PRODUCT)
@@ -180,7 +193,6 @@
   StackFrame* frame = frames.NextFrame();
   ASSERT(frame != NULL);  // We expect to find a dart invocation frame.
   Code& code = Code::Handle(zone);
-  Bytecode& bytecode = Bytecode::Handle(zone);
   Smi& offset = Smi::Handle(zone);
   for (; frame != NULL; frame = frames.NextFrame()) {
     if (!frame->IsDartFrame()) {
@@ -191,18 +203,9 @@
       continue;
     }
 
-    if (frame->is_interpreted()) {
-      bytecode = frame->LookupDartBytecode();
-      if (bytecode.function() == Function::null()) {
-        continue;
-      }
-      offset = Smi::New(frame->pc() - bytecode.PayloadStart());
-      code_list.Add(bytecode);
-    } else {
-      code = frame->LookupDartCode();
-      offset = Smi::New(frame->pc() - code.PayloadStart());
-      code_list.Add(code);
-    }
+    code = frame->LookupDartCode();
+    offset = Smi::New(frame->pc() - code.PayloadStart());
+    code_list.Add(code);
     pc_offset_list.Add(offset);
   }
 }
@@ -224,4 +227,12 @@
   return stacktrace;
 }
 
+bool HasStack() {
+  Thread* thread = Thread::Current();
+  StackFrameIterator frames(ValidationPolicy::kDontValidateFrames, thread,
+                            StackFrameIterator::kNoCrossThreadIteration);
+  StackFrame* frame = frames.NextFrame();
+  return frame != nullptr;
+}
+
 }  // namespace dart
diff --git a/runtime/lib/stacktrace.h b/runtime/lib/stacktrace.h
index 9c8abae..a804d62 100644
--- a/runtime/lib/stacktrace.h
+++ b/runtime/lib/stacktrace.h
@@ -21,6 +21,9 @@
 // Creates a StackTrace object to be attached to an exception.
 StackTracePtr GetStackTraceForException();
 
+// Returns false if there is no Dart stack available.
+bool HasStack();
+
 }  // namespace dart
 
 #endif  // RUNTIME_LIB_STACKTRACE_H_
diff --git a/runtime/lib/typed_data.cc b/runtime/lib/typed_data.cc
index b49b14e..d71d08e 100644
--- a/runtime/lib/typed_data.cc
+++ b/runtime/lib/typed_data.cc
@@ -178,7 +178,7 @@
 }
 
 // Native methods for typed data allocation are recognized and implemented
-// both in FlowGraphBuilder::BuildGraphOfRecognizedMethod and interpreter.
+// in FlowGraphBuilder::BuildGraphOfRecognizedMethod.
 // These bodies exist only to assert that they are not used.
 #define TYPED_DATA_NEW(name)                                                   \
   DEFINE_NATIVE_ENTRY(TypedData_##name##_new, 0, 2) {                          \
diff --git a/runtime/lib/vmservice.cc b/runtime/lib/vmservice.cc
index eae5565..8ffecd6 100644
--- a/runtime/lib/vmservice.cc
+++ b/runtime/lib/vmservice.cc
@@ -72,7 +72,7 @@
 DEFINE_NATIVE_ENTRY(VMService_SendObjectRootServiceMessage, 0, 1) {
 #ifndef PRODUCT
   GET_NON_NULL_NATIVE_ARGUMENT(Array, message, arguments->NativeArgAt(0));
-    return Service::HandleObjectRootMessage(message);
+  return Service::HandleObjectRootMessage(message);
 #endif
   return Object::null();
 }
@@ -307,16 +307,12 @@
   DISALLOW_COPY_AND_ASSIGN(TarArchive);
 };
 
-static void ContentsFinalizer(void* isolate_callback_data,
-                              Dart_WeakPersistentHandle handle,
-                              void* peer) {
+static void ContentsFinalizer(void* isolate_callback_data, void* peer) {
   uint8_t* data = reinterpret_cast<uint8_t*>(peer);
   delete[] data;
 }
 
-static void FilenameFinalizer(void* isolate_callback_data,
-                              Dart_WeakPersistentHandle handle,
-                              void* peer) {
+static void FilenameFinalizer(void* isolate_callback_data, void* peer) {
   char* filename = reinterpret_cast<char*>(peer);
   delete[] filename;
 }
diff --git a/runtime/observatory/BUILD.gn b/runtime/observatory/BUILD.gn
index 1762e1a..360863c 100644
--- a/runtime/observatory/BUILD.gn
+++ b/runtime/observatory/BUILD.gn
@@ -37,6 +37,8 @@
     "-o",
     rebase_path(output),
     "--packages=" + rebase_path("../../.packages"),
+    "--enable-experiment=non-nullable",
+    "--no-sound-null-safety",
   ]
   if (is_debug) {
     args += [ "--enable-asserts" ]
diff --git a/runtime/observatory/analysis_options.yaml b/runtime/observatory/analysis_options.yaml
index 6babf28..13bad8a 100644
--- a/runtime/observatory/analysis_options.yaml
+++ b/runtime/observatory/analysis_options.yaml
@@ -1,7 +1,10 @@
 analyzer:
+  enable-experiment:
+    - non-nullable
   errors:
     dead_code: ignore
     unused_local_variable: ignore
+    getter_not_subtype_setter_types: ignore
   exclude:
     - tests/service/bad_reload/v2/main.dart
     - tests/service/complex_reload/v2/main.dart
diff --git a/runtime/observatory/bin/heap_snapshot.dart b/runtime/observatory/bin/heap_snapshot.dart
index 22d3ce5..b5aaf93 100644
--- a/runtime/observatory/bin/heap_snapshot.dart
+++ b/runtime/observatory/bin/heap_snapshot.dart
@@ -22,14 +22,14 @@
 
   reader.onProgress.listen(print);
 
-  ws.listen((dynamic response) {
-    if (response is String) {
-      response = json.decode(response);
+  ws.listen((dynamic dynResponse) {
+    if (dynResponse is String) {
+      final response = json.decode(dynResponse);
       if (response['id'] == 1) {
         getVM.complete(response['result']['isolates'][0]['id']);
       }
-    } else if (response is List<int>) {
-      response = new Uint8List.fromList(response);
+    } else if (dynResponse is List<int>) {
+      final response = new Uint8List.fromList(dynResponse);
       final dataOffset =
           new ByteData.view(response.buffer).getUint32(0, Endian.little);
       dynamic metadata = new Uint8List.view(response.buffer, 4, dataOffset - 4);
diff --git a/runtime/observatory/bin/shell.dart b/runtime/observatory/bin/shell.dart
index a0cb274..d6c551f 100644
--- a/runtime/observatory/bin/shell.dart
+++ b/runtime/observatory/bin/shell.dart
@@ -30,7 +30,7 @@
 void main() {
   String addr = 'ws://localhost:8181/ws';
   new WebSocketVM(new WebSocketVMTarget(addr)).load().then((serviceObject) {
-    VM vm = serviceObject;
+    VM vm = serviceObject as VM;
     Isolate isolate = vm.isolates.first;
     repl(vm, isolate, 'isolate ${isolate.id}');
   });
diff --git a/runtime/observatory/lib/event.dart b/runtime/observatory/lib/event.dart
index e79b16b..71bed82 100644
--- a/runtime/observatory/lib/event.dart
+++ b/runtime/observatory/lib/event.dart
@@ -108,7 +108,7 @@
   final bool atAsyncSuspension;
 
   /// [optional]
-  final M.Breakpoint breakpoint;
+  final M.Breakpoint? breakpoint;
   PauseBreakpointEvent(
       this.timestamp,
       this.isolate,
@@ -128,7 +128,7 @@
 class PauseInterruptedEvent implements M.PauseInterruptedEvent {
   final DateTime timestamp;
   final M.IsolateRef isolate;
-  final M.Frame topFrame;
+  final M.Frame? topFrame;
   final bool atAsyncSuspension;
   PauseInterruptedEvent(
       this.timestamp, this.isolate, this.topFrame, this.atAsyncSuspension) {
@@ -141,7 +141,7 @@
 class PausePostRequestEvent implements M.PausePostRequestEvent {
   final DateTime timestamp;
   final M.IsolateRef isolate;
-  final M.Frame topFrame;
+  final M.Frame? topFrame;
   final bool atAsyncSuspension;
   PausePostRequestEvent(
       this.timestamp, this.isolate, this.topFrame, this.atAsyncSuspension) {
@@ -168,7 +168,7 @@
 class ResumeEvent implements M.ResumeEvent {
   final DateTime timestamp;
   final M.IsolateRef isolate;
-  final M.Frame topFrame;
+  final M.Frame? topFrame;
   ResumeEvent(this.timestamp, this.isolate, this.topFrame) {
     assert(timestamp != null);
     assert(isolate != null);
@@ -309,69 +309,71 @@
   }
 }
 
-M.Event createEventFromServiceEvent(S.ServiceEvent event) {
+M.Event? createEventFromServiceEvent(S.ServiceEvent event) {
   switch (event.kind) {
     case S.ServiceEvent.kVMUpdate:
-      return new VMUpdateEvent(event.timestamp, event.vm);
+      return new VMUpdateEvent(event.timestamp!, event.vm);
     case S.ServiceEvent.kIsolateStart:
-      return new IsolateStartEvent(event.timestamp, event.isolate);
+      return new IsolateStartEvent(event.timestamp!, event.isolate!);
     case S.ServiceEvent.kIsolateRunnable:
-      return new IsolateRunnableEvent(event.timestamp, event.isolate);
+      return new IsolateRunnableEvent(event.timestamp!, event.isolate!);
     case S.ServiceEvent.kIsolateUpdate:
-      return new IsolateUpdateEvent(event.timestamp, event.isolate);
+      return new IsolateUpdateEvent(event.timestamp!, event.isolate!);
     case S.ServiceEvent.kIsolateReload:
       return new IsolateReloadEvent(
-          event.timestamp, event.isolate, event.error);
+          event.timestamp!, event.isolate!, event.error!);
     case S.ServiceEvent.kIsolateExit:
-      return new IsolateExitEvent(event.timestamp, event.isolate);
+      return new IsolateExitEvent(event.timestamp!, event.isolate!);
     case S.ServiceEvent.kBreakpointAdded:
       return new BreakpointAddedEvent(
-          event.timestamp, event.isolate, event.breakpoint);
+          event.timestamp!, event.isolate!, event.breakpoint!);
     case S.ServiceEvent.kBreakpointResolved:
       return new BreakpointResolvedEvent(
-          event.timestamp, event.isolate, event.breakpoint);
+          event.timestamp!, event.isolate!, event.breakpoint!);
     case S.ServiceEvent.kBreakpointRemoved:
       return new BreakpointRemovedEvent(
-          event.timestamp, event.isolate, event.breakpoint);
+          event.timestamp!, event.isolate!, event.breakpoint!);
     case S.ServiceEvent.kDebuggerSettingsUpdate:
-      return new DebuggerSettingsUpdateEvent(event.timestamp, event.isolate);
+      return new DebuggerSettingsUpdateEvent(event.timestamp!, event.isolate!);
     case S.ServiceEvent.kResume:
-      return new ResumeEvent(event.timestamp, event.isolate, event.topFrame);
+      return new ResumeEvent(event.timestamp!, event.isolate!, event.topFrame);
     case S.ServiceEvent.kPauseStart:
-      return new PauseStartEvent(event.timestamp, event.isolate);
+      return new PauseStartEvent(event.timestamp!, event.isolate!);
     case S.ServiceEvent.kPauseExit:
-      return new PauseExitEvent(event.timestamp, event.isolate);
+      return new PauseExitEvent(event.timestamp!, event.isolate!);
     case S.ServiceEvent.kPausePostRequest:
-      return new PausePostRequestEvent(event.timestamp, event.isolate,
-          event.topFrame, event.atAsyncSuspension);
+      return new PausePostRequestEvent(event.timestamp!, event.isolate!,
+          event.topFrame, event.atAsyncSuspension!);
     case S.ServiceEvent.kPauseBreakpoint:
       return new PauseBreakpointEvent(
-          event.timestamp,
-          event.isolate,
-          event.pauseBreakpoints,
-          event.topFrame,
-          event.atAsyncSuspension,
+          event.timestamp!,
+          event.isolate!,
+          event.pauseBreakpoints!,
+          event.topFrame!,
+          event.atAsyncSuspension!,
           event.breakpoint);
     case S.Isolate.kLoggingStream:
-      return new LoggingEvent(event.timestamp, event.isolate, event.logRecord);
+      return new LoggingEvent(
+          event.timestamp!, event.isolate!, event.logRecord!);
     case S.ServiceEvent.kPauseInterrupted:
-      return new PauseInterruptedEvent(event.timestamp, event.isolate,
-          event.topFrame, event.atAsyncSuspension);
+      return new PauseInterruptedEvent(event.timestamp!, event.isolate!,
+          event.topFrame, event.atAsyncSuspension!);
     case S.ServiceEvent.kPauseException:
       return new PauseExceptionEvent(
-          event.timestamp, event.isolate, event.topFrame, event.exception);
+          event.timestamp!, event.isolate!, event.topFrame!, event.exception!);
     case S.ServiceEvent.kInspect:
-      return new InspectEvent(event.timestamp, event.isolate, event.inspectee);
+      return new InspectEvent(
+          event.timestamp!, event.isolate!, event.inspectee!);
     case S.ServiceEvent.kGC:
-      return new GCEvent(event.timestamp, event.isolate);
+      return new GCEvent(event.timestamp!, event.isolate!);
     case S.ServiceEvent.kServiceRegistered:
       return new ServiceRegisteredEvent(
-          event.timestamp, event.service, event.method, event.alias);
+          event.timestamp!, event.service!, event.method!, event.alias!);
     case S.ServiceEvent.kServiceUnregistered:
       return new ServiceUnregisteredEvent(
-          event.timestamp, event.service, event.method);
+          event.timestamp!, event.service!, event.method!);
     case S.ServiceEvent.kNone:
-      return new NoneEvent(event.timestamp, event.isolate);
+      return new NoneEvent(event.timestamp!, event.isolate!);
     default:
       // Ignore unrecognized events.
       Logger.root.severe('Unrecognized event: $event');
diff --git a/runtime/observatory/lib/object_graph.dart b/runtime/observatory/lib/object_graph.dart
index 0e891ce..f0adee0 100644
--- a/runtime/observatory/lib/object_graph.dart
+++ b/runtime/observatory/lib/object_graph.dart
@@ -22,7 +22,7 @@
 
 class _SnapshotReader implements SnapshotReader {
   bool _closed = false;
-  var _chunks = <Uint8List>[];
+  List<Uint8List>? _chunks = <Uint8List>[];
   final _onProgress = new StreamController<String>.broadcast();
   final _done = new Completer<SnapshotGraph>();
 
@@ -32,8 +32,8 @@
     if (_closed) {
       throw new StateError("Stream is closed");
     }
-    _chunks.add(chunk);
-    _onProgress.add("Receiving snapshot chunk ${_chunks.length}...");
+    _chunks!.add(chunk);
+    _onProgress.add("Receiving snapshot chunk ${_chunks!.length}...");
 
     // TODO(rmacnak): Incremental loading.
   }
@@ -45,7 +45,7 @@
     _closed = true;
 
     var graph = new _SnapshotGraph._new();
-    var chunks = _chunks;
+    var chunks = _chunks!;
     _chunks = null; // Let the binary chunks be GCable.
     _done.complete(graph._load(chunks, _onProgress));
     return _done.future;
@@ -270,39 +270,39 @@
   int get hashCode => _id ^ _graph.hashCode;
 
   int get shallowSize => internalSize + externalSize;
-  int get internalSize => _graph._internalSizes[_id];
-  int get externalSize => _graph._externalSizes[_id];
-  int get retainedSize => _graph._retainedSizes[_id];
+  int get internalSize => _graph._internalSizes![_id];
+  int get externalSize => _graph._externalSizes![_id];
+  int get retainedSize => _graph._retainedSizes![_id];
 
   String get description => _graph._describeObject(_id);
-  SnapshotClass get klass => _graph._classes[_graph._cids[_id]];
+  SnapshotClass get klass => _graph._classes![_graph._cids![_id]]!;
 
   Iterable<SnapshotObject> get successors sync* {
     final id = _id;
-    final cid = _graph._cids[id];
-    final startSuccIndex = _graph._firstSuccs[id];
-    final limitSuccIndex = _graph._firstSuccs[id + 1];
+    final cid = _graph._cids![id];
+    final startSuccIndex = _graph._firstSuccs![id];
+    final limitSuccIndex = _graph._firstSuccs![id + 1];
     for (var nextSuccIndex = startSuccIndex;
         nextSuccIndex < limitSuccIndex;
         nextSuccIndex++) {
       final index = nextSuccIndex - startSuccIndex;
-      final succId = _graph._succs[nextSuccIndex];
+      final succId = _graph._succs![nextSuccIndex];
       final name = _graph._edgeName(cid, index);
       yield _SnapshotObject._new(succId, _graph, name);
     }
   }
 
   Iterable<SnapshotObject> get predecessors sync* {
-    var firstSuccs = _graph._firstSuccs;
-    var succs = _graph._succs;
+    var firstSuccs = _graph._firstSuccs!;
+    var succs = _graph._succs!;
     var id = _id;
-    var N = _graph._N;
+    var N = _graph._N!;
     for (var predId = 1; predId <= N; predId++) {
       var base = firstSuccs[predId];
       var limit = firstSuccs[predId + 1];
       for (var i = base; i < limit; i++) {
         if (succs[i] == id) {
-          var cid = _graph._cids[predId];
+          var cid = _graph._cids![predId];
           var name = _graph._edgeName(cid, i - base);
           yield _SnapshotObject._new(predId, _graph, name);
         }
@@ -314,12 +314,12 @@
     if (_id == _ROOT) {
       return this;
     }
-    return _SnapshotObject._new(_graph._doms[_id], _graph, "");
+    return _SnapshotObject._new(_graph._doms![_id], _graph, "");
   }
 
   Iterable<SnapshotObject> get children sync* {
-    var N = _graph._N;
-    var doms = _graph._doms;
+    var N = _graph._N!;
+    var doms = _graph._doms!;
     var parentId = _id;
     for (var childId = _ROOT; childId <= N; childId++) {
       if (doms[childId] == parentId) {
@@ -334,17 +334,17 @@
 }
 
 class _SyntheticSnapshotObject implements SnapshotObject {
-  String _description;
-  SnapshotClass _klass;
-  int _internalSize;
-  int _externalSize;
-  int _retainedSize;
-  List<SnapshotObject> _successors;
-  List<SnapshotObject> _predecessors;
-  SnapshotObject _parent;
-  List<SnapshotObject> _children;
+  late String _description;
+  late SnapshotClass _klass;
+  late int _internalSize;
+  late int _externalSize;
+  late int _retainedSize;
+  late List<SnapshotObject> _successors;
+  late List<SnapshotObject> _predecessors;
+  late SnapshotObject _parent;
+  late List<SnapshotObject> _children;
 
-  String get label => null;
+  String get label => "";
   String get description => _description;
   SnapshotClass get klass => _klass;
 
@@ -404,7 +404,7 @@
 class _SnapshotMergedDominator implements SnapshotMergedDominator {
   final int _id;
   final _SnapshotGraph _graph;
-  final _SnapshotMergedDominator _parent;
+  final _SnapshotMergedDominator? _parent;
 
   _SnapshotMergedDominator._new(this._id, this._graph, this._parent);
 
@@ -423,70 +423,78 @@
         : "$instanceCount instances of ${klass.name}";
   }
 
-  SnapshotClass get klass => _graph._classes[_graph._cids[_id]];
+  SnapshotClass get klass => _graph._classes![_graph._cids![_id]]!;
 
   int get shallowSize => internalSize + externalSize;
 
   int get internalSize {
-    var cids = _graph._cids;
+    var cids = _graph._cids!;
+    var internalSizes = _graph._internalSizes!;
+    var mergedDomNext = _graph._mergedDomNext!;
     var size = 0;
     var sibling = _id;
     while (sibling != _SENTINEL && cids[sibling] == cids[_id]) {
-      size += _graph._internalSizes[sibling];
-      sibling = _graph._mergedDomNext[sibling];
+      size += internalSizes[sibling];
+      sibling = mergedDomNext[sibling];
     }
     return size;
   }
 
   int get externalSize {
-    var cids = _graph._cids;
+    var cids = _graph._cids!;
+    var externalSizes = _graph._externalSizes!;
+    var mergedDomNext = _graph._mergedDomNext!;
     var size = 0;
     var sibling = _id;
     while (sibling != _SENTINEL && cids[sibling] == cids[_id]) {
-      size += _graph._externalSizes[sibling];
-      sibling = _graph._mergedDomNext[sibling];
+      size += externalSizes[sibling];
+      sibling = mergedDomNext[sibling];
     }
     return size;
   }
 
   int get retainedSize {
-    var cids = _graph._cids;
+    var cids = _graph._cids!;
+    var retainedSizes = _graph._retainedSizes!;
+    var mergedDomNext = _graph._mergedDomNext!;
     var size = 0;
     var sibling = _id;
     while (sibling != _SENTINEL && cids[sibling] == cids[_id]) {
-      size += _graph._retainedSizes[sibling];
-      sibling = _graph._mergedDomNext[sibling];
+      size += retainedSizes[sibling];
+      sibling = mergedDomNext[sibling];
     }
     return size;
   }
 
   int get instanceCount {
-    var cids = _graph._cids;
+    var cids = _graph._cids!;
+    var mergedDomNext = _graph._mergedDomNext!;
     var count = 0;
     var sibling = _id;
     while (sibling != _SENTINEL && cids[sibling] == cids[_id]) {
       count++;
-      sibling = _graph._mergedDomNext[sibling];
+      sibling = mergedDomNext[sibling];
     }
     return count;
   }
 
   Iterable<SnapshotObject> get objects sync* {
-    var cids = _graph._cids;
+    var cids = _graph._cids!;
+    var mergedDomNext = _graph._mergedDomNext!;
     var sibling = _id;
     while (sibling != _SENTINEL && cids[sibling] == cids[_id]) {
       yield _SnapshotObject._new(sibling, _graph, "");
-      sibling = _graph._mergedDomNext[sibling];
+      sibling = mergedDomNext[sibling];
     }
   }
 
   SnapshotMergedDominator get parent => _parent ?? this;
 
   Iterable<SnapshotMergedDominator> get children sync* {
-    var next = _graph._mergedDomNext;
-    var cids = _graph._cids;
+    var next = _graph._mergedDomNext!;
+    var cids = _graph._cids!;
     var prev = _SENTINEL;
-    var child = _graph._mergedDomHead[_id];
+    var child = _graph._mergedDomHead![_id];
     // Walk the list of children and look for the representative objects, i.e.
     // the first sibling of each cid.
     while (child != _SENTINEL) {
@@ -500,14 +508,14 @@
 }
 
 class _SyntheticSnapshotMergedDominator implements SnapshotMergedDominator {
-  String _description;
-  SnapshotClass _klass;
-  int _internalSize;
-  int _externalSize;
-  int _retainedSize;
-  List<SnapshotObject> _objects;
-  SnapshotMergedDominator _parent;
-  List<SnapshotMergedDominator> _children;
+  late String _description;
+  late SnapshotClass _klass;
+  late int _internalSize;
+  late int _externalSize;
+  late int _retainedSize;
+  late List<SnapshotObject> _objects;
+  late SnapshotMergedDominator _parent;
+  late List<SnapshotMergedDominator> _children;
 
   SnapshotClass get klass => _klass;
   String get description => _description;
@@ -560,9 +568,11 @@
   int get instanceCount => liveInstanceCount;
 
   Iterable<SnapshotObject> get instances sync* {
-    final N = _graph._N;
+    final N = _graph._N!;
+    final cids = _graph._cids!;
+    final retainedSizes = _graph._retainedSizes!;
     for (var id = 1; id <= N; id++) {
-      if (_graph._cids[id] == _cid && _graph._retainedSizes[id] > 0) {
+      if (cids[id] == _cid && retainedSizes[id] > 0) {
         yield _SnapshotObject._new(id, _graph, "");
       }
     }
@@ -613,36 +623,36 @@
 const _kUnknownFieldName = "<unknown>";
 
 class _SnapshotGraph implements SnapshotGraph {
-  List<Uint8List> _chunks;
-  List<Uint8List> get chunks => _chunks;
+  List<Uint8List>? _chunks;
+  List<Uint8List> get chunks => _chunks!;
 
   _SnapshotGraph._new();
 
-  String get description => _description;
+  String get description => _description!;
 
-  int get size => _liveInternalSize + _liveExternalSize;
-  int get internalSize => _liveInternalSize;
-  int get externalSize => _liveExternalSize;
-  int get capacity => _capacity;
+  int get size => _liveInternalSize! + _liveExternalSize!;
+  int get internalSize => _liveInternalSize!;
+  int get externalSize => _liveExternalSize!;
+  int get capacity => _capacity!;
 
   SnapshotObject get root => _SnapshotObject._new(_ROOT, this, "Root");
   SnapshotMergedDominator get mergedRoot =>
       _SnapshotMergedDominator._new(_ROOT, this, null);
 
-  SnapshotObject _extendedRoot;
+  SnapshotObject? _extendedRoot;
   SnapshotObject get extendedRoot {
     if (_extendedRoot == null) {
       _createExtended();
     }
-    return _extendedRoot;
+    return _extendedRoot!;
   }
 
-  SnapshotMergedDominator _extendedMergedRoot;
+  SnapshotMergedDominator? _extendedMergedRoot;
   SnapshotMergedDominator get extendedMergedRoot {
     if (_extendedMergedRoot == null) {
       _createExtended();
     }
-    return _extendedMergedRoot;
+    return _extendedMergedRoot!;
   }
 
   void _createExtended() {
@@ -657,8 +667,8 @@
 
     capacity._description = "Capacity + External";
     capacity._klass = live.klass;
-    capacity._internalSize = _capacity;
-    capacity._externalSize = _totalExternalSize;
+    capacity._internalSize = _capacity!;
+    capacity._externalSize = _totalExternalSize!;
     capacity._retainedSize = capacity._internalSize + capacity._externalSize;
     capacity._successors = <SnapshotObject>[live, uncollected, fragmentation];
     capacity._predecessors = <SnapshotObject>[];
@@ -666,8 +676,8 @@
 
     mcapacity._description = "Capacity + External";
     mcapacity._klass = mlive.klass;
-    mcapacity._internalSize = _capacity;
-    mcapacity._externalSize = _totalExternalSize;
+    mcapacity._internalSize = _capacity!;
+    mcapacity._externalSize = _totalExternalSize!;
     mcapacity._retainedSize = mcapacity._internalSize + mcapacity._externalSize;
     mcapacity._children = <SnapshotMergedDominator>[
       mlive,
@@ -678,8 +688,8 @@
 
     uncollected._description = "Uncollected Garbage";
     uncollected._klass = live.klass;
-    uncollected._internalSize = _totalInternalSize - _liveInternalSize;
-    uncollected._externalSize = _totalExternalSize - _liveExternalSize;
+    uncollected._internalSize = _totalInternalSize! - _liveInternalSize!;
+    uncollected._externalSize = _totalExternalSize! - _liveExternalSize!;
     uncollected._retainedSize =
         uncollected._internalSize + uncollected._externalSize;
     uncollected._successors = <SnapshotObject>[];
@@ -689,8 +699,8 @@
 
     muncollected._description = "Uncollected Garbage";
     muncollected._klass = mlive.klass;
-    muncollected._internalSize = _totalInternalSize - _liveInternalSize;
-    muncollected._externalSize = _totalExternalSize - _liveExternalSize;
+    muncollected._internalSize = _totalInternalSize! - _liveInternalSize!;
+    muncollected._externalSize = _totalExternalSize! - _liveExternalSize!;
     muncollected._retainedSize =
         muncollected._internalSize + muncollected._externalSize;
     muncollected._parent = mcapacity;
@@ -699,7 +709,7 @@
 
     fragmentation._description = "Free";
     fragmentation._klass = live.klass;
-    fragmentation._internalSize = _capacity - _totalInternalSize;
+    fragmentation._internalSize = _capacity! - _totalInternalSize!;
     fragmentation._externalSize = 0;
     fragmentation._retainedSize = fragmentation._internalSize;
     fragmentation._successors = <SnapshotObject>[];
@@ -709,7 +719,7 @@
 
     mfragmentation._description = "Free";
     mfragmentation._klass = mlive.klass;
-    mfragmentation._internalSize = _capacity - _totalInternalSize;
+    mfragmentation._internalSize = _capacity! - _totalInternalSize!;
     mfragmentation._externalSize = 0;
     mfragmentation._retainedSize = mfragmentation._internalSize;
     mfragmentation._parent = mcapacity;
@@ -721,9 +731,10 @@
   }
 
   Iterable<SnapshotObject> get objects sync* {
-    final N = _N;
+    final N = _N!;
+    final retainedSizes = _retainedSizes!;
     for (var id = 1; id <= N; id++) {
-      if (_retainedSizes[id] > 0) {
+      if (retainedSizes[id] > 0) {
         yield _SnapshotObject._new(id, this, "");
       }
     }
@@ -737,7 +748,7 @@
       return _kRootName;
     }
     var cls = _className(oid);
-    var data = _nonReferenceData[oid];
+    var data = _nonReferenceData![oid];
     if (data == null) {
       return cls;
     } else {
@@ -746,8 +757,8 @@
   }
 
   String _className(int oid) {
-    var cid = _cids[oid];
-    var cls = _classes[cid];
+    var cid = _cids![oid];
+    var cls = _classes![cid];
     if (cls == null) {
       return "Class$cid";
     }
@@ -755,7 +766,7 @@
   }
 
   String _edgeName(int cid, int index) {
-    var c = _classes[cid];
+    var c = _classes![cid];
     if (c == null) {
       return _kUnknownFieldName;
     }
@@ -767,7 +778,7 @@
   }
 
   Iterable<SnapshotClass> get classes sync* {
-    for (final c in _classes) {
+    for (final c in _classes!) {
       // Not all CIDs are occupied.
       if (c != null) {
         yield c;
@@ -776,9 +787,9 @@
   }
 
   Future<SnapshotGraph> _load(
-      List<Uint8List> chunks, StreamController<String> onProgress) async {
+      List<Uint8List>? chunks, StreamController<String> onProgress) async {
     _chunks = chunks;
-    var stream = _ReadStream._new(chunks);
+    _ReadStream? stream = _ReadStream._new(chunks!);
     chunks = null;
 
     // The phases of loading are placed in explicit `new Future(compuation)` so
@@ -786,13 +797,13 @@
     // defer to the microtask loop.
 
     onProgress.add("Loading classes...");
-    await new Future(() => _readClasses(stream));
+    await new Future(() => _readClasses(stream!));
 
     onProgress.add("Loading objects...");
-    await new Future(() => _readObjects(stream));
+    await new Future(() => _readObjects(stream!));
 
     onProgress.add("Loading external properties...");
-    await new Future(() => _readExternalProperties(stream));
+    await new Future(() => _readExternalProperties(stream!));
 
     stream = null;
 
@@ -839,46 +850,46 @@
     return this;
   }
 
-  Uint8List _encoded;
+  Uint8List? _encoded;
 
-  String _description;
+  String? _description;
 
-  int _kStackCid;
-  int _kFieldCid;
-  int _numCids;
-  int _N; // Objects in the snapshot.
-  int _Nconnected; // Objects reachable from root.
-  int _E; // References in the snapshot.
+  int? _kStackCid;
+  int? _kFieldCid;
+  int? _numCids;
+  int? _N; // Objects in the snapshot.
+  int? _Nconnected; // Objects reachable from root.
+  int? _E; // References in the snapshot.
 
-  int _capacity;
-  int _liveInternalSize;
-  int _liveExternalSize;
-  int _totalInternalSize;
-  int _totalExternalSize;
+  int? _capacity;
+  int? _liveInternalSize;
+  int? _liveExternalSize;
+  int? _totalInternalSize;
+  int? _totalExternalSize;
 
-  List<_SnapshotClass> _classes;
+  List<_SnapshotClass?>? _classes;
 
   // Indexed by node id, with id 0 representing invalid/uninitialized.
   // From snapshot.
-  List _nonReferenceData;
-  Uint16List _cids;
-  Uint32List _internalSizes;
-  Uint32List _externalSizes;
-  Uint32List _firstSuccs;
-  Uint32List _succs;
+  List? _nonReferenceData;
+  Uint16List? _cids;
+  Uint32List? _internalSizes;
+  Uint32List? _externalSizes;
+  Uint32List? _firstSuccs;
+  Uint32List? _succs;
 
   // Intermediates.
-  Uint32List _vertex;
-  Uint32List _parent;
-  Uint32List _semi;
-  Uint32List _firstPreds; // Offset into preds.
-  Uint32List _preds;
+  Uint32List? _vertex;
+  Uint32List? _parent;
+  Uint32List? _semi;
+  Uint32List? _firstPreds; // Offset into preds.
+  Uint32List? _preds;
 
   // Outputs.
-  Uint32List _doms;
-  Uint32List _retainedSizes;
-  Uint32List _mergedDomHead;
-  Uint32List _mergedDomNext;
+  Uint32List? _doms;
+  Uint32List? _retainedSizes;
+  Uint32List? _mergedDomHead;
+  Uint32List? _mergedDomNext;
 
   void _readClasses(_ReadStream stream) {
     for (var i = 0; i < 8; i++) {
@@ -892,7 +903,7 @@
     _totalExternalSize = stream.readUnsigned();
 
     var K = stream.readUnsigned();
-    var classes = new List<_SnapshotClass>.filled(K + 1, null);
+    var classes = new List<_SnapshotClass?>.filled(K + 1, null);
     classes[0] = _SnapshotClass._new(this, 0, "Root", "", "");
 
     for (var cid = 1; cid <= K; cid++) {
@@ -935,7 +946,7 @@
 
     var internalSizes = _newUint32Array(N + 1);
     var cids = _newUint16Array(N + 1);
-    var nonReferenceData = new List(N + 1);
+    var nonReferenceData = new List<dynamic>.filled(N + 1, null);
     var firstSuccs = _newUint32Array(N + 2);
     var succs = _newUint32Array(E);
     var eid = 0;
@@ -1011,7 +1022,7 @@
   }
 
   void _readExternalProperties(_ReadStream stream) {
-    final N = _N;
+    final N = _N!;
     final externalPropertyCount = stream.readUnsigned();
 
     final externalSizes = _newUint32Array(N + 1);
@@ -1026,11 +1037,11 @@
   }
 
   void _computeClassTable() {
-    final N = _N;
-    final classes = _classes;
-    final cids = _cids;
-    final internalSizes = _internalSizes;
-    final externalSizes = _externalSizes;
+    final N = _N!;
+    final classes = _classes!;
+    final cids = _cids!;
+    final internalSizes = _internalSizes!;
+    final externalSizes = _externalSizes!;
     var totalInternalSize = 0;
     var totalExternalSize = 0;
 
@@ -1041,7 +1052,7 @@
       var externalSize = externalSizes[oid];
       totalExternalSize += externalSize;
 
-      var cls = classes[cids[oid]];
+      var cls = classes[cids[oid]]!;
       cls.totalInternalSize += internalSize;
       cls.totalExternalSize += externalSize;
       cls.totalInstanceCount++;
@@ -1052,9 +1063,9 @@
   }
 
   void _dfs() {
-    final N = _N;
-    final firstSuccs = _firstSuccs;
-    final succs = _succs;
+    final N = _N!;
+    final firstSuccs = _firstSuccs!;
+    final succs = _succs!;
 
     final stackNodes = _newUint32Array(N);
     final stackCurrentEdgePos = _newUint32Array(N);
@@ -1142,11 +1153,11 @@
   }
 
   void _buildPredecessors() {
-    final N = _N;
-    final Nconnected = _Nconnected;
-    final E = _E;
-    final firstSuccs = _firstSuccs;
-    final succs = _succs;
+    final N = _N!;
+    final Nconnected = _Nconnected!;
+    final E = _E!;
+    final firstSuccs = _firstSuccs!;
+    final succs = _succs!;
 
     // This is first filled with the predecessor counts, then reused to hold the
     // offset to the first predecessor (see alias below).
@@ -1201,17 +1212,17 @@
   // Fold the size of any object with in-degree(1) into its parent.
   // Requires the DFS numbering and predecessor lists.
   void _buildOwnedSizes() {
-    final N = _N;
-    final Nconnected = _Nconnected;
+    final N = _N!;
+    final Nconnected = _Nconnected!;
     final kStackCid = _kStackCid;
     final kFieldCid = _kFieldCid;
 
-    final cids = _cids;
-    final internalSizes = _internalSizes;
-    final externalSizes = _externalSizes;
-    final vertex = _vertex;
-    final firstPreds = _firstPreds;
-    final preds = _preds;
+    final cids = _cids!;
+    final internalSizes = _internalSizes!;
+    final externalSizes = _externalSizes!;
+    final vertex = _vertex!;
+    final firstPreds = _firstPreds!;
+    final preds = _preds!;
 
     final ownedSizes = _newUint32Array(N + 1);
     for (var i = 1; i <= Nconnected; i++) {
@@ -1256,11 +1267,11 @@
 
     // TODO(rmacnak): Maybe keep the per-objects sizes to be able to provide
     // examples of large owners for each class.
-    final classes = _classes;
+    final classes = _classes!;
     for (var i = 1; i <= Nconnected; i++) {
       final v = vertex[i];
       final cid = cids[v];
-      final cls = classes[cid];
+      final cls = classes[cid]!;
       cls.ownedSize += ownedSizes[v];
     }
   }
@@ -1342,14 +1353,14 @@
   // T. Lengauer and R. E. Tarjan. "A Fast Algorithm for Finding Dominators
   // in a Flowgraph."
   void _buildDominators() {
-    final N = _N;
-    final Nconnected = _Nconnected;
+    final N = _N!;
+    final Nconnected = _Nconnected!;
 
-    final vertex = _vertex;
-    final semi = _semi;
-    final parent = _parent;
-    final firstPreds = _firstPreds;
-    final preds = _preds;
+    final vertex = _vertex!;
+    final semi = _semi!;
+    final parent = _parent!;
+    final firstPreds = _firstPreds!;
+    final preds = _preds!;
 
     final dom = _newUint32Array(N + 1);
 
@@ -1358,7 +1369,7 @@
     for (var i = 1; i <= N; i++) {
       label[i] = i;
     }
-    final buckets = new List(N + 1);
+    final buckets = new List<dynamic>.filled(N + 1, null);
     final child = _newUint32Array(N + 1);
     final size = _newUint32Array(N + 1);
     for (var i = 1; i <= N; i++) {
@@ -1385,7 +1396,7 @@
       // w.semi.bucket.add(w);
       var tmp = vertex[semi[w]];
       if (buckets[tmp] == null) {
-        buckets[tmp] = new List();
+        buckets[tmp] = [];
       }
       buckets[tmp].add(w);
 
@@ -1417,17 +1428,17 @@
   }
 
   void _calculateRetainedSizes() {
-    final N = _N;
-    final Nconnected = _Nconnected;
+    final N = _N!;
+    final Nconnected = _Nconnected!;
 
     var liveInternalSize = 0;
     var liveExternalSize = 0;
-    final classes = _classes;
-    final cids = _cids;
-    final internalSizes = _internalSizes;
-    final externalSizes = _externalSizes;
-    final vertex = _vertex;
-    final doms = _doms;
+    final classes = _classes!;
+    final cids = _cids!;
+    final internalSizes = _internalSizes!;
+    final externalSizes = _externalSizes!;
+    final vertex = _vertex!;
+    final doms = _doms!;
 
     // Sum internal and external sizes.
     for (var i = 1; i <= Nconnected; i++) {
@@ -1437,7 +1448,7 @@
       liveInternalSize += internalSize;
       liveExternalSize += externalSize;
 
-      var cls = classes[cids[v]];
+      var cls = classes[cids[v]]!;
       cls.liveInternalSize += internalSize;
       cls.liveExternalSize += externalSize;
       cls.liveInstanceCount++;
@@ -1468,18 +1479,18 @@
     _liveInternalSize = liveInternalSize;
     _liveExternalSize = liveExternalSize;
 
-    print("internal-garbage: ${_totalInternalSize - _liveInternalSize}");
-    print("external-garbage: ${_totalExternalSize - _liveExternalSize}");
-    print("fragmentation: ${_capacity - _totalInternalSize}");
-    assert(_liveInternalSize <= _totalInternalSize);
-    assert(_liveExternalSize <= _totalExternalSize);
-    assert(_totalInternalSize <= _capacity);
+    print("internal-garbage: ${_totalInternalSize! - _liveInternalSize!}");
+    print("external-garbage: ${_totalExternalSize! - _liveExternalSize!}");
+    print("fragmentation: ${_capacity! - _totalInternalSize!}");
+    assert(_liveInternalSize! <= _totalInternalSize!);
+    assert(_liveExternalSize! <= _totalExternalSize!);
+    assert(_totalInternalSize! <= _capacity!);
   }
 
   // Build linked lists of the children for each node in the dominator tree.
   void _linkDominatorChildren() {
-    final N = _N;
-    final doms = _doms;
+    final N = _N!;
+    final doms = _doms!;
     final head = _newUint32Array(N + 1);
     final next = _newUint32Array(N + 1);
 
@@ -1533,10 +1544,10 @@
   }
 
   void _sortDominatorChildren() {
-    final N = _N;
-    final cids = _cids;
-    final head = _mergedDomHead;
-    final next = _mergedDomNext;
+    final N = _N!;
+    final cids = _cids!;
+    final head = _mergedDomHead!;
+    final next = _mergedDomNext!;
 
     // Returns the new head of the sorted list.
     int sort(int head) {
@@ -1570,10 +1581,10 @@
   }
 
   void _mergeDominatorSiblings() {
-    var N = _N;
-    var cids = _cids;
-    var head = _mergedDomHead;
-    var next = _mergedDomNext;
+    var N = _N!;
+    var cids = _cids!;
+    var head = _mergedDomHead!;
+    var next = _mergedDomNext!;
     var workStack = _newUint32Array(N);
     var workStackTop = 0;
 
diff --git a/runtime/observatory/lib/service_common.dart b/runtime/observatory/lib/service_common.dart
index 2ff8175..236343c 100644
--- a/runtime/observatory/lib/service_common.dart
+++ b/runtime/observatory/lib/service_common.dart
@@ -26,9 +26,9 @@
   bool get standalone => !chrome;
 
   // User defined name.
-  String name;
+  late String name;
   // Network address of VM.
-  String networkAddress;
+  late String networkAddress;
 
   WebSocketVMTarget(this.networkAddress) {
     name = networkAddress;
@@ -89,7 +89,7 @@
 
   String get displayName => '${name}@${target.name}';
 
-  CommonWebSocket _webSocket;
+  CommonWebSocket? _webSocket;
 
   CommonWebSocketVM(this.target, this._webSocket) {
     assert(target != null);
@@ -120,7 +120,7 @@
   void disconnect({String reason: 'WebSocket closed'}) {
     if (_hasInitiatedConnect) {
       if (_webSocket != null) {
-        _webSocket.close();
+        _webSocket!.close();
       }
     }
     // We don't need to cancel requests and notify here.  These
@@ -135,8 +135,8 @@
     if (!_hasInitiatedConnect) {
       _hasInitiatedConnect = true;
       try {
-        await _webSocket.connect(
-            target, _onOpen, _onMessage, _onError, _onClose);
+        await _webSocket!
+            .connect(target, _onOpen, _onMessage, _onError, _onClose);
       } catch (_, stack) {
         _webSocket = null;
         var exception = new NetworkRpcException('WebSocket closed');
@@ -150,7 +150,7 @@
     }
     String serial = (_requestSerial++).toString();
     var request = new _WebSocketRequest(method, params);
-    if ((_webSocket != null) && _webSocket.isOpen) {
+    if ((_webSocket != null) && _webSocket!.isOpen) {
       // Already connected, send request immediately.
       _sendRequest(serial, request);
     } else {
@@ -180,7 +180,7 @@
     _notifyConnect();
   }
 
-  Map _parseJSON(String message) {
+  Map? _parseJSON(String message) {
     var map;
     try {
       map = json.decode(message);
@@ -198,7 +198,7 @@
   }
 
   void _onBinaryMessage(dynamic data) {
-    _webSocket.nonStringToByteData(data).then((ByteData bytes) {
+    _webSocket!.nonStringToByteData(data).then((ByteData bytes) {
       var metadataOffset = 4;
       var dataOffset = bytes.getUint32(0, Endian.little);
       var metadataLength = dataOffset - metadataOffset;
@@ -292,7 +292,7 @@
 
   /// Send all delayed requests.
   void _sendAllDelayedRequests() {
-    assert(_webSocket.isOpen);
+    assert(_webSocket!.isOpen);
     if (_delayedRequests.length == 0) {
       return;
     }
@@ -305,7 +305,7 @@
 
   /// Send the request over WebSocket.
   void _sendRequest(String serial, _WebSocketRequest request) {
-    assert(_webSocket.isOpen);
+    assert(_webSocket!.isOpen);
     // Mark request as pending.
     assert(_pendingRequests.containsKey(serial) == false);
     _pendingRequests[serial] = request;
@@ -332,7 +332,7 @@
           'GET [${serial}] ${request.method}(${request.params}) from ${target.networkAddress}');
     }
     // Send message.
-    _webSocket.send(message);
+    _webSocket!.send(message);
   }
 
   String toString() => displayName;
diff --git a/runtime/observatory/lib/service_html.dart b/runtime/observatory/lib/service_html.dart
index cf93d5e..fa2be06 100644
--- a/runtime/observatory/lib/service_html.dart
+++ b/runtime/observatory/lib/service_html.dart
@@ -15,7 +15,7 @@
 export 'package:observatory/service_common.dart';
 
 class _HtmlWebSocket implements CommonWebSocket {
-  WebSocket _webSocket;
+  WebSocket? _webSocket;
 
   Future<void> connect(WebSocketVMTarget target, void onOpen(),
       void onMessage(dynamic data), void onError(), void onClose()) async {
@@ -43,20 +43,20 @@
     target.networkAddress = response['result']['uri'];
     */
     _webSocket = new WebSocket(target.networkAddress);
-    _webSocket.onClose.listen((CloseEvent) => onClose());
-    _webSocket.onError.listen((Event) => onError());
-    _webSocket.onOpen.listen((Event) => onOpen());
-    _webSocket.onMessage.listen((MessageEvent event) => onMessage(event.data));
+    _webSocket!.onClose.listen((CloseEvent) => onClose());
+    _webSocket!.onError.listen((Event) => onError());
+    _webSocket!.onOpen.listen((Event) => onOpen());
+    _webSocket!.onMessage.listen((MessageEvent event) => onMessage(event.data));
   }
 
-  bool get isOpen => _webSocket.readyState == WebSocket.OPEN;
+  bool get isOpen => _webSocket!.readyState == WebSocket.OPEN;
 
   void send(dynamic data) {
-    _webSocket.send(data);
+    _webSocket!.send(data);
   }
 
   void close() {
-    _webSocket.close();
+    _webSocket!.close();
   }
 
   Future<ByteData> nonStringToByteData(dynamic data) {
diff --git a/runtime/observatory/lib/service_io.dart b/runtime/observatory/lib/service_io.dart
index bf21fea..ece0fe1 100644
--- a/runtime/observatory/lib/service_io.dart
+++ b/runtime/observatory/lib/service_io.dart
@@ -15,13 +15,13 @@
 export 'package:observatory/service_common.dart';
 
 class _IOWebSocket implements CommonWebSocket {
-  WebSocket _webSocket;
+  WebSocket? _webSocket;
 
   Future<void> connect(WebSocketVMTarget target, void onOpen(),
       void onMessage(dynamic data), void onError(), void onClose()) async {
     try {
       _webSocket = await WebSocket.connect(target.networkAddress);
-      _webSocket.listen(onMessage,
+      _webSocket!.listen(onMessage,
           onError: (dynamic) => onError(),
           onDone: onClose,
           cancelOnError: true);
@@ -32,16 +32,14 @@
   }
 
   bool get isOpen =>
-      (_webSocket != null) && (_webSocket.readyState == WebSocket.open);
+      (_webSocket != null) && (_webSocket!.readyState == WebSocket.open);
 
   void send(dynamic data) {
-    _webSocket.add(data);
+    _webSocket!.add(data);
   }
 
   void close() {
-    if (_webSocket != null) {
-      _webSocket.close();
-    }
+    _webSocket?.close();
   }
 
   Future<ByteData> nonStringToByteData(dynamic data) {
diff --git a/runtime/observatory/lib/src/allocation_profile/allocation_profile.dart b/runtime/observatory/lib/src/allocation_profile/allocation_profile.dart
index c1e7aa1..0ec7fa1 100644
--- a/runtime/observatory/lib/src/allocation_profile/allocation_profile.dart
+++ b/runtime/observatory/lib/src/allocation_profile/allocation_profile.dart
@@ -6,15 +6,16 @@
 
 class AllocationProfile implements M.AllocationProfile {
   static const _lastServiceGC = 'dateLastServiceGC';
-  final DateTime lastServiceGC;
+  final DateTime? lastServiceGC;
   static const _lastAccumulatorReset = 'dateLastAccumulatorReset';
-  final DateTime lastAccumulatorReset;
+  final DateTime? lastAccumulatorReset;
   final S.HeapSpace newSpace;
   final S.HeapSpace oldSpace;
   final S.HeapSpace totalSpace;
   final Iterable<M.ClassHeapStats> members;
 
-  AllocationProfile(S.ServiceMap map, {Map/*<String, List<String>>*/ defaults})
+  AllocationProfile(S.ServiceMap map,
+      {Map/*<String, List<String>>*/ ? defaults})
       : lastAccumulatorReset = _intString2DateTime(map[_lastAccumulatorReset]),
         lastServiceGC = _intString2DateTime(map[_lastServiceGC]),
         oldSpace = new S.HeapSpace()..update(map['_heaps']['old']),
@@ -25,7 +26,7 @@
     totalSpace.add(newSpace);
   }
 
-  static DateTime _intString2DateTime(String milliseconds) {
+  static DateTime? _intString2DateTime(String milliseconds) {
     if ((milliseconds == null) || milliseconds == '') {
       return null;
     }
@@ -38,7 +39,7 @@
   }
 
   static List<M.ClassHeapStats> _convertMembers(Iterable/*<S.ServiceMap>*/ raw,
-      {Map/*<String, List<String>>*/ defaults}) {
+      {Map/*<String, List<String>>*/ ? defaults}) {
     final List<M.ClassHeapStats> members =
         raw.map<ClassHeapStats>(_convertMember).toList();
     if (defaults == null) {
@@ -49,26 +50,26 @@
     final Map<String, List<ClassHeapStats>> accumulators =
         <String, List<ClassHeapStats>>{};
     defaults.forEach((/*String*/ key, /*List<String>*/ values) {
-      final classes = aliases[key];
+      final classes = aliases[key]!;
       accumulators.addAll(new Map.fromIterable(values, value: (_) => classes));
     });
     final List<M.ClassHeapStats> result = <M.ClassHeapStats>[];
     members.forEach((M.ClassHeapStats member) {
-      if (accumulators.containsKey(member.clazz.id)) {
-        accumulators[member.clazz.id].add(member);
+      if (accumulators.containsKey(member.clazz!.id)) {
+        accumulators[member.clazz!.id]!.add(member as ClassHeapStats);
       } else {
-        result.add(member);
+        result.add(member as ClassHeapStats);
       }
     });
     return result
       ..addAll(
-          aliases.keys.map((key) => new ClassesHeapStats(key, aliases[key])));
+          aliases.keys.map((key) => new ClassesHeapStats(key, aliases[key]!)));
   }
 }
 
 class ClassHeapStats implements M.ClassHeapStats {
-  final S.Class clazz;
-  final String displayName = null;
+  final S.Class? clazz;
+  final String? displayName = null;
   final S.Allocations newSpace;
   final S.Allocations oldSpace;
 
@@ -79,8 +80,8 @@
 }
 
 class ClassesHeapStats implements M.ClassHeapStats {
-  final S.Class clazz = null;
-  final String displayName;
+  final S.Class? clazz = null;
+  final String? displayName;
   final S.Allocations newSpace;
   final S.Allocations oldSpace;
 
diff --git a/runtime/observatory/lib/src/app/application.dart b/runtime/observatory/lib/src/app/application.dart
index 768c3b4..e7eae4d 100644
--- a/runtime/observatory/lib/src/app/application.dart
+++ b/runtime/observatory/lib/src/app/application.dart
@@ -7,30 +7,30 @@
 /// The observatory application. Instances of this are created and owned
 /// by the observatory_application custom element.
 class ObservatoryApplication {
-  static ObservatoryApplication app;
+  static late ObservatoryApplication app;
   final RenderingQueue queue = new RenderingQueue();
   final TargetRepository targets = new TargetRepository(isConnectedVMTarget);
   final EventRepository events = new EventRepository();
   final NotificationRepository notifications = new NotificationRepository();
   final _pageRegistry = <Page>[];
-  LocationManager _locationManager;
+  late LocationManager _locationManager;
   LocationManager get locationManager => _locationManager;
-  Page currentPage;
+  Page? currentPage;
   bool _vmConnected = false;
-  VM _vm;
-  VM get vm => _vm;
+  VM? _vm;
+  VM get vm => _vm!;
 
   static bool isConnectedVMTarget(M.Target target) {
     if (app._vm is CommonWebSocketVM) {
       if ((app._vm as CommonWebSocketVM).target == target) {
-        return app._vm.isConnected;
+        return app._vm!.isConnected;
       }
     }
     return false;
   }
 
-  _switchVM(VM newVM) {
-    final VM oldVM = _vm;
+  _switchVM(VM? newVM) {
+    final VM? oldVM = _vm;
 
     Logger.root.info('_switchVM from:${oldVM} to:${newVM}');
 
@@ -89,14 +89,14 @@
     _vm = newVM;
   }
 
-  StreamSubscription _gcSubscription;
-  StreamSubscription _loggingSubscription;
+  StreamSubscription? _gcSubscription;
+  StreamSubscription? _loggingSubscription;
 
   Future startGCEventListener() async {
     if (_gcSubscription != null || _vm == null) {
       return;
     }
-    _gcSubscription = await _vm.listenEventStream(VM.kGCStream, _onEvent);
+    _gcSubscription = await _vm!.listenEventStream(VM.kGCStream, _onEvent);
   }
 
   Future startLoggingEventListener() async {
@@ -104,14 +104,14 @@
       return;
     }
     _loggingSubscription =
-        await _vm.listenEventStream(Isolate.kLoggingStream, _onEvent);
+        await _vm!.listenEventStream(Isolate.kLoggingStream, _onEvent);
   }
 
   Future stopGCEventListener() async {
     if (_gcSubscription == null) {
       return;
     }
-    _gcSubscription.cancel();
+    _gcSubscription!.cancel();
     _gcSubscription = null;
   }
 
@@ -119,16 +119,15 @@
     if (_loggingSubscription == null) {
       return;
     }
-    _loggingSubscription.cancel();
+    _loggingSubscription!.cancel();
     _loggingSubscription = null;
   }
 
   final ObservatoryApplicationElement rootElement;
 
-  ServiceObject lastErrorOrException;
+  ServiceObject? lastErrorOrException;
 
   void _initOnce() {
-    assert(app == null);
     app = this;
     _registerPages();
     // Visit the current page.
@@ -145,7 +144,7 @@
 
   void _onEvent(ServiceEvent event) {
     assert(event.kind != ServiceEvent.kNone);
-    M.Event e = createEventFromServiceEvent(event);
+    M.Event? e = createEventFromServiceEvent(event);
     if (e != null) {
       events.add(e);
     }
@@ -179,7 +178,7 @@
     _pageRegistry.add(new ErrorPage(this));
   }
 
-  void _visit(Uri uri, Map internalArguments) {
+  void _visit(Uri uri, Map<String, String> internalArguments) {
     if (internalArguments['trace'] != null) {
       var traceArg = internalArguments['trace'];
       if (traceArg == 'on') {
@@ -189,7 +188,7 @@
       }
     }
     if (Tracer.current != null) {
-      Tracer.current.reset();
+      Tracer.current!.reset();
     }
     for (var i = 0; i < _pageRegistry.length; i++) {
       var page = _pageRegistry[i];
@@ -211,7 +210,7 @@
     }
     if (currentPage != null) {
       Logger.root.info('Uninstalling page: $currentPage');
-      currentPage.onUninstall();
+      currentPage!.onUninstall();
       // Clear children.
       rootElement.children.clear();
     }
@@ -222,7 +221,7 @@
       Logger.root.severe('Failed to install page: $e');
     }
     // Add new page.
-    rootElement.children.add(page.element);
+    rootElement.children.add(page.element!);
 
     // Remember page.
     currentPage = page;
@@ -239,22 +238,22 @@
         _switchVM(null);
       } else {
         final bool currentTarget =
-            (_vm as WebSocketVM)?.target == targets.current;
-        final bool currentTargetConnected = (_vm != null) && _vm.isConnected;
+            (_vm as WebSocketVM?)?.target == targets.current;
+        final bool currentTargetConnected = (_vm != null) && _vm!.isConnected;
         if (!currentTarget || !currentTargetConnected) {
-          _switchVM(new WebSocketVM(targets.current));
-          _vm.onConnect.then((_) {
+          _switchVM(new WebSocketVM(targets.current!));
+          _vm!.onConnect.then((_) {
             app.locationManager.go(Uris.vm());
           });
-          _vm.load();
+          _vm!.load();
         } else if (currentTargetConnected) {
           app.locationManager.go(Uris.vm());
         }
       }
     });
 
-    Logger.root.info('Setting initial target to ${targets.current.name}');
-    _switchVM(new WebSocketVM(targets.current));
+    Logger.root.info('Setting initial target to ${targets.current!.name}');
+    _switchVM(new WebSocketVM(targets.current!));
     _initOnce();
 
     // delete pause events.
diff --git a/runtime/observatory/lib/src/app/location_manager.dart b/runtime/observatory/lib/src/app/location_manager.dart
index a0e1af1..2f231d8 100644
--- a/runtime/observatory/lib/src/app/location_manager.dart
+++ b/runtime/observatory/lib/src/app/location_manager.dart
@@ -11,11 +11,11 @@
   /// application URL.
   final Map<String, String> internalArguments = new Map<String, String>();
 
-  Uri _uri;
+  Uri? _uri;
 
   /// [uri] is the application uri. Application uris consist of a path and
   /// the queryParameters map.
-  Uri get uri => _uri;
+  Uri get uri => _uri!;
 
   LocationManager(this._app) {
     window.onPopState.listen(_onBrowserNavigation);
@@ -90,13 +90,14 @@
 
   /// Notify the current page that something has changed.
   _visit() {
-    Chain.capture(() => _app._visit(_uri, internalArguments), onError: (e, st) {
+    Chain.capture(() => _app._visit(_uri!, internalArguments),
+        onError: (e, st) {
       if (e is IsolateNotFound) {
         var newPath = ((_app.vm == null || _app.vm.isDisconnected)
             ? '/vm-connect'
             : '/isolate-reconnect');
         var parameters = <String, dynamic>{};
-        parameters.addAll(_uri.queryParameters);
+        parameters.addAll(_uri!.queryParameters);
         parameters['originalUri'] = _uri.toString();
         parameters['isolateId'] = parameters['isolateId'];
         var generatedUri = new Uri(path: newPath, queryParameters: parameters);
@@ -126,7 +127,7 @@
   }
 
   makeLinkReplacingParameters(Map updatedParameters) {
-    var parameters = new Map.from(_uri.queryParameters);
+    var parameters = new Map<String, dynamic>.from(_uri!.queryParameters);
     updatedParameters.forEach((k, v) {
       parameters[k] = v;
     });
@@ -141,7 +142,7 @@
   }
 
   makeLinkForwardingParameters(String newPath) {
-    var parameters = _uri.queryParameters;
+    var parameters = _uri!.queryParameters;
     var generatedUri = new Uri(path: newPath, queryParameters: parameters);
     return makeLink(generatedUri.toString());
   }
@@ -161,7 +162,7 @@
     event.preventDefault();
     // 'currentTarget' is the dom element that would process the event.
     // If we use 'target' we might get an <em> element or somesuch.
-    Element target = event.currentTarget;
-    go(target.attributes['href']);
+    Element target = event.currentTarget as Element;
+    go(target.attributes['href']!);
   }
 }
diff --git a/runtime/observatory/lib/src/app/notification.dart b/runtime/observatory/lib/src/app/notification.dart
index 1f5f9d7..933cdb9 100644
--- a/runtime/observatory/lib/src/app/notification.dart
+++ b/runtime/observatory/lib/src/app/notification.dart
@@ -8,7 +8,7 @@
   final exception;
 
   /// [optional]
-  final StackTrace stacktrace;
+  final StackTrace? stacktrace;
   ExceptionNotification(this.exception, {this.stacktrace});
 }
 
diff --git a/runtime/observatory/lib/src/app/page.dart b/runtime/observatory/lib/src/app/page.dart
index a366acf..9adaad7 100644
--- a/runtime/observatory/lib/src/app/page.dart
+++ b/runtime/observatory/lib/src/app/page.dart
@@ -55,7 +55,7 @@
 abstract class Page {
   final ObservatoryApplication app;
   final Map<String, String> internalArguments = <String, String>{};
-  HtmlElement element;
+  HtmlElement? element;
 
   Page(this.app);
 
@@ -70,7 +70,7 @@
   }
 
   /// Called when the page should update its state based on [uri].
-  void visit(Uri uri, Map internalArguments) {
+  void visit(Uri uri, Map<String, String> internalArguments) {
     this.internalArguments.clear();
     this.internalArguments.addAll(internalArguments);
     _visit(uri);
@@ -95,7 +95,7 @@
 
   Future<Isolate> getIsolate(Uri uri) {
     var isolateId = uri.queryParameters['isolateId'];
-    return app.vm.getIsolate(isolateId).then((isolate) {
+    return app.vm.getIsolate(isolateId!).then((isolate) {
       if (isolate == null) {
         throw new IsolateNotFound(isolateId);
       }
@@ -106,7 +106,6 @@
   EditorRepository getEditor(Uri uri) {
     final editor = uri.queryParameters['editor'];
     return new EditorRepository(app.vm, editor: editor);
-    return null;
   }
 
   bool canVisit(Uri uri) => uri.path == path;
@@ -119,7 +118,7 @@
 
   void onInstall() {
     if (element == null) {
-      element = new Element.tag(elementTagName);
+      element = new Element.tag(elementTagName) as HtmlElement;
     }
   }
 }
@@ -169,7 +168,7 @@
       return;
     }
     app.vm.reload().then((serviceObject) {
-      VM vm = serviceObject;
+      VM vm = serviceObject as VM;
       container.children = <Element>[
         new VMViewElement(
                 vm,
@@ -257,7 +256,7 @@
       container.children = <Element>[
         new ClassViewElement(
                 app.vm,
-                obj.isolate,
+                obj.isolate as Isolate,
                 obj,
                 app.events,
                 app.notifications,
@@ -280,7 +279,7 @@
       container.children = <Element>[
         new CodeViewElement(
                 app.vm,
-                obj.isolate,
+                obj.isolate as Isolate,
                 obj,
                 app.events,
                 app.notifications,
@@ -296,7 +295,7 @@
       container.children = <Element>[
         new ContextViewElement(
                 app.vm,
-                obj.isolate,
+                obj.isolate as Isolate,
                 obj,
                 app.events,
                 app.notifications,
@@ -317,7 +316,7 @@
       container.children = <Element>[
         new FieldViewElement(
                 app.vm,
-                obj.isolate,
+                obj.isolate as Isolate,
                 obj,
                 app.events,
                 app.notifications,
@@ -336,7 +335,7 @@
       container.children = <Element>[
         new InstanceViewElement(
                 app.vm,
-                obj.isolate,
+                obj.isolate as Isolate,
                 obj,
                 app.events,
                 app.notifications,
@@ -374,7 +373,7 @@
       container.children = <Element>[
         new FunctionViewElement(
                 app.vm,
-                obj.isolate,
+                obj.isolate as Isolate,
                 obj,
                 app.events,
                 app.notifications,
@@ -393,7 +392,7 @@
       container.children = <Element>[
         new ICDataViewElement(
                 app.vm,
-                obj.isolate,
+                obj.isolate as Isolate,
                 obj,
                 app.events,
                 app.notifications,
@@ -410,7 +409,7 @@
       container.children = <Element>[
         new SingleTargetCacheViewElement(
                 app.vm,
-                obj.isolate,
+                obj.isolate as Isolate,
                 obj,
                 app.events,
                 app.notifications,
@@ -427,7 +426,7 @@
       container.children = <Element>[
         new SubtypeTestCacheViewElement(
                 app.vm,
-                obj.isolate,
+                obj.isolate as Isolate,
                 obj,
                 app.events,
                 app.notifications,
@@ -444,7 +443,7 @@
       container.children = <Element>[
         new UnlinkedCallViewElement(
                 app.vm,
-                obj.isolate,
+                obj.isolate as Isolate,
                 obj,
                 app.events,
                 app.notifications,
@@ -461,7 +460,7 @@
       container.children = <Element>[
         new LibraryViewElement(
                 app.vm,
-                obj.isolate,
+                obj.isolate as Isolate,
                 obj,
                 app.events,
                 app.notifications,
@@ -481,7 +480,7 @@
       container.children = <Element>[
         new MegamorphicCacheViewElement(
                 app.vm,
-                obj.isolate,
+                obj.isolate as Isolate,
                 obj,
                 app.events,
                 app.notifications,
@@ -498,7 +497,7 @@
       container.children = <Element>[
         new ObjectPoolViewElement(
                 app.vm,
-                obj.isolate,
+                obj.isolate as Isolate,
                 obj,
                 app.events,
                 app.notifications,
@@ -515,13 +514,13 @@
       var pos;
       if (app.locationManager.internalArguments['pos'] != null) {
         try {
-          pos = int.parse(app.locationManager.internalArguments['pos']);
+          pos = int.parse(app.locationManager.internalArguments['pos']!);
         } catch (_) {}
       }
       container.children = <Element>[
         new ScriptViewElement(
                 app.vm,
-                obj.isolate,
+                obj.isolate as Isolate,
                 obj,
                 app.events,
                 app.notifications,
@@ -539,7 +538,7 @@
       container.children = <Element>[
         new ObjectViewElement(
                 app.vm,
-                obj.isolate,
+                obj.isolate as Isolate,
                 obj,
                 app.events,
                 app.notifications,
@@ -553,8 +552,8 @@
       ];
     } else if (obj is Sentinel) {
       container.children = <Element>[
-        new SentinelViewElement(
-                app.vm, obj.isolate, obj, app.events, app.notifications,
+        new SentinelViewElement(app.vm, obj.isolate as Isolate, obj, app.events,
+                app.notifications,
                 queue: app.queue)
             .element
       ];
@@ -911,8 +910,8 @@
               app.vm,
               app.events,
               app.notifications,
-              uri.queryParameters['isolateId'],
-              Uri.parse(uri.queryParameters['originalUri']))
+              uri.queryParameters['isolateId']!,
+              Uri.parse(uri.queryParameters['originalUri']!))
           .element
     ];
     assert(element != null);
@@ -927,7 +926,7 @@
 
   final DivElement container = new DivElement();
 
-  Isolate lastIsolate;
+  Isolate? lastIsolate;
 
   void _visit(Uri uri) {
     super._visit(uri);
@@ -953,7 +952,7 @@
   @override
   void onUninstall() {
     super.onUninstall();
-    _metricRepository.stopSampling(lastIsolate);
+    _metricRepository.stopSampling(lastIsolate!);
     container.children = const [];
   }
 }
diff --git a/runtime/observatory/lib/src/cli/command.dart b/runtime/observatory/lib/src/cli/command.dart
index 0a0fc42..7beb26f 100644
--- a/runtime/observatory/lib/src/cli/command.dart
+++ b/runtime/observatory/lib/src/cli/command.dart
@@ -46,8 +46,8 @@
   // A command may optionally have sub-commands.
   List<Command> _children = <Command>[];
 
-  _CommandBase _parent;
-  int get _depth => (_parent == null ? 0 : _parent._depth + 1);
+  _CommandBase? _parent;
+  int get _depth => (_parent == null ? 0 : _parent!._depth + 1);
 
   // Override in subclasses to provide command-specific argument completion.
   //
@@ -115,7 +115,7 @@
 
 // The root of a tree of commands.
 class RootCommand extends _CommandBase {
-  RootCommand(List<Command> children, [List<String> history])
+  RootCommand(List<Command> children, [List<String>? history])
       : this._(children, history ?? ['']);
 
   RootCommand._(List<Command> children, List<String> history)
@@ -161,7 +161,7 @@
       // If we are showing all possiblities, also include local
       // completions for the parent command.
       return commands[0]
-          ._parent
+          ._parent!
           ._buildCompletions(args, false)
           .then((localCompletions) {
         completions.addAll(localCompletions);
@@ -232,7 +232,7 @@
     throw 'should-not-execute-the-root-command';
   }
 
-  toString() => 'RootCommand';
+  String toString() => 'RootCommand';
 }
 
 // A node in the command tree.
@@ -240,18 +240,18 @@
   Command(this.name, List<Command> children) : super(children);
 
   final String name;
-  String alias;
+  String? alias;
 
   String get fullName {
     if (_parent is RootCommand) {
       return name;
     } else {
-      Command parent = _parent;
+      Command parent = _parent as Command;
       return '${parent.fullName} $name';
     }
   }
 
-  toString() => 'Command(${name})';
+  String toString() => 'Command(${name})';
 }
 
 abstract class CommandException implements Exception {}
diff --git a/runtime/observatory/lib/src/debugger/debugger.dart b/runtime/observatory/lib/src/debugger/debugger.dart
index fb297c7..f243e02 100644
--- a/runtime/observatory/lib/src/debugger/debugger.dart
+++ b/runtime/observatory/lib/src/debugger/debugger.dart
@@ -8,7 +8,7 @@
 abstract class Debugger {
   VM get vm;
   Isolate get isolate;
-  M.ObjectRepository objects;
-  ServiceMap get stack;
-  int get currentFrame;
+  M.ObjectRepository? objects;
+  ServiceMap? get stack;
+  int? get currentFrame;
 }
diff --git a/runtime/observatory/lib/src/debugger/debugger_location.dart b/runtime/observatory/lib/src/debugger/debugger_location.dart
index a186fd4..344a010 100644
--- a/runtime/observatory/lib/src/debugger/debugger_location.dart
+++ b/runtime/observatory/lib/src/debugger/debugger_location.dart
@@ -50,12 +50,12 @@
         new DebuggerLocation.error("Invalid source location '${locDesc}'"));
   }
 
-  static Future<Frame> _currentFrame(Debugger debugger) async {
-    ServiceMap stack = debugger.stack;
+  static Future<Frame?> _currentFrame(Debugger debugger) async {
+    ServiceMap? stack = debugger.stack;
     if (stack == null || stack['frames'].length == 0) {
       return null;
     }
-    return stack['frames'][debugger.currentFrame];
+    return stack['frames'][debugger.currentFrame] as Frame?;
   }
 
   static Future<DebuggerLocation> _currentLocation(Debugger debugger) async {
@@ -64,10 +64,10 @@
       return new DebuggerLocation.error(
           'A script must be provided when the stack is empty');
     }
-    Script script = frame.location.script;
+    Script script = frame.location!.script;
     await script.load();
-    var line = script.tokenToLine(frame.location.tokenPos);
-    var col = script.tokenToCol(frame.location.tokenPos);
+    var line = script.tokenToLine(frame.location!.tokenPos);
+    var col = script.tokenToCol(frame.location!.tokenPos);
     return new DebuggerLocation.file(script, line, col);
   }
 
@@ -87,7 +87,7 @@
     if (colStr != null) {
       colStr = colStr.substring(1);
     }
-    var line = int.tryParse(lineStr) ?? -1;
+    var line = int.tryParse(lineStr!) ?? -1;
     var col = (colStr != null ? int.tryParse(colStr) ?? -1 : null);
     if (line == -1) {
       return new Future.value(
@@ -121,7 +121,7 @@
         return new Future.value(new DebuggerLocation.error(
             'A script must be provided when the stack is empty'));
       }
-      Script script = frame.location.script;
+      Script script = frame.location!.script;
       await script.load();
       return new DebuggerLocation.file(script, line, col);
     }
@@ -139,7 +139,7 @@
       var matches = <Script>{};
       for (var lib in isolate.libraries) {
         for (var script in lib.scripts) {
-          final String haystack = useUri ? script.uri : script.name;
+          final String haystack = useUri ? script.uri : script.name!;
           if (allowPrefix) {
             if (haystack.startsWith(name)) {
               matches.add(script);
@@ -162,7 +162,7 @@
       assert(lib.loaded);
       for (var function in lib.functions) {
         if (allowPrefix) {
-          if (function.name.startsWith(name)) {
+          if (function.name!.startsWith(name)) {
             matches.add(function);
           }
         } else {
@@ -194,7 +194,7 @@
     for (var lib in isolate.libraries) {
       for (var cls in lib.classes) {
         if (allowPrefix) {
-          if (cls.name.startsWith(name)) {
+          if (cls.name!.startsWith(name)) {
             matches.add(cls);
           }
         } else {
@@ -207,7 +207,7 @@
     return matches;
   }
 
-  static ServiceFunction _getConstructor(Class cls, String name) {
+  static ServiceFunction? _getConstructor(Class cls, String name) {
     for (var function in cls.functions) {
       assert(cls.loaded);
       if (name == function.name) {
@@ -222,7 +222,7 @@
   static Future<DebuggerLocation> _parseFunction(
       Debugger debugger, Match match) {
     Isolate isolate = debugger.isolate;
-    var base = match.group(1);
+    var base = match.group(1)!;
     var qualifier = match.group(2);
     assert(base != null);
 
@@ -234,7 +234,7 @@
 
         for (var cls in classes) {
           // Look for a self-named constructor.
-          var constructor = _getConstructor(cls, cls.name);
+          var constructor = _getConstructor(cls, cls.name!);
           if (constructor != null) {
             functions.add(constructor);
           }
@@ -300,9 +300,8 @@
   static Future<List<String>> _completeFunction(
       Debugger debugger, Match match) {
     Isolate isolate = debugger.isolate;
-    var base = match.group(1);
+    var base = match.group(1) ?? '';
     var qualifier = match.group(2);
-    base = (base == null ? '' : base);
 
     if (qualifier == null) {
       return _lookupClass(isolate, base, allowPrefix: true).then((classes) {
@@ -310,12 +309,12 @@
 
         // Complete top-level function names.
         var functions = _lookupFunction(isolate, base, allowPrefix: true);
-        var funcNames = functions.map((f) => f.name).toList();
+        var funcNames = functions.map((f) => f.name!).toList();
         funcNames.sort();
         completions.addAll(funcNames);
 
         // Complete class names.
-        var classNames = classes.map((f) => f.name).toList();
+        var classNames = classes.map((f) => f.name!).toList();
         classNames.sort();
         completions.addAll(classNames);
 
@@ -327,12 +326,12 @@
         for (var cls in classes) {
           for (var function in cls.functions) {
             if (function.kind == M.FunctionKind.constructor) {
-              if (function.name.startsWith(match.group(0))) {
-                completions.add(function.name);
+              if (function.name!.startsWith(match.group(0)!)) {
+                completions.add(function.name!);
               }
             } else {
-              if (function.qualifiedName.startsWith(match.group(0))) {
-                completions.add(function.qualifiedName);
+              if (function.qualifiedName!.startsWith(match.group(0)!)) {
+                completions.add(function.qualifiedName!);
               }
             }
           }
@@ -354,34 +353,29 @@
     var lineStr;
     var lineStrComplete = false;
     var colStr;
-    if (_startsWithDigit(match.group(1))) {
+    if (_startsWithDigit(match.group(1)!)) {
       // CASE 1: We have matched a prefix of (lineStr:)(colStr)
       var frame = await _currentFrame(debugger);
       if (frame == null) {
         return [];
       }
-      scriptName = frame.location.script.name;
+      scriptName = frame.location!.script.name;
       scriptNameComplete = true;
-      lineStr = match.group(1);
-      lineStr = (lineStr == null ? '' : lineStr);
+      lineStr = match.group(1) ?? '';
       if (lineStr.endsWith(':')) {
         lineStr = lineStr.substring(0, lineStr.length - 1);
         lineStrComplete = true;
       }
-      colStr = match.group(2);
-      colStr = (colStr == null ? '' : colStr);
+      colStr = match.group(2) ?? '';
     } else {
       // CASE 2: We have matched a prefix of (scriptName:)(lineStr)(:colStr)
-      scriptName = match.group(1);
-      scriptName = (scriptName == null ? '' : scriptName);
+      scriptName = match.group(1) ?? '';
       if (scriptName.endsWith(':')) {
         scriptName = scriptName.substring(0, scriptName.length - 1);
         scriptNameComplete = true;
       }
-      lineStr = match.group(2);
-      lineStr = (lineStr == null ? '' : lineStr);
-      colStr = match.group(3);
-      colStr = (colStr == null ? '' : colStr);
+      lineStr = match.group(2) ?? '';
+      colStr = match.group(3) ?? '';
       if (colStr.startsWith(':')) {
         lineStrComplete = true;
         colStr = colStr.substring(1);
@@ -394,7 +388,7 @@
           await _lookupScript(debugger.isolate, scriptName, allowPrefix: true);
       var completions = <String>[];
       for (var script in scripts) {
-        completions.add(script.name + ':');
+        completions.add(script.name! + ':');
       }
       completions.sort();
       return completions;
@@ -411,8 +405,8 @@
         // Complete the line.
         var sharedPrefix = '${script.name}:';
         var completions = <String>[];
-        var report = await script.isolate
-            .getSourceReport([Isolate.kPossibleBreakpointsReport], script);
+        var report = await script.isolate!.getSourceReport(
+            [Isolate.kPossibleBreakpointsReport], script) as ServiceMap;
         Set<int> possibleBpts = getPossibleBreakpointLines(report, script);
         for (var line in possibleBpts) {
           var currentLineStr = line.toString();
@@ -425,7 +419,7 @@
       } else {
         // Complete the column.
         int lineNum = int.parse(lineStr);
-        var scriptLine = script.getLine(lineNum);
+        var scriptLine = script.getLine(lineNum)!;
         var sharedPrefix = '${script.name}:${lineStr}:';
         var completions = <String>[];
         int maxCol = scriptLine.text.trimRight().runes.length;
@@ -443,20 +437,20 @@
   String toString() {
     if (valid) {
       if (function != null) {
-        return '${function.qualifiedName}';
+        return '${function!.qualifiedName}';
       } else if (col != null) {
-        return '${script.name}:${line}:${col}';
+        return '${script!.name}:${line}:${col}';
       } else {
-        return '${script.name}:${line}';
+        return '${script!.name}:${line}';
       }
     }
     return 'invalid source location (${errorMessage})';
   }
 
-  Script script;
-  int line;
-  int col;
-  ServiceFunction function;
-  String errorMessage;
+  Script? script;
+  int? line;
+  int? col;
+  ServiceFunction? function;
+  String? errorMessage;
   bool get valid => (errorMessage == null);
 }
diff --git a/runtime/observatory/lib/src/elements/allocation_profile.dart b/runtime/observatory/lib/src/elements/allocation_profile.dart
index ae66a6a8..63bfe2c 100644
--- a/runtime/observatory/lib/src/elements/allocation_profile.dart
+++ b/runtime/observatory/lib/src/elements/allocation_profile.dart
@@ -37,20 +37,20 @@
 enum _SortingDirection { ascending, descending }
 
 class AllocationProfileElement extends CustomElement implements Renderable {
-  RenderingScheduler<AllocationProfileElement> _r;
+  late RenderingScheduler<AllocationProfileElement> _r;
 
   Stream<RenderedEvent<AllocationProfileElement>> get onRendered =>
       _r.onRendered;
 
-  M.VM _vm;
-  M.IsolateRef _isolate;
-  M.EventRepository _events;
-  M.NotificationRepository _notifications;
-  M.AllocationProfileRepository _repository;
-  M.AllocationProfile _profile;
+  late M.VM _vm;
+  late M.IsolateRef _isolate;
+  late M.EventRepository _events;
+  late M.NotificationRepository _notifications;
+  late M.AllocationProfileRepository _repository;
+  M.AllocationProfile? _profile;
   bool _autoRefresh = false;
   bool _isCompacted = false;
-  StreamSubscription _gcSubscription;
+  late StreamSubscription _gcSubscription;
   _SortingField _sortingField = _SortingField.size;
   _SortingDirection _sortingDirection = _SortingDirection.descending;
 
@@ -64,7 +64,7 @@
       M.EventRepository events,
       M.NotificationRepository notifications,
       M.AllocationProfileRepository repository,
-      {RenderingQueue queue}) {
+      {RenderingQueue? queue}) {
     assert(vm != null);
     assert(isolate != null);
     assert(events != null);
@@ -163,9 +163,9 @@
                             ..text = 'last forced GC at',
                           new DivElement()
                             ..classes = ['memberValue']
-                            ..text = _profile.lastServiceGC == null
+                            ..text = _profile!.lastServiceGC == null
                                 ? '---'
-                                : '${_profile.lastServiceGC}',
+                                : '${_profile!.lastServiceGC}',
                         ],
                     ],
                   new HRElement(),
@@ -179,14 +179,14 @@
                   ? [
                       new HeadingElement.h2()
                         ..text = 'New Generation '
-                            '(${_usedCaption(_profile.newSpace)})',
+                            '(${_usedCaption(_profile!.newSpace)})',
                     ]
                   : [
                       new HeadingElement.h2()..text = 'New Generation',
                       new BRElement(),
                       new DivElement()
                         ..classes = ['memberList']
-                        ..children = _createSpaceMembers(_profile.newSpace),
+                        ..children = _createSpaceMembers(_profile!.newSpace),
                     ],
             new DivElement()
               ..classes = ['heap-space', 'left']
@@ -194,14 +194,14 @@
                   ? [
                       new HeadingElement.h2()
                         ..text = 'Old Generation '
-                            '(${_usedCaption(_profile.oldSpace)})',
+                            '(${_usedCaption(_profile!.oldSpace)})',
                     ]
                   : [
                       new HeadingElement.h2()..text = 'Old Generation',
                       new BRElement(),
                       new DivElement()
                         ..classes = ['memberList']
-                        ..children = _createSpaceMembers(_profile.oldSpace),
+                        ..children = _createSpaceMembers(_profile!.oldSpace),
                     ],
             new DivElement()
               ..classes = ['heap-space', 'left']
@@ -209,14 +209,14 @@
                   ? [
                       new HeadingElement.h2()
                         ..text = 'Total '
-                            '(${_usedCaption(_profile.totalSpace)})',
+                            '(${_usedCaption(_profile!.totalSpace)})',
                     ]
                   : [
                       new HeadingElement.h2()..text = 'Total',
                       new BRElement(),
                       new DivElement()
                         ..classes = ['memberList']
-                        ..children = _createSpaceMembers(_profile.totalSpace),
+                        ..children = _createSpaceMembers(_profile!.totalSpace),
                     ],
             new ButtonElement()
               ..classes = ['compact']
@@ -234,7 +234,7 @@
                     _createCollectionLine, _updateCollectionLine,
                     createHeader: _createCollectionHeader,
                     search: _search,
-                    items: _profile.members.toList()..sort(_createSorter()),
+                    items: _profile!.members.toList()..sort(_createSorter()),
                     queue: _r.queue)
                 .element
           ]
@@ -282,7 +282,7 @@
         getter = _getInstances;
         break;
       case _SortingField.className:
-        getter = (M.ClassHeapStats s) => s.clazz.name;
+        getter = (M.ClassHeapStats s) => s.clazz!.name;
         break;
     }
     switch (_sortingDirection) {
@@ -432,14 +432,14 @@
     e.children[9].text = Utils.formatSize(_getExternalSize(item));
     e.children[10].text = Utils.formatSize(_getSize(item));
     e.children[11].text = '${_getInstances(item)}';
-    e.children[12] = new ClassRefElement(_isolate, item.clazz, queue: _r.queue)
+    e.children[12] = new ClassRefElement(_isolate, item.clazz!, queue: _r.queue)
         .element
       ..classes = ['name'];
   }
 
   bool _search(Pattern pattern, itemDynamic) {
     M.ClassHeapStats item = itemDynamic;
-    return item.clazz.name.contains(pattern);
+    return item.clazz!.name!.contains(pattern);
   }
 
   static String _usedCaption(M.HeapSpace space) =>
@@ -526,11 +526,11 @@
           'Class'
         ].join(',') +
         '\n';
-    AnchorElement tl = document.createElement('a');
+    AnchorElement tl = document.createElement('a') as AnchorElement;
     tl
       ..attributes['href'] = 'data:text/plain;charset=utf-8,' +
           Uri.encodeComponent(header +
-              (_profile.members.toList()..sort(_createSorter()))
+              (_profile!.members.toList()..sort(_createSorter()))
                   .map(_csvOut)
                   .join('\n'))
       ..attributes['download'] = 'heap-profile.csv'
@@ -551,7 +551,7 @@
       _getExternalSize(s),
       _getSize(s),
       _getInstances(s),
-      s.clazz.name
+      s.clazz!.name
     ].join(',');
   }
 
diff --git a/runtime/observatory/lib/src/elements/class_allocation_profile.dart b/runtime/observatory/lib/src/elements/class_allocation_profile.dart
index 46cc688..b37586c 100644
--- a/runtime/observatory/lib/src/elements/class_allocation_profile.dart
+++ b/runtime/observatory/lib/src/elements/class_allocation_profile.dart
@@ -13,27 +13,27 @@
 
 class ClassAllocationProfileElement extends CustomElement
     implements Renderable {
-  RenderingScheduler<ClassAllocationProfileElement> _r;
+  late RenderingScheduler<ClassAllocationProfileElement> _r;
 
   Stream<RenderedEvent<ClassAllocationProfileElement>> get onRendered =>
       _r.onRendered;
 
-  M.VM _vm;
-  M.IsolateRef _isolate;
-  M.Class _cls;
-  M.ClassSampleProfileRepository _profiles;
-  Stream<M.SampleProfileLoadingProgressEvent> _progressStream;
-  M.SampleProfileLoadingProgress _progress;
-  M.SampleProfileTag _tag = M.SampleProfileTag.none;
-  ProfileTreeMode _mode = ProfileTreeMode.function;
-  M.ProfileTreeDirection _direction = M.ProfileTreeDirection.exclusive;
+  late M.VM _vm;
+  late M.IsolateRef _isolate;
+  late M.Class _cls;
+  late M.ClassSampleProfileRepository _profiles;
+  late Stream<M.SampleProfileLoadingProgressEvent> _progressStream;
+  M.SampleProfileLoadingProgress? _progress;
+  late M.SampleProfileTag _tag = M.SampleProfileTag.none;
+  late ProfileTreeMode _mode = ProfileTreeMode.function;
+  late M.ProfileTreeDirection _direction = M.ProfileTreeDirection.exclusive;
 
   M.IsolateRef get isolate => _isolate;
   M.Class get cls => _cls;
 
   factory ClassAllocationProfileElement(M.VM vm, M.IsolateRef isolate,
       M.Class cls, M.ClassSampleProfileRepository profiles,
-      {RenderingQueue queue}) {
+      {RenderingQueue? queue}) {
     assert(vm != null);
     assert(isolate != null);
     assert(cls != null);
@@ -72,7 +72,7 @@
       return;
     }
     final content = <HtmlElement>[
-      (new SampleBufferControlElement(_vm, _progress, _progressStream,
+      (new SampleBufferControlElement(_vm, _progress!, _progressStream,
               selectedTag: _tag, queue: _r.queue)
             ..onTagChange.listen((e) {
               _tag = e.element.selectedTag;
@@ -80,8 +80,8 @@
             }))
           .element
     ];
-    if (_progress.status == M.SampleProfileLoadingStatus.loaded) {
-      CpuProfileVirtualTreeElement tree;
+    if (_progress!.status == M.SampleProfileLoadingStatus.loaded) {
+      late CpuProfileVirtualTreeElement tree;
       content.addAll([
         new BRElement(),
         (new StackTraceTreeConfigElement(
@@ -97,7 +97,7 @@
               }))
             .element,
         new BRElement(),
-        (tree = new CpuProfileVirtualTreeElement(_isolate, _progress.profile,
+        (tree = new CpuProfileVirtualTreeElement(_isolate, _progress!.profile,
                 queue: _r.queue))
             .element
       ]);
@@ -112,7 +112,7 @@
     _r.dirty();
     _progress = (await _progressStream.first).progress;
     _r.dirty();
-    if (M.isSampleProcessRunning(_progress.status)) {
+    if (M.isSampleProcessRunning(_progress!.status)) {
       _progress = (await _progressStream.last).progress;
       _r.dirty();
     }
diff --git a/runtime/observatory/lib/src/elements/class_instances.dart b/runtime/observatory/lib/src/elements/class_instances.dart
index a8d926a..abf90cc 100644
--- a/runtime/observatory/lib/src/elements/class_instances.dart
+++ b/runtime/observatory/lib/src/elements/class_instances.dart
@@ -15,19 +15,19 @@
 import 'package:observatory/utils.dart';
 
 class ClassInstancesElement extends CustomElement implements Renderable {
-  RenderingScheduler<ClassInstancesElement> _r;
+  late RenderingScheduler<ClassInstancesElement> _r;
 
   Stream<RenderedEvent<ClassInstancesElement>> get onRendered => _r.onRendered;
 
-  M.IsolateRef _isolate;
-  M.Class _cls;
-  M.RetainedSizeRepository _retainedSizes;
-  M.ReachableSizeRepository _reachableSizes;
-  M.StronglyReachableInstancesRepository _stronglyReachableInstances;
-  M.ObjectRepository _objects;
-  M.Guarded<M.Instance> _retainedSize = null;
+  late M.IsolateRef _isolate;
+  late M.Class _cls;
+  late M.RetainedSizeRepository _retainedSizes;
+  late M.ReachableSizeRepository _reachableSizes;
+  late M.StronglyReachableInstancesRepository _stronglyReachableInstances;
+  late M.ObjectRepository _objects;
+  M.Guarded<M.Instance>? _retainedSize = null;
   bool _loadingRetainedBytes = false;
-  M.Guarded<M.Instance> _reachableSize = null;
+  M.Guarded<M.Instance>? _reachableSize = null;
   bool _loadingReachableBytes = false;
 
   M.IsolateRef get isolate => _isolate;
@@ -40,7 +40,7 @@
       M.ReachableSizeRepository reachableSizes,
       M.StronglyReachableInstancesRepository stronglyReachableInstances,
       M.ObjectRepository objects,
-      {RenderingQueue queue}) {
+      {RenderingQueue? queue}) {
     assert(isolate != null);
     assert(cls != null);
     assert(retainedSizes != null);
@@ -73,15 +73,15 @@
     children = <Element>[];
   }
 
-  StronglyReachableInstancesElement _strong;
+  StronglyReachableInstancesElement? _strong;
 
   void render() {
     _strong = _strong ??
         new StronglyReachableInstancesElement(
             _isolate, _cls, _stronglyReachableInstances, _objects,
             queue: _r.queue);
-    final instanceCount = _cls.newSpace.instances + _cls.oldSpace.instances;
-    final size = Utils.formatSize(_cls.newSpace.size + _cls.oldSpace.size);
+    final instanceCount = _cls.newSpace!.instances + _cls.oldSpace!.instances;
+    final size = Utils.formatSize(_cls.newSpace!.size + _cls.oldSpace!.size);
     children = <Element>[
       new DivElement()
         ..classes = ['memberList']
@@ -104,7 +104,7 @@
                 ..text = 'strongly reachable ',
               new DivElement()
                 ..classes = ['memberValue']
-                ..children = <Element>[_strong.element]
+                ..children = <Element>[_strong!.element]
             ],
           new DivElement()
             ..classes = ['memberItem']
@@ -137,14 +137,14 @@
   List<Element> _createReachableSizeValue() {
     final content = <Element>[];
     if (_reachableSize != null) {
-      if (_reachableSize.isSentinel) {
-        content.add(
-            new SentinelValueElement(_reachableSize.asSentinel, queue: _r.queue)
-                .element);
+      if (_reachableSize!.isSentinel) {
+        content.add(new SentinelValueElement(_reachableSize!.asSentinel!,
+                queue: _r.queue)
+            .element);
       } else {
         content.add(new SpanElement()
           ..text = Utils.formatSize(
-              int.parse(_reachableSize.asValue.valueAsString)));
+              int.parse(_reachableSize!.asValue!.valueAsString!)));
       }
     } else {
       content.add(new SpanElement()..text = '...');
@@ -156,7 +156,7 @@
     button.onClick.listen((_) async {
       button.disabled = true;
       _loadingReachableBytes = true;
-      _reachableSize = await _reachableSizes.get(_isolate, _cls.id);
+      _reachableSize = await _reachableSizes.get(_isolate, _cls.id!);
       _r.dirty();
     });
     content.add(button);
@@ -166,14 +166,14 @@
   List<Element> _createRetainedSizeValue() {
     final content = <Element>[];
     if (_retainedSize != null) {
-      if (_retainedSize.isSentinel) {
-        content.add(
-            new SentinelValueElement(_retainedSize.asSentinel, queue: _r.queue)
-                .element);
+      if (_retainedSize!.isSentinel) {
+        content.add(new SentinelValueElement(_retainedSize!.asSentinel!,
+                queue: _r.queue)
+            .element);
       } else {
         content.add(new SpanElement()
-          ..text =
-              Utils.formatSize(int.parse(_retainedSize.asValue.valueAsString)));
+          ..text = Utils.formatSize(
+              int.parse(_retainedSize!.asValue!.valueAsString!)));
       }
     } else {
       content.add(new SpanElement()..text = '...');
@@ -185,7 +185,7 @@
     button.onClick.listen((_) async {
       button.disabled = true;
       _loadingRetainedBytes = true;
-      _retainedSize = await _retainedSizes.get(_isolate, _cls.id);
+      _retainedSize = await _retainedSizes.get(_isolate, _cls.id!);
       _r.dirty();
     });
     content.add(button);
diff --git a/runtime/observatory/lib/src/elements/class_ref.dart b/runtime/observatory/lib/src/elements/class_ref.dart
index 29ca871..824d0b1 100644
--- a/runtime/observatory/lib/src/elements/class_ref.dart
+++ b/runtime/observatory/lib/src/elements/class_ref.dart
@@ -10,18 +10,18 @@
 import 'package:observatory/src/elements/helpers/uris.dart';
 
 class ClassRefElement extends CustomElement implements Renderable {
-  RenderingScheduler<ClassRefElement> _r;
+  late RenderingScheduler<ClassRefElement> _r;
 
   Stream<RenderedEvent<ClassRefElement>> get onRendered => _r.onRendered;
 
-  M.IsolateRef _isolate;
-  M.ClassRef _class;
+  late M.IsolateRef _isolate;
+  late M.ClassRef _class;
 
   M.IsolateRef get isolate => _isolate;
   M.ClassRef get cls => _class;
 
   factory ClassRefElement(M.IsolateRef isolate, M.ClassRef cls,
-      {RenderingQueue queue}) {
+      {RenderingQueue? queue}) {
     assert(cls != null);
     ClassRefElement e = new ClassRefElement.created();
     e._r = new RenderingScheduler<ClassRefElement>(e, queue: queue);
diff --git a/runtime/observatory/lib/src/elements/class_tree.dart b/runtime/observatory/lib/src/elements/class_tree.dart
index 5eb5f9c..b0ef85c 100644
--- a/runtime/observatory/lib/src/elements/class_tree.dart
+++ b/runtime/observatory/lib/src/elements/class_tree.dart
@@ -19,26 +19,26 @@
 import 'package:observatory/src/elements/nav/vm_menu.dart';
 
 class ClassTreeElement extends CustomElement implements Renderable {
-  RenderingScheduler<ClassTreeElement> _r;
+  late RenderingScheduler<ClassTreeElement> _r;
 
   Stream<RenderedEvent<ClassTreeElement>> get onRendered => _r.onRendered;
 
-  M.VMRef _vm;
-  M.IsolateRef _isolate;
-  M.EventRepository _events;
-  M.NotificationRepository _notifications;
-  M.ClassRepository _classes;
-  M.Class _object;
+  late M.VM _vm;
+  late M.IsolateRef _isolate;
+  late M.EventRepository _events;
+  late M.NotificationRepository _notifications;
+  late M.ClassRepository _classes;
+  M.Class? _object;
   final _subclasses = <String, Iterable<M.Class>>{};
-  final _mixins = <String, List<M.Instance>>{};
+  final _mixins = <String, List<M.Instance>?>{};
 
   factory ClassTreeElement(
-      M.VMRef vm,
+      M.VM vm,
       M.IsolateRef isolate,
       M.EventRepository events,
       M.NotificationRepository notifications,
       M.ClassRepository classes,
-      {RenderingQueue queue}) {
+      {RenderingQueue? queue}) {
     assert(vm != null);
     assert(isolate != null);
     assert(events != null);
@@ -70,7 +70,7 @@
     _r.disable(notify: true);
   }
 
-  VirtualTreeElement _tree;
+  VirtualTreeElement? _tree;
 
   void render() {
     children = <Element>[
@@ -98,8 +98,8 @@
   Element _createTree() {
     _tree = new VirtualTreeElement(_create, _update, _children,
         items: [_object], search: _search, queue: _r.queue);
-    _tree.expand(_object, autoExpandSingleChildNodes: true);
-    return _tree.element;
+    _tree!.expand(_object, autoExpandSingleChildNodes: true);
+    return _tree!.element;
   }
 
   Future _refresh() async {
@@ -111,25 +111,26 @@
   }
 
   Future<M.Class> _register(M.Class cls) async {
-    _subclasses[cls.id] = await Future.wait(
-        (await Future.wait(cls.subclasses.map(_getActualChildrens)))
+    _subclasses[cls.id!] = await Future.wait(
+        (await Future.wait(cls.subclasses!.map(_getActualChildrens)))
             .expand((f) => f)
             .map(_register));
     return cls;
   }
 
   Future<Iterable<M.Class>> _getActualChildrens(M.ClassRef ref) async {
-    var cls = await _classes.get(_isolate, ref.id);
-    if (cls.isPatch) {
+    var cls = await _classes.get(_isolate, ref.id!);
+    if (cls.isPatch!) {
       return const [];
     }
     if (cls.mixin == null) {
       return [cls];
     }
-    return (await Future.wait(cls.subclasses.map(_getActualChildrens)))
+    return (await Future.wait(cls.subclasses!.map(_getActualChildrens)))
         .expand((f) => f)
           ..forEach((subcls) {
-            _mixins[subcls.id] = (_mixins[subcls.id] ?? [])..add(cls.mixin);
+            _mixins[subcls.id!] = (_mixins[subcls.id!] ?? [])
+              ..add(cls.mixin as M.Instance);
           });
   }
 
@@ -147,23 +148,23 @@
 
   void _update(HtmlElement el, classDynamic, int index) {
     M.Class cls = classDynamic;
-    virtualTreeUpdateLines(el.children[0], index);
-    if (cls.subclasses.isEmpty) {
+    virtualTreeUpdateLines(el.children[0] as SpanElement, index);
+    if (cls.subclasses!.isEmpty) {
       el.children[1].text = '';
     } else {
-      el.children[1].text = _tree.isExpanded(cls) ? '▼' : '►';
+      el.children[1].text = _tree!.isExpanded(cls) ? '▼' : '►';
     }
     el.children[2].children = <Element>[
       new ClassRefElement(_isolate, cls, queue: _r.queue).element
     ];
     if (_mixins[cls.id] != null) {
-      el.children[2].children.addAll(_createMixins(_mixins[cls.id]));
+      el.children[2].children.addAll(_createMixins(_mixins[cls.id]!));
     }
   }
 
   bool _search(Pattern pattern, classDynamic) {
     M.Class cls = classDynamic;
-    return cls.name.contains(pattern);
+    return cls.name!.contains(pattern);
   }
 
   List<Element> _createMixins(List<M.Instance> types) {
@@ -171,8 +172,8 @@
         .expand((type) => <Element>[
               new SpanElement()..text = ', ',
               type.typeClass == null
-                  ? (new SpanElement()..text = type.name.split('<').first)
-                  : new ClassRefElement(_isolate, type.typeClass,
+                  ? (new SpanElement()..text = type.name!.split('<').first)
+                  : new ClassRefElement(_isolate, type.typeClass!,
                           queue: _r.queue)
                       .element
             ])
@@ -183,6 +184,6 @@
 
   Iterable<M.Class> _children(classDynamic) {
     M.Class cls = classDynamic;
-    return _subclasses[cls.id];
+    return _subclasses[cls.id]!;
   }
 }
diff --git a/runtime/observatory/lib/src/elements/class_view.dart b/runtime/observatory/lib/src/elements/class_view.dart
index d80597e..6ac2e06 100644
--- a/runtime/observatory/lib/src/elements/class_view.dart
+++ b/runtime/observatory/lib/src/elements/class_view.dart
@@ -33,27 +33,27 @@
 import 'package:observatory/src/elements/view_footer.dart';
 
 class ClassViewElement extends CustomElement implements Renderable {
-  RenderingScheduler<ClassViewElement> _r;
+  late RenderingScheduler<ClassViewElement> _r;
 
   Stream<RenderedEvent<ClassViewElement>> get onRendered => _r.onRendered;
 
-  M.VM _vm;
-  M.IsolateRef _isolate;
-  M.EventRepository _events;
-  M.NotificationRepository _notifications;
-  M.Class _cls;
-  M.ClassRepository _classes;
-  M.RetainedSizeRepository _retainedSizes;
-  M.ReachableSizeRepository _reachableSizes;
-  M.InboundReferencesRepository _references;
-  M.RetainingPathRepository _retainingPaths;
-  M.StronglyReachableInstancesRepository _stronglyReachableInstances;
-  M.FieldRepository _fields;
-  M.ScriptRepository _scripts;
-  M.ObjectRepository _objects;
-  M.EvalRepository _eval;
-  M.ClassSampleProfileRepository _profiles;
-  Iterable<M.Field> _classFields;
+  late M.VM _vm;
+  late M.IsolateRef _isolate;
+  late M.EventRepository _events;
+  late M.NotificationRepository _notifications;
+  late M.Class _cls;
+  late M.ClassRepository _classes;
+  late M.RetainedSizeRepository _retainedSizes;
+  late M.ReachableSizeRepository _reachableSizes;
+  late M.InboundReferencesRepository _references;
+  late M.RetainingPathRepository _retainingPaths;
+  late M.StronglyReachableInstancesRepository _stronglyReachableInstances;
+  late M.FieldRepository _fields;
+  late M.ScriptRepository _scripts;
+  late M.ObjectRepository _objects;
+  late M.EvalRepository _eval;
+  late M.ClassSampleProfileRepository _profiles;
+  Iterable<M.Field>? _classFields;
 
   M.VMRef get vm => _vm;
   M.IsolateRef get isolate => _isolate;
@@ -77,7 +77,7 @@
       M.EvalRepository eval,
       M.StronglyReachableInstancesRepository stronglyReachable,
       M.ClassSampleProfileRepository profiles,
-      {RenderingQueue queue}) {
+      {RenderingQueue? queue}) {
     assert(vm != null);
     assert(isolate != null);
     assert(events != null);
@@ -131,8 +131,8 @@
     children = <Element>[];
   }
 
-  ObjectCommonElement _common;
-  ClassInstancesElement _classInstances;
+  ObjectCommonElement? _common;
+  ClassInstancesElement? _classInstances;
   bool _loadProfile = false;
 
   void render() {
@@ -145,10 +145,10 @@
             _reachableSizes, _stronglyReachableInstances, _objects,
             queue: _r.queue);
     var header = '';
-    if (_cls.isAbstract) {
+    if (_cls.isAbstract!) {
       header += 'abstract ';
     }
-    if (_cls.isPatch) {
+    if (_cls.isPatch!) {
       header += 'patch ';
     }
     children = <Element>[
@@ -182,7 +182,7 @@
         ..children = <Element>[
           new HeadingElement.h2()..text = '$header class ${_cls.name}',
           new HRElement(),
-          _common.element,
+          _common!.element,
           new BRElement(),
           new DivElement()
             ..classes = ['memberList']
@@ -192,7 +192,7 @@
                 ? const []
                 : [
                     new HRElement(),
-                    new ErrorRefElement(_cls.error, queue: _r.queue).element
+                    new ErrorRefElement(_cls.error!, queue: _r.queue).element
                   ],
           new HRElement(),
           new EvalBoxElement(_isolate, _cls, _objects, _eval, queue: _r.queue)
@@ -204,7 +204,7 @@
             ..children = _createElements(),
           new HRElement(),
           new HeadingElement.h2()..text = 'Instances',
-          new DivElement()..children = [_classInstances.element],
+          new DivElement()..children = [_classInstances!.element],
           new HRElement(),
           new HeadingElement.h2()..text = 'Allocations',
           new DivElement()
@@ -215,7 +215,7 @@
                 ..text = 'Tracing allocations?	',
               new DivElement()
                 ..classes = ['memberValue']
-                ..children = _cls.traceAllocations
+                ..children = _cls.traceAllocations!
                     ? [
                         new SpanElement()..text = 'Yes ',
                         new ButtonElement()
@@ -251,7 +251,7 @@
             ..children = _cls.location != null
                 ? [
                     new HRElement(),
-                    new SourceInsetElement(_isolate, _cls.location, _scripts,
+                    new SourceInsetElement(_isolate, _cls.location!, _scripts,
                             _objects, _events,
                             queue: _r.queue)
                         .element
@@ -263,8 +263,8 @@
     ];
   }
 
-  bool _fieldsExpanded;
-  bool _functionsExpanded;
+  bool? _fieldsExpanded;
+  bool? _functionsExpanded;
 
   List<Element> _createMembers() {
     final members = <Element>[];
@@ -278,7 +278,7 @@
           new DivElement()
             ..classes = ['memberValue']
             ..children = <Element>[
-              new LibraryRefElement(_isolate, _cls.library, queue: _r.queue)
+              new LibraryRefElement(_isolate, _cls.library!, queue: _r.queue)
                   .element
             ]
         ]);
@@ -293,7 +293,7 @@
           new DivElement()
             ..classes = ['memberValue']
             ..children = <Element>[
-              new SourceLinkElement(_isolate, _cls.location, _scripts,
+              new SourceLinkElement(_isolate, _cls.location!, _scripts,
                       queue: _r.queue)
                   .element
             ]
@@ -309,7 +309,7 @@
           new DivElement()
             ..classes = ['memberValue']
             ..children = <Element>[
-              new ClassRefElement(_isolate, _cls.superclass, queue: _r.queue)
+              new ClassRefElement(_isolate, _cls.superclass!, queue: _r.queue)
                   .element
             ]
         ]);
@@ -324,7 +324,7 @@
           new DivElement()
             ..classes = ['memberValue']
             ..children = <Element>[
-              new InstanceRefElement(_isolate, _cls.superType, _objects,
+              new InstanceRefElement(_isolate, _cls.superType!, _objects,
                       queue: _r.queue)
                   .element
             ]
@@ -340,13 +340,13 @@
           new DivElement()
             ..classes = ['memberValue']
             ..children = <Element>[
-              new InstanceRefElement(_isolate, _cls.mixin, _objects,
+              new InstanceRefElement(_isolate, _cls.mixin!, _objects,
                       queue: _r.queue)
                   .element
             ]
         ]);
     }
-    if (_cls.subclasses.length > 0) {
+    if (_cls.subclasses!.length > 0) {
       members.add(new DivElement()
         ..classes = ['memberItem']
         ..children = <Element>[
@@ -355,7 +355,7 @@
             ..text = 'extended by',
           new DivElement()
             ..classes = ['memberValue']
-            ..children = (_cls.subclasses
+            ..children = (_cls.subclasses!
                 .expand((subcls) => <Element>[
                       new ClassRefElement(_isolate, subcls, queue: _r.queue)
                           .element,
@@ -368,7 +368,7 @@
 
     members.add(new BRElement());
 
-    if (_cls.interfaces.length > 0) {
+    if (_cls.interfaces!.length > 0) {
       members.add(new DivElement()
         ..classes = ['memberItem']
         ..children = <Element>[
@@ -377,7 +377,7 @@
             ..text = 'implements',
           new DivElement()
             ..classes = ['memberValue']
-            ..children = (_cls.interfaces
+            ..children = (_cls.interfaces!
                 .expand((interf) => <Element>[
                       new InstanceRefElement(_isolate, interf, _objects,
                               queue: _r.queue)
@@ -405,8 +405,8 @@
 
   List<Element> _createElements() {
     final members = <Element>[];
-    if (_classFields != null && _classFields.isNotEmpty) {
-      final fields = _classFields.toList();
+    if (_classFields != null && _classFields!.isNotEmpty) {
+      final fields = _classFields!.toList();
       _fieldsExpanded = _fieldsExpanded ?? (fields.length <= 8);
       members.add(new DivElement()
         ..classes = ['memberItem']
@@ -417,7 +417,7 @@
           new DivElement()
             ..classes = ['memberValue']
             ..children = <Element>[
-              (new CurlyBlockElement(expanded: _fieldsExpanded)
+              (new CurlyBlockElement(expanded: _fieldsExpanded!)
                     ..onToggle
                         .listen((e) => _fieldsExpanded = e.control.expanded)
                     ..content = <Element>[
@@ -451,8 +451,8 @@
         ]);
     }
 
-    if (_cls.functions.isNotEmpty) {
-      final functions = _cls.functions.toList();
+    if (_cls.functions!.isNotEmpty) {
+      final functions = _cls.functions!.toList();
       _functionsExpanded = _functionsExpanded ?? (functions.length <= 8);
       members.add(new DivElement()
         ..classes = ['memberItem']
@@ -463,7 +463,7 @@
           new DivElement()
             ..classes = ['memberValue']
             ..children = <Element>[
-              (new CurlyBlockElement(expanded: _functionsExpanded)
+              (new CurlyBlockElement(expanded: _functionsExpanded!)
                     ..onToggle
                         .listen((e) => _functionsExpanded = e.control.expanded)
                     ..content = (functions
@@ -482,14 +482,14 @@
   }
 
   Future _refresh() async {
-    _cls = await _classes.get(_isolate, _cls.id);
+    _cls = await _classes.get(_isolate, _cls.id!);
     await _loadAdditionalData();
     _r.dirty();
   }
 
   Future _loadAdditionalData() async {
-    _classFields =
-        await Future.wait(_cls.fields.map((f) => _fields.get(_isolate, f.id)));
+    _classFields = await Future.wait(
+        _cls.fields!.map((f) => _fields.get(_isolate, f.id!)));
     _r.dirty();
   }
 }
diff --git a/runtime/observatory/lib/src/elements/code_ref.dart b/runtime/observatory/lib/src/elements/code_ref.dart
index bb02f4c..60140ca 100644
--- a/runtime/observatory/lib/src/elements/code_ref.dart
+++ b/runtime/observatory/lib/src/elements/code_ref.dart
@@ -13,18 +13,18 @@
 import 'package:observatory/src/elements/helpers/uris.dart';
 
 class CodeRefElement extends CustomElement implements Renderable {
-  RenderingScheduler<CodeRefElement> _r;
+  late RenderingScheduler<CodeRefElement> _r;
 
   Stream<RenderedEvent<CodeRefElement>> get onRendered => _r.onRendered;
 
-  M.IsolateRef _isolate;
-  M.CodeRef _code;
+  M.IsolateRef? _isolate;
+  late M.CodeRef _code;
 
-  M.IsolateRef get isolate => _isolate;
+  M.IsolateRef get isolate => _isolate!;
   M.CodeRef get code => _code;
 
-  factory CodeRefElement(M.IsolateRef isolate, M.CodeRef code,
-      {RenderingQueue queue}) {
+  factory CodeRefElement(M.IsolateRef? isolate, M.CodeRef code,
+      {RenderingQueue? queue}) {
     assert(code != null);
     CodeRefElement e = new CodeRefElement.created();
     e._r = new RenderingScheduler<CodeRefElement>(e, queue: queue);
@@ -53,7 +53,7 @@
       new AnchorElement(
           href: ((M.isSyntheticCode(_code.kind)) || (_isolate == null))
               ? null
-              : Uris.inspect(_isolate, object: _code))
+              : Uris.inspect(_isolate!, object: _code))
         ..text = _code.name
     ];
   }
diff --git a/runtime/observatory/lib/src/elements/code_view.dart b/runtime/observatory/lib/src/elements/code_view.dart
index 776ed04..c210fcc 100644
--- a/runtime/observatory/lib/src/elements/code_view.dart
+++ b/runtime/observatory/lib/src/elements/code_view.dart
@@ -37,22 +37,22 @@
 }
 
 class CodeViewElement extends CustomElement implements Renderable {
-  RenderingScheduler<CodeViewElement> _r;
+  late RenderingScheduler<CodeViewElement> _r;
 
   Stream<RenderedEvent<CodeViewElement>> get onRendered => _r.onRendered;
 
-  M.VM _vm;
-  M.IsolateRef _isolate;
-  M.EventRepository _events;
-  M.NotificationRepository _notifications;
-  M.Code _code;
-  M.RetainedSizeRepository _retainedSizes;
-  M.ReachableSizeRepository _reachableSizes;
-  M.InboundReferencesRepository _references;
-  M.RetainingPathRepository _retainingPaths;
-  M.ObjectRepository _objects;
-  DisassemblyTable disassemblyTable;
-  InlineTable inlineTable;
+  late M.VM _vm;
+  late M.IsolateRef _isolate;
+  late M.EventRepository _events;
+  late M.NotificationRepository _notifications;
+  late M.Code _code;
+  late M.RetainedSizeRepository _retainedSizes;
+  late M.ReachableSizeRepository _reachableSizes;
+  late M.InboundReferencesRepository _references;
+  late M.RetainingPathRepository _retainingPaths;
+  late M.ObjectRepository _objects;
+  late DisassemblyTable disassemblyTable;
+  late InlineTable inlineTable;
 
   static const kDisassemblyColumnIndex = 3;
 
@@ -72,7 +72,7 @@
       M.InboundReferencesRepository references,
       M.RetainingPathRepository retainingPaths,
       M.ObjectRepository objects,
-      {RenderingQueue queue}) {
+      {RenderingQueue? queue}) {
     assert(vm != null);
     assert(isolate != null);
     assert(events != null);
@@ -129,15 +129,15 @@
     children = <Element>[];
   }
 
-  TableElement _disassemblyTable;
-  TableElement _inlineRangeTable;
-  Element _disassemblyTableBody;
-  Element _inlineRangeTableBody;
+  TableElement? _disassemblyTable;
+  TableElement? _inlineRangeTable;
+  Element? _disassemblyTableBody;
+  Element? _inlineRangeTableBody;
 
   void render() {
     if (_inlineRangeTable == null) {
       _inlineRangeTable = new TableElement()..classes = ['table'];
-      _inlineRangeTable.createTHead().children = <Element>[
+      _inlineRangeTable!.createTHead().children = <Element>[
         new TableRowElement()
           ..children = <Element>[
             document.createElement('th')
@@ -152,12 +152,12 @@
             document.createElement('th')..text = 'Functions',
           ]
       ];
-      _inlineRangeTableBody = _inlineRangeTable.createTBody();
-      _inlineRangeTableBody.classes = ['monospace'];
+      _inlineRangeTableBody = _inlineRangeTable!.createTBody();
+      _inlineRangeTableBody!.classes = ['monospace'];
     }
     if (_disassemblyTable == null) {
       _disassemblyTable = new TableElement()..classes = ['table'];
-      _disassemblyTable.createTHead().children = <Element>[
+      _disassemblyTable!.createTHead().children = <Element>[
         new TableRowElement()
           ..children = <Element>[
             document.createElement('th')
@@ -179,17 +179,17 @@
               ..text = 'Object',
           ]
       ];
-      _disassemblyTableBody = _disassemblyTable.createTBody();
-      _disassemblyTableBody.classes = ['monospace'];
+      _disassemblyTableBody = _disassemblyTable!.createTBody();
+      _disassemblyTableBody!.classes = ['monospace'];
     }
-    final inlinedFunctions = _code.inlinedFunctions.toList();
+    final inlinedFunctions = _code.inlinedFunctions!.toList();
     final S.Code code = _code as S.Code;
     children = <Element>[
       navBar(<Element>[
         new NavTopMenuElement(queue: _r.queue).element,
         new NavVMMenuElement(_vm, _events, queue: _r.queue).element,
         new NavIsolateMenuElement(_isolate, _events, queue: _r.queue).element,
-        navMenu(_code.name),
+        navMenu(_code.name!),
         (new NavRefreshElement(queue: _r.queue)
               ..onRefresh.listen((e) async {
                 e.element.disabled = true;
@@ -208,7 +208,7 @@
         ..classes = ['content-centered-big']
         ..children = <Element>[
           new HeadingElement.h1()
-            ..text = (M.isDartCode(_code.kind) && _code.isOptimized)
+            ..text = (M.isDartCode(_code.kind) && _code.isOptimized!)
                 ? 'Optimized code for ${_code.name}'
                 : 'Code for ${_code.name}',
           new HRElement(),
@@ -240,7 +240,7 @@
                           ..text = 'Optimized',
                         new DivElement()
                           ..classes = ['memberValue']
-                          ..text = _code.isOptimized ? 'Yes' : 'No'
+                          ..text = _code.isOptimized! ? 'Yes' : 'No'
                       ],
               new DivElement()
                 ..classes = ['memberItem']
@@ -251,7 +251,7 @@
                   new DivElement()
                     ..classes = ['memberValue']
                     ..children = <Element>[
-                      new FunctionRefElement(_isolate, _code.function,
+                      new FunctionRefElement(_isolate, _code.function!,
                               queue: _r.queue)
                           .element
                     ]
@@ -266,7 +266,7 @@
                           ..text = 'Inclusive',
                         new DivElement()
                           ..classes = ['memberValue']
-                          ..text = '${code.profile.formattedInclusiveTicks}'
+                          ..text = '${code.profile!.formattedInclusiveTicks}'
                       ],
               new DivElement()
                 ..classes = ['memberItem']
@@ -278,7 +278,7 @@
                           ..text = 'Exclusive',
                         new DivElement()
                           ..classes = ['memberValue']
-                          ..text = '${code.profile.formattedExclusiveTicks}'
+                          ..text = '${code.profile!.formattedExclusiveTicks}'
                       ],
               new DivElement()
                 ..classes = ['memberItem']
@@ -289,7 +289,7 @@
                   new DivElement()
                     ..classes = ['memberValue']
                     ..children = <Element>[
-                      new ObjectPoolRefElement(_isolate, _code.objectPool,
+                      new ObjectPoolRefElement(_isolate, _code.objectPool!,
                               queue: _r.queue)
                           .element
                     ]
@@ -320,9 +320,9 @@
                       ]
             ],
           new HRElement(),
-          _inlineRangeTable,
+          _inlineRangeTable!,
           new HRElement(),
-          _disassemblyTable
+          _disassemblyTable!
         ],
     ];
     _updateDisassembly();
@@ -337,11 +337,10 @@
 
   Future _refreshTicks() async {
     S.Code code = _code as S.Code;
-    final isolate = code.isolate;
-    S.ServiceMap response =
-        await isolate.invokeRpc('_getCpuProfile', {'tags': 'None'});
+    final isolate = code.isolate!;
+    var response = await isolate.invokeRpc('_getCpuProfile', {'tags': 'None'});
     final cpuProfile = new SampleProfile();
-    await cpuProfile.load(isolate, response);
+    await cpuProfile.load(isolate, response as S.ServiceMap);
     _r.dirty();
   }
 
@@ -363,7 +362,7 @@
     if (code.profile == null) {
       return '';
     }
-    var intervalTick = code.profile.intervalTicks[interval.start];
+    var intervalTick = code.profile!.intervalTicks[interval.start];
     if (intervalTick == null) {
       return '';
     }
@@ -372,7 +371,7 @@
       return '';
     }
     var pcent = Utils.formatPercent(
-        intervalTick.inclusiveTicks, code.profile.profile.sampleCount);
+        intervalTick.inclusiveTicks, code.profile!.profile.sampleCount);
     return '$pcent (${intervalTick.inclusiveTicks})';
   }
 
@@ -381,21 +380,22 @@
     if (code.profile == null) {
       return '';
     }
-    var intervalTick = code.profile.intervalTicks[interval.start];
+    var intervalTick = code.profile!.intervalTicks[interval.start];
     if (intervalTick == null) {
       return '';
     }
     var pcent = Utils.formatPercent(
-        intervalTick.exclusiveTicks, code.profile.profile.sampleCount);
+        intervalTick.exclusiveTicks, code.profile!.profile.sampleCount);
     return '$pcent (${intervalTick.exclusiveTicks})';
   }
 
   String _formattedInclusive(S.CodeInstruction instruction) {
     S.Code code = _code as S.Code;
-    if (code.profile == null) {
+    var profile = code.profile;
+    if (profile == null) {
       return '';
     }
-    var tick = code.profile.addressTicks[instruction.address];
+    var tick = profile.addressTicks[instruction.address];
     if (tick == null) {
       return '';
     }
@@ -403,22 +403,23 @@
     if (tick.inclusiveTicks == tick.exclusiveTicks) {
       return '';
     }
-    var pcent = Utils.formatPercent(
-        tick.inclusiveTicks, code.profile.profile.sampleCount);
+    var pcent =
+        Utils.formatPercent(tick.inclusiveTicks, profile.profile.sampleCount);
     return '$pcent (${tick.inclusiveTicks})';
   }
 
   String _formattedExclusive(S.CodeInstruction instruction) {
     S.Code code = _code as S.Code;
-    if (code.profile == null) {
+    var profile = code.profile;
+    if (profile == null) {
       return '';
     }
-    var tick = code.profile.addressTicks[instruction.address];
+    var tick = profile.addressTicks[instruction.address];
     if (tick == null) {
       return '';
     }
-    var pcent = Utils.formatPercent(
-        tick.exclusiveTicks, code.profile.profile.sampleCount);
+    var pcent =
+        Utils.formatPercent(tick.exclusiveTicks, profile.profile.sampleCount);
     return '$pcent (${tick.exclusiveTicks})';
   }
 
@@ -441,7 +442,7 @@
   }
 
   void _addDisassemblyDOMRow() {
-    var tableBody = _disassemblyTableBody;
+    var tableBody = _disassemblyTableBody!;
     assert(tableBody != null);
     var tr = new TableRowElement();
 
@@ -492,7 +493,7 @@
   }
 
   void _updateDisassemblyDOMTable() {
-    var tableBody = _disassemblyTableBody;
+    var tableBody = _disassemblyTableBody!;
     assert(tableBody != null);
     // Resize DOM table.
     if (tableBody.children.length > disassemblyTable.sortedRows.length) {
@@ -517,7 +518,7 @@
     var i = 0;
     for (var tr in tableBody.children) {
       var rowIndex = disassemblyTable.sortedRows[i];
-      _fillDisassemblyDOMRow(tr, rowIndex);
+      _fillDisassemblyDOMRow(tr as TableRowElement, rowIndex);
       i++;
     }
   }
@@ -542,7 +543,7 @@
   }
 
   void _addInlineDOMRow() {
-    var tableBody = _inlineRangeTableBody;
+    var tableBody = _inlineRangeTableBody!;
     assert(tableBody != null);
     var tr = new TableRowElement();
 
@@ -595,7 +596,7 @@
   }
 
   void _updateInlineDOMTable() {
-    var tableBody = _inlineRangeTableBody;
+    var tableBody = _inlineRangeTableBody!;
     // Resize DOM table.
     if (tableBody.children.length > inlineTable.sortedRows.length) {
       // Shrink the table.
@@ -615,7 +616,7 @@
     for (var i = 0; i < inlineTable.sortedRows.length; i++) {
       var rowIndex = inlineTable.sortedRows[i];
       var tr = tableBody.children[i];
-      _fillInlineDOMRow(tr, rowIndex);
+      _fillInlineDOMRow(tr as TableRowElement, rowIndex);
     }
   }
 
@@ -624,7 +625,7 @@
     _updateInlineDOMTable();
   }
 
-  static String _codeKindToString(M.CodeKind kind) {
+  static String _codeKindToString(M.CodeKind? kind) {
     switch (kind) {
       case M.CodeKind.dart:
         return 'dart';
diff --git a/runtime/observatory/lib/src/elements/containers/search_bar.dart b/runtime/observatory/lib/src/elements/containers/search_bar.dart
index c66f284..fda5ddf 100644
--- a/runtime/observatory/lib/src/elements/containers/search_bar.dart
+++ b/runtime/observatory/lib/src/elements/containers/search_bar.dart
@@ -17,7 +17,7 @@
 typedef Iterable<dynamic> SearchBarSearchCallback(Pattern pattern);
 
 class SearchBarElement extends CustomElement implements Renderable {
-  RenderingScheduler<SearchBarElement> _r;
+  late RenderingScheduler<SearchBarElement> _r;
 
   StreamController<SearchResultSelected> _onSearchResultSelected =
       new StreamController<SearchResultSelected>.broadcast();
@@ -26,11 +26,11 @@
   Stream<SearchResultSelected> get onSearchResultSelected =>
       _onSearchResultSelected.stream;
 
-  StreamSubscription _onKeyDownSubscription;
+  late StreamSubscription _onKeyDownSubscription;
 
-  Element _workspace;
-  SearchBarSearchCallback _search;
-  bool _isOpen;
+  Element? _workspace;
+  late SearchBarSearchCallback _search;
+  late bool _isOpen;
   bool _focusRequested = false;
   String _lastValue = '';
   List _results = const [];
@@ -41,7 +41,7 @@
 
   set isOpen(bool value) {
     if (!value) {
-      _input.value = '';
+      _input!.value = '';
       _lastValue = '';
       if (_results.isNotEmpty) {
         _results = const [];
@@ -53,7 +53,7 @@
   }
 
   factory SearchBarElement(SearchBarSearchCallback search,
-      {bool isOpen: false, Element workspace, RenderingQueue queue}) {
+      {bool isOpen: false, Element? workspace, RenderingQueue? queue}) {
     assert(search != null);
     assert(isOpen != null);
     SearchBarElement e = new SearchBarElement.created();
@@ -72,11 +72,11 @@
     _r.enable();
     _workspace?.tabIndex = 1;
     _onKeyDownSubscription = (_workspace ?? window).onKeyDown.listen((e) {
-      if (e.key.toLowerCase() == 'f' &&
+      if (e.key!.toLowerCase() == 'f' &&
           !e.shiftKey &&
           !e.altKey &&
           e.ctrlKey != e.metaKey) {
-        if (e.metaKey == window.navigator.platform.startsWith('Mac')) {
+        if (e.metaKey == window.navigator.platform!.startsWith('Mac')) {
           e.stopPropagation();
           e.preventDefault();
           isOpen = true;
@@ -94,15 +94,15 @@
     _onKeyDownSubscription.cancel();
   }
 
-  TextInputElement _input;
-  SpanElement _resultsArea;
+  TextInputElement? _input;
+  SpanElement? _resultsArea;
 
   void render() {
     if (_input == null) {
       _input = new TextInputElement()
         ..onKeyPress.listen((e) {
           if (e.keyCode == KeyCode.ENTER) {
-            if (_input.value == '') {
+            if (_input!.value == '') {
               _lastValue = '';
               if (_results.isNotEmpty) {
                 _results = const [];
@@ -110,9 +110,9 @@
                 _triggerSearchResultSelected();
                 _r.dirty();
               }
-            } else if (_input.value != _lastValue) {
-              _lastValue = _input.value;
-              _results = _doSearch(_input.value);
+            } else if (_input!.value != _lastValue) {
+              _lastValue = _input!.value!;
+              _results = _doSearch(_input!.value!);
               _current = 0;
               _triggerSearchResultSelected();
               _r.dirty();
@@ -127,8 +127,8 @@
         });
       _resultsArea = new SpanElement();
       children = <Element>[
-        _input,
-        _resultsArea,
+        _input!,
+        _resultsArea!,
         new ButtonElement()
           ..text = '❌'
           ..onClick.listen((_) {
@@ -136,7 +136,7 @@
           })
       ];
     }
-    _resultsArea.nodes = [
+    _resultsArea!.nodes = [
       new ButtonElement()
         ..text = '▲'
         ..disabled = _results.isEmpty
@@ -150,7 +150,7 @@
     ];
     style.visibility = isOpen ? null : 'collapse';
     if (_focusRequested) {
-      _input.focus();
+      _input!.focus();
       _focusRequested = false;
     }
   }
@@ -200,6 +200,6 @@
   Iterable<Match> allMatches(String string, [int start = 0]) =>
       _pattern.allMatches(string.toLowerCase(), start);
 
-  Match matchAsPrefix(String string, [int start = 0]) =>
+  Match? matchAsPrefix(String string, [int start = 0]) =>
       _pattern.matchAsPrefix(string.toLowerCase(), start);
 }
diff --git a/runtime/observatory/lib/src/elements/containers/virtual_collection.dart b/runtime/observatory/lib/src/elements/containers/virtual_collection.dart
index 0890c07..f1f1e33 100644
--- a/runtime/observatory/lib/src/elements/containers/virtual_collection.dart
+++ b/runtime/observatory/lib/src/elements/containers/virtual_collection.dart
@@ -16,26 +16,26 @@
 typedef bool VirtualCollectionSearchCallback(Pattern pattern, dynamic item);
 
 class VirtualCollectionElement extends CustomElement implements Renderable {
-  RenderingScheduler<VirtualCollectionElement> _r;
+  late RenderingScheduler<VirtualCollectionElement> _r;
 
   Stream<RenderedEvent<VirtualCollectionElement>> get onRendered =>
       _r.onRendered;
 
-  VirtualCollectionCreateCallback _create;
-  VirtualCollectionHeaderCallback _createHeader;
-  VirtualCollectionUpdateCallback _update;
-  VirtualCollectionSearchCallback _search;
-  double _itemHeight;
-  int _top;
-  double _height;
-  List _items;
-  StreamSubscription _onScrollSubscription;
-  StreamSubscription _onResizeSubscription;
+  late VirtualCollectionCreateCallback _create;
+  VirtualCollectionHeaderCallback? _createHeader;
+  late VirtualCollectionUpdateCallback _update;
+  VirtualCollectionSearchCallback? _search;
+  double? _itemHeight;
+  int? _top;
+  double? _height;
+  List? _items;
+  late StreamSubscription _onScrollSubscription;
+  late StreamSubscription _onResizeSubscription;
 
-  List get items => _items;
+  List? get items => _items;
 
-  set items(Iterable value) {
-    _items = new List.unmodifiable(value);
+  set items(Iterable? value) {
+    _items = new List.unmodifiable(value!);
     _top = null;
     _searcher?.update();
     _r.dirty();
@@ -44,9 +44,9 @@
   factory VirtualCollectionElement(VirtualCollectionCreateCallback create,
       VirtualCollectionUpdateCallback update,
       {Iterable items: const [],
-      VirtualCollectionHeaderCallback createHeader,
-      VirtualCollectionSearchCallback search,
-      RenderingQueue queue}) {
+      VirtualCollectionHeaderCallback? createHeader,
+      VirtualCollectionSearchCallback? search,
+      RenderingQueue? queue}) {
     assert(create != null);
     assert(update != null);
     assert(items != null);
@@ -81,8 +81,8 @@
     _onResizeSubscription.cancel();
   }
 
-  DivElement _header;
-  SearchBarElement _searcher;
+  DivElement? _header;
+  SearchBarElement? _searcher;
   final DivElement _viewport = new DivElement()
     ..classes = ['viewport', 'container'];
   final DivElement _spacer = new DivElement()..classes = ['spacer'];
@@ -103,10 +103,11 @@
     if (el_index < 0) {
       return null;
     }
-    final item_index =
-        _top + el_index - safeFloor(_buffer.children.length * _inverse_preload);
-    if (0 <= item_index && item_index < items.length) {
-      return _items[item_index];
+    final item_index = _top! +
+        el_index -
+        safeFloor(_buffer.children.length * _inverse_preload);
+    if (0 <= item_index && item_index < items!.length) {
+      return _items![item_index];
     }
     return null;
   }
@@ -148,38 +149,39 @@
               ..onSearchResultSelected.listen((e) {
                 takeIntoView(e.item);
               });
-        children.insert(0, _searcher.element);
+        children.insert(0, _searcher!.element);
       }
       if (_createHeader != null) {
         _header = new DivElement()
           ..classes = ['header', 'container']
-          ..children = _createHeader();
-        children.insert(0, _header);
-        final rect = _header.getBoundingClientRect();
-        _header.classes.add('attached');
+          ..children = _createHeader!();
+        children.insert(0, _header!);
+        final rect = _header!.getBoundingClientRect();
+        _header!.classes.add('attached');
         _viewport.style.top = '${rect.height}px';
-        final width = _header.children.fold(0.0, _foldWidth);
+        final width = _header!.children.fold(0.0, _foldWidth);
         _buffer.style.minWidth = '${width}px';
       }
-      _itemHeight = _buffer.children[0].getBoundingClientRect().height;
-      _height = getBoundingClientRect().height;
+      _itemHeight =
+          _buffer.children[0].getBoundingClientRect().height as double;
+      _height = getBoundingClientRect().height as double;
     }
 
     if (_takeIntoView != null) {
-      final index = items.indexOf(_takeIntoView);
+      final index = items!.indexOf(_takeIntoView);
       if (index >= 0) {
-        final minScrollTop = _itemHeight * (index + 1) - _height;
-        final maxScrollTop = _itemHeight * index;
+        final minScrollTop = _itemHeight! * (index + 1) - _height!;
+        final maxScrollTop = _itemHeight! * index;
         _viewport.scrollTop =
             safeFloor((maxScrollTop - minScrollTop) / 2 + minScrollTop);
       }
       _takeIntoView = null;
     }
 
-    final top = safeFloor(_viewport.scrollTop / _itemHeight);
+    final top = safeFloor(_viewport.scrollTop / _itemHeight!);
 
-    _spacer.style.height = '${_itemHeight * (_items.length)}px';
-    final tail_length = safeCeil(_height / _itemHeight / _preload);
+    _spacer.style.height = '${_itemHeight! * (_items!.length)}px';
+    final tail_length = safeCeil(_height! / _itemHeight! / _preload);
     final length = tail_length * 2 + tail_length * _preload;
 
     if (_buffer.children.length < length) {
@@ -191,13 +193,13 @@
       _top = null; // force update;
     }
 
-    if ((_top == null) || ((top - _top).abs() >= tail_length)) {
-      _buffer.style.top = '${_itemHeight * (top - tail_length)}px';
+    if ((_top == null) || ((top - _top!).abs() >= tail_length)) {
+      _buffer.style.top = '${_itemHeight! * (top - tail_length)}px';
       int i = top - tail_length;
-      for (final HtmlElement e in _buffer.children) {
-        if (0 <= i && i < _items.length) {
+      for (final e in _buffer.children) {
+        if (0 <= i && i < _items!.length) {
           e.style.display = null;
-          _update(e, _items[i], i);
+          _update(e as HtmlElement, _items![i], i);
         } else {
           e.style.display = 'hidden';
         }
@@ -207,11 +209,11 @@
     }
 
     if (_searcher != null) {
-      final current = _searcher.current;
-      int i = _top - tail_length;
-      for (final HtmlElement e in _buffer.children) {
-        if (0 <= i && i < _items.length) {
-          if (_items[i] == current) {
+      final current = _searcher!.current;
+      int i = _top! - tail_length;
+      for (final e in _buffer.children) {
+        if (0 <= i && i < _items!.length) {
+          if (_items![i] == current) {
             e.classes.add('marked');
           } else {
             e.classes.remove('marked');
@@ -224,14 +226,14 @@
   }
 
   double _foldWidth(double value, Element child) {
-    return math.max(value, child.getBoundingClientRect().width);
+    return math.max(value, child.getBoundingClientRect().width as double);
   }
 
   void _updateHeader() {
     if (_header != null) {
-      _header.style.left = '${-_viewport.scrollLeft}px';
+      _header!.style.left = '${-_viewport.scrollLeft}px';
       final width = _buffer.getBoundingClientRect().width;
-      _header.children.last.style.width = '${width}px';
+      _header!.children.last.style.width = '${width}px';
     }
   }
 
@@ -242,8 +244,8 @@
   }
 
   void _onResize(_) {
-    final newHeight = getBoundingClientRect().height;
-    if (newHeight > _height) {
+    final newHeight = getBoundingClientRect().height as double;
+    if (newHeight > _height!) {
       _height = newHeight;
       _r.dirty();
     } else {
@@ -254,6 +256,6 @@
   }
 
   Iterable<dynamic> _doSearch(Pattern search) {
-    return _items.where((item) => _search(search, item));
+    return _items!.where((item) => _search!(search, item));
   }
 }
diff --git a/runtime/observatory/lib/src/elements/containers/virtual_tree.dart b/runtime/observatory/lib/src/elements/containers/virtual_tree.dart
index 0f7939b..b56c36b 100644
--- a/runtime/observatory/lib/src/elements/containers/virtual_tree.dart
+++ b/runtime/observatory/lib/src/elements/containers/virtual_tree.dart
@@ -27,13 +27,13 @@
 }
 
 class VirtualTreeElement extends CustomElement implements Renderable {
-  RenderingScheduler<VirtualTreeElement> _r;
+  late RenderingScheduler<VirtualTreeElement> _r;
 
   Stream<RenderedEvent<VirtualTreeElement>> get onRendered => _r.onRendered;
 
-  VritualTreeGetChildrenCallback _children;
-  List _items;
-  List _depths;
+  late VritualTreeGetChildrenCallback _children;
+  late List _items;
+  late List _depths;
   final Set _expanded = new Set();
 
   List get items => _items;
@@ -47,8 +47,8 @@
   factory VirtualTreeElement(VirtualTreeCreateCallback create,
       VirtualTreeUpdateCallback update, VritualTreeGetChildrenCallback children,
       {Iterable items: const [],
-      VirtualTreeSearchCallback search,
-      RenderingQueue queue}) {
+      VirtualTreeSearchCallback? search,
+      RenderingQueue? queue}) {
     assert(create != null);
     assert(update != null);
     assert(children != null);
@@ -61,7 +61,7 @@
       return element = create((
           {bool autoToggleSingleChildNodes: false,
           bool autoToggleWholeTree: false}) {
-        var item = e._collection.getItemFromElement(element);
+        var item = e._collection!.getItemFromElement(element);
         if (e.isExpanded(item)) {
           e.collapse(item,
               autoCollapseWholeTree: autoToggleWholeTree,
@@ -144,11 +144,11 @@
     children = const [];
   }
 
-  VirtualCollectionElement _collection;
+  VirtualCollectionElement? _collection;
 
   void render() {
     if (children.length == 0) {
-      children = <Element>[_collection.element];
+      children = <Element>[_collection!.element];
     }
 
     final items = [];
@@ -176,8 +176,8 @@
     }
 
     _depths = depths;
-    _collection.items = items;
+    _collection!.items = items;
 
-    _r.waitFor([_collection.onRendered.first]);
+    _r.waitFor([_collection!.onRendered.first]);
   }
 }
diff --git a/runtime/observatory/lib/src/elements/context_ref.dart b/runtime/observatory/lib/src/elements/context_ref.dart
index 6de2c38..7559bbb 100644
--- a/runtime/observatory/lib/src/elements/context_ref.dart
+++ b/runtime/observatory/lib/src/elements/context_ref.dart
@@ -12,15 +12,15 @@
 import 'package:observatory/src/elements/helpers/uris.dart';
 
 class ContextRefElement extends CustomElement implements Renderable {
-  RenderingScheduler<ContextRefElement> _r;
+  late RenderingScheduler<ContextRefElement> _r;
 
   Stream<RenderedEvent<ContextRefElement>> get onRendered => _r.onRendered;
 
-  M.IsolateRef _isolate;
-  M.ContextRef _context;
-  M.ObjectRepository _objects;
-  M.Context _loadedContext;
-  bool _expandable;
+  late M.IsolateRef _isolate;
+  late M.ContextRef _context;
+  late M.ObjectRepository _objects;
+  M.Context? _loadedContext;
+  late bool _expandable;
   bool _expanded = false;
 
   M.IsolateRef get isolate => _isolate;
@@ -28,7 +28,7 @@
 
   factory ContextRefElement(
       M.IsolateRef isolate, M.ContextRef context, M.ObjectRepository objects,
-      {RenderingQueue queue, bool expandable: true}) {
+      {RenderingQueue? queue, bool expandable: true}) {
     assert(isolate != null);
     assert(context != null);
     assert(objects != null);
@@ -57,7 +57,7 @@
   }
 
   Future _refresh() async {
-    _loadedContext = await _objects.get(_isolate, _context.id);
+    _loadedContext = await _objects.get(_isolate, _context.id!) as M.Context;
     _r.dirty();
   }
 
@@ -99,7 +99,7 @@
       return [new SpanElement()..text = 'Loading...'];
     }
     var members = <Element>[];
-    if (_loadedContext.parentContext != null) {
+    if (_loadedContext!.parentContext != null) {
       members.add(new DivElement()
         ..classes = ['memberItem']
         ..children = <Element>[
@@ -110,14 +110,14 @@
             ..classes = ['memberName']
             ..children = <Element>[
               new ContextRefElement(
-                      _isolate, _loadedContext.parentContext, _objects,
+                      _isolate, _loadedContext!.parentContext!, _objects,
                       queue: _r.queue)
                   .element
             ]
         ]);
     }
-    if (_loadedContext.variables.isNotEmpty) {
-      var variables = _loadedContext.variables.toList();
+    if (_loadedContext!.variables!.isNotEmpty) {
+      var variables = _loadedContext!.variables!.toList();
       for (var index = 0; index < variables.length; index++) {
         var variable = variables[index];
         members.add(new DivElement()
diff --git a/runtime/observatory/lib/src/elements/context_view.dart b/runtime/observatory/lib/src/elements/context_view.dart
index f4a1ba4..8cfb76c 100644
--- a/runtime/observatory/lib/src/elements/context_view.dart
+++ b/runtime/observatory/lib/src/elements/context_view.dart
@@ -22,21 +22,21 @@
 import 'package:observatory/src/elements/view_footer.dart';
 
 class ContextViewElement extends CustomElement implements Renderable {
-  RenderingScheduler<ContextViewElement> _r;
+  late RenderingScheduler<ContextViewElement> _r;
 
   Stream<RenderedEvent<ContextViewElement>> get onRendered => _r.onRendered;
 
-  M.VM _vm;
-  M.IsolateRef _isolate;
-  M.EventRepository _events;
-  M.NotificationRepository _notifications;
-  M.Context _context;
-  M.ContextRepository _contexts;
-  M.RetainedSizeRepository _retainedSizes;
-  M.ReachableSizeRepository _reachableSizes;
-  M.InboundReferencesRepository _references;
-  M.RetainingPathRepository _retainingPaths;
-  M.ObjectRepository _objects;
+  late M.VM _vm;
+  late M.IsolateRef _isolate;
+  late M.EventRepository _events;
+  late M.NotificationRepository _notifications;
+  late M.Context _context;
+  late M.ContextRepository _contexts;
+  late M.RetainedSizeRepository _retainedSizes;
+  late M.ReachableSizeRepository _reachableSizes;
+  late M.InboundReferencesRepository _references;
+  late M.RetainingPathRepository _retainingPaths;
+  late M.ObjectRepository _objects;
 
   M.VMRef get vm => _vm;
   M.IsolateRef get isolate => _isolate;
@@ -55,7 +55,7 @@
       M.InboundReferencesRepository references,
       M.RetainingPathRepository retainingPaths,
       M.ObjectRepository objects,
-      {RenderingQueue queue}) {
+      {RenderingQueue? queue}) {
     assert(vm != null);
     assert(isolate != null);
     assert(events != null);
@@ -104,13 +104,13 @@
         new NavTopMenuElement(queue: _r.queue).element,
         new NavVMMenuElement(_vm, _events, queue: _r.queue).element,
         new NavIsolateMenuElement(_isolate, _events, queue: _r.queue).element,
-        new NavClassMenuElement(_isolate, _context.clazz, queue: _r.queue)
+        new NavClassMenuElement(_isolate, _context.clazz!, queue: _r.queue)
             .element,
         navMenu('instance'),
         (new NavRefreshElement(queue: _r.queue)
               ..onRefresh.listen((e) async {
                 e.element.disabled = true;
-                _context = await _contexts.get(_isolate, _context.id);
+                _context = await _contexts.get(_isolate, _context.id!);
                 _r.dirty();
               }))
             .element,
@@ -146,7 +146,7 @@
                       ..classes = ['memberName']
                       ..children = <Element>[
                         new ContextRefElement(
-                                _isolate, _context.parentContext, _objects,
+                                _isolate, _context.parentContext!, _objects,
                                 queue: _r.queue)
                             .element
                       ]
@@ -156,7 +156,7 @@
       ]);
     }
     content.add(new HRElement());
-    if (_context.variables.isNotEmpty) {
+    if (_context.variables!.isNotEmpty) {
       int index = 0;
       content.addAll([
         new DivElement()
@@ -167,7 +167,7 @@
                   ..content = <Element>[
                     new DivElement()
                       ..classes = ['memberList']
-                      ..children = _context.variables
+                      ..children = _context.variables!
                           .map<Element>((variable) => new DivElement()
                             ..classes = ['memberItem']
                             ..children = <Element>[
diff --git a/runtime/observatory/lib/src/elements/cpu_profile.dart b/runtime/observatory/lib/src/elements/cpu_profile.dart
index 41c3ffb..43ff7ee 100644
--- a/runtime/observatory/lib/src/elements/cpu_profile.dart
+++ b/runtime/observatory/lib/src/elements/cpu_profile.dart
@@ -22,21 +22,21 @@
 import 'package:observatory/src/elements/stack_trace_tree_config.dart';
 
 class CpuProfileElement extends CustomElement implements Renderable {
-  RenderingScheduler<CpuProfileElement> _r;
+  late RenderingScheduler<CpuProfileElement> _r;
 
   Stream<RenderedEvent<CpuProfileElement>> get onRendered => _r.onRendered;
 
-  M.VM _vm;
-  M.IsolateRef _isolate;
-  M.EventRepository _events;
-  M.NotificationRepository _notifications;
-  M.IsolateSampleProfileRepository _profiles;
-  Stream<M.SampleProfileLoadingProgressEvent> _progressStream;
-  M.SampleProfileLoadingProgress _progress;
-  M.SampleProfileTag _tag = M.SampleProfileTag.none;
-  ProfileTreeMode _mode = ProfileTreeMode.function;
-  M.ProfileTreeDirection _direction = M.ProfileTreeDirection.exclusive;
-  String _filter = '';
+  late M.VM _vm;
+  late M.IsolateRef _isolate;
+  late M.EventRepository _events;
+  late M.NotificationRepository _notifications;
+  late M.IsolateSampleProfileRepository _profiles;
+  late Stream<M.SampleProfileLoadingProgressEvent> _progressStream;
+  M.SampleProfileLoadingProgress? _progress;
+  late M.SampleProfileTag _tag = M.SampleProfileTag.none;
+  late ProfileTreeMode _mode = ProfileTreeMode.function;
+  late M.ProfileTreeDirection _direction = M.ProfileTreeDirection.exclusive;
+  late String _filter = '';
 
   M.IsolateRef get isolate => _isolate;
   M.NotificationRepository get notifications => _notifications;
@@ -49,7 +49,7 @@
       M.EventRepository events,
       M.NotificationRepository notifications,
       M.IsolateSampleProfileRepository profiles,
-      {RenderingQueue queue}) {
+      {RenderingQueue? queue}) {
     assert(vm != null);
     assert(isolate != null);
     assert(events != null);
@@ -100,15 +100,16 @@
       children = content;
       return;
     }
-    content.add((new SampleBufferControlElement(_vm, _progress, _progressStream,
+    content.add((new SampleBufferControlElement(
+            _vm, _progress!, _progressStream,
             selectedTag: _tag, queue: _r.queue)
           ..onTagChange.listen((e) {
             _tag = e.element.selectedTag;
             _request();
           }))
         .element);
-    if (_progress.status == M.SampleProfileLoadingStatus.loaded) {
-      CpuProfileVirtualTreeElement tree;
+    if (_progress!.status == M.SampleProfileLoadingStatus.loaded) {
+      late CpuProfileVirtualTreeElement tree;
       content.addAll([
         new BRElement(),
         (new StackTraceTreeConfigElement(
@@ -134,7 +135,7 @@
               }))
             .element,
         new BRElement(),
-        (tree = new CpuProfileVirtualTreeElement(_isolate, _progress.profile,
+        (tree = new CpuProfileVirtualTreeElement(_isolate, _progress!.profile,
                 queue: _r.queue))
             .element
       ]);
@@ -149,7 +150,7 @@
     _r.dirty();
     _progress = (await _progressStream.first).progress;
     _r.dirty();
-    if (M.isSampleProcessRunning(_progress.status)) {
+    if (M.isSampleProcessRunning(_progress!.status)) {
       _progress = (await _progressStream.last).progress;
       _r.dirty();
     }
diff --git a/runtime/observatory/lib/src/elements/cpu_profile/virtual_tree.dart b/runtime/observatory/lib/src/elements/cpu_profile/virtual_tree.dart
index 7044f5c..4d5de13 100644
--- a/runtime/observatory/lib/src/elements/cpu_profile/virtual_tree.dart
+++ b/runtime/observatory/lib/src/elements/cpu_profile/virtual_tree.dart
@@ -19,45 +19,45 @@
     show ProfileTreeMode;
 
 class CpuProfileVirtualTreeElement extends CustomElement implements Renderable {
-  RenderingScheduler<CpuProfileVirtualTreeElement> _r;
+  late RenderingScheduler<CpuProfileVirtualTreeElement> _r;
 
   Stream<RenderedEvent<CpuProfileVirtualTreeElement>> get onRendered =>
       _r.onRendered;
 
-  M.ProfileTreeDirection _direction;
-  ProfileTreeMode _mode;
-  M.SampleProfileType _type;
-  M.IsolateRef _isolate;
-  M.SampleProfile _profile;
-  Iterable<M.CallTreeNodeFilter> _filters;
+  late M.ProfileTreeDirection _direction;
+  late ProfileTreeMode _mode;
+  late M.SampleProfileType _type;
+  late M.IsolateRef _isolate;
+  late M.SampleProfile _profile;
+  Iterable<M.CallTreeNodeFilter>? _filters;
 
   M.ProfileTreeDirection get direction => _direction;
   ProfileTreeMode get mode => _mode;
   M.SampleProfileType get type => _type;
   M.IsolateRef get isolate => _isolate;
   M.SampleProfile get profile => _profile;
-  Iterable<M.CallTreeNodeFilter> get filters => _filters;
+  Iterable<M.CallTreeNodeFilter>? get filters => _filters;
 
   set direction(M.ProfileTreeDirection value) =>
       _direction = _r.checkAndReact(_direction, value);
   set mode(ProfileTreeMode value) => _mode = _r.checkAndReact(_mode, value);
-  set filters(Iterable<M.CallTreeNodeFilter> value) {
-    _filters = new List.unmodifiable(value);
+  set filters(Iterable<M.CallTreeNodeFilter>? value) {
+    _filters = new List.unmodifiable(value!);
     _r.dirty();
   }
 
-  factory CpuProfileVirtualTreeElement(Object owner, M.SampleProfile profile,
+  factory CpuProfileVirtualTreeElement(Object? owner, M.SampleProfile profile,
       {ProfileTreeMode mode: ProfileTreeMode.function,
       M.SampleProfileType type: M.SampleProfileType.cpu,
       M.ProfileTreeDirection direction: M.ProfileTreeDirection.exclusive,
-      RenderingQueue queue}) {
+      RenderingQueue? queue}) {
     assert(profile != null);
     assert(mode != null);
     assert(direction != null);
     CpuProfileVirtualTreeElement e = new CpuProfileVirtualTreeElement.created();
     e._r =
         new RenderingScheduler<CpuProfileVirtualTreeElement>(e, queue: queue);
-    e._isolate = owner;
+    e._isolate = owner as M.Isolate;
     e._profile = profile;
     e._mode = mode;
     e._type = type;
@@ -81,7 +81,7 @@
     children = <Element>[];
   }
 
-  VirtualTreeElement _tree;
+  VirtualTreeElement? _tree;
 
   void render() {
     var tree;
@@ -121,7 +121,7 @@
         throw new Exception('Unknown SampleProfileType: $type');
     }
     if (filters != null) {
-      tree = filters.fold(tree, (tree, filter) {
+      tree = filters!.fold(tree, (dynamic tree, filter) {
         return tree?.filtered(filter);
       });
     }
@@ -139,9 +139,9 @@
       ];
       return;
     } else if (tree.root.children.length == 1) {
-      _tree.expand(tree.root.children.first, autoExpandSingleChildNodes: true);
+      _tree!.expand(tree.root.children.first, autoExpandSingleChildNodes: true);
     }
-    children = <Element>[_tree.element];
+    children = <Element>[_tree!.element];
   }
 
   static HtmlElement _createCpuRow(toggle) {
@@ -203,13 +203,13 @@
     _updateLines(element.children[2].children, depth);
     if (item.children.isNotEmpty) {
       element.children[3].text =
-          _tree.isExpanded(item) ? _expandedIcon : _collapsedIcon;
+          _tree!.isExpanded(item) ? _expandedIcon : _collapsedIcon;
     } else {
       element.children[3].text = '';
     }
     element.children[4].text = Utils.formatPercentNormalized(item.percentage);
     element.children[5] = (new FunctionRefElement(
-            _isolate, item.profileFunction.function,
+            _isolate, item.profileFunction.function!,
             queue: _r.queue)
           ..classes = ['name'])
         .element;
@@ -228,13 +228,13 @@
     _updateLines(element.children[2].children, depth);
     if (item.children.isNotEmpty) {
       element.children[3].text =
-          _tree.isExpanded(item) ? _expandedIcon : _collapsedIcon;
+          _tree!.isExpanded(item) ? _expandedIcon : _collapsedIcon;
     } else {
       element.children[3].text = '';
     }
     element.children[4].text = Utils.formatPercentNormalized(item.percentage);
     element.children[5] = (new FunctionRefElement(
-            null, item.profileFunction.function,
+            null, item.profileFunction.function!,
             queue: _r.queue)
           ..classes = ['name'])
         .element;
@@ -243,7 +243,7 @@
   bool _searchFunction(Pattern pattern, itemDynamic) {
     M.FunctionCallTreeNode item = itemDynamic;
     return M
-        .getFunctionFullName(item.profileFunction.function)
+        .getFunctionFullName(item.profileFunction.function!)
         .contains(pattern);
   }
 
@@ -256,13 +256,13 @@
     _updateLines(element.children[2].children, depth);
     if (item.children.isNotEmpty) {
       element.children[3].text =
-          _tree.isExpanded(item) ? _expandedIcon : _collapsedIcon;
+          _tree!.isExpanded(item) ? _expandedIcon : _collapsedIcon;
     } else {
       element.children[3].text = '';
     }
     element.children[4].text = Utils.formatPercentNormalized(item.percentage);
     element.children[5] =
-        (new CodeRefElement(_isolate, item.profileCode.code, queue: _r.queue)
+        (new CodeRefElement(_isolate, item.profileCode.code!, queue: _r.queue)
               ..classes = ['name'])
             .element;
   }
@@ -280,20 +280,20 @@
     _updateLines(element.children[2].children, depth);
     if (item.children.isNotEmpty) {
       element.children[3].text =
-          _tree.isExpanded(item) ? _expandedIcon : _collapsedIcon;
+          _tree!.isExpanded(item) ? _expandedIcon : _collapsedIcon;
     } else {
       element.children[3].text = '';
     }
     element.children[4].text = Utils.formatPercentNormalized(item.percentage);
     element.children[5] =
-        (new CodeRefElement(null, item.profileCode.code, queue: _r.queue)
+        (new CodeRefElement(null, item.profileCode.code!, queue: _r.queue)
               ..classes = ['name'])
             .element;
   }
 
   bool _searchCode(Pattern pattern, itemDynamic) {
     M.CodeCallTreeNode item = itemDynamic;
-    return item.profileCode.code.name.contains(pattern);
+    return item.profileCode.code!.name!.contains(pattern);
   }
 
   static _updateLines(List<Element> lines, int n) {
diff --git a/runtime/observatory/lib/src/elements/cpu_profile_table.dart b/runtime/observatory/lib/src/elements/cpu_profile_table.dart
index 4cb0a9d..bfb95a1 100644
--- a/runtime/observatory/lib/src/elements/cpu_profile_table.dart
+++ b/runtime/observatory/lib/src/elements/cpu_profile_table.dart
@@ -30,17 +30,17 @@
 enum _SortingDirection { ascending, descending }
 
 class CpuProfileTableElement extends CustomElement implements Renderable {
-  RenderingScheduler<CpuProfileTableElement> _r;
+  late RenderingScheduler<CpuProfileTableElement> _r;
 
   Stream<RenderedEvent<CpuProfileTableElement>> get onRendered => _r.onRendered;
 
-  M.VM _vm;
-  M.IsolateRef _isolate;
-  M.EventRepository _events;
-  M.NotificationRepository _notifications;
-  M.IsolateSampleProfileRepository _profiles;
-  Stream<M.SampleProfileLoadingProgressEvent> _progressStream;
-  M.SampleProfileLoadingProgress _progress;
+  late M.VM _vm;
+  late M.IsolateRef _isolate;
+  late M.EventRepository _events;
+  late M.NotificationRepository _notifications;
+  late M.IsolateSampleProfileRepository _profiles;
+  late Stream<M.SampleProfileLoadingProgressEvent> _progressStream;
+  M.SampleProfileLoadingProgress? _progress;
   final _sortingField = <_Table, _SortingField>{
     _Table.functions: _SortingField.exclusive,
     _Table.caller: _SortingField.caller,
@@ -64,7 +64,7 @@
       M.EventRepository events,
       M.NotificationRepository notifications,
       M.IsolateSampleProfileRepository profiles,
-      {RenderingQueue queue}) {
+      {RenderingQueue? queue}) {
     assert(vm != null);
     assert(isolate != null);
     assert(events != null);
@@ -115,10 +115,10 @@
       children = content;
       return;
     }
-    content.add(new SampleBufferControlElement(_vm, _progress, _progressStream,
+    content.add(new SampleBufferControlElement(_vm, _progress!, _progressStream,
             showTag: false, queue: _r.queue)
         .element);
-    if (_progress.status == M.SampleProfileLoadingStatus.loaded) {
+    if (_progress!.status == M.SampleProfileLoadingStatus.loaded) {
       content.add(new BRElement());
       content.addAll(_createTables());
       content.add(new BRElement());
@@ -127,10 +127,10 @@
     children = content;
   }
 
-  M.ProfileFunction _selected;
-  VirtualCollectionElement _functions;
-  VirtualCollectionElement _callers;
-  VirtualCollectionElement _callees;
+  M.ProfileFunction? _selected;
+  VirtualCollectionElement? _functions;
+  VirtualCollectionElement? _callers;
+  VirtualCollectionElement? _callees;
 
   List<Element> _createTables() {
     _functions = _functions ??
@@ -139,11 +139,11 @@
             search: _searchFunction,
             queue: _r.queue);
     // If there's no samples, don't populate the function list.
-    _functions.items = (_progress.profile.sampleCount != 0)
-        ? _progress.profile.functions.toList()
+    _functions!.items = (_progress!.profile.sampleCount != 0)
+        ? _progress!.profile.functions.toList()
         : []
       ..sort(_createSorter(_Table.functions));
-    _functions.takeIntoView(_selected);
+    _functions!.takeIntoView(_selected);
     _callers = _callers ??
         new VirtualCollectionElement(_createCaller, _updateCaller,
             createHeader: _createCallerHeader,
@@ -155,13 +155,13 @@
             search: _searchFunction,
             queue: _r.queue);
     if (_selected != null) {
-      _callers.items = _selected.callers.keys.toList()
+      _callers!.items = _selected!.callers.keys.toList()
         ..sort(_createSorter(_Table.caller));
-      _callees.items = _selected.callees.keys.toList()
+      _callees!.items = _selected!.callees.keys.toList()
         ..sort(_createSorter(_Table.callee));
     } else {
-      _callers.items = const [];
-      _callees.items = const [];
+      _callers!.items = const [];
+      _callees!.items = const [];
     }
     return <Element>[
       new DivElement()
@@ -169,25 +169,25 @@
         ..children = <Element>[
           new DivElement()
             ..classes = ['profile-trees-all']
-            ..children = <Element>[_functions.element],
+            ..children = <Element>[_functions!.element],
           new DivElement()
             ..classes = ['profile-trees-current']
             ..children = <Element>[
               new DivElement()
                 ..classes = ['profile-trees-caller']
-                ..children = <Element>[_callers.element],
+                ..children = <Element>[_callers!.element],
               new DivElement()
                 ..classes = ['profile-trees-selected']
                 ..children = _selected == null
                     ? [new SpanElement()..text = 'No element selected']
                     : [
-                        new FunctionRefElement(_isolate, _selected.function,
+                        new FunctionRefElement(_isolate, _selected!.function!,
                                 queue: _r.queue)
                             .element
                       ],
               new DivElement()
                 ..classes = ['profile-trees-callee']
-                ..children = <Element>[_callees.element]
+                ..children = <Element>[_callees!.element]
             ]
         ]
     ];
@@ -209,7 +209,7 @@
       if (e.target is AnchorElement) {
         return;
       }
-      _selected = _functions.getItemFromElement(element);
+      _selected = _functions!.getItemFromElement(element);
       _r.dirty();
     });
     return element;
@@ -224,7 +224,7 @@
     }
     e.children[0].text = Utils.formatPercentNormalized(_getExclusiveT(item));
     e.children[1].text = Utils.formatPercentNormalized(_getInclusiveT(item));
-    e.children[2].text = M.getFunctionFullName(item.function);
+    e.children[2].text = M.getFunctionFullName(item.function!);
   }
 
   List<HtmlElement> _createFunctionHeader() => [
@@ -250,7 +250,7 @@
 
   bool _searchFunction(Pattern pattern, itemDynamic) {
     M.ProfileFunction item = itemDynamic;
-    return M.getFunctionFullName(item.function).contains(pattern);
+    return M.getFunctionFullName(item.function!).contains(pattern);
   }
 
   void _setSorting(
@@ -284,7 +284,7 @@
       if (e.target is AnchorElement) {
         return;
       }
-      _selected = _callees.getItemFromElement(element);
+      _selected = _callees!.getItemFromElement(element);
       _r.dirty();
     });
     return element;
@@ -323,7 +323,7 @@
       if (e.target is AnchorElement) {
         return;
       }
-      _selected = _callers.getItemFromElement(element);
+      _selected = _callers!.getItemFromElement(element);
       _r.dirty();
     });
     return element;
@@ -361,7 +361,7 @@
         ..onClick.listen((_) => _setSorting(table, field, direction));
 
   List<Element> _createTree() {
-    CpuProfileVirtualTreeElement tree;
+    late CpuProfileVirtualTreeElement tree;
     return [
       (new StackTraceTreeConfigElement(
               showMode: false,
@@ -383,7 +383,7 @@
             }))
           .element,
       new BRElement(),
-      (tree = new CpuProfileVirtualTreeElement(_isolate, _progress.profile,
+      (tree = new CpuProfileVirtualTreeElement(_isolate, _progress!.profile,
               mode: ProfileTreeMode.function,
               direction: M.ProfileTreeDirection.exclusive,
               queue: _r.queue)
@@ -411,7 +411,7 @@
     _r.dirty();
     _progress = (await _progressStream.first).progress;
     _r.dirty();
-    if (M.isSampleProcessRunning(_progress.status)) {
+    if (M.isSampleProcessRunning(_progress!.status)) {
       _progress = (await _progressStream.last).progress;
       _r.dirty();
     }
@@ -445,7 +445,7 @@
         getter = _getCallerT;
         break;
       case _SortingField.method:
-        getter = (M.ProfileFunction s) => M.getFunctionFullName(s.function);
+        getter = (M.ProfileFunction s) => M.getFunctionFullName(s.function!);
         break;
     }
     switch (_sortingDirection[table]) {
@@ -467,7 +467,9 @@
   static double _getInclusiveT(M.ProfileFunction f) =>
       f.normalizedInclusiveTicks;
   double _getCalleeT(M.ProfileFunction f) =>
-      _selected.callees[f] / _selected.callees.values.reduce((a, b) => a + b);
+      _selected!.callees[f]! /
+      _selected!.callees.values.reduce((a, b) => a + b);
   double _getCallerT(M.ProfileFunction f) =>
-      _selected.callers[f] / _selected.callers.values.reduce((a, b) => a + b);
+      _selected!.callers[f]! /
+      _selected!.callers.values.reduce((a, b) => a + b);
 }
diff --git a/runtime/observatory/lib/src/elements/curly_block.dart b/runtime/observatory/lib/src/elements/curly_block.dart
index 875d566..2bc6e2a 100644
--- a/runtime/observatory/lib/src/elements/curly_block.dart
+++ b/runtime/observatory/lib/src/elements/curly_block.dart
@@ -16,15 +16,15 @@
 }
 
 class CurlyBlockElement extends CustomElement implements Renderable {
-  RenderingScheduler<CurlyBlockElement> _r;
+  late RenderingScheduler<CurlyBlockElement> _r;
 
   final StreamController<CurlyBlockToggleEvent> _onToggle =
       new StreamController<CurlyBlockToggleEvent>.broadcast();
   Stream<CurlyBlockToggleEvent> get onToggle => _onToggle.stream;
   Stream<RenderedEvent<CurlyBlockElement>> get onRendered => _r.onRendered;
 
-  bool _expanded;
-  bool _disabled;
+  late bool _expanded;
+  late bool _disabled;
   Iterable<Element> _content = const [];
 
   bool get expanded => _expanded;
@@ -43,7 +43,7 @@
   }
 
   factory CurlyBlockElement(
-      {bool expanded: false, bool disabled: false, RenderingQueue queue}) {
+      {bool expanded: false, bool disabled: false, RenderingQueue? queue}) {
     assert(expanded != null);
     assert(disabled != null);
     CurlyBlockElement e = new CurlyBlockElement.created();
diff --git a/runtime/observatory/lib/src/elements/debugger.dart b/runtime/observatory/lib/src/elements/debugger.dart
index 568145c..c7c4dc5 100644
--- a/runtime/observatory/lib/src/elements/debugger.dart
+++ b/runtime/observatory/lib/src/elements/debugger.dart
@@ -36,8 +36,9 @@
 abstract class DebuggerCommand extends Command {
   ObservatoryDebugger debugger;
 
-  DebuggerCommand(this.debugger, name, List<Command> children)
-      : super(name, children);
+  DebuggerCommand(Debugger debugger, name, List<Command> children)
+      : debugger = debugger as ObservatoryDebugger,
+        super(name, children);
 
   String get helpShort;
   String get helpLong;
@@ -46,7 +47,7 @@
 // TODO(turnidge): Rewrite HelpCommand so that it is a general utility
 // provided by the cli library.
 class HelpCommand extends DebuggerCommand {
-  HelpCommand(Debugger debugger)
+  HelpCommand(ObservatoryDebugger debugger)
       : super(debugger, 'help', <Command>[
           new HelpHotkeysCommand(debugger),
         ]);
@@ -66,7 +67,8 @@
       var commands = debugger.cmd.matchCommand(<String>[], false);
       commands.sort((a, b) => a.name.compareTo(b.name));
       con.print('List of commands:\n');
-      for (DebuggerCommand command in commands) {
+      for (Command c in commands) {
+        DebuggerCommand command = c as DebuggerCommand;
         con.print('${_nameAndAlias(command).padRight(12)} '
             '- ${command.helpShort}');
       }
@@ -89,7 +91,8 @@
         return new Future.value(null);
       }
       con.print('');
-      for (DebuggerCommand command in commands) {
+      for (Command c in commands) {
+        DebuggerCommand command = c as DebuggerCommand;
         con.printBold(_nameAndAlias(command));
         con.print(command.helpLong);
 
@@ -102,7 +105,8 @@
         if (subCommands.isNotEmpty) {
           subCommands.sort((a, b) => a.name.compareTo(b.name));
           con.print('Subcommands:\n');
-          for (DebuggerCommand subCommand in subCommands) {
+          for (Command c in subCommands) {
+            DebuggerCommand subCommand = c as DebuggerCommand;
             con.print('    ${subCommand.fullName.padRight(16)} '
                 '- ${subCommand.helpShort}');
           }
@@ -177,14 +181,15 @@
     }
     var expression = args.join('');
     var response =
-        await debugger.isolate.evalFrame(debugger.currentFrame, expression);
+        await debugger.isolate.evalFrame(debugger.currentFrame!, expression);
     if (response is S.DartError) {
-      debugger.console.print(response.message);
+      debugger.console.print(response.message!);
     } else if (response is S.Sentinel) {
       debugger.console.print(response.valueAsString);
     } else {
       debugger.console.print('= ', newline: false);
-      debugger.console.printRef(debugger.isolate, response, debugger.objects);
+      debugger.console.printRef(
+          debugger.isolate, response as S.Instance, debugger.objects!);
     }
   }
 
@@ -214,7 +219,7 @@
     try {
       debugger.downFrame(count);
       debugger.console.print('frame = ${debugger.currentFrame}');
-    } catch (e) {
+    } on dynamic catch (e) {
       debugger.console
           .print('frame must be in range [${e.start}..${e.end - 1}]');
     }
@@ -251,7 +256,7 @@
       debugger.console.print('frame = ${debugger.currentFrame}');
     } on RangeError catch (e) {
       debugger.console
-          .print('frame must be in range [${e.start}..${e.end - 1}]');
+          .print('frame must be in range [${e.start}..${e.end! - 1}]');
     }
     return new Future.value(null);
   }
@@ -288,7 +293,7 @@
       debugger.console.print('frame = ${debugger.currentFrame}');
     } on RangeError catch (e) {
       debugger.console
-          .print('frame must be in range [${e.start}..${e.end - 1}]');
+          .print('frame must be in range [${e.start}..${e.end! - 1}]');
     }
     return new Future.value(null);
   }
@@ -420,7 +425,7 @@
 
   Future run(List<String> args) async {
     try {
-      int count = 1;
+      int? count = 1;
       if (args.length == 1) {
         count = int.tryParse(args[0]);
         if (count == null || count < 1 || count >= debugger.stackDepth) {
@@ -433,10 +438,10 @@
         debugger.console.print('rewind expects 0 or 1 argument');
         return;
       }
-      await debugger.rewind(count);
+      await debugger.rewind(count as int);
     } on S.ServerRpcException catch (e) {
       if (e.code == S.ServerRpcException.kCannotResume) {
-        debugger.console.printRed(e.data['details']);
+        debugger.console.printRed(e.data!['details']);
       } else {
         rethrow;
       }
@@ -474,7 +479,7 @@
     } on S.ServerRpcException catch (e) {
       if (e.code == S.ServerRpcException.kIsolateReloadBarred ||
           e.code == S.ServerRpcException.kIsolateIsReloading) {
-        debugger.console.printRed(e.data['details']);
+        debugger.console.printRed(e.data!['details']);
       } else {
         rethrow;
       }
@@ -527,7 +532,7 @@
     return new Future.value(null);
   }
 
-  Level _findLevel(String levelName) {
+  Level? _findLevel(String levelName) {
     levelName = levelName.toUpperCase();
     for (var level in Level.LEVELS) {
       if (level.name == levelName) {
@@ -669,7 +674,7 @@
   Future run(List<String> args) async {
     if (args.length == 0) {
       for (var name in _options.keys) {
-        dynamic getHandler = _options[name][2];
+        dynamic getHandler = _options[name]![2];
         var value = await getHandler(debugger, name);
         debugger.console.print("${name} = ${value}");
       }
@@ -722,7 +727,7 @@
       var prefix = args[1];
       var optionInfo = _options[name];
       if (optionInfo != null) {
-        var validValues = optionInfo[0];
+        dynamic validValues = optionInfo[0];
         for (var value in validValues) {
           if (value.startsWith(prefix)) {
             result.add('${args[0]}${value} ');
@@ -761,7 +766,7 @@
     if (loc.valid) {
       if (loc.function != null) {
         try {
-          await debugger.isolate.addBreakpointAtEntry(loc.function);
+          await debugger.isolate.addBreakpointAtEntry(loc.function!);
         } on S.ServerRpcException catch (e) {
           if (e.code == S.ServerRpcException.kCannotAddBreakpoint) {
             debugger.console.print('Unable to set breakpoint at ${loc}');
@@ -771,15 +776,15 @@
         }
       } else {
         assert(loc.script != null);
-        var script = loc.script;
+        var script = loc.script!;
         await script.load();
-        if (loc.line < 1 || loc.line > script.lines.length) {
+        if (loc.line! < 1 || loc.line! > script.lines.length) {
           debugger.console.print(
               'line number must be in range [1..${script.lines.length}]');
           return;
         }
         try {
-          await debugger.isolate.addBreakpoint(script, loc.line, loc.col);
+          await debugger.isolate.addBreakpoint(script, loc.line!, loc.col);
         } on S.ServerRpcException catch (e) {
           if (e.code == S.ServerRpcException.kCannotAddBreakpoint) {
             debugger.console.print('Unable to set breakpoint at ${loc}');
@@ -789,7 +794,7 @@
         }
       }
     } else {
-      debugger.console.print(loc.errorMessage);
+      debugger.console.print(loc.errorMessage!);
     }
   }
 
@@ -843,7 +848,7 @@
     var arg = (args.length == 0 ? '' : args[0]);
     var loc = await DebuggerLocation.parse(debugger, arg);
     if (!loc.valid) {
-      debugger.console.print(loc.errorMessage);
+      debugger.console.print(loc.errorMessage!);
       return;
     }
     if (loc.function != null) {
@@ -852,20 +857,20 @@
       return;
     }
 
-    var script = loc.script;
-    if (loc.line < 1 || loc.line > script.lines.length) {
+    var script = loc.script!;
+    if (loc.line! < 1 || loc.line! > script.lines.length) {
       debugger.console
           .print('line number must be in range [1..${script.lines.length}]');
       return;
     }
-    var lineInfo = script.getLine(loc.line);
+    var lineInfo = script.getLine(loc.line!)!;
     var bpts = lineInfo.breakpoints;
     var foundBreakpoint = false;
     if (bpts != null) {
       var bptList = bpts.toList();
       for (var bpt in bptList) {
         if (loc.col == null ||
-            loc.col == script.tokenToCol(bpt.location.tokenPos)) {
+            loc.col == script.tokenToCol(bpt.location!.tokenPos)) {
           foundBreakpoint = true;
           var result = await debugger.isolate.removeBreakpoint(bpt);
           if (result is S.DartError) {
@@ -1061,7 +1066,7 @@
       }
     }
     for (var isolate in debugger.vm.isolates) {
-      if (isolate.name.startsWith(args[0])) {
+      if (isolate.name!.startsWith(args[0])) {
         result.add('${isolate.name} ');
       }
     }
@@ -1108,7 +1113,7 @@
     const maxRunStateLen = 7;
     var maxNameLen = 'NAME'.length;
     for (var isolate in debugger.vm.isolates) {
-      maxNameLen = max(maxNameLen, isolate.name.length);
+      maxNameLen = max(maxNameLen, isolate.name!.length);
     }
     debugger.console.print("${'ID'.padLeft(maxIdLen, ' ')} "
         "${'ORIGIN'.padLeft(maxIdLen, ' ')} "
@@ -1120,7 +1125,7 @@
       debugger.console
           .print("${isolate.number.toString().padLeft(maxIdLen, ' ')} "
               "${isolate.originNumber.toString().padLeft(maxIdLen, ' ')} "
-              "${isolate.name.padRight(maxNameLen, ' ')} "
+              "${isolate.name!.padRight(maxNameLen, ' ')} "
               "${_isolateRunState(isolate).padRight(maxRunStateLen, ' ')} "
               "${current}");
     }
@@ -1225,7 +1230,7 @@
 
     for (var vm in vmList) {
       maxAddrLen = max(maxAddrLen, vm.target.networkAddress.length);
-      maxNameLen = max(maxNameLen, vm.name.length);
+      maxNameLen = max(maxNameLen, vm.name!.length);
     }
 
     debugger.console.print("${'ADDRESS'.padRight(maxAddrLen, ' ')} "
@@ -1235,7 +1240,7 @@
       String current = (vm == debugger.vm ? '*' : '');
       debugger.console
           .print("${vm.target.networkAddress.padRight(maxAddrLen, ' ')} "
-              "${vm.name.padRight(maxNameLen, ' ')} "
+              "${vm.name!.padRight(maxNameLen, ' ')} "
               "${current}");
     }
   }
@@ -1292,19 +1297,19 @@
 
   _ConsoleStreamPrinter(this._debugger);
   Level _minimumLogLevel = Level.OFF;
-  String _savedStream;
-  String _savedIsolate;
-  String _savedLine;
+  String? _savedStream;
+  String? _savedIsolate;
+  String? _savedLine;
   List<String> _buffer = [];
 
   void onEvent(String streamName, S.ServiceEvent event) {
     if (event.kind == S.ServiceEvent.kLogging) {
       // Check if we should print this log message.
-      if (event.logRecord['level'].value < _minimumLogLevel.value) {
+      if (event.logRecord!['level'].value < _minimumLogLevel.value) {
         return;
       }
     }
-    String isolateName = event.isolate.name;
+    String isolateName = event.isolate!.name!;
     // If we get a line from a different isolate/stream, flush
     // any pending output, even if it is not newline-terminated.
     if ((_savedIsolate != null && isolateName != _savedIsolate) ||
@@ -1314,14 +1319,14 @@
     String data;
     bool hasNewline;
     if (event.kind == S.ServiceEvent.kLogging) {
-      data = event.logRecord["message"].valueAsString;
+      data = event.logRecord!["message"].valueAsString;
       hasNewline = true;
     } else {
-      data = event.bytesAsString;
+      data = event.bytesAsString!;
       hasNewline = data.endsWith('\n');
     }
     if (_savedLine != null) {
-      data = _savedLine + data;
+      data = _savedLine! + data;
       _savedIsolate = null;
       _savedStream = null;
       _savedLine = null;
@@ -1345,7 +1350,7 @@
   void flush() {
     // If there is any saved output, flush it now.
     if (_savedLine != null) {
-      _buffer.add(_format(_savedIsolate, _savedStream, _savedLine));
+      _buffer.add(_format(_savedIsolate!, _savedStream!, _savedLine!));
       _savedIsolate = null;
       _savedStream = null;
       _savedLine = null;
@@ -1364,18 +1369,18 @@
 // Tracks the state for an isolate debugging session.
 class ObservatoryDebugger extends Debugger {
   final SettingsGroup settings = new SettingsGroup('debugger');
-  RootCommand cmd;
-  DebuggerPageElement page;
-  DebuggerConsoleElement console;
-  DebuggerInputElement input;
-  DebuggerStackElement stackElement;
-  S.ServiceMap stack;
+  late RootCommand cmd;
+  late DebuggerPageElement page;
+  late DebuggerConsoleElement console;
+  late DebuggerInputElement input;
+  late DebuggerStackElement stackElement;
+  S.ServiceMap? stack;
   final S.Isolate isolate;
   String breakOnException = "none"; // Last known setting.
 
-  int get currentFrame => _currentFrame;
+  int? get currentFrame => _currentFrame;
 
-  void set currentFrame(int value) {
+  void set currentFrame(int? value) {
     if (value != null && (value < 0 || value >= stackDepth)) {
       throw new RangeError.range(value, 0, stackDepth);
     }
@@ -1385,7 +1390,7 @@
     }
   }
 
-  int _currentFrame = null;
+  int? _currentFrame = null;
 
   bool get upIsDown => _upIsDown;
   void set upIsDown(bool value) {
@@ -1393,7 +1398,7 @@
     _upIsDown = value;
   }
 
-  bool _upIsDown;
+  bool _upIsDown = false;
 
   bool get causalAsyncStacks => _causalAsyncStacks;
   void set causalAsyncStacks(bool value) {
@@ -1401,7 +1406,7 @@
     _causalAsyncStacks = value;
   }
 
-  bool _causalAsyncStacks;
+  bool _causalAsyncStacks = true;
 
   bool get awaiterStacks => _awaiterStacks;
   void set awaiterStacks(bool value) {
@@ -1409,7 +1414,7 @@
     _causalAsyncStacks = value;
   }
 
-  bool _awaiterStacks;
+  bool _awaiterStacks = true;
 
   static const String kAwaiterStackFrames = 'awaiterFrames';
   static const String kAsyncCausalStackFrames = 'asyncCausalFrames';
@@ -1417,50 +1422,50 @@
 
   void upFrame(int count) {
     if (_upIsDown) {
-      currentFrame += count;
+      currentFrame = currentFrame! + count;
     } else {
-      currentFrame -= count;
+      currentFrame = currentFrame! - count;
     }
   }
 
   void downFrame(int count) {
     if (_upIsDown) {
-      currentFrame -= count;
+      currentFrame = currentFrame! - count;
     } else {
-      currentFrame += count;
+      currentFrame = currentFrame! + count;
     }
   }
 
   int get stackDepth {
     if (awaiterStacks) {
-      var awaiterStackFrames = stack[kAwaiterStackFrames];
+      var awaiterStackFrames = stack![kAwaiterStackFrames];
       if (awaiterStackFrames != null) {
         return awaiterStackFrames.length;
       }
     }
     if (causalAsyncStacks) {
-      var asyncCausalStackFrames = stack[kAsyncCausalStackFrames];
+      var asyncCausalStackFrames = stack![kAsyncCausalStackFrames];
       if (asyncCausalStackFrames != null) {
         return asyncCausalStackFrames.length;
       }
     }
-    return stack[kStackFrames].length;
+    return stack![kStackFrames].length;
   }
 
   List get stackFrames {
     if (awaiterStacks) {
-      var awaiterStackFrames = stack[kAwaiterStackFrames];
+      var awaiterStackFrames = stack![kAwaiterStackFrames];
       if (awaiterStackFrames != null) {
         return awaiterStackFrames;
       }
     }
     if (causalAsyncStacks) {
-      var asyncCausalStackFrames = stack[kAsyncCausalStackFrames];
+      var asyncCausalStackFrames = stack![kAsyncCausalStackFrames];
       if (asyncCausalStackFrames != null) {
         return asyncCausalStackFrames;
       }
     }
-    return stack[kStackFrames] ?? [];
+    return stack![kStackFrames] ?? [];
   }
 
   static final _history = [''];
@@ -1497,7 +1502,7 @@
   }
 
   void _loadSettings() {
-    _upIsDown = settings.get('up-is-down');
+    _upIsDown = settings.get('up-is-down') ?? false;
     _causalAsyncStacks = settings.get('causal-async-stacks') ?? true;
     _awaiterStacks = settings.get('awaiter-stacks') ?? true;
   }
@@ -1518,11 +1523,11 @@
 
     if ((breakOnException != isolate.exceptionsPauseInfo) &&
         (isolate.exceptionsPauseInfo != null)) {
-      breakOnException = isolate.exceptionsPauseInfo;
+      breakOnException = isolate.exceptionsPauseInfo!;
     }
 
     isolate.reload().then((serviceObject) {
-      S.Isolate response = serviceObject;
+      S.Isolate response = serviceObject as S.Isolate;
       if (response.isSentinel) {
         // The isolate has gone away.  The IsolateExit event will
         // clear the isolate for the debugger page.
@@ -1573,7 +1578,7 @@
     });
   }
 
-  Future<S.ServiceMap> _refreshStack(M.DebugEvent pauseEvent) {
+  Future<S.ServiceMap?> _refreshStack(M.DebugEvent? pauseEvent) {
     return isolate.getStack().then((result) {
       if (result.isSentinel) {
         // The isolate has gone away.  The IsolateExit event will
@@ -1581,8 +1586,8 @@
         return;
       }
       stack = result;
-      stackElement.updateStack(stack, pauseEvent);
-      if (stack['frames'].length > 0) {
+      stackElement.updateStack(stack!, pauseEvent);
+      if (stack!['frames'].length > 0) {
         currentFrame = 0;
       } else {
         currentFrame = null;
@@ -1600,18 +1605,18 @@
     } else if (isolate.running) {
       console.print("Isolate is running (type 'pause' to interrupt)");
     } else if (isolate.pauseEvent != null) {
-      _reportPause(isolate.pauseEvent);
+      _reportPause(isolate.pauseEvent!);
     } else {
       console.print('Isolate is in unknown state');
     }
     warnOutOfDate();
   }
 
-  void _reportIsolateError(S.Isolate isolate, M.DebugEvent event) {
+  void _reportIsolateError(S.Isolate? isolate, M.DebugEvent event) {
     if (isolate == null) {
       return;
     }
-    S.DartError error = isolate.error;
+    S.DartError? error = isolate.error;
     if (error == null) {
       return;
     }
@@ -1621,11 +1626,11 @@
     } else {
       console.printBold('Isolate has exited due to an unhandled exception:');
     }
-    console.print(error.message);
+    console.print(error.message!);
     console.newline();
     if (event is M.PauseExceptionEvent &&
-        (error.exception.isStackOverflowError ||
-            error.exception.isOutOfMemoryError)) {
+        (error.exception!.isStackOverflowError ||
+            error.exception!.isOutOfMemoryError)) {
       console.printBold(
           'When an unhandled stack overflow or OOM exception occurs, the VM '
           'has run out of memory and cannot keep the stack alive while '
@@ -1652,14 +1657,14 @@
       console.print("Paused at an unhandled exception "
           "(type 'continue' or [F7] to exit the isolate')");
       _reportIsolateError(isolate, event);
-    } else if (stack['frames'].length > 0) {
-      S.Frame frame = stack['frames'][0];
-      var script = frame.location.script;
+    } else if (stack!['frames'].length > 0) {
+      S.Frame frame = stack!['frames'][0];
+      var script = frame.location!.script;
       script.load().then((_) {
-        var line = script.tokenToLine(frame.location.tokenPos);
-        var col = script.tokenToCol(frame.location.tokenPos);
+        var line = script.tokenToLine(frame.location!.tokenPos);
+        var col = script.tokenToCol(frame.location!.tokenPos);
         if ((event is M.PauseBreakpointEvent) && (event.breakpoint != null)) {
-          var bpId = event.breakpoint.number;
+          var bpId = event.breakpoint!.number;
           console.print('Paused at breakpoint ${bpId} at '
               '${script.name}:${line}:${col}');
         } else if ((event is M.PauseExceptionEvent) &&
@@ -1669,7 +1674,7 @@
           // This seems to be missing if we are paused-at-exception after
           // paused-at-isolate-exit. Maybe we shutdown part of the debugger too
           // soon?
-          console.printRef(isolate, event.exception, objects);
+          console.printRef(isolate, event.exception as S.Instance, objects!);
         } else {
           console.print('Paused at ${script.name}:${line}:${col}');
         }
@@ -1696,12 +1701,12 @@
       default:
         break;
     }
-    var script = bpt.location.script;
+    var script = bpt!.location!.script;
     await script.load();
 
     var bpId = bpt.number;
-    var locString = await bpt.location.toUserString();
-    if (bpt.resolved) {
+    var locString = await bpt.location!.toUserString();
+    if (bpt.resolved!) {
       console.print('Breakpoint ${bpId} ${verb} at ${locString}');
     } else {
       console.print('Future breakpoint ${bpId} ${verb} at ${locString}');
@@ -1711,20 +1716,20 @@
   void onEvent(S.ServiceEvent event) {
     switch (event.kind) {
       case S.ServiceEvent.kVMUpdate:
-        S.VM vm = event.owner;
+        S.VM vm = event.owner as S.VM;
         console.print("VM ${vm.displayName} renamed to '${vm.name}'");
         break;
 
       case S.ServiceEvent.kIsolateStart:
         {
-          S.Isolate iso = event.owner;
+          S.Isolate iso = event.owner as S.Isolate;
           console.print("Isolate ${iso.number} '${iso.name}' has been created");
         }
         break;
 
       case S.ServiceEvent.kIsolateExit:
         {
-          S.Isolate iso = event.owner;
+          S.Isolate iso = event.owner as S.Isolate;
           if (iso == isolate) {
             console.print("The current isolate ${iso.number} '${iso.name}' "
                 "has exited");
@@ -1743,13 +1748,13 @@
 
       case S.ServiceEvent.kDebuggerSettingsUpdate:
         if (breakOnException != event.exceptions) {
-          breakOnException = event.exceptions;
+          breakOnException = event.exceptions!;
           console.print("Now pausing for exceptions: $breakOnException");
         }
         break;
 
       case S.ServiceEvent.kIsolateUpdate:
-        S.Isolate iso = event.owner;
+        S.Isolate iso = event.owner as S.Isolate;
         console.print("Isolate ${iso.number} renamed to '${iso.name}'");
         break;
 
@@ -1768,7 +1773,7 @@
       case S.ServiceEvent.kPauseInterrupted:
       case S.ServiceEvent.kPauseException:
         if (event.owner == isolate) {
-          var e = createEventFromServiceEvent(event);
+          var e = createEventFromServiceEvent(event) as M.DebugEvent;
           _refreshStack(e).then((_) async {
             flushStdio();
             if (isolate != null) {
@@ -1802,7 +1807,7 @@
         break;
 
       case S.ServiceEvent.kLogging:
-        _consolePrinter.onEvent(event.logRecord['level'].name, event);
+        _consolePrinter.onEvent(event.logRecord!['level'].name, event);
         break;
 
       default:
@@ -1811,7 +1816,7 @@
     }
   }
 
-  _ConsoleStreamPrinter _consolePrinter;
+  late _ConsoleStreamPrinter _consolePrinter;
 
   void flushStdio() {
     _consolePrinter.flush();
@@ -1865,11 +1870,11 @@
   }
 
   // TODO(turnidge): Implement real command line history.
-  String lastCommand;
+  String? lastCommand;
 
   Future run(String command) {
     if (command == '' && lastCommand != null) {
-      command = lastCommand;
+      command = lastCommand!;
     }
     console.printBold('\$ $command');
     return cmd.runCommand(command).then((_) {
@@ -1921,7 +1926,7 @@
     var script = loc.script;
     var line = loc.line;
     if (script != null && line != null) {
-      var bpts = script.getLine(line).breakpoints;
+      var bpts = script.getLine(line)!.breakpoints;
       if (bpts == null || bpts.isEmpty) {
         // Set a new breakpoint.
         // TODO(turnidge): Set this breakpoint at current column.
@@ -1940,7 +1945,8 @@
 
   Future smartNext() async {
     if (isolatePaused()) {
-      M.AsyncSuspensionEvent event = isolate.pauseEvent;
+      M.AsyncSuspensionEvent event =
+          isolate.pauseEvent as M.AsyncSuspensionEvent;
       if (event.atAsyncSuspension) {
         return asyncNext();
       } else {
@@ -1953,7 +1959,8 @@
 
   Future asyncNext() async {
     if (isolatePaused()) {
-      M.AsyncSuspensionEvent event = isolate.pauseEvent;
+      M.AsyncSuspensionEvent event =
+          isolate.pauseEvent as M.AsyncSuspensionEvent;
       if (!event.atAsyncSuspension) {
         console.print("No async continuation at this location");
       } else {
@@ -2013,11 +2020,11 @@
 }
 
 class DebuggerPageElement extends CustomElement implements Renderable {
-  S.Isolate _isolate;
-  ObservatoryDebugger _debugger;
-  M.ObjectRepository _objects;
-  M.ScriptRepository _scripts;
-  M.EventRepository _events;
+  late S.Isolate _isolate;
+  late ObservatoryDebugger _debugger;
+  late M.ObjectRepository _objects;
+  late M.ScriptRepository _scripts;
+  late M.EventRepository _events;
 
   factory DebuggerPageElement(S.Isolate isolate, M.ObjectRepository objects,
       M.ScriptRepository scripts, M.EventRepository events) {
@@ -2039,16 +2046,16 @@
 
   DebuggerPageElement.created() : super.created('debugger-page');
 
-  Future<StreamSubscription> _vmSubscriptionFuture;
-  Future<StreamSubscription> _isolateSubscriptionFuture;
-  Future<StreamSubscription> _debugSubscriptionFuture;
-  Future<StreamSubscription> _stdoutSubscriptionFuture;
-  Future<StreamSubscription> _stderrSubscriptionFuture;
-  Future<StreamSubscription> _logSubscriptionFuture;
+  Future<StreamSubscription>? _vmSubscriptionFuture;
+  Future<StreamSubscription>? _isolateSubscriptionFuture;
+  Future<StreamSubscription>? _debugSubscriptionFuture;
+  Future<StreamSubscription>? _stdoutSubscriptionFuture;
+  Future<StreamSubscription>? _stderrSubscriptionFuture;
+  Future<StreamSubscription>? _logSubscriptionFuture;
 
   ObservatoryApplication get app => ObservatoryApplication.app;
 
-  Timer _timer;
+  Timer? _timer;
 
   static final consoleElement = new DebuggerConsoleElement();
 
@@ -2111,7 +2118,7 @@
         app.vm.listenEventStream(S.VM.kStdoutStream, _debugger.onStdout);
     if (_stdoutSubscriptionFuture != null) {
       // TODO(turnidge): How do we want to handle this in general?
-      _stdoutSubscriptionFuture.catchError((e, st) {
+      _stdoutSubscriptionFuture!.catchError((e, st) {
         Logger.root.info('Failed to subscribe to stdout: $e\n$st\n');
         _stdoutSubscriptionFuture = null;
       });
@@ -2120,7 +2127,7 @@
         app.vm.listenEventStream(S.VM.kStderrStream, _debugger.onStderr);
     if (_stderrSubscriptionFuture != null) {
       // TODO(turnidge): How do we want to handle this in general?
-      _stderrSubscriptionFuture.catchError((e, st) {
+      _stderrSubscriptionFuture!.catchError((e, st) {
         Logger.root.info('Failed to subscribe to stderr: $e\n$st\n');
         _stderrSubscriptionFuture = null;
       });
@@ -2150,31 +2157,31 @@
 
   @override
   void detached() {
-    _timer.cancel();
+    _timer!.cancel();
     children = const [];
-    S.cancelFutureSubscription(_vmSubscriptionFuture);
+    S.cancelFutureSubscription(_vmSubscriptionFuture!);
     _vmSubscriptionFuture = null;
-    S.cancelFutureSubscription(_isolateSubscriptionFuture);
+    S.cancelFutureSubscription(_isolateSubscriptionFuture!);
     _isolateSubscriptionFuture = null;
-    S.cancelFutureSubscription(_debugSubscriptionFuture);
+    S.cancelFutureSubscription(_debugSubscriptionFuture!);
     _debugSubscriptionFuture = null;
-    S.cancelFutureSubscription(_stdoutSubscriptionFuture);
+    S.cancelFutureSubscription(_stdoutSubscriptionFuture!);
     _stdoutSubscriptionFuture = null;
-    S.cancelFutureSubscription(_stderrSubscriptionFuture);
+    S.cancelFutureSubscription(_stderrSubscriptionFuture!);
     _stderrSubscriptionFuture = null;
-    S.cancelFutureSubscription(_logSubscriptionFuture);
+    S.cancelFutureSubscription(_logSubscriptionFuture!);
     _logSubscriptionFuture = null;
     super.detached();
   }
 }
 
 class DebuggerStackElement extends CustomElement implements Renderable {
-  S.Isolate _isolate;
-  M.ObjectRepository _objects;
-  M.ScriptRepository _scripts;
-  M.EventRepository _events;
-  Element _scroller;
-  DivElement _isSampled;
+  late S.Isolate _isolate;
+  late M.ObjectRepository _objects;
+  late M.ScriptRepository _scripts;
+  late M.EventRepository _events;
+  late Element _scroller;
+  late DivElement _isSampled;
   bool get isSampled => !_isSampled.classes.contains('hidden');
   set isSampled(bool value) {
     if (value != isSampled) {
@@ -2182,7 +2189,7 @@
     }
   }
 
-  DivElement _hasStack;
+  late DivElement _hasStack;
   bool get hasStack => _hasStack.classes.contains('hidden');
   set hasStack(bool value) {
     if (value != hasStack) {
@@ -2190,7 +2197,7 @@
     }
   }
 
-  DivElement _hasMessages;
+  late DivElement _hasMessages;
   bool get hasMessages => _hasMessages.classes.contains('hidden');
   set hasMessages(bool value) {
     if (value != hasMessages) {
@@ -2198,10 +2205,10 @@
     }
   }
 
-  UListElement _frameList;
-  UListElement _messageList;
-  int currentFrame;
-  ObservatoryDebugger _debugger;
+  UListElement? _frameList;
+  UListElement? _messageList;
+  int? currentFrame;
+  late ObservatoryDebugger _debugger;
 
   factory DebuggerStackElement(
       S.Isolate isolate,
@@ -2309,7 +2316,7 @@
   ObservatoryApplication get app => ObservatoryApplication.app;
 
   void updateStackFrames(S.ServiceMap newStack) {
-    List frameElements = _frameList.children;
+    List frameElements = _frameList!.children;
     List newFrames;
     if (_debugger.awaiterStacks &&
         (newStack[ObservatoryDebugger.kAwaiterStackFrames] != null)) {
@@ -2327,7 +2334,8 @@
     int newPos = newFrames.length - 1;
     while (oldPos >= 0 && newPos >= 0) {
       DebuggerFrameElement dbgFrameElement =
-          CustomElement.reverse(frameElements[oldPos].children[0]);
+          CustomElement.reverse(frameElements[oldPos].children[0])
+              as DebuggerFrameElement;
       if (!dbgFrameElement.matchFrame(newFrames[newPos])) {
         // The rest of the frame elements no longer match.  Remove them.
         for (int i = 0; i <= oldPos; i++) {
@@ -2363,7 +2371,8 @@
     if (frameElements.isNotEmpty) {
       for (int i = newCount; i < frameElements.length; i++) {
         DebuggerFrameElement dbgFrameElement =
-            CustomElement.reverse(frameElements[i].children[0]);
+            CustomElement.reverse(frameElements[i].children[0])
+                as DebuggerFrameElement;
         dbgFrameElement.updateFrame(newFrames[i]);
       }
     }
@@ -2372,7 +2381,7 @@
   }
 
   void updateStackMessages(S.ServiceMap newStack) {
-    List messageElements = _messageList.children;
+    List messageElements = _messageList!.children;
     List newMessages = newStack['messages'];
 
     // Remove any extra message elements.
@@ -2397,7 +2406,8 @@
       // Update old messages.
       for (int i = 0; i < newStartingIndex; i++) {
         DebuggerMessageElement e =
-            CustomElement.reverse(messageElements[i].children[0]);
+            CustomElement.reverse(messageElements[i].children[0])
+                as DebuggerMessageElement;
         e.updateMessage(newMessages[i]);
       }
     }
@@ -2405,18 +2415,19 @@
     hasMessages = messageElements.isNotEmpty;
   }
 
-  void updateStack(S.ServiceMap newStack, M.DebugEvent pauseEvent) {
+  void updateStack(S.ServiceMap newStack, M.DebugEvent? pauseEvent) {
     updateStackFrames(newStack);
     updateStackMessages(newStack);
     isSampled = pauseEvent == null;
   }
 
-  void setCurrentFrame(int value) {
+  void setCurrentFrame(int? value) {
     currentFrame = value;
-    List frameElements = _frameList.children;
+    List frameElements = _frameList!.children;
     for (var frameElement in frameElements) {
       DebuggerFrameElement dbgFrameElement =
-          CustomElement.reverse(frameElement.children[0]);
+          CustomElement.reverse(frameElement.children[0])
+              as DebuggerFrameElement;
       if (dbgFrameElement.frame.index == currentFrame) {
         dbgFrameElement.setCurrent(true);
       } else {
@@ -2429,18 +2440,18 @@
 }
 
 class DebuggerFrameElement extends CustomElement implements Renderable {
-  RenderingScheduler<DebuggerFrameElement> _r;
+  late RenderingScheduler<DebuggerFrameElement> _r;
 
   Stream<RenderedEvent<DebuggerFrameElement>> get onRendered => _r.onRendered;
 
-  Element _scroller;
-  DivElement _varsDiv;
-  M.Isolate _isolate;
-  S.Frame _frame;
+  late Element _scroller;
+  late DivElement _varsDiv;
+  late M.Isolate _isolate;
+  late S.Frame _frame;
   S.Frame get frame => _frame;
-  M.ObjectRepository _objects;
-  M.ScriptRepository _scripts;
-  M.EventRepository _events;
+  late M.ObjectRepository _objects;
+  late M.ScriptRepository _scripts;
+  late M.EventRepository _events;
 
   // Is this the current frame?
   bool _current = false;
@@ -2452,7 +2463,7 @@
 
   void setCurrent(bool value) {
     Future load = (_frame.function != null)
-        ? _frame.function.load()
+        ? _frame.function!.load()
         : new Future.value(null);
     load.then((func) {
       _current = value;
@@ -2476,7 +2487,7 @@
       M.ObjectRepository objects,
       M.ScriptRepository scripts,
       M.EventRepository events,
-      {RenderingQueue queue}) {
+      {RenderingQueue? queue}) {
     assert(isolate != null);
     assert(frame != null);
     assert(scroller != null);
@@ -2513,12 +2524,12 @@
     }
     if (_frame.kind == M.FrameKind.asyncSuspensionMarker) {
       final content = <Element>[
-        new SpanElement()..children = _createMarkerHeader(_frame.marker)
+        new SpanElement()..children = _createMarkerHeader(_frame.marker!)
       ];
       children = content;
       return;
     }
-    ButtonElement expandButton;
+    late ButtonElement expandButton;
     final content = <Element>[
       expandButton = new ButtonElement()
         ..children = _createHeader()
@@ -2532,14 +2543,14 @@
         })
     ];
     if (_expanded) {
-      final homeMethod = _frame.function.homeMethod;
-      String homeMethodName;
-      if ((homeMethod.dartOwner is S.Class) && homeMethod.isStatic) {
+      final homeMethod = _frame.function!.homeMethod;
+      String? homeMethodName;
+      if ((homeMethod.dartOwner is S.Class) && homeMethod.isStatic!) {
         homeMethodName = '<class>';
       } else if (homeMethod.dartOwner is S.Library) {
         homeMethodName = '<library>';
       }
-      ButtonElement collapseButton;
+      late ButtonElement collapseButton;
       content.addAll([
         new DivElement()
           ..classes = ['frameDetails']
@@ -2554,11 +2565,11 @@
                       : [
                           (new SourceInsetElement(
                                   _isolate,
-                                  _frame.function.location,
+                                  _frame.function!.location!,
                                   _scripts,
                                   _objects,
                                   _events,
-                                  currentPos: _frame.location.tokenPos,
+                                  currentPos: _frame.location!.tokenPos,
                                   variables: _frame.variables,
                                   inDebuggerContext: true,
                                   queue: _r.queue))
@@ -2612,7 +2623,7 @@
                     await _toggleExpand();
                     collapseButton.disabled = false;
                   })
-                  ..children = <Element>[iconExpandLess.clone(true)]
+                  ..children = <Element>[iconExpandLess.clone(true) as Element]
               ]
           ]
       ]);
@@ -2650,7 +2661,7 @@
             ..children = _frame.function == null
                 ? const []
                 : [
-                    new FunctionRefElement(_isolate, _frame.function,
+                    new FunctionRefElement(_isolate, _frame.function!,
                             queue: _r.queue)
                         .element
                   ],
@@ -2660,7 +2671,7 @@
                 ? const []
                 : [
                     new SourceLinkElement(
-                            _isolate, _frame.function.location, _scripts,
+                            _isolate, _frame.function!.location!, _scripts,
                             queue: _r.queue)
                         .element
                   ],
@@ -2670,7 +2681,7 @@
     if (!_expanded) {
       content.add(new DivElement()
         ..classes = ['frameExpander']
-        ..children = <Element>[iconExpandMore.clone(true)]);
+        ..children = <Element>[iconExpandMore.clone(true) as Element]);
     }
     return [
       new DivElement()
@@ -2680,7 +2691,7 @@
   }
 
   String makeExpandKey(String key) {
-    return '${_frame.function.qualifiedName}/${key}';
+    return '${_frame.function!.qualifiedName}/${key}';
   }
 
   bool matchFrame(S.Frame newFrame) {
@@ -2690,8 +2701,8 @@
     if (newFrame.function == null) {
       return frame.function == null;
     }
-    return (newFrame.function.id == _frame.function.id &&
-        newFrame.location.script.id == frame.location.script.id);
+    return (newFrame.function!.id == _frame.function!.id &&
+        newFrame.location!.script.id == frame.location!.script.id);
   }
 
   void updateFrame(S.Frame newFrame) {
@@ -2699,15 +2710,15 @@
     _frame = newFrame;
   }
 
-  S.Script get script => _frame.location.script;
+  S.Script get script => _frame.location!.script;
 
   int _varsTop(DivElement varsDiv) {
     const minTop = 0;
     if (varsDiv == null) {
       return minTop;
     }
-    final num paddingTop = document.body.contentEdge.top;
-    final Rectangle parent = varsDiv.parent.getBoundingClientRect();
+    final num paddingTop = document.body!.contentEdge.top;
+    final Rectangle parent = varsDiv.parent!.getBoundingClientRect();
     final int varsHeight = varsDiv.clientHeight;
     final int maxTop = (parent.height - varsHeight).toInt();
     final int adjustedTop = (paddingTop - parent.top).toInt();
@@ -2737,8 +2748,8 @@
     _r.dirty();
   }
 
-  StreamSubscription _scrollSubscription;
-  StreamSubscription _resizeSubscription;
+  StreamSubscription? _scrollSubscription;
+  StreamSubscription? _resizeSubscription;
 
   void _subscribeToScroll() {
     if (_scroller != null) {
@@ -2753,11 +2764,11 @@
 
   void _unsubscribeToScroll() {
     if (_scrollSubscription != null) {
-      _scrollSubscription.cancel();
+      _scrollSubscription!.cancel();
       _scrollSubscription = null;
     }
     if (_resizeSubscription != null) {
-      _resizeSubscription.cancel();
+      _resizeSubscription!.cancel();
       _resizeSubscription = null;
     }
   }
@@ -2778,7 +2789,7 @@
   }
 
   Future _toggleExpand() async {
-    await _frame.function.load();
+    await _frame.function!.load();
     _pinned = !_pinned;
     if (_pinned) {
       _expand();
@@ -2789,16 +2800,16 @@
 }
 
 class DebuggerMessageElement extends CustomElement implements Renderable {
-  RenderingScheduler<DebuggerMessageElement> _r;
+  late RenderingScheduler<DebuggerMessageElement> _r;
 
   Stream<RenderedEvent<DebuggerMessageElement>> get onRendered => _r.onRendered;
 
-  S.Isolate _isolate;
-  S.ServiceMessage _message;
-  S.ServiceObject _preview;
-  M.ObjectRepository _objects;
-  M.ScriptRepository _scripts;
-  M.EventRepository _events;
+  late S.Isolate _isolate;
+  late S.ServiceMessage _message;
+  late S.ServiceObject _preview;
+  late M.ObjectRepository _objects;
+  late M.ScriptRepository _scripts;
+  late M.EventRepository _events;
 
   // Is this the current message?
   bool _current = false;
@@ -2814,7 +2825,7 @@
       M.ObjectRepository objects,
       M.ScriptRepository scripts,
       M.EventRepository events,
-      {RenderingQueue queue}) {
+      {RenderingQueue? queue}) {
     assert(isolate != null);
     assert(message != null);
     assert(objects != null);
@@ -2842,7 +2853,7 @@
     } else {
       classes.remove('current');
     }
-    ButtonElement expandButton;
+    late ButtonElement expandButton;
     final content = <Element>[
       expandButton = new ButtonElement()
         ..children = _createHeader()
@@ -2856,8 +2867,8 @@
         })
     ];
     if (_expanded) {
-      ButtonElement collapseButton;
-      ButtonElement previewButton;
+      late ButtonElement collapseButton;
+      late ButtonElement previewButton;
       content.addAll([
         new DivElement()
           ..classes = ['messageDetails']
@@ -2872,7 +2883,7 @@
                       : [
                           new SourceInsetElement(
                                   _isolate,
-                                  _message.handler.location,
+                                  _message.handler!.location!,
                                   _scripts,
                                   _objects,
                                   _events,
@@ -2913,7 +2924,7 @@
                     await _toggleExpand();
                     collapseButton.disabled = false;
                   })
-                  ..children = <Element>[iconExpandLess.clone(true)]
+                  ..children = <Element>[iconExpandLess.clone(true) as Element]
               ]
           ]
       ]);
@@ -2939,7 +2950,7 @@
             ..children = _message.handler == null
                 ? const []
                 : [
-                    new FunctionRefElement(_isolate, _message.handler,
+                    new FunctionRefElement(_isolate, _message.handler!,
                             queue: _r.queue)
                         .element
                   ],
@@ -2948,7 +2959,8 @@
             ..children = _message.location == null
                 ? const []
                 : [
-                    new SourceLinkElement(_isolate, _message.location, _scripts,
+                    new SourceLinkElement(
+                            _isolate, _message.location!, _scripts,
                             queue: _r.queue)
                         .element
                   ],
@@ -2958,7 +2970,7 @@
     if (!_expanded) {
       content.add(new DivElement()
         ..classes = ['messageExpander']
-        ..children = <Element>[iconExpandMore.clone(true)]);
+        ..children = <Element>[iconExpandMore.clone(true) as Element]);
     }
     return [
       new DivElement()
@@ -3002,7 +3014,9 @@
   }
 
   Future<S.ServiceObject> previewMessage(_) {
-    return _message.isolate.getObject(_message.messageObjectId).then((result) {
+    return _message.isolate!
+        .getObject(_message.messageObjectId!)
+        .then((result) {
       _preview = result;
       return result;
     });
@@ -3019,7 +3033,7 @@
   DebuggerConsoleElement.created() : super.created('debugger-console');
 
   /// Is [container] scrolled to the within [threshold] pixels of the bottom?
-  static bool _isScrolledToBottom(DivElement container, [int threshold = 2]) {
+  static bool _isScrolledToBottom(DivElement? container, [int threshold = 2]) {
     if (container == null) {
       return false;
     }
@@ -3033,7 +3047,7 @@
   }
 
   /// Scroll [container] so the bottom content is visible.
-  static _scrollToBottom(DivElement container) {
+  static _scrollToBottom(DivElement? container) {
     if (container == null) {
       return;
     }
@@ -3042,10 +3056,10 @@
   }
 
   void _append(HtmlElement span) {
-    bool autoScroll = _isScrolledToBottom(parent);
+    bool autoScroll = _isScrolledToBottom(parent as DivElement?);
     children.add(span);
     if (autoScroll) {
-      _scrollToBottom(parent);
+      _scrollToBottom(parent as DivElement?);
     }
   }
 
@@ -3080,7 +3094,7 @@
   }
 
   void printStdio(List<String> lines) {
-    bool autoScroll = _isScrolledToBottom(parent);
+    bool autoScroll = _isScrolledToBottom(parent as DivElement?);
     for (var line in lines) {
       var span = new SpanElement();
       span.classes.add('green');
@@ -3089,7 +3103,7 @@
       children.add(span);
     }
     if (autoScroll) {
-      _scrollToBottom(parent);
+      _scrollToBottom(parent as DivElement?);
     }
   }
 
@@ -3118,15 +3132,15 @@
 }
 
 class DebuggerInputElement extends CustomElement implements Renderable {
-  S.Isolate _isolate;
-  ObservatoryDebugger _debugger;
+  late S.Isolate _isolate;
+  late ObservatoryDebugger _debugger;
   bool _busy = false;
   final _modalPromptDiv = new DivElement()..classes = ['modalPrompt', 'hidden'];
   final _textBox = new TextInputElement()
     ..classes = ['textBox']
     ..autofocus = true;
-  String get modalPrompt => _modalPromptDiv.text;
-  set modalPrompt(String value) {
+  String? get modalPrompt => _modalPromptDiv.text;
+  set modalPrompt(String? value) {
     if (_modalPromptDiv.text == '') {
       _modalPromptDiv.classes.remove('hidden');
     }
@@ -3136,8 +3150,8 @@
     }
   }
 
-  String get text => _textBox.value;
-  set text(String value) => _textBox.value = value;
+  String? get text => _textBox.value;
+  set text(String? value) => _textBox.value = value;
   var modalCallback = null;
 
   factory DebuggerInputElement(
@@ -3172,9 +3186,9 @@
     switch (e.keyCode) {
       case KeyCode.TAB:
         e.preventDefault();
-        int cursorPos = _textBox.selectionStart;
-        _debugger.complete(text.substring(0, cursorPos)).then((completion) {
-          text = completion + text.substring(cursorPos);
+        int cursorPos = _textBox.selectionStart!;
+        _debugger.complete(text!.substring(0, cursorPos)).then((completion) {
+          text = completion + text!.substring(cursorPos);
           // TODO(turnidge): Move the cursor to the end of the
           // completion, rather than the end of the string.
         }).whenComplete(() {
@@ -3184,7 +3198,7 @@
 
       case KeyCode.ENTER:
         var command = text;
-        _debugger.run(command).whenComplete(() {
+        _debugger.run(command!).whenComplete(() {
           text = '';
           _busy = false;
         });
@@ -3192,13 +3206,13 @@
 
       case KeyCode.UP:
         e.preventDefault();
-        text = _debugger.historyPrev(text);
+        text = _debugger.historyPrev(text!);
         _busy = false;
         break;
 
       case KeyCode.DOWN:
         e.preventDefault();
-        text = _debugger.historyNext(text);
+        text = _debugger.historyNext(text!);
         _busy = false;
         break;
 
diff --git a/runtime/observatory/lib/src/elements/error_ref.dart b/runtime/observatory/lib/src/elements/error_ref.dart
index ffff85c..9d4c26a8 100644
--- a/runtime/observatory/lib/src/elements/error_ref.dart
+++ b/runtime/observatory/lib/src/elements/error_ref.dart
@@ -11,15 +11,15 @@
 import 'package:observatory/src/elements/helpers/rendering_scheduler.dart';
 
 class ErrorRefElement extends CustomElement implements Renderable {
-  RenderingScheduler<ErrorRefElement> _r;
+  late RenderingScheduler<ErrorRefElement> _r;
 
   Stream<RenderedEvent<ErrorRefElement>> get onRendered => _r.onRendered;
 
-  ErrorRef _error;
+  late ErrorRef _error;
 
   ErrorRef get error => _error;
 
-  factory ErrorRefElement(ErrorRef error, {RenderingQueue queue}) {
+  factory ErrorRefElement(ErrorRef error, {RenderingQueue? queue}) {
     assert(error != null);
     ErrorRefElement e = new ErrorRefElement.created();
     e._r = new RenderingScheduler<ErrorRefElement>(e, queue: queue);
diff --git a/runtime/observatory/lib/src/elements/error_view.dart b/runtime/observatory/lib/src/elements/error_view.dart
index c89eb5c..893e865 100644
--- a/runtime/observatory/lib/src/elements/error_view.dart
+++ b/runtime/observatory/lib/src/elements/error_view.dart
@@ -15,18 +15,18 @@
 import 'package:observatory/src/elements/view_footer.dart';
 
 class ErrorViewElement extends CustomElement implements Renderable {
-  RenderingScheduler<ErrorViewElement> _r;
+  late RenderingScheduler<ErrorViewElement> _r;
 
   Stream<RenderedEvent<ErrorViewElement>> get onRendered => _r.onRendered;
 
-  M.Error _error;
-  M.NotificationRepository _notifications;
+  late M.Error _error;
+  late M.NotificationRepository _notifications;
 
   M.Error get error => _error;
 
   factory ErrorViewElement(
       M.NotificationRepository notifications, M.Error error,
-      {RenderingQueue queue}) {
+      {RenderingQueue? queue}) {
     assert(error != null);
     assert(notifications != null);
     ErrorViewElement e = new ErrorViewElement.created();
@@ -71,7 +71,7 @@
     ];
   }
 
-  static String _kindToString(M.ErrorKind kind) {
+  static String _kindToString(M.ErrorKind? kind) {
     switch (kind) {
       case M.ErrorKind.unhandledException:
         return 'Unhandled Exception';
diff --git a/runtime/observatory/lib/src/elements/eval_box.dart b/runtime/observatory/lib/src/elements/eval_box.dart
index 7928031..1ad3a95 100644
--- a/runtime/observatory/lib/src/elements/eval_box.dart
+++ b/runtime/observatory/lib/src/elements/eval_box.dart
@@ -13,18 +13,18 @@
 import 'package:observatory/src/elements/instance_ref.dart';
 
 class EvalBoxElement extends CustomElement implements Renderable {
-  RenderingScheduler<EvalBoxElement> _r;
+  late RenderingScheduler<EvalBoxElement> _r;
 
   Stream<RenderedEvent<EvalBoxElement>> get onRendered => _r.onRendered;
 
-  M.IsolateRef _isolate;
-  M.ObjectRef _context;
-  M.ObjectRepository _objects;
-  M.EvalRepository _eval;
+  late M.IsolateRef _isolate;
+  late M.ObjectRef _context;
+  late M.ObjectRepository _objects;
+  late M.EvalRepository _eval;
   final _results = <_ExpressionDescription>[];
-  String _expression = '';
-  bool _multiline;
-  Iterable<String> _quickExpressions;
+  String? _expression = '';
+  late bool _multiline;
+  late Iterable<String> _quickExpressions;
 
   M.IsolateRef get isolate => _isolate;
   M.ObjectRef get context => _context;
@@ -33,7 +33,7 @@
       M.ObjectRepository objects, M.EvalRepository eval,
       {bool multiline: false,
       Iterable<String> quickExpressions: const [],
-      RenderingQueue queue}) {
+      RenderingQueue? queue}) {
     assert(isolate != null);
     assert(context != null);
     assert(objects != null);
@@ -136,7 +136,7 @@
     var area = new TextAreaElement()
       ..classes = ['textbox']
       ..placeholder = 'evaluate an expression'
-      ..value = _expression
+      ..value = _expression!
       ..onKeyUp.where((e) => e.key == '\n').listen((e) {
         e.preventDefault();
         _run();
@@ -152,7 +152,7 @@
     var textbox = new TextInputElement()
       ..classes = ['textbox']
       ..placeholder = 'evaluate an expression'
-      ..value = _expression
+      ..value = _expression!
       ..onKeyUp.where((e) => e.key == '\n').listen((e) {
         e.preventDefault();
         _run();
@@ -177,15 +177,15 @@
     final checkbox = new CheckboxInputElement()..checked = _multiline;
     checkbox.onClick.listen((e) {
       e.preventDefault();
-      _multiline = checkbox.checked;
+      _multiline = checkbox.checked!;
       _r.dirty();
     });
     return checkbox;
   }
 
   Future _run() async {
-    if (_expression == null || _expression.isEmpty) return;
     final expression = _expression;
+    if (expression == null || expression.isEmpty) return;
     _expression = null;
     final result = new _ExpressionDescription.pending(expression);
     _results.add(result);
@@ -199,7 +199,7 @@
 
 class _ExpressionDescription {
   final String expression;
-  final M.ObjectRef value;
+  final M.ObjectRef? value;
   bool get isPending => value == null;
 
   _ExpressionDescription(this.expression, this.value);
diff --git a/runtime/observatory/lib/src/elements/field_ref.dart b/runtime/observatory/lib/src/elements/field_ref.dart
index eeb8bb9..69975e2 100644
--- a/runtime/observatory/lib/src/elements/field_ref.dart
+++ b/runtime/observatory/lib/src/elements/field_ref.dart
@@ -11,21 +11,21 @@
 import 'package:observatory/src/elements/instance_ref.dart';
 
 class FieldRefElement extends CustomElement implements Renderable {
-  RenderingScheduler<FieldRefElement> _r;
+  late RenderingScheduler<FieldRefElement> _r;
 
   Stream<RenderedEvent<FieldRefElement>> get onRendered => _r.onRendered;
 
-  M.IsolateRef _isolate;
-  M.FieldRef _field;
-  M.ObjectRepository _objects;
-  bool _expandable;
+  late M.IsolateRef _isolate;
+  late M.FieldRef _field;
+  late M.ObjectRepository _objects;
+  late bool _expandable;
 
   M.IsolateRef get isolate => _isolate;
   M.FieldRef get field => _field;
 
   factory FieldRefElement(
       M.IsolateRef isolate, M.FieldRef field, M.ObjectRepository objects,
-      {RenderingQueue queue, bool expandable: true}) {
+      {RenderingQueue? queue, bool expandable: true}) {
     assert(isolate != null);
     assert(field != null);
     assert(objects != null);
@@ -55,21 +55,21 @@
 
   void render() {
     var header = '';
-    if (_field.isStatic) {
+    if (_field.isStatic!) {
       if (_field.dartOwner is M.ClassRef) {
         header += 'static ';
       } else {
         header += 'top-level ';
       }
     }
-    if (_field.isFinal) {
+    if (_field.isFinal!) {
       header += 'final ';
-    } else if (_field.isConst) {
+    } else if (_field.isConst!) {
       header += 'const ';
-    } else if (_field.declaredType.name == 'dynamic') {
+    } else if (_field.declaredType!.name == 'dynamic') {
       header += 'var ';
     }
-    if (_field.declaredType.name == 'dynamic') {
+    if (_field.declaredType!.name == 'dynamic') {
       children = <Element>[
         new SpanElement()..text = header,
         new AnchorElement(href: Uris.inspect(_isolate, object: _field))
@@ -78,7 +78,7 @@
     } else {
       children = <Element>[
         new SpanElement()..text = header,
-        new InstanceRefElement(_isolate, _field.declaredType, _objects,
+        new InstanceRefElement(_isolate, _field.declaredType!, _objects,
                 queue: _r.queue, expandable: _expandable)
             .element,
         new SpanElement()..text = ' ',
diff --git a/runtime/observatory/lib/src/elements/field_view.dart b/runtime/observatory/lib/src/elements/field_view.dart
index 81231e3..2844b8f 100644
--- a/runtime/observatory/lib/src/elements/field_view.dart
+++ b/runtime/observatory/lib/src/elements/field_view.dart
@@ -27,24 +27,24 @@
 import 'package:observatory/src/elements/view_footer.dart';
 
 class FieldViewElement extends CustomElement implements Renderable {
-  RenderingScheduler<FieldViewElement> _r;
+  late RenderingScheduler<FieldViewElement> _r;
 
   Stream<RenderedEvent<FieldViewElement>> get onRendered => _r.onRendered;
 
-  M.VM _vm;
-  M.IsolateRef _isolate;
-  M.EventRepository _events;
-  M.NotificationRepository _notifications;
-  M.Field _field;
-  M.LibraryRef _library;
-  M.FieldRepository _fields;
-  M.ClassRepository _classes;
-  M.RetainedSizeRepository _retainedSizes;
-  M.ReachableSizeRepository _reachableSizes;
-  M.InboundReferencesRepository _references;
-  M.RetainingPathRepository _retainingPaths;
-  M.ScriptRepository _scripts;
-  M.ObjectRepository _objects;
+  late M.VM _vm;
+  late M.IsolateRef _isolate;
+  late M.EventRepository _events;
+  late M.NotificationRepository _notifications;
+  late M.Field _field;
+  M.LibraryRef? _library;
+  late M.FieldRepository _fields;
+  late M.ClassRepository _classes;
+  late M.RetainedSizeRepository _retainedSizes;
+  late M.ReachableSizeRepository _reachableSizes;
+  late M.InboundReferencesRepository _references;
+  late M.RetainingPathRepository _retainingPaths;
+  late M.ScriptRepository _scripts;
+  late M.ObjectRepository _objects;
 
   M.VMRef get vm => _vm;
   M.IsolateRef get isolate => _isolate;
@@ -65,7 +65,7 @@
       M.RetainingPathRepository retainingPaths,
       M.ScriptRepository scripts,
       M.ObjectRepository objects,
-      {RenderingQueue queue}) {
+      {RenderingQueue? queue}) {
     assert(vm != null);
     assert(isolate != null);
     assert(events != null);
@@ -95,7 +95,7 @@
     e._scripts = scripts;
     e._objects = objects;
     if (field.dartOwner is M.LibraryRef) {
-      e._library = field.dartOwner;
+      e._library = field.dartOwner as M.LibraryRef;
     }
     return e;
   }
@@ -118,22 +118,22 @@
 
   void render() {
     var header = '';
-    if (_field.isStatic) {
+    if (_field.isStatic!) {
       if (_field.dartOwner is M.ClassRef) {
         header += 'static ';
       } else {
         header += 'top-level ';
       }
     }
-    if (_field.isFinal) {
+    if (_field.isFinal!) {
       header += 'final ';
-    } else if (_field.isConst) {
+    } else if (_field.isConst!) {
       header += 'const ';
     }
-    if (_field.declaredType.name == 'dynamic') {
+    if (_field.declaredType!.name == 'dynamic') {
       header += 'var';
     } else {
-      header += _field.declaredType.name;
+      header += _field.declaredType!.name!;
     }
     children = <Element>[
       navBar(_createMenu()),
@@ -155,10 +155,10 @@
             ..children = _field.location == null
                 ? const []
                 : [
-                    new ScriptInsetElement(_isolate, _field.location.script,
+                    new ScriptInsetElement(_isolate, _field.location!.script,
                             _scripts, _objects, _events,
-                            startPos: field.location.tokenPos,
-                            endPos: field.location.tokenPos,
+                            startPos: field.location!.tokenPos,
+                            endPos: field.location!.tokenPos,
                             queue: _r.queue)
                         .element
                   ],
@@ -174,15 +174,15 @@
       new NavIsolateMenuElement(_isolate, _events, queue: _r.queue).element
     ];
     if (_library != null) {
-      menu.add(new NavLibraryMenuElement(_isolate, _library, queue: _r.queue)
+      menu.add(new NavLibraryMenuElement(_isolate, _library!, queue: _r.queue)
           .element);
     } else if (_field.dartOwner is M.ClassRef) {
-      menu.add(
-          new NavClassMenuElement(_isolate, _field.dartOwner, queue: _r.queue)
-              .element);
+      menu.add(new NavClassMenuElement(_isolate, _field.dartOwner as M.ClassRef,
+              queue: _r.queue)
+          .element);
     }
     menu.addAll(<Element>[
-      navMenu(_field.name),
+      navMenu(_field.name!),
       (new NavRefreshElement(queue: _r.queue)
             ..onRefresh.listen((e) {
               e.element.disabled = true;
@@ -220,13 +220,13 @@
           new DivElement()
             ..classes = ['memberName']
             ..children = <Element>[
-              new SourceLinkElement(_isolate, field.location, _scripts,
+              new SourceLinkElement(_isolate, field.location!, _scripts,
                       queue: _r.queue)
                   .element
             ]
         ]
     ];
-    if (!_field.isStatic) {
+    if (!_field.isStatic!) {
       members.add(new DivElement()
         ..classes = ['memberItem']
         ..title = 'The types observed for this field at runtime. '
@@ -269,22 +269,23 @@
         break;
       case M.GuardClassKind.single:
         guard.add(
-            new ClassRefElement(_isolate, _field.guardClass, queue: _r.queue)
+            new ClassRefElement(_isolate, _field.guardClass!, queue: _r.queue)
                 .element);
         break;
     }
     guard.add(new SpanElement()
       ..text =
-          _field.guardNullable ? '— null observed' : '— null not observed');
+          _field.guardNullable! ? '— null observed' : '— null not observed');
     return guard;
   }
 
   Future _refresh() async {
-    _field = await _fields.get(_isolate, _field.id);
+    _field = await _fields.get(_isolate, _field.id!);
     if (_field.dartOwner is M.LibraryRef) {
-      _library = _field.dartOwner;
+      _library = _field.dartOwner as M.LibraryRef;
     } else if (_field.dartOwner is M.ClassRef) {
-      _library = (await _classes.get(_isolate, _field.dartOwner.id)).library;
+      var cls = _field.dartOwner as M.ClassRef;
+      _library = (await _classes.get(_isolate, cls.id!)).library!;
     }
     _r.dirty();
   }
diff --git a/runtime/observatory/lib/src/elements/flag_list.dart b/runtime/observatory/lib/src/elements/flag_list.dart
index d9b847c..d01b782 100644
--- a/runtime/observatory/lib/src/elements/flag_list.dart
+++ b/runtime/observatory/lib/src/elements/flag_list.dart
@@ -19,21 +19,21 @@
 import 'package:observatory/src/elements/view_footer.dart';
 
 class FlagListElement extends CustomElement implements Renderable {
-  RenderingScheduler<FlagListElement> _r;
+  late RenderingScheduler<FlagListElement> _r;
 
   Stream<RenderedEvent<FlagListElement>> get onRendered => _r.onRendered;
 
-  M.VMRef _vm;
-  M.EventRepository _events;
-  M.FlagsRepository _repository;
-  M.NotificationRepository _notifications;
-  Iterable<M.Flag> _flags;
+  late M.VMRef _vm;
+  late M.EventRepository _events;
+  late M.FlagsRepository _repository;
+  late M.NotificationRepository _notifications;
+  Iterable<M.Flag>? _flags;
 
   M.VMRef get vm => _vm;
 
   factory FlagListElement(M.VMRef vm, M.EventRepository events,
       M.FlagsRepository repository, M.NotificationRepository notifications,
-      {RenderingQueue queue}) {
+      {RenderingQueue? queue}) {
     assert(vm != null);
     assert(events != null);
     assert(repository != null);
@@ -68,8 +68,8 @@
     if (_flags == null) {
       content.add(new HeadingElement.h1()..text = 'Loading Flags...');
     } else {
-      final modified = _flags.where(_isModified);
-      final unmodified = _flags.where(_isUnmodified);
+      final modified = _flags!.where(_isModified);
+      final unmodified = _flags!.where(_isUnmodified);
 
       if (modified.isNotEmpty) {
         content.add(new HeadingElement.h1()..text = 'Modified Flags');
@@ -91,7 +91,7 @@
     children = <Element>[
       navBar(<Element>[
         new NavTopMenuElement(queue: _r.queue).element,
-        new NavVMMenuElement(_vm, _events, queue: _r.queue).element,
+        new NavVMMenuElement(_vm as M.VM, _events, queue: _r.queue).element,
         navMenu('flags', link: Uris.flags()),
         (new NavRefreshElement(queue: _r.queue)
               ..onRefresh.listen((e) async {
@@ -137,7 +137,7 @@
           new SpanElement()..text = '=',
           new SpanElement()
             ..classes = ['value']
-            ..text = flag.valueAsString ?? 'NULL'
+            ..text = flag.valueAsString
         ],
       new BRElement(),
     ];
diff --git a/runtime/observatory/lib/src/elements/function_ref.dart b/runtime/observatory/lib/src/elements/function_ref.dart
index b6ea92f..a53b6c4 100644
--- a/runtime/observatory/lib/src/elements/function_ref.dart
+++ b/runtime/observatory/lib/src/elements/function_ref.dart
@@ -20,20 +20,20 @@
 import 'package:observatory/src/elements/helpers/uris.dart';
 
 class FunctionRefElement extends CustomElement implements Renderable {
-  RenderingScheduler<FunctionRefElement> _r;
+  late RenderingScheduler<FunctionRefElement> _r;
 
   Stream<RenderedEvent<FunctionRefElement>> get onRendered => _r.onRendered;
 
-  M.IsolateRef _isolate;
-  M.FunctionRef _function;
-  bool _qualified;
+  M.IsolateRef? _isolate;
+  late M.FunctionRef _function;
+  late bool _qualified;
 
-  M.IsolateRef get isolate => _isolate;
+  M.IsolateRef? get isolate => _isolate;
   M.FunctionRef get function => _function;
   bool get qualified => _qualified;
 
-  factory FunctionRefElement(M.IsolateRef isolate, M.FunctionRef function,
-      {bool qualified: true, RenderingQueue queue}) {
+  factory FunctionRefElement(M.IsolateRef? isolate, M.FunctionRef function,
+      {bool qualified: true, RenderingQueue? queue}) {
     assert(function != null);
     assert(qualified != null);
     FunctionRefElement e = new FunctionRefElement.created();
@@ -65,11 +65,11 @@
       new AnchorElement(
           href: (M.isSyntheticFunction(_function.kind) || (_isolate == null))
               ? null
-              : Uris.inspect(_isolate, object: _function))
+              : Uris.inspect(_isolate!, object: _function))
         ..text = _function.name
     ];
     if (qualified) {
-      M.ObjectRef owner = _function.dartOwner;
+      M.ObjectRef? owner = _function.dartOwner;
       while (owner is M.FunctionRef) {
         M.FunctionRef function = (owner as M.FunctionRef);
         content.addAll([
@@ -77,7 +77,7 @@
           new AnchorElement(
               href: (M.isSyntheticFunction(function.kind) || (_isolate == null))
                   ? null
-                  : Uris.inspect(_isolate, object: function))
+                  : Uris.inspect(_isolate!, object: function))
             ..text = function.name
         ]);
         owner = function.dartOwner;
@@ -85,7 +85,8 @@
       if (owner is M.ClassRef) {
         content.addAll([
           new SpanElement()..text = '.',
-          new ClassRefElement(_isolate, owner, queue: _r.queue).element
+          new ClassRefElement(_isolate!, owner as M.ClassRef, queue: _r.queue)
+              .element
         ]);
       }
     }
diff --git a/runtime/observatory/lib/src/elements/function_view.dart b/runtime/observatory/lib/src/elements/function_view.dart
index 8150d65..b1b3654 100644
--- a/runtime/observatory/lib/src/elements/function_view.dart
+++ b/runtime/observatory/lib/src/elements/function_view.dart
@@ -30,24 +30,24 @@
 import 'package:observatory/src/elements/view_footer.dart';
 
 class FunctionViewElement extends CustomElement implements Renderable {
-  RenderingScheduler<FunctionViewElement> _r;
+  late RenderingScheduler<FunctionViewElement> _r;
 
   Stream<RenderedEvent<FunctionViewElement>> get onRendered => _r.onRendered;
 
-  M.VM _vm;
-  M.IsolateRef _isolate;
-  M.EventRepository _events;
-  M.NotificationRepository _notifications;
-  M.ServiceFunction _function;
-  M.LibraryRef _library;
-  M.FunctionRepository _functions;
-  M.ClassRepository _classes;
-  M.RetainedSizeRepository _retainedSizes;
-  M.ReachableSizeRepository _reachableSizes;
-  M.InboundReferencesRepository _references;
-  M.RetainingPathRepository _retainingPaths;
-  M.ScriptRepository _scripts;
-  M.ObjectRepository _objects;
+  late M.VM _vm;
+  late M.IsolateRef _isolate;
+  late M.EventRepository _events;
+  late M.NotificationRepository _notifications;
+  late M.ServiceFunction _function;
+  M.LibraryRef? _library;
+  late M.FunctionRepository _functions;
+  late M.ClassRepository _classes;
+  late M.RetainedSizeRepository _retainedSizes;
+  late M.ReachableSizeRepository _reachableSizes;
+  late M.InboundReferencesRepository _references;
+  late M.RetainingPathRepository _retainingPaths;
+  late M.ScriptRepository _scripts;
+  late M.ObjectRepository _objects;
 
   M.VMRef get vm => _vm;
   M.IsolateRef get isolate => _isolate;
@@ -68,7 +68,7 @@
       M.RetainingPathRepository retainingPaths,
       M.ScriptRepository scripts,
       M.ObjectRepository objects,
-      {RenderingQueue queue}) {
+      {RenderingQueue? queue}) {
     assert(vm != null);
     assert(isolate != null);
     assert(events != null);
@@ -98,7 +98,7 @@
     e._scripts = scripts;
     e._objects = objects;
     if (function.dartOwner is M.LibraryRef) {
-      e._library = function.dartOwner;
+      e._library = function.dartOwner as M.LibraryRef;
     }
     return e;
   }
@@ -140,7 +140,7 @@
             ..children = _function.location == null
                 ? const []
                 : [
-                    new SourceInsetElement(_isolate, _function.location,
+                    new SourceInsetElement(_isolate, _function.location!,
                             _scripts, _objects, _events,
                             queue: _r.queue)
                         .element
@@ -157,15 +157,16 @@
       new NavIsolateMenuElement(_isolate, _events, queue: _r.queue).element
     ];
     if (_library != null) {
-      menu.add(new NavLibraryMenuElement(_isolate, _library, queue: _r.queue)
+      menu.add(new NavLibraryMenuElement(_isolate, _library!, queue: _r.queue)
           .element);
     } else if (_function.dartOwner is M.ClassRef) {
-      menu.add(new NavClassMenuElement(_isolate, _function.dartOwner,
+      menu.add(new NavClassMenuElement(
+              _isolate, _function.dartOwner as M.ClassRef,
               queue: _r.queue)
           .element);
     }
     menu.addAll(<Element>[
-      navMenu(_function.name),
+      navMenu(_function.name!),
       (new NavRefreshElement(queue: _r.queue)
             ..onRefresh.listen((e) {
               e.element.disabled = true;
@@ -189,8 +190,8 @@
             ..classes = ['memberName']
             ..children = <Element>[
               new SpanElement()
-                ..text = '${_function.isStatic ? "static " : ""}'
-                    '${_function.isConst ? "const " : ""}'
+                ..text = '${_function.isStatic! ? "static " : ""}'
+                    '${_function.isConst! ? "const " : ""}'
                     '${_functionKindToString(_function.kind)}'
             ]
         ],
@@ -220,7 +221,7 @@
           new DivElement()
             ..classes = ['memberName']
             ..children = <Element>[
-              new FieldRefElement(_isolate, _function.field, _objects,
+              new FieldRefElement(_isolate, _function.field!, _objects,
                       queue: _r.queue)
                   .element
             ]
@@ -235,7 +236,7 @@
         new DivElement()
           ..classes = ['memberName']
           ..children = <Element>[
-            new SourceLinkElement(_isolate, _function.location, _scripts,
+            new SourceLinkElement(_isolate, _function.location!, _scripts,
                     queue: _r.queue)
                 .element
           ]
@@ -250,7 +251,7 @@
           new DivElement()
             ..classes = ['memberName']
             ..children = <Element>[
-              new CodeRefElement(_isolate, _function.code, queue: _r.queue)
+              new CodeRefElement(_isolate, _function.code!, queue: _r.queue)
                   .element
             ]
         ]);
@@ -265,7 +266,7 @@
           new DivElement()
             ..classes = ['memberName']
             ..children = <Element>[
-              new CodeRefElement(_isolate, _function.unoptimizedCode,
+              new CodeRefElement(_isolate, _function.unoptimizedCode!,
                       queue: _r.queue)
                   .element,
               new SpanElement()
@@ -276,21 +277,6 @@
             ]
         ]);
     }
-    if (_function.bytecode != null) {
-      members.add(new DivElement()
-        ..classes = ['memberItem']
-        ..children = <Element>[
-          new DivElement()
-            ..classes = ['memberName']
-            ..text = 'bytecode',
-          new DivElement()
-            ..classes = ['memberName']
-            ..children = <Element>[
-              new CodeRefElement(_isolate, _function.bytecode, queue: _r.queue)
-                  .element,
-            ]
-        ]);
-    }
     members.add(new DivElement()
       ..classes = ['memberItem']
       ..text = ' ');
@@ -305,7 +291,7 @@
           new DivElement()
             ..classes = ['memberName']
             ..children = <Element>[
-              new InstanceRefElement(_isolate, _function.icDataArray, _objects,
+              new InstanceRefElement(_isolate, _function.icDataArray!, _objects,
                       queue: _r.queue)
                   .element
             ]
@@ -331,7 +317,7 @@
             ..text = 'optimizable',
           new DivElement()
             ..classes = ['memberName']
-            ..text = _function.isOptimizable ? 'yes' : 'no'
+            ..text = _function.isOptimizable! ? 'yes' : 'no'
         ],
       new DivElement()
         ..classes = ['memberItem']
@@ -341,7 +327,7 @@
             ..text = 'inlinable',
           new DivElement()
             ..classes = ['memberName']
-            ..text = _function.isInlinable ? 'yes' : 'no'
+            ..text = _function.isInlinable! ? 'yes' : 'no'
         ],
       new DivElement()
         ..classes = ['memberItem']
@@ -351,7 +337,7 @@
             ..text = 'intrinsic',
           new DivElement()
             ..classes = ['memberName']
-            ..text = _function.hasIntrinsic ? 'yes' : 'no'
+            ..text = _function.hasIntrinsic! ? 'yes' : 'no'
         ],
       new DivElement()
         ..classes = ['memberItem']
@@ -361,7 +347,7 @@
             ..text = 'recognized',
           new DivElement()
             ..classes = ['memberName']
-            ..text = _function.isRecognized ? 'yes' : 'no'
+            ..text = _function.isRecognized! ? 'yes' : 'no'
         ],
       new DivElement()
         ..classes = ['memberItem']
@@ -371,7 +357,7 @@
             ..text = 'native',
           new DivElement()
             ..classes = ['memberName']
-            ..text = _function.isNative ? 'yes' : 'no'
+            ..text = _function.isNative! ? 'yes' : 'no'
         ],
       new DivElement()
         ..classes = ['memberItem']
@@ -388,16 +374,17 @@
   }
 
   Future _refresh() async {
-    _function = await _functions.get(_isolate, _function.id);
+    _function = await _functions.get(_isolate, _function.id!);
     if (_function.dartOwner is M.LibraryRef) {
-      _library = _function.dartOwner;
+      _library = _function.dartOwner as M.LibraryRef;
     } else if (_function.dartOwner is M.ClassRef) {
-      _library = (await _classes.get(_isolate, _function.dartOwner.id)).library;
+      var cls = _function.dartOwner as M.ClassRef;
+      _library = (await _classes.get(_isolate, cls.id!)).library!;
     }
     _r.dirty();
   }
 
-  static String _functionKindToString(M.FunctionKind kind) {
+  static String _functionKindToString(M.FunctionKind? kind) {
     switch (kind) {
       case M.FunctionKind.regular:
         return 'regular';
diff --git a/runtime/observatory/lib/src/elements/general_error.dart b/runtime/observatory/lib/src/elements/general_error.dart
index 430e366..40ffff9 100644
--- a/runtime/observatory/lib/src/elements/general_error.dart
+++ b/runtime/observatory/lib/src/elements/general_error.dart
@@ -14,19 +14,19 @@
 import 'package:observatory/src/elements/nav/top_menu.dart';
 
 class GeneralErrorElement extends CustomElement implements Renderable {
-  RenderingScheduler<GeneralErrorElement> _r;
+  late RenderingScheduler<GeneralErrorElement> _r;
 
   Stream<RenderedEvent<GeneralErrorElement>> get onRendered => _r.onRendered;
 
-  M.NotificationRepository _notifications;
-  String _message;
+  late M.NotificationRepository _notifications;
+  late String _message;
 
   String get message => _message;
 
   set message(String value) => _message = _r.checkAndReact(_message, value);
 
   factory GeneralErrorElement(M.NotificationRepository notifications,
-      {String message: '', RenderingQueue queue}) {
+      {String message: '', RenderingQueue? queue}) {
     assert(notifications != null);
     assert(message != null);
     GeneralErrorElement e = new GeneralErrorElement.created();
diff --git a/runtime/observatory/lib/src/elements/heap_map.dart b/runtime/observatory/lib/src/elements/heap_map.dart
index 461fb52..7b10370 100644
--- a/runtime/observatory/lib/src/elements/heap_map.dart
+++ b/runtime/observatory/lib/src/elements/heap_map.dart
@@ -21,21 +21,21 @@
 import 'package:observatory/src/elements/nav/vm_menu.dart';
 
 class HeapMapElement extends CustomElement implements Renderable {
-  RenderingScheduler<HeapMapElement> _r;
+  late RenderingScheduler<HeapMapElement> _r;
 
   Stream<RenderedEvent<HeapMapElement>> get onRendered => _r.onRendered;
 
-  M.VM _vm;
-  M.IsolateRef _isolate;
-  M.EventRepository _events;
-  M.NotificationRepository _notifications;
+  late M.VM _vm;
+  late M.IsolateRef _isolate;
+  late M.EventRepository _events;
+  late M.NotificationRepository _notifications;
   M.VMRef get vm => _vm;
   M.IsolateRef get isolate => _isolate;
   M.NotificationRepository get notifications => _notifications;
 
   factory HeapMapElement(M.VM vm, M.IsolateRef isolate,
       M.EventRepository events, M.NotificationRepository notifications,
-      {RenderingQueue queue}) {
+      {RenderingQueue? queue}) {
     assert(vm != null);
     assert(isolate != null);
     assert(events != null);
@@ -65,9 +65,9 @@
     children = <Element>[];
   }
 
-  CanvasElement _canvas;
-  var _fragmentationData;
-  double _pageHeight;
+  CanvasElement? _canvas;
+  dynamic _fragmentationData;
+  int? _pageHeight;
   final _classIdToColor = {};
   final _colorToClassId = {};
   final _classIdToName = {};
@@ -79,8 +79,8 @@
   // TODO(koda): Improve interface for huge heaps.
   static const _MAX_CANVAS_HEIGHT = 6000;
 
-  String _status;
-  S.ServiceMap _fragmentation;
+  String _status = 'Loading';
+  S.ServiceMap? _fragmentation;
 
   void render() {
     if (_canvas == null) {
@@ -91,7 +91,7 @@
     }
 
     // Set hover text to describe the object under the cursor.
-    _canvas.title = _status;
+    _canvas!.title = _status;
 
     children = <Element>[
       navBar(<Element>[
@@ -121,7 +121,7 @@
         ],
       new DivElement()
         ..classes = ['flex-row']
-        ..children = <Element>[_canvas]
+        ..children = <Element>[_canvas!]
     ];
   }
 
@@ -150,9 +150,9 @@
         print('Ignoring non-class in class list');
         continue;
       }
-      var classId = int.parse(member.id.split('/').last);
+      var classId = int.parse(member.id!.split('/').last);
       var color = _classIdToRGBA(classId);
-      _addClass(classId, member.name, color);
+      _addClass(classId, member.name!, color);
     }
     _addClass(freeClassId, 'Free', _freeColor);
     _addClass(0, '', _pageSeparationColor);
@@ -169,15 +169,15 @@
     return _classIdToName[_colorToClassId[_packColor(color)]];
   }
 
-  ObjectInfo _objectAt(Point<num> point) {
+  ObjectInfo? _objectAt(Point<num> point) {
     if (_fragmentation == null || _canvas == null) {
       return null;
     }
-    var pagePixels = _pageHeight * _fragmentationData.width;
+    var pagePixels = _pageHeight! * _fragmentationData.width;
     var index = new PixelReference(_fragmentationData, point).index;
     var pageIndex = index ~/ pagePixels;
     num pageOffset = index % pagePixels;
-    var pages = _fragmentation['pages'];
+    var pages = _fragmentation!['pages'];
     if (pageIndex < 0 || pageIndex >= pages.length) {
       return null;
     }
@@ -196,8 +196,8 @@
     }
     return new ObjectInfo(
         int.parse(page['objectStart']) +
-            pageOffset * _fragmentation['unitSizeBytes'],
-        size * _fragmentation['unitSizeBytes']);
+            pageOffset * _fragmentation!['unitSizeBytes'],
+        size * _fragmentation!['unitSizeBytes']);
   }
 
   void _handleMouseMove(MouseEvent event) {
@@ -218,28 +218,28 @@
       return;
     }
     _updateClassList(
-        _fragmentation['classList'], _fragmentation['freeClassId']);
-    var pages = _fragmentation['pages'];
-    var width = max(_canvas.parent.client.width, 1);
+        _fragmentation!['classList'], _fragmentation!['freeClassId']);
+    var pages = _fragmentation!['pages'];
+    var width = max(_canvas!.parent!.client.width, 1) as int;
     _pageHeight = _PAGE_SEPARATION_HEIGHT +
-        _fragmentation['pageSizeBytes'] ~/
-            _fragmentation['unitSizeBytes'] ~/
+        (_fragmentation!['pageSizeBytes'] as int) ~/
+            (_fragmentation!['unitSizeBytes'] as int) ~/
             width;
-    var height = min(_pageHeight * pages.length, _MAX_CANVAS_HEIGHT);
-    _fragmentationData = _canvas.context2D.createImageData(width, height);
-    _canvas.width = _fragmentationData.width;
-    _canvas.height = _fragmentationData.height;
+    var height = min(_pageHeight! * pages.length, _MAX_CANVAS_HEIGHT) as int;
+    _fragmentationData = _canvas!.context2D.createImageData(width, height);
+    _canvas!.width = _fragmentationData.width;
+    _canvas!.height = _fragmentationData.height;
     _renderPages(0);
   }
 
   // Renders and draws asynchronously, one page at a time to avoid
   // blocking the UI.
   void _renderPages(int startPage) {
-    var pages = _fragmentation['pages'];
+    var pages = _fragmentation!['pages'];
     _status = 'Loaded $startPage of ${pages.length} pages';
     _r.dirty();
-    var startY = (startPage * _pageHeight).round();
-    var endY = startY + _pageHeight.round();
+    var startY = (startPage * _pageHeight!).round();
+    var endY = startY + _pageHeight!.round();
     if (startPage >= pages.length || endY > _fragmentationData.height) {
       return;
     }
@@ -258,7 +258,7 @@
       pixel.color = _pageSeparationColor;
       pixel = pixel.next();
     }
-    _canvas.context2D.putImageData(
+    _canvas!.context2D.putImageData(
         _fragmentationData, 0, 0, 0, startY, _fragmentationData.width, endY);
     // Continue with the next page, asynchronously.
     new Future(() {
@@ -266,14 +266,14 @@
     });
   }
 
-  Future _refresh({String gc}) {
+  Future _refresh({String? gc}) {
     final isolate = _isolate as S.Isolate;
     var params = {};
     if (gc != null) {
       params['gc'] = gc;
     }
     return isolate.invokeRpc('_getHeapMap', params).then((serviceObject) {
-      S.ServiceMap response = serviceObject;
+      S.ServiceMap response = serviceObject as S.ServiceMap;
       assert(response['type'] == 'HeapMap');
       _fragmentation = response;
       _updateFragmentationData();
diff --git a/runtime/observatory/lib/src/elements/heap_snapshot.dart b/runtime/observatory/lib/src/elements/heap_snapshot.dart
index 0f99d3a..1ddb59e 100644
--- a/runtime/observatory/lib/src/elements/heap_snapshot.dart
+++ b/runtime/observatory/lib/src/elements/heap_snapshot.dart
@@ -168,9 +168,9 @@
 
   String getType(MergedDominatorDiff node) => node.name;
   String getName(MergedDominatorDiff node) => "instances of ${node.name}";
-  MergedDominatorDiff getParent(MergedDominatorDiff node) => node.parent;
+  MergedDominatorDiff? getParent(MergedDominatorDiff node) => node.parent;
   Iterable<MergedDominatorDiff> getChildren(MergedDominatorDiff node) =>
-      node.children;
+      node.children!;
   void onSelect(MergedDominatorDiff node) {
     element.mergedDiffSelection = node;
     element._r.dirty();
@@ -198,7 +198,7 @@
       ? "${snapshot.classes.length} classes"
       : "${node.instanceCount} instances of ${node.name}";
 
-  SnapshotClass getParent(SnapshotClass node) => null;
+  SnapshotClass? getParent(SnapshotClass node) => null;
   Iterable<SnapshotClass> getChildren(SnapshotClass node) =>
       node == null ? snapshot.classes : <SnapshotClass>[];
   void onSelect(SnapshotClass node) {}
@@ -255,7 +255,7 @@
       node == null ? "Classes" : node.name;
   String getName(SnapshotClassDiff node) =>
       node == null ? "${classes.length} classes" : "instances of ${node.name}";
-  SnapshotClassDiff getParent(SnapshotClassDiff node) => null;
+  SnapshotClassDiff? getParent(SnapshotClassDiff node) => null;
   Iterable<SnapshotClassDiff> getChildren(SnapshotClassDiff node) =>
       node == null ? classes : <SnapshotClassDiff>[];
   void onSelect(SnapshotClassDiff node) {}
@@ -280,7 +280,7 @@
   String getName(SnapshotClass node) => node == null
       ? "${snapshot.classes.length} Classes"
       : "${node.instanceCount} instances of ${node.name}";
-  SnapshotClass getParent(SnapshotClass node) => null;
+  SnapshotClass? getParent(SnapshotClass node) => null;
   Iterable<SnapshotClass> getChildren(SnapshotClass node) =>
       node == null ? snapshot.classes : <SnapshotClass>[];
   void onSelect(SnapshotClass node) {}
@@ -337,7 +337,7 @@
       node == null ? "Classes" : node.name;
   String getName(SnapshotClassDiff node) =>
       node == null ? "${classes.length} classes" : "instances of ${node.name}";
-  SnapshotClassDiff getParent(SnapshotClassDiff node) => null;
+  SnapshotClassDiff? getParent(SnapshotClassDiff node) => null;
   Iterable<SnapshotClassDiff> getChildren(SnapshotClassDiff node) =>
       node == null ? classes : <SnapshotClassDiff>[];
   void onSelect(SnapshotClassDiff node) {}
@@ -350,16 +350,16 @@
 }
 
 class SnapshotClassDiff {
-  SnapshotClass _a;
-  SnapshotClass _b;
+  SnapshotClass? _a;
+  SnapshotClass? _b;
 
-  int get shallowSizeA => _a == null ? 0 : _a.shallowSize;
-  int get ownedSizeA => _a == null ? 0 : _a.ownedSize;
-  int get instanceCountA => _a == null ? 0 : _a.instanceCount;
+  int get shallowSizeA => _a == null ? 0 : _a!.shallowSize;
+  int get ownedSizeA => _a == null ? 0 : _a!.ownedSize;
+  int get instanceCountA => _a == null ? 0 : _a!.instanceCount;
 
-  int get shallowSizeB => _b == null ? 0 : _b.shallowSize;
-  int get ownedSizeB => _b == null ? 0 : _b.ownedSize;
-  int get instanceCountB => _b == null ? 0 : _b.instanceCount;
+  int get shallowSizeB => _b == null ? 0 : _b!.shallowSize;
+  int get ownedSizeB => _b == null ? 0 : _b!.ownedSize;
+  int get instanceCountB => _b == null ? 0 : _b!.instanceCount;
 
   int get shallowSizeDiff => shallowSizeB - shallowSizeA;
   int get ownedSizeDiff => ownedSizeB - ownedSizeA;
@@ -377,12 +377,12 @@
       shallowSizeB > shallowSizeA ? shallowSizeA : shallowSizeB;
   int get ownedSizeCommon => ownedSizeB > ownedSizeA ? ownedSizeA : ownedSizeB;
 
-  String get name => _a == null ? _b.name : _a.name;
+  String get name => _a == null ? _b!.name : _a!.name;
 
   List<SnapshotObject> get objectsA =>
-      _a == null ? <SnapshotObject>[] : _a.instances.toList();
+      _a == null ? const <SnapshotObject>[] : _a!.instances.toList();
   List<SnapshotObject> get objectsB =>
-      _b == null ? <SnapshotObject>[] : _b.instances.toList();
+      _b == null ? const <SnapshotObject>[] : _b!.instances.toList();
 
   static List<SnapshotClassDiff> from(
       SnapshotGraph graphA, SnapshotGraph graphB) {
@@ -414,32 +414,32 @@
 }
 
 class MergedDominatorDiff {
-  SnapshotMergedDominator _a;
-  SnapshotMergedDominator _b;
-  MergedDominatorDiff parent;
-  List<MergedDominatorDiff> children;
+  SnapshotMergedDominator? _a;
+  SnapshotMergedDominator? _b;
+  MergedDominatorDiff? parent;
+  List<MergedDominatorDiff>? children;
   int retainedGain = -1;
   int retainedLoss = -1;
   int retainedCommon = -1;
 
-  int get shallowSizeA => _a == null ? 0 : _a.shallowSize;
-  int get retainedSizeA => _a == null ? 0 : _a.retainedSize;
-  int get instanceCountA => _a == null ? 0 : _a.instanceCount;
+  int get shallowSizeA => _a == null ? 0 : _a!.shallowSize;
+  int get retainedSizeA => _a == null ? 0 : _a!.retainedSize;
+  int get instanceCountA => _a == null ? 0 : _a!.instanceCount;
 
-  int get shallowSizeB => _b == null ? 0 : _b.shallowSize;
-  int get retainedSizeB => _b == null ? 0 : _b.retainedSize;
-  int get instanceCountB => _b == null ? 0 : _b.instanceCount;
+  int get shallowSizeB => _b == null ? 0 : _b!.shallowSize;
+  int get retainedSizeB => _b == null ? 0 : _b!.retainedSize;
+  int get instanceCountB => _b == null ? 0 : _b!.instanceCount;
 
   int get shallowSizeDiff => shallowSizeB - shallowSizeA;
   int get retainedSizeDiff => retainedSizeB - retainedSizeA;
   int get instanceCountDiff => instanceCountB - instanceCountA;
 
-  String get name => _a == null ? _b.klass.name : _a.klass.name;
+  String get name => _a == null ? _b!.klass.name : _a!.klass.name;
 
   List<SnapshotObject> get objectsA =>
-      _a == null ? <SnapshotObject>[] : _a.objects.toList();
+      _a == null ? const <SnapshotObject>[] : _a!.objects.toList();
   List<SnapshotObject> get objectsB =>
-      _b == null ? <SnapshotObject>[] : _b.objects.toList();
+      _b == null ? const <SnapshotObject>[] : _b!.objects.toList();
 
   static MergedDominatorDiff from(
       SnapshotMergedDominator a, SnapshotMergedDominator b) {
@@ -472,11 +472,11 @@
     // Matching children by MergedObjectVertex.klass.qualifiedName.
     final childrenB = <String, SnapshotMergedDominator>{};
     if (_b != null)
-      for (var childB in _b.children) {
+      for (var childB in _b!.children) {
         childrenB[childB.klass.qualifiedName] = childB;
       }
     if (_a != null)
-      for (var childA in _a.children) {
+      for (var childA in _a!.children) {
         var childDiff = new MergedDominatorDiff();
         childDiff.parent = this;
         childDiff._a = childA;
@@ -486,18 +486,18 @@
           childrenB.remove(qualifiedName);
           childDiff._b = childB;
         }
-        children.add(childDiff);
+        children!.add(childDiff);
         worklist.add(childDiff);
       }
     for (var childB in childrenB.values) {
       var childDiff = new MergedDominatorDiff();
       childDiff.parent = this;
       childDiff._b = childB;
-      children.add(childDiff);
+      children!.add(childDiff);
       worklist.add(childDiff);
     }
 
-    if (children.length == 0) {
+    if (children!.length == 0) {
       // Compress.
       children = const <MergedDominatorDiff>[];
     }
@@ -507,7 +507,7 @@
     int g = 0;
     int l = 0;
     int c = 0;
-    for (var child in children) {
+    for (var child in children!) {
       g += child.retainedGain;
       l += child.retainedLoss;
       c += child.retainedCommon;
@@ -528,30 +528,30 @@
 }
 
 class HeapSnapshotElement extends CustomElement implements Renderable {
-  RenderingScheduler<HeapSnapshotElement> _r;
+  late RenderingScheduler<HeapSnapshotElement> _r;
 
   Stream<RenderedEvent<HeapSnapshotElement>> get onRendered => _r.onRendered;
 
-  M.VM _vm;
-  M.IsolateRef _isolate;
-  M.EventRepository _events;
-  M.NotificationRepository _notifications;
-  M.HeapSnapshotRepository _snapshots;
-  M.ObjectRepository _objects;
-  SnapshotReader _reader;
-  String _status;
+  late M.VM _vm;
+  late M.IsolateRef _isolate;
+  late M.EventRepository _events;
+  late M.NotificationRepository _notifications;
+  late M.HeapSnapshotRepository _snapshots;
+  late M.ObjectRepository _objects;
+  SnapshotReader? _reader;
+  String? _status;
   List<SnapshotGraph> _loadedSnapshots = <SnapshotGraph>[];
-  SnapshotGraph _snapshotA;
-  SnapshotGraph _snapshotB;
+  SnapshotGraph? _snapshotA;
+  SnapshotGraph? _snapshotB;
   HeapSnapshotTreeMode _mode = HeapSnapshotTreeMode.mergedDominatorTreeMap;
   M.IsolateRef get isolate => _isolate;
   M.NotificationRepository get notifications => _notifications;
   M.HeapSnapshotRepository get profiles => _snapshots;
   M.VMRef get vm => _vm;
 
-  List<SnapshotObject> selection;
-  SnapshotMergedDominator mergedSelection;
-  MergedDominatorDiff mergedDiffSelection;
+  List<SnapshotObject>? selection;
+  SnapshotMergedDominator? mergedSelection;
+  MergedDominatorDiff? mergedDiffSelection;
 
   factory HeapSnapshotElement(
       M.VM vm,
@@ -560,7 +560,7 @@
       M.NotificationRepository notifications,
       M.HeapSnapshotRepository snapshots,
       M.ObjectRepository objects,
-      {RenderingQueue queue}) {
+      {RenderingQueue? queue}) {
     assert(vm != null);
     assert(isolate != null);
     assert(events != null);
@@ -625,7 +625,7 @@
     if (_reader != null) {
       // Loading
       content.addAll(_createStatusMessage('Loading snapshot...',
-          description: _status, progress: 1));
+          description: _status!, progress: 1));
     } else if (_snapshotA != null) {
       // Loaded
       content.addAll(_createReport());
@@ -639,7 +639,7 @@
   }
 
   _save() {
-    var blob = new Blob(_snapshotA.chunks, 'application/octet-stream');
+    var blob = new Blob(_snapshotA!.chunks, 'application/octet-stream');
     var blobUrl = Url.createObjectUrl(blob);
     var link = new AnchorElement();
     link.href = blobUrl;
@@ -653,13 +653,13 @@
     input.type = 'file';
     input.multiple = false;
     input.onChange.listen((event) {
-      var file = input.files[0];
+      var file = input.files![0];
       var reader = new FileReader();
       reader.onLoad.listen((event) async {
-        var encoded = <Uint8List>[reader.result];
+        var encoded = <Uint8List>[reader.result as Uint8List];
         var snapshotReader = new SnapshotReader();
         _snapshotLoading(snapshotReader);
-        snapshotReader.add(reader.result);
+        snapshotReader.add(reader.result as Uint8List);
         snapshotReader.close();
       });
       reader.readAsArrayBuffer(file);
@@ -713,7 +713,7 @@
     ];
   }
 
-  VirtualTreeElement _tree;
+  VirtualTreeElement? _tree;
 
   void _createTreeMap<T>(List<HtmlElement> report, TreeMap<T> treemap, T root) {
     final content = new DivElement();
@@ -786,13 +786,13 @@
     switch (_mode) {
       case HeapSnapshotTreeMode.dominatorTree:
         if (selection == null) {
-          selection = List.from(_snapshotA.extendedRoot.objects);
+          selection = List.from(_snapshotA!.extendedRoot.objects);
         }
         _tree = new VirtualTreeElement(
             _createDominator, _updateDominator, _getChildrenDominator,
-            items: selection, queue: _r.queue);
-        if (selection.length == 1) {
-          _tree.expand(selection.first);
+            items: selection!, queue: _r.queue);
+        if (selection!.length == 1) {
+          _tree!.expand(selection!.first);
         }
         final text = 'In a heap dominator tree, an object X is a parent of '
             'object Y if every path from the root to Y goes through '
@@ -804,49 +804,49 @@
           new DivElement()
             ..classes = ['content-centered-big', 'explanation']
             ..text = text,
-          _tree.element
+          _tree!.element
         ]);
         break;
       case HeapSnapshotTreeMode.dominatorTreeMap:
         if (selection == null) {
-          selection = List.from(_snapshotA.extendedRoot.objects);
+          selection = List.from(_snapshotA!.extendedRoot.objects);
         }
-        _createTreeMap(report, new DominatorTreeMap(this), selection.first);
+        _createTreeMap(report, new DominatorTreeMap(this), selection!.first);
         break;
       case HeapSnapshotTreeMode.mergedDominatorTree:
         _tree = new VirtualTreeElement(_createMergedDominator,
             _updateMergedDominator, _getChildrenMergedDominator,
-            items: _getChildrenMergedDominator(_snapshotA.extendedMergedRoot),
+            items: _getChildrenMergedDominator(_snapshotA!.extendedMergedRoot),
             queue: _r.queue);
-        _tree.expand(_snapshotA.extendedMergedRoot);
+        _tree!.expand(_snapshotA!.extendedMergedRoot);
         final text = 'A heap dominator tree, where siblings with the same class'
             ' have been merged into a single node.';
         report.addAll([
           new DivElement()
             ..classes = ['content-centered-big', 'explanation']
             ..text = text,
-          _tree.element
+          _tree!.element
         ]);
         break;
       case HeapSnapshotTreeMode.mergedDominatorTreeDiff:
         var root = MergedDominatorDiff.from(
-            _snapshotA.mergedRoot, _snapshotB.mergedRoot);
+            _snapshotA!.mergedRoot, _snapshotB!.mergedRoot);
         _tree = new VirtualTreeElement(_createMergedDominatorDiff,
             _updateMergedDominatorDiff, _getChildrenMergedDominatorDiff,
             items: _getChildrenMergedDominatorDiff(root), queue: _r.queue);
-        _tree.expand(root);
+        _tree!.expand(root);
         final text = 'A heap dominator tree, where siblings with the same class'
             ' have been merged into a single node.';
         report.addAll([
           new DivElement()
             ..classes = ['content-centered-big', 'explanation']
             ..text = text,
-          _tree.element
+          _tree!.element
         ]);
         break;
       case HeapSnapshotTreeMode.mergedDominatorTreeMap:
         if (mergedSelection == null) {
-          mergedSelection = _snapshotA.extendedMergedRoot;
+          mergedSelection = _snapshotA!.extendedMergedRoot;
         }
         _createTreeMap(
             report, new MergedDominatorTreeMap(this), mergedSelection);
@@ -854,18 +854,19 @@
       case HeapSnapshotTreeMode.mergedDominatorTreeMapDiff:
         if (mergedDiffSelection == null) {
           mergedDiffSelection = MergedDominatorDiff.from(
-              _snapshotA.mergedRoot, _snapshotB.mergedRoot);
+              _snapshotA!.mergedRoot, _snapshotB!.mergedRoot);
         }
         _createTreeMap(
             report, new MergedDominatorDiffTreeMap(this), mergedDiffSelection);
         break;
       case HeapSnapshotTreeMode.ownershipTable:
-        final items = _snapshotA.classes.where((c) => c.ownedSize > 0).toList();
+        final items =
+            _snapshotA!.classes.where((c) => c.ownedSize > 0).toList();
         items.sort((a, b) => b.ownedSize - a.ownedSize);
         _tree = new VirtualTreeElement(
             _createOwnership, _updateOwnership, _getChildrenOwnership,
             items: items, queue: _r.queue);
-        _tree.expand(_snapshotA.root);
+        _tree!.expand(_snapshotA!.root);
         final text = 'An object X is said to "own" object Y if X is the only '
             'object that references Y, or X owns the only object that '
             'references Y. In particular, objects "own" the space of any '
@@ -874,18 +875,18 @@
           new DivElement()
             ..classes = ['content-centered-big', 'explanation']
             ..text = text,
-          _tree.element
+          _tree!.element
         ]);
         break;
       case HeapSnapshotTreeMode.ownershipTableDiff:
-        final items = SnapshotClassDiff.from(_snapshotA, _snapshotB);
+        final items = SnapshotClassDiff.from(_snapshotA!, _snapshotB!);
         items.sort((a, b) => b.ownedSizeB - a.ownedSizeB);
         items.sort((a, b) => b.ownedSizeA - a.ownedSizeA);
         items.sort((a, b) => b.ownedSizeDiff - a.ownedSizeDiff);
         _tree = new VirtualTreeElement(_createOwnershipDiff,
             _updateOwnershipDiff, _getChildrenOwnershipDiff,
             items: items, queue: _r.queue);
-        _tree.expand(_snapshotA.root);
+        _tree!.expand(_snapshotA!.root);
         final text = 'An object X is said to "own" object Y if X is the only '
             'object that references Y, or X owns the only object that '
             'references Y. In particular, objects "own" the space of any '
@@ -894,79 +895,79 @@
           new DivElement()
             ..classes = ['content-centered-big', 'explanation']
             ..text = text,
-          _tree.element
+          _tree!.element
         ]);
         break;
       case HeapSnapshotTreeMode.ownershipTreeMap:
         _createTreeMap(
-            report, new ClassesOwnershipTreeMap(this, _snapshotA), null);
+            report, new ClassesOwnershipTreeMap(this, _snapshotA!), null);
         break;
       case HeapSnapshotTreeMode.ownershipTreeMapDiff:
-        final items = SnapshotClassDiff.from(_snapshotA, _snapshotB);
+        final items = SnapshotClassDiff.from(_snapshotA!, _snapshotB!);
         _createTreeMap(
             report, new ClassesOwnershipDiffTreeMap(this, items), null);
         break;
       case HeapSnapshotTreeMode.successors:
         if (selection == null) {
-          selection = List.from(_snapshotA.root.objects);
+          selection = List.from(_snapshotA!.root.objects);
         }
         _tree = new VirtualTreeElement(
             _createSuccessor, _updateSuccessor, _getChildrenSuccessor,
-            items: selection, queue: _r.queue);
-        if (selection.length == 1) {
-          _tree.expand(selection.first);
+            items: selection!, queue: _r.queue);
+        if (selection!.length == 1) {
+          _tree!.expand(selection!.first);
         }
         final text = '';
         report.addAll([
           new DivElement()
             ..classes = ['content-centered-big', 'explanation']
             ..text = text,
-          _tree.element
+          _tree!.element
         ]);
         break;
       case HeapSnapshotTreeMode.predecessors:
         if (selection == null) {
-          selection = List.from(_snapshotA.root.objects);
+          selection = List.from(_snapshotA!.root.objects);
         }
         _tree = new VirtualTreeElement(
             _createPredecessor, _updatePredecessor, _getChildrenPredecessor,
-            items: selection, queue: _r.queue);
-        if (selection.length == 1) {
-          _tree.expand(selection.first);
+            items: selection!, queue: _r.queue);
+        if (selection!.length == 1) {
+          _tree!.expand(selection!.first);
         }
         final text = '';
         report.addAll([
           new DivElement()
             ..classes = ['content-centered-big', 'explanation']
             ..text = text,
-          _tree.element
+          _tree!.element
         ]);
         break;
       case HeapSnapshotTreeMode.classesTable:
-        final items = _snapshotA.classes.toList();
+        final items = _snapshotA!.classes.toList();
         items.sort((a, b) => b.shallowSize - a.shallowSize);
         _tree = new VirtualTreeElement(
             _createClass, _updateClass, _getChildrenClass,
             items: items, queue: _r.queue);
-        report.add(_tree.element);
+        report.add(_tree!.element);
         break;
       case HeapSnapshotTreeMode.classesTableDiff:
-        final items = SnapshotClassDiff.from(_snapshotA, _snapshotB);
+        final items = SnapshotClassDiff.from(_snapshotA!, _snapshotB!);
         items.sort((a, b) => b.shallowSizeB - a.shallowSizeB);
         items.sort((a, b) => b.shallowSizeA - a.shallowSizeA);
         items.sort((a, b) => b.shallowSizeDiff - a.shallowSizeDiff);
         _tree = new VirtualTreeElement(
             _createClassDiff, _updateClassDiff, _getChildrenClassDiff,
             items: items, queue: _r.queue);
-        report.add(_tree.element);
+        report.add(_tree!.element);
         break;
       case HeapSnapshotTreeMode.classesTreeMap:
         _createTreeMap(
-            report, new ClassesShallowTreeMap(this, _snapshotA), null);
+            report, new ClassesShallowTreeMap(this, _snapshotA!), null);
         break;
 
       case HeapSnapshotTreeMode.classesTreeMapDiff:
-        final items = SnapshotClassDiff.from(_snapshotA, _snapshotB);
+        final items = SnapshotClassDiff.from(_snapshotA!, _snapshotB!);
         _createTreeMap(
             report, new ClassesShallowDiffTreeMap(this, items), null);
         break;
@@ -1215,7 +1216,7 @@
 
   static Iterable _getChildrenMergedDominatorDiff(nodeDynamic) {
     MergedDominatorDiff node = nodeDynamic;
-    final list = node.children
+    final list = node.children!
         .where((child) =>
             child.retainedSizeA >= kMinRetainedSize ||
             child.retainedSizeB >= kMinRetainedSize)
@@ -1243,11 +1244,11 @@
   void _updateDominator(HtmlElement element, nodeDynamic, int depth) {
     SnapshotObject node = nodeDynamic;
     element.children[0].text = Utils.formatPercentNormalized(
-        node.retainedSize * 1.0 / _snapshotA.size);
+        node.retainedSize * 1.0 / _snapshotA!.size);
     element.children[1].text = Utils.formatSize(node.retainedSize);
     _updateLines(element.children[2].children, depth);
     if (_getChildrenDominator(node).isNotEmpty) {
-      element.children[3].text = _tree.isExpanded(node) ? '▼' : '►';
+      element.children[3].text = _tree!.isExpanded(node) ? '▼' : '►';
     } else {
       element.children[3].text = '';
     }
@@ -1273,7 +1274,7 @@
     SnapshotObject node = nodeDynamic;
     _updateLines(element.children[0].children, depth);
     if (_getChildrenSuccessor(node).isNotEmpty) {
-      element.children[1].text = _tree.isExpanded(node) ? '▼' : '►';
+      element.children[1].text = _tree!.isExpanded(node) ? '▼' : '►';
     } else {
       element.children[1].text = '';
     }
@@ -1301,7 +1302,7 @@
     SnapshotObject node = nodeDynamic;
     _updateLines(element.children[0].children, depth);
     if (_getChildrenSuccessor(node).isNotEmpty) {
-      element.children[1].text = _tree.isExpanded(node) ? '▼' : '►';
+      element.children[1].text = _tree!.isExpanded(node) ? '▼' : '►';
     } else {
       element.children[1].text = '';
     }
@@ -1328,11 +1329,11 @@
   void _updateMergedDominator(HtmlElement element, nodeDynamic, int depth) {
     SnapshotMergedDominator node = nodeDynamic;
     element.children[0].text = Utils.formatPercentNormalized(
-        node.retainedSize * 1.0 / _snapshotA.size);
+        node.retainedSize * 1.0 / _snapshotA!.size);
     element.children[1].text = Utils.formatSize(node.retainedSize);
     _updateLines(element.children[2].children, depth);
     if (_getChildrenMergedDominator(node).isNotEmpty) {
-      element.children[3].text = _tree.isExpanded(node) ? '▼' : '►';
+      element.children[3].text = _tree!.isExpanded(node) ? '▼' : '►';
     } else {
       element.children[3].text = '';
     }
@@ -1343,10 +1344,10 @@
   void _updateMergedDominatorDiff(HtmlElement element, nodeDynamic, int depth) {
     MergedDominatorDiff node = nodeDynamic;
     element.children[0].text = Utils.formatPercentNormalized(
-        node.retainedSizeA * 1.0 / _snapshotA.size);
+        node.retainedSizeA * 1.0 / _snapshotA!.size);
     element.children[1].text = Utils.formatSize(node.retainedSizeA);
     element.children[2].text = Utils.formatPercentNormalized(
-        node.retainedSizeB * 1.0 / _snapshotB.size);
+        node.retainedSizeB * 1.0 / _snapshotB!.size);
     element.children[3].text = Utils.formatSize(node.retainedSizeB);
     element.children[4].text = (node.retainedSizeDiff > 0 ? '+' : '') +
         Utils.formatSize(node.retainedSizeDiff);
@@ -1354,7 +1355,7 @@
         node.retainedSizeDiff > 0 ? "red" : "green";
     _updateLines(element.children[5].children, depth);
     if (_getChildrenMergedDominatorDiff(node).isNotEmpty) {
-      element.children[6].text = _tree.isExpanded(node) ? '▼' : '►';
+      element.children[6].text = _tree!.isExpanded(node) ? '▼' : '►';
     } else {
       element.children[6].text = '';
     }
@@ -1366,7 +1367,7 @@
   void _updateOwnership(HtmlElement element, nodeDynamic, int depth) {
     SnapshotClass node = nodeDynamic;
     element.children[0].text =
-        Utils.formatPercentNormalized(node.ownedSize * 1.0 / _snapshotA.size);
+        Utils.formatPercentNormalized(node.ownedSize * 1.0 / _snapshotA!.size);
     element.children[1].text = Utils.formatSize(node.ownedSize);
     element.children[2].text = node.name;
   }
@@ -1374,10 +1375,10 @@
   void _updateOwnershipDiff(HtmlElement element, nodeDynamic, int depth) {
     SnapshotClassDiff node = nodeDynamic;
     element.children[0].text =
-        Utils.formatPercentNormalized(node.ownedSizeA * 1.0 / _snapshotA.size);
+        Utils.formatPercentNormalized(node.ownedSizeA * 1.0 / _snapshotA!.size);
     element.children[1].text = Utils.formatSize(node.ownedSizeA);
     element.children[2].text =
-        Utils.formatPercentNormalized(node.ownedSizeB * 1.0 / _snapshotB.size);
+        Utils.formatPercentNormalized(node.ownedSizeB * 1.0 / _snapshotB!.size);
     element.children[3].text = Utils.formatSize(node.ownedSizeB);
     element.children[4].text = (node.ownedSizeDiff > 0 ? "+" : "") +
         Utils.formatSize(node.ownedSizeDiff);
@@ -1387,8 +1388,8 @@
 
   void _updateClass(HtmlElement element, nodeDynamic, int depth) {
     SnapshotClass node = nodeDynamic;
-    element.children[0].text =
-        Utils.formatPercentNormalized(node.shallowSize * 1.0 / _snapshotA.size);
+    element.children[0].text = Utils.formatPercentNormalized(
+        node.shallowSize * 1.0 / _snapshotA!.size);
     element.children[1].text = Utils.formatSize(node.shallowSize);
     element.children[2].text = node.instanceCount.toString();
     element.children[3].text = node.name;
diff --git a/runtime/observatory/lib/src/elements/helpers/any_ref.dart b/runtime/observatory/lib/src/elements/helpers/any_ref.dart
index a6ef2e9..3324eb6 100644
--- a/runtime/observatory/lib/src/elements/helpers/any_ref.dart
+++ b/runtime/observatory/lib/src/elements/helpers/any_ref.dart
@@ -28,7 +28,7 @@
 import 'package:observatory/src/elements/unlinkedcall_ref.dart';
 
 Element anyRef(M.IsolateRef isolate, ref, M.ObjectRepository objects,
-    {RenderingQueue queue, bool expandable: true}) {
+    {RenderingQueue? queue, bool expandable: true}) {
   if (ref == null) {
     return new SpanElement()..text = "???";
   }
diff --git a/runtime/observatory/lib/src/elements/helpers/custom_element.dart b/runtime/observatory/lib/src/elements/helpers/custom_element.dart
index 2af0d6c..b3f93f2 100644
--- a/runtime/observatory/lib/src/elements/helpers/custom_element.dart
+++ b/runtime/observatory/lib/src/elements/helpers/custom_element.dart
@@ -9,14 +9,15 @@
 
 class CustomElement {
   static Expando reverseElements = new Expando();
-  static CustomElement reverse(HtmlElement element) => reverseElements[element];
+  static CustomElement reverse(HtmlElement element) =>
+      reverseElements[element] as CustomElement;
 
   static List<CustomElement> toBeAttached = <CustomElement>[];
   static void drainAttached() {
     // Send 'attached' to elements that have been attached to the document.
     bool fired = false;
     var connectedElements = toBeAttached
-        .where((CustomElement element) => element.element.isConnected)
+        .where((CustomElement element) => element.element.isConnected!)
         .toList();
     for (CustomElement element in connectedElements) {
       toBeAttached.remove(element);
@@ -47,7 +48,7 @@
 
   final HtmlElement element;
   CustomElement.created(String elementClass)
-      : element = document.createElement("shadow") {
+      : element = document.createElement("shadow") as HtmlElement {
     reverseElements[element] = this;
     element.classes = [elementClass];
 
@@ -60,7 +61,7 @@
   void attached() {}
   void detached() {}
 
-  Element get parent => element.parent;
+  Element? get parent => element.parent;
 
   List<Element> get children => element.children;
   set children(List<Element> c) => element.children = c;
@@ -68,11 +69,11 @@
   CssClassSet get classes => element.classes;
   set classes(dynamic c) => element.classes = c;
 
-  String get title => element.title;
-  set title(String t) => element.title = t;
+  String? get title => element.title;
+  set title(String? t) => element.title = t;
 
-  String get text => element.text;
-  set text(String t) => element.text = t;
+  String? get text => element.text;
+  set text(String? t) => element.text = t;
 
   CssStyleDeclaration get style => element.style;
 
diff --git a/runtime/observatory/lib/src/elements/helpers/nav_bar.dart b/runtime/observatory/lib/src/elements/helpers/nav_bar.dart
index 050041b..fac7f84 100644
--- a/runtime/observatory/lib/src/elements/helpers/nav_bar.dart
+++ b/runtime/observatory/lib/src/elements/helpers/nav_bar.dart
@@ -4,7 +4,7 @@
 
 import 'dart:html';
 
-Element navBar(Iterable<Element> content) {
+Element navBar(List<Element> content) {
   assert(content != null);
   return document.createElement('nav')
     ..classes = ['nav-bar']
diff --git a/runtime/observatory/lib/src/elements/helpers/nav_menu.dart b/runtime/observatory/lib/src/elements/helpers/nav_menu.dart
index 02cf8ef..5a79190 100644
--- a/runtime/observatory/lib/src/elements/helpers/nav_menu.dart
+++ b/runtime/observatory/lib/src/elements/helpers/nav_menu.dart
@@ -4,7 +4,7 @@
 
 import 'dart:html';
 
-navMenu(String label, {String link, Iterable<Element> content: const []}) {
+navMenu(String label, {String? link, List<Element> content: const []}) {
   assert(label != null);
   assert(content != null);
   return new LIElement()
diff --git a/runtime/observatory/lib/src/elements/helpers/rendering_scheduler.dart b/runtime/observatory/lib/src/elements/helpers/rendering_scheduler.dart
index 5d9706e..e179642 100644
--- a/runtime/observatory/lib/src/elements/helpers/rendering_scheduler.dart
+++ b/runtime/observatory/lib/src/elements/helpers/rendering_scheduler.dart
@@ -54,7 +54,7 @@
 
   /// Creates a new scheduler for an element.
   /// If no queue is provided it will create a new default configured queue.
-  factory RenderingScheduler(T element, {RenderingQueue queue}) {
+  factory RenderingScheduler(T element, {RenderingQueue? queue}) {
     assert(element != null);
     if (queue == null) {
       queue = new RenderingQueue();
diff --git a/runtime/observatory/lib/src/elements/helpers/uris.dart b/runtime/observatory/lib/src/elements/helpers/uris.dart
index 4e53b95..370e852 100644
--- a/runtime/observatory/lib/src/elements/helpers/uris.dart
+++ b/runtime/observatory/lib/src/elements/helpers/uris.dart
@@ -7,7 +7,7 @@
 /// Utility class for URIs generation.
 abstract class Uris {
   static String _isolatePage(String path, M.IsolateRef isolate,
-      {M.ObjectRef object}) {
+      {M.ObjectRef? object}) {
     final parameters = {'isolateId': isolate.id};
     if (object != null) parameters['objectId'] = object.id;
     return '#' + new Uri(path: path, queryParameters: parameters).toString();
@@ -28,7 +28,7 @@
       _isolatePage('/heap-map', isolate);
   static String heapSnapshot(M.IsolateRef isolate) =>
       _isolatePage('/heap-snapshot', isolate);
-  static String inspect(M.IsolateRef isolate, {M.ObjectRef object, int pos}) {
+  static String inspect(M.IsolateRef isolate, {M.ObjectRef? object, int? pos}) {
     if (pos == null) {
       return _isolatePage('/inspect', isolate, object: object);
     }
diff --git a/runtime/observatory/lib/src/elements/icdata_ref.dart b/runtime/observatory/lib/src/elements/icdata_ref.dart
index 43883f5..435c636 100644
--- a/runtime/observatory/lib/src/elements/icdata_ref.dart
+++ b/runtime/observatory/lib/src/elements/icdata_ref.dart
@@ -10,18 +10,18 @@
 import 'package:observatory/src/elements/helpers/uris.dart';
 
 class ICDataRefElement extends CustomElement implements Renderable {
-  RenderingScheduler<ICDataRefElement> _r;
+  late RenderingScheduler<ICDataRefElement> _r;
 
   Stream<RenderedEvent<ICDataRefElement>> get onRendered => _r.onRendered;
 
-  M.IsolateRef _isolate;
-  M.ICDataRef _icdata;
+  late M.IsolateRef _isolate;
+  late M.ICDataRef _icdata;
 
   M.IsolateRef get isolate => _isolate;
   M.ICDataRef get icdata => _icdata;
 
   factory ICDataRefElement(M.IsolateRef isolate, M.ICDataRef icdata,
-      {RenderingQueue queue}) {
+      {RenderingQueue? queue}) {
     assert(isolate != null);
     assert(icdata != null);
     ICDataRefElement e = new ICDataRefElement.created();
diff --git a/runtime/observatory/lib/src/elements/icdata_view.dart b/runtime/observatory/lib/src/elements/icdata_view.dart
index ea5090e..90a0a3e 100644
--- a/runtime/observatory/lib/src/elements/icdata_view.dart
+++ b/runtime/observatory/lib/src/elements/icdata_view.dart
@@ -20,21 +20,21 @@
 import 'package:observatory/src/elements/view_footer.dart';
 
 class ICDataViewElement extends CustomElement implements Renderable {
-  RenderingScheduler<ICDataViewElement> _r;
+  late RenderingScheduler<ICDataViewElement> _r;
 
   Stream<RenderedEvent<ICDataViewElement>> get onRendered => _r.onRendered;
 
-  M.VM _vm;
-  M.IsolateRef _isolate;
-  M.EventRepository _events;
-  M.NotificationRepository _notifications;
-  M.ICData _icdata;
-  M.ICDataRepository _icdatas;
-  M.RetainedSizeRepository _retainedSizes;
-  M.ReachableSizeRepository _reachableSizes;
-  M.InboundReferencesRepository _references;
-  M.RetainingPathRepository _retainingPaths;
-  M.ObjectRepository _objects;
+  late M.VM _vm;
+  late M.IsolateRef _isolate;
+  late M.EventRepository _events;
+  late M.NotificationRepository _notifications;
+  late M.ICData _icdata;
+  late M.ICDataRepository _icdatas;
+  late M.RetainedSizeRepository _retainedSizes;
+  late M.ReachableSizeRepository _reachableSizes;
+  late M.InboundReferencesRepository _references;
+  late M.RetainingPathRepository _retainingPaths;
+  late M.ObjectRepository _objects;
 
   M.VMRef get vm => _vm;
   M.IsolateRef get isolate => _isolate;
@@ -53,7 +53,7 @@
       M.InboundReferencesRepository references,
       M.RetainingPathRepository retainingPaths,
       M.ObjectRepository objects,
-      {RenderingQueue queue}) {
+      {RenderingQueue? queue}) {
     assert(vm != null);
     assert(isolate != null);
     assert(events != null);
@@ -106,7 +106,7 @@
         (new NavRefreshElement(queue: _r.queue)
               ..onRefresh.listen((e) async {
                 e.element.disabled = true;
-                _icdata = await _icdatas.get(_isolate, _icdata.id);
+                _icdata = await _icdatas.get(_isolate, _icdata.id!);
                 _r.dirty();
               }))
             .element,
diff --git a/runtime/observatory/lib/src/elements/inbound_references.dart b/runtime/observatory/lib/src/elements/inbound_references.dart
index 47643fc..db22f02 100644
--- a/runtime/observatory/lib/src/elements/inbound_references.dart
+++ b/runtime/observatory/lib/src/elements/inbound_references.dart
@@ -12,16 +12,16 @@
 import 'package:observatory/src/elements/helpers/custom_element.dart';
 
 class InboundReferencesElement extends CustomElement implements Renderable {
-  RenderingScheduler<InboundReferencesElement> _r;
+  late RenderingScheduler<InboundReferencesElement> _r;
 
   Stream<RenderedEvent<InboundReferencesElement>> get onRendered =>
       _r.onRendered;
 
-  M.IsolateRef _isolate;
-  M.ObjectRef _object;
-  M.InboundReferencesRepository _references;
-  M.ObjectRepository _objects;
-  M.InboundReferences _inbounds;
+  late M.IsolateRef _isolate;
+  late M.ObjectRef _object;
+  late M.InboundReferencesRepository _references;
+  late M.ObjectRepository _objects;
+  M.InboundReferences? _inbounds;
   bool _expanded = false;
 
   M.IsolateRef get isolate => _isolate;
@@ -29,7 +29,7 @@
 
   factory InboundReferencesElement(M.IsolateRef isolate, M.ObjectRef object,
       M.InboundReferencesRepository references, M.ObjectRepository objects,
-      {RenderingQueue queue}) {
+      {RenderingQueue? queue}) {
     assert(isolate != null);
     assert(object != null);
     assert(references != null);
@@ -75,7 +75,7 @@
   }
 
   Future _refresh() async {
-    _inbounds = await _references.get(_isolate, _object.id);
+    _inbounds = await _references.get(_isolate, _object.id!);
     _r.dirty();
   }
 
@@ -83,7 +83,7 @@
     if (_inbounds == null) {
       return const [];
     }
-    return _inbounds.elements.map<Element>(_createItem).toList();
+    return _inbounds!.elements.map<Element>(_createItem).toList();
   }
 
   Element _createItem(M.InboundReference reference) {
diff --git a/runtime/observatory/lib/src/elements/instance_ref.dart b/runtime/observatory/lib/src/elements/instance_ref.dart
index 708fcde..d92d2b9 100644
--- a/runtime/observatory/lib/src/elements/instance_ref.dart
+++ b/runtime/observatory/lib/src/elements/instance_ref.dart
@@ -14,23 +14,23 @@
 import 'package:observatory/utils.dart';
 
 class InstanceRefElement extends CustomElement implements Renderable {
-  RenderingScheduler<InstanceRefElement> _r;
+  late RenderingScheduler<InstanceRefElement> _r;
 
   Stream<RenderedEvent<InstanceRefElement>> get onRendered => _r.onRendered;
 
-  M.IsolateRef _isolate;
-  M.InstanceRef _instance;
-  M.ObjectRepository _objects;
-  M.Instance _loadedInstance;
-  bool _expandable;
-  bool _expanded = false;
+  late M.IsolateRef _isolate;
+  late M.InstanceRef _instance;
+  late M.ObjectRepository _objects;
+  M.Instance? _loadedInstance;
+  late bool _expandable;
+  late bool _expanded = false;
 
   M.IsolateRef get isolate => _isolate;
   M.InstanceRef get instance => _instance;
 
   factory InstanceRefElement(
       M.IsolateRef isolate, M.InstanceRef instance, M.ObjectRepository objects,
-      {RenderingQueue queue, bool expandable: true}) {
+      {RenderingQueue? queue, bool expandable: true}) {
     assert(isolate != null);
     assert(instance != null);
     assert(objects != null);
@@ -86,19 +86,20 @@
   }
 
   Future _refresh() async {
-    _loadedInstance = await _objects.get(_isolate, _instance.id);
+    _loadedInstance = await _objects.get(_isolate, _instance.id!) as M.Instance;
     _r.dirty();
   }
 
   List<Element> _createShowMoreButton() {
-    if (_loadedInstance.count == null) {
+    if (_loadedInstance!.count == null) {
       return [];
     }
-    final count = _loadedInstance.count;
+    final count = _loadedInstance!.count;
     final button = new ButtonElement()..text = 'show next ${count}';
     button.onClick.listen((_) async {
       button.disabled = true;
-      _loadedInstance = await _objects.get(_isolate, _instance.id);
+      _loadedInstance =
+          await _objects.get(_isolate, _instance.id!) as M.Instance;
       _r.dirty();
     });
     return [button];
@@ -121,7 +122,7 @@
         return [
           new AnchorElement(href: Uris.inspect(_isolate, object: _instance))
             ..text = Utils.formatStringAsLiteral(
-                _instance.valueAsString, _instance.valueAsStringIsTruncated)
+                _instance.valueAsString!, _instance.valueAsStringIsTruncated!)
         ];
       case M.InstanceKind.type:
       case M.InstanceKind.typeRef:
@@ -137,7 +138,7 @@
               new SpanElement()
                 ..classes = ['emphasize']
                 ..text = 'Closure',
-              new SpanElement()..text = ' (${_instance.closureFunction.name})'
+              new SpanElement()..text = ' (${_instance.closureFunction!.name})'
             ]
         ];
       case M.InstanceKind.regExp:
@@ -146,8 +147,8 @@
             ..children = <Element>[
               new SpanElement()
                 ..classes = ['emphasize']
-                ..text = _instance.clazz.name,
-              new SpanElement()..text = ' (${_instance.pattern.valueAsString})'
+                ..text = _instance.clazz!.name,
+              new SpanElement()..text = ' (${_instance.pattern!.valueAsString})'
             ]
         ];
       case M.InstanceKind.stackTrace:
@@ -156,14 +157,14 @@
             ..children = <Element>[
               new SpanElement()
                 ..classes = ['emphasize']
-                ..text = _instance.clazz.name,
+                ..text = _instance.clazz!.name,
             ]
         ];
       case M.InstanceKind.plainInstance:
         return [
           new AnchorElement(href: Uris.inspect(_isolate, object: _instance))
             ..classes = ['emphasize']
-            ..text = _instance.clazz.name
+            ..text = _instance.clazz!.name
         ];
       case M.InstanceKind.list:
       case M.InstanceKind.map:
@@ -186,7 +187,7 @@
             ..children = <Element>[
               new SpanElement()
                 ..classes = ['emphasize']
-                ..text = _instance.clazz.name,
+                ..text = _instance.clazz!.name,
               new SpanElement()..text = ' (${_instance.length})'
             ]
         ];
@@ -194,13 +195,13 @@
         return [
           new AnchorElement(href: Uris.inspect(_isolate, object: _instance))
             ..classes = ['emphasize']
-            ..text = _instance.clazz.name
+            ..text = _instance.clazz!.name
         ];
       case M.InstanceKind.weakProperty:
         return [
           new AnchorElement(href: Uris.inspect(_isolate, object: _instance))
             ..classes = ['emphasize']
-            ..text = _instance.clazz.name
+            ..text = _instance.clazz!.name
         ];
     }
     throw new Exception('Unknown InstanceKind: ${_instance.kind}');
@@ -230,7 +231,7 @@
       case M.InstanceKind.int32x4List:
       case M.InstanceKind.float32x4List:
       case M.InstanceKind.float64x2List:
-        return _instance.length > 0;
+        return _instance.length! > 0;
       default:
         return false;
     }
@@ -244,29 +245,30 @@
       case M.InstanceKind.closure:
         {
           var members = <Element>[];
-          if (_loadedInstance.closureFunction != null) {
+          if (_loadedInstance!.closureFunction != null) {
             members.add(new DivElement()
               ..children = <Element>[
                 new SpanElement()..text = 'function = ',
-                anyRef(_isolate, _loadedInstance.closureFunction, _objects,
+                anyRef(_isolate, _loadedInstance!.closureFunction, _objects,
                     queue: _r.queue)
               ]);
           }
-          if (_loadedInstance.closureContext != null) {
+          if (_loadedInstance!.closureContext != null) {
             members.add(new DivElement()
               ..children = <Element>[
                 new SpanElement()..text = 'context = ',
-                anyRef(_isolate, _loadedInstance.closureContext, _objects,
+                anyRef(_isolate, _loadedInstance!.closureContext, _objects,
                     queue: _r.queue)
               ]);
           }
           return members;
         }
       case M.InstanceKind.plainInstance:
-        return _loadedInstance.fields
+        return _loadedInstance!.fields!
             .map<Element>((f) => new DivElement()
               ..children = <Element>[
-                new FieldRefElement(_isolate, f.decl, _objects, queue: _r.queue)
+                new FieldRefElement(_isolate, f.decl!, _objects,
+                        queue: _r.queue)
                     .element,
                 new SpanElement()..text = ' = ',
                 anyRef(_isolate, f.value, _objects, queue: _r.queue)
@@ -274,7 +276,7 @@
             .toList();
       case M.InstanceKind.list:
         var index = 0;
-        return _loadedInstance.elements
+        return _loadedInstance!.elements!
             .map<Element>((element) => new DivElement()
               ..children = <Element>[
                 new SpanElement()..text = '[ ${index++} ] : ',
@@ -283,7 +285,7 @@
             .toList()
               ..addAll(_createShowMoreButton());
       case M.InstanceKind.map:
-        return _loadedInstance.associations
+        return _loadedInstance!.associations!
             .map<Element>((association) => new DivElement()
               ..children = <Element>[
                 new SpanElement()..text = '[ ',
@@ -308,14 +310,14 @@
       case M.InstanceKind.float32x4List:
       case M.InstanceKind.float64x2List:
         var index = 0;
-        return _loadedInstance.typedElements
+        return _loadedInstance!.typedElements!
             .map<Element>((e) => new DivElement()..text = '[ ${index++} ] : $e')
             .toList()
               ..addAll(_createShowMoreButton());
       case M.InstanceKind.mirrorReference:
         return [
           new SpanElement()..text = '<referent> : ',
-          anyRef(_isolate, _loadedInstance.referent, _objects, queue: _r.queue)
+          anyRef(_isolate, _loadedInstance!.referent, _objects, queue: _r.queue)
         ];
       case M.InstanceKind.stackTrace:
         return [
@@ -326,12 +328,12 @@
       case M.InstanceKind.weakProperty:
         return [
           new SpanElement()..text = '<key> : ',
-          new InstanceRefElement(_isolate, _loadedInstance.key, _objects,
+          new InstanceRefElement(_isolate, _loadedInstance!.key!, _objects,
                   queue: _r.queue)
               .element,
           new BRElement(),
           new SpanElement()..text = '<value> : ',
-          new InstanceRefElement(_isolate, _loadedInstance.value, _objects,
+          new InstanceRefElement(_isolate, _loadedInstance!.value!, _objects,
                   queue: _r.queue)
               .element,
         ];
diff --git a/runtime/observatory/lib/src/elements/instance_view.dart b/runtime/observatory/lib/src/elements/instance_view.dart
index de780cb..ca36d45 100644
--- a/runtime/observatory/lib/src/elements/instance_view.dart
+++ b/runtime/observatory/lib/src/elements/instance_view.dart
@@ -33,29 +33,29 @@
 import 'package:observatory/utils.dart';
 
 class InstanceViewElement extends CustomElement implements Renderable {
-  RenderingScheduler<InstanceViewElement> _r;
+  late RenderingScheduler<InstanceViewElement> _r;
 
   Stream<RenderedEvent<InstanceViewElement>> get onRendered => _r.onRendered;
 
-  M.VM _vm;
-  M.IsolateRef _isolate;
-  M.EventRepository _events;
-  M.NotificationRepository _notifications;
-  M.Instance _instance;
-  M.LibraryRef _library;
-  M.ObjectRepository _objects;
-  M.ClassRepository _classes;
-  M.RetainedSizeRepository _retainedSizes;
-  M.ReachableSizeRepository _reachableSizes;
-  M.InboundReferencesRepository _references;
-  M.RetainingPathRepository _retainingPaths;
-  M.ScriptRepository _scripts;
-  M.EvalRepository _eval;
-  M.TypeArguments _typeArguments;
-  M.TypeArgumentsRepository _arguments;
-  M.BreakpointRepository _breakpoints;
-  M.FunctionRepository _functions;
-  M.SourceLocation _location;
+  late M.VM _vm;
+  late M.IsolateRef _isolate;
+  late M.EventRepository _events;
+  late M.NotificationRepository _notifications;
+  late M.Instance _instance;
+  M.LibraryRef? _library;
+  late M.ObjectRepository _objects;
+  late M.ClassRepository _classes;
+  late M.RetainedSizeRepository _retainedSizes;
+  late M.ReachableSizeRepository _reachableSizes;
+  late M.InboundReferencesRepository _references;
+  late M.RetainingPathRepository _retainingPaths;
+  late M.ScriptRepository _scripts;
+  late M.EvalRepository _eval;
+  M.TypeArguments? _typeArguments;
+  late M.TypeArgumentsRepository _arguments;
+  late M.BreakpointRepository _breakpoints;
+  late M.FunctionRepository _functions;
+  M.SourceLocation? _location;
 
   M.VMRef get vm => _vm;
   M.IsolateRef get isolate => _isolate;
@@ -79,7 +79,7 @@
       M.TypeArgumentsRepository arguments,
       M.BreakpointRepository breakpoints,
       M.FunctionRepository functions,
-      {RenderingQueue queue}) {
+      {RenderingQueue? queue}) {
     assert(vm != null);
     assert(isolate != null);
     assert(events != null);
@@ -138,7 +138,7 @@
       new HeadingElement.h2()
         ..text = M.isAbstractType(_instance.kind)
             ? 'type ${_instance.name}'
-            : 'instance of ${_instance.clazz.name}',
+            : 'instance of ${_instance.clazz!.name}',
       new HRElement(),
       new ObjectCommonElement(_isolate, _instance, _retainedSizes,
               _reachableSizes, _references, _retainingPaths, _objects,
@@ -157,7 +157,8 @@
     if (_location != null) {
       content.addAll([
         new HRElement(),
-        new SourceInsetElement(_isolate, _location, _scripts, _objects, _events,
+        new SourceInsetElement(
+                _isolate, _location!, _scripts, _objects, _events,
                 queue: _r.queue)
             .element
       ]);
@@ -179,11 +180,11 @@
       new NavIsolateMenuElement(_isolate, _events, queue: _r.queue).element
     ];
     if (_library != null) {
-      menu.add(new NavLibraryMenuElement(_isolate, _library, queue: _r.queue)
+      menu.add(new NavLibraryMenuElement(_isolate, _library!, queue: _r.queue)
           .element);
     }
     menu.addAll(<Element>[
-      new NavClassMenuElement(_isolate, _instance.clazz, queue: _r.queue)
+      new NavClassMenuElement(_isolate, _instance.clazz!, queue: _r.queue)
           .element,
       navMenu('instance'),
       (new NavRefreshElement(queue: _r.queue)
@@ -224,8 +225,8 @@
       if (_instance.kind == M.InstanceKind.string) {
         members.add(member(
             'value as literal',
-            Utils.formatStringAsLiteral(
-                _instance.valueAsString, _instance.valueAsStringIsTruncated)));
+            Utils.formatStringAsLiteral(_instance.valueAsString!,
+                _instance.valueAsStringIsTruncated!)));
       } else {
         members.add(member('value', _instance.valueAsString));
       }
@@ -233,7 +234,7 @@
     if (_instance.typeClass != null) {
       members.add(member('type class', _instance.typeClass));
     }
-    if (_typeArguments != null && _typeArguments.types.isNotEmpty) {
+    if (_typeArguments != null && _typeArguments!.types!.isNotEmpty) {
       members.add(new DivElement()
         ..classes = ['memberItem']
         ..children = <Element>[
@@ -243,7 +244,7 @@
           new DivElement()
             ..classes = ['memberValue']
             ..children = ([new SpanElement()..text = '< ']
-              ..addAll(_typeArguments.types.expand((type) => [
+              ..addAll(_typeArguments!.types!.expand((type) => [
                     new InstanceRefElement(_isolate, type, _objects,
                             queue: _r.queue)
                         .element,
@@ -272,7 +273,7 @@
       members.add(member('closure context', _instance.closureContext));
     }
     if (_instance.kind == M.InstanceKind.closure) {
-      ButtonElement btn;
+      late ButtonElement btn;
       members.add(new DivElement()
         ..classes = ['memberItem']
         ..children = <Element>[
@@ -294,24 +295,24 @@
         ]);
     }
 
-    if (_instance.nativeFields != null && _instance.nativeFields.isNotEmpty) {
+    if (_instance.nativeFields != null && _instance.nativeFields!.isNotEmpty) {
       int i = 0;
       members.add(new DivElement()
         ..classes = ['memberItem']
         ..children = <Element>[
           new DivElement()
             ..classes = ['memberName']
-            ..text = 'native fields (${_instance.nativeFields.length})',
+            ..text = 'native fields (${_instance.nativeFields!.length})',
           new DivElement()
             ..classes = ['memberName']
             ..children = <Element>[
               (new CurlyBlockElement(
-                      expanded: _instance.nativeFields.length <= 100,
+                      expanded: _instance.nativeFields!.length <= 100,
                       queue: _r.queue)
                     ..content = <Element>[
                       new DivElement()
                         ..classes = ['memberList']
-                        ..children = _instance.nativeFields
+                        ..children = _instance.nativeFields!
                             .map<Element>(
                                 (f) => member('[ ${i++} ]', '[ ${f.value} ]'))
                             .toList()
@@ -321,8 +322,8 @@
         ]);
     }
 
-    if (_instance.fields != null && _instance.fields.isNotEmpty) {
-      final fields = _instance.fields.toList();
+    if (_instance.fields != null && _instance.fields!.isNotEmpty) {
+      final fields = _instance.fields!.toList();
       members.add(new DivElement()
         ..classes = ['memberItem']
         ..children = <Element>[
@@ -346,8 +347,8 @@
         ]);
     }
 
-    if (_instance.elements != null && _instance.elements.isNotEmpty) {
-      final elements = _instance.elements.toList();
+    if (_instance.elements != null && _instance.elements!.isNotEmpty) {
+      final elements = _instance.elements!.toList();
       int i = 0;
       members.add(new DivElement()
         ..classes = ['memberItem']
@@ -373,12 +374,12 @@
         ]);
       if (_instance.length != elements.length) {
         members.add(member(
-            '...', '${_instance.length - elements.length} omitted elements'));
+            '...', '${_instance.length! - elements.length} omitted elements'));
       }
     }
 
-    if (_instance.associations != null && _instance.associations.isNotEmpty) {
-      final associations = _instance.associations.toList();
+    if (_instance.associations != null && _instance.associations!.isNotEmpty) {
+      final associations = _instance.associations!.toList();
       members.add(new DivElement()
         ..classes = ['memberItem']
         ..children = <Element>[
@@ -419,12 +420,13 @@
         ]);
       if (_instance.length != associations.length) {
         members.add(member('...',
-            '${_instance.length - associations.length} omitted elements'));
+            '${_instance.length! - associations.length} omitted elements'));
       }
     }
 
-    if (_instance.typedElements != null && _instance.typedElements.isNotEmpty) {
-      final typedElements = _instance.typedElements.toList();
+    if (_instance.typedElements != null &&
+        _instance.typedElements!.isNotEmpty) {
+      final typedElements = _instance.typedElements!.toList();
       int i = 0;
       members.add(new DivElement()
         ..classes = ['memberItem']
@@ -449,15 +451,15 @@
         ]);
       if (_instance.length != typedElements.length) {
         members.add(member('...',
-            '${_instance.length - typedElements.length} omitted elements'));
+            '${_instance.length! - typedElements.length} omitted elements'));
       }
     }
 
     if (_instance.kind == M.InstanceKind.regExp) {
       members.add(member('pattern', _instance.pattern));
       members.add(
-          member('isCaseSensitive', _instance.isCaseSensitive ? 'yes' : 'no'));
-      members.add(member('isMultiLine', _instance.isMultiLine ? 'yes' : 'no'));
+          member('isCaseSensitive', _instance.isCaseSensitive! ? 'yes' : 'no'));
+      members.add(member('isMultiLine', _instance.isMultiLine! ? 'yes' : 'no'));
       if (_instance.oneByteFunction != null) {
         members.add(member('oneByteFunction', _instance.oneByteFunction));
       }
@@ -493,25 +495,26 @@
   }
 
   Future _refresh() async {
-    _instance = await _objects.get(_isolate, _instance.id);
+    _instance = await _objects.get(_isolate, _instance.id!) as M.Instance;
     await _loadExtraData();
     _r.dirty();
   }
 
   Future _loadExtraData() async {
-    _library = (await _classes.get(_isolate, _instance.clazz.id)).library;
+    _library = (await _classes.get(_isolate, _instance.clazz!.id!)).library!;
     if (_instance.typeArguments != null) {
       _typeArguments =
-          await _arguments.get(_isolate, _instance.typeArguments.id);
+          await _arguments.get(_isolate, _instance.typeArguments!.id!);
     } else {
       _typeArguments = null;
     }
     if (_instance.closureFunction != null) {
-      _location = (await _functions.get(_isolate, _instance.closureFunction.id))
-          .location;
+      _location =
+          (await _functions.get(_isolate, _instance.closureFunction!.id!))
+              .location;
     } else if (_instance.typeClass != null) {
       _location =
-          (await _classes.get(_isolate, _instance.typeClass.id)).location;
+          (await _classes.get(_isolate, _instance.typeClass!.id!)).location;
     }
     _r.dirty();
   }
@@ -520,7 +523,7 @@
     if (_instance.activationBreakpoint == null) {
       await _breakpoints.addOnActivation(_isolate, _instance);
     } else {
-      await _breakpoints.remove(_isolate, _instance.activationBreakpoint);
+      await _breakpoints.remove(_isolate, _instance.activationBreakpoint!);
     }
     await _refresh();
   }
diff --git a/runtime/observatory/lib/src/elements/isolate/counter_chart.dart b/runtime/observatory/lib/src/elements/isolate/counter_chart.dart
index 4d25105..095db10 100644
--- a/runtime/observatory/lib/src/elements/isolate/counter_chart.dart
+++ b/runtime/observatory/lib/src/elements/isolate/counter_chart.dart
@@ -8,15 +8,15 @@
 import 'package:observatory/src/elements/helpers/custom_element.dart';
 
 class IsolateCounterChartElement extends CustomElement implements Renderable {
-  RenderingScheduler<IsolateCounterChartElement> _r;
+  late RenderingScheduler<IsolateCounterChartElement> _r;
 
   Stream<RenderedEvent<IsolateCounterChartElement>> get onRendered =>
       _r.onRendered;
 
-  Map _counters;
-  StreamSubscription _subscription;
+  late Map _counters;
+  late StreamSubscription _subscription;
 
-  factory IsolateCounterChartElement(Map counters, {RenderingQueue queue}) {
+  factory IsolateCounterChartElement(Map counters, {RenderingQueue? queue}) {
     assert(counters != null);
     IsolateCounterChartElement e = new IsolateCounterChartElement.created();
     e._r = new RenderingScheduler<IsolateCounterChartElement>(e, queue: queue);
diff --git a/runtime/observatory/lib/src/elements/isolate/location.dart b/runtime/observatory/lib/src/elements/isolate/location.dart
index 5aa7f89..7dce5c9 100644
--- a/runtime/observatory/lib/src/elements/isolate/location.dart
+++ b/runtime/observatory/lib/src/elements/isolate/location.dart
@@ -11,19 +11,19 @@
 import 'package:observatory/src/elements/source_link.dart';
 
 class IsolateLocationElement extends CustomElement implements Renderable {
-  RenderingScheduler<IsolateLocationElement> _r;
+  late RenderingScheduler<IsolateLocationElement> _r;
 
   Stream<RenderedEvent<IsolateLocationElement>> get onRendered => _r.onRendered;
 
-  M.Isolate _isolate;
-  M.EventRepository _events;
-  M.ScriptRepository _scripts;
-  StreamSubscription _debugSubscription;
-  StreamSubscription _isolateSubscription;
+  late M.Isolate _isolate;
+  late M.EventRepository _events;
+  late M.ScriptRepository _scripts;
+  late StreamSubscription _debugSubscription;
+  late StreamSubscription _isolateSubscription;
 
   factory IsolateLocationElement(
       M.Isolate isolate, M.EventRepository events, M.ScriptRepository scripts,
-      {RenderingQueue queue}) {
+      {RenderingQueue? queue}) {
     assert(isolate != null);
     assert(events != null);
     assert(scripts != null);
@@ -63,12 +63,12 @@
         children = <Element>[
           new SpanElement()..text = 'at ',
           new FunctionRefElement(
-                  _isolate, M.topFrame(_isolate.pauseEvent).function,
+                  _isolate, M.topFrame(_isolate.pauseEvent)!.function!,
                   queue: _r.queue)
               .element,
           new SpanElement()..text = ' (',
-          new SourceLinkElement(
-                  _isolate, M.topFrame(_isolate.pauseEvent).location, _scripts,
+          new SourceLinkElement(_isolate,
+                  M.topFrame(_isolate.pauseEvent)!.location!, _scripts,
                   queue: _r.queue)
               .element,
           new SpanElement()..text = ') '
@@ -92,12 +92,12 @@
             content.addAll([
               new SpanElement()..text = ' at ',
               new FunctionRefElement(
-                      _isolate, M.topFrame(_isolate.pauseEvent).function,
+                      _isolate, M.topFrame(_isolate.pauseEvent)!.function!,
                       queue: _r.queue)
                   .element,
               new SpanElement()..text = ' (',
               new SourceLinkElement(_isolate,
-                      M.topFrame(_isolate.pauseEvent).location, _scripts,
+                      M.topFrame(_isolate.pauseEvent)!.location!, _scripts,
                       queue: _r.queue)
                   .element,
               new SpanElement()..text = ') '
diff --git a/runtime/observatory/lib/src/elements/isolate/run_state.dart b/runtime/observatory/lib/src/elements/isolate/run_state.dart
index 3576a4b..e1b6c13 100644
--- a/runtime/observatory/lib/src/elements/isolate/run_state.dart
+++ b/runtime/observatory/lib/src/elements/isolate/run_state.dart
@@ -9,17 +9,17 @@
 import 'package:observatory/src/elements/helpers/custom_element.dart';
 
 class IsolateRunStateElement extends CustomElement implements Renderable {
-  RenderingScheduler<IsolateRunStateElement> _r;
+  late RenderingScheduler<IsolateRunStateElement> _r;
 
   Stream<RenderedEvent<IsolateRunStateElement>> get onRendered => _r.onRendered;
 
-  M.Isolate _isolate;
-  M.EventRepository _events;
-  StreamSubscription _debugSubscription;
-  StreamSubscription _isolateSubscription;
+  late M.Isolate _isolate;
+  late M.EventRepository _events;
+  late StreamSubscription _debugSubscription;
+  late StreamSubscription _isolateSubscription;
 
   factory IsolateRunStateElement(M.Isolate isolate, M.EventRepository events,
-      {RenderingQueue queue}) {
+      {RenderingQueue? queue}) {
     assert(isolate != null);
     assert(events != null);
     IsolateRunStateElement e = new IsolateRunStateElement.created();
@@ -62,7 +62,7 @@
       case M.IsolateStatus.paused:
         children = <Element>[
           new SpanElement()
-            ..title = '${_isolate.pauseEvent.timestamp}'
+            ..title = '${_isolate.pauseEvent!.timestamp}'
             ..text = 'paused '
         ];
         break;
diff --git a/runtime/observatory/lib/src/elements/isolate/shared_summary.dart b/runtime/observatory/lib/src/elements/isolate/shared_summary.dart
index 7823a1d..36a3e54 100644
--- a/runtime/observatory/lib/src/elements/isolate/shared_summary.dart
+++ b/runtime/observatory/lib/src/elements/isolate/shared_summary.dart
@@ -12,18 +12,18 @@
 import 'package:observatory/src/elements/isolate/counter_chart.dart';
 
 class IsolateSharedSummaryElement extends CustomElement implements Renderable {
-  RenderingScheduler<IsolateSharedSummaryElement> _r;
+  late RenderingScheduler<IsolateSharedSummaryElement> _r;
 
   Stream<RenderedEvent<IsolateSharedSummaryElement>> get onRendered =>
       _r.onRendered;
 
-  M.Isolate _isolate;
-  M.EventRepository _events;
-  StreamSubscription _isolateSubscription;
+  late M.Isolate _isolate;
+  late M.EventRepository _events;
+  late StreamSubscription _isolateSubscription;
 
   factory IsolateSharedSummaryElement(
       M.Isolate isolate, M.EventRepository events,
-      {RenderingQueue queue}) {
+      {RenderingQueue? queue}) {
     assert(isolate != null);
     assert(events != null);
     IsolateSharedSummaryElement e = new IsolateSharedSummaryElement.created();
@@ -52,10 +52,10 @@
   }
 
   void render() {
-    final newHeapUsed = Utils.formatSize(_isolate.newSpace.used);
-    final newHeapCapacity = Utils.formatSize(_isolate.newSpace.capacity);
-    final oldHeapUsed = Utils.formatSize(_isolate.oldSpace.used);
-    final oldHeapCapacity = Utils.formatSize(_isolate.oldSpace.capacity);
+    final newHeapUsed = Utils.formatSize(_isolate.newSpace!.used);
+    final newHeapCapacity = Utils.formatSize(_isolate.newSpace!.capacity);
+    final oldHeapUsed = Utils.formatSize(_isolate.oldSpace!.used);
+    final oldHeapCapacity = Utils.formatSize(_isolate.oldSpace!.capacity);
     final content = <Element>[
       new DivElement()
         ..classes = ['menu']
@@ -148,13 +148,14 @@
               new AnchorElement(href: Uris.logging(_isolate))..text = 'logging'
             ]
         ],
-      new IsolateCounterChartElement(_isolate.counters, queue: _r.queue).element
+      new IsolateCounterChartElement(_isolate.counters!, queue: _r.queue)
+          .element
     ];
     if (_isolate.error != null) {
       children = <Element>[
         new PreElement()
           ..classes = ['errorBox']
-          ..text = _isolate.error.message,
+          ..text = _isolate.error!.message,
         new DivElement()
           ..classes = ['summary']
           ..children = content
diff --git a/runtime/observatory/lib/src/elements/isolate/summary.dart b/runtime/observatory/lib/src/elements/isolate/summary.dart
index 78eb1f8..00cf8f0 100644
--- a/runtime/observatory/lib/src/elements/isolate/summary.dart
+++ b/runtime/observatory/lib/src/elements/isolate/summary.dart
@@ -15,22 +15,22 @@
 import 'package:observatory/src/elements/isolate/shared_summary.dart';
 
 class IsolateSummaryElement extends CustomElement implements Renderable {
-  RenderingScheduler<IsolateSummaryElement> _r;
+  late RenderingScheduler<IsolateSummaryElement> _r;
 
   Stream<RenderedEvent<IsolateSummaryElement>> get onRendered => _r.onRendered;
 
-  M.IsolateRef _isolate;
-  M.EventRepository _events;
-  M.IsolateRepository _isolates;
-  M.ScriptRepository _scripts;
-  M.Isolate _loadedIsolate;
+  late M.IsolateRef _isolate;
+  late M.EventRepository _events;
+  late M.IsolateRepository _isolates;
+  late M.ScriptRepository _scripts;
+  M.Isolate? _loadedIsolate;
 
   factory IsolateSummaryElement(
       M.IsolateRef isolate,
       M.IsolateRepository isolates,
       M.EventRepository events,
       M.ScriptRepository scripts,
-      {RenderingQueue queue}) {
+      {RenderingQueue? queue}) {
     assert(isolate != null);
     assert(isolates != null);
     assert(events != null);
@@ -90,9 +90,10 @@
         new DivElement()
           ..classes = ['flex-row', 'isolate-state-container']
           ..children = <Element>[
-            new IsolateRunStateElement(_isolate, _events, queue: _r.queue)
+            new IsolateRunStateElement(_isolate as M.Isolate, _events,
+                    queue: _r.queue)
                 .element,
-            new IsolateLocationElement(_isolate, _events, _scripts,
+            new IsolateLocationElement(_isolate as M.Isolate, _events, _scripts,
                     queue: _r.queue)
                 .element,
             new SpanElement()..text = ' [',
@@ -104,14 +105,14 @@
 
   Element memoryRow() {
     final isolate = _isolate as M.Isolate;
-    final newHeapUsed = Utils.formatSize(isolate.newSpace.used);
-    final newHeapCapacity = Utils.formatSize(isolate.newSpace.capacity);
-    final oldHeapUsed = Utils.formatSize(isolate.oldSpace.used);
-    final oldHeapCapacity = Utils.formatSize(isolate.oldSpace.capacity);
+    final newHeapUsed = Utils.formatSize(isolate.newSpace!.used);
+    final newHeapCapacity = Utils.formatSize(isolate.newSpace!.capacity);
+    final oldHeapUsed = Utils.formatSize(isolate.oldSpace!.used);
+    final oldHeapCapacity = Utils.formatSize(isolate.oldSpace!.capacity);
     final heapUsed =
-        Utils.formatSize(isolate.newSpace.used + isolate.oldSpace.used);
-    final heapCapacity =
-        Utils.formatSize(isolate.newSpace.capacity + isolate.oldSpace.capacity);
+        Utils.formatSize(isolate.newSpace!.used + isolate.oldSpace!.used);
+    final heapCapacity = Utils.formatSize(
+        isolate.newSpace!.capacity + isolate.oldSpace!.capacity);
     return new DivElement()
       ..classes = ['flex-row-wrap-right']
       ..children = <Element>[
diff --git a/runtime/observatory/lib/src/elements/isolate_reconnect.dart b/runtime/observatory/lib/src/elements/isolate_reconnect.dart
index e6369b1..c6a02f9 100644
--- a/runtime/observatory/lib/src/elements/isolate_reconnect.dart
+++ b/runtime/observatory/lib/src/elements/isolate_reconnect.dart
@@ -16,25 +16,25 @@
 import 'package:observatory/src/elements/view_footer.dart';
 
 class IsolateReconnectElement extends CustomElement implements Renderable {
-  RenderingScheduler<IsolateReconnectElement> _r;
+  late RenderingScheduler<IsolateReconnectElement> _r;
 
   Stream<RenderedEvent<IsolateReconnectElement>> get onRendered =>
       _r.onRendered;
 
-  M.VM _vm;
-  String _missing;
-  Uri _uri;
-  M.EventRepository _events;
-  StreamSubscription _subscription;
+  late M.VM _vm;
+  late String _missing;
+  late Uri _uri;
+  late M.EventRepository _events;
+  late StreamSubscription _subscription;
 
   M.VM get vm => _vm;
   String get missing => _missing;
   Uri get uri => _uri;
 
-  M.NotificationRepository _notifications;
+  late M.NotificationRepository _notifications;
   factory IsolateReconnectElement(M.VM vm, M.EventRepository events,
       M.NotificationRepository notifications, String missing, Uri uri,
-      {RenderingQueue queue}) {
+      {RenderingQueue? queue}) {
     assert(vm != null);
     assert(events != null);
     assert(missing != null);
@@ -56,7 +56,7 @@
   void attached() {
     super.attached();
     _subscription = _events.onVMUpdate.listen((e) {
-      _vm = e.vm;
+      _vm = e.vm as M.VM;
       _r.dirty();
     });
     _r.enable();
diff --git a/runtime/observatory/lib/src/elements/isolate_ref.dart b/runtime/observatory/lib/src/elements/isolate_ref.dart
index 344f4b6..a7eb1b6 100644
--- a/runtime/observatory/lib/src/elements/isolate_ref.dart
+++ b/runtime/observatory/lib/src/elements/isolate_ref.dart
@@ -12,18 +12,18 @@
 import 'package:observatory/src/elements/helpers/uris.dart';
 
 class IsolateRefElement extends CustomElement implements Renderable {
-  RenderingScheduler<IsolateRefElement> _r;
+  late RenderingScheduler<IsolateRefElement> _r;
 
   Stream<RenderedEvent<IsolateRefElement>> get onRendered => _r.onRendered;
 
-  M.IsolateRef _isolate;
-  M.EventRepository _events;
-  StreamSubscription _updatesSubscription;
+  late M.IsolateRef _isolate;
+  late M.EventRepository _events;
+  late StreamSubscription _updatesSubscription;
 
   M.IsolateRef get isolate => _isolate;
 
   factory IsolateRefElement(M.IsolateRef isolate, M.EventRepository events,
-      {RenderingQueue queue}) {
+      {RenderingQueue? queue}) {
     assert(isolate != null);
     assert(events != null);
     IsolateRefElement e = new IsolateRefElement.created();
@@ -56,7 +56,7 @@
   }
 
   void render() {
-    final isolateType = isolate.isSystemIsolate ? 'System Isolate' : 'Isolate';
+    final isolateType = isolate.isSystemIsolate! ? 'System Isolate' : 'Isolate';
     children = <Element>[
       new AnchorElement(href: Uris.inspect(isolate))
         ..text = '$isolateType ${isolate.number} (${isolate.name})'
diff --git a/runtime/observatory/lib/src/elements/isolate_view.dart b/runtime/observatory/lib/src/elements/isolate_view.dart
index 4a3f0b7..73377da 100644
--- a/runtime/observatory/lib/src/elements/isolate_view.dart
+++ b/runtime/observatory/lib/src/elements/isolate_view.dart
@@ -31,23 +31,23 @@
 import 'package:observatory/utils.dart';
 
 class IsolateViewElement extends CustomElement implements Renderable {
-  RenderingScheduler<IsolateViewElement> _r;
+  late RenderingScheduler<IsolateViewElement> _r;
 
   Stream<RenderedEvent<IsolateViewElement>> get onRendered => _r.onRendered;
 
-  M.VM _vm;
-  M.Isolate _isolate;
-  M.EventRepository _events;
-  M.NotificationRepository _notifications;
-  M.IsolateRepository _isolates;
-  M.ScriptRepository _scripts;
-  M.FunctionRepository _functions;
-  M.LibraryRepository _libraries;
-  M.ObjectRepository _objects;
-  M.EvalRepository _eval;
-  M.ServiceFunction _function;
-  M.ScriptRef _rootScript;
-  StreamSubscription _subscription;
+  late M.VM _vm;
+  late M.Isolate _isolate;
+  late M.EventRepository _events;
+  late M.NotificationRepository _notifications;
+  late M.IsolateRepository _isolates;
+  late M.ScriptRepository _scripts;
+  late M.FunctionRepository _functions;
+  late M.LibraryRepository _libraries;
+  late M.ObjectRepository _objects;
+  late M.EvalRepository _eval;
+  M.ServiceFunction? _function;
+  M.ScriptRef? _rootScript;
+  late StreamSubscription _subscription;
 
   M.VMRef get vm => _vm;
   M.Isolate get isolate => _isolate;
@@ -64,7 +64,7 @@
       M.LibraryRepository libraries,
       M.ObjectRepository objects,
       M.EvalRepository eval,
-      {RenderingQueue queue}) {
+      {RenderingQueue? queue}) {
     assert(vm != null);
     assert(isolate != null);
     assert(events != null);
@@ -114,9 +114,9 @@
   }
 
   void render() {
-    final uptime = new DateTime.now().difference(_isolate.startTime);
-    final libraries = _isolate.libraries.toList();
-    final List<M.Thread> threads = _isolate.threads;
+    final uptime = new DateTime.now().difference(_isolate.startTime!);
+    final libraries = _isolate.libraries!.toList();
+    final List<M.Thread> threads = _isolate.threads!.toList();
     children = <Element>[
       navBar(<Element>[
         new NavTopMenuElement(queue: _r.queue).element,
@@ -165,11 +165,11 @@
             ..children = _function != null
                 ? [
                     new BRElement(),
-                    (new SourceInsetElement(_isolate, _function.location,
+                    (new SourceInsetElement(_isolate, _function!.location!,
                             _scripts, _objects, _events,
                             currentPos: M
-                                .topFrame(isolate.pauseEvent)
-                                .location
+                                .topFrame(isolate.pauseEvent)!
+                                .location!
                                 .tokenPos,
                             queue: _r.queue)
                           ..classes = ['header_inset'])
@@ -215,7 +215,7 @@
                       _isolate.rootLibrary == null
                           ? (new SpanElement()..text = 'loading...')
                           : new LibraryRefElement(
-                                  _isolate, _isolate.rootLibrary,
+                                  _isolate, _isolate.rootLibrary!,
                                   queue: _r.queue)
                               .element
                     ]
@@ -230,7 +230,7 @@
                         new DivElement()
                           ..classes = ['memberValue']
                           ..children = <Element>[
-                            new FunctionRefElement(_isolate, _isolate.entry,
+                            new FunctionRefElement(_isolate, _isolate.entry!,
                                     queue: _r.queue)
                                 .element
                           ]
@@ -341,7 +341,7 @@
                 ]
             ],
           new HRElement(),
-          new EvalBoxElement(_isolate, _isolate.rootLibrary, _objects, _eval,
+          new EvalBoxElement(_isolate, _isolate.rootLibrary!, _objects, _eval,
                   queue: _r.queue)
               .element,
           new DivElement()
@@ -349,7 +349,7 @@
                 ? [
                     new HRElement(),
                     new ScriptInsetElement(
-                            _isolate, _rootScript, _scripts, _objects, _events,
+                            _isolate, _rootScript!, _scripts, _objects, _events,
                             queue: _r.queue)
                         .element
                   ]
@@ -390,11 +390,11 @@
     _rootScript = null;
     final frame = M.topFrame(_isolate.pauseEvent);
     if (frame != null) {
-      _function = await _functions.get(_isolate, frame.function.id);
+      _function = await _functions.get(_isolate, frame.function!.id!);
     }
     if (_isolate.rootLibrary != null) {
       final rootLibrary =
-          await _libraries.get(_isolate, _isolate.rootLibrary.id);
+          await _libraries.get(_isolate, _isolate.rootLibrary!.id!);
       _rootScript = rootLibrary.rootScript;
     }
     _r.dirty();
diff --git a/runtime/observatory/lib/src/elements/json_view.dart b/runtime/observatory/lib/src/elements/json_view.dart
index 194e759..9e59278 100644
--- a/runtime/observatory/lib/src/elements/json_view.dart
+++ b/runtime/observatory/lib/src/elements/json_view.dart
@@ -15,18 +15,18 @@
 import 'package:observatory/src/elements/view_footer.dart';
 
 class JSONViewElement extends CustomElement implements Renderable {
-  RenderingScheduler<JSONViewElement> _r;
+  late RenderingScheduler<JSONViewElement> _r;
 
   Stream<RenderedEvent<JSONViewElement>> get onRendered => _r.onRendered;
 
-  M.NotificationRepository _notifications;
-  Map _map;
+  late M.NotificationRepository _notifications;
+  late Map _map;
 
   M.NotificationRepository get notifications => _notifications;
   Map get map => _map;
 
   factory JSONViewElement(Map map, M.NotificationRepository notifications,
-      {RenderingQueue queue}) {
+      {RenderingQueue? queue}) {
     assert(notifications != null);
     assert(map != null);
     JSONViewElement e = new JSONViewElement.created();
diff --git a/runtime/observatory/lib/src/elements/library_ref.dart b/runtime/observatory/lib/src/elements/library_ref.dart
index 7d5047d..591d56c 100644
--- a/runtime/observatory/lib/src/elements/library_ref.dart
+++ b/runtime/observatory/lib/src/elements/library_ref.dart
@@ -12,18 +12,18 @@
 import 'package:observatory/src/elements/helpers/uris.dart';
 
 class LibraryRefElement extends CustomElement implements Renderable {
-  RenderingScheduler<LibraryRefElement> _r;
+  late RenderingScheduler<LibraryRefElement> _r;
 
   Stream<RenderedEvent<LibraryRefElement>> get onRendered => _r.onRendered;
 
-  M.IsolateRef _isolate;
-  M.LibraryRef _library;
+  late M.IsolateRef _isolate;
+  late M.LibraryRef _library;
 
   M.IsolateRef get isolate => _isolate;
   M.LibraryRef get library => _library;
 
   factory LibraryRefElement(M.IsolateRef isolate, M.LibraryRef library,
-      {RenderingQueue queue}) {
+      {RenderingQueue? queue}) {
     assert(isolate != null);
     assert(library != null);
     LibraryRefElement e = new LibraryRefElement.created();
diff --git a/runtime/observatory/lib/src/elements/library_view.dart b/runtime/observatory/lib/src/elements/library_view.dart
index 7974dba..849eaba 100644
--- a/runtime/observatory/lib/src/elements/library_view.dart
+++ b/runtime/observatory/lib/src/elements/library_view.dart
@@ -29,25 +29,25 @@
 import 'package:observatory/src/elements/view_footer.dart';
 
 class LibraryViewElement extends CustomElement implements Renderable {
-  RenderingScheduler<LibraryViewElement> _r;
+  late RenderingScheduler<LibraryViewElement> _r;
 
   Stream<RenderedEvent<LibraryViewElement>> get onRendered => _r.onRendered;
 
-  M.VM _vm;
-  M.IsolateRef _isolate;
-  M.EventRepository _events;
-  M.NotificationRepository _notifications;
-  M.Library _library;
-  M.LibraryRepository _libraries;
-  M.FieldRepository _fields;
-  M.RetainedSizeRepository _retainedSizes;
-  M.ReachableSizeRepository _reachableSizes;
-  M.InboundReferencesRepository _references;
-  M.RetainingPathRepository _retainingPaths;
-  M.ScriptRepository _scripts;
-  M.ObjectRepository _objects;
-  M.EvalRepository _eval;
-  Iterable<M.Field> _variables;
+  late M.VM _vm;
+  late M.IsolateRef _isolate;
+  late M.EventRepository _events;
+  late M.NotificationRepository _notifications;
+  late M.Library _library;
+  late M.LibraryRepository _libraries;
+  late M.FieldRepository _fields;
+  late M.RetainedSizeRepository _retainedSizes;
+  late M.ReachableSizeRepository _reachableSizes;
+  late M.InboundReferencesRepository _references;
+  late M.RetainingPathRepository _retainingPaths;
+  late M.ScriptRepository _scripts;
+  late M.ObjectRepository _objects;
+  late M.EvalRepository _eval;
+  Iterable<M.Field>? _variables;
 
   M.VMRef get vm => _vm;
   M.IsolateRef get isolate => _isolate;
@@ -69,7 +69,7 @@
       M.ScriptRepository scripts,
       M.ObjectRepository objects,
       M.EvalRepository eval,
-      {RenderingQueue queue}) {
+      {RenderingQueue? queue}) {
     assert(vm != null);
     assert(isolate != null);
     assert(events != null);
@@ -197,19 +197,19 @@
   }
 
   Future _refresh() async {
-    _library = await _libraries.get(_isolate, _library.id);
+    _library = await _libraries.get(_isolate, _library.id!);
     _variables = null;
     _r.dirty();
     _variables = await Future.wait(
-        _library.variables.map((field) => _fields.get(_isolate, field.id)));
+        _library.variables!.map((field) => _fields.get(_isolate, field.id!)));
     _r.dirty();
   }
 
   Element _createDependencies() {
-    if (_library.dependencies.isEmpty) {
+    if (_library.dependencies!.isEmpty) {
       return new SpanElement();
     }
-    final dependencies = _library.dependencies.toList();
+    final dependencies = _library.dependencies!.toList();
     return new DivElement()
       ..children = <Element>[
         new SpanElement()..text = 'dependencies (${dependencies.length}) ',
@@ -232,10 +232,10 @@
   }
 
   Element _createScripts() {
-    if (_library.scripts.isEmpty) {
+    if (_library.scripts!.isEmpty) {
       return new SpanElement();
     }
-    final scripts = _library.scripts.toList();
+    final scripts = _library.scripts!.toList();
     return new DivElement()
       ..children = <Element>[
         new SpanElement()..text = 'scripts (${scripts.length}) ',
@@ -252,10 +252,10 @@
   }
 
   Element _createClasses() {
-    if (_library.classes.isEmpty) {
+    if (_library.classes!.isEmpty) {
       return new SpanElement();
     }
-    final classes = _library.classes.toList();
+    final classes = _library.classes!.toList();
     return new DivElement()
       ..children = <Element>[
         new SpanElement()..text = 'classes (${classes.length}) ',
@@ -272,10 +272,10 @@
   }
 
   Element _createVariables() {
-    if (_library.variables.isEmpty) {
+    if (_library.variables!.isEmpty) {
       return new SpanElement();
     }
-    final variables = _library.variables.toList();
+    final variables = _library.variables!.toList();
     return new DivElement()
       ..children = <Element>[
         new SpanElement()..text = 'variables (${variables.length}) ',
@@ -285,7 +285,7 @@
                     ? (new SpanElement()..text = 'loading...')
                     : (new DivElement()
                       ..classes = ['indent', 'memberList']
-                      ..children = _variables
+                      ..children = _variables!
                           .map<Element>((f) => new DivElement()
                             ..classes = ['memberItem']
                             ..children = <Element>[
@@ -311,10 +311,10 @@
   }
 
   Element _createFunctions() {
-    if (_library.functions.isEmpty) {
+    if (_library.functions!.isEmpty) {
       return new SpanElement();
     }
-    final functions = _library.functions.toList();
+    final functions = _library.functions!.toList();
     return new DivElement()
       ..children = <Element>[
         new SpanElement()..text = 'functions (${functions.length}) ',
diff --git a/runtime/observatory/lib/src/elements/local_var_descriptors_ref.dart b/runtime/observatory/lib/src/elements/local_var_descriptors_ref.dart
index 6a0cbe7..b168181 100644
--- a/runtime/observatory/lib/src/elements/local_var_descriptors_ref.dart
+++ b/runtime/observatory/lib/src/elements/local_var_descriptors_ref.dart
@@ -12,20 +12,20 @@
 
 class LocalVarDescriptorsRefElement extends CustomElement
     implements Renderable {
-  RenderingScheduler<LocalVarDescriptorsRefElement> _r;
+  late RenderingScheduler<LocalVarDescriptorsRefElement> _r;
 
   Stream<RenderedEvent<LocalVarDescriptorsRefElement>> get onRendered =>
       _r.onRendered;
 
-  M.IsolateRef _isolate;
-  M.LocalVarDescriptorsRef _localVar;
+  late M.IsolateRef _isolate;
+  late M.LocalVarDescriptorsRef _localVar;
 
   M.IsolateRef get isolate => _isolate;
   M.LocalVarDescriptorsRef get localVar => _localVar;
 
   factory LocalVarDescriptorsRefElement(
       M.IsolateRef isolate, M.LocalVarDescriptorsRef localVar,
-      {RenderingQueue queue}) {
+      {RenderingQueue? queue}) {
     assert(isolate != null);
     assert(localVar != null);
     LocalVarDescriptorsRefElement e =
diff --git a/runtime/observatory/lib/src/elements/logging.dart b/runtime/observatory/lib/src/elements/logging.dart
index 416fcba..349401d 100644
--- a/runtime/observatory/lib/src/elements/logging.dart
+++ b/runtime/observatory/lib/src/elements/logging.dart
@@ -22,15 +22,15 @@
 import 'package:observatory/src/elements/view_footer.dart';
 
 class LoggingPageElement extends CustomElement implements Renderable {
-  RenderingScheduler<LoggingPageElement> _r;
+  late RenderingScheduler<LoggingPageElement> _r;
 
   Stream<RenderedEvent<LoggingPageElement>> get onRendered => _r.onRendered;
 
-  M.VM _vm;
-  M.IsolateRef _isolate;
-  M.EventRepository _events;
-  M.NotificationRepository _notifications;
-  Level _level = Level.ALL;
+  late M.VM _vm;
+  late M.IsolateRef _isolate;
+  late M.EventRepository _events;
+  late M.NotificationRepository _notifications;
+  late Level _level = Level.ALL;
 
   M.VMRef get vm => _vm;
   M.IsolateRef get isolate => _isolate;
@@ -38,7 +38,7 @@
 
   factory LoggingPageElement(M.VM vm, M.IsolateRef isolate,
       M.EventRepository events, M.NotificationRepository notifications,
-      {RenderingQueue queue}) {
+      {RenderingQueue? queue}) {
     assert(vm != null);
     assert(isolate != null);
     assert(events != null);
@@ -67,11 +67,11 @@
     children = <Element>[];
   }
 
-  LoggingListElement _logs;
+  LoggingListElement? _logs;
 
   void render() {
     _logs = _logs ?? new LoggingListElement(_isolate, _events);
-    _logs.level = _level;
+    _logs!.level = _level;
     children = <Element>[
       navBar(<Element>[
         new NavTopMenuElement(queue: _r.queue).element,
@@ -94,7 +94,7 @@
           new SpanElement()..text = 'Show messages with severity ',
           _createLevelSelector(),
           new HRElement(),
-          _logs.element
+          _logs!.element
         ]
     ];
   }
@@ -107,7 +107,7 @@
           ..text = level.name;
       }).toList(growable: false);
     s.onChange.listen((_) {
-      _level = Level.LEVELS[s.selectedIndex];
+      _level = Level.LEVELS[s.selectedIndex!];
       _r.dirty();
     });
     return s;
diff --git a/runtime/observatory/lib/src/elements/logging_list.dart b/runtime/observatory/lib/src/elements/logging_list.dart
index 7984766..ed3479b 100644
--- a/runtime/observatory/lib/src/elements/logging_list.dart
+++ b/runtime/observatory/lib/src/elements/logging_list.dart
@@ -11,13 +11,13 @@
 import 'package:observatory/utils.dart';
 
 class LoggingListElement extends CustomElement implements Renderable {
-  RenderingScheduler<LoggingListElement> _r;
+  late RenderingScheduler<LoggingListElement> _r;
 
   Stream<RenderedEvent<LoggingListElement>> get onRendered => _r.onRendered;
 
-  M.IsolateRef _isolate;
-  M.EventRepository _events;
-  StreamSubscription _subscription;
+  late M.IsolateRef _isolate;
+  late M.EventRepository _events;
+  late StreamSubscription _subscription;
   Level _level = Level.ALL;
   final _logs = <Map>[];
 
@@ -27,7 +27,7 @@
   set level(Level value) => _level = _r.checkAndReact(_level, value);
 
   factory LoggingListElement(M.IsolateRef isolate, M.EventRepository events,
-      {RenderingQueue queue}) {
+      {RenderingQueue? queue}) {
     assert(isolate != null);
     assert(events != null);
     LoggingListElement e = new LoggingListElement.created();
diff --git a/runtime/observatory/lib/src/elements/megamorphiccache_ref.dart b/runtime/observatory/lib/src/elements/megamorphiccache_ref.dart
index bcb4c3e..122711e 100644
--- a/runtime/observatory/lib/src/elements/megamorphiccache_ref.dart
+++ b/runtime/observatory/lib/src/elements/megamorphiccache_ref.dart
@@ -11,20 +11,20 @@
 import 'package:observatory/src/elements/helpers/uris.dart';
 
 class MegamorphicCacheRefElement extends CustomElement implements Renderable {
-  RenderingScheduler<MegamorphicCacheRefElement> _r;
+  late RenderingScheduler<MegamorphicCacheRefElement> _r;
 
   Stream<RenderedEvent<MegamorphicCacheRefElement>> get onRendered =>
       _r.onRendered;
 
-  M.IsolateRef _isolate;
-  M.MegamorphicCacheRef _cache;
+  late M.IsolateRef _isolate;
+  late M.MegamorphicCacheRef _cache;
 
   M.IsolateRef get isolate => _isolate;
   M.MegamorphicCacheRef get cache => _cache;
 
   factory MegamorphicCacheRefElement(
       M.IsolateRef isolate, M.MegamorphicCacheRef cache,
-      {RenderingQueue queue}) {
+      {RenderingQueue? queue}) {
     assert(isolate != null);
     assert(cache != null);
     MegamorphicCacheRefElement e = new MegamorphicCacheRefElement.created();
diff --git a/runtime/observatory/lib/src/elements/megamorphiccache_view.dart b/runtime/observatory/lib/src/elements/megamorphiccache_view.dart
index fb1f262..fab2513 100644
--- a/runtime/observatory/lib/src/elements/megamorphiccache_view.dart
+++ b/runtime/observatory/lib/src/elements/megamorphiccache_view.dart
@@ -23,22 +23,22 @@
 import 'package:observatory/src/elements/view_footer.dart';
 
 class MegamorphicCacheViewElement extends CustomElement implements Renderable {
-  RenderingScheduler<MegamorphicCacheViewElement> _r;
+  late RenderingScheduler<MegamorphicCacheViewElement> _r;
 
   Stream<RenderedEvent<MegamorphicCacheViewElement>> get onRendered =>
       _r.onRendered;
 
-  M.VM _vm;
-  M.IsolateRef _isolate;
-  M.EventRepository _events;
-  M.NotificationRepository _notifications;
-  M.MegamorphicCache _cache;
-  M.MegamorphicCacheRepository _caches;
-  M.RetainedSizeRepository _retainedSizes;
-  M.ReachableSizeRepository _reachableSizes;
-  M.InboundReferencesRepository _references;
-  M.RetainingPathRepository _retainingPaths;
-  M.ObjectRepository _objects;
+  late M.VM _vm;
+  late M.IsolateRef _isolate;
+  late M.EventRepository _events;
+  late M.NotificationRepository _notifications;
+  late M.MegamorphicCache _cache;
+  late M.MegamorphicCacheRepository _caches;
+  late M.RetainedSizeRepository _retainedSizes;
+  late M.ReachableSizeRepository _reachableSizes;
+  late M.InboundReferencesRepository _references;
+  late M.RetainingPathRepository _retainingPaths;
+  late M.ObjectRepository _objects;
 
   M.VMRef get vm => _vm;
   M.IsolateRef get isolate => _isolate;
@@ -57,7 +57,7 @@
       M.InboundReferencesRepository references,
       M.RetainingPathRepository retainingPaths,
       M.ObjectRepository objects,
-      {RenderingQueue queue}) {
+      {RenderingQueue? queue}) {
     assert(vm != null);
     assert(isolate != null);
     assert(events != null);
@@ -111,7 +111,7 @@
         (new NavRefreshElement(queue: _r.queue)
               ..onRefresh.listen((e) async {
                 e.element.disabled = true;
-                _cache = await _caches.get(_isolate, _cache.id);
+                _cache = await _caches.get(_isolate, _cache.id!);
                 _r.dirty();
               }))
             .element,
diff --git a/runtime/observatory/lib/src/elements/metric/details.dart b/runtime/observatory/lib/src/elements/metric/details.dart
index 71fd1f0..742465a 100644
--- a/runtime/observatory/lib/src/elements/metric/details.dart
+++ b/runtime/observatory/lib/src/elements/metric/details.dart
@@ -9,20 +9,20 @@
 import 'package:observatory/src/elements/helpers/custom_element.dart';
 
 class MetricDetailsElement extends CustomElement implements Renderable {
-  RenderingScheduler<MetricDetailsElement> _r;
+  late RenderingScheduler<MetricDetailsElement> _r;
 
   Stream<RenderedEvent<MetricDetailsElement>> get onRendered => _r.onRendered;
 
-  M.IsolateRef _isolate;
-  M.Metric _metric;
-  M.MetricRepository _metrics;
+  late M.IsolateRef _isolate;
+  late M.Metric _metric;
+  late M.MetricRepository _metrics;
 
   M.IsolateRef get isolate => _isolate;
   M.Metric get metric => _metric;
 
   factory MetricDetailsElement(
       M.IsolateRef isolate, M.Metric metric, M.MetricRepository metrics,
-      {RenderingQueue queue}) {
+      {RenderingQueue? queue}) {
     assert(isolate != null);
     assert(metric != null);
     assert(metrics != null);
diff --git a/runtime/observatory/lib/src/elements/metric/graph.dart b/runtime/observatory/lib/src/elements/metric/graph.dart
index 0b00a160..bb482b2 100644
--- a/runtime/observatory/lib/src/elements/metric/graph.dart
+++ b/runtime/observatory/lib/src/elements/metric/graph.dart
@@ -9,21 +9,21 @@
 import 'package:observatory/src/elements/helpers/custom_element.dart';
 
 class MetricGraphElement extends CustomElement implements Renderable {
-  RenderingScheduler<MetricGraphElement> _r;
+  late RenderingScheduler<MetricGraphElement> _r;
 
   Stream<RenderedEvent<MetricGraphElement>> get onRendered => _r.onRendered;
 
-  M.IsolateRef _isolate;
-  M.Metric _metric;
-  M.MetricRepository _metrics;
-  Timer _timer;
+  late M.IsolateRef _isolate;
+  late M.Metric _metric;
+  late M.MetricRepository _metrics;
+  late Timer _timer;
 
   M.IsolateRef get isolate => _isolate;
   M.Metric get metric => _metric;
 
   factory MetricGraphElement(
       M.IsolateRef isolate, M.Metric metric, M.MetricRepository metrics,
-      {RenderingQueue queue}) {
+      {RenderingQueue? queue}) {
     assert(isolate != null);
     assert(metric != null);
     assert(metrics != null);
@@ -56,8 +56,8 @@
     final min = _metrics.getMinValue(_isolate, _metric);
     final max = _metrics.getMaxValue(_isolate, _metric);
     final rows = _metrics
-        .getSamples(_isolate, _metric)
-        .map((s) => [s.time.millisecondsSinceEpoch, s.value])
+        .getSamples(_isolate, _metric)!
+        .map((s) => [s.time!.millisecondsSinceEpoch, s.value])
         .toList();
     final current = rows.last.last;
 
diff --git a/runtime/observatory/lib/src/elements/metrics.dart b/runtime/observatory/lib/src/elements/metrics.dart
index 30a9e9c..55c2bb6 100644
--- a/runtime/observatory/lib/src/elements/metrics.dart
+++ b/runtime/observatory/lib/src/elements/metrics.dart
@@ -20,17 +20,17 @@
 import 'package:observatory/src/elements/nav/vm_menu.dart';
 
 class MetricsPageElement extends CustomElement implements Renderable {
-  RenderingScheduler<MetricsPageElement> _r;
+  late RenderingScheduler<MetricsPageElement> _r;
 
   Stream<RenderedEvent<MetricsPageElement>> get onRendered => _r.onRendered;
 
-  M.VM _vm;
-  M.IsolateRef _isolate;
-  M.EventRepository _events;
-  M.NotificationRepository _notifications;
-  M.MetricRepository _metrics;
-  List<M.Metric> _available;
-  M.Metric _selected;
+  late M.VM _vm;
+  late M.IsolateRef _isolate;
+  late M.EventRepository _events;
+  late M.NotificationRepository _notifications;
+  late M.MetricRepository _metrics;
+  List<M.Metric>? _available;
+  M.Metric? _selected;
 
   M.VMRef get vm => _vm;
   M.IsolateRef get isolate => _isolate;
@@ -42,7 +42,7 @@
       M.EventRepository events,
       M.NotificationRepository notifications,
       M.MetricRepository metrics,
-      {RenderingQueue queue}) {
+      {RenderingQueue? queue}) {
     assert(vm != null);
     assert(isolate != null);
     assert(events != null);
@@ -114,7 +114,7 @@
             ..children = _selected == null
                 ? const []
                 : [
-                    new MetricDetailsElement(_isolate, _selected, _metrics,
+                    new MetricDetailsElement(_isolate, _selected!, _metrics,
                             queue: _r.queue)
                         .element
                   ],
@@ -124,7 +124,7 @@
             ..children = _selected == null
                 ? const []
                 : [
-                    new MetricGraphElement(_isolate, _selected, _metrics,
+                    new MetricGraphElement(_isolate, _selected!, _metrics,
                             queue: _r.queue)
                         .element
                   ]
@@ -134,8 +134,8 @@
 
   Future _refresh() async {
     _available = (await _metrics.list(_isolate)).toList();
-    if (!_available.contains(_selected)) {
-      _selected = _available.first;
+    if (!_available!.contains(_selected)) {
+      _selected = _available!.first;
     }
     _r.dirty();
   }
@@ -144,14 +144,14 @@
     var s;
     return [
       s = new SelectElement()
-        ..value = _selected.name
-        ..children = _available.map((metric) {
+        ..value = _selected!.name!
+        ..children = _available!.map((metric) {
           return new OptionElement(
-              value: metric.name, selected: _selected == metric)
-            ..text = metric.name;
+              value: metric.name!, selected: _selected == metric)
+            ..text = metric.name!;
         }).toList(growable: false)
         ..onChange.listen((_) {
-          _selected = _available[s.selectedIndex];
+          _selected = _available![s.selectedIndex];
           _r.dirty();
         })
     ];
diff --git a/runtime/observatory/lib/src/elements/native_memory_profiler.dart b/runtime/observatory/lib/src/elements/native_memory_profiler.dart
index 8d8b1ac..2289189 100644
--- a/runtime/observatory/lib/src/elements/native_memory_profiler.dart
+++ b/runtime/observatory/lib/src/elements/native_memory_profiler.dart
@@ -21,21 +21,21 @@
 import 'package:observatory/src/elements/stack_trace_tree_config.dart';
 
 class NativeMemoryProfileElement extends CustomElement implements Renderable {
-  RenderingScheduler<NativeMemoryProfileElement> _r;
+  late RenderingScheduler<NativeMemoryProfileElement> _r;
 
   Stream<RenderedEvent<NativeMemoryProfileElement>> get onRendered =>
       _r.onRendered;
 
-  M.VM _vm;
-  M.EventRepository _events;
-  M.NotificationRepository _notifications;
-  M.NativeMemorySampleProfileRepository _profiles;
-  Stream<M.SampleProfileLoadingProgressEvent> _progressStream;
-  M.SampleProfileLoadingProgress _progress;
-  M.SampleProfileTag _tag = M.SampleProfileTag.none;
-  ProfileTreeMode _mode = ProfileTreeMode.function;
-  M.ProfileTreeDirection _direction = M.ProfileTreeDirection.exclusive;
-  String _filter = '';
+  late M.VM _vm;
+  late M.EventRepository _events;
+  late M.NotificationRepository _notifications;
+  late M.NativeMemorySampleProfileRepository _profiles;
+  Stream<M.SampleProfileLoadingProgressEvent>? _progressStream;
+  M.SampleProfileLoadingProgress? _progress;
+  late M.SampleProfileTag _tag = M.SampleProfileTag.none;
+  late ProfileTreeMode _mode = ProfileTreeMode.function;
+  late M.ProfileTreeDirection _direction = M.ProfileTreeDirection.exclusive;
+  late String _filter = '';
 
   M.NotificationRepository get notifications => _notifications;
   M.NativeMemorySampleProfileRepository get profiles => _profiles;
@@ -45,7 +45,7 @@
       M.EventRepository events,
       M.NotificationRepository notifications,
       M.NativeMemorySampleProfileRepository profiles,
-      {RenderingQueue queue}) {
+      {RenderingQueue? queue}) {
     assert(vm != null);
     assert(events != null);
     assert(notifications != null);
@@ -90,15 +90,16 @@
       children = content;
       return;
     }
-    content.add((new SampleBufferControlElement(_vm, _progress, _progressStream,
+    content.add((new SampleBufferControlElement(
+            _vm, _progress!, _progressStream!,
             selectedTag: _tag, queue: _r.queue)
           ..onTagChange.listen((e) {
             _tag = e.element.selectedTag;
             _request();
           }))
         .element);
-    if (_progress.status == M.SampleProfileLoadingStatus.loaded) {
-      CpuProfileVirtualTreeElement tree;
+    if (_progress!.status == M.SampleProfileLoadingStatus.loaded) {
+      late CpuProfileVirtualTreeElement tree;
       content.addAll([
         new BRElement(),
         (new StackTraceTreeConfigElement(
@@ -124,7 +125,7 @@
               }))
             .element,
         new BRElement(),
-        (tree = new CpuProfileVirtualTreeElement(null, _progress.profile,
+        (tree = new CpuProfileVirtualTreeElement(null, _progress!.profile,
                 queue: _r.queue, type: M.SampleProfileType.memory))
             .element,
       ]);
@@ -134,17 +135,17 @@
 
   Future _request({bool forceFetch: false}) async {
     if (forceFetch) {
-      for (M.Isolate isolate in _vm.isolates) {
+      for (M.IsolateRef isolate in _vm.isolates) {
         await isolate.collectAllGarbage();
       }
     }
     _progress = null;
     _progressStream = _profiles.get(_vm, _tag, forceFetch: forceFetch);
     _r.dirty();
-    _progress = (await _progressStream.first).progress;
+    _progress = (await _progressStream!.first).progress;
     _r.dirty();
-    if (M.isSampleProcessRunning(_progress.status)) {
-      _progress = (await _progressStream.last).progress;
+    if (M.isSampleProcessRunning(_progress!.status)) {
+      _progress = (await _progressStream!.last).progress;
       _r.dirty();
     }
   }
diff --git a/runtime/observatory/lib/src/elements/nav/class_menu.dart b/runtime/observatory/lib/src/elements/nav/class_menu.dart
index 8a6992d..3596d3f 100644
--- a/runtime/observatory/lib/src/elements/nav/class_menu.dart
+++ b/runtime/observatory/lib/src/elements/nav/class_menu.dart
@@ -11,17 +11,17 @@
 import 'package:observatory/src/elements/helpers/uris.dart';
 
 class NavClassMenuElement extends CustomElement implements Renderable {
-  RenderingScheduler<NavClassMenuElement> _r;
+  late RenderingScheduler<NavClassMenuElement> _r;
 
   Stream<RenderedEvent<NavClassMenuElement>> get onRendered => _r.onRendered;
 
-  M.IsolateRef _isolate;
-  M.ClassRef _cls;
-  Iterable<Element> _content = const [];
+  late M.IsolateRef _isolate;
+  late M.ClassRef _cls;
+  List<Element> _content = const [];
 
   M.IsolateRef get isolate => _isolate;
   M.ClassRef get cls => _cls;
-  Iterable<Element> get content => _content;
+  List<Element> get content => _content;
 
   set content(Iterable<Element> value) {
     _content = value.toList();
@@ -29,7 +29,7 @@
   }
 
   factory NavClassMenuElement(M.IsolateRef isolate, M.ClassRef cls,
-      {RenderingQueue queue}) {
+      {RenderingQueue? queue}) {
     assert(isolate != null);
     assert(cls != null);
     NavClassMenuElement e = new NavClassMenuElement.created();
@@ -56,7 +56,7 @@
 
   void render() {
     children = <Element>[
-      navMenu(cls.name,
+      navMenu(cls.name!,
           content: _content, link: Uris.inspect(isolate, object: cls))
     ];
   }
diff --git a/runtime/observatory/lib/src/elements/nav/isolate_menu.dart b/runtime/observatory/lib/src/elements/nav/isolate_menu.dart
index 833f975..b3184f4 100644
--- a/runtime/observatory/lib/src/elements/nav/isolate_menu.dart
+++ b/runtime/observatory/lib/src/elements/nav/isolate_menu.dart
@@ -12,14 +12,14 @@
 import 'package:observatory/src/elements/nav/menu_item.dart';
 
 class NavIsolateMenuElement extends CustomElement implements Renderable {
-  RenderingScheduler<NavIsolateMenuElement> _r;
+  late RenderingScheduler<NavIsolateMenuElement> _r;
 
   Stream<RenderedEvent<NavIsolateMenuElement>> get onRendered => _r.onRendered;
 
-  M.IsolateRef _isolate;
-  M.EventRepository _events;
-  StreamSubscription _updatesSubscription;
-  Iterable<Element> _content = const [];
+  late M.IsolateRef _isolate;
+  late M.EventRepository _events;
+  StreamSubscription? _updatesSubscription;
+  late Iterable<Element> _content = const [];
 
   M.IsolateRef get isolate => _isolate;
   Iterable<Element> get content => _content;
@@ -30,7 +30,7 @@
   }
 
   factory NavIsolateMenuElement(M.IsolateRef isolate, M.EventRepository events,
-      {RenderingQueue queue}) {
+      {RenderingQueue? queue}) {
     assert(isolate != null);
     assert(events != null);
     NavIsolateMenuElement e = new NavIsolateMenuElement.created();
@@ -60,7 +60,7 @@
     children = <Element>[];
     _r.disable(notify: true);
     assert(_updatesSubscription != null);
-    _updatesSubscription.cancel();
+    _updatesSubscription!.cancel();
     _updatesSubscription = null;
   }
 
@@ -101,7 +101,7 @@
           .element,
     ]..addAll(_content);
     children = <Element>[
-      navMenu(isolate.name, content: content, link: Uris.inspect(isolate))
+      navMenu(isolate.name!, content: content, link: Uris.inspect(isolate))
     ];
   }
 }
diff --git a/runtime/observatory/lib/src/elements/nav/library_menu.dart b/runtime/observatory/lib/src/elements/nav/library_menu.dart
index e24a5a3..4639fee 100644
--- a/runtime/observatory/lib/src/elements/nav/library_menu.dart
+++ b/runtime/observatory/lib/src/elements/nav/library_menu.dart
@@ -11,17 +11,17 @@
 import 'package:observatory/src/elements/helpers/uris.dart';
 
 class NavLibraryMenuElement extends CustomElement implements Renderable {
-  RenderingScheduler<NavLibraryMenuElement> _r;
+  late RenderingScheduler<NavLibraryMenuElement> _r;
 
   Stream<RenderedEvent<NavLibraryMenuElement>> get onRendered => _r.onRendered;
 
-  M.IsolateRef _isolate;
-  M.LibraryRef _library;
-  Iterable<Element> _content = const [];
+  late M.IsolateRef _isolate;
+  late M.LibraryRef _library;
+  List<Element> _content = const [];
 
   M.IsolateRef get isolate => _isolate;
   M.LibraryRef get library => _library;
-  Iterable<Element> get content => _content;
+  List<Element> get content => _content;
 
   set content(Iterable<Element> value) {
     _content = value.toList();
@@ -29,7 +29,7 @@
   }
 
   factory NavLibraryMenuElement(M.IsolateRef isolate, M.LibraryRef library,
-      {RenderingQueue queue}) {
+      {RenderingQueue? queue}) {
     assert(isolate != null);
     assert(library != null);
     NavLibraryMenuElement e = new NavLibraryMenuElement.created();
@@ -56,7 +56,7 @@
 
   void render() {
     children = <Element>[
-      navMenu(library.name,
+      navMenu(library.name!,
           content: _content,
           link: Uris.inspect(isolate, object: library).toString())
     ];
diff --git a/runtime/observatory/lib/src/elements/nav/menu_item.dart b/runtime/observatory/lib/src/elements/nav/menu_item.dart
index f7b94f6..a6fcd34 100644
--- a/runtime/observatory/lib/src/elements/nav/menu_item.dart
+++ b/runtime/observatory/lib/src/elements/nav/menu_item.dart
@@ -8,17 +8,17 @@
 import 'package:observatory/src/elements/helpers/rendering_scheduler.dart';
 
 class NavMenuItemElement extends CustomElement implements Renderable {
-  RenderingScheduler<NavMenuItemElement> _r;
+  late RenderingScheduler<NavMenuItemElement> _r;
 
   Stream<RenderedEvent<NavMenuItemElement>> get onRendered => _r.onRendered;
 
-  String _label;
-  String _link;
-  Iterable<Element> _content = const <Element>[];
+  late String _label;
+  late String _link;
+  List<Element> _content = const <Element>[];
 
   String get label => _label;
   String get link => _link;
-  Iterable<Element> get content => _content;
+  List<Element> get content => _content;
 
   set label(String value) => _label = _r.checkAndReact(_label, value);
   set link(String value) => _link = _r.checkAndReact(_link, value);
@@ -28,7 +28,7 @@
   }
 
   factory NavMenuItemElement(String label,
-      {String link, RenderingQueue queue}) {
+      {String link = '', RenderingQueue? queue}) {
     assert(label != null);
     NavMenuItemElement e = new NavMenuItemElement.created();
     e._r = new RenderingScheduler<NavMenuItemElement>(e, queue: queue);
diff --git a/runtime/observatory/lib/src/elements/nav/notify.dart b/runtime/observatory/lib/src/elements/nav/notify.dart
index 3fc8e64..53d27d0 100644
--- a/runtime/observatory/lib/src/elements/nav/notify.dart
+++ b/runtime/observatory/lib/src/elements/nav/notify.dart
@@ -11,14 +11,14 @@
 import 'package:observatory/src/elements/nav/notify_exception.dart';
 
 class NavNotifyElement extends CustomElement implements Renderable {
-  RenderingScheduler<NavNotifyElement> _r;
+  late RenderingScheduler<NavNotifyElement> _r;
 
   Stream<RenderedEvent<NavNotifyElement>> get onRendered => _r.onRendered;
 
-  M.NotificationRepository _repository;
-  StreamSubscription _subscription;
+  late M.NotificationRepository _repository;
+  StreamSubscription? _subscription;
 
-  bool _notifyOnPause;
+  late bool _notifyOnPause;
 
   bool get notifyOnPause => _notifyOnPause;
 
@@ -26,7 +26,7 @@
       _notifyOnPause = _r.checkAndReact(_notifyOnPause, value);
 
   factory NavNotifyElement(M.NotificationRepository repository,
-      {bool notifyOnPause: true, RenderingQueue queue}) {
+      {bool notifyOnPause: true, RenderingQueue? queue}) {
     assert(repository != null);
     assert(notifyOnPause != null);
     NavNotifyElement e = new NavNotifyElement.created();
@@ -50,7 +50,7 @@
     super.detached();
     children = <Element>[];
     _r.disable(notify: true);
-    _subscription.cancel();
+    _subscription!.cancel();
   }
 
   void render() {
diff --git a/runtime/observatory/lib/src/elements/nav/notify_event.dart b/runtime/observatory/lib/src/elements/nav/notify_event.dart
index 0d39e61..5bda508 100644
--- a/runtime/observatory/lib/src/elements/nav/notify_event.dart
+++ b/runtime/observatory/lib/src/elements/nav/notify_event.dart
@@ -15,7 +15,7 @@
 }
 
 class NavNotifyEventElement extends CustomElement implements Renderable {
-  RenderingScheduler<NavNotifyEventElement> _r;
+  late RenderingScheduler<NavNotifyEventElement> _r;
 
   Stream<RenderedEvent<NavNotifyEventElement>> get onRendered => _r.onRendered;
 
@@ -23,11 +23,11 @@
       new StreamController<EventDeleteEvent>.broadcast();
   Stream<EventDeleteEvent> get onDelete => _onDelete.stream;
 
-  M.Event _event;
+  late M.Event _event;
 
   M.Event get event => _event;
 
-  factory NavNotifyEventElement(M.Event event, {RenderingQueue queue}) {
+  factory NavNotifyEventElement(M.Event event, {RenderingQueue? queue}) {
     assert(event != null);
     NavNotifyEventElement e = new NavNotifyEventElement.created();
     e._r = new RenderingScheduler<NavNotifyEventElement>(e, queue: queue);
@@ -116,7 +116,7 @@
       M.PauseBreakpointEvent event) {
     String message = ' is paused';
     if (event.breakpoint != null) {
-      message += ' at breakpoint ${event.breakpoint.number}';
+      message += ' at breakpoint ${event.breakpoint!.number}';
     }
     return [
       new SpanElement()..text = 'Isolate ',
diff --git a/runtime/observatory/lib/src/elements/nav/notify_exception.dart b/runtime/observatory/lib/src/elements/nav/notify_exception.dart
index 6075dcf..13c1d60 100644
--- a/runtime/observatory/lib/src/elements/nav/notify_exception.dart
+++ b/runtime/observatory/lib/src/elements/nav/notify_exception.dart
@@ -11,13 +11,13 @@
 
 class ExceptionDeleteEvent {
   final dynamic exception;
-  final StackTrace stacktrace;
+  final StackTrace? stacktrace;
 
   ExceptionDeleteEvent(this.exception, {this.stacktrace});
 }
 
 class NavNotifyExceptionElement extends CustomElement implements Renderable {
-  RenderingScheduler<NavNotifyExceptionElement> _r;
+  late RenderingScheduler<NavNotifyExceptionElement> _r;
 
   Stream<RenderedEvent<NavNotifyExceptionElement>> get onRendered =>
       _r.onRendered;
@@ -26,14 +26,14 @@
       new StreamController<ExceptionDeleteEvent>.broadcast();
   Stream<ExceptionDeleteEvent> get onDelete => _onDelete.stream;
 
-  dynamic _exception;
-  StackTrace _stacktrace;
+  late dynamic _exception;
+  StackTrace? _stacktrace;
 
   dynamic get exception => _exception;
-  StackTrace get stacktrace => _stacktrace;
+  StackTrace? get stacktrace => _stacktrace;
 
   factory NavNotifyExceptionElement(dynamic exception,
-      {StackTrace stacktrace: null, RenderingQueue queue}) {
+      {StackTrace? stacktrace: null, RenderingQueue? queue}) {
     assert(exception != null);
     NavNotifyExceptionElement e = new NavNotifyExceptionElement.created();
     e._r = new RenderingScheduler<NavNotifyExceptionElement>(e, queue: queue);
diff --git a/runtime/observatory/lib/src/elements/nav/refresh.dart b/runtime/observatory/lib/src/elements/nav/refresh.dart
index df71f20..6e51ef4 100644
--- a/runtime/observatory/lib/src/elements/nav/refresh.dart
+++ b/runtime/observatory/lib/src/elements/nav/refresh.dart
@@ -13,7 +13,7 @@
 }
 
 class NavRefreshElement extends CustomElement implements Renderable {
-  RenderingScheduler<NavRefreshElement> _r;
+  late RenderingScheduler<NavRefreshElement> _r;
 
   Stream<RenderedEvent<NavRefreshElement>> get onRendered => _r.onRendered;
 
@@ -21,8 +21,8 @@
       new StreamController<RefreshEvent>.broadcast();
   Stream<RefreshEvent> get onRefresh => _onRefresh.stream;
 
-  bool _disabled;
-  String _label;
+  late bool _disabled;
+  late String _label;
 
   bool get disabled => _disabled;
   String get label => _label;
@@ -31,7 +31,7 @@
   set label(String value) => _label = _r.checkAndReact(_label, value);
 
   factory NavRefreshElement(
-      {String label: 'Refresh', bool disabled: false, RenderingQueue queue}) {
+      {String label: 'Refresh', bool disabled: false, RenderingQueue? queue}) {
     assert(label != null);
     assert(disabled != null);
     NavRefreshElement e = new NavRefreshElement.created();
diff --git a/runtime/observatory/lib/src/elements/nav/reload.dart b/runtime/observatory/lib/src/elements/nav/reload.dart
index b17a54b..2400b6c 100644
--- a/runtime/observatory/lib/src/elements/nav/reload.dart
+++ b/runtime/observatory/lib/src/elements/nav/reload.dart
@@ -16,7 +16,7 @@
 }
 
 class NavReloadElement extends CustomElement implements Renderable {
-  RenderingScheduler<NavReloadElement> _r;
+  late RenderingScheduler<NavReloadElement> _r;
 
   Stream<RenderedEvent<NavReloadElement>> get onRendered => _r.onRendered;
 
@@ -24,15 +24,15 @@
       new StreamController<ReloadEvent>.broadcast();
   Stream<ReloadEvent> get onReload => _onReload.stream;
 
-  M.IsolateRef _isolate;
-  M.IsolateRepository _isolates;
-  M.EventRepository _events;
-  StreamSubscription _sub;
+  late M.IsolateRef _isolate;
+  late M.IsolateRepository _isolates;
+  late M.EventRepository _events;
+  StreamSubscription? _sub;
   bool _disabled = false;
 
   factory NavReloadElement(M.IsolateRef isolate, M.IsolateRepository isolates,
       M.EventRepository events,
-      {RenderingQueue queue}) {
+      {RenderingQueue? queue}) {
     assert(isolate != null);
     assert(isolates != null);
     assert(events != null);
@@ -57,7 +57,7 @@
   void detached() {
     super.detached();
     children = <Element>[];
-    _sub.cancel();
+    _sub!.cancel();
     _sub = null;
     _r.disable(notify: true);
   }
@@ -82,13 +82,15 @@
                 .listen((_) => _reload(_isolates.reloadSourcesServices.single))
         ]);
     } else {
-      final content = _isolates.reloadSourcesServices.map((s) => new LIElement()
-        ..children = <Element>[
-          new ButtonElement()
-            ..text = s.alias
-            ..disabled = _disabled
-            ..onClick.listen((_) => _reload(s))
-        ]);
+      final content = _isolates.reloadSourcesServices
+          .map((s) => new LIElement()
+            ..children = <Element>[
+              new ButtonElement()
+                ..text = s.alias
+                ..disabled = _disabled
+                ..onClick.listen((_) => _reload(s))
+            ])
+          .toList();
       children.add(navMenu('Reload Source', content: content));
     }
     this.children = children;
diff --git a/runtime/observatory/lib/src/elements/nav/top_menu.dart b/runtime/observatory/lib/src/elements/nav/top_menu.dart
index f31ef58..a7408a4 100644
--- a/runtime/observatory/lib/src/elements/nav/top_menu.dart
+++ b/runtime/observatory/lib/src/elements/nav/top_menu.dart
@@ -11,7 +11,7 @@
 import 'package:observatory/src/elements/nav/menu_item.dart';
 
 class NavTopMenuElement extends CustomElement implements Renderable {
-  RenderingScheduler<NavTopMenuElement> _r;
+  late RenderingScheduler<NavTopMenuElement> _r;
 
   Stream<RenderedEvent<NavTopMenuElement>> get onRendered => _r.onRendered;
 
@@ -24,7 +24,7 @@
     _r.dirty();
   }
 
-  factory NavTopMenuElement({RenderingQueue queue}) {
+  factory NavTopMenuElement({RenderingQueue? queue}) {
     NavTopMenuElement e = new NavTopMenuElement.created();
     e._r = new RenderingScheduler<NavTopMenuElement>(e, queue: queue);
     return e;
diff --git a/runtime/observatory/lib/src/elements/nav/vm_menu.dart b/runtime/observatory/lib/src/elements/nav/vm_menu.dart
index 6751816..0a454a1 100644
--- a/runtime/observatory/lib/src/elements/nav/vm_menu.dart
+++ b/runtime/observatory/lib/src/elements/nav/vm_menu.dart
@@ -12,13 +12,13 @@
 import 'package:observatory/src/elements/nav/menu_item.dart';
 
 class NavVMMenuElement extends CustomElement implements Renderable {
-  RenderingScheduler<NavVMMenuElement> _r;
+  late RenderingScheduler<NavVMMenuElement> _r;
 
   Stream<RenderedEvent<NavVMMenuElement>> get onRendered => _r.onRendered;
 
-  M.VM _vm;
-  M.EventRepository _events;
-  StreamSubscription _updatesSubscription;
+  late M.VM _vm;
+  late M.EventRepository _events;
+  late StreamSubscription _updatesSubscription;
   Iterable<Element> _content = const [];
 
   M.VM get vm => _vm;
@@ -30,7 +30,7 @@
   }
 
   factory NavVMMenuElement(M.VM vm, M.EventRepository events,
-      {RenderingQueue queue}) {
+      {RenderingQueue? queue}) {
     assert(vm != null);
     assert(events != null);
     NavVMMenuElement e = new NavVMMenuElement.created();
@@ -46,7 +46,7 @@
   void attached() {
     super.attached();
     _updatesSubscription = _events.onVMUpdate.listen((e) {
-      _vm = e.vm;
+      _vm = e.vm as M.VM;
       _r.dirty();
     });
     _r.enable();
@@ -62,13 +62,13 @@
 
   void render() {
     final content = (_vm.isolates.map<Element>((isolate) {
-      return new NavMenuItemElement(isolate.name,
+      return new NavMenuItemElement(isolate.name!,
               queue: _r.queue, link: Uris.inspect(isolate))
           .element;
     }).toList()
       ..addAll(_content));
     children = <Element>[
-      navMenu(vm.displayName, link: Uris.vm(), content: content)
+      navMenu(vm.displayName!, link: Uris.vm(), content: content)
     ];
   }
 }
diff --git a/runtime/observatory/lib/src/elements/object_common.dart b/runtime/observatory/lib/src/elements/object_common.dart
index 8413c3d..5e6152f 100644
--- a/runtime/observatory/lib/src/elements/object_common.dart
+++ b/runtime/observatory/lib/src/elements/object_common.dart
@@ -14,20 +14,20 @@
 import 'package:observatory/utils.dart';
 
 class ObjectCommonElement extends CustomElement implements Renderable {
-  RenderingScheduler<ObjectCommonElement> _r;
+  late RenderingScheduler<ObjectCommonElement> _r;
 
   Stream<RenderedEvent<ObjectCommonElement>> get onRendered => _r.onRendered;
 
-  M.IsolateRef _isolate;
-  M.Object _object;
-  M.RetainedSizeRepository _retainedSizes;
-  M.ReachableSizeRepository _reachableSizes;
-  M.InboundReferencesRepository _references;
-  M.RetainingPathRepository _retainingPaths;
-  M.ObjectRepository _objects;
-  M.Guarded<M.Instance> _retainedSize = null;
+  late M.IsolateRef _isolate;
+  late M.Object _object;
+  late M.RetainedSizeRepository _retainedSizes;
+  late M.ReachableSizeRepository _reachableSizes;
+  late M.InboundReferencesRepository _references;
+  late M.RetainingPathRepository _retainingPaths;
+  late M.ObjectRepository _objects;
+  M.Guarded<M.Instance>? _retainedSize = null;
   bool _loadingRetainedBytes = false;
-  M.Guarded<M.Instance> _reachableSize = null;
+  M.Guarded<M.Instance>? _reachableSize = null;
   bool _loadingReachableBytes = false;
 
   M.IsolateRef get isolate => _isolate;
@@ -41,7 +41,7 @@
       M.InboundReferencesRepository references,
       M.RetainingPathRepository retainingPaths,
       M.ObjectRepository objects,
-      {RenderingQueue queue}) {
+      {RenderingQueue? queue}) {
     assert(isolate != null);
     assert(object != null);
     assert(retainedSizes != null);
@@ -76,8 +76,8 @@
     children = <Element>[];
   }
 
-  RetainingPathElement _path;
-  InboundReferencesElement _inbounds;
+  RetainingPathElement? _path;
+  InboundReferencesElement? _inbounds;
 
   void render() {
     _path = _path ??
@@ -101,7 +101,7 @@
                 ..children = <Element>[
                   _object.clazz == null
                       ? (new SpanElement()..text = '...')
-                      : new ClassRefElement(_isolate, _object.clazz,
+                      : new ClassRefElement(_isolate, _object.clazz!,
                               queue: _r.queue)
                           .element
                 ]
@@ -149,7 +149,7 @@
                 ..text = 'Retaining path ',
               new DivElement()
                 ..classes = ['memberValue']
-                ..children = <Element>[_path.element]
+                ..children = <Element>[_path!.element]
             ],
           new DivElement()
             ..classes = ['memberItem']
@@ -160,7 +160,7 @@
                 ..text = 'Inbound references ',
               new DivElement()
                 ..classes = ['memberValue']
-                ..children = <Element>[_inbounds.element]
+                ..children = <Element>[_inbounds!.element]
             ]
         ]
     ];
@@ -169,14 +169,14 @@
   List<Element> _createReachableSizeValue() {
     final content = <Element>[];
     if (_reachableSize != null) {
-      if (_reachableSize.isSentinel) {
-        content.add(
-            new SentinelValueElement(_reachableSize.asSentinel, queue: _r.queue)
-                .element);
+      if (_reachableSize!.isSentinel) {
+        content.add(new SentinelValueElement(_reachableSize!.asSentinel!,
+                queue: _r.queue)
+            .element);
       } else {
         content.add(new SpanElement()
           ..text = Utils.formatSize(
-              int.parse(_reachableSize.asValue.valueAsString)));
+              int.parse(_reachableSize!.asValue!.valueAsString!)));
       }
     } else {
       content.add(new SpanElement()..text = '...');
@@ -188,7 +188,7 @@
     button.onClick.listen((_) async {
       button.disabled = true;
       _loadingReachableBytes = true;
-      _reachableSize = await _reachableSizes.get(_isolate, _object.id);
+      _reachableSize = await _reachableSizes.get(_isolate, _object.id!);
       _r.dirty();
     });
     content.add(button);
@@ -198,14 +198,14 @@
   List<Element> _createRetainedSizeValue() {
     final content = <Element>[];
     if (_retainedSize != null) {
-      if (_retainedSize.isSentinel) {
-        content.add(
-            new SentinelValueElement(_retainedSize.asSentinel, queue: _r.queue)
-                .element);
+      if (_retainedSize!.isSentinel) {
+        content.add(new SentinelValueElement(_retainedSize!.asSentinel!,
+                queue: _r.queue)
+            .element);
       } else {
         content.add(new SpanElement()
-          ..text =
-              Utils.formatSize(int.parse(_retainedSize.asValue.valueAsString)));
+          ..text = Utils.formatSize(
+              int.parse(_retainedSize!.asValue!.valueAsString!)));
       }
     } else {
       content.add(new SpanElement()..text = '...');
@@ -217,7 +217,7 @@
     button.onClick.listen((_) async {
       button.disabled = true;
       _loadingRetainedBytes = true;
-      _retainedSize = await _retainedSizes.get(_isolate, _object.id);
+      _retainedSize = await _retainedSizes.get(_isolate, _object.id!);
       _r.dirty();
     });
     content.add(button);
diff --git a/runtime/observatory/lib/src/elements/object_view.dart b/runtime/observatory/lib/src/elements/object_view.dart
index 6a805b4..7ff7708 100644
--- a/runtime/observatory/lib/src/elements/object_view.dart
+++ b/runtime/observatory/lib/src/elements/object_view.dart
@@ -20,25 +20,24 @@
 import 'package:observatory/src/elements/view_footer.dart';
 
 class ObjectViewElement extends CustomElement implements Renderable {
-  RenderingScheduler<ObjectViewElement> _r;
+  late RenderingScheduler<ObjectViewElement> _r;
 
   Stream<RenderedEvent<ObjectViewElement>> get onRendered => _r.onRendered;
 
-  M.VM _vm;
-  M.IsolateRef _isolate;
-  M.EventRepository _events;
-  M.NotificationRepository _notifications;
-  M.Object _object;
-  M.ObjectRepository _objects;
-  M.RetainedSizeRepository _retainedSizes;
-  M.ReachableSizeRepository _reachableSizes;
-  M.InboundReferencesRepository _references;
-  M.RetainingPathRepository _retainingPaths;
+  late M.VM _vm;
+  late M.IsolateRef _isolate;
+  late M.EventRepository _events;
+  late M.NotificationRepository _notifications;
+  late M.Object _object;
+  late M.ObjectRepository _objects;
+  late M.RetainedSizeRepository _retainedSizes;
+  late M.ReachableSizeRepository _reachableSizes;
+  late M.InboundReferencesRepository _references;
+  late M.RetainingPathRepository _retainingPaths;
 
   M.VMRef get vm => _vm;
   M.IsolateRef get isolate => _isolate;
   M.NotificationRepository get notifications => _notifications;
-  M.Context get object => _object;
 
   factory ObjectViewElement(
       M.VM vm,
@@ -51,7 +50,7 @@
       M.ReachableSizeRepository reachableSizes,
       M.InboundReferencesRepository references,
       M.RetainingPathRepository retainingPaths,
-      {RenderingQueue queue}) {
+      {RenderingQueue? queue}) {
     assert(vm != null);
     assert(isolate != null);
     assert(events != null);
@@ -102,7 +101,7 @@
         (new NavRefreshElement(queue: _r.queue)
               ..onRefresh.listen((e) async {
                 e.element.disabled = true;
-                _object = await _objects.get(_isolate, _object.id);
+                _object = await _objects.get(_isolate, _object.id!);
                 _r.dirty();
               }))
             .element,
diff --git a/runtime/observatory/lib/src/elements/objectpool_ref.dart b/runtime/observatory/lib/src/elements/objectpool_ref.dart
index bdebccb..02a6ced 100644
--- a/runtime/observatory/lib/src/elements/objectpool_ref.dart
+++ b/runtime/observatory/lib/src/elements/objectpool_ref.dart
@@ -10,18 +10,18 @@
 import 'package:observatory/src/elements/helpers/uris.dart';
 
 class ObjectPoolRefElement extends CustomElement implements Renderable {
-  RenderingScheduler<ObjectPoolRefElement> _r;
+  late RenderingScheduler<ObjectPoolRefElement> _r;
 
   Stream<RenderedEvent<ObjectPoolRefElement>> get onRendered => _r.onRendered;
 
-  M.IsolateRef _isolate;
-  M.ObjectPoolRef _pool;
+  late M.IsolateRef _isolate;
+  late M.ObjectPoolRef _pool;
 
   M.IsolateRef get isolate => _isolate;
   M.ObjectPoolRef get pool => _pool;
 
   factory ObjectPoolRefElement(M.IsolateRef isolate, M.ObjectPoolRef pool,
-      {RenderingQueue queue}) {
+      {RenderingQueue? queue}) {
     assert(isolate != null);
     assert(pool != null);
     ObjectPoolRefElement e = new ObjectPoolRefElement.created();
diff --git a/runtime/observatory/lib/src/elements/objectpool_view.dart b/runtime/observatory/lib/src/elements/objectpool_view.dart
index 32459bf0..1967324 100644
--- a/runtime/observatory/lib/src/elements/objectpool_view.dart
+++ b/runtime/observatory/lib/src/elements/objectpool_view.dart
@@ -23,21 +23,21 @@
 import 'package:observatory/src/elements/view_footer.dart';
 
 class ObjectPoolViewElement extends CustomElement implements Renderable {
-  RenderingScheduler<ObjectPoolViewElement> _r;
+  late RenderingScheduler<ObjectPoolViewElement> _r;
 
   Stream<RenderedEvent<ObjectPoolViewElement>> get onRendered => _r.onRendered;
 
-  M.VM _vm;
-  M.IsolateRef _isolate;
-  M.EventRepository _events;
-  M.NotificationRepository _notifications;
-  M.ObjectPool _pool;
-  M.ObjectPoolRepository _pools;
-  M.RetainedSizeRepository _retainedSizes;
-  M.ReachableSizeRepository _reachableSizes;
-  M.InboundReferencesRepository _references;
-  M.RetainingPathRepository _retainingPaths;
-  M.ObjectRepository _objects;
+  late M.VM _vm;
+  late M.IsolateRef _isolate;
+  late M.EventRepository _events;
+  late M.NotificationRepository _notifications;
+  late M.ObjectPool _pool;
+  late M.ObjectPoolRepository _pools;
+  late M.RetainedSizeRepository _retainedSizes;
+  late M.ReachableSizeRepository _reachableSizes;
+  late M.InboundReferencesRepository _references;
+  late M.RetainingPathRepository _retainingPaths;
+  late M.ObjectRepository _objects;
 
   M.VMRef get vm => _vm;
   M.IsolateRef get isolate => _isolate;
@@ -56,7 +56,7 @@
       M.InboundReferencesRepository references,
       M.RetainingPathRepository retainingPaths,
       M.ObjectRepository objects,
-      {RenderingQueue queue}) {
+      {RenderingQueue? queue}) {
     assert(vm != null);
     assert(isolate != null);
     assert(events != null);
@@ -109,7 +109,7 @@
         (new NavRefreshElement(queue: _r.queue)
               ..onRefresh.listen((e) async {
                 e.element.disabled = true;
-                _pool = await _pools.get(_isolate, _pool.id);
+                _pool = await _pools.get(_isolate, _pool.id!);
                 _r.dirty();
               }))
             .element,
@@ -125,10 +125,10 @@
                   queue: _r.queue)
               .element,
           new HRElement(),
-          new HeadingElement.h3()..text = 'entries (${_pool.entries.length})',
+          new HeadingElement.h3()..text = 'entries (${_pool.entries!.length})',
           new DivElement()
             ..classes = ['memberList']
-            ..children = _pool.entries
+            ..children = _pool.entries!
                 .map<Element>((entry) => new DivElement()
                   ..classes = ['memberItem']
                   ..children = <Element>[
@@ -154,12 +154,12 @@
       case M.ObjectPoolEntryKind.immediate:
         return [
           new SpanElement()
-            ..text = 'Immediate 0x${entry.asInteger.toRadixString(16)}'
+            ..text = 'Immediate 0x${entry.asInteger!.toRadixString(16)}'
         ];
       case M.ObjectPoolEntryKind.nativeEntry:
         return [
           new SpanElement()
-            ..text = 'NativeEntry 0x${entry.asInteger.toRadixString(16)}'
+            ..text = 'NativeEntry 0x${entry.asInteger!.toRadixString(16)}'
         ];
     }
     throw new Exception('Unknown ObjectPoolEntryKind (${entry.kind})');
diff --git a/runtime/observatory/lib/src/elements/objectstore_view.dart b/runtime/observatory/lib/src/elements/objectstore_view.dart
index 1ffe6dd..59c4003 100644
--- a/runtime/observatory/lib/src/elements/objectstore_view.dart
+++ b/runtime/observatory/lib/src/elements/objectstore_view.dart
@@ -20,17 +20,17 @@
 import 'package:observatory/src/elements/view_footer.dart';
 
 class ObjectStoreViewElement extends CustomElement implements Renderable {
-  RenderingScheduler<ObjectStoreViewElement> _r;
+  late RenderingScheduler<ObjectStoreViewElement> _r;
 
   Stream<RenderedEvent<ObjectStoreViewElement>> get onRendered => _r.onRendered;
 
-  M.VM _vm;
-  M.IsolateRef _isolate;
-  M.EventRepository _events;
-  M.NotificationRepository _notifications;
-  M.ObjectStore _store;
-  M.ObjectStoreRepository _stores;
-  M.ObjectRepository _objects;
+  late M.VM _vm;
+  late M.IsolateRef _isolate;
+  late M.EventRepository _events;
+  late M.NotificationRepository _notifications;
+  M.ObjectStore? _store;
+  late M.ObjectStoreRepository _stores;
+  late M.ObjectRepository _objects;
 
   M.VMRef get vm => _vm;
   M.IsolateRef get isolate => _isolate;
@@ -43,7 +43,7 @@
       M.NotificationRepository notifications,
       M.ObjectStoreRepository stores,
       M.ObjectRepository objects,
-      {RenderingQueue queue}) {
+      {RenderingQueue? queue}) {
     assert(vm != null);
     assert(isolate != null);
     assert(events != null);
@@ -78,7 +78,7 @@
   }
 
   void render() {
-    final fields = _store?.fields?.toList(growable: false);
+    final fields = _store?.fields.toList(growable: false);
     children = <Element>[
       navBar(<Element>[
         new NavTopMenuElement(queue: _r.queue).element,
diff --git a/runtime/observatory/lib/src/elements/observatory_application.dart b/runtime/observatory/lib/src/elements/observatory_application.dart
index 1ba16ef..8d44e45 100644
--- a/runtime/observatory/lib/src/elements/observatory_application.dart
+++ b/runtime/observatory/lib/src/elements/observatory_application.dart
@@ -11,7 +11,7 @@
 /// [ObservatoryApplication] which is passed declaratively to all child
 /// elements.
 class ObservatoryApplicationElement extends CustomElement {
-  ObservatoryApplication app;
+  late ObservatoryApplication app;
 
   ObservatoryApplicationElement.created()
       : super.created('observatory-application');
diff --git a/runtime/observatory/lib/src/elements/pc_descriptors_ref.dart b/runtime/observatory/lib/src/elements/pc_descriptors_ref.dart
index 840be60..afd7fd0 100644
--- a/runtime/observatory/lib/src/elements/pc_descriptors_ref.dart
+++ b/runtime/observatory/lib/src/elements/pc_descriptors_ref.dart
@@ -10,20 +10,20 @@
 import 'package:observatory/src/elements/helpers/uris.dart';
 
 class PcDescriptorsRefElement extends CustomElement implements Renderable {
-  RenderingScheduler<PcDescriptorsRefElement> _r;
+  late RenderingScheduler<PcDescriptorsRefElement> _r;
 
   Stream<RenderedEvent<PcDescriptorsRefElement>> get onRendered =>
       _r.onRendered;
 
-  M.IsolateRef _isolate;
-  M.PcDescriptorsRef _descriptors;
+  late M.IsolateRef _isolate;
+  late M.PcDescriptorsRef _descriptors;
 
   M.IsolateRef get isolate => _isolate;
   M.PcDescriptorsRef get descriptors => _descriptors;
 
   factory PcDescriptorsRefElement(
       M.IsolateRef isolate, M.PcDescriptorsRef descriptors,
-      {RenderingQueue queue}) {
+      {RenderingQueue? queue}) {
     assert(isolate != null);
     assert(descriptors != null);
     PcDescriptorsRefElement e = new PcDescriptorsRefElement.created();
diff --git a/runtime/observatory/lib/src/elements/persistent_handles.dart b/runtime/observatory/lib/src/elements/persistent_handles.dart
index 72eef36..0d8f69b 100644
--- a/runtime/observatory/lib/src/elements/persistent_handles.dart
+++ b/runtime/observatory/lib/src/elements/persistent_handles.dart
@@ -26,18 +26,18 @@
 enum _SortingDirection { ascending, descending }
 
 class PersistentHandlesPageElement extends CustomElement implements Renderable {
-  RenderingScheduler<PersistentHandlesPageElement> _r;
+  late RenderingScheduler<PersistentHandlesPageElement> _r;
 
   Stream<RenderedEvent<PersistentHandlesPageElement>> get onRendered =>
       _r.onRendered;
 
-  M.VM _vm;
-  M.IsolateRef _isolate;
-  M.EventRepository _events;
-  M.NotificationRepository _notifications;
-  M.PersistentHandlesRepository _repository;
-  M.ObjectRepository _objects;
-  M.PersistentHandles _handles;
+  late M.VM _vm;
+  late M.IsolateRef _isolate;
+  late M.EventRepository _events;
+  late M.NotificationRepository _notifications;
+  late M.PersistentHandlesRepository _repository;
+  late M.ObjectRepository _objects;
+  M.PersistentHandles? _handles;
   _SortingField _sortingField = _SortingField.externalSize;
   _SortingDirection _sortingDirection = _SortingDirection.descending;
 
@@ -52,7 +52,7 @@
       M.NotificationRepository notifications,
       M.PersistentHandlesRepository repository,
       M.ObjectRepository objects,
-      {RenderingQueue queue}) {
+      {RenderingQueue? queue}) {
     assert(vm != null);
     assert(isolate != null);
     assert(events != null);
@@ -102,19 +102,19 @@
       ])
     ]
       ..addAll(_createHandlers('Persistent Handles',
-          _handles?.elements?.toList(), _createLine, _updateLine))
+          _handles?.elements.toList(), _createLine, _updateLine))
       ..add(new BRElement())
       ..addAll(_createHandlers(
           'Weak Persistent Handles',
           _handles == null
               ? null
-              : (_handles.weakElements.toList()..sort(_createSorter())),
+              : (_handles!.weakElements.toList()..sort(_createSorter())),
           _createWeakLine,
           _updateWeakLine,
           createHeader: _createWeakHeader));
   }
 
-  List<Element> _createHandlers(String name, List items, create, update,
+  List<Element> _createHandlers(String name, List? items, create, update,
       {createHeader}) {
     return [
       new DivElement()
diff --git a/runtime/observatory/lib/src/elements/ports.dart b/runtime/observatory/lib/src/elements/ports.dart
index b4f32e0..4a40a89 100644
--- a/runtime/observatory/lib/src/elements/ports.dart
+++ b/runtime/observatory/lib/src/elements/ports.dart
@@ -19,17 +19,17 @@
 import 'package:observatory/src/elements/view_footer.dart';
 
 class PortsElement extends CustomElement implements Renderable {
-  RenderingScheduler<PortsElement> _r;
+  late RenderingScheduler<PortsElement> _r;
 
   Stream<RenderedEvent<PortsElement>> get onRendered => _r.onRendered;
 
-  M.VM _vm;
-  M.IsolateRef _isolate;
-  M.EventRepository _events;
-  M.NotificationRepository _notifications;
-  M.PortsRepository _ports;
-  M.ObjectRepository _objects;
-  M.Ports _isolatePorts;
+  late M.VM _vm;
+  late M.IsolateRef _isolate;
+  late M.EventRepository _events;
+  late M.NotificationRepository _notifications;
+  late M.PortsRepository _ports;
+  late M.ObjectRepository _objects;
+  M.Ports? _isolatePorts;
 
   M.IsolateRef get isolate => _isolate;
   M.NotificationRepository get notifications => _notifications;
@@ -43,7 +43,7 @@
       M.NotificationRepository notifications,
       M.PortsRepository ports,
       M.ObjectRepository objects,
-      {RenderingQueue queue}) {
+      {RenderingQueue? queue}) {
     assert(vm != null);
     assert(isolate != null);
     assert(events != null);
@@ -64,7 +64,7 @@
   PortsElement.created() : super.created('ports-page');
 
   int get portCount {
-    return _isolatePorts == null ? 0 : _isolatePorts.elements.length;
+    return _isolatePorts == null ? 0 : _isolatePorts!.elements.length;
   }
 
   @override
@@ -110,7 +110,7 @@
       return const [];
     }
     int i = 0;
-    return _isolatePorts.elements
+    return _isolatePorts!.elements
         .map<Element>((port) => new DivElement()
           ..classes = ['memberItem']
           ..children = <Element>[
diff --git a/runtime/observatory/lib/src/elements/process_snapshot.dart b/runtime/observatory/lib/src/elements/process_snapshot.dart
index 2911f63..66ad120 100644
--- a/runtime/observatory/lib/src/elements/process_snapshot.dart
+++ b/runtime/observatory/lib/src/elements/process_snapshot.dart
@@ -44,24 +44,24 @@
 }
 
 class ProcessSnapshotElement extends CustomElement implements Renderable {
-  RenderingScheduler<ProcessSnapshotElement> _r;
+  late RenderingScheduler<ProcessSnapshotElement> _r;
 
   Stream<RenderedEvent<ProcessSnapshotElement>> get onRendered => _r.onRendered;
 
-  M.VM _vm;
-  M.EventRepository _events;
-  M.NotificationRepository _notifications;
+  late M.VM _vm;
+  late M.EventRepository _events;
+  late M.NotificationRepository _notifications;
   M.NotificationRepository get notifications => _notifications;
   M.VMRef get vm => _vm;
 
   List<Map> _loadedSnapshots = <Map>[];
-  Map selection;
-  Map _snapshotA;
-  Map _snapshotB;
+  Map? selection;
+  Map? _snapshotA;
+  Map? _snapshotB;
 
   factory ProcessSnapshotElement(
       M.VM vm, M.EventRepository events, M.NotificationRepository notifications,
-      {RenderingQueue queue}) {
+      {RenderingQueue? queue}) {
     assert(vm != null);
     assert(events != null);
     assert(notifications != null);
@@ -145,10 +145,10 @@
     input.type = 'file';
     input.multiple = false;
     input.onChange.listen((event) {
-      var file = input.files[0];
+      var file = input.files![0];
       var reader = new FileReader();
       reader.onLoad.listen((event) async {
-        _snapshotLoaded(jsonDecode(reader.result));
+        _snapshotLoaded(jsonDecode(reader.result as String));
       });
       reader.readAsText(file);
     });
@@ -224,7 +224,7 @@
         ],
     ];
     if (selection == null) {
-      selection = _snapshotA["root"];
+      selection = _snapshotA!["root"];
     }
     _createTreeMap(report, new ProcessItemTreeMap(this), selection);
     return report;
diff --git a/runtime/observatory/lib/src/elements/retaining_path.dart b/runtime/observatory/lib/src/elements/retaining_path.dart
index d04865e..33f8575 100644
--- a/runtime/observatory/lib/src/elements/retaining_path.dart
+++ b/runtime/observatory/lib/src/elements/retaining_path.dart
@@ -12,15 +12,15 @@
 import 'package:observatory/src/elements/helpers/custom_element.dart';
 
 class RetainingPathElement extends CustomElement implements Renderable {
-  RenderingScheduler<RetainingPathElement> _r;
+  late RenderingScheduler<RetainingPathElement> _r;
 
   Stream<RenderedEvent<RetainingPathElement>> get onRendered => _r.onRendered;
 
-  M.IsolateRef _isolate;
-  M.ObjectRef _object;
-  M.RetainingPathRepository _retainingPaths;
-  M.ObjectRepository _objects;
-  M.RetainingPath _path;
+  late M.IsolateRef _isolate;
+  late M.ObjectRef _object;
+  late M.RetainingPathRepository _retainingPaths;
+  late M.ObjectRepository _objects;
+  M.RetainingPath? _path;
   bool _expanded = false;
 
   M.IsolateRef get isolate => _isolate;
@@ -28,7 +28,7 @@
 
   factory RetainingPathElement(M.IsolateRef isolate, M.ObjectRef object,
       M.RetainingPathRepository retainingPaths, M.ObjectRepository objects,
-      {RenderingQueue queue}) {
+      {RenderingQueue? queue}) {
     assert(isolate != null);
     assert(object != null);
     assert(retainingPaths != null);
@@ -75,7 +75,7 @@
 
   Future _refresh() async {
     _path = null;
-    _path = await _retainingPaths.get(_isolate, _object.id);
+    _path = await _retainingPaths.get(_isolate, _object.id!);
     _r.dirty();
   }
 
@@ -86,11 +86,11 @@
 
     var elements = <Element>[];
     bool first = true;
-    for (var item in _path.elements) {
+    for (var item in _path!.elements) {
       elements.add(_createItem(item, first));
       first = false;
     }
-    elements.add(_createGCRootItem(_path.gcRootType));
+    elements.add(_createGCRootItem(_path!.gcRootType));
     return elements;
   }
 
diff --git a/runtime/observatory/lib/src/elements/sample_buffer_control.dart b/runtime/observatory/lib/src/elements/sample_buffer_control.dart
index 1ef2186..33d4132d 100644
--- a/runtime/observatory/lib/src/elements/sample_buffer_control.dart
+++ b/runtime/observatory/lib/src/elements/sample_buffer_control.dart
@@ -15,7 +15,7 @@
 }
 
 class SampleBufferControlElement extends CustomElement implements Renderable {
-  RenderingScheduler<SampleBufferControlElement> _r;
+  late RenderingScheduler<SampleBufferControlElement> _r;
 
   Stream<RenderedEvent<SampleBufferControlElement>> get onRendered =>
       _r.onRendered;
@@ -25,13 +25,13 @@
   Stream<SampleBufferControlChangedElement> get onTagChange =>
       _onTagChange.stream;
 
-  M.VM _vm;
-  Stream<M.SampleProfileLoadingProgressEvent> _progressStream;
-  M.SampleProfileLoadingProgress _progress;
-  M.SampleProfileTag _tag;
+  late M.VM _vm;
+  late Stream<M.SampleProfileLoadingProgressEvent> _progressStream;
+  late M.SampleProfileLoadingProgress _progress;
+  late M.SampleProfileTag _tag;
   bool _showTag = false;
   bool _profileVM = false;
-  StreamSubscription _subscription;
+  late StreamSubscription _subscription;
 
   M.SampleProfileLoadingProgress get progress => _progress;
   M.SampleProfileTag get selectedTag => _tag;
@@ -49,7 +49,7 @@
       Stream<M.SampleProfileLoadingProgressEvent> progressStream,
       {M.SampleProfileTag selectedTag: M.SampleProfileTag.none,
       bool showTag: true,
-      RenderingQueue queue}) {
+      RenderingQueue? queue}) {
     assert(progress != null);
     assert(progressStream != null);
     assert(selectedTag != null);
diff --git a/runtime/observatory/lib/src/elements/script_inset.dart b/runtime/observatory/lib/src/elements/script_inset.dart
index 67bac9c..68dc829 100644
--- a/runtime/observatory/lib/src/elements/script_inset.dart
+++ b/runtime/observatory/lib/src/elements/script_inset.dart
@@ -17,22 +17,22 @@
 import 'package:observatory/utils.dart';
 
 class ScriptInsetElement extends CustomElement implements Renderable {
-  RenderingScheduler<ScriptInsetElement> _r;
+  late RenderingScheduler<ScriptInsetElement> _r;
 
   Stream<RenderedEvent<ScriptInsetElement>> get onRendered => _r.onRendered;
 
-  M.IsolateRef _isolate;
-  M.ScriptRef _script;
-  M.Script _loadedScript;
-  M.ScriptRepository _scripts;
-  M.ObjectRepository _objects;
-  M.EventRepository _events;
-  StreamSubscription _subscription;
-  int _startPos;
-  int _endPos;
-  int _currentPos;
-  bool _inDebuggerContext;
-  Iterable _variables;
+  late M.IsolateRef _isolate;
+  late M.ScriptRef _script;
+  M.Script? _loadedScript;
+  late M.ScriptRepository _scripts;
+  late M.ObjectRepository _objects;
+  late M.EventRepository _events;
+  late StreamSubscription _subscription;
+  int? _startPos;
+  int? _endPos;
+  int? _currentPos;
+  late bool _inDebuggerContext;
+  Iterable? _variables;
 
   M.IsolateRef get isolate => _isolate;
   M.ScriptRef get script => _script;
@@ -43,12 +43,12 @@
       M.ScriptRepository scripts,
       M.ObjectRepository objects,
       M.EventRepository events,
-      {int startPos,
-      int endPos,
-      int currentPos,
+      {int? startPos,
+      int? endPos,
+      int? currentPos,
       bool inDebuggerContext: false,
       Iterable variables: const [],
-      RenderingQueue queue}) {
+      RenderingQueue? queue}) {
     assert(isolate != null);
     assert(script != null);
     assert(scripts != null);
@@ -73,7 +73,7 @@
 
   ScriptInsetElement.created() : super.created('script-inset');
 
-  bool get noSource => _startPos == -1 || _loadedScript.source == null;
+  bool get noSource => _startPos == -1 || _loadedScript!.source == null;
 
   @override
   void attached() {
@@ -83,11 +83,11 @@
         .where((e) => e is M.BreakpointEvent)
         .map((e) => (e as M.BreakpointEvent).breakpoint)
         .listen((M.Breakpoint b) async {
-      final M.Location loc = b.location;
-      int line;
+      final M.Location loc = b.location!;
+      int? line;
       if (loc.script.id == script.id) {
         if (loc.tokenPos != null) {
-          line = _loadedScript.tokenToLine(loc.tokenPos);
+          line = _loadedScript!.tokenToLine(loc.tokenPos!);
         } else {
           line = (loc as dynamic).line;
         }
@@ -96,12 +96,12 @@
           line = (loc as dynamic).line;
         } on NoSuchMethodError {
           if (loc.tokenPos != null) {
-            M.Script scriptUsed = await _scripts.get(_isolate, loc.script.id);
-            line = scriptUsed.tokenToLine(loc.tokenPos);
+            M.Script scriptUsed = await _scripts.get(_isolate, loc.script.id!);
+            line = scriptUsed.tokenToLine(loc.tokenPos!);
           }
         }
       }
-      if ((line == null) || ((line >= _startLine) && (line <= _endLine))) {
+      if ((line == null) || ((line >= _startLine!) && (line <= _endLine!))) {
         _r.dirty();
       }
     });
@@ -130,9 +130,9 @@
 
         firstBuild = true;
       }
-      children = <Element>[container];
-      container.children.clear();
-      container.children.add(table);
+      children = <Element>[container!];
+      container!.children.clear();
+      container!.children.add(table);
       _makeCssClassUncopyable(table, "noCopy");
       if (firstBuild) {
         _scrollToCurrentPos();
@@ -141,19 +141,19 @@
   }
 
   Future _refresh() async {
-    _loadedScript = await _scripts.get(_isolate, _script.id);
+    _loadedScript = await _scripts.get(_isolate, _script.id!);
     await _refreshSourceReport();
     await _computeAnnotations();
     _r.dirty();
   }
 
-  ButtonElement _refreshButton;
-  ButtonElement _toggleProfileButton;
+  ButtonElement? _refreshButton;
+  ButtonElement? _toggleProfileButton;
 
-  int _currentLine;
-  int _currentCol;
-  int _startLine;
-  int _endLine;
+  int? _currentLine;
+  int? _currentCol;
+  int? _startLine;
+  int? _endLine;
 
   Map/*<int, List<S.ServiceMap>>*/ _rangeMap = {};
   Set _callSites = new Set<S.CallSite>();
@@ -165,7 +165,7 @@
 
   bool _includeProfile = false;
 
-  String makeLineClass(int line) {
+  String makeLineClass(int? line) {
     return 'script-inset-line-$line';
   }
 
@@ -215,7 +215,7 @@
     return element;
   }
 
-  Element container;
+  Element? container;
 
   // Build _rangeMap and _callSites from a source report.
   Future _refreshSourceReport() async {
@@ -229,16 +229,16 @@
       reports.add(S.Isolate.kProfileReport);
     }
     S.Isolate isolate = _isolate as S.Isolate;
-    dynamic sourceReport =
-        await isolate.getSourceReport(reports, script, _startPos, _endPos);
+    dynamic sourceReport = await isolate.getSourceReport(
+        reports, script as S.Script, _startPos, _endPos);
     _possibleBreakpointLines =
-        S.getPossibleBreakpointLines(sourceReport, script);
+        S.getPossibleBreakpointLines(sourceReport, script as S.Script);
     _rangeMap.clear();
     _callSites.clear();
     _profileMap.clear();
     for (var range in sourceReport['ranges']) {
-      int startLine = _loadedScript.tokenToLine(range['startPos']);
-      int endLine = _loadedScript.tokenToLine(range['endPos']);
+      int? startLine = _loadedScript!.tokenToLine(range['startPos']);
+      int? endLine = _loadedScript!.tokenToLine(range['endPos']);
       // TODO(turnidge): Track down the root cause of null startLine/endLine.
       if ((startLine != null) && (endLine != null)) {
         for (var line = startLine; line <= endLine; line++) {
@@ -263,10 +263,10 @@
             // TODO(johnmccutchan): Add classifier data to UI.
             continue;
           }
-          int line = _loadedScript.tokenToLine(positions[i]);
-          ScriptLineProfile lineProfile = _profileMap[line];
+          int? line = _loadedScript!.tokenToLine(positions[i]);
+          ScriptLineProfile? lineProfile = _profileMap[line];
           if (lineProfile == null) {
-            lineProfile = new ScriptLineProfile(line, sampleCount);
+            lineProfile = new ScriptLineProfile(line!, sampleCount);
             _profileMap[line] = lineProfile;
           }
           lineProfile.process(exclusiveTicks[i], inclusiveTicks[i]);
@@ -276,7 +276,8 @@
         var rangeCallSites = range['callSites'];
         if (rangeCallSites != null) {
           for (var callSiteMap in rangeCallSites) {
-            _callSites.add(new S.CallSite.fromMap(callSiteMap, script));
+            _callSites
+                .add(new S.CallSite.fromMap(callSiteMap, script as S.Script));
           }
         }
       }
@@ -287,21 +288,22 @@
     if (noSource) return;
 
     _startLine = (_startPos != null
-        ? _loadedScript.tokenToLine(_startPos)
-        : 1 + _loadedScript.lineOffset);
+        ? _loadedScript!.tokenToLine(_startPos!)
+        : 1 + _loadedScript!.lineOffset!);
     _currentLine =
-        (_currentPos != null ? _loadedScript.tokenToLine(_currentPos) : null);
-    _currentCol =
-        (_currentPos != null ? (_loadedScript.tokenToCol(_currentPos)) : null);
+        (_currentPos != null ? _loadedScript!.tokenToLine(_currentPos!) : null);
+    _currentCol = (_currentPos != null
+        ? (_loadedScript!.tokenToCol(_currentPos!))
+        : null);
     if (_currentCol != null) {
-      _currentCol--; // make this 0-based.
+      _currentCol = _currentCol! - 1; // make this 0-based.
     }
 
     S.Script script = _loadedScript as S.Script;
 
     _endLine = (_endPos != null
-        ? _loadedScript.tokenToLine(_endPos)
-        : script.lines.length + _loadedScript.lineOffset);
+        ? _loadedScript!.tokenToLine(_endPos!)
+        : script.lines.length + _loadedScript!.lineOffset!);
 
     if (_startLine == null || _endLine == null) {
       return;
@@ -313,7 +315,7 @@
     addBreakpointAnnotations();
 
     if (!_inDebuggerContext && script.library != null) {
-      await loadDeclarationsOfLibrary(script.library);
+      await loadDeclarationsOfLibrary(script.library!);
       addLibraryAnnotations();
       addDependencyAnnotations();
       addPartAnnotations();
@@ -331,22 +333,22 @@
   void addCurrentExecutionAnnotation() {
     if (_currentLine != null) {
       var a = new CurrentExecutionAnnotation(_isolate, _objects, _r.queue);
-      a.line = _currentLine;
-      a.columnStart = _currentCol;
+      a.line = _currentLine!;
+      a.columnStart = _currentCol!;
       S.Script script = _loadedScript as S.Script;
-      var length = script.guessTokenLength(_currentLine, _currentCol);
+      var length = script.guessTokenLength(_currentLine!, _currentCol!);
       if (length == null) {
         length = 1;
       }
-      a.columnStop = _currentCol + length;
+      a.columnStop = _currentCol! + length;
       _annotations.add(a);
     }
   }
 
   void addBreakpointAnnotations() {
     S.Script script = _loadedScript as S.Script;
-    for (var line = _startLine; line <= _endLine; line++) {
-      var bpts = script.getLine(line).breakpoints;
+    for (var line = _startLine!; line <= _endLine!; line++) {
+      var bpts = script.getLine(line)!.breakpoints;
       if (bpts != null) {
         for (var bpt in bpts) {
           if (bpt.location != null) {
@@ -360,7 +362,7 @@
 
   Future loadDeclarationsOfLibrary(S.Library lib) {
     return lib.load().then((serviceObject) {
-      S.Library lib = serviceObject;
+      S.Library lib = serviceObject as S.Library;
       var loads = <Future>[];
       for (var func in lib.functions) {
         loads.add(func.load());
@@ -377,7 +379,7 @@
 
   Future loadDeclarationsOfClass(S.Class cls) {
     return cls.load().then((serviceObject) {
-      S.Class cls = serviceObject;
+      S.Class cls = serviceObject as S.Class;
       var loads = <Future>[];
       for (var func in cls.functions) {
         loads.add(func.load());
@@ -393,30 +395,30 @@
     S.Script script = _loadedScript as S.Script;
     for (S.ScriptLine line in script.lines) {
       // TODO(rmacnak): Use a real scanner.
-      var pattern = new RegExp("library ${script.library.name}");
+      var pattern = new RegExp("library ${script.library!.name!}");
       var match = pattern.firstMatch(line.text);
       if (match != null) {
         var anno = new LibraryAnnotation(
             _isolate,
             _objects,
             _r.queue,
-            _loadedScript.library,
-            Uris.inspect(isolate, object: _loadedScript.library));
+            _loadedScript!.library as S.Library,
+            Uris.inspect(isolate, object: _loadedScript!.library));
         anno.line = line.line;
         anno.columnStart = match.start + 8;
         anno.columnStop = match.end;
         _annotations.add(anno);
       }
       // TODO(rmacnak): Use a real scanner.
-      pattern = new RegExp("part of ${script.library.name}");
+      pattern = new RegExp("part of ${script.library!.name!}");
       match = pattern.firstMatch(line.text);
       if (match != null) {
         var anno = new LibraryAnnotation(
             _isolate,
             _objects,
             _r.queue,
-            _loadedScript.library,
-            Uris.inspect(isolate, object: _loadedScript.library));
+            _loadedScript!.library as S.Library,
+            Uris.inspect(isolate, object: _loadedScript!.library));
         anno.line = line.line;
         anno.columnStart = match.start + 8;
         anno.columnStop = match.end;
@@ -425,22 +427,23 @@
     }
   }
 
-  M.Library resolveDependency(String relativeUri) {
+  S.Library? resolveDependency(String relativeUri) {
     S.Script script = _loadedScript as S.Script;
     // This isn't really correct: we need to ask the embedder to do the
     // uri canonicalization for us, but Observatory isn't in a position
     // to invoke the library tag handler. Handle the most common cases.
-    var targetUri = Uri.parse(_loadedScript.library.uri).resolve(relativeUri);
-    for (M.Library l in script.isolate.libraries) {
+    var targetUri =
+        Uri.parse(_loadedScript!.library!.uri!).resolve(relativeUri);
+    for (M.Library l in script.isolate!.libraries) {
       if (targetUri.toString() == l.uri) {
-        return l;
+        return l as S.Library;
       }
     }
     if (targetUri.scheme == 'package') {
       var targetUriString = "packages/${targetUri.path}";
-      for (M.Library l in script.isolate.libraries) {
+      for (M.Library l in script.isolate!.libraries) {
         if (targetUriString == l.uri) {
-          return l;
+          return l as S.Library;
         }
       }
     }
@@ -462,10 +465,10 @@
       for (var pattern in patterns) {
         var match = pattern.firstMatch(line.text);
         if (match != null) {
-          M.Library target = resolveDependency(match[1]);
+          M.Library? target = resolveDependency(match[1]!);
           if (target != null) {
             var anno = new LibraryAnnotation(_isolate, _objects, _r.queue,
-                target, Uris.inspect(isolate, object: target));
+                target as S.Library, Uris.inspect(isolate, object: target));
             anno.line = line.line;
             anno.columnStart = match.start + 8;
             anno.columnStop = match.end - 1;
@@ -476,17 +479,17 @@
     }
   }
 
-  M.Script resolvePart(String relativeUri) {
+  S.Script? resolvePart(String relativeUri) {
     S.Script script = _loadedScript as S.Script;
-    var rootUri = Uri.parse(script.library.uri);
+    var rootUri = Uri.parse(script.library!.uri!);
     if (rootUri.scheme == 'dart') {
       // The relative paths from dart:* libraries to their parts are not valid.
-      rootUri = Uri.parse(script.library.uri + '/');
+      rootUri = Uri.parse(script.library!.uri! + '/');
     }
     var targetUri = rootUri.resolve(relativeUri);
-    for (M.Script s in script.library.scripts) {
+    for (M.Script s in script.library!.scripts) {
       if (targetUri.toString() == s.uri) {
-        return s;
+        return s as S.Script?;
       }
     }
     print("Could not resolve part: $relativeUri");
@@ -504,7 +507,7 @@
       for (var pattern in patterns) {
         var match = pattern.firstMatch(line.text);
         if (match != null) {
-          S.Script part = resolvePart(match[1]);
+          S.Script? part = resolvePart(match[1]!);
           if (part != null) {
             var anno = new PartAnnotation(_isolate, _objects, _r.queue, part,
                 Uris.inspect(isolate, object: part));
@@ -520,8 +523,8 @@
 
   void addClassAnnotations() {
     S.Script script = _loadedScript as S.Script;
-    for (var cls in script.library.classes) {
-      if ((cls.location != null) && (cls.location.script == script)) {
+    for (var cls in script.library!.classes) {
+      if ((cls.location != null) && (cls.location!.script == script)) {
         var a = new ClassDeclarationAnnotation(_isolate, _objects, _r.queue,
             cls, Uris.inspect(isolate, object: cls));
         _annotations.add(a);
@@ -531,16 +534,16 @@
 
   void addFieldAnnotations() {
     S.Script script = _loadedScript as S.Script;
-    for (var field in script.library.variables) {
-      if ((field.location != null) && (field.location.script == script)) {
+    for (var field in script.library!.variables) {
+      if ((field.location != null) && (field.location!.script == script)) {
         var a = new FieldDeclarationAnnotation(_isolate, _objects, _r.queue,
             field, Uris.inspect(isolate, object: field));
         _annotations.add(a);
       }
     }
-    for (var cls in script.library.classes) {
+    for (var cls in script.library!.classes) {
       for (var field in cls.fields) {
-        if ((field.location != null) && (field.location.script == script)) {
+        if ((field.location != null) && (field.location!.script == script)) {
           var a = new FieldDeclarationAnnotation(_isolate, _objects, _r.queue,
               field, Uris.inspect(isolate, object: field));
           _annotations.add(a);
@@ -551,9 +554,9 @@
 
   void addFunctionAnnotations() {
     S.Script script = _loadedScript as S.Script;
-    for (var func in script.library.functions) {
+    for (var func in script.library!.functions) {
       if ((func.location != null) &&
-          (func.location.script == script) &&
+          (func.location!.script == script) &&
           (func.kind != M.FunctionKind.implicitGetter) &&
           (func.kind != M.FunctionKind.implicitSetter)) {
         // We annotate a field declaration with the field instead of the
@@ -563,11 +566,11 @@
         _annotations.add(a);
       }
     }
-    for (var cls in script.library.classes) {
+    for (var cls in script.library!.classes) {
       S.Script script = _loadedScript as S.Script;
       for (var func in cls.functions) {
         if ((func.location != null) &&
-            (func.location.script == script) &&
+            (func.location!.script == script) &&
             (func.kind != M.FunctionKind.implicitGetter) &&
             (func.kind != M.FunctionKind.implicitSetter)) {
           // We annotate a field declaration with the field instead of the
@@ -592,7 +595,7 @@
     // We have local variable information.
     if (_variables != null) {
       // For each variable.
-      for (var variable in _variables) {
+      for (var variable in _variables!) {
         // Find variable usage locations.
         var locations = script.scanForLocalVariableLocations(
             variable['name'], variable['_tokenPos'], variable['_endTokenPos']);
@@ -615,7 +618,7 @@
       button.disabled = false;
     });
     button.title = 'Refresh coverage';
-    button.children = <Element>[_iconRefresh.clone(true)];
+    button.children = <Element>[_iconRefresh.clone(true) as Element];
     return button;
   }
 
@@ -631,7 +634,7 @@
       _refresh();
       button.disabled = false;
     });
-    button.children = <Element>[_iconWhatsHot.clone(true)];
+    button.children = <Element>[_iconWhatsHot.clone(true) as Element];
     return button;
   }
 
@@ -642,23 +645,23 @@
 
     _refreshButton = _newRefreshButton();
     _toggleProfileButton = _newToggleProfileButton();
-    table.append(_refreshButton);
-    table.append(_toggleProfileButton);
+    table.append(_refreshButton!);
+    table.append(_toggleProfileButton!);
 
     if (_startLine == null || _endLine == null) {
       return table;
     }
 
     var endLine = (_endPos != null
-        ? _loadedScript.tokenToLine(_endPos)
-        : script.lines.length + _loadedScript.lineOffset);
+        ? _loadedScript!.tokenToLine(_endPos!)
+        : script.lines.length + _loadedScript!.lineOffset!);
     var lineNumPad = endLine.toString().length;
 
     _annotationsCursor = 0;
 
     int blankLineCount = 0;
-    for (int i = _startLine; i <= _endLine; i++) {
-      var line = script.getLine(i);
+    for (int i = _startLine!; i <= _endLine!; i++) {
+      var line = script.getLine(i)!;
       if (line.isBlank) {
         // Try to introduce ellipses if there are 4 or more contiguous
         // blank lines.
@@ -688,7 +691,7 @@
   }
 
   // Assumes annotations are sorted.
-  Annotation nextAnnotationOnLine(int line) {
+  Annotation? nextAnnotationOnLine(int line) {
     if (_annotationsCursor >= _annotations.length) return null;
     var annotation = _annotations[_annotationsCursor];
 
@@ -706,7 +709,7 @@
     return annotation;
   }
 
-  Element lineElement(S.ScriptLine line, int lineNumPad) {
+  Element lineElement(S.ScriptLine? line, int lineNumPad) {
     var e = new DivElement();
     e.classes.add("sourceRow");
     e.append(lineBreakpointElement(line));
@@ -719,7 +722,7 @@
     return e;
   }
 
-  Element lineProfileElement(S.ScriptLine line, bool self) {
+  Element lineProfileElement(S.ScriptLine? line, bool self) {
     var e = span('');
     e.classes.add('noCopy');
     if (self) {
@@ -741,7 +744,7 @@
       return e;
     }
 
-    ScriptLineProfile lineProfile = _profileMap[line.line];
+    ScriptLineProfile? lineProfile = _profileMap[line.line];
     if (lineProfile == null) {
       e.classes.add('noProfile');
       e.text = nbsp;
@@ -765,7 +768,7 @@
     return e;
   }
 
-  Element lineBreakpointElement(S.ScriptLine line) {
+  Element lineBreakpointElement(S.ScriptLine? line) {
     var e = new DivElement();
     if (line == null || !_possibleBreakpointLines.contains(line.line)) {
       e.classes.add('noCopy');
@@ -783,8 +786,8 @@
         e.classes.add("busyBreakpoint");
       } else if (line.breakpoints != null) {
         bool resolved = false;
-        for (var bpt in line.breakpoints) {
-          if (bpt.resolved) {
+        for (var bpt in line.breakpoints!) {
+          if (bpt.resolved!) {
             resolved = true;
             break;
           }
@@ -806,7 +809,7 @@
       busy = true;
       if (line.breakpoints == null) {
         // No breakpoint.  Add it.
-        line.script.isolate
+        line.script.isolate!
             .addBreakpoint(line.script, line.line)
             .catchError((e, st) {
           if (e is! S.ServerRpcException ||
@@ -821,8 +824,8 @@
       } else {
         // Existing breakpoint.  Remove it.
         List<Future> pending = [];
-        for (var bpt in line.breakpoints) {
-          pending.add(line.script.isolate.removeBreakpoint(bpt));
+        for (var bpt in line.breakpoints!) {
+          pending.add(line.script.isolate!.removeBreakpoint(bpt));
         }
         Future.wait(pending).then((_) {
           busy = false;
@@ -835,7 +838,7 @@
     return e;
   }
 
-  Element lineNumberElement(S.ScriptLine line, int lineNumPad) {
+  Element lineNumberElement(S.ScriptLine? line, int lineNumPad) {
     var lineNumber = line == null ? "..." : line.line;
     var e =
         span("$nbsp${lineNumber.toString().padLeft(lineNumPad, nbsp)}$nbsp");
@@ -856,7 +859,7 @@
     for (var range in ranges) {
       if (range['compiled']) {
         for (var callSite in range['callSites']) {
-          var callLine = line.script.tokenToLine(callSite['tokenPos']);
+          var callLine = line!.script.tokenToLine(callSite['tokenPos']);
           if (lineNumber == callLine) {
             // The call site is on the current line.
             hasCallInfo = true;
@@ -888,7 +891,7 @@
     return e;
   }
 
-  Element lineSourceElement(S.ScriptLine line) {
+  Element lineSourceElement(S.ScriptLine? line) {
     var e = new DivElement();
     e.classes.add("sourceItem");
 
@@ -916,10 +919,11 @@
       }
 
       // TODO(rmacnak): Tolerate overlapping annotations.
-      var annotation;
-      while ((annotation = nextAnnotationOnLine(line.line)) != null) {
+      var annotation = nextAnnotationOnLine(line.line);
+      while (annotation != null) {
         consumeUntil(annotation.columnStart);
         annotation.applyStyleTo(consumeUntil(annotation.columnStop));
+        annotation = nextAnnotationOnLine(line.line);
       }
       consumeUntil(line.text.length);
     }
@@ -935,7 +939,8 @@
   /// children have been added, and only supports one node at a time.
   static void _makeCssClassUncopyable(Element root, String className) {
     var noCopyNodes = root.getElementsByClassName(className);
-    for (HtmlElement node in noCopyNodes) {
+    for (Node n in noCopyNodes) {
+      var node = n as HtmlElement;
       node.style.setProperty('-moz-user-select', 'none');
       node.style.setProperty('-khtml-user-select', 'none');
       node.style.setProperty('-webkit-user-select', 'none');
@@ -945,11 +950,13 @@
     root.onCopy.listen((event) {
       // Mark the nodes as hidden before the copy happens, then mark them as
       // visible on the next event loop turn.
-      for (HtmlElement node in noCopyNodes) {
+      for (Node n in noCopyNodes) {
+        var node = n as HtmlElement;
         node.style.visibility = 'hidden';
       }
       Timer.run(() {
-        for (HtmlElement node in noCopyNodes) {
+        for (Node n in noCopyNodes) {
+          var node = n as HtmlElement;
           node.style.visibility = 'visible';
         }
       });
@@ -999,10 +1006,10 @@
 abstract class Annotation implements Comparable<Annotation> {
   M.IsolateRef _isolate;
   M.ObjectRepository _objects;
-  RenderingQueue queue;
-  int line;
-  int columnStart;
-  int columnStop;
+  RenderingQueue? queue;
+  int? line;
+  int? columnStart;
+  int? columnStop;
   int get priority;
 
   Annotation(this._isolate, this._objects, this.queue);
@@ -1014,9 +1021,9 @@
       if (columnStart == other.columnStart) {
         return priority.compareTo(other.priority);
       }
-      return columnStart.compareTo(other.columnStart);
+      return columnStart!.compareTo(other.columnStart!);
     }
-    return line.compareTo(other.line);
+    return line!.compareTo(other.line!);
   }
 
   Element table() {
@@ -1053,7 +1060,7 @@
   int priority = 0; // highest priority.
 
   CurrentExecutionAnnotation(
-      M.IsolateRef isolate, M.ObjectRepository objects, RenderingQueue queue)
+      M.IsolateRef isolate, M.ObjectRepository objects, RenderingQueue? queue)
       : super(isolate, objects, queue);
 
   void applyStyleTo(element) {
@@ -1070,37 +1077,34 @@
   int priority = 1;
 
   BreakpointAnnotation(M.IsolateRef isolate, M.ObjectRepository objects,
-      RenderingQueue queue, this.bpt)
+      RenderingQueue? queue, this.bpt)
       : super(isolate, objects, queue) {
-    S.Script script = bpt.location.script;
-    var location = bpt.location;
+    S.Script script = bpt.location!.script as S.Script;
+    var location = bpt.location!;
     if (location.tokenPos != null) {
-      var pos = location.tokenPos;
+      var pos = location.tokenPos!;
       line = script.tokenToLine(pos);
-      columnStart = script.tokenToCol(pos) - 1; // tokenToCol is 1-origin.
+      columnStart = script.tokenToCol(pos)! - 1; // tokenToCol is 1-origin.
     } else if (location is M.UnresolvedSourceLocation) {
-      line = location.line;
-      columnStart = location.column;
-      if (columnStart == null) {
-        columnStart = 0;
-      }
+      line = location.line!;
+      columnStart = location.column ?? 0;
     }
-    var length = script.guessTokenLength(line, columnStart);
+    var length = script.guessTokenLength(line!, columnStart!);
     if (length == null) {
       length = 1;
     }
-    columnStop = columnStart + length;
+    columnStop = columnStart! + length;
   }
 
   void applyStyleTo(element) {
     if (element == null) {
       return; // TODO(rmacnak): Handling overlapping annotations.
     }
-    S.Script script = bpt.location.script;
-    var pos = bpt.location.tokenPos;
-    int line = script.tokenToLine(pos);
-    int column = script.tokenToCol(pos);
-    if (bpt.resolved) {
+    S.Script script = bpt.location!.script as S.Script;
+    int? pos = bpt.location!.tokenPos;
+    int? line = script.tokenToLine(pos);
+    int? column = script.tokenToCol(pos);
+    if (bpt.resolved!) {
       element.classes.add("resolvedBreakAnnotation");
     } else {
       element.classes.add("unresolvedBreakAnnotation");
@@ -1115,7 +1119,7 @@
   int priority = 2;
 
   LibraryAnnotation(M.IsolateRef isolate, M.ObjectRepository objects,
-      RenderingQueue queue, this.target, this.url)
+      RenderingQueue? queue, this.target, this.url)
       : super(isolate, objects, queue);
 
   void applyStyleTo(element) {
@@ -1133,7 +1137,7 @@
   int priority = 2;
 
   PartAnnotation(M.IsolateRef isolate, M.ObjectRepository objects,
-      RenderingQueue queue, this.part, this.url)
+      RenderingQueue? queue, this.part, this.url)
       : super(isolate, objects, queue);
 
   void applyStyleTo(element) {
@@ -1150,7 +1154,7 @@
   int priority = 2;
 
   LocalVariableAnnotation(M.IsolateRef isolate, M.ObjectRepository objects,
-      RenderingQueue queue, S.LocalVarLocation location, this.value)
+      RenderingQueue? queue, S.LocalVarLocation location, this.value)
       : super(isolate, objects, queue) {
     line = location.line;
     columnStart = location.column;
@@ -1171,17 +1175,17 @@
   int priority = 2;
 
   CallSiteAnnotation(M.IsolateRef isolate, M.ObjectRepository objects,
-      RenderingQueue queue, this.callSite)
+      RenderingQueue? queue, this.callSite)
       : super(isolate, objects, queue) {
     line = callSite.line;
     columnStart = callSite.column - 1; // Call site is 1-origin.
-    var tokenLength = callSite.script.guessTokenLength(line, columnStart);
+    var tokenLength = callSite.script.guessTokenLength(line!, columnStart!);
     if (tokenLength == null) {
       tokenLength = callSite.name.length; // Approximate.
       if (callSite.name.startsWith("get:") || callSite.name.startsWith("set:"))
         tokenLength -= 4;
     }
-    columnStop = columnStart + tokenLength;
+    columnStop = columnStart! + tokenLength;
   }
 
   void applyStyleTo(element) {
@@ -1224,7 +1228,7 @@
   int priority = 2;
 
   DeclarationAnnotation(M.IsolateRef isolate, M.ObjectRepository objects,
-      RenderingQueue queue, decl, this.url)
+      RenderingQueue? queue, decl, this.url)
       : super(isolate, objects, queue) {
     assert(decl.loaded);
     S.SourceLocation location = decl.location;
@@ -1243,18 +1247,18 @@
       columnStart = 0;
       columnStop = 0;
     } else {
-      columnStart--; // 1-origin -> 0-origin.
+      columnStart = columnStart! - 1; // 1-origin -> 0-origin.
 
       // The method's token position is at the beginning of the method
       // declaration, which may be a return type annotation, metadata, static
       // modifier, etc. Try to scan forward to position this annotation on the
       // function's name instead.
-      var lineSource = script.getLine(line).text;
-      var betterStart = lineSource.indexOf(decl.name, columnStart);
+      var lineSource = script.getLine(line!)!.text;
+      var betterStart = lineSource.indexOf(decl.name, columnStart!);
       if (betterStart != -1) {
         columnStart = betterStart;
       }
-      columnStop = columnStart + decl.name.length;
+      columnStop = columnStart! + (decl.name.length as int);
     }
   }
 }
@@ -1263,7 +1267,7 @@
   S.Class klass;
 
   ClassDeclarationAnnotation(M.IsolateRef isolate, M.ObjectRepository objects,
-      RenderingQueue queue, S.Class cls, String url)
+      RenderingQueue? queue, S.Class cls, String url)
       : klass = cls,
         super(isolate, objects, queue, cls, url);
 
@@ -1280,7 +1284,7 @@
   S.Field field;
 
   FieldDeclarationAnnotation(M.IsolateRef isolate, M.ObjectRepository objects,
-      RenderingQueue queue, S.Field fld, String url)
+      RenderingQueue? queue, S.Field fld, String url)
       : field = fld,
         super(isolate, objects, queue, fld, url);
 
@@ -1300,7 +1304,7 @@
   FunctionDeclarationAnnotation(
       M.IsolateRef isolate,
       M.ObjectRepository objects,
-      RenderingQueue queue,
+      RenderingQueue? queue,
       S.ServiceFunction func,
       String url)
       : function = func,
@@ -1317,14 +1321,14 @@
     if (function.isInlinable == false) {
       tooltip += "\nNot inlinable!";
     }
-    if (function.deoptimizations > 0) {
+    if (function.deoptimizations! > 0) {
       tooltip += "\nDeoptimized ${function.deoptimizations} times!";
     }
     element.title = tooltip;
 
     if (function.isOptimizable == false ||
         function.isInlinable == false ||
-        function.deoptimizations > 0) {
+        function.deoptimizations! > 0) {
       element.style.backgroundColor = "#EEA7A7"; // Low-saturation red.
     }
 
diff --git a/runtime/observatory/lib/src/elements/script_ref.dart b/runtime/observatory/lib/src/elements/script_ref.dart
index a09841b..4a851b9 100644
--- a/runtime/observatory/lib/src/elements/script_ref.dart
+++ b/runtime/observatory/lib/src/elements/script_ref.dart
@@ -12,18 +12,18 @@
 import 'package:observatory/src/elements/helpers/uris.dart';
 
 class ScriptRefElement extends CustomElement implements Renderable {
-  RenderingScheduler<ScriptRefElement> _r;
+  late RenderingScheduler<ScriptRefElement> _r;
 
   Stream<RenderedEvent<ScriptRefElement>> get onRendered => _r.onRendered;
 
-  M.IsolateRef _isolate;
-  M.ScriptRef _script;
+  late M.IsolateRef _isolate;
+  late M.ScriptRef _script;
 
   M.IsolateRef get isolate => _isolate;
   M.ScriptRef get script => _script;
 
   factory ScriptRefElement(M.IsolateRef isolate, M.ScriptRef script,
-      {RenderingQueue queue}) {
+      {RenderingQueue? queue}) {
     assert(isolate != null);
     assert(script != null);
     ScriptRefElement e = new ScriptRefElement.created();
@@ -49,14 +49,14 @@
   }
 
   void render() {
-    var displayUri = script.uri.split('/').last;
+    var displayUri = script.uri!.split('/').last;
     if (displayUri.isEmpty) {
       displayUri = 'N/A';
     }
 
     children = <Element>[
       new AnchorElement(href: Uris.inspect(isolate, object: script))
-        ..title = script.uri
+        ..title = script.uri!
         ..text = displayUri
     ];
   }
diff --git a/runtime/observatory/lib/src/elements/script_view.dart b/runtime/observatory/lib/src/elements/script_view.dart
index eb1d209..44fb84e 100644
--- a/runtime/observatory/lib/src/elements/script_view.dart
+++ b/runtime/observatory/lib/src/elements/script_view.dart
@@ -24,22 +24,22 @@
 import 'package:observatory/src/elements/view_footer.dart';
 
 class ScriptViewElement extends CustomElement implements Renderable {
-  RenderingScheduler<ScriptViewElement> _r;
+  late RenderingScheduler<ScriptViewElement> _r;
 
   Stream<RenderedEvent<ScriptViewElement>> get onRendered => _r.onRendered;
 
-  M.VM _vm;
-  M.IsolateRef _isolate;
-  M.EventRepository _events;
-  M.NotificationRepository _notifications;
-  M.Script _script;
-  M.ScriptRepository _scripts;
-  M.RetainedSizeRepository _retainedSizes;
-  M.ReachableSizeRepository _reachableSizes;
-  M.InboundReferencesRepository _references;
-  M.RetainingPathRepository _retainingPaths;
-  M.ObjectRepository _objects;
-  int _pos;
+  late M.VM _vm;
+  late M.IsolateRef _isolate;
+  late M.EventRepository _events;
+  late M.NotificationRepository _notifications;
+  late M.Script _script;
+  late M.ScriptRepository _scripts;
+  late M.RetainedSizeRepository _retainedSizes;
+  late M.ReachableSizeRepository _reachableSizes;
+  late M.InboundReferencesRepository _references;
+  late M.RetainingPathRepository _retainingPaths;
+  late M.ObjectRepository _objects;
+  int? _pos;
 
   M.VMRef get vm => _vm;
   M.IsolateRef get isolate => _isolate;
@@ -58,8 +58,8 @@
       M.InboundReferencesRepository references,
       M.RetainingPathRepository retainingPaths,
       M.ObjectRepository objects,
-      {int pos,
-      RenderingQueue queue}) {
+      {int? pos,
+      RenderingQueue? queue}) {
     assert(vm != null);
     assert(isolate != null);
     assert(events != null);
@@ -109,13 +109,13 @@
         new NavTopMenuElement(queue: _r.queue).element,
         new NavVMMenuElement(_vm, _events, queue: _r.queue).element,
         new NavIsolateMenuElement(_isolate, _events, queue: _r.queue).element,
-        new NavLibraryMenuElement(_isolate, _script.library, queue: _r.queue)
+        new NavLibraryMenuElement(_isolate, _script.library!, queue: _r.queue)
             .element,
         navMenu('object'),
         (new NavRefreshElement(queue: _r.queue)
               ..onRefresh.listen((e) async {
                 e.element.disabled = true;
-                _script = await _scripts.get(_isolate, _script.id);
+                _script = await _scripts.get(_isolate, _script.id!);
                 _r.dirty();
               }))
             .element,
diff --git a/runtime/observatory/lib/src/elements/sentinel_value.dart b/runtime/observatory/lib/src/elements/sentinel_value.dart
index 8245534..ef911fda 100644
--- a/runtime/observatory/lib/src/elements/sentinel_value.dart
+++ b/runtime/observatory/lib/src/elements/sentinel_value.dart
@@ -9,15 +9,15 @@
 import 'package:observatory/src/elements/helpers/custom_element.dart';
 
 class SentinelValueElement extends CustomElement implements Renderable {
-  RenderingScheduler<SentinelValueElement> _r;
+  late RenderingScheduler<SentinelValueElement> _r;
 
   Stream<RenderedEvent<SentinelValueElement>> get onRendered => _r.onRendered;
 
-  M.Sentinel _sentinel;
+  late M.Sentinel _sentinel;
 
   M.Sentinel get sentinel => _sentinel;
 
-  factory SentinelValueElement(M.Sentinel sentinel, {RenderingQueue queue}) {
+  factory SentinelValueElement(M.Sentinel sentinel, {RenderingQueue? queue}) {
     assert(sentinel != null);
     SentinelValueElement e = new SentinelValueElement.created();
     e._r = new RenderingScheduler<SentinelValueElement>(e, queue: queue);
diff --git a/runtime/observatory/lib/src/elements/sentinel_view.dart b/runtime/observatory/lib/src/elements/sentinel_view.dart
index c3c9b69..dd45ef5 100644
--- a/runtime/observatory/lib/src/elements/sentinel_view.dart
+++ b/runtime/observatory/lib/src/elements/sentinel_view.dart
@@ -16,15 +16,15 @@
 import 'package:observatory/src/elements/view_footer.dart';
 
 class SentinelViewElement extends CustomElement implements Renderable {
-  RenderingScheduler<SentinelViewElement> _r;
+  late RenderingScheduler<SentinelViewElement> _r;
 
   Stream<RenderedEvent<SentinelViewElement>> get onRendered => _r.onRendered;
 
-  M.VM _vm;
-  M.IsolateRef _isolate;
-  M.Sentinel _sentinel;
-  M.EventRepository _events;
-  M.NotificationRepository _notifications;
+  late M.VM _vm;
+  late M.IsolateRef _isolate;
+  late M.Sentinel _sentinel;
+  late M.EventRepository _events;
+  late M.NotificationRepository _notifications;
 
   M.Sentinel get sentinel => _sentinel;
 
@@ -34,7 +34,7 @@
       M.Sentinel sentinel,
       M.EventRepository events,
       M.NotificationRepository notifications,
-      {RenderingQueue queue}) {
+      {RenderingQueue? queue}) {
     assert(vm != null);
     assert(isolate != null);
     assert(sentinel != null);
diff --git a/runtime/observatory/lib/src/elements/singletargetcache_ref.dart b/runtime/observatory/lib/src/elements/singletargetcache_ref.dart
index 0e0a674..693106a 100644
--- a/runtime/observatory/lib/src/elements/singletargetcache_ref.dart
+++ b/runtime/observatory/lib/src/elements/singletargetcache_ref.dart
@@ -11,20 +11,20 @@
 import 'package:observatory/src/elements/helpers/uris.dart';
 
 class SingleTargetCacheRefElement extends CustomElement implements Renderable {
-  RenderingScheduler<SingleTargetCacheRefElement> _r;
+  late RenderingScheduler<SingleTargetCacheRefElement> _r;
 
   Stream<RenderedEvent<SingleTargetCacheRefElement>> get onRendered =>
       _r.onRendered;
 
-  M.IsolateRef _isolate;
-  M.SingleTargetCacheRef _singleTargetCache;
+  late M.IsolateRef _isolate;
+  late M.SingleTargetCacheRef _singleTargetCache;
 
   M.IsolateRef get isolate => _isolate;
   M.SingleTargetCacheRef get singleTargetCache => _singleTargetCache;
 
   factory SingleTargetCacheRefElement(
       M.IsolateRef isolate, M.SingleTargetCacheRef singleTargetCache,
-      {RenderingQueue queue}) {
+      {RenderingQueue? queue}) {
     assert(isolate != null);
     assert(singleTargetCache != null);
     SingleTargetCacheRefElement e = new SingleTargetCacheRefElement.created();
@@ -58,7 +58,7 @@
           new SpanElement()
             ..classes = ['emphasize']
             ..text = 'SingleTargetCache',
-          new SpanElement()..text = ' (${_singleTargetCache.target.name})'
+          new SpanElement()..text = ' (${_singleTargetCache.target!.name})'
         ]
     ];
   }
diff --git a/runtime/observatory/lib/src/elements/singletargetcache_view.dart b/runtime/observatory/lib/src/elements/singletargetcache_view.dart
index f25a184..6d0fdd3 100644
--- a/runtime/observatory/lib/src/elements/singletargetcache_view.dart
+++ b/runtime/observatory/lib/src/elements/singletargetcache_view.dart
@@ -20,22 +20,22 @@
 import 'package:observatory/src/elements/view_footer.dart';
 
 class SingleTargetCacheViewElement extends CustomElement implements Renderable {
-  RenderingScheduler<SingleTargetCacheViewElement> _r;
+  late RenderingScheduler<SingleTargetCacheViewElement> _r;
 
   Stream<RenderedEvent<SingleTargetCacheViewElement>> get onRendered =>
       _r.onRendered;
 
-  M.VM _vm;
-  M.IsolateRef _isolate;
-  M.EventRepository _events;
-  M.NotificationRepository _notifications;
-  M.SingleTargetCache _singleTargetCache;
-  M.SingleTargetCacheRepository _singleTargetCaches;
-  M.RetainedSizeRepository _retainedSizes;
-  M.ReachableSizeRepository _reachableSizes;
-  M.InboundReferencesRepository _references;
-  M.RetainingPathRepository _retainingPaths;
-  M.ObjectRepository _objects;
+  late M.VM _vm;
+  late M.IsolateRef _isolate;
+  late M.EventRepository _events;
+  late M.NotificationRepository _notifications;
+  late M.SingleTargetCache _singleTargetCache;
+  late M.SingleTargetCacheRepository _singleTargetCaches;
+  late M.RetainedSizeRepository _retainedSizes;
+  late M.ReachableSizeRepository _reachableSizes;
+  late M.InboundReferencesRepository _references;
+  late M.RetainingPathRepository _retainingPaths;
+  late M.ObjectRepository _objects;
 
   M.VMRef get vm => _vm;
   M.IsolateRef get isolate => _isolate;
@@ -54,7 +54,7 @@
       M.InboundReferencesRepository references,
       M.RetainingPathRepository retainingPaths,
       M.ObjectRepository objects,
-      {RenderingQueue queue}) {
+      {RenderingQueue? queue}) {
     assert(vm != null);
     assert(isolate != null);
     assert(events != null);
@@ -112,7 +112,7 @@
               ..onRefresh.listen((e) async {
                 e.element.disabled = true;
                 _singleTargetCache = await _singleTargetCaches.get(
-                    _isolate, _singleTargetCache.id);
+                    _isolate, _singleTargetCache.id!);
                 _r.dirty();
               }))
             .element,
diff --git a/runtime/observatory/lib/src/elements/source_inset.dart b/runtime/observatory/lib/src/elements/source_inset.dart
index 1cd0edc..378dfc4 100644
--- a/runtime/observatory/lib/src/elements/source_inset.dart
+++ b/runtime/observatory/lib/src/elements/source_inset.dart
@@ -12,18 +12,18 @@
 import 'package:observatory/src/elements/script_inset.dart';
 
 class SourceInsetElement extends CustomElement implements Renderable {
-  RenderingScheduler<SourceInsetElement> _r;
+  late RenderingScheduler<SourceInsetElement> _r;
 
   Stream<RenderedEvent<SourceInsetElement>> get onRendered => _r.onRendered;
 
-  M.IsolateRef _isolate;
-  M.SourceLocation _location;
-  M.ScriptRepository _scripts;
-  M.ObjectRepository _objects;
-  M.EventRepository _events;
-  int _currentPos;
-  bool _inDebuggerContext;
-  Iterable _variables;
+  late M.IsolateRef _isolate;
+  late M.SourceLocation _location;
+  late M.ScriptRepository _scripts;
+  late M.ObjectRepository _objects;
+  late M.EventRepository _events;
+  int? _currentPos;
+  late bool _inDebuggerContext;
+  late Iterable _variables;
 
   M.IsolateRef get isolate => _isolate;
   M.SourceLocation get location => _location;
@@ -34,10 +34,10 @@
       M.ScriptRepository scripts,
       M.ObjectRepository objects,
       M.EventRepository events,
-      {int currentPos,
+      {int? currentPos,
       bool inDebuggerContext: false,
       Iterable variables: const [],
-      RenderingQueue queue}) {
+      RenderingQueue? queue}) {
     assert(isolate != null);
     assert(location != null);
     assert(scripts != null);
@@ -78,7 +78,7 @@
       new ScriptInsetElement(
               _isolate, _location.script, _scripts, _objects, _events,
               startPos: _location.tokenPos,
-              endPos: _location.endTokenPos,
+              endPos: _location.endTokenPos!,
               currentPos: _currentPos,
               inDebuggerContext: _inDebuggerContext,
               variables: _variables,
diff --git a/runtime/observatory/lib/src/elements/source_link.dart b/runtime/observatory/lib/src/elements/source_link.dart
index 62b2e39..47ee300 100644
--- a/runtime/observatory/lib/src/elements/source_link.dart
+++ b/runtime/observatory/lib/src/elements/source_link.dart
@@ -14,21 +14,21 @@
 import 'package:observatory/src/elements/helpers/uris.dart';
 
 class SourceLinkElement extends CustomElement implements Renderable {
-  RenderingScheduler<SourceLinkElement> _r;
+  late RenderingScheduler<SourceLinkElement> _r;
 
   Stream<RenderedEvent<SourceLinkElement>> get onRendered => _r.onRendered;
 
-  IsolateRef _isolate;
-  SourceLocation _location;
-  Script _script;
-  ScriptRepository _repository;
+  late IsolateRef _isolate;
+  late SourceLocation _location;
+  Script? _script;
+  late ScriptRepository _repository;
 
   IsolateRef get isolate => _isolate;
   SourceLocation get location => _location;
 
   factory SourceLinkElement(
       IsolateRef isolate, SourceLocation location, ScriptRepository repository,
-      {RenderingQueue queue}) {
+      {RenderingQueue? queue}) {
     assert(isolate != null);
     assert(location != null);
     SourceLinkElement e = new SourceLinkElement.created();
@@ -44,7 +44,7 @@
   @override
   void attached() {
     super.attached();
-    _repository.get(_isolate, _location.script.id).then((script) {
+    _repository.get(_isolate, _location.script.id!).then((script) {
       _script = script;
       _r.dirty();
     }, onError: (e) {
@@ -75,14 +75,14 @@
     if (_script == null) {
       children = <Element>[new SpanElement()..text = '<LOADING>'];
     } else {
-      String label = _script.uri.split('/').last;
-      int token = _location.tokenPos;
-      int line = _script.tokenToLine(token);
-      int column = _script.tokenToCol(token);
+      String label = _script!.uri!.split('/').last;
+      int? token = _location.tokenPos;
+      int? line = _script!.tokenToLine(token);
+      int? column = _script!.tokenToCol(token);
       children = <Element>[
         new AnchorElement(
-            href: Uris.inspect(isolate, object: _script, pos: token))
-          ..title = _script.uri
+            href: Uris.inspect(isolate, object: _script!, pos: token))
+          ..title = _script!.uri!
           ..text = '${label}:${line}:${column}'
       ];
     }
diff --git a/runtime/observatory/lib/src/elements/stack_trace_tree_config.dart b/runtime/observatory/lib/src/elements/stack_trace_tree_config.dart
index ff23373..9cd0bf3 100644
--- a/runtime/observatory/lib/src/elements/stack_trace_tree_config.dart
+++ b/runtime/observatory/lib/src/elements/stack_trace_tree_config.dart
@@ -19,7 +19,7 @@
 }
 
 class StackTraceTreeConfigElement extends CustomElement implements Renderable {
-  RenderingScheduler<StackTraceTreeConfigElement> _r;
+  late RenderingScheduler<StackTraceTreeConfigElement> _r;
 
   Stream<RenderedEvent<StackTraceTreeConfigElement>> get onRendered =>
       _r.onRendered;
@@ -37,12 +37,12 @@
   Stream<StackTraceTreeConfigChangedEvent> get onFilterChange =>
       _onFilterChange.stream;
 
-  bool _showMode;
-  bool _showDirection;
-  bool _showFilter;
-  ProfileTreeMode _mode;
-  M.ProfileTreeDirection _direction;
-  String _filter;
+  late bool _showMode;
+  late bool _showDirection;
+  late bool _showFilter;
+  late ProfileTreeMode _mode;
+  late M.ProfileTreeDirection _direction;
+  late String _filter;
 
   bool get showMode => _showMode;
   bool get showDirection => _showDirection;
@@ -68,7 +68,7 @@
       String filter: '',
       ProfileTreeMode mode: ProfileTreeMode.function,
       M.ProfileTreeDirection direction: M.ProfileTreeDirection.exclusive,
-      RenderingQueue queue}) {
+      RenderingQueue? queue}) {
     assert(showMode != null);
     assert(showDirection != null);
     assert(showFilter != null);
diff --git a/runtime/observatory/lib/src/elements/strongly_reachable_instances.dart b/runtime/observatory/lib/src/elements/strongly_reachable_instances.dart
index 340686a..252e5e8 100644
--- a/runtime/observatory/lib/src/elements/strongly_reachable_instances.dart
+++ b/runtime/observatory/lib/src/elements/strongly_reachable_instances.dart
@@ -13,16 +13,16 @@
 
 class StronglyReachableInstancesElement extends CustomElement
     implements Renderable {
-  RenderingScheduler<StronglyReachableInstancesElement> _r;
+  late RenderingScheduler<StronglyReachableInstancesElement> _r;
 
   Stream<RenderedEvent<StronglyReachableInstancesElement>> get onRendered =>
       _r.onRendered;
 
-  M.IsolateRef _isolate;
-  M.ClassRef _cls;
-  M.StronglyReachableInstancesRepository _stronglyReachableInstances;
-  M.ObjectRepository _objects;
-  M.InstanceSet _result;
+  late M.IsolateRef _isolate;
+  late M.ClassRef _cls;
+  late M.StronglyReachableInstancesRepository _stronglyReachableInstances;
+  late M.ObjectRepository _objects;
+  M.InstanceSet? _result;
   bool _expanded = false;
 
   M.IsolateRef get isolate => _isolate;
@@ -33,7 +33,7 @@
       M.ClassRef cls,
       M.StronglyReachableInstancesRepository stronglyReachable,
       M.ObjectRepository objects,
-      {RenderingQueue queue}) {
+      {RenderingQueue? queue}) {
     assert(isolate != null);
     assert(cls != null);
     assert(stronglyReachable != null);
@@ -89,7 +89,7 @@
     if (_result == null) {
       return [new SpanElement()..text = 'Loading...'];
     }
-    final content = _result.instances
+    final content = _result!.instances!
         .map<Element>((sample) => new DivElement()
           ..children = <Element>[
             anyRef(_isolate, sample, _objects, queue: _r.queue)
@@ -98,13 +98,13 @@
     content.add(new DivElement()
       ..children = ([]
         ..addAll(_createShowMoreButton())
-        ..add(new SpanElement()..text = ' of total ${_result.count}')));
+        ..add(new SpanElement()..text = ' of total ${_result!.count}')));
     return content;
   }
 
   List<Element> _createShowMoreButton() {
-    final samples = _result.instances.toList();
-    if (samples.length == _result.count) {
+    final samples = _result!.instances!.toList();
+    if (samples.length == _result!.count) {
       return [];
     }
     final count = samples.length;
diff --git a/runtime/observatory/lib/src/elements/subtypetestcache_ref.dart b/runtime/observatory/lib/src/elements/subtypetestcache_ref.dart
index 1d26ab8..40ba454 100644
--- a/runtime/observatory/lib/src/elements/subtypetestcache_ref.dart
+++ b/runtime/observatory/lib/src/elements/subtypetestcache_ref.dart
@@ -11,20 +11,20 @@
 import 'package:observatory/src/elements/helpers/uris.dart';
 
 class SubtypeTestCacheRefElement extends CustomElement implements Renderable {
-  RenderingScheduler<SubtypeTestCacheRefElement> _r;
+  late RenderingScheduler<SubtypeTestCacheRefElement> _r;
 
   Stream<RenderedEvent<SubtypeTestCacheRefElement>> get onRendered =>
       _r.onRendered;
 
-  M.IsolateRef _isolate;
-  M.SubtypeTestCacheRef _subtypeTestCache;
+  late M.IsolateRef _isolate;
+  late M.SubtypeTestCacheRef _subtypeTestCache;
 
   M.IsolateRef get isolate => _isolate;
   M.SubtypeTestCacheRef get subtypeTestCache => _subtypeTestCache;
 
   factory SubtypeTestCacheRefElement(
       M.IsolateRef isolate, M.SubtypeTestCacheRef subtypeTestCache,
-      {RenderingQueue queue}) {
+      {RenderingQueue? queue}) {
     assert(isolate != null);
     assert(subtypeTestCache != null);
     SubtypeTestCacheRefElement e = new SubtypeTestCacheRefElement.created();
diff --git a/runtime/observatory/lib/src/elements/subtypetestcache_view.dart b/runtime/observatory/lib/src/elements/subtypetestcache_view.dart
index 740298f..5734b7d 100644
--- a/runtime/observatory/lib/src/elements/subtypetestcache_view.dart
+++ b/runtime/observatory/lib/src/elements/subtypetestcache_view.dart
@@ -20,22 +20,22 @@
 import 'package:observatory/src/elements/view_footer.dart';
 
 class SubtypeTestCacheViewElement extends CustomElement implements Renderable {
-  RenderingScheduler<SubtypeTestCacheViewElement> _r;
+  late RenderingScheduler<SubtypeTestCacheViewElement> _r;
 
   Stream<RenderedEvent<SubtypeTestCacheViewElement>> get onRendered =>
       _r.onRendered;
 
-  M.VM _vm;
-  M.IsolateRef _isolate;
-  M.EventRepository _events;
-  M.NotificationRepository _notifications;
-  M.SubtypeTestCache _subtypeTestCache;
-  M.SubtypeTestCacheRepository _subtypeTestCaches;
-  M.RetainedSizeRepository _retainedSizes;
-  M.ReachableSizeRepository _reachableSizes;
-  M.InboundReferencesRepository _references;
-  M.RetainingPathRepository _retainingPaths;
-  M.ObjectRepository _objects;
+  late M.VM _vm;
+  late M.IsolateRef _isolate;
+  late M.EventRepository _events;
+  late M.NotificationRepository _notifications;
+  late M.SubtypeTestCache _subtypeTestCache;
+  late M.SubtypeTestCacheRepository _subtypeTestCaches;
+  late M.RetainedSizeRepository _retainedSizes;
+  late M.ReachableSizeRepository _reachableSizes;
+  late M.InboundReferencesRepository _references;
+  late M.RetainingPathRepository _retainingPaths;
+  late M.ObjectRepository _objects;
 
   M.VMRef get vm => _vm;
   M.IsolateRef get isolate => _isolate;
@@ -54,7 +54,7 @@
       M.InboundReferencesRepository references,
       M.RetainingPathRepository retainingPaths,
       M.ObjectRepository objects,
-      {RenderingQueue queue}) {
+      {RenderingQueue? queue}) {
     assert(vm != null);
     assert(isolate != null);
     assert(events != null);
@@ -109,7 +109,7 @@
               ..onRefresh.listen((e) async {
                 e.element.disabled = true;
                 _subtypeTestCache = await _subtypeTestCaches.get(
-                    _isolate, _subtypeTestCache.id);
+                    _isolate, _subtypeTestCache.id!);
                 _r.dirty();
               }))
             .element,
diff --git a/runtime/observatory/lib/src/elements/timeline/dashboard.dart b/runtime/observatory/lib/src/elements/timeline/dashboard.dart
index 99d57cf..d3c7e4b 100644
--- a/runtime/observatory/lib/src/elements/timeline/dashboard.dart
+++ b/runtime/observatory/lib/src/elements/timeline/dashboard.dart
@@ -34,15 +34,15 @@
 enum _TimelineView { strict, frame }
 
 class TimelineDashboardElement extends CustomElement implements Renderable {
-  RenderingScheduler<TimelineDashboardElement> _r;
+  late RenderingScheduler<TimelineDashboardElement> _r;
 
   Stream<RenderedEvent<TimelineDashboardElement>> get onRendered =>
       _r.onRendered;
 
-  M.VM _vm;
-  M.TimelineRepository _repository;
-  M.NotificationRepository _notifications;
-  M.TimelineFlags _flags;
+  late M.VM _vm;
+  late M.TimelineRepository _repository;
+  late M.NotificationRepository _notifications;
+  late M.TimelineFlags _flags;
   _TimelineView _view = _TimelineView.strict;
 
   M.VM get vm => _vm;
@@ -50,7 +50,7 @@
 
   factory TimelineDashboardElement(M.VM vm, M.TimelineRepository repository,
       M.NotificationRepository notifications,
-      {RenderingQueue queue}) {
+      {RenderingQueue? queue}) {
     assert(vm != null);
     assert(repository != null);
     assert(notifications != null);
@@ -81,8 +81,8 @@
     children = <Element>[];
   }
 
-  IFrameElement _frame;
-  DivElement _content;
+  IFrameElement? _frame;
+  DivElement? _content;
 
   void render() {
     if (_frame == null) {
@@ -91,8 +91,8 @@
     if (_content == null) {
       _content = new DivElement()..classes = ['content-centered-big'];
     }
-    _frame.src = _makeFrameUrl();
-    _content.children = <Element>[
+    _frame!.src = _makeFrameUrl();
+    _content!.children = <Element>[
       new HeadingElement.h2()
         ..nodes = ([new Text("Timeline View")]
           ..addAll(_createButtons())
@@ -109,10 +109,10 @@
         navBar(<Element>[
           new NavNotifyElement(_notifications, queue: _r.queue).element
         ]),
-        _content,
+        _content!,
         new DivElement()
           ..classes = ['iframe']
-          ..children = <Element>[_frame]
+          ..children = <Element>[_frame!]
       ];
     }
   }
@@ -222,7 +222,7 @@
   Future _postMessage(String method,
       [Map<String, dynamic> params = const <String, dynamic>{}]) async {
     var message = {'method': method, 'params': params};
-    _frame.contentWindow
+    _frame!.contentWindow!
         .postMessage(json.encode(message), window.location.href);
     return null;
   }
diff --git a/runtime/observatory/lib/src/elements/timeline_page.dart b/runtime/observatory/lib/src/elements/timeline_page.dart
index b3253ca..2a17e2b 100644
--- a/runtime/observatory/lib/src/elements/timeline_page.dart
+++ b/runtime/observatory/lib/src/elements/timeline_page.dart
@@ -19,25 +19,25 @@
 import 'package:observatory/src/elements/nav/vm_menu.dart';
 
 class TimelinePageElement extends CustomElement implements Renderable {
-  RenderingScheduler<TimelinePageElement> _r;
+  late RenderingScheduler<TimelinePageElement> _r;
 
   Stream<RenderedEvent<TimelinePageElement>> get onRendered => _r.onRendered;
 
-  M.VM _vm;
-  M.TimelineRepository _repository;
-  M.EventRepository _events;
-  M.NotificationRepository _notifications;
-  M.TimelineRecorder _recorder;
-  Set<M.TimelineStream> _availableStreams;
-  Set<M.TimelineStream> _recordedStreams;
-  Set<M.TimelineProfile> _profiles;
+  late M.VM _vm;
+  late M.TimelineRepository _repository;
+  late M.EventRepository _events;
+  late M.NotificationRepository _notifications;
+  M.TimelineRecorder? _recorder;
+  late Set<M.TimelineStream> _availableStreams;
+  late Set<M.TimelineStream> _recordedStreams;
+  late Set<M.TimelineProfile> _profiles;
 
   M.VM get vm => _vm;
   M.NotificationRepository get notifications => _notifications;
 
   factory TimelinePageElement(M.VM vm, M.TimelineRepository repository,
       M.EventRepository events, M.NotificationRepository notifications,
-      {RenderingQueue queue}) {
+      {RenderingQueue? queue}) {
     assert(vm != null);
     assert(repository != null);
     assert(events != null);
@@ -67,25 +67,25 @@
     children = <Element>[];
   }
 
-  IFrameElement _frame;
-  DivElement _content;
+  IFrameElement? _frame;
+  DivElement? _content;
 
   bool get usingVMRecorder =>
-      _recorder.name != "Fuchsia" &&
-      _recorder.name != "Systrace" &&
-      _recorder.name != "Macos";
+      _recorder!.name != "Fuchsia" &&
+      _recorder!.name != "Systrace" &&
+      _recorder!.name != "Macos";
 
   void render() {
     if (_frame == null) {
       _frame = new IFrameElement()..src = 'timeline.html';
-      _frame.onLoad.listen((event) {
+      _frame!.onLoad.listen((event) {
         _refresh();
       });
     }
     if (_content == null) {
       _content = new DivElement()..classes = ['content-centered-big'];
     }
-    _content.children = <Element>[
+    _content!.children = <Element>[
       new HeadingElement.h1()..text = 'Timeline settings',
       _recorder == null
           ? (new DivElement()..text = 'Loading...')
@@ -100,7 +100,7 @@
                     ..text = 'Recorder:',
                   new DivElement()
                     ..classes = ['memberValue']
-                    ..text = _recorder.name
+                    ..text = _recorder!.name
                 ],
               new DivElement()
                 ..classes = ['memberItem']
@@ -162,19 +162,20 @@
             .element,
         new NavNotifyElement(_notifications, queue: _r.queue).element
       ]),
-      _content,
+      _content!,
       _createIFrameOrMessage(),
     ];
   }
 
   HtmlElement _createIFrameOrMessage() {
-    if (_recorder == null) {
+    final recorder = _recorder;
+    if (recorder == null) {
       return new DivElement()
         ..classes = ['content-centered-big']
         ..text = 'Loading...';
     }
 
-    if (_recorder.name == "Fuchsia") {
+    if (recorder.name == "Fuchsia") {
       return new DivElement()
         ..classes = ['content-centered-big']
         ..children = <Element>[
@@ -189,7 +190,7 @@
         ];
     }
 
-    if (_recorder.name == "Systrace") {
+    if (recorder.name == "Systrace") {
       return new DivElement()
         ..classes = ['content-centered-big']
         ..children = <Element>[
@@ -205,7 +206,7 @@
         ];
     }
 
-    if (_recorder.name == "Macos") {
+    if (recorder.name == "Macos") {
       return new DivElement()
         ..classes = ['content-centered-big']
         ..children = <Element>[
@@ -223,7 +224,7 @@
 
     return new DivElement()
       ..classes = ['iframe']
-      ..children = <Element>[_frame];
+      ..children = <Element>[_frame!];
   }
 
   List<Element> _createProfileSelect() {
@@ -263,12 +264,12 @@
   }
 
   Future _postMessage(String method,
-      [Map<String, dynamic> params = const <String, dynamic>{}]) async {
-    if (_frame.contentWindow == null) {
+      [Map<dynamic, dynamic> params = const <dynamic, dynamic>{}]) async {
+    if (_frame!.contentWindow == null) {
       return null;
     }
     var message = {'method': method, 'params': params};
-    _frame.contentWindow
+    _frame!.contentWindow!
         .postMessage(json.encode(message), window.location.href);
     return null;
   }
@@ -302,7 +303,7 @@
     span.text = stream.name;
     InputElement checkbox = new InputElement();
     checkbox.onChange.listen((_) {
-      if (checkbox.checked) {
+      if (checkbox.checked!) {
         _recordedStreams.add(stream);
       } else {
         _recordedStreams.remove(stream);
diff --git a/runtime/observatory/lib/src/elements/tree_map.dart b/runtime/observatory/lib/src/elements/tree_map.dart
index f79b9aa..3a3721d 100644
--- a/runtime/observatory/lib/src/elements/tree_map.dart
+++ b/runtime/observatory/lib/src/elements/tree_map.dart
@@ -11,7 +11,7 @@
   String getBackground(T node);
   String getLabel(T node);
   String getTooltip(T node) => getLabel(node);
-  T getParent(T node);
+  T? getParent(T node);
   Iterable<T> getChildren(T node);
   void onSelect(T node);
   void onDetails(T node);
@@ -34,7 +34,8 @@
     div.onDoubleClick.listen((event) {
       event.stopPropagation();
       if (depth == 0) {
-        onSelect(getParent(node)); // Zoom out.
+        var p = getParent(node);
+        onSelect(p ?? node); // Zoom out.
       } else {
         onSelect(node); // Zoom in.
       }
diff --git a/runtime/observatory/lib/src/elements/type_arguments_ref.dart b/runtime/observatory/lib/src/elements/type_arguments_ref.dart
index 9e8ff9f..a9a85ad 100644
--- a/runtime/observatory/lib/src/elements/type_arguments_ref.dart
+++ b/runtime/observatory/lib/src/elements/type_arguments_ref.dart
@@ -10,19 +10,19 @@
 import 'package:observatory/src/elements/helpers/uris.dart';
 
 class TypeArgumentsRefElement extends CustomElement implements Renderable {
-  RenderingScheduler<TypeArgumentsRefElement> _r;
+  late RenderingScheduler<TypeArgumentsRefElement> _r;
 
   Stream<RenderedEvent<TypeArgumentsRefElement>> get onRendered =>
       _r.onRendered;
 
-  M.IsolateRef _isolate;
-  M.TypeArgumentsRef _arguments;
+  late M.IsolateRef _isolate;
+  late M.TypeArgumentsRef _arguments;
 
   M.IsolateRef get isolate => _isolate;
   M.TypeArgumentsRef get arguments => _arguments;
 
   factory TypeArgumentsRefElement(M.IsolateRef isolate, M.TypeArgumentsRef args,
-      {RenderingQueue queue}) {
+      {RenderingQueue? queue}) {
     assert(isolate != null);
     assert(args != null);
     TypeArgumentsRefElement e = new TypeArgumentsRefElement.created();
diff --git a/runtime/observatory/lib/src/elements/unknown_ref.dart b/runtime/observatory/lib/src/elements/unknown_ref.dart
index 6425a39..ab8358d 100644
--- a/runtime/observatory/lib/src/elements/unknown_ref.dart
+++ b/runtime/observatory/lib/src/elements/unknown_ref.dart
@@ -10,19 +10,19 @@
 import 'package:observatory/src/elements/helpers/uris.dart';
 
 class UnknownObjectRefElement extends CustomElement implements Renderable {
-  RenderingScheduler<UnknownObjectRefElement> _r;
+  late RenderingScheduler<UnknownObjectRefElement> _r;
 
   Stream<RenderedEvent<UnknownObjectRefElement>> get onRendered =>
       _r.onRendered;
 
-  M.IsolateRef _isolate;
-  M.UnknownObjectRef _obj;
+  late M.IsolateRef _isolate;
+  late M.UnknownObjectRef _obj;
 
   M.IsolateRef get isolate => _isolate;
   M.UnknownObjectRef get obj => _obj;
 
   factory UnknownObjectRefElement(M.IsolateRef isolate, M.UnknownObjectRef obj,
-      {RenderingQueue queue}) {
+      {RenderingQueue? queue}) {
     assert(isolate != null);
     assert(obj != null);
     UnknownObjectRefElement e = new UnknownObjectRefElement.created();
diff --git a/runtime/observatory/lib/src/elements/unlinkedcall_ref.dart b/runtime/observatory/lib/src/elements/unlinkedcall_ref.dart
index 2a9051e..1dae01c 100644
--- a/runtime/observatory/lib/src/elements/unlinkedcall_ref.dart
+++ b/runtime/observatory/lib/src/elements/unlinkedcall_ref.dart
@@ -10,19 +10,19 @@
 import 'package:observatory/src/elements/helpers/uris.dart';
 
 class UnlinkedCallRefElement extends CustomElement implements Renderable {
-  RenderingScheduler<UnlinkedCallRefElement> _r;
+  late RenderingScheduler<UnlinkedCallRefElement> _r;
 
   Stream<RenderedEvent<UnlinkedCallRefElement>> get onRendered => _r.onRendered;
 
-  M.IsolateRef _isolate;
-  M.UnlinkedCallRef _unlinkedcall;
+  late M.IsolateRef _isolate;
+  late M.UnlinkedCallRef _unlinkedcall;
 
   M.IsolateRef get isolate => _isolate;
   M.UnlinkedCallRef get unlinkedcall => _unlinkedcall;
 
   factory UnlinkedCallRefElement(
       M.IsolateRef isolate, M.UnlinkedCallRef unlinkedcall,
-      {RenderingQueue queue}) {
+      {RenderingQueue? queue}) {
     assert(isolate != null);
     assert(unlinkedcall != null);
     UnlinkedCallRefElement e = new UnlinkedCallRefElement.created();
diff --git a/runtime/observatory/lib/src/elements/unlinkedcall_view.dart b/runtime/observatory/lib/src/elements/unlinkedcall_view.dart
index 7e4cf0b..a346b48 100644
--- a/runtime/observatory/lib/src/elements/unlinkedcall_view.dart
+++ b/runtime/observatory/lib/src/elements/unlinkedcall_view.dart
@@ -20,22 +20,22 @@
 import 'package:observatory/src/elements/view_footer.dart';
 
 class UnlinkedCallViewElement extends CustomElement implements Renderable {
-  RenderingScheduler<UnlinkedCallViewElement> _r;
+  late RenderingScheduler<UnlinkedCallViewElement> _r;
 
   Stream<RenderedEvent<UnlinkedCallViewElement>> get onRendered =>
       _r.onRendered;
 
-  M.VM _vm;
-  M.IsolateRef _isolate;
-  M.EventRepository _events;
-  M.NotificationRepository _notifications;
-  M.UnlinkedCall _unlinkedcall;
-  M.UnlinkedCallRepository _unlinkedcalls;
-  M.RetainedSizeRepository _retainedSizes;
-  M.ReachableSizeRepository _reachableSizes;
-  M.InboundReferencesRepository _references;
-  M.RetainingPathRepository _retainingPaths;
-  M.ObjectRepository _objects;
+  late M.VM _vm;
+  late M.IsolateRef _isolate;
+  late M.EventRepository _events;
+  late M.NotificationRepository _notifications;
+  late M.UnlinkedCall _unlinkedcall;
+  late M.UnlinkedCallRepository _unlinkedcalls;
+  late M.RetainedSizeRepository _retainedSizes;
+  late M.ReachableSizeRepository _reachableSizes;
+  late M.InboundReferencesRepository _references;
+  late M.RetainingPathRepository _retainingPaths;
+  late M.ObjectRepository _objects;
 
   M.VMRef get vm => _vm;
   M.IsolateRef get isolate => _isolate;
@@ -54,7 +54,7 @@
       M.InboundReferencesRepository references,
       M.RetainingPathRepository retainingPaths,
       M.ObjectRepository objects,
-      {RenderingQueue queue}) {
+      {RenderingQueue? queue}) {
     assert(vm != null);
     assert(isolate != null);
     assert(events != null);
@@ -108,7 +108,7 @@
               ..onRefresh.listen((e) async {
                 e.element.disabled = true;
                 _unlinkedcall =
-                    await _unlinkedcalls.get(_isolate, _unlinkedcall.id);
+                    await _unlinkedcalls.get(_isolate, _unlinkedcall.id!);
                 _r.dirty();
               }))
             .element,
diff --git a/runtime/observatory/lib/src/elements/view_footer.dart b/runtime/observatory/lib/src/elements/view_footer.dart
index 6181511..4d52516 100644
--- a/runtime/observatory/lib/src/elements/view_footer.dart
+++ b/runtime/observatory/lib/src/elements/view_footer.dart
@@ -10,11 +10,11 @@
 import 'package:observatory/src/elements/helpers/rendering_scheduler.dart';
 
 class ViewFooterElement extends CustomElement implements Renderable {
-  RenderingScheduler<ViewFooterElement> _r;
+  late RenderingScheduler<ViewFooterElement> _r;
 
   Stream<RenderedEvent<ViewFooterElement>> get onRendered => _r.onRendered;
 
-  factory ViewFooterElement({RenderingQueue queue}) {
+  factory ViewFooterElement({RenderingQueue? queue}) {
     ViewFooterElement e = new ViewFooterElement.created();
     e._r = new RenderingScheduler<ViewFooterElement>(e, queue: queue);
     return e;
diff --git a/runtime/observatory/lib/src/elements/vm_connect.dart b/runtime/observatory/lib/src/elements/vm_connect.dart
index 1d14168..26bfb17 100644
--- a/runtime/observatory/lib/src/elements/vm_connect.dart
+++ b/runtime/observatory/lib/src/elements/vm_connect.dart
@@ -17,19 +17,19 @@
 import 'package:observatory/src/elements/vm_connect_target.dart';
 
 class VMConnectElement extends CustomElement implements Renderable {
-  RenderingScheduler<VMConnectElement> _r;
+  late RenderingScheduler<VMConnectElement> _r;
 
   Stream<RenderedEvent<VMConnectElement>> get onRendered => _r.onRendered;
 
-  M.NotificationRepository _notifications;
-  M.TargetRepository _targets;
-  StreamSubscription _targetsSubscription;
+  late M.NotificationRepository _notifications;
+  late M.TargetRepository _targets;
+  late StreamSubscription _targetsSubscription;
 
-  String _address;
+  late String _address;
 
   factory VMConnectElement(
       M.TargetRepository targets, M.NotificationRepository notifications,
-      {String address: '', RenderingQueue queue}) {
+      {String address: '', RenderingQueue? queue}) {
     assert(address != null);
     assert(notifications != null);
     assert(targets != null);
@@ -128,7 +128,7 @@
         _createAndConnect();
       });
     textbox.onInput.listen((e) {
-      _address = textbox.value;
+      _address = textbox.value!;
     });
     return textbox;
   }
@@ -139,7 +139,7 @@
     _targets.add(normalizedNetworkAddress);
     var target = _targets.find(normalizedNetworkAddress);
     assert(target != null);
-    _targets.setCurrent(target);
+    _targets.setCurrent(target!);
     // the navigation to the VM page is done in the ObservatoryApplication
   }
 
diff --git a/runtime/observatory/lib/src/elements/vm_connect_target.dart b/runtime/observatory/lib/src/elements/vm_connect_target.dart
index 9a11a01..3a0341f 100644
--- a/runtime/observatory/lib/src/elements/vm_connect_target.dart
+++ b/runtime/observatory/lib/src/elements/vm_connect_target.dart
@@ -15,7 +15,7 @@
 }
 
 class VMConnectTargetElement extends CustomElement implements Renderable {
-  RenderingScheduler<VMConnectTargetElement> _r;
+  late RenderingScheduler<VMConnectTargetElement> _r;
 
   Stream<RenderedEvent<VMConnectTargetElement>> get onRendered => _r.onRendered;
 
@@ -26,14 +26,14 @@
       new StreamController<TargetEvent>.broadcast();
   Stream<TargetEvent> get onDelete => _onDelete.stream;
 
-  M.Target _target;
-  bool _current;
+  late M.Target _target;
+  late bool _current;
 
   M.Target get target => _target;
   bool get current => _current;
 
   factory VMConnectTargetElement(M.Target target,
-      {bool current: false, RenderingQueue queue}) {
+      {bool current: false, RenderingQueue? queue}) {
     assert(target != null);
     assert(current != null);
     VMConnectTargetElement e = new VMConnectTargetElement.created();
diff --git a/runtime/observatory/lib/src/elements/vm_view.dart b/runtime/observatory/lib/src/elements/vm_view.dart
index fed475a..2b82602 100644
--- a/runtime/observatory/lib/src/elements/vm_view.dart
+++ b/runtime/observatory/lib/src/elements/vm_view.dart
@@ -20,20 +20,20 @@
 import 'package:observatory/utils.dart';
 
 class VMViewElement extends CustomElement implements Renderable {
-  RenderingScheduler<VMViewElement> _r;
+  late RenderingScheduler<VMViewElement> _r;
 
   Stream<RenderedEvent<VMViewElement>> get onRendered => _r.onRendered;
 
-  M.VM _vm;
-  M.VMRepository _vms;
-  M.EventRepository _events;
-  M.NotificationRepository _notifications;
-  M.IsolateRepository _isolates;
-  M.IsolateGroupRepository _isolateGroups;
-  M.ScriptRepository _scripts;
-  StreamSubscription _vmSubscription;
-  StreamSubscription _startSubscription;
-  StreamSubscription _exitSubscription;
+  late M.VM _vm;
+  late M.VMRepository _vms;
+  late M.EventRepository _events;
+  late M.NotificationRepository _notifications;
+  late M.IsolateRepository _isolates;
+  late M.IsolateGroupRepository _isolateGroups;
+  late M.ScriptRepository _scripts;
+  late StreamSubscription _vmSubscription;
+  late StreamSubscription _startSubscription;
+  late StreamSubscription _exitSubscription;
 
   M.VMRef get vm => _vm;
   M.NotificationRepository get notifications => _notifications;
@@ -46,7 +46,7 @@
       M.IsolateRepository isolates,
       M.IsolateGroupRepository isolateGroups,
       M.ScriptRepository scripts,
-      {RenderingQueue queue}) {
+      {RenderingQueue? queue}) {
     assert(vm != null);
     assert(vms != null);
     assert(events != null);
@@ -72,7 +72,7 @@
     super.attached();
     _r.enable();
     _vmSubscription = _events.onVMUpdate.listen((e) {
-      _vm = e.vm;
+      _vm = e.vm as M.VM;
       _r.dirty();
     });
     _startSubscription = _events.onIsolateStart.listen((_) => _r.dirty());
@@ -220,7 +220,7 @@
   }
 
   Element describeVM() {
-    final uptime = new DateTime.now().difference(_vm.startTime);
+    final uptime = new DateTime.now().difference(_vm.startTime!);
     return new DivElement()
       ..classes = ['content-centered-big']
       ..children = <HtmlElement>[
@@ -256,7 +256,7 @@
                   ..text = 'embedder',
                 new DivElement()
                   ..classes = ['memberValue']
-                  ..text = _vm.embedder ?? "UNKNOWN"
+                  ..text = _vm.embedder
               ],
             new DivElement()
               ..classes = ['memberItem']
@@ -337,7 +337,7 @@
 
   Element describeIsolateGroup(M.IsolateGroupRef group) {
     final isolateType =
-        group.isSystemIsolateGroup ? 'System Isolate' : 'Isolate';
+        group.isSystemIsolateGroup! ? 'System Isolate' : 'Isolate';
     final isolates = (group as M.IsolateGroup).isolates;
     return new DivElement()
       ..classes = ['content-centered-big']
@@ -350,7 +350,7 @@
           ..children = <Element>[
             new UListElement()
               ..classes = ['list-group']
-              ..children = isolates.map(describeIsolate).toList(),
+              ..children = isolates!.map(describeIsolate).toList(),
           ],
       ];
   }
diff --git a/runtime/observatory/lib/src/models/objects/allocation_profile.dart b/runtime/observatory/lib/src/models/objects/allocation_profile.dart
index f9aa5a6..b8b3f24 100644
--- a/runtime/observatory/lib/src/models/objects/allocation_profile.dart
+++ b/runtime/observatory/lib/src/models/objects/allocation_profile.dart
@@ -5,8 +5,8 @@
 part of models;
 
 abstract class AllocationProfile {
-  DateTime get lastServiceGC;
-  DateTime get lastAccumulatorReset;
+  DateTime? get lastServiceGC;
+  DateTime? get lastAccumulatorReset;
   HeapSpace get newSpace;
   HeapSpace get oldSpace;
   HeapSpace get totalSpace;
@@ -15,10 +15,10 @@
 
 abstract class ClassHeapStats {
   /// [Optional] at least one between clazz and displayName should be non null
-  ClassRef get clazz;
+  ClassRef? get clazz;
 
   /// [Optional] at least one between clazz and displayName should be non null
-  String get displayName;
+  String? get displayName;
   Allocations get newSpace;
   Allocations get oldSpace;
 }
diff --git a/runtime/observatory/lib/src/models/objects/breakpoint.dart b/runtime/observatory/lib/src/models/objects/breakpoint.dart
index 28ed56c..6417e12 100644
--- a/runtime/observatory/lib/src/models/objects/breakpoint.dart
+++ b/runtime/observatory/lib/src/models/objects/breakpoint.dart
@@ -6,16 +6,16 @@
 
 abstract class Breakpoint extends Object {
   /// A number identifying this breakpoint to the user.
-  int get number;
+  int? get number;
 
   /// Has this breakpoint been assigned to a specific program location?
-  bool get resolved;
+  bool? get resolved;
 
   /// [optional]Is this a breakpoint that was added synthetically as part of a
   /// step OverAsyncSuspension resume command?
-  bool get isSyntheticAsyncContinuation;
+  bool? get isSyntheticAsyncContinuation;
 
   /// SourceLocation when breakpoint is resolved, UnresolvedSourceLocation
   /// when a breakpoint is not resolved.
-  Location get location;
+  Location? get location;
 }
diff --git a/runtime/observatory/lib/src/models/objects/class.dart b/runtime/observatory/lib/src/models/objects/class.dart
index 47a1a34..92d946e 100644
--- a/runtime/observatory/lib/src/models/objects/class.dart
+++ b/runtime/observatory/lib/src/models/objects/class.dart
@@ -6,68 +6,68 @@
 
 abstract class ClassRef extends ObjectRef {
   /// The name of this class.
-  String get name;
+  String? get name;
 }
 
 abstract class Class extends Object implements ClassRef {
   /// The error which occurred during class finalization, if it exists.
   /// [optional]
-  ErrorRef get error;
+  ErrorRef? get error;
 
   /// Is this an abstract class?
-  bool get isAbstract;
+  bool? get isAbstract;
 
   /// Is this a const class?
-  bool get isConst;
+  bool? get isConst;
 
   /// [internal]
-  bool get isPatch;
+  bool? get isPatch;
 
   /// [optional] The library which contains this class.
-  LibraryRef get library;
+  LibraryRef? get library;
 
   /// [optional] The location of this class in the source code.
-  SourceLocation get location;
+  SourceLocation? get location;
 
   /// [optional] The superclass of this class, if any.
-  ClassRef get superclass;
+  ClassRef? get superclass;
 
   /// [optional]The supertype for this class, if any.
   ///
   /// The value will be of the kind: Type.
-  InstanceRef get superType;
+  InstanceRef? get superType;
 
   /// A list of interface types for this class.
   ///
   /// The values will be of the kind: Type.
-  Iterable<InstanceRef> get interfaces;
+  Iterable<InstanceRef>? get interfaces;
 
   /// The mixin type for this class, if any.
   ///
   /// [optional] The value will be of the kind: Type.
-  InstanceRef get mixin;
+  InstanceRef? get mixin;
 
   /// A list of fields in this class. Does not include fields from
   /// superclasses.
-  Iterable<FieldRef> get fields;
+  Iterable<FieldRef>? get fields;
 
   /// A list of functions in this class. Does not include functions
   /// from superclasses.
-  Iterable<FunctionRef> get functions;
+  Iterable<FunctionRef>? get functions;
 
   // A list of subclasses of this class.
-  Iterable<ClassRef> get subclasses;
+  Iterable<ClassRef>? get subclasses;
 
-  bool get hasAllocations;
-  bool get hasNoAllocations;
+  bool? get hasAllocations;
+  bool? get hasNoAllocations;
 
-  Allocations get newSpace;
-  Allocations get oldSpace;
+  Allocations? get newSpace;
+  Allocations? get oldSpace;
 
-  bool get traceAllocations;
+  bool? get traceAllocations;
 }
 
 abstract class InstanceSet {
-  int get count;
-  Iterable<ObjectRef> get instances;
+  int? get count;
+  Iterable<ObjectRef>? get instances;
 }
diff --git a/runtime/observatory/lib/src/models/objects/code.dart b/runtime/observatory/lib/src/models/objects/code.dart
index 12d84df..6e4a915 100644
--- a/runtime/observatory/lib/src/models/objects/code.dart
+++ b/runtime/observatory/lib/src/models/objects/code.dart
@@ -6,7 +6,10 @@
 
 enum CodeKind { dart, native, stub, tag, collected }
 
-bool isSyntheticCode(CodeKind kind) {
+bool isSyntheticCode(CodeKind? kind) {
+  if (kind == null) {
+    return false;
+  }
   switch (kind) {
     case CodeKind.collected:
     case CodeKind.native:
@@ -17,20 +20,25 @@
   }
 }
 
-bool isDartCode(CodeKind kind) => !isSyntheticCode(kind);
+bool isDartCode(CodeKind? kind) {
+  if (kind == null) {
+    return false;
+  }
+  return !isSyntheticCode(kind);
+}
 
 abstract class CodeRef extends ObjectRef {
   /// The name of this class.
-  String get name;
+  String? get name;
 
   // What kind of code object is this?
-  CodeKind get kind;
+  CodeKind? get kind;
 
-  bool get isOptimized;
+  bool? get isOptimized;
 }
 
 abstract class Code extends Object implements CodeRef {
-  FunctionRef get function;
-  ObjectPoolRef get objectPool;
-  Iterable<FunctionRef> get inlinedFunctions;
+  FunctionRef? get function;
+  ObjectPoolRef? get objectPool;
+  Iterable<FunctionRef>? get inlinedFunctions;
 }
diff --git a/runtime/observatory/lib/src/models/objects/context.dart b/runtime/observatory/lib/src/models/objects/context.dart
index 7378086..a9e9fd8 100644
--- a/runtime/observatory/lib/src/models/objects/context.dart
+++ b/runtime/observatory/lib/src/models/objects/context.dart
@@ -6,17 +6,17 @@
 
 abstract class ContextRef extends ObjectRef {
   /// The number of variables in this context.
-  int get length;
+  int? get length;
 }
 
 abstract class Context extends Object implements ContextRef {
   /// [optional] The enclosing context for this context.
-  Context get parentContext;
+  Context? get parentContext;
 
   // The variables in this context object.
-  Iterable<ContextElement> get variables;
+  Iterable<ContextElement>? get variables;
 }
 
 abstract class ContextElement {
-  Guarded<InstanceRef> get value;
+  Guarded<InstanceRef>? get value;
 }
diff --git a/runtime/observatory/lib/src/models/objects/error.dart b/runtime/observatory/lib/src/models/objects/error.dart
index 56eff8b..cdf3e89 100644
--- a/runtime/observatory/lib/src/models/objects/error.dart
+++ b/runtime/observatory/lib/src/models/objects/error.dart
@@ -20,8 +20,8 @@
 }
 
 abstract class ErrorRef extends ObjectRef {
-  ErrorKind get kind;
-  String get message;
+  ErrorKind? get kind;
+  String? get message;
 }
 
 abstract class Error extends Object implements ErrorRef {}
diff --git a/runtime/observatory/lib/src/models/objects/event.dart b/runtime/observatory/lib/src/models/objects/event.dart
index 24ed7e3..5d540ed 100644
--- a/runtime/observatory/lib/src/models/objects/event.dart
+++ b/runtime/observatory/lib/src/models/objects/event.dart
@@ -75,7 +75,7 @@
 
 abstract class PauseBreakpointEvent extends AsyncSuspensionEvent {
   /// [optional] The breakpoint at which we are currently paused.
-  Breakpoint get breakpoint;
+  Breakpoint? get breakpoint;
 
   /// The list of breakpoints at which we are currently paused
   /// for a PauseBreakpoint event.
@@ -94,13 +94,13 @@
 abstract class PauseInterruptedEvent extends AsyncSuspensionEvent {
   /// [optional] The top stack frame associated with this event. There will be
   /// no top frame if the isolate is idle (waiting in the message loop).
-  Frame get topFrame;
+  Frame? get topFrame;
 }
 
 abstract class PausePostRequestEvent extends AsyncSuspensionEvent {
   /// [optional] The top stack frame associated with this event. There will be
   /// no top frame if the isolate is idle (waiting in the message loop).
-  Frame get topFrame;
+  Frame? get topFrame;
 }
 
 abstract class PauseExceptionEvent extends PauseEvent {
@@ -115,7 +115,7 @@
   /// [optional] The top stack frame associated with this event. It is provided
   /// at all times except for the initial resume event that is delivered when an
   /// isolate begins execution.
-  Frame get topFrame;
+  Frame? get topFrame;
 }
 
 abstract class BreakpointAddedEvent extends BreakpointEvent {}
@@ -168,7 +168,7 @@
   String get reason;
 }
 
-Frame topFrame(DebugEvent event) {
+Frame? topFrame(Event? event) {
   if (event is PauseBreakpointEvent) {
     return event.topFrame;
   }
@@ -184,7 +184,7 @@
   return null;
 }
 
-bool isAtAsyncSuspension(DebugEvent event) {
+bool isAtAsyncSuspension(DebugEvent? event) {
   if (event is PauseBreakpointEvent) {
     return event.atAsyncSuspension;
   }
diff --git a/runtime/observatory/lib/src/models/objects/field.dart b/runtime/observatory/lib/src/models/objects/field.dart
index ca59328c..c063238 100644
--- a/runtime/observatory/lib/src/models/objects/field.dart
+++ b/runtime/observatory/lib/src/models/objects/field.dart
@@ -6,38 +6,38 @@
 
 abstract class FieldRef extends ObjectRef {
   /// The name of this field.
-  String get name;
+  String? get name;
 
   /// The owner of this field, which can be either a Library or a
   /// Class.
-  ObjectRef get dartOwner;
+  ObjectRef? get dartOwner;
 
   /// The declared type of this field.
   ///
   /// The value will always be of one of the kinds:
   /// Type, TypeRef, TypeParameter.
-  InstanceRef get declaredType;
+  InstanceRef? get declaredType;
 
   /// Is this field const?
-  bool get isConst;
+  bool? get isConst;
 
   /// Is this field final?
-  bool get isFinal;
+  bool? get isFinal;
 
   /// Is this field static?
-  bool get isStatic;
+  bool? get isStatic;
 }
 
 enum GuardClassKind { unknown, single, dynamic }
 
 abstract class Field extends Object implements FieldRef {
   /// [optional] The value of this field, if the field is static.
-  ObjectRef get staticValue;
+  ObjectRef? get staticValue;
 
   /// [optional] The location of this field in the source code.
-  SourceLocation get location;
+  SourceLocation? get location;
 
-  GuardClassKind get guardClassKind;
-  ClassRef get guardClass;
-  bool get guardNullable;
+  GuardClassKind? get guardClassKind;
+  ClassRef? get guardClass;
+  bool? get guardNullable;
 }
diff --git a/runtime/observatory/lib/src/models/objects/frame.dart b/runtime/observatory/lib/src/models/objects/frame.dart
index 12140f6..694a7f5 100644
--- a/runtime/observatory/lib/src/models/objects/frame.dart
+++ b/runtime/observatory/lib/src/models/objects/frame.dart
@@ -7,8 +7,8 @@
 enum FrameKind { regular, asyncCausal, asyncSuspensionMarker, asyncActivation }
 
 abstract class Frame {
-  FrameKind get kind;
-  String get marker;
-  FunctionRef get function;
-  SourceLocation get location;
+  FrameKind? get kind;
+  String? get marker;
+  FunctionRef? get function;
+  SourceLocation? get location;
 }
diff --git a/runtime/observatory/lib/src/models/objects/function.dart b/runtime/observatory/lib/src/models/objects/function.dart
index 82d3d7f..e63ef40 100644
--- a/runtime/observatory/lib/src/models/objects/function.dart
+++ b/runtime/observatory/lib/src/models/objects/function.dart
@@ -28,7 +28,7 @@
   dynamicInvocationForwarder
 }
 
-bool isSyntheticFunction(FunctionKind kind) {
+bool isSyntheticFunction(FunctionKind? kind) {
   switch (kind) {
     case FunctionKind.collected:
     case FunctionKind.native:
@@ -40,64 +40,61 @@
   }
 }
 
-bool isDartFunction(FunctionKind kind) => !isSyntheticFunction(kind);
-bool isStubFunction(FunctionKind kind) => kind == FunctionKind.stub;
-bool hasDartCode(FunctionKind kind) =>
+bool isDartFunction(FunctionKind? kind) => !isSyntheticFunction(kind);
+bool isStubFunction(FunctionKind? kind) => kind == FunctionKind.stub;
+bool hasDartCode(FunctionKind? kind) =>
     isDartFunction(kind) || isStubFunction(kind);
 
 String getFunctionFullName(FunctionRef function) {
-  var content = <String>[function.name];
-  ObjectRef owner = function.dartOwner;
+  String content = function.name!;
+  ObjectRef? owner = function.dartOwner;
   while (owner is FunctionRef) {
     FunctionRef function = (owner as FunctionRef);
-    content.add(function.name);
-    owner = function.dartOwner;
+    content = "${function.name!}.${content}";
+    owner = function.dartOwner!;
   }
   if (owner is ClassRef) {
-    content.add(owner.name);
+    content = "${owner.name!}.${content}";
   }
-  return content.reversed.join('.');
+  return content;
 }
 
 abstract class FunctionRef extends ObjectRef {
   /// The name of this class.
-  String get name;
+  String? get name;
 
   /// The owner of this function, which can be a LibraryRef, ClassRef,
   /// or a FunctionRef.
-  ObjectRef get dartOwner; // owner
+  ObjectRef? get dartOwner; // owner
 
   /// Is this function static?
-  bool get isStatic;
+  bool? get isStatic;
 
   /// Is this function const?
-  bool get isConst;
+  bool? get isConst;
 
   /// The kind of the function.
-  FunctionKind get kind;
+  FunctionKind? get kind;
 }
 
 abstract class ServiceFunction extends Object implements FunctionRef {
   /// The location of this function in the source code. [optional]
-  SourceLocation get location;
+  SourceLocation? get location;
 
   /// The compiled code associated with this function. [optional]
-  CodeRef get code;
+  CodeRef? get code;
 
   /// [optional]
-  CodeRef get unoptimizedCode;
+  CodeRef? get unoptimizedCode;
 
   /// [optional]
-  CodeRef get bytecode;
-
-  /// [optional]
-  FieldRef get field;
-  int get usageCounter;
-  InstanceRef get icDataArray;
-  int get deoptimizations;
-  bool get isOptimizable;
-  bool get isInlinable;
-  bool get hasIntrinsic;
-  bool get isRecognized;
-  bool get isNative;
+  FieldRef? get field;
+  int? get usageCounter;
+  InstanceRef? get icDataArray;
+  int? get deoptimizations;
+  bool? get isOptimizable;
+  bool? get isInlinable;
+  bool? get hasIntrinsic;
+  bool? get isRecognized;
+  bool? get isNative;
 }
diff --git a/runtime/observatory/lib/src/models/objects/guarded.dart b/runtime/observatory/lib/src/models/objects/guarded.dart
index 82bf1ee..4617541 100644
--- a/runtime/observatory/lib/src/models/objects/guarded.dart
+++ b/runtime/observatory/lib/src/models/objects/guarded.dart
@@ -7,6 +7,6 @@
 abstract class Guarded<T> {
   bool get isValue;
   bool get isSentinel;
-  Sentinel get asSentinel;
-  T get asValue;
+  Sentinel? get asSentinel;
+  T? get asValue;
 }
diff --git a/runtime/observatory/lib/src/models/objects/icdata.dart b/runtime/observatory/lib/src/models/objects/icdata.dart
index d975301..26e5335 100644
--- a/runtime/observatory/lib/src/models/objects/icdata.dart
+++ b/runtime/observatory/lib/src/models/objects/icdata.dart
@@ -5,11 +5,11 @@
 part of models;
 
 abstract class ICDataRef extends ObjectRef {
-  String get selector;
+  String? get selector;
 }
 
 abstract class ICData extends Object implements ICDataRef {
-  ObjectRef get dartOwner;
-  InstanceRef get argumentsDescriptor;
-  InstanceRef get entries;
+  ObjectRef? get dartOwner;
+  InstanceRef? get argumentsDescriptor;
+  InstanceRef? get entries;
 }
diff --git a/runtime/observatory/lib/src/models/objects/instance.dart b/runtime/observatory/lib/src/models/objects/instance.dart
index 66965e9..a0400c5 100644
--- a/runtime/observatory/lib/src/models/objects/instance.dart
+++ b/runtime/observatory/lib/src/models/objects/instance.dart
@@ -120,9 +120,15 @@
 
   /// An instance of the Dart class TypeRef.
   typeRef,
+
+  /// An instance of the Dart class RawReceivePort
+  receivePort,
 }
 
-bool isTypedData(InstanceKind kind) {
+bool isTypedData(InstanceKind? kind) {
+  if (kind == null) {
+    return false;
+  }
   switch (kind) {
     case InstanceKind.uint8ClampedList:
     case InstanceKind.uint8List:
@@ -144,7 +150,10 @@
   }
 }
 
-bool isSimdValue(InstanceKind kind) {
+bool isSimdValue(InstanceKind? kind) {
+  if (kind == null) {
+    return false;
+  }
   switch (kind) {
     case InstanceKind.float32x4:
     case InstanceKind.float64x2:
@@ -155,7 +164,10 @@
   }
 }
 
-bool isAbstractType(InstanceKind kind) {
+bool isAbstractType(InstanceKind? kind) {
+  if (kind == null) {
+    return false;
+  }
   switch (kind) {
     case InstanceKind.type:
     case InstanceKind.typeRef:
@@ -168,10 +180,10 @@
 
 abstract class InstanceRef extends ObjectRef {
   /// What kind of instance is this?
-  InstanceKind get kind;
+  InstanceKind? get kind;
 
   /// Instance references always include their class.
-  ClassRef get clazz;
+  ClassRef? get clazz;
 
   /// [optional] The value of this instance as a string.
   ///
@@ -185,13 +197,13 @@
   ///   Float64x2
   ///   Int32x4
   ///   StackTrace
-  String get valueAsString;
+  String? get valueAsString;
 
   /// [optional] The valueAsString for String references may be truncated. If so,
   /// this property is added with the value 'true'.
   ///
   /// New code should use 'length' and 'count' instead.
-  bool get valueAsStringIsTruncated;
+  bool? get valueAsStringIsTruncated;
 
   /// [optional] The length of a List or the number of associations in a Map or
   /// the number of codeunits in a String.
@@ -214,25 +226,25 @@
   ///   Int32x4List
   ///   Float32x4List
   ///   Float64x2List
-  int get length;
+  int? get length;
 
   /// [optional] The name of a Type instance.
   ///
   /// Provided for instance kinds:
   ///   Type
-  String get name;
+  String? get name;
 
   /// [optional] The corresponding Class if this Type is canonical.
   ///
   /// Provided for instance kinds:
   ///   Type
-  ClassRef get typeClass;
+  ClassRef? get typeClass;
 
   /// [optional] The parameterized class of a type parameter:
   ///
   /// Provided for instance kinds:
   ///   TypeParameter
-  ClassRef get parameterizedClass;
+  ClassRef? get parameterizedClass;
 
   /// [optional] The pattern of a RegExp instance.
   ///
@@ -240,19 +252,19 @@
   ///
   /// Provided for instance kinds:
   ///   RegExp
-  InstanceRef get pattern;
+  InstanceRef? get pattern;
 
   /// [optional] The function associated with a Closure instance.
   ///
   /// Provided for instance kinds:
   ///   Closure
-  FunctionRef get closureFunction;
+  FunctionRef? get closureFunction;
 
   /// [optional] The context associated with a Closure instance.
   ///
   /// Provided for instance kinds:
   ///   Closure
-  ContextRef get closureContext;
+  ContextRef? get closureContext;
 }
 
 abstract class Instance extends Object implements InstanceRef {
@@ -277,7 +289,7 @@
   ///   Int32x4List
   ///   Float32x4List
   ///   Float64x2List
-  int get offset;
+  int? get offset;
 
   /// [optional] The number of elements or associations or codeunits returned.
   /// This is only provided when it is less than length.
@@ -300,7 +312,7 @@
   ///   Int32x4List
   ///   Float32x4List
   ///   Float64x2List
-  int get count;
+  int? get count;
 
   /// [optional] The elements of a TypedData instance.
   ///
@@ -319,19 +331,19 @@
   ///   Int32x4List
   ///   Float32x4List
   ///   Float64x2List
-  List<dynamic> get typedElements;
+  List<dynamic>? get typedElements;
 
   /// [optional] The native fields of this Instance.
-  Iterable<NativeField> get nativeFields;
+  Iterable<NativeField>? get nativeFields;
 
   /// [optional] The fields of this Instance.
-  Iterable<BoundField> get fields;
+  Iterable<BoundField>? get fields;
 
   /// [optional] The elements of a List instance.
   ///
   /// Provided for instance kinds:
   ///   List
-  Iterable<Guarded<ObjectRef>> get elements;
+  Iterable<Guarded<ObjectRef>>? get elements;
   // It should be:
   // Iterable<Guarded<InstanceRef>> get elements;
   // In some situations we obtain lists of non Instances
@@ -340,37 +352,37 @@
   ///
   /// Provided for instance kinds:
   ///   Map
-  Iterable<MapAssociation> get associations;
+  Iterable<MapAssociation>? get associations;
 
   /// [optional] The key for a WeakProperty instance.
   ///
   /// Provided for instance kinds:
   ///   WeakProperty
-  InstanceRef get key;
+  InstanceRef? get key;
 
   /// [optional] The key for a WeakProperty instance.
   ///
   /// Provided for instance kinds:
   ///   WeakProperty
-  InstanceRef get value;
+  InstanceRef? get value;
 
   /// [optional] The referent of a MirrorReference instance.
   ///
   /// Provided for instance kinds:
   ///   MirrorReference
-  ObjectRef get referent;
+  ObjectRef? get referent;
 
   /// [optional] The type arguments for this type.
   ///
   /// Provided for instance kinds:
   ///   Type
-  TypeArgumentsRef get typeArguments;
+  TypeArgumentsRef? get typeArguments;
 
   /// [optional] The index of a TypeParameter instance.
   ///
   /// Provided for instance kinds:
   ///   TypeParameter
-  int get parameterIndex;
+  int? get parameterIndex;
 
   /// [optional] The referent of a TypeRef instance.
   ///
@@ -379,7 +391,7 @@
   ///
   /// Provided for instance kinds:
   ///   TypeRef
-  InstanceRef get targetType;
+  InstanceRef? get targetType;
 
   /// [optional] The bound of a TypeParameter.
   ///
@@ -388,66 +400,66 @@
   ///
   /// Provided for instance kinds:
   ///   TypeParameter
-  InstanceRef get bound;
+  InstanceRef? get bound;
 
   /// [optional]
   ///
   /// Provided for instance kinds:
   ///   Closure
-  Breakpoint get activationBreakpoint;
+  Breakpoint? get activationBreakpoint;
 
   /// [optional]
   ///
   /// Provided for instance kinds:
   ///   RegExp
-  bool get isCaseSensitive;
+  bool? get isCaseSensitive;
 
   /// [optional]
   ///
   /// Provided for instance kinds:
   ///   RegExp
-  bool get isMultiLine;
+  bool? get isMultiLine;
 
   /// [optional]
   ///
   /// Provided for instance kinds:
   ///   RegExp
-  FunctionRef get oneByteFunction;
+  FunctionRef? get oneByteFunction;
 
   /// [optional]
   ///
   /// Provided for instance kinds:
   ///   RegExp
-  FunctionRef get twoByteFunction;
+  FunctionRef? get twoByteFunction;
 
   /// [optional]
   ///
   /// Provided for instance kinds:
   ///   RegExp
-  FunctionRef get externalOneByteFunction;
+  FunctionRef? get externalOneByteFunction;
 
   /// [optional]
   ///
   /// Provided for instance kinds:
   ///   RegExp
-  FunctionRef get externalTwoByteFunction;
+  FunctionRef? get externalTwoByteFunction;
 
   /// [optional]
   ///
   /// Provided for instance kinds:
   ///   RegExp
-  InstanceRef get oneByteBytecode;
+  InstanceRef? get oneByteBytecode;
 
   /// [optional]
   ///
   /// Provided for instance kinds:
   ///   RegExp
-  InstanceRef get twoByteBytecode;
+  InstanceRef? get twoByteBytecode;
 }
 
 abstract class BoundField {
-  FieldRef get decl;
-  Guarded<InstanceRef> get value;
+  FieldRef? get decl;
+  Guarded<InstanceRef>? get value;
 }
 
 abstract class NativeField {
diff --git a/runtime/observatory/lib/src/models/objects/isolate.dart b/runtime/observatory/lib/src/models/objects/isolate.dart
index a3c063a..3f83455 100644
--- a/runtime/observatory/lib/src/models/objects/isolate.dart
+++ b/runtime/observatory/lib/src/models/objects/isolate.dart
@@ -7,16 +7,16 @@
 abstract class IsolateRef {
   /// The id which is passed to the getIsolate RPC to reload this
   /// isolate.
-  String get id;
+  String? get id;
 
   /// A numeric id for this isolate, represented as a string. Unique.
-  int get number;
+  int? get number;
 
   /// A name identifying this isolate. Not guaranteed to be unique.
-  String get name;
+  String? get name;
 
   /// True if the isolate is a system isolate which is not running user code.
-  bool get isSystemIsolate;
+  bool? get isSystemIsolate;
 
   /// Trigger a full GC, collecting all unreachable or weakly reachable objects.
   Future collectAllGarbage();
@@ -26,7 +26,7 @@
 
 abstract class Isolate extends IsolateRef {
   /// The time that the VM started in milliseconds since the epoch.
-  DateTime get startTime;
+  DateTime? get startTime;
 
   /// Is the isolate in a runnable state?
   bool get runnable;
@@ -39,51 +39,51 @@
 
   /// The last pause event delivered to the isolate. If the isolate is
   /// running, this will be a resume event.
-  Event get pauseEvent;
+  Event? get pauseEvent;
 
   /// [optional] The root library for this isolate.
   ///
   /// Guaranteed to be initialized when the IsolateRunnable event fires.
-  LibraryRef get rootLibrary;
+  LibraryRef? get rootLibrary;
 
   /// A list of all libraries for this isolate.
   ///
   /// Guaranteed to be initialized when the IsolateRunnable event fires.
-  Iterable<LibraryRef> get libraries;
+  Iterable<LibraryRef>? get libraries;
 
   /// A list of all breakpoints for this isolate.
   //Iterable<Breakpoint> get breakpoints;
 
   /// [optional] The error that is causing this isolate to exit, if applicable.
-  Error get error;
+  Error? get error;
 
   /// The list of threads associated with this isolate.
-  Iterable<Thread> get threads;
+  Iterable<Thread>? get threads;
 
   /// The maximum amount of zone memory in bytes allocated by the isolate in
   /// all threads at a given time. Calculated using the high watermarks of each
   /// thread alive when a thread is unscheduled.
-  int get zoneHighWatermark;
+  int? get zoneHighWatermark;
 
   /// The number of zone handles currently held by this isolate.
-  int get numZoneHandles;
+  int? get numZoneHandles;
 
   /// The number of scoped handles currently held by this isolate.
-  int get numScopedHandles;
+  int? get numScopedHandles;
 
   /// The current pause on exception mode for this isolate.
   //ExceptionPauseMode get exceptionPauseMode;
 
   /// [optional] The list of service extension RPCs that are registered for this
   /// isolate, if any.
-  Iterable<String> get extensionRPCs;
+  Iterable<String>? get extensionRPCs;
 
-  Map get counters;
-  HeapSpace get newSpace;
-  HeapSpace get oldSpace;
+  Map? get counters;
+  HeapSpace? get newSpace;
+  HeapSpace? get oldSpace;
 
-  IsolateStatus get status;
+  IsolateStatus? get status;
 
   /// [optional]
-  FunctionRef get entry;
+  FunctionRef? get entry;
 }
diff --git a/runtime/observatory/lib/src/models/objects/isolate_group.dart b/runtime/observatory/lib/src/models/objects/isolate_group.dart
index 7b7a83c..3ede0ba 100644
--- a/runtime/observatory/lib/src/models/objects/isolate_group.dart
+++ b/runtime/observatory/lib/src/models/objects/isolate_group.dart
@@ -7,18 +7,18 @@
 abstract class IsolateGroupRef {
   /// The id which is passed to the getIsolateGroup RPC to reload this
   /// isolate group.
-  String get id;
+  String? get id;
 
   /// A numeric id for this isolate group, represented as a string. Unique.
-  int get number;
+  int? get number;
 
   /// A name identifying this isolate group. Not guaranteed to be unique.
-  String get name;
+  String? get name;
 
-  bool get isSystemIsolateGroup;
+  bool? get isSystemIsolateGroup;
 }
 
 abstract class IsolateGroup extends IsolateGroupRef {
   /// A list of all isolates in this isolate group.
-  Iterable<IsolateRef> get isolates;
+  Iterable<IsolateRef>? get isolates;
 }
diff --git a/runtime/observatory/lib/src/models/objects/library.dart b/runtime/observatory/lib/src/models/objects/library.dart
index 83bab54..b02a97d 100644
--- a/runtime/observatory/lib/src/models/objects/library.dart
+++ b/runtime/observatory/lib/src/models/objects/library.dart
@@ -6,10 +6,10 @@
 
 abstract class LibraryRef extends ObjectRef {
   /// The name of this library.
-  String get name;
+  String? get name;
 
   /// The uri of this library.
-  String get uri;
+  String? get uri;
 }
 
 abstract class Library extends Object implements LibraryRef {
@@ -17,22 +17,22 @@
   //bool get debuggable;
 
   /// A list of the imports for this library.
-  Iterable<LibraryDependency> get dependencies;
+  Iterable<LibraryDependency>? get dependencies;
 
   /// A list of the scripts which constitute this library.
-  Iterable<ScriptRef> get scripts;
+  Iterable<ScriptRef>? get scripts;
 
   /// A list of the top-level variables in this library.
-  Iterable<FieldRef> get variables;
+  Iterable<FieldRef>? get variables;
 
   /// A list of the top-level functions in this library.
-  Iterable<FunctionRef> get functions;
+  Iterable<FunctionRef>? get functions;
 
   /// A list of all classes in this library.
-  Iterable<ClassRef> get classes;
+  Iterable<ClassRef>? get classes;
 
-  ScriptRef get rootScript;
-  String get vmName;
+  ScriptRef? get rootScript;
+  String? get vmName;
 }
 
 abstract class LibraryDependency {
diff --git a/runtime/observatory/lib/src/models/objects/local_var_descriptors.dart b/runtime/observatory/lib/src/models/objects/local_var_descriptors.dart
index 5643b80..a8e6320 100644
--- a/runtime/observatory/lib/src/models/objects/local_var_descriptors.dart
+++ b/runtime/observatory/lib/src/models/objects/local_var_descriptors.dart
@@ -6,5 +6,5 @@
 
 abstract class LocalVarDescriptorsRef extends ObjectRef {
   /// [optional]
-  String get name;
+  String? get name;
 }
diff --git a/runtime/observatory/lib/src/models/objects/megamorphiccache.dart b/runtime/observatory/lib/src/models/objects/megamorphiccache.dart
index 74657de..5618a7e 100644
--- a/runtime/observatory/lib/src/models/objects/megamorphiccache.dart
+++ b/runtime/observatory/lib/src/models/objects/megamorphiccache.dart
@@ -5,12 +5,12 @@
 part of models;
 
 abstract class MegamorphicCacheRef extends ObjectRef {
-  String get selector;
+  String? get selector;
 }
 
 abstract class MegamorphicCache extends Object implements MegamorphicCacheRef {
-  String get selector;
-  int get mask;
-  InstanceRef get buckets;
-  InstanceRef get argumentsDescriptor;
+  String? get selector;
+  int? get mask;
+  InstanceRef? get buckets;
+  InstanceRef? get argumentsDescriptor;
 }
diff --git a/runtime/observatory/lib/src/models/objects/metric.dart b/runtime/observatory/lib/src/models/objects/metric.dart
index fd8f7ac..13c1c78 100644
--- a/runtime/observatory/lib/src/models/objects/metric.dart
+++ b/runtime/observatory/lib/src/models/objects/metric.dart
@@ -5,12 +5,12 @@
 part of models;
 
 abstract class Metric {
-  String get id;
-  String get name;
-  String get description;
+  String? get id;
+  String? get name;
+  String? get description;
 }
 
 abstract class MetricSample {
-  double get value;
-  DateTime get time;
+  double? get value;
+  DateTime? get time;
 }
diff --git a/runtime/observatory/lib/src/models/objects/notification.dart b/runtime/observatory/lib/src/models/objects/notification.dart
index 1f46766..54e8c61 100644
--- a/runtime/observatory/lib/src/models/objects/notification.dart
+++ b/runtime/observatory/lib/src/models/objects/notification.dart
@@ -10,7 +10,7 @@
   get exception;
 
   /// [optional]
-  StackTrace get stacktrace;
+  StackTrace? get stacktrace;
 }
 
 abstract class EventNotification implements Notification {
diff --git a/runtime/observatory/lib/src/models/objects/object.dart b/runtime/observatory/lib/src/models/objects/object.dart
index 044072f..6f258f6 100644
--- a/runtime/observatory/lib/src/models/objects/object.dart
+++ b/runtime/observatory/lib/src/models/objects/object.dart
@@ -6,7 +6,7 @@
 
 abstract class ObjectRef {
   /// A unique identifier for an Object.
-  String get id;
+  String? get id;
 }
 
 abstract class Object implements ObjectRef {
@@ -18,7 +18,7 @@
   ///
   /// Moving an Object into or out of the heap is considered a
   /// backwards compatible change for types other than Instance.
-  ClassRef get clazz;
+  ClassRef? get clazz;
 
   /// [optional] The size of this object in the heap.
   ///
@@ -27,9 +27,9 @@
   /// Note that the size can be zero for some objects. In the current
   /// VM implementation, this occurs for small integers, which are
   /// stored entirely within their object pointers.
-  int get size;
+  int? get size;
 
-  String get vmName;
+  String? get vmName;
 }
 
 abstract class RetainingObject {
diff --git a/runtime/observatory/lib/src/models/objects/objectpool.dart b/runtime/observatory/lib/src/models/objects/objectpool.dart
index ba65961..da7fd76 100644
--- a/runtime/observatory/lib/src/models/objects/objectpool.dart
+++ b/runtime/observatory/lib/src/models/objects/objectpool.dart
@@ -5,11 +5,11 @@
 part of models;
 
 abstract class ObjectPoolRef extends ObjectRef {
-  int get length;
+  int? get length;
 }
 
 abstract class ObjectPool extends Object implements ObjectPoolRef {
-  Iterable<ObjectPoolEntry> get entries;
+  Iterable<ObjectPoolEntry>? get entries;
 }
 
 enum ObjectPoolEntryKind { object, immediate, nativeEntryData, nativeEntry }
@@ -17,6 +17,6 @@
 abstract class ObjectPoolEntry {
   int get offset;
   ObjectPoolEntryKind get kind;
-  ObjectRef get asObject;
-  int get asInteger;
+  ObjectRef? get asObject;
+  int? get asInteger;
 }
diff --git a/runtime/observatory/lib/src/models/objects/pc_descriptors.dart b/runtime/observatory/lib/src/models/objects/pc_descriptors.dart
index fea4ce6..256a9dd 100644
--- a/runtime/observatory/lib/src/models/objects/pc_descriptors.dart
+++ b/runtime/observatory/lib/src/models/objects/pc_descriptors.dart
@@ -6,5 +6,5 @@
 
 abstract class PcDescriptorsRef extends ObjectRef {
   /// [optional]
-  String get name;
+  String? get name;
 }
diff --git a/runtime/observatory/lib/src/models/objects/sample_profile.dart b/runtime/observatory/lib/src/models/objects/sample_profile.dart
index 582e571..3dcd394 100644
--- a/runtime/observatory/lib/src/models/objects/sample_profile.dart
+++ b/runtime/observatory/lib/src/models/objects/sample_profile.dart
@@ -26,14 +26,14 @@
 }
 
 abstract class ProfileCode extends Profile {
-  CodeRef get code;
+  CodeRef? get code;
   Map<ProfileCode, int> get callers;
   Map<ProfileCode, int> get callees;
 }
 
 abstract class ProfileFunction extends Profile {
-  FunctionRef get function;
-  String get resolvedUrl;
+  FunctionRef? get function;
+  String? get resolvedUrl;
   Map<ProfileFunction, int> get callers;
   Map<ProfileFunction, int> get callees;
 }
diff --git a/runtime/observatory/lib/src/models/objects/script.dart b/runtime/observatory/lib/src/models/objects/script.dart
index df4b63b..a6ce8ee 100644
--- a/runtime/observatory/lib/src/models/objects/script.dart
+++ b/runtime/observatory/lib/src/models/objects/script.dart
@@ -6,23 +6,23 @@
 
 abstract class ScriptRef extends ObjectRef {
   /// The uri from which this script was loaded.
-  String get uri;
+  String? get uri;
 }
 
 abstract class Script extends Object implements ScriptRef {
   /// The library which owns this script.
-  LibraryRef get library;
+  LibraryRef? get library;
 
   /// The source code for this script. For certain built-in scripts,
   /// this may be reconstructed without source comments.
-  String get source;
+  String? get source;
 
-  DateTime get loadTime;
-  int get firstTokenPos;
-  int get lastTokenPos;
-  int get lineOffset;
-  int get columnOffset;
+  DateTime? get loadTime;
+  int? get firstTokenPos;
+  int? get lastTokenPos;
+  int? get lineOffset;
+  int? get columnOffset;
 
-  int tokenToLine(int token);
-  int tokenToCol(int token);
+  int? tokenToLine(int? token);
+  int? tokenToCol(int? token);
 }
diff --git a/runtime/observatory/lib/src/models/objects/single_target_cache.dart b/runtime/observatory/lib/src/models/objects/single_target_cache.dart
index 5178e7a..185df81 100644
--- a/runtime/observatory/lib/src/models/objects/single_target_cache.dart
+++ b/runtime/observatory/lib/src/models/objects/single_target_cache.dart
@@ -5,11 +5,11 @@
 part of models;
 
 abstract class SingleTargetCacheRef extends ObjectRef {
-  Code get target;
+  Code? get target;
 }
 
 abstract class SingleTargetCache extends Object
     implements SingleTargetCacheRef {
-  int get lowerLimit;
-  int get upperLimit;
+  int? get lowerLimit;
+  int? get upperLimit;
 }
diff --git a/runtime/observatory/lib/src/models/objects/source_location.dart b/runtime/observatory/lib/src/models/objects/source_location.dart
index 8a03f13..27a7c59 100644
--- a/runtime/observatory/lib/src/models/objects/source_location.dart
+++ b/runtime/observatory/lib/src/models/objects/source_location.dart
@@ -9,7 +9,7 @@
   ScriptRef get script;
 
   /// [optional] The first token of the location.
-  int get tokenPos;
+  int? get tokenPos;
 }
 
 abstract class SourceLocation implements Location {
@@ -17,19 +17,19 @@
   int get tokenPos;
 
   /// [optional] The last token of the location if this is a range.
-  int get endTokenPos;
+  int? get endTokenPos;
 }
 
 abstract class UnresolvedSourceLocation implements Location {
   /// [optional] The uri of the script containing the source location if the
   /// script has yet to be loaded.
-  String get scriptUri;
+  String? get scriptUri;
 
   /// [optional] An approximate line number for the source location. This may
   /// change when the location is resolved.
-  int get line;
+  int? get line;
 
   /// [optional] An approximate column number for the source location. This may
   /// change when the location is resolved.
-  int get column;
+  int? get column;
 }
diff --git a/runtime/observatory/lib/src/models/objects/subtype_test_cache.dart b/runtime/observatory/lib/src/models/objects/subtype_test_cache.dart
index cf56939..99ab1b1 100644
--- a/runtime/observatory/lib/src/models/objects/subtype_test_cache.dart
+++ b/runtime/observatory/lib/src/models/objects/subtype_test_cache.dart
@@ -7,5 +7,5 @@
 abstract class SubtypeTestCacheRef extends ObjectRef {}
 
 abstract class SubtypeTestCache extends Object implements SubtypeTestCacheRef {
-  InstanceRef get cache;
+  InstanceRef? get cache;
 }
diff --git a/runtime/observatory/lib/src/models/objects/thread.dart b/runtime/observatory/lib/src/models/objects/thread.dart
index 8d16a8c..b29d3e6 100644
--- a/runtime/observatory/lib/src/models/objects/thread.dart
+++ b/runtime/observatory/lib/src/models/objects/thread.dart
@@ -15,17 +15,17 @@
 
 abstract class Thread {
   /// The id associated with the thread on creation.
-  String get id;
+  String? get id;
 
   /// The task type associated with the thread.
-  ThreadKind get kind;
+  ThreadKind? get kind;
 
-  String get kindString;
+  String? get kindString;
 
   /// The maximum amount of zone memory in bytes allocated by a thread at a
   /// given time throughout the entire life of the thread.
-  int get zoneHighWatermark;
+  int? get zoneHighWatermark;
 
   /// The current Zone capacity available to this thread.
-  int get zoneCapacity;
+  int? get zoneCapacity;
 }
diff --git a/runtime/observatory/lib/src/models/objects/type_arguments.dart b/runtime/observatory/lib/src/models/objects/type_arguments.dart
index a3614dd..ffe2186 100644
--- a/runtime/observatory/lib/src/models/objects/type_arguments.dart
+++ b/runtime/observatory/lib/src/models/objects/type_arguments.dart
@@ -6,7 +6,7 @@
 
 abstract class TypeArgumentsRef extends ObjectRef {
   /// A name for this type argument list.
-  String get name;
+  String? get name;
 }
 
 abstract class TypeArguments extends Object implements TypeArgumentsRef {
@@ -14,5 +14,5 @@
   ///
   /// The value will always be one of the kinds:
   /// Type, TypeRef, TypeParameter.
-  Iterable<InstanceRef> get types;
+  Iterable<InstanceRef>? get types;
 }
diff --git a/runtime/observatory/lib/src/models/objects/unknown.dart b/runtime/observatory/lib/src/models/objects/unknown.dart
index 3faeed0..9228c8e 100644
--- a/runtime/observatory/lib/src/models/objects/unknown.dart
+++ b/runtime/observatory/lib/src/models/objects/unknown.dart
@@ -5,5 +5,5 @@
 part of models;
 
 abstract class UnknownObjectRef extends ObjectRef {
-  String get vmType;
+  String? get vmType;
 }
diff --git a/runtime/observatory/lib/src/models/objects/unlinked_call.dart b/runtime/observatory/lib/src/models/objects/unlinked_call.dart
index ed07750..37980ec 100644
--- a/runtime/observatory/lib/src/models/objects/unlinked_call.dart
+++ b/runtime/observatory/lib/src/models/objects/unlinked_call.dart
@@ -5,9 +5,9 @@
 part of models;
 
 abstract class UnlinkedCallRef extends ObjectRef {
-  String get selector;
+  String? get selector;
 }
 
 abstract class UnlinkedCall extends Object implements UnlinkedCallRef {
-  InstanceRef get argumentsDescriptor;
+  InstanceRef? get argumentsDescriptor;
 }
diff --git a/runtime/observatory/lib/src/models/objects/vm.dart b/runtime/observatory/lib/src/models/objects/vm.dart
index b69d744..10deac8 100644
--- a/runtime/observatory/lib/src/models/objects/vm.dart
+++ b/runtime/observatory/lib/src/models/objects/vm.dart
@@ -6,11 +6,11 @@
 
 abstract class VMRef {
   /// A name identifying this vm. Not guaranteed to be unique.
-  String get name;
+  String? get name;
 
   /// [Not actually from the apis]
   /// A name used to identify the VM in the UI.
-  String get displayName;
+  String? get displayName;
 }
 
 abstract class VM implements VMRef {
@@ -47,7 +47,7 @@
   /// The time that the VM started in milliseconds since the epoch.
   ///
   /// Suitable to pass to DateTime.fromMillisecondsSinceEpoch.
-  DateTime get startTime;
+  DateTime? get startTime;
 
   // A list of isolates running in the VM.
   Iterable<IsolateRef> get isolates;
diff --git a/runtime/observatory/lib/src/models/repositories/metric.dart b/runtime/observatory/lib/src/models/repositories/metric.dart
index ee10fdb..ed90d50 100644
--- a/runtime/observatory/lib/src/models/repositories/metric.dart
+++ b/runtime/observatory/lib/src/models/repositories/metric.dart
@@ -14,7 +14,7 @@
   MetricSamplingRate getSamplingRate(IsolateRef isolate, Metric metric);
   void setBufferSize(IsolateRef isolate, Metric metric, MetricBufferSize r);
   MetricBufferSize getBufferSize(IsolateRef isolate, Metric metric);
-  Iterable<MetricSample> getSamples(IsolateRef isolate, Metric metric);
+  Iterable<MetricSample>? getSamples(IsolateRef isolate, Metric metric);
   double getMinValue(IsolateRef isolate, Metric metric);
   double getMaxValue(IsolateRef isolate, Metric metric);
 }
diff --git a/runtime/observatory/lib/src/models/repositories/target.dart b/runtime/observatory/lib/src/models/repositories/target.dart
index 2c2db92..a443a54 100644
--- a/runtime/observatory/lib/src/models/repositories/target.dart
+++ b/runtime/observatory/lib/src/models/repositories/target.dart
@@ -11,11 +11,11 @@
 abstract class TargetRepository {
   Stream<TargetChangeEvent> get onChange;
 
-  Target get current;
+  Target? get current;
   Iterable<Target> list();
   void add(String address);
   void setCurrent(Target t);
   void delete(Target o);
-  Target find(String networkAddress);
+  Target? find(String networkAddress);
   bool isConnectedVMTarget(Target target);
 }
diff --git a/runtime/observatory/lib/src/repositories/allocation_profile.dart b/runtime/observatory/lib/src/repositories/allocation_profile.dart
index 365a6fc..5dc8667 100644
--- a/runtime/observatory/lib/src/repositories/allocation_profile.dart
+++ b/runtime/observatory/lib/src/repositories/allocation_profile.dart
@@ -22,7 +22,7 @@
       params['reset'] = true;
     }
     final dynamic response = await isolate.invokeRpc(_api, params);
-    Map defaults;
+    Map? defaults;
     if (combine) {
       defaults = await isolate.vm.invokeRpcNoUpgrade(_defaultsApi, {});
       defaults = defaults['map'];
diff --git a/runtime/observatory/lib/src/repositories/breakpoint.dart b/runtime/observatory/lib/src/repositories/breakpoint.dart
index 99a66ca..7465cb0 100644
--- a/runtime/observatory/lib/src/repositories/breakpoint.dart
+++ b/runtime/observatory/lib/src/repositories/breakpoint.dart
@@ -8,12 +8,12 @@
   Future addOnActivation(M.IsolateRef i, M.Instance closure) async {
     S.Isolate isolate = i as S.Isolate;
     assert(isolate != null);
-    await isolate.addBreakOnActivation(closure);
+    await isolate.addBreakOnActivation(closure as S.Instance);
   }
 
   Future remove(M.IsolateRef i, M.Breakpoint breakpoint) async {
     S.Isolate isolate = i as S.Isolate;
     assert(isolate != null);
-    await isolate.removeBreakpoint(breakpoint);
+    await isolate.removeBreakpoint(breakpoint as S.Breakpoint);
   }
 }
diff --git a/runtime/observatory/lib/src/repositories/editor.dart b/runtime/observatory/lib/src/repositories/editor.dart
index d58cb36..2728b14 100644
--- a/runtime/observatory/lib/src/repositories/editor.dart
+++ b/runtime/observatory/lib/src/repositories/editor.dart
@@ -6,24 +6,24 @@
 
 class EditorRepository extends M.EditorRepository {
   final S.VM _vm;
-  final String _editor;
+  final String? _editor;
 
   bool get isAvailable => _getService() != null;
 
-  EditorRepository(S.VM vm, {String editor})
+  EditorRepository(S.VM vm, {String? editor})
       : _vm = vm,
         _editor = editor {
     assert(_vm != null);
   }
 
-  S.Service _getService() {
+  S.Service? _getService() {
     Iterable<M.Service> services =
         _vm.services.where((s) => s.service == 'openSourceLocation');
     if (_editor != null) {
       services = services.where((s) => s.alias == _editor);
     }
     if (services.isNotEmpty) {
-      return services.first;
+      return services.first as S.Service;
     }
     return null;
   }
@@ -70,7 +70,7 @@
       return await openClass(i, o);
     }
     if (o is M.InstanceRef) {
-      return await openClass(i, o.clazz);
+      return await openClass(i, o.clazz!);
     }
     if (o is M.FieldRef) {
       return await openField(i, o);
@@ -80,18 +80,18 @@
     }
     if (o is M.InstanceRef) {
       if (o.closureFunction != null) {
-        return await openFunction(i, o.closureFunction);
+        return await openFunction(i, o.closureFunction!);
       }
-      return await openClass(i, o.clazz);
+      return await openClass(i, o.clazz!);
     }
     return new Future.value();
   }
 
-  Future openSourceLocation(M.IsolateRef i, M.SourceLocation l) async {
+  Future openSourceLocation(M.IsolateRef i, M.SourceLocation? l) async {
     final isolate = i as S.Isolate;
     assert(isolate != null);
     assert(l != null);
-    return await isolate.invokeRpc(_getService().method,
-        {'scriptId': l.script.id, 'tokenPos': l.tokenPos});
+    return await isolate.invokeRpc(_getService()!.method,
+        {'scriptId': l!.script.id!, 'tokenPos': l.tokenPos});
   }
 }
diff --git a/runtime/observatory/lib/src/repositories/inbound_references.dart b/runtime/observatory/lib/src/repositories/inbound_references.dart
index a9b63e0..18895fc 100644
--- a/runtime/observatory/lib/src/repositories/inbound_references.dart
+++ b/runtime/observatory/lib/src/repositories/inbound_references.dart
@@ -10,6 +10,6 @@
     assert(isolate != null);
     final response = await isolate
         .invokeRpc('getInboundReferences', {'targetId': id, 'limit': 100});
-    return new S.InboundReferences(response);
+    return new S.InboundReferences(response as S.ServiceMap);
   }
 }
diff --git a/runtime/observatory/lib/src/repositories/isolate.dart b/runtime/observatory/lib/src/repositories/isolate.dart
index 68b8ae1..e72431a 100644
--- a/runtime/observatory/lib/src/repositories/isolate.dart
+++ b/runtime/observatory/lib/src/repositories/isolate.dart
@@ -25,7 +25,7 @@
     return isolate;
   }
 
-  Future reloadSources(M.IsolateRef i, {M.Service service}) async {
+  Future reloadSources(M.IsolateRef i, {M.Service? service}) async {
     if (service == null) {
       S.Isolate isolate = i as S.Isolate;
       assert(isolate != null);
diff --git a/runtime/observatory/lib/src/repositories/metric.dart b/runtime/observatory/lib/src/repositories/metric.dart
index 2d90187..e1b7a9a 100644
--- a/runtime/observatory/lib/src/repositories/metric.dart
+++ b/runtime/observatory/lib/src/repositories/metric.dart
@@ -26,14 +26,14 @@
       <S.Isolate, Map<Metric, int>>{};
   final Map<S.Isolate, Map<Metric, int>> _sizes =
       <S.Isolate, Map<Metric, int>>{};
-  Timer _timer;
+  Timer? _timer;
   int count = 0;
 
   Future<Iterable<Metric>> list(M.IsolateRef i) async {
     S.Isolate isolate = i as S.Isolate;
     assert(isolate != null);
     if (_samples.containsKey(isolate)) {
-      return _samples[isolate].keys;
+      return _samples[isolate]!.keys;
     }
     return const [];
   }
@@ -71,14 +71,14 @@
       _rates.remove(isolate);
       _sizes.remove(isolate);
       if (_samples.isEmpty) {
-        _timer.cancel();
+        _timer!.cancel();
       }
     }
   }
 
   M.MetricSamplingRate getSamplingRate(M.IsolateRef i, M.Metric m) {
     if (_rates.containsKey(i)) {
-      final metrics = _rates[i];
+      final metrics = _rates[i]!;
       if (metrics.containsKey(m)) {
         switch (metrics[m]) {
           case 0:
@@ -101,9 +101,9 @@
 
   void setSamplingRate(M.IsolateRef i, M.Metric m, M.MetricSamplingRate r) {
     if (_rates.containsKey(i)) {
-      final metrics = _rates[i];
+      final metrics = _rates[i]!;
       if (metrics.containsKey(m)) {
-        metrics[m] = _rateToInteger(r);
+        metrics[m as Metric] = _rateToInteger(r);
       }
     } else {
       throw new Exception('Sampling for isolate ${i.id} is not started');
@@ -112,7 +112,7 @@
 
   M.MetricBufferSize getBufferSize(M.IsolateRef i, M.Metric m) {
     if (_sizes.containsKey(i)) {
-      final metrics = _sizes[i];
+      final metrics = _sizes[i]!;
       if (metrics.containsKey(m)) {
         switch (metrics[m]) {
           case 10:
@@ -129,9 +129,9 @@
 
   void setBufferSize(M.IsolateRef i, M.Metric m, M.MetricBufferSize s) {
     if (_sizes.containsKey(i)) {
-      final metrics = _sizes[i];
+      final metrics = _sizes[i]!;
       if (metrics.containsKey(m)) {
-        metrics[m] = _sizeToInteger(s);
+        metrics[m as Metric] = _sizeToInteger(s);
       }
     } else {
       throw new Exception('Sampling for isolate ${i.id} is not started');
@@ -168,9 +168,9 @@
     throw new Exception('Unknown MetricBufferSize ($s)');
   }
 
-  Iterable<M.MetricSample> getSamples(M.IsolateRef i, M.Metric m) {
+  Iterable<M.MetricSample>? getSamples(M.IsolateRef i, M.Metric m) {
     if (_samples.containsKey(i)) {
-      final metrics = _samples[i];
+      final metrics = _samples[i]!;
       if (metrics.containsKey(m)) {
         return metrics[m];
       }
@@ -192,12 +192,12 @@
 
   void _update(_) {
     for (final isolate in _rates.keys) {
-      final metrics = _rates[isolate];
+      final metrics = _rates[isolate]!;
       for (final metric in metrics.keys) {
-        final rate = metrics[metric];
+        final rate = metrics[metric]!;
         if (rate != 0 && count % rate == 0) {
-          final size = _sizes[isolate][metric];
-          final samples = _samples[isolate][metric];
+          final size = _sizes[isolate]![metric]!;
+          final samples = _samples[isolate]![metric]!;
           metric.internal.reload().then((m) {
             if (samples.length >= size) {
               samples.removeRange(0, samples.length - size + 1);
diff --git a/runtime/observatory/lib/src/repositories/notification.dart b/runtime/observatory/lib/src/repositories/notification.dart
index 19eb99e..22a891f 100644
--- a/runtime/observatory/lib/src/repositories/notification.dart
+++ b/runtime/observatory/lib/src/repositories/notification.dart
@@ -47,7 +47,7 @@
     if (_list.length != length) _notify();
   }
 
-  void deletePauseEvents({M.Isolate isolate}) {
+  void deletePauseEvents({M.Isolate? isolate}) {
     if (isolate == null) {
       deleteWhere((notification) {
         return notification is M.EventNotification &&
diff --git a/runtime/observatory/lib/src/repositories/persistent_handles.dart b/runtime/observatory/lib/src/repositories/persistent_handles.dart
index db94cbc..7716529 100644
--- a/runtime/observatory/lib/src/repositories/persistent_handles.dart
+++ b/runtime/observatory/lib/src/repositories/persistent_handles.dart
@@ -9,6 +9,6 @@
     S.Isolate isolate = i as S.Isolate;
     assert(isolate != null);
     final response = await isolate.invokeRpc('_getPersistentHandles', {});
-    return new S.PersistentHandles(response);
+    return new S.PersistentHandles(response as S.ServiceMap);
   }
 }
diff --git a/runtime/observatory/lib/src/repositories/ports.dart b/runtime/observatory/lib/src/repositories/ports.dart
index 324ef74..21f56ad 100644
--- a/runtime/observatory/lib/src/repositories/ports.dart
+++ b/runtime/observatory/lib/src/repositories/ports.dart
@@ -9,6 +9,6 @@
     S.Isolate isolate = i as S.Isolate;
     assert(isolate != null);
     final response = await isolate.invokeRpc('_getPorts', {});
-    return new S.Ports(response);
+    return new S.Ports(response as S.ServiceMap);
   }
 }
diff --git a/runtime/observatory/lib/src/repositories/retaining_path.dart b/runtime/observatory/lib/src/repositories/retaining_path.dart
index cfe4c38..8d0f1b3 100644
--- a/runtime/observatory/lib/src/repositories/retaining_path.dart
+++ b/runtime/observatory/lib/src/repositories/retaining_path.dart
@@ -10,6 +10,6 @@
     assert(isolate != null);
     final response = await isolate
         .invokeRpc('getRetainingPath', {'targetId': id, 'limit': 100});
-    return new S.RetainingPath(response);
+    return new S.RetainingPath(response as S.ServiceMap);
   }
 }
diff --git a/runtime/observatory/lib/src/repositories/sample_profile.dart b/runtime/observatory/lib/src/repositories/sample_profile.dart
index 944eaba..edb45cc 100644
--- a/runtime/observatory/lib/src/repositories/sample_profile.dart
+++ b/runtime/observatory/lib/src/repositories/sample_profile.dart
@@ -17,7 +17,7 @@
       _onProgress.stream;
 
   final S.ServiceObjectOwner owner;
-  final S.Class cls;
+  final S.Class? cls;
   final M.SampleProfileTag tag;
   final bool clear;
   final M.SampleProfileType type;
@@ -26,13 +26,13 @@
   double _progress = 0.0;
   final _fetchingTime = Stopwatch();
   final _loadingTime = Stopwatch();
-  SampleProfile _profile;
+  SampleProfile? _profile;
 
   M.SampleProfileLoadingStatus get status => _status;
   double get progress => _progress;
   Duration get fetchingTime => _fetchingTime.elapsed;
   Duration get loadingTime => _loadingTime.elapsed;
-  SampleProfile get profile => _profile;
+  SampleProfile get profile => _profile!;
 
   SampleProfileLoadingProgress(this.owner, this.tag, this.clear,
       {this.type: M.SampleProfileType.cpu, this.cls}) {
@@ -49,7 +49,7 @@
       var response;
       if (type == M.SampleProfileType.cpu) {
         response = cls != null
-            ? await cls.getAllocationSamples()
+            ? await cls!.getAllocationSamples()
             : await owner.invokeRpc('getCpuSamples', {'_code': true});
       } else if (type == M.SampleProfileType.memory) {
         assert(owner is M.VM);
@@ -65,7 +65,8 @@
       _triggerOnProgress();
 
       SampleProfile profile = SampleProfile();
-      Stream<double> progress = profile.loadProgress(owner, response);
+      Stream<double> progress =
+          profile.loadProgress(owner, response as S.ServiceMap);
       progress.listen((value) {
         _progress = value;
         _triggerOnProgress();
@@ -98,7 +99,7 @@
   }
 
   void reuse(M.SampleProfileTag t) {
-    _profile.tagOrder = t;
+    _profile!.tagOrder = t;
     final onProgress =
         StreamController<SampleProfileLoadingProgressEvent>.broadcast();
     Timer.run(() {
@@ -111,7 +112,7 @@
 
 class IsolateSampleProfileRepository
     implements M.IsolateSampleProfileRepository {
-  SampleProfileLoadingProgress _last;
+  SampleProfileLoadingProgress? _last;
 
   Stream<SampleProfileLoadingProgressEvent> get(
       M.IsolateRef i, M.SampleProfileTag t,
@@ -120,12 +121,12 @@
     assert(forceFetch != null);
     S.Isolate isolate = i as S.Isolate;
     assert(isolate != null);
-    if ((_last != null) && !clear && !forceFetch && (_last.owner == isolate)) {
-      _last.reuse(t);
+    if ((_last != null) && !clear && !forceFetch && (_last!.owner == isolate)) {
+      _last!.reuse(t);
     } else {
       _last = SampleProfileLoadingProgress(isolate, t, clear);
     }
-    return _last.onProgress;
+    return _last!.onProgress;
   }
 }
 
@@ -155,7 +156,7 @@
 
 class NativeMemorySampleProfileRepository
     implements M.NativeMemorySampleProfileRepository {
-  SampleProfileLoadingProgress _last;
+  SampleProfileLoadingProgress? _last;
 
   Stream<SampleProfileLoadingProgressEvent> get(M.VM vm, M.SampleProfileTag t,
       {bool forceFetch: false, bool clear: false}) {
@@ -163,12 +164,12 @@
     S.VM owner = vm as S.VM;
     assert(owner != null);
 
-    if ((_last != null) && (_last.profile != null) && !forceFetch) {
-      _last.reuse(t);
+    if ((_last != null) && (_last!.profile != null) && !forceFetch) {
+      _last!.reuse(t);
     } else {
       _last = SampleProfileLoadingProgress(owner, t, false,
           type: M.SampleProfileType.memory);
     }
-    return _last.onProgress;
+    return _last!.onProgress;
   }
 }
diff --git a/runtime/observatory/lib/src/repositories/target.dart b/runtime/observatory/lib/src/repositories/target.dart
index 4fb1fb1..eec61d0 100644
--- a/runtime/observatory/lib/src/repositories/target.dart
+++ b/runtime/observatory/lib/src/repositories/target.dart
@@ -20,7 +20,7 @@
   final SettingsRepository _settings = new SettingsRepository('targetManager');
 
   final List<SC.WebSocketVMTarget> _list = <SC.WebSocketVMTarget>[];
-  SC.WebSocketVMTarget current;
+  SC.WebSocketVMTarget? current;
   final IsConnectedVMTargetDelegate _isConnectedVMTarget;
 
   factory TargetRepository(IsConnectedVMTargetDelegate isConnectedVMTarget) {
@@ -59,7 +59,7 @@
       return;
     }
     current = target;
-    current.lastConnectionTime = new DateTime.now().millisecondsSinceEpoch;
+    current!.lastConnectionTime = new DateTime.now().millisecondsSinceEpoch;
     _onChange.add(new TargetChangeEvent(this));
     _store();
   }
@@ -99,7 +99,7 @@
   }
 
   /// Find by networkAddress.
-  SC.WebSocketVMTarget find(String networkAddress) {
+  SC.WebSocketVMTarget? find(String networkAddress) {
     for (SC.WebSocketVMTarget item in _list) {
       if (item.networkAddress == networkAddress) {
         return item;
@@ -114,8 +114,8 @@
     // http://localhost:8080?override-port=8181
     // http://localhost:8080?override-port=8181&override-host=10.0.0.2
     final Uri serverAddress = Uri.parse(window.location.toString());
-    final String port = serverAddress.queryParameters['override-port'];
-    final String host = serverAddress.queryParameters['override-host'];
+    final String? port = serverAddress.queryParameters['override-port'];
+    final String? host = serverAddress.queryParameters['override-host'];
     final Uri wsAddress = new Uri(
       scheme: 'ws',
       host: host ?? serverAddress.host,
diff --git a/runtime/observatory/lib/src/repositories/timeline.dart b/runtime/observatory/lib/src/repositories/timeline.dart
index 7c0e4a7..834e637 100644
--- a/runtime/observatory/lib/src/repositories/timeline.dart
+++ b/runtime/observatory/lib/src/repositories/timeline.dart
@@ -11,7 +11,8 @@
 
   Future<M.TimelineFlags> getFlags(M.VMRef ref) async {
     S.VM vm = ref as S.VM;
-    S.ServiceMap response = await vm.invokeRpc('getVMTimelineFlags', {});
+    S.ServiceMap response =
+        await vm.invokeRpc('getVMTimelineFlags', {}) as S.ServiceMap;
     return new S.TimelineFlags(response);
   }
 
@@ -36,7 +37,7 @@
     final trie = profile.loadFunctionTree(M.ProfileTreeDirection.inclusive);
     final root = trie.root;
     int nextId = kRootFrameId;
-    processFrame(FunctionCallTreeNode current, FunctionCallTreeNode parent) {
+    processFrame(FunctionCallTreeNode current, FunctionCallTreeNode? parent) {
       int id = nextId;
       ++nextId;
       current.frameId = id;
diff --git a/runtime/observatory/lib/src/repositories/timeline_base.dart b/runtime/observatory/lib/src/repositories/timeline_base.dart
index 6f12bc0..24a5daf 100644
--- a/runtime/observatory/lib/src/repositories/timeline_base.dart
+++ b/runtime/observatory/lib/src/repositories/timeline_base.dart
@@ -18,11 +18,12 @@
       Future<S.ServiceObject> cpuSamples) async {
     const kRootFrameId = 0;
     final profile = SampleProfile();
-    await profile.load(isolate as S.ServiceObjectOwner, await cpuSamples);
+    await profile.load(
+        isolate as S.ServiceObjectOwner, await cpuSamples as S.ServiceMap);
     final trie = profile.loadFunctionTree(M.ProfileTreeDirection.inclusive);
     final root = trie.root;
     int nextId = kRootFrameId;
-    processFrame(FunctionCallTreeNode current, FunctionCallTreeNode parent) {
+    processFrame(FunctionCallTreeNode current, FunctionCallTreeNode? parent) {
       int id = nextId;
       ++nextId;
       current.frameId = id;
@@ -64,7 +65,7 @@
   }
 
   Future<Map> getCpuProfileTimeline(M.VMRef ref,
-      {int timeOriginMicros, int timeExtentMicros}) async {
+      {int? timeOriginMicros, int? timeExtentMicros}) async {
     final S.VM vm = ref as S.VM;
     final traceObject = <String, dynamic>{
       _kStackFrames: {},
@@ -86,10 +87,10 @@
   Future<Map> getTimeline(M.VMRef ref) async {
     final S.VM vm = ref as S.VM;
     final S.ServiceMap vmTimelineResponse =
-        await vm.invokeRpc('getVMTimeline', {});
+        await vm.invokeRpc('getVMTimeline', {}) as S.ServiceMap;
     final timeOriginMicros = vmTimelineResponse[kTimeOriginMicros];
     final timeExtentMicros = vmTimelineResponse[kTimeExtentMicros];
-    var traceObject = <String, dynamic>{
+    var traceObject = <dynamic, dynamic>{
       _kStackFrames: {},
       _kTraceEvents: [],
     };
diff --git a/runtime/observatory/lib/src/sample_profile/sample_profile.dart b/runtime/observatory/lib/src/sample_profile/sample_profile.dart
index 48667cc..06280ce 100644
--- a/runtime/observatory/lib/src/sample_profile/sample_profile.dart
+++ b/runtime/observatory/lib/src/sample_profile/sample_profile.dart
@@ -16,8 +16,8 @@
   final attributes = <String>{};
 
   // Used for building timeline
-  int frameId = null;
-  int parentId = null;
+  int? frameId = null;
+  int? parentId = null;
 
   // Either a ProfileCode or a ProfileFunction.
   Object get profileData;
@@ -38,7 +38,8 @@
   void tick(Map sample, {bool exclusive = false}) {
     ++_count;
     if (SampleProfile._isNativeAllocationSample(sample)) {
-      final allocationSize = sample[SampleProfile._kNativeAllocationSizeBytes];
+      final allocationSize =
+          sample[SampleProfile._kNativeAllocationSizeBytes] as int;
       if (exclusive) {
         exclusiveNativeAllocations += allocationSize;
       }
@@ -54,7 +55,7 @@
 
   Object get profileData => profileCode;
 
-  String get name => profileCode.code.name;
+  String get name => profileCode.code.name!;
 
   final attributes = <String>{};
   CodeCallTreeNode(this.profileCode, int count, int inclusiveNativeAllocations,
@@ -66,7 +67,7 @@
   }
 
   CodeCallTreeNode.fromIndex(this.profile, int tableIndex)
-      : profileCode = profile.codes[tableIndex],
+      : profileCode = profile.codes[tableIndex] as ProfileCode,
         super(<CodeCallTreeNode>[]);
 
   CodeCallTreeNode getChild(int codeTableIndex) {
@@ -116,14 +117,15 @@
     treeFilter.build();
     if ((treeFilter.filtered.root.inclusiveNativeAllocations != null) &&
         (treeFilter.filtered.root.inclusiveNativeAllocations != 0)) {
-      _setCodeMemoryPercentage(null, treeFilter.filtered.root);
+      _setCodeMemoryPercentage(
+          null, treeFilter.filtered.root as CodeCallTreeNode);
     } else {
-      _setCodePercentage(null, treeFilter.filtered.root);
+      _setCodePercentage(null, treeFilter.filtered.root as CodeCallTreeNode);
     }
-    return treeFilter.filtered;
+    return treeFilter.filtered as CodeCallTree;
   }
 
-  _setCodePercentage(CodeCallTreeNode parent, CodeCallTreeNode node) {
+  _setCodePercentage(CodeCallTreeNode? parent, CodeCallTreeNode node) {
     assert(node != null);
     var parentPercentage = 1.0;
     var parentCount = node.count;
@@ -141,7 +143,7 @@
     }
   }
 
-  _setCodeMemoryPercentage(CodeCallTreeNode parent, CodeCallTreeNode node) {
+  _setCodeMemoryPercentage(CodeCallTreeNode? parent, CodeCallTreeNode node) {
     assert(node != null);
     var parentPercentage = 1.0;
     var parentMemory = node.inclusiveNativeAllocations;
@@ -164,7 +166,7 @@
   }
 
   _recordCallerAndCalleesInner(
-      CodeCallTreeNode caller, CodeCallTreeNode callee) {
+      CodeCallTreeNode? caller, CodeCallTreeNode callee) {
     if (caller != null) {
       caller.profileCode._recordCallee(callee.profileCode, callee.count);
       callee.profileCode._recordCaller(caller.profileCode, caller.count);
@@ -208,7 +210,7 @@
   }
 
   FunctionCallTreeNode.fromIndex(this.profile, int tableIndex)
-      : profileFunction = profile.functions[tableIndex],
+      : profileFunction = profile.functions[tableIndex] as ProfileFunction,
         super(<FunctionCallTreeNode>[]);
 
   FunctionCallTreeNode getChild(int functionTableIndex) {
@@ -263,7 +265,7 @@
     _descend(_unfilteredTree.root);
   }
 
-  CallTreeNode _findInChildren(CallTreeNode current, CallTreeNode needle) {
+  CallTreeNode? _findInChildren(CallTreeNode current, CallTreeNode needle) {
     for (var child in current.children) {
       if ((child as CallTreeNode).profileData == needle.profileData) {
         return child;
@@ -276,7 +278,7 @@
 
   /// Add all nodes in [_currentPath].
   FunctionCallTreeNode _addCurrentPath() {
-    FunctionCallTreeNode current = filtered.root;
+    FunctionCallTreeNode current = filtered.root as FunctionCallTreeNode;
     // Tree root is always the first element of the current path.
     assert(_unfilteredTree.root == _currentPath[0]);
     // Assert that unfiltered tree's root and filtered tree's root are different.
@@ -289,38 +291,38 @@
       if (child == null) {
         // New node.
         child = _copyNode(toAdd);
-        current.children.add(child);
+        current.children.add(child as FunctionCallTreeNode);
       }
-      current = child;
+      current = child as FunctionCallTreeNode;
     }
     return current;
   }
 
   /// Starting at [current] append [next] and all of [next]'s sub-trees
-  _appendTree(CallTreeNode current, CallTreeNode next) {
+  _appendTree(CallTreeNode current, CallTreeNode? next) {
     if (next == null) {
       return;
     }
     var child = _findInChildren(current, next);
     if (child == null) {
-      child = _copyNode(next);
+      child = _copyNode(next as NodeT);
       current.children.add(child);
     }
     current = child;
     for (var nextChild in next.children) {
-      _appendTree(current, nextChild);
+      _appendTree(current, nextChild as CallTreeNode);
     }
   }
 
   /// Add path from root to [child], [child], and all of [child]'s sub-trees
   /// to filtered tree.
-  _addTree(CallTreeNode child) {
+  _addTree(CallTreeNode? child) {
     var current = _addCurrentPath();
     _appendTree(current, child);
   }
 
   /// Descend further into the tree. [current] is from the unfiltered tree.
-  _descend(CallTreeNode current) {
+  _descend(CallTreeNode? current) {
     if (current == null) {
       return;
     }
@@ -334,13 +336,13 @@
       } else {
         // Add all child trees.
         for (var child in current.children) {
-          _addTree(child);
+          _addTree(child as CallTreeNode);
         }
       }
     } else {
       // Did not match, descend to each child.
       for (var child in current.children) {
-        _descend(child);
+        _descend(child as CallTreeNode);
       }
     }
 
@@ -359,13 +361,13 @@
             FunctionCallTree(
                 tree.inclusive,
                 FunctionCallTreeNode(
-                    tree.root.profileData,
+                    tree.root.profileData as ProfileFunction,
                     tree.root.count,
                     tree.root.inclusiveNativeAllocations,
                     tree.root.exclusiveNativeAllocations)));
 
   _copyNode(FunctionCallTreeNode node) {
-    return FunctionCallTreeNode(node.profileData, node.count,
+    return FunctionCallTreeNode(node.profileData as ProfileFunction, node.count,
         node.inclusiveNativeAllocations, node.exclusiveNativeAllocations);
   }
 }
@@ -379,13 +381,13 @@
             CodeCallTree(
                 tree.inclusive,
                 CodeCallTreeNode(
-                    tree.root.profileData,
+                    tree.root.profileData as ProfileCode,
                     tree.root.count,
                     tree.root.inclusiveNativeAllocations,
                     tree.root.exclusiveNativeAllocations)));
 
   _copyNode(CodeCallTreeNode node) {
-    return CodeCallTreeNode(node.profileData, node.count,
+    return CodeCallTreeNode(node.profileData as ProfileCode, node.count,
         node.inclusiveNativeAllocations, node.exclusiveNativeAllocations);
   }
 }
@@ -407,15 +409,17 @@
     treeFilter.build();
     if ((treeFilter.filtered.root.inclusiveNativeAllocations != null) &&
         (treeFilter.filtered.root.inclusiveNativeAllocations != 0)) {
-      _setFunctionMemoryPercentage(null, treeFilter.filtered.root);
+      _setFunctionMemoryPercentage(
+          null, treeFilter.filtered.root as FunctionCallTreeNode);
     } else {
-      _setFunctionPercentage(null, treeFilter.filtered.root);
+      _setFunctionPercentage(
+          null, treeFilter.filtered.root as FunctionCallTreeNode);
     }
-    return treeFilter.filtered;
+    return treeFilter.filtered as FunctionCallTree;
   }
 
   void _setFunctionPercentage(
-      FunctionCallTreeNode parent, FunctionCallTreeNode node) {
+      FunctionCallTreeNode? parent, FunctionCallTreeNode node) {
     assert(node != null);
     var parentPercentage = 1.0;
     var parentCount = node.count;
@@ -434,7 +438,7 @@
   }
 
   void _setFunctionMemoryPercentage(
-      FunctionCallTreeNode parent, FunctionCallTreeNode node) {
+      FunctionCallTreeNode? parent, FunctionCallTreeNode node) {
     assert(node != null);
     var parentPercentage = 1.0;
     var parentMemory = node.inclusiveNativeAllocations;
@@ -457,7 +461,7 @@
   }
 
   _markFunctionCallsInner(
-      FunctionCallTreeNode caller, FunctionCallTreeNode callee) {
+      FunctionCallTreeNode? caller, FunctionCallTreeNode callee) {
     if (caller != null) {
       caller.profileFunction
           ._recordCallee(callee.profileFunction, callee.count);
@@ -495,8 +499,8 @@
   final int tableIndex;
   final SampleProfile profile;
   final Code code;
-  int exclusiveTicks;
-  int inclusiveTicks;
+  int exclusiveTicks = 0;
+  int inclusiveTicks = 0;
   double normalizedExclusiveTicks = 0.0;
   double normalizedInclusiveTicks = 0.0;
   final addressTicks = <int, CodeTick>{};
@@ -553,15 +557,15 @@
     if (code.kind == M.CodeKind.stub) {
       attributes.add('stub');
     } else if (code.kind == M.CodeKind.dart) {
-      if (code.isNative) {
+      if (code.isNative!) {
         attributes.add('ffi'); // Not to be confused with a C function.
       } else {
         attributes.add('dart');
       }
-      if (code.hasIntrinsic) {
+      if (code.hasIntrinsic!) {
         attributes.add('intrinsic');
       }
-      if (code.isOptimized) {
+      if (code.isOptimized!) {
         attributes.add('optimized');
       } else {
         attributes.add('unoptimized');
@@ -680,7 +684,7 @@
       attribs.add('native');
     } else if (M.isSyntheticFunction(function.kind)) {
       attribs.add('synthetic');
-    } else if (function.isNative) {
+    } else if (function.isNative!) {
       attribs.add('ffi'); // Not to be confused with a C function.
     } else {
       attribs.add('dart');
@@ -746,7 +750,7 @@
 }
 
 class SampleProfile extends M.SampleProfile {
-  Isolate isolate;
+  Isolate? isolate;
 
   int sampleCount = 0;
   int samplePeriod = 0;
@@ -852,7 +856,7 @@
       Future.delayed(duration);
 
   Future _loadCommon(ServiceObjectOwner owner, ServiceMap profile,
-      [StreamController<double> progress]) async {
+      [StreamController<double>? progress]) async {
     final watch = Stopwatch();
     watch.start();
     int count = 0;
@@ -883,7 +887,7 @@
 
       if ((owner != null) && (owner is Isolate)) {
         isolate = owner;
-        isolate.resetCachedProfileData();
+        isolate!.resetCachedProfileData();
       }
 
       pid = profile[_kPid];
@@ -957,32 +961,32 @@
 
   int _getProfileFunctionTagIndex(String tag) {
     if (_functionTagMapping.containsKey(tag)) {
-      return _functionTagMapping[tag];
+      return _functionTagMapping[tag]!;
     }
     throw ArgumentError('$tag is not a valid tag!');
   }
 
   int _getProfileCodeTagIndex(String tag) {
     if (_codeTagMapping.containsKey(tag)) {
-      return _codeTagMapping[tag];
+      return _codeTagMapping[tag]!;
     }
     throw ArgumentError('$tag is not a valid tag!');
   }
 
   void _buildFunctionTagMapping() {
     for (int i = 0; i < functions.length; ++i) {
-      final function = functions[i].function;
+      final function = functions[i].function!;
       if (function.kind == M.FunctionKind.tag) {
-        _functionTagMapping[function.name] = i;
+        _functionTagMapping[function.name!] = i;
       }
     }
   }
 
   void _buildCodeTagMapping() {
     for (int i = 0; i < codes.length; ++i) {
-      final code = codes[i].code;
+      final code = codes[i].code!;
       if (code.kind == M.CodeKind.tag) {
-        _codeTagMapping[code.name] = i;
+        _codeTagMapping[code.name!] = i;
       }
     }
   }
@@ -1010,7 +1014,7 @@
       final tableIndex = isCode
           ? _getProfileCodeTagIndex(userTag)
           : _getProfileFunctionTagIndex(userTag);
-      current = current.getChild(tableIndex);
+      current = current.getChild(tableIndex) as NodeT;
       current.tick(sample);
     } catch (_) {/* invalid tag */} finally {
       return current;
@@ -1024,7 +1028,7 @@
       final tableIndex = isCode
           ? _getProfileCodeTagIndex(kTruncatedTag)
           : _getProfileFunctionTagIndex(kTruncatedTag);
-      current = current.getChild(tableIndex);
+      current = current.getChild(tableIndex) as NodeT;
       current.tick(sample);
       // We don't need to tick the tag itself since this is done in the VM for
       // the truncated tag, unlike other VM and user tags.
@@ -1140,7 +1144,7 @@
       Map sample, List<int> stack, int frameIndex, bool inclusive) {
     final child = parent.getChild(stack[frameIndex]);
     child.tick(sample, exclusive: (frameIndex == 0));
-    return child;
+    return child as NodeT;
   }
 
   FunctionCallTreeNode buildFunctionTrie(bool inclusive) {
diff --git a/runtime/observatory/lib/src/service/object.dart b/runtime/observatory/lib/src/service/object.dart
index 046513d..2d9a331 100644
--- a/runtime/observatory/lib/src/service/object.dart
+++ b/runtime/observatory/lib/src/service/object.dart
@@ -54,8 +54,8 @@
   static const kFileSystemDoesNotExist = 1002;
   static const kFileDoesNotExist = 1003;
 
-  int code;
-  Map data;
+  int? code;
+  Map? data;
 
   static _getMessage(Map errorMap) {
     Map data = errorMap['data'];
@@ -83,12 +83,12 @@
   String toString() => 'NetworkRpcException(${message})';
 }
 
-Future<ServiceObject> ignoreNetworkErrors(Object error,
-    [ServiceObject resultOnNetworkError = null]) {
+Future<ServiceObject?> ignoreNetworkErrors(Object error, StackTrace st,
+    [ServiceObject? resultOnNetworkError]) {
   if (error is NetworkRpcException) {
     return new Future.value(resultOnNetworkError);
   }
-  return new Future.error(error);
+  return new Future.error(error, st);
 }
 
 class MalformedResponseRpcException extends RpcException {
@@ -102,7 +102,7 @@
 /// A [ServiceObject] represents a persistent object within the vm.
 abstract class ServiceObject implements M.ObjectRef {
   static int LexicalSortName(ServiceObject o1, ServiceObject o2) {
-    return o1.name.compareTo(o2.name);
+    return o1.name!.compareTo(o2.name!);
   }
 
   List<T> removeDuplicatesAndSortLexical<T extends ServiceObject>(
@@ -112,26 +112,26 @@
 
   /// The owner of this [ServiceObject].  This can be an [Isolate], a
   /// [VM], or null.
-  ServiceObjectOwner get owner => _owner;
-  ServiceObjectOwner _owner;
+  ServiceObjectOwner? get owner => _owner;
+  ServiceObjectOwner? _owner;
 
   /// The [VM] which owns this [ServiceObject].
-  VM get vm => _owner.vm;
+  VM get vm => _owner!.vm;
 
   /// The [Isolate] which owns this [ServiceObject].  May be null.
-  Isolate get isolate => _owner.isolate;
+  Isolate? get isolate => _owner!.isolate;
 
   /// The id of this object.
-  String get id => _id;
-  String _id;
+  String? get id => _id;
+  String? _id;
 
   /// The user-level type of this object.
-  String get type => _type;
-  String _type;
+  String? get type => _type;
+  String? _type;
 
   /// The vm type of this object.
-  String get vmType => _vmType;
-  String _vmType;
+  String? get vmType => _vmType;
+  String? _vmType;
 
   bool get isICData => vmType == 'ICData';
   bool get isMegamorphicCache => vmType == 'MegamorphicCache';
@@ -169,23 +169,20 @@
 
   /// Is this object cacheable?  That is, is it impossible for the [id]
   /// of this object to change?
-  bool _canCache;
+  late bool _canCache;
   bool get canCache => _canCache;
 
   /// Is this object immutable after it is [loaded]?
   bool get immutable => false;
 
-  String name;
-  String vmName;
+  String? name;
+  String? vmName;
 
   /// Creates an empty [ServiceObject].
-  ServiceObject._empty(this._owner);
+  ServiceObject._empty(ServiceObjectOwner? this._owner);
 
   /// Creates a [ServiceObject] initialized from [map].
-  factory ServiceObject._fromMap(ServiceObjectOwner owner, Map map) {
-    if (map == null) {
-      return null;
-    }
+  static ServiceObject _fromMap(ServiceObjectOwner? owner, Map map) {
     if (!_isServiceMap(map)) {
       Logger.root.severe('Malformed service object: $map');
     }
@@ -227,10 +224,10 @@
         obj = new ServiceMetric._empty(owner);
         break;
       case 'Isolate':
-        obj = new Isolate._empty(owner.vm);
+        obj = new Isolate._empty(owner!.vm);
         break;
       case 'IsolateGroup':
-        obj = new IsolateGroup._empty(owner.vm);
+        obj = new IsolateGroup._empty(owner!.vm);
         break;
       case 'Library':
         obj = new Library._empty(owner);
@@ -316,14 +313,14 @@
     return reload();
   }
 
-  Future<ServiceObject> _inProgressReload;
+  Future<ServiceObject>? _inProgressReload;
 
   Future<Map> _fetchDirect({int count: kDefaultFieldLimit}) {
     Map params = {
       'objectId': id,
       'count': count,
     };
-    return isolate.invokeRpcNoUpgrade('getObject', params);
+    return isolate!.invokeRpcNoUpgrade('getObject', params);
   }
 
   /// Reload [this]. Returns a future which completes to [this] or
@@ -347,7 +344,7 @@
         var mapType = _stripRef(map['type']);
         if (mapType == 'Sentinel') {
           // An object may have been collected, etc.
-          completer.complete(new ServiceObject._fromMap(owner, map));
+          completer.complete(ServiceObject._fromMap(owner, map));
         } else {
           // TODO(turnidge): Check for vmType changing as well?
           assert(mapType == _type);
@@ -363,7 +360,7 @@
         _inProgressReload = null;
       });
     }
-    return _inProgressReload;
+    return _inProgressReload!;
   }
 
   /// Update [this] using [map] as a source. [map] can be a reference.
@@ -392,7 +389,6 @@
     } else {
       _vmType = _type;
     }
-
     _update(map, mapIsRef);
   }
 
@@ -406,11 +402,11 @@
 }
 
 abstract class HeapObject extends ServiceObject implements M.Object {
-  Class clazz;
-  int size;
-  int retainedSize;
+  Class? clazz;
+  int? size;
+  int? retainedSize;
 
-  HeapObject._empty(ServiceObjectOwner owner) : super._empty(owner);
+  HeapObject._empty(ServiceObjectOwner? owner) : super._empty(owner);
 
   void _update(Map map, bool mapIsRef) {
     if (map['class'] != null) {
@@ -421,10 +417,12 @@
 
     // Load the full class object if the isolate is runnable.
     if (clazz != null) {
-      if (clazz.isolate.runnable) {
+      if (clazz!.isolate!.runnable) {
         // No one awaits on this request so we silence any network errors
         // that occur here but forward other errors.
-        clazz.load().catchError((error) => ignoreNetworkErrors(error, clazz));
+        clazz!
+            .load()
+            .catchError((error, st) => ignoreNetworkErrors(error, st, clazz));
       }
     }
 
@@ -436,14 +434,14 @@
 }
 
 class RetainingObject implements M.RetainingObject {
-  int get retainedSize => object.retainedSize;
+  int get retainedSize => object.retainedSize!;
   final HeapObject object;
   RetainingObject(this.object);
 }
 
 abstract class ServiceObjectOwner extends ServiceObject {
   /// Creates an empty [ServiceObjectOwner].
-  ServiceObjectOwner._empty(ServiceObjectOwner owner) : super._empty(owner);
+  ServiceObjectOwner._empty(ServiceObjectOwner? owner) : super._empty(owner);
 
   /// Builds a [ServiceObject] corresponding to the [id] from [map].
   /// The result may come from the cache.  The result will not necessarily
@@ -455,30 +453,30 @@
 
 abstract class Location implements M.Location {
   Script get script;
-  int get tokenPos;
-  Future<int> getLine();
-  Future<int> getColumn();
+  int? get tokenPos;
+  Future<int?> getLine();
+  Future<int?> getColumn();
   Future<String> toUserString();
 }
 
 /// A [SourceLocation] represents a location or range in the source code.
 class SourceLocation extends ServiceObject
     implements Location, M.SourceLocation {
-  Script script;
-  int tokenPos;
-  int endTokenPos;
+  late Script script;
+  late int tokenPos;
+  int? endTokenPos;
 
-  Future<int> getLine() async {
+  Future<int?> getLine() async {
     await script.load();
     return script.tokenToLine(tokenPos);
   }
 
-  Future<int> getColumn() async {
+  Future<int?> getColumn() async {
     await script.load();
     return script.tokenToCol(tokenPos);
   }
 
-  SourceLocation._empty(ServiceObject owner) : super._empty(owner);
+  SourceLocation._empty(ServiceObjectOwner? owner) : super._empty(owner);
 
   void _update(Map map, bool mapIsRef) {
     assert(!mapIsRef);
@@ -491,8 +489,8 @@
   }
 
   Future<String> toUserString() async {
-    int line = await getLine();
-    int column = await getColumn();
+    int? line = await getLine();
+    int? column = await getColumn();
     return '${script.name}:${line}:${column}';
   }
 
@@ -509,13 +507,13 @@
 // code which has not been precisely mapped to a token position.
 class UnresolvedSourceLocation extends ServiceObject
     implements Location, M.UnresolvedSourceLocation {
-  Script script;
-  String scriptUri;
-  int line;
-  int column;
-  int tokenPos;
+  late Script script;
+  String? scriptUri;
+  int? line;
+  int? column;
+  int? tokenPos;
 
-  Future<int> getLine() async {
+  Future<int?> getLine() async {
     if (tokenPos != null) {
       await script.load();
       return script.tokenToLine(tokenPos);
@@ -524,7 +522,7 @@
     }
   }
 
-  Future<int> getColumn() async {
+  Future<int?> getColumn() async {
     if (tokenPos != null) {
       await script.load();
       return script.tokenToCol(tokenPos);
@@ -533,7 +531,8 @@
     }
   }
 
-  UnresolvedSourceLocation._empty(ServiceObject owner) : super._empty(owner);
+  UnresolvedSourceLocation._empty(ServiceObjectOwner? owner)
+      : super._empty(owner);
 
   void _update(Map map, bool mapIsRef) {
     assert(!mapIsRef);
@@ -551,8 +550,8 @@
   Future<String> toUserString() async {
     StringBuffer sb = new StringBuffer();
 
-    int line = await getLine();
-    int column = await getColumn();
+    int? line = await getLine();
+    int? column = await getColumn();
 
     if (script != null) {
       sb.write('${script.name}:');
@@ -596,10 +595,10 @@
   List _controllers = [];
 
   // Completes when the listen rpc is finished.
-  Future _listenFuture;
+  Future? _listenFuture;
 
   // Completes when then cancel rpc is finished.
-  Future _cancelFuture;
+  Future? _cancelFuture;
 
   _EventStreamState(this._vm, this.streamId, this._onDone);
 
@@ -609,7 +608,7 @@
       assert(_listenFuture != null);
       _listenFuture = null;
       _cancelFuture = _vm._streamCancel(streamId);
-      _cancelFuture.then((_) {
+      _cancelFuture!.then((_) {
         if (_controllers.isEmpty) {
           // No new listeners showed up during cancelation.
           _onDone();
@@ -623,7 +622,7 @@
   }
 
   Future<Stream<ServiceEvent>> addStream() async {
-    var controller;
+    late StreamController<ServiceEvent> controller;
     controller = new StreamController<ServiceEvent>(
         onCancel: () => _cancelController(controller));
     _controllers.add(controller);
@@ -651,7 +650,7 @@
 /// State for a VM being inspected.
 abstract class VM extends ServiceObjectOwner implements M.VM {
   VM get vm => this;
-  Isolate get isolate => null;
+  Isolate? get isolate => null;
   WebSocketVMTarget get target;
 
   // TODO(turnidge): The connection should not be stored in the VM object.
@@ -676,34 +675,34 @@
   final List<Service> services = <Service>[];
 
   String version = 'unknown';
-  String hostCPU;
-  String targetCPU;
-  String embedder;
-  int architectureBits;
+  String hostCPU = 'unknown';
+  String targetCPU = 'unknown';
+  String embedder = 'unknown';
+  int architectureBits = 0;
   bool assertsEnabled = false;
   bool typeChecksEnabled = false;
   int nativeZoneMemoryUsage = 0;
   int pid = 0;
   int heapAllocatedMemoryUsage = 0;
   int heapAllocationCount = 0;
-  int currentMemory;
-  int maxRSS;
-  int currentRSS;
+  int currentMemory = 0;
+  int maxRSS = 0;
+  int currentRSS = 0;
   bool profileVM = false;
-  DateTime startTime;
-  DateTime refreshTime;
-  Duration get upTime {
+  DateTime? startTime;
+  DateTime? refreshTime;
+  Duration? get upTime {
     if (startTime == null) {
       return null;
     }
-    return (new DateTime.now().difference(startTime));
+    return (new DateTime.now().difference(startTime!));
   }
 
   VM() : super._empty(null) {
     updateFromServiceMap({'name': 'vm', 'type': '@VM'});
   }
 
-  void postServiceEvent(String streamId, Map response, Uint8List data) {
+  void postServiceEvent(String streamId, Map response, Uint8List? data) {
     var map = response;
     assert(!map.containsKey('_data'));
     if (data != null) {
@@ -715,13 +714,13 @@
     }
 
     var eventIsolate = map['isolate'];
-    var event;
+    ServiceEvent event;
     if (eventIsolate == null) {
-      event = new ServiceObject._fromMap(vm, map);
+      event = ServiceObject._fromMap(vm, map) as ServiceEvent;
     } else {
       // getFromMap creates the Isolate if it hasn't been seen already.
-      var isolate = getFromMap(map['isolate']);
-      event = new ServiceObject._fromMap(isolate, map);
+      var isolate = getFromMap(map['isolate']) as Isolate;
+      event = ServiceObject._fromMap(isolate, map) as ServiceEvent;
       if (event.kind == ServiceEvent.kIsolateExit) {
         _isolateCache.remove(isolate.id);
         _buildIsolateList();
@@ -758,13 +757,13 @@
 
   void _buildIsolateList() {
     var isolateList =
-        _isolateCache.values.where((i) => !i.isSystemIsolate).toList();
+        _isolateCache.values.where((i) => !i.isSystemIsolate!).toList();
     isolateList.sort(_compareIsolates);
     isolates.clear();
     isolates.addAll(isolateList);
 
     var systemIsolateList =
-        _isolateCache.values.where((i) => i.isSystemIsolate).toList();
+        _isolateCache.values.where((i) => i.isSystemIsolate!).toList();
     systemIsolateList.sort(_compareIsolates);
     systemIsolates.clear();
     systemIsolates.addAll(systemIsolateList);
@@ -790,9 +789,6 @@
   static final String _isolateGroupIdPrefix = 'isolateGroups/';
 
   ServiceObject getFromMap(Map map) {
-    if (map == null) {
-      return null;
-    }
     var type = _stripRef(map['type']);
     if (type == 'VM') {
       // Update this VM object.
@@ -807,7 +803,7 @@
         var isolate = _isolateCache[id];
         if (isolate == null) {
           // Add new isolate to the cache.
-          isolate = ServiceObject._fromMap(this, map);
+          isolate = ServiceObject._fromMap(this, map) as Isolate;
           _isolateCache[id] = isolate;
           _buildIsolateList();
 
@@ -825,7 +821,7 @@
         var isolateGroup = _isolateGroupCache[id];
         if (isolateGroup == null) {
           // Add new isolate to the cache.
-          isolateGroup = new ServiceObject._fromMap(this, map);
+          isolateGroup = ServiceObject._fromMap(this, map) as IsolateGroup;
           _isolateGroupCache[id] = isolateGroup;
           _buildIsolateGroupList();
 
@@ -842,7 +838,7 @@
     }
 
     // Build the object from the map directly.
-    return new ServiceObject._fromMap(this, map);
+    return ServiceObject._fromMap(this, map);
   }
 
   // Note that this function does not reload the isolate if it found
@@ -856,19 +852,20 @@
   }
 
   int _compareIsolateGroups(IsolateGroup a, IsolateGroup b) {
-    return a.id.compareTo(b.id);
+    return a.id!.compareTo(b.id!);
   }
 
   void _buildIsolateGroupList() {
     final isolateGroupList = _isolateGroupCache.values
-        .where((g) => !g.isSystemIsolateGroup)
+        .where((g) => !g.isSystemIsolateGroup!)
         .toList();
     isolateGroupList.sort(_compareIsolateGroups);
     isolateGroups.clear();
     isolateGroups.addAll(isolateGroupList);
 
-    final systemIsolateGroupList =
-        _isolateGroupCache.values.where((g) => g.isSystemIsolateGroup).toList();
+    final systemIsolateGroupList = _isolateGroupCache.values
+        .where((g) => g.isSystemIsolateGroup!)
+        .toList();
     systemIsolateGroupList.sort(_compareIsolateGroups);
     systemIsolateGroups.clear();
     systemIsolateGroups.addAll(systemIsolateGroupList);
@@ -890,9 +887,9 @@
   Future<Map> invokeRpcNoUpgrade(String method, Map params) {
     return invokeRpcRaw(method, params).then<Map>((Map response) {
       var map = response;
-      if (Tracer.current != null) {
-        Tracer.current
-            .trace("Received response for ${method}/${params}}", map: map);
+      var tracer = Tracer.current;
+      if (tracer != null) {
+        tracer.trace("Received response for ${method}/${params}}", map: map);
       }
       if (!_isServiceMap(map)) {
         var exception = new MalformedResponseRpcException(
@@ -900,23 +897,23 @@
         return new Future.error(exception);
       }
       return new Future<Map>.value(map);
-    }).catchError((e) {
+    }).catchError((e, st) {
       // Errors pass through.
-      return new Future<Map>.error(e);
+      return new Future<Map>.error(e, st);
     });
   }
 
   Future<ServiceObject> invokeRpc(String method, Map params) {
     return invokeRpcNoUpgrade(method, params)
         .then<ServiceObject>((Map response) {
-      var obj = new ServiceObject._fromMap(this, response);
+      var obj = ServiceObject._fromMap(this, response);
       if ((obj != null) && obj.canCache) {
-        String objId = obj.id;
+        String objId = obj.id!;
         _cache.putIfAbsent(objId, () => obj);
       }
       return obj;
-    }).catchError((e) {
-      return new Future<ServiceObject>.error(e);
+    }).catchError((e, st) {
+      return new Future<ServiceObject>.error(e, st);
     });
   }
 
@@ -930,7 +927,7 @@
   void _updateService(ServiceEvent event) {
     switch (event.kind) {
       case ServiceEvent.kServiceRegistered:
-        services.add(new Service(event.alias, event.method, event.service));
+        services.add(new Service(event.alias!, event.method!, event.service!));
         break;
       case ServiceEvent.kServiceUnregistered:
         services.removeWhere((s) => s.method == event.method);
@@ -973,7 +970,7 @@
     };
     // Ignore network errors on stream listen.
     return invokeRpc('streamListen', params)
-        .catchError((e) => ignoreNetworkErrors(e));
+        .catchError((e, st) => ignoreNetworkErrors(e, st));
   }
 
   Future<ServiceObject> _streamCancel(String streamId) {
@@ -982,7 +979,7 @@
     };
     // Ignore network errors on stream cancel.
     return invokeRpc('streamCancel', params)
-        .catchError((e) => ignoreNetworkErrors(e));
+        .catchError((e, st) => ignoreNetworkErrors(e, st));
   }
 
   // A map from stream id to event stream state.
@@ -1011,7 +1008,7 @@
 
   /// Helper function for listening to an event stream.
   Future<StreamSubscription> listenEventStream(
-      String streamId, Function function) async {
+      String streamId, void Function(ServiceEvent) function) async {
     var stream = await getEventStream(streamId);
     return stream.listen(function);
   }
@@ -1124,9 +1121,9 @@
 class TagProfile {
   final List<String> names = <String>[];
   final List<TagProfileSnapshot> snapshots = <TagProfileSnapshot>[];
-  double get updatedAtSeconds => _seconds;
-  double _seconds;
-  TagProfileSnapshot _maxSnapshot;
+  double get updatedAtSeconds => _seconds!;
+  double? _seconds;
+  TagProfileSnapshot? _maxSnapshot;
   int _historySize;
   int _countersLength = 0;
 
@@ -1146,14 +1143,14 @@
       }
       // The counters monotonically grow, keep track of the maximum value.
       _maxSnapshot = new TagProfileSnapshot(0.0, _countersLength);
-      _maxSnapshot.set(counters);
+      _maxSnapshot!.set(counters);
       return;
     }
     var snapshot = new TagProfileSnapshot(seconds, _countersLength);
     // We snapshot the delta from the current counters to the maximum counter
     // values.
-    snapshot.delta(counters, _maxSnapshot.counters);
-    _maxSnapshot.max(counters);
+    snapshot.delta(counters, _maxSnapshot!.counters);
+    _maxSnapshot!.max(counters);
     snapshots.add(snapshot);
     // Only keep _historySize snapshots.
     if (snapshots.length > _historySize) {
@@ -1310,7 +1307,7 @@
 }
 
 class IsolateGroup extends ServiceObjectOwner implements M.IsolateGroup {
-  IsolateGroup._empty(ServiceObjectOwner owner)
+  IsolateGroup._empty(ServiceObjectOwner? owner)
       : assert(owner is VM),
         super._empty(owner);
 
@@ -1335,9 +1332,6 @@
 
   @override
   ServiceObject getFromMap(Map map) {
-    if (map == null) {
-      return null;
-    }
     final mapType = _stripRef(map['type']);
     if (mapType == 'IsolateGroup') {
       // There are sometimes isolate group refs in ServiceEvents.
@@ -1350,7 +1344,7 @@
       return obj;
     }
     // Build the object from the map directly.
-    obj = new ServiceObject._fromMap(this, map);
+    obj = ServiceObject._fromMap(this, map);
     if ((obj != null) && obj.canCache) {
       _cache[mapId] = obj;
     }
@@ -1379,9 +1373,9 @@
   final List<Isolate> isolates = <Isolate>[];
 
   @override
-  int number;
+  int? number;
 
-  bool isSystemIsolateGroup;
+  bool? isSystemIsolateGroup;
 
   final Map<String, ServiceObject> _cache = Map<String, ServiceObject>();
 }
@@ -1391,28 +1385,28 @@
   static const kLoggingStream = 'Logging';
   static const kExtensionStream = 'Extension';
 
-  VM get vm => owner;
+  VM get vm => owner as VM;
   Isolate get isolate => this;
-  int number;
-  int originNumber;
-  DateTime startTime;
-  Duration get upTime {
+  int? number;
+  int? originNumber;
+  DateTime? startTime;
+  Duration? get upTime {
     if (startTime == null) {
       return null;
     }
-    return (new DateTime.now().difference(startTime));
+    return (new DateTime.now().difference(startTime!));
   }
 
   Map counters = {};
 
   void _updateRunState() {
-    topFrame = M.topFrame(pauseEvent);
+    topFrame = M.topFrame(pauseEvent) as Frame?;
     paused = (pauseEvent != null && !(pauseEvent is M.ResumeEvent));
     running = (!paused && topFrame != null);
     idle = (!paused && topFrame == null);
   }
 
-  M.DebugEvent pauseEvent = null;
+  M.DebugEvent? pauseEvent = null;
   bool paused = false;
   bool running = false;
   bool idle = false;
@@ -1437,7 +1431,7 @@
   Map<String, ServiceObject> _cache = new Map<String, ServiceObject>();
   final TagProfile tagProfile = new TagProfile(20);
 
-  Isolate._empty(ServiceObjectOwner owner) : super._empty(owner) {
+  Isolate._empty(ServiceObjectOwner? owner) : super._empty(owner) {
     assert(owner is VM);
   }
 
@@ -1458,7 +1452,7 @@
   static const kProfileReport = '_Profile';
 
   Future<ServiceObject> getSourceReport(List<String> report_kinds,
-      [Script script, int startPos, int endPos]) {
+      [Script? script, int? startPos, int? endPos]) {
     var params = <String, dynamic>{'reports': report_kinds};
     if (script != null) {
       params['scriptId'] = script.id;
@@ -1473,7 +1467,7 @@
   }
 
   Future<ServiceMap> reloadSources(
-      {String rootLibUri, String packagesUri, bool pause}) {
+      {String? rootLibUri, String? packagesUri, bool? pause}) {
     Map<String, dynamic> params = <String, dynamic>{};
     if (rootLibUri != null) {
       params['rootLibUri'] = rootLibUri;
@@ -1504,7 +1498,7 @@
   /// Object class object.
   Future<Class> getClassHierarchy() async {
     var classRefs = await invokeRpc('getClassList', {});
-    var classes = await _loadClasses(classRefs);
+    var classes = await _loadClasses(classRefs as ServiceMap);
     return _buildClassHierarchy(classes);
   }
 
@@ -1539,7 +1533,7 @@
       }
       if ((cls.vmName == 'Object') &&
           (cls.isPatch == false) &&
-          (cls.library.uri == 'dart:core')) {
+          (cls.library!.uri == 'dart:core')) {
         objectClass = cls;
       }
     }
@@ -1548,9 +1542,6 @@
   }
 
   ServiceObject getFromMap(Map map) {
-    if (map == null) {
-      return null;
-    }
     var mapType = _stripRef(map['type']);
     if (mapType == 'Isolate') {
       // There are sometimes isolate refs in ServiceEvents.
@@ -1563,7 +1554,7 @@
       return obj;
     }
     // Build the object from the map directly.
-    obj = new ServiceObject._fromMap(this, map);
+    obj = ServiceObject._fromMap(this, map);
     if ((obj != null) && obj.canCache) {
       _cache[mapId] = obj;
     }
@@ -1602,31 +1593,29 @@
   Future<List<Script>> getScripts() async {
     final response = await invokeRpc('getScripts', {}) as ServiceMap;
     assert(response.type == 'ScriptList');
-    return response['scripts'].cast<Script>();
+    return response['scripts'].cast<Script>() as List<Script>;
   }
 
   Future<Map> _fetchDirect({int count: kDefaultFieldLimit}) async {
     return invokeRpcNoUpgrade('getIsolate', {});
   }
 
-  Class objectClass;
+  Class? objectClass;
   final rootClasses = <Class>[];
 
-  Library rootLibrary;
+  late Library rootLibrary;
   List<Library> libraries = <Library>[];
-  Frame topFrame;
+  Frame? topFrame;
 
-  String name;
-  String vmName;
-  ServiceFunction entry;
+  String? name;
+  String? vmName;
+  ServiceFunction? entry;
 
   final HeapSpace newSpace = new HeapSpace();
   final HeapSpace oldSpace = new HeapSpace();
 
-  String fileAndLine;
-
-  DartError error;
-  SnapshotReader _snapshotFetch;
+  DartError? error;
+  SnapshotReader? _snapshotFetch;
 
   List<Thread> get threads => _threads;
   final List<Thread> _threads = <Thread>[];
@@ -1635,12 +1624,12 @@
   int _zoneHighWatermark = 0;
 
   int get numZoneHandles => _numZoneHandles;
-  int _numZoneHandles;
+  int _numZoneHandles = 0;
 
   int get numScopedHandles => _numScopedHandles;
-  int _numScopedHandles;
+  int _numScopedHandles = 0;
 
-  bool isSystemIsolate;
+  bool? isSystemIsolate;
 
   void _loadHeapSnapshot(ServiceEvent event) {
     if (_snapshotFetch == null) {
@@ -1651,9 +1640,9 @@
     }
 
     // Occasionally these actually arrive out of order.
-    _snapshotFetch.add(event.data);
-    if (event.lastChunk) {
-      _snapshotFetch.close();
+    _snapshotFetch!.add(event.data!);
+    if (event.lastChunk!) {
+      _snapshotFetch!.close();
       _snapshotFetch = null;
     }
   }
@@ -1664,7 +1653,7 @@
       // isolate.vm.streamListen('HeapSnapshot');
       isolate.invokeRpcNoUpgrade('requestHeapSnapshot', {});
     }
-    return _snapshotFetch;
+    return _snapshotFetch!;
   }
 
   void updateHeapsFromMap(Map map) {
@@ -1699,7 +1688,7 @@
       assert(names.length == counts.length);
       var sum = 0;
       for (var i = 0; i < counts.length; i++) {
-        sum += counts[i];
+        sum += (counts[i] as int);
       }
       var _counters = {};
       if (sum == 0) {
@@ -1726,8 +1715,8 @@
     var newPauseEvent = map['pauseEvent'];
     assert((pauseEvent == null) ||
         (newPauseEvent == null) ||
-        !newPauseEvent.timestamp.isBefore(pauseEvent.timestamp));
-    pauseEvent = createEventFromServiceEvent(newPauseEvent);
+        !newPauseEvent.timestamp.isBefore(pauseEvent!.timestamp));
+    pauseEvent = createEventFromServiceEvent(newPauseEvent) as M.DebugEvent;
     _updateRunState();
     error = map['error'];
 
@@ -1750,7 +1739,7 @@
 
     int currentZoneHighWatermark = 0;
     for (var i = 0; i < threads.length; i++) {
-      currentZoneHighWatermark += threads[i].zoneHighWatermark;
+      currentZoneHighWatermark += threads[i].zoneHighWatermark!;
     }
 
     if (currentZoneHighWatermark > _zoneHighWatermark) {
@@ -1770,7 +1759,7 @@
   }
 
   Map<int, Breakpoint> breakpoints = <int, Breakpoint>{};
-  String exceptionsPauseInfo;
+  String? exceptionsPauseInfo;
 
   void _updateBreakpoints(List newBpts) {
     // Build a set of new breakpoints.
@@ -1791,7 +1780,7 @@
   }
 
   void _addBreakpoint(Breakpoint bpt) {
-    breakpoints[bpt.number] = bpt;
+    breakpoints[bpt.number!] = bpt;
   }
 
   void _removeBreakpoint(Breakpoint bpt) {
@@ -1811,7 +1800,7 @@
         _handleIsolateReloadEvent(event);
         break;
       case ServiceEvent.kBreakpointAdded:
-        _addBreakpoint(event.breakpoint);
+        _addBreakpoint(event.breakpoint!);
         break;
 
       case ServiceEvent.kIsolateUpdate:
@@ -1821,7 +1810,7 @@
         break;
 
       case ServiceEvent.kBreakpointRemoved:
-        _removeBreakpoint(event.breakpoint);
+        _removeBreakpoint(event.breakpoint!);
         break;
 
       case ServiceEvent.kPauseStart:
@@ -1833,8 +1822,8 @@
       case ServiceEvent.kNone:
       case ServiceEvent.kResume:
         assert((pauseEvent == null) ||
-            !event.timestamp.isBefore(pauseEvent.timestamp));
-        pauseEvent = createEventFromServiceEvent(event);
+            !event.timestamp!.isBefore(pauseEvent!.timestamp));
+        pauseEvent = createEventFromServiceEvent(event) as M.DebugEvent;
         _updateRunState();
         break;
 
@@ -1853,7 +1842,7 @@
     }
   }
 
-  Future<Breakpoint> addBreakpoint(Script script, int line, [int col]) {
+  Future<Breakpoint> addBreakpoint(Script script, int line, [int? col]) {
     Map params = {
       'scriptId': script.id,
       'line': line,
@@ -1865,7 +1854,8 @@
         .then((result) => result as Breakpoint);
   }
 
-  Future<Breakpoint> addBreakpointByScriptUri(String uri, int line, [int col]) {
+  Future<Breakpoint> addBreakpointByScriptUri(String uri, int line,
+      [int? col]) {
     Map params = {
       'scriptUri': uri,
       'line': line.toString(),
@@ -1927,8 +1917,10 @@
     return invokeRpc('setExceptionPauseMode', {'mode': mode});
   }
 
-  Future<ServiceMap> getStack() {
-    return invokeRpc('getStack', {}).then((response) => response as ServiceMap);
+  Future<ServiceMap> getStack({int? limit}) {
+    return invokeRpc('getStack', {
+      if (limit != null) 'limit': limit,
+    }).then((response) => response as ServiceMap);
   }
 
   Future<ObjectStore> getObjectStore() {
@@ -1950,7 +1942,7 @@
   }
 
   Future<ServiceObject> eval(ServiceObject target, String expression,
-      {Map<String, ServiceObject> scope, bool disableBreakpoints: false}) {
+      {Map<String, ServiceObject>? scope, bool disableBreakpoints: false}) {
     Map params = {
       'targetId': target.id,
       'expression': expression,
@@ -1959,7 +1951,7 @@
     if (scope != null) {
       Map<String, String> scopeWithIds = new Map();
       scope.forEach((String name, ServiceObject object) {
-        scopeWithIds[name] = object.id;
+        scopeWithIds[name] = object.id!;
       });
       params["scope"] = scopeWithIds;
     }
@@ -1967,7 +1959,7 @@
   }
 
   Future<ServiceObject> evalFrame(int frameIndex, String expression,
-      {Map<String, ServiceObject> scope,
+      {Map<String, ServiceObject>? scope,
       bool disableBreakpoints: false}) async {
     Map params = {
       'frameIndex': frameIndex,
@@ -1977,7 +1969,7 @@
     if (scope != null) {
       Map<String, String> scopeWithIds = new Map();
       scope.forEach((String name, ServiceObject object) {
-        scopeWithIds[name] = object.id;
+        scopeWithIds[name] = object.id!;
       });
       params["scope"] = scopeWithIds;
     }
@@ -1993,7 +1985,7 @@
           'exception': null,
           'stacktrace': null,
         };
-        return new ServiceObject._fromMap(null, map);
+        return ServiceObject._fromMap(null, map);
       } else
         rethrow;
     }
@@ -2087,7 +2079,7 @@
 class ObjectStore extends ServiceObject implements M.ObjectStore {
   List<NamedField> fields = <NamedField>[];
 
-  ObjectStore._empty(ServiceObjectOwner owner) : super._empty(owner);
+  ObjectStore._empty(ServiceObjectOwner? owner) : super._empty(owner);
 
   void _update(Map map, bool mapIsRef) {
     // Extract full properties.
@@ -2113,7 +2105,7 @@
 
   bool get immutable => false;
 
-  ServiceMap._empty(ServiceObjectOwner owner) : super._empty(owner);
+  ServiceMap._empty(ServiceObjectOwner? owner) : super._empty(owner);
 
   void _update(Map map, bool mapIsRef) {
     _loaded = !mapIsRef;
@@ -2123,7 +2115,7 @@
     // upgrading an already upgraded submap.  Is clearing really the
     // right thing to do here?
     _map.clear();
-    _map.addAll(map);
+    map.forEach((k, v) => _map[k] = v);
 
     name = _map['name'];
     vmName = (_map.containsKey('_vmName') ? _map['_vmName'] : name);
@@ -2135,19 +2127,20 @@
   int get clazz => _map['class'];
 
   // Forward Map interface calls.
-  void addAll(Map other) => _map.addAll(other);
+  void addAll(Map<String, dynamic> other) => _map.addAll(other);
   void clear() => _map.clear();
-  bool containsValue(v) => _map.containsValue(v);
-  bool containsKey(k) => _map.containsKey(k);
-  void forEach(Function f) => _map.forEach(f);
-  putIfAbsent(key, Function ifAbsent) => _map.putIfAbsent(key, ifAbsent);
-  void remove(key) => _map.remove(key);
-  operator [](k) => _map[k];
-  operator []=(k, v) => _map[k] = v;
+  bool containsValue(dynamic v) => _map.containsValue(v);
+  bool containsKey(Object? k) => _map.containsKey(k);
+  void forEach(void f(String key, dynamic value)) => _map.forEach(f);
+  dynamic putIfAbsent(key, dynamic ifAbsent()) =>
+      _map.putIfAbsent(key, ifAbsent);
+  dynamic remove(Object? key) => _map.remove(key);
+  dynamic operator [](Object? k) => _map[k];
+  operator []=(String k, dynamic v) => _map[k] = v;
   bool get isEmpty => _map.isEmpty;
   bool get isNotEmpty => _map.isNotEmpty;
   Iterable<String> get keys => _map.keys;
-  Iterable get values => _map.values;
+  Iterable<dynamic> get values => _map.values;
   int get length => _map.length;
 
   // Suppress compile-time error about missing Map methods.
@@ -2174,12 +2167,12 @@
 
 /// A [DartError] is peered to a Dart Error object.
 class DartError extends HeapObject implements M.Error {
-  DartError._empty(ServiceObject owner) : super._empty(owner);
+  DartError._empty(ServiceObjectOwner? owner) : super._empty(owner);
 
-  M.ErrorKind kind;
-  String message;
-  Instance exception;
-  Instance stacktrace;
+  M.ErrorKind? kind;
+  String? message;
+  Instance? exception;
+  Instance? stacktrace;
 
   void _update(Map map, bool mapIsRef) {
     _upgradeCollection(map, owner);
@@ -2243,46 +2236,46 @@
   static const kDartDevelopmentServiceConnected =
       'DartDevelopmentServiceConnected';
 
-  ServiceEvent._empty(ServiceObjectOwner owner) : super._empty(owner);
+  ServiceEvent._empty(ServiceObjectOwner? owner) : super._empty(owner);
 
   ServiceEvent.connectionClosed(this.reason) : super._empty(null) {
     kind = kConnectionClosed;
   }
 
-  String kind;
-  DateTime timestamp;
-  String flag;
-  String newValue;
-  List<M.Breakpoint> pauseBreakpoints;
-  Breakpoint breakpoint;
-  Frame topFrame;
-  DartError error;
-  String extensionRPC;
-  Instance exception;
-  DartError reloadError;
-  bool atAsyncSuspension;
-  Instance inspectee;
-  Uint8List data;
-  int count;
-  String reason;
-  String exceptions;
-  String bytesAsString;
-  Map logRecord;
-  String extensionKind;
-  Map extensionData;
-  List timelineEvents;
-  List<String> updatedStreams;
-  String spawnToken;
-  String spawnError;
-  String editor;
-  ServiceObject object;
-  String method;
-  String service;
-  String alias;
-  String message;
-  Uri uri;
+  String? kind;
+  DateTime? timestamp;
+  String? flag;
+  String? newValue;
+  List<Breakpoint>? pauseBreakpoints;
+  Breakpoint? breakpoint;
+  Frame? topFrame;
+  DartError? error;
+  String? extensionRPC;
+  Instance? exception;
+  DartError? reloadError;
+  bool? atAsyncSuspension;
+  Instance? inspectee;
+  Uint8List? data;
+  int? count;
+  String? reason;
+  String? exceptions;
+  String? bytesAsString;
+  Map? logRecord;
+  String? extensionKind;
+  Map? extensionData;
+  List? timelineEvents;
+  List<String>? updatedStreams;
+  String? spawnToken;
+  String? spawnError;
+  String? editor;
+  ServiceObject? object;
+  String? method;
+  String? service;
+  String? alias;
+  String? message;
+  Uri? uri;
 
-  bool lastChunk;
+  bool? lastChunk;
 
   bool get isPauseEvent {
     return (kind == kPauseStart ||
@@ -2308,8 +2301,8 @@
     }
     if (map['pauseBreakpoints'] != null) {
       pauseBreakpoints = new List<Breakpoint>.from(map['pauseBreakpoints']);
-      if (pauseBreakpoints.length > 0) {
-        breakpoint = pauseBreakpoints[0];
+      if (pauseBreakpoints!.length > 0) {
+        breakpoint = pauseBreakpoints![0];
       }
     } else {
       pauseBreakpoints = const [];
@@ -2346,9 +2339,9 @@
     }
     if (map['logRecord'] != null) {
       logRecord = map['logRecord'];
-      logRecord['time'] =
-          new DateTime.fromMillisecondsSinceEpoch(logRecord['time']);
-      logRecord['level'] = _findLogLevel(logRecord['level']);
+      logRecord!['time'] =
+          new DateTime.fromMillisecondsSinceEpoch(logRecord!['time']);
+      logRecord!['level'] = _findLogLevel(logRecord!['level']);
     }
     if (map['extensionKind'] != null) {
       extensionKind = map['extensionKind'];
@@ -2396,42 +2389,42 @@
   }
 
   String toString() {
-    var ownerName = owner.id != null ? owner.id.toString() : owner.name;
+    var ownerName = owner!.id != null ? owner!.id.toString() : owner!.name;
     if (data == null) {
       return "ServiceEvent(owner='${ownerName}', kind='${kind}', "
           "time=${timestamp})";
     } else {
       return "ServiceEvent(owner='${ownerName}', kind='${kind}', "
-          "data.lengthInBytes=${data.lengthInBytes}, time=${timestamp})";
+          "data.lengthInBytes=${data!.lengthInBytes}, time=${timestamp})";
     }
   }
 }
 
 class Breakpoint extends ServiceObject implements M.Breakpoint {
-  Breakpoint._empty(ServiceObjectOwner owner) : super._empty(owner);
+  Breakpoint._empty(ServiceObjectOwner? owner) : super._empty(owner);
 
-  final M.ClassRef clazz = null;
-  final int size = null;
+  final M.ClassRef? clazz = null;
+  final int? size = null;
 
   // TODO(turnidge): Add state to track if a breakpoint has been
   // removed from the program.  Remove from the cache when deleted.
   bool get immutable => false;
 
   // A unique integer identifier for this breakpoint.
-  int number;
+  int? number;
 
   // Either SourceLocation or UnresolvedSourceLocation.
-  Location location;
+  Location? location;
 
   // The breakpoint is in a file which is not yet loaded.
-  bool latent;
+  bool? latent;
 
   // The breakpoint has been assigned to a final source location.
-  bool resolved;
+  bool? resolved;
 
   // The breakpoint was synthetically created as part of an
   // 'OverAsyncContinuation' resume request.
-  bool isSyntheticAsyncContinuation;
+  bool? isSyntheticAsyncContinuation;
 
   void _update(Map map, bool mapIsRef) {
     _loaded = true;
@@ -2454,23 +2447,23 @@
       }
     }
     location = newLocation;
-    var newScript = location.script;
+    var newScript = location!.script;
     if (newScript != null && newScript.loaded) {
       newScript._addBreakpoint(this);
     }
 
     isSyntheticAsyncContinuation = map['isSyntheticAsyncContinuation'] != null;
 
-    assert(resolved || location is UnresolvedSourceLocation);
+    assert(resolved! || location is UnresolvedSourceLocation);
   }
 
   void remove() {
-    location.script._removeBreakpoint(this);
+    location!.script._removeBreakpoint(this);
   }
 
   String toString() {
     if (number != null) {
-      if (isSyntheticAsyncContinuation) {
+      if (isSyntheticAsyncContinuation!) {
         return 'Synthetic Async Continuation Breakpoint ${number}';
       } else {
         return 'Breakpoint ${number} at ${location}';
@@ -2496,33 +2489,33 @@
 }
 
 class Library extends HeapObject implements M.Library {
-  String uri;
+  String? uri;
   final List<LibraryDependency> dependencies = <LibraryDependency>[];
   final List<Script> scripts = <Script>[];
   final List<Class> classes = <Class>[];
   final List<Field> variables = <Field>[];
   final List<ServiceFunction> functions = <ServiceFunction>[];
-  bool _debuggable;
-  bool get debuggable => _debuggable;
+  bool? _debuggable;
+  bool get debuggable => _debuggable!;
   bool get immutable => false;
 
   bool isDart(String libraryName) {
     return uri == 'dart:$libraryName';
   }
 
-  Library._empty(ServiceObjectOwner owner) : super._empty(owner);
+  Library._empty(ServiceObjectOwner? owner) : super._empty(owner);
 
   void _update(Map map, bool mapIsRef) {
     _upgradeCollection(map, isolate);
     super._update(map, mapIsRef);
 
     uri = map['uri'];
-    var shortUri = uri;
-    if (uri.startsWith('file://') || uri.startsWith('http://')) {
-      shortUri = uri.substring(uri.lastIndexOf('/') + 1);
+    var shortUri = uri!;
+    if (shortUri.startsWith('file://') || shortUri.startsWith('http://')) {
+      shortUri = shortUri.substring(shortUri.lastIndexOf('/') + 1);
     }
-    name = map['name'];
-    if (name.isEmpty) {
+    name = map['name'] as String;
+    if (name!.isEmpty) {
       // When there is no name for a library, use the shortUri.
       name = shortUri;
     }
@@ -2551,12 +2544,12 @@
   }
 
   Future<ServiceObject> evaluate(String expression,
-      {Map<String, ServiceObject> scope, bool disableBreakpoints: false}) {
-    return isolate.eval(this, expression,
+      {Map<String, ServiceObject>? scope, bool disableBreakpoints: false}) {
+    return isolate!.eval(this, expression,
         scope: scope, disableBreakpoints: disableBreakpoints);
   }
 
-  Script get rootScript {
+  Script? get rootScript {
     for (Script script in scripts) {
       if (script.uri == uri) return script;
     }
@@ -2593,17 +2586,17 @@
 }
 
 class Class extends HeapObject implements M.Class {
-  Library library;
+  Library? library;
 
-  bool isAbstract;
-  bool isConst;
-  bool isFinalized;
-  bool isPatch;
-  bool isImplemented;
+  bool? isAbstract;
+  bool? isConst;
+  bool? isFinalized;
+  bool? isPatch;
+  bool? isImplemented;
 
-  SourceLocation location;
+  SourceLocation? location;
 
-  DartError error;
+  DartError? error;
 
   final Allocations newSpace = new Allocations();
   final Allocations oldSpace = new Allocations();
@@ -2614,16 +2607,16 @@
   final List<Field> fields = <Field>[];
   final List<ServiceFunction> functions = <ServiceFunction>[];
 
-  Class superclass;
+  Class? superclass;
   final List<Instance> interfaces = <Instance>[];
   final List<Class> subclasses = <Class>[];
 
-  Instance superType;
-  Instance mixin;
+  Instance? superType;
+  Instance? mixin;
 
   bool get immutable => false;
 
-  Class._empty(ServiceObjectOwner owner) : super._empty(owner);
+  Class._empty(ServiceObjectOwner? owner) : super._empty(owner);
 
   void _update(Map map, bool mapIsRef) {
     _upgradeCollection(map, isolate);
@@ -2635,7 +2628,7 @@
       name = 'top-level-class'; // Better than ''
     }
     var idPrefix = "classes/";
-    assert(id.startsWith(idPrefix));
+    assert(id!.startsWith(idPrefix));
 
     if (mapIsRef) {
       return;
@@ -2679,8 +2672,8 @@
 
     superclass = map['super'];
     // Work-around Object not tracking its subclasses in the VM.
-    if (superclass != null && superclass.name == "Object") {
-      superclass._addSubclass(this);
+    if (superclass != null && superclass!.name == "Object") {
+      superclass!._addSubclass(this);
     }
     superType = map['superType'];
     mixin = map['mixin'];
@@ -2700,13 +2693,13 @@
   }
 
   Future<ServiceObject> evaluate(String expression,
-      {Map<String, ServiceObject> scope, disableBreakpoints: false}) {
-    return isolate.eval(this, expression,
+      {Map<String, ServiceObject>? scope, disableBreakpoints: false}) {
+    return isolate!.eval(this, expression,
         scope: scope, disableBreakpoints: disableBreakpoints);
   }
 
   Future<ServiceObject> setTraceAllocations(bool enable) {
-    return isolate.invokeRpc('_setTraceClassAllocation', {
+    return isolate!.invokeRpc('_setTraceClassAllocation', {
       'enable': enable,
       'classId': id,
     });
@@ -2716,7 +2709,7 @@
     var params = {
       'classId': id,
     };
-    return isolate.invokeRpc('_getAllocationSamples', params);
+    return isolate!.invokeRpc('_getAllocationSamples', params);
   }
 
   String toString() => 'Class($vmName)';
@@ -2790,6 +2783,8 @@
       return M.InstanceKind.typeParameter;
     case 'TypeRef':
       return M.InstanceKind.typeRef;
+    case 'ReceivePort':
+      return M.InstanceKind.receivePort;
   }
   var message = 'Unrecognized instance kind: $s';
   Logger.root.severe(message);
@@ -2799,8 +2794,8 @@
 class Guarded<T extends ServiceObject> implements M.Guarded<T> {
   bool get isValue => asValue != null;
   bool get isSentinel => asSentinel != null;
-  final Sentinel asSentinel;
-  final T asValue;
+  final Sentinel? asSentinel;
+  final T? asValue;
 
   factory Guarded(ServiceObject obj) {
     if (obj is Sentinel) {
@@ -2835,41 +2830,41 @@
 }
 
 class Instance extends HeapObject implements M.Instance {
-  M.InstanceKind kind;
-  String valueAsString; // If primitive.
-  bool valueAsStringIsTruncated;
-  ServiceFunction closureFunction; // If a closure.
-  Context closureContext; // If a closure.
-  int length; // If a List, Map or TypedData.
-  int count;
-  int offset;
-  Instance pattern; // If a RegExp.
+  M.InstanceKind? kind;
+  String? valueAsString; // If primitive.
+  bool? valueAsStringIsTruncated;
+  ServiceFunction? closureFunction; // If a closure.
+  Context? closureContext; // If a closure.
+  int? length; // If a List, Map or TypedData.
+  int? count;
+  int? offset;
+  Instance? pattern; // If a RegExp.
 
-  String name;
-  Class typeClass;
-  Class parameterizedClass;
-  TypeArguments typeArguments;
-  int parameterIndex;
-  Instance targetType;
-  Instance bound;
+  String? name;
+  Class? typeClass;
+  Class? parameterizedClass;
+  TypeArguments? typeArguments;
+  int? parameterIndex;
+  Instance? targetType;
+  Instance? bound;
 
-  Iterable<BoundField> fields;
+  Iterable<BoundField>? fields;
   var nativeFields;
-  Iterable<Guarded<HeapObject>> elements; // If a List.
-  Iterable<MapAssociation> associations; // If a Map.
-  List<dynamic> typedElements; // If a TypedData.
-  HeapObject referent; // If a MirrorReference.
-  Instance key; // If a WeakProperty.
-  Instance value; // If a WeakProperty.
-  Breakpoint activationBreakpoint; // If a Closure.
-  ServiceFunction oneByteFunction; // If a RegExp.
-  ServiceFunction twoByteFunction; // If a RegExp.
-  ServiceFunction externalOneByteFunction; // If a RegExp.
-  ServiceFunction externalTwoByteFunction; // If a RegExp.
-  Instance oneByteBytecode; // If a RegExp.
-  Instance twoByteBytecode; // If a RegExp.
-  bool isCaseSensitive; // If a RegExp.
-  bool isMultiLine; // If a RegExp.
+  Iterable<Guarded<HeapObject>>? elements; // If a List.
+  Iterable<MapAssociation>? associations; // If a Map.
+  List<dynamic>? typedElements; // If a TypedData.
+  HeapObject? referent; // If a MirrorReference.
+  Instance? key; // If a WeakProperty.
+  Instance? value; // If a WeakProperty.
+  Breakpoint? activationBreakpoint; // If a Closure.
+  ServiceFunction? oneByteFunction; // If a RegExp.
+  ServiceFunction? twoByteFunction; // If a RegExp.
+  ServiceFunction? externalOneByteFunction; // If a RegExp.
+  ServiceFunction? externalTwoByteFunction; // If a RegExp.
+  Instance? oneByteBytecode; // If a RegExp.
+  Instance? twoByteBytecode; // If a RegExp.
+  bool? isCaseSensitive; // If a RegExp.
+  bool? isMultiLine; // If a RegExp.
 
   bool get isAbstractType => M.isAbstractType(kind);
   bool get isNull => kind == M.InstanceKind.vNull;
@@ -2879,14 +2874,8 @@
   bool get isInt => kind == M.InstanceKind.int;
   bool get isList => kind == M.InstanceKind.list;
   bool get isMap => kind == M.InstanceKind.map;
-  bool get isTypedData {
-    return M.isTypedData(kind);
-  }
-
-  bool get isSimdValue {
-    return M.isSimdValue(kind);
-  }
-
+  bool get isTypedData => M.isTypedData(kind);
+  bool get isSimdValue => M.isSimdValue(kind);
   bool get isRegExp => kind == M.InstanceKind.regExp;
   bool get isMirrorReference => kind == M.InstanceKind.mirrorReference;
   bool get isWeakProperty => kind == M.InstanceKind.weakProperty;
@@ -2896,27 +2885,29 @@
     if (clazz == null) {
       return false;
     }
-    if (clazz.library == null) {
+    if (clazz!.library == null) {
       return false;
     }
-    return (clazz.name == 'StackOverflowError') && clazz.library.isDart('core');
+    return (clazz!.name == 'StackOverflowError') &&
+        clazz!.library!.isDart('core');
   }
 
   bool get isOutOfMemoryError {
     if (clazz == null) {
       return false;
     }
-    if (clazz.library == null) {
+    if (clazz!.library == null) {
       return false;
     }
-    return (clazz.name == 'OutOfMemoryError') && clazz.library.isDart('core');
+    return (clazz!.name == 'OutOfMemoryError') &&
+        clazz!.library!.isDart('core');
   }
 
   // TODO(turnidge): Is this properly backwards compatible when new
   // instance kinds are added?
   bool get isPlainInstance => kind == 'PlainInstance';
 
-  Instance._empty(ServiceObjectOwner owner) : super._empty(owner);
+  Instance._empty(ServiceObjectOwner? owner) : super._empty(owner);
 
   void _update(Map map, bool mapIsRef) {
     // Extract full properties.1
@@ -3060,17 +3051,17 @@
 
   String get shortName {
     if (isClosure) {
-      return closureFunction.qualifiedName;
+      return closureFunction!.qualifiedName!;
     }
     if (valueAsString != null) {
-      return valueAsString;
+      return valueAsString!;
     }
-    return 'a ${clazz.name}';
+    return 'a ${clazz!.name}';
   }
 
   Future<ServiceObject> evaluate(String expression,
-      {Map<String, ServiceObject> scope, bool disableBreakpoints: false}) {
-    return isolate.eval(this, expression,
+      {Map<String, ServiceObject>? scope, bool disableBreakpoints: false}) {
+    return isolate!.eval(this, expression,
         scope: scope, disableBreakpoints: disableBreakpoints);
   }
 
@@ -3078,11 +3069,11 @@
 }
 
 class Context extends HeapObject implements M.Context {
-  Context parentContext;
-  int length;
-  Iterable<ContextElement> variables;
+  Context? parentContext;
+  int? length;
+  Iterable<ContextElement>? variables;
 
-  Context._empty(ServiceObjectOwner owner) : super._empty(owner);
+  Context._empty(ServiceObjectOwner? owner) : super._empty(owner);
 
   void _update(Map map, bool mapIsRef) {
     // Extract full properties.
@@ -3171,31 +3162,30 @@
 
 class ServiceFunction extends HeapObject implements M.ServiceFunction {
   // owner is a Library, Class, or ServiceFunction.
-  M.ObjectRef dartOwner;
-  Library library;
-  bool isStatic;
-  bool isConst;
-  SourceLocation location;
-  Code code;
-  Code unoptimizedCode;
-  Code bytecode;
-  bool isOptimizable;
-  bool isInlinable;
-  bool hasIntrinsic;
-  bool isRecognized;
-  bool isNative;
-  M.FunctionKind kind;
-  int deoptimizations;
-  String qualifiedName;
-  int usageCounter;
-  bool isDart;
-  ProfileFunction profile;
-  Instance icDataArray;
-  Field field;
+  M.ObjectRef? dartOwner;
+  Library? library;
+  bool? isStatic;
+  bool? isConst;
+  SourceLocation? location;
+  Code? code;
+  Code? unoptimizedCode;
+  bool? isOptimizable;
+  bool? isInlinable;
+  bool? hasIntrinsic;
+  bool? isRecognized;
+  bool? isNative;
+  M.FunctionKind? kind;
+  int? deoptimizations;
+  String? qualifiedName;
+  int? usageCounter;
+  bool? isDart;
+  ProfileFunction? profile;
+  Instance? icDataArray;
+  Field? field;
 
   bool get immutable => false;
 
-  ServiceFunction._empty(ServiceObject owner) : super._empty(owner);
+  ServiceFunction._empty(ServiceObjectOwner? owner) : super._empty(owner);
 
   void _update(Map map, bool mapIsRef) {
     _upgradeCollection(map, owner);
@@ -3209,15 +3199,15 @@
     isDart = M.isDartFunction(kind);
 
     if (dartOwner is ServiceFunction) {
-      ServiceFunction ownerFunction = dartOwner;
+      ServiceFunction ownerFunction = dartOwner as ServiceFunction;
       library = ownerFunction.library;
       qualifiedName = "${ownerFunction.qualifiedName}.${name}";
     } else if (dartOwner is Class) {
-      Class ownerClass = dartOwner;
+      Class ownerClass = dartOwner as Class;
       library = ownerClass.library;
       qualifiedName = "${ownerClass.name}.${name}";
     } else {
-      library = dartOwner;
+      library = dartOwner as Library;
       qualifiedName = name;
     }
 
@@ -3237,7 +3227,6 @@
     isInlinable = map['_inlinable'];
     isRecognized = map['_recognized'];
     unoptimizedCode = map['_unoptimizedCode'];
-    bytecode = map['_bytecode'];
     deoptimizations = map['_deoptimizations'];
     usageCounter = map['_usageCounter'];
     icDataArray = map['_icDataArray'];
@@ -3247,7 +3236,7 @@
   ServiceFunction get homeMethod {
     var m = this;
     while (m.dartOwner is ServiceFunction) {
-      m = m.dartOwner;
+      m = m.dartOwner as ServiceFunction;
     }
     return m;
   }
@@ -3278,10 +3267,10 @@
 }
 
 class Sentinel extends ServiceObject implements M.Sentinel {
-  M.SentinelKind kind;
-  String valueAsString;
+  late M.SentinelKind kind;
+  late String valueAsString;
 
-  Sentinel._empty(ServiceObjectOwner owner) : super._empty(owner);
+  Sentinel._empty(ServiceObjectOwner? owner) : super._empty(owner);
 
   void _update(Map map, bool mapIsRef) {
     // Extract full properties.
@@ -3297,16 +3286,16 @@
 }
 
 class Thread extends ServiceObject implements M.Thread {
-  M.ThreadKind get kind => _kind;
-  M.ThreadKind _kind;
-  String get kindString => _kindString;
-  String _kindString;
-  int get zoneHighWatermark => _zoneHighWatermark;
-  int _zoneHighWatermark;
-  int get zoneCapacity => _zoneCapacity;
-  int _zoneCapacity;
+  M.ThreadKind? get kind => _kind;
+  M.ThreadKind? _kind;
+  String? get kindString => _kindString;
+  String? _kindString;
+  int? get zoneHighWatermark => _zoneHighWatermark;
+  int? _zoneHighWatermark;
+  int? get zoneCapacity => _zoneCapacity;
+  int? _zoneCapacity;
 
-  Thread._empty(ServiceObjectOwner owner) : super._empty(owner);
+  Thread._empty(ServiceObjectOwner? owner) : super._empty(owner);
 
   void _update(Map map, bool mapIsRef) {
     String rawKind = map['kind'];
@@ -3352,23 +3341,23 @@
 
 class Field extends HeapObject implements M.Field {
   // Library or Class.
-  HeapObject dartOwner;
-  Library library;
-  Instance declaredType;
-  bool isStatic;
-  bool isFinal;
-  bool isConst;
-  ServiceObject staticValue;
-  String name;
-  String vmName;
+  HeapObject? dartOwner;
+  Library? library;
+  Instance? declaredType;
+  bool? isStatic;
+  bool? isFinal;
+  bool? isConst;
+  ServiceObject? staticValue;
+  String? name;
+  String? vmName;
 
-  bool guardNullable;
-  M.GuardClassKind guardClassKind;
-  Class guardClass;
-  String guardLength;
-  SourceLocation location;
+  bool? guardNullable;
+  M.GuardClassKind? guardClassKind;
+  Class? guardClass;
+  String? guardLength;
+  SourceLocation? location;
 
-  Field._empty(ServiceObjectOwner owner) : super._empty(owner);
+  Field._empty(ServiceObjectOwner? owner) : super._empty(owner);
 
   void _update(Map map, bool mapIsRef) {
     // Extract full properties.
@@ -3384,10 +3373,10 @@
     isConst = map['const'];
 
     if (dartOwner is Class) {
-      Class ownerClass = dartOwner;
+      Class ownerClass = dartOwner as Class;
       library = ownerClass.library;
     } else {
-      library = dartOwner;
+      library = dartOwner as Library;
     }
 
     if (mapIsRef) {
@@ -3416,14 +3405,14 @@
     _loaded = true;
   }
 
-  String toString() => 'Field(${dartOwner.name}.$name)';
+  String toString() => 'Field(${dartOwner!.name}.$name)';
 }
 
 class ScriptLine {
   final Script script;
   final int line;
   final String text;
-  Set<Breakpoint> breakpoints;
+  Set<Breakpoint>? breakpoints;
 
   ScriptLine(this.script, this.line, this.text);
 
@@ -3431,12 +3420,12 @@
     return text.isEmpty || text.trim().isEmpty;
   }
 
-  bool _isTrivial = null;
+  bool? _isTrivial = null;
   bool get isTrivial {
     if (_isTrivial == null) {
       _isTrivial = _isTrivialLine(text);
     }
-    return _isTrivial;
+    return _isTrivial!;
   }
 
   static bool _isTrivialToken(String token) {
@@ -3478,13 +3467,13 @@
     if (breakpoints == null) {
       breakpoints = new Set<Breakpoint>();
     }
-    breakpoints.add(bpt);
+    breakpoints!.add(bpt);
   }
 
   void removeBreakpoint(Breakpoint bpt) {
-    assert(breakpoints != null && breakpoints.contains(bpt));
-    breakpoints.remove(bpt);
-    if (breakpoints.isEmpty) {
+    assert(breakpoints != null && breakpoints!.contains(bpt));
+    breakpoints!.remove(bpt);
+    if (breakpoints!.isEmpty) {
       breakpoints = null;
     }
   }
@@ -3499,8 +3488,8 @@
 
   CallSite(this.name, this.script, this.tokenPos, this.entries);
 
-  int get line => script.tokenToLine(tokenPos);
-  int get column => script.tokenToCol(tokenPos);
+  int get line => script.tokenToLine(tokenPos)!;
+  int get column => script.tokenToCol(tokenPos)!;
 
   int get aggregateCount {
     var count = 0;
@@ -3557,46 +3546,46 @@
 
 class Script extends HeapObject implements M.Script {
   final lines = <ScriptLine>[];
-  String uri;
-  String kind;
-  DateTime loadTime;
-  int firstTokenPos;
-  int lastTokenPos;
-  int lineOffset;
-  int columnOffset;
-  Library library;
+  late String uri;
+  late String kind;
+  DateTime? loadTime;
+  int? firstTokenPos;
+  int? lastTokenPos;
+  int? lineOffset;
+  int? columnOffset;
+  Library? library;
 
-  String source;
+  String? source;
 
   bool get immutable => true;
 
-  String _shortUri;
+  String? _shortUri;
 
-  Script._empty(ServiceObjectOwner owner) : super._empty(owner);
+  Script._empty(ServiceObjectOwner? owner) : super._empty(owner);
 
   /// Retrieves line number [line] if it exists.
-  ScriptLine getLine(int line) {
+  ScriptLine? getLine(int line) {
     assert(_loaded);
     assert(line >= 1);
-    var index = (line - lineOffset - 1);
+    var index = (line - lineOffset! - 1);
     if (lines.length < index) {
       return null;
     }
-    return lines[line - lineOffset - 1];
+    return lines[line - lineOffset! - 1];
   }
 
   /// This function maps a token position to a line number.
   /// The VM considers the first line to be line 1.
-  int tokenToLine(int tokenPos) => _tokenToLine[tokenPos];
+  int? tokenToLine(int? tokenPos) => _tokenToLine[tokenPos];
   Map _tokenToLine = {};
 
   /// This function maps a token position to a column number.
   /// The VM considers the first column to be column 1.
-  int tokenToCol(int tokenPos) => _tokenToCol[tokenPos];
+  int? tokenToCol(int? tokenPos) => _tokenToCol[tokenPos];
   Map _tokenToCol = {};
 
-  int guessTokenLength(int line, int column) {
-    String source = getLine(line).text;
+  int? guessTokenLength(int line, int column) {
+    String source = getLine(line)!.text;
 
     var pos = column;
     if (pos >= source.length) {
@@ -3705,9 +3694,9 @@
         } else {
           // Keep track of max and min token positions.
           firstTokenPos =
-              (firstTokenPos <= tokenOffset) ? firstTokenPos : tokenOffset;
+              (firstTokenPos! <= tokenOffset) ? firstTokenPos : tokenOffset;
           lastTokenPos =
-              (lastTokenPos >= tokenOffset) ? lastTokenPos : tokenOffset;
+              (lastTokenPos! >= tokenOffset) ? lastTokenPos : tokenOffset;
         }
         _tokenToLine[tokenOffset] = lineNumber;
         _tokenToCol[tokenOffset] = colNumber;
@@ -3726,10 +3715,10 @@
     lines.clear();
     Logger.root.info('Adding ${sourceLines.length} source lines for ${uri}');
     for (var i = 0; i < sourceLines.length; i++) {
-      lines.add(new ScriptLine(this, i + lineOffset + 1, sourceLines[i]));
+      lines.add(new ScriptLine(this, i + lineOffset! + 1, sourceLines[i]));
     }
-    for (var bpt in isolate.breakpoints.values) {
-      if (bpt.location.script == this) {
+    for (var bpt in isolate!.breakpoints.values) {
+      if (bpt.location!.script == this) {
         _addBreakpoint(bpt);
       }
     }
@@ -3737,19 +3726,19 @@
 
   // Note, this may return source beyond the token length if [guessTokenLength]
   // fails.
-  String getToken(int tokenPos) {
-    final int line = tokenToLine(tokenPos);
-    int column = tokenToCol(tokenPos);
+  String? getToken(int tokenPos) {
+    final int? line = tokenToLine(tokenPos);
+    int? column = tokenToCol(tokenPos);
     if ((line == null) || (column == null)) {
       return null;
     }
     // Line and column numbers start at 1 in the VM.
     column -= 1;
-    String sourceLine = getLine(line)?.text;
+    String? sourceLine = getLine(line)?.text;
     if (sourceLine == null) {
       return null;
     }
-    final int length = guessTokenLength(line, column);
+    final int? length = guessTokenLength(line, column);
     if (length == null) {
       return sourceLine.substring(column);
     } else {
@@ -3759,21 +3748,21 @@
 
   void _addBreakpoint(Breakpoint bpt) {
     var line;
-    if (bpt.location.tokenPos != null) {
-      line = tokenToLine(bpt.location.tokenPos);
+    if (bpt.location!.tokenPos != null) {
+      line = tokenToLine(bpt.location!.tokenPos);
     } else {
-      UnresolvedSourceLocation loc = bpt.location;
+      UnresolvedSourceLocation loc = bpt.location as UnresolvedSourceLocation;
       line = loc.line;
     }
-    getLine(line)?.addBreakpoint(bpt);
+    getLine(line!)?.addBreakpoint(bpt);
   }
 
   void _removeBreakpoint(Breakpoint bpt) {
     var line;
-    if (bpt.location.tokenPos != null) {
-      line = tokenToLine(bpt.location.tokenPos);
+    if (bpt.location!.tokenPos != null) {
+      line = tokenToLine(bpt.location!.tokenPos);
     } else {
-      UnresolvedSourceLocation loc = bpt.location;
+      UnresolvedSourceLocation loc = bpt.location as UnresolvedSourceLocation;
       line = loc.line;
     }
     if (line != null) {
@@ -3824,14 +3813,16 @@
       return r;
     }
     // Current scan position.
-    var line = tokenToLine(tokenPos);
-    if (line == null) {
+    int? maybeLine = tokenToLine(tokenPos);
+    if (maybeLine == null) {
       return r;
     }
-    var column = tokenToCol(tokenPos);
-    if (column == null) {
+    int line = maybeLine;
+    int? maybeColumn = tokenToCol(tokenPos);
+    if (maybeColumn == null) {
       return r;
     }
+    int column = maybeColumn;
 
     // Move back by name length.
     // TODO(johnmccutchan): Fix LocalVarDescriptor to set column before the
@@ -3842,44 +3833,44 @@
 
     if (line == lastLine) {
       // Only one line.
-      if (!getLine(line).isTrivial) {
+      if (!getLine(line)!.isTrivial) {
         // TODO(johnmccutchan): end token pos -> column can lie for snapshotted
         // code. e.g.:
         // io_sink.dart source line 23 ends at column 39
         // io_sink.dart snapshotted source line 23 ends at column 35.
-        lastColumn = math.min(getLine(line).text.length, lastColumn);
-        lineContents = getLine(line).text.substring(column, lastColumn - 1);
+        lastColumn = math.min(getLine(line)!.text.length, lastColumn);
+        lineContents = getLine(line)!.text.substring(column, lastColumn - 1);
         return scanLineForLocalVariableLocations(
             pattern, name, lineContents, line, column);
       }
     }
 
     // Scan first line.
-    if (!getLine(line).isTrivial) {
-      lineContents = getLine(line).text.substring(column);
+    if (!getLine(line)!.isTrivial) {
+      lineContents = getLine(line)!.text.substring(column);
       r.addAll(scanLineForLocalVariableLocations(
           pattern, name, lineContents, line++, column));
     }
 
     // Scan middle lines.
     while (line < (lastLine - 1)) {
-      if (getLine(line).isTrivial) {
+      if (getLine(line)!.isTrivial) {
         line++;
         continue;
       }
-      lineContents = getLine(line).text;
+      lineContents = getLine(line)!.text;
       r.addAll(scanLineForLocalVariableLocations(
           pattern, name, lineContents, line++, 0));
     }
 
     // Scan last line.
-    if (!getLine(line).isTrivial) {
+    if (!getLine(line)!.isTrivial) {
       // TODO(johnmccutchan): end token pos -> column can lie for snapshotted
       // code. e.g.:
       // io_sink.dart source line 23 ends at column 39
       // io_sink.dart snapshotted source line 23 ends at column 35.
-      lastColumn = math.min(getLine(line).text.length, lastColumn);
-      lineContents = getLine(line).text.substring(0, lastColumn - 1);
+      lastColumn = math.min(getLine(line)!.text.length, lastColumn);
+      lineContents = getLine(line)!.text.substring(0, lastColumn - 1);
       r.addAll(scanLineForLocalVariableLocations(
           pattern, name, lineContents, line, 0));
     }
@@ -3893,8 +3884,8 @@
   final int tokenPos;
   final int tryIndex;
   final String kind;
-  Script script;
-  String formattedLine;
+  Script? script;
+  String? formattedLine;
   PcDescriptor(
       this.pcOffset, this.deoptId, this.tokenPos, this.tryIndex, this.kind);
 
@@ -3923,17 +3914,17 @@
     }
     this.script = script;
     var scriptLine = script.getLine(line);
-    formattedLine = scriptLine.text;
+    formattedLine = scriptLine!.text;
   }
 }
 
 class PcDescriptors extends ServiceObject implements M.PcDescriptorsRef {
-  Class clazz;
-  int size;
+  Class? clazz;
+  int? size;
   bool get immutable => true;
   final List<PcDescriptor> descriptors = <PcDescriptor>[];
 
-  PcDescriptors._empty(ServiceObjectOwner owner) : super._empty(owner) {}
+  PcDescriptors._empty(ServiceObjectOwner? owner) : super._empty(owner) {}
 
   void _update(Map m, bool mapIsRef) {
     if (mapIsRef) {
@@ -3970,11 +3961,11 @@
 }
 
 class LocalVarDescriptors extends ServiceObject {
-  Class clazz;
-  int size;
+  Class? clazz;
+  int? size;
   bool get immutable => true;
   final List<LocalVarDescriptor> descriptors = <LocalVarDescriptor>[];
-  LocalVarDescriptors._empty(ServiceObjectOwner owner) : super._empty(owner);
+  LocalVarDescriptors._empty(ServiceObjectOwner? owner) : super._empty(owner);
 
   void _update(Map m, bool mapIsRef) {
     if (mapIsRef) {
@@ -4002,10 +3993,10 @@
 class ObjectPool extends HeapObject implements M.ObjectPool {
   bool get immutable => false;
 
-  int length;
-  List<ObjectPoolEntry> entries;
+  int? length;
+  List<ObjectPoolEntry>? entries;
 
-  ObjectPool._empty(ServiceObjectOwner owner) : super._empty(owner);
+  ObjectPool._empty(ServiceObjectOwner? owner) : super._empty(owner);
 
   void _update(Map map, bool mapIsRef) {
     _upgradeCollection(map, isolate);
@@ -4024,8 +4015,8 @@
 class ObjectPoolEntry implements M.ObjectPoolEntry {
   final int offset;
   final M.ObjectPoolEntryKind kind;
-  final M.ObjectRef asObject;
-  final int asInteger;
+  final M.ObjectRef? asObject;
+  final int? asInteger;
 
   factory ObjectPoolEntry(map) {
     M.ObjectPoolEntryKind kind = stringToObjectPoolEntryKind(map['kind']);
@@ -4063,14 +4054,14 @@
 }
 
 class ICData extends HeapObject implements M.ICData {
-  HeapObject dartOwner;
-  String selector;
-  Instance argumentsDescriptor;
-  Instance entries;
+  HeapObject? dartOwner;
+  String? selector;
+  Instance? argumentsDescriptor;
+  Instance? entries;
 
   bool get immutable => false;
 
-  ICData._empty(ServiceObjectOwner owner) : super._empty(owner);
+  ICData._empty(ServiceObjectOwner? owner) : super._empty(owner);
 
   void _update(Map map, bool mapIsRef) {
     _upgradeCollection(map, isolate);
@@ -4087,12 +4078,12 @@
 }
 
 class UnlinkedCall extends HeapObject implements M.UnlinkedCall {
-  String selector;
-  Instance argumentsDescriptor;
+  String? selector;
+  Instance? argumentsDescriptor;
 
   bool get immutable => false;
 
-  UnlinkedCall._empty(ServiceObjectOwner owner) : super._empty(owner);
+  UnlinkedCall._empty(ServiceObjectOwner? owner) : super._empty(owner);
 
   void _update(Map map, bool mapIsRef) {
     _upgradeCollection(map, isolate);
@@ -4107,13 +4098,13 @@
 }
 
 class SingleTargetCache extends HeapObject implements M.SingleTargetCache {
-  Code target;
-  int lowerLimit;
-  int upperLimit;
+  Code? target;
+  int? lowerLimit;
+  int? upperLimit;
 
   bool get immutable => false;
 
-  SingleTargetCache._empty(ServiceObjectOwner owner) : super._empty(owner);
+  SingleTargetCache._empty(ServiceObjectOwner? owner) : super._empty(owner);
 
   void _update(Map map, bool mapIsRef) {
     _upgradeCollection(map, isolate);
@@ -4129,11 +4120,11 @@
 }
 
 class SubtypeTestCache extends HeapObject implements M.SubtypeTestCache {
-  Instance cache;
+  Instance? cache;
 
   bool get immutable => false;
 
-  SubtypeTestCache._empty(ServiceObjectOwner owner) : super._empty(owner);
+  SubtypeTestCache._empty(ServiceObjectOwner? owner) : super._empty(owner);
 
   void _update(Map map, bool mapIsRef) {
     _upgradeCollection(map, isolate);
@@ -4147,11 +4138,11 @@
 }
 
 class TypeArguments extends HeapObject implements M.TypeArguments {
-  HeapObject dartOwner;
-  String name;
-  Iterable<Instance> types;
+  HeapObject? dartOwner;
+  String? name;
+  Iterable<Instance>? types;
 
-  TypeArguments._empty(ServiceObjectOwner owner) : super._empty(owner);
+  TypeArguments._empty(ServiceObjectOwner? owner) : super._empty(owner);
 
   void _update(Map map, bool mapIsRef) {
     _upgradeCollection(map, isolate);
@@ -4167,11 +4158,11 @@
 }
 
 class InstanceSet extends HeapObject implements M.InstanceSet {
-  HeapObject dartOwner;
-  int count;
-  Iterable<HeapObject> instances;
+  HeapObject? dartOwner;
+  int? count;
+  Iterable<HeapObject>? instances;
 
-  InstanceSet._empty(ServiceObjectOwner owner) : super._empty(owner);
+  InstanceSet._empty(ServiceObjectOwner? owner) : super._empty(owner);
 
   void _update(Map map, bool mapIsRef) {
     _upgradeCollection(map, isolate);
@@ -4186,14 +4177,14 @@
 }
 
 class MegamorphicCache extends HeapObject implements M.MegamorphicCache {
-  int mask;
-  Instance buckets;
-  String selector;
-  Instance argumentsDescriptor;
+  int? mask;
+  Instance? buckets;
+  String? selector;
+  Instance? argumentsDescriptor;
 
   bool get immutable => false;
 
-  MegamorphicCache._empty(ServiceObjectOwner owner) : super._empty(owner);
+  MegamorphicCache._empty(ServiceObjectOwner? owner) : super._empty(owner);
 
   void _update(Map map, bool mapIsRef) {
     _upgradeCollection(map, isolate);
@@ -4216,7 +4207,7 @@
   final String machine;
   final String human;
   final ServiceObject object;
-  CodeInstruction jumpTarget;
+  CodeInstruction? jumpTarget;
   List<PcDescriptor> descriptors = <PcDescriptor>[];
 
   CodeInstruction(
@@ -4249,7 +4240,7 @@
   }
 
   void _resolveJumpTarget(
-      List<CodeInstruction> instructionsByAddressOffset, int startAddress) {
+      List<CodeInstruction?> instructionsByAddressOffset, int startAddress) {
     if (!_isJumpInstruction()) {
       return;
     }
@@ -4266,7 +4257,7 @@
       Logger.root.warning('Bad address resolving jump target $relativeAddress');
       return;
     }
-    jumpTarget = instructionsByAddressOffset[relativeAddress];
+    jumpTarget = instructionsByAddressOffset[relativeAddress]!;
   }
 }
 
@@ -4296,26 +4287,26 @@
 }
 
 class Code extends HeapObject implements M.Code {
-  M.CodeKind kind;
-  ObjectPool objectPool;
-  ServiceFunction function;
-  Script script;
-  bool isOptimized;
-  bool hasIntrinsic;
-  bool isNative;
+  M.CodeKind? kind;
+  ObjectPool? objectPool;
+  ServiceFunction? function;
+  Script? script;
+  bool? isOptimized;
+  bool? hasIntrinsic;
+  bool? isNative;
 
   int startAddress = 0;
   int endAddress = 0;
   final instructions = <CodeInstruction>[];
-  List<CodeInstruction> instructionsByAddressOffset;
+  List<CodeInstruction?>? instructionsByAddressOffset;
 
-  ProfileCode profile;
+  ProfileCode? profile;
   final List<CodeInlineInterval> inlineIntervals = <CodeInlineInterval>[];
   final List<ServiceFunction> inlinedFunctions = <ServiceFunction>[];
 
   bool get immutable => true;
 
-  Code._empty(ServiceObjectOwner owner) : super._empty(owner);
+  Code._empty(ServiceObjectOwner? owner) : super._empty(owner);
 
   void _updateDescriptors(Script script) {
     this.script = script;
@@ -4326,7 +4317,7 @@
     }
   }
 
-  Future loadScript() {
+  Future loadScript() async {
     if (script != null) {
       // Already done.
       return null;
@@ -4337,10 +4328,10 @@
     if (function == null) {
       return null;
     }
-    if ((function.location == null) || (function.location.script == null)) {
+    if ((function!.location == null) || (function!.location!.script == null)) {
       // Attempt to load the function.
-      return function.load().then((func) {
-        var script = function.location.script;
+      return function!.load().then((func) {
+        var script = function!.location!.script;
         if (script == null) {
           // Function doesn't have an associated script.
           return null;
@@ -4351,7 +4342,7 @@
     }
     {
       // Load the script and then update descriptors.
-      var script = function.location.script;
+      var script = function!.location!.script;
       return script.load().then((_) => _updateDescriptors(script));
     }
   }
@@ -4380,8 +4371,8 @@
     _loaded = true;
     startAddress = int.parse(m['_startAddress'], radix: 16);
     endAddress = int.parse(m['_endAddress'], radix: 16);
-    function = isolate.getFromMap(m['function']);
-    objectPool = isolate.getFromMap(m['_objectPool']);
+    function = isolate!.getFromMap(m['function']) as ServiceFunction;
+    objectPool = isolate!.getFromMap(m['_objectPool']) as ObjectPool;
     var disassembly = m['_disassembly'];
     if (disassembly != null) {
       _processDisassembly(disassembly);
@@ -4399,7 +4390,8 @@
       // Iterate and upgrade each ServiceFunction.
       for (var i = 0; i < inlinedFunctionsTable.length; i++) {
         // Upgrade each function and set it back in the list.
-        var func = isolate.getFromMap(inlinedFunctionsTable[i]);
+        var func =
+            isolate!.getFromMap(inlinedFunctionsTable[i]) as ServiceFunction;
         inlinedFunctionsTable[i] = func;
         if (!inlinedFunctions.contains(func)) {
           inlinedFunctions.add(func);
@@ -4417,7 +4409,7 @@
     super._update(m, mapIsRef);
   }
 
-  CodeInlineInterval findInterval(int pc) {
+  CodeInlineInterval? findInterval(int pc) {
     for (var i = 0; i < inlineIntervals.length; i++) {
       var interval = inlineIntervals[i];
       if (interval.contains(pc)) {
@@ -4451,7 +4443,8 @@
   void _processDisassembly(List disassembly) {
     assert(disassembly != null);
     instructions.clear();
-    instructionsByAddressOffset = new List(endAddress - startAddress);
+    instructionsByAddressOffset =
+        new List<CodeInstruction?>.filled(endAddress - startAddress, null);
 
     assert((disassembly.length % 4) == 0);
     for (var i = 0; i < disassembly.length; i += 4) {
@@ -4460,7 +4453,7 @@
       var human = disassembly[i + 2];
       var object = disassembly[i + 3];
       if (object != null) {
-        object = new ServiceObject._fromMap(owner, object);
+        object = ServiceObject._fromMap(owner, object);
       }
       var pcOffset = 0;
       if (disassembly[i] != null) {
@@ -4473,11 +4466,12 @@
       instructions.add(instruction);
       if (disassembly[i] != null) {
         // Not a code comment.
-        instructionsByAddressOffset[pcOffset] = instruction;
+        instructionsByAddressOffset![pcOffset] = instruction;
       }
     }
     for (var instruction in instructions) {
-      instruction._resolveJumpTarget(instructionsByAddressOffset, startAddress);
+      instruction._resolveJumpTarget(
+          instructionsByAddressOffset!, startAddress);
     }
   }
 
@@ -4490,7 +4484,7 @@
       var tryIndex = descriptor['tryIndex'];
       var kind = descriptor['kind'].trim();
 
-      var instruction = instructionsByAddressOffset[address - startAddress];
+      var instruction = instructionsByAddressOffset![address - startAddress];
       if (instruction != null) {
         instruction.descriptors
             .add(new PcDescriptor(pcOffset, deoptId, tokenPos, tryIndex, kind));
@@ -4553,16 +4547,16 @@
 /// OS pipes. Each socket is owned by another ServceObject, for example,
 /// a process or an HTTP server.
 class Socket extends ServiceObject {
-  Socket._empty(ServiceObjectOwner owner) : super._empty(owner);
+  Socket._empty(ServiceObjectOwner? owner) : super._empty(owner);
 
-  ServiceObject socketOwner;
+  ServiceObject? socketOwner;
 
   bool get isPipe => (kind == SocketKind.Pipe);
 
-  SocketStats latest;
-  SocketStats previous;
+  SocketStats? latest;
+  SocketStats? previous;
 
-  SocketKind kind;
+  SocketKind? kind;
 
   String protocol = '';
 
@@ -4573,12 +4567,12 @@
   /// Listening for connections.
   bool listening = false;
 
-  int fd;
+  int? fd;
 
-  String localAddress;
-  int localPort;
-  String remoteAddress;
-  int remotePort;
+  String? localAddress;
+  int? localPort;
+  String? remoteAddress;
+  int? remotePort;
 
   // Updates internal state from [map]. [map] can be a reference.
   void _update(Map map, bool mapIsRef) {
@@ -4613,20 +4607,20 @@
 }
 
 class ServiceMetric extends ServiceObject implements M.Metric {
-  ServiceMetric._empty(ServiceObjectOwner owner) : super._empty(owner) {}
+  ServiceMetric._empty(ServiceObjectOwner? owner) : super._empty(owner) {}
 
   bool get immutable => false;
 
   Future<Map> _fetchDirect({int count: kDefaultFieldLimit}) {
     assert(owner is Isolate);
-    return isolate.invokeRpcNoUpgrade('_getIsolateMetric', {'metricId': id});
+    return isolate!.invokeRpcNoUpgrade('_getIsolateMetric', {'metricId': id});
   }
 
-  String description;
+  String? description;
   double value = 0.0;
   // Only a gauge has a non-null min and max.
-  double min;
-  double max;
+  double? min;
+  double? max;
 
   bool get isGauge => (min != null) && (max != null);
 
@@ -4652,14 +4646,14 @@
 
 class Frame extends ServiceObject implements M.Frame {
   M.FrameKind kind = M.FrameKind.regular;
-  int index;
-  ServiceFunction function;
-  SourceLocation location;
-  Code code;
+  int? index;
+  ServiceFunction? function;
+  SourceLocation? location;
+  Code? code;
   List<ServiceMap> variables = <ServiceMap>[];
-  String marker;
+  String? marker;
 
-  Frame._empty(ServiceObject owner) : super._empty(owner);
+  Frame._empty(ServiceObjectOwner? owner) : super._empty(owner);
 
   void _update(Map map, bool mapIsRef) {
     assert(!mapIsRef);
@@ -4698,7 +4692,7 @@
 
   String toString() {
     if (function != null) {
-      return "Frame([$kind] ${function.qualifiedName} $location)";
+      return "Frame([$kind] ${function!.qualifiedName} $location)";
     } else if (location != null) {
       return "Frame([$kind] $location)";
     } else {
@@ -4708,10 +4702,10 @@
 
   Future<String> toUserString() async {
     if (function != null) {
-      return "Frame([$kind] ${function.qualifiedName} "
-          "${await location.toUserString()})";
+      return "Frame([$kind] ${function!.qualifiedName} "
+          "${await location!.toUserString()})";
     } else if (location != null) {
-      return "Frame([$kind] ${await location.toUserString()}";
+      return "Frame([$kind] ${await location!.toUserString()}";
     } else {
       return "Frame([$kind])";
     }
@@ -4719,13 +4713,13 @@
 }
 
 class ServiceMessage extends ServiceObject {
-  int index;
-  String messageObjectId;
-  int size;
-  ServiceFunction handler;
-  SourceLocation location;
+  int? index;
+  String? messageObjectId;
+  int? size;
+  ServiceFunction? handler;
+  SourceLocation? location;
 
-  ServiceMessage._empty(ServiceObject owner) : super._empty(owner);
+  ServiceMessage._empty(ServiceObjectOwner? owner) : super._empty(owner);
 
   void _update(Map map, bool mapIsRef) {
     assert(!mapIsRef);
@@ -4766,14 +4760,14 @@
         var possibleBpts = range['possibleBreakpoints'];
         if (possibleBpts != null) {
           for (var tokenPos in possibleBpts) {
-            result.add(script.tokenToLine(tokenPos));
+            result.add(script.tokenToLine(tokenPos!)!);
           }
         }
       } else {
-        int startLine = script.tokenToLine(range['startPos']);
-        int endLine = script.tokenToLine(range['endPos']);
+        int startLine = script.tokenToLine(range['startPos'])!;
+        int endLine = script.tokenToLine(range['endPos'])!;
         for (int line = startLine; line <= endLine; line++) {
-          if (!script.getLine(line).isTrivial) {
+          if (!script.getLine(line)!.isTrivial) {
             result.add(line);
           }
         }
@@ -4795,7 +4789,7 @@
 /// Recursively upgrades all [ServiceObject]s inside [collection] which must
 /// be an [Map] or an [List]. Upgraded elements will be
 /// associated with [vm] and [isolate].
-void _upgradeCollection(collection, ServiceObjectOwner owner) {
+void _upgradeCollection(collection, ServiceObjectOwner? owner) {
   if (collection is ServiceMap) {
     return; // Already upgraded.
   }
@@ -4807,10 +4801,10 @@
   }
 }
 
-void _upgradeMap(Map map, ServiceObjectOwner owner) {
+void _upgradeMap(Map map, ServiceObjectOwner? owner) {
   map.forEach((k, v) {
     if ((v is Map) && _isServiceMap(v)) {
-      map[k] = owner.getFromMap(v);
+      map[k] = owner!.getFromMap(v);
     } else if (v is List) {
       _upgradeList(v, owner);
     } else if (v is Map) {
@@ -4819,7 +4813,7 @@
   });
 }
 
-void _upgradeList(List list, ServiceObjectOwner owner) {
+void _upgradeList(List list, ServiceObjectOwner? owner) {
   if (list is Uint8List) {
     // Nothing to upgrade; avoid slowly visiting every byte
     // of large binary responses.
@@ -4829,7 +4823,7 @@
   for (var i = 0; i < list.length; i++) {
     var v = list[i];
     if ((v is Map) && _isServiceMap(v)) {
-      list[i] = owner.getFromMap(v);
+      list[i] = owner!.getFromMap(v);
     } else if (v is List) {
       _upgradeList(v, owner);
     } else if (v is Map) {
diff --git a/runtime/observatory/lib/tracer.dart b/runtime/observatory/lib/tracer.dart
index 3a18cfd..3f9a07f 100644
--- a/runtime/observatory/lib/tracer.dart
+++ b/runtime/observatory/lib/tracer.dart
@@ -27,7 +27,7 @@
 }
 
 class TraceEvent {
-  TraceEvent.msg(this._time, this.message, Map originalMap) {
+  TraceEvent.msg(this._time, this.message, Map? originalMap) {
     map = _deepCopy(originalMap);
   }
 
@@ -39,14 +39,14 @@
 
   int _time;
   String message;
-  Map map;
+  Map? map;
 }
 
 class Tracer {
   // The current global tracer.
-  static Tracer get current => _current;
+  static Tracer? get current => _current;
 
-  static Tracer _current;
+  static Tracer? _current;
 
   static void start() {
     if (_current == null) {
@@ -56,23 +56,23 @@
 
   static void stop() {
     if (_current != null) {
-      _current.cancel();
+      _current!.cancel();
       _current = null;
     }
   }
 
   // The tracer subscribes to all logging events.
-  StreamSubscription loggerSub = null;
+  StreamSubscription? loggerSub = null;
 
   // The start time for the current request.
-  Stopwatch _time;
+  Stopwatch? _time;
 
   // A list of all tracing events for thre current request.
   List<TraceEvent> events = <TraceEvent>[];
 
   Tracer() {
     _time = new Stopwatch();
-    _time.start();
+    _time!.start();
     loggerSub = Logger.root.onRecord.listen((LogRecord rec) {
       // Echo all log messages to the trace.
       trace('${rec.level.name}: ${rec.message}');
@@ -81,16 +81,16 @@
   }
 
   void cancel() {
-    loggerSub.cancel();
+    loggerSub!.cancel();
   }
 
   void reset() {
-    _time.reset();
+    _time!.reset();
     events.clear();
   }
 
-  TraceEvent trace(String message, {Map map: null}) {
-    var event = new TraceEvent.msg(_time.elapsedMicroseconds, message, map);
+  TraceEvent trace(String message, {Map? map}) {
+    var event = new TraceEvent.msg(_time!.elapsedMicroseconds, message, map);
     events.add(event);
     return event;
   }
diff --git a/runtime/observatory/lib/utils.dart b/runtime/observatory/lib/utils.dart
index 821e88f..940a6e1 100644
--- a/runtime/observatory/lib/utils.dart
+++ b/runtime/observatory/lib/utils.dart
@@ -29,7 +29,7 @@
   static String zeroPad(int value, int pad) {
     String prefix = "";
     while (pad > 1) {
-      int pow10 = pow(10, pad - 1);
+      int pow10 = pow(10, pad - 1) as int;
       if (value < pow10) {
         prefix = prefix + "0";
       }
@@ -289,7 +289,7 @@
 
 /// A [Task] that can be scheduled on the Dart event queue.
 class Task {
-  Timer _timer;
+  Timer? _timer;
   final Function callback;
 
   Task(this.callback);
diff --git a/runtime/observatory/pubspec.yaml b/runtime/observatory/pubspec.yaml
index efd6952..ba282ab 100644
--- a/runtime/observatory/pubspec.yaml
+++ b/runtime/observatory/pubspec.yaml
@@ -1,6 +1,6 @@
 name: observatory
 environment:
-  sdk: '>=2.2.2 <3.0.0'
+  sdk: '>=2.10.0 <3.0.0'
 
 dependencies:
   usage: 'any'
@@ -8,4 +8,3 @@
 dev_dependencies:
   build_runner: '>=1.6.2 <2.0.0'
   build_web_compilers: '>=2.6.1 <3.0.0'
-
diff --git a/runtime/observatory/tests/observatory_ui/app_test.dart b/runtime/observatory/tests/observatory_ui/app_test.dart
index 0fab60c..9622ec4ad 100644
--- a/runtime/observatory/tests/observatory_ui/app_test.dart
+++ b/runtime/observatory/tests/observatory_ui/app_test.dart
@@ -14,7 +14,7 @@
       print('${rec.level.name}: ${rec.time}: ${rec.message}');
     });
     Logger.root.info('Starting Observatory');
-    document.body.children
+    document.body!.children
         .insert(0, new ObservatoryApplicationElement.created().element);
   });
 }
diff --git a/runtime/observatory/tests/service/add_breakpoint_rpc_kernel_test.dart b/runtime/observatory/tests/service/add_breakpoint_rpc_kernel_test.dart
index 34feaf0..96ae4b5 100644
--- a/runtime/observatory/tests/service/add_breakpoint_rpc_kernel_test.dart
+++ b/runtime/observatory/tests/service/add_breakpoint_rpc_kernel_test.dart
@@ -38,15 +38,15 @@
     var futureBpt1 = await isolate.addBreakpoint(script, LINE_A);
     expect(futureBpt1.number, equals(1));
     expect(futureBpt1.resolved, isFalse);
-    expect(await futureBpt1.location.getLine(), equals(LINE_A));
-    expect(await futureBpt1.location.getColumn(), equals(null));
+    expect(await futureBpt1.location!.getLine(), equals(LINE_A));
+    expect(await futureBpt1.location!.getColumn(), equals(null));
 
     // Future breakpoint with specific column.
     var futureBpt2 = await isolate.addBreakpoint(script, LINE_A, 3);
     expect(futureBpt2.number, equals(2));
     expect(futureBpt2.resolved, isFalse);
-    expect(await futureBpt2.location.getLine(), equals(LINE_A));
-    expect(await futureBpt2.location.getColumn(), equals(3));
+    expect(await futureBpt2.location!.getLine(), equals(LINE_A));
+    expect(await futureBpt2.location!.getColumn(), equals(3));
 
     int resolvedCount =
         await resumeAndCountResolvedBreakpointsUntilPause(isolate);
@@ -54,21 +54,21 @@
     // After resolution the breakpoints have assigned line & column.
     expect(resolvedCount, equals(2));
     expect(futureBpt1.resolved, isTrue);
-    expect(await futureBpt1.location.getLine(), equals(LINE_A));
-    expect(await futureBpt1.location.getColumn(), equals(12));
+    expect(await futureBpt1.location!.getLine(), equals(LINE_A));
+    expect(await futureBpt1.location!.getColumn(), equals(12));
     expect(futureBpt2.resolved, isTrue);
-    expect(await futureBpt2.location.getLine(), equals(LINE_A));
-    expect(await futureBpt2.location.getColumn(), equals(3));
+    expect(await futureBpt2.location!.getLine(), equals(LINE_A));
+    expect(await futureBpt2.location!.getColumn(), equals(3));
 
     // The first breakpoint hits before value is modified.
-    Instance result = await rootLib.evaluate('value');
+    Instance result = await rootLib.evaluate('value') as Instance;
     expect(result.valueAsString, equals('0'));
 
     isolate.resume();
     await hasStoppedAtBreakpoint(isolate);
 
     // The second breakpoint hits after value has been modified once.
-    result = await rootLib.evaluate('value');
+    result = await rootLib.evaluate('value') as Instance;
     expect(result.valueAsString, equals('1'));
 
     // Remove the breakpoints.
@@ -85,8 +85,8 @@
     for (int col = 1; col <= 50; col++) {
       var bpt = await isolate.addBreakpoint(script, LINE_A, col);
       expect(bpt.resolved, isTrue);
-      int resolvedLine = await bpt.location.getLine();
-      int resolvedCol = await bpt.location.getColumn();
+      int resolvedLine = await bpt.location!.getLine() as int;
+      int resolvedCol = await bpt.location!.getColumn() as int;
       print('$LINE_A:${col} -> ${resolvedLine}:${resolvedCol}');
       if (col <= 12) {
         expect(resolvedLine, equals(LINE_A));
diff --git a/runtime/observatory/tests/service/allocations_test.dart b/runtime/observatory/tests/service/allocations_test.dart
index b2d9085..6a7d002 100644
--- a/runtime/observatory/tests/service/allocations_test.dart
+++ b/runtime/observatory/tests/service/allocations_test.dart
@@ -13,7 +13,7 @@
 // Prevent TFA from removing this static field to ensure the objects are kept
 // alive, so the allocation stats will report them via the service api.
 @pragma('vm:entry-point')
-List<Foo> foos;
+List<Foo>? foos;
 
 void script() {
   foos = [new Foo(), new Foo(), new Foo()];
diff --git a/runtime/observatory/tests/service/async_single_step_exception_test.dart b/runtime/observatory/tests/service/async_single_step_exception_test.dart
index fdc490e..55bd063 100644
--- a/runtime/observatory/tests/service/async_single_step_exception_test.dart
+++ b/runtime/observatory/tests/service/async_single_step_exception_test.dart
@@ -27,7 +27,7 @@
   print('mmmmm'); // LINE_C.
   try {
     await helper(); // LINE_D.
-  } catch (e) {
+  } on dynamic catch (e) {
     // arrive here on error.
     print('error: $e'); // LINE_E.
   } finally {
diff --git a/runtime/observatory/tests/service/auth_token_test.dart b/runtime/observatory/tests/service/auth_token_test.dart
index f2ba275..27a0b47 100644
--- a/runtime/observatory/tests/service/auth_token_test.dart
+++ b/runtime/observatory/tests/service/auth_token_test.dart
@@ -17,13 +17,13 @@
   ServiceProtocolInfo info = await Service.controlWebServer(enable: true);
   Expect.isNotNull(info.serverUri);
   // Ensure that we have the auth token in the path segments.
-  Expect.isTrue(info.serverUri.pathSegments.length > 1);
+  Expect.isTrue(info.serverUri!.pathSegments.length > 1);
   // Sanity check the length of the auth token.
-  Expect.isTrue(info.serverUri.pathSegments[0].length > 8);
+  Expect.isTrue(info.serverUri!.pathSegments[0].length > 8);
 
   // Try connecting to the server without the auth token, it should throw
   // an exception.
-  var port = info.serverUri.port;
+  var port = info.serverUri!.port;
   var url = Uri.parse('http://localhost:$port');
   var httpClient = new io.HttpClient();
   try {
@@ -35,7 +35,7 @@
 
   // Try connecting to the server with the auth token, it should succeed.
   try {
-    var request = await httpClient.getUrl(info.serverUri);
+    var request = await httpClient.getUrl(info.serverUri!);
   } catch (e) {
     fail('could not connect');
   }
diff --git a/runtime/observatory/tests/service/bad_reload_test.dart b/runtime/observatory/tests/service/bad_reload_test.dart
index 9c4219c..eb40b71 100644
--- a/runtime/observatory/tests/service/bad_reload_test.dart
+++ b/runtime/observatory/tests/service/bad_reload_test.dart
@@ -32,9 +32,9 @@
   await isolate.reload();
   Library lib = isolate.rootLibrary;
   await lib.load();
-  Instance result = await lib.evaluate('test()');
+  Instance result = await lib.evaluate('test()') as Instance;
   expect(result.isString, isTrue);
-  return result.valueAsString;
+  return result.valueAsString as String;
 }
 
 var tests = <IsolateTest>[
diff --git a/runtime/observatory/tests/service/bad_web_socket_address_test.dart b/runtime/observatory/tests/service/bad_web_socket_address_test.dart
index b0a3bbb..63d8386 100644
--- a/runtime/observatory/tests/service/bad_web_socket_address_test.dart
+++ b/runtime/observatory/tests/service/bad_web_socket_address_test.dart
@@ -24,5 +24,5 @@
     print('${rec.level.name}: ${rec.time}: ${rec.message}');
   });
 
-  await test('bad web socket address', testBadWebSocket);
+  test('bad web socket address', testBadWebSocket);
 }
diff --git a/runtime/observatory/tests/service/break_on_activation_test.dart b/runtime/observatory/tests/service/break_on_activation_test.dart
index fac2684..1b6191b 100644
--- a/runtime/observatory/tests/service/break_on_activation_test.dart
+++ b/runtime/observatory/tests/service/break_on_activation_test.dart
@@ -48,7 +48,7 @@
 
 var tests = <IsolateTest>[
   (Isolate isolate) async {
-    Library rootLib = await isolate.rootLibrary.load();
+    Library rootLib = await isolate.rootLibrary.load() as Library;
 
     var breaksHit = 0;
 
@@ -92,7 +92,7 @@
     await cancelFutureSubscription(subscriptionFuture);
   },
   (Isolate isolate) async {
-    Library rootLib = await isolate.rootLibrary.load();
+    Library rootLib = await isolate.rootLibrary.load() as Library;
 
     var breaksHit = 0;
 
@@ -136,7 +136,7 @@
     await cancelFutureSubscription(subscriptionFuture);
   },
   (Isolate isolate) async {
-    Library rootLib = await isolate.rootLibrary.load();
+    Library rootLib = await isolate.rootLibrary.load() as Library;
 
     var breaksHit = 0;
 
diff --git a/runtime/observatory/tests/service/break_on_async_function_test.dart b/runtime/observatory/tests/service/break_on_async_function_test.dart
index dd52294..ba6bb18 100644
--- a/runtime/observatory/tests/service/break_on_async_function_test.dart
+++ b/runtime/observatory/tests/service/break_on_async_function_test.dart
@@ -26,7 +26,7 @@
 
 // Add breakpoint at the entry of async function
   (Isolate isolate) async {
-    Library rootLib = await isolate.rootLibrary.load();
+    Library rootLib = await isolate.rootLibrary.load() as Library;
     var function =
         rootLib.functions.singleWhere((f) => f.name == 'testFunction');
 
diff --git a/runtime/observatory/tests/service/break_on_default_constructor_test.dart b/runtime/observatory/tests/service/break_on_default_constructor_test.dart
index d968ca2..83e09fa 100644
--- a/runtime/observatory/tests/service/break_on_default_constructor_test.dart
+++ b/runtime/observatory/tests/service/break_on_default_constructor_test.dart
@@ -51,7 +51,7 @@
     if (loc.valid) {
       if (loc.function != null) {
         try {
-          await debugger.isolate.addBreakpointAtEntry(loc.function);
+          await debugger.isolate.addBreakpointAtEntry(loc.function!);
         } on S.ServerRpcException catch (e) {
           if (e.code == S.ServerRpcException.kCannotAddBreakpoint) {
             // Expected
diff --git a/runtime/observatory/tests/service/break_on_function_test.dart b/runtime/observatory/tests/service/break_on_function_test.dart
index 89f60fb..acdf910 100644
--- a/runtime/observatory/tests/service/break_on_function_test.dart
+++ b/runtime/observatory/tests/service/break_on_function_test.dart
@@ -32,7 +32,7 @@
 
 // Add breakpoint
   (Isolate isolate) async {
-    Library rootLib = await isolate.rootLibrary.load();
+    Library rootLib = await isolate.rootLibrary.load() as Library;
     var function =
         rootLib.functions.singleWhere((f) => f.name == 'testFunction');
 
diff --git a/runtime/observatory/tests/service/breakpoint_async_break_test.dart b/runtime/observatory/tests/service/breakpoint_async_break_test.dart
index b59613e..671577e 100644
--- a/runtime/observatory/tests/service/breakpoint_async_break_test.dart
+++ b/runtime/observatory/tests/service/breakpoint_async_break_test.dart
@@ -33,8 +33,8 @@
     var futureBpt = await isolate.addBreakpoint(script, LINE);
     expect(futureBpt.number, 1);
     expect(futureBpt.resolved, isFalse);
-    expect(await futureBpt.location.getLine(), LINE);
-    expect(await futureBpt.location.getColumn(), null);
+    expect(await futureBpt.location!.getLine(), LINE);
+    expect(await futureBpt.location!.getColumn(), null);
 
     var stream = await isolate.vm.getEventStream(VM.kDebugStream);
     Completer completer = new Completer();
@@ -55,8 +55,8 @@
     // After resolution the breakpoints have assigned line & column.
     expect(resolvedCount, 1);
     expect(futureBpt.resolved, isTrue);
-    expect(await futureBpt.location.getLine(), LINE);
-    expect(await futureBpt.location.getColumn(), 7);
+    expect(await futureBpt.location!.getLine(), LINE);
+    expect(await futureBpt.location!.getColumn(), 7);
 
     // Remove the breakpoints.
     expect((await isolate.removeBreakpoint(futureBpt)).type, 'Success');
diff --git a/runtime/observatory/tests/service/breakpoint_non_debuggable_library_test.dart b/runtime/observatory/tests/service/breakpoint_non_debuggable_library_test.dart
index 1c7af66..e4339b4 100644
--- a/runtime/observatory/tests/service/breakpoint_non_debuggable_library_test.dart
+++ b/runtime/observatory/tests/service/breakpoint_non_debuggable_library_test.dart
@@ -54,7 +54,7 @@
       'isDebuggable': false,
     };
     Map<String, dynamic> result = await isolate.invokeRpcNoUpgrade(
-        'setLibraryDebuggable', setDebugParams);
+        'setLibraryDebuggable', setDebugParams) as Map<String, dynamic>;
     expect(result['type'], 'Success');
     await has_part.reload();
     expect(has_part.debuggable, false);
@@ -63,7 +63,7 @@
     // Breakpoints are not allowed to set on non-debuggable libraries.
     try {
       await isolate.addBreakpoint(script, LINE_B);
-    } catch (e) {
+    } on dynamic catch (e) {
       expect(e is ServerRpcException, true);
       expect(e.code == ServerRpcException.kCannotAddBreakpoint, true);
       print("Set Breakpoint to non-debuggable library is not allowed");
diff --git a/runtime/observatory/tests/service/breakpoint_two_args_checked_test.dart b/runtime/observatory/tests/service/breakpoint_two_args_checked_test.dart
index 4723545..9832fa4 100644
--- a/runtime/observatory/tests/service/breakpoint_two_args_checked_test.dart
+++ b/runtime/observatory/tests/service/breakpoint_two_args_checked_test.dart
@@ -19,7 +19,7 @@
 class NotGeneric {}
 
 testeeMain() {
-  var x = new List(1);
+  var x = new List<dynamic>.filled(1, null);
   var y = 7;
   debugger();
   print("Statement");
@@ -33,23 +33,23 @@
 
 // Add breakpoints.
   (Isolate isolate) async {
-    Library rootLib = await isolate.rootLibrary.load();
+    Library rootLib = await isolate.rootLibrary.load() as Library;
     var script = rootLib.scripts[0];
 
     var bpt1 = await isolate.addBreakpoint(script, LINE_A);
     print(bpt1);
     expect(bpt1.resolved, isTrue);
-    expect(await bpt1.location.getLine(), equals(LINE_A));
+    expect(await bpt1.location!.getLine(), equals(LINE_A));
 
     var bpt2 = await isolate.addBreakpoint(script, LINE_B);
     print(bpt2);
     expect(bpt2.resolved, isTrue);
-    expect(await bpt2.location.getLine(), equals(LINE_B));
+    expect(await bpt2.location!.getLine(), equals(LINE_B));
 
     var bpt3 = await isolate.addBreakpoint(script, LINE_C);
     print(bpt3);
     expect(bpt3.resolved, isTrue);
-    expect(await bpt3.location.getLine(), equals(LINE_C));
+    expect(await bpt3.location!.getLine(), equals(LINE_C));
   },
 
   resumeIsolate,
diff --git a/runtime/observatory/tests/service/caching_test.dart b/runtime/observatory/tests/service/caching_test.dart
index 0c89eca..9f374f7 100644
--- a/runtime/observatory/tests/service/caching_test.dart
+++ b/runtime/observatory/tests/service/caching_test.dart
@@ -14,9 +14,9 @@
 
 var tests = <IsolateTest>[
   (Isolate isolate) async {
-    Library lib = await isolate.rootLibrary.load();
-    Script script = await lib.scripts.single.load();
-    Script script2 = await isolate.getObject(script.id);
+    Library lib = await isolate.rootLibrary.load() as Library;
+    Script script = await lib.scripts.single.load() as Script;
+    Script script2 = await isolate.getObject(script.id!) as Script;
     expect(identical(script, script2), isTrue);
   },
 ];
diff --git a/runtime/observatory/tests/service/client_resume_approvals_approve_then_disconnect_test.dart b/runtime/observatory/tests/service/client_resume_approvals_approve_then_disconnect_test.dart
index 28715a4..af84161 100644
--- a/runtime/observatory/tests/service/client_resume_approvals_approve_then_disconnect_test.dart
+++ b/runtime/observatory/tests/service/client_resume_approvals_approve_then_disconnect_test.dart
@@ -16,13 +16,13 @@
   print(i);
 }
 
-WebSocketVM client1;
-WebSocketVM client2;
+late WebSocketVM client1;
+late WebSocketVM client2;
 
 final test = <IsolateTest>[
   hasPausedAtStart,
   (Isolate isolate) async {
-    client1 = await createClient(isolate.owner);
+    client1 = await createClient(isolate.owner as WebSocketVM);
     await setRequireApprovalForResume(
       client1,
       isolate,
@@ -30,7 +30,7 @@
       pauseOnExit: true,
     );
     client2 = await createClient(
-      isolate.owner,
+      isolate.owner as WebSocketVM,
       clientName: otherClientName,
     );
     await setRequireApprovalForResume(
diff --git a/runtime/observatory/tests/service/client_resume_approvals_common.dart b/runtime/observatory/tests/service/client_resume_approvals_common.dart
index a2221e5..b6a8006 100644
--- a/runtime/observatory/tests/service/client_resume_approvals_common.dart
+++ b/runtime/observatory/tests/service/client_resume_approvals_common.dart
@@ -81,5 +81,5 @@
       }
     });
   });
-  return completer.future;
+  await completer.future;
 }
diff --git a/runtime/observatory/tests/service/client_resume_approvals_disconnect_test.dart b/runtime/observatory/tests/service/client_resume_approvals_disconnect_test.dart
index 1ef5273..e94b528 100644
--- a/runtime/observatory/tests/service/client_resume_approvals_disconnect_test.dart
+++ b/runtime/observatory/tests/service/client_resume_approvals_disconnect_test.dart
@@ -16,14 +16,14 @@
   print(i);
 }
 
-WebSocketVM client1;
-WebSocketVM client2;
+late WebSocketVM client1;
+late WebSocketVM client2;
 
 final test = <IsolateTest>[
   // Multiple clients, disconnect client awaiting approval.
   hasPausedAtStart,
   (Isolate isolate) async {
-    client1 = await createClient(isolate.owner);
+    client1 = await createClient(isolate.owner as WebSocketVM);
     await setRequireApprovalForResume(
       client1,
       isolate,
@@ -31,7 +31,7 @@
       pauseOnExit: true,
     );
     client2 = await createClient(
-      isolate.owner,
+      isolate.owner as WebSocketVM,
       clientName: otherClientName,
     );
     await setRequireApprovalForResume(
diff --git a/runtime/observatory/tests/service/client_resume_approvals_identical_names_test.dart b/runtime/observatory/tests/service/client_resume_approvals_identical_names_test.dart
index 06df948..4618441 100644
--- a/runtime/observatory/tests/service/client_resume_approvals_identical_names_test.dart
+++ b/runtime/observatory/tests/service/client_resume_approvals_identical_names_test.dart
@@ -16,22 +16,22 @@
   print(i);
 }
 
-WebSocketVM client1;
-WebSocketVM client2;
+late WebSocketVM client1;
+late WebSocketVM client2;
 
 final sameClientNamesTest = <IsolateTest>[
   // Multiple clients, same client names.
   (Isolate isolate) async {
     final resumeFuture = waitForResume(isolate);
 
-    client1 = await createClient(isolate.owner);
+    client1 = await createClient(isolate.owner as WebSocketVM);
     await setRequireApprovalForResume(
       client1,
       isolate,
       pauseOnStart: true,
       pauseOnExit: true,
     );
-    client2 = await createClient(isolate.owner);
+    client2 = await createClient(isolate.owner as WebSocketVM);
 
     expect(await isPausedAtStart(isolate), true);
     await resume(client2, isolate);
diff --git a/runtime/observatory/tests/service/client_resume_approvals_multiple_names_test.dart b/runtime/observatory/tests/service/client_resume_approvals_multiple_names_test.dart
index 780fe61..60a8282 100644
--- a/runtime/observatory/tests/service/client_resume_approvals_multiple_names_test.dart
+++ b/runtime/observatory/tests/service/client_resume_approvals_multiple_names_test.dart
@@ -16,14 +16,14 @@
   print(i);
 }
 
-WebSocketVM client1;
-WebSocketVM client2;
-WebSocketVM client3;
+late WebSocketVM client1;
+late WebSocketVM client2;
+late WebSocketVM client3;
 
 final multipleClientNamesTest = <IsolateTest>[
   // Multiple clients, different client names.
   (Isolate isolate) async {
-    client1 = await createClient(isolate.owner);
+    client1 = await createClient(isolate.owner as WebSocketVM);
     await setRequireApprovalForResume(
       client1,
       isolate,
@@ -31,10 +31,11 @@
       pauseOnExit: true,
     );
     client2 = await createClient(
-      isolate.owner,
+      isolate.owner as WebSocketVM,
       clientName: otherClientName,
     );
-    client3 = await createClient(isolate.owner, clientName: 'DummyClient');
+    client3 = await createClient(isolate.owner as WebSocketVM,
+        clientName: 'DummyClient');
 
     final resumeFuture = waitForResume(isolate);
     expect(await isPausedAtStart(isolate), true);
diff --git a/runtime/observatory/tests/service/client_resume_approvals_name_change_test.dart b/runtime/observatory/tests/service/client_resume_approvals_name_change_test.dart
index dac6f2b..0d58098 100644
--- a/runtime/observatory/tests/service/client_resume_approvals_name_change_test.dart
+++ b/runtime/observatory/tests/service/client_resume_approvals_name_change_test.dart
@@ -16,9 +16,9 @@
   print(i);
 }
 
-WebSocketVM client1;
-WebSocketVM client2;
-WebSocketVM client3;
+late WebSocketVM client1;
+late WebSocketVM client2;
+late WebSocketVM client3;
 
 final nameChangeTest = <IsolateTest>[
   // Remove required approvals via name change.
@@ -26,15 +26,16 @@
     final resumeFuture = waitForResume(isolate);
 
     // Create two clients with the same name.
-    client1 = await createClient(isolate.owner);
-    client2 = await createClient(isolate.owner);
+    client1 = await createClient(isolate.owner as WebSocketVM);
+    client2 = await createClient(isolate.owner as WebSocketVM);
     await setRequireApprovalForResume(
       client1,
       isolate,
       pauseOnStart: true,
       pauseOnExit: true,
     );
-    client3 = await createClient(isolate.owner, clientName: otherClientName);
+    client3 = await createClient(isolate.owner as WebSocketVM,
+        clientName: otherClientName);
 
     // Check that client3 can't resume the isolate on its own.
     expect(await isPausedAtStart(isolate), true);
diff --git a/runtime/observatory/tests/service/client_resume_approvals_reload_test.dart b/runtime/observatory/tests/service/client_resume_approvals_reload_test.dart
index fcd7e72..9731070 100644
--- a/runtime/observatory/tests/service/client_resume_approvals_reload_test.dart
+++ b/runtime/observatory/tests/service/client_resume_approvals_reload_test.dart
@@ -19,22 +19,22 @@
   print(i);
 }
 
-WebSocketVM client1;
-WebSocketVM client2;
+late WebSocketVM client1;
+late WebSocketVM client2;
 
 final hotReloadTest = <IsolateTest>[
   // Multiple clients, hot reload approval.
   (Isolate isolate) async {
     final resumeFuture = waitForResume(isolate);
 
-    client1 = await createClient(isolate.owner);
+    client1 = await createClient(isolate.owner as WebSocketVM);
     await setRequireApprovalForResume(
       client1,
       isolate,
       pauseOnReload: true,
     );
     client2 = await createClient(
-      isolate.owner,
+      isolate.owner as WebSocketVM,
       clientName: otherClientName,
     );
     await setRequireApprovalForResume(
diff --git a/runtime/observatory/tests/service/code_test.dart b/runtime/observatory/tests/service/code_test.dart
index c08ef61..00bd9da 100644
--- a/runtime/observatory/tests/service/code_test.dart
+++ b/runtime/observatory/tests/service/code_test.dart
@@ -66,15 +66,15 @@
 
     List tests = <IsolateTest>[];
     // Load code from frame 0.
-    Code code = await isolate.getObject(codeId0);
+    Code code = await isolate.getObject(codeId0) as Code;
     expect(code.type, equals('Code'));
-    expect(code.function.name, equals('funcB'));
+    expect(code.function!.name, equals('funcB'));
     expect(code.hasDisassembly, equals(true));
 
     // Load code from frame 0.
-    code = await isolate.getObject(codeId1);
+    code = await isolate.getObject(codeId1) as Code;
     expect(code.type, equals('Code'));
-    expect(code.function.name, equals('funcA'));
+    expect(code.function!.name, equals('funcA'));
     expect(code.hasDisassembly, equals(true));
   },
 ];
diff --git a/runtime/observatory/tests/service/command_test.dart b/runtime/observatory/tests/service/command_test.dart
index a23d6b4..f77ef00 100644
--- a/runtime/observatory/tests/service/command_test.dart
+++ b/runtime/observatory/tests/service/command_test.dart
@@ -9,17 +9,17 @@
 
 class TestCommand extends Command {
   TestCommand(this.out, name, children) : super(name, children);
-  StringBuffer out;
+  StringBuffer? out;
 
   Future run(List<String> args) {
-    out.write('executing ${name}(${args})\n');
+    out!.write('executing ${name}(${args})\n');
     return new Future.value(null);
   }
 }
 
 class TestCompleteCommand extends Command {
   TestCompleteCommand(this.out, name, children) : super(name, children);
-  StringBuffer out;
+  StringBuffer? out;
 
   Future<List<String>> complete(List<String> args) {
     var possibles = ['one ', 'two ', 'three '];
@@ -28,7 +28,7 @@
   }
 
   Future run(List<String> args) {
-    out.write('executing ${name}(${args})\n');
+    out!.write('executing ${name}(${args})\n');
     return new Future.value(null);
   }
 }
diff --git a/runtime/observatory/tests/service/complex_reload_test.dart b/runtime/observatory/tests/service/complex_reload_test.dart
index f0c8b93..a9cca6a 100644
--- a/runtime/observatory/tests/service/complex_reload_test.dart
+++ b/runtime/observatory/tests/service/complex_reload_test.dart
@@ -34,9 +34,9 @@
   await isolate.reload();
   Library lib = isolate.rootLibrary;
   await lib.load();
-  Instance result = await lib.evaluate('test()');
+  Instance result = await lib.evaluate('test()') as Instance;
   expect(result.isString, isTrue);
-  return result.valueAsString;
+  return result.valueAsString as String;
 }
 
 var tests = <IsolateTest>[
diff --git a/runtime/observatory/tests/service/contexts_test.dart b/runtime/observatory/tests/service/contexts_test.dart
index 33021a1..41afedc 100644
--- a/runtime/observatory/tests/service/contexts_test.dart
+++ b/runtime/observatory/tests/service/contexts_test.dart
@@ -58,58 +58,58 @@
 
 var tests = <IsolateTest>[
   (Isolate isolate) async {
-    Library lib = await isolate.rootLibrary.load();
+    Library lib = await isolate.rootLibrary.load() as Library;
     Field field = lib.variables.singleWhere((v) => v.name == 'cleanBlock');
     await field.load();
-    Instance block = await field.staticValue.load();
+    Instance block = await field.staticValue!.load() as Instance;
     expect(block.isClosure, isTrue);
     expect(block.closureContext, isNull);
   },
   (Isolate isolate) async {
-    Library lib = await isolate.rootLibrary.load();
+    Library lib = await isolate.rootLibrary.load() as Library;
     Field field = lib.variables.singleWhere((v) => v.name == 'copyingBlock');
     await field.load();
-    Instance block = await field.staticValue.load();
+    Instance block = await field.staticValue!.load() as Instance;
     expect(block.isClosure, isTrue);
-    expect(block.closureContext.isContext, isTrue);
-    expect(block.closureContext.length, equals(1));
-    Context ctxt = await block.closureContext.load();
-    expect(ctxt.variables.single.value.asValue.isString, isTrue);
-    expect(ctxt.variables.single.value.asValue.valueAsString,
+    expect(block.closureContext!.isContext, isTrue);
+    expect(block.closureContext!.length, equals(1));
+    Context ctxt = await block.closureContext!.load() as Context;
+    expect(ctxt.variables!.single.value.asValue!.isString, isTrue);
+    expect(ctxt.variables!.single.value.asValue!.valueAsString,
         equals('I could be copied into the block'));
     expect(ctxt.parentContext, isNull);
   },
   (Isolate isolate) async {
-    Library lib = await isolate.rootLibrary.load();
+    Library lib = await isolate.rootLibrary.load() as Library;
     Field field = lib.variables.singleWhere((v) => v.name == 'fullBlock');
     await field.load();
-    Instance block = await field.staticValue.load();
+    Instance block = await field.staticValue!.load() as Instance;
     expect(block.isClosure, isTrue);
-    expect(block.closureContext.isContext, isTrue);
-    expect(block.closureContext.length, equals(1));
-    Context ctxt = await block.closureContext.load();
-    expect(ctxt.variables.single.value.asValue.isInt, isTrue);
-    expect(ctxt.variables.single.value.asValue.valueAsString, equals('43'));
+    expect(block.closureContext!.isContext, isTrue);
+    expect(block.closureContext!.length, equals(1));
+    Context ctxt = await block.closureContext!.load() as Context;
+    expect(ctxt.variables!.single.value.asValue!.isInt, isTrue);
+    expect(ctxt.variables!.single.value.asValue!.valueAsString, equals('43'));
     expect(ctxt.parentContext, isNull);
   },
   (Isolate isolate) async {
-    Library lib = await isolate.rootLibrary.load();
+    Library lib = await isolate.rootLibrary.load() as Library;
     Field field =
         lib.variables.singleWhere((v) => v.name == 'fullBlockWithChain');
     await field.load();
-    Instance block = await field.staticValue.load();
+    Instance block = await field.staticValue!.load() as Instance;
     expect(block.isClosure, isTrue);
-    expect(block.closureContext.isContext, isTrue);
-    expect(block.closureContext.length, equals(1));
-    Context ctxt = await block.closureContext.load();
-    expect(ctxt.variables.single.value.asValue.isInt, isTrue);
-    expect(ctxt.variables.single.value.asValue.valueAsString, equals('4201'));
-    expect(ctxt.parentContext.isContext, isTrue);
-    expect(ctxt.parentContext.length, equals(1));
-    Context outerCtxt = await ctxt.parentContext.load();
-    expect(outerCtxt.variables.single.value.asValue.isInt, isTrue);
-    expect(
-        outerCtxt.variables.single.value.asValue.valueAsString, equals('421'));
+    expect(block.closureContext!.isContext, isTrue);
+    expect(block.closureContext!.length, equals(1));
+    Context ctxt = await block.closureContext!.load() as Context;
+    expect(ctxt.variables!.single.value.asValue!.isInt, isTrue);
+    expect(ctxt.variables!.single.value.asValue!.valueAsString, equals('4201'));
+    expect(ctxt.parentContext!.isContext, isTrue);
+    expect(ctxt.parentContext!.length, equals(1));
+    Context outerCtxt = await ctxt.parentContext!.load() as Context;
+    expect(outerCtxt.variables!.single.value.asValue!.isInt, isTrue);
+    expect(outerCtxt.variables!.single.value.asValue!.valueAsString,
+        equals('421'));
     expect(outerCtxt.parentContext, isNull);
   },
 ];
diff --git a/runtime/observatory/tests/service/coverage_const_field_async_closure_test.dart b/runtime/observatory/tests/service/coverage_const_field_async_closure_test.dart
index a85a9c3..957251b 100644
--- a/runtime/observatory/tests/service/coverage_const_field_async_closure_test.dart
+++ b/runtime/observatory/tests/service/coverage_const_field_async_closure_test.dart
@@ -55,7 +55,7 @@
     int match = 0;
     for (var range in ranges) {
       for (int i in range["coverage"]["hits"]) {
-        int line = script.tokenToLine(i);
+        int? line = script.tokenToLine(i);
         if (line == null) {
           throw FormatException('token ${i} was missing source location');
         }
diff --git a/runtime/observatory/tests/service/coverage_leaf_function_test.dart b/runtime/observatory/tests/service/coverage_leaf_function_test.dart
index c36441b..5cd8e12 100644
--- a/runtime/observatory/tests/service/coverage_leaf_function_test.dart
+++ b/runtime/observatory/tests/service/coverage_leaf_function_test.dart
@@ -55,9 +55,9 @@
 
     var params = {
       'reports': ['Coverage'],
-      'scriptId': func.location.script.id,
-      'tokenPos': func.location.tokenPos,
-      'endTokenPos': func.location.endTokenPos,
+      'scriptId': func.location!.script.id,
+      'tokenPos': func.location!.tokenPos,
+      'endTokenPos': func.location!.endTokenPos,
       'forceCompile': true
     };
     var report = await isolate.invokeRpcNoUpgrade('getSourceReport', params);
@@ -96,9 +96,9 @@
 
     var params = {
       'reports': ['Coverage'],
-      'scriptId': func.location.script.id,
-      'tokenPos': func.location.tokenPos,
-      'endTokenPos': func.location.endTokenPos,
+      'scriptId': func.location!.script.id,
+      'tokenPos': func.location!.tokenPos,
+      'endTokenPos': func.location!.endTokenPos,
       'forceCompile': true
     };
     var report = await isolate.invokeRpcNoUpgrade('getSourceReport', params);
diff --git a/runtime/observatory/tests/service/coverage_optimized_function_test.dart b/runtime/observatory/tests/service/coverage_optimized_function_test.dart
index ad57d161..b6c9823 100644
--- a/runtime/observatory/tests/service/coverage_optimized_function_test.dart
+++ b/runtime/observatory/tests/service/coverage_optimized_function_test.dart
@@ -48,9 +48,9 @@
 
     var params = {
       'reports': ['Coverage'],
-      'scriptId': func.location.script.id,
-      'tokenPos': func.location.tokenPos,
-      'endTokenPos': func.location.endTokenPos,
+      'scriptId': func.location!.script.id,
+      'tokenPos': func.location!.tokenPos,
+      'endTokenPos': func.location!.endTokenPos,
       'forceCompile': true
     };
     var report = await isolate.invokeRpcNoUpgrade('getSourceReport', params);
diff --git a/runtime/observatory/tests/service/dds_extension_event_history_test.dart b/runtime/observatory/tests/service/dds_extension_event_history_test.dart
new file mode 100644
index 0000000..0c3d165
--- /dev/null
+++ b/runtime/observatory/tests/service/dds_extension_event_history_test.dart
@@ -0,0 +1,52 @@
+// Copyright (c) 2020, 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:async';
+import 'dart:developer';
+
+import 'package:observatory/service_io.dart';
+import 'package:test/test.dart';
+import 'client_resume_approvals_common.dart';
+import 'service_test_common.dart';
+import 'test_helper.dart';
+
+Future testMain() async {
+  // Post a total of 9 events
+  for (int i = 1; i <= 9; ++i) {
+    postEvent('Test', {
+      'id': i,
+    });
+  }
+}
+
+var tests = <IsolateTest>[
+  isPausedAtStart,
+  resumeIsolate,
+  (Isolate isolate) async {
+    final completer = Completer<void>();
+    int i = 1;
+    await subscribeToStream(isolate.vm, 'Extension', (event) async {
+      expect(event.extensionKind, 'Test');
+      expect(event.extensionData!['id'], i);
+      i++;
+
+      if (i == 10) {
+        await cancelStreamSubscription('Extension');
+        completer.complete();
+      } else if (i > 10) {
+        fail('Too many log messages');
+      }
+    });
+    await completer.future;
+  },
+];
+
+main(args) => runIsolateTests(
+      args,
+      tests,
+      enableService: false, // DDS specific feature
+      testeeConcurrent: testMain,
+      pause_on_start: true,
+      pause_on_exit: true,
+    );
diff --git a/runtime/observatory/tests/service/dds_log_history_size_gigantic_test.dart b/runtime/observatory/tests/service/dds_log_history_size_gigantic_test.dart
index 1bd6136..d8cd47a 100644
--- a/runtime/observatory/tests/service/dds_log_history_size_gigantic_test.dart
+++ b/runtime/observatory/tests/service/dds_log_history_size_gigantic_test.dart
@@ -29,7 +29,7 @@
 Future<int> getLogHistorySize(Isolate isolate) async {
   final result = await isolate.invokeRpcNoUpgrade('getLogHistorySize', {});
   expect(result['type'], 'Size');
-  return result['size'];
+  return result['size'] as int;
 }
 
 var tests = <IsolateTest>[
@@ -59,7 +59,7 @@
     int i = 11;
     await subscribeToStream(isolate.vm, 'Logging', (event) async {
       expect(
-        event.logRecord['message'].valueAsString,
+        event.logRecord!['message'].valueAsString,
         'All work and no play makes Ben a dull boy ($i)',
       );
       i++;
diff --git a/runtime/observatory/tests/service/dds_log_history_size_simple_test.dart b/runtime/observatory/tests/service/dds_log_history_size_simple_test.dart
index 69e0ee2..fc1e0df 100644
--- a/runtime/observatory/tests/service/dds_log_history_size_simple_test.dart
+++ b/runtime/observatory/tests/service/dds_log_history_size_simple_test.dart
@@ -29,7 +29,7 @@
 Future<int> getLogHistorySize(Isolate isolate) async {
   final result = await isolate.invokeRpcNoUpgrade('getLogHistorySize', {});
   expect(result['type'], 'Size');
-  return result['size'];
+  return result['size'] as int;
 }
 
 var tests = <IsolateTest>[
@@ -45,7 +45,7 @@
 
     int i = 1;
     await subscribeToStream(isolate.vm, 'Logging', (event) async {
-      expect(event.logRecord['message'].valueAsString, 'log$i');
+      expect(event.logRecord!['message'].valueAsString, 'log$i');
       i++;
 
       if (i == 10) {
@@ -69,11 +69,11 @@
 
     // Create a new client as we want to get log messages from the entire
     // history buffer.
-    final client = await createClient(isolate.vm);
+    final client = await createClient(isolate.vm as WebSocketVM);
 
     int i = 6;
     await subscribeToStream(client, 'Logging', (event) async {
-      expect(event.logRecord['message'].valueAsString, 'log$i');
+      expect(event.logRecord!['message'].valueAsString, 'log$i');
       i++;
 
       if (i == 11) {
@@ -84,7 +84,7 @@
       }
     });
     await completer.future;
-    await client.disconnect();
+    client.disconnect();
   },
 ];
 
diff --git a/runtime/observatory/tests/service/dds_log_history_size_test.dart b/runtime/observatory/tests/service/dds_log_history_size_test.dart
index 98cc6e3..5186f1e 100644
--- a/runtime/observatory/tests/service/dds_log_history_size_test.dart
+++ b/runtime/observatory/tests/service/dds_log_history_size_test.dart
@@ -33,7 +33,7 @@
 Future<int> getLogHistorySize(Isolate isolate) async {
   final result = await isolate.invokeRpcNoUpgrade('getLogHistorySize', {});
   expect(result['type'], 'Size');
-  return result['size'];
+  return result['size'] as int;
 }
 
 var tests = <IsolateTest>[
@@ -59,7 +59,7 @@
     // With the log history set to 20, the first log message should be 'log11'
     int i = 11;
     await subscribeToStream(isolate.vm, 'Logging', (event) async {
-      expect(event.logRecord['message'].valueAsString, 'log$i');
+      expect(event.logRecord!['message'].valueAsString, 'log$i');
       i++;
 
       if (i == 30) {
diff --git a/runtime/observatory/tests/service/dds_stdout_stderr_history_test.dart b/runtime/observatory/tests/service/dds_stdout_stderr_history_test.dart
new file mode 100644
index 0000000..c0d6ba5
--- /dev/null
+++ b/runtime/observatory/tests/service/dds_stdout_stderr_history_test.dart
@@ -0,0 +1,61 @@
+// Copyright (c) 2020, 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:async';
+import 'dart:io';
+
+import 'package:observatory/service_io.dart';
+import 'package:test/test.dart';
+import 'client_resume_approvals_common.dart';
+import 'service_test_common.dart';
+import 'test_helper.dart';
+
+Future testMain() async {
+  // Log a total of 9 messages
+  for (int i = 1; i <= 9; ++i) {
+    print('Stdout log$i');
+    stderr.writeln('Stderr log$i');
+  }
+}
+
+Future streamHistoryTest(Isolate isolate, String stream) async {
+  final completer = Completer<void>();
+  int i = 1;
+  await subscribeToStream(isolate.vm, stream, (event) async {
+    // Newlines are sent as separate events for some reason. Ignore them.
+    if (!event.bytesAsString!.startsWith(stream)) {
+      return;
+    }
+    expect(event.bytesAsString, '$stream log$i');
+    i++;
+
+    if (i == 10) {
+      await cancelStreamSubscription(stream);
+      completer.complete();
+    } else if (i > 10) {
+      fail('Too many log messages');
+    }
+  });
+  await completer.future;
+}
+
+var tests = <IsolateTest>[
+  isPausedAtStart,
+  resumeIsolate,
+  (Isolate isolate) async {
+    await streamHistoryTest(isolate, 'Stdout');
+  },
+  (Isolate isolate) async {
+    await streamHistoryTest(isolate, 'Stderr');
+  },
+];
+
+main(args) => runIsolateTests(
+      args,
+      tests,
+      enableService: false, // DDS specific feature
+      testeeConcurrent: testMain,
+      pause_on_start: true,
+      pause_on_exit: true,
+    );
diff --git a/runtime/observatory/tests/service/debugger_inspect_test.dart b/runtime/observatory/tests/service/debugger_inspect_test.dart
index 1501b32..77dc387 100644
--- a/runtime/observatory/tests/service/debugger_inspect_test.dart
+++ b/runtime/observatory/tests/service/debugger_inspect_test.dart
@@ -24,7 +24,7 @@
     var subscription;
     subscription = stream.listen((ServiceEvent event) {
       if (event.kind == ServiceEvent.kInspect) {
-        expect(event.inspectee.clazz.name, equals('Point'));
+        expect(event.inspectee!.clazz!.name, equals('Point'));
         subscription.cancel();
         completer.complete();
       }
diff --git a/runtime/observatory/tests/service/debugger_location_second_test.dart b/runtime/observatory/tests/service/debugger_location_second_test.dart
index e8d6739..ba9420d 100644
--- a/runtime/observatory/tests/service/debugger_location_second_test.dart
+++ b/runtime/observatory/tests/service/debugger_location_second_test.dart
@@ -41,7 +41,7 @@
   void method() {}
   void madness() {}
 
-  int field;
+  int? field;
 }
 
 class DebuggerLocationTestBar {}
diff --git a/runtime/observatory/tests/service/debugger_location_test.dart b/runtime/observatory/tests/service/debugger_location_test.dart
index 77b939c..fe66893 100644
--- a/runtime/observatory/tests/service/debugger_location_test.dart
+++ b/runtime/observatory/tests/service/debugger_location_test.dart
@@ -41,7 +41,7 @@
   void method() {}
   void madness() {}
 
-  int field;
+  late int field;
 }
 
 class DebuggerLocationTestBar {}
diff --git a/runtime/observatory/tests/service/debugging_inlined_finally_test.dart b/runtime/observatory/tests/service/debugging_inlined_finally_test.dart
index 9012cf3..e2e1bbb 100644
--- a/runtime/observatory/tests/service/debugging_inlined_finally_test.dart
+++ b/runtime/observatory/tests/service/debugging_inlined_finally_test.dart
@@ -51,8 +51,8 @@
       expect(result is Breakpoint, isTrue);
       Breakpoint bpt = result;
       expect(bpt.type, equals('Breakpoint'));
-      expect(bpt.location.script.id, equals(script.id));
-      expect(bpt.location.script.tokenToLine(bpt.location.tokenPos),
+      expect(bpt.location!.script.id, equals(script.id));
+      expect(bpt.location!.script.tokenToLine(bpt.location!.tokenPos),
           equals(LINE_A));
       expect(isolate.breakpoints.length, equals(1));
     }
@@ -62,8 +62,8 @@
       expect(result is Breakpoint, isTrue);
       Breakpoint bpt = result;
       expect(bpt.type, equals('Breakpoint'));
-      expect(bpt.location.script.id, equals(script.id));
-      expect(bpt.location.script.tokenToLine(bpt.location.tokenPos),
+      expect(bpt.location!.script.id, equals(script.id));
+      expect(bpt.location!.script.tokenToLine(bpt.location!.tokenPos),
           equals(LINE_B));
       expect(isolate.breakpoints.length, equals(2));
     }
@@ -73,8 +73,8 @@
       expect(result is Breakpoint, isTrue);
       Breakpoint bpt = result;
       expect(bpt.type, equals('Breakpoint'));
-      expect(bpt.location.script.id, equals(script.id));
-      expect(bpt.location.script.tokenToLine(bpt.location.tokenPos),
+      expect(bpt.location!.script.id, equals(script.id));
+      expect(bpt.location!.script.tokenToLine(bpt.location!.tokenPos),
           equals(LINE_C));
       expect(isolate.breakpoints.length, equals(3));
     }
diff --git a/runtime/observatory/tests/service/debugging_test.dart b/runtime/observatory/tests/service/debugging_test.dart
index 55a6e05..5d4b630 100644
--- a/runtime/observatory/tests/service/debugging_test.dart
+++ b/runtime/observatory/tests/service/debugging_test.dart
@@ -55,7 +55,7 @@
 
 // Add breakpoint
   (Isolate isolate) async {
-    await isolate.rootLibrary.load();
+    await isolate.rootLibrary.load() as Library;
 
     // Set up a listener to wait for breakpoint events.
     Completer completer = new Completer();
@@ -77,8 +77,9 @@
     expect(result is Breakpoint, isTrue);
     Breakpoint bpt = result;
     expect(bpt.type, equals('Breakpoint'));
-    expect(bpt.location.script.id, equals(script.id));
-    expect(bpt.location.script.tokenToLine(bpt.location.tokenPos), equals(15));
+    expect(bpt.location!.script.id, equals(script.id));
+    expect(
+        bpt.location!.script.tokenToLine(bpt.location!.tokenPos), equals(15));
     expect(isolate.breakpoints.length, equals(1));
 
     await completer.future; // Wait for breakpoint events.
@@ -186,8 +187,9 @@
     expect(result is Breakpoint, isTrue);
     Breakpoint bpt = result;
     expect(bpt.type, equals('Breakpoint'));
-    expect(bpt.location.script.name, equals('debugging_test.dart'));
-    expect(bpt.location.script.tokenToLine(bpt.location.tokenPos), equals(12));
+    expect(bpt.location!.script.name, equals('debugging_test.dart'));
+    expect(
+        bpt.location!.script.tokenToLine(bpt.location!.tokenPos), equals(12));
     expect(isolate.breakpoints.length, equals(1));
 
     await completer.future; // Wait for breakpoint events.
diff --git a/runtime/observatory/tests/service/dev_fs_test.dart b/runtime/observatory/tests/service/dev_fs_test.dart
index cf4ca71..159c499 100644
--- a/runtime/observatory/tests/service/dev_fs_test.dart
+++ b/runtime/observatory/tests/service/dev_fs_test.dart
@@ -23,7 +23,7 @@
     expect(result['type'], equals('FileSystemList'));
     expect(result['fsNames'].toString(), equals('[alpha]'));
 
-    bool caughtException;
+    bool caughtException = false;
     try {
       await vm.invokeRpcNoUpgrade('_createDevFS', params);
       expect(false, isTrue, reason: 'Unreachable');
diff --git a/runtime/observatory/tests/service/developer_extension_test.dart b/runtime/observatory/tests/service/developer_extension_test.dart
index c5226de..9b18926 100644
--- a/runtime/observatory/tests/service/developer_extension_test.dart
+++ b/runtime/observatory/tests/service/developer_extension_test.dart
@@ -16,7 +16,7 @@
   print('Invoked extension: $method');
   switch (method) {
     case 'ext..delay':
-      Completer c = new Completer<ServiceExtensionResponse>();
+      var c = new Completer<ServiceExtensionResponse>();
       new Timer(new Duration(seconds: 1), () {
         c.complete(new ServiceExtensionResponse.result(jsonEncode({
           'type': '_delayedType',
@@ -39,6 +39,7 @@
         'parameters': paremeters,
       })));
   }
+  throw "Unknown extension: $method";
 }
 
 void test() {
@@ -74,7 +75,7 @@
     expect(event.kind, equals(ServiceEvent.kExtension));
     expect(event.extensionKind, equals('ALPHA'));
     expect(event.extensionData, isA<Map>());
-    expect(event.extensionData['cat'], equals('dog'));
+    expect(event.extensionData!['cat'], equals('dog'));
   }),
   hasStoppedAtBreakpoint,
   resumeIsolateAndAwaitEvent(VM.kIsolateStream, (ServiceEvent event) {
diff --git a/runtime/observatory/tests/service/developer_server_control_test.dart b/runtime/observatory/tests/service/developer_server_control_test.dart
index 03aa74a..f599dc3 100644
--- a/runtime/observatory/tests/service/developer_server_control_test.dart
+++ b/runtime/observatory/tests/service/developer_server_control_test.dart
@@ -8,9 +8,9 @@
 import 'package:observatory/service_io.dart' as S;
 import 'test_helper.dart';
 
-int majorVersion;
-int minorVersion;
-Uri serverUri;
+int? majorVersion;
+int? minorVersion;
+Uri? serverUri;
 
 Future<Null> testeeBefore() async {
   print('testee before');
diff --git a/runtime/observatory/tests/service/developer_service_get_isolate_id_test.dart b/runtime/observatory/tests/service/developer_service_get_isolate_id_test.dart
index 1539e07..11b61da 100644
--- a/runtime/observatory/tests/service/developer_service_get_isolate_id_test.dart
+++ b/runtime/observatory/tests/service/developer_service_get_isolate_id_test.dart
@@ -12,9 +12,9 @@
 import 'test_helper.dart';
 
 // testee state.
-String selfId;
-Core.Isolate childIsolate;
-String childId;
+late String selfId;
+late Core.Isolate childIsolate;
+late String childId;
 
 void spawnEntry(int i) {
   dev.debugger();
@@ -26,8 +26,8 @@
   childIsolate = await Core.Isolate.spawn(spawnEntry, 0);
   // Assign the id for this isolate and it's child to strings so they can
   // be read by the tester.
-  selfId = dev.Service.getIsolateID(Core.Isolate.current);
-  childId = dev.Service.getIsolateID(childIsolate);
+  selfId = dev.Service.getIsolateID(Core.Isolate.current)!;
+  childId = dev.Service.getIsolateID(childIsolate)!;
   dev.debugger();
 }
 
@@ -38,8 +38,8 @@
 getChildId() => childId;
 
 // tester state:
-Service.Isolate initialIsolate;
-Service.Isolate localChildIsolate;
+late Service.Isolate initialIsolate;
+late Service.Isolate localChildIsolate;
 
 var tests = <VMTest>[
   (Service.VM vm) async {
@@ -67,11 +67,12 @@
     await initialIsolate.reload();
 
     // Grab the root library.
-    Service.Library rootLbirary = await initialIsolate.rootLibrary.load();
+    Service.Library rootLbirary =
+        await initialIsolate.rootLibrary.load() as Service.Library;
 
     // Grab self id.
-    Service.Instance localSelfId =
-        await initialIsolate.invoke(rootLbirary, 'getSelfId');
+    Service.Instance localSelfId = await initialIsolate.invoke(
+        rootLbirary, 'getSelfId') as Service.Instance;
 
     // Check that the id reported from dart:developer matches the id reported
     // from the service protocol.
@@ -79,8 +80,8 @@
     expect(initialIsolate.id, equals(localSelfId.valueAsString));
 
     // Grab the child isolate's id.
-    Service.Instance localChildId =
-        await initialIsolate.invoke(rootLbirary, 'getChildId');
+    Service.Instance localChildId = await initialIsolate.invoke(
+        rootLbirary, 'getChildId') as Service.Instance;
 
     // Check that the id reported from dart:developer matches the id reported
     // from the service protocol.
diff --git a/runtime/observatory/tests/service/echo_test.dart b/runtime/observatory/tests/service/echo_test.dart
index 49ebe73..13c8130 100644
--- a/runtime/observatory/tests/service/echo_test.dart
+++ b/runtime/observatory/tests/service/echo_test.dart
@@ -24,10 +24,10 @@
     var subscription;
     subscription = stream.listen((ServiceEvent event) {
       assert(event.kind == '_Echo');
-      expect(event.data.lengthInBytes, equals(3));
-      expect(event.data[0], equals(0));
-      expect(event.data[1], equals(128));
-      expect(event.data[2], equals(255));
+      expect(event.data!.lengthInBytes, equals(3));
+      expect(event.data![0], equals(0));
+      expect(event.data![1], equals(128));
+      expect(event.data![2], equals(255));
       subscription.cancel();
       completer.complete();
     });
diff --git a/runtime/observatory/tests/service/enable_service_port_fallback_test.dart b/runtime/observatory/tests/service/enable_service_port_fallback_test.dart
index ea63b8b..ab8d23e 100644
--- a/runtime/observatory/tests/service/enable_service_port_fallback_test.dart
+++ b/runtime/observatory/tests/service/enable_service_port_fallback_test.dart
@@ -18,7 +18,7 @@
   }
 ];
 
-ServerSocket socket;
+late ServerSocket socket;
 int portNumber = -1;
 
 main(args) async {
diff --git a/runtime/observatory/tests/service/eval_internal_class_test.dart b/runtime/observatory/tests/service/eval_internal_class_test.dart
index 98b5840..7c01361 100644
--- a/runtime/observatory/tests/service/eval_internal_class_test.dart
+++ b/runtime/observatory/tests/service/eval_internal_class_test.dart
@@ -8,9 +8,9 @@
 
 var tests = <IsolateTest>[
   (Isolate isolate) async {
-    Library root = await isolate.rootLibrary.load();
+    Library root = await isolate.rootLibrary.load() as Library;
 
-    Class classLibrary = await root.clazz.load();
+    Class classLibrary = await root.clazz!.load() as Class;
     print(classLibrary);
     {
       bool caughtExceptions = false;
@@ -24,7 +24,7 @@
       expect(caughtExceptions, isTrue);
     }
 
-    Class classClass = await classLibrary.clazz.load();
+    Class classClass = await classLibrary.clazz!.load() as Class;
     print(classClass);
     {
       bool caughtExceptions = false;
@@ -38,10 +38,11 @@
       expect(caughtExceptions, isTrue);
     }
 
-    Instance someArray = await root.evaluate("new List(2)");
+    Instance someArray =
+        await root.evaluate("new List<dynamic>.filled(2, null)") as Instance;
     print(someArray);
     expect(someArray is Instance, isTrue);
-    Class classArray = await someArray.clazz.load();
+    Class classArray = await someArray.clazz!.load() as Class;
     print(classArray);
     dynamic result = await classArray.evaluate('3 + 4');
     print(result);
diff --git a/runtime/observatory/tests/service/eval_regression_flutter20255_test.dart b/runtime/observatory/tests/service/eval_regression_flutter20255_test.dart
index 28f07d7..0762ae3 100644
--- a/runtime/observatory/tests/service/eval_regression_flutter20255_test.dart
+++ b/runtime/observatory/tests/service/eval_regression_flutter20255_test.dart
@@ -36,7 +36,7 @@
 }
 
 class Box<T> {
-  T value;
+  late T value;
 
   @pragma('vm:never-inline')
   void setValue(T value) {
diff --git a/runtime/observatory/tests/service/evaluate_activation_in_method_class_other.dart b/runtime/observatory/tests/service/evaluate_activation_in_method_class_other.dart
index bf070a1..000ba5e 100644
--- a/runtime/observatory/tests/service/evaluate_activation_in_method_class_other.dart
+++ b/runtime/observatory/tests/service/evaluate_activation_in_method_class_other.dart
@@ -6,22 +6,22 @@
 
 var topLevel = "OtherLibrary";
 
-class Superclass {
-  var _instVar = 'Superclass';
-  var instVar = 'Superclass';
-  method() => 'Superclass';
-  static staticMethod() => 'Superclass';
+class Superclass2 {
+  var _instVar = 'Superclass2';
+  var instVar = 'Superclass2';
+  method() => 'Superclass2';
+  static staticMethod() => 'Superclass2';
   suppress_warning() => _instVar;
 }
 
-class Klass extends Superclass {
-  var _instVar = 'Klass';
-  var instVar = 'Klass';
-  method() => 'Klass';
-  static staticMethod() => 'Klass';
+class Superclass1 extends Superclass2 {
+  var _instVar = 'Superclass1';
+  var instVar = 'Superclass1';
+  method() => 'Superclass1';
+  static staticMethod() => 'Superclass1';
 
   test() {
-    var _local = 'Klass';
+    var _local = 'Superclass1';
     debugger();
     // Suppress unused variable warning.
     print(_local);
diff --git a/runtime/observatory/tests/service/evaluate_activation_in_method_class_test.dart b/runtime/observatory/tests/service/evaluate_activation_in_method_class_test.dart
index e1a78c4..b16d24e 100644
--- a/runtime/observatory/tests/service/evaluate_activation_in_method_class_test.dart
+++ b/runtime/observatory/tests/service/evaluate_activation_in_method_class_test.dart
@@ -15,7 +15,7 @@
 
 var topLevel = "TestLibrary";
 
-class Subclass extends Superclass with Klass {
+class Subclass extends Superclass1 {
   var _instVar = 'Subclass';
   var instVar = 'Subclass';
   method() => 'Subclass';
@@ -36,47 +36,47 @@
   var topFrame = 0;
   expect(stack.type, equals('Stack'));
   expect(stack['frames'][topFrame].function.name, equals('test'));
-  expect(stack['frames'][topFrame].function.dartOwner.name,
-      equals('Superclass&Klass'));
+  expect(
+      stack['frames'][topFrame].function.dartOwner.name, equals('Superclass1'));
 
   Instance result;
 
-  result = await isolate.evalFrame(topFrame, '_local');
+  result = await isolate.evalFrame(topFrame, '_local') as Instance;
   print(result);
-  expect(result.valueAsString, equals('Klass'));
+  expect(result.valueAsString, equals('Superclass1'));
 
-  result = await isolate.evalFrame(topFrame, '_instVar');
+  result = await isolate.evalFrame(topFrame, '_instVar') as Instance;
   print(result);
-  expect(result.valueAsString, equals('Klass'));
+  expect(result.valueAsString, equals('Superclass1'));
 
-  result = await isolate.evalFrame(topFrame, 'instVar');
+  result = await isolate.evalFrame(topFrame, 'instVar') as Instance;
   print(result);
   expect(result.valueAsString, equals('Subclass'));
 
-  result = await isolate.evalFrame(topFrame, 'method()');
+  result = await isolate.evalFrame(topFrame, 'method()') as Instance;
   print(result);
   expect(result.valueAsString, equals('Subclass'));
 
-  result = await isolate.evalFrame(topFrame, 'super._instVar');
+  result = await isolate.evalFrame(topFrame, 'super._instVar') as Instance;
   print(result);
-  expect(result.valueAsString, equals('Superclass'));
+  expect(result.valueAsString, equals('Superclass2'));
 
-  result = await isolate.evalFrame(topFrame, 'super.instVar');
+  result = await isolate.evalFrame(topFrame, 'super.instVar') as Instance;
   print(result);
-  expect(result.valueAsString, equals('Superclass'));
+  expect(result.valueAsString, equals('Superclass2'));
 
-  result = await isolate.evalFrame(topFrame, 'super.method()');
+  result = await isolate.evalFrame(topFrame, 'super.method()') as Instance;
   print(result);
-  expect(result.valueAsString, equals('Superclass'));
+  expect(result.valueAsString, equals('Superclass2'));
 
-  result = await isolate.evalFrame(topFrame, 'staticMethod()');
+  result = await isolate.evalFrame(topFrame, 'staticMethod()') as Instance;
   print(result);
-  expect(result.valueAsString, equals('Klass'));
+  expect(result.valueAsString, equals('Superclass1'));
 
   // function.Owner verus function.Origin
   // The mixin of Superclass is in _other.dart and the mixin
   // application is in _test.dart.
-  result = await isolate.evalFrame(topFrame, 'topLevel');
+  result = await isolate.evalFrame(topFrame, 'topLevel') as Instance;
   print(result);
   expect(result.valueAsString, equals('OtherLibrary'));
 }
diff --git a/runtime/observatory/tests/service/evaluate_activation_test.dart b/runtime/observatory/tests/service/evaluate_activation_test.dart
index 059d769..bf65d96 100644
--- a/runtime/observatory/tests/service/evaluate_activation_test.dart
+++ b/runtime/observatory/tests/service/evaluate_activation_test.dart
@@ -70,7 +70,7 @@
 Future testMethod(Isolate isolate) async {
   // silence analyzer.
   expect(math.sqrt(4), equals(2));
-  Library rootLib = await isolate.rootLibrary.load();
+  Library rootLib = await isolate.rootLibrary.load() as Library;
   ServiceFunction function =
       rootLib.functions.singleWhere((f) => f.name == 'breakHere');
   Breakpoint bpt = await isolate.addBreakpointAtEntry(function);
@@ -83,7 +83,7 @@
   sub = stream.listen((ServiceEvent event) async {
     print("Event $event");
     if (event.kind == ServiceEvent.kPauseBreakpoint) {
-      var frameNumber = 1, r;
+      dynamic frameNumber = 1, r;
       r = await isolate.evalFrame(frameNumber, '123');  /// instance: ok
       expect(r.valueAsString, equals('123'));  /// instance: continued
       r = await isolate.evalFrame(frameNumber, 'this');  /// scope: ok
@@ -119,7 +119,7 @@
 }
 
 Future testMethod2(Isolate isolate) async {
-  Library rootLib = await isolate.rootLibrary.load();
+  Library rootLib = await isolate.rootLibrary.load() as Library;
   ServiceFunction function =
       rootLib.functions.singleWhere((f) => f.name == 'breakHere');
   Breakpoint bpt = await isolate.addBreakpointAtEntry(function);
@@ -132,7 +132,7 @@
   sub = stream.listen((ServiceEvent event) async {
     print("Event $event");
     if (event.kind == ServiceEvent.kPauseBreakpoint) {
-      var frameNumber = 1, r;
+      dynamic frameNumber = 1, r;
       r = await isolate.evalFrame(frameNumber, '123');
       expect(r.valueAsString, equals('123'));
       r = await isolate.evalFrame(frameNumber, 'this');
@@ -168,7 +168,7 @@
 }
 
 Future testMethod3(Isolate isolate) async {
-  Library rootLib = await isolate.rootLibrary.load();
+  Library rootLib = await isolate.rootLibrary.load() as Library;
   ServiceFunction function =
       rootLib.functions.singleWhere((f) => f.name == 'breakHere');
   Breakpoint bpt = await isolate.addBreakpointAtEntry(function);
@@ -181,7 +181,7 @@
   sub = stream.listen((ServiceEvent event) async {
     print("Event $event");
     if (event.kind == ServiceEvent.kPauseBreakpoint) {
-      var frameNumber = 1, r;
+      dynamic frameNumber = 1, r;
       r = await isolate.evalFrame(frameNumber, '123');
       expect(r.valueAsString, equals('123'));
       r = await isolate.evalFrame(frameNumber, 'this');
@@ -210,7 +210,7 @@
 
 
 Future testMethod4(Isolate isolate) async {
-  Library rootLib = await isolate.rootLibrary.load();
+  Library rootLib = await isolate.rootLibrary.load() as Library;
   ServiceFunction function =
       rootLib.functions.singleWhere((f) => f.name == 'breakHere');
   Breakpoint bpt = await isolate.addBreakpointAtEntry(function);
@@ -223,7 +223,7 @@
   sub = stream.listen((ServiceEvent event) async {
     print("Event $event");
     if (event.kind == ServiceEvent.kPauseBreakpoint) {
-      var frameNumber = 1, r;
+      dynamic frameNumber = 1, r;
       r = await isolate.evalFrame(frameNumber, '123');  /// instance: continued
       expect(r.valueAsString, equals('123'));  /// instance: continued
       r = await isolate.evalFrame(frameNumber, 'this');  /// scope: continued
diff --git a/runtime/observatory/tests/service/evaluate_async_closure_test.dart b/runtime/observatory/tests/service/evaluate_async_closure_test.dart
index 4b64e63..182ee3d 100644
--- a/runtime/observatory/tests/service/evaluate_async_closure_test.dart
+++ b/runtime/observatory/tests/service/evaluate_async_closure_test.dart
@@ -18,7 +18,7 @@
         "  var w = () async { return await k(); }; "
         "  return w(); "
         "}()";
-    Library lib = await isolate.rootLibrary.load();
+    Library lib = await isolate.rootLibrary.load() as Library;
 
     var result = await lib.evaluate(test);
     expect("$result", equals("Instance(a _Future)"));
diff --git a/runtime/observatory/tests/service/evaluate_class_type_parameters_test.dart b/runtime/observatory/tests/service/evaluate_class_type_parameters_test.dart
index 48b6530..38b34fc 100644
--- a/runtime/observatory/tests/service/evaluate_class_type_parameters_test.dart
+++ b/runtime/observatory/tests/service/evaluate_class_type_parameters_test.dart
@@ -35,7 +35,7 @@
     expect(stack.type, equals('Stack'));
     expect(await stack['frames'][topFrame].location.getLine(), 20);
 
-    Instance result = await isolate.evalFrame(topFrame, '"\$S"');
+    Instance result = await isolate.evalFrame(topFrame, '"\$S"') as Instance;
     print(result);
     expect(result.valueAsString, equals("String"));
   },
@@ -48,7 +48,7 @@
     expect(stack.type, equals('Stack'));
     expect(await stack['frames'][topFrame].location.getLine(), 14);
 
-    Instance result = await isolate.evalFrame(topFrame, '"\$T"');
+    Instance result = await isolate.evalFrame(topFrame, '"\$T"') as Instance;
     print(result);
     expect(result.valueAsString, equals("int"));
   },
diff --git a/runtime/observatory/tests/service/evaluate_function_type_parameters_test.dart b/runtime/observatory/tests/service/evaluate_function_type_parameters_test.dart
index 1f8fcd0..1eb0f4f 100644
--- a/runtime/observatory/tests/service/evaluate_function_type_parameters_test.dart
+++ b/runtime/observatory/tests/service/evaluate_function_type_parameters_test.dart
@@ -49,7 +49,8 @@
     expect(stack.type, equals('Stack'));
     expect(await stack['frames'][topFrame].location.getLine(), 14);
 
-    Instance result = await isolate.evalFrame(topFrame, "S.toString()");
+    Instance result =
+        await isolate.evalFrame(topFrame, "S.toString()") as Instance;
     print(result);
     expect(result.valueAsString, equals("String"));
   },
@@ -62,27 +63,30 @@
     expect(stack.type, equals('Stack'));
     expect(await stack['frames'][topFrame].location.getLine(), 16);
 
-    Instance result = await isolate.evalFrame(topFrame, "TBool.toString()");
+    Instance result =
+        await isolate.evalFrame(topFrame, "TBool.toString()") as Instance;
     print(result);
     expect(result.valueAsString, equals("bool"));
 
-    result = await isolate.evalFrame(topFrame, "TString.toString()");
+    result =
+        await isolate.evalFrame(topFrame, "TString.toString()") as Instance;
     print(result);
     expect(result.valueAsString, equals("String"));
 
-    result = await isolate.evalFrame(topFrame, "TDouble.toString()");
+    result =
+        await isolate.evalFrame(topFrame, "TDouble.toString()") as Instance;
     print(result);
     expect(result.valueAsString, equals("double"));
 
-    result = await isolate.evalFrame(topFrame, "TInt.toString()");
+    result = await isolate.evalFrame(topFrame, "TInt.toString()") as Instance;
     print(result);
     expect(result.valueAsString, equals("int"));
 
-    result = await isolate.evalFrame(topFrame, "S.toString()");
+    result = await isolate.evalFrame(topFrame, "S.toString()") as Instance;
     print(result);
     expect(result.valueAsString, equals("String"));
 
-    result = await isolate.evalFrame(topFrame, "x");
+    result = await isolate.evalFrame(topFrame, "x") as Instance;
     print(result);
     expect(result.valueAsString, equals("3"));
   },
@@ -95,7 +99,8 @@
     expect(stack.type, equals('Stack'));
     expect(await stack['frames'][topFrame].location.getLine(), 22);
 
-    Instance result = await isolate.evalFrame(topFrame, "S.toString()");
+    Instance result =
+        await isolate.evalFrame(topFrame, "S.toString()") as Instance;
     print(result);
     expect(result.valueAsString, equals("String"));
   },
@@ -108,11 +113,12 @@
     expect(stack.type, equals('Stack'));
     expect(await stack['frames'][topFrame].location.getLine(), 30);
 
-    Instance result = await isolate.evalFrame(topFrame, "T.toString()");
+    Instance result =
+        await isolate.evalFrame(topFrame, "T.toString()") as Instance;
     print(result);
     expect(result.valueAsString, equals("int"));
 
-    result = await isolate.evalFrame(topFrame, "S.toString()");
+    result = await isolate.evalFrame(topFrame, "S.toString()") as Instance;
     print(result);
     expect(result.valueAsString, equals("bool"));
   },
@@ -125,10 +131,11 @@
     expect(stack.type, equals('Stack'));
     expect(await stack['frames'][topFrame].location.getLine(), 34);
 
-    Instance result = await isolate.evalFrame(topFrame, "T.toString()");
+    Instance result =
+        await isolate.evalFrame(topFrame, "T.toString()") as Instance;
     print(result);
     expect(result.valueAsString, equals("dynamic"));
-    result = await isolate.evalFrame(topFrame, "t");
+    result = await isolate.evalFrame(topFrame, "t") as Instance;
     print(result);
     expect(result.valueAsString, equals("42"));
   },
diff --git a/runtime/observatory/tests/service/evaluate_in_async_activation_test.dart b/runtime/observatory/tests/service/evaluate_in_async_activation_test.dart
index 6607b89..1c41188 100644
--- a/runtime/observatory/tests/service/evaluate_in_async_activation_test.dart
+++ b/runtime/observatory/tests/service/evaluate_in_async_activation_test.dart
@@ -27,7 +27,7 @@
     expect(stack.type, equals('Stack'));
     expect(await stack['frames'][topFrame].location.getLine(), 16);
 
-    Instance result = await isolate.evalFrame(topFrame, "x");
+    Instance result = await isolate.evalFrame(topFrame, "x") as Instance;
     print(result);
     expect(result.valueAsString, equals("3"));
   },
@@ -40,7 +40,7 @@
     expect(stack.type, equals('Stack'));
     expect(await stack['frames'][topFrame].location.getLine(), 18);
 
-    Instance result = await isolate.evalFrame(topFrame, "z");
+    Instance result = await isolate.evalFrame(topFrame, "z") as Instance;
     print(result);
     expect(result.valueAsString, equals("7"));
   },
diff --git a/runtime/observatory/tests/service/evaluate_in_async_star_activation_test.dart b/runtime/observatory/tests/service/evaluate_in_async_star_activation_test.dart
index 4d6771a..67b7fd1 100644
--- a/runtime/observatory/tests/service/evaluate_in_async_star_activation_test.dart
+++ b/runtime/observatory/tests/service/evaluate_in_async_star_activation_test.dart
@@ -31,7 +31,7 @@
     expect(stack.type, equals('Stack'));
     expect(await stack['frames'][topFrame].location.getLine(), 15);
 
-    Instance result = await isolate.evalFrame(topFrame, "x");
+    Instance result = await isolate.evalFrame(topFrame, "x") as Instance;
     print(result);
     expect(result.valueAsString, equals("3"));
   },
@@ -44,7 +44,7 @@
     expect(stack.type, equals('Stack'));
     expect(await stack['frames'][topFrame].location.getLine(), 18);
 
-    Instance result = await isolate.evalFrame(topFrame, "z");
+    Instance result = await isolate.evalFrame(topFrame, "z") as Instance;
     print(result);
     expect(result.valueAsString, equals("7"));
   },
diff --git a/runtime/observatory/tests/service/evaluate_in_frame_rpc_test.dart b/runtime/observatory/tests/service/evaluate_in_frame_rpc_test.dart
index 2e47197..97df789 100644
--- a/runtime/observatory/tests/service/evaluate_in_frame_rpc_test.dart
+++ b/runtime/observatory/tests/service/evaluate_in_frame_rpc_test.dart
@@ -26,17 +26,17 @@
 
 // Evaluate against library, class, and instance.
   (Isolate isolate) async {
-    var result;
-    result = await isolate.evalFrame(0, 'value');
+    Instance result;
+    result = await isolate.evalFrame(0, 'value') as Instance;
     expect(result.valueAsString, equals('10000'));
 
-    result = await isolate.evalFrame(0, '_');
+    result = await isolate.evalFrame(0, '_') as Instance;
     expect(result.valueAsString, equals('50'));
 
-    result = await isolate.evalFrame(0, 'value + _');
+    result = await isolate.evalFrame(0, 'value + _') as Instance;
     expect(result.valueAsString, equals('10050'));
 
-    result = await isolate.evalFrame(1, 'i');
+    result = await isolate.evalFrame(1, 'i') as Instance;
     expect(result.valueAsString, equals('100000000'));
   },
 ];
diff --git a/runtime/observatory/tests/service/evaluate_in_frame_with_scope_test.dart b/runtime/observatory/tests/service/evaluate_in_frame_with_scope_test.dart
index 8eb463a..7a216cb 100644
--- a/runtime/observatory/tests/service/evaluate_in_frame_with_scope_test.dart
+++ b/runtime/observatory/tests/service/evaluate_in_frame_with_scope_test.dart
@@ -34,14 +34,16 @@
     expect(stack['frames'].length, greaterThanOrEqualTo(1));
     expect(stack['frames'][0].function.name, equals('foo'));
 
-    Library lib = await isolate.rootLibrary.load();
-    Field thing1Field =
-        await lib.variables.singleWhere((v) => v.name == "thing1").load();
-    var thing1 = thing1Field.staticValue;
+    Library lib = await isolate.rootLibrary.load() as Library;
+    Field thing1Field = await lib.variables
+        .singleWhere((v) => v.name == "thing1")
+        .load() as Field;
+    var thing1 = thing1Field.staticValue!;
     print(thing1);
-    Field thing2Field =
-        await lib.variables.singleWhere((v) => v.name == "thing2").load();
-    var thing2 = thing2Field.staticValue;
+    Field thing2Field = await lib.variables
+        .singleWhere((v) => v.name == "thing2")
+        .load() as Field;
+    var thing2 = thing2Field.staticValue!;
     print(thing2);
 
     ServiceObject result = await isolate.evalFrame(0, "x + y + a + b",
diff --git a/runtime/observatory/tests/service/evaluate_in_sync_star_activation_test.dart b/runtime/observatory/tests/service/evaluate_in_sync_star_activation_test.dart
index bbaf78f..ade6955 100644
--- a/runtime/observatory/tests/service/evaluate_in_sync_star_activation_test.dart
+++ b/runtime/observatory/tests/service/evaluate_in_sync_star_activation_test.dart
@@ -31,7 +31,7 @@
     expect(stack.type, equals('Stack'));
     expect(await stack['frames'][topFrame].location.getLine(), 15);
 
-    Instance result = await isolate.evalFrame(topFrame, "x");
+    Instance result = await isolate.evalFrame(topFrame, "x") as Instance;
     print(result);
     expect(result.valueAsString, equals("3"));
   },
@@ -44,7 +44,7 @@
     expect(stack.type, equals('Stack'));
     expect(await stack['frames'][topFrame].location.getLine(), 18);
 
-    Instance result = await isolate.evalFrame(topFrame, "z");
+    Instance result = await isolate.evalFrame(topFrame, "z") as Instance;
     print(result);
     expect(result.valueAsString, equals("7"));
   },
diff --git a/runtime/observatory/tests/service/evaluate_with_escaping_closure_test.dart b/runtime/observatory/tests/service/evaluate_with_escaping_closure_test.dart
index 7849fc7..7320bfa 100644
--- a/runtime/observatory/tests/service/evaluate_with_escaping_closure_test.dart
+++ b/runtime/observatory/tests/service/evaluate_with_escaping_closure_test.dart
@@ -12,14 +12,15 @@
 
 var tests = <IsolateTest>[
   (Isolate isolate) async {
-    Library lib = await isolate.rootLibrary.load();
+    Library lib = await isolate.rootLibrary.load() as Library;
 
-    Instance result = await lib.evaluate("escapedClosure = (x, y) => x + y");
+    Instance result =
+        await lib.evaluate("escapedClosure = (x, y) => x + y") as Instance;
     print(result);
-    expect(result.clazz.name, startsWith('_Closure'));
+    expect(result.clazz!.name, startsWith('_Closure'));
 
     for (var i = 0; i < 100; i++) {
-      result = await lib.evaluate("escapedClosure(3, 4)");
+      result = await lib.evaluate("escapedClosure(3, 4)") as Instance;
       print(result);
       expect(result.valueAsString, equals('7'));
     }
diff --git a/runtime/observatory/tests/service/evaluate_with_scope_test.dart b/runtime/observatory/tests/service/evaluate_with_scope_test.dart
index 90ea063..9cfbdd3 100644
--- a/runtime/observatory/tests/service/evaluate_with_scope_test.dart
+++ b/runtime/observatory/tests/service/evaluate_with_scope_test.dart
@@ -16,24 +16,26 @@
 
 var tests = <IsolateTest>[
   (Isolate isolate) async {
-    Library lib = await isolate.rootLibrary.load();
-    Field thing1Field =
-        await lib.variables.singleWhere((v) => v.name == "thing1").load();
-    var thing1 = thing1Field.staticValue;
+    Library lib = await isolate.rootLibrary.load() as Library;
+    Field thing1Field = await lib.variables
+        .singleWhere((v) => v.name == "thing1")
+        .load() as Field;
+    var thing1 = thing1Field.staticValue!;
     print(thing1);
-    Field thing2Field =
-        await lib.variables.singleWhere((v) => v.name == "thing2").load();
-    var thing2 = thing2Field.staticValue;
+    Field thing2Field = await lib.variables
+        .singleWhere((v) => v.name == "thing2")
+        .load() as Field;
+    var thing2 = thing2Field.staticValue!;
     print(thing2);
 
     Instance result = await lib.evaluate("x + y",
-        scope: <String, ServiceObject>{"x": thing1, "y": thing2});
+        scope: <String, ServiceObject>{"x": thing1, "y": thing2}) as Instance;
     expect(result.valueAsString, equals('7'));
 
     bool didThrow = false;
     try {
       result = await lib.evaluate("x + y",
-          scope: <String, ServiceObject>{"x": lib, "y": lib});
+          scope: <String, ServiceObject>{"x": lib, "y": lib}) as Instance;
       print(result);
     } catch (e) {
       didThrow = true;
@@ -45,7 +47,8 @@
     didThrow = false;
     try {
       result = await lib.evaluate("x + y",
-          scope: <String, ServiceObject>{"not&an&identifier": thing1});
+              scope: <String, ServiceObject>{"not&an&identifier": thing1})
+          as Instance;
       print(result);
     } catch (e) {
       didThrow = true;
diff --git a/runtime/observatory/tests/service/external_service_asynchronous_invocation_test.dart b/runtime/observatory/tests/service/external_service_asynchronous_invocation_test.dart
index 91f015d..d633c2b 100644
--- a/runtime/observatory/tests/service/external_service_asynchronous_invocation_test.dart
+++ b/runtime/observatory/tests/service/external_service_asynchronous_invocation_test.dart
@@ -11,7 +11,7 @@
 
 var tests = <IsolateTest>[
   (Isolate isolate) async {
-    VM vm = isolate.owner;
+    VM vm = isolate.owner as VM;
 
     final serviceEvents =
         (await vm.getEventStream('Service')).asBroadcastStream();
@@ -23,7 +23,7 @@
 
     // Avoid to manually encode and decode messages from the stream
     Stream<String> stream = socket.stream.map(jsonEncode);
-    stream.cast<Object>().pipe(_socket);
+    stream.cast<dynamic>().pipe(_socket);
     dynamic _decoder(dynamic obj) {
       return jsonDecode(obj);
     }
diff --git a/runtime/observatory/tests/service/external_service_disappear_test.dart b/runtime/observatory/tests/service/external_service_disappear_test.dart
index fec1d31..1efa80e 100644
--- a/runtime/observatory/tests/service/external_service_disappear_test.dart
+++ b/runtime/observatory/tests/service/external_service_disappear_test.dart
@@ -11,7 +11,7 @@
 
 var tests = <IsolateTest>[
   (Isolate isolate) async {
-    VM vm = isolate.owner;
+    VM vm = isolate.owner as VM;
 
     final serviceEvents =
         (await vm.getEventStream('Service')).asBroadcastStream();
@@ -23,7 +23,7 @@
 
     // Avoid to manually encode and decode messages from the stream
     Stream<String> stream = socket.stream.map(jsonEncode);
-    stream.cast<Object>().pipe(_socket);
+    stream.cast<dynamic>().pipe(_socket);
     dynamic _decoder(dynamic obj) {
       return jsonDecode(obj);
     }
diff --git a/runtime/observatory/tests/service/external_service_notification_invocation_test.dart b/runtime/observatory/tests/service/external_service_notification_invocation_test.dart
index 2a659a1..8984526 100644
--- a/runtime/observatory/tests/service/external_service_notification_invocation_test.dart
+++ b/runtime/observatory/tests/service/external_service_notification_invocation_test.dart
@@ -11,7 +11,7 @@
 
 var tests = <IsolateTest>[
   (Isolate isolate) async {
-    VM vm = isolate.owner;
+    VM vm = isolate.owner as VM;
 
     final serviceEvents =
         (await vm.getEventStream('Service')).asBroadcastStream();
@@ -26,10 +26,10 @@
 
     // Avoid to manually encode and decode messages from the stream
     Stream<String> socket_stream = socket.stream.map(jsonEncode);
-    socket_stream.cast<Object>().pipe(_socket);
+    socket_stream.cast<dynamic>().pipe(_socket);
     Stream<String> socket_invoker_stream =
         socket_invoker.stream.map(jsonEncode);
-    socket_invoker_stream.cast<Object>().pipe(_socket_invoker);
+    socket_invoker_stream.cast<dynamic>().pipe(_socket_invoker);
     dynamic _decoder(dynamic obj) {
       return jsonDecode(obj);
     }
diff --git a/runtime/observatory/tests/service/external_service_registration_test.dart b/runtime/observatory/tests/service/external_service_registration_test.dart
index 469facb..7936409 100644
--- a/runtime/observatory/tests/service/external_service_registration_test.dart
+++ b/runtime/observatory/tests/service/external_service_registration_test.dart
@@ -11,7 +11,7 @@
 
 var tests = <IsolateTest>[
   (Isolate isolate) async {
-    VM vm = isolate.owner;
+    VM vm = isolate.owner as VM;
 
     final serviceEvents =
         (await vm.getEventStream('Service')).asBroadcastStream();
@@ -26,7 +26,7 @@
 
     // Avoid to manually encode and decode messages from the stream
     Stream<String> socket_stream = socket.stream.map(jsonEncode);
-    socket_stream.cast<Object>().pipe(_socket);
+    socket_stream.cast<dynamic>().pipe(_socket);
     dynamic _decoder(dynamic obj) {
       return jsonDecode(obj);
     }
diff --git a/runtime/observatory/tests/service/external_service_registration_via_notification_test.dart b/runtime/observatory/tests/service/external_service_registration_via_notification_test.dart
index 008c221..5b2ca8a 100644
--- a/runtime/observatory/tests/service/external_service_registration_via_notification_test.dart
+++ b/runtime/observatory/tests/service/external_service_registration_via_notification_test.dart
@@ -11,7 +11,7 @@
 
 var tests = <IsolateTest>[
   (Isolate isolate) async {
-    VM vm = isolate.owner;
+    VM vm = isolate.owner as VM;
 
     final serviceEvents =
         (await vm.getEventStream('Service')).asBroadcastStream();
@@ -26,7 +26,7 @@
 
     // Avoid to manually encode and decode messages from the stream
     Stream<String> stream = socket.stream.map(jsonEncode);
-    stream.cast<Object>().pipe(_socket);
+    stream.cast<dynamic>().pipe(_socket);
     dynamic _decoder(dynamic obj) {
       return jsonDecode(obj);
     }
diff --git a/runtime/observatory/tests/service/external_service_synchronous_invocation_test.dart b/runtime/observatory/tests/service/external_service_synchronous_invocation_test.dart
index a7cee78..317408d 100644
--- a/runtime/observatory/tests/service/external_service_synchronous_invocation_test.dart
+++ b/runtime/observatory/tests/service/external_service_synchronous_invocation_test.dart
@@ -11,7 +11,7 @@
 
 var tests = <IsolateTest>[
   (Isolate isolate) async {
-    VM vm = isolate.owner;
+    VM vm = isolate.owner as VM;
 
     final serviceEvents =
         (await vm.getEventStream('Service')).asBroadcastStream();
@@ -23,7 +23,7 @@
 
     // Avoid to manually encode and decode messages from the stream
     Stream<String> stream = socket.stream.map(jsonEncode);
-    stream.cast<Object>().pipe(_socket);
+    stream.cast<dynamic>().pipe(_socket);
     dynamic _decoder(dynamic obj) {
       return jsonDecode(obj);
     }
@@ -121,7 +121,7 @@
       } on ServerRpcException catch (e) {
         expect(e.code, equals(errorCode + iteration));
         expect(e.data, isNotNull);
-        expect(e.data[errorKey + end], equals(errorValue + end));
+        expect(e.data![errorKey + end], equals(errorValue + end));
       }
     }
   },
diff --git a/runtime/observatory/tests/service/field_script_test.dart b/runtime/observatory/tests/service/field_script_test.dart
index 17be1b1..6e32b95 100644
--- a/runtime/observatory/tests/service/field_script_test.dart
+++ b/runtime/observatory/tests/service/field_script_test.dart
@@ -18,13 +18,13 @@
 var tests = <IsolateTest>[
   hasPausedAtStart,
   (Isolate isolate) async {
-    Library lib = await isolate.rootLibrary.load();
+    Library lib = await isolate.rootLibrary.load() as Library;
     var fields = lib.variables;
     expect(fields.length, 2);
     print(lib.variables);
     for (Field f in fields) {
       await f.load();
-      String locationString = await f.location.toUserString();
+      String locationString = await f.location!.toUserString();
       if (f.name == "tests") {
         expect(locationString, "field_script_test.dart:18:5");
       } else if (f.name == "otherField") {
diff --git a/runtime/observatory/tests/service/get_allocation_profile_public_rpc_test.dart b/runtime/observatory/tests/service/get_allocation_profile_public_rpc_test.dart
index 137d44a..2602c50 100644
--- a/runtime/observatory/tests/service/get_allocation_profile_public_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_allocation_profile_public_rpc_test.dart
@@ -99,14 +99,14 @@
     var params = {
       'reset': 'banana',
     };
-    bool caughtException;
+    bool caughtException = false;
     try {
       await isolate.invokeRpcNoUpgrade('getAllocationProfile', params);
       expect(false, isTrue, reason: 'Unreachable');
     } on ServerRpcException catch (e) {
       caughtException = true;
       expect(e.code, equals(ServerRpcException.kInvalidParams));
-      expect(e.data['details'],
+      expect(e.data!['details'],
           "getAllocationProfile: invalid \'reset\' parameter: banana");
     }
     expect(caughtException, isTrue);
@@ -115,14 +115,14 @@
     var params = {
       'gc': 'banana',
     };
-    bool caughtException;
+    bool caughtException = false;
     try {
       await isolate.invokeRpcNoUpgrade('getAllocationProfile', params);
       expect(false, isTrue, reason: 'Unreachable');
     } on ServerRpcException catch (e) {
       caughtException = true;
       expect(e.code, equals(ServerRpcException.kInvalidParams));
-      expect(e.data['details'],
+      expect(e.data!['details'],
           "getAllocationProfile: invalid \'gc\' parameter: banana");
     }
     expect(caughtException, isTrue);
diff --git a/runtime/observatory/tests/service/get_allocation_profile_rpc_test.dart b/runtime/observatory/tests/service/get_allocation_profile_rpc_test.dart
index 6021980..0dd0423 100644
--- a/runtime/observatory/tests/service/get_allocation_profile_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_allocation_profile_rpc_test.dart
@@ -99,14 +99,14 @@
     var params = {
       'reset': 'banana',
     };
-    bool caughtException;
+    bool caughtException = false;
     try {
       await isolate.invokeRpcNoUpgrade('_getAllocationProfile', params);
       expect(false, isTrue, reason: 'Unreachable');
     } on ServerRpcException catch (e) {
       caughtException = true;
       expect(e.code, equals(ServerRpcException.kInvalidParams));
-      expect(e.data['details'],
+      expect(e.data!['details'],
           "_getAllocationProfile: invalid \'reset\' parameter: banana");
     }
     expect(caughtException, isTrue);
@@ -115,14 +115,14 @@
     var params = {
       'gc': 'banana',
     };
-    bool caughtException;
+    bool caughtException = false;
     try {
       await isolate.invokeRpcNoUpgrade('_getAllocationProfile', params);
       expect(false, isTrue, reason: 'Unreachable');
     } on ServerRpcException catch (e) {
       caughtException = true;
       expect(e.code, equals(ServerRpcException.kInvalidParams));
-      expect(e.data['details'],
+      expect(e.data!['details'],
           "_getAllocationProfile: invalid \'gc\' parameter: banana");
     }
     expect(caughtException, isTrue);
diff --git a/runtime/observatory/tests/service/get_allocation_samples_test.dart b/runtime/observatory/tests/service/get_allocation_samples_test.dart
index 2370433..72c4e2b 100644
--- a/runtime/observatory/tests/service/get_allocation_samples_test.dart
+++ b/runtime/observatory/tests/service/get_allocation_samples_test.dart
@@ -32,7 +32,7 @@
   // Initial.
   (Isolate isolate) async {
     // Verify initial state of 'Foo'.
-    var fooClass = await getClassFromRootLib(isolate, 'Foo');
+    var fooClass = await getClassFromRootLib(isolate, 'Foo') as Class;
     expect(fooClass, isNotNull);
     expect(fooClass.name, equals('Foo'));
     print(fooClass.id);
@@ -51,12 +51,12 @@
 
   // Allocation profile.
   (Isolate isolate) async {
-    var fooClass = await getClassFromRootLib(isolate, 'Foo');
+    var fooClass = await getClassFromRootLib(isolate, 'Foo') as Class;
     await fooClass.reload();
     expect(fooClass.traceAllocations, isTrue);
     dynamic profileResponse = await fooClass.getAllocationSamples();
     expect(profileResponse, isNotNull);
-    expect(profileResponse['type'], equals('_CpuProfile'));
+    //expect(profileResponse['type'], equals('_CpuProfile'));
     await fooClass.setTraceAllocations(false);
     await fooClass.reload();
     expect(fooClass.traceAllocations, isFalse);
@@ -65,17 +65,16 @@
     cpuProfile.buildCodeCallerAndCallees();
     cpuProfile.buildFunctionCallerAndCallees();
     var tree = cpuProfile.loadCodeTree(M.ProfileTreeDirection.exclusive);
-    var node = tree.root;
+    CodeCallTreeNode? node = tree.root;
     var expected = [
       'Root',
-      'DRT_AllocateObject',
-      '[Stub] Allocate Foo',
-      'test',
-      'test',
-      '_Closure.call'
+      '[Unoptimized] test',
+      '[Unoptimized] test',
+      '[Unoptimized] _Closure.call',
+      '[Unoptimized] _ServiceTesteeRunner.run',
     ];
     for (var i = 0; i < expected.length; i++) {
-      expect(node.profileCode.code.name, equals(expected[i]));
+      expect(node!.profileCode.code.name, equals(expected[i]));
       // Depth first traversal.
       if (node.children.length == 0) {
         node = null;
diff --git a/runtime/observatory/tests/service/get_client_name_rpc_test.dart b/runtime/observatory/tests/service/get_client_name_rpc_test.dart
index e9f6ae3..e66ac4a 100644
--- a/runtime/observatory/tests/service/get_client_name_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_client_name_rpc_test.dart
@@ -13,7 +13,7 @@
 
 Future<String> getClientName(Isolate isolate) async {
   final result = await isolate.vm.invokeRpcNoUpgrade('getClientName', {});
-  return result['name'];
+  return result['name'] as String;
 }
 
 Future<void> setClientName(Isolate isolate, String name) async =>
diff --git a/runtime/observatory/tests/service/get_cpu_profile_timeline_rpc_test.dart b/runtime/observatory/tests/service/get_cpu_profile_timeline_rpc_test.dart
index 2bbf22f..414de09 100644
--- a/runtime/observatory/tests/service/get_cpu_profile_timeline_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_cpu_profile_timeline_rpc_test.dart
@@ -38,7 +38,7 @@
   }
 
   List events = result['traceEvents'];
-  expect(events.length, greaterThan(10), reason: "Should have many samples");
+  expect(events.length, greaterThan(0), reason: "Should have samples");
   for (Map event in events) {
     expect(event['ph'], equals('P'));
     expect(event['pid'], isInt);
diff --git a/runtime/observatory/tests/service/get_cpu_samples_rpc_test.dart b/runtime/observatory/tests/service/get_cpu_samples_rpc_test.dart
index 8d7bbb9..8e67465 100644
--- a/runtime/observatory/tests/service/get_cpu_samples_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_cpu_samples_rpc_test.dart
@@ -35,7 +35,7 @@
       reason: "Should have many code objects");
 
   final samples = result['samples'];
-  expect(samples.length, greaterThan(10), reason: "Should have many samples");
+  expect(samples.length, greaterThan(0), reason: "Should have samples");
   final sample = samples.first;
   expect(sample['tid'], isInt);
   expect(sample['timestamp'], isInt);
diff --git a/runtime/observatory/tests/service/get_flag_list_rpc_test.dart b/runtime/observatory/tests/service/get_flag_list_rpc_test.dart
index f1c2c54..83f6f0c 100644
--- a/runtime/observatory/tests/service/get_flag_list_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_flag_list_rpc_test.dart
@@ -85,7 +85,7 @@
     var subscription;
     subscription = stream.listen((ServiceEvent event) {
       if (event.kind == ServiceEvent.kVMFlagUpdate) {
-        expect(event.owner.type, 'VM');
+        expect(event.owner!.type, 'VM');
         expect(event.flag, kProfilePeriod);
         expect(event.newValue, kValue.toString());
         subscription.cancel();
diff --git a/runtime/observatory/tests/service/get_isolate_after_async_error_test.dart b/runtime/observatory/tests/service/get_isolate_after_async_error_test.dart
index 814cb7b..2272969 100644
--- a/runtime/observatory/tests/service/get_isolate_after_async_error_test.dart
+++ b/runtime/observatory/tests/service/get_isolate_after_async_error_test.dart
@@ -16,7 +16,7 @@
   (Isolate isolate) async {
     await isolate.reload();
     expect(isolate.error, isNotNull);
-    expect(isolate.error.message.contains('oh no'), isTrue);
+    expect(isolate.error!.message!.contains('oh no'), isTrue);
   }
 ];
 
diff --git a/runtime/observatory/tests/service/get_isolate_after_language_error_test.dart b/runtime/observatory/tests/service/get_isolate_after_language_error_test.dart
deleted file mode 100644
index 425eb53..0000000
--- a/runtime/observatory/tests/service/get_isolate_after_language_error_test.dart
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright (c) 2016, 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:observatory/service_io.dart';
-import 'package:test/test.dart';
-import 'test_helper.dart';
-import 'service_test_common.dart';
-
-var x;
-
-doThrow() {
-  if (x) while {
-  };
-}
-
-var tests = <IsolateTest>[
-  hasStoppedAtExit,
-
-  (Isolate isolate) async {
-    await isolate.reload();
-    expect(isolate.error, isNotNull);
-    expect(isolate.error.message.contains("'(' expected"), isTrue);
-  }
-];
-
-main(args) => runIsolateTestsSynchronous(args,
-                                         tests,
-                                         pause_on_exit: true,
-                                         testeeConcurrent: doThrow);
diff --git a/runtime/observatory/tests/service/get_isolate_after_stack_overflow_error_test.dart b/runtime/observatory/tests/service/get_isolate_after_stack_overflow_error_test.dart
index ab1c05d..0b01599 100644
--- a/runtime/observatory/tests/service/get_isolate_after_stack_overflow_error_test.dart
+++ b/runtime/observatory/tests/service/get_isolate_after_stack_overflow_error_test.dart
@@ -21,7 +21,7 @@
   (Isolate isolate) async {
     await isolate.reload();
     expect(isolate.error, isNotNull);
-    expect(isolate.error.message.contains('Stack Overflow'), isTrue);
+    expect(isolate.error!.message!.contains('Stack Overflow'), isTrue);
   }
 ];
 
diff --git a/runtime/observatory/tests/service/get_isolate_after_sync_error_test.dart b/runtime/observatory/tests/service/get_isolate_after_sync_error_test.dart
index 8d0db3c..7165a8c 100644
--- a/runtime/observatory/tests/service/get_isolate_after_sync_error_test.dart
+++ b/runtime/observatory/tests/service/get_isolate_after_sync_error_test.dart
@@ -16,7 +16,7 @@
   (Isolate isolate) async {
     await isolate.reload();
     expect(isolate.error, isNotNull);
-    expect(isolate.error.message.contains('oh no'), isTrue);
+    expect(isolate.error!.message!.contains('oh no'), isTrue);
   }
 ];
 
diff --git a/runtime/observatory/tests/service/get_isolate_group_memory_usage.dart b/runtime/observatory/tests/service/get_isolate_group_memory_usage.dart
index 1bdb6bd..ebd2194 100644
--- a/runtime/observatory/tests/service/get_isolate_group_memory_usage.dart
+++ b/runtime/observatory/tests/service/get_isolate_group_memory_usage.dart
@@ -23,7 +23,7 @@
     final params = {
       'isolateGroupId': 'badid',
     };
-    bool caughtException;
+    bool caughtException = false;
     try {
       await vm.invokeRpcNoUpgrade('getIsolateGroupMemoryUsage', params);
       expect(false, isTrue, reason: 'Unreachable');
diff --git a/runtime/observatory/tests/service/get_isolate_rpc_test.dart b/runtime/observatory/tests/service/get_isolate_rpc_test.dart
index 4e79317..14a1f09 100644
--- a/runtime/observatory/tests/service/get_isolate_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_isolate_rpc_test.dart
@@ -39,7 +39,7 @@
     var params = {
       'isolateId': 'badid',
     };
-    bool caughtException;
+    bool caughtException = false;
     try {
       await vm.invokeRpcNoUpgrade('getIsolate', params);
       expect(false, isTrue, reason: 'Unreachable');
diff --git a/runtime/observatory/tests/service/get_memory_usage.dart b/runtime/observatory/tests/service/get_memory_usage.dart
index 19ce0d2..5b9a1c9 100644
--- a/runtime/observatory/tests/service/get_memory_usage.dart
+++ b/runtime/observatory/tests/service/get_memory_usage.dart
@@ -22,7 +22,7 @@
     var params = {
       'isolateId': 'badid',
     };
-    bool caughtException;
+    bool caughtException = false;
     try {
       await vm.invokeRpcNoUpgrade('getMemoryUsage', params);
       expect(false, isTrue, reason: 'Unreachable');
diff --git a/runtime/observatory/tests/service/get_native_allocation_samples_test.dart b/runtime/observatory/tests/service/get_native_allocation_samples_test.dart
index 31f5325..ca41a91 100644
--- a/runtime/observatory/tests/service/get_native_allocation_samples_test.dart
+++ b/runtime/observatory/tests/service/get_native_allocation_samples_test.dart
@@ -25,8 +25,8 @@
   int exclusiveAllocations = 0;
 
   for (int i = 0; i < root.children.length; i++) {
-    inclusiveAllocations += root.children[i].inclusiveNativeAllocations;
-    exclusiveAllocations += root.children[i].exclusiveNativeAllocations;
+    inclusiveAllocations += root.children[i].inclusiveNativeAllocations as int;
+    exclusiveAllocations += root.children[i].exclusiveNativeAllocations as int;
   }
 
   int rootMemory;
@@ -57,7 +57,8 @@
   // Verify inclusive tries.
   (VM vm) async {
     var response =
-        await vm.invokeRpc('_getNativeAllocationSamples', {'_code': true});
+        await vm.invokeRpc('_getNativeAllocationSamples', {'_code': true})
+            as ServiceMap;
     SampleProfile cpuProfile = new SampleProfile();
     await cpuProfile.load(vm, response);
     var codeTree = cpuProfile.loadCodeTree(M.ProfileTreeDirection.inclusive);
@@ -69,7 +70,8 @@
   // Verify exclusive tries.
   (VM vm) async {
     var response =
-        await vm.invokeRpc('_getNativeAllocationSamples', {'_code': true});
+        await vm.invokeRpc('_getNativeAllocationSamples', {'_code': true})
+            as ServiceMap;
     SampleProfile cpuProfile = new SampleProfile();
     await cpuProfile.load(vm, response);
     var codeTreeExclusive =
diff --git a/runtime/observatory/tests/service/get_object_rpc_test.dart b/runtime/observatory/tests/service/get_object_rpc_test.dart
index e9e508b..9a3eab8 100644
--- a/runtime/observatory/tests/service/get_object_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_object_rpc_test.dart
@@ -13,7 +13,7 @@
 
 class _DummyClass {
   static var dummyVar = 11;
-  final List<String> dummyList = new List<String>.filled(20, null);
+  final List<String> dummyList = new List<String>.filled(20, '');
   void dummyFunction() {}
 }
 
@@ -693,7 +693,7 @@
     var params = {
       'objectId': 'libraries/9999999',
     };
-    bool caughtException;
+    bool caughtException = false;
     try {
       await isolate.invokeRpcNoUpgrade('getObject', params);
       expect(false, isTrue, reason: 'Unreachable');
@@ -736,7 +736,7 @@
     var params = {
       'objectId': 'scripts/9999999',
     };
-    bool caughtException;
+    bool caughtException = false;
     try {
       await isolate.invokeRpcNoUpgrade('getObject', params);
       expect(false, isTrue, reason: 'Unreachable');
@@ -783,7 +783,7 @@
     var params = {
       'objectId': 'classes/9999999',
     };
-    bool caughtException;
+    bool caughtException = false;
     try {
       await isolate.invokeRpcNoUpgrade('getObject', params);
       expect(false, isTrue, reason: 'Unreachable');
@@ -823,7 +823,7 @@
     var params = {
       'objectId': id,
     };
-    bool caughtException;
+    bool caughtException = false;
     try {
       await isolate.invokeRpcNoUpgrade('getObject', params);
       expect(false, isTrue, reason: 'Unreachable');
@@ -868,7 +868,7 @@
     var params = {
       'objectId': id,
     };
-    bool caughtException;
+    bool caughtException = false;
     try {
       await isolate.invokeRpcNoUpgrade('getObject', params);
       expect(false, isTrue, reason: 'Unreachable');
@@ -944,7 +944,7 @@
     var params = {
       'objectId': id,
     };
-    bool caughtException;
+    bool caughtException = false;
     try {
       await isolate.invokeRpcNoUpgrade('getObject', params);
       expect(false, isTrue, reason: 'Unreachable');
@@ -990,7 +990,7 @@
     var params = {
       'objectId': 'code/0',
     };
-    bool caughtException;
+    bool caughtException = false;
     try {
       await isolate.invokeRpcNoUpgrade('getObject', params);
       expect(false, isTrue, reason: 'Unreachable');
diff --git a/runtime/observatory/tests/service/get_ports_public_rpc_test.dart b/runtime/observatory/tests/service/get_ports_public_rpc_test.dart
new file mode 100644
index 0000000..cc511f7
--- /dev/null
+++ b/runtime/observatory/tests/service/get_ports_public_rpc_test.dart
@@ -0,0 +1,50 @@
+// Copyright (c) 2020, 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:isolate' hide Isolate;
+import 'package:observatory/service_io.dart';
+import 'package:test/test.dart';
+
+import 'test_helper.dart';
+
+var port1;
+var port2;
+var port3;
+
+void warmup() {
+  port1 = RawReceivePort(null, 'port1');
+  port2 = RawReceivePort((_) {});
+  port3 = RawReceivePort((_) {}, 'port3');
+  port3.close();
+  RawReceivePort((_) {}, 'port4');
+}
+
+int countNameMatches(ports, name) {
+  var matches = 0;
+  for (var port in ports) {
+    if (port['debugName'] == name) {
+      matches++;
+    }
+  }
+  return matches;
+}
+
+final tests = <IsolateTest>[
+  (Isolate isolate) async {
+    dynamic result = await isolate.invokeRpcNoUpgrade('getPorts', {});
+    expect(result['type'], 'PortList');
+    expect(result['ports'], isList);
+    final ports = result['ports'];
+    // There are at least three ports: the three created in warm up that
+    // weren't closed. Some OSes will have other ports open but we do not try
+    // and test for these.
+    expect(ports.length, greaterThanOrEqualTo(3));
+    expect(countNameMatches(ports, 'port1'), 1);
+    expect(countNameMatches(ports, 'port3'), 0);
+    expect(countNameMatches(ports, 'port4'), 1);
+    expect(countNameMatches(ports, ''), greaterThanOrEqualTo(1));
+  },
+];
+
+main(args) async => runIsolateTests(args, tests, testeeBefore: warmup);
diff --git a/runtime/observatory/tests/service/get_retaining_path_rpc_test.dart b/runtime/observatory/tests/service/get_retaining_path_rpc_test.dart
index d03bffb..05950a1 100644
--- a/runtime/observatory/tests/service/get_retaining_path_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_retaining_path_rpc_test.dart
@@ -11,24 +11,24 @@
   _TestClass();
   // Make sure these fields are not removed by the tree shaker.
   @pragma("vm:entry-point")
-  var x;
+  dynamic x;
   @pragma("vm:entry-point")
-  var y;
+  dynamic y;
 }
 
-var target1 = new _TestClass();
-var target2 = new _TestClass();
-var target3 = new _TestClass();
-var target4 = new _TestClass();
-var target5 = new _TestClass();
+dynamic target1 = new _TestClass();
+dynamic target2 = new _TestClass();
+dynamic target3 = new _TestClass();
+dynamic target4 = new _TestClass();
+dynamic target5 = new _TestClass();
 @pragma("vm:entry-point") // Prevent obfuscation
-var globalObject = new _TestClass();
+dynamic globalObject = new _TestClass();
 @pragma("vm:entry-point") // Prevent obfuscation
-var globalList = new List(100);
+dynamic globalList = new List<dynamic>.filled(100, null);
 @pragma("vm:entry-point") // Prevent obfuscation
-var globalMap1 = new Map();
+dynamic globalMap1 = new Map();
 @pragma("vm:entry-point") // Prevent obfuscation
-var globalMap2 = new Map();
+dynamic globalMap2 = new Map();
 
 void warmup() {
   globalObject.x = target1;
@@ -108,14 +108,14 @@
     var params = {
       'targetId': obj['id'],
     };
-    bool caughtException;
+    bool caughtException = false;
     try {
       await isolate.invokeRpcNoUpgrade('getRetainingPath', params);
       expect(false, isTrue, reason: 'Unreachable');
     } on ServerRpcException catch (e) {
       caughtException = true;
       expect(e.code, equals(ServerRpcException.kInvalidParams));
-      expect(e.data['details'],
+      expect(e.data!['details'],
           "getRetainingPath expects the \'limit\' parameter");
     }
     expect(caughtException, isTrue);
diff --git a/runtime/observatory/tests/service/get_scripts_rpc_test.dart b/runtime/observatory/tests/service/get_scripts_rpc_test.dart
index 9331adb..c27358b 100644
--- a/runtime/observatory/tests/service/get_scripts_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_scripts_rpc_test.dart
@@ -22,7 +22,7 @@
     var params = {
       'isolateId': 'badid',
     };
-    bool caughtException;
+    bool caughtException = false;
     try {
       await vm.invokeRpcNoUpgrade('getScripts', params);
       expect(false, isTrue, reason: 'Unreachable');
diff --git a/runtime/observatory/tests/service/get_source_report_test.dart b/runtime/observatory/tests/service/get_source_report_test.dart
index 731e2f3..adea481 100644
--- a/runtime/observatory/tests/service/get_source_report_test.dart
+++ b/runtime/observatory/tests/service/get_source_report_test.dart
@@ -73,12 +73,12 @@
 
     var expectedRange = {
       'scriptIndex': 0,
-      'startPos': 432,
-      'endPos': 576,
+      'startPos': 424,
+      'endPos': 568,
       'compiled': true,
       'coverage': {
-        'hits': [432, 482, 533, 562],
-        'misses': [495],
+        'hits': [424, 474, 525, 554],
+        'misses': [487],
       }
     };
 
@@ -91,7 +91,7 @@
     final numRanges = coverage['ranges'].length;
     expect(coverage['type'], equals('SourceReport'));
 
-    expect(numRanges, equals(12));
+    expect(numRanges, equals(10));
     expect(coverage['ranges'][0], equals(expectedRange));
     expect(coverage['scripts'].length, 1);
     expect(
@@ -106,7 +106,7 @@
     };
     coverage = await isolate.invokeRpcNoUpgrade('getSourceReport', params);
     expect(coverage['type'], equals('SourceReport'));
-    expect(coverage['ranges'].length, numRanges);
+    expect(coverage['ranges'].length, 11);
     expect(allRangesCompiled(coverage), isTrue);
 
     // One function
diff --git a/runtime/observatory/tests/service/get_source_report_with_mixin_test.dart b/runtime/observatory/tests/service/get_source_report_with_mixin_test.dart
index db85b1a..061d85f 100644
--- a/runtime/observatory/tests/service/get_source_report_with_mixin_test.dart
+++ b/runtime/observatory/tests/service/get_source_report_with_mixin_test.dart
@@ -34,7 +34,7 @@
     expect(stack['frames'][0].function.name, equals('testFunction'));
 
     final List<Script> scripts = await isolate.getScripts();
-    Script foundScript;
+    Script? foundScript;
     for (Script script in scripts) {
       if (script.uri.contains(lib1Filename)) {
         foundScript = script;
@@ -58,7 +58,7 @@
       // Now get report for the lib1 only.
       final Map<String, Object> params = {
         'reports': ['Coverage'],
-        'scriptId': foundScript.id
+        'scriptId': foundScript!.id!
       };
       final coverage =
           await isolate.invokeRpcNoUpgrade('getSourceReport', params);
diff --git a/runtime/observatory/tests/service/get_stack_limit_rpc_test.dart b/runtime/observatory/tests/service/get_stack_limit_rpc_test.dart
new file mode 100644
index 0000000..99a8bf1
--- /dev/null
+++ b/runtime/observatory/tests/service/get_stack_limit_rpc_test.dart
@@ -0,0 +1,104 @@
+// Copyright (c) 2020, 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.
+
+// VMOptions=--causal-async-stacks --no-lazy-async-stacks
+
+import 'dart:async';
+import 'dart:developer';
+
+import 'package:observatory/models.dart' as M;
+import 'package:observatory/service_io.dart';
+import 'package:test/test.dart';
+import 'service_test_common.dart';
+import 'test_helper.dart';
+
+bar(int depth) {
+  if (depth == 21) {
+    debugger();
+    return;
+  }
+  foo(depth + 1);
+}
+
+foo(int depth) {
+  bar(depth + 1);
+}
+
+testMain() {
+  foo(0);
+}
+
+verifyStack(List frames, int numFrames) {
+  for (int i = 0; i < frames.length && i < numFrames; ++i) {
+    final frame = frames[i];
+    if (i < 22) {
+      expect(frame.function!.qualifiedName, (i % 2) == 0 ? 'bar' : 'foo');
+    } else if (i == 22) {
+      expect(frame.function!.qualifiedName, 'testMain');
+      break;
+    }
+  }
+}
+
+var tests = <IsolateTest>[
+  (Isolate isolate) async {
+    await hasStoppedAtBreakpoint(isolate);
+    // Sanity check.
+    expect(isolate.pauseEvent is M.PauseBreakpointEvent, isTrue);
+  },
+
+// Get stack
+  (Isolate isolate) async {
+    var stack = await isolate.getStack();
+    // Sanity check.
+    var frames = stack['frames'];
+    var asyncFrames = stack['asyncCausalFrames'];
+    var awaiterFrames = stack['awaiterFrames'];
+    expect(frames.length, greaterThanOrEqualTo(20));
+    expect(asyncFrames.length, greaterThan(frames.length));
+    expect(awaiterFrames.length, greaterThan(frames.length));
+    expect(stack['truncated'], false);
+
+    verifyStack(frames, frames.length);
+
+    final fullStackLength = frames.length;
+
+    // Try a limit > actual stack depth and expect to get the full stack with
+    // truncated async stacks.
+    stack = await isolate.getStack(limit: fullStackLength + 1);
+    frames = stack['frames'];
+    asyncFrames = stack['asyncCausalFrames'];
+    awaiterFrames = stack['awaiterFrames'];
+
+    expect(frames.length, fullStackLength);
+    expect(asyncFrames.length, fullStackLength + 1);
+    expect(asyncFrames.length, fullStackLength + 1);
+    expect(stack['truncated'], true);
+    verifyStack(frames, fullStackLength);
+
+    // Try a limit < actual stack depth and expect to get a stack of depth
+    // 'limit'.
+    stack = await isolate.getStack(limit: 10);
+    frames = stack['frames'];
+    asyncFrames = stack['asyncCausalFrames'];
+    awaiterFrames = stack['awaiterFrames'];
+
+    expect(frames.length, 10);
+    expect(asyncFrames.length, 10);
+    expect(awaiterFrames.length, 10);
+    expect(stack['truncated'], true);
+    verifyStack(frames, 10);
+  },
+// Invalid limit
+  (Isolate isolate) async {
+    try {
+      await isolate.getStack(limit: -1);
+      fail('Invalid parameter of -1 successful');
+    } on ServerRpcException {
+      // Expected.
+    }
+  }
+];
+
+main(args) => runIsolateTests(args, tests, testeeConcurrent: testMain);
diff --git a/runtime/observatory/tests/service/get_stack_rpc_test.dart b/runtime/observatory/tests/service/get_stack_rpc_test.dart
index db1695f..1c7a6e2 100644
--- a/runtime/observatory/tests/service/get_stack_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_stack_rpc_test.dart
@@ -84,7 +84,7 @@
     expect(msgHandlerObjectId, isNotNull);
 
     // Get object.
-    Instance object = await isolate.getObject(msgHandlerObjectId);
+    Instance object = await isolate.getObject(msgHandlerObjectId) as Instance;
     expect(object.valueAsString, equals('34'));
   }
 ];
diff --git a/runtime/observatory/tests/service/get_version_rpc_test.dart b/runtime/observatory/tests/service/get_version_rpc_test.dart
index 8b56393..5e1a8c9 100644
--- a/runtime/observatory/tests/service/get_version_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_version_rpc_test.dart
@@ -9,12 +9,12 @@
 
 var tests = <VMTest>[
   (VM vm) async {
-    var result = await vm.invokeRpcNoUpgrade('getVersion', {});
-    expect(result['type'], equals('Version'));
-    expect(result['major'], equals(3));
-    expect(result['minor'], equals(40));
-    expect(result['_privateMajor'], equals(0));
-    expect(result['_privateMinor'], equals(0));
+    final result = await vm.invokeRpcNoUpgrade('getVersion', {});
+    expect(result['type'], 'Version');
+    expect(result['major'], 3);
+    expect(result['minor'], 42);
+    expect(result['_privateMajor'], 0);
+    expect(result['_privateMinor'], 0);
   },
 ];
 
diff --git a/runtime/observatory/tests/service/get_vm_timeline_rpc_test.dart b/runtime/observatory/tests/service/get_vm_timeline_rpc_test.dart
index 71a8b61a..269b771 100644
--- a/runtime/observatory/tests/service/get_vm_timeline_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_vm_timeline_rpc_test.dart
@@ -43,7 +43,7 @@
   return true;
 }
 
-bool eventsContains(List events, String phase, String name, [Map arguments]) {
+bool eventsContains(List events, String phase, String name, [Map? arguments]) {
   for (Map event in events) {
     if ((event['ph'] == phase) && (event['name'] == name)) {
       if (arguments == null) {
diff --git a/runtime/observatory/tests/service/http_get_isolate_group_rpc_common.dart b/runtime/observatory/tests/service/http_get_isolate_group_rpc_common.dart
index 47ae51c..8e1c598 100644
--- a/runtime/observatory/tests/service/http_get_isolate_group_rpc_common.dart
+++ b/runtime/observatory/tests/service/http_get_isolate_group_rpc_common.dart
@@ -26,9 +26,9 @@
       .cast<List<int>>()
       .transform(utf8.decoder)
       .transform(json.decoder)
-      .first;
+      .first as Map;
   final result = response['result'];
-  return result['isolateGroups'][0]['id'];
+  return result['isolateGroups'][0]['id'] as String;
 }
 
 Future<Null> testeeBefore() async {
@@ -41,17 +41,17 @@
 
   // Build the request.
   final params = <String, String>{
-    'isolateGroupId': await getIsolateGroupId(httpClient, info.serverUri),
+    'isolateGroupId': await getIsolateGroupId(httpClient, info.serverUri!),
   };
 
   const method = 'getIsolateGroup';
-  final pathSegments = <String>[]..addAll(info.serverUri.pathSegments);
+  final pathSegments = <String>[]..addAll(info.serverUri!.pathSegments);
   if (pathSegments.isNotEmpty) {
     pathSegments[pathSegments.length - 1] = method;
   } else {
     pathSegments.add(method);
   }
-  final requestUri = info.serverUri
+  final requestUri = info.serverUri!
       .replace(pathSegments: pathSegments, queryParameters: params);
 
   try {
@@ -61,7 +61,7 @@
         .cast<List<int>>()
         .transform(utf8.decoder)
         .transform(json.decoder)
-        .first;
+        .first as Map;
     final result = jsonResponse['result'];
     Expect.equals(result['type'], 'IsolateGroup');
     Expect.isTrue(result['id'].startsWith('isolateGroups/'));
diff --git a/runtime/observatory/tests/service/http_get_isolate_rpc_common.dart b/runtime/observatory/tests/service/http_get_isolate_rpc_common.dart
index 6d487c2..3bbc12e 100644
--- a/runtime/observatory/tests/service/http_get_isolate_rpc_common.dart
+++ b/runtime/observatory/tests/service/http_get_isolate_rpc_common.dart
@@ -25,9 +25,9 @@
       .cast<List<int>>()
       .transform(utf8.decoder)
       .transform(json.decoder)
-      .first;
+      .first as Map;
   Map result = response['result'];
-  return result['isolates'][0]['id'];
+  return result['isolates'][0]['id'] as String;
 }
 
 Future<Null> testeeBefore() async {
@@ -40,17 +40,17 @@
 
   // Build the request.
   final params = <String, String>{
-    'isolateId': await getIsolateId(httpClient, info.serverUri),
+    'isolateId': await getIsolateId(httpClient, info.serverUri!),
   };
 
   String method = 'getIsolate';
-  final pathSegments = <String>[]..addAll(info.serverUri.pathSegments);
+  final pathSegments = <String>[]..addAll(info.serverUri!.pathSegments);
   if (pathSegments.isNotEmpty) {
     pathSegments[pathSegments.length - 1] = method;
   } else {
     pathSegments.add(method);
   }
-  final requestUri = info.serverUri
+  final requestUri = info.serverUri!
       .replace(pathSegments: pathSegments, queryParameters: params);
 
   try {
@@ -59,7 +59,7 @@
         .cast<List<int>>()
         .transform(utf8.decoder)
         .transform(json.decoder)
-        .first;
+        .first as Map;
     Map result = response['result'];
     Expect.equals(result['type'], 'Isolate');
     Expect.isTrue(result['id'].startsWith('isolates/'));
diff --git a/runtime/observatory/tests/service/http_get_vm_rpc_common.dart b/runtime/observatory/tests/service/http_get_vm_rpc_common.dart
index b9b405e..481f567 100644
--- a/runtime/observatory/tests/service/http_get_vm_rpc_common.dart
+++ b/runtime/observatory/tests/service/http_get_vm_rpc_common.dart
@@ -19,14 +19,14 @@
   var httpClient = new io.HttpClient();
 
   // Build the request.
-  final pathSegments = <String>[]..addAll(info.serverUri.pathSegments);
+  final pathSegments = <String>[]..addAll(info.serverUri!.pathSegments);
   String method = 'getVM';
   if (pathSegments.isNotEmpty) {
     pathSegments[pathSegments.length - 1] = method;
   } else {
     pathSegments.add(method);
   }
-  final requestUri = info.serverUri.replace(pathSegments: pathSegments);
+  final requestUri = info.serverUri!.replace(pathSegments: pathSegments);
 
   try {
     var request = await httpClient.getUrl(requestUri);
@@ -34,7 +34,7 @@
         .cast<List<int>>()
         .transform(utf8.decoder)
         .transform(json.decoder)
-        .first;
+        .first as Map;
     Map result = response['result'];
     Expect.equals(result['type'], 'VM');
     Expect.equals(result['name'], 'vm');
diff --git a/runtime/observatory/tests/service/implicit_getter_setter_test.dart b/runtime/observatory/tests/service/implicit_getter_setter_test.dart
index 30710d5..4b7f96f 100644
--- a/runtime/observatory/tests/service/implicit_getter_setter_test.dart
+++ b/runtime/observatory/tests/service/implicit_getter_setter_test.dart
@@ -20,12 +20,12 @@
 }
 
 Future testGetter(Isolate isolate) async {
-  Library rootLibrary = await isolate.rootLibrary.load();
+  Library rootLibrary = await isolate.rootLibrary.load() as Library;
   expect(rootLibrary.classes.length, equals(1));
-  Class classA = await rootLibrary.classes[0].load();
+  Class classA = await rootLibrary.classes[0].load() as Class;
   expect(classA.name, equals('A'));
   // Find getter.
-  ServiceFunction getterFunc;
+  ServiceFunction? getterFunc;
   for (ServiceFunction function in classA.functions) {
     if (function.name == 'field') {
       getterFunc = function;
@@ -33,21 +33,21 @@
     }
   }
   expect(getterFunc, isNotNull);
-  await getterFunc.load();
-  Field field = await getterFunc.field.load();
+  await getterFunc!.load();
+  Field field = await getterFunc.field!.load() as Field;
   expect(field, isNotNull);
   expect(field.name, equals('field'));
-  Class classDouble = await field.guardClass.load();
+  Class classDouble = await field.guardClass!.load() as Class;
   expect(classDouble.name, equals('_Double'));
 }
 
 Future testSetter(Isolate isolate) async {
-  Library rootLibrary = await isolate.rootLibrary.load();
+  Library rootLibrary = await isolate.rootLibrary.load() as Library;
   expect(rootLibrary.classes.length, equals(1));
-  Class classA = await rootLibrary.classes[0].load();
+  Class classA = await rootLibrary.classes[0].load() as Class;
   expect(classA.name, equals('A'));
   // Find setter.
-  ServiceFunction setterFunc;
+  ServiceFunction? setterFunc;
   for (ServiceFunction function in classA.functions) {
     if (function.name == 'field=') {
       setterFunc = function;
@@ -55,11 +55,11 @@
     }
   }
   expect(setterFunc, isNotNull);
-  await setterFunc.load();
-  Field field = await setterFunc.field.load();
+  await setterFunc!.load();
+  Field field = await setterFunc.field!.load() as Field;
   expect(field, isNotNull);
   expect(field.name, equals('field'));
-  Class classDouble = await field.guardClass.load();
+  Class classDouble = await field.guardClass!.load() as Class;
   expect(classDouble.name, equals('_Double'));
 }
 
diff --git a/runtime/observatory/tests/service/inbound_references_test.dart b/runtime/observatory/tests/service/inbound_references_test.dart
index 5c10ae1..548aa7e 100644
--- a/runtime/observatory/tests/service/inbound_references_test.dart
+++ b/runtime/observatory/tests/service/inbound_references_test.dart
@@ -22,18 +22,19 @@
   n = new Node();
   e = new Edge();
   n.edge = e;
-  array = new List(2);
+  array = new List<dynamic>.filled(2, null);
   array[0] = n;
   array[1] = e;
 }
 
 var tests = <IsolateTest>[
   (Isolate isolate) async {
-    Library lib = await isolate.rootLibrary.load();
+    Library lib = await isolate.rootLibrary.load() as Library;
     Field field = lib.variables.where((v) => v.name == 'e').single;
     await field.load();
-    Instance e = field.staticValue;
-    ServiceMap response = await isolate.getInboundReferences(e, 100);
+    Instance e = field.staticValue as Instance;
+    ServiceMap response =
+        await isolate.getInboundReferences(e, 100) as ServiceMap;
     List references = response['references'];
     hasReferenceSuchThat(predicate) {
       expect(references.any(predicate), isTrue);
diff --git a/runtime/observatory/tests/service/invoke_test.dart b/runtime/observatory/tests/service/invoke_test.dart
index 4d198a7..d1c8466 100644
--- a/runtime/observatory/tests/service/invoke_test.dart
+++ b/runtime/observatory/tests/service/invoke_test.dart
@@ -51,13 +51,13 @@
     Field field =
         lib.variables.singleWhere((field) => field.name == "instance");
     await field.load();
-    Instance instance = field.staticValue;
+    Instance instance = field.staticValue as Instance;
     field = lib.variables.singleWhere((field) => field.name == "apple");
     await field.load();
-    Instance apple = field.staticValue;
+    Instance apple = field.staticValue as Instance;
     field = lib.variables.singleWhere((field) => field.name == "banana");
     await field.load();
-    Instance banana = field.staticValue;
+    Instance banana = field.staticValue as Instance;
 
     dynamic result = await isolate.invokeRpc("invoke",
         {"targetId": lib.id, "selector": "libraryFunction", "argumentIds": []});
diff --git a/runtime/observatory/tests/service/isolate_lifecycle_test.dart b/runtime/observatory/tests/service/isolate_lifecycle_test.dart
index a4a364b..8b452f1 100644
--- a/runtime/observatory/tests/service/isolate_lifecycle_test.dart
+++ b/runtime/observatory/tests/service/isolate_lifecycle_test.dart
@@ -110,7 +110,7 @@
     var resumesIssued = 0;
     var isolateList = vm.isolates.toList();
     for (var isolate in isolateList) {
-      if (isolate.name.endsWith('main')) {
+      if (isolate.name!.endsWith('main')) {
         continue;
       }
       try {
diff --git a/runtime/observatory/tests/service/issue_25465_test.dart b/runtime/observatory/tests/service/issue_25465_test.dart
index 4b17e14..2375be6 100644
--- a/runtime/observatory/tests/service/issue_25465_test.dart
+++ b/runtime/observatory/tests/service/issue_25465_test.dart
@@ -28,8 +28,8 @@
 
     var bpt1 = await isolate.addBreakpoint(script, LINE_A);
     var bpt2 = await isolate.addBreakpoint(script, LINE_B);
-    expect(await bpt1.location.getLine(), equals(LINE_A));
-    expect(await bpt2.location.getLine(), equals(LINE_B));
+    expect(await bpt1.location!.getLine(), equals(LINE_A));
+    expect(await bpt2.location!.getLine(), equals(LINE_B));
 
     var stream = await isolate.vm.getEventStream(VM.kDebugStream);
     Completer completer = new Completer();
@@ -41,7 +41,7 @@
         print('break count is $breakCount');
         if (breakCount == 1) {
           // We are stopped at breakpoint 1.
-          expect(event.breakpoint.number, equals(bpt1.number));
+          expect(event.breakpoint!.number, equals(bpt1.number));
 
           // Remove both breakpoints
           var result = await isolate.removeBreakpoint(bpt1);
diff --git a/runtime/observatory/tests/service/issue_30555_test.dart b/runtime/observatory/tests/service/issue_30555_test.dart
index 22f6a2b..535e01b 100644
--- a/runtime/observatory/tests/service/issue_30555_test.dart
+++ b/runtime/observatory/tests/service/issue_30555_test.dart
@@ -38,36 +38,36 @@
     var sub;
     final Isolate firstIsolate = isolate;
     print("First isolate is: ${firstIsolate.id}");
-    Isolate secondIsolate;
+    Isolate? secondIsolate;
     sub = await isolate.vm.listenEventStream(VM.kDebugStream, (ServiceEvent c) {
-      print("Event ${c.kind} on ${c.isolate.id}");
+      print("Event ${c.kind} on ${c.isolate!.id}");
       switch (step) {
         case 0:
           expect(c.kind, equals(ServiceEvent.kResume),
               reason: "First isolate should resume");
-          expect(c.isolate.id, equals(firstIsolate.id),
+          expect(c.isolate!.id, equals(firstIsolate.id),
               reason: "First isolate should resume");
           break;
         case 1:
           expect(c.kind, equals(ServiceEvent.kPauseStart),
               reason: "Second isolate should pause on start");
-          expect(c.isolate.id, equals(isolate.vm.isolates[1].id),
+          expect(c.isolate!.id, equals(isolate.vm.isolates[1].id),
               reason: "Second isolate should pause on start");
-          secondIsolate = c.isolate;
-          print("Second isolate is: ${secondIsolate.id}");
+          secondIsolate = c.isolate!;
+          print("Second isolate is: ${secondIsolate!.id}");
           print("Resuming second isolate");
-          secondIsolate.resume();
+          secondIsolate!.resume();
           break;
         case 2:
           expect(c.kind, equals(ServiceEvent.kResume),
               reason: "Second isolate should resume");
-          expect(c.isolate.id, equals(secondIsolate.id),
+          expect(c.isolate!.id, equals(secondIsolate!.id),
               reason: "Second isolate should resume");
           break;
         case 3:
           expect(c.kind, equals(ServiceEvent.kPauseBreakpoint),
               reason: "First isolate should stop at debugger()");
-          expect(c.isolate.id, equals(firstIsolate.id),
+          expect(c.isolate!.id, equals(firstIsolate.id),
               reason: "First isolate should stop at debugger()");
           print("Resuming first isolate");
           firstIsolate.resume();
@@ -75,7 +75,7 @@
         case 4:
           expect(c.kind, equals(ServiceEvent.kResume),
               reason: "First isolate should resume (1)");
-          expect(c.isolate.id, equals(firstIsolate.id),
+          expect(c.isolate!.id, equals(firstIsolate.id),
               reason: "First isolate should resume (1)");
           break;
         case 5:
@@ -86,18 +86,18 @@
           expect(c.kind, equals(ServiceEvent.kPauseBreakpoint),
               reason: "First & Second isolate should stop at debugger()");
           print("Resuming second isolate");
-          secondIsolate.resume();
+          secondIsolate!.resume();
           break;
         case 7:
           expect(c.kind, equals(ServiceEvent.kResume),
               reason: "Second isolate should resume before the exception");
-          expect(c.isolate.id, equals(secondIsolate.id),
+          expect(c.isolate!.id, equals(secondIsolate!.id),
               reason: "Second isolate should resume before the exception");
           break;
         case 8:
           expect(c.kind, equals(ServiceEvent.kPauseExit),
               reason: "Second isolate should exit at the exception");
-          expect(c.isolate.id, equals(secondIsolate.id),
+          expect(c.isolate!.id, equals(secondIsolate!.id),
               reason: "Second isolate should exit at the exception");
           print("Resuming first isolate");
           firstIsolate.resume();
@@ -105,11 +105,11 @@
         case 9:
           expect(c.kind, equals(ServiceEvent.kResume),
               reason: "First isolate should resume after the exception");
-          expect(c.isolate.id, equals(firstIsolate.id),
+          expect(c.isolate!.id, equals(firstIsolate.id),
               reason: "First isolate should resume after the exception");
           break;
         case 10:
-          expect(c.isolate.id, equals(firstIsolate.id),
+          expect(c.isolate!.id, equals(firstIsolate.id),
               reason: "First "
                   "isolate should stop at debugger() after exception.\n"
                   "Probably the second resumed even though it was not expect "
diff --git a/runtime/observatory/tests/service/local_variable_declaration_test.dart b/runtime/observatory/tests/service/local_variable_declaration_test.dart
index f7e696a..162f311 100644
--- a/runtime/observatory/tests/service/local_variable_declaration_test.dart
+++ b/runtime/observatory/tests/service/local_variable_declaration_test.dart
@@ -9,12 +9,12 @@
 import 'test_helper.dart';
 import 'dart:developer';
 
-testParameters(int jjjj, int oooo, [int hhhh, int nnnn]) {
+testParameters(int jjjj, int oooo, [int? hhhh, int? nnnn]) {
   debugger();
 }
 
 testMain() {
-  int xxx, yyyy, zzzzz;
+  int? xxx, yyyy, zzzzz;
   for (int i = 0; i < 1; i++) {
     var foo = () {};
     debugger();
@@ -38,7 +38,7 @@
     // Grab the top frame.
     Frame frame = stack['frames'][0];
     // Grab the script.
-    Script script = frame.location.script;
+    Script script = frame.location!.script;
     await script.load();
 
     // Ensure that the token at each declaration position is the name of the
@@ -46,7 +46,7 @@
     for (var variable in frame.variables) {
       final int declarationTokenPos = variable['declarationTokenPos'];
       final String name = variable['name'];
-      final String token = script.getToken(declarationTokenPos);
+      final String? token = script.getToken(declarationTokenPos);
       // When running from an appjit snapshot, sources aren't available so the returned token will
       // be null.
       if (token != null) {
@@ -65,14 +65,14 @@
     // Grab the top frame.
     Frame frame = stack['frames'][0];
     // Grab the script.
-    Script script = frame.location.script;
+    Script script = frame.location!.script;
     await script.load();
     print(frame);
     expect(frame.variables.length, greaterThanOrEqualTo(1));
     for (var variable in frame.variables) {
       final int declarationTokenPos = variable['declarationTokenPos'];
       final String name = variable['name'];
-      final String token = script.getToken(declarationTokenPos);
+      final String? token = script.getToken(declarationTokenPos);
       // When running from an appjit snapshot, sources aren't available so the returned token will
       // be null.
       if (token != null) {
@@ -90,7 +90,7 @@
     // Grab the top frame.
     Frame frame = stack['frames'][0];
     // Grab the script.
-    Script script = frame.location.script;
+    Script script = frame.location!.script;
     await script.load();
 
     // Ensure that the token at each declaration position is the name of the
@@ -99,7 +99,7 @@
     for (var variable in frame.variables) {
       final int declarationTokenPos = variable['declarationTokenPos'];
       final String name = variable['name'];
-      final String token = script.getToken(declarationTokenPos);
+      final String? token = script.getToken(declarationTokenPos);
       // When running from an appjit snapshot, sources aren't available so the returned token will
       // be null.
       if (token != null) {
diff --git a/runtime/observatory/tests/service/logging_test.dart b/runtime/observatory/tests/service/logging_test.dart
index 84fa6b1..ba585a8 100644
--- a/runtime/observatory/tests/service/logging_test.dart
+++ b/runtime/observatory/tests/service/logging_test.dart
@@ -34,18 +34,18 @@
   hasStoppedAtBreakpoint,
   resumeIsolateAndAwaitEvent(Isolate.kLoggingStream, (ServiceEvent event) {
     expect(event.kind, equals(ServiceEvent.kLogging));
-    expect(event.logRecord['sequenceNumber'], equals(0));
-    expect(event.logRecord['message'].valueAsString, equals('Hey Buddy!'));
-    expect(event.logRecord['level'], equals(Level.FINE));
-    expect(event.logRecord['time'], isA<DateTime>());
+    expect(event.logRecord!['sequenceNumber'], equals(0));
+    expect(event.logRecord!['message'].valueAsString, equals('Hey Buddy!'));
+    expect(event.logRecord!['level'], equals(Level.FINE));
+    expect(event.logRecord!['time'], isA<DateTime>());
   }),
   hasStoppedAtBreakpoint,
   resumeIsolateAndAwaitEvent(Isolate.kLoggingStream, (ServiceEvent event) {
     expect(event.kind, equals(ServiceEvent.kLogging));
-    expect(event.logRecord['sequenceNumber'], equals(1));
-    expect(event.logRecord['level'], equals(Level.INFO));
-    expect(event.logRecord['message'].valueAsString, equals('YES'));
-    expect(event.logRecord['time'], isA<DateTime>());
+    expect(event.logRecord!['sequenceNumber'], equals(1));
+    expect(event.logRecord!['level'], equals(Level.INFO));
+    expect(event.logRecord!['message'].valueAsString, equals('YES'));
+    expect(event.logRecord!['time'], isA<DateTime>());
   }),
 ];
 
diff --git a/runtime/observatory/tests/service/malformed_test.dart b/runtime/observatory/tests/service/malformed_test.dart
index 9e277c8..27b1456 100644
--- a/runtime/observatory/tests/service/malformed_test.dart
+++ b/runtime/observatory/tests/service/malformed_test.dart
@@ -8,7 +8,7 @@
 
 var tests = <IsolateTest>[
   (Isolate isolate) async {
-    bool caughtException;
+    bool caughtException = false;
     try {
       await isolate.invokeRpc('_respondWithMalformedObject', {});
       expect(false, isTrue, reason: 'Unreachable');
@@ -21,7 +21,7 @@
 
   // Do this test last... it kills the vm connection.
   (Isolate isolate) async {
-    bool caughtException;
+    bool caughtException = false;
     try {
       await isolate.invokeRpc('_respondWithMalformedJson', {});
       expect(false, isTrue, reason: 'Unreachable');
diff --git a/runtime/observatory/tests/service/metrics_test.dart b/runtime/observatory/tests/service/metrics_test.dart
index b35806c..95c0e1f 100644
--- a/runtime/observatory/tests/service/metrics_test.dart
+++ b/runtime/observatory/tests/service/metrics_test.dart
@@ -25,12 +25,12 @@
   (Isolate isolate) async {
     var params = {'metricId': 'metrics/a.b.c'};
     ServiceMetric counter =
-        await isolate.invokeRpc('_getIsolateMetric', params);
+        await isolate.invokeRpc('_getIsolateMetric', params) as ServiceMetric;
     expect(counter.name, equals('a.b.c'));
     expect(counter.value, equals(1234.5));
   },
   (Isolate isolate) async {
-    bool caughtException;
+    bool caughtException = false;
     try {
       await isolate
           .invokeRpc('_getIsolateMetric', {'metricId': 'metrics/a.b.d'});
diff --git a/runtime/observatory/tests/service/mirror_references_test.dart b/runtime/observatory/tests/service/mirror_references_test.dart
index 1567d2d..9dc5fb7 100644
--- a/runtime/observatory/tests/service/mirror_references_test.dart
+++ b/runtime/observatory/tests/service/mirror_references_test.dart
@@ -11,14 +11,14 @@
 
 class Foo {}
 
-Foo foo;
-var /*MirrorReference*/ ref;
+dynamic /*Foo*/ foo;
+dynamic /*MirrorReference*/ ref;
 
 void script() {
   foo = new Foo();
   ClassMirror fooClassMirror = reflectClass(Foo);
   InstanceMirror fooClassMirrorMirror = reflect(fooClassMirror);
-  LibraryMirror libmirrors = fooClassMirrorMirror.type.owner;
+  LibraryMirror libmirrors = fooClassMirrorMirror.type.owner as LibraryMirror;
   ref = reflect(fooClassMirror)
       .getField(MirrorSystem.getSymbol('_reflectee', libmirrors))
       .reflectee;
@@ -26,20 +26,20 @@
 
 var tests = <IsolateTest>[
   (Isolate isolate) async {
-    Library lib = await isolate.rootLibrary.load();
+    Library lib = await isolate.rootLibrary.load() as Library;
     Field fooField = lib.variables.singleWhere((v) => v.name == 'foo');
     await fooField.load();
-    Instance foo = fooField.staticValue;
+    Instance foo = fooField.staticValue as Instance;
     Field refField = lib.variables.singleWhere((v) => v.name == 'ref');
     await refField.load();
-    Instance ref = refField.staticValue;
+    Instance ref = refField.staticValue as Instance;
 
     expect(foo.isMirrorReference, isFalse);
     expect(ref.isMirrorReference, isTrue);
     expect(ref.referent, isNull);
-    Instance loadedRef = await ref.load();
+    Instance loadedRef = await ref.load() as Instance;
     expect(loadedRef.referent, isNotNull);
-    expect(loadedRef.referent.name, equals('Foo'));
+    expect(loadedRef.referent!.name, equals('Foo'));
     expect(loadedRef.referent, equals(foo.clazz));
   },
 ];
diff --git a/runtime/observatory/tests/service/native_metrics_test.dart b/runtime/observatory/tests/service/native_metrics_test.dart
index 0cb1394..c200a4a 100644
--- a/runtime/observatory/tests/service/native_metrics_test.dart
+++ b/runtime/observatory/tests/service/native_metrics_test.dart
@@ -26,12 +26,12 @@
   (Isolate isolate) async {
     var params = {'metricId': 'metrics/native/heap.old.used'};
     ServiceMetric counter =
-        await isolate.invokeRpc('_getIsolateMetric', params);
+        await isolate.invokeRpc('_getIsolateMetric', params) as ServiceMetric;
     expect(counter.type, equals('Counter'));
     expect(counter.name, equals('heap.old.used'));
   },
   (Isolate isolate) async {
-    bool caughtException;
+    bool caughtException = false;
     try {
       await isolate.invokeRpc(
           '_getIsolateMetric', {'metricId': 'metrics/native/doesnotexist'});
diff --git a/runtime/observatory/tests/service/network_profiling_test.dart b/runtime/observatory/tests/service/network_profiling_test.dart
index 352d1b2..3a318ca 100644
--- a/runtime/observatory/tests/service/network_profiling_test.dart
+++ b/runtime/observatory/tests/service/network_profiling_test.dart
@@ -32,14 +32,14 @@
   var socket = await io.Socket.connect(localhost, serverSocket.port);
   socket.write(content);
   await socket.flush();
-  await socket.destroy();
+  socket.destroy();
 
   // rawDatagram
   final doneCompleter = Completer<void>();
   var server = await io.RawDatagramSocket.bind(localhost, 0);
   server.listen((io.RawSocketEvent event) {
     if (event == io.RawSocketEvent.read) {
-      io.Datagram dg = server.receive();
+      io.Datagram dg = server.receive()!;
       if (!doneCompleter.isCompleted) {
         doneCompleter.complete();
       }
@@ -56,11 +56,14 @@
   postEvent('socketTest', {'socket': 'test'});
 }
 
-Future<void> checkFinishEvent(ServiceEvent event) {
+bool checkFinishEvent(ServiceEvent event) {
   expect(event.kind, equals(ServiceEvent.kExtension));
-  expect(event.extensionKind, equals('socketTest'));
+  if (event.extensionKind != 'socketTest') {
+    return false;
+  }
   expect(event.extensionData, isA<Map>());
-  expect(event.extensionData['socket'], equals('test'));
+  expect(event.extensionData!['socket'], equals('test'));
+  return true;
 }
 
 var tests = <IsolateTest>[
@@ -102,9 +105,10 @@
     var sub;
     sub = await isolate.vm.listenEventStream(Isolate.kExtensionStream,
         (ServiceEvent event) {
-      checkFinishEvent(event);
-      sub.cancel();
-      completer.complete();
+      if (checkFinishEvent(event)) {
+        sub.cancel();
+        completer.complete();
+      }
     });
 
     dynamic result = await isolate.invokeRpc("invoke",
@@ -150,9 +154,10 @@
       completer = Completer();
       sub = await isolate.vm.listenEventStream(Isolate.kExtensionStream,
           (ServiceEvent event) {
-        checkFinishEvent(event);
-        sub.cancel();
-        completer.complete();
+        if (checkFinishEvent(event)) {
+          sub.cancel();
+          completer.complete();
+        }
       });
       dynamic result = await isolate.invokeRpc("invoke",
           {"targetId": lib.id, "selector": "socketTest", "argumentIds": []});
@@ -197,9 +202,10 @@
     var sub;
     sub = await isolate.vm.listenEventStream(Isolate.kExtensionStream,
         (ServiceEvent event) {
-      checkFinishEvent(event);
-      sub.cancel();
-      completer.complete();
+      if (checkFinishEvent(event)) {
+        sub.cancel();
+        completer.complete();
+      }
     });
 
     dynamic result = await isolate.invokeRpc("invoke",
diff --git a/runtime/observatory/tests/service/next_through_assign_call_test.dart b/runtime/observatory/tests/service/next_through_assign_call_test.dart
index 3b815d2..439d2eb 100644
--- a/runtime/observatory/tests/service/next_through_assign_call_test.dart
+++ b/runtime/observatory/tests/service/next_through_assign_call_test.dart
@@ -9,16 +9,16 @@
 const String file = "next_through_assign_call_test.dart";
 
 code() {
-  int a;
-  int b;
+  int? a;
+  int? b;
   a = b = foo();
   print(a);
   print(b);
   a = foo();
   print(a);
-  int d = foo();
+  int? d = foo();
   print(d);
-  int e = foo(), f, g = foo();
+  int? e = foo(), f, g = foo();
   print(e);
   print(f);
   print(g);
@@ -30,18 +30,18 @@
 
 List<String> stops = [];
 List<String> expected = [
-  "$file:${LINE_A+0}:7", // on variable 'a'
-  "$file:${LINE_A+1}:7", // on variable 'b'
+  "$file:${LINE_A+0}:8", // on variable 'a'
+  "$file:${LINE_A+1}:8", // on variable 'b'
   "$file:${LINE_A+2}:11", // on call to 'foo'
   "$file:${LINE_A+3}:3", // on call to 'print'
   "$file:${LINE_A+4}:3", // on call to 'print'
   "$file:${LINE_A+5}:7", // on call to 'foo'
   "$file:${LINE_A+6}:3", // on call to 'print'
-  "$file:${LINE_A+7}:11", // on call to 'foo'
+  "$file:${LINE_A+7}:12", // on call to 'foo'
   "$file:${LINE_A+8}:3", // on call to 'print'
-  "$file:${LINE_A+9}:11", // on first call to 'foo'
-  "$file:${LINE_A+9}:18", // on variable 'f'
-  "$file:${LINE_A+9}:25", // on second call to 'foo'
+  "$file:${LINE_A+9}:12", // on first call to 'foo'
+  "$file:${LINE_A+9}:19", // on variable 'f'
+  "$file:${LINE_A+9}:26", // on second call to 'foo'
   "$file:${LINE_A+10}:3", // on call to 'print'
   "$file:${LINE_A+11}:3", // on call to 'print'
   "$file:${LINE_A+12}:3", // on call to 'print'
diff --git a/runtime/observatory/tests/service/next_through_assign_int_test.dart b/runtime/observatory/tests/service/next_through_assign_int_test.dart
index c57fd84..d5029e2 100644
--- a/runtime/observatory/tests/service/next_through_assign_int_test.dart
+++ b/runtime/observatory/tests/service/next_through_assign_int_test.dart
@@ -9,16 +9,16 @@
 const String file = "next_through_assign_int_test.dart";
 
 code() {
-  int a;
-  int b;
+  int? a;
+  int? b;
   a = b = 42;
   print(a);
   print(b);
   a = 42;
   print(a);
-  int d = 42;
+  int? d = 42;
   print(d);
-  int e = 41, f, g = 42;
+  int? e = 41, f, g = 42;
   print(e);
   print(f);
   print(g);
@@ -26,18 +26,18 @@
 
 List<String> stops = [];
 List<String> expected = [
-  "$file:${LINE_A+0}:7", // on variable 'a'
-  "$file:${LINE_A+1}:7", // on variable 'b'
+  "$file:${LINE_A+0}:8", // on variable 'a'
+  "$file:${LINE_A+1}:8", // on variable 'b'
   "$file:${LINE_A+2}:7", // on 'b'
   "$file:${LINE_A+3}:3", // on call to 'print'
   "$file:${LINE_A+4}:3", // on call to 'print'
   "$file:${LINE_A+5}:3", // on 'a'
   "$file:${LINE_A+6}:3", // on call to 'print'
-  "$file:${LINE_A+7}:9", // on '='
+  "$file:${LINE_A+7}:10", // on '='
   "$file:${LINE_A+8}:3", // on call to 'print'
-  "$file:${LINE_A+9}:9", // on first '='
-  "$file:${LINE_A+9}:15", // on 'f'
-  "$file:${LINE_A+9}:20", // on second '='
+  "$file:${LINE_A+9}:10", // on first '='
+  "$file:${LINE_A+9}:16", // on 'f'
+  "$file:${LINE_A+9}:21", // on second '='
   "$file:${LINE_A+10}:3", // on call to 'print'
   "$file:${LINE_A+11}:3", // on call to 'print'
   "$file:${LINE_A+12}:3", // on call to 'print'
diff --git a/runtime/observatory/tests/service/next_through_create_list_and_map_test.dart b/runtime/observatory/tests/service/next_through_create_list_and_map_test.dart
index 523ef13..5dddf49 100644
--- a/runtime/observatory/tests/service/next_through_create_list_and_map_test.dart
+++ b/runtime/observatory/tests/service/next_through_create_list_and_map_test.dart
@@ -37,7 +37,7 @@
   };
   print(myList);
   print(myConstList);
-  int lookup = myMap[1];
+  int lookup = myMap[1]!;
   print(lookup);
   print(myMap);
   print(myConstMap);
diff --git a/runtime/observatory/tests/service/object_graph_vm_test.dart b/runtime/observatory/tests/service/object_graph_vm_test.dart
index 9414709..a4bf3fe 100644
--- a/runtime/observatory/tests/service/object_graph_vm_test.dart
+++ b/runtime/observatory/tests/service/object_graph_vm_test.dart
@@ -16,9 +16,9 @@
   dynamic right;
 }
 
-Foo r;
+late Foo r;
 
-List lst;
+late List lst;
 
 void script() {
   // Create 3 instances of Foo, with out-degrees
@@ -30,10 +30,10 @@
   r.right = b;
   a.left = b;
 
-  lst = new List(2);
+  lst = new List<dynamic>.filled(2, null);
   lst[0] = lst; // Self-loop.
   // Larger than any other fixed-size list in a fresh heap.
-  lst[1] = new List(1234569);
+  lst[1] = new List<dynamic>.filled(1234569, null);
 }
 
 var tests = <IsolateTest>[
diff --git a/runtime/observatory/tests/service/observatory_test_package/pubspec.yaml b/runtime/observatory/tests/service/observatory_test_package/pubspec.yaml
index db61a01f..20169fd 100644
--- a/runtime/observatory/tests/service/observatory_test_package/pubspec.yaml
+++ b/runtime/observatory/tests/service/observatory_test_package/pubspec.yaml
@@ -1,4 +1,4 @@
 name: observatory_test_package
 publish_to: none
 environment:
-  sdk: '^2.7.0'
+  sdk: '>=2.9.0 <3.0.0'
diff --git a/runtime/observatory/tests/service/parameters_in_scope_at_entry_test.dart b/runtime/observatory/tests/service/parameters_in_scope_at_entry_test.dart
index 03285f4..48cacd2 100644
--- a/runtime/observatory/tests/service/parameters_in_scope_at_entry_test.dart
+++ b/runtime/observatory/tests/service/parameters_in_scope_at_entry_test.dart
@@ -43,7 +43,7 @@
     var stack = await isolate.getStack();
     Frame top = stack['frames'][0];
     print(top);
-    expect(top.function.name, equals("foo"));
+    expect(top.function!.name, equals("foo"));
     print(top.variables);
     expect(top.variables.length, equals(1));
     var param = top.variables[0];
@@ -59,7 +59,7 @@
     var stack = await isolate.getStack();
     Frame top = stack['frames'][0];
     print(top);
-    expect(top.function.name, equals("theClosureFunction"));
+    expect(top.function!.name, equals("theClosureFunction"));
     print(top.variables);
     expect(top.variables.length, equals(1));
     var param = top.variables[0];
diff --git a/runtime/observatory/tests/service/pause_on_exceptions_test.dart b/runtime/observatory/tests/service/pause_on_exceptions_test.dart
index 05dae04..35bd59e 100644
--- a/runtime/observatory/tests/service/pause_on_exceptions_test.dart
+++ b/runtime/observatory/tests/service/pause_on_exceptions_test.dart
@@ -25,7 +25,7 @@
 
 var tests = <IsolateTest>[
   (Isolate isolate) async {
-    Library lib = await isolate.rootLibrary.reload();
+    Library lib = await isolate.rootLibrary.reload() as Library;
 
     var onPaused = null;
     var onResume = null;
diff --git a/runtime/observatory/tests/service/pause_on_start_and_exit_test.dart b/runtime/observatory/tests/service/pause_on_start_and_exit_test.dart
index f1aff65..508d7a8 100644
--- a/runtime/observatory/tests/service/pause_on_start_and_exit_test.dart
+++ b/runtime/observatory/tests/service/pause_on_start_and_exit_test.dart
@@ -41,13 +41,13 @@
     print('Done waiting for pause event.');
 
     // Grab the timestamp.
-    var pausetime1 = isolate.pauseEvent.timestamp;
+    var pausetime1 = isolate.pauseEvent!.timestamp;
     expect(pausetime1, isNotNull);
     // Reload the isolate.
     await isolate.reload();
     // Verify that it is the same.
     expect(pausetime1.millisecondsSinceEpoch,
-        equals(isolate.pauseEvent.timestamp.millisecondsSinceEpoch));
+        equals(isolate.pauseEvent!.timestamp.millisecondsSinceEpoch));
 
     completer = new Completer();
     stream = await isolate.vm.getEventStream(VM.kDebugStream);
@@ -66,13 +66,13 @@
     await completer.future;
 
     // Grab the timestamp.
-    var pausetime2 = isolate.pauseEvent.timestamp;
+    var pausetime2 = isolate.pauseEvent!.timestamp;
     expect(pausetime2, isNotNull);
     // Reload the isolate.
     await isolate.reload();
     // Verify that it is the same.
     expect(pausetime2.millisecondsSinceEpoch,
-        equals(isolate.pauseEvent.timestamp.millisecondsSinceEpoch));
+        equals(isolate.pauseEvent!.timestamp.millisecondsSinceEpoch));
     expect(pausetime2.millisecondsSinceEpoch,
         greaterThan(pausetime1.millisecondsSinceEpoch));
   },
diff --git a/runtime/observatory/tests/service/pause_on_start_then_step_test.dart b/runtime/observatory/tests/service/pause_on_start_then_step_test.dart
index 93cefb4..17707c6 100644
--- a/runtime/observatory/tests/service/pause_on_start_then_step_test.dart
+++ b/runtime/observatory/tests/service/pause_on_start_then_step_test.dart
@@ -41,13 +41,13 @@
     print('Done waiting for pause event.');
 
     // Grab the timestamp.
-    var pausetime1 = isolate.pauseEvent.timestamp;
+    var pausetime1 = isolate.pauseEvent!.timestamp;
     expect(pausetime1, isNotNull);
     // Reload the isolate.
     await isolate.reload();
     // Verify that it is the same.
     expect(pausetime1.millisecondsSinceEpoch,
-        equals(isolate.pauseEvent.timestamp.millisecondsSinceEpoch));
+        equals(isolate.pauseEvent!.timestamp.millisecondsSinceEpoch));
 
     completer = new Completer();
     stream = await isolate.vm.getEventStream(VM.kDebugStream);
@@ -69,7 +69,7 @@
 
     // Grab the timestamp.
     print('Getting pausevent timestamp');
-    var pausetime2 = isolate.pauseEvent.timestamp;
+    var pausetime2 = isolate.pauseEvent!.timestamp;
     expect(pausetime2, isNotNull);
     // Reload the isolate.
     print('Reloading isolate');
@@ -77,7 +77,7 @@
     print('Reload finished');
     // Verify that it is the same.
     expect(pausetime2.millisecondsSinceEpoch,
-        equals(isolate.pauseEvent.timestamp.millisecondsSinceEpoch));
+        equals(isolate.pauseEvent!.timestamp.millisecondsSinceEpoch));
 
     expect(pausetime2.millisecondsSinceEpoch,
         greaterThan(pausetime1.millisecondsSinceEpoch));
diff --git a/runtime/observatory/tests/service/process_service_test.dart b/runtime/observatory/tests/service/process_service_test.dart
index 8840ef1..c9f2a85 100644
--- a/runtime/observatory/tests/service/process_service_test.dart
+++ b/runtime/observatory/tests/service/process_service_test.dart
@@ -24,19 +24,19 @@
     '--pause_isolates_on_start',
     io.Platform.script.toFilePath(),
   ];
-  io.Process process1;
-  io.Process process2;
-  io.Process process3;
+  io.Process? process1;
+  io.Process? process2;
+  io.Process? process3;
 
   void closeDown() {
     if (process1 != null) {
-      process1.kill();
+      process1!.kill();
     }
     if (process2 != null) {
-      process2.kill();
+      process2!.kill();
     }
     if (process3 != null) {
-      process3.kill();
+      process3!.kill();
     }
     dir.deleteSync(recursive: true);
   }
@@ -70,14 +70,14 @@
 
     final result = jsonEncode({
       'type': 'foobar',
-      'pids': [process1.pid, process2.pid, process3.pid]
+      'pids': [process1!.pid, process2!.pid, process3!.pid]
     });
     return Future.value(ServiceExtensionResponse.result(result));
   }
 
   Future<ServiceExtensionResponse> closeStdin(ignored_a, ignored_b) {
-    process3.stdin.close();
-    return process3.exitCode.then<ServiceExtensionResponse>((int exit) {
+    process3!.stdin.close();
+    return process3!.exitCode.then<ServiceExtensionResponse>((int exit) {
       final result = jsonEncode({'type': 'foobar'});
       return ServiceExtensionResponse.result(result);
     });
diff --git a/runtime/observatory/tests/service/reachable_size_test.dart b/runtime/observatory/tests/service/reachable_size_test.dart
index bca88d8..8cf9f9e 100644
--- a/runtime/observatory/tests/service/reachable_size_test.dart
+++ b/runtime/observatory/tests/service/reachable_size_test.dart
@@ -11,34 +11,34 @@
 class Pair {
   // Make sure these fields are not removed by the tree shaker.
   @pragma("vm:entry-point")
-  var x;
+  dynamic x;
   @pragma("vm:entry-point")
-  var y;
+  dynamic y;
 }
 
-var p1;
-var p2;
+dynamic p1;
+dynamic p2;
 
 buildGraph() {
   p1 = new Pair();
   p2 = new Pair();
 
   // Adds to both reachable and retained size.
-  p1.x = new List();
-  p2.x = new List();
+  p1.x = <dynamic>[];
+  p2.x = <dynamic>[];
 
   // Adds to reachable size only.
-  p1.y = p2.y = new List();
+  p1.y = p2.y = <dynamic>[];
 }
 
 Future<int> getReachableSize(ServiceObject obj) async {
-  Instance size = await obj.isolate.getReachableSize(obj);
-  return int.parse(size.valueAsString);
+  Instance size = await obj.isolate!.getReachableSize(obj) as Instance;
+  return int.parse(size.valueAsString!);
 }
 
 Future<int> getRetainedSize(ServiceObject obj) async {
-  Instance size = await obj.isolate.getRetainedSize(obj);
-  return int.parse(size.valueAsString);
+  Instance size = await obj.isolate!.getRetainedSize(obj) as Instance;
+  return int.parse(size.valueAsString!);
 }
 
 var tests = <IsolateTest>[
@@ -49,7 +49,7 @@
     // In general, shallow <= retained <= reachable. In this program,
     // 0 < shallow < retained < reachable.
 
-    int p1_shallow = p1.size;
+    int p1_shallow = p1.size!;
     int p1_retained = await getRetainedSize(p1);
     int p1_reachable = await getReachableSize(p1);
 
@@ -57,7 +57,7 @@
     expect(p1_shallow, lessThan(p1_retained));
     expect(p1_retained, lessThan(p1_reachable));
 
-    int p2_shallow = p2.size;
+    int p2_shallow = p2.size!;
     int p2_retained = await getRetainedSize(p2);
     int p2_reachable = await getReachableSize(p2);
 
diff --git a/runtime/observatory/tests/service/regexp_function_test.dart b/runtime/observatory/tests/service/regexp_function_test.dart
index d11abe0..bf2e5be 100644
--- a/runtime/observatory/tests/service/regexp_function_test.dart
+++ b/runtime/observatory/tests/service/regexp_function_test.dart
@@ -34,26 +34,26 @@
 
     Field field = lib.variables.singleWhere((v) => v.name == 'regex');
     await field.load();
-    Instance regex = field.staticValue;
+    Instance regex = field.staticValue as Instance;
     expect(regex.isInstance, isTrue);
     expect(regex.isRegExp, isTrue);
     await regex.load();
 
     if (regex.oneByteFunction == null) {
       // Running with interpreted regexp.
-      var b1 = await regex.oneByteBytecode.load();
+      var b1 = await regex.oneByteBytecode!.load();
       expect(b1.isTypedData, isTrue);
-      var b2 = await regex.twoByteBytecode.load();
+      var b2 = await regex.twoByteBytecode!.load();
       expect(b2.isTypedData, isFalse); // No two-byte string subject was used.
     } else {
       // Running with compiled regexp.
-      var f1 = await regex.oneByteFunction.load();
+      var f1 = await regex.oneByteFunction!.load();
       expect(f1 is ServiceFunction, isTrue);
-      var f2 = await regex.twoByteFunction.load();
+      var f2 = await regex.twoByteFunction!.load();
       expect(f2 is ServiceFunction, isTrue);
-      var f3 = await regex.externalOneByteFunction.load();
+      var f3 = await regex.externalOneByteFunction!.load();
       expect(f3 is ServiceFunction, isTrue);
-      var f4 = await regex.externalTwoByteFunction.load();
+      var f4 = await regex.externalTwoByteFunction!.load();
       expect(f4 is ServiceFunction, isTrue);
     }
   }
diff --git a/runtime/observatory/tests/service/regress_34841_test.dart b/runtime/observatory/tests/service/regress_34841_test.dart
index 05bb56a..6a7310e 100644
--- a/runtime/observatory/tests/service/regress_34841_test.dart
+++ b/runtime/observatory/tests/service/regress_34841_test.dart
@@ -57,8 +57,8 @@
 
     // Make sure we can translate it all.
     for (int place in coveragePlaces) {
-      int line = script.tokenToLine(place);
-      int column = script.tokenToCol(place);
+      int? line = script.tokenToLine(place);
+      int? column = script.tokenToCol(place);
       if (line == null || column == null) {
         throw "Token $place translated to $line:$column";
       }
diff --git a/runtime/observatory/tests/service/rewind_optimized_out_test.dart b/runtime/observatory/tests/service/rewind_optimized_out_test.dart
index 97aca1c..21cf92a 100644
--- a/runtime/observatory/tests/service/rewind_optimized_out_test.dart
+++ b/runtime/observatory/tests/service/rewind_optimized_out_test.dart
@@ -16,7 +16,7 @@
 int global = 0;
 
 @pragma('vm:never-inline')
-b3(x) {
+b3(int x) {
   int sum = 0;
   try {
     for (int i = 0; i < x; i++) {
@@ -49,13 +49,13 @@
   stoppedAtLine(LINE_A),
   (Isolate isolate) async {
     // We are at our breakpoint with global=100.
-    Instance result = await isolate.rootLibrary.evaluate('global');
+    Instance result = await isolate.rootLibrary.evaluate('global') as Instance;
     print('global is $result');
     expect(result.type, equals('Instance'));
     expect(result.valueAsString, equals('100'));
 
     // Rewind the top stack frame.
-    bool caughtException;
+    bool caughtException = false;
     try {
       result = await isolate.rewind(1);
       expect(false, isTrue, reason: 'Unreachable');
diff --git a/runtime/observatory/tests/service/rewind_test.dart b/runtime/observatory/tests/service/rewind_test.dart
index 87e46ec..5ec932d 100644
--- a/runtime/observatory/tests/service/rewind_test.dart
+++ b/runtime/observatory/tests/service/rewind_test.dart
@@ -16,7 +16,7 @@
 int global = 0;
 
 @pragma('vm:never-inline')
-b3(x) {
+b3(int x) {
   int sum = 0;
   try {
     for (int i = 0; i < x; i++) {
@@ -49,7 +49,7 @@
   stoppedAtLine(LINE_A),
   (Isolate isolate) async {
     // We are not able to rewind frame 0.
-    bool caughtException;
+    bool caughtException = false;
     try {
       await isolate.rewind(0);
       expect(false, isTrue, reason: 'Unreachable');
@@ -62,7 +62,7 @@
   },
   (Isolate isolate) async {
     // We are not able to rewind frame 13.
-    bool caughtException;
+    bool caughtException = false;
     try {
       await isolate.rewind(13);
       expect(false, isTrue, reason: 'Unreachable');
@@ -75,7 +75,7 @@
   },
   (Isolate isolate) async {
     // We are at our breakpoint with global=100.
-    Instance result = await isolate.rootLibrary.evaluate('global');
+    Instance result = await isolate.rootLibrary.evaluate('global') as Instance;
     print('global is $result');
     expect(result.type, equals('Instance'));
     expect(result.valueAsString, equals('100'));
@@ -94,7 +94,7 @@
   stoppedAtLine(LINE_A),
   (Isolate isolate) async {
     // global still is equal to 100.  We did not execute "global++".
-    Instance result = await isolate.rootLibrary.evaluate('global');
+    Instance result = await isolate.rootLibrary.evaluate('global') as Instance;
     print('global is $result');
     expect(result.type, equals('Instance'));
     expect(result.valueAsString, equals('100'));
@@ -107,7 +107,8 @@
   stoppedAtLine(LINE_D),
   (Isolate isolate) async {
     // Reset global to 0 and start again.
-    Instance result = await isolate.rootLibrary.evaluate('global=0');
+    Instance result =
+        await isolate.rootLibrary.evaluate('global=0') as Instance;
     print('set global to $result');
     expect(result.type, equals('Instance'));
     expect(result.valueAsString, equals('0'));
@@ -119,7 +120,7 @@
   stoppedAtLine(LINE_A),
   (Isolate isolate) async {
     // We are at our breakpoint with global=100.
-    Instance result = await isolate.rootLibrary.evaluate('global');
+    Instance result = await isolate.rootLibrary.evaluate('global') as Instance;
     print('global is $result');
     expect(result.type, equals('Instance'));
     expect(result.valueAsString, equals('100'));
diff --git a/runtime/observatory/tests/service/service_kernel.status b/runtime/observatory/tests/service/service_kernel.status
index 9e721f2..8c09f06 100644
--- a/runtime/observatory/tests/service/service_kernel.status
+++ b/runtime/observatory/tests/service/service_kernel.status
@@ -111,6 +111,7 @@
 get_object_rpc_test: SkipByDesign
 get_source_report_test: Skip, Timeout
 get_source_report_with_mixin_test: Skip, Timeout
+get_stack_limit_rpc_test: Skip, Timeout
 get_stack_rpc_test: Skip, Timeout
 implicit_getter_setter_test: SkipByDesign
 invoke_test: Skip, Timeout
diff --git a/runtime/observatory/tests/service/service_test_common.dart b/runtime/observatory/tests/service/service_test_common.dart
index 4c4a087..0189540 100644
--- a/runtime/observatory/tests/service/service_test_common.dart
+++ b/runtime/observatory/tests/service/service_test_common.dart
@@ -29,7 +29,7 @@
 }
 
 Future cancelStreamSubscription(String streamName) async {
-  StreamSubscription subscription = streamSubscriptions[streamName];
+  StreamSubscription subscription = streamSubscriptions[streamName]!;
   subscription.cancel();
   streamSubscriptions.remove(streamName);
 }
@@ -73,12 +73,12 @@
 
 Future asyncStepOver(Isolate isolate) async {
   final Completer pausedAtSyntheticBreakpoint = new Completer();
-  StreamSubscription subscription;
+  StreamSubscription? subscription;
 
   // Cancel the subscription.
   cancelSubscription() {
     if (subscription != null) {
-      subscription.cancel();
+      subscription!.cancel();
       subscription = null;
     }
   }
@@ -99,13 +99,13 @@
     return pausedAtSyntheticBreakpoint.future;
   }
 
-  Breakpoint syntheticBreakpoint;
+  Breakpoint? syntheticBreakpoint;
 
   subscription = stream.listen((ServiceEvent event) async {
     // Synthetic breakpoint add event. This is the first event we will
     // receive.
     bool isAdd = (event.kind == ServiceEvent.kBreakpointAdded) &&
-        (event.breakpoint.isSyntheticAsyncContinuation) &&
+        (event.breakpoint!.isSyntheticAsyncContinuation!) &&
         (event.owner == isolate);
     // Resume after synthetic breakpoint added. This is the second event
     // we will receive.
@@ -140,7 +140,7 @@
   return pausedAtSyntheticBreakpoint.future;
 }
 
-bool isEventOfKind(M.Event event, String kind) {
+bool isEventOfKind(M.Event? event, String kind) {
   switch (kind) {
     case ServiceEvent.kPauseBreakpoint:
       return event is M.PauseBreakpointEvent;
@@ -159,7 +159,7 @@
 
 Future hasPausedFor(Isolate isolate, String kind) {
   // Set up a listener to wait for breakpoint events.
-  Completer completer = new Completer();
+  Completer? completer = new Completer();
   isolate.vm.getEventStream(VM.kDebugStream).then((stream) {
     var subscription;
     subscription = stream.listen((ServiceEvent event) {
@@ -168,7 +168,7 @@
           // Reload to update isolate.pauseEvent.
           print('Paused with $kind');
           subscription.cancel();
-          completer.complete(isolate.reload());
+          completer!.complete(isolate.reload());
           completer = null;
         }
       }
@@ -177,19 +177,19 @@
     // Pause may have happened before we subscribed.
     isolate.reload().then((_) {
       if ((isolate.pauseEvent != null) &&
-          isEventOfKind(isolate.pauseEvent, kind)) {
+          isEventOfKind(isolate.pauseEvent!, kind)) {
         // Already waiting at a breakpoint.
         if (completer != null) {
           print('Paused with $kind');
           subscription.cancel();
-          completer.complete(isolate);
+          completer!.complete(isolate);
           completer = null;
         }
       }
     });
   });
 
-  return completer.future; // Will complete when breakpoint hit.
+  return completer!.future; // Will complete when breakpoint hit.
 }
 
 Future hasStoppedAtBreakpoint(Isolate isolate) {
@@ -216,13 +216,12 @@
   await isolate.reload();
   for (Library lib in isolate.libraries) {
     await lib.load();
-    if (lib.uri.startsWith('dart:') && !lib.uri.startsWith('dart:_')) {
+    if (lib.uri!.startsWith('dart:') && !lib.uri!.startsWith('dart:_')) {
       var setDebugParams = {
         'libraryId': lib.id,
         'isDebuggable': true,
       };
-      Map<String, dynamic> result = await isolate.invokeRpcNoUpgrade(
-          'setLibraryDebuggable', setDebugParams);
+      await isolate.invokeRpcNoUpgrade('setLibraryDebuggable', setDebugParams);
     }
   }
   return isolate;
@@ -242,7 +241,7 @@
 IsolateTest setBreakpointAtLine(int line) {
   return (Isolate isolate) async {
     print("Setting breakpoint for line $line");
-    Library lib = await isolate.rootLibrary.load();
+    Library lib = await isolate.rootLibrary.load() as Library;
     Script script = lib.scripts.firstWhere((s) => s.uri == lib.uri);
 
     Breakpoint bpt = await isolate.addBreakpoint(script, line);
@@ -255,7 +254,7 @@
 IsolateTest setBreakpointAtLineColumn(int line, int column) {
   return (Isolate isolate) async {
     print("Setting breakpoint for line $line column $column");
-    Library lib = await isolate.rootLibrary.load();
+    Library lib = await isolate.rootLibrary.load() as Library;
     Script script = lib.scripts.firstWhere((s) => s.uri == lib.uri);
 
     Breakpoint bpt = await isolate.addBreakpoint(script, line, column);
@@ -290,14 +289,14 @@
     expect(frames.length, greaterThanOrEqualTo(1));
 
     Frame top = frames[0];
-    Script script = await top.location.script.load();
-    int actualLine = script.tokenToLine(top.location.tokenPos);
+    Script script = await top.location!.script.load() as Script;
+    int? actualLine = script.tokenToLine(top.location!.tokenPos);
     if (actualLine != line) {
       StringBuffer sb = new StringBuffer();
       sb.write("Expected to be at line $line but actually at line $actualLine");
       sb.write("\nFull stack trace:\n");
       for (Frame f in stack['frames']) {
-        sb.write(" $f [${await f.location.getLine()}]\n");
+        sb.write(" $f [${await f.location!.getLine()}]\n");
       }
       throw sb.toString();
     } else {
@@ -318,11 +317,12 @@
     expect(frames.length, greaterThanOrEqualTo(1));
 
     Frame topFrame = frames[0];
-    ServiceFunction function = await topFrame.function.load();
-    String name = function.name;
+    ServiceFunction function =
+        await topFrame.function!.load() as ServiceFunction;
+    String name = function.name!;
     if (includeOwner) {
       ServiceFunction owner =
-          await (function.dartOwner as ServiceObject).load();
+          await (function.dartOwner as ServiceObject).load() as ServiceFunction;
       name = '${owner.name}.$name';
     }
     final bool matches =
@@ -333,10 +333,10 @@
           "actually in function $name");
       sb.write("\nFull stack trace:\n");
       for (Frame f in frames) {
-        await f.function.load();
-        await (f.function.dartOwner as ServiceObject).load();
-        String name = f.function.name;
-        String ownerName = (f.function.dartOwner as ServiceObject).name;
+        await f.function!.load();
+        await (f.function!.dartOwner as ServiceObject).load();
+        String name = f.function!.name!;
+        String ownerName = (f.function!.dartOwner as ServiceObject).name!;
         sb.write(" $f [$name] [$ownerName]\n");
       }
       throw sb.toString();
@@ -436,8 +436,8 @@
   expect(isolate.running, true);
 }
 
-Future<Class> getClassFromRootLib(Isolate isolate, String className) async {
-  Library rootLib = await isolate.rootLibrary.load();
+Future<Class?> getClassFromRootLib(Isolate isolate, String className) async {
+  Library rootLib = await isolate.rootLibrary.load() as Library;
   for (Class cls in rootLib.classes) {
     if (cls.name == className) {
       return cls;
@@ -448,10 +448,10 @@
 
 Future<Instance> rootLibraryFieldValue(
     Isolate isolate, String fieldName) async {
-  Library rootLib = await isolate.rootLibrary.load();
+  Library rootLib = await isolate.rootLibrary.load() as Library;
   Field field = rootLib.variables.singleWhere((v) => v.name == fieldName);
   await field.load();
-  Instance value = field.staticValue;
+  Instance value = field.staticValue as Instance;
   await value.load();
   return value;
 }
@@ -465,9 +465,9 @@
       if (event.kind == ServiceEvent.kPauseBreakpoint) {
         await isolate.reload();
         // We are paused: Step further.
-        Frame frame = isolate.topFrame;
-        recordStops.add(await frame.location.toUserString());
-        if (event.atAsyncSuspension) {
+        Frame frame = isolate.topFrame!;
+        recordStops.add(await frame.location!.toUserString());
+        if (event.atAsyncSuspension!) {
           isolate.stepOverAsyncSuspension();
         } else {
           isolate.stepOver();
@@ -498,10 +498,10 @@
         List frames = stack['frames'];
         expect(frames.length, greaterThanOrEqualTo(2));
         Frame frame = frames[0];
-        String brokeAt = await frame.location.toUserString();
+        String brokeAt = await frame.location!.toUserString();
         if (includeCaller) {
           frame = frames[1];
-          String calledFrom = await frame.location.toUserString();
+          String calledFrom = await frame.location!.toUserString();
           recordStops.add("$brokeAt ($calledFrom)");
         } else {
           recordStops.add(brokeAt);
@@ -529,8 +529,8 @@
       if (event.kind == ServiceEvent.kPauseBreakpoint) {
         await isolate.reload();
         // We are paused: Step into further.
-        Frame frame = isolate.topFrame;
-        recordStops.add(await frame.location.toUserString());
+        Frame frame = isolate.topFrame!;
+        recordStops.add(await frame.location!.toUserString());
         isolate.stepInto();
       } else if (event.kind == ServiceEvent.kPauseExit) {
         // We are at the exit: The test is done.
@@ -547,8 +547,8 @@
     List<String> recordStops, List<String> expectedStops,
     {bool removeDuplicates = false,
     bool debugPrint = false,
-    String debugPrintFile,
-    int debugPrintLine}) {
+    String? debugPrintFile,
+    int? debugPrintLine}) {
   return (Isolate isolate) async {
     if (debugPrint) {
       for (int i = 0; i < recordStops.length; i++) {
@@ -577,7 +577,7 @@
       expectedStops = removeAdjacentDuplicates(expectedStops);
     }
 
-    // Single stepping in interpreted bytecode may record extra stops.
+    // Single stepping may record extra stops.
     // Allow the extra ones as long as the expected ones are recorded.
     int i = 0;
     int j = 0;
@@ -608,7 +608,7 @@
 
 List<String> removeAdjacentDuplicates(List<String> fromList) {
   List<String> result = <String>[];
-  String latestLine;
+  String? latestLine;
   for (String s in fromList) {
     if (s == latestLine) continue;
     latestLine = s;
diff --git a/runtime/observatory/tests/service/set_library_debuggable_rpc_test.dart b/runtime/observatory/tests/service/set_library_debuggable_rpc_test.dart
index 1e2753e..c94aa2d 100644
--- a/runtime/observatory/tests/service/set_library_debuggable_rpc_test.dart
+++ b/runtime/observatory/tests/service/set_library_debuggable_rpc_test.dart
@@ -40,7 +40,7 @@
       'libraryId': 'libraries/9999999',
       'isDebuggable': false,
     };
-    bool caughtException;
+    bool caughtException = false;
     try {
       await isolate.invokeRpcNoUpgrade('setLibraryDebuggable', params);
       expect(false, isTrue, reason: 'Unreachable');
diff --git a/runtime/observatory/tests/service/set_library_debuggable_test.dart b/runtime/observatory/tests/service/set_library_debuggable_test.dart
index 4ffbcb6..7431778 100644
--- a/runtime/observatory/tests/service/set_library_debuggable_test.dart
+++ b/runtime/observatory/tests/service/set_library_debuggable_test.dart
@@ -49,8 +49,8 @@
       'libraryId': dartCore.id,
       'isDebuggable': false,
     };
-    Map<String, dynamic> result = await isolate.invokeRpcNoUpgrade(
-        'setLibraryDebuggable', setDebugParams);
+    var result = await isolate.invokeRpcNoUpgrade(
+        'setLibraryDebuggable', setDebugParams) as Map<String, dynamic>;
     expect(result['type'], equals('Success'));
     await dartCore.reload();
     expect(dartCore.debuggable, equals(false));
diff --git a/runtime/observatory/tests/service/set_name_rpc_test.dart b/runtime/observatory/tests/service/set_name_rpc_test.dart
index 1e4253d..5214832 100644
--- a/runtime/observatory/tests/service/set_name_rpc_test.dart
+++ b/runtime/observatory/tests/service/set_name_rpc_test.dart
@@ -16,8 +16,8 @@
     var subscription;
     subscription = stream.listen((ServiceEvent event) {
       if (event.kind == ServiceEvent.kIsolateUpdate) {
-        expect(event.owner.type, equals('Isolate'));
-        expect(event.owner.name, equals('Barbara'));
+        expect(event.owner!.type, equals('Isolate'));
+        expect(event.owner!.name, equals('Barbara'));
         subscription.cancel();
         completer.complete();
       }
diff --git a/runtime/observatory/tests/service/set_vm_name_rpc_test.dart b/runtime/observatory/tests/service/set_vm_name_rpc_test.dart
index 67ad461..0254209 100644
--- a/runtime/observatory/tests/service/set_vm_name_rpc_test.dart
+++ b/runtime/observatory/tests/service/set_vm_name_rpc_test.dart
@@ -17,8 +17,8 @@
     var subscription;
     subscription = stream.listen((ServiceEvent event) {
       if (event.kind == ServiceEvent.kVMUpdate) {
-        expect(event.owner.type, equals('VM'));
-        expect(event.owner.name, equals('Barbara'));
+        expect(event.owner!.type, equals('VM'));
+        expect(event.owner!.name, equals('Barbara'));
         subscription.cancel();
         completer.complete();
       }
diff --git a/runtime/observatory/tests/service/simple_reload_test.dart b/runtime/observatory/tests/service/simple_reload_test.dart
index f67c95d..e67c429 100644
--- a/runtime/observatory/tests/service/simple_reload_test.dart
+++ b/runtime/observatory/tests/service/simple_reload_test.dart
@@ -34,9 +34,9 @@
   await isolate.reload();
   Library lib = isolate.rootLibrary;
   await lib.load();
-  Instance result = await lib.evaluate('test()');
+  Instance result = await lib.evaluate('test()') as Instance;
   expect(result.isString, isTrue);
-  return result.valueAsString;
+  return result.valueAsString as String;
 }
 
 var tests = <IsolateTest>[
diff --git a/runtime/observatory/tests/service/step_through_setter_test.dart b/runtime/observatory/tests/service/step_through_setter_test.dart
index aa40fb1..bff5b7d 100644
--- a/runtime/observatory/tests/service/step_through_setter_test.dart
+++ b/runtime/observatory/tests/service/step_through_setter_test.dart
@@ -28,7 +28,7 @@
     _xyz = i - 1;
   }
 
-  get barXYZ => _xyz + 1;
+  int get barXYZ => _xyz + 1;
 }
 
 List<String> stops = [];
diff --git a/runtime/observatory/tests/service/string_escaping_test.dart b/runtime/observatory/tests/service/string_escaping_test.dart
index 31729de..d306186 100644
--- a/runtime/observatory/tests/service/string_escaping_test.dart
+++ b/runtime/observatory/tests/service/string_escaping_test.dart
@@ -57,15 +57,15 @@
 
   expectFullString(String varName, String varValueAsString) {
     Field field = lib.variables.singleWhere((v) => v.name == varName);
-    Instance value = field.staticValue;
+    Instance value = field.staticValue as Instance;
     expect(value.valueAsString, equals(varValueAsString));
     expect(value.valueAsStringIsTruncated, isFalse);
   }
 
   expectTruncatedString(String varName, String varValueAsString) {
     Field field = lib.variables.singleWhere((v) => v.name == varName);
-    Instance value = field.staticValue;
-    expect(varValueAsString, startsWith(value.valueAsString));
+    Instance value = field.staticValue as Instance;
+    expect(varValueAsString, startsWith(value.valueAsString!));
     expect(value.valueAsStringIsTruncated, isTrue);
   }
 
diff --git a/runtime/observatory/tests/service/test_helper.dart b/runtime/observatory/tests/service/test_helper.dart
index ecf4736..805e7fe 100644
--- a/runtime/observatory/tests/service/test_helper.dart
+++ b/runtime/observatory/tests/service/test_helper.dart
@@ -27,8 +27,8 @@
 
 /// Will be set to the http address of the VM's service protocol before
 /// any tests are invoked.
-String serviceHttpAddress;
-String serviceWebsocketAddress;
+late String serviceHttpAddress;
+late String serviceWebsocketAddress;
 
 const String _TESTEE_ENV_KEY = 'SERVICE_TEST_TESTEE';
 const Map<String, String> _TESTEE_SPAWN_ENV = const {_TESTEE_ENV_KEY: 'true'};
@@ -41,14 +41,14 @@
   return Platform.environment.containsKey(_SKY_SHELL_ENV_KEY);
 }
 
-String _skyShellPath() {
+String? _skyShellPath() {
   return Platform.environment[_SKY_SHELL_ENV_KEY];
 }
 
 class _ServiceTesteeRunner {
   Future run(
-      {testeeBefore(): null,
-      testeeConcurrent(): null,
+      {Function? testeeBefore: null,
+      Function? testeeConcurrent: null,
       bool pause_on_start: false,
       bool pause_on_exit: false}) async {
     if (!pause_on_start) {
@@ -73,8 +73,8 @@
   }
 
   void runSync(
-      {void testeeBeforeSync(): null,
-      void testeeConcurrentSync(): null,
+      {Function? testeeBeforeSync: null,
+      Function? testeeConcurrentSync: null,
       bool pause_on_start: false,
       bool pause_on_exit: false}) {
     if (!pause_on_start) {
@@ -94,7 +94,7 @@
 }
 
 class _ServiceTesteeLauncher {
-  Process process;
+  Process? process;
   final List<String> args;
   Future<void> get exited => _processCompleter.future;
   final _processCompleter = Completer<void>();
@@ -111,8 +111,8 @@
       bool testeeControlsServer,
       Uri serviceInfoUri,
       int port,
-      List<String> extraArgs,
-      List<String> executableArgs) {
+      List<String>? extraArgs,
+      List<String>? executableArgs) {
     assert(pause_on_start != null);
     assert(pause_on_exit != null);
     assert(pause_on_unhandled_exceptions != null);
@@ -148,8 +148,8 @@
       bool testeeControlsServer,
       Uri serviceInfoUri,
       int port,
-      List<String> extraArgs,
-      List<String> executableArgs) {
+      List<String>? extraArgs,
+      List<String>? executableArgs) {
     assert(!_shouldLaunchSkyShell());
 
     final String dartExecutable = Platform.executable;
@@ -175,7 +175,9 @@
     if (extraArgs != null) {
       fullArgs.addAll(extraArgs);
     }
-    fullArgs.addAll(executableArgs);
+    if (executableArgs != null) {
+      fullArgs.addAll(executableArgs);
+    }
     if (!testeeControlsServer) {
       fullArgs.add('--enable-vm-service:$port');
     }
@@ -189,11 +191,11 @@
       bool pause_on_exit,
       bool pause_on_unhandled_exceptions,
       bool testeeControlsServer,
-      List<String> extraArgs,
-      List<String> executableArgs) {
+      List<String>? extraArgs,
+      List<String>? executableArgs) {
     assert(_shouldLaunchSkyShell());
 
-    final String dartExecutable = _skyShellPath();
+    final String dartExecutable = _skyShellPath()!;
 
     final dartFlags = <String>[];
     final fullArgs = <String>[];
@@ -213,7 +215,9 @@
     if (extraArgs != null) {
       fullArgs.addAll(extraArgs);
     }
-    fullArgs.addAll(executableArgs);
+    if (executableArgs != null) {
+      fullArgs.addAll(executableArgs);
+    }
     if (!testeeControlsServer) {
       fullArgs.add('--observatory-port=0');
     }
@@ -244,8 +248,8 @@
       bool enable_service_port_fallback,
       bool testeeControlsServer,
       int port,
-      List<String> extraArgs,
-      List<String> executableArgs) async {
+      List<String>? extraArgs,
+      List<String>? executableArgs) async {
     final completer = new Completer<Uri>();
     final serviceInfoDir =
         await Directory.systemTemp.createTemp('dart_service');
@@ -266,7 +270,7 @@
       Uri uri;
       final blankCompleter = Completer();
       bool blankLineReceived = false;
-      process.stdout
+      p.stdout
           .transform(utf8.decoder)
           .transform(new LineSplitter())
           .listen((line) {
@@ -277,13 +281,13 @@
         }
         print('>testee>out> $line');
       });
-      process.stderr
+      p.stderr
           .transform(utf8.decoder)
           .transform(new LineSplitter())
           .listen((line) {
         print('>testee>err> ${line.trim()}');
       });
-      process.exitCode.then((exitCode) async {
+      p.exitCode.then((exitCode) async {
         await serviceInfoDir.delete(recursive: true);
         if ((exitCode != 0) && !killedByTester) {
           throw "Testee exited with $exitCode";
@@ -316,7 +320,7 @@
   void requestExit() {
     if (process != null) {
       print('** Killing script');
-      if (process.kill()) {
+      if (process!.kill()) {
         killedByTester = true;
       }
     }
@@ -331,12 +335,12 @@
 
 class _ServiceTesterRunner {
   void run({
-    List<String> mainArgs,
-    List<String> extraArgs,
-    List<String> executableArgs,
-    List<DDSTest> ddsTests,
-    List<IsolateTest> isolateTests,
-    List<VMTest> vmTests,
+    List<String>? mainArgs,
+    List<String>? extraArgs,
+    List<String>? executableArgs,
+    List<DDSTest>? ddsTests,
+    List<IsolateTest>? isolateTests,
+    List<VMTest>? vmTests,
     bool pause_on_start: false,
     bool pause_on_exit: false,
     bool verbose_vm: false,
@@ -350,9 +354,9 @@
     if (executableArgs == null) {
       executableArgs = Platform.executableArguments;
     }
-    DartDevelopmentService dds;
-    WebSocketVM vm;
-    _ServiceTesteeLauncher process;
+    late DartDevelopmentService dds;
+    late WebSocketVM vm;
+    late _ServiceTesteeLauncher process;
     bool testsDone = false;
 
     ignoreLateException(Function f) async {
@@ -383,8 +387,8 @@
                   extraArgs,
                   executableArgs)
               .then((Uri serverAddress) async {
-            if (mainArgs.contains("--gdb")) {
-              final pid = process.process.pid;
+            if (mainArgs != null && mainArgs.contains("--gdb")) {
+              final pid = process.process!.pid;
               final wait = new Duration(seconds: 10);
               print("Testee has pid $pid, waiting $wait before continuing");
               sleep(wait);
@@ -412,7 +416,7 @@
       () => ignoreLateException(
         () async {
           if (useDds) {
-            await dds?.shutdown();
+            await dds.shutdown();
           }
           process.requestExit();
         },
@@ -490,7 +494,7 @@
       }
     }
 
-    Completer completer = new Completer();
+    Completer<Isolate>? completer = new Completer<Isolate>();
     vm.getEventStream(VM.kIsolateStream).then((stream) {
       var subscription;
       subscription = stream.listen((ServiceEvent event) async {
@@ -503,7 +507,7 @@
             vm.isolates.first.load().then((result) {
               if (result is Isolate) {
                 subscription.cancel();
-                completer.complete(result);
+                completer!.complete(result);
                 completer = null;
               }
             });
@@ -516,12 +520,12 @@
     if (vm.isolates.isNotEmpty) {
       vm.isolates.first.reload().then((result) async {
         if (completer != null && result is Isolate) {
-          completer.complete(result);
+          completer!.complete(result);
           completer = null;
         }
       });
     }
-    return await completer.future;
+    return await completer!.future;
   }
 }
 
@@ -530,8 +534,8 @@
 /// concurrently with the tests. Uses [mainArgs] to determine whether
 /// to run tests or testee in this invocation of the script.
 Future runIsolateTests(List<String> mainArgs, List<IsolateTest> tests,
-    {testeeBefore(),
-    testeeConcurrent(),
+    {Function? testeeBefore,
+    Function? testeeConcurrent,
     bool pause_on_start: false,
     bool pause_on_exit: false,
     bool verbose_vm: false,
@@ -539,7 +543,7 @@
     bool testeeControlsServer: false,
     bool enableDds: true,
     bool enableService: true,
-    List<String> extraArgs}) async {
+    List<String>? extraArgs}) async {
   assert(!pause_on_start || testeeBefore == null);
   if (_isTestee()) {
     new _ServiceTesteeRunner().run(
@@ -573,13 +577,13 @@
 /// in an async context (because exceptions are *always* handled in async
 /// functions).
 void runIsolateTestsSynchronous(List<String> mainArgs, List<IsolateTest> tests,
-    {void testeeBefore(),
-    void testeeConcurrent(),
+    {Function? testeeBefore,
+    Function? testeeConcurrent,
     bool pause_on_start: false,
     bool pause_on_exit: false,
     bool verbose_vm: false,
     bool pause_on_unhandled_exceptions: false,
-    List<String> extraArgs}) {
+    List<String>? extraArgs}) {
   assert(!pause_on_start || testeeBefore == null);
   if (_isTestee()) {
     new _ServiceTesteeRunner().runSync(
@@ -604,8 +608,8 @@
 /// concurrently with the tests. Uses [mainArgs] to determine whether
 /// to run tests or testee in this invocation of the script.
 Future runVMTests(List<String> mainArgs, List<VMTest> tests,
-    {testeeBefore(),
-    testeeConcurrent(),
+    {Function? testeeBefore,
+    Function? testeeConcurrent,
     bool pause_on_start: false,
     bool pause_on_exit: false,
     bool verbose_vm: false,
@@ -614,8 +618,8 @@
     bool enableDds: true,
     bool enableService: true,
     int port = 0,
-    List<String> extraArgs,
-    List<String> executableArgs}) async {
+    List<String>? extraArgs,
+    List<String>? executableArgs}) async {
   if (_isTestee()) {
     new _ServiceTesteeRunner().run(
         testeeBefore: testeeBefore,
@@ -646,16 +650,16 @@
 /// determine whether to run tests or testee in this invocation of the
 /// script.
 Future runDDSTests(List<String> mainArgs, List<DDSTest> tests,
-    {testeeBefore(),
-    testeeConcurrent(),
+    {Function? testeeBefore,
+    Function? testeeConcurrent,
     bool pause_on_start: false,
     bool pause_on_exit: false,
     bool verbose_vm: false,
     bool pause_on_unhandled_exceptions: false,
     bool enable_service_port_fallback: false,
     int port = 0,
-    List<String> extraArgs,
-    List<String> executableArgs}) async {
+    List<String>? extraArgs,
+    List<String>? executableArgs}) async {
   if (_isTestee()) {
     new _ServiceTesteeRunner().run(
         testeeBefore: testeeBefore,
diff --git a/runtime/observatory/tests/service/type_arguments_test.dart b/runtime/observatory/tests/service/type_arguments_test.dart
index 1c2a6ac..92ec78f 100644
--- a/runtime/observatory/tests/service/type_arguments_test.dart
+++ b/runtime/observatory/tests/service/type_arguments_test.dart
@@ -36,7 +36,7 @@
           // Check that we can 'get' this object again.
           var firstType = allTypeArgsList[0];
           return isolate.getObject(firstType.id).then((ServiceObject object) {
-            TypeArguments type = object;
+            TypeArguments type = object as TypeArguments;
             expect(firstType.name, type.name);
           });
         });
diff --git a/runtime/observatory/tests/service/typed_data_test.dart b/runtime/observatory/tests/service/typed_data_test.dart
index d96583a..9c4ba3b 100644
--- a/runtime/observatory/tests/service/typed_data_test.dart
+++ b/runtime/observatory/tests/service/typed_data_test.dart
@@ -78,18 +78,18 @@
 var tests = <IsolateTest>[
   (Isolate isolate) async {
     script();
-    Library lib = await isolate.rootLibrary.load();
+    Library lib = await isolate.rootLibrary.load() as Library;
 
     // Pre-load all the fields so we don't use await below and get better
     // stacktraces.
     for (var v in lib.variables) {
       await v.load();
-      await v.staticValue.load();
+      await v.staticValue!.load();
     }
 
     expectTypedData(name, expectedValue) {
       var variable = lib.variables.singleWhere((v) => v.name == name);
-      var actualValue = (variable.staticValue as Instance).typedElements;
+      var actualValue = (variable.staticValue as Instance).typedElements!;
       if (expectedValue is Int32x4List) {
         expect(actualValue.length, equals(expectedValue.length));
         for (var i = 0; i < actualValue.length; i++) {
diff --git a/runtime/observatory/tests/service/valid_source_locations_test.dart b/runtime/observatory/tests/service/valid_source_locations_test.dart
index 8512479..d4c4771 100644
--- a/runtime/observatory/tests/service/valid_source_locations_test.dart
+++ b/runtime/observatory/tests/service/valid_source_locations_test.dart
@@ -14,16 +14,16 @@
   debugger();
 }
 
-Future validateLocation(Location location, Object object) async {
+Future validateLocation(Location? location, Object object) async {
   if (location == null) return;
-  if (location.tokenPos < 0) return;
+  if (location.tokenPos! < 0) return;
   if (location.script.uri == 'dart:_internal-patch/class_id_fasta.dart') {
     // Injected fields from this script cannot be reloaded.
     return;
   }
 
   // Ensure the script is loaded.
-  final Script script = await location.script.load();
+  final Script script = await location.script.load() as Script;
 
   // Use the more low-level functions.
   final line = script.tokenToLine(location.tokenPos);
@@ -39,17 +39,17 @@
 }
 
 Future validateFieldLocation(Field field) async {
-  field = await field.load();
+  field = await field.load() as Field;
   await validateLocation(field.location, field);
 }
 
 Future validateFunctionLocation(ServiceFunction fun) async {
-  fun = await fun.load();
+  fun = await fun.load() as ServiceFunction;
   await validateLocation(fun.location, fun);
 }
 
 Future validateClassLocation(Class klass) async {
-  klass = await klass.load();
+  klass = await klass.load() as Class;
   await validateLocation(klass.location, klass);
 
   for (Field field in klass.fields) {
@@ -72,7 +72,7 @@
 
     // Loop over all libraries, classes, functions and fields to ensure .
     for (Library lib in isolate.libraries) {
-      lib = await lib.load();
+      lib = await lib.load() as Library;
 
       for (Field field in lib.variables) {
         await validateFieldLocation(field);
diff --git a/runtime/observatory/tests/service/verify_http_timeline_test.dart b/runtime/observatory/tests/service/verify_http_timeline_test.dart
index f7959e4..7c9d7c8 100644
--- a/runtime/observatory/tests/service/verify_http_timeline_test.dart
+++ b/runtime/observatory/tests/service/verify_http_timeline_test.dart
@@ -182,9 +182,9 @@
     final id = event['id'];
     events.putIfAbsent(id, () => 0);
     if (isStartEvent(event)) {
-      events[id]++;
+      events[id] = events[id]! + 1;
     } else if (isFinishEvent(event)) {
-      events[id]--;
+      events[id] = events[id]! - 1;
     }
   }
   bool valid = true;
diff --git a/runtime/observatory/tests/service/vm_test.dart b/runtime/observatory/tests/service/vm_test.dart
index f4417c4..137270a 100644
--- a/runtime/observatory/tests/service/vm_test.dart
+++ b/runtime/observatory/tests/service/vm_test.dart
@@ -7,8 +7,8 @@
 import 'test_helper.dart';
 
 var tests = <IsolateTest>[
-  (Isolate isolate) {
-    VM vm = isolate.owner;
+  (Isolate isolate) async {
+    VM vm = isolate.owner as VM;
     expect(vm.targetCPU, isNotNull);
     expect(vm.architectureBits == 32 || vm.architectureBits == 64, isTrue);
     expect(vm.embedder, equals("Dart VM"));
diff --git a/runtime/observatory/tests/service/vm_timeline_events_test.dart b/runtime/observatory/tests/service/vm_timeline_events_test.dart
index 5ae3e8b..062a0c1 100644
--- a/runtime/observatory/tests/service/vm_timeline_events_test.dart
+++ b/runtime/observatory/tests/service/vm_timeline_events_test.dart
@@ -26,15 +26,15 @@
   return events.where(filter).toList();
 }
 
-Completer completer;
-int eventCount;
+late Completer<void> completer;
+int eventCount = 0;
 
 onTimelineEvent(ServiceEvent event) {
   if (event.kind != ServiceEvent.kTimelineEvents) {
     return;
   }
   eventCount++;
-  expect(filterEvents(event.timelineEvents, isDart).length, greaterThan(0));
+  expect(filterEvents(event.timelineEvents!, isDart).length, greaterThan(0));
   if (eventCount == 5) {
     completer.complete(eventCount);
   }
diff --git a/runtime/observatory/tests/service/vm_timeline_flags_test.dart b/runtime/observatory/tests/service/vm_timeline_flags_test.dart
index 9553054..cc433af 100644
--- a/runtime/observatory/tests/service/vm_timeline_flags_test.dart
+++ b/runtime/observatory/tests/service/vm_timeline_flags_test.dart
@@ -26,7 +26,7 @@
   return events.where(filter).toList();
 }
 
-int dartEventCount;
+int dartEventCount = 0;
 
 var tests = <IsolateTest>[
   hasStoppedAtBreakpoint,
@@ -51,8 +51,8 @@
     final completer = Completer<void>();
     await subscribeToStream(isolate.vm, 'Timeline', (event) async {
       expect(event.kind, ServiceEvent.kTimelineStreamSubscriptionsUpdate);
-      expect(event.updatedStreams.length, 1);
-      expect(event.updatedStreams.first, 'Dart');
+      expect(event.updatedStreams!.length, 1);
+      expect(event.updatedStreams!.first, 'Dart');
       await cancelStreamSubscription('Timeline');
       completer.complete();
     });
@@ -90,7 +90,7 @@
     final completer = Completer<void>();
     await subscribeToStream(isolate.vm, 'Timeline', (event) async {
       expect(event.kind, ServiceEvent.kTimelineStreamSubscriptionsUpdate);
-      expect(event.updatedStreams.length, 0);
+      expect(event.updatedStreams!.length, 0);
       await cancelStreamSubscription('Timeline');
       completer.complete();
     });
diff --git a/runtime/observatory/tests/service/weak_properties_test.dart b/runtime/observatory/tests/service/weak_properties_test.dart
index bc08b35..7e557d1 100644
--- a/runtime/observatory/tests/service/weak_properties_test.dart
+++ b/runtime/observatory/tests/service/weak_properties_test.dart
@@ -25,7 +25,7 @@
   expando[key] = value;
 
   InstanceMirror expandoMirror = reflect(expando);
-  LibraryMirror libcore = expandoMirror.type.owner;
+  LibraryMirror libcore = expandoMirror.type.owner as LibraryMirror;
 
   var entries = expandoMirror
       .getField(MirrorSystem.getSymbol('_data', libcore))
@@ -36,31 +36,31 @@
 
 var tests = <IsolateTest>[
   (Isolate isolate) async {
-    Library lib = await isolate.rootLibrary.load();
+    Library lib = await isolate.rootLibrary.load() as Library;
     Field keyField = lib.variables.singleWhere((v) => v.name == 'key');
     await keyField.load();
-    Instance key = keyField.staticValue;
+    Instance key = keyField.staticValue as Instance;
     Field valueField = lib.variables.singleWhere((v) => v.name == 'value');
     await valueField.load();
-    Instance value = valueField.staticValue;
+    Instance value = valueField.staticValue as Instance;
     Field propField =
         lib.variables.singleWhere((v) => v.name == 'weak_property');
     await propField.load();
-    Instance prop = propField.staticValue;
+    Instance prop = propField.staticValue as Instance;
 
     expect(key.isWeakProperty, isFalse);
     expect(value.isWeakProperty, isFalse);
     expect(prop.isWeakProperty, isTrue);
     expect(prop.key, isNull);
     expect(prop.value, isNull);
-    Instance loadedProp = await prop.load();
+    Instance loadedProp = await prop.load() as Instance;
     // Object ids are not canonicalized, so we rely on the key and value
     // being the sole instances of their classes to test we got the objects
     // we expect.
     expect(loadedProp.key, isNotNull);
-    expect(loadedProp.key.clazz, equals(key.clazz));
+    expect(loadedProp.key!.clazz, equals(key.clazz));
     expect(loadedProp.value, isNotNull);
-    expect(loadedProp.value.clazz, equals(value.clazz));
+    expect(loadedProp.value!.clazz, equals(value.clazz));
   },
 ];
 
diff --git a/runtime/observatory/tests/ui/inspector.dart b/runtime/observatory/tests/ui/inspector.dart
index 7849381..e8fc90a 100644
--- a/runtime/observatory/tests/ui/inspector.dart
+++ b/runtime/observatory/tests/ui/inspector.dart
@@ -18,9 +18,8 @@
 var uninitialized = new Object();
 
 extractPrivateField(obj, name) {
-  return reflect(obj)
-      .getField(MirrorSystem.getSymbol(name, reflect(obj).type.owner))
-      .reflectee;
+  var lib = reflect(obj).type.owner as LibraryMirror;
+  return reflect(obj).getField(MirrorSystem.getSymbol(name, lib)).reflectee;
 }
 
 class A<T> {}
@@ -138,7 +137,7 @@
     mixedType = "2";
     mixedType = false;
 
-    array = new List(3);
+    array = new List<dynamic>.filled(3, null);
     array[0] = 1;
     array[1] = 2;
     array[2] = 3;
@@ -156,7 +155,7 @@
     float64 = 3.14;
     float64x2 = new Float64x2(0.0, 3.14);
     gauge = new Gauge("GaugeName", "Gauge description", 0.0, 100.0);
-    growableList = new List();
+    growableList = <dynamic>[];
     int32x4 = new Int32x4(0, 1, 10, 11);
     map = {
       "x-key": "x-value",
diff --git a/runtime/observatory/tests/ui/retainingPath.dart b/runtime/observatory/tests/ui/retainingPath.dart
index 0a2c30f..238ab4c 100644
--- a/runtime/observatory/tests/ui/retainingPath.dart
+++ b/runtime/observatory/tests/ui/retainingPath.dart
@@ -11,7 +11,7 @@
 }
 
 main() {
-  var list = new List<Foo>.filled(10, null);
+  var list = new List<dynamic>.filled(10, null);
   list[5] = new Foo(42.toString(), new Foo(87.toString(), 17.toString()));
   while (true) {}
 }
diff --git a/runtime/observatory/web/main.dart b/runtime/observatory/web/main.dart
index b09362d..820c74a 100644
--- a/runtime/observatory/web/main.dart
+++ b/runtime/observatory/web/main.dart
@@ -14,7 +14,7 @@
       print('${rec.level.name}: ${rec.time}: ${rec.message}');
     });
     Logger.root.info('Starting Observatory');
-    document.body.children
+    document.body!.children
         .insert(0, new ObservatoryApplicationElement.created().element);
   });
 }
diff --git a/runtime/observatory_2/lib/src/elements/function_view.dart b/runtime/observatory_2/lib/src/elements/function_view.dart
index 7077bc3..cad9250 100644
--- a/runtime/observatory_2/lib/src/elements/function_view.dart
+++ b/runtime/observatory_2/lib/src/elements/function_view.dart
@@ -276,21 +276,6 @@
             ]
         ]);
     }
-    if (_function.bytecode != null) {
-      members.add(new DivElement()
-        ..classes = ['memberItem']
-        ..children = <Element>[
-          new DivElement()
-            ..classes = ['memberName']
-            ..text = 'bytecode',
-          new DivElement()
-            ..classes = ['memberName']
-            ..children = <Element>[
-              new CodeRefElement(_isolate, _function.bytecode, queue: _r.queue)
-                  .element,
-            ]
-        ]);
-    }
     members.add(new DivElement()
       ..classes = ['memberItem']
       ..text = ' ');
diff --git a/runtime/observatory_2/lib/src/models/objects/function.dart b/runtime/observatory_2/lib/src/models/objects/function.dart
index 82d3d7f..7de7ad6 100644
--- a/runtime/observatory_2/lib/src/models/objects/function.dart
+++ b/runtime/observatory_2/lib/src/models/objects/function.dart
@@ -88,9 +88,6 @@
   CodeRef get unoptimizedCode;
 
   /// [optional]
-  CodeRef get bytecode;
-
-  /// [optional]
   FieldRef get field;
   int get usageCounter;
   InstanceRef get icDataArray;
diff --git a/runtime/observatory_2/lib/src/models/objects/instance.dart b/runtime/observatory_2/lib/src/models/objects/instance.dart
index 66965e9..e52cdd7 100644
--- a/runtime/observatory_2/lib/src/models/objects/instance.dart
+++ b/runtime/observatory_2/lib/src/models/objects/instance.dart
@@ -120,6 +120,9 @@
 
   /// An instance of the Dart class TypeRef.
   typeRef,
+
+  /// An instance of the Dart class RawReceivePort
+  receivePort,
 }
 
 bool isTypedData(InstanceKind kind) {
diff --git a/runtime/observatory_2/lib/src/service/object.dart b/runtime/observatory_2/lib/src/service/object.dart
index 046513d..3f61be6 100644
--- a/runtime/observatory_2/lib/src/service/object.dart
+++ b/runtime/observatory_2/lib/src/service/object.dart
@@ -1927,8 +1927,10 @@
     return invokeRpc('setExceptionPauseMode', {'mode': mode});
   }
 
-  Future<ServiceMap> getStack() {
-    return invokeRpc('getStack', {}).then((response) => response as ServiceMap);
+  Future<ServiceMap> getStack({int limit}) {
+    return invokeRpc('getStack', {
+      if (limit != null) 'limit': limit,
+    }).then((response) => response as ServiceMap);
   }
 
   Future<ObjectStore> getObjectStore() {
@@ -2790,6 +2792,8 @@
       return M.InstanceKind.typeParameter;
     case 'TypeRef':
       return M.InstanceKind.typeRef;
+    case 'ReceivePort':
+      return M.InstanceKind.receivePort;
   }
   var message = 'Unrecognized instance kind: $s';
   Logger.root.severe(message);
@@ -3178,7 +3182,6 @@
   SourceLocation location;
   Code code;
   Code unoptimizedCode;
-  Code bytecode;
   bool isOptimizable;
   bool isInlinable;
   bool hasIntrinsic;
@@ -3237,7 +3240,6 @@
     isInlinable = map['_inlinable'];
     isRecognized = map['_recognized'];
     unoptimizedCode = map['_unoptimizedCode'];
-    bytecode = map['_bytecode'];
     deoptimizations = map['_deoptimizations'];
     usageCounter = map['_usageCounter'];
     icDataArray = map['_icDataArray'];
diff --git a/runtime/observatory_2/tests/service_2/coverage_leaf_function_test.dart b/runtime/observatory_2/tests/service_2/coverage_leaf_function_test.dart
index 25587aa..54d4f59 100644
--- a/runtime/observatory_2/tests/service_2/coverage_leaf_function_test.dart
+++ b/runtime/observatory_2/tests/service_2/coverage_leaf_function_test.dart
@@ -44,12 +44,12 @@
 
     var expectedRange = {
       'scriptIndex': 0,
-      'startPos': 384,
-      'endPos': 434,
+      'startPos': 386,
+      'endPos': 436,
       'compiled': true,
       'coverage': {
         'hits': [],
-        'misses': [384]
+        'misses': [386]
       }
     };
 
@@ -85,11 +85,11 @@
 
     var expectedRange = {
       'scriptIndex': 0,
-      'startPos': 384,
-      'endPos': 434,
+      'startPos': 386,
+      'endPos': 436,
       'compiled': true,
       'coverage': {
-        'hits': [384],
+        'hits': [386],
         'misses': []
       }
     };
diff --git a/runtime/observatory_2/tests/service_2/coverage_optimized_function_test.dart b/runtime/observatory_2/tests/service_2/coverage_optimized_function_test.dart
index d99072d..2c95a1f 100644
--- a/runtime/observatory_2/tests/service_2/coverage_optimized_function_test.dart
+++ b/runtime/observatory_2/tests/service_2/coverage_optimized_function_test.dart
@@ -37,11 +37,11 @@
 
     var expectedRange = {
       'scriptIndex': 0,
-      'startPos': 461,
-      'endPos': 528,
+      'startPos': 463,
+      'endPos': 530,
       'compiled': true,
       'coverage': {
-        'hits': [461, 501, 512, 516],
+        'hits': [463, 503, 514, 518],
         'misses': []
       }
     };
diff --git a/runtime/observatory_2/tests/service_2/dds_extension_event_history_test.dart b/runtime/observatory_2/tests/service_2/dds_extension_event_history_test.dart
new file mode 100644
index 0000000..ea8ab07
--- /dev/null
+++ b/runtime/observatory_2/tests/service_2/dds_extension_event_history_test.dart
@@ -0,0 +1,52 @@
+// Copyright (c) 2020, 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:async';
+import 'dart:developer';
+
+import 'package:observatory_2/service_io.dart';
+import 'package:test/test.dart';
+import 'client_resume_approvals_common.dart';
+import 'service_test_common.dart';
+import 'test_helper.dart';
+
+Future testMain() async {
+  // Post a total of 9 events
+  for (int i = 1; i <= 9; ++i) {
+    postEvent('Test', {
+      'id': i,
+    });
+  }
+}
+
+var tests = <IsolateTest>[
+  isPausedAtStart,
+  resumeIsolate,
+  (Isolate isolate) async {
+    final completer = Completer<void>();
+    int i = 1;
+    await subscribeToStream(isolate.vm, 'Extension', (event) async {
+      expect(event.extensionKind, 'Test');
+      expect(event.extensionData['id'], i);
+      i++;
+
+      if (i == 10) {
+        await cancelStreamSubscription('Extension');
+        completer.complete();
+      } else if (i > 10) {
+        fail('Too many log messages');
+      }
+    });
+    await completer.future;
+  },
+];
+
+main(args) => runIsolateTests(
+      args,
+      tests,
+      enableService: false, // DDS specific feature
+      testeeConcurrent: testMain,
+      pause_on_start: true,
+      pause_on_exit: true,
+    );
diff --git a/runtime/observatory_2/tests/service_2/dds_stdout_stderr_history_test.dart b/runtime/observatory_2/tests/service_2/dds_stdout_stderr_history_test.dart
new file mode 100644
index 0000000..9fc0b7a
--- /dev/null
+++ b/runtime/observatory_2/tests/service_2/dds_stdout_stderr_history_test.dart
@@ -0,0 +1,61 @@
+// Copyright (c) 2020, 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:async';
+import 'dart:io';
+
+import 'package:observatory_2/service_io.dart';
+import 'package:test/test.dart';
+import 'client_resume_approvals_common.dart';
+import 'service_test_common.dart';
+import 'test_helper.dart';
+
+Future testMain() async {
+  // Log a total of 9 messages
+  for (int i = 1; i <= 9; ++i) {
+    print('Stdout log$i');
+    stderr.writeln('Stderr log$i');
+  }
+}
+
+Future streamHistoryTest(Isolate isolate, String stream) async {
+  final completer = Completer<void>();
+  int i = 1;
+  await subscribeToStream(isolate.vm, stream, (event) async {
+    // Newlines are sent as separate events for some reason. Ignore them.
+    if (!event.bytesAsString.startsWith(stream)) {
+      return;
+    }
+    expect(event.bytesAsString, '$stream log$i');
+    i++;
+
+    if (i == 10) {
+      await cancelStreamSubscription(stream);
+      completer.complete();
+    } else if (i > 10) {
+      fail('Too many log messages');
+    }
+  });
+  await completer.future;
+}
+
+var tests = <IsolateTest>[
+  isPausedAtStart,
+  resumeIsolate,
+  (Isolate isolate) async {
+    await streamHistoryTest(isolate, 'Stdout');
+  },
+  (Isolate isolate) async {
+    await streamHistoryTest(isolate, 'Stderr');
+  },
+];
+
+main(args) => runIsolateTests(
+      args,
+      tests,
+      enableService: false, // DDS specific feature
+      testeeConcurrent: testMain,
+      pause_on_start: true,
+      pause_on_exit: true,
+    );
diff --git a/runtime/observatory_2/tests/service_2/evaluate_activation_in_method_class_other.dart b/runtime/observatory_2/tests/service_2/evaluate_activation_in_method_class_other.dart
index bf070a1..000ba5e 100644
--- a/runtime/observatory_2/tests/service_2/evaluate_activation_in_method_class_other.dart
+++ b/runtime/observatory_2/tests/service_2/evaluate_activation_in_method_class_other.dart
@@ -6,22 +6,22 @@
 
 var topLevel = "OtherLibrary";
 
-class Superclass {
-  var _instVar = 'Superclass';
-  var instVar = 'Superclass';
-  method() => 'Superclass';
-  static staticMethod() => 'Superclass';
+class Superclass2 {
+  var _instVar = 'Superclass2';
+  var instVar = 'Superclass2';
+  method() => 'Superclass2';
+  static staticMethod() => 'Superclass2';
   suppress_warning() => _instVar;
 }
 
-class Klass extends Superclass {
-  var _instVar = 'Klass';
-  var instVar = 'Klass';
-  method() => 'Klass';
-  static staticMethod() => 'Klass';
+class Superclass1 extends Superclass2 {
+  var _instVar = 'Superclass1';
+  var instVar = 'Superclass1';
+  method() => 'Superclass1';
+  static staticMethod() => 'Superclass1';
 
   test() {
-    var _local = 'Klass';
+    var _local = 'Superclass1';
     debugger();
     // Suppress unused variable warning.
     print(_local);
diff --git a/runtime/observatory_2/tests/service_2/evaluate_activation_in_method_class_test.dart b/runtime/observatory_2/tests/service_2/evaluate_activation_in_method_class_test.dart
index 6af1450..9921505 100644
--- a/runtime/observatory_2/tests/service_2/evaluate_activation_in_method_class_test.dart
+++ b/runtime/observatory_2/tests/service_2/evaluate_activation_in_method_class_test.dart
@@ -15,7 +15,7 @@
 
 var topLevel = "TestLibrary";
 
-class Subclass extends Superclass with Klass {
+class Subclass extends Superclass1 {
   var _instVar = 'Subclass';
   var instVar = 'Subclass';
   method() => 'Subclass';
@@ -36,18 +36,18 @@
   var topFrame = 0;
   expect(stack.type, equals('Stack'));
   expect(stack['frames'][topFrame].function.name, equals('test'));
-  expect(stack['frames'][topFrame].function.dartOwner.name,
-      equals('Superclass&Klass'));
+  expect(
+      stack['frames'][topFrame].function.dartOwner.name, equals('Superclass1'));
 
   Instance result;
 
   result = await isolate.evalFrame(topFrame, '_local');
   print(result);
-  expect(result.valueAsString, equals('Klass'));
+  expect(result.valueAsString, equals('Superclass1'));
 
   result = await isolate.evalFrame(topFrame, '_instVar');
   print(result);
-  expect(result.valueAsString, equals('Klass'));
+  expect(result.valueAsString, equals('Superclass1'));
 
   result = await isolate.evalFrame(topFrame, 'instVar');
   print(result);
@@ -59,19 +59,19 @@
 
   result = await isolate.evalFrame(topFrame, 'super._instVar');
   print(result);
-  expect(result.valueAsString, equals('Superclass'));
+  expect(result.valueAsString, equals('Superclass2'));
 
   result = await isolate.evalFrame(topFrame, 'super.instVar');
   print(result);
-  expect(result.valueAsString, equals('Superclass'));
+  expect(result.valueAsString, equals('Superclass2'));
 
   result = await isolate.evalFrame(topFrame, 'super.method()');
   print(result);
-  expect(result.valueAsString, equals('Superclass'));
+  expect(result.valueAsString, equals('Superclass2'));
 
   result = await isolate.evalFrame(topFrame, 'staticMethod()');
   print(result);
-  expect(result.valueAsString, equals('Klass'));
+  expect(result.valueAsString, equals('Superclass1'));
 
   // function.Owner verus function.Origin
   // The mixin of Superclass is in _other.dart and the mixin
diff --git a/runtime/observatory_2/tests/service_2/get_allocation_samples_test.dart b/runtime/observatory_2/tests/service_2/get_allocation_samples_test.dart
index 87eebfd..d39219d 100644
--- a/runtime/observatory_2/tests/service_2/get_allocation_samples_test.dart
+++ b/runtime/observatory_2/tests/service_2/get_allocation_samples_test.dart
@@ -56,7 +56,7 @@
     expect(fooClass.traceAllocations, isTrue);
     dynamic profileResponse = await fooClass.getAllocationSamples();
     expect(profileResponse, isNotNull);
-    expect(profileResponse['type'], equals('_CpuProfile'));
+    expect(profileResponse['type'], equals('CpuSamples'));
     await fooClass.setTraceAllocations(false);
     await fooClass.reload();
     expect(fooClass.traceAllocations, isFalse);
@@ -68,11 +68,10 @@
     var node = tree.root;
     var expected = [
       'Root',
-      'DRT_AllocateObject',
-      '[Stub] Allocate Foo',
-      'test',
-      'test',
-      '_Closure.call'
+      '[Unoptimized] test',
+      '[Unoptimized] test',
+      '[Unoptimized] _Closure.call',
+      '[Unoptimized] _ServiceTesteeRunner.run',
     ];
     for (var i = 0; i < expected.length; i++) {
       expect(node.profileCode.code.name, equals(expected[i]));
diff --git a/runtime/observatory_2/tests/service_2/get_cpu_profile_timeline_rpc_test.dart b/runtime/observatory_2/tests/service_2/get_cpu_profile_timeline_rpc_test.dart
index 40db79e..e5d578b 100644
--- a/runtime/observatory_2/tests/service_2/get_cpu_profile_timeline_rpc_test.dart
+++ b/runtime/observatory_2/tests/service_2/get_cpu_profile_timeline_rpc_test.dart
@@ -38,7 +38,7 @@
   }
 
   List events = result['traceEvents'];
-  expect(events.length, greaterThan(10), reason: "Should have many samples");
+  expect(events.length, greaterThan(0), reason: "Should have samples");
   for (Map event in events) {
     expect(event['ph'], equals('P'));
     expect(event['pid'], isInt);
diff --git a/runtime/observatory_2/tests/service_2/get_cpu_samples_rpc_test.dart b/runtime/observatory_2/tests/service_2/get_cpu_samples_rpc_test.dart
index d121b2b..8f25aa3 100644
--- a/runtime/observatory_2/tests/service_2/get_cpu_samples_rpc_test.dart
+++ b/runtime/observatory_2/tests/service_2/get_cpu_samples_rpc_test.dart
@@ -35,7 +35,7 @@
       reason: "Should have many code objects");
 
   final samples = result['samples'];
-  expect(samples.length, greaterThan(10), reason: "Should have many samples");
+  expect(samples.length, greaterThan(0), reason: "Should have samples");
   final sample = samples.first;
   expect(sample['tid'], isInt);
   expect(sample['timestamp'], isInt);
diff --git a/runtime/observatory_2/tests/service_2/get_isolate_after_language_error_test.dart b/runtime/observatory_2/tests/service_2/get_isolate_after_language_error_test.dart
deleted file mode 100644
index 88a7f89..0000000
--- a/runtime/observatory_2/tests/service_2/get_isolate_after_language_error_test.dart
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright (c) 2016, 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:observatory_2/service_io.dart';
-import 'package:test/test.dart';
-import 'test_helper.dart';
-import 'service_test_common.dart';
-
-var x;
-
-doThrow() {
-  if (x) while {
-  };
-}
-
-var tests = <IsolateTest>[
-  hasStoppedAtExit,
-
-  (Isolate isolate) async {
-    await isolate.reload();
-    expect(isolate.error, isNotNull);
-    expect(isolate.error.message.contains("'(' expected"), isTrue);
-  }
-];
-
-main(args) => runIsolateTestsSynchronous(args,
-                                         tests,
-                                         pause_on_exit: true,
-                                         testeeConcurrent: doThrow);
diff --git a/runtime/observatory_2/tests/service_2/get_ports_public_rpc_test.dart b/runtime/observatory_2/tests/service_2/get_ports_public_rpc_test.dart
new file mode 100644
index 0000000..179823f
--- /dev/null
+++ b/runtime/observatory_2/tests/service_2/get_ports_public_rpc_test.dart
@@ -0,0 +1,50 @@
+// Copyright (c) 2020, 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:isolate' hide Isolate;
+import 'package:observatory_2/service_io.dart';
+import 'package:test/test.dart';
+
+import 'test_helper.dart';
+
+var port1;
+var port2;
+var port3;
+
+void warmup() {
+  port1 = RawReceivePort(null, 'port1');
+  port2 = RawReceivePort((_) {});
+  port3 = RawReceivePort((_) {}, 'port3');
+  port3.close();
+  RawReceivePort((_) {}, 'port4');
+}
+
+int countNameMatches(ports, name) {
+  var matches = 0;
+  for (var port in ports) {
+    if (port['debugName'] == name) {
+      matches++;
+    }
+  }
+  return matches;
+}
+
+final tests = <IsolateTest>[
+  (Isolate isolate) async {
+    dynamic result = await isolate.invokeRpcNoUpgrade('getPorts', {});
+    expect(result['type'], 'PortList');
+    expect(result['ports'], isList);
+    final ports = result['ports'];
+    // There are at least three ports: the three created in warm up that
+    // weren't closed. Some OSes will have other ports open but we do not try
+    // and test for these.
+    expect(ports.length, greaterThanOrEqualTo(3));
+    expect(countNameMatches(ports, 'port1'), 1);
+    expect(countNameMatches(ports, 'port3'), 0);
+    expect(countNameMatches(ports, 'port4'), 1);
+    expect(countNameMatches(ports, ''), greaterThanOrEqualTo(1));
+  },
+];
+
+main(args) async => runIsolateTests(args, tests, testeeBefore: warmup);
diff --git a/runtime/observatory_2/tests/service_2/get_source_report_test.dart b/runtime/observatory_2/tests/service_2/get_source_report_test.dart
index 984de51..97606de 100644
--- a/runtime/observatory_2/tests/service_2/get_source_report_test.dart
+++ b/runtime/observatory_2/tests/service_2/get_source_report_test.dart
@@ -73,12 +73,12 @@
 
     var expectedRange = {
       'scriptIndex': 0,
-      'startPos': 432,
-      'endPos': 576,
+      'startPos': 426,
+      'endPos': 570,
       'compiled': true,
       'coverage': {
-        'hits': [432, 482, 533, 562],
-        'misses': [495],
+        'hits': [426, 476, 527, 556],
+        'misses': [489],
       }
     };
 
@@ -91,7 +91,7 @@
     final numRanges = coverage['ranges'].length;
     expect(coverage['type'], equals('SourceReport'));
 
-    expect(numRanges, equals(12));
+    expect(numRanges, equals(10));
     expect(coverage['ranges'][0], equals(expectedRange));
     expect(coverage['scripts'].length, 1);
     expect(
@@ -106,7 +106,7 @@
     };
     coverage = await isolate.invokeRpcNoUpgrade('getSourceReport', params);
     expect(coverage['type'], equals('SourceReport'));
-    expect(coverage['ranges'].length, numRanges);
+    expect(coverage['ranges'].length, 11);
     expect(allRangesCompiled(coverage), isTrue);
 
     // One function
diff --git a/runtime/observatory_2/tests/service_2/get_stack_limit_rpc_test.dart b/runtime/observatory_2/tests/service_2/get_stack_limit_rpc_test.dart
new file mode 100644
index 0000000..5248ebc
--- /dev/null
+++ b/runtime/observatory_2/tests/service_2/get_stack_limit_rpc_test.dart
@@ -0,0 +1,104 @@
+// Copyright (c) 2020, 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.
+
+// VMOptions=--causal-async-stacks --no-lazy-async-stacks
+
+import 'dart:async';
+import 'dart:developer';
+
+import 'package:observatory_2/models.dart' as M;
+import 'package:observatory_2/service_io.dart';
+import 'package:test/test.dart';
+import 'service_test_common.dart';
+import 'test_helper.dart';
+
+bar(int depth) {
+  if (depth == 21) {
+    debugger();
+    return;
+  }
+  foo(depth + 1);
+}
+
+foo(int depth) {
+  bar(depth + 1);
+}
+
+testMain() {
+  foo(0);
+}
+
+verifyStack(List frames, int numFrames) {
+  for (int i = 0; i < frames.length && i < numFrames; ++i) {
+    final frame = frames[i];
+    if (i < 22) {
+      expect(frame.function.qualifiedName, (i % 2) == 0 ? 'bar' : 'foo');
+    } else if (i == 22) {
+      expect(frame.function.qualifiedName, 'testMain');
+      break;
+    }
+  }
+}
+
+var tests = <IsolateTest>[
+  (Isolate isolate) async {
+    await hasStoppedAtBreakpoint(isolate);
+    // Sanity check.
+    expect(isolate.pauseEvent is M.PauseBreakpointEvent, isTrue);
+  },
+
+// Get stack
+  (Isolate isolate) async {
+    var stack = await isolate.getStack();
+    // Sanity check.
+    var frames = stack['frames'];
+    var asyncFrames = stack['asyncCausalFrames'];
+    var awaiterFrames = stack['awaiterFrames'];
+    expect(frames.length, greaterThanOrEqualTo(20));
+    expect(asyncFrames.length, greaterThan(frames.length));
+    expect(awaiterFrames.length, greaterThan(frames.length));
+    expect(stack['truncated'], false);
+
+    verifyStack(frames, frames.length);
+
+    final fullStackLength = frames.length;
+
+    // Try a limit > actual stack depth and expect to get the full stack with
+    // truncated async stacks.
+    stack = await isolate.getStack(limit: fullStackLength + 1);
+    frames = stack['frames'];
+    asyncFrames = stack['asyncCausalFrames'];
+    awaiterFrames = stack['awaiterFrames'];
+
+    expect(frames.length, fullStackLength);
+    expect(asyncFrames.length, fullStackLength + 1);
+    expect(asyncFrames.length, fullStackLength + 1);
+    expect(stack['truncated'], true);
+    verifyStack(frames, fullStackLength);
+
+    // Try a limit < actual stack depth and expect to get a stack of depth
+    // 'limit'.
+    stack = await isolate.getStack(limit: 10);
+    frames = stack['frames'];
+    asyncFrames = stack['asyncCausalFrames'];
+    awaiterFrames = stack['awaiterFrames'];
+
+    expect(frames.length, 10);
+    expect(asyncFrames.length, 10);
+    expect(awaiterFrames.length, 10);
+    expect(stack['truncated'], true);
+    verifyStack(frames, 10);
+  },
+// Invalid limit
+  (Isolate isolate) async {
+    try {
+      await isolate.getStack(limit: -1);
+      fail('Invalid parameter of -1 successful');
+    } on ServerRpcException {
+      // Expected.
+    }
+  }
+];
+
+main(args) => runIsolateTests(args, tests, testeeConcurrent: testMain);
diff --git a/runtime/observatory_2/tests/service_2/get_version_rpc_test.dart b/runtime/observatory_2/tests/service_2/get_version_rpc_test.dart
index 468e979..5160f96 100644
--- a/runtime/observatory_2/tests/service_2/get_version_rpc_test.dart
+++ b/runtime/observatory_2/tests/service_2/get_version_rpc_test.dart
@@ -12,7 +12,7 @@
     var result = await vm.invokeRpcNoUpgrade('getVersion', {});
     expect(result['type'], equals('Version'));
     expect(result['major'], equals(3));
-    expect(result['minor'], equals(39));
+    expect(result['minor'], equals(42));
     expect(result['_privateMajor'], equals(0));
     expect(result['_privateMinor'], equals(0));
   },
diff --git a/runtime/observatory_2/tests/service_2/network_profiling_test.dart b/runtime/observatory_2/tests/service_2/network_profiling_test.dart
index 5c27795..8ba995f 100644
--- a/runtime/observatory_2/tests/service_2/network_profiling_test.dart
+++ b/runtime/observatory_2/tests/service_2/network_profiling_test.dart
@@ -56,11 +56,14 @@
   postEvent('socketTest', {'socket': 'test'});
 }
 
-Future<void> checkFinishEvent(ServiceEvent event) {
+bool checkFinishEvent(ServiceEvent event) {
   expect(event.kind, equals(ServiceEvent.kExtension));
-  expect(event.extensionKind, equals('socketTest'));
+  if (event.extensionKind != 'socketTest') {
+    return false;
+  }
   expect(event.extensionData, isA<Map>());
   expect(event.extensionData['socket'], equals('test'));
+  return true;
 }
 
 var tests = <IsolateTest>[
@@ -102,9 +105,10 @@
     var sub;
     sub = await isolate.vm.listenEventStream(Isolate.kExtensionStream,
         (ServiceEvent event) {
-      checkFinishEvent(event);
-      sub.cancel();
-      completer.complete();
+      if (checkFinishEvent(event)) {
+        sub.cancel();
+        completer.complete();
+      }
     });
 
     dynamic result = await isolate.invokeRpc("invoke",
@@ -150,9 +154,10 @@
       completer = Completer();
       sub = await isolate.vm.listenEventStream(Isolate.kExtensionStream,
           (ServiceEvent event) {
-        checkFinishEvent(event);
-        sub.cancel();
-        completer.complete();
+        if (checkFinishEvent(event)) {
+          sub.cancel();
+          completer.complete();
+        }
       });
       dynamic result = await isolate.invokeRpc("invoke",
           {"targetId": lib.id, "selector": "socketTest", "argumentIds": []});
@@ -197,9 +202,10 @@
     var sub;
     sub = await isolate.vm.listenEventStream(Isolate.kExtensionStream,
         (ServiceEvent event) {
-      checkFinishEvent(event);
-      sub.cancel();
-      completer.complete();
+      if (checkFinishEvent(event)) {
+        sub.cancel();
+        completer.complete();
+      }
     });
 
     dynamic result = await isolate.invokeRpc("invoke",
diff --git a/runtime/observatory_2/tests/service_2/service_2_kernel.status b/runtime/observatory_2/tests/service_2/service_2_kernel.status
index 9e721f2..8c09f06 100644
--- a/runtime/observatory_2/tests/service_2/service_2_kernel.status
+++ b/runtime/observatory_2/tests/service_2/service_2_kernel.status
@@ -111,6 +111,7 @@
 get_object_rpc_test: SkipByDesign
 get_source_report_test: Skip, Timeout
 get_source_report_with_mixin_test: Skip, Timeout
+get_stack_limit_rpc_test: Skip, Timeout
 get_stack_rpc_test: Skip, Timeout
 implicit_getter_setter_test: SkipByDesign
 invoke_test: Skip, Timeout
diff --git a/runtime/observatory_2/tests/service_2/service_test_common.dart b/runtime/observatory_2/tests/service_2/service_test_common.dart
index 4373982..7775b29 100644
--- a/runtime/observatory_2/tests/service_2/service_test_common.dart
+++ b/runtime/observatory_2/tests/service_2/service_test_common.dart
@@ -577,7 +577,7 @@
       expectedStops = removeAdjacentDuplicates(expectedStops);
     }
 
-    // Single stepping in interpreted bytecode may record extra stops.
+    // Single stepping may record extra stops.
     // Allow the extra ones as long as the expected ones are recorded.
     int i = 0;
     int j = 0;
diff --git a/runtime/observatory_2/tests/service_2/step_through_setter_test.dart b/runtime/observatory_2/tests/service_2/step_through_setter_test.dart
index aa40fb1..bff5b7d 100644
--- a/runtime/observatory_2/tests/service_2/step_through_setter_test.dart
+++ b/runtime/observatory_2/tests/service_2/step_through_setter_test.dart
@@ -28,7 +28,7 @@
     _xyz = i - 1;
   }
 
-  get barXYZ => _xyz + 1;
+  int get barXYZ => _xyz + 1;
 }
 
 List<String> stops = [];
diff --git a/runtime/runtime_args.gni b/runtime/runtime_args.gni
index a20deb3..1c28c78 100644
--- a/runtime/runtime_args.gni
+++ b/runtime/runtime_args.gni
@@ -68,9 +68,6 @@
     dart_component_kind = "static_library"
   }
 
-  # Controls whether the VM uses bytecode.
-  dart_platform_bytecode = false
-
   # Whether the VM includes the kernel service in all modes (debug, release,
   # product).
   exclude_kernel_service = false
diff --git a/runtime/tests/vm/dart/causal_stacks/utils.dart b/runtime/tests/vm/dart/causal_stacks/utils.dart
index 0b14b5c..6b3b6e6 100644
--- a/runtime/tests/vm/dart/causal_stacks/utils.dart
+++ b/runtime/tests/vm/dart/causal_stacks/utils.dart
@@ -770,156 +770,144 @@
   final noYieldsExpected = const <String>[
     r'^#0      throwSync \(.*/utils.dart:16(:3)?\)$',
     r'^#1      noYields3 \(.*/utils.dart:54(:3)?\)$',
-    r'^#2      _AsyncAwaitCompleter.start ',
-    r'^#3      noYields3 \(.*/utils.dart:53(:23)?\)$',
-    r'^#4      noYields2 \(.*/utils.dart:50(:9)?\)$',
-    r'^#5      _AsyncAwaitCompleter.start ',
-    r'^#6      noYields2 \(.*/utils.dart:49(:23)?\)$',
-    r'^#7      noYields \(.*/utils.dart:46(:9)?\)$',
-    r'^#8      _AsyncAwaitCompleter.start ',
-    r'^#9      noYields \(.*/utils.dart:45(:22)?\)$',
+    r'^#2      noYields3 \(.*/utils.dart:53(:23)?\)$',
+    r'^#3      noYields2 \(.*/utils.dart:50(:9)?\)$',
+    r'^#4      noYields2 \(.*/utils.dart:49(:23)?\)$',
+    r'^#5      noYields \(.*/utils.dart:46(:9)?\)$',
+    r'^#6      noYields \(.*/utils.dart:45(:22)?\)$',
   ];
   await doTestAwait(
       noYields,
       noYieldsExpected +
           const <String>[
-            r'^#10     doTestAwait ',
-            r'^#11     _AsyncAwaitCompleter.start ',
-            r'^#12     doTestAwait ',
-            r'^#13     doTestsNoCausalNoLazy ',
-            r'^#14     _RootZone.runUnary ',
-            r'^#15     _FutureListener.handleValue ',
-            r'^#16     Future._propagateToListeners.handleValueCallback ',
-            r'^#17     Future._propagateToListeners ',
-            r'^#18     Future._completeWithValue ',
-            r'^#19     _AsyncAwaitCompleter.complete ',
-            r'^#20     _completeOnAsyncReturn ',
-            r'^#21     doTestAwaitCatchError ',
-            r'^#22     _RootZone.runUnary ',
-            r'^#23     _FutureListener.handleValue ',
-            r'^#24     Future._propagateToListeners.handleValueCallback ',
-            r'^#25     Future._propagateToListeners ',
-            r'^#26     Future._completeError ',
-            r'^#27     _AsyncAwaitCompleter.completeError ',
-            r'^#28     allYield ',
-            r'^#29     _asyncErrorWrapperHelper.errorCallback ',
-            r'^#30     _RootZone.runBinary ',
-            r'^#31     _FutureListener.handleError ',
-            r'^#32     Future._propagateToListeners.handleError ',
-            r'^#33     Future._propagateToListeners ',
-            r'^#34     Future._completeError ',
-            r'^#35     _AsyncAwaitCompleter.completeError ',
-            r'^#36     allYield2 ',
-            r'^#37     _asyncErrorWrapperHelper.errorCallback ',
-            r'^#38     _RootZone.runBinary ',
-            r'^#39     _FutureListener.handleError ',
-            r'^#40     Future._propagateToListeners.handleError ',
-            r'^#41     Future._propagateToListeners ',
-            r'^#42     Future._completeError ',
-            r'^#43     _AsyncAwaitCompleter.completeError ',
-            r'^#44     allYield3 ',
-            r'^#45     _RootZone.runUnary ',
-            r'^#46     _FutureListener.handleValue ',
-            r'^#47     Future._propagateToListeners.handleValueCallback ',
-            r'^#48     Future._propagateToListeners ',
-            // TODO(dart-vm): Figure out why this is inconsistent:
-            r'^#49     Future.(_addListener|_prependListeners).<anonymous closure> ',
-            r'^#50     _microtaskLoop ',
-            r'^#51     _startMicrotaskLoop ',
-            r'^#52     _runPendingImmediateCallback ',
-            r'^#53     _RawReceivePortImpl._handleMessage ',
+            r'^#7      doTestAwait ',
+            r'^#8      doTestAwait ',
+            r'^#9      doTestsNoCausalNoLazy ',
+            r'^#10     _RootZone.runUnary ',
+            r'^#11     _FutureListener.handleValue ',
+            r'^#12     Future._propagateToListeners.handleValueCallback ',
+            r'^#13     Future._propagateToListeners ',
+            r'^#14     Future._completeWithValue ',
+            r'^#15     _completeOnAsyncReturn ',
+            r'^#16     doTestAwaitCatchError ',
+            r'^#17     _RootZone.runUnary ',
+            r'^#18     _FutureListener.handleValue ',
+            r'^#19     Future._propagateToListeners.handleValueCallback ',
+            r'^#20     Future._propagateToListeners ',
+            r'^#21     Future._completeError ',
+            r'^#22     _completeOnAsyncError ',
+            r'^#23     allYield ',
+            r'^#24     _asyncErrorWrapperHelper.errorCallback ',
+            r'^#25     _RootZone.runBinary ',
+            r'^#26     _FutureListener.handleError ',
+            r'^#27     Future._propagateToListeners.handleError ',
+            r'^#28     Future._propagateToListeners ',
+            r'^#29     Future._completeError ',
+            r'^#30     _completeOnAsyncError ',
+            r'^#31     allYield2 ',
+            r'^#32     _asyncErrorWrapperHelper.errorCallback ',
+            r'^#33     _RootZone.runBinary ',
+            r'^#34     _FutureListener.handleError ',
+            r'^#35     Future._propagateToListeners.handleError ',
+            r'^#36     Future._propagateToListeners ',
+            r'^#37     Future._completeError ',
+            r'^#38     _completeOnAsyncError ',
+            r'^#39     allYield3 ',
+            r'^#40     _RootZone.runUnary ',
+            r'^#41     _FutureListener.handleValue ',
+            r'^#42     Future._propagateToListeners.handleValueCallback ',
+            r'^#43     Future._propagateToListeners ',
+            r'^#44     Future._addListener.<anonymous closure> ',
+            r'^#45     _microtaskLoop ',
+            r'^#46     _startMicrotaskLoop ',
+            r'^#47     _runPendingImmediateCallback ',
+            r'^#48     _RawReceivePortImpl._handleMessage ',
           ],
       debugInfoFilename);
   await doTestAwaitThen(
       noYields,
       noYieldsExpected +
           const <String>[
-            r'^#10     doTestAwaitThen ',
-            r'^#11     _AsyncAwaitCompleter.start ',
-            r'^#12     doTestAwaitThen ',
-            r'^#13     doTestsNoCausalNoLazy ',
-            r'^#14     _RootZone.runUnary ',
-            r'^#15     _FutureListener.handleValue ',
-            r'^#16     Future._propagateToListeners.handleValueCallback ',
-            r'^#17     Future._propagateToListeners ',
-            r'^#18     Future._completeWithValue ',
-            r'^#19     _AsyncAwaitCompleter.complete ',
-            r'^#20     _completeOnAsyncReturn ',
-            r'^#21     doTestAwait ',
-            r'^#22     _asyncErrorWrapperHelper.errorCallback ',
-            r'^#23     _RootZone.runBinary ',
-            r'^#24     _FutureListener.handleError ',
-            r'^#25     Future._propagateToListeners.handleError ',
-            r'^#26     Future._propagateToListeners ',
-            r'^#27     Future._completeError ',
-            r'^#28     _AsyncAwaitCompleter.completeError ',
-            r'^#29     noYields ',
-            r'^#30     _asyncErrorWrapperHelper.errorCallback ',
-            r'^#31     _RootZone.runBinary ',
-            r'^#32     _FutureListener.handleError ',
-            r'^#33     Future._propagateToListeners.handleError ',
-            r'^#34     Future._propagateToListeners ',
-            r'^#35     Future._completeError ',
-            r'^#36     _AsyncAwaitCompleter.completeError ',
-            r'^#37     noYields2 ',
-            r'^#38     _asyncErrorWrapperHelper.errorCallback ',
-            r'^#39     _RootZone.runBinary ',
-            r'^#40     _FutureListener.handleError ',
-            r'^#41     Future._propagateToListeners.handleError ',
-            r'^#42     Future._propagateToListeners ',
-            r'^#43     Future._completeError ',
-            // TODO(dart-vm): Figure out why this is inconsistent:
-            r'^#44     Future.(_asyncCompleteError|_chainForeignFuture).<anonymous closure> ',
-            r'^#45     _microtaskLoop ',
-            r'^#46     _startMicrotaskLoop ',
-            r'^#47     _runPendingImmediateCallback ',
-            r'^#48     _RawReceivePortImpl._handleMessage ',
+            r'^#7      doTestAwaitThen ',
+            r'^#8      doTestAwaitThen ',
+            r'^#9      doTestsNoCausalNoLazy ',
+            r'^#10     _RootZone.runUnary ',
+            r'^#11     _FutureListener.handleValue ',
+            r'^#12     Future._propagateToListeners.handleValueCallback ',
+            r'^#13     Future._propagateToListeners ',
+            r'^#14     Future._completeWithValue ',
+            r'^#15     _completeOnAsyncReturn ',
+            r'^#16     doTestAwait ',
+            r'^#17     _asyncErrorWrapperHelper.errorCallback ',
+            r'^#18     _RootZone.runBinary ',
+            r'^#19     _FutureListener.handleError ',
+            r'^#20     Future._propagateToListeners.handleError ',
+            r'^#21     Future._propagateToListeners ',
+            r'^#22     Future._completeError ',
+            r'^#23     _completeOnAsyncError ',
+            r'^#24     noYields ',
+            r'^#25     _asyncErrorWrapperHelper.errorCallback ',
+            r'^#26     _RootZone.runBinary ',
+            r'^#27     _FutureListener.handleError ',
+            r'^#28     Future._propagateToListeners.handleError ',
+            r'^#29     Future._propagateToListeners ',
+            r'^#30     Future._completeError ',
+            r'^#31     _completeOnAsyncError ',
+            r'^#32     noYields2 ',
+            r'^#33     _asyncErrorWrapperHelper.errorCallback ',
+            r'^#34     _RootZone.runBinary ',
+            r'^#35     _FutureListener.handleError ',
+            r'^#36     Future._propagateToListeners.handleError ',
+            r'^#37     Future._propagateToListeners ',
+            r'^#38     Future._completeError ',
+            r'^#39     Future._asyncCompleteError.<anonymous closure> ',
+            r'^#40     _microtaskLoop ',
+            r'^#41     _startMicrotaskLoop ',
+            r'^#42     _runPendingImmediateCallback ',
+            r'^#43     _RawReceivePortImpl._handleMessage ',
           ],
       debugInfoFilename);
   await doTestAwaitCatchError(
       noYields,
       noYieldsExpected +
           const <String>[
-            r'^#10     doTestAwaitCatchError ',
-            r'^#11     _AsyncAwaitCompleter.start ',
-            r'^#12     doTestAwaitCatchError ',
-            r'^#13     doTestsNoCausalNoLazy ',
-            r'^#14     _RootZone.runUnary ',
-            r'^#15     _FutureListener.handleValue ',
-            r'^#16     Future._propagateToListeners.handleValueCallback ',
-            r'^#17     Future._propagateToListeners ',
-            r'^#18     Future._completeWithValue ',
-            r'^#19     _AsyncAwaitCompleter.complete ',
-            r'^#20     _completeOnAsyncReturn ',
-            r'^#21     doTestAwaitThen ',
-            r'^#22     _asyncErrorWrapperHelper.errorCallback ',
-            r'^#23     _RootZone.runBinary ',
-            r'^#24     _FutureListener.handleError ',
-            r'^#25     Future._propagateToListeners.handleError ',
-            r'^#26     Future._propagateToListeners ',
-            r'^#27     Future._completeError ',
-            r'^#28     _AsyncAwaitCompleter.completeError ',
-            r'^#29     noYields ',
-            r'^#30     _asyncErrorWrapperHelper.errorCallback ',
-            r'^#31     _RootZone.runBinary ',
-            r'^#32     _FutureListener.handleError ',
-            r'^#33     Future._propagateToListeners.handleError ',
-            r'^#34     Future._propagateToListeners ',
-            r'^#35     Future._completeError ',
-            r'^#36     _AsyncAwaitCompleter.completeError ',
-            r'^#37     noYields2 ',
-            r'^#38     _asyncErrorWrapperHelper.errorCallback ',
-            r'^#39     _RootZone.runBinary ',
-            r'^#40     _FutureListener.handleError ',
-            r'^#41     Future._propagateToListeners.handleError ',
-            r'^#42     Future._propagateToListeners ',
-            r'^#43     Future._completeError ',
-            // TODO(dart-vm): Figure out why this is inconsistent:
-            r'^#44     Future.(_asyncCompleteError|_chainForeignFuture).<anonymous closure> ',
-            r'^#45     _microtaskLoop ',
-            r'^#46     _startMicrotaskLoop ',
-            r'^#47     _runPendingImmediateCallback ',
-            r'^#48     _RawReceivePortImpl._handleMessage ',
+            r'^#7      doTestAwaitCatchError ',
+            r'^#8      doTestAwaitCatchError ',
+            r'^#9      doTestsNoCausalNoLazy ',
+            r'^#10     _RootZone.runUnary ',
+            r'^#11     _FutureListener.handleValue ',
+            r'^#12     Future._propagateToListeners.handleValueCallback ',
+            r'^#13     Future._propagateToListeners ',
+            r'^#14     Future._completeWithValue ',
+            r'^#15     _completeOnAsyncReturn ',
+            r'^#16     doTestAwaitThen ',
+            r'^#17     _asyncErrorWrapperHelper.errorCallback ',
+            r'^#18     _RootZone.runBinary ',
+            r'^#19     _FutureListener.handleError ',
+            r'^#20     Future._propagateToListeners.handleError ',
+            r'^#21     Future._propagateToListeners ',
+            r'^#22     Future._completeError ',
+            r'^#23     _completeOnAsyncError ',
+            r'^#24     noYields ',
+            r'^#25     _asyncErrorWrapperHelper.errorCallback ',
+            r'^#26     _RootZone.runBinary ',
+            r'^#27     _FutureListener.handleError ',
+            r'^#28     Future._propagateToListeners.handleError ',
+            r'^#29     Future._propagateToListeners ',
+            r'^#30     Future._completeError ',
+            r'^#31     _completeOnAsyncError ',
+            r'^#32     noYields2 ',
+            r'^#33     _asyncErrorWrapperHelper.errorCallback ',
+            r'^#34     _RootZone.runBinary ',
+            r'^#35     _FutureListener.handleError ',
+            r'^#36     Future._propagateToListeners.handleError ',
+            r'^#37     Future._propagateToListeners ',
+            r'^#38     Future._completeError ',
+            r'^#39     Future._asyncCompleteError.<anonymous closure> ',
+            r'^#40     _microtaskLoop ',
+            r'^#41     _startMicrotaskLoop ',
+            r'^#42     _runPendingImmediateCallback ',
+            r'^#43     _RawReceivePortImpl._handleMessage ',
           ],
       debugInfoFilename);
 
diff --git a/runtime/tests/vm/dart/entrypoints/common.dart b/runtime/tests/vm/dart/entrypoints/common.dart
index 0d41ddc..af25c8b 100644
--- a/runtime/tests/vm/dart/entrypoints/common.dart
+++ b/runtime/tests/vm/dart/entrypoints/common.dart
@@ -28,7 +28,7 @@
   int unchecked = 0;
 
   // Leave a little room for some cases which always use the checked entry, like
-  // lazy compile stub or interpreter warm-up.
+  // lazy compile stub.
   static const int wiggle = 10;
 
   void expectChecked(int iterations) {
diff --git a/runtime/tests/vm/dart/error_messages_in_null_checks_test.dart b/runtime/tests/vm/dart/error_messages_in_null_checks_test.dart
index 2a64885..30e08ef 100644
--- a/runtime/tests/vm/dart/error_messages_in_null_checks_test.dart
+++ b/runtime/tests/vm/dart/error_messages_in_null_checks_test.dart
@@ -89,7 +89,7 @@
 
   Expect.throws(
       () => 9.81 - doubleNull,
-      (e) => isWeakMode
+      (e) => hasUnsoundNullSafety
           ? (e is NoSuchMethodError &&
               // If '-' is specialized.
               (e.toString().startsWith(
diff --git a/runtime/tests/vm/dart/il_round_trip_deserialization_test.dart b/runtime/tests/vm/dart/il_round_trip_deserialization_test.dart
deleted file mode 100644
index 0a6f667..0000000
--- a/runtime/tests/vm/dart/il_round_trip_deserialization_test.dart
+++ /dev/null
@@ -1,20 +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.
-
-// VMOptions=
-// VMOptions=--early-round-trip-serialization
-// VMOptions=--late-round-trip-serialization
-// VMOptions=--early-round-trip-serialization --late-round-trip-serialization
-// VMOptions=--deterministic
-// VMOptions=--deterministic --early-round-trip-serialization
-// VMOptions=--deterministic --late-round-trip-serialization
-// VMOptions=--deterministic --early-round-trip-serialization --late-round-trip-serialization
-
-// Just use the existing hello world test for now.
-// TODO(36882): Add more interesting code as the deserializer grows.
-import 'hello_world_test.dart' as test;
-
-main(args) {
-  test.main();
-}
diff --git a/runtime/tests/vm/dart/null_checks_with_dwarf_stack_traces_test.dart b/runtime/tests/vm/dart/null_checks_with_dwarf_stack_traces_test.dart
index b508ea8..7a87925 100644
--- a/runtime/tests/vm/dart/null_checks_with_dwarf_stack_traces_test.dart
+++ b/runtime/tests/vm/dart/null_checks_with_dwarf_stack_traces_test.dart
@@ -52,8 +52,10 @@
 
   Expect.throws(() => doubleNull + 2.17, (e) => e is NoSuchMethodError);
 
-  Expect.throws(() => 9.81 - doubleNull,
-      (e) => isWeakMode ? (e is NoSuchMethodError) : (e is TypeError));
+  Expect.throws(
+      () => 9.81 - doubleNull,
+      (e) =>
+          hasUnsoundNullSafety ? (e is NoSuchMethodError) : (e is TypeError));
 
   Expect.throws(() => intNull * 7, (e) => e is NoSuchMethodError);
 }
diff --git a/runtime/tests/vm/dart/product_aot_kernel_test.dart b/runtime/tests/vm/dart/product_aot_kernel_test.dart
index 5bc2f13..d46dd14 100644
--- a/runtime/tests/vm/dart/product_aot_kernel_test.dart
+++ b/runtime/tests/vm/dart/product_aot_kernel_test.dart
@@ -13,7 +13,6 @@
     show BinaryBuilderWithMetadata;
 import 'package:kernel/kernel.dart';
 import 'package:path/path.dart' as path;
-import 'package:vm/metadata/bytecode.dart' show BytecodeMetadataRepository;
 
 import 'use_flag_test_helper.dart';
 
@@ -48,45 +47,22 @@
     // libraries.
 
     final component = Component();
-    final bytecodeMetadataRepository = BytecodeMetadataRepository();
-    component.addMetadataRepository(bytecodeMetadataRepository);
     final List<int> bytes = File(helloDillFile).readAsBytesSync();
     new BinaryBuilderWithMetadata(bytes).readComponent(component);
 
-    final bytecodeComponent =
-        bytecodeMetadataRepository.mapping[component]?.component;
-    if (bytecodeComponent != null) {
-      final libVmService = bytecodeComponent.libraries.singleWhere(
-          (lib) => lib.importUri.toString() == "'dart:_vmservice'");
-      final libVmServiceToplevelClass = libVmService.classes.single;
-      Expect.isTrue(libVmServiceToplevelClass.name.toString() == "''");
-      Expect.isTrue(libVmServiceToplevelClass.members.functions.isEmpty);
-      Expect.isTrue(libVmServiceToplevelClass.members.fields.isEmpty);
+    final libVmService = component.libraries
+        .singleWhere((lib) => lib.importUri.toString() == 'dart:_vmservice');
+    Expect.isTrue(libVmService.procedures.isEmpty);
+    Expect.isTrue(libVmService.classes.isEmpty);
+    Expect.isTrue(libVmService.fields.isEmpty);
 
-      final libVmServiceIo = bytecodeComponent.libraries.singleWhere(
-          (lib) => lib.importUri.toString() == "'dart:vmservice_io'");
-      final libVmServiceIoToplevelClass = libVmServiceIo.classes.single;
-      Expect.isTrue(libVmServiceIoToplevelClass.name.toString() == "''");
-      Expect.isTrue(libVmServiceIoToplevelClass.members.functions.isEmpty);
+    final libVmServiceIo = component.libraries
+        .singleWhere((lib) => lib.importUri.toString() == 'dart:vmservice_io');
+    Expect.isTrue(libVmServiceIo.procedures.isEmpty);
+    Expect.isTrue(libVmServiceIo.classes.isEmpty);
 
-      // Those fields are currently accessed by by the embedder, even in product
-      // mode.
-      Expect.isTrue(libVmServiceIoToplevelClass.members.fields.length <= 11);
-    } else {
-      final libVmService = component.libraries
-          .singleWhere((lib) => lib.importUri.toString() == 'dart:_vmservice');
-      Expect.isTrue(libVmService.procedures.isEmpty);
-      Expect.isTrue(libVmService.classes.isEmpty);
-      Expect.isTrue(libVmService.fields.isEmpty);
-
-      final libVmServiceIo = component.libraries.singleWhere(
-          (lib) => lib.importUri.toString() == 'dart:vmservice_io');
-      Expect.isTrue(libVmServiceIo.procedures.isEmpty);
-      Expect.isTrue(libVmServiceIo.classes.isEmpty);
-
-      // Those fields are currently accessed by by the embedder, even in product
-      // mode.
-      Expect.isTrue(libVmServiceIo.fields.length <= 11);
-    }
+    // Those fields are currently accessed by by the embedder, even in product
+    // mode.
+    Expect.isTrue(libVmServiceIo.fields.length <= 11);
   });
 }
diff --git a/runtime/tests/vm/dart/regress_43810_test.dart b/runtime/tests/vm/dart/regress_43810_test.dart
new file mode 100644
index 0000000..49691f1
--- /dev/null
+++ b/runtime/tests/vm/dart/regress_43810_test.dart
@@ -0,0 +1,22 @@
+// Copyright (c) 2020, 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.
+
+// Verifies that intrinsic Float64List.[]= works even if parameters are
+// unboxed.
+// Regression test for https://github.com/dart-lang/sdk/issues/43810.
+
+import 'dart:typed_data';
+import 'package:expect/expect.dart';
+
+main() {
+  final list1 = <double>[
+    1, 2, 3, 4,
+  ];
+  var list = new Float64List(list1.length);
+  list.setRange(0, list1.length, list1);
+  Expect.equals(1.0, list[0]);
+  Expect.equals(2.0, list[1]);
+  Expect.equals(3.0, list[2]);
+  Expect.equals(4.0, list[3]);
+}
diff --git a/runtime/tests/vm/dart/regress_44026_main.dart b/runtime/tests/vm/dart/regress_44026_main.dart
new file mode 100644
index 0000000..e4278bd
--- /dev/null
+++ b/runtime/tests/vm/dart/regress_44026_main.dart
@@ -0,0 +1,12 @@
+// Copyright (c) 2020, 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.
+
+// Main script for regress_44026_test.dart.
+// @dart=2.12
+
+import 'regress_44026_opt_out_lib.dart';
+
+void main() {
+  sayHello(true);
+}
diff --git a/runtime/tests/vm/dart/regress_44026_opt_out_lib.dart b/runtime/tests/vm/dart/regress_44026_opt_out_lib.dart
new file mode 100644
index 0000000..b036fba
--- /dev/null
+++ b/runtime/tests/vm/dart/regress_44026_opt_out_lib.dart
@@ -0,0 +1,14 @@
+// Copyright (c) 2020, 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.
+
+// Opted-out library for regress_44026_test.dart.
+// @dart = 2.7
+
+void sayHello(bool t) {
+  String s;
+  if (t) {
+    s = 'hello';
+  }
+  print(s);
+}
diff --git a/runtime/tests/vm/dart/regress_44026_test.dart b/runtime/tests/vm/dart/regress_44026_test.dart
new file mode 100644
index 0000000..5d14bf9
--- /dev/null
+++ b/runtime/tests/vm/dart/regress_44026_test.dart
@@ -0,0 +1,44 @@
+// Copyright (c) 2020, 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.
+
+// OtherResources=regress_44026_main.dart
+// OtherResources=regress_44026_opt_out_lib.dart
+
+// Tests that compile-time error is issued if NNBD opted-out library is used
+// from opted-in entry point (with null safety auto-detection).
+// Regression test for https://github.com/dart-lang/sdk/issues/44026.
+
+import 'dart:io' show File, Platform, Process;
+
+import 'package:expect/expect.dart';
+import 'package:path/path.dart' as path;
+import 'snapshot_test_helper.dart';
+
+const int kCompilationErrorExitCode = 254;
+
+main() async {
+  await withTempDir((String temp) async {
+    // Need to copy test scripts out of Dart SDK to avoid hardcoded
+    // opted-in/opted-out status for Dart SDK tests.
+    for (String script in [
+      'regress_44026_main.dart',
+      'regress_44026_opt_out_lib.dart'
+    ]) {
+      final scriptInTemp = path.join(temp, script);
+      File.fromUri(Platform.script.resolve(script)).copySync(scriptInTemp);
+    }
+
+    // Do not add Platform.executableArguments into arguments to avoid passing
+    // --sound-null-safety / --no-sound-null-safety arguments.
+    final result = await Process.run(Platform.executable, [
+      path.join(temp, 'regress_44026_main.dart'),
+    ]);
+    print('stdout: ${result.stdout}');
+    print('stderr: ${result.stderr}');
+    Expect.equals(kCompilationErrorExitCode, result.exitCode);
+    Expect.stringContainsInOrder(result.stderr, [
+      "Error: A library can't opt out of null safety by default, when using sound null safety."
+    ]);
+  });
+}
diff --git a/runtime/tests/vm/dart/regress_merge_blocks_with_phis_test.dart b/runtime/tests/vm/dart/regress_merge_blocks_with_phis_test.dart
deleted file mode 100644
index 606e4c5..0000000
--- a/runtime/tests/vm/dart/regress_merge_blocks_with_phis_test.dart
+++ /dev/null
@@ -1,35 +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.
-//
-// VMOptions=--optimization-counter-threshold=5 --use-bytecode-compiler
-//
-// Test that block merging takes phis into account.
-//
-// The problem only reproduces with bytecode compiler (--use-bytecode-compiler)
-// as bytecode doesn't have backward branches for the redundant loops.
-// OSR handling code inserts Phi instructions to JoinEntry
-// even when there is only one predecessor. This results in a flow graph
-// suitable for block merging with a successor block containing Phi.
-
-import 'package:expect/expect.dart';
-
-void testBottomUpInference() {
-  Expect.type<List<int>>([for (; false;) 1]);
-  Expect.type<List<int>>([for (; false;) 1]);
-  Expect.type<List<int>>([for (; false;) 1]);
-  Expect.type<List<int>>([for (; false;) 1]);
-  Expect.type<List<int>>([for (; false;) 1]);
-  Expect.type<List<int>>([for (; false;) 1]);
-  Expect.type<List<int>>([for (; false;) 1]);
-  Expect.type<List<int>>([for (; false;) 1]);
-  Expect.type<List<int>>([for (; false;) 1]);
-  Expect.type<List<int>>([for (; false;) 1]);
-  Expect.type<List<int>>([for (; false;) 1]);
-  Expect.type<List<int>>([for (; false;) 1]);
-  Expect.type<List<int>>([for (; false;) 1]);
-}
-
-main() {
-  testBottomUpInference();
-}
diff --git a/runtime/tests/vm/dart/transferable_throws_test.dart b/runtime/tests/vm/dart/transferable_throws_test.dart
index c2a35d6..2ad3605 100644
--- a/runtime/tests/vm/dart/transferable_throws_test.dart
+++ b/runtime/tests/vm/dart/transferable_throws_test.dart
@@ -107,7 +107,7 @@
   throwsIfCummulativeListIsTooLargeOn32bitPlatform();
 
   dynamic myNull;
-  if (isWeakMode) {
+  if (hasUnsoundNullSafety) {
     Expect.throwsArgumentError(() => TransferableTypedData.fromList(myNull));
     Expect.throwsArgumentError(() => TransferableTypedData.fromList([myNull]));
     Expect.throwsArgumentError(
diff --git a/runtime/tests/vm/dart_2/causal_stacks/utils.dart b/runtime/tests/vm/dart_2/causal_stacks/utils.dart
index 94db964..743986d 100644
--- a/runtime/tests/vm/dart_2/causal_stacks/utils.dart
+++ b/runtime/tests/vm/dart_2/causal_stacks/utils.dart
@@ -770,156 +770,144 @@
   final noYieldsExpected = const <String>[
     r'^#0      throwSync \(.*/utils.dart:16(:3)?\)$',
     r'^#1      noYields3 \(.*/utils.dart:54(:3)?\)$',
-    r'^#2      _AsyncAwaitCompleter.start ',
-    r'^#3      noYields3 \(.*/utils.dart:53(:23)?\)$',
-    r'^#4      noYields2 \(.*/utils.dart:50(:9)?\)$',
-    r'^#5      _AsyncAwaitCompleter.start ',
-    r'^#6      noYields2 \(.*/utils.dart:49(:23)?\)$',
-    r'^#7      noYields \(.*/utils.dart:46(:9)?\)$',
-    r'^#8      _AsyncAwaitCompleter.start ',
-    r'^#9      noYields \(.*/utils.dart:45(:22)?\)$',
+    r'^#2      noYields3 \(.*/utils.dart:53(:23)?\)$',
+    r'^#3      noYields2 \(.*/utils.dart:50(:9)?\)$',
+    r'^#4      noYields2 \(.*/utils.dart:49(:23)?\)$',
+    r'^#5      noYields \(.*/utils.dart:46(:9)?\)$',
+    r'^#6      noYields \(.*/utils.dart:45(:22)?\)$',
   ];
   await doTestAwait(
       noYields,
       noYieldsExpected +
           const <String>[
-            r'^#10     doTestAwait ',
-            r'^#11     _AsyncAwaitCompleter.start ',
-            r'^#12     doTestAwait ',
-            r'^#13     doTestsNoCausalNoLazy ',
-            r'^#14     _RootZone.runUnary ',
-            r'^#15     _FutureListener.handleValue ',
-            r'^#16     Future._propagateToListeners.handleValueCallback ',
-            r'^#17     Future._propagateToListeners ',
-            r'^#18     Future._completeWithValue ',
-            r'^#19     _AsyncAwaitCompleter.complete ',
-            r'^#20     _completeOnAsyncReturn ',
-            r'^#21     doTestAwaitCatchError ',
-            r'^#22     _RootZone.runUnary ',
-            r'^#23     _FutureListener.handleValue ',
-            r'^#24     Future._propagateToListeners.handleValueCallback ',
-            r'^#25     Future._propagateToListeners ',
-            r'^#26     Future._completeError ',
-            r'^#27     _AsyncAwaitCompleter.completeError ',
-            r'^#28     allYield ',
-            r'^#29     _asyncErrorWrapperHelper.errorCallback ',
-            r'^#30     _RootZone.runBinary ',
-            r'^#31     _FutureListener.handleError ',
-            r'^#32     Future._propagateToListeners.handleError ',
-            r'^#33     Future._propagateToListeners ',
-            r'^#34     Future._completeError ',
-            r'^#35     _AsyncAwaitCompleter.completeError ',
-            r'^#36     allYield2 ',
-            r'^#37     _asyncErrorWrapperHelper.errorCallback ',
-            r'^#38     _RootZone.runBinary ',
-            r'^#39     _FutureListener.handleError ',
-            r'^#40     Future._propagateToListeners.handleError ',
-            r'^#41     Future._propagateToListeners ',
-            r'^#42     Future._completeError ',
-            r'^#43     _AsyncAwaitCompleter.completeError ',
-            r'^#44     allYield3 ',
-            r'^#45     _RootZone.runUnary ',
-            r'^#46     _FutureListener.handleValue ',
-            r'^#47     Future._propagateToListeners.handleValueCallback ',
-            r'^#48     Future._propagateToListeners ',
-            // TODO(dart-vm): Figure out why this is inconsistent:
-            r'^#49     Future.(_addListener|_prependListeners).<anonymous closure> ',
-            r'^#50     _microtaskLoop ',
-            r'^#51     _startMicrotaskLoop ',
-            r'^#52     _runPendingImmediateCallback ',
-            r'^#53     _RawReceivePortImpl._handleMessage ',
+            r'^#7      doTestAwait ',
+            r'^#8      doTestAwait ',
+            r'^#9      doTestsNoCausalNoLazy ',
+            r'^#10     _RootZone.runUnary ',
+            r'^#11     _FutureListener.handleValue ',
+            r'^#12     Future._propagateToListeners.handleValueCallback ',
+            r'^#13     Future._propagateToListeners ',
+            r'^#14     Future._completeWithValue ',
+            r'^#15     _completeOnAsyncReturn ',
+            r'^#16     doTestAwaitCatchError ',
+            r'^#17     _RootZone.runUnary ',
+            r'^#18     _FutureListener.handleValue ',
+            r'^#19     Future._propagateToListeners.handleValueCallback ',
+            r'^#20     Future._propagateToListeners ',
+            r'^#21     Future._completeError ',
+            r'^#22     _completeOnAsyncError ',
+            r'^#23     allYield ',
+            r'^#24     _asyncErrorWrapperHelper.errorCallback ',
+            r'^#25     _RootZone.runBinary ',
+            r'^#26     _FutureListener.handleError ',
+            r'^#27     Future._propagateToListeners.handleError ',
+            r'^#28     Future._propagateToListeners ',
+            r'^#29     Future._completeError ',
+            r'^#30     _completeOnAsyncError ',
+            r'^#31     allYield2 ',
+            r'^#32     _asyncErrorWrapperHelper.errorCallback ',
+            r'^#33     _RootZone.runBinary ',
+            r'^#34     _FutureListener.handleError ',
+            r'^#35     Future._propagateToListeners.handleError ',
+            r'^#36     Future._propagateToListeners ',
+            r'^#37     Future._completeError ',
+            r'^#38     _completeOnAsyncError ',
+            r'^#39     allYield3 ',
+            r'^#40     _RootZone.runUnary ',
+            r'^#41     _FutureListener.handleValue ',
+            r'^#42     Future._propagateToListeners.handleValueCallback ',
+            r'^#43     Future._propagateToListeners ',
+            r'^#44     Future._addListener.<anonymous closure> ',
+            r'^#45     _microtaskLoop ',
+            r'^#46     _startMicrotaskLoop ',
+            r'^#47     _runPendingImmediateCallback ',
+            r'^#48     _RawReceivePortImpl._handleMessage ',
           ],
       debugInfoFilename);
   await doTestAwaitThen(
       noYields,
       noYieldsExpected +
           const <String>[
-            r'^#10     doTestAwaitThen ',
-            r'^#11     _AsyncAwaitCompleter.start ',
-            r'^#12     doTestAwaitThen ',
-            r'^#13     doTestsNoCausalNoLazy ',
-            r'^#14     _RootZone.runUnary ',
-            r'^#15     _FutureListener.handleValue ',
-            r'^#16     Future._propagateToListeners.handleValueCallback ',
-            r'^#17     Future._propagateToListeners ',
-            r'^#18     Future._completeWithValue ',
-            r'^#19     _AsyncAwaitCompleter.complete ',
-            r'^#20     _completeOnAsyncReturn ',
-            r'^#21     doTestAwait ',
-            r'^#22     _asyncErrorWrapperHelper.errorCallback ',
-            r'^#23     _RootZone.runBinary ',
-            r'^#24     _FutureListener.handleError ',
-            r'^#25     Future._propagateToListeners.handleError ',
-            r'^#26     Future._propagateToListeners ',
-            r'^#27     Future._completeError ',
-            r'^#28     _AsyncAwaitCompleter.completeError ',
-            r'^#29     noYields ',
-            r'^#30     _asyncErrorWrapperHelper.errorCallback ',
-            r'^#31     _RootZone.runBinary ',
-            r'^#32     _FutureListener.handleError ',
-            r'^#33     Future._propagateToListeners.handleError ',
-            r'^#34     Future._propagateToListeners ',
-            r'^#35     Future._completeError ',
-            r'^#36     _AsyncAwaitCompleter.completeError ',
-            r'^#37     noYields2 ',
-            r'^#38     _asyncErrorWrapperHelper.errorCallback ',
-            r'^#39     _RootZone.runBinary ',
-            r'^#40     _FutureListener.handleError ',
-            r'^#41     Future._propagateToListeners.handleError ',
-            r'^#42     Future._propagateToListeners ',
-            r'^#43     Future._completeError ',
-            // TODO(dart-vm): Figure out why this is inconsistent:
-            r'^#44     Future.(_asyncCompleteError|_chainForeignFuture).<anonymous closure> ',
-            r'^#45     _microtaskLoop ',
-            r'^#46     _startMicrotaskLoop ',
-            r'^#47     _runPendingImmediateCallback ',
-            r'^#48     _RawReceivePortImpl._handleMessage ',
+            r'^#7      doTestAwaitThen ',
+            r'^#8      doTestAwaitThen ',
+            r'^#9      doTestsNoCausalNoLazy ',
+            r'^#10     _RootZone.runUnary ',
+            r'^#11     _FutureListener.handleValue ',
+            r'^#12     Future._propagateToListeners.handleValueCallback ',
+            r'^#13     Future._propagateToListeners ',
+            r'^#14     Future._completeWithValue ',
+            r'^#15     _completeOnAsyncReturn ',
+            r'^#16     doTestAwait ',
+            r'^#17     _asyncErrorWrapperHelper.errorCallback ',
+            r'^#18     _RootZone.runBinary ',
+            r'^#19     _FutureListener.handleError ',
+            r'^#20     Future._propagateToListeners.handleError ',
+            r'^#21     Future._propagateToListeners ',
+            r'^#22     Future._completeError ',
+            r'^#23     _completeOnAsyncError ',
+            r'^#24     noYields ',
+            r'^#25     _asyncErrorWrapperHelper.errorCallback ',
+            r'^#26     _RootZone.runBinary ',
+            r'^#27     _FutureListener.handleError ',
+            r'^#28     Future._propagateToListeners.handleError ',
+            r'^#29     Future._propagateToListeners ',
+            r'^#30     Future._completeError ',
+            r'^#31     _completeOnAsyncError ',
+            r'^#32     noYields2 ',
+            r'^#33     _asyncErrorWrapperHelper.errorCallback ',
+            r'^#34     _RootZone.runBinary ',
+            r'^#35     _FutureListener.handleError ',
+            r'^#36     Future._propagateToListeners.handleError ',
+            r'^#37     Future._propagateToListeners ',
+            r'^#38     Future._completeError ',
+            r'^#39     Future._asyncCompleteError.<anonymous closure> ',
+            r'^#40     _microtaskLoop ',
+            r'^#41     _startMicrotaskLoop ',
+            r'^#42     _runPendingImmediateCallback ',
+            r'^#43     _RawReceivePortImpl._handleMessage ',
           ],
       debugInfoFilename);
   await doTestAwaitCatchError(
       noYields,
       noYieldsExpected +
           const <String>[
-            r'^#10     doTestAwaitCatchError ',
-            r'^#11     _AsyncAwaitCompleter.start ',
-            r'^#12     doTestAwaitCatchError ',
-            r'^#13     doTestsNoCausalNoLazy ',
-            r'^#14     _RootZone.runUnary ',
-            r'^#15     _FutureListener.handleValue ',
-            r'^#16     Future._propagateToListeners.handleValueCallback ',
-            r'^#17     Future._propagateToListeners ',
-            r'^#18     Future._completeWithValue ',
-            r'^#19     _AsyncAwaitCompleter.complete ',
-            r'^#20     _completeOnAsyncReturn ',
-            r'^#21     doTestAwaitThen ',
-            r'^#22     _asyncErrorWrapperHelper.errorCallback ',
-            r'^#23     _RootZone.runBinary ',
-            r'^#24     _FutureListener.handleError ',
-            r'^#25     Future._propagateToListeners.handleError ',
-            r'^#26     Future._propagateToListeners ',
-            r'^#27     Future._completeError ',
-            r'^#28     _AsyncAwaitCompleter.completeError ',
-            r'^#29     noYields ',
-            r'^#30     _asyncErrorWrapperHelper.errorCallback ',
-            r'^#31     _RootZone.runBinary ',
-            r'^#32     _FutureListener.handleError ',
-            r'^#33     Future._propagateToListeners.handleError ',
-            r'^#34     Future._propagateToListeners ',
-            r'^#35     Future._completeError ',
-            r'^#36     _AsyncAwaitCompleter.completeError ',
-            r'^#37     noYields2 ',
-            r'^#38     _asyncErrorWrapperHelper.errorCallback ',
-            r'^#39     _RootZone.runBinary ',
-            r'^#40     _FutureListener.handleError ',
-            r'^#41     Future._propagateToListeners.handleError ',
-            r'^#42     Future._propagateToListeners ',
-            r'^#43     Future._completeError ',
-            // TODO(dart-vm): Figure out why this is inconsistent:
-            r'^#44     Future.(_asyncCompleteError|_chainForeignFuture).<anonymous closure> ',
-            r'^#45     _microtaskLoop ',
-            r'^#46     _startMicrotaskLoop ',
-            r'^#47     _runPendingImmediateCallback ',
-            r'^#48     _RawReceivePortImpl._handleMessage ',
+            r'^#7      doTestAwaitCatchError ',
+            r'^#8      doTestAwaitCatchError ',
+            r'^#9      doTestsNoCausalNoLazy ',
+            r'^#10     _RootZone.runUnary ',
+            r'^#11     _FutureListener.handleValue ',
+            r'^#12     Future._propagateToListeners.handleValueCallback ',
+            r'^#13     Future._propagateToListeners ',
+            r'^#14     Future._completeWithValue ',
+            r'^#15     _completeOnAsyncReturn ',
+            r'^#16     doTestAwaitThen ',
+            r'^#17     _asyncErrorWrapperHelper.errorCallback ',
+            r'^#18     _RootZone.runBinary ',
+            r'^#19     _FutureListener.handleError ',
+            r'^#20     Future._propagateToListeners.handleError ',
+            r'^#21     Future._propagateToListeners ',
+            r'^#22     Future._completeError ',
+            r'^#23     _completeOnAsyncError ',
+            r'^#24     noYields ',
+            r'^#25     _asyncErrorWrapperHelper.errorCallback ',
+            r'^#26     _RootZone.runBinary ',
+            r'^#27     _FutureListener.handleError ',
+            r'^#28     Future._propagateToListeners.handleError ',
+            r'^#29     Future._propagateToListeners ',
+            r'^#30     Future._completeError ',
+            r'^#31     _completeOnAsyncError ',
+            r'^#32     noYields2 ',
+            r'^#33     _asyncErrorWrapperHelper.errorCallback ',
+            r'^#34     _RootZone.runBinary ',
+            r'^#35     _FutureListener.handleError ',
+            r'^#36     Future._propagateToListeners.handleError ',
+            r'^#37     Future._propagateToListeners ',
+            r'^#38     Future._completeError ',
+            r'^#39     Future._asyncCompleteError.<anonymous closure> ',
+            r'^#40     _microtaskLoop ',
+            r'^#41     _startMicrotaskLoop ',
+            r'^#42     _runPendingImmediateCallback ',
+            r'^#43     _RawReceivePortImpl._handleMessage ',
           ],
       debugInfoFilename);
 
diff --git a/runtime/tests/vm/dart_2/entrypoints/common.dart b/runtime/tests/vm/dart_2/entrypoints/common.dart
index bc8822a..19c01b4 100644
--- a/runtime/tests/vm/dart_2/entrypoints/common.dart
+++ b/runtime/tests/vm/dart_2/entrypoints/common.dart
@@ -28,7 +28,7 @@
   int unchecked = 0;
 
   // Leave a little room for some cases which always use the checked entry, like
-  // lazy compile stub or interpreter warm-up.
+  // lazy compile stub.
   static const int wiggle = 10;
 
   void expectChecked(int iterations) {
diff --git a/runtime/tests/vm/dart_2/il_round_trip_deserialization_test.dart b/runtime/tests/vm/dart_2/il_round_trip_deserialization_test.dart
deleted file mode 100644
index 0a6f667..0000000
--- a/runtime/tests/vm/dart_2/il_round_trip_deserialization_test.dart
+++ /dev/null
@@ -1,20 +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.
-
-// VMOptions=
-// VMOptions=--early-round-trip-serialization
-// VMOptions=--late-round-trip-serialization
-// VMOptions=--early-round-trip-serialization --late-round-trip-serialization
-// VMOptions=--deterministic
-// VMOptions=--deterministic --early-round-trip-serialization
-// VMOptions=--deterministic --late-round-trip-serialization
-// VMOptions=--deterministic --early-round-trip-serialization --late-round-trip-serialization
-
-// Just use the existing hello world test for now.
-// TODO(36882): Add more interesting code as the deserializer grows.
-import 'hello_world_test.dart' as test;
-
-main(args) {
-  test.main();
-}
diff --git a/runtime/tests/vm/dart_2/product_aot_kernel_test.dart b/runtime/tests/vm/dart_2/product_aot_kernel_test.dart
index 5bc2f13..d46dd14 100644
--- a/runtime/tests/vm/dart_2/product_aot_kernel_test.dart
+++ b/runtime/tests/vm/dart_2/product_aot_kernel_test.dart
@@ -13,7 +13,6 @@
     show BinaryBuilderWithMetadata;
 import 'package:kernel/kernel.dart';
 import 'package:path/path.dart' as path;
-import 'package:vm/metadata/bytecode.dart' show BytecodeMetadataRepository;
 
 import 'use_flag_test_helper.dart';
 
@@ -48,45 +47,22 @@
     // libraries.
 
     final component = Component();
-    final bytecodeMetadataRepository = BytecodeMetadataRepository();
-    component.addMetadataRepository(bytecodeMetadataRepository);
     final List<int> bytes = File(helloDillFile).readAsBytesSync();
     new BinaryBuilderWithMetadata(bytes).readComponent(component);
 
-    final bytecodeComponent =
-        bytecodeMetadataRepository.mapping[component]?.component;
-    if (bytecodeComponent != null) {
-      final libVmService = bytecodeComponent.libraries.singleWhere(
-          (lib) => lib.importUri.toString() == "'dart:_vmservice'");
-      final libVmServiceToplevelClass = libVmService.classes.single;
-      Expect.isTrue(libVmServiceToplevelClass.name.toString() == "''");
-      Expect.isTrue(libVmServiceToplevelClass.members.functions.isEmpty);
-      Expect.isTrue(libVmServiceToplevelClass.members.fields.isEmpty);
+    final libVmService = component.libraries
+        .singleWhere((lib) => lib.importUri.toString() == 'dart:_vmservice');
+    Expect.isTrue(libVmService.procedures.isEmpty);
+    Expect.isTrue(libVmService.classes.isEmpty);
+    Expect.isTrue(libVmService.fields.isEmpty);
 
-      final libVmServiceIo = bytecodeComponent.libraries.singleWhere(
-          (lib) => lib.importUri.toString() == "'dart:vmservice_io'");
-      final libVmServiceIoToplevelClass = libVmServiceIo.classes.single;
-      Expect.isTrue(libVmServiceIoToplevelClass.name.toString() == "''");
-      Expect.isTrue(libVmServiceIoToplevelClass.members.functions.isEmpty);
+    final libVmServiceIo = component.libraries
+        .singleWhere((lib) => lib.importUri.toString() == 'dart:vmservice_io');
+    Expect.isTrue(libVmServiceIo.procedures.isEmpty);
+    Expect.isTrue(libVmServiceIo.classes.isEmpty);
 
-      // Those fields are currently accessed by by the embedder, even in product
-      // mode.
-      Expect.isTrue(libVmServiceIoToplevelClass.members.fields.length <= 11);
-    } else {
-      final libVmService = component.libraries
-          .singleWhere((lib) => lib.importUri.toString() == 'dart:_vmservice');
-      Expect.isTrue(libVmService.procedures.isEmpty);
-      Expect.isTrue(libVmService.classes.isEmpty);
-      Expect.isTrue(libVmService.fields.isEmpty);
-
-      final libVmServiceIo = component.libraries.singleWhere(
-          (lib) => lib.importUri.toString() == 'dart:vmservice_io');
-      Expect.isTrue(libVmServiceIo.procedures.isEmpty);
-      Expect.isTrue(libVmServiceIo.classes.isEmpty);
-
-      // Those fields are currently accessed by by the embedder, even in product
-      // mode.
-      Expect.isTrue(libVmServiceIo.fields.length <= 11);
-    }
+    // Those fields are currently accessed by by the embedder, even in product
+    // mode.
+    Expect.isTrue(libVmServiceIo.fields.length <= 11);
   });
 }
diff --git a/runtime/tests/vm/dart_2/regress_merge_blocks_with_phis_test.dart b/runtime/tests/vm/dart_2/regress_merge_blocks_with_phis_test.dart
deleted file mode 100644
index 606e4c5..0000000
--- a/runtime/tests/vm/dart_2/regress_merge_blocks_with_phis_test.dart
+++ /dev/null
@@ -1,35 +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.
-//
-// VMOptions=--optimization-counter-threshold=5 --use-bytecode-compiler
-//
-// Test that block merging takes phis into account.
-//
-// The problem only reproduces with bytecode compiler (--use-bytecode-compiler)
-// as bytecode doesn't have backward branches for the redundant loops.
-// OSR handling code inserts Phi instructions to JoinEntry
-// even when there is only one predecessor. This results in a flow graph
-// suitable for block merging with a successor block containing Phi.
-
-import 'package:expect/expect.dart';
-
-void testBottomUpInference() {
-  Expect.type<List<int>>([for (; false;) 1]);
-  Expect.type<List<int>>([for (; false;) 1]);
-  Expect.type<List<int>>([for (; false;) 1]);
-  Expect.type<List<int>>([for (; false;) 1]);
-  Expect.type<List<int>>([for (; false;) 1]);
-  Expect.type<List<int>>([for (; false;) 1]);
-  Expect.type<List<int>>([for (; false;) 1]);
-  Expect.type<List<int>>([for (; false;) 1]);
-  Expect.type<List<int>>([for (; false;) 1]);
-  Expect.type<List<int>>([for (; false;) 1]);
-  Expect.type<List<int>>([for (; false;) 1]);
-  Expect.type<List<int>>([for (; false;) 1]);
-  Expect.type<List<int>>([for (; false;) 1]);
-}
-
-main() {
-  testBottomUpInference();
-}
diff --git a/runtime/tests/vm/dart_2/splay_test.dart b/runtime/tests/vm/dart_2/splay_test.dart
index 824fe01..06a2951 100644
--- a/runtime/tests/vm/dart_2/splay_test.dart
+++ b/runtime/tests/vm/dart_2/splay_test.dart
@@ -9,6 +9,10 @@
 // used for old nodes. Because of the way splay trees work, the engine
 // also has to deal with a lot of changes to the large tree object
 // graph.
+//
+// This file is copied into another directory and the default opt out scheme of
+// CFE using the pattern 'vm/dart_2' doesn't work, so opt it out explicitly.
+// @dart=2.9
 
 // VMOptions=
 // VMOptions=--no_concurrent_mark --no_concurrent_sweep
diff --git a/runtime/tests/vm/vm.status b/runtime/tests/vm/vm.status
index 2d7c568..16ee403 100644
--- a/runtime/tests/vm/vm.status
+++ b/runtime/tests/vm/vm.status
@@ -157,10 +157,6 @@
 
 [ $system == windows ]
 cc/CorelibCompilerStats: Skip
-cc/GenKernelKernelCombined: Skip # Issue 34393.
-cc/GenKernelKernelLoadKernel: Skip # Issue 34542.
-cc/GenKernelKernelMaxRSS: Skip # Issue 34393.
-cc/GenKernelKernelReadAllBytecode: Skip # Issue 34393.
 dart/disassemble_determinism_test: Slow, Pass # Times out on slower bots.
 dart_2/disassemble_determinism_test: Slow, Pass # Times out on slower bots.
 
@@ -260,6 +256,7 @@
 dart/kernel_determinism_test: SkipByDesign # Test needs to run from source
 dart/minimal_kernel_test: SkipByDesign # Test needs to run from source
 dart/null_safety_autodetection_in_kernel_compiler_test: SkipByDesign # Test needs to run from source
+dart/regress_44026_test: SkipByDesign # Test needs to run from source
 dart/snapshot_depfile_test: SkipByDesign # Test needs to run from source
 dart/type_casts_with_null_safety_autodetection_test: SkipByDesign # Test needs to run from source
 dart_2/appjit*: SkipByDesign # Test needs to run from source
@@ -300,12 +297,6 @@
 dart/v8_snapshot_profile_writer_test: SkipByDesign # Only relevant for AOT. Doesn't work in cross-compilation (has to run on the host). On Linux/simarm64 and Linux/simarm this test requires buildtools/clang which is not always available on testing shards.
 dart_2/v8_snapshot_profile_writer_test: SkipByDesign # Only relevant for AOT. Doesn't work in cross-compilation (has to run on the host). On Linux/simarm64 and Linux/simarm this test requires buildtools/clang which is not always available on testing shards.
 
-[ $arch == arm || $arch == ia32 || $arch == simarm ]
-cc/GenKernelKernelCombined: SkipByDesign # No interpreter support.
-cc/GenKernelKernelLoadKernel: SkipByDesign # No interpreter support.
-cc/GenKernelKernelMaxRSS: SkipByDesign # No interpreter support.
-cc/GenKernelKernelReadAllBytecode: SkipByDesign # No interpreter support.
-
 # On the simluator stack traces produced by the Profiler do not match
 # up with the real Dart stack trace and hence we don't get correct
 # symbol names.
diff --git a/runtime/tools/dartfuzz/README.md b/runtime/tools/dartfuzz/README.md
index 7165b63..b1531d0 100644
--- a/runtime/tools/dartfuzz/README.md
+++ b/runtime/tools/dartfuzz/README.md
@@ -61,10 +61,6 @@
     --mode2            : m2, and values one of
         jit-[debug-][ia32|x64|arm32|arm64]               = Dart JIT
         aot-[debug-][x64|arm32|arm64]                    = Dart AOT
-        kbc-[int|mix|cmp]-[debug-][ia32|x64|arm32|arm64] = Dart KBC
-                                                           (interpreted/
-                                                            mixed-mode/
-                                                            compiled bytecode)
         djs-x64                                          = dart2js + Node.JS
     --[no-]rerun       : re-run a testcase if there is only a divergence in
                          the return codes outside the range [-255,+255];
diff --git a/runtime/tools/dartfuzz/dartfuzz.dart b/runtime/tools/dartfuzz/dartfuzz.dart
index 5ea91ef0..af137ed 100644
--- a/runtime/tools/dartfuzz/dartfuzz.dart
+++ b/runtime/tools/dartfuzz/dartfuzz.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 import 'dart:io';
 import 'dart:math';
 
diff --git a/runtime/tools/dartfuzz/dartfuzz_api_table.dart b/runtime/tools/dartfuzz/dartfuzz_api_table.dart
index b002073..6425437 100644
--- a/runtime/tools/dartfuzz/dartfuzz_api_table.dart
+++ b/runtime/tools/dartfuzz/dartfuzz_api_table.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 /// NOTE: this code has been generated automatically.
 
 import "dartfuzz_type_table.dart";
diff --git a/runtime/tools/dartfuzz/dartfuzz_test.dart b/runtime/tools/dartfuzz/dartfuzz_test.dart
index 3edcb2f..8e826fa 100644
--- a/runtime/tools/dartfuzz/dartfuzz_test.dart
+++ b/runtime/tools/dartfuzz/dartfuzz_test.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 import 'dart:io';
 import 'dart:isolate';
 import 'dart:math';
@@ -49,26 +51,6 @@
     String prefix = mode.substring(0, 3).toUpperCase();
     String tag = getTag(mode);
     List<String> extraFlags = [];
-    // Required extra flags for kbc.
-    if (mode.startsWith('kbc-int')) {
-      prefix += '-INT';
-      extraFlags += [
-        '--enable-interpreter',
-        '--compilation-counter-threshold=-1'
-      ];
-    } else if (mode.startsWith('kbc-mix')) {
-      prefix += '-MIX';
-      extraFlags += ['--enable-interpreter'];
-    } else if (mode.startsWith('kbc-cmp')) {
-      prefix += '-CMP';
-      extraFlags += ['--use-bytecode-compiler'];
-    }
-    // Every once in a while, go directly from source for kbc.
-    bool kbcSrc = false;
-    if (mode.startsWith('kbc') && rand.nextInt(4) == 0) {
-      prefix += '-SRC';
-      kbcSrc = true;
-    }
     // Every once in a while, stress test JIT.
     if (mode.startsWith('jit') && rand.nextInt(4) == 0) {
       final r = rand.nextInt(7);
@@ -124,9 +106,6 @@
       return TestRunnerJIT(prefix, tag, top, tmp, env, fileName, extraFlags);
     } else if (mode.startsWith('aot')) {
       return TestRunnerAOT(prefix, tag, top, tmp, env, fileName, extraFlags);
-    } else if (mode.startsWith('kbc')) {
-      return TestRunnerKBC(
-          prefix, tag, top, tmp, env, fileName, extraFlags, kbcSrc);
     } else if (mode.startsWith('djs')) {
       return TestRunnerDJS(prefix, tag, top, tmp, env, fileName);
     }
@@ -225,60 +204,6 @@
   List<String> cmd;
 }
 
-/// Concrete test runner of bytecode.
-class TestRunnerKBC implements TestRunner {
-  TestRunnerKBC(String prefix, String tag, this.top, this.tmp, this.env,
-      this.fileName, List<String> extraFlags, bool kbcSrc) {
-    description = '$prefix-$tag';
-    dart = '$top/out/$tag/dart';
-    if (kbcSrc) {
-      cmd = [
-        dart,
-        ...extraFlags,
-        '--old_gen_heap_size=${dartHeapSize}',
-        fileName
-      ];
-    } else {
-      generate = '$top/pkg/vm/tool/gen_kernel';
-      platform = '--platform=$top/out/$tag/vm_platform_strong.dill';
-      dill = '$tmp/out.dill';
-      cmd = [dart, ...extraFlags, '--old_gen_heap_size=${dartHeapSize}', dill];
-    }
-  }
-
-  TestResult run() {
-    if (generate != null) {
-      TestResult result = runCommand(
-          [generate, '--gen-bytecode', platform, '-o', dill, fileName], env);
-      if (result.exitCode != 0) {
-        return result;
-      }
-    }
-    return runCommand(cmd, env);
-  }
-
-  void printReproductionCommand() {
-    if (generate != null) {
-      print([generate, '--gen-bytecode', platform, '-o', dill, fileName]
-          .join(" ")
-          .replaceAll('$top/', '')
-          .replaceAll('$tmp/', ''));
-    }
-    print(cmd.join(" ").replaceAll('$top/', '').replaceAll('$tmp/', ''));
-  }
-
-  String description;
-  String generate;
-  String platform;
-  String dill;
-  String dart;
-  String fileName;
-  final String top;
-  final String tmp;
-  Map<String, String> env;
-  List<String> cmd;
-}
-
 /// Concrete test runner of Dart2JS.
 class TestRunnerDJS implements TestRunner {
   TestRunnerDJS(
@@ -411,8 +336,8 @@
           (mode1.contains('ia32') && mode2.contains('ia32')));
 
   bool ffiCapable(String mode1, String mode2) =>
-      (mode1.startsWith('jit') || mode1.startsWith('kbc')) &&
-      (mode2.startsWith('jit') || mode2.startsWith('kbc')) &&
+      mode1.startsWith('jit') &&
+      mode2.startsWith('jit') &&
       (!mode1.contains('arm') && !mode2.contains('arm'));
 
   bool nestedTypesAllowed(String mode1, String mode2) =>
@@ -757,30 +682,6 @@
     'jit-arm64',
     'aot-debug-x64',
     'aot-x64',
-    'kbc-int-debug-ia32',
-    'kbc-cmp-debug-ia32',
-    'kbc-mix-debug-ia32',
-    'kbc-int-debug-x64',
-    'kbc-cmp-debug-x64',
-    'kbc-mix-debug-x64',
-    'kbc-int-debug-arm32',
-    'kbc-cmp-debug-arm32',
-    'kbc-mix-debug-arm32',
-    'kbc-int-debug-arm64',
-    'kbc-cmp-debug-arm64',
-    'kbc-mix-debug-arm64',
-    'kbc-int-ia32',
-    'kbc-cmp-ia32',
-    'kbc-mix-ia32',
-    'kbc-int-x64',
-    'kbc-cmp-x64',
-    'kbc-mix-x64',
-    'kbc-int-arm32',
-    'kbc-cmp-arm32',
-    'kbc-mix-arm32',
-    'kbc-int-arm64',
-    'kbc-cmp-arm64',
-    'kbc-mix-arm64',
   ];
 
   // Modes not used on cluster runs because they have outstanding issues.
diff --git a/runtime/tools/dartfuzz/dartfuzz_type_table.dart b/runtime/tools/dartfuzz/dartfuzz_type_table.dart
index 82c845e..589af43 100644
--- a/runtime/tools/dartfuzz/dartfuzz_type_table.dart
+++ b/runtime/tools/dartfuzz/dartfuzz_type_table.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 /// Class that represents some common Dart types.
 ///
 /// NOTE: this code has been generated automatically.
diff --git a/runtime/tools/dartfuzz/gen_api_table.dart b/runtime/tools/dartfuzz/gen_api_table.dart
index d3799b6..97ffa4f 100644
--- a/runtime/tools/dartfuzz/gen_api_table.dart
+++ b/runtime/tools/dartfuzz/gen_api_table.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 // Generates the API tables used by DartFuzz. Automatically generating these
 // tables is less error-prone than generating such tables by hand. Furthermore,
 // it simplifies regenerating the table when the libraries change.
@@ -654,6 +656,8 @@
 // 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.
 
+// @dart = 2.9
+
 /// NOTE: this code has been generated automatically.
 
 import \"dartfuzz_type_table.dart\";
diff --git a/runtime/tools/dartfuzz/gen_type_table.dart b/runtime/tools/dartfuzz/gen_type_table.dart
index 033e4ab..20876cf 100644
--- a/runtime/tools/dartfuzz/gen_type_table.dart
+++ b/runtime/tools/dartfuzz/gen_type_table.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 // Generates the type tables used by DartFuzz.
 //
 // Usage:
@@ -491,6 +493,8 @@
 // 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.
 
+// @dart = 2.9
+
 /// Class that represents some common Dart types.
 ///
 /// NOTE: this code has been generated automatically.
diff --git a/runtime/tools/dartfuzz/gen_util.dart b/runtime/tools/dartfuzz/gen_util.dart
index d72a797..404d5db 100644
--- a/runtime/tools/dartfuzz/gen_util.dart
+++ b/runtime/tools/dartfuzz/gen_util.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 import 'dart:io';
 
 import 'package:analyzer/dart/analysis/session.dart';
diff --git a/runtime/tools/verbose_gc_to_bmu.dart b/runtime/tools/verbose_gc_to_bmu.dart
index 9564e42..6868926 100644
--- a/runtime/tools/verbose_gc_to_bmu.dart
+++ b/runtime/tools/verbose_gc_to_bmu.dart
@@ -10,6 +10,7 @@
 // dart --verbose_gc foo.dart 2> foo.gclog
 // dart verbose_gc_to_bmu.dart < foo.gclog > foo.bmu
 // gnuplot -p -e "set yr [0:1]; set logscale x; plot 'foo.bmu' with linespoints"
+// @dart=2.9
 
 import 'dart:io';
 import 'dart:math';
diff --git a/runtime/vm/BUILD.gn b/runtime/vm/BUILD.gn
index 8acf95e..714de1b 100644
--- a/runtime/vm/BUILD.gn
+++ b/runtime/vm/BUILD.gn
@@ -180,7 +180,7 @@
       "$root_out_dir/vm_outline" + output_postfix + ".dill",
     ]
     args = [ "dart:core" ]
-    allow_causal_async_stacks = !is_product_flag
+    allow_causal_async_stacks = false
     args += [
       "-Ddart.vm.product=$is_product_flag",
       "-Ddart.developer.causal_async_stacks=$allow_causal_async_stacks",
@@ -191,9 +191,6 @@
     if (defined(invoker.exclude_source) && invoker.exclude_source) {
       args += [ "--exclude-source" ]
     }
-    if (defined(invoker.bytecode) && invoker.bytecode) {
-      args += [ "--bytecode" ]
-    }
     outline = "vm_outline" + output_postfix + ".dill"
   }
 }
@@ -218,10 +215,6 @@
   add_implicit_vm_platform_dependency = false
   exclude_source = true
   output_postfix = "_strong_stripped"
-
-  if (dart_platform_bytecode) {
-    bytecode = true
-  }
 }
 
 group("kernel_platform_files") {
diff --git a/runtime/vm/benchmark_test.cc b/runtime/vm/benchmark_test.cc
index f7b1266..a1ca4cd 100644
--- a/runtime/vm/benchmark_test.cc
+++ b/runtime/vm/benchmark_test.cc
@@ -87,108 +87,6 @@
   return Utils::StrDup(buffer);
 }
 
-// This file is created by the target //runtime/bin:gen_kernel_bytecode_dill
-// which is depended on by run_vm_tests.
-static char* ComputeGenKernelKernelPath(const char* arg) {
-  char buffer[2048];
-  char* gen_kernel_path = Utils::StrDup(File::GetCanonicalPath(NULL, arg));
-  EXPECT(gen_kernel_path != NULL);
-  const char* compiler_path = "%s%sgen_kernel_bytecode.dill";
-  const char* path_separator = File::PathSeparator();
-  ASSERT(path_separator != NULL && strlen(path_separator) == 1);
-  char* ptr = strrchr(gen_kernel_path, *path_separator);
-  while (ptr != NULL) {
-    *ptr = '\0';
-    Utils::SNPrint(buffer, ARRAY_SIZE(buffer), compiler_path, gen_kernel_path,
-                   path_separator);
-    if (File::Exists(NULL, buffer)) {
-      break;
-    }
-    ptr = strrchr(gen_kernel_path, *path_separator);
-  }
-  free(gen_kernel_path);
-  if (ptr == NULL) {
-    return NULL;
-  }
-  return Utils::StrDup(buffer);
-}
-
-static int64_t GenKernelKernelBenchmark(const char* name,
-                                        bool benchmark_load,
-                                        bool benchmark_read_bytecode) {
-  EXPECT(benchmark_load || benchmark_read_bytecode);
-  bin::Builtin::SetNativeResolver(bin::Builtin::kBuiltinLibrary);
-  bin::Builtin::SetNativeResolver(bin::Builtin::kIOLibrary);
-  bin::Builtin::SetNativeResolver(bin::Builtin::kCLILibrary);
-  bin::VmService::SetNativeResolver();
-
-  char* dill_path = ComputeGenKernelKernelPath(Benchmark::Executable());
-  File* file = File::Open(NULL, dill_path, File::kRead);
-  EXPECT(file != NULL);
-  bin::RefCntReleaseScope<File> rs(file);
-  intptr_t kernel_buffer_size = file->Length();
-  uint8_t* kernel_buffer =
-      reinterpret_cast<uint8_t*>(malloc(kernel_buffer_size));
-  EXPECT(kernel_buffer != NULL);
-  bool read_fully = file->ReadFully(kernel_buffer, kernel_buffer_size);
-  EXPECT(read_fully);
-
-  Timer timer(true, name);
-  if (benchmark_load) {
-    timer.Start();
-  }
-
-  Dart_Handle result =
-      Dart_LoadLibraryFromKernel(kernel_buffer, kernel_buffer_size);
-  EXPECT_VALID(result);
-
-  result = Dart_FinalizeLoading(false);
-  EXPECT_VALID(result);
-
-  if (benchmark_read_bytecode && !benchmark_load) {
-    timer.Start();
-  }
-
-  if (benchmark_read_bytecode) {
-    result = Dart_ReadAllBytecode();
-    EXPECT_VALID(result);
-  }
-
-  timer.Stop();
-  int64_t elapsed_time = timer.TotalElapsedTime();
-  free(dill_path);
-  free(kernel_buffer);
-  return elapsed_time;
-}
-
-BENCHMARK(GenKernelKernelLoadKernel) {
-  benchmark->set_score(
-      GenKernelKernelBenchmark("GenKernelKernelLoadKernel benchmark",
-                               /* benchmark_load */ true,
-                               /* benchmark_read_bytecode */ false));
-}
-
-BENCHMARK(GenKernelKernelReadAllBytecode) {
-  benchmark->set_score(
-      GenKernelKernelBenchmark("GenKernelKernelReadAllBytecode benchmark",
-                               /* benchmark_load */ false,
-                               /* benchmark_read_bytecode */ true));
-}
-
-BENCHMARK(GenKernelKernelCombined) {
-  benchmark->set_score(
-      GenKernelKernelBenchmark("GenKernelKernelCombined benchmark",
-                               /* benchmark_load */ true,
-                               /* benchmark_read_bytecode */ true));
-}
-
-BENCHMARK_MEMORY(GenKernelKernelMaxRSS) {
-  GenKernelKernelBenchmark("GenKernelKernelMaxRSS benchmark",
-                           /* benchmark_load */ false,
-                           /* benchmark_read_bytecode */ true);
-  benchmark->set_score(bin::Process::MaxRSS());
-}
-
 //
 // Measure creation of core isolate from a snapshot.
 //
@@ -303,9 +201,7 @@
   benchmark->set_score(elapsed_time);
 }
 
-static void NoopFinalizer(void* isolate_callback_data,
-                          Dart_WeakPersistentHandle handle,
-                          void* peer) {}
+static void NoopFinalizer(void* isolate_callback_data, void* peer) {}
 
 //
 // Measure time accessing internal and external strings.
@@ -415,7 +311,6 @@
     TransitionNativeToVM transition(thread);
     const int kNumIterations = 100;
     Code& code = Code::Handle(thread->zone());
-    Bytecode& bytecode = Bytecode::Handle(thread->zone());
     for (int i = 0; i < kNumIterations; i++) {
       StackFrameIterator frames(ValidationPolicy::kDontValidateFrames, thread,
                                 StackFrameIterator::kNoCrossThreadIteration);
@@ -425,13 +320,8 @@
           code = frame->LookupDartCode();
           EXPECT(code.function() == Function::null());
         } else if (frame->IsDartFrame()) {
-          if (frame->is_interpreted()) {
-            bytecode = frame->LookupDartBytecode();
-            EXPECT(bytecode.function() != Function::null());
-          } else {
-            code = frame->LookupDartCode();
-            EXPECT(code.function() != Function::null());
-          }
+          code = frame->LookupDartCode();
+          EXPECT(code.function() != Function::null());
         }
         frame = frames.NextFrame();
       }
diff --git a/runtime/vm/bootstrap.cc b/runtime/vm/bootstrap.cc
index 774a398..f0c2d76 100644
--- a/runtime/vm/bootstrap.cc
+++ b/runtime/vm/bootstrap.cc
@@ -51,7 +51,7 @@
   ObjectStore* object_store = thread->isolate()->object_store();
   Zone* zone = thread->zone();
   Class& cls = Class::Handle(zone, object_store->closure_class());
-  ClassFinalizer::LoadClassMembers(cls);
+  cls.EnsureIsFinalized(thread);
 
   // Make sure _Closure fields are not marked as unboxing candidates
   // as they are accessed with plain loads.
@@ -88,7 +88,7 @@
 
   // Eagerly compile Bool class, bool constants are used from within compiler.
   cls = object_store->bool_class();
-  ClassFinalizer::LoadClassMembers(cls);
+  cls.EnsureIsFinalized(thread);
 }
 
 static ErrorPtr BootstrapFromKernel(Thread* thread,
diff --git a/runtime/vm/bootstrap_natives.h b/runtime/vm/bootstrap_natives.h
index a9e7f65..8b15f7b 100644
--- a/runtime/vm/bootstrap_natives.h
+++ b/runtime/vm/bootstrap_natives.h
@@ -27,7 +27,6 @@
   V(Function_apply, 2)                                                         \
   V(Closure_equals, 2)                                                         \
   V(Closure_computeHash, 1)                                                    \
-  V(Closure_clone, 1)                                                          \
   V(AbstractType_toString, 1)                                                  \
   V(Type_getHashCode, 1)                                                       \
   V(Type_equality, 2)                                                          \
@@ -55,7 +54,7 @@
   V(CapabilityImpl_factory, 1)                                                 \
   V(CapabilityImpl_equals, 2)                                                  \
   V(CapabilityImpl_get_hashcode, 1)                                            \
-  V(RawReceivePortImpl_factory, 1)                                             \
+  V(RawReceivePortImpl_factory, 2)                                             \
   V(RawReceivePortImpl_get_id, 1)                                              \
   V(RawReceivePortImpl_get_sendport, 1)                                        \
   V(RawReceivePortImpl_closeInternal, 1)                                       \
diff --git a/runtime/vm/class_finalizer.cc b/runtime/vm/class_finalizer.cc
index 8d02cbb..556b548 100644
--- a/runtime/vm/class_finalizer.cc
+++ b/runtime/vm/class_finalizer.cc
@@ -12,7 +12,6 @@
 #include "vm/flags.h"
 #include "vm/hash_table.h"
 #include "vm/heap/heap.h"
-#include "vm/interpreter.h"
 #include "vm/isolate.h"
 #include "vm/kernel_loader.h"
 #include "vm/log.h"
@@ -198,19 +197,14 @@
 #if defined(DEBUG)
     for (intptr_t i = 0; i < class_array.Length(); i++) {
       cls ^= class_array.At(i);
-      ASSERT(cls.is_declared_in_bytecode() || cls.is_declaration_loaded());
+      ASSERT(cls.is_declaration_loaded());
     }
 #endif
 
     // Finalize types in all classes.
     for (intptr_t i = 0; i < class_array.Length(); i++) {
       cls ^= class_array.At(i);
-      if (cls.is_declared_in_bytecode()) {
-        cls.EnsureDeclarationLoaded();
-        ASSERT(cls.is_type_finalized());
-      } else {
-        FinalizeTypesInClass(cls);
-      }
+      FinalizeTypesInClass(cls);
     }
 
     // Clear pending classes array.
@@ -329,8 +323,7 @@
 // as an implementation restriction in the VM since they cause divergence.
 // A non-contractive type can be detected by looking at the queue of types
 // pending finalization that are mutually recursive with the checked type.
-void ClassFinalizer::CheckRecursiveType(const Class& cls,
-                                        const AbstractType& type,
+void ClassFinalizer::CheckRecursiveType(const AbstractType& type,
                                         PendingTypes* pending_types) {
   ASSERT(pending_types != NULL);
   Zone* zone = Thread::Current()->zone();
@@ -403,8 +396,7 @@
                 instantiated_arguments, first_type_param, num_type_params,
                 TypeEquality::kInSubtypeTest)) {
           const String& type_name = String::Handle(zone, type.Name());
-          ReportError(cls, type.token_pos(), "illegal recursive type '%s'",
-                      type_name.ToCString());
+          ReportError("illegal recursive type '%s'", type_name.ToCString());
         }
       }
     }
@@ -414,7 +406,6 @@
 // Expand the type arguments of the given type and finalize its full type
 // argument vector. Return the number of type arguments (0 for a raw type).
 intptr_t ClassFinalizer::ExpandAndFinalizeTypeArguments(
-    const Class& cls,
     const AbstractType& type,
     PendingTypes* pending_types) {
   Zone* zone = Thread::Current()->zone();
@@ -478,21 +469,7 @@
         for (intptr_t i = 0; i < num_type_parameters; i++) {
           type_arg = full_arguments.TypeAt(offset + i);
           ASSERT(!type_arg.IsBeingFinalized());
-          type_arg = FinalizeType(cls, type_arg, kFinalize, pending_types);
-          if (type_arg.IsFunctionType()) {
-            const Function& signature_function =
-                Function::Handle(zone, Type::Cast(type_arg).signature());
-            if (signature_function.IsGeneric()) {
-              const String& type_arg_name =
-                  String::Handle(zone, type_arg.UserVisibleName());
-              const String& type_name =
-                  String::Handle(zone, type.UserVisibleName());
-              ReportError(cls, type_arg.token_pos(),
-                          "generic function type '%s' not allowed as type "
-                          "argument of type '%s'",
-                          type_arg_name.ToCString(), type_name.ToCString());
-            }
-          }
+          type_arg = FinalizeType(type_arg, kFinalize, pending_types);
           full_arguments.SetTypeAt(offset + i, type_arg);
         }
       }
@@ -565,7 +542,7 @@
     const intptr_t num_super_type_params = super_class.NumTypeParameters();
     const intptr_t num_super_type_args = super_class.NumTypeArguments();
     if (!super_type.IsFinalized() && !super_type.IsBeingFinalized()) {
-      super_type = FinalizeType(cls, super_type, kFinalize, pending_types);
+      super_type = FinalizeType(super_type, kFinalize, pending_types);
       cls.set_super_type(super_type);
     }
     TypeArguments& super_type_args =
@@ -580,7 +557,7 @@
         if (!super_type_arg.IsTypeRef()) {
           if (super_type_arg.IsBeingFinalized()) {
             ASSERT(super_type_arg.IsType());
-            CheckRecursiveType(cls, super_type_arg, pending_types);
+            CheckRecursiveType(super_type_arg, pending_types);
             if (FLAG_trace_type_finalization) {
               THR_Print("Creating TypeRef '%s': '%s'\n",
                         String::Handle(super_type_arg.Name()).ToCString(),
@@ -591,7 +568,7 @@
           } else {
             if (!super_type_arg.IsFinalized()) {
               super_type_arg =
-                  FinalizeType(cls, super_type_arg, kFinalize, pending_types);
+                  FinalizeType(super_type_arg, kFinalize, pending_types);
               super_type_args.SetTypeAt(i, super_type_arg);
               // Note that super_type_arg may still not be finalized here, in
               // which case it is a TypeRef to a legal recursive type.
@@ -638,7 +615,7 @@
                         String::Handle(unfinalized_type.Name()).ToCString(),
                         unfinalized_type.ToCString());
             }
-            CheckRecursiveType(cls, unfinalized_type, pending_types);
+            CheckRecursiveType(unfinalized_type, pending_types);
             pending_types->Add(unfinalized_type);
             const Class& super_cls =
                 Class::Handle(unfinalized_type.type_class());
@@ -670,8 +647,7 @@
   }
 }
 
-AbstractTypePtr ClassFinalizer::FinalizeType(const Class& cls,
-                                             const AbstractType& type,
+AbstractTypePtr ClassFinalizer::FinalizeType(const AbstractType& type,
                                              FinalizationKind finalization,
                                              PendingTypes* pending_types) {
   // Only the 'root' type of the graph can be canonicalized, after all depending
@@ -699,9 +675,8 @@
   Zone* zone = Thread::Current()->zone();
 
   if (FLAG_trace_type_finalization) {
-    THR_Print("Finalizing type '%s' for class '%s'\n",
-              String::Handle(zone, type.Name()).ToCString(),
-              String::Handle(zone, cls.Name()).ToCString());
+    THR_Print("Finalizing type '%s'\n",
+              String::Handle(zone, type.Name()).ToCString());
   }
 
   if (type.IsTypeParameter()) {
@@ -751,7 +726,7 @@
   }
 
   const intptr_t num_expanded_type_arguments =
-      ExpandAndFinalizeTypeArguments(cls, type, pending_types);
+      ExpandAndFinalizeTypeArguments(type, pending_types);
 
   // Self referencing types may get finalized indirectly.
   if (!type.IsFinalized()) {
@@ -768,7 +743,7 @@
         Function& signature =
             Function::Handle(zone, scope_class.signature_function());
         if (!scope_class.is_type_finalized()) {
-          FinalizeSignature(scope_class, signature, finalization);
+          FinalizeSignature(signature, finalization);
         }
         // If the function type is a generic typedef, instantiate its signature
         // from its type arguments.
@@ -793,19 +768,18 @@
           // parameters were substituted in the signature with typedef type
           // arguments). Note also that the function type parameters were not
           // modified.
-          FinalizeSignature(scope_class, signature, finalization);
+          FinalizeSignature(signature, finalization);
         }
         fun_type.set_signature(signature);
       } else {
-        FinalizeSignature(cls, Function::Handle(zone, fun_type.signature()),
+        FinalizeSignature(Function::Handle(zone, fun_type.signature()),
                           finalization);
       }
     }
 
     if (FLAG_trace_type_finalization) {
-      THR_Print("Marking type '%s' as finalized for class '%s'\n",
-                String::Handle(zone, type.Name()).ToCString(),
-                String::Handle(zone, cls.Name()).ToCString());
+      THR_Print("Marking type '%s' as finalized\n",
+                String::Handle(zone, type.Name()).ToCString());
     }
     // Mark the type as finalized.
     type.SetIsFinalized();
@@ -833,12 +807,11 @@
   }
 }
 
-void ClassFinalizer::FinalizeSignature(const Class& cls,
-                                       const Function& function,
+void ClassFinalizer::FinalizeSignature(const Function& function,
                                        FinalizationKind finalization) {
   AbstractType& type = AbstractType::Handle();
   AbstractType& finalized_type = AbstractType::Handle();
-  // Finalize function type parameters and their upper bounds.
+  // Finalize function type parameters, including their bounds and default args.
   const intptr_t num_parent_type_params = function.NumParentTypeParameters();
   const intptr_t num_type_params = function.NumTypeParameters();
   if (num_type_params > 0) {
@@ -858,15 +831,21 @@
     for (intptr_t i = 0; i < num_type_params; i++) {
       type_param ^= type_params.TypeAt(i);
       type = type_param.bound();
-      finalized_type = FinalizeType(cls, type, finalization);
+      finalized_type = FinalizeType(type, finalization);
       if (finalized_type.raw() != type.raw()) {
         type_param.set_bound(finalized_type);
       }
+      type = type_param.default_argument();
+      finalized_type = FinalizeType(type, finalization);
+      if (finalized_type.raw() != type.raw()) {
+        type_param.set_default_argument(finalized_type);
+      }
     }
+    function.UpdateCachedDefaultTypeArguments(Thread::Current());
   }
   // Finalize result type.
   type = function.result_type();
-  finalized_type = FinalizeType(cls, type, finalization);
+  finalized_type = FinalizeType(type, finalization);
   if (finalized_type.raw() != type.raw()) {
     function.set_result_type(finalized_type);
   }
@@ -874,45 +853,38 @@
   const intptr_t num_parameters = function.NumParameters();
   for (intptr_t i = 0; i < num_parameters; i++) {
     type = function.ParameterTypeAt(i);
-    finalized_type = FinalizeType(cls, type, finalization);
+    finalized_type = FinalizeType(type, finalization);
     if (type.raw() != finalized_type.raw()) {
       function.SetParameterTypeAt(i, finalized_type);
     }
   }
 }
 
-// Finalize the upper bounds of the type parameters of class cls.
+// Finalize bounds and default arguments of the type parameters of class cls.
 void ClassFinalizer::FinalizeUpperBounds(const Class& cls,
                                          FinalizationKind finalization) {
   const intptr_t num_type_params = cls.NumTypeParameters();
   TypeParameter& type_param = TypeParameter::Handle();
-  AbstractType& bound = AbstractType::Handle();
+  AbstractType& type = AbstractType::Handle();
   const TypeArguments& type_params =
       TypeArguments::Handle(cls.type_parameters());
   ASSERT((type_params.IsNull() && (num_type_params == 0)) ||
          (type_params.Length() == num_type_params));
   for (intptr_t i = 0; i < num_type_params; i++) {
     type_param ^= type_params.TypeAt(i);
-    bound = type_param.bound();
-    if (bound.IsFunctionType()) {
-      const Function& signature_function =
-          Function::Handle(Type::Cast(bound).signature());
-      if (signature_function.IsGeneric()) {
-        const String& bound_name = String::Handle(bound.UserVisibleName());
-        const String& type_param_name = String::Handle(type_param.name());
-        ReportError(cls, bound.token_pos(),
-                    "generic function type '%s' not allowed as bound of "
-                    "class type parameter '%s'",
-                    bound_name.ToCString(), type_param_name.ToCString());
-      }
-    }
+    // First, finalize the default argument (no cycles possible here).
+    type = type_param.default_argument();
+    type = FinalizeType(type, finalization);
+    type_param.set_default_argument(type);
+    // Next, finalize the bound.
+    type = type_param.bound();
     // Bound may be finalized, but not canonical yet.
-    if (bound.IsCanonical() || bound.IsBeingFinalized()) {
+    if (type.IsCanonical() || type.IsBeingFinalized()) {
       // A bound involved in F-bounded quantification may form a cycle.
       continue;
     }
-    bound = FinalizeType(cls, bound, finalization);
-    type_param.set_bound(bound);
+    type = FinalizeType(type, finalization);
+    type_param.set_bound(type);
   }
 }
 
@@ -966,7 +938,7 @@
   for (intptr_t i = 0; i < num_fields; i++) {
     field ^= array.At(i);
     type = field.type();
-    type = FinalizeType(cls, type);
+    type = FinalizeType(type);
     field.SetFieldType(type);
     if (track_exactness && IsPotentialExactGeneric(type)) {
       field.set_static_type_exactness_state(
@@ -975,19 +947,19 @@
   }
   // Finalize function signatures and check for conflicts in super classes and
   // interfaces.
-  array = cls.functions();
+  array = cls.current_functions();
   Function& function = Function::Handle(zone);
   const intptr_t num_functions = array.Length();
   for (intptr_t i = 0; i < num_functions; i++) {
     function ^= array.At(i);
-    FinalizeSignature(cls, function);
+    FinalizeSignature(function);
     if (function.IsSetterFunction() || function.IsImplicitSetterFunction()) {
       continue;
     }
     if (function.is_static()) {
       if (function.IsRedirectingFactory()) {
         Type& type = Type::Handle(zone, function.RedirectionType());
-        type ^= FinalizeType(cls, type);
+        type ^= FinalizeType(type);
         function.SetRedirectionType(type);
       }
     }
@@ -1025,6 +997,12 @@
   if (cls.is_type_finalized()) {
     return;
   }
+
+  SafepointWriteRwLocker ml(thread, thread->isolate_group()->program_lock());
+  if (cls.is_type_finalized()) {
+    return;
+  }
+
   if (FLAG_trace_class_finalization) {
     THR_Print("Finalize types in %s\n", cls.ToCString());
   }
@@ -1034,14 +1012,13 @@
     FinalizeTypesInClass(super_class);
   }
   // Finalize type parameters before finalizing the super type.
-  FinalizeTypeParameters(cls);  // May change super type while applying mixin.
-  super_class = cls.SuperClass();  // Get again possibly changed super class.
+  FinalizeTypeParameters(cls);
   ASSERT(super_class.IsNull() || super_class.is_type_finalized());
   FinalizeUpperBounds(cls);
   // Finalize super type.
   AbstractType& super_type = AbstractType::Handle(cls.super_type());
   if (!super_type.IsNull()) {
-    super_type = FinalizeType(cls, super_type);
+    super_type = FinalizeType(super_type);
     cls.set_super_type(super_type);
   }
   if (cls.IsTypedefClass()) {
@@ -1054,11 +1031,11 @@
 
     // Finalize the result and parameter types of the signature
     // function of this typedef class.
-    FinalizeSignature(cls, signature);  // Does not modify signature type.
+    FinalizeSignature(signature);  // Does not modify signature type.
     ASSERT(signature.SignatureType() == type.raw());
 
     // Finalize the signature type of this typedef.
-    type ^= FinalizeType(cls, type);
+    type ^= FinalizeType(type);
     ASSERT(type.type_class() == cls.raw());
 
     // If a different canonical signature type is returned, update the signature
@@ -1079,7 +1056,7 @@
   AbstractType& interface_type = AbstractType::Handle();
   for (intptr_t i = 0; i < interface_types.Length(); i++) {
     interface_type ^= interface_types.At(i);
-    interface_type = FinalizeType(cls, interface_type);
+    interface_type = FinalizeType(interface_type);
     interface_types.SetAt(i, interface_type);
   }
   cls.set_is_type_finalized();
@@ -1135,14 +1112,9 @@
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
   // If loading from a kernel, make sure that the class is fully loaded.
-  ASSERT(cls.IsTopLevel() || cls.is_declared_in_bytecode() ||
-         (cls.kernel_offset() > 0));
+  ASSERT(cls.IsTopLevel() || (cls.kernel_offset() > 0));
   if (!cls.is_loaded()) {
-    if (cls.is_declared_in_bytecode()) {
-      kernel::BytecodeReader::FinishClassLoading(cls);
-    } else {
-      kernel::KernelLoader::FinishLoading(cls);
-    }
+    kernel::KernelLoader::FinishLoading(cls);
     if (cls.is_finalized()) {
       return;
     }
@@ -1281,7 +1253,7 @@
   ASSERT(!sentinel.IsNull());
   sentinel.SetStaticValue(enum_value, true);
 
-  ASSERT(enum_cls.is_declared_in_bytecode() || enum_cls.kernel_offset() > 0);
+  ASSERT(enum_cls.kernel_offset() > 0);
   Error& error = Error::Handle(zone);
   for (intptr_t i = 0; i < fields.Length(); i++) {
     field = Field::RawCast(fields.At(i));
@@ -1332,7 +1304,7 @@
     }
   }
   THR_Print("\n");
-  const Array& functions_array = Array::Handle(cls.functions());
+  const Array& functions_array = Array::Handle(cls.current_functions());
   Function& function = Function::Handle();
   intptr_t len = functions_array.Length();
   for (intptr_t i = 0; i < len; i++) {
@@ -1353,28 +1325,12 @@
   UNREACHABLE();
 }
 
-void ClassFinalizer::ReportErrors(const Error& prev_error,
-                                  const Class& cls,
-                                  TokenPosition token_pos,
-                                  const char* format,
-                                  ...) {
+void ClassFinalizer::ReportError(const char* format, ...) {
   va_list args;
   va_start(args, format);
-  const Script& script = Script::Handle(cls.script());
-  Report::LongJumpV(prev_error, script, token_pos, format, args);
-  va_end(args);
-  UNREACHABLE();
-}
-
-void ClassFinalizer::ReportError(const Class& cls,
-                                 TokenPosition token_pos,
-                                 const char* format,
-                                 ...) {
-  va_list args;
-  va_start(args, format);
-  const Script& script = Script::Handle(cls.script());
-  Report::MessageV(Report::kError, script, token_pos, Report::AtLocation,
-                   format, args);
+  const Script& null_script = Script::Handle();
+  Report::MessageV(Report::kError, null_script, TokenPosition::kNoSource,
+                   Report::AtLocation, format, args);
   va_end(args);
   UNREACHABLE();
 }
@@ -1430,6 +1386,7 @@
   // Prevent background compiler from adding deferred classes or canonicalizing
   // new types while classes are being sorted and type hashes are modified.
   BackgroundCompiler::Stop(I);
+  SafepointWriteRwLocker ml(T, T->isolate_group()->program_lock());
 
   ClassTable* table = I->class_table();
   intptr_t num_cids = table->NumCids();
@@ -1745,14 +1702,6 @@
 #ifdef DART_PRECOMPILED_RUNTIME
   UNREACHABLE();
 #else
-  Thread* mutator_thread = Isolate::Current()->mutator_thread();
-  if (mutator_thread != nullptr) {
-    Interpreter* interpreter = mutator_thread->interpreter();
-    if (interpreter != nullptr) {
-      interpreter->ClearLookupCache();
-    }
-  }
-
   auto const thread = Thread::Current();
   auto const isolate = thread->isolate();
   StackZone stack_zone(thread);
@@ -1763,7 +1712,6 @@
    public:
     ClearCodeVisitor(Zone* zone, bool force)
         : force_(force),
-          bytecode_(Bytecode::Handle(zone)),
           pool_(ObjectPool::Handle(zone)),
           entry_(Object::Handle(zone)) {}
 
@@ -1774,28 +1722,12 @@
     }
 
     void VisitFunction(const Function& function) {
-      bytecode_ = function.bytecode();
-      if (!bytecode_.IsNull()) {
-        pool_ = bytecode_.object_pool();
-        for (intptr_t i = 0; i < pool_.Length(); i++) {
-          ObjectPool::EntryType entry_type = pool_.TypeAt(i);
-          if (entry_type != ObjectPool::EntryType::kTaggedObject) {
-            continue;
-          }
-          entry_ = pool_.ObjectAt(i);
-          if (entry_.IsSubtypeTestCache()) {
-            SubtypeTestCache::Cast(entry_).Reset();
-          }
-        }
-      }
-
       function.ClearCode();
       function.ClearICDataArray();
     }
 
    private:
     const bool force_;
-    Bytecode& bytecode_;
     ObjectPool& pool_;
     Object& entry_;
   };
diff --git a/runtime/vm/class_finalizer.h b/runtime/vm/class_finalizer.h
index 3fd0baf..e46d8e5 100644
--- a/runtime/vm/class_finalizer.h
+++ b/runtime/vm/class_finalizer.h
@@ -25,17 +25,14 @@
     kCanonicalize  // Finalize and canonicalize.
   };
 
-  // Finalize given type while parsing class cls.
-  // Also canonicalize and bound check type if applicable.
+  // Finalize given type.
   static AbstractTypePtr FinalizeType(
-      const Class& cls,
       const AbstractType& type,
       FinalizationKind finalization = kCanonicalize,
       PendingTypes* pending_types = NULL);
 
-  // Finalize the types in the functions's signature while parsing class cls.
-  static void FinalizeSignature(const Class& cls,
-                                const Function& function,
+  // Finalize the types in the functions's signature.
+  static void FinalizeSignature(const Function& function,
                                 FinalizationKind finalization = kCanonicalize);
 
   // Return false if we still have classes pending to be finalized.
@@ -83,16 +80,14 @@
  private:
   static void AllocateEnumValues(const Class& enum_cls);
   static void FinalizeTypeParameters(const Class& cls);
-  static intptr_t ExpandAndFinalizeTypeArguments(const Class& cls,
-                                                 const AbstractType& type,
+  static intptr_t ExpandAndFinalizeTypeArguments(const AbstractType& type,
                                                  PendingTypes* pending_types);
   static void FinalizeTypeArguments(const Class& cls,
                                     const TypeArguments& arguments,
                                     intptr_t num_uninitialized_arguments,
                                     PendingTypes* pending_types,
                                     TrailPtr trail);
-  static void CheckRecursiveType(const Class& cls,
-                                 const AbstractType& type,
+  static void CheckRecursiveType(const AbstractType& type,
                                  PendingTypes* pending_types);
   static void FinalizeUpperBounds(
       const Class& cls,
@@ -101,15 +96,7 @@
   static void PrintClassInformation(const Class& cls);
 
   static void ReportError(const Error& error);
-  static void ReportError(const Class& cls,
-                          TokenPosition token_pos,
-                          const char* format,
-                          ...) PRINTF_ATTRIBUTE(3, 4);
-  static void ReportErrors(const Error& prev_error,
-                           const Class& cls,
-                           TokenPosition token_pos,
-                           const char* format,
-                           ...) PRINTF_ATTRIBUTE(4, 5);
+  static void ReportError(const char* format, ...) PRINTF_ATTRIBUTE(1, 2);
 
   // Verify implicit offsets recorded in the VM for direct access to fields of
   // Dart instances (e.g: _TypedListView, _ByteDataView).
diff --git a/runtime/vm/class_finalizer_test.cc b/runtime/vm/class_finalizer_test.cc
index 29a708a..7f91581 100644
--- a/runtime/vm/class_finalizer_test.cc
+++ b/runtime/vm/class_finalizer_test.cc
@@ -10,13 +10,14 @@
 namespace dart {
 
 static ClassPtr CreateTestClass(const char* name) {
-  const String& class_name =
-      String::Handle(Symbols::New(Thread::Current(), name));
+  Thread* thread = Thread::Current();
+  const String& class_name = String::Handle(Symbols::New(thread, name));
   const Script& script = Script::Handle();
   const Class& cls = Class::Handle(Class::New(
       Library::Handle(), class_name, script, TokenPosition::kNoSource));
   cls.set_interfaces(Object::empty_array());
   cls.set_is_declaration_loaded();
+  SafepointWriteRwLocker ml(thread, thread->isolate_group()->program_lock());
   cls.SetFunctions(Object::empty_array());
   cls.SetFields(Object::empty_array());
   return cls.raw();
diff --git a/runtime/vm/class_id.h b/runtime/vm/class_id.h
index 0664cbb..92faca0 100644
--- a/runtime/vm/class_id.h
+++ b/runtime/vm/class_id.h
@@ -31,7 +31,6 @@
   V(Namespace)                                                                 \
   V(KernelProgramInfo)                                                         \
   V(Code)                                                                      \
-  V(Bytecode)                                                                  \
   V(Instructions)                                                              \
   V(InstructionsSection)                                                       \
   V(ObjectPool)                                                                \
@@ -42,7 +41,6 @@
   V(ExceptionHandlers)                                                         \
   V(Context)                                                                   \
   V(ContextScope)                                                              \
-  V(ParameterTypeCheck)                                                        \
   V(SingleTargetCache)                                                         \
   V(UnlinkedCall)                                                              \
   V(MonomorphicSmiableCall)                                                    \
diff --git a/runtime/vm/clustered_snapshot.cc b/runtime/vm/clustered_snapshot.cc
index 27d263a..7913553 100644
--- a/runtime/vm/clustered_snapshot.cc
+++ b/runtime/vm/clustered_snapshot.cc
@@ -250,7 +250,7 @@
       s->UnexpectedObject(cls, "Class with non mode agnostic constants");
     }
     if (s->kind() != Snapshot::kFullAOT) {
-      s->Write<uint32_t>(cls->ptr()->binary_declaration_);
+      s->Write<uint32_t>(cls->ptr()->kernel_offset_);
     }
     s->Write<int32_t>(Class::target_instance_size_in_words(cls));
     s->Write<int32_t>(Class::target_next_field_offset_in_words(cls));
@@ -289,7 +289,7 @@
 
 class ClassDeserializationCluster : public DeserializationCluster {
  public:
-  ClassDeserializationCluster() {}
+  ClassDeserializationCluster() : DeserializationCluster("Class") {}
   ~ClassDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -325,7 +325,7 @@
       cls->ptr()->id_ = class_id;
 #if !defined(DART_PRECOMPILED_RUNTIME)
       if (d->kind() != Snapshot::kFullAOT) {
-        cls->ptr()->binary_declaration_ = d->Read<uint32_t>();
+        cls->ptr()->kernel_offset_ = d->Read<uint32_t>();
       }
 #endif
       if (!IsInternalVMdefinedClassId(class_id)) {
@@ -372,7 +372,7 @@
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
       if (d->kind() != Snapshot::kFullAOT) {
-        cls->ptr()->binary_declaration_ = d->Read<uint32_t>();
+        cls->ptr()->kernel_offset_ = d->Read<uint32_t>();
       }
 #endif
       cls->ptr()->host_instance_size_in_words_ = d->Read<int32_t>();
@@ -463,7 +463,8 @@
 
 class TypeArgumentsDeserializationCluster : public DeserializationCluster {
  public:
-  TypeArgumentsDeserializationCluster() {}
+  TypeArgumentsDeserializationCluster()
+      : DeserializationCluster("TypeArguments") {}
   ~TypeArgumentsDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -556,7 +557,7 @@
 
 class PatchClassDeserializationCluster : public DeserializationCluster {
  public:
-  PatchClassDeserializationCluster() {}
+  PatchClassDeserializationCluster() : DeserializationCluster("PatchClass") {}
   ~PatchClassDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -597,13 +598,10 @@
     objects_.Add(func);
 
     PushFromTo(func);
-    if ((kind == Snapshot::kFull) || (kind == Snapshot::kFullCore)) {
-      NOT_IN_PRECOMPILED(s->Push(func->ptr()->bytecode_));
-    } else if (kind == Snapshot::kFullAOT) {
+    if (kind == Snapshot::kFullAOT) {
       s->Push(func->ptr()->code_);
     } else if (kind == Snapshot::kFullJIT) {
       NOT_IN_PRECOMPILED(s->Push(func->ptr()->unoptimized_code_));
-      NOT_IN_PRECOMPILED(s->Push(func->ptr()->bytecode_));
       s->Push(func->ptr()->code_);
       s->Push(func->ptr()->ic_data_array_);
     }
@@ -626,13 +624,10 @@
       FunctionPtr func = objects_[i];
       AutoTraceObjectName(func, MakeDisambiguatedFunctionName(s, func));
       WriteFromTo(func);
-      if ((kind == Snapshot::kFull) || (kind == Snapshot::kFullCore)) {
-        NOT_IN_PRECOMPILED(WriteField(func, bytecode_));
-      } else if (kind == Snapshot::kFullAOT) {
+      if (kind == Snapshot::kFullAOT) {
         WriteField(func, code_);
       } else if (s->kind() == Snapshot::kFullJIT) {
         NOT_IN_PRECOMPILED(WriteField(func, unoptimized_code_));
-        NOT_IN_PRECOMPILED(WriteField(func, bytecode_));
         WriteField(func, code_);
         WriteField(func, ic_data_array_);
       }
@@ -640,7 +635,7 @@
       if (kind != Snapshot::kFullAOT) {
         s->WriteTokenPosition(func->ptr()->token_pos_);
         s->WriteTokenPosition(func->ptr()->end_token_pos_);
-        s->Write<uint32_t>(func->ptr()->binary_declaration_);
+        s->Write<uint32_t>(func->ptr()->kernel_offset_);
       }
 
       s->Write<uint32_t>(func->ptr()->packed_fields_);
@@ -671,7 +666,7 @@
 
 class FunctionDeserializationCluster : public DeserializationCluster {
  public:
-  FunctionDeserializationCluster() {}
+  FunctionDeserializationCluster() : DeserializationCluster("Function") {}
   ~FunctionDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -693,16 +688,11 @@
                                      Function::InstanceSize());
       ReadFromTo(func);
 
-      if ((kind == Snapshot::kFull) || (kind == Snapshot::kFullCore)) {
-        NOT_IN_PRECOMPILED(func->ptr()->bytecode_ =
-                               static_cast<BytecodePtr>(d->ReadRef()));
-      } else if (kind == Snapshot::kFullAOT) {
+      if (kind == Snapshot::kFullAOT) {
         func->ptr()->code_ = static_cast<CodePtr>(d->ReadRef());
       } else if (kind == Snapshot::kFullJIT) {
         NOT_IN_PRECOMPILED(func->ptr()->unoptimized_code_ =
                                static_cast<CodePtr>(d->ReadRef()));
-        NOT_IN_PRECOMPILED(func->ptr()->bytecode_ =
-                               static_cast<BytecodePtr>(d->ReadRef()));
         func->ptr()->code_ = static_cast<CodePtr>(d->ReadRef());
         func->ptr()->ic_data_array_ = static_cast<ArrayPtr>(d->ReadRef());
       }
@@ -716,7 +706,7 @@
       if (kind != Snapshot::kFullAOT) {
         func->ptr()->token_pos_ = d->ReadTokenPosition();
         func->ptr()->end_token_pos_ = d->ReadTokenPosition();
-        func->ptr()->binary_declaration_ = d->Read<uint32_t>();
+        func->ptr()->kernel_offset_ = d->Read<uint32_t>();
       }
       func->ptr()->unboxed_parameters_info_.Reset();
 #endif
@@ -790,6 +780,8 @@
     s->Push(data->ptr()->parent_function_);
     s->Push(data->ptr()->signature_type_);
     s->Push(data->ptr()->closure_);
+    s->Push(data->ptr()->default_type_arguments_);
+    s->Push(data->ptr()->default_type_arguments_info_);
   }
 
   void WriteAlloc(Serializer* s) {
@@ -813,6 +805,8 @@
       WriteField(data, parent_function_);
       WriteField(data, signature_type_);
       WriteField(data, closure_);
+      WriteField(data, default_type_arguments_);
+      WriteField(data, default_type_arguments_info_);
     }
   }
 
@@ -823,7 +817,7 @@
 
 class ClosureDataDeserializationCluster : public DeserializationCluster {
  public:
-  ClosureDataDeserializationCluster() {}
+  ClosureDataDeserializationCluster() : DeserializationCluster("ClosureData") {}
   ~ClosureDataDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -851,6 +845,10 @@
       data->ptr()->parent_function_ = static_cast<FunctionPtr>(d->ReadRef());
       data->ptr()->signature_type_ = static_cast<TypePtr>(d->ReadRef());
       data->ptr()->closure_ = static_cast<InstancePtr>(d->ReadRef());
+      data->ptr()->default_type_arguments_ =
+          static_cast<TypeArgumentsPtr>(d->ReadRef());
+      data->ptr()->default_type_arguments_info_ =
+          static_cast<SmiPtr>(d->ReadRef());
     }
   }
 };
@@ -893,7 +891,8 @@
 
 class SignatureDataDeserializationCluster : public DeserializationCluster {
  public:
-  SignatureDataDeserializationCluster() {}
+  SignatureDataDeserializationCluster()
+      : DeserializationCluster("SignatureData") {}
   ~SignatureDataDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -962,7 +961,8 @@
 
 class FfiTrampolineDataDeserializationCluster : public DeserializationCluster {
  public:
-  FfiTrampolineDataDeserializationCluster() {}
+  FfiTrampolineDataDeserializationCluster()
+      : DeserializationCluster("FfiTrampolineData") {}
   ~FfiTrampolineDataDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -1027,7 +1027,8 @@
 
 class RedirectionDataDeserializationCluster : public DeserializationCluster {
  public:
-  RedirectionDataDeserializationCluster() {}
+  RedirectionDataDeserializationCluster()
+      : DeserializationCluster("RedirectionData") {}
   ~RedirectionDataDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -1131,7 +1132,7 @@
         s->WriteCid(field->ptr()->guarded_cid_);
         s->WriteCid(field->ptr()->is_nullable_);
         s->Write<int8_t>(field->ptr()->static_type_exactness_state_);
-        s->Write<uint32_t>(field->ptr()->binary_declaration_);
+        s->Write<uint32_t>(field->ptr()->kernel_offset_);
       }
       s->Write<uint16_t>(field->ptr()->kind_bits_);
 
@@ -1164,7 +1165,7 @@
 
 class FieldDeserializationCluster : public DeserializationCluster {
  public:
-  FieldDeserializationCluster() {}
+  FieldDeserializationCluster() : DeserializationCluster("Field") {}
   ~FieldDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -1201,7 +1202,7 @@
         field->ptr()->is_nullable_ = d->ReadCid();
         field->ptr()->static_type_exactness_state_ = d->Read<int8_t>();
 #if !defined(DART_PRECOMPILED_RUNTIME)
-        field->ptr()->binary_declaration_ = d->Read<uint32_t>();
+        field->ptr()->kernel_offset_ = d->Read<uint32_t>();
 #endif
       }
       field->ptr()->kind_bits_ = d->Read<uint16_t>();
@@ -1286,7 +1287,7 @@
 
 class ScriptDeserializationCluster : public DeserializationCluster {
  public:
-  ScriptDeserializationCluster() {}
+  ScriptDeserializationCluster() : DeserializationCluster("Script") {}
   ~ScriptDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -1347,7 +1348,7 @@
       s->Write<int8_t>(lib->ptr()->load_state_);
       s->Write<uint8_t>(lib->ptr()->flags_);
       if (s->kind() != Snapshot::kFullAOT) {
-        s->Write<uint32_t>(lib->ptr()->binary_declaration_);
+        s->Write<uint32_t>(lib->ptr()->kernel_offset_);
       }
     }
   }
@@ -1359,7 +1360,7 @@
 
 class LibraryDeserializationCluster : public DeserializationCluster {
  public:
-  LibraryDeserializationCluster() {}
+  LibraryDeserializationCluster() : DeserializationCluster("Library") {}
   ~LibraryDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -1386,7 +1387,7 @@
           LibraryLayout::InFullSnapshotBit::update(true, d->Read<uint8_t>());
 #if !defined(DART_PRECOMPILED_RUNTIME)
       if (d->kind() != Snapshot::kFullAOT) {
-        lib->ptr()->binary_declaration_ = d->Read<uint32_t>();
+        lib->ptr()->kernel_offset_ = d->Read<uint32_t>();
       }
 #endif
     }
@@ -1431,7 +1432,7 @@
 
 class NamespaceDeserializationCluster : public DeserializationCluster {
  public:
-  NamespaceDeserializationCluster() {}
+  NamespaceDeserializationCluster() : DeserializationCluster("Namespace") {}
   ~NamespaceDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -1496,7 +1497,8 @@
 // one will never need to read them from a full AOT snapshot.
 class KernelProgramInfoDeserializationCluster : public DeserializationCluster {
  public:
-  KernelProgramInfoDeserializationCluster() {}
+  KernelProgramInfoDeserializationCluster()
+      : DeserializationCluster("KernelProgramInfo") {}
   ~KernelProgramInfoDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -1857,7 +1859,7 @@
 
 class CodeDeserializationCluster : public DeserializationCluster {
  public:
-  CodeDeserializationCluster() {}
+  CodeDeserializationCluster() : DeserializationCluster("Code") {}
   ~CodeDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -1969,88 +1971,6 @@
 };
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
-class BytecodeSerializationCluster : public SerializationCluster {
- public:
-  BytecodeSerializationCluster() : SerializationCluster("Bytecode") {}
-  virtual ~BytecodeSerializationCluster() {}
-
-  void Trace(Serializer* s, ObjectPtr object) {
-    BytecodePtr bytecode = Bytecode::RawCast(object);
-    objects_.Add(bytecode);
-    PushFromTo(bytecode);
-  }
-
-  void WriteAlloc(Serializer* s) {
-    s->WriteCid(kBytecodeCid);
-    const intptr_t count = objects_.length();
-    s->WriteUnsigned(count);
-    for (intptr_t i = 0; i < count; i++) {
-      BytecodePtr bytecode = objects_[i];
-      s->AssignRef(bytecode);
-    }
-  }
-
-  void WriteFill(Serializer* s) {
-    ASSERT(s->kind() != Snapshot::kFullAOT);
-    const intptr_t count = objects_.length();
-    for (intptr_t i = 0; i < count; i++) {
-      BytecodePtr bytecode = objects_[i];
-      s->Write<int32_t>(bytecode->ptr()->instructions_size_);
-      WriteFromTo(bytecode);
-      s->Write<int32_t>(bytecode->ptr()->instructions_binary_offset_);
-      s->Write<int32_t>(bytecode->ptr()->source_positions_binary_offset_);
-      s->Write<int32_t>(bytecode->ptr()->local_variables_binary_offset_);
-    }
-  }
-
- private:
-  GrowableArray<BytecodePtr> objects_;
-};
-
-class BytecodeDeserializationCluster : public DeserializationCluster {
- public:
-  BytecodeDeserializationCluster() {}
-  virtual ~BytecodeDeserializationCluster() {}
-
-  void ReadAlloc(Deserializer* d, bool is_canonical) {
-    start_index_ = d->next_index();
-    PageSpace* old_space = d->heap()->old_space();
-    const intptr_t count = d->ReadUnsigned();
-    for (intptr_t i = 0; i < count; i++) {
-      d->AssignRef(AllocateUninitialized(old_space, Bytecode::InstanceSize()));
-    }
-    stop_index_ = d->next_index();
-  }
-
-  void ReadFill(Deserializer* d, bool is_canonical) {
-    ASSERT(d->kind() != Snapshot::kFullAOT);
-
-    for (intptr_t id = start_index_; id < stop_index_; id++) {
-      BytecodePtr bytecode = static_cast<BytecodePtr>(d->Ref(id));
-      Deserializer::InitializeHeader(bytecode, kBytecodeCid,
-                                     Bytecode::InstanceSize());
-      bytecode->ptr()->instructions_ = 0;
-      bytecode->ptr()->instructions_size_ = d->Read<int32_t>();
-      ReadFromTo(bytecode);
-      bytecode->ptr()->instructions_binary_offset_ = d->Read<int32_t>();
-      bytecode->ptr()->source_positions_binary_offset_ = d->Read<int32_t>();
-      bytecode->ptr()->local_variables_binary_offset_ = d->Read<int32_t>();
-    }
-  }
-
-  void PostLoad(Deserializer* d, const Array& refs, bool is_canonical) {
-    Bytecode& bytecode = Bytecode::Handle(d->zone());
-    ExternalTypedData& binary = ExternalTypedData::Handle(d->zone());
-
-    for (intptr_t i = start_index_; i < stop_index_; i++) {
-      bytecode ^= refs.At(i);
-      binary = bytecode.GetBinary(d->zone());
-      bytecode.set_instructions(reinterpret_cast<uword>(
-          binary.DataAddr(bytecode.instructions_binary_offset())));
-    }
-  }
-};
-
 class ObjectPoolSerializationCluster : public SerializationCluster {
  public:
   ObjectPoolSerializationCluster() : SerializationCluster("ObjectPool") {}
@@ -2064,8 +1984,7 @@
     uint8_t* entry_bits = pool->ptr()->entry_bits();
     for (intptr_t i = 0; i < length; i++) {
       auto entry_type = ObjectPool::TypeBits::decode(entry_bits[i]);
-      if ((entry_type == ObjectPool::EntryType::kTaggedObject) ||
-          (entry_type == ObjectPool::EntryType::kNativeEntryData)) {
+      if (entry_type == ObjectPool::EntryType::kTaggedObject) {
         s->Push(pool->ptr()->data()[i].raw_obj_);
       }
     }
@@ -2112,22 +2031,6 @@
             s->Write<intptr_t>(entry.raw_value_);
             break;
           }
-          case ObjectPool::EntryType::kNativeEntryData: {
-            ObjectPtr raw = entry.raw_obj_;
-            TypedDataPtr raw_data = static_cast<TypedDataPtr>(raw);
-            // kNativeEntryData object pool entries are for linking natives for
-            // the interpreter. Before writing these entries into the snapshot,
-            // we need to unlink them by nulling out the 'trampoline' and
-            // 'native_function' fields.
-            NativeEntryData::Payload* payload =
-                NativeEntryData::FromTypedArray(raw_data);
-            if (payload->kind == MethodRecognizer::kUnknown) {
-              payload->trampoline = NULL;
-              payload->native_function = NULL;
-            }
-            s->WriteElementRef(raw, j);
-            break;
-          }
           case ObjectPool::EntryType::kNativeFunction:
           case ObjectPool::EntryType::kNativeFunctionWrapper: {
             // Write nothing. Will initialize with the lazy link entry.
@@ -2147,7 +2050,7 @@
 
 class ObjectPoolDeserializationCluster : public DeserializationCluster {
  public:
-  ObjectPoolDeserializationCluster() {}
+  ObjectPoolDeserializationCluster() : DeserializationCluster("ObjectPool") {}
   ~ObjectPoolDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -2174,7 +2077,6 @@
         pool->ptr()->entry_bits()[j] = entry_bits;
         ObjectPoolLayout::Entry& entry = pool->ptr()->data()[j];
         switch (ObjectPool::TypeBits::decode(entry_bits)) {
-          case ObjectPool::EntryType::kNativeEntryData:
           case ObjectPool::EntryType::kTaggedObject:
             entry.raw_obj_ = d->ReadRef();
             break;
@@ -2311,7 +2213,8 @@
 class WeakSerializationReferenceDeserializationCluster
     : public DeserializationCluster {
  public:
-  WeakSerializationReferenceDeserializationCluster() {}
+  WeakSerializationReferenceDeserializationCluster()
+      : DeserializationCluster("WeakSerializationReference") {}
   ~WeakSerializationReferenceDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -2383,7 +2286,8 @@
 
 class PcDescriptorsDeserializationCluster : public DeserializationCluster {
  public:
-  PcDescriptorsDeserializationCluster() {}
+  PcDescriptorsDeserializationCluster()
+      : DeserializationCluster("PcDescriptors") {}
   ~PcDescriptorsDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -2476,21 +2380,43 @@
 
 class RODataDeserializationCluster : public DeserializationCluster {
  public:
-  RODataDeserializationCluster() {}
+  explicit RODataDeserializationCluster(intptr_t cid)
+      : DeserializationCluster("ROData"), cid_(cid) {}
   ~RODataDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
+    start_index_ = d->next_index();
     intptr_t count = d->ReadUnsigned();
     uint32_t running_offset = 0;
     for (intptr_t i = 0; i < count; i++) {
       running_offset += d->ReadUnsigned() << kObjectAlignmentLog2;
       d->AssignRef(d->GetObjectAt(running_offset));
     }
+    stop_index_ = d->next_index();
   }
 
   void ReadFill(Deserializer* d, bool is_canonical) {
     // No-op.
   }
+
+  void PostLoad(Deserializer* d, const Array& refs, bool is_canonical) {
+    if (is_canonical && IsStringClassId(cid_) &&
+        (d->isolate() != Dart::vm_isolate())) {
+      CanonicalStringSet table(d->zone(),
+                               d->isolate()->object_store()->symbol_table());
+      String& str = String::Handle(d->zone());
+      for (intptr_t i = start_index_; i < stop_index_; i++) {
+        str ^= refs.At(i);
+        ASSERT(str.IsCanonical());
+        bool present = table.Insert(str);
+        ASSERT(!present);
+      }
+      d->isolate()->object_store()->set_symbol_table(table.Release());
+    }
+  }
+
+ private:
+  const intptr_t cid_;
 };
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
@@ -2546,7 +2472,8 @@
 
 class ExceptionHandlersDeserializationCluster : public DeserializationCluster {
  public:
-  ExceptionHandlersDeserializationCluster() {}
+  ExceptionHandlersDeserializationCluster()
+      : DeserializationCluster("ExceptionHandlers") {}
   ~ExceptionHandlersDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -2634,7 +2561,7 @@
 
 class ContextDeserializationCluster : public DeserializationCluster {
  public:
-  ContextDeserializationCluster() {}
+  ContextDeserializationCluster() : DeserializationCluster("Context") {}
   ~ContextDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -2710,7 +2637,8 @@
 
 class ContextScopeDeserializationCluster : public DeserializationCluster {
  public:
-  ContextScopeDeserializationCluster() {}
+  ContextScopeDeserializationCluster()
+      : DeserializationCluster("ContextScope") {}
   ~ContextScopeDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -2739,71 +2667,6 @@
 };
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
-class ParameterTypeCheckSerializationCluster : public SerializationCluster {
- public:
-  ParameterTypeCheckSerializationCluster()
-      : SerializationCluster("ParameterTypeCheck") {}
-  ~ParameterTypeCheckSerializationCluster() {}
-
-  void Trace(Serializer* s, ObjectPtr object) {
-    ParameterTypeCheckPtr unlinked = ParameterTypeCheck::RawCast(object);
-    objects_.Add(unlinked);
-    PushFromTo(unlinked);
-  }
-
-  void WriteAlloc(Serializer* s) {
-    s->WriteCid(kParameterTypeCheckCid);
-    const intptr_t count = objects_.length();
-    s->WriteUnsigned(count);
-    for (intptr_t i = 0; i < count; i++) {
-      ParameterTypeCheckPtr check = objects_[i];
-      s->AssignRef(check);
-    }
-  }
-
-  void WriteFill(Serializer* s) {
-    const intptr_t count = objects_.length();
-    for (intptr_t i = 0; i < count; i++) {
-      ParameterTypeCheckPtr check = objects_[i];
-      s->Write<intptr_t>(check->ptr()->index_);
-      WriteFromTo(check);
-    }
-  }
-
- private:
-  GrowableArray<ParameterTypeCheckPtr> objects_;
-};
-#endif  // !DART_PRECOMPILED_RUNTIME
-
-class ParameterTypeCheckDeserializationCluster : public DeserializationCluster {
- public:
-  ParameterTypeCheckDeserializationCluster() {}
-  ~ParameterTypeCheckDeserializationCluster() {}
-
-  void ReadAlloc(Deserializer* d, bool is_canonical) {
-    start_index_ = d->next_index();
-    PageSpace* old_space = d->heap()->old_space();
-    const intptr_t count = d->ReadUnsigned();
-    for (intptr_t i = 0; i < count; i++) {
-      d->AssignRef(
-          AllocateUninitialized(old_space, ParameterTypeCheck::InstanceSize()));
-    }
-    stop_index_ = d->next_index();
-  }
-
-  void ReadFill(Deserializer* d, bool is_canonical) {
-    for (intptr_t id = start_index_; id < stop_index_; id++) {
-      ParameterTypeCheckPtr check =
-          static_cast<ParameterTypeCheckPtr>(d->Ref(id));
-      Deserializer::InitializeHeader(check, kParameterTypeCheckCid,
-                                     ParameterTypeCheck::InstanceSize());
-      check->ptr()->index_ = d->Read<intptr_t>();
-      ReadFromTo(check);
-    }
-  }
-};
-
-#if !defined(DART_PRECOMPILED_RUNTIME)
 class UnlinkedCallSerializationCluster : public SerializationCluster {
  public:
   UnlinkedCallSerializationCluster() : SerializationCluster("UnlinkedCall") {}
@@ -2842,7 +2705,8 @@
 
 class UnlinkedCallDeserializationCluster : public DeserializationCluster {
  public:
-  UnlinkedCallDeserializationCluster() {}
+  UnlinkedCallDeserializationCluster()
+      : DeserializationCluster("UnlinkedCall") {}
   ~UnlinkedCallDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -2910,7 +2774,7 @@
 
 class ICDataDeserializationCluster : public DeserializationCluster {
  public:
-  ICDataDeserializationCluster() {}
+  ICDataDeserializationCluster() : DeserializationCluster("ICData") {}
   ~ICDataDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -2974,7 +2838,8 @@
 
 class MegamorphicCacheDeserializationCluster : public DeserializationCluster {
  public:
-  MegamorphicCacheDeserializationCluster() {}
+  MegamorphicCacheDeserializationCluster()
+      : DeserializationCluster("MegamorphicCache") {}
   ~MegamorphicCacheDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -3064,7 +2929,8 @@
 
 class SubtypeTestCacheDeserializationCluster : public DeserializationCluster {
  public:
-  SubtypeTestCacheDeserializationCluster() {}
+  SubtypeTestCacheDeserializationCluster()
+      : DeserializationCluster("SubtypeTestCache") {}
   ~SubtypeTestCacheDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -3127,7 +2993,7 @@
 
 class LoadingUnitDeserializationCluster : public DeserializationCluster {
  public:
-  LoadingUnitDeserializationCluster() {}
+  LoadingUnitDeserializationCluster() : DeserializationCluster("LoadingUnit") {}
   ~LoadingUnitDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -3196,7 +3062,8 @@
 
 class LanguageErrorDeserializationCluster : public DeserializationCluster {
  public:
-  LanguageErrorDeserializationCluster() {}
+  LanguageErrorDeserializationCluster()
+      : DeserializationCluster("LanguageError") {}
   ~LanguageErrorDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -3262,7 +3129,8 @@
 
 class UnhandledExceptionDeserializationCluster : public DeserializationCluster {
  public:
-  UnhandledExceptionDeserializationCluster() {}
+  UnhandledExceptionDeserializationCluster()
+      : DeserializationCluster("UnhandledException") {}
   ~UnhandledExceptionDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -3386,7 +3254,8 @@
 
 class InstanceDeserializationCluster : public DeserializationCluster {
  public:
-  explicit InstanceDeserializationCluster(intptr_t cid) : cid_(cid) {}
+  explicit InstanceDeserializationCluster(intptr_t cid)
+      : DeserializationCluster("Instance"), cid_(cid) {}
   ~InstanceDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -3483,7 +3352,8 @@
 
 class LibraryPrefixDeserializationCluster : public DeserializationCluster {
  public:
-  LibraryPrefixDeserializationCluster() {}
+  LibraryPrefixDeserializationCluster()
+      : DeserializationCluster("LibraryPrefix") {}
   ~LibraryPrefixDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -3577,7 +3447,7 @@
 
 class TypeDeserializationCluster : public DeserializationCluster {
  public:
-  TypeDeserializationCluster() {}
+  TypeDeserializationCluster() : DeserializationCluster("Type") {}
   ~TypeDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -3676,7 +3546,7 @@
 
 class TypeRefDeserializationCluster : public DeserializationCluster {
  public:
-  TypeRefDeserializationCluster() {}
+  TypeRefDeserializationCluster() : DeserializationCluster("TypeRef") {}
   ~TypeRefDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -3774,7 +3644,8 @@
 
 class TypeParameterDeserializationCluster : public DeserializationCluster {
  public:
-  TypeParameterDeserializationCluster() {}
+  TypeParameterDeserializationCluster()
+      : DeserializationCluster("TypeParameter") {}
   ~TypeParameterDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -3878,7 +3749,7 @@
 
 class ClosureDeserializationCluster : public DeserializationCluster {
  public:
-  ClosureDeserializationCluster() {}
+  ClosureDeserializationCluster() : DeserializationCluster("Closure") {}
   ~ClosureDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -3945,7 +3816,7 @@
 
 class MintDeserializationCluster : public DeserializationCluster {
  public:
-  MintDeserializationCluster() {}
+  MintDeserializationCluster() : DeserializationCluster("int") {}
   ~MintDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -4025,7 +3896,7 @@
 
 class DoubleDeserializationCluster : public DeserializationCluster {
  public:
-  DoubleDeserializationCluster() {}
+  DoubleDeserializationCluster() : DeserializationCluster("double") {}
   ~DoubleDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -4088,7 +3959,8 @@
 class GrowableObjectArrayDeserializationCluster
     : public DeserializationCluster {
  public:
-  GrowableObjectArrayDeserializationCluster() {}
+  GrowableObjectArrayDeserializationCluster()
+      : DeserializationCluster("GrowableObjectArray") {}
   ~GrowableObjectArrayDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -4160,7 +4032,8 @@
 
 class TypedDataDeserializationCluster : public DeserializationCluster {
  public:
-  explicit TypedDataDeserializationCluster(intptr_t cid) : cid_(cid) {}
+  explicit TypedDataDeserializationCluster(intptr_t cid)
+      : DeserializationCluster("TypedData"), cid_(cid) {}
   ~TypedDataDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -4237,7 +4110,8 @@
 
 class TypedDataViewDeserializationCluster : public DeserializationCluster {
  public:
-  explicit TypedDataViewDeserializationCluster(intptr_t cid) : cid_(cid) {}
+  explicit TypedDataViewDeserializationCluster(intptr_t cid)
+      : DeserializationCluster("TypedDataView"), cid_(cid) {}
   ~TypedDataViewDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -4316,7 +4190,8 @@
 
 class ExternalTypedDataDeserializationCluster : public DeserializationCluster {
  public:
-  explicit ExternalTypedDataDeserializationCluster(intptr_t cid) : cid_(cid) {}
+  explicit ExternalTypedDataDeserializationCluster(intptr_t cid)
+      : DeserializationCluster("ExternalTypedData"), cid_(cid) {}
   ~ExternalTypedDataDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -4388,7 +4263,7 @@
 
 class StackTraceDeserializationCluster : public DeserializationCluster {
  public:
-  StackTraceDeserializationCluster() {}
+  StackTraceDeserializationCluster() : DeserializationCluster("StackTrace") {}
   ~StackTraceDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -4453,7 +4328,7 @@
 
 class RegExpDeserializationCluster : public DeserializationCluster {
  public:
-  RegExpDeserializationCluster() {}
+  RegExpDeserializationCluster() : DeserializationCluster("RegExp") {}
   ~RegExpDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -4517,7 +4392,8 @@
 
 class WeakPropertyDeserializationCluster : public DeserializationCluster {
  public:
-  WeakPropertyDeserializationCluster() {}
+  WeakPropertyDeserializationCluster()
+      : DeserializationCluster("WeakProperty") {}
   ~WeakPropertyDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -4611,7 +4487,8 @@
 
 class LinkedHashMapDeserializationCluster : public DeserializationCluster {
  public:
-  LinkedHashMapDeserializationCluster() {}
+  LinkedHashMapDeserializationCluster()
+      : DeserializationCluster("LinkedHashMap") {}
   ~LinkedHashMapDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -4716,7 +4593,8 @@
 
 class ArrayDeserializationCluster : public DeserializationCluster {
  public:
-  explicit ArrayDeserializationCluster(intptr_t cid) : cid_(cid) {}
+  explicit ArrayDeserializationCluster(intptr_t cid)
+      : DeserializationCluster("Array"), cid_(cid) {}
   ~ArrayDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -4793,7 +4671,8 @@
 
 class OneByteStringDeserializationCluster : public DeserializationCluster {
  public:
-  OneByteStringDeserializationCluster() {}
+  OneByteStringDeserializationCluster()
+      : DeserializationCluster("OneByteString") {}
   ~OneByteStringDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -4885,7 +4764,8 @@
 
 class TwoByteStringDeserializationCluster : public DeserializationCluster {
  public:
-  TwoByteStringDeserializationCluster() {}
+  TwoByteStringDeserializationCluster()
+      : DeserializationCluster("TwoByteString") {}
   ~TwoByteStringDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -4983,28 +4863,16 @@
                      "<extractor parameter names>");
     s->AddBaseObject(Object::empty_context_scope().raw(), "ContextScope",
                      "<empty>");
+    s->AddBaseObject(Object::empty_object_pool().raw(), "ObjectPool",
+                     "<empty>");
+    s->AddBaseObject(Object::empty_compressed_stackmaps().raw(),
+                     "CompressedStackMaps", "<empty>");
     s->AddBaseObject(Object::empty_descriptors().raw(), "PcDescriptors",
                      "<empty>");
     s->AddBaseObject(Object::empty_var_descriptors().raw(),
                      "LocalVarDescriptors", "<empty>");
     s->AddBaseObject(Object::empty_exception_handlers().raw(),
                      "ExceptionHandlers", "<empty>");
-    s->AddBaseObject(Object::implicit_getter_bytecode().raw(), "Bytecode",
-                     "<implicit getter>");
-    s->AddBaseObject(Object::implicit_setter_bytecode().raw(), "Bytecode",
-                     "<implicit setter>");
-    s->AddBaseObject(Object::implicit_static_getter_bytecode().raw(),
-                     "Bytecode", "<implicit static getter>");
-    s->AddBaseObject(Object::method_extractor_bytecode().raw(), "Bytecode",
-                     "<method extractor>");
-    s->AddBaseObject(Object::invoke_closure_bytecode().raw(), "Bytecode",
-                     "<invoke closure>");
-    s->AddBaseObject(Object::invoke_field_bytecode().raw(), "Bytecode",
-                     "<invoke field>");
-    s->AddBaseObject(Object::nsm_dispatcher_bytecode().raw(), "Bytecode",
-                     "<nsm dispatcher>");
-    s->AddBaseObject(Object::dynamic_invocation_forwarder_bytecode().raw(),
-                     "Bytecode", "<dyn forwarder>");
 
     for (intptr_t i = 0; i < ArgumentsDescriptor::kCachedDescriptorCount; i++) {
       s->AddBaseObject(ArgumentsDescriptor::cached_args_descriptors_[i],
@@ -5083,17 +4951,11 @@
     ASSERT(Object::extractor_parameter_names().raw() != Object::null());
     d->AddBaseObject(Object::extractor_parameter_names().raw());
     d->AddBaseObject(Object::empty_context_scope().raw());
+    d->AddBaseObject(Object::empty_object_pool().raw());
+    d->AddBaseObject(Object::empty_compressed_stackmaps().raw());
     d->AddBaseObject(Object::empty_descriptors().raw());
     d->AddBaseObject(Object::empty_var_descriptors().raw());
     d->AddBaseObject(Object::empty_exception_handlers().raw());
-    d->AddBaseObject(Object::implicit_getter_bytecode().raw());
-    d->AddBaseObject(Object::implicit_setter_bytecode().raw());
-    d->AddBaseObject(Object::implicit_static_getter_bytecode().raw());
-    d->AddBaseObject(Object::method_extractor_bytecode().raw());
-    d->AddBaseObject(Object::invoke_closure_bytecode().raw());
-    d->AddBaseObject(Object::invoke_field_bytecode().raw());
-    d->AddBaseObject(Object::nsm_dispatcher_bytecode().raw());
-    d->AddBaseObject(Object::dynamic_invocation_forwarder_bytecode().raw());
 
     for (intptr_t i = 0; i < ArgumentsDescriptor::kCachedDescriptorCount; i++) {
       d->AddBaseObject(ArgumentsDescriptor::cached_args_descriptors_[i]);
@@ -5491,25 +5353,12 @@
 
 intptr_t Serializer::AssignRef(ObjectPtr object) {
   ASSERT(IsAllocatedReference(next_ref_index_));
-  if (object->IsHeapObject()) {
-    // The object id weak table holds image offsets for Instructions instead
-    // of ref indices.
-    ASSERT(!object->IsInstructions());
-    heap_->SetObjectId(object, next_ref_index_);
-    ASSERT(heap_->GetObjectId(object) == next_ref_index_);
-  } else {
-    SmiPtr smi = Smi::RawCast(object);
-    SmiObjectIdPair* existing_pair = smi_ids_.Lookup(smi);
-    if (existing_pair != NULL) {
-      ASSERT(existing_pair->id_ == kUnallocatedReference);
-      existing_pair->id_ = next_ref_index_;
-    } else {
-      SmiObjectIdPair new_pair;
-      new_pair.smi_ = smi;
-      new_pair.id_ = next_ref_index_;
-      smi_ids_.Insert(new_pair);
-    }
-  }
+
+  // The object id weak table holds image offsets for Instructions instead
+  // of ref indices.
+  ASSERT(!object->IsHeapObject() || !object->IsInstructions());
+  heap_->SetObjectId(object, next_ref_index_);
+  ASSERT(heap_->GetObjectId(object) == next_ref_index_);
 
   objects_->Add(&Object::ZoneHandle(object));
 
@@ -5559,15 +5408,8 @@
                                          const char* name) {
   if (profile_writer_ == nullptr) return;
 
-  intptr_t cid = -1;
-  intptr_t id = 0;
-  if (obj->IsHeapObject()) {
-    id = heap_->GetObjectId(obj);
-    cid = obj->GetClassId();
-  } else {
-    id = smi_ids_.Lookup(Smi::RawCast(obj))->id_;
-    cid = Smi::kClassId;
-  }
+  intptr_t id = heap_->GetObjectId(obj);
+  intptr_t cid = obj->GetClassIdMayBeSmi();
   if (IsArtificialReference(id)) {
     id = -id;
   }
@@ -5679,6 +5521,14 @@
       return "CodeSourceMap";
     case kCompressedStackMapsCid:
       return "CompressedStackMaps";
+    case kOneByteStringCid:
+      return current_loading_unit_id_ <= LoadingUnit::kRootId
+                 ? "OneByteStringCid"
+                 : nullptr;
+    case kTwoByteStringCid:
+      return current_loading_unit_id_ <= LoadingUnit::kRootId
+                 ? "TwoByteStringCid"
+                 : nullptr;
     default:
       return nullptr;
   }
@@ -5739,8 +5589,6 @@
       return new (Z) KernelProgramInfoSerializationCluster();
     case kCodeCid:
       return new (Z) CodeSerializationCluster(heap_);
-    case kBytecodeCid:
-      return new (Z) BytecodeSerializationCluster();
     case kObjectPoolCid:
       return new (Z) ObjectPoolSerializationCluster();
     case kPcDescriptorsCid:
@@ -5751,8 +5599,6 @@
       return new (Z) ContextSerializationCluster();
     case kContextScopeCid:
       return new (Z) ContextScopeSerializationCluster();
-    case kParameterTypeCheckCid:
-      return new (Z) ParameterTypeCheckSerializationCluster();
     case kUnlinkedCallCid:
       return new (Z) UnlinkedCallSerializationCluster();
     case kICDataCid:
@@ -5915,27 +5761,10 @@
 #endif
 
 void Serializer::Push(ObjectPtr object) {
-  if (!object->IsHeapObject()) {
-    SmiPtr smi = Smi::RawCast(object);
-    if (smi_ids_.Lookup(smi) == NULL) {
-      SmiObjectIdPair pair;
-      pair.smi_ = smi;
-      pair.id_ = kUnallocatedReference;
-      smi_ids_.Insert(pair);
-      stack_.Add(object);
-      num_written_objects_++;
-    }
-    return;
-  }
-
-  if (object->IsCode() && !Snapshot::IncludesCode(kind_)) {
+  if (object->IsHeapObject() && object->IsCode() &&
+      !Snapshot::IncludesCode(kind_)) {
     return;  // Do not trace, will write null.
   }
-#if !defined(DART_PRECOMPILED_RUNTIME)
-  if (object->IsBytecode() && !Snapshot::IncludesBytecode(kind_)) {
-    return;  // Do not trace, will write null.
-  }
-#endif  // !DART_PRECOMPILED_RUNTIME
 
   intptr_t id = heap_->GetObjectId(object);
   if (id == kUnreachableReference) {
@@ -5943,7 +5772,7 @@
     // roots we do not trace references, e.g. inside [RawCode], to
     // [RawInstructions], since [RawInstructions] doesn't contain any references
     // and the serialization code uses an [ImageWriter] for those.
-    if (object->IsInstructions()) {
+    if (object->IsHeapObject() && object->IsInstructions()) {
       UnexpectedObject(object,
                        "Instructions should only be reachable from Code");
     }
@@ -5972,19 +5801,15 @@
     is_canonical = object->ptr()->IsCanonical();
   }
 
-  SerializationCluster* cluster =
-      is_canonical ? canonical_clusters_by_cid_[cid] : clusters_by_cid_[cid];
-  if (cluster == nullptr) {
-    cluster = NewClusterForClass(cid);
-    if (cluster == nullptr) {
+  SerializationCluster** cluster_ref =
+      is_canonical ? &canonical_clusters_by_cid_[cid] : &clusters_by_cid_[cid];
+  if (*cluster_ref == nullptr) {
+    *cluster_ref = NewClusterForClass(cid);
+    if (*cluster_ref == nullptr) {
       UnexpectedObject(object, "No serialization cluster defined");
     }
-    if (is_canonical) {
-      canonical_clusters_by_cid_[cid] = cluster;
-    } else {
-      clusters_by_cid_[cid] = cluster;
-    }
   }
+  SerializationCluster* cluster = *cluster_ref;
   ASSERT(cluster != nullptr);
 
 #if defined(SNAPSHOT_BACKTRACE)
@@ -6372,6 +6197,7 @@
                            intptr_t size,
                            const uint8_t* data_buffer,
                            const uint8_t* instructions_buffer,
+                           bool is_non_root_unit,
                            intptr_t offset)
     : ThreadStackResource(thread),
       heap_(thread->isolate()->heap()),
@@ -6384,7 +6210,8 @@
       previous_text_offset_(0),
       canonical_clusters_(nullptr),
       clusters_(nullptr),
-      field_table_(thread->isolate()->field_table()) {
+      field_table_(thread->isolate()->field_table()),
+      is_non_root_unit_(is_non_root_unit) {
   if (Snapshot::IncludesCode(kind)) {
     ASSERT(instructions_buffer != nullptr);
     ASSERT(data_buffer != nullptr);
@@ -6419,7 +6246,13 @@
       case kPcDescriptorsCid:
       case kCodeSourceMapCid:
       case kCompressedStackMapsCid:
-        return new (Z) RODataDeserializationCluster();
+        return new (Z) RODataDeserializationCluster(cid);
+      case kOneByteStringCid:
+      case kTwoByteStringCid:
+        if (!is_non_root_unit_) {
+          return new (Z) RODataDeserializationCluster(cid);
+        }
+        break;
     }
   }
 
@@ -6454,10 +6287,6 @@
 #endif  // !DART_PRECOMPILED_RUNTIME
     case kCodeCid:
       return new (Z) CodeDeserializationCluster();
-#if !defined(DART_PRECOMPILED_RUNTIME)
-    case kBytecodeCid:
-      return new (Z) BytecodeDeserializationCluster();
-#endif  // !DART_PRECOMPILED_RUNTIME
     case kObjectPoolCid:
       return new (Z) ObjectPoolDeserializationCluster();
     case kPcDescriptorsCid:
@@ -6468,8 +6297,6 @@
       return new (Z) ContextDeserializationCluster();
     case kContextScopeCid:
       return new (Z) ContextScopeDeserializationCluster();
-    case kParameterTypeCheckCid:
-      return new (Z) ParameterTypeCheckDeserializationCluster();
     case kUnlinkedCallCid:
       return new (Z) UnlinkedCallDeserializationCluster();
     case kICDataCid:
@@ -7283,7 +7110,8 @@
   }
 
   Deserializer deserializer(thread_, kind_, buffer_, size_, data_image_,
-                            instructions_image_, offset);
+                            instructions_image_, /*is_non_root_unit=*/false,
+                            offset);
   ApiErrorPtr api_error = deserializer.VerifyImageAlignment();
   if (api_error != ApiError::null()) {
     return api_error;
@@ -7323,7 +7151,8 @@
   }
 
   Deserializer deserializer(thread_, kind_, buffer_, size_, data_image_,
-                            instructions_image_, offset);
+                            instructions_image_, /*is_non_root_unit=*/false,
+                            offset);
   ApiErrorPtr api_error = deserializer.VerifyImageAlignment();
   if (api_error != ApiError::null()) {
     return api_error;
@@ -7356,8 +7185,9 @@
     return ConvertToApiError(error);
   }
 
-  Deserializer deserializer(thread_, kind_, buffer_, size_, data_image_,
-                            instructions_image_, offset);
+  Deserializer deserializer(
+      thread_, kind_, buffer_, size_, data_image_, instructions_image_,
+      /*is_non_root_unit=*/unit.id() != LoadingUnit::kRootId, offset);
   ApiErrorPtr api_error = deserializer.VerifyImageAlignment();
   if (api_error != ApiError::null()) {
     return api_error;
diff --git a/runtime/vm/clustered_snapshot.h b/runtime/vm/clustered_snapshot.h
index 56ba846..2632693 100644
--- a/runtime/vm/clustered_snapshot.h
+++ b/runtime/vm/clustered_snapshot.h
@@ -110,7 +110,8 @@
 
 class DeserializationCluster : public ZoneAllocated {
  public:
-  DeserializationCluster() : start_index_(-1), stop_index_(-1) {}
+  explicit DeserializationCluster(const char* name)
+      : name_(name), start_index_(-1), stop_index_(-1) {}
   virtual ~DeserializationCluster() {}
 
   // Allocate memory for all objects in the cluster and write their addresses
@@ -126,7 +127,10 @@
                         const Array& refs,
                         bool is_canonical) {}
 
+  const char* name() const { return name_; }
+
  protected:
+  const char* name_;
   // The range of the ref array that belongs to this cluster.
   intptr_t start_index_;
   intptr_t stop_index_;
@@ -148,31 +152,6 @@
   virtual void PostLoad(Deserializer* deserializer, const Array& refs) = 0;
 };
 
-class SmiObjectIdPair {
- public:
-  SmiObjectIdPair() : smi_(nullptr), id_(0) {}
-  SmiPtr smi_;
-  intptr_t id_;
-
-  bool operator==(const SmiObjectIdPair& other) const {
-    return (smi_ == other.smi_) && (id_ == other.id_);
-  }
-};
-
-class SmiObjectIdPairTrait {
- public:
-  typedef SmiPtr Key;
-  typedef intptr_t Value;
-  typedef SmiObjectIdPair Pair;
-
-  static Key KeyOf(Pair kv) { return kv.smi_; }
-  static Value ValueOf(Pair kv) { return kv.id_; }
-  static inline intptr_t Hashcode(Key key) { return Smi::Value(key); }
-  static inline bool IsKeyEqual(Pair kv, Key key) { return kv.smi_ == key; }
-};
-
-typedef DirectChainedHashMap<SmiObjectIdPairTrait> SmiObjectIdMap;
-
 // Reference value for objects that either are not reachable from the roots or
 // should never have a reference in the snapshot (because they are dropped,
 // for example). Should be the default value for Heap::GetObjectId.
@@ -411,15 +390,9 @@
   // been allocated a reference ID yet, so should be used only after all
   // WriteAlloc calls.
   intptr_t RefId(ObjectPtr object, bool permit_artificial_ref = false) {
-    if (!object->IsHeapObject()) {
-      SmiPtr smi = Smi::RawCast(object);
-      auto const id = smi_ids_.Lookup(smi)->id_;
-      if (IsAllocatedReference(id)) return id;
-      FATAL("Missing ref");
-    }
     // The object id weak table holds image offsets for Instructions instead
     // of ref indices.
-    ASSERT(!object->IsInstructions());
+    ASSERT(!object->IsHeapObject() || !object->IsInstructions());
     auto const id = heap_->GetObjectId(object);
     if (permit_artificial_ref && IsArtificialReference(id)) {
       return -id;
@@ -440,16 +413,11 @@
     if (object->IsCode() && !Snapshot::IncludesCode(kind_)) {
       return RefId(Object::null());
     }
-#if !defined(DART_PRECOMPILED_RUNTIME)
-    if (object->IsBytecode() && !Snapshot::IncludesBytecode(kind_)) {
-      return RefId(Object::null());
-    }
-#endif  // !DART_PRECOMPILED_RUNTIME
     FATAL("Missing ref");
   }
 
  private:
-  static const char* ReadOnlyObjectType(intptr_t cid);
+  const char* ReadOnlyObjectType(intptr_t cid);
 
   Heap* heap_;
   Zone* zone_;
@@ -465,7 +433,6 @@
   intptr_t num_written_objects_;
   intptr_t next_ref_index_;
   intptr_t previous_text_offset_;
-  SmiObjectIdMap smi_ids_;
   FieldTable* field_table_;
 
   intptr_t dispatch_table_size_ = 0;
@@ -581,6 +548,7 @@
                intptr_t size,
                const uint8_t* data_buffer,
                const uint8_t* instructions_buffer,
+               bool is_non_root_unit,
                intptr_t offset = 0);
   ~Deserializer();
 
@@ -691,6 +659,7 @@
   DeserializationCluster** canonical_clusters_;
   DeserializationCluster** clusters_;
   FieldTable* field_table_;
+  const bool is_non_root_unit_;
 };
 
 #define ReadFromTo(obj, ...) d->ReadFromTo(obj, ##__VA_ARGS__);
diff --git a/runtime/vm/code_patcher.h b/runtime/vm/code_patcher.h
index ba7ff04..30828a1 100644
--- a/runtime/vm/code_patcher.h
+++ b/runtime/vm/code_patcher.h
@@ -107,18 +107,6 @@
 // Example pattern: `[0x3d, 0x8b, -1, -1]`.
 bool MatchesPattern(uword end, const int16_t* pattern, intptr_t size);
 
-class KBCPatcher : public AllStatic {
- public:
-  static NativeFunctionWrapper GetNativeCallAt(uword return_address,
-                                               const Bytecode& bytecode,
-                                               NativeFunction* function);
-
-  static void PatchNativeCallAt(uword return_address,
-                                const Bytecode& bytecode,
-                                NativeFunction function,
-                                NativeFunctionWrapper trampoline);
-};
-
 }  // namespace dart
 
 #endif  // RUNTIME_VM_CODE_PATCHER_H_
diff --git a/runtime/vm/code_patcher_arm64_test.cc b/runtime/vm/code_patcher_arm64_test.cc
index 135452e..61767d8 100644
--- a/runtime/vm/code_patcher_arm64_test.cc
+++ b/runtime/vm/code_patcher_arm64_test.cc
@@ -50,8 +50,7 @@
   const intptr_t stub_index =
       op.AddObject(stub, ObjectPool::Patchability::kPatchable);
   ASSERT((ic_data_index + 1) == stub_index);
-  __ LoadDoubleWordFromPoolOffset(R5, CODE_REG,
-                                  ObjectPool::element_offset(ic_data_index));
+  __ LoadDoubleWordFromPoolIndex(R5, CODE_REG, ic_data_index);
   __ ldr(LR, compiler::FieldAddress(
                  CODE_REG,
                  Code::entry_point_offset(Code::EntryKind::kMonomorphic)));
diff --git a/runtime/vm/code_patcher_kbc.cc b/runtime/vm/code_patcher_kbc.cc
deleted file mode 100644
index 2dd74bd..0000000
--- a/runtime/vm/code_patcher_kbc.cc
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright (c) 2018, 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.
-
-#include "vm/globals.h"
-#if !defined(DART_PRECOMPILED_RUNTIME)
-
-#include "vm/code_patcher.h"
-
-#include "vm/instructions_kbc.h"
-#include "vm/native_entry.h"
-
-namespace dart {
-
-void KBCPatcher::PatchNativeCallAt(uword return_address,
-                                   const Bytecode& bytecode,
-                                   NativeFunction function,
-                                   NativeFunctionWrapper trampoline) {
-  ASSERT(bytecode.ContainsInstructionAt(return_address));
-  NativeEntryData native_entry_data(TypedData::Handle(
-      KBCNativeCallPattern::GetNativeEntryDataAt(return_address, bytecode)));
-  native_entry_data.set_trampoline(trampoline);
-  native_entry_data.set_native_function(function);
-}
-
-NativeFunctionWrapper KBCPatcher::GetNativeCallAt(uword return_address,
-                                                  const Bytecode& bytecode,
-                                                  NativeFunction* function) {
-  ASSERT(bytecode.ContainsInstructionAt(return_address));
-  NativeEntryData native_entry_data(TypedData::Handle(
-      KBCNativeCallPattern::GetNativeEntryDataAt(return_address, bytecode)));
-  *function = native_entry_data.native_function();
-  return native_entry_data.trampoline();
-}
-
-}  // namespace dart
-
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
diff --git a/runtime/vm/compiler/aot/dispatch_table_generator.cc b/runtime/vm/compiler/aot/dispatch_table_generator.cc
index 073a227..415b1ef 100644
--- a/runtime/vm/compiler/aot/dispatch_table_generator.cc
+++ b/runtime/vm/compiler/aot/dispatch_table_generator.cc
@@ -445,7 +445,7 @@
     obj = classes_->At(cid);
     if (obj.IsClass()) {
       klass = Class::RawCast(obj.raw());
-      functions = klass.functions();
+      functions = klass.current_functions();
       if (!functions.IsNull()) {
         for (intptr_t j = 0; j < functions.Length(); j++) {
           function ^= functions.At(j);
@@ -561,7 +561,7 @@
       klass = Class::RawCast(obj.raw());
       GrowableArray<Interval>& subclasss_cid_ranges = cid_subclass_ranges[cid];
 
-      functions = klass.functions();
+      functions = klass.current_functions();
       if (!functions.IsNull()) {
         const int16_t depth = cid_depth[cid];
         for (intptr_t j = 0; j < functions.Length(); j++) {
diff --git a/runtime/vm/compiler/aot/precompiler.cc b/runtime/vm/compiler/aot/precompiler.cc
index 62c6dd0..0b503e5 100644
--- a/runtime/vm/compiler/aot/precompiler.cc
+++ b/runtime/vm/compiler/aot/precompiler.cc
@@ -278,7 +278,7 @@
       if (FLAG_use_bare_instructions) {
         // We use any stub here to get it's object pool (all stubs share the
         // same object pool in bare instructions mode).
-        const Code& code = StubCode::InterpretCall();
+        const Code& code = StubCode::LazyCompile();
         const ObjectPool& stub_pool = ObjectPool::Handle(code.object_pool());
 
         global_object_pool_builder()->Reset();
@@ -420,7 +420,6 @@
       I->object_store()->set_async_star_move_next_helper(null_function);
       I->object_store()->set_complete_on_async_return(null_function);
       I->object_store()->set_async_star_stream_controller(null_class);
-      I->object_store()->set_bytecode_attributes(Array::null_array());
       DropMetadata();
       DropLibraryEntries();
     }
@@ -796,6 +795,14 @@
     type = function.ParameterTypeAt(i);
     AddType(type);
   }
+  // At this point, ensure any cached default type arguments are canonicalized.
+  function.UpdateCachedDefaultTypeArguments(thread());
+  if (function.CachesDefaultTypeArguments()) {
+    const auto& defaults = TypeArguments::Handle(
+        Z, function.default_type_arguments(/*kind_out=*/nullptr));
+    ASSERT(defaults.IsCanonical());
+    AddTypeArguments(defaults);
+  }
   Code& code = Code::Handle(Z, function.CurrentCode());
   if (code.IsNull()) {
     ASSERT(function.kind() == FunctionLayout::kSignatureFunction);
@@ -834,18 +841,17 @@
   if (abstype.IsNull()) return;
 
   if (abstype.IsTypeParameter()) {
-    if (typeparams_to_retain_.HasKey(&TypeParameter::Cast(abstype))) return;
-    typeparams_to_retain_.Insert(
-        &TypeParameter::ZoneHandle(Z, TypeParameter::Cast(abstype).raw()));
+    const auto& param = TypeParameter::Cast(abstype);
+    if (typeparams_to_retain_.HasKey(&param)) return;
+    typeparams_to_retain_.Insert(&TypeParameter::ZoneHandle(Z, param.raw()));
 
-    const AbstractType& type =
-        AbstractType::Handle(Z, TypeParameter::Cast(abstype).bound());
+    auto& type = AbstractType::Handle(Z, param.bound());
     AddType(type);
-    const auto& function = Function::Handle(
-        Z, TypeParameter::Cast(abstype).parameterized_function());
+    type = param.default_argument();
+    AddType(type);
+    const auto& function = Function::Handle(Z, param.parameterized_function());
     AddTypesOf(function);
-    const Class& cls =
-        Class::Handle(Z, TypeParameter::Cast(abstype).parameterized_class());
+    const Class& cls = Class::Handle(Z, param.parameterized_class());
     AddTypesOf(cls);
     return;
   }
@@ -1203,7 +1209,7 @@
       }
 
       // Check for @pragma on any functions in the class.
-      members = cls.functions();
+      members = cls.current_functions();
       for (intptr_t k = 0; k < members.Length(); k++) {
         function ^= members.At(k);
         if (function.has_pragma()) {
@@ -1285,7 +1291,7 @@
 
       if (!cls.is_allocated()) continue;
 
-      functions = cls.functions();
+      functions = cls.current_functions();
       for (intptr_t k = 0; k < functions.Length(); k++) {
         function ^= functions.At(k);
 
@@ -1452,7 +1458,7 @@
     ClassDictionaryIterator it(lib, ClassDictionaryIterator::kIteratePrivate);
     while (it.HasNext()) {
       cls = it.GetNextClass();
-      functions = cls.functions();
+      functions = cls.current_functions();
 
       const intptr_t length = functions.Length();
       for (intptr_t j = 0; j < length; j++) {
@@ -1555,7 +1561,7 @@
     ClassDictionaryIterator it(lib, ClassDictionaryIterator::kIteratePrivate);
     while (it.HasNext()) {
       cls = it.GetNextClass();
-      functions = cls.functions();
+      functions = cls.current_functions();
       for (intptr_t j = 0; j < functions.Length(); j++) {
         function ^= functions.At(j);
         bool retain = possibly_retained_functions_.ContainsKey(function);
@@ -1724,6 +1730,7 @@
     }
   };
 
+  SafepointWriteRwLocker ml(T, T->isolate_group()->program_lock());
   auto& dispatchers_array = Array::Handle(Z);
   auto& name = String::Handle(Z);
   auto& desc = Array::Handle(Z);
@@ -1737,7 +1744,6 @@
       for (intptr_t j = 0; j < functions.Length(); j++) {
         function ^= functions.At(j);
         function.DropUncompiledImplicitClosureFunction();
-        function.ClearBytecode();
         if (functions_to_retain_.ContainsKey(function)) {
           retained_functions.Add(function);
         } else {
@@ -1787,7 +1793,6 @@
   retained_functions = GrowableObjectArray::New();
   for (intptr_t j = 0; j < closures.Length(); j++) {
     function ^= closures.At(j);
-    function.ClearBytecode();
     if (functions_to_retain_.ContainsKey(function)) {
       retained_functions.Add(function);
     } else {
@@ -1804,8 +1809,8 @@
   Field& field = Field::Handle(Z);
   GrowableObjectArray& retained_fields = GrowableObjectArray::Handle(Z);
   AbstractType& type = AbstractType::Handle(Z);
-  Function& initializer_function = Function::Handle(Z);
 
+  SafepointWriteRwLocker ml(T, T->isolate_group()->program_lock());
   for (intptr_t i = 0; i < libraries_.Length(); i++) {
     lib ^= libraries_.At(i);
     ClassDictionaryIterator it(lib, ClassDictionaryIterator::kIteratePrivate);
@@ -1816,10 +1821,6 @@
       for (intptr_t j = 0; j < fields.Length(); j++) {
         field ^= fields.At(j);
         bool retain = fields_to_retain_.HasKey(&field);
-        if (field.HasInitializerFunction()) {
-          initializer_function = field.InitializerFunction();
-          initializer_function.ClearBytecode();
-        }
 #if !defined(PRODUCT)
         if (field.is_instance() && cls.is_allocated()) {
           // Keep instance fields so their names are available to graph tools.
@@ -2043,6 +2044,7 @@
   auto& retained_constants = GrowableObjectArray::Handle(Z);
   auto& constant = Instance::Handle(Z);
 
+  SafepointWriteRwLocker ml(T, T->isolate_group()->program_lock());
   for (intptr_t i = 0; i < libraries_.Length(); i++) {
     lib ^= libraries_.At(i);
     ClassDictionaryIterator it(lib, ClassDictionaryIterator::kIteratePrivate);
@@ -2058,7 +2060,7 @@
       if (members.Length() > 0) {
         retain = true;
       }
-      members = cls.functions();
+      members = cls.current_functions();
       if (members.Length() > 0) {
         retain = true;
       }
@@ -2218,7 +2220,6 @@
           program_info.set_scripts(Array::null_array());
           program_info.set_libraries_cache(Array::null_array());
           program_info.set_classes_cache(Array::null_array());
-          program_info.set_bytecode_component(Array::null_array());
         }
         script.set_resolved_url(String::null_string());
         script.set_compile_time_constants(Array::null_array());
diff --git a/runtime/vm/compiler/aot/precompiler.h b/runtime/vm/compiler/aot/precompiler.h
index e80a81c..41a7902 100644
--- a/runtime/vm/compiler/aot/precompiler.h
+++ b/runtime/vm/compiler/aot/precompiler.h
@@ -96,7 +96,7 @@
     if (token_pos.IsReal()) {
       return token_pos.value();
     }
-    return key->binary_declaration_offset();
+    return key->kernel_offset();
   }
 
   static inline bool IsKeyEqual(Pair pair, Key key) {
diff --git a/runtime/vm/compiler/asm_intrinsifier.h b/runtime/vm/compiler/asm_intrinsifier.h
index 58a97e0..4745bad 100644
--- a/runtime/vm/compiler/asm_intrinsifier.h
+++ b/runtime/vm/compiler/asm_intrinsifier.h
@@ -41,8 +41,6 @@
   // `runtime/lib/math_patch.dart:_Random._nextState()`
   static const int64_t kRandomAValue = 0xffffda61;
 
-  static bool CanIntrinsify(const Function& function);
-
 #define DECLARE_FUNCTION(class_name, function_name, enum_name, fp)             \
   static void enum_name(Assembler* assembler, Label* normal_ir_body);
   ALL_INTRINSICS_LIST(DECLARE_FUNCTION)
diff --git a/runtime/vm/compiler/asm_intrinsifier_arm64.cc b/runtime/vm/compiler/asm_intrinsifier_arm64.cc
index 7552c3c..a54be20 100644
--- a/runtime/vm/compiler/asm_intrinsifier_arm64.cc
+++ b/runtime/vm/compiler/asm_intrinsifier_arm64.cc
@@ -1554,8 +1554,10 @@
 
   __ Bind(&use_declaration_type);
   __ LoadClassById(R2, R1);
-  __ ldr(R3, FieldAddress(R2, target::Class::num_type_arguments_offset()),
-         kHalfword);
+  __ ldr(
+      R3,
+      FieldAddress(R2, target::Class::num_type_arguments_offset(), kHalfword),
+      kHalfword);
   __ CompareImmediate(R3, 0);
   __ b(normal_ir_body, NE);
 
@@ -1594,7 +1596,8 @@
   // Otherwise fall through into the runtime to handle comparison.
   __ LoadClassById(scratch, cid1);
   __ ldr(scratch,
-         FieldAddress(scratch, target::Class::num_type_arguments_offset()),
+         FieldAddress(scratch, target::Class::num_type_arguments_offset(),
+                      kHalfword),
          kHalfword);
   __ cbnz(normal_ir_body, scratch);
   __ b(equal);
@@ -1693,9 +1696,9 @@
 
   // Check nullability.
   __ Bind(&equiv_cids);
-  __ ldr(R1, FieldAddress(R1, target::Type::nullability_offset()),
+  __ ldr(R1, FieldAddress(R1, target::Type::nullability_offset(), kByte),
          kUnsignedByte);
-  __ ldr(R2, FieldAddress(R2, target::Type::nullability_offset()),
+  __ ldr(R2, FieldAddress(R2, target::Type::nullability_offset(), kByte),
          kUnsignedByte);
   __ cmp(R1, Operand(R2));
   __ b(&check_legacy, NE);
@@ -1703,7 +1706,7 @@
 
   __ Bind(&equal);
   __ LoadObject(R0, CastHandle<Object>(TrueObject()));
-  __ Ret();
+  __ ret();
 
   // At this point the nullabilities are different, so they can only be
   // syntactically equivalent if they're both either kNonNullable or kLegacy.
@@ -1726,7 +1729,8 @@
 void AsmIntrinsifier::Object_getHash(Assembler* assembler,
                                      Label* normal_ir_body) {
   __ ldr(R0, Address(SP, 0 * target::kWordSize));
-  __ ldr(R0, FieldAddress(R0, target::String::hash_offset()), kUnsignedWord);
+  __ ldr(R0, FieldAddress(R0, target::String::hash_offset(), kWord),
+         kUnsignedWord);
   __ SmiTag(R0);
   __ ret();
 }
@@ -1736,7 +1740,8 @@
   __ ldr(R0, Address(SP, 1 * target::kWordSize));  // Object.
   __ ldr(R1, Address(SP, 0 * target::kWordSize));  // Value.
   __ SmiUntag(R1);
-  __ str(R1, FieldAddress(R0, target::String::hash_offset()), kUnsignedWord);
+  __ str(R1, FieldAddress(R0, target::String::hash_offset(), kWord),
+         kUnsignedWord);
   __ ret();
 }
 
@@ -1981,17 +1986,11 @@
   __ mov(R6, length_reg);  // Save the length register.
   if (cid == kOneByteStringCid) {
     // Untag length.
-    __ adds(length_reg, ZR, Operand(length_reg, ASR, kSmiTagSize));
+    __ SmiUntag(length_reg, length_reg);
   } else {
     // Untag length and multiply by element size -> no-op.
-    __ adds(length_reg, ZR, Operand(length_reg));
+    ASSERT(kSmiTagSize == 1);
   }
-  // If the length is 0 then we have to make the allocated size a bit bigger,
-  // otherwise the string takes up less space than an ExternalOneByteString,
-  // and cannot be externalized.  TODO(erikcorry): We should probably just
-  // return a static zero length string here instead.
-  // length <- (length != 0) ? length : (ZR + 1).
-  __ csinc(length_reg, length_reg, ZR, NE);
   const intptr_t fixed_size_plus_alignment_padding =
       target::String::InstanceSize() +
       target::ObjectAlignment::kObjectAlignment - 1;
@@ -2096,7 +2095,7 @@
   __ AddImmediate(R6, 1);
   __ sub(R2, R2, Operand(1));
   __ cmp(R2, Operand(0));
-  __ str(R1, FieldAddress(R7, target::OneByteString::data_offset()),
+  __ str(R1, FieldAddress(R7, target::OneByteString::data_offset(), kByte),
          kUnsignedByte);
   __ AddImmediate(R7, 1);
   __ b(&loop, GT);
diff --git a/runtime/vm/compiler/asm_intrinsifier_x64.cc b/runtime/vm/compiler/asm_intrinsifier_x64.cc
index 9ee661c..816f2fc 100644
--- a/runtime/vm/compiler/asm_intrinsifier_x64.cc
+++ b/runtime/vm/compiler/asm_intrinsifier_x64.cc
@@ -1943,18 +1943,11 @@
   __ pushq(RDI);                          // Preserve length.
   if (cid == kOneByteStringCid) {
     // Untag length.
-    __ sarq(RDI, Immediate(kSmiTagShift));
+    __ SmiUntag(RDI);
   } else {
     // Untag length and multiply by element size -> no-op.
-    __ testq(RDI, RDI);
+    ASSERT(kSmiTagSize == 1);
   }
-  // If the length is 0 then we have to make the allocated size a bit bigger,
-  // otherwise the string takes up less space than an ExternalOneByteString,
-  // and cannot be externalized.  TODO(erikcorry): We should probably just
-  // return a static zero length string here instead.
-  __ j(NOT_ZERO, &not_zero_length);
-  __ addq(RDI, Immediate(1));
-  __ Bind(&not_zero_length);
   const intptr_t fixed_size_plus_alignment_padding =
       target::String::InstanceSize() +
       target::ObjectAlignment::kObjectAlignment - 1;
diff --git a/runtime/vm/compiler/assembler/assembler_arm.cc b/runtime/vm/compiler/assembler/assembler_arm.cc
index f1997a9..8417f7c 100644
--- a/runtime/vm/compiler/assembler/assembler_arm.cc
+++ b/runtime/vm/compiler/assembler/assembler_arm.cc
@@ -639,7 +639,7 @@
   }
 
   // Mark that the thread is executing Dart code.
-  LoadImmediate(state, target::Thread::vm_tag_compiled_id());
+  LoadImmediate(state, target::Thread::vm_tag_dart_id());
   StoreToOffset(kWord, state, THR, target::Thread::vm_tag_offset());
   LoadImmediate(state, target::Thread::generated_execution_state());
   StoreToOffset(kWord, state, THR, target::Thread::execution_state_offset());
@@ -1514,12 +1514,15 @@
 }
 
 // Uses a code sequence that can easily be decoded.
-void Assembler::LoadWordFromPoolOffset(Register rd,
-                                       int32_t offset,
-                                       Register pp,
-                                       Condition cond) {
+void Assembler::LoadWordFromPoolIndex(Register rd,
+                                      intptr_t index,
+                                      Register pp,
+                                      Condition cond) {
   ASSERT((pp != PP) || constant_pool_allowed());
   ASSERT(rd != pp);
+  // PP is tagged on ARM.
+  const int32_t offset =
+      target::ObjectPool::element_offset(index) - kHeapObjectTag;
   int32_t offset_mask = 0;
   if (Address::CanHoldLoadOffset(kWord, offset, &offset_mask)) {
     ldr(rd, Address(pp, offset), cond);
@@ -1632,8 +1635,7 @@
   // object pool.
   const auto index = is_unique ? object_pool_builder().AddObject(object)
                                : object_pool_builder().FindObject(object);
-  const int32_t offset = target::ObjectPool::element_offset(index);
-  LoadWordFromPoolOffset(rd, offset - kHeapObjectTag, pp, cond);
+  LoadWordFromPoolIndex(rd, index, pp, cond);
 }
 
 void Assembler::LoadObject(Register rd, const Object& object, Condition cond) {
@@ -1650,9 +1652,9 @@
                                 const ExternalLabel* label,
                                 ObjectPoolBuilderEntry::Patchability patchable,
                                 Condition cond) {
-  const int32_t offset = target::ObjectPool::element_offset(
-      object_pool_builder().FindNativeFunction(label, patchable));
-  LoadWordFromPoolOffset(rd, offset - kHeapObjectTag, PP, cond);
+  const intptr_t index =
+      object_pool_builder().FindNativeFunction(label, patchable);
+  LoadWordFromPoolIndex(rd, index, PP, cond);
 }
 
 void Assembler::PushObject(const Object& object) {
@@ -2207,6 +2209,7 @@
   switch (cid) {
     case kArrayCid:
     case kImmutableArrayCid:
+    case kTypeArgumentsCid:
       return kWord;
     case kOneByteStringCid:
     case kExternalOneByteStringCid:
@@ -2580,9 +2583,9 @@
                        ObjectPoolBuilderEntry::Patchability patchable,
                        Register pp,
                        Condition cond) {
-  const int32_t offset = target::ObjectPool::element_offset(
-      object_pool_builder().FindObject(ToObject(target), patchable));
-  LoadWordFromPoolOffset(CODE_REG, offset - kHeapObjectTag, pp, cond);
+  const intptr_t index =
+      object_pool_builder().FindObject(ToObject(target), patchable);
+  LoadWordFromPoolIndex(CODE_REG, index, pp, cond);
   Branch(FieldAddress(CODE_REG, target::Code::entry_point_offset()), cond);
 }
 
@@ -2597,9 +2600,9 @@
   // to by this code sequence.
   // For added code robustness, use 'blx lr' in a patchable sequence and
   // use 'blx ip' in a non-patchable sequence (see other BranchLink flavors).
-  const int32_t offset = target::ObjectPool::element_offset(
-      object_pool_builder().FindObject(ToObject(target), patchable));
-  LoadWordFromPoolOffset(CODE_REG, offset - kHeapObjectTag, PP, AL);
+  const intptr_t index =
+      object_pool_builder().FindObject(ToObject(target), patchable);
+  LoadWordFromPoolIndex(CODE_REG, index, PP, AL);
   ldr(LR, FieldAddress(CODE_REG, target::Code::entry_point_offset(entry_kind)));
   blx(LR);  // Use blx instruction so that the return branch prediction works.
 }
@@ -2621,9 +2624,9 @@
   // to by this code sequence.
   // For added code robustness, use 'blx lr' in a patchable sequence and
   // use 'blx ip' in a non-patchable sequence (see other BranchLink flavors).
-  const int32_t offset = target::ObjectPool::element_offset(
-      object_pool_builder().FindObject(ToObject(target), equivalence));
-  LoadWordFromPoolOffset(CODE_REG, offset - kHeapObjectTag, PP, AL);
+  const intptr_t index =
+      object_pool_builder().FindObject(ToObject(target), equivalence);
+  LoadWordFromPoolIndex(CODE_REG, index, PP, AL);
   ldr(LR, FieldAddress(CODE_REG, target::Code::entry_point_offset(entry_kind)));
   blx(LR);  // Use blx instruction so that the return branch prediction works.
 }
diff --git a/runtime/vm/compiler/assembler/assembler_arm.h b/runtime/vm/compiler/assembler/assembler_arm.h
index 9707e07..1e9d2ff 100644
--- a/runtime/vm/compiler/assembler/assembler_arm.h
+++ b/runtime/vm/compiler/assembler/assembler_arm.h
@@ -835,10 +835,10 @@
 
   // Load word from pool from the given offset using encoding that
   // InstructionPattern::DecodeLoadWordFromPool can decode.
-  void LoadWordFromPoolOffset(Register rd,
-                              int32_t offset,
-                              Register pp,
-                              Condition cond = AL);
+  void LoadWordFromPoolIndex(Register rd,
+                             intptr_t index,
+                             Register pp = PP,
+                             Condition cond = AL);
 
   void LoadObject(Register rd, const Object& object, Condition cond = AL);
   void LoadUniqueObject(Register rd, const Object& object, Condition cond = AL);
diff --git a/runtime/vm/compiler/assembler/assembler_arm64.cc b/runtime/vm/compiler/assembler/assembler_arm64.cc
index 4699f5d..67d07c8 100644
--- a/runtime/vm/compiler/assembler/assembler_arm64.cc
+++ b/runtime/vm/compiler/assembler/assembler_arm64.cc
@@ -344,12 +344,14 @@
   set_constant_pool_allowed(pp == PP);
 }
 
-void Assembler::LoadWordFromPoolOffset(Register dst,
-                                       uint32_t offset,
-                                       Register pp) {
+void Assembler::LoadWordFromPoolIndex(Register dst,
+                                      intptr_t index,
+                                      Register pp) {
   ASSERT((pp != PP) || constant_pool_allowed());
   ASSERT(dst != pp);
   Operand op;
+  // PP is _un_tagged on ARM64.
+  const uint32_t offset = target::ObjectPool::element_offset(index);
   const uint32_t upper20 = offset & 0xfffff000;
   if (Address::CanHoldOffset(offset)) {
     ldr(dst, Address(pp, offset));
@@ -370,10 +372,12 @@
   }
 }
 
-void Assembler::LoadWordFromPoolOffsetFixed(Register dst, uint32_t offset) {
+void Assembler::LoadWordFromPoolIndexFixed(Register dst, intptr_t index) {
   ASSERT(constant_pool_allowed());
   ASSERT(dst != PP);
   Operand op;
+  // PP is _un_tagged on ARM64.
+  const uint32_t offset = target::ObjectPool::element_offset(index);
   const uint32_t upper20 = offset & 0xfffff000;
   const uint32_t lower12 = offset & 0x00000fff;
   const Operand::OperandType ot =
@@ -384,16 +388,18 @@
   ldr(dst, Address(dst, lower12));
 }
 
-void Assembler::LoadDoubleWordFromPoolOffset(Register lower,
-                                             Register upper,
-                                             uint32_t offset) {
+void Assembler::LoadDoubleWordFromPoolIndex(Register lower,
+                                            Register upper,
+                                            intptr_t index) {
   // This implementation needs to be kept in sync with
   // [InstructionPattern::DecodeLoadDoubleWordFromPool].
   ASSERT(constant_pool_allowed());
   ASSERT(lower != PP && upper != PP);
-  ASSERT(offset < (1 << 24));
 
   Operand op;
+  // PP is _un_tagged on ARM64.
+  const uint32_t offset = target::ObjectPool::element_offset(index);
+  ASSERT(offset < (1 << 24));
   const uint32_t upper20 = offset & 0xfffff000;
   const uint32_t lower12 = offset & 0x00000fff;
   if (Address::CanHoldOffset(offset, Address::PairOffset)) {
@@ -450,9 +456,9 @@
     Register dst,
     const ExternalLabel* label,
     ObjectPoolBuilderEntry::Patchability patchable) {
-  const int32_t offset = target::ObjectPool::element_offset(
-      object_pool_builder().FindNativeFunction(label, patchable));
-  LoadWordFromPoolOffset(dst, offset);
+  const intptr_t index =
+      object_pool_builder().FindNativeFunction(label, patchable);
+  LoadWordFromPoolIndex(dst, index);
 }
 
 void Assembler::LoadIsolate(Register dst) {
@@ -485,10 +491,9 @@
     }
   }
   if (CanLoadFromObjectPool(object)) {
-    const int32_t offset = target::ObjectPool::element_offset(
-        is_unique ? object_pool_builder().AddObject(object)
-                  : object_pool_builder().FindObject(object));
-    LoadWordFromPoolOffset(dst, offset);
+    const intptr_t index = is_unique ? object_pool_builder().AddObject(object)
+                                     : object_pool_builder().FindObject(object);
+    LoadWordFromPoolIndex(dst, index);
     return;
   }
   ASSERT(target::IsSmi(object));
@@ -570,9 +575,8 @@
 
   // Use constant pool if allowed, unless we can load imm with 2 instructions.
   if ((w1 != 0) && constant_pool_allowed()) {
-    const int32_t offset =
-        target::ObjectPool::element_offset(FindImmediate(imm));
-    LoadWordFromPoolOffset(reg, offset);
+    const intptr_t index = FindImmediate(imm);
+    LoadWordFromPoolIndex(reg, index);
     return;
   }
 
@@ -617,9 +621,9 @@
 void Assembler::Branch(const Code& target,
                        Register pp,
                        ObjectPoolBuilderEntry::Patchability patchable) {
-  const int32_t offset = target::ObjectPool::element_offset(
-      object_pool_builder().FindObject(ToObject(target), patchable));
-  LoadWordFromPoolOffset(CODE_REG, offset, pp);
+  const intptr_t index =
+      object_pool_builder().FindObject(ToObject(target), patchable);
+  LoadWordFromPoolIndex(CODE_REG, index, pp);
   ldr(TMP, FieldAddress(CODE_REG, target::Code::entry_point_offset()));
   br(TMP);
 }
@@ -627,9 +631,9 @@
 void Assembler::BranchLink(const Code& target,
                            ObjectPoolBuilderEntry::Patchability patchable,
                            CodeEntryKind entry_kind) {
-  const int32_t offset = target::ObjectPool::element_offset(
-      object_pool_builder().FindObject(ToObject(target), patchable));
-  LoadWordFromPoolOffset(CODE_REG, offset);
+  const intptr_t index =
+      object_pool_builder().FindObject(ToObject(target), patchable);
+  LoadWordFromPoolIndex(CODE_REG, index);
   ldr(TMP,
       FieldAddress(CODE_REG, target::Code::entry_point_offset(entry_kind)));
   blr(TMP);
@@ -643,9 +647,9 @@
 void Assembler::BranchLinkWithEquivalence(const Code& target,
                                           const Object& equivalence,
                                           CodeEntryKind entry_kind) {
-  const int32_t offset = target::ObjectPool::element_offset(
-      object_pool_builder().FindObject(ToObject(target), equivalence));
-  LoadWordFromPoolOffset(CODE_REG, offset);
+  const intptr_t index =
+      object_pool_builder().FindObject(ToObject(target), equivalence);
+  LoadWordFromPoolIndex(CODE_REG, index);
   ldr(TMP,
       FieldAddress(CODE_REG, target::Code::entry_point_offset(entry_kind)));
   blr(TMP);
@@ -987,8 +991,10 @@
   if (can_be_smi == kValueCanBeSmi) {
     BranchIfSmi(value, &done);
   }
-  ldr(TMP, FieldAddress(object, target::Object::tags_offset()), kUnsignedByte);
-  ldr(TMP2, FieldAddress(value, target::Object::tags_offset()), kUnsignedByte);
+  ldr(TMP, FieldAddress(object, target::Object::tags_offset(), kByte),
+      kUnsignedByte);
+  ldr(TMP2, FieldAddress(value, target::Object::tags_offset(), kByte),
+      kUnsignedByte);
   and_(TMP, TMP2,
        Operand(TMP, LSR, target::ObjectLayout::kBarrierOverlapShift));
   tst(TMP, Operand(BARRIER_MASK));
@@ -1049,8 +1055,10 @@
   if (can_be_smi == kValueCanBeSmi) {
     BranchIfSmi(value, &done);
   }
-  ldr(TMP, FieldAddress(object, target::Object::tags_offset()), kUnsignedByte);
-  ldr(TMP2, FieldAddress(value, target::Object::tags_offset()), kUnsignedByte);
+  ldr(TMP, FieldAddress(object, target::Object::tags_offset(), kByte),
+      kUnsignedByte);
+  ldr(TMP2, FieldAddress(value, target::Object::tags_offset(), kByte),
+      kUnsignedByte);
   and_(TMP, TMP2,
        Operand(TMP, LSR, target::ObjectLayout::kBarrierOverlapShift));
   tst(TMP, Operand(BARRIER_MASK));
@@ -1077,7 +1085,8 @@
   Label done;
   StoreIntoObjectFilter(object, value, &done, kValueCanBeSmi, kJumpToNoUpdate);
 
-  ldr(TMP, FieldAddress(object, target::Object::tags_offset()), kUnsignedByte);
+  ldr(TMP, FieldAddress(object, target::Object::tags_offset(), kByte),
+      kUnsignedByte);
   tsti(TMP, Immediate(1 << target::ObjectLayout::kOldAndNotRememberedBit));
   b(&done, ZERO);
 
@@ -1474,7 +1483,7 @@
   }
 
   // Mark that the thread is executing Dart code.
-  LoadImmediate(state, target::Thread::vm_tag_compiled_id());
+  LoadImmediate(state, target::Thread::vm_tag_dart_id());
   StoreToOffset(state, THR, target::Thread::vm_tag_offset());
   LoadImmediate(state, target::Thread::generated_execution_state());
   StoreToOffset(state, THR, target::Thread::execution_state_offset());
diff --git a/runtime/vm/compiler/assembler/assembler_arm64.h b/runtime/vm/compiler/assembler/assembler_arm64.h
index c9bd624..b74553e 100644
--- a/runtime/vm/compiler/assembler/assembler_arm64.h
+++ b/runtime/vm/compiler/assembler/assembler_arm64.h
@@ -94,12 +94,14 @@
       : ValueObject(),
         encoding_(other.encoding_),
         type_(other.type_),
-        base_(other.base_) {}
+        base_(other.base_),
+        log2sz_(other.log2sz_) {}
 
   Address& operator=(const Address& other) {
     encoding_ = other.encoding_;
     type_ = other.type_;
     base_ = other.base_;
+    log2sz_ = other.log2sz_;
     return *this;
   }
 
@@ -136,11 +138,15 @@
           OperandSize sz = kDoubleWord) {
     ASSERT((rn != kNoRegister) && (rn != R31) && (rn != ZR));
     ASSERT(CanHoldOffset(offset, at, sz));
+    log2sz_ = -1;
     const int32_t scale = Log2OperandSizeBytes(sz);
     if ((at == Offset) && Utils::IsUint(12 + scale, offset) &&
         (offset == ((offset >> scale) << scale))) {
       encoding_ =
           B24 | ((offset >> scale) << kImm12Shift) | Arm64Encode::Rn(rn);
+      if (offset != 0) {
+        log2sz_ = scale;
+      }
     } else if ((at == Offset) && Utils::IsInt(9, offset)) {
       encoding_ = ((offset & 0x1ff) << kImm9Shift) | Arm64Encode::Rn(rn);
     } else if ((at == PreIndex) || (at == PostIndex)) {
@@ -172,6 +178,9 @@
           idx |
           ((static_cast<uint32_t>(offset >> scale) << kImm7Shift) & kImm7Mask) |
           Arm64Encode::Rn(rn);
+      if (offset != 0) {
+        log2sz_ = scale;
+      }
     }
     type_ = at;
     base_ = ConcreteRegister(rn);
@@ -214,6 +223,7 @@
     addr.encoding_ = (((pc_off >> 2) << kImm19Shift) & kImm19Mask);
     addr.base_ = kNoRegister;
     addr.type_ = PCOffset;
+    addr.log2sz_ = -1;
     return addr;
   }
 
@@ -249,12 +259,14 @@
                 (static_cast<int32_t>(ext) << kExtendTypeShift);
     type_ = Reg;
     base_ = ConcreteRegister(rn);
+    log2sz_ = -1;  // Any.
   }
 
   static OperandSize OperandSizeFor(intptr_t cid) {
     switch (cid) {
       case kArrayCid:
       case kImmutableArrayCid:
+      case kTypeArgumentsCid:
         return kWord;
       case kOneByteStringCid:
       case kExternalOneByteStringCid:
@@ -307,6 +319,7 @@
   uint32_t encoding_;
   AddressType type_;
   Register base_;
+  int32_t log2sz_;  // Required log2 of operand size (-1 means any).
 
   friend class Assembler;
 };
@@ -517,7 +530,8 @@
   }
 
   void CompareTypeNullabilityWith(Register type, int8_t value) {
-    ldr(TMP, FieldAddress(type, compiler::target::Type::nullability_offset()),
+    ldr(TMP,
+        FieldAddress(type, compiler::target::Type::nullability_offset(), kByte),
         kUnsignedByte);
     cmp(TMP, Operand(value));
   }
@@ -1584,11 +1598,11 @@
   // InstructionPattern::DecodeLoadWordFromPool can decode.
   //
   // Note: the function never clobbers TMP, TMP2 scratch registers.
-  void LoadWordFromPoolOffset(Register dst, uint32_t offset, Register pp = PP);
+  void LoadWordFromPoolIndex(Register dst, intptr_t index, Register pp = PP);
 
-  void LoadDoubleWordFromPoolOffset(Register lower,
-                                    Register upper,
-                                    uint32_t offset);
+  void LoadDoubleWordFromPoolIndex(Register lower,
+                                   Register upper,
+                                   intptr_t index);
 
   void PushObject(const Object& object) {
     if (IsSameObject(compiler::NullObject(), object)) {
@@ -1826,7 +1840,7 @@
 
   bool constant_pool_allowed_;
 
-  void LoadWordFromPoolOffsetFixed(Register dst, uint32_t offset);
+  void LoadWordFromPoolIndexFixed(Register dst, intptr_t index);
 
   // Note: the function never clobbers TMP, TMP2 scratch registers.
   void LoadObjectHelper(Register dst, const Object& obj, bool is_unique);
@@ -2244,6 +2258,7 @@
     ASSERT((op != LDR && op != STR && op != LDRS) || a.can_writeback_to(rt));
 
     const int32_t size = Log2OperandSizeBytes(sz);
+    ASSERT(a.log2sz_ == -1 || a.log2sz_ == size);
     const int32_t encoding =
         op | ((size & 0x3) << kSzShift) | Arm64Encode::Rt(rt) | a.encoding();
     Emit(encoding);
@@ -2254,6 +2269,7 @@
                           Address a,
                           OperandSize sz) {
     ASSERT((sz == kDoubleWord) || (sz == kWord) || (sz == kUnsignedWord));
+    ASSERT(a.log2sz_ == -1 || a.log2sz_ == Log2OperandSizeBytes(sz));
     ASSERT((rt != CSP) && (rt != R31));
     const int32_t size = (sz == kDoubleWord) ? B30 : 0;
     const int32_t encoding = op | size | Arm64Encode::Rt(rt) | a.encoding();
@@ -2270,6 +2286,7 @@
     ASSERT(op != LDP || rt != rt2);
 
     ASSERT((sz == kDoubleWord) || (sz == kWord) || (sz == kUnsignedWord));
+    ASSERT(a.log2sz_ == -1 || a.log2sz_ == Log2OperandSizeBytes(sz));
     ASSERT((rt != CSP) && (rt != R31));
     ASSERT((rt2 != CSP) && (rt2 != R31));
     int32_t opc = 0;
diff --git a/runtime/vm/compiler/assembler/assembler_ia32.cc b/runtime/vm/compiler/assembler/assembler_ia32.cc
index 07af2ef..06f27c2 100644
--- a/runtime/vm/compiler/assembler/assembler_ia32.cc
+++ b/runtime/vm/compiler/assembler/assembler_ia32.cc
@@ -2288,8 +2288,7 @@
   }
 
   // Mark that the thread is executing Dart code.
-  movl(Assembler::VMTagAddress(),
-       Immediate(target::Thread::vm_tag_compiled_id()));
+  movl(Assembler::VMTagAddress(), Immediate(target::Thread::vm_tag_dart_id()));
   movl(Address(THR, target::Thread::execution_state_offset()),
        Immediate(target::Thread::generated_execution_state()));
 
diff --git a/runtime/vm/compiler/assembler/assembler_ia32.h b/runtime/vm/compiler/assembler/assembler_ia32.h
index dd2fa97..25bdf4b 100644
--- a/runtime/vm/compiler/assembler/assembler_ia32.h
+++ b/runtime/vm/compiler/assembler/assembler_ia32.h
@@ -610,6 +610,9 @@
   }
 
   void AddImmediate(Register reg, const Immediate& imm);
+  void AddImmediate(Register reg, int32_t value) {
+    AddImmediate(reg, Immediate(value));
+  }
   void SubImmediate(Register reg, const Immediate& imm);
 
   void CompareImmediate(Register reg, int32_t immediate) {
diff --git a/runtime/vm/compiler/assembler/assembler_x64.cc b/runtime/vm/compiler/assembler/assembler_x64.cc
index b84015a..4310ef2 100644
--- a/runtime/vm/compiler/assembler/assembler_x64.cc
+++ b/runtime/vm/compiler/assembler/assembler_x64.cc
@@ -48,9 +48,9 @@
     Register dst,
     const ExternalLabel* label,
     ObjectPoolBuilderEntry::Patchability patchable) {
-  const int32_t offset = target::ObjectPool::element_offset(
-      object_pool_builder().FindNativeFunction(label, patchable));
-  LoadWordFromPoolOffset(dst, offset - kHeapObjectTag);
+  const intptr_t index =
+      object_pool_builder().FindNativeFunction(label, patchable);
+  LoadWordFromPoolIndex(dst, index);
 }
 
 void Assembler::call(const ExternalLabel* label) {
@@ -67,8 +67,7 @@
   ASSERT(constant_pool_allowed());
   const intptr_t idx = object_pool_builder().AddObject(
       ToObject(target), ObjectPoolBuilderEntry::kPatchable);
-  const int32_t offset = target::ObjectPool::element_offset(idx);
-  LoadWordFromPoolOffset(CODE_REG, offset - kHeapObjectTag);
+  LoadWordFromPoolIndex(CODE_REG, idx);
   call(FieldAddress(CODE_REG, target::Code::entry_point_offset(entry_kind)));
 }
 
@@ -78,8 +77,7 @@
   ASSERT(constant_pool_allowed());
   const intptr_t idx =
       object_pool_builder().FindObject(ToObject(target), equivalence);
-  const int32_t offset = target::ObjectPool::element_offset(idx);
-  LoadWordFromPoolOffset(CODE_REG, offset - kHeapObjectTag);
+  LoadWordFromPoolIndex(CODE_REG, idx);
   call(FieldAddress(CODE_REG, target::Code::entry_point_offset(entry_kind)));
 }
 
@@ -87,8 +85,7 @@
   ASSERT(constant_pool_allowed());
   const intptr_t idx = object_pool_builder().FindObject(
       ToObject(target), ObjectPoolBuilderEntry::kNotPatchable);
-  const int32_t offset = target::ObjectPool::element_offset(idx);
-  LoadWordFromPoolOffset(CODE_REG, offset - kHeapObjectTag);
+  LoadWordFromPoolIndex(CODE_REG, idx);
   call(FieldAddress(CODE_REG, target::Code::entry_point_offset()));
 }
 
@@ -248,8 +245,7 @@
 #endif
   }
 
-  movq(Assembler::VMTagAddress(),
-       Immediate(target::Thread::vm_tag_compiled_id()));
+  movq(Assembler::VMTagAddress(), Immediate(target::Thread::vm_tag_dart_id()));
   movq(Address(THR, target::Thread::execution_state_offset()),
        Immediate(target::Thread::generated_execution_state()));
 
@@ -1210,9 +1206,12 @@
   return true;
 }
 
-void Assembler::LoadWordFromPoolOffset(Register dst, int32_t offset) {
+void Assembler::LoadWordFromPoolIndex(Register dst, intptr_t idx) {
   ASSERT(constant_pool_allowed());
   ASSERT(dst != PP);
+  // PP is tagged on X64.
+  const int32_t offset =
+      target::ObjectPool::element_offset(idx) - kHeapObjectTag;
   // This sequence must be decodable by code_patcher_x64.cc.
   movq(dst, Address(PP, offset));
 }
@@ -1239,10 +1238,9 @@
     }
   }
   if (CanLoadFromObjectPool(object)) {
-    const int32_t offset = target::ObjectPool::element_offset(
-        is_unique ? object_pool_builder().AddObject(object)
-                  : object_pool_builder().FindObject(object));
-    LoadWordFromPoolOffset(dst, offset - kHeapObjectTag);
+    const intptr_t index = is_unique ? object_pool_builder().AddObject(object)
+                                     : object_pool_builder().FindObject(object);
+    LoadWordFromPoolIndex(dst, index);
     return;
   }
   ASSERT(target::IsSmi(object));
@@ -1315,9 +1313,8 @@
   } else if (imm.is_int32() || !constant_pool_allowed()) {
     movq(reg, imm);
   } else {
-    int32_t offset =
-        target::ObjectPool::element_offset(FindImmediate(imm.value()));
-    LoadWordFromPoolOffset(reg, offset - kHeapObjectTag);
+    const intptr_t idx = FindImmediate(imm.value());
+    LoadWordFromPoolIndex(reg, idx);
   }
 }
 
@@ -1674,19 +1671,27 @@
   LeaveStubFrame();
 }
 
-void Assembler::CallCFunction(Register reg) {
+void Assembler::CallCFunction(Register reg, bool restore_rsp) {
   // Reserve shadow space for outgoing arguments.
   if (CallingConventions::kShadowSpaceBytes != 0) {
     subq(RSP, Immediate(CallingConventions::kShadowSpaceBytes));
   }
   call(reg);
+  // Restore stack.
+  if (restore_rsp && CallingConventions::kShadowSpaceBytes != 0) {
+    addq(RSP, Immediate(CallingConventions::kShadowSpaceBytes));
+  }
 }
-void Assembler::CallCFunction(Address address) {
+void Assembler::CallCFunction(Address address, bool restore_rsp) {
   // Reserve shadow space for outgoing arguments.
   if (CallingConventions::kShadowSpaceBytes != 0) {
     subq(RSP, Immediate(CallingConventions::kShadowSpaceBytes));
   }
   call(address);
+  // Restore stack.
+  if (restore_rsp && CallingConventions::kShadowSpaceBytes != 0) {
+    addq(RSP, Immediate(CallingConventions::kShadowSpaceBytes));
+  }
 }
 
 void Assembler::CallRuntime(const RuntimeEntry& entry,
diff --git a/runtime/vm/compiler/assembler/assembler_x64.h b/runtime/vm/compiler/assembler/assembler_x64.h
index de96771..f6576ff 100644
--- a/runtime/vm/compiler/assembler/assembler_x64.h
+++ b/runtime/vm/compiler/assembler/assembler_x64.h
@@ -705,6 +705,9 @@
   void AddImmediate(Register reg,
                     const Immediate& imm,
                     OperandWidth width = k64Bit);
+  void AddImmediate(Register reg, int32_t value, OperandWidth width = k64Bit) {
+    AddImmediate(reg, Immediate(value), width);
+  }
   void AddImmediate(const Address& address, const Immediate& imm);
   void SubImmediate(Register reg,
                     const Immediate& imm,
@@ -826,9 +829,9 @@
   void CallRuntime(const RuntimeEntry& entry, intptr_t argument_count);
 
   // Call runtime function. Reserves shadow space on the stack before calling
-  // if platform ABI requires that. Does not restore RSP after the call itself.
-  void CallCFunction(Register reg);
-  void CallCFunction(Address address);
+  // if platform ABI requires that.
+  void CallCFunction(Register reg, bool restore_rsp = false);
+  void CallCFunction(Address address, bool restore_rsp = false);
 
   void ExtractClassIdFromTags(Register result, Register tags);
   void ExtractInstanceSizeFromTags(Register result, Register tags);
@@ -1030,7 +1033,7 @@
   intptr_t FindImmediate(int64_t imm);
   bool CanLoadFromObjectPool(const Object& object) const;
   void LoadObjectHelper(Register dst, const Object& obj, bool is_unique);
-  void LoadWordFromPoolOffset(Register dst, int32_t offset);
+  void LoadWordFromPoolIndex(Register dst, intptr_t index);
 
   void AluL(uint8_t modrm_opcode, Register dst, const Immediate& imm);
   void AluB(uint8_t modrm_opcode, const Address& dst, const Immediate& imm);
diff --git a/runtime/vm/compiler/assembler/disassembler_kbc.cc b/runtime/vm/compiler/assembler/disassembler_kbc.cc
deleted file mode 100644
index 2f0d0d0..0000000
--- a/runtime/vm/compiler/assembler/disassembler_kbc.cc
+++ /dev/null
@@ -1,456 +0,0 @@
-// Copyright (c) 2018, 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.
-
-#include "vm/globals.h"
-#if !defined(DART_PRECOMPILED_RUNTIME)
-
-#include "vm/compiler/assembler/disassembler_kbc.h"
-
-#include "platform/assert.h"
-#include "vm/compiler/frontend/bytecode_reader.h"
-#include "vm/constants_kbc.h"
-#include "vm/cpu.h"
-#include "vm/instructions.h"
-
-namespace dart {
-
-static const char* kOpcodeNames[] = {
-#define BYTECODE_NAME(name, encoding, kind, op1, op2, op3) #name,
-    KERNEL_BYTECODES_LIST(BYTECODE_NAME)
-#undef BYTECODE_NAME
-};
-
-static const size_t kOpcodeCount =
-    sizeof(kOpcodeNames) / sizeof(kOpcodeNames[0]);
-static_assert(kOpcodeCount <= 256, "Opcode should fit into a byte");
-
-typedef void (*BytecodeFormatter)(char* buffer,
-                                  intptr_t size,
-                                  KernelBytecode::Opcode opcode,
-                                  const KBCInstr* instr);
-typedef void (*Fmt)(char** buf,
-                    intptr_t* size,
-                    const KBCInstr* instr,
-                    int32_t value);
-
-template <typename ValueType>
-void FormatOperand(char** buf,
-                   intptr_t* size,
-                   const char* fmt,
-                   ValueType value) {
-  intptr_t written = Utils::SNPrint(*buf, *size, fmt, value);
-  if (written < *size) {
-    *buf += written;
-    *size += written;
-  } else {
-    *size = -1;
-  }
-}
-
-static void Fmt___(char** buf,
-                   intptr_t* size,
-                   const KBCInstr* instr,
-                   int32_t value) {}
-
-static void Fmttgt(char** buf,
-                   intptr_t* size,
-                   const KBCInstr* instr,
-                   int32_t value) {
-  if (FLAG_disassemble_relative) {
-    FormatOperand(buf, size, "-> %" Pd, value);
-  } else {
-    FormatOperand(buf, size, "-> %" Px, instr + value);
-  }
-}
-
-static void Fmtlit(char** buf,
-                   intptr_t* size,
-                   const KBCInstr* instr,
-                   int32_t value) {
-  FormatOperand(buf, size, "k%d", value);
-}
-
-static void Fmtreg(char** buf,
-                   intptr_t* size,
-                   const KBCInstr* instr,
-                   int32_t value) {
-  FormatOperand(buf, size, "r%d", value);
-}
-
-static void Fmtxeg(char** buf,
-                   intptr_t* size,
-                   const KBCInstr* instr,
-                   int32_t value) {
-  if (value < 0) {
-    FormatOperand(buf, size, "FP[%d]", value);
-  } else {
-    Fmtreg(buf, size, instr, value);
-  }
-}
-
-static void Fmtnum(char** buf,
-                   intptr_t* size,
-                   const KBCInstr* instr,
-                   int32_t value) {
-  FormatOperand(buf, size, "#%d", value);
-}
-
-static void Apply(char** buf,
-                  intptr_t* size,
-                  const KBCInstr* instr,
-                  Fmt fmt,
-                  int32_t value,
-                  const char* suffix) {
-  if (*size <= 0) {
-    return;
-  }
-
-  fmt(buf, size, instr, value);
-  if (*size > 0) {
-    FormatOperand(buf, size, "%s", suffix);
-  }
-}
-
-static void Format0(char* buf,
-                    intptr_t size,
-                    KernelBytecode::Opcode opcode,
-                    const KBCInstr* instr,
-                    Fmt op1,
-                    Fmt op2,
-                    Fmt op3) {}
-
-static void FormatA(char* buf,
-                    intptr_t size,
-                    KernelBytecode::Opcode opcode,
-                    const KBCInstr* instr,
-                    Fmt op1,
-                    Fmt op2,
-                    Fmt op3) {
-  const int32_t a = KernelBytecode::DecodeA(instr);
-  Apply(&buf, &size, instr, op1, a, "");
-}
-
-static void FormatD(char* buf,
-                    intptr_t size,
-                    KernelBytecode::Opcode opcode,
-                    const KBCInstr* instr,
-                    Fmt op1,
-                    Fmt op2,
-                    Fmt op3) {
-  const int32_t bc = KernelBytecode::DecodeD(instr);
-  Apply(&buf, &size, instr, op1, bc, "");
-}
-
-static void FormatX(char* buf,
-                    intptr_t size,
-                    KernelBytecode::Opcode opcode,
-                    const KBCInstr* instr,
-                    Fmt op1,
-                    Fmt op2,
-                    Fmt op3) {
-  const int32_t bc = KernelBytecode::DecodeX(instr);
-  Apply(&buf, &size, instr, op1, bc, "");
-}
-
-static void FormatT(char* buf,
-                    intptr_t size,
-                    KernelBytecode::Opcode opcode,
-                    const KBCInstr* instr,
-                    Fmt op1,
-                    Fmt op2,
-                    Fmt op3) {
-  const int32_t x = KernelBytecode::DecodeT(instr);
-  Apply(&buf, &size, instr, op1, x, "");
-}
-
-static void FormatA_E(char* buf,
-                      intptr_t size,
-                      KernelBytecode::Opcode opcode,
-                      const KBCInstr* instr,
-                      Fmt op1,
-                      Fmt op2,
-                      Fmt op3) {
-  const int32_t a = KernelBytecode::DecodeA(instr);
-  const int32_t e = KernelBytecode::DecodeE(instr);
-  Apply(&buf, &size, instr, op1, a, ", ");
-  Apply(&buf, &size, instr, op2, e, "");
-}
-
-static void FormatA_Y(char* buf,
-                      intptr_t size,
-                      KernelBytecode::Opcode opcode,
-                      const KBCInstr* instr,
-                      Fmt op1,
-                      Fmt op2,
-                      Fmt op3) {
-  const int32_t a = KernelBytecode::DecodeA(instr);
-  const int32_t y = KernelBytecode::DecodeY(instr);
-  Apply(&buf, &size, instr, op1, a, ", ");
-  Apply(&buf, &size, instr, op2, y, "");
-}
-
-static void FormatD_F(char* buf,
-                      intptr_t size,
-                      KernelBytecode::Opcode opcode,
-                      const KBCInstr* instr,
-                      Fmt op1,
-                      Fmt op2,
-                      Fmt op3) {
-  const int32_t d = KernelBytecode::DecodeD(instr);
-  const int32_t f = KernelBytecode::DecodeF(instr);
-  Apply(&buf, &size, instr, op1, d, ", ");
-  Apply(&buf, &size, instr, op2, f, "");
-}
-
-static void FormatA_B_C(char* buf,
-                        intptr_t size,
-                        KernelBytecode::Opcode opcode,
-                        const KBCInstr* instr,
-                        Fmt op1,
-                        Fmt op2,
-                        Fmt op3) {
-  const int32_t a = KernelBytecode::DecodeA(instr);
-  const int32_t b = KernelBytecode::DecodeB(instr);
-  const int32_t c = KernelBytecode::DecodeC(instr);
-  Apply(&buf, &size, instr, op1, a, ", ");
-  Apply(&buf, &size, instr, op2, b, ", ");
-  Apply(&buf, &size, instr, op3, c, "");
-}
-
-#define BYTECODE_FORMATTER(name, encoding, kind, op1, op2, op3)                \
-  static void Format##name(char* buf, intptr_t size,                           \
-                           KernelBytecode::Opcode opcode,                      \
-                           const KBCInstr* instr) {                            \
-    Format##encoding(buf, size, opcode, instr, Fmt##op1, Fmt##op2, Fmt##op3);  \
-  }
-KERNEL_BYTECODES_LIST(BYTECODE_FORMATTER)
-#undef BYTECODE_FORMATTER
-
-static const BytecodeFormatter kFormatters[] = {
-#define BYTECODE_FORMATTER(name, encoding, kind, op1, op2, op3) &Format##name,
-    KERNEL_BYTECODES_LIST(BYTECODE_FORMATTER)
-#undef BYTECODE_FORMATTER
-};
-
-static intptr_t GetConstantPoolIndex(const KBCInstr* instr) {
-  switch (KernelBytecode::DecodeOpcode(instr)) {
-    case KernelBytecode::kLoadConstant:
-    case KernelBytecode::kLoadConstant_Wide:
-    case KernelBytecode::kInstantiateTypeArgumentsTOS:
-    case KernelBytecode::kInstantiateTypeArgumentsTOS_Wide:
-    case KernelBytecode::kAssertAssignable:
-    case KernelBytecode::kAssertAssignable_Wide:
-      return KernelBytecode::DecodeE(instr);
-
-    case KernelBytecode::kPushConstant:
-    case KernelBytecode::kPushConstant_Wide:
-    case KernelBytecode::kInitLateField:
-    case KernelBytecode::kInitLateField_Wide:
-    case KernelBytecode::kStoreStaticTOS:
-    case KernelBytecode::kStoreStaticTOS_Wide:
-    case KernelBytecode::kLoadStatic:
-    case KernelBytecode::kLoadStatic_Wide:
-    case KernelBytecode::kAllocate:
-    case KernelBytecode::kAllocate_Wide:
-    case KernelBytecode::kAllocateClosure:
-    case KernelBytecode::kAllocateClosure_Wide:
-    case KernelBytecode::kInstantiateType:
-    case KernelBytecode::kInstantiateType_Wide:
-    case KernelBytecode::kDirectCall:
-    case KernelBytecode::kDirectCall_Wide:
-    case KernelBytecode::kUncheckedDirectCall:
-    case KernelBytecode::kUncheckedDirectCall_Wide:
-    case KernelBytecode::kInterfaceCall:
-    case KernelBytecode::kInterfaceCall_Wide:
-    case KernelBytecode::kInstantiatedInterfaceCall:
-    case KernelBytecode::kInstantiatedInterfaceCall_Wide:
-    case KernelBytecode::kUncheckedClosureCall:
-    case KernelBytecode::kUncheckedClosureCall_Wide:
-    case KernelBytecode::kUncheckedInterfaceCall:
-    case KernelBytecode::kUncheckedInterfaceCall_Wide:
-    case KernelBytecode::kDynamicCall:
-    case KernelBytecode::kDynamicCall_Wide:
-      return KernelBytecode::DecodeD(instr);
-
-    default:
-      return -1;
-  }
-}
-
-static bool GetLoadedObjectAt(uword pc,
-                              const ObjectPool& object_pool,
-                              Object* obj) {
-  const KBCInstr* instr = reinterpret_cast<const KBCInstr*>(pc);
-  const intptr_t index = GetConstantPoolIndex(instr);
-  if (index >= 0) {
-    if (object_pool.TypeAt(index) == ObjectPool::EntryType::kTaggedObject) {
-      *obj = object_pool.ObjectAt(index);
-      return true;
-    }
-  }
-  return false;
-}
-
-void KernelBytecodeDisassembler::DecodeInstruction(char* hex_buffer,
-                                                   intptr_t hex_size,
-                                                   char* human_buffer,
-                                                   intptr_t human_size,
-                                                   int* out_instr_size,
-                                                   const Bytecode& bytecode,
-                                                   Object** object,
-                                                   uword pc) {
-  const KBCInstr* instr = reinterpret_cast<const KBCInstr*>(pc);
-  const KernelBytecode::Opcode opcode = KernelBytecode::DecodeOpcode(instr);
-  const intptr_t instr_size = KernelBytecode::kInstructionSize[opcode];
-
-  size_t name_size =
-      Utils::SNPrint(human_buffer, human_size, "%-10s\t", kOpcodeNames[opcode]);
-  human_buffer += name_size;
-  human_size -= name_size;
-  kFormatters[opcode](human_buffer, human_size, opcode, instr);
-
-  const intptr_t kCharactersPerByte = 3;
-  if (hex_size > instr_size * kCharactersPerByte) {
-    for (intptr_t i = 0; i < instr_size; ++i) {
-      Utils::SNPrint(hex_buffer + (i * kCharactersPerByte),
-                     hex_size - (i * kCharactersPerByte), " %02x", instr[i]);
-    }
-  }
-  if (out_instr_size != nullptr) {
-    *out_instr_size = instr_size;
-  }
-
-  *object = NULL;
-  if (!bytecode.IsNull()) {
-    *object = &Object::Handle();
-    const ObjectPool& pool = ObjectPool::Handle(bytecode.object_pool());
-    if (!GetLoadedObjectAt(pc, pool, *object)) {
-      *object = NULL;
-    }
-  }
-}
-
-void KernelBytecodeDisassembler::Disassemble(uword start,
-                                             uword end,
-                                             DisassemblyFormatter* formatter,
-                                             const Bytecode& bytecode) {
-#if !defined(PRODUCT)
-  ASSERT(formatter != NULL);
-  char hex_buffer[kHexadecimalBufferSize];  // Instruction in hexadecimal form.
-  char human_buffer[kUserReadableBufferSize];  // Human-readable instruction.
-  uword pc = start;
-  GrowableArray<const Function*> inlined_functions;
-  GrowableArray<TokenPosition> token_positions;
-  while (pc < end) {
-    int instruction_length;
-    Object* object;
-    DecodeInstruction(hex_buffer, sizeof(hex_buffer), human_buffer,
-                      sizeof(human_buffer), &instruction_length, bytecode,
-                      &object, pc);
-    formatter->ConsumeInstruction(hex_buffer, sizeof(hex_buffer), human_buffer,
-                                  sizeof(human_buffer), object,
-                                  FLAG_disassemble_relative ? pc - start : pc);
-    pc += instruction_length;
-  }
-#else
-  UNREACHABLE();
-#endif
-}
-
-void KernelBytecodeDisassembler::Disassemble(const Function& function) {
-#if !defined(PRODUCT)
-  ASSERT(function.HasBytecode());
-  const char* function_fullname = function.ToFullyQualifiedCString();
-  Zone* zone = Thread::Current()->zone();
-  const Bytecode& bytecode = Bytecode::Handle(zone, function.bytecode());
-  THR_Print("Bytecode for function '%s' {\n", function_fullname);
-  const uword start = bytecode.PayloadStart();
-  const uword base = FLAG_disassemble_relative ? 0 : start;
-  DisassembleToStdout stdout_formatter;
-  LogBlock lb;
-  Disassemble(start, start + bytecode.Size(), &stdout_formatter, bytecode);
-  THR_Print("}\n");
-
-  const ObjectPool& object_pool =
-      ObjectPool::Handle(zone, bytecode.object_pool());
-  object_pool.DebugPrint();
-
-  THR_Print("PC Descriptors for function '%s' {\n", function_fullname);
-  PcDescriptors::PrintHeaderString();
-  const PcDescriptors& descriptors =
-      PcDescriptors::Handle(zone, bytecode.pc_descriptors());
-  THR_Print("%s}\n", descriptors.ToCString());
-
-  if (bytecode.HasSourcePositions()) {
-    THR_Print("Source positions for function '%s' {\n", function_fullname);
-    // 4 bits per hex digit + 2 for "0x".
-    const int addr_width = (kBitsPerWord / 4) + 2;
-    // "*" in a printf format specifier tells it to read the field width from
-    // the printf argument list.
-    THR_Print("%-*s\tpos\tline\tcolumn\tyield\n", addr_width, "pc");
-    const Script& script = Script::Handle(zone, function.script());
-    kernel::BytecodeSourcePositionsIterator iter(zone, bytecode);
-    while (iter.MoveNext()) {
-      TokenPosition pos = iter.TokenPos();
-      intptr_t line = -1, column = -1;
-      script.GetTokenLocation(pos, &line, &column);
-      THR_Print("%#-*" Px "\t%s\t%" Pd "\t%" Pd "\t%s\n", addr_width,
-                base + iter.PcOffset(), pos.ToCString(), line, column,
-                iter.IsYieldPoint() ? "yield" : "");
-    }
-    THR_Print("}\n");
-  }
-
-  if (FLAG_print_variable_descriptors && bytecode.HasLocalVariablesInfo()) {
-    THR_Print("Local variables info for function '%s' {\n", function_fullname);
-    kernel::BytecodeLocalVariablesIterator iter(zone, bytecode);
-    while (iter.MoveNext()) {
-      switch (iter.Kind()) {
-        case kernel::BytecodeLocalVariablesIterator::kScope: {
-          THR_Print("scope 0x%" Px "-0x%" Px " pos %s-%s\tlev %" Pd "\n",
-                    base + iter.StartPC(), base + iter.EndPC(),
-                    iter.StartTokenPos().ToCString(),
-                    iter.EndTokenPos().ToCString(), iter.ContextLevel());
-        } break;
-        case kernel::BytecodeLocalVariablesIterator::kVariableDeclaration: {
-          THR_Print("var   0x%" Px "-0x%" Px " pos %s-%s\tidx %" Pd
-                    "\tdecl %s\t%s %s %s\n",
-                    base + iter.StartPC(), base + iter.EndPC(),
-                    iter.StartTokenPos().ToCString(),
-                    iter.EndTokenPos().ToCString(), iter.Index(),
-                    iter.DeclarationTokenPos().ToCString(),
-                    String::Handle(
-                        zone, AbstractType::Handle(zone, iter.Type()).Name())
-                        .ToCString(),
-                    String::Handle(zone, iter.Name()).ToCString(),
-                    iter.IsCaptured() ? "captured" : "");
-        } break;
-        case kernel::BytecodeLocalVariablesIterator::kContextVariable: {
-          THR_Print("ctxt  0x%" Px "\tidx %" Pd "\n", base + iter.StartPC(),
-                    iter.Index());
-        } break;
-      }
-    }
-    THR_Print("}\n");
-
-    THR_Print("Local variable descriptors for function '%s' {\n",
-              function_fullname);
-    const auto& var_descriptors =
-        LocalVarDescriptors::Handle(zone, bytecode.GetLocalVarDescriptors());
-    THR_Print("%s}\n", var_descriptors.ToCString());
-  }
-
-  THR_Print("Exception Handlers for function '%s' {\n", function_fullname);
-  const ExceptionHandlers& handlers =
-      ExceptionHandlers::Handle(zone, bytecode.exception_handlers());
-  THR_Print("%s}\n", handlers.ToCString());
-
-#else
-  UNREACHABLE();
-#endif
-}
-
-}  // namespace dart
-
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
diff --git a/runtime/vm/compiler/assembler/disassembler_kbc.h b/runtime/vm/compiler/assembler/disassembler_kbc.h
deleted file mode 100644
index 89bbc18..0000000
--- a/runtime/vm/compiler/assembler/disassembler_kbc.h
+++ /dev/null
@@ -1,89 +0,0 @@
-// Copyright (c) 2018, 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.
-
-#ifndef RUNTIME_VM_COMPILER_ASSEMBLER_DISASSEMBLER_KBC_H_
-#define RUNTIME_VM_COMPILER_ASSEMBLER_DISASSEMBLER_KBC_H_
-
-#include "vm/globals.h"
-#if !defined(DART_PRECOMPILED_RUNTIME)
-
-#include "vm/compiler/assembler/disassembler.h"
-
-namespace dart {
-
-// Disassemble instructions.
-class KernelBytecodeDisassembler : public AllStatic {
- public:
-  // Disassemble instructions between start and end.
-  // (The assumption is that start is at a valid instruction).
-  // Return true if all instructions were successfully decoded, false otherwise.
-  static void Disassemble(uword start,
-                          uword end,
-                          DisassemblyFormatter* formatter,
-                          const Bytecode& bytecode);
-
-  static void Disassemble(uword start,
-                          uword end,
-                          DisassemblyFormatter* formatter) {
-    Disassemble(start, end, formatter, Bytecode::Handle());
-  }
-
-  static void Disassemble(uword start, uword end, const Bytecode& bytecode) {
-#if !defined(PRODUCT)
-    DisassembleToStdout stdout_formatter;
-    LogBlock lb;
-    Disassemble(start, end, &stdout_formatter, bytecode);
-#else
-    UNREACHABLE();
-#endif
-  }
-
-  static void Disassemble(uword start, uword end) {
-#if !defined(PRODUCT)
-    DisassembleToStdout stdout_formatter;
-    LogBlock lb;
-    Disassemble(start, end, &stdout_formatter);
-#else
-    UNREACHABLE();
-#endif
-  }
-
-  static void Disassemble(uword start,
-                          uword end,
-                          char* buffer,
-                          uintptr_t buffer_size) {
-#if !defined(PRODUCT)
-    DisassembleToMemory memory_formatter(buffer, buffer_size);
-    LogBlock lb;
-    Disassemble(start, end, &memory_formatter);
-#else
-    UNREACHABLE();
-#endif
-  }
-
-  // Decodes one instruction.
-  // Writes a hexadecimal representation into the hex_buffer and a
-  // human-readable representation into the human_buffer.
-  // Writes the length of the decoded instruction in bytes in out_instr_len.
-  static void DecodeInstruction(char* hex_buffer,
-                                intptr_t hex_size,
-                                char* human_buffer,
-                                intptr_t human_size,
-                                int* out_instr_len,
-                                const Bytecode& bytecode,
-                                Object** object,
-                                uword pc);
-
-  static void Disassemble(const Function& function);
-
- private:
-  static const int kHexadecimalBufferSize = 32;
-  static const int kUserReadableBufferSize = 256;
-};
-
-}  // namespace dart
-
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-
-#endif  // RUNTIME_VM_COMPILER_ASSEMBLER_DISASSEMBLER_KBC_H_
diff --git a/runtime/vm/compiler/assembler/object_pool_builder.h b/runtime/vm/compiler/assembler/object_pool_builder.h
index de9749d..2bc2add 100644
--- a/runtime/vm/compiler/assembler/object_pool_builder.h
+++ b/runtime/vm/compiler/assembler/object_pool_builder.h
@@ -30,7 +30,6 @@
     kImmediate,
     kNativeFunction,
     kNativeFunctionWrapper,
-    kNativeEntryData,
   };
 
   using TypeBits = BitField<uint8_t, EntryType, 0, 7>;
diff --git a/runtime/vm/compiler/backend/constant_propagator.cc b/runtime/vm/compiler/backend/constant_propagator.cc
index fc4cfbf..4cc16cf 100644
--- a/runtime/vm/compiler/backend/constant_propagator.cc
+++ b/runtime/vm/compiler/backend/constant_propagator.cc
@@ -1056,10 +1056,13 @@
     InstantiateTypeArgumentsInstr* instr) {
   const auto& type_arguments_obj =
       instr->type_arguments()->definition()->constant_value();
-  ASSERT(!type_arguments_obj.IsNull());
   if (IsUnknown(type_arguments_obj)) {
     return;
   }
+  if (type_arguments_obj.IsNull()) {
+    SetValue(instr, type_arguments_obj);
+    return;
+  }
   if (!type_arguments_obj.IsTypeArguments()) {
     SetValue(instr, non_constant_);
     return;
@@ -1078,14 +1081,13 @@
     if (IsUnknown(instantiator_type_args_obj)) {
       return;
     }
-    if (!instantiator_type_args_obj.IsTypeArguments()) {
+    if (!instantiator_type_args_obj.IsNull() &&
+        !instantiator_type_args_obj.IsTypeArguments()) {
       SetValue(instr, non_constant_);
       return;
     }
     instantiator_type_args ^= instantiator_type_args_obj.raw();
-    ASSERT(!instr->instantiator_class().IsNull());
-    if (type_arguments.CanShareInstantiatorTypeArguments(
-            instr->instantiator_class())) {
+    if (instr->CanShareInstantiatorTypeArguments()) {
       SetValue(instr, instantiator_type_args);
       return;
     }
@@ -1098,13 +1100,13 @@
     if (IsUnknown(function_type_args_obj)) {
       return;
     }
-    if (!function_type_args_obj.IsTypeArguments()) {
+    if (!function_type_args_obj.IsNull() &&
+        !function_type_args_obj.IsTypeArguments()) {
       SetValue(instr, non_constant_);
       return;
     }
     function_type_args ^= function_type_args_obj.raw();
-    ASSERT(!instr->function().IsNull());
-    if (type_arguments.CanShareFunctionTypeArguments(instr->function())) {
+    if (instr->CanShareFunctionTypeArguments()) {
       SetValue(instr, function_type_args);
       return;
     }
@@ -1424,6 +1426,11 @@
   SetValue(instr, non_constant_);
 }
 
+void ConstantPropagator::VisitBoxUint8(BoxUint8Instr* instr) {
+  // TODO(kmillikin): Handle box operation.
+  SetValue(instr, non_constant_);
+}
+
 void ConstantPropagator::VisitBoxUint32(BoxUint32Instr* instr) {
   // TODO(kmillikin): Handle box operation.
   SetValue(instr, non_constant_);
diff --git a/runtime/vm/compiler/backend/flow_graph.h b/runtime/vm/compiler/backend/flow_graph.h
index 50ea5ec..a288e47 100644
--- a/runtime/vm/compiler/backend/flow_graph.h
+++ b/runtime/vm/compiler/backend/flow_graph.h
@@ -162,10 +162,6 @@
   }
 
   intptr_t CurrentContextEnvIndex() const {
-    if (function().HasBytecode()) {
-      return -1;
-    }
-
     return EnvIndex(parsed_function().current_context_var());
   }
 
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler.cc b/runtime/vm/compiler/backend/flow_graph_compiler.cc
index 6a01f8a..e943f75 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler.cc
@@ -2038,7 +2038,7 @@
   Class& cls = Class::Handle(zone, raw_class);
   if (cls.IsNull()) return false;
   if (!cls.is_finalized()) return false;
-  if (Array::Handle(cls.functions()).IsNull()) return false;
+  if (Array::Handle(cls.current_functions()).IsNull()) return false;
 
   if (class_is_abstract_return != NULL) {
     *class_is_abstract_return = cls.is_abstract();
@@ -2303,29 +2303,147 @@
              : kTestTypeSixArgs;
 }
 
-void FlowGraphCompiler::GenerateAssertAssignableViaTypeTestingStub(
+#if !defined(TARGET_ARCH_IA32)
+// Generates an assignable check for a given object. Emits no code if the
+// destination type is known at compile time and is a top type. See
+// GenerateCallerChecksForAssertAssignable for other optimized cases.
+//
+// Inputs (preserved for successful checks):
+// - TypeTestABI::kInstanceReg: object.
+// - TypeTestABI::kDstTypeReg: destination type (if non-constant).
+// - TypeTestABI::kInstantiatorTypeArgumentsReg: instantiator type arguments.
+// - TypeTestABI::kFunctionTypeArgumentsReg: function type arguments.
+//
+// Throws:
+// - TypeError (on unsuccessful assignable checks)
+//
+// Performance notes: positive checks must be quick, negative checks can be slow
+// as they throw an exception.
+void FlowGraphCompiler::GenerateAssertAssignable(CompileType* receiver_type,
+                                                 TokenPosition token_pos,
+                                                 intptr_t deopt_id,
+                                                 const String& dst_name,
+                                                 LocationSummary* locs) {
+  ASSERT(!token_pos.IsClassifying());
+  ASSERT(CheckAssertAssignableTypeTestingABILocations(*locs));
+
+  if (!locs->in(1).IsConstant()) {
+    // TODO(dartbug.com/40813): Handle setting up the non-constant case.
+    UNREACHABLE();
+  }
+  const auto& dst_type = AbstractType::Cast(locs->in(1).constant());
+  ASSERT(dst_type.IsFinalized());
+
+  if (dst_type.IsTopTypeForSubtyping()) return;  // No code needed.
+
+  compiler::Label done;
+
+  GenerateCallerChecksForAssertAssignable(receiver_type, dst_type, &done);
+
+  GenerateTTSCall(token_pos, deopt_id,
+                  dst_type.IsTypeParameter() ? TypeTestABI::kScratchReg
+                                             : TypeTestABI::kDstTypeReg,
+                  dst_type, dst_name, locs);
+  __ Bind(&done);
+}
+
+// Generates a call to the type testing stub for the type in [reg_with_type].
+// Provide a non-null [dst_type] and [dst_name] if they are known at compile
+// time.
+void FlowGraphCompiler::GenerateTTSCall(TokenPosition token_pos,
+                                        intptr_t deopt_id,
+                                        Register reg_with_type,
+                                        const AbstractType& dst_type,
+                                        const String& dst_name,
+                                        LocationSummary* locs) {
+  // For now, we don't allow dynamic (non-compile-time) dst_type/dst_name.
+  ASSERT(!dst_type.IsNull() && !dst_name.IsNull());
+  // We use 2 consecutive entries in the pool for the subtype cache and the
+  // destination name.  The second entry, namely [dst_name] seems to be unused,
+  // but it will be used by the code throwing a TypeError if the type test fails
+  // (see runtime/vm/runtime_entry.cc:TypeCheck).  It will use pattern matching
+  // on the call site to find out at which pool index the destination name is
+  // located.
+  const intptr_t sub_type_cache_index = __ object_pool_builder().AddObject(
+      Object::null_object(), compiler::ObjectPoolBuilderEntry::kPatchable);
+  const intptr_t dst_name_index = __ object_pool_builder().AddObject(
+      dst_name, compiler::ObjectPoolBuilderEntry::kPatchable);
+  ASSERT((sub_type_cache_index + 1) == dst_name_index);
+  ASSERT(__ constant_pool_allowed());
+
+  // If the dst_type is known at compile time and instantiated, we know the
+  // target TTS stub and so can use a PC-relative call when available.
+  if (dst_type.IsInstantiated() && CanPcRelativeCall(dst_type)) {
+    __ LoadWordFromPoolIndex(TypeTestABI::kSubtypeTestCacheReg,
+                             sub_type_cache_index);
+    __ GenerateUnRelocatedPcRelativeCall();
+    AddPcRelativeTTSCallTypeTarget(dst_type);
+  } else {
+    GenerateIndirectTTSCall(reg_with_type, sub_type_cache_index);
+  }
+  EmitCallsiteMetadata(token_pos, deopt_id, PcDescriptorsLayout::kOther, locs);
+}
+
+// Optimize assignable type check by adding inlined tests for:
+// - non-null object -> return object (only if in null safe mode and type is
+//   non-nullable Object).
+// - Smi -> compile time subtype check (only if dst class is not parameterized).
+// - Class equality (only if class is not parameterized).
+//
+// Inputs (preserved):
+// - TypeTestABI::kInstanceReg: object.
+// - TypeTestABI::kInstantiatorTypeArgumentsReg: instantiator type arguments.
+// - TypeTestABI::kFunctionTypeArgumentsReg: function type arguments.
+//
+// Assumes:
+// - Destination type is not a top type.
+// - Object to check is not null, unless in null safe mode and destination type
+//   is not a nullable type.
+//
+// Outputs:
+// - TypeTestABI::kDstTypeReg: destination type
+// Additional output if dst_type is a TypeParameter:
+// - TypeTestABI::kScratchReg: type on which to call TTS stub.
+//
+// Performance notes: positive checks must be quick, negative checks can be slow
+// as they throw an exception.
+void FlowGraphCompiler::GenerateCallerChecksForAssertAssignable(
     CompileType* receiver_type,
     const AbstractType& dst_type,
-    const String& dst_name,
-    const Register dst_type_reg_to_call,
-    const Register scratch_reg,
     compiler::Label* done) {
-#if defined(TARGET_ARCH_IA32)
-  // ia32 does not have support for TypeTestingStubs.
-  UNREACHABLE();
-#else
-  TypeUsageInfo* type_usage_info = thread()->type_usage_info();
-
-  // Special case: non-nullable Object.
   // Top types should be handled by the caller and cannot reach here.
   ASSERT(!dst_type.IsTopTypeForSubtyping());
+
+  // Set this to avoid marking the type testing stub for optimization.
+  bool elide_info = false;
+  // Call before any return points to set the destination type register and
+  // mark the destination type TTS as needing optimization, unless it is
+  // unlikely to be called.
+  auto output_dst_type = [&]() -> void {
+    // If we haven't handled the positive case of the type check on the call
+    // site and we'll be using the TTS of the destination type, we want an
+    // optimized type testing stub and thus record it in the [TypeUsageInfo].
+    if (!elide_info) {
+      if (auto const type_usage_info = thread()->type_usage_info()) {
+        type_usage_info->UseTypeInAssertAssignable(dst_type);
+      } else {
+        ASSERT(!FLAG_precompiled_mode);
+      }
+    }
+    __ LoadObject(TypeTestABI::kDstTypeReg, dst_type);
+  };
+
+  // We can handle certain types and checks very efficiently on the call site,
+  // meaning those need not be checked within the stubs (which may involve
+  // a runtime call).
+
   if (dst_type.IsObjectType()) {
+    // Special case: non-nullable Object.
     ASSERT(dst_type.IsNonNullable() && isolate()->null_safety());
     __ CompareObject(TypeTestABI::kInstanceReg, Object::null_object());
     __ BranchIf(NOT_EQUAL, done);
-    // Fall back to type testing stub.
-    __ LoadObject(TypeTestABI::kDstTypeReg, dst_type);
-    return;
+    // Fall back to type testing stub in caller to throw the exception.
+    return output_dst_type();
   }
 
   // If the int type is assignable to [dst_type] we special case it on the
@@ -2339,93 +2457,64 @@
     is_non_smi = true;
   }
 
-  // We use two type registers iff the dst type is a type parameter.
-  // We "dereference" the type parameter for the TTS call but leave the type
-  // parameter in the TypeTestABI::kDstTypeReg for fallback into
-  // SubtypeTestCache.
-  ASSERT(dst_type_reg_to_call == kNoRegister ||
-         (dst_type.IsTypeParameter() ==
-          (TypeTestABI::kDstTypeReg != dst_type_reg_to_call)));
-
-  // We can handle certain types very efficiently on the call site (with a
-  // bailout to the normal stub, which will do a runtime call).
   if (dst_type.IsTypeParameter()) {
-    // In NNBD strong mode we need to handle null instance before calling TTS
-    // if type parameter is nullable or legacy because type parameter can be
-    // instantiated with a non-nullable type which rejects null.
-    // In NNBD weak mode or if type parameter is non-nullable or has
-    // undetermined nullability null instance is correctly handled by TTS.
-    if (isolate()->null_safety() &&
-        (dst_type.IsNullable() || dst_type.IsLegacy())) {
+    // Special case: Instantiate the type parameter on the caller side, invoking
+    // the TTS of the corresponding type parameter in the caller.
+    const TypeParameter& type_param = TypeParameter::Cast(dst_type);
+    if (isolate()->null_safety() && !type_param.IsNonNullable()) {
+      // If the type parameter is nullable when running in strong mode, we need
+      // to handle null before calling the TTS because the type parameter may be
+      // instantiated with a non-nullable type, where the TTS rejects null.
       __ CompareObject(TypeTestABI::kInstanceReg, Object::null_object());
       __ BranchIf(EQUAL, done);
     }
-    const TypeParameter& type_param = TypeParameter::Cast(dst_type);
     const Register kTypeArgumentsReg =
         type_param.IsClassTypeParameter()
             ? TypeTestABI::kInstantiatorTypeArgumentsReg
             : TypeTestABI::kFunctionTypeArgumentsReg;
 
     // Check if type arguments are null, i.e. equivalent to vector of dynamic.
+    // If so, then the value is guaranteed assignable as dynamic is a top type.
     __ CompareObject(kTypeArgumentsReg, Object::null_object());
     __ BranchIf(EQUAL, done);
+    // Put the instantiated type parameter into the scratch register, so its
+    // TTS can be called by the caller.
     __ LoadField(
-        dst_type_reg_to_call,
+        TypeTestABI::kScratchReg,
         compiler::FieldAddress(kTypeArgumentsReg,
                                compiler::target::TypeArguments::type_at_offset(
                                    type_param.index())));
-    __ LoadObject(TypeTestABI::kDstTypeReg, type_param);
-    if (type_usage_info != NULL) {
-      type_usage_info->UseTypeInAssertAssignable(dst_type);
-    }
-  } else {
-    HierarchyInfo* hi = Thread::Current()->hierarchy_info();
-    if (hi != NULL) {
-      const Class& type_class = Class::Handle(zone(), dst_type.type_class());
-
-      bool check_handled_at_callsite = false;
-      bool used_cid_range_check = false;
-      const bool can_use_simple_cid_range_test =
-          hi->CanUseSubtypeRangeCheckFor(dst_type);
-      if (can_use_simple_cid_range_test) {
-        const CidRangeVector& ranges = hi->SubtypeRangesForClass(
-            type_class,
-            /*include_abstract=*/false,
-            /*exclude_null=*/!Instance::NullIsAssignableTo(dst_type));
-        if (ranges.length() <= kMaxNumberOfCidRangesToTest) {
-          if (is_non_smi) {
-            __ LoadClassId(scratch_reg, TypeTestABI::kInstanceReg);
-          } else {
-            __ LoadClassIdMayBeSmi(scratch_reg, TypeTestABI::kInstanceReg);
-          }
-          GenerateCidRangesCheck(assembler(), scratch_reg, ranges, done);
-          used_cid_range_check = true;
-          check_handled_at_callsite = true;
-        }
-      }
-
-      if (!used_cid_range_check && can_use_simple_cid_range_test &&
-          IsListClass(type_class)) {
-        __ LoadClassIdMayBeSmi(scratch_reg, TypeTestABI::kInstanceReg);
-        GenerateListTypeCheck(scratch_reg, done);
-        used_cid_range_check = true;
-      }
-
-      // If we haven't handled the positive case of the type check on the
-      // call-site, we want an optimized type testing stub and therefore record
-      // it in the [TypeUsageInfo].
-      if (!check_handled_at_callsite) {
-        if (type_usage_info != NULL) {
-          type_usage_info->UseTypeInAssertAssignable(dst_type);
-        } else {
-          ASSERT(!FLAG_precompiled_mode);
-        }
-      }
-    }
-    __ LoadObject(TypeTestABI::kDstTypeReg, dst_type);
+    return output_dst_type();
   }
-#endif  // defined(TARGET_ARCH_IA32)
+
+  if (auto const hi = thread()->hierarchy_info()) {
+    const Class& type_class = Class::Handle(zone(), dst_type.type_class());
+
+    if (hi->CanUseSubtypeRangeCheckFor(dst_type)) {
+      const CidRangeVector& ranges = hi->SubtypeRangesForClass(
+          type_class,
+          /*include_abstract=*/false,
+          /*exclude_null=*/!Instance::NullIsAssignableTo(dst_type));
+      if (ranges.length() <= kMaxNumberOfCidRangesToTest) {
+        if (is_non_smi) {
+          __ LoadClassId(TypeTestABI::kScratchReg, TypeTestABI::kInstanceReg);
+        } else {
+          __ LoadClassIdMayBeSmi(TypeTestABI::kScratchReg,
+                                 TypeTestABI::kInstanceReg);
+        }
+        GenerateCidRangesCheck(assembler(), TypeTestABI::kScratchReg, ranges,
+                               done);
+        elide_info = true;
+      } else if (IsListClass(type_class)) {
+        __ LoadClassIdMayBeSmi(TypeTestABI::kScratchReg,
+                               TypeTestABI::kInstanceReg);
+        GenerateListTypeCheck(TypeTestABI::kScratchReg, done);
+      }
+    }
+  }
+  output_dst_type();
 }
+#endif  // !defined(TARGET_ARCH_IA32)
 
 #undef __
 
@@ -2470,14 +2559,16 @@
     rep = kTagged;
   }
   ASSERT(!is_optimizing());
-  ASSERT((rep == kTagged) || (rep == kUntagged) || (rep == kUnboxedUint32));
+  ASSERT((rep == kTagged) || (rep == kUntagged) || (rep == kUnboxedUint32) ||
+         (rep == kUnboxedUint8));
   ASSERT(rep != kUntagged || flow_graph_.IsIrregexpFunction());
   const auto& function = flow_graph_.parsed_function().function();
-  // Currently, we only allow unboxed uint32 on the stack in unoptimized code
-  // when building a dynamic closure call dispatcher, where any unboxed values
-  // on the stack are consumed before possible FrameStateIsSafeToCall() checks.
+  // Currently, we only allow unboxed uint8 and uint32 on the stack in
+  // unoptimized code  when building a dynamic closure call dispatcher, where
+  // any unboxed values on the stack are consumed before possible
+  // FrameStateIsSafeToCall() checks.
   // See FlowGraphBuilder::BuildDynamicCallVarsInit().
-  ASSERT(rep != kUnboxedUint32 ||
+  ASSERT((rep != kUnboxedUint32 && rep != kUnboxedUint8) ||
          function.IsDynamicClosureCallDispatcher(thread()));
   frame_state_.Add(rep);
 }
@@ -2512,8 +2603,11 @@
   }
   const bool use_shared_stub =
       instruction()->UseSharedSlowPathStub(compiler->is_optimizing());
+  ASSERT(use_shared_stub == instruction()->locs()->call_on_shared_slow_path());
   const bool live_fpu_registers =
       instruction()->locs()->live_registers()->FpuRegisterCount() > 0;
+  const intptr_t num_args =
+      use_shared_stub ? 0 : GetNumberOfArgumentsForRuntimeCall();
   __ Bind(entry_label());
   EmitCodeAtSlowPathEntry(compiler);
   LocationSummary* locs = instruction()->locs();
@@ -2522,26 +2616,19 @@
     EmitSharedStubCall(compiler, live_fpu_registers);
   } else {
     compiler->SaveLiveRegisters(locs);
-    intptr_t i = 0;
-    if (num_args_ % 2 != 0) {
-      __ PushRegister(locs->in(i).reg());
-      ++i;
-    }
-    for (; i < num_args_; i += 2) {
-      __ PushRegisterPair(locs->in(i + 1).reg(), locs->in(i).reg());
-    }
-    __ CallRuntime(runtime_entry_, num_args_);
+    PushArgumentsForRuntimeCall(compiler);
+    __ CallRuntime(runtime_entry_, num_args);
   }
   const intptr_t deopt_id = instruction()->deopt_id();
   compiler->AddDescriptor(PcDescriptorsLayout::kOther,
                           compiler->assembler()->CodeSize(), deopt_id,
                           instruction()->token_pos(), try_index_);
   AddMetadataForRuntimeCall(compiler);
-  compiler->RecordSafepoint(locs, num_args_);
+  compiler->RecordSafepoint(locs, num_args);
   if ((try_index_ != kInvalidTryIndex) ||
       (compiler->CurrentTryIndex() != kInvalidTryIndex)) {
     Environment* env =
-        compiler->SlowPathEnvironmentFor(instruction(), num_args_);
+        compiler->SlowPathEnvironmentFor(instruction(), num_args);
     if (FLAG_precompiled_mode) {
       compiler->RecordCatchEntryMoves(env, try_index_);
     } else if (env != nullptr) {
@@ -2611,6 +2698,42 @@
 #endif
 }
 
+void RangeErrorSlowPath::PushArgumentsForRuntimeCall(
+    FlowGraphCompiler* compiler) {
+  LocationSummary* locs = instruction()->locs();
+  __ PushRegisterPair(locs->in(CheckBoundBase::kIndexPos).reg(),
+                      locs->in(CheckBoundBase::kLengthPos).reg());
+}
+
+void LateInitializationErrorSlowPath::PushArgumentsForRuntimeCall(
+    FlowGraphCompiler* compiler) {
+  const Field& original_field = Field::ZoneHandle(
+      instruction()->AsLoadField()->slot().field().Original());
+  __ PushObject(original_field);
+}
+
+void LateInitializationErrorSlowPath::EmitSharedStubCall(
+    FlowGraphCompiler* compiler,
+    bool save_fpu_registers) {
+#if defined(TARGET_ARCH_IA32)
+  UNREACHABLE();
+#else
+  ASSERT(instruction()->locs()->temp(0).reg() ==
+         LateInitializationErrorABI::kFieldReg);
+  const Field& original_field = Field::ZoneHandle(
+      instruction()->AsLoadField()->slot().field().Original());
+  __ LoadObject(LateInitializationErrorABI::kFieldReg, original_field);
+  auto object_store = compiler->isolate()->object_store();
+  const auto& stub = Code::ZoneHandle(
+      compiler->zone(),
+      save_fpu_registers
+          ? object_store->late_initialization_error_stub_with_fpu_regs_stub()
+          : object_store
+                ->late_initialization_error_stub_without_fpu_regs_stub());
+  compiler->EmitCallToStub(stub);
+#endif
+}
+
 void FlowGraphCompiler::EmitNativeMove(
     const compiler::ffi::NativeLocation& destination,
     const compiler::ffi::NativeLocation& source,
@@ -2625,8 +2748,8 @@
   const intptr_t dst_container_size = dst_container_type.SizeInBytes();
 
   // This function does not know how to do larger mem copy moves yet.
-  ASSERT(src_payload_type.IsFundamental());
-  ASSERT(dst_payload_type.IsFundamental());
+  ASSERT(src_payload_type.IsPrimitive());
+  ASSERT(dst_payload_type.IsPrimitive());
 
   // This function does not deal with sign conversions yet.
   ASSERT(src_payload_type.IsSigned() == dst_payload_type.IsSigned());
@@ -2650,9 +2773,9 @@
       // The upper bits of the source are already properly sign or zero
       // extended, so just copy the required amount of bits.
       return EmitNativeMove(destination.WithOtherNativeType(
-                                dst_container_type, dst_container_type, zone_),
+                                zone_, dst_container_type, dst_container_type),
                             source.WithOtherNativeType(
-                                dst_container_type, dst_container_type, zone_),
+                                zone_, dst_container_type, dst_container_type),
                             temp);
     }
     if (src_payload_size >= dst_payload_size &&
@@ -2660,9 +2783,9 @@
       // The upper bits of the source are not properly sign or zero extended
       // to be copied to the target, so regard the source as smaller.
       return EmitNativeMove(
-          destination.WithOtherNativeType(dst_container_type,
-                                          dst_container_type, zone_),
-          source.WithOtherNativeType(dst_payload_type, dst_payload_type, zone_),
+          destination.WithOtherNativeType(zone_, dst_container_type,
+                                          dst_container_type),
+          source.WithOtherNativeType(zone_, dst_payload_type, dst_payload_type),
           temp);
     }
     UNREACHABLE();
@@ -2677,8 +2800,8 @@
       !destination.IsFpuRegisters()) {
     // TODO(40209): If this is stack to stack, we could use FpuTMP.
     // Test the impact on code size and speed.
-    EmitNativeMove(destination.Split(0, zone_), source.Split(0, zone_), temp);
-    EmitNativeMove(destination.Split(1, zone_), source.Split(1, zone_), temp);
+    EmitNativeMove(destination.Split(zone_, 0), source.Split(zone_, 0), temp);
+    EmitNativeMove(destination.Split(zone_, 1), source.Split(zone_, 1), temp);
     return;
   }
 
@@ -2706,7 +2829,7 @@
   if (sign_or_zero_extend && destination.IsStack()) {
     ASSERT(source.IsRegisters());
     const auto& intermediate =
-        source.WithOtherNativeType(dst_payload_type, dst_container_type, zone_);
+        source.WithOtherNativeType(zone_, dst_payload_type, dst_container_type);
     EmitNativeMove(intermediate, source, temp);
     EmitNativeMove(destination, intermediate, temp);
     return;
@@ -2717,7 +2840,7 @@
   if (sign_or_zero_extend && source.IsStack()) {
     ASSERT(destination.IsRegisters());
     const auto& intermediate = destination.WithOtherNativeType(
-        src_payload_type, src_container_type, zone_);
+        zone_, src_payload_type, src_container_type);
     EmitNativeMove(intermediate, source, temp);
     EmitNativeMove(destination, intermediate, temp);
     return;
@@ -2752,12 +2875,12 @@
   if (src_loc.IsPairLocation()) {
     for (intptr_t i : {0, 1}) {
       const auto& src_split = compiler::ffi::NativeLocation::FromPairLocation(
-          src_loc, src_type, i, zone_);
-      EmitNativeMove(dst.Split(i, zone_), src_split, temp);
+          zone_, src_loc, src_type, i);
+      EmitNativeMove(dst.Split(zone_, i), src_split, temp);
     }
   } else {
     const auto& src =
-        compiler::ffi::NativeLocation::FromLocation(src_loc, src_type, zone_);
+        compiler::ffi::NativeLocation::FromLocation(zone_, src_loc, src_type);
     EmitNativeMove(dst, src, temp);
   }
 }
@@ -2772,12 +2895,12 @@
   if (dst_loc.IsPairLocation()) {
     for (intptr_t i : {0, 1}) {
       const auto& dest_split = compiler::ffi::NativeLocation::FromPairLocation(
-          dst_loc, dst_type, i, zone_);
-      EmitNativeMove(dest_split, src.Split(i, zone_), temp);
+          zone_, dst_loc, dst_type, i);
+      EmitNativeMove(dest_split, src.Split(zone_, i), temp);
     }
   } else {
     const auto& dest =
-        compiler::ffi::NativeLocation::FromLocation(dst_loc, dst_type, zone_);
+        compiler::ffi::NativeLocation::FromLocation(zone_, dst_loc, dst_type);
     EmitNativeMove(dest, src, temp);
   }
 }
@@ -2812,20 +2935,20 @@
     if (src.IsPairLocation()) {
       for (intptr_t i : {0, 1}) {
         const Representation src_type_split =
-            compiler::ffi::NativeType::FromUnboxedRepresentation(src_type,
-                                                                 zone_)
-                .Split(i, zone_)
+            compiler::ffi::NativeType::FromUnboxedRepresentation(zone_,
+                                                                 src_type)
+                .Split(zone_, i)
                 .AsRepresentation();
         const auto& intermediate_native =
-            compiler::ffi::NativeLocation::FromLocation(intermediate,
-                                                        src_type_split, zone_);
+            compiler::ffi::NativeLocation::FromLocation(zone_, intermediate,
+                                                        src_type_split);
         EmitMove(intermediate, src.AsPairLocation()->At(i), temp);
-        EmitNativeMove(dst.Split(i, zone_), intermediate_native, temp);
+        EmitNativeMove(dst.Split(zone_, i), intermediate_native, temp);
       }
     } else {
       const auto& intermediate_native =
-          compiler::ffi::NativeLocation::FromLocation(intermediate, src_type,
-                                                      zone_);
+          compiler::ffi::NativeLocation::FromLocation(zone_, intermediate,
+                                                      src_type);
       EmitMove(intermediate, src, temp);
       EmitNativeMove(dst, intermediate_native, temp);
     }
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler.h b/runtime/vm/compiler/backend/flow_graph_compiler.h
index cff19a26..1965d97 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler.h
+++ b/runtime/vm/compiler/backend/flow_graph_compiler.h
@@ -283,11 +283,9 @@
  public:
   ThrowErrorSlowPathCode(Instruction* instruction,
                          const RuntimeEntry& runtime_entry,
-                         intptr_t num_args,
                          intptr_t try_index)
       : TemplateSlowPathCode(instruction),
         runtime_entry_(runtime_entry),
-        num_args_(num_args),
         try_index_(try_index) {}
 
   // This name appears in disassembly.
@@ -296,6 +294,10 @@
   // Subclasses can override these methods to customize slow path code.
   virtual void EmitCodeAtSlowPathEntry(FlowGraphCompiler* compiler) {}
   virtual void AddMetadataForRuntimeCall(FlowGraphCompiler* compiler) {}
+  virtual void PushArgumentsForRuntimeCall(FlowGraphCompiler* compiler) {}
+
+  // Returns number of arguments for runtime call (if shared stub is not used).
+  virtual intptr_t GetNumberOfArgumentsForRuntimeCall() { return 0; }
 
   virtual void EmitSharedStubCall(FlowGraphCompiler* compiler,
                                   bool save_fpu_registers) {
@@ -306,18 +308,14 @@
 
  private:
   const RuntimeEntry& runtime_entry_;
-  const intptr_t num_args_;
   const intptr_t try_index_;
 };
 
 class NullErrorSlowPath : public ThrowErrorSlowPathCode {
  public:
-  static const intptr_t kNumberOfArguments = 0;
-
   NullErrorSlowPath(CheckNullInstr* instruction, intptr_t try_index)
       : ThrowErrorSlowPathCode(instruction,
                                GetRuntimeEntry(instruction->exception_type()),
-                               kNumberOfArguments,
                                try_index) {}
 
   CheckNullInstr::ExceptionType exception_type() const {
@@ -345,16 +343,38 @@
 
 class RangeErrorSlowPath : public ThrowErrorSlowPathCode {
  public:
-  static const intptr_t kNumberOfArguments = 0;
-
   RangeErrorSlowPath(GenericCheckBoundInstr* instruction, intptr_t try_index)
       : ThrowErrorSlowPathCode(instruction,
                                kRangeErrorRuntimeEntry,
-                               kNumberOfArguments,
                                try_index) {}
   virtual const char* name() { return "check bound"; }
 
-  virtual void EmitSharedStubCall(FlowGraphCompiler* compielr,
+  virtual intptr_t GetNumberOfArgumentsForRuntimeCall() {
+    return 2;  // length and index
+  }
+
+  virtual void PushArgumentsForRuntimeCall(FlowGraphCompiler* compiler);
+
+  virtual void EmitSharedStubCall(FlowGraphCompiler* compiler,
+                                  bool save_fpu_registers);
+};
+
+class LateInitializationErrorSlowPath : public ThrowErrorSlowPathCode {
+ public:
+  LateInitializationErrorSlowPath(LoadFieldInstr* instruction,
+                                  intptr_t try_index)
+      : ThrowErrorSlowPathCode(instruction,
+                               kLateInitializationErrorRuntimeEntry,
+                               try_index) {}
+  virtual const char* name() { return "late initialization error"; }
+
+  virtual intptr_t GetNumberOfArgumentsForRuntimeCall() {
+    return 1;  // field
+  }
+
+  virtual void PushArgumentsForRuntimeCall(FlowGraphCompiler* compiler);
+
+  virtual void EmitSharedStubCall(FlowGraphCompiler* compiler,
                                   bool save_fpu_registers);
 };
 
@@ -568,19 +588,21 @@
                                 const String& dst_name,
                                 LocationSummary* locs);
 
-  void GenerateAssertAssignableViaTypeTestingStub(CompileType* receiver_type,
-                                                  TokenPosition token_pos,
-                                                  intptr_t deopt_id,
-                                                  const String& dst_name,
-                                                  LocationSummary* locs);
+#if !defined(TARGET_ARCH_IA32)
+  void GenerateCallerChecksForAssertAssignable(CompileType* receiver_type,
+                                               const AbstractType& dst_type,
+                                               compiler::Label* done);
 
-  void GenerateAssertAssignableViaTypeTestingStub(
-      CompileType* receiver_type,
-      const AbstractType& dst_type,
-      const String& dst_name,
-      const Register dst_type_reg_to_call,
-      const Register scratch_reg,
-      compiler::Label* done);
+  void GenerateTTSCall(TokenPosition token_pos,
+                       intptr_t deopt_id,
+                       Register reg_with_type,
+                       const AbstractType& dst_type,
+                       const String& dst_name,
+                       LocationSummary* locs);
+
+  void GenerateIndirectTTSCall(Register reg_with_type,
+                               intptr_t sub_type_cache_index);
+#endif
 
   void GenerateRuntimeCall(TokenPosition token_pos,
                            intptr_t deopt_id,
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc b/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc
index 465352b..66f966d 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc
@@ -682,100 +682,16 @@
   __ Drop(2);
 }
 
-// Optimize assignable type check by adding inlined tests for:
-// - NULL -> return NULL.
-// - Smi -> compile time subtype check (only if dst class is not parameterized).
-// - Class equality (only if class is not parameterized).
-// Inputs:
-// - R0: instance being type checked.
-// - R8: destination type (if non-constant).
-// - R2: instantiator type arguments or raw_null.
-// - R1: function type arguments or raw_null.
-// Returns:
-// - object in R0 for successful assignable check (or throws TypeError).
-// Performance notes: positive checks must be quick, negative checks can be slow
-// as they throw an exception.
-void FlowGraphCompiler::GenerateAssertAssignable(CompileType* receiver_type,
-                                                 TokenPosition token_pos,
-                                                 intptr_t deopt_id,
-                                                 const String& dst_name,
-                                                 LocationSummary* locs) {
-  ASSERT(!token_pos.IsClassifying());
-  ASSERT(CheckAssertAssignableTypeTestingABILocations(*locs));
-
-  if (locs->in(1).IsConstant()) {
-    const auto& dst_type = AbstractType::Cast(locs->in(1).constant());
-    ASSERT(dst_type.IsFinalized());
-
-    if (dst_type.IsTopTypeForSubtyping()) return;  // No code needed.
-
-    GenerateAssertAssignableViaTypeTestingStub(receiver_type, token_pos,
-                                               deopt_id, dst_name, locs);
-    return;
-  } else {
-    // TODO(dartbug.com/40813): Handle setting up the non-constant case.
-    UNREACHABLE();
-  }
-}
-
-void FlowGraphCompiler::GenerateAssertAssignableViaTypeTestingStub(
-    CompileType* receiver_type,
-    TokenPosition token_pos,
-    intptr_t deopt_id,
-    const String& dst_name,
-    LocationSummary* locs) {
-  ASSERT(CheckAssertAssignableTypeTestingABILocations(*locs));
-  // We must have a constant dst_type for generating a call to the stub.
-  ASSERT(locs->in(1).IsConstant());
-  const auto& dst_type = AbstractType::Cast(locs->in(1).constant());
-
-  // If the dst_type is instantiated we know the target TTS stub at
-  // compile-time and can therefore use a pc-relative call.
-  const bool use_pc_relative_call =
-      dst_type.IsInstantiated() && CanPcRelativeCall(dst_type);
-
-  const Register kRegToCall =
-      use_pc_relative_call
-          ? kNoRegister
-          : (dst_type.IsTypeParameter() ? R9 : TypeTestABI::kDstTypeReg);
-  const Register kScratchReg = R4;
-
-  compiler::Label done;
-
-  GenerateAssertAssignableViaTypeTestingStub(receiver_type, dst_type, dst_name,
-                                             kRegToCall, kScratchReg, &done);
-
-  // We use 2 consecutive entries in the pool for the subtype cache and the
-  // destination name.  The second entry, namely [dst_name] seems to be unused,
-  // but it will be used by the code throwing a TypeError if the type test fails
-  // (see runtime/vm/runtime_entry.cc:TypeCheck).  It will use pattern matching
-  // on the call site to find out at which pool index the destination name is
-  // located.
-  const intptr_t sub_type_cache_index = __ object_pool_builder().AddObject(
-      Object::null_object(), ObjectPool::Patchability::kPatchable);
-  const intptr_t sub_type_cache_offset =
-      compiler::target::ObjectPool::element_offset(sub_type_cache_index) -
-      kHeapObjectTag;
-  const intptr_t dst_name_index = __ object_pool_builder().AddObject(
-      dst_name, ObjectPool::Patchability::kPatchable);
-  ASSERT((sub_type_cache_index + 1) == dst_name_index);
-  ASSERT(__ constant_pool_allowed());
-
-  if (use_pc_relative_call) {
-    __ LoadWordFromPoolOffset(TypeTestABI::kSubtypeTestCacheReg,
-                              sub_type_cache_offset, PP);
-    __ GenerateUnRelocatedPcRelativeCall();
-    AddPcRelativeTTSCallTypeTarget(dst_type);
-  } else {
-    __ LoadField(R9, compiler::FieldAddress(
-                         kRegToCall, compiler::target::AbstractType::
-                                         type_test_stub_entry_point_offset()));
-    __ LoadWordFromPoolOffset(TypeTestABI::kSubtypeTestCacheReg,
-                              sub_type_cache_offset, PP);
-    __ blx(R9);
-  }
-  EmitCallsiteMetadata(token_pos, deopt_id, PcDescriptorsLayout::kOther, locs);
-  __ Bind(&done);
+void FlowGraphCompiler::GenerateIndirectTTSCall(Register reg_to_call,
+                                                intptr_t sub_type_cache_index) {
+  __ LoadField(
+      R9,
+      compiler::FieldAddress(
+          reg_to_call,
+          compiler::target::AbstractType::type_test_stub_entry_point_offset()));
+  __ LoadWordFromPoolIndex(TypeTestABI::kSubtypeTestCacheReg,
+                           sub_type_cache_index);
+  __ blx(R9);
 }
 
 void FlowGraphCompiler::EmitInstructionEpilogue(Instruction* instr) {
@@ -1530,8 +1446,8 @@
   ASSERT(src_container_type.IsFloat() == dst_container_type.IsFloat());
   ASSERT(src_container_type.IsInt() == dst_container_type.IsInt());
   ASSERT(src_payload_type.IsSigned() == dst_payload_type.IsSigned());
-  ASSERT(src_payload_type.IsFundamental());
-  ASSERT(dst_payload_type.IsFundamental());
+  ASSERT(src_payload_type.IsPrimitive());
+  ASSERT(dst_payload_type.IsPrimitive());
   const intptr_t src_size = src_payload_type.SizeInBytes();
   const intptr_t dst_size = dst_payload_type.SizeInBytes();
   const bool sign_or_zero_extend = dst_size > src_size;
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc b/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc
index bc6983e..14cb38c 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc
@@ -648,99 +648,16 @@
   __ Drop(2);
 }
 
-// Optimize assignable type check by adding inlined tests for:
-// - NULL -> return NULL.
-// - Smi -> compile time subtype check (only if dst class is not parameterized).
-// - Class equality (only if class is not parameterized).
-// Inputs:
-// - R0: instance being type checked.
-// - R8: destination type (if non-constant).
-// - R2: instantiator type arguments or raw_null.
-// - R1: function type arguments or raw_null.
-// Returns:
-// - object in R0 for successful assignable check (or throws TypeError).
-// Performance notes: positive checks must be quick, negative checks can be slow
-// as they throw an exception.
-void FlowGraphCompiler::GenerateAssertAssignable(CompileType* receiver_type,
-                                                 TokenPosition token_pos,
-                                                 intptr_t deopt_id,
-                                                 const String& dst_name,
-                                                 LocationSummary* locs) {
-  ASSERT(!TokenPosition(token_pos).IsClassifying());
-  ASSERT(CheckAssertAssignableTypeTestingABILocations(*locs));
-
-  if (locs->in(1).IsConstant()) {
-    const auto& dst_type = AbstractType::Cast(locs->in(1).constant());
-    ASSERT(dst_type.IsFinalized());
-
-    if (dst_type.IsTopTypeForSubtyping()) return;  // No code needed.
-
-    GenerateAssertAssignableViaTypeTestingStub(receiver_type, token_pos,
-                                               deopt_id, dst_name, locs);
-    return;
-  } else {
-    // TODO(dartbug.com/40813): Handle setting up the non-constant case.
-    UNREACHABLE();
-  }
-}
-
-void FlowGraphCompiler::GenerateAssertAssignableViaTypeTestingStub(
-    CompileType* receiver_type,
-    TokenPosition token_pos,
-    intptr_t deopt_id,
-    const String& dst_name,
-    LocationSummary* locs) {
-  ASSERT(CheckAssertAssignableTypeTestingABILocations(*locs));
-  // We must have a constant dst_type for generating a call to the stub.
-  ASSERT(locs->in(1).IsConstant());
-  const auto& dst_type = AbstractType::Cast(locs->in(1).constant());
-
-  // If the dst_type is instantiated we know the target TTS stub at
-  // compile-time and can therefore use a pc-relative call.
-  const bool use_pc_relative_call =
-      dst_type.IsInstantiated() && CanPcRelativeCall(dst_type);
-
-  const Register kRegToCall =
-      use_pc_relative_call
-          ? kNoRegister
-          : (dst_type.IsTypeParameter() ? R9 : TypeTestABI::kDstTypeReg);
-  const Register kScratchReg = R4;
-
-  compiler::Label done;
-
-  GenerateAssertAssignableViaTypeTestingStub(receiver_type, dst_type, dst_name,
-                                             kRegToCall, kScratchReg, &done);
-
-  // We use 2 consecutive entries in the pool for the subtype cache and the
-  // destination name.  The second entry, namely [dst_name] seems to be unused,
-  // but it will be used by the code throwing a TypeError if the type test fails
-  // (see runtime/vm/runtime_entry.cc:TypeCheck).  It will use pattern matching
-  // on the call site to find out at which pool index the destination name is
-  // located.
-  const intptr_t sub_type_cache_index = __ object_pool_builder().AddObject(
-      Object::null_object(), ObjectPool::Patchability::kPatchable);
-  const intptr_t sub_type_cache_offset =
-      ObjectPool::element_offset(sub_type_cache_index);
-  const intptr_t dst_name_index = __ object_pool_builder().AddObject(
-      dst_name, ObjectPool::Patchability::kPatchable);
-  ASSERT((sub_type_cache_index + 1) == dst_name_index);
-  ASSERT(__ constant_pool_allowed());
-
-  if (use_pc_relative_call) {
-    __ LoadWordFromPoolOffset(TypeTestABI::kSubtypeTestCacheReg,
-                              sub_type_cache_offset);
-    __ GenerateUnRelocatedPcRelativeCall();
-    AddPcRelativeTTSCallTypeTarget(dst_type);
-  } else {
-    __ LoadField(
-        R9, compiler::FieldAddress(
-                kRegToCall, AbstractType::type_test_stub_entry_point_offset()));
-    __ LoadWordFromPoolOffset(TypeTestABI::kSubtypeTestCacheReg,
-                              sub_type_cache_offset);
-    __ blr(R9);
-  }
-  EmitCallsiteMetadata(token_pos, deopt_id, PcDescriptorsLayout::kOther, locs);
-  __ Bind(&done);
+void FlowGraphCompiler::GenerateIndirectTTSCall(Register reg_to_call,
+                                                intptr_t sub_type_cache_index) {
+  __ LoadField(
+      R9,
+      compiler::FieldAddress(
+          reg_to_call,
+          compiler::target::AbstractType::type_test_stub_entry_point_offset()));
+  __ LoadWordFromPoolIndex(TypeTestABI::kSubtypeTestCacheReg,
+                           sub_type_cache_index);
+  __ blr(R9);
 }
 
 void FlowGraphCompiler::EmitInstructionEpilogue(Instruction* instr) {
@@ -1027,8 +944,7 @@
   const intptr_t stub_index =
       op.AddObject(stub, ObjectPool::Patchability::kPatchable);
   ASSERT((ic_data_index + 1) == stub_index);
-  __ LoadDoubleWordFromPoolOffset(R5, CODE_REG,
-                                  ObjectPool::element_offset(ic_data_index));
+  __ LoadDoubleWordFromPoolIndex(R5, CODE_REG, ic_data_index);
   const intptr_t entry_point_offset =
       entry_kind == Code::EntryKind::kNormal
           ? Code::entry_point_offset(Code::EntryKind::kMonomorphic)
@@ -1068,11 +984,9 @@
   if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
     // The AOT runtime will replace the slot in the object pool with the
     // entrypoint address - see clustered_snapshot.cc.
-    __ LoadDoubleWordFromPoolOffset(R5, LR,
-                                    ObjectPool::element_offset(data_index));
+    __ LoadDoubleWordFromPoolIndex(R5, LR, data_index);
   } else {
-    __ LoadDoubleWordFromPoolOffset(R5, CODE_REG,
-                                    ObjectPool::element_offset(data_index));
+    __ LoadDoubleWordFromPoolIndex(R5, CODE_REG, data_index);
     __ ldr(LR, compiler::FieldAddress(
                    CODE_REG,
                    Code::entry_point_offset(Code::EntryKind::kMonomorphic)));
@@ -1139,11 +1053,9 @@
   if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
     // The AOT runtime will replace the slot in the object pool with the
     // entrypoint address - see clustered_snapshot.cc.
-    __ LoadDoubleWordFromPoolOffset(R5, LR,
-                                    ObjectPool::element_offset(data_index));
+    __ LoadDoubleWordFromPoolIndex(R5, LR, data_index);
   } else {
-    __ LoadDoubleWordFromPoolOffset(R5, CODE_REG,
-                                    ObjectPool::element_offset(data_index));
+    __ LoadDoubleWordFromPoolIndex(R5, CODE_REG, data_index);
     const intptr_t entry_point_offset =
         entry_kind == Code::EntryKind::kNormal
             ? compiler::target::Code::entry_point_offset(
@@ -1481,8 +1393,8 @@
   ASSERT(src_type.IsFloat() == dst_type.IsFloat());
   ASSERT(src_type.IsInt() == dst_type.IsInt());
   ASSERT(src_type.IsSigned() == dst_type.IsSigned());
-  ASSERT(src_type.IsFundamental());
-  ASSERT(dst_type.IsFundamental());
+  ASSERT(src_type.IsPrimitive());
+  ASSERT(dst_type.IsPrimitive());
   const intptr_t src_size = src_type.SizeInBytes();
   const intptr_t dst_size = dst_type.SizeInBytes();
   const bool sign_or_zero_extend = dst_size > src_size;
@@ -1508,7 +1420,7 @@
             UNIMPLEMENTED();
         }
       } else {
-        switch (src_type.AsFundamental().representation()) {
+        switch (src_type.AsPrimitive().representation()) {
           case compiler::ffi::kInt8:  // Sign extend operand.
             __ sxtb(dst_reg, src_reg);
             return;
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_ia32.cc b/runtime/vm/compiler/backend/flow_graph_compiler_ia32.cc
index 6b96aff..83f47d6 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_ia32.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_ia32.cc
@@ -1302,8 +1302,8 @@
   ASSERT(src_type.IsFloat() == dst_type.IsFloat());
   ASSERT(src_type.IsInt() == dst_type.IsInt());
   ASSERT(src_type.IsSigned() == dst_type.IsSigned());
-  ASSERT(src_type.IsFundamental());
-  ASSERT(dst_type.IsFundamental());
+  ASSERT(src_type.IsPrimitive());
+  ASSERT(dst_type.IsPrimitive());
   const intptr_t src_size = src_type.SizeInBytes();
   const intptr_t dst_size = dst_type.SizeInBytes();
   const bool sign_or_zero_extend = dst_size > src_size;
@@ -1322,7 +1322,7 @@
         ASSERT(dst_size == 4);
         __ movl(dst_reg, src_reg);
       } else {
-        switch (src_type.AsFundamental().representation()) {
+        switch (src_type.AsPrimitive().representation()) {
           case compiler::ffi::kInt8:  // Sign extend operand.
             __ movsxb(dst_reg, ByteRegisterOf(src_reg));
             return;
@@ -1410,7 +1410,7 @@
         ASSERT(dst_size == 4);
         __ movl(dst_reg, src_addr);
       } else {
-        switch (src_type.AsFundamental().representation()) {
+        switch (src_type.AsPrimitive().representation()) {
           case compiler::ffi::kInt8:  // Sign extend operand.
             __ movsxb(dst_reg, src_addr);
             return;
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc b/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc
index 3f867c5..41e5961 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc
@@ -663,93 +663,13 @@
   __ Bind(&done);
 }
 
-// Optimize assignable type check by adding inlined tests for:
-// - NULL -> return NULL.
-// - Smi -> compile time subtype check (only if dst class is not parameterized).
-// - Class equality (only if class is not parameterized).
-// Inputs:
-// - RAX: object.
-// - RBX: destination type (if non-constant).
-// - RDX: instantiator type arguments or raw_null.
-// - RCX: function type arguments or raw_null.
-// Returns:
-// - object in RAX for successful assignable check (or throws TypeError).
-// Performance notes: positive checks must be quick, negative checks can be slow
-// as they throw an exception.
-void FlowGraphCompiler::GenerateAssertAssignable(CompileType* receiver_type,
-                                                 TokenPosition token_pos,
-                                                 intptr_t deopt_id,
-                                                 const String& dst_name,
-                                                 LocationSummary* locs) {
-  ASSERT(!token_pos.IsClassifying());
-  ASSERT(CheckAssertAssignableTypeTestingABILocations(*locs));
-
-  if (locs->in(1).IsConstant()) {
-    const auto& dst_type = AbstractType::Cast(locs->in(1).constant());
-    ASSERT(dst_type.IsFinalized());
-
-    if (dst_type.IsTopTypeForSubtyping()) return;  // No code needed.
-
-    GenerateAssertAssignableViaTypeTestingStub(receiver_type, token_pos,
-                                               deopt_id, dst_name, locs);
-    return;
-  } else {
-    // TODO(dartbug.com/40813): Handle setting up the non-constant case.
-    UNREACHABLE();
-  }
-}
-
-void FlowGraphCompiler::GenerateAssertAssignableViaTypeTestingStub(
-    CompileType* receiver_type,
-    TokenPosition token_pos,
-    intptr_t deopt_id,
-    const String& dst_name,
-    LocationSummary* locs) {
-  ASSERT(CheckAssertAssignableTypeTestingABILocations(*locs));
-  // We must have a constant dst_type for generating a call to the stub.
-  ASSERT(locs->in(1).IsConstant());
-  const auto& dst_type = AbstractType::Cast(locs->in(1).constant());
-
-  // If the dst_type is instantiated we know the target TTS stub at
-  // compile-time and can therefore use a pc-relative call.
-  const bool use_pc_relative_call =
-      dst_type.IsInstantiated() && CanPcRelativeCall(dst_type);
-  const Register kScratchReg =
-      dst_type.IsTypeParameter() ? RSI : TypeTestABI::kDstTypeReg;
-
-  const Register kRegToCall = use_pc_relative_call ? kNoRegister : kScratchReg;
-
-  compiler::Label done;
-
-  GenerateAssertAssignableViaTypeTestingStub(receiver_type, dst_type, dst_name,
-                                             kRegToCall, kScratchReg, &done);
-
-  // We use 2 consecutive entries in the pool for the subtype cache and the
-  // destination name.  The second entry, namely [dst_name] seems to be unused,
-  // but it will be used by the code throwing a TypeError if the type test fails
-  // (see runtime/vm/runtime_entry.cc:TypeCheck).  It will use pattern matching
-  // on the call site to find out at which pool index the destination name is
-  // located.
-  const intptr_t sub_type_cache_index = __ object_pool_builder().AddObject(
-      Object::null_object(), compiler::ObjectPoolBuilderEntry::kPatchable);
-  const intptr_t sub_type_cache_offset =
-      ObjectPool::element_offset(sub_type_cache_index) - kHeapObjectTag;
-  const intptr_t dst_name_index = __ object_pool_builder().AddObject(
-      dst_name, compiler::ObjectPoolBuilderEntry::kPatchable);
-  ASSERT((sub_type_cache_index + 1) == dst_name_index);
-  ASSERT(__ constant_pool_allowed());
-
-  __ movq(TypeTestABI::kSubtypeTestCacheReg,
-          compiler::Address(PP, sub_type_cache_offset));
-  if (use_pc_relative_call) {
-    __ GenerateUnRelocatedPcRelativeCall();
-    AddPcRelativeTTSCallTypeTarget(dst_type);
-  } else {
-    __ call(compiler::FieldAddress(
-        kRegToCall, AbstractType::type_test_stub_entry_point_offset()));
-  }
-  EmitCallsiteMetadata(token_pos, deopt_id, PcDescriptorsLayout::kOther, locs);
-  __ Bind(&done);
+void FlowGraphCompiler::GenerateIndirectTTSCall(Register reg_to_call,
+                                                intptr_t sub_type_cache_index) {
+  __ LoadWordFromPoolIndex(TypeTestABI::kSubtypeTestCacheReg,
+                           sub_type_cache_index);
+  __ Call(compiler::FieldAddress(
+      reg_to_call,
+      compiler::target::AbstractType::type_test_stub_entry_point_offset()));
 }
 
 void FlowGraphCompiler::EmitInstructionEpilogue(Instruction* instr) {
@@ -1434,8 +1354,8 @@
   ASSERT(src_type.IsFloat() == dst_type.IsFloat());
   ASSERT(src_type.IsInt() == dst_type.IsInt());
   ASSERT(src_type.IsSigned() == dst_type.IsSigned());
-  ASSERT(src_type.IsFundamental());
-  ASSERT(dst_type.IsFundamental());
+  ASSERT(src_type.IsPrimitive());
+  ASSERT(dst_type.IsPrimitive());
   const intptr_t src_size = src_type.SizeInBytes();
   const intptr_t dst_size = dst_type.SizeInBytes();
   const bool sign_or_zero_extend = dst_size > src_size;
@@ -1461,7 +1381,7 @@
             UNIMPLEMENTED();
         }
       } else {
-        switch (src_type.AsFundamental().representation()) {
+        switch (src_type.AsPrimitive().representation()) {
           case compiler::ffi::kInt8:  // Sign extend operand.
             __ movsxb(dst_reg, src_reg);
             return;
@@ -1559,7 +1479,7 @@
             UNIMPLEMENTED();
         }
       } else {
-        switch (src_type.AsFundamental().representation()) {
+        switch (src_type.AsPrimitive().representation()) {
           case compiler::ffi::kInt8:  // Sign extend operand.
             __ movsxb(dst_reg, src_addr);
             return;
diff --git a/runtime/vm/compiler/backend/il.cc b/runtime/vm/compiler/backend/il.cc
index 689ef3d..8d8abf9 100644
--- a/runtime/vm/compiler/backend/il.cc
+++ b/runtime/vm/compiler/backend/il.cc
@@ -16,7 +16,10 @@
 #include "vm/compiler/backend/loops.h"
 #include "vm/compiler/backend/range_analysis.h"
 #include "vm/compiler/ffi/frame_rebase.h"
+#include "vm/compiler/ffi/marshaller.h"
 #include "vm/compiler/ffi/native_calling_convention.h"
+#include "vm/compiler/ffi/native_location.h"
+#include "vm/compiler/ffi/native_type.h"
 #include "vm/compiler/frontend/flow_graph_builder.h"
 #include "vm/compiler/frontend/kernel_translation_helper.h"
 #include "vm/compiler/jit/compiler.h"
@@ -266,10 +269,14 @@
   Zone* zone = thread()->zone();
   GrowableArray<intptr_t> cids;
   SubclassFinder finder(zone, &cids, include_abstract);
-  if (use_subtype_test) {
-    finder.ScanImplementorClasses(dst_klass);
-  } else {
-    finder.ScanSubClasses(dst_klass);
+  {
+    SafepointReadRwLocker ml(thread(),
+                             thread()->isolate_group()->program_lock());
+    if (use_subtype_test) {
+      finder.ScanImplementorClasses(dst_klass);
+    } else {
+      finder.ScanSubClasses(dst_klass);
+    }
   }
 
   // Sort all collected cids.
@@ -772,8 +779,7 @@
       // 'function' is queued for optimized compilation
       count = FLAG_optimization_counter_threshold;
     } else {
-      // 'function' is queued for unoptimized compilation
-      count = FLAG_compilation_counter_threshold;
+      count = 0;
     }
   } else if (Code::IsOptimized(function.CurrentCode())) {
     // 'function' was optimized and stopped counting
@@ -990,9 +996,8 @@
 AllocateUninitializedContextInstr::AllocateUninitializedContextInstr(
     TokenPosition token_pos,
     intptr_t num_context_variables)
-    : token_pos_(token_pos),
-      num_context_variables_(num_context_variables),
-      identity_(AliasIdentity::Unknown()) {
+    : TemplateAllocation(token_pos),
+      num_context_variables_(num_context_variables) {
   // This instruction is not used in AOT for code size reasons.
   ASSERT(!CompilerState::Current().is_aot());
 }
@@ -1227,6 +1232,15 @@
   return constant->value();
 }
 
+bool Value::BindsToSmiConstant() const {
+  return BindsToConstant() && BoundConstant().IsSmi();
+}
+
+intptr_t Value::BoundSmiConstant() const {
+  ASSERT(BindsToSmiConstant());
+  return Smi::Cast(BoundConstant()).Value();
+}
+
 GraphEntryInstr::GraphEntryInstr(const ParsedFunction& parsed_function,
                                  intptr_t osr_id)
     : GraphEntryInstr(parsed_function,
@@ -2708,6 +2722,7 @@
     case Slot::Kind::kArgumentsDescriptor_positional_count:
     case Slot::Kind::kArgumentsDescriptor_count:
     case Slot::Kind::kArgumentsDescriptor_size:
+    case Slot::Kind::kArrayElement:
     case Slot::Kind::kTypeArguments:
     case Slot::Kind::kTypedDataView_offset_in_bytes:
     case Slot::Kind::kTypedDataView_data:
@@ -2719,8 +2734,12 @@
     case Slot::Kind::kClosure_function_type_arguments:
     case Slot::Kind::kClosure_instantiator_type_arguments:
     case Slot::Kind::kClosure_hash:
+    case Slot::Kind::kClosureData_default_type_arguments:
+    case Slot::Kind::kClosureData_default_type_arguments_info:
     case Slot::Kind::kCapturedVariable:
     case Slot::Kind::kDartField:
+    case Slot::Kind::kFunction_data:
+    case Slot::Kind::kFunction_kind_tag:
     case Slot::Kind::kFunction_packed_fields:
     case Slot::Kind::kFunction_parameter_names:
     case Slot::Kind::kFunction_parameter_types:
@@ -2728,6 +2747,9 @@
     case Slot::Kind::kPointerBase_data_field:
     case Slot::Kind::kType_arguments:
     case Slot::Kind::kTypeArgumentsIndex:
+    case Slot::Kind::kTypeParameter_bound:
+    case Slot::Kind::kTypeParameter_flags:
+    case Slot::Kind::kTypeParameter_name:
     case Slot::Kind::kUnhandledException_exception:
     case Slot::Kind::kUnhandledException_stacktrace:
       return false;
@@ -2744,6 +2766,7 @@
   switch (cid) {
     case kArrayCid:
     case kImmutableArrayCid:
+    case kTypeArgumentsCid:
       return true;
     default:
       return false;
@@ -3767,6 +3790,9 @@
 
 BoxInstr* BoxInstr::Create(Representation from, Value* value) {
   switch (from) {
+    case kUnboxedUint8:
+      return new BoxUint8Instr(value);
+
     case kUnboxedInt32:
       return new BoxInt32Instr(value);
 
@@ -4152,6 +4178,42 @@
   UNREACHABLE();
 }
 
+void NativeEntryInstr::SaveArguments(FlowGraphCompiler* compiler) const {
+  __ Comment("SaveArguments");
+
+  // Save the argument registers, in reverse order.
+  for (intptr_t i = marshaller_.num_args(); i-- > 0;) {
+    SaveArgument(compiler, marshaller_.Location(i));
+  }
+
+  __ Comment("SaveArgumentsEnd");
+}
+
+void NativeEntryInstr::SaveArgument(
+    FlowGraphCompiler* compiler,
+    const compiler::ffi::NativeLocation& nloc) const {
+  if (nloc.IsStack()) return;
+
+  if (nloc.IsRegisters()) {
+    const auto& reg_loc = nloc.WidenTo4Bytes(compiler->zone()).AsRegisters();
+    const intptr_t num_regs = reg_loc.num_regs();
+    // Save higher-order component first, so bytes are in little-endian layout
+    // overall.
+    for (intptr_t i = num_regs - 1; i >= 0; i--) {
+      __ PushRegister(reg_loc.reg_at(i));
+    }
+  } else if (nloc.IsFpuRegisters()) {
+    // TODO(dartbug.com/40469): Reduce code size.
+    __ AddImmediate(SPREG, -8);
+    NoTemporaryAllocator temp_alloc;
+    const auto& dst = compiler::ffi::NativeStackLocation(
+        nloc.payload_type(), nloc.payload_type(), SPREG, 0);
+    compiler->EmitNativeMove(dst, nloc, &temp_alloc);
+  } else {
+    UNREACHABLE();
+  }
+}
+
 LocationSummary* OsrEntryInstr::MakeLocationSummary(Zone* zone,
                                                     bool optimizing) const {
   UNREACHABLE();
@@ -4262,6 +4324,18 @@
 void LoadFieldInstr::EmitNativeCodeForInitializerCall(
     FlowGraphCompiler* compiler) {
   ASSERT(calls_initializer());
+
+  if (throw_exception_on_initialization()) {
+    ThrowErrorSlowPathCode* slow_path =
+        new LateInitializationErrorSlowPath(this, compiler->CurrentTryIndex());
+    compiler->AddSlowPathCode(slow_path);
+
+    const Register result_reg = locs()->out(0).reg();
+    __ CompareObject(result_reg, Object::sentinel());
+    __ BranchIf(EQUAL, slow_path->entry_label());
+    return;
+  }
+
   ASSERT(locs()->in(0).reg() == InitInstanceFieldABI::kInstanceReg);
   ASSERT(locs()->out(0).reg() == InitInstanceFieldABI::kResultReg);
   ASSERT(slot().IsDartField());
@@ -4439,10 +4513,10 @@
   // for the two frame pointers and two return addresses of the entry frame.
   constexpr intptr_t kEntryFramePadding = 4;
   compiler::ffi::FrameRebase rebase(
+      compiler->zone(),
       /*old_base=*/SPREG, /*new_base=*/FPREG,
       (-kExitLinkSlotFromEntryFp + kEntryFramePadding) *
-          compiler::target::kWordSize,
-      compiler->zone());
+          compiler::target::kWordSize);
   const auto& src =
       rebase.Rebase(marshaller_.NativeLocationOfNativeParameter(index_));
   NoTemporaryAllocator no_temp;
@@ -4763,10 +4837,8 @@
 
   UpdateReceiverSminess(zone);
 
-  if ((compiler->is_optimizing() || compiler->function().HasBytecode()) &&
-      HasICData()) {
-    ASSERT(HasICData());
-    if (compiler->is_optimizing() && (ic_data()->NumberOfUsedChecks() > 0)) {
+  if (compiler->is_optimizing() && HasICData()) {
+    if (ic_data()->NumberOfUsedChecks() > 0) {
       const ICData& unary_ic_data =
           ICData::ZoneHandle(zone, ic_data()->AsUnaryClassChecks());
       compiler->GenerateInstanceCall(deopt_id(), token_pos(), locs(),
@@ -5219,36 +5291,40 @@
 
 LocationSummary* AssertSubtypeInstr::MakeLocationSummary(Zone* zone,
                                                          bool opt) const {
-  if (!sub_type()->BindsToConstant() || !super_type()->BindsToConstant()) {
-    // TODO(dartbug.com/40813): Handle setting up the non-constant case.
-    UNREACHABLE();
-  }
-  const intptr_t kNumInputs = 4;
+  const intptr_t kNumInputs = 5;
   const intptr_t kNumTemps = 0;
   LocationSummary* summary = new (zone)
       LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
-  summary->set_in(0, Location::RegisterLocation(
-                         TypeTestABI::kInstantiatorTypeArgumentsReg));
+  summary->set_in(kInstantiatorTAVPos,
+                  Location::RegisterLocation(
+                      AssertSubtypeABI::kInstantiatorTypeArgumentsReg));
   summary->set_in(
-      1, Location::RegisterLocation(TypeTestABI::kFunctionTypeArgumentsReg));
-  summary->set_in(2,
-                  Location::Constant(sub_type()->definition()->AsConstant()));
-  summary->set_in(3,
-                  Location::Constant(super_type()->definition()->AsConstant()));
+      kFunctionTAVPos,
+      Location::RegisterLocation(AssertSubtypeABI::kFunctionTypeArgumentsReg));
+  summary->set_in(kSubTypePos,
+                  Location::RegisterLocation(AssertSubtypeABI::kSubTypeReg));
+  summary->set_in(kSuperTypePos,
+                  Location::RegisterLocation(AssertSubtypeABI::kSuperTypeReg));
+  summary->set_in(kDstNamePos,
+                  Location::RegisterLocation(AssertSubtypeABI::kDstNameReg));
   return summary;
 }
 
 void AssertSubtypeInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  __ PushRegister(locs()->in(0).reg());
-  __ PushRegister(locs()->in(1).reg());
-  __ PushObject(locs()->in(2).constant());
-  __ PushObject(locs()->in(3).constant());
-  __ PushObject(dst_name());
-
+#if defined(TARGET_ARCH_IA32)
+  __ PushRegister(AssertSubtypeABI::kInstantiatorTypeArgumentsReg);
+  __ PushRegister(AssertSubtypeABI::kFunctionTypeArgumentsReg);
+  __ PushRegister(AssertSubtypeABI::kSubTypeReg);
+  __ PushRegister(AssertSubtypeABI::kSuperTypeReg);
+  __ PushRegister(AssertSubtypeABI::kDstNameReg);
   compiler->GenerateRuntimeCall(token_pos(), deopt_id(),
                                 kSubtypeCheckRuntimeEntry, 5, locs());
 
   __ Drop(5);
+#else
+  compiler->GenerateStubCall(token_pos(), StubCode::AssertSubtype(),
+                             PcDescriptorsLayout::kOther, locs());
+#endif
 }
 
 LocationSummary* DeoptimizeInstr::MakeLocationSummary(Zone* zone,
@@ -5310,7 +5386,9 @@
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
   LocationSummary* locs = new (zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kCallOnSharedSlowPath);
+      zone, kNumInputs, kNumTemps,
+      UseSharedSlowPathStub(opt) ? LocationSummary::kCallOnSharedSlowPath
+                                 : LocationSummary::kCallOnSlowPath);
   locs->set_in(kLengthPos,
                Location::RegisterLocation(RangeErrorABI::kLengthReg));
   locs->set_in(kIndexPos, Location::RegisterLocation(RangeErrorABI::kIndexReg));
@@ -5605,14 +5683,10 @@
   return true;
 }
 
-static bool BindsToSmiConstant(Value* value) {
-  return value->BindsToConstant() && value->BoundConstant().IsSmi();
-}
-
 bool IfThenElseInstr::Supports(ComparisonInstr* comparison,
                                Value* v1,
                                Value* v2) {
-  bool is_smi_result = BindsToSmiConstant(v1) && BindsToSmiConstant(v2);
+  bool is_smi_result = v1->BindsToSmiConstant() && v2->BindsToSmiConstant();
   if (comparison->IsStrictCompare()) {
     // Strict comparison with number checks calls a stub and is not supported
     // by if-conversion.
@@ -6128,8 +6202,9 @@
   const Register saved_fp = locs()->temp(0).reg();
   const Register temp = locs()->temp(1).reg();
 
-  compiler::ffi::FrameRebase rebase(/*old_base=*/FPREG, /*new_base=*/saved_fp,
-                                    /*stack_delta=*/0, zone_);
+  compiler::ffi::FrameRebase rebase(zone_, /*old_base=*/FPREG,
+                                    /*new_base=*/saved_fp,
+                                    /*stack_delta=*/0);
   for (intptr_t i = 0, n = NativeArgCount(); i < n; ++i) {
     const Location origin = rebase.Rebase(locs()->in(i));
     const Representation origin_rep = RequiredInputRepresentation(i);
diff --git a/runtime/vm/compiler/backend/il.h b/runtime/vm/compiler/backend/il.h
index 3cab656..6e4fe72 100644
--- a/runtime/vm/compiler/backend/il.h
+++ b/runtime/vm/compiler/backend/il.h
@@ -163,6 +163,12 @@
   // Assert if BindsToConstant() is false, otherwise returns the constant value.
   const Object& BoundConstant() const;
 
+  // Return true if the value represents Smi constant.
+  bool BindsToSmiConstant() const;
+
+  // Return value of represented Smi constant.
+  intptr_t BoundSmiConstant() const;
+
   // Return true if storing the value into a heap object requires applying the
   // write barrier. Can change the reaching type of the Value or other Values
   // in the same chain of redefinitions.
@@ -498,6 +504,7 @@
   M(UnboxUint32, kNoGC)                                                        \
   M(BoxInt32, _)                                                               \
   M(UnboxInt32, kNoGC)                                                         \
+  M(BoxUint8, _)                                                               \
   M(IntConverter, _)                                                           \
   M(BitCast, _)                                                                \
   M(Deoptimize, kNoGC)                                                         \
@@ -505,6 +512,7 @@
 
 #define FOR_EACH_ABSTRACT_INSTRUCTION(M)                                       \
   M(Allocation, _)                                                             \
+  M(ArrayAllocation, _)                                                        \
   M(BinaryIntegerOp, _)                                                        \
   M(BlockEntry, _)                                                             \
   M(BoxInteger, _)                                                             \
@@ -1910,6 +1918,7 @@
   PRINT_TO_SUPPORT
 
  private:
+  void SaveArguments(FlowGraphCompiler* compiler) const;
   void SaveArgument(FlowGraphCompiler* compiler,
                     const compiler::ffi::NativeLocation& loc) const;
 
@@ -3541,34 +3550,42 @@
 // Checks that one type is a subtype of another (e.g. for type parameter bounds
 // checking). Throws a TypeError otherwise. Both types are instantiated at
 // runtime as necessary.
-class AssertSubtypeInstr : public TemplateInstruction<4, Throws, Pure> {
+class AssertSubtypeInstr : public TemplateInstruction<5, Throws, Pure> {
  public:
+  enum {
+    kInstantiatorTAVPos = 0,
+    kFunctionTAVPos = 1,
+    kSubTypePos = 2,
+    kSuperTypePos = 3,
+    kDstNamePos = 4,
+  };
+
   AssertSubtypeInstr(TokenPosition token_pos,
                      Value* instantiator_type_arguments,
                      Value* function_type_arguments,
                      Value* sub_type,
                      Value* super_type,
-                     const String& dst_name,
+                     Value* dst_name,
                      intptr_t deopt_id)
-      : TemplateInstruction(deopt_id),
-        token_pos_(token_pos),
-        dst_name_(String::ZoneHandle(dst_name.raw())) {
-    ASSERT(!dst_name.IsNull());
-    SetInputAt(0, instantiator_type_arguments);
-    SetInputAt(1, function_type_arguments);
-    SetInputAt(2, sub_type);
-    SetInputAt(3, super_type);
+      : TemplateInstruction(deopt_id), token_pos_(token_pos) {
+    SetInputAt(kInstantiatorTAVPos, instantiator_type_arguments);
+    SetInputAt(kFunctionTAVPos, function_type_arguments);
+    SetInputAt(kSubTypePos, sub_type);
+    SetInputAt(kSuperTypePos, super_type);
+    SetInputAt(kDstNamePos, dst_name);
   }
 
   DECLARE_INSTRUCTION(AssertSubtype);
 
-  Value* instantiator_type_arguments() const { return inputs_[0]; }
-  Value* function_type_arguments() const { return inputs_[1]; }
-  Value* sub_type() const { return inputs_[2]; }
-  Value* super_type() const { return inputs_[3]; }
+  Value* instantiator_type_arguments() const {
+    return inputs_[kInstantiatorTAVPos];
+  }
+  Value* function_type_arguments() const { return inputs_[kFunctionTAVPos]; }
+  Value* sub_type() const { return inputs_[kSubTypePos]; }
+  Value* super_type() const { return inputs_[kSuperTypePos]; }
+  Value* dst_name() const { return inputs_[kDstNamePos]; }
 
   virtual TokenPosition token_pos() const { return token_pos_; }
-  const String& dst_name() const { return dst_name_; }
 
   virtual bool ComputeCanDeoptimize() const {
     return !CompilerState::Current().is_aot();
@@ -3584,7 +3601,6 @@
 
  private:
   const TokenPosition token_pos_;
-  const String& dst_name_;
 
   DISALLOW_COPY_AND_ASSIGN(AssertSubtypeInstr);
 };
@@ -5953,8 +5969,16 @@
 // either reside in new space or be in the store buffer.
 class AllocationInstr : public Definition {
  public:
-  explicit AllocationInstr(intptr_t deopt_id = DeoptId::kNone)
-      : Definition(deopt_id) {}
+  explicit AllocationInstr(TokenPosition token_pos,
+                           intptr_t deopt_id = DeoptId::kNone)
+      : Definition(deopt_id),
+        token_pos_(token_pos),
+        identity_(AliasIdentity::Unknown()) {}
+
+  virtual TokenPosition token_pos() const { return token_pos_; }
+
+  virtual AliasIdentity Identity() const { return identity_; }
+  virtual void SetIdentity(AliasIdentity identity) { identity_ = identity; }
 
   // TODO(sjindel): Update these conditions when the incremental write barrier
   // is added.
@@ -5963,14 +5987,18 @@
   DEFINE_INSTRUCTION_TYPE_CHECK(Allocation);
 
  private:
+  const TokenPosition token_pos_;
+  AliasIdentity identity_;
+
   DISALLOW_COPY_AND_ASSIGN(AllocationInstr);
 };
 
 template <intptr_t N, typename ThrowsTrait>
 class TemplateAllocation : public AllocationInstr {
  public:
-  explicit TemplateAllocation(intptr_t deopt_id = DeoptId::kNone)
-      : AllocationInstr(deopt_id), inputs_() {}
+  explicit TemplateAllocation(TokenPosition token_pos,
+                              intptr_t deopt_id = DeoptId::kNone)
+      : AllocationInstr(token_pos, deopt_id), inputs_() {}
 
   virtual intptr_t InputCount() const { return N; }
   virtual Value* InputAt(intptr_t i) const { return inputs_[i]; }
@@ -5992,10 +6020,9 @@
   AllocateObjectInstr(TokenPosition token_pos,
                       const Class& cls,
                       Value* type_arguments = nullptr)
-      : token_pos_(token_pos),
+      : AllocationInstr(token_pos),
         cls_(cls),
         type_arguments_(type_arguments),
-        identity_(AliasIdentity::Unknown()),
         closure_function_(Function::ZoneHandle()) {
     ASSERT((cls.NumTypeArguments() > 0) == (type_arguments != nullptr));
     if (type_arguments != nullptr) {
@@ -6007,7 +6034,6 @@
   virtual CompileType ComputeType() const;
 
   const Class& cls() const { return cls_; }
-  virtual TokenPosition token_pos() const { return token_pos_; }
   Value* type_arguments() const { return type_arguments_; }
 
   const Function& closure_function() const { return closure_function_; }
@@ -6029,9 +6055,6 @@
 
   virtual bool HasUnknownSideEffects() const { return false; }
 
-  virtual AliasIdentity Identity() const { return identity_; }
-  virtual void SetIdentity(AliasIdentity identity) { identity_ = identity; }
-
   virtual bool WillAllocateNewOrRemembered() const {
     return WillAllocateNewOrRemembered(cls());
   }
@@ -6051,10 +6074,8 @@
     type_arguments_ = value;
   }
 
-  const TokenPosition token_pos_;
   const Class& cls_;
   Value* type_arguments_;
-  AliasIdentity identity_;
   Function& closure_function_;
 
   DISALLOW_COPY_AND_ASSIGN(AllocateObjectInstr);
@@ -6069,7 +6090,6 @@
   DECLARE_INSTRUCTION(AllocateUninitializedContext)
   virtual CompileType ComputeType() const;
 
-  virtual TokenPosition token_pos() const { return token_pos_; }
   intptr_t num_context_variables() const { return num_context_variables_; }
 
   virtual bool ComputeCanDeoptimize() const { return false; }
@@ -6081,15 +6101,10 @@
         num_context_variables_);
   }
 
-  virtual AliasIdentity Identity() const { return identity_; }
-  virtual void SetIdentity(AliasIdentity identity) { identity_ = identity; }
-
   PRINT_OPERANDS_TO_SUPPORT
 
  private:
-  const TokenPosition token_pos_;
   const intptr_t num_context_variables_;
-  AliasIdentity identity_;
 
   DISALLOW_COPY_AND_ASSIGN(AllocateUninitializedContextInstr);
 };
@@ -6099,15 +6114,17 @@
 // It does not produce any real code only deoptimization information.
 class MaterializeObjectInstr : public Definition {
  public:
-  MaterializeObjectInstr(AllocateObjectInstr* allocation,
+  MaterializeObjectInstr(AllocationInstr* allocation,
+                         const Class& cls,
+                         intptr_t num_elements,
                          const ZoneGrowableArray<const Slot*>& slots,
                          ZoneGrowableArray<Value*>* values)
       : allocation_(allocation),
-        cls_(allocation->cls()),
-        num_variables_(-1),
+        cls_(cls),
+        num_elements_(num_elements),
         slots_(slots),
         values_(values),
-        locations_(NULL),
+        locations_(nullptr),
         visited_for_liveness_(false),
         registers_remapped_(false) {
     ASSERT(slots_.length() == values_->length());
@@ -6117,28 +6134,10 @@
     }
   }
 
-  MaterializeObjectInstr(AllocateUninitializedContextInstr* allocation,
-                         const ZoneGrowableArray<const Slot*>& slots,
-                         ZoneGrowableArray<Value*>* values)
-      : allocation_(allocation),
-        cls_(Class::ZoneHandle(Object::context_class())),
-        num_variables_(allocation->num_context_variables()),
-        slots_(slots),
-        values_(values),
-        locations_(NULL),
-        visited_for_liveness_(false),
-        registers_remapped_(false) {
-    ASSERT(slots_.length() == values_->length());
-    for (intptr_t i = 0; i < InputCount(); i++) {
-      InputAt(i)->set_instruction(this);
-      InputAt(i)->set_use_index(i);
-    }
-  }
-
-  Definition* allocation() const { return allocation_; }
+  AllocationInstr* allocation() const { return allocation_; }
   const Class& cls() const { return cls_; }
 
-  intptr_t num_variables() const { return num_variables_; }
+  intptr_t num_elements() const { return num_elements_; }
 
   intptr_t FieldOffsetAt(intptr_t i) const {
     return slots_[i]->offset_in_bytes();
@@ -6182,9 +6181,9 @@
     (*values_)[i] = value;
   }
 
-  Definition* allocation_;
+  AllocationInstr* allocation_;
   const Class& cls_;
-  intptr_t num_variables_;
+  intptr_t num_elements_;
   const ZoneGrowableArray<const Slot*>& slots_;
   ZoneGrowableArray<Value*>* values_;
   Location* locations_;
@@ -6195,15 +6194,51 @@
   DISALLOW_COPY_AND_ASSIGN(MaterializeObjectInstr);
 };
 
-class CreateArrayInstr : public TemplateAllocation<2, Throws> {
+class ArrayAllocationInstr : public AllocationInstr {
+ public:
+  explicit ArrayAllocationInstr(TokenPosition token_pos, intptr_t deopt_id)
+      : AllocationInstr(token_pos, deopt_id) {}
+
+  virtual Value* num_elements() const = 0;
+
+  bool HasConstantNumElements() const {
+    return num_elements()->BindsToSmiConstant();
+  }
+  intptr_t GetConstantNumElements() const {
+    return num_elements()->BoundSmiConstant();
+  }
+
+  DEFINE_INSTRUCTION_TYPE_CHECK(ArrayAllocation);
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(ArrayAllocationInstr);
+};
+
+template <intptr_t N, typename ThrowsTrait>
+class TemplateArrayAllocation : public ArrayAllocationInstr {
+ public:
+  explicit TemplateArrayAllocation(TokenPosition token_pos, intptr_t deopt_id)
+      : ArrayAllocationInstr(token_pos, deopt_id), inputs_() {}
+
+  virtual intptr_t InputCount() const { return N; }
+  virtual Value* InputAt(intptr_t i) const { return inputs_[i]; }
+
+  virtual bool MayThrow() const { return ThrowsTrait::kCanThrow; }
+
+ protected:
+  EmbeddedArray<Value*, N> inputs_;
+
+ private:
+  virtual void RawSetInputAt(intptr_t i, Value* value) { inputs_[i] = value; }
+};
+
+class CreateArrayInstr : public TemplateArrayAllocation<2, Throws> {
  public:
   CreateArrayInstr(TokenPosition token_pos,
                    Value* element_type,
                    Value* num_elements,
                    intptr_t deopt_id)
-      : TemplateAllocation(deopt_id),
-        token_pos_(token_pos),
-        identity_(AliasIdentity::Unknown()) {
+      : TemplateArrayAllocation(token_pos, deopt_id) {
     SetInputAt(kElementTypePos, element_type);
     SetInputAt(kLengthPos, num_elements);
   }
@@ -6213,9 +6248,8 @@
   DECLARE_INSTRUCTION(CreateArray)
   virtual CompileType ComputeType() const;
 
-  virtual TokenPosition token_pos() const { return token_pos_; }
   Value* element_type() const { return inputs_[kElementTypePos]; }
-  Value* num_elements() const { return inputs_[kLengthPos]; }
+  virtual Value* num_elements() const { return inputs_[kLengthPos]; }
 
   // Throw needs environment, which is created only if instruction can
   // deoptimize.
@@ -6225,35 +6259,24 @@
 
   virtual bool HasUnknownSideEffects() const { return false; }
 
-  virtual AliasIdentity Identity() const { return identity_; }
-  virtual void SetIdentity(AliasIdentity identity) { identity_ = identity; }
-
   virtual bool WillAllocateNewOrRemembered() const {
     // Large arrays will use cards instead; cannot skip write barrier.
-    if (!num_elements()->BindsToConstant()) return false;
-    const Object& length = num_elements()->BoundConstant();
-    if (!length.IsSmi()) return false;
+    if (!HasConstantNumElements()) return false;
     return compiler::target::WillAllocateNewOrRememberedArray(
-        Smi::Cast(length).Value());
+        GetConstantNumElements());
   }
 
  private:
-  const TokenPosition token_pos_;
-  AliasIdentity identity_;
-
   DISALLOW_COPY_AND_ASSIGN(CreateArrayInstr);
 };
 
-class AllocateTypedDataInstr : public TemplateAllocation<1, Throws> {
+class AllocateTypedDataInstr : public TemplateArrayAllocation<1, Throws> {
  public:
   AllocateTypedDataInstr(TokenPosition token_pos,
                          classid_t class_id,
                          Value* num_elements,
                          intptr_t deopt_id)
-      : TemplateAllocation(deopt_id),
-        token_pos_(token_pos),
-        class_id_(class_id),
-        identity_(AliasIdentity::Unknown()) {
+      : TemplateArrayAllocation(token_pos, deopt_id), class_id_(class_id) {
     SetInputAt(kLengthPos, num_elements);
   }
 
@@ -6262,9 +6285,8 @@
   DECLARE_INSTRUCTION(AllocateTypedData)
   virtual CompileType ComputeType() const;
 
-  virtual TokenPosition token_pos() const { return token_pos_; }
   classid_t class_id() const { return class_id_; }
-  Value* num_elements() const { return inputs_[kLengthPos]; }
+  virtual Value* num_elements() const { return inputs_[kLengthPos]; }
 
   // Throw needs environment, which is created only if instruction can
   // deoptimize.
@@ -6274,18 +6296,13 @@
 
   virtual bool HasUnknownSideEffects() const { return false; }
 
-  virtual AliasIdentity Identity() const { return identity_; }
-  virtual void SetIdentity(AliasIdentity identity) { identity_ = identity; }
-
   virtual bool WillAllocateNewOrRemembered() const {
     // No write barriers are generated for typed data accesses.
     return false;
   }
 
  private:
-  const TokenPosition token_pos_;
-  classid_t class_id_;
-  AliasIdentity identity_;
+  const classid_t class_id_;
 
   DISALLOW_COPY_AND_ASSIGN(AllocateTypedDataInstr);
 };
@@ -6430,10 +6447,17 @@
       : TemplateDefinition(deopt_id),
         slot_(slot),
         token_pos_(token_pos),
-        calls_initializer_(calls_initializer) {
+        calls_initializer_(calls_initializer),
+        throw_exception_on_initialization_(false) {
     ASSERT(!calls_initializer || (deopt_id != DeoptId::kNone));
     ASSERT(!calls_initializer || slot.IsDartField());
     SetInputAt(0, instance);
+    if (calls_initializer_) {
+      const Field& field = slot.field();
+      throw_exception_on_initialization_ = !field.needs_load_guard() &&
+                                           field.is_late() &&
+                                           !field.has_initializer();
+    }
   }
 
   Value* instance() const { return inputs_[0]; }
@@ -6444,6 +6468,15 @@
   bool calls_initializer() const { return calls_initializer_; }
   void set_calls_initializer(bool value) { calls_initializer_ = value; }
 
+  bool throw_exception_on_initialization() const {
+    return throw_exception_on_initialization_;
+  }
+
+  // Slow path is used if load throws exception on initialization.
+  virtual bool UseSharedSlowPathStub(bool is_optimizing) const {
+    return SlowPathSharingSupported(is_optimizing);
+  }
+
   virtual Representation representation() const;
 
   // Returns whether this instruction is an unboxed load from a _boxed_ Dart
@@ -6459,7 +6492,11 @@
   virtual CompileType ComputeType() const;
 
   virtual bool ComputeCanDeoptimize() const { return calls_initializer(); }
-  virtual bool HasUnknownSideEffects() const { return calls_initializer(); }
+
+  virtual bool HasUnknownSideEffects() const {
+    return calls_initializer() && !throw_exception_on_initialization();
+  }
+
   virtual bool CanTriggerGC() const { return calls_initializer(); }
   virtual bool MayThrow() const { return calls_initializer(); }
 
@@ -6505,6 +6542,7 @@
   const Slot& slot_;
   const TokenPosition token_pos_;
   bool calls_initializer_;
+  bool throw_exception_on_initialization_;
 
   DISALLOW_COPY_AND_ASSIGN(LoadFieldInstr);
 };
@@ -6557,15 +6595,9 @@
         token_pos_(token_pos),
         instantiator_class_(instantiator_class),
         function_(function) {
-    // These asserts hold for current uses.
-    ASSERT(type_arguments->BindsToConstant());
-    // Note: Non-dynamic uses never provide a null TypeArguments value.
-    ASSERT(!type_arguments->BoundConstant().IsNull());
-    ASSERT(type_arguments->BoundConstant().IsTypeArguments());
-    ASSERT(instantiator_class.IsZoneHandle());
-    ASSERT(!instantiator_class.IsNull());
-    ASSERT(function.IsZoneHandle());
-    ASSERT(!function.IsNull());
+    ASSERT(instantiator_class.IsReadOnlyHandle() ||
+           instantiator_class.IsZoneHandle());
+    ASSERT(function.IsReadOnlyHandle() || function.IsZoneHandle());
     SetInputAt(0, instantiator_type_arguments);
     SetInputAt(1, function_type_arguments);
     SetInputAt(2, type_arguments);
@@ -6588,20 +6620,35 @@
 
   virtual Definition* Canonicalize(FlowGraph* flow_graph);
 
-  const Code& GetStub() const {
-    bool with_runtime_check;
-    ASSERT(!instantiator_class().IsNull());
-    ASSERT(!function().IsNull());
-    ASSERT(type_arguments()->BindsToConstant());
-    ASSERT(type_arguments()->BoundConstant().IsTypeArguments());
+  bool CanShareInstantiatorTypeArguments(
+      bool* with_runtime_check = nullptr) const {
+    if (instantiator_class().IsNull() || !type_arguments()->BindsToConstant() ||
+        !type_arguments()->BoundConstant().IsTypeArguments()) {
+      return false;
+    }
     const auto& type_args =
         TypeArguments::Cast(type_arguments()->BoundConstant());
-    if (type_args.CanShareInstantiatorTypeArguments(instantiator_class(),
-                                                    &with_runtime_check)) {
+    return type_args.CanShareInstantiatorTypeArguments(instantiator_class(),
+                                                       with_runtime_check);
+  }
+
+  bool CanShareFunctionTypeArguments(bool* with_runtime_check = nullptr) const {
+    if (function().IsNull() || !type_arguments()->BindsToConstant() ||
+        !type_arguments()->BoundConstant().IsTypeArguments()) {
+      return false;
+    }
+    const auto& type_args =
+        TypeArguments::Cast(type_arguments()->BoundConstant());
+    return type_args.CanShareFunctionTypeArguments(function(),
+                                                   with_runtime_check);
+  }
+
+  const Code& GetStub() const {
+    bool with_runtime_check;
+    if (CanShareInstantiatorTypeArguments(&with_runtime_check)) {
       ASSERT(with_runtime_check);
       return StubCode::InstantiateTypeArgumentsMayShareInstantiatorTA();
-    } else if (type_args.CanShareFunctionTypeArguments(function(),
-                                                       &with_runtime_check)) {
+    } else if (CanShareFunctionTypeArguments(&with_runtime_check)) {
       ASSERT(with_runtime_check);
       return StubCode::InstantiateTypeArgumentsMayShareFunctionTA();
     }
@@ -6624,12 +6671,11 @@
  public:
   AllocateContextInstr(TokenPosition token_pos,
                        const ZoneGrowableArray<const Slot*>& context_slots)
-      : token_pos_(token_pos), context_slots_(context_slots) {}
+      : TemplateAllocation(token_pos), context_slots_(context_slots) {}
 
   DECLARE_INSTRUCTION(AllocateContext)
   virtual CompileType ComputeType() const;
 
-  virtual TokenPosition token_pos() const { return token_pos_; }
   const ZoneGrowableArray<const Slot*>& context_slots() const {
     return context_slots_;
   }
@@ -6648,7 +6694,6 @@
   PRINT_OPERANDS_TO_SUPPORT
 
  private:
-  const TokenPosition token_pos_;
   const ZoneGrowableArray<const Slot*>& context_slots_;
 
   DISALLOW_COPY_AND_ASSIGN(AllocateContextInstr);
@@ -6801,6 +6846,18 @@
   DISALLOW_COPY_AND_ASSIGN(BoxIntegerInstr);
 };
 
+class BoxUint8Instr : public BoxIntegerInstr {
+ public:
+  explicit BoxUint8Instr(Value* value)
+      : BoxIntegerInstr(kUnboxedUint8, value) {}
+
+  virtual bool ValueFitsSmi() const { return true; }
+
+  DECLARE_INSTRUCTION(BoxUint8)
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(BoxUint8Instr);
+};
 class BoxInteger32Instr : public BoxIntegerInstr {
  public:
   BoxInteger32Instr(Representation representation, Value* value)
diff --git a/runtime/vm/compiler/backend/il_arm.cc b/runtime/vm/compiler/backend/il_arm.cc
index f678487..cbedc5b 100644
--- a/runtime/vm/compiler/backend/il_arm.cc
+++ b/runtime/vm/compiler/backend/il_arm.cc
@@ -1300,6 +1300,9 @@
 
   EmitParamMoves(compiler);
 
+  if (compiler::Assembler::EmittingComments()) {
+    __ Comment("Call");
+  }
   // We need to copy the return address up into the dummy stack frame so the
   // stack walker will know which safepoint to use.
   __ mov(TMP, compiler::Operand(PC));
@@ -1405,33 +1408,6 @@
   __ set_constant_pool_allowed(true);
 }
 
-void NativeEntryInstr::SaveArgument(
-    FlowGraphCompiler* compiler,
-    const compiler::ffi::NativeLocation& nloc) const {
-  if (nloc.IsFpuRegisters()) {
-    auto const& fpu_loc = nloc.AsFpuRegisters();
-    ASSERT(fpu_loc.fpu_reg_kind() != compiler::ffi::kQuadFpuReg);
-    const intptr_t size = fpu_loc.payload_type().SizeInBytes();
-    // TODO(dartbug.com/40469): Reduce code size.
-    __ SubImmediate(SPREG, SPREG, 8);
-    if (size == 8) {
-      __ StoreDToOffset(fpu_loc.fpu_d_reg(), SPREG, 0);
-    } else {
-      ASSERT(size == 4);
-      __ StoreSToOffset(fpu_loc.fpu_s_reg(), SPREG, 0);
-    }
-
-  } else if (nloc.IsRegisters()) {
-    const auto& reg_loc = nloc.WidenTo4Bytes(compiler->zone()).AsRegisters();
-    const intptr_t num_regs = reg_loc.num_regs();
-    // Save higher-order component first, so bytes are in little-endian layout
-    // overall.
-    for (intptr_t i = num_regs - 1; i >= 0; i--) {
-      __ Push(reg_loc.reg_at(i));
-    }
-  }
-}
-
 void NativeEntryInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   // Constant pool cannot be used until we enter the actual Dart frame.
   __ set_constant_pool_allowed(false);
@@ -1443,9 +1419,7 @@
   __ EnterFrame((1 << FP) | (1 << LR), 0);
 
   // Save the argument registers, in reverse order.
-  for (intptr_t i = marshaller_.num_args(); i-- > 0;) {
-    SaveArgument(compiler, marshaller_.Location(i));
-  }
+  SaveArguments(compiler);
 
   // Enter the entry frame.
   __ EnterFrame((1 << FP) | (1 << LR), 0);
@@ -1743,6 +1717,7 @@
   switch (class_id_) {
     case kArrayCid:
     case kImmutableArrayCid:
+    case kTypeArgumentsCid:
       return kTagged;
     case kOneByteStringCid:
     case kTwoByteStringCid:
@@ -2038,7 +2013,8 @@
     default: {
       const Register result = locs()->out(0).reg();
       ASSERT(representation() == kTagged);
-      ASSERT((class_id() == kArrayCid) || (class_id() == kImmutableArrayCid));
+      ASSERT((class_id() == kArrayCid) || (class_id() == kImmutableArrayCid) ||
+             (class_id() == kTypeArgumentsCid));
       __ ldr(result, element_address);
       break;
     }
@@ -3223,35 +3199,17 @@
 LocationSummary* LoadFieldInstr::MakeLocationSummary(Zone* zone,
                                                      bool opt) const {
   const intptr_t kNumInputs = 1;
-
-  const intptr_t kNumTemps =
-      (slot().representation() != kTagged)
-          ? 0
-          : ((IsUnboxedDartFieldLoad() && opt)
-                 ? (FLAG_precompiled_mode ? 0 : 1)
-                 : (IsPotentialUnboxedDartFieldLoad() ? 3 : 0));
-
-  const auto contains_call =
-      (slot().representation() != kTagged)
-          ? LocationSummary::kNoCall
-          : ((IsUnboxedDartFieldLoad() && opt)
-                 ? LocationSummary::kNoCall
-                 : (IsPotentialUnboxedDartFieldLoad()
-                        ? LocationSummary::kCallOnSlowPath
-                        : (calls_initializer() ? LocationSummary::kCall
-                                               : LocationSummary::kNoCall)));
-
-  LocationSummary* locs =
-      new (zone) LocationSummary(zone, kNumInputs, kNumTemps, contains_call);
-
-  locs->set_in(0, calls_initializer() ? Location::RegisterLocation(
-                                            InitInstanceFieldABI::kInstanceReg)
-                                      : Location::RequiresRegister());
-
+  LocationSummary* locs = nullptr;
   if (slot().representation() != kTagged) {
+    ASSERT(!calls_initializer());
     ASSERT(RepresentationUtils::IsUnboxedInteger(slot().representation()));
     const size_t value_size =
         RepresentationUtils::ValueSize(slot().representation());
+
+    const intptr_t kNumTemps = 0;
+    locs = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    locs->set_in(0, Location::RequiresRegister());
     if (value_size <= compiler::target::kWordSize) {
       locs->set_out(0, Location::RequiresRegister());
     } else {
@@ -3259,23 +3217,60 @@
       locs->set_out(0, Location::Pair(Location::RequiresRegister(),
                                       Location::RequiresRegister()));
     }
+
   } else if (IsUnboxedDartFieldLoad() && opt) {
     ASSERT(!calls_initializer());
+    ASSERT(!slot().field().is_non_nullable_integer());
+
+    const intptr_t kNumTemps = FLAG_precompiled_mode ? 0 : 1;
+    locs = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    locs->set_in(0, Location::RequiresRegister());
     if (!FLAG_precompiled_mode) {
       locs->set_temp(0, Location::RequiresRegister());
     }
     locs->set_out(0, Location::RequiresFpuRegister());
+
   } else if (IsPotentialUnboxedDartFieldLoad()) {
     ASSERT(!calls_initializer());
+    const intptr_t kNumTemps = 3;
+    locs = new (zone) LocationSummary(zone, kNumInputs, kNumTemps,
+                                      LocationSummary::kCallOnSlowPath);
+    locs->set_in(0, Location::RequiresRegister());
     locs->set_temp(0, opt ? Location::RequiresFpuRegister()
                           : Location::FpuRegisterLocation(Q1));
     locs->set_temp(1, Location::RequiresRegister());
     locs->set_temp(2, Location::RequiresRegister());
     locs->set_out(0, Location::RequiresRegister());
+
   } else if (calls_initializer()) {
-    locs->set_out(0,
-                  Location::RegisterLocation(InitInstanceFieldABI::kResultReg));
+    if (throw_exception_on_initialization()) {
+      const bool using_shared_stub = UseSharedSlowPathStub(opt);
+      const intptr_t kNumTemps = using_shared_stub ? 1 : 0;
+      locs = new (zone) LocationSummary(
+          zone, kNumInputs, kNumTemps,
+          using_shared_stub ? LocationSummary::kCallOnSharedSlowPath
+                            : LocationSummary::kCallOnSlowPath);
+      if (using_shared_stub) {
+        locs->set_temp(0, Location::RegisterLocation(
+                              LateInitializationErrorABI::kFieldReg));
+      }
+      locs->set_in(0, Location::RequiresRegister());
+      locs->set_out(0, Location::RequiresRegister());
+    } else {
+      const intptr_t kNumTemps = 0;
+      locs = new (zone)
+          LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+      locs->set_in(
+          0, Location::RegisterLocation(InitInstanceFieldABI::kInstanceReg));
+      locs->set_out(
+          0, Location::RegisterLocation(InitInstanceFieldABI::kResultReg));
+    }
   } else {
+    const intptr_t kNumTemps = 0;
+    locs = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    locs->set_in(0, Location::RequiresRegister());
     locs->set_out(0, Location::RequiresRegister());
   }
   return locs;
@@ -3307,6 +3302,13 @@
         __ LoadFieldFromOffset(kWord, result, instance_reg, OffsetInBytes());
         break;
       }
+      case kUnboxedUint8: {
+        const Register result = locs()->out(0).reg();
+        __ Comment("UnboxedUint8LoadFieldInstr");
+        __ LoadFieldFromOffset(kUnsignedByte, result, instance_reg,
+                               OffsetInBytes());
+        break;
+      }
       default:
         UNIMPLEMENTED();
         break;
@@ -3509,27 +3511,34 @@
 
 void InstantiateTypeArgumentsInstr::EmitNativeCode(
     FlowGraphCompiler* compiler) {
-  const Register instantiator_type_args_reg = locs()->in(0).reg();
-  const Register function_type_args_reg = locs()->in(1).reg();
-  const Register result_reg = locs()->out(0).reg();
-
-  // 'instantiator_type_args_reg' is a TypeArguments object (or null).
-  // 'function_type_args_reg' is a TypeArguments object (or null).
-
-  compiler::Label type_arguments_instantiated;
-  ASSERT(!instantiator_class().IsNull());
-  ASSERT(type_arguments()->BindsToConstant());
+  // We should never try and instantiate a TAV known at compile time to be null,
+  // so we can use a null value below for the dynamic case.
+  ASSERT(!type_arguments()->BindsToConstant() ||
+         !type_arguments()->BoundConstant().IsNull());
   const auto& type_args =
-      TypeArguments::Cast(type_arguments()->BoundConstant());
-
-  // If both the instantiator and function type arguments are null and if the
-  // type argument vector instantiated from null becomes a vector of dynamic,
-  // then use null as the type arguments.
+      type_arguments()->BindsToConstant()
+          ? TypeArguments::Cast(type_arguments()->BoundConstant())
+          : Object::null_type_arguments();
+  const intptr_t len = type_args.Length();
   const bool can_function_type_args_be_null =
       function_type_arguments()->CanBe(Object::null_object());
-  const intptr_t len = type_args.Length();
-  if (type_args.IsRawWhenInstantiatedFromRaw(len) &&
-      can_function_type_args_be_null) {
+
+  compiler::Label type_arguments_instantiated;
+  if (type_args.IsNull()) {
+    // Currently we only create dynamic InstantiateTypeArguments instructions
+    // in cases where we know the type argument is uninstantiated at runtime,
+    // so there are no extra checks needed to call the stub successfully.
+  } else if (type_args.IsRawWhenInstantiatedFromRaw(len) &&
+             can_function_type_args_be_null) {
+    // If both the instantiator and function type arguments are null and if the
+    // type argument vector instantiated from null becomes a vector of dynamic,
+    // then use null as the type arguments.
+    //
+    // 'instantiator_type_args_reg' is a TypeArguments object (or null).
+    // 'function_type_args_reg' is a TypeArguments object (or null).
+    const Register instantiator_type_args_reg = locs()->in(0).reg();
+    const Register function_type_args_reg = locs()->in(1).reg();
+    const Register result_reg = locs()->out(0).reg();
     ASSERT(result_reg != instantiator_type_args_reg &&
            result_reg != function_type_args_reg);
     __ LoadObject(result_reg, Object::null_object());
@@ -4933,6 +4942,26 @@
   __ Bind(&done);
 }
 
+LocationSummary* BoxUint8Instr::MakeLocationSummary(Zone* zone,
+                                                    bool opt) const {
+  ASSERT(from_representation() == kUnboxedUint8);
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresRegister());
+  summary->set_out(0, Location::RequiresRegister());
+  return summary;
+}
+
+void BoxUint8Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  const Register value = locs()->in(0).reg();
+  const Register out = locs()->out(0).reg();
+
+  __ AndImmediate(out, value, 0xff);
+  __ SmiTag(out);
+}
+
 LocationSummary* BoxInteger32Instr::MakeLocationSummary(Zone* zone,
                                                         bool opt) const {
   ASSERT((from_representation() == kUnboxedInt32) ||
@@ -6914,12 +6943,9 @@
 
 class ShiftInt64OpSlowPath : public ThrowErrorSlowPathCode {
  public:
-  static const intptr_t kNumberOfArguments = 0;
-
   ShiftInt64OpSlowPath(ShiftInt64OpInstr* instruction, intptr_t try_index)
       : ThrowErrorSlowPathCode(instruction,
                                kArgumentErrorUnboxedInt64RuntimeEntry,
-                               kNumberOfArguments,
                                try_index) {}
 
   const char* name() override { return "int64 shift"; }
@@ -7077,12 +7103,9 @@
 
 class ShiftUint32OpSlowPath : public ThrowErrorSlowPathCode {
  public:
-  static const intptr_t kNumberOfArguments = 0;
-
   ShiftUint32OpSlowPath(ShiftUint32OpInstr* instruction, intptr_t try_index)
       : ThrowErrorSlowPathCode(instruction,
                                kArgumentErrorUnboxedInt64RuntimeEntry,
-                               kNumberOfArguments,
                                try_index) {}
 
   const char* name() override { return "uint32 shift"; }
diff --git a/runtime/vm/compiler/backend/il_arm64.cc b/runtime/vm/compiler/backend/il_arm64.cc
index d67b7ad..7cb909a 100644
--- a/runtime/vm/compiler/backend/il_arm64.cc
+++ b/runtime/vm/compiler/backend/il_arm64.cc
@@ -1130,6 +1130,9 @@
 
   EmitParamMoves(compiler);
 
+  if (compiler::Assembler::EmittingComments()) {
+    __ Comment("Call");
+  }
   // We need to copy a dummy return address up into the dummy stack frame so the
   // stack walker will know which safepoint to use.
   //
@@ -1243,22 +1246,6 @@
   __ set_constant_pool_allowed(true);
 }
 
-void NativeEntryInstr::SaveArgument(
-    FlowGraphCompiler* compiler,
-    const compiler::ffi::NativeLocation& nloc) const {
-  if (nloc.IsStack()) return;
-
-  if (nloc.IsRegisters()) {
-    const auto& regs_loc = nloc.AsRegisters();
-    ASSERT(regs_loc.num_regs() == 1);
-    __ Push(regs_loc.reg_at(0));
-  } else if (nloc.IsFpuRegisters()) {
-    __ PushDouble(nloc.AsFpuRegisters().fpu_reg());
-  } else {
-    UNREACHABLE();
-  }
-}
-
 void NativeEntryInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   // Constant pool cannot be used until we enter the actual Dart frame.
   __ set_constant_pool_allowed(false);
@@ -1276,9 +1263,7 @@
   __ EnterFrame(0);
 
   // Save the argument registers, in reverse order.
-  for (intptr_t i = marshaller_.num_args(); i-- > 0;) {
-    SaveArgument(compiler, marshaller_.Location(i));
-  }
+  SaveArguments(compiler);
 
   // Enter the entry frame.
   __ EnterFrame(0);
@@ -1422,7 +1407,7 @@
   const Register str = locs()->in(0).reg();
   const Register result = locs()->out(0).reg();
   __ LoadFieldFromOffset(result, str, String::length_offset());
-  __ ldr(TMP, compiler::FieldAddress(str, OneByteString::data_offset()),
+  __ ldr(TMP, compiler::FieldAddress(str, OneByteString::data_offset(), kByte),
          kUnsignedByte);
   __ CompareImmediate(result, Smi::RawValue(1));
   __ LoadImmediate(result, -1);
@@ -1571,6 +1556,7 @@
   switch (class_id_) {
     case kArrayCid:
     case kImmutableArrayCid:
+    case kTypeArgumentsCid:
       return kTagged;
     case kOneByteStringCid:
     case kTwoByteStringCid:
@@ -1727,7 +1713,8 @@
       break;
     default:
       ASSERT(representation() == kTagged);
-      ASSERT((class_id() == kArrayCid) || (class_id() == kImmutableArrayCid));
+      ASSERT((class_id() == kArrayCid) || (class_id() == kImmutableArrayCid) ||
+             (class_id() == kTypeArgumentsCid));
       __ ldr(result, element_address);
       break;
   }
@@ -2748,50 +2735,69 @@
 LocationSummary* LoadFieldInstr::MakeLocationSummary(Zone* zone,
                                                      bool opt) const {
   const intptr_t kNumInputs = 1;
-  const intptr_t kNumTemps =
-      (slot().representation() != kTagged)
-          ? 0
-          : ((IsUnboxedDartFieldLoad() && opt)
-                 ? (FLAG_precompiled_mode ? 0 : 1)
-                 : (IsPotentialUnboxedDartFieldLoad() ? 1 : 0));
-  const auto contains_call =
-      (slot().representation() != kTagged)
-          ? LocationSummary::kNoCall
-          : ((IsUnboxedDartFieldLoad() && opt)
-                 ? LocationSummary::kNoCall
-                 : (IsPotentialUnboxedDartFieldLoad()
-                        ? LocationSummary::kCallOnSlowPath
-                        : (calls_initializer() ? LocationSummary::kCall
-                                               : LocationSummary::kNoCall)));
-
-  LocationSummary* locs =
-      new (zone) LocationSummary(zone, kNumInputs, kNumTemps, contains_call);
-
-  locs->set_in(0, calls_initializer() ? Location::RegisterLocation(
-                                            InitInstanceFieldABI::kInstanceReg)
-                                      : Location::RequiresRegister());
-
+  LocationSummary* locs = nullptr;
   if (slot().representation() != kTagged) {
     ASSERT(!calls_initializer());
     ASSERT(RepresentationUtils::IsUnboxedInteger(slot().representation()));
     ASSERT(RepresentationUtils::ValueSize(slot().representation()) <=
            compiler::target::kWordSize);
+
+    const intptr_t kNumTemps = 0;
+    locs = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    locs->set_in(0, Location::RequiresRegister());
     locs->set_out(0, Location::RequiresRegister());
+
   } else if (IsUnboxedDartFieldLoad() && opt) {
     ASSERT(!calls_initializer());
     ASSERT(!slot().field().is_non_nullable_integer());
+
+    const intptr_t kNumTemps = FLAG_precompiled_mode ? 0 : 1;
+    locs = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    locs->set_in(0, Location::RequiresRegister());
     if (!FLAG_precompiled_mode) {
       locs->set_temp(0, Location::RequiresRegister());
     }
     locs->set_out(0, Location::RequiresFpuRegister());
+
   } else if (IsPotentialUnboxedDartFieldLoad()) {
     ASSERT(!calls_initializer());
+    const intptr_t kNumTemps = 1;
+    locs = new (zone) LocationSummary(zone, kNumInputs, kNumTemps,
+                                      LocationSummary::kCallOnSlowPath);
+    locs->set_in(0, Location::RequiresRegister());
     locs->set_temp(0, Location::RequiresRegister());
     locs->set_out(0, Location::RequiresRegister());
+
   } else if (calls_initializer()) {
-    locs->set_out(0,
-                  Location::RegisterLocation(InitInstanceFieldABI::kResultReg));
+    if (throw_exception_on_initialization()) {
+      const bool using_shared_stub = UseSharedSlowPathStub(opt);
+      const intptr_t kNumTemps = using_shared_stub ? 1 : 0;
+      locs = new (zone) LocationSummary(
+          zone, kNumInputs, kNumTemps,
+          using_shared_stub ? LocationSummary::kCallOnSharedSlowPath
+                            : LocationSummary::kCallOnSlowPath);
+      if (using_shared_stub) {
+        locs->set_temp(0, Location::RegisterLocation(
+                              LateInitializationErrorABI::kFieldReg));
+      }
+      locs->set_in(0, Location::RequiresRegister());
+      locs->set_out(0, Location::RequiresRegister());
+    } else {
+      const intptr_t kNumTemps = 0;
+      locs = new (zone)
+          LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+      locs->set_in(
+          0, Location::RegisterLocation(InitInstanceFieldABI::kInstanceReg));
+      locs->set_out(
+          0, Location::RegisterLocation(InitInstanceFieldABI::kResultReg));
+    }
   } else {
+    const intptr_t kNumTemps = 0;
+    locs = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    locs->set_in(0, Location::RequiresRegister());
     locs->set_out(0, Location::RequiresRegister());
   }
   return locs;
@@ -2815,6 +2821,11 @@
         __ LoadFieldFromOffset(result_reg, instance_reg, OffsetInBytes(),
                                kUnsignedWord);
         break;
+      case kUnboxedUint8:
+        __ Comment("UnboxedUint8LoadFieldInstr");
+        __ LoadFieldFromOffset(result_reg, instance_reg, OffsetInBytes(),
+                               kUnsignedByte);
+        break;
       default:
         UNIMPLEMENTED();
         break;
@@ -2999,27 +3010,34 @@
 
 void InstantiateTypeArgumentsInstr::EmitNativeCode(
     FlowGraphCompiler* compiler) {
-  const Register instantiator_type_args_reg = locs()->in(0).reg();
-  const Register function_type_args_reg = locs()->in(1).reg();
-  const Register result_reg = locs()->out(0).reg();
-
-  compiler::Label type_arguments_instantiated;
-  ASSERT(!instantiator_class().IsNull());
-  ASSERT(type_arguments()->BindsToConstant());
+  // We should never try and instantiate a TAV known at compile time to be null,
+  // so we can use a null value below for the dynamic case.
+  ASSERT(!type_arguments()->BindsToConstant() ||
+         !type_arguments()->BoundConstant().IsNull());
   const auto& type_args =
-      TypeArguments::Cast(type_arguments()->BoundConstant());
-  // 'instantiator_type_args_reg' is a TypeArguments object (or null).
-  // 'function_type_args_reg' is a TypeArguments object (or null).
-
-  // If both the instantiator and function type arguments are null and if the
-  // type argument vector instantiated from null becomes a vector of dynamic,
-  // then use null as the type arguments.
+      type_arguments()->BindsToConstant()
+          ? TypeArguments::Cast(type_arguments()->BoundConstant())
+          : Object::null_type_arguments();
   const intptr_t len = type_args.Length();
   const bool can_function_type_args_be_null =
       function_type_arguments()->CanBe(Object::null_object());
-  if (type_args.IsRawWhenInstantiatedFromRaw(len) &&
-      can_function_type_args_be_null) {
+
+  compiler::Label type_arguments_instantiated;
+  if (type_args.IsNull()) {
+    // Currently we only create dynamic InstantiateTypeArguments instructions
+    // in cases where we know the type argument is uninstantiated at runtime,
+    // so there are no extra checks needed to call the stub successfully.
+  } else if (type_args.IsRawWhenInstantiatedFromRaw(len) &&
+             can_function_type_args_be_null) {
+    // If both the instantiator and function type arguments are null and if the
+    // type argument vector instantiated from null becomes a vector of dynamic,
+    // then use null as the type arguments.
     compiler::Label non_null_type_args;
+    // 'instantiator_type_args_reg' is a TypeArguments object (or null).
+    // 'function_type_args_reg' is a TypeArguments object (or null).
+    const Register instantiator_type_args_reg = locs()->in(0).reg();
+    const Register function_type_args_reg = locs()->in(1).reg();
+    const Register result_reg = locs()->out(0).reg();
     ASSERT(result_reg != instantiator_type_args_reg &&
            result_reg != function_type_args_reg);
     __ LoadObject(result_reg, Object::null_object());
@@ -3032,6 +3050,7 @@
     __ Bind(&non_null_type_args);
   }
   // Lookup cache in stub before calling runtime.
+
   compiler->GenerateStubCall(token_pos(), GetStub(),
                              PcDescriptorsLayout::kOther, locs());
   __ Bind(&type_arguments_instantiated);
@@ -4138,7 +4157,8 @@
   compiler::Label done;
   __ SmiUntag(result, value);
   __ BranchIfSmi(value, &done);
-  __ ldr(result, compiler::FieldAddress(value, Mint::value_offset()), kWord);
+  __ ldr(result, compiler::FieldAddress(value, Mint::value_offset(), kWord),
+         kWord);
   __ LoadFieldFromOffset(result, value, Mint::value_offset());
   __ Bind(&done);
 }
@@ -4154,6 +4174,30 @@
   __ Bind(&done);
 }
 
+LocationSummary* BoxUint8Instr::MakeLocationSummary(Zone* zone,
+                                                    bool opt) const {
+  ASSERT(from_representation() == kUnboxedUint8);
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresRegister());
+  summary->set_out(0, Location::RequiresRegister());
+  return summary;
+}
+
+void BoxUint8Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  const Register value = locs()->in(0).reg();
+  const Register out = locs()->out(0).reg();
+  ASSERT(value != out);
+
+  ASSERT(kSmiTagSize == 1);
+  const intptr_t shift = kBitsPerWord - kBitsPerByte;
+  // TODO(vegorov) implement and use UBFM/SBFM for this.
+  __ LslImmediate(out, value, shift);
+  __ LsrImmediate(out, out, shift - kSmiTagSize);
+}
+
 LocationSummary* BoxInteger32Instr::MakeLocationSummary(Zone* zone,
                                                         bool opt) const {
   ASSERT((from_representation() == kUnboxedInt32) ||
@@ -5652,8 +5696,6 @@
 
 class Int64DivideSlowPath : public ThrowErrorSlowPathCode {
  public:
-  static const intptr_t kNumberOfArguments = 0;
-
   Int64DivideSlowPath(BinaryInt64OpInstr* instruction,
                       Register divisor,
                       Range* divisor_range,
@@ -5662,7 +5704,6 @@
                       intptr_t try_index)
       : ThrowErrorSlowPathCode(instruction,
                                kIntegerDivisionByZeroExceptionRuntimeEntry,
-                               kNumberOfArguments,
                                try_index),
         is_mod_(instruction->op_kind() == Token::kMOD),
         divisor_(divisor),
@@ -6006,12 +6047,9 @@
 
 class ShiftInt64OpSlowPath : public ThrowErrorSlowPathCode {
  public:
-  static const intptr_t kNumberOfArguments = 0;
-
   ShiftInt64OpSlowPath(ShiftInt64OpInstr* instruction, intptr_t try_index)
       : ThrowErrorSlowPathCode(instruction,
                                kArgumentErrorUnboxedInt64RuntimeEntry,
-                               kNumberOfArguments,
                                try_index) {}
 
   const char* name() override { return "int64 shift"; }
@@ -6138,12 +6176,9 @@
 
 class ShiftUint32OpSlowPath : public ThrowErrorSlowPathCode {
  public:
-  static const intptr_t kNumberOfArguments = 0;
-
   ShiftUint32OpSlowPath(ShiftUint32OpInstr* instruction, intptr_t try_index)
       : ThrowErrorSlowPathCode(instruction,
                                kArgumentErrorUnboxedInt64RuntimeEntry,
-                               kNumberOfArguments,
                                try_index) {}
 
   const char* name() override { return "uint32 shift"; }
diff --git a/runtime/vm/compiler/backend/il_deserializer.cc b/runtime/vm/compiler/backend/il_deserializer.cc
index f84b7e5..dcc40c0 100644
--- a/runtime/vm/compiler/backend/il_deserializer.cc
+++ b/runtime/vm/compiler/backend/il_deserializer.cc
@@ -2189,6 +2189,9 @@
     case Slot::Kind::kTypeArgumentsIndex:
       *out = &Slot::GetTypeArgumentsIndexSlot(thread(), offset);
       break;
+    case Slot::Kind::kArrayElement:
+      *out = &Slot::GetArrayElementSlot(thread(), offset);
+      break;
     case Slot::Kind::kCapturedVariable:
       StoreError(kind_sexp, "unhandled Slot kind");
       return false;
diff --git a/runtime/vm/compiler/backend/il_ia32.cc b/runtime/vm/compiler/backend/il_ia32.cc
index a7bc3b3..54356ba 100644
--- a/runtime/vm/compiler/backend/il_ia32.cc
+++ b/runtime/vm/compiler/backend/il_ia32.cc
@@ -1007,6 +1007,9 @@
 
   EmitParamMoves(compiler);
 
+  if (compiler::Assembler::EmittingComments()) {
+    __ Comment("Call");
+  }
   // We need to copy a dummy return address up into the dummy stack frame so the
   // stack walker will know which safepoint to use. Unlike X64, there's no
   // PC-relative 'leaq' available, so we have do a trick with 'call'.
@@ -1053,13 +1056,6 @@
   __ popl(temp);
 }
 
-void NativeEntryInstr::SaveArgument(
-    FlowGraphCompiler* compiler,
-    const compiler::ffi::NativeLocation& nloc) const {
-  // IA32 has no arguments passed in registers.
-  UNREACHABLE();
-}
-
 void NativeEntryInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   __ Bind(compiler->GetJumpLabel(this));
 
@@ -1423,6 +1419,7 @@
   switch (class_id_) {
     case kArrayCid:
     case kImmutableArrayCid:
+    case kTypeArgumentsCid:
       return kTagged;
     case kOneByteStringCid:
     case kTwoByteStringCid:
@@ -1604,7 +1601,8 @@
     default: {
       const Register result = locs()->out(0).reg();
       ASSERT(representation() == kTagged);
-      ASSERT((class_id() == kArrayCid) || (class_id() == kImmutableArrayCid));
+      ASSERT((class_id() == kArrayCid) || (class_id() == kImmutableArrayCid) ||
+             (class_id() == kTypeArgumentsCid));
       __ movl(result, element_address);
       break;
     }
@@ -2535,35 +2533,17 @@
 LocationSummary* LoadFieldInstr::MakeLocationSummary(Zone* zone,
                                                      bool opt) const {
   const intptr_t kNumInputs = 1;
-  const intptr_t kNumTemps =
-      (slot().representation() != kTagged)
-          ? 0
-          : ((IsUnboxedDartFieldLoad() && opt)
-                 ? 1
-                 : ((IsPotentialUnboxedDartFieldLoad()) ? 2 : 0));
-
-  const auto contains_call =
-      (slot().representation() != kTagged)
-          ? LocationSummary::kNoCall
-          : ((IsUnboxedDartFieldLoad() && opt)
-                 ? LocationSummary::kNoCall
-                 : (IsPotentialUnboxedDartFieldLoad()
-                        ? LocationSummary::kCallOnSlowPath
-                        : (calls_initializer() ? LocationSummary::kCall
-                                               : LocationSummary::kNoCall)));
-
-  LocationSummary* locs =
-      new (zone) LocationSummary(zone, kNumInputs, kNumTemps, contains_call);
-
-  locs->set_in(0, calls_initializer() ? Location::RegisterLocation(
-                                            InitInstanceFieldABI::kInstanceReg)
-                                      : Location::RequiresRegister());
-
+  LocationSummary* locs = nullptr;
   if (slot().representation() != kTagged) {
     ASSERT(!calls_initializer());
     ASSERT(RepresentationUtils::IsUnboxedInteger(slot().representation()));
     const size_t value_size =
         RepresentationUtils::ValueSize(slot().representation());
+
+    const intptr_t kNumTemps = 0;
+    locs = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    locs->set_in(0, Location::RequiresRegister());
     if (value_size <= compiler::target::kWordSize) {
       locs->set_out(0, Location::RequiresRegister());
     } else {
@@ -2571,23 +2551,51 @@
       locs->set_out(0, Location::Pair(Location::RequiresRegister(),
                                       Location::RequiresRegister()));
     }
+
   } else if (IsUnboxedDartFieldLoad() && opt) {
     ASSERT(!calls_initializer());
+    const intptr_t kNumTemps = 1;
+    locs = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    locs->set_in(0, Location::RequiresRegister());
     locs->set_temp(0, Location::RequiresRegister());
     locs->set_out(0, Location::RequiresFpuRegister());
+
   } else if (IsPotentialUnboxedDartFieldLoad()) {
     ASSERT(!calls_initializer());
+    const intptr_t kNumTemps = 2;
+    locs = new (zone) LocationSummary(zone, kNumInputs, kNumTemps,
+                                      LocationSummary::kCallOnSlowPath);
+    locs->set_in(0, Location::RequiresRegister());
     locs->set_temp(0, opt ? Location::RequiresFpuRegister()
                           : Location::FpuRegisterLocation(XMM1));
     locs->set_temp(1, Location::RequiresRegister());
     locs->set_out(0, Location::RequiresRegister());
+
   } else if (calls_initializer()) {
-    locs->set_out(0,
-                  Location::RegisterLocation(InitInstanceFieldABI::kResultReg));
+    if (throw_exception_on_initialization()) {
+      ASSERT(!UseSharedSlowPathStub(opt));
+      const intptr_t kNumTemps = 0;
+      locs = new (zone) LocationSummary(zone, kNumInputs, kNumTemps,
+                                        LocationSummary::kCallOnSlowPath);
+      locs->set_in(0, Location::RequiresRegister());
+      locs->set_out(0, Location::RequiresRegister());
+    } else {
+      const intptr_t kNumTemps = 0;
+      locs = new (zone)
+          LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+      locs->set_in(
+          0, Location::RegisterLocation(InitInstanceFieldABI::kInstanceReg));
+      locs->set_out(
+          0, Location::RegisterLocation(InitInstanceFieldABI::kResultReg));
+    }
   } else {
+    const intptr_t kNumTemps = 0;
+    locs = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    locs->set_in(0, Location::RequiresRegister());
     locs->set_out(0, Location::RequiresRegister());
   }
-
   return locs;
 }
 
@@ -2616,6 +2624,13 @@
         __ movl(result, compiler::FieldAddress(instance_reg, OffsetInBytes()));
         break;
       }
+      case kUnboxedUint8: {
+        const Register result = locs()->out(0).reg();
+        __ Comment("UnboxedUint8LoadFieldInstr");
+        __ movzxb(result,
+                  compiler::FieldAddress(instance_reg, OffsetInBytes()));
+        break;
+      }
       default:
         UNIMPLEMENTED();
         break;
@@ -2783,27 +2798,34 @@
 
 void InstantiateTypeArgumentsInstr::EmitNativeCode(
     FlowGraphCompiler* compiler) {
-  Register instantiator_type_args_reg = locs()->in(0).reg();
-  Register function_type_args_reg = locs()->in(1).reg();
-  Register result_reg = locs()->out(0).reg();
-
-  compiler::Label type_arguments_instantiated;
-  ASSERT(!instantiator_class().IsNull());
-  ASSERT(type_arguments()->BindsToConstant());
+  // We should never try and instantiate a TAV known at compile time to be null,
+  // so we can use a null value below for the dynamic case.
+  ASSERT(!type_arguments()->BindsToConstant() ||
+         !type_arguments()->BoundConstant().IsNull());
   const auto& type_args =
-      TypeArguments::Cast(type_arguments()->BoundConstant());
-  // 'instantiator_type_args_reg' is a TypeArguments object (or null).
-  // 'function_type_args_reg' is a TypeArguments object (or null).
-
-  // If both the instantiator and function type arguments are null and if the
-  // type argument vector instantiated from null becomes a vector of dynamic,
-  // then use null as the type arguments.
+      type_arguments()->BindsToConstant()
+          ? TypeArguments::Cast(type_arguments()->BoundConstant())
+          : Object::null_type_arguments();
   const intptr_t len = type_args.Length();
   const bool can_function_type_args_be_null =
       function_type_arguments()->CanBe(Object::null_object());
-  if (type_args.IsRawWhenInstantiatedFromRaw(len) &&
-      can_function_type_args_be_null) {
+
+  compiler::Label type_arguments_instantiated;
+  if (type_args.IsNull()) {
+    // Currently we only create dynamic InstantiateTypeArguments instructions
+    // in cases where we know the type argument is uninstantiated at runtime,
+    // so there are no extra checks needed to call the stub successfully.
+  } else if (type_args.IsRawWhenInstantiatedFromRaw(len) &&
+             can_function_type_args_be_null) {
+    // If both the instantiator and function type arguments are null and if the
+    // type argument vector instantiated from null becomes a vector of dynamic,
+    // then use null as the type arguments.
     compiler::Label non_null_type_args;
+    // 'instantiator_type_args_reg' is a TypeArguments object (or null).
+    // 'function_type_args_reg' is a TypeArguments object (or null).
+    const Register instantiator_type_args_reg = locs()->in(0).reg();
+    const Register function_type_args_reg = locs()->in(1).reg();
+    const Register result_reg = locs()->out(0).reg();
     ASSERT(result_reg != instantiator_type_args_reg &&
            result_reg != function_type_args_reg);
     __ LoadObject(result_reg, Object::null_object());
@@ -3906,6 +3928,28 @@
   __ Bind(&done);
 }
 
+LocationSummary* BoxUint8Instr::MakeLocationSummary(Zone* zone,
+                                                    bool opt) const {
+  ASSERT(from_representation() == kUnboxedUint8);
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresRegister());
+  summary->set_out(0, Location::RequiresRegister());
+  return summary;
+}
+
+void BoxUint8Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  const Register value = locs()->in(0).reg();
+  const Register out = locs()->out(0).reg();
+  ASSERT(value != out);
+
+  __ MoveRegister(out, value);
+  __ andl(out, compiler::Immediate(0xff));
+  __ SmiTag(out);
+}
+
 LocationSummary* BoxInteger32Instr::MakeLocationSummary(Zone* zone,
                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
@@ -5902,12 +5946,9 @@
 
 class ShiftInt64OpSlowPath : public ThrowErrorSlowPathCode {
  public:
-  static const intptr_t kNumberOfArguments = 0;
-
   ShiftInt64OpSlowPath(ShiftInt64OpInstr* instruction, intptr_t try_index)
       : ThrowErrorSlowPathCode(instruction,
                                kArgumentErrorUnboxedInt64RuntimeEntry,
-                               kNumberOfArguments,
                                try_index) {}
 
   const char* name() override { return "int64 shift"; }
@@ -6067,12 +6108,9 @@
 
 class ShiftUint32OpSlowPath : public ThrowErrorSlowPathCode {
  public:
-  static const intptr_t kNumberOfArguments = 0;
-
   ShiftUint32OpSlowPath(ShiftUint32OpInstr* instruction, intptr_t try_index)
       : ThrowErrorSlowPathCode(instruction,
                                kArgumentErrorUnboxedInt64RuntimeEntry,
-                               kNumberOfArguments,
                                try_index) {}
 
   const char* name() override { return "uint32 shift"; }
diff --git a/runtime/vm/compiler/backend/il_printer.cc b/runtime/vm/compiler/backend/il_printer.cc
index 62b7000..6a3fc15 100644
--- a/runtime/vm/compiler/backend/il_printer.cc
+++ b/runtime/vm/compiler/backend/il_printer.cc
@@ -452,8 +452,9 @@
   sub_type()->PrintTo(f);
   f->AddString(", ");
   super_type()->PrintTo(f);
-  f->Printf(", '%s', ", dst_name().ToCString());
-  f->AddString(" instantiator_type_args(");
+  f->AddString(", ");
+  dst_name()->PrintTo(f);
+  f->AddString(", instantiator_type_args(");
   instantiator_type_arguments()->PrintTo(f);
   f->AddString("), function_type_args(");
   function_type_arguments()->PrintTo(f);
@@ -926,6 +927,8 @@
       return "double";
     case kUnboxedFloat:
       return "float";
+    case kUnboxedUint8:
+      return "uint8";
     case kUnboxedInt32:
       return "int32";
     case kUnboxedUint32:
diff --git a/runtime/vm/compiler/backend/il_test.cc b/runtime/vm/compiler/backend/il_test.cc
index a07557f..4788686 100644
--- a/runtime/vm/compiler/backend/il_test.cc
+++ b/runtime/vm/compiler/backend/il_test.cc
@@ -174,29 +174,14 @@
   // which enables us to remove more stores.
   std::vector<const char*> expected_stores_jit;
   std::vector<const char*> expected_stores_aot;
-  if (root_library.is_declared_in_bytecode()) {
-    // Bytecode flow graph builder doesn't provide readable
-    // variable names for captured variables. Also, bytecode may omit
-    // stores of context parent in certain cases.
-    expected_stores_jit.insert(
-        expected_stores_jit.end(),
-        {":context_var0", "Context.parent", ":context_var0",
-         "Closure.function_type_arguments", "Closure.function",
-         "Closure.context"});
-    expected_stores_aot.insert(
-        expected_stores_aot.end(),
-        {":context_var0", "Closure.function_type_arguments", "Closure.function",
-         "Closure.context"});
-  } else {
-    // These expectations are for AST-based flow graph builder.
-    expected_stores_jit.insert(expected_stores_jit.end(),
-                               {"value", "Context.parent", "Context.parent",
-                                "value", "Closure.function_type_arguments",
-                                "Closure.function", "Closure.context"});
-    expected_stores_aot.insert(expected_stores_aot.end(),
-                               {"value", "Closure.function_type_arguments",
-                                "Closure.function", "Closure.context"});
-  }
+
+  expected_stores_jit.insert(expected_stores_jit.end(),
+                             {"value", "Context.parent", "Context.parent",
+                              "value", "Closure.function_type_arguments",
+                              "Closure.function", "Closure.context"});
+  expected_stores_aot.insert(expected_stores_aot.end(),
+                             {"value", "Closure.function_type_arguments",
+                              "Closure.function", "Closure.context"});
 
   RunInitializingStoresTest(root_library, "f4", CompilerPass::kJIT,
                             expected_stores_jit);
diff --git a/runtime/vm/compiler/backend/il_test_helper.cc b/runtime/vm/compiler/backend/il_test_helper.cc
index f4d002b..1a514be 100644
--- a/runtime/vm/compiler/backend/il_test_helper.cc
+++ b/runtime/vm/compiler/backend/il_test_helper.cc
@@ -71,12 +71,6 @@
 }
 
 ObjectPtr Invoke(const Library& lib, const char* name) {
-  // These tests rely on running unoptimized code to collect type feedback. The
-  // interpreter does not collect type feedback for interface calls, so set
-  // compilation threshold to 0 in order to compile invoked function
-  // immediately and execute compiled code.
-  SetFlagScope<int> sfs(&FLAG_compilation_counter_threshold, 0);
-
   Thread* thread = Thread::Current();
   Dart_Handle api_lib = Api::NewHandle(thread, lib.raw());
   Dart_Handle result;
diff --git a/runtime/vm/compiler/backend/il_x64.cc b/runtime/vm/compiler/backend/il_x64.cc
index d3842d1..50b1287 100644
--- a/runtime/vm/compiler/backend/il_x64.cc
+++ b/runtime/vm/compiler/backend/il_x64.cc
@@ -2,6 +2,7 @@
 // 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.
 
+#include "platform/globals.h"
 #include "vm/globals.h"  // Needed here to get TARGET_ARCH_X64.
 #if defined(TARGET_ARCH_X64)
 
@@ -1081,7 +1082,7 @@
     __ TransitionGeneratedToNative(target_address, FPREG, TMP,
                                    /*enter_safepoint=*/true);
 
-    __ CallCFunction(target_address);
+    __ CallCFunction(target_address, /*restore_rsp=*/true);
 
     // Update information in the thread object and leave the safepoint.
     __ TransitionNativeToGenerated(/*leave_safepoint=*/true);
@@ -1118,24 +1119,6 @@
   __ popq(TMP);
 }
 
-void NativeEntryInstr::SaveArgument(
-    FlowGraphCompiler* compiler,
-    const compiler::ffi::NativeLocation& nloc) const {
-  if (nloc.IsStack()) return;
-
-  if (nloc.IsRegisters()) {
-    const auto& regs_loc = nloc.AsRegisters();
-    ASSERT(regs_loc.num_regs() == 1);
-    __ pushq(regs_loc.reg_at(0));
-  } else if (nloc.IsFpuRegisters()) {
-    // TODO(dartbug.com/40469): Reduce code size.
-    __ movq(TMP, nloc.AsFpuRegisters().fpu_reg());
-    __ pushq(TMP);
-  } else {
-    UNREACHABLE();
-  }
-}
-
 void NativeEntryInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   __ Bind(compiler->GetJumpLabel(this));
 
@@ -1150,9 +1133,7 @@
 #endif
 
   // Save the argument registers, in reverse order.
-  for (intptr_t i = marshaller_.num_args(); i-- > 0;) {
-    SaveArgument(compiler, marshaller_.Location(i));
-  }
+  SaveArguments(compiler);
 
   // Enter the entry frame. Push a dummy return address for consistency with
   // EnterFrame on ARM(64).
@@ -1572,6 +1553,7 @@
   switch (class_id_) {
     case kArrayCid:
     case kImmutableArrayCid:
+    case kTypeArgumentsCid:
       return kTagged;
     case kOneByteStringCid:
     case kTwoByteStringCid:
@@ -1721,7 +1703,8 @@
       break;
     default:
       ASSERT(representation() == kTagged);
-      ASSERT((class_id() == kArrayCid) || (class_id() == kImmutableArrayCid));
+      ASSERT((class_id() == kArrayCid) || (class_id() == kImmutableArrayCid) ||
+             (class_id() == kTypeArgumentsCid));
       __ movq(result, element_address);
       break;
   }
@@ -2772,53 +2755,71 @@
 LocationSummary* LoadFieldInstr::MakeLocationSummary(Zone* zone,
                                                      bool opt) const {
   const intptr_t kNumInputs = 1;
-  const intptr_t kNumTemps =
-      (slot().representation() != kTagged)
-          ? 0
-          : ((IsUnboxedDartFieldLoad() && opt)
-                 ? (FLAG_precompiled_mode ? 0 : 1)
-                 : (IsPotentialUnboxedDartFieldLoad() ? 2 : 0));
-  const auto contains_call =
-      (slot().representation() != kTagged)
-          ? LocationSummary::kNoCall
-          : ((IsUnboxedDartFieldLoad() && opt)
-                 ? LocationSummary::kNoCall
-                 : (IsPotentialUnboxedDartFieldLoad()
-                        ? LocationSummary::kCallOnSlowPath
-                        : (calls_initializer() ? LocationSummary::kCall
-                                               : LocationSummary::kNoCall)));
-
-  LocationSummary* locs =
-      new (zone) LocationSummary(zone, kNumInputs, kNumTemps, contains_call);
-
-  locs->set_in(0, calls_initializer() ? Location::RegisterLocation(
-                                            InitInstanceFieldABI::kInstanceReg)
-                                      : Location::RequiresRegister());
-
+  LocationSummary* locs = nullptr;
   if (slot().representation() != kTagged) {
     ASSERT(!calls_initializer());
     ASSERT(RepresentationUtils::IsUnboxedInteger(slot().representation()));
     ASSERT(RepresentationUtils::ValueSize(slot().representation()) <=
            compiler::target::kWordSize);
+
+    const intptr_t kNumTemps = 0;
+    locs = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    locs->set_in(0, Location::RequiresRegister());
     locs->set_out(0, Location::RequiresRegister());
-  }
-  if (IsUnboxedDartFieldLoad() && opt) {
+
+  } else if (IsUnboxedDartFieldLoad() && opt) {
     ASSERT(!calls_initializer());
     ASSERT(!slot().field().is_non_nullable_integer());
+
+    const intptr_t kNumTemps = FLAG_precompiled_mode ? 0 : 1;
+    locs = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    locs->set_in(0, Location::RequiresRegister());
     if (!FLAG_precompiled_mode) {
       locs->set_temp(0, Location::RequiresRegister());
     }
     locs->set_out(0, Location::RequiresFpuRegister());
+
   } else if (IsPotentialUnboxedDartFieldLoad()) {
     ASSERT(!calls_initializer());
+    const intptr_t kNumTemps = 2;
+    locs = new (zone) LocationSummary(zone, kNumInputs, kNumTemps,
+                                      LocationSummary::kCallOnSlowPath);
+    locs->set_in(0, Location::RequiresRegister());
     locs->set_temp(0, opt ? Location::RequiresFpuRegister()
                           : Location::FpuRegisterLocation(XMM1));
     locs->set_temp(1, Location::RequiresRegister());
     locs->set_out(0, Location::RequiresRegister());
+
   } else if (calls_initializer()) {
-    locs->set_out(0,
-                  Location::RegisterLocation(InitInstanceFieldABI::kResultReg));
+    if (throw_exception_on_initialization()) {
+      const bool using_shared_stub = UseSharedSlowPathStub(opt);
+      const intptr_t kNumTemps = using_shared_stub ? 1 : 0;
+      locs = new (zone) LocationSummary(
+          zone, kNumInputs, kNumTemps,
+          using_shared_stub ? LocationSummary::kCallOnSharedSlowPath
+                            : LocationSummary::kCallOnSlowPath);
+      if (using_shared_stub) {
+        locs->set_temp(0, Location::RegisterLocation(
+                              LateInitializationErrorABI::kFieldReg));
+      }
+      locs->set_in(0, Location::RequiresRegister());
+      locs->set_out(0, Location::RequiresRegister());
+    } else {
+      const intptr_t kNumTemps = 0;
+      locs = new (zone)
+          LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+      locs->set_in(
+          0, Location::RegisterLocation(InitInstanceFieldABI::kInstanceReg));
+      locs->set_out(
+          0, Location::RegisterLocation(InitInstanceFieldABI::kResultReg));
+    }
   } else {
+    const intptr_t kNumTemps = 0;
+    locs = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    locs->set_in(0, Location::RequiresRegister());
     locs->set_out(0, Location::RequiresRegister());
   }
   return locs;
@@ -2841,6 +2842,12 @@
         __ Comment("UnboxedUint32LoadFieldInstr");
         __ movl(result, compiler::FieldAddress(instance_reg, OffsetInBytes()));
         break;
+      case kUnboxedUint8: {
+        __ Comment("UnboxedUint8LoadFieldInstr");
+        __ movzxb(result,
+                  compiler::FieldAddress(instance_reg, OffsetInBytes()));
+        break;
+      }
       default:
         UNIMPLEMENTED();
         break;
@@ -3033,27 +3040,34 @@
 
 void InstantiateTypeArgumentsInstr::EmitNativeCode(
     FlowGraphCompiler* compiler) {
-  Register instantiator_type_args_reg = locs()->in(0).reg();
-  Register function_type_args_reg = locs()->in(1).reg();
-  Register result_reg = locs()->out(0).reg();
-
-  compiler::Label type_arguments_instantiated;
-  ASSERT(!instantiator_class().IsNull());
-  ASSERT(type_arguments()->BindsToConstant());
+  // We should never try and instantiate a TAV known at compile time to be null,
+  // so we can use a null value below for the dynamic case.
+  ASSERT(!type_arguments()->BindsToConstant() ||
+         !type_arguments()->BoundConstant().IsNull());
   const auto& type_args =
-      TypeArguments::Cast(type_arguments()->BoundConstant());
-  // 'instantiator_type_args_reg' is a TypeArguments object (or null).
-  // 'function_type_args_reg' is a TypeArguments object (or null).
-
-  // If both the instantiator and function type arguments are null and if the
-  // type argument vector instantiated from null becomes a vector of dynamic,
-  // then use null as the type arguments.
+      type_arguments()->BindsToConstant()
+          ? TypeArguments::Cast(type_arguments()->BoundConstant())
+          : Object::null_type_arguments();
   const intptr_t len = type_args.Length();
   const bool can_function_type_args_be_null =
       function_type_arguments()->CanBe(Object::null_object());
-  if (type_args.IsRawWhenInstantiatedFromRaw(len) &&
-      can_function_type_args_be_null) {
+
+  compiler::Label type_arguments_instantiated;
+  if (type_args.IsNull()) {
+    // Currently we only create dynamic InstantiateTypeArguments instructions
+    // in cases where we know the type argument is uninstantiated at runtime,
+    // so there are no extra checks needed to call the stub successfully.
+  } else if (type_args.IsRawWhenInstantiatedFromRaw(len) &&
+             can_function_type_args_be_null) {
+    // If both the instantiator and function type arguments are null and if the
+    // type argument vector instantiated from null becomes a vector of dynamic,
+    // then use null as the type arguments.
     compiler::Label non_null_type_args;
+    // 'instantiator_type_args_reg' is a TypeArguments object (or null).
+    // 'function_type_args_reg' is a TypeArguments object (or null).
+    const Register instantiator_type_args_reg = locs()->in(0).reg();
+    const Register function_type_args_reg = locs()->in(1).reg();
+    const Register result_reg = locs()->out(0).reg();
     ASSERT(result_reg != instantiator_type_args_reg &&
            result_reg != function_type_args_reg);
     __ LoadObject(result_reg, Object::null_object());
@@ -4435,6 +4449,27 @@
   }
 }
 
+LocationSummary* BoxUint8Instr::MakeLocationSummary(Zone* zone,
+                                                    bool opt) const {
+  ASSERT(from_representation() == kUnboxedUint8);
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresRegister());
+  summary->set_out(0, Location::RequiresRegister());
+  return summary;
+}
+
+void BoxUint8Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  const Register value = locs()->in(0).reg();
+  const Register out = locs()->out(0).reg();
+  ASSERT(value != out);
+
+  __ movzxb(out, value);
+  __ SmiTag(out);
+}
+
 LocationSummary* BoxInteger32Instr::MakeLocationSummary(Zone* zone,
                                                         bool opt) const {
   ASSERT((from_representation() == kUnboxedInt32) ||
@@ -5955,15 +5990,12 @@
 
 class Int64DivideSlowPath : public ThrowErrorSlowPathCode {
  public:
-  static const intptr_t kNumberOfArguments = 0;
-
   Int64DivideSlowPath(BinaryInt64OpInstr* instruction,
                       Register divisor,
                       Range* divisor_range,
                       intptr_t try_index)
       : ThrowErrorSlowPathCode(instruction,
                                kIntegerDivisionByZeroExceptionRuntimeEntry,
-                               kNumberOfArguments,
                                try_index),
         is_mod_(instruction->op_kind() == Token::kMOD),
         divisor_(divisor),
@@ -6378,12 +6410,9 @@
 
 class ShiftInt64OpSlowPath : public ThrowErrorSlowPathCode {
  public:
-  static const intptr_t kNumberOfArguments = 0;
-
   ShiftInt64OpSlowPath(ShiftInt64OpInstr* instruction, intptr_t try_index)
       : ThrowErrorSlowPathCode(instruction,
                                kArgumentErrorUnboxedInt64RuntimeEntry,
-                               kNumberOfArguments,
                                try_index) {}
 
   const char* name() override { return "int64 shift"; }
@@ -6508,12 +6537,9 @@
 
 class ShiftUint32OpSlowPath : public ThrowErrorSlowPathCode {
  public:
-  static const intptr_t kNumberOfArguments = 0;
-
   ShiftUint32OpSlowPath(ShiftUint32OpInstr* instruction, intptr_t try_index)
       : ThrowErrorSlowPathCode(instruction,
                                kArgumentErrorUnboxedInt64RuntimeEntry,
-                               kNumberOfArguments,
                                try_index) {}
 
   const char* name() override { return "uint32 shift"; }
diff --git a/runtime/vm/compiler/backend/inliner_test.cc b/runtime/vm/compiler/backend/inliner_test.cc
index 081e794..9a53a7b 100644
--- a/runtime/vm/compiler/backend/inliner_test.cc
+++ b/runtime/vm/compiler/backend/inliner_test.cc
@@ -216,74 +216,42 @@
   ILMatcher cursor(flow_graph, entry, /*trace=*/true,
                    ParallelMovesHandling::kSkip);
 
-  if (function.is_declared_in_bytecode()) {
-    RELEASE_ASSERT(cursor.TryMatch({
-        kMoveGlob,
-        kMatchAndMoveCreateArray,
-        kWordSize == 8 ? kMatchAndMoveUnboxInt64 : kNop,
-        kMatchAndMoveGoto,
+  Instruction* unbox1 = nullptr;
+  Instruction* unbox2 = nullptr;
 
-        // Loop header
-        kMatchAndMoveJoinEntry,
-        kMatchAndMoveCheckStackOverflow,
-        kMatchAndMoveUnboxInt64,
-        kMatchAndMoveBranchTrue,
+  RELEASE_ASSERT(cursor.TryMatch({
+      kMoveGlob,
+      kMatchAndMoveCreateArray,
+      kMatchAndMoveUnboxInt64,
+      {kMoveAny, &unbox1},
+      {kMoveAny, &unbox2},
+      kMatchAndMoveGoto,
 
-        // Loop body
-        kMatchAndMoveTargetEntry,
-        kMatchAndMoveGenericCheckBound,
-        kMatchAndMoveStoreIndexed,
-        kMatchAndMoveCheckedSmiOp,
-        kMatchAndMoveGoto,
+      // Loop header
+      kMatchAndMoveJoinEntry,
+      kMatchAndMoveCheckStackOverflow,
+      kMatchAndMoveBranchTrue,
 
-        // Loop header once again
-        kMatchAndMoveJoinEntry,
-        kMatchAndMoveCheckStackOverflow,
-        kMatchAndMoveUnboxInt64,
-        kMatchAndMoveBranchFalse,
+      // Loop body
+      kMatchAndMoveTargetEntry,
+      kWordSize == 4 ? kMatchAndMoveBoxInt64 : kNop,
+      kMatchAndMoveBoxInt64,
+      kMatchAndMoveStoreIndexed,
+      kMatchAndMoveBinaryInt64Op,
+      kMatchAndMoveGoto,
 
-        // After loop
-        kMatchAndMoveTargetEntry,
-        kMatchReturn,
-    }));
-  } else {
-    Instruction* unbox1 = nullptr;
-    Instruction* unbox2 = nullptr;
+      // Loop header once again
+      kMatchAndMoveJoinEntry,
+      kMatchAndMoveCheckStackOverflow,
+      kMatchAndMoveBranchFalse,
 
-    RELEASE_ASSERT(cursor.TryMatch({
-        kMoveGlob,
-        kMatchAndMoveCreateArray,
-        kMatchAndMoveUnboxInt64,
-        {kMoveAny, &unbox1},
-        {kMoveAny, &unbox2},
-        kMatchAndMoveGoto,
+      // After loop
+      kMatchAndMoveTargetEntry,
+      kMatchReturn,
+  }));
 
-        // Loop header
-        kMatchAndMoveJoinEntry,
-        kMatchAndMoveCheckStackOverflow,
-        kMatchAndMoveBranchTrue,
-
-        // Loop body
-        kMatchAndMoveTargetEntry,
-        kWordSize == 4 ? kMatchAndMoveBoxInt64 : kNop,
-        kMatchAndMoveBoxInt64,
-        kMatchAndMoveStoreIndexed,
-        kMatchAndMoveBinaryInt64Op,
-        kMatchAndMoveGoto,
-
-        // Loop header once again
-        kMatchAndMoveJoinEntry,
-        kMatchAndMoveCheckStackOverflow,
-        kMatchAndMoveBranchFalse,
-
-        // After loop
-        kMatchAndMoveTargetEntry,
-        kMatchReturn,
-    }));
-
-    EXPECT(unbox1->IsUnboxedConstant() || unbox1->IsUnboxInt64());
-    EXPECT(unbox2->IsUnboxedConstant() || unbox2->IsUnboxInt64());
-  }
+  EXPECT(unbox1->IsUnboxedConstant() || unbox1->IsUnboxInt64());
+  EXPECT(unbox2->IsUnboxedConstant() || unbox2->IsUnboxInt64());
 }
 
 #endif  // defined(DART_PRECOMPILER)
diff --git a/runtime/vm/compiler/backend/locations.h b/runtime/vm/compiler/backend/locations.h
index 8f4c37f..1d29a39 100644
--- a/runtime/vm/compiler/backend/locations.h
+++ b/runtime/vm/compiler/backend/locations.h
@@ -27,6 +27,7 @@
 // All unboxed integer representations.
 // Format: (representation name, is unsigned, value type)
 #define FOR_EACH_INTEGER_REPRESENTATION_KIND(M)                                \
+  M(UnboxedUint8, true, uint8_t)                                               \
   M(UnboxedInt32, false, int32_t)                                              \
   M(UnboxedUint32, true, uint32_t)                                             \
   M(UnboxedInt64, false, int64_t)
diff --git a/runtime/vm/compiler/backend/range_analysis.cc b/runtime/vm/compiler/backend/range_analysis.cc
index 029dd94..4018099 100644
--- a/runtime/vm/compiler/backend/range_analysis.cc
+++ b/runtime/vm/compiler/backend/range_analysis.cc
@@ -2670,6 +2670,7 @@
     case kTagged:
       return RangeBoundary::kRangeBoundarySmi;
     case kUnboxedInt32:
+    case kUnboxedUint8:  // Overapproximate Uint8 as Int32.
       return RangeBoundary::kRangeBoundaryInt32;
     case kUnboxedInt64:
     case kUnboxedUint32:  // Overapproximate Uint32 as Int64.
@@ -2689,12 +2690,17 @@
           RangeBoundary::FromConstant(compiler::target::Array::kMaxElements));
       break;
 
-    case Slot::Kind::kTypeArguments_length:
     case Slot::Kind::kTypedDataBase_length:
     case Slot::Kind::kTypedDataView_offset_in_bytes:
       *range = Range(RangeBoundary::FromConstant(0), RangeBoundary::MaxSmi());
       break;
 
+    case Slot::Kind::kTypeArguments_length:
+      *range = Range(RangeBoundary::FromConstant(0),
+                     RangeBoundary::FromConstant(
+                         compiler::target::TypeArguments::kMaxElements));
+      break;
+
     case Slot::Kind::kString_length:
       *range = Range(
           RangeBoundary::FromConstant(0),
@@ -2717,6 +2723,8 @@
     case Slot::Kind::kClosure_function:
     case Slot::Kind::kClosure_function_type_arguments:
     case Slot::Kind::kClosure_instantiator_type_arguments:
+    case Slot::Kind::kClosureData_default_type_arguments:
+    case Slot::Kind::kFunction_data:
     case Slot::Kind::kFunction_parameter_names:
     case Slot::Kind::kFunction_parameter_types:
     case Slot::Kind::kFunction_type_parameters:
@@ -2724,13 +2732,22 @@
     case Slot::Kind::kTypedDataView_data:
     case Slot::Kind::kType_arguments:
     case Slot::Kind::kTypeArgumentsIndex:
+    case Slot::Kind::kTypeParameter_bound:
+    case Slot::Kind::kTypeParameter_name:
     case Slot::Kind::kUnhandledException_exception:
     case Slot::Kind::kUnhandledException_stacktrace:
       // Not an integer valued field.
       UNREACHABLE();
       break;
 
+    case Slot::Kind::kArrayElement:
+      // Should not be used in LoadField instructions.
+      UNREACHABLE();
+      break;
+
+    case Slot::Kind::kFunction_kind_tag:
     case Slot::Kind::kFunction_packed_fields:
+    case Slot::Kind::kTypeParameter_flags:
       *range = Range::Full(RepresentationToRangeSize(slot().representation()));
       break;
 
@@ -2747,6 +2764,12 @@
     case Slot::Kind::kArgumentsDescriptor_size:
       *range = Range(RangeBoundary::FromConstant(0), RangeBoundary::MaxSmi());
       break;
+
+    case Slot::Kind::kClosureData_default_type_arguments_info:
+      *range = Range(
+          RangeBoundary::FromConstant(0),
+          RangeBoundary::FromConstant(
+              (1 << Function::NumParentTypeParametersField::kNextBit) - 1));
   }
 }
 
diff --git a/runtime/vm/compiler/backend/redundancy_elimination.cc b/runtime/vm/compiler/backend/redundancy_elimination.cc
index 4ab46bc..8118b63 100644
--- a/runtime/vm/compiler/backend/redundancy_elimination.cc
+++ b/runtime/vm/compiler/backend/redundancy_elimination.cc
@@ -10,6 +10,7 @@
 #include "vm/compiler/backend/il_printer.h"
 #include "vm/compiler/backend/loops.h"
 #include "vm/hash_map.h"
+#include "vm/object_store.h"
 #include "vm/stack_frame.h"
 
 namespace dart {
@@ -1006,8 +1007,9 @@
       return true;
     }
 
-    return (place->kind() == Place::kInstanceField) &&
-           !CanBeAliased(place->instance());
+    return ((place->kind() == Place::kInstanceField) ||
+            (place->kind() == Place::kConstantIndexed)) &&
+           (place->instance() != nullptr) && !CanBeAliased(place->instance());
   }
 
   // Returns true if there are direct loads from the given place.
@@ -2061,6 +2063,40 @@
             }
           }
           continue;
+        } else if (auto alloc = instr->AsCreateArray()) {
+          for (Value* use = alloc->input_use_list(); use != nullptr;
+               use = use->next_use()) {
+            // Look for all immediate loads/stores from this object.
+            if (use->use_index() != 0) {
+              continue;
+            }
+            intptr_t place_id = -1;
+            Definition* forward_def = nullptr;
+            if (auto load = use->instruction()->AsLoadField()) {
+              if (load->slot().IsTypeArguments()) {
+                place_id = GetPlaceId(load);
+                forward_def = alloc->element_type()->definition();
+              }
+            } else if (use->instruction()->IsLoadIndexed() ||
+                       use->instruction()->IsStoreIndexed()) {
+              if (aliased_set_->CanBeAliased(alloc)) {
+                continue;
+              }
+              place_id = GetPlaceId(use->instruction());
+              if (aliased_set_->places()[place_id]->kind() !=
+                  Place::kConstantIndexed) {
+                continue;
+              }
+              // Set initial value of array element to null.
+              forward_def = graph_->constant_null();
+            }
+            if (forward_def != nullptr) {
+              gen->Add(place_id);
+              if (out_values == nullptr) out_values = CreateBlockOutValues();
+              (*out_values)[place_id] = forward_def;
+            }
+          }
+          continue;
         }
 
         if (!IsLoadEliminationCandidate(defn)) {
@@ -3003,10 +3039,22 @@
 // Allocation Sinking
 //
 
+static bool IsValidLengthForAllocationSinking(
+    ArrayAllocationInstr* array_alloc) {
+  const intptr_t kMaxAllocationSinkingNumElements = 32;
+  if (!array_alloc->HasConstantNumElements()) {
+    return false;
+  }
+  const intptr_t length = array_alloc->GetConstantNumElements();
+  return (length >= 0) && (length <= kMaxAllocationSinkingNumElements);
+}
+
 // Returns true if the given instruction is an allocation that
 // can be sunk by the Allocation Sinking pass.
 static bool IsSupportedAllocation(Instruction* instr) {
-  return instr->IsAllocateObject() || instr->IsAllocateUninitializedContext();
+  return instr->IsAllocateObject() || instr->IsAllocateUninitializedContext() ||
+         (instr->IsArrayAllocation() &&
+          IsValidLengthForAllocationSinking(instr->AsArrayAllocation()));
 }
 
 enum SafeUseCheck { kOptimisticCheck, kStrictCheck };
@@ -3032,12 +3080,13 @@
 // optimistically and then checks each collected candidate strictly and unmarks
 // invalid candidates transitively until only strictly valid ones remain.
 static bool IsSafeUse(Value* use, SafeUseCheck check_type) {
+  ASSERT(IsSupportedAllocation(use->definition()));
+
   if (use->instruction()->IsMaterializeObject()) {
     return true;
   }
 
-  StoreInstanceFieldInstr* store = use->instruction()->AsStoreInstanceField();
-  if (store != NULL) {
+  if (auto* store = use->instruction()->AsStoreInstanceField()) {
     if (use == store->value()) {
       Definition* instance = store->instance()->definition();
       return IsSupportedAllocation(instance) &&
@@ -3047,6 +3096,38 @@
     return true;
   }
 
+  if (auto* store = use->instruction()->AsStoreIndexed()) {
+    if (use == store->index()) {
+      return false;
+    }
+    if (use == store->array()) {
+      if (!store->index()->BindsToSmiConstant()) {
+        return false;
+      }
+      const intptr_t index = store->index()->BoundSmiConstant();
+      if (index < 0 || index >= use->definition()
+                                    ->AsArrayAllocation()
+                                    ->GetConstantNumElements()) {
+        return false;
+      }
+      if (auto* alloc_typed_data = use->definition()->AsAllocateTypedData()) {
+        if (store->class_id() != alloc_typed_data->class_id() ||
+            !store->aligned() ||
+            store->index_scale() != compiler::target::Instance::ElementSizeFor(
+                                        alloc_typed_data->class_id())) {
+          return false;
+        }
+      }
+    }
+    if (use == store->value()) {
+      Definition* instance = store->array()->definition();
+      return IsSupportedAllocation(instance) &&
+             ((check_type == kOptimisticCheck) ||
+              instance->Identity().IsAllocationSinkingCandidate());
+    }
+    return true;
+  }
+
   return false;
 }
 
@@ -3071,13 +3152,26 @@
 
 // If the given use is a store into an object then return an object we are
 // storing into.
-static Definition* StoreInto(Value* use) {
-  StoreInstanceFieldInstr* store = use->instruction()->AsStoreInstanceField();
-  if (store != NULL) {
+static Definition* StoreDestination(Value* use) {
+  if (auto store = use->instruction()->AsStoreInstanceField()) {
     return store->instance()->definition();
   }
+  if (auto store = use->instruction()->AsStoreIndexed()) {
+    return store->array()->definition();
+  }
+  return nullptr;
+}
 
-  return NULL;
+// If the given instruction is a load from an object, then return an object
+// we are loading from.
+static Definition* LoadSource(Definition* instr) {
+  if (auto load = instr->AsLoadField()) {
+    return load->instance()->definition();
+  }
+  if (auto load = instr->AsLoadIndexed()) {
+    return load->array()->definition();
+  }
+  return nullptr;
 }
 
 // Remove the given allocation from the graph. It is not observable.
@@ -3106,10 +3200,6 @@
 #endif
   ASSERT(alloc->input_use_list() == NULL);
   alloc->RemoveFromGraph();
-  if (alloc->ArgumentCount() > 0) {
-    ASSERT(alloc->ArgumentCount() == 1);
-    ASSERT(!alloc->HasPushArguments());
-  }
 }
 
 // Find allocation instructions that can be potentially eliminated and
@@ -3186,23 +3276,23 @@
 }
 
 // We transitively insert materializations at each deoptimization exit that
-// might see the given allocation (see ExitsCollector). Some of this
+// might see the given allocation (see ExitsCollector). Some of these
 // materializations are not actually used and some fail to compute because
 // they are inserted in the block that is not dominated by the allocation.
-// Remove them unused materializations from the graph.
+// Remove unused materializations from the graph.
 void AllocationSinking::RemoveUnusedMaterializations() {
   intptr_t j = 0;
   for (intptr_t i = 0; i < materializations_.length(); i++) {
     MaterializeObjectInstr* mat = materializations_[i];
-    if ((mat->input_use_list() == NULL) && (mat->env_use_list() == NULL)) {
+    if ((mat->input_use_list() == nullptr) &&
+        (mat->env_use_list() == nullptr)) {
       // Check if this materialization failed to compute and remove any
       // unforwarded loads. There were no loads from any allocation sinking
       // candidate in the beginning so it is safe to assume that any encountered
       // load was inserted by CreateMaterializationAt.
       for (intptr_t i = 0; i < mat->InputCount(); i++) {
-        LoadFieldInstr* load = mat->InputAt(i)->definition()->AsLoadField();
-        if ((load != NULL) &&
-            (load->instance()->definition() == mat->allocation())) {
+        Definition* load = mat->InputAt(i)->definition();
+        if (LoadSource(load) == mat->allocation()) {
           load->ReplaceUsesWith(flow_graph_->constant_null());
           load->RemoveFromGraph();
         }
@@ -3263,14 +3353,16 @@
       alloc->set_env_use_list(NULL);
       for (Value* use = alloc->input_use_list(); use != NULL;
            use = use->next_use()) {
-        if (use->instruction()->IsLoadField()) {
-          LoadFieldInstr* load = use->instruction()->AsLoadField();
+        if (use->instruction()->IsLoadField() ||
+            use->instruction()->IsLoadIndexed()) {
+          Definition* load = use->instruction()->AsDefinition();
           load->ReplaceUsesWith(flow_graph_->constant_null());
           load->RemoveFromGraph();
         } else {
           ASSERT(use->instruction()->IsMaterializeObject() ||
                  use->instruction()->IsPhi() ||
-                 use->instruction()->IsStoreInstanceField());
+                 use->instruction()->IsStoreInstanceField() ||
+                 use->instruction()->IsStoreIndexed());
         }
       }
     } else {
@@ -3312,17 +3404,34 @@
   //   v_1     <- LoadField(v_0, field_1)
   //           ...
   //   v_N     <- LoadField(v_0, field_N)
-  //   v_{N+1} <- MaterializeObject(field_1 = v_1, ..., field_N = v_{N})
+  //   v_{N+1} <- MaterializeObject(field_1 = v_1, ..., field_N = v_N)
+  //
+  // For typed data objects materialization looks like this:
+  //   v_1     <- LoadIndexed(v_0, index_1)
+  //           ...
+  //   v_N     <- LoadIndexed(v_0, index_N)
+  //   v_{N+1} <- MaterializeObject([index_1] = v_1, ..., [index_N] = v_N)
+  //
+  // For arrays materialization looks like this:
+  //   v_1     <- LoadIndexed(v_0, index_1)
+  //           ...
+  //   v_N     <- LoadIndexed(v_0, index_N)
+  //   v_{N+1} <- LoadField(v_0, Array.type_arguments)
+  //   v_{N+2} <- MaterializeObject([index_1] = v_1, ..., [index_N] = v_N,
+  //                                type_arguments = v_{N+1})
+  //
   for (intptr_t i = 0; i < candidates_.length(); i++) {
     InsertMaterializations(candidates_[i]);
   }
 
-  // Run load forwarding to eliminate LoadField instructions inserted above.
+  // Run load forwarding to eliminate LoadField/LoadIndexed instructions
+  // inserted above.
+  //
   // All loads will be successfully eliminated because:
-  //   a) they use fields (not offsets) and thus provide precise aliasing
+  //   a) they use fields/constant indices and thus provide precise aliasing
   //      information
-  //   b) candidate does not escape and thus its fields is not affected by
-  //      external effects from calls.
+  //   b) candidate does not escape and thus its fields/elements are not
+  //      affected by external effects from calls.
   LoadOptimizer::OptimizeGraph(flow_graph_);
 
   NormalizeMaterializations();
@@ -3426,23 +3535,57 @@
   // instruction.
   Instruction* load_point = FirstMaterializationAt(exit);
 
-  // Insert load instruction for every field.
+  // Insert load instruction for every field and element.
   for (auto slot : slots) {
-    LoadFieldInstr* load =
-        new (Z) LoadFieldInstr(new (Z) Value(alloc), *slot, alloc->token_pos());
+    Definition* load = nullptr;
+    if (slot->IsArrayElement()) {
+      intptr_t array_cid, index;
+      if (alloc->IsCreateArray()) {
+        array_cid = kArrayCid;
+        index =
+            compiler::target::Array::index_at_offset(slot->offset_in_bytes());
+      } else if (auto alloc_typed_data = alloc->AsAllocateTypedData()) {
+        array_cid = alloc_typed_data->class_id();
+        index = slot->offset_in_bytes() /
+                compiler::target::Instance::ElementSizeFor(array_cid);
+      } else {
+        UNREACHABLE();
+      }
+      load = new (Z) LoadIndexedInstr(
+          new (Z) Value(alloc),
+          new (Z) Value(
+              flow_graph_->GetConstant(Smi::ZoneHandle(Z, Smi::New(index)))),
+          /*index_unboxed=*/false,
+          /*index_scale=*/compiler::target::Instance::ElementSizeFor(array_cid),
+          array_cid, kAlignedAccess, DeoptId::kNone, alloc->token_pos());
+    } else {
+      load = new (Z)
+          LoadFieldInstr(new (Z) Value(alloc), *slot, alloc->token_pos());
+    }
     flow_graph_->InsertBefore(load_point, load, nullptr, FlowGraph::kValue);
     values->Add(new (Z) Value(load));
   }
 
-  MaterializeObjectInstr* mat = nullptr;
-  if (alloc->IsAllocateObject()) {
-    mat = new (Z)
-        MaterializeObjectInstr(alloc->AsAllocateObject(), slots, values);
+  const Class* cls = nullptr;
+  intptr_t num_elements = -1;
+  if (auto instr = alloc->AsAllocateObject()) {
+    cls = &(instr->cls());
+  } else if (auto instr = alloc->AsAllocateUninitializedContext()) {
+    cls = &Class::ZoneHandle(Object::context_class());
+    num_elements = instr->num_context_variables();
+  } else if (auto instr = alloc->AsCreateArray()) {
+    cls = &Class::ZoneHandle(
+        flow_graph_->isolate()->object_store()->array_class());
+    num_elements = instr->GetConstantNumElements();
+  } else if (auto instr = alloc->AsAllocateTypedData()) {
+    cls = &Class::ZoneHandle(
+        flow_graph_->isolate()->class_table()->At(instr->class_id()));
+    num_elements = instr->GetConstantNumElements();
   } else {
-    ASSERT(alloc->IsAllocateUninitializedContext());
-    mat = new (Z) MaterializeObjectInstr(
-        alloc->AsAllocateUninitializedContext(), slots, values);
+    UNREACHABLE();
   }
+  MaterializeObjectInstr* mat = new (Z) MaterializeObjectInstr(
+      alloc->AsAllocation(), *cls, num_elements, slots, values);
 
   flow_graph_->InsertBefore(exit, mat, nullptr, FlowGraph::kValue);
 
@@ -3497,7 +3640,7 @@
   // this object.
   for (Value* use = alloc->input_use_list(); use != NULL;
        use = use->next_use()) {
-    Definition* obj = StoreInto(use);
+    Definition* obj = StoreDestination(use);
     if ((obj != NULL) && (obj != alloc)) {
       AddInstruction(&worklist_, obj);
     }
@@ -3521,14 +3664,27 @@
 }
 
 void AllocationSinking::InsertMaterializations(Definition* alloc) {
-  // Collect all fields that are written for this instance.
+  // Collect all fields and array elements that are written for this instance.
   auto slots = new (Z) ZoneGrowableArray<const Slot*>(5);
 
   for (Value* use = alloc->input_use_list(); use != NULL;
        use = use->next_use()) {
-    StoreInstanceFieldInstr* store = use->instruction()->AsStoreInstanceField();
-    if ((store != NULL) && (store->instance()->definition() == alloc)) {
-      AddSlot(slots, store->slot());
+    if (StoreDestination(use) == alloc) {
+      if (auto store = use->instruction()->AsStoreInstanceField()) {
+        AddSlot(slots, store->slot());
+      } else if (auto store = use->instruction()->AsStoreIndexed()) {
+        const intptr_t index = store->index()->BoundSmiConstant();
+        intptr_t offset = -1;
+        if (alloc->IsCreateArray()) {
+          offset = compiler::target::Array::element_offset(index);
+        } else if (alloc->IsAllocateTypedData()) {
+          offset = index * store->index_scale();
+        } else {
+          UNREACHABLE();
+        }
+        AddSlot(slots,
+                Slot::GetArrayElementSlot(flow_graph_->thread(), offset));
+      }
     }
   }
 
@@ -3538,6 +3694,13 @@
                                                    alloc_object->cls()));
     }
   }
+  if (auto create_array = alloc->AsCreateArray()) {
+    AddSlot(slots,
+            Slot::GetTypeArgumentsSlotFor(
+                flow_graph_->thread(),
+                Class::Handle(
+                    Z, flow_graph_->isolate()->object_store()->array_class())));
+  }
 
   // Collect all instructions that mention this object in the environment.
   exits_collector_.CollectTransitively(alloc);
diff --git a/runtime/vm/compiler/backend/redundancy_elimination_test.cc b/runtime/vm/compiler/backend/redundancy_elimination_test.cc
index 2225ab8..bc3b72f 100644
--- a/runtime/vm/compiler/backend/redundancy_elimination_test.cc
+++ b/runtime/vm/compiler/backend/redundancy_elimination_test.cc
@@ -13,7 +13,6 @@
 #include "vm/compiler/backend/loops.h"
 #include "vm/compiler/backend/type_propagator.h"
 #include "vm/compiler/compiler_pass.h"
-#include "vm/compiler/frontend/bytecode_reader.h"
 #include "vm/compiler/frontend/kernel_to_il.h"
 #include "vm/compiler/jit/jit_call_specializer.h"
 #include "vm/flags.h"
@@ -60,35 +59,6 @@
   }
 }
 
-#if !defined(PRODUCT)
-void PopulateEnvironmentFromBytecodeLocalVariables(
-    const Function& function,
-    FlowGraph* graph,
-    GrowableArray<LocalVariable*>* env) {
-  const auto& bytecode = Bytecode::Handle(function.bytecode());
-  ASSERT(!bytecode.IsNull());
-
-  kernel::BytecodeLocalVariablesIterator iter(Thread::Current()->zone(),
-                                              bytecode);
-  while (iter.MoveNext()) {
-    if (iter.IsVariableDeclaration() && !iter.IsCaptured()) {
-      LocalVariable* const var = new LocalVariable(
-          TokenPosition::kNoSource, TokenPosition::kNoSource,
-          String::ZoneHandle(graph->zone(), iter.Name()),
-          AbstractType::ZoneHandle(graph->zone(), iter.Type()));
-      if (iter.Index() < 0) {  // Parameter.
-        var->set_index(VariableIndex(-iter.Index() - kKBCParamEndSlotFromFp));
-      } else {
-        var->set_index(VariableIndex(-iter.Index()));
-      }
-      const intptr_t env_index = graph->EnvIndex(var);
-      env->EnsureLength(env_index + 1, nullptr);
-      (*env)[env_index] = var;
-    }
-  }
-}
-#endif
-
 // Run TryCatchAnalyzer optimization on the function foo from the given script
 // and check that the only variables from the given list are synchronized
 // on catch entry.
@@ -118,17 +88,7 @@
   auto scope = graph->parsed_function().scope();
 
   GrowableArray<LocalVariable*> env;
-  if (function.is_declared_in_bytecode()) {
-#if defined(PRODUCT)
-    // In product mode information about local variables is not retained in
-    // bytecode, so we can't find variables by names.
-    return;
-#else
-    PopulateEnvironmentFromBytecodeLocalVariables(function, graph, &env);
-#endif
-  } else {
-    FlattenScopeIntoEnvironment(graph, scope, &env);
-  }
+  FlattenScopeIntoEnvironment(graph, scope, &env);
 
   for (intptr_t i = 0; i < env.length(); i++) {
     bool found = false;
@@ -1114,6 +1074,181 @@
   EXPECT(load_field_in_loop2->calls_initializer());
 }
 
+ISOLATE_UNIT_TEST_CASE(AllocationSinking_Arrays) {
+  const char* kScript = R"(
+import 'dart:typed_data';
+
+class Vector2 {
+  final Float64List _v2storage;
+
+  @pragma('vm:prefer-inline')
+  Vector2.zero() : _v2storage = Float64List(2);
+
+  @pragma('vm:prefer-inline')
+  factory Vector2(double x, double y) => Vector2.zero()..setValues(x, y);
+
+  @pragma('vm:prefer-inline')
+  factory Vector2.copy(Vector2 other) => Vector2.zero()..setFrom(other);
+
+  @pragma('vm:prefer-inline')
+  Vector2 clone() => Vector2.copy(this);
+
+  @pragma('vm:prefer-inline')
+  void setValues(double x_, double y_) {
+    _v2storage[0] = x_;
+    _v2storage[1] = y_;
+  }
+
+  @pragma('vm:prefer-inline')
+  void setFrom(Vector2 other) {
+    final otherStorage = other._v2storage;
+    _v2storage[1] = otherStorage[1];
+    _v2storage[0] = otherStorage[0];
+  }
+
+  @pragma('vm:prefer-inline')
+  Vector2 operator +(Vector2 other) => clone()..add(other);
+
+  @pragma('vm:prefer-inline')
+  void add(Vector2 arg) {
+    final argStorage = arg._v2storage;
+    _v2storage[0] = _v2storage[0] + argStorage[0];
+    _v2storage[1] = _v2storage[1] + argStorage[1];
+  }
+
+  @pragma('vm:prefer-inline')
+  double get x => _v2storage[0];
+
+  @pragma('vm:prefer-inline')
+  double get y => _v2storage[1];
+}
+
+@pragma('vm:never-inline')
+String foo(double x) {
+  // All allocations in this function are eliminated by the compiler,
+  // except array allocation for string interpolation at the end.
+  List v1 = List.filled(2, null);
+  v1[0] = 1;
+  v1[1] = 'hi';
+  Vector2 v2 = new Vector2(1.0, 2.0);
+  Vector2 v3 = v2 + Vector2(x, x);
+  double sum = v3.x + v3.y;
+  return "v1: [${v1[0]},${v1[1]}], v2: [${v2.x},${v2.y}], v3: [${v3.x},${v3.y}], sum: $sum";
+}
+
+main() {
+  foo(42.0);
+}
+  )";
+
+  const auto& root_library = Library::Handle(LoadTestScript(kScript));
+  Invoke(root_library, "main");
+  const auto& function = Function::Handle(GetFunction(root_library, "foo"));
+  TestPipeline pipeline(function, CompilerPass::kJIT);
+  FlowGraph* flow_graph = pipeline.RunPasses({});
+  ASSERT(flow_graph != nullptr);
+
+  auto entry = flow_graph->graph_entry()->normal_entry();
+  EXPECT(entry != nullptr);
+
+  /* Flow graph to match:
+
+  4:     CheckStackOverflow:8(stack=0, loop=0)
+  6:     v590 <- UnboxedConstant(#1.0) T{_Double}
+  7:     ParallelMove DS-8 <- xmm0
+  8:     v592 <- UnboxedConstant(#2.0) T{_Double}
+  9:     ParallelMove rax <- S+2, DS-7 <- xmm1
+ 10:     CheckClass:14(v2 Cids[1: _Double@0150898 etc.  cid 54])
+ 12:     v526 <- Unbox:14(v2 T{_Double}) T{_Double}
+ 14:     ParallelMove xmm3 <- xmm0
+ 14:     v352 <- BinaryDoubleOp:22(+, v590, v526) T{_Double}
+ 15:     ParallelMove DS-6 <- xmm3
+ 16:     ParallelMove xmm4 <- xmm1
+ 16:     v363 <- BinaryDoubleOp:34(+, v592, v526) T{_Double}
+ 17:     ParallelMove DS-5 <- xmm4
+ 18:     ParallelMove xmm2 <- xmm3
+ 18:     v21 <- BinaryDoubleOp:28(+, v352, v363) T{_Double}
+ 19:     ParallelMove rbx <- C, r10 <- C, DS-4 <- xmm2
+ 20:     v24 <- CreateArray:30(v0, v23) T{_List}
+ 21:     ParallelMove rcx <- rax
+ 22:     ParallelMove S-3 <- rcx
+ 22:     StoreIndexed(v24, v6, v26, NoStoreBarrier)
+ 24:     StoreIndexed(v24, v7, v7, NoStoreBarrier)
+ 26:     StoreIndexed(v24, v3, v29, NoStoreBarrier)
+ 28:     StoreIndexed(v24, v30, v8, NoStoreBarrier)
+ 30:     StoreIndexed(v24, v33, v34, NoStoreBarrier)
+ 31:     ParallelMove xmm0 <- DS-8
+ 32:     v582 <- Box(v590) T{_Double}
+ 33:     ParallelMove rdx <- rcx, rax <- rax
+ 34:     StoreIndexed(v24, v35, v582)
+ 36:     StoreIndexed(v24, v38, v29, NoStoreBarrier)
+ 37:     ParallelMove xmm0 <- DS-7
+ 38:     v584 <- Box(v592) T{_Double}
+ 39:     ParallelMove rdx <- rcx, rax <- rax
+ 40:     StoreIndexed(v24, v39, v584)
+ 42:     StoreIndexed(v24, v42, v43, NoStoreBarrier)
+ 43:     ParallelMove xmm0 <- DS-6
+ 44:     v586 <- Box(v352) T{_Double}
+ 45:     ParallelMove rdx <- rcx, rax <- rax
+ 46:     StoreIndexed(v24, v44, v586)
+ 48:     StoreIndexed(v24, v47, v29, NoStoreBarrier)
+ 49:     ParallelMove xmm0 <- DS-5
+ 50:     v588 <- Box(v363) T{_Double}
+ 51:     ParallelMove rdx <- rcx, rax <- rax
+ 52:     StoreIndexed(v24, v48, v588)
+ 54:     StoreIndexed(v24, v51, v52, NoStoreBarrier)
+ 55:     ParallelMove xmm0 <- DS-4
+ 56:     v580 <- Box(v21) T{_Double}
+ 57:     ParallelMove rdx <- rcx, rax <- rax
+ 58:     StoreIndexed(v24, v53, v580)
+ 59:     ParallelMove rax <- rcx
+ 60:     v54 <- StringInterpolate:44(v24) T{String}
+ 61:     ParallelMove rax <- rax
+ 62:     Return:48(v54)
+*/
+
+  CreateArrayInstr* create_array = nullptr;
+  StringInterpolateInstr* string_interpolate = nullptr;
+
+  ILMatcher cursor(flow_graph, entry, /*trace=*/true,
+                   ParallelMovesHandling::kSkip);
+  RELEASE_ASSERT(cursor.TryMatch({
+      kMatchAndMoveFunctionEntry,
+      kMatchAndMoveCheckStackOverflow,
+      kMatchAndMoveUnboxedConstant,
+      kMatchAndMoveUnboxedConstant,
+      kMatchAndMoveCheckClass,
+      kMatchAndMoveUnbox,
+      kMatchAndMoveBinaryDoubleOp,
+      kMatchAndMoveBinaryDoubleOp,
+      kMatchAndMoveBinaryDoubleOp,
+      {kMatchAndMoveCreateArray, &create_array},
+      kMatchAndMoveStoreIndexed,
+      kMatchAndMoveStoreIndexed,
+      kMatchAndMoveStoreIndexed,
+      kMatchAndMoveStoreIndexed,
+      kMatchAndMoveStoreIndexed,
+      kMatchAndMoveBox,
+      kMatchAndMoveStoreIndexed,
+      kMatchAndMoveStoreIndexed,
+      kMatchAndMoveBox,
+      kMatchAndMoveStoreIndexed,
+      kMatchAndMoveStoreIndexed,
+      kMatchAndMoveBox,
+      kMatchAndMoveStoreIndexed,
+      kMatchAndMoveStoreIndexed,
+      kMatchAndMoveBox,
+      kMatchAndMoveStoreIndexed,
+      kMatchAndMoveStoreIndexed,
+      kMatchAndMoveBox,
+      kMatchAndMoveStoreIndexed,
+      {kMatchAndMoveStringInterpolate, &string_interpolate},
+      kMatchReturn,
+  }));
+
+  EXPECT(string_interpolate->value()->definition() == create_array);
+}
+
 #if !defined(TARGET_ARCH_IA32)
 
 ISOLATE_UNIT_TEST_CASE(DelayAllocations_DelayAcrossCalls) {
diff --git a/runtime/vm/compiler/backend/slot.cc b/runtime/vm/compiler/backend/slot.cc
index 5f256b6..1c348aa 100644
--- a/runtime/vm/compiler/backend/slot.cc
+++ b/runtime/vm/compiler/backend/slot.cc
@@ -58,6 +58,8 @@
 #undef NATIVE_CASE
     case Kind::kTypeArguments:
       return "TypeArguments";
+    case Kind::kArrayElement:
+      return "ArrayElement";
     case Kind::kCapturedVariable:
       return "CapturedVariable";
     case Kind::kDartField:
@@ -81,6 +83,10 @@
     *out = Kind::kTypeArguments;
     return true;
   }
+  if (strcmp(str, "ArrayElement") == 0) {
+    *out = Kind::kArrayElement;
+    return true;
+  }
   if (strcmp(str, "CapturedVariable") == 0) {
     *out = Kind::kCapturedVariable;
     return true;
@@ -173,6 +179,9 @@
     case kImmutableArrayCid:
       return GetNativeSlot(Kind::kArray_length);
 
+    case kTypeArgumentsCid:
+      return GetNativeSlot(Kind::kTypeArguments_length);
+
     default:
       UNREACHABLE();
       return GetNativeSlot(Kind::kArray_length);
@@ -212,6 +221,14 @@
   return SlotCache::Instance(thread).Canonicalize(slot);
 }
 
+const Slot& Slot::GetArrayElementSlot(Thread* thread,
+                                      intptr_t offset_in_bytes) {
+  const Slot& slot =
+      Slot(Kind::kArrayElement, IsNullableBit::encode(true), kDynamicCid,
+           offset_in_bytes, ":array_element", /*static_type=*/nullptr, kTagged);
+  return SlotCache::Instance(thread).Canonicalize(slot);
+}
+
 const Slot& Slot::Get(const Field& field,
                       const ParsedFunction* parsed_function) {
   Thread* thread = Thread::Current();
@@ -328,6 +345,7 @@
   switch (kind_) {
     case Kind::kTypeArguments:
     case Kind::kTypeArgumentsIndex:
+    case Kind::kArrayElement:
       return (offset_in_bytes_ == other->offset_in_bytes_);
 
     case Kind::kCapturedVariable:
diff --git a/runtime/vm/compiler/backend/slot.h b/runtime/vm/compiler/backend/slot.h
index 1fbc213..8c24078 100644
--- a/runtime/vm/compiler/backend/slot.h
+++ b/runtime/vm/compiler/backend/slot.h
@@ -56,6 +56,8 @@
   V(Closure, ClosureLayout, instantiator_type_arguments, TypeArguments, FINAL) \
   V(Closure, ClosureLayout, delayed_type_arguments, TypeArguments, FINAL)      \
   V(Closure, ClosureLayout, function_type_arguments, TypeArguments, FINAL)     \
+  V(ClosureData, ClosureDataLayout, default_type_arguments, TypeArguments,     \
+    FINAL)                                                                     \
   V(Function, FunctionLayout, type_parameters, TypeArguments, FINAL)           \
   V(Type, TypeLayout, arguments, TypeArguments, FINAL)
 
@@ -77,6 +79,8 @@
   V(Closure, ClosureLayout, function, Function, FINAL)                         \
   V(Closure, ClosureLayout, context, Context, FINAL)                           \
   V(Closure, ClosureLayout, hash, Context, VAR)                                \
+  V(ClosureData, ClosureDataLayout, default_type_arguments_info, Smi, FINAL)   \
+  V(Function, FunctionLayout, data, Dynamic, FINAL)                            \
   V(Function, FunctionLayout, parameter_names, Array, FINAL)                   \
   V(Function, FunctionLayout, parameter_types, Array, FINAL)                   \
   V(GrowableObjectArray, GrowableObjectArrayLayout, length, Smi, VAR)          \
@@ -96,6 +100,8 @@
   V(ArgumentsDescriptor, ArrayLayout, size, Smi, FINAL)                        \
   V(PointerBase, PointerBaseLayout, data_field, Dynamic, FINAL)                \
   V(TypeArguments, TypeArgumentsLayout, length, Smi, FINAL)                    \
+  V(TypeParameter, TypeParameterLayout, bound, Dynamic, FINAL)                 \
+  V(TypeParameter, TypeParameterLayout, name, Dynamic, FINAL)                  \
   V(UnhandledException, UnhandledExceptionLayout, exception, Dynamic, FINAL)   \
   V(UnhandledException, UnhandledExceptionLayout, stacktrace, Dynamic, FINAL)
 
@@ -115,7 +121,9 @@
 //
 // Note: As the underlying field is unboxed, these slots cannot be nullable.
 #define UNBOXED_NATIVE_SLOTS_LIST(V)                                           \
-  V(Function, FunctionLayout, packed_fields, Uint32, FINAL)
+  V(Function, FunctionLayout, kind_tag, Uint32, FINAL)                         \
+  V(Function, FunctionLayout, packed_fields, Uint32, FINAL)                    \
+  V(TypeParameter, TypeParameterLayout, flags, Uint8, FINAL)
 
 // For uses that do not need the exact_type (boxed) or representation (unboxed)
 // or whether a boxed native slot is nullable. (Generally, such users only need
@@ -148,6 +156,10 @@
     // A slot at a specific [index] in a [RawTypeArgument] vector.
     kTypeArgumentsIndex,
 
+    // A slot corresponding to an array element at given offset.
+    // Only used during allocation sinking and in MaterializeObjectInstr.
+    kArrayElement,
+
     // A slot within a Context object that contains a value of a captured
     // local variable.
     kCapturedVariable,
@@ -176,6 +188,10 @@
   // Returns a slot at a specific [index] in a [RawTypeArgument] vector.
   static const Slot& GetTypeArgumentsIndexSlot(Thread* thread, intptr_t index);
 
+  // Returns a slot corresponding to an array element at [offset_in_bytes].
+  static const Slot& GetArrayElementSlot(Thread* thread,
+                                         intptr_t offset_in_bytes);
+
   // Returns a slot that represents the given captured local variable.
   static const Slot& GetContextVariableSlotFor(Thread* thread,
                                                const LocalVariable& var);
@@ -198,6 +214,7 @@
   bool IsLocalVariable() const { return kind() == Kind::kCapturedVariable; }
   bool IsTypeArguments() const { return kind() == Kind::kTypeArguments; }
   bool IsArgumentOfType() const { return kind() == Kind::kTypeArgumentsIndex; }
+  bool IsArrayElement() const { return kind() == Kind::kArrayElement; }
 
   const char* Name() const;
 
diff --git a/runtime/vm/compiler/backend/type_propagator.cc b/runtime/vm/compiler/backend/type_propagator.cc
index 3877f45..8d96744 100644
--- a/runtime/vm/compiler/backend/type_propagator.cc
+++ b/runtime/vm/compiler/backend/type_propagator.cc
@@ -1815,6 +1815,10 @@
       }
       return ComputeArrayElementType(array());
 
+    case kTypeArgumentsCid:
+      return CompileType::FromAbstractType(Object::dynamic_type(),
+                                           /*is_nullable=*/false);
+
     case kTypedDataFloat32ArrayCid:
     case kTypedDataFloat64ArrayCid:
       return CompileType::FromCid(kDoubleCid);
diff --git a/runtime/vm/compiler/call_specializer.cc b/runtime/vm/compiler/call_specializer.cc
index d1ad68b..c096c35 100644
--- a/runtime/vm/compiler/call_specializer.cc
+++ b/runtime/vm/compiler/call_specializer.cc
@@ -1515,6 +1515,7 @@
 
   auto& td_class = Class::Handle(Z);
   auto& direct_implementors = GrowableObjectArray::Handle(Z);
+  SafepointReadRwLocker ml(thread_, thread_->isolate_group()->program_lock());
 
 #define INIT_HANDLE(iface, member_name, type, cid)                             \
   td_class = typed_data.LookupClass(Symbols::iface());                         \
diff --git a/runtime/vm/compiler/cha.cc b/runtime/vm/compiler/cha.cc
index b7307f6..eed831e 100644
--- a/runtime/vm/compiler/cha.cc
+++ b/runtime/vm/compiler/cha.cc
@@ -43,6 +43,8 @@
     // Class Object has subclasses, although we do not keep track of them.
     return true;
   }
+  Thread* thread = Thread::Current();
+  SafepointReadRwLocker ml(thread, thread->isolate_group()->program_lock());
   const GrowableObjectArray& direct_subclasses =
       GrowableObjectArray::Handle(cls.direct_subclasses());
   return !direct_subclasses.IsNull() && (direct_subclasses.Length() > 0);
@@ -63,8 +65,11 @@
     class_ids->Add(cls.id());
   }
 
+  // This is invoked from precompiler only, we can use unsafe version of
+  // Class::direct_subclasses getter.
+  ASSERT(FLAG_precompiled_mode);
   const GrowableObjectArray& direct_subclasses =
-      GrowableObjectArray::Handle(cls.direct_subclasses());
+      GrowableObjectArray::Handle(cls.direct_subclasses_unsafe());
   if (direct_subclasses.IsNull()) {
     return true;
   }
@@ -135,6 +140,7 @@
     return true;
   }
 
+  SafepointReadRwLocker ml(thread_, thread_->isolate_group()->program_lock());
   const GrowableObjectArray& cls_direct_subclasses =
       GrowableObjectArray::Handle(thread_->zone(), cls.direct_subclasses());
   if (cls_direct_subclasses.IsNull()) {
@@ -149,7 +155,7 @@
       continue;
     }
 
-    if (direct_subclass.LookupDynamicFunction(function_name) !=
+    if (direct_subclass.LookupDynamicFunctionUnsafe(function_name) !=
         Function::null()) {
       return true;
     }
diff --git a/runtime/vm/compiler/cha_test.cc b/runtime/vm/compiler/cha_test.cc
index 2e3d38f..c2c605c 100644
--- a/runtime/vm/compiler/cha_test.cc
+++ b/runtime/vm/compiler/cha_test.cc
@@ -6,11 +6,14 @@
 #include "platform/assert.h"
 #include "vm/class_finalizer.h"
 #include "vm/globals.h"
+#include "vm/resolver.h"
 #include "vm/symbols.h"
 #include "vm/unit_test.h"
 
 namespace dart {
 
+#define Z (thread->zone())
+
 TEST_CASE(ClassHierarchyAnalysis) {
   const char* kScriptChars =
       "class A {"
@@ -57,24 +60,24 @@
   const String& function_foo_name = String::Handle(String::New("foo"));
   const String& function_bar_name = String::Handle(String::New("bar"));
 
-  const Function& class_a_foo =
-      Function::Handle(class_a.LookupDynamicFunction(function_foo_name));
+  const Function& class_a_foo = Function::Handle(
+      Resolver::ResolveDynamicFunction(Z, class_a, function_foo_name));
   EXPECT(!class_a_foo.IsNull());
 
-  const Function& class_a_bar =
-      Function::Handle(class_a.LookupDynamicFunction(function_bar_name));
+  const Function& class_a_bar = Function::Handle(
+      Resolver::ResolveDynamicFunction(Z, class_a, function_bar_name));
   EXPECT(!class_a_bar.IsNull());
 
-  const Function& class_c_foo =
-      Function::Handle(class_c.LookupDynamicFunction(function_foo_name));
+  const Function& class_c_foo = Function::Handle(
+      Resolver::ResolveDynamicFunction(Z, class_c, function_foo_name));
   EXPECT(!class_c_foo.IsNull());
 
-  const Function& class_d_foo =
-      Function::Handle(class_d.LookupDynamicFunction(function_foo_name));
+  const Function& class_d_foo = Function::Handle(
+      Resolver::ResolveDynamicFunction(Z, class_d, function_foo_name));
   EXPECT(!class_d_foo.IsNull());
 
-  const Function& class_d_bar =
-      Function::Handle(class_d.LookupDynamicFunction(function_bar_name));
+  const Function& class_d_bar = Function::Handle(
+      Resolver::ResolveDynamicFunction(Z, class_d, function_bar_name));
   EXPECT(!class_d_bar.IsNull());
 
   CHA cha(thread);
diff --git a/runtime/vm/compiler/compiler_sources.gni b/runtime/vm/compiler/compiler_sources.gni
index 0efb336..dd1d2fa 100644
--- a/runtime/vm/compiler/compiler_sources.gni
+++ b/runtime/vm/compiler/compiler_sources.gni
@@ -111,14 +111,6 @@
   "ffi/recognized_method.h",
   "frontend/base_flow_graph_builder.cc",
   "frontend/base_flow_graph_builder.h",
-  "frontend/bytecode_fingerprints.cc",
-  "frontend/bytecode_fingerprints.h",
-  "frontend/bytecode_flow_graph_builder.cc",
-  "frontend/bytecode_flow_graph_builder.h",
-  "frontend/bytecode_reader.cc",
-  "frontend/bytecode_reader.h",
-  "frontend/bytecode_scope_builder.cc",
-  "frontend/bytecode_scope_builder.h",
   "frontend/constant_reader.cc",
   "frontend/constant_reader.h",
   "frontend/flow_graph_builder.cc",
@@ -210,7 +202,5 @@
   "assembler/disassembler.h",
   "assembler/disassembler_arm.cc",
   "assembler/disassembler_arm64.cc",
-  "assembler/disassembler_kbc.cc",
-  "assembler/disassembler_kbc.h",
   "assembler/disassembler_x86.cc",
 ]
diff --git a/runtime/vm/compiler/compiler_state.h b/runtime/vm/compiler/compiler_state.h
index c394822..913e36b 100644
--- a/runtime/vm/compiler/compiler_state.h
+++ b/runtime/vm/compiler/compiler_state.h
@@ -69,15 +69,6 @@
 
   // Create a dummy list of local variables representing a context object
   // with the given number of captured variables and given ID.
-  //
-  // Used during bytecode to IL translation because AllocateContext and
-  // CloneContext IL instructions need a list of local varaibles and bytecode
-  // does not record this information.
-  //
-  // TODO(vegorov): create context classes for distinct context IDs and
-  // populate them with slots without creating variables.
-  // Beware that context_id is satured at 8-bits, so multiple contexts may
-  // share id 255.
   const ZoneGrowableArray<const Slot*>& GetDummyContextSlots(
       intptr_t context_id,
       intptr_t num_context_slots);
@@ -85,16 +76,8 @@
   // Create a dummy LocalVariable that represents a captured local variable
   // at the given index in the context with given ID.
   //
-  // Used during bytecode to IL translation because StoreInstanceField and
-  // LoadField IL instructions need Slot, which can only be created from a
-  // LocalVariable.
-  //
   // This function returns the same variable when it is called with the
   // same index.
-  //
-  // TODO(vegorov): disambiguate slots for different context IDs.
-  // Beware that context_id is saturated at 8-bits, so multiple contexts may
-  // share id 255.
   LocalVariable* GetDummyCapturedVariable(intptr_t context_id, intptr_t index);
 
   bool is_aot() const { return is_aot_; }
@@ -115,8 +98,7 @@
   // Cache for Slot objects created during compilation (see slot.h).
   SlotCache* slot_cache_ = nullptr;
 
-  // Caches for dummy LocalVariables and context Slots created during bytecode
-  // to IL translation.
+  // Caches for dummy LocalVariables and context Slots.
   ZoneGrowableArray<ZoneGrowableArray<const Slot*>*>* dummy_slots_ = nullptr;
   ZoneGrowableArray<LocalVariable*>* dummy_captured_vars_ = nullptr;
 
diff --git a/runtime/vm/compiler/ffi/call.cc b/runtime/vm/compiler/ffi/call.cc
index 6bfba3c..39402f5 100644
--- a/runtime/vm/compiler/ffi/call.cc
+++ b/runtime/vm/compiler/ffi/call.cc
@@ -53,7 +53,7 @@
 
   Type& type = Type::Handle(zone);
   type ^= function.SignatureType(Nullability::kLegacy);
-  type ^= ClassFinalizer::FinalizeType(owner_class, type);
+  type ^= ClassFinalizer::FinalizeType(type);
   function.SetSignatureType(type);
   ASSERT(
       Type::Handle(function.SignatureType(Nullability::kLegacy)).IsFinalized());
diff --git a/runtime/vm/compiler/ffi/frame_rebase.h b/runtime/vm/compiler/ffi/frame_rebase.h
index ba58a5c..618d33f 100644
--- a/runtime/vm/compiler/ffi/frame_rebase.h
+++ b/runtime/vm/compiler/ffi/frame_rebase.h
@@ -31,24 +31,24 @@
 // This class can be used to rebase both Locations and NativeLocations.
 class FrameRebase : public ValueObject {
  public:
-  FrameRebase(const Register old_base,
+  FrameRebase(Zone* zone,
+              const Register old_base,
               const Register new_base,
-              intptr_t stack_delta_in_bytes,
-              Zone* zone)
-      : old_base_(old_base),
+              intptr_t stack_delta_in_bytes)
+      : zone_(zone),
+        old_base_(old_base),
         new_base_(new_base),
-        stack_delta_in_bytes_(stack_delta_in_bytes),
-        zone_(zone) {}
+        stack_delta_in_bytes_(stack_delta_in_bytes) {}
 
   const NativeLocation& Rebase(const NativeLocation& loc) const;
 
   Location Rebase(const Location loc) const;
 
  private:
+  Zone* zone_;
   const Register old_base_;
   const Register new_base_;
   const intptr_t stack_delta_in_bytes_;
-  Zone* zone_;
 };
 
 }  // namespace ffi
diff --git a/runtime/vm/compiler/ffi/marshaller.cc b/runtime/vm/compiler/ffi/marshaller.cc
index 09dd56d..c095e9e 100644
--- a/runtime/vm/compiler/ffi/marshaller.cc
+++ b/runtime/vm/compiler/ffi/marshaller.cc
@@ -78,8 +78,8 @@
 class CallbackArgumentTranslator : public ValueObject {
  public:
   static NativeLocations& TranslateArgumentLocations(
-      const NativeLocations& arg_locs,
-      Zone* zone) {
+      Zone* zone,
+      const NativeLocations& arg_locs) {
     auto& pushed_locs = *(new NativeLocations(arg_locs.length()));
 
     CallbackArgumentTranslator translator;
@@ -122,10 +122,10 @@
         stack_delta += StubCodeCompiler::kNativeCallbackTrampolineStackDelta;
       }
       FrameRebase rebase(
+          zone,
           /*old_base=*/SPREG, /*new_base=*/SPREG,
           /*stack_delta=*/(argument_slots_required_ + stack_delta) *
-              compiler::target::kWordSize,
-          zone);
+              compiler::target::kWordSize);
       return rebase.Rebase(arg);
     }
 
@@ -153,8 +153,8 @@
                                        const Function& dart_signature)
     : BaseMarshaller(zone, dart_signature),
       callback_locs_(
-          CallbackArgumentTranslator::TranslateArgumentLocations(arg_locs_,
-                                                                 zone_)) {}
+          CallbackArgumentTranslator::TranslateArgumentLocations(zone_,
+                                                                 arg_locs_)) {}
 
 }  // namespace ffi
 
diff --git a/runtime/vm/compiler/ffi/native_calling_convention.cc b/runtime/vm/compiler/ffi/native_calling_convention.cc
index 47f6adc..84081aa 100644
--- a/runtime/vm/compiler/ffi/native_calling_convention.cc
+++ b/runtime/vm/compiler/ffi/native_calling_convention.cc
@@ -31,14 +31,14 @@
 }
 
 // In Soft FP, floats are treated as 4 byte ints, and doubles as 8 byte ints.
-static const NativeType& ConvertIfSoftFp(const NativeType& rep, Zone* zone) {
+static const NativeType& ConvertIfSoftFp(Zone* zone, const NativeType& rep) {
   if (SoftFpAbi() && rep.IsFloat()) {
     ASSERT(rep.IsFloat());
     if (rep.SizeInBytes() == 4) {
-      return *new (zone) NativeFundamentalType(kInt32);
+      return *new (zone) NativePrimitiveType(kInt32);
     }
     if (rep.SizeInBytes() == 8) {
-      return *new (zone) NativeFundamentalType(kInt64);
+      return *new (zone) NativePrimitiveType(kInt64);
     }
   }
   return rep;
@@ -46,25 +46,25 @@
 
 // Representations of the arguments to a C signature function.
 static ZoneGrowableArray<const NativeType*>& ArgumentRepresentations(
-    const Function& signature,
-    Zone* zone) {
+    Zone* zone,
+    const Function& signature) {
   const intptr_t num_arguments =
       signature.num_fixed_parameters() - kNativeParamsStartAt;
   auto& result = *new ZoneGrowableArray<const NativeType*>(zone, num_arguments);
   for (intptr_t i = 0; i < num_arguments; i++) {
     AbstractType& arg_type = AbstractType::Handle(
         zone, signature.ParameterTypeAt(i + kNativeParamsStartAt));
-    const auto& rep = NativeType::FromAbstractType(arg_type, zone);
+    const auto& rep = NativeType::FromAbstractType(zone, arg_type);
     result.Add(&rep);
   }
   return result;
 }
 
 // Representation of the result of a C signature function.
-static NativeType& ResultRepresentation(const Function& signature, Zone* zone) {
+static NativeType& ResultRepresentation(Zone* zone, const Function& signature) {
   AbstractType& result_type =
       AbstractType::Handle(zone, signature.result_type());
-  return NativeType::FromAbstractType(result_type, zone);
+  return NativeType::FromAbstractType(zone, result_type);
 }
 
 // Represents the state of a stack frame going into a call, between allocations
@@ -74,7 +74,7 @@
   explicit ArgumentAllocator(Zone* zone) : zone_(zone) {}
 
   const NativeLocation& AllocateArgument(const NativeType& payload_type) {
-    const auto& payload_type_converted = ConvertIfSoftFp(payload_type, zone_);
+    const auto& payload_type_converted = ConvertIfSoftFp(zone_, payload_type);
     if (payload_type_converted.IsFloat()) {
       const auto kind = FpuRegKind(payload_type);
       const intptr_t reg_index = FirstFreeFpuRegisterIndex(kind);
@@ -224,8 +224,8 @@
 
 // Location for the arguments of a C signature function.
 static NativeLocations& ArgumentLocations(
-    const ZoneGrowableArray<const NativeType*>& arg_reps,
-    Zone* zone) {
+    Zone* zone,
+    const ZoneGrowableArray<const NativeType*>& arg_reps) {
   intptr_t num_arguments = arg_reps.length();
   auto& result = *new NativeLocations(zone, num_arguments);
 
@@ -239,9 +239,9 @@
 }
 
 // Location for the result of a C signature function.
-static NativeLocation& ResultLocation(const NativeType& payload_type,
-                                      Zone* zone) {
-  const auto& payload_type_converted = ConvertIfSoftFp(payload_type, zone);
+static NativeLocation& ResultLocation(Zone* zone,
+                                      const NativeType& payload_type) {
+  const auto& payload_type_converted = ConvertIfSoftFp(zone, payload_type);
   const auto& container_type =
       CallingConventions::kReturnRegisterExtension == kExtendedTo4
           ? payload_type_converted.WidenTo4Bytes(zone)
@@ -267,10 +267,11 @@
                                                  const Function& c_signature)
     : zone_(ASSERT_NOTNULL(zone)),
       c_signature_(c_signature),
-      arg_locs_(ArgumentLocations(ArgumentRepresentations(c_signature_, zone_),
-                                  zone_)),
+      arg_locs_(
+          ArgumentLocations(zone_,
+                            ArgumentRepresentations(zone_, c_signature_))),
       result_loc_(
-          ResultLocation(ResultRepresentation(c_signature_, zone_), zone_)) {}
+          ResultLocation(zone_, ResultRepresentation(zone_, c_signature_))) {}
 
 intptr_t NativeCallingConvention::num_args() const {
   ASSERT(c_signature_.NumOptionalParameters() == 0);
diff --git a/runtime/vm/compiler/ffi/native_location.cc b/runtime/vm/compiler/ffi/native_location.cc
index bbc762e..f954e9f 100644
--- a/runtime/vm/compiler/ffi/native_location.cc
+++ b/runtime/vm/compiler/ffi/native_location.cc
@@ -29,14 +29,14 @@
   return false;
 }
 
-NativeLocation& NativeLocation::FromLocation(Location loc,
-                                             Representation rep,
-                                             Zone* zone) {
+NativeLocation& NativeLocation::FromLocation(Zone* zone,
+                                             Location loc,
+                                             Representation rep) {
   // TODO(36730): We could possibly consume a pair location as struct.
   ASSERT(LocationCanBeExpressed(loc, rep));
 
   const NativeType& native_rep =
-      NativeType::FromUnboxedRepresentation(rep, zone);
+      NativeType::FromUnboxedRepresentation(zone, rep);
 
   switch (loc.kind()) {
     case Location::Kind::kRegister:
@@ -61,18 +61,18 @@
 }
 
 // TODO(36730): Remove when being able to consume as struct.
-NativeLocation& NativeLocation::FromPairLocation(Location pair_loc,
+NativeLocation& NativeLocation::FromPairLocation(Zone* zone,
+                                                 Location pair_loc,
                                                  Representation pair_rep,
-                                                 intptr_t index,
-                                                 Zone* zone) {
+                                                 intptr_t index) {
   ASSERT(pair_loc.IsPairLocation());
   ASSERT(index == 0 || index == 1);
   const Representation rep =
-      NativeType::FromUnboxedRepresentation(pair_rep, zone)
-          .Split(index, zone)
+      NativeType::FromUnboxedRepresentation(zone, pair_rep)
+          .Split(zone, index)
           .AsRepresentation();
   const Location loc = pair_loc.AsPairLocation()->At(index);
-  return FromLocation(loc, rep, zone);
+  return FromLocation(zone, loc, rep);
 }
 
 const NativeRegistersLocation& NativeLocation::AsRegisters() const {
@@ -117,36 +117,36 @@
     }
   } else {
     ASSERT(payload_type().IsFloat());
-    if (payload_type().AsFundamental().representation() == kFloat) {
+    if (payload_type().AsPrimitive().representation() == kFloat) {
       return Location::StackSlot(offset_in_words(), base_register_);
     } else {
-      ASSERT(payload_type().AsFundamental().representation() == kDouble);
+      ASSERT(payload_type().AsPrimitive().representation() == kDouble);
       return Location::DoubleStackSlot(offset_in_words(), base_register_);
     }
   }
   UNREACHABLE();
 }
-NativeRegistersLocation& NativeRegistersLocation::Split(intptr_t index,
-                                                        Zone* zone) const {
+NativeRegistersLocation& NativeRegistersLocation::Split(Zone* zone,
+                                                        intptr_t index) const {
   ASSERT(num_regs() == 2);
   return *new (zone) NativeRegistersLocation(
-      payload_type().Split(index, zone), container_type().Split(index, zone),
+      payload_type().Split(zone, index), container_type().Split(zone, index),
       reg_at(index));
 }
 
-NativeStackLocation& NativeStackLocation::Split(intptr_t index,
-                                                Zone* zone) const {
+NativeStackLocation& NativeStackLocation::Split(Zone* zone,
+                                                intptr_t index) const {
   ASSERT(index == 0 || index == 1);
   const intptr_t size = payload_type().SizeInBytes();
 
   return *new (zone) NativeStackLocation(
-      payload_type().Split(index, zone), container_type().Split(index, zone),
+      payload_type().Split(zone, index), container_type().Split(zone, index),
       base_register_, offset_in_bytes_ + size / 2 * index);
 }
 
 NativeLocation& NativeLocation::WidenTo4Bytes(Zone* zone) const {
-  return WithOtherNativeType(payload_type().WidenTo4Bytes(zone),
-                             container_type().WidenTo4Bytes(zone), zone);
+  return WithOtherNativeType(zone, payload_type().WidenTo4Bytes(zone),
+                             container_type().WidenTo4Bytes(zone));
 }
 
 #if defined(TARGET_ARCH_ARM)
diff --git a/runtime/vm/compiler/ffi/native_location.h b/runtime/vm/compiler/ffi/native_location.h
index fefee76..78caa24 100644
--- a/runtime/vm/compiler/ffi/native_location.h
+++ b/runtime/vm/compiler/ffi/native_location.h
@@ -54,13 +54,13 @@
 class NativeLocation : public ZoneAllocated {
  public:
   static bool LocationCanBeExpressed(Location loc, Representation rep);
-  static NativeLocation& FromLocation(Location loc,
-                                      Representation rep,
-                                      Zone* zone);
-  static NativeLocation& FromPairLocation(Location loc,
+  static NativeLocation& FromLocation(Zone* zone,
+                                      Location loc,
+                                      Representation rep);
+  static NativeLocation& FromPairLocation(Zone* zone,
+                                          Location loc,
                                           Representation rep,
-                                          intptr_t index,
-                                          Zone* zone);
+                                          intptr_t index);
 
   // The type of the data at this location.
   const NativeType& payload_type() const { return payload_type_; }
@@ -74,9 +74,9 @@
   const NativeType& container_type() const { return container_type_; }
 
   virtual NativeLocation& WithOtherNativeType(
+      Zone* zone,
       const NativeType& new_payload_type,
-      const NativeType& new_container_type,
-      Zone* zone) const = 0;
+      const NativeType& new_container_type) const = 0;
 
 #if defined(TARGET_ARCH_ARM)
   const NativeLocation& WidenToQFpuRegister(Zone* zone) const;
@@ -101,7 +101,7 @@
   const NativeFpuRegistersLocation& AsFpuRegisters() const;
   const NativeStackLocation& AsStack() const;
 
-  virtual NativeLocation& Split(intptr_t index, Zone* zone) const {
+  virtual NativeLocation& Split(Zone* zone, intptr_t index) const {
     ASSERT(index == 0 || index == 1);
     UNREACHABLE();
   }
@@ -152,9 +152,9 @@
   virtual ~NativeRegistersLocation() {}
 
   virtual NativeRegistersLocation& WithOtherNativeType(
+      Zone* zone,
       const NativeType& new_payload_type,
-      const NativeType& new_container_type,
-      Zone* zone) const {
+      const NativeType& new_container_type) const {
     return *new (zone)
         NativeRegistersLocation(new_payload_type, new_container_type, regs_);
   }
@@ -167,7 +167,7 @@
   intptr_t num_regs() const { return regs_->length(); }
   Register reg_at(intptr_t index) const { return regs_->At(index); }
 
-  virtual NativeRegistersLocation& Split(intptr_t index, Zone* zone) const;
+  virtual NativeRegistersLocation& Split(Zone* zone, intptr_t index) const;
 
   virtual void PrintTo(BaseTextBuffer* f) const;
 
@@ -220,9 +220,9 @@
   virtual ~NativeFpuRegistersLocation() {}
 
   virtual NativeFpuRegistersLocation& WithOtherNativeType(
+      Zone* zone,
       const NativeType& new_payload_type,
-      const NativeType& new_container_type,
-      Zone* zone) const {
+      const NativeType& new_container_type) const {
     return *new (zone) NativeFpuRegistersLocation(
         new_payload_type, new_container_type, fpu_reg_kind_, fpu_reg_);
   }
@@ -276,9 +276,9 @@
   virtual ~NativeStackLocation() {}
 
   virtual NativeStackLocation& WithOtherNativeType(
+      Zone* zone,
       const NativeType& new_payload_type,
-      const NativeType& new_container_type,
-      Zone* zone) const {
+      const NativeType& new_container_type) const {
     return *new (zone) NativeStackLocation(new_payload_type, new_container_type,
                                            base_register_, offset_in_bytes_);
   }
@@ -301,7 +301,7 @@
     return Location::DoubleStackSlot(offset_in_words(), base_register_);
   }
 
-  virtual NativeStackLocation& Split(intptr_t index, Zone* zone) const;
+  virtual NativeStackLocation& Split(Zone* zone, intptr_t index) const;
 
   virtual void PrintTo(BaseTextBuffer* f) const;
 
diff --git a/runtime/vm/compiler/ffi/native_type.cc b/runtime/vm/compiler/ffi/native_type.cc
index e4daa47..5bb9f4c 100644
--- a/runtime/vm/compiler/ffi/native_type.cc
+++ b/runtime/vm/compiler/ffi/native_type.cc
@@ -19,12 +19,12 @@
 
 namespace ffi {
 
-const NativeFundamentalType& NativeType::AsFundamental() const {
-  ASSERT(IsFundamental());
-  return static_cast<const NativeFundamentalType&>(*this);
+const NativePrimitiveType& NativeType::AsPrimitive() const {
+  ASSERT(IsPrimitive());
+  return static_cast<const NativePrimitiveType&>(*this);
 }
 
-bool NativeFundamentalType::IsInt() const {
+bool NativePrimitiveType::IsInt() const {
   switch (representation_) {
     case kInt8:
     case kUint8:
@@ -40,16 +40,16 @@
   }
 }
 
-bool NativeFundamentalType::IsFloat() const {
+bool NativePrimitiveType::IsFloat() const {
   return representation_ == kFloat || representation_ == kDouble ||
          representation_ == kHalfDouble;
 }
 
-bool NativeFundamentalType::IsVoid() const {
+bool NativePrimitiveType::IsVoid() const {
   return representation_ == kVoid;
 }
 
-bool NativeFundamentalType::IsSigned() const {
+bool NativePrimitiveType::IsSigned() const {
   ASSERT(IsInt() || IsFloat());
   switch (representation_) {
     case kInt8:
@@ -84,11 +84,11 @@
     0,  // kVoid,
 };
 
-intptr_t NativeFundamentalType::SizeInBytes() const {
+intptr_t NativePrimitiveType::SizeInBytes() const {
   return fundamental_size_in_bytes[representation_];
 }
 
-intptr_t NativeFundamentalType::AlignmentInBytesStack() const {
+intptr_t NativePrimitiveType::AlignmentInBytesStack() const {
   switch (CallingConventions::kArgumentStackAlignment) {
     case kAlignedToWordSize:
       // The default is to align stack arguments to word size.
@@ -108,7 +108,7 @@
   }
 }
 
-intptr_t NativeFundamentalType::AlignmentInBytesField() const {
+intptr_t NativePrimitiveType::AlignmentInBytesField() const {
   switch (CallingConventions::kFieldAlignment) {
     case kAlignedToValueSize:
       // The default is to align fields to their own size.
@@ -127,7 +127,7 @@
 }
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
-bool NativeFundamentalType::IsExpressibleAsRepresentation() const {
+bool NativePrimitiveType::IsExpressibleAsRepresentation() const {
   switch (representation_) {
     case kInt8:
     case kUint8:
@@ -149,7 +149,7 @@
   }
 }
 
-Representation NativeFundamentalType::AsRepresentation() const {
+Representation NativePrimitiveType::AsRepresentation() const {
   ASSERT(IsExpressibleAsRepresentation());
   switch (representation_) {
     case kInt32:
@@ -171,14 +171,14 @@
 }
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
 
-bool NativeFundamentalType::Equals(const NativeType& other) const {
-  if (!other.IsFundamental()) {
+bool NativePrimitiveType::Equals(const NativeType& other) const {
+  if (!other.IsPrimitive()) {
     return false;
   }
-  return other.AsFundamental().representation_ == representation_;
+  return other.AsPrimitive().representation_ == representation_;
 }
 
-static FundamentalType split_fundamental(FundamentalType in) {
+static PrimitiveType split_fundamental(PrimitiveType in) {
   switch (in) {
     case kInt16:
       return kInt8;
@@ -199,14 +199,14 @@
   }
 }
 
-NativeFundamentalType& NativeFundamentalType::Split(intptr_t index,
-                                                    Zone* zone) const {
+NativePrimitiveType& NativePrimitiveType::Split(Zone* zone,
+                                                intptr_t index) const {
   ASSERT(index == 0 || index == 1);
   auto new_rep = split_fundamental(representation());
-  return *new (zone) NativeFundamentalType(new_rep);
+  return *new (zone) NativePrimitiveType(new_rep);
 }
 
-static FundamentalType TypeRepresentation(classid_t class_id) {
+static PrimitiveType TypeRepresentation(classid_t class_id) {
   switch (class_id) {
     case kFfiInt8Cid:
       return kInt8;
@@ -242,19 +242,19 @@
   }
 }
 
-NativeType& NativeType::FromTypedDataClassId(classid_t class_id, Zone* zone) {
+NativeType& NativeType::FromTypedDataClassId(Zone* zone, classid_t class_id) {
   // TODO(36730): Support composites.
   const auto fundamental_rep = TypeRepresentation(class_id);
-  return *new (zone) NativeFundamentalType(fundamental_rep);
+  return *new (zone) NativePrimitiveType(fundamental_rep);
 }
 
-NativeType& NativeType::FromAbstractType(const AbstractType& type, Zone* zone) {
+NativeType& NativeType::FromAbstractType(Zone* zone, const AbstractType& type) {
   // TODO(36730): Support composites.
-  return NativeType::FromTypedDataClassId(type.type_class_id(), zone);
+  return NativeType::FromTypedDataClassId(zone, type.type_class_id());
 }
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
-static FundamentalType fundamental_rep(Representation rep) {
+static PrimitiveType fundamental_rep(Representation rep) {
   switch (rep) {
     case kUnboxedDouble:
       return kDouble;
@@ -272,9 +272,9 @@
   UNREACHABLE();
 }
 
-NativeFundamentalType& NativeType::FromUnboxedRepresentation(Representation rep,
-                                                             Zone* zone) {
-  return *new (zone) NativeFundamentalType(fundamental_rep(rep));
+NativePrimitiveType& NativeType::FromUnboxedRepresentation(Zone* zone,
+                                                           Representation rep) {
+  return *new (zone) NativePrimitiveType(fundamental_rep(rep));
 }
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
 
@@ -285,7 +285,7 @@
   return Thread::Current()->zone()->MakeCopyOfString(buffer);
 }
 
-static const char* FundamentalTypeToCString(FundamentalType rep) {
+static const char* PrimitiveTypeToCString(PrimitiveType rep) {
   switch (rep) {
     case kInt8:
       return "int8";
@@ -320,16 +320,16 @@
   f->AddString("I");
 }
 
-void NativeFundamentalType::PrintTo(BaseTextBuffer* f) const {
-  f->Printf("%s", FundamentalTypeToCString(representation_));
+void NativePrimitiveType::PrintTo(BaseTextBuffer* f) const {
+  f->Printf("%s", PrimitiveTypeToCString(representation_));
 }
 
 const NativeType& NativeType::WidenTo4Bytes(Zone* zone) const {
   if (IsInt() && SizeInBytes() <= 2) {
     if (IsSigned()) {
-      return *new (zone) NativeFundamentalType(kInt32);
+      return *new (zone) NativePrimitiveType(kInt32);
     } else {
-      return *new (zone) NativeFundamentalType(kUint32);
+      return *new (zone) NativePrimitiveType(kUint32);
     }
   }
   return *this;
diff --git a/runtime/vm/compiler/ffi/native_type.h b/runtime/vm/compiler/ffi/native_type.h
index b0dc39b..66d5f31 100644
--- a/runtime/vm/compiler/ffi/native_type.h
+++ b/runtime/vm/compiler/ffi/native_type.h
@@ -23,7 +23,7 @@
 
 namespace ffi {
 
-class NativeFundamentalType;
+class NativePrimitiveType;
 
 // NativeTypes are the types used in calling convention specifications:
 // integers, floats, and composites.
@@ -38,29 +38,29 @@
 //
 // Instead, NativeTypes support representations not supported in Dart's unboxed
 // Representations, such as:
-// * Fundamental types (https://en.cppreference.com/w/cpp/language/types):
+// * Primitive types:
 //   * int8_t
 //   * int16_t
 //   * uint8_t
 //   * uint16t
 //   * void
-// * Compound types (https://en.cppreference.com/w/cpp/language/type):
+// * Compound types:
 //   * Struct
 //   * Union
 //
 // TODO(36730): Add composites.
 class NativeType : public ZoneAllocated {
  public:
-  static NativeType& FromAbstractType(const AbstractType& type, Zone* zone);
-  static NativeType& FromTypedDataClassId(classid_t class_id, Zone* zone);
+  static NativeType& FromAbstractType(Zone* zone, const AbstractType& type);
+  static NativeType& FromTypedDataClassId(Zone* zone, classid_t class_id);
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
-  static NativeFundamentalType& FromUnboxedRepresentation(Representation rep,
-                                                          Zone* zone);
+  static NativePrimitiveType& FromUnboxedRepresentation(Zone* zone,
+                                                        Representation rep);
 #endif
 
-  virtual bool IsFundamental() const { return false; }
-  const NativeFundamentalType& AsFundamental() const;
+  virtual bool IsPrimitive() const { return false; }
+  const NativePrimitiveType& AsPrimitive() const;
 
   virtual bool IsInt() const { return false; }
   virtual bool IsFloat() const { return false; }
@@ -96,7 +96,7 @@
   virtual bool Equals(const NativeType& other) const { UNREACHABLE(); }
 
   // Split representation in two.
-  virtual NativeType& Split(intptr_t index, Zone* zone) const { UNREACHABLE(); }
+  virtual NativeType& Split(Zone* zone, intptr_t index) const { UNREACHABLE(); }
 
   // If this is a 8 or 16 bit int, returns a 32 bit container.
   // Otherwise, return original representation.
@@ -111,7 +111,7 @@
   NativeType() {}
 };
 
-enum FundamentalType {
+enum PrimitiveType {
   kInt8,
   kUint8,
   kInt16,
@@ -127,13 +127,19 @@
   // TODO(37470): Add packed data structures.
 };
 
-class NativeFundamentalType : public NativeType {
+// Represents a primitive native type.
+//
+// These are called object types in the C standard (ISO/IEC 9899:2011) and
+// fundamental types in C++ (https://en.cppreference.com/w/cpp/language/types)
+// but more commonly these are called primitive types
+// (https://en.wikipedia.org/wiki/Primitive_data_type).
+class NativePrimitiveType : public NativeType {
  public:
-  explicit NativeFundamentalType(FundamentalType rep) : representation_(rep) {}
+  explicit NativePrimitiveType(PrimitiveType rep) : representation_(rep) {}
 
-  FundamentalType representation() const { return representation_; }
+  PrimitiveType representation() const { return representation_; }
 
-  virtual bool IsFundamental() const { return true; }
+  virtual bool IsPrimitive() const { return true; }
 
   virtual bool IsInt() const;
   virtual bool IsFloat() const;
@@ -151,14 +157,14 @@
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
 
   virtual bool Equals(const NativeType& other) const;
-  virtual NativeFundamentalType& Split(intptr_t part, Zone* zone) const;
+  virtual NativePrimitiveType& Split(Zone* zone, intptr_t part) const;
 
   virtual void PrintTo(BaseTextBuffer* f) const;
 
-  virtual ~NativeFundamentalType() {}
+  virtual ~NativePrimitiveType() {}
 
  private:
-  const FundamentalType representation_;
+  const PrimitiveType representation_;
 };
 
 }  // namespace ffi
diff --git a/runtime/vm/compiler/frontend/base_flow_graph_builder.cc b/runtime/vm/compiler/frontend/base_flow_graph_builder.cc
index 7bb9096..06d5d73 100644
--- a/runtime/vm/compiler/frontend/base_flow_graph_builder.cc
+++ b/runtime/vm/compiler/frontend/base_flow_graph_builder.cc
@@ -11,6 +11,7 @@
 #include "vm/compiler/runtime_api.h"
 #include "vm/growable_array.h"
 #include "vm/object_store.h"
+#include "vm/resolver.h"
 
 namespace dart {
 namespace kernel {
@@ -366,27 +367,18 @@
   }
 }
 
-Fragment BaseFlowGraphBuilder::LoadIndexed(intptr_t index_scale) {
+Fragment BaseFlowGraphBuilder::LoadIndexed(classid_t class_id,
+                                           intptr_t index_scale,
+                                           bool index_unboxed) {
   Value* index = Pop();
+  // A C pointer if index_unboxed, otherwise a boxed Dart value.
   Value* array = Pop();
+
+  // We use C behavior when dereferencing pointers, so we use aligned access in
+  // all cases.
   LoadIndexedInstr* instr = new (Z) LoadIndexedInstr(
-      array, index, /*index_unboxed=*/false, index_scale, kArrayCid,
-      kAlignedAccess, DeoptId::kNone, TokenPosition::kNoSource);
-  Push(instr);
-  return Fragment(instr);
-}
-
-Fragment BaseFlowGraphBuilder::LoadIndexedTypedData(classid_t class_id,
-                                                    intptr_t index_scale,
-                                                    bool index_unboxed) {
-  // We use C behavior when dereferencing pointers, we assume alignment.
-  const AlignmentType alignment = kAlignedAccess;
-
-  Value* index = Pop();
-  Value* c_pointer = Pop();
-  LoadIndexedInstr* instr = new (Z)
-      LoadIndexedInstr(c_pointer, index, index_unboxed, index_scale, class_id,
-                       alignment, DeoptId::kNone, TokenPosition::kNoSource);
+      array, index, index_unboxed, index_scale, class_id, kAlignedAccess,
+      DeoptId::kNone, TokenPosition::kNoSource);
   Push(instr);
   return Fragment(instr);
 }
@@ -966,6 +958,19 @@
   return instructions;
 }
 
+Fragment BaseFlowGraphBuilder::InstantiateDynamicTypeArguments() {
+  Value* type_arguments = Pop();
+  Value* function_type_args = Pop();
+  Value* instantiator_type_args = Pop();
+  const Function& function = Object::null_function();
+  const Class& instantiator_class = Class::ZoneHandle(Z);
+  InstantiateTypeArgumentsInstr* instr = new (Z) InstantiateTypeArgumentsInstr(
+      TokenPosition::kNoSource, instantiator_type_args, function_type_args,
+      type_arguments, instantiator_class, function, GetNextDeoptId());
+  Push(instr);
+  return Fragment(instr);
+}
+
 Fragment BaseFlowGraphBuilder::LoadClassId() {
   LoadClassIdInstr* load = new (Z) LoadClassIdInstr(Pop());
   Push(load);
@@ -1108,7 +1113,7 @@
     const auto& func_name = String::Handle(Z, parent.name());
     const auto& owner = Class::Handle(Z, parent.Owner());
     if (owner.EnsureIsFinalized(thread_) == Error::null()) {
-      function = owner.LookupFunction(func_name);
+      function = Resolver::ResolveFunction(Z, owner, func_name);
     }
   }
 
diff --git a/runtime/vm/compiler/frontend/base_flow_graph_builder.h b/runtime/vm/compiler/frontend/base_flow_graph_builder.h
index 4753533..790ac1a 100644
--- a/runtime/vm/compiler/frontend/base_flow_graph_builder.h
+++ b/runtime/vm/compiler/frontend/base_flow_graph_builder.h
@@ -164,11 +164,10 @@
   Fragment LoadField(const Field& field, bool calls_initializer);
   Fragment LoadNativeField(const Slot& native_field,
                            bool calls_initializer = false);
-  Fragment LoadIndexed(intptr_t index_scale);
-  // Takes a [class_id] valid for StoreIndexed.
-  Fragment LoadIndexedTypedData(classid_t class_id,
-                                intptr_t index_scale,
-                                bool index_unboxed);
+  // Pass true for index_unboxed if indexing into external typed data.
+  Fragment LoadIndexed(classid_t class_id,
+                       intptr_t index_scale = compiler::target::kWordSize,
+                       bool index_unboxed = false);
 
   Fragment LoadUntagged(intptr_t offset);
   Fragment StoreUntagged(intptr_t offset);
@@ -339,6 +338,7 @@
   Fragment AllocateTypedData(TokenPosition position, classid_t class_id);
   Fragment InstantiateType(const AbstractType& type);
   Fragment InstantiateTypeArguments(const TypeArguments& type_arguments);
+  Fragment InstantiateDynamicTypeArguments();
   Fragment LoadClassId();
 
   // Returns true if we are building a graph for inlining of a call site that
@@ -465,7 +465,6 @@
   const Array& saved_args_desc_array_;
 
   friend class StreamingFlowGraphBuilder;
-  friend class BytecodeFlowGraphBuilder;
 
  private:
   DISALLOW_COPY_AND_ASSIGN(BaseFlowGraphBuilder);
diff --git a/runtime/vm/compiler/frontend/bytecode_fingerprints.cc b/runtime/vm/compiler/frontend/bytecode_fingerprints.cc
deleted file mode 100644
index 78d621e..0000000
--- a/runtime/vm/compiler/frontend/bytecode_fingerprints.cc
+++ /dev/null
@@ -1,207 +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.
-
-#include "vm/compiler/frontend/bytecode_fingerprints.h"
-
-#include "vm/compiler/frontend/bytecode_reader.h"
-#include "vm/constants_kbc.h"
-#include "vm/hash.h"
-
-namespace dart {
-namespace kernel {
-
-static uint32_t CombineObject(uint32_t hash, const Object& obj) {
-  if (obj.IsAbstractType()) {
-    return CombineHashes(hash, AbstractType::Cast(obj).Hash());
-  } else if (obj.IsClass()) {
-    return CombineHashes(hash, Class::Cast(obj).id());
-  } else if (obj.IsFunction()) {
-    return CombineHashes(
-        hash, AbstractType::Handle(Function::Cast(obj).result_type()).Hash());
-  } else if (obj.IsField()) {
-    return CombineHashes(hash,
-                         AbstractType::Handle(Field::Cast(obj).type()).Hash());
-  } else {
-    return CombineHashes(hash, static_cast<uint32_t>(obj.GetClassId()));
-  }
-}
-
-typedef uint32_t (*Fp)(uint32_t fp,
-                       const KBCInstr* instr,
-                       const ObjectPool& pool,
-                       int32_t value);
-
-static uint32_t Fp___(uint32_t fp,
-                      const KBCInstr* instr,
-                      const ObjectPool& pool,
-                      int32_t value) {
-  return fp;
-}
-
-static uint32_t Fptgt(uint32_t fp,
-                      const KBCInstr* instr,
-                      const ObjectPool& pool,
-                      int32_t value) {
-  return CombineHashes(fp, value);
-}
-
-static uint32_t Fplit(uint32_t fp,
-                      const KBCInstr* instr,
-                      const ObjectPool& pool,
-                      int32_t value) {
-  return CombineObject(fp, Object::Handle(pool.ObjectAt(value)));
-}
-
-static uint32_t Fpreg(uint32_t fp,
-                      const KBCInstr* instr,
-                      const ObjectPool& pool,
-                      int32_t value) {
-  return CombineHashes(fp, value);
-}
-
-static uint32_t Fpxeg(uint32_t fp,
-                      const KBCInstr* instr,
-                      const ObjectPool& pool,
-                      int32_t value) {
-  return CombineHashes(fp, value);
-}
-
-static uint32_t Fpnum(uint32_t fp,
-                      const KBCInstr* instr,
-                      const ObjectPool& pool,
-                      int32_t value) {
-  return CombineHashes(fp, value);
-}
-
-static uint32_t Fingerprint0(uint32_t fp,
-                             const KBCInstr* instr,
-                             const ObjectPool& pool,
-                             Fp op1,
-                             Fp op2,
-                             Fp op3) {
-  return fp;
-}
-
-static uint32_t FingerprintA(uint32_t fp,
-                             const KBCInstr* instr,
-                             const ObjectPool& pool,
-                             Fp op1,
-                             Fp op2,
-                             Fp op3) {
-  fp = op1(fp, instr, pool, KernelBytecode::DecodeA(instr));
-  return fp;
-}
-
-static uint32_t FingerprintD(uint32_t fp,
-                             const KBCInstr* instr,
-                             const ObjectPool& pool,
-                             Fp op1,
-                             Fp op2,
-                             Fp op3) {
-  fp = op1(fp, instr, pool, KernelBytecode::DecodeD(instr));
-  return fp;
-}
-
-static uint32_t FingerprintX(uint32_t fp,
-                             const KBCInstr* instr,
-                             const ObjectPool& pool,
-                             Fp op1,
-                             Fp op2,
-                             Fp op3) {
-  fp = op1(fp, instr, pool, KernelBytecode::DecodeX(instr));
-  return fp;
-}
-
-static uint32_t FingerprintT(uint32_t fp,
-                             const KBCInstr* instr,
-                             const ObjectPool& pool,
-                             Fp op1,
-                             Fp op2,
-                             Fp op3) {
-  fp = op1(fp, instr, pool, KernelBytecode::DecodeT(instr));
-  return fp;
-}
-
-static uint32_t FingerprintA_E(uint32_t fp,
-                               const KBCInstr* instr,
-                               const ObjectPool& pool,
-                               Fp op1,
-                               Fp op2,
-                               Fp op3) {
-  fp = op1(fp, instr, pool, KernelBytecode::DecodeA(instr));
-  fp = op2(fp, instr, pool, KernelBytecode::DecodeE(instr));
-  return fp;
-}
-
-static uint32_t FingerprintA_Y(uint32_t fp,
-                               const KBCInstr* instr,
-                               const ObjectPool& pool,
-                               Fp op1,
-                               Fp op2,
-                               Fp op3) {
-  fp = op1(fp, instr, pool, KernelBytecode::DecodeA(instr));
-  fp = op2(fp, instr, pool, KernelBytecode::DecodeY(instr));
-  return fp;
-}
-
-static uint32_t FingerprintD_F(uint32_t fp,
-                               const KBCInstr* instr,
-                               const ObjectPool& pool,
-                               Fp op1,
-                               Fp op2,
-                               Fp op3) {
-  fp = op1(fp, instr, pool, KernelBytecode::DecodeD(instr));
-  fp = op2(fp, instr, pool, KernelBytecode::DecodeF(instr));
-  return fp;
-}
-
-static uint32_t FingerprintA_B_C(uint32_t fp,
-                                 const KBCInstr* instr,
-                                 const ObjectPool& pool,
-                                 Fp op1,
-                                 Fp op2,
-                                 Fp op3) {
-  fp = op1(fp, instr, pool, KernelBytecode::DecodeA(instr));
-  fp = op2(fp, instr, pool, KernelBytecode::DecodeB(instr));
-  fp = op3(fp, instr, pool, KernelBytecode::DecodeC(instr));
-  return fp;
-}
-
-uint32_t BytecodeFingerprintHelper::CalculateFunctionFingerprint(
-    const Function& function) {
-  ASSERT(function.is_declared_in_bytecode());
-  const intptr_t kHashBits = 30;
-  uint32_t fp = 0;
-  fp = CombineHashes(fp, String::Handle(function.UserVisibleName()).Hash());
-  if (function.is_abstract()) {
-    return FinalizeHash(fp, kHashBits);
-  }
-  if (!function.HasBytecode()) {
-    kernel::BytecodeReader::ReadFunctionBytecode(Thread::Current(), function);
-  }
-  const Bytecode& code = Bytecode::Handle(function.bytecode());
-  const ObjectPool& pool = ObjectPool::Handle(code.object_pool());
-  const KBCInstr* const start =
-      reinterpret_cast<const KBCInstr*>(code.instructions());
-  for (const KBCInstr* instr = start; (instr - start) < code.Size();
-       instr = KernelBytecode::Next(instr)) {
-    const KernelBytecode::Opcode opcode = KernelBytecode::DecodeOpcode(instr);
-    fp = CombineHashes(fp, opcode);
-    switch (opcode) {
-#define FINGERPRINT_BYTECODE(name, encoding, kind, op1, op2, op3)              \
-  case KernelBytecode::k##name:                                                \
-    fp = Fingerprint##encoding(fp, instr, pool, Fp##op1, Fp##op2, Fp##op3);    \
-    break;
-      KERNEL_BYTECODES_LIST(FINGERPRINT_BYTECODE)
-#undef FINGERPRINT_BYTECODE
-      default:
-        UNREACHABLE();
-    }
-  }
-
-  return FinalizeHash(fp, kHashBits);
-}
-
-}  // namespace kernel
-}  // namespace dart
diff --git a/runtime/vm/compiler/frontend/bytecode_fingerprints.h b/runtime/vm/compiler/frontend/bytecode_fingerprints.h
deleted file mode 100644
index 78dbcff..0000000
--- a/runtime/vm/compiler/frontend/bytecode_fingerprints.h
+++ /dev/null
@@ -1,26 +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.
-
-#ifndef RUNTIME_VM_COMPILER_FRONTEND_BYTECODE_FINGERPRINTS_H_
-#define RUNTIME_VM_COMPILER_FRONTEND_BYTECODE_FINGERPRINTS_H_
-
-#if defined(DART_PRECOMPILED_RUNTIME)
-#error "AOT runtime should not use compiler sources (including header files)"
-#endif  // defined(DART_PRECOMPILED_RUNTIME)
-
-#include "platform/allocation.h"
-#include "vm/object.h"
-
-namespace dart {
-namespace kernel {
-
-class BytecodeFingerprintHelper : public AllStatic {
- public:
-  static uint32_t CalculateFunctionFingerprint(const Function& func);
-};
-
-}  // namespace kernel
-}  // namespace dart
-
-#endif  // RUNTIME_VM_COMPILER_FRONTEND_BYTECODE_FINGERPRINTS_H_
diff --git a/runtime/vm/compiler/frontend/bytecode_flow_graph_builder.cc b/runtime/vm/compiler/frontend/bytecode_flow_graph_builder.cc
deleted file mode 100644
index 1ce2b7a..0000000
--- a/runtime/vm/compiler/frontend/bytecode_flow_graph_builder.cc
+++ /dev/null
@@ -1,2375 +0,0 @@
-// Copyright (c) 2018, 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.
-
-#include "vm/compiler/frontend/bytecode_flow_graph_builder.h"
-
-#include "vm/compiler/backend/il_printer.h"
-#include "vm/compiler/ffi/callback.h"
-#include "vm/compiler/frontend/bytecode_reader.h"
-#include "vm/compiler/frontend/prologue_builder.h"
-#include "vm/compiler/jit/compiler.h"
-#include "vm/object_store.h"
-#include "vm/stack_frame.h"
-#include "vm/stack_frame_kbc.h"
-
-#define B (flow_graph_builder_)
-#define Z (zone_)
-
-namespace dart {
-
-DEFINE_FLAG(bool,
-            print_flow_graph_from_bytecode,
-            false,
-            "Print flow graph constructed from bytecode");
-
-namespace kernel {
-
-BytecodeFlowGraphBuilder::Operand BytecodeFlowGraphBuilder::DecodeOperandA() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  } else {
-    intptr_t value = KernelBytecode::DecodeA(bytecode_instr_);
-    return Operand(value);
-  }
-}
-
-BytecodeFlowGraphBuilder::Operand BytecodeFlowGraphBuilder::DecodeOperandB() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  } else {
-    intptr_t value = KernelBytecode::DecodeB(bytecode_instr_);
-    return Operand(value);
-  }
-}
-
-BytecodeFlowGraphBuilder::Operand BytecodeFlowGraphBuilder::DecodeOperandC() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  } else {
-    intptr_t value = KernelBytecode::DecodeC(bytecode_instr_);
-    return Operand(value);
-  }
-}
-
-BytecodeFlowGraphBuilder::Operand BytecodeFlowGraphBuilder::DecodeOperandD() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  } else {
-    intptr_t value = KernelBytecode::DecodeD(bytecode_instr_);
-    return Operand(value);
-  }
-}
-
-BytecodeFlowGraphBuilder::Operand BytecodeFlowGraphBuilder::DecodeOperandE() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  } else {
-    intptr_t value = KernelBytecode::DecodeE(bytecode_instr_);
-    return Operand(value);
-  }
-}
-
-BytecodeFlowGraphBuilder::Operand BytecodeFlowGraphBuilder::DecodeOperandF() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  } else {
-    intptr_t value = KernelBytecode::DecodeF(bytecode_instr_);
-    return Operand(value);
-  }
-}
-
-BytecodeFlowGraphBuilder::Operand BytecodeFlowGraphBuilder::DecodeOperandX() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  } else {
-    intptr_t value = KernelBytecode::DecodeX(bytecode_instr_);
-    return Operand(value);
-  }
-}
-
-BytecodeFlowGraphBuilder::Operand BytecodeFlowGraphBuilder::DecodeOperandY() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  } else {
-    intptr_t value = KernelBytecode::DecodeY(bytecode_instr_);
-    return Operand(value);
-  }
-}
-
-BytecodeFlowGraphBuilder::Operand BytecodeFlowGraphBuilder::DecodeOperandT() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  } else {
-    intptr_t value = KernelBytecode::DecodeT(bytecode_instr_);
-    return Operand(value);
-  }
-}
-
-BytecodeFlowGraphBuilder::Constant BytecodeFlowGraphBuilder::ConstantAt(
-    Operand entry_index,
-    intptr_t add_index) {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  } else {
-    const Object& value = Object::ZoneHandle(
-        Z, object_pool_.ObjectAt(entry_index.value() + add_index));
-    return Constant(Z, value);
-  }
-}
-
-void BytecodeFlowGraphBuilder::PushConstant(Constant constant) {
-  if (is_generating_interpreter()) {
-    B->Push(constant.definition());
-  } else {
-    code_ += B->Constant(constant.value());
-  }
-}
-
-BytecodeFlowGraphBuilder::Constant BytecodeFlowGraphBuilder::PopConstant() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  } else {
-    ASSERT(!IsStackEmpty());
-    const Object& value = B->stack_->definition()->AsConstant()->value();
-    code_ += B->Drop();
-    return Constant(Z, value);
-  }
-}
-
-void BytecodeFlowGraphBuilder::LoadStackSlots(intptr_t num_slots) {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  }
-
-  ASSERT(GetStackDepth() >= num_slots);
-}
-
-void BytecodeFlowGraphBuilder::AllocateLocalVariables(
-    Operand frame_size,
-    intptr_t num_param_locals) {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  } else {
-    ASSERT(local_vars_.is_empty());
-
-    const intptr_t num_bytecode_locals = frame_size.value();
-    ASSERT(num_bytecode_locals >= 0);
-
-    intptr_t num_locals = num_bytecode_locals;
-    if (exception_var_ != nullptr) {
-      ++num_locals;
-    }
-    if (stacktrace_var_ != nullptr) {
-      ++num_locals;
-    }
-    if (scratch_var_ != nullptr) {
-      ++num_locals;
-    }
-    if (parsed_function()->has_arg_desc_var()) {
-      ++num_locals;
-    }
-    if (parsed_function()->has_entry_points_temp_var()) {
-      ++num_locals;
-    }
-
-    if (num_locals == 0) {
-      return;
-    }
-
-    local_vars_.EnsureLength(num_bytecode_locals, nullptr);
-    intptr_t idx = num_param_locals;
-    for (; idx < num_bytecode_locals; ++idx) {
-      String& name = String::ZoneHandle(
-          Z, Symbols::NewFormatted(thread(), "var%" Pd, idx));
-      LocalVariable* local = new (Z)
-          LocalVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
-                        name, Object::dynamic_type());
-      local->set_index(VariableIndex(-idx));
-      local_vars_[idx] = local;
-    }
-
-    if (exception_var_ != nullptr) {
-      exception_var_->set_index(VariableIndex(-idx));
-      ++idx;
-    }
-    if (stacktrace_var_ != nullptr) {
-      stacktrace_var_->set_index(VariableIndex(-idx));
-      ++idx;
-    }
-    if (scratch_var_ != nullptr) {
-      scratch_var_->set_index(VariableIndex(-idx));
-      ++idx;
-    }
-    if (parsed_function()->has_arg_desc_var()) {
-      parsed_function()->arg_desc_var()->set_index(VariableIndex(-idx));
-      ++idx;
-    }
-    if (parsed_function()->has_entry_points_temp_var()) {
-      parsed_function()->entry_points_temp_var()->set_index(
-          VariableIndex(-idx));
-      ++idx;
-    }
-    ASSERT(idx == num_locals);
-
-    ASSERT(parsed_function()->scope() == nullptr);
-    parsed_function()->AllocateBytecodeVariables(num_locals);
-  }
-}
-
-LocalVariable* BytecodeFlowGraphBuilder::AllocateParameter(
-    intptr_t param_index,
-    VariableIndex var_index) {
-  const String& name =
-      String::ZoneHandle(Z, function().ParameterNameAt(param_index));
-  const AbstractType& type =
-      AbstractType::ZoneHandle(Z, function().ParameterTypeAt(param_index));
-
-  CompileType* param_type = nullptr;
-  if (!inferred_types_attribute_.IsNull()) {
-    // Parameter types are assigned to synthetic PCs = -N,..,-1
-    // where N is number of parameters.
-    const intptr_t pc = -function().NumParameters() + param_index;
-    // Search from the beginning as parameters may be declared in arbitrary
-    // order.
-    inferred_types_index_ = 0;
-    const InferredTypeMetadata inferred_type = GetInferredType(pc);
-    if (!inferred_type.IsTrivial()) {
-      param_type = new (Z) CompileType(inferred_type.ToCompileType(Z));
-    }
-  }
-
-  LocalVariable* param_var =
-      new (Z) LocalVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
-                            name, type, param_type);
-  param_var->set_index(var_index);
-
-  if (!function().IsNonImplicitClosureFunction() &&
-      (function().is_static() ||
-       ((function().name() != Symbols::Call().raw()) &&
-        !parsed_function()->IsCovariantParameter(param_index) &&
-        !parsed_function()->IsGenericCovariantImplParameter(param_index)))) {
-    param_var->set_type_check_mode(LocalVariable::kTypeCheckedByCaller);
-  }
-
-  if (var_index.value() <= 0) {
-    local_vars_[-var_index.value()] = param_var;
-  }
-
-  return param_var;
-}
-
-void BytecodeFlowGraphBuilder::AllocateFixedParameters() {
-  if (is_generating_interpreter()) {
-    return;
-  }
-
-  ASSERT(!function().HasOptionalParameters());
-
-  const intptr_t num_fixed_params = function().num_fixed_parameters();
-  auto parameters =
-      new (Z) ZoneGrowableArray<LocalVariable*>(Z, num_fixed_params);
-
-  for (intptr_t i = 0; i < num_fixed_params; ++i) {
-    LocalVariable* param_var =
-        AllocateParameter(i, VariableIndex(num_fixed_params - i));
-    parameters->Add(param_var);
-  }
-
-  parsed_function()->SetRawParameters(parameters);
-}
-
-const KBCInstr*
-BytecodeFlowGraphBuilder::AllocateParametersAndLocalsForEntryOptional() {
-  ASSERT(KernelBytecode::IsEntryOptionalOpcode(bytecode_instr_));
-
-  const intptr_t num_fixed_params = DecodeOperandA().value();
-  const intptr_t num_opt_pos_params = DecodeOperandB().value();
-  const intptr_t num_opt_named_params = DecodeOperandC().value();
-
-  ASSERT(num_fixed_params == function().num_fixed_parameters());
-  ASSERT(num_opt_pos_params == function().NumOptionalPositionalParameters());
-  ASSERT(num_opt_named_params == function().NumOptionalNamedParameters());
-
-  ASSERT((num_opt_pos_params == 0) || (num_opt_named_params == 0));
-  const intptr_t num_load_const = num_opt_pos_params + 2 * num_opt_named_params;
-
-  const KBCInstr* instr = KernelBytecode::Next(bytecode_instr_);
-  const KBCInstr* frame_instr = instr;
-  for (intptr_t i = 0; i < num_load_const; ++i) {
-    frame_instr = KernelBytecode::Next(frame_instr);
-  }
-  ASSERT(KernelBytecode::IsFrameOpcode(frame_instr));
-  const intptr_t num_extra_locals = KernelBytecode::DecodeD(frame_instr);
-  const intptr_t num_params =
-      num_fixed_params + num_opt_pos_params + num_opt_named_params;
-  const intptr_t total_locals = num_params + num_extra_locals;
-
-  AllocateLocalVariables(Operand(total_locals), num_params);
-
-  ZoneGrowableArray<const Instance*>* default_values =
-      new (Z) ZoneGrowableArray<const Instance*>(
-          Z, num_opt_pos_params + num_opt_named_params);
-  ZoneGrowableArray<LocalVariable*>* raw_parameters =
-      new (Z) ZoneGrowableArray<LocalVariable*>(Z, num_params);
-
-  intptr_t param = 0;
-  for (; param < num_fixed_params; ++param) {
-    LocalVariable* param_var = AllocateParameter(param, VariableIndex(-param));
-    raw_parameters->Add(param_var);
-  }
-
-  for (intptr_t i = 0; i < num_opt_pos_params; ++i, ++param) {
-    const KBCInstr* load_value_instr = instr;
-    instr = KernelBytecode::Next(instr);
-    ASSERT(KernelBytecode::IsLoadConstantOpcode(load_value_instr));
-    ASSERT(KernelBytecode::DecodeA(load_value_instr) == param);
-    const Object& default_value =
-        ConstantAt(Operand(KernelBytecode::DecodeE(load_value_instr))).value();
-
-    LocalVariable* param_var = AllocateParameter(param, VariableIndex(-param));
-    raw_parameters->Add(param_var);
-    default_values->Add(
-        &Instance::ZoneHandle(Z, Instance::RawCast(default_value.raw())));
-  }
-
-  if (num_opt_named_params > 0) {
-    default_values->EnsureLength(num_opt_named_params, nullptr);
-    raw_parameters->EnsureLength(num_params, nullptr);
-
-    ASSERT(scratch_var_ != nullptr);
-
-    for (intptr_t i = 0; i < num_opt_named_params; ++i, ++param) {
-      const KBCInstr* load_name_instr = instr;
-      const KBCInstr* load_value_instr = KernelBytecode::Next(load_name_instr);
-      instr = KernelBytecode::Next(load_value_instr);
-      ASSERT(KernelBytecode::IsLoadConstantOpcode(load_name_instr));
-      ASSERT(KernelBytecode::IsLoadConstantOpcode(load_value_instr));
-      const String& param_name = String::Cast(
-          ConstantAt(Operand(KernelBytecode::DecodeE(load_name_instr)))
-              .value());
-      ASSERT(param_name.IsSymbol());
-      const Object& default_value =
-          ConstantAt(Operand(KernelBytecode::DecodeE(load_value_instr)))
-              .value();
-
-      intptr_t param_index = num_fixed_params;
-      for (; param_index < num_params; ++param_index) {
-        if (function().ParameterNameAt(param_index) == param_name.raw()) {
-          break;
-        }
-      }
-      ASSERT(param_index < num_params);
-
-      ASSERT(default_values->At(param_index - num_fixed_params) == nullptr);
-      (*default_values)[param_index - num_fixed_params] =
-          &Instance::ZoneHandle(Z, Instance::RawCast(default_value.raw()));
-
-      const intptr_t local_index = KernelBytecode::DecodeA(load_name_instr);
-      ASSERT(local_index == KernelBytecode::DecodeA(load_value_instr));
-
-      LocalVariable* param_var =
-          AllocateParameter(param_index, VariableIndex(-param));
-      ASSERT(raw_parameters->At(param_index) == nullptr);
-      (*raw_parameters)[param_index] = param_var;
-    }
-  }
-
-  ASSERT(instr == frame_instr);
-
-  parsed_function()->set_default_parameter_values(default_values);
-  parsed_function()->SetRawParameters(raw_parameters);
-
-  return KernelBytecode::Next(frame_instr);
-}
-
-LocalVariable* BytecodeFlowGraphBuilder::LocalVariableAt(intptr_t local_index) {
-  ASSERT(!is_generating_interpreter());
-  if (local_index < 0) {
-    // Parameter
-    ASSERT(!function().HasOptionalParameters());
-    const intptr_t param_index = local_index +
-                                 function().num_fixed_parameters() +
-                                 kKBCParamEndSlotFromFp;
-    ASSERT((0 <= param_index) &&
-           (param_index < function().num_fixed_parameters()));
-    return parsed_function()->RawParameterVariable(param_index);
-  } else {
-    return local_vars_.At(local_index);
-  }
-}
-
-void BytecodeFlowGraphBuilder::StoreLocal(Operand local_index) {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  } else {
-    LocalVariable* local_var = LocalVariableAt(local_index.value());
-    code_ += B->StoreLocalRaw(position_, local_var);
-  }
-}
-
-void BytecodeFlowGraphBuilder::LoadLocal(Operand local_index) {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  } else {
-    LocalVariable* local_var = LocalVariableAt(local_index.value());
-    code_ += B->LoadLocal(local_var);
-  }
-}
-
-Value* BytecodeFlowGraphBuilder::Pop() {
-  LoadStackSlots(1);
-  return B->Pop();
-}
-
-intptr_t BytecodeFlowGraphBuilder::GetStackDepth() const {
-  ASSERT(!is_generating_interpreter());
-  return B->GetStackDepth();
-}
-
-bool BytecodeFlowGraphBuilder::IsStackEmpty() const {
-  ASSERT(!is_generating_interpreter());
-  return B->GetStackDepth() == 0;
-}
-
-InferredTypeMetadata BytecodeFlowGraphBuilder::GetInferredType(intptr_t pc) {
-  ASSERT(!inferred_types_attribute_.IsNull());
-  intptr_t i = inferred_types_index_;
-  const intptr_t len = inferred_types_attribute_.Length();
-  for (; i < len; i += InferredTypeBytecodeAttribute::kNumElements) {
-    ASSERT(i + InferredTypeBytecodeAttribute::kNumElements <= len);
-    const intptr_t attr_pc =
-        InferredTypeBytecodeAttribute::GetPCAt(inferred_types_attribute_, i);
-    if (attr_pc == pc) {
-      const InferredTypeMetadata result =
-          InferredTypeBytecodeAttribute::GetInferredTypeAt(
-              Z, inferred_types_attribute_, i);
-      // Found. Next time, continue search at the next entry.
-      inferred_types_index_ = i + InferredTypeBytecodeAttribute::kNumElements;
-      return result;
-    }
-    if (attr_pc > pc) {
-      break;
-    }
-  }
-  // Not found. Next time, continue search at the last inspected entry.
-  inferred_types_index_ = i;
-  return InferredTypeMetadata(kDynamicCid, InferredTypeMetadata::kFlagNullable);
-}
-
-void BytecodeFlowGraphBuilder::PropagateStackState(intptr_t target_pc) {
-  if (is_generating_interpreter() || IsStackEmpty()) {
-    return;
-  }
-
-  Value* current_stack = B->stack_;
-  Value* target_stack = stack_states_.Lookup(target_pc);
-
-  if (target_stack != nullptr) {
-    // Control flow join should observe the same stack state from
-    // all incoming branches.
-    RELEASE_ASSERT(target_stack == current_stack);
-  } else {
-    // Stack state propagation is supported for forward branches only.
-    RELEASE_ASSERT(target_pc > pc_);
-    stack_states_.Insert(target_pc, current_stack);
-  }
-}
-
-// Drop values from the stack unless they are used in control flow joins
-// which are not generated yet (dartbug.com/36374).
-void BytecodeFlowGraphBuilder::DropUnusedValuesFromStack() {
-  intptr_t drop_depth = GetStackDepth();
-  auto it = stack_states_.GetIterator();
-  for (const auto* current = it.Next(); current != nullptr;
-       current = it.Next()) {
-    if (current->key > pc_) {
-      Value* used_value = current->value;
-      Value* value = B->stack_;
-      // Find if a value on the expression stack is used in a propagated
-      // stack state, and adjust [drop_depth] to preserve it.
-      for (intptr_t i = 0; i < drop_depth; ++i) {
-        if (value == used_value) {
-          drop_depth = i;
-          break;
-        }
-        value = value->next_use();
-      }
-    }
-  }
-  for (intptr_t i = 0; i < drop_depth; ++i) {
-    B->Pop();
-  }
-}
-
-void BytecodeFlowGraphBuilder::BuildInstruction(KernelBytecode::Opcode opcode) {
-  switch (opcode) {
-#define WIDE_CASE(name) case KernelBytecode::k##name##_Wide:
-#define WIDE_CASE_0(name)
-#define WIDE_CASE_A(name)
-#define WIDE_CASE_D(name) WIDE_CASE(name)
-#define WIDE_CASE_X(name) WIDE_CASE(name)
-#define WIDE_CASE_T(name) WIDE_CASE(name)
-#define WIDE_CASE_A_E(name) WIDE_CASE(name)
-#define WIDE_CASE_A_Y(name) WIDE_CASE(name)
-#define WIDE_CASE_D_F(name) WIDE_CASE(name)
-#define WIDE_CASE_A_B_C(name)
-
-#define BUILD_BYTECODE_CASE(name, encoding, kind, op1, op2, op3)               \
-  BUILD_BYTECODE_CASE_##kind(name, encoding)
-
-#define BUILD_BYTECODE_CASE_WIDE(name, encoding)
-#define BUILD_BYTECODE_CASE_RESV(name, encoding)
-#define BUILD_BYTECODE_CASE_ORDN(name, encoding)                               \
-  case KernelBytecode::k##name:                                                \
-    WIDE_CASE_##encoding(name) Build##name();                                  \
-    break;
-
-    PUBLIC_KERNEL_BYTECODES_LIST(BUILD_BYTECODE_CASE)
-
-#undef WIDE_CASE
-#undef WIDE_CASE_0
-#undef WIDE_CASE_A
-#undef WIDE_CASE_D
-#undef WIDE_CASE_X
-#undef WIDE_CASE_T
-#undef WIDE_CASE_A_E
-#undef WIDE_CASE_A_Y
-#undef WIDE_CASE_D_F
-#undef WIDE_CASE_A_B_C
-#undef BUILD_BYTECODE_CASE
-#undef BUILD_BYTECODE_CASE_WIDE
-#undef BUILD_BYTECODE_CASE_RESV
-#undef BUILD_BYTECODE_CASE_ORDN
-
-    default:
-      FATAL1("Unsupported bytecode instruction %s\n",
-             KernelBytecode::NameOf(opcode));
-  }
-}
-
-void BytecodeFlowGraphBuilder::BuildEntry() {
-  AllocateLocalVariables(DecodeOperandD());
-  AllocateFixedParameters();
-}
-
-void BytecodeFlowGraphBuilder::BuildEntryFixed() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  }
-
-  const intptr_t num_fixed_params = DecodeOperandA().value();
-  ASSERT(num_fixed_params == function().num_fixed_parameters());
-
-  AllocateLocalVariables(DecodeOperandE());
-  AllocateFixedParameters();
-
-  Fragment check_args;
-
-  ASSERT(throw_no_such_method_ == nullptr);
-  throw_no_such_method_ = B->BuildThrowNoSuchMethod();
-
-  check_args += B->LoadArgDescriptor();
-  check_args +=
-      B->LoadNativeField(Slot::ArgumentsDescriptor_positional_count());
-  check_args += B->IntConstant(num_fixed_params);
-  TargetEntryInstr *success1, *fail1;
-  check_args += B->BranchIfEqual(&success1, &fail1);
-  check_args = Fragment(check_args.entry, success1);
-
-  check_args += B->LoadArgDescriptor();
-  check_args += B->LoadNativeField(Slot::ArgumentsDescriptor_count());
-  check_args += B->IntConstant(num_fixed_params);
-  TargetEntryInstr *success2, *fail2;
-  check_args += B->BranchIfEqual(&success2, &fail2);
-  check_args = Fragment(check_args.entry, success2);
-
-  Fragment(fail1) + B->Goto(throw_no_such_method_);
-  Fragment(fail2) + B->Goto(throw_no_such_method_);
-
-  ASSERT(IsStackEmpty());
-
-  if (!B->IsInlining() && !B->IsCompiledForOsr()) {
-    code_ += check_args;
-  }
-}
-
-void BytecodeFlowGraphBuilder::BuildEntryOptional() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  }
-
-  const KBCInstr* next_instr = AllocateParametersAndLocalsForEntryOptional();
-
-  LocalVariable* temp_var = nullptr;
-  if (function().HasOptionalNamedParameters()) {
-    ASSERT(scratch_var_ != nullptr);
-    temp_var = scratch_var_;
-  }
-
-  Fragment copy_args_prologue;
-
-  // Code generated for EntryOptional is considered a prologue code.
-  // Prologue should span a range of block ids, so start a new block at the
-  // beginning and end a block at the end.
-  JoinEntryInstr* prologue_entry = B->BuildJoinEntry();
-  copy_args_prologue += B->Goto(prologue_entry);
-  copy_args_prologue = Fragment(copy_args_prologue.entry, prologue_entry);
-
-  ASSERT(throw_no_such_method_ == nullptr);
-  if (function().CanReceiveDynamicInvocation()) {
-    // We only pass a non-nullptr NSM block if argument shape checks are needed.
-    throw_no_such_method_ = B->BuildThrowNoSuchMethod();
-  }
-
-  PrologueBuilder prologue_builder(parsed_function(), B->last_used_block_id_,
-                                   B->IsCompiledForOsr(), B->IsInlining());
-
-  copy_args_prologue += prologue_builder.BuildOptionalParameterHandling(
-      throw_no_such_method_, temp_var);
-
-  B->last_used_block_id_ = prologue_builder.last_used_block_id();
-
-  JoinEntryInstr* prologue_exit = B->BuildJoinEntry();
-  copy_args_prologue += B->Goto(prologue_exit);
-  copy_args_prologue.current = prologue_exit;
-
-  if (!B->IsInlining() && !B->IsCompiledForOsr()) {
-    code_ += copy_args_prologue;
-  }
-
-  prologue_info_ =
-      PrologueInfo(prologue_entry->block_id(), prologue_exit->block_id() - 1);
-
-  // Skip LoadConstant and Frame instructions.
-  next_pc_ = pc_ + (next_instr - bytecode_instr_);
-
-  ASSERT(IsStackEmpty());
-}
-
-void BytecodeFlowGraphBuilder::BuildLoadConstant() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  }
-
-  // Handled in EntryOptional instruction.
-  UNREACHABLE();
-}
-
-void BytecodeFlowGraphBuilder::BuildFrame() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  }
-
-  // Handled in EntryOptional instruction.
-  UNREACHABLE();
-}
-
-void BytecodeFlowGraphBuilder::BuildCheckFunctionTypeArgs() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  }
-
-  const intptr_t expected_num_type_args = DecodeOperandA().value();
-  LocalVariable* type_args_var = LocalVariableAt(DecodeOperandE().value());
-
-  const bool check_lengths = function().CanReceiveDynamicInvocation();
-
-  if (check_lengths && throw_no_such_method_ == nullptr) {
-    throw_no_such_method_ = B->BuildThrowNoSuchMethod();
-  }
-
-  Fragment setup_type_args;
-
-  // Type args are always optional, so length can always be zero.
-  // If expect_type_args and lengths are being checked, a non-zero length must
-  // match the declaration length.
-  if (expected_num_type_args != 0) {
-    JoinEntryInstr* done = B->BuildJoinEntry();
-
-    TargetEntryInstr *then, *otherwise;
-    setup_type_args += B->LoadArgDescriptor();
-    setup_type_args +=
-        B->LoadNativeField(Slot::ArgumentsDescriptor_type_args_len());
-    LocalVariable* len = B->MakeTemporary();
-    setup_type_args += B->LoadLocal(len);
-    setup_type_args += B->IntConstant(0);
-    setup_type_args += B->BranchIfEqual(&then, &otherwise);
-
-    JoinEntryInstr* join2 = B->BuildJoinEntry();
-
-    Fragment store_type_args(otherwise);
-    if (check_lengths) {
-      Fragment check_length;
-      check_length += B->LoadLocal(len);
-      check_length += B->IntConstant(expected_num_type_args);
-      TargetEntryInstr *then2, *fail;
-      check_length += B->BranchIfEqual(&then2, &fail);
-      check_length.current = then2;  // Continue in the non-error case.
-
-      Fragment(fail) + B->Goto(throw_no_such_method_);
-
-      store_type_args += check_length;
-    }
-
-    store_type_args += B->LoadArgDescriptor();
-    store_type_args += B->LoadNativeField(Slot::ArgumentsDescriptor_count());
-    store_type_args += B->LoadFpRelativeSlot(
-        compiler::target::kWordSize *
-            (1 + compiler::target::frame_layout.param_end_from_fp),
-        CompileType::CreateNullable(/*is_nullable=*/true, kTypeArgumentsCid));
-    store_type_args +=
-        B->StoreLocalRaw(TokenPosition::kNoSource, type_args_var);
-    store_type_args += B->Drop();
-    store_type_args += B->Goto(join2);
-
-    Fragment null_type_args(then);
-    null_type_args += B->NullConstant();
-    null_type_args += B->StoreLocalRaw(TokenPosition::kNoSource, type_args_var);
-    null_type_args += B->Drop();
-    null_type_args += B->Goto(join2);
-
-    Fragment(join2) + B->Drop() + B->Goto(done);
-
-    setup_type_args.current = done;
-  } else if (check_lengths) {
-    TargetEntryInstr *then, *fail;
-    setup_type_args += B->LoadArgDescriptor();
-    setup_type_args +=
-        B->LoadNativeField(Slot::ArgumentsDescriptor_type_args_len());
-    setup_type_args += B->IntConstant(0);
-    setup_type_args += B->BranchIfEqual(&then, &fail);
-    setup_type_args.current = then;  // Continue in the non-error case.
-
-    Fragment(fail) + B->Goto(throw_no_such_method_);
-  }
-
-  ASSERT(IsStackEmpty());
-
-  if (expected_num_type_args != 0) {
-    parsed_function()->set_function_type_arguments(type_args_var);
-    parsed_function()->SetRawTypeArgumentsVariable(type_args_var);
-  }
-
-  if (!B->IsInlining() && !B->IsCompiledForOsr()) {
-    code_ += setup_type_args;
-  }
-}
-
-void BytecodeFlowGraphBuilder::BuildCheckStack() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  }
-  const intptr_t loop_depth = DecodeOperandA().value();
-  if (loop_depth == 0) {
-    ASSERT(IsStackEmpty());
-    code_ += B->CheckStackOverflowInPrologue(position_);
-  } else {
-    const intptr_t stack_depth = B->GetStackDepth();
-    code_ += B->CheckStackOverflow(position_, stack_depth, loop_depth);
-  }
-}
-
-void BytecodeFlowGraphBuilder::BuildDebugCheck() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  }
-  // DebugStepCheck instructions are emitted for all explicit DebugCheck
-  // opcodes as well as for implicit DEBUG_CHECK executed by the interpreter
-  // for some opcodes, but not before the first explicit DebugCheck opcode is
-  // encountered.
-  build_debug_step_checks_ = true;
-  BuildDebugStepCheck();
-}
-
-void BytecodeFlowGraphBuilder::BuildPushConstant() {
-  PushConstant(ConstantAt(DecodeOperandD()));
-}
-
-void BytecodeFlowGraphBuilder::BuildPushNull() {
-  code_ += B->NullConstant();
-}
-
-void BytecodeFlowGraphBuilder::BuildPushTrue() {
-  code_ += B->Constant(Bool::True());
-}
-
-void BytecodeFlowGraphBuilder::BuildPushFalse() {
-  code_ += B->Constant(Bool::False());
-}
-
-void BytecodeFlowGraphBuilder::BuildPushInt() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  }
-  code_ += B->IntConstant(DecodeOperandX().value());
-}
-
-void BytecodeFlowGraphBuilder::BuildStoreLocal() {
-  LoadStackSlots(1);
-  const Operand local_index = DecodeOperandX();
-  StoreLocal(local_index);
-}
-
-void BytecodeFlowGraphBuilder::BuildPopLocal() {
-  BuildStoreLocal();
-  code_ += B->Drop();
-}
-
-void BytecodeFlowGraphBuilder::BuildPush() {
-  const Operand local_index = DecodeOperandX();
-  LoadLocal(local_index);
-}
-
-void BytecodeFlowGraphBuilder::BuildDirectCallCommon(bool is_unchecked_call) {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  }
-
-  // A DebugStepCheck is performed as part of the calling stub.
-
-  const Function& target = Function::Cast(ConstantAt(DecodeOperandD()).value());
-  const intptr_t argc = DecodeOperandF().value();
-
-  switch (target.recognized_kind()) {
-    case MethodRecognizer::kFfiAsFunctionInternal:
-      BuildFfiAsFunction();
-      return;
-    case MethodRecognizer::kFfiNativeCallbackFunction:
-      if (CompilerState::Current().is_aot()) {
-        BuildFfiNativeCallbackFunction();
-        return;
-      }
-      break;
-    case MethodRecognizer::kObjectIdentical:
-      // Note: similar optimization is performed in AST flow graph builder -
-      // see StreamingFlowGraphBuilder::BuildStaticInvocation,
-      // special_case_identical.
-      // TODO(alexmarkov): find a better place for this optimization.
-      ASSERT(argc == 2);
-      code_ += B->StrictCompare(Token::kEQ_STRICT, /*number_check=*/true);
-      return;
-    case MethodRecognizer::kAsyncStackTraceHelper:
-    case MethodRecognizer::kSetAsyncThreadStackTrace:
-      if (!FLAG_causal_async_stacks) {
-        ASSERT(argc == 1);
-        // Drop the ignored parameter to _asyncStackTraceHelper(:async_op) or
-        // _setAsyncThreadStackTrace(stackTrace).
-        code_ += B->Drop();
-        code_ += B->NullConstant();
-        return;
-      }
-      break;
-    case MethodRecognizer::kClearAsyncThreadStackTrace:
-      if (!FLAG_causal_async_stacks) {
-        ASSERT(argc == 0);
-        code_ += B->NullConstant();
-        return;
-      }
-      break;
-    case MethodRecognizer::kStringBaseInterpolate:
-      ASSERT(argc == 1);
-      code_ += B->StringInterpolate(position_);
-      return;
-    default:
-      break;
-  }
-
-  const Array& arg_desc_array =
-      Array::Cast(ConstantAt(DecodeOperandD(), 1).value());
-  const ArgumentsDescriptor arg_desc(arg_desc_array);
-
-  InputsArray* arguments = B->GetArguments(argc);
-
-  StaticCallInstr* call = new (Z) StaticCallInstr(
-      position_, target, arg_desc.TypeArgsLen(),
-      Array::ZoneHandle(Z, arg_desc.GetArgumentNames()), arguments,
-      *ic_data_array_, B->GetNextDeoptId(),
-      target.IsDynamicFunction() ? ICData::kSuper : ICData::kStatic);
-
-  if (is_unchecked_call) {
-    call->set_entry_kind(Code::EntryKind::kUnchecked);
-  }
-
-  if (!call->InitResultType(Z)) {
-    if (!inferred_types_attribute_.IsNull()) {
-      const InferredTypeMetadata result_type = GetInferredType(pc_);
-      if (!result_type.IsTrivial()) {
-        call->SetResultType(Z, result_type.ToCompileType(Z));
-      }
-    }
-  }
-
-  code_ <<= call;
-  B->Push(call);
-}
-
-void BytecodeFlowGraphBuilder::BuildDirectCall() {
-  BuildDirectCallCommon(/* is_unchecked_call = */ false);
-}
-
-void BytecodeFlowGraphBuilder::BuildUncheckedDirectCall() {
-  BuildDirectCallCommon(/* is_unchecked_call = */ true);
-}
-
-static void ComputeTokenKindAndCheckedArguments(
-    const String& name,
-    const ArgumentsDescriptor& arg_desc,
-    Token::Kind* token_kind,
-    intptr_t* checked_argument_count) {
-  *token_kind = MethodTokenRecognizer::RecognizeTokenKind(name);
-
-  *checked_argument_count = 1;
-  if (*token_kind != Token::kILLEGAL) {
-    intptr_t argument_count = arg_desc.Count();
-    ASSERT(argument_count <= 2);
-    *checked_argument_count = (*token_kind == Token::kSET) ? 1 : argument_count;
-  } else if (Library::IsPrivateCoreLibName(name,
-                                           Symbols::_simpleInstanceOf())) {
-    ASSERT(arg_desc.Count() == 2);
-    *checked_argument_count = 2;
-    *token_kind = Token::kIS;
-  } else if (Library::IsPrivateCoreLibName(name, Symbols::_instanceOf())) {
-    ASSERT(arg_desc.Count() == 4);
-    *token_kind = Token::kIS;
-  }
-}
-
-void BytecodeFlowGraphBuilder::BuildInterfaceCallCommon(
-    bool is_unchecked_call,
-    bool is_instantiated_call) {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  }
-
-  // A DebugStepCheck is performed as part of the calling stub.
-
-  const Function& interface_target =
-      Function::Cast(ConstantAt(DecodeOperandD()).value());
-  const String& name = String::ZoneHandle(Z, interface_target.name());
-  ASSERT(name.IsSymbol());
-
-  const Array& arg_desc_array =
-      Array::Cast(ConstantAt(DecodeOperandD(), 1).value());
-  const ArgumentsDescriptor arg_desc(arg_desc_array);
-
-  Token::Kind token_kind;
-  intptr_t checked_argument_count;
-  ComputeTokenKindAndCheckedArguments(name, arg_desc, &token_kind,
-                                      &checked_argument_count);
-
-  const intptr_t argc = DecodeOperandF().value();
-  InputsArray* arguments = B->GetArguments(argc);
-
-  InstanceCallInstr* call = new (Z) InstanceCallInstr(
-      position_, name, token_kind, arguments, arg_desc.TypeArgsLen(),
-      Array::ZoneHandle(Z, arg_desc.GetArgumentNames()), checked_argument_count,
-      *ic_data_array_, B->GetNextDeoptId(), interface_target);
-
-  if (!inferred_types_attribute_.IsNull()) {
-    const InferredTypeMetadata result_type = GetInferredType(pc_);
-    if (!result_type.IsTrivial()) {
-      call->SetResultType(Z, result_type.ToCompileType(Z));
-    }
-  }
-
-  if (is_unchecked_call) {
-    call->set_entry_kind(Code::EntryKind::kUnchecked);
-  }
-
-  if (is_instantiated_call) {
-    const AbstractType& static_receiver_type =
-        AbstractType::Cast(ConstantAt(DecodeOperandD(), 2).value());
-    call->set_receivers_static_type(&static_receiver_type);
-  } else {
-    const Class& owner = Class::Handle(Z, interface_target.Owner());
-    const AbstractType& type =
-        AbstractType::ZoneHandle(Z, owner.DeclarationType());
-    call->set_receivers_static_type(&type);
-  }
-
-  code_ <<= call;
-  B->Push(call);
-}
-
-void BytecodeFlowGraphBuilder::BuildInterfaceCall() {
-  BuildInterfaceCallCommon(/*is_unchecked_call=*/false,
-                           /*is_instantiated_call=*/false);
-}
-
-void BytecodeFlowGraphBuilder::BuildInstantiatedInterfaceCall() {
-  BuildInterfaceCallCommon(/*is_unchecked_call=*/false,
-                           /*is_instantiated_call=*/true);
-}
-
-void BytecodeFlowGraphBuilder::BuildUncheckedInterfaceCall() {
-  BuildInterfaceCallCommon(/*is_unchecked_call=*/true,
-                           /*is_instantiated_call=*/false);
-}
-
-void BytecodeFlowGraphBuilder::BuildUncheckedClosureCall() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  }
-
-  BuildDebugStepCheck();
-
-  const Array& arg_desc_array =
-      Array::Cast(ConstantAt(DecodeOperandD()).value());
-  const ArgumentsDescriptor arg_desc(arg_desc_array);
-
-  const intptr_t argc = DecodeOperandF().value();
-
-  LocalVariable* receiver_temp = B->MakeTemporary();
-  code_ += B->CheckNull(position_, receiver_temp, Symbols::Call(),
-                        /*clear_temp=*/false);
-
-  code_ += B->LoadNativeField(Slot::Closure_function());
-
-  InputsArray* arguments = B->GetArguments(argc + 1);
-
-  ClosureCallInstr* call = new (Z) ClosureCallInstr(
-      arguments, arg_desc.TypeArgsLen(),
-      Array::ZoneHandle(Z, arg_desc.GetArgumentNames()), position_,
-      B->GetNextDeoptId(), Code::EntryKind::kUnchecked);
-
-  // TODO(alexmarkov): use inferred result type for ClosureCallInstr
-  //  if (!inferred_types_attribute_.IsNull()) {
-  //    const InferredTypeMetadata result_type = GetInferredType(pc_);
-  //    if (!result_type.IsTrivial()) {
-  //      call->SetResultType(Z, result_type.ToCompileType(Z));
-  //    }
-  //  }
-
-  code_ <<= call;
-  B->Push(call);
-}
-
-void BytecodeFlowGraphBuilder::BuildDynamicCall() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  }
-
-  // A DebugStepCheck is performed as part of the calling stub.
-
-  const String& name = String::Cast(ConstantAt(DecodeOperandD()).value());
-  const ArgumentsDescriptor arg_desc(
-      Array::Cast(ConstantAt(DecodeOperandD(), 1).value()));
-
-  Token::Kind token_kind;
-  intptr_t checked_argument_count;
-  ComputeTokenKindAndCheckedArguments(name, arg_desc, &token_kind,
-                                      &checked_argument_count);
-
-  const intptr_t argc = DecodeOperandF().value();
-  InputsArray* arguments = B->GetArguments(argc);
-
-  const Function& interface_target = Function::null_function();
-
-  InstanceCallInstr* call = new (Z) InstanceCallInstr(
-      position_, name, token_kind, arguments, arg_desc.TypeArgsLen(),
-      Array::ZoneHandle(Z, arg_desc.GetArgumentNames()), checked_argument_count,
-      *ic_data_array_, B->GetNextDeoptId(), interface_target);
-
-  if (!inferred_types_attribute_.IsNull()) {
-    const InferredTypeMetadata result_type = GetInferredType(pc_);
-    if (!result_type.IsTrivial()) {
-      call->SetResultType(Z, result_type.ToCompileType(Z));
-    }
-  }
-
-  code_ <<= call;
-  B->Push(call);
-}
-
-void BytecodeFlowGraphBuilder::BuildNativeCall() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  }
-
-  ASSERT(function().is_native());
-  B->InlineBailout("BytecodeFlowGraphBuilder::BuildNativeCall");
-
-  const auto& name = String::ZoneHandle(Z, function().native_name());
-  const intptr_t num_args =
-      function().NumParameters() + (function().IsGeneric() ? 1 : 0);
-  InputsArray* arguments = B->GetArguments(num_args);
-  auto* call =
-      new (Z) NativeCallInstr(&name, &function(), FLAG_link_natives_lazily,
-                              function().end_token_pos(), arguments);
-  code_ <<= call;
-  B->Push(call);
-}
-
-void BytecodeFlowGraphBuilder::BuildAllocate() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  }
-
-  const Class& klass = Class::Cast(ConstantAt(DecodeOperandD()).value());
-
-  AllocateObjectInstr* allocate = new (Z) AllocateObjectInstr(position_, klass);
-
-  code_ <<= allocate;
-  B->Push(allocate);
-}
-
-void BytecodeFlowGraphBuilder::BuildAllocateT() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  }
-
-  const Class& klass = Class::Cast(PopConstant().value());
-  Value* type_arguments = Pop();
-
-  AllocateObjectInstr* allocate =
-      new (Z) AllocateObjectInstr(position_, klass, type_arguments);
-
-  code_ <<= allocate;
-  B->Push(allocate);
-}
-
-void BytecodeFlowGraphBuilder::BuildAllocateContext() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  }
-
-  const intptr_t context_id = DecodeOperandA().value();
-  const intptr_t num_context_vars = DecodeOperandE().value();
-
-  auto& context_slots = CompilerState::Current().GetDummyContextSlots(
-      context_id, num_context_vars);
-  code_ += B->AllocateContext(context_slots);
-}
-
-void BytecodeFlowGraphBuilder::BuildCloneContext() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  }
-
-  LoadStackSlots(1);
-  const intptr_t context_id = DecodeOperandA().value();
-  const intptr_t num_context_vars = DecodeOperandE().value();
-
-  auto& context_slots = CompilerState::Current().GetDummyContextSlots(
-      context_id, num_context_vars);
-  CloneContextInstr* clone_instruction = new (Z) CloneContextInstr(
-      TokenPosition::kNoSource, Pop(), context_slots, B->GetNextDeoptId());
-  code_ <<= clone_instruction;
-  B->Push(clone_instruction);
-}
-
-void BytecodeFlowGraphBuilder::BuildCreateArrayTOS() {
-  LoadStackSlots(2);
-  code_ += B->CreateArray();
-}
-
-const Slot& ClosureSlotByField(const Field& field) {
-  const intptr_t offset = field.HostOffset();
-  if (offset == Closure::instantiator_type_arguments_offset()) {
-    return Slot::Closure_instantiator_type_arguments();
-  } else if (offset == Closure::function_type_arguments_offset()) {
-    return Slot::Closure_function_type_arguments();
-  } else if (offset == Closure::delayed_type_arguments_offset()) {
-    return Slot::Closure_delayed_type_arguments();
-  } else if (offset == Closure::function_offset()) {
-    return Slot::Closure_function();
-  } else if (offset == Closure::context_offset()) {
-    return Slot::Closure_context();
-  } else {
-    RELEASE_ASSERT(offset == Closure::hash_offset());
-    return Slot::Closure_hash();
-  }
-}
-
-void BytecodeFlowGraphBuilder::BuildStoreFieldTOS() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  }
-
-  LoadStackSlots(2);
-  Operand cp_index = DecodeOperandD();
-
-  const Field& field = Field::Cast(ConstantAt(cp_index, 1).value());
-  ASSERT(Smi::Cast(ConstantAt(cp_index).value()).Value() * kWordSize ==
-         field.HostOffset());
-
-  if (field.Owner() == isolate()->object_store()->closure_class()) {
-    // Stores to _Closure fields are lower-level.
-    code_ +=
-        B->StoreInstanceField(position_, ClosureSlotByField(field),
-                              StoreInstanceFieldInstr::Kind::kInitializing);
-  } else {
-    // The rest of the StoreFieldTOS are for field initializers.
-    // TODO(alexmarkov): Consider adding a flag to StoreFieldTOS or even
-    // adding a separate bytecode instruction.
-    code_ += B->StoreInstanceFieldGuarded(
-        field, StoreInstanceFieldInstr::Kind::kInitializing);
-  }
-}
-
-void BytecodeFlowGraphBuilder::BuildLoadFieldTOS() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  }
-
-  LoadStackSlots(1);
-  Operand cp_index = DecodeOperandD();
-
-  const Field& field = Field::Cast(ConstantAt(cp_index, 1).value());
-  ASSERT(Smi::Cast(ConstantAt(cp_index).value()).Value() * kWordSize ==
-         field.HostOffset());
-
-  if (field.Owner() == isolate()->object_store()->closure_class()) {
-    // Loads from _Closure fields are lower-level.
-    code_ += B->LoadNativeField(ClosureSlotByField(field));
-  } else {
-    code_ += B->LoadField(field, /*calls_initializer=*/false);
-  }
-}
-
-void BytecodeFlowGraphBuilder::BuildStoreContextParent() {
-  LoadStackSlots(2);
-
-  code_ += B->StoreInstanceField(position_, Slot::Context_parent(),
-                                 StoreInstanceFieldInstr::Kind::kInitializing);
-}
-
-void BytecodeFlowGraphBuilder::BuildLoadContextParent() {
-  LoadStackSlots(1);
-
-  code_ += B->LoadNativeField(Slot::Context_parent());
-}
-
-void BytecodeFlowGraphBuilder::BuildStoreContextVar() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  }
-
-  LoadStackSlots(2);
-  const intptr_t context_id = DecodeOperandA().value();
-  const intptr_t var_index = DecodeOperandE().value();
-
-  auto var =
-      CompilerState::Current().GetDummyCapturedVariable(context_id, var_index);
-  code_ += B->StoreInstanceField(
-      position_, Slot::GetContextVariableSlotFor(thread(), *var));
-}
-
-void BytecodeFlowGraphBuilder::BuildLoadContextVar() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  }
-
-  LoadStackSlots(1);
-  const intptr_t context_id = DecodeOperandA().value();
-  const intptr_t var_index = DecodeOperandE().value();
-
-  auto var =
-      CompilerState::Current().GetDummyCapturedVariable(context_id, var_index);
-  code_ += B->LoadNativeField(Slot::GetContextVariableSlotFor(thread(), *var));
-}
-
-void BytecodeFlowGraphBuilder::BuildLoadTypeArgumentsField() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  }
-
-  LoadStackSlots(1);
-  const intptr_t offset =
-      Smi::Cast(ConstantAt(DecodeOperandD()).value()).Value() *
-      compiler::target::kWordSize;
-
-  code_ += B->LoadNativeField(Slot::GetTypeArgumentsSlotAt(thread(), offset));
-}
-
-void BytecodeFlowGraphBuilder::BuildStoreStaticTOS() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  }
-
-  LoadStackSlots(1);
-  Operand cp_index = DecodeOperandD();
-
-  const Field& field = Field::Cast(ConstantAt(cp_index).value());
-
-  code_ += B->StoreStaticField(position_, field);
-}
-
-void BytecodeFlowGraphBuilder::BuildInitLateField() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  }
-
-  LoadStackSlots(1);
-  Operand cp_index = DecodeOperandD();
-
-  const Field& field = Field::Cast(ConstantAt(cp_index, 1).value());
-  ASSERT(Smi::Cast(ConstantAt(cp_index).value()).Value() * kWordSize ==
-         field.HostOffset());
-
-  code_ += B->Constant(Object::sentinel());
-  code_ += B->StoreInstanceField(
-      field, StoreInstanceFieldInstr::Kind::kInitializing, kNoStoreBarrier);
-}
-
-void BytecodeFlowGraphBuilder::BuildPushUninitializedSentinel() {
-  code_ += B->Constant(Object::sentinel());
-}
-
-void BytecodeFlowGraphBuilder::BuildJumpIfInitialized() {
-  code_ += B->Constant(Object::sentinel());
-  BuildJumpIfStrictCompare(Token::kNE);
-}
-
-void BytecodeFlowGraphBuilder::BuildLoadStatic() {
-  const Constant operand = ConstantAt(DecodeOperandD());
-  const auto& field = Field::Cast(operand.value());
-  // All constant expressions (including access to const fields) are evaluated
-  // in bytecode. However, values of injected cid fields are only available in
-  // the VM. In such case, evaluate const fields with known value here.
-  if (field.is_const() && !field.has_nontrivial_initializer()) {
-    const auto& value = Object::ZoneHandle(Z, field.StaticValue());
-    ASSERT((value.raw() != Object::sentinel().raw()) &&
-           (value.raw() != Object::transition_sentinel().raw()));
-    code_ += B->Constant(value);
-    return;
-  }
-  code_ += B->LoadStaticField(field, /*calls_initializer=*/false);
-}
-
-void BytecodeFlowGraphBuilder::BuildStoreIndexedTOS() {
-  LoadStackSlots(3);
-  code_ += B->StoreIndexed(kArrayCid);
-}
-
-void BytecodeFlowGraphBuilder::BuildBooleanNegateTOS() {
-  LoadStackSlots(1);
-  code_ += B->BooleanNegate();
-}
-
-void BytecodeFlowGraphBuilder::BuildInstantiateType() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  }
-
-  const AbstractType& type =
-      AbstractType::Cast(ConstantAt(DecodeOperandD()).value());
-
-  LoadStackSlots(2);
-  code_ += B->InstantiateType(type);
-}
-
-void BytecodeFlowGraphBuilder::BuildInstantiateTypeArgumentsTOS() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  }
-
-  const TypeArguments& type_args =
-      TypeArguments::Cast(ConstantAt(DecodeOperandE()).value());
-
-  LoadStackSlots(2);
-  code_ += B->InstantiateTypeArguments(type_args);
-}
-
-void BytecodeFlowGraphBuilder::BuildAssertBoolean() {
-  LoadStackSlots(1);
-  code_ += B->AssertBool(position_);
-}
-
-void BytecodeFlowGraphBuilder::BuildAssertAssignable() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  }
-
-  LoadStackSlots(5);
-
-  const AbstractType& dst_type =
-      AbstractType::Cast(B->Peek(/*depth=*/3)->AsConstant()->value());
-  if (dst_type.IsTopTypeForSubtyping()) {
-    code_ += B->Drop();  // dst_name
-    code_ += B->Drop();  // function_type_args
-    code_ += B->Drop();  // instantiator_type_args
-    code_ += B->Drop();  // dst_type
-    // Leave value on top.
-    return;
-  }
-
-  const String& dst_name = String::Cast(PopConstant().value());
-  Value* function_type_args = Pop();
-  Value* instantiator_type_args = Pop();
-  Value* dst_type_value = Pop();
-  Value* value = Pop();
-
-  AssertAssignableInstr* instr = new (Z) AssertAssignableInstr(
-      position_, value, dst_type_value, instantiator_type_args,
-      function_type_args, dst_name, B->GetNextDeoptId());
-
-  code_ <<= instr;
-
-  B->Push(instr);
-}
-
-void BytecodeFlowGraphBuilder::BuildAssertSubtype() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  }
-
-  LoadStackSlots(5);
-
-  const String& dst_name = String::Cast(PopConstant().value());
-  Value* super_type = Pop();
-  Value* sub_type = Pop();
-  Value* function_type_args = Pop();
-  Value* instantiator_type_args = Pop();
-
-  AssertSubtypeInstr* instr = new (Z)
-      AssertSubtypeInstr(position_, instantiator_type_args, function_type_args,
-                         sub_type, super_type, dst_name, B->GetNextDeoptId());
-  code_ <<= instr;
-}
-
-void BytecodeFlowGraphBuilder::BuildNullCheck() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  }
-
-  const String& selector =
-      String::CheckedZoneHandle(Z, ConstantAt(DecodeOperandD()).value().raw());
-
-  LocalVariable* receiver_temp = B->MakeTemporary();
-  code_ +=
-      B->CheckNull(position_, receiver_temp, selector, /*clear_temp=*/false);
-  code_ += B->Drop();
-}
-
-void BytecodeFlowGraphBuilder::BuildJump() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  }
-
-  const intptr_t target_pc = pc_ + DecodeOperandT().value();
-  JoinEntryInstr* join = jump_targets_.Lookup(target_pc);
-  ASSERT(join != nullptr);
-  code_ += B->Goto(join);
-  PropagateStackState(target_pc);
-  B->stack_ = nullptr;
-}
-
-void BytecodeFlowGraphBuilder::BuildJumpIfNoAsserts() {
-  ASSERT(IsStackEmpty());
-  if (!isolate()->asserts()) {
-    BuildJump();
-    // Skip all instructions up to the target PC, as they are all unreachable.
-    // If not skipped, some of the assert code may be considered reachable
-    // (if it contains jumps) and generated. The problem is that generated
-    // code may expect values left on the stack from unreachable
-    // (and not generated) code which immediately follows this Jump.
-    next_pc_ = pc_ + DecodeOperandT().value();
-    ASSERT(next_pc_ > pc_);
-  }
-}
-
-void BytecodeFlowGraphBuilder::BuildJumpIfNotZeroTypeArgs() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  }
-
-  TargetEntryInstr *is_zero, *is_not_zero;
-  code_ += B->LoadArgDescriptor();
-  code_ += B->LoadNativeField(Slot::ArgumentsDescriptor_type_args_len());
-  code_ += B->IntConstant(0);
-  code_ += B->BranchIfEqual(&is_zero, &is_not_zero);
-
-  const intptr_t target_pc = pc_ + DecodeOperandT().value();
-  JoinEntryInstr* join = jump_targets_.Lookup(target_pc);
-  ASSERT(join != nullptr);
-  Fragment(is_not_zero) += B->Goto(join);
-  PropagateStackState(target_pc);
-
-  code_ = Fragment(code_.entry, is_zero);
-}
-
-void BytecodeFlowGraphBuilder::BuildJumpIfStrictCompare(Token::Kind cmp_kind) {
-  ASSERT((cmp_kind == Token::kEQ) || (cmp_kind == Token::kNE));
-
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  }
-
-  LoadStackSlots(2);
-
-  // Fallthrough should correspond to 'then' branch target.
-  // This results in a slightly better regalloc.
-  TargetEntryInstr* then_entry = nullptr;
-  TargetEntryInstr* else_entry = nullptr;
-  code_ += B->BranchIfEqual(&then_entry, &else_entry,
-                            /* negate = */ (cmp_kind == Token::kEQ));
-
-  const intptr_t target_pc = pc_ + DecodeOperandT().value();
-  JoinEntryInstr* join = jump_targets_.Lookup(target_pc);
-  ASSERT(join != nullptr);
-
-  code_ = Fragment(else_entry);
-  code_ += B->Goto(join);
-  PropagateStackState(target_pc);
-
-  code_ = Fragment(then_entry);
-}
-
-void BytecodeFlowGraphBuilder::BuildJumpIfEqStrict() {
-  BuildJumpIfStrictCompare(Token::kEQ);
-}
-
-void BytecodeFlowGraphBuilder::BuildJumpIfNeStrict() {
-  BuildJumpIfStrictCompare(Token::kNE);
-}
-
-void BytecodeFlowGraphBuilder::BuildJumpIfTrue() {
-  code_ += B->Constant(Bool::True());
-  BuildJumpIfStrictCompare(Token::kEQ);
-}
-
-void BytecodeFlowGraphBuilder::BuildJumpIfFalse() {
-  code_ += B->Constant(Bool::False());
-  BuildJumpIfStrictCompare(Token::kEQ);
-}
-
-void BytecodeFlowGraphBuilder::BuildJumpIfNull() {
-  code_ += B->NullConstant();
-  BuildJumpIfStrictCompare(Token::kEQ);
-}
-
-void BytecodeFlowGraphBuilder::BuildJumpIfNotNull() {
-  code_ += B->NullConstant();
-  BuildJumpIfStrictCompare(Token::kNE);
-}
-
-void BytecodeFlowGraphBuilder::BuildJumpIfUnchecked() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  }
-
-  ASSERT(IsStackEmpty());
-
-  const intptr_t target_pc = pc_ + DecodeOperandT().value();
-  JoinEntryInstr* target = jump_targets_.Lookup(target_pc);
-  ASSERT(target != nullptr);
-  FunctionEntryInstr* unchecked_entry = nullptr;
-  const intptr_t kCheckedEntry =
-      static_cast<intptr_t>(UncheckedEntryPointStyle::kNone);
-  const intptr_t kUncheckedEntry =
-      static_cast<intptr_t>(UncheckedEntryPointStyle::kSharedWithVariable);
-
-  switch (entry_point_style_) {
-    case UncheckedEntryPointStyle::kNone: {
-      JoinEntryInstr* do_checks = B->BuildJoinEntry();
-      code_ += B->Goto(B->InliningUncheckedEntry() ? target : do_checks);
-      code_ = Fragment(do_checks);
-    } break;
-
-    case UncheckedEntryPointStyle::kSeparate: {
-      // Route normal entry to checks.
-      if (FLAG_enable_testing_pragmas) {
-        code_ += B->IntConstant(kCheckedEntry);
-        code_ += B->BuildEntryPointsIntrospection();
-      }
-      Fragment do_checks = code_;
-
-      // Create a separate unchecked entry point.
-      unchecked_entry = B->BuildFunctionEntry(graph_entry_);
-      code_ = Fragment(unchecked_entry);
-
-      // Re-build prologue for unchecked entry point. It can only contain
-      // Entry, CheckStack and DebugCheck instructions.
-      bytecode_instr_ = raw_bytecode_;
-      ASSERT(KernelBytecode::IsEntryOpcode(bytecode_instr_));
-      bytecode_instr_ = KernelBytecode::Next(bytecode_instr_);
-      while (!KernelBytecode::IsJumpIfUncheckedOpcode(bytecode_instr_)) {
-        ASSERT(KernelBytecode::IsCheckStackOpcode(bytecode_instr_) ||
-               KernelBytecode::IsDebugCheckOpcode(bytecode_instr_));
-        ASSERT(jump_targets_.Lookup(bytecode_instr_ - raw_bytecode_) ==
-               nullptr);
-        BuildInstruction(KernelBytecode::DecodeOpcode(bytecode_instr_));
-        bytecode_instr_ = KernelBytecode::Next(bytecode_instr_);
-      }
-      ASSERT((bytecode_instr_ - raw_bytecode_) == pc_);
-
-      if (FLAG_enable_testing_pragmas) {
-        code_ += B->IntConstant(
-            static_cast<intptr_t>(UncheckedEntryPointStyle::kSeparate));
-        code_ += B->BuildEntryPointsIntrospection();
-      }
-      code_ += B->Goto(target);
-
-      code_ = do_checks;
-    } break;
-
-    case UncheckedEntryPointStyle::kSharedWithVariable: {
-      LocalVariable* ep_var = parsed_function()->entry_points_temp_var();
-
-      // Dispatch based on the value of entry_points_temp_var.
-      TargetEntryInstr *do_checks, *skip_checks;
-      if (FLAG_enable_testing_pragmas) {
-        code_ += B->LoadLocal(ep_var);
-        code_ += B->BuildEntryPointsIntrospection();
-      }
-      code_ += B->LoadLocal(ep_var);
-      code_ += B->IntConstant(kUncheckedEntry);
-      code_ += B->BranchIfEqual(&skip_checks, &do_checks, /*negate=*/false);
-
-      code_ = Fragment(skip_checks);
-      code_ += B->Goto(target);
-
-      // Relink the body of the function from normal entry to 'prologue_join'.
-      JoinEntryInstr* prologue_join = B->BuildJoinEntry();
-      FunctionEntryInstr* normal_entry = graph_entry_->normal_entry();
-      if (normal_entry->next() != nullptr) {
-        prologue_join->LinkTo(normal_entry->next());
-        normal_entry->set_next(nullptr);
-      }
-
-      unchecked_entry = B->BuildFunctionEntry(graph_entry_);
-      code_ = Fragment(unchecked_entry);
-      code_ += B->IntConstant(kUncheckedEntry);
-      code_ += B->StoreLocal(TokenPosition::kNoSource, ep_var);
-      code_ += B->Drop();
-      code_ += B->Goto(prologue_join);
-
-      code_ = Fragment(normal_entry);
-      code_ += B->IntConstant(kCheckedEntry);
-      code_ += B->StoreLocal(TokenPosition::kNoSource, ep_var);
-      code_ += B->Drop();
-      code_ += B->Goto(prologue_join);
-
-      code_ = Fragment(do_checks);
-    } break;
-  }
-
-  if (unchecked_entry != nullptr) {
-    B->RecordUncheckedEntryPoint(graph_entry_, unchecked_entry);
-  }
-}
-
-void BytecodeFlowGraphBuilder::BuildDrop1() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-    // AdjustSP(-1);
-  } else {
-    code_ += B->Drop();
-  }
-}
-
-void BytecodeFlowGraphBuilder::BuildReturnTOS() {
-  BuildDebugStepCheck();
-  LoadStackSlots(1);
-  ASSERT(code_.is_open());
-  intptr_t yield_index = PcDescriptorsLayout::kInvalidYieldIndex;
-  if (function().IsAsyncClosure() || function().IsAsyncGenClosure()) {
-    if (pc_ == last_yield_point_pc_) {
-      // The return might actually be a yield point, if so we need to attach the
-      // yield index to the return instruction.
-      yield_index = last_yield_point_index_;
-    }
-  }
-  code_ += B->Return(position_, yield_index);
-  ASSERT(IsStackEmpty());
-}
-
-void BytecodeFlowGraphBuilder::BuildTrap() {
-  code_ += Fragment(new (Z) StopInstr("Bytecode Trap instruction")).closed();
-}
-
-void BytecodeFlowGraphBuilder::BuildThrow() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  }
-
-  if (DecodeOperandA().value() == 0) {
-    // throw
-    LoadStackSlots(1);
-    Value* exception = Pop();
-    code_ +=
-        Fragment(new (Z) ThrowInstr(position_, B->GetNextDeoptId(), exception))
-            .closed();
-  } else {
-    // rethrow
-    LoadStackSlots(2);
-    Value* stacktrace = Pop();
-    Value* exception = Pop();
-    code_ += Fragment(new (Z) ReThrowInstr(position_, kInvalidTryIndex,
-                                           B->GetNextDeoptId(), exception,
-                                           stacktrace))
-                 .closed();
-  }
-
-  ASSERT(code_.is_closed());
-
-  if (!IsStackEmpty()) {
-    DropUnusedValuesFromStack();
-    B->stack_ = nullptr;
-  }
-}
-
-void BytecodeFlowGraphBuilder::BuildMoveSpecial() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  }
-
-  LocalVariable* special_var = nullptr;
-  switch (DecodeOperandA().value()) {
-    case KernelBytecode::kExceptionSpecialIndex:
-      ASSERT(exception_var_ != nullptr);
-      special_var = exception_var_;
-      break;
-    case KernelBytecode::kStackTraceSpecialIndex:
-      ASSERT(stacktrace_var_ != nullptr);
-      special_var = stacktrace_var_;
-      break;
-    default:
-      UNREACHABLE();
-  }
-
-  code_ += B->LoadLocal(special_var);
-  StoreLocal(DecodeOperandY());
-  code_ += B->Drop();
-}
-
-void BytecodeFlowGraphBuilder::BuildSetFrame() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  }
-
-  // No-op in compiled code.
-  ASSERT(IsStackEmpty());
-}
-
-void BytecodeFlowGraphBuilder::BuildEqualsNull() {
-  BuildDebugStepCheck();
-
-  ASSERT(scratch_var_ != nullptr);
-  LoadStackSlots(1);
-
-  TargetEntryInstr* true_branch = nullptr;
-  TargetEntryInstr* false_branch = nullptr;
-  code_ += B->BranchIfNull(&true_branch, &false_branch);
-
-  JoinEntryInstr* join = B->BuildJoinEntry();
-
-  code_ = Fragment(true_branch);
-  code_ += B->Constant(Bool::True());
-  code_ += B->StoreLocalRaw(position_, scratch_var_);
-  code_ += B->Drop();
-  code_ += B->Goto(join);
-
-  code_ = Fragment(false_branch);
-  code_ += B->Constant(Bool::False());
-  code_ += B->StoreLocalRaw(position_, scratch_var_);
-  code_ += B->Drop();
-  code_ += B->Goto(join);
-
-  code_ = Fragment(join);
-  code_ += B->LoadLocal(scratch_var_);
-}
-
-void BytecodeFlowGraphBuilder::BuildPrimitiveOp(
-    const String& name,
-    Token::Kind token_kind,
-    const AbstractType& static_receiver_type,
-    int num_args) {
-  ASSERT((num_args == 1) || (num_args == 2));
-  ASSERT(MethodTokenRecognizer::RecognizeTokenKind(name) == token_kind);
-
-  // A DebugStepCheck is performed as part of the calling stub.
-
-  LoadStackSlots(num_args);
-  InputsArray* arguments = B->GetArguments(num_args);
-
-  InstanceCallInstr* call = new (Z) InstanceCallInstr(
-      position_, name, token_kind, arguments, 0, Array::null_array(), num_args,
-      *ic_data_array_, B->GetNextDeoptId());
-
-  call->set_receivers_static_type(&static_receiver_type);
-
-  code_ <<= call;
-  B->Push(call);
-}
-
-void BytecodeFlowGraphBuilder::BuildIntOp(const String& name,
-                                          Token::Kind token_kind,
-                                          int num_args) {
-  BuildPrimitiveOp(name, token_kind,
-                   AbstractType::ZoneHandle(Z, Type::IntType()), num_args);
-}
-
-void BytecodeFlowGraphBuilder::BuildDoubleOp(const String& name,
-                                             Token::Kind token_kind,
-                                             int num_args) {
-  BuildPrimitiveOp(name, token_kind,
-                   AbstractType::ZoneHandle(Z, Type::Double()), num_args);
-}
-
-void BytecodeFlowGraphBuilder::BuildNegateInt() {
-  BuildIntOp(Symbols::UnaryMinus(), Token::kNEGATE, 1);
-}
-
-void BytecodeFlowGraphBuilder::BuildAddInt() {
-  BuildIntOp(Symbols::Plus(), Token::kADD, 2);
-}
-
-void BytecodeFlowGraphBuilder::BuildSubInt() {
-  BuildIntOp(Symbols::Minus(), Token::kSUB, 2);
-}
-
-void BytecodeFlowGraphBuilder::BuildMulInt() {
-  BuildIntOp(Symbols::Star(), Token::kMUL, 2);
-}
-
-void BytecodeFlowGraphBuilder::BuildTruncDivInt() {
-  BuildIntOp(Symbols::TruncDivOperator(), Token::kTRUNCDIV, 2);
-}
-
-void BytecodeFlowGraphBuilder::BuildModInt() {
-  BuildIntOp(Symbols::Percent(), Token::kMOD, 2);
-}
-
-void BytecodeFlowGraphBuilder::BuildBitAndInt() {
-  BuildIntOp(Symbols::Ampersand(), Token::kBIT_AND, 2);
-}
-
-void BytecodeFlowGraphBuilder::BuildBitOrInt() {
-  BuildIntOp(Symbols::BitOr(), Token::kBIT_OR, 2);
-}
-
-void BytecodeFlowGraphBuilder::BuildBitXorInt() {
-  BuildIntOp(Symbols::Caret(), Token::kBIT_XOR, 2);
-}
-
-void BytecodeFlowGraphBuilder::BuildShlInt() {
-  BuildIntOp(Symbols::LeftShiftOperator(), Token::kSHL, 2);
-}
-
-void BytecodeFlowGraphBuilder::BuildShrInt() {
-  BuildIntOp(Symbols::RightShiftOperator(), Token::kSHR, 2);
-}
-
-void BytecodeFlowGraphBuilder::BuildCompareIntEq() {
-  BuildIntOp(Symbols::EqualOperator(), Token::kEQ, 2);
-}
-
-void BytecodeFlowGraphBuilder::BuildCompareIntGt() {
-  BuildIntOp(Symbols::RAngleBracket(), Token::kGT, 2);
-}
-
-void BytecodeFlowGraphBuilder::BuildCompareIntLt() {
-  BuildIntOp(Symbols::LAngleBracket(), Token::kLT, 2);
-}
-
-void BytecodeFlowGraphBuilder::BuildCompareIntGe() {
-  BuildIntOp(Symbols::GreaterEqualOperator(), Token::kGTE, 2);
-}
-
-void BytecodeFlowGraphBuilder::BuildCompareIntLe() {
-  BuildIntOp(Symbols::LessEqualOperator(), Token::kLTE, 2);
-}
-
-void BytecodeFlowGraphBuilder::BuildNegateDouble() {
-  BuildDoubleOp(Symbols::UnaryMinus(), Token::kNEGATE, 1);
-}
-
-void BytecodeFlowGraphBuilder::BuildAddDouble() {
-  BuildDoubleOp(Symbols::Plus(), Token::kADD, 2);
-}
-
-void BytecodeFlowGraphBuilder::BuildSubDouble() {
-  BuildDoubleOp(Symbols::Minus(), Token::kSUB, 2);
-}
-
-void BytecodeFlowGraphBuilder::BuildMulDouble() {
-  BuildDoubleOp(Symbols::Star(), Token::kMUL, 2);
-}
-
-void BytecodeFlowGraphBuilder::BuildDivDouble() {
-  BuildDoubleOp(Symbols::Slash(), Token::kDIV, 2);
-}
-
-void BytecodeFlowGraphBuilder::BuildCompareDoubleEq() {
-  BuildDoubleOp(Symbols::EqualOperator(), Token::kEQ, 2);
-}
-
-void BytecodeFlowGraphBuilder::BuildCompareDoubleGt() {
-  BuildDoubleOp(Symbols::RAngleBracket(), Token::kGT, 2);
-}
-
-void BytecodeFlowGraphBuilder::BuildCompareDoubleLt() {
-  BuildDoubleOp(Symbols::LAngleBracket(), Token::kLT, 2);
-}
-
-void BytecodeFlowGraphBuilder::BuildCompareDoubleGe() {
-  BuildDoubleOp(Symbols::GreaterEqualOperator(), Token::kGTE, 2);
-}
-
-void BytecodeFlowGraphBuilder::BuildCompareDoubleLe() {
-  BuildDoubleOp(Symbols::LessEqualOperator(), Token::kLTE, 2);
-}
-
-void BytecodeFlowGraphBuilder::BuildAllocateClosure() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  }
-
-  const Function& target = Function::Cast(ConstantAt(DecodeOperandD()).value());
-  code_ += B->AllocateClosure(position_, target);
-}
-
-// Builds graph for a call to 'dart:ffi::_asFunctionInternal'. The stack must
-// look like:
-//
-// <receiver> => pointer argument
-// <type arguments vector> => signatures
-// ...
-void BytecodeFlowGraphBuilder::BuildFfiAsFunction() {
-  // The bytecode FGB doesn't eagerly insert PushArguments, so the type
-  // arguments won't be wrapped in a PushArgumentsInstr.
-  const TypeArguments& type_args =
-      TypeArguments::Cast(B->Peek(/*depth=*/1)->AsConstant()->value());
-  // Drop type arguments, preserving pointer.
-  code_ += B->DropTempsPreserveTop(1);
-  code_ += B->BuildFfiAsFunctionInternalCall(type_args);
-}
-
-// Builds graph for a call to 'dart:ffi::_nativeCallbackFunction'.
-// The call-site must look like this (guaranteed by the FE which inserts it):
-//
-//   _nativeCallbackFunction<NativeSignatureType>(target, exceptionalReturn)
-//
-// Therefore the stack shall look like:
-//
-// <exceptional return value> => ensured (by FE) to be a constant
-// <target> => closure, ensured (by FE) to be a (non-partially-instantiated)
-//             static tearoff
-// <type args> => [NativeSignatureType]
-void BytecodeFlowGraphBuilder::BuildFfiNativeCallbackFunction() {
-  const TypeArguments& type_args =
-      TypeArguments::Cast(B->Peek(/*depth=*/2)->AsConstant()->value());
-  ASSERT(type_args.IsInstantiated() && type_args.Length() == 1);
-  const Function& native_sig = Function::Handle(
-      Z, Type::CheckedHandle(Z, type_args.TypeAt(0)).signature());
-
-  const Closure& target_closure =
-      Closure::Cast(B->Peek(/*depth=*/1)->AsConstant()->value());
-  ASSERT(!target_closure.IsNull());
-  Function& target = Function::Handle(Z, target_closure.function());
-  ASSERT(!target.IsNull() && target.IsImplicitClosureFunction());
-  target = target.parent_function();
-
-  const Instance& exceptional_return =
-      Instance::Cast(B->Peek(/*depth=*/0)->AsConstant()->value());
-
-  const Function& result =
-      Function::ZoneHandle(Z, compiler::ffi::NativeCallbackFunction(
-                                  native_sig, target, exceptional_return));
-  code_ += B->Constant(result);
-  code_ += B->DropTempsPreserveTop(3);
-}
-
-void BytecodeFlowGraphBuilder::BuildDebugStepCheck() {
-#if !defined(PRODUCT)
-  if (build_debug_step_checks_) {
-    code_ += B->DebugStepCheck(position_);
-  }
-#endif  // !defined(PRODUCT)
-}
-
-intptr_t BytecodeFlowGraphBuilder::GetTryIndex(const PcDescriptors& descriptors,
-                                               intptr_t pc) {
-  const uword pc_offset =
-      KernelBytecode::BytecodePcToOffset(pc, /* is_return_address = */ true);
-  PcDescriptors::Iterator iter(descriptors, PcDescriptorsLayout::kAnyKind);
-  intptr_t try_index = kInvalidTryIndex;
-  while (iter.MoveNext()) {
-    const intptr_t current_try_index = iter.TryIndex();
-    const uword start_pc = iter.PcOffset();
-    if (pc_offset < start_pc) {
-      break;
-    }
-    const bool has_next = iter.MoveNext();
-    ASSERT(has_next);
-    const uword end_pc = iter.PcOffset();
-    if (start_pc <= pc_offset && pc_offset < end_pc) {
-      ASSERT(try_index < current_try_index);
-      try_index = current_try_index;
-    }
-  }
-  return try_index;
-}
-
-JoinEntryInstr* BytecodeFlowGraphBuilder::EnsureControlFlowJoin(
-    const PcDescriptors& descriptors,
-    intptr_t pc) {
-  ASSERT((0 <= pc) && (pc < bytecode_length_));
-  JoinEntryInstr* join = jump_targets_.Lookup(pc);
-  if (join == nullptr) {
-    join = B->BuildJoinEntry(GetTryIndex(descriptors, pc));
-    jump_targets_.Insert(pc, join);
-  }
-  return join;
-}
-
-bool BytecodeFlowGraphBuilder::RequiresScratchVar(const KBCInstr* instr) {
-  switch (KernelBytecode::DecodeOpcode(instr)) {
-    case KernelBytecode::kEntryOptional:
-      return KernelBytecode::DecodeC(instr) > 0;
-
-    case KernelBytecode::kEqualsNull:
-      return true;
-
-    case KernelBytecode::kNativeCall:
-    case KernelBytecode::kNativeCall_Wide:
-      return function().recognized_kind() == MethodRecognizer::kListFactory;
-
-    default:
-      return false;
-  }
-}
-
-void BytecodeFlowGraphBuilder::CollectControlFlow(
-    const PcDescriptors& descriptors,
-    const ExceptionHandlers& handlers,
-    GraphEntryInstr* graph_entry) {
-  bool seen_jump_if_unchecked = false;
-  for (intptr_t pc = 0; pc < bytecode_length_;) {
-    const KBCInstr* instr = &(raw_bytecode_[pc]);
-
-    if (KernelBytecode::IsJumpOpcode(instr)) {
-      const intptr_t target = pc + KernelBytecode::DecodeT(instr);
-      EnsureControlFlowJoin(descriptors, target);
-
-      if (KernelBytecode::IsJumpIfUncheckedOpcode(instr)) {
-        if (seen_jump_if_unchecked) {
-          FATAL1(
-              "Multiple JumpIfUnchecked bytecode instructions are not allowed: "
-              "%s.",
-              function().ToFullyQualifiedCString());
-        }
-        seen_jump_if_unchecked = true;
-        ASSERT(entry_point_style_ == UncheckedEntryPointStyle::kNone);
-        entry_point_style_ = ChooseEntryPointStyle(instr);
-        if (entry_point_style_ ==
-            UncheckedEntryPointStyle::kSharedWithVariable) {
-          parsed_function_->EnsureEntryPointsTemp();
-        }
-      }
-    } else if (KernelBytecode::IsCheckStackOpcode(instr) &&
-               (KernelBytecode::DecodeA(instr) != 0)) {
-      // (dartbug.com/36590) BlockEntryInstr::FindOsrEntryAndRelink assumes
-      // that CheckStackOverflow instruction is at the beginning of a join
-      // block.
-      EnsureControlFlowJoin(descriptors, pc);
-    }
-
-    if ((scratch_var_ == nullptr) && RequiresScratchVar(instr)) {
-      scratch_var_ = new (Z)
-          LocalVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
-                        Symbols::ExprTemp(), Object::dynamic_type());
-    }
-
-    pc += (KernelBytecode::Next(instr) - instr);
-  }
-
-  PcDescriptors::Iterator iter(descriptors, PcDescriptorsLayout::kAnyKind);
-  while (iter.MoveNext()) {
-    const intptr_t start_pc = KernelBytecode::OffsetToBytecodePc(
-        iter.PcOffset(), /* is_return_address = */ true);
-    EnsureControlFlowJoin(descriptors, start_pc);
-
-    const bool has_next = iter.MoveNext();
-    ASSERT(has_next);
-    const intptr_t end_pc = KernelBytecode::OffsetToBytecodePc(
-        iter.PcOffset(), /* is_return_address = */ true);
-    EnsureControlFlowJoin(descriptors, end_pc);
-  }
-
-  if (handlers.num_entries() > 0) {
-    B->InlineBailout("kernel::BytecodeFlowGraphBuilder::CollectControlFlow");
-
-    exception_var_ = new (Z)
-        LocalVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
-                      Symbols::ExceptionVar(), Object::dynamic_type());
-    stacktrace_var_ = new (Z)
-        LocalVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
-                      Symbols::StackTraceVar(), Object::dynamic_type());
-  }
-
-  for (intptr_t try_index = 0; try_index < handlers.num_entries();
-       ++try_index) {
-    ExceptionHandlerInfo handler_info;
-    handlers.GetHandlerInfo(try_index, &handler_info);
-
-    const intptr_t handler_pc = KernelBytecode::OffsetToBytecodePc(
-        handler_info.handler_pc_offset, /* is_return_address = */ false);
-    JoinEntryInstr* join = EnsureControlFlowJoin(descriptors, handler_pc);
-
-    // Make sure exception handler starts with SetFrame bytecode instruction.
-    ASSERT(KernelBytecode::IsSetFrameOpcode(&(raw_bytecode_[handler_pc])));
-
-    const Array& handler_types =
-        Array::ZoneHandle(Z, handlers.GetHandledTypes(try_index));
-
-    CatchBlockEntryInstr* entry = new (Z) CatchBlockEntryInstr(
-        handler_info.is_generated != 0, B->AllocateBlockId(),
-        handler_info.outer_try_index, graph_entry, handler_types, try_index,
-        handler_info.needs_stacktrace != 0, B->GetNextDeoptId(), nullptr,
-        nullptr, exception_var_, stacktrace_var_);
-    graph_entry->AddCatchEntry(entry);
-
-    code_ = Fragment(entry);
-    code_ += B->Goto(join);
-  }
-}
-
-UncheckedEntryPointStyle BytecodeFlowGraphBuilder::ChooseEntryPointStyle(
-    const KBCInstr* jump_if_unchecked) {
-  ASSERT(KernelBytecode::IsJumpIfUncheckedOpcode(jump_if_unchecked));
-
-  if (!function().MayHaveUncheckedEntryPoint()) {
-    return UncheckedEntryPointStyle::kNone;
-  }
-
-  // Separate entry points are used if bytecode has the following pattern:
-  //   Entry
-  //   CheckStack (optional)
-  //   DebugCheck (optional)
-  //   JumpIfUnchecked
-  //
-  const KBCInstr* instr = raw_bytecode_;
-  if (!KernelBytecode::IsEntryOpcode(instr)) {
-    return UncheckedEntryPointStyle::kSharedWithVariable;
-  }
-  instr = KernelBytecode::Next(instr);
-  if (KernelBytecode::IsCheckStackOpcode(instr)) {
-    instr = KernelBytecode::Next(instr);
-  }
-  if (KernelBytecode::IsDebugCheckOpcode(instr)) {
-    instr = KernelBytecode::Next(instr);
-  }
-  if (instr != jump_if_unchecked) {
-    return UncheckedEntryPointStyle::kSharedWithVariable;
-  }
-  return UncheckedEntryPointStyle::kSeparate;
-}
-
-void BytecodeFlowGraphBuilder::CreateParameterVariables() {
-  const Bytecode& bytecode = Bytecode::Handle(Z, function().bytecode());
-  object_pool_ = bytecode.object_pool();
-  bytecode_instr_ = reinterpret_cast<const KBCInstr*>(bytecode.PayloadStart());
-
-  scratch_var_ = parsed_function_->EnsureExpressionTemp();
-
-  if (KernelBytecode::IsEntryOptionalOpcode(bytecode_instr_)) {
-    AllocateParametersAndLocalsForEntryOptional();
-  } else if (KernelBytecode::IsEntryOpcode(bytecode_instr_)) {
-    AllocateLocalVariables(DecodeOperandD());
-    AllocateFixedParameters();
-  } else if (KernelBytecode::IsEntryFixedOpcode(bytecode_instr_)) {
-    AllocateLocalVariables(DecodeOperandE());
-    AllocateFixedParameters();
-  } else {
-    UNREACHABLE();
-  }
-
-  if (function().IsGeneric()) {
-    // For recognized methods we generate the IL by hand. Yet we need to find
-    // out which [LocalVariable] is holding the function type arguments. We
-    // scan the bytecode for the CheckFunctionTypeArgs bytecode.
-    //
-    // Note that we cannot add an extra local variable for the type argument
-    // in [AllocateLocalVariables]. We sometimes reuse the same ParsedFunction
-    // multiple times. For non-recognized generic bytecode functions
-    // ParsedFunction::RawTypeArgumentsVariable() is set during flow graph
-    // construction (after local variables are allocated). So the next time,
-    // if ParsedFunction is reused, we would allocate an extra local variable.
-    // TODO(alexmarkov): revise how function type args variable is allocated
-    // and avoid looking at CheckFunctionTypeArgs bytecode.
-    const KBCInstr* instr =
-        reinterpret_cast<const KBCInstr*>(bytecode.PayloadStart());
-    const KBCInstr* end = reinterpret_cast<const KBCInstr*>(
-        bytecode.PayloadStart() + bytecode.Size());
-
-    LocalVariable* type_args_var = nullptr;
-    while (instr < end) {
-      if (KernelBytecode::IsCheckFunctionTypeArgs(instr)) {
-        const intptr_t expected_num_type_args = KernelBytecode::DecodeA(instr);
-        if (expected_num_type_args > 0) {  // Exclude weird closure case.
-          type_args_var = LocalVariableAt(KernelBytecode::DecodeE(instr));
-          break;
-        }
-      }
-      instr = KernelBytecode::Next(instr);
-    }
-
-    // Every generic function *must* have a kCheckFunctionTypeArgs bytecode.
-    ASSERT(type_args_var != nullptr);
-
-    // Normally the flow graph building code of bytecode will, as a side-effect
-    // of building the flow graph, register the function type arguments variable
-    // in the [ParsedFunction] (see [BuildCheckFunctionTypeArgs]).
-    parsed_function_->set_function_type_arguments(type_args_var);
-    parsed_function_->SetRawTypeArgumentsVariable(type_args_var);
-  }
-}
-
-intptr_t BytecodeFlowGraphBuilder::UpdateScope(
-    BytecodeLocalVariablesIterator* iter,
-    intptr_t pc) {
-  // Leave scopes that have ended.
-  while ((current_scope_ != nullptr) && (current_scope_->end_pc_ <= pc)) {
-    for (LocalVariable* local : current_scope_->hidden_vars_) {
-      local_vars_[-local->index().value()] = local;
-    }
-    current_scope_ = current_scope_->parent_;
-  }
-
-  // Enter scopes that have started.
-  intptr_t next_pc = bytecode_length_;
-  while (!iter->IsDone()) {
-    if (iter->IsScope()) {
-      if (iter->StartPC() > pc) {
-        next_pc = iter->StartPC();
-        break;
-      }
-      if (iter->EndPC() > pc) {
-        // Push new scope and declare its variables.
-        current_scope_ = new (Z) BytecodeScope(
-            Z, iter->EndPC(), iter->ContextLevel(), current_scope_);
-        if (!seen_parameters_scope_) {
-          // Skip variables from the first scope as it may contain variables
-          // which were used in prologue (parameters, function type arguments).
-          // The already used variables should not be replaced with new ones.
-          seen_parameters_scope_ = true;
-          iter->MoveNext();
-          continue;
-        }
-        while (iter->MoveNext() && iter->IsVariableDeclaration()) {
-          const intptr_t index = iter->Index();
-          if (!iter->IsCaptured() && (index >= 0)) {
-            LocalVariable* local = new (Z) LocalVariable(
-                TokenPosition::kNoSource, TokenPosition::kNoSource,
-                String::ZoneHandle(Z, iter->Name()),
-                AbstractType::ZoneHandle(Z, iter->Type()));
-            local->set_index(VariableIndex(-index));
-            ASSERT(local_vars_[index]->index().value() == -index);
-            current_scope_->hidden_vars_.Add(local_vars_[index]);
-            local_vars_[index] = local;
-          }
-        }
-        continue;
-      }
-    }
-    iter->MoveNext();
-  }
-  if (current_scope_ != nullptr && next_pc > current_scope_->end_pc_) {
-    next_pc = current_scope_->end_pc_;
-  }
-  B->set_context_depth(
-      current_scope_ != nullptr ? current_scope_->context_level_ : 0);
-  return next_pc;
-}
-
-FlowGraph* BytecodeFlowGraphBuilder::BuildGraph() {
-  const Bytecode& bytecode = Bytecode::Handle(Z, function().bytecode());
-
-  object_pool_ = bytecode.object_pool();
-  raw_bytecode_ = reinterpret_cast<const KBCInstr*>(bytecode.PayloadStart());
-  bytecode_length_ = bytecode.Size() / sizeof(KBCInstr);
-
-  graph_entry_ = new (Z) GraphEntryInstr(*parsed_function_, B->osr_id_);
-
-  auto normal_entry = B->BuildFunctionEntry(graph_entry_);
-  graph_entry_->set_normal_entry(normal_entry);
-
-  const PcDescriptors& descriptors =
-      PcDescriptors::Handle(Z, bytecode.pc_descriptors());
-  const ExceptionHandlers& handlers =
-      ExceptionHandlers::Handle(Z, bytecode.exception_handlers());
-
-  CollectControlFlow(descriptors, handlers, graph_entry_);
-
-  inferred_types_attribute_ ^= BytecodeReader::GetBytecodeAttribute(
-      function(), Symbols::vm_inferred_type_metadata());
-
-  kernel::BytecodeSourcePositionsIterator source_pos_iter(Z, bytecode);
-  bool update_position = source_pos_iter.MoveNext();
-
-  kernel::BytecodeLocalVariablesIterator local_vars_iter(Z, bytecode);
-  intptr_t next_pc_to_update_scope =
-      local_vars_iter.MoveNext() ? 0 : bytecode_length_;
-
-  code_ = Fragment(normal_entry);
-
-  for (pc_ = 0; pc_ < bytecode_length_; pc_ = next_pc_) {
-    bytecode_instr_ = &(raw_bytecode_[pc_]);
-    next_pc_ = pc_ + (KernelBytecode::Next(bytecode_instr_) - bytecode_instr_);
-
-    JoinEntryInstr* join = jump_targets_.Lookup(pc_);
-    if (join != nullptr) {
-      Value* stack_state = stack_states_.Lookup(pc_);
-      if (code_.is_open()) {
-        if (stack_state != B->stack_) {
-          ASSERT(stack_state == nullptr);
-          stack_states_.Insert(pc_, B->stack_);
-        }
-        code_ += B->Goto(join);
-      } else {
-        ASSERT(IsStackEmpty());
-        B->stack_ = stack_state;
-      }
-      code_ = Fragment(join);
-      join->set_stack_depth(B->GetStackDepth());
-      B->SetCurrentTryIndex(join->try_index());
-    } else {
-      // Unreachable bytecode is not allowed.
-      ASSERT(!code_.is_closed());
-    }
-
-    while (update_position &&
-           static_cast<uword>(pc_) >= source_pos_iter.PcOffset()) {
-      position_ = source_pos_iter.TokenPos();
-      if (source_pos_iter.IsYieldPoint()) {
-        last_yield_point_pc_ = source_pos_iter.PcOffset();
-        ++last_yield_point_index_;
-      }
-      update_position = source_pos_iter.MoveNext();
-    }
-
-    if (pc_ >= next_pc_to_update_scope) {
-      next_pc_to_update_scope = UpdateScope(&local_vars_iter, pc_);
-    }
-
-    BuildInstruction(KernelBytecode::DecodeOpcode(bytecode_instr_));
-
-    if (code_.is_closed()) {
-      ASSERT(IsStackEmpty());
-    }
-  }
-
-  // When compiling for OSR, use a depth first search to find the OSR
-  // entry and make graph entry jump to it instead of normal entry.
-  // Catch entries are always considered reachable, even if they
-  // become unreachable after OSR.
-  if (B->IsCompiledForOsr()) {
-    graph_entry_->RelinkToOsrEntry(Z, B->last_used_block_id_ + 1);
-  }
-
-  FlowGraph* flow_graph = new (Z) FlowGraph(
-      *parsed_function_, graph_entry_, B->last_used_block_id_, prologue_info_);
-
-  if (FLAG_print_flow_graph_from_bytecode) {
-    FlowGraphPrinter::PrintGraph("Constructed from bytecode", flow_graph);
-  }
-
-  return flow_graph;
-}
-
-}  // namespace kernel
-}  // namespace dart
diff --git a/runtime/vm/compiler/frontend/bytecode_flow_graph_builder.h b/runtime/vm/compiler/frontend/bytecode_flow_graph_builder.h
deleted file mode 100644
index c98d743..0000000
--- a/runtime/vm/compiler/frontend/bytecode_flow_graph_builder.h
+++ /dev/null
@@ -1,252 +0,0 @@
-// Copyright (c) 2018, 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.
-
-#ifndef RUNTIME_VM_COMPILER_FRONTEND_BYTECODE_FLOW_GRAPH_BUILDER_H_
-#define RUNTIME_VM_COMPILER_FRONTEND_BYTECODE_FLOW_GRAPH_BUILDER_H_
-
-#if defined(DART_PRECOMPILED_RUNTIME)
-#error "AOT runtime should not use compiler sources (including header files)"
-#endif  // defined(DART_PRECOMPILED_RUNTIME)
-
-#include "vm/compiler/backend/il.h"
-#include "vm/compiler/frontend/base_flow_graph_builder.h"
-#include "vm/compiler/frontend/kernel_translation_helper.h"  // For InferredTypeMetadata
-#include "vm/constants_kbc.h"
-
-namespace dart {
-namespace kernel {
-
-class BytecodeLocalVariablesIterator;
-
-// This class builds flow graph from bytecode. It is used either to compile
-// from bytecode, or generate bytecode interpreter (the latter is not
-// fully implemented yet).
-// TODO(alexmarkov): extend this class and IL to generate an interpreter in
-// addition to compiling bytecode.
-class BytecodeFlowGraphBuilder {
- public:
-  BytecodeFlowGraphBuilder(BaseFlowGraphBuilder* flow_graph_builder,
-                           ParsedFunction* parsed_function,
-                           ZoneGrowableArray<const ICData*>* ic_data_array)
-      : flow_graph_builder_(flow_graph_builder),
-        zone_(flow_graph_builder->zone_),
-        is_generating_interpreter_(
-            false),  // TODO(alexmarkov): pass as argument
-        parsed_function_(parsed_function),
-        ic_data_array_(ic_data_array),
-        object_pool_(ObjectPool::Handle(zone_)),
-        bytecode_length_(0),
-        pc_(0),
-        position_(TokenPosition::kNoSource),
-        local_vars_(zone_, 0),
-        parameters_(zone_, 0),
-        exception_var_(nullptr),
-        stacktrace_var_(nullptr),
-        scratch_var_(nullptr),
-        prologue_info_(-1, -1),
-        throw_no_such_method_(nullptr),
-        inferred_types_attribute_(Array::Handle(zone_)) {}
-
-  FlowGraph* BuildGraph();
-
-  // Create parameter variables without building a flow graph.
-  void CreateParameterVariables();
-
- protected:
-  // Returns `true` if building a flow graph for a bytecode interpreter, or
-  // `false` if compiling a function from bytecode.
-  bool is_generating_interpreter() const { return is_generating_interpreter_; }
-
- private:
-  // Operand of bytecode instruction, either intptr_t value (if compiling
-  // bytecode) or Definition (if generating interpreter).
-  class Operand {
-   public:
-    explicit Operand(Definition* definition)
-        : definition_(definition), value_(0) {
-      ASSERT(definition != nullptr);
-    }
-
-    explicit Operand(intptr_t value) : definition_(nullptr), value_(value) {}
-
-    Definition* definition() const {
-      ASSERT(definition_ != nullptr);
-      return definition_;
-    }
-
-    intptr_t value() const {
-      ASSERT(definition_ == nullptr);
-      return value_;
-    }
-
-   private:
-    Definition* definition_;
-    intptr_t value_;
-  };
-
-  // Constant from a constant pool.
-  // It is either Object (if compiling bytecode) or Definition
-  // (if generating interpreter).
-  class Constant {
-   public:
-    explicit Constant(Definition* definition)
-        : definition_(definition), value_(Object::null_object()) {
-      ASSERT(definition != nullptr);
-    }
-
-    explicit Constant(Zone* zone, const Object& value)
-        : definition_(nullptr), value_(value) {}
-
-    Definition* definition() const {
-      ASSERT(definition_ != nullptr);
-      return definition_;
-    }
-
-    const Object& value() const {
-      ASSERT(definition_ == nullptr);
-      return value_;
-    }
-
-   private:
-    Definition* definition_;
-    const Object& value_;
-  };
-
-  // Scope declared in bytecode local variables information.
-  class BytecodeScope : public ZoneAllocated {
-   public:
-    BytecodeScope(Zone* zone,
-                  intptr_t end_pc,
-                  intptr_t context_level,
-                  BytecodeScope* parent)
-        : end_pc_(end_pc),
-          context_level_(context_level),
-          parent_(parent),
-          hidden_vars_(zone, 4) {}
-
-    const intptr_t end_pc_;
-    const intptr_t context_level_;
-    BytecodeScope* const parent_;
-    ZoneGrowableArray<LocalVariable*> hidden_vars_;
-  };
-
-  Operand DecodeOperandA();
-  Operand DecodeOperandB();
-  Operand DecodeOperandC();
-  Operand DecodeOperandD();
-  Operand DecodeOperandE();
-  Operand DecodeOperandF();
-  Operand DecodeOperandX();
-  Operand DecodeOperandY();
-  Operand DecodeOperandT();
-  Constant ConstantAt(Operand entry_index, intptr_t add_index = 0);
-  void PushConstant(Constant constant);
-  Constant PopConstant();
-  void LoadStackSlots(intptr_t num_slots);
-  void AllocateLocalVariables(Operand frame_size,
-                              intptr_t num_param_locals = 0);
-  LocalVariable* AllocateParameter(intptr_t param_index,
-                                   VariableIndex var_index);
-  void AllocateFixedParameters();
-
-  // Allocates parameters and local variables in case of EntryOptional.
-  // Returns pointer to the instruction after EntryOptional/LoadConstant/Frame
-  // bytecodes.
-  const KBCInstr* AllocateParametersAndLocalsForEntryOptional();
-
-  LocalVariable* LocalVariableAt(intptr_t local_index);
-  void StoreLocal(Operand local_index);
-  void LoadLocal(Operand local_index);
-  Value* Pop();
-  intptr_t GetStackDepth() const;
-  bool IsStackEmpty() const;
-  InferredTypeMetadata GetInferredType(intptr_t pc);
-  void PropagateStackState(intptr_t target_pc);
-  void DropUnusedValuesFromStack();
-  void BuildJumpIfStrictCompare(Token::Kind cmp_kind);
-  void BuildPrimitiveOp(const String& name,
-                        Token::Kind token_kind,
-                        const AbstractType& static_receiver_type,
-                        int num_args);
-  void BuildIntOp(const String& name, Token::Kind token_kind, int num_args);
-  void BuildDoubleOp(const String& name, Token::Kind token_kind, int num_args);
-  void BuildDirectCallCommon(bool is_unchecked_call);
-  void BuildInterfaceCallCommon(bool is_unchecked_call,
-                                bool is_instantiated_call);
-
-  void BuildInstruction(KernelBytecode::Opcode opcode);
-  void BuildFfiAsFunction();
-  void BuildFfiNativeCallbackFunction();
-  void BuildDebugStepCheck();
-
-#define DECLARE_BUILD_METHOD(name, encoding, kind, op1, op2, op3)              \
-  void Build##name();
-  KERNEL_BYTECODES_LIST(DECLARE_BUILD_METHOD)
-#undef DECLARE_BUILD_METHOD
-
-  intptr_t GetTryIndex(const PcDescriptors& descriptors, intptr_t pc);
-  JoinEntryInstr* EnsureControlFlowJoin(const PcDescriptors& descriptors,
-                                        intptr_t pc);
-  bool RequiresScratchVar(const KBCInstr* instr);
-  void CollectControlFlow(const PcDescriptors& descriptors,
-                          const ExceptionHandlers& handlers,
-                          GraphEntryInstr* graph_entry);
-
-  // Update current scope, context level and local variables for the given PC.
-  // Returns next PC where scope might need an update.
-  intptr_t UpdateScope(BytecodeLocalVariablesIterator* iter, intptr_t pc);
-
-  // Figure out entry points style.
-  UncheckedEntryPointStyle ChooseEntryPointStyle(
-      const KBCInstr* jump_if_unchecked);
-
-  Thread* thread() const { return flow_graph_builder_->thread_; }
-  Isolate* isolate() const { return thread()->isolate(); }
-
-  ParsedFunction* parsed_function() const {
-    ASSERT(!is_generating_interpreter());
-    return parsed_function_;
-  }
-  const Function& function() const { return parsed_function()->function(); }
-
-  BaseFlowGraphBuilder* flow_graph_builder_;
-  Zone* zone_;
-  bool is_generating_interpreter_;
-
-  // The following members are available only when compiling bytecode.
-
-  ParsedFunction* parsed_function_;
-  ZoneGrowableArray<const ICData*>* ic_data_array_;
-  ObjectPool& object_pool_;
-  const KBCInstr* raw_bytecode_ = nullptr;
-  intptr_t bytecode_length_;
-  intptr_t pc_;
-  intptr_t next_pc_ = -1;
-  const KBCInstr* bytecode_instr_ = nullptr;
-  TokenPosition position_;
-  intptr_t last_yield_point_pc_ = 0;
-  intptr_t last_yield_point_index_ = 0;
-  Fragment code_;
-  ZoneGrowableArray<LocalVariable*> local_vars_;
-  ZoneGrowableArray<LocalVariable*> parameters_;
-  LocalVariable* exception_var_;
-  LocalVariable* stacktrace_var_;
-  LocalVariable* scratch_var_;
-  IntMap<JoinEntryInstr*> jump_targets_;
-  IntMap<Value*> stack_states_;
-  PrologueInfo prologue_info_;
-  JoinEntryInstr* throw_no_such_method_;
-  GraphEntryInstr* graph_entry_ = nullptr;
-  UncheckedEntryPointStyle entry_point_style_ = UncheckedEntryPointStyle::kNone;
-  bool build_debug_step_checks_ = false;
-  bool seen_parameters_scope_ = false;
-  BytecodeScope* current_scope_ = nullptr;
-  Array& inferred_types_attribute_;
-  intptr_t inferred_types_index_ = 0;
-};
-
-}  // namespace kernel
-}  // namespace dart
-
-#endif  // RUNTIME_VM_COMPILER_FRONTEND_BYTECODE_FLOW_GRAPH_BUILDER_H_
diff --git a/runtime/vm/compiler/frontend/bytecode_reader.cc b/runtime/vm/compiler/frontend/bytecode_reader.cc
deleted file mode 100644
index f130a7a..0000000
--- a/runtime/vm/compiler/frontend/bytecode_reader.cc
+++ /dev/null
@@ -1,3754 +0,0 @@
-// Copyright (c) 2018, 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.
-
-#include "vm/compiler/frontend/bytecode_reader.h"
-
-#include "vm/bit_vector.h"
-#include "vm/bootstrap.h"
-#include "vm/class_finalizer.h"
-#include "vm/class_id.h"
-#include "vm/code_descriptors.h"
-#include "vm/compiler/aot/precompiler.h"  // For Obfuscator
-#include "vm/compiler/assembler/disassembler_kbc.h"
-#include "vm/compiler/frontend/bytecode_scope_builder.h"
-#include "vm/constants_kbc.h"
-#include "vm/dart_api_impl.h"  // For Api::IsFfiEnabled().
-#include "vm/dart_entry.h"
-#include "vm/debugger.h"
-#include "vm/flags.h"
-#include "vm/hash.h"
-#include "vm/longjump.h"
-#include "vm/object_store.h"
-#include "vm/reusable_handles.h"
-#include "vm/scopes.h"
-#include "vm/stack_frame_kbc.h"
-#include "vm/timeline.h"
-
-#define Z (zone_)
-#define H (translation_helper_)
-#define I (translation_helper_.isolate())
-
-namespace dart {
-
-DEFINE_FLAG(bool, dump_kernel_bytecode, false, "Dump kernel bytecode");
-
-namespace kernel {
-
-BytecodeMetadataHelper::BytecodeMetadataHelper(KernelReaderHelper* helper,
-                                               ActiveClass* active_class)
-    : MetadataHelper(helper, tag(), /* precompiler_only = */ false),
-      active_class_(active_class) {}
-
-void BytecodeMetadataHelper::ParseBytecodeFunction(
-    ParsedFunction* parsed_function) {
-  TIMELINE_DURATION(Thread::Current(), CompilerVerbose,
-                    "BytecodeMetadataHelper::ParseBytecodeFunction");
-
-  const Function& function = parsed_function->function();
-  ASSERT(function.is_declared_in_bytecode());
-
-  BytecodeComponentData bytecode_component(
-      &Array::Handle(helper_->zone_, GetBytecodeComponent()));
-  BytecodeReaderHelper bytecode_reader(&H, active_class_, &bytecode_component);
-
-  bytecode_reader.ParseBytecodeFunction(parsed_function, function);
-}
-
-bool BytecodeMetadataHelper::ReadLibraries() {
-  TIMELINE_DURATION(Thread::Current(), Compiler,
-                    "BytecodeMetadataHelper::ReadLibraries");
-  ASSERT(Thread::Current()->IsMutatorThread());
-
-  if (translation_helper_.GetBytecodeComponent() == Array::null()) {
-    return false;
-  }
-
-  BytecodeComponentData bytecode_component(
-      &Array::Handle(helper_->zone_, GetBytecodeComponent()));
-
-  BytecodeReaderHelper bytecode_reader(&H, active_class_, &bytecode_component);
-  AlternativeReadingScope alt(&bytecode_reader.reader(),
-                              bytecode_component.GetLibraryIndexOffset());
-  bytecode_reader.ReadLibraryDeclarations(bytecode_component.GetNumLibraries());
-  return true;
-}
-
-void BytecodeMetadataHelper::ReadLibrary(const Library& library) {
-  TIMELINE_DURATION(Thread::Current(), Compiler,
-                    "BytecodeMetadataHelper::ReadLibrary");
-  ASSERT(Thread::Current()->IsMutatorThread());
-  ASSERT(!library.Loaded());
-
-  if (translation_helper_.GetBytecodeComponent() == Array::null()) {
-    return;
-  }
-
-  BytecodeComponentData bytecode_component(
-      &Array::Handle(helper_->zone_, GetBytecodeComponent()));
-  BytecodeReaderHelper bytecode_reader(&H, active_class_, &bytecode_component);
-  AlternativeReadingScope alt(&bytecode_reader.reader(),
-                              bytecode_component.GetLibraryIndexOffset());
-  bytecode_reader.FindAndReadSpecificLibrary(
-      library, bytecode_component.GetNumLibraries());
-}
-
-bool BytecodeMetadataHelper::FindModifiedLibrariesForHotReload(
-    BitVector* modified_libs,
-    bool* is_empty_program,
-    intptr_t* p_num_classes,
-    intptr_t* p_num_procedures) {
-  ASSERT(Thread::Current()->IsMutatorThread());
-
-  if (translation_helper_.GetBytecodeComponent() == Array::null()) {
-    return false;
-  }
-
-  BytecodeComponentData bytecode_component(
-      &Array::Handle(helper_->zone_, GetBytecodeComponent()));
-  BytecodeReaderHelper bytecode_reader(&H, active_class_, &bytecode_component);
-  AlternativeReadingScope alt(&bytecode_reader.reader(),
-                              bytecode_component.GetLibraryIndexOffset());
-  bytecode_reader.FindModifiedLibrariesForHotReload(
-      modified_libs, bytecode_component.GetNumLibraries());
-
-  if (is_empty_program != nullptr) {
-    *is_empty_program = (bytecode_component.GetNumLibraries() == 0);
-  }
-  if (p_num_classes != nullptr) {
-    *p_num_classes = bytecode_component.GetNumClasses();
-  }
-  if (p_num_procedures != nullptr) {
-    *p_num_procedures = bytecode_component.GetNumCodes();
-  }
-  return true;
-}
-
-LibraryPtr BytecodeMetadataHelper::GetMainLibrary() {
-  const intptr_t md_offset = GetComponentMetadataPayloadOffset();
-  if (md_offset < 0) {
-    return Library::null();
-  }
-
-  BytecodeComponentData bytecode_component(
-      &Array::Handle(helper_->zone_, GetBytecodeComponent()));
-  const intptr_t main_offset = bytecode_component.GetMainOffset();
-  if (main_offset == 0) {
-    return Library::null();
-  }
-
-  BytecodeReaderHelper bytecode_reader(&H, active_class_, &bytecode_component);
-  AlternativeReadingScope alt(&bytecode_reader.reader(), main_offset);
-  return bytecode_reader.ReadMain();
-}
-
-ArrayPtr BytecodeMetadataHelper::GetBytecodeComponent() {
-  ArrayPtr array = translation_helper_.GetBytecodeComponent();
-  if (array == Array::null()) {
-    array = ReadBytecodeComponent();
-    ASSERT(array != Array::null());
-  }
-  return array;
-}
-
-ArrayPtr BytecodeMetadataHelper::ReadBytecodeComponent() {
-  const intptr_t md_offset = GetComponentMetadataPayloadOffset();
-  if (md_offset < 0) {
-    return Array::null();
-  }
-
-  BytecodeReaderHelper component_reader(&H, nullptr, nullptr);
-  return component_reader.ReadBytecodeComponent(md_offset);
-}
-
-BytecodeReaderHelper::BytecodeReaderHelper(
-    TranslationHelper* translation_helper,
-    ActiveClass* active_class,
-    BytecodeComponentData* bytecode_component)
-    : reader_(translation_helper->metadata_payloads()),
-      translation_helper_(*translation_helper),
-      active_class_(active_class),
-      thread_(translation_helper->thread()),
-      zone_(translation_helper->zone()),
-      bytecode_component_(bytecode_component),
-      scoped_function_(Function::Handle(translation_helper->zone())),
-      scoped_function_name_(String::Handle(translation_helper->zone())),
-      scoped_function_class_(Class::Handle(translation_helper->zone())) {}
-
-void BytecodeReaderHelper::ReadCode(const Function& function,
-                                    intptr_t code_offset) {
-  ASSERT(Thread::Current()->IsMutatorThread());
-  ASSERT(!function.IsImplicitGetterFunction() &&
-         !function.IsImplicitSetterFunction());
-  if (code_offset == 0) {
-    FATAL2("Function %s (kind %s) doesn't have bytecode",
-           function.ToFullyQualifiedCString(),
-           Function::KindToCString(function.kind()));
-  }
-
-  AlternativeReadingScope alt(&reader_, code_offset);
-  // This scope is needed to set active_class_->enclosing_ which is used to
-  // assign parent function for function types.
-  ActiveEnclosingFunctionScope active_enclosing_function(active_class_,
-                                                         &function);
-
-  const intptr_t flags = reader_.ReadUInt();
-  const bool has_exceptions_table =
-      (flags & Code::kHasExceptionsTableFlag) != 0;
-  const bool has_source_positions =
-      (flags & Code::kHasSourcePositionsFlag) != 0;
-  const bool has_local_variables = (flags & Code::kHasLocalVariablesFlag) != 0;
-  const bool has_nullable_fields = (flags & Code::kHasNullableFieldsFlag) != 0;
-  const bool has_closures = (flags & Code::kHasClosuresFlag) != 0;
-  const bool has_parameter_flags = (flags & Code::kHasParameterFlagsFlag) != 0;
-  const bool has_forwarding_stub_target =
-      (flags & Code::kHasForwardingStubTargetFlag) != 0;
-  const bool has_default_function_type_args =
-      (flags & Code::kHasDefaultFunctionTypeArgsFlag) != 0;
-
-  if (has_parameter_flags) {
-    intptr_t num_flags = reader_.ReadUInt();
-    for (intptr_t i = 0; i < num_flags; ++i) {
-      reader_.ReadUInt();
-    }
-  }
-  if (has_forwarding_stub_target) {
-    reader_.ReadUInt();
-  }
-  if (has_default_function_type_args) {
-    reader_.ReadUInt();
-  }
-
-  intptr_t num_closures = 0;
-  if (has_closures) {
-    num_closures = reader_.ReadListLength();
-    closures_ = &Array::Handle(Z, Array::New(num_closures));
-    for (intptr_t i = 0; i < num_closures; i++) {
-      ReadClosureDeclaration(function, i);
-    }
-  }
-
-  // Create object pool and read pool entries.
-  const intptr_t obj_count = reader_.ReadListLength();
-  const ObjectPool& pool = ObjectPool::Handle(Z, ObjectPool::New(obj_count));
-  ReadConstantPool(function, pool, 0);
-
-  // Read bytecode and attach to function.
-  const Bytecode& bytecode = Bytecode::Handle(Z, ReadBytecode(pool));
-  function.AttachBytecode(bytecode);
-  ASSERT(bytecode.GetBinary(Z) == reader_.typed_data()->raw());
-
-  ReadExceptionsTable(bytecode, has_exceptions_table);
-
-  ReadSourcePositions(bytecode, has_source_positions);
-
-  ReadLocalVariables(bytecode, has_local_variables);
-
-  if (FLAG_dump_kernel_bytecode) {
-    KernelBytecodeDisassembler::Disassemble(function);
-  }
-
-  // Initialization of fields with null literal is elided from bytecode.
-  // Record the corresponding stores if field guards are enabled.
-  if (has_nullable_fields) {
-    ASSERT(function.IsGenerativeConstructor());
-    const intptr_t num_fields = reader_.ReadListLength();
-    if (I->use_field_guards()) {
-      Field& field = Field::Handle(Z);
-      for (intptr_t i = 0; i < num_fields; i++) {
-        field ^= ReadObject();
-        field.RecordStore(Object::null_object());
-      }
-    } else {
-      for (intptr_t i = 0; i < num_fields; i++) {
-        ReadObject();
-      }
-    }
-  }
-
-  // Read closures.
-  if (has_closures) {
-    Function& closure = Function::Handle(Z);
-    Bytecode& closure_bytecode = Bytecode::Handle(Z);
-    for (intptr_t i = 0; i < num_closures; i++) {
-      closure ^= closures_->At(i);
-
-      const intptr_t flags = reader_.ReadUInt();
-      const bool has_exceptions_table =
-          (flags & ClosureCode::kHasExceptionsTableFlag) != 0;
-      const bool has_source_positions =
-          (flags & ClosureCode::kHasSourcePositionsFlag) != 0;
-      const bool has_local_variables =
-          (flags & ClosureCode::kHasLocalVariablesFlag) != 0;
-
-      // Read closure bytecode and attach to closure function.
-      closure_bytecode = ReadBytecode(pool);
-      closure.AttachBytecode(closure_bytecode);
-      ASSERT(bytecode.GetBinary(Z) == reader_.typed_data()->raw());
-
-      ReadExceptionsTable(closure_bytecode, has_exceptions_table);
-
-      ReadSourcePositions(closure_bytecode, has_source_positions);
-
-      ReadLocalVariables(closure_bytecode, has_local_variables);
-
-      if (FLAG_dump_kernel_bytecode) {
-        KernelBytecodeDisassembler::Disassemble(closure);
-      }
-
-#if !defined(PRODUCT)
-      thread_->isolate()->debugger()->NotifyBytecodeLoaded(closure);
-#endif
-    }
-  }
-
-#if !defined(PRODUCT)
-  thread_->isolate()->debugger()->NotifyBytecodeLoaded(function);
-#endif
-}
-
-static intptr_t IndexFor(Zone* zone,
-                         const Function& function,
-                         const String& name) {
-  const Bytecode& bc = Bytecode::Handle(zone, function.bytecode());
-  const ObjectPool& pool = ObjectPool::Handle(zone, bc.object_pool());
-  const KBCInstr* pc = reinterpret_cast<const KBCInstr*>(bc.PayloadStart());
-
-  ASSERT(KernelBytecode::IsEntryOptionalOpcode(pc));
-  ASSERT(KernelBytecode::DecodeB(pc) ==
-         function.NumOptionalPositionalParameters());
-  ASSERT(KernelBytecode::DecodeC(pc) == function.NumOptionalNamedParameters());
-  pc = KernelBytecode::Next(pc);
-
-  const intptr_t num_opt_params = function.NumOptionalParameters();
-  const intptr_t num_fixed_params = function.num_fixed_parameters();
-  for (intptr_t i = 0; i < num_opt_params; i++) {
-    const KBCInstr* load_name = pc;
-    const KBCInstr* load_value = KernelBytecode::Next(load_name);
-    pc = KernelBytecode::Next(load_value);
-    ASSERT(KernelBytecode::IsLoadConstantOpcode(load_name));
-    ASSERT(KernelBytecode::IsLoadConstantOpcode(load_value));
-    if (pool.ObjectAt(KernelBytecode::DecodeE(load_name)) == name.raw()) {
-      return num_fixed_params + i;
-    }
-  }
-
-  UNREACHABLE();
-  return -1;
-}
-
-ArrayPtr BytecodeReaderHelper::CreateForwarderChecks(const Function& function) {
-  ASSERT(function.kind() != FunctionLayout::kDynamicInvocationForwarder);
-  ASSERT(function.is_declared_in_bytecode());
-
-  TypeArguments& default_args = TypeArguments::Handle(Z);
-  if (function.bytecode_offset() != 0) {
-    AlternativeReadingScope alt(&reader_, function.bytecode_offset());
-
-    const intptr_t flags = reader_.ReadUInt();
-    const bool has_parameter_flags =
-        (flags & Code::kHasParameterFlagsFlag) != 0;
-    const bool has_forwarding_stub_target =
-        (flags & Code::kHasForwardingStubTargetFlag) != 0;
-    const bool has_default_function_type_args =
-        (flags & Code::kHasDefaultFunctionTypeArgsFlag) != 0;
-
-    if (has_parameter_flags) {
-      intptr_t num_flags = reader_.ReadUInt();
-      for (intptr_t i = 0; i < num_flags; ++i) {
-        reader_.ReadUInt();
-      }
-    }
-    if (has_forwarding_stub_target) {
-      reader_.ReadUInt();
-    }
-
-    if (has_default_function_type_args) {
-      const intptr_t index = reader_.ReadUInt();
-      const Bytecode& code = Bytecode::Handle(Z, function.bytecode());
-      const ObjectPool& pool = ObjectPool::Handle(Z, code.object_pool());
-      default_args ^= pool.ObjectAt(index);
-    }
-  }
-
-  auto& name = String::Handle(Z);
-  auto& check = ParameterTypeCheck::Handle(Z);
-  auto& checks = GrowableObjectArray::Handle(Z, GrowableObjectArray::New());
-
-  checks.Add(function);
-  checks.Add(default_args);
-
-  const auto& type_params =
-      TypeArguments::Handle(Z, function.type_parameters());
-  if (!type_params.IsNull()) {
-    auto& type_param = TypeParameter::Handle(Z);
-    auto& bound = AbstractType::Handle(Z);
-    for (intptr_t i = 0, n = type_params.Length(); i < n; ++i) {
-      type_param ^= type_params.TypeAt(i);
-      bound = type_param.bound();
-      if (!bound.IsTopTypeForSubtyping() &&
-          !type_param.IsGenericCovariantImpl()) {
-        name = type_param.name();
-        ASSERT(type_param.IsFinalized());
-        check = ParameterTypeCheck::New();
-        check.set_param(type_param);
-        check.set_type_or_bound(bound);
-        check.set_name(name);
-        checks.Add(check);
-      }
-    }
-  }
-
-  const intptr_t num_params = function.NumParameters();
-  const intptr_t num_pos_params = function.HasOptionalNamedParameters()
-                                      ? function.num_fixed_parameters()
-                                      : num_params;
-
-  BitVector is_covariant(Z, num_params);
-  BitVector is_generic_covariant_impl(Z, num_params);
-  ReadParameterCovariance(function, &is_covariant, &is_generic_covariant_impl);
-
-  auto& type = AbstractType::Handle(Z);
-  auto& cache = SubtypeTestCache::Handle(Z);
-  const bool has_optional_parameters = function.HasOptionalParameters();
-  for (intptr_t i = function.NumImplicitParameters(); i < num_params; ++i) {
-    type = function.ParameterTypeAt(i);
-    if (!type.IsTopTypeForSubtyping() &&
-        !is_generic_covariant_impl.Contains(i) && !is_covariant.Contains(i)) {
-      name = function.ParameterNameAt(i);
-      intptr_t index;
-      if (i >= num_pos_params) {
-        // Named parameter.
-        index = IndexFor(Z, function, name);
-      } else if (has_optional_parameters) {
-        // Fixed or optional parameter.
-        index = i;
-      } else {
-        // Fixed parameter.
-        index = -kKBCParamEndSlotFromFp - num_params + i;
-      }
-      check = ParameterTypeCheck::New();
-      check.set_index(index);
-      check.set_type_or_bound(type);
-      check.set_name(name);
-      cache = SubtypeTestCache::New();
-      check.set_cache(cache);
-      checks.Add(check);
-    }
-  }
-
-  return Array::MakeFixedLength(checks);
-}
-
-void BytecodeReaderHelper::ReadClosureDeclaration(const Function& function,
-                                                  intptr_t closureIndex) {
-  // Closure flags, must be in sync with ClosureDeclaration constants in
-  // pkg/vm/lib/bytecode/declarations.dart.
-  const int kHasOptionalPositionalParamsFlag = 1 << 0;
-  const int kHasOptionalNamedParamsFlag = 1 << 1;
-  const int kHasTypeParamsFlag = 1 << 2;
-  const int kHasSourcePositionsFlag = 1 << 3;
-  const int kIsAsyncFlag = 1 << 4;
-  const int kIsAsyncStarFlag = 1 << 5;
-  const int kIsSyncStarFlag = 1 << 6;
-  const int kIsDebuggableFlag = 1 << 7;
-  const int kHasAttributesFlag = 1 << 8;
-  const int kHasParameterFlagsFlag = 1 << 9;
-
-  const intptr_t flags = reader_.ReadUInt();
-
-  Object& parent = Object::Handle(Z, ReadObject());
-  if (!parent.IsFunction()) {
-    ASSERT(parent.IsField());
-    ASSERT(function.kind() == FunctionLayout::kFieldInitializer);
-    // Closure in a static field initializer, so use current function as parent.
-    parent = function.raw();
-  }
-
-  String& name = String::CheckedHandle(Z, ReadObject());
-  ASSERT(name.IsSymbol());
-
-  TokenPosition position = TokenPosition::kNoSource;
-  TokenPosition end_position = TokenPosition::kNoSource;
-  if ((flags & kHasSourcePositionsFlag) != 0) {
-    position = reader_.ReadPosition();
-    end_position = reader_.ReadPosition();
-  }
-
-  const Function& closure = Function::Handle(
-      Z, Function::NewClosureFunction(name, Function::Cast(parent), position));
-
-  closure.set_is_declared_in_bytecode(true);
-  closure.set_end_token_pos(end_position);
-
-  if ((flags & kIsSyncStarFlag) != 0) {
-    closure.set_modifier(FunctionLayout::kSyncGen);
-  } else if ((flags & kIsAsyncFlag) != 0) {
-    closure.set_modifier(FunctionLayout::kAsync);
-    closure.set_is_inlinable(!FLAG_causal_async_stacks &&
-                             !FLAG_lazy_async_stacks);
-  } else if ((flags & kIsAsyncStarFlag) != 0) {
-    closure.set_modifier(FunctionLayout::kAsyncGen);
-    closure.set_is_inlinable(!FLAG_causal_async_stacks &&
-                             !FLAG_lazy_async_stacks);
-  }
-  if (Function::Cast(parent).IsAsyncOrGenerator()) {
-    closure.set_is_generated_body(true);
-  }
-  closure.set_is_debuggable((flags & kIsDebuggableFlag) != 0);
-
-  closures_->SetAt(closureIndex, closure);
-
-  Type& signature_type = Type::Handle(
-      Z, ReadFunctionSignature(
-             closure, (flags & kHasOptionalPositionalParamsFlag) != 0,
-             (flags & kHasOptionalNamedParamsFlag) != 0,
-             (flags & kHasTypeParamsFlag) != 0,
-             /* has_positional_param_names = */ true,
-             (flags & kHasParameterFlagsFlag) != 0, Nullability::kNonNullable));
-
-  closure.SetSignatureType(signature_type);
-
-  if ((flags & kHasAttributesFlag) != 0) {
-    ReadAttributes(closure);
-  }
-
-  I->AddClosureFunction(closure);
-}
-
-static bool IsNonCanonical(const AbstractType& type) {
-  return type.IsTypeRef() || (type.IsType() && !type.IsCanonical());
-}
-
-static bool HasNonCanonicalTypes(Zone* zone, const Function& func) {
-  auto& type = AbstractType::Handle(zone);
-  for (intptr_t i = 0; i < func.NumParameters(); ++i) {
-    type = func.ParameterTypeAt(i);
-    if (IsNonCanonical(type)) {
-      return true;
-    }
-  }
-  type = func.result_type();
-  if (IsNonCanonical(type)) {
-    return true;
-  }
-  const auto& type_params = TypeArguments::Handle(zone, func.type_parameters());
-  if (!type_params.IsNull()) {
-    for (intptr_t i = 0; i < type_params.Length(); ++i) {
-      type = type_params.TypeAt(i);
-      type = TypeParameter::Cast(type).bound();
-      if (IsNonCanonical(type)) {
-        return true;
-      }
-    }
-  }
-  return false;
-}
-
-TypePtr BytecodeReaderHelper::ReadFunctionSignature(
-    const Function& func,
-    bool has_optional_positional_params,
-    bool has_optional_named_params,
-    bool has_type_params,
-    bool has_positional_param_names,
-    bool has_parameter_flags,
-    Nullability nullability) {
-  FunctionTypeScope function_type_scope(this);
-
-  if (has_type_params) {
-    ReadTypeParametersDeclaration(Class::Handle(Z), func);
-  }
-
-  const intptr_t kImplicitClosureParam = 1;
-  const intptr_t num_params = kImplicitClosureParam + reader_.ReadUInt();
-
-  intptr_t num_required_params = num_params;
-  if (has_optional_positional_params || has_optional_named_params) {
-    num_required_params = kImplicitClosureParam + reader_.ReadUInt();
-  }
-
-  func.set_num_fixed_parameters(num_required_params);
-  func.SetNumOptionalParameters(num_params - num_required_params,
-                                !has_optional_named_params);
-  func.set_parameter_types(
-      Array::Handle(Z, Array::New(num_params, Heap::kOld)));
-  func.CreateNameArrayIncludingFlags(Heap::kOld);
-
-  intptr_t i = 0;
-  func.SetParameterTypeAt(i, AbstractType::dynamic_type());
-  func.SetParameterNameAt(i, Symbols::ClosureParameter());
-  ++i;
-
-  AbstractType& type = AbstractType::Handle(Z);
-  String& name = String::Handle(Z);
-  for (; i < num_params; ++i) {
-    if (has_positional_param_names ||
-        (has_optional_named_params && (i >= num_required_params))) {
-      name ^= ReadObject();
-    } else {
-      name = Symbols::NotNamed().raw();
-    }
-    func.SetParameterNameAt(i, name);
-    type ^= ReadObject();
-    func.SetParameterTypeAt(i, type);
-  }
-  if (has_parameter_flags) {
-    intptr_t num_flags = reader_.ReadUInt();
-    for (intptr_t i = 0; i < num_flags; ++i) {
-      intptr_t flag = reader_.ReadUInt();
-      if ((flag & Parameter::kIsRequiredFlag) != 0) {
-        RELEASE_ASSERT(kImplicitClosureParam + i >= num_required_params);
-        func.SetIsRequiredAt(kImplicitClosureParam + i);
-      }
-    }
-  }
-  func.TruncateUnusedParameterFlags();
-
-  type ^= ReadObject();
-  func.set_result_type(type);
-
-  // Finalize function type.
-  type = func.SignatureType(nullability);
-  ClassFinalizer::FinalizationKind finalization = ClassFinalizer::kCanonicalize;
-  if (pending_recursive_types_ != nullptr && HasNonCanonicalTypes(Z, func)) {
-    // This function type is a part of recursive type. Avoid canonicalization
-    // as not all TypeRef objects are filled up at this point.
-    finalization = ClassFinalizer::kFinalize;
-  }
-  type =
-      ClassFinalizer::FinalizeType(*(active_class_->klass), type, finalization);
-  return Type::Cast(type).raw();
-}
-
-void BytecodeReaderHelper::ReadTypeParametersDeclaration(
-    const Class& parameterized_class,
-    const Function& parameterized_function) {
-  ASSERT(parameterized_class.IsNull() != parameterized_function.IsNull());
-
-  const intptr_t num_type_params = reader_.ReadUInt();
-  ASSERT(num_type_params > 0);
-
-  intptr_t offset;
-  NNBDMode nnbd_mode;
-  if (!parameterized_class.IsNull()) {
-    offset = parameterized_class.NumTypeArguments() - num_type_params;
-    nnbd_mode = parameterized_class.nnbd_mode();
-  } else {
-    offset = parameterized_function.NumParentTypeParameters();
-    nnbd_mode = parameterized_function.nnbd_mode();
-  }
-  const Nullability nullability = (nnbd_mode == NNBDMode::kOptedInLib)
-                                      ? Nullability::kNonNullable
-                                      : Nullability::kLegacy;
-
-  // First setup the type parameters, so if any of the following code uses it
-  // (in a recursive way) we're fine.
-  //
-  // Step a) Create array of [TypeParameter] objects (without bound).
-  const TypeArguments& type_parameters =
-      TypeArguments::Handle(Z, TypeArguments::New(num_type_params));
-  String& name = String::Handle(Z);
-  TypeParameter& parameter = TypeParameter::Handle(Z);
-  AbstractType& bound = AbstractType::Handle(Z);
-  for (intptr_t i = 0; i < num_type_params; ++i) {
-    name ^= ReadObject();
-    ASSERT(name.IsSymbol());
-    parameter = TypeParameter::New(parameterized_class, parameterized_function,
-                                   i, name, bound,
-                                   /* is_generic_covariant_impl = */ false,
-                                   nullability, TokenPosition::kNoSource);
-    parameter.set_index(offset + i);
-    parameter.SetIsFinalized();
-    parameter.SetCanonical();
-    parameter.SetDeclaration(true);
-    type_parameters.SetTypeAt(i, parameter);
-  }
-
-  if (!parameterized_class.IsNull()) {
-    parameterized_class.set_type_parameters(type_parameters);
-  } else if (!parameterized_function.IsFactory()) {
-    // Do not set type parameters for factories, as VM uses class type
-    // parameters instead.
-    parameterized_function.set_type_parameters(type_parameters);
-    if (parameterized_function.IsSignatureFunction()) {
-      if (function_type_type_parameters_ == nullptr) {
-        function_type_type_parameters_ = &type_parameters;
-      } else {
-        function_type_type_parameters_ = &TypeArguments::Handle(
-            Z, function_type_type_parameters_->ConcatenateTypeParameters(
-                   Z, type_parameters));
-      }
-    } else {
-      ASSERT(function_type_type_parameters_ == nullptr);
-    }
-  }
-
-  // Step b) Fill in the bounds of all [TypeParameter]s.
-  for (intptr_t i = 0; i < num_type_params; ++i) {
-    parameter ^= type_parameters.TypeAt(i);
-    bound ^= ReadObject();
-    // Convert dynamic to Object? or Object* in bounds of type parameters so
-    // they are equivalent when doing subtype checks for function types.
-    // TODO(https://github.com/dart-lang/language/issues/495): revise this
-    // when function subtyping is fixed.
-    if (bound.IsDynamicType()) {
-      bound = nnbd_mode == NNBDMode::kOptedInLib
-                  ? I->object_store()->nullable_object_type()
-                  : I->object_store()->legacy_object_type();
-    }
-    parameter.set_bound(bound);
-  }
-
-  // Fix bounds in all derived type parameters (with different nullabilities).
-  if (active_class_->derived_type_parameters != nullptr) {
-    auto& derived = TypeParameter::Handle(Z);
-    auto& bound = AbstractType::Handle(Z);
-    for (intptr_t i = 0, n = active_class_->derived_type_parameters->Length();
-         i < n; ++i) {
-      derived ^= active_class_->derived_type_parameters->At(i);
-      if (derived.bound() == AbstractType::null() &&
-          ((!parameterized_class.IsNull() &&
-            derived.parameterized_class() == parameterized_class.raw()) ||
-           (!parameterized_function.IsNull() &&
-            derived.parameterized_function() ==
-                parameterized_function.raw()))) {
-        ASSERT(derived.IsFinalized());
-        parameter ^= type_parameters.TypeAt(derived.index() - offset);
-        bound = parameter.bound();
-        derived.set_bound(bound);
-      }
-    }
-  }
-}
-
-intptr_t BytecodeReaderHelper::ReadConstantPool(const Function& function,
-                                                const ObjectPool& pool,
-                                                intptr_t start_index) {
-  TIMELINE_DURATION(Thread::Current(), CompilerVerbose,
-                    "BytecodeReaderHelper::ReadConstantPool");
-
-  // These enums and the code below reading the constant pool from kernel must
-  // be kept in sync with pkg/vm/lib/bytecode/constant_pool.dart.
-  enum ConstantPoolTag {
-    kInvalid,
-    kUnused1,
-    kUnused2,
-    kUnused3,
-    kUnused4,
-    kUnused5,
-    kUnused6,
-    kUnused6a,
-    kUnused7,
-    kStaticField,
-    kInstanceField,
-    kClass,
-    kTypeArgumentsField,
-    kUnused8,
-    kType,
-    kUnused9,
-    kUnused10,
-    kUnused11,
-    kUnused12,
-    kClosureFunction,
-    kEndClosureFunctionScope,
-    kNativeEntry,
-    kSubtypeTestCache,
-    kUnused13,
-    kEmptyTypeArguments,
-    kUnused14,
-    kUnused15,
-    kObjectRef,
-    kDirectCall,
-    kInterfaceCall,
-    kInstantiatedInterfaceCall,
-    kDynamicCall,
-    kDirectCallViaDynamicForwarder,
-  };
-
-  Object& obj = Object::Handle(Z);
-  Object& elem = Object::Handle(Z);
-  Field& field = Field::Handle(Z);
-  Class& cls = Class::Handle(Z);
-  String& name = String::Handle(Z);
-  const intptr_t obj_count = pool.Length();
-  for (intptr_t i = start_index; i < obj_count; ++i) {
-    const intptr_t tag = reader_.ReadTag();
-    switch (tag) {
-      case ConstantPoolTag::kInvalid:
-        UNREACHABLE();
-      case ConstantPoolTag::kStaticField:
-        obj = ReadObject();
-        ASSERT(obj.IsField());
-        break;
-      case ConstantPoolTag::kInstanceField:
-        field ^= ReadObject();
-        // InstanceField constant occupies 2 entries.
-        // The first entry is used for field offset.
-        obj = Smi::New(field.HostOffset() / kWordSize);
-        pool.SetTypeAt(i, ObjectPool::EntryType::kTaggedObject,
-                       ObjectPool::Patchability::kNotPatchable);
-        pool.SetObjectAt(i, obj);
-        ++i;
-        ASSERT(i < obj_count);
-        // The second entry is used for field object.
-        obj = field.raw();
-        break;
-      case ConstantPoolTag::kClass:
-        obj = ReadObject();
-        ASSERT(obj.IsClass());
-        break;
-      case ConstantPoolTag::kTypeArgumentsField:
-        cls ^= ReadObject();
-        obj = Smi::New(cls.host_type_arguments_field_offset() / kWordSize);
-        break;
-      case ConstantPoolTag::kType:
-        obj = ReadObject();
-        ASSERT(obj.IsAbstractType());
-        break;
-      case ConstantPoolTag::kClosureFunction: {
-        intptr_t closure_index = reader_.ReadUInt();
-        obj = closures_->At(closure_index);
-        ASSERT(obj.IsFunction());
-        // Set current entry.
-        pool.SetTypeAt(i, ObjectPool::EntryType::kTaggedObject,
-                       ObjectPool::Patchability::kNotPatchable);
-        pool.SetObjectAt(i, obj);
-
-        // This scope is needed to set active_class_->enclosing_ which is used
-        // to assign parent function for function types.
-        ActiveEnclosingFunctionScope active_enclosing_function(
-            active_class_, &Function::Cast(obj));
-
-        // Read constant pool until corresponding EndClosureFunctionScope.
-        i = ReadConstantPool(function, pool, i + 1);
-
-        // Proceed with the rest of entries.
-        continue;
-      }
-      case ConstantPoolTag::kEndClosureFunctionScope: {
-        // EndClosureFunctionScope entry is not used and set to null.
-        obj = Object::null();
-        pool.SetTypeAt(i, ObjectPool::EntryType::kTaggedObject,
-                       ObjectPool::Patchability::kNotPatchable);
-        pool.SetObjectAt(i, obj);
-        return i;
-      }
-      case ConstantPoolTag::kNativeEntry: {
-        name = ReadString();
-        obj = NativeEntry(function, name);
-        pool.SetTypeAt(i, ObjectPool::EntryType::kNativeEntryData,
-                       ObjectPool::Patchability::kNotPatchable);
-        pool.SetObjectAt(i, obj);
-        continue;
-      }
-      case ConstantPoolTag::kSubtypeTestCache: {
-        obj = SubtypeTestCache::New();
-      } break;
-      case ConstantPoolTag::kEmptyTypeArguments:
-        obj = Object::empty_type_arguments().raw();
-        break;
-      case ConstantPoolTag::kObjectRef:
-        obj = ReadObject();
-        break;
-      case ConstantPoolTag::kDirectCall: {
-        // DirectCall constant occupies 2 entries.
-        // The first entry is used for target function.
-        obj = ReadObject();
-        ASSERT(obj.IsFunction());
-        pool.SetTypeAt(i, ObjectPool::EntryType::kTaggedObject,
-                       ObjectPool::Patchability::kNotPatchable);
-        pool.SetObjectAt(i, obj);
-        ++i;
-        ASSERT(i < obj_count);
-        // The second entry is used for arguments descriptor.
-        obj = ReadObject();
-      } break;
-      case ConstantPoolTag::kInterfaceCall: {
-        elem = ReadObject();
-        ASSERT(elem.IsFunction());
-        // InterfaceCall constant occupies 2 entries.
-        // The first entry is used for interface target.
-        pool.SetTypeAt(i, ObjectPool::EntryType::kTaggedObject,
-                       ObjectPool::Patchability::kNotPatchable);
-        pool.SetObjectAt(i, elem);
-        ++i;
-        ASSERT(i < obj_count);
-        // The second entry is used for arguments descriptor.
-        obj = ReadObject();
-      } break;
-      case ConstantPoolTag::kInstantiatedInterfaceCall: {
-        elem = ReadObject();
-        ASSERT(elem.IsFunction());
-        // InstantiatedInterfaceCall constant occupies 3 entries:
-        // 1) Interface target.
-        pool.SetTypeAt(i, ObjectPool::EntryType::kTaggedObject,
-                       ObjectPool::Patchability::kNotPatchable);
-        pool.SetObjectAt(i, elem);
-        ++i;
-        ASSERT(i < obj_count);
-        // 2) Arguments descriptor.
-        obj = ReadObject();
-        pool.SetTypeAt(i, ObjectPool::EntryType::kTaggedObject,
-                       ObjectPool::Patchability::kNotPatchable);
-        pool.SetObjectAt(i, obj);
-        ++i;
-        ASSERT(i < obj_count);
-        // 3) Static receiver type.
-        obj = ReadObject();
-      } break;
-      case ConstantPoolTag::kDynamicCall: {
-        name ^= ReadObject();
-        ASSERT(name.IsSymbol());
-        // Do not mangle ==:
-        //   * operator == takes an Object so it is either not checked or
-        //     checked at the entry because the parameter is marked covariant,
-        //     neither of those cases require a dynamic invocation forwarder
-        if (!Field::IsGetterName(name) &&
-            (name.raw() != Symbols::EqualOperator().raw())) {
-          name = Function::CreateDynamicInvocationForwarderName(name);
-        }
-        // DynamicCall constant occupies 2 entries: selector and arguments
-        // descriptor.
-        pool.SetTypeAt(i, ObjectPool::EntryType::kTaggedObject,
-                       ObjectPool::Patchability::kNotPatchable);
-        pool.SetObjectAt(i, name);
-        ++i;
-        ASSERT(i < obj_count);
-        // The second entry is used for arguments descriptor.
-        obj = ReadObject();
-      } break;
-      case ConstantPoolTag::kDirectCallViaDynamicForwarder: {
-        // DirectCallViaDynamicForwarder constant occupies 2 entries.
-        // The first entry is used for target function.
-        obj = ReadObject();
-        ASSERT(obj.IsFunction());
-        name = Function::Cast(obj).name();
-        name = Function::CreateDynamicInvocationForwarderName(name);
-        obj = Function::Cast(obj).GetDynamicInvocationForwarder(name);
-
-        pool.SetTypeAt(i, ObjectPool::EntryType::kTaggedObject,
-                       ObjectPool::Patchability::kNotPatchable);
-        pool.SetObjectAt(i, obj);
-        ++i;
-        ASSERT(i < obj_count);
-        // The second entry is used for arguments descriptor.
-        obj = ReadObject();
-      } break;
-      default:
-        UNREACHABLE();
-    }
-    pool.SetTypeAt(i, ObjectPool::EntryType::kTaggedObject,
-                   ObjectPool::Patchability::kNotPatchable);
-    pool.SetObjectAt(i, obj);
-  }
-
-  return obj_count - 1;
-}
-
-BytecodePtr BytecodeReaderHelper::ReadBytecode(const ObjectPool& pool) {
-#if defined(SUPPORT_TIMELINE)
-  TIMELINE_DURATION(Thread::Current(), CompilerVerbose,
-                    "BytecodeReaderHelper::ReadBytecode");
-#endif  // defined(SUPPORT_TIMELINE)
-  const intptr_t size = reader_.ReadUInt();
-  const intptr_t offset = reader_.offset();
-
-  const uint8_t* data = reader_.BufferAt(offset);
-  reader_.set_offset(offset + size);
-
-  // Create and return bytecode object.
-  return Bytecode::New(reinterpret_cast<uword>(data), size, offset, pool);
-}
-
-void BytecodeReaderHelper::ReadExceptionsTable(const Bytecode& bytecode,
-                                               bool has_exceptions_table) {
-#if defined(SUPPORT_TIMELINE)
-  TIMELINE_DURATION(Thread::Current(), CompilerVerbose,
-                    "BytecodeReaderHelper::ReadExceptionsTable");
-#endif
-
-  const intptr_t try_block_count =
-      has_exceptions_table ? reader_.ReadListLength() : 0;
-  if (try_block_count > 0) {
-    const ObjectPool& pool = ObjectPool::Handle(Z, bytecode.object_pool());
-    AbstractType& handler_type = AbstractType::Handle(Z);
-    Array& handler_types = Array::Handle(Z);
-    DescriptorList* pc_descriptors_list = new (Z) DescriptorList(Z);
-    ExceptionHandlerList* exception_handlers_list =
-        new (Z) ExceptionHandlerList();
-
-    // Encoding of ExceptionsTable is described in
-    // pkg/vm/lib/bytecode/exceptions.dart.
-    for (intptr_t try_index = 0; try_index < try_block_count; try_index++) {
-      intptr_t outer_try_index_plus1 = reader_.ReadUInt();
-      intptr_t outer_try_index = outer_try_index_plus1 - 1;
-      // PcDescriptors are expressed in terms of return addresses.
-      intptr_t start_pc =
-          KernelBytecode::BytecodePcToOffset(reader_.ReadUInt(),
-                                             /* is_return_address = */ true);
-      intptr_t end_pc =
-          KernelBytecode::BytecodePcToOffset(reader_.ReadUInt(),
-                                             /* is_return_address = */ true);
-      intptr_t handler_pc =
-          KernelBytecode::BytecodePcToOffset(reader_.ReadUInt(),
-                                             /* is_return_address = */ false);
-      uint8_t flags = reader_.ReadByte();
-      const uint8_t kFlagNeedsStackTrace = 1 << 0;
-      const uint8_t kFlagIsSynthetic = 1 << 1;
-      const bool needs_stacktrace = (flags & kFlagNeedsStackTrace) != 0;
-      const bool is_generated = (flags & kFlagIsSynthetic) != 0;
-      intptr_t type_count = reader_.ReadListLength();
-      ASSERT(type_count > 0);
-      handler_types = Array::New(type_count, Heap::kOld);
-      for (intptr_t i = 0; i < type_count; i++) {
-        intptr_t type_index = reader_.ReadUInt();
-        ASSERT(type_index < pool.Length());
-        handler_type ^= pool.ObjectAt(type_index);
-        handler_types.SetAt(i, handler_type);
-      }
-      pc_descriptors_list->AddDescriptor(
-          PcDescriptorsLayout::kOther, start_pc, DeoptId::kNone,
-          TokenPosition::kNoSource, try_index,
-          PcDescriptorsLayout::kInvalidYieldIndex);
-      pc_descriptors_list->AddDescriptor(
-          PcDescriptorsLayout::kOther, end_pc, DeoptId::kNone,
-          TokenPosition::kNoSource, try_index,
-          PcDescriptorsLayout::kInvalidYieldIndex);
-
-      // The exception handler keeps a zone handle of the types array, rather
-      // than a raw pointer. Do not share the handle across iterations to avoid
-      // clobbering the array.
-      exception_handlers_list->AddHandler(
-          try_index, outer_try_index, handler_pc, is_generated,
-          Array::ZoneHandle(Z, handler_types.raw()), needs_stacktrace);
-    }
-    const PcDescriptors& descriptors = PcDescriptors::Handle(
-        Z, pc_descriptors_list->FinalizePcDescriptors(bytecode.PayloadStart()));
-    bytecode.set_pc_descriptors(descriptors);
-    const ExceptionHandlers& handlers = ExceptionHandlers::Handle(
-        Z, exception_handlers_list->FinalizeExceptionHandlers(
-               bytecode.PayloadStart()));
-    bytecode.set_exception_handlers(handlers);
-  } else {
-    bytecode.set_pc_descriptors(Object::empty_descriptors());
-    bytecode.set_exception_handlers(Object::empty_exception_handlers());
-  }
-}
-
-void BytecodeReaderHelper::ReadSourcePositions(const Bytecode& bytecode,
-                                               bool has_source_positions) {
-  if (!has_source_positions) {
-    return;
-  }
-
-  intptr_t offset = reader_.ReadUInt();
-  bytecode.set_source_positions_binary_offset(
-      bytecode_component_->GetSourcePositionsOffset() + offset);
-}
-
-void BytecodeReaderHelper::ReadLocalVariables(const Bytecode& bytecode,
-                                              bool has_local_variables) {
-  if (!has_local_variables) {
-    return;
-  }
-
-  const intptr_t offset = reader_.ReadUInt();
-  bytecode.set_local_variables_binary_offset(
-      bytecode_component_->GetLocalVariablesOffset() + offset);
-}
-
-TypedDataPtr BytecodeReaderHelper::NativeEntry(const Function& function,
-                                               const String& external_name) {
-  MethodRecognizer::Kind kind = function.recognized_kind();
-  // This list of recognized methods must be kept in sync with the list of
-  // methods handled specially by the NativeCall bytecode in the interpreter.
-  switch (kind) {
-    case MethodRecognizer::kObjectEquals:
-    case MethodRecognizer::kStringBaseLength:
-    case MethodRecognizer::kStringBaseIsEmpty:
-    case MethodRecognizer::kGrowableArrayLength:
-    case MethodRecognizer::kObjectArrayLength:
-    case MethodRecognizer::kImmutableArrayLength:
-    case MethodRecognizer::kTypedListLength:
-    case MethodRecognizer::kTypedListViewLength:
-    case MethodRecognizer::kByteDataViewLength:
-    case MethodRecognizer::kByteDataViewOffsetInBytes:
-    case MethodRecognizer::kTypedDataViewOffsetInBytes:
-    case MethodRecognizer::kByteDataViewTypedData:
-    case MethodRecognizer::kTypedDataViewTypedData:
-    case MethodRecognizer::kClassIDgetID:
-    case MethodRecognizer::kGrowableArrayCapacity:
-    case MethodRecognizer::kListFactory:
-    case MethodRecognizer::kObjectArrayAllocate:
-    case MethodRecognizer::kLinkedHashMap_getIndex:
-    case MethodRecognizer::kLinkedHashMap_setIndex:
-    case MethodRecognizer::kLinkedHashMap_getData:
-    case MethodRecognizer::kLinkedHashMap_setData:
-    case MethodRecognizer::kLinkedHashMap_getHashMask:
-    case MethodRecognizer::kLinkedHashMap_setHashMask:
-    case MethodRecognizer::kLinkedHashMap_getUsedData:
-    case MethodRecognizer::kLinkedHashMap_setUsedData:
-    case MethodRecognizer::kLinkedHashMap_getDeletedKeys:
-    case MethodRecognizer::kLinkedHashMap_setDeletedKeys:
-    case MethodRecognizer::kFfiAbi:
-#define TYPED_DATA_FACTORY(clazz)                                              \
-  case MethodRecognizer::kTypedData_##clazz##_factory:
-      CLASS_LIST_TYPED_DATA(TYPED_DATA_FACTORY)
-#undef TYPED_DATA_FACTORY
-      break;
-    case MethodRecognizer::kAsyncStackTraceHelper:
-      // If causal async stacks are disabled the interpreter.cc will handle this
-      // native call specially.
-      if (!FLAG_causal_async_stacks) {
-        break;
-      }
-      FALL_THROUGH;
-    default:
-      kind = MethodRecognizer::kUnknown;
-  }
-  NativeFunctionWrapper trampoline = NULL;
-  NativeFunction native_function = NULL;
-  intptr_t argc_tag = 0;
-  if (kind == MethodRecognizer::kUnknown) {
-    if (!FLAG_link_natives_lazily) {
-      const Class& cls = Class::Handle(Z, function.Owner());
-      const Library& library = Library::Handle(Z, cls.library());
-      Dart_NativeEntryResolver resolver = library.native_entry_resolver();
-      const bool is_bootstrap_native = Bootstrap::IsBootstrapResolver(resolver);
-      const int num_params =
-          NativeArguments::ParameterCountForResolution(function);
-      bool is_auto_scope = true;
-      native_function = NativeEntry::ResolveNative(library, external_name,
-                                                   num_params, &is_auto_scope);
-      if (native_function == nullptr) {
-        Report::MessageF(Report::kError, Script::Handle(function.script()),
-                         function.token_pos(), Report::AtLocation,
-                         "native function '%s' (%" Pd
-                         " arguments) cannot be found",
-                         external_name.ToCString(), function.NumParameters());
-      }
-      if (is_bootstrap_native) {
-        trampoline = &NativeEntry::BootstrapNativeCallWrapper;
-      } else if (is_auto_scope) {
-        trampoline = &NativeEntry::AutoScopeNativeCallWrapper;
-      } else {
-        trampoline = &NativeEntry::NoScopeNativeCallWrapper;
-      }
-    }
-    argc_tag = NativeArguments::ComputeArgcTag(function);
-  }
-  return NativeEntryData::New(kind, trampoline, native_function, argc_tag);
-}
-
-ArrayPtr BytecodeReaderHelper::ReadBytecodeComponent(intptr_t md_offset) {
-  ASSERT(Thread::Current()->IsMutatorThread());
-
-  AlternativeReadingScope alt(&reader_, md_offset);
-
-  const intptr_t start_offset = reader_.offset();
-
-  intptr_t magic = reader_.ReadUInt32();
-  if (magic != KernelBytecode::kMagicValue) {
-    FATAL1("Unexpected Dart bytecode magic %" Px, magic);
-  }
-
-  const intptr_t version = reader_.ReadUInt32();
-  if ((version < KernelBytecode::kMinSupportedBytecodeFormatVersion) ||
-      (version > KernelBytecode::kMaxSupportedBytecodeFormatVersion)) {
-    FATAL3("Unsupported Dart bytecode format version %" Pd
-           ". "
-           "This version of Dart VM supports bytecode format versions from %" Pd
-           " to %" Pd ".",
-           version, KernelBytecode::kMinSupportedBytecodeFormatVersion,
-           KernelBytecode::kMaxSupportedBytecodeFormatVersion);
-  }
-
-  reader_.ReadUInt32();  // Skip stringTable.numItems
-  const intptr_t string_table_offset = start_offset + reader_.ReadUInt32();
-
-  reader_.ReadUInt32();  // Skip objectTable.numItems
-  const intptr_t object_table_offset = start_offset + reader_.ReadUInt32();
-
-  reader_.ReadUInt32();  // Skip main.numItems
-  const intptr_t main_offset = start_offset + reader_.ReadUInt32();
-
-  const intptr_t num_libraries = reader_.ReadUInt32();
-  const intptr_t library_index_offset = start_offset + reader_.ReadUInt32();
-
-  reader_.ReadUInt32();  // Skip libraries.numItems
-  const intptr_t libraries_offset = start_offset + reader_.ReadUInt32();
-
-  const intptr_t num_classes = reader_.ReadUInt32();
-  const intptr_t classes_offset = start_offset + reader_.ReadUInt32();
-
-  reader_.ReadUInt32();  // Skip members.numItems
-  const intptr_t members_offset = start_offset + reader_.ReadUInt32();
-
-  const intptr_t num_codes = reader_.ReadUInt32();
-  const intptr_t codes_offset = start_offset + reader_.ReadUInt32();
-
-  reader_.ReadUInt32();  // Skip sourcePositions.numItems
-  const intptr_t source_positions_offset = start_offset + reader_.ReadUInt32();
-
-  reader_.ReadUInt32();  // Skip sourceFiles.numItems
-  const intptr_t source_files_offset = start_offset + reader_.ReadUInt32();
-
-  reader_.ReadUInt32();  // Skip lineStarts.numItems
-  const intptr_t line_starts_offset = start_offset + reader_.ReadUInt32();
-
-  reader_.ReadUInt32();  // Skip localVariables.numItems
-  const intptr_t local_variables_offset = start_offset + reader_.ReadUInt32();
-
-  reader_.ReadUInt32();  // Skip annotations.numItems
-  const intptr_t annotations_offset = start_offset + reader_.ReadUInt32();
-
-  const intptr_t num_protected_names = reader_.ReadUInt32();
-  const intptr_t protected_names_offset = start_offset + reader_.ReadUInt32();
-
-  // Read header of string table.
-  reader_.set_offset(string_table_offset);
-  const intptr_t num_one_byte_strings = reader_.ReadUInt32();
-  const intptr_t num_two_byte_strings = reader_.ReadUInt32();
-  const intptr_t strings_contents_offset =
-      reader_.offset() + (num_one_byte_strings + num_two_byte_strings) * 4;
-
-  // Read header of object table.
-  reader_.set_offset(object_table_offset);
-  const intptr_t num_objects = reader_.ReadUInt();
-  const intptr_t objects_size = reader_.ReadUInt();
-
-  // Skip over contents of objects.
-  const intptr_t objects_contents_offset = reader_.offset();
-  const intptr_t object_offsets_offset = objects_contents_offset + objects_size;
-  reader_.set_offset(object_offsets_offset);
-
-  auto& bytecode_component_array = Array::Handle(
-      Z,
-      BytecodeComponentData::New(
-          Z, version, num_objects, string_table_offset, strings_contents_offset,
-          object_offsets_offset, objects_contents_offset, main_offset,
-          num_libraries, library_index_offset, libraries_offset, num_classes,
-          classes_offset, members_offset, num_codes, codes_offset,
-          source_positions_offset, source_files_offset, line_starts_offset,
-          local_variables_offset, annotations_offset, Heap::kOld));
-
-  BytecodeComponentData bytecode_component(&bytecode_component_array);
-
-  // Read object offsets.
-  Smi& offs = Smi::Handle(Z);
-  for (intptr_t i = 0; i < num_objects; ++i) {
-    offs = Smi::New(reader_.ReadUInt());
-    bytecode_component.SetObject(i, offs);
-  }
-
-  // Read protected names.
-  if (I->obfuscate() && (num_protected_names > 0)) {
-    bytecode_component_ = &bytecode_component;
-
-    reader_.set_offset(protected_names_offset);
-    Obfuscator obfuscator(thread_, Object::null_string());
-    auto& name = String::Handle(Z);
-    for (intptr_t i = 0; i < num_protected_names; ++i) {
-      name = ReadString();
-      obfuscator.PreventRenaming(name);
-    }
-
-    bytecode_component_ = nullptr;
-  }
-
-  H.SetBytecodeComponent(bytecode_component_array);
-
-  return bytecode_component_array.raw();
-}
-
-void BytecodeReaderHelper::ResetObjects() {
-  reader_.set_offset(bytecode_component_->GetObjectOffsetsOffset());
-  const intptr_t num_objects = bytecode_component_->GetNumObjects();
-
-  // Read object offsets.
-  Smi& offs = Smi::Handle(Z);
-  for (intptr_t i = 0; i < num_objects; ++i) {
-    offs = Smi::New(reader_.ReadUInt());
-    bytecode_component_->SetObject(i, offs);
-  }
-}
-
-ObjectPtr BytecodeReaderHelper::ReadObject() {
-  uint32_t header = reader_.ReadUInt();
-  if ((header & kReferenceBit) != 0) {
-    intptr_t index = header >> kIndexShift;
-    if (index == 0) {
-      return Object::null();
-    }
-    ObjectPtr obj = bytecode_component_->GetObject(index);
-    if (obj->IsHeapObject()) {
-      return obj;
-    }
-    // Object is not loaded yet.
-    intptr_t offset = bytecode_component_->GetObjectsContentsOffset() +
-                      Smi::Value(Smi::RawCast(obj));
-    AlternativeReadingScope alt(&reader_, offset);
-    header = reader_.ReadUInt();
-
-    obj = ReadObjectContents(header);
-    ASSERT(obj->IsHeapObject());
-    {
-      REUSABLE_OBJECT_HANDLESCOPE(thread_);
-      Object& obj_handle = thread_->ObjectHandle();
-      obj_handle = obj;
-      bytecode_component_->SetObject(index, obj_handle);
-    }
-    return obj;
-  }
-
-  return ReadObjectContents(header);
-}
-
-StringPtr BytecodeReaderHelper::ConstructorName(const Class& cls,
-                                                const String& name) {
-  GrowableHandlePtrArray<const String> pieces(Z, 3);
-  pieces.Add(String::Handle(Z, cls.Name()));
-  pieces.Add(Symbols::Dot());
-  pieces.Add(name);
-  return Symbols::FromConcatAll(thread_, pieces);
-}
-
-ObjectPtr BytecodeReaderHelper::ReadObjectContents(uint32_t header) {
-  ASSERT(((header & kReferenceBit) == 0));
-
-  // Must be in sync with enum ObjectKind in
-  // pkg/vm/lib/bytecode/object_table.dart.
-  enum ObjectKind {
-    kInvalid,
-    kLibrary,
-    kClass,
-    kMember,
-    kClosure,
-    kUnused1,
-    kUnused2,
-    kUnused3,
-    kUnused4,
-    kName,
-    kTypeArguments,
-    kUnused5,
-    kConstObject,
-    kArgDesc,
-    kScript,
-    kType,
-  };
-
-  // Member flags, must be in sync with _MemberHandle constants in
-  // pkg/vm/lib/bytecode/object_table.dart.
-  const intptr_t kFlagIsField = kFlagBit0;
-  const intptr_t kFlagIsConstructor = kFlagBit1;
-
-  // ArgDesc flags, must be in sync with _ArgDescHandle constants in
-  // pkg/vm/lib/bytecode/object_table.dart.
-  const int kFlagHasNamedArgs = kFlagBit0;
-  const int kFlagHasTypeArgs = kFlagBit1;
-
-  // Script flags, must be in sync with _ScriptHandle constants in
-  // pkg/vm/lib/bytecode/object_table.dart.
-  const int kFlagHasSourceFile = kFlagBit0;
-
-  // Name flags, must be in sync with _NameHandle constants in
-  // pkg/vm/lib/bytecode/object_table.dart.
-  const intptr_t kFlagIsPublic = kFlagBit0;
-
-  const intptr_t kind = (header >> kKindShift) & kKindMask;
-  const intptr_t flags = header & kFlagsMask;
-
-  switch (kind) {
-    case kInvalid:
-      UNREACHABLE();
-      break;
-    case kLibrary: {
-      String& uri = String::CheckedHandle(Z, ReadObject());
-      LibraryPtr library = Library::LookupLibrary(thread_, uri);
-      if (library == Library::null()) {
-        // We do not register expression evaluation libraries with the VM:
-        // The expression evaluation functions should be GC-able as soon as
-        // they are not reachable anymore and we never look them up by name.
-        if (uri.raw() == Symbols::EvalSourceUri().raw()) {
-          ASSERT(expression_evaluation_library_ != nullptr);
-          return expression_evaluation_library_->raw();
-        }
-#if !defined(PRODUCT)
-        ASSERT(Isolate::Current()->HasAttemptedReload());
-        const String& msg = String::Handle(
-            Z,
-            String::NewFormatted("Unable to find library %s", uri.ToCString()));
-        Report::LongJump(LanguageError::Handle(Z, LanguageError::New(msg)));
-#else
-        FATAL1("Unable to find library %s", uri.ToCString());
-#endif
-      }
-      return library;
-    }
-    case kClass: {
-      const Library& library = Library::CheckedHandle(Z, ReadObject());
-      const String& class_name = String::CheckedHandle(Z, ReadObject());
-      if (class_name.raw() == Symbols::Empty().raw()) {
-        NoSafepointScope no_safepoint_scope(thread_);
-        ClassPtr cls = library.toplevel_class();
-        if (cls == Class::null()) {
-          FATAL1("Unable to find toplevel class %s", library.ToCString());
-        }
-        return cls;
-      }
-      ClassPtr cls = library.LookupLocalClass(class_name);
-      if (cls == Class::null()) {
-        if (IsExpressionEvaluationLibrary(library)) {
-          return H.GetExpressionEvaluationRealClass();
-        }
-#if !defined(PRODUCT)
-        ASSERT(Isolate::Current()->HasAttemptedReload());
-        const String& msg = String::Handle(
-            Z,
-            String::NewFormatted("Unable to find class %s in %s",
-                                 class_name.ToCString(), library.ToCString()));
-        Report::LongJump(LanguageError::Handle(Z, LanguageError::New(msg)));
-#else
-        FATAL2("Unable to find class %s in %s", class_name.ToCString(),
-               library.ToCString());
-#endif
-      }
-      return cls;
-    }
-    case kMember: {
-      const Class& cls = Class::CheckedHandle(Z, ReadObject());
-      String& name = String::CheckedHandle(Z, ReadObject());
-      if ((flags & kFlagIsField) != 0) {
-        FieldPtr field = cls.LookupField(name);
-        if (field == Field::null()) {
-#if !defined(PRODUCT)
-          ASSERT(Isolate::Current()->HasAttemptedReload());
-          const String& msg = String::Handle(
-              Z, String::NewFormatted("Unable to find field %s in %s",
-                                      name.ToCString(), cls.ToCString()));
-          Report::LongJump(LanguageError::Handle(Z, LanguageError::New(msg)));
-#else
-          FATAL2("Unable to find field %s in %s", name.ToCString(),
-                 cls.ToCString());
-#endif
-        }
-        return field;
-      } else {
-        if ((flags & kFlagIsConstructor) != 0) {
-          name = ConstructorName(cls, name);
-        }
-        ASSERT(!name.IsNull() && name.IsSymbol());
-        if (name.raw() == scoped_function_name_.raw() &&
-            cls.raw() == scoped_function_class_.raw()) {
-          return scoped_function_.raw();
-        }
-        FunctionPtr function = Function::null();
-        if (cls.EnsureIsFinalized(thread_) == Error::null()) {
-          function = cls.LookupFunction(name);
-        }
-        if (function == Function::null()) {
-          // When requesting a getter, also return method extractors.
-          if (Field::IsGetterName(name)) {
-            String& method_name =
-                String::Handle(Z, Field::NameFromGetter(name));
-            function = cls.LookupFunction(method_name);
-            if (function != Function::null()) {
-              function =
-                  Function::Handle(Z, function).CreateMethodExtractor(name);
-              if (function != Function::null()) {
-                return function;
-              }
-            }
-          }
-#if !defined(PRODUCT)
-          ASSERT(Isolate::Current()->HasAttemptedReload());
-          const String& msg = String::Handle(
-              Z, String::NewFormatted("Unable to find function %s in %s",
-                                      name.ToCString(), cls.ToCString()));
-          Report::LongJump(LanguageError::Handle(Z, LanguageError::New(msg)));
-#else
-          FATAL2("Unable to find function %s in %s", name.ToCString(),
-                 cls.ToCString());
-#endif
-        }
-        return function;
-      }
-    }
-    case kClosure: {
-      ReadObject();  // Skip enclosing member.
-      const intptr_t closure_index = reader_.ReadUInt();
-      return closures_->At(closure_index);
-    }
-    case kName: {
-      if ((flags & kFlagIsPublic) == 0) {
-        const Library& library = Library::CheckedHandle(Z, ReadObject());
-        ASSERT(!library.IsNull());
-        auto& name = String::Handle(Z, ReadString(/* is_canonical = */ false));
-        name = library.PrivateName(name);
-        if (I->obfuscate()) {
-          const auto& library_key = String::Handle(Z, library.private_key());
-          Obfuscator obfuscator(thread_, library_key);
-          return obfuscator.Rename(name);
-        }
-        return name.raw();
-      }
-      if (I->obfuscate()) {
-        Obfuscator obfuscator(thread_, Object::null_string());
-        const auto& name = String::Handle(Z, ReadString());
-        return obfuscator.Rename(name);
-      } else {
-        return ReadString();
-      }
-    }
-    case kTypeArguments: {
-      return ReadTypeArguments();
-    }
-    case kConstObject: {
-      const intptr_t tag = flags / kFlagBit0;
-      return ReadConstObject(tag);
-    }
-    case kArgDesc: {
-      const intptr_t num_arguments = reader_.ReadUInt();
-      const intptr_t num_type_args =
-          ((flags & kFlagHasTypeArgs) != 0) ? reader_.ReadUInt() : 0;
-      if ((flags & kFlagHasNamedArgs) == 0) {
-        return ArgumentsDescriptor::NewBoxed(num_type_args, num_arguments);
-      } else {
-        const intptr_t num_arg_names = reader_.ReadListLength();
-        const Array& array = Array::Handle(Z, Array::New(num_arg_names));
-        String& name = String::Handle(Z);
-        for (intptr_t i = 0; i < num_arg_names; ++i) {
-          name ^= ReadObject();
-          array.SetAt(i, name);
-        }
-        return ArgumentsDescriptor::NewBoxed(num_type_args, num_arguments,
-                                             array);
-      }
-    }
-    case kScript: {
-      const String& uri = String::CheckedHandle(Z, ReadObject());
-      Script& script = Script::Handle(Z);
-      if ((flags & kFlagHasSourceFile) != 0) {
-        // TODO(alexmarkov): read source and line starts only when needed.
-        script =
-            ReadSourceFile(uri, bytecode_component_->GetSourceFilesOffset() +
-                                    reader_.ReadUInt());
-      } else {
-        script = Script::New(uri, Object::null_string());
-      }
-      script.set_kernel_program_info(H.GetKernelProgramInfo());
-      return script.raw();
-    }
-    case kType: {
-      const intptr_t tag = (flags & kTagMask) / kFlagBit0;
-      const Nullability nullability =
-          Reader::ConvertNullability(static_cast<KernelNullability>(
-              (flags & kNullabilityMask) / kFlagBit4));
-      return ReadType(tag, nullability);
-    }
-    default:
-      UNREACHABLE();
-  }
-
-  return Object::null();
-}
-
-ObjectPtr BytecodeReaderHelper::ReadConstObject(intptr_t tag) {
-  // Must be in sync with enum ConstTag in
-  // pkg/vm/lib/bytecode/object_table.dart.
-  enum ConstTag {
-    kInvalid,
-    kInstance,
-    kInt,
-    kDouble,
-    kList,
-    kTearOff,
-    kBool,
-    kSymbol,
-    kTearOffInstantiation,
-    kString,
-  };
-
-  switch (tag) {
-    case kInvalid:
-      UNREACHABLE();
-      break;
-    case kInstance: {
-      const Type& type = Type::CheckedHandle(Z, ReadObject());
-      const Class& cls = Class::Handle(Z, type.type_class());
-      const Instance& obj = Instance::Handle(Z, Instance::New(cls, Heap::kOld));
-      if (type.arguments() != TypeArguments::null()) {
-        const TypeArguments& type_args =
-            TypeArguments::Handle(Z, type.arguments());
-        obj.SetTypeArguments(type_args);
-      }
-      const intptr_t num_fields = reader_.ReadUInt();
-      Field& field = Field::Handle(Z);
-      Object& value = Object::Handle(Z);
-      for (intptr_t i = 0; i < num_fields; ++i) {
-        field ^= ReadObject();
-        value = ReadObject();
-        obj.SetField(field, value);
-      }
-      return H.Canonicalize(obj);
-    }
-    case kInt: {
-      const int64_t value = reader_.ReadSLEB128AsInt64();
-      if (Smi::IsValid(value)) {
-        return Smi::New(static_cast<intptr_t>(value));
-      }
-      const Integer& obj = Integer::Handle(Z, Integer::New(value, Heap::kOld));
-      return H.Canonicalize(obj);
-    }
-    case kDouble: {
-      const int64_t bits = reader_.ReadSLEB128AsInt64();
-      double value = bit_cast<double, int64_t>(bits);
-      const Double& obj = Double::Handle(Z, Double::New(value, Heap::kOld));
-      return H.Canonicalize(obj);
-    }
-    case kList: {
-      const AbstractType& elem_type =
-          AbstractType::CheckedHandle(Z, ReadObject());
-      const intptr_t length = reader_.ReadUInt();
-      const Array& array = Array::Handle(Z, Array::New(length, elem_type));
-      Object& value = Object::Handle(Z);
-      for (intptr_t i = 0; i < length; ++i) {
-        value = ReadObject();
-        array.SetAt(i, value);
-      }
-      array.MakeImmutable();
-      return H.Canonicalize(array);
-    }
-    case kTearOff: {
-      Object& obj = Object::Handle(Z, ReadObject());
-      ASSERT(obj.IsFunction());
-      obj = Function::Cast(obj).ImplicitClosureFunction();
-      ASSERT(obj.IsFunction());
-      obj = Function::Cast(obj).ImplicitStaticClosure();
-      ASSERT(obj.IsInstance());
-      return H.Canonicalize(Instance::Cast(obj));
-    }
-    case kBool: {
-      bool is_true = reader_.ReadByte() != 0;
-      return is_true ? Bool::True().raw() : Bool::False().raw();
-    }
-    case kSymbol: {
-      const String& name = String::CheckedHandle(Z, ReadObject());
-      ASSERT(name.IsSymbol());
-      const Library& library = Library::Handle(Z, Library::InternalLibrary());
-      ASSERT(!library.IsNull());
-      const Class& cls =
-          Class::Handle(Z, library.LookupClass(Symbols::Symbol()));
-      ASSERT(!cls.IsNull());
-      const Field& field = Field::Handle(
-          Z, cls.LookupInstanceFieldAllowPrivate(Symbols::_name()));
-      ASSERT(!field.IsNull());
-      const Instance& obj = Instance::Handle(Z, Instance::New(cls, Heap::kOld));
-      obj.SetField(field, name);
-      return H.Canonicalize(obj);
-    }
-    case kTearOffInstantiation: {
-      Closure& closure = Closure::CheckedHandle(Z, ReadObject());
-      const TypeArguments& type_args =
-          TypeArguments::CheckedHandle(Z, ReadObject());
-      closure = Closure::New(
-          TypeArguments::Handle(Z, closure.instantiator_type_arguments()),
-          TypeArguments::Handle(Z, closure.function_type_arguments()),
-          type_args, Function::Handle(Z, closure.function()),
-          Context::Handle(Z, closure.context()), Heap::kOld);
-      return H.Canonicalize(closure);
-    }
-    case kString:
-      return ReadString();
-    default:
-      UNREACHABLE();
-  }
-  return Object::null();
-}
-
-ObjectPtr BytecodeReaderHelper::ReadType(intptr_t tag,
-                                         Nullability nullability) {
-  // Must be in sync with enum TypeTag in
-  // pkg/vm/lib/bytecode/object_table.dart.
-  enum TypeTag {
-    kInvalid,
-    kDynamic,
-    kVoid,
-    kSimpleType,
-    kTypeParameter,
-    kGenericType,
-    kRecursiveGenericType,
-    kRecursiveTypeRef,
-    kFunctionType,
-    kNever,
-  };
-
-  // FunctionType flags, must be in sync with _FunctionTypeHandle constants in
-  // pkg/vm/lib/bytecode/object_table.dart.
-  const int kFlagHasOptionalPositionalParams = 1 << 0;
-  const int kFlagHasOptionalNamedParams = 1 << 1;
-  const int kFlagHasTypeParams = 1 << 2;
-
-  switch (tag) {
-    case kInvalid:
-      UNREACHABLE();
-      break;
-    case kDynamic:
-      return AbstractType::dynamic_type().raw();
-    case kVoid:
-      return AbstractType::void_type().raw();
-    case kNever:
-      return Type::Handle(Z, Type::NeverType())
-          .ToNullability(nullability, Heap::kOld);
-    case kSimpleType: {
-      const Class& cls = Class::CheckedHandle(Z, ReadObject());
-      if (!cls.is_declaration_loaded()) {
-        LoadReferencedClass(cls);
-      }
-      const Type& type = Type::Handle(Z, cls.DeclarationType());
-      return type.ToNullability(nullability, Heap::kOld);
-    }
-    case kTypeParameter: {
-      Object& parent = Object::Handle(Z, ReadObject());
-      const intptr_t index_in_parent = reader_.ReadUInt();
-      TypeArguments& type_parameters = TypeArguments::Handle(Z);
-      if (parent.IsClass()) {
-        type_parameters = Class::Cast(parent).type_parameters();
-      } else if (parent.IsFunction()) {
-        if (Function::Cast(parent).IsFactory()) {
-          // For factory constructors VM uses type parameters of a class
-          // instead of constructor's type parameters.
-          parent = Function::Cast(parent).Owner();
-          type_parameters = Class::Cast(parent).type_parameters();
-        } else {
-          type_parameters = Function::Cast(parent).type_parameters();
-        }
-      } else if (parent.IsNull()) {
-        ASSERT(function_type_type_parameters_ != nullptr);
-        type_parameters = function_type_type_parameters_->raw();
-      } else {
-        UNREACHABLE();
-      }
-      TypeParameter& type_parameter = TypeParameter::Handle(Z);
-      type_parameter ^= type_parameters.TypeAt(index_in_parent);
-      if (type_parameter.bound() == AbstractType::null()) {
-        AbstractType& derived = AbstractType::Handle(
-            Z, type_parameter.ToNullability(nullability, Heap::kOld));
-        active_class_->RecordDerivedTypeParameter(Z, type_parameter,
-                                                  TypeParameter::Cast(derived));
-        return derived.raw();
-      }
-      return type_parameter.ToNullability(nullability, Heap::kOld);
-    }
-    case kGenericType: {
-      const Class& cls = Class::CheckedHandle(Z, ReadObject());
-      if (!cls.is_declaration_loaded()) {
-        LoadReferencedClass(cls);
-      }
-      const TypeArguments& type_arguments =
-          TypeArguments::CheckedHandle(Z, ReadObject());
-      const Type& type =
-          Type::Handle(Z, Type::New(cls, type_arguments,
-                                    TokenPosition::kNoSource, nullability));
-      type.SetIsFinalized();
-      return type.Canonicalize(thread_, nullptr);
-    }
-    case kRecursiveGenericType: {
-      const intptr_t id = reader_.ReadUInt();
-      const Class& cls = Class::CheckedHandle(Z, ReadObject());
-      if (!cls.is_declaration_loaded()) {
-        LoadReferencedClass(cls);
-      }
-      const auto saved_pending_recursive_types = pending_recursive_types_;
-      if (id == 0) {
-        pending_recursive_types_ = &GrowableObjectArray::Handle(
-            Z, GrowableObjectArray::New(Heap::kOld));
-      }
-      ASSERT(id == pending_recursive_types_->Length());
-      const auto& type_ref =
-          TypeRef::Handle(Z, TypeRef::New(AbstractType::null_abstract_type()));
-      pending_recursive_types_->Add(type_ref);
-
-      reading_type_arguments_of_recursive_type_ = true;
-      const TypeArguments& type_arguments =
-          TypeArguments::CheckedHandle(Z, ReadObject());
-      reading_type_arguments_of_recursive_type_ = false;
-
-      ASSERT(id == pending_recursive_types_->Length() - 1);
-      ASSERT(pending_recursive_types_->At(id) == type_ref.raw());
-      pending_recursive_types_->SetLength(id);
-      pending_recursive_types_ = saved_pending_recursive_types;
-
-      Type& type =
-          Type::Handle(Z, Type::New(cls, type_arguments,
-                                    TokenPosition::kNoSource, nullability));
-      type_ref.set_type(type);
-      type.SetIsFinalized();
-      if (id != 0) {
-        // Do not canonicalize non-root recursive types
-        // as not all TypeRef objects are filled up at this point.
-        return type.raw();
-      }
-      return type.Canonicalize(thread_, nullptr);
-    }
-    case kRecursiveTypeRef: {
-      const intptr_t id = reader_.ReadUInt();
-      ASSERT(pending_recursive_types_ != nullptr);
-      ASSERT(pending_recursive_types_->Length() >= id);
-      return pending_recursive_types_->At(id);
-    }
-    case kFunctionType: {
-      const intptr_t flags = reader_.ReadUInt();
-      Function& signature_function = Function::ZoneHandle(
-          Z, Function::NewSignatureFunction(*active_class_->klass,
-                                            active_class_->enclosing != NULL
-                                                ? *active_class_->enclosing
-                                                : Function::null_function(),
-                                            TokenPosition::kNoSource));
-
-      // This scope is needed to set active_class_->enclosing_ which is used to
-      // assign parent function for function types.
-      ActiveEnclosingFunctionScope active_enclosing_function(
-          active_class_, &signature_function);
-
-      // TODO(alexmarkov): skip type finalization
-      return ReadFunctionSignature(
-          signature_function, (flags & kFlagHasOptionalPositionalParams) != 0,
-          (flags & kFlagHasOptionalNamedParams) != 0,
-          (flags & kFlagHasTypeParams) != 0,
-          /* has_positional_param_names = */ false,
-          /* has_parameter_flags */ false, nullability);
-    }
-    default:
-      UNREACHABLE();
-  }
-  return Object::null();
-}
-
-StringPtr BytecodeReaderHelper::ReadString(bool is_canonical) {
-  const int kFlagTwoByteString = 1;
-  const int kHeaderFields = 2;
-  const int kUInt32Size = 4;
-
-  uint32_t ref = reader_.ReadUInt();
-  const bool isOneByteString = (ref & kFlagTwoByteString) == 0;
-  intptr_t index = ref >> 1;
-
-  if (!isOneByteString) {
-    const uint32_t num_one_byte_strings =
-        reader_.ReadUInt32At(bytecode_component_->GetStringsHeaderOffset());
-    index += num_one_byte_strings;
-  }
-
-  AlternativeReadingScope alt(&reader_,
-                              bytecode_component_->GetStringsHeaderOffset() +
-                                  (kHeaderFields + index - 1) * kUInt32Size);
-  intptr_t start_offs = reader_.ReadUInt32();
-  intptr_t end_offs = reader_.ReadUInt32();
-  if (index == 0) {
-    // For the 0-th string we read a header field instead of end offset of
-    // the previous string.
-    start_offs = 0;
-  }
-
-  // Bytecode strings reside in ExternalTypedData which is not movable by GC,
-  // so it is OK to take a direct pointer to string characters even if
-  // symbol allocation triggers GC.
-  const uint8_t* data = reader_.BufferAt(
-      bytecode_component_->GetStringsContentsOffset() + start_offs);
-
-  if (is_canonical) {
-    if (isOneByteString) {
-      return Symbols::FromLatin1(thread_, data, end_offs - start_offs);
-    } else {
-      return Symbols::FromUTF16(thread_,
-                                reinterpret_cast<const uint16_t*>(data),
-                                (end_offs - start_offs) >> 1);
-    }
-  } else {
-    if (isOneByteString) {
-      return String::FromLatin1(data, end_offs - start_offs, Heap::kOld);
-    } else {
-      return String::FromUTF16(reinterpret_cast<const uint16_t*>(data),
-                               (end_offs - start_offs) >> 1, Heap::kOld);
-    }
-  }
-}
-
-ScriptPtr BytecodeReaderHelper::ReadSourceFile(const String& uri,
-                                               intptr_t offset) {
-  // SourceFile flags, must be in sync with SourceFile constants in
-  // pkg/vm/lib/bytecode/declarations.dart.
-  const int kHasLineStartsFlag = 1 << 0;
-  const int kHasSourceFlag = 1 << 1;
-
-  AlternativeReadingScope alt(&reader_, offset);
-
-  const intptr_t flags = reader_.ReadUInt();
-  const String& import_uri = String::CheckedHandle(Z, ReadObject());
-
-  TypedData& line_starts = TypedData::Handle(Z);
-  if ((flags & kHasLineStartsFlag) != 0) {
-    // TODO(alexmarkov): read line starts only when needed.
-    const intptr_t line_starts_offset =
-        bytecode_component_->GetLineStartsOffset() + reader_.ReadUInt();
-
-    AlternativeReadingScope alt(&reader_, line_starts_offset);
-
-    const intptr_t num_line_starts = reader_.ReadUInt();
-    line_starts = reader_.ReadLineStartsData(num_line_starts);
-  }
-
-  String& source = String::Handle(Z);
-  if ((flags & kHasSourceFlag) != 0) {
-    source = ReadString(/* is_canonical = */ false);
-  }
-
-  const Script& script =
-      Script::Handle(Z, Script::New(import_uri, uri, source));
-  script.set_line_starts(line_starts);
-
-  if (source.IsNull() && line_starts.IsNull()) {
-    // This script provides a uri only, but no source or line_starts array.
-    // This could be a reference to a Script in another kernel binary.
-    // Make an attempt to find source and line starts when needed.
-    script.SetLazyLookupSourceAndLineStarts(true);
-  }
-
-  return script.raw();
-}
-
-TypeArgumentsPtr BytecodeReaderHelper::ReadTypeArguments() {
-  const bool is_recursive = reading_type_arguments_of_recursive_type_;
-  reading_type_arguments_of_recursive_type_ = false;
-  const intptr_t length = reader_.ReadUInt();
-  TypeArguments& type_arguments =
-      TypeArguments::ZoneHandle(Z, TypeArguments::New(length));
-  AbstractType& type = AbstractType::Handle(Z);
-  for (intptr_t i = 0; i < length; ++i) {
-    type ^= ReadObject();
-    type_arguments.SetTypeAt(i, type);
-  }
-  if (is_recursive) {
-    // Avoid canonicalization of type arguments of recursive type
-    // as not all TypeRef objects are filled up at this point.
-    // Type arguments will be canoncialized when the root recursive
-    // type is canonicalized.
-    ASSERT(pending_recursive_types_ != nullptr);
-    return type_arguments.raw();
-  }
-  return type_arguments.Canonicalize(thread_, nullptr);
-}
-
-void BytecodeReaderHelper::ReadAttributes(const Object& key) {
-  ASSERT(key.IsFunction() || key.IsField());
-  const auto& value = Object::Handle(Z, ReadObject());
-
-  Array& attributes =
-      Array::Handle(Z, I->object_store()->bytecode_attributes());
-  if (attributes.IsNull()) {
-    attributes = HashTables::New<BytecodeAttributesMap>(16, Heap::kOld);
-  }
-  BytecodeAttributesMap map(attributes.raw());
-  bool present = map.UpdateOrInsert(key, value);
-  ASSERT(!present);
-  I->object_store()->set_bytecode_attributes(map.Release());
-
-  if (key.IsField()) {
-    const Field& field = Field::Cast(key);
-    const auto& inferred_type_attr =
-        Array::CheckedHandle(Z, BytecodeReader::GetBytecodeAttribute(
-                                    key, Symbols::vm_inferred_type_metadata()));
-
-    if (!inferred_type_attr.IsNull() &&
-        (InferredTypeBytecodeAttribute::GetPCAt(inferred_type_attr, 0) ==
-         InferredTypeBytecodeAttribute::kFieldTypePC)) {
-      const InferredTypeMetadata type =
-          InferredTypeBytecodeAttribute::GetInferredTypeAt(
-              Z, inferred_type_attr, 0);
-      if (!type.IsTrivial()) {
-        field.set_guarded_cid(type.cid);
-        field.set_is_nullable(type.IsNullable());
-        field.set_guarded_list_length(Field::kNoFixedLength);
-      }
-    }
-  }
-}
-
-void BytecodeReaderHelper::ReadMembers(const Class& cls, bool discard_fields) {
-  ASSERT(Thread::Current()->IsMutatorThread());
-  ASSERT(cls.is_type_finalized());
-  ASSERT(!cls.is_loaded());
-
-  const intptr_t num_functions = reader_.ReadUInt();
-  functions_ = &Array::Handle(Z, Array::New(num_functions, Heap::kOld));
-  function_index_ = 0;
-
-  ReadFieldDeclarations(cls, discard_fields);
-  ReadFunctionDeclarations(cls);
-
-  cls.set_is_loaded(true);
-}
-
-void BytecodeReaderHelper::ReadFieldDeclarations(const Class& cls,
-                                                 bool discard_fields) {
-  // Field flags, must be in sync with FieldDeclaration constants in
-  // pkg/vm/lib/bytecode/declarations.dart.
-  const int kHasNontrivialInitializerFlag = 1 << 0;
-  const int kHasGetterFlag = 1 << 1;
-  const int kHasSetterFlag = 1 << 2;
-  const int kIsReflectableFlag = 1 << 3;
-  const int kIsStaticFlag = 1 << 4;
-  const int kIsConstFlag = 1 << 5;
-  const int kIsFinalFlag = 1 << 6;
-  const int kIsCovariantFlag = 1 << 7;
-  const int kIsGenericCovariantImplFlag = 1 << 8;
-  const int kHasSourcePositionsFlag = 1 << 9;
-  const int kHasAnnotationsFlag = 1 << 10;
-  const int kHasPragmaFlag = 1 << 11;
-  const int kHasCustomScriptFlag = 1 << 12;
-  const int kHasInitializerCodeFlag = 1 << 13;
-  const int kHasAttributesFlag = 1 << 14;
-  const int kIsLateFlag = 1 << 15;
-  const int kIsExtensionMemberFlag = 1 << 16;
-  const int kHasInitializerFlag = 1 << 17;
-
-  const int num_fields = reader_.ReadListLength();
-  if ((num_fields == 0) && !cls.is_enum_class()) {
-    return;
-  }
-  const Array& fields = Array::Handle(
-      Z, Array::New(num_fields + (cls.is_enum_class() ? 1 : 0), Heap::kOld));
-  String& name = String::Handle(Z);
-  Object& script_class = Object::Handle(Z);
-  AbstractType& type = AbstractType::Handle(Z);
-  Field& field = Field::Handle(Z);
-  Instance& value = Instance::Handle(Z);
-  Function& function = Function::Handle(Z);
-
-  for (intptr_t i = 0; i < num_fields; ++i) {
-    intptr_t flags = reader_.ReadUInt();
-
-    const bool is_static = (flags & kIsStaticFlag) != 0;
-    const bool is_final = (flags & kIsFinalFlag) != 0;
-    const bool is_const = (flags & kIsConstFlag) != 0;
-    const bool is_late = (flags & kIsLateFlag) != 0;
-    const bool has_nontrivial_initializer =
-        (flags & kHasNontrivialInitializerFlag) != 0;
-    const bool has_pragma = (flags & kHasPragmaFlag) != 0;
-    const bool is_extension_member = (flags & kIsExtensionMemberFlag) != 0;
-    const bool has_initializer = (flags & kHasInitializerFlag) != 0;
-
-    name ^= ReadObject();
-    type ^= ReadObject();
-
-    if ((flags & kHasCustomScriptFlag) != 0) {
-      Script& script = Script::CheckedHandle(Z, ReadObject());
-      script_class = GetPatchClass(cls, script);
-    } else {
-      script_class = cls.raw();
-    }
-
-    TokenPosition position = TokenPosition::kNoSource;
-    TokenPosition end_position = TokenPosition::kNoSource;
-    if ((flags & kHasSourcePositionsFlag) != 0) {
-      position = reader_.ReadPosition();
-      end_position = reader_.ReadPosition();
-    }
-
-    field = Field::New(name, is_static, is_final, is_const,
-                       (flags & kIsReflectableFlag) != 0, is_late, script_class,
-                       type, position, end_position);
-
-    field.set_is_declared_in_bytecode(true);
-    field.set_has_pragma(has_pragma);
-    field.set_is_covariant((flags & kIsCovariantFlag) != 0);
-    field.set_is_generic_covariant_impl((flags & kIsGenericCovariantImplFlag) !=
-                                        0);
-    field.set_has_nontrivial_initializer(has_nontrivial_initializer);
-    field.set_is_extension_member(is_extension_member);
-    field.set_has_initializer(has_initializer);
-
-    if (!has_nontrivial_initializer) {
-      value ^= ReadObject();
-      if (is_static) {
-        if (field.is_late() && !has_initializer) {
-          field.SetStaticValue(Object::sentinel(), true);
-        } else {
-          field.SetStaticValue(value, true);
-        }
-      } else {
-        field.set_saved_initial_value(value);
-        // Null-initialized instance fields are tracked separately for each
-        // constructor (see handling of kHasNullableFieldsFlag).
-        if (!value.IsNull()) {
-          // Note: optimizer relies on DoubleInitialized bit in its
-          // field-unboxing heuristics.
-          // See JitCallSpecializer::VisitStoreInstanceField for more details.
-          field.RecordStore(value);
-          if (value.IsDouble()) {
-            field.set_is_double_initialized(true);
-          }
-        }
-      }
-    }
-
-    if ((flags & kHasInitializerCodeFlag) != 0) {
-      const intptr_t code_offset = reader_.ReadUInt();
-      field.set_bytecode_offset(code_offset +
-                                bytecode_component_->GetCodesOffset());
-      if (is_static) {
-        field.SetStaticValue(Object::sentinel(), true);
-      }
-    }
-
-    if ((flags & kHasGetterFlag) != 0) {
-      name ^= ReadObject();
-      function = Function::New(name,
-                               is_static ? FunctionLayout::kImplicitStaticGetter
-                                         : FunctionLayout::kImplicitGetter,
-                               is_static, is_const,
-                               false,  // is_abstract
-                               false,  // is_external
-                               false,  // is_native
-                               script_class, position);
-      function.set_end_token_pos(end_position);
-      function.set_result_type(type);
-      function.set_is_debuggable(false);
-      function.set_accessor_field(field);
-      function.set_is_declared_in_bytecode(true);
-      function.set_is_extension_member(is_extension_member);
-      if (is_const && has_nontrivial_initializer) {
-        function.set_bytecode_offset(field.bytecode_offset());
-      }
-      H.SetupFieldAccessorFunction(cls, function, type);
-      functions_->SetAt(function_index_++, function);
-    }
-
-    if ((flags & kHasSetterFlag) != 0) {
-      ASSERT(is_late || ((!is_static) && (!is_final)));
-      ASSERT(!is_const);
-      name ^= ReadObject();
-      function = Function::New(name, FunctionLayout::kImplicitSetter, is_static,
-                               false,  // is_const
-                               false,  // is_abstract
-                               false,  // is_external
-                               false,  // is_native
-                               script_class, position);
-      function.set_end_token_pos(end_position);
-      function.set_result_type(Object::void_type());
-      function.set_is_debuggable(false);
-      function.set_accessor_field(field);
-      function.set_is_declared_in_bytecode(true);
-      function.set_is_extension_member(is_extension_member);
-      H.SetupFieldAccessorFunction(cls, function, type);
-      functions_->SetAt(function_index_++, function);
-    }
-
-    if ((flags & kHasAnnotationsFlag) != 0) {
-      intptr_t annotations_offset =
-          reader_.ReadUInt() + bytecode_component_->GetAnnotationsOffset();
-      ASSERT(annotations_offset > 0);
-
-      if (FLAG_enable_mirrors || has_pragma) {
-        Library& library = Library::Handle(Z, cls.library());
-        library.AddFieldMetadata(field, TokenPosition::kNoSource, 0,
-                                 annotations_offset);
-        if (has_pragma) {
-          // TODO(alexmarkov): read annotations right away using
-          //  annotations_offset.
-          NoOOBMessageScope no_msg_scope(thread_);
-          NoReloadScope no_reload_scope(thread_->isolate(), thread_);
-          library.GetMetadata(field);
-        }
-      }
-    }
-
-    if ((flags & kHasAttributesFlag) != 0) {
-      ReadAttributes(field);
-    }
-
-    fields.SetAt(i, field);
-  }
-
-  if (cls.is_enum_class()) {
-    // Add static field 'const _deleted_enum_sentinel'.
-    field = Field::New(Symbols::_DeletedEnumSentinel(),
-                       /* is_static = */ true,
-                       /* is_final = */ true,
-                       /* is_const = */ true,
-                       /* is_reflectable = */ false,
-                       /* is_late = */ false, cls, Object::dynamic_type(),
-                       TokenPosition::kNoSource, TokenPosition::kNoSource);
-
-    fields.SetAt(num_fields, field);
-  }
-
-  if (!discard_fields) {
-    cls.SetFields(fields);
-  }
-
-  if (cls.IsTopLevel()) {
-    const Library& library = Library::Handle(Z, cls.library());
-    for (intptr_t i = 0, n = fields.Length(); i < n; ++i) {
-      field ^= fields.At(i);
-      name = field.name();
-      library.AddObject(field, name);
-    }
-  }
-}
-
-PatchClassPtr BytecodeReaderHelper::GetPatchClass(const Class& cls,
-                                                  const Script& script) {
-  if (patch_class_ != nullptr && patch_class_->patched_class() == cls.raw() &&
-      patch_class_->script() == script.raw()) {
-    return patch_class_->raw();
-  }
-  if (patch_class_ == nullptr) {
-    patch_class_ = &PatchClass::Handle(Z);
-  }
-  *patch_class_ = PatchClass::New(cls, script);
-  return patch_class_->raw();
-}
-
-void BytecodeReaderHelper::ReadFunctionDeclarations(const Class& cls) {
-  // Function flags, must be in sync with FunctionDeclaration constants in
-  // pkg/vm/lib/bytecode/declarations.dart.
-  const int kIsConstructorFlag = 1 << 0;
-  const int kIsGetterFlag = 1 << 1;
-  const int kIsSetterFlag = 1 << 2;
-  const int kIsFactoryFlag = 1 << 3;
-  const int kIsStaticFlag = 1 << 4;
-  const int kIsAbstractFlag = 1 << 5;
-  const int kIsConstFlag = 1 << 6;
-  const int kHasOptionalPositionalParamsFlag = 1 << 7;
-  const int kHasOptionalNamedParamsFlag = 1 << 8;
-  const int kHasTypeParamsFlag = 1 << 9;
-  const int kIsReflectableFlag = 1 << 10;
-  const int kIsDebuggableFlag = 1 << 11;
-  const int kIsAsyncFlag = 1 << 12;
-  const int kIsAsyncStarFlag = 1 << 13;
-  const int kIsSyncStarFlag = 1 << 14;
-  // const int kIsForwardingStubFlag = 1 << 15;
-  const int kIsNoSuchMethodForwarderFlag = 1 << 16;
-  const int kIsNativeFlag = 1 << 17;
-  const int kIsExternalFlag = 1 << 18;
-  const int kHasSourcePositionsFlag = 1 << 19;
-  const int kHasAnnotationsFlag = 1 << 20;
-  const int kHasPragmaFlag = 1 << 21;
-  const int kHasCustomScriptFlag = 1 << 22;
-  const int kHasAttributesFlag = 1 << 23;
-  const int kIsExtensionMemberFlag = 1 << 24;
-  const int kHasParameterFlagsFlag = 1 << 25;
-
-  const intptr_t num_functions = reader_.ReadListLength();
-  ASSERT(function_index_ + num_functions == functions_->Length());
-
-  if (function_index_ + num_functions == 0) {
-    return;
-  }
-
-  String& name = String::Handle(Z);
-  Object& script_class = Object::Handle(Z);
-  Function& function = Function::Handle(Z);
-  Array& parameter_types = Array::Handle(Z);
-  AbstractType& type = AbstractType::Handle(Z);
-
-  name = cls.ScrubbedName();
-  const bool is_async_await_completer_owner =
-      Symbols::_AsyncAwaitCompleter().Equals(name);
-
-  for (intptr_t i = 0; i < num_functions; ++i) {
-    intptr_t flags = reader_.ReadUInt();
-
-    const bool is_static = (flags & kIsStaticFlag) != 0;
-    const bool is_factory = (flags & kIsFactoryFlag) != 0;
-    const bool is_native = (flags & kIsNativeFlag) != 0;
-    const bool has_pragma = (flags & kHasPragmaFlag) != 0;
-    const bool is_extension_member = (flags & kIsExtensionMemberFlag) != 0;
-
-    name ^= ReadObject();
-
-    if ((flags & kHasCustomScriptFlag) != 0) {
-      Script& script = Script::CheckedHandle(Z, ReadObject());
-      script_class = GetPatchClass(cls, script);
-    } else {
-      script_class = cls.raw();
-    }
-
-    TokenPosition position = TokenPosition::kNoSource;
-    TokenPosition end_position = TokenPosition::kNoSource;
-    if ((flags & kHasSourcePositionsFlag) != 0) {
-      position = reader_.ReadPosition();
-      end_position = reader_.ReadPosition();
-    }
-
-    FunctionLayout::Kind kind = FunctionLayout::kRegularFunction;
-    if ((flags & kIsGetterFlag) != 0) {
-      kind = FunctionLayout::kGetterFunction;
-    } else if ((flags & kIsSetterFlag) != 0) {
-      kind = FunctionLayout::kSetterFunction;
-    } else if ((flags & (kIsConstructorFlag | kIsFactoryFlag)) != 0) {
-      kind = FunctionLayout::kConstructor;
-      name = ConstructorName(cls, name);
-    }
-
-    function = Function::New(name, kind, is_static, (flags & kIsConstFlag) != 0,
-                             (flags & kIsAbstractFlag) != 0,
-                             (flags & kIsExternalFlag) != 0, is_native,
-                             script_class, position);
-
-    const bool is_expression_evaluation =
-        (name.raw() == Symbols::DebugProcedureName().raw());
-
-    // Declare function scope as types (type parameters) in function
-    // signature may back-reference to the function being declared.
-    // At this moment, owner class is not fully loaded yet and it won't be
-    // able to serve function lookup requests.
-    FunctionScope function_scope(this, function, name, cls);
-
-    function.set_is_declared_in_bytecode(true);
-    function.set_has_pragma(has_pragma);
-    function.set_end_token_pos(end_position);
-    function.set_is_synthetic((flags & kIsNoSuchMethodForwarderFlag) != 0);
-    function.set_is_reflectable((flags & kIsReflectableFlag) != 0);
-    function.set_is_debuggable((flags & kIsDebuggableFlag) != 0);
-    function.set_is_extension_member(is_extension_member);
-
-    // _AsyncAwaitCompleter.start should be made non-visible in stack traces,
-    // since it is an implementation detail of our await/async desugaring.
-    if (is_async_await_completer_owner &&
-        Symbols::_AsyncAwaitStart().Equals(name)) {
-      function.set_is_visible(!FLAG_causal_async_stacks &&
-                              !FLAG_lazy_async_stacks);
-    }
-
-    if ((flags & kIsSyncStarFlag) != 0) {
-      function.set_modifier(FunctionLayout::kSyncGen);
-      function.set_is_visible(!FLAG_causal_async_stacks &&
-                              !FLAG_lazy_async_stacks);
-    } else if ((flags & kIsAsyncFlag) != 0) {
-      function.set_modifier(FunctionLayout::kAsync);
-      function.set_is_inlinable(!FLAG_causal_async_stacks &&
-                                !FLAG_lazy_async_stacks);
-      function.set_is_visible(!FLAG_causal_async_stacks &&
-                              !FLAG_lazy_async_stacks);
-    } else if ((flags & kIsAsyncStarFlag) != 0) {
-      function.set_modifier(FunctionLayout::kAsyncGen);
-      function.set_is_inlinable(!FLAG_causal_async_stacks &&
-                                !FLAG_lazy_async_stacks);
-      function.set_is_visible(!FLAG_causal_async_stacks &&
-                              !FLAG_lazy_async_stacks);
-    }
-
-    if ((flags & kHasTypeParamsFlag) != 0) {
-      ReadTypeParametersDeclaration(Class::Handle(Z), function);
-    }
-
-    const intptr_t num_implicit_params = (!is_static || is_factory) ? 1 : 0;
-    const intptr_t num_params = num_implicit_params + reader_.ReadUInt();
-
-    intptr_t num_required_params = num_params;
-    if ((flags & (kHasOptionalPositionalParamsFlag |
-                  kHasOptionalNamedParamsFlag)) != 0) {
-      num_required_params = num_implicit_params + reader_.ReadUInt();
-    }
-
-    function.set_num_fixed_parameters(num_required_params);
-    function.SetNumOptionalParameters(
-        num_params - num_required_params,
-        (flags & kHasOptionalNamedParamsFlag) == 0);
-
-    parameter_types = Array::New(num_params, Heap::kOld);
-    function.set_parameter_types(parameter_types);
-    function.CreateNameArrayIncludingFlags(Heap::kOld);
-
-    intptr_t param_index = 0;
-    if (!is_static) {
-      if (is_expression_evaluation) {
-        // Do not reference enclosing class as expression evaluation
-        // method logically belongs to another (real) class.
-        // Enclosing class is not registered and doesn't have
-        // a valid cid, so it can't be used in a type.
-        function.SetParameterTypeAt(param_index, AbstractType::dynamic_type());
-      } else {
-        function.SetParameterTypeAt(param_index, H.GetDeclarationType(cls));
-      }
-      function.SetParameterNameAt(param_index, Symbols::This());
-      ++param_index;
-    } else if (is_factory) {
-      function.SetParameterTypeAt(param_index, AbstractType::dynamic_type());
-      function.SetParameterNameAt(param_index,
-                                  Symbols::TypeArgumentsParameter());
-      ++param_index;
-    }
-
-    for (; param_index < num_params; ++param_index) {
-      name ^= ReadObject();
-      function.SetParameterNameAt(param_index, name);
-      type ^= ReadObject();
-      function.SetParameterTypeAt(param_index, type);
-    }
-
-    if ((flags & kHasParameterFlagsFlag) != 0) {
-      const intptr_t length = reader_.ReadUInt();
-      const intptr_t offset = function.NumImplicitParameters();
-      for (intptr_t i = 0; i < length; i++) {
-        const intptr_t param_flags = reader_.ReadUInt();
-        if ((param_flags & Parameter::kIsRequiredFlag) != 0) {
-          RELEASE_ASSERT(function.HasOptionalNamedParameters());
-          RELEASE_ASSERT(i + offset >= function.num_fixed_parameters());
-          function.SetIsRequiredAt(i + offset);
-        }
-      }
-    }
-    function.TruncateUnusedParameterFlags();
-
-    type ^= ReadObject();
-    function.set_result_type(type);
-
-    if (is_native) {
-      name ^= ReadObject();
-      function.set_native_name(name);
-    }
-
-    if ((flags & kIsAbstractFlag) == 0) {
-      const intptr_t code_offset = reader_.ReadUInt();
-      function.set_bytecode_offset(code_offset +
-                                   bytecode_component_->GetCodesOffset());
-    }
-
-    if ((flags & kHasAnnotationsFlag) != 0) {
-      const intptr_t annotations_offset =
-          reader_.ReadUInt() + bytecode_component_->GetAnnotationsOffset();
-      ASSERT(annotations_offset > 0);
-
-      if (FLAG_enable_mirrors || has_pragma) {
-        Library& library = Library::Handle(Z, cls.library());
-        library.AddFunctionMetadata(function, TokenPosition::kNoSource, 0,
-                                    annotations_offset);
-
-        if (has_pragma) {
-          if (H.constants().IsNull() &&
-              library.raw() == Library::CoreLibrary()) {
-            // Bootstrapping, need to postpone evaluation of pragma annotations
-            // as classes are not fully loaded/finalized yet.
-            const auto& pragma_funcs = GrowableObjectArray::Handle(
-                Z, H.EnsurePotentialPragmaFunctions());
-            pragma_funcs.Add(function);
-          } else {
-            // TODO(alexmarkov): read annotations right away using
-            //  annotations_offset.
-            Thread* thread = H.thread();
-            NoOOBMessageScope no_msg_scope(thread);
-            NoReloadScope no_reload_scope(thread->isolate(), thread);
-            library.GetMetadata(function);
-          }
-        }
-      }
-    }
-
-    if ((flags & kHasAttributesFlag) != 0) {
-      ASSERT(!is_expression_evaluation);
-      ReadAttributes(function);
-    }
-
-    if (is_expression_evaluation) {
-      H.SetExpressionEvaluationFunction(function);
-      // Read bytecode of expression evaluation function eagerly,
-      // while expression_evaluation_library_ and FunctionScope
-      // are still set, as its constant pool may reference back to a library
-      // or a function which are not registered and cannot be looked up.
-      ASSERT(!function.is_abstract());
-      ASSERT(function.bytecode_offset() != 0);
-      // Replace class of the function in scope as we're going to look for
-      // expression evaluation function in a real class.
-      if (!cls.IsTopLevel()) {
-        scoped_function_class_ = H.GetExpressionEvaluationRealClass();
-      }
-      CompilerState compiler_state(thread_, FLAG_precompiled_mode);
-      ReadCode(function, function.bytecode_offset());
-    }
-
-    functions_->SetAt(function_index_++, function);
-  }
-
-  cls.SetFunctions(*functions_);
-
-  if (cls.IsTopLevel()) {
-    const Library& library = Library::Handle(Z, cls.library());
-    for (intptr_t i = 0, n = functions_->Length(); i < n; ++i) {
-      function ^= functions_->At(i);
-      name = function.name();
-      library.AddObject(function, name);
-    }
-  }
-
-  functions_ = nullptr;
-}
-
-void BytecodeReaderHelper::LoadReferencedClass(const Class& cls) {
-  ASSERT(!cls.is_declaration_loaded());
-
-  if (!cls.is_declared_in_bytecode()) {
-    cls.EnsureDeclarationLoaded();
-    return;
-  }
-
-  const auto& script = Script::Handle(Z, cls.script());
-  if (H.GetKernelProgramInfo().raw() != script.kernel_program_info()) {
-    // Class comes from a different binary.
-    cls.EnsureDeclarationLoaded();
-    return;
-  }
-
-  // We can reuse current BytecodeReaderHelper.
-  ActiveClassScope active_class_scope(active_class_, &cls);
-  AlternativeReadingScope alt(&reader_, cls.bytecode_offset());
-  ReadClassDeclaration(cls);
-}
-
-void BytecodeReaderHelper::ReadClassDeclaration(const Class& cls) {
-  // Class flags, must be in sync with ClassDeclaration constants in
-  // pkg/vm/lib/bytecode/declarations.dart.
-  const int kIsAbstractFlag = 1 << 0;
-  const int kIsEnumFlag = 1 << 1;
-  const int kHasTypeParamsFlag = 1 << 2;
-  const int kHasTypeArgumentsFlag = 1 << 3;
-  const int kIsTransformedMixinApplicationFlag = 1 << 4;
-  const int kHasSourcePositionsFlag = 1 << 5;
-  const int kHasAnnotationsFlag = 1 << 6;
-  const int kHasPragmaFlag = 1 << 7;
-
-  // Class is allocated when reading library declaration in
-  // BytecodeReaderHelper::ReadLibraryDeclaration.
-  // Its cid is set in Class::New / Isolate::RegisterClass /
-  // ClassTable::Register, unless it was loaded for expression evaluation.
-  ASSERT(cls.is_declared_in_bytecode());
-  ASSERT(!cls.is_declaration_loaded() || loading_native_wrappers_library_);
-
-  const intptr_t flags = reader_.ReadUInt();
-  const bool has_pragma = (flags & kHasPragmaFlag) != 0;
-
-  // Set early to enable access to type_parameters().
-  // TODO(alexmarkov): revise early stamping of native wrapper classes
-  //  as loaded.
-  if (!cls.is_declaration_loaded()) {
-    cls.set_is_declaration_loaded();
-  }
-
-  const auto& script = Script::CheckedHandle(Z, ReadObject());
-  cls.set_script(script);
-
-  TokenPosition position = TokenPosition::kNoSource;
-  TokenPosition end_position = TokenPosition::kNoSource;
-  if ((flags & kHasSourcePositionsFlag) != 0) {
-    position = reader_.ReadPosition();
-    end_position = reader_.ReadPosition();
-    cls.set_token_pos(position);
-    cls.set_end_token_pos(end_position);
-  }
-
-  cls.set_has_pragma(has_pragma);
-
-  if ((flags & kIsAbstractFlag) != 0) {
-    cls.set_is_abstract();
-  }
-  if ((flags & kIsEnumFlag) != 0) {
-    cls.set_is_enum_class();
-  }
-  if ((flags & kIsTransformedMixinApplicationFlag) != 0) {
-    cls.set_is_transformed_mixin_application();
-  }
-
-  intptr_t num_type_arguments = 0;
-  if ((flags & kHasTypeArgumentsFlag) != 0) {
-    num_type_arguments = reader_.ReadUInt();
-  }
-  cls.set_num_type_arguments(num_type_arguments);
-
-  if ((flags & kHasTypeParamsFlag) != 0) {
-    ReadTypeParametersDeclaration(cls, Function::null_function());
-  }
-
-  auto& type = AbstractType::CheckedHandle(Z, ReadObject());
-  cls.set_super_type(type);
-
-  const intptr_t num_interfaces = reader_.ReadUInt();
-  if (num_interfaces > 0) {
-    const auto& interfaces =
-        Array::Handle(Z, Array::New(num_interfaces, Heap::kOld));
-    for (intptr_t i = 0; i < num_interfaces; ++i) {
-      type ^= ReadObject();
-      interfaces.SetAt(i, type);
-    }
-    cls.set_interfaces(interfaces);
-  }
-
-  if ((flags & kHasAnnotationsFlag) != 0) {
-    intptr_t annotations_offset =
-        reader_.ReadUInt() + bytecode_component_->GetAnnotationsOffset();
-    ASSERT(annotations_offset > 0);
-
-    if (FLAG_enable_mirrors || has_pragma) {
-      const auto& library = Library::Handle(Z, cls.library());
-      if (cls.IsTopLevel()) {
-        ASSERT(!has_pragma);
-        library.AddLibraryMetadata(cls, TokenPosition::kNoSource, 0,
-                                   annotations_offset);
-      } else {
-        const auto& top_level_class =
-            Class::Handle(Z, library.toplevel_class());
-
-        library.AddClassMetadata(cls, top_level_class, TokenPosition::kNoSource,
-                                 0, annotations_offset);
-      }
-    }
-  }
-
-  const intptr_t members_offset = reader_.ReadUInt();
-  cls.set_bytecode_offset(members_offset +
-                          bytecode_component_->GetMembersOffset());
-
-  // All types are finalized if loading from bytecode.
-  // TODO(alexmarkov): revise early stamping of native wrapper classes
-  //  as type-finalized.
-  if (!cls.is_type_finalized()) {
-    cls.set_is_type_finalized();
-  }
-
-  // Avoid registering expression evaluation class in a hierarchy, as
-  // it doesn't have cid and shouldn't be found when enumerating subclasses.
-  if (expression_evaluation_library_ == nullptr) {
-    // TODO(alexmarkov): move this to class finalization.
-    ClassFinalizer::RegisterClassInHierarchy(Z, cls);
-  }
-}
-
-void BytecodeReaderHelper::ReadLibraryDeclaration(const Library& library,
-                                                  bool lookup_classes) {
-  // Library flags, must be in sync with LibraryDeclaration constants in
-  // pkg/vm/lib/bytecode/declarations.dart.
-  const int kUsesDartMirrorsFlag = 1 << 0;
-  const int kUsesDartFfiFlag = 1 << 1;
-  const int kHasExtensionsFlag = 1 << 2;
-  const int kIsNonNullableByDefaultFlag = 1 << 3;
-
-  ASSERT(library.is_declared_in_bytecode());
-  ASSERT(!library.Loaded());
-  ASSERT(library.toplevel_class() == Object::null());
-
-  // TODO(alexmarkov): fill in library.used_scripts.
-
-  const intptr_t flags = reader_.ReadUInt();
-  if (((flags & kUsesDartMirrorsFlag) != 0) && !FLAG_enable_mirrors) {
-    H.ReportError(
-        "import of dart:mirrors is not supported in the current Dart runtime");
-  }
-  if (((flags & kUsesDartFfiFlag) != 0) && !Api::IsFfiEnabled()) {
-    H.ReportError(
-        "import of dart:ffi is not supported in the current Dart runtime");
-  }
-
-  auto& name = String::CheckedHandle(Z, ReadObject());
-  library.SetName(name);
-
-  const auto& script = Script::CheckedHandle(Z, ReadObject());
-
-  if ((flags & kHasExtensionsFlag) != 0) {
-    const intptr_t num_extensions = reader_.ReadUInt();
-    auto& import_namespace = Namespace::Handle(Z);
-    auto& native_library = Library::Handle(Z);
-    for (intptr_t i = 0; i < num_extensions; ++i) {
-      name ^= ReadObject();
-      ASSERT(name.StartsWith(Symbols::DartExtensionScheme()));
-
-      // Create a dummy library and add it as an import to the current library.
-      // Actual loading occurs in KernelLoader::LoadNativeExtensionLibraries().
-      // This also allows later to discover and reload this native extension,
-      // e.g. when running from an app-jit snapshot.
-      // See Loader::ReloadNativeExtensions(...) which relies on
-      // Dart_GetImportsOfScheme('dart-ext').
-      native_library = Library::New(name);
-      import_namespace = Namespace::New(native_library, Array::null_array(),
-                                        Array::null_array());
-      library.AddImport(import_namespace);
-    }
-    H.AddPotentialExtensionLibrary(library);
-  }
-
-  if ((flags & kIsNonNullableByDefaultFlag) != 0) {
-    library.set_is_nnbd(true);
-  }
-
-  // The bootstrapper will take care of creating the native wrapper classes,
-  // but we will add the synthetic constructors to them here.
-  if (name.raw() ==
-      Symbols::Symbol(Symbols::kDartNativeWrappersLibNameId).raw()) {
-    ASSERT(library.LoadInProgress());
-    loading_native_wrappers_library_ = true;
-  } else {
-    loading_native_wrappers_library_ = false;
-    library.SetLoadInProgress();
-  }
-
-  const bool register_class = !IsExpressionEvaluationLibrary(library);
-
-  const intptr_t num_classes = reader_.ReadUInt();
-  ASSERT(num_classes > 0);
-  auto& cls = Class::Handle(Z);
-
-  for (intptr_t i = 0; i < num_classes; ++i) {
-    name ^= ReadObject();
-    const intptr_t class_offset =
-        bytecode_component_->GetClassesOffset() + reader_.ReadUInt();
-
-    if (i == 0) {
-      ASSERT(name.raw() == Symbols::Empty().raw());
-      cls = Class::New(library, Symbols::TopLevel(), script,
-                       TokenPosition::kNoSource, register_class);
-      library.set_toplevel_class(cls);
-    } else {
-      if (lookup_classes) {
-        cls = library.LookupLocalClass(name);
-      }
-      if (lookup_classes && !cls.IsNull()) {
-        ASSERT(!cls.is_declaration_loaded() ||
-               loading_native_wrappers_library_);
-        cls.set_script(script);
-      } else {
-        cls = Class::New(library, name, script, TokenPosition::kNoSource,
-                         register_class);
-        if (register_class) {
-          library.AddClass(cls);
-        }
-      }
-    }
-
-    cls.set_is_declared_in_bytecode(true);
-    cls.set_bytecode_offset(class_offset);
-
-    if (loading_native_wrappers_library_ || !register_class) {
-      AlternativeReadingScope alt(&reader_, class_offset);
-      ReadClassDeclaration(cls);
-      ActiveClassScope active_class_scope(active_class_, &cls);
-      AlternativeReadingScope alt2(&reader_, cls.bytecode_offset());
-      ReadMembers(cls, /* discard_fields = */ false);
-    }
-  }
-
-  ASSERT(!library.Loaded());
-  library.SetLoaded();
-
-  loading_native_wrappers_library_ = false;
-}
-
-void BytecodeReaderHelper::ReadLibraryDeclarations(intptr_t num_libraries) {
-  auto& library = Library::Handle(Z);
-  auto& uri = String::Handle(Z);
-
-  for (intptr_t i = 0; i < num_libraries; ++i) {
-    uri ^= ReadObject();
-    const intptr_t library_offset =
-        bytecode_component_->GetLibrariesOffset() + reader_.ReadUInt();
-
-    if (!FLAG_precompiled_mode && !I->should_load_vmservice()) {
-      if (uri.raw() == Symbols::DartVMServiceIO().raw()) {
-        continue;
-      }
-    }
-
-    bool lookup_classes = true;
-    library = Library::LookupLibrary(thread_, uri);
-    if (library.IsNull()) {
-      lookup_classes = false;
-      library = Library::New(uri);
-
-      if (uri.raw() == Symbols::EvalSourceUri().raw()) {
-        ASSERT(expression_evaluation_library_ == nullptr);
-        expression_evaluation_library_ = &Library::Handle(Z, library.raw());
-      } else {
-        library.Register(thread_);
-      }
-    }
-
-    if (library.Loaded()) {
-      continue;
-    }
-
-    library.set_is_declared_in_bytecode(true);
-    library.set_bytecode_offset(library_offset);
-
-    AlternativeReadingScope alt(&reader_, library_offset);
-    ReadLibraryDeclaration(library, lookup_classes);
-  }
-}
-
-void BytecodeReaderHelper::FindAndReadSpecificLibrary(const Library& library,
-                                                      intptr_t num_libraries) {
-  auto& uri = String::Handle(Z);
-  for (intptr_t i = 0; i < num_libraries; ++i) {
-    uri ^= ReadObject();
-    const intptr_t library_offset =
-        bytecode_component_->GetLibrariesOffset() + reader_.ReadUInt();
-
-    if (uri.raw() == library.url()) {
-      library.set_is_declared_in_bytecode(true);
-      library.set_bytecode_offset(library_offset);
-
-      AlternativeReadingScope alt(&reader_, library_offset);
-      ReadLibraryDeclaration(library, /* lookup_classes = */ true);
-      return;
-    }
-  }
-}
-
-void BytecodeReaderHelper::FindModifiedLibrariesForHotReload(
-    BitVector* modified_libs,
-    intptr_t num_libraries) {
-  auto& uri = String::Handle(Z);
-  auto& lib = Library::Handle(Z);
-  for (intptr_t i = 0; i < num_libraries; ++i) {
-    uri ^= ReadObject();
-    reader_.ReadUInt();  // Skip offset.
-
-    lib = Library::LookupLibrary(thread_, uri);
-    if (!lib.IsNull() && !lib.is_dart_scheme()) {
-      // This is a library that already exists so mark it as being modified.
-      modified_libs->Add(lib.index());
-    }
-  }
-}
-
-void BytecodeReaderHelper::ReadParameterCovariance(
-    const Function& function,
-    BitVector* is_covariant,
-    BitVector* is_generic_covariant_impl) {
-  ASSERT(function.is_declared_in_bytecode());
-
-  const intptr_t num_params = function.NumParameters();
-  ASSERT(is_covariant->length() == num_params);
-  ASSERT(is_generic_covariant_impl->length() == num_params);
-
-  AlternativeReadingScope alt(&reader_, function.bytecode_offset());
-
-  const intptr_t code_flags = reader_.ReadUInt();
-  if ((code_flags & Code::kHasParameterFlagsFlag) != 0) {
-    const intptr_t num_explicit_params = reader_.ReadUInt();
-    ASSERT(num_params ==
-           function.NumImplicitParameters() + num_explicit_params);
-
-    for (intptr_t i = function.NumImplicitParameters(); i < num_params; ++i) {
-      const intptr_t flags = reader_.ReadUInt();
-
-      if ((flags & Parameter::kIsCovariantFlag) != 0) {
-        is_covariant->Add(i);
-      }
-      if ((flags & Parameter::kIsGenericCovariantImplFlag) != 0) {
-        is_generic_covariant_impl->Add(i);
-      }
-    }
-  }
-}
-
-ObjectPtr BytecodeReaderHelper::BuildParameterDescriptor(
-    const Function& function) {
-  ASSERT(function.is_declared_in_bytecode());
-
-  Object& result = Object::Handle(Z);
-  if (!function.HasBytecode()) {
-    result = BytecodeReader::ReadFunctionBytecode(Thread::Current(), function);
-    if (result.IsError()) {
-      return result.raw();
-    }
-  }
-
-  const intptr_t num_params = function.NumParameters();
-  const intptr_t num_implicit_params = function.NumImplicitParameters();
-  const intptr_t num_explicit_params = num_params - num_implicit_params;
-  const Array& descriptor = Array::Handle(
-      Z, Array::New(num_explicit_params * Parser::kParameterEntrySize));
-
-  // 1. Find isFinal in the Code declaration.
-  bool found_final = false;
-  if (!function.is_abstract()) {
-    AlternativeReadingScope alt(&reader_, function.bytecode_offset());
-    const intptr_t code_flags = reader_.ReadUInt();
-
-    if ((code_flags & Code::kHasParameterFlagsFlag) != 0) {
-      const intptr_t num_explicit_params_written = reader_.ReadUInt();
-      ASSERT(num_explicit_params == num_explicit_params_written);
-      for (intptr_t i = 0; i < num_explicit_params; ++i) {
-        const intptr_t flags = reader_.ReadUInt();
-        descriptor.SetAt(
-            i * Parser::kParameterEntrySize + Parser::kParameterIsFinalOffset,
-            Bool::Get((flags & Parameter::kIsFinalFlag) != 0));
-      }
-      found_final = true;
-    }
-  }
-  if (!found_final) {
-    for (intptr_t i = 0; i < num_explicit_params; ++i) {
-      descriptor.SetAt(
-          i * Parser::kParameterEntrySize + Parser::kParameterIsFinalOffset,
-          Bool::Get(false));
-    }
-  }
-
-  // 2. Find metadata implicitly after the function declaration's metadata.
-  const Class& klass = Class::Handle(Z, function.Owner());
-  const Library& library = Library::Handle(Z, klass.library());
-  const Object& metadata = Object::Handle(
-      Z, library.GetExtendedMetadata(function, num_explicit_params));
-  if (metadata.IsError()) {
-    return metadata.raw();
-  }
-  if (Array::Cast(metadata).Length() != 0) {
-    for (intptr_t i = 0; i < num_explicit_params; i++) {
-      result = Array::Cast(metadata).At(i);
-      descriptor.SetAt(
-          i * Parser::kParameterEntrySize + Parser::kParameterMetadataOffset,
-          result);
-    }
-  }
-
-  // 3. Find the defaultValues in the EntryOptional sequence.
-  if (!function.is_abstract()) {
-    const Bytecode& bytecode = Bytecode::Handle(Z, function.bytecode());
-    ASSERT(!bytecode.IsNull());
-    const ObjectPool& constants = ObjectPool::Handle(Z, bytecode.object_pool());
-    ASSERT(!constants.IsNull());
-    const KBCInstr* instr =
-        reinterpret_cast<const KBCInstr*>(bytecode.PayloadStart());
-    if (KernelBytecode::IsEntryOptionalOpcode(instr)) {
-      // Note that number of fixed parameters may not match 'A' operand of
-      // EntryOptional bytecode as [function] could be an implicit closure
-      // function with an extra implicit argument, while bytecode corresponds
-      // to a static function without any implicit arguments.
-      const intptr_t num_fixed_params = function.num_fixed_parameters();
-      const intptr_t num_opt_pos_params = KernelBytecode::DecodeB(instr);
-      const intptr_t num_opt_named_params = KernelBytecode::DecodeC(instr);
-      instr = KernelBytecode::Next(instr);
-      ASSERT(num_opt_pos_params == function.NumOptionalPositionalParameters());
-      ASSERT(num_opt_named_params == function.NumOptionalNamedParameters());
-      ASSERT((num_opt_pos_params == 0) || (num_opt_named_params == 0));
-
-      for (intptr_t i = 0; i < num_opt_pos_params; i++) {
-        const KBCInstr* load_value_instr = instr;
-        instr = KernelBytecode::Next(instr);
-        ASSERT(KernelBytecode::IsLoadConstantOpcode(load_value_instr));
-        result = constants.ObjectAt(KernelBytecode::DecodeE(load_value_instr));
-        descriptor.SetAt((num_fixed_params - num_implicit_params + i) *
-                                 Parser::kParameterEntrySize +
-                             Parser::kParameterDefaultValueOffset,
-                         result);
-      }
-      for (intptr_t i = 0; i < num_opt_named_params; i++) {
-        const KBCInstr* load_name_instr = instr;
-        const KBCInstr* load_value_instr =
-            KernelBytecode::Next(load_name_instr);
-        instr = KernelBytecode::Next(load_value_instr);
-        ASSERT(KernelBytecode::IsLoadConstantOpcode(load_name_instr));
-        result = constants.ObjectAt(KernelBytecode::DecodeE(load_name_instr));
-        intptr_t param_index;
-        for (param_index = num_fixed_params; param_index < num_params;
-             param_index++) {
-          if (function.ParameterNameAt(param_index) == result.raw()) {
-            break;
-          }
-        }
-        ASSERT(param_index < num_params);
-        ASSERT(KernelBytecode::IsLoadConstantOpcode(load_value_instr));
-        result = constants.ObjectAt(KernelBytecode::DecodeE(load_value_instr));
-        descriptor.SetAt(
-            (param_index - num_implicit_params) * Parser::kParameterEntrySize +
-                Parser::kParameterDefaultValueOffset,
-            result);
-      }
-    }
-  }
-
-  return descriptor.raw();
-}
-
-void BytecodeReaderHelper::ParseBytecodeFunction(
-    ParsedFunction* parsed_function,
-    const Function& function) {
-  // Handle function kinds which don't have a user-defined body first.
-  switch (function.kind()) {
-    case FunctionLayout::kImplicitClosureFunction:
-      ParseForwarderFunction(parsed_function, function,
-                             Function::Handle(Z, function.parent_function()));
-      return;
-    case FunctionLayout::kDynamicInvocationForwarder:
-      ParseForwarderFunction(parsed_function, function,
-                             Function::Handle(Z, function.ForwardingTarget()));
-      return;
-    case FunctionLayout::kImplicitGetter:
-    case FunctionLayout::kImplicitSetter:
-    case FunctionLayout::kMethodExtractor:
-      BytecodeScopeBuilder(parsed_function).BuildScopes();
-      return;
-    case FunctionLayout::kImplicitStaticGetter: {
-      if (IsStaticFieldGetterGeneratedAsInitializer(function, Z)) {
-        break;
-      } else {
-        BytecodeScopeBuilder(parsed_function).BuildScopes();
-        return;
-      }
-    }
-    case FunctionLayout::kRegularFunction:
-    case FunctionLayout::kGetterFunction:
-    case FunctionLayout::kSetterFunction:
-    case FunctionLayout::kClosureFunction:
-    case FunctionLayout::kConstructor:
-    case FunctionLayout::kFieldInitializer:
-      break;
-    case FunctionLayout::kNoSuchMethodDispatcher:
-    case FunctionLayout::kInvokeFieldDispatcher:
-    case FunctionLayout::kSignatureFunction:
-    case FunctionLayout::kIrregexpFunction:
-    case FunctionLayout::kFfiTrampoline:
-      UNREACHABLE();
-      break;
-  }
-
-  // We only reach here if function has a bytecode body. Make sure it is
-  // loaded and collect information about covariant parameters.
-
-  if (!function.HasBytecode()) {
-    ReadCode(function, function.bytecode_offset());
-    ASSERT(function.HasBytecode());
-  }
-
-  // TODO(alexmarkov): simplify access to covariant / generic_covariant_impl
-  //  flags of parameters so we won't need to read them separately.
-  if (!parsed_function->HasCovariantParametersInfo()) {
-    const intptr_t num_params = function.NumParameters();
-    BitVector* covariant_parameters = new (Z) BitVector(Z, num_params);
-    BitVector* generic_covariant_impl_parameters =
-        new (Z) BitVector(Z, num_params);
-    ReadParameterCovariance(function, covariant_parameters,
-                            generic_covariant_impl_parameters);
-    parsed_function->SetCovariantParameters(covariant_parameters);
-    parsed_function->SetGenericCovariantImplParameters(
-        generic_covariant_impl_parameters);
-  }
-}
-
-void BytecodeReaderHelper::ParseForwarderFunction(
-    ParsedFunction* parsed_function,
-    const Function& function,
-    const Function& target) {
-  ASSERT(function.IsImplicitClosureFunction() ||
-         function.IsDynamicInvocationForwarder());
-
-  ASSERT(target.is_declared_in_bytecode());
-
-  if (function.IsDynamicInvocationForwarder() &&
-      target.IsImplicitSetterFunction()) {
-    BytecodeScopeBuilder(parsed_function).BuildScopes();
-    return;
-  }
-
-  if (!target.HasBytecode()) {
-    ReadCode(target, target.bytecode_offset());
-  }
-
-  BytecodeScopeBuilder(parsed_function).BuildScopes();
-
-  const auto& target_bytecode = Bytecode::Handle(Z, target.bytecode());
-  const auto& obj_pool = ObjectPool::Handle(Z, target_bytecode.object_pool());
-
-  AlternativeReadingScope alt(&reader_, target.bytecode_offset());
-
-  const intptr_t flags = reader_.ReadUInt();
-  const bool has_parameter_flags = (flags & Code::kHasParameterFlagsFlag) != 0;
-  const bool has_forwarding_stub_target =
-      (flags & Code::kHasForwardingStubTargetFlag) != 0;
-  const bool has_default_function_type_args =
-      (flags & Code::kHasDefaultFunctionTypeArgsFlag) != 0;
-  const auto proc_attrs = kernel::ProcedureAttributesOf(target, Z);
-  // TODO(alexmarkov): fix building of flow graph for implicit closures so
-  // it would include missing checks and remove 'proc_attrs.has_tearoff_uses'
-  // from this condition.
-  const bool body_has_generic_covariant_impl_type_checks =
-      proc_attrs.has_non_this_uses || proc_attrs.has_tearoff_uses;
-
-  if (has_parameter_flags) {
-    const intptr_t num_params = reader_.ReadUInt();
-    const intptr_t num_implicit_params = function.NumImplicitParameters();
-    for (intptr_t i = 0; i < num_params; ++i) {
-      const intptr_t flags = reader_.ReadUInt();
-
-      bool is_covariant = (flags & Parameter::kIsCovariantFlag) != 0;
-      bool is_generic_covariant_impl =
-          (flags & Parameter::kIsGenericCovariantImplFlag) != 0;
-
-      LocalVariable* variable =
-          parsed_function->ParameterVariable(num_implicit_params + i);
-
-      if (is_covariant) {
-        variable->set_is_explicit_covariant_parameter();
-      }
-
-      const bool checked_in_method_body =
-          is_covariant || (is_generic_covariant_impl &&
-                           body_has_generic_covariant_impl_type_checks);
-
-      if (checked_in_method_body) {
-        variable->set_type_check_mode(LocalVariable::kSkipTypeCheck);
-      } else {
-        ASSERT(variable->type_check_mode() == LocalVariable::kDoTypeCheck);
-      }
-    }
-  }
-
-  if (has_forwarding_stub_target) {
-    const intptr_t cp_index = reader_.ReadUInt();
-    const auto& forwarding_stub_target =
-        Function::CheckedZoneHandle(Z, obj_pool.ObjectAt(cp_index));
-    parsed_function->MarkForwardingStub(&forwarding_stub_target);
-  }
-
-  if (has_default_function_type_args) {
-    ASSERT(function.IsGeneric());
-    const intptr_t cp_index = reader_.ReadUInt();
-    const auto& type_args =
-        TypeArguments::CheckedHandle(Z, obj_pool.ObjectAt(cp_index));
-    parsed_function->SetDefaultFunctionTypeArguments(type_args);
-  }
-
-  if (function.HasOptionalParameters()) {
-    const KBCInstr* raw_bytecode =
-        reinterpret_cast<const KBCInstr*>(target_bytecode.PayloadStart());
-    const KBCInstr* entry = raw_bytecode;
-    raw_bytecode = KernelBytecode::Next(raw_bytecode);
-    ASSERT(KernelBytecode::IsEntryOptionalOpcode(entry));
-    ASSERT(KernelBytecode::DecodeB(entry) ==
-           function.NumOptionalPositionalParameters());
-    ASSERT(KernelBytecode::DecodeC(entry) ==
-           function.NumOptionalNamedParameters());
-
-    const intptr_t num_opt_params = function.NumOptionalParameters();
-    ZoneGrowableArray<const Instance*>* default_values =
-        new (Z) ZoneGrowableArray<const Instance*>(Z, num_opt_params);
-
-    if (function.HasOptionalPositionalParameters()) {
-      for (intptr_t i = 0, n = function.NumOptionalPositionalParameters();
-           i < n; ++i) {
-        const KBCInstr* load = raw_bytecode;
-        raw_bytecode = KernelBytecode::Next(raw_bytecode);
-        ASSERT(KernelBytecode::IsLoadConstantOpcode(load));
-        const auto& value = Instance::CheckedZoneHandle(
-            Z, obj_pool.ObjectAt(KernelBytecode::DecodeE(load)));
-        default_values->Add(&value);
-      }
-    } else {
-      const intptr_t num_fixed_params = function.num_fixed_parameters();
-      auto& param_name = String::Handle(Z);
-      default_values->EnsureLength(num_opt_params, nullptr);
-      for (intptr_t i = 0; i < num_opt_params; ++i) {
-        const KBCInstr* load_name = raw_bytecode;
-        const KBCInstr* load_value = KernelBytecode::Next(load_name);
-        raw_bytecode = KernelBytecode::Next(load_value);
-        ASSERT(KernelBytecode::IsLoadConstantOpcode(load_name));
-        ASSERT(KernelBytecode::IsLoadConstantOpcode(load_value));
-        param_name ^= obj_pool.ObjectAt(KernelBytecode::DecodeE(load_name));
-        const auto& value = Instance::CheckedZoneHandle(
-            Z, obj_pool.ObjectAt(KernelBytecode::DecodeE(load_value)));
-
-        const intptr_t num_params = function.NumParameters();
-        intptr_t param_index = num_fixed_params;
-        for (; param_index < num_params; ++param_index) {
-          if (function.ParameterNameAt(param_index) == param_name.raw()) {
-            break;
-          }
-        }
-        ASSERT(param_index < num_params);
-        ASSERT(default_values->At(param_index - num_fixed_params) == nullptr);
-        (*default_values)[param_index - num_fixed_params] = &value;
-      }
-    }
-
-    parsed_function->set_default_parameter_values(default_values);
-  }
-}
-
-LibraryPtr BytecodeReaderHelper::ReadMain() {
-  return Library::RawCast(ReadObject());
-}
-
-intptr_t BytecodeComponentData::GetVersion() const {
-  return Smi::Value(Smi::RawCast(data_.At(kVersion)));
-}
-
-intptr_t BytecodeComponentData::GetStringsHeaderOffset() const {
-  return Smi::Value(Smi::RawCast(data_.At(kStringsHeaderOffset)));
-}
-
-intptr_t BytecodeComponentData::GetStringsContentsOffset() const {
-  return Smi::Value(Smi::RawCast(data_.At(kStringsContentsOffset)));
-}
-
-intptr_t BytecodeComponentData::GetObjectOffsetsOffset() const {
-  return Smi::Value(Smi::RawCast(data_.At(kObjectOffsetsOffset)));
-}
-
-intptr_t BytecodeComponentData::GetNumObjects() const {
-  return Smi::Value(Smi::RawCast(data_.At(kNumObjects)));
-}
-
-intptr_t BytecodeComponentData::GetObjectsContentsOffset() const {
-  return Smi::Value(Smi::RawCast(data_.At(kObjectsContentsOffset)));
-}
-
-intptr_t BytecodeComponentData::GetMainOffset() const {
-  return Smi::Value(Smi::RawCast(data_.At(kMainOffset)));
-}
-
-intptr_t BytecodeComponentData::GetNumLibraries() const {
-  return Smi::Value(Smi::RawCast(data_.At(kNumLibraries)));
-}
-
-intptr_t BytecodeComponentData::GetLibraryIndexOffset() const {
-  return Smi::Value(Smi::RawCast(data_.At(kLibraryIndexOffset)));
-}
-
-intptr_t BytecodeComponentData::GetLibrariesOffset() const {
-  return Smi::Value(Smi::RawCast(data_.At(kLibrariesOffset)));
-}
-
-intptr_t BytecodeComponentData::GetNumClasses() const {
-  return Smi::Value(Smi::RawCast(data_.At(kNumClasses)));
-}
-
-intptr_t BytecodeComponentData::GetClassesOffset() const {
-  return Smi::Value(Smi::RawCast(data_.At(kClassesOffset)));
-}
-
-intptr_t BytecodeComponentData::GetMembersOffset() const {
-  return Smi::Value(Smi::RawCast(data_.At(kMembersOffset)));
-}
-
-intptr_t BytecodeComponentData::GetNumCodes() const {
-  return Smi::Value(Smi::RawCast(data_.At(kNumCodes)));
-}
-
-intptr_t BytecodeComponentData::GetCodesOffset() const {
-  return Smi::Value(Smi::RawCast(data_.At(kCodesOffset)));
-}
-
-intptr_t BytecodeComponentData::GetSourcePositionsOffset() const {
-  return Smi::Value(Smi::RawCast(data_.At(kSourcePositionsOffset)));
-}
-
-intptr_t BytecodeComponentData::GetSourceFilesOffset() const {
-  return Smi::Value(Smi::RawCast(data_.At(kSourceFilesOffset)));
-}
-
-intptr_t BytecodeComponentData::GetLineStartsOffset() const {
-  return Smi::Value(Smi::RawCast(data_.At(kLineStartsOffset)));
-}
-
-intptr_t BytecodeComponentData::GetLocalVariablesOffset() const {
-  return Smi::Value(Smi::RawCast(data_.At(kLocalVariablesOffset)));
-}
-
-intptr_t BytecodeComponentData::GetAnnotationsOffset() const {
-  return Smi::Value(Smi::RawCast(data_.At(kAnnotationsOffset)));
-}
-
-void BytecodeComponentData::SetObject(intptr_t index, const Object& obj) const {
-  data_.SetAt(kNumFields + index, obj);
-}
-
-ObjectPtr BytecodeComponentData::GetObject(intptr_t index) const {
-  return data_.At(kNumFields + index);
-}
-
-ArrayPtr BytecodeComponentData::New(Zone* zone,
-                                    intptr_t version,
-                                    intptr_t num_objects,
-                                    intptr_t strings_header_offset,
-                                    intptr_t strings_contents_offset,
-                                    intptr_t object_offsets_offset,
-                                    intptr_t objects_contents_offset,
-                                    intptr_t main_offset,
-                                    intptr_t num_libraries,
-                                    intptr_t library_index_offset,
-                                    intptr_t libraries_offset,
-                                    intptr_t num_classes,
-                                    intptr_t classes_offset,
-                                    intptr_t members_offset,
-                                    intptr_t num_codes,
-                                    intptr_t codes_offset,
-                                    intptr_t source_positions_offset,
-                                    intptr_t source_files_offset,
-                                    intptr_t line_starts_offset,
-                                    intptr_t local_variables_offset,
-                                    intptr_t annotations_offset,
-                                    Heap::Space space) {
-  const Array& data =
-      Array::Handle(zone, Array::New(kNumFields + num_objects, space));
-  Smi& smi_handle = Smi::Handle(zone);
-
-  smi_handle = Smi::New(version);
-  data.SetAt(kVersion, smi_handle);
-
-  smi_handle = Smi::New(strings_header_offset);
-  data.SetAt(kStringsHeaderOffset, smi_handle);
-
-  smi_handle = Smi::New(strings_contents_offset);
-  data.SetAt(kStringsContentsOffset, smi_handle);
-
-  smi_handle = Smi::New(object_offsets_offset);
-  data.SetAt(kObjectOffsetsOffset, smi_handle);
-
-  smi_handle = Smi::New(num_objects);
-  data.SetAt(kNumObjects, smi_handle);
-
-  smi_handle = Smi::New(objects_contents_offset);
-  data.SetAt(kObjectsContentsOffset, smi_handle);
-
-  smi_handle = Smi::New(main_offset);
-  data.SetAt(kMainOffset, smi_handle);
-
-  smi_handle = Smi::New(num_libraries);
-  data.SetAt(kNumLibraries, smi_handle);
-
-  smi_handle = Smi::New(library_index_offset);
-  data.SetAt(kLibraryIndexOffset, smi_handle);
-
-  smi_handle = Smi::New(libraries_offset);
-  data.SetAt(kLibrariesOffset, smi_handle);
-
-  smi_handle = Smi::New(num_classes);
-  data.SetAt(kNumClasses, smi_handle);
-
-  smi_handle = Smi::New(classes_offset);
-  data.SetAt(kClassesOffset, smi_handle);
-
-  smi_handle = Smi::New(members_offset);
-  data.SetAt(kMembersOffset, smi_handle);
-
-  smi_handle = Smi::New(num_codes);
-  data.SetAt(kNumCodes, smi_handle);
-
-  smi_handle = Smi::New(codes_offset);
-  data.SetAt(kCodesOffset, smi_handle);
-
-  smi_handle = Smi::New(source_positions_offset);
-  data.SetAt(kSourcePositionsOffset, smi_handle);
-
-  smi_handle = Smi::New(source_files_offset);
-  data.SetAt(kSourceFilesOffset, smi_handle);
-
-  smi_handle = Smi::New(line_starts_offset);
-  data.SetAt(kLineStartsOffset, smi_handle);
-
-  smi_handle = Smi::New(local_variables_offset);
-  data.SetAt(kLocalVariablesOffset, smi_handle);
-
-  smi_handle = Smi::New(annotations_offset);
-  data.SetAt(kAnnotationsOffset, smi_handle);
-
-  return data.raw();
-}
-
-ErrorPtr BytecodeReader::ReadFunctionBytecode(Thread* thread,
-                                              const Function& function) {
-  ASSERT(!FLAG_precompiled_mode);
-  ASSERT(!function.HasBytecode());
-  ASSERT(thread->sticky_error() == Error::null());
-  ASSERT(Thread::Current()->IsMutatorThread());
-
-  VMTagScope tagScope(thread, VMTag::kLoadBytecodeTagId);
-
-#if defined(SUPPORT_TIMELINE)
-  TimelineBeginEndScope tbes(thread, Timeline::GetCompilerStream(),
-                             "BytecodeReader::ReadFunctionBytecode");
-  // This increases bytecode reading time by ~7%, so only keep it around for
-  // debugging.
-#if defined(DEBUG)
-  tbes.SetNumArguments(1);
-  tbes.CopyArgument(0, "Function", function.ToQualifiedCString());
-#endif  // defined(DEBUG)
-#endif  // !defined(SUPPORT_TIMELINE)
-
-  LongJumpScope jump;
-  if (setjmp(*jump.Set()) == 0) {
-    StackZone stack_zone(thread);
-    Zone* const zone = stack_zone.GetZone();
-    HANDLESCOPE(thread);
-
-    auto& bytecode = Bytecode::Handle(zone);
-
-    switch (function.kind()) {
-      case FunctionLayout::kImplicitGetter:
-        bytecode = Object::implicit_getter_bytecode().raw();
-        break;
-      case FunctionLayout::kImplicitSetter:
-        bytecode = Object::implicit_setter_bytecode().raw();
-        break;
-      case FunctionLayout::kImplicitStaticGetter:
-        if (!IsStaticFieldGetterGeneratedAsInitializer(function, zone)) {
-          bytecode = Object::implicit_static_getter_bytecode().raw();
-        }
-        break;
-      case FunctionLayout::kMethodExtractor:
-        bytecode = Object::method_extractor_bytecode().raw();
-        break;
-      case FunctionLayout::kInvokeFieldDispatcher:
-        if (Class::Handle(zone, function.Owner()).id() == kClosureCid) {
-          bytecode = Object::invoke_closure_bytecode().raw();
-        } else {
-          bytecode = Object::invoke_field_bytecode().raw();
-        }
-        break;
-      case FunctionLayout::kNoSuchMethodDispatcher:
-        bytecode = Object::nsm_dispatcher_bytecode().raw();
-        break;
-      case FunctionLayout::kDynamicInvocationForwarder: {
-        const Function& target =
-            Function::Handle(zone, function.ForwardingTarget());
-        if (!target.HasBytecode()) {
-          // The forwarder will use the target's bytecode to handle optional
-          // parameters.
-          const Error& error =
-              Error::Handle(zone, ReadFunctionBytecode(thread, target));
-          if (!error.IsNull()) {
-            return error.raw();
-          }
-        }
-        {
-          const Script& script = Script::Handle(zone, target.script());
-          TranslationHelper translation_helper(thread);
-          translation_helper.InitFromScript(script);
-
-          ActiveClass active_class;
-          BytecodeComponentData bytecode_component(
-              &Array::Handle(zone, translation_helper.GetBytecodeComponent()));
-          ASSERT(!bytecode_component.IsNull());
-          BytecodeReaderHelper bytecode_reader(
-              &translation_helper, &active_class, &bytecode_component);
-
-          const Array& checks = Array::Handle(
-              zone, bytecode_reader.CreateForwarderChecks(target));
-          function.SetForwardingChecks(checks);
-        }
-        bytecode = Object::dynamic_invocation_forwarder_bytecode().raw();
-      } break;
-      default:
-        break;
-    }
-
-    if (!bytecode.IsNull()) {
-      function.AttachBytecode(bytecode);
-    } else if (function.is_declared_in_bytecode()) {
-      const intptr_t code_offset = function.bytecode_offset();
-      if (code_offset != 0) {
-        CompilerState compiler_state(thread, FLAG_precompiled_mode);
-
-        const Script& script = Script::Handle(zone, function.script());
-        TranslationHelper translation_helper(thread);
-        translation_helper.InitFromScript(script);
-
-        ActiveClass active_class;
-
-        // Setup a [ActiveClassScope] and a [ActiveMemberScope] which will be
-        // used e.g. for type translation.
-        const Class& klass = Class::Handle(zone, function.Owner());
-        Function& outermost_function =
-            Function::Handle(zone, function.GetOutermostFunction());
-
-        ActiveClassScope active_class_scope(&active_class, &klass);
-        ActiveMemberScope active_member(&active_class, &outermost_function);
-
-        BytecodeComponentData bytecode_component(
-            &Array::Handle(zone, translation_helper.GetBytecodeComponent()));
-        ASSERT(!bytecode_component.IsNull());
-        BytecodeReaderHelper bytecode_reader(&translation_helper, &active_class,
-                                             &bytecode_component);
-
-        bytecode_reader.ReadCode(function, code_offset);
-      }
-    }
-    return Error::null();
-  } else {
-    return thread->StealStickyError();
-  }
-}
-
-ObjectPtr BytecodeReader::ReadAnnotation(const Field& annotation_field) {
-  ASSERT(annotation_field.is_declared_in_bytecode());
-
-  Thread* thread = Thread::Current();
-  Zone* zone = thread->zone();
-  ASSERT(thread->IsMutatorThread());
-
-  const Script& script = Script::Handle(zone, annotation_field.Script());
-  TranslationHelper translation_helper(thread);
-  translation_helper.InitFromScript(script);
-
-  ActiveClass active_class;
-
-  BytecodeComponentData bytecode_component(
-      &Array::Handle(zone, translation_helper.GetBytecodeComponent()));
-  ASSERT(!bytecode_component.IsNull());
-  BytecodeReaderHelper bytecode_reader(&translation_helper, &active_class,
-                                       &bytecode_component);
-
-  AlternativeReadingScope alt(&bytecode_reader.reader(),
-                              annotation_field.bytecode_offset());
-
-  return bytecode_reader.ReadObject();
-}
-
-ArrayPtr BytecodeReader::ReadExtendedAnnotations(const Field& annotation_field,
-                                                 intptr_t count) {
-  ASSERT(annotation_field.is_declared_in_bytecode());
-
-  Thread* thread = Thread::Current();
-  Zone* zone = thread->zone();
-  ASSERT(thread->IsMutatorThread());
-
-  const Script& script = Script::Handle(zone, annotation_field.Script());
-  TranslationHelper translation_helper(thread);
-  translation_helper.InitFromScript(script);
-
-  ActiveClass active_class;
-
-  BytecodeComponentData bytecode_component(
-      &Array::Handle(zone, translation_helper.GetBytecodeComponent()));
-  ASSERT(!bytecode_component.IsNull());
-  BytecodeReaderHelper bytecode_reader(&translation_helper, &active_class,
-                                       &bytecode_component);
-
-  AlternativeReadingScope alt(&bytecode_reader.reader(),
-                              annotation_field.bytecode_offset());
-
-  bytecode_reader.ReadObject();  // Discard main annotation.
-
-  Array& result = Array::Handle(zone, Array::New(count));
-  Object& element = Object::Handle(zone);
-  for (intptr_t i = 0; i < count; i++) {
-    element = bytecode_reader.ReadObject();
-    result.SetAt(i, element);
-  }
-  return result.raw();
-}
-
-void BytecodeReader::ResetObjectTable(const KernelProgramInfo& info) {
-  Thread* thread = Thread::Current();
-  TranslationHelper translation_helper(thread);
-  translation_helper.InitFromKernelProgramInfo(info);
-  ActiveClass active_class;
-  BytecodeComponentData bytecode_component(&Array::Handle(
-      thread->zone(), translation_helper.GetBytecodeComponent()));
-  ASSERT(!bytecode_component.IsNull());
-  BytecodeReaderHelper bytecode_reader(&translation_helper, &active_class,
-                                       &bytecode_component);
-  bytecode_reader.ResetObjects();
-}
-
-void BytecodeReader::LoadClassDeclaration(const Class& cls) {
-  TIMELINE_DURATION(Thread::Current(), Compiler,
-                    "BytecodeReader::LoadClassDeclaration");
-
-  ASSERT(cls.is_declared_in_bytecode());
-  ASSERT(!cls.is_declaration_loaded());
-
-  Thread* thread = Thread::Current();
-  Zone* zone = thread->zone();
-  ASSERT(thread->IsMutatorThread());
-
-  const Script& script = Script::Handle(zone, cls.script());
-  TranslationHelper translation_helper(thread);
-  translation_helper.InitFromScript(script);
-
-  ActiveClass active_class;
-  ActiveClassScope active_class_scope(&active_class, &cls);
-
-  BytecodeComponentData bytecode_component(
-      &Array::Handle(zone, translation_helper.GetBytecodeComponent()));
-  ASSERT(!bytecode_component.IsNull());
-  BytecodeReaderHelper bytecode_reader(&translation_helper, &active_class,
-                                       &bytecode_component);
-
-  AlternativeReadingScope alt(&bytecode_reader.reader(), cls.bytecode_offset());
-
-  bytecode_reader.ReadClassDeclaration(cls);
-}
-
-void BytecodeReader::FinishClassLoading(const Class& cls) {
-  ASSERT(cls.is_declared_in_bytecode());
-
-  Thread* thread = Thread::Current();
-  Zone* zone = thread->zone();
-  ASSERT(thread->IsMutatorThread());
-
-  const Script& script = Script::Handle(zone, cls.script());
-  TranslationHelper translation_helper(thread);
-  translation_helper.InitFromScript(script);
-
-  ActiveClass active_class;
-  ActiveClassScope active_class_scope(&active_class, &cls);
-
-  BytecodeComponentData bytecode_component(
-      &Array::Handle(zone, translation_helper.GetBytecodeComponent()));
-  ASSERT(!bytecode_component.IsNull());
-  BytecodeReaderHelper bytecode_reader(&translation_helper, &active_class,
-                                       &bytecode_component);
-
-  AlternativeReadingScope alt(&bytecode_reader.reader(), cls.bytecode_offset());
-
-  // If this is a dart:internal.ClassID class ignore field declarations
-  // contained in the Kernel file and instead inject our own const
-  // fields.
-  const bool discard_fields = cls.InjectCIDFields();
-
-  bytecode_reader.ReadMembers(cls, discard_fields);
-}
-
-ObjectPtr BytecodeReader::GetBytecodeAttribute(const Object& key,
-                                               const String& name) {
-  Thread* thread = Thread::Current();
-  Zone* zone = thread->zone();
-  const auto* object_store = thread->isolate()->object_store();
-  if (object_store->bytecode_attributes() == Object::null()) {
-    return Object::null();
-  }
-  BytecodeAttributesMap map(object_store->bytecode_attributes());
-  const auto& attrs = Array::CheckedHandle(zone, map.GetOrNull(key));
-  ASSERT(map.Release().raw() == object_store->bytecode_attributes());
-  if (attrs.IsNull()) {
-    return Object::null();
-  }
-  auto& obj = Object::Handle(zone);
-  for (intptr_t i = 0, n = attrs.Length(); i + 1 < n; i += 2) {
-    obj = attrs.At(i);
-    if (obj.raw() == name.raw()) {
-      return attrs.At(i + 1);
-    }
-  }
-  return Object::null();
-}
-
-InferredTypeMetadata InferredTypeBytecodeAttribute::GetInferredTypeAt(
-    Zone* zone,
-    const Array& attr,
-    intptr_t index) {
-  ASSERT(index + kNumElements <= attr.Length());
-  const auto& type = AbstractType::CheckedHandle(zone, attr.At(index + 1));
-  const intptr_t flags = Smi::Value(Smi::RawCast(attr.At(index + 2)));
-  if (!type.IsNull()) {
-    intptr_t cid = Type::Cast(type).type_class_id();
-    return InferredTypeMetadata(cid, flags);
-  } else {
-    return InferredTypeMetadata(kDynamicCid, flags);
-  }
-}
-
-#if !defined(PRODUCT)
-LocalVarDescriptorsPtr BytecodeReader::ComputeLocalVarDescriptors(
-    Zone* zone,
-    const Function& function,
-    const Bytecode& bytecode) {
-  ASSERT(function.is_declared_in_bytecode());
-  ASSERT(function.HasBytecode());
-  ASSERT(!bytecode.IsNull());
-  ASSERT(function.bytecode() == bytecode.raw());
-
-  LocalVarDescriptorsBuilder vars;
-
-  if (function.IsLocalFunction()) {
-    const auto& parent = Function::Handle(zone, function.parent_function());
-    ASSERT(parent.is_declared_in_bytecode() && parent.HasBytecode());
-    const auto& parent_bytecode = Bytecode::Handle(zone, parent.bytecode());
-    const auto& parent_vars = LocalVarDescriptors::Handle(
-        zone, parent_bytecode.GetLocalVarDescriptors());
-    for (intptr_t i = 0; i < parent_vars.Length(); ++i) {
-      LocalVarDescriptorsLayout::VarInfo var_info;
-      parent_vars.GetInfo(i, &var_info);
-      // Include parent's context variable if variable's scope
-      // intersects with the local function range.
-      // It is not enough to check if local function is declared within the
-      // scope of variable, because in case of async functions closure has
-      // the same range as original function.
-      if (var_info.kind() == LocalVarDescriptorsLayout::kContextVar &&
-          ((var_info.begin_pos <= function.token_pos() &&
-            function.token_pos() <= var_info.end_pos) ||
-           (function.token_pos() <= var_info.begin_pos &&
-            var_info.begin_pos <= function.end_token_pos()))) {
-        vars.Add(LocalVarDescriptorsBuilder::VarDesc{
-            &String::Handle(zone, parent_vars.GetName(i)), var_info});
-      }
-    }
-  }
-
-  if (bytecode.HasLocalVariablesInfo()) {
-    intptr_t scope_id = 0;
-    intptr_t context_level = -1;
-    BytecodeLocalVariablesIterator local_vars(zone, bytecode);
-    while (local_vars.MoveNext()) {
-      switch (local_vars.Kind()) {
-        case BytecodeLocalVariablesIterator::kScope: {
-          ++scope_id;
-          context_level = local_vars.ContextLevel();
-        } break;
-        case BytecodeLocalVariablesIterator::kVariableDeclaration: {
-          LocalVarDescriptorsBuilder::VarDesc desc;
-          desc.name = &String::Handle(zone, local_vars.Name());
-          if (local_vars.IsCaptured()) {
-            desc.info.set_kind(LocalVarDescriptorsLayout::kContextVar);
-            desc.info.scope_id = context_level;
-            desc.info.set_index(local_vars.Index());
-          } else {
-            desc.info.set_kind(LocalVarDescriptorsLayout::kStackVar);
-            desc.info.scope_id = scope_id;
-            if (local_vars.Index() < 0) {
-              // Parameter
-              ASSERT(local_vars.Index() < -kKBCParamEndSlotFromFp);
-              desc.info.set_index(-local_vars.Index() - kKBCParamEndSlotFromFp);
-            } else {
-              desc.info.set_index(-local_vars.Index());
-            }
-          }
-          desc.info.declaration_pos = local_vars.DeclarationTokenPos();
-          desc.info.begin_pos = local_vars.StartTokenPos();
-          desc.info.end_pos = local_vars.EndTokenPos();
-          vars.Add(desc);
-        } break;
-        case BytecodeLocalVariablesIterator::kContextVariable: {
-          ASSERT(local_vars.Index() >= 0);
-          const intptr_t context_variable_index = -local_vars.Index();
-          LocalVarDescriptorsBuilder::VarDesc desc;
-          desc.name = &Symbols::CurrentContextVar();
-          desc.info.set_kind(LocalVarDescriptorsLayout::kSavedCurrentContext);
-          desc.info.scope_id = 0;
-          desc.info.declaration_pos = TokenPosition::kMinSource;
-          desc.info.begin_pos = TokenPosition::kMinSource;
-          desc.info.end_pos = TokenPosition::kMinSource;
-          desc.info.set_index(context_variable_index);
-          vars.Add(desc);
-        } break;
-      }
-    }
-  }
-
-  return vars.Done();
-}
-#endif  // !defined(PRODUCT)
-
-bool IsStaticFieldGetterGeneratedAsInitializer(const Function& function,
-                                               Zone* zone) {
-  ASSERT(function.kind() == FunctionLayout::kImplicitStaticGetter);
-
-  const auto& field = Field::Handle(zone, function.accessor_field());
-  return field.is_declared_in_bytecode() && field.is_const() &&
-         field.has_nontrivial_initializer();
-}
-
-}  // namespace kernel
-}  // namespace dart
diff --git a/runtime/vm/compiler/frontend/bytecode_reader.h b/runtime/vm/compiler/frontend/bytecode_reader.h
deleted file mode 100644
index ee8444f..0000000
--- a/runtime/vm/compiler/frontend/bytecode_reader.h
+++ /dev/null
@@ -1,589 +0,0 @@
-// Copyright (c) 2018, 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.
-
-#ifndef RUNTIME_VM_COMPILER_FRONTEND_BYTECODE_READER_H_
-#define RUNTIME_VM_COMPILER_FRONTEND_BYTECODE_READER_H_
-
-#if defined(DART_PRECOMPILED_RUNTIME)
-#error "AOT runtime should not use compiler sources (including header files)"
-#endif  // defined(DART_PRECOMPILED_RUNTIME)
-
-#include "vm/compiler/frontend/kernel_translation_helper.h"
-#include "vm/constants_kbc.h"
-#include "vm/object.h"
-
-namespace dart {
-namespace kernel {
-
-class BytecodeComponentData;
-
-// Helper class which provides access to bytecode metadata.
-class BytecodeMetadataHelper : public MetadataHelper {
- public:
-  static const char* tag() { return "vm.bytecode"; }
-
-  explicit BytecodeMetadataHelper(KernelReaderHelper* helper,
-                                  ActiveClass* active_class);
-
-  void ParseBytecodeFunction(ParsedFunction* parsed_function);
-
-  // Read all library declarations.
-  bool ReadLibraries();
-
-  // Read specific library declaration.
-  void ReadLibrary(const Library& library);
-
-  // Scan through libraries in the bytecode component and figure out if any of
-  // them will replace libraries which are already loaded.
-  // Return true if bytecode component is found.
-  bool FindModifiedLibrariesForHotReload(BitVector* modified_libs,
-                                         bool* is_empty_program,
-                                         intptr_t* p_num_classes,
-                                         intptr_t* p_num_procedures);
-
-  LibraryPtr GetMainLibrary();
-
-  ArrayPtr GetBytecodeComponent();
-  ArrayPtr ReadBytecodeComponent();
-
- private:
-  ActiveClass* const active_class_;
-
-  DISALLOW_COPY_AND_ASSIGN(BytecodeMetadataHelper);
-};
-
-// Helper class for reading bytecode.
-class BytecodeReaderHelper : public ValueObject {
- public:
-  explicit BytecodeReaderHelper(TranslationHelper* translation_helper,
-                                ActiveClass* active_class,
-                                BytecodeComponentData* bytecode_component);
-
-  Reader& reader() { return reader_; }
-
-  void ReadCode(const Function& function, intptr_t code_offset);
-
-  ArrayPtr CreateForwarderChecks(const Function& function);
-
-  void ReadMembers(const Class& cls, bool discard_fields);
-
-  void ReadFieldDeclarations(const Class& cls, bool discard_fields);
-  void ReadFunctionDeclarations(const Class& cls);
-  void ReadClassDeclaration(const Class& cls);
-  void ReadLibraryDeclaration(const Library& library, bool lookup_classes);
-  void ReadLibraryDeclarations(intptr_t num_libraries);
-  void FindAndReadSpecificLibrary(const Library& library,
-                                  intptr_t num_libraries);
-  void FindModifiedLibrariesForHotReload(BitVector* modified_libs,
-                                         intptr_t num_libraries);
-
-  void ParseBytecodeFunction(ParsedFunction* parsed_function,
-                             const Function& function);
-
-  LibraryPtr ReadMain();
-
-  ArrayPtr ReadBytecodeComponent(intptr_t md_offset);
-  void ResetObjects();
-
-  // Fills in [is_covariant] and [is_generic_covariant_impl] vectors
-  // according to covariance attributes of [function] parameters.
-  //
-  // [function] should be declared in bytecode.
-  // [is_covariant] and [is_generic_covariant_impl] should contain bitvectors
-  // of function.NumParameters() length.
-  void ReadParameterCovariance(const Function& function,
-                               BitVector* is_covariant,
-                               BitVector* is_generic_covariant_impl);
-
-  // Returns an flattened array of tuples {isFinal, defaultValue, metadata},
-  // or an Error.
-  ObjectPtr BuildParameterDescriptor(const Function& function);
-
-  // Read bytecode PackedObject.
-  ObjectPtr ReadObject();
-
- private:
-  // These constants should match corresponding constants in class ObjectHandle
-  // (pkg/vm/lib/bytecode/object_table.dart).
-  static const int kReferenceBit = 1 << 0;
-  static const int kIndexShift = 1;
-  static const int kKindShift = 1;
-  static const int kKindMask = 0x0f;
-  static const int kFlagBit0 = 1 << 5;
-  static const int kFlagBit1 = 1 << 6;
-  static const int kFlagBit2 = 1 << 7;
-  static const int kFlagBit3 = 1 << 8;
-  static const int kFlagBit4 = 1 << 9;
-  static const int kFlagBit5 = 1 << 10;
-  static const int kTagMask = (kFlagBit0 | kFlagBit1 | kFlagBit2 | kFlagBit3);
-  static const int kNullabilityMask = (kFlagBit4 | kFlagBit5);
-  static const int kFlagsMask = (kTagMask | kNullabilityMask);
-
-  // Code flags, must be in sync with Code constants in
-  // pkg/vm/lib/bytecode/declarations.dart.
-  struct Code {
-    static const int kHasExceptionsTableFlag = 1 << 0;
-    static const int kHasSourcePositionsFlag = 1 << 1;
-    static const int kHasNullableFieldsFlag = 1 << 2;
-    static const int kHasClosuresFlag = 1 << 3;
-    static const int kHasParameterFlagsFlag = 1 << 4;
-    static const int kHasForwardingStubTargetFlag = 1 << 5;
-    static const int kHasDefaultFunctionTypeArgsFlag = 1 << 6;
-    static const int kHasLocalVariablesFlag = 1 << 7;
-  };
-
-  // Closure code flags, must be in sync with ClosureCode constants in
-  // pkg/vm/lib/bytecode/declarations.dart.
-  struct ClosureCode {
-    static const int kHasExceptionsTableFlag = 1 << 0;
-    static const int kHasSourcePositionsFlag = 1 << 1;
-    static const int kHasLocalVariablesFlag = 1 << 2;
-  };
-
-  // Parameter flags, must be in sync with ParameterDeclaration constants in
-  // pkg/vm/lib/bytecode/declarations.dart.
-  struct Parameter {
-    static const int kIsCovariantFlag = 1 << 0;
-    static const int kIsGenericCovariantImplFlag = 1 << 1;
-    static const int kIsFinalFlag = 1 << 2;
-    static const int kIsRequiredFlag = 1 << 3;
-  };
-
-  class FunctionTypeScope : public ValueObject {
-   public:
-    explicit FunctionTypeScope(BytecodeReaderHelper* bytecode_reader)
-        : bytecode_reader_(bytecode_reader),
-          saved_type_parameters_(
-              bytecode_reader->function_type_type_parameters_) {}
-
-    ~FunctionTypeScope() {
-      bytecode_reader_->function_type_type_parameters_ = saved_type_parameters_;
-    }
-
-   private:
-    BytecodeReaderHelper* bytecode_reader_;
-    const TypeArguments* const saved_type_parameters_;
-  };
-
-  class FunctionScope : public ValueObject {
-   public:
-    FunctionScope(BytecodeReaderHelper* bytecode_reader,
-                  const Function& function,
-                  const String& name,
-                  const Class& cls)
-        : bytecode_reader_(bytecode_reader) {
-      ASSERT(bytecode_reader_->scoped_function_.IsNull());
-      ASSERT(bytecode_reader_->scoped_function_name_.IsNull());
-      ASSERT(bytecode_reader_->scoped_function_class_.IsNull());
-      ASSERT(name.IsSymbol());
-      bytecode_reader_->scoped_function_ = function.raw();
-      bytecode_reader_->scoped_function_name_ = name.raw();
-      bytecode_reader_->scoped_function_class_ = cls.raw();
-    }
-
-    ~FunctionScope() {
-      bytecode_reader_->scoped_function_ = Function::null();
-      bytecode_reader_->scoped_function_name_ = String::null();
-      bytecode_reader_->scoped_function_class_ = Class::null();
-    }
-
-   private:
-    BytecodeReaderHelper* bytecode_reader_;
-  };
-
-  void ReadClosureDeclaration(const Function& function, intptr_t closureIndex);
-  TypePtr ReadFunctionSignature(const Function& func,
-                                bool has_optional_positional_params,
-                                bool has_optional_named_params,
-                                bool has_type_params,
-                                bool has_positional_param_names,
-                                bool has_parameter_flags,
-                                Nullability nullability);
-  void ReadTypeParametersDeclaration(const Class& parameterized_class,
-                                     const Function& parameterized_function);
-
-  // Read portion of constant pool corresponding to one function/closure.
-  // Start with [start_index], and stop when reaching EndClosureFunctionScope.
-  // Return index of the last read constant pool entry.
-  intptr_t ReadConstantPool(const Function& function,
-                            const ObjectPool& pool,
-                            intptr_t start_index);
-
-  BytecodePtr ReadBytecode(const ObjectPool& pool);
-  void ReadExceptionsTable(const Bytecode& bytecode, bool has_exceptions_table);
-  void ReadSourcePositions(const Bytecode& bytecode, bool has_source_positions);
-  void ReadLocalVariables(const Bytecode& bytecode, bool has_local_variables);
-  TypedDataPtr NativeEntry(const Function& function,
-                           const String& external_name);
-  StringPtr ConstructorName(const Class& cls, const String& name);
-
-  ObjectPtr ReadObjectContents(uint32_t header);
-  ObjectPtr ReadConstObject(intptr_t tag);
-  ObjectPtr ReadType(intptr_t tag, Nullability nullability);
-  StringPtr ReadString(bool is_canonical = true);
-  ScriptPtr ReadSourceFile(const String& uri, intptr_t offset);
-  TypeArgumentsPtr ReadTypeArguments();
-  void ReadAttributes(const Object& key);
-  PatchClassPtr GetPatchClass(const Class& cls, const Script& script);
-  void ParseForwarderFunction(ParsedFunction* parsed_function,
-                              const Function& function,
-                              const Function& target);
-
-  bool IsExpressionEvaluationLibrary(const Library& library) const {
-    return expression_evaluation_library_ != nullptr &&
-           expression_evaluation_library_->raw() == library.raw();
-  }
-
-  // Similar to cls.EnsureClassDeclaration, but may be more efficient if
-  // class is from the current kernel binary.
-  void LoadReferencedClass(const Class& cls);
-
-  Reader reader_;
-  TranslationHelper& translation_helper_;
-  ActiveClass* const active_class_;
-  Thread* const thread_;
-  Zone* const zone_;
-  BytecodeComponentData* bytecode_component_;
-  Array* closures_ = nullptr;
-  const TypeArguments* function_type_type_parameters_ = nullptr;
-  GrowableObjectArray* pending_recursive_types_ = nullptr;
-  PatchClass* patch_class_ = nullptr;
-  Array* functions_ = nullptr;
-  intptr_t function_index_ = 0;
-  Function& scoped_function_;
-  String& scoped_function_name_;
-  Class& scoped_function_class_;
-  Library* expression_evaluation_library_ = nullptr;
-  bool loading_native_wrappers_library_ = false;
-  bool reading_type_arguments_of_recursive_type_ = false;
-
-  DISALLOW_COPY_AND_ASSIGN(BytecodeReaderHelper);
-};
-
-class BytecodeComponentData : ValueObject {
- public:
-  enum {
-    kVersion,
-    kStringsHeaderOffset,
-    kStringsContentsOffset,
-    kObjectOffsetsOffset,
-    kNumObjects,
-    kObjectsContentsOffset,
-    kMainOffset,
-    kNumLibraries,
-    kLibraryIndexOffset,
-    kLibrariesOffset,
-    kNumClasses,
-    kClassesOffset,
-    kMembersOffset,
-    kNumCodes,
-    kCodesOffset,
-    kSourcePositionsOffset,
-    kSourceFilesOffset,
-    kLineStartsOffset,
-    kLocalVariablesOffset,
-    kAnnotationsOffset,
-    kNumFields
-  };
-
-  explicit BytecodeComponentData(Array* data) : data_(*data) {}
-
-  void Init(const Array& data) { data_ = data.raw(); }
-
-  intptr_t GetVersion() const;
-  intptr_t GetStringsHeaderOffset() const;
-  intptr_t GetStringsContentsOffset() const;
-  intptr_t GetObjectOffsetsOffset() const;
-  intptr_t GetNumObjects() const;
-  intptr_t GetObjectsContentsOffset() const;
-  intptr_t GetMainOffset() const;
-  intptr_t GetNumLibraries() const;
-  intptr_t GetLibraryIndexOffset() const;
-  intptr_t GetLibrariesOffset() const;
-  intptr_t GetNumClasses() const;
-  intptr_t GetClassesOffset() const;
-  intptr_t GetMembersOffset() const;
-  intptr_t GetNumCodes() const;
-  intptr_t GetCodesOffset() const;
-  intptr_t GetSourcePositionsOffset() const;
-  intptr_t GetSourceFilesOffset() const;
-  intptr_t GetLineStartsOffset() const;
-  intptr_t GetLocalVariablesOffset() const;
-  intptr_t GetAnnotationsOffset() const;
-  void SetObject(intptr_t index, const Object& obj) const;
-  ObjectPtr GetObject(intptr_t index) const;
-
-  bool IsNull() const { return data_.IsNull(); }
-
-  static ArrayPtr New(Zone* zone,
-                      intptr_t version,
-                      intptr_t num_objects,
-                      intptr_t strings_header_offset,
-                      intptr_t strings_contents_offset,
-                      intptr_t object_offsets_offset,
-                      intptr_t objects_contents_offset,
-                      intptr_t main_offset,
-                      intptr_t num_libraries,
-                      intptr_t library_index_offset,
-                      intptr_t libraries_offset,
-                      intptr_t num_classes,
-                      intptr_t classes_offset,
-                      intptr_t members_offset,
-                      intptr_t num_codes,
-                      intptr_t codes_offset,
-                      intptr_t source_positions_offset,
-                      intptr_t source_files_offset,
-                      intptr_t line_starts_offset,
-                      intptr_t local_variables_offset,
-                      intptr_t annotations_offset,
-                      Heap::Space space);
-
- private:
-  Array& data_;
-};
-
-class BytecodeReader : public AllStatic {
- public:
-  // Reads bytecode for the given function and sets its bytecode field.
-  // Returns error (if any), or null.
-  static ErrorPtr ReadFunctionBytecode(Thread* thread,
-                                       const Function& function);
-
-  // Read annotations for the given annotation field.
-  static ObjectPtr ReadAnnotation(const Field& annotation_field);
-  // Read the |count| annotations following given annotation field.
-  static ArrayPtr ReadExtendedAnnotations(const Field& annotation_field,
-                                          intptr_t count);
-
-  static void ResetObjectTable(const KernelProgramInfo& info);
-
-  // Read declaration of the given library.
-  static void LoadLibraryDeclaration(const Library& library);
-
-  // Read declaration of the given class.
-  static void LoadClassDeclaration(const Class& cls);
-
-  // Read members of the given class.
-  static void FinishClassLoading(const Class& cls);
-
-  // Value of attribute [name] of Function/Field [key].
-  static ObjectPtr GetBytecodeAttribute(const Object& key, const String& name);
-
-#if !defined(PRODUCT)
-  // Compute local variable descriptors for [function] with [bytecode].
-  static LocalVarDescriptorsPtr ComputeLocalVarDescriptors(
-      Zone* zone,
-      const Function& function,
-      const Bytecode& bytecode);
-#endif
-};
-
-class InferredTypeBytecodeAttribute : public AllStatic {
- public:
-  // Number of array elements per entry in InferredType bytecode
-  // attribute (PC, type, flags).
-  static constexpr intptr_t kNumElements = 3;
-
-  // Field type is the first entry with PC = -1.
-  static constexpr intptr_t kFieldTypePC = -1;
-
-  // Returns PC at given index.
-  static intptr_t GetPCAt(const Array& attr, intptr_t index) {
-    return Smi::Value(Smi::RawCast(attr.At(index)));
-  }
-
-  // Returns InferredType metadata at given index.
-  static InferredTypeMetadata GetInferredTypeAt(Zone* zone,
-                                                const Array& attr,
-                                                intptr_t index);
-};
-
-class BytecodeSourcePositionsIterator : ValueObject {
- public:
-  // These constants should match corresponding constants in class
-  // SourcePositions (pkg/vm/lib/bytecode/source_positions.dart).
-  static const intptr_t kSyntheticCodeMarker = -1;
-  static const intptr_t kYieldPointMarker = -2;
-
-  BytecodeSourcePositionsIterator(Zone* zone, const Bytecode& bytecode)
-      : reader_(ExternalTypedData::Handle(zone, bytecode.GetBinary(zone))) {
-    if (bytecode.HasSourcePositions()) {
-      reader_.set_offset(bytecode.source_positions_binary_offset());
-      pairs_remaining_ = reader_.ReadUInt();
-    }
-  }
-
-  bool MoveNext() {
-    if (pairs_remaining_ == 0) {
-      return false;
-    }
-    ASSERT(pairs_remaining_ > 0);
-    --pairs_remaining_;
-    cur_bci_ += reader_.ReadUInt();
-    cur_token_pos_ += reader_.ReadSLEB128();
-    is_yield_point_ = false;
-    if (cur_token_pos_ == kYieldPointMarker) {
-      const bool result = MoveNext();
-      is_yield_point_ = true;
-      return result;
-    }
-    return true;
-  }
-
-  uword PcOffset() const { return cur_bci_; }
-
-  TokenPosition TokenPos() const {
-    return (cur_token_pos_ == kSyntheticCodeMarker)
-               ? TokenPosition::kNoSource
-               : TokenPosition(cur_token_pos_);
-  }
-
-  bool IsYieldPoint() const { return is_yield_point_; }
-
- private:
-  Reader reader_;
-  intptr_t pairs_remaining_ = 0;
-  intptr_t cur_bci_ = 0;
-  intptr_t cur_token_pos_ = 0;
-  bool is_yield_point_ = false;
-};
-
-class BytecodeLocalVariablesIterator : ValueObject {
- public:
-  // These constants should match corresponding constants in
-  // pkg/vm/lib/bytecode/local_variable_table.dart.
-  enum {
-    kInvalid,
-    kScope,
-    kVariableDeclaration,
-    kContextVariable,
-  };
-
-  static const intptr_t kKindMask = 0xF;
-  static const intptr_t kIsCapturedFlag = 1 << 4;
-
-  BytecodeLocalVariablesIterator(Zone* zone, const Bytecode& bytecode)
-      : reader_(ExternalTypedData::Handle(zone, bytecode.GetBinary(zone))),
-        object_pool_(ObjectPool::Handle(zone, bytecode.object_pool())) {
-    if (bytecode.HasLocalVariablesInfo()) {
-      reader_.set_offset(bytecode.local_variables_binary_offset());
-      entries_remaining_ = reader_.ReadUInt();
-    }
-  }
-
-  bool MoveNext() {
-    if (entries_remaining_ <= 0) {
-      // Finished looking at the last entry, now we're done.
-      entries_remaining_ = -1;
-      return false;
-    }
-    --entries_remaining_;
-    cur_kind_and_flags_ = reader_.ReadByte();
-    cur_start_pc_ += reader_.ReadSLEB128();
-    switch (Kind()) {
-      case kScope:
-        cur_end_pc_ = cur_start_pc_ + reader_.ReadUInt();
-        cur_index_ = reader_.ReadSLEB128();
-        cur_token_pos_ = reader_.ReadPosition();
-        cur_end_token_pos_ = reader_.ReadPosition();
-        break;
-      case kVariableDeclaration:
-        cur_index_ = reader_.ReadSLEB128();
-        cur_name_ = reader_.ReadUInt();
-        cur_type_ = reader_.ReadUInt();
-        cur_declaration_token_pos_ = reader_.ReadPosition();
-        cur_token_pos_ = reader_.ReadPosition();
-        break;
-      case kContextVariable:
-        cur_index_ = reader_.ReadSLEB128();
-        break;
-    }
-    return true;
-  }
-
-  // Returns true after iterator moved past the last entry and
-  // MoveNext() returned false.
-  bool IsDone() const { return entries_remaining_ < 0; }
-
-  intptr_t Kind() const { return cur_kind_and_flags_ & kKindMask; }
-  bool IsScope() const { return Kind() == kScope; }
-  bool IsVariableDeclaration() const { return Kind() == kVariableDeclaration; }
-  bool IsContextVariable() const { return Kind() == kContextVariable; }
-
-  intptr_t StartPC() const { return cur_start_pc_; }
-  intptr_t EndPC() const {
-    ASSERT(IsScope() || IsVariableDeclaration());
-    return cur_end_pc_;
-  }
-  intptr_t ContextLevel() const {
-    ASSERT(IsScope());
-    return cur_index_;
-  }
-  TokenPosition StartTokenPos() const {
-    ASSERT(IsScope() || IsVariableDeclaration());
-    return cur_token_pos_;
-  }
-  TokenPosition EndTokenPos() const {
-    ASSERT(IsScope() || IsVariableDeclaration());
-    return cur_end_token_pos_;
-  }
-  intptr_t Index() const {
-    ASSERT(IsVariableDeclaration() || IsContextVariable());
-    return cur_index_;
-  }
-  StringPtr Name() const {
-    ASSERT(IsVariableDeclaration());
-    return String::RawCast(object_pool_.ObjectAt(cur_name_));
-  }
-  AbstractTypePtr Type() const {
-    ASSERT(IsVariableDeclaration());
-    return AbstractType::RawCast(object_pool_.ObjectAt(cur_type_));
-  }
-  TokenPosition DeclarationTokenPos() const {
-    ASSERT(IsVariableDeclaration());
-    return cur_declaration_token_pos_;
-  }
-  bool IsCaptured() const {
-    ASSERT(IsVariableDeclaration());
-    return (cur_kind_and_flags_ & kIsCapturedFlag) != 0;
-  }
-
- private:
-  Reader reader_;
-  const ObjectPool& object_pool_;
-  intptr_t entries_remaining_ = 0;
-  intptr_t cur_kind_and_flags_ = 0;
-  intptr_t cur_start_pc_ = 0;
-  intptr_t cur_end_pc_ = 0;
-  intptr_t cur_index_ = -1;
-  intptr_t cur_name_ = -1;
-  intptr_t cur_type_ = -1;
-  TokenPosition cur_token_pos_ = TokenPosition::kNoSource;
-  TokenPosition cur_declaration_token_pos_ = TokenPosition::kNoSource;
-  TokenPosition cur_end_token_pos_ = TokenPosition::kNoSource;
-};
-
-class BytecodeAttributesMapTraits {
- public:
-  static const char* Name() { return "BytecodeAttributesMapTraits"; }
-  static bool ReportStats() { return false; }
-
-  static bool IsMatch(const Object& a, const Object& b) {
-    return a.raw() == b.raw();
-  }
-
-  static uword Hash(const Object& key) {
-    return String::HashRawSymbol(key.IsFunction() ? Function::Cast(key).name()
-                                                  : Field::Cast(key).name());
-  }
-};
-typedef UnorderedHashMap<BytecodeAttributesMapTraits> BytecodeAttributesMap;
-
-bool IsStaticFieldGetterGeneratedAsInitializer(const Function& function,
-                                               Zone* zone);
-
-}  // namespace kernel
-}  // namespace dart
-
-#endif  // RUNTIME_VM_COMPILER_FRONTEND_BYTECODE_READER_H_
diff --git a/runtime/vm/compiler/frontend/bytecode_scope_builder.cc b/runtime/vm/compiler/frontend/bytecode_scope_builder.cc
deleted file mode 100644
index c88a227..0000000
--- a/runtime/vm/compiler/frontend/bytecode_scope_builder.cc
+++ /dev/null
@@ -1,194 +0,0 @@
-// Copyright (c) 2018, 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.
-
-#include "vm/compiler/frontend/bytecode_scope_builder.h"
-
-#include "vm/compiler/frontend/bytecode_reader.h"
-
-namespace dart {
-namespace kernel {
-
-#define Z (zone_)
-
-BytecodeScopeBuilder::BytecodeScopeBuilder(ParsedFunction* parsed_function)
-    : parsed_function_(parsed_function),
-      zone_(parsed_function->zone()),
-      scope_(nullptr) {}
-
-void BytecodeScopeBuilder::BuildScopes() {
-  if (parsed_function_->scope() != nullptr) {
-    return;  // Scopes are already built.
-  }
-
-  const Function& function = parsed_function_->function();
-
-  LocalScope* enclosing_scope = nullptr;
-  if (function.IsImplicitClosureFunction() && !function.is_static()) {
-    // Create artificial enclosing scope for the tear-off that contains
-    // captured receiver value. This ensure that AssertAssignable will correctly
-    // load instantiator type arguments if they are needed.
-    LocalVariable* receiver_variable =
-        MakeReceiverVariable(/* is_parameter = */ false);
-    receiver_variable->set_is_captured();
-    enclosing_scope = new (Z) LocalScope(NULL, 0, 0);
-    enclosing_scope->set_context_level(0);
-    enclosing_scope->AddVariable(receiver_variable);
-    enclosing_scope->AddContextVariable(receiver_variable);
-  }
-  scope_ = new (Z) LocalScope(enclosing_scope, 0, 0);
-  scope_->set_begin_token_pos(function.token_pos());
-  scope_->set_end_token_pos(function.end_token_pos());
-
-  // Add function type arguments variable before current context variable.
-  if ((function.IsGeneric() || function.HasGenericParent())) {
-    LocalVariable* type_args_var = MakeVariable(
-        Symbols::FunctionTypeArgumentsVar(), AbstractType::dynamic_type());
-    scope_->AddVariable(type_args_var);
-    parsed_function_->set_function_type_arguments(type_args_var);
-  }
-
-  bool needs_expr_temp = false;
-  if (parsed_function_->has_arg_desc_var()) {
-    needs_expr_temp = true;
-    scope_->AddVariable(parsed_function_->arg_desc_var());
-  }
-
-  LocalVariable* context_var = parsed_function_->current_context_var();
-  context_var->set_is_forced_stack();
-  scope_->AddVariable(context_var);
-
-  parsed_function_->set_scope(scope_);
-
-  switch (function.kind()) {
-    case FunctionLayout::kImplicitClosureFunction: {
-      ASSERT(function.NumImplicitParameters() == 1);
-
-      const auto& parent = Function::Handle(Z, function.parent_function());
-      const auto& target =
-          Function::Handle(Z, function.ImplicitClosureTarget(Z));
-
-      // For BuildGraphOfNoSuchMethodForwarder, since closures no longer
-      // require arg_desc_var in all cases.
-      if (target.IsNull() ||
-          (parent.num_fixed_parameters() != target.num_fixed_parameters())) {
-        needs_expr_temp = true;
-      }
-
-      LocalVariable* closure_parameter = MakeVariable(
-          Symbols::ClosureParameter(), AbstractType::dynamic_type());
-      closure_parameter->set_is_forced_stack();
-      scope_->InsertParameterAt(0, closure_parameter);
-
-      // Type check all parameters by default.
-      // This may be overridden with parameter flags in
-      // BytecodeReaderHelper::ParseForwarderFunction.
-      AddParameters(function, LocalVariable::kDoTypeCheck);
-      break;
-    }
-
-    case FunctionLayout::kImplicitGetter:
-    case FunctionLayout::kImplicitSetter: {
-      const bool is_setter = function.IsImplicitSetterFunction();
-      const bool is_method = !function.IsStaticFunction();
-      const Field& field = Field::Handle(Z, function.accessor_field());
-      intptr_t pos = 0;
-      if (is_method) {
-        MakeReceiverVariable(/* is_parameter = */ true);
-        ++pos;
-      }
-      if (is_setter) {
-        LocalVariable* setter_value = MakeVariable(
-            Symbols::Value(),
-            AbstractType::ZoneHandle(Z, function.ParameterTypeAt(pos)));
-        scope_->InsertParameterAt(pos++, setter_value);
-
-        if (is_method) {
-          if (field.is_covariant()) {
-            setter_value->set_is_explicit_covariant_parameter();
-          } else {
-            const bool needs_type_check =
-                field.is_generic_covariant_impl() &&
-                kernel::ProcedureAttributesOf(field, Z).has_non_this_uses;
-            if (!needs_type_check) {
-              setter_value->set_type_check_mode(
-                  LocalVariable::kTypeCheckedByCaller);
-            }
-          }
-        }
-      }
-      break;
-    }
-    case FunctionLayout::kImplicitStaticGetter: {
-      ASSERT(!IsStaticFieldGetterGeneratedAsInitializer(function, Z));
-      break;
-    }
-    case FunctionLayout::kDynamicInvocationForwarder: {
-      // Create [this] variable.
-      MakeReceiverVariable(/* is_parameter = */ true);
-
-      // Type check all parameters by default.
-      // This may be overridden with parameter flags in
-      // BytecodeReaderHelper::ParseForwarderFunction.
-      AddParameters(function, LocalVariable::kDoTypeCheck);
-      break;
-    }
-    case FunctionLayout::kMethodExtractor: {
-      // Add a receiver parameter.  Though it is captured, we emit code to
-      // explicitly copy it to a fixed offset in a freshly-allocated context
-      // instead of using the generic code for regular functions.
-      // Therefore, it isn't necessary to mark it as captured here.
-      MakeReceiverVariable(/* is_parameter = */ true);
-      break;
-    }
-    default:
-      UNREACHABLE();
-  }
-
-  if (needs_expr_temp) {
-    scope_->AddVariable(parsed_function_->EnsureExpressionTemp());
-  }
-  if (parsed_function_->function().MayHaveUncheckedEntryPoint()) {
-    scope_->AddVariable(parsed_function_->EnsureEntryPointsTemp());
-  }
-  parsed_function_->AllocateVariables();
-}
-
-// TODO(alexmarkov): pass bitvectors of parameter covariance to set type
-// check mode before AllocateVariables.
-void BytecodeScopeBuilder::AddParameters(const Function& function,
-                                         LocalVariable::TypeCheckMode mode) {
-  for (intptr_t i = function.NumImplicitParameters(),
-                n = function.NumParameters();
-       i < n; ++i) {
-    // LocalVariable caches handles, so new handles are created for each
-    // parameter.
-    String& name = String::ZoneHandle(Z, function.ParameterNameAt(i));
-    AbstractType& type =
-        AbstractType::ZoneHandle(Z, function.ParameterTypeAt(i));
-
-    LocalVariable* variable = MakeVariable(name, type);
-    variable->set_type_check_mode(mode);
-    scope_->InsertParameterAt(i, variable);
-  }
-}
-
-LocalVariable* BytecodeScopeBuilder::MakeVariable(const String& name,
-                                                  const AbstractType& type) {
-  return new (Z) LocalVariable(TokenPosition::kNoSource,
-                               TokenPosition::kNoSource, name, type, nullptr);
-}
-
-LocalVariable* BytecodeScopeBuilder::MakeReceiverVariable(bool is_parameter) {
-  const auto& cls = Class::Handle(Z, parsed_function_->function().Owner());
-  const auto& type = Type::ZoneHandle(Z, cls.DeclarationType());
-  LocalVariable* receiver_variable = MakeVariable(Symbols::This(), type);
-  parsed_function_->set_receiver_var(receiver_variable);
-  if (is_parameter) {
-    scope_->InsertParameterAt(0, receiver_variable);
-  }
-  return receiver_variable;
-}
-
-}  // namespace kernel
-}  // namespace dart
diff --git a/runtime/vm/compiler/frontend/bytecode_scope_builder.h b/runtime/vm/compiler/frontend/bytecode_scope_builder.h
deleted file mode 100644
index 8f96b87..0000000
--- a/runtime/vm/compiler/frontend/bytecode_scope_builder.h
+++ /dev/null
@@ -1,41 +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.
-
-#ifndef RUNTIME_VM_COMPILER_FRONTEND_BYTECODE_SCOPE_BUILDER_H_
-#define RUNTIME_VM_COMPILER_FRONTEND_BYTECODE_SCOPE_BUILDER_H_
-
-#if defined(DART_PRECOMPILED_RUNTIME)
-#error "AOT runtime should not use compiler sources (including header files)"
-#endif  // defined(DART_PRECOMPILED_RUNTIME)
-
-#include "vm/object.h"
-#include "vm/parser.h"  // For ParsedFunction.
-#include "vm/scopes.h"
-
-namespace dart {
-namespace kernel {
-
-// Builds scopes, populates parameters and local variables for
-// certain functions declared in bytecode.
-class BytecodeScopeBuilder : public ValueObject {
- public:
-  explicit BytecodeScopeBuilder(ParsedFunction* parsed_function);
-
-  void BuildScopes();
-
- private:
-  void AddParameters(const Function& function,
-                     LocalVariable::TypeCheckMode mode);
-  LocalVariable* MakeVariable(const String& name, const AbstractType& type);
-  LocalVariable* MakeReceiverVariable(bool is_parameter);
-
-  ParsedFunction* parsed_function_;
-  Zone* zone_;
-  LocalScope* scope_;
-};
-
-}  // namespace kernel
-}  // namespace dart
-
-#endif  // RUNTIME_VM_COMPILER_FRONTEND_BYTECODE_SCOPE_BUILDER_H_
diff --git a/runtime/vm/compiler/frontend/constant_reader.cc b/runtime/vm/compiler/frontend/constant_reader.cc
index 981790a..6f66e9c 100644
--- a/runtime/vm/compiler/frontend/constant_reader.cc
+++ b/runtime/vm/compiler/frontend/constant_reader.cc
@@ -19,6 +19,19 @@
       script_(helper->script()),
       result_(Instance::Handle(zone_)) {}
 
+InstancePtr ConstantReader::ReadConstantInitializer() {
+  Tag tag = helper_->ReadTag();  // read tag.
+  switch (tag) {
+    case kSomething:
+      return ReadConstantExpression();
+    default:
+      H.ReportError(script_, TokenPosition::kNoSource,
+                    "Not a constant expression: unexpected kernel tag %s (%d)",
+                    Reader::TagName(tag), tag);
+  }
+  return result_.raw();
+}
+
 InstancePtr ConstantReader::ReadConstantExpression() {
   Tag tag = helper_->ReadTag();  // read tag.
   switch (tag) {
@@ -190,8 +203,7 @@
       type_arguments.SetTypeAt(0, type);
       // Instantiate class.
       type = Type::New(list_class, type_arguments, TokenPosition::kNoSource);
-      type = ClassFinalizer::FinalizeType(*active_class_->klass, type,
-                                          ClassFinalizer::kCanonicalize);
+      type = ClassFinalizer::FinalizeType(type);
       type_arguments = type.arguments();
       // Fill array with constant elements.
       const intptr_t length = reader.ReadUInt();
@@ -213,7 +225,7 @@
     case kInstanceConstant: {
       const NameIndex index = reader.ReadCanonicalNameReference();
       const auto& klass = Class::Handle(Z, H.LookupClassByKernelClass(index));
-      if (!klass.is_declaration_loaded() && !klass.is_declared_in_bytecode()) {
+      if (!klass.is_declaration_loaded()) {
         FATAL1(
             "Trying to evaluate an instance constant whose references class "
             "%s is not loaded yet.",
@@ -237,8 +249,7 @@
         // Instantiate class.
         auto& type = AbstractType::Handle(
             Z, Type::New(klass, type_arguments, TokenPosition::kNoSource));
-        type = ClassFinalizer::FinalizeType(*active_class_->klass, type,
-                                            ClassFinalizer::kCanonicalize);
+        type = ClassFinalizer::FinalizeType(type);
         type_arguments = type.arguments();
         instance.SetTypeArguments(type_arguments);
       } else {
diff --git a/runtime/vm/compiler/frontend/constant_reader.h b/runtime/vm/compiler/frontend/constant_reader.h
index 871b7f0..85f230d 100644
--- a/runtime/vm/compiler/frontend/constant_reader.h
+++ b/runtime/vm/compiler/frontend/constant_reader.h
@@ -23,6 +23,7 @@
 
   virtual ~ConstantReader() {}
 
+  InstancePtr ReadConstantInitializer();
   InstancePtr ReadConstantExpression();
   ObjectPtr ReadAnnotations();
 
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
index 148a24a..c5a05cd 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
@@ -5,8 +5,6 @@
 #include "vm/compiler/frontend/kernel_binary_flowgraph.h"
 
 #include "vm/compiler/ffi/callback.h"
-#include "vm/compiler/frontend/bytecode_flow_graph_builder.h"
-#include "vm/compiler/frontend/bytecode_reader.h"
 #include "vm/compiler/frontend/flow_graph_builder.h"  // For dart::FlowGraphBuilder::SimpleInstanceOfType.
 #include "vm/compiler/frontend/prologue_builder.h"
 #include "vm/compiler/jit/compiler.h"
@@ -15,9 +13,6 @@
 #include "vm/stack_frame.h"
 
 namespace dart {
-
-DECLARE_FLAG(bool, enable_interpreter);
-
 namespace kernel {
 
 #define Z (zone_)
@@ -38,6 +33,17 @@
   FieldHelper field_helper(this);
   field_helper.ReadUntilExcluding(FieldHelper::kInitializer);
 
+  // Constants are directly accessed at use sites of Dart code. In C++ - if
+  // we need to access static constants - we do so directly using the kernel
+  // evaluation instead of invoking the initializer function in Dart code.
+  //
+  // If the field is marked as @pragma('vm:entry-point') then the embedder might
+  // invoke the getter, so we'll generate the initializer function.
+  ASSERT(!field_helper.IsConst() ||
+         Field::Handle(Z, parsed_function()->function().accessor_field())
+                 .VerifyEntryPoint(EntryPointPragma::kGetterOnly) ==
+             Error::null());
+
   Tag initializer_tag = ReadTag();  // read first part of initializer.
   if (initializer_tag != kSomething) {
     UNREACHABLE();
@@ -50,14 +56,8 @@
 
   Fragment body(normal_entry);
   body += B->CheckStackOverflowInPrologue(field_helper.position_);
-  if (field_helper.IsConst()) {
-    // This will read the initializer.
-    body += Constant(
-        Instance::ZoneHandle(Z, constant_reader_.ReadConstantExpression()));
-  } else {
-    body += SetupCapturedParameters(parsed_function()->function());
-    body += BuildExpression();  // read initializer.
-  }
+  body += SetupCapturedParameters(parsed_function()->function());
+  body += BuildExpression();  // read initializer.
   body += Return(TokenPosition::kNoSource);
 
   PrologueInfo prologue_info(-1, -1);
@@ -457,32 +457,6 @@
   return instructions;
 }
 
-void StreamingFlowGraphBuilder::ReadDefaultFunctionTypeArguments(
-    const Function& function) {
-  if (!function.IsGeneric()) {
-    return;
-  }
-  AlternativeReadingScope alt(&reader_);
-  FunctionNodeHelper function_node_helper(this);
-  function_node_helper.ReadUntilExcluding(FunctionNodeHelper::kTypeParameters);
-  intptr_t num_type_params = ReadListLength();
-  ASSERT(num_type_params == function.NumTypeParameters());
-  TypeArguments& default_types =
-      TypeArguments::Handle(Z, TypeArguments::New(num_type_params));
-  for (intptr_t i = 0; i < num_type_params; ++i) {
-    TypeParameterHelper helper(this);
-    helper.ReadUntilExcludingAndSetJustRead(TypeParameterHelper::kDefaultType);
-    if (ReadTag() == kSomething) {
-      default_types.SetTypeAt(i, T.BuildType());
-    } else {
-      default_types.SetTypeAt(i, Object::dynamic_type());
-    }
-    helper.Finish();
-  }
-  default_types = default_types.Canonicalize(thread(), nullptr);
-  parsed_function()->SetDefaultFunctionTypeArguments(default_types);
-}
-
 Fragment StreamingFlowGraphBuilder::DebugStepCheckInPrologue(
     const Function& dart_function,
     TokenPosition position) {
@@ -535,7 +509,7 @@
 
   Fragment code;
   code += LoadLocal(async_stack_trace_var);
-  // Call _asyncSetThreadStackTrace
+  // Call _setAsyncThreadStackTrace
   code += StaticCall(TokenPosition::kNoSource, target,
                      /* argument_count = */ 1, ICData::kStatic);
   code += Drop();
@@ -568,12 +542,8 @@
       prologue += IntConstant(dart_function.NumTypeParameters() +
                               dart_function.NumParentTypeParameters());
 
-      const Library& dart_internal =
-          Library::Handle(Z, Library::InternalLibrary());
-      const Function& prepend_function =
-          Function::ZoneHandle(Z, dart_internal.LookupFunctionAllowPrivate(
-                                      Symbols::PrependTypeArguments()));
-      ASSERT(!prepend_function.IsNull());
+      const auto& prepend_function =
+          flow_graph_builder_->PrependTypeArgumentsFunction();
 
       prologue += StaticCall(TokenPosition::kNoSource, prepend_function, 4,
                              ICData::kStatic);
@@ -764,20 +734,17 @@
     Fragment* explicit_checks,
     Fragment* implicit_checks,
     Fragment* implicit_redefinitions) {
-  if (!dart_function.NeedsArgumentTypeChecks()) return;
-
-  // Check if parent function was annotated with no-dynamic-invocations.
-  const ProcedureAttributesMetadata attrs =
-      procedure_attributes_metadata_helper_.GetProcedureAttributes(
-          dart_function.kernel_offset());
-
-  AlternativeReadingScope _(&reader_);
-  SetOffset(type_parameters_offset);
-  B->BuildArgumentTypeChecks(
-      MethodCanSkipTypeChecksForNonCovariantArguments(dart_function, attrs)
-          ? TypeChecksToBuild::kCheckCovariantTypeParameterBounds
-          : TypeChecksToBuild::kCheckAllTypeParameterBounds,
-      explicit_checks, implicit_checks, implicit_redefinitions);
+  if (dart_function.NeedsTypeArgumentTypeChecks()) {
+    B->BuildTypeArgumentTypeChecks(
+        MethodCanSkipTypeChecksForNonCovariantTypeArguments(dart_function)
+            ? TypeChecksToBuild::kCheckCovariantTypeParameterBounds
+            : TypeChecksToBuild::kCheckAllTypeParameterBounds,
+        implicit_checks);
+  }
+  if (dart_function.NeedsArgumentTypeChecks()) {
+    B->BuildArgumentTypeChecks(explicit_checks, implicit_checks,
+                               implicit_redefinitions);
+  }
 }
 
 Fragment StreamingFlowGraphBuilder::ShortcutForUserDefinedEquals(
@@ -1088,55 +1055,6 @@
   ActiveMemberScope active_member(active_class(), &outermost_function);
   ActiveTypeParametersScope active_type_params(active_class(), function, Z);
 
-  if (function.is_declared_in_bytecode()) {
-    bytecode_metadata_helper_.ParseBytecodeFunction(parsed_function());
-
-    switch (function.kind()) {
-      case FunctionLayout::kImplicitClosureFunction:
-        return B->BuildGraphOfImplicitClosureFunction(function);
-      case FunctionLayout::kImplicitGetter:
-      case FunctionLayout::kImplicitSetter:
-        return B->BuildGraphOfFieldAccessor(function);
-      case FunctionLayout::kImplicitStaticGetter: {
-        if (IsStaticFieldGetterGeneratedAsInitializer(function, Z)) {
-          break;
-        }
-        return B->BuildGraphOfFieldAccessor(function);
-      }
-      case FunctionLayout::kDynamicInvocationForwarder:
-        return B->BuildGraphOfDynamicInvocationForwarder(function);
-      case FunctionLayout::kMethodExtractor:
-        return B->BuildGraphOfMethodExtractor(function);
-      case FunctionLayout::kNoSuchMethodDispatcher:
-        return B->BuildGraphOfNoSuchMethodDispatcher(function);
-      default:
-        break;
-    }
-
-    ASSERT(function.HasBytecode());
-
-    BytecodeFlowGraphBuilder bytecode_compiler(
-        flow_graph_builder_, parsed_function(),
-        &(flow_graph_builder_->ic_data_array_));
-
-    if (B->IsRecognizedMethodForFlowGraph(function)) {
-      bytecode_compiler.CreateParameterVariables();
-      return B->BuildGraphOfRecognizedMethod(function);
-    }
-
-    return bytecode_compiler.BuildGraph();
-  }
-
-  // Certain special functions could have a VM-internal bytecode
-  // attached to them.
-  ASSERT((!function.HasBytecode()) ||
-         (function.kind() == FunctionLayout::kImplicitGetter) ||
-         (function.kind() == FunctionLayout::kImplicitSetter) ||
-         (function.kind() == FunctionLayout::kImplicitStaticGetter) ||
-         (function.kind() == FunctionLayout::kMethodExtractor) ||
-         (function.kind() == FunctionLayout::kInvokeFieldDispatcher) ||
-         (function.kind() == FunctionLayout::kNoSuchMethodDispatcher));
-
   ParseKernelASTFunction();
 
   switch (function.kind()) {
@@ -1215,7 +1133,6 @@
     case FunctionLayout::kImplicitClosureFunction:
       ReadUntilFunctionNode();
       SetupDefaultParameterValues();
-      ReadDefaultFunctionTypeArguments(function);
       break;
     case FunctionLayout::kImplicitGetter:
     case FunctionLayout::kImplicitStaticGetter:
@@ -1230,7 +1147,6 @@
       if (PeekTag() != kField) {
         ReadUntilFunctionNode();
         SetupDefaultParameterValues();
-        ReadDefaultFunctionTypeArguments(function);
       }
       break;
     case FunctionLayout::kSignatureFunction:
@@ -1632,10 +1548,9 @@
   ArgumentsDescriptor args_desc(
       Array::Handle(Z, ArgumentsDescriptor::NewBoxed(
                            type_args_len, argument_count, argument_names)));
-  Function& function =
-      Function::Handle(Z, Resolver::ResolveDynamicForReceiverClassAllowPrivate(
+  return Function::Handle(Z,
+                          Resolver::ResolveDynamicForReceiverClassAllowPrivate(
                               klass, name, args_desc, /*allow_add=*/false));
-  return function;
 }
 
 bool StreamingFlowGraphBuilder::NeedsDebugStepCheck(const Function& function,
@@ -2453,16 +2368,17 @@
                                       const Class& klass) {
   Function& nsm_function = Function::Handle(zone);
   Class& iterate_klass = Class::Handle(zone, klass.raw());
-  while (!iterate_klass.IsNull()) {
-    if (iterate_klass.EnsureIsFinalized(thread) == Error::null()) {
-      nsm_function =
-          iterate_klass.LookupDynamicFunction(Symbols::NoSuchMethod());
+  if (!iterate_klass.IsNull() &&
+      iterate_klass.EnsureIsFinalized(thread) == Error::null()) {
+    while (!iterate_klass.IsNull()) {
+      nsm_function = Resolver::ResolveDynamicFunction(zone, iterate_klass,
+                                                      Symbols::NoSuchMethod());
+      if (!nsm_function.IsNull() && nsm_function.NumParameters() == 2 &&
+          nsm_function.NumTypeParameters() == 0) {
+        break;
+      }
+      iterate_klass = iterate_klass.SuperClass();
     }
-    if (!nsm_function.IsNull() && nsm_function.NumParameters() == 2 &&
-        nsm_function.NumTypeParameters() == 0) {
-      break;
-    }
-    iterate_klass = iterate_klass.SuperClass();
   }
   // We are guaranteed to find noSuchMethod of class Object.
   ASSERT(!nsm_function.IsNull());
@@ -2544,9 +2460,9 @@
   // Search the superclass chain for the selector looking for either getter or
   // method.
   Function& function = Function::Handle(Z);
-  while (!klass.IsNull()) {
-    if (klass.EnsureIsFinalized(thread()) == Error::null()) {
-      function = klass.LookupDynamicFunction(method_name);
+  if (!klass.IsNull() && klass.EnsureIsFinalized(thread()) == Error::null()) {
+    while (!klass.IsNull()) {
+      function = Resolver::ResolveDynamicFunction(Z, klass, method_name);
       if (!function.IsNull()) {
         Function& target =
             Function::ZoneHandle(Z, function.ImplicitClosureFunction());
@@ -2555,10 +2471,10 @@
         // which captures `this`.
         return BuildImplicitClosureCreation(target);
       }
-      function = klass.LookupDynamicFunction(getter_name);
+      function = Resolver::ResolveDynamicFunction(Z, klass, getter_name);
       if (!function.IsNull()) break;
+      klass = klass.SuperClass();
     }
-    klass = klass.SuperClass();
   }
 
   Fragment instructions;
@@ -2608,7 +2524,7 @@
 
   Function& function = Function::Handle(Z);
   if (klass.EnsureIsFinalized(thread()) == Error::null()) {
-    function = H.LookupDynamicFunction(klass, setter_name);
+    function = Resolver::ResolveDynamicFunction(Z, klass, setter_name);
   }
 
   Fragment instructions(MakeTemp());
@@ -2771,6 +2687,7 @@
 
 Fragment StreamingFlowGraphBuilder::BuildMethodInvocation(TokenPosition* p) {
   const intptr_t offset = ReaderOffset() - 1;     // Include the tag.
+  ReadFlags();                                    // read flags.
   const TokenPosition position = ReadPosition();  // read position.
   if (p != NULL) *p = position;
 
@@ -3209,8 +3126,6 @@
                                   NULL));
 
   // Special case identical(x, y) call.
-  // Note: similar optimization is performed in bytecode flow graph builder -
-  // see BytecodeFlowGraphBuilder::BuildDirectCall().
   // TODO(27590) consider moving this into the inliner and force inline it
   // there.
   if (special_case_identical) {
@@ -3254,8 +3169,7 @@
       Type& type = Type::ZoneHandle(Z, T.ReceiverType(klass).raw());
 
       // TODO(27590): Can we move this code into [ReceiverType]?
-      type ^= ClassFinalizer::FinalizeType(*active_class()->klass, type,
-                                           ClassFinalizer::kFinalize);
+      type ^= ClassFinalizer::FinalizeType(type, ClassFinalizer::kFinalize);
       TypeArguments& canonicalized_type_arguments =
           TypeArguments::ZoneHandle(Z, type.arguments());
       canonicalized_type_arguments =
@@ -3874,8 +3788,8 @@
   ASSERT(!future.IsNull());
   const auto& error = future.EnsureIsFinalized(thread());
   ASSERT(error == Error::null());
-  const Function& constructor =
-      Function::ZoneHandle(Z, future.LookupFunction(Symbols::FutureValue()));
+  Function& constructor = Function::ZoneHandle(
+      Z, Resolver::ResolveFunction(Z, future, Symbols::FutureValue()));
   ASSERT(!constructor.IsNull());
 
   Fragment instructions;
@@ -4014,6 +3928,8 @@
   Fragment instructions;
 
   instructions += EnterScope(offset);
+  ReadPosition();                           // read file offset.
+  ReadPosition();                           // read file end offset.
   intptr_t list_length = ReadListLength();  // read number of statements.
   for (intptr_t i = 0; i < list_length; ++i) {
     if (instructions.is_open()) {
@@ -4878,13 +4794,19 @@
 
   Fragment continuation(instructions.entry, anchor);
 
-  if (parsed_function()->function().IsAsyncClosure() ||
-      parsed_function()->function().IsAsyncGenClosure()) {
-    // If function is async closure or async gen closure it takes three
+  RELEASE_ASSERT(parsed_function()->function().IsAsyncClosure() ||
+                 parsed_function()->function().IsAsyncGenClosure() ||
+                 parsed_function()->function().IsSyncGenClosure());
+
+  // TODO(43900): Only emit this when needed.
+  {
+    // If function is {async, async gen, sync yielding} closure it takes three
     // parameters where the second and the third are exception and stack_trace.
     // Check if exception is non-null and rethrow it.
     //
-    //   :async_op([:result, :exception, :stack_trace]) {
+    //   :sync_op(:iterator, [:exception, :stack_trace]) {
+    // or:
+    //   :async_op(:result, [:exception, :stack_trace]) {
     //     ...
     //     Continuation<index>:
     //       if (:exception != null) rethrow(:exception, :stack_trace);
@@ -4903,13 +4825,15 @@
     continuation += LoadLocal(exception_var);
     continuation += BranchIfNull(&no_error, &error);
 
-    Fragment rethrow(error);
+    Fragment rethrow(/*instruction=*/error);
     rethrow += LoadLocal(exception_var);
     rethrow += LoadLocal(stack_trace_var);
+
     rethrow += RethrowException(position, kInvalidTryIndex);
     Drop();
 
-    continuation = Fragment(continuation.entry, no_error);
+    // Set current to the end of the no_error branch.
+    continuation = Fragment(/*entry=*/continuation.entry, /*current=*/no_error);
   }
 
   return continuation;
@@ -5040,6 +4964,16 @@
       }
       function.set_is_generated_body(function_node_helper.async_marker_ ==
                                      FunctionNodeHelper::kSyncYielding);
+      // sync* functions contain two nested synthetic functions, the first of
+      // which (sync_op_gen) is a regular sync function so we need to manually
+      // label it generated:
+      if (function.parent_function() != Function::null()) {
+        const auto& parent = Function::Handle(function.parent_function());
+        if (parent.IsSyncGenerator()) {
+          function.set_is_generated_body(true);
+        }
+      }
+      // Note: Is..() methods use the modifiers set above, so order matters.
       if (function.IsAsyncClosure() || function.IsAsyncGenClosure()) {
         function.set_is_inlinable(!FLAG_causal_async_stacks &&
                                   !FLAG_lazy_async_stacks);
@@ -5061,8 +4995,7 @@
 
       // Finalize function type.
       Type& signature_type = Type::Handle(Z, function.SignatureType());
-      signature_type ^=
-          ClassFinalizer::FinalizeType(*active_class()->klass, signature_type);
+      signature_type ^= ClassFinalizer::FinalizeType(signature_type);
       function.SetSignatureType(signature_type);
 
       I->AddClosureFunction(function);
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
index 2f4b90f..ef94bf3 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
@@ -9,7 +9,6 @@
 #error "AOT runtime should not use compiler sources (including header files)"
 #endif  // defined(DART_PRECOMPILED_RUNTIME)
 
-#include "vm/compiler/frontend/bytecode_reader.h"
 #include "vm/compiler/frontend/constant_reader.h"
 #include "vm/compiler/frontend/kernel_to_il.h"
 #include "vm/compiler/frontend/kernel_translation_helper.h"
@@ -41,7 +40,6 @@
                          &constant_reader_,
                          active_class_,
                          /* finalize= */ true),
-        bytecode_metadata_helper_(this, active_class_),
         direct_call_metadata_helper_(this),
         inferred_type_metadata_helper_(this, &constant_reader_),
         procedure_attributes_metadata_helper_(this),
@@ -63,7 +61,6 @@
   void ReadForwardingStubTarget(const Function& function);
   void EvaluateConstFieldValue(const Field& field);
   void SetupDefaultParameterValues();
-  void ReadDefaultFunctionTypeArguments(const Function& function);
 
   FlowGraph* BuildGraphOfFieldInitializer();
   Fragment BuildFieldInitializer(const Field& field,
@@ -414,7 +411,6 @@
   ActiveClass* const active_class_;
   ConstantReader constant_reader_;
   TypeTranslator type_translator_;
-  BytecodeMetadataHelper bytecode_metadata_helper_;
   DirectCallMetadataHelper direct_call_metadata_helper_;
   InferredTypeMetadataHelper inferred_type_metadata_helper_;
   ProcedureAttributesMetadataHelper procedure_attributes_metadata_helper_;
diff --git a/runtime/vm/compiler/frontend/kernel_fingerprints.cc b/runtime/vm/compiler/frontend/kernel_fingerprints.cc
index 51ddf29..0a40040 100644
--- a/runtime/vm/compiler/frontend/kernel_fingerprints.cc
+++ b/runtime/vm/compiler/frontend/kernel_fingerprints.cc
@@ -410,6 +410,7 @@
       CalculateExpressionFingerprint();     // read expression.
       return;
     case kMethodInvocation:
+      ReadFlags();                               // read flags.
       ReadPosition();                            // read position.
       CalculateExpressionFingerprint();          // read receiver.
       BuildHash(ReadNameAsMethodName().Hash());  // read name.
@@ -583,6 +584,8 @@
       CalculateExpressionFingerprint();  // read expression.
       return;
     case kBlock:
+      ReadPosition();  // read file offset.
+      ReadPosition();  // read file end offset.
       CalculateStatementListFingerprint();
       return;
     case kEmptyStatement:
@@ -797,7 +800,7 @@
 
   String& name = String::Handle(zone, klass.Name());
   const Array& fields = Array::Handle(zone, klass.fields());
-  const Array& functions = Array::Handle(zone, klass.functions());
+  const Array& functions = Array::Handle(zone, klass.current_functions());
   const Array& interfaces = Array::Handle(zone, klass.interfaces());
   AbstractType& type = AbstractType::Handle(zone);
 
diff --git a/runtime/vm/compiler/frontend/kernel_to_il.cc b/runtime/vm/compiler/frontend/kernel_to_il.cc
index 87a3298..48aae11 100644
--- a/runtime/vm/compiler/frontend/kernel_to_il.cc
+++ b/runtime/vm/compiler/frontend/kernel_to_il.cc
@@ -68,7 +68,9 @@
       switch_block_(NULL),
       try_catch_block_(NULL),
       try_finally_block_(NULL),
-      catch_block_(NULL) {
+      catch_block_(NULL),
+      prepend_type_arguments_(Function::ZoneHandle(zone_)),
+      throw_new_null_assertion_(Function::ZoneHandle(zone_)) {
   const Script& script =
       Script::Handle(Z, parsed_function->function().script());
   H.InitFromScript(script);
@@ -741,15 +743,9 @@
          info.potential_natives() == GrowableObjectArray::null());
 #endif
 
-  auto& kernel_data = ExternalTypedData::Handle(Z);
-  intptr_t kernel_data_program_offset = 0;
-  if (!function.is_declared_in_bytecode()) {
-    kernel_data = function.KernelData();
-    kernel_data_program_offset = function.KernelDataProgramOffset();
-  }
+  auto& kernel_data = ExternalTypedData::Handle(Z, function.KernelData());
+  intptr_t kernel_data_program_offset = function.KernelDataProgramOffset();
 
-  // TODO(alexmarkov): refactor this - StreamingFlowGraphBuilder should not be
-  //  used for bytecode functions.
   StreamingFlowGraphBuilder streaming_flow_graph_builder(
       this, kernel_data, kernel_data_program_offset);
   return streaming_flow_graph_builder.BuildGraph();
@@ -835,11 +831,6 @@
     case MethodRecognizer::kFfiStorePointer:
     case MethodRecognizer::kFfiFromAddress:
     case MethodRecognizer::kFfiGetAddress:
-    // This list must be kept in sync with BytecodeReaderHelper::NativeEntry in
-    // runtime/vm/compiler/frontend/bytecode_reader.cc and implemented in the
-    // bytecode interpreter in runtime/vm/interpreter.cc. Alternatively, these
-    // methods must work in their original form (a Dart body or native entry) in
-    // the bytecode interpreter.
     case MethodRecognizer::kObjectEquals:
     case MethodRecognizer::kStringBaseLength:
     case MethodRecognizer::kStringBaseIsEmpty:
@@ -1264,7 +1255,7 @@
       const classid_t typed_data_cid =
           compiler::ffi::ElementTypedDataCid(ffi_type_arg_cid);
       const auto& native_rep = compiler::ffi::NativeType::FromTypedDataClassId(
-          ffi_type_arg_cid, zone_);
+          zone_, ffi_type_arg_cid);
 
       ASSERT(function.NumParameters() == 2);
       LocalVariable* arg_pointer = parsed_function_->RawParameterVariable(0);
@@ -1282,8 +1273,8 @@
       body += LoadUntagged(compiler::target::PointerBase::data_field_offset());
       body += LoadLocal(arg_offset_not_null);
       body += UnboxTruncate(kUnboxedFfiIntPtr);
-      body += LoadIndexedTypedData(typed_data_cid, /*index_scale=*/1,
-                                   /*index_unboxed=*/true);
+      body += LoadIndexed(typed_data_cid, /*index_scale=*/1,
+                          /*index_unboxed=*/true);
       if (kind == MethodRecognizer::kFfiLoadFloat ||
           kind == MethodRecognizer::kFfiLoadDouble) {
         if (kind == MethodRecognizer::kFfiLoadFloat) {
@@ -1345,7 +1336,7 @@
       const classid_t typed_data_cid =
           compiler::ffi::ElementTypedDataCid(ffi_type_arg_cid);
       const auto& native_rep = compiler::ffi::NativeType::FromTypedDataClassId(
-          ffi_type_arg_cid, zone_);
+          zone_, ffi_type_arg_cid);
 
       LocalVariable* arg_pointer = parsed_function_->RawParameterVariable(0);
       LocalVariable* arg_offset = parsed_function_->RawParameterVariable(1);
@@ -1705,14 +1696,21 @@
 Fragment FlowGraphBuilder::AssertSubtype(TokenPosition position,
                                          const AbstractType& sub_type_value,
                                          const AbstractType& super_type_value,
-                                         const String& dst_name) {
+                                         const String& dst_name_value) {
   Fragment instructions;
-
   instructions += LoadInstantiatorTypeArguments();
   instructions += LoadFunctionTypeArguments();
-  instructions += Constant(AbstractType::ZoneHandle(sub_type_value.raw()));
-  instructions += Constant(AbstractType::ZoneHandle(super_type_value.raw()));
+  instructions += Constant(AbstractType::ZoneHandle(Z, sub_type_value.raw()));
+  instructions += Constant(AbstractType::ZoneHandle(Z, super_type_value.raw()));
+  instructions += Constant(String::ZoneHandle(Z, dst_name_value.raw()));
+  instructions += AssertSubtype(position);
+  return instructions;
+}
 
+Fragment FlowGraphBuilder::AssertSubtype(TokenPosition position) {
+  Fragment instructions;
+
+  Value* dst_name = Pop();
   Value* super_type = Pop();
   Value* sub_type = Pop();
   Value* function_type_args = Pop();
@@ -1726,11 +1724,8 @@
   return instructions;
 }
 
-void FlowGraphBuilder::BuildArgumentTypeChecks(
-    TypeChecksToBuild mode,
-    Fragment* explicit_checks,
-    Fragment* implicit_checks,
-    Fragment* implicit_redefinitions) {
+void FlowGraphBuilder::BuildTypeArgumentTypeChecks(TypeChecksToBuild mode,
+                                                   Fragment* implicit_checks) {
   const Function& dart_function = parsed_function_->function();
 
   const Function* forwarding_target = nullptr;
@@ -1796,6 +1791,19 @@
   } else {
     *implicit_checks += check_bounds;
   }
+}
+
+void FlowGraphBuilder::BuildArgumentTypeChecks(
+    Fragment* explicit_checks,
+    Fragment* implicit_checks,
+    Fragment* implicit_redefinitions) {
+  const Function& dart_function = parsed_function_->function();
+
+  const Function* forwarding_target = nullptr;
+  if (parsed_function_->is_forwarding_stub()) {
+    forwarding_target = parsed_function_->forwarding_stub_super_target();
+    ASSERT(!forwarding_target->IsNull());
+  }
 
   const intptr_t num_params = dart_function.NumParameters();
   for (intptr_t i = dart_function.NumImplicitParameters(); i < num_params;
@@ -2045,8 +2053,32 @@
   LocalVariable* has_named_params = nullptr;
   LocalVariable* parameter_names = nullptr;
   LocalVariable* type_parameters = nullptr;
+  LocalVariable* closure_data = nullptr;
+  LocalVariable* default_tav_info = nullptr;
+  LocalVariable* instantiator_type_args = nullptr;
+  LocalVariable* parent_function_type_args = nullptr;
 };
 
+Fragment FlowGraphBuilder::TestClosureFunctionGeneric(
+    const ClosureCallInfo& info,
+    Fragment generic,
+    Fragment not_generic) {
+  JoinEntryInstr* after_branch = BuildJoinEntry();
+
+  Fragment check;
+  check += LoadLocal(info.type_parameters);
+  TargetEntryInstr *is_not_generic, *is_generic;
+  check += BranchIfNull(&is_not_generic, &is_generic);
+
+  generic.Prepend(is_generic);
+  generic += Goto(after_branch);
+
+  not_generic.Prepend(is_not_generic);
+  not_generic += Goto(after_branch);
+
+  return Fragment(check.entry, after_branch);
+}
+
 Fragment FlowGraphBuilder::TestClosureFunctionNamedParameterRequired(
     const ClosureCallInfo& info,
     Fragment set,
@@ -2094,7 +2126,7 @@
   check_required.current = valid_index;
   check_required += LoadLocal(info.parameter_names);
   check_required += LoadLocal(flags_index);
-  check_required += LoadIndexed(compiler::target::kWordSize);
+  check_required += LoadIndexed(kArrayCid);
   check_required += LoadLocal(opt_index);
   check_required +=
       IntConstant(compiler::target::kNumParameterFlagsPerElement - 1);
@@ -2126,6 +2158,101 @@
   return check_required;
 }
 
+Fragment FlowGraphBuilder::BuildClosureCallDefaultTypeHandling(
+    const ClosureCallInfo& info) {
+  if (info.descriptor.TypeArgsLen() > 0) {
+    ASSERT(parsed_function_->function_type_arguments() != nullptr);
+    // A TAV was provided, so we don't need default type argument handling
+    // and can just take the arguments we were given.
+    Fragment store_provided;
+    store_provided += LoadLocal(parsed_function_->function_type_arguments());
+    store_provided += StoreLocal(info.vars->function_type_args);
+    store_provided += Drop();
+    return store_provided;
+  }
+
+  // Load the defaults, instantiating or replacing them with the other type
+  // arguments as appropriate.
+  Fragment store_default;
+  store_default += LoadLocal(info.default_tav_info);
+  static_assert(
+      Function::DefaultTypeArgumentsKindField::shift() == 0,
+      "Need to generate shift for DefaultTypeArgumentsKindField bit field");
+  store_default += IntConstant(Function::DefaultTypeArgumentsKindField::mask());
+  store_default += SmiBinaryOp(Token::kBIT_AND);
+  LocalVariable* default_tav_kind = MakeTemporary("default_tav_kind");
+
+  // One read-only stack values (default_tav_kind) that must be dropped after
+  // rejoining at done.
+  JoinEntryInstr* done = BuildJoinEntry();
+
+  store_default += LoadLocal(default_tav_kind);
+  TargetEntryInstr *is_instantiated, *is_not_instantiated;
+  store_default += IntConstant(static_cast<intptr_t>(
+      Function::DefaultTypeArgumentsKind::kIsInstantiated));
+  store_default += BranchIfEqual(&is_instantiated, &is_not_instantiated);
+  store_default.current = is_not_instantiated;  // Check next case.
+  store_default += LoadLocal(default_tav_kind);
+  TargetEntryInstr *needs_instantiation, *can_share;
+  store_default += IntConstant(static_cast<intptr_t>(
+      Function::DefaultTypeArgumentsKind::kNeedsInstantiation));
+  store_default += BranchIfEqual(&needs_instantiation, &can_share);
+  store_default.current = can_share;  // Check next case.
+  store_default += LoadLocal(default_tav_kind);
+  TargetEntryInstr *can_share_instantiator, *can_share_function;
+  store_default += IntConstant(static_cast<intptr_t>(
+      Function::DefaultTypeArgumentsKind::kSharesInstantiatorTypeArguments));
+  store_default += BranchIfEqual(&can_share_instantiator, &can_share_function);
+
+  Fragment instantiated(is_instantiated);
+  instantiated += LoadLocal(info.closure_data);
+  instantiated += LoadNativeField(Slot::ClosureData_default_type_arguments());
+  instantiated += StoreLocal(info.vars->function_type_args);
+  instantiated += Drop();
+  instantiated += Goto(done);
+
+  Fragment do_instantiation(needs_instantiation);
+  // Load the instantiator type arguments.
+  do_instantiation += LoadLocal(info.instantiator_type_args);
+  // Load the parent function type arguments. (No local function type arguments
+  // can be used within the defaults).
+  do_instantiation += LoadLocal(info.parent_function_type_args);
+  // Load the default type arguments to instantiate.
+  do_instantiation += LoadLocal(info.closure_data);
+  do_instantiation +=
+      LoadNativeField(Slot::ClosureData_default_type_arguments());
+  do_instantiation += InstantiateDynamicTypeArguments();
+  do_instantiation += StoreLocal(info.vars->function_type_args);
+  do_instantiation += Drop();
+  do_instantiation += Goto(done);
+
+  Fragment share_instantiator(can_share_instantiator);
+  share_instantiator += LoadLocal(info.instantiator_type_args);
+  share_instantiator += StoreLocal(info.vars->function_type_args);
+  share_instantiator += Drop();
+  share_instantiator += Goto(done);
+
+  Fragment share_function(can_share_function);
+  // Since the defaults won't have local type parameters, these must all be
+  // from the parent function type arguments, so we can just use it.
+  share_function += LoadLocal(info.parent_function_type_args);
+  share_function += StoreLocal(info.vars->function_type_args);
+  share_function += Drop();
+  share_function += Goto(done);
+
+  store_default.current = done;  // Return here after branching.
+  store_default += DropTemporary(&default_tav_kind);
+
+  Fragment store_delayed;
+  store_delayed += LoadLocal(info.closure);
+  store_delayed += LoadNativeField(Slot::Closure_delayed_type_arguments());
+  store_delayed += StoreLocal(info.vars->function_type_args);
+  store_delayed += Drop();
+
+  // Use the delayed type args if present, else the default ones.
+  return TestDelayedTypeArgs(info.closure, store_delayed, store_default);
+}
+
 Fragment FlowGraphBuilder::BuildClosureCallNamedArgumentsCheck(
     const ClosureCallInfo& info) {
   // When no named arguments are provided, we just need to check for possible
@@ -2189,7 +2316,7 @@
   // First load the name we need to check against.
   loop_body += LoadLocal(info.parameter_names);
   loop_body += LoadLocal(info.vars->current_param_index);
-  loop_body += LoadIndexed(compiler::target::kWordSize);
+  loop_body += LoadIndexed(kArrayCid);
   LocalVariable* param_name = MakeTemporary("param_name");  // Read only.
 
   // One additional local value on the stack within the loop body (param_name)
@@ -2349,31 +2476,98 @@
   return check_entry;
 }
 
+Fragment FlowGraphBuilder::BuildClosureCallTypeArgumentsTypeCheck(
+    const ClosureCallInfo& info) {
+  JoinEntryInstr* done = BuildJoinEntry();
+  JoinEntryInstr* loop = BuildJoinEntry();
+
+  // We assume that the value stored in :t_type_parameters is not null (i.e.,
+  // the function stored in :t_function is generic).
+  Fragment loop_init;
+  // Loop over the type parameters array.
+  loop_init += IntConstant(0);
+  loop_init += StoreLocal(info.vars->current_param_index);
+  loop_init += Drop();
+  loop_init += Goto(loop);
+
+  Fragment loop_check(loop);
+  loop_check += LoadLocal(info.vars->current_param_index);
+  loop_check += LoadLocal(info.type_parameters);
+  loop_check += LoadNativeField(Slot::TypeArguments_length());
+  loop_check += SmiRelationalOp(Token::kLT);
+  TargetEntryInstr *more, *no_more;
+  loop_check += BranchIfTrue(&more, &no_more);
+
+  Fragment(no_more) + Goto(done);
+
+  Fragment loop_body(more);
+  loop_body += LoadLocal(info.type_parameters);
+  loop_body += LoadLocal(info.vars->current_param_index);
+  loop_body += LoadIndexed(kTypeArgumentsCid);
+  LocalVariable* current_param = MakeTemporary("current_param");  // Read-only.
+
+  // One read-only local variable on stack (param) to drop after joining.
+  JoinEntryInstr* next = BuildJoinEntry();
+
+  loop_body += LoadLocal(current_param);
+  loop_body += LoadNativeField(Slot::TypeParameter_flags());
+  loop_body += Box(kUnboxedUint8);
+  loop_body += IntConstant(
+      TypeParameterLayout::GenericCovariantImplBit::mask_in_place());
+  loop_body += SmiBinaryOp(Token::kBIT_AND);
+  loop_body += IntConstant(0);
+  TargetEntryInstr *is_noncovariant, *is_covariant;
+  loop_body += BranchIfEqual(&is_noncovariant, &is_covariant);
+
+  Fragment(is_covariant) + Goto(next);  // Continue if covariant.
+
+  loop_body.current = is_noncovariant;  // Type check if non-covariant.
+  loop_body += LoadLocal(info.instantiator_type_args);
+  loop_body += LoadLocal(info.vars->function_type_args);
+  // Load parameter.
+  loop_body += LoadLocal(current_param);
+  // Load bounds from parameter.
+  loop_body += LoadLocal(current_param);
+  loop_body += LoadNativeField(Slot::TypeParameter_bound());
+  // Load name from parameter.
+  loop_body += LoadLocal(current_param);
+  loop_body += LoadNativeField(Slot::TypeParameter_name());
+  // Assert that the type the parameter is instantiated as is consistent with
+  // the bounds of the parameter.
+  loop_body += AssertSubtype(TokenPosition::kNoSource);
+  loop_body += Goto(next);
+
+  Fragment loop_incr(next);
+  loop_incr += DropTemporary(&current_param);
+  loop_incr += LoadLocal(info.vars->current_param_index);
+  loop_incr += IntConstant(1);
+  loop_incr += SmiBinaryOp(Token::kADD, /*is_truncating=*/true);
+  loop_incr += StoreLocal(info.vars->current_param_index);
+  loop_incr += Drop();
+  loop_incr += Goto(loop);
+
+  return Fragment(loop_init.entry, done);
+}
+
 Fragment FlowGraphBuilder::BuildDynamicClosureCallChecks(
     LocalVariable* closure) {
   ClosureCallInfo info(closure, BuildThrowNoSuchMethod(),
                        saved_args_desc_array(),
                        parsed_function_->dynamic_closure_call_vars());
 
-  // We extract all the packed fields here so code generation that puts unboxed
-  // integers on the expression stack even in unoptimized code is in one place.
-  auto const rep = Slot::Function_packed_fields().representation();
-
   Fragment body;
   body += LoadLocal(info.closure);
   body += LoadNativeField(Slot::Closure_function());
   info.function = MakeTemporary("function");
 
   body += LoadLocal(info.function);
-  body += LoadNativeField(Slot::Function_packed_fields());
-  body +=
-      BuildExtractPackedFieldIntoSmi<Function::PackedNumFixedParameters>(rep);
+  body += BuildExtractUnboxedSlotBitFieldIntoSmi<
+      Function::PackedNumFixedParameters>(Slot::Function_packed_fields());
   info.num_fixed_params = MakeTemporary("num_fixed_params");
 
   body += LoadLocal(info.function);
-  body += LoadNativeField(Slot::Function_packed_fields());
-  body += BuildExtractPackedFieldIntoSmi<Function::PackedNumOptionalParameters>(
-      rep);
+  body += BuildExtractUnboxedSlotBitFieldIntoSmi<
+      Function::PackedNumOptionalParameters>(Slot::Function_packed_fields());
   info.num_opt_params = MakeTemporary("num_opt_params");
 
   body += LoadLocal(info.num_fixed_params);
@@ -2382,9 +2576,10 @@
   info.num_max_params = MakeTemporary("num_max_params");
 
   body += LoadLocal(info.function);
-  body += LoadNativeField(Slot::Function_packed_fields());
-  body += BuildExtractPackedFieldIntoSmi<
-      Function::PackedHasNamedOptionalParameters>(rep);
+  body += BuildExtractUnboxedSlotBitFieldIntoSmi<
+      Function::PackedHasNamedOptionalParameters>(
+      Slot::Function_packed_fields());
+
   body += IntConstant(0);
   body += StrictCompare(Token::kNE_STRICT);
   info.has_named_params = MakeTemporary("has_named_params");
@@ -2395,21 +2590,86 @@
     info.parameter_names = MakeTemporary("parameter_names");
   }
 
-  if (info.descriptor.TypeArgsLen() > 0) {
-    body += LoadLocal(info.function);
-    body += LoadNativeField(Slot::Function_type_parameters());
-    info.type_parameters = MakeTemporary("type_parameters");
-  }
+  body += LoadLocal(info.function);
+  body += LoadNativeField(Slot::Function_type_parameters());
+  info.type_parameters = MakeTemporary("type_parameters");
 
-  // Check that the shape of the arguments generally matches what the
-  // closure function expects. The only remaining non-type check after this
-  // is that the names for optional arguments are valid.
+  body += LoadLocal(info.closure);
+  body += LoadNativeField(Slot::Closure_instantiator_type_arguments());
+  info.instantiator_type_args = MakeTemporary("instantiator_type_args");
+
+  body += LoadLocal(info.closure);
+  body += LoadNativeField(Slot::Closure_function_type_arguments());
+  info.parent_function_type_args = MakeTemporary("parent_function_type_args");
+
+  // At this point, all the read-only temporaries stored in the ClosureCallInfo
+  // should be either loaded or still nullptr, if not needed for this function.
+  // Now we check that the arguments to the closure call have the right shape.
   body += BuildClosureCallArgumentsValidCheck(info);
 
-  // TODO(dartbug.com/40813): Move checks that are currently compiled
-  // in the closure body to here, using the dynamic versions of
-  // AssertSubtype to typecheck the type arguments using the runtime types
-  // available in the closure object.
+  // If the closure function is not generic, there are no local function type
+  // args. Thus, use whatever was stored for the parent function type arguments,
+  // which has already been checked against any parent type parameter bounds.
+  Fragment not_generic;
+  not_generic += LoadLocal(info.parent_function_type_args);
+  not_generic += StoreLocal(info.vars->function_type_args);
+  not_generic += Drop();
+
+  // If the closure function is generic, then we first need to calculate the
+  // full set of function type arguments, then check the local function type
+  // arguments against the closure function's type parameter bounds.
+  Fragment generic;
+  generic += LoadLocal(info.function);
+  generic += LoadNativeField(Slot::Function_data());
+  info.closure_data = MakeTemporary("closure_data");
+  generic += LoadLocal(info.closure_data);
+  generic += LoadNativeField(Slot::ClosureData_default_type_arguments_info());
+  info.default_tav_info = MakeTemporary("default_tav_info");
+  // Calculate the local function type arguments and store them in
+  // info.vars->function_type_args.
+  generic += BuildClosureCallDefaultTypeHandling(info);
+  // Load the local function type args.
+  generic += LoadLocal(info.vars->function_type_args);
+  // Load the parent function type args.
+  generic += LoadLocal(info.parent_function_type_args);
+  // Load the number of parent type parameters.
+  generic += LoadLocal(info.default_tav_info);
+  static_assert(Function::NumParentTypeParametersField::shift() > 0,
+                "No need to shift for NumParentTypeParametersField bit field");
+  generic += IntConstant(Function::NumParentTypeParametersField::shift());
+  generic += SmiBinaryOp(Token::kSHR);
+  generic += IntConstant(Function::NumParentTypeParametersField::mask());
+  generic += SmiBinaryOp(Token::kBIT_AND);
+  // Load the number of total type parameters.
+  LocalVariable* num_parents = MakeTemporary();
+  generic += LoadLocal(info.type_parameters);
+  generic += LoadNativeField(Slot::TypeArguments_length());
+  generic += LoadLocal(num_parents);
+  generic += SmiBinaryOp(Token::kADD, /*is_truncating=*/true);
+
+  // Call the static function for prepending type arguments.
+  generic += StaticCall(TokenPosition::kNoSource,
+                        PrependTypeArgumentsFunction(), 4, ICData::kStatic);
+  generic += StoreLocal(info.vars->function_type_args);
+  generic += Drop();
+  generic += DropTemporary(&info.default_tav_info);
+  generic += DropTemporary(&info.closure_data);
+
+  // Now that we have the full set of function type arguments, check them
+  // against the type parameter bounds. However, if the local function type
+  // arguments are delayed type arguments, they have already been checked by
+  // the type system and need not be checked again at the call site.
+  auto const check_bounds = BuildClosureCallTypeArgumentsTypeCheck(info);
+  if (FLAG_eliminate_type_checks) {
+    generic += TestDelayedTypeArgs(info.closure, /*present=*/{},
+                                   /*absent=*/check_bounds);
+  } else {
+    generic += check_bounds;
+  }
+
+  // Call the appropriate fragment for setting up the function type arguments
+  // and performing any needed type argument checking.
+  body += TestClosureFunctionGeneric(info, generic, not_generic);
 
   // TODO(dartbug.com/40813): Move checks that are currently compiled
   // in the closure body to here, using the dynamic versions of
@@ -2417,9 +2677,9 @@
   // available in the closure object.
 
   // Drop all the read-only temporaries at the end of the fragment.
-  if (info.type_parameters != nullptr) {
-    body += DropTemporary(&info.type_parameters);
-  }
+  body += DropTemporary(&info.parent_function_type_args);
+  body += DropTemporary(&info.instantiator_type_args);
+  body += DropTemporary(&info.type_parameters);
   if (info.parameter_names != nullptr) {
     body += DropTemporary(&info.parameter_names);
   }
@@ -2579,9 +2839,13 @@
         kWordSize * compiler::target::frame_layout.param_end_from_fp);
   }
 
+  if (function.NeedsTypeArgumentTypeChecks()) {
+    BuildTypeArgumentTypeChecks(TypeChecksToBuild::kCheckAllTypeParameterBounds,
+                                &body);
+  }
+
   if (function.NeedsArgumentTypeChecks()) {
-    BuildArgumentTypeChecks(TypeChecksToBuild::kCheckAllTypeParameterBounds,
-                            &body, &body, nullptr);
+    BuildArgumentTypeChecks(&body, &body, nullptr);
   }
 
   body += MakeTemp();
@@ -2704,7 +2968,7 @@
       const Class& owner = Class::ZoneHandle(Z, parent.Owner());
       AbstractType& type = AbstractType::ZoneHandle(Z);
       type = Type::New(owner, TypeArguments::Handle(Z), owner.token_pos());
-      type = ClassFinalizer::FinalizeType(owner, type);
+      type = ClassFinalizer::FinalizeType(type);
       body += Constant(type);
     } else {
       body += LoadLocal(parsed_function_->current_context_var());
@@ -2816,8 +3080,8 @@
 
 Fragment FlowGraphBuilder::BuildDefaultTypeHandling(const Function& function) {
   if (function.IsGeneric()) {
-    const TypeArguments& default_types =
-        parsed_function_->DefaultFunctionTypeArguments();
+    auto& default_types =
+        TypeArguments::ZoneHandle(Z, function.InstantiateToBounds(thread_));
 
     if (!default_types.IsNull()) {
       Fragment then;
@@ -2939,26 +3203,23 @@
 
   const Fragment default_type_handling = BuildDefaultTypeHandling(function);
 
-  // We're going to throw away the explicit checks because the target will
-  // always check them.
   Fragment implicit_checks;
-  if (function.NeedsArgumentTypeChecks()) {
+  if (function.NeedsTypeArgumentTypeChecks() &&
+      (target.is_static() ||
+       MethodCanSkipTypeChecksForNonCovariantTypeArguments(parent))) {
+    BuildTypeArgumentTypeChecks(
+        target.is_static()
+            ? TypeChecksToBuild::kCheckAllTypeParameterBounds
+            : TypeChecksToBuild::kCheckNonCovariantTypeParameterBounds,
+        &implicit_checks);
+  }
+  if (function.NeedsArgumentTypeChecks() &&
+      (target.is_static() ||
+       MethodCanSkipTypeChecksForNonCovariantArguments(parent))) {
+    // We're going to throw away the explicit checks because the target will
+    // always check them.
     Fragment explicit_checks_unused;
-    if (target.is_static()) {
-      // Tearoffs of static methods needs to perform arguments checks since
-      // static methods they forward to don't do it themselves.
-      BuildArgumentTypeChecks(TypeChecksToBuild::kCheckAllTypeParameterBounds,
-                              &explicit_checks_unused, &implicit_checks,
-                              nullptr);
-    } else {
-      if (MethodCanSkipTypeChecksForNonCovariantArguments(
-              parent, ProcedureAttributesMetadata())) {
-        // Generate checks that are skipped inside a body of a function.
-        BuildArgumentTypeChecks(
-            TypeChecksToBuild::kCheckNonCovariantTypeParameterBounds,
-            &explicit_checks_unused, &implicit_checks, nullptr);
-      }
-    }
+    BuildArgumentTypeChecks(&explicit_checks_unused, &implicit_checks, nullptr);
   }
 
   Fragment body;
@@ -3187,9 +3448,9 @@
 
   // Build argument type checks that complement those that are emitted in the
   // target.
-  BuildArgumentTypeChecks(
-      TypeChecksToBuild::kCheckNonCovariantTypeParameterBounds, &body, &body,
-      nullptr);
+  BuildTypeArgumentTypeChecks(
+      TypeChecksToBuild::kCheckNonCovariantTypeParameterBounds, &body);
+  BuildArgumentTypeChecks(&body, &body, nullptr);
 
   // Push all arguments and invoke the original method.
 
@@ -3315,8 +3576,7 @@
   code += ConvertUnboxedToUntagged(kUnboxedIntPtr);
   code += IntConstant(compiler::target::LocalHandle::raw_offset());
   code += UnboxTruncate(kUnboxedIntPtr);
-  code += LoadIndexedTypedData(kArrayCid, /*index_scale=*/1,
-                               /*index_unboxed=*/true);
+  code += LoadIndexed(kArrayCid, /*index_scale=*/1, /*index_unboxed=*/true);
   return code;
 }
 
@@ -3477,8 +3737,10 @@
 
   const bool signature_contains_handles = marshaller.ContainsHandles();
 
-  BuildArgumentTypeChecks(TypeChecksToBuild::kCheckAllTypeParameterBounds,
-                          &function_body, &function_body, &function_body);
+  ASSERT(function.CanReceiveDynamicInvocation());
+  BuildTypeArgumentTypeChecks(TypeChecksToBuild::kCheckAllTypeParameterBounds,
+                              &function_body);
+  BuildArgumentTypeChecks(&function_body, &function_body, &function_body);
 
   // Null check arguments before we go into the try catch, so that we don't
   // catch our own null errors.
@@ -3699,18 +3961,6 @@
   code += NullConstant();
   code += BranchIfEqual(&then, &otherwise);
 
-  if (throw_new_null_assertion_ == nullptr) {
-    const Class& klass = Class::ZoneHandle(
-        Z, Library::LookupCoreClass(Symbols::AssertionError()));
-    ASSERT(!klass.IsNull());
-    const auto& error = klass.EnsureIsFinalized(H.thread());
-    ASSERT(error == Error::null());
-    throw_new_null_assertion_ =
-        &Function::ZoneHandle(Z, klass.LookupStaticFunctionAllowPrivate(
-                                     Symbols::ThrowNewNullAssertion()));
-    ASSERT(!throw_new_null_assertion_->IsNull());
-  }
-
   const Script& script =
       Script::Handle(Z, parsed_function_->function().script());
   intptr_t line = -1;
@@ -3726,8 +3976,8 @@
   null_code += Constant(variable->name());
   null_code += IntConstant(line);
   null_code += IntConstant(column);
-  null_code += StaticCall(variable->token_pos(), *throw_new_null_assertion_, 3,
-                          ICData::kStatic);
+  null_code += StaticCall(variable->token_pos(),
+                          ThrowNewNullAssertionFunction(), 3, ICData::kStatic);
   null_code += ThrowException(TokenPosition::kNoSource);
   null_code += Drop();
 
@@ -3750,6 +4000,30 @@
   return code;
 }
 
+const Function& FlowGraphBuilder::ThrowNewNullAssertionFunction() {
+  if (throw_new_null_assertion_.IsNull()) {
+    const Class& klass = Class::ZoneHandle(
+        Z, Library::LookupCoreClass(Symbols::AssertionError()));
+    ASSERT(!klass.IsNull());
+    const auto& error = klass.EnsureIsFinalized(H.thread());
+    ASSERT(error == Error::null());
+    throw_new_null_assertion_ = klass.LookupStaticFunctionAllowPrivate(
+        Symbols::ThrowNewNullAssertion());
+    ASSERT(!throw_new_null_assertion_.IsNull());
+  }
+  return throw_new_null_assertion_;
+}
+
+const Function& FlowGraphBuilder::PrependTypeArgumentsFunction() {
+  if (prepend_type_arguments_.IsNull()) {
+    const auto& dart_internal = Library::Handle(Z, Library::InternalLibrary());
+    prepend_type_arguments_ = dart_internal.LookupFunctionAllowPrivate(
+        Symbols::PrependTypeArguments());
+    ASSERT(!prepend_type_arguments_.IsNull());
+  }
+  return prepend_type_arguments_;
+}
+
 }  // namespace kernel
 
 }  // namespace dart
diff --git a/runtime/vm/compiler/frontend/kernel_to_il.h b/runtime/vm/compiler/frontend/kernel_to_il.h
index 173db75..cd23744 100644
--- a/runtime/vm/compiler/frontend/kernel_to_il.h
+++ b/runtime/vm/compiler/frontend/kernel_to_il.h
@@ -82,6 +82,12 @@
 
   struct ClosureCallInfo;
 
+  // Tests whether the closure function is generic and branches to the
+  // appropriate fragment.
+  Fragment TestClosureFunctionGeneric(const ClosureCallInfo& info,
+                                      Fragment generic,
+                                      Fragment not_generic);
+
   // Tests whether the function parameter at the given index is required and
   // branches to the appropriate fragment. Loads the parameter index to
   // check from info.vars->current_param_index.
@@ -90,6 +96,11 @@
       Fragment set,
       Fragment not_set);
 
+  // Builds a fragment that, if there are no provided function type arguments,
+  // calculates the appropriate TAV to use instead. Stores either the provided
+  // or calculated function type arguments in vars->function_type_args.
+  Fragment BuildClosureCallDefaultTypeHandling(const ClosureCallInfo& info);
+
   // The BuildClosureCall...Check methods differs from the checks built in the
   // PrologueBuilder in that they are built for invoke field dispatchers,
   // where the ArgumentsDescriptor is known at compile time but the specific
@@ -104,6 +115,11 @@
   // function retrieved at runtime from the closure.
   Fragment BuildClosureCallArgumentsValidCheck(const ClosureCallInfo& info);
 
+  // Builds checks that the type arguments of a call are consistent with the
+  // bounds of the closure function type parameters. Assumes that the closure
+  // function is generic.
+  Fragment BuildClosureCallTypeArgumentsTypeCheck(const ClosureCallInfo& info);
+
   // Main entry point for building checks.
   Fragment BuildDynamicClosureCallChecks(LocalVariable* closure);
 
@@ -215,6 +231,8 @@
                          const AbstractType& sub_type,
                          const AbstractType& super_type,
                          const String& dst_name);
+  // Assumes destination name, supertype, and subtype are the top of the stack.
+  Fragment AssertSubtype(TokenPosition position);
 
   bool NeedsDebugStepCheck(const Function& function, TokenPosition position);
   bool NeedsDebugStepCheck(Value* value, TokenPosition position);
@@ -278,6 +296,16 @@
 
   LocalVariable* LookupVariable(intptr_t kernel_offset);
 
+  // Build type argument type checks for the current function.
+  // ParsedFunction should have the following information:
+  //  - is_forwarding_stub()
+  //  - forwarding_stub_super_target()
+  // Scope should be populated with parameter variables including
+  //  - needs_type_check()
+  //  - is_explicit_covariant_parameter()
+  void BuildTypeArgumentTypeChecks(TypeChecksToBuild mode,
+                                   Fragment* implicit_checks);
+
   // Build argument type checks for the current function.
   // ParsedFunction should have the following information:
   //  - is_forwarding_stub()
@@ -285,8 +313,7 @@
   // Scope should be populated with parameter variables including
   //  - needs_type_check()
   //  - is_explicit_covariant_parameter()
-  void BuildArgumentTypeChecks(TypeChecksToBuild mode,
-                               Fragment* explicit_checks,
+  void BuildArgumentTypeChecks(Fragment* explicit_checks,
                                Fragment* implicit_checks,
                                Fragment* implicit_redefinitions);
 
@@ -390,19 +417,31 @@
   // on the top of the stack. Picks a sequence that keeps unboxed values on the
   // expression stack only as needed, switching to Smis as soon as possible.
   template <typename T>
-  Fragment BuildExtractPackedFieldIntoSmi(Representation rep) {
+  Fragment BuildExtractUnboxedSlotBitFieldIntoSmi(const Slot& slot) {
+    ASSERT(RepresentationUtils::IsUnboxedInteger(slot.representation()));
     Fragment instructions;
-    // Since kBIT_AND never throws or deoptimizes, we require that the result of
-    // masking the field in place fits into a Smi, so we can use Smi operations
-    // for the shift.
-    static_assert(T::mask_in_place() <= compiler::target::kSmiMax,
-                  "Cannot fit results of masking in place into a Smi");
-    instructions += UnboxedIntConstant(T::mask_in_place(), rep);
-    instructions += BinaryIntegerOp(Token::kBIT_AND, rep);
-    // Set the range of the definition that will be used as the value in the
-    // box so that ValueFitsSmi() can return true even in unoptimized code.
-    SetConstantRangeOfCurrentDefinition(instructions, 0, T::mask_in_place());
-    instructions += Box(rep);
+    if (!Boxing::RequiresAllocation(slot.representation())) {
+      // We don't need to allocate to box this value, so it already fits in
+      // a Smi (and thus the mask must also).
+      instructions += LoadNativeField(slot);
+      instructions += Box(slot.representation());
+      instructions += IntConstant(T::mask_in_place());
+      instructions += SmiBinaryOp(Token::kBIT_AND);
+    } else {
+      // Since kBIT_AND never throws or deoptimizes, we require that the result
+      // of masking the field in place fits into a Smi, so we can use Smi
+      // operations for the shift.
+      static_assert(T::mask_in_place() <= compiler::target::kSmiMax,
+                    "Cannot fit results of masking in place into a Smi");
+      instructions += LoadNativeField(slot);
+      instructions +=
+          UnboxedIntConstant(T::mask_in_place(), slot.representation());
+      instructions += BinaryIntegerOp(Token::kBIT_AND, slot.representation());
+      // Set the range of the definition that will be used as the value in the
+      // box so that ValueFitsSmi() returns true even in unoptimized code.
+      SetConstantRangeOfCurrentDefinition(instructions, 0, T::mask_in_place());
+      instructions += Box(slot.representation());
+    }
     if (T::shift() != 0) {
       // Only add the shift operation if it's necessary.
       instructions += IntConstant(T::shift());
@@ -476,8 +515,19 @@
 
   ActiveClass active_class_;
 
+  // Cached _PrependTypeArguments.
+  Function& prepend_type_arguments_;
+
+  // Returns the function _PrependTypeArguments from dart:_internal. If the
+  // cached version is null, retrieves it and updates the cache.
+  const Function& PrependTypeArgumentsFunction();
+
   // Cached _AssertionError._throwNewNullAssertion.
-  Function* throw_new_null_assertion_ = nullptr;
+  Function& throw_new_null_assertion_;
+
+  // Returns the function _AssertionError._throwNewNullAssertion. If the
+  // cached version is null, retrieves it and updates the cache.
+  const Function& ThrowNewNullAssertionFunction();
 
   friend class BreakableBlock;
   friend class CatchBlock;
diff --git a/runtime/vm/compiler/frontend/kernel_translation_helper.cc b/runtime/vm/compiler/frontend/kernel_translation_helper.cc
index ff40a8b..5c28b56 100644
--- a/runtime/vm/compiler/frontend/kernel_translation_helper.cc
+++ b/runtime/vm/compiler/frontend/kernel_translation_helper.cc
@@ -248,7 +248,8 @@
   if (IsPrivate(name)) {
     kind = CanonicalNameParent(kind);
   }
-  return StringEquals(CanonicalNameString(kind), "@fields");
+  return StringEquals(CanonicalNameString(kind), "@fields") ||
+         StringEquals(CanonicalNameString(kind), "@=fields");
 }
 
 bool TranslationHelper::IsConstructor(NameIndex name) {
@@ -578,9 +579,6 @@
       Class::Handle(Z, library.LookupClassAllowPrivate(class_name));
   CheckStaticLookup(klass);
   ASSERT(!klass.IsNull());
-  if (klass.is_declared_in_bytecode()) {
-    klass.EnsureDeclarationLoaded();
-  }
   name_index_handle_ = Smi::New(kernel_class);
   return info_.InsertClass(thread_, name_index_handle_, klass);
 }
@@ -995,9 +993,14 @@
       if (++next_read_ == field) return;
     }
       FALL_THROUGH;
-    case kCanonicalName:
-      canonical_name_ =
-          helper_->ReadCanonicalNameReference();  // read canonical_name.
+    case kCanonicalNameGetter:
+      canonical_name_getter_ =
+          helper_->ReadCanonicalNameReference();  // read canonical_name_getter.
+      if (++next_read_ == field) return;
+      FALL_THROUGH;
+    case kCanonicalNameSetter:
+      canonical_name_setter_ =
+          helper_->ReadCanonicalNameReference();  // read canonical_name_setter.
       if (++next_read_ == field) return;
       FALL_THROUGH;
     case kSourceUriIndex:
@@ -2342,6 +2345,7 @@
       SkipExpression();              // read expression.
       return;
     case kMethodInvocation:
+      ReadFlags();                   // read flags.
       ReadPosition();                // read position.
       SkipExpression();              // read receiver.
       SkipName();                    // read name.
@@ -2510,6 +2514,8 @@
       SkipExpression();  // read expression.
       return;
     case kBlock:
+      ReadPosition();  // read file offset.
+      ReadPosition();  // read file end offset.
       SkipStatementList();
       return;
     case kEmptyStatement:
@@ -2981,9 +2987,6 @@
 
   const Class& klass = Class::Handle(Z, H.LookupClassByKernelClass(klass_name));
   ASSERT(!klass.IsNull());
-  if (klass.is_declared_in_bytecode()) {
-    klass.EnsureDeclarationLoaded();
-  }
   if (simple) {
     if (finalize_ || klass.is_type_finalized()) {
       // Fast path for non-generic types: retrieve or populate the class's only
@@ -3008,7 +3011,7 @@
   result_ = result_.NormalizeFutureOrType(Heap::kOld);
   if (finalize_) {
     ASSERT(active_class_->klass != NULL);
-    result_ = ClassFinalizer::FinalizeType(*active_class_->klass, result_);
+    result_ = ClassFinalizer::FinalizeType(result_);
   }
 }
 
@@ -3107,8 +3110,7 @@
       Type::ZoneHandle(Z, signature_function.SignatureType(nullability));
 
   if (finalize_) {
-    signature_type ^=
-        ClassFinalizer::FinalizeType(*active_class_->klass, signature_type);
+    signature_type ^= ClassFinalizer::FinalizeType(signature_type);
     // Do not refer to signature_function anymore, since it may have been
     // replaced during canonicalization.
     signature_function = Function::null();
@@ -3185,8 +3187,7 @@
         active_class_->RecordDerivedTypeParameter(Z, type_param,
                                                   TypeParameter::Cast(result_));
         if (finalize_) {
-          result_ =
-              ClassFinalizer::FinalizeType(*active_class_->klass, result_);
+          result_ = ClassFinalizer::FinalizeType(result_);
         }
         return;
       }
@@ -3202,7 +3203,7 @@
       active_class_->RecordDerivedTypeParameter(Z, type_param,
                                                 TypeParameter::Cast(result_));
       if (finalize_) {
-        result_ = ClassFinalizer::FinalizeType(*active_class_->klass, result_);
+        result_ = ClassFinalizer::FinalizeType(result_);
       }
       return;
     }
@@ -3266,7 +3267,7 @@
   Type& type = Type::Handle(
       Z, Type::New(receiver_class, type_arguments, TokenPosition::kNoSource));
   if (finalize_) {
-    type ^= ClassFinalizer::FinalizeType(*active_class_->klass, type);
+    type ^= ClassFinalizer::FinalizeType(type);
   }
 
   const TypeArguments& instantiated_type_arguments =
@@ -3332,7 +3333,7 @@
   }
   ActiveTypeParametersScope scope(active_class, enclosing, type_parameters, Z);
 
-  // Step b) Fill in the bounds of all [TypeParameter]s.
+  // Step b) Fill in the bounds and default arguments of all [TypeParameter]s.
   for (intptr_t i = 0; i < type_parameter_count; i++) {
     TypeParameterHelper helper(helper_);
     helper.ReadUntilExcludingAndSetJustRead(TypeParameterHelper::kBound);
@@ -3351,14 +3352,24 @@
       AbstractType& bound = BuildTypeWithoutFinalization();  // read ith bound.
       parameter.set_bound(bound);
     }
-
+    helper.ReadUntilExcludingAndSetJustRead(TypeParameterHelper::kDefaultType);
+    const AbstractType* default_arg = &Object::dynamic_type();
+    if (helper_->ReadTag() == kSomething) {
+      default_arg = &BuildTypeWithoutFinalization();
+    }
+    parameter.set_default_argument(*default_arg);
     helper.Finish();
   }
 
-  // Fix bounds in all derived type parameters (with different nullabilities).
+  if (set_on.IsFunction()) {
+    Function::Cast(set_on).UpdateCachedDefaultTypeArguments(Thread::Current());
+  }
+
+  // Fix bounds and default arguments in all derived type parameters (with
+  // different nullabilities).
   if (active_class->derived_type_parameters != nullptr) {
     auto& derived = TypeParameter::Handle(Z);
-    auto& bound = AbstractType::Handle(Z);
+    auto& type = AbstractType::Handle(Z);
     for (intptr_t i = 0, n = active_class->derived_type_parameters->Length();
          i < n; ++i) {
       derived ^= active_class->derived_type_parameters->At(i);
@@ -3367,8 +3378,10 @@
            derived.parameterized_function() == set_on.raw())) {
         ASSERT(!derived.IsFinalized());
         parameter ^= type_parameters.TypeAt(derived.index());
-        bound = parameter.bound();
-        derived.set_bound(bound);
+        type = parameter.bound();
+        derived.set_bound(type);
+        type = parameter.default_argument();
+        derived.set_default_argument(type);
       }
     }
   }
diff --git a/runtime/vm/compiler/frontend/kernel_translation_helper.h b/runtime/vm/compiler/frontend/kernel_translation_helper.h
index cec43d5..d725cf7 100644
--- a/runtime/vm/compiler/frontend/kernel_translation_helper.h
+++ b/runtime/vm/compiler/frontend/kernel_translation_helper.h
@@ -194,11 +194,6 @@
                    const char* format,
                    ...) PRINTF_ATTRIBUTE(5, 6);
 
-  ArrayPtr GetBytecodeComponent() const { return info_.bytecode_component(); }
-  void SetBytecodeComponent(const Array& bytecode_component) {
-    info_.set_bytecode_component(bytecode_component);
-  }
-
   void SetExpressionEvaluationFunction(const Function& function) {
     ASSERT(expression_evaluation_function_ == nullptr);
     expression_evaluation_function_ = &Function::Handle(zone_, function.raw());
@@ -443,7 +438,8 @@
  public:
   enum Field {
     kStart,  // tag.
-    kCanonicalName,
+    kCanonicalNameGetter,
+    kCanonicalNameSetter,
     kSourceUriIndex,
     kPosition,
     kEndPosition,
@@ -489,7 +485,8 @@
   bool IsLate() const { return (flags_ & kIsLate) != 0; }
   bool IsExtensionMember() const { return (flags_ & kExtensionMember) != 0; }
 
-  NameIndex canonical_name_;
+  NameIndex canonical_name_getter_;
+  NameIndex canonical_name_setter_;
   TokenPosition position_;
   TokenPosition end_position_;
   uint32_t flags_ = 0;
@@ -689,12 +686,12 @@
   };
 
   enum Flag {
-    kIsAbstract = 1 << 2,
-    kIsEnumClass = 1 << 3,
-    kIsAnonymousMixin = 1 << 4,
-    kIsEliminatedMixin = 1 << 5,
-    kFlagMixinDeclaration = 1 << 6,
-    kHasConstConstructor = 1 << 7,
+    kIsAbstract = 1 << 0,
+    kIsEnumClass = 1 << 1,
+    kIsAnonymousMixin = 1 << 2,
+    kIsEliminatedMixin = 1 << 3,
+    kFlagMixinDeclaration = 1 << 4,
+    kHasConstConstructor = 1 << 5,
   };
 
   explicit ClassHelper(KernelReaderHelper* helper)
@@ -770,11 +767,10 @@
   };
 
   enum Flag {
-    kExternal = 1 << 0,
-    kSynthetic = 1 << 1,
-    kIsNonNullableByDefault = 1 << 2,
-    kNonNullableByDefaultCompiledModeBit1Weak = 1 << 3,
-    kNonNullableByDefaultCompiledModeBit2Strong = 1 << 4,
+    kSynthetic = 1 << 0,
+    kIsNonNullableByDefault = 1 << 1,
+    kNonNullableByDefaultCompiledModeBit1 = 1 << 2,
+    kNonNullableByDefaultCompiledModeBit2 = 1 << 3,
   };
 
   explicit LibraryHelper(KernelReaderHelper* helper, uint32_t binary_version)
@@ -789,18 +785,18 @@
   void SetNext(Field field) { next_read_ = field; }
   void SetJustRead(Field field) { next_read_ = field + 1; }
 
-  bool IsExternal() const { return (flags_ & kExternal) != 0; }
   bool IsSynthetic() const { return (flags_ & kSynthetic) != 0; }
   bool IsNonNullableByDefault() const {
     return (flags_ & kIsNonNullableByDefault) != 0;
   }
   NNBDCompiledMode GetNonNullableByDefaultCompiledMode() const {
-    bool weak = (flags_ & kNonNullableByDefaultCompiledModeBit1Weak) != 0;
-    bool strong = (flags_ & kNonNullableByDefaultCompiledModeBit2Strong) != 0;
-    if (weak && strong) return NNBDCompiledMode::kAgnostic;
-    if (strong) return NNBDCompiledMode::kStrong;
-    if (weak) return NNBDCompiledMode::kWeak;
-    return NNBDCompiledMode::kDisabled;
+    bool bit1 = (flags_ & kNonNullableByDefaultCompiledModeBit1) != 0;
+    bool bit2 = (flags_ & kNonNullableByDefaultCompiledModeBit2) != 0;
+    if (!bit1 && !bit2) return NNBDCompiledMode::kWeak;
+    if (bit1 && !bit2) return NNBDCompiledMode::kStrong;
+    if (bit1 && bit2) return NNBDCompiledMode::kAgnostic;
+    if (!bit1 && bit2) return NNBDCompiledMode::kInvalid;
+    UNREACHABLE();
   }
 
   uint8_t flags_ = 0;
@@ -1261,8 +1257,6 @@
   // kernel program.
   intptr_t data_program_offset_;
 
-  friend class BytecodeMetadataHelper;
-  friend class BytecodeReaderHelper;
   friend class ClassHelper;
   friend class CallSiteAttributesMetadataHelper;
   friend class ConstantReader;
diff --git a/runtime/vm/compiler/frontend/prologue_builder.cc b/runtime/vm/compiler/frontend/prologue_builder.cc
index b829e8b..7fd8c35 100644
--- a/runtime/vm/compiler/frontend/prologue_builder.cc
+++ b/runtime/vm/compiler/frontend/prologue_builder.cc
@@ -349,7 +349,7 @@
               compiler::target::kWordSize);
           good += LoadLocal(tuple_diff);
           good += SmiBinaryOp(Token::kADD, /* truncate= */ true);
-          good += LoadIndexed(/* index_scale = */ compiler::target::kWordSize);
+          good += LoadIndexed(kArrayCid);
         }
         good += SmiBinaryOp(Token::kSUB, /* truncate= */ true);
         good += LoadFpRelativeSlot(
@@ -388,8 +388,7 @@
                         compiler::target::kWordSize);
         copy_args_prologue += LoadLocal(tuple_diff);
         copy_args_prologue += SmiBinaryOp(Token::kADD, /* truncate= */ true);
-        copy_args_prologue +=
-            LoadIndexed(/* index_scale = */ compiler::target::kWordSize);
+        copy_args_prologue += LoadIndexed(kArrayCid);
 
         // first name in sorted list of all names
         const String& param_name = String::ZoneHandle(
diff --git a/runtime/vm/compiler/frontend/scope_builder.cc b/runtime/vm/compiler/frontend/scope_builder.cc
index 56e1dda..4470cee 100644
--- a/runtime/vm/compiler/frontend/scope_builder.cc
+++ b/runtime/vm/compiler/frontend/scope_builder.cc
@@ -15,11 +15,26 @@
 #define T (type_translator_)
 #define I Isolate::Current()
 
+// Returns true if the given method can skip type checks for all type arguments
+// that are not covariant or generic covariant in its implementation.
+bool MethodCanSkipTypeChecksForNonCovariantTypeArguments(
+    const Function& method) {
+  // Dart 2 type system at non-dynamic call sites statically guarantees that
+  // argument values match declared parameter types for all non-covariant
+  // and non-generic-covariant parameters. The same applies to type parameters
+  // bounds for type parameters of generic functions.
+  //
+  // Normally dynamic call sites will call dyn:* forwarders which perform type
+  // checks.
+  //
+  // Though for some kinds of methods (e.g. ffi trampolines called from native
+  // code) we do have to perform type checks for all parameters.
+  return !method.CanReceiveDynamicInvocation();
+}
+
 // Returns true if the given method can skip type checks for all arguments
 // that are not covariant or generic covariant in its implementation.
-bool MethodCanSkipTypeChecksForNonCovariantArguments(
-    const Function& method,
-    const ProcedureAttributesMetadata& attrs) {
+bool MethodCanSkipTypeChecksForNonCovariantArguments(const Function& method) {
   // Dart 2 type system at non-dynamic call sites statically guarantees that
   // argument values match declarated parameter types for all non-covariant
   // and non-generic-covariant parameters. The same applies to type parameters
@@ -35,7 +50,7 @@
   // been fully moved out of closures.
   return !method.CanReceiveDynamicInvocation() &&
          !(method.IsClosureFunction() &&
-           Function::ClosureBodiesContainNonCovariantChecks());
+           Function::ClosureBodiesContainNonCovariantArgumentChecks());
 }
 
 ScopeBuilder::ScopeBuilder(ParsedFunction* parsed_function)
@@ -216,21 +231,23 @@
       }
 
       ParameterTypeCheckMode type_check_mode = kTypeCheckAllParameters;
-      if (function.IsSyncYielding()) {
+      if (function.IsSyncGenClosure()) {
         // Don't type check the parameter of sync-yielding since these calls are
         // all synthetic and types should always match.
         ASSERT((function.NumParameters() - function.NumImplicitParameters()) ==
-               1);
+               3);
         ASSERT(
             Class::Handle(
                 AbstractType::Handle(function.ParameterTypeAt(1)).type_class())
-                .Name() == Symbols::_SyncIterator().raw());
+                .ScrubbedName() == Symbols::_SyncIterator().raw());
         type_check_mode = kTypeCheckForStaticFunction;
       } else if (function.IsNonImplicitClosureFunction()) {
         type_check_mode = kTypeCheckAllParameters;
       } else if (function.IsImplicitClosureFunction()) {
-        if (MethodCanSkipTypeChecksForNonCovariantArguments(
-                Function::Handle(Z, function.parent_function()), attrs)) {
+        if (MethodCanSkipTypeChecksForNonCovariantTypeArguments(
+                Function::Handle(Z, function.parent_function())) &&
+            MethodCanSkipTypeChecksForNonCovariantArguments(
+                Function::Handle(Z, function.parent_function()))) {
           // This is a tear-off of an instance method that can not be reached
           // from any dynamic invocation. The method would not check any
           // parameters except covariant ones and those annotated with
@@ -243,8 +260,9 @@
         if (function.is_static()) {
           // In static functions we don't check anything.
           type_check_mode = kTypeCheckForStaticFunction;
-        } else if (MethodCanSkipTypeChecksForNonCovariantArguments(function,
-                                                                   attrs)) {
+        } else if (MethodCanSkipTypeChecksForNonCovariantTypeArguments(
+                       function) &&
+                   MethodCanSkipTypeChecksForNonCovariantArguments(function)) {
           // If the current function is never a target of a dynamic invocation
           // and this parameter is not marked with generic-covariant-impl
           // (which means that among all super-interfaces no type parameters
@@ -319,7 +337,8 @@
         scope_->InsertParameterAt(pos++, result_->setter_value);
 
         if (is_method &&
-            MethodCanSkipTypeChecksForNonCovariantArguments(function, attrs)) {
+            MethodCanSkipTypeChecksForNonCovariantTypeArguments(function) &&
+            MethodCanSkipTypeChecksForNonCovariantArguments(function)) {
           if (field.is_covariant()) {
             result_->setter_value->set_is_explicit_covariant_parameter();
           } else if (!field.is_generic_covariant_impl() ||
@@ -589,10 +608,12 @@
     scope_->AddVariable(asyncStackTraceVar);
   }
 
+  // The :sync_op and :async_op continuations are called multiple times. So we
+  // don't want the parameters from the first invocation to get stored in the
+  // context and reused on later invocations with different parameters.
   if (function_node_helper.async_marker_ == FunctionNodeHelper::kSyncYielding) {
-    intptr_t offset = function.num_fixed_parameters();
-    for (intptr_t i = 0; i < function.NumOptionalPositionalParameters(); i++) {
-      parsed_function_->ParameterVariable(offset + i)->set_is_forced_stack();
+    for (intptr_t i = 0; i < function.NumParameters(); i++) {
+      parsed_function_->ParameterVariable(i)->set_is_forced_stack();
     }
   }
 
@@ -606,17 +627,17 @@
     first_body_token_position_ = helper_.reader_.min_position();
   }
 
-  // Ensure that :await_jump_var, :await_ctx_var, :async_op,
-  // :async_completer and :async_stack_trace are captured.
+  // Ensure that :await_jump_var, :await_ctx_var, :async_op, :is_sync,
+  // :async_future and :async_stack_trace are captured.
   if (function_node_helper.async_marker_ == FunctionNodeHelper::kSyncYielding) {
     {
-      LocalVariable* temp = NULL;
+      LocalVariable* temp = nullptr;
       LookupCapturedVariableByName(
           (depth_.function_ == 0) ? &result_->yield_jump_variable : &temp,
           Symbols::AwaitJumpVar());
     }
     {
-      LocalVariable* temp = NULL;
+      LocalVariable* temp = nullptr;
       LookupCapturedVariableByName(
           (depth_.function_ == 0) ? &result_->yield_context_variable : &temp,
           Symbols::AwaitContextVar());
@@ -624,28 +645,34 @@
     {
       LocalVariable* temp =
           scope_->LookupVariable(Symbols::AsyncOperation(), true);
-      if (temp != NULL) {
+      if (temp != nullptr) {
         scope_->CaptureVariable(temp);
       }
     }
     {
       LocalVariable* temp =
-          scope_->LookupVariable(Symbols::AsyncCompleter(), true);
-      if (temp != NULL) {
+          scope_->LookupVariable(Symbols::AsyncFuture(), true);
+      if (temp != nullptr) {
+        scope_->CaptureVariable(temp);
+      }
+    }
+    {
+      LocalVariable* temp = scope_->LookupVariable(Symbols::is_sync(), true);
+      if (temp != nullptr) {
         scope_->CaptureVariable(temp);
       }
     }
     {
       LocalVariable* temp =
           scope_->LookupVariable(Symbols::ControllerStream(), true);
-      if (temp != NULL) {
+      if (temp != nullptr) {
         scope_->CaptureVariable(temp);
       }
     }
     if (FLAG_causal_async_stacks) {
       LocalVariable* temp =
           scope_->LookupVariable(Symbols::AsyncStackTraceVar(), true);
-      if (temp != NULL) {
+      if (temp != nullptr) {
         scope_->CaptureVariable(temp);
       }
     }
@@ -778,6 +805,7 @@
       VisitExpression();                     // read expression.
       return;
     case kMethodInvocation:
+      helper_.ReadFlags();     // read flags.
       helper_.ReadPosition();  // read position.
       VisitExpression();       // read receiver.
       helper_.SkipName();      // read name.
@@ -993,7 +1021,8 @@
       intptr_t offset = helper_.ReaderOffset() - 1;  // -1 to include tag byte.
 
       EnterScope(offset);
-
+      helper_.ReadPosition();  // read block start offset.
+      helper_.ReadPosition();  // read block end offset.
       intptr_t list_length =
           helper_.ReadListLength();  // read number of statements.
       for (intptr_t i = 0; i < list_length; ++i) {
@@ -1333,7 +1362,7 @@
   // This way we can allocate them in the outermost context at fixed indices,
   // allowing support for --lazy-async-stacks implementation to find awaiters.
   if (name.Equals(Symbols::AwaitJumpVar()) ||
-      name.Equals(Symbols::AsyncCompleter()) ||
+      name.Equals(Symbols::AsyncFuture()) || name.Equals(Symbols::is_sync()) ||
       name.Equals(Symbols::Controller())) {
     scope_->parent()->AddVariable(variable);
   } else {
diff --git a/runtime/vm/compiler/frontend/scope_builder.h b/runtime/vm/compiler/frontend/scope_builder.h
index 4f53fbd..33e24b3 100644
--- a/runtime/vm/compiler/frontend/scope_builder.h
+++ b/runtime/vm/compiler/frontend/scope_builder.h
@@ -230,11 +230,14 @@
   DISALLOW_COPY_AND_ASSIGN(ScopeBuildingResult);
 };
 
+// Returns true if the given method can skip type checks for all type arguments
+// that are not covariant or generic covariant in its implementation.
+bool MethodCanSkipTypeChecksForNonCovariantTypeArguments(
+    const Function& method);
+
 // Returns true if the given method can skip type checks for all arguments
 // that are not covariant or generic covariant in its implementation.
-bool MethodCanSkipTypeChecksForNonCovariantArguments(
-    const Function& method,
-    const ProcedureAttributesMetadata& attrs);
+bool MethodCanSkipTypeChecksForNonCovariantArguments(const Function& method);
 
 }  // namespace kernel
 }  // namespace dart
diff --git a/runtime/vm/compiler/graph_intrinsifier.cc b/runtime/vm/compiler/graph_intrinsifier.cc
index 9b38d1d..2e0c310 100644
--- a/runtime/vm/compiler/graph_intrinsifier.cc
+++ b/runtime/vm/compiler/graph_intrinsifier.cc
@@ -180,6 +180,27 @@
   return safe_index;
 }
 
+static void VerifyParameterIsBoxed(BlockBuilder* builder, intptr_t arg_index) {
+  const auto& function = builder->function();
+  if (function.is_unboxed_parameter_at(arg_index)) {
+    FATAL2("Unsupported unboxed parameter %" Pd " in %s", arg_index,
+           function.ToFullyQualifiedCString());
+  }
+}
+
+static Definition* CreateBoxedParameterIfNeeded(BlockBuilder* builder,
+                                                Definition* value,
+                                                Representation representation,
+                                                intptr_t arg_index) {
+  const auto& function = builder->function();
+  if (function.is_unboxed_parameter_at(arg_index)) {
+    return builder->AddDefinition(
+        BoxInstr::Create(representation, new Value(value)));
+  } else {
+    return value;
+  }
+}
+
 static Definition* CreateBoxedResultIfNeeded(BlockBuilder* builder,
                                              Definition* value,
                                              Representation representation) {
@@ -212,6 +233,9 @@
   Definition* array = builder.AddParameter(0, /*with_frame=*/false);
   Definition* index = builder.AddParameter(1, /*with_frame=*/false);
 
+  VerifyParameterIsBoxed(&builder, 0);
+
+  index = CreateBoxedParameterIfNeeded(&builder, index, kUnboxedInt64, 1);
   index = PrepareIndexedOp(flow_graph, &builder, array, index,
                            Slot::GetLengthFieldForArrayCid(array_cid));
 
@@ -314,6 +338,10 @@
   Definition* index = builder.AddParameter(1, /*with_frame=*/false);
   Definition* value = builder.AddParameter(2, /*with_frame=*/false);
 
+  VerifyParameterIsBoxed(&builder, 0);
+  VerifyParameterIsBoxed(&builder, 2);
+
+  index = CreateBoxedParameterIfNeeded(&builder, index, kUnboxedInt64, 1);
   index = PrepareIndexedOp(flow_graph, &builder, array, index,
                            Slot::GetLengthFieldForArrayCid(array_cid));
 
@@ -527,6 +555,9 @@
   Definition* str = builder.AddParameter(0, /*with_frame=*/false);
   Definition* index = builder.AddParameter(1, /*with_frame=*/false);
 
+  VerifyParameterIsBoxed(&builder, 0);
+
+  index = CreateBoxedParameterIfNeeded(&builder, index, kUnboxedInt64, 1);
   index =
       PrepareIndexedOp(flow_graph, &builder, str, index, Slot::String_length());
 
@@ -594,6 +625,9 @@
   Definition* left = builder.AddParameter(0, /*with_frame=*/false);
   Definition* right = builder.AddParameter(1, /*with_frame=*/false);
 
+  VerifyParameterIsBoxed(&builder, 0);
+  VerifyParameterIsBoxed(&builder, 1);
+
   Cids* value_check = Cids::CreateMonomorphic(zone, cid);
   // Check argument. Receiver (left) is known to be a Float32x4.
   builder.AddInstruction(new CheckClassInstr(new Value(right), DeoptId::kNone,
@@ -700,6 +734,7 @@
   BlockBuilder builder(flow_graph, normal_entry);
 
   Definition* array = builder.AddParameter(0, /*with_frame=*/false);
+  VerifyParameterIsBoxed(&builder, 0);
 
   Definition* length = builder.AddDefinition(
       new LoadFieldInstr(new Value(array), field, builder.TokenPos()));
@@ -743,6 +778,7 @@
   BlockBuilder builder(flow_graph, normal_entry);
 
   Definition* array = builder.AddParameter(0, /*with_frame=*/false);
+  VerifyParameterIsBoxed(&builder, 0);
 
   Definition* backing_store = builder.AddDefinition(new LoadFieldInstr(
       new Value(array), Slot::GrowableObjectArray_data(), builder.TokenPos()));
@@ -761,6 +797,9 @@
   Definition* growable_array = builder.AddParameter(0, /*with_frame=*/false);
   Definition* index = builder.AddParameter(1, /*with_frame=*/false);
 
+  VerifyParameterIsBoxed(&builder, 0);
+
+  index = CreateBoxedParameterIfNeeded(&builder, index, kUnboxedInt64, 1);
   index = PrepareIndexedOp(flow_graph, &builder, growable_array, index,
                            Slot::GrowableObjectArray_length());
 
@@ -786,6 +825,10 @@
   Definition* index = builder.AddParameter(1, /*with_frame=*/false);
   Definition* value = builder.AddParameter(2, /*with_frame=*/false);
 
+  VerifyParameterIsBoxed(&builder, 0);
+  VerifyParameterIsBoxed(&builder, 2);
+
+  index = CreateBoxedParameterIfNeeded(&builder, index, kUnboxedInt64, 1);
   index = PrepareIndexedOp(flow_graph, &builder, array, index,
                            Slot::Array_length());
 
@@ -810,6 +853,10 @@
   Definition* index = builder.AddParameter(1, /*with_frame=*/false);
   Definition* value = builder.AddParameter(2, /*with_frame=*/false);
 
+  VerifyParameterIsBoxed(&builder, 0);
+  VerifyParameterIsBoxed(&builder, 2);
+
+  index = CreateBoxedParameterIfNeeded(&builder, index, kUnboxedInt64, 1);
   index = PrepareIndexedOp(flow_graph, &builder, array, index,
                            Slot::GrowableObjectArray_length());
 
@@ -836,6 +883,9 @@
   Definition* data = builder.AddParameter(1, /*with_frame=*/false);
   Zone* zone = flow_graph->zone();
 
+  VerifyParameterIsBoxed(&builder, 0);
+  VerifyParameterIsBoxed(&builder, 1);
+
   Cids* value_check = Cids::CreateMonomorphic(zone, kArrayCid);
   builder.AddInstruction(new CheckClassInstr(new Value(data), DeoptId::kNone,
                                              *value_check, builder.TokenPos()));
@@ -857,6 +907,9 @@
   Definition* growable_array = builder.AddParameter(0, /*with_frame=*/false);
   Definition* length = builder.AddParameter(1, /*with_frame=*/false);
 
+  VerifyParameterIsBoxed(&builder, 0);
+  VerifyParameterIsBoxed(&builder, 1);
+
   builder.AddInstruction(
       new CheckSmiInstr(new Value(length), DeoptId::kNone, builder.TokenPos()));
   builder.AddInstruction(new StoreInstanceFieldInstr(
@@ -1102,6 +1155,8 @@
   BlockBuilder builder(flow_graph, normal_entry);
 
   auto receiver = builder.AddParameter(0, /*with_frame=*/false);
+  VerifyParameterIsBoxed(&builder, 0);
+
   Definition* field_value = builder.AddDefinition(new (zone) LoadFieldInstr(
       new (zone) Value(receiver), slot, builder.TokenPos()));
 
@@ -1151,6 +1206,7 @@
 
   auto receiver = builder.AddParameter(0, /*with_frame=*/false);
   auto value = builder.AddParameter(1, /*with_frame=*/false);
+  VerifyParameterIsBoxed(&builder, 0);
 
   if (!function.HasUnboxedParameters() &&
       FlowGraphCompiler::IsUnboxedField(field)) {
diff --git a/runtime/vm/compiler/intrinsifier.cc b/runtime/vm/compiler/intrinsifier.cc
index 35ade83..1c7f122 100644
--- a/runtime/vm/compiler/intrinsifier.cc
+++ b/runtime/vm/compiler/intrinsifier.cc
@@ -292,6 +292,14 @@
     AsmIntrinsifier::enum_name(compiler->assembler(), &normal_ir_body);        \
     const auto size_after = compiler->assembler()->CodeSize();                 \
     if (size_before == size_after) return false;                               \
+    if (function.HasUnboxedParameters()) {                                     \
+      FATAL1("Unsupported unboxed parameters in asm intrinsic %s",             \
+             function.ToFullyQualifiedCString());                              \
+    }                                                                          \
+    if (function.HasUnboxedReturnValue()) {                                    \
+      FATAL1("Unsupported unboxed return value in asm intrinsic %s",           \
+             function.ToFullyQualifiedCString());                              \
+    }                                                                          \
     if (!normal_ir_body.IsBound()) {                                           \
       EMIT_BREAKPOINT();                                                       \
       return true;                                                             \
diff --git a/runtime/vm/compiler/jit/compiler.cc b/runtime/vm/compiler/jit/compiler.cc
index 72e16f6..cd282c3 100644
--- a/runtime/vm/compiler/jit/compiler.cc
+++ b/runtime/vm/compiler/jit/compiler.cc
@@ -22,7 +22,6 @@
 #include "vm/compiler/cha.h"
 #include "vm/compiler/compiler_pass.h"
 #include "vm/compiler/compiler_state.h"
-#include "vm/compiler/frontend/bytecode_reader.h"
 #include "vm/compiler/frontend/flow_graph_builder.h"
 #include "vm/compiler/frontend/kernel_to_il.h"
 #include "vm/compiler/jit/jit_call_specializer.h"
@@ -84,7 +83,6 @@
             "Trace only optimizing compiler operations.");
 DEFINE_FLAG(bool, trace_bailout, false, "Print bailout from ssa compiler.");
 
-DECLARE_FLAG(bool, enable_interpreter);
 DECLARE_FLAG(bool, huge_method_cutoff_in_code_size);
 DECLARE_FLAG(bool, trace_failed_optimization_attempts);
 
@@ -215,25 +213,7 @@
   ASSERT(thread->IsMutatorThread());
   const Function& function = Function::CheckedHandle(zone, arguments.ArgAt(0));
   Object& result = Object::Handle(zone);
-
-  if (FLAG_enable_interpreter && function.IsBytecodeAllowed(zone)) {
-    if (!function.HasBytecode()) {
-      result = kernel::BytecodeReader::ReadFunctionBytecode(thread, function);
-      if (!result.IsNull()) {
-        Exceptions::PropagateError(Error::Cast(result));
-      }
-    }
-    if (function.HasBytecode() && (FLAG_compilation_counter_threshold != 0)) {
-      // If interpreter is enabled and there is bytecode, LazyCompile stub
-      // (which calls CompileFunction) should proceed to InterpretCall in order
-      // to enter interpreter. In such case, compilation is postponed and
-      // triggered by interpreter later via CompileInterpretedFunction.
-      return;
-    }
-    // Fall back to compilation.
-  } else {
-    ASSERT(!function.HasCode());
-  }
+  ASSERT(!function.HasCode());
 
   result = Compiler::CompileFunction(thread, function);
   if (result.IsError()) {
@@ -495,13 +475,6 @@
       Compiler::AbortBackgroundCompilation(
           DeoptId::kNone, "Optimizing Background compilation is being stopped");
     }
-  } else {
-    if (FLAG_enable_interpreter &&
-        !isolate()->background_compiler()->is_running()) {
-      // The background compiler is being stopped.
-      Compiler::AbortBackgroundCompilation(
-          DeoptId::kNone, "Background compilation is being stopped");
-    }
   }
 }
 
@@ -647,6 +620,10 @@
           CheckIfBackgroundCompilerIsBeingStopped(optimized());
         }
 
+        // Grab read program_lock outside of potential safepoint, that lock
+        // can't be waited for inside the safepoint.
+        SafepointReadRwLocker ml(thread(),
+                                 thread()->isolate_group()->program_lock());
         // We have to ensure no mutators are running, because:
         //
         //   a) We allocate an instructions object, which might cause us to
@@ -783,9 +760,8 @@
           function.set_is_background_optimizable(false);
 
           // Trigger another optimization soon on the main thread.
-          function.SetUsageCounter(optimized
-                                       ? FLAG_optimization_counter_threshold
-                                       : FLAG_compilation_counter_threshold);
+          function.SetUsageCounter(
+              optimized ? FLAG_optimization_counter_threshold : 0);
           return Error::null();
         } else if (error.IsLanguageError() &&
                    LanguageError::Cast(error).kind() == Report::kBailout) {
@@ -942,8 +918,6 @@
   TIMELINE_FUNCTION_COMPILATION_DURATION(thread, event_name, function);
 #endif  // defined(SUPPORT_TIMELINE)
 
-  ASSERT(function.ShouldCompilerOptimize());
-
   CompilationPipeline* pipeline =
       CompilationPipeline::New(thread->zone(), function);
   return CompileFunctionHelper(pipeline, function, /* optimized = */ true,
@@ -978,21 +952,8 @@
 
     auto& var_descs = LocalVarDescriptors::Handle(zone);
 
-    if (function.is_declared_in_bytecode()) {
-      if (function.HasBytecode()) {
-        const auto& bytecode = Bytecode::Handle(zone, function.bytecode());
-        var_descs = bytecode.GetLocalVarDescriptors();
-        LocalVarDescriptorsBuilder builder;
-        builder.AddDeoptIdToContextLevelMappings(context_level_array);
-        builder.AddAll(zone, var_descs);
-        var_descs = builder.Done();
-      } else {
-        var_descs = Object::empty_var_descriptors().raw();
-      }
-    } else {
-      var_descs = parsed_function->scope()->GetVarDescriptors(
-          function, context_level_array);
-    }
+    var_descs = parsed_function->scope()->GetVarDescriptors(
+        function, context_level_array);
 
     ASSERT(!var_descs.IsNull());
     code.set_var_descriptors(var_descs);
@@ -1006,7 +967,9 @@
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
   Object& result = Object::Handle(zone);
-  Array& functions = Array::Handle(zone, cls.functions());
+  // We don't expect functions() to change as the class was finalized.
+  ASSERT(cls.is_finalized());
+  Array& functions = Array::Handle(zone, cls.current_functions());
   Function& func = Function::Handle(zone);
   // Compile all the regular functions.
   for (int i = 0; i < functions.Length(); i++) {
@@ -1024,30 +987,6 @@
   return Error::null();
 }
 
-ErrorPtr Compiler::ReadAllBytecode(const Class& cls) {
-  Thread* thread = Thread::Current();
-  ASSERT(thread->IsMutatorThread());
-  Zone* zone = thread->zone();
-  Error& error = Error::Handle(zone, cls.EnsureIsFinalized(thread));
-  ASSERT(error.IsNull());
-  Array& functions = Array::Handle(zone, cls.functions());
-  Function& func = Function::Handle(zone);
-  // Compile all the regular functions.
-  for (int i = 0; i < functions.Length(); i++) {
-    func ^= functions.At(i);
-    ASSERT(!func.IsNull());
-    if (func.IsBytecodeAllowed(zone) && !func.HasBytecode() &&
-        !func.HasCode()) {
-      ErrorPtr error =
-          kernel::BytecodeReader::ReadFunctionBytecode(thread, func);
-      if (error != Error::null()) {
-        return error;
-      }
-    }
-  }
-  return Error::null();
-}
-
 void Compiler::AbortBackgroundCompilation(intptr_t deopt_id, const char* msg) {
   if (FLAG_trace_compiler) {
     THR_Print("ABORT background compilation: %s\n", msg);
@@ -1207,13 +1146,9 @@
         }
       }
       while (!function.IsNull()) {
-        if (is_optimizing()) {
-          Compiler::CompileOptimizedFunction(thread, function,
-                                             Compiler::kNoOSRDeoptId);
-        } else {
-          ASSERT(FLAG_enable_interpreter);
-          Compiler::CompileFunction(thread, function);
-        }
+        ASSERT(is_optimizing());
+        Compiler::CompileOptimizedFunction(thread, function,
+                                           Compiler::kNoOSRDeoptId);
 
         QueueElement* qelem = NULL;
         {
diff --git a/runtime/vm/compiler/jit/compiler.h b/runtime/vm/compiler/jit/compiler.h
index 29029df..75d59521 100644
--- a/runtime/vm/compiler/jit/compiler.h
+++ b/runtime/vm/compiler/jit/compiler.h
@@ -84,8 +84,6 @@
   static ObjectPtr CompileFunction(Thread* thread, const Function& function);
 
   // Generates unoptimized code if not present, current code is unchanged.
-  // Bytecode is considered unoptimized code.
-  // TODO(regis): Revisit when deoptimizing mixed bytecode and jitted code.
   static ErrorPtr EnsureUnoptimizedCode(Thread* thread,
                                         const Function& function);
 
@@ -108,9 +106,6 @@
   // Returns Error::null() if there is no compilation error.
   static ErrorPtr CompileAllFunctions(const Class& cls);
 
-  // Eagerly read all bytecode.
-  static ErrorPtr ReadAllBytecode(const Class& cls);
-
   // Notify the compiler that background (optimized) compilation has failed
   // because the mutator thread changed the state (e.g., deoptimization,
   // deferred loading). The background compilation may retry to compile
@@ -129,36 +124,24 @@
 
   static void Start(Isolate* isolate) {
     ASSERT(Thread::Current()->IsMutatorThread());
-    if (FLAG_enable_interpreter && isolate->background_compiler() != NULL) {
-      isolate->background_compiler()->Start();
-    }
     if (isolate->optimizing_background_compiler() != NULL) {
       isolate->optimizing_background_compiler()->Start();
     }
   }
   static void Stop(Isolate* isolate) {
     ASSERT(Thread::Current()->IsMutatorThread());
-    if (FLAG_enable_interpreter && isolate->background_compiler() != NULL) {
-      isolate->background_compiler()->Stop();
-    }
     if (isolate->optimizing_background_compiler() != NULL) {
       isolate->optimizing_background_compiler()->Stop();
     }
   }
   static void Enable(Isolate* isolate) {
     ASSERT(Thread::Current()->IsMutatorThread());
-    if (FLAG_enable_interpreter && isolate->background_compiler() != NULL) {
-      isolate->background_compiler()->Enable();
-    }
     if (isolate->optimizing_background_compiler() != NULL) {
       isolate->optimizing_background_compiler()->Enable();
     }
   }
   static void Disable(Isolate* isolate) {
     ASSERT(Thread::Current()->IsMutatorThread());
-    if (FLAG_enable_interpreter && isolate->background_compiler() != NULL) {
-      isolate->background_compiler()->Disable();
-    }
     if (isolate->optimizing_background_compiler() != NULL) {
       isolate->optimizing_background_compiler()->Disable();
     }
@@ -169,10 +152,6 @@
       if (isolate->optimizing_background_compiler() != NULL) {
         return isolate->optimizing_background_compiler()->IsDisabled();
       }
-    } else {
-      if (FLAG_enable_interpreter && isolate->background_compiler() != NULL) {
-        return isolate->background_compiler()->IsDisabled();
-      }
     }
     return false;
   }
diff --git a/runtime/vm/compiler/recognized_methods_list.h b/runtime/vm/compiler/recognized_methods_list.h
index e9f8516a..d725d4e 100644
--- a/runtime/vm/compiler/recognized_methods_list.h
+++ b/runtime/vm/compiler/recognized_methods_list.h
@@ -191,7 +191,7 @@
   V(Pointer, get:address, FfiGetAddress, 0x012b2b9f)                           \
   V(::, reachabilityFence, ReachabilityFence, 0xad39d0a6)                      \
   V(_Utf8Decoder, _scan, Utf8DecoderScan, 0x78f44c3c)                          \
-  V(_Future, timeout, FutureTimeout, 0x010f8ad4)                               \
+  V(_Future, timeout, FutureTimeout, 0xdea67258)                               \
   V(Future, wait, FutureWait, 0x6c0c3295)                                      \
 
 // List of intrinsics:
diff --git a/runtime/vm/compiler/runtime_api.cc b/runtime/vm/compiler/runtime_api.cc
index d3627d0..24bfa59 100644
--- a/runtime/vm/compiler/runtime_api.cc
+++ b/runtime/vm/compiler/runtime_api.cc
@@ -444,6 +444,8 @@
     case kArrayCid:
     case kImmutableArrayCid:
       return Array::data_offset();
+    case kTypeArgumentsCid:
+      return TypeArguments::types_offset();
     case kOneByteStringCid:
       return OneByteString::data_offset();
     case kTwoByteStringCid:
@@ -462,6 +464,7 @@
   switch (cid) {
     case kArrayCid:
     case kImmutableArrayCid:
+    case kTypeArgumentsCid:
       return kWordSize;
     case kOneByteStringCid:
       return dart::OneByteString::kBytesPerElement;
@@ -724,8 +727,8 @@
   return dart::Thread::ExecutionState::kThreadInVM;
 }
 
-uword Thread::vm_tag_compiled_id() {
-  return dart::VMTag::kDartCompiledTagId;
+uword Thread::vm_tag_dart_id() {
+  return dart::VMTag::kDartTagId;
 }
 
 uword Thread::exit_through_runtime_call() {
@@ -882,6 +885,11 @@
   return -kWordSize;
 }
 
+intptr_t Array::index_at_offset(intptr_t offset_in_bytes) {
+  return dart::Array::index_at_offset(
+      TranslateOffsetInWordsToHost(offset_in_bytes));
+}
+
 word GrowableObjectArray::NextFieldOffset() {
   return -kWordSize;
 }
@@ -926,6 +934,10 @@
   return -kWordSize;
 }
 
+word String::InstanceSize(word payload_size) {
+  return RoundedAllocationSize(String::InstanceSize() + payload_size);
+}
+
 word OneByteString::NextFieldOffset() {
   return -kWordSize;
 }
@@ -990,10 +1002,6 @@
   return -kWordSize;
 }
 
-word Bytecode::NextFieldOffset() {
-  return -kWordSize;
-}
-
 word PcDescriptors::NextFieldOffset() {
   return -kWordSize;
 }
@@ -1018,10 +1026,6 @@
   return -kWordSize;
 }
 
-word ParameterTypeCheck::NextFieldOffset() {
-  return -kWordSize;
-}
-
 word UnlinkedCall::NextFieldOffset() {
   return -kWordSize;
 }
diff --git a/runtime/vm/compiler/runtime_api.h b/runtime/vm/compiler/runtime_api.h
index ac5ff81..7611669 100644
--- a/runtime/vm/compiler/runtime_api.h
+++ b/runtime/vm/compiler/runtime_api.h
@@ -492,7 +492,9 @@
 class Function : public AllStatic {
  public:
   static word code_offset();
+  static word data_offset();
   static word entry_point_offset(CodeEntryKind kind = CodeEntryKind::kNormal);
+  static word kind_tag_offset();
   static word packed_fields_offset();
   static word parameter_names_offset();
   static word parameter_types_offset();
@@ -553,6 +555,7 @@
   static word type_arguments_offset();
   static word length_offset();
   static word element_offset(intptr_t index);
+  static intptr_t index_at_offset(intptr_t offset_in_bytes);
   static word InstanceSize();
   static word NextFieldOffset();
 
@@ -699,6 +702,7 @@
   static word length_offset();
   static word InstanceSize();
   static word NextFieldOffset();
+  static word InstanceSize(word payload_size);
 };
 
 class OneByteString : public AllStatic {
@@ -804,12 +808,6 @@
   static word NextFieldOffset();
 };
 
-class Bytecode : public AllStatic {
- public:
-  static word InstanceSize();
-  static word NextFieldOffset();
-};
-
 class PcDescriptors : public AllStatic {
  public:
   static word HeaderSize();
@@ -852,12 +850,6 @@
   static word NextFieldOffset();
 };
 
-class ParameterTypeCheck : public AllStatic {
- public:
-  static word InstanceSize();
-  static word NextFieldOffset();
-};
-
 class UnlinkedCall : public AllStatic {
  public:
   static word InstanceSize();
@@ -898,6 +890,9 @@
 
 class TypeParameter : public AllStatic {
  public:
+  static word bound_offset();
+  static word flags_offset();
+  static word name_offset();
   static word InstanceSize();
   static word NextFieldOffset();
   static word parameterized_class_id_offset();
@@ -1031,7 +1026,7 @@
   static word slow_type_test_entry_point_offset();
   static word write_barrier_entry_point_offset();
   static word vm_tag_offset();
-  static uword vm_tag_compiled_id();
+  static uword vm_tag_dart_id();
 
   static word safepoint_state_offset();
   static uword safepoint_state_unacquired();
@@ -1061,8 +1056,8 @@
   static word slow_type_test_stub_offset();
   static word call_to_runtime_stub_offset();
   static word invoke_dart_code_stub_offset();
-  static word interpret_call_entry_point_offset();
-  static word invoke_dart_code_from_bytecode_stub_offset();
+  static word late_initialization_error_shared_without_fpu_regs_stub_offset();
+  static word late_initialization_error_shared_with_fpu_regs_stub_offset();
   static word null_error_shared_without_fpu_regs_stub_offset();
   static word null_error_shared_with_fpu_regs_stub_offset();
   static word null_arg_error_shared_without_fpu_regs_stub_offset();
@@ -1251,6 +1246,8 @@
 
 class ClosureData : public AllStatic {
  public:
+  static word default_type_arguments_offset();
+  static word default_type_arguments_info_offset();
   static word InstanceSize();
   static word NextFieldOffset();
 };
@@ -1325,8 +1322,11 @@
   static word length_offset();
   static word nullability_offset();
   static word type_at_offset(intptr_t i);
+  static word types_offset();
   static word InstanceSize();
   static word NextFieldOffset();
+
+  static const word kMaxElements;
 };
 
 class FreeListElement : public AllStatic {
diff --git a/runtime/vm/compiler/runtime_offsets_extracted.h b/runtime/vm/compiler/runtime_offsets_extracted.h
index 4a6d9e0..7263afe 100644
--- a/runtime/vm/compiler/runtime_offsets_extracted.h
+++ b/runtime/vm/compiler/runtime_offsets_extracted.h
@@ -19,7 +19,7 @@
 
 #if defined(TARGET_ARCH_ARM)
 static constexpr dart::compiler::target::word Function_usage_counter_offset =
-    76;
+    84;
 static constexpr dart::compiler::target::word
     ICData_receivers_static_type_offset = 16;
 static constexpr dart::compiler::target::word ObjectPool_elements_start_offset =
@@ -59,6 +59,8 @@
 static constexpr dart::compiler::target::word
     SubtypeTestCache_kTestEntryLength = 7;
 static constexpr dart::compiler::target::word SubtypeTestCache_kTestResult = 0;
+static constexpr dart::compiler::target::word TypeArguments_kMaxElements =
+    268435455;
 static constexpr dart::compiler::target::word
     AbstractType_type_test_stub_entry_point_offset = 4;
 static constexpr dart::compiler::target::word ArgumentsDescriptor_count_offset =
@@ -99,6 +101,10 @@
 static constexpr dart::compiler::target::word Closure_hash_offset = 24;
 static constexpr dart::compiler::target::word
     Closure_instantiator_type_arguments_offset = 4;
+static constexpr dart::compiler::target::word
+    ClosureData_default_type_arguments_offset = 20;
+static constexpr dart::compiler::target::word
+    ClosureData_default_type_arguments_info_offset = 24;
 static constexpr dart::compiler::target::word Code_object_pool_offset = 20;
 static constexpr dart::compiler::target::word Code_saved_instructions_offset =
     24;
@@ -124,10 +130,12 @@
 static constexpr dart::compiler::target::word Field_is_nullable_offset = 50;
 static constexpr dart::compiler::target::word Field_kind_bits_offset = 58;
 static constexpr dart::compiler::target::word Function_code_offset = 44;
+static constexpr dart::compiler::target::word Function_data_offset = 36;
 static constexpr dart::compiler::target::word Function_entry_point_offset[] = {
     4, 8};
+static constexpr dart::compiler::target::word Function_kind_tag_offset = 72;
 static constexpr dart::compiler::target::word Function_packed_fields_offset =
-    68;
+    76;
 static constexpr dart::compiler::target::word Function_parameter_names_offset =
     28;
 static constexpr dart::compiler::target::word Function_parameter_types_offset =
@@ -211,71 +219,71 @@
 static constexpr dart::compiler::target::word
     Thread_AllocateArray_entry_point_offset = 376;
 static constexpr dart::compiler::target::word Thread_active_exception_offset =
-    724;
+    696;
 static constexpr dart::compiler::target::word Thread_active_stacktrace_offset =
-    728;
+    700;
 static constexpr dart::compiler::target::word
     Thread_array_write_barrier_code_offset = 128;
 static constexpr dart::compiler::target::word
-    Thread_array_write_barrier_entry_point_offset = 268;
+    Thread_array_write_barrier_entry_point_offset = 272;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_with_fpu_regs_entry_point_offset = 276;
+    Thread_allocate_mint_with_fpu_regs_entry_point_offset = 280;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_with_fpu_regs_stub_offset = 184;
+    Thread_allocate_mint_with_fpu_regs_stub_offset = 188;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_without_fpu_regs_entry_point_offset = 280;
+    Thread_allocate_mint_without_fpu_regs_entry_point_offset = 284;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_without_fpu_regs_stub_offset = 188;
+    Thread_allocate_mint_without_fpu_regs_stub_offset = 192;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_entry_point_offset = 284;
+    Thread_allocate_object_entry_point_offset = 288;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_stub_offset = 192;
+    Thread_allocate_object_stub_offset = 196;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_parameterized_entry_point_offset = 288;
+    Thread_allocate_object_parameterized_entry_point_offset = 292;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_parameterized_stub_offset = 196;
+    Thread_allocate_object_parameterized_stub_offset = 200;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_slow_entry_point_offset = 292;
+    Thread_allocate_object_slow_entry_point_offset = 296;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_slow_stub_offset = 200;
-static constexpr dart::compiler::target::word Thread_api_top_scope_offset = 760;
+    Thread_allocate_object_slow_stub_offset = 204;
+static constexpr dart::compiler::target::word Thread_api_top_scope_offset = 732;
 static constexpr dart::compiler::target::word Thread_async_stack_trace_offset =
     96;
 static constexpr dart::compiler::target::word
-    Thread_auto_scope_native_wrapper_entry_point_offset = 336;
+    Thread_auto_scope_native_wrapper_entry_point_offset = 340;
 static constexpr dart::compiler::target::word Thread_bool_false_offset = 120;
 static constexpr dart::compiler::target::word Thread_bool_true_offset = 116;
 static constexpr dart::compiler::target::word
-    Thread_bootstrap_native_wrapper_entry_point_offset = 328;
+    Thread_bootstrap_native_wrapper_entry_point_offset = 332;
 static constexpr dart::compiler::target::word
-    Thread_call_to_runtime_entry_point_offset = 272;
+    Thread_call_to_runtime_entry_point_offset = 276;
 static constexpr dart::compiler::target::word
-    Thread_call_to_runtime_stub_offset = 148;
-static constexpr dart::compiler::target::word Thread_dart_stream_offset = 768;
+    Thread_call_to_runtime_stub_offset = 144;
+static constexpr dart::compiler::target::word Thread_dart_stream_offset = 740;
 static constexpr dart::compiler::target::word
     Thread_dispatch_table_array_offset = 48;
 static constexpr dart::compiler::target::word Thread_optimize_entry_offset =
-    312;
-static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 228;
-static constexpr dart::compiler::target::word Thread_deoptimize_entry_offset =
     316;
+static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 232;
+static constexpr dart::compiler::target::word Thread_deoptimize_entry_offset =
+    320;
 static constexpr dart::compiler::target::word Thread_deoptimize_stub_offset =
-    232;
+    236;
 static constexpr dart::compiler::target::word Thread_double_abs_address_offset =
     356;
 static constexpr dart::compiler::target::word
     Thread_double_negate_address_offset = 352;
 static constexpr dart::compiler::target::word Thread_end_offset = 56;
 static constexpr dart::compiler::target::word
-    Thread_enter_safepoint_stub_offset = 252;
+    Thread_enter_safepoint_stub_offset = 256;
 static constexpr dart::compiler::target::word Thread_execution_state_offset =
-    744;
+    716;
 static constexpr dart::compiler::target::word
-    Thread_exit_safepoint_stub_offset = 256;
+    Thread_exit_safepoint_stub_offset = 260;
 static constexpr dart::compiler::target::word
-    Thread_call_native_through_safepoint_stub_offset = 260;
+    Thread_call_native_through_safepoint_stub_offset = 264;
 static constexpr dart::compiler::target::word
-    Thread_call_native_through_safepoint_entry_point_offset = 320;
+    Thread_call_native_through_safepoint_entry_point_offset = 324;
 static constexpr dart::compiler::target::word
     Thread_fix_allocation_stub_code_offset = 136;
 static constexpr dart::compiler::target::word
@@ -289,75 +297,75 @@
 static constexpr dart::compiler::target::word
     Thread_float_zerow_address_offset = 372;
 static constexpr dart::compiler::target::word Thread_global_object_pool_offset =
-    732;
-static constexpr dart::compiler::target::word
-    Thread_interpret_call_entry_point_offset = 340;
-static constexpr dart::compiler::target::word
-    Thread_invoke_dart_code_from_bytecode_stub_offset = 144;
+    704;
 static constexpr dart::compiler::target::word
     Thread_invoke_dart_code_stub_offset = 140;
 static constexpr dart::compiler::target::word Thread_exit_through_ffi_offset =
-    756;
+    728;
 static constexpr dart::compiler::target::word Thread_isolate_offset = 44;
 static constexpr dart::compiler::target::word Thread_field_table_values_offset =
     68;
 static constexpr dart::compiler::target::word
-    Thread_lazy_deopt_from_return_stub_offset = 236;
+    Thread_lazy_deopt_from_return_stub_offset = 240;
 static constexpr dart::compiler::target::word
-    Thread_lazy_deopt_from_throw_stub_offset = 240;
+    Thread_lazy_deopt_from_throw_stub_offset = 244;
 static constexpr dart::compiler::target::word
-    Thread_lazy_specialize_type_test_stub_offset = 248;
+    Thread_lazy_specialize_type_test_stub_offset = 252;
 static constexpr dart::compiler::target::word
     Thread_marking_stack_block_offset = 84;
 static constexpr dart::compiler::target::word
-    Thread_megamorphic_call_checked_entry_offset = 304;
+    Thread_megamorphic_call_checked_entry_offset = 308;
 static constexpr dart::compiler::target::word
-    Thread_switchable_call_miss_entry_offset = 308;
+    Thread_switchable_call_miss_entry_offset = 312;
 static constexpr dart::compiler::target::word
-    Thread_switchable_call_miss_stub_offset = 212;
+    Thread_switchable_call_miss_stub_offset = 216;
 static constexpr dart::compiler::target::word
-    Thread_no_scope_native_wrapper_entry_point_offset = 332;
+    Thread_no_scope_native_wrapper_entry_point_offset = 336;
 static constexpr dart::compiler::target::word
-    Thread_null_error_shared_with_fpu_regs_stub_offset = 156;
+    Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 152;
 static constexpr dart::compiler::target::word
-    Thread_null_error_shared_without_fpu_regs_stub_offset = 152;
+    Thread_late_initialization_error_shared_without_fpu_regs_stub_offset = 148;
 static constexpr dart::compiler::target::word
-    Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 164;
+    Thread_null_error_shared_with_fpu_regs_stub_offset = 160;
 static constexpr dart::compiler::target::word
-    Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 160;
+    Thread_null_error_shared_without_fpu_regs_stub_offset = 156;
 static constexpr dart::compiler::target::word
-    Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 172;
+    Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 168;
 static constexpr dart::compiler::target::word
-    Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 168;
+    Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 164;
 static constexpr dart::compiler::target::word
-    Thread_range_error_shared_with_fpu_regs_stub_offset = 180;
+    Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 176;
 static constexpr dart::compiler::target::word
-    Thread_range_error_shared_without_fpu_regs_stub_offset = 176;
+    Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 172;
+static constexpr dart::compiler::target::word
+    Thread_range_error_shared_with_fpu_regs_stub_offset = 184;
+static constexpr dart::compiler::target::word
+    Thread_range_error_shared_without_fpu_regs_stub_offset = 180;
 static constexpr dart::compiler::target::word Thread_object_null_offset = 112;
 static constexpr dart::compiler::target::word
     Thread_predefined_symbols_address_offset = 344;
-static constexpr dart::compiler::target::word Thread_resume_pc_offset = 736;
+static constexpr dart::compiler::target::word Thread_resume_pc_offset = 708;
 static constexpr dart::compiler::target::word
-    Thread_saved_shadow_call_stack_offset = 740;
+    Thread_saved_shadow_call_stack_offset = 712;
 static constexpr dart::compiler::target::word Thread_safepoint_state_offset =
-    748;
+    720;
 static constexpr dart::compiler::target::word
-    Thread_slow_type_test_stub_offset = 244;
+    Thread_slow_type_test_stub_offset = 248;
 static constexpr dart::compiler::target::word
-    Thread_slow_type_test_entry_point_offset = 324;
+    Thread_slow_type_test_entry_point_offset = 328;
 static constexpr dart::compiler::target::word Thread_stack_limit_offset = 36;
 static constexpr dart::compiler::target::word Thread_saved_stack_limit_offset =
     60;
 static constexpr dart::compiler::target::word
     Thread_stack_overflow_flags_offset = 64;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 300;
+    Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 304;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 208;
+    Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 212;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 296;
+    Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 300;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 204;
+    Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 208;
 static constexpr dart::compiler::target::word Thread_store_buffer_block_offset =
     80;
 static constexpr dart::compiler::target::word
@@ -370,10 +378,10 @@
 static constexpr dart::compiler::target::word Thread_write_barrier_code_offset =
     124;
 static constexpr dart::compiler::target::word
-    Thread_write_barrier_entry_point_offset = 264;
+    Thread_write_barrier_entry_point_offset = 268;
 static constexpr dart::compiler::target::word Thread_write_barrier_mask_offset =
     40;
-static constexpr dart::compiler::target::word Thread_callback_code_offset = 752;
+static constexpr dart::compiler::target::word Thread_callback_code_offset = 724;
 static constexpr dart::compiler::target::word TimelineStream_enabled_offset = 8;
 static constexpr dart::compiler::target::word TwoByteString_data_offset = 12;
 static constexpr dart::compiler::target::word Type_arguments_offset = 16;
@@ -383,13 +391,17 @@
 static constexpr dart::compiler::target::word Type_type_state_offset = 32;
 static constexpr dart::compiler::target::word Type_nullability_offset = 33;
 static constexpr dart::compiler::target::word
-    TypeParameter_parameterized_class_id_offset = 28;
-static constexpr dart::compiler::target::word TypeParameter_index_offset = 36;
+    TypeParameter_parameterized_class_id_offset = 32;
+static constexpr dart::compiler::target::word TypeParameter_index_offset = 40;
 static constexpr dart::compiler::target::word
     TypeArguments_instantiations_offset = 4;
 static constexpr dart::compiler::target::word TypeArguments_length_offset = 8;
 static constexpr dart::compiler::target::word TypeArguments_nullability_offset =
     16;
+static constexpr dart::compiler::target::word TypeArguments_types_offset = 20;
+static constexpr dart::compiler::target::word TypeParameter_bound_offset = 20;
+static constexpr dart::compiler::target::word TypeParameter_flags_offset = 42;
+static constexpr dart::compiler::target::word TypeParameter_name_offset = 12;
 static constexpr dart::compiler::target::word TypeRef_type_offset = 12;
 static constexpr dart::compiler::target::word TypedDataBase_length_offset = 8;
 static constexpr dart::compiler::target::word TypedDataView_data_offset = 12;
@@ -419,16 +431,15 @@
     4, 12, 8, 16};
 static constexpr dart::compiler::target::word
     Thread_write_barrier_wrappers_thread_offset[] = {
-        692, 696, 700, 704, 708, -1, 712, -1, 716, 720, -1, -1, -1, -1, -1, -1};
+        664, 668, 672, 676, 680, -1, 684, -1, 688, 692, -1, -1, -1, -1, -1, -1};
 static constexpr dart::compiler::target::word ApiError_InstanceSize = 8;
 static constexpr dart::compiler::target::word Array_InstanceSize = 12;
 static constexpr dart::compiler::target::word Array_header_size = 12;
 static constexpr dart::compiler::target::word Bool_InstanceSize = 8;
-static constexpr dart::compiler::target::word Bytecode_InstanceSize = 48;
 static constexpr dart::compiler::target::word Capability_InstanceSize = 16;
 static constexpr dart::compiler::target::word Class_InstanceSize = 128;
 static constexpr dart::compiler::target::word Closure_InstanceSize = 28;
-static constexpr dart::compiler::target::word ClosureData_InstanceSize = 20;
+static constexpr dart::compiler::target::word ClosureData_InstanceSize = 28;
 static constexpr dart::compiler::target::word Code_InstanceSize = 96;
 static constexpr dart::compiler::target::word CodeSourceMap_HeaderSize = 8;
 static constexpr dart::compiler::target::word CompressedStackMaps_HeaderSize =
@@ -464,7 +475,7 @@
 static constexpr dart::compiler::target::word Int32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word Integer_InstanceSize = 4;
 static constexpr dart::compiler::target::word KernelProgramInfo_InstanceSize =
-    64;
+    60;
 static constexpr dart::compiler::target::word LanguageError_InstanceSize = 28;
 static constexpr dart::compiler::target::word Library_InstanceSize = 84;
 static constexpr dart::compiler::target::word LibraryPrefix_InstanceSize = 20;
@@ -483,12 +494,10 @@
 static constexpr dart::compiler::target::word Object_InstanceSize = 4;
 static constexpr dart::compiler::target::word ObjectPool_InstanceSize = 8;
 static constexpr dart::compiler::target::word OneByteString_InstanceSize = 12;
-static constexpr dart::compiler::target::word ParameterTypeCheck_InstanceSize =
-    24;
 static constexpr dart::compiler::target::word PatchClass_InstanceSize = 24;
 static constexpr dart::compiler::target::word PcDescriptors_HeaderSize = 8;
 static constexpr dart::compiler::target::word Pointer_InstanceSize = 12;
-static constexpr dart::compiler::target::word ReceivePort_InstanceSize = 12;
+static constexpr dart::compiler::target::word ReceivePort_InstanceSize = 20;
 static constexpr dart::compiler::target::word RedirectionData_InstanceSize = 16;
 static constexpr dart::compiler::target::word RegExp_InstanceSize = 60;
 static constexpr dart::compiler::target::word Script_InstanceSize = 56;
@@ -506,7 +515,7 @@
 static constexpr dart::compiler::target::word TwoByteString_InstanceSize = 12;
 static constexpr dart::compiler::target::word Type_InstanceSize = 36;
 static constexpr dart::compiler::target::word TypeArguments_InstanceSize = 20;
-static constexpr dart::compiler::target::word TypeParameter_InstanceSize = 40;
+static constexpr dart::compiler::target::word TypeParameter_InstanceSize = 44;
 static constexpr dart::compiler::target::word TypeRef_InstanceSize = 16;
 static constexpr dart::compiler::target::word TypedData_InstanceSize = 12;
 static constexpr dart::compiler::target::word TypedDataBase_InstanceSize = 12;
@@ -565,6 +574,8 @@
 static constexpr dart::compiler::target::word
     SubtypeTestCache_kTestEntryLength = 7;
 static constexpr dart::compiler::target::word SubtypeTestCache_kTestResult = 0;
+static constexpr dart::compiler::target::word TypeArguments_kMaxElements =
+    576460752303423487;
 static constexpr dart::compiler::target::word
     AbstractType_type_test_stub_entry_point_offset = 8;
 static constexpr dart::compiler::target::word ArgumentsDescriptor_count_offset =
@@ -605,6 +616,10 @@
 static constexpr dart::compiler::target::word Closure_hash_offset = 48;
 static constexpr dart::compiler::target::word
     Closure_instantiator_type_arguments_offset = 8;
+static constexpr dart::compiler::target::word
+    ClosureData_default_type_arguments_offset = 40;
+static constexpr dart::compiler::target::word
+    ClosureData_default_type_arguments_info_offset = 48;
 static constexpr dart::compiler::target::word Code_object_pool_offset = 40;
 static constexpr dart::compiler::target::word Code_saved_instructions_offset =
     48;
@@ -630,8 +645,10 @@
 static constexpr dart::compiler::target::word Field_is_nullable_offset = 90;
 static constexpr dart::compiler::target::word Field_kind_bits_offset = 98;
 static constexpr dart::compiler::target::word Function_code_offset = 88;
+static constexpr dart::compiler::target::word Function_data_offset = 72;
 static constexpr dart::compiler::target::word Function_entry_point_offset[] = {
     8, 16};
+static constexpr dart::compiler::target::word Function_kind_tag_offset = 120;
 static constexpr dart::compiler::target::word Function_packed_fields_offset =
     124;
 static constexpr dart::compiler::target::word Function_parameter_names_offset =
@@ -718,72 +735,72 @@
 static constexpr dart::compiler::target::word
     Thread_AllocateArray_entry_point_offset = 736;
 static constexpr dart::compiler::target::word Thread_active_exception_offset =
-    1456;
+    1400;
 static constexpr dart::compiler::target::word Thread_active_stacktrace_offset =
-    1464;
+    1408;
 static constexpr dart::compiler::target::word
     Thread_array_write_barrier_code_offset = 240;
 static constexpr dart::compiler::target::word
-    Thread_array_write_barrier_entry_point_offset = 520;
+    Thread_array_write_barrier_entry_point_offset = 528;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_with_fpu_regs_entry_point_offset = 536;
+    Thread_allocate_mint_with_fpu_regs_entry_point_offset = 544;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_with_fpu_regs_stub_offset = 352;
+    Thread_allocate_mint_with_fpu_regs_stub_offset = 360;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_without_fpu_regs_entry_point_offset = 544;
+    Thread_allocate_mint_without_fpu_regs_entry_point_offset = 552;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_without_fpu_regs_stub_offset = 360;
+    Thread_allocate_mint_without_fpu_regs_stub_offset = 368;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_entry_point_offset = 552;
+    Thread_allocate_object_entry_point_offset = 560;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_stub_offset = 368;
+    Thread_allocate_object_stub_offset = 376;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_parameterized_entry_point_offset = 560;
+    Thread_allocate_object_parameterized_entry_point_offset = 568;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_parameterized_stub_offset = 376;
+    Thread_allocate_object_parameterized_stub_offset = 384;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_slow_entry_point_offset = 568;
+    Thread_allocate_object_slow_entry_point_offset = 576;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_slow_stub_offset = 384;
+    Thread_allocate_object_slow_stub_offset = 392;
 static constexpr dart::compiler::target::word Thread_api_top_scope_offset =
-    1528;
+    1472;
 static constexpr dart::compiler::target::word Thread_async_stack_trace_offset =
     192;
 static constexpr dart::compiler::target::word
-    Thread_auto_scope_native_wrapper_entry_point_offset = 656;
+    Thread_auto_scope_native_wrapper_entry_point_offset = 664;
 static constexpr dart::compiler::target::word Thread_bool_false_offset = 224;
 static constexpr dart::compiler::target::word Thread_bool_true_offset = 216;
 static constexpr dart::compiler::target::word
-    Thread_bootstrap_native_wrapper_entry_point_offset = 640;
+    Thread_bootstrap_native_wrapper_entry_point_offset = 648;
 static constexpr dart::compiler::target::word
-    Thread_call_to_runtime_entry_point_offset = 528;
+    Thread_call_to_runtime_entry_point_offset = 536;
 static constexpr dart::compiler::target::word
-    Thread_call_to_runtime_stub_offset = 280;
-static constexpr dart::compiler::target::word Thread_dart_stream_offset = 1544;
+    Thread_call_to_runtime_stub_offset = 272;
+static constexpr dart::compiler::target::word Thread_dart_stream_offset = 1488;
 static constexpr dart::compiler::target::word
     Thread_dispatch_table_array_offset = 96;
 static constexpr dart::compiler::target::word Thread_optimize_entry_offset =
-    608;
-static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 440;
-static constexpr dart::compiler::target::word Thread_deoptimize_entry_offset =
     616;
+static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 448;
+static constexpr dart::compiler::target::word Thread_deoptimize_entry_offset =
+    624;
 static constexpr dart::compiler::target::word Thread_deoptimize_stub_offset =
-    448;
+    456;
 static constexpr dart::compiler::target::word Thread_double_abs_address_offset =
     696;
 static constexpr dart::compiler::target::word
     Thread_double_negate_address_offset = 688;
 static constexpr dart::compiler::target::word Thread_end_offset = 112;
 static constexpr dart::compiler::target::word
-    Thread_enter_safepoint_stub_offset = 488;
+    Thread_enter_safepoint_stub_offset = 496;
 static constexpr dart::compiler::target::word Thread_execution_state_offset =
-    1496;
+    1440;
 static constexpr dart::compiler::target::word
-    Thread_exit_safepoint_stub_offset = 496;
+    Thread_exit_safepoint_stub_offset = 504;
 static constexpr dart::compiler::target::word
-    Thread_call_native_through_safepoint_stub_offset = 504;
+    Thread_call_native_through_safepoint_stub_offset = 512;
 static constexpr dart::compiler::target::word
-    Thread_call_native_through_safepoint_entry_point_offset = 624;
+    Thread_call_native_through_safepoint_entry_point_offset = 632;
 static constexpr dart::compiler::target::word
     Thread_fix_allocation_stub_code_offset = 256;
 static constexpr dart::compiler::target::word
@@ -797,75 +814,75 @@
 static constexpr dart::compiler::target::word
     Thread_float_zerow_address_offset = 728;
 static constexpr dart::compiler::target::word Thread_global_object_pool_offset =
-    1472;
-static constexpr dart::compiler::target::word
-    Thread_interpret_call_entry_point_offset = 664;
-static constexpr dart::compiler::target::word
-    Thread_invoke_dart_code_from_bytecode_stub_offset = 272;
+    1416;
 static constexpr dart::compiler::target::word
     Thread_invoke_dart_code_stub_offset = 264;
 static constexpr dart::compiler::target::word Thread_exit_through_ffi_offset =
-    1520;
+    1464;
 static constexpr dart::compiler::target::word Thread_isolate_offset = 88;
 static constexpr dart::compiler::target::word Thread_field_table_values_offset =
     136;
 static constexpr dart::compiler::target::word
-    Thread_lazy_deopt_from_return_stub_offset = 456;
+    Thread_lazy_deopt_from_return_stub_offset = 464;
 static constexpr dart::compiler::target::word
-    Thread_lazy_deopt_from_throw_stub_offset = 464;
+    Thread_lazy_deopt_from_throw_stub_offset = 472;
 static constexpr dart::compiler::target::word
-    Thread_lazy_specialize_type_test_stub_offset = 480;
+    Thread_lazy_specialize_type_test_stub_offset = 488;
 static constexpr dart::compiler::target::word
     Thread_marking_stack_block_offset = 168;
 static constexpr dart::compiler::target::word
-    Thread_megamorphic_call_checked_entry_offset = 592;
+    Thread_megamorphic_call_checked_entry_offset = 600;
 static constexpr dart::compiler::target::word
-    Thread_switchable_call_miss_entry_offset = 600;
+    Thread_switchable_call_miss_entry_offset = 608;
 static constexpr dart::compiler::target::word
-    Thread_switchable_call_miss_stub_offset = 408;
+    Thread_switchable_call_miss_stub_offset = 416;
 static constexpr dart::compiler::target::word
-    Thread_no_scope_native_wrapper_entry_point_offset = 648;
+    Thread_no_scope_native_wrapper_entry_point_offset = 656;
 static constexpr dart::compiler::target::word
-    Thread_null_error_shared_with_fpu_regs_stub_offset = 296;
+    Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 288;
 static constexpr dart::compiler::target::word
-    Thread_null_error_shared_without_fpu_regs_stub_offset = 288;
+    Thread_late_initialization_error_shared_without_fpu_regs_stub_offset = 280;
 static constexpr dart::compiler::target::word
-    Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 312;
+    Thread_null_error_shared_with_fpu_regs_stub_offset = 304;
 static constexpr dart::compiler::target::word
-    Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 304;
+    Thread_null_error_shared_without_fpu_regs_stub_offset = 296;
 static constexpr dart::compiler::target::word
-    Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 328;
+    Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 320;
 static constexpr dart::compiler::target::word
-    Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 320;
+    Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 312;
 static constexpr dart::compiler::target::word
-    Thread_range_error_shared_with_fpu_regs_stub_offset = 344;
+    Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 336;
 static constexpr dart::compiler::target::word
-    Thread_range_error_shared_without_fpu_regs_stub_offset = 336;
+    Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 328;
+static constexpr dart::compiler::target::word
+    Thread_range_error_shared_with_fpu_regs_stub_offset = 352;
+static constexpr dart::compiler::target::word
+    Thread_range_error_shared_without_fpu_regs_stub_offset = 344;
 static constexpr dart::compiler::target::word Thread_object_null_offset = 208;
 static constexpr dart::compiler::target::word
     Thread_predefined_symbols_address_offset = 672;
-static constexpr dart::compiler::target::word Thread_resume_pc_offset = 1480;
+static constexpr dart::compiler::target::word Thread_resume_pc_offset = 1424;
 static constexpr dart::compiler::target::word
-    Thread_saved_shadow_call_stack_offset = 1488;
+    Thread_saved_shadow_call_stack_offset = 1432;
 static constexpr dart::compiler::target::word Thread_safepoint_state_offset =
-    1504;
+    1448;
 static constexpr dart::compiler::target::word
-    Thread_slow_type_test_stub_offset = 472;
+    Thread_slow_type_test_stub_offset = 480;
 static constexpr dart::compiler::target::word
-    Thread_slow_type_test_entry_point_offset = 632;
+    Thread_slow_type_test_entry_point_offset = 640;
 static constexpr dart::compiler::target::word Thread_stack_limit_offset = 72;
 static constexpr dart::compiler::target::word Thread_saved_stack_limit_offset =
     120;
 static constexpr dart::compiler::target::word
     Thread_stack_overflow_flags_offset = 128;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 584;
+    Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 592;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 400;
+    Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 408;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 576;
+    Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 584;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 392;
+    Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 400;
 static constexpr dart::compiler::target::word Thread_store_buffer_block_offset =
     160;
 static constexpr dart::compiler::target::word
@@ -878,11 +895,11 @@
 static constexpr dart::compiler::target::word Thread_write_barrier_code_offset =
     232;
 static constexpr dart::compiler::target::word
-    Thread_write_barrier_entry_point_offset = 512;
+    Thread_write_barrier_entry_point_offset = 520;
 static constexpr dart::compiler::target::word Thread_write_barrier_mask_offset =
     80;
 static constexpr dart::compiler::target::word Thread_callback_code_offset =
-    1512;
+    1456;
 static constexpr dart::compiler::target::word TimelineStream_enabled_offset =
     16;
 static constexpr dart::compiler::target::word TwoByteString_data_offset = 16;
@@ -893,13 +910,17 @@
 static constexpr dart::compiler::target::word Type_type_state_offset = 60;
 static constexpr dart::compiler::target::word Type_nullability_offset = 61;
 static constexpr dart::compiler::target::word
-    TypeParameter_parameterized_class_id_offset = 56;
-static constexpr dart::compiler::target::word TypeParameter_index_offset = 64;
+    TypeParameter_parameterized_class_id_offset = 64;
+static constexpr dart::compiler::target::word TypeParameter_index_offset = 72;
 static constexpr dart::compiler::target::word
     TypeArguments_instantiations_offset = 8;
 static constexpr dart::compiler::target::word TypeArguments_length_offset = 16;
 static constexpr dart::compiler::target::word TypeArguments_nullability_offset =
     32;
+static constexpr dart::compiler::target::word TypeArguments_types_offset = 40;
+static constexpr dart::compiler::target::word TypeParameter_bound_offset = 40;
+static constexpr dart::compiler::target::word TypeParameter_flags_offset = 74;
+static constexpr dart::compiler::target::word TypeParameter_name_offset = 24;
 static constexpr dart::compiler::target::word TypeRef_type_offset = 24;
 static constexpr dart::compiler::target::word TypedDataBase_length_offset = 16;
 static constexpr dart::compiler::target::word TypedDataView_data_offset = 24;
@@ -929,17 +950,16 @@
     8, 24, 16, 32};
 static constexpr dart::compiler::target::word
     Thread_write_barrier_wrappers_thread_offset[] = {
-        1368, 1376, 1384, 1392, -1,   -1,   1400, 1408,
-        1416, 1424, 1432, -1,   1440, 1448, -1,   -1};
+        1312, 1320, 1328, 1336, -1,   -1,   1344, 1352,
+        1360, 1368, 1376, -1,   1384, 1392, -1,   -1};
 static constexpr dart::compiler::target::word ApiError_InstanceSize = 16;
 static constexpr dart::compiler::target::word Array_InstanceSize = 24;
 static constexpr dart::compiler::target::word Array_header_size = 24;
 static constexpr dart::compiler::target::word Bool_InstanceSize = 12;
-static constexpr dart::compiler::target::word Bytecode_InstanceSize = 88;
 static constexpr dart::compiler::target::word Capability_InstanceSize = 16;
 static constexpr dart::compiler::target::word Class_InstanceSize = 208;
 static constexpr dart::compiler::target::word Closure_InstanceSize = 56;
-static constexpr dart::compiler::target::word ClosureData_InstanceSize = 40;
+static constexpr dart::compiler::target::word ClosureData_InstanceSize = 56;
 static constexpr dart::compiler::target::word Code_InstanceSize = 176;
 static constexpr dart::compiler::target::word CodeSourceMap_HeaderSize = 16;
 static constexpr dart::compiler::target::word CompressedStackMaps_HeaderSize =
@@ -962,7 +982,7 @@
 static constexpr dart::compiler::target::word Field_InstanceSize = 104;
 static constexpr dart::compiler::target::word Float32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word Float64x2_InstanceSize = 24;
-static constexpr dart::compiler::target::word Function_InstanceSize = 152;
+static constexpr dart::compiler::target::word Function_InstanceSize = 144;
 static constexpr dart::compiler::target::word FutureOr_InstanceSize = 16;
 static constexpr dart::compiler::target::word GrowableObjectArray_InstanceSize =
     32;
@@ -975,7 +995,7 @@
 static constexpr dart::compiler::target::word Int32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word Integer_InstanceSize = 8;
 static constexpr dart::compiler::target::word KernelProgramInfo_InstanceSize =
-    128;
+    120;
 static constexpr dart::compiler::target::word LanguageError_InstanceSize = 48;
 static constexpr dart::compiler::target::word Library_InstanceSize = 160;
 static constexpr dart::compiler::target::word LibraryPrefix_InstanceSize = 40;
@@ -994,12 +1014,10 @@
 static constexpr dart::compiler::target::word Object_InstanceSize = 8;
 static constexpr dart::compiler::target::word ObjectPool_InstanceSize = 16;
 static constexpr dart::compiler::target::word OneByteString_InstanceSize = 16;
-static constexpr dart::compiler::target::word ParameterTypeCheck_InstanceSize =
-    48;
 static constexpr dart::compiler::target::word PatchClass_InstanceSize = 48;
 static constexpr dart::compiler::target::word PcDescriptors_HeaderSize = 16;
 static constexpr dart::compiler::target::word Pointer_InstanceSize = 24;
-static constexpr dart::compiler::target::word ReceivePort_InstanceSize = 24;
+static constexpr dart::compiler::target::word ReceivePort_InstanceSize = 40;
 static constexpr dart::compiler::target::word RedirectionData_InstanceSize = 32;
 static constexpr dart::compiler::target::word RegExp_InstanceSize = 120;
 static constexpr dart::compiler::target::word Script_InstanceSize = 96;
@@ -1018,7 +1036,7 @@
 static constexpr dart::compiler::target::word TwoByteString_InstanceSize = 16;
 static constexpr dart::compiler::target::word Type_InstanceSize = 64;
 static constexpr dart::compiler::target::word TypeArguments_InstanceSize = 40;
-static constexpr dart::compiler::target::word TypeParameter_InstanceSize = 72;
+static constexpr dart::compiler::target::word TypeParameter_InstanceSize = 80;
 static constexpr dart::compiler::target::word TypeRef_InstanceSize = 32;
 static constexpr dart::compiler::target::word TypedData_InstanceSize = 24;
 static constexpr dart::compiler::target::word TypedDataBase_InstanceSize = 24;
@@ -1035,7 +1053,7 @@
 
 #if defined(TARGET_ARCH_IA32)
 static constexpr dart::compiler::target::word Function_usage_counter_offset =
-    76;
+    84;
 static constexpr dart::compiler::target::word
     ICData_receivers_static_type_offset = 16;
 static constexpr dart::compiler::target::word ObjectPool_elements_start_offset =
@@ -1075,6 +1093,8 @@
 static constexpr dart::compiler::target::word
     SubtypeTestCache_kTestEntryLength = 7;
 static constexpr dart::compiler::target::word SubtypeTestCache_kTestResult = 0;
+static constexpr dart::compiler::target::word TypeArguments_kMaxElements =
+    268435455;
 static constexpr dart::compiler::target::word
     AbstractType_type_test_stub_entry_point_offset = 4;
 static constexpr dart::compiler::target::word ArgumentsDescriptor_count_offset =
@@ -1115,6 +1135,10 @@
 static constexpr dart::compiler::target::word Closure_hash_offset = 24;
 static constexpr dart::compiler::target::word
     Closure_instantiator_type_arguments_offset = 4;
+static constexpr dart::compiler::target::word
+    ClosureData_default_type_arguments_offset = 20;
+static constexpr dart::compiler::target::word
+    ClosureData_default_type_arguments_info_offset = 24;
 static constexpr dart::compiler::target::word Code_object_pool_offset = 20;
 static constexpr dart::compiler::target::word Code_saved_instructions_offset =
     24;
@@ -1140,10 +1164,12 @@
 static constexpr dart::compiler::target::word Field_is_nullable_offset = 50;
 static constexpr dart::compiler::target::word Field_kind_bits_offset = 58;
 static constexpr dart::compiler::target::word Function_code_offset = 44;
+static constexpr dart::compiler::target::word Function_data_offset = 36;
 static constexpr dart::compiler::target::word Function_entry_point_offset[] = {
     4, 8};
+static constexpr dart::compiler::target::word Function_kind_tag_offset = 72;
 static constexpr dart::compiler::target::word Function_packed_fields_offset =
-    68;
+    76;
 static constexpr dart::compiler::target::word Function_parameter_names_offset =
     28;
 static constexpr dart::compiler::target::word Function_parameter_types_offset =
@@ -1227,71 +1253,71 @@
 static constexpr dart::compiler::target::word
     Thread_AllocateArray_entry_point_offset = 376;
 static constexpr dart::compiler::target::word Thread_active_exception_offset =
-    692;
+    664;
 static constexpr dart::compiler::target::word Thread_active_stacktrace_offset =
-    696;
+    668;
 static constexpr dart::compiler::target::word
     Thread_array_write_barrier_code_offset = 128;
 static constexpr dart::compiler::target::word
-    Thread_array_write_barrier_entry_point_offset = 268;
+    Thread_array_write_barrier_entry_point_offset = 272;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_with_fpu_regs_entry_point_offset = 276;
+    Thread_allocate_mint_with_fpu_regs_entry_point_offset = 280;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_with_fpu_regs_stub_offset = 184;
+    Thread_allocate_mint_with_fpu_regs_stub_offset = 188;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_without_fpu_regs_entry_point_offset = 280;
+    Thread_allocate_mint_without_fpu_regs_entry_point_offset = 284;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_without_fpu_regs_stub_offset = 188;
+    Thread_allocate_mint_without_fpu_regs_stub_offset = 192;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_entry_point_offset = 284;
+    Thread_allocate_object_entry_point_offset = 288;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_stub_offset = 192;
+    Thread_allocate_object_stub_offset = 196;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_parameterized_entry_point_offset = 288;
+    Thread_allocate_object_parameterized_entry_point_offset = 292;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_parameterized_stub_offset = 196;
+    Thread_allocate_object_parameterized_stub_offset = 200;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_slow_entry_point_offset = 292;
+    Thread_allocate_object_slow_entry_point_offset = 296;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_slow_stub_offset = 200;
-static constexpr dart::compiler::target::word Thread_api_top_scope_offset = 728;
+    Thread_allocate_object_slow_stub_offset = 204;
+static constexpr dart::compiler::target::word Thread_api_top_scope_offset = 700;
 static constexpr dart::compiler::target::word Thread_async_stack_trace_offset =
     96;
 static constexpr dart::compiler::target::word
-    Thread_auto_scope_native_wrapper_entry_point_offset = 336;
+    Thread_auto_scope_native_wrapper_entry_point_offset = 340;
 static constexpr dart::compiler::target::word Thread_bool_false_offset = 120;
 static constexpr dart::compiler::target::word Thread_bool_true_offset = 116;
 static constexpr dart::compiler::target::word
-    Thread_bootstrap_native_wrapper_entry_point_offset = 328;
+    Thread_bootstrap_native_wrapper_entry_point_offset = 332;
 static constexpr dart::compiler::target::word
-    Thread_call_to_runtime_entry_point_offset = 272;
+    Thread_call_to_runtime_entry_point_offset = 276;
 static constexpr dart::compiler::target::word
-    Thread_call_to_runtime_stub_offset = 148;
-static constexpr dart::compiler::target::word Thread_dart_stream_offset = 736;
+    Thread_call_to_runtime_stub_offset = 144;
+static constexpr dart::compiler::target::word Thread_dart_stream_offset = 708;
 static constexpr dart::compiler::target::word
     Thread_dispatch_table_array_offset = 48;
 static constexpr dart::compiler::target::word Thread_optimize_entry_offset =
-    312;
-static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 228;
-static constexpr dart::compiler::target::word Thread_deoptimize_entry_offset =
     316;
+static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 232;
+static constexpr dart::compiler::target::word Thread_deoptimize_entry_offset =
+    320;
 static constexpr dart::compiler::target::word Thread_deoptimize_stub_offset =
-    232;
+    236;
 static constexpr dart::compiler::target::word Thread_double_abs_address_offset =
     356;
 static constexpr dart::compiler::target::word
     Thread_double_negate_address_offset = 352;
 static constexpr dart::compiler::target::word Thread_end_offset = 56;
 static constexpr dart::compiler::target::word
-    Thread_enter_safepoint_stub_offset = 252;
+    Thread_enter_safepoint_stub_offset = 256;
 static constexpr dart::compiler::target::word Thread_execution_state_offset =
-    712;
+    684;
 static constexpr dart::compiler::target::word
-    Thread_exit_safepoint_stub_offset = 256;
+    Thread_exit_safepoint_stub_offset = 260;
 static constexpr dart::compiler::target::word
-    Thread_call_native_through_safepoint_stub_offset = 260;
+    Thread_call_native_through_safepoint_stub_offset = 264;
 static constexpr dart::compiler::target::word
-    Thread_call_native_through_safepoint_entry_point_offset = 320;
+    Thread_call_native_through_safepoint_entry_point_offset = 324;
 static constexpr dart::compiler::target::word
     Thread_fix_allocation_stub_code_offset = 136;
 static constexpr dart::compiler::target::word
@@ -1305,75 +1331,75 @@
 static constexpr dart::compiler::target::word
     Thread_float_zerow_address_offset = 372;
 static constexpr dart::compiler::target::word Thread_global_object_pool_offset =
-    700;
-static constexpr dart::compiler::target::word
-    Thread_interpret_call_entry_point_offset = 340;
-static constexpr dart::compiler::target::word
-    Thread_invoke_dart_code_from_bytecode_stub_offset = 144;
+    672;
 static constexpr dart::compiler::target::word
     Thread_invoke_dart_code_stub_offset = 140;
 static constexpr dart::compiler::target::word Thread_exit_through_ffi_offset =
-    724;
+    696;
 static constexpr dart::compiler::target::word Thread_isolate_offset = 44;
 static constexpr dart::compiler::target::word Thread_field_table_values_offset =
     68;
 static constexpr dart::compiler::target::word
-    Thread_lazy_deopt_from_return_stub_offset = 236;
+    Thread_lazy_deopt_from_return_stub_offset = 240;
 static constexpr dart::compiler::target::word
-    Thread_lazy_deopt_from_throw_stub_offset = 240;
+    Thread_lazy_deopt_from_throw_stub_offset = 244;
 static constexpr dart::compiler::target::word
-    Thread_lazy_specialize_type_test_stub_offset = 248;
+    Thread_lazy_specialize_type_test_stub_offset = 252;
 static constexpr dart::compiler::target::word
     Thread_marking_stack_block_offset = 84;
 static constexpr dart::compiler::target::word
-    Thread_megamorphic_call_checked_entry_offset = 304;
+    Thread_megamorphic_call_checked_entry_offset = 308;
 static constexpr dart::compiler::target::word
-    Thread_switchable_call_miss_entry_offset = 308;
+    Thread_switchable_call_miss_entry_offset = 312;
 static constexpr dart::compiler::target::word
-    Thread_switchable_call_miss_stub_offset = 212;
+    Thread_switchable_call_miss_stub_offset = 216;
 static constexpr dart::compiler::target::word
-    Thread_no_scope_native_wrapper_entry_point_offset = 332;
+    Thread_no_scope_native_wrapper_entry_point_offset = 336;
 static constexpr dart::compiler::target::word
-    Thread_null_error_shared_with_fpu_regs_stub_offset = 156;
+    Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 152;
 static constexpr dart::compiler::target::word
-    Thread_null_error_shared_without_fpu_regs_stub_offset = 152;
+    Thread_late_initialization_error_shared_without_fpu_regs_stub_offset = 148;
 static constexpr dart::compiler::target::word
-    Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 164;
+    Thread_null_error_shared_with_fpu_regs_stub_offset = 160;
 static constexpr dart::compiler::target::word
-    Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 160;
+    Thread_null_error_shared_without_fpu_regs_stub_offset = 156;
 static constexpr dart::compiler::target::word
-    Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 172;
+    Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 168;
 static constexpr dart::compiler::target::word
-    Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 168;
+    Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 164;
 static constexpr dart::compiler::target::word
-    Thread_range_error_shared_with_fpu_regs_stub_offset = 180;
+    Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 176;
 static constexpr dart::compiler::target::word
-    Thread_range_error_shared_without_fpu_regs_stub_offset = 176;
+    Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 172;
+static constexpr dart::compiler::target::word
+    Thread_range_error_shared_with_fpu_regs_stub_offset = 184;
+static constexpr dart::compiler::target::word
+    Thread_range_error_shared_without_fpu_regs_stub_offset = 180;
 static constexpr dart::compiler::target::word Thread_object_null_offset = 112;
 static constexpr dart::compiler::target::word
     Thread_predefined_symbols_address_offset = 344;
-static constexpr dart::compiler::target::word Thread_resume_pc_offset = 704;
+static constexpr dart::compiler::target::word Thread_resume_pc_offset = 676;
 static constexpr dart::compiler::target::word
-    Thread_saved_shadow_call_stack_offset = 708;
+    Thread_saved_shadow_call_stack_offset = 680;
 static constexpr dart::compiler::target::word Thread_safepoint_state_offset =
-    716;
+    688;
 static constexpr dart::compiler::target::word
-    Thread_slow_type_test_stub_offset = 244;
+    Thread_slow_type_test_stub_offset = 248;
 static constexpr dart::compiler::target::word
-    Thread_slow_type_test_entry_point_offset = 324;
+    Thread_slow_type_test_entry_point_offset = 328;
 static constexpr dart::compiler::target::word Thread_stack_limit_offset = 36;
 static constexpr dart::compiler::target::word Thread_saved_stack_limit_offset =
     60;
 static constexpr dart::compiler::target::word
     Thread_stack_overflow_flags_offset = 64;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 300;
+    Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 304;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 208;
+    Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 212;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 296;
+    Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 300;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 204;
+    Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 208;
 static constexpr dart::compiler::target::word Thread_store_buffer_block_offset =
     80;
 static constexpr dart::compiler::target::word
@@ -1386,10 +1412,10 @@
 static constexpr dart::compiler::target::word Thread_write_barrier_code_offset =
     124;
 static constexpr dart::compiler::target::word
-    Thread_write_barrier_entry_point_offset = 264;
+    Thread_write_barrier_entry_point_offset = 268;
 static constexpr dart::compiler::target::word Thread_write_barrier_mask_offset =
     40;
-static constexpr dart::compiler::target::word Thread_callback_code_offset = 720;
+static constexpr dart::compiler::target::word Thread_callback_code_offset = 692;
 static constexpr dart::compiler::target::word TimelineStream_enabled_offset = 8;
 static constexpr dart::compiler::target::word TwoByteString_data_offset = 12;
 static constexpr dart::compiler::target::word Type_arguments_offset = 16;
@@ -1399,13 +1425,17 @@
 static constexpr dart::compiler::target::word Type_type_state_offset = 32;
 static constexpr dart::compiler::target::word Type_nullability_offset = 33;
 static constexpr dart::compiler::target::word
-    TypeParameter_parameterized_class_id_offset = 28;
-static constexpr dart::compiler::target::word TypeParameter_index_offset = 36;
+    TypeParameter_parameterized_class_id_offset = 32;
+static constexpr dart::compiler::target::word TypeParameter_index_offset = 40;
 static constexpr dart::compiler::target::word
     TypeArguments_instantiations_offset = 4;
 static constexpr dart::compiler::target::word TypeArguments_length_offset = 8;
 static constexpr dart::compiler::target::word TypeArguments_nullability_offset =
     16;
+static constexpr dart::compiler::target::word TypeArguments_types_offset = 20;
+static constexpr dart::compiler::target::word TypeParameter_bound_offset = 20;
+static constexpr dart::compiler::target::word TypeParameter_flags_offset = 42;
+static constexpr dart::compiler::target::word TypeParameter_name_offset = 12;
 static constexpr dart::compiler::target::word TypeRef_type_offset = 12;
 static constexpr dart::compiler::target::word TypedDataBase_length_offset = 8;
 static constexpr dart::compiler::target::word TypedDataView_data_offset = 12;
@@ -1437,11 +1467,10 @@
 static constexpr dart::compiler::target::word Array_InstanceSize = 12;
 static constexpr dart::compiler::target::word Array_header_size = 12;
 static constexpr dart::compiler::target::word Bool_InstanceSize = 8;
-static constexpr dart::compiler::target::word Bytecode_InstanceSize = 48;
 static constexpr dart::compiler::target::word Capability_InstanceSize = 16;
 static constexpr dart::compiler::target::word Class_InstanceSize = 128;
 static constexpr dart::compiler::target::word Closure_InstanceSize = 28;
-static constexpr dart::compiler::target::word ClosureData_InstanceSize = 20;
+static constexpr dart::compiler::target::word ClosureData_InstanceSize = 28;
 static constexpr dart::compiler::target::word Code_InstanceSize = 96;
 static constexpr dart::compiler::target::word CodeSourceMap_HeaderSize = 8;
 static constexpr dart::compiler::target::word CompressedStackMaps_HeaderSize =
@@ -1477,7 +1506,7 @@
 static constexpr dart::compiler::target::word Int32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word Integer_InstanceSize = 4;
 static constexpr dart::compiler::target::word KernelProgramInfo_InstanceSize =
-    64;
+    60;
 static constexpr dart::compiler::target::word LanguageError_InstanceSize = 28;
 static constexpr dart::compiler::target::word Library_InstanceSize = 84;
 static constexpr dart::compiler::target::word LibraryPrefix_InstanceSize = 20;
@@ -1496,12 +1525,10 @@
 static constexpr dart::compiler::target::word Object_InstanceSize = 4;
 static constexpr dart::compiler::target::word ObjectPool_InstanceSize = 8;
 static constexpr dart::compiler::target::word OneByteString_InstanceSize = 12;
-static constexpr dart::compiler::target::word ParameterTypeCheck_InstanceSize =
-    24;
 static constexpr dart::compiler::target::word PatchClass_InstanceSize = 24;
 static constexpr dart::compiler::target::word PcDescriptors_HeaderSize = 8;
 static constexpr dart::compiler::target::word Pointer_InstanceSize = 12;
-static constexpr dart::compiler::target::word ReceivePort_InstanceSize = 12;
+static constexpr dart::compiler::target::word ReceivePort_InstanceSize = 20;
 static constexpr dart::compiler::target::word RedirectionData_InstanceSize = 16;
 static constexpr dart::compiler::target::word RegExp_InstanceSize = 60;
 static constexpr dart::compiler::target::word Script_InstanceSize = 56;
@@ -1519,7 +1546,7 @@
 static constexpr dart::compiler::target::word TwoByteString_InstanceSize = 12;
 static constexpr dart::compiler::target::word Type_InstanceSize = 36;
 static constexpr dart::compiler::target::word TypeArguments_InstanceSize = 20;
-static constexpr dart::compiler::target::word TypeParameter_InstanceSize = 40;
+static constexpr dart::compiler::target::word TypeParameter_InstanceSize = 44;
 static constexpr dart::compiler::target::word TypeRef_InstanceSize = 16;
 static constexpr dart::compiler::target::word TypedData_InstanceSize = 12;
 static constexpr dart::compiler::target::word TypedDataBase_InstanceSize = 12;
@@ -1578,6 +1605,8 @@
 static constexpr dart::compiler::target::word
     SubtypeTestCache_kTestEntryLength = 7;
 static constexpr dart::compiler::target::word SubtypeTestCache_kTestResult = 0;
+static constexpr dart::compiler::target::word TypeArguments_kMaxElements =
+    576460752303423487;
 static constexpr dart::compiler::target::word
     AbstractType_type_test_stub_entry_point_offset = 8;
 static constexpr dart::compiler::target::word ArgumentsDescriptor_count_offset =
@@ -1618,6 +1647,10 @@
 static constexpr dart::compiler::target::word Closure_hash_offset = 48;
 static constexpr dart::compiler::target::word
     Closure_instantiator_type_arguments_offset = 8;
+static constexpr dart::compiler::target::word
+    ClosureData_default_type_arguments_offset = 40;
+static constexpr dart::compiler::target::word
+    ClosureData_default_type_arguments_info_offset = 48;
 static constexpr dart::compiler::target::word Code_object_pool_offset = 40;
 static constexpr dart::compiler::target::word Code_saved_instructions_offset =
     48;
@@ -1643,8 +1676,10 @@
 static constexpr dart::compiler::target::word Field_is_nullable_offset = 90;
 static constexpr dart::compiler::target::word Field_kind_bits_offset = 98;
 static constexpr dart::compiler::target::word Function_code_offset = 88;
+static constexpr dart::compiler::target::word Function_data_offset = 72;
 static constexpr dart::compiler::target::word Function_entry_point_offset[] = {
     8, 16};
+static constexpr dart::compiler::target::word Function_kind_tag_offset = 120;
 static constexpr dart::compiler::target::word Function_packed_fields_offset =
     124;
 static constexpr dart::compiler::target::word Function_parameter_names_offset =
@@ -1731,72 +1766,72 @@
 static constexpr dart::compiler::target::word
     Thread_AllocateArray_entry_point_offset = 736;
 static constexpr dart::compiler::target::word Thread_active_exception_offset =
-    1528;
+    1472;
 static constexpr dart::compiler::target::word Thread_active_stacktrace_offset =
-    1536;
+    1480;
 static constexpr dart::compiler::target::word
     Thread_array_write_barrier_code_offset = 240;
 static constexpr dart::compiler::target::word
-    Thread_array_write_barrier_entry_point_offset = 520;
+    Thread_array_write_barrier_entry_point_offset = 528;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_with_fpu_regs_entry_point_offset = 536;
+    Thread_allocate_mint_with_fpu_regs_entry_point_offset = 544;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_with_fpu_regs_stub_offset = 352;
+    Thread_allocate_mint_with_fpu_regs_stub_offset = 360;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_without_fpu_regs_entry_point_offset = 544;
+    Thread_allocate_mint_without_fpu_regs_entry_point_offset = 552;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_without_fpu_regs_stub_offset = 360;
+    Thread_allocate_mint_without_fpu_regs_stub_offset = 368;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_entry_point_offset = 552;
+    Thread_allocate_object_entry_point_offset = 560;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_stub_offset = 368;
+    Thread_allocate_object_stub_offset = 376;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_parameterized_entry_point_offset = 560;
+    Thread_allocate_object_parameterized_entry_point_offset = 568;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_parameterized_stub_offset = 376;
+    Thread_allocate_object_parameterized_stub_offset = 384;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_slow_entry_point_offset = 568;
+    Thread_allocate_object_slow_entry_point_offset = 576;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_slow_stub_offset = 384;
+    Thread_allocate_object_slow_stub_offset = 392;
 static constexpr dart::compiler::target::word Thread_api_top_scope_offset =
-    1600;
+    1544;
 static constexpr dart::compiler::target::word Thread_async_stack_trace_offset =
     192;
 static constexpr dart::compiler::target::word
-    Thread_auto_scope_native_wrapper_entry_point_offset = 656;
+    Thread_auto_scope_native_wrapper_entry_point_offset = 664;
 static constexpr dart::compiler::target::word Thread_bool_false_offset = 224;
 static constexpr dart::compiler::target::word Thread_bool_true_offset = 216;
 static constexpr dart::compiler::target::word
-    Thread_bootstrap_native_wrapper_entry_point_offset = 640;
+    Thread_bootstrap_native_wrapper_entry_point_offset = 648;
 static constexpr dart::compiler::target::word
-    Thread_call_to_runtime_entry_point_offset = 528;
+    Thread_call_to_runtime_entry_point_offset = 536;
 static constexpr dart::compiler::target::word
-    Thread_call_to_runtime_stub_offset = 280;
-static constexpr dart::compiler::target::word Thread_dart_stream_offset = 1616;
+    Thread_call_to_runtime_stub_offset = 272;
+static constexpr dart::compiler::target::word Thread_dart_stream_offset = 1560;
 static constexpr dart::compiler::target::word
     Thread_dispatch_table_array_offset = 96;
 static constexpr dart::compiler::target::word Thread_optimize_entry_offset =
-    608;
-static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 440;
-static constexpr dart::compiler::target::word Thread_deoptimize_entry_offset =
     616;
+static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 448;
+static constexpr dart::compiler::target::word Thread_deoptimize_entry_offset =
+    624;
 static constexpr dart::compiler::target::word Thread_deoptimize_stub_offset =
-    448;
+    456;
 static constexpr dart::compiler::target::word Thread_double_abs_address_offset =
     696;
 static constexpr dart::compiler::target::word
     Thread_double_negate_address_offset = 688;
 static constexpr dart::compiler::target::word Thread_end_offset = 112;
 static constexpr dart::compiler::target::word
-    Thread_enter_safepoint_stub_offset = 488;
+    Thread_enter_safepoint_stub_offset = 496;
 static constexpr dart::compiler::target::word Thread_execution_state_offset =
-    1568;
+    1512;
 static constexpr dart::compiler::target::word
-    Thread_exit_safepoint_stub_offset = 496;
+    Thread_exit_safepoint_stub_offset = 504;
 static constexpr dart::compiler::target::word
-    Thread_call_native_through_safepoint_stub_offset = 504;
+    Thread_call_native_through_safepoint_stub_offset = 512;
 static constexpr dart::compiler::target::word
-    Thread_call_native_through_safepoint_entry_point_offset = 624;
+    Thread_call_native_through_safepoint_entry_point_offset = 632;
 static constexpr dart::compiler::target::word
     Thread_fix_allocation_stub_code_offset = 256;
 static constexpr dart::compiler::target::word
@@ -1810,75 +1845,75 @@
 static constexpr dart::compiler::target::word
     Thread_float_zerow_address_offset = 728;
 static constexpr dart::compiler::target::word Thread_global_object_pool_offset =
-    1544;
-static constexpr dart::compiler::target::word
-    Thread_interpret_call_entry_point_offset = 664;
-static constexpr dart::compiler::target::word
-    Thread_invoke_dart_code_from_bytecode_stub_offset = 272;
+    1488;
 static constexpr dart::compiler::target::word
     Thread_invoke_dart_code_stub_offset = 264;
 static constexpr dart::compiler::target::word Thread_exit_through_ffi_offset =
-    1592;
+    1536;
 static constexpr dart::compiler::target::word Thread_isolate_offset = 88;
 static constexpr dart::compiler::target::word Thread_field_table_values_offset =
     136;
 static constexpr dart::compiler::target::word
-    Thread_lazy_deopt_from_return_stub_offset = 456;
+    Thread_lazy_deopt_from_return_stub_offset = 464;
 static constexpr dart::compiler::target::word
-    Thread_lazy_deopt_from_throw_stub_offset = 464;
+    Thread_lazy_deopt_from_throw_stub_offset = 472;
 static constexpr dart::compiler::target::word
-    Thread_lazy_specialize_type_test_stub_offset = 480;
+    Thread_lazy_specialize_type_test_stub_offset = 488;
 static constexpr dart::compiler::target::word
     Thread_marking_stack_block_offset = 168;
 static constexpr dart::compiler::target::word
-    Thread_megamorphic_call_checked_entry_offset = 592;
+    Thread_megamorphic_call_checked_entry_offset = 600;
 static constexpr dart::compiler::target::word
-    Thread_switchable_call_miss_entry_offset = 600;
+    Thread_switchable_call_miss_entry_offset = 608;
 static constexpr dart::compiler::target::word
-    Thread_switchable_call_miss_stub_offset = 408;
+    Thread_switchable_call_miss_stub_offset = 416;
 static constexpr dart::compiler::target::word
-    Thread_no_scope_native_wrapper_entry_point_offset = 648;
+    Thread_no_scope_native_wrapper_entry_point_offset = 656;
 static constexpr dart::compiler::target::word
-    Thread_null_error_shared_with_fpu_regs_stub_offset = 296;
+    Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 288;
 static constexpr dart::compiler::target::word
-    Thread_null_error_shared_without_fpu_regs_stub_offset = 288;
+    Thread_late_initialization_error_shared_without_fpu_regs_stub_offset = 280;
 static constexpr dart::compiler::target::word
-    Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 312;
+    Thread_null_error_shared_with_fpu_regs_stub_offset = 304;
 static constexpr dart::compiler::target::word
-    Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 304;
+    Thread_null_error_shared_without_fpu_regs_stub_offset = 296;
 static constexpr dart::compiler::target::word
-    Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 328;
+    Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 320;
 static constexpr dart::compiler::target::word
-    Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 320;
+    Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 312;
 static constexpr dart::compiler::target::word
-    Thread_range_error_shared_with_fpu_regs_stub_offset = 344;
+    Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 336;
 static constexpr dart::compiler::target::word
-    Thread_range_error_shared_without_fpu_regs_stub_offset = 336;
+    Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 328;
+static constexpr dart::compiler::target::word
+    Thread_range_error_shared_with_fpu_regs_stub_offset = 352;
+static constexpr dart::compiler::target::word
+    Thread_range_error_shared_without_fpu_regs_stub_offset = 344;
 static constexpr dart::compiler::target::word Thread_object_null_offset = 208;
 static constexpr dart::compiler::target::word
     Thread_predefined_symbols_address_offset = 672;
-static constexpr dart::compiler::target::word Thread_resume_pc_offset = 1552;
+static constexpr dart::compiler::target::word Thread_resume_pc_offset = 1496;
 static constexpr dart::compiler::target::word
-    Thread_saved_shadow_call_stack_offset = 1560;
+    Thread_saved_shadow_call_stack_offset = 1504;
 static constexpr dart::compiler::target::word Thread_safepoint_state_offset =
-    1576;
+    1520;
 static constexpr dart::compiler::target::word
-    Thread_slow_type_test_stub_offset = 472;
+    Thread_slow_type_test_stub_offset = 480;
 static constexpr dart::compiler::target::word
-    Thread_slow_type_test_entry_point_offset = 632;
+    Thread_slow_type_test_entry_point_offset = 640;
 static constexpr dart::compiler::target::word Thread_stack_limit_offset = 72;
 static constexpr dart::compiler::target::word Thread_saved_stack_limit_offset =
     120;
 static constexpr dart::compiler::target::word
     Thread_stack_overflow_flags_offset = 128;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 584;
+    Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 592;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 400;
+    Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 408;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 576;
+    Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 584;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 392;
+    Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 400;
 static constexpr dart::compiler::target::word Thread_store_buffer_block_offset =
     160;
 static constexpr dart::compiler::target::word
@@ -1891,11 +1926,11 @@
 static constexpr dart::compiler::target::word Thread_write_barrier_code_offset =
     232;
 static constexpr dart::compiler::target::word
-    Thread_write_barrier_entry_point_offset = 512;
+    Thread_write_barrier_entry_point_offset = 520;
 static constexpr dart::compiler::target::word Thread_write_barrier_mask_offset =
     80;
 static constexpr dart::compiler::target::word Thread_callback_code_offset =
-    1584;
+    1528;
 static constexpr dart::compiler::target::word TimelineStream_enabled_offset =
     16;
 static constexpr dart::compiler::target::word TwoByteString_data_offset = 16;
@@ -1906,13 +1941,17 @@
 static constexpr dart::compiler::target::word Type_type_state_offset = 60;
 static constexpr dart::compiler::target::word Type_nullability_offset = 61;
 static constexpr dart::compiler::target::word
-    TypeParameter_parameterized_class_id_offset = 56;
-static constexpr dart::compiler::target::word TypeParameter_index_offset = 64;
+    TypeParameter_parameterized_class_id_offset = 64;
+static constexpr dart::compiler::target::word TypeParameter_index_offset = 72;
 static constexpr dart::compiler::target::word
     TypeArguments_instantiations_offset = 8;
 static constexpr dart::compiler::target::word TypeArguments_length_offset = 16;
 static constexpr dart::compiler::target::word TypeArguments_nullability_offset =
     32;
+static constexpr dart::compiler::target::word TypeArguments_types_offset = 40;
+static constexpr dart::compiler::target::word TypeParameter_bound_offset = 40;
+static constexpr dart::compiler::target::word TypeParameter_flags_offset = 74;
+static constexpr dart::compiler::target::word TypeParameter_name_offset = 24;
 static constexpr dart::compiler::target::word TypeRef_type_offset = 24;
 static constexpr dart::compiler::target::word TypedDataBase_length_offset = 16;
 static constexpr dart::compiler::target::word TypedDataView_data_offset = 24;
@@ -1942,18 +1981,17 @@
     8, 24, 16, 32};
 static constexpr dart::compiler::target::word
     Thread_write_barrier_wrappers_thread_offset[] = {
-        1368, 1376, 1384, 1392, 1400, 1408, 1416, 1424, 1432, 1440, 1448,
-        1456, 1464, 1472, 1480, -1,   -1,   -1,   -1,   1488, 1496, -1,
-        -1,   1504, 1512, 1520, -1,   -1,   -1,   -1,   -1,   -1};
+        1312, 1320, 1328, 1336, 1344, 1352, 1360, 1368, 1376, 1384, 1392,
+        1400, 1408, 1416, 1424, -1,   -1,   -1,   -1,   1432, 1440, -1,
+        -1,   1448, 1456, 1464, -1,   -1,   -1,   -1,   -1,   -1};
 static constexpr dart::compiler::target::word ApiError_InstanceSize = 16;
 static constexpr dart::compiler::target::word Array_InstanceSize = 24;
 static constexpr dart::compiler::target::word Array_header_size = 24;
 static constexpr dart::compiler::target::word Bool_InstanceSize = 12;
-static constexpr dart::compiler::target::word Bytecode_InstanceSize = 88;
 static constexpr dart::compiler::target::word Capability_InstanceSize = 16;
 static constexpr dart::compiler::target::word Class_InstanceSize = 208;
 static constexpr dart::compiler::target::word Closure_InstanceSize = 56;
-static constexpr dart::compiler::target::word ClosureData_InstanceSize = 40;
+static constexpr dart::compiler::target::word ClosureData_InstanceSize = 56;
 static constexpr dart::compiler::target::word Code_InstanceSize = 176;
 static constexpr dart::compiler::target::word CodeSourceMap_HeaderSize = 16;
 static constexpr dart::compiler::target::word CompressedStackMaps_HeaderSize =
@@ -1976,7 +2014,7 @@
 static constexpr dart::compiler::target::word Field_InstanceSize = 104;
 static constexpr dart::compiler::target::word Float32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word Float64x2_InstanceSize = 24;
-static constexpr dart::compiler::target::word Function_InstanceSize = 152;
+static constexpr dart::compiler::target::word Function_InstanceSize = 144;
 static constexpr dart::compiler::target::word FutureOr_InstanceSize = 16;
 static constexpr dart::compiler::target::word GrowableObjectArray_InstanceSize =
     32;
@@ -1989,7 +2027,7 @@
 static constexpr dart::compiler::target::word Int32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word Integer_InstanceSize = 8;
 static constexpr dart::compiler::target::word KernelProgramInfo_InstanceSize =
-    128;
+    120;
 static constexpr dart::compiler::target::word LanguageError_InstanceSize = 48;
 static constexpr dart::compiler::target::word Library_InstanceSize = 160;
 static constexpr dart::compiler::target::word LibraryPrefix_InstanceSize = 40;
@@ -2008,12 +2046,10 @@
 static constexpr dart::compiler::target::word Object_InstanceSize = 8;
 static constexpr dart::compiler::target::word ObjectPool_InstanceSize = 16;
 static constexpr dart::compiler::target::word OneByteString_InstanceSize = 16;
-static constexpr dart::compiler::target::word ParameterTypeCheck_InstanceSize =
-    48;
 static constexpr dart::compiler::target::word PatchClass_InstanceSize = 48;
 static constexpr dart::compiler::target::word PcDescriptors_HeaderSize = 16;
 static constexpr dart::compiler::target::word Pointer_InstanceSize = 24;
-static constexpr dart::compiler::target::word ReceivePort_InstanceSize = 24;
+static constexpr dart::compiler::target::word ReceivePort_InstanceSize = 40;
 static constexpr dart::compiler::target::word RedirectionData_InstanceSize = 32;
 static constexpr dart::compiler::target::word RegExp_InstanceSize = 120;
 static constexpr dart::compiler::target::word Script_InstanceSize = 96;
@@ -2032,7 +2068,7 @@
 static constexpr dart::compiler::target::word TwoByteString_InstanceSize = 16;
 static constexpr dart::compiler::target::word Type_InstanceSize = 64;
 static constexpr dart::compiler::target::word TypeArguments_InstanceSize = 40;
-static constexpr dart::compiler::target::word TypeParameter_InstanceSize = 72;
+static constexpr dart::compiler::target::word TypeParameter_InstanceSize = 80;
 static constexpr dart::compiler::target::word TypeRef_InstanceSize = 32;
 static constexpr dart::compiler::target::word TypedData_InstanceSize = 24;
 static constexpr dart::compiler::target::word TypedDataBase_InstanceSize = 24;
@@ -2051,7 +2087,7 @@
 
 #if defined(TARGET_ARCH_ARM)
 static constexpr dart::compiler::target::word Function_usage_counter_offset =
-    76;
+    84;
 static constexpr dart::compiler::target::word
     ICData_receivers_static_type_offset = 16;
 static constexpr dart::compiler::target::word ObjectPool_elements_start_offset =
@@ -2091,6 +2127,8 @@
 static constexpr dart::compiler::target::word
     SubtypeTestCache_kTestEntryLength = 7;
 static constexpr dart::compiler::target::word SubtypeTestCache_kTestResult = 0;
+static constexpr dart::compiler::target::word TypeArguments_kMaxElements =
+    268435455;
 static constexpr dart::compiler::target::word
     AbstractType_type_test_stub_entry_point_offset = 4;
 static constexpr dart::compiler::target::word ArgumentsDescriptor_count_offset =
@@ -2129,6 +2167,10 @@
 static constexpr dart::compiler::target::word Closure_hash_offset = 24;
 static constexpr dart::compiler::target::word
     Closure_instantiator_type_arguments_offset = 4;
+static constexpr dart::compiler::target::word
+    ClosureData_default_type_arguments_offset = 20;
+static constexpr dart::compiler::target::word
+    ClosureData_default_type_arguments_info_offset = 24;
 static constexpr dart::compiler::target::word Code_object_pool_offset = 20;
 static constexpr dart::compiler::target::word Code_saved_instructions_offset =
     24;
@@ -2154,10 +2196,12 @@
 static constexpr dart::compiler::target::word Field_is_nullable_offset = 50;
 static constexpr dart::compiler::target::word Field_kind_bits_offset = 58;
 static constexpr dart::compiler::target::word Function_code_offset = 44;
+static constexpr dart::compiler::target::word Function_data_offset = 36;
 static constexpr dart::compiler::target::word Function_entry_point_offset[] = {
     4, 8};
+static constexpr dart::compiler::target::word Function_kind_tag_offset = 72;
 static constexpr dart::compiler::target::word Function_packed_fields_offset =
-    68;
+    76;
 static constexpr dart::compiler::target::word Function_parameter_names_offset =
     28;
 static constexpr dart::compiler::target::word Function_parameter_types_offset =
@@ -2240,71 +2284,71 @@
 static constexpr dart::compiler::target::word
     Thread_AllocateArray_entry_point_offset = 376;
 static constexpr dart::compiler::target::word Thread_active_exception_offset =
-    724;
+    696;
 static constexpr dart::compiler::target::word Thread_active_stacktrace_offset =
-    728;
+    700;
 static constexpr dart::compiler::target::word
     Thread_array_write_barrier_code_offset = 128;
 static constexpr dart::compiler::target::word
-    Thread_array_write_barrier_entry_point_offset = 268;
+    Thread_array_write_barrier_entry_point_offset = 272;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_with_fpu_regs_entry_point_offset = 276;
+    Thread_allocate_mint_with_fpu_regs_entry_point_offset = 280;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_with_fpu_regs_stub_offset = 184;
+    Thread_allocate_mint_with_fpu_regs_stub_offset = 188;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_without_fpu_regs_entry_point_offset = 280;
+    Thread_allocate_mint_without_fpu_regs_entry_point_offset = 284;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_without_fpu_regs_stub_offset = 188;
+    Thread_allocate_mint_without_fpu_regs_stub_offset = 192;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_entry_point_offset = 284;
+    Thread_allocate_object_entry_point_offset = 288;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_stub_offset = 192;
+    Thread_allocate_object_stub_offset = 196;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_parameterized_entry_point_offset = 288;
+    Thread_allocate_object_parameterized_entry_point_offset = 292;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_parameterized_stub_offset = 196;
+    Thread_allocate_object_parameterized_stub_offset = 200;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_slow_entry_point_offset = 292;
+    Thread_allocate_object_slow_entry_point_offset = 296;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_slow_stub_offset = 200;
-static constexpr dart::compiler::target::word Thread_api_top_scope_offset = 760;
+    Thread_allocate_object_slow_stub_offset = 204;
+static constexpr dart::compiler::target::word Thread_api_top_scope_offset = 732;
 static constexpr dart::compiler::target::word Thread_async_stack_trace_offset =
     96;
 static constexpr dart::compiler::target::word
-    Thread_auto_scope_native_wrapper_entry_point_offset = 336;
+    Thread_auto_scope_native_wrapper_entry_point_offset = 340;
 static constexpr dart::compiler::target::word Thread_bool_false_offset = 120;
 static constexpr dart::compiler::target::word Thread_bool_true_offset = 116;
 static constexpr dart::compiler::target::word
-    Thread_bootstrap_native_wrapper_entry_point_offset = 328;
+    Thread_bootstrap_native_wrapper_entry_point_offset = 332;
 static constexpr dart::compiler::target::word
-    Thread_call_to_runtime_entry_point_offset = 272;
+    Thread_call_to_runtime_entry_point_offset = 276;
 static constexpr dart::compiler::target::word
-    Thread_call_to_runtime_stub_offset = 148;
-static constexpr dart::compiler::target::word Thread_dart_stream_offset = 768;
+    Thread_call_to_runtime_stub_offset = 144;
+static constexpr dart::compiler::target::word Thread_dart_stream_offset = 740;
 static constexpr dart::compiler::target::word
     Thread_dispatch_table_array_offset = 48;
 static constexpr dart::compiler::target::word Thread_optimize_entry_offset =
-    312;
-static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 228;
-static constexpr dart::compiler::target::word Thread_deoptimize_entry_offset =
     316;
+static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 232;
+static constexpr dart::compiler::target::word Thread_deoptimize_entry_offset =
+    320;
 static constexpr dart::compiler::target::word Thread_deoptimize_stub_offset =
-    232;
+    236;
 static constexpr dart::compiler::target::word Thread_double_abs_address_offset =
     356;
 static constexpr dart::compiler::target::word
     Thread_double_negate_address_offset = 352;
 static constexpr dart::compiler::target::word Thread_end_offset = 56;
 static constexpr dart::compiler::target::word
-    Thread_enter_safepoint_stub_offset = 252;
+    Thread_enter_safepoint_stub_offset = 256;
 static constexpr dart::compiler::target::word Thread_execution_state_offset =
-    744;
+    716;
 static constexpr dart::compiler::target::word
-    Thread_exit_safepoint_stub_offset = 256;
+    Thread_exit_safepoint_stub_offset = 260;
 static constexpr dart::compiler::target::word
-    Thread_call_native_through_safepoint_stub_offset = 260;
+    Thread_call_native_through_safepoint_stub_offset = 264;
 static constexpr dart::compiler::target::word
-    Thread_call_native_through_safepoint_entry_point_offset = 320;
+    Thread_call_native_through_safepoint_entry_point_offset = 324;
 static constexpr dart::compiler::target::word
     Thread_fix_allocation_stub_code_offset = 136;
 static constexpr dart::compiler::target::word
@@ -2318,75 +2362,75 @@
 static constexpr dart::compiler::target::word
     Thread_float_zerow_address_offset = 372;
 static constexpr dart::compiler::target::word Thread_global_object_pool_offset =
-    732;
-static constexpr dart::compiler::target::word
-    Thread_interpret_call_entry_point_offset = 340;
-static constexpr dart::compiler::target::word
-    Thread_invoke_dart_code_from_bytecode_stub_offset = 144;
+    704;
 static constexpr dart::compiler::target::word
     Thread_invoke_dart_code_stub_offset = 140;
 static constexpr dart::compiler::target::word Thread_exit_through_ffi_offset =
-    756;
+    728;
 static constexpr dart::compiler::target::word Thread_isolate_offset = 44;
 static constexpr dart::compiler::target::word Thread_field_table_values_offset =
     68;
 static constexpr dart::compiler::target::word
-    Thread_lazy_deopt_from_return_stub_offset = 236;
+    Thread_lazy_deopt_from_return_stub_offset = 240;
 static constexpr dart::compiler::target::word
-    Thread_lazy_deopt_from_throw_stub_offset = 240;
+    Thread_lazy_deopt_from_throw_stub_offset = 244;
 static constexpr dart::compiler::target::word
-    Thread_lazy_specialize_type_test_stub_offset = 248;
+    Thread_lazy_specialize_type_test_stub_offset = 252;
 static constexpr dart::compiler::target::word
     Thread_marking_stack_block_offset = 84;
 static constexpr dart::compiler::target::word
-    Thread_megamorphic_call_checked_entry_offset = 304;
+    Thread_megamorphic_call_checked_entry_offset = 308;
 static constexpr dart::compiler::target::word
-    Thread_switchable_call_miss_entry_offset = 308;
+    Thread_switchable_call_miss_entry_offset = 312;
 static constexpr dart::compiler::target::word
-    Thread_switchable_call_miss_stub_offset = 212;
+    Thread_switchable_call_miss_stub_offset = 216;
 static constexpr dart::compiler::target::word
-    Thread_no_scope_native_wrapper_entry_point_offset = 332;
+    Thread_no_scope_native_wrapper_entry_point_offset = 336;
 static constexpr dart::compiler::target::word
-    Thread_null_error_shared_with_fpu_regs_stub_offset = 156;
+    Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 152;
 static constexpr dart::compiler::target::word
-    Thread_null_error_shared_without_fpu_regs_stub_offset = 152;
+    Thread_late_initialization_error_shared_without_fpu_regs_stub_offset = 148;
 static constexpr dart::compiler::target::word
-    Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 164;
+    Thread_null_error_shared_with_fpu_regs_stub_offset = 160;
 static constexpr dart::compiler::target::word
-    Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 160;
+    Thread_null_error_shared_without_fpu_regs_stub_offset = 156;
 static constexpr dart::compiler::target::word
-    Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 172;
+    Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 168;
 static constexpr dart::compiler::target::word
-    Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 168;
+    Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 164;
 static constexpr dart::compiler::target::word
-    Thread_range_error_shared_with_fpu_regs_stub_offset = 180;
+    Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 176;
 static constexpr dart::compiler::target::word
-    Thread_range_error_shared_without_fpu_regs_stub_offset = 176;
+    Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 172;
+static constexpr dart::compiler::target::word
+    Thread_range_error_shared_with_fpu_regs_stub_offset = 184;
+static constexpr dart::compiler::target::word
+    Thread_range_error_shared_without_fpu_regs_stub_offset = 180;
 static constexpr dart::compiler::target::word Thread_object_null_offset = 112;
 static constexpr dart::compiler::target::word
     Thread_predefined_symbols_address_offset = 344;
-static constexpr dart::compiler::target::word Thread_resume_pc_offset = 736;
+static constexpr dart::compiler::target::word Thread_resume_pc_offset = 708;
 static constexpr dart::compiler::target::word
-    Thread_saved_shadow_call_stack_offset = 740;
+    Thread_saved_shadow_call_stack_offset = 712;
 static constexpr dart::compiler::target::word Thread_safepoint_state_offset =
-    748;
+    720;
 static constexpr dart::compiler::target::word
-    Thread_slow_type_test_stub_offset = 244;
+    Thread_slow_type_test_stub_offset = 248;
 static constexpr dart::compiler::target::word
-    Thread_slow_type_test_entry_point_offset = 324;
+    Thread_slow_type_test_entry_point_offset = 328;
 static constexpr dart::compiler::target::word Thread_stack_limit_offset = 36;
 static constexpr dart::compiler::target::word Thread_saved_stack_limit_offset =
     60;
 static constexpr dart::compiler::target::word
     Thread_stack_overflow_flags_offset = 64;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 300;
+    Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 304;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 208;
+    Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 212;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 296;
+    Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 300;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 204;
+    Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 208;
 static constexpr dart::compiler::target::word Thread_store_buffer_block_offset =
     80;
 static constexpr dart::compiler::target::word
@@ -2399,10 +2443,10 @@
 static constexpr dart::compiler::target::word Thread_write_barrier_code_offset =
     124;
 static constexpr dart::compiler::target::word
-    Thread_write_barrier_entry_point_offset = 264;
+    Thread_write_barrier_entry_point_offset = 268;
 static constexpr dart::compiler::target::word Thread_write_barrier_mask_offset =
     40;
-static constexpr dart::compiler::target::word Thread_callback_code_offset = 752;
+static constexpr dart::compiler::target::word Thread_callback_code_offset = 724;
 static constexpr dart::compiler::target::word TimelineStream_enabled_offset = 8;
 static constexpr dart::compiler::target::word TwoByteString_data_offset = 12;
 static constexpr dart::compiler::target::word Type_arguments_offset = 16;
@@ -2412,13 +2456,17 @@
 static constexpr dart::compiler::target::word Type_type_state_offset = 32;
 static constexpr dart::compiler::target::word Type_nullability_offset = 33;
 static constexpr dart::compiler::target::word
-    TypeParameter_parameterized_class_id_offset = 28;
-static constexpr dart::compiler::target::word TypeParameter_index_offset = 36;
+    TypeParameter_parameterized_class_id_offset = 32;
+static constexpr dart::compiler::target::word TypeParameter_index_offset = 40;
 static constexpr dart::compiler::target::word
     TypeArguments_instantiations_offset = 4;
 static constexpr dart::compiler::target::word TypeArguments_length_offset = 8;
 static constexpr dart::compiler::target::word TypeArguments_nullability_offset =
     16;
+static constexpr dart::compiler::target::word TypeArguments_types_offset = 20;
+static constexpr dart::compiler::target::word TypeParameter_bound_offset = 20;
+static constexpr dart::compiler::target::word TypeParameter_flags_offset = 42;
+static constexpr dart::compiler::target::word TypeParameter_name_offset = 12;
 static constexpr dart::compiler::target::word TypeRef_type_offset = 12;
 static constexpr dart::compiler::target::word TypedDataBase_length_offset = 8;
 static constexpr dart::compiler::target::word TypedDataView_data_offset = 12;
@@ -2445,16 +2493,15 @@
     4, 12, 8, 16};
 static constexpr dart::compiler::target::word
     Thread_write_barrier_wrappers_thread_offset[] = {
-        692, 696, 700, 704, 708, -1, 712, -1, 716, 720, -1, -1, -1, -1, -1, -1};
+        664, 668, 672, 676, 680, -1, 684, -1, 688, 692, -1, -1, -1, -1, -1, -1};
 static constexpr dart::compiler::target::word ApiError_InstanceSize = 8;
 static constexpr dart::compiler::target::word Array_InstanceSize = 12;
 static constexpr dart::compiler::target::word Array_header_size = 12;
 static constexpr dart::compiler::target::word Bool_InstanceSize = 8;
-static constexpr dart::compiler::target::word Bytecode_InstanceSize = 44;
 static constexpr dart::compiler::target::word Capability_InstanceSize = 16;
 static constexpr dart::compiler::target::word Class_InstanceSize = 128;
 static constexpr dart::compiler::target::word Closure_InstanceSize = 28;
-static constexpr dart::compiler::target::word ClosureData_InstanceSize = 20;
+static constexpr dart::compiler::target::word ClosureData_InstanceSize = 28;
 static constexpr dart::compiler::target::word Code_InstanceSize = 76;
 static constexpr dart::compiler::target::word CodeSourceMap_HeaderSize = 8;
 static constexpr dart::compiler::target::word CompressedStackMaps_HeaderSize =
@@ -2490,7 +2537,7 @@
 static constexpr dart::compiler::target::word Int32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word Integer_InstanceSize = 4;
 static constexpr dart::compiler::target::word KernelProgramInfo_InstanceSize =
-    64;
+    60;
 static constexpr dart::compiler::target::word LanguageError_InstanceSize = 28;
 static constexpr dart::compiler::target::word Library_InstanceSize = 84;
 static constexpr dart::compiler::target::word LibraryPrefix_InstanceSize = 20;
@@ -2509,8 +2556,6 @@
 static constexpr dart::compiler::target::word Object_InstanceSize = 4;
 static constexpr dart::compiler::target::word ObjectPool_InstanceSize = 8;
 static constexpr dart::compiler::target::word OneByteString_InstanceSize = 12;
-static constexpr dart::compiler::target::word ParameterTypeCheck_InstanceSize =
-    24;
 static constexpr dart::compiler::target::word PatchClass_InstanceSize = 24;
 static constexpr dart::compiler::target::word PcDescriptors_HeaderSize = 8;
 static constexpr dart::compiler::target::word Pointer_InstanceSize = 12;
@@ -2532,7 +2577,7 @@
 static constexpr dart::compiler::target::word TwoByteString_InstanceSize = 12;
 static constexpr dart::compiler::target::word Type_InstanceSize = 36;
 static constexpr dart::compiler::target::word TypeArguments_InstanceSize = 20;
-static constexpr dart::compiler::target::word TypeParameter_InstanceSize = 40;
+static constexpr dart::compiler::target::word TypeParameter_InstanceSize = 44;
 static constexpr dart::compiler::target::word TypeRef_InstanceSize = 16;
 static constexpr dart::compiler::target::word TypedData_InstanceSize = 12;
 static constexpr dart::compiler::target::word TypedDataBase_InstanceSize = 12;
@@ -2591,6 +2636,8 @@
 static constexpr dart::compiler::target::word
     SubtypeTestCache_kTestEntryLength = 7;
 static constexpr dart::compiler::target::word SubtypeTestCache_kTestResult = 0;
+static constexpr dart::compiler::target::word TypeArguments_kMaxElements =
+    576460752303423487;
 static constexpr dart::compiler::target::word
     AbstractType_type_test_stub_entry_point_offset = 8;
 static constexpr dart::compiler::target::word ArgumentsDescriptor_count_offset =
@@ -2629,6 +2676,10 @@
 static constexpr dart::compiler::target::word Closure_hash_offset = 48;
 static constexpr dart::compiler::target::word
     Closure_instantiator_type_arguments_offset = 8;
+static constexpr dart::compiler::target::word
+    ClosureData_default_type_arguments_offset = 40;
+static constexpr dart::compiler::target::word
+    ClosureData_default_type_arguments_info_offset = 48;
 static constexpr dart::compiler::target::word Code_object_pool_offset = 40;
 static constexpr dart::compiler::target::word Code_saved_instructions_offset =
     48;
@@ -2654,8 +2705,10 @@
 static constexpr dart::compiler::target::word Field_is_nullable_offset = 90;
 static constexpr dart::compiler::target::word Field_kind_bits_offset = 98;
 static constexpr dart::compiler::target::word Function_code_offset = 88;
+static constexpr dart::compiler::target::word Function_data_offset = 72;
 static constexpr dart::compiler::target::word Function_entry_point_offset[] = {
     8, 16};
+static constexpr dart::compiler::target::word Function_kind_tag_offset = 120;
 static constexpr dart::compiler::target::word Function_packed_fields_offset =
     124;
 static constexpr dart::compiler::target::word Function_parameter_names_offset =
@@ -2741,72 +2794,72 @@
 static constexpr dart::compiler::target::word
     Thread_AllocateArray_entry_point_offset = 736;
 static constexpr dart::compiler::target::word Thread_active_exception_offset =
-    1456;
+    1400;
 static constexpr dart::compiler::target::word Thread_active_stacktrace_offset =
-    1464;
+    1408;
 static constexpr dart::compiler::target::word
     Thread_array_write_barrier_code_offset = 240;
 static constexpr dart::compiler::target::word
-    Thread_array_write_barrier_entry_point_offset = 520;
+    Thread_array_write_barrier_entry_point_offset = 528;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_with_fpu_regs_entry_point_offset = 536;
+    Thread_allocate_mint_with_fpu_regs_entry_point_offset = 544;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_with_fpu_regs_stub_offset = 352;
+    Thread_allocate_mint_with_fpu_regs_stub_offset = 360;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_without_fpu_regs_entry_point_offset = 544;
+    Thread_allocate_mint_without_fpu_regs_entry_point_offset = 552;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_without_fpu_regs_stub_offset = 360;
+    Thread_allocate_mint_without_fpu_regs_stub_offset = 368;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_entry_point_offset = 552;
+    Thread_allocate_object_entry_point_offset = 560;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_stub_offset = 368;
+    Thread_allocate_object_stub_offset = 376;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_parameterized_entry_point_offset = 560;
+    Thread_allocate_object_parameterized_entry_point_offset = 568;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_parameterized_stub_offset = 376;
+    Thread_allocate_object_parameterized_stub_offset = 384;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_slow_entry_point_offset = 568;
+    Thread_allocate_object_slow_entry_point_offset = 576;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_slow_stub_offset = 384;
+    Thread_allocate_object_slow_stub_offset = 392;
 static constexpr dart::compiler::target::word Thread_api_top_scope_offset =
-    1528;
+    1472;
 static constexpr dart::compiler::target::word Thread_async_stack_trace_offset =
     192;
 static constexpr dart::compiler::target::word
-    Thread_auto_scope_native_wrapper_entry_point_offset = 656;
+    Thread_auto_scope_native_wrapper_entry_point_offset = 664;
 static constexpr dart::compiler::target::word Thread_bool_false_offset = 224;
 static constexpr dart::compiler::target::word Thread_bool_true_offset = 216;
 static constexpr dart::compiler::target::word
-    Thread_bootstrap_native_wrapper_entry_point_offset = 640;
+    Thread_bootstrap_native_wrapper_entry_point_offset = 648;
 static constexpr dart::compiler::target::word
-    Thread_call_to_runtime_entry_point_offset = 528;
+    Thread_call_to_runtime_entry_point_offset = 536;
 static constexpr dart::compiler::target::word
-    Thread_call_to_runtime_stub_offset = 280;
-static constexpr dart::compiler::target::word Thread_dart_stream_offset = 1544;
+    Thread_call_to_runtime_stub_offset = 272;
+static constexpr dart::compiler::target::word Thread_dart_stream_offset = 1488;
 static constexpr dart::compiler::target::word
     Thread_dispatch_table_array_offset = 96;
 static constexpr dart::compiler::target::word Thread_optimize_entry_offset =
-    608;
-static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 440;
-static constexpr dart::compiler::target::word Thread_deoptimize_entry_offset =
     616;
+static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 448;
+static constexpr dart::compiler::target::word Thread_deoptimize_entry_offset =
+    624;
 static constexpr dart::compiler::target::word Thread_deoptimize_stub_offset =
-    448;
+    456;
 static constexpr dart::compiler::target::word Thread_double_abs_address_offset =
     696;
 static constexpr dart::compiler::target::word
     Thread_double_negate_address_offset = 688;
 static constexpr dart::compiler::target::word Thread_end_offset = 112;
 static constexpr dart::compiler::target::word
-    Thread_enter_safepoint_stub_offset = 488;
+    Thread_enter_safepoint_stub_offset = 496;
 static constexpr dart::compiler::target::word Thread_execution_state_offset =
-    1496;
+    1440;
 static constexpr dart::compiler::target::word
-    Thread_exit_safepoint_stub_offset = 496;
+    Thread_exit_safepoint_stub_offset = 504;
 static constexpr dart::compiler::target::word
-    Thread_call_native_through_safepoint_stub_offset = 504;
+    Thread_call_native_through_safepoint_stub_offset = 512;
 static constexpr dart::compiler::target::word
-    Thread_call_native_through_safepoint_entry_point_offset = 624;
+    Thread_call_native_through_safepoint_entry_point_offset = 632;
 static constexpr dart::compiler::target::word
     Thread_fix_allocation_stub_code_offset = 256;
 static constexpr dart::compiler::target::word
@@ -2820,75 +2873,75 @@
 static constexpr dart::compiler::target::word
     Thread_float_zerow_address_offset = 728;
 static constexpr dart::compiler::target::word Thread_global_object_pool_offset =
-    1472;
-static constexpr dart::compiler::target::word
-    Thread_interpret_call_entry_point_offset = 664;
-static constexpr dart::compiler::target::word
-    Thread_invoke_dart_code_from_bytecode_stub_offset = 272;
+    1416;
 static constexpr dart::compiler::target::word
     Thread_invoke_dart_code_stub_offset = 264;
 static constexpr dart::compiler::target::word Thread_exit_through_ffi_offset =
-    1520;
+    1464;
 static constexpr dart::compiler::target::word Thread_isolate_offset = 88;
 static constexpr dart::compiler::target::word Thread_field_table_values_offset =
     136;
 static constexpr dart::compiler::target::word
-    Thread_lazy_deopt_from_return_stub_offset = 456;
+    Thread_lazy_deopt_from_return_stub_offset = 464;
 static constexpr dart::compiler::target::word
-    Thread_lazy_deopt_from_throw_stub_offset = 464;
+    Thread_lazy_deopt_from_throw_stub_offset = 472;
 static constexpr dart::compiler::target::word
-    Thread_lazy_specialize_type_test_stub_offset = 480;
+    Thread_lazy_specialize_type_test_stub_offset = 488;
 static constexpr dart::compiler::target::word
     Thread_marking_stack_block_offset = 168;
 static constexpr dart::compiler::target::word
-    Thread_megamorphic_call_checked_entry_offset = 592;
+    Thread_megamorphic_call_checked_entry_offset = 600;
 static constexpr dart::compiler::target::word
-    Thread_switchable_call_miss_entry_offset = 600;
+    Thread_switchable_call_miss_entry_offset = 608;
 static constexpr dart::compiler::target::word
-    Thread_switchable_call_miss_stub_offset = 408;
+    Thread_switchable_call_miss_stub_offset = 416;
 static constexpr dart::compiler::target::word
-    Thread_no_scope_native_wrapper_entry_point_offset = 648;
+    Thread_no_scope_native_wrapper_entry_point_offset = 656;
 static constexpr dart::compiler::target::word
-    Thread_null_error_shared_with_fpu_regs_stub_offset = 296;
+    Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 288;
 static constexpr dart::compiler::target::word
-    Thread_null_error_shared_without_fpu_regs_stub_offset = 288;
+    Thread_late_initialization_error_shared_without_fpu_regs_stub_offset = 280;
 static constexpr dart::compiler::target::word
-    Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 312;
+    Thread_null_error_shared_with_fpu_regs_stub_offset = 304;
 static constexpr dart::compiler::target::word
-    Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 304;
+    Thread_null_error_shared_without_fpu_regs_stub_offset = 296;
 static constexpr dart::compiler::target::word
-    Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 328;
+    Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 320;
 static constexpr dart::compiler::target::word
-    Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 320;
+    Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 312;
 static constexpr dart::compiler::target::word
-    Thread_range_error_shared_with_fpu_regs_stub_offset = 344;
+    Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 336;
 static constexpr dart::compiler::target::word
-    Thread_range_error_shared_without_fpu_regs_stub_offset = 336;
+    Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 328;
+static constexpr dart::compiler::target::word
+    Thread_range_error_shared_with_fpu_regs_stub_offset = 352;
+static constexpr dart::compiler::target::word
+    Thread_range_error_shared_without_fpu_regs_stub_offset = 344;
 static constexpr dart::compiler::target::word Thread_object_null_offset = 208;
 static constexpr dart::compiler::target::word
     Thread_predefined_symbols_address_offset = 672;
-static constexpr dart::compiler::target::word Thread_resume_pc_offset = 1480;
+static constexpr dart::compiler::target::word Thread_resume_pc_offset = 1424;
 static constexpr dart::compiler::target::word
-    Thread_saved_shadow_call_stack_offset = 1488;
+    Thread_saved_shadow_call_stack_offset = 1432;
 static constexpr dart::compiler::target::word Thread_safepoint_state_offset =
-    1504;
+    1448;
 static constexpr dart::compiler::target::word
-    Thread_slow_type_test_stub_offset = 472;
+    Thread_slow_type_test_stub_offset = 480;
 static constexpr dart::compiler::target::word
-    Thread_slow_type_test_entry_point_offset = 632;
+    Thread_slow_type_test_entry_point_offset = 640;
 static constexpr dart::compiler::target::word Thread_stack_limit_offset = 72;
 static constexpr dart::compiler::target::word Thread_saved_stack_limit_offset =
     120;
 static constexpr dart::compiler::target::word
     Thread_stack_overflow_flags_offset = 128;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 584;
+    Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 592;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 400;
+    Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 408;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 576;
+    Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 584;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 392;
+    Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 400;
 static constexpr dart::compiler::target::word Thread_store_buffer_block_offset =
     160;
 static constexpr dart::compiler::target::word
@@ -2901,11 +2954,11 @@
 static constexpr dart::compiler::target::word Thread_write_barrier_code_offset =
     232;
 static constexpr dart::compiler::target::word
-    Thread_write_barrier_entry_point_offset = 512;
+    Thread_write_barrier_entry_point_offset = 520;
 static constexpr dart::compiler::target::word Thread_write_barrier_mask_offset =
     80;
 static constexpr dart::compiler::target::word Thread_callback_code_offset =
-    1512;
+    1456;
 static constexpr dart::compiler::target::word TimelineStream_enabled_offset =
     16;
 static constexpr dart::compiler::target::word TwoByteString_data_offset = 16;
@@ -2916,13 +2969,17 @@
 static constexpr dart::compiler::target::word Type_type_state_offset = 60;
 static constexpr dart::compiler::target::word Type_nullability_offset = 61;
 static constexpr dart::compiler::target::word
-    TypeParameter_parameterized_class_id_offset = 56;
-static constexpr dart::compiler::target::word TypeParameter_index_offset = 64;
+    TypeParameter_parameterized_class_id_offset = 64;
+static constexpr dart::compiler::target::word TypeParameter_index_offset = 72;
 static constexpr dart::compiler::target::word
     TypeArguments_instantiations_offset = 8;
 static constexpr dart::compiler::target::word TypeArguments_length_offset = 16;
 static constexpr dart::compiler::target::word TypeArguments_nullability_offset =
     32;
+static constexpr dart::compiler::target::word TypeArguments_types_offset = 40;
+static constexpr dart::compiler::target::word TypeParameter_bound_offset = 40;
+static constexpr dart::compiler::target::word TypeParameter_flags_offset = 74;
+static constexpr dart::compiler::target::word TypeParameter_name_offset = 24;
 static constexpr dart::compiler::target::word TypeRef_type_offset = 24;
 static constexpr dart::compiler::target::word TypedDataBase_length_offset = 16;
 static constexpr dart::compiler::target::word TypedDataView_data_offset = 24;
@@ -2949,17 +3006,16 @@
     8, 24, 16, 32};
 static constexpr dart::compiler::target::word
     Thread_write_barrier_wrappers_thread_offset[] = {
-        1368, 1376, 1384, 1392, -1,   -1,   1400, 1408,
-        1416, 1424, 1432, -1,   1440, 1448, -1,   -1};
+        1312, 1320, 1328, 1336, -1,   -1,   1344, 1352,
+        1360, 1368, 1376, -1,   1384, 1392, -1,   -1};
 static constexpr dart::compiler::target::word ApiError_InstanceSize = 16;
 static constexpr dart::compiler::target::word Array_InstanceSize = 24;
 static constexpr dart::compiler::target::word Array_header_size = 24;
 static constexpr dart::compiler::target::word Bool_InstanceSize = 12;
-static constexpr dart::compiler::target::word Bytecode_InstanceSize = 80;
 static constexpr dart::compiler::target::word Capability_InstanceSize = 16;
 static constexpr dart::compiler::target::word Class_InstanceSize = 208;
 static constexpr dart::compiler::target::word Closure_InstanceSize = 56;
-static constexpr dart::compiler::target::word ClosureData_InstanceSize = 40;
+static constexpr dart::compiler::target::word ClosureData_InstanceSize = 56;
 static constexpr dart::compiler::target::word Code_InstanceSize = 144;
 static constexpr dart::compiler::target::word CodeSourceMap_HeaderSize = 16;
 static constexpr dart::compiler::target::word CompressedStackMaps_HeaderSize =
@@ -2982,7 +3038,7 @@
 static constexpr dart::compiler::target::word Field_InstanceSize = 104;
 static constexpr dart::compiler::target::word Float32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word Float64x2_InstanceSize = 24;
-static constexpr dart::compiler::target::word Function_InstanceSize = 152;
+static constexpr dart::compiler::target::word Function_InstanceSize = 144;
 static constexpr dart::compiler::target::word FutureOr_InstanceSize = 16;
 static constexpr dart::compiler::target::word GrowableObjectArray_InstanceSize =
     32;
@@ -2995,7 +3051,7 @@
 static constexpr dart::compiler::target::word Int32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word Integer_InstanceSize = 8;
 static constexpr dart::compiler::target::word KernelProgramInfo_InstanceSize =
-    128;
+    120;
 static constexpr dart::compiler::target::word LanguageError_InstanceSize = 48;
 static constexpr dart::compiler::target::word Library_InstanceSize = 160;
 static constexpr dart::compiler::target::word LibraryPrefix_InstanceSize = 40;
@@ -3014,8 +3070,6 @@
 static constexpr dart::compiler::target::word Object_InstanceSize = 8;
 static constexpr dart::compiler::target::word ObjectPool_InstanceSize = 16;
 static constexpr dart::compiler::target::word OneByteString_InstanceSize = 16;
-static constexpr dart::compiler::target::word ParameterTypeCheck_InstanceSize =
-    48;
 static constexpr dart::compiler::target::word PatchClass_InstanceSize = 48;
 static constexpr dart::compiler::target::word PcDescriptors_HeaderSize = 16;
 static constexpr dart::compiler::target::word Pointer_InstanceSize = 24;
@@ -3038,7 +3092,7 @@
 static constexpr dart::compiler::target::word TwoByteString_InstanceSize = 16;
 static constexpr dart::compiler::target::word Type_InstanceSize = 64;
 static constexpr dart::compiler::target::word TypeArguments_InstanceSize = 40;
-static constexpr dart::compiler::target::word TypeParameter_InstanceSize = 72;
+static constexpr dart::compiler::target::word TypeParameter_InstanceSize = 80;
 static constexpr dart::compiler::target::word TypeRef_InstanceSize = 32;
 static constexpr dart::compiler::target::word TypedData_InstanceSize = 24;
 static constexpr dart::compiler::target::word TypedDataBase_InstanceSize = 24;
@@ -3055,7 +3109,7 @@
 
 #if defined(TARGET_ARCH_IA32)
 static constexpr dart::compiler::target::word Function_usage_counter_offset =
-    76;
+    84;
 static constexpr dart::compiler::target::word
     ICData_receivers_static_type_offset = 16;
 static constexpr dart::compiler::target::word ObjectPool_elements_start_offset =
@@ -3095,6 +3149,8 @@
 static constexpr dart::compiler::target::word
     SubtypeTestCache_kTestEntryLength = 7;
 static constexpr dart::compiler::target::word SubtypeTestCache_kTestResult = 0;
+static constexpr dart::compiler::target::word TypeArguments_kMaxElements =
+    268435455;
 static constexpr dart::compiler::target::word
     AbstractType_type_test_stub_entry_point_offset = 4;
 static constexpr dart::compiler::target::word ArgumentsDescriptor_count_offset =
@@ -3133,6 +3189,10 @@
 static constexpr dart::compiler::target::word Closure_hash_offset = 24;
 static constexpr dart::compiler::target::word
     Closure_instantiator_type_arguments_offset = 4;
+static constexpr dart::compiler::target::word
+    ClosureData_default_type_arguments_offset = 20;
+static constexpr dart::compiler::target::word
+    ClosureData_default_type_arguments_info_offset = 24;
 static constexpr dart::compiler::target::word Code_object_pool_offset = 20;
 static constexpr dart::compiler::target::word Code_saved_instructions_offset =
     24;
@@ -3158,10 +3218,12 @@
 static constexpr dart::compiler::target::word Field_is_nullable_offset = 50;
 static constexpr dart::compiler::target::word Field_kind_bits_offset = 58;
 static constexpr dart::compiler::target::word Function_code_offset = 44;
+static constexpr dart::compiler::target::word Function_data_offset = 36;
 static constexpr dart::compiler::target::word Function_entry_point_offset[] = {
     4, 8};
+static constexpr dart::compiler::target::word Function_kind_tag_offset = 72;
 static constexpr dart::compiler::target::word Function_packed_fields_offset =
-    68;
+    76;
 static constexpr dart::compiler::target::word Function_parameter_names_offset =
     28;
 static constexpr dart::compiler::target::word Function_parameter_types_offset =
@@ -3244,71 +3306,71 @@
 static constexpr dart::compiler::target::word
     Thread_AllocateArray_entry_point_offset = 376;
 static constexpr dart::compiler::target::word Thread_active_exception_offset =
-    692;
+    664;
 static constexpr dart::compiler::target::word Thread_active_stacktrace_offset =
-    696;
+    668;
 static constexpr dart::compiler::target::word
     Thread_array_write_barrier_code_offset = 128;
 static constexpr dart::compiler::target::word
-    Thread_array_write_barrier_entry_point_offset = 268;
+    Thread_array_write_barrier_entry_point_offset = 272;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_with_fpu_regs_entry_point_offset = 276;
+    Thread_allocate_mint_with_fpu_regs_entry_point_offset = 280;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_with_fpu_regs_stub_offset = 184;
+    Thread_allocate_mint_with_fpu_regs_stub_offset = 188;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_without_fpu_regs_entry_point_offset = 280;
+    Thread_allocate_mint_without_fpu_regs_entry_point_offset = 284;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_without_fpu_regs_stub_offset = 188;
+    Thread_allocate_mint_without_fpu_regs_stub_offset = 192;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_entry_point_offset = 284;
+    Thread_allocate_object_entry_point_offset = 288;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_stub_offset = 192;
+    Thread_allocate_object_stub_offset = 196;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_parameterized_entry_point_offset = 288;
+    Thread_allocate_object_parameterized_entry_point_offset = 292;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_parameterized_stub_offset = 196;
+    Thread_allocate_object_parameterized_stub_offset = 200;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_slow_entry_point_offset = 292;
+    Thread_allocate_object_slow_entry_point_offset = 296;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_slow_stub_offset = 200;
-static constexpr dart::compiler::target::word Thread_api_top_scope_offset = 728;
+    Thread_allocate_object_slow_stub_offset = 204;
+static constexpr dart::compiler::target::word Thread_api_top_scope_offset = 700;
 static constexpr dart::compiler::target::word Thread_async_stack_trace_offset =
     96;
 static constexpr dart::compiler::target::word
-    Thread_auto_scope_native_wrapper_entry_point_offset = 336;
+    Thread_auto_scope_native_wrapper_entry_point_offset = 340;
 static constexpr dart::compiler::target::word Thread_bool_false_offset = 120;
 static constexpr dart::compiler::target::word Thread_bool_true_offset = 116;
 static constexpr dart::compiler::target::word
-    Thread_bootstrap_native_wrapper_entry_point_offset = 328;
+    Thread_bootstrap_native_wrapper_entry_point_offset = 332;
 static constexpr dart::compiler::target::word
-    Thread_call_to_runtime_entry_point_offset = 272;
+    Thread_call_to_runtime_entry_point_offset = 276;
 static constexpr dart::compiler::target::word
-    Thread_call_to_runtime_stub_offset = 148;
-static constexpr dart::compiler::target::word Thread_dart_stream_offset = 736;
+    Thread_call_to_runtime_stub_offset = 144;
+static constexpr dart::compiler::target::word Thread_dart_stream_offset = 708;
 static constexpr dart::compiler::target::word
     Thread_dispatch_table_array_offset = 48;
 static constexpr dart::compiler::target::word Thread_optimize_entry_offset =
-    312;
-static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 228;
-static constexpr dart::compiler::target::word Thread_deoptimize_entry_offset =
     316;
+static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 232;
+static constexpr dart::compiler::target::word Thread_deoptimize_entry_offset =
+    320;
 static constexpr dart::compiler::target::word Thread_deoptimize_stub_offset =
-    232;
+    236;
 static constexpr dart::compiler::target::word Thread_double_abs_address_offset =
     356;
 static constexpr dart::compiler::target::word
     Thread_double_negate_address_offset = 352;
 static constexpr dart::compiler::target::word Thread_end_offset = 56;
 static constexpr dart::compiler::target::word
-    Thread_enter_safepoint_stub_offset = 252;
+    Thread_enter_safepoint_stub_offset = 256;
 static constexpr dart::compiler::target::word Thread_execution_state_offset =
-    712;
+    684;
 static constexpr dart::compiler::target::word
-    Thread_exit_safepoint_stub_offset = 256;
+    Thread_exit_safepoint_stub_offset = 260;
 static constexpr dart::compiler::target::word
-    Thread_call_native_through_safepoint_stub_offset = 260;
+    Thread_call_native_through_safepoint_stub_offset = 264;
 static constexpr dart::compiler::target::word
-    Thread_call_native_through_safepoint_entry_point_offset = 320;
+    Thread_call_native_through_safepoint_entry_point_offset = 324;
 static constexpr dart::compiler::target::word
     Thread_fix_allocation_stub_code_offset = 136;
 static constexpr dart::compiler::target::word
@@ -3322,75 +3384,75 @@
 static constexpr dart::compiler::target::word
     Thread_float_zerow_address_offset = 372;
 static constexpr dart::compiler::target::word Thread_global_object_pool_offset =
-    700;
-static constexpr dart::compiler::target::word
-    Thread_interpret_call_entry_point_offset = 340;
-static constexpr dart::compiler::target::word
-    Thread_invoke_dart_code_from_bytecode_stub_offset = 144;
+    672;
 static constexpr dart::compiler::target::word
     Thread_invoke_dart_code_stub_offset = 140;
 static constexpr dart::compiler::target::word Thread_exit_through_ffi_offset =
-    724;
+    696;
 static constexpr dart::compiler::target::word Thread_isolate_offset = 44;
 static constexpr dart::compiler::target::word Thread_field_table_values_offset =
     68;
 static constexpr dart::compiler::target::word
-    Thread_lazy_deopt_from_return_stub_offset = 236;
+    Thread_lazy_deopt_from_return_stub_offset = 240;
 static constexpr dart::compiler::target::word
-    Thread_lazy_deopt_from_throw_stub_offset = 240;
+    Thread_lazy_deopt_from_throw_stub_offset = 244;
 static constexpr dart::compiler::target::word
-    Thread_lazy_specialize_type_test_stub_offset = 248;
+    Thread_lazy_specialize_type_test_stub_offset = 252;
 static constexpr dart::compiler::target::word
     Thread_marking_stack_block_offset = 84;
 static constexpr dart::compiler::target::word
-    Thread_megamorphic_call_checked_entry_offset = 304;
+    Thread_megamorphic_call_checked_entry_offset = 308;
 static constexpr dart::compiler::target::word
-    Thread_switchable_call_miss_entry_offset = 308;
+    Thread_switchable_call_miss_entry_offset = 312;
 static constexpr dart::compiler::target::word
-    Thread_switchable_call_miss_stub_offset = 212;
+    Thread_switchable_call_miss_stub_offset = 216;
 static constexpr dart::compiler::target::word
-    Thread_no_scope_native_wrapper_entry_point_offset = 332;
+    Thread_no_scope_native_wrapper_entry_point_offset = 336;
 static constexpr dart::compiler::target::word
-    Thread_null_error_shared_with_fpu_regs_stub_offset = 156;
+    Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 152;
 static constexpr dart::compiler::target::word
-    Thread_null_error_shared_without_fpu_regs_stub_offset = 152;
+    Thread_late_initialization_error_shared_without_fpu_regs_stub_offset = 148;
 static constexpr dart::compiler::target::word
-    Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 164;
+    Thread_null_error_shared_with_fpu_regs_stub_offset = 160;
 static constexpr dart::compiler::target::word
-    Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 160;
+    Thread_null_error_shared_without_fpu_regs_stub_offset = 156;
 static constexpr dart::compiler::target::word
-    Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 172;
+    Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 168;
 static constexpr dart::compiler::target::word
-    Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 168;
+    Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 164;
 static constexpr dart::compiler::target::word
-    Thread_range_error_shared_with_fpu_regs_stub_offset = 180;
+    Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 176;
 static constexpr dart::compiler::target::word
-    Thread_range_error_shared_without_fpu_regs_stub_offset = 176;
+    Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 172;
+static constexpr dart::compiler::target::word
+    Thread_range_error_shared_with_fpu_regs_stub_offset = 184;
+static constexpr dart::compiler::target::word
+    Thread_range_error_shared_without_fpu_regs_stub_offset = 180;
 static constexpr dart::compiler::target::word Thread_object_null_offset = 112;
 static constexpr dart::compiler::target::word
     Thread_predefined_symbols_address_offset = 344;
-static constexpr dart::compiler::target::word Thread_resume_pc_offset = 704;
+static constexpr dart::compiler::target::word Thread_resume_pc_offset = 676;
 static constexpr dart::compiler::target::word
-    Thread_saved_shadow_call_stack_offset = 708;
+    Thread_saved_shadow_call_stack_offset = 680;
 static constexpr dart::compiler::target::word Thread_safepoint_state_offset =
-    716;
+    688;
 static constexpr dart::compiler::target::word
-    Thread_slow_type_test_stub_offset = 244;
+    Thread_slow_type_test_stub_offset = 248;
 static constexpr dart::compiler::target::word
-    Thread_slow_type_test_entry_point_offset = 324;
+    Thread_slow_type_test_entry_point_offset = 328;
 static constexpr dart::compiler::target::word Thread_stack_limit_offset = 36;
 static constexpr dart::compiler::target::word Thread_saved_stack_limit_offset =
     60;
 static constexpr dart::compiler::target::word
     Thread_stack_overflow_flags_offset = 64;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 300;
+    Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 304;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 208;
+    Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 212;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 296;
+    Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 300;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 204;
+    Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 208;
 static constexpr dart::compiler::target::word Thread_store_buffer_block_offset =
     80;
 static constexpr dart::compiler::target::word
@@ -3403,10 +3465,10 @@
 static constexpr dart::compiler::target::word Thread_write_barrier_code_offset =
     124;
 static constexpr dart::compiler::target::word
-    Thread_write_barrier_entry_point_offset = 264;
+    Thread_write_barrier_entry_point_offset = 268;
 static constexpr dart::compiler::target::word Thread_write_barrier_mask_offset =
     40;
-static constexpr dart::compiler::target::word Thread_callback_code_offset = 720;
+static constexpr dart::compiler::target::word Thread_callback_code_offset = 692;
 static constexpr dart::compiler::target::word TimelineStream_enabled_offset = 8;
 static constexpr dart::compiler::target::word TwoByteString_data_offset = 12;
 static constexpr dart::compiler::target::word Type_arguments_offset = 16;
@@ -3416,13 +3478,17 @@
 static constexpr dart::compiler::target::word Type_type_state_offset = 32;
 static constexpr dart::compiler::target::word Type_nullability_offset = 33;
 static constexpr dart::compiler::target::word
-    TypeParameter_parameterized_class_id_offset = 28;
-static constexpr dart::compiler::target::word TypeParameter_index_offset = 36;
+    TypeParameter_parameterized_class_id_offset = 32;
+static constexpr dart::compiler::target::word TypeParameter_index_offset = 40;
 static constexpr dart::compiler::target::word
     TypeArguments_instantiations_offset = 4;
 static constexpr dart::compiler::target::word TypeArguments_length_offset = 8;
 static constexpr dart::compiler::target::word TypeArguments_nullability_offset =
     16;
+static constexpr dart::compiler::target::word TypeArguments_types_offset = 20;
+static constexpr dart::compiler::target::word TypeParameter_bound_offset = 20;
+static constexpr dart::compiler::target::word TypeParameter_flags_offset = 42;
+static constexpr dart::compiler::target::word TypeParameter_name_offset = 12;
 static constexpr dart::compiler::target::word TypeRef_type_offset = 12;
 static constexpr dart::compiler::target::word TypedDataBase_length_offset = 8;
 static constexpr dart::compiler::target::word TypedDataView_data_offset = 12;
@@ -3451,11 +3517,10 @@
 static constexpr dart::compiler::target::word Array_InstanceSize = 12;
 static constexpr dart::compiler::target::word Array_header_size = 12;
 static constexpr dart::compiler::target::word Bool_InstanceSize = 8;
-static constexpr dart::compiler::target::word Bytecode_InstanceSize = 44;
 static constexpr dart::compiler::target::word Capability_InstanceSize = 16;
 static constexpr dart::compiler::target::word Class_InstanceSize = 128;
 static constexpr dart::compiler::target::word Closure_InstanceSize = 28;
-static constexpr dart::compiler::target::word ClosureData_InstanceSize = 20;
+static constexpr dart::compiler::target::word ClosureData_InstanceSize = 28;
 static constexpr dart::compiler::target::word Code_InstanceSize = 76;
 static constexpr dart::compiler::target::word CodeSourceMap_HeaderSize = 8;
 static constexpr dart::compiler::target::word CompressedStackMaps_HeaderSize =
@@ -3491,7 +3556,7 @@
 static constexpr dart::compiler::target::word Int32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word Integer_InstanceSize = 4;
 static constexpr dart::compiler::target::word KernelProgramInfo_InstanceSize =
-    64;
+    60;
 static constexpr dart::compiler::target::word LanguageError_InstanceSize = 28;
 static constexpr dart::compiler::target::word Library_InstanceSize = 84;
 static constexpr dart::compiler::target::word LibraryPrefix_InstanceSize = 20;
@@ -3510,8 +3575,6 @@
 static constexpr dart::compiler::target::word Object_InstanceSize = 4;
 static constexpr dart::compiler::target::word ObjectPool_InstanceSize = 8;
 static constexpr dart::compiler::target::word OneByteString_InstanceSize = 12;
-static constexpr dart::compiler::target::word ParameterTypeCheck_InstanceSize =
-    24;
 static constexpr dart::compiler::target::word PatchClass_InstanceSize = 24;
 static constexpr dart::compiler::target::word PcDescriptors_HeaderSize = 8;
 static constexpr dart::compiler::target::word Pointer_InstanceSize = 12;
@@ -3533,7 +3596,7 @@
 static constexpr dart::compiler::target::word TwoByteString_InstanceSize = 12;
 static constexpr dart::compiler::target::word Type_InstanceSize = 36;
 static constexpr dart::compiler::target::word TypeArguments_InstanceSize = 20;
-static constexpr dart::compiler::target::word TypeParameter_InstanceSize = 40;
+static constexpr dart::compiler::target::word TypeParameter_InstanceSize = 44;
 static constexpr dart::compiler::target::word TypeRef_InstanceSize = 16;
 static constexpr dart::compiler::target::word TypedData_InstanceSize = 12;
 static constexpr dart::compiler::target::word TypedDataBase_InstanceSize = 12;
@@ -3592,6 +3655,8 @@
 static constexpr dart::compiler::target::word
     SubtypeTestCache_kTestEntryLength = 7;
 static constexpr dart::compiler::target::word SubtypeTestCache_kTestResult = 0;
+static constexpr dart::compiler::target::word TypeArguments_kMaxElements =
+    576460752303423487;
 static constexpr dart::compiler::target::word
     AbstractType_type_test_stub_entry_point_offset = 8;
 static constexpr dart::compiler::target::word ArgumentsDescriptor_count_offset =
@@ -3630,6 +3695,10 @@
 static constexpr dart::compiler::target::word Closure_hash_offset = 48;
 static constexpr dart::compiler::target::word
     Closure_instantiator_type_arguments_offset = 8;
+static constexpr dart::compiler::target::word
+    ClosureData_default_type_arguments_offset = 40;
+static constexpr dart::compiler::target::word
+    ClosureData_default_type_arguments_info_offset = 48;
 static constexpr dart::compiler::target::word Code_object_pool_offset = 40;
 static constexpr dart::compiler::target::word Code_saved_instructions_offset =
     48;
@@ -3655,8 +3724,10 @@
 static constexpr dart::compiler::target::word Field_is_nullable_offset = 90;
 static constexpr dart::compiler::target::word Field_kind_bits_offset = 98;
 static constexpr dart::compiler::target::word Function_code_offset = 88;
+static constexpr dart::compiler::target::word Function_data_offset = 72;
 static constexpr dart::compiler::target::word Function_entry_point_offset[] = {
     8, 16};
+static constexpr dart::compiler::target::word Function_kind_tag_offset = 120;
 static constexpr dart::compiler::target::word Function_packed_fields_offset =
     124;
 static constexpr dart::compiler::target::word Function_parameter_names_offset =
@@ -3742,72 +3813,72 @@
 static constexpr dart::compiler::target::word
     Thread_AllocateArray_entry_point_offset = 736;
 static constexpr dart::compiler::target::word Thread_active_exception_offset =
-    1528;
+    1472;
 static constexpr dart::compiler::target::word Thread_active_stacktrace_offset =
-    1536;
+    1480;
 static constexpr dart::compiler::target::word
     Thread_array_write_barrier_code_offset = 240;
 static constexpr dart::compiler::target::word
-    Thread_array_write_barrier_entry_point_offset = 520;
+    Thread_array_write_barrier_entry_point_offset = 528;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_with_fpu_regs_entry_point_offset = 536;
+    Thread_allocate_mint_with_fpu_regs_entry_point_offset = 544;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_with_fpu_regs_stub_offset = 352;
+    Thread_allocate_mint_with_fpu_regs_stub_offset = 360;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_without_fpu_regs_entry_point_offset = 544;
+    Thread_allocate_mint_without_fpu_regs_entry_point_offset = 552;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_without_fpu_regs_stub_offset = 360;
+    Thread_allocate_mint_without_fpu_regs_stub_offset = 368;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_entry_point_offset = 552;
+    Thread_allocate_object_entry_point_offset = 560;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_stub_offset = 368;
+    Thread_allocate_object_stub_offset = 376;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_parameterized_entry_point_offset = 560;
+    Thread_allocate_object_parameterized_entry_point_offset = 568;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_parameterized_stub_offset = 376;
+    Thread_allocate_object_parameterized_stub_offset = 384;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_slow_entry_point_offset = 568;
+    Thread_allocate_object_slow_entry_point_offset = 576;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_slow_stub_offset = 384;
+    Thread_allocate_object_slow_stub_offset = 392;
 static constexpr dart::compiler::target::word Thread_api_top_scope_offset =
-    1600;
+    1544;
 static constexpr dart::compiler::target::word Thread_async_stack_trace_offset =
     192;
 static constexpr dart::compiler::target::word
-    Thread_auto_scope_native_wrapper_entry_point_offset = 656;
+    Thread_auto_scope_native_wrapper_entry_point_offset = 664;
 static constexpr dart::compiler::target::word Thread_bool_false_offset = 224;
 static constexpr dart::compiler::target::word Thread_bool_true_offset = 216;
 static constexpr dart::compiler::target::word
-    Thread_bootstrap_native_wrapper_entry_point_offset = 640;
+    Thread_bootstrap_native_wrapper_entry_point_offset = 648;
 static constexpr dart::compiler::target::word
-    Thread_call_to_runtime_entry_point_offset = 528;
+    Thread_call_to_runtime_entry_point_offset = 536;
 static constexpr dart::compiler::target::word
-    Thread_call_to_runtime_stub_offset = 280;
-static constexpr dart::compiler::target::word Thread_dart_stream_offset = 1616;
+    Thread_call_to_runtime_stub_offset = 272;
+static constexpr dart::compiler::target::word Thread_dart_stream_offset = 1560;
 static constexpr dart::compiler::target::word
     Thread_dispatch_table_array_offset = 96;
 static constexpr dart::compiler::target::word Thread_optimize_entry_offset =
-    608;
-static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 440;
-static constexpr dart::compiler::target::word Thread_deoptimize_entry_offset =
     616;
+static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 448;
+static constexpr dart::compiler::target::word Thread_deoptimize_entry_offset =
+    624;
 static constexpr dart::compiler::target::word Thread_deoptimize_stub_offset =
-    448;
+    456;
 static constexpr dart::compiler::target::word Thread_double_abs_address_offset =
     696;
 static constexpr dart::compiler::target::word
     Thread_double_negate_address_offset = 688;
 static constexpr dart::compiler::target::word Thread_end_offset = 112;
 static constexpr dart::compiler::target::word
-    Thread_enter_safepoint_stub_offset = 488;
+    Thread_enter_safepoint_stub_offset = 496;
 static constexpr dart::compiler::target::word Thread_execution_state_offset =
-    1568;
+    1512;
 static constexpr dart::compiler::target::word
-    Thread_exit_safepoint_stub_offset = 496;
+    Thread_exit_safepoint_stub_offset = 504;
 static constexpr dart::compiler::target::word
-    Thread_call_native_through_safepoint_stub_offset = 504;
+    Thread_call_native_through_safepoint_stub_offset = 512;
 static constexpr dart::compiler::target::word
-    Thread_call_native_through_safepoint_entry_point_offset = 624;
+    Thread_call_native_through_safepoint_entry_point_offset = 632;
 static constexpr dart::compiler::target::word
     Thread_fix_allocation_stub_code_offset = 256;
 static constexpr dart::compiler::target::word
@@ -3821,75 +3892,75 @@
 static constexpr dart::compiler::target::word
     Thread_float_zerow_address_offset = 728;
 static constexpr dart::compiler::target::word Thread_global_object_pool_offset =
-    1544;
-static constexpr dart::compiler::target::word
-    Thread_interpret_call_entry_point_offset = 664;
-static constexpr dart::compiler::target::word
-    Thread_invoke_dart_code_from_bytecode_stub_offset = 272;
+    1488;
 static constexpr dart::compiler::target::word
     Thread_invoke_dart_code_stub_offset = 264;
 static constexpr dart::compiler::target::word Thread_exit_through_ffi_offset =
-    1592;
+    1536;
 static constexpr dart::compiler::target::word Thread_isolate_offset = 88;
 static constexpr dart::compiler::target::word Thread_field_table_values_offset =
     136;
 static constexpr dart::compiler::target::word
-    Thread_lazy_deopt_from_return_stub_offset = 456;
+    Thread_lazy_deopt_from_return_stub_offset = 464;
 static constexpr dart::compiler::target::word
-    Thread_lazy_deopt_from_throw_stub_offset = 464;
+    Thread_lazy_deopt_from_throw_stub_offset = 472;
 static constexpr dart::compiler::target::word
-    Thread_lazy_specialize_type_test_stub_offset = 480;
+    Thread_lazy_specialize_type_test_stub_offset = 488;
 static constexpr dart::compiler::target::word
     Thread_marking_stack_block_offset = 168;
 static constexpr dart::compiler::target::word
-    Thread_megamorphic_call_checked_entry_offset = 592;
+    Thread_megamorphic_call_checked_entry_offset = 600;
 static constexpr dart::compiler::target::word
-    Thread_switchable_call_miss_entry_offset = 600;
+    Thread_switchable_call_miss_entry_offset = 608;
 static constexpr dart::compiler::target::word
-    Thread_switchable_call_miss_stub_offset = 408;
+    Thread_switchable_call_miss_stub_offset = 416;
 static constexpr dart::compiler::target::word
-    Thread_no_scope_native_wrapper_entry_point_offset = 648;
+    Thread_no_scope_native_wrapper_entry_point_offset = 656;
 static constexpr dart::compiler::target::word
-    Thread_null_error_shared_with_fpu_regs_stub_offset = 296;
+    Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 288;
 static constexpr dart::compiler::target::word
-    Thread_null_error_shared_without_fpu_regs_stub_offset = 288;
+    Thread_late_initialization_error_shared_without_fpu_regs_stub_offset = 280;
 static constexpr dart::compiler::target::word
-    Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 312;
+    Thread_null_error_shared_with_fpu_regs_stub_offset = 304;
 static constexpr dart::compiler::target::word
-    Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 304;
+    Thread_null_error_shared_without_fpu_regs_stub_offset = 296;
 static constexpr dart::compiler::target::word
-    Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 328;
+    Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 320;
 static constexpr dart::compiler::target::word
-    Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 320;
+    Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 312;
 static constexpr dart::compiler::target::word
-    Thread_range_error_shared_with_fpu_regs_stub_offset = 344;
+    Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 336;
 static constexpr dart::compiler::target::word
-    Thread_range_error_shared_without_fpu_regs_stub_offset = 336;
+    Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 328;
+static constexpr dart::compiler::target::word
+    Thread_range_error_shared_with_fpu_regs_stub_offset = 352;
+static constexpr dart::compiler::target::word
+    Thread_range_error_shared_without_fpu_regs_stub_offset = 344;
 static constexpr dart::compiler::target::word Thread_object_null_offset = 208;
 static constexpr dart::compiler::target::word
     Thread_predefined_symbols_address_offset = 672;
-static constexpr dart::compiler::target::word Thread_resume_pc_offset = 1552;
+static constexpr dart::compiler::target::word Thread_resume_pc_offset = 1496;
 static constexpr dart::compiler::target::word
-    Thread_saved_shadow_call_stack_offset = 1560;
+    Thread_saved_shadow_call_stack_offset = 1504;
 static constexpr dart::compiler::target::word Thread_safepoint_state_offset =
-    1576;
+    1520;
 static constexpr dart::compiler::target::word
-    Thread_slow_type_test_stub_offset = 472;
+    Thread_slow_type_test_stub_offset = 480;
 static constexpr dart::compiler::target::word
-    Thread_slow_type_test_entry_point_offset = 632;
+    Thread_slow_type_test_entry_point_offset = 640;
 static constexpr dart::compiler::target::word Thread_stack_limit_offset = 72;
 static constexpr dart::compiler::target::word Thread_saved_stack_limit_offset =
     120;
 static constexpr dart::compiler::target::word
     Thread_stack_overflow_flags_offset = 128;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 584;
+    Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 592;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 400;
+    Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 408;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 576;
+    Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 584;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 392;
+    Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 400;
 static constexpr dart::compiler::target::word Thread_store_buffer_block_offset =
     160;
 static constexpr dart::compiler::target::word
@@ -3902,11 +3973,11 @@
 static constexpr dart::compiler::target::word Thread_write_barrier_code_offset =
     232;
 static constexpr dart::compiler::target::word
-    Thread_write_barrier_entry_point_offset = 512;
+    Thread_write_barrier_entry_point_offset = 520;
 static constexpr dart::compiler::target::word Thread_write_barrier_mask_offset =
     80;
 static constexpr dart::compiler::target::word Thread_callback_code_offset =
-    1584;
+    1528;
 static constexpr dart::compiler::target::word TimelineStream_enabled_offset =
     16;
 static constexpr dart::compiler::target::word TwoByteString_data_offset = 16;
@@ -3917,13 +3988,17 @@
 static constexpr dart::compiler::target::word Type_type_state_offset = 60;
 static constexpr dart::compiler::target::word Type_nullability_offset = 61;
 static constexpr dart::compiler::target::word
-    TypeParameter_parameterized_class_id_offset = 56;
-static constexpr dart::compiler::target::word TypeParameter_index_offset = 64;
+    TypeParameter_parameterized_class_id_offset = 64;
+static constexpr dart::compiler::target::word TypeParameter_index_offset = 72;
 static constexpr dart::compiler::target::word
     TypeArguments_instantiations_offset = 8;
 static constexpr dart::compiler::target::word TypeArguments_length_offset = 16;
 static constexpr dart::compiler::target::word TypeArguments_nullability_offset =
     32;
+static constexpr dart::compiler::target::word TypeArguments_types_offset = 40;
+static constexpr dart::compiler::target::word TypeParameter_bound_offset = 40;
+static constexpr dart::compiler::target::word TypeParameter_flags_offset = 74;
+static constexpr dart::compiler::target::word TypeParameter_name_offset = 24;
 static constexpr dart::compiler::target::word TypeRef_type_offset = 24;
 static constexpr dart::compiler::target::word TypedDataBase_length_offset = 16;
 static constexpr dart::compiler::target::word TypedDataView_data_offset = 24;
@@ -3950,18 +4025,17 @@
     8, 24, 16, 32};
 static constexpr dart::compiler::target::word
     Thread_write_barrier_wrappers_thread_offset[] = {
-        1368, 1376, 1384, 1392, 1400, 1408, 1416, 1424, 1432, 1440, 1448,
-        1456, 1464, 1472, 1480, -1,   -1,   -1,   -1,   1488, 1496, -1,
-        -1,   1504, 1512, 1520, -1,   -1,   -1,   -1,   -1,   -1};
+        1312, 1320, 1328, 1336, 1344, 1352, 1360, 1368, 1376, 1384, 1392,
+        1400, 1408, 1416, 1424, -1,   -1,   -1,   -1,   1432, 1440, -1,
+        -1,   1448, 1456, 1464, -1,   -1,   -1,   -1,   -1,   -1};
 static constexpr dart::compiler::target::word ApiError_InstanceSize = 16;
 static constexpr dart::compiler::target::word Array_InstanceSize = 24;
 static constexpr dart::compiler::target::word Array_header_size = 24;
 static constexpr dart::compiler::target::word Bool_InstanceSize = 12;
-static constexpr dart::compiler::target::word Bytecode_InstanceSize = 80;
 static constexpr dart::compiler::target::word Capability_InstanceSize = 16;
 static constexpr dart::compiler::target::word Class_InstanceSize = 208;
 static constexpr dart::compiler::target::word Closure_InstanceSize = 56;
-static constexpr dart::compiler::target::word ClosureData_InstanceSize = 40;
+static constexpr dart::compiler::target::word ClosureData_InstanceSize = 56;
 static constexpr dart::compiler::target::word Code_InstanceSize = 144;
 static constexpr dart::compiler::target::word CodeSourceMap_HeaderSize = 16;
 static constexpr dart::compiler::target::word CompressedStackMaps_HeaderSize =
@@ -3984,7 +4058,7 @@
 static constexpr dart::compiler::target::word Field_InstanceSize = 104;
 static constexpr dart::compiler::target::word Float32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word Float64x2_InstanceSize = 24;
-static constexpr dart::compiler::target::word Function_InstanceSize = 152;
+static constexpr dart::compiler::target::word Function_InstanceSize = 144;
 static constexpr dart::compiler::target::word FutureOr_InstanceSize = 16;
 static constexpr dart::compiler::target::word GrowableObjectArray_InstanceSize =
     32;
@@ -3997,7 +4071,7 @@
 static constexpr dart::compiler::target::word Int32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word Integer_InstanceSize = 8;
 static constexpr dart::compiler::target::word KernelProgramInfo_InstanceSize =
-    128;
+    120;
 static constexpr dart::compiler::target::word LanguageError_InstanceSize = 48;
 static constexpr dart::compiler::target::word Library_InstanceSize = 160;
 static constexpr dart::compiler::target::word LibraryPrefix_InstanceSize = 40;
@@ -4016,8 +4090,6 @@
 static constexpr dart::compiler::target::word Object_InstanceSize = 8;
 static constexpr dart::compiler::target::word ObjectPool_InstanceSize = 16;
 static constexpr dart::compiler::target::word OneByteString_InstanceSize = 16;
-static constexpr dart::compiler::target::word ParameterTypeCheck_InstanceSize =
-    48;
 static constexpr dart::compiler::target::word PatchClass_InstanceSize = 48;
 static constexpr dart::compiler::target::word PcDescriptors_HeaderSize = 16;
 static constexpr dart::compiler::target::word Pointer_InstanceSize = 24;
@@ -4040,7 +4112,7 @@
 static constexpr dart::compiler::target::word TwoByteString_InstanceSize = 16;
 static constexpr dart::compiler::target::word Type_InstanceSize = 64;
 static constexpr dart::compiler::target::word TypeArguments_InstanceSize = 40;
-static constexpr dart::compiler::target::word TypeParameter_InstanceSize = 72;
+static constexpr dart::compiler::target::word TypeParameter_InstanceSize = 80;
 static constexpr dart::compiler::target::word TypeRef_InstanceSize = 32;
 static constexpr dart::compiler::target::word TypedData_InstanceSize = 24;
 static constexpr dart::compiler::target::word TypedDataBase_InstanceSize = 24;
@@ -4100,6 +4172,8 @@
     AOT_SubtypeTestCache_kTestEntryLength = 7;
 static constexpr dart::compiler::target::word AOT_SubtypeTestCache_kTestResult =
     0;
+static constexpr dart::compiler::target::word AOT_TypeArguments_kMaxElements =
+    268435455;
 static constexpr dart::compiler::target::word
     AOT_AbstractType_type_test_stub_entry_point_offset = 4;
 static constexpr dart::compiler::target::word
@@ -4141,6 +4215,10 @@
 static constexpr dart::compiler::target::word AOT_Closure_hash_offset = 24;
 static constexpr dart::compiler::target::word
     AOT_Closure_instantiator_type_arguments_offset = 4;
+static constexpr dart::compiler::target::word
+    AOT_ClosureData_default_type_arguments_offset = 20;
+static constexpr dart::compiler::target::word
+    AOT_ClosureData_default_type_arguments_info_offset = 24;
 static constexpr dart::compiler::target::word AOT_Code_object_pool_offset = 20;
 static constexpr dart::compiler::target::word
     AOT_Code_saved_instructions_offset = 24;
@@ -4167,8 +4245,10 @@
 static constexpr dart::compiler::target::word AOT_Field_is_nullable_offset = 42;
 static constexpr dart::compiler::target::word AOT_Field_kind_bits_offset = 46;
 static constexpr dart::compiler::target::word AOT_Function_code_offset = 44;
+static constexpr dart::compiler::target::word AOT_Function_data_offset = 36;
 static constexpr dart::compiler::target::word
     AOT_Function_entry_point_offset[] = {4, 8};
+static constexpr dart::compiler::target::word AOT_Function_kind_tag_offset = 48;
 static constexpr dart::compiler::target::word
     AOT_Function_packed_fields_offset = 52;
 static constexpr dart::compiler::target::word
@@ -4271,75 +4351,75 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_AllocateArray_entry_point_offset = 376;
 static constexpr dart::compiler::target::word
-    AOT_Thread_active_exception_offset = 724;
+    AOT_Thread_active_exception_offset = 696;
 static constexpr dart::compiler::target::word
-    AOT_Thread_active_stacktrace_offset = 728;
+    AOT_Thread_active_stacktrace_offset = 700;
 static constexpr dart::compiler::target::word
     AOT_Thread_array_write_barrier_code_offset = 128;
 static constexpr dart::compiler::target::word
-    AOT_Thread_array_write_barrier_entry_point_offset = 268;
+    AOT_Thread_array_write_barrier_entry_point_offset = 272;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_mint_with_fpu_regs_entry_point_offset = 276;
+    AOT_Thread_allocate_mint_with_fpu_regs_entry_point_offset = 280;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_mint_with_fpu_regs_stub_offset = 184;
+    AOT_Thread_allocate_mint_with_fpu_regs_stub_offset = 188;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_mint_without_fpu_regs_entry_point_offset = 280;
+    AOT_Thread_allocate_mint_without_fpu_regs_entry_point_offset = 284;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_mint_without_fpu_regs_stub_offset = 188;
+    AOT_Thread_allocate_mint_without_fpu_regs_stub_offset = 192;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_entry_point_offset = 284;
+    AOT_Thread_allocate_object_entry_point_offset = 288;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_stub_offset = 192;
+    AOT_Thread_allocate_object_stub_offset = 196;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_parameterized_entry_point_offset = 288;
+    AOT_Thread_allocate_object_parameterized_entry_point_offset = 292;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_parameterized_stub_offset = 196;
+    AOT_Thread_allocate_object_parameterized_stub_offset = 200;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_slow_entry_point_offset = 292;
+    AOT_Thread_allocate_object_slow_entry_point_offset = 296;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_slow_stub_offset = 200;
+    AOT_Thread_allocate_object_slow_stub_offset = 204;
 static constexpr dart::compiler::target::word AOT_Thread_api_top_scope_offset =
-    760;
+    732;
 static constexpr dart::compiler::target::word
     AOT_Thread_async_stack_trace_offset = 96;
 static constexpr dart::compiler::target::word
-    AOT_Thread_auto_scope_native_wrapper_entry_point_offset = 336;
+    AOT_Thread_auto_scope_native_wrapper_entry_point_offset = 340;
 static constexpr dart::compiler::target::word AOT_Thread_bool_false_offset =
     120;
 static constexpr dart::compiler::target::word AOT_Thread_bool_true_offset = 116;
 static constexpr dart::compiler::target::word
-    AOT_Thread_bootstrap_native_wrapper_entry_point_offset = 328;
+    AOT_Thread_bootstrap_native_wrapper_entry_point_offset = 332;
 static constexpr dart::compiler::target::word
-    AOT_Thread_call_to_runtime_entry_point_offset = 272;
+    AOT_Thread_call_to_runtime_entry_point_offset = 276;
 static constexpr dart::compiler::target::word
-    AOT_Thread_call_to_runtime_stub_offset = 148;
+    AOT_Thread_call_to_runtime_stub_offset = 144;
 static constexpr dart::compiler::target::word AOT_Thread_dart_stream_offset =
-    768;
+    740;
 static constexpr dart::compiler::target::word
     AOT_Thread_dispatch_table_array_offset = 48;
 static constexpr dart::compiler::target::word AOT_Thread_optimize_entry_offset =
-    312;
+    316;
 static constexpr dart::compiler::target::word AOT_Thread_optimize_stub_offset =
-    228;
+    232;
 static constexpr dart::compiler::target::word
-    AOT_Thread_deoptimize_entry_offset = 316;
+    AOT_Thread_deoptimize_entry_offset = 320;
 static constexpr dart::compiler::target::word
-    AOT_Thread_deoptimize_stub_offset = 232;
+    AOT_Thread_deoptimize_stub_offset = 236;
 static constexpr dart::compiler::target::word
     AOT_Thread_double_abs_address_offset = 356;
 static constexpr dart::compiler::target::word
     AOT_Thread_double_negate_address_offset = 352;
 static constexpr dart::compiler::target::word AOT_Thread_end_offset = 56;
 static constexpr dart::compiler::target::word
-    AOT_Thread_enter_safepoint_stub_offset = 252;
+    AOT_Thread_enter_safepoint_stub_offset = 256;
 static constexpr dart::compiler::target::word
-    AOT_Thread_execution_state_offset = 744;
+    AOT_Thread_execution_state_offset = 716;
 static constexpr dart::compiler::target::word
-    AOT_Thread_exit_safepoint_stub_offset = 256;
+    AOT_Thread_exit_safepoint_stub_offset = 260;
 static constexpr dart::compiler::target::word
-    AOT_Thread_call_native_through_safepoint_stub_offset = 260;
+    AOT_Thread_call_native_through_safepoint_stub_offset = 264;
 static constexpr dart::compiler::target::word
-    AOT_Thread_call_native_through_safepoint_entry_point_offset = 320;
+    AOT_Thread_call_native_through_safepoint_entry_point_offset = 324;
 static constexpr dart::compiler::target::word
     AOT_Thread_fix_allocation_stub_code_offset = 136;
 static constexpr dart::compiler::target::word
@@ -4353,63 +4433,64 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_float_zerow_address_offset = 372;
 static constexpr dart::compiler::target::word
-    AOT_Thread_global_object_pool_offset = 732;
-static constexpr dart::compiler::target::word
-    AOT_Thread_interpret_call_entry_point_offset = 340;
-static constexpr dart::compiler::target::word
-    AOT_Thread_invoke_dart_code_from_bytecode_stub_offset = 144;
+    AOT_Thread_global_object_pool_offset = 704;
 static constexpr dart::compiler::target::word
     AOT_Thread_invoke_dart_code_stub_offset = 140;
 static constexpr dart::compiler::target::word
-    AOT_Thread_exit_through_ffi_offset = 756;
+    AOT_Thread_exit_through_ffi_offset = 728;
 static constexpr dart::compiler::target::word AOT_Thread_isolate_offset = 44;
 static constexpr dart::compiler::target::word
     AOT_Thread_field_table_values_offset = 68;
 static constexpr dart::compiler::target::word
-    AOT_Thread_lazy_deopt_from_return_stub_offset = 236;
+    AOT_Thread_lazy_deopt_from_return_stub_offset = 240;
 static constexpr dart::compiler::target::word
-    AOT_Thread_lazy_deopt_from_throw_stub_offset = 240;
+    AOT_Thread_lazy_deopt_from_throw_stub_offset = 244;
 static constexpr dart::compiler::target::word
-    AOT_Thread_lazy_specialize_type_test_stub_offset = 248;
+    AOT_Thread_lazy_specialize_type_test_stub_offset = 252;
 static constexpr dart::compiler::target::word
     AOT_Thread_marking_stack_block_offset = 84;
 static constexpr dart::compiler::target::word
-    AOT_Thread_megamorphic_call_checked_entry_offset = 304;
+    AOT_Thread_megamorphic_call_checked_entry_offset = 308;
 static constexpr dart::compiler::target::word
-    AOT_Thread_switchable_call_miss_entry_offset = 308;
+    AOT_Thread_switchable_call_miss_entry_offset = 312;
 static constexpr dart::compiler::target::word
-    AOT_Thread_switchable_call_miss_stub_offset = 212;
+    AOT_Thread_switchable_call_miss_stub_offset = 216;
 static constexpr dart::compiler::target::word
-    AOT_Thread_no_scope_native_wrapper_entry_point_offset = 332;
+    AOT_Thread_no_scope_native_wrapper_entry_point_offset = 336;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_error_shared_with_fpu_regs_stub_offset = 156;
+    AOT_Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 152;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_error_shared_without_fpu_regs_stub_offset = 152;
+    AOT_Thread_late_initialization_error_shared_without_fpu_regs_stub_offset =
+        148;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 164;
+    AOT_Thread_null_error_shared_with_fpu_regs_stub_offset = 160;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 160;
+    AOT_Thread_null_error_shared_without_fpu_regs_stub_offset = 156;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 172;
+    AOT_Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 168;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 168;
+    AOT_Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 164;
 static constexpr dart::compiler::target::word
-    AOT_Thread_range_error_shared_with_fpu_regs_stub_offset = 180;
+    AOT_Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 176;
 static constexpr dart::compiler::target::word
-    AOT_Thread_range_error_shared_without_fpu_regs_stub_offset = 176;
+    AOT_Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 172;
+static constexpr dart::compiler::target::word
+    AOT_Thread_range_error_shared_with_fpu_regs_stub_offset = 184;
+static constexpr dart::compiler::target::word
+    AOT_Thread_range_error_shared_without_fpu_regs_stub_offset = 180;
 static constexpr dart::compiler::target::word AOT_Thread_object_null_offset =
     112;
 static constexpr dart::compiler::target::word
     AOT_Thread_predefined_symbols_address_offset = 344;
-static constexpr dart::compiler::target::word AOT_Thread_resume_pc_offset = 736;
+static constexpr dart::compiler::target::word AOT_Thread_resume_pc_offset = 708;
 static constexpr dart::compiler::target::word
-    AOT_Thread_saved_shadow_call_stack_offset = 740;
+    AOT_Thread_saved_shadow_call_stack_offset = 712;
 static constexpr dart::compiler::target::word
-    AOT_Thread_safepoint_state_offset = 748;
+    AOT_Thread_safepoint_state_offset = 720;
 static constexpr dart::compiler::target::word
-    AOT_Thread_slow_type_test_stub_offset = 244;
+    AOT_Thread_slow_type_test_stub_offset = 248;
 static constexpr dart::compiler::target::word
-    AOT_Thread_slow_type_test_entry_point_offset = 324;
+    AOT_Thread_slow_type_test_entry_point_offset = 328;
 static constexpr dart::compiler::target::word AOT_Thread_stack_limit_offset =
     36;
 static constexpr dart::compiler::target::word
@@ -4417,13 +4498,13 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_stack_overflow_flags_offset = 64;
 static constexpr dart::compiler::target::word
-    AOT_Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 300;
+    AOT_Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 304;
 static constexpr dart::compiler::target::word
-    AOT_Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 208;
+    AOT_Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 212;
 static constexpr dart::compiler::target::word
-    AOT_Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 296;
+    AOT_Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 300;
 static constexpr dart::compiler::target::word
-    AOT_Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 204;
+    AOT_Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 208;
 static constexpr dart::compiler::target::word
     AOT_Thread_store_buffer_block_offset = 80;
 static constexpr dart::compiler::target::word
@@ -4437,11 +4518,11 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_write_barrier_code_offset = 124;
 static constexpr dart::compiler::target::word
-    AOT_Thread_write_barrier_entry_point_offset = 264;
+    AOT_Thread_write_barrier_entry_point_offset = 268;
 static constexpr dart::compiler::target::word
     AOT_Thread_write_barrier_mask_offset = 40;
 static constexpr dart::compiler::target::word AOT_Thread_callback_code_offset =
-    752;
+    724;
 static constexpr dart::compiler::target::word
     AOT_TimelineStream_enabled_offset = 8;
 static constexpr dart::compiler::target::word AOT_TwoByteString_data_offset =
@@ -4454,15 +4535,23 @@
 static constexpr dart::compiler::target::word AOT_Type_type_state_offset = 32;
 static constexpr dart::compiler::target::word AOT_Type_nullability_offset = 33;
 static constexpr dart::compiler::target::word
-    AOT_TypeParameter_parameterized_class_id_offset = 28;
+    AOT_TypeParameter_parameterized_class_id_offset = 32;
 static constexpr dart::compiler::target::word AOT_TypeParameter_index_offset =
-    36;
+    40;
 static constexpr dart::compiler::target::word
     AOT_TypeArguments_instantiations_offset = 4;
 static constexpr dart::compiler::target::word AOT_TypeArguments_length_offset =
     8;
 static constexpr dart::compiler::target::word
     AOT_TypeArguments_nullability_offset = 16;
+static constexpr dart::compiler::target::word AOT_TypeArguments_types_offset =
+    20;
+static constexpr dart::compiler::target::word AOT_TypeParameter_bound_offset =
+    20;
+static constexpr dart::compiler::target::word AOT_TypeParameter_flags_offset =
+    42;
+static constexpr dart::compiler::target::word AOT_TypeParameter_name_offset =
+    12;
 static constexpr dart::compiler::target::word AOT_TypeRef_type_offset = 12;
 static constexpr dart::compiler::target::word AOT_TypedDataBase_length_offset =
     8;
@@ -4496,16 +4585,15 @@
     4, 12, 8, 16};
 static constexpr dart::compiler::target::word
     AOT_Thread_write_barrier_wrappers_thread_offset[] = {
-        692, 696, 700, 704, 708, -1, 712, -1, 716, 720, -1, -1, -1, -1, -1, -1};
+        664, 668, 672, 676, 680, -1, 684, -1, 688, 692, -1, -1, -1, -1, -1, -1};
 static constexpr dart::compiler::target::word AOT_ApiError_InstanceSize = 8;
 static constexpr dart::compiler::target::word AOT_Array_InstanceSize = 12;
 static constexpr dart::compiler::target::word AOT_Array_header_size = 12;
 static constexpr dart::compiler::target::word AOT_Bool_InstanceSize = 8;
-static constexpr dart::compiler::target::word AOT_Bytecode_InstanceSize = 48;
 static constexpr dart::compiler::target::word AOT_Capability_InstanceSize = 16;
 static constexpr dart::compiler::target::word AOT_Class_InstanceSize = 112;
 static constexpr dart::compiler::target::word AOT_Closure_InstanceSize = 28;
-static constexpr dart::compiler::target::word AOT_ClosureData_InstanceSize = 20;
+static constexpr dart::compiler::target::word AOT_ClosureData_InstanceSize = 28;
 static constexpr dart::compiler::target::word AOT_Code_InstanceSize = 88;
 static constexpr dart::compiler::target::word AOT_CodeSourceMap_HeaderSize = 8;
 static constexpr dart::compiler::target::word
@@ -4543,7 +4631,7 @@
 static constexpr dart::compiler::target::word AOT_Int32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Integer_InstanceSize = 4;
 static constexpr dart::compiler::target::word
-    AOT_KernelProgramInfo_InstanceSize = 64;
+    AOT_KernelProgramInfo_InstanceSize = 60;
 static constexpr dart::compiler::target::word AOT_LanguageError_InstanceSize =
     28;
 static constexpr dart::compiler::target::word AOT_Library_InstanceSize = 80;
@@ -4568,12 +4656,10 @@
 static constexpr dart::compiler::target::word AOT_ObjectPool_InstanceSize = 8;
 static constexpr dart::compiler::target::word AOT_OneByteString_InstanceSize =
     12;
-static constexpr dart::compiler::target::word
-    AOT_ParameterTypeCheck_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_PatchClass_InstanceSize = 20;
 static constexpr dart::compiler::target::word AOT_PcDescriptors_HeaderSize = 8;
 static constexpr dart::compiler::target::word AOT_Pointer_InstanceSize = 12;
-static constexpr dart::compiler::target::word AOT_ReceivePort_InstanceSize = 12;
+static constexpr dart::compiler::target::word AOT_ReceivePort_InstanceSize = 20;
 static constexpr dart::compiler::target::word AOT_RedirectionData_InstanceSize =
     16;
 static constexpr dart::compiler::target::word AOT_RegExp_InstanceSize = 60;
@@ -4597,7 +4683,7 @@
 static constexpr dart::compiler::target::word AOT_TypeArguments_InstanceSize =
     20;
 static constexpr dart::compiler::target::word AOT_TypeParameter_InstanceSize =
-    40;
+    44;
 static constexpr dart::compiler::target::word AOT_TypeRef_InstanceSize = 16;
 static constexpr dart::compiler::target::word AOT_TypedData_InstanceSize = 12;
 static constexpr dart::compiler::target::word AOT_TypedDataBase_InstanceSize =
@@ -4658,6 +4744,8 @@
     AOT_SubtypeTestCache_kTestEntryLength = 7;
 static constexpr dart::compiler::target::word AOT_SubtypeTestCache_kTestResult =
     0;
+static constexpr dart::compiler::target::word AOT_TypeArguments_kMaxElements =
+    576460752303423487;
 static constexpr dart::compiler::target::word
     AOT_AbstractType_type_test_stub_entry_point_offset = 8;
 static constexpr dart::compiler::target::word
@@ -4699,6 +4787,10 @@
 static constexpr dart::compiler::target::word AOT_Closure_hash_offset = 48;
 static constexpr dart::compiler::target::word
     AOT_Closure_instantiator_type_arguments_offset = 8;
+static constexpr dart::compiler::target::word
+    AOT_ClosureData_default_type_arguments_offset = 40;
+static constexpr dart::compiler::target::word
+    AOT_ClosureData_default_type_arguments_info_offset = 48;
 static constexpr dart::compiler::target::word AOT_Code_object_pool_offset = 40;
 static constexpr dart::compiler::target::word
     AOT_Code_saved_instructions_offset = 48;
@@ -4725,8 +4817,10 @@
 static constexpr dart::compiler::target::word AOT_Field_is_nullable_offset = 74;
 static constexpr dart::compiler::target::word AOT_Field_kind_bits_offset = 78;
 static constexpr dart::compiler::target::word AOT_Function_code_offset = 88;
+static constexpr dart::compiler::target::word AOT_Function_data_offset = 72;
 static constexpr dart::compiler::target::word
     AOT_Function_entry_point_offset[] = {8, 16};
+static constexpr dart::compiler::target::word AOT_Function_kind_tag_offset = 96;
 static constexpr dart::compiler::target::word
     AOT_Function_packed_fields_offset = 100;
 static constexpr dart::compiler::target::word
@@ -4829,75 +4923,75 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_AllocateArray_entry_point_offset = 736;
 static constexpr dart::compiler::target::word
-    AOT_Thread_active_exception_offset = 1456;
+    AOT_Thread_active_exception_offset = 1400;
 static constexpr dart::compiler::target::word
-    AOT_Thread_active_stacktrace_offset = 1464;
+    AOT_Thread_active_stacktrace_offset = 1408;
 static constexpr dart::compiler::target::word
     AOT_Thread_array_write_barrier_code_offset = 240;
 static constexpr dart::compiler::target::word
-    AOT_Thread_array_write_barrier_entry_point_offset = 520;
+    AOT_Thread_array_write_barrier_entry_point_offset = 528;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_mint_with_fpu_regs_entry_point_offset = 536;
+    AOT_Thread_allocate_mint_with_fpu_regs_entry_point_offset = 544;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_mint_with_fpu_regs_stub_offset = 352;
+    AOT_Thread_allocate_mint_with_fpu_regs_stub_offset = 360;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_mint_without_fpu_regs_entry_point_offset = 544;
+    AOT_Thread_allocate_mint_without_fpu_regs_entry_point_offset = 552;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_mint_without_fpu_regs_stub_offset = 360;
+    AOT_Thread_allocate_mint_without_fpu_regs_stub_offset = 368;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_entry_point_offset = 552;
+    AOT_Thread_allocate_object_entry_point_offset = 560;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_stub_offset = 368;
+    AOT_Thread_allocate_object_stub_offset = 376;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_parameterized_entry_point_offset = 560;
+    AOT_Thread_allocate_object_parameterized_entry_point_offset = 568;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_parameterized_stub_offset = 376;
+    AOT_Thread_allocate_object_parameterized_stub_offset = 384;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_slow_entry_point_offset = 568;
+    AOT_Thread_allocate_object_slow_entry_point_offset = 576;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_slow_stub_offset = 384;
+    AOT_Thread_allocate_object_slow_stub_offset = 392;
 static constexpr dart::compiler::target::word AOT_Thread_api_top_scope_offset =
-    1528;
+    1472;
 static constexpr dart::compiler::target::word
     AOT_Thread_async_stack_trace_offset = 192;
 static constexpr dart::compiler::target::word
-    AOT_Thread_auto_scope_native_wrapper_entry_point_offset = 656;
+    AOT_Thread_auto_scope_native_wrapper_entry_point_offset = 664;
 static constexpr dart::compiler::target::word AOT_Thread_bool_false_offset =
     224;
 static constexpr dart::compiler::target::word AOT_Thread_bool_true_offset = 216;
 static constexpr dart::compiler::target::word
-    AOT_Thread_bootstrap_native_wrapper_entry_point_offset = 640;
+    AOT_Thread_bootstrap_native_wrapper_entry_point_offset = 648;
 static constexpr dart::compiler::target::word
-    AOT_Thread_call_to_runtime_entry_point_offset = 528;
+    AOT_Thread_call_to_runtime_entry_point_offset = 536;
 static constexpr dart::compiler::target::word
-    AOT_Thread_call_to_runtime_stub_offset = 280;
+    AOT_Thread_call_to_runtime_stub_offset = 272;
 static constexpr dart::compiler::target::word AOT_Thread_dart_stream_offset =
-    1544;
+    1488;
 static constexpr dart::compiler::target::word
     AOT_Thread_dispatch_table_array_offset = 96;
 static constexpr dart::compiler::target::word AOT_Thread_optimize_entry_offset =
-    608;
+    616;
 static constexpr dart::compiler::target::word AOT_Thread_optimize_stub_offset =
-    440;
+    448;
 static constexpr dart::compiler::target::word
-    AOT_Thread_deoptimize_entry_offset = 616;
+    AOT_Thread_deoptimize_entry_offset = 624;
 static constexpr dart::compiler::target::word
-    AOT_Thread_deoptimize_stub_offset = 448;
+    AOT_Thread_deoptimize_stub_offset = 456;
 static constexpr dart::compiler::target::word
     AOT_Thread_double_abs_address_offset = 696;
 static constexpr dart::compiler::target::word
     AOT_Thread_double_negate_address_offset = 688;
 static constexpr dart::compiler::target::word AOT_Thread_end_offset = 112;
 static constexpr dart::compiler::target::word
-    AOT_Thread_enter_safepoint_stub_offset = 488;
+    AOT_Thread_enter_safepoint_stub_offset = 496;
 static constexpr dart::compiler::target::word
-    AOT_Thread_execution_state_offset = 1496;
+    AOT_Thread_execution_state_offset = 1440;
 static constexpr dart::compiler::target::word
-    AOT_Thread_exit_safepoint_stub_offset = 496;
+    AOT_Thread_exit_safepoint_stub_offset = 504;
 static constexpr dart::compiler::target::word
-    AOT_Thread_call_native_through_safepoint_stub_offset = 504;
+    AOT_Thread_call_native_through_safepoint_stub_offset = 512;
 static constexpr dart::compiler::target::word
-    AOT_Thread_call_native_through_safepoint_entry_point_offset = 624;
+    AOT_Thread_call_native_through_safepoint_entry_point_offset = 632;
 static constexpr dart::compiler::target::word
     AOT_Thread_fix_allocation_stub_code_offset = 256;
 static constexpr dart::compiler::target::word
@@ -4911,64 +5005,65 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_float_zerow_address_offset = 728;
 static constexpr dart::compiler::target::word
-    AOT_Thread_global_object_pool_offset = 1472;
-static constexpr dart::compiler::target::word
-    AOT_Thread_interpret_call_entry_point_offset = 664;
-static constexpr dart::compiler::target::word
-    AOT_Thread_invoke_dart_code_from_bytecode_stub_offset = 272;
+    AOT_Thread_global_object_pool_offset = 1416;
 static constexpr dart::compiler::target::word
     AOT_Thread_invoke_dart_code_stub_offset = 264;
 static constexpr dart::compiler::target::word
-    AOT_Thread_exit_through_ffi_offset = 1520;
+    AOT_Thread_exit_through_ffi_offset = 1464;
 static constexpr dart::compiler::target::word AOT_Thread_isolate_offset = 88;
 static constexpr dart::compiler::target::word
     AOT_Thread_field_table_values_offset = 136;
 static constexpr dart::compiler::target::word
-    AOT_Thread_lazy_deopt_from_return_stub_offset = 456;
+    AOT_Thread_lazy_deopt_from_return_stub_offset = 464;
 static constexpr dart::compiler::target::word
-    AOT_Thread_lazy_deopt_from_throw_stub_offset = 464;
+    AOT_Thread_lazy_deopt_from_throw_stub_offset = 472;
 static constexpr dart::compiler::target::word
-    AOT_Thread_lazy_specialize_type_test_stub_offset = 480;
+    AOT_Thread_lazy_specialize_type_test_stub_offset = 488;
 static constexpr dart::compiler::target::word
     AOT_Thread_marking_stack_block_offset = 168;
 static constexpr dart::compiler::target::word
-    AOT_Thread_megamorphic_call_checked_entry_offset = 592;
+    AOT_Thread_megamorphic_call_checked_entry_offset = 600;
 static constexpr dart::compiler::target::word
-    AOT_Thread_switchable_call_miss_entry_offset = 600;
+    AOT_Thread_switchable_call_miss_entry_offset = 608;
 static constexpr dart::compiler::target::word
-    AOT_Thread_switchable_call_miss_stub_offset = 408;
+    AOT_Thread_switchable_call_miss_stub_offset = 416;
 static constexpr dart::compiler::target::word
-    AOT_Thread_no_scope_native_wrapper_entry_point_offset = 648;
+    AOT_Thread_no_scope_native_wrapper_entry_point_offset = 656;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_error_shared_with_fpu_regs_stub_offset = 296;
+    AOT_Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 288;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_error_shared_without_fpu_regs_stub_offset = 288;
+    AOT_Thread_late_initialization_error_shared_without_fpu_regs_stub_offset =
+        280;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 312;
+    AOT_Thread_null_error_shared_with_fpu_regs_stub_offset = 304;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 304;
+    AOT_Thread_null_error_shared_without_fpu_regs_stub_offset = 296;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 328;
+    AOT_Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 320;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 320;
+    AOT_Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 312;
 static constexpr dart::compiler::target::word
-    AOT_Thread_range_error_shared_with_fpu_regs_stub_offset = 344;
+    AOT_Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 336;
 static constexpr dart::compiler::target::word
-    AOT_Thread_range_error_shared_without_fpu_regs_stub_offset = 336;
+    AOT_Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 328;
+static constexpr dart::compiler::target::word
+    AOT_Thread_range_error_shared_with_fpu_regs_stub_offset = 352;
+static constexpr dart::compiler::target::word
+    AOT_Thread_range_error_shared_without_fpu_regs_stub_offset = 344;
 static constexpr dart::compiler::target::word AOT_Thread_object_null_offset =
     208;
 static constexpr dart::compiler::target::word
     AOT_Thread_predefined_symbols_address_offset = 672;
 static constexpr dart::compiler::target::word AOT_Thread_resume_pc_offset =
-    1480;
+    1424;
 static constexpr dart::compiler::target::word
-    AOT_Thread_saved_shadow_call_stack_offset = 1488;
+    AOT_Thread_saved_shadow_call_stack_offset = 1432;
 static constexpr dart::compiler::target::word
-    AOT_Thread_safepoint_state_offset = 1504;
+    AOT_Thread_safepoint_state_offset = 1448;
 static constexpr dart::compiler::target::word
-    AOT_Thread_slow_type_test_stub_offset = 472;
+    AOT_Thread_slow_type_test_stub_offset = 480;
 static constexpr dart::compiler::target::word
-    AOT_Thread_slow_type_test_entry_point_offset = 632;
+    AOT_Thread_slow_type_test_entry_point_offset = 640;
 static constexpr dart::compiler::target::word AOT_Thread_stack_limit_offset =
     72;
 static constexpr dart::compiler::target::word
@@ -4976,13 +5071,13 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_stack_overflow_flags_offset = 128;
 static constexpr dart::compiler::target::word
-    AOT_Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 584;
+    AOT_Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 592;
 static constexpr dart::compiler::target::word
-    AOT_Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 400;
+    AOT_Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 408;
 static constexpr dart::compiler::target::word
-    AOT_Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 576;
+    AOT_Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 584;
 static constexpr dart::compiler::target::word
-    AOT_Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 392;
+    AOT_Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 400;
 static constexpr dart::compiler::target::word
     AOT_Thread_store_buffer_block_offset = 160;
 static constexpr dart::compiler::target::word
@@ -4996,11 +5091,11 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_write_barrier_code_offset = 232;
 static constexpr dart::compiler::target::word
-    AOT_Thread_write_barrier_entry_point_offset = 512;
+    AOT_Thread_write_barrier_entry_point_offset = 520;
 static constexpr dart::compiler::target::word
     AOT_Thread_write_barrier_mask_offset = 80;
 static constexpr dart::compiler::target::word AOT_Thread_callback_code_offset =
-    1512;
+    1456;
 static constexpr dart::compiler::target::word
     AOT_TimelineStream_enabled_offset = 16;
 static constexpr dart::compiler::target::word AOT_TwoByteString_data_offset =
@@ -5013,15 +5108,23 @@
 static constexpr dart::compiler::target::word AOT_Type_type_state_offset = 60;
 static constexpr dart::compiler::target::word AOT_Type_nullability_offset = 61;
 static constexpr dart::compiler::target::word
-    AOT_TypeParameter_parameterized_class_id_offset = 56;
+    AOT_TypeParameter_parameterized_class_id_offset = 64;
 static constexpr dart::compiler::target::word AOT_TypeParameter_index_offset =
-    64;
+    72;
 static constexpr dart::compiler::target::word
     AOT_TypeArguments_instantiations_offset = 8;
 static constexpr dart::compiler::target::word AOT_TypeArguments_length_offset =
     16;
 static constexpr dart::compiler::target::word
     AOT_TypeArguments_nullability_offset = 32;
+static constexpr dart::compiler::target::word AOT_TypeArguments_types_offset =
+    40;
+static constexpr dart::compiler::target::word AOT_TypeParameter_bound_offset =
+    40;
+static constexpr dart::compiler::target::word AOT_TypeParameter_flags_offset =
+    74;
+static constexpr dart::compiler::target::word AOT_TypeParameter_name_offset =
+    24;
 static constexpr dart::compiler::target::word AOT_TypeRef_type_offset = 24;
 static constexpr dart::compiler::target::word AOT_TypedDataBase_length_offset =
     16;
@@ -5055,17 +5158,16 @@
     8, 24, 16, 32};
 static constexpr dart::compiler::target::word
     AOT_Thread_write_barrier_wrappers_thread_offset[] = {
-        1368, 1376, 1384, 1392, -1,   -1,   1400, 1408,
-        1416, 1424, 1432, -1,   1440, 1448, -1,   -1};
+        1312, 1320, 1328, 1336, -1,   -1,   1344, 1352,
+        1360, 1368, 1376, -1,   1384, 1392, -1,   -1};
 static constexpr dart::compiler::target::word AOT_ApiError_InstanceSize = 16;
 static constexpr dart::compiler::target::word AOT_Array_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Array_header_size = 24;
 static constexpr dart::compiler::target::word AOT_Bool_InstanceSize = 12;
-static constexpr dart::compiler::target::word AOT_Bytecode_InstanceSize = 88;
 static constexpr dart::compiler::target::word AOT_Capability_InstanceSize = 16;
 static constexpr dart::compiler::target::word AOT_Class_InstanceSize = 192;
 static constexpr dart::compiler::target::word AOT_Closure_InstanceSize = 56;
-static constexpr dart::compiler::target::word AOT_ClosureData_InstanceSize = 40;
+static constexpr dart::compiler::target::word AOT_ClosureData_InstanceSize = 56;
 static constexpr dart::compiler::target::word AOT_Code_InstanceSize = 152;
 static constexpr dart::compiler::target::word AOT_CodeSourceMap_HeaderSize = 16;
 static constexpr dart::compiler::target::word
@@ -5103,7 +5205,7 @@
 static constexpr dart::compiler::target::word AOT_Int32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Integer_InstanceSize = 8;
 static constexpr dart::compiler::target::word
-    AOT_KernelProgramInfo_InstanceSize = 128;
+    AOT_KernelProgramInfo_InstanceSize = 120;
 static constexpr dart::compiler::target::word AOT_LanguageError_InstanceSize =
     48;
 static constexpr dart::compiler::target::word AOT_Library_InstanceSize = 152;
@@ -5128,12 +5230,10 @@
 static constexpr dart::compiler::target::word AOT_ObjectPool_InstanceSize = 16;
 static constexpr dart::compiler::target::word AOT_OneByteString_InstanceSize =
     16;
-static constexpr dart::compiler::target::word
-    AOT_ParameterTypeCheck_InstanceSize = 48;
 static constexpr dart::compiler::target::word AOT_PatchClass_InstanceSize = 40;
 static constexpr dart::compiler::target::word AOT_PcDescriptors_HeaderSize = 16;
 static constexpr dart::compiler::target::word AOT_Pointer_InstanceSize = 24;
-static constexpr dart::compiler::target::word AOT_ReceivePort_InstanceSize = 24;
+static constexpr dart::compiler::target::word AOT_ReceivePort_InstanceSize = 40;
 static constexpr dart::compiler::target::word AOT_RedirectionData_InstanceSize =
     32;
 static constexpr dart::compiler::target::word AOT_RegExp_InstanceSize = 120;
@@ -5157,7 +5257,7 @@
 static constexpr dart::compiler::target::word AOT_TypeArguments_InstanceSize =
     40;
 static constexpr dart::compiler::target::word AOT_TypeParameter_InstanceSize =
-    72;
+    80;
 static constexpr dart::compiler::target::word AOT_TypeRef_InstanceSize = 32;
 static constexpr dart::compiler::target::word AOT_TypedData_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_TypedDataBase_InstanceSize =
@@ -5221,6 +5321,8 @@
     AOT_SubtypeTestCache_kTestEntryLength = 7;
 static constexpr dart::compiler::target::word AOT_SubtypeTestCache_kTestResult =
     0;
+static constexpr dart::compiler::target::word AOT_TypeArguments_kMaxElements =
+    576460752303423487;
 static constexpr dart::compiler::target::word
     AOT_AbstractType_type_test_stub_entry_point_offset = 8;
 static constexpr dart::compiler::target::word
@@ -5262,6 +5364,10 @@
 static constexpr dart::compiler::target::word AOT_Closure_hash_offset = 48;
 static constexpr dart::compiler::target::word
     AOT_Closure_instantiator_type_arguments_offset = 8;
+static constexpr dart::compiler::target::word
+    AOT_ClosureData_default_type_arguments_offset = 40;
+static constexpr dart::compiler::target::word
+    AOT_ClosureData_default_type_arguments_info_offset = 48;
 static constexpr dart::compiler::target::word AOT_Code_object_pool_offset = 40;
 static constexpr dart::compiler::target::word
     AOT_Code_saved_instructions_offset = 48;
@@ -5288,8 +5394,10 @@
 static constexpr dart::compiler::target::word AOT_Field_is_nullable_offset = 74;
 static constexpr dart::compiler::target::word AOT_Field_kind_bits_offset = 78;
 static constexpr dart::compiler::target::word AOT_Function_code_offset = 88;
+static constexpr dart::compiler::target::word AOT_Function_data_offset = 72;
 static constexpr dart::compiler::target::word
     AOT_Function_entry_point_offset[] = {8, 16};
+static constexpr dart::compiler::target::word AOT_Function_kind_tag_offset = 96;
 static constexpr dart::compiler::target::word
     AOT_Function_packed_fields_offset = 100;
 static constexpr dart::compiler::target::word
@@ -5392,75 +5500,75 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_AllocateArray_entry_point_offset = 736;
 static constexpr dart::compiler::target::word
-    AOT_Thread_active_exception_offset = 1528;
+    AOT_Thread_active_exception_offset = 1472;
 static constexpr dart::compiler::target::word
-    AOT_Thread_active_stacktrace_offset = 1536;
+    AOT_Thread_active_stacktrace_offset = 1480;
 static constexpr dart::compiler::target::word
     AOT_Thread_array_write_barrier_code_offset = 240;
 static constexpr dart::compiler::target::word
-    AOT_Thread_array_write_barrier_entry_point_offset = 520;
+    AOT_Thread_array_write_barrier_entry_point_offset = 528;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_mint_with_fpu_regs_entry_point_offset = 536;
+    AOT_Thread_allocate_mint_with_fpu_regs_entry_point_offset = 544;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_mint_with_fpu_regs_stub_offset = 352;
+    AOT_Thread_allocate_mint_with_fpu_regs_stub_offset = 360;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_mint_without_fpu_regs_entry_point_offset = 544;
+    AOT_Thread_allocate_mint_without_fpu_regs_entry_point_offset = 552;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_mint_without_fpu_regs_stub_offset = 360;
+    AOT_Thread_allocate_mint_without_fpu_regs_stub_offset = 368;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_entry_point_offset = 552;
+    AOT_Thread_allocate_object_entry_point_offset = 560;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_stub_offset = 368;
+    AOT_Thread_allocate_object_stub_offset = 376;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_parameterized_entry_point_offset = 560;
+    AOT_Thread_allocate_object_parameterized_entry_point_offset = 568;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_parameterized_stub_offset = 376;
+    AOT_Thread_allocate_object_parameterized_stub_offset = 384;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_slow_entry_point_offset = 568;
+    AOT_Thread_allocate_object_slow_entry_point_offset = 576;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_slow_stub_offset = 384;
+    AOT_Thread_allocate_object_slow_stub_offset = 392;
 static constexpr dart::compiler::target::word AOT_Thread_api_top_scope_offset =
-    1600;
+    1544;
 static constexpr dart::compiler::target::word
     AOT_Thread_async_stack_trace_offset = 192;
 static constexpr dart::compiler::target::word
-    AOT_Thread_auto_scope_native_wrapper_entry_point_offset = 656;
+    AOT_Thread_auto_scope_native_wrapper_entry_point_offset = 664;
 static constexpr dart::compiler::target::word AOT_Thread_bool_false_offset =
     224;
 static constexpr dart::compiler::target::word AOT_Thread_bool_true_offset = 216;
 static constexpr dart::compiler::target::word
-    AOT_Thread_bootstrap_native_wrapper_entry_point_offset = 640;
+    AOT_Thread_bootstrap_native_wrapper_entry_point_offset = 648;
 static constexpr dart::compiler::target::word
-    AOT_Thread_call_to_runtime_entry_point_offset = 528;
+    AOT_Thread_call_to_runtime_entry_point_offset = 536;
 static constexpr dart::compiler::target::word
-    AOT_Thread_call_to_runtime_stub_offset = 280;
+    AOT_Thread_call_to_runtime_stub_offset = 272;
 static constexpr dart::compiler::target::word AOT_Thread_dart_stream_offset =
-    1616;
+    1560;
 static constexpr dart::compiler::target::word
     AOT_Thread_dispatch_table_array_offset = 96;
 static constexpr dart::compiler::target::word AOT_Thread_optimize_entry_offset =
-    608;
+    616;
 static constexpr dart::compiler::target::word AOT_Thread_optimize_stub_offset =
-    440;
+    448;
 static constexpr dart::compiler::target::word
-    AOT_Thread_deoptimize_entry_offset = 616;
+    AOT_Thread_deoptimize_entry_offset = 624;
 static constexpr dart::compiler::target::word
-    AOT_Thread_deoptimize_stub_offset = 448;
+    AOT_Thread_deoptimize_stub_offset = 456;
 static constexpr dart::compiler::target::word
     AOT_Thread_double_abs_address_offset = 696;
 static constexpr dart::compiler::target::word
     AOT_Thread_double_negate_address_offset = 688;
 static constexpr dart::compiler::target::word AOT_Thread_end_offset = 112;
 static constexpr dart::compiler::target::word
-    AOT_Thread_enter_safepoint_stub_offset = 488;
+    AOT_Thread_enter_safepoint_stub_offset = 496;
 static constexpr dart::compiler::target::word
-    AOT_Thread_execution_state_offset = 1568;
+    AOT_Thread_execution_state_offset = 1512;
 static constexpr dart::compiler::target::word
-    AOT_Thread_exit_safepoint_stub_offset = 496;
+    AOT_Thread_exit_safepoint_stub_offset = 504;
 static constexpr dart::compiler::target::word
-    AOT_Thread_call_native_through_safepoint_stub_offset = 504;
+    AOT_Thread_call_native_through_safepoint_stub_offset = 512;
 static constexpr dart::compiler::target::word
-    AOT_Thread_call_native_through_safepoint_entry_point_offset = 624;
+    AOT_Thread_call_native_through_safepoint_entry_point_offset = 632;
 static constexpr dart::compiler::target::word
     AOT_Thread_fix_allocation_stub_code_offset = 256;
 static constexpr dart::compiler::target::word
@@ -5474,64 +5582,65 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_float_zerow_address_offset = 728;
 static constexpr dart::compiler::target::word
-    AOT_Thread_global_object_pool_offset = 1544;
-static constexpr dart::compiler::target::word
-    AOT_Thread_interpret_call_entry_point_offset = 664;
-static constexpr dart::compiler::target::word
-    AOT_Thread_invoke_dart_code_from_bytecode_stub_offset = 272;
+    AOT_Thread_global_object_pool_offset = 1488;
 static constexpr dart::compiler::target::word
     AOT_Thread_invoke_dart_code_stub_offset = 264;
 static constexpr dart::compiler::target::word
-    AOT_Thread_exit_through_ffi_offset = 1592;
+    AOT_Thread_exit_through_ffi_offset = 1536;
 static constexpr dart::compiler::target::word AOT_Thread_isolate_offset = 88;
 static constexpr dart::compiler::target::word
     AOT_Thread_field_table_values_offset = 136;
 static constexpr dart::compiler::target::word
-    AOT_Thread_lazy_deopt_from_return_stub_offset = 456;
+    AOT_Thread_lazy_deopt_from_return_stub_offset = 464;
 static constexpr dart::compiler::target::word
-    AOT_Thread_lazy_deopt_from_throw_stub_offset = 464;
+    AOT_Thread_lazy_deopt_from_throw_stub_offset = 472;
 static constexpr dart::compiler::target::word
-    AOT_Thread_lazy_specialize_type_test_stub_offset = 480;
+    AOT_Thread_lazy_specialize_type_test_stub_offset = 488;
 static constexpr dart::compiler::target::word
     AOT_Thread_marking_stack_block_offset = 168;
 static constexpr dart::compiler::target::word
-    AOT_Thread_megamorphic_call_checked_entry_offset = 592;
+    AOT_Thread_megamorphic_call_checked_entry_offset = 600;
 static constexpr dart::compiler::target::word
-    AOT_Thread_switchable_call_miss_entry_offset = 600;
+    AOT_Thread_switchable_call_miss_entry_offset = 608;
 static constexpr dart::compiler::target::word
-    AOT_Thread_switchable_call_miss_stub_offset = 408;
+    AOT_Thread_switchable_call_miss_stub_offset = 416;
 static constexpr dart::compiler::target::word
-    AOT_Thread_no_scope_native_wrapper_entry_point_offset = 648;
+    AOT_Thread_no_scope_native_wrapper_entry_point_offset = 656;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_error_shared_with_fpu_regs_stub_offset = 296;
+    AOT_Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 288;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_error_shared_without_fpu_regs_stub_offset = 288;
+    AOT_Thread_late_initialization_error_shared_without_fpu_regs_stub_offset =
+        280;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 312;
+    AOT_Thread_null_error_shared_with_fpu_regs_stub_offset = 304;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 304;
+    AOT_Thread_null_error_shared_without_fpu_regs_stub_offset = 296;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 328;
+    AOT_Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 320;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 320;
+    AOT_Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 312;
 static constexpr dart::compiler::target::word
-    AOT_Thread_range_error_shared_with_fpu_regs_stub_offset = 344;
+    AOT_Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 336;
 static constexpr dart::compiler::target::word
-    AOT_Thread_range_error_shared_without_fpu_regs_stub_offset = 336;
+    AOT_Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 328;
+static constexpr dart::compiler::target::word
+    AOT_Thread_range_error_shared_with_fpu_regs_stub_offset = 352;
+static constexpr dart::compiler::target::word
+    AOT_Thread_range_error_shared_without_fpu_regs_stub_offset = 344;
 static constexpr dart::compiler::target::word AOT_Thread_object_null_offset =
     208;
 static constexpr dart::compiler::target::word
     AOT_Thread_predefined_symbols_address_offset = 672;
 static constexpr dart::compiler::target::word AOT_Thread_resume_pc_offset =
-    1552;
+    1496;
 static constexpr dart::compiler::target::word
-    AOT_Thread_saved_shadow_call_stack_offset = 1560;
+    AOT_Thread_saved_shadow_call_stack_offset = 1504;
 static constexpr dart::compiler::target::word
-    AOT_Thread_safepoint_state_offset = 1576;
+    AOT_Thread_safepoint_state_offset = 1520;
 static constexpr dart::compiler::target::word
-    AOT_Thread_slow_type_test_stub_offset = 472;
+    AOT_Thread_slow_type_test_stub_offset = 480;
 static constexpr dart::compiler::target::word
-    AOT_Thread_slow_type_test_entry_point_offset = 632;
+    AOT_Thread_slow_type_test_entry_point_offset = 640;
 static constexpr dart::compiler::target::word AOT_Thread_stack_limit_offset =
     72;
 static constexpr dart::compiler::target::word
@@ -5539,13 +5648,13 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_stack_overflow_flags_offset = 128;
 static constexpr dart::compiler::target::word
-    AOT_Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 584;
+    AOT_Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 592;
 static constexpr dart::compiler::target::word
-    AOT_Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 400;
+    AOT_Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 408;
 static constexpr dart::compiler::target::word
-    AOT_Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 576;
+    AOT_Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 584;
 static constexpr dart::compiler::target::word
-    AOT_Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 392;
+    AOT_Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 400;
 static constexpr dart::compiler::target::word
     AOT_Thread_store_buffer_block_offset = 160;
 static constexpr dart::compiler::target::word
@@ -5559,11 +5668,11 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_write_barrier_code_offset = 232;
 static constexpr dart::compiler::target::word
-    AOT_Thread_write_barrier_entry_point_offset = 512;
+    AOT_Thread_write_barrier_entry_point_offset = 520;
 static constexpr dart::compiler::target::word
     AOT_Thread_write_barrier_mask_offset = 80;
 static constexpr dart::compiler::target::word AOT_Thread_callback_code_offset =
-    1584;
+    1528;
 static constexpr dart::compiler::target::word
     AOT_TimelineStream_enabled_offset = 16;
 static constexpr dart::compiler::target::word AOT_TwoByteString_data_offset =
@@ -5576,15 +5685,23 @@
 static constexpr dart::compiler::target::word AOT_Type_type_state_offset = 60;
 static constexpr dart::compiler::target::word AOT_Type_nullability_offset = 61;
 static constexpr dart::compiler::target::word
-    AOT_TypeParameter_parameterized_class_id_offset = 56;
+    AOT_TypeParameter_parameterized_class_id_offset = 64;
 static constexpr dart::compiler::target::word AOT_TypeParameter_index_offset =
-    64;
+    72;
 static constexpr dart::compiler::target::word
     AOT_TypeArguments_instantiations_offset = 8;
 static constexpr dart::compiler::target::word AOT_TypeArguments_length_offset =
     16;
 static constexpr dart::compiler::target::word
     AOT_TypeArguments_nullability_offset = 32;
+static constexpr dart::compiler::target::word AOT_TypeArguments_types_offset =
+    40;
+static constexpr dart::compiler::target::word AOT_TypeParameter_bound_offset =
+    40;
+static constexpr dart::compiler::target::word AOT_TypeParameter_flags_offset =
+    74;
+static constexpr dart::compiler::target::word AOT_TypeParameter_name_offset =
+    24;
 static constexpr dart::compiler::target::word AOT_TypeRef_type_offset = 24;
 static constexpr dart::compiler::target::word AOT_TypedDataBase_length_offset =
     16;
@@ -5618,18 +5735,17 @@
     8, 24, 16, 32};
 static constexpr dart::compiler::target::word
     AOT_Thread_write_barrier_wrappers_thread_offset[] = {
-        1368, 1376, 1384, 1392, 1400, 1408, 1416, 1424, 1432, 1440, 1448,
-        1456, 1464, 1472, 1480, -1,   -1,   -1,   -1,   1488, 1496, -1,
-        -1,   1504, 1512, 1520, -1,   -1,   -1,   -1,   -1,   -1};
+        1312, 1320, 1328, 1336, 1344, 1352, 1360, 1368, 1376, 1384, 1392,
+        1400, 1408, 1416, 1424, -1,   -1,   -1,   -1,   1432, 1440, -1,
+        -1,   1448, 1456, 1464, -1,   -1,   -1,   -1,   -1,   -1};
 static constexpr dart::compiler::target::word AOT_ApiError_InstanceSize = 16;
 static constexpr dart::compiler::target::word AOT_Array_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Array_header_size = 24;
 static constexpr dart::compiler::target::word AOT_Bool_InstanceSize = 12;
-static constexpr dart::compiler::target::word AOT_Bytecode_InstanceSize = 88;
 static constexpr dart::compiler::target::word AOT_Capability_InstanceSize = 16;
 static constexpr dart::compiler::target::word AOT_Class_InstanceSize = 192;
 static constexpr dart::compiler::target::word AOT_Closure_InstanceSize = 56;
-static constexpr dart::compiler::target::word AOT_ClosureData_InstanceSize = 40;
+static constexpr dart::compiler::target::word AOT_ClosureData_InstanceSize = 56;
 static constexpr dart::compiler::target::word AOT_Code_InstanceSize = 152;
 static constexpr dart::compiler::target::word AOT_CodeSourceMap_HeaderSize = 16;
 static constexpr dart::compiler::target::word
@@ -5667,7 +5783,7 @@
 static constexpr dart::compiler::target::word AOT_Int32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Integer_InstanceSize = 8;
 static constexpr dart::compiler::target::word
-    AOT_KernelProgramInfo_InstanceSize = 128;
+    AOT_KernelProgramInfo_InstanceSize = 120;
 static constexpr dart::compiler::target::word AOT_LanguageError_InstanceSize =
     48;
 static constexpr dart::compiler::target::word AOT_Library_InstanceSize = 152;
@@ -5692,12 +5808,10 @@
 static constexpr dart::compiler::target::word AOT_ObjectPool_InstanceSize = 16;
 static constexpr dart::compiler::target::word AOT_OneByteString_InstanceSize =
     16;
-static constexpr dart::compiler::target::word
-    AOT_ParameterTypeCheck_InstanceSize = 48;
 static constexpr dart::compiler::target::word AOT_PatchClass_InstanceSize = 40;
 static constexpr dart::compiler::target::word AOT_PcDescriptors_HeaderSize = 16;
 static constexpr dart::compiler::target::word AOT_Pointer_InstanceSize = 24;
-static constexpr dart::compiler::target::word AOT_ReceivePort_InstanceSize = 24;
+static constexpr dart::compiler::target::word AOT_ReceivePort_InstanceSize = 40;
 static constexpr dart::compiler::target::word AOT_RedirectionData_InstanceSize =
     32;
 static constexpr dart::compiler::target::word AOT_RegExp_InstanceSize = 120;
@@ -5721,7 +5835,7 @@
 static constexpr dart::compiler::target::word AOT_TypeArguments_InstanceSize =
     40;
 static constexpr dart::compiler::target::word AOT_TypeParameter_InstanceSize =
-    72;
+    80;
 static constexpr dart::compiler::target::word AOT_TypeRef_InstanceSize = 32;
 static constexpr dart::compiler::target::word AOT_TypedData_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_TypedDataBase_InstanceSize =
@@ -5783,6 +5897,8 @@
     AOT_SubtypeTestCache_kTestEntryLength = 7;
 static constexpr dart::compiler::target::word AOT_SubtypeTestCache_kTestResult =
     0;
+static constexpr dart::compiler::target::word AOT_TypeArguments_kMaxElements =
+    268435455;
 static constexpr dart::compiler::target::word
     AOT_AbstractType_type_test_stub_entry_point_offset = 4;
 static constexpr dart::compiler::target::word
@@ -5822,6 +5938,10 @@
 static constexpr dart::compiler::target::word AOT_Closure_hash_offset = 24;
 static constexpr dart::compiler::target::word
     AOT_Closure_instantiator_type_arguments_offset = 4;
+static constexpr dart::compiler::target::word
+    AOT_ClosureData_default_type_arguments_offset = 20;
+static constexpr dart::compiler::target::word
+    AOT_ClosureData_default_type_arguments_info_offset = 24;
 static constexpr dart::compiler::target::word AOT_Code_object_pool_offset = 20;
 static constexpr dart::compiler::target::word
     AOT_Code_saved_instructions_offset = 24;
@@ -5848,8 +5968,10 @@
 static constexpr dart::compiler::target::word AOT_Field_is_nullable_offset = 42;
 static constexpr dart::compiler::target::word AOT_Field_kind_bits_offset = 46;
 static constexpr dart::compiler::target::word AOT_Function_code_offset = 44;
+static constexpr dart::compiler::target::word AOT_Function_data_offset = 36;
 static constexpr dart::compiler::target::word
     AOT_Function_entry_point_offset[] = {4, 8};
+static constexpr dart::compiler::target::word AOT_Function_kind_tag_offset = 48;
 static constexpr dart::compiler::target::word
     AOT_Function_packed_fields_offset = 52;
 static constexpr dart::compiler::target::word
@@ -5950,75 +6072,75 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_AllocateArray_entry_point_offset = 376;
 static constexpr dart::compiler::target::word
-    AOT_Thread_active_exception_offset = 724;
+    AOT_Thread_active_exception_offset = 696;
 static constexpr dart::compiler::target::word
-    AOT_Thread_active_stacktrace_offset = 728;
+    AOT_Thread_active_stacktrace_offset = 700;
 static constexpr dart::compiler::target::word
     AOT_Thread_array_write_barrier_code_offset = 128;
 static constexpr dart::compiler::target::word
-    AOT_Thread_array_write_barrier_entry_point_offset = 268;
+    AOT_Thread_array_write_barrier_entry_point_offset = 272;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_mint_with_fpu_regs_entry_point_offset = 276;
+    AOT_Thread_allocate_mint_with_fpu_regs_entry_point_offset = 280;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_mint_with_fpu_regs_stub_offset = 184;
+    AOT_Thread_allocate_mint_with_fpu_regs_stub_offset = 188;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_mint_without_fpu_regs_entry_point_offset = 280;
+    AOT_Thread_allocate_mint_without_fpu_regs_entry_point_offset = 284;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_mint_without_fpu_regs_stub_offset = 188;
+    AOT_Thread_allocate_mint_without_fpu_regs_stub_offset = 192;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_entry_point_offset = 284;
+    AOT_Thread_allocate_object_entry_point_offset = 288;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_stub_offset = 192;
+    AOT_Thread_allocate_object_stub_offset = 196;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_parameterized_entry_point_offset = 288;
+    AOT_Thread_allocate_object_parameterized_entry_point_offset = 292;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_parameterized_stub_offset = 196;
+    AOT_Thread_allocate_object_parameterized_stub_offset = 200;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_slow_entry_point_offset = 292;
+    AOT_Thread_allocate_object_slow_entry_point_offset = 296;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_slow_stub_offset = 200;
+    AOT_Thread_allocate_object_slow_stub_offset = 204;
 static constexpr dart::compiler::target::word AOT_Thread_api_top_scope_offset =
-    760;
+    732;
 static constexpr dart::compiler::target::word
     AOT_Thread_async_stack_trace_offset = 96;
 static constexpr dart::compiler::target::word
-    AOT_Thread_auto_scope_native_wrapper_entry_point_offset = 336;
+    AOT_Thread_auto_scope_native_wrapper_entry_point_offset = 340;
 static constexpr dart::compiler::target::word AOT_Thread_bool_false_offset =
     120;
 static constexpr dart::compiler::target::word AOT_Thread_bool_true_offset = 116;
 static constexpr dart::compiler::target::word
-    AOT_Thread_bootstrap_native_wrapper_entry_point_offset = 328;
+    AOT_Thread_bootstrap_native_wrapper_entry_point_offset = 332;
 static constexpr dart::compiler::target::word
-    AOT_Thread_call_to_runtime_entry_point_offset = 272;
+    AOT_Thread_call_to_runtime_entry_point_offset = 276;
 static constexpr dart::compiler::target::word
-    AOT_Thread_call_to_runtime_stub_offset = 148;
+    AOT_Thread_call_to_runtime_stub_offset = 144;
 static constexpr dart::compiler::target::word AOT_Thread_dart_stream_offset =
-    768;
+    740;
 static constexpr dart::compiler::target::word
     AOT_Thread_dispatch_table_array_offset = 48;
 static constexpr dart::compiler::target::word AOT_Thread_optimize_entry_offset =
-    312;
+    316;
 static constexpr dart::compiler::target::word AOT_Thread_optimize_stub_offset =
-    228;
+    232;
 static constexpr dart::compiler::target::word
-    AOT_Thread_deoptimize_entry_offset = 316;
+    AOT_Thread_deoptimize_entry_offset = 320;
 static constexpr dart::compiler::target::word
-    AOT_Thread_deoptimize_stub_offset = 232;
+    AOT_Thread_deoptimize_stub_offset = 236;
 static constexpr dart::compiler::target::word
     AOT_Thread_double_abs_address_offset = 356;
 static constexpr dart::compiler::target::word
     AOT_Thread_double_negate_address_offset = 352;
 static constexpr dart::compiler::target::word AOT_Thread_end_offset = 56;
 static constexpr dart::compiler::target::word
-    AOT_Thread_enter_safepoint_stub_offset = 252;
+    AOT_Thread_enter_safepoint_stub_offset = 256;
 static constexpr dart::compiler::target::word
-    AOT_Thread_execution_state_offset = 744;
+    AOT_Thread_execution_state_offset = 716;
 static constexpr dart::compiler::target::word
-    AOT_Thread_exit_safepoint_stub_offset = 256;
+    AOT_Thread_exit_safepoint_stub_offset = 260;
 static constexpr dart::compiler::target::word
-    AOT_Thread_call_native_through_safepoint_stub_offset = 260;
+    AOT_Thread_call_native_through_safepoint_stub_offset = 264;
 static constexpr dart::compiler::target::word
-    AOT_Thread_call_native_through_safepoint_entry_point_offset = 320;
+    AOT_Thread_call_native_through_safepoint_entry_point_offset = 324;
 static constexpr dart::compiler::target::word
     AOT_Thread_fix_allocation_stub_code_offset = 136;
 static constexpr dart::compiler::target::word
@@ -6032,63 +6154,64 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_float_zerow_address_offset = 372;
 static constexpr dart::compiler::target::word
-    AOT_Thread_global_object_pool_offset = 732;
-static constexpr dart::compiler::target::word
-    AOT_Thread_interpret_call_entry_point_offset = 340;
-static constexpr dart::compiler::target::word
-    AOT_Thread_invoke_dart_code_from_bytecode_stub_offset = 144;
+    AOT_Thread_global_object_pool_offset = 704;
 static constexpr dart::compiler::target::word
     AOT_Thread_invoke_dart_code_stub_offset = 140;
 static constexpr dart::compiler::target::word
-    AOT_Thread_exit_through_ffi_offset = 756;
+    AOT_Thread_exit_through_ffi_offset = 728;
 static constexpr dart::compiler::target::word AOT_Thread_isolate_offset = 44;
 static constexpr dart::compiler::target::word
     AOT_Thread_field_table_values_offset = 68;
 static constexpr dart::compiler::target::word
-    AOT_Thread_lazy_deopt_from_return_stub_offset = 236;
+    AOT_Thread_lazy_deopt_from_return_stub_offset = 240;
 static constexpr dart::compiler::target::word
-    AOT_Thread_lazy_deopt_from_throw_stub_offset = 240;
+    AOT_Thread_lazy_deopt_from_throw_stub_offset = 244;
 static constexpr dart::compiler::target::word
-    AOT_Thread_lazy_specialize_type_test_stub_offset = 248;
+    AOT_Thread_lazy_specialize_type_test_stub_offset = 252;
 static constexpr dart::compiler::target::word
     AOT_Thread_marking_stack_block_offset = 84;
 static constexpr dart::compiler::target::word
-    AOT_Thread_megamorphic_call_checked_entry_offset = 304;
+    AOT_Thread_megamorphic_call_checked_entry_offset = 308;
 static constexpr dart::compiler::target::word
-    AOT_Thread_switchable_call_miss_entry_offset = 308;
+    AOT_Thread_switchable_call_miss_entry_offset = 312;
 static constexpr dart::compiler::target::word
-    AOT_Thread_switchable_call_miss_stub_offset = 212;
+    AOT_Thread_switchable_call_miss_stub_offset = 216;
 static constexpr dart::compiler::target::word
-    AOT_Thread_no_scope_native_wrapper_entry_point_offset = 332;
+    AOT_Thread_no_scope_native_wrapper_entry_point_offset = 336;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_error_shared_with_fpu_regs_stub_offset = 156;
+    AOT_Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 152;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_error_shared_without_fpu_regs_stub_offset = 152;
+    AOT_Thread_late_initialization_error_shared_without_fpu_regs_stub_offset =
+        148;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 164;
+    AOT_Thread_null_error_shared_with_fpu_regs_stub_offset = 160;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 160;
+    AOT_Thread_null_error_shared_without_fpu_regs_stub_offset = 156;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 172;
+    AOT_Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 168;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 168;
+    AOT_Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 164;
 static constexpr dart::compiler::target::word
-    AOT_Thread_range_error_shared_with_fpu_regs_stub_offset = 180;
+    AOT_Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 176;
 static constexpr dart::compiler::target::word
-    AOT_Thread_range_error_shared_without_fpu_regs_stub_offset = 176;
+    AOT_Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 172;
+static constexpr dart::compiler::target::word
+    AOT_Thread_range_error_shared_with_fpu_regs_stub_offset = 184;
+static constexpr dart::compiler::target::word
+    AOT_Thread_range_error_shared_without_fpu_regs_stub_offset = 180;
 static constexpr dart::compiler::target::word AOT_Thread_object_null_offset =
     112;
 static constexpr dart::compiler::target::word
     AOT_Thread_predefined_symbols_address_offset = 344;
-static constexpr dart::compiler::target::word AOT_Thread_resume_pc_offset = 736;
+static constexpr dart::compiler::target::word AOT_Thread_resume_pc_offset = 708;
 static constexpr dart::compiler::target::word
-    AOT_Thread_saved_shadow_call_stack_offset = 740;
+    AOT_Thread_saved_shadow_call_stack_offset = 712;
 static constexpr dart::compiler::target::word
-    AOT_Thread_safepoint_state_offset = 748;
+    AOT_Thread_safepoint_state_offset = 720;
 static constexpr dart::compiler::target::word
-    AOT_Thread_slow_type_test_stub_offset = 244;
+    AOT_Thread_slow_type_test_stub_offset = 248;
 static constexpr dart::compiler::target::word
-    AOT_Thread_slow_type_test_entry_point_offset = 324;
+    AOT_Thread_slow_type_test_entry_point_offset = 328;
 static constexpr dart::compiler::target::word AOT_Thread_stack_limit_offset =
     36;
 static constexpr dart::compiler::target::word
@@ -6096,13 +6219,13 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_stack_overflow_flags_offset = 64;
 static constexpr dart::compiler::target::word
-    AOT_Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 300;
+    AOT_Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 304;
 static constexpr dart::compiler::target::word
-    AOT_Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 208;
+    AOT_Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 212;
 static constexpr dart::compiler::target::word
-    AOT_Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 296;
+    AOT_Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 300;
 static constexpr dart::compiler::target::word
-    AOT_Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 204;
+    AOT_Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 208;
 static constexpr dart::compiler::target::word
     AOT_Thread_store_buffer_block_offset = 80;
 static constexpr dart::compiler::target::word
@@ -6116,11 +6239,11 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_write_barrier_code_offset = 124;
 static constexpr dart::compiler::target::word
-    AOT_Thread_write_barrier_entry_point_offset = 264;
+    AOT_Thread_write_barrier_entry_point_offset = 268;
 static constexpr dart::compiler::target::word
     AOT_Thread_write_barrier_mask_offset = 40;
 static constexpr dart::compiler::target::word AOT_Thread_callback_code_offset =
-    752;
+    724;
 static constexpr dart::compiler::target::word
     AOT_TimelineStream_enabled_offset = 8;
 static constexpr dart::compiler::target::word AOT_TwoByteString_data_offset =
@@ -6133,15 +6256,23 @@
 static constexpr dart::compiler::target::word AOT_Type_type_state_offset = 32;
 static constexpr dart::compiler::target::word AOT_Type_nullability_offset = 33;
 static constexpr dart::compiler::target::word
-    AOT_TypeParameter_parameterized_class_id_offset = 28;
+    AOT_TypeParameter_parameterized_class_id_offset = 32;
 static constexpr dart::compiler::target::word AOT_TypeParameter_index_offset =
-    36;
+    40;
 static constexpr dart::compiler::target::word
     AOT_TypeArguments_instantiations_offset = 4;
 static constexpr dart::compiler::target::word AOT_TypeArguments_length_offset =
     8;
 static constexpr dart::compiler::target::word
     AOT_TypeArguments_nullability_offset = 16;
+static constexpr dart::compiler::target::word AOT_TypeArguments_types_offset =
+    20;
+static constexpr dart::compiler::target::word AOT_TypeParameter_bound_offset =
+    20;
+static constexpr dart::compiler::target::word AOT_TypeParameter_flags_offset =
+    42;
+static constexpr dart::compiler::target::word AOT_TypeParameter_name_offset =
+    12;
 static constexpr dart::compiler::target::word AOT_TypeRef_type_offset = 12;
 static constexpr dart::compiler::target::word AOT_TypedDataBase_length_offset =
     8;
@@ -6172,16 +6303,15 @@
     4, 12, 8, 16};
 static constexpr dart::compiler::target::word
     AOT_Thread_write_barrier_wrappers_thread_offset[] = {
-        692, 696, 700, 704, 708, -1, 712, -1, 716, 720, -1, -1, -1, -1, -1, -1};
+        664, 668, 672, 676, 680, -1, 684, -1, 688, 692, -1, -1, -1, -1, -1, -1};
 static constexpr dart::compiler::target::word AOT_ApiError_InstanceSize = 8;
 static constexpr dart::compiler::target::word AOT_Array_InstanceSize = 12;
 static constexpr dart::compiler::target::word AOT_Array_header_size = 12;
 static constexpr dart::compiler::target::word AOT_Bool_InstanceSize = 8;
-static constexpr dart::compiler::target::word AOT_Bytecode_InstanceSize = 44;
 static constexpr dart::compiler::target::word AOT_Capability_InstanceSize = 16;
 static constexpr dart::compiler::target::word AOT_Class_InstanceSize = 112;
 static constexpr dart::compiler::target::word AOT_Closure_InstanceSize = 28;
-static constexpr dart::compiler::target::word AOT_ClosureData_InstanceSize = 20;
+static constexpr dart::compiler::target::word AOT_ClosureData_InstanceSize = 28;
 static constexpr dart::compiler::target::word AOT_Code_InstanceSize = 64;
 static constexpr dart::compiler::target::word AOT_CodeSourceMap_HeaderSize = 8;
 static constexpr dart::compiler::target::word
@@ -6219,7 +6349,7 @@
 static constexpr dart::compiler::target::word AOT_Int32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Integer_InstanceSize = 4;
 static constexpr dart::compiler::target::word
-    AOT_KernelProgramInfo_InstanceSize = 64;
+    AOT_KernelProgramInfo_InstanceSize = 60;
 static constexpr dart::compiler::target::word AOT_LanguageError_InstanceSize =
     28;
 static constexpr dart::compiler::target::word AOT_Library_InstanceSize = 80;
@@ -6244,8 +6374,6 @@
 static constexpr dart::compiler::target::word AOT_ObjectPool_InstanceSize = 8;
 static constexpr dart::compiler::target::word AOT_OneByteString_InstanceSize =
     12;
-static constexpr dart::compiler::target::word
-    AOT_ParameterTypeCheck_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_PatchClass_InstanceSize = 20;
 static constexpr dart::compiler::target::word AOT_PcDescriptors_HeaderSize = 8;
 static constexpr dart::compiler::target::word AOT_Pointer_InstanceSize = 12;
@@ -6273,7 +6401,7 @@
 static constexpr dart::compiler::target::word AOT_TypeArguments_InstanceSize =
     20;
 static constexpr dart::compiler::target::word AOT_TypeParameter_InstanceSize =
-    40;
+    44;
 static constexpr dart::compiler::target::word AOT_TypeRef_InstanceSize = 16;
 static constexpr dart::compiler::target::word AOT_TypedData_InstanceSize = 12;
 static constexpr dart::compiler::target::word AOT_TypedDataBase_InstanceSize =
@@ -6334,6 +6462,8 @@
     AOT_SubtypeTestCache_kTestEntryLength = 7;
 static constexpr dart::compiler::target::word AOT_SubtypeTestCache_kTestResult =
     0;
+static constexpr dart::compiler::target::word AOT_TypeArguments_kMaxElements =
+    576460752303423487;
 static constexpr dart::compiler::target::word
     AOT_AbstractType_type_test_stub_entry_point_offset = 8;
 static constexpr dart::compiler::target::word
@@ -6373,6 +6503,10 @@
 static constexpr dart::compiler::target::word AOT_Closure_hash_offset = 48;
 static constexpr dart::compiler::target::word
     AOT_Closure_instantiator_type_arguments_offset = 8;
+static constexpr dart::compiler::target::word
+    AOT_ClosureData_default_type_arguments_offset = 40;
+static constexpr dart::compiler::target::word
+    AOT_ClosureData_default_type_arguments_info_offset = 48;
 static constexpr dart::compiler::target::word AOT_Code_object_pool_offset = 40;
 static constexpr dart::compiler::target::word
     AOT_Code_saved_instructions_offset = 48;
@@ -6399,8 +6533,10 @@
 static constexpr dart::compiler::target::word AOT_Field_is_nullable_offset = 74;
 static constexpr dart::compiler::target::word AOT_Field_kind_bits_offset = 78;
 static constexpr dart::compiler::target::word AOT_Function_code_offset = 88;
+static constexpr dart::compiler::target::word AOT_Function_data_offset = 72;
 static constexpr dart::compiler::target::word
     AOT_Function_entry_point_offset[] = {8, 16};
+static constexpr dart::compiler::target::word AOT_Function_kind_tag_offset = 96;
 static constexpr dart::compiler::target::word
     AOT_Function_packed_fields_offset = 100;
 static constexpr dart::compiler::target::word
@@ -6501,75 +6637,75 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_AllocateArray_entry_point_offset = 736;
 static constexpr dart::compiler::target::word
-    AOT_Thread_active_exception_offset = 1456;
+    AOT_Thread_active_exception_offset = 1400;
 static constexpr dart::compiler::target::word
-    AOT_Thread_active_stacktrace_offset = 1464;
+    AOT_Thread_active_stacktrace_offset = 1408;
 static constexpr dart::compiler::target::word
     AOT_Thread_array_write_barrier_code_offset = 240;
 static constexpr dart::compiler::target::word
-    AOT_Thread_array_write_barrier_entry_point_offset = 520;
+    AOT_Thread_array_write_barrier_entry_point_offset = 528;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_mint_with_fpu_regs_entry_point_offset = 536;
+    AOT_Thread_allocate_mint_with_fpu_regs_entry_point_offset = 544;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_mint_with_fpu_regs_stub_offset = 352;
+    AOT_Thread_allocate_mint_with_fpu_regs_stub_offset = 360;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_mint_without_fpu_regs_entry_point_offset = 544;
+    AOT_Thread_allocate_mint_without_fpu_regs_entry_point_offset = 552;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_mint_without_fpu_regs_stub_offset = 360;
+    AOT_Thread_allocate_mint_without_fpu_regs_stub_offset = 368;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_entry_point_offset = 552;
+    AOT_Thread_allocate_object_entry_point_offset = 560;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_stub_offset = 368;
+    AOT_Thread_allocate_object_stub_offset = 376;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_parameterized_entry_point_offset = 560;
+    AOT_Thread_allocate_object_parameterized_entry_point_offset = 568;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_parameterized_stub_offset = 376;
+    AOT_Thread_allocate_object_parameterized_stub_offset = 384;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_slow_entry_point_offset = 568;
+    AOT_Thread_allocate_object_slow_entry_point_offset = 576;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_slow_stub_offset = 384;
+    AOT_Thread_allocate_object_slow_stub_offset = 392;
 static constexpr dart::compiler::target::word AOT_Thread_api_top_scope_offset =
-    1528;
+    1472;
 static constexpr dart::compiler::target::word
     AOT_Thread_async_stack_trace_offset = 192;
 static constexpr dart::compiler::target::word
-    AOT_Thread_auto_scope_native_wrapper_entry_point_offset = 656;
+    AOT_Thread_auto_scope_native_wrapper_entry_point_offset = 664;
 static constexpr dart::compiler::target::word AOT_Thread_bool_false_offset =
     224;
 static constexpr dart::compiler::target::word AOT_Thread_bool_true_offset = 216;
 static constexpr dart::compiler::target::word
-    AOT_Thread_bootstrap_native_wrapper_entry_point_offset = 640;
+    AOT_Thread_bootstrap_native_wrapper_entry_point_offset = 648;
 static constexpr dart::compiler::target::word
-    AOT_Thread_call_to_runtime_entry_point_offset = 528;
+    AOT_Thread_call_to_runtime_entry_point_offset = 536;
 static constexpr dart::compiler::target::word
-    AOT_Thread_call_to_runtime_stub_offset = 280;
+    AOT_Thread_call_to_runtime_stub_offset = 272;
 static constexpr dart::compiler::target::word AOT_Thread_dart_stream_offset =
-    1544;
+    1488;
 static constexpr dart::compiler::target::word
     AOT_Thread_dispatch_table_array_offset = 96;
 static constexpr dart::compiler::target::word AOT_Thread_optimize_entry_offset =
-    608;
+    616;
 static constexpr dart::compiler::target::word AOT_Thread_optimize_stub_offset =
-    440;
+    448;
 static constexpr dart::compiler::target::word
-    AOT_Thread_deoptimize_entry_offset = 616;
+    AOT_Thread_deoptimize_entry_offset = 624;
 static constexpr dart::compiler::target::word
-    AOT_Thread_deoptimize_stub_offset = 448;
+    AOT_Thread_deoptimize_stub_offset = 456;
 static constexpr dart::compiler::target::word
     AOT_Thread_double_abs_address_offset = 696;
 static constexpr dart::compiler::target::word
     AOT_Thread_double_negate_address_offset = 688;
 static constexpr dart::compiler::target::word AOT_Thread_end_offset = 112;
 static constexpr dart::compiler::target::word
-    AOT_Thread_enter_safepoint_stub_offset = 488;
+    AOT_Thread_enter_safepoint_stub_offset = 496;
 static constexpr dart::compiler::target::word
-    AOT_Thread_execution_state_offset = 1496;
+    AOT_Thread_execution_state_offset = 1440;
 static constexpr dart::compiler::target::word
-    AOT_Thread_exit_safepoint_stub_offset = 496;
+    AOT_Thread_exit_safepoint_stub_offset = 504;
 static constexpr dart::compiler::target::word
-    AOT_Thread_call_native_through_safepoint_stub_offset = 504;
+    AOT_Thread_call_native_through_safepoint_stub_offset = 512;
 static constexpr dart::compiler::target::word
-    AOT_Thread_call_native_through_safepoint_entry_point_offset = 624;
+    AOT_Thread_call_native_through_safepoint_entry_point_offset = 632;
 static constexpr dart::compiler::target::word
     AOT_Thread_fix_allocation_stub_code_offset = 256;
 static constexpr dart::compiler::target::word
@@ -6583,64 +6719,65 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_float_zerow_address_offset = 728;
 static constexpr dart::compiler::target::word
-    AOT_Thread_global_object_pool_offset = 1472;
-static constexpr dart::compiler::target::word
-    AOT_Thread_interpret_call_entry_point_offset = 664;
-static constexpr dart::compiler::target::word
-    AOT_Thread_invoke_dart_code_from_bytecode_stub_offset = 272;
+    AOT_Thread_global_object_pool_offset = 1416;
 static constexpr dart::compiler::target::word
     AOT_Thread_invoke_dart_code_stub_offset = 264;
 static constexpr dart::compiler::target::word
-    AOT_Thread_exit_through_ffi_offset = 1520;
+    AOT_Thread_exit_through_ffi_offset = 1464;
 static constexpr dart::compiler::target::word AOT_Thread_isolate_offset = 88;
 static constexpr dart::compiler::target::word
     AOT_Thread_field_table_values_offset = 136;
 static constexpr dart::compiler::target::word
-    AOT_Thread_lazy_deopt_from_return_stub_offset = 456;
+    AOT_Thread_lazy_deopt_from_return_stub_offset = 464;
 static constexpr dart::compiler::target::word
-    AOT_Thread_lazy_deopt_from_throw_stub_offset = 464;
+    AOT_Thread_lazy_deopt_from_throw_stub_offset = 472;
 static constexpr dart::compiler::target::word
-    AOT_Thread_lazy_specialize_type_test_stub_offset = 480;
+    AOT_Thread_lazy_specialize_type_test_stub_offset = 488;
 static constexpr dart::compiler::target::word
     AOT_Thread_marking_stack_block_offset = 168;
 static constexpr dart::compiler::target::word
-    AOT_Thread_megamorphic_call_checked_entry_offset = 592;
+    AOT_Thread_megamorphic_call_checked_entry_offset = 600;
 static constexpr dart::compiler::target::word
-    AOT_Thread_switchable_call_miss_entry_offset = 600;
+    AOT_Thread_switchable_call_miss_entry_offset = 608;
 static constexpr dart::compiler::target::word
-    AOT_Thread_switchable_call_miss_stub_offset = 408;
+    AOT_Thread_switchable_call_miss_stub_offset = 416;
 static constexpr dart::compiler::target::word
-    AOT_Thread_no_scope_native_wrapper_entry_point_offset = 648;
+    AOT_Thread_no_scope_native_wrapper_entry_point_offset = 656;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_error_shared_with_fpu_regs_stub_offset = 296;
+    AOT_Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 288;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_error_shared_without_fpu_regs_stub_offset = 288;
+    AOT_Thread_late_initialization_error_shared_without_fpu_regs_stub_offset =
+        280;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 312;
+    AOT_Thread_null_error_shared_with_fpu_regs_stub_offset = 304;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 304;
+    AOT_Thread_null_error_shared_without_fpu_regs_stub_offset = 296;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 328;
+    AOT_Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 320;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 320;
+    AOT_Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 312;
 static constexpr dart::compiler::target::word
-    AOT_Thread_range_error_shared_with_fpu_regs_stub_offset = 344;
+    AOT_Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 336;
 static constexpr dart::compiler::target::word
-    AOT_Thread_range_error_shared_without_fpu_regs_stub_offset = 336;
+    AOT_Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 328;
+static constexpr dart::compiler::target::word
+    AOT_Thread_range_error_shared_with_fpu_regs_stub_offset = 352;
+static constexpr dart::compiler::target::word
+    AOT_Thread_range_error_shared_without_fpu_regs_stub_offset = 344;
 static constexpr dart::compiler::target::word AOT_Thread_object_null_offset =
     208;
 static constexpr dart::compiler::target::word
     AOT_Thread_predefined_symbols_address_offset = 672;
 static constexpr dart::compiler::target::word AOT_Thread_resume_pc_offset =
-    1480;
+    1424;
 static constexpr dart::compiler::target::word
-    AOT_Thread_saved_shadow_call_stack_offset = 1488;
+    AOT_Thread_saved_shadow_call_stack_offset = 1432;
 static constexpr dart::compiler::target::word
-    AOT_Thread_safepoint_state_offset = 1504;
+    AOT_Thread_safepoint_state_offset = 1448;
 static constexpr dart::compiler::target::word
-    AOT_Thread_slow_type_test_stub_offset = 472;
+    AOT_Thread_slow_type_test_stub_offset = 480;
 static constexpr dart::compiler::target::word
-    AOT_Thread_slow_type_test_entry_point_offset = 632;
+    AOT_Thread_slow_type_test_entry_point_offset = 640;
 static constexpr dart::compiler::target::word AOT_Thread_stack_limit_offset =
     72;
 static constexpr dart::compiler::target::word
@@ -6648,13 +6785,13 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_stack_overflow_flags_offset = 128;
 static constexpr dart::compiler::target::word
-    AOT_Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 584;
+    AOT_Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 592;
 static constexpr dart::compiler::target::word
-    AOT_Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 400;
+    AOT_Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 408;
 static constexpr dart::compiler::target::word
-    AOT_Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 576;
+    AOT_Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 584;
 static constexpr dart::compiler::target::word
-    AOT_Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 392;
+    AOT_Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 400;
 static constexpr dart::compiler::target::word
     AOT_Thread_store_buffer_block_offset = 160;
 static constexpr dart::compiler::target::word
@@ -6668,11 +6805,11 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_write_barrier_code_offset = 232;
 static constexpr dart::compiler::target::word
-    AOT_Thread_write_barrier_entry_point_offset = 512;
+    AOT_Thread_write_barrier_entry_point_offset = 520;
 static constexpr dart::compiler::target::word
     AOT_Thread_write_barrier_mask_offset = 80;
 static constexpr dart::compiler::target::word AOT_Thread_callback_code_offset =
-    1512;
+    1456;
 static constexpr dart::compiler::target::word
     AOT_TimelineStream_enabled_offset = 16;
 static constexpr dart::compiler::target::word AOT_TwoByteString_data_offset =
@@ -6685,15 +6822,23 @@
 static constexpr dart::compiler::target::word AOT_Type_type_state_offset = 60;
 static constexpr dart::compiler::target::word AOT_Type_nullability_offset = 61;
 static constexpr dart::compiler::target::word
-    AOT_TypeParameter_parameterized_class_id_offset = 56;
+    AOT_TypeParameter_parameterized_class_id_offset = 64;
 static constexpr dart::compiler::target::word AOT_TypeParameter_index_offset =
-    64;
+    72;
 static constexpr dart::compiler::target::word
     AOT_TypeArguments_instantiations_offset = 8;
 static constexpr dart::compiler::target::word AOT_TypeArguments_length_offset =
     16;
 static constexpr dart::compiler::target::word
     AOT_TypeArguments_nullability_offset = 32;
+static constexpr dart::compiler::target::word AOT_TypeArguments_types_offset =
+    40;
+static constexpr dart::compiler::target::word AOT_TypeParameter_bound_offset =
+    40;
+static constexpr dart::compiler::target::word AOT_TypeParameter_flags_offset =
+    74;
+static constexpr dart::compiler::target::word AOT_TypeParameter_name_offset =
+    24;
 static constexpr dart::compiler::target::word AOT_TypeRef_type_offset = 24;
 static constexpr dart::compiler::target::word AOT_TypedDataBase_length_offset =
     16;
@@ -6724,17 +6869,16 @@
     8, 24, 16, 32};
 static constexpr dart::compiler::target::word
     AOT_Thread_write_barrier_wrappers_thread_offset[] = {
-        1368, 1376, 1384, 1392, -1,   -1,   1400, 1408,
-        1416, 1424, 1432, -1,   1440, 1448, -1,   -1};
+        1312, 1320, 1328, 1336, -1,   -1,   1344, 1352,
+        1360, 1368, 1376, -1,   1384, 1392, -1,   -1};
 static constexpr dart::compiler::target::word AOT_ApiError_InstanceSize = 16;
 static constexpr dart::compiler::target::word AOT_Array_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Array_header_size = 24;
 static constexpr dart::compiler::target::word AOT_Bool_InstanceSize = 12;
-static constexpr dart::compiler::target::word AOT_Bytecode_InstanceSize = 80;
 static constexpr dart::compiler::target::word AOT_Capability_InstanceSize = 16;
 static constexpr dart::compiler::target::word AOT_Class_InstanceSize = 192;
 static constexpr dart::compiler::target::word AOT_Closure_InstanceSize = 56;
-static constexpr dart::compiler::target::word AOT_ClosureData_InstanceSize = 40;
+static constexpr dart::compiler::target::word AOT_ClosureData_InstanceSize = 56;
 static constexpr dart::compiler::target::word AOT_Code_InstanceSize = 120;
 static constexpr dart::compiler::target::word AOT_CodeSourceMap_HeaderSize = 16;
 static constexpr dart::compiler::target::word
@@ -6772,7 +6916,7 @@
 static constexpr dart::compiler::target::word AOT_Int32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Integer_InstanceSize = 8;
 static constexpr dart::compiler::target::word
-    AOT_KernelProgramInfo_InstanceSize = 128;
+    AOT_KernelProgramInfo_InstanceSize = 120;
 static constexpr dart::compiler::target::word AOT_LanguageError_InstanceSize =
     48;
 static constexpr dart::compiler::target::word AOT_Library_InstanceSize = 152;
@@ -6797,8 +6941,6 @@
 static constexpr dart::compiler::target::word AOT_ObjectPool_InstanceSize = 16;
 static constexpr dart::compiler::target::word AOT_OneByteString_InstanceSize =
     16;
-static constexpr dart::compiler::target::word
-    AOT_ParameterTypeCheck_InstanceSize = 48;
 static constexpr dart::compiler::target::word AOT_PatchClass_InstanceSize = 40;
 static constexpr dart::compiler::target::word AOT_PcDescriptors_HeaderSize = 16;
 static constexpr dart::compiler::target::word AOT_Pointer_InstanceSize = 24;
@@ -6826,7 +6968,7 @@
 static constexpr dart::compiler::target::word AOT_TypeArguments_InstanceSize =
     40;
 static constexpr dart::compiler::target::word AOT_TypeParameter_InstanceSize =
-    72;
+    80;
 static constexpr dart::compiler::target::word AOT_TypeRef_InstanceSize = 32;
 static constexpr dart::compiler::target::word AOT_TypedData_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_TypedDataBase_InstanceSize =
@@ -6890,6 +7032,8 @@
     AOT_SubtypeTestCache_kTestEntryLength = 7;
 static constexpr dart::compiler::target::word AOT_SubtypeTestCache_kTestResult =
     0;
+static constexpr dart::compiler::target::word AOT_TypeArguments_kMaxElements =
+    576460752303423487;
 static constexpr dart::compiler::target::word
     AOT_AbstractType_type_test_stub_entry_point_offset = 8;
 static constexpr dart::compiler::target::word
@@ -6929,6 +7073,10 @@
 static constexpr dart::compiler::target::word AOT_Closure_hash_offset = 48;
 static constexpr dart::compiler::target::word
     AOT_Closure_instantiator_type_arguments_offset = 8;
+static constexpr dart::compiler::target::word
+    AOT_ClosureData_default_type_arguments_offset = 40;
+static constexpr dart::compiler::target::word
+    AOT_ClosureData_default_type_arguments_info_offset = 48;
 static constexpr dart::compiler::target::word AOT_Code_object_pool_offset = 40;
 static constexpr dart::compiler::target::word
     AOT_Code_saved_instructions_offset = 48;
@@ -6955,8 +7103,10 @@
 static constexpr dart::compiler::target::word AOT_Field_is_nullable_offset = 74;
 static constexpr dart::compiler::target::word AOT_Field_kind_bits_offset = 78;
 static constexpr dart::compiler::target::word AOT_Function_code_offset = 88;
+static constexpr dart::compiler::target::word AOT_Function_data_offset = 72;
 static constexpr dart::compiler::target::word
     AOT_Function_entry_point_offset[] = {8, 16};
+static constexpr dart::compiler::target::word AOT_Function_kind_tag_offset = 96;
 static constexpr dart::compiler::target::word
     AOT_Function_packed_fields_offset = 100;
 static constexpr dart::compiler::target::word
@@ -7057,75 +7207,75 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_AllocateArray_entry_point_offset = 736;
 static constexpr dart::compiler::target::word
-    AOT_Thread_active_exception_offset = 1528;
+    AOT_Thread_active_exception_offset = 1472;
 static constexpr dart::compiler::target::word
-    AOT_Thread_active_stacktrace_offset = 1536;
+    AOT_Thread_active_stacktrace_offset = 1480;
 static constexpr dart::compiler::target::word
     AOT_Thread_array_write_barrier_code_offset = 240;
 static constexpr dart::compiler::target::word
-    AOT_Thread_array_write_barrier_entry_point_offset = 520;
+    AOT_Thread_array_write_barrier_entry_point_offset = 528;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_mint_with_fpu_regs_entry_point_offset = 536;
+    AOT_Thread_allocate_mint_with_fpu_regs_entry_point_offset = 544;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_mint_with_fpu_regs_stub_offset = 352;
+    AOT_Thread_allocate_mint_with_fpu_regs_stub_offset = 360;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_mint_without_fpu_regs_entry_point_offset = 544;
+    AOT_Thread_allocate_mint_without_fpu_regs_entry_point_offset = 552;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_mint_without_fpu_regs_stub_offset = 360;
+    AOT_Thread_allocate_mint_without_fpu_regs_stub_offset = 368;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_entry_point_offset = 552;
+    AOT_Thread_allocate_object_entry_point_offset = 560;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_stub_offset = 368;
+    AOT_Thread_allocate_object_stub_offset = 376;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_parameterized_entry_point_offset = 560;
+    AOT_Thread_allocate_object_parameterized_entry_point_offset = 568;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_parameterized_stub_offset = 376;
+    AOT_Thread_allocate_object_parameterized_stub_offset = 384;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_slow_entry_point_offset = 568;
+    AOT_Thread_allocate_object_slow_entry_point_offset = 576;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_slow_stub_offset = 384;
+    AOT_Thread_allocate_object_slow_stub_offset = 392;
 static constexpr dart::compiler::target::word AOT_Thread_api_top_scope_offset =
-    1600;
+    1544;
 static constexpr dart::compiler::target::word
     AOT_Thread_async_stack_trace_offset = 192;
 static constexpr dart::compiler::target::word
-    AOT_Thread_auto_scope_native_wrapper_entry_point_offset = 656;
+    AOT_Thread_auto_scope_native_wrapper_entry_point_offset = 664;
 static constexpr dart::compiler::target::word AOT_Thread_bool_false_offset =
     224;
 static constexpr dart::compiler::target::word AOT_Thread_bool_true_offset = 216;
 static constexpr dart::compiler::target::word
-    AOT_Thread_bootstrap_native_wrapper_entry_point_offset = 640;
+    AOT_Thread_bootstrap_native_wrapper_entry_point_offset = 648;
 static constexpr dart::compiler::target::word
-    AOT_Thread_call_to_runtime_entry_point_offset = 528;
+    AOT_Thread_call_to_runtime_entry_point_offset = 536;
 static constexpr dart::compiler::target::word
-    AOT_Thread_call_to_runtime_stub_offset = 280;
+    AOT_Thread_call_to_runtime_stub_offset = 272;
 static constexpr dart::compiler::target::word AOT_Thread_dart_stream_offset =
-    1616;
+    1560;
 static constexpr dart::compiler::target::word
     AOT_Thread_dispatch_table_array_offset = 96;
 static constexpr dart::compiler::target::word AOT_Thread_optimize_entry_offset =
-    608;
+    616;
 static constexpr dart::compiler::target::word AOT_Thread_optimize_stub_offset =
-    440;
+    448;
 static constexpr dart::compiler::target::word
-    AOT_Thread_deoptimize_entry_offset = 616;
+    AOT_Thread_deoptimize_entry_offset = 624;
 static constexpr dart::compiler::target::word
-    AOT_Thread_deoptimize_stub_offset = 448;
+    AOT_Thread_deoptimize_stub_offset = 456;
 static constexpr dart::compiler::target::word
     AOT_Thread_double_abs_address_offset = 696;
 static constexpr dart::compiler::target::word
     AOT_Thread_double_negate_address_offset = 688;
 static constexpr dart::compiler::target::word AOT_Thread_end_offset = 112;
 static constexpr dart::compiler::target::word
-    AOT_Thread_enter_safepoint_stub_offset = 488;
+    AOT_Thread_enter_safepoint_stub_offset = 496;
 static constexpr dart::compiler::target::word
-    AOT_Thread_execution_state_offset = 1568;
+    AOT_Thread_execution_state_offset = 1512;
 static constexpr dart::compiler::target::word
-    AOT_Thread_exit_safepoint_stub_offset = 496;
+    AOT_Thread_exit_safepoint_stub_offset = 504;
 static constexpr dart::compiler::target::word
-    AOT_Thread_call_native_through_safepoint_stub_offset = 504;
+    AOT_Thread_call_native_through_safepoint_stub_offset = 512;
 static constexpr dart::compiler::target::word
-    AOT_Thread_call_native_through_safepoint_entry_point_offset = 624;
+    AOT_Thread_call_native_through_safepoint_entry_point_offset = 632;
 static constexpr dart::compiler::target::word
     AOT_Thread_fix_allocation_stub_code_offset = 256;
 static constexpr dart::compiler::target::word
@@ -7139,64 +7289,65 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_float_zerow_address_offset = 728;
 static constexpr dart::compiler::target::word
-    AOT_Thread_global_object_pool_offset = 1544;
-static constexpr dart::compiler::target::word
-    AOT_Thread_interpret_call_entry_point_offset = 664;
-static constexpr dart::compiler::target::word
-    AOT_Thread_invoke_dart_code_from_bytecode_stub_offset = 272;
+    AOT_Thread_global_object_pool_offset = 1488;
 static constexpr dart::compiler::target::word
     AOT_Thread_invoke_dart_code_stub_offset = 264;
 static constexpr dart::compiler::target::word
-    AOT_Thread_exit_through_ffi_offset = 1592;
+    AOT_Thread_exit_through_ffi_offset = 1536;
 static constexpr dart::compiler::target::word AOT_Thread_isolate_offset = 88;
 static constexpr dart::compiler::target::word
     AOT_Thread_field_table_values_offset = 136;
 static constexpr dart::compiler::target::word
-    AOT_Thread_lazy_deopt_from_return_stub_offset = 456;
+    AOT_Thread_lazy_deopt_from_return_stub_offset = 464;
 static constexpr dart::compiler::target::word
-    AOT_Thread_lazy_deopt_from_throw_stub_offset = 464;
+    AOT_Thread_lazy_deopt_from_throw_stub_offset = 472;
 static constexpr dart::compiler::target::word
-    AOT_Thread_lazy_specialize_type_test_stub_offset = 480;
+    AOT_Thread_lazy_specialize_type_test_stub_offset = 488;
 static constexpr dart::compiler::target::word
     AOT_Thread_marking_stack_block_offset = 168;
 static constexpr dart::compiler::target::word
-    AOT_Thread_megamorphic_call_checked_entry_offset = 592;
+    AOT_Thread_megamorphic_call_checked_entry_offset = 600;
 static constexpr dart::compiler::target::word
-    AOT_Thread_switchable_call_miss_entry_offset = 600;
+    AOT_Thread_switchable_call_miss_entry_offset = 608;
 static constexpr dart::compiler::target::word
-    AOT_Thread_switchable_call_miss_stub_offset = 408;
+    AOT_Thread_switchable_call_miss_stub_offset = 416;
 static constexpr dart::compiler::target::word
-    AOT_Thread_no_scope_native_wrapper_entry_point_offset = 648;
+    AOT_Thread_no_scope_native_wrapper_entry_point_offset = 656;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_error_shared_with_fpu_regs_stub_offset = 296;
+    AOT_Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 288;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_error_shared_without_fpu_regs_stub_offset = 288;
+    AOT_Thread_late_initialization_error_shared_without_fpu_regs_stub_offset =
+        280;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 312;
+    AOT_Thread_null_error_shared_with_fpu_regs_stub_offset = 304;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 304;
+    AOT_Thread_null_error_shared_without_fpu_regs_stub_offset = 296;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 328;
+    AOT_Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 320;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 320;
+    AOT_Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 312;
 static constexpr dart::compiler::target::word
-    AOT_Thread_range_error_shared_with_fpu_regs_stub_offset = 344;
+    AOT_Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 336;
 static constexpr dart::compiler::target::word
-    AOT_Thread_range_error_shared_without_fpu_regs_stub_offset = 336;
+    AOT_Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 328;
+static constexpr dart::compiler::target::word
+    AOT_Thread_range_error_shared_with_fpu_regs_stub_offset = 352;
+static constexpr dart::compiler::target::word
+    AOT_Thread_range_error_shared_without_fpu_regs_stub_offset = 344;
 static constexpr dart::compiler::target::word AOT_Thread_object_null_offset =
     208;
 static constexpr dart::compiler::target::word
     AOT_Thread_predefined_symbols_address_offset = 672;
 static constexpr dart::compiler::target::word AOT_Thread_resume_pc_offset =
-    1552;
+    1496;
 static constexpr dart::compiler::target::word
-    AOT_Thread_saved_shadow_call_stack_offset = 1560;
+    AOT_Thread_saved_shadow_call_stack_offset = 1504;
 static constexpr dart::compiler::target::word
-    AOT_Thread_safepoint_state_offset = 1576;
+    AOT_Thread_safepoint_state_offset = 1520;
 static constexpr dart::compiler::target::word
-    AOT_Thread_slow_type_test_stub_offset = 472;
+    AOT_Thread_slow_type_test_stub_offset = 480;
 static constexpr dart::compiler::target::word
-    AOT_Thread_slow_type_test_entry_point_offset = 632;
+    AOT_Thread_slow_type_test_entry_point_offset = 640;
 static constexpr dart::compiler::target::word AOT_Thread_stack_limit_offset =
     72;
 static constexpr dart::compiler::target::word
@@ -7204,13 +7355,13 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_stack_overflow_flags_offset = 128;
 static constexpr dart::compiler::target::word
-    AOT_Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 584;
+    AOT_Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 592;
 static constexpr dart::compiler::target::word
-    AOT_Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 400;
+    AOT_Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 408;
 static constexpr dart::compiler::target::word
-    AOT_Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 576;
+    AOT_Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 584;
 static constexpr dart::compiler::target::word
-    AOT_Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 392;
+    AOT_Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 400;
 static constexpr dart::compiler::target::word
     AOT_Thread_store_buffer_block_offset = 160;
 static constexpr dart::compiler::target::word
@@ -7224,11 +7375,11 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_write_barrier_code_offset = 232;
 static constexpr dart::compiler::target::word
-    AOT_Thread_write_barrier_entry_point_offset = 512;
+    AOT_Thread_write_barrier_entry_point_offset = 520;
 static constexpr dart::compiler::target::word
     AOT_Thread_write_barrier_mask_offset = 80;
 static constexpr dart::compiler::target::word AOT_Thread_callback_code_offset =
-    1584;
+    1528;
 static constexpr dart::compiler::target::word
     AOT_TimelineStream_enabled_offset = 16;
 static constexpr dart::compiler::target::word AOT_TwoByteString_data_offset =
@@ -7241,15 +7392,23 @@
 static constexpr dart::compiler::target::word AOT_Type_type_state_offset = 60;
 static constexpr dart::compiler::target::word AOT_Type_nullability_offset = 61;
 static constexpr dart::compiler::target::word
-    AOT_TypeParameter_parameterized_class_id_offset = 56;
+    AOT_TypeParameter_parameterized_class_id_offset = 64;
 static constexpr dart::compiler::target::word AOT_TypeParameter_index_offset =
-    64;
+    72;
 static constexpr dart::compiler::target::word
     AOT_TypeArguments_instantiations_offset = 8;
 static constexpr dart::compiler::target::word AOT_TypeArguments_length_offset =
     16;
 static constexpr dart::compiler::target::word
     AOT_TypeArguments_nullability_offset = 32;
+static constexpr dart::compiler::target::word AOT_TypeArguments_types_offset =
+    40;
+static constexpr dart::compiler::target::word AOT_TypeParameter_bound_offset =
+    40;
+static constexpr dart::compiler::target::word AOT_TypeParameter_flags_offset =
+    74;
+static constexpr dart::compiler::target::word AOT_TypeParameter_name_offset =
+    24;
 static constexpr dart::compiler::target::word AOT_TypeRef_type_offset = 24;
 static constexpr dart::compiler::target::word AOT_TypedDataBase_length_offset =
     16;
@@ -7280,18 +7439,17 @@
     8, 24, 16, 32};
 static constexpr dart::compiler::target::word
     AOT_Thread_write_barrier_wrappers_thread_offset[] = {
-        1368, 1376, 1384, 1392, 1400, 1408, 1416, 1424, 1432, 1440, 1448,
-        1456, 1464, 1472, 1480, -1,   -1,   -1,   -1,   1488, 1496, -1,
-        -1,   1504, 1512, 1520, -1,   -1,   -1,   -1,   -1,   -1};
+        1312, 1320, 1328, 1336, 1344, 1352, 1360, 1368, 1376, 1384, 1392,
+        1400, 1408, 1416, 1424, -1,   -1,   -1,   -1,   1432, 1440, -1,
+        -1,   1448, 1456, 1464, -1,   -1,   -1,   -1,   -1,   -1};
 static constexpr dart::compiler::target::word AOT_ApiError_InstanceSize = 16;
 static constexpr dart::compiler::target::word AOT_Array_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Array_header_size = 24;
 static constexpr dart::compiler::target::word AOT_Bool_InstanceSize = 12;
-static constexpr dart::compiler::target::word AOT_Bytecode_InstanceSize = 80;
 static constexpr dart::compiler::target::word AOT_Capability_InstanceSize = 16;
 static constexpr dart::compiler::target::word AOT_Class_InstanceSize = 192;
 static constexpr dart::compiler::target::word AOT_Closure_InstanceSize = 56;
-static constexpr dart::compiler::target::word AOT_ClosureData_InstanceSize = 40;
+static constexpr dart::compiler::target::word AOT_ClosureData_InstanceSize = 56;
 static constexpr dart::compiler::target::word AOT_Code_InstanceSize = 120;
 static constexpr dart::compiler::target::word AOT_CodeSourceMap_HeaderSize = 16;
 static constexpr dart::compiler::target::word
@@ -7329,7 +7487,7 @@
 static constexpr dart::compiler::target::word AOT_Int32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Integer_InstanceSize = 8;
 static constexpr dart::compiler::target::word
-    AOT_KernelProgramInfo_InstanceSize = 128;
+    AOT_KernelProgramInfo_InstanceSize = 120;
 static constexpr dart::compiler::target::word AOT_LanguageError_InstanceSize =
     48;
 static constexpr dart::compiler::target::word AOT_Library_InstanceSize = 152;
@@ -7354,8 +7512,6 @@
 static constexpr dart::compiler::target::word AOT_ObjectPool_InstanceSize = 16;
 static constexpr dart::compiler::target::word AOT_OneByteString_InstanceSize =
     16;
-static constexpr dart::compiler::target::word
-    AOT_ParameterTypeCheck_InstanceSize = 48;
 static constexpr dart::compiler::target::word AOT_PatchClass_InstanceSize = 40;
 static constexpr dart::compiler::target::word AOT_PcDescriptors_HeaderSize = 16;
 static constexpr dart::compiler::target::word AOT_Pointer_InstanceSize = 24;
@@ -7383,7 +7539,7 @@
 static constexpr dart::compiler::target::word AOT_TypeArguments_InstanceSize =
     40;
 static constexpr dart::compiler::target::word AOT_TypeParameter_InstanceSize =
-    72;
+    80;
 static constexpr dart::compiler::target::word AOT_TypeRef_InstanceSize = 32;
 static constexpr dart::compiler::target::word AOT_TypedData_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_TypedDataBase_InstanceSize =
diff --git a/runtime/vm/compiler/runtime_offsets_list.h b/runtime/vm/compiler/runtime_offsets_list.h
index 76eb49f..2aa714c 100644
--- a/runtime/vm/compiler/runtime_offsets_list.h
+++ b/runtime/vm/compiler/runtime_offsets_list.h
@@ -60,6 +60,7 @@
   CONSTANT(SubtypeTestCache, kInstantiatorTypeArguments)                       \
   CONSTANT(SubtypeTestCache, kTestEntryLength)                                 \
   CONSTANT(SubtypeTestCache, kTestResult)                                      \
+  CONSTANT(TypeArguments, kMaxElements)                                        \
   FIELD(AbstractType, type_test_stub_entry_point_offset)                       \
   FIELD(ArgumentsDescriptor, count_offset)                                     \
   FIELD(ArgumentsDescriptor, size_offset)                                      \
@@ -84,6 +85,8 @@
   FIELD(Closure, function_type_arguments_offset)                               \
   FIELD(Closure, hash_offset)                                                  \
   FIELD(Closure, instantiator_type_arguments_offset)                           \
+  FIELD(ClosureData, default_type_arguments_offset)                            \
+  FIELD(ClosureData, default_type_arguments_info_offset)                       \
   FIELD(Code, object_pool_offset)                                              \
   FIELD(Code, saved_instructions_offset)                                       \
   FIELD(Code, owner_offset)                                                    \
@@ -102,8 +105,10 @@
   FIELD(Field, is_nullable_offset)                                             \
   FIELD(Field, kind_bits_offset)                                               \
   FIELD(Function, code_offset)                                                 \
+  FIELD(Function, data_offset)                                                 \
   RANGE(Function, entry_point_offset, CodeEntryKind, CodeEntryKind::kNormal,   \
         CodeEntryKind::kUnchecked, [](CodeEntryKind value) { return true; })   \
+  FIELD(Function, kind_tag_offset)                                             \
   FIELD(Function, packed_fields_offset)                                        \
   FIELD(Function, parameter_names_offset)                                      \
   FIELD(Function, parameter_types_offset)                                      \
@@ -203,8 +208,6 @@
   FIELD(Thread, float_not_address_offset)                                      \
   FIELD(Thread, float_zerow_address_offset)                                    \
   FIELD(Thread, global_object_pool_offset)                                     \
-  FIELD(Thread, interpret_call_entry_point_offset)                             \
-  FIELD(Thread, invoke_dart_code_from_bytecode_stub_offset)                    \
   FIELD(Thread, invoke_dart_code_stub_offset)                                  \
   FIELD(Thread, exit_through_ffi_offset)                                       \
   FIELD(Thread, isolate_offset)                                                \
@@ -217,6 +220,8 @@
   FIELD(Thread, switchable_call_miss_entry_offset)                             \
   FIELD(Thread, switchable_call_miss_stub_offset)                              \
   FIELD(Thread, no_scope_native_wrapper_entry_point_offset)                    \
+  FIELD(Thread, late_initialization_error_shared_with_fpu_regs_stub_offset)    \
+  FIELD(Thread, late_initialization_error_shared_without_fpu_regs_stub_offset) \
   FIELD(Thread, null_error_shared_with_fpu_regs_stub_offset)                   \
   FIELD(Thread, null_error_shared_without_fpu_regs_stub_offset)                \
   FIELD(Thread, null_arg_error_shared_with_fpu_regs_stub_offset)               \
@@ -264,6 +269,10 @@
   FIELD(TypeArguments, instantiations_offset)                                  \
   FIELD(TypeArguments, length_offset)                                          \
   FIELD(TypeArguments, nullability_offset)                                     \
+  FIELD(TypeArguments, types_offset)                                           \
+  FIELD(TypeParameter, bound_offset)                                           \
+  FIELD(TypeParameter, flags_offset)                                           \
+  FIELD(TypeParameter, name_offset)                                            \
   FIELD(TypeRef, type_offset)                                                  \
   FIELD(TypedDataBase, length_offset)                                          \
   FIELD(TypedDataView, data_offset)                                            \
@@ -290,7 +299,6 @@
   SIZEOF(Array, InstanceSize, ArrayLayout)                                     \
   SIZEOF(Array, header_size, ArrayLayout)                                      \
   SIZEOF(Bool, InstanceSize, BoolLayout)                                       \
-  SIZEOF(Bytecode, InstanceSize, BytecodeLayout)                               \
   SIZEOF(Capability, InstanceSize, CapabilityLayout)                           \
   SIZEOF(Class, InstanceSize, ClassLayout)                                     \
   SIZEOF(Closure, InstanceSize, ClosureLayout)                                 \
@@ -336,7 +344,6 @@
   SIZEOF(Object, InstanceSize, ObjectLayout)                                   \
   SIZEOF(ObjectPool, InstanceSize, ObjectPoolLayout)                           \
   SIZEOF(OneByteString, InstanceSize, OneByteStringLayout)                     \
-  SIZEOF(ParameterTypeCheck, InstanceSize, ParameterTypeCheckLayout)           \
   SIZEOF(PatchClass, InstanceSize, PatchClassLayout)                           \
   SIZEOF(PcDescriptors, HeaderSize, PcDescriptorsLayout)                       \
   SIZEOF(Pointer, InstanceSize, PointerLayout)                                 \
diff --git a/runtime/vm/compiler/stub_code_compiler.cc b/runtime/vm/compiler/stub_code_compiler.cc
index dfa4d4f..4376d54 100644
--- a/runtime/vm/compiler/stub_code_compiler.cc
+++ b/runtime/vm/compiler/stub_code_compiler.cc
@@ -84,14 +84,8 @@
   if (!FLAG_precompiled_mode || !FLAG_use_bare_instructions) {
     __ LoadField(CODE_REG,
                  FieldAddress(kFunctionReg, target::Function::code_offset()));
-    if (FLAG_enable_interpreter) {
-      // InterpretCall stub needs arguments descriptor for all function calls.
-      __ LoadObject(ARGS_DESC_REG,
-                    CastHandle<Object>(OneArgArgumentsDescriptor()));
-    } else {
-      // Load a GC-safe value for the arguments descriptor (unused but tagged).
-      __ LoadImmediate(ARGS_DESC_REG, 0);
-    }
+    // Load a GC-safe value for the arguments descriptor (unused but tagged).
+    __ LoadImmediate(ARGS_DESC_REG, 0);
   }
   __ Call(FieldAddress(kFunctionReg, target::Function::entry_point_offset()));
   __ Drop(1);  // Drop argument.
@@ -166,6 +160,19 @@
   __ Breakpoint();
 }
 
+void StubCodeCompiler::GenerateAssertSubtypeStub(Assembler* assembler) {
+  __ EnterStubFrame();
+  __ PushRegister(AssertSubtypeABI::kInstantiatorTypeArgumentsReg);
+  __ PushRegister(AssertSubtypeABI::kFunctionTypeArgumentsReg);
+  __ PushRegister(AssertSubtypeABI::kSubTypeReg);
+  __ PushRegister(AssertSubtypeABI::kSuperTypeReg);
+  __ PushRegister(AssertSubtypeABI::kDstNameReg);
+  __ CallRuntime(kSubtypeCheckRuntimeEntry, /*argument_count=*/5);
+  __ Drop(5);  // Drop unused result as well as arguments.
+  __ LeaveStubFrame();
+  __ Ret();
+}
+
 void StubCodeCompiler::GenerateInstanceOfStub(Assembler* assembler) {
   __ EnterStubFrame();
   __ PushObject(NullObject());  // Make room for the result.
@@ -204,6 +211,106 @@
 CLASS_LIST_TYPED_DATA(TYPED_DATA_ALLOCATION_STUB)
 #undef TYPED_DATA_ALLOCATION_STUB
 
+void StubCodeCompiler::GenerateLateInitializationError(Assembler* assembler,
+                                                       bool with_fpu_regs) {
+  auto perform_runtime_call = [&]() {
+    __ PushRegister(LateInitializationErrorABI::kFieldReg);
+    __ CallRuntime(kLateInitializationErrorRuntimeEntry, /*argument_count=*/1);
+  };
+  GenerateSharedStubGeneric(
+      assembler, /*save_fpu_registers=*/with_fpu_regs,
+      with_fpu_regs
+          ? target::Thread::
+                late_initialization_error_shared_with_fpu_regs_stub_offset()
+          : target::Thread::
+                late_initialization_error_shared_without_fpu_regs_stub_offset(),
+      /*allow_return=*/false, perform_runtime_call);
+}
+
+void StubCodeCompiler::GenerateLateInitializationErrorSharedWithoutFPURegsStub(
+    Assembler* assembler) {
+  GenerateLateInitializationError(assembler, /*with_fpu_regs=*/false);
+}
+
+void StubCodeCompiler::GenerateLateInitializationErrorSharedWithFPURegsStub(
+    Assembler* assembler) {
+  GenerateLateInitializationError(assembler, /*with_fpu_regs=*/true);
+}
+
+void StubCodeCompiler::GenerateNullErrorSharedWithoutFPURegsStub(
+    Assembler* assembler) {
+  GenerateSharedStub(
+      assembler, /*save_fpu_registers=*/false, &kNullErrorRuntimeEntry,
+      target::Thread::null_error_shared_without_fpu_regs_stub_offset(),
+      /*allow_return=*/false);
+}
+
+void StubCodeCompiler::GenerateNullErrorSharedWithFPURegsStub(
+    Assembler* assembler) {
+  GenerateSharedStub(
+      assembler, /*save_fpu_registers=*/true, &kNullErrorRuntimeEntry,
+      target::Thread::null_error_shared_with_fpu_regs_stub_offset(),
+      /*allow_return=*/false);
+}
+
+void StubCodeCompiler::GenerateNullArgErrorSharedWithoutFPURegsStub(
+    Assembler* assembler) {
+  GenerateSharedStub(
+      assembler, /*save_fpu_registers=*/false, &kArgumentNullErrorRuntimeEntry,
+      target::Thread::null_arg_error_shared_without_fpu_regs_stub_offset(),
+      /*allow_return=*/false);
+}
+
+void StubCodeCompiler::GenerateNullArgErrorSharedWithFPURegsStub(
+    Assembler* assembler) {
+  GenerateSharedStub(
+      assembler, /*save_fpu_registers=*/true, &kArgumentNullErrorRuntimeEntry,
+      target::Thread::null_arg_error_shared_with_fpu_regs_stub_offset(),
+      /*allow_return=*/false);
+}
+
+void StubCodeCompiler::GenerateNullCastErrorSharedWithoutFPURegsStub(
+    Assembler* assembler) {
+  GenerateSharedStub(
+      assembler, /*save_fpu_registers=*/false, &kNullCastErrorRuntimeEntry,
+      target::Thread::null_cast_error_shared_without_fpu_regs_stub_offset(),
+      /*allow_return=*/false);
+}
+
+void StubCodeCompiler::GenerateNullCastErrorSharedWithFPURegsStub(
+    Assembler* assembler) {
+  GenerateSharedStub(
+      assembler, /*save_fpu_registers=*/true, &kNullCastErrorRuntimeEntry,
+      target::Thread::null_cast_error_shared_with_fpu_regs_stub_offset(),
+      /*allow_return=*/false);
+}
+
+void StubCodeCompiler::GenerateStackOverflowSharedWithoutFPURegsStub(
+    Assembler* assembler) {
+  GenerateSharedStub(
+      assembler, /*save_fpu_registers=*/false, &kStackOverflowRuntimeEntry,
+      target::Thread::stack_overflow_shared_without_fpu_regs_stub_offset(),
+      /*allow_return=*/true);
+}
+
+void StubCodeCompiler::GenerateStackOverflowSharedWithFPURegsStub(
+    Assembler* assembler) {
+  GenerateSharedStub(
+      assembler, /*save_fpu_registers=*/true, &kStackOverflowRuntimeEntry,
+      target::Thread::stack_overflow_shared_with_fpu_regs_stub_offset(),
+      /*allow_return=*/true);
+}
+
+void StubCodeCompiler::GenerateRangeErrorSharedWithoutFPURegsStub(
+    Assembler* assembler) {
+  GenerateRangeError(assembler, /*with_fpu_regs=*/false);
+}
+
+void StubCodeCompiler::GenerateRangeErrorSharedWithFPURegsStub(
+    Assembler* assembler) {
+  GenerateRangeError(assembler, /*with_fpu_regs=*/true);
+}
+
 }  // namespace compiler
 
 }  // namespace dart
diff --git a/runtime/vm/compiler/stub_code_compiler.h b/runtime/vm/compiler/stub_code_compiler.h
index d4a6fd0..5f3e09c 100644
--- a/runtime/vm/compiler/stub_code_compiler.h
+++ b/runtime/vm/compiler/stub_code_compiler.h
@@ -9,6 +9,8 @@
 #error "AOT runtime should not use compiler sources (including header files)"
 #endif  // defined(DART_PRECOMPILED_RUNTIME)
 
+#include <functional>
+
 #include "vm/allocation.h"
 #include "vm/compiler/runtime_api.h"
 #include "vm/constants.h"
@@ -146,6 +148,30 @@
   // Common function for generating Allocate<TypedData>Array stubs.
   static void GenerateAllocateTypedDataArrayStub(Assembler* assembler,
                                                  intptr_t cid);
+
+  static void GenerateSharedStubGeneric(
+      Assembler* assembler,
+      bool save_fpu_registers,
+      intptr_t self_code_stub_offset_from_thread,
+      bool allow_return,
+      std::function<void()> perform_runtime_call);
+
+  // Generates shared slow path stub which saves registers and calls
+  // [target] runtime entry.
+  // If [store_runtime_result_in_result_register], then stub puts result into
+  // SharedSlowPathStubABI::kResultReg.
+  static void GenerateSharedStub(
+      Assembler* assembler,
+      bool save_fpu_registers,
+      const RuntimeEntry* target,
+      intptr_t self_code_stub_offset_from_thread,
+      bool allow_return,
+      bool store_runtime_result_in_result_register = false);
+
+  static void GenerateLateInitializationError(Assembler* assembler,
+                                              bool with_fpu_regs);
+
+  static void GenerateRangeError(Assembler* assembler, bool with_fpu_regs);
 };
 
 }  // namespace compiler
diff --git a/runtime/vm/compiler/stub_code_compiler_arm.cc b/runtime/vm/compiler/stub_code_compiler_arm.cc
index 0969032..141f378 100644
--- a/runtime/vm/compiler/stub_code_compiler_arm.cc
+++ b/runtime/vm/compiler/stub_code_compiler_arm.cc
@@ -96,7 +96,7 @@
     Label ok;
     // Check that we are always entering from Dart code.
     __ LoadFromOffset(kWord, R8, THR, target::Thread::vm_tag_offset());
-    __ CompareImmediate(R8, VMTag::kDartCompiledTagId);
+    __ CompareImmediate(R8, VMTag::kDartTagId);
     __ b(&ok, EQ);
     __ Stop("Not coming from Dart code.");
     __ Bind(&ok);
@@ -137,7 +137,7 @@
   __ blx(R9);
 
   // Mark that the thread is executing Dart code.
-  __ LoadImmediate(R2, VMTag::kDartCompiledTagId);
+  __ LoadImmediate(R2, VMTag::kDartTagId);
   __ StoreToOffset(kWord, R2, THR, target::Thread::vm_tag_offset());
 
   // Mark that the thread has not exited generated Dart code.
@@ -165,11 +165,12 @@
   __ Ret();
 }
 
-void GenerateSharedStubGeneric(Assembler* assembler,
-                               bool save_fpu_registers,
-                               intptr_t self_code_stub_offset_from_thread,
-                               bool allow_return,
-                               std::function<void()> perform_runtime_call) {
+void StubCodeCompiler::GenerateSharedStubGeneric(
+    Assembler* assembler,
+    bool save_fpu_registers,
+    intptr_t self_code_stub_offset_from_thread,
+    bool allow_return,
+    std::function<void()> perform_runtime_call) {
   // If the target CPU does not support VFP the caller should always use the
   // non-FPU stub.
   if (save_fpu_registers && !TargetCPUFeatures::vfp_supported()) {
@@ -199,24 +200,25 @@
   __ bx(LR);
 }
 
-static void GenerateSharedStub(Assembler* assembler,
-                               bool save_fpu_registers,
-                               const RuntimeEntry* target,
-                               intptr_t self_code_stub_offset_from_thread,
-                               bool allow_return,
-                               bool store_runtime_result_in_r0 = false) {
-  ASSERT(!store_runtime_result_in_r0 || allow_return);
+void StubCodeCompiler::GenerateSharedStub(
+    Assembler* assembler,
+    bool save_fpu_registers,
+    const RuntimeEntry* target,
+    intptr_t self_code_stub_offset_from_thread,
+    bool allow_return,
+    bool store_runtime_result_in_result_register) {
+  ASSERT(!store_runtime_result_in_result_register || allow_return);
   auto perform_runtime_call = [&]() {
-    if (store_runtime_result_in_r0) {
+    if (store_runtime_result_in_result_register) {
       __ PushRegister(LR);
     }
     __ CallRuntime(*target, /*argument_count=*/0);
-    if (store_runtime_result_in_r0) {
+    if (store_runtime_result_in_result_register) {
       __ PopRegister(R0);
-      __ str(
-          R0,
-          Address(FP, target::kWordSize *
-                          StubCodeCompiler::WordOffsetFromFpToCpuRegister(R0)));
+      __ str(R0,
+             Address(FP, target::kWordSize *
+                             StubCodeCompiler::WordOffsetFromFpToCpuRegister(
+                                 SharedSlowPathStubABI::kResultReg)));
     }
   };
   GenerateSharedStubGeneric(assembler, save_fpu_registers,
@@ -491,55 +493,8 @@
   __ Breakpoint();
 }
 
-void StubCodeCompiler::GenerateNullErrorSharedWithoutFPURegsStub(
-    Assembler* assembler) {
-  GenerateSharedStub(
-      assembler, /*save_fpu_registers=*/false, &kNullErrorRuntimeEntry,
-      target::Thread::null_error_shared_without_fpu_regs_stub_offset(),
-      /*allow_return=*/false);
-}
-
-void StubCodeCompiler::GenerateNullErrorSharedWithFPURegsStub(
-    Assembler* assembler) {
-  GenerateSharedStub(
-      assembler, /*save_fpu_registers=*/true, &kNullErrorRuntimeEntry,
-      target::Thread::null_error_shared_with_fpu_regs_stub_offset(),
-      /*allow_return=*/false);
-}
-
-void StubCodeCompiler::GenerateNullArgErrorSharedWithoutFPURegsStub(
-    Assembler* assembler) {
-  GenerateSharedStub(
-      assembler, /*save_fpu_registers=*/false, &kArgumentNullErrorRuntimeEntry,
-      target::Thread::null_arg_error_shared_without_fpu_regs_stub_offset(),
-      /*allow_return=*/false);
-}
-
-void StubCodeCompiler::GenerateNullArgErrorSharedWithFPURegsStub(
-    Assembler* assembler) {
-  GenerateSharedStub(
-      assembler, /*save_fpu_registers=*/true, &kArgumentNullErrorRuntimeEntry,
-      target::Thread::null_arg_error_shared_with_fpu_regs_stub_offset(),
-      /*allow_return=*/false);
-}
-
-void StubCodeCompiler::GenerateNullCastErrorSharedWithoutFPURegsStub(
-    Assembler* assembler) {
-  GenerateSharedStub(
-      assembler, /*save_fpu_registers=*/false, &kNullCastErrorRuntimeEntry,
-      target::Thread::null_cast_error_shared_without_fpu_regs_stub_offset(),
-      /*allow_return=*/false);
-}
-
-void StubCodeCompiler::GenerateNullCastErrorSharedWithFPURegsStub(
-    Assembler* assembler) {
-  GenerateSharedStub(
-      assembler, /*save_fpu_registers=*/true, &kNullCastErrorRuntimeEntry,
-      target::Thread::null_cast_error_shared_with_fpu_regs_stub_offset(),
-      /*allow_return=*/false);
-}
-
-static void GenerateRangeError(Assembler* assembler, bool with_fpu_regs) {
+void StubCodeCompiler::GenerateRangeError(Assembler* assembler,
+                                          bool with_fpu_regs) {
   auto perform_runtime_call = [&]() {
     ASSERT(!GenericCheckBoundInstr::UseUnboxedRepresentation());
     __ PushRegister(RangeErrorABI::kLengthReg);
@@ -556,32 +511,6 @@
       /*allow_return=*/false, perform_runtime_call);
 }
 
-void StubCodeCompiler::GenerateRangeErrorSharedWithoutFPURegsStub(
-    Assembler* assembler) {
-  GenerateRangeError(assembler, /*with_fpu_regs=*/false);
-}
-
-void StubCodeCompiler::GenerateRangeErrorSharedWithFPURegsStub(
-    Assembler* assembler) {
-  GenerateRangeError(assembler, /*with_fpu_regs=*/true);
-}
-
-void StubCodeCompiler::GenerateStackOverflowSharedWithoutFPURegsStub(
-    Assembler* assembler) {
-  GenerateSharedStub(
-      assembler, /*save_fpu_registers=*/false, &kStackOverflowRuntimeEntry,
-      target::Thread::stack_overflow_shared_without_fpu_regs_stub_offset(),
-      /*allow_return=*/true);
-}
-
-void StubCodeCompiler::GenerateStackOverflowSharedWithFPURegsStub(
-    Assembler* assembler) {
-  GenerateSharedStub(
-      assembler, /*save_fpu_registers=*/true, &kStackOverflowRuntimeEntry,
-      target::Thread::stack_overflow_shared_with_fpu_regs_stub_offset(),
-      /*allow_return=*/true);
-}
-
 // Input parameters:
 //   LR : return address.
 //   SP : address of return value.
@@ -611,7 +540,7 @@
     Label ok;
     // Check that we are always entering from Dart code.
     __ LoadFromOffset(kWord, R8, THR, target::Thread::vm_tag_offset());
-    __ CompareImmediate(R8, VMTag::kDartCompiledTagId);
+    __ CompareImmediate(R8, VMTag::kDartTagId);
     __ b(&ok, EQ);
     __ Stop("Not coming from Dart code.");
     __ Bind(&ok);
@@ -658,7 +587,7 @@
   __ blx(LR);
 
   // Mark that the thread is executing Dart code.
-  __ LoadImmediate(R2, VMTag::kDartCompiledTagId);
+  __ LoadImmediate(R2, VMTag::kDartTagId);
   __ StoreToOffset(kWord, R2, THR, target::Thread::vm_tag_offset());
 
   // Mark that the thread has not exited generated Dart code.
@@ -1211,12 +1140,13 @@
 
     __ Bind(&slow_case);
   }
-  COMPILE_ASSERT(AllocateMintABI::kResultReg == R0);
+  COMPILE_ASSERT(AllocateMintABI::kResultReg ==
+                 SharedSlowPathStubABI::kResultReg);
   GenerateSharedStub(assembler, /*save_fpu_registers=*/true,
                      &kAllocateMintRuntimeEntry,
                      target::Thread::allocate_mint_with_fpu_regs_stub_offset(),
                      /*allow_return=*/true,
-                     /*store_runtime_result_in_r0=*/true);
+                     /*store_runtime_result_in_result_register=*/true);
 }
 
 // Called for allocation of Mint.
@@ -1231,12 +1161,13 @@
 
     __ Bind(&slow_case);
   }
-  COMPILE_ASSERT(AllocateMintABI::kResultReg == R0);
+  COMPILE_ASSERT(AllocateMintABI::kResultReg ==
+                 SharedSlowPathStubABI::kResultReg);
   GenerateSharedStub(
       assembler, /*save_fpu_registers=*/false, &kAllocateMintRuntimeEntry,
       target::Thread::allocate_mint_without_fpu_regs_stub_offset(),
       /*allow_return=*/true,
-      /*store_runtime_result_in_r0=*/true);
+      /*store_runtime_result_in_result_register=*/true);
 }
 
 // Called when invoking Dart code from C++ (VM code).
@@ -1299,7 +1230,7 @@
 
   // Mark that the thread is executing Dart code. Do this after initializing the
   // exit link for the profiler.
-  __ LoadImmediate(R9, VMTag::kDartCompiledTagId);
+  __ LoadImmediate(R9, VMTag::kDartTagId);
   __ StoreToOffset(kWord, R9, THR, target::Thread::vm_tag_offset());
 
   // Load arguments descriptor array into R4, which is passed to Dart code.
@@ -1376,160 +1307,6 @@
   __ Ret();
 }
 
-// Called when invoking compiled Dart code from interpreted Dart code.
-// Input parameters:
-//   LR : points to return address.
-//   R0 : raw code object of the Dart function to call.
-//   R1 : arguments raw descriptor array.
-//   R2 : address of first argument.
-//   R3 : current thread.
-void StubCodeCompiler::GenerateInvokeDartCodeFromBytecodeStub(
-    Assembler* assembler) {
-  if (FLAG_precompiled_mode) {
-    __ Stop("Not using interpreter");
-    return;
-  }
-
-  __ Push(LR);  // Marker for the profiler.
-  __ EnterFrame((1 << FP) | (1 << LR), 0);
-
-  // Push code object to PC marker slot.
-  __ ldr(IP,
-         Address(R3,
-                 target::Thread::invoke_dart_code_from_bytecode_stub_offset()));
-  __ Push(IP);
-
-  // Save new context and C++ ABI callee-saved registers.
-  __ PushList(kAbiPreservedCpuRegs);
-
-  const DRegister firstd = EvenDRegisterOf(kAbiFirstPreservedFpuReg);
-  if (TargetCPUFeatures::vfp_supported()) {
-    ASSERT(2 * kAbiPreservedFpuRegCount < 16);
-    // Save FPU registers. 2 D registers per Q register.
-    __ vstmd(DB_W, SP, firstd, 2 * kAbiPreservedFpuRegCount);
-  } else {
-    __ sub(SP, SP, Operand(kAbiPreservedFpuRegCount * kFpuRegisterSize));
-  }
-
-  // Set up THR, which caches the current thread in Dart code.
-  if (THR != R3) {
-    __ mov(THR, Operand(R3));
-  }
-
-#if defined(USING_SHADOW_CALL_STACK)
-#error Unimplemented
-#endif
-
-  // Save the current VMTag on the stack.
-  __ LoadFromOffset(kWord, R9, THR, target::Thread::vm_tag_offset());
-  __ Push(R9);
-
-  // Save top resource and top exit frame info. Use R4-6 as temporary registers.
-  // StackFrameIterator reads the top exit frame info saved in this frame.
-  __ LoadFromOffset(kWord, R4, THR, target::Thread::top_resource_offset());
-  __ Push(R4);
-  __ LoadImmediate(R8, 0);
-  __ StoreToOffset(kWord, R8, THR, target::Thread::top_resource_offset());
-
-  __ LoadFromOffset(kWord, R8, THR, target::Thread::exit_through_ffi_offset());
-  __ Push(R8);
-  __ LoadImmediate(R8, 0);
-  __ StoreToOffset(kWord, R8, THR, target::Thread::exit_through_ffi_offset());
-
-  __ LoadFromOffset(kWord, R9, THR,
-                    target::Thread::top_exit_frame_info_offset());
-  __ StoreToOffset(kWord, R8, THR,
-                   target::Thread::top_exit_frame_info_offset());
-
-  // target::frame_layout.exit_link_slot_from_entry_fp must be kept in sync
-  // with the code below.
-#if defined(TARGET_OS_MACOS) || defined(TARGET_OS_MACOS_IOS)
-  ASSERT(target::frame_layout.exit_link_slot_from_entry_fp == -27);
-#else
-  ASSERT(target::frame_layout.exit_link_slot_from_entry_fp == -28);
-#endif
-  __ Push(R9);
-
-  // Mark that the thread is executing Dart code. Do this after initializing the
-  // exit link for the profiler.
-  __ LoadImmediate(R9, VMTag::kDartCompiledTagId);
-  __ StoreToOffset(kWord, R9, THR, target::Thread::vm_tag_offset());
-
-  // Load arguments descriptor array into R4, which is passed to Dart code.
-  __ mov(R4, Operand(R1));
-
-  // Load number of arguments into R9 and adjust count for type arguments.
-  __ ldr(R3,
-         FieldAddress(R4, target::ArgumentsDescriptor::type_args_len_offset()));
-  __ ldr(R9, FieldAddress(R4, target::ArgumentsDescriptor::count_offset()));
-  __ cmp(R3, Operand(0));
-  __ AddImmediate(R9, R9, target::ToRawSmi(1),
-                  NE);  // Include the type arguments.
-  __ SmiUntag(R9);
-
-  // R2 points to first argument.
-  // Set up arguments for the Dart call.
-  Label push_arguments;
-  Label done_push_arguments;
-  __ CompareImmediate(R9, 0);  // check if there are arguments.
-  __ b(&done_push_arguments, EQ);
-  __ LoadImmediate(R1, 0);
-  __ Bind(&push_arguments);
-  __ ldr(R3, Address(R2));
-  __ Push(R3);
-  __ AddImmediate(R2, target::kWordSize);
-  __ AddImmediate(R1, 1);
-  __ cmp(R1, Operand(R9));
-  __ b(&push_arguments, LT);
-  __ Bind(&done_push_arguments);
-
-  // Call the Dart code entrypoint.
-  __ LoadImmediate(PP, 0);  // GC safe value into PP.
-  __ mov(CODE_REG, Operand(R0));
-  __ ldr(R0, FieldAddress(CODE_REG, target::Code::entry_point_offset()));
-  __ blx(R0);  // R4 is the arguments descriptor array.
-
-  // Get rid of arguments pushed on the stack.
-  __ AddImmediate(
-      SP, FP,
-      target::frame_layout.exit_link_slot_from_entry_fp * target::kWordSize);
-
-  // Restore the saved top exit frame info and top resource back into the
-  // Isolate structure. Uses R9 as a temporary register for this.
-  __ Pop(R9);
-  __ StoreToOffset(kWord, R9, THR,
-                   target::Thread::top_exit_frame_info_offset());
-  __ Pop(R9);
-  __ StoreToOffset(kWord, R9, THR, target::Thread::exit_through_ffi_offset());
-  __ Pop(R9);
-  __ StoreToOffset(kWord, R9, THR, target::Thread::top_resource_offset());
-
-  // Restore the current VMTag from the stack.
-  __ Pop(R4);
-  __ StoreToOffset(kWord, R4, THR, target::Thread::vm_tag_offset());
-
-  // Restore C++ ABI callee-saved registers.
-  if (TargetCPUFeatures::vfp_supported()) {
-    // Restore FPU registers. 2 D registers per Q register.
-    __ vldmd(IA_W, SP, firstd, 2 * kAbiPreservedFpuRegCount);
-  } else {
-    __ AddImmediate(SP, kAbiPreservedFpuRegCount * kFpuRegisterSize);
-  }
-
-#if defined(USING_SHADOW_CALL_STACK)
-#error Unimplemented
-#endif
-
-  // Restore CPU registers.
-  __ PopList(kAbiPreservedCpuRegs);
-  __ set_constant_pool_allowed(false);
-
-  // Restore the frame pointer and return.
-  __ LeaveFrame((1 << FP) | (1 << LR));
-  __ Drop(1);
-  __ Ret();
-}
-
 // Helper to generate space allocation of context stub.
 // This does not initialise the fields of the context.
 // Input:
@@ -2764,94 +2541,10 @@
   __ PopList((1 << R0) | (1 << R4));
   __ LeaveStubFrame();
 
-  // When using the interpreter, the function's code may now point to the
-  // InterpretCall stub. Make sure R0, R4 and R9 are preserved.
   __ ldr(CODE_REG, FieldAddress(R0, target::Function::code_offset()));
   __ Branch(FieldAddress(R0, target::Function::entry_point_offset()));
 }
 
-// Stub for interpreting a function call.
-// R4: Arguments descriptor.
-// R0: Function.
-void StubCodeCompiler::GenerateInterpretCallStub(Assembler* assembler) {
-  if (FLAG_precompiled_mode) {
-    __ Stop("Not using interpreter");
-    return;
-  }
-  __ EnterStubFrame();
-
-#if defined(DEBUG)
-  {
-    Label ok;
-    // Check that we are always entering from Dart code.
-    __ LoadFromOffset(kWord, R8, THR, target::Thread::vm_tag_offset());
-    __ CompareImmediate(R8, VMTag::kDartCompiledTagId);
-    __ b(&ok, EQ);
-    __ Stop("Not coming from Dart code.");
-    __ Bind(&ok);
-  }
-#endif
-
-  // Adjust arguments count for type arguments vector.
-  __ LoadFieldFromOffset(kWord, R2, R4,
-                         target::ArgumentsDescriptor::count_offset());
-  __ SmiUntag(R2);
-  __ LoadFieldFromOffset(kWord, R1, R4,
-                         target::ArgumentsDescriptor::type_args_len_offset());
-  __ cmp(R1, Operand(0));
-  __ AddImmediate(R2, R2, 1, NE);  // Include the type arguments.
-
-  // Compute argv.
-  __ mov(R3, Operand(R2, LSL, 2));
-  __ add(R3, FP, Operand(R3));
-  __ AddImmediate(R3,
-                  target::frame_layout.param_end_from_fp * target::kWordSize);
-
-  // Indicate decreasing memory addresses of arguments with negative argc.
-  __ rsb(R2, R2, Operand(0));
-
-  // Align frame before entering C++ world. Fifth argument passed on the stack.
-  __ ReserveAlignedFrameSpace(1 * target::kWordSize);
-
-  // Pass arguments in registers.
-  // R0: Function.
-  __ mov(R1, Operand(R4));  // Arguments descriptor.
-  // R2: Negative argc.
-  // R3: Argv.
-  __ str(THR, Address(SP, 0));  // Fifth argument: Thread.
-
-  // Save exit frame information to enable stack walking as we are about
-  // to transition to Dart VM C++ code.
-  __ StoreToOffset(kWord, FP, THR,
-                   target::Thread::top_exit_frame_info_offset());
-
-  // Mark that the thread exited generated code through a runtime call.
-  __ LoadImmediate(R5, target::Thread::exit_through_runtime_call());
-  __ StoreToOffset(kWord, R5, THR, target::Thread::exit_through_ffi_offset());
-
-  // Mark that the thread is executing VM code.
-  __ LoadFromOffset(kWord, R5, THR,
-                    target::Thread::interpret_call_entry_point_offset());
-  __ StoreToOffset(kWord, R5, THR, target::Thread::vm_tag_offset());
-
-  __ blx(R5);
-
-  // Mark that the thread is executing Dart code.
-  __ LoadImmediate(R2, VMTag::kDartCompiledTagId);
-  __ StoreToOffset(kWord, R2, THR, target::Thread::vm_tag_offset());
-
-  // Mark that the thread has not exited generated Dart code.
-  __ LoadImmediate(R2, 0);
-  __ StoreToOffset(kWord, R2, THR, target::Thread::exit_through_ffi_offset());
-
-  // Reset exit frame information in Isolate's mutator thread structure.
-  __ StoreToOffset(kWord, R2, THR,
-                   target::Thread::top_exit_frame_info_offset());
-
-  __ LeaveStubFrame();
-  __ Ret();
-}
-
 // R9: Contains an ICData.
 void StubCodeCompiler::GenerateICCallBreakpointStub(Assembler* assembler) {
 #if defined(PRODUCT)
@@ -3361,6 +3054,8 @@
 // R2: frame_pointer.
 // R3: thread.
 // Does not return.
+//
+// Notice: We need to keep this in sync with `Simulator::JumpToFrame()`.
 void StubCodeCompiler::GenerateJumpToFrameStub(Assembler* assembler) {
   ASSERT(kExceptionObjectReg == R0);
   ASSERT(kStackTraceObjectReg == R1);
@@ -3385,7 +3080,7 @@
   __ Bind(&exit_through_non_ffi);
 
   // Set the tag.
-  __ LoadImmediate(R2, VMTag::kDartCompiledTagId);
+  __ LoadImmediate(R2, VMTag::kDartTagId);
   __ StoreToOffset(kWord, R2, THR, target::Thread::vm_tag_offset());
   // Clear top exit frame.
   __ LoadImmediate(R2, 0);
diff --git a/runtime/vm/compiler/stub_code_compiler_arm64.cc b/runtime/vm/compiler/stub_code_compiler_arm64.cc
index 84c1a04..b749ad9 100644
--- a/runtime/vm/compiler/stub_code_compiler_arm64.cc
+++ b/runtime/vm/compiler/stub_code_compiler_arm64.cc
@@ -91,7 +91,7 @@
     Label ok;
     // Check that we are always entering from Dart code.
     __ LoadFromOffset(R8, THR, target::Thread::vm_tag_offset());
-    __ CompareImmediate(R8, VMTag::kDartCompiledTagId);
+    __ CompareImmediate(R8, VMTag::kDartTagId);
     __ b(&ok, EQ);
     __ Stop("Not coming from Dart code.");
     __ Bind(&ok);
@@ -154,7 +154,7 @@
 
   // Retval is next to 1st argument.
   // Mark that the thread is executing Dart code.
-  __ LoadImmediate(R2, VMTag::kDartCompiledTagId);
+  __ LoadImmediate(R2, VMTag::kDartTagId);
   __ StoreToOffset(R2, THR, target::Thread::vm_tag_offset());
 
   // Mark that the thread has not exited generated Dart code.
@@ -181,7 +181,7 @@
   __ ret();
 }
 
-static void GenerateSharedStubGeneric(
+void StubCodeCompiler::GenerateSharedStubGeneric(
     Assembler* assembler,
     bool save_fpu_registers,
     intptr_t self_code_stub_offset_from_thread,
@@ -209,24 +209,25 @@
   __ ret(LR);
 }
 
-static void GenerateSharedStub(Assembler* assembler,
-                               bool save_fpu_registers,
-                               const RuntimeEntry* target,
-                               intptr_t self_code_stub_offset_from_thread,
-                               bool allow_return,
-                               bool store_runtime_result_in_r0 = false) {
-  ASSERT(!store_runtime_result_in_r0 || allow_return);
+void StubCodeCompiler::GenerateSharedStub(
+    Assembler* assembler,
+    bool save_fpu_registers,
+    const RuntimeEntry* target,
+    intptr_t self_code_stub_offset_from_thread,
+    bool allow_return,
+    bool store_runtime_result_in_result_register) {
+  ASSERT(!store_runtime_result_in_result_register || allow_return);
   auto perform_runtime_call = [&]() {
-    if (store_runtime_result_in_r0) {
+    if (store_runtime_result_in_result_register) {
       __ PushRegister(NULL_REG);
     }
     __ CallRuntime(*target, /*argument_count=*/0);
-    if (store_runtime_result_in_r0) {
+    if (store_runtime_result_in_result_register) {
       __ PopRegister(R0);
-      __ str(
-          R0,
-          Address(FP, target::kWordSize *
-                          StubCodeCompiler::WordOffsetFromFpToCpuRegister(R0)));
+      __ str(R0,
+             Address(FP, target::kWordSize *
+                             StubCodeCompiler::WordOffsetFromFpToCpuRegister(
+                                 SharedSlowPathStubABI::kResultReg)));
     }
   };
   GenerateSharedStubGeneric(assembler, save_fpu_registers,
@@ -545,55 +546,8 @@
   __ Breakpoint();
 }
 
-void StubCodeCompiler::GenerateNullErrorSharedWithoutFPURegsStub(
-    Assembler* assembler) {
-  GenerateSharedStub(
-      assembler, /*save_fpu_registers=*/false, &kNullErrorRuntimeEntry,
-      target::Thread::null_error_shared_without_fpu_regs_stub_offset(),
-      /*allow_return=*/false);
-}
-
-void StubCodeCompiler::GenerateNullErrorSharedWithFPURegsStub(
-    Assembler* assembler) {
-  GenerateSharedStub(
-      assembler, /*save_fpu_registers=*/true, &kNullErrorRuntimeEntry,
-      target::Thread::null_error_shared_with_fpu_regs_stub_offset(),
-      /*allow_return=*/false);
-}
-
-void StubCodeCompiler::GenerateNullArgErrorSharedWithoutFPURegsStub(
-    Assembler* assembler) {
-  GenerateSharedStub(
-      assembler, /*save_fpu_registers=*/false, &kArgumentNullErrorRuntimeEntry,
-      target::Thread::null_arg_error_shared_without_fpu_regs_stub_offset(),
-      /*allow_return=*/false);
-}
-
-void StubCodeCompiler::GenerateNullArgErrorSharedWithFPURegsStub(
-    Assembler* assembler) {
-  GenerateSharedStub(
-      assembler, /*save_fpu_registers=*/true, &kArgumentNullErrorRuntimeEntry,
-      target::Thread::null_arg_error_shared_with_fpu_regs_stub_offset(),
-      /*allow_return=*/false);
-}
-
-void StubCodeCompiler::GenerateNullCastErrorSharedWithoutFPURegsStub(
-    Assembler* assembler) {
-  GenerateSharedStub(
-      assembler, /*save_fpu_registers=*/false, &kNullCastErrorRuntimeEntry,
-      target::Thread::null_cast_error_shared_without_fpu_regs_stub_offset(),
-      /*allow_return=*/false);
-}
-
-void StubCodeCompiler::GenerateNullCastErrorSharedWithFPURegsStub(
-    Assembler* assembler) {
-  GenerateSharedStub(
-      assembler, /*save_fpu_registers=*/true, &kNullCastErrorRuntimeEntry,
-      target::Thread::null_cast_error_shared_with_fpu_regs_stub_offset(),
-      /*allow_return=*/false);
-}
-
-static void GenerateRangeError(Assembler* assembler, bool with_fpu_regs) {
+void StubCodeCompiler::GenerateRangeError(Assembler* assembler,
+                                          bool with_fpu_regs) {
   auto perform_runtime_call = [&]() {
     // If the generated code has unboxed index/length we need to box them before
     // calling the runtime entry.
@@ -640,32 +594,6 @@
       /*allow_return=*/false, perform_runtime_call);
 }
 
-void StubCodeCompiler::GenerateRangeErrorSharedWithoutFPURegsStub(
-    Assembler* assembler) {
-  GenerateRangeError(assembler, /*with_fpu_regs=*/false);
-}
-
-void StubCodeCompiler::GenerateRangeErrorSharedWithFPURegsStub(
-    Assembler* assembler) {
-  GenerateRangeError(assembler, /*with_fpu_regs=*/true);
-}
-
-void StubCodeCompiler::GenerateStackOverflowSharedWithoutFPURegsStub(
-    Assembler* assembler) {
-  GenerateSharedStub(
-      assembler, /*save_fpu_registers=*/false, &kStackOverflowRuntimeEntry,
-      target::Thread::stack_overflow_shared_without_fpu_regs_stub_offset(),
-      /*allow_return=*/true);
-}
-
-void StubCodeCompiler::GenerateStackOverflowSharedWithFPURegsStub(
-    Assembler* assembler) {
-  GenerateSharedStub(
-      assembler, /*save_fpu_registers=*/true, &kStackOverflowRuntimeEntry,
-      target::Thread::stack_overflow_shared_with_fpu_regs_stub_offset(),
-      /*allow_return=*/true);
-}
-
 // Input parameters:
 //   LR : return address.
 //   SP : address of return value.
@@ -694,7 +622,7 @@
     Label ok;
     // Check that we are always entering from Dart code.
     __ LoadFromOffset(R6, THR, target::Thread::vm_tag_offset());
-    __ CompareImmediate(R6, VMTag::kDartCompiledTagId);
+    __ CompareImmediate(R6, VMTag::kDartTagId);
     __ b(&ok, EQ);
     __ Stop("Not coming from Dart code.");
     __ Bind(&ok);
@@ -757,7 +685,7 @@
   __ RestorePinnedRegisters();
 
   // Mark that the thread is executing Dart code.
-  __ LoadImmediate(R2, VMTag::kDartCompiledTagId);
+  __ LoadImmediate(R2, VMTag::kDartTagId);
   __ StoreToOffset(R2, THR, target::Thread::vm_tag_offset());
 
   // Mark that the thread has not exited generated Dart code.
@@ -1334,12 +1262,13 @@
 
     __ Bind(&slow_case);
   }
-  COMPILE_ASSERT(AllocateMintABI::kResultReg == R0);
+  COMPILE_ASSERT(AllocateMintABI::kResultReg ==
+                 SharedSlowPathStubABI::kResultReg);
   GenerateSharedStub(assembler, /*save_fpu_registers=*/true,
                      &kAllocateMintRuntimeEntry,
                      target::Thread::allocate_mint_with_fpu_regs_stub_offset(),
                      /*allow_return=*/true,
-                     /*store_runtime_result_in_r0=*/true);
+                     /*store_runtime_result_in_result_register=*/true);
 }
 
 void StubCodeCompiler::GenerateAllocateMintSharedWithoutFPURegsStub(
@@ -1353,12 +1282,13 @@
 
     __ Bind(&slow_case);
   }
-  COMPILE_ASSERT(AllocateMintABI::kResultReg == R0);
+  COMPILE_ASSERT(AllocateMintABI::kResultReg ==
+                 SharedSlowPathStubABI::kResultReg);
   GenerateSharedStub(
       assembler, /*save_fpu_registers=*/false, &kAllocateMintRuntimeEntry,
       target::Thread::allocate_mint_without_fpu_regs_stub_offset(),
       /*allow_return=*/true,
-      /*store_runtime_result_in_r0=*/true);
+      /*store_runtime_result_in_result_register=*/true);
 }
 
 // Called when invoking Dart code from C++ (VM code).
@@ -1428,7 +1358,7 @@
 
   // Mark that the thread is executing Dart code. Do this after initializing the
   // exit link for the profiler.
-  __ LoadImmediate(R6, VMTag::kDartCompiledTagId);
+  __ LoadImmediate(R6, VMTag::kDartTagId);
   __ StoreToOffset(R6, THR, target::Thread::vm_tag_offset());
 
   // Load arguments descriptor array into R4, which is passed to Dart code.
@@ -1514,157 +1444,6 @@
   __ ret();
 }
 
-// Called when invoking compiled Dart code from interpreted Dart code.
-// Input parameters:
-//   LR : points to return address.
-//   R0 : raw code object of the Dart function to call.
-//   R1 : arguments raw descriptor array.
-//   R2 : address of first argument.
-//   R3 : current thread.
-void StubCodeCompiler::GenerateInvokeDartCodeFromBytecodeStub(
-    Assembler* assembler) {
-  if (FLAG_precompiled_mode) {
-    __ Stop("Not using interpreter");
-    return;
-  }
-
-  // Copy the C stack pointer (CSP/R31) into the stack pointer we'll actually
-  // use to access the stack (SP/R15) and set the C stack pointer to near the
-  // stack limit, loaded from the Thread held in R3, to prevent signal handlers
-  // from over-writing Dart frames.
-  __ mov(SP, CSP);
-  __ SetupCSPFromThread(R3);
-  __ Push(LR);  // Marker for the profiler.
-  __ EnterFrame(0);
-
-  // Push code object to PC marker slot.
-  __ ldr(TMP,
-         Address(R3,
-                 target::Thread::invoke_dart_code_from_bytecode_stub_offset()));
-  __ Push(TMP);
-
-#if defined(TARGET_OS_FUCHSIA)
-  __ str(R18, Address(R3, target::Thread::saved_shadow_call_stack_offset()));
-#elif defined(USING_SHADOW_CALL_STACK)
-#error Unimplemented
-#endif
-
-  __ PushNativeCalleeSavedRegisters();
-
-  // Set up THR, which caches the current thread in Dart code.
-  if (THR != R3) {
-    __ mov(THR, R3);
-  }
-
-  // Refresh pinned registers values (inc. write barrier mask and null object).
-  __ RestorePinnedRegisters();
-
-  // Save the current VMTag on the stack.
-  __ LoadFromOffset(R4, THR, target::Thread::vm_tag_offset());
-  __ Push(R4);
-
-  // Save top resource and top exit frame info. Use R6 as a temporary register.
-  // StackFrameIterator reads the top exit frame info saved in this frame.
-  __ LoadFromOffset(R6, THR, target::Thread::top_resource_offset());
-  __ StoreToOffset(ZR, THR, target::Thread::top_resource_offset());
-  __ Push(R6);
-
-  __ LoadFromOffset(R6, THR, target::Thread::exit_through_ffi_offset());
-  __ Push(R6);
-  __ LoadImmediate(R6, 0);
-  __ StoreToOffset(R6, THR, target::Thread::exit_through_ffi_offset());
-
-  __ LoadFromOffset(R6, THR, target::Thread::top_exit_frame_info_offset());
-  __ StoreToOffset(ZR, THR, target::Thread::top_exit_frame_info_offset());
-  // target::frame_layout.exit_link_slot_from_entry_fp must be kept in sync
-  // with the code below.
-#if defined(TARGET_OS_FUCHSIA)
-  ASSERT(target::frame_layout.exit_link_slot_from_entry_fp == -24);
-#else
-  ASSERT(target::frame_layout.exit_link_slot_from_entry_fp == -23);
-#endif
-  __ Push(R6);
-
-  // Mark that the thread is executing Dart code. Do this after initializing the
-  // exit link for the profiler.
-  __ LoadImmediate(R6, VMTag::kDartCompiledTagId);
-  __ StoreToOffset(R6, THR, target::Thread::vm_tag_offset());
-
-  // Load arguments descriptor array into R4, which is passed to Dart code.
-  __ mov(R4, R1);
-
-  // Load number of arguments into R5 and adjust count for type arguments.
-  __ LoadFieldFromOffset(R5, R4, target::ArgumentsDescriptor::count_offset());
-  __ LoadFieldFromOffset(R3, R4,
-                         target::ArgumentsDescriptor::type_args_len_offset());
-  __ AddImmediate(TMP, R5, 1);  // Include the type arguments.
-  __ cmp(R3, Operand(0));
-  __ csinc(R5, R5, TMP, EQ);  // R5 <- (R3 == 0) ? R5 : TMP + 1 (R5 : R5 + 2).
-  __ SmiUntag(R5);
-
-  // R2 points to first argument.
-  // Set up arguments for the Dart call.
-  Label push_arguments;
-  Label done_push_arguments;
-  __ cmp(R5, Operand(0));
-  __ b(&done_push_arguments, EQ);  // check if there are arguments.
-  __ LoadImmediate(R1, 0);
-  __ Bind(&push_arguments);
-  __ ldr(R3, Address(R2));
-  __ Push(R3);
-  __ add(R1, R1, Operand(1));
-  __ add(R2, R2, Operand(target::kWordSize));
-  __ cmp(R1, Operand(R5));
-  __ b(&push_arguments, LT);
-  __ Bind(&done_push_arguments);
-
-  // We now load the pool pointer(PP) with a GC safe value as we are about to
-  // invoke dart code. We don't need a real object pool here.
-  // Smi zero does not work because ARM64 assumes PP to be untagged.
-  __ LoadObject(PP, NullObject());
-
-  // Call the Dart code entrypoint.
-  __ mov(CODE_REG, R0);
-  __ ldr(R0, FieldAddress(CODE_REG, target::Code::entry_point_offset()));
-  __ blr(R0);  // R4 is the arguments descriptor array.
-
-  // Get rid of arguments pushed on the stack.
-  __ AddImmediate(
-      SP, FP,
-      target::frame_layout.exit_link_slot_from_entry_fp * target::kWordSize);
-
-  // Restore the saved top exit frame info and top resource back into the
-  // Isolate structure. Uses R6 as a temporary register for this.
-  __ Pop(R6);
-  __ StoreToOffset(R6, THR, target::Thread::top_exit_frame_info_offset());
-  __ Pop(R6);
-  __ StoreToOffset(R6, THR, target::Thread::exit_through_ffi_offset());
-  __ Pop(R6);
-  __ StoreToOffset(R6, THR, target::Thread::top_resource_offset());
-
-  // Restore the current VMTag from the stack.
-  __ Pop(R4);
-  __ StoreToOffset(R4, THR, target::Thread::vm_tag_offset());
-
-#if defined(TARGET_OS_FUCHSIA)
-  __ mov(R3, THR);
-#endif
-
-  __ PopNativeCalleeSavedRegisters();  // Clobbers THR
-
-#if defined(TARGET_OS_FUCHSIA)
-  __ str(R18, Address(R3, target::Thread::saved_shadow_call_stack_offset()));
-#elif defined(USING_SHADOW_CALL_STACK)
-#error Unimplemented
-#endif
-
-  // Restore the frame pointer and C stack pointer and return.
-  __ LeaveFrame();
-  __ Drop(1);
-  __ RestoreCSP();
-  __ ret();
-}
-
 // Helper to generate space allocation of context stub.
 // This does not initialise the fields of the context.
 // Input:
@@ -1812,7 +1591,7 @@
     Label slow_case;
 
     // Load num. variable (int32) in the existing context.
-    __ ldr(R1, FieldAddress(R5, target::Context::num_variables_offset()),
+    __ ldr(R1, FieldAddress(R5, target::Context::num_variables_offset(), kWord),
            kWord);
 
     GenerateAllocateContextSpaceStub(assembler, &slow_case);
@@ -2928,106 +2707,11 @@
   __ Pop(R4);  // Restore arg desc.
   __ LeaveStubFrame();
 
-  // When using the interpreter, the function's code may now point to the
-  // InterpretCall stub. Make sure R0, R4, and R5 are preserved.
   __ LoadFieldFromOffset(CODE_REG, R0, target::Function::code_offset());
   __ LoadFieldFromOffset(R2, R0, target::Function::entry_point_offset());
   __ br(R2);
 }
 
-// Stub for interpreting a function call.
-// R4: Arguments descriptor.
-// R0: Function.
-void StubCodeCompiler::GenerateInterpretCallStub(Assembler* assembler) {
-  if (FLAG_precompiled_mode) {
-    __ Stop("Not using interpreter");
-    return;
-  }
-
-  __ SetPrologueOffset();
-  __ EnterStubFrame();
-
-#if defined(DEBUG)
-  {
-    Label ok;
-    // Check that we are always entering from Dart code.
-    __ LoadFromOffset(R8, THR, target::Thread::vm_tag_offset());
-    __ CompareImmediate(R8, VMTag::kDartCompiledTagId);
-    __ b(&ok, EQ);
-    __ Stop("Not coming from Dart code.");
-    __ Bind(&ok);
-  }
-#endif
-
-  // Adjust arguments count for type arguments vector.
-  __ LoadFieldFromOffset(R2, R4, target::ArgumentsDescriptor::count_offset());
-  __ SmiUntag(R2);
-  __ LoadFieldFromOffset(R1, R4,
-                         target::ArgumentsDescriptor::type_args_len_offset());
-  __ cmp(R1, Operand(0));
-  __ csinc(R2, R2, R2, EQ);  // R2 <- (R1 == 0) ? R2 : R2 + 1.
-
-  // Compute argv.
-  __ add(R3, ZR, Operand(R2, LSL, 3));
-  __ add(R3, FP, Operand(R3));
-  __ AddImmediate(R3,
-                  target::frame_layout.param_end_from_fp * target::kWordSize);
-
-  // Indicate decreasing memory addresses of arguments with negative argc.
-  __ neg(R2, R2);
-
-  // Align frame before entering C++ world. No shadow stack space required.
-  __ ReserveAlignedFrameSpace(0 * target::kWordSize);
-
-  // Pass arguments in registers.
-  // R0: Function.
-  __ mov(R1, R4);  // Arguments descriptor.
-  // R2: Negative argc.
-  // R3: Argv.
-  __ mov(R4, THR);  // Thread.
-
-  // Save exit frame information to enable stack walking as we are about
-  // to transition to Dart VM C++ code.
-  __ StoreToOffset(FP, THR, target::Thread::top_exit_frame_info_offset());
-
-  // Mark that the thread exited generated code through a runtime call.
-  __ LoadImmediate(R5, target::Thread::exit_through_runtime_call());
-  __ StoreToOffset(R5, THR, target::Thread::exit_through_ffi_offset());
-
-  // Mark that the thread is executing VM code.
-  __ LoadFromOffset(R5, THR,
-                    target::Thread::interpret_call_entry_point_offset());
-  __ StoreToOffset(R5, THR, target::Thread::vm_tag_offset());
-
-  // We are entering runtime code, so the C stack pointer must be restored from
-  // the stack limit to the top of the stack. We cache the stack limit address
-  // in a callee-saved register.
-  __ mov(R25, CSP);
-  __ mov(CSP, SP);
-
-  __ blr(R5);
-
-  // Restore SP and CSP.
-  __ mov(SP, CSP);
-  __ mov(CSP, R25);
-
-  // Refresh pinned registers values (inc. write barrier mask and null object).
-  __ RestorePinnedRegisters();
-
-  // Mark that the thread is executing Dart code.
-  __ LoadImmediate(R2, VMTag::kDartCompiledTagId);
-  __ StoreToOffset(R2, THR, target::Thread::vm_tag_offset());
-
-  // Mark that the thread has not exited generated Dart code.
-  __ StoreToOffset(ZR, THR, target::Thread::exit_through_ffi_offset());
-
-  // Reset exit frame information in Isolate's mutator thread structure.
-  __ StoreToOffset(ZR, THR, target::Thread::top_exit_frame_info_offset());
-
-  __ LeaveStubFrame();
-  __ ret();
-}
-
 // R5: Contains an ICData.
 void StubCodeCompiler::GenerateICCallBreakpointStub(Assembler* assembler) {
 #if defined(PRODUCT)
@@ -3461,10 +3145,10 @@
   __ BranchIf(NOT_EQUAL, &is_complex_case);
 
   // Check whether this [Type] is instantiated/uninstantiated.
-  __ ldr(
-      kTmp,
-      FieldAddress(TypeTestABI::kDstTypeReg, target::Type::type_state_offset()),
-      kByte);
+  __ ldr(kTmp,
+         FieldAddress(TypeTestABI::kDstTypeReg,
+                      target::Type::type_state_offset(), kByte),
+         kByte);
   __ cmp(kTmp,
          Operand(target::AbstractTypeLayout::kTypeStateFinalizedInstantiated));
   __ BranchIf(NOT_EQUAL, &is_complex_case);
@@ -3525,6 +3209,8 @@
 // R2: frame_pointer.
 // R3: thread.
 // Does not return.
+//
+// Notice: We need to keep this in sync with `Simulator::JumpToFrame()`.
 void StubCodeCompiler::GenerateJumpToFrameStub(Assembler* assembler) {
   ASSERT(kExceptionObjectReg == R0);
   ASSERT(kStackTraceObjectReg == R1);
@@ -3552,7 +3238,7 @@
   // Refresh pinned registers values (inc. write barrier mask and null object).
   __ RestorePinnedRegisters();
   // Set the tag.
-  __ LoadImmediate(R2, VMTag::kDartCompiledTagId);
+  __ LoadImmediate(R2, VMTag::kDartTagId);
   __ StoreToOffset(R2, THR, target::Thread::vm_tag_offset());
   // Clear top exit frame.
   __ StoreToOffset(ZR, THR, target::Thread::top_exit_frame_info_offset());
@@ -3923,9 +3609,13 @@
 void StubCodeCompiler::GenerateSingleTargetCallStub(Assembler* assembler) {
   Label miss;
   __ LoadClassIdMayBeSmi(R1, R0);
-  __ ldr(R2, FieldAddress(R5, target::SingleTargetCache::lower_limit_offset()),
+  __ ldr(R2,
+         FieldAddress(R5, target::SingleTargetCache::lower_limit_offset(),
+                      kHalfword),
          kUnsignedHalfword);
-  __ ldr(R3, FieldAddress(R5, target::SingleTargetCache::upper_limit_offset()),
+  __ ldr(R3,
+         FieldAddress(R5, target::SingleTargetCache::upper_limit_offset(),
+                      kHalfword),
          kUnsignedHalfword);
 
   __ cmp(R1, Operand(R2));
diff --git a/runtime/vm/compiler/stub_code_compiler_ia32.cc b/runtime/vm/compiler/stub_code_compiler_ia32.cc
index 369f95b..bc4c545 100644
--- a/runtime/vm/compiler/stub_code_compiler_ia32.cc
+++ b/runtime/vm/compiler/stub_code_compiler_ia32.cc
@@ -93,7 +93,7 @@
   {
     Label ok;
     // Check that we are always entering from Dart code.
-    __ cmpl(Assembler::VMTagAddress(), Immediate(VMTag::kDartCompiledTagId));
+    __ cmpl(Assembler::VMTagAddress(), Immediate(VMTag::kDartTagId));
     __ j(EQUAL, &ok, Assembler::kNearJump);
     __ Stop("Not coming from Dart code.");
     __ Bind(&ok);
@@ -126,7 +126,7 @@
   __ movl(Address(ESP, retval_offset), EAX);  // Set retval in NativeArguments.
   __ call(ECX);
 
-  __ movl(Assembler::VMTagAddress(), Immediate(VMTag::kDartCompiledTagId));
+  __ movl(Assembler::VMTagAddress(), Immediate(VMTag::kDartTagId));
 
   // Mark that the thread has not exited generated Dart code.
   __ movl(Address(THR, target::Thread::exit_through_ffi_offset()),
@@ -298,61 +298,36 @@
 #endif
 }
 
-void StubCodeCompiler::GenerateDispatchTableNullErrorStub(
-    Assembler* assembler) {
+void StubCodeCompiler::GenerateSharedStubGeneric(
+    Assembler* assembler,
+    bool save_fpu_registers,
+    intptr_t self_code_stub_offset_from_thread,
+    bool allow_return,
+    std::function<void()> perform_runtime_call) {
   // Only used in AOT.
   __ Breakpoint();
 }
 
-void StubCodeCompiler::GenerateNullErrorSharedWithoutFPURegsStub(
-    Assembler* assembler) {
+void StubCodeCompiler::GenerateSharedStub(
+    Assembler* assembler,
+    bool save_fpu_registers,
+    const RuntimeEntry* target,
+    intptr_t self_code_stub_offset_from_thread,
+    bool allow_return,
+    bool store_runtime_result_in_result_register) {
+  // Only used in AOT.
   __ Breakpoint();
 }
 
-void StubCodeCompiler::GenerateNullErrorSharedWithFPURegsStub(
-    Assembler* assembler) {
+void StubCodeCompiler::GenerateRangeError(Assembler* assembler,
+                                          bool with_fpu_regs) {
+  // Only used in AOT.
   __ Breakpoint();
 }
 
-void StubCodeCompiler::GenerateNullArgErrorSharedWithoutFPURegsStub(
+void StubCodeCompiler::GenerateDispatchTableNullErrorStub(
     Assembler* assembler) {
-  __ Breakpoint();
-}
-
-void StubCodeCompiler::GenerateNullArgErrorSharedWithFPURegsStub(
-    Assembler* assembler) {
-  __ Breakpoint();
-}
-
-void StubCodeCompiler::GenerateNullCastErrorSharedWithoutFPURegsStub(
-    Assembler* assembler) {
-  __ Breakpoint();
-}
-
-void StubCodeCompiler::GenerateNullCastErrorSharedWithFPURegsStub(
-    Assembler* assembler) {
-  __ Breakpoint();
-}
-
-void StubCodeCompiler::GenerateRangeErrorSharedWithoutFPURegsStub(
-    Assembler* assembler) {
-  __ Breakpoint();
-}
-
-void StubCodeCompiler::GenerateRangeErrorSharedWithFPURegsStub(
-    Assembler* assembler) {
-  __ Breakpoint();
-}
-
-void StubCodeCompiler::GenerateStackOverflowSharedWithoutFPURegsStub(
-    Assembler* assembler) {
-  // TODO(sjindel): implement.
-  __ Breakpoint();
-}
-
-void StubCodeCompiler::GenerateStackOverflowSharedWithFPURegsStub(
-    Assembler* assembler) {
-  // TODO(sjindel): implement.
+  // Only used in AOT.
   __ Breakpoint();
 }
 
@@ -389,7 +364,7 @@
   {
     Label ok;
     // Check that we are always entering from Dart code.
-    __ cmpl(Assembler::VMTagAddress(), Immediate(VMTag::kDartCompiledTagId));
+    __ cmpl(Assembler::VMTagAddress(), Immediate(VMTag::kDartTagId));
     __ j(EQUAL, &ok, Assembler::kNearJump);
     __ Stop("Not coming from Dart code.");
     __ Bind(&ok);
@@ -425,7 +400,7 @@
   __ movl(Address(ESP, target::kWordSize), ECX);  // Function to call.
   __ call(wrapper_address);
 
-  __ movl(Assembler::VMTagAddress(), Immediate(VMTag::kDartCompiledTagId));
+  __ movl(Assembler::VMTagAddress(), Immediate(VMTag::kDartTagId));
 
   // Mark that the thread has not exited generated Dart code.
   __ movl(Address(THR, target::Thread::exit_through_ffi_offset()),
@@ -980,7 +955,7 @@
 
   // Mark that the thread is executing Dart code. Do this after initializing the
   // exit link for the profiler.
-  __ movl(Assembler::VMTagAddress(), Immediate(VMTag::kDartCompiledTagId));
+  __ movl(Assembler::VMTagAddress(), Immediate(VMTag::kDartTagId));
 
   // Load arguments descriptor array into EDX.
   __ movl(EDX, Address(EBP, kArgumentsDescOffset));
@@ -1054,134 +1029,6 @@
   __ ret();
 }
 
-// Called when invoking compiled Dart code from interpreted Dart code.
-// Input parameters:
-//   ESP : points to return address.
-//   ESP + 4 : target raw code
-//   ESP + 8 : arguments raw descriptor array.
-//   ESP + 12: address of first argument.
-//   ESP + 16 : current thread.
-void StubCodeCompiler::GenerateInvokeDartCodeFromBytecodeStub(
-    Assembler* assembler) {
-  const intptr_t kTargetCodeOffset = 3 * target::kWordSize;
-  const intptr_t kArgumentsDescOffset = 4 * target::kWordSize;
-  const intptr_t kArgumentsOffset = 5 * target::kWordSize;
-  const intptr_t kThreadOffset = 6 * target::kWordSize;
-
-  __ pushl(Address(ESP, 0));  // Marker for the profiler.
-  __ EnterFrame(0);
-
-  // Push code object to PC marker slot.
-  __ movl(EAX, Address(EBP, kThreadOffset));
-  __ pushl(Address(EAX, target::Thread::invoke_dart_code_stub_offset()));
-
-  // Save C++ ABI callee-saved registers.
-  __ pushl(EBX);
-  __ pushl(ESI);
-  __ pushl(EDI);
-
-  // Set up THR, which caches the current thread in Dart code.
-  __ movl(THR, EAX);
-
-#if defined(USING_SHADOW_CALL_STACK)
-#error Unimplemented
-#endif
-
-  // Save the current VMTag on the stack.
-  __ movl(ECX, Assembler::VMTagAddress());
-  __ pushl(ECX);
-
-  // Save top resource and top exit frame info. Use EDX as a temporary register.
-  // StackFrameIterator reads the top exit frame info saved in this frame.
-  __ movl(EDX, Address(THR, target::Thread::top_resource_offset()));
-  __ pushl(EDX);
-  __ movl(Address(THR, target::Thread::top_resource_offset()), Immediate(0));
-
-  __ movl(EAX, Address(THR, target::Thread::exit_through_ffi_offset()));
-  __ pushl(EAX);
-  __ movl(Address(THR, target::Thread::exit_through_ffi_offset()),
-          Immediate(0));
-
-  // The constant target::frame_layout.exit_link_slot_from_entry_fp must be
-  // kept in sync with the code below.
-  ASSERT(target::frame_layout.exit_link_slot_from_entry_fp == -8);
-  __ movl(EDX, Address(THR, target::Thread::top_exit_frame_info_offset()));
-  __ pushl(EDX);
-  __ movl(Address(THR, target::Thread::top_exit_frame_info_offset()),
-          Immediate(0));
-
-  // Mark that the thread is executing Dart code. Do this after initializing the
-  // exit link for the profiler.
-  __ movl(Assembler::VMTagAddress(), Immediate(VMTag::kDartCompiledTagId));
-
-  // Load arguments descriptor array into EDX.
-  __ movl(EDX, Address(EBP, kArgumentsDescOffset));
-
-  // Load number of arguments into EBX and adjust count for type arguments.
-  __ movl(EBX, FieldAddress(EDX, target::ArgumentsDescriptor::count_offset()));
-  __ cmpl(
-      FieldAddress(EDX, target::ArgumentsDescriptor::type_args_len_offset()),
-      Immediate(0));
-  Label args_count_ok;
-  __ j(EQUAL, &args_count_ok, Assembler::kNearJump);
-  __ addl(EBX, Immediate(target::ToRawSmi(1)));  // Include the type arguments.
-  __ Bind(&args_count_ok);
-  // Save number of arguments as Smi on stack, replacing ArgumentsDesc.
-  __ movl(Address(EBP, kArgumentsDescOffset), EBX);
-  __ SmiUntag(EBX);
-
-  // Set up arguments for the dart call.
-  Label push_arguments;
-  Label done_push_arguments;
-  __ testl(EBX, EBX);  // check if there are arguments.
-  __ j(ZERO, &done_push_arguments, Assembler::kNearJump);
-  __ movl(EAX, Immediate(0));
-
-  // Compute address of 'arguments array' data area into EDI.
-  __ movl(EDI, Address(EBP, kArgumentsOffset));
-
-  __ Bind(&push_arguments);
-  __ movl(ECX, Address(EDI, EAX, TIMES_4, 0));
-  __ pushl(ECX);
-  __ incl(EAX);
-  __ cmpl(EAX, EBX);
-  __ j(LESS, &push_arguments, Assembler::kNearJump);
-  __ Bind(&done_push_arguments);
-
-  // Call the dart code entrypoint.
-  __ movl(EAX, Address(EBP, kTargetCodeOffset));
-  __ call(FieldAddress(EAX, target::Code::entry_point_offset()));
-
-  // Read the saved number of passed arguments as Smi.
-  __ movl(EDX, Address(EBP, kArgumentsDescOffset));
-  // Get rid of arguments pushed on the stack.
-  __ leal(ESP, Address(ESP, EDX, TIMES_2, 0));  // EDX is a Smi.
-
-  // Restore the saved top exit frame info and top resource back into the
-  // Isolate structure.
-  __ popl(Address(THR, target::Thread::top_exit_frame_info_offset()));
-  __ popl(Address(THR, target::Thread::exit_through_ffi_offset()));
-  __ popl(Address(THR, target::Thread::top_resource_offset()));
-
-  // Restore the current VMTag from the stack.
-  __ popl(Assembler::VMTagAddress());
-
-#if defined(USING_SHADOW_CALL_STACK)
-#error Unimplemented
-#endif
-
-  // Restore C++ ABI callee-saved registers.
-  __ popl(EDI);
-  __ popl(ESI);
-  __ popl(EBX);
-
-  // Restore the frame pointer.
-  __ LeaveFrame();
-  __ popl(ECX);
-
-  __ ret();
-}
-
 // Helper to generate space allocation of context stub.
 // This does not initialise the fields of the context.
 // Input:
@@ -2256,85 +2103,9 @@
   __ popl(EDX);  // Restore arguments descriptor array.
   __ LeaveFrame();
 
-  // When using the interpreter, the function's code may now point to the
-  // InterpretCall stub. Make sure EAX, ECX, and EDX are preserved.
   __ jmp(FieldAddress(EAX, target::Function::entry_point_offset()));
 }
 
-// Stub for interpreting a function call.
-// EDX: Arguments descriptor.
-// EAX: Function.
-void StubCodeCompiler::GenerateInterpretCallStub(Assembler* assembler) {
-  __ EnterStubFrame();
-
-#if defined(DEBUG)
-  {
-    Label ok;
-    // Check that we are always entering from Dart code.
-    __ cmpl(Assembler::VMTagAddress(), Immediate(VMTag::kDartCompiledTagId));
-    __ j(EQUAL, &ok, Assembler::kNearJump);
-    __ Stop("Not coming from Dart code.");
-    __ Bind(&ok);
-  }
-#endif
-
-  // Adjust arguments count for type arguments vector.
-  __ movl(ECX, FieldAddress(EDX, target::ArgumentsDescriptor::count_offset()));
-  __ SmiUntag(ECX);
-  __ cmpl(
-      FieldAddress(EDX, target::ArgumentsDescriptor::type_args_len_offset()),
-      Immediate(0));
-  Label args_count_ok;
-  __ j(EQUAL, &args_count_ok, Assembler::kNearJump);
-  __ incl(ECX);
-  __ Bind(&args_count_ok);
-
-  // Compute argv.
-  __ leal(EBX,
-          Address(EBP, ECX, TIMES_4,
-                  target::frame_layout.param_end_from_fp * target::kWordSize));
-
-  // Indicate decreasing memory addresses of arguments with negative argc.
-  __ negl(ECX);
-
-  __ pushl(THR);  // Arg 4: Thread.
-  __ pushl(EBX);  // Arg 3: Argv.
-  __ pushl(ECX);  // Arg 2: Negative argc.
-  __ pushl(EDX);  // Arg 1: Arguments descriptor
-  __ pushl(EAX);  // Arg 0: Function
-
-  // Save exit frame information to enable stack walking as we are about
-  // to transition to Dart VM C++ code.
-  __ movl(Address(THR, target::Thread::top_exit_frame_info_offset()), EBP);
-
-  // Mark that the thread exited generated code through a runtime call.
-  __ movl(Address(THR, target::Thread::exit_through_ffi_offset()),
-          Immediate(target::Thread::exit_through_runtime_call()));
-
-  // Mark that the thread is executing VM code.
-  __ movl(EAX,
-          Address(THR, target::Thread::interpret_call_entry_point_offset()));
-  __ movl(Assembler::VMTagAddress(), EAX);
-
-  __ call(EAX);
-
-  __ Drop(5);
-
-  // Mark that the thread is executing Dart code.
-  __ movl(Assembler::VMTagAddress(), Immediate(VMTag::kDartCompiledTagId));
-
-  // Mark that the thread has not exited generated Dart code.
-  __ movl(Address(THR, target::Thread::exit_through_ffi_offset()),
-          Immediate(0));
-
-  // Reset exit frame information in Isolate's mutator thread structure.
-  __ movl(Address(THR, target::Thread::top_exit_frame_info_offset()),
-          Immediate(0));
-
-  __ LeaveFrame();
-  __ ret();
-}
-
 // ECX: Contains an ICData.
 void StubCodeCompiler::GenerateICCallBreakpointStub(Assembler* assembler) {
 #if defined(PRODUCT)
@@ -2683,7 +2454,7 @@
   __ Bind(&exit_through_non_ffi);
 
   // Set tag.
-  __ movl(Assembler::VMTagAddress(), Immediate(VMTag::kDartCompiledTagId));
+  __ movl(Assembler::VMTagAddress(), Immediate(VMTag::kDartTagId));
   // Clear top exit frame.
   __ movl(Address(THR, target::Thread::top_exit_frame_info_offset()),
           Immediate(0));
diff --git a/runtime/vm/compiler/stub_code_compiler_x64.cc b/runtime/vm/compiler/stub_code_compiler_x64.cc
index c5eeb8a..b3c99af 100644
--- a/runtime/vm/compiler/stub_code_compiler_x64.cc
+++ b/runtime/vm/compiler/stub_code_compiler_x64.cc
@@ -96,7 +96,7 @@
   {
     Label ok;
     // Check that we are always entering from Dart code.
-    __ movq(RAX, Immediate(VMTag::kDartCompiledTagId));
+    __ movq(RAX, Immediate(VMTag::kDartTagId));
     __ cmpq(RAX, Assembler::VMTagAddress());
     __ j(EQUAL, &ok, Assembler::kNearJump);
     __ Stop("Not coming from Dart code.");
@@ -137,7 +137,7 @@
   __ CallCFunction(RBX);
 
   // Mark that the thread is executing Dart code.
-  __ movq(Assembler::VMTagAddress(), Immediate(VMTag::kDartCompiledTagId));
+  __ movq(Assembler::VMTagAddress(), Immediate(VMTag::kDartTagId));
 
   // Mark that the thread has not exited generated Dart code.
   __ movq(Address(THR, target::Thread::exit_through_ffi_offset()),
@@ -164,7 +164,7 @@
   __ ret();
 }
 
-static void GenerateSharedStubGeneric(
+void StubCodeCompiler::GenerateSharedStubGeneric(
     Assembler* assembler,
     bool save_fpu_registers,
     intptr_t self_code_stub_offset_from_thread,
@@ -202,22 +202,23 @@
   __ ret();
 }
 
-static void GenerateSharedStub(Assembler* assembler,
-                               bool save_fpu_registers,
-                               const RuntimeEntry* target,
-                               intptr_t self_code_stub_offset_from_thread,
-                               bool allow_return,
-                               bool store_runtime_result_in_rax = false) {
+void StubCodeCompiler::GenerateSharedStub(
+    Assembler* assembler,
+    bool save_fpu_registers,
+    const RuntimeEntry* target,
+    intptr_t self_code_stub_offset_from_thread,
+    bool allow_return,
+    bool store_runtime_result_in_result_register) {
   auto perform_runtime_call = [&]() {
-    if (store_runtime_result_in_rax) {
+    if (store_runtime_result_in_result_register) {
       __ PushImmediate(Immediate(0));
     }
     __ CallRuntime(*target, /*argument_count=*/0);
-    if (store_runtime_result_in_rax) {
+    if (store_runtime_result_in_result_register) {
       __ PopRegister(RAX);
-      __ movq(Address(RBP,
-                      target::kWordSize *
-                          StubCodeCompiler::WordOffsetFromFpToCpuRegister(RAX)),
+      __ movq(Address(RBP, target::kWordSize *
+                               StubCodeCompiler::WordOffsetFromFpToCpuRegister(
+                                   SharedSlowPathStubABI::kResultReg)),
               RAX);
     }
   };
@@ -281,7 +282,7 @@
                                  /*enter_safepoint=*/true);
 
   __ popq(R12);
-  __ CallCFunction(RBX);
+  __ CallCFunction(RBX, /*restore_rsp=*/true);
 
   __ TransitionNativeToGenerated(/*leave_safepoint=*/true);
 
@@ -492,55 +493,8 @@
   __ Breakpoint();
 }
 
-void StubCodeCompiler::GenerateNullErrorSharedWithoutFPURegsStub(
-    Assembler* assembler) {
-  GenerateSharedStub(
-      assembler, /*save_fpu_registers=*/false, &kNullErrorRuntimeEntry,
-      target::Thread::null_error_shared_without_fpu_regs_stub_offset(),
-      /*allow_return=*/false);
-}
-
-void StubCodeCompiler::GenerateNullErrorSharedWithFPURegsStub(
-    Assembler* assembler) {
-  GenerateSharedStub(
-      assembler, /*save_fpu_registers=*/true, &kNullErrorRuntimeEntry,
-      target::Thread::null_error_shared_with_fpu_regs_stub_offset(),
-      /*allow_return=*/false);
-}
-
-void StubCodeCompiler::GenerateNullArgErrorSharedWithoutFPURegsStub(
-    Assembler* assembler) {
-  GenerateSharedStub(
-      assembler, /*save_fpu_registers=*/false, &kArgumentNullErrorRuntimeEntry,
-      target::Thread::null_arg_error_shared_without_fpu_regs_stub_offset(),
-      /*allow_return=*/false);
-}
-
-void StubCodeCompiler::GenerateNullArgErrorSharedWithFPURegsStub(
-    Assembler* assembler) {
-  GenerateSharedStub(
-      assembler, /*save_fpu_registers=*/true, &kArgumentNullErrorRuntimeEntry,
-      target::Thread::null_arg_error_shared_with_fpu_regs_stub_offset(),
-      /*allow_return=*/false);
-}
-
-void StubCodeCompiler::GenerateNullCastErrorSharedWithoutFPURegsStub(
-    Assembler* assembler) {
-  GenerateSharedStub(
-      assembler, /*save_fpu_registers=*/false, &kNullCastErrorRuntimeEntry,
-      target::Thread::null_cast_error_shared_without_fpu_regs_stub_offset(),
-      /*allow_return=*/false);
-}
-
-void StubCodeCompiler::GenerateNullCastErrorSharedWithFPURegsStub(
-    Assembler* assembler) {
-  GenerateSharedStub(
-      assembler, /*save_fpu_registers=*/true, &kNullCastErrorRuntimeEntry,
-      target::Thread::null_cast_error_shared_with_fpu_regs_stub_offset(),
-      /*allow_return=*/false);
-}
-
-static void GenerateRangeError(Assembler* assembler, bool with_fpu_regs) {
+void StubCodeCompiler::GenerateRangeError(Assembler* assembler,
+                                          bool with_fpu_regs) {
   auto perform_runtime_call = [&]() {
     // If the generated code has unboxed index/length we need to box them before
     // calling the runtime entry.
@@ -589,32 +543,6 @@
       /*allow_return=*/false, perform_runtime_call);
 }
 
-void StubCodeCompiler::GenerateRangeErrorSharedWithoutFPURegsStub(
-    Assembler* assembler) {
-  GenerateRangeError(assembler, /*with_fpu_regs=*/false);
-}
-
-void StubCodeCompiler::GenerateRangeErrorSharedWithFPURegsStub(
-    Assembler* assembler) {
-  GenerateRangeError(assembler, /*with_fpu_regs=*/true);
-}
-
-void StubCodeCompiler::GenerateStackOverflowSharedWithoutFPURegsStub(
-    Assembler* assembler) {
-  GenerateSharedStub(
-      assembler, /*save_fpu_registers=*/false, &kStackOverflowRuntimeEntry,
-      target::Thread::stack_overflow_shared_without_fpu_regs_stub_offset(),
-      /*allow_return=*/true);
-}
-
-void StubCodeCompiler::GenerateStackOverflowSharedWithFPURegsStub(
-    Assembler* assembler) {
-  GenerateSharedStub(
-      assembler, /*save_fpu_registers=*/true, &kStackOverflowRuntimeEntry,
-      target::Thread::stack_overflow_shared_with_fpu_regs_stub_offset(),
-      /*allow_return=*/true);
-}
-
 // Input parameters:
 //   RSP : points to return address.
 //   RSP + 8 : address of return value.
@@ -647,7 +575,7 @@
   {
     Label ok;
     // Check that we are always entering from Dart code.
-    __ movq(R8, Immediate(VMTag::kDartCompiledTagId));
+    __ movq(R8, Immediate(VMTag::kDartTagId));
     __ cmpq(R8, Assembler::VMTagAddress());
     __ j(EQUAL, &ok, Assembler::kNearJump);
     __ Stop("Not coming from Dart code.");
@@ -686,7 +614,7 @@
   __ CallCFunction(RAX);
 
   // Mark that the thread is executing Dart code.
-  __ movq(Assembler::VMTagAddress(), Immediate(VMTag::kDartCompiledTagId));
+  __ movq(Assembler::VMTagAddress(), Immediate(VMTag::kDartTagId));
 
   // Mark that the thread has not exited generated Dart code.
   __ movq(Address(THR, target::Thread::exit_through_ffi_offset()),
@@ -1258,12 +1186,13 @@
 
     __ Bind(&slow_case);
   }
-  COMPILE_ASSERT(AllocateMintABI::kResultReg == RAX);
+  COMPILE_ASSERT(AllocateMintABI::kResultReg ==
+                 SharedSlowPathStubABI::kResultReg);
   GenerateSharedStub(assembler, /*save_fpu_registers=*/true,
                      &kAllocateMintRuntimeEntry,
                      target::Thread::allocate_mint_with_fpu_regs_stub_offset(),
                      /*allow_return=*/true,
-                     /*store_runtime_result_in_rax=*/true);
+                     /*store_runtime_result_in_result_register=*/true);
 }
 
 void StubCodeCompiler::GenerateAllocateMintSharedWithoutFPURegsStub(
@@ -1277,12 +1206,13 @@
 
     __ Bind(&slow_case);
   }
-  COMPILE_ASSERT(AllocateMintABI::kResultReg == RAX);
+  COMPILE_ASSERT(AllocateMintABI::kResultReg ==
+                 SharedSlowPathStubABI::kResultReg);
   GenerateSharedStub(
       assembler, /*save_fpu_registers=*/false, &kAllocateMintRuntimeEntry,
       target::Thread::allocate_mint_without_fpu_regs_stub_offset(),
       /*allow_return=*/true,
-      /*store_runtime_result_in_rax=*/true);
+      /*store_runtime_result_in_result_register=*/true);
 }
 
 // Called when invoking Dart code from C++ (VM code).
@@ -1357,7 +1287,7 @@
 
   // Mark that the thread is executing Dart code. Do this after initializing the
   // exit link for the profiler.
-  __ movq(Assembler::VMTagAddress(), Immediate(VMTag::kDartCompiledTagId));
+  __ movq(Assembler::VMTagAddress(), Immediate(VMTag::kDartTagId));
 
   // Load arguments descriptor array into R10, which is passed to Dart code.
   __ movq(R10, Address(kArgDescReg, VMHandles::kOffsetOfRawPtrInHandle));
@@ -1437,172 +1367,6 @@
   __ ret();
 }
 
-// Called when invoking compiled Dart code from interpreted Dart code.
-// Input parameters:
-//   RSP : points to return address.
-//   RDI : target raw code
-//   RSI : arguments raw descriptor array.
-//   RDX : address of first argument.
-//   RCX : current thread.
-void StubCodeCompiler::GenerateInvokeDartCodeFromBytecodeStub(
-    Assembler* assembler) {
-  if (FLAG_precompiled_mode) {
-    __ Stop("Not using interpreter");
-    return;
-  }
-
-  __ pushq(Address(RSP, 0));  // Marker for the profiler.
-  __ EnterFrame(0);
-
-  const Register kTargetCodeReg = CallingConventions::kArg1Reg;
-  const Register kArgDescReg = CallingConventions::kArg2Reg;
-  const Register kArg0Reg = CallingConventions::kArg3Reg;
-  const Register kThreadReg = CallingConventions::kArg4Reg;
-
-  // Push code object to PC marker slot.
-  __ pushq(
-      Address(kThreadReg,
-              target::Thread::invoke_dart_code_from_bytecode_stub_offset()));
-
-  // At this point, the stack looks like:
-  // | stub code object
-  // | saved RBP                                         | <-- RBP
-  // | saved PC (return to interpreter's InvokeCompiled) |
-
-  const intptr_t kInitialOffset = 2;
-  // Save arguments descriptor array, later replaced by Smi argument count.
-  const intptr_t kArgumentsDescOffset = -(kInitialOffset)*target::kWordSize;
-  __ pushq(kArgDescReg);
-
-  // Save C++ ABI callee-saved registers.
-  __ PushRegisters(CallingConventions::kCalleeSaveCpuRegisters,
-                   CallingConventions::kCalleeSaveXmmRegisters);
-
-  // If any additional (or fewer) values are pushed, the offsets in
-  // target::frame_layout.exit_link_slot_from_entry_fp will need to be changed.
-
-  // Set up THR, which caches the current thread in Dart code.
-  if (THR != kThreadReg) {
-    __ movq(THR, kThreadReg);
-  }
-
-#if defined(USING_SHADOW_CALL_STACK)
-#error Unimplemented
-#endif
-
-  // Save the current VMTag on the stack.
-  __ movq(RAX, Assembler::VMTagAddress());
-  __ pushq(RAX);
-
-  // Save top resource and top exit frame info. Use RAX as a temporary register.
-  // StackFrameIterator reads the top exit frame info saved in this frame.
-  __ movq(RAX, Address(THR, target::Thread::top_resource_offset()));
-  __ pushq(RAX);
-  __ movq(Address(THR, target::Thread::top_resource_offset()), Immediate(0));
-
-  __ movq(RAX, Address(THR, target::Thread::exit_through_ffi_offset()));
-  __ pushq(RAX);
-  __ movq(Address(THR, target::Thread::exit_through_ffi_offset()),
-          Immediate(0));
-
-  __ movq(RAX, Address(THR, target::Thread::top_exit_frame_info_offset()));
-  __ pushq(RAX);
-  __ movq(Address(THR, target::Thread::top_exit_frame_info_offset()),
-          Immediate(0));
-
-// The constant target::frame_layout.exit_link_slot_from_entry_fp must be kept
-// in sync with the code below.
-#if defined(DEBUG)
-  {
-    Label ok;
-    __ leaq(RAX,
-            Address(RBP, target::frame_layout.exit_link_slot_from_entry_fp *
-                             target::kWordSize));
-    __ cmpq(RAX, RSP);
-    __ j(EQUAL, &ok);
-    __ Stop("target::frame_layout.exit_link_slot_from_entry_fp mismatch");
-    __ Bind(&ok);
-  }
-#endif
-
-  // Mark that the thread is executing Dart code. Do this after initializing the
-  // exit link for the profiler.
-  __ movq(Assembler::VMTagAddress(), Immediate(VMTag::kDartCompiledTagId));
-
-  // Load arguments descriptor array into R10, which is passed to Dart code.
-  __ movq(R10, kArgDescReg);
-
-  // Push arguments. At this point we only need to preserve kTargetCodeReg.
-  ASSERT(kTargetCodeReg != RDX);
-
-  // Load number of arguments into RBX and adjust count for type arguments.
-  __ movq(RBX, FieldAddress(R10, target::ArgumentsDescriptor::count_offset()));
-  __ cmpq(
-      FieldAddress(R10, target::ArgumentsDescriptor::type_args_len_offset()),
-      Immediate(0));
-  Label args_count_ok;
-  __ j(EQUAL, &args_count_ok, Assembler::kNearJump);
-  __ addq(RBX, Immediate(target::ToRawSmi(1)));  // Include the type arguments.
-  __ Bind(&args_count_ok);
-  // Save number of arguments as Smi on stack, replacing saved ArgumentsDesc.
-  __ movq(Address(RBP, kArgumentsDescOffset), RBX);
-  __ SmiUntag(RBX);
-
-  // Compute address of first argument into RDX.
-  if (kArg0Reg != RDX) {  // Different registers on WIN64.
-    __ movq(RDX, kArg0Reg);
-  }
-
-  // Set up arguments for the Dart call.
-  Label push_arguments;
-  Label done_push_arguments;
-  __ j(ZERO, &done_push_arguments, Assembler::kNearJump);
-  __ LoadImmediate(RAX, Immediate(0));
-  __ Bind(&push_arguments);
-  __ pushq(Address(RDX, RAX, TIMES_8, 0));
-  __ incq(RAX);
-  __ cmpq(RAX, RBX);
-  __ j(LESS, &push_arguments, Assembler::kNearJump);
-  __ Bind(&done_push_arguments);
-
-  // Call the Dart code entrypoint.
-  __ xorq(PP, PP);  // GC-safe value into PP.
-  __ movq(CODE_REG, kTargetCodeReg);
-  __ movq(kTargetCodeReg,
-          FieldAddress(CODE_REG, target::Code::entry_point_offset()));
-  __ call(kTargetCodeReg);  // R10 is the arguments descriptor array.
-
-  // Read the saved number of passed arguments as Smi.
-  __ movq(RDX, Address(RBP, kArgumentsDescOffset));
-
-  // Get rid of arguments pushed on the stack.
-  __ leaq(RSP, Address(RSP, RDX, TIMES_4, 0));  // RDX is a Smi.
-
-  // Restore the saved top exit frame info and top resource back into the
-  // Isolate structure.
-  __ popq(Address(THR, target::Thread::top_exit_frame_info_offset()));
-  __ popq(Address(THR, target::Thread::exit_through_ffi_offset()));
-  __ popq(Address(THR, target::Thread::top_resource_offset()));
-
-  // Restore the current VMTag from the stack.
-  __ popq(Assembler::VMTagAddress());
-
-#if defined(USING_SHADOW_CALL_STACK)
-#error Unimplemented
-#endif
-
-  // Restore C++ ABI callee-saved registers.
-  __ PopRegisters(CallingConventions::kCalleeSaveCpuRegisters,
-                  CallingConventions::kCalleeSaveXmmRegisters);
-  __ set_constant_pool_allowed(false);
-
-  // Restore the frame pointer.
-  __ LeaveFrame();
-  __ popq(RCX);
-
-  __ ret();
-}
-
 // Helper to generate space allocation of context stub.
 // This does not initialise the fields of the context.
 // Input:
@@ -2882,101 +2646,11 @@
   __ popq(R10);  // Restore arguments descriptor array.
   __ LeaveStubFrame();
 
-  // When using the interpreter, the function's code may now point to the
-  // InterpretCall stub. Make sure RAX, R10, and RBX are preserved.
   __ movq(CODE_REG, FieldAddress(RAX, target::Function::code_offset()));
   __ movq(RCX, FieldAddress(RAX, target::Function::entry_point_offset()));
   __ jmp(RCX);
 }
 
-// Stub for interpreting a function call.
-// R10: Arguments descriptor.
-// RAX: Function.
-void StubCodeCompiler::GenerateInterpretCallStub(Assembler* assembler) {
-  if (FLAG_precompiled_mode) {
-    __ Stop("Not using interpreter");
-    return;
-  }
-
-  __ EnterStubFrame();
-
-#if defined(DEBUG)
-  {
-    Label ok;
-    // Check that we are always entering from Dart code.
-    __ movq(R8, Immediate(VMTag::kDartCompiledTagId));
-    __ cmpq(R8, Assembler::VMTagAddress());
-    __ j(EQUAL, &ok, Assembler::kNearJump);
-    __ Stop("Not coming from Dart code.");
-    __ Bind(&ok);
-  }
-#endif
-
-  // Adjust arguments count for type arguments vector.
-  __ movq(R11, FieldAddress(R10, target::ArgumentsDescriptor::count_offset()));
-  __ SmiUntag(R11);
-  __ cmpq(
-      FieldAddress(R10, target::ArgumentsDescriptor::type_args_len_offset()),
-      Immediate(0));
-  Label args_count_ok;
-  __ j(EQUAL, &args_count_ok, Assembler::kNearJump);
-  __ incq(R11);
-  __ Bind(&args_count_ok);
-
-  // Compute argv.
-  __ leaq(R12,
-          Address(RBP, R11, TIMES_8,
-                  target::frame_layout.param_end_from_fp * target::kWordSize));
-
-  // Indicate decreasing memory addresses of arguments with negative argc.
-  __ negq(R11);
-
-  // Reserve shadow space for args and align frame before entering C++ world.
-  __ subq(RSP, Immediate(5 * target::kWordSize));
-  if (OS::ActivationFrameAlignment() > 1) {
-    __ andq(RSP, Immediate(~(OS::ActivationFrameAlignment() - 1)));
-  }
-
-  __ movq(CallingConventions::kArg1Reg, RAX);  // Function.
-  __ movq(CallingConventions::kArg2Reg, R10);  // Arguments descriptor.
-  __ movq(CallingConventions::kArg3Reg, R11);  // Negative argc.
-  __ movq(CallingConventions::kArg4Reg, R12);  // Argv.
-
-#if defined(TARGET_OS_WINDOWS)
-  __ movq(Address(RSP, 0 * target::kWordSize), THR);  // Thread.
-#else
-  __ movq(CallingConventions::kArg5Reg, THR);  // Thread.
-#endif
-  // Save exit frame information to enable stack walking as we are about
-  // to transition to Dart VM C++ code.
-  __ movq(Address(THR, target::Thread::top_exit_frame_info_offset()), RBP);
-
-  // Mark that the thread exited generated code through a runtime call.
-  __ movq(Address(THR, target::Thread::exit_through_ffi_offset()),
-          Immediate(target::Thread::exit_through_runtime_call()));
-
-  // Mark that the thread is executing VM code.
-  __ movq(RAX,
-          Address(THR, target::Thread::interpret_call_entry_point_offset()));
-  __ movq(Assembler::VMTagAddress(), RAX);
-
-  __ call(RAX);
-
-  // Mark that the thread is executing Dart code.
-  __ movq(Assembler::VMTagAddress(), Immediate(VMTag::kDartCompiledTagId));
-
-  // Mark that the thread has not exited generated Dart code.
-  __ movq(Address(THR, target::Thread::exit_through_ffi_offset()),
-          Immediate(0));
-
-  // Reset exit frame information in Isolate's mutator thread structure.
-  __ movq(Address(THR, target::Thread::top_exit_frame_info_offset()),
-          Immediate(0));
-
-  __ LeaveStubFrame();
-  __ ret();
-}
-
 // RBX: Contains an ICData.
 // TOS(0): return address (Dart code).
 void StubCodeCompiler::GenerateICCallBreakpointStub(Assembler* assembler) {
@@ -3492,7 +3166,7 @@
   __ Bind(&exit_through_non_ffi);
 
   // Set the tag.
-  __ movq(Assembler::VMTagAddress(), Immediate(VMTag::kDartCompiledTagId));
+  __ movq(Assembler::VMTagAddress(), Immediate(VMTag::kDartTagId));
   // Clear top exit frame.
   __ movq(Address(THR, target::Thread::top_exit_frame_info_offset()),
           Immediate(0));
diff --git a/runtime/vm/compiler/write_barrier_elimination_test.cc b/runtime/vm/compiler/write_barrier_elimination_test.cc
index b86e827..f483b05 100644
--- a/runtime/vm/compiler/write_barrier_elimination_test.cc
+++ b/runtime/vm/compiler/write_barrier_elimination_test.cc
@@ -166,7 +166,7 @@
           c = C();
         }
         array[0] = c;
-        return c;
+        return array;
       }
 
       main() { foo(10); }
@@ -215,7 +215,7 @@
         final root = List<dynamic>.filled(128, null);
         List<dynamic> last = root;
         for (int i = 0; i < 10 * 1024; ++i) {
-          final nc = List(128);
+          final nc = List<dynamic>.filled(128, null);
           last[0] = nc;
           last = nc;
         }
diff --git a/runtime/vm/compiler_test.cc b/runtime/vm/compiler_test.cc
index 219dc7c..1a5afc1 100644
--- a/runtime/vm/compiler_test.cc
+++ b/runtime/vm/compiler_test.cc
@@ -6,7 +6,6 @@
 #include "platform/assert.h"
 #include "vm/class_finalizer.h"
 #include "vm/code_patcher.h"
-#include "vm/compiler/frontend/bytecode_reader.h"
 #include "vm/dart_api_impl.h"
 #include "vm/heap/safepoint.h"
 #include "vm/kernel_isolate.h"
@@ -126,30 +125,8 @@
   Function& func =
       Function::Handle(cls.LookupStaticFunction(function_foo_name));
   EXPECT(!func.HasCode());
-  if (!FLAG_enable_interpreter) {
-    CompilerTest::TestCompileFunction(func);
-    EXPECT(func.HasCode());
-    return;
-  }
-  // Bytecode loading must happen on the main thread. Ensure the bytecode is
-  // loaded before asking for an unoptimized compile on a background thread.
-  kernel::BytecodeReader::ReadFunctionBytecode(thread, func);
-#if !defined(PRODUCT)
-  // Constant in product mode.
-  FLAG_background_compilation = true;
-#endif
-  Isolate* isolate = thread->isolate();
-  BackgroundCompiler::Start(isolate);
-  isolate->background_compiler()->Compile(func);
-  Monitor* m = new Monitor();
-  {
-    MonitorLocker ml(m);
-    while (!func.HasCode()) {
-      ml.WaitWithSafepointCheck(thread, 1);
-    }
-  }
-  delete m;
-  BackgroundCompiler::Stop(isolate);
+  CompilerTest::TestCompileFunction(func);
+  EXPECT(func.HasCode());
 }
 
 ISOLATE_UNIT_TEST_CASE(RegenerateAllocStubs) {
diff --git a/runtime/vm/constants_arm.h b/runtime/vm/constants_arm.h
index d7f79a7..016d438 100644
--- a/runtime/vm/constants_arm.h
+++ b/runtime/vm/constants_arm.h
@@ -310,6 +310,11 @@
 // ABI for allocation stubs.
 const Register kAllocationStubTypeArgumentsReg = R3;
 
+// Common ABI for shared slow path stubs.
+struct SharedSlowPathStubABI {
+  static const Register kResultReg = R0;
+};
+
 // ABI for instantiation stubs.
 struct InstantiationABI {
   static const Register kUninstantiatedTypeArgumentsReg = R3;
@@ -337,6 +342,23 @@
   static const Register kResultReg = R0;
 };
 
+// Calling convention when calling AssertSubtypeStub.
+struct AssertSubtypeABI {
+  static const Register kSubTypeReg = R0;
+  static const Register kSuperTypeReg = R8;
+  static const Register kInstantiatorTypeArgumentsReg = R2;
+  static const Register kFunctionTypeArgumentsReg = R1;
+  static const Register kDstNameReg = R3;
+
+  static const intptr_t kAbiRegisters =
+      (1 << kSubTypeReg) | (1 << kSuperTypeReg) |
+      (1 << kInstantiatorTypeArgumentsReg) | (1 << kFunctionTypeArgumentsReg) |
+      (1 << kDstNameReg);
+
+  // No result register, as AssertSubtype is only run for side effect
+  // (throws if the subtype check fails).
+};
+
 // Registers used inside the implementation of type testing stubs.
 struct TTSInternalRegs {
   static const Register kInstanceTypeArgumentsReg = R4;
@@ -366,6 +388,11 @@
   static const Register kScratchReg = R4;
 };
 
+// ABI for LateInitializationError stubs.
+struct LateInitializationErrorABI {
+  static const Register kFieldReg = R9;
+};
+
 // ABI for ThrowStub.
 struct ThrowABI {
   static const Register kExceptionReg = R0;
diff --git a/runtime/vm/constants_arm64.h b/runtime/vm/constants_arm64.h
index 87dbb7f..39225df 100644
--- a/runtime/vm/constants_arm64.h
+++ b/runtime/vm/constants_arm64.h
@@ -142,6 +142,11 @@
 // ABI for allocation stubs.
 const Register kAllocationStubTypeArgumentsReg = R1;
 
+// Common ABI for shared slow path stubs.
+struct SharedSlowPathStubABI {
+  static const Register kResultReg = R0;
+};
+
 // ABI for instantiation stubs.
 struct InstantiationABI {
   static const Register kUninstantiatedTypeArgumentsReg = R3;
@@ -169,6 +174,23 @@
   static const Register kResultReg = R0;
 };
 
+// Calling convention when calling AssertSubtypeStub.
+struct AssertSubtypeABI {
+  static const Register kSubTypeReg = R0;
+  static const Register kSuperTypeReg = R8;
+  static const Register kInstantiatorTypeArgumentsReg = R2;
+  static const Register kFunctionTypeArgumentsReg = R1;
+  static const Register kDstNameReg = R3;
+
+  static const intptr_t kAbiRegisters =
+      (1 << kSubTypeReg) | (1 << kSuperTypeReg) |
+      (1 << kInstantiatorTypeArgumentsReg) | (1 << kFunctionTypeArgumentsReg) |
+      (1 << kDstNameReg);
+
+  // No result register, as AssertSubtype is only run for side effect
+  // (throws if the subtype check fails).
+};
+
 // Registers used inside the implementation of type testing stubs.
 struct TTSInternalRegs {
   static const Register kInstanceTypeArgumentsReg = R7;
@@ -198,6 +220,11 @@
   static const Register kScratchReg = R4;
 };
 
+// ABI for LateInitializationError stubs.
+struct LateInitializationErrorABI {
+  static const Register kFieldReg = R9;
+};
+
 // ABI for ThrowStub.
 struct ThrowABI {
   static const Register kExceptionReg = R0;
diff --git a/runtime/vm/constants_ia32.h b/runtime/vm/constants_ia32.h
index 02ac81d..a8d5b46 100644
--- a/runtime/vm/constants_ia32.h
+++ b/runtime/vm/constants_ia32.h
@@ -91,6 +91,11 @@
 // ABI for allocation stubs.
 const Register kAllocationStubTypeArgumentsReg = EDX;
 
+// Common ABI for shared slow path stubs.
+struct SharedSlowPathStubABI {
+  static const Register kResultReg = EAX;
+};
+
 // ABI for instantiation stubs.
 struct InstantiationABI {
   static const Register kUninstantiatedTypeArgumentsReg = EBX;
@@ -116,6 +121,20 @@
   static const Register kResultReg = kNoRegister;
 };
 
+// Calling convention when calling kSubtypeCheckRuntimeEntry, to match other
+// architectures. We don't generate a call to the AssertSubtypeStub because we
+// need CODE_REG to store a fifth argument.
+struct AssertSubtypeABI {
+  static const Register kSubTypeReg = EAX;
+  static const Register kSuperTypeReg = EBX;
+  static const Register kInstantiatorTypeArgumentsReg = EDX;
+  static const Register kFunctionTypeArgumentsReg = ECX;
+  static const Register kDstNameReg = EDI;  /// On ia32 we don't use CODE_REG.
+
+  // No result register, as AssertSubtype is only run for side effect
+  // (throws if the subtype check fails).
+};
+
 // ABI for InitStaticFieldStub.
 struct InitStaticFieldABI {
   static const Register kFieldReg = EAX;
@@ -136,6 +155,11 @@
   static const Register kScratchReg = EDI;
 };
 
+// ABI for LateInitializationError stubs.
+struct LateInitializationErrorABI {
+  static const Register kFieldReg = EDI;
+};
+
 // ABI for ThrowStub.
 struct ThrowABI {
   static const Register kExceptionReg = EAX;
diff --git a/runtime/vm/constants_kbc.cc b/runtime/vm/constants_kbc.cc
deleted file mode 100644
index adbe0421..0000000
--- a/runtime/vm/constants_kbc.cc
+++ /dev/null
@@ -1,76 +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.
-
-#define RUNTIME_VM_CONSTANTS_H_  // To work around include guard.
-#include "vm/constants_kbc.h"
-
-namespace dart {
-
-static const intptr_t kInstructionSize0 = 1;
-static const intptr_t kInstructionSizeA = 2;
-static const intptr_t kInstructionSizeD = 2;
-static const intptr_t kInstructionSizeWideD = 5;
-static const intptr_t kInstructionSizeX = 2;
-static const intptr_t kInstructionSizeWideX = 5;
-static const intptr_t kInstructionSizeT = 2;
-static const intptr_t kInstructionSizeWideT = 4;
-static const intptr_t kInstructionSizeA_E = 3;
-static const intptr_t kInstructionSizeWideA_E = 6;
-static const intptr_t kInstructionSizeA_Y = 3;
-static const intptr_t kInstructionSizeWideA_Y = 6;
-static const intptr_t kInstructionSizeD_F = 3;
-static const intptr_t kInstructionSizeWideD_F = 6;
-static const intptr_t kInstructionSizeA_B_C = 4;
-
-const intptr_t KernelBytecode::kInstructionSize[] = {
-#define SIZE_ORDN(encoding) kInstructionSize##encoding
-#define SIZE_WIDE(encoding) kInstructionSizeWide##encoding
-#define SIZE_RESV(encoding) SIZE_ORDN(encoding)
-#define SIZE(name, encoding, kind, op1, op2, op3) SIZE_##kind(encoding),
-    KERNEL_BYTECODES_LIST(SIZE)
-#undef SIZE_ORDN
-#undef SIZE_WIDE
-#undef SIZE_RESV
-#undef SIZE
-};
-
-#define DECLARE_INSTRUCTIONS(name, fmt, kind, fmta, fmtb, fmtc)                \
-  static const KBCInstr k##name##Instructions[] = {                            \
-      KernelBytecode::k##name,                                                 \
-      KernelBytecode::kReturnTOS,                                              \
-  };
-INTERNAL_KERNEL_BYTECODES_LIST(DECLARE_INSTRUCTIONS)
-#undef DECLARE_INSTRUCTIONS
-
-void KernelBytecode::GetVMInternalBytecodeInstructions(
-    Opcode opcode,
-    const KBCInstr** instructions,
-    intptr_t* instructions_size) {
-  switch (opcode) {
-#define CASE(name, fmt, kind, fmta, fmtb, fmtc)                                \
-  case k##name:                                                                \
-    *instructions = k##name##Instructions;                                     \
-    *instructions_size = sizeof(k##name##Instructions);                        \
-    return;
-
-    INTERNAL_KERNEL_BYTECODES_LIST(CASE)
-#undef CASE
-
-    default:
-      UNREACHABLE();
-  }
-}
-
-static const KBCInstr kNativeCallToGrowableListReturnTrampoline[] = {
-    KernelBytecode::kDirectCall,
-    0,                                              // target (doesn't matter)
-    KernelBytecode::kNativeCallToGrowableListArgc,  // number of arguments
-    KernelBytecode::kReturnTOS,
-};
-
-const KBCInstr* KernelBytecode::GetNativeCallToGrowableListReturnTrampoline() {
-  return KernelBytecode::Next(&kNativeCallToGrowableListReturnTrampoline[0]);
-}
-
-}  // namespace dart
diff --git a/runtime/vm/constants_kbc.h b/runtime/vm/constants_kbc.h
deleted file mode 100644
index cae8a97..0000000
--- a/runtime/vm/constants_kbc.h
+++ /dev/null
@@ -1,1076 +0,0 @@
-// Copyright (c) 2018, 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.
-
-#ifndef RUNTIME_VM_CONSTANTS_KBC_H_
-#define RUNTIME_VM_CONSTANTS_KBC_H_
-
-#include "platform/assert.h"
-#include "platform/globals.h"
-#include "platform/utils.h"
-
-namespace dart {
-
-// clang-format off
-// List of KernelBytecode instructions.
-//
-// INTERPRETER STATE
-//
-//      current frame info (see stack_frame_kbc.h for layout)
-//        v-----^-----v
-//   ~----+----~ ~----+-------+-------+-~ ~-+-------+-------+-~
-//   ~    |    ~ ~    | FP[0] | FP[1] | ~ ~ | SP[-1]| SP[0] |
-//   ~----+----~ ~----+-------+-------+-~ ~-+-------+-------+-~
-//                    ^                             ^
-//                    FP                            SP
-//
-//
-// The state of execution is captured in few interpreter registers:
-//
-//   FP - base of the current frame
-//   SP - top of the stack (TOS) for the current frame
-//   PP - object pool for the currently execution function
-//
-// Frame info stored below FP additionally contains pointers to the currently
-// executing function and code.
-//
-// In the unoptimized code most of bytecodes take operands implicitly from
-// stack and store results again on the stack. Constant operands are usually
-// taken from the object pool by index.
-//
-// ENCODING
-//
-// Each instruction starts with opcode byte. Certain instructions have
-// wide encoding variant. In such case, the least significant bit of opcode is
-// not set for compact variant and set for wide variant.
-//
-// The following operand encodings are used:
-//
-//   0........8.......16.......24.......32.......40.......48
-//   +--------+
-//   | opcode |                              0: no operands
-//   +--------+
-//
-//   +--------+--------+
-//   | opcode |    A   |                     A: unsigned 8-bit operand
-//   +--------+--------+
-//
-//   +--------+--------+
-//   | opcode |   D    |                     D: unsigned 8/32-bit operand
-//   +--------+--------+
-//
-//   +--------+----------------------------------+
-//   | opcode |                D                 |            D (wide)
-//   +--------+----------------------------------+
-//
-//   +--------+--------+
-//   | opcode |   X    |                     X: signed 8/32-bit operand
-//   +--------+--------+
-//
-//   +--------+----------------------------------+
-//   | opcode |                X                 |            X (wide)
-//   +--------+----------------------------------+
-//
-//   +--------+--------+
-//   | opcode |    T   |                     T: signed 8/24-bit operand
-//   +--------+--------+
-//
-//   +--------+--------------------------+
-//   | opcode |            T             |   T (wide)
-//   +--------+--------------------------+
-//
-//   +--------+--------+--------+
-//   | opcode |    A   |   E    |            A_E: unsigned 8-bit operand and
-//   +--------+--------+--------+                 unsigned 8/32-bit operand
-//
-//   +--------+--------+----------------------------------+
-//   | opcode |    A   |                 E                |   A_E (wide)
-//   +--------+--------+----------------------------------+
-//
-//   +--------+--------+--------+
-//   | opcode |    A   |   Y    |            A_Y: unsigned 8-bit operand and
-//   +--------+--------+--------+                 signed 8/32-bit operand
-//
-//   +--------+--------+----------------------------------+
-//   | opcode |    A   |                 Y                |   A_Y (wide)
-//   +--------+--------+----------------------------------+
-//
-//   +--------+--------+--------+
-//   | opcode |    D   |   F    |            D_F: unsigned 8/32-bit operand and
-//   +--------+--------+--------+                 unsigned 8-bit operand
-//
-//   +--------+----------------------------------+--------+
-//   | opcode |                 D                |    F   |   D_F (wide)
-//   +--------+----------------------------------+--------+
-//
-//   +--------+--------+--------+--------+
-//   | opcode |    A   |    B   |    C   |   A_B_C: 3 unsigned 8-bit operands
-//   +--------+--------+--------+--------+
-//
-//
-// INSTRUCTIONS
-//
-//  - Trap
-//
-//    Unreachable instruction.
-//
-//  - Entry rD
-//
-//    Function prologue for the function
-//        rD - number of local slots to reserve;
-//
-//  - EntryFixed A, D
-//
-//    Function prologue for functions without optional arguments.
-//    Checks number of arguments.
-//        A - expected number of positional arguments;
-//        D - number of local slots to reserve;
-//
-//  - EntryOptional A, B, C
-//
-//    Function prologue for the function with optional or named arguments:
-//        A - expected number of positional arguments;
-//        B - number of optional arguments;
-//        C - number of named arguments;
-//
-//    Only one of B and C can be not 0.
-//
-//    If B is not 0 then EntryOptional bytecode is followed by B LoadConstant
-//    bytecodes specifying default values for optional arguments.
-//
-//    If C is not 0 then EntryOptional is followed by 2 * C LoadConstant
-//    bytecodes.
-//    Bytecode at 2 * i specifies name of the i-th named argument and at
-//    2 * i + 1 default value. rA part of the LoadConstant bytecode specifies
-//    the location of the parameter on the stack. Here named arguments are
-//    sorted alphabetically to enable linear matching similar to how function
-//    prologues are implemented on other architectures.
-//
-//    Note: Unlike Entry bytecode EntryOptional does not setup the frame for
-//    local variables this is done by a separate bytecode Frame, which should
-//    follow EntryOptional and its LoadConstant instructions.
-//
-//  - LoadConstant rA, D
-//
-//    Used in conjunction with EntryOptional instruction to describe names and
-//    default values of optional parameters.
-//
-//  - Frame D
-//
-//    Reserve and initialize with null space for D local variables.
-//
-//  - CheckFunctionTypeArgs A, D
-//
-//    Check for a passed-in type argument vector of length A and
-//    store it at FP[D].
-//
-//  - CheckStack A
-//
-//    Compare SP against isolate stack limit and call StackOverflow handler if
-//    necessary. Should be used in prologue (A = 0), or at the beginning of
-//    a loop with depth A.
-//
-//  - Allocate D
-//
-//    Allocate object of class PP[D] with no type arguments.
-//
-//  - AllocateT
-//
-//    Allocate object of class SP[0] with type arguments SP[-1].
-//
-//  - CreateArrayTOS
-//
-//    Allocate array of length SP[0] with type arguments SP[-1].
-//
-//  - AllocateContext A, D
-//
-//    Allocate Context object holding D context variables.
-//    A is a static ID of the context. Static ID of a context may be used to
-//    disambiguate accesses to different context objects.
-//    Context objects with the same ID should have the same number of
-//    context variables.
-//
-//  - CloneContext A, D
-//
-//    Clone Context object SP[0] holding D context variables.
-//    A is a static ID of the context. Cloned context has the same ID.
-//
-//  - LoadContextParent
-//
-//    Load parent from context SP[0].
-//
-//  - StoreContextParent
-//
-//    Store context SP[0] into `parent` field of context SP[-1].
-//
-//  - LoadContextVar A, D
-//
-//    Load value from context SP[0] at index D.
-//    A is a static ID of the context.
-//
-//  - StoreContextVar A, D
-//
-//    Store value SP[0] into context SP[-1] at index D.
-//    A is a static ID of the context.
-//
-//  - PushConstant D
-//
-//    Push value at index D from constant pool onto the stack.
-//
-//  - PushNull
-//
-//    Push `null` onto the stack.
-//
-//  - PushTrue
-//
-//    Push `true` onto the stack.
-//
-//  - PushFalse
-//
-//    Push `false` onto the stack.
-//
-//  - PushInt rX
-//
-//    Push int rX onto the stack.
-//
-//  - Drop1
-//
-//    Drop 1 value from the stack
-//
-//  - Push rX
-//
-//    Push FP[rX] to the stack.
-//
-//  - StoreLocal rX; PopLocal rX
-//
-//    Store top of the stack into FP[rX] and pop it if needed.
-//
-//  - LoadFieldTOS D
-//
-//    Push value at offset (in words) PP[D] from object SP[0].
-//
-//  - StoreFieldTOS D
-//
-//    Store value SP[0] into object SP[-1] at offset (in words) PP[D].
-//
-//  - StoreIndexedTOS
-//
-//    Store SP[0] into array SP[-2] at index SP[-1]. No typechecking is done.
-//    SP[-2] is assumed to be a RawArray, SP[-1] to be a smi.
-//
-//  - PushStatic D
-//
-//    Pushes value of the static field PP[D] on to the stack.
-//
-//  - StoreStaticTOS D
-//
-//    Stores TOS into the static field PP[D].
-//
-//  - Jump target
-//
-//    Jump to the given target. Target is specified as offset from the PC of the
-//    jump instruction.
-//
-//  - JumpIfNoAsserts target
-//
-//    Jump to the given target if assertions are not enabled.
-//    Target is specified as offset from the PC of the jump instruction.
-//
-//  - JumpIfNotZeroTypeArgs target
-//
-//    Jump to the given target if number of passed function type
-//    arguments is not zero.
-//    Target is specified as offset from the PC of the jump instruction.
-//
-//  - JumpIfEqStrict target; JumpIfNeStrict target
-//
-//    Jump to the given target if SP[-1] is the same (JumpIfEqStrict) /
-//    not the same (JumpIfNeStrict) object as SP[0].
-//
-//  - JumpIfTrue target; JumpIfFalse target
-//  - JumpIfNull target; JumpIfNotNull target
-//
-//    Jump to the given target if SP[0] is true/false/null/not null.
-//
-//  - IndirectStaticCall ArgC, D
-//
-//    Invoke the function given by the ICData in SP[0] with arguments
-//    SP[-(1+ArgC)], ..., SP[-1] and argument descriptor PP[D], which
-//    indicates whether the first argument is a type argument vector.
-//
-//  - DirectCall ArgC, D
-//
-//    Invoke the function PP[D] with arguments
-//    SP[-(ArgC-1)], ..., SP[0] and argument descriptor PP[D+1].
-//
-//  - InterfaceCall ArgC, D
-//
-//    Lookup and invoke method using ICData in PP[D]
-//    with arguments SP[-(1+ArgC)], ..., SP[-1].
-//    Method has to be declared (explicitly or implicitly) in an interface
-//    implemented by a receiver, and passed arguments are valid for the
-//    interface method declaration.
-//    The ICData indicates whether the first argument is a type argument vector.
-//
-//  - UncheckedInterfaceCall ArgC, D
-//
-//    Same as InterfaceCall, but can omit type checks of generic-covariant
-//    parameters.
-//
-//  - DynamicCall ArgC, D
-//
-//    Lookup and invoke method using ICData in PP[D]
-//    with arguments SP[-(1+ArgC)], ..., SP[-1].
-//    The ICData indicates whether the first argument is a type argument vector.
-//
-//  - NativeCall D
-//
-//    Invoke native function described by array at pool[D].
-//    array[0] is wrapper, array[1] is function, array[2] is argc_tag.
-//
-//  - ReturnTOS
-//
-//    Return to the caller using a value from the top-of-stack as a result.
-//
-//    Note: return instruction knows how many arguments to remove from the
-//    stack because it can look at the call instruction at caller's PC and
-//    take argument count from it.
-//
-//  - AssertAssignable A, D
-//
-//    Assert that instance SP[-4] is assignable to variable named SP[0] of
-//    type SP[-1] with instantiator type arguments SP[-3] and function type
-//    arguments SP[-2] using SubtypeTestCache PP[D].
-//    If A is 1, then the instance may be a Smi.
-//
-//    Instance remains on stack. Other arguments are consumed.
-//
-//  - AssertBoolean A
-//
-//    Assert that TOS is a boolean (A = 1) or that TOS is not null (A = 0).
-//
-//  - AssertSubtype
-//
-//    Assert that one type is a subtype of another.  Throws a TypeError
-//    otherwise.  The stack has the following arguments on it:
-//
-//        SP[-4]  instantiator type args
-//        SP[-3]  function type args
-//        SP[-2]  sub_type
-//        SP[-1]  super_type
-//        SP[-0]  dst_name
-//
-//    All 5 arguments are consumed from the stack and no results is pushed.
-//
-//  - LoadTypeArgumentsField D
-//
-//    Load instantiator type arguments from an instance SP[0].
-//    PP[D] = offset (in words) of type arguments field corresponding
-//    to an instance's class.
-//
-//  - InstantiateType D
-//
-//    Instantiate type PP[D] with instantiator type arguments SP[-1] and
-//    function type arguments SP[0].
-//
-//  - InstantiateTypeArgumentsTOS A, D
-//
-//    Instantiate type arguments PP[D] with instantiator type arguments SP[-1]
-//    and function type arguments SP[0]. A != 0 indicates that resulting type
-//    arguments are all dynamic if both instantiator and function type
-//    arguments are all dynamic.
-//
-//  - Throw A
-//
-//    Throw (Rethrow if A != 0) exception. Exception object and stack object
-//    are taken from TOS.
-//
-//  - MoveSpecial A, rX
-//
-//    Copy value from special variable to FP[rX]. Currently only
-//    used to pass exception object (A = 0) and stack trace object (A = 1) to
-//    catch handler.
-//
-//  - SetFrame A
-//
-//    Reinitialize SP assuming that current frame has size A.
-//    Used to drop temporaries from the stack in the exception handler.
-//
-//  - BooleanNegateTOS
-//
-//    SP[0] = !SP[0]
-//
-//  - EqualsNull
-//
-//    SP[0] = (SP[0] == null) ? true : false
-//
-//  - NegateInt
-//
-//    Equivalent to invocation of unary int operator-.
-//    Receiver should have static type int.
-//    Check SP[0] for null; SP[0] = -SP[0].
-//
-//  - AddInt; SubInt; MulInt; TruncDivInt; ModInt; BitAndInt; BitOrInt;
-//    BitXorInt; ShlInt; ShrInt
-//
-//    Equivalent to invocation of binary int operator +, -, *, ~/, %, &, |,
-//    ^, << or >>. Receiver and argument should have static type int.
-//    Check SP[-1] and SP[0] for null; push SP[-1] <op> SP[0].
-//
-//  - CompareIntEq; CompareIntGt; CompareIntLt; CompareIntGe; CompareIntLe
-//
-//    Equivalent to invocation of binary int operator ==, >, <, >= or <=.
-//    Receiver and argument should have static type int.
-//    Check SP[-1] and SP[0] for null; push SP[-1] <op> SP[0] ? true : false.
-//
-//  - NegateDouble
-//
-//    Equivalent to invocation of unary double operator-.
-//    Receiver should have static type double.
-//    Check SP[0] for null; SP[0] = -SP[0].
-//
-//  - AddDouble; SubDouble; MulDouble; DivDouble
-//
-//    Equivalent to invocation of binary int operator +, -, *, /.
-//    Receiver and argument should have static type double.
-//    Check SP[-1] and SP[0] for null; push SP[-1] <op> SP[0].
-//
-//  - CompareDoubleEq; CompareDoubleGt; CompareDoubleLt; CompareDoubleGe;
-//    CompareDoubleLe
-//
-//    Equivalent to invocation of binary double operator ==, >, <, >= or <=.
-//    Receiver and argument should have static type double.
-//    Check SP[-1] and SP[0] for null; push SP[-1] <op> SP[0] ? true : false.
-//
-//  - AllocateClosure D
-//
-//    Allocate closure object for closure function ConstantPool[D].
-//
-// BYTECODE LIST FORMAT
-//
-// KernelBytecode list below is specified using the following format:
-//
-//     V(BytecodeName, OperandForm, BytecodeKind, Op1, Op2, Op3)
-//
-// - OperandForm specifies operand encoding and should be one of 0, A, D, X, T,
-//   A_E, A_Y, D_F or A_B_C (see ENCODING section above).
-//
-// - BytecodeKind is one of WIDE, RESV (reserved), ORDN (ordinary)
-//
-// - Op1, Op2, Op3 specify operand meaning. Possible values:
-//
-//     ___ ignored / non-existent operand
-//     num immediate operand
-//     lit constant literal from object pool
-//     reg register (unsigned FP relative local)
-//     xeg x-register (signed FP relative local)
-//     tgt jump target relative to the PC of the current instruction
-//
-// TODO(vegorov) jump targets should be encoded relative to PC of the next
-//               instruction because PC is incremented immediately after fetch
-//               and before decoding.
-//
-#define PUBLIC_KERNEL_BYTECODES_LIST(V)                                        \
-  V(UnusedOpcode000,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode001,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode002,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode003,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode004,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode005,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode006,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode007,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode008,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode009,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode010,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode011,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode012,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode013,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode014,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode015,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode016,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode017,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode018,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode019,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode020,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode021,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode022,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode023,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode024,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode025,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode026,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode027,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode028,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode029,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode030,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode031,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode032,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode033,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode034,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode035,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode036,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode037,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode038,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode039,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode040,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode041,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode042,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode043,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode044,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode045,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode046,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode047,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode048,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode049,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode050,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode051,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode052,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode053,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode054,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode055,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode056,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode057,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode058,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode059,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode060,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode061,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode062,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode063,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode064,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode065,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode066,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode067,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode068,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode069,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode070,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode071,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode072,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode073,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode074,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode075,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode076,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode077,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode078,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode079,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode080,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode081,                       0, RESV, ___, ___, ___)             \
-  V(JumpIfInitialized,                     T, ORDN, tgt, ___, ___)             \
-  V(JumpIfInitialized_Wide,                T, WIDE, tgt, ___, ___)             \
-  V(PushUninitializedSentinel,             0, ORDN, ___, ___, ___)             \
-  V(Trap,                                  0, ORDN, ___, ___, ___)             \
-  V(Entry,                                 D, ORDN, num, ___, ___)             \
-  V(Entry_Wide,                            D, WIDE, num, ___, ___)             \
-  V(EntryFixed,                          A_E, ORDN, num, num, ___)             \
-  V(EntryFixed_Wide,                     A_E, WIDE, num, num, ___)             \
-  V(EntryOptional,                     A_B_C, ORDN, num, num, num)             \
-  V(Unused00,                              0, RESV, ___, ___, ___)             \
-  V(LoadConstant,                        A_E, ORDN, reg, lit, ___)             \
-  V(LoadConstant_Wide,                   A_E, WIDE, reg, lit, ___)             \
-  V(Frame,                                 D, ORDN, num, ___, ___)             \
-  V(Frame_Wide,                            D, WIDE, num, ___, ___)             \
-  V(CheckFunctionTypeArgs,               A_E, ORDN, num, reg, ___)             \
-  V(CheckFunctionTypeArgs_Wide,          A_E, WIDE, num, reg, ___)             \
-  V(CheckStack,                            A, ORDN, num, ___, ___)             \
-  V(DebugCheck,                            0, ORDN, ___, ___, ___)             \
-  V(JumpIfUnchecked,                       T, ORDN, tgt, ___, ___)             \
-  V(JumpIfUnchecked_Wide,                  T, WIDE, tgt, ___, ___)             \
-  V(Allocate,                              D, ORDN, lit, ___, ___)             \
-  V(Allocate_Wide,                         D, WIDE, lit, ___, ___)             \
-  V(AllocateT,                             0, ORDN, ___, ___, ___)             \
-  V(CreateArrayTOS,                        0, ORDN, ___, ___, ___)             \
-  V(AllocateClosure,                       D, ORDN, lit, ___, ___)             \
-  V(AllocateClosure_Wide,                  D, WIDE, lit, ___, ___)             \
-  V(AllocateContext,                     A_E, ORDN, num, num, ___)             \
-  V(AllocateContext_Wide,                A_E, WIDE, num, num, ___)             \
-  V(CloneContext,                        A_E, ORDN, num, num, ___)             \
-  V(CloneContext_Wide,                   A_E, WIDE, num, num, ___)             \
-  V(LoadContextParent,                     0, ORDN, ___, ___, ___)             \
-  V(StoreContextParent,                    0, ORDN, ___, ___, ___)             \
-  V(LoadContextVar,                      A_E, ORDN, num, num, ___)             \
-  V(LoadContextVar_Wide,                 A_E, WIDE, num, num, ___)             \
-  V(Unused04,                              0, RESV, ___, ___, ___)             \
-  V(Unused05,                              0, RESV, ___, ___, ___)             \
-  V(StoreContextVar,                     A_E, ORDN, num, num, ___)             \
-  V(StoreContextVar_Wide,                A_E, WIDE, num, num, ___)             \
-  V(PushConstant,                          D, ORDN, lit, ___, ___)             \
-  V(PushConstant_Wide,                     D, WIDE, lit, ___, ___)             \
-  V(Unused06,                              0, RESV, ___, ___, ___)             \
-  V(Unused07,                              0, RESV, ___, ___, ___)             \
-  V(PushTrue,                              0, ORDN, ___, ___, ___)             \
-  V(PushFalse,                             0, ORDN, ___, ___, ___)             \
-  V(PushInt,                               X, ORDN, num, ___, ___)             \
-  V(PushInt_Wide,                          X, WIDE, num, ___, ___)             \
-  V(Unused08,                              0, RESV, ___, ___, ___)             \
-  V(Unused09,                              0, RESV, ___, ___, ___)             \
-  V(Unused10,                              0, RESV, ___, ___, ___)             \
-  V(Unused11,                              0, RESV, ___, ___, ___)             \
-  V(PushNull,                              0, ORDN, ___, ___, ___)             \
-  V(Drop1,                                 0, ORDN, ___, ___, ___)             \
-  V(Push,                                  X, ORDN, xeg, ___, ___)             \
-  V(Push_Wide,                             X, WIDE, xeg, ___, ___)             \
-  V(Unused12,                              0, RESV, ___, ___, ___)             \
-  V(Unused13,                              0, RESV, ___, ___, ___)             \
-  V(Unused14,                              0, RESV, ___, ___, ___)             \
-  V(Unused15,                              0, RESV, ___, ___, ___)             \
-  V(Unused16,                              0, RESV, ___, ___, ___)             \
-  V(Unused17,                              0, RESV, ___, ___, ___)             \
-  V(PopLocal,                              X, ORDN, xeg, ___, ___)             \
-  V(PopLocal_Wide,                         X, WIDE, xeg, ___, ___)             \
-  V(LoadStatic,                            D, ORDN, lit, ___, ___)             \
-  V(LoadStatic_Wide,                       D, WIDE, lit, ___, ___)             \
-  V(StoreLocal,                            X, ORDN, xeg, ___, ___)             \
-  V(StoreLocal_Wide,                       X, WIDE, xeg, ___, ___)             \
-  V(LoadFieldTOS,                          D, ORDN, lit, ___, ___)             \
-  V(LoadFieldTOS_Wide,                     D, WIDE, lit, ___, ___)             \
-  V(StoreFieldTOS,                         D, ORDN, lit, ___, ___)             \
-  V(StoreFieldTOS_Wide,                    D, WIDE, lit, ___, ___)             \
-  V(StoreIndexedTOS,                       0, ORDN, ___, ___, ___)             \
-  V(Unused20,                              0, RESV, ___, ___, ___)             \
-  V(InitLateField,                         D, ORDN, lit, ___, ___)             \
-  V(InitLateField_Wide,                    D, WIDE, lit, ___, ___)             \
-  V(StoreStaticTOS,                        D, ORDN, lit, ___, ___)             \
-  V(StoreStaticTOS_Wide,                   D, WIDE, lit, ___, ___)             \
-  V(Jump,                                  T, ORDN, tgt, ___, ___)             \
-  V(Jump_Wide,                             T, WIDE, tgt, ___, ___)             \
-  V(JumpIfNoAsserts,                       T, ORDN, tgt, ___, ___)             \
-  V(JumpIfNoAsserts_Wide,                  T, WIDE, tgt, ___, ___)             \
-  V(JumpIfNotZeroTypeArgs,                 T, ORDN, tgt, ___, ___)             \
-  V(JumpIfNotZeroTypeArgs_Wide,            T, WIDE, tgt, ___, ___)             \
-  V(JumpIfEqStrict,                        T, ORDN, tgt, ___, ___)             \
-  V(JumpIfEqStrict_Wide,                   T, WIDE, tgt, ___, ___)             \
-  V(JumpIfNeStrict,                        T, ORDN, tgt, ___, ___)             \
-  V(JumpIfNeStrict_Wide,                   T, WIDE, tgt, ___, ___)             \
-  V(JumpIfTrue,                            T, ORDN, tgt, ___, ___)             \
-  V(JumpIfTrue_Wide,                       T, WIDE, tgt, ___, ___)             \
-  V(JumpIfFalse,                           T, ORDN, tgt, ___, ___)             \
-  V(JumpIfFalse_Wide,                      T, WIDE, tgt, ___, ___)             \
-  V(JumpIfNull,                            T, ORDN, tgt, ___, ___)             \
-  V(JumpIfNull_Wide,                       T, WIDE, tgt, ___, ___)             \
-  V(JumpIfNotNull,                         T, ORDN, tgt, ___, ___)             \
-  V(JumpIfNotNull_Wide,                    T, WIDE, tgt, ___, ___)             \
-  V(DirectCall,                          D_F, ORDN, num, num, ___)             \
-  V(DirectCall_Wide,                     D_F, WIDE, num, num, ___)             \
-  V(UncheckedDirectCall,                 D_F, ORDN, num, num, ___)             \
-  V(UncheckedDirectCall_Wide,            D_F, WIDE, num, num, ___)             \
-  V(InterfaceCall,                       D_F, ORDN, num, num, ___)             \
-  V(InterfaceCall_Wide,                  D_F, WIDE, num, num, ___)             \
-  V(Unused23,                              0, RESV, ___, ___, ___)             \
-  V(Unused24,                              0, RESV, ___, ___, ___)             \
-  V(InstantiatedInterfaceCall,           D_F, ORDN, num, num, ___)             \
-  V(InstantiatedInterfaceCall_Wide,      D_F, WIDE, num, num, ___)             \
-  V(UncheckedClosureCall,                D_F, ORDN, num, num, ___)             \
-  V(UncheckedClosureCall_Wide,           D_F, WIDE, num, num, ___)             \
-  V(UncheckedInterfaceCall,              D_F, ORDN, num, num, ___)             \
-  V(UncheckedInterfaceCall_Wide,         D_F, WIDE, num, num, ___)             \
-  V(DynamicCall,                         D_F, ORDN, num, num, ___)             \
-  V(DynamicCall_Wide,                    D_F, WIDE, num, num, ___)             \
-  V(NativeCall,                            D, ORDN, lit, ___, ___)             \
-  V(NativeCall_Wide,                       D, WIDE, lit, ___, ___)             \
-  V(ReturnTOS,                             0, ORDN, ___, ___, ___)             \
-  V(Unused29,                              0, RESV, ___, ___, ___)             \
-  V(AssertAssignable,                    A_E, ORDN, num, lit, ___)             \
-  V(AssertAssignable_Wide,               A_E, WIDE, num, lit, ___)             \
-  V(Unused30,                              0, RESV, ___, ___, ___)             \
-  V(Unused31,                              0, RESV, ___, ___, ___)             \
-  V(AssertBoolean,                         A, ORDN, num, ___, ___)             \
-  V(AssertSubtype,                         0, ORDN, ___, ___, ___)             \
-  V(LoadTypeArgumentsField,                D, ORDN, lit, ___, ___)             \
-  V(LoadTypeArgumentsField_Wide,           D, WIDE, lit, ___, ___)             \
-  V(InstantiateType,                       D, ORDN, lit, ___, ___)             \
-  V(InstantiateType_Wide,                  D, WIDE, lit, ___, ___)             \
-  V(InstantiateTypeArgumentsTOS,         A_E, ORDN, num, lit, ___)             \
-  V(InstantiateTypeArgumentsTOS_Wide,    A_E, WIDE, num, lit, ___)             \
-  V(Unused32,                              0, RESV, ___, ___, ___)             \
-  V(Unused33,                              0, RESV, ___, ___, ___)             \
-  V(Unused34,                              0, RESV, ___, ___, ___)             \
-  V(Unused35,                              0, RESV, ___, ___, ___)             \
-  V(Throw,                                 A, ORDN, num, ___, ___)             \
-  V(SetFrame,                              A, ORDN, num, ___, num)             \
-  V(MoveSpecial,                         A_Y, ORDN, num, xeg, ___)             \
-  V(MoveSpecial_Wide,                    A_Y, WIDE, num, xeg, ___)             \
-  V(BooleanNegateTOS,                      0, ORDN, ___, ___, ___)             \
-  V(EqualsNull,                            0, ORDN, ___, ___, ___)             \
-  V(NullCheck,                             D, ORDN, lit, ___, ___)             \
-  V(NullCheck_Wide,                        D, WIDE, lit, ___, ___)             \
-  V(NegateInt,                             0, ORDN, ___, ___, ___)             \
-  V(AddInt,                                0, ORDN, ___, ___, ___)             \
-  V(SubInt,                                0, ORDN, ___, ___, ___)             \
-  V(MulInt,                                0, ORDN, ___, ___, ___)             \
-  V(TruncDivInt,                           0, ORDN, ___, ___, ___)             \
-  V(ModInt,                                0, ORDN, ___, ___, ___)             \
-  V(BitAndInt,                             0, ORDN, ___, ___, ___)             \
-  V(BitOrInt,                              0, ORDN, ___, ___, ___)             \
-  V(BitXorInt,                             0, ORDN, ___, ___, ___)             \
-  V(ShlInt,                                0, ORDN, ___, ___, ___)             \
-  V(ShrInt,                                0, ORDN, ___, ___, ___)             \
-  V(CompareIntEq,                          0, ORDN, ___, ___, ___)             \
-  V(CompareIntGt,                          0, ORDN, ___, ___, ___)             \
-  V(CompareIntLt,                          0, ORDN, ___, ___, ___)             \
-  V(CompareIntGe,                          0, ORDN, ___, ___, ___)             \
-  V(CompareIntLe,                          0, ORDN, ___, ___, ___)             \
-  V(NegateDouble,                          0, ORDN, ___, ___, ___)             \
-  V(AddDouble,                             0, ORDN, ___, ___, ___)             \
-  V(SubDouble,                             0, ORDN, ___, ___, ___)             \
-  V(MulDouble,                             0, ORDN, ___, ___, ___)             \
-  V(DivDouble,                             0, ORDN, ___, ___, ___)             \
-  V(CompareDoubleEq,                       0, ORDN, ___, ___, ___)             \
-  V(CompareDoubleGt,                       0, ORDN, ___, ___, ___)             \
-  V(CompareDoubleLt,                       0, ORDN, ___, ___, ___)             \
-  V(CompareDoubleGe,                       0, ORDN, ___, ___, ___)             \
-  V(CompareDoubleLe,                       0, ORDN, ___, ___, ___)             \
-
-  // These bytecodes are only generated within the VM. Reassigning their
-  // opcodes is not a breaking change.
-#define INTERNAL_KERNEL_BYTECODES_LIST(V)                                      \
-  V(VMInternal_ImplicitGetter,             0, ORDN, ___, ___, ___)             \
-  V(VMInternal_ImplicitSetter,             0, ORDN, ___, ___, ___)             \
-  V(VMInternal_ImplicitStaticGetter,       0, ORDN, ___, ___, ___)             \
-  V(VMInternal_MethodExtractor,            0, ORDN, ___, ___, ___)             \
-  V(VMInternal_InvokeClosure,              0, ORDN, ___, ___, ___)             \
-  V(VMInternal_InvokeField,                0, ORDN, ___, ___, ___)             \
-  V(VMInternal_ForwardDynamicInvocation,   0, ORDN, ___, ___, ___)             \
-  V(VMInternal_NoSuchMethodDispatcher,     0, ORDN, ___, ___, ___)             \
-  V(VMInternal_ImplicitStaticClosure,      0, ORDN, ___, ___, ___)             \
-  V(VMInternal_ImplicitInstanceClosure,    0, ORDN, ___, ___, ___)             \
-
-#define KERNEL_BYTECODES_LIST(V)                                               \
-  PUBLIC_KERNEL_BYTECODES_LIST(V)                                              \
-  INTERNAL_KERNEL_BYTECODES_LIST(V)
-
-// clang-format on
-
-typedef uint8_t KBCInstr;
-
-class KernelBytecode {
- public:
-  // Magic value of bytecode files.
-  static const intptr_t kMagicValue = 0x44424332;  // 'DBC2'
-  // Minimum bytecode format version supported by VM.
-  static const intptr_t kMinSupportedBytecodeFormatVersion = 28;
-  // Maximum bytecode format version supported by VM.
-  // The range of supported versions should include version produced by bytecode
-  // generator (currentBytecodeFormatVersion in pkg/vm/lib/bytecode/dbc.dart).
-  static const intptr_t kMaxSupportedBytecodeFormatVersion = 28;
-
-  enum Opcode {
-#define DECLARE_BYTECODE(name, encoding, kind, op1, op2, op3) k##name,
-    KERNEL_BYTECODES_LIST(DECLARE_BYTECODE)
-#undef DECLARE_BYTECODE
-  };
-
-  static const char* NameOf(Opcode op) {
-    const char* names[] = {
-#define NAME(name, encoding, kind, op1, op2, op3) #name,
-        KERNEL_BYTECODES_LIST(NAME)
-#undef NAME
-    };
-    return names[op];
-  }
-
-  static const intptr_t kInstructionSize[];
-
-  enum SpecialIndex {
-    kExceptionSpecialIndex,
-    kStackTraceSpecialIndex,
-    kSpecialIndexCount
-  };
-
- private:
-  static const intptr_t kWideModifier = 1;
-
-  // Should be used only on instructions with wide variants.
-  DART_FORCE_INLINE static bool IsWide(const KBCInstr* instr) {
-    return ((DecodeOpcode(instr) & kWideModifier) != 0);
-  }
-
- public:
-  DART_FORCE_INLINE static uint8_t DecodeA(const KBCInstr* bc) { return bc[1]; }
-
-  DART_FORCE_INLINE static uint8_t DecodeB(const KBCInstr* bc) { return bc[2]; }
-
-  DART_FORCE_INLINE static uint8_t DecodeC(const KBCInstr* bc) { return bc[3]; }
-
-  DART_FORCE_INLINE static uint32_t DecodeD(const KBCInstr* bc) {
-    if (IsWide(bc)) {
-      return static_cast<uint32_t>(bc[1]) |
-             (static_cast<uint32_t>(bc[2]) << 8) |
-             (static_cast<uint32_t>(bc[3]) << 16) |
-             (static_cast<uint32_t>(bc[4]) << 24);
-    } else {
-      return bc[1];
-    }
-  }
-
-  DART_FORCE_INLINE static int32_t DecodeX(const KBCInstr* bc) {
-    if (IsWide(bc)) {
-      return static_cast<int32_t>(static_cast<uint32_t>(bc[1]) |
-                                  (static_cast<uint32_t>(bc[2]) << 8) |
-                                  (static_cast<uint32_t>(bc[3]) << 16) |
-                                  (static_cast<uint32_t>(bc[4]) << 24));
-    } else {
-      return static_cast<int8_t>(bc[1]);
-    }
-  }
-
-  DART_FORCE_INLINE static int32_t DecodeT(const KBCInstr* bc) {
-    if (IsWide(bc)) {
-      return static_cast<int32_t>((static_cast<uint32_t>(bc[1]) << 8) |
-                                  (static_cast<uint32_t>(bc[2]) << 16) |
-                                  (static_cast<uint32_t>(bc[3]) << 24)) >>
-             8;
-    } else {
-      return static_cast<int8_t>(bc[1]);
-    }
-  }
-
-  DART_FORCE_INLINE static uint32_t DecodeE(const KBCInstr* bc) {
-    if (IsWide(bc)) {
-      return static_cast<uint32_t>(bc[2]) |
-             (static_cast<uint32_t>(bc[3]) << 8) |
-             (static_cast<uint32_t>(bc[4]) << 16) |
-             (static_cast<uint32_t>(bc[5]) << 24);
-    } else {
-      return bc[2];
-    }
-  }
-
-  DART_FORCE_INLINE static int32_t DecodeY(const KBCInstr* bc) {
-    if (IsWide(bc)) {
-      return static_cast<int32_t>(static_cast<uint32_t>(bc[2]) |
-                                  (static_cast<uint32_t>(bc[3]) << 8) |
-                                  (static_cast<uint32_t>(bc[4]) << 16) |
-                                  (static_cast<uint32_t>(bc[5]) << 24));
-    } else {
-      return static_cast<int8_t>(bc[2]);
-    }
-  }
-
-  DART_FORCE_INLINE static uint8_t DecodeF(const KBCInstr* bc) {
-    if (IsWide(bc)) {
-      return bc[5];
-    } else {
-      return bc[2];
-    }
-  }
-
-  DART_FORCE_INLINE static Opcode DecodeOpcode(const KBCInstr* bc) {
-    return static_cast<Opcode>(bc[0]);
-  }
-
-  DART_FORCE_INLINE static const KBCInstr* Next(const KBCInstr* bc) {
-    return bc + kInstructionSize[DecodeOpcode(bc)];
-  }
-
-  DART_FORCE_INLINE static uword Next(uword pc) {
-    return pc + kInstructionSize[DecodeOpcode(
-                    reinterpret_cast<const KBCInstr*>(pc))];
-  }
-
-  DART_FORCE_INLINE static bool IsJumpOpcode(const KBCInstr* instr) {
-    switch (DecodeOpcode(instr)) {
-      case KernelBytecode::kJump:
-      case KernelBytecode::kJump_Wide:
-      case KernelBytecode::kJumpIfNoAsserts:
-      case KernelBytecode::kJumpIfNoAsserts_Wide:
-      case KernelBytecode::kJumpIfNotZeroTypeArgs:
-      case KernelBytecode::kJumpIfNotZeroTypeArgs_Wide:
-      case KernelBytecode::kJumpIfEqStrict:
-      case KernelBytecode::kJumpIfEqStrict_Wide:
-      case KernelBytecode::kJumpIfNeStrict:
-      case KernelBytecode::kJumpIfNeStrict_Wide:
-      case KernelBytecode::kJumpIfTrue:
-      case KernelBytecode::kJumpIfTrue_Wide:
-      case KernelBytecode::kJumpIfFalse:
-      case KernelBytecode::kJumpIfFalse_Wide:
-      case KernelBytecode::kJumpIfNull:
-      case KernelBytecode::kJumpIfNull_Wide:
-      case KernelBytecode::kJumpIfNotNull:
-      case KernelBytecode::kJumpIfNotNull_Wide:
-      case KernelBytecode::kJumpIfUnchecked:
-      case KernelBytecode::kJumpIfUnchecked_Wide:
-      case KernelBytecode::kJumpIfInitialized:
-      case KernelBytecode::kJumpIfInitialized_Wide:
-        return true;
-
-      default:
-        return false;
-    }
-  }
-
-  DART_FORCE_INLINE static bool IsJumpIfUncheckedOpcode(const KBCInstr* instr) {
-    switch (DecodeOpcode(instr)) {
-      case KernelBytecode::kJumpIfUnchecked:
-      case KernelBytecode::kJumpIfUnchecked_Wide:
-        return true;
-      default:
-        return false;
-    }
-  }
-
-  DART_FORCE_INLINE static bool IsLoadConstantOpcode(const KBCInstr* instr) {
-    switch (DecodeOpcode(instr)) {
-      case KernelBytecode::kLoadConstant:
-      case KernelBytecode::kLoadConstant_Wide:
-        return true;
-      default:
-        return false;
-    }
-  }
-
-  DART_FORCE_INLINE static bool IsCheckStackOpcode(const KBCInstr* instr) {
-    return DecodeOpcode(instr) == KernelBytecode::kCheckStack;
-  }
-
-  DART_FORCE_INLINE static bool IsCheckFunctionTypeArgs(const KBCInstr* instr) {
-    switch (DecodeOpcode(instr)) {
-      case KernelBytecode::kCheckFunctionTypeArgs:
-      case KernelBytecode::kCheckFunctionTypeArgs_Wide:
-        return true;
-      default:
-        return false;
-    }
-  }
-
-  DART_FORCE_INLINE static bool IsEntryOpcode(const KBCInstr* instr) {
-    switch (DecodeOpcode(instr)) {
-      case KernelBytecode::kEntry:
-      case KernelBytecode::kEntry_Wide:
-        return true;
-      default:
-        return false;
-    }
-  }
-
-  DART_FORCE_INLINE static bool IsEntryFixedOpcode(const KBCInstr* instr) {
-    switch (DecodeOpcode(instr)) {
-      case KernelBytecode::kEntryFixed:
-      case KernelBytecode::kEntryFixed_Wide:
-        return true;
-      default:
-        return false;
-    }
-  }
-
-  DART_FORCE_INLINE static bool IsEntryOptionalOpcode(const KBCInstr* instr) {
-    return DecodeOpcode(instr) == KernelBytecode::kEntryOptional;
-  }
-
-  DART_FORCE_INLINE static bool IsFrameOpcode(const KBCInstr* instr) {
-    switch (DecodeOpcode(instr)) {
-      case KernelBytecode::kFrame:
-      case KernelBytecode::kFrame_Wide:
-        return true;
-      default:
-        return false;
-    }
-  }
-
-  DART_FORCE_INLINE static bool IsSetFrameOpcode(const KBCInstr* instr) {
-    return DecodeOpcode(instr) == KernelBytecode::kSetFrame;
-  }
-
-  DART_FORCE_INLINE static bool IsNativeCallOpcode(const KBCInstr* instr) {
-    switch (DecodeOpcode(instr)) {
-      case KernelBytecode::kNativeCall:
-      case KernelBytecode::kNativeCall_Wide:
-        return true;
-      default:
-        return false;
-    }
-  }
-
-  DART_FORCE_INLINE static bool IsDebugCheckOpcode(const KBCInstr* instr) {
-    return DecodeOpcode(instr) == KernelBytecode::kDebugCheck;
-  }
-
-  // The interpreter, the bytecode generator, the bytecode compiler, and this
-  // function must agree on this list of opcodes.
-  // For each instruction with listed opcode:
-  // - The interpreter checks for a debug break.
-  // - The bytecode generator emits a source position.
-  // - The bytecode compiler may emit a DebugStepCheck call.
-  DART_FORCE_INLINE static bool IsDebugCheckedOpcode(const KBCInstr* instr) {
-    switch (DecodeOpcode(instr)) {
-      case KernelBytecode::kDebugCheck:
-      case KernelBytecode::kDirectCall:
-      case KernelBytecode::kDirectCall_Wide:
-      case KernelBytecode::kUncheckedDirectCall:
-      case KernelBytecode::kUncheckedDirectCall_Wide:
-      case KernelBytecode::kInterfaceCall:
-      case KernelBytecode::kInterfaceCall_Wide:
-      case KernelBytecode::kInstantiatedInterfaceCall:
-      case KernelBytecode::kInstantiatedInterfaceCall_Wide:
-      case KernelBytecode::kUncheckedClosureCall:
-      case KernelBytecode::kUncheckedClosureCall_Wide:
-      case KernelBytecode::kUncheckedInterfaceCall:
-      case KernelBytecode::kUncheckedInterfaceCall_Wide:
-      case KernelBytecode::kDynamicCall:
-      case KernelBytecode::kDynamicCall_Wide:
-      case KernelBytecode::kReturnTOS:
-      case KernelBytecode::kEqualsNull:
-      case KernelBytecode::kNegateInt:
-      case KernelBytecode::kNegateDouble:
-      case KernelBytecode::kAddInt:
-      case KernelBytecode::kSubInt:
-      case KernelBytecode::kMulInt:
-      case KernelBytecode::kTruncDivInt:
-      case KernelBytecode::kModInt:
-      case KernelBytecode::kBitAndInt:
-      case KernelBytecode::kBitOrInt:
-      case KernelBytecode::kBitXorInt:
-      case KernelBytecode::kShlInt:
-      case KernelBytecode::kShrInt:
-      case KernelBytecode::kCompareIntEq:
-      case KernelBytecode::kCompareIntGt:
-      case KernelBytecode::kCompareIntLt:
-      case KernelBytecode::kCompareIntGe:
-      case KernelBytecode::kCompareIntLe:
-      case KernelBytecode::kAddDouble:
-      case KernelBytecode::kSubDouble:
-      case KernelBytecode::kMulDouble:
-      case KernelBytecode::kDivDouble:
-      case KernelBytecode::kCompareDoubleEq:
-      case KernelBytecode::kCompareDoubleGt:
-      case KernelBytecode::kCompareDoubleLt:
-      case KernelBytecode::kCompareDoubleGe:
-      case KernelBytecode::kCompareDoubleLe:
-        return true;
-      default:
-        return false;
-    }
-  }
-
-  static const uint8_t kNativeCallToGrowableListArgc = 2;
-
-  // Returns a fake return address which points after the 2-argument
-  // bytecode call, followed by ReturnTOS instructions.
-  static const KBCInstr* GetNativeCallToGrowableListReturnTrampoline();
-
-  DART_FORCE_INLINE static uint8_t DecodeArgc(const KBCInstr* ret_addr) {
-    // All call instructions have DF encoding, with argc being the last byte
-    // regardless of whether the wide variant is used or not.
-    return ret_addr[-1];
-  }
-
-  // Converts bytecode PC into an offset.
-  // For return addresses used in PcDescriptors, PC is also augmented by 1.
-  // TODO(regis): Eliminate this correction.
-  static intptr_t BytecodePcToOffset(uint32_t pc, bool is_return_address) {
-    return pc + (is_return_address ? 1 : 0);
-  }
-
-  static uint32_t OffsetToBytecodePc(intptr_t offset, bool is_return_address) {
-    return offset - (is_return_address ? 1 : 0);
-  }
-
-  static void GetVMInternalBytecodeInstructions(Opcode opcode,
-                                                const KBCInstr** instructions,
-                                                intptr_t* instructions_size);
-
- private:
-  DISALLOW_ALLOCATION();
-  DISALLOW_IMPLICIT_CONSTRUCTORS(KernelBytecode);
-};
-
-}  // namespace dart
-
-#endif  // RUNTIME_VM_CONSTANTS_KBC_H_
diff --git a/runtime/vm/constants_x64.h b/runtime/vm/constants_x64.h
index b74b2b6..c1fb6c3 100644
--- a/runtime/vm/constants_x64.h
+++ b/runtime/vm/constants_x64.h
@@ -132,6 +132,11 @@
 // ABI for allocation stubs.
 const Register kAllocationStubTypeArgumentsReg = RDX;
 
+// Common ABI for shared slow path stubs.
+struct SharedSlowPathStubABI {
+  static const Register kResultReg = RAX;
+};
+
 // ABI for instantiation stubs.
 struct InstantiationABI {
   static const Register kUninstantiatedTypeArgumentsReg = RBX;
@@ -159,6 +164,23 @@
   static const Register kResultReg = RAX;
 };
 
+// Calling convention when calling AssertSubtypeStub.
+struct AssertSubtypeABI {
+  static const Register kSubTypeReg = RAX;
+  static const Register kSuperTypeReg = RBX;
+  static const Register kInstantiatorTypeArgumentsReg = RDX;
+  static const Register kFunctionTypeArgumentsReg = RCX;
+  static const Register kDstNameReg = R9;
+
+  static const intptr_t kAbiRegisters =
+      (1 << kSubTypeReg) | (1 << kSuperTypeReg) |
+      (1 << kInstantiatorTypeArgumentsReg) | (1 << kFunctionTypeArgumentsReg) |
+      (1 << kDstNameReg);
+
+  // No result register, as AssertSubtype is only run for side effect
+  // (throws if the subtype check fails).
+};
+
 // ABI for InitStaticFieldStub.
 struct InitStaticFieldABI {
   static const Register kFieldReg = RAX;
@@ -179,6 +201,11 @@
   static const Register kScratchReg = RSI;
 };
 
+// ABI for LateInitializationError stubs.
+struct LateInitializationErrorABI {
+  static const Register kFieldReg = RSI;
+};
+
 // ABI for ThrowStub.
 struct ThrowABI {
   static const Register kExceptionReg = RAX;
@@ -277,6 +304,16 @@
   // same time? (Windows no, rest yes)
   static const bool kArgumentIntRegXorFpuReg = true;
 
+  // > The x64 Application Binary Interface (ABI) uses a four-register
+  // > fast-call calling convention by default. Space is allocated on the call
+  // > stack as a shadow store for callees to save those registers.
+  // https://docs.microsoft.com/en-us/cpp/build/x64-calling-convention?view=msvc-160
+  //
+  // The caller allocates this space. The caller should also reclaim this space
+  // after the call to restore the stack to its original state if needed.
+  //
+  // This is also known as home space.
+  // https://devblogs.microsoft.com/oldnewthing/20160623-00/?p=93735
   static const intptr_t kShadowSpaceBytes = 4 * kWordSize;
 
   static const intptr_t kVolatileCpuRegisters =
diff --git a/runtime/vm/dart.cc b/runtime/vm/dart.cc
index dac8c18..5d7112a 100644
--- a/runtime/vm/dart.cc
+++ b/runtime/vm/dart.cc
@@ -806,7 +806,7 @@
   }
 
   // If we are loading from source, figure out the mode from the source.
-  if (KernelIsolate::GetExperimentalFlag("non-nullable")) {
+  if (!KernelIsolate::GetExperimentalFlag("no-non-nullable")) {
     return KernelIsolate::DetectNullSafety(script_uri, package_config,
                                            original_working_directory);
   }
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index 6fdb197..4776fa5 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -711,25 +711,22 @@
   if (!handle->raw()->IsHeapObject()) {
     return;  // Free handle.
   }
+  Dart_HandleFinalizer callback = handle->callback();
+  ASSERT(callback != NULL);
   void* peer = handle->peer();
   ApiState* state = isolate_group->api_state();
   ASSERT(state != NULL);
 
-  ASSERT(handle->auto_delete());
-
-  if (handle->callback_signature_ == CallbackSignature::kHandleFinalizer) {
-    Dart_HandleFinalizer callback = handle->callback();
-    ASSERT(callback != NULL);
-    (*callback)(isolate_group->embedder_data(), peer);
-  } else {
-    Dart_WeakPersistentHandleFinalizer callback =
-        handle->CallbackWeakFinalizer();
-    ASSERT(callback != NULL);
-    Dart_WeakPersistentHandle object = handle->ApiWeakPersistentHandle();
-    (*callback)(isolate_group->embedder_data(), object, peer);
+  if (!handle->auto_delete()) {
+    // Clear handle before running finalizer, finalizer can free the handle.
+    state->ClearWeakPersistentHandle(handle);
   }
 
-  state->FreeWeakPersistentHandle(handle);
+  (*callback)(isolate_group->embedder_data(), peer);
+
+  if (handle->auto_delete()) {
+    state->FreeWeakPersistentHandle(handle);
+  }
 }
 
 // --- Handles ---
@@ -942,6 +939,9 @@
   NoSafepointScope no_safepoint_scope;
   FinalizablePersistentHandle* weak_ref =
       FinalizablePersistentHandle::Cast(object);
+  if (weak_ref->IsFinalizedNotFreed()) {
+    return Dart_Null();
+  }
   return Api::NewHandle(thread, weak_ref->raw());
 }
 
@@ -986,14 +986,14 @@
     const Object& ref,
     void* peer,
     intptr_t external_allocation_size,
-    Dart_WeakPersistentHandleFinalizer callback) {
+    Dart_HandleFinalizer callback) {
   if (!ref.raw()->IsHeapObject()) {
     return NULL;
   }
   FinalizablePersistentHandle* finalizable_ref =
       FinalizablePersistentHandle::New(thread->isolate(), ref, peer, callback,
                                        external_allocation_size,
-                                       /*auto_delete=*/true);
+                                       /*auto_delete=*/false);
   return finalizable_ref->ApiWeakPersistentHandle();
 }
 
@@ -1002,7 +1002,7 @@
     Dart_Handle object,
     void* peer,
     intptr_t external_allocation_size,
-    Dart_WeakPersistentHandleFinalizer callback) {
+    Dart_HandleFinalizer callback) {
   REUSABLE_OBJECT_HANDLESCOPE(thread);
   Object& ref = thread->ObjectHandle();
   ref = Api::UnwrapHandle(object);
@@ -1044,7 +1044,7 @@
 Dart_NewWeakPersistentHandle(Dart_Handle object,
                              void* peer,
                              intptr_t external_allocation_size,
-                             Dart_WeakPersistentHandleFinalizer callback) {
+                             Dart_HandleFinalizer callback) {
   Thread* thread = Thread::Current();
   CHECK_ISOLATE(thread->isolate());
   if (callback == NULL) {
@@ -2961,7 +2961,7 @@
                              intptr_t length,
                              void* peer,
                              intptr_t external_allocation_size,
-                             Dart_WeakPersistentHandleFinalizer callback) {
+                             Dart_HandleFinalizer callback) {
   DARTSCOPE(Thread::Current());
   API_TIMELINE_DURATION(T);
   if (latin1_array == NULL && length != 0) {
@@ -2983,7 +2983,7 @@
                             intptr_t length,
                             void* peer,
                             intptr_t external_allocation_size,
-                            Dart_WeakPersistentHandleFinalizer callback) {
+                            Dart_HandleFinalizer callback) {
   DARTSCOPE(Thread::Current());
   if (utf16_array == NULL && length != 0) {
     RETURN_NULL_ERROR(utf16_array);
@@ -3933,14 +3933,13 @@
   return Api::NewHandle(thread, TypedData::New(cid, length));
 }
 
-static Dart_Handle NewExternalTypedData(
-    Thread* thread,
-    intptr_t cid,
-    void* data,
-    intptr_t length,
-    void* peer,
-    intptr_t external_allocation_size,
-    Dart_WeakPersistentHandleFinalizer callback) {
+static Dart_Handle NewExternalTypedData(Thread* thread,
+                                        intptr_t cid,
+                                        void* data,
+                                        intptr_t length,
+                                        void* peer,
+                                        intptr_t external_allocation_size,
+                                        Dart_HandleFinalizer callback) {
   CHECK_LENGTH(length, ExternalTypedData::MaxElements(cid));
   Zone* zone = thread->zone();
   intptr_t bytes = length * ExternalTypedData::ElementSizeInBytes(cid);
@@ -3952,19 +3951,18 @@
   result = ExternalTypedData::New(cid, reinterpret_cast<uint8_t*>(data), length,
                                   thread->heap()->SpaceForExternal(bytes));
   if (callback != nullptr) {
-    AllocateWeakPersistentHandle(thread, result, peer, external_allocation_size,
-                                 callback);
+    AllocateFinalizableHandle(thread, result, peer, external_allocation_size,
+                              callback);
   }
   return Api::NewHandle(thread, result.raw());
 }
 
-static Dart_Handle NewExternalByteData(
-    Thread* thread,
-    void* data,
-    intptr_t length,
-    void* peer,
-    intptr_t external_allocation_size,
-    Dart_WeakPersistentHandleFinalizer callback) {
+static Dart_Handle NewExternalByteData(Thread* thread,
+                                       void* data,
+                                       intptr_t length,
+                                       void* peer,
+                                       intptr_t external_allocation_size,
+                                       Dart_HandleFinalizer callback) {
   Zone* zone = thread->zone();
   Dart_Handle ext_data =
       NewExternalTypedData(thread, kExternalTypedDataUint8ArrayCid, data,
@@ -4049,13 +4047,13 @@
                                                 NULL);
 }
 
-DART_EXPORT Dart_Handle Dart_NewExternalTypedDataWithFinalizer(
-    Dart_TypedData_Type type,
-    void* data,
-    intptr_t length,
-    void* peer,
-    intptr_t external_allocation_size,
-    Dart_WeakPersistentHandleFinalizer callback) {
+DART_EXPORT Dart_Handle
+Dart_NewExternalTypedDataWithFinalizer(Dart_TypedData_Type type,
+                                       void* data,
+                                       intptr_t length,
+                                       void* peer,
+                                       intptr_t external_allocation_size,
+                                       Dart_HandleFinalizer callback) {
   DARTSCOPE(Thread::Current());
   if (data == NULL && length != 0) {
     RETURN_NULL_ERROR(data);
@@ -4822,7 +4820,7 @@
     args.SetAt(i + 1, obj);
   }
   // Now try to invoke the closure.
-  return Api::NewHandle(T, DartEntry::InvokeClosure(args));
+  return Api::NewHandle(T, DartEntry::InvokeClosure(T, args));
 }
 
 DART_EXPORT Dart_Handle Dart_GetField(Dart_Handle container, Dart_Handle name) {
@@ -5735,7 +5733,7 @@
     type ^=
         Type::New(cls, type_args_obj, TokenPosition::kNoSource, nullability);
   }
-  type ^= ClassFinalizer::FinalizeType(cls, type);
+  type ^= ClassFinalizer::FinalizeType(type);
   return Api::NewHandle(T, type.raw());
 }
 
diff --git a/runtime/vm/dart_api_impl_test.cc b/runtime/vm/dart_api_impl_test.cc
index 0046562..fea59eb 100644
--- a/runtime/vm/dart_api_impl_test.cc
+++ b/runtime/vm/dart_api_impl_test.cc
@@ -1430,9 +1430,7 @@
   }
 }
 
-static void NoopFinalizer(void* isolate_callback_data,
-                          Dart_WeakPersistentHandle handle,
-                          void* peer) {}
+static void NoopFinalizer(void* isolate_callback_data, void* peer) {}
 
 TEST_CASE(DartAPI_IsString) {
   uint8_t latin1[] = {'o', 'n', 'e', 0xC2, 0xA2};
@@ -1581,7 +1579,6 @@
 }
 
 static void ExternalStringCallbackFinalizer(void* isolate_callback_data,
-                                            Dart_WeakPersistentHandle handle,
                                             void* peer) {
   *static_cast<int*>(peer) *= 2;
 }
@@ -1966,7 +1963,7 @@
 
   const char* kScriptChars =
       "import 'dart:typed_data';\n"
-      "List main(int size) {\n"
+      "List testMain(int size) {\n"
       "  var a = new Int8List(size);\n"
       "  var view = new Int8List.view(a.buffer, 0, size);\n"
       "  return view;\n"
@@ -1977,7 +1974,7 @@
   // Test with a typed data view object.
   Dart_Handle dart_args[1];
   dart_args[0] = Dart_NewInteger(kSize);
-  Dart_Handle view_obj = Dart_Invoke(lib, NewString("main"), 1, dart_args);
+  Dart_Handle view_obj = Dart_Invoke(lib, NewString("testMain"), 1, dart_args);
   EXPECT_VALID(view_obj);
   for (intptr_t i = 0; i < kSize; ++i) {
     EXPECT_VALID(Dart_ListSetAt(view_obj, i, Dart_NewInteger(i & 0xff)));
@@ -1998,7 +1995,7 @@
 
   const char* kScriptChars =
       "import 'dart:typed_data';\n"
-      "List main(int size) {\n"
+      "List testMain(int size) {\n"
       "  var a = new Int8List(size);\n"
       "  var view = new Int8List.view(a.buffer, 0, size);\n"
       "  return view;\n"
@@ -2009,7 +2006,7 @@
   // Create a typed data view object.
   Dart_Handle dart_args[1];
   dart_args[0] = Dart_NewInteger(kSize);
-  Dart_Handle view_obj = Dart_Invoke(lib, NewString("main"), 1, dart_args);
+  Dart_Handle view_obj = Dart_Invoke(lib, NewString("testMain"), 1, dart_args);
   EXPECT_VALID(view_obj);
   // Test that the API considers it a TypedData object.
   EXPECT(Dart_IsTypedData(view_obj));
@@ -2258,9 +2255,7 @@
 }
 
 static bool byte_data_finalizer_run = false;
-void ByteDataFinalizer(void* isolate_data,
-                       Dart_WeakPersistentHandle handle,
-                       void* peer) {
+void ByteDataFinalizer(void* isolate_data, void* peer) {
   ASSERT(!byte_data_finalizer_run);
   free(peer);
   byte_data_finalizer_run = true;
@@ -2789,22 +2784,13 @@
   EXPECT(value);
 }
 
-static void NopCallback(void* isolate_callback_data,
-                        Dart_WeakPersistentHandle handle,
-                        void* peer) {}
 static void NopCallback(void* isolate_callback_data, void* peer) {}
 
-static void UnreachedCallback(void* isolate_callback_data,
-                              Dart_WeakPersistentHandle handle,
-                              void* peer) {
-  UNREACHABLE();
-}
 static void UnreachedCallback(void* isolate_callback_data, void* peer) {
   UNREACHABLE();
 }
 
 static void ExternalTypedDataFinalizer(void* isolate_callback_data,
-                                       Dart_WeakPersistentHandle handle,
                                        void* peer) {
   *static_cast<int*>(peer) = 42;
 }
@@ -2855,22 +2841,24 @@
   EXPECT_EQ(20, count);
 }
 
-static void SlowWeakPersistentHandle(void* isolate_callback_data,
-                                     Dart_WeakPersistentHandle handle,
-                                     void* peer) {
+static void SlowWeakPersistentHandle(void* isolate_callback_data, void* peer) {
   OS::Sleep(10);
   intptr_t* count = reinterpret_cast<intptr_t*>(peer);
   (*count)++;
 }
 
 TEST_CASE(DartAPI_SlowWeakPersistenhandle) {
+  Dart_WeakPersistentHandle handles[20];
   intptr_t count = 0;
+
   for (intptr_t i = 0; i < 10; i++) {
     Dart_EnterScope();
     Dart_Handle str1 = Dart_NewStringFromCString("Live fast");
-    Dart_NewWeakPersistentHandle(str1, &count, 0, SlowWeakPersistentHandle);
+    handles[i] =
+        Dart_NewWeakPersistentHandle(str1, &count, 0, SlowWeakPersistentHandle);
     Dart_Handle str2 = Dart_NewStringFromCString("Die young");
-    Dart_NewWeakPersistentHandle(str2, &count, 0, SlowWeakPersistentHandle);
+    handles[i + 10] =
+        Dart_NewWeakPersistentHandle(str2, &count, 0, SlowWeakPersistentHandle);
     Dart_ExitScope();
 
     {
@@ -2880,6 +2868,10 @@
   }
 
   EXPECT_EQ(20, count);
+
+  for (intptr_t i = 0; i < 20; i++) {
+    Dart_DeleteWeakPersistentHandle(handles[i]);
+  }
 }
 
 static void CheckFloat32x4Data(Dart_Handle obj) {
@@ -3119,27 +3111,9 @@
   return Dart_HandleFromWeakPersistent(weak);
 }
 
-static Dart_WeakPersistentHandle weak_new_ref = NULL;
-static Dart_WeakPersistentHandle weak_old_ref = NULL;
-
-static void WeakPersistentHandleCallback(void* isolate_callback_data,
-                                         Dart_WeakPersistentHandle handle,
-                                         void* peer) {
-  if (handle == weak_new_ref) {
-    weak_new_ref = NULL;
-  } else if (handle == weak_old_ref) {
-    weak_old_ref = NULL;
-  }
-}
-
 TEST_CASE(DartAPI_WeakPersistentHandle) {
-  Dart_Handle local_new_ref = Dart_Null();
-  weak_new_ref = Dart_NewWeakPersistentHandle(local_new_ref, NULL, 0,
-                                              WeakPersistentHandleCallback);
-
-  Dart_Handle local_old_ref = Dart_Null();
-  weak_old_ref = Dart_NewWeakPersistentHandle(local_old_ref, NULL, 0,
-                                              WeakPersistentHandleCallback);
+  Dart_WeakPersistentHandle weak_new_ref = nullptr;
+  Dart_WeakPersistentHandle weak_old_ref = nullptr;
 
   {
     Dart_EnterScope();
@@ -3159,14 +3133,15 @@
       EXPECT_VALID(old_ref);
 
       // Create a weak ref to the new space object.
-      weak_new_ref = Dart_NewWeakPersistentHandle(new_ref, NULL, 0,
-                                                  WeakPersistentHandleCallback);
+      weak_new_ref =
+          Dart_NewWeakPersistentHandle(new_ref, nullptr, 0, NopCallback);
       EXPECT_VALID(AsHandle(weak_new_ref));
       EXPECT(!Dart_IsNull(AsHandle(weak_new_ref)));
 
       // Create a weak ref to the old space object.
-      weak_old_ref = Dart_NewWeakPersistentHandle(old_ref, NULL, 0,
-                                                  WeakPersistentHandleCallback);
+      weak_old_ref =
+          Dart_NewWeakPersistentHandle(old_ref, nullptr, 0, NopCallback);
+
       EXPECT_VALID(AsHandle(weak_old_ref));
       EXPECT(!Dart_IsNull(AsHandle(weak_old_ref)));
     }
@@ -3224,7 +3199,8 @@
   {
     Dart_EnterScope();
     // Weak ref to new space object should now be cleared.
-    EXPECT(weak_new_ref == NULL);
+    EXPECT_VALID(AsHandle(weak_new_ref));
+    EXPECT(Dart_IsNull(AsHandle(weak_new_ref)));
     EXPECT_VALID(AsHandle(weak_old_ref));
     EXPECT(!Dart_IsNull(AsHandle(weak_old_ref)));
     Dart_ExitScope();
@@ -3239,8 +3215,10 @@
   {
     Dart_EnterScope();
     // Weak ref to old space object should now be cleared.
-    EXPECT(weak_new_ref == NULL);
-    EXPECT(weak_old_ref == NULL);
+    EXPECT_VALID(AsHandle(weak_new_ref));
+    EXPECT(Dart_IsNull(AsHandle(weak_new_ref)));
+    EXPECT_VALID(AsHandle(weak_old_ref));
+    EXPECT(Dart_IsNull(AsHandle(weak_old_ref)));
     Dart_ExitScope();
   }
 
@@ -3249,6 +3227,9 @@
     // Garbage collect one last time to revisit deleted handles.
     GCTestHelper::CollectAllGarbage();
   }
+
+  Dart_DeleteWeakPersistentHandle(weak_new_ref);
+  Dart_DeleteWeakPersistentHandle(weak_old_ref);
 }
 
 static Dart_FinalizableHandle finalizable_new_ref = nullptr;
@@ -3384,7 +3365,7 @@
   Dart_Handle obj2 = Dart_NewInteger(0);
   EXPECT_VALID(obj2);
   Dart_WeakPersistentHandle ref2 =
-      Dart_NewWeakPersistentHandle(obj2, NULL, 0, WeakPersistentHandleCallback);
+      Dart_NewWeakPersistentHandle(obj2, NULL, 0, NopCallback);
   EXPECT_EQ(ref2, static_cast<void*>(NULL));
 
   Dart_ExitScope();
@@ -3416,17 +3397,12 @@
 
 static void WeakPersistentHandlePeerCleanupFinalizer(
     void* isolate_callback_data,
-    Dart_WeakPersistentHandle handle,
     void* peer) {
   Dart_DeletePersistentHandle(persistent_handle1);
   Dart_DeleteWeakPersistentHandle(weak_persistent_handle2);
   *static_cast<int*>(peer) = 42;
 }
 
-static void WeakPersistentHandleNoopCallback(void* isolate_callback_data,
-                                             Dart_WeakPersistentHandle handle,
-                                             void* peer) {}
-
 TEST_CASE(DartAPI_WeakPersistentHandleCleanupFinalizer) {
   Heap* heap = Isolate::Current()->heap();
 
@@ -3437,8 +3413,8 @@
   persistent_handle1 = Dart_NewPersistentHandle(ref1);
   Dart_Handle ref2 = Dart_NewStringFromCString(kTestString1);
   int peer2 = 0;
-  weak_persistent_handle2 = Dart_NewWeakPersistentHandle(
-      ref2, &peer2, 0, WeakPersistentHandleNoopCallback);
+  weak_persistent_handle2 =
+      Dart_NewWeakPersistentHandle(ref2, &peer2, 0, NopCallback);
   int peer3 = 0;
   {
     Dart_EnterScope();
@@ -3454,6 +3430,8 @@
     EXPECT(peer3 == 42);
   }
   Dart_ExitScope();
+
+  Dart_DeleteWeakPersistentHandle(weak_persistent_handle3);
 }
 
 static Dart_FinalizableHandle finalizable_handle3;
@@ -3495,7 +3473,6 @@
 }
 
 static void WeakPersistentHandlePeerFinalizer(void* isolate_callback_data,
-                                              Dart_WeakPersistentHandle handle,
                                               void* peer) {
   *static_cast<int*>(peer) = 42;
 }
@@ -3520,6 +3497,7 @@
     GCTestHelper::CollectNewSpace();
     EXPECT(peer == 42);
   }
+  Dart_DeleteWeakPersistentHandle(weak_ref);
 }
 
 static void FinalizableHandlePeerFinalizer(void* isolate_callback_data,
@@ -3599,13 +3577,53 @@
 
 Dart_WeakPersistentHandle delete_on_finalization;
 
+static void DeleteWeakHandleOnFinalization(void* isolate_callback_data,
+                                           void* peer) {
+  *static_cast<int*>(peer) = 42;
+  Dart_DeleteWeakPersistentHandle(delete_on_finalization);
+  delete_on_finalization = nullptr;
+}
+
+static void DontDeleteWeakHandleOnFinalization(void* isolate_callback_data,
+                                               void* peer) {
+  *static_cast<int*>(peer) = 42;
+  delete_on_finalization = nullptr;
+}
+
+// Mimicking the old handle behavior by deleting the handle itself in the
+// finalizer.
+TEST_CASE(DartAPI_WeakPersistentHandleCallbackSelfDelete) {
+  int peer = 0;
+  {
+    Dart_EnterScope();
+    Dart_Handle obj = NewString("new string");
+    EXPECT_VALID(obj);
+    delete_on_finalization = Dart_NewWeakPersistentHandle(
+        obj, &peer, 0, DeleteWeakHandleOnFinalization);
+    EXPECT_VALID(AsHandle(delete_on_finalization));
+    EXPECT(peer == 0);
+    Dart_ExitScope();
+  }
+  {
+    TransitionNativeToVM transition(thread);
+    GCTestHelper::CollectOldSpace();
+    EXPECT(peer == 0);
+    GCTestHelper::CollectNewSpace();
+    EXPECT(peer == 42);
+    ASSERT(delete_on_finalization == nullptr);
+  }
+}
+
+// Checking that the finalizer gets run on shutdown, but that the delete
+// handle does not get invoked. (The handles have already been deleted by
+// releasing the LocalApiState.)
 VM_UNIT_TEST_CASE(DartAPI_WeakPersistentHandlesCallbackShutdown) {
   TestCase::CreateTestIsolate();
   Dart_EnterScope();
   Dart_Handle ref = Dart_True();
   int peer = 1234;
-  Dart_NewWeakPersistentHandle(ref, &peer, 0,
-                               WeakPersistentHandlePeerFinalizer);
+  delete_on_finalization = Dart_NewWeakPersistentHandle(
+      ref, &peer, 0, DontDeleteWeakHandleOnFinalization);
   Dart_ExitScope();
   Dart_ShutdownIsolate();
   EXPECT(peer == 42);
@@ -3668,6 +3686,8 @@
     GCTestHelper::CollectOldSpace();
     EXPECT(heap->ExternalInWords(Heap::kOld) == 0);
   }
+  Dart_DeleteWeakPersistentHandle(weak1);
+  Dart_DeleteWeakPersistentHandle(weak2);
 }
 
 TEST_CASE(DartAPI_FinalizableHandleExternalAllocationSize) {
@@ -3827,7 +3847,8 @@
   }
   // Large enough to trigger GC in old space. Not actually allocated.
   const intptr_t kHugeExternalSize = (kWordSize == 4) ? 513 * MB : 1025 * MB;
-  Dart_NewWeakPersistentHandle(live, NULL, kHugeExternalSize, NopCallback);
+  Dart_WeakPersistentHandle weak2 =
+      Dart_NewWeakPersistentHandle(live, NULL, kHugeExternalSize, NopCallback);
   {
     TransitionNativeToVM transition(thread);
     GCTestHelper::WaitForGCTasks();  // Finalize GC for accurate live size.
@@ -3836,6 +3857,8 @@
               isolate->heap()->ExternalInWords(Heap::kOld) * kWordSize);
   }
   Dart_ExitScope();
+  Dart_DeleteWeakPersistentHandle(weak);
+  Dart_DeleteWeakPersistentHandle(weak2);
 }
 
 TEST_CASE(DartAPI_FinalizableHandleExternalAllocationSizeOldspaceGC) {
@@ -3984,13 +4007,11 @@
 }
 
 struct ExampleResource {
-  Dart_WeakPersistentHandle self;
+  Dart_FinalizableHandle self;
   void* lots_of_memory;
 };
 
-void ExampleResourceFinalizer(void* isolate_peer,
-                              Dart_WeakPersistentHandle handle,
-                              void* peer) {
+void ExampleResourceFinalizer(void* isolate_peer, void* peer) {
   ExampleResource* resource = reinterpret_cast<ExampleResource*>(peer);
   free(resource->lots_of_memory);
   delete resource;
@@ -4001,8 +4022,8 @@
   intptr_t external_size = 10 * MB;
   ExampleResource* resource = new ExampleResource();
   resource->lots_of_memory = malloc(external_size);
-  resource->self = Dart_NewWeakPersistentHandle(
-      receiver, resource, external_size, ExampleResourceFinalizer);
+  resource->self = Dart_NewFinalizableHandle(receiver, resource, external_size,
+                                             ExampleResourceFinalizer);
   EXPECT_VALID(Dart_SetNativeInstanceField(
       receiver, 0, reinterpret_cast<intptr_t>(resource)));
   // Some pretend resource initialization.
@@ -4032,7 +4053,7 @@
   if (resource->lots_of_memory != nullptr) {
     free(resource->lots_of_memory);
     resource->lots_of_memory = nullptr;
-    Dart_UpdateExternalSize(resource->self, 0);
+    Dart_UpdateFinalizableExternalSize(resource->self, receiver, 0);
   }
 }
 
@@ -4072,13 +4093,12 @@
 static Dart_WeakPersistentHandle weak3 = NULL;
 
 static void ImplicitReferencesCallback(void* isolate_callback_data,
-                                       Dart_WeakPersistentHandle handle,
                                        void* peer) {
-  if (handle == weak1) {
+  if (peer == &weak1) {
     weak1 = NULL;
-  } else if (handle == weak2) {
+  } else if (peer == &weak2) {
     weak2 = NULL;
-  } else if (handle == weak3) {
+  } else if (peer == &weak3) {
     weak3 = NULL;
   }
 }
@@ -4103,19 +4123,19 @@
 
     weak1 =
         Dart_NewWeakPersistentHandle(AllocateOldString("weakly reachable 1"),
-                                     NULL, 0, ImplicitReferencesCallback);
+                                     &weak1, 0, ImplicitReferencesCallback);
     EXPECT(!Dart_IsNull(AsHandle(weak1)));
     EXPECT_VALID(AsHandle(weak1));
 
     weak2 =
         Dart_NewWeakPersistentHandle(AllocateOldString("weakly reachable 2"),
-                                     NULL, 0, ImplicitReferencesCallback);
+                                     &weak2, 0, ImplicitReferencesCallback);
     EXPECT(!Dart_IsNull(AsHandle(weak2)));
     EXPECT_VALID(AsHandle(weak2));
 
     weak3 =
         Dart_NewWeakPersistentHandle(AllocateOldString("weakly reachable 3"),
-                                     NULL, 0, ImplicitReferencesCallback);
+                                     &weak3, 0, ImplicitReferencesCallback);
     EXPECT(!Dart_IsNull(AsHandle(weak3)));
     EXPECT_VALID(AsHandle(weak3));
   }
@@ -4144,6 +4164,11 @@
     EXPECT(!Dart_IsNull(AsHandle(weak3)));
     Dart_ExitScope();
   }
+
+  Dart_DeleteWeakPersistentHandle(strong_weak);
+  Dart_DeleteWeakPersistentHandle(weak1);
+  Dart_DeleteWeakPersistentHandle(weak2);
+  Dart_DeleteWeakPersistentHandle(weak3);
 }
 
 TEST_CASE(DartAPI_ImplicitReferencesNewSpace) {
@@ -4166,19 +4191,19 @@
 
     weak1 =
         Dart_NewWeakPersistentHandle(AllocateNewString("weakly reachable 1"),
-                                     NULL, 0, ImplicitReferencesCallback);
+                                     &weak1, 0, ImplicitReferencesCallback);
     EXPECT(!Dart_IsNull(AsHandle(weak1)));
     EXPECT_VALID(AsHandle(weak1));
 
     weak2 =
         Dart_NewWeakPersistentHandle(AllocateNewString("weakly reachable 2"),
-                                     NULL, 0, ImplicitReferencesCallback);
+                                     &weak2, 0, ImplicitReferencesCallback);
     EXPECT(!Dart_IsNull(AsHandle(weak2)));
     EXPECT_VALID(AsHandle(weak2));
 
     weak3 =
         Dart_NewWeakPersistentHandle(AllocateNewString("weakly reachable 3"),
-                                     NULL, 0, ImplicitReferencesCallback);
+                                     &weak3, 0, ImplicitReferencesCallback);
     EXPECT(!Dart_IsNull(AsHandle(weak3)));
     EXPECT_VALID(AsHandle(weak3));
   }
@@ -4206,6 +4231,11 @@
     EXPECT(!Dart_IsNull(AsHandle(weak3)));
     Dart_ExitScope();
   }
+
+  Dart_DeleteWeakPersistentHandle(strong_weak);
+  Dart_DeleteWeakPersistentHandle(weak1);
+  Dart_DeleteWeakPersistentHandle(weak2);
+  Dart_DeleteWeakPersistentHandle(weak3);
 }
 
 // Unit test for creating multiple scopes and local handles within them.
@@ -5524,9 +5554,6 @@
       "  factory MyClass.multiply(value) {\n"
       "    return new MyClass.named(value * 100);\n"
       "  }\n"
-      "  factory MyClass.nullo() {\n"
-      "    return null;\n"
-      "  }\n"
       "  var foo;\n"
       "}\n"
       "\n"
@@ -5687,11 +5714,6 @@
   EXPECT_VALID(Dart_IntegerToInt64(foo, &int_value));
   EXPECT_EQ(1100, int_value);
 
-  // Invoke a factory constructor which returns null.
-  result = Dart_New(type, NewString("nullo"), 0, NULL);
-  EXPECT_VALID(result);
-  EXPECT(Dart_IsNull(result));
-
   // Pass an error class object.  Error is passed through.
   result = Dart_New(Dart_NewApiError("myerror"), NewString("named"), 1, args);
   EXPECT_ERROR(result, "myerror");
@@ -5967,6 +5989,13 @@
 
   // Null is always valid as the fill argument if we're creating an empty list.
   EXPECT_VALID(Dart_NewListOfTypeFilled(zxhandle_type, Dart_Null(), 0));
+
+  // Test creation of a non nullable list of strings.
+  Dart_Handle corelib = Dart_LookupLibrary(NewString("dart:core"));
+  EXPECT_VALID(corelib);
+  Dart_Handle string_type =
+      Dart_GetNonNullableType(corelib, NewString("String"), 0, NULL);
+  EXPECT_VALID(Dart_NewListOfTypeFilled(string_type, Dart_EmptyString(), 2));
 }
 
 static Dart_Handle PrivateLibName(Dart_Handle lib, const char* str) {
@@ -7380,9 +7409,7 @@
   EXPECT(!success);
 }
 
-static void UnreachableFinalizer(void* isolate_callback_data,
-                                 Dart_WeakPersistentHandle handle,
-                                 void* peer) {
+static void UnreachableFinalizer(void* isolate_callback_data, void* peer) {
   UNREACHABLE();
 }
 
@@ -8626,7 +8653,7 @@
 
 TEST_CASE(DartAPI_ExternalStringIndexOf) {
   const char* kScriptChars =
-      "main(String pattern) {\n"
+      "testMain(String pattern) {\n"
       "  var str = 'Hello World';\n"
       "  return str.indexOf(pattern);\n"
       "}\n";
@@ -8641,7 +8668,7 @@
 
   Dart_Handle dart_args[1];
   dart_args[0] = ext8;
-  Dart_Handle result = Dart_Invoke(lib, NewString("main"), 1, dart_args);
+  Dart_Handle result = Dart_Invoke(lib, NewString("testMain"), 1, dart_args);
   int64_t value = 0;
   result = Dart_IntegerToInt64(result, &value);
   EXPECT_VALID(result);
@@ -8971,10 +8998,7 @@
 
   Dart_Handle bytes = Dart_NewExternalTypedDataWithFinalizer(
       Dart_TypedData_kUint8, response_json, response_json_length, response_json,
-      response_json_length,
-      [](void* ignored, Dart_WeakPersistentHandle handle, void* peer) {
-        free(peer);
-      });
+      response_json_length, [](void* ignored, void* peer) { free(peer); });
   EXPECT_VALID(bytes);
 
   // We don't have a C++ JSON decoder so we'll invoke dart to validate the
diff --git a/runtime/vm/dart_api_message.cc b/runtime/vm/dart_api_message.cc
index bc83266..d371645 100644
--- a/runtime/vm/dart_api_message.cc
+++ b/runtime/vm/dart_api_message.cc
@@ -1124,7 +1124,7 @@
       }
       uint8_t* data = object->value.as_external_typed_data.data;
       void* peer = object->value.as_external_typed_data.peer;
-      Dart_WeakPersistentHandleFinalizer callback =
+      Dart_HandleFinalizer callback =
           object->value.as_external_typed_data.callback;
       if (callback == NULL) {
         return false;
diff --git a/runtime/vm/dart_api_state.h b/runtime/vm/dart_api_state.h
index 7b52e98..b9ba995 100644
--- a/runtime/vm/dart_api_state.h
+++ b/runtime/vm/dart_api_state.h
@@ -190,23 +190,6 @@
 // dart API.
 class FinalizablePersistentHandle {
  public:
-  // TODO(http://dartbug.com/42312): Delete this on migrating signature
-  // Dart_NewWeakPersistentHandle to Dart_HandleFinalizer.
-  enum class CallbackSignature {
-    // Uses a Dart_WeakPersistentHandleFinalizer.
-    kWeakPersistentHandleFinalizer = 0,
-    // Uses a Dart_HandleFinalizer.
-    kHandleFinalizer = 1,
-  };
-
-  static FinalizablePersistentHandle* New(
-      Isolate* isolate,
-      const Object& object,
-      void* peer,
-      Dart_WeakPersistentHandleFinalizer callback,
-      intptr_t external_size,
-      bool auto_delete);
-
   static FinalizablePersistentHandle* New(Isolate* isolate,
                                           const Object& object,
                                           void* peer,
@@ -221,18 +204,7 @@
     return OFFSET_OF(FinalizablePersistentHandle, raw_);
   }
   void* peer() const { return peer_; }
-  Dart_WeakPersistentHandleFinalizer CallbackWeakFinalizer() const {
-    ASSERT(callback_signature_ ==
-           CallbackSignature::kWeakPersistentHandleFinalizer);
-    return callback_.weak_persistent;
-  }
-  Dart_HandleFinalizer callback() const {
-    ASSERT(callback_signature_ == CallbackSignature::kHandleFinalizer);
-    return callback_.finalizable;
-  }
-  uword callback_address() const {
-    return reinterpret_cast<uword>(callback_.finalizable);
-  }
+  Dart_HandleFinalizer callback() const { return callback_; }
   Dart_WeakPersistentHandle ApiWeakPersistentHandle() {
     return reinterpret_cast<Dart_WeakPersistentHandle>(this);
   }
@@ -242,6 +214,10 @@
 
   bool auto_delete() const { return auto_delete_; }
 
+  bool IsFinalizedNotFreed() const {
+    return raw_ == static_cast<ObjectPtr>(reinterpret_cast<uword>(this));
+  }
+
   intptr_t external_size() const {
     return ExternalSizeInWordsBits::decode(external_data_) * kWordSize;
   }
@@ -298,15 +274,6 @@
     kExternalSizeBitsSize = (kBitsPerWord - 1),
   };
 
-  union HandleFinalizer {
-    Dart_HandleFinalizer finalizable;
-    Dart_WeakPersistentHandleFinalizer weak_persistent;
-    HandleFinalizer(Dart_HandleFinalizer finalizer) : finalizable(finalizer) {}
-    HandleFinalizer(Dart_WeakPersistentHandleFinalizer finalizer)
-        : weak_persistent(finalizer) {}
-    HandleFinalizer() : finalizable(nullptr) {}
-  };
-
   // This part of external_data_ is the number of externally allocated bytes.
   class ExternalSizeInWordsBits : public BitField<uword,
                                                   intptr_t,
@@ -320,10 +287,7 @@
   friend class FinalizablePersistentHandles;
 
   FinalizablePersistentHandle()
-      : raw_(nullptr),
-        peer_(NULL),
-        external_data_(0),
-        callback_(HandleFinalizer()) {}
+      : raw_(nullptr), peer_(NULL), external_data_(0), callback_(NULL) {}
   ~FinalizablePersistentHandle() {}
 
   static void Finalize(IsolateGroup* isolate_group,
@@ -340,6 +304,11 @@
     ASSERT(!raw_->IsHeapObject());
   }
 
+  void SetFinalizedNotFreed() {
+    // `handle->raw_ != Object::null()` or the GC will finalize again.
+    SetNext(this);
+  }
+
   void FreeHandle(FinalizablePersistentHandle* free_list) {
     Clear();
     SetNext(free_list);
@@ -347,11 +316,10 @@
 
   void Clear() {
     raw_ = Object::null();
-    peer_ = NULL;
+    peer_ = nullptr;
     external_data_ = 0;
-    callback_ = HandleFinalizer();
+    callback_ = nullptr;
     auto_delete_ = false;
-    callback_signature_ = CallbackSignature::kWeakPersistentHandleFinalizer;
   }
 
   void set_raw(ObjectPtr raw) { raw_ = raw; }
@@ -360,11 +328,7 @@
 
   void set_peer(void* peer) { peer_ = peer; }
 
-  void set_callback_signature(CallbackSignature callback_signature) {
-    callback_signature_ = callback_signature;
-  }
-
-  void set_callback(HandleFinalizer callback) { callback_ = callback; }
+  void set_callback(Dart_HandleFinalizer callback) { callback_ = callback; }
 
   void set_auto_delete(bool auto_delete) { auto_delete_ = auto_delete; }
 
@@ -396,9 +360,8 @@
   ObjectPtr raw_;
   void* peer_;
   uword external_data_;
-  HandleFinalizer callback_;
+  Dart_HandleFinalizer callback_;
   bool auto_delete_;
-  CallbackSignature callback_signature_;
 
   DISALLOW_ALLOCATION();  // Allocated through AllocateHandle methods.
   DISALLOW_COPY_AND_ASSIGN(FinalizablePersistentHandle);
@@ -608,6 +571,11 @@
     return handle;
   }
 
+  void ClearHandle(FinalizablePersistentHandle* handle) {
+    handle->Clear();
+    handle->SetFinalizedNotFreed();
+  }
+
   void FreeHandle(FinalizablePersistentHandle* handle) {
     handle->FreeHandle(free_list());
     set_free_list(handle);
@@ -805,7 +773,10 @@
     MutexLocker ml(&mutex_);
     return weak_persistent_handles_.AllocateHandle();
   }
-
+  void ClearWeakPersistentHandle(FinalizablePersistentHandle* weak_ref) {
+    MutexLocker ml(&mutex_);
+    weak_persistent_handles_.ClearHandle(weak_ref);
+  }
   void FreeWeakPersistentHandle(FinalizablePersistentHandle* weak_ref) {
     MutexLocker ml(&mutex_);
     weak_persistent_handles_.FreeHandle(weak_ref);
@@ -896,28 +867,6 @@
     Isolate* isolate,
     const Object& object,
     void* peer,
-    Dart_WeakPersistentHandleFinalizer callback,
-    intptr_t external_size,
-    bool auto_delete) {
-  ApiState* state = isolate->group()->api_state();
-  ASSERT(state != NULL);
-  ASSERT(callback != NULL);
-  FinalizablePersistentHandle* ref = state->AllocateWeakPersistentHandle();
-  ref->set_raw(object);
-  ref->set_peer(peer);
-  ref->set_callback_signature(
-      CallbackSignature::kWeakPersistentHandleFinalizer);
-  ref->set_callback(HandleFinalizer(callback));
-  ref->set_auto_delete(auto_delete);
-  // This may trigger GC, so it must be called last.
-  ref->SetExternalSize(external_size, isolate->group());
-  return ref;
-}
-
-inline FinalizablePersistentHandle* FinalizablePersistentHandle::New(
-    Isolate* isolate,
-    const Object& object,
-    void* peer,
     Dart_HandleFinalizer callback,
     intptr_t external_size,
     bool auto_delete) {
@@ -926,8 +875,7 @@
   FinalizablePersistentHandle* ref = state->AllocateWeakPersistentHandle();
   ref->set_raw(object);
   ref->set_peer(peer);
-  ref->set_callback_signature(CallbackSignature::kHandleFinalizer);
-  ref->set_callback(HandleFinalizer(callback));
+  ref->set_callback(callback);
   ref->set_auto_delete(auto_delete);
   // This may trigger GC, so it must be called last.
   ref->SetExternalSize(external_size, isolate->group());
diff --git a/runtime/vm/dart_entry.cc b/runtime/vm/dart_entry.cc
index 0cb0bd6..63db37e 100644
--- a/runtime/vm/dart_entry.cc
+++ b/runtime/vm/dart_entry.cc
@@ -9,7 +9,6 @@
 #include "vm/debugger.h"
 #include "vm/dispatch_table.h"
 #include "vm/heap/safepoint.h"
-#include "vm/interpreter.h"
 #include "vm/object_store.h"
 #include "vm/resolver.h"
 #include "vm/runtime_entry.h"
@@ -19,13 +18,11 @@
 #include "vm/zone_text_buffer.h"
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
-#include "vm/compiler/frontend/bytecode_reader.h"
 #include "vm/compiler/jit/compiler.h"
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
 
 namespace dart {
 
-DECLARE_FLAG(bool, enable_interpreter);
 DECLARE_FLAG(bool, precompiled_mode);
 
 // A cache of VM heap allocated arguments descriptors.
@@ -53,7 +50,6 @@
     thread->SetStackLimit(Simulator::Current()->overflow_stack_limit());
 #else
     thread->SetStackLimit(OSThread::Current()->overflow_stack_limit());
-    // TODO(regis): For now, the interpreter is using its own stack limit.
 #endif
 
 #if defined(USING_SAFE_STACK)
@@ -135,27 +131,6 @@
   ScopedIsolateStackLimits stack_limit(thread, current_sp);
 #if !defined(DART_PRECOMPILED_RUNTIME)
   if (!function.HasCode()) {
-    if (FLAG_enable_interpreter && function.IsBytecodeAllowed(zone)) {
-      if (!function.HasBytecode()) {
-        ErrorPtr error =
-            kernel::BytecodeReader::ReadFunctionBytecode(thread, function);
-        if (error != Error::null()) {
-          return error;
-        }
-      }
-
-      // If we have bytecode but no native code then invoke the interpreter.
-      if (function.HasBytecode() && (FLAG_compilation_counter_threshold != 0)) {
-        ASSERT(thread->no_callback_scope_depth() == 0);
-        SuspendLongJumpScope suspend_long_jump_scope(thread);
-        TransitionToGenerated transition(thread);
-        return Interpreter::Current()->Call(function, arguments_descriptor,
-                                            arguments, thread);
-      }
-
-      // Fall back to compilation.
-    }
-
     const Object& result =
         Object::Handle(zone, Compiler::CompileFunction(thread, function));
     if (result.IsError()) {
@@ -207,9 +182,9 @@
 #endif
 }
 
-ObjectPtr DartEntry::ResolveCallable(const Array& arguments,
+ObjectPtr DartEntry::ResolveCallable(Thread* thread,
+                                     const Array& arguments,
                                      const Array& arguments_descriptor) {
-  auto thread = Thread::Current();
   auto isolate = thread->isolate();
   auto zone = thread->zone();
 
@@ -277,80 +252,94 @@
   return Function::null();
 }
 
-ObjectPtr DartEntry::InvokeCallable(const Function& callable_function,
+ObjectPtr DartEntry::InvokeCallable(Thread* thread,
+                                    const Function& callable_function,
                                     const Array& arguments,
                                     const Array& arguments_descriptor) {
-  if (!callable_function.IsNull()) {
-    return InvokeFunction(callable_function, arguments, arguments_descriptor);
+  auto const zone = thread->zone();
+  const ArgumentsDescriptor args_desc(arguments_descriptor);
+  if (callable_function.IsNull()) {
+    // No compatible callable was found, so invoke noSuchMethod.
+    auto& instance =
+        Instance::CheckedHandle(zone, arguments.At(args_desc.FirstArgIndex()));
+    // For closures, use the name of the closure, not 'call'.
+    const String* target_name = &Symbols::Call();
+    if (instance.IsClosure()) {
+      auto const& function =
+          Function::Handle(zone, Closure::Cast(instance).function());
+      target_name = &String::Handle(function.QualifiedUserVisibleName());
+    }
+    return InvokeNoSuchMethod(thread, instance, *target_name, arguments,
+                              arguments_descriptor);
   }
 
-  // No compatible callable was found, so invoke noSuchMethod.
-  Thread* thread = Thread::Current();
-  Zone* zone = thread->zone();
-  const ArgumentsDescriptor args_desc(arguments_descriptor);
-  auto& instance =
-      Instance::CheckedHandle(zone, arguments.At(args_desc.FirstArgIndex()));
-  auto& target_name = String::Handle(zone, Symbols::Call().raw());
-  if (instance.IsClosure()) {
-    const auto& closure = Closure::Cast(instance);
-    // For closures, use the name of the closure, not 'call'.
-    const auto& function = Function::Handle(zone, closure.function());
-    target_name = function.QualifiedUserVisibleName();
+  if (!callable_function.CanReceiveDynamicInvocation()) {
+    const auto& result = Object::Handle(
+        zone, callable_function.DoArgumentTypesMatch(arguments, args_desc));
+    if (result.IsError()) {
+      Exceptions::PropagateError(Error::Cast(result));
+    }
   }
-  return InvokeNoSuchMethod(instance, target_name, arguments,
-                            arguments_descriptor);
+
+  return InvokeFunction(callable_function, arguments, arguments_descriptor);
 }
 
-ObjectPtr DartEntry::InvokeClosure(const Array& arguments) {
+ObjectPtr DartEntry::InvokeClosure(Thread* thread, const Array& arguments) {
+  auto const zone = thread->zone();
   const int kTypeArgsLen = 0;  // No support to pass type args to generic func.
 
   // Closures always have boxed parameters
   const Array& arguments_descriptor = Array::Handle(
-      ArgumentsDescriptor::NewBoxed(kTypeArgsLen, arguments.Length()));
-  return InvokeClosure(arguments, arguments_descriptor);
+      zone, ArgumentsDescriptor::NewBoxed(kTypeArgsLen, arguments.Length()));
+  return InvokeClosure(thread, arguments, arguments_descriptor);
 }
 
-ObjectPtr DartEntry::InvokeClosure(const Array& arguments,
+ObjectPtr DartEntry::InvokeClosure(Thread* thread,
+                                   const Array& arguments,
                                    const Array& arguments_descriptor) {
-  const Object& resolved_result =
-      Object::Handle(ResolveCallable(arguments, arguments_descriptor));
+  auto const zone = thread->zone();
+  const Object& resolved_result = Object::Handle(
+      zone, ResolveCallable(thread, arguments, arguments_descriptor));
   if (resolved_result.IsError()) {
     return resolved_result.raw();
   }
 
   const auto& function =
-      Function::Handle(Function::RawCast(resolved_result.raw()));
-  return InvokeCallable(function, arguments, arguments_descriptor);
+      Function::Handle(zone, Function::RawCast(resolved_result.raw()));
+  return InvokeCallable(thread, function, arguments, arguments_descriptor);
 }
 
-ObjectPtr DartEntry::InvokeNoSuchMethod(const Instance& receiver,
+ObjectPtr DartEntry::InvokeNoSuchMethod(Thread* thread,
+                                        const Instance& receiver,
                                         const String& target_name,
                                         const Array& arguments,
                                         const Array& arguments_descriptor) {
+  auto const zone = thread->zone();
   const ArgumentsDescriptor args_desc(arguments_descriptor);
   ASSERT(receiver.raw() == arguments.At(args_desc.FirstArgIndex()));
   // Allocate an Invocation object.
-  const Library& core_lib = Library::Handle(Library::CoreLibrary());
+  const Library& core_lib = Library::Handle(zone, Library::CoreLibrary());
 
-  Class& invocation_mirror_class = Class::Handle(core_lib.LookupClass(
-      String::Handle(core_lib.PrivateName(Symbols::InvocationMirror()))));
+  Class& invocation_mirror_class = Class::Handle(
+      zone, core_lib.LookupClass(String::Handle(
+                zone, core_lib.PrivateName(Symbols::InvocationMirror()))));
   ASSERT(!invocation_mirror_class.IsNull());
-  Thread* thread = Thread::Current();
   const auto& error = invocation_mirror_class.EnsureIsFinalized(thread);
   ASSERT(error == Error::null());
-  const String& function_name =
-      String::Handle(core_lib.PrivateName(Symbols::AllocateInvocationMirror()));
+  const String& function_name = String::Handle(
+      zone, core_lib.PrivateName(Symbols::AllocateInvocationMirror()));
   const Function& allocation_function = Function::Handle(
-      invocation_mirror_class.LookupStaticFunction(function_name));
+      zone, invocation_mirror_class.LookupStaticFunction(function_name));
   ASSERT(!allocation_function.IsNull());
   const int kNumAllocationArgs = 4;
-  const Array& allocation_args = Array::Handle(Array::New(kNumAllocationArgs));
+  const Array& allocation_args =
+      Array::Handle(zone, Array::New(kNumAllocationArgs));
   allocation_args.SetAt(0, target_name);
   allocation_args.SetAt(1, arguments_descriptor);
   allocation_args.SetAt(2, arguments);
   allocation_args.SetAt(3, Bool::False());  // Not a super invocation.
-  const Object& invocation_mirror =
-      Object::Handle(InvokeFunction(allocation_function, allocation_args));
+  const Object& invocation_mirror = Object::Handle(
+      zone, InvokeFunction(allocation_function, allocation_args));
   if (invocation_mirror.IsError()) {
     Exceptions::PropagateError(Error::Cast(invocation_mirror));
     UNREACHABLE();
@@ -359,20 +348,20 @@
   // Now use the invocation mirror object and invoke NoSuchMethod.
   const int kTypeArgsLen = 0;
   const int kNumArguments = 2;
-  ArgumentsDescriptor nsm_args_desc(Array::Handle(
-      ArgumentsDescriptor::NewBoxed(kTypeArgsLen, kNumArguments)));
-  Function& function = Function::Handle(Resolver::ResolveDynamic(
-      receiver, Symbols::NoSuchMethod(), nsm_args_desc));
+  const ArgumentsDescriptor nsm_args_desc(Array::Handle(
+      zone, ArgumentsDescriptor::NewBoxed(kTypeArgsLen, kNumArguments)));
+  Function& function = Function::Handle(
+      zone, Resolver::ResolveDynamic(receiver, Symbols::NoSuchMethod(),
+                                     nsm_args_desc));
   if (function.IsNull()) {
     ASSERT(!FLAG_lazy_dispatchers);
     // If noSuchMethod(invocation) is not found, call Object::noSuchMethod.
     function = Resolver::ResolveDynamicForReceiverClass(
-        Class::Handle(thread->zone(),
-                      thread->isolate()->object_store()->object_class()),
+        Class::Handle(zone, thread->isolate()->object_store()->object_class()),
         Symbols::NoSuchMethod(), nsm_args_desc);
   }
   ASSERT(!function.IsNull());
-  const Array& args = Array::Handle(Array::New(kNumArguments));
+  const Array& args = Array::Handle(zone, Array::New(kNumArguments));
   args.SetAt(0, receiver);
   args.SetAt(1, invocation_mirror);
   return InvokeFunction(function, args);
@@ -736,6 +725,31 @@
   return result.raw();
 }
 
+ObjectPtr DartLibraryCalls::LookupOpenPorts() {
+  Thread* thread = Thread::Current();
+  Zone* zone = thread->zone();
+  Function& function = Function::Handle(
+      zone, thread->isolate()->object_store()->lookup_open_ports());
+  const int kTypeArgsLen = 0;
+  const int kNumArguments = 0;
+  if (function.IsNull()) {
+    Library& isolate_lib = Library::Handle(zone, Library::IsolateLibrary());
+    ASSERT(!isolate_lib.IsNull());
+    const String& class_name = String::Handle(
+        zone, isolate_lib.PrivateName(Symbols::_RawReceivePortImpl()));
+    const String& function_name = String::Handle(
+        zone, isolate_lib.PrivateName(Symbols::_lookupOpenPorts()));
+    function = Resolver::ResolveStatic(isolate_lib, class_name, function_name,
+                                       kTypeArgsLen, kNumArguments,
+                                       Object::empty_array());
+    ASSERT(!function.IsNull());
+    thread->isolate()->object_store()->set_lookup_open_ports(function);
+  }
+  const Object& result = Object::Handle(
+      zone, DartEntry::InvokeFunction(function, Object::empty_array()));
+  return result.raw();
+}
+
 ObjectPtr DartLibraryCalls::HandleMessage(const Object& handler,
                                           const Instance& message) {
   Thread* thread = Thread::Current();
diff --git a/runtime/vm/dart_entry.h b/runtime/vm/dart_entry.h
index 01f4d1a..c85f683 100644
--- a/runtime/vm/dart_entry.h
+++ b/runtime/vm/dart_entry.h
@@ -174,8 +174,6 @@
   friend class SnapshotWriter;
   friend class Serializer;
   friend class Deserializer;
-  friend class Interpreter;
-  friend class InterpreterHelpers;
   friend class Simulator;
   friend class SimulatorHelpers;
   DISALLOW_COPY_AND_ASSIGN(ArgumentsDescriptor);
@@ -208,40 +206,55 @@
       const Array& arguments_descriptor,
       uword current_sp = OSThread::GetCurrentStackPointer());
 
-  // Resolves the first argument to a callable compatible with the arguments.
+  // Invokes the first argument in the provided arguments array as a callable
+  // object, performing any needed dynamic checks if the callable cannot receive
+  // dynamic invocation.
+  //
+  // On success, returns a RawInstance.  On failure, a RawError.
+  //
+  // Used when an ArgumentsDescriptor is not required, that is, when there
+  // are no type arguments or named arguments.
+  static ObjectPtr InvokeClosure(Thread* thread, const Array& arguments);
+
+  // Invokes the first argument in the provided arguments array as a callable
+  // object, performing any needed dynamic checks if the callable cannot receive
+  // dynamic invocation.
+  //
+  // On success, returns a RawInstance.  On failure, a RawError.
+  static ObjectPtr InvokeClosure(Thread* thread,
+                                 const Array& arguments,
+                                 const Array& arguments_descriptor);
+
+  // Invokes the noSuchMethod instance function on the receiver.
+  // On success, returns a RawInstance.  On failure, a RawError.
+  static ObjectPtr InvokeNoSuchMethod(Thread* thread,
+                                      const Instance& receiver,
+                                      const String& target_name,
+                                      const Array& arguments,
+                                      const Array& arguments_descriptor);
+
+ private:
+  // Resolves the first argument in the provided arguments array to a callable
+  // compatible with the arguments. Helper method used within InvokeClosure.
   //
   // If no errors occur, the first argument is changed to be either the resolved
   // callable or, if Function::null() is returned, an appropriate target for
   // invoking noSuchMethod.
   //
   // On success, returns a RawFunction. On failure, a RawError.
-  static ObjectPtr ResolveCallable(const Array& arguments,
+  static ObjectPtr ResolveCallable(Thread* thread,
+                                   const Array& arguments,
                                    const Array& arguments_descriptor);
 
-  // Invokes the function returned by ResolveCallable.
+  // Invokes a function returned by ResolveCallable, performing any dynamic
+  // checks needed if the function cannot receive dynamic invocation. Helper
+  // method used within InvokeClosure.
   //
   // On success, returns a RawInstance. On failure, a RawError.
-  static ObjectPtr InvokeCallable(const Function& callable_function,
+  static ObjectPtr InvokeCallable(Thread* thread,
+                                  const Function& callable_function,
                                   const Array& arguments,
                                   const Array& arguments_descriptor);
-
-  // Invokes the closure object given as the first argument.
-  // On success, returns a RawInstance.  On failure, a RawError.
-  // This is used when there is no type argument vector and
-  // no named arguments in the call.
-  static ObjectPtr InvokeClosure(const Array& arguments);
-
-  // Invokes the closure object given as the first argument.
-  // On success, returns a RawInstance.  On failure, a RawError.
-  static ObjectPtr InvokeClosure(const Array& arguments,
-                                 const Array& arguments_descriptor);
-
-  // Invokes the noSuchMethod instance function on the receiver.
-  // On success, returns a RawInstance.  On failure, a RawError.
-  static ObjectPtr InvokeNoSuchMethod(const Instance& receiver,
-                                      const String& target_name,
-                                      const Array& arguments,
-                                      const Array& arguments_descriptor);
 };
 
 // Utility functions to call from VM into Dart bootstrap libraries.
@@ -269,6 +282,9 @@
   // Returns the handler if one has been registered for this port id.
   static ObjectPtr LookupHandler(Dart_Port port_id);
 
+  // Returns a list of open ReceivePorts.
+  static ObjectPtr LookupOpenPorts();
+
   // Returns null on success, a RawError on failure.
   static ObjectPtr HandleMessage(const Object& handler,
                                  const Instance& dart_message);
diff --git a/runtime/vm/datastream_test.cc b/runtime/vm/datastream_test.cc
new file mode 100644
index 0000000..0b9ba6c
--- /dev/null
+++ b/runtime/vm/datastream_test.cc
@@ -0,0 +1,185 @@
+// Copyright (c) 2020, 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.
+
+#include "vm/datastream.h"
+
+#include "platform/assert.h"
+#include "vm/unit_test.h"
+
+namespace dart {
+
+// As a baseline, testing encodings of all numbers with bit size <= 16, as
+// that's both a reasonable amount of numbers to iterate over and that way we
+// test all 1-byte, all 2-byte, and some 3-byte encodings.
+static constexpr intptr_t kUnsignedEnd = kMaxUint16;
+static constexpr intptr_t kSignedStart = kMinInt16;
+static constexpr intptr_t kSignedEnd = kMaxInt16;
+
+// Testing some numbers with first, second, and/or third MSBs set.
+#define DEFINE_LARGE_CONSTANTS(T)                                              \
+  using Unsigned = typename std::make_unsigned<T>::type;                       \
+  constexpr T all_ones = static_cast<T>(-1); /* 111... */                      \
+  constexpr T min =                                                            \
+      static_cast<T>(static_cast<Unsigned>(1)                                  \
+                     << (kBitsPerByte * sizeof(T) - 1)); /* 100... */          \
+  constexpr T max =                                                            \
+      static_cast<T>(static_cast<Unsigned>(min) - 1); /* 011... */             \
+  constexpr T half_min = min / 2;                     /* 110... */             \
+  constexpr T half_max = max / 2;                     /* 001... */
+
+TEST_CASE(BaseWriteStream_Write) {
+  MallocWriteStream writer(1 * KB);
+  for (intptr_t i = kSignedStart; i < kSignedEnd; i++) {
+    writer.Write(i);
+  }
+  DEFINE_LARGE_CONSTANTS(intptr_t);
+  writer.Write(all_ones);
+  writer.Write(min);
+  writer.Write(max);
+  writer.Write(half_min);
+  writer.Write(half_max);
+  ReadStream reader(writer.buffer(), writer.bytes_written());
+  for (intptr_t i = kSignedStart; i < kSignedEnd; i++) {
+    const intptr_t r = reader.Read<intptr_t>();
+    EXPECT_EQ(i, r);
+  }
+  const intptr_t read_all_ones = reader.Read<intptr_t>();
+  EXPECT_EQ(all_ones, read_all_ones);
+  const intptr_t read_min = reader.Read<intptr_t>();
+  EXPECT_EQ(min, read_min);
+  const intptr_t read_max = reader.Read<intptr_t>();
+  EXPECT_EQ(max, read_max);
+  const intptr_t read_half_min = reader.Read<intptr_t>();
+  EXPECT_EQ(half_min, read_half_min);
+  const intptr_t read_half_max = reader.Read<intptr_t>();
+  EXPECT_EQ(half_max, read_half_max);
+}
+
+TEST_CASE(BaseWriteStream_WriteUnsigned) {
+  MallocWriteStream writer(1 * KB);
+  for (uintptr_t i = 0; i < kUnsignedEnd; i++) {
+    writer.WriteUnsigned(i);
+  }
+  DEFINE_LARGE_CONSTANTS(uintptr_t);
+  writer.WriteUnsigned(all_ones);
+  writer.WriteUnsigned(min);
+  writer.WriteUnsigned(max);
+  writer.WriteUnsigned(half_min);
+  writer.WriteUnsigned(half_max);
+  ReadStream reader(writer.buffer(), writer.bytes_written());
+  for (uintptr_t i = 0; i < kUnsignedEnd; i++) {
+    const uintptr_t r = reader.ReadUnsigned<uintptr_t>();
+    EXPECT_EQ(i, r);
+  }
+  const uintptr_t read_all_ones = reader.ReadUnsigned<uintptr_t>();
+  EXPECT_EQ(all_ones, read_all_ones);
+  const uintptr_t read_min = reader.ReadUnsigned<uintptr_t>();
+  EXPECT_EQ(min, read_min);
+  const uintptr_t read_max = reader.ReadUnsigned<uintptr_t>();
+  EXPECT_EQ(max, read_max);
+  const uintptr_t read_half_min = reader.ReadUnsigned<uintptr_t>();
+  EXPECT_EQ(half_min, read_half_min);
+  const uintptr_t read_half_max = reader.ReadUnsigned<uintptr_t>();
+  EXPECT_EQ(half_max, read_half_max);
+}
+
+template <typename T>
+void TestRaw() {
+  MallocWriteStream writer(1 * KB);
+  for (T i = kSignedStart; i < kSignedEnd; i++) {
+    writer.Write(i);
+  }
+  DEFINE_LARGE_CONSTANTS(T);
+  writer.Write(all_ones);
+  writer.Write(min);
+  writer.Write(max);
+  writer.Write(half_min);
+  writer.Write(half_max);
+  ReadStream reader(writer.buffer(), writer.bytes_written());
+  using Raw = ReadStream::Raw<sizeof(T), T>;
+  for (T i = kSignedStart; i < kSignedEnd; i++) {
+    const T r = Raw::Read(&reader);
+    EXPECT_EQ(i, r);
+  }
+  const T read_all_ones = Raw::Read(&reader);
+  EXPECT_EQ(all_ones, read_all_ones);
+  const T read_min = Raw::Read(&reader);
+  EXPECT_EQ(min, read_min);
+  const T read_max = Raw::Read(&reader);
+  EXPECT_EQ(max, read_max);
+  const T read_half_min = Raw::Read(&reader);
+  EXPECT_EQ(half_min, read_half_min);
+  const T read_half_max = Raw::Read(&reader);
+  EXPECT_EQ(half_max, read_half_max);
+}
+
+TEST_CASE(ReadStream_Read16) {
+  TestRaw<int16_t>();
+}
+
+TEST_CASE(ReadStream_Read32) {
+  TestRaw<int32_t>();
+}
+
+TEST_CASE(ReadStream_Read64) {
+  TestRaw<int64_t>();
+}
+
+TEST_CASE(BaseWriteStream_WriteLEB128) {
+  MallocWriteStream writer(1 * KB);
+  for (uintptr_t i = 0; i < kUnsignedEnd; i++) {
+    writer.WriteLEB128(i);
+  }
+  DEFINE_LARGE_CONSTANTS(uintptr_t);
+  writer.WriteLEB128(all_ones);
+  writer.WriteLEB128(min);
+  writer.WriteLEB128(max);
+  writer.WriteLEB128(half_min);
+  writer.WriteLEB128(half_max);
+  ReadStream reader(writer.buffer(), writer.bytes_written());
+  for (uintptr_t i = 0; i < kUnsignedEnd; i++) {
+    const uintptr_t r = reader.ReadLEB128();
+    EXPECT_EQ(i, r);
+  }
+  const uintptr_t read_all_ones = reader.ReadLEB128();
+  EXPECT_EQ(all_ones, read_all_ones);
+  const uintptr_t read_min = reader.ReadLEB128();
+  EXPECT_EQ(min, read_min);
+  const uintptr_t read_max = reader.ReadLEB128();
+  EXPECT_EQ(max, read_max);
+  const uintptr_t read_half_min = reader.ReadLEB128();
+  EXPECT_EQ(half_min, read_half_min);
+  const uintptr_t read_half_max = reader.ReadLEB128();
+  EXPECT_EQ(half_max, read_half_max);
+}
+
+TEST_CASE(BaseWriteStream_WriteSLEB128) {
+  MallocWriteStream writer(1 * KB);
+  for (intptr_t i = kSignedStart; i < kSignedEnd; i++) {
+    writer.WriteSLEB128(i);
+  }
+  DEFINE_LARGE_CONSTANTS(intptr_t);
+  writer.WriteSLEB128(all_ones);
+  writer.WriteSLEB128(min);
+  writer.WriteSLEB128(max);
+  writer.WriteSLEB128(half_min);
+  writer.WriteSLEB128(half_max);
+  ReadStream reader(writer.buffer(), writer.bytes_written());
+  for (intptr_t i = kSignedStart; i < kSignedEnd; i++) {
+    const intptr_t r = reader.ReadSLEB128();
+    EXPECT_EQ(i, r);
+  }
+  const intptr_t read_all_ones = reader.ReadSLEB128();
+  EXPECT_EQ(all_ones, read_all_ones);
+  const intptr_t read_min = reader.ReadSLEB128();
+  EXPECT_EQ(min, read_min);
+  const intptr_t read_max = reader.ReadSLEB128();
+  EXPECT_EQ(max, read_max);
+  const intptr_t read_half_min = reader.ReadSLEB128();
+  EXPECT_EQ(half_min, read_half_min);
+  const intptr_t read_half_max = reader.ReadSLEB128();
+  EXPECT_EQ(half_max, read_half_max);
+}
+
+}  // namespace dart
diff --git a/runtime/vm/debugger.cc b/runtime/vm/debugger.cc
index d9f462b..5a146e0 100644
--- a/runtime/vm/debugger.cc
+++ b/runtime/vm/debugger.cc
@@ -10,12 +10,10 @@
 #include "vm/code_patcher.h"
 #include "vm/compiler/api/deopt_id.h"
 #include "vm/compiler/assembler/disassembler.h"
-#include "vm/compiler/assembler/disassembler_kbc.h"
 #include "vm/compiler/jit/compiler.h"
 #include "vm/dart_entry.h"
 #include "vm/flags.h"
 #include "vm/globals.h"
-#include "vm/interpreter.h"
 #include "vm/isolate_reload.h"
 #include "vm/json_stream.h"
 #include "vm/kernel.h"
@@ -40,7 +38,6 @@
 #include "vm/visitor.h"
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
-#include "vm/compiler/frontend/bytecode_reader.h"
 #include "vm/deopt_instructions.h"
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
 
@@ -53,7 +50,6 @@
 DEFINE_FLAG(bool, trace_rewind, false, "Trace frame rewind");
 DEFINE_FLAG(bool, verbose_debug, false, "Verbose debugger messages");
 
-DECLARE_FLAG(bool, enable_interpreter);
 DECLARE_FLAG(bool, trace_deoptimization);
 DECLARE_FLAG(bool, warn_on_pause_with_no_debugger);
 
@@ -74,7 +70,6 @@
       requested_line_number_(requested_line_number),
       requested_column_number_(requested_column_number),
       function_(Function::null()),
-      bytecode_token_pos_(TokenPosition::kNoSource),
       code_token_pos_(TokenPosition::kNoSource) {
   ASSERT(!script.IsNull());
   ASSERT(token_pos_.IsReal());
@@ -93,7 +88,6 @@
       requested_line_number_(requested_line_number),
       requested_column_number_(requested_column_number),
       function_(Function::null()),
-      bytecode_token_pos_(TokenPosition::kNoSource),
       code_token_pos_(TokenPosition::kNoSource) {
   ASSERT(requested_line_number_ >= 0);
 }
@@ -111,8 +105,7 @@
   return breakpoints() != NULL;
 }
 
-void BreakpointLocation::SetResolved(bool in_bytecode,
-                                     const Function& func,
+void BreakpointLocation::SetResolved(const Function& func,
                                      TokenPosition token_pos) {
   ASSERT(!IsLatent());
   ASSERT(func.script() == script_);
@@ -122,14 +115,9 @@
   function_ = func.raw();
   token_pos_ = token_pos;
   end_token_pos_ = token_pos;
-  if (in_bytecode) {
-    bytecode_token_pos_ = token_pos;
-  } else {
-    code_token_pos_ = token_pos;
-  }
+  code_token_pos_ = token_pos;
 }
 
-// Returned resolved pos is either in code or in bytecode.
 void BreakpointLocation::GetCodeLocation(Script* script,
                                          TokenPosition* pos) const {
   if (IsLatent()) {
@@ -182,7 +170,6 @@
 
 void CodeBreakpoint::VisitObjectPointers(ObjectPointerVisitor* visitor) {
   visitor->VisitPointer(reinterpret_cast<ObjectPtr*>(&code_));
-  visitor->VisitPointer(reinterpret_cast<ObjectPtr*>(&bytecode_));
   visitor->VisitPointer(reinterpret_cast<ObjectPtr*>(&saved_value_));
 }
 
@@ -198,7 +185,6 @@
       sp_(sp),
       ctx_(Context::ZoneHandle()),
       code_(Code::ZoneHandle(code.raw())),
-      bytecode_(Bytecode::ZoneHandle()),
       function_(Function::ZoneHandle(code.function())),
       live_frame_((kind == kRegular) || (kind == kAsyncActivation)),
       token_pos_initialized_(false),
@@ -218,46 +204,12 @@
   ASSERT(!function_.IsNull());
 }
 
-#if !defined(DART_PRECOMPILED_RUNTIME)
-ActivationFrame::ActivationFrame(uword pc,
-                                 uword fp,
-                                 uword sp,
-                                 const Bytecode& bytecode,
-                                 ActivationFrame::Kind kind)
-    : pc_(pc),
-      fp_(fp),
-      sp_(sp),
-      ctx_(Context::ZoneHandle()),
-      code_(Code::ZoneHandle()),
-      bytecode_(Bytecode::ZoneHandle(bytecode.raw())),
-      function_(Function::ZoneHandle(bytecode.function())),
-      live_frame_((kind == kRegular) || (kind == kAsyncActivation)),
-      token_pos_initialized_(false),
-      token_pos_(TokenPosition::kNoSource),
-      try_index_(-1),
-      deopt_id_(DeoptId::kNone),
-      line_number_(-1),
-      column_number_(-1),
-      context_level_(-1),
-      deopt_frame_(Array::ZoneHandle()),
-      deopt_frame_offset_(0),
-      kind_(kind),
-      vars_initialized_(false),
-      var_descriptors_(LocalVarDescriptors::ZoneHandle()),
-      desc_indices_(8),
-      pc_desc_(PcDescriptors::ZoneHandle()) {
-  // The frame of a bytecode stub has a null function. It may be encountered
-  // when single stepping.
-}
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-
 ActivationFrame::ActivationFrame(Kind kind)
     : pc_(0),
       fp_(0),
       sp_(0),
       ctx_(Context::ZoneHandle()),
       code_(Code::ZoneHandle()),
-      bytecode_(Bytecode::ZoneHandle()),
       function_(Function::ZoneHandle()),
       live_frame_(kind == kRegular),
       token_pos_initialized_(false),
@@ -281,7 +233,6 @@
       sp_(0),
       ctx_(Context::ZoneHandle()),
       code_(Code::ZoneHandle()),
-      bytecode_(Bytecode::ZoneHandle()),
       function_(Function::ZoneHandle()),
       live_frame_(false),
       token_pos_initialized_(false),
@@ -300,17 +251,10 @@
       pc_desc_(PcDescriptors::ZoneHandle()) {
   // Extract the function and the code from the asynchronous activation.
   function_ = async_activation.function();
-#if !defined(DART_PRECOMPILED_RUNTIME)
-  if (!function_.HasCode() && function_.HasBytecode()) {
-    bytecode_ = function_.bytecode();
-  }
-#endif
-  if (bytecode_.IsNull()) {
-    // Force-optimize functions should not be debuggable.
-    ASSERT(!function_.ForceOptimize());
-    function_.EnsureHasCompiledUnoptimizedCode();
-    code_ = function_.unoptimized_code();
-  }
+  // Force-optimize functions should not be debuggable.
+  ASSERT(!function_.ForceOptimize());
+  function_.EnsureHasCompiledUnoptimizedCode();
+  code_ = function_.unoptimized_code();
   ctx_ = async_activation.context();
   ASSERT(fp_ == 0);
   ASSERT(!ctx_.IsNull());
@@ -481,7 +425,7 @@
 }
 
 bool Debugger::HasBreakpoint(const Function& func, Zone* zone) {
-  if (!func.HasCode() && !func.HasBytecode()) {
+  if (!func.HasCode()) {
     // If the function is not compiled yet, just check whether there
     // is a user-defined breakpoint that falls into the token
     // range of the function. This may be a false positive: the breakpoint
@@ -553,58 +497,10 @@
   }
 }
 
-// If the current top Dart frame is interpreted, returns the fp of the caller
-// in compiled code that invoked the interpreter, or 0 if not found.
-// If the current top Dart frame is compiled, returns the fp of the caller in
-// interpreted bytecode that invoked compiled code, or ULONG_MAX if not found.
-// Returning compiled code fp 0 (or bytecode fp ULONG_MAX) as fp value insures
-// that the fp will compare as a callee of any valid frame pointer of the same
-// mode (compiled code or bytecode).
-static uword CrossCallerFp() {
-  StackFrameIterator iterator(ValidationPolicy::kDontValidateFrames,
-                              Thread::Current(),
-                              StackFrameIterator::kNoCrossThreadIteration);
-  StackFrame* frame;
-  do {
-    frame = iterator.NextFrame();
-    RELEASE_ASSERT(frame != nullptr);
-  } while (!frame->IsDartFrame());
-  const bool top_is_interpreted = frame->is_interpreted();
-  do {
-    frame = iterator.NextFrame();
-    if (frame == nullptr) {
-      return top_is_interpreted ? 0 : ULONG_MAX;
-    }
-    if (!frame->IsDartFrame()) {
-      continue;
-    }
-  } while (top_is_interpreted == frame->is_interpreted());
-  return frame->fp();
-}
-
-ActivationFrame::Relation ActivationFrame::CompareTo(
-    uword other_fp,
-    bool other_is_interpreted) const {
+ActivationFrame::Relation ActivationFrame::CompareTo(uword other_fp) const {
   if (fp() == other_fp) {
-    ASSERT(IsInterpreted() == other_is_interpreted);
     return kSelf;
   }
-  if (IsInterpreted()) {
-    if (!other_is_interpreted) {
-      // Instead of fp(), use the fp of the compiled frame that called into the
-      // interpreter (CrossCallerFp).
-      // Note that if CrossCallerFp == other_fp, it must compare as a caller.
-      return IsCalleeFrameOf(other_fp, CrossCallerFp()) ? kCallee : kCaller;
-    }
-    return IsBytecodeCalleeFrameOf(other_fp, fp()) ? kCallee : kCaller;
-  }
-  if (other_is_interpreted) {
-    // Instead of fp(), use the fp of the interpreted frame that called into
-    // compiled code (CrossCallerFp).
-    // Note that if CrossCallerFp == other_fp, it must compare as a caller.
-    return IsBytecodeCalleeFrameOf(other_fp, CrossCallerFp()) ? kCallee
-                                                              : kCaller;
-  }
   return IsCalleeFrameOf(other_fp, fp()) ? kCallee : kCaller;
 }
 
@@ -627,23 +523,17 @@
 }
 
 void ActivationFrame::GetPcDescriptors() {
-  ASSERT(!IsInterpreted());  // We need to set try_index_ simultaneously.
   if (pc_desc_.IsNull()) {
     pc_desc_ = code().pc_descriptors();
     ASSERT(!pc_desc_.IsNull());
   }
 }
 
-// If not token_pos_initialized_, compute token_pos_, try_index_ and,
-// if not IsInterpreted(), also compute deopt_id_.
+// If not token_pos_initialized_, compute token_pos_, try_index_ and
+// deopt_id_.
 TokenPosition ActivationFrame::TokenPos() {
   if (!token_pos_initialized_) {
     token_pos_initialized_ = true;
-    if (IsInterpreted()) {
-      token_pos_ = bytecode().GetTokenIndexOfPC(pc_);
-      try_index_ = bytecode().GetTryIndexAtPc(pc_);
-      return token_pos_;
-    }
     token_pos_ = TokenPosition::kNoSource;
     GetPcDescriptors();
     PcDescriptors::Iterator iter(pc_desc_, PcDescriptorsLayout::kAnyKind);
@@ -668,7 +558,6 @@
 }
 
 intptr_t ActivationFrame::DeoptId() {
-  ASSERT(!IsInterpreted());
   if (!token_pos_initialized_) {
     TokenPos();  // Side effect: computes token_pos_initialized_, try_index_.
   }
@@ -701,11 +590,6 @@
 
 void ActivationFrame::GetVarDescriptors() {
   if (var_descriptors_.IsNull()) {
-    if (IsInterpreted()) {
-      var_descriptors_ = bytecode().GetLocalVarDescriptors();
-      ASSERT(!var_descriptors_.IsNull());
-      return;
-    }
     Code& unoptimized_code = Code::Handle(function().unoptimized_code());
     if (unoptimized_code.IsNull()) {
       Thread* thread = Thread::Current();
@@ -724,8 +608,8 @@
 }
 
 bool ActivationFrame::IsDebuggable() const {
-  // When stepping in bytecode stub, function is null.
-  return !function().IsNull() && Debugger::IsDebuggable(function());
+  ASSERT(!function().IsNull());
+  return Debugger::IsDebuggable(function());
 }
 
 void ActivationFrame::PrintDescriptorsError(const char* message) {
@@ -735,14 +619,7 @@
   OS::PrintErr("deopt_id_ %" Px "\n", deopt_id_);
   OS::PrintErr("context_level_ %" Px "\n", context_level_);
   OS::PrintErr("token_pos_ %s\n", token_pos_.ToCString());
-  if (function().is_declared_in_bytecode()) {
-#if !defined(DART_PRECOMPILED_RUNTIME)
-    KernelBytecodeDisassembler::Disassemble(function());
-#else
-    UNREACHABLE();
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-  }
-  if (!IsInterpreted()) {
+  {
     DisassembleToStdout formatter;
     code().Disassemble(&formatter);
     PcDescriptors::Handle(code().pc_descriptors()).Print();
@@ -763,63 +640,30 @@
   ASSERT(live_frame_);
   const Context& ctx = GetSavedCurrentContext();
   if (context_level_ < 0 && !ctx.IsNull()) {
-    if (IsInterpreted()) {
-#if !defined(DART_PRECOMPILED_RUNTIME)
-      Thread* thread = Thread::Current();
-      Zone* zone = thread->zone();
-      const auto& bytecode = Bytecode::Handle(zone, function_.bytecode());
-      if (!bytecode.HasLocalVariablesInfo()) {
-        PrintDescriptorsError("Missing local variables info");
-      }
-      intptr_t pc_offset = pc_ - bytecode.PayloadStart();
-      // Look for innermost scope, i.e. with the highest context level.
-      // Since scopes are ordered by StartPC(), the last scope which includes
-      // pc_offset will be the innermost one.
-      kernel::BytecodeLocalVariablesIterator local_vars(zone, bytecode);
-      while (local_vars.MoveNext()) {
-        if (local_vars.Kind() ==
-            kernel::BytecodeLocalVariablesIterator::kScope) {
-          if (local_vars.StartPC() > pc_offset) {
-            break;
-          }
-          if (pc_offset <= local_vars.EndPC()) {
-            ASSERT(context_level_ <= local_vars.ContextLevel());
-            context_level_ = local_vars.ContextLevel();
-          }
-        }
-      }
-      if (context_level_ < 0) {
-        PrintDescriptorsError("Missing context level in local variables info");
-      }
-#else
-      UNREACHABLE();
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-    } else {
-      ASSERT(!code_.is_optimized());
-      GetVarDescriptors();
-      intptr_t deopt_id = DeoptId();
-      if (deopt_id == DeoptId::kNone) {
-        PrintDescriptorsError("Missing deopt id");
-      }
-      intptr_t var_desc_len = var_descriptors_.Length();
-      bool found = false;
-      for (intptr_t cur_idx = 0; cur_idx < var_desc_len; cur_idx++) {
-        LocalVarDescriptorsLayout::VarInfo var_info;
-        var_descriptors_.GetInfo(cur_idx, &var_info);
-        const int8_t kind = var_info.kind();
-        if ((kind == LocalVarDescriptorsLayout::kContextLevel) &&
-            (deopt_id >= var_info.begin_pos.value()) &&
-            (deopt_id <= var_info.end_pos.value())) {
-          context_level_ = var_info.index();
-          found = true;
-          break;
-        }
-      }
-      if (!found) {
-        PrintDescriptorsError("Missing context level in var descriptors");
-      }
-      ASSERT(context_level_ >= 0);
+    ASSERT(!code_.is_optimized());
+    GetVarDescriptors();
+    intptr_t deopt_id = DeoptId();
+    if (deopt_id == DeoptId::kNone) {
+      PrintDescriptorsError("Missing deopt id");
     }
+    intptr_t var_desc_len = var_descriptors_.Length();
+    bool found = false;
+    for (intptr_t cur_idx = 0; cur_idx < var_desc_len; cur_idx++) {
+      LocalVarDescriptorsLayout::VarInfo var_info;
+      var_descriptors_.GetInfo(cur_idx, &var_info);
+      const int8_t kind = var_info.kind();
+      if ((kind == LocalVarDescriptorsLayout::kContextLevel) &&
+          (deopt_id >= var_info.begin_pos.value()) &&
+          (deopt_id <= var_info.end_pos.value())) {
+        context_level_ = var_info.index();
+        found = true;
+        break;
+      }
+    }
+    if (!found) {
+      PrintDescriptorsError("Missing context level in var descriptors");
+    }
+    ASSERT(context_level_ >= 0);
   }
   return context_level_;
 }
@@ -845,13 +689,9 @@
         return GetStackVar(variable_index);
       } else {
         ASSERT(kind == LocalVarDescriptorsLayout::kContextVar);
-        // Variable descriptors constructed from bytecode have all variables of
-        // enclosing functions, even shadowed by the current function.
-        // Pick the variable with the highest context level.
-        if (var_info.scope_id > var_ctxt_level) {
-          var_ctxt_level = var_info.scope_id;
-          ctxt_slot = variable_index.value();
-        }
+        var_ctxt_level = var_info.scope_id;
+        ctxt_slot = variable_index.value();
+        break;
       }
     }
   }
@@ -860,10 +700,7 @@
       ASSERT(!ctx_.IsNull());
       // Compiled code uses relative context levels, i.e. the frame context
       // level is always 0 on entry.
-      // Bytecode uses absolute context levels, i.e. the frame context level
-      // on entry must be calculated.
-      const intptr_t frame_ctx_level =
-          function().is_declared_in_bytecode() ? ctx_.GetLevel() : 0;
+      const intptr_t frame_ctx_level = 0;
       return GetRelativeContextVar(var_ctxt_level, ctxt_slot, frame_ctx_level);
     }
     return GetContextVar(var_ctxt_level, ctxt_slot);
@@ -871,63 +708,26 @@
   return Object::null();
 }
 
-ObjectPtr ActivationFrame::GetAsyncCompleter() {
-  return GetAsyncContextVariable(Symbols::AsyncCompleter());
-}
+ObjectPtr ActivationFrame::GetAsyncAwaiter(
+    CallerClosureFinder* caller_closure_finder) {
+  if (!function_.IsNull() &&
+      (function_.IsAsyncClosure() || function_.IsAsyncGenClosure())) {
+    // This is only possible for frames that are active on the stack.
+    if (fp() == 0) {
+      return Object::null();
+    }
 
-ObjectPtr ActivationFrame::GetAsyncCompleterAwaiter(const Object& completer) {
-  DEBUG_ASSERT(Thread::Current()->TopErrorHandlerIsExitFrame());
+    // Look up caller's closure on the stack.
+    ObjectPtr* last_caller_obj = reinterpret_cast<ObjectPtr*>(GetCallerSp());
+    Closure& closure = Closure::Handle();
+    closure = StackTraceUtils::FindClosureInFrame(last_caller_obj, function_);
 
-  Object& future = Object::Handle();
-  const Class& completer_cls = Class::Handle(completer.clazz());
-  ASSERT(!completer_cls.IsNull());
-  const Function& future_getter = Function::Handle(
-      completer_cls.LookupGetterFunction(Symbols::CompleterFuture()));
-  ASSERT(!future_getter.IsNull());
-  const Array& args = Array::Handle(Array::New(1));
-  args.SetAt(0, Instance::Cast(completer));
-  future = DartEntry::InvokeFunction(future_getter, args);
-  if (future.IsError()) {
-    Exceptions::PropagateError(Error::Cast(future));
+    if (!closure.IsNull() && caller_closure_finder->IsRunningAsync(closure)) {
+      closure = caller_closure_finder->FindCaller(closure);
+      return closure.raw();
+    }
   }
-  if (future.IsNull()) {
-    // The completer object may not be fully initialized yet.
-    return Object::null();
-  }
-  const Class& future_cls = Class::Handle(future.clazz());
-  ASSERT(!future_cls.IsNull());
-  const Field& awaiter_field = Field::Handle(
-      future_cls.LookupInstanceFieldAllowPrivate(Symbols::_Awaiter()));
-  ASSERT(!awaiter_field.IsNull());
-  return Instance::Cast(future).GetField(awaiter_field);
-}
 
-ObjectPtr ActivationFrame::GetAsyncStreamControllerStream() {
-  return GetAsyncContextVariable(Symbols::ControllerStream());
-}
-
-ObjectPtr ActivationFrame::GetAsyncStreamControllerStreamAwaiter(
-    const Object& stream) {
-  const Class& stream_cls = Class::Handle(stream.clazz());
-  ASSERT(!stream_cls.IsNull());
-  const Class& stream_impl_cls = Class::Handle(stream_cls.SuperClass());
-  const Field& awaiter_field = Field::Handle(
-      stream_impl_cls.LookupInstanceFieldAllowPrivate(Symbols::_Awaiter()));
-  ASSERT(!awaiter_field.IsNull());
-  return Instance::Cast(stream).GetField(awaiter_field);
-}
-
-ObjectPtr ActivationFrame::GetAsyncAwaiter() {
-  const Object& async_stream_controller_stream =
-      Object::Handle(GetAsyncStreamControllerStream());
-  if (!async_stream_controller_stream.IsNull()) {
-    return GetAsyncStreamControllerStreamAwaiter(
-        async_stream_controller_stream);
-  }
-  const Object& completer = Object::Handle(GetAsyncCompleter());
-  if (!completer.IsNull()) {
-    return GetAsyncCompleterAwaiter(completer);
-  }
   return Object::null();
 }
 
@@ -949,11 +749,7 @@
   AbstractType& type = Type::Handle();
   const bool is_async =
       function().IsAsyncClosure() || function().IsAsyncGenClosure();
-  if (IsInterpreted()) {
-    handlers = bytecode().exception_handlers();
-  } else {
-    handlers = code().exception_handlers();
-  }
+  handlers = code().exception_handlers();
   ASSERT(!handlers.IsNull());
   intptr_t num_handlers_checked = 0;
   while (try_index != kInvalidTryIndex) {
@@ -996,13 +792,9 @@
     if (var_descriptors_.GetName(i) == Symbols::AwaitJumpVar().raw()) {
       ASSERT(kind == LocalVarDescriptorsLayout::kContextVar);
       ASSERT(!ctx_.IsNull());
-      // Variable descriptors constructed from bytecode have all variables of
-      // enclosing functions, even shadowed by the current function.
-      // Pick the :await_jump_var variable with the highest context level.
-      if (var_info.scope_id > var_ctxt_level) {
-        var_ctxt_level = var_info.scope_id;
-        ctxt_slot = var_info.index();
-      }
+      var_ctxt_level = var_info.scope_id;
+      ctxt_slot = var_info.index();
+      break;
     }
   }
   if (var_ctxt_level >= 0) {
@@ -1022,39 +814,6 @@
   // This should only be called on frames that aren't active on the stack.
   ASSERT(fp() == 0);
 
-  if (function_.is_declared_in_bytecode()) {
-#if !defined(DART_PRECOMPILED_RUNTIME)
-    const auto& bytecode = Bytecode::Handle(zone, function_.bytecode());
-    if (!bytecode.HasSourcePositions()) {
-      return;
-    }
-    const intptr_t await_jump_var = GetAwaitJumpVariable();
-    if (await_jump_var < 0) {
-      return;
-    }
-    // Yield points are counted from 1 (0 is reserved for normal entry).
-    intptr_t yield_point_index = 1;
-    kernel::BytecodeSourcePositionsIterator iter(zone, bytecode);
-    while (iter.MoveNext()) {
-      if (iter.IsYieldPoint()) {
-        if (yield_point_index == await_jump_var) {
-          token_pos_ = iter.TokenPos();
-          token_pos_initialized_ = true;
-          const uword return_address =
-              KernelBytecode::Next(bytecode.PayloadStart() + iter.PcOffset());
-          try_index_ = bytecode.GetTryIndexAtPc(return_address);
-          return;
-        }
-        ++yield_point_index;
-      }
-    }
-    return;
-#else
-    UNREACHABLE();
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-  }
-
-  ASSERT(!IsInterpreted());
   const intptr_t await_jump_var = GetAwaitJumpVariable();
   if (await_jump_var < 0) {
     return;
@@ -1075,10 +834,7 @@
 }
 
 bool ActivationFrame::IsAsyncMachinery() const {
-  if (function_.IsNull()) {
-    ASSERT(IsInterpreted());  // This frame is a bytecode stub frame.
-    return false;
-  }
+  ASSERT(!function_.IsNull());
   Isolate* isolate = Isolate::Current();
   if (function_.raw() == isolate->object_store()->complete_on_async_return()) {
     // We are completing an async function's completer.
@@ -1237,17 +993,6 @@
   intptr_t num_parameters = function().num_fixed_parameters();
   ASSERT(0 <= index && index < num_parameters);
 
-  if (IsInterpreted()) {
-    if (function().NumOptionalParameters() > 0) {
-      // Note that we do not access optional but only fixed parameters, hence
-      // we do not need to replicate the logic of IndexFor() in bytecode reader.
-      return GetVariableValue(fp() + index * kWordSize);
-    } else {
-      return GetVariableValue(
-          fp() - (kKBCParamEndSlotFromFp + num_parameters - index) * kWordSize);
-    }
-  }
-
   if (function().NumOptionalParameters() > 0) {
     // If the function has optional parameters, the first positional parameter
     // can be in a number of places in the caller's frame depending on how many
@@ -1268,13 +1013,6 @@
 }
 
 ObjectPtr ActivationFrame::GetStackVar(VariableIndex variable_index) {
-  if (IsInterpreted()) {
-    intptr_t slot_index = -variable_index.value();
-    if (slot_index < 0) {
-      slot_index -= kKBCParamEndSlotFromFp;  // Accessing a parameter.
-    }
-    return GetVariableValue(fp() + slot_index * kWordSize);
-  }
   const intptr_t slot_index =
       runtime_frame_layout.FrameSlotForVariableIndex(variable_index.value());
   if (deopt_frame_.IsNull()) {
@@ -1576,7 +1314,7 @@
   const char* func_name = function().ToFullyQualifiedCString();
   if (live_frame_) {
     return Thread::Current()->zone()->PrintToString(
-        "[ Frame pc(0x%" Px " %s offset:0x%" Px ") fp(0x%" Px ") sp(0x%" Px
+        "[ Frame pc(0x%" Px " code offset:0x%" Px ") fp(0x%" Px ") sp(0x%" Px
         ")\n"
         "\tfunction = %s\n"
         "\turl = %s\n"
@@ -1584,20 +1322,16 @@
         "\n"
         "\tcontext = %s\n"
         "\tcontext level = %" Pd " ]\n",
-        pc(), IsInterpreted() ? "bytecode" : "code",
-        pc() - (IsInterpreted() ? bytecode().PayloadStart()
-                                : code().PayloadStart()),
-        fp(), sp(), func_name, url.ToCString(), line, ctx_.ToCString(),
-        ContextLevel());
+        pc(), pc() - code().PayloadStart(), fp(), sp(), func_name,
+        url.ToCString(), line, ctx_.ToCString(), ContextLevel());
   } else {
     return Thread::Current()->zone()->PrintToString(
-        "[ Frame %s function = %s\n"
+        "[ Frame code function = %s\n"
         "\turl = %s\n"
         "\tline = %" Pd
         "\n"
         "\tcontext = %s]\n",
-        IsInterpreted() ? "bytecode" : "code", func_name, url.ToCString(), line,
-        ctx_.ToCString());
+        func_name, url.ToCString(), line, ctx_.ToCString());
   }
 }
 
@@ -1620,11 +1354,7 @@
   const TokenPosition pos = TokenPos().SourcePosition();
   jsobj->AddLocation(script, pos);
   jsobj->AddProperty("function", function());
-  if (IsInterpreted()) {
-    jsobj->AddProperty("code", bytecode());
-  } else {
-    jsobj->AddProperty("code", code());
-  }
+  jsobj->AddProperty("code", code());
   {
     JSONArray jsvars(jsobj, "vars");
     const int num_vars = NumLocalVariables();
@@ -1660,11 +1390,7 @@
   const TokenPosition pos = TokenPos().SourcePosition();
   jsobj->AddLocation(script, pos);
   jsobj->AddProperty("function", function());
-  if (IsInterpreted()) {
-    jsobj->AddProperty("code", bytecode());
-  } else {
-    jsobj->AddProperty("code", code());
-  }
+  jsobj->AddProperty("code", code());
 }
 
 void ActivationFrame::PrintToJSONObjectAsyncSuspensionMarker(
@@ -1694,14 +1420,6 @@
                                  ActivationFrame::kAsyncCausal));
 }
 
-#if !defined(DART_PRECOMPILED_RUNTIME)
-void DebuggerStackTrace::AddAsyncCausalFrame(uword pc,
-                                             const Bytecode& bytecode) {
-  trace_.Add(
-      new ActivationFrame(pc, 0, 0, bytecode, ActivationFrame::kAsyncCausal));
-}
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-
 const uint8_t kSafepointKind = PcDescriptorsLayout::kIcCall |
                                PcDescriptorsLayout::kUnoptStaticCall |
                                PcDescriptorsLayout::kRuntimeCall;
@@ -1711,7 +1429,6 @@
                                uword pc,
                                PcDescriptorsLayout::Kind kind)
     : code_(code.raw()),
-      bytecode_(Bytecode::null()),
       token_pos_(token_pos),
       pc_(pc),
       line_number_(-1),
@@ -1726,32 +1443,12 @@
   ASSERT((breakpoint_kind_ & kSafepointKind) != 0);
 }
 
-CodeBreakpoint::CodeBreakpoint(const Bytecode& bytecode,
-                               TokenPosition token_pos,
-                               uword pc)
-    : code_(Code::null()),
-      bytecode_(bytecode.raw()),
-      token_pos_(token_pos),
-      pc_(pc),
-      line_number_(-1),
-      is_enabled_(false),
-      bpt_location_(NULL),
-      next_(NULL),
-      breakpoint_kind_(PcDescriptorsLayout::kAnyKind),
-      saved_value_(Code::null()) {
-  ASSERT(!bytecode.IsNull());
-  ASSERT(FLAG_enable_interpreter);
-  ASSERT(token_pos_.IsReal());
-  ASSERT(pc_ != 0);
-}
-
 CodeBreakpoint::~CodeBreakpoint() {
   // Make sure we don't leave patched code behind.
   ASSERT(!IsEnabled());
 // Poison the data so we catch use after free errors.
 #ifdef DEBUG
   code_ = Code::null();
-  bytecode_ = Bytecode::null();
   pc_ = 0ul;
   bpt_location_ = NULL;
   next_ = NULL;
@@ -1760,12 +1457,7 @@
 }
 
 FunctionPtr CodeBreakpoint::function() const {
-  if (IsInterpreted()) {
-    ASSERT(Bytecode::Handle(bytecode_).function() != Function::null());
-    return Bytecode::Handle(bytecode_).function();
-  } else {
-    return Code::Handle(code_).function();
-  }
+  return Code::Handle(code_).function();
 }
 
 ScriptPtr CodeBreakpoint::SourceCode() {
@@ -1789,30 +1481,14 @@
 
 void CodeBreakpoint::Enable() {
   if (!is_enabled_) {
-    if (IsInterpreted()) {
-#if !defined(DART_PRECOMPILED_RUNTIME)
-      SetBytecodeBreakpoint();
-#else
-      UNREACHABLE();
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-    } else {
-      PatchCode();
-    }
+    PatchCode();
   }
   ASSERT(is_enabled_);
 }
 
 void CodeBreakpoint::Disable() {
   if (is_enabled_) {
-    if (IsInterpreted()) {
-#if !defined(DART_PRECOMPILED_RUNTIME)
-      UnsetBytecodeBreakpoint();
-#else
-      UNREACHABLE();
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-    } else {
-      RestoreCode();
-    }
+    RestoreCode();
   }
   ASSERT(!is_enabled_);
 }
@@ -1832,11 +1508,9 @@
       async_causal_stack_trace_(NULL),
       awaiter_stack_trace_(NULL),
       stepping_fp_(0),
-      interpreted_stepping_(false),
       last_stepping_fp_(0),
       last_stepping_pos_(TokenPosition::kNoSource),
       async_stepping_fp_(0),
-      interpreted_async_stepping_(false),
       top_frame_awaiter_(Object::null()),
       skip_next_step_(false),
       needs_breakpoint_cleanup_(false),
@@ -1955,7 +1629,8 @@
   // Iterate over all classes, deoptimize functions.
   // TODO(hausner): Could possibly be combined with RemoveOptimizedCode()
   const ClassTable& class_table = *isolate_->class_table();
-  Zone* zone = Thread::Current()->zone();
+  Thread* thread = Thread::Current();
+  Zone* zone = thread->zone();
   CallSiteResetter resetter(zone);
   Class& cls = Class::Handle(zone);
   Array& functions = Array::Handle(zone);
@@ -1965,6 +1640,9 @@
 
   const intptr_t num_classes = class_table.NumCids();
   const intptr_t num_tlc_classes = class_table.NumTopLevelCids();
+  // TODO(dartbug.com/36097): Need to stop other mutators running in same IG
+  // before deoptimizing the world.
+  SafepointWriteRwLocker ml(thread, thread->isolate_group()->program_lock());
   for (intptr_t i = 1; i < num_classes + num_tlc_classes; i++) {
     const classid_t cid =
         i < num_classes ? i : ClassTable::CidFromTopLevelIndex(i - num_classes);
@@ -2026,14 +1704,6 @@
 
 void Debugger::NotifySingleStepping(bool value) const {
   isolate_->set_single_step(value);
-#if !defined(DART_PRECOMPILED_RUNTIME)
-  // Do not call Interpreter::Current(), which may allocate an interpreter.
-  Interpreter* interpreter = Thread::Current()->interpreter();
-  if (interpreter != nullptr) {
-    // Do not reset is_debugging to false if bytecode debug breaks are enabled.
-    interpreter->set_is_debugging(value || HasEnabledBytecodeBreakpoints());
-  }
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
 }
 
 ActivationFrame* Debugger::CollectDartFrame(Isolate* isolate,
@@ -2056,22 +1726,6 @@
 }
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
-ActivationFrame* Debugger::CollectDartFrame(Isolate* isolate,
-                                            uword pc,
-                                            StackFrame* frame,
-                                            const Bytecode& bytecode,
-                                            ActivationFrame::Kind kind) {
-  ASSERT(bytecode.ContainsInstructionAt(pc));
-  ActivationFrame* activation =
-      new ActivationFrame(pc, frame->fp(), frame->sp(), bytecode, kind);
-  if (FLAG_trace_debugger_stacktrace) {
-    const Context& ctx = activation->GetSavedCurrentContext();
-    OS::PrintErr("\tUsing saved context: %s\n", ctx.ToCString());
-    OS::PrintErr("\tLine number: %" Pd "\n", activation->LineNumber());
-  }
-  return activation;
-}
-
 ArrayPtr Debugger::DeoptimizeToArray(Thread* thread,
                                      StackFrame* frame,
                                      const Code& code) {
@@ -2104,9 +1758,6 @@
                               Thread::Current(),
                               StackFrameIterator::kNoCrossThreadIteration);
   Code& code = Code::Handle(zone);
-#if !defined(DART_PRECOMPILED_RUNTIME)
-  Bytecode& bytecode = Bytecode::Handle(zone);
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
   Code& inlined_code = Code::Handle(zone);
   Array& deopt_frame = Array::Handle(zone);
 
@@ -2118,22 +1769,9 @@
                    frame->ToCString());
     }
     if (frame->IsDartFrame()) {
-      if (frame->is_interpreted()) {
-#if !defined(DART_PRECOMPILED_RUNTIME)
-        bytecode = frame->LookupDartBytecode();
-        if (bytecode.function() == Function::null()) {
-          continue;  // Skip bytecode stub frame.
-        }
-        stack_trace->AddActivation(
-            CollectDartFrame(isolate, frame->pc(), frame, bytecode));
-#else
-        UNREACHABLE();
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-      } else {
-        code = frame->LookupDartCode();
-        AppendCodeFrames(thread, isolate, zone, stack_trace, frame, &code,
-                         &inlined_code, &deopt_frame);
-      }
+      code = frame->LookupDartCode();
+      AppendCodeFrames(thread, isolate, zone, stack_trace, frame, &code,
+                       &inlined_code, &deopt_frame);
     }
   }
   return stack_trace;
@@ -2196,9 +1834,6 @@
 
   Object& code_obj = Object::Handle(zone);
   Code& code = Code::Handle(zone);
-#if !defined(DART_PRECOMPILED_RUNTIME)
-  Bytecode& bytecode = Bytecode::Handle(zone);
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
   Smi& offset = Smi::Handle();
   Code& inlined_code = Code::Handle(zone);
   Array& deopt_frame = Array::Handle(zone);
@@ -2232,22 +1867,9 @@
   while (synchronous_stack_trace_length > 0) {
     ASSERT(frame != NULL);
     if (frame->IsDartFrame()) {
-      if (frame->is_interpreted()) {
-#if !defined(DART_PRECOMPILED_RUNTIME)
-        bytecode = frame->LookupDartBytecode();
-        if (bytecode.function() == Function::null()) {
-          continue;  // Skip bytecode stub frame.
-        }
-        stack_trace->AddActivation(
-            CollectDartFrame(isolate, frame->pc(), frame, bytecode));
-#else
-        UNREACHABLE();
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-      } else {
-        code = frame->LookupDartCode();
-        AppendCodeFrames(thread, isolate, zone, stack_trace, frame, &code,
-                         &inlined_code, &deopt_frame);
-      }
+      code = frame->LookupDartCode();
+      AppendCodeFrames(thread, isolate, zone, stack_trace, frame, &code,
+                       &inlined_code, &deopt_frame);
       synchronous_stack_trace_length--;
     }
     frame = iterator.NextFrame();
@@ -2273,14 +1895,6 @@
         i++;
       } else {
         offset = Smi::RawCast(async_stack_trace.PcOffsetAtFrame(i));
-#if !defined(DART_PRECOMPILED_RUNTIME)
-        if (code_obj.IsBytecode()) {
-          bytecode ^= code_obj.raw();
-          uword pc = bytecode.PayloadStart() + offset.Value();
-          stack_trace->AddAsyncCausalFrame(pc, bytecode);
-          continue;
-        }
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
         code ^= code_obj.raw();
         uword pc = code.PayloadStart() + offset.Value();
         if (code.is_optimized()) {
@@ -2313,27 +1927,14 @@
   Code& inlined_code = Code::Handle(zone);
   Smi& offset = Smi::Handle();
   Array& deopt_frame = Array::Handle(zone);
-#if !defined(DART_PRECOMPILED_RUNTIME)
-  Bytecode& bytecode = Bytecode::Handle(zone);
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
 
   constexpr intptr_t kDefaultStackAllocation = 8;
   auto stack_trace = new DebuggerStackTrace(kDefaultStackAllocation);
 
   std::function<void(StackFrame*)> on_sync_frame = [&](StackFrame* frame) {
-    if (frame->is_interpreted()) {
-#if !defined(DART_PRECOMPILED_RUNTIME)
-      bytecode = frame->LookupDartBytecode();
-      stack_trace->AddActivation(
-          CollectDartFrame(isolate, frame->pc(), frame, bytecode));
-#else
-      UNREACHABLE();
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-    } else {
-      code = frame->LookupDartCode();
-      AppendCodeFrames(thread, isolate, zone, stack_trace, frame, &code,
-                       &inlined_code, &deopt_frame);
-    }
+    code = frame->LookupDartCode();
+    AppendCodeFrames(thread, isolate, zone, stack_trace, frame, &code,
+                     &inlined_code, &deopt_frame);
   };
 
   const auto& code_array = GrowableObjectArray::ZoneHandle(
@@ -2368,10 +1969,10 @@
 #if defined(DART_PRECOMPILED_RUNTIME)
   // Causal async stacks are not supported in the AOT runtime.
   ASSERT(!FLAG_async_debugger);
-  return NULL;
+  return nullptr;
 #else
   if (!FLAG_async_debugger) {
-    return NULL;
+    return nullptr;
   }
 
   Thread* thread = Thread::Current();
@@ -2385,175 +1986,133 @@
 
   Object& code_object = Object::Handle(zone);
   Code& code = Code::Handle(zone);
-  Bytecode& bytecode = Bytecode::Handle(zone);
   Smi& offset = Smi::Handle(zone);
   Function& function = Function::Handle(zone);
   Code& inlined_code = Code::Handle(zone);
   Closure& async_activation = Closure::Handle(zone);
   Object& next_async_activation = Object::Handle(zone);
   Array& deopt_frame = Array::Handle(zone);
+  // Note: 'class' since Debugger declares a method by the same name.
   class StackTrace& async_stack_trace = StackTrace::Handle(zone);
   bool stack_has_async_function = false;
+  Closure& closure = Closure::Handle();
 
-  // Number of frames we are trying to skip that form "sync async" entry.
-  int skip_sync_async_frames_count = -1;
-  String& function_name = String::Handle(zone);
-  for (StackFrame* frame = iterator.NextFrame(); frame != NULL;
+  CallerClosureFinder caller_closure_finder(zone);
+
+  for (StackFrame* frame = iterator.NextFrame(); frame != nullptr;
        frame = iterator.NextFrame()) {
     ASSERT(frame->IsValid());
     if (FLAG_trace_debugger_stacktrace) {
       OS::PrintErr("CollectAwaiterReturnStackTrace: visiting frame:\n\t%s\n",
                    frame->ToCString());
     }
-    if (frame->IsDartFrame()) {
-      if (frame->is_interpreted()) {
-        bytecode = frame->LookupDartBytecode();
-        function = bytecode.function();
-        if (function.IsNull()) {
-          continue;  // Skip bytecode stub frame.
-        }
 
-        if (skip_sync_async_frames_count > 0) {
-          function_name = function.QualifiedScrubbedName();
-          if (!StackTraceUtils::CheckAndSkipAsync(&skip_sync_async_frames_count,
-                                                  function_name)) {
-            // Unexpected function in synchronous call of async function.
-            break;
-          }
-        }
+    if (!frame->IsDartFrame()) {
+      continue;
+    }
 
-        if (function.IsAsyncClosure() || function.IsAsyncGenClosure()) {
-          ActivationFrame* activation =
-              CollectDartFrame(isolate, frame->pc(), frame, bytecode,
-                               ActivationFrame::kAsyncActivation);
-          ASSERT(activation != NULL);
-          stack_trace->AddActivation(activation);
-          stack_has_async_function = true;
-          // Grab the awaiter.
-          async_activation ^= activation->GetAsyncAwaiter();
-          async_stack_trace ^= activation->GetCausalStack();
-          // Interpreted bytecode does not invoke _ClosureCall().
-          // Skip _AsyncAwaitCompleterStart() only.
-          skip_sync_async_frames_count = 1;
-        } else {
-          stack_trace->AddActivation(
-              CollectDartFrame(isolate, frame->pc(), frame, bytecode));
+    code = frame->LookupDartCode();
+
+    // Simple frame. Just add the one.
+    if (!code.is_optimized()) {
+      function = code.function();
+      if (function.IsAsyncClosure() || function.IsAsyncGenClosure()) {
+        ActivationFrame* activation = CollectDartFrame(
+            isolate, frame->pc(), frame, code, Object::null_array(), 0,
+            ActivationFrame::kAsyncActivation);
+        ASSERT(activation != nullptr);
+        stack_trace->AddActivation(activation);
+        stack_has_async_function = true;
+        // Grab the awaiter.
+        async_activation ^= activation->GetAsyncAwaiter(&caller_closure_finder);
+        async_stack_trace ^= activation->GetCausalStack();
+        // Bail if we've reach the end of sync execution stack.
+        ObjectPtr* last_caller_obj =
+            reinterpret_cast<ObjectPtr*>(frame->GetCallerSp());
+        closure =
+            StackTraceUtils::FindClosureInFrame(last_caller_obj, function);
+        if (caller_closure_finder.IsRunningAsync(closure)) {
+          break;
         }
       } else {
-        code = frame->LookupDartCode();
-        if (code.is_optimized()) {
-          if (code.is_force_optimized()) {
-            if (FLAG_trace_debugger_stacktrace) {
-              function = code.function();
-              ASSERT(!function.IsNull());
-              OS::PrintErr(
-                  "CollectAwaiterReturnStackTrace: "
-                  "skipping force-optimized function: %s\n",
-                  function.ToFullyQualifiedCString());
-            }
-            // Skip frame of force-optimized (and non-debuggable) function.
-            continue;
-          }
-          deopt_frame = DeoptimizeToArray(thread, frame, code);
-          bool found_async_awaiter = false;
-          bool abort_attempt_to_navigate_through_sync_async = false;
-          for (InlinedFunctionsIterator it(code, frame->pc()); !it.Done();
-               it.Advance()) {
-            inlined_code = it.code();
-            function = it.function();
-
-            if (skip_sync_async_frames_count > 0) {
-              function_name ^= function.QualifiedScrubbedName();
-              if (!StackTraceUtils::CheckAndSkipAsync(
-                      &skip_sync_async_frames_count, function_name)) {
-                // Unexpected function in sync async call
-                skip_sync_async_frames_count = -1;
-                abort_attempt_to_navigate_through_sync_async = true;
-                break;
-              }
-            }
-
-            if (FLAG_trace_debugger_stacktrace) {
-              ASSERT(!function.IsNull());
-              OS::PrintErr(
-                  "CollectAwaiterReturnStackTrace: "
-                  "visiting inlined function: %s\n ",
-                  function.ToFullyQualifiedCString());
-            }
-            intptr_t deopt_frame_offset = it.GetDeoptFpOffset();
-            if (function.IsAsyncClosure() || function.IsAsyncGenClosure()) {
-              ActivationFrame* activation = CollectDartFrame(
-                  isolate, it.pc(), frame, inlined_code, deopt_frame,
-                  deopt_frame_offset, ActivationFrame::kAsyncActivation);
-              ASSERT(activation != NULL);
-              stack_trace->AddActivation(activation);
-              stack_has_async_function = true;
-              // Grab the awaiter.
-              async_activation ^= activation->GetAsyncAwaiter();
-              found_async_awaiter = true;
-              // async function might have been called synchronously, in which
-              // case we need to keep going down the stack.
-              // To determine how we are called we peek few more frames further
-              // expecting to see Closure_call followed by
-              // AsyncAwaitCompleter_start.
-              // If we are able to see those functions we continue going down
-              // thestack, if we are not, we break out of the loop as we are
-              // not interested in exploring rest of the stack - there is only
-              // dart-internal code left.
-              skip_sync_async_frames_count = 2;
-            } else {
-              stack_trace->AddActivation(
-                  CollectDartFrame(isolate, it.pc(), frame, inlined_code,
-                                   deopt_frame, deopt_frame_offset));
-            }
-          }
-          // Break out of outer loop.
-          if (found_async_awaiter ||
-              abort_attempt_to_navigate_through_sync_async) {
-            break;
-          }
-        } else {
-          function = code.function();
-
-          if (skip_sync_async_frames_count > 0) {
-            function_name ^= function.QualifiedScrubbedName();
-            if (!StackTraceUtils::CheckAndSkipAsync(
-                    &skip_sync_async_frames_count, function_name)) {
-              // Unexpected function in synchronous call of async function.
-              break;
-            }
-          }
-
-          if (function.IsAsyncClosure() || function.IsAsyncGenClosure()) {
-            ActivationFrame* activation = CollectDartFrame(
-                isolate, frame->pc(), frame, code, Object::null_array(), 0,
-                ActivationFrame::kAsyncActivation);
-            ASSERT(activation != NULL);
-            stack_trace->AddActivation(activation);
-            stack_has_async_function = true;
-            // Grab the awaiter.
-            async_activation ^= activation->GetAsyncAwaiter();
-            async_stack_trace ^= activation->GetCausalStack();
-            // see comment regarding skipping frames of async functions called
-            // synchronously above.
-            skip_sync_async_frames_count = 2;
-          } else {
-            stack_trace->AddActivation(CollectDartFrame(
-                isolate, frame->pc(), frame, code, Object::null_array(), 0));
-          }
-        }
+        stack_trace->AddActivation(CollectDartFrame(
+            isolate, frame->pc(), frame, code, Object::null_array(), 0));
       }
+
+      continue;
+    }
+
+    if (code.is_force_optimized()) {
+      if (FLAG_trace_debugger_stacktrace) {
+        function = code.function();
+        ASSERT(!function.IsNull());
+        OS::PrintErr(
+            "CollectAwaiterReturnStackTrace: "
+            "skipping force-optimized function: %s\n",
+            function.ToFullyQualifiedCString());
+      }
+      // Skip frame of force-optimized (and non-debuggable) function.
+      continue;
+    }
+
+    deopt_frame = DeoptimizeToArray(thread, frame, code);
+    bool found_async_awaiter = false;
+    bool abort_attempt_to_navigate_through_sync_async = false;
+    for (InlinedFunctionsIterator it(code, frame->pc()); !it.Done();
+         it.Advance()) {
+      inlined_code = it.code();
+      function = it.function();
+
+      if (FLAG_trace_debugger_stacktrace) {
+        ASSERT(!function.IsNull());
+        OS::PrintErr(
+            "CollectAwaiterReturnStackTrace: "
+            "visiting inlined function: %s\n ",
+            function.ToFullyQualifiedCString());
+      }
+
+      intptr_t deopt_frame_offset = it.GetDeoptFpOffset();
+      if (function.IsAsyncClosure() || function.IsAsyncGenClosure()) {
+        ActivationFrame* activation = CollectDartFrame(
+            isolate, it.pc(), frame, inlined_code, deopt_frame,
+            deopt_frame_offset, ActivationFrame::kAsyncActivation);
+        ASSERT(activation != NULL);
+        stack_trace->AddActivation(activation);
+        stack_has_async_function = true;
+        // Grab the awaiter.
+        async_activation ^= activation->GetAsyncAwaiter(&caller_closure_finder);
+        async_stack_trace ^= activation->GetCausalStack();
+        found_async_awaiter = true;
+      } else {
+        stack_trace->AddActivation(CollectDartFrame(isolate, it.pc(), frame,
+                                                    inlined_code, deopt_frame,
+                                                    deopt_frame_offset));
+      }
+    }
+
+    // Break out of outer loop.
+    if (found_async_awaiter || abort_attempt_to_navigate_through_sync_async) {
+      break;
     }
   }
 
-  // If the stack doesn't have any async functions on it, return NULL.
+  // If the stack doesn't have any async functions on it, return nullptr.
   if (!stack_has_async_function) {
-    return NULL;
+    return nullptr;
   }
 
   // Append the awaiter return call stack.
-  while (!async_activation.IsNull()) {
+  while (!async_activation.IsNull() &&
+         async_activation.context() != Object::null()) {
     ActivationFrame* activation = new (zone) ActivationFrame(async_activation);
+
+    if (!(activation->function().IsAsyncClosure() ||
+          activation->function().IsAsyncGenClosure())) {
+      // No more awaiters. Extract the causal stack trace (if it exists).
+      async_stack_trace ^= activation->GetCausalStack();
+      break;
+    }
+
     activation->ExtractTokenPositionFromAsyncClosure();
     stack_trace->AddActivation(activation);
     if (FLAG_trace_debugger_stacktrace) {
@@ -2562,12 +2121,14 @@
           "closures:\n\t%s\n",
           activation->function().ToFullyQualifiedCString());
     }
-    next_async_activation = activation->GetAsyncAwaiter();
+
+    next_async_activation = activation->GetAsyncAwaiter(&caller_closure_finder);
     if (next_async_activation.IsNull()) {
       // No more awaiters. Extract the causal stack trace (if it exists).
       async_stack_trace ^= activation->GetCausalStack();
       break;
     }
+
     async_activation = Closure::RawCast(next_async_activation.raw());
   }
 
@@ -2576,52 +2137,42 @@
   // activated.
   while (!async_stack_trace.IsNull()) {
     for (intptr_t i = 0; i < async_stack_trace.Length(); i++) {
-      if (async_stack_trace.CodeAtFrame(i) == Code::null()) {
+      code_object = async_stack_trace.CodeAtFrame(i);
+
+      if (code_object.raw() == Code::null()) {
         // Incomplete OutOfMemory/StackOverflow trace OR array padding.
         break;
       }
-      if (async_stack_trace.CodeAtFrame(i) ==
-          StubCode::AsynchronousGapMarker().raw()) {
+
+      if (code_object.raw() == StubCode::AsynchronousGapMarker().raw()) {
         stack_trace->AddMarker(ActivationFrame::kAsyncSuspensionMarker);
         // The frame immediately below the asynchronous gap marker is the
         // identical to the frame above the marker. Skip the frame to enhance
         // the readability of the trace.
         i++;
-      } else {
-        code_object = async_stack_trace.CodeAtFrame(i);
-        offset = Smi::RawCast(async_stack_trace.PcOffsetAtFrame(i));
-        if (code_object.IsBytecode()) {
-          bytecode ^= code_object.raw();
-          if (FLAG_trace_debugger_stacktrace) {
-            OS::PrintErr("CollectAwaiterReturnStackTrace: visiting frame %" Pd
-                         " in async causal stack trace:\n\t%s\n",
-                         i,
-                         Function::Handle(bytecode.function())
-                             .ToFullyQualifiedCString());
-          }
-          uword pc = bytecode.PayloadStart() + offset.Value();
-          stack_trace->AddAsyncCausalFrame(pc, bytecode);
-        } else {
-          code ^= code_object.raw();
-          if (FLAG_trace_debugger_stacktrace) {
-            OS::PrintErr(
-                "CollectAwaiterReturnStackTrace: visiting frame %" Pd
-                " in async causal stack trace:\n\t%s\n",
-                i, Function::Handle(code.function()).ToFullyQualifiedCString());
-          }
-          uword pc = code.PayloadStart() + offset.Value();
-          if (code.is_optimized()) {
-            for (InlinedFunctionsIterator it(code, pc); !it.Done();
-                 it.Advance()) {
-              inlined_code = it.code();
-              stack_trace->AddAsyncCausalFrame(it.pc(), inlined_code);
-            }
-          } else {
-            stack_trace->AddAsyncCausalFrame(pc, code);
-          }
+        continue;
+      }
+
+      code_object = async_stack_trace.CodeAtFrame(i);
+      offset = Smi::RawCast(async_stack_trace.PcOffsetAtFrame(i));
+      code ^= code_object.raw();
+      if (FLAG_trace_debugger_stacktrace) {
+        OS::PrintErr(
+            "CollectAwaiterReturnStackTrace: visiting frame %" Pd
+            " in async causal stack trace:\n\t%s\n",
+            i, Function::Handle(code.function()).ToFullyQualifiedCString());
+      }
+      uword pc = code.PayloadStart() + offset.Value();
+      if (code.is_optimized()) {
+        for (InlinedFunctionsIterator it(code, pc); !it.Done(); it.Advance()) {
+          inlined_code = it.code();
+          stack_trace->AddAsyncCausalFrame(it.pc(), inlined_code);
         }
+      } else {
+        stack_trace->AddAsyncCausalFrame(pc, code);
       }
     }
+
     // Follow the link.
     async_stack_trace = async_stack_trace.async_link();
   }
@@ -2641,19 +2192,6 @@
     if (!frame->IsDartFrame()) {
       continue;
     }
-#if !defined(DART_PRECOMPILED_RUNTIME)
-    if (frame->is_interpreted()) {
-      Bytecode& bytecode = Bytecode::Handle(frame->LookupDartBytecode());
-      // Note that we do not skip bytecode stub frame (with a null function),
-      // so that we can ignore a single stepping breakpoint in such a frame.
-      // A bytecode stub contains a VM internal bytecode followed by a
-      // ReturnTOS bytecode. The single step on the ReturnTOS bytecode
-      // needs to be skipped.
-      ActivationFrame* activation =
-          new ActivationFrame(frame->pc(), frame->fp(), frame->sp(), bytecode);
-      return activation;
-    }
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
     Code& code = Code::Handle(frame->LookupDartCode());
     ActivationFrame* activation = new ActivationFrame(
         frame->pc(), frame->fp(), frame->sp(), code, Object::null_array(), 0);
@@ -2692,9 +2230,6 @@
   Function& function = Function::Handle();
   Object& code_object = Object::Handle();
   Code& code = Code::Handle();
-#if !defined(DART_PRECOMPILED_RUNTIME)
-  Bytecode& bytecode = Bytecode::Handle();
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
 
   const uword fp = 0;
   const uword sp = 0;
@@ -2709,51 +2244,33 @@
     // fewer frames that the pre-allocated trace (such as memory exhaustion with
     // a shallow stack).
     if (!code_object.IsNull()) {
-      if (code_object.IsBytecode()) {
-#if !defined(DART_PRECOMPILED_RUNTIME)
-        bytecode ^= code_object.raw();
-        function = bytecode.function();
-        // Skip bytecode stub frames and frames with invisible function.
-        if (!function.IsNull() && function.is_visible()) {
-          ASSERT(function.raw() == bytecode.function());
-          uword pc =
-              bytecode.PayloadStart() + Smi::Value(ex_trace.PcOffsetAtFrame(i));
-          ActivationFrame* activation =
-              new ActivationFrame(pc, fp, sp, bytecode);
-          stack_trace->AddActivation(activation);
-        }
-#else
-        UNREACHABLE();
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-      } else {
-        code ^= code_object.raw();
-        ASSERT(code.IsFunctionCode());
-        function = code.function();
-        if (function.is_visible()) {
-          ASSERT(function.raw() == code.function());
-          uword pc =
-              code.PayloadStart() + Smi::Value(ex_trace.PcOffsetAtFrame(i));
-          if (code.is_optimized() && ex_trace.expand_inlined()) {
-            // Traverse inlined frames.
-            for (InlinedFunctionsIterator it(code, pc); !it.Done();
-                 it.Advance()) {
-              function = it.function();
-              code = it.code();
-              ASSERT(function.raw() == code.function());
-              uword pc = it.pc();
-              ASSERT(pc != 0);
-              ASSERT(code.PayloadStart() <= pc);
-              ASSERT(pc < (code.PayloadStart() + code.Size()));
+      code ^= code_object.raw();
+      ASSERT(code.IsFunctionCode());
+      function = code.function();
+      if (function.is_visible()) {
+        ASSERT(function.raw() == code.function());
+        uword pc =
+            code.PayloadStart() + Smi::Value(ex_trace.PcOffsetAtFrame(i));
+        if (code.is_optimized() && ex_trace.expand_inlined()) {
+          // Traverse inlined frames.
+          for (InlinedFunctionsIterator it(code, pc); !it.Done();
+               it.Advance()) {
+            function = it.function();
+            code = it.code();
+            ASSERT(function.raw() == code.function());
+            uword pc = it.pc();
+            ASSERT(pc != 0);
+            ASSERT(code.PayloadStart() <= pc);
+            ASSERT(pc < (code.PayloadStart() + code.Size()));
 
-              ActivationFrame* activation = new ActivationFrame(
-                  pc, fp, sp, code, deopt_frame, deopt_frame_offset);
-              stack_trace->AddActivation(activation);
-            }
-          } else {
             ActivationFrame* activation = new ActivationFrame(
                 pc, fp, sp, code, deopt_frame, deopt_frame_offset);
             stack_trace->AddActivation(activation);
           }
+        } else {
+          ActivationFrame* activation = new ActivationFrame(
+              pc, fp, sp, code, deopt_frame, deopt_frame_offset);
+          stack_trace->AddActivation(activation);
         }
       }
     }
@@ -2932,8 +2449,7 @@
 // algorithm, which would be simpler.  I believe that it only needs
 // two passes to support the recursive try-the-whole-function case.
 // Rewrite this later, once there are more tests in place.
-TokenPosition Debugger::ResolveBreakpointPos(bool in_bytecode,
-                                             const Function& func,
+TokenPosition Debugger::ResolveBreakpointPos(const Function& func,
                                              TokenPosition requested_token_pos,
                                              TokenPosition last_token_pos,
                                              intptr_t requested_column,
@@ -2950,24 +2466,11 @@
   Zone* zone = Thread::Current()->zone();
   Script& script = Script::Handle(zone, func.script());
   Code& code = Code::Handle(zone);
-#if !defined(DART_PRECOMPILED_RUNTIME)
-  Bytecode& bytecode = Bytecode::Handle(zone);
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
   PcDescriptors& desc = PcDescriptors::Handle(zone);
-  if (in_bytecode) {
-#if !defined(DART_PRECOMPILED_RUNTIME)
-    ASSERT(func.HasBytecode());
-    bytecode = func.bytecode();
-    ASSERT(!bytecode.IsNull());
-#else
-    UNREACHABLE();
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-  } else {
-    ASSERT(func.HasCode());
-    code = func.unoptimized_code();
-    ASSERT(!code.IsNull());
-    desc = code.pc_descriptors();
-  }
+  ASSERT(func.HasCode());
+  code = func.unoptimized_code();
+  ASSERT(!code.IsNull());
+  desc = code.pc_descriptors();
 
   // First pass: find the safe point which is closest to the beginning
   // of the given token range.
@@ -2978,96 +2481,29 @@
   // if column number is provided.
   TokenPosition best_token_pos = TokenPosition::kNoSource;
 
-  if (in_bytecode) {
-#if !defined(DART_PRECOMPILED_RUNTIME)
-    kernel::BytecodeSourcePositionsIterator iter(zone, bytecode);
-    uword pc_offset = kUwordMax;
-    TokenPosition pos = TokenPosition::kNoSource;
-    // Ignore all possible breakpoint positions until the first DebugCheck
-    // opcode of the function.
-    const uword debug_check_pc = bytecode.GetFirstDebugCheckOpcodePc();
-    if (debug_check_pc != 0) {
-      const uword debug_check_pc_offset =
-          debug_check_pc - bytecode.PayloadStart();
-      while (iter.MoveNext()) {
-        if (pc_offset != kUwordMax) {
-          // Check that there is at least one 'debug checked' opcode in the last
-          // source position range.
-          uword pc = bytecode.GetDebugCheckedOpcodeReturnAddress(
-              pc_offset, iter.PcOffset());
-          pc_offset = kUwordMax;
-          if (pc != 0) {
-            TokenPosition next_closest_token_position =
-                TokenPosition::kMaxSource;
-            if (requested_column >= 0) {
-              kernel::BytecodeSourcePositionsIterator iter2(zone, bytecode);
-              TokenPosition next_closest_token_position =
-                  TokenPosition::kMaxSource;
-              while (iter2.MoveNext()) {
-                const TokenPosition next = iter2.TokenPos();
-                if (next.IsReal() && next < next_closest_token_position &&
-                    next > pos) {
-                  next_closest_token_position = next;
-                }
-              }
-            }
-            RefineBreakpointPos(
-                script, pos, next_closest_token_position, requested_token_pos,
-                last_token_pos, requested_column, exact_token_pos,
-                &best_fit_pos, &best_column, &best_line, &best_token_pos);
-          }
-        }
-        pos = iter.TokenPos();
-        if ((!pos.IsReal()) || (pos < requested_token_pos) ||
-            (pos > last_token_pos)) {
-          // Token is not in the target range.
-          continue;
-        }
-        pc_offset = iter.PcOffset();
-        if (pc_offset < debug_check_pc_offset) {
-          // No breakpoints in prologue.
-          pc_offset = debug_check_pc_offset;
-        }
-      }
-      if (pc_offset != kUwordMax) {
-        uword pc = bytecode.GetDebugCheckedOpcodeReturnAddress(pc_offset,
-                                                               bytecode.Size());
-        if (pc != 0) {
-          RefineBreakpointPos(script, pos, TokenPosition::kMaxSource,
-                              requested_token_pos, last_token_pos,
-                              requested_column, exact_token_pos, &best_fit_pos,
-                              &best_column, &best_line, &best_token_pos);
+  PcDescriptors::Iterator iter(desc, kSafepointKind);
+  while (iter.MoveNext()) {
+    const TokenPosition pos = iter.TokenPos();
+    if ((!pos.IsReal()) || (pos < requested_token_pos) ||
+        (pos > last_token_pos)) {
+      // Token is not in the target range.
+      continue;
+    }
+    TokenPosition next_closest_token_position = TokenPosition::kMaxSource;
+    if (requested_column >= 0) {
+      // Find next closest safepoint
+      PcDescriptors::Iterator iter2(desc, kSafepointKind);
+      while (iter2.MoveNext()) {
+        const TokenPosition next = iter2.TokenPos();
+        if (next < next_closest_token_position && next > pos) {
+          next_closest_token_position = next;
         }
       }
     }
-#else
-    UNREACHABLE();
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-  } else {
-    PcDescriptors::Iterator iter(desc, kSafepointKind);
-    while (iter.MoveNext()) {
-      const TokenPosition pos = iter.TokenPos();
-      if ((!pos.IsReal()) || (pos < requested_token_pos) ||
-          (pos > last_token_pos)) {
-        // Token is not in the target range.
-        continue;
-      }
-      TokenPosition next_closest_token_position = TokenPosition::kMaxSource;
-      if (requested_column >= 0) {
-        // Find next closest safepoint
-        PcDescriptors::Iterator iter2(desc, kSafepointKind);
-        while (iter2.MoveNext()) {
-          const TokenPosition next = iter2.TokenPos();
-          if (next < next_closest_token_position && next > pos) {
-            next_closest_token_position = next;
-          }
-        }
-      }
-      RefineBreakpointPos(script, pos, next_closest_token_position,
-                          requested_token_pos, last_token_pos, requested_column,
-                          exact_token_pos, &best_fit_pos, &best_column,
-                          &best_line, &best_token_pos);
-    }
+    RefineBreakpointPos(script, pos, next_closest_token_position,
+                        requested_token_pos, last_token_pos, requested_column,
+                        exact_token_pos, &best_fit_pos, &best_column,
+                        &best_line, &best_token_pos);
   }
 
   // Second pass (if we found a safe point in the first pass).  Find
@@ -3089,51 +2525,24 @@
     }
 
     uword lowest_pc_offset = kUwordMax;
-    if (in_bytecode) {
-#if !defined(DART_PRECOMPILED_RUNTIME)
-      kernel::BytecodeSourcePositionsIterator iter(zone, bytecode);
-      while (iter.MoveNext()) {
-        const TokenPosition pos = iter.TokenPos();
-        if (!pos.IsReal() || (pos < begin_pos) || (pos > end_of_line_pos)) {
-          // Token is not on same line as best fit.
+    PcDescriptors::Iterator iter(desc, kSafepointKind);
+    while (iter.MoveNext()) {
+      const TokenPosition pos = iter.TokenPos();
+      if (!pos.IsReal() || (pos < begin_pos) || (pos > end_of_line_pos)) {
+        // Token is not on same line as best fit.
+        continue;
+      }
+
+      if (requested_column >= 0) {
+        if (pos != best_token_pos) {
           continue;
         }
-
-        if (requested_column >= 0) {
-          if (pos != best_token_pos) {
-            continue;
-          }
-        }
-
-        // Prefer the lowest pc offset.
-        if (iter.PcOffset() < lowest_pc_offset) {
-          lowest_pc_offset = iter.PcOffset();
-          best_fit_pos = pos;
-        }
       }
-#else
-      UNREACHABLE();
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-    } else {
-      PcDescriptors::Iterator iter(desc, kSafepointKind);
-      while (iter.MoveNext()) {
-        const TokenPosition pos = iter.TokenPos();
-        if (!pos.IsReal() || (pos < begin_pos) || (pos > end_of_line_pos)) {
-          // Token is not on same line as best fit.
-          continue;
-        }
 
-        if (requested_column >= 0) {
-          if (pos != best_token_pos) {
-            continue;
-          }
-        }
-
-        // Prefer the lowest pc offset.
-        if (iter.PcOffset() < lowest_pc_offset) {
-          lowest_pc_offset = iter.PcOffset();
-          best_fit_pos = pos;
-        }
+      // Prefer the lowest pc offset.
+      if (iter.PcOffset() < lowest_pc_offset) {
+        lowest_pc_offset = iter.PcOffset();
+        best_fit_pos = pos;
       }
     }
     return best_fit_pos;
@@ -3144,9 +2553,8 @@
   // Since we have moved to the next line of the function, we no
   // longer are requesting a specific column number.
   if (last_token_pos < func.end_token_pos()) {
-    return ResolveBreakpointPos(in_bytecode, func, last_token_pos,
-                                func.end_token_pos(), -1 /* no column */,
-                                TokenPosition::kNoSource);
+    return ResolveBreakpointPos(func, last_token_pos, func.end_token_pos(),
+                                -1 /* no column */, TokenPosition::kNoSource);
   }
   return TokenPosition::kNoSource;
 }
@@ -3156,105 +2564,41 @@
   ASSERT(loc->token_pos_.IsReal());
   ASSERT((loc != NULL) && loc->IsResolved());
   ASSERT(!func.HasOptimizedCode());
-  ASSERT(func.HasCode() || func.HasBytecode());
-#if !defined(DART_PRECOMPILED_RUNTIME)
-  if (func.HasBytecode() && FLAG_enable_interpreter) {
-    Bytecode& bytecode = Bytecode::Handle(func.bytecode());
-    ASSERT(!bytecode.IsNull());
-    uword pc = 0;
-    if (bytecode.HasSourcePositions()) {
-      kernel::BytecodeSourcePositionsIterator iter(Thread::Current()->zone(),
-                                                   bytecode);
-      // Ignore all possible breakpoint positions until the first DebugCheck
-      // opcode of the function.
-      const uword debug_check_pc = bytecode.GetFirstDebugCheckOpcodePc();
-      if (debug_check_pc != 0) {
-        const uword debug_check_pc_offset =
-            debug_check_pc - bytecode.PayloadStart();
-        uword pc_offset = kUwordMax;
-        while (iter.MoveNext()) {
-          if (pc_offset != kUwordMax) {
-            pc = bytecode.GetDebugCheckedOpcodeReturnAddress(pc_offset,
-                                                             iter.PcOffset());
-            pc_offset = kUwordMax;
-            if (pc != 0) {
-              // TODO(regis): We may want to find all PCs for a token position,
-              // e.g. in the case of duplicated bytecode in finally clauses.
-              break;
-            }
-            // This range does not contain a 'debug checked' opcode or the
-            // first DebugCheck opcode of the function is not reached yet.
-          }
-          if (iter.TokenPos() == loc->token_pos_) {
-            pc_offset = iter.PcOffset();
-            if (pc_offset < debug_check_pc_offset) {
-              // No breakpoints in prologue.
-              pc_offset = debug_check_pc_offset;
-            }
-          }
-        }
-        if (pc_offset != kUwordMax) {
-          pc = bytecode.GetDebugCheckedOpcodeReturnAddress(pc_offset,
-                                                           bytecode.Size());
-        }
-      }
-    }
-    if (pc != 0) {
-      CodeBreakpoint* code_bpt = GetCodeBreakpoint(pc);
-      if (code_bpt == NULL) {
-        // No code breakpoint for this code exists; create one.
-        code_bpt = new CodeBreakpoint(bytecode, loc->token_pos_, pc);
-        if (FLAG_verbose_debug) {
-          OS::PrintErr("Setting bytecode breakpoint at pos %s pc %#" Px
-                       " offset %#" Px "\n",
-                       loc->token_pos_.ToCString(), pc,
-                       pc - bytecode.PayloadStart());
-        }
-        RegisterCodeBreakpoint(code_bpt);
-      }
-      code_bpt->set_bpt_location(loc);
-      if (loc->AnyEnabled()) {
-        code_bpt->Enable();
+  ASSERT(func.HasCode());
+  Code& code = Code::Handle(func.unoptimized_code());
+  ASSERT(!code.IsNull());
+  PcDescriptors& desc = PcDescriptors::Handle(code.pc_descriptors());
+  uword lowest_pc_offset = kUwordMax;
+  PcDescriptorsLayout::Kind lowest_kind = PcDescriptorsLayout::kAnyKind;
+  // Find the safe point with the lowest compiled code address
+  // that maps to the token position of the source breakpoint.
+  PcDescriptors::Iterator iter(desc, kSafepointKind);
+  while (iter.MoveNext()) {
+    if (iter.TokenPos() == loc->token_pos_) {
+      if (iter.PcOffset() < lowest_pc_offset) {
+        lowest_pc_offset = iter.PcOffset();
+        lowest_kind = iter.Kind();
       }
     }
   }
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-  if (func.HasCode()) {
-    Code& code = Code::Handle(func.unoptimized_code());
-    ASSERT(!code.IsNull());
-    PcDescriptors& desc = PcDescriptors::Handle(code.pc_descriptors());
-    uword lowest_pc_offset = kUwordMax;
-    PcDescriptorsLayout::Kind lowest_kind = PcDescriptorsLayout::kAnyKind;
-    // Find the safe point with the lowest compiled code address
-    // that maps to the token position of the source breakpoint.
-    PcDescriptors::Iterator iter(desc, kSafepointKind);
-    while (iter.MoveNext()) {
-      if (iter.TokenPos() == loc->token_pos_) {
-        if (iter.PcOffset() < lowest_pc_offset) {
-          lowest_pc_offset = iter.PcOffset();
-          lowest_kind = iter.Kind();
-        }
+  if (lowest_pc_offset != kUwordMax) {
+    uword lowest_pc = code.PayloadStart() + lowest_pc_offset;
+    CodeBreakpoint* code_bpt = GetCodeBreakpoint(lowest_pc);
+    if (code_bpt == NULL) {
+      // No code breakpoint for this code exists; create one.
+      code_bpt =
+          new CodeBreakpoint(code, loc->token_pos_, lowest_pc, lowest_kind);
+      if (FLAG_verbose_debug) {
+        OS::PrintErr("Setting code breakpoint at pos %s pc %#" Px
+                     " offset %#" Px "\n",
+                     loc->token_pos_.ToCString(), lowest_pc,
+                     lowest_pc - code.PayloadStart());
       }
+      RegisterCodeBreakpoint(code_bpt);
     }
-    if (lowest_pc_offset != kUwordMax) {
-      uword lowest_pc = code.PayloadStart() + lowest_pc_offset;
-      CodeBreakpoint* code_bpt = GetCodeBreakpoint(lowest_pc);
-      if (code_bpt == NULL) {
-        // No code breakpoint for this code exists; create one.
-        code_bpt =
-            new CodeBreakpoint(code, loc->token_pos_, lowest_pc, lowest_kind);
-        if (FLAG_verbose_debug) {
-          OS::PrintErr("Setting code breakpoint at pos %s pc %#" Px
-                       " offset %#" Px "\n",
-                       loc->token_pos_.ToCString(), lowest_pc,
-                       lowest_pc - code.PayloadStart());
-        }
-        RegisterCodeBreakpoint(code_bpt);
-      }
-      code_bpt->set_bpt_location(loc);
-      if (loc->AnyEnabled()) {
-        code_bpt->Enable();
-      }
+    code_bpt->set_bpt_location(loc);
+    if (loc->AnyEnabled()) {
+      code_bpt->Enable();
     }
   }
 }
@@ -3263,9 +2607,9 @@
     const Script& script,
     TokenPosition start_pos,
     TokenPosition end_pos,
-    GrowableObjectArray* bytecode_function_list,
     GrowableObjectArray* code_function_list) {
-  Zone* zone = Thread::Current()->zone();
+  Thread* thread = Thread::Current();
+  Zone* zone = thread->zone();
   Class& cls = Class::Handle(zone);
   Array& functions = Array::Handle(zone);
   GrowableObjectArray& closures = GrowableObjectArray::Handle(zone);
@@ -3280,9 +2624,6 @@
         (function.end_token_pos() == end_pos) &&
         (function.script() == script.raw())) {
       if (function.is_debuggable()) {
-        if (FLAG_enable_interpreter && function.HasBytecode()) {
-          bytecode_function_list->Add(function);
-        }
         if (function.HasCode()) {
           code_function_list->Add(function);
         }
@@ -3290,9 +2631,6 @@
       if (function.HasImplicitClosureFunction()) {
         function = function.ImplicitClosureFunction();
         if (function.is_debuggable()) {
-          if (FLAG_enable_interpreter && function.HasBytecode()) {
-            bytecode_function_list->Add(function);
-          }
           if (function.HasCode()) {
             code_function_list->Add(function);
           }
@@ -3319,36 +2657,24 @@
       // Note: we need to check the functions of this class even if
       // the class is defined in a different 'script'. There could
       // be mixin functions from the given script in this class.
-      functions = cls.functions();
+      functions = cls.current_functions();
       if (!functions.IsNull()) {
         const intptr_t num_functions = functions.Length();
         for (intptr_t pos = 0; pos < num_functions; pos++) {
           function ^= functions.At(pos);
           ASSERT(!function.IsNull());
           bool function_added = false;
-          if (function.is_debuggable() &&
-              (function.HasCode() ||
-               (FLAG_enable_interpreter && function.HasBytecode())) &&
+          if (function.is_debuggable() && function.HasCode() &&
               function.token_pos() == start_pos &&
               function.end_token_pos() == end_pos &&
               function.script() == script.raw()) {
-            if (FLAG_enable_interpreter && function.HasBytecode()) {
-              bytecode_function_list->Add(function);
-            }
-            if (function.HasCode()) {
-              code_function_list->Add(function);
-            }
+            code_function_list->Add(function);
             function_added = true;
           }
           if (function_added && function.HasImplicitClosureFunction()) {
             function = function.ImplicitClosureFunction();
-            if (function.is_debuggable()) {
-              if (FLAG_enable_interpreter && function.HasBytecode()) {
-                bytecode_function_list->Add(function);
-              }
-              if (function.HasCode()) {
-                code_function_list->Add(function);
-              }
+            if (function.is_debuggable() && function.HasCode()) {
+              code_function_list->Add(function);
             }
           }
         }
@@ -3458,7 +2784,7 @@
         // is no longjump base on the stack.
         continue;
       }
-      functions = cls.functions();
+      functions = cls.current_functions();
       if (!functions.IsNull()) {
         const intptr_t num_functions = functions.Length();
         for (intptr_t pos = 0; pos < num_functions; pos++) {
@@ -3514,8 +2840,6 @@
 }
 
 BreakpointLocation* Debugger::SetCodeBreakpoints(
-    bool in_bytecode,
-    BreakpointLocation* loc,
     const Script& script,
     TokenPosition token_pos,
     TokenPosition last_token_pos,
@@ -3523,24 +2847,18 @@
     intptr_t requested_column,
     TokenPosition exact_token_pos,
     const GrowableObjectArray& functions) {
-  ASSERT(!in_bytecode || FLAG_enable_interpreter);
   Function& function = Function::Handle();
   function ^= functions.At(0);
-  TokenPosition breakpoint_pos =
-      ResolveBreakpointPos(in_bytecode, function, token_pos, last_token_pos,
-                           requested_column, exact_token_pos);
+  TokenPosition breakpoint_pos = ResolveBreakpointPos(
+      function, token_pos, last_token_pos, requested_column, exact_token_pos);
   if (!breakpoint_pos.IsReal()) {
     return NULL;
   }
-  if (loc == NULL) {
-    // Find an existing resolved breakpoint location.
-    loc = GetBreakpointLocation(
-        script, TokenPosition::kNoSource,
-        /* requested_line = */ -1,
-        /* requested_column = */ -1,
-        in_bytecode ? breakpoint_pos : TokenPosition::kNoSource,
-        !in_bytecode ? breakpoint_pos : TokenPosition::kNoSource);
-  }
+  // Find an existing resolved breakpoint location.
+  BreakpointLocation* loc =
+      GetBreakpointLocation(script, TokenPosition::kNoSource,
+                            /* requested_line = */ -1,
+                            /* requested_column = */ -1, breakpoint_pos);
   if (loc == NULL) {
     // Find an existing unresolved breakpoint location.
     loc = GetBreakpointLocation(script, token_pos, requested_line,
@@ -3552,28 +2870,26 @@
     RegisterBreakpointLocation(loc);
   }
   // A source breakpoint for this location may already exists, but it may
-  // not yet be resolved in both bytecode and code.
-  if (loc->IsResolved(in_bytecode)) {
+  // not yet be resolved in code.
+  if (loc->IsResolved()) {
     return loc;
   }
-  loc->SetResolved(in_bytecode, function, breakpoint_pos);
+  loc->SetResolved(function, breakpoint_pos);
 
   // Create code breakpoints for all compiled functions we found.
   Function& func = Function::Handle();
   const intptr_t num_functions = functions.Length();
   for (intptr_t i = 0; i < num_functions; i++) {
     func ^= functions.At(i);
-    ASSERT((in_bytecode && func.HasBytecode()) ||
-           (!in_bytecode && func.HasCode()));
+    ASSERT(func.HasCode());
     MakeCodeBreakpointAt(func, loc);
   }
   if (FLAG_verbose_debug) {
     intptr_t line_number;
     intptr_t column_number;
     script.GetTokenLocation(breakpoint_pos, &line_number, &column_number);
-    OS::PrintErr("Resolved %s breakpoint for function '%s' at line %" Pd
+    OS::PrintErr("Resolved code breakpoint for function '%s' at line %" Pd
                  " col %" Pd "\n",
-                 in_bytecode ? "bytecode" : "code",
                  func.ToFullyQualifiedCString(), line_number, column_number);
   }
   return loc;
@@ -3594,7 +2910,7 @@
   } else {
     func = function.raw();
     if (!func.token_pos().IsReal()) {
-      return NULL;  // Missing source positions in bytecode?
+      return NULL;  // Missing source positions?
     }
   }
   if (!func.IsNull()) {
@@ -3603,14 +2919,12 @@
     // there may be copies of mixin functions. Collect all compiled
     // functions whose source code range matches exactly the best fit
     // function we found.
-    GrowableObjectArray& bytecode_functions =
-        GrowableObjectArray::Handle(GrowableObjectArray::New());
     GrowableObjectArray& code_functions =
         GrowableObjectArray::Handle(GrowableObjectArray::New());
     FindCompiledFunctions(script, func.token_pos(), func.end_token_pos(),
-                          &bytecode_functions, &code_functions);
+                          &code_functions);
 
-    if (bytecode_functions.Length() > 0 || code_functions.Length() > 0) {
+    if (code_functions.Length() > 0) {
       // One or more function object containing this breakpoint location
       // have already been compiled. We can resolve the breakpoint now.
       // If requested_column is larger than zero, [token_pos, last_token_pos]
@@ -3623,19 +2937,9 @@
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
       }
       DeoptimizeWorld();
-      // Since source positions may differ in code and bytecode, process
-      // breakpoints in bytecode and code separately.
-      BreakpointLocation* loc = NULL;
-      if (bytecode_functions.Length() > 0) {
-        loc = SetCodeBreakpoints(true, loc, script, token_pos, last_token_pos,
-                                 requested_line, requested_column,
-                                 exact_token_pos, bytecode_functions);
-      }
-      if (code_functions.Length() > 0) {
-        loc = SetCodeBreakpoints(false, loc, script, token_pos, last_token_pos,
-                                 requested_line, requested_column,
-                                 exact_token_pos, code_functions);
-      }
+      BreakpointLocation* loc =
+          SetCodeBreakpoints(script, token_pos, last_token_pos, requested_line,
+                             requested_column, exact_token_pos, code_functions);
       if (loc != NULL) {
         return loc;
       }
@@ -3955,7 +3259,9 @@
     return;
   }
   if (stack_trace_->Length() > 0) {
-    top_frame_awaiter_ = stack_trace_->FrameAt(0)->GetAsyncAwaiter();
+    CallerClosureFinder caller_closure_finder(Thread::Current()->zone());
+    top_frame_awaiter_ =
+        stack_trace_->FrameAt(0)->GetAsyncAwaiter(&caller_closure_finder);
   } else {
     top_frame_awaiter_ = Object::null();
   }
@@ -3969,7 +3275,6 @@
       (stack_trace->FrameAt(0)->function().IsAsyncClosure() ||
        stack_trace->FrameAt(0)->function().IsAsyncGenClosure())) {
     async_stepping_fp_ = stack_trace->FrameAt(0)->fp();
-    interpreted_async_stepping_ = stack_trace->FrameAt(0)->IsInterpreted();
   } else {
     async_stepping_fp_ = 0;
   }
@@ -3978,7 +3283,6 @@
 void Debugger::SetSyncSteppingFramePointer(DebuggerStackTrace* stack_trace) {
   if (stack_trace->Length() > 0) {
     stepping_fp_ = stack_trace->FrameAt(0)->fp();
-    interpreted_stepping_ = stack_trace->FrameAt(0)->IsInterpreted();
   } else {
     stepping_fp_ = 0;
   }
@@ -4014,9 +3318,10 @@
     if (FLAG_async_debugger) {
       if (stack_trace->FrameAt(0)->function().IsAsyncClosure() ||
           stack_trace->FrameAt(0)->function().IsAsyncGenClosure()) {
+        CallerClosureFinder caller_closure_finder(Thread::Current()->zone());
         // Request to step out of an async/async* closure.
-        const Object& async_op =
-            Object::Handle(stack_trace->FrameAt(0)->GetAsyncAwaiter());
+        const Object& async_op = Object::Handle(
+            stack_trace->FrameAt(0)->GetAsyncAwaiter(&caller_closure_finder));
         if (!async_op.IsNull()) {
           // Step out to the awaiter.
           ASSERT(async_op.IsClosure());
@@ -4038,7 +3343,6 @@
       ActivationFrame* frame = stack_trace->FrameAt(i);
       if (frame->IsDebuggable()) {
         stepping_fp_ = frame->fp();
-        interpreted_stepping_ = frame->IsInterpreted();
         break;
       }
     }
@@ -4162,33 +3466,10 @@
   return 0;
 }
 
-// Given a return address, find the "rewind" pc, which is the pc
-// before the corresponding call.
-static uword LookupRewindPc(const Bytecode& bytecode, uword return_address) {
-#if defined(DART_PRECOMPILED_RUNTIME)
-  UNREACHABLE();
-#else
-  ASSERT(bytecode.ContainsInstructionAt(return_address));
-  uword pc = bytecode.PayloadStart();
-  const uword end_pc = pc + bytecode.Size();
-  while (pc < end_pc) {
-    uword next_pc = KernelBytecode::Next(pc);
-    if (next_pc == return_address) {
-      return pc;
-    }
-    pc = next_pc;
-  }
-  return 0;
-#endif
-}
-
 void Debugger::RewindToFrame(intptr_t frame_index) {
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
   Code& code = Code::Handle(zone);
-#if !defined(DART_PRECOMPILED_RUNTIME)
-  Bytecode& bytecode = Bytecode::Handle(zone);
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
   Function& function = Function::Handle(zone);
 
   // Find the requested frame.
@@ -4200,47 +3481,29 @@
        frame = iterator.NextFrame()) {
     ASSERT(frame->IsValid());
     if (frame->IsDartFrame()) {
-      if (frame->is_interpreted()) {
-#if !defined(DART_PRECOMPILED_RUNTIME)
-        bytecode = frame->LookupDartBytecode();
-        function = bytecode.function();
-        if (function.IsNull() || !IsFunctionVisible(function)) {
-          continue;  // Skip bytecode stub frame or invisible frame.
-        }
-        if (current_frame == frame_index) {
-          // We are rewinding to an interpreted frame.
-          RewindToInterpretedFrame(frame, bytecode);
-          UNREACHABLE();
-        }
-        current_frame++;
-#else
-        UNREACHABLE();
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-      } else {
-        code = frame->LookupDartCode();
-        function = code.function();
-        if (!IsFunctionVisible(function)) {
-          continue;
-        }
-        if (code.is_optimized()) {
-          intptr_t sub_index = 0;
-          for (InlinedFunctionsIterator it(code, frame->pc()); !it.Done();
-               it.Advance()) {
-            if (current_frame == frame_index) {
-              RewindToOptimizedFrame(frame, code, sub_index);
-              UNREACHABLE();
-            }
-            current_frame++;
-            sub_index++;
-          }
-        } else {
+      code = frame->LookupDartCode();
+      function = code.function();
+      if (!IsFunctionVisible(function)) {
+        continue;
+      }
+      if (code.is_optimized()) {
+        intptr_t sub_index = 0;
+        for (InlinedFunctionsIterator it(code, frame->pc()); !it.Done();
+             it.Advance()) {
           if (current_frame == frame_index) {
-            // We are rewinding to an unoptimized frame.
-            RewindToUnoptimizedFrame(frame, code);
+            RewindToOptimizedFrame(frame, code, sub_index);
             UNREACHABLE();
           }
           current_frame++;
+          sub_index++;
         }
+      } else {
+        if (current_frame == frame_index) {
+          // We are rewinding to an unoptimized frame.
+          RewindToUnoptimizedFrame(frame, code);
+          UNREACHABLE();
+        }
+        current_frame++;
       }
     }
   }
@@ -4303,36 +3566,6 @@
   UNREACHABLE();
 }
 
-void Debugger::RewindToInterpretedFrame(StackFrame* frame,
-                                        const Bytecode& bytecode) {
-  // We will be jumping out of the debugger rather than exiting this
-  // function, so prepare the debugger state.
-  ClearCachedStackTraces();
-  resume_action_ = kContinue;
-  resume_frame_index_ = -1;
-  EnterSingleStepMode();
-
-  uword rewind_pc = LookupRewindPc(bytecode, frame->pc());
-  if (FLAG_trace_rewind && rewind_pc == 0) {
-    OS::PrintErr("Unable to find rewind pc for bytecode pc(%" Px ")\n",
-                 frame->pc());
-  }
-  ASSERT(rewind_pc != 0);
-  if (FLAG_trace_rewind) {
-    OS::PrintErr(
-        "===============================\n"
-        "Rewinding to interpreted frame:\n"
-        "    rewind_pc(0x%" Px " offset:0x%" Px ") sp(0x%" Px ") fp(0x%" Px
-        ")\n"
-        "===============================\n",
-        rewind_pc, rewind_pc - bytecode.PayloadStart(), frame->sp(),
-        frame->fp());
-  }
-  Exceptions::JumpToFrame(Thread::Current(), rewind_pc, frame->sp(),
-                          frame->fp(), true /* clear lazy deopt at target */);
-  UNREACHABLE();
-}
-
 void Debugger::RewindPostDeopt() {
   intptr_t rewind_frame = post_deopt_frame_index_;
   post_deopt_frame_index_ = -1;
@@ -4417,23 +3650,6 @@
            top_frame->function().IsAsyncGenClosure());
     ASSERT(closure_or_null.IsInstance());
     ASSERT(Instance::Cast(closure_or_null).IsClosure());
-    if (top_frame->function().is_declared_in_bytecode()) {
-#if !defined(DART_PRECOMPILED_RUNTIME)
-      const auto& bytecode =
-          Bytecode::Handle(zone, top_frame->function().bytecode());
-      const TokenPosition token_pos = top_frame->TokenPos();
-      kernel::BytecodeSourcePositionsIterator iter(zone, bytecode);
-      while (iter.MoveNext()) {
-        if (iter.IsYieldPoint() && (iter.TokenPos() == token_pos)) {
-          return true;
-        }
-      }
-      return false;
-#else
-      UNREACHABLE();
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-    }
-    ASSERT(!top_frame->IsInterpreted());
     const auto& pc_descriptors =
         PcDescriptors::Handle(zone, top_frame->code().pc_descriptors());
     if (pc_descriptors.IsNull()) {
@@ -4477,7 +3693,7 @@
       // async machinery as we finish the async function. The second check
       // handles the case of returning from an async function.
       const ActivationFrame::Relation relation =
-          frame->CompareTo(async_stepping_fp_, interpreted_async_stepping_);
+          frame->CompareTo(async_stepping_fp_);
       const bool exited_async_function =
           (relation == ActivationFrame::kCallee && frame->IsAsyncMachinery()) ||
           relation == ActivationFrame::kCaller;
@@ -4494,8 +3710,7 @@
   if (stepping_fp_ != 0) {
     // There is an "interesting frame" set. Only pause at appropriate
     // locations in this frame.
-    const ActivationFrame::Relation relation =
-        frame->CompareTo(stepping_fp_, interpreted_stepping_);
+    const ActivationFrame::Relation relation = frame->CompareTo(stepping_fp_);
     if (relation == ActivationFrame::kCallee) {
       // We are in a callee of the frame we're interested in.
       // Ignore this stepping break.
@@ -4517,14 +3732,14 @@
          frame->function().IsAsyncGenerator())) {
       ASSERT(!frame->GetSavedCurrentContext().IsNull());
       ASSERT(frame->GetSavedCurrentContext().num_variables() >
-             Context::kAsyncCompleterIndex);
+             Context::kAsyncFutureIndex);
 
-      const Object& async_completer = Object::Handle(
-          frame->GetSavedCurrentContext().At(Context::kAsyncCompleterIndex));
+      const Object& async_future = Object::Handle(
+          frame->GetSavedCurrentContext().At(Context::kAsyncFutureIndex));
 
       // Only set breakpoint when entering async_op the first time.
-      // :async_completer_var should be uninitialised at this point:
-      if (async_completer.IsNull()) {
+      // :async_future should be uninitialised at this point:
+      if (async_future.IsNull()) {
         const Function& async_op =
             Function::Handle(frame->function().GetGeneratedClosure());
         if (!async_op.IsNull()) {
@@ -4553,17 +3768,6 @@
     return Error::null();
   }
 
-  // In bytecode, do not stop before encountering the DebugCheck opcode.
-  // Skip this check if we previously stopped in this frame.
-  // If no DebugCheck was emitted, do not stop (InPrologue returns true).
-  if (frame->IsInterpreted() && frame->fp() != last_stepping_fp_) {
-    uword debug_check_pc = frame->bytecode().GetFirstDebugCheckOpcodePc();
-    // Frame pc is return address, debug_check_pc is exact, so use '<=' in test.
-    if (debug_check_pc == 0 || frame->pc() <= debug_check_pc) {
-      return Error::null();
-    }
-  }
-
   // We are stopping in this frame at the token pos.
   last_stepping_fp_ = frame->fp();
   last_stepping_pos_ = frame->TokenPos();
@@ -4574,15 +3778,13 @@
   ASSERT(!HasActiveBreakpoint(frame->pc()));
 
   if (FLAG_verbose_debug) {
-    OS::PrintErr(
-        ">>> single step break at %s:%" Pd ":%" Pd
-        " (func %s token %s address %#" Px " offset %#" Px ")\n",
-        String::Handle(frame->SourceUrl()).ToCString(), frame->LineNumber(),
-        frame->ColumnNumber(),
-        String::Handle(frame->QualifiedFunctionName()).ToCString(),
-        frame->TokenPos().ToCString(), frame->pc(),
-        frame->pc() - (frame->IsInterpreted() ? frame->bytecode().PayloadStart()
-                                              : frame->code().PayloadStart()));
+    OS::PrintErr(">>> single step break at %s:%" Pd ":%" Pd
+                 " (func %s token %s address %#" Px " offset %#" Px ")\n",
+                 String::Handle(frame->SourceUrl()).ToCString(),
+                 frame->LineNumber(), frame->ColumnNumber(),
+                 String::Handle(frame->QualifiedFunctionName()).ToCString(),
+                 frame->TokenPos().ToCString(), frame->pc(),
+                 frame->pc() - frame->code().PayloadStart());
   }
 
   CacheStackTraces(CollectStackTrace(), CollectAsyncCausalStackTrace(),
@@ -4635,9 +3837,7 @@
           String::Handle(cbpt->SourceUrl()).ToCString(), cbpt->LineNumber(),
           String::Handle(top_frame->QualifiedFunctionName()).ToCString(),
           cbpt->token_pos().ToCString(), top_frame->pc(),
-          top_frame->pc() - (top_frame->IsInterpreted()
-                                 ? top_frame->bytecode().PayloadStart()
-                                 : top_frame->code().PayloadStart()));
+          top_frame->pc() - top_frame->code().PayloadStart());
     }
 
     ASSERT(synthetic_async_breakpoint_ == NULL);
@@ -4661,9 +3861,7 @@
                  cbpt->LineNumber(),
                  String::Handle(top_frame->QualifiedFunctionName()).ToCString(),
                  cbpt->token_pos().ToCString(), top_frame->pc(),
-                 top_frame->pc() - (top_frame->IsInterpreted()
-                                        ? top_frame->bytecode().PayloadStart()
-                                        : top_frame->code().PayloadStart()));
+                 top_frame->pc() - top_frame->code().PayloadStart());
   }
 
   CacheStackTraces(stack_trace, CollectAsyncCausalStackTrace(),
@@ -4791,15 +3989,11 @@
 }
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
 
-void Debugger::HandleCodeChange(bool bytecode_loaded, const Function& func) {
+void Debugger::NotifyCompilation(const Function& func) {
   if (breakpoint_locations_ == NULL) {
     // Return with minimal overhead if there are no breakpoints.
     return;
   }
-  if (bytecode_loaded && !FLAG_enable_interpreter) {
-    // We do not set breakpoints in bytecode if the interpreter is not used.
-    return;
-  }
   if (!func.is_debuggable()) {
     // Nothing to do if the function is not debuggable. If there is
     // a pending breakpoint in an inner function (that is debuggable),
@@ -4829,50 +4023,23 @@
       const Function& inner_function =
           Function::Handle(zone, FindInnermostClosure(func, token_pos));
       if (!inner_function.IsNull()) {
-        if (bytecode_loaded) {
-          // func's bytecode was just loaded.
-          // If func is a closure and has an inner closure, the inner closure
-          // may not have been loaded yet.
-          if (inner_function.HasBytecode()) {
-            ASSERT(loc->IsResolved(bytecode_loaded));
-          } else {
-            if (FLAG_verbose_debug) {
-              OS::PrintErr(
-                  "Pending breakpoint remains unresolved in "
-                  "inner bytecode function '%s'\n",
-                  inner_function.ToFullyQualifiedCString());
-            }
-          }
-          continue;
-        } else {
-          // func was just compiled.
-          // The local function of a function we just compiled cannot
-          // be compiled already.
-          ASSERT(!inner_function.HasCode());
-          if (FLAG_verbose_debug) {
-            OS::PrintErr(
-                "Pending breakpoint remains unresolved in "
-                "inner function '%s'\n",
-                inner_function.ToFullyQualifiedCString());
-          }
-          continue;
+        if (FLAG_verbose_debug) {
+          OS::PrintErr(
+              "Pending breakpoint remains unresolved in "
+              "inner function '%s'\n",
+              inner_function.ToFullyQualifiedCString());
         }
-
-        // TODO(hausner): What should we do if function is optimized?
-        // Can we deoptimize the function?
-        ASSERT(!func.HasOptimizedCode());
+        continue;
       }
 
       // There is no local function within func that contains the
       // breakpoint token position. Resolve the breakpoint if necessary
       // and set the code breakpoints.
-      const bool resolved_in_bytecode =
-          !bytecode_loaded && loc->IsResolved(/* in_bytecode = */ true);
-      if (!loc->IsResolved(bytecode_loaded)) {
+      if (!loc->IsResolved()) {
         // Resolve source breakpoint in the newly compiled function.
-        TokenPosition bp_pos = ResolveBreakpointPos(
-            bytecode_loaded, func, loc->token_pos(), loc->end_token_pos(),
-            loc->requested_column_number(), token_pos);
+        TokenPosition bp_pos =
+            ResolveBreakpointPos(func, loc->token_pos(), loc->end_token_pos(),
+                                 loc->requested_column_number(), token_pos);
         if (!bp_pos.IsDebugPause()) {
           if (FLAG_verbose_debug) {
             OS::PrintErr("Failed resolving breakpoint for function '%s'\n",
@@ -4882,7 +4049,7 @@
         }
         TokenPosition requested_pos = loc->token_pos();
         TokenPosition requested_end_pos = loc->end_token_pos();
-        loc->SetResolved(bytecode_loaded, func, bp_pos);
+        loc->SetResolved(func, bp_pos);
         Breakpoint* bpt = loc->breakpoints();
         while (bpt != NULL) {
           if (FLAG_verbose_debug) {
@@ -4894,15 +4061,11 @@
                 func.ToFullyQualifiedCString(), requested_pos.ToCString(),
                 requested_end_pos.ToCString(), loc->requested_column_number());
           }
-          // Do not signal resolution in code if already signaled resolution
-          // in bytecode.
-          if (!resolved_in_bytecode) {
-            SendBreakpointEvent(ServiceEvent::kBreakpointResolved, bpt);
-          }
+          SendBreakpointEvent(ServiceEvent::kBreakpointResolved, bpt);
           bpt = bpt->next();
         }
       }
-      ASSERT(loc->IsResolved(bytecode_loaded));
+      ASSERT(loc->IsResolved());
       if (FLAG_verbose_debug) {
         Breakpoint* bpt = loc->breakpoints();
         while (bpt != NULL) {
@@ -5184,7 +4347,6 @@
     TokenPosition token_pos,
     intptr_t requested_line,
     intptr_t requested_column,
-    TokenPosition bytecode_token_pos,
     TokenPosition code_token_pos) {
   BreakpointLocation* loc = breakpoint_locations_;
   while (loc != NULL) {
@@ -5194,8 +4356,6 @@
          (loc->requested_line_number_ == requested_line)) &&
         ((requested_column == -1) ||
          (loc->requested_column_number_ == requested_column)) &&
-        (!bytecode_token_pos.IsReal() ||
-         (loc->bytecode_token_pos_ == bytecode_token_pos)) &&
         (!code_token_pos.IsReal() ||
          (loc->code_token_pos_ == code_token_pos))) {
       return loc;
diff --git a/runtime/vm/debugger.h b/runtime/vm/debugger.h
index ed3760d..e5fd4ac 100644
--- a/runtime/vm/debugger.h
+++ b/runtime/vm/debugger.h
@@ -7,13 +7,14 @@
 
 #include "include/dart_tools_api.h"
 
-#include "vm/constants_kbc.h"
 #include "vm/kernel_isolate.h"
 #include "vm/object.h"
 #include "vm/port.h"
 #include "vm/scopes.h"
 #include "vm/service_event.h"
 #include "vm/simulator.h"
+#include "vm/stack_frame.h"
+#include "vm/stack_trace.h"
 
 DECLARE_FLAG(bool, verbose_debug);
 
@@ -150,21 +151,13 @@
                             bool for_over_await);
 
   bool AnyEnabled() const;
-  bool IsResolved() const {
-    return bytecode_token_pos_.IsReal() || code_token_pos_.IsReal();
-  }
-  bool IsResolved(bool in_bytecode) const {
-    return in_bytecode ? bytecode_token_pos_.IsReal()
-                       : code_token_pos_.IsReal();
-  }
+  bool IsResolved() const { return code_token_pos_.IsReal(); }
   bool IsLatent() const { return !token_pos_.IsReal(); }
 
  private:
   void VisitObjectPointers(ObjectPointerVisitor* visitor);
 
-  void SetResolved(bool in_bytecode,
-                   const Function& func,
-                   TokenPosition token_pos);
+  void SetResolved(const Function& func, TokenPosition token_pos);
 
   BreakpointLocation* next() const { return this->next_; }
   void set_next(BreakpointLocation* value) { next_ = value; }
@@ -185,14 +178,13 @@
 
   // Valid for resolved breakpoints:
   FunctionPtr function_;
-  TokenPosition bytecode_token_pos_;
   TokenPosition code_token_pos_;
 
   friend class Debugger;
   DISALLOW_COPY_AND_ASSIGN(BreakpointLocation);
 };
 
-// CodeBreakpoint represents a location in compiled or interpreted code.
+// CodeBreakpoint represents a location in compiled code.
 // There may be more than one CodeBreakpoint for one BreakpointLocation,
 // e.g. when a function gets compiled as a regular function and as a closure.
 class CodeBreakpoint {
@@ -201,7 +193,6 @@
                  TokenPosition token_pos,
                  uword pc,
                  PcDescriptorsLayout::Kind kind);
-  CodeBreakpoint(const Bytecode& bytecode, TokenPosition token_pos, uword pc);
   ~CodeBreakpoint();
 
   FunctionPtr function() const;
@@ -215,7 +206,6 @@
   void Enable();
   void Disable();
   bool IsEnabled() const { return is_enabled_; }
-  bool IsInterpreted() const { return bytecode_ != Bytecode::null(); }
 
   CodePtr OrigStubAddress() const;
 
@@ -230,11 +220,8 @@
 
   void PatchCode();
   void RestoreCode();
-  void SetBytecodeBreakpoint();
-  void UnsetBytecodeBreakpoint();
 
   CodePtr code_;
-  BytecodePtr bytecode_;
   TokenPosition token_pos_;
   uword pc_;
   intptr_t line_number_;
@@ -271,16 +258,6 @@
 
   ActivationFrame(uword pc, const Code& code);
 
-#if !defined(DART_PRECOMPILED_RUNTIME)
-  ActivationFrame(uword pc,
-                  uword fp,
-                  uword sp,
-                  const Bytecode& bytecode,
-                  Kind kind = kRegular);
-
-  ActivationFrame(uword pc, const Bytecode& bytecode);
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-
   explicit ActivationFrame(Kind kind);
 
   explicit ActivationFrame(const Closure& async_activation);
@@ -288,6 +265,9 @@
   uword pc() const { return pc_; }
   uword fp() const { return fp_; }
   uword sp() const { return sp_; }
+
+  uword GetCallerSp() const { return fp() + (kCallerSpSlotFromFp * kWordSize); }
+
   const Function& function() const {
     return function_;
   }
@@ -295,11 +275,6 @@
     ASSERT(!code_.IsNull());
     return code_;
   }
-  const Bytecode& bytecode() const {
-    ASSERT(!bytecode_.IsNull());
-    return bytecode_;
-  }
-  bool IsInterpreted() const { return !bytecode_.IsNull(); }
 
   enum Relation {
     kCallee,
@@ -307,7 +282,7 @@
     kCaller,
   };
 
-  Relation CompareTo(uword other_fp, bool other_is_interpreted) const;
+  Relation CompareTo(uword other_fp) const;
 
   StringPtr QualifiedFunctionName();
   StringPtr SourceUrl();
@@ -360,7 +335,9 @@
 
   void PrintToJSONObject(JSONObject* jsobj);
 
-  ObjectPtr GetAsyncAwaiter();
+  // Get Closure that await'ed this async frame.
+  ObjectPtr GetAsyncAwaiter(CallerClosureFinder* caller_closure_finder);
+
   ObjectPtr GetCausalStack();
 
   bool HandlesException(const Instance& exc_obj);
@@ -381,11 +358,11 @@
   void GetDescIndices();
 
   ObjectPtr GetAsyncContextVariable(const String& name);
-  ObjectPtr GetAsyncStreamControllerStreamAwaiter(const Object& stream);
-  ObjectPtr GetAsyncStreamControllerStream();
-  ObjectPtr GetAsyncCompleterAwaiter(const Object& completer);
-  ObjectPtr GetAsyncCompleter();
+
+  // Get the current continuation index in the :await_jump_var pulled from the
+  // context.
   intptr_t GetAwaitJumpVariable();
+
   void ExtractTokenPositionFromAsyncClosure();
 
   bool IsAsyncMachinery() const;
@@ -419,7 +396,6 @@
   // The anchor of the context chain for this function.
   Context& ctx_;
   Code& code_;
-  Bytecode& bytecode_;
   Function& function_;
   bool live_frame_;  // Is this frame a live frame?
   bool token_pos_initialized_;
@@ -462,7 +438,6 @@
   void AddActivation(ActivationFrame* frame);
   void AddMarker(ActivationFrame::Kind marker);
   void AddAsyncCausalFrame(uword pc, const Code& code);
-  void AddAsyncCausalFrame(uword pc, const Bytecode& bytecode);
 
   ZoneGrowableArray<ActivationFrame*> trace_;
 
@@ -497,12 +472,7 @@
 
   void OnIsolateRunnable();
 
-  void NotifyCompilation(const Function& func) {
-    HandleCodeChange(/* bytecode_loaded = */ false, func);
-  }
-  void NotifyBytecodeLoaded(const Function& func) {
-    HandleCodeChange(/* bytecode_loaded = */ true, func);
-  }
+  void NotifyCompilation(const Function& func);
   void NotifyDoneLoading();
 
   // Set breakpoint at closest location to function entry.
@@ -550,10 +520,6 @@
     ignore_breakpoints_ = ignore_breakpoints;
   }
 
-  bool HasEnabledBytecodeBreakpoints() const;
-  // Called from the interpreter. Note that pc already points to next bytecode.
-  bool HasBytecodeBreakpointAt(const KBCInstr* next_pc) const;
-
   // Put the isolate into single stepping mode when Dart code next runs.
   //
   // This is used by the vm service to allow the user to step while
@@ -577,7 +543,6 @@
   // debugger's zone.
   bool HasBreakpoint(const Function& func, Zone* zone);
   bool HasBreakpoint(const Code& code);
-  // A Bytecode version of HasBreakpoint is not needed.
 
   // Returns true if the call at address pc is patched to point to
   // a debugger stub.
@@ -636,7 +601,7 @@
   // Callback to the debugger to continue frame rewind, post-deoptimization.
   void RewindPostDeopt();
 
-  static DebuggerStackTrace* CollectAwaiterReturnStackTrace();
+  DebuggerStackTrace* CollectAwaiterReturnStackTrace();
 
  private:
   ErrorPtr PauseRequest(ServiceEvent::EventKind kind);
@@ -658,7 +623,6 @@
   void FindCompiledFunctions(const Script& script,
                              TokenPosition start_pos,
                              TokenPosition end_pos,
-                             GrowableObjectArray* bytecode_function_list,
                              GrowableObjectArray* code_function_list);
   bool FindBestFit(const Script& script,
                    TokenPosition token_pos,
@@ -666,17 +630,14 @@
                    Function* best_fit);
   FunctionPtr FindInnermostClosure(const Function& function,
                                    TokenPosition token_pos);
-  TokenPosition ResolveBreakpointPos(bool in_bytecode,
-                                     const Function& func,
+  TokenPosition ResolveBreakpointPos(const Function& func,
                                      TokenPosition requested_token_pos,
                                      TokenPosition last_token_pos,
                                      intptr_t requested_column,
                                      TokenPosition exact_token_pos);
   void DeoptimizeWorld();
   void NotifySingleStepping(bool value) const;
-  BreakpointLocation* SetCodeBreakpoints(bool in_bytecode,
-                                         BreakpointLocation* loc,
-                                         const Script& script,
+  BreakpointLocation* SetCodeBreakpoints(const Script& script,
                                          TokenPosition token_pos,
                                          TokenPosition last_token_pos,
                                          intptr_t requested_line,
@@ -703,7 +664,6 @@
       TokenPosition token_pos,
       intptr_t requested_line,
       intptr_t requested_column,
-      TokenPosition bytecode_token_pos = TokenPosition::kNoSource,
       TokenPosition code_token_pos = TokenPosition::kNoSource);
   void MakeCodeBreakpointAt(const Function& func, BreakpointLocation* bpt);
   // Returns NULL if no breakpoint exists for the given address.
@@ -713,8 +673,6 @@
   void PrintBreakpointsListToJSONArray(BreakpointLocation* sbpt,
                                        JSONArray* jsarr) const;
 
-  void HandleCodeChange(bool bytecode_loaded, const Function& func);
-
   ActivationFrame* TopDartFrame() const;
   static ActivationFrame* CollectDartFrame(
       Isolate* isolate,
@@ -725,12 +683,6 @@
       intptr_t deopt_frame_offset,
       ActivationFrame::Kind kind = ActivationFrame::kRegular);
 #if !defined(DART_PRECOMPILED_RUNTIME)
-  static ActivationFrame* CollectDartFrame(
-      Isolate* isolate,
-      uword pc,
-      StackFrame* frame,
-      const Bytecode& bytecode,
-      ActivationFrame::Kind kind = ActivationFrame::kRegular);
   static ArrayPtr DeoptimizeToArray(Thread* thread,
                                     StackFrame* frame,
                                     const Code& code);
@@ -778,7 +730,6 @@
   void RewindToOptimizedFrame(StackFrame* frame,
                               const Code& code,
                               intptr_t post_deopt_frame_index);
-  void RewindToInterpretedFrame(StackFrame* frame, const Bytecode& bytecode);
 
   void ResetSteppingFramePointers();
   bool SteppedForSyntheticAsyncBreakpoint() const;
@@ -821,7 +772,6 @@
   // frame corresponds to this fp value, or if the top frame is
   // lower on the stack.
   uword stepping_fp_;
-  bool interpreted_stepping_;
 
   // When stepping through code, do not stop more than once in the same
   // token position range.
@@ -830,7 +780,6 @@
 
   // Used to track the current async/async* function.
   uword async_stepping_fp_;
-  bool interpreted_async_stepping_;
   ObjectPtr top_frame_awaiter_;
 
   // If we step while at a breakpoint, we would hit the same pc twice.
diff --git a/runtime/vm/debugger_kbc.cc b/runtime/vm/debugger_kbc.cc
deleted file mode 100644
index c07d8e9..0000000
--- a/runtime/vm/debugger_kbc.cc
+++ /dev/null
@@ -1,56 +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.
-
-#include "vm/globals.h"
-#if !defined(DART_PRECOMPILED_RUNTIME)
-
-#include "vm/debugger.h"
-#include "vm/instructions_kbc.h"
-#include "vm/interpreter.h"
-
-namespace dart {
-
-#ifndef PRODUCT
-void CodeBreakpoint::SetBytecodeBreakpoint() {
-  ASSERT(!is_enabled_);
-  is_enabled_ = true;
-  Interpreter::Current()->set_is_debugging(true);
-}
-
-void CodeBreakpoint::UnsetBytecodeBreakpoint() {
-  ASSERT(is_enabled_);
-  is_enabled_ = false;
-  if (!Isolate::Current()->single_step() &&
-      !Isolate::Current()->debugger()->HasEnabledBytecodeBreakpoints()) {
-    Interpreter::Current()->set_is_debugging(false);
-  }
-}
-
-bool Debugger::HasEnabledBytecodeBreakpoints() const {
-  CodeBreakpoint* cbpt = code_breakpoints_;
-  while (cbpt != nullptr) {
-    if (cbpt->IsEnabled() && cbpt->IsInterpreted()) {
-      return true;
-    }
-    cbpt = cbpt->next();
-  }
-  return false;
-}
-
-bool Debugger::HasBytecodeBreakpointAt(const KBCInstr* next_pc) const {
-  CodeBreakpoint* cbpt = code_breakpoints_;
-  while (cbpt != nullptr) {
-    if ((reinterpret_cast<uword>(next_pc)) == cbpt->pc_ && cbpt->IsEnabled()) {
-      ASSERT(cbpt->IsInterpreted());
-      return true;
-    }
-    cbpt = cbpt->next();
-  }
-  return false;
-}
-#endif  // !PRODUCT
-
-}  // namespace dart
-
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
diff --git a/runtime/vm/deferred_objects.cc b/runtime/vm/deferred_objects.cc
index 8e4b4c8..a510fe0 100644
--- a/runtime/vm/deferred_objects.cc
+++ b/runtime/vm/deferred_objects.cc
@@ -224,23 +224,50 @@
   Class& cls = Class::Handle();
   cls ^= GetClass();
 
-  if (cls.raw() == Object::context_class()) {
-    intptr_t num_variables = Smi::Cast(Object::Handle(GetLength())).Value();
-    if (FLAG_trace_deoptimization_verbose) {
-      OS::PrintErr("materializing context of length %" Pd " (%" Px ", %" Pd
-                   " vars)\n",
-                   num_variables, reinterpret_cast<uword>(args_), field_count_);
-    }
-    object_ = &Context::ZoneHandle(Context::New(num_variables));
+  switch (cls.id()) {
+    case kContextCid: {
+      const intptr_t num_variables =
+          Smi::Cast(Object::Handle(GetLength())).Value();
+      if (FLAG_trace_deoptimization_verbose) {
+        OS::PrintErr(
+            "materializing context of length %" Pd " (%" Px ", %" Pd " vars)\n",
+            num_variables, reinterpret_cast<uword>(args_), field_count_);
+      }
+      object_ = &Context::ZoneHandle(Context::New(num_variables));
+    } break;
+    case kArrayCid: {
+      const intptr_t num_elements =
+          Smi::Cast(Object::Handle(GetLength())).Value();
+      if (FLAG_trace_deoptimization_verbose) {
+        OS::PrintErr("materializing array of length %" Pd " (%" Px ", %" Pd
+                     " elements)\n",
+                     num_elements, reinterpret_cast<uword>(args_),
+                     field_count_);
+      }
+      object_ = &Array::ZoneHandle(Array::New(num_elements));
+    } break;
+    default:
+      if (IsTypedDataClassId(cls.id())) {
+        const intptr_t num_elements =
+            Smi::Cast(Object::Handle(GetLength())).Value();
+        if (FLAG_trace_deoptimization_verbose) {
+          OS::PrintErr("materializing typed data cid %" Pd " of length %" Pd
+                       " (%" Px ", %" Pd " elements)\n",
+                       cls.id(), num_elements, reinterpret_cast<uword>(args_),
+                       field_count_);
+        }
+        object_ =
+            &TypedData::ZoneHandle(TypedData::New(cls.id(), num_elements));
 
-  } else {
-    if (FLAG_trace_deoptimization_verbose) {
-      OS::PrintErr("materializing instance of %s (%" Px ", %" Pd " fields)\n",
-                   cls.ToCString(), reinterpret_cast<uword>(args_),
-                   field_count_);
-    }
+      } else {
+        if (FLAG_trace_deoptimization_verbose) {
+          OS::PrintErr(
+              "materializing instance of %s (%" Px ", %" Pd " fields)\n",
+              cls.ToCString(), reinterpret_cast<uword>(args_), field_count_);
+        }
 
-    object_ = &Instance::ZoneHandle(Instance::New(cls));
+        object_ = &Instance::ZoneHandle(Instance::New(cls));
+      }
   }
 }
 
@@ -256,65 +283,178 @@
   Class& cls = Class::Handle();
   cls ^= GetClass();
 
-  if (cls.raw() == Object::context_class()) {
-    const Context& context = Context::Cast(*object_);
+  switch (cls.id()) {
+    case kContextCid: {
+      const Context& context = Context::Cast(*object_);
 
-    Smi& offset = Smi::Handle();
-    Object& value = Object::Handle();
+      Smi& offset = Smi::Handle();
+      Object& value = Object::Handle();
 
-    for (intptr_t i = 0; i < field_count_; i++) {
-      offset ^= GetFieldOffset(i);
-      if (offset.Value() == Context::parent_offset()) {
-        // Copy parent.
-        Context& parent = Context::Handle();
-        parent ^= GetValue(i);
-        context.set_parent(parent);
-        if (FLAG_trace_deoptimization_verbose) {
-          OS::PrintErr("    ctx@parent (offset %" Pd ") <- %s\n",
-                       offset.Value(), value.ToCString());
-        }
-      } else {
-        intptr_t context_index = ToContextIndex(offset.Value());
-        value = GetValue(i);
-        context.SetAt(context_index, value);
-        if (FLAG_trace_deoptimization_verbose) {
-          OS::PrintErr("    ctx@%" Pd " (offset %" Pd ") <- %s\n",
-                       context_index, offset.Value(), value.ToCString());
+      for (intptr_t i = 0; i < field_count_; i++) {
+        offset ^= GetFieldOffset(i);
+        if (offset.Value() == Context::parent_offset()) {
+          // Copy parent.
+          Context& parent = Context::Handle();
+          parent ^= GetValue(i);
+          context.set_parent(parent);
+          if (FLAG_trace_deoptimization_verbose) {
+            OS::PrintErr("    ctx@parent (offset %" Pd ") <- %s\n",
+                         offset.Value(), value.ToCString());
+          }
+        } else {
+          intptr_t context_index = ToContextIndex(offset.Value());
+          value = GetValue(i);
+          context.SetAt(context_index, value);
+          if (FLAG_trace_deoptimization_verbose) {
+            OS::PrintErr("    ctx@%" Pd " (offset %" Pd ") <- %s\n",
+                         context_index, offset.Value(), value.ToCString());
+          }
         }
       }
-    }
-  } else {
-    const Instance& obj = Instance::Cast(*object_);
+    } break;
+    case kArrayCid: {
+      const Array& array = Array::Cast(*object_);
 
-    Smi& offset = Smi::Handle();
-    Field& field = Field::Handle();
-    Object& value = Object::Handle();
-    const Array& offset_map = Array::Handle(cls.OffsetToFieldMap());
+      Smi& offset = Smi::Handle();
+      Object& value = Object::Handle();
 
-    for (intptr_t i = 0; i < field_count_; i++) {
-      offset ^= GetFieldOffset(i);
-      field ^= offset_map.At(offset.Value() / kWordSize);
-      value = GetValue(i);
-      if (!field.IsNull()) {
-        obj.SetField(field, value);
-        if (FLAG_trace_deoptimization_verbose) {
-          OS::PrintErr("    %s <- %s\n",
-                       String::Handle(field.name()).ToCString(),
-                       value.ToCString());
-        }
-      } else {
-        // In addition to the type arguments vector we can also have lazy
-        // materialization of e.g. _ByteDataView objects which don't have
-        // explicit fields in Dart (all accesses to the fields are done via
-        // recognized native methods).
-        ASSERT(offset.Value() < cls.host_instance_size());
-        obj.SetFieldAtOffset(offset.Value(), value);
-        if (FLAG_trace_deoptimization_verbose) {
-          OS::PrintErr("    null Field @ offset(%" Pd ") <- %s\n",
-                       offset.Value(), value.ToCString());
+      for (intptr_t i = 0; i < field_count_; i++) {
+        offset ^= GetFieldOffset(i);
+        if (offset.Value() == Array::type_arguments_offset()) {
+          TypeArguments& type_args = TypeArguments::Handle();
+          type_args ^= GetValue(i);
+          array.SetTypeArguments(type_args);
+          if (FLAG_trace_deoptimization_verbose) {
+            OS::PrintErr("    array@type_args (offset %" Pd ") <- %s\n",
+                         offset.Value(), value.ToCString());
+          }
+        } else {
+          const intptr_t index = Array::index_at_offset(offset.Value());
+          value = GetValue(i);
+          array.SetAt(index, value);
+          if (FLAG_trace_deoptimization_verbose) {
+            OS::PrintErr("    array@%" Pd " (offset %" Pd ") <- %s\n", index,
+                         offset.Value(), value.ToCString());
+          }
         }
       }
-    }
+    } break;
+    default:
+      if (IsTypedDataClassId(cls.id())) {
+        const TypedData& typed_data = TypedData::Cast(*object_);
+
+        Smi& offset = Smi::Handle();
+        Object& value = Object::Handle();
+        const auto cid = cls.id();
+
+        for (intptr_t i = 0; i < field_count_; i++) {
+          offset ^= GetFieldOffset(i);
+          const intptr_t element_offset = offset.Value();
+          value = GetValue(i);
+          switch (cid) {
+            case kTypedDataInt8ArrayCid:
+              typed_data.SetInt8(
+                  element_offset,
+                  static_cast<int8_t>(Integer::Cast(value).AsInt64Value()));
+              break;
+            case kTypedDataUint8ArrayCid:
+            case kTypedDataUint8ClampedArrayCid:
+              typed_data.SetUint8(
+                  element_offset,
+                  static_cast<uint8_t>(Integer::Cast(value).AsInt64Value()));
+              break;
+            case kTypedDataInt16ArrayCid:
+              typed_data.SetInt16(
+                  element_offset,
+                  static_cast<int16_t>(Integer::Cast(value).AsInt64Value()));
+              break;
+            case kTypedDataUint16ArrayCid:
+              typed_data.SetUint16(
+                  element_offset,
+                  static_cast<uint16_t>(Integer::Cast(value).AsInt64Value()));
+              break;
+            case kTypedDataInt32ArrayCid:
+              typed_data.SetInt32(
+                  element_offset,
+                  static_cast<int32_t>(Integer::Cast(value).AsInt64Value()));
+              break;
+            case kTypedDataUint32ArrayCid:
+              typed_data.SetUint32(
+                  element_offset,
+                  static_cast<uint32_t>(Integer::Cast(value).AsInt64Value()));
+              break;
+            case kTypedDataInt64ArrayCid:
+              typed_data.SetInt64(element_offset,
+                                  Integer::Cast(value).AsInt64Value());
+              break;
+            case kTypedDataUint64ArrayCid:
+              typed_data.SetUint64(
+                  element_offset,
+                  static_cast<uint64_t>(Integer::Cast(value).AsInt64Value()));
+              break;
+            case kTypedDataFloat32ArrayCid:
+              typed_data.SetFloat32(
+                  element_offset,
+                  static_cast<float>(Double::Cast(value).value()));
+              break;
+            case kTypedDataFloat64ArrayCid:
+              typed_data.SetFloat64(element_offset,
+                                    Double::Cast(value).value());
+              break;
+            case kTypedDataFloat32x4ArrayCid:
+              typed_data.SetFloat32x4(element_offset,
+                                      Float32x4::Cast(value).value());
+              break;
+            case kTypedDataInt32x4ArrayCid:
+              typed_data.SetInt32x4(element_offset,
+                                    Int32x4::Cast(value).value());
+              break;
+            case kTypedDataFloat64x2ArrayCid:
+              typed_data.SetFloat64x2(element_offset,
+                                      Float64x2::Cast(value).value());
+              break;
+            default:
+              UNREACHABLE();
+          }
+          if (FLAG_trace_deoptimization_verbose) {
+            OS::PrintErr("    typed_data (offset %" Pd ") <- %s\n",
+                         element_offset, value.ToCString());
+          }
+        }
+      } else {
+        const Instance& obj = Instance::Cast(*object_);
+
+        Smi& offset = Smi::Handle();
+        Field& field = Field::Handle();
+        Object& value = Object::Handle();
+        const Array& offset_map = Array::Handle(cls.OffsetToFieldMap());
+
+        for (intptr_t i = 0; i < field_count_; i++) {
+          offset ^= GetFieldOffset(i);
+          field ^= offset_map.At(offset.Value() / kWordSize);
+          value = GetValue(i);
+          if (!field.IsNull()) {
+            obj.SetField(field, value);
+            if (FLAG_trace_deoptimization_verbose) {
+              OS::PrintErr("    %s <- %s\n",
+                           String::Handle(field.name()).ToCString(),
+                           value.ToCString());
+            }
+          } else {
+            // In addition to the type arguments vector we can also have lazy
+            // materialization of e.g. _ByteDataView objects which don't have
+            // explicit fields in Dart (all accesses to the fields are done via
+            // recognized native methods).
+            ASSERT(offset.Value() < cls.host_instance_size());
+            obj.SetFieldAtOffset(offset.Value(), value);
+            if (FLAG_trace_deoptimization_verbose) {
+              OS::PrintErr("    null Field @ offset(%" Pd ") <- %s\n",
+                           offset.Value(), value.ToCString());
+            }
+          }
+        }
+      }
+      break;
   }
 }
 
diff --git a/runtime/vm/deferred_objects.h b/runtime/vm/deferred_objects.h
index f50c09a..d5b38cb 100644
--- a/runtime/vm/deferred_objects.h
+++ b/runtime/vm/deferred_objects.h
@@ -201,7 +201,12 @@
  private:
   enum {
     kClassIndex = 0,
-    kLengthIndex,  // Number of context variables for contexts, -1 otherwise.
+
+    // Number of context variables for contexts,
+    // number of elements for arrays and typed data objects,
+    // -1 otherwise.
+    kLengthIndex,
+
     kFieldsStartIndex
   };
 
diff --git a/runtime/vm/deopt_instructions.cc b/runtime/vm/deopt_instructions.cc
index f194067..54cac1a 100644
--- a/runtime/vm/deopt_instructions.cc
+++ b/runtime/vm/deopt_instructions.cc
@@ -378,7 +378,6 @@
                                StackFrameIterator::kNoCrossThreadIteration);
     StackFrame* top_frame = iterator.NextFrame();
     ASSERT(top_frame != NULL);
-    ASSERT(!top_frame->is_interpreted());
     const Code& code = Code::Handle(top_frame->LookupDartCode());
     const Function& top_function = Function::Handle(code.function());
     const Script& script = Script::Handle(top_function.script());
@@ -1208,7 +1207,7 @@
     MaterializeObjectInstr* mat = materializations_[i];
     // Class of the instance to allocate.
     AddConstant(mat->cls(), dest_index++);
-    AddConstant(Smi::ZoneHandle(Smi::New(mat->num_variables())), dest_index++);
+    AddConstant(Smi::ZoneHandle(Smi::New(mat->num_elements())), dest_index++);
     for (intptr_t i = 0; i < mat->InputCount(); i++) {
       if (!mat->InputAt(i)->BindsToConstantNull()) {
         // Emit offset-value pair.
diff --git a/runtime/vm/exceptions.cc b/runtime/vm/exceptions.cc
index 9cba5d4..d67906f 100644
--- a/runtime/vm/exceptions.cc
+++ b/runtime/vm/exceptions.cc
@@ -24,7 +24,6 @@
 
 namespace dart {
 
-DECLARE_FLAG(bool, enable_interpreter);
 DECLARE_FLAG(bool, trace_deoptimization);
 DEFINE_FLAG(bool,
             print_stacktrace_at_throw,
@@ -129,26 +128,15 @@
   StackFrame* frame = frames.NextFrame();
   ASSERT(frame != NULL);  // We expect to find a dart invocation frame.
   Code& code = Code::Handle();
-  Bytecode& bytecode = Bytecode::Handle();
   Smi& offset = Smi::Handle();
   for (; frame != NULL; frame = frames.NextFrame()) {
     if (!frame->IsDartFrame()) {
       continue;
     }
-    if (frame->is_interpreted()) {
-      bytecode = frame->LookupDartBytecode();
-      ASSERT(bytecode.ContainsInstructionAt(frame->pc()));
-      if (bytecode.function() == Function::null()) {
-        continue;
-      }
-      offset = Smi::New(frame->pc() - bytecode.PayloadStart());
-      builder->AddFrame(bytecode, offset);
-    } else {
-      code = frame->LookupDartCode();
-      ASSERT(code.ContainsInstructionAt(frame->pc()));
-      offset = Smi::New(frame->pc() - code.PayloadStart());
-      builder->AddFrame(code, offset);
-    }
+    code = frame->LookupDartCode();
+    ASSERT(code.ContainsInstructionAt(frame->pc()));
+    offset = Smi::New(frame->pc() - code.PayloadStart());
+    builder->AddFrame(code, offset);
   }
 }
 
@@ -622,9 +610,7 @@
                                StackFrameIterator::kNoCrossThreadIteration);
       for (StackFrame* frame = frames.NextFrame(); frame != nullptr;
            frame = frames.NextFrame()) {
-        if (frame->is_interpreted()) {
-          continue;
-        } else if (frame->fp() >= frame_pointer) {
+        if (frame->fp() >= frame_pointer) {
           break;
         }
         if (frame->IsMarkedForLazyDeopt()) {
@@ -677,18 +663,6 @@
                              uword stack_pointer,
                              uword frame_pointer,
                              bool clear_deopt_at_target) {
-#if !defined(DART_PRECOMPILED_RUNTIME)
-  // TODO(regis): We still possibly need to unwind interpreter frames if they
-  // are callee frames of the C++ frame handling the exception.
-  if (FLAG_enable_interpreter) {
-    Interpreter* interpreter = thread->interpreter();
-    if ((interpreter != NULL) && interpreter->HasFrame(frame_pointer)) {
-      interpreter->JumpToFrame(program_counter, stack_pointer, frame_pointer,
-                               thread);
-    }
-  }
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-
   const uword fp_for_clearing =
       (clear_deopt_at_target ? frame_pointer + 1 : frame_pointer);
   ClearLazyDeopts(thread, fp_for_clearing);
@@ -779,7 +753,10 @@
                                  const Instance& incoming_exception,
                                  const Instance& existing_stacktrace,
                                  const bool is_rethrow) {
-  DEBUG_ASSERT(thread->TopErrorHandlerIsExitFrame());
+  // SuspendLongJumpScope during Dart entry ensures that if a longjmp base is
+  // available, it is the innermost error handler. If one is available, so
+  // should jump there instead.
+  RELEASE_ASSERT(thread->long_jump_base() == nullptr);
   Zone* zone = thread->zone();
   Isolate* isolate = thread->isolate();
 #if !defined(PRODUCT)
@@ -1021,7 +998,10 @@
 void Exceptions::PropagateError(const Error& error) {
   ASSERT(!error.IsNull());
   Thread* thread = Thread::Current();
-  DEBUG_ASSERT(thread->TopErrorHandlerIsExitFrame());
+  // SuspendLongJumpScope during Dart entry ensures that if a longjmp base is
+  // available, it is the innermost error handler. If one is available, so
+  // should jump there instead.
+  RELEASE_ASSERT(thread->long_jump_base() == nullptr);
   Zone* zone = thread->zone();
   if (error.IsUnhandledException()) {
     // If the error object represents an unhandled exception, then
diff --git a/runtime/vm/finalizable_data.h b/runtime/vm/finalizable_data.h
index d604a94..170e3aa 100644
--- a/runtime/vm/finalizable_data.h
+++ b/runtime/vm/finalizable_data.h
@@ -14,8 +14,8 @@
 struct FinalizableData {
   void* data;
   void* peer;
-  Dart_WeakPersistentHandleFinalizer callback;
-  Dart_WeakPersistentHandleFinalizer successful_write_callback;
+  Dart_HandleFinalizer callback;
+  Dart_HandleFinalizer successful_write_callback;
 };
 
 class MessageFinalizableData {
@@ -25,19 +25,18 @@
 
   ~MessageFinalizableData() {
     for (intptr_t i = take_position_; i < records_.length(); i++) {
-      records_[i].callback(nullptr, nullptr, records_[i].peer);
+      records_[i].callback(nullptr, records_[i].peer);
     }
   }
 
   /// If [successful_write_callback] is provided, it's invoked when message
   /// was serialized successfully.
   /// [callback] is invoked when serialization failed.
-  void Put(
-      intptr_t external_size,
-      void* data,
-      void* peer,
-      Dart_WeakPersistentHandleFinalizer callback,
-      Dart_WeakPersistentHandleFinalizer successful_write_callback = nullptr) {
+  void Put(intptr_t external_size,
+           void* data,
+           void* peer,
+           Dart_HandleFinalizer callback,
+           Dart_HandleFinalizer successful_write_callback = nullptr) {
     FinalizableData finalizable_data;
     finalizable_data.data = data;
     finalizable_data.peer = peer;
@@ -64,8 +63,7 @@
   void SerializationSucceeded() {
     for (intptr_t i = 0; i < records_.length(); i++) {
       if (records_[i].successful_write_callback != nullptr) {
-        records_[i].successful_write_callback(nullptr, nullptr,
-                                              records_[i].peer);
+        records_[i].successful_write_callback(nullptr, records_[i].peer);
       }
     }
   }
diff --git a/runtime/vm/flag_list.h b/runtime/vm/flag_list.h
index a4bf348..5e02239 100644
--- a/runtime/vm/flag_list.h
+++ b/runtime/vm/flag_list.h
@@ -20,12 +20,6 @@
 constexpr bool kDartPrecompiledRuntime = false;
 #endif
 
-#if defined(DART_USE_BYTECODE)
-constexpr bool kDartUseBytecode = true;
-#else
-constexpr bool kDartUseBytecode = false;
-#endif
-
 #if defined(USING_THREAD_SANITIZER)
 // TODO(39611): Address races in the background compiler.
 constexpr bool kDartUseBackgroundCompilation = false;
@@ -61,8 +55,8 @@
 #define VM_GLOBAL_FLAG_LIST(P, R, C, D)                                        \
   P(dwarf_stack_traces_mode, bool, false,                                      \
     "Use --[no-]dwarf-stack-traces instead.")                                  \
-  P(causal_async_stacks, bool, !USING_PRODUCT, "Improved async stacks")        \
-  P(lazy_async_stacks, bool, false, "Reconstruct async stacks from listeners") \
+  P(causal_async_stacks, bool, false, "Improved async stacks")                 \
+  P(lazy_async_stacks, bool, true, "Reconstruct async stacks from listeners")  \
   P(lazy_dispatchers, bool, true, "Generate dispatchers lazily")               \
   P(use_bare_instructions, bool, true, "Enable bare instructions mode.")       \
   R(dedup_instructions, true, bool, false,                                     \
@@ -102,9 +96,6 @@
     "Collects all dynamic function names to identify unique targets")          \
   P(compactor_tasks, int, 2,                                                   \
     "The number of tasks to use for parallel compaction.")                     \
-  P(compilation_counter_threshold, int, 10,                                    \
-    "Function's usage-counter value before interpreted function is compiled, " \
-    "-1 means never")                                                          \
   P(concurrent_mark, bool, true, "Concurrent mark for old generation.")        \
   P(concurrent_sweep, bool, true, "Concurrent sweep for old generation.")      \
   C(deoptimize_alot, false, false, bool, false,                                \
@@ -225,7 +216,6 @@
   D(trace_zones, bool, false, "Traces allocation sizes in the zone.")          \
   P(truncating_left_shift, bool, true,                                         \
     "Optimize left shift to truncate if possible")                             \
-  P(use_bytecode_compiler, bool, kDartUseBytecode, "Compile from bytecode")    \
   P(use_compactor, bool, false, "Compact the heap during old-space GC.")       \
   P(use_cha_deopt, bool, true,                                                 \
     "Use class hierarchy analysis even if it can cause deoptimization.")       \
@@ -248,7 +238,6 @@
     "Enable magical pragmas for testing purposes. Use at your own risk!")      \
   R(eliminate_type_checks, true, bool, true,                                   \
     "Eliminate type checks when allowed by static type analysis.")             \
-  P(enable_interpreter, bool, false, "Enable interpreting kernel bytecode.")   \
   D(support_rr, bool, false, "Support running within RR.")                     \
   P(verify_entry_points, bool, false,                                          \
     "Throw API error on invalid member access throuh native API. See "         \
diff --git a/runtime/vm/gdb_helpers.cc b/runtime/vm/gdb_helpers.cc
index f75c89a..61baa78 100644
--- a/runtime/vm/gdb_helpers.cc
+++ b/runtime/vm/gdb_helpers.cc
@@ -53,26 +53,6 @@
   }
 }
 
-// Like _printDartStackTrace, but works in the interpreter loop.
-// Must be called with the current interpreter fp, sp, and pc.
-// Note that sp[0] is not modified, but sp[1] will be trashed.
-DART_EXPORT
-void _printInterpreterStackTrace(ObjectPtr* fp,
-                                 ObjectPtr* sp,
-                                 const KBCInstr* pc) {
-  Thread* thread = Thread::Current();
-  sp[1] = Function::null();
-  sp[2] = Bytecode::null();
-  sp[3] = static_cast<ObjectPtr>(reinterpret_cast<uword>(pc));
-  sp[4] = static_cast<ObjectPtr>(reinterpret_cast<uword>(fp));
-  ObjectPtr* exit_fp = sp + 1 + kKBCDartFrameFixedSize;
-  thread->set_top_exit_frame_info(reinterpret_cast<uword>(exit_fp));
-  thread->set_execution_state(Thread::kThreadInVM);
-  _printDartStackTrace();
-  thread->set_execution_state(Thread::kThreadInGenerated);
-  thread->set_top_exit_frame_info(0);
-}
-
 class PrintObjectPointersVisitor : public ObjectPointerVisitor {
  public:
   PrintObjectPointersVisitor()
diff --git a/runtime/vm/handles_test.cc b/runtime/vm/handles_test.cc
index 0e6486f..3267089 100644
--- a/runtime/vm/handles_test.cc
+++ b/runtime/vm/handles_test.cc
@@ -77,9 +77,7 @@
   EXPECT_EQ(handle_count, VMHandles::ScopedHandleCount());
 }
 
-static void NoopCallback(void* isolate_callback_data,
-                         Dart_WeakPersistentHandle handle,
-                         void* peer) {}
+static void NoopCallback(void* isolate_callback_data, void* peer) {}
 
 // Unit test for handle validity checks.
 TEST_CASE(CheckHandleValidity) {
diff --git a/runtime/vm/heap/become.cc b/runtime/vm/heap/become.cc
index 76f1303..8b9ac83 100644
--- a/runtime/vm/heap/become.cc
+++ b/runtime/vm/heap/become.cc
@@ -90,8 +90,10 @@
         ObjectPtr new_target = GetForwardedObject(old_target);
         if (visiting_object_ == nullptr) {
           *p = new_target;
+        } else if (visiting_object_->ptr()->IsCardRemembered()) {
+          visiting_object_->ptr()->StoreArrayPointer(p, new_target, thread_);
         } else {
-          visiting_object_->ptr()->StorePointer(p, new_target);
+          visiting_object_->ptr()->StorePointer(p, new_target, thread_);
         }
       }
     }
diff --git a/runtime/vm/heap/become_test.cc b/runtime/vm/heap/become_test.cc
new file mode 100644
index 0000000..b3e89220
--- /dev/null
+++ b/runtime/vm/heap/become_test.cc
@@ -0,0 +1,151 @@
+// Copyright (c) 2020, 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.
+
+#include "platform/assert.h"
+#include "platform/globals.h"
+
+#include "vm/globals.h"
+#include "vm/heap/become.h"
+#include "vm/heap/heap.h"
+#include "vm/unit_test.h"
+
+namespace dart {
+
+void TestBecomeForward(Heap::Space before_space, Heap::Space after_space) {
+  const String& before_obj = String::Handle(String::New("old", before_space));
+  const String& after_obj = String::Handle(String::New("new", after_space));
+
+  EXPECT(before_obj.raw() != after_obj.raw());
+
+  // Allocate the arrays in old space to test the remembered set.
+  const Array& before = Array::Handle(Array::New(1, Heap::kOld));
+  before.SetAt(0, before_obj);
+  const Array& after = Array::Handle(Array::New(1, Heap::kOld));
+  after.SetAt(0, after_obj);
+
+  Become::ElementsForwardIdentity(before, after);
+
+  EXPECT(before_obj.raw() == after_obj.raw());
+
+  GCTestHelper::CollectAllGarbage();
+
+  EXPECT(before_obj.raw() == after_obj.raw());
+}
+
+ISOLATE_UNIT_TEST_CASE(BecomeFowardOldToOld) {
+  TestBecomeForward(Heap::kOld, Heap::kOld);
+}
+
+ISOLATE_UNIT_TEST_CASE(BecomeFowardNewToNew) {
+  TestBecomeForward(Heap::kNew, Heap::kNew);
+}
+
+ISOLATE_UNIT_TEST_CASE(BecomeFowardOldToNew) {
+  TestBecomeForward(Heap::kOld, Heap::kNew);
+}
+
+ISOLATE_UNIT_TEST_CASE(BecomeFowardNewToOld) {
+  TestBecomeForward(Heap::kNew, Heap::kOld);
+}
+
+ISOLATE_UNIT_TEST_CASE(BecomeForwardPeer) {
+  Isolate* isolate = Isolate::Current();
+  Heap* heap = isolate->heap();
+
+  const Array& before_obj = Array::Handle(Array::New(0, Heap::kOld));
+  const Array& after_obj = Array::Handle(Array::New(0, Heap::kOld));
+  EXPECT(before_obj.raw() != after_obj.raw());
+
+  void* peer = reinterpret_cast<void*>(42);
+  void* no_peer = reinterpret_cast<void*>(0);
+  heap->SetPeer(before_obj.raw(), peer);
+  EXPECT_EQ(peer, heap->GetPeer(before_obj.raw()));
+  EXPECT_EQ(no_peer, heap->GetPeer(after_obj.raw()));
+
+  const Array& before = Array::Handle(Array::New(1, Heap::kOld));
+  before.SetAt(0, before_obj);
+  const Array& after = Array::Handle(Array::New(1, Heap::kOld));
+  after.SetAt(0, after_obj);
+  Become::ElementsForwardIdentity(before, after);
+
+  EXPECT(before_obj.raw() == after_obj.raw());
+  EXPECT_EQ(peer, heap->GetPeer(before_obj.raw()));
+  EXPECT_EQ(peer, heap->GetPeer(after_obj.raw()));
+}
+
+ISOLATE_UNIT_TEST_CASE(BecomeForwardRememberedObject) {
+  const String& new_element = String::Handle(String::New("new", Heap::kNew));
+  const String& old_element = String::Handle(String::New("old", Heap::kOld));
+  const Array& before_obj = Array::Handle(Array::New(1, Heap::kOld));
+  const Array& after_obj = Array::Handle(Array::New(1, Heap::kOld));
+  before_obj.SetAt(0, new_element);
+  after_obj.SetAt(0, old_element);
+  EXPECT(before_obj.raw()->ptr()->IsRemembered());
+  EXPECT(!after_obj.raw()->ptr()->IsRemembered());
+
+  EXPECT(before_obj.raw() != after_obj.raw());
+
+  const Array& before = Array::Handle(Array::New(1, Heap::kOld));
+  before.SetAt(0, before_obj);
+  const Array& after = Array::Handle(Array::New(1, Heap::kOld));
+  after.SetAt(0, after_obj);
+
+  Become::ElementsForwardIdentity(before, after);
+
+  EXPECT(before_obj.raw() == after_obj.raw());
+  EXPECT(!after_obj.raw()->ptr()->IsRemembered());
+
+  GCTestHelper::CollectAllGarbage();
+
+  EXPECT(before_obj.raw() == after_obj.raw());
+}
+
+ISOLATE_UNIT_TEST_CASE(BecomeForwardRememberedCards) {
+  const intptr_t length = Heap::kNewAllocatableSize / kWordSize;
+  ASSERT(Array::UseCardMarkingForAllocation(length));
+  const Array& card_remembered_array = Array::Handle(Array::New(length));
+  EXPECT(card_remembered_array.raw()->ptr()->IsCardRemembered());
+  EXPECT(!card_remembered_array.raw()->ptr()->IsRemembered());
+
+  const String& old_element = String::Handle(String::New("old", Heap::kOld));
+  const String& new_element = String::Handle(String::New("new", Heap::kNew));
+  card_remembered_array.SetAt(0, old_element);
+
+  {
+    HANDLESCOPE(thread);
+    EXPECT_STREQ("old",
+                 Object::Handle(card_remembered_array.At(0)).ToCString());
+  }
+
+  const Array& before = Array::Handle(Array::New(1, Heap::kOld));
+  before.SetAt(0, old_element);
+  const Array& after = Array::Handle(Array::New(1, Heap::kOld));
+  after.SetAt(0, new_element);
+  Become::ElementsForwardIdentity(before, after);
+
+  EXPECT(old_element.raw() == new_element.raw());
+  EXPECT(old_element.raw()->IsNewObject());
+  EXPECT(card_remembered_array.raw()->ptr()->IsCardRemembered());
+  EXPECT(!card_remembered_array.raw()->ptr()->IsRemembered());
+
+  {
+    HANDLESCOPE(thread);
+    EXPECT_STREQ("new",
+                 Object::Handle(card_remembered_array.At(0)).ToCString());
+  }
+
+  GCTestHelper::CollectAllGarbage();
+
+  EXPECT(old_element.raw() == new_element.raw());
+  EXPECT(card_remembered_array.raw()->ptr()->IsCardRemembered());
+  EXPECT(!card_remembered_array.raw()->ptr()->IsRemembered());
+
+  {
+    HANDLESCOPE(thread);
+    EXPECT_STREQ("new",
+                 Object::Handle(card_remembered_array.At(0)).ToCString());
+  }
+}
+
+}  // namespace dart
diff --git a/runtime/vm/heap/compactor.cc b/runtime/vm/heap/compactor.cc
index a4c5370..cd6e83f 100644
--- a/runtime/vm/heap/compactor.cc
+++ b/runtime/vm/heap/compactor.cc
@@ -296,6 +296,8 @@
     ForwardStackPointers();
   }
 
+  heap_->old_space()->VisitRoots(this);
+
   {
     MutexLocker ml(pages_lock);
 
diff --git a/runtime/vm/heap/heap.cc b/runtime/vm/heap/heap.cc
index 0d2ac0c..a1d5866 100644
--- a/runtime/vm/heap/heap.cc
+++ b/runtime/vm/heap/heap.cc
@@ -58,9 +58,11 @@
 };
 
 Heap::Heap(IsolateGroup* isolate_group,
+           bool is_vm_isolate,
            intptr_t max_new_gen_semi_words,
            intptr_t max_old_gen_words)
     : isolate_group_(isolate_group),
+      is_vm_isolate_(is_vm_isolate),
       new_space_(this, max_new_gen_semi_words),
       old_space_(this, max_old_gen_words),
       barrier_(),
@@ -150,6 +152,9 @@
   if (addr != 0) {
     return addr;
   }
+
+  old_space_.TryReleaseReservation();
+
   // Give up allocating this object.
   OS::PrintErr("Exhausted heap space, trying to allocate %" Pd " bytes.\n",
                size);
@@ -678,11 +683,12 @@
 }
 
 void Heap::Init(IsolateGroup* isolate_group,
+                bool is_vm_isolate,
                 intptr_t max_new_gen_words,
                 intptr_t max_old_gen_words) {
   ASSERT(isolate_group->heap() == nullptr);
-  std::unique_ptr<Heap> heap(
-      new Heap(isolate_group, max_new_gen_words, max_old_gen_words));
+  std::unique_ptr<Heap> heap(new Heap(isolate_group, is_vm_isolate,
+                                      max_new_gen_words, max_old_gen_words));
   isolate_group->set_heap(std::move(heap));
 }
 
@@ -907,27 +913,27 @@
 }
 
 intptr_t Heap::GetWeakEntry(ObjectPtr raw_obj, WeakSelector sel) const {
-  if (raw_obj->IsNewObject()) {
+  if (!raw_obj->IsSmiOrOldObject()) {
     return new_weak_tables_[sel]->GetValue(raw_obj);
   }
-  ASSERT(raw_obj->IsOldObject());
+  ASSERT(raw_obj->IsSmiOrOldObject());
   return old_weak_tables_[sel]->GetValue(raw_obj);
 }
 
 void Heap::SetWeakEntry(ObjectPtr raw_obj, WeakSelector sel, intptr_t val) {
-  if (raw_obj->IsNewObject()) {
+  if (!raw_obj->IsSmiOrOldObject()) {
     new_weak_tables_[sel]->SetValue(raw_obj, val);
   } else {
-    ASSERT(raw_obj->IsOldObject());
+    ASSERT(raw_obj->IsSmiOrOldObject());
     old_weak_tables_[sel]->SetValue(raw_obj, val);
   }
 }
 
 void Heap::ForwardWeakEntries(ObjectPtr before_object, ObjectPtr after_object) {
   const auto before_space =
-      before_object->IsNewObject() ? Heap::kNew : Heap::kOld;
+      !before_object->IsSmiOrOldObject() ? Heap::kNew : Heap::kOld;
   const auto after_space =
-      after_object->IsNewObject() ? Heap::kNew : Heap::kOld;
+      !after_object->IsSmiOrOldObject() ? Heap::kNew : Heap::kOld;
 
   for (int sel = 0; sel < Heap::kNumWeakSelectors; sel++) {
     const auto selector = static_cast<Heap::WeakSelector>(sel);
diff --git a/runtime/vm/heap/heap.h b/runtime/vm/heap/heap.h
index 7e42b75..026d793 100644
--- a/runtime/vm/heap/heap.h
+++ b/runtime/vm/heap/heap.h
@@ -167,6 +167,7 @@
 
   // Initialize the heap and register it with the isolate.
   static void Init(IsolateGroup* isolate_group,
+                   bool is_vm_isolate,
                    intptr_t max_new_gen_words,
                    intptr_t max_old_gen_words);
 
@@ -305,6 +306,7 @@
 #endif  // PRODUCT
 
   IsolateGroup* isolate_group() const { return isolate_group_; }
+  bool is_vm_isolate() const { return is_vm_isolate_; }
 
   Monitor* barrier() const { return &barrier_; }
   Monitor* barrier_done() const { return &barrier_done_; }
@@ -354,6 +356,7 @@
   };
 
   Heap(IsolateGroup* isolate_group,
+       bool is_vm_isolate,
        intptr_t max_new_gen_semi_words,  // Max capacity of new semi-space.
        intptr_t max_old_gen_words);
 
@@ -391,6 +394,7 @@
   void CollectForDebugging();
 
   IsolateGroup* isolate_group_;
+  bool is_vm_isolate_;
 
   // The different spaces used for allocation.
   Scavenger new_space_;
diff --git a/runtime/vm/heap/heap_sources.gni b/runtime/vm/heap/heap_sources.gni
index 79ac530..00100cf 100644
--- a/runtime/vm/heap/heap_sources.gni
+++ b/runtime/vm/heap/heap_sources.gni
@@ -35,8 +35,10 @@
 ]
 
 heap_sources_tests = [
+  "become_test.cc",
   "freelist_test.cc",
   "heap_test.cc",
   "pages_test.cc",
   "scavenger_test.cc",
+  "weak_table_test.cc",
 ]
diff --git a/runtime/vm/heap/heap_test.cc b/runtime/vm/heap/heap_test.cc
index f7201f1..4b3b061 100644
--- a/runtime/vm/heap/heap_test.cc
+++ b/runtime/vm/heap/heap_test.cc
@@ -269,95 +269,6 @@
   EXPECT(heap->Contains(ObjectLayout::ToAddr(obj.raw())));
 }
 
-void TestBecomeForward(Heap::Space before_space, Heap::Space after_space) {
-  const String& before_obj = String::Handle(String::New("old", before_space));
-  const String& after_obj = String::Handle(String::New("new", after_space));
-
-  EXPECT(before_obj.raw() != after_obj.raw());
-
-  // Allocate the arrays in old space to test the remembered set.
-  const Array& before = Array::Handle(Array::New(1, Heap::kOld));
-  before.SetAt(0, before_obj);
-  const Array& after = Array::Handle(Array::New(1, Heap::kOld));
-  after.SetAt(0, after_obj);
-
-  Become::ElementsForwardIdentity(before, after);
-
-  EXPECT(before_obj.raw() == after_obj.raw());
-
-  GCTestHelper::CollectAllGarbage();
-
-  EXPECT(before_obj.raw() == after_obj.raw());
-}
-
-ISOLATE_UNIT_TEST_CASE(BecomeFowardOldToOld) {
-  TestBecomeForward(Heap::kOld, Heap::kOld);
-}
-
-ISOLATE_UNIT_TEST_CASE(BecomeFowardNewToNew) {
-  TestBecomeForward(Heap::kNew, Heap::kNew);
-}
-
-ISOLATE_UNIT_TEST_CASE(BecomeFowardOldToNew) {
-  TestBecomeForward(Heap::kOld, Heap::kNew);
-}
-
-ISOLATE_UNIT_TEST_CASE(BecomeFowardNewToOld) {
-  TestBecomeForward(Heap::kNew, Heap::kOld);
-}
-
-ISOLATE_UNIT_TEST_CASE(BecomeForwardPeer) {
-  Isolate* isolate = Isolate::Current();
-  Heap* heap = isolate->heap();
-
-  const Array& before_obj = Array::Handle(Array::New(0, Heap::kOld));
-  const Array& after_obj = Array::Handle(Array::New(0, Heap::kOld));
-  EXPECT(before_obj.raw() != after_obj.raw());
-
-  void* peer = reinterpret_cast<void*>(42);
-  void* no_peer = reinterpret_cast<void*>(0);
-  heap->SetPeer(before_obj.raw(), peer);
-  EXPECT_EQ(peer, heap->GetPeer(before_obj.raw()));
-  EXPECT_EQ(no_peer, heap->GetPeer(after_obj.raw()));
-
-  const Array& before = Array::Handle(Array::New(1, Heap::kOld));
-  before.SetAt(0, before_obj);
-  const Array& after = Array::Handle(Array::New(1, Heap::kOld));
-  after.SetAt(0, after_obj);
-  Become::ElementsForwardIdentity(before, after);
-
-  EXPECT(before_obj.raw() == after_obj.raw());
-  EXPECT_EQ(peer, heap->GetPeer(before_obj.raw()));
-  EXPECT_EQ(peer, heap->GetPeer(after_obj.raw()));
-}
-
-ISOLATE_UNIT_TEST_CASE(BecomeForwardRememberedObject) {
-  const String& new_element = String::Handle(String::New("new", Heap::kNew));
-  const String& old_element = String::Handle(String::New("old", Heap::kOld));
-  const Array& before_obj = Array::Handle(Array::New(1, Heap::kOld));
-  const Array& after_obj = Array::Handle(Array::New(1, Heap::kOld));
-  before_obj.SetAt(0, new_element);
-  after_obj.SetAt(0, old_element);
-  EXPECT(before_obj.raw()->ptr()->IsRemembered());
-  EXPECT(!after_obj.raw()->ptr()->IsRemembered());
-
-  EXPECT(before_obj.raw() != after_obj.raw());
-
-  const Array& before = Array::Handle(Array::New(1, Heap::kOld));
-  before.SetAt(0, before_obj);
-  const Array& after = Array::Handle(Array::New(1, Heap::kOld));
-  after.SetAt(0, after_obj);
-
-  Become::ElementsForwardIdentity(before, after);
-
-  EXPECT(before_obj.raw() == after_obj.raw());
-  EXPECT(!after_obj.raw()->ptr()->IsRemembered());
-
-  GCTestHelper::CollectAllGarbage();
-
-  EXPECT(before_obj.raw() == after_obj.raw());
-}
-
 ISOLATE_UNIT_TEST_CASE(CollectAllGarbage_DeadOldToNew) {
   Isolate* isolate = Isolate::Current();
   Heap* heap = isolate->heap();
diff --git a/runtime/vm/heap/marker.cc b/runtime/vm/heap/marker.cc
index 0a36e5e..0e306f7 100644
--- a/runtime/vm/heap/marker.cc
+++ b/runtime/vm/heap/marker.cc
@@ -312,20 +312,6 @@
 
 void GCMarker::Prologue() {
   isolate_group_->ReleaseStoreBuffers();
-
-#ifndef DART_PRECOMPILED_RUNTIME
-  isolate_group_->ForEachIsolate(
-      [&](Isolate* isolate) {
-        Thread* mutator_thread = isolate->mutator_thread();
-        if (mutator_thread != NULL) {
-          Interpreter* interpreter = mutator_thread->interpreter();
-          if (interpreter != NULL) {
-            interpreter->ClearLookupCache();
-          }
-        }
-      },
-      /*at_safepoint=*/true);
-#endif
 }
 
 void GCMarker::Epilogue() {}
@@ -436,8 +422,7 @@
     for (intptr_t i = 0; i < size; i++) {
       if (table->IsValidEntryAtExclusive(i)) {
         ObjectPtr raw_obj = table->ObjectAtExclusive(i);
-        ASSERT(raw_obj->IsHeapObject());
-        if (!raw_obj->ptr()->IsMarked()) {
+        if (raw_obj->IsHeapObject() && !raw_obj->ptr()->IsMarked()) {
           table->InvalidateAtExclusive(i);
         }
       }
diff --git a/runtime/vm/heap/pages.cc b/runtime/vm/heap/pages.cc
index 3c73952..d3b62fa 100644
--- a/runtime/vm/heap/pages.cc
+++ b/runtime/vm/heap/pages.cc
@@ -249,6 +249,8 @@
   for (intptr_t i = 0; i < num_freelists_; i++) {
     freelists_[i].Reset();
   }
+
+  TryReserveForOOM();
 }
 
 PageSpace::~PageSpace() {
@@ -366,7 +368,7 @@
 
   page->set_object_end(page->memory_->end());
   if ((type != OldPage::kExecutable) && (heap_ != nullptr) &&
-      (heap_->isolate_group() != Dart::vm_isolate()->group())) {
+      (!heap_->is_vm_isolate())) {
     page->AllocateForwardingPage();
   }
   return page;
@@ -1020,6 +1022,47 @@
   return estimated_mark_compact_completion <= deadline;
 }
 
+void PageSpace::TryReleaseReservation() {
+  if (oom_reservation_ == nullptr) return;
+  uword addr = reinterpret_cast<uword>(oom_reservation_);
+  intptr_t size = oom_reservation_->HeapSize();
+  oom_reservation_ = nullptr;
+  freelists_[OldPage::kData].Free(addr, size);
+}
+
+bool PageSpace::MarkReservation() {
+  if (oom_reservation_ == nullptr) {
+    return false;
+  }
+  ObjectLayout* ptr = reinterpret_cast<ObjectLayout*>(oom_reservation_);
+  if (!ptr->IsMarked()) {
+    ptr->SetMarkBit();
+  }
+  return true;
+}
+
+void PageSpace::TryReserveForOOM() {
+  if (oom_reservation_ == nullptr) {
+    uword addr = TryAllocate(kOOMReservationSize, OldPage::kData,
+                             kForceGrowth /* Don't re-enter GC */);
+    if (addr != 0) {
+      oom_reservation_ = FreeListElement::AsElement(addr, kOOMReservationSize);
+    }
+  }
+}
+
+void PageSpace::VisitRoots(ObjectPointerVisitor* visitor) {
+  if (oom_reservation_ != nullptr) {
+    // FreeListElements are generally held untagged, but ObjectPointerVisitors
+    // expect tagged pointers.
+    ObjectPtr ptr =
+        ObjectLayout::FromAddr(reinterpret_cast<uword>(oom_reservation_));
+    visitor->VisitPointer(&ptr);
+    oom_reservation_ =
+        reinterpret_cast<FreeListElement*>(ObjectLayout::ToAddr(ptr));
+  }
+}
+
 void PageSpace::CollectGarbage(bool compact, bool finalize) {
   ASSERT(GrowthControlState());
 
@@ -1186,11 +1229,13 @@
     mid3 = OS::GetCurrentMonotonicMicros();
   }
 
+  bool has_reservation = MarkReservation();
+
   if (compact) {
     SweepLarge();
     Compact(thread);
     set_phase(kDone);
-  } else if (FLAG_concurrent_sweep) {
+  } else if (FLAG_concurrent_sweep && has_reservation) {
     ConcurrentSweep(isolate_group);
   } else {
     SweepLarge();
@@ -1198,6 +1243,8 @@
     set_phase(kDone);
   }
 
+  TryReserveForOOM();
+
   // Make code pages read-only.
   if (finalize) WriteProtectCode(true);
 
@@ -1551,9 +1598,10 @@
       before.CombinedUsedInWords() - last_usage_.CombinedUsedInWords();
   intptr_t grow_heap;
   if (allocated_since_previous_gc > 0) {
-    const intptr_t garbage =
+    intptr_t garbage =
         before.CombinedUsedInWords() - after.CombinedUsedInWords();
-    ASSERT(garbage >= 0);
+    // Garbage may be negative if when the OOM reservation is refilled.
+    garbage = Utils::Maximum(static_cast<intptr_t>(0), garbage);
     // It makes no sense to expect that each kb allocated will cause more than
     // one kb of garbage, so we clamp k at 1.0.
     const double k = Utils::Minimum(
diff --git a/runtime/vm/heap/pages.h b/runtime/vm/heap/pages.h
index 83c5488..a786f78 100644
--- a/runtime/vm/heap/pages.h
+++ b/runtime/vm/heap/pages.h
@@ -307,6 +307,11 @@
                                is_protected, is_locked);
   }
 
+  void TryReleaseReservation();
+  bool MarkReservation();
+  void TryReserveForOOM();
+  void VisitRoots(ObjectPointerVisitor* visitor);
+
   bool ReachedHardThreshold() const {
     return page_space_controller_.ReachedHardThreshold(usage_);
   }
@@ -569,6 +574,8 @@
   // page freelists without locking.
   const intptr_t num_freelists_;
   FreeList* freelists_;
+  static constexpr intptr_t kOOMReservationSize = 32 * KB;
+  FreeListElement* oom_reservation_ = nullptr;
 
   // Use ExclusivePageIterator for safe access to these.
   mutable Mutex pages_lock_;
diff --git a/runtime/vm/heap/safepoint.h b/runtime/vm/heap/safepoint.h
index 7c3dde1..faf9c46 100644
--- a/runtime/vm/heap/safepoint.h
+++ b/runtime/vm/heap/safepoint.h
@@ -233,6 +233,7 @@
 class TransitionVMToBlocked : public TransitionSafepointState {
  public:
   explicit TransitionVMToBlocked(Thread* T) : TransitionSafepointState(T) {
+    ASSERT(!T->isolate_group()->safepoint_handler()->IsOwnedByTheThread(T));
     // A thread blocked on a monitor is considered to be at a safepoint.
     ASSERT(T->execution_state() == Thread::kThreadInVM);
     T->set_execution_state(Thread::kThreadInBlockedState);
diff --git a/runtime/vm/heap/scavenger.cc b/runtime/vm/heap/scavenger.cc
index 41f1f99..e45ebd5 100644
--- a/runtime/vm/heap/scavenger.cc
+++ b/runtime/vm/heap/scavenger.cc
@@ -1512,6 +1512,10 @@
   if (abort_) {
     ReverseScavenge(&from);
     bytes_promoted = 0;
+  } else if ((CapacityInWords() - UsedInWords()) < KBInWords) {
+    // Don't scavenge again until the next old-space GC has occurred. Prevents
+    // performing one scavenge per allocation as the heap limit is approached.
+    heap_->assume_scavenge_will_fail_ = true;
   }
   ASSERT(promotion_stack_.IsEmpty());
   MournWeakHandles();
diff --git a/runtime/vm/heap/weak_code.cc b/runtime/vm/heap/weak_code.cc
index 795eda1a..c1a3d53 100644
--- a/runtime/vm/heap/weak_code.cc
+++ b/runtime/vm/heap/weak_code.cc
@@ -76,12 +76,10 @@
                                StackFrameIterator::kNoCrossThreadIteration);
     StackFrame* frame = iterator.NextFrame();
     while (frame != NULL) {
-      if (!frame->is_interpreted()) {
-        code = frame->LookupDartCode();
-        if (IsOptimizedCode(code_objects, code)) {
-          ReportDeoptimization(code);
-          DeoptimizeAt(code, frame);
-        }
+      code = frame->LookupDartCode();
+      if (IsOptimizedCode(code_objects, code)) {
+        ReportDeoptimization(code);
+        DeoptimizeAt(code, frame);
       }
       frame = iterator.NextFrame();
     }
diff --git a/runtime/vm/heap/weak_table.cc b/runtime/vm/heap/weak_table.cc
index 760e05d..fdb0a7d 100644
--- a/runtime/vm/heap/weak_table.cc
+++ b/runtime/vm/heap/weak_table.cc
@@ -35,7 +35,7 @@
   intptr_t empty_idx = -1;
   ObjectPtr obj = ObjectAtExclusive(idx);
 
-  while (obj != nullptr) {
+  while (obj != static_cast<ObjectPtr>(kNoEntry)) {
     if (obj == key) {
       SetValueAt(idx, val);
       return;
@@ -80,7 +80,11 @@
   count_ = 0;
   size_ = kMinSize;
   free(old_data);
-  data_ = reinterpret_cast<intptr_t*>(calloc(size_, kEntrySize * kWordSize));
+  data_ = reinterpret_cast<intptr_t*>(malloc(size_ * kEntrySize * kWordSize));
+  for (intptr_t i = 0; i < size_; i++) {
+    data_[ObjectIndex(i)] = kNoEntry;
+    data_[ValueIndex(i)] = kNoValue;
+  }
 }
 
 void WeakTable::Forward(ObjectPointerVisitor* visitor) {
@@ -102,7 +106,11 @@
   intptr_t new_size = SizeFor(count(), size());
   ASSERT(Utils::IsPowerOfTwo(new_size));
   intptr_t* new_data =
-      reinterpret_cast<intptr_t*>(calloc(new_size, kEntrySize * kWordSize));
+      reinterpret_cast<intptr_t*>(malloc(new_size * kEntrySize * kWordSize));
+  for (intptr_t i = 0; i < new_size; i++) {
+    new_data[ObjectIndex(i)] = kNoEntry;
+    new_data[ValueIndex(i)] = kNoValue;
+  }
 
   intptr_t mask = new_size - 1;
   set_used(0);
@@ -112,7 +120,7 @@
       ObjectPtr key = ObjectAtExclusive(i);
       intptr_t idx = Hash(key) & mask;
       ObjectPtr obj = static_cast<ObjectPtr>(new_data[ObjectIndex(idx)]);
-      while (obj != nullptr) {
+      while (obj != static_cast<ObjectPtr>(kNoEntry)) {
         ASSERT(obj != key);  // Duplicate entry is not expected.
         idx = (idx + 1) & mask;
         obj = static_cast<ObjectPtr>(new_data[ObjectIndex(idx)]);
diff --git a/runtime/vm/heap/weak_table.h b/runtime/vm/heap/weak_table.h
index f145dfe..c7728b0 100644
--- a/runtime/vm/heap/weak_table.h
+++ b/runtime/vm/heap/weak_table.h
@@ -17,10 +17,7 @@
  public:
   static constexpr intptr_t kNoValue = 0;
 
-  WeakTable() : size_(kMinSize), used_(0), count_(0) {
-    ASSERT(Utils::IsPowerOfTwo(size_));
-    data_ = reinterpret_cast<intptr_t*>(calloc(size_, kEntrySize * kWordSize));
-  }
+  WeakTable() : WeakTable(kMinSize) {}
   explicit WeakTable(intptr_t size) : used_(0), count_(0) {
     ASSERT(size >= 0);
     ASSERT(Utils::IsPowerOfTwo(kMinSize));
@@ -36,7 +33,11 @@
     }
     size_ = size;
     ASSERT(Utils::IsPowerOfTwo(size_));
-    data_ = reinterpret_cast<intptr_t*>(calloc(size_, kEntrySize * kWordSize));
+    data_ = reinterpret_cast<intptr_t*>(malloc(size_ * kEntrySize * kWordSize));
+    for (intptr_t i = 0; i < size_; i++) {
+      data_[ObjectIndex(i)] = kNoEntry;
+      data_[ValueIndex(i)] = kNoValue;
+    }
   }
 
   ~WeakTable() { free(data_); }
@@ -68,9 +69,9 @@
 
   bool IsValidEntryAtExclusive(intptr_t i) const {
     ASSERT((ValueAtExclusive(i) == 0 &&
-            (ObjectAtExclusive(i) == nullptr ||
+            (data_[ObjectIndex(i)] == kNoEntry ||
              data_[ObjectIndex(i)] == kDeletedEntry)) ||
-           (ValueAtExclusive(i) != 0 && ObjectAtExclusive(i) != nullptr &&
+           (ValueAtExclusive(i) != 0 && data_[ObjectIndex(i)] != kNoEntry &&
             data_[ObjectIndex(i)] != kDeletedEntry));
     return (data_[ValueIndex(i)] != 0);
   }
@@ -98,7 +99,7 @@
     intptr_t mask = size() - 1;
     intptr_t idx = Hash(key) & mask;
     ObjectPtr obj = ObjectAtExclusive(idx);
-    while (obj != nullptr) {
+    while (obj != static_cast<ObjectPtr>(kNoEntry)) {
       if (obj == key) {
         return ValueAtExclusive(idx);
       }
@@ -115,7 +116,7 @@
     intptr_t mask = size() - 1;
     intptr_t idx = Hash(key) & mask;
     ObjectPtr obj = ObjectAtExclusive(idx);
-    while (obj != nullptr) {
+    while (obj != static_cast<ObjectPtr>(kNoEntry)) {
       if (obj == key) {
         intptr_t result = ValueAtExclusive(idx);
         InvalidateAtExclusive(idx);
@@ -141,7 +142,8 @@
     kEntrySize,
   };
 
-  static const intptr_t kDeletedEntry = 1;  // Equivalent to a tagged NULL.
+  static const intptr_t kNoEntry = 1;       // Not a valid OOP.
+  static const intptr_t kDeletedEntry = 3;  // Not a valid OOP.
   static const intptr_t kMinSize = 8;
 
   static intptr_t SizeFor(intptr_t count, intptr_t size);
diff --git a/runtime/vm/heap/weak_table_test.cc b/runtime/vm/heap/weak_table_test.cc
new file mode 100644
index 0000000..edbca24
--- /dev/null
+++ b/runtime/vm/heap/weak_table_test.cc
@@ -0,0 +1,62 @@
+// Copyright (c) 2020, 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.
+
+#include "platform/globals.h"
+
+#include "platform/assert.h"
+#include "vm/globals.h"
+#include "vm/heap/heap.h"
+#include "vm/heap/weak_table.h"
+#include "vm/unit_test.h"
+
+namespace dart {
+
+ISOLATE_UNIT_TEST_CASE(WeakTables) {
+  const Object& old_obj = Object::Handle(String::New("old", Heap::kOld));
+  const Object& new_obj = Object::Handle(String::New("new", Heap::kNew));
+  const Object& imm_obj = Object::Handle(Smi::New(0));
+
+  // Initially absent.
+  Heap* heap = thread->heap();
+  const intptr_t kNoValue = WeakTable::kNoValue;
+  EXPECT_EQ(kNoValue, heap->GetObjectId(old_obj.raw()));
+  EXPECT_EQ(kNoValue, heap->GetObjectId(new_obj.raw()));
+  EXPECT_EQ(kNoValue, heap->GetObjectId(imm_obj.raw()));
+
+  // Found after insert.
+  heap->SetObjectId(old_obj.raw(), 100);
+  heap->SetObjectId(new_obj.raw(), 200);
+  heap->SetObjectId(imm_obj.raw(), 300);
+  EXPECT_EQ(100, heap->GetObjectId(old_obj.raw()));
+  EXPECT_EQ(200, heap->GetObjectId(new_obj.raw()));
+  EXPECT_EQ(300, heap->GetObjectId(imm_obj.raw()));
+
+  // Found after update.
+  heap->SetObjectId(old_obj.raw(), 400);
+  heap->SetObjectId(new_obj.raw(), 500);
+  heap->SetObjectId(imm_obj.raw(), 600);
+  EXPECT_EQ(400, heap->GetObjectId(old_obj.raw()));
+  EXPECT_EQ(500, heap->GetObjectId(new_obj.raw()));
+  EXPECT_EQ(600, heap->GetObjectId(imm_obj.raw()));
+
+  // Found after GC.
+  GCTestHelper::CollectNewSpace();
+  EXPECT_EQ(400, heap->GetObjectId(old_obj.raw()));
+  EXPECT_EQ(500, heap->GetObjectId(new_obj.raw()));
+  EXPECT_EQ(600, heap->GetObjectId(imm_obj.raw()));
+
+  // Found after GC.
+  GCTestHelper::CollectOldSpace();
+  EXPECT_EQ(400, heap->GetObjectId(old_obj.raw()));
+  EXPECT_EQ(500, heap->GetObjectId(new_obj.raw()));
+  EXPECT_EQ(600, heap->GetObjectId(imm_obj.raw()));
+
+  // Absent after reset.
+  heap->ResetObjectIdTable();
+  EXPECT_EQ(kNoValue, heap->GetObjectId(old_obj.raw()));
+  EXPECT_EQ(kNoValue, heap->GetObjectId(new_obj.raw()));
+  EXPECT_EQ(kNoValue, heap->GetObjectId(imm_obj.raw()));
+}
+
+}  // namespace dart
diff --git a/runtime/vm/image_snapshot.cc b/runtime/vm/image_snapshot.cc
index 4e53de4..197e24f 100644
--- a/runtime/vm/image_snapshot.cc
+++ b/runtime/vm/image_snapshot.cc
@@ -271,6 +271,16 @@
       return compiler::target::Instructions::InstanceSize(
           Instructions::Size(raw_insns));
     }
+    case kOneByteStringCid: {
+      auto raw_str = String::RawCast(raw_object);
+      return compiler::target::String::InstanceSize(
+          String::LengthOf(raw_str) * OneByteString::kBytesPerElement);
+    }
+    case kTwoByteStringCid: {
+      auto raw_str = String::RawCast(raw_object);
+      return compiler::target::String::InstanceSize(
+          String::LengthOf(raw_str) * TwoByteString::kBytesPerElement);
+    }
     default: {
       const Class& clazz = Class::Handle(Object::Handle(raw_object).clazz());
       FATAL("Unsupported class %s in rodata section.\n", clazz.ToCString());
@@ -520,6 +530,24 @@
       ASSERT_EQUAL(stream->Position() - object_start,
                    compiler::target::PcDescriptors::HeaderSize());
       stream->WriteBytes(desc.raw()->ptr()->data(), desc.Length());
+    } else if (obj.IsString()) {
+      const String& str = String::Cast(obj);
+      RELEASE_ASSERT(String::GetCachedHash(str.raw()) != 0);
+      RELEASE_ASSERT(str.IsOneByteString() || str.IsTwoByteString());
+
+      stream->WriteTargetWord(static_cast<uword>(str.raw()->ptr()->length_));
+#if !defined(HASH_IN_OBJECT_HEADER)
+      stream->WriteTargetWord(static_cast<uword>(str.raw()->ptr()->hash_));
+#endif
+      ASSERT_EQUAL(stream->Position() - object_start,
+                   compiler::target::String::InstanceSize());
+      stream->WriteBytes(
+          str.IsOneByteString()
+              ? static_cast<const void*>(OneByteString::DataStart(str))
+              : static_cast<const void*>(TwoByteString::DataStart(str)),
+          str.Length() * (str.IsOneByteString()
+                              ? OneByteString::kBytesPerElement
+                              : TwoByteString::kBytesPerElement));
     } else {
       const Class& clazz = Class::Handle(obj.clazz());
       FATAL("Unsupported class %s in rodata section.\n", clazz.ToCString());
@@ -535,7 +563,9 @@
     ObjectLayout::OldAndNotRememberedBit::encode(true) |
     ObjectLayout::NewBit::encode(false);
 
-uword ImageWriter::GetMarkedTags(classid_t cid, intptr_t size) {
+uword ImageWriter::GetMarkedTags(classid_t cid,
+                                 intptr_t size,
+                                 bool is_canonical /* = false */) {
   // ObjectLayout::SizeTag expects a size divisible by kObjectAlignment and
   // checks this in debug mode, but the size on the target machine may not be
   // divisible by the host machine's object alignment if they differ.
@@ -554,7 +584,8 @@
                compiler::target::ObjectAlignment::kObjectAlignmentLog2);
 
   return kReadOnlyGCBits | ObjectLayout::ClassIdTag::encode(cid) |
-         ObjectLayout::SizeTag::encode(adjusted_size);
+         ObjectLayout::SizeTag::encode(adjusted_size) |
+         ObjectLayout::CanonicalBit::encode(is_canonical);
 }
 
 uword ImageWriter::GetMarkedTags(const Object& obj) {
@@ -562,7 +593,8 @@
 #if defined(HASH_IN_OBJECT_HEADER)
       static_cast<uword>(obj.raw()->ptr()->hash_) << kBitsPerInt32 |
 #endif
-      GetMarkedTags(obj.raw()->GetClassId(), SizeInSnapshot(obj));
+      GetMarkedTags(obj.raw()->GetClassId(), SizeInSnapshot(obj),
+                    obj.IsCanonical());
 }
 
 const char* ImageWriter::SectionSymbol(ProgramSection section, bool vm) const {
diff --git a/runtime/vm/image_snapshot.h b/runtime/vm/image_snapshot.h
index 060f3a9..cc5ac6d 100644
--- a/runtime/vm/image_snapshot.h
+++ b/runtime/vm/image_snapshot.h
@@ -319,7 +319,9 @@
   // shared by both.
   const char* SectionSymbol(ProgramSection section, bool vm) const;
 
-  static uword GetMarkedTags(classid_t cid, intptr_t size);
+  static uword GetMarkedTags(classid_t cid,
+                             intptr_t size,
+                             bool is_canonical = false);
   static uword GetMarkedTags(const Object& obj);
 
   void DumpInstructionStats();
diff --git a/runtime/vm/instructions_arm.cc b/runtime/vm/instructions_arm.cc
index 3d6c231..83ae8f5 100644
--- a/runtime/vm/instructions_arm.cc
+++ b/runtime/vm/instructions_arm.cc
@@ -420,11 +420,12 @@
 intptr_t TypeTestingStubCallPattern::GetSubtypeTestCachePoolIndex() {
   // Calls to the type testing stubs look like:
   //   ldr R9, ...
-  //   ldr R3, [PP+idx]
+  //   ldr Rn, [PP+idx]
   //   blx R9
   // or
-  //   ldr R3, [PP+idx]
+  //   ldr Rn, [PP+idx]
   //   blx pc+<offset>
+  // where Rn = TypeTestABI::kSubtypeTestCacheReg.
 
   // Ensure the caller of the type testing stub (whose return address is [pc_])
   // branched via `blx R9` or a pc-relative call.
@@ -440,7 +441,7 @@
   Register reg;
   intptr_t pool_index = -1;
   InstructionPattern::DecodeLoadWordFromPool(load_instr_end, &reg, &pool_index);
-  ASSERT(reg == R3);
+  ASSERT_EQUAL(reg, TypeTestABI::kSubtypeTestCacheReg);
   return pool_index;
 }
 
diff --git a/runtime/vm/instructions_arm64.cc b/runtime/vm/instructions_arm64.cc
index 17b2243..2eed6c0 100644
--- a/runtime/vm/instructions_arm64.cc
+++ b/runtime/vm/instructions_arm64.cc
@@ -556,11 +556,12 @@
 intptr_t TypeTestingStubCallPattern::GetSubtypeTestCachePoolIndex() {
   // Calls to the type testing stubs look like:
   //   ldr R9, ...
-  //   ldr R3, [PP+idx]
+  //   ldr Rn, [PP+idx]
   //   blr R9
   // or
-  //   ldr R3, [PP+idx]
+  //   ldr Rn, [PP+idx]
   //   blr pc+<offset>
+  // where Rn = TypeTestABI::kSubtypeTestCacheReg.
 
   // Ensure the caller of the type testing stub (whose return address is [pc_])
   // branched via `blr R9` or a pc-relative call.
@@ -576,7 +577,7 @@
   Register reg;
   intptr_t pool_index = -1;
   InstructionPattern::DecodeLoadWordFromPool(load_instr_end, &reg, &pool_index);
-  ASSERT(reg == R3);
+  ASSERT_EQUAL(reg, TypeTestABI::kSubtypeTestCacheReg);
   return pool_index;
 }
 
diff --git a/runtime/vm/instructions_kbc.cc b/runtime/vm/instructions_kbc.cc
deleted file mode 100644
index b427738..0000000
--- a/runtime/vm/instructions_kbc.cc
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright (c) 2018, 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.
-
-#include "vm/globals.h"
-#if !defined(DART_PRECOMPILED_RUNTIME)
-
-#include "vm/instructions.h"
-#include "vm/instructions_kbc.h"
-
-#include "vm/constants_kbc.h"
-#include "vm/native_entry.h"
-
-namespace dart {
-
-TypedDataPtr KBCNativeCallPattern::GetNativeEntryDataAt(
-    uword pc,
-    const Bytecode& bytecode) {
-  ASSERT(bytecode.ContainsInstructionAt(pc));
-
-  const KBCInstr* return_addr = reinterpret_cast<const KBCInstr*>(pc);
-  const KBCInstr* instr =
-      reinterpret_cast<const KBCInstr*>(bytecode.PayloadStart());
-  ASSERT(instr < return_addr);
-  while (!KernelBytecode::IsNativeCallOpcode(instr)) {
-    instr = KernelBytecode::Next(instr);
-    if (instr >= return_addr) {
-      FATAL1(
-          "Unable to find NativeCall bytecode instruction"
-          " corresponding to PC %" Px,
-          pc);
-    }
-  }
-
-  intptr_t native_entry_data_pool_index = KernelBytecode::DecodeD(instr);
-  const ObjectPool& obj_pool = ObjectPool::Handle(bytecode.object_pool());
-  TypedData& native_entry_data = TypedData::Handle();
-  native_entry_data ^= obj_pool.ObjectAt(native_entry_data_pool_index);
-  // Native calls to recognized functions should never be patched.
-  ASSERT(NativeEntryData(native_entry_data).kind() ==
-         MethodRecognizer::kUnknown);
-  return native_entry_data.raw();
-}
-
-}  // namespace dart
-
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
diff --git a/runtime/vm/instructions_kbc.h b/runtime/vm/instructions_kbc.h
deleted file mode 100644
index 5bfdb11..0000000
--- a/runtime/vm/instructions_kbc.h
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright (c) 2018, 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.
-// Classes that describe assembly patterns as used by inline caches.
-
-#ifndef RUNTIME_VM_INSTRUCTIONS_KBC_H_
-#define RUNTIME_VM_INSTRUCTIONS_KBC_H_
-
-#include "vm/globals.h"
-#if !defined(DART_PRECOMPILED_RUNTIME)
-
-#include "vm/object.h"
-
-namespace dart {
-
-class KBCNativeCallPattern : public AllStatic {
- public:
-  static TypedDataPtr GetNativeEntryDataAt(uword pc, const Bytecode& bytecode);
-};
-
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-
-}  // namespace dart
-
-#endif  // RUNTIME_VM_INSTRUCTIONS_KBC_H_
diff --git a/runtime/vm/interpreter.cc b/runtime/vm/interpreter.cc
deleted file mode 100644
index 38a0159..0000000
--- a/runtime/vm/interpreter.cc
+++ /dev/null
@@ -1,3991 +0,0 @@
-// Copyright (c) 2018, 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.
-
-#include <setjmp.h>  // NOLINT
-#include <stdlib.h>
-
-#include "vm/globals.h"
-#if !defined(DART_PRECOMPILED_RUNTIME)
-
-#include "vm/interpreter.h"
-
-#include "vm/class_id.h"
-#include "vm/compiler/api/type_check_mode.h"
-#include "vm/compiler/assembler/assembler.h"
-#include "vm/compiler/assembler/disassembler_kbc.h"
-#include "vm/compiler/backend/flow_graph_compiler.h"
-#include "vm/compiler/ffi/abi.h"
-#include "vm/compiler/frontend/bytecode_reader.h"
-#include "vm/compiler/jit/compiler.h"
-#include "vm/cpu.h"
-#include "vm/dart_entry.h"
-#include "vm/debugger.h"
-#include "vm/lockers.h"
-#include "vm/native_arguments.h"
-#include "vm/native_entry.h"
-#include "vm/object.h"
-#include "vm/object_store.h"
-#include "vm/os_thread.h"
-#include "vm/stack_frame_kbc.h"
-#include "vm/symbols.h"
-
-namespace dart {
-
-DEFINE_FLAG(uint64_t,
-            trace_interpreter_after,
-            ULLONG_MAX,
-            "Trace interpreter execution after instruction count reached.");
-DEFINE_FLAG(charp,
-            interpreter_trace_file,
-            NULL,
-            "File to write a dynamic instruction trace to.");
-DEFINE_FLAG(uint64_t,
-            interpreter_trace_file_max_bytes,
-            100 * MB,
-            "Maximum size in bytes of the interpreter trace file");
-
-// InterpreterSetjmpBuffer are linked together, and the last created one
-// is referenced by the Interpreter. When an exception is thrown, the exception
-// runtime looks at where to jump and finds the corresponding
-// InterpreterSetjmpBuffer based on the stack pointer of the exception handler.
-// The runtime then does a Longjmp on that buffer to return to the interpreter.
-class InterpreterSetjmpBuffer {
- public:
-  void Longjmp() {
-    // "This" is now the last setjmp buffer.
-    interpreter_->set_last_setjmp_buffer(this);
-    longjmp(buffer_, 1);
-  }
-
-  explicit InterpreterSetjmpBuffer(Interpreter* interpreter) {
-    interpreter_ = interpreter;
-    link_ = interpreter->last_setjmp_buffer();
-    interpreter->set_last_setjmp_buffer(this);
-    fp_ = interpreter->fp_;
-  }
-
-  ~InterpreterSetjmpBuffer() {
-    ASSERT(interpreter_->last_setjmp_buffer() == this);
-    interpreter_->set_last_setjmp_buffer(link_);
-  }
-
-  InterpreterSetjmpBuffer* link() const { return link_; }
-
-  uword fp() const { return reinterpret_cast<uword>(fp_); }
-
-  jmp_buf buffer_;
-
- private:
-  ObjectPtr* fp_;
-  Interpreter* interpreter_;
-  InterpreterSetjmpBuffer* link_;
-
-  friend class Interpreter;
-
-  DISALLOW_ALLOCATION();
-  DISALLOW_COPY_AND_ASSIGN(InterpreterSetjmpBuffer);
-};
-
-DART_FORCE_INLINE static ObjectPtr* SavedCallerFP(ObjectPtr* FP) {
-  return reinterpret_cast<ObjectPtr*>(
-      static_cast<uword>(FP[kKBCSavedCallerFpSlotFromFp]));
-}
-
-DART_FORCE_INLINE static ObjectPtr* FrameArguments(ObjectPtr* FP,
-                                                   intptr_t argc) {
-  return FP - (kKBCDartFrameFixedSize + argc);
-}
-
-#define RAW_CAST(Type, val) (InterpreterHelpers::CastTo##Type(val))
-
-class InterpreterHelpers {
- public:
-#define DEFINE_CASTS(Type)                                                     \
-  DART_FORCE_INLINE static Type##Ptr CastTo##Type(ObjectPtr obj) {             \
-    ASSERT((k##Type##Cid == kSmiCid)                                           \
-               ? !obj->IsHeapObject()                                          \
-               : (k##Type##Cid == kIntegerCid)                                 \
-                     ? (!obj->IsHeapObject() || obj->IsMint())                 \
-                     : obj->Is##Type());                                       \
-    return static_cast<Type##Ptr>(obj);                                        \
-  }
-  CLASS_LIST(DEFINE_CASTS)
-#undef DEFINE_CASTS
-
-  DART_FORCE_INLINE static SmiPtr GetClassIdAsSmi(ObjectPtr obj) {
-    return Smi::New(obj->IsHeapObject() ? obj->GetClassId()
-                                        : static_cast<intptr_t>(kSmiCid));
-  }
-
-  DART_FORCE_INLINE static intptr_t GetClassId(ObjectPtr obj) {
-    return obj->IsHeapObject() ? obj->GetClassId()
-                               : static_cast<intptr_t>(kSmiCid);
-  }
-
-  DART_FORCE_INLINE static TypeArgumentsPtr GetTypeArguments(
-      Thread* thread,
-      InstancePtr instance) {
-    ClassPtr instance_class =
-        thread->isolate()->class_table()->At(GetClassId(instance));
-    return instance_class->ptr()->num_type_arguments_ > 0
-               ? reinterpret_cast<TypeArgumentsPtr*>(instance->ptr())
-                     [instance_class->ptr()
-                          ->host_type_arguments_field_offset_in_words_]
-               : TypeArguments::null();
-  }
-
-  // The usage counter is actually a 'hotness' counter.
-  // For an instance call, both the usage counters of the caller and of the
-  // calle will get incremented, as well as the ICdata counter at the call site.
-  DART_FORCE_INLINE static void IncrementUsageCounter(FunctionPtr f) {
-    f->ptr()->usage_counter_++;
-  }
-
-  DART_FORCE_INLINE static void IncrementICUsageCount(ObjectPtr* entries,
-                                                      intptr_t offset,
-                                                      intptr_t args_tested) {
-    const intptr_t count_offset = ICData::CountIndexFor(args_tested);
-    const intptr_t raw_smi_old =
-        static_cast<intptr_t>(entries[offset + count_offset]);
-    const intptr_t raw_smi_new = raw_smi_old + Smi::RawValue(1);
-    *reinterpret_cast<intptr_t*>(&entries[offset + count_offset]) = raw_smi_new;
-  }
-
-  DART_FORCE_INLINE static bool CheckIndex(SmiPtr index, SmiPtr length) {
-    return !index->IsHeapObject() && (static_cast<intptr_t>(index) >= 0) &&
-           (static_cast<intptr_t>(index) < static_cast<intptr_t>(length));
-  }
-
-  DART_FORCE_INLINE static intptr_t ArgDescTypeArgsLen(ArrayPtr argdesc) {
-    return Smi::Value(*reinterpret_cast<SmiPtr*>(
-        reinterpret_cast<uword>(argdesc->ptr()) +
-        Array::element_offset(ArgumentsDescriptor::kTypeArgsLenIndex)));
-  }
-
-  DART_FORCE_INLINE static intptr_t ArgDescArgCount(ArrayPtr argdesc) {
-    return Smi::Value(*reinterpret_cast<SmiPtr*>(
-        reinterpret_cast<uword>(argdesc->ptr()) +
-        Array::element_offset(ArgumentsDescriptor::kCountIndex)));
-  }
-
-  DART_FORCE_INLINE static intptr_t ArgDescArgSize(ArrayPtr argdesc) {
-    return Smi::Value(*reinterpret_cast<SmiPtr*>(
-        reinterpret_cast<uword>(argdesc->ptr()) +
-        Array::element_offset(ArgumentsDescriptor::kSizeIndex)));
-  }
-
-  DART_FORCE_INLINE static intptr_t ArgDescPosCount(ArrayPtr argdesc) {
-    return Smi::Value(*reinterpret_cast<SmiPtr*>(
-        reinterpret_cast<uword>(argdesc->ptr()) +
-        Array::element_offset(ArgumentsDescriptor::kPositionalCountIndex)));
-  }
-
-  DART_FORCE_INLINE static BytecodePtr FrameBytecode(ObjectPtr* FP) {
-    ASSERT(GetClassId(FP[kKBCPcMarkerSlotFromFp]) == kBytecodeCid);
-    return static_cast<BytecodePtr>(FP[kKBCPcMarkerSlotFromFp]);
-  }
-
-  DART_FORCE_INLINE static bool FieldNeedsGuardUpdate(FieldPtr field,
-                                                      ObjectPtr value) {
-    // The interpreter should never see a cloned field.
-    ASSERT(field->ptr()->owner_->GetClassId() != kFieldCid);
-
-    const classid_t guarded_cid = field->ptr()->guarded_cid_;
-
-    if (guarded_cid == kDynamicCid) {
-      // Field is not guarded.
-      return false;
-    }
-
-    ASSERT(Isolate::Current()->use_field_guards());
-
-    const classid_t nullability_cid = field->ptr()->is_nullable_;
-    const classid_t value_cid = InterpreterHelpers::GetClassId(value);
-
-    if (nullability_cid == value_cid) {
-      // Storing null into a nullable field.
-      return false;
-    }
-
-    if (guarded_cid != value_cid) {
-      // First assignment (guarded_cid == kIllegalCid) or
-      // field no longer monomorphic or
-      // field has become nullable.
-      return true;
-    }
-
-    intptr_t guarded_list_length =
-        Smi::Value(field->ptr()->guarded_list_length_);
-
-    if (UNLIKELY(guarded_list_length >= Field::kUnknownFixedLength)) {
-      // Guarding length, check this in the runtime.
-      return true;
-    }
-
-    if (UNLIKELY(field->ptr()->static_type_exactness_state_ >=
-                 StaticTypeExactnessState::Uninitialized().Encode())) {
-      // Guarding "exactness", check this in the runtime.
-      return true;
-    }
-
-    // Everything matches.
-    return false;
-  }
-
-  DART_FORCE_INLINE static bool IsAllocateFinalized(ClassPtr cls) {
-    return Class::ClassFinalizedBits::decode(cls->ptr()->state_bits_) ==
-           ClassLayout::kAllocateFinalized;
-  }
-};
-
-DART_FORCE_INLINE static const KBCInstr* SavedCallerPC(ObjectPtr* FP) {
-  return reinterpret_cast<const KBCInstr*>(
-      static_cast<uword>(FP[kKBCSavedCallerPcSlotFromFp]));
-}
-
-DART_FORCE_INLINE static FunctionPtr FrameFunction(ObjectPtr* FP) {
-  FunctionPtr function = static_cast<FunctionPtr>(FP[kKBCFunctionSlotFromFp]);
-  ASSERT(InterpreterHelpers::GetClassId(function) == kFunctionCid ||
-         InterpreterHelpers::GetClassId(function) == kNullCid);
-  return function;
-}
-
-DART_FORCE_INLINE static ObjectPtr InitializeHeader(uword addr,
-                                                    intptr_t class_id,
-                                                    intptr_t instance_size) {
-  uint32_t tags = 0;
-  tags = ObjectLayout::ClassIdTag::update(class_id, tags);
-  tags = ObjectLayout::SizeTag::update(instance_size, tags);
-  tags = ObjectLayout::OldBit::update(false, tags);
-  tags = ObjectLayout::OldAndNotMarkedBit::update(false, tags);
-  tags = ObjectLayout::OldAndNotRememberedBit::update(false, tags);
-  tags = ObjectLayout::NewBit::update(true, tags);
-  // Also writes zero in the hash_ field.
-  *reinterpret_cast<uword*>(addr + Object::tags_offset()) = tags;
-  return ObjectLayout::FromAddr(addr);
-}
-
-DART_FORCE_INLINE static bool TryAllocate(Thread* thread,
-                                          intptr_t class_id,
-                                          intptr_t instance_size,
-                                          ObjectPtr* result) {
-  ASSERT(instance_size > 0);
-  ASSERT(Utils::IsAligned(instance_size, kObjectAlignment));
-
-#ifndef PRODUCT
-  auto table = thread->isolate_group()->shared_class_table();
-  if (UNLIKELY(table->TraceAllocationFor(class_id))) {
-    return false;
-  }
-#endif
-  const uword top = thread->top();
-  const intptr_t remaining = thread->end() - top;
-  if (LIKELY(remaining >= instance_size)) {
-    thread->set_top(top + instance_size);
-    *result = InitializeHeader(top, class_id, instance_size);
-    return true;
-  }
-  return false;
-}
-
-void LookupCache::Clear() {
-  for (intptr_t i = 0; i < kNumEntries; i++) {
-    entries_[i].receiver_cid = kIllegalCid;
-  }
-}
-
-bool LookupCache::Lookup(intptr_t receiver_cid,
-                         StringPtr function_name,
-                         ArrayPtr arguments_descriptor,
-                         FunctionPtr* target) const {
-  ASSERT(receiver_cid != kIllegalCid);  // Sentinel value.
-
-  const intptr_t hash = receiver_cid ^ static_cast<intptr_t>(function_name) ^
-                        static_cast<intptr_t>(arguments_descriptor);
-  const intptr_t probe1 = hash & kTableMask;
-  if (entries_[probe1].receiver_cid == receiver_cid &&
-      entries_[probe1].function_name == function_name &&
-      entries_[probe1].arguments_descriptor == arguments_descriptor) {
-    *target = entries_[probe1].target;
-    return true;
-  }
-
-  intptr_t probe2 = (hash >> 3) & kTableMask;
-  if (entries_[probe2].receiver_cid == receiver_cid &&
-      entries_[probe2].function_name == function_name &&
-      entries_[probe2].arguments_descriptor == arguments_descriptor) {
-    *target = entries_[probe2].target;
-    return true;
-  }
-
-  return false;
-}
-
-void LookupCache::Insert(intptr_t receiver_cid,
-                         StringPtr function_name,
-                         ArrayPtr arguments_descriptor,
-                         FunctionPtr target) {
-  // Otherwise we have to clear the cache or rehash on scavenges too.
-  ASSERT(function_name->IsOldObject());
-  ASSERT(arguments_descriptor->IsOldObject());
-  ASSERT(target->IsOldObject());
-
-  const intptr_t hash = receiver_cid ^ static_cast<intptr_t>(function_name) ^
-                        static_cast<intptr_t>(arguments_descriptor);
-  const intptr_t probe1 = hash & kTableMask;
-  if (entries_[probe1].receiver_cid == kIllegalCid) {
-    entries_[probe1].receiver_cid = receiver_cid;
-    entries_[probe1].function_name = function_name;
-    entries_[probe1].arguments_descriptor = arguments_descriptor;
-    entries_[probe1].target = target;
-    return;
-  }
-
-  const intptr_t probe2 = (hash >> 3) & kTableMask;
-  if (entries_[probe2].receiver_cid == kIllegalCid) {
-    entries_[probe2].receiver_cid = receiver_cid;
-    entries_[probe2].function_name = function_name;
-    entries_[probe2].arguments_descriptor = arguments_descriptor;
-    entries_[probe2].target = target;
-    return;
-  }
-
-  entries_[probe1].receiver_cid = receiver_cid;
-  entries_[probe1].function_name = function_name;
-  entries_[probe1].arguments_descriptor = arguments_descriptor;
-  entries_[probe1].target = target;
-}
-
-Interpreter::Interpreter()
-    : stack_(NULL),
-      fp_(NULL),
-      pp_(nullptr),
-      argdesc_(nullptr),
-      lookup_cache_() {
-  // Setup interpreter support first. Some of this information is needed to
-  // setup the architecture state.
-  // We allocate the stack here, the size is computed as the sum of
-  // the size specified by the user and the buffer space needed for
-  // handling stack overflow exceptions. To be safe in potential
-  // stack underflows we also add some underflow buffer space.
-  stack_ = new uintptr_t[(OSThread::GetSpecifiedStackSize() +
-                          OSThread::kStackSizeBufferMax +
-                          kInterpreterStackUnderflowSize) /
-                         sizeof(uintptr_t)];
-  // Low address.
-  stack_base_ =
-      reinterpret_cast<uword>(stack_) + kInterpreterStackUnderflowSize;
-  // Limit for StackOverflowError.
-  overflow_stack_limit_ = stack_base_ + OSThread::GetSpecifiedStackSize();
-  // High address.
-  stack_limit_ = overflow_stack_limit_ + OSThread::kStackSizeBufferMax;
-
-  last_setjmp_buffer_ = NULL;
-
-  DEBUG_ONLY(icount_ = 1);  // So that tracing after 0 traces first bytecode.
-
-#if defined(DEBUG)
-  trace_file_bytes_written_ = 0;
-  trace_file_ = NULL;
-  if (FLAG_interpreter_trace_file != NULL) {
-    Dart_FileOpenCallback file_open = Dart::file_open_callback();
-    if (file_open != NULL) {
-      trace_file_ = file_open(FLAG_interpreter_trace_file, /* write */ true);
-      trace_buffer_ = new KBCInstr[kTraceBufferInstrs];
-      trace_buffer_idx_ = 0;
-    }
-  }
-#endif
-  // Make sure interpreter's unboxing view is consistent with compiler.
-  supports_unboxed_doubles_ = FlowGraphCompiler::SupportsUnboxedDoubles();
-  supports_unboxed_simd128_ = FlowGraphCompiler::SupportsUnboxedSimd128();
-}
-
-Interpreter::~Interpreter() {
-  delete[] stack_;
-  pp_ = NULL;
-  argdesc_ = NULL;
-#if defined(DEBUG)
-  if (trace_file_ != NULL) {
-    FlushTraceBuffer();
-    // Close the file.
-    Dart_FileCloseCallback file_close = Dart::file_close_callback();
-    if (file_close != NULL) {
-      file_close(trace_file_);
-      trace_file_ = NULL;
-      delete[] trace_buffer_;
-      trace_buffer_ = NULL;
-    }
-  }
-#endif
-}
-
-// Get the active Interpreter for the current isolate.
-Interpreter* Interpreter::Current() {
-  Thread* thread = Thread::Current();
-  Interpreter* interpreter = thread->interpreter();
-  if (interpreter == nullptr) {
-    NoSafepointScope no_safepoint;
-    interpreter = new Interpreter();
-    thread->set_interpreter(interpreter);
-  }
-  return interpreter;
-}
-
-#if defined(DEBUG)
-// Returns true if tracing of executed instructions is enabled.
-// May be called on entry, when icount_ has not been incremented yet.
-DART_FORCE_INLINE bool Interpreter::IsTracingExecution() const {
-  return icount_ > FLAG_trace_interpreter_after;
-}
-
-// Prints bytecode instruction at given pc for instruction tracing.
-DART_NOINLINE void Interpreter::TraceInstruction(const KBCInstr* pc) const {
-  THR_Print("%" Pu64 " ", icount_);
-  if (FLAG_support_disassembler) {
-    KernelBytecodeDisassembler::Disassemble(
-        reinterpret_cast<uword>(pc),
-        reinterpret_cast<uword>(KernelBytecode::Next(pc)));
-  } else {
-    THR_Print("Disassembler not supported in this mode.\n");
-  }
-}
-
-DART_FORCE_INLINE bool Interpreter::IsWritingTraceFile() const {
-  return (trace_file_ != NULL) &&
-         (trace_file_bytes_written_ < FLAG_interpreter_trace_file_max_bytes);
-}
-
-void Interpreter::FlushTraceBuffer() {
-  Dart_FileWriteCallback file_write = Dart::file_write_callback();
-  if (file_write == NULL) {
-    return;
-  }
-  if (trace_file_bytes_written_ >= FLAG_interpreter_trace_file_max_bytes) {
-    return;
-  }
-  const intptr_t bytes_to_write = Utils::Minimum(
-      static_cast<uint64_t>(trace_buffer_idx_ * sizeof(KBCInstr)),
-      FLAG_interpreter_trace_file_max_bytes - trace_file_bytes_written_);
-  if (bytes_to_write == 0) {
-    return;
-  }
-  file_write(trace_buffer_, bytes_to_write, trace_file_);
-  trace_file_bytes_written_ += bytes_to_write;
-  trace_buffer_idx_ = 0;
-}
-
-DART_NOINLINE void Interpreter::WriteInstructionToTrace(const KBCInstr* pc) {
-  Dart_FileWriteCallback file_write = Dart::file_write_callback();
-  if (file_write == NULL) {
-    return;
-  }
-  const KBCInstr* next = KernelBytecode::Next(pc);
-  while ((trace_buffer_idx_ < kTraceBufferInstrs) && (pc != next)) {
-    trace_buffer_[trace_buffer_idx_++] = *pc;
-    ++pc;
-  }
-  if (trace_buffer_idx_ == kTraceBufferInstrs) {
-    FlushTraceBuffer();
-  }
-}
-
-#endif  // defined(DEBUG)
-
-// Calls into the Dart runtime are based on this interface.
-typedef void (*InterpreterRuntimeCall)(NativeArguments arguments);
-
-// Calls to leaf Dart runtime functions are based on this interface.
-typedef intptr_t (*InterpreterLeafRuntimeCall)(intptr_t r0,
-                                               intptr_t r1,
-                                               intptr_t r2,
-                                               intptr_t r3);
-
-// Calls to leaf float Dart runtime functions are based on this interface.
-typedef double (*InterpreterLeafFloatRuntimeCall)(double d0, double d1);
-
-void Interpreter::Exit(Thread* thread,
-                       ObjectPtr* base,
-                       ObjectPtr* frame,
-                       const KBCInstr* pc) {
-  frame[0] = Function::null();
-  frame[1] = Bytecode::null();
-  frame[2] = static_cast<ObjectPtr>(reinterpret_cast<uword>(pc));
-  frame[3] = static_cast<ObjectPtr>(reinterpret_cast<uword>(base));
-
-  ObjectPtr* exit_fp = frame + kKBCDartFrameFixedSize;
-  thread->set_top_exit_frame_info(reinterpret_cast<uword>(exit_fp));
-  fp_ = exit_fp;
-
-#if defined(DEBUG)
-  if (IsTracingExecution()) {
-    THR_Print("%" Pu64 " ", icount_);
-    THR_Print("Exiting interpreter 0x%" Px " at fp_ 0x%" Px "\n",
-              reinterpret_cast<uword>(this), reinterpret_cast<uword>(exit_fp));
-  }
-#endif
-}
-
-void Interpreter::Unexit(Thread* thread) {
-#if !defined(PRODUCT)
-  // For the profiler.
-  ObjectPtr* exit_fp =
-      reinterpret_cast<ObjectPtr*>(thread->top_exit_frame_info());
-  ASSERT(exit_fp != 0);
-  pc_ = SavedCallerPC(exit_fp);
-  fp_ = SavedCallerFP(exit_fp);
-#endif
-  thread->set_top_exit_frame_info(0);
-}
-
-// Calling into runtime may trigger garbage collection and relocate objects,
-// so all ObjectPtr pointers become outdated and should not be used across
-// runtime calls.
-// Note: functions below are marked DART_NOINLINE to recover performance where
-// inlining these functions into the interpreter loop seemed to cause some code
-// quality issues. Functions with the "returns_twice" attribute, such as setjmp,
-// prevent reusing spill slots and large frame sizes.
-static DART_NOINLINE bool InvokeRuntime(Thread* thread,
-                                        Interpreter* interpreter,
-                                        RuntimeFunction drt,
-                                        const NativeArguments& args) {
-  InterpreterSetjmpBuffer buffer(interpreter);
-  if (!setjmp(buffer.buffer_)) {
-    thread->set_vm_tag(reinterpret_cast<uword>(drt));
-    drt(args);
-    thread->set_vm_tag(VMTag::kDartInterpretedTagId);
-    interpreter->Unexit(thread);
-    return true;
-  } else {
-    return false;
-  }
-}
-
-static DART_NOINLINE bool InvokeNative(Thread* thread,
-                                       Interpreter* interpreter,
-                                       NativeFunctionWrapper wrapper,
-                                       Dart_NativeFunction function,
-                                       Dart_NativeArguments args) {
-  InterpreterSetjmpBuffer buffer(interpreter);
-  if (!setjmp(buffer.buffer_)) {
-    thread->set_vm_tag(reinterpret_cast<uword>(function));
-    wrapper(args, function);
-    thread->set_vm_tag(VMTag::kDartInterpretedTagId);
-    interpreter->Unexit(thread);
-    return true;
-  } else {
-    return false;
-  }
-}
-
-extern "C" {
-// Note: The invocation stub follows the C ABI, so we cannot pass C++ struct
-// values like ObjectPtr. In some calling conventions (IA32), ObjectPtr is
-// passed/returned different from a pointer.
-typedef uword /*ObjectPtr*/ (*invokestub)(uword /*CodePtr*/ code,
-                                          uword /*ArrayPtr*/ argdesc,
-                                          ObjectPtr* arg0,
-                                          Thread* thread);
-}
-
-DART_NOINLINE bool Interpreter::InvokeCompiled(Thread* thread,
-                                               FunctionPtr function,
-                                               ObjectPtr* call_base,
-                                               ObjectPtr* call_top,
-                                               const KBCInstr** pc,
-                                               ObjectPtr** FP,
-                                               ObjectPtr** SP) {
-  ASSERT(Function::HasCode(function));
-  CodePtr code = function->ptr()->code_;
-  ASSERT(code != StubCode::LazyCompile().raw());
-  // TODO(regis): Once we share the same stack, try to invoke directly.
-#if defined(DEBUG)
-  if (IsTracingExecution()) {
-    THR_Print("%" Pu64 " ", icount_);
-    THR_Print("invoking compiled %s\n", Function::Handle(function).ToCString());
-  }
-#endif
-  // On success, returns a RawInstance.  On failure, a RawError.
-  invokestub volatile entrypoint = reinterpret_cast<invokestub>(
-      StubCode::InvokeDartCodeFromBytecode().EntryPoint());
-  ObjectPtr result;
-  Exit(thread, *FP, call_top + 1, *pc);
-  {
-    InterpreterSetjmpBuffer buffer(this);
-    if (!setjmp(buffer.buffer_)) {
-#if defined(USING_SIMULATOR)
-      // We need to beware that bouncing between the interpreter and the
-      // simulator may exhaust the C stack before exhausting either the
-      // interpreter or simulator stacks.
-      if (!thread->os_thread()->HasStackHeadroom()) {
-        thread->SetStackLimit(-1);
-      }
-      result = bit_copy<ObjectPtr, int64_t>(Simulator::Current()->Call(
-          reinterpret_cast<intptr_t>(entrypoint), static_cast<intptr_t>(code),
-          static_cast<intptr_t>(argdesc_),
-          reinterpret_cast<intptr_t>(call_base),
-          reinterpret_cast<intptr_t>(thread)));
-#else
-      result = static_cast<ObjectPtr>(entrypoint(static_cast<uword>(code),
-                                                 static_cast<uword>(argdesc_),
-                                                 call_base, thread));
-#endif
-      ASSERT(thread->vm_tag() == VMTag::kDartInterpretedTagId);
-      ASSERT(thread->execution_state() == Thread::kThreadInGenerated);
-      Unexit(thread);
-    } else {
-      return false;
-    }
-  }
-  // Pop args and push result.
-  *SP = call_base;
-  **SP = result;
-  pp_ = InterpreterHelpers::FrameBytecode(*FP)->ptr()->object_pool_;
-
-  // If the result is an error (not a Dart instance), it must either be rethrown
-  // (in the case of an unhandled exception) or it must be returned to the
-  // caller of the interpreter to be propagated.
-  if (result->IsHeapObject()) {
-    const intptr_t result_cid = result->GetClassId();
-    if (result_cid == kUnhandledExceptionCid) {
-      (*SP)[0] = UnhandledException::RawCast(result)->ptr()->exception_;
-      (*SP)[1] = UnhandledException::RawCast(result)->ptr()->stacktrace_;
-      (*SP)[2] = 0;  // Space for result.
-      Exit(thread, *FP, *SP + 3, *pc);
-      NativeArguments args(thread, 2, *SP, *SP + 2);
-      if (!InvokeRuntime(thread, this, DRT_ReThrow, args)) {
-        return false;
-      }
-      UNREACHABLE();
-    }
-    if (IsErrorClassId(result_cid)) {
-      // Unwind to entry frame.
-      fp_ = *FP;
-      pc_ = SavedCallerPC(fp_);
-      while (!IsEntryFrameMarker(pc_)) {
-        fp_ = SavedCallerFP(fp_);
-        pc_ = SavedCallerPC(fp_);
-      }
-      // Pop entry frame.
-      fp_ = SavedCallerFP(fp_);
-      special_[KernelBytecode::kExceptionSpecialIndex] = result;
-      return false;
-    }
-  }
-  return true;
-}
-
-DART_FORCE_INLINE bool Interpreter::InvokeBytecode(Thread* thread,
-                                                   FunctionPtr function,
-                                                   ObjectPtr* call_base,
-                                                   ObjectPtr* call_top,
-                                                   const KBCInstr** pc,
-                                                   ObjectPtr** FP,
-                                                   ObjectPtr** SP) {
-  ASSERT(Function::HasBytecode(function));
-#if defined(DEBUG)
-  if (IsTracingExecution()) {
-    THR_Print("%" Pu64 " ", icount_);
-    THR_Print("invoking %s\n",
-              Function::Handle(function).ToFullyQualifiedCString());
-  }
-#endif
-  ObjectPtr* callee_fp = call_top + kKBCDartFrameFixedSize;
-  ASSERT(function == FrameFunction(callee_fp));
-  BytecodePtr bytecode = function->ptr()->bytecode_;
-  callee_fp[kKBCPcMarkerSlotFromFp] = bytecode;
-  callee_fp[kKBCSavedCallerPcSlotFromFp] =
-      static_cast<ObjectPtr>(reinterpret_cast<uword>(*pc));
-  callee_fp[kKBCSavedCallerFpSlotFromFp] =
-      static_cast<ObjectPtr>(reinterpret_cast<uword>(*FP));
-  pp_ = bytecode->ptr()->object_pool_;
-  *pc = reinterpret_cast<const KBCInstr*>(bytecode->ptr()->instructions_);
-  NOT_IN_PRODUCT(pc_ = *pc);  // For the profiler.
-  *FP = callee_fp;
-  NOT_IN_PRODUCT(fp_ = callee_fp);  // For the profiler.
-  *SP = *FP - 1;
-  return true;
-}
-
-DART_FORCE_INLINE bool Interpreter::Invoke(Thread* thread,
-                                           ObjectPtr* call_base,
-                                           ObjectPtr* call_top,
-                                           const KBCInstr** pc,
-                                           ObjectPtr** FP,
-                                           ObjectPtr** SP) {
-  ObjectPtr* callee_fp = call_top + kKBCDartFrameFixedSize;
-  FunctionPtr function = FrameFunction(callee_fp);
-
-  for (;;) {
-    if (Function::HasCode(function)) {
-      return InvokeCompiled(thread, function, call_base, call_top, pc, FP, SP);
-    }
-    if (Function::HasBytecode(function)) {
-      return InvokeBytecode(thread, function, call_base, call_top, pc, FP, SP);
-    }
-
-    // Compile the function to either generate code or load bytecode.
-    call_top[1] = 0;  // Code result.
-    call_top[2] = function;
-    Exit(thread, *FP, call_top + 3, *pc);
-    NativeArguments native_args(thread, 1, call_top + 2, call_top + 1);
-    if (!InvokeRuntime(thread, this, DRT_CompileFunction, native_args)) {
-      return false;
-    }
-    // Reload objects after the call which may trigger GC.
-    function = Function::RawCast(call_top[2]);
-
-    ASSERT(Function::HasCode(function) || Function::HasBytecode(function));
-  }
-}
-
-DART_FORCE_INLINE bool Interpreter::InstanceCall(Thread* thread,
-                                                 StringPtr target_name,
-                                                 ObjectPtr* call_base,
-                                                 ObjectPtr* top,
-                                                 const KBCInstr** pc,
-                                                 ObjectPtr** FP,
-                                                 ObjectPtr** SP) {
-  ObjectPtr null_value = Object::null();
-  const intptr_t type_args_len =
-      InterpreterHelpers::ArgDescTypeArgsLen(argdesc_);
-  const intptr_t receiver_idx = type_args_len > 0 ? 1 : 0;
-
-  intptr_t receiver_cid =
-      InterpreterHelpers::GetClassId(call_base[receiver_idx]);
-
-  FunctionPtr target;
-  if (UNLIKELY(!lookup_cache_.Lookup(receiver_cid, target_name, argdesc_,
-                                     &target))) {
-    // Table lookup miss.
-    top[0] = null_value;  // Clean up slot as it may be visited by GC.
-    top[1] = call_base[receiver_idx];
-    top[2] = target_name;
-    top[3] = argdesc_;
-    top[4] = null_value;  // Result slot.
-
-    Exit(thread, *FP, top + 5, *pc);
-    NativeArguments native_args(thread, 3, /* argv */ top + 1,
-                                /* result */ top + 4);
-    if (!InvokeRuntime(thread, this, DRT_InterpretedInstanceCallMissHandler,
-                       native_args)) {
-      return false;
-    }
-
-    target = static_cast<FunctionPtr>(top[4]);
-    target_name = static_cast<StringPtr>(top[2]);
-    argdesc_ = static_cast<ArrayPtr>(top[3]);
-  }
-
-  if (target != Function::null()) {
-    lookup_cache_.Insert(receiver_cid, target_name, argdesc_, target);
-    top[0] = target;
-    return Invoke(thread, call_base, top, pc, FP, SP);
-  }
-
-  // The miss handler should only fail to return a function if lazy dispatchers
-  // are disabled, in which case we need to call DRT_InvokeNoSuchMethod, which
-  // walks the receiver appropriately in this case.
-  ASSERT(!FLAG_lazy_dispatchers);
-
-  // The receiver, name, and argument descriptor are already in the appropriate
-  // places on the stack from the previous call.
-  ASSERT(top[4] == null_value);
-
-  // Allocate array of arguments.
-  {
-    const intptr_t argc =
-        InterpreterHelpers::ArgDescArgCount(argdesc_) + receiver_idx;
-    ASSERT_EQUAL(top - call_base, argc);
-
-    top[5] = Smi::New(argc);  // length
-    top[6] = null_value;      // type
-    Exit(thread, *FP, top + 7, *pc);
-    NativeArguments native_args(thread, 2, /* argv */ top + 5,
-                                /* result */ top + 4);
-    if (!InvokeRuntime(thread, this, DRT_AllocateArray, native_args)) {
-      return false;
-    }
-
-    // Copy arguments into the newly allocated array.
-    ArrayPtr array = Array::RawCast(top[4]);
-    for (intptr_t i = 0; i < argc; i++) {
-      array->ptr()->data()[i] = call_base[i];
-    }
-  }
-
-  {
-    Exit(thread, *FP, top + 5, *pc);
-    NativeArguments native_args(thread, 4, /* argv */ top + 1,
-                                /* result */ top);
-    if (!InvokeRuntime(thread, this, DRT_InvokeNoSuchMethod, native_args)) {
-      return false;
-    }
-
-    // Pop the call args and push the result.
-    ObjectPtr result = top[0];
-    *SP = call_base;
-    **SP = result;
-    pp_ = InterpreterHelpers::FrameBytecode(*FP)->ptr()->object_pool_;
-  }
-
-  return true;
-}
-
-// Note:
-// All macro helpers are intended to be used only inside Interpreter::Call.
-
-// Counts and prints executed bytecode instructions (in DEBUG mode).
-#if defined(DEBUG)
-#define TRACE_INSTRUCTION                                                      \
-  if (IsTracingExecution()) {                                                  \
-    TraceInstruction(pc);                                                      \
-  }                                                                            \
-  if (IsWritingTraceFile()) {                                                  \
-    WriteInstructionToTrace(pc);                                               \
-  }                                                                            \
-  icount_++;
-#else
-#define TRACE_INSTRUCTION
-#endif  // defined(DEBUG)
-
-// Decode opcode and A part of the given value and dispatch to the
-// corresponding bytecode handler.
-#ifdef DART_HAS_COMPUTED_GOTO
-#define DISPATCH_OP(val)                                                       \
-  do {                                                                         \
-    op = (val);                                                                \
-    TRACE_INSTRUCTION                                                          \
-    goto* dispatch[op];                                                        \
-  } while (0)
-#else
-#define DISPATCH_OP(val)                                                       \
-  do {                                                                         \
-    op = (val);                                                                \
-    TRACE_INSTRUCTION                                                          \
-    goto SwitchDispatch;                                                       \
-  } while (0)
-#endif
-
-// Fetch next operation from PC and dispatch.
-#define DISPATCH() DISPATCH_OP(*pc)
-
-// Load target of a jump instruction into PC.
-#define LOAD_JUMP_TARGET() pc = rT
-
-#define BYTECODE_ENTRY_LABEL(Name) bc##Name:
-#define BYTECODE_WIDE_ENTRY_LABEL(Name) bc##Name##_Wide:
-#define BYTECODE_IMPL_LABEL(Name) bc##Name##Impl:
-#define GOTO_BYTECODE_IMPL(Name) goto bc##Name##Impl;
-
-// Define entry point that handles bytecode Name with the given operand format.
-#define BYTECODE(Name, Operands) BYTECODE_HEADER_##Operands(Name)
-
-// Helpers to decode common instruction formats. Used in conjunction with
-// BYTECODE() macro.
-
-#define BYTECODE_HEADER_0(Name)                                                \
-  BYTECODE_ENTRY_LABEL(Name)                                                   \
-  pc += 1;
-
-#define BYTECODE_HEADER_A(Name)                                                \
-  uint32_t rA;                                                                 \
-  USE(rA);                                                                     \
-  BYTECODE_ENTRY_LABEL(Name)                                                   \
-  rA = pc[1];                                                                  \
-  pc += 2;
-
-#define BYTECODE_HEADER_D(Name)                                                \
-  uint32_t rD;                                                                 \
-  USE(rD);                                                                     \
-  BYTECODE_WIDE_ENTRY_LABEL(Name)                                              \
-  rD = static_cast<uint32_t>(pc[1]) | (static_cast<uint32_t>(pc[2]) << 8) |    \
-       (static_cast<uint32_t>(pc[3]) << 16) |                                  \
-       (static_cast<uint32_t>(pc[4]) << 24);                                   \
-  pc += 5;                                                                     \
-  GOTO_BYTECODE_IMPL(Name);                                                    \
-  BYTECODE_ENTRY_LABEL(Name)                                                   \
-  rD = pc[1];                                                                  \
-  pc += 2;                                                                     \
-  BYTECODE_IMPL_LABEL(Name)
-
-#define BYTECODE_HEADER_X(Name)                                                \
-  int32_t rX;                                                                  \
-  USE(rX);                                                                     \
-  BYTECODE_WIDE_ENTRY_LABEL(Name)                                              \
-  rX = static_cast<int32_t>(static_cast<uint32_t>(pc[1]) |                     \
-                            (static_cast<uint32_t>(pc[2]) << 8) |              \
-                            (static_cast<uint32_t>(pc[3]) << 16) |             \
-                            (static_cast<uint32_t>(pc[4]) << 24));             \
-  pc += 5;                                                                     \
-  GOTO_BYTECODE_IMPL(Name);                                                    \
-  BYTECODE_ENTRY_LABEL(Name)                                                   \
-  rX = static_cast<int8_t>(pc[1]);                                             \
-  pc += 2;                                                                     \
-  BYTECODE_IMPL_LABEL(Name)
-
-#define BYTECODE_HEADER_T(Name)                                                \
-  const KBCInstr* rT;                                                          \
-  USE(rT);                                                                     \
-  BYTECODE_WIDE_ENTRY_LABEL(Name)                                              \
-  rT = pc + (static_cast<int32_t>((static_cast<uint32_t>(pc[1]) << 8) |        \
-                                  (static_cast<uint32_t>(pc[2]) << 16) |       \
-                                  (static_cast<uint32_t>(pc[3]) << 24)) >>     \
-             8);                                                               \
-  pc += 4;                                                                     \
-  GOTO_BYTECODE_IMPL(Name);                                                    \
-  BYTECODE_ENTRY_LABEL(Name)                                                   \
-  rT = pc + static_cast<int8_t>(pc[1]);                                        \
-  pc += 2;                                                                     \
-  BYTECODE_IMPL_LABEL(Name)
-
-#define BYTECODE_HEADER_A_E(Name)                                              \
-  uint32_t rA, rE;                                                             \
-  USE(rA);                                                                     \
-  USE(rE);                                                                     \
-  BYTECODE_WIDE_ENTRY_LABEL(Name)                                              \
-  rA = pc[1];                                                                  \
-  rE = static_cast<uint32_t>(pc[2]) | (static_cast<uint32_t>(pc[3]) << 8) |    \
-       (static_cast<uint32_t>(pc[4]) << 16) |                                  \
-       (static_cast<uint32_t>(pc[5]) << 24);                                   \
-  pc += 6;                                                                     \
-  GOTO_BYTECODE_IMPL(Name);                                                    \
-  BYTECODE_ENTRY_LABEL(Name)                                                   \
-  rA = pc[1];                                                                  \
-  rE = pc[2];                                                                  \
-  pc += 3;                                                                     \
-  BYTECODE_IMPL_LABEL(Name)
-
-#define BYTECODE_HEADER_A_Y(Name)                                              \
-  uint32_t rA;                                                                 \
-  int32_t rY;                                                                  \
-  USE(rA);                                                                     \
-  USE(rY);                                                                     \
-  BYTECODE_WIDE_ENTRY_LABEL(Name)                                              \
-  rA = pc[1];                                                                  \
-  rY = static_cast<int32_t>(static_cast<uint32_t>(pc[2]) |                     \
-                            (static_cast<uint32_t>(pc[3]) << 8) |              \
-                            (static_cast<uint32_t>(pc[4]) << 16) |             \
-                            (static_cast<uint32_t>(pc[5]) << 24));             \
-  pc += 6;                                                                     \
-  GOTO_BYTECODE_IMPL(Name);                                                    \
-  BYTECODE_ENTRY_LABEL(Name)                                                   \
-  rA = pc[1];                                                                  \
-  rY = static_cast<int8_t>(pc[2]);                                             \
-  pc += 3;                                                                     \
-  BYTECODE_IMPL_LABEL(Name)
-
-#define BYTECODE_HEADER_D_F(Name)                                              \
-  uint32_t rD, rF;                                                             \
-  USE(rD);                                                                     \
-  USE(rF);                                                                     \
-  BYTECODE_WIDE_ENTRY_LABEL(Name)                                              \
-  rD = static_cast<uint32_t>(pc[1]) | (static_cast<uint32_t>(pc[2]) << 8) |    \
-       (static_cast<uint32_t>(pc[3]) << 16) |                                  \
-       (static_cast<uint32_t>(pc[4]) << 24);                                   \
-  rF = pc[5];                                                                  \
-  pc += 6;                                                                     \
-  GOTO_BYTECODE_IMPL(Name);                                                    \
-  BYTECODE_ENTRY_LABEL(Name)                                                   \
-  rD = pc[1];                                                                  \
-  rF = pc[2];                                                                  \
-  pc += 3;                                                                     \
-  BYTECODE_IMPL_LABEL(Name)
-
-#define BYTECODE_HEADER_A_B_C(Name)                                            \
-  uint32_t rA, rB, rC;                                                         \
-  USE(rA);                                                                     \
-  USE(rB);                                                                     \
-  USE(rC);                                                                     \
-  BYTECODE_ENTRY_LABEL(Name)                                                   \
-  rA = pc[1];                                                                  \
-  rB = pc[2];                                                                  \
-  rC = pc[3];                                                                  \
-  pc += 4;
-
-#define HANDLE_EXCEPTION                                                       \
-  do {                                                                         \
-    goto HandleException;                                                      \
-  } while (0)
-
-#define HANDLE_RETURN                                                          \
-  do {                                                                         \
-    pp_ = InterpreterHelpers::FrameBytecode(FP)->ptr()->object_pool_;          \
-  } while (0)
-
-// Runtime call helpers: handle invocation and potential exception after return.
-#define INVOKE_RUNTIME(Func, Args)                                             \
-  if (!InvokeRuntime(thread, this, Func, Args)) {                              \
-    HANDLE_EXCEPTION;                                                          \
-  } else {                                                                     \
-    HANDLE_RETURN;                                                             \
-  }
-
-#define INVOKE_NATIVE(Wrapper, Func, Args)                                     \
-  if (!InvokeNative(thread, this, Wrapper, Func, Args)) {                      \
-    HANDLE_EXCEPTION;                                                          \
-  } else {                                                                     \
-    HANDLE_RETURN;                                                             \
-  }
-
-#define LOAD_CONSTANT(index) (pp_->ptr()->data()[(index)].raw_obj_)
-
-#define UNBOX_INT64(value, obj, selector)                                      \
-  int64_t value;                                                               \
-  {                                                                            \
-    word raw_value = static_cast<word>(obj);                                   \
-    if (LIKELY((raw_value & kSmiTagMask) == kSmiTag)) {                        \
-      value = raw_value >> kSmiTagShift;                                       \
-    } else {                                                                   \
-      if (UNLIKELY(obj == null_value)) {                                       \
-        SP[0] = selector.raw();                                                \
-        goto ThrowNullError;                                                   \
-      }                                                                        \
-      value = Integer::GetInt64Value(RAW_CAST(Integer, obj));                  \
-    }                                                                          \
-  }
-
-#define BOX_INT64_RESULT(result)                                               \
-  if (LIKELY(Smi::IsValid(result))) {                                          \
-    SP[0] = Smi::New(static_cast<intptr_t>(result));                           \
-  } else if (!AllocateMint(thread, result, pc, FP, SP)) {                      \
-    HANDLE_EXCEPTION;                                                          \
-  }                                                                            \
-  ASSERT(Integer::GetInt64Value(RAW_CAST(Integer, SP[0])) == result);
-
-#define UNBOX_DOUBLE(value, obj, selector)                                     \
-  double value;                                                                \
-  {                                                                            \
-    if (UNLIKELY(obj == null_value)) {                                         \
-      SP[0] = selector.raw();                                                  \
-      goto ThrowNullError;                                                     \
-    }                                                                          \
-    value = Double::RawCast(obj)->ptr()->value_;                               \
-  }
-
-#define BOX_DOUBLE_RESULT(result)                                              \
-  if (!AllocateDouble(thread, result, pc, FP, SP)) {                           \
-    HANDLE_EXCEPTION;                                                          \
-  }                                                                            \
-  ASSERT(Utils::DoublesBitEqual(Double::RawCast(SP[0])->ptr()->value_, result));
-
-#define BUMP_USAGE_COUNTER_ON_ENTRY(function)                                  \
-  {                                                                            \
-    int32_t counter = ++(function->ptr()->usage_counter_);                     \
-    if (UNLIKELY(FLAG_compilation_counter_threshold >= 0 &&                    \
-                 counter >= FLAG_compilation_counter_threshold &&              \
-                 !Function::HasCode(function))) {                              \
-      SP[1] = 0; /* Unused result. */                                          \
-      SP[2] = function;                                                        \
-      Exit(thread, FP, SP + 3, pc);                                            \
-      INVOKE_RUNTIME(DRT_CompileInterpretedFunction,                           \
-                     NativeArguments(thread, 1, SP + 2, SP + 1));              \
-      function = FrameFunction(FP);                                            \
-    }                                                                          \
-  }
-
-#ifdef PRODUCT
-#define DEBUG_CHECK
-#else
-// The DEBUG_CHECK macro must only be called from bytecodes listed in
-// KernelBytecode::IsDebugCheckedOpcode.
-#define DEBUG_CHECK                                                            \
-  if (is_debugging()) {                                                        \
-    /* Check for debug breakpoint or if single stepping. */                    \
-    if (thread->isolate()->debugger()->HasBytecodeBreakpointAt(pc)) {          \
-      SP[1] = null_value;                                                      \
-      Exit(thread, FP, SP + 2, pc);                                            \
-      INVOKE_RUNTIME(DRT_BreakpointRuntimeHandler,                             \
-                     NativeArguments(thread, 0, nullptr, SP + 1))              \
-    }                                                                          \
-    /* The debugger expects to see the same pc again when single-stepping */   \
-    if (thread->isolate()->single_step()) {                                    \
-      Exit(thread, FP, SP + 1, pc);                                            \
-      INVOKE_RUNTIME(DRT_SingleStepHandler,                                    \
-                     NativeArguments(thread, 0, nullptr, nullptr));            \
-    }                                                                          \
-  }
-#endif  // PRODUCT
-
-bool Interpreter::CopyParameters(Thread* thread,
-                                 const KBCInstr** pc,
-                                 ObjectPtr** FP,
-                                 ObjectPtr** SP,
-                                 const intptr_t num_fixed_params,
-                                 const intptr_t num_opt_pos_params,
-                                 const intptr_t num_opt_named_params) {
-  const intptr_t min_num_pos_args = num_fixed_params;
-  const intptr_t max_num_pos_args = num_fixed_params + num_opt_pos_params;
-
-  // Decode arguments descriptor.
-  const intptr_t arg_count = InterpreterHelpers::ArgDescArgCount(argdesc_);
-  const intptr_t pos_count = InterpreterHelpers::ArgDescPosCount(argdesc_);
-  const intptr_t named_count = (arg_count - pos_count);
-
-  // Check that got the right number of positional parameters.
-  if ((min_num_pos_args > pos_count) || (pos_count > max_num_pos_args)) {
-    return false;
-  }
-
-  // Copy all passed position arguments.
-  ObjectPtr* first_arg = FrameArguments(*FP, arg_count);
-  memmove(*FP, first_arg, pos_count * kWordSize);
-
-  if (num_opt_named_params != 0) {
-    // This is a function with named parameters.
-    // Walk the list of named parameters and their
-    // default values encoded as pairs of LoadConstant instructions that
-    // follows the entry point and find matching values via arguments
-    // descriptor.
-    ObjectPtr* argdesc_data = argdesc_->ptr()->data();
-
-    intptr_t i = 0;  // argument position
-    intptr_t j = 0;  // parameter position
-    while ((j < num_opt_named_params) && (i < named_count)) {
-      // Fetch formal parameter information: name, default value, target slot.
-      const KBCInstr* load_name = *pc;
-      const KBCInstr* load_value = KernelBytecode::Next(load_name);
-      *pc = KernelBytecode::Next(load_value);
-      ASSERT(KernelBytecode::IsLoadConstantOpcode(load_name));
-      ASSERT(KernelBytecode::IsLoadConstantOpcode(load_value));
-      const uint8_t reg = KernelBytecode::DecodeA(load_name);
-      ASSERT(reg == KernelBytecode::DecodeA(load_value));
-
-      StringPtr name = static_cast<StringPtr>(
-          LOAD_CONSTANT(KernelBytecode::DecodeE(load_name)));
-      if (name == argdesc_data[ArgumentsDescriptor::name_index(i)]) {
-        // Parameter was passed. Fetch passed value.
-        const intptr_t arg_index = Smi::Value(static_cast<SmiPtr>(
-            argdesc_data[ArgumentsDescriptor::position_index(i)]));
-        (*FP)[reg] = first_arg[arg_index];
-        ++i;  // Consume passed argument.
-      } else {
-        // Parameter was not passed. Fetch default value.
-        (*FP)[reg] = LOAD_CONSTANT(KernelBytecode::DecodeE(load_value));
-      }
-      ++j;  // Next formal parameter.
-    }
-
-    // If we have unprocessed formal parameters then initialize them all
-    // using default values.
-    while (j < num_opt_named_params) {
-      const KBCInstr* load_name = *pc;
-      const KBCInstr* load_value = KernelBytecode::Next(load_name);
-      *pc = KernelBytecode::Next(load_value);
-      ASSERT(KernelBytecode::IsLoadConstantOpcode(load_name));
-      ASSERT(KernelBytecode::IsLoadConstantOpcode(load_value));
-      const uint8_t reg = KernelBytecode::DecodeA(load_name);
-      ASSERT(reg == KernelBytecode::DecodeA(load_value));
-
-      (*FP)[reg] = LOAD_CONSTANT(KernelBytecode::DecodeE(load_value));
-      ++j;
-    }
-
-    // If we have unprocessed passed arguments that means we have mismatch
-    // between formal parameters and concrete arguments. This can only
-    // occur if the current function is a closure.
-    if (i < named_count) {
-      return false;
-    }
-
-    // SP points past copied arguments.
-    *SP = *FP + num_fixed_params + num_opt_named_params - 1;
-  } else {
-    ASSERT(num_opt_pos_params != 0);
-    if (named_count != 0) {
-      // Function can't have both named and optional positional parameters.
-      // This kind of mismatch can only occur if the current function
-      // is a closure.
-      return false;
-    }
-
-    // Process the list of default values encoded as a sequence of
-    // LoadConstant instructions after EntryOpt bytecode.
-    // Execute only those that correspond to parameters that were not passed.
-    for (intptr_t i = num_fixed_params; i < pos_count; ++i) {
-      ASSERT(KernelBytecode::IsLoadConstantOpcode(*pc));
-      *pc = KernelBytecode::Next(*pc);
-    }
-    for (intptr_t i = pos_count; i < max_num_pos_args; ++i) {
-      const KBCInstr* load_value = *pc;
-      *pc = KernelBytecode::Next(load_value);
-      ASSERT(KernelBytecode::IsLoadConstantOpcode(load_value));
-      ASSERT(KernelBytecode::DecodeA(load_value) == i);
-      (*FP)[i] = LOAD_CONSTANT(KernelBytecode::DecodeE(load_value));
-    }
-
-    // SP points past the last copied parameter.
-    *SP = *FP + max_num_pos_args - 1;
-  }
-
-  return true;
-}
-
-bool Interpreter::AssertAssignable(Thread* thread,
-                                   const KBCInstr* pc,
-                                   ObjectPtr* FP,
-                                   ObjectPtr* call_top,
-                                   ObjectPtr* args,
-                                   SubtypeTestCachePtr cache) {
-  ObjectPtr null_value = Object::null();
-  if (cache != null_value) {
-    InstancePtr instance = static_cast<InstancePtr>(args[0]);
-    TypeArgumentsPtr instantiator_type_arguments =
-        static_cast<TypeArgumentsPtr>(args[2]);
-    TypeArgumentsPtr function_type_arguments =
-        static_cast<TypeArgumentsPtr>(args[3]);
-
-    const intptr_t cid = InterpreterHelpers::GetClassId(instance);
-
-    TypeArgumentsPtr instance_type_arguments =
-        static_cast<TypeArgumentsPtr>(null_value);
-    ObjectPtr instance_cid_or_function;
-
-    TypeArgumentsPtr parent_function_type_arguments;
-    TypeArgumentsPtr delayed_function_type_arguments;
-    if (cid == kClosureCid) {
-      ClosurePtr closure = static_cast<ClosurePtr>(instance);
-      instance_type_arguments = closure->ptr()->instantiator_type_arguments_;
-      parent_function_type_arguments = closure->ptr()->function_type_arguments_;
-      delayed_function_type_arguments = closure->ptr()->delayed_type_arguments_;
-      instance_cid_or_function = closure->ptr()->function_;
-    } else {
-      instance_cid_or_function = Smi::New(cid);
-
-      ClassPtr instance_class = thread->isolate()->class_table()->At(cid);
-      if (instance_class->ptr()->num_type_arguments_ < 0) {
-        goto AssertAssignableCallRuntime;
-      } else if (instance_class->ptr()->num_type_arguments_ > 0) {
-        instance_type_arguments = reinterpret_cast<TypeArgumentsPtr*>(
-            instance->ptr())[instance_class->ptr()
-                                 ->host_type_arguments_field_offset_in_words_];
-      }
-      parent_function_type_arguments =
-          static_cast<TypeArgumentsPtr>(null_value);
-      delayed_function_type_arguments =
-          static_cast<TypeArgumentsPtr>(null_value);
-    }
-
-    for (ObjectPtr* entries = cache->ptr()->cache_->ptr()->data();
-         entries[0] != null_value;
-         entries += SubtypeTestCache::kTestEntryLength) {
-      if ((entries[SubtypeTestCache::kInstanceClassIdOrFunction] ==
-           instance_cid_or_function) &&
-          (entries[SubtypeTestCache::kInstanceTypeArguments] ==
-           instance_type_arguments) &&
-          (entries[SubtypeTestCache::kInstantiatorTypeArguments] ==
-           instantiator_type_arguments) &&
-          (entries[SubtypeTestCache::kFunctionTypeArguments] ==
-           function_type_arguments) &&
-          (entries[SubtypeTestCache::kInstanceParentFunctionTypeArguments] ==
-           parent_function_type_arguments) &&
-          (entries[SubtypeTestCache::kInstanceDelayedFunctionTypeArguments] ==
-           delayed_function_type_arguments)) {
-        if (Bool::True().raw() == entries[SubtypeTestCache::kTestResult]) {
-          return true;
-        } else {
-          break;
-        }
-      }
-    }
-  }
-
-AssertAssignableCallRuntime:
-  // args[0]: Instance.
-  // args[1]: Type.
-  // args[2]: Instantiator type args.
-  // args[3]: Function type args.
-  // args[4]: Name.
-  args[5] = cache;
-  args[6] = Smi::New(kTypeCheckFromInline);
-  args[7] = 0;  // Unused result.
-  Exit(thread, FP, args + 8, pc);
-  NativeArguments native_args(thread, 7, args, args + 7);
-  return InvokeRuntime(thread, this, DRT_TypeCheck, native_args);
-}
-
-template <bool is_getter>
-bool Interpreter::AssertAssignableField(Thread* thread,
-                                        const KBCInstr* pc,
-                                        ObjectPtr* FP,
-                                        ObjectPtr* SP,
-                                        InstancePtr instance,
-                                        FieldPtr field,
-                                        InstancePtr value) {
-  AbstractTypePtr field_type = field->ptr()->type_;
-  // Perform type test of value if field type is not one of dynamic, object,
-  // or void, and if the value is not null.
-  if (field_type->GetClassId() == kTypeCid) {
-    classid_t cid = Smi::Value(
-        static_cast<SmiPtr>(Type::RawCast(field_type)->ptr()->type_class_id_));
-    // TODO(regis): Revisit shortcut for NNBD.
-    if (cid == kDynamicCid || cid == kInstanceCid || cid == kVoidCid) {
-      return true;
-    }
-  }
-  ObjectPtr null_value = Object::null();
-  if (value == null_value) {
-    // TODO(regis): Revisit null shortcut for NNBD.
-    return true;
-  }
-
-  SubtypeTestCachePtr cache = field->ptr()->type_test_cache_;
-  if (UNLIKELY(cache == null_value)) {
-    // Allocate new cache.
-    SP[1] = instance;    // Preserve.
-    SP[2] = field;       // Preserve.
-    SP[3] = value;       // Preserve.
-    SP[4] = null_value;  // Result slot.
-
-    Exit(thread, FP, SP + 5, pc);
-    if (!InvokeRuntime(thread, this, DRT_AllocateSubtypeTestCache,
-                       NativeArguments(thread, 0, /* argv */ SP + 4,
-                                       /* retval */ SP + 4))) {
-      return false;
-    }
-
-    // Reload objects after the call which may trigger GC.
-    instance = static_cast<InstancePtr>(SP[1]);
-    field = static_cast<FieldPtr>(SP[2]);
-    value = static_cast<InstancePtr>(SP[3]);
-    cache = static_cast<SubtypeTestCachePtr>(SP[4]);
-    field_type = field->ptr()->type_;
-    field->ptr()->type_test_cache_ = cache;
-  }
-
-  // Push arguments of type test.
-  SP[1] = value;
-  SP[2] = field_type;
-  // Provide type arguments of instance as instantiator.
-  SP[3] = InterpreterHelpers::GetTypeArguments(thread, instance);
-  SP[4] = null_value;  // Implicit setters cannot be generic.
-  SP[5] = is_getter ? Symbols::FunctionResult().raw() : field->ptr()->name_;
-  return AssertAssignable(thread, pc, FP, /* call_top */ SP + 5,
-                          /* args */ SP + 1, cache);
-}
-
-ObjectPtr Interpreter::Call(const Function& function,
-                            const Array& arguments_descriptor,
-                            const Array& arguments,
-                            Thread* thread) {
-  return Call(function.raw(), arguments_descriptor.raw(), arguments.Length(),
-              arguments.raw_ptr()->data(), thread);
-}
-
-// Allocate a _Mint for the given int64_t value and puts it into SP[0].
-// Returns false on exception.
-DART_NOINLINE bool Interpreter::AllocateMint(Thread* thread,
-                                             int64_t value,
-                                             const KBCInstr* pc,
-                                             ObjectPtr* FP,
-                                             ObjectPtr* SP) {
-  ASSERT(!Smi::IsValid(value));
-  MintPtr result;
-  if (TryAllocate(thread, kMintCid, Mint::InstanceSize(),
-                  reinterpret_cast<ObjectPtr*>(&result))) {
-    result->ptr()->value_ = value;
-    SP[0] = result;
-    return true;
-  } else {
-    SP[0] = 0;  // Space for the result.
-    SP[1] = thread->isolate()->object_store()->mint_class();  // Class object.
-    SP[2] = Object::null();                                   // Type arguments.
-    Exit(thread, FP, SP + 3, pc);
-    NativeArguments args(thread, 2, SP + 1, SP);
-    if (!InvokeRuntime(thread, this, DRT_AllocateObject, args)) {
-      return false;
-    }
-    static_cast<MintPtr>(SP[0])->ptr()->value_ = value;
-    return true;
-  }
-}
-
-// Allocate a _Double for the given double value and put it into SP[0].
-// Returns false on exception.
-DART_NOINLINE bool Interpreter::AllocateDouble(Thread* thread,
-                                               double value,
-                                               const KBCInstr* pc,
-                                               ObjectPtr* FP,
-                                               ObjectPtr* SP) {
-  DoublePtr result;
-  if (TryAllocate(thread, kDoubleCid, Double::InstanceSize(),
-                  reinterpret_cast<ObjectPtr*>(&result))) {
-    result->ptr()->value_ = value;
-    SP[0] = result;
-    return true;
-  } else {
-    SP[0] = 0;  // Space for the result.
-    SP[1] = thread->isolate()->object_store()->double_class();
-    SP[2] = Object::null();  // Type arguments.
-    Exit(thread, FP, SP + 3, pc);
-    NativeArguments args(thread, 2, SP + 1, SP);
-    if (!InvokeRuntime(thread, this, DRT_AllocateObject, args)) {
-      return false;
-    }
-    Double::RawCast(SP[0])->ptr()->value_ = value;
-    return true;
-  }
-}
-
-// Allocate a _Float32x4 for the given simd value and put it into SP[0].
-// Returns false on exception.
-DART_NOINLINE bool Interpreter::AllocateFloat32x4(Thread* thread,
-                                                  simd128_value_t value,
-                                                  const KBCInstr* pc,
-                                                  ObjectPtr* FP,
-                                                  ObjectPtr* SP) {
-  Float32x4Ptr result;
-  if (TryAllocate(thread, kFloat32x4Cid, Float32x4::InstanceSize(),
-                  reinterpret_cast<ObjectPtr*>(&result))) {
-    value.writeTo(result->ptr()->value_);
-    SP[0] = result;
-    return true;
-  } else {
-    SP[0] = 0;  // Space for the result.
-    SP[1] = thread->isolate()->object_store()->float32x4_class();
-    SP[2] = Object::null();  // Type arguments.
-    Exit(thread, FP, SP + 3, pc);
-    NativeArguments args(thread, 2, SP + 1, SP);
-    if (!InvokeRuntime(thread, this, DRT_AllocateObject, args)) {
-      return false;
-    }
-    value.writeTo(Float32x4::RawCast(SP[0])->ptr()->value_);
-    return true;
-  }
-}
-
-// Allocate _Float64x2 box for the given simd value and put it into SP[0].
-// Returns false on exception.
-DART_NOINLINE bool Interpreter::AllocateFloat64x2(Thread* thread,
-                                                  simd128_value_t value,
-                                                  const KBCInstr* pc,
-                                                  ObjectPtr* FP,
-                                                  ObjectPtr* SP) {
-  Float64x2Ptr result;
-  if (TryAllocate(thread, kFloat64x2Cid, Float64x2::InstanceSize(),
-                  reinterpret_cast<ObjectPtr*>(&result))) {
-    value.writeTo(result->ptr()->value_);
-    SP[0] = result;
-    return true;
-  } else {
-    SP[0] = 0;  // Space for the result.
-    SP[1] = thread->isolate()->object_store()->float64x2_class();
-    SP[2] = Object::null();  // Type arguments.
-    Exit(thread, FP, SP + 3, pc);
-    NativeArguments args(thread, 2, SP + 1, SP);
-    if (!InvokeRuntime(thread, this, DRT_AllocateObject, args)) {
-      return false;
-    }
-    value.writeTo(Float64x2::RawCast(SP[0])->ptr()->value_);
-    return true;
-  }
-}
-
-// Allocate a _List with the given type arguments and length and put it into
-// SP[0]. Returns false on exception.
-bool Interpreter::AllocateArray(Thread* thread,
-                                TypeArgumentsPtr type_args,
-                                ObjectPtr length_object,
-                                const KBCInstr* pc,
-                                ObjectPtr* FP,
-                                ObjectPtr* SP) {
-  if (LIKELY(!length_object->IsHeapObject())) {
-    const intptr_t length = Smi::Value(Smi::RawCast(length_object));
-    if (LIKELY(Array::IsValidLength(length))) {
-      ArrayPtr result;
-      if (TryAllocate(thread, kArrayCid, Array::InstanceSize(length),
-                      reinterpret_cast<ObjectPtr*>(&result))) {
-        result->ptr()->type_arguments_ = type_args;
-        result->ptr()->length_ = Smi::New(length);
-        for (intptr_t i = 0; i < length; i++) {
-          result->ptr()->data()[i] = Object::null();
-        }
-        SP[0] = result;
-        return true;
-      }
-    }
-  }
-
-  SP[0] = 0;  // Space for the result;
-  SP[1] = length_object;
-  SP[2] = type_args;
-  Exit(thread, FP, SP + 3, pc);
-  NativeArguments args(thread, 2, SP + 1, SP);
-  return InvokeRuntime(thread, this, DRT_AllocateArray, args);
-}
-
-// Allocate a _Context with the given length and put it into SP[0].
-// Returns false on exception.
-bool Interpreter::AllocateContext(Thread* thread,
-                                  intptr_t num_context_variables,
-                                  const KBCInstr* pc,
-                                  ObjectPtr* FP,
-                                  ObjectPtr* SP) {
-  ContextPtr result;
-  if (TryAllocate(thread, kContextCid,
-                  Context::InstanceSize(num_context_variables),
-                  reinterpret_cast<ObjectPtr*>(&result))) {
-    result->ptr()->num_variables_ = num_context_variables;
-    ObjectPtr null_value = Object::null();
-    result->ptr()->parent_ = static_cast<ContextPtr>(null_value);
-    for (intptr_t i = 0; i < num_context_variables; i++) {
-      result->ptr()->data()[i] = null_value;
-    }
-    SP[0] = result;
-    return true;
-  } else {
-    SP[0] = 0;  // Space for the result.
-    SP[1] = Smi::New(num_context_variables);
-    Exit(thread, FP, SP + 2, pc);
-    NativeArguments args(thread, 1, SP + 1, SP);
-    return InvokeRuntime(thread, this, DRT_AllocateContext, args);
-  }
-}
-
-// Allocate a _Closure and put it into SP[0].
-// Returns false on exception.
-bool Interpreter::AllocateClosure(Thread* thread,
-                                  const KBCInstr* pc,
-                                  ObjectPtr* FP,
-                                  ObjectPtr* SP) {
-  const intptr_t instance_size = Closure::InstanceSize();
-  ClosurePtr result;
-  if (TryAllocate(thread, kClosureCid, instance_size,
-                  reinterpret_cast<ObjectPtr*>(&result))) {
-    uword start = ObjectLayout::ToAddr(result);
-    ObjectPtr null_value = Object::null();
-    for (intptr_t offset = sizeof(InstanceLayout); offset < instance_size;
-         offset += kWordSize) {
-      *reinterpret_cast<ObjectPtr*>(start + offset) = null_value;
-    }
-    SP[0] = result;
-    return true;
-  } else {
-    SP[0] = 0;  // Space for the result.
-    SP[1] = thread->isolate()->object_store()->closure_class();
-    SP[2] = Object::null();  // Type arguments.
-    Exit(thread, FP, SP + 3, pc);
-    NativeArguments args(thread, 2, SP + 1, SP);
-    return InvokeRuntime(thread, this, DRT_AllocateObject, args);
-  }
-}
-
-ObjectPtr Interpreter::Call(FunctionPtr function,
-                            ArrayPtr argdesc,
-                            intptr_t argc,
-                            ObjectPtr const* argv,
-                            Thread* thread) {
-  // Interpreter state (see constants_kbc.h for high-level overview).
-  const KBCInstr* pc;  // Program Counter: points to the next op to execute.
-  ObjectPtr* FP;       // Frame Pointer.
-  ObjectPtr* SP;       // Stack Pointer.
-
-  uint32_t op;  // Currently executing op.
-
-  bool reentering = fp_ != NULL;
-  if (!reentering) {
-    fp_ = reinterpret_cast<ObjectPtr*>(stack_base_);
-  }
-#if defined(DEBUG)
-  if (IsTracingExecution()) {
-    THR_Print("%" Pu64 " ", icount_);
-    THR_Print("%s interpreter 0x%" Px " at fp_ 0x%" Px " exit 0x%" Px " %s\n",
-              reentering ? "Re-entering" : "Entering",
-              reinterpret_cast<uword>(this), reinterpret_cast<uword>(fp_),
-              thread->top_exit_frame_info(),
-              Function::Handle(function).ToFullyQualifiedCString());
-  }
-#endif
-
-  // Setup entry frame:
-  //
-  //                        ^
-  //                        |  previous Dart frames
-  //                        |
-  //       | ........... | -+
-  // fp_ > | exit fp_    |     saved top_exit_frame_info
-  //       | argdesc_    |     saved argdesc_ (for reentering interpreter)
-  //       | pp_         |     saved pp_ (for reentering interpreter)
-  //       | arg 0       | -+
-  //       | arg 1       |  |
-  //         ...            |
-  //                         > incoming arguments
-  //                        |
-  //       | arg argc-1  | -+
-  //       | function    | -+
-  //       | code        |  |
-  //       | caller PC   | ---> special fake PC marking an entry frame
-  //  SP > | fp_         |  |
-  //  FP > | ........... |   > normal Dart frame (see stack_frame_kbc.h)
-  //                        |
-  //                        v
-  //
-  // A negative argc indicates reverse memory order of arguments.
-  const intptr_t arg_count = argc < 0 ? -argc : argc;
-  FP = fp_ + kKBCEntrySavedSlots + arg_count + kKBCDartFrameFixedSize;
-  SP = FP - 1;
-
-  // Save outer top_exit_frame_info, current argdesc, and current pp.
-  fp_[kKBCExitLinkSlotFromEntryFp] =
-      static_cast<ObjectPtr>(thread->top_exit_frame_info());
-  thread->set_top_exit_frame_info(0);
-  fp_[kKBCSavedArgDescSlotFromEntryFp] = static_cast<ObjectPtr>(argdesc_);
-  fp_[kKBCSavedPpSlotFromEntryFp] = static_cast<ObjectPtr>(pp_);
-
-  // Copy arguments and setup the Dart frame.
-  for (intptr_t i = 0; i < arg_count; i++) {
-    fp_[kKBCEntrySavedSlots + i] = argv[argc < 0 ? -i : i];
-  }
-
-  BytecodePtr bytecode = function->ptr()->bytecode_;
-  FP[kKBCFunctionSlotFromFp] = function;
-  FP[kKBCPcMarkerSlotFromFp] = bytecode;
-  FP[kKBCSavedCallerPcSlotFromFp] = static_cast<ObjectPtr>(kEntryFramePcMarker);
-  FP[kKBCSavedCallerFpSlotFromFp] =
-      static_cast<ObjectPtr>(reinterpret_cast<uword>(fp_));
-
-  // Load argument descriptor.
-  argdesc_ = argdesc;
-
-  // Ready to start executing bytecode. Load entry point and corresponding
-  // object pool.
-  pc = reinterpret_cast<const KBCInstr*>(bytecode->ptr()->instructions_);
-  NOT_IN_PRODUCT(pc_ = pc);  // For the profiler.
-  NOT_IN_PRODUCT(fp_ = FP);  // For the profiler.
-  pp_ = bytecode->ptr()->object_pool_;
-
-  // Save current VM tag and mark thread as executing Dart code. For the
-  // profiler, do this *after* setting up the entry frame (compare the machine
-  // code entry stubs).
-  const uword vm_tag = thread->vm_tag();
-  thread->set_vm_tag(VMTag::kDartInterpretedTagId);
-
-  // Save current top stack resource and reset the list.
-  StackResource* top_resource = thread->top_resource();
-  thread->set_top_resource(NULL);
-
-  // Cache some frequently used values in the frame.
-  BoolPtr true_value = Bool::True().raw();
-  BoolPtr false_value = Bool::False().raw();
-  ObjectPtr null_value = Object::null();
-
-#ifdef DART_HAS_COMPUTED_GOTO
-  static const void* dispatch[] = {
-#define TARGET(name, fmt, kind, fmta, fmtb, fmtc) &&bc##name,
-      KERNEL_BYTECODES_LIST(TARGET)
-#undef TARGET
-  };
-  DISPATCH();  // Enter the dispatch loop.
-#else
-  DISPATCH();  // Enter the dispatch loop.
-SwitchDispatch:
-  switch (op & 0xFF) {
-#define TARGET(name, fmt, kind, fmta, fmtb, fmtc)                              \
-  case KernelBytecode::k##name:                                                \
-    goto bc##name;
-    KERNEL_BYTECODES_LIST(TARGET)
-#undef TARGET
-    default:
-      FATAL1("Undefined opcode: %d\n", op);
-  }
-#endif
-
-  // KernelBytecode handlers (see constants_kbc.h for bytecode descriptions).
-  {
-    BYTECODE(Entry, D);
-    const intptr_t num_locals = rD;
-
-    // Initialize locals with null & set SP.
-    for (intptr_t i = 0; i < num_locals; i++) {
-      FP[i] = null_value;
-    }
-    SP = FP + num_locals - 1;
-
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(EntryFixed, A_E);
-    const intptr_t num_fixed_params = rA;
-    const intptr_t num_locals = rE;
-
-    const intptr_t arg_count = InterpreterHelpers::ArgDescArgCount(argdesc_);
-    const intptr_t pos_count = InterpreterHelpers::ArgDescPosCount(argdesc_);
-    if ((arg_count != num_fixed_params) || (pos_count != num_fixed_params)) {
-      SP[1] = FrameFunction(FP);
-      goto NoSuchMethodFromPrologue;
-    }
-
-    // Initialize locals with null & set SP.
-    for (intptr_t i = 0; i < num_locals; i++) {
-      FP[i] = null_value;
-    }
-    SP = FP + num_locals - 1;
-
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(EntryOptional, A_B_C);
-    if (CopyParameters(thread, &pc, &FP, &SP, rA, rB, rC)) {
-      DISPATCH();
-    } else {
-      SP[1] = FrameFunction(FP);
-      goto NoSuchMethodFromPrologue;
-    }
-  }
-
-  {
-    BYTECODE(Frame, D);
-    // Initialize locals with null and increment SP.
-    const intptr_t num_locals = rD;
-    for (intptr_t i = 1; i <= num_locals; i++) {
-      SP[i] = null_value;
-    }
-    SP += num_locals;
-
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(SetFrame, A);
-    SP = FP + rA - 1;
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(CheckStack, A);
-    {
-      // Check the interpreter's own stack limit for actual interpreter's stack
-      // overflows, and also the thread's stack limit for scheduled interrupts.
-      if (reinterpret_cast<uword>(SP) >= overflow_stack_limit() ||
-          thread->HasScheduledInterrupts()) {
-        Exit(thread, FP, SP + 1, pc);
-        INVOKE_RUNTIME(DRT_StackOverflow,
-                       NativeArguments(thread, 0, nullptr, nullptr));
-      }
-    }
-    FunctionPtr function = FrameFunction(FP);
-    int32_t counter = ++(function->ptr()->usage_counter_);
-    if (UNLIKELY(FLAG_compilation_counter_threshold >= 0 &&
-                 counter >= FLAG_compilation_counter_threshold &&
-                 !Function::HasCode(function))) {
-      SP[1] = 0;  // Unused result.
-      SP[2] = function;
-      Exit(thread, FP, SP + 3, pc);
-      INVOKE_RUNTIME(DRT_CompileInterpretedFunction,
-                     NativeArguments(thread, 1, SP + 2, SP + 1));
-    }
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(DebugCheck, 0);
-    DEBUG_CHECK;
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(CheckFunctionTypeArgs, A_E);
-    const intptr_t declared_type_args_len = rA;
-    const intptr_t first_stack_local_index = rE;
-
-    // Decode arguments descriptor's type args len.
-    const intptr_t type_args_len =
-        InterpreterHelpers::ArgDescTypeArgsLen(argdesc_);
-    if ((type_args_len != declared_type_args_len) && (type_args_len != 0)) {
-      SP[1] = FrameFunction(FP);
-      goto NoSuchMethodFromPrologue;
-    }
-    if (type_args_len > 0) {
-      // Decode arguments descriptor's argument count (excluding type args).
-      const intptr_t arg_count = InterpreterHelpers::ArgDescArgCount(argdesc_);
-      // Copy passed-in type args to first local slot.
-      FP[first_stack_local_index] = *FrameArguments(FP, arg_count + 1);
-    } else if (declared_type_args_len > 0) {
-      FP[first_stack_local_index] = Object::null();
-    }
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(InstantiateType, D);
-    // Stack: instantiator type args, function type args
-    ObjectPtr type = LOAD_CONSTANT(rD);
-    SP[1] = type;
-    SP[2] = SP[-1];
-    SP[3] = SP[0];
-    Exit(thread, FP, SP + 4, pc);
-    {
-      INVOKE_RUNTIME(DRT_InstantiateType,
-                     NativeArguments(thread, 3, SP + 1, SP - 1));
-    }
-    SP -= 1;
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(InstantiateTypeArgumentsTOS, A_E);
-    // Stack: instantiator type args, function type args
-    TypeArgumentsPtr type_arguments =
-        static_cast<TypeArgumentsPtr>(LOAD_CONSTANT(rE));
-
-    ObjectPtr instantiator_type_args = SP[-1];
-    ObjectPtr function_type_args = SP[0];
-    // If both instantiators are null and if the type argument vector
-    // instantiated from null becomes a vector of dynamic, then use null as
-    // the type arguments.
-    if ((rA == 0) || (null_value != instantiator_type_args) ||
-        (null_value != function_type_args)) {
-      // First lookup in the cache.
-      ArrayPtr instantiations = type_arguments->ptr()->instantiations_;
-      for (intptr_t i = 0;
-           instantiations->ptr()->data()[i] !=
-           static_cast<ObjectPtr>(TypeArguments::kNoInstantiator);
-           i += TypeArguments::Instantiation::kSizeInWords) {
-        if ((instantiations->ptr()->data()
-                 [i +
-                  TypeArguments::Instantiation::kInstantiatorTypeArgsIndex] ==
-             instantiator_type_args) &&
-            (instantiations->ptr()->data()
-                 [i + TypeArguments::Instantiation::kFunctionTypeArgsIndex] ==
-             function_type_args)) {
-          // Found in the cache.
-          SP[-1] =
-              instantiations->ptr()->data()[i + TypeArguments::Instantiation::
-                                                    kInstantiatedTypeArgsIndex];
-          goto InstantiateTypeArgumentsTOSDone;
-        }
-      }
-
-      // Cache lookup failed, call runtime.
-      SP[1] = type_arguments;
-      SP[2] = instantiator_type_args;
-      SP[3] = function_type_args;
-
-      Exit(thread, FP, SP + 4, pc);
-      INVOKE_RUNTIME(DRT_InstantiateTypeArguments,
-                     NativeArguments(thread, 3, SP + 1, SP - 1));
-    }
-
-  InstantiateTypeArgumentsTOSDone:
-    SP -= 1;
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(Throw, A);
-    {
-      SP[1] = 0;  // Space for result.
-      Exit(thread, FP, SP + 2, pc);
-      if (rA == 0) {  // Throw
-        INVOKE_RUNTIME(DRT_Throw, NativeArguments(thread, 1, SP, SP + 1));
-      } else {  // ReThrow
-        INVOKE_RUNTIME(DRT_ReThrow, NativeArguments(thread, 2, SP - 1, SP + 1));
-      }
-    }
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(Drop1, 0);
-    SP--;
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(LoadConstant, A_E);
-    FP[rA] = LOAD_CONSTANT(rE);
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(PushConstant, D);
-    *++SP = LOAD_CONSTANT(rD);
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(PushNull, 0);
-    *++SP = null_value;
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(PushTrue, 0);
-    *++SP = true_value;
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(PushFalse, 0);
-    *++SP = false_value;
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(PushInt, X);
-    *++SP = Smi::New(rX);
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(Push, X);
-    *++SP = FP[rX];
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(StoreLocal, X);
-    FP[rX] = *SP;
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(PopLocal, X);
-    FP[rX] = *SP--;
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(MoveSpecial, A_Y);
-    ASSERT(rA < KernelBytecode::kSpecialIndexCount);
-    FP[rY] = special_[rA];
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(BooleanNegateTOS, 0);
-    SP[0] = (SP[0] == true_value) ? false_value : true_value;
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(DirectCall, D_F);
-    DEBUG_CHECK;
-    // Invoke target function.
-    {
-      const uint32_t argc = rF;
-      const uint32_t kidx = rD;
-
-      InterpreterHelpers::IncrementUsageCounter(FrameFunction(FP));
-      *++SP = LOAD_CONSTANT(kidx);
-      ObjectPtr* call_base = SP - argc;
-      ObjectPtr* call_top = SP;
-      argdesc_ = static_cast<ArrayPtr>(LOAD_CONSTANT(kidx + 1));
-      if (!Invoke(thread, call_base, call_top, &pc, &FP, &SP)) {
-        HANDLE_EXCEPTION;
-      }
-    }
-
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(UncheckedDirectCall, D_F);
-    DEBUG_CHECK;
-    // Invoke target function.
-    {
-      const uint32_t argc = rF;
-      const uint32_t kidx = rD;
-
-      InterpreterHelpers::IncrementUsageCounter(FrameFunction(FP));
-      *++SP = LOAD_CONSTANT(kidx);
-      ObjectPtr* call_base = SP - argc;
-      ObjectPtr* call_top = SP;
-      argdesc_ = static_cast<ArrayPtr>(LOAD_CONSTANT(kidx + 1));
-      if (!Invoke(thread, call_base, call_top, &pc, &FP, &SP)) {
-        HANDLE_EXCEPTION;
-      }
-    }
-
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(InterfaceCall, D_F);
-    DEBUG_CHECK;
-    {
-      const uint32_t argc = rF;
-      const uint32_t kidx = rD;
-
-      ObjectPtr* call_base = SP - argc + 1;
-      ObjectPtr* call_top = SP + 1;
-
-      InterpreterHelpers::IncrementUsageCounter(FrameFunction(FP));
-      StringPtr target_name =
-          static_cast<FunctionPtr>(LOAD_CONSTANT(kidx))->ptr()->name_;
-      argdesc_ = static_cast<ArrayPtr>(LOAD_CONSTANT(kidx + 1));
-      if (!InstanceCall(thread, target_name, call_base, call_top, &pc, &FP,
-                        &SP)) {
-        HANDLE_EXCEPTION;
-      }
-    }
-
-    DISPATCH();
-  }
-  {
-    BYTECODE(InstantiatedInterfaceCall, D_F);
-    DEBUG_CHECK;
-    {
-      const uint32_t argc = rF;
-      const uint32_t kidx = rD;
-
-      ObjectPtr* call_base = SP - argc + 1;
-      ObjectPtr* call_top = SP + 1;
-
-      InterpreterHelpers::IncrementUsageCounter(FrameFunction(FP));
-      StringPtr target_name =
-          static_cast<FunctionPtr>(LOAD_CONSTANT(kidx))->ptr()->name_;
-      argdesc_ = static_cast<ArrayPtr>(LOAD_CONSTANT(kidx + 1));
-      if (!InstanceCall(thread, target_name, call_base, call_top, &pc, &FP,
-                        &SP)) {
-        HANDLE_EXCEPTION;
-      }
-    }
-
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(UncheckedClosureCall, D_F);
-    DEBUG_CHECK;
-    {
-      const uint32_t argc = rF;
-      const uint32_t kidx = rD;
-
-      ClosurePtr receiver = Closure::RawCast(*SP--);
-      ObjectPtr* call_base = SP - argc + 1;
-      ObjectPtr* call_top = SP + 1;
-
-      InterpreterHelpers::IncrementUsageCounter(FrameFunction(FP));
-      if (UNLIKELY(receiver == null_value)) {
-        SP[0] = Symbols::Call().raw();
-        goto ThrowNullError;
-      }
-      argdesc_ = static_cast<ArrayPtr>(LOAD_CONSTANT(kidx));
-      call_top[0] = receiver->ptr()->function_;
-
-      if (!Invoke(thread, call_base, call_top, &pc, &FP, &SP)) {
-        HANDLE_EXCEPTION;
-      }
-    }
-
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(UncheckedInterfaceCall, D_F);
-    DEBUG_CHECK;
-    {
-      const uint32_t argc = rF;
-      const uint32_t kidx = rD;
-
-      ObjectPtr* call_base = SP - argc + 1;
-      ObjectPtr* call_top = SP + 1;
-
-      InterpreterHelpers::IncrementUsageCounter(FrameFunction(FP));
-      StringPtr target_name =
-          static_cast<FunctionPtr>(LOAD_CONSTANT(kidx))->ptr()->name_;
-      argdesc_ = static_cast<ArrayPtr>(LOAD_CONSTANT(kidx + 1));
-      if (!InstanceCall(thread, target_name, call_base, call_top, &pc, &FP,
-                        &SP)) {
-        HANDLE_EXCEPTION;
-      }
-    }
-
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(DynamicCall, D_F);
-    DEBUG_CHECK;
-    {
-      const uint32_t argc = rF;
-      const uint32_t kidx = rD;
-
-      ObjectPtr* call_base = SP - argc + 1;
-      ObjectPtr* call_top = SP + 1;
-
-      InterpreterHelpers::IncrementUsageCounter(FrameFunction(FP));
-      StringPtr target_name = String::RawCast(LOAD_CONSTANT(kidx));
-      argdesc_ = Array::RawCast(LOAD_CONSTANT(kidx + 1));
-      if (!InstanceCall(thread, target_name, call_base, call_top, &pc, &FP,
-                        &SP)) {
-        HANDLE_EXCEPTION;
-      }
-    }
-
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(NativeCall, D);
-    TypedDataPtr data = static_cast<TypedDataPtr>(LOAD_CONSTANT(rD));
-    MethodRecognizer::Kind kind = NativeEntryData::GetKind(data);
-    switch (kind) {
-      case MethodRecognizer::kObjectEquals: {
-        SP[-1] = SP[-1] == SP[0] ? Bool::True().raw() : Bool::False().raw();
-        SP--;
-      } break;
-      case MethodRecognizer::kStringBaseLength:
-      case MethodRecognizer::kStringBaseIsEmpty: {
-        InstancePtr instance = static_cast<InstancePtr>(SP[0]);
-        SP[0] = reinterpret_cast<ObjectPtr*>(
-            instance->ptr())[String::length_offset() / kWordSize];
-        if (kind == MethodRecognizer::kStringBaseIsEmpty) {
-          SP[0] =
-              SP[0] == Smi::New(0) ? Bool::True().raw() : Bool::False().raw();
-        }
-      } break;
-      case MethodRecognizer::kGrowableArrayLength: {
-        GrowableObjectArrayPtr instance =
-            static_cast<GrowableObjectArrayPtr>(SP[0]);
-        SP[0] = instance->ptr()->length_;
-      } break;
-      case MethodRecognizer::kObjectArrayLength:
-      case MethodRecognizer::kImmutableArrayLength: {
-        ArrayPtr instance = static_cast<ArrayPtr>(SP[0]);
-        SP[0] = instance->ptr()->length_;
-      } break;
-      case MethodRecognizer::kTypedListLength:
-      case MethodRecognizer::kTypedListViewLength:
-      case MethodRecognizer::kByteDataViewLength: {
-        TypedDataBasePtr instance = static_cast<TypedDataBasePtr>(SP[0]);
-        SP[0] = instance->ptr()->length_;
-      } break;
-      case MethodRecognizer::kByteDataViewOffsetInBytes:
-      case MethodRecognizer::kTypedDataViewOffsetInBytes: {
-        TypedDataViewPtr instance = static_cast<TypedDataViewPtr>(SP[0]);
-        SP[0] = instance->ptr()->offset_in_bytes_;
-      } break;
-      case MethodRecognizer::kByteDataViewTypedData:
-      case MethodRecognizer::kTypedDataViewTypedData: {
-        TypedDataViewPtr instance = static_cast<TypedDataViewPtr>(SP[0]);
-        SP[0] = instance->ptr()->typed_data_;
-      } break;
-      case MethodRecognizer::kClassIDgetID: {
-        SP[0] = InterpreterHelpers::GetClassIdAsSmi(SP[0]);
-      } break;
-      case MethodRecognizer::kAsyncStackTraceHelper: {
-        SP[0] = Object::null();
-      } break;
-      case MethodRecognizer::kGrowableArrayCapacity: {
-        GrowableObjectArrayPtr instance =
-            static_cast<GrowableObjectArrayPtr>(SP[0]);
-        SP[0] = instance->ptr()->data_->ptr()->length_;
-      } break;
-      case MethodRecognizer::kListFactory: {
-        // factory List<E>([int length]) {
-        //   return (:arg_desc.positional_count == 2) ? new _List<E>(length)
-        //                                            : new _GrowableList<E>(0);
-        // }
-        if (InterpreterHelpers::ArgDescPosCount(argdesc_) == 2) {
-          TypeArgumentsPtr type_args = TypeArguments::RawCast(SP[-1]);
-          ObjectPtr length = SP[0];
-          SP--;
-          if (!AllocateArray(thread, type_args, length, pc, FP, SP)) {
-            HANDLE_EXCEPTION;
-          }
-        } else {
-          ASSERT(InterpreterHelpers::ArgDescPosCount(argdesc_) == 1);
-          // SP[-1] is type.
-          // The native wrapper pushed null as the optional length argument.
-          ASSERT(SP[0] == null_value);
-          SP[0] = Smi::New(0);  // Patch null length with zero length.
-          SP[1] = thread->isolate()->object_store()->growable_list_factory();
-          // Change the ArgumentsDescriptor of the call with a new cached one.
-          argdesc_ = ArgumentsDescriptor::NewBoxed(
-              0, KernelBytecode::kNativeCallToGrowableListArgc);
-          // Replace PC to the return trampoline so ReturnTOS would see
-          // a call bytecode at return address and will be able to get argc
-          // via DecodeArgc.
-          pc = KernelBytecode::GetNativeCallToGrowableListReturnTrampoline();
-          if (!Invoke(thread, SP - 1, SP + 1, &pc, &FP, &SP)) {
-            HANDLE_EXCEPTION;
-          }
-        }
-      } break;
-      case MethodRecognizer::kObjectArrayAllocate: {
-        TypeArgumentsPtr type_args = TypeArguments::RawCast(SP[-1]);
-        ObjectPtr length = SP[0];
-        SP--;
-        if (!AllocateArray(thread, type_args, length, pc, FP, SP)) {
-          HANDLE_EXCEPTION;
-        }
-      } break;
-      case MethodRecognizer::kLinkedHashMap_getIndex: {
-        InstancePtr instance = static_cast<InstancePtr>(SP[0]);
-        SP[0] = reinterpret_cast<ObjectPtr*>(
-            instance->ptr())[LinkedHashMap::index_offset() / kWordSize];
-      } break;
-      case MethodRecognizer::kLinkedHashMap_setIndex: {
-        InstancePtr instance = static_cast<InstancePtr>(SP[-1]);
-        instance->ptr()->StorePointer(
-            reinterpret_cast<ObjectPtr*>(instance->ptr()) +
-                LinkedHashMap::index_offset() / kWordSize,
-            SP[0]);
-        *--SP = null_value;
-      } break;
-      case MethodRecognizer::kLinkedHashMap_getData: {
-        InstancePtr instance = static_cast<InstancePtr>(SP[0]);
-        SP[0] = reinterpret_cast<ObjectPtr*>(
-            instance->ptr())[LinkedHashMap::data_offset() / kWordSize];
-      } break;
-      case MethodRecognizer::kLinkedHashMap_setData: {
-        InstancePtr instance = static_cast<InstancePtr>(SP[-1]);
-        instance->ptr()->StorePointer(
-            reinterpret_cast<ObjectPtr*>(instance->ptr()) +
-                LinkedHashMap::data_offset() / kWordSize,
-            SP[0]);
-        *--SP = null_value;
-      } break;
-      case MethodRecognizer::kLinkedHashMap_getHashMask: {
-        InstancePtr instance = static_cast<InstancePtr>(SP[0]);
-        SP[0] = reinterpret_cast<ObjectPtr*>(
-            instance->ptr())[LinkedHashMap::hash_mask_offset() / kWordSize];
-      } break;
-      case MethodRecognizer::kLinkedHashMap_setHashMask: {
-        InstancePtr instance = static_cast<InstancePtr>(SP[-1]);
-        ASSERT(!SP[0]->IsHeapObject());
-        reinterpret_cast<ObjectPtr*>(
-            instance->ptr())[LinkedHashMap::hash_mask_offset() / kWordSize] =
-            SP[0];
-        *--SP = null_value;
-      } break;
-      case MethodRecognizer::kLinkedHashMap_getUsedData: {
-        InstancePtr instance = static_cast<InstancePtr>(SP[0]);
-        SP[0] = reinterpret_cast<ObjectPtr*>(
-            instance->ptr())[LinkedHashMap::used_data_offset() / kWordSize];
-      } break;
-      case MethodRecognizer::kLinkedHashMap_setUsedData: {
-        InstancePtr instance = static_cast<InstancePtr>(SP[-1]);
-        ASSERT(!SP[0]->IsHeapObject());
-        reinterpret_cast<ObjectPtr*>(
-            instance->ptr())[LinkedHashMap::used_data_offset() / kWordSize] =
-            SP[0];
-        *--SP = null_value;
-      } break;
-      case MethodRecognizer::kLinkedHashMap_getDeletedKeys: {
-        InstancePtr instance = static_cast<InstancePtr>(SP[0]);
-        SP[0] = reinterpret_cast<ObjectPtr*>(
-            instance->ptr())[LinkedHashMap::deleted_keys_offset() / kWordSize];
-      } break;
-      case MethodRecognizer::kLinkedHashMap_setDeletedKeys: {
-        InstancePtr instance = static_cast<InstancePtr>(SP[-1]);
-        ASSERT(!SP[0]->IsHeapObject());
-        reinterpret_cast<ObjectPtr*>(
-            instance->ptr())[LinkedHashMap::deleted_keys_offset() / kWordSize] =
-            SP[0];
-        *--SP = null_value;
-      } break;
-      case MethodRecognizer::kFfiAbi: {
-        *++SP = Smi::New(static_cast<int64_t>(compiler::ffi::TargetAbi()));
-      } break;
-#define TYPED_DATA_FACTORY(clazz)                                              \
-  case MethodRecognizer::kTypedData_##clazz##_factory: {                       \
-    ObjectPtr length = SP[0];                                                  \
-    SP[1] = Smi::New(kTypedData##clazz##Cid);                                  \
-    SP[2] = length;                                                            \
-    Exit(thread, FP, SP + 3, pc);                                              \
-    INVOKE_RUNTIME(DRT_AllocateTypedData,                                      \
-                   NativeArguments(thread, 2, SP + 1, SP));                    \
-  } break;
-        CLASS_LIST_TYPED_DATA(TYPED_DATA_FACTORY)
-#undef TYPED_DATA_FACTORY
-      default: {
-        NativeEntryData::Payload* payload =
-            NativeEntryData::FromTypedArray(data);
-        intptr_t argc_tag = NativeEntryData::GetArgcTag(data);
-        const intptr_t num_arguments =
-            NativeArguments::ArgcBits::decode(argc_tag);
-
-        if (payload->trampoline == NULL) {
-          ASSERT(payload->native_function == NULL);
-          payload->trampoline = &NativeEntry::BootstrapNativeCallWrapper;
-          payload->native_function =
-              reinterpret_cast<NativeFunction>(&NativeEntry::LinkNativeCall);
-        }
-
-        *++SP = null_value;  // Result slot.
-
-        ObjectPtr* incoming_args = SP - num_arguments;
-        ObjectPtr* return_slot = SP;
-        Exit(thread, FP, SP + 1, pc);
-        NativeArguments native_args(thread, argc_tag, incoming_args,
-                                    return_slot);
-        INVOKE_NATIVE(
-            payload->trampoline,
-            reinterpret_cast<Dart_NativeFunction>(payload->native_function),
-            reinterpret_cast<Dart_NativeArguments>(&native_args));
-
-        *(SP - num_arguments) = *return_slot;
-        SP -= num_arguments;
-      }
-    }
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(ReturnTOS, 0);
-    DEBUG_CHECK;
-    ObjectPtr result;  // result to return to the caller.
-    result = *SP;
-    // Restore caller PC.
-    pc = SavedCallerPC(FP);
-
-    // Check if it is a fake PC marking the entry frame.
-    if (IsEntryFrameMarker(pc)) {
-      // Pop entry frame.
-      ObjectPtr* entry_fp = SavedCallerFP(FP);
-      // Restore exit frame info saved in entry frame.
-      pp_ = static_cast<ObjectPoolPtr>(entry_fp[kKBCSavedPpSlotFromEntryFp]);
-      argdesc_ =
-          static_cast<ArrayPtr>(entry_fp[kKBCSavedArgDescSlotFromEntryFp]);
-      uword exit_fp = static_cast<uword>(entry_fp[kKBCExitLinkSlotFromEntryFp]);
-      thread->set_top_exit_frame_info(exit_fp);
-      thread->set_top_resource(top_resource);
-      thread->set_vm_tag(vm_tag);
-      fp_ = entry_fp;
-      NOT_IN_PRODUCT(pc_ = pc);  // For the profiler.
-#if defined(DEBUG)
-      if (IsTracingExecution()) {
-        THR_Print("%" Pu64 " ", icount_);
-        THR_Print("Returning from interpreter 0x%" Px " at fp_ 0x%" Px
-                  " exit 0x%" Px "\n",
-                  reinterpret_cast<uword>(this), reinterpret_cast<uword>(fp_),
-                  exit_fp);
-      }
-      ASSERT(HasFrame(reinterpret_cast<uword>(fp_)));
-      // Exception propagation should have been done.
-      ASSERT(!result->IsHeapObject() ||
-             result->GetClassId() != kUnhandledExceptionCid);
-#endif
-      return result;
-    }
-
-    // Look at the caller to determine how many arguments to pop.
-    const uint8_t argc = KernelBytecode::DecodeArgc(pc);
-
-    // Restore SP, FP and PP. Push result and dispatch.
-    SP = FrameArguments(FP, argc);
-    FP = SavedCallerFP(FP);
-    NOT_IN_PRODUCT(fp_ = FP);  // For the profiler.
-    NOT_IN_PRODUCT(pc_ = pc);  // For the profiler.
-    pp_ = InterpreterHelpers::FrameBytecode(FP)->ptr()->object_pool_;
-    *SP = result;
-#if defined(DEBUG)
-    if (IsTracingExecution()) {
-      THR_Print("%" Pu64 " ", icount_);
-      THR_Print("Returning to %s (argc %d)\n",
-                Function::Handle(FrameFunction(FP)).ToFullyQualifiedCString(),
-                static_cast<int>(argc));
-    }
-#endif
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(InitLateField, D);
-    FieldPtr field = RAW_CAST(Field, LOAD_CONSTANT(rD + 1));
-    InstancePtr instance = static_cast<InstancePtr>(SP[0]);
-    intptr_t offset_in_words =
-        Smi::Value(field->ptr()->host_offset_or_field_id_);
-
-    instance->ptr()->StorePointer(
-        reinterpret_cast<ObjectPtr*>(instance->ptr()) + offset_in_words,
-        Object::RawCast(Object::sentinel().raw()), thread);
-
-    SP -= 1;  // Drop instance.
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(PushUninitializedSentinel, 0);
-    *++SP = Object::sentinel().raw();
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(JumpIfInitialized, T);
-    SP -= 1;
-    if (SP[1] != Object::sentinel().raw()) {
-      LOAD_JUMP_TARGET();
-    }
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(StoreStaticTOS, D);
-    FieldPtr field = static_cast<FieldPtr>(LOAD_CONSTANT(rD));
-    InstancePtr value = static_cast<InstancePtr>(*SP--);
-    intptr_t field_id = Smi::Value(field->ptr()->host_offset_or_field_id_);
-    thread->field_table_values()[field_id] = value;
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(LoadStatic, D);
-    FieldPtr field = static_cast<FieldPtr>(LOAD_CONSTANT(rD));
-    intptr_t field_id = Smi::Value(field->ptr()->host_offset_or_field_id_);
-    InstancePtr value = thread->field_table_values()[field_id];
-    ASSERT((value != Object::sentinel().raw()) &&
-           (value != Object::transition_sentinel().raw()));
-    *++SP = value;
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(StoreFieldTOS, D);
-    FieldPtr field = RAW_CAST(Field, LOAD_CONSTANT(rD + 1));
-    InstancePtr instance = static_cast<InstancePtr>(SP[-1]);
-    ObjectPtr value = static_cast<ObjectPtr>(SP[0]);
-    intptr_t offset_in_words =
-        Smi::Value(field->ptr()->host_offset_or_field_id_);
-
-    if (InterpreterHelpers::FieldNeedsGuardUpdate(field, value)) {
-      SP[1] = 0;  // Unused result of runtime call.
-      SP[2] = field;
-      SP[3] = value;
-      Exit(thread, FP, SP + 4, pc);
-      if (!InvokeRuntime(thread, this, DRT_UpdateFieldCid,
-                         NativeArguments(thread, 2, /* argv */ SP + 2,
-                                         /* retval */ SP + 1))) {
-        HANDLE_EXCEPTION;
-      }
-
-      // Reload objects after the call which may trigger GC.
-      field = RAW_CAST(Field, LOAD_CONSTANT(rD + 1));
-      instance = static_cast<InstancePtr>(SP[-1]);
-      value = SP[0];
-    }
-
-    const bool unboxing =
-        (field->ptr()->is_nullable_ != kNullCid) &&
-        Field::UnboxingCandidateBit::decode(field->ptr()->kind_bits_);
-    classid_t guarded_cid = field->ptr()->guarded_cid_;
-    if (unboxing && (guarded_cid == kDoubleCid) && supports_unboxed_doubles_) {
-      double raw_value = Double::RawCast(value)->ptr()->value_;
-      ASSERT(*(reinterpret_cast<DoublePtr*>(instance->ptr()) +
-               offset_in_words) == null_value);  // Initializing store.
-      if (!AllocateDouble(thread, raw_value, pc, FP, SP)) {
-        HANDLE_EXCEPTION;
-      }
-      DoublePtr box = Double::RawCast(SP[0]);
-      instance = static_cast<InstancePtr>(SP[-1]);
-      instance->ptr()->StorePointer(
-          reinterpret_cast<DoublePtr*>(instance->ptr()) + offset_in_words, box,
-          thread);
-    } else if (unboxing && (guarded_cid == kFloat32x4Cid) &&
-               supports_unboxed_simd128_) {
-      simd128_value_t raw_value;
-      raw_value.readFrom(Float32x4::RawCast(value)->ptr()->value_);
-      ASSERT(*(reinterpret_cast<Float32x4Ptr*>(instance->ptr()) +
-               offset_in_words) == null_value);  // Initializing store.
-      if (!AllocateFloat32x4(thread, raw_value, pc, FP, SP)) {
-        HANDLE_EXCEPTION;
-      }
-      Float32x4Ptr box = Float32x4::RawCast(SP[0]);
-      instance = static_cast<InstancePtr>(SP[-1]);
-      instance->ptr()->StorePointer(
-          reinterpret_cast<Float32x4Ptr*>(instance->ptr()) + offset_in_words,
-          box, thread);
-    } else if (unboxing && (guarded_cid == kFloat64x2Cid) &&
-               supports_unboxed_simd128_) {
-      simd128_value_t raw_value;
-      raw_value.readFrom(Float64x2::RawCast(value)->ptr()->value_);
-      ASSERT(*(reinterpret_cast<Float64x2Ptr*>(instance->ptr()) +
-               offset_in_words) == null_value);  // Initializing store.
-      if (!AllocateFloat64x2(thread, raw_value, pc, FP, SP)) {
-        HANDLE_EXCEPTION;
-      }
-      Float64x2Ptr box = Float64x2::RawCast(SP[0]);
-      instance = static_cast<InstancePtr>(SP[-1]);
-      instance->ptr()->StorePointer(
-          reinterpret_cast<Float64x2Ptr*>(instance->ptr()) + offset_in_words,
-          box, thread);
-    } else {
-      instance->ptr()->StorePointer(
-          reinterpret_cast<ObjectPtr*>(instance->ptr()) + offset_in_words,
-          value, thread);
-    }
-
-    SP -= 2;  // Drop instance and value.
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(StoreContextParent, 0);
-    const uword offset_in_words =
-        static_cast<uword>(Context::parent_offset() / kWordSize);
-    ContextPtr instance = static_cast<ContextPtr>(SP[-1]);
-    ContextPtr value = static_cast<ContextPtr>(SP[0]);
-    SP -= 2;  // Drop instance and value.
-
-    instance->ptr()->StorePointer(
-        reinterpret_cast<ContextPtr*>(instance->ptr()) + offset_in_words, value,
-        thread);
-
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(StoreContextVar, A_E);
-    const uword offset_in_words =
-        static_cast<uword>(Context::variable_offset(rE) / kWordSize);
-    ContextPtr instance = static_cast<ContextPtr>(SP[-1]);
-    ObjectPtr value = static_cast<ContextPtr>(SP[0]);
-    SP -= 2;  // Drop instance and value.
-    ASSERT(rE < static_cast<uint32_t>(instance->ptr()->num_variables_));
-    instance->ptr()->StorePointer(
-        reinterpret_cast<ObjectPtr*>(instance->ptr()) + offset_in_words, value,
-        thread);
-
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(LoadFieldTOS, D);
-#if defined(DEBUG)
-    // Currently only used to load closure fields, which are not unboxed.
-    // If used for general field, code for copying the mutable box must be
-    // added.
-    FieldPtr field = RAW_CAST(Field, LOAD_CONSTANT(rD + 1));
-    const bool unboxing =
-        (field->ptr()->is_nullable_ != kNullCid) &&
-        Field::UnboxingCandidateBit::decode(field->ptr()->kind_bits_);
-    ASSERT(!unboxing);
-#endif
-    const uword offset_in_words =
-        static_cast<uword>(Smi::Value(RAW_CAST(Smi, LOAD_CONSTANT(rD))));
-    InstancePtr instance = static_cast<InstancePtr>(SP[0]);
-    SP[0] = reinterpret_cast<ObjectPtr*>(instance->ptr())[offset_in_words];
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(LoadTypeArgumentsField, D);
-    const uword offset_in_words =
-        static_cast<uword>(Smi::Value(RAW_CAST(Smi, LOAD_CONSTANT(rD))));
-    InstancePtr instance = static_cast<InstancePtr>(SP[0]);
-    SP[0] = reinterpret_cast<ObjectPtr*>(instance->ptr())[offset_in_words];
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(LoadContextParent, 0);
-    const uword offset_in_words =
-        static_cast<uword>(Context::parent_offset() / kWordSize);
-    ContextPtr instance = static_cast<ContextPtr>(SP[0]);
-    SP[0] = reinterpret_cast<ObjectPtr*>(instance->ptr())[offset_in_words];
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(LoadContextVar, A_E);
-    const uword offset_in_words =
-        static_cast<uword>(Context::variable_offset(rE) / kWordSize);
-    ContextPtr instance = static_cast<ContextPtr>(SP[0]);
-    ASSERT(rE < static_cast<uint32_t>(instance->ptr()->num_variables_));
-    SP[0] = reinterpret_cast<ObjectPtr*>(instance->ptr())[offset_in_words];
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(AllocateContext, A_E);
-    ++SP;
-    const uint32_t num_context_variables = rE;
-    if (!AllocateContext(thread, num_context_variables, pc, FP, SP)) {
-      HANDLE_EXCEPTION;
-    }
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(CloneContext, A_E);
-    {
-      SP[1] = SP[0];  // Context to clone.
-      Exit(thread, FP, SP + 2, pc);
-      INVOKE_RUNTIME(DRT_CloneContext, NativeArguments(thread, 1, SP + 1, SP));
-    }
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(Allocate, D);
-    ClassPtr cls = Class::RawCast(LOAD_CONSTANT(rD));
-    if (LIKELY(InterpreterHelpers::IsAllocateFinalized(cls))) {
-      const intptr_t class_id = cls->ptr()->id_;
-      const intptr_t instance_size = cls->ptr()->host_instance_size_in_words_
-                                     << kWordSizeLog2;
-      ObjectPtr result;
-      if (TryAllocate(thread, class_id, instance_size, &result)) {
-        uword start = ObjectLayout::ToAddr(result);
-        for (intptr_t offset = sizeof(InstanceLayout); offset < instance_size;
-             offset += kWordSize) {
-          *reinterpret_cast<ObjectPtr*>(start + offset) = null_value;
-        }
-        *++SP = result;
-        DISPATCH();
-      }
-    }
-
-    SP[1] = 0;           // Space for the result.
-    SP[2] = cls;         // Class object.
-    SP[3] = null_value;  // Type arguments.
-    Exit(thread, FP, SP + 4, pc);
-    INVOKE_RUNTIME(DRT_AllocateObject,
-                   NativeArguments(thread, 2, SP + 2, SP + 1));
-    SP++;  // Result is in SP[1].
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(AllocateT, 0);
-    ClassPtr cls = Class::RawCast(SP[0]);
-    TypeArgumentsPtr type_args = TypeArguments::RawCast(SP[-1]);
-    if (LIKELY(InterpreterHelpers::IsAllocateFinalized(cls))) {
-      const intptr_t class_id = cls->ptr()->id_;
-      const intptr_t instance_size = cls->ptr()->host_instance_size_in_words_
-                                     << kWordSizeLog2;
-      ObjectPtr result;
-      if (TryAllocate(thread, class_id, instance_size, &result)) {
-        uword start = ObjectLayout::ToAddr(result);
-        for (intptr_t offset = sizeof(InstanceLayout); offset < instance_size;
-             offset += kWordSize) {
-          *reinterpret_cast<ObjectPtr*>(start + offset) = null_value;
-        }
-        const intptr_t type_args_offset =
-            cls->ptr()->host_type_arguments_field_offset_in_words_
-            << kWordSizeLog2;
-        *reinterpret_cast<ObjectPtr*>(start + type_args_offset) = type_args;
-        *--SP = result;
-        DISPATCH();
-      }
-    }
-
-    SP[1] = cls;
-    SP[2] = type_args;
-    Exit(thread, FP, SP + 3, pc);
-    INVOKE_RUNTIME(DRT_AllocateObject,
-                   NativeArguments(thread, 2, SP + 1, SP - 1));
-    SP -= 1;  // Result is in SP - 1.
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(CreateArrayTOS, 0);
-    TypeArgumentsPtr type_args = TypeArguments::RawCast(SP[-1]);
-    ObjectPtr length = SP[0];
-    SP--;
-    if (!AllocateArray(thread, type_args, length, pc, FP, SP)) {
-      HANDLE_EXCEPTION;
-    }
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(AssertAssignable, A_E);
-    // Stack: instance, type, instantiator type args, function type args, name
-    ObjectPtr* args = SP - 4;
-    const bool may_be_smi = (rA == 1);
-    const bool is_smi =
-        ((static_cast<intptr_t>(args[0]) & kSmiTagMask) == kSmiTag);
-    const bool smi_ok = is_smi && may_be_smi;
-    if (!smi_ok && (args[0] != null_value)) {
-      SubtypeTestCachePtr cache =
-          static_cast<SubtypeTestCachePtr>(LOAD_CONSTANT(rE));
-
-      if (!AssertAssignable(thread, pc, FP, SP, args, cache)) {
-        HANDLE_EXCEPTION;
-      }
-    }
-
-    SP -= 4;  // Instance remains on stack.
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(AssertSubtype, 0);
-    ObjectPtr* args = SP - 4;
-
-    // TODO(kustermann): Implement fast case for common arguments.
-
-    // The arguments on the stack look like:
-    //     args[0]  instantiator type args
-    //     args[1]  function type args
-    //     args[2]  sub_type
-    //     args[3]  super_type
-    //     args[4]  name
-
-    // This is unused, since the negative case throws an exception.
-    SP++;
-    ObjectPtr* result_slot = SP;
-
-    Exit(thread, FP, SP + 1, pc);
-    INVOKE_RUNTIME(DRT_SubtypeCheck,
-                   NativeArguments(thread, 5, args, result_slot));
-
-    // Drop result slot and all arguments.
-    SP -= 6;
-
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(AssertBoolean, A);
-    ObjectPtr value = SP[0];
-    if (rA != 0u) {  // Should we perform type check?
-      if ((value == true_value) || (value == false_value)) {
-        goto AssertBooleanOk;
-      }
-    } else if (value != null_value) {
-      goto AssertBooleanOk;
-    }
-
-    // Assertion failed.
-    {
-      SP[1] = SP[0];  // instance
-      Exit(thread, FP, SP + 2, pc);
-      INVOKE_RUNTIME(DRT_NonBoolTypeError,
-                     NativeArguments(thread, 1, SP + 1, SP));
-    }
-
-  AssertBooleanOk:
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(Jump, T);
-    LOAD_JUMP_TARGET();
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(JumpIfNoAsserts, T);
-    if (!thread->isolate()->asserts()) {
-      LOAD_JUMP_TARGET();
-    }
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(JumpIfNotZeroTypeArgs, T);
-    if (InterpreterHelpers::ArgDescTypeArgsLen(argdesc_) != 0) {
-      LOAD_JUMP_TARGET();
-    }
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(JumpIfEqStrict, T);
-    SP -= 2;
-    if (SP[1] == SP[2]) {
-      LOAD_JUMP_TARGET();
-    }
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(JumpIfNeStrict, T);
-    SP -= 2;
-    if (SP[1] != SP[2]) {
-      LOAD_JUMP_TARGET();
-    }
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(JumpIfTrue, T);
-    SP -= 1;
-    if (SP[1] == true_value) {
-      LOAD_JUMP_TARGET();
-    }
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(JumpIfFalse, T);
-    SP -= 1;
-    if (SP[1] == false_value) {
-      LOAD_JUMP_TARGET();
-    }
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(JumpIfNull, T);
-    SP -= 1;
-    if (SP[1] == null_value) {
-      LOAD_JUMP_TARGET();
-    }
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(JumpIfNotNull, T);
-    SP -= 1;
-    if (SP[1] != null_value) {
-      LOAD_JUMP_TARGET();
-    }
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(JumpIfUnchecked, T);
-    // Interpreter is not tracking unchecked calls, so fall through to
-    // parameter type checks.
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(StoreIndexedTOS, 0);
-    SP -= 3;
-    ArrayPtr array = RAW_CAST(Array, SP[1]);
-    SmiPtr index = RAW_CAST(Smi, SP[2]);
-    ObjectPtr value = SP[3];
-    ASSERT(InterpreterHelpers::CheckIndex(index, array->ptr()->length_));
-    array->ptr()->StorePointer(array->ptr()->data() + Smi::Value(index), value,
-                               thread);
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(EqualsNull, 0);
-    DEBUG_CHECK;
-    SP[0] = (SP[0] == null_value) ? true_value : false_value;
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(NullCheck, D);
-
-    if (UNLIKELY(SP[0] == null_value)) {
-      // Load selector.
-      SP[0] = LOAD_CONSTANT(rD);
-      goto ThrowNullError;
-    }
-    SP -= 1;
-
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(NegateInt, 0);
-    DEBUG_CHECK;
-    UNBOX_INT64(value, SP[0], Symbols::UnaryMinus());
-    int64_t result = Utils::SubWithWrapAround(0, value);
-    BOX_INT64_RESULT(result);
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(AddInt, 0);
-    DEBUG_CHECK;
-    SP -= 1;
-    UNBOX_INT64(a, SP[0], Symbols::Plus());
-    UNBOX_INT64(b, SP[1], Symbols::Plus());
-    int64_t result = Utils::AddWithWrapAround(a, b);
-    BOX_INT64_RESULT(result);
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(SubInt, 0);
-    DEBUG_CHECK;
-    SP -= 1;
-    UNBOX_INT64(a, SP[0], Symbols::Minus());
-    UNBOX_INT64(b, SP[1], Symbols::Minus());
-    int64_t result = Utils::SubWithWrapAround(a, b);
-    BOX_INT64_RESULT(result);
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(MulInt, 0);
-    DEBUG_CHECK;
-    SP -= 1;
-    UNBOX_INT64(a, SP[0], Symbols::Star());
-    UNBOX_INT64(b, SP[1], Symbols::Star());
-    int64_t result = Utils::MulWithWrapAround(a, b);
-    BOX_INT64_RESULT(result);
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(TruncDivInt, 0);
-    DEBUG_CHECK;
-    SP -= 1;
-    UNBOX_INT64(a, SP[0], Symbols::TruncDivOperator());
-    UNBOX_INT64(b, SP[1], Symbols::TruncDivOperator());
-    if (UNLIKELY(b == 0)) {
-      goto ThrowIntegerDivisionByZeroException;
-    }
-    int64_t result;
-    if (UNLIKELY((a == Mint::kMinValue) && (b == -1))) {
-      result = Mint::kMinValue;
-    } else {
-      result = a / b;
-    }
-    BOX_INT64_RESULT(result);
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(ModInt, 0);
-    DEBUG_CHECK;
-    SP -= 1;
-    UNBOX_INT64(a, SP[0], Symbols::Percent());
-    UNBOX_INT64(b, SP[1], Symbols::Percent());
-    if (UNLIKELY(b == 0)) {
-      goto ThrowIntegerDivisionByZeroException;
-    }
-    int64_t result;
-    if (UNLIKELY((a == Mint::kMinValue) && (b == -1))) {
-      result = 0;
-    } else {
-      result = a % b;
-      if (result < 0) {
-        if (b < 0) {
-          result -= b;
-        } else {
-          result += b;
-        }
-      }
-    }
-    BOX_INT64_RESULT(result);
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(BitAndInt, 0);
-    DEBUG_CHECK;
-    SP -= 1;
-    UNBOX_INT64(a, SP[0], Symbols::Ampersand());
-    UNBOX_INT64(b, SP[1], Symbols::Ampersand());
-    int64_t result = a & b;
-    BOX_INT64_RESULT(result);
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(BitOrInt, 0);
-    DEBUG_CHECK;
-    SP -= 1;
-    UNBOX_INT64(a, SP[0], Symbols::BitOr());
-    UNBOX_INT64(b, SP[1], Symbols::BitOr());
-    int64_t result = a | b;
-    BOX_INT64_RESULT(result);
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(BitXorInt, 0);
-    DEBUG_CHECK;
-    SP -= 1;
-    UNBOX_INT64(a, SP[0], Symbols::Caret());
-    UNBOX_INT64(b, SP[1], Symbols::Caret());
-    int64_t result = a ^ b;
-    BOX_INT64_RESULT(result);
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(ShlInt, 0);
-    DEBUG_CHECK;
-    SP -= 1;
-    UNBOX_INT64(a, SP[0], Symbols::LeftShiftOperator());
-    UNBOX_INT64(b, SP[1], Symbols::LeftShiftOperator());
-    if (b < 0) {
-      SP[0] = SP[1];
-      goto ThrowArgumentError;
-    }
-    int64_t result = Utils::ShiftLeftWithTruncation(a, b);
-    BOX_INT64_RESULT(result);
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(ShrInt, 0);
-    DEBUG_CHECK;
-    SP -= 1;
-    UNBOX_INT64(a, SP[0], Symbols::RightShiftOperator());
-    UNBOX_INT64(b, SP[1], Symbols::RightShiftOperator());
-    if (b < 0) {
-      SP[0] = SP[1];
-      goto ThrowArgumentError;
-    }
-    int64_t result = a >> Utils::Minimum<int64_t>(b, Mint::kBits);
-    BOX_INT64_RESULT(result);
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(CompareIntEq, 0);
-    DEBUG_CHECK;
-    SP -= 1;
-    if (SP[0] == SP[1]) {
-      SP[0] = true_value;
-    } else if (!SP[0]->IsHeapObject() || !SP[1]->IsHeapObject() ||
-               (SP[0] == null_value) || (SP[1] == null_value)) {
-      SP[0] = false_value;
-    } else {
-      int64_t a = Integer::GetInt64Value(RAW_CAST(Integer, SP[0]));
-      int64_t b = Integer::GetInt64Value(RAW_CAST(Integer, SP[1]));
-      SP[0] = (a == b) ? true_value : false_value;
-    }
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(CompareIntGt, 0);
-    DEBUG_CHECK;
-    SP -= 1;
-    UNBOX_INT64(a, SP[0], Symbols::RAngleBracket());
-    UNBOX_INT64(b, SP[1], Symbols::RAngleBracket());
-    SP[0] = (a > b) ? true_value : false_value;
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(CompareIntLt, 0);
-    DEBUG_CHECK;
-    SP -= 1;
-    UNBOX_INT64(a, SP[0], Symbols::LAngleBracket());
-    UNBOX_INT64(b, SP[1], Symbols::LAngleBracket());
-    SP[0] = (a < b) ? true_value : false_value;
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(CompareIntGe, 0);
-    DEBUG_CHECK;
-    SP -= 1;
-    UNBOX_INT64(a, SP[0], Symbols::GreaterEqualOperator());
-    UNBOX_INT64(b, SP[1], Symbols::GreaterEqualOperator());
-    SP[0] = (a >= b) ? true_value : false_value;
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(CompareIntLe, 0);
-    DEBUG_CHECK;
-    SP -= 1;
-    UNBOX_INT64(a, SP[0], Symbols::LessEqualOperator());
-    UNBOX_INT64(b, SP[1], Symbols::LessEqualOperator());
-    SP[0] = (a <= b) ? true_value : false_value;
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(NegateDouble, 0);
-    DEBUG_CHECK;
-    UNBOX_DOUBLE(value, SP[0], Symbols::UnaryMinus());
-    double result = -value;
-    BOX_DOUBLE_RESULT(result);
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(AddDouble, 0);
-    DEBUG_CHECK;
-    SP -= 1;
-    UNBOX_DOUBLE(a, SP[0], Symbols::Plus());
-    UNBOX_DOUBLE(b, SP[1], Symbols::Plus());
-    double result = a + b;
-    BOX_DOUBLE_RESULT(result);
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(SubDouble, 0);
-    DEBUG_CHECK;
-    SP -= 1;
-    UNBOX_DOUBLE(a, SP[0], Symbols::Minus());
-    UNBOX_DOUBLE(b, SP[1], Symbols::Minus());
-    double result = a - b;
-    BOX_DOUBLE_RESULT(result);
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(MulDouble, 0);
-    DEBUG_CHECK;
-    SP -= 1;
-    UNBOX_DOUBLE(a, SP[0], Symbols::Star());
-    UNBOX_DOUBLE(b, SP[1], Symbols::Star());
-    double result = a * b;
-    BOX_DOUBLE_RESULT(result);
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(DivDouble, 0);
-    DEBUG_CHECK;
-    SP -= 1;
-    UNBOX_DOUBLE(a, SP[0], Symbols::Slash());
-    UNBOX_DOUBLE(b, SP[1], Symbols::Slash());
-    double result = a / b;
-    BOX_DOUBLE_RESULT(result);
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(CompareDoubleEq, 0);
-    DEBUG_CHECK;
-    SP -= 1;
-    if ((SP[0] == null_value) || (SP[1] == null_value)) {
-      SP[0] = (SP[0] == SP[1]) ? true_value : false_value;
-    } else {
-      double a = Double::RawCast(SP[0])->ptr()->value_;
-      double b = Double::RawCast(SP[1])->ptr()->value_;
-      SP[0] = (a == b) ? true_value : false_value;
-    }
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(CompareDoubleGt, 0);
-    DEBUG_CHECK;
-    SP -= 1;
-    UNBOX_DOUBLE(a, SP[0], Symbols::RAngleBracket());
-    UNBOX_DOUBLE(b, SP[1], Symbols::RAngleBracket());
-    SP[0] = (a > b) ? true_value : false_value;
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(CompareDoubleLt, 0);
-    DEBUG_CHECK;
-    SP -= 1;
-    UNBOX_DOUBLE(a, SP[0], Symbols::LAngleBracket());
-    UNBOX_DOUBLE(b, SP[1], Symbols::LAngleBracket());
-    SP[0] = (a < b) ? true_value : false_value;
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(CompareDoubleGe, 0);
-    DEBUG_CHECK;
-    SP -= 1;
-    UNBOX_DOUBLE(a, SP[0], Symbols::GreaterEqualOperator());
-    UNBOX_DOUBLE(b, SP[1], Symbols::GreaterEqualOperator());
-    SP[0] = (a >= b) ? true_value : false_value;
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(CompareDoubleLe, 0);
-    DEBUG_CHECK;
-    SP -= 1;
-    UNBOX_DOUBLE(a, SP[0], Symbols::LessEqualOperator());
-    UNBOX_DOUBLE(b, SP[1], Symbols::LessEqualOperator());
-    SP[0] = (a <= b) ? true_value : false_value;
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(AllocateClosure, D);
-    ++SP;
-    if (!AllocateClosure(thread, pc, FP, SP)) {
-      HANDLE_EXCEPTION;
-    }
-    DISPATCH();
-  }
-
-  {
-    BYTECODE_ENTRY_LABEL(Trap);
-
-#define UNIMPLEMENTED_LABEL_ORDN(Name)
-#define UNIMPLEMENTED_LABEL_WIDE(Name)
-#define UNIMPLEMENTED_LABEL_RESV(Name) BYTECODE_ENTRY_LABEL(Name)
-#define UNIMPLEMENTED_LABEL(name, encoding, kind, op1, op2, op3)               \
-  UNIMPLEMENTED_LABEL_##kind(name)
-
-    KERNEL_BYTECODES_LIST(UNIMPLEMENTED_LABEL)
-
-#undef UNIMPLEMENTED_LABEL_ORDN
-#undef UNIMPLEMENTED_LABEL_WIDE
-#undef UNIMPLEMENTED_LABEL_RESV
-#undef UNIMPLEMENTED_LABEL
-
-    UNIMPLEMENTED();
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(VMInternal_ImplicitGetter, 0);
-
-    FunctionPtr function = FrameFunction(FP);
-    ASSERT(Function::kind(function) == FunctionLayout::kImplicitGetter);
-
-    BUMP_USAGE_COUNTER_ON_ENTRY(function);
-
-    // Field object is cached in function's data_.
-    FieldPtr field = static_cast<FieldPtr>(function->ptr()->data_);
-    intptr_t offset_in_words =
-        Smi::Value(field->ptr()->host_offset_or_field_id_);
-
-    const intptr_t kArgc = 1;
-    InstancePtr instance =
-        static_cast<InstancePtr>(FrameArguments(FP, kArgc)[0]);
-    InstancePtr value =
-        reinterpret_cast<InstancePtr*>(instance->ptr())[offset_in_words];
-
-    if (UNLIKELY(value == Object::sentinel().raw())) {
-      SP[1] = 0;  // Result slot.
-      SP[2] = instance;
-      SP[3] = field;
-      Exit(thread, FP, SP + 4, pc);
-      INVOKE_RUNTIME(
-          DRT_InitInstanceField,
-          NativeArguments(thread, 2, /* argv */ SP + 2, /* ret val */ SP + 1));
-
-      function = FrameFunction(FP);
-      instance = static_cast<InstancePtr>(SP[2]);
-      field = static_cast<FieldPtr>(SP[3]);
-      offset_in_words = Smi::Value(field->ptr()->host_offset_or_field_id_);
-      value = reinterpret_cast<InstancePtr*>(instance->ptr())[offset_in_words];
-    }
-
-    *++SP = value;
-
-#if !defined(PRODUCT)
-    if (UNLIKELY(Field::NeedsLoadGuardBit::decode(field->ptr()->kind_bits_))) {
-      if (!AssertAssignableField<true>(thread, pc, FP, SP, instance, field,
-                                       value)) {
-        HANDLE_EXCEPTION;
-      }
-      // Reload objects after the call which may trigger GC.
-      field = static_cast<FieldPtr>(FrameFunction(FP)->ptr()->data_);
-      instance = static_cast<InstancePtr>(FrameArguments(FP, kArgc)[0]);
-      value = reinterpret_cast<InstancePtr*>(instance->ptr())[offset_in_words];
-    }
-#endif
-
-    const bool unboxing =
-        (field->ptr()->is_nullable_ != kNullCid) &&
-        Field::UnboxingCandidateBit::decode(field->ptr()->kind_bits_);
-    classid_t guarded_cid = field->ptr()->guarded_cid_;
-    if (unboxing && (guarded_cid == kDoubleCid) && supports_unboxed_doubles_) {
-      ASSERT(FlowGraphCompiler::SupportsUnboxedDoubles());
-      double raw_value = Double::RawCast(value)->ptr()->value_;
-      // AllocateDouble places result at SP[0]
-      if (!AllocateDouble(thread, raw_value, pc, FP, SP)) {
-        HANDLE_EXCEPTION;
-      }
-    } else if (unboxing && (guarded_cid == kFloat32x4Cid) &&
-               supports_unboxed_simd128_) {
-      simd128_value_t raw_value;
-      raw_value.readFrom(Float32x4::RawCast(value)->ptr()->value_);
-      // AllocateFloat32x4 places result at SP[0]
-      if (!AllocateFloat32x4(thread, raw_value, pc, FP, SP)) {
-        HANDLE_EXCEPTION;
-      }
-    } else if (unboxing && (guarded_cid == kFloat64x2Cid) &&
-               supports_unboxed_simd128_) {
-      simd128_value_t raw_value;
-      raw_value.readFrom(Float64x2::RawCast(value)->ptr()->value_);
-      // AllocateFloat64x2 places result at SP[0]
-      if (!AllocateFloat64x2(thread, raw_value, pc, FP, SP)) {
-        HANDLE_EXCEPTION;
-      }
-    }
-
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(VMInternal_ImplicitSetter, 0);
-
-    FunctionPtr function = FrameFunction(FP);
-    ASSERT(Function::kind(function) == FunctionLayout::kImplicitSetter);
-
-    BUMP_USAGE_COUNTER_ON_ENTRY(function);
-
-    // Field object is cached in function's data_.
-    FieldPtr field = static_cast<FieldPtr>(function->ptr()->data_);
-    intptr_t offset_in_words =
-        Smi::Value(field->ptr()->host_offset_or_field_id_);
-    const intptr_t kArgc = 2;
-    InstancePtr instance =
-        static_cast<InstancePtr>(FrameArguments(FP, kArgc)[0]);
-    InstancePtr value = static_cast<InstancePtr>(FrameArguments(FP, kArgc)[1]);
-
-    if (!AssertAssignableField<false>(thread, pc, FP, SP, instance, field,
-                                      value)) {
-      HANDLE_EXCEPTION;
-    }
-    // Reload objects after the call which may trigger GC.
-    field = static_cast<FieldPtr>(FrameFunction(FP)->ptr()->data_);
-    instance = static_cast<InstancePtr>(FrameArguments(FP, kArgc)[0]);
-    value = static_cast<InstancePtr>(FrameArguments(FP, kArgc)[1]);
-
-    if (InterpreterHelpers::FieldNeedsGuardUpdate(field, value)) {
-      SP[1] = 0;  // Unused result of runtime call.
-      SP[2] = field;
-      SP[3] = value;
-      Exit(thread, FP, SP + 4, pc);
-      if (!InvokeRuntime(thread, this, DRT_UpdateFieldCid,
-                         NativeArguments(thread, 2, /* argv */ SP + 2,
-                                         /* retval */ SP + 1))) {
-        HANDLE_EXCEPTION;
-      }
-
-      // Reload objects after the call which may trigger GC.
-      field = static_cast<FieldPtr>(FrameFunction(FP)->ptr()->data_);
-      instance = static_cast<InstancePtr>(FrameArguments(FP, kArgc)[0]);
-      value = static_cast<InstancePtr>(FrameArguments(FP, kArgc)[1]);
-    }
-
-    const bool unboxing =
-        (field->ptr()->is_nullable_ != kNullCid) &&
-        Field::UnboxingCandidateBit::decode(field->ptr()->kind_bits_);
-    classid_t guarded_cid = field->ptr()->guarded_cid_;
-    if (unboxing && (guarded_cid == kDoubleCid) && supports_unboxed_doubles_) {
-      double raw_value = Double::RawCast(value)->ptr()->value_;
-      DoublePtr box =
-          *(reinterpret_cast<DoublePtr*>(instance->ptr()) + offset_in_words);
-      ASSERT(box != null_value);  // Non-initializing store.
-      box->ptr()->value_ = raw_value;
-    } else if (unboxing && (guarded_cid == kFloat32x4Cid) &&
-               supports_unboxed_simd128_) {
-      simd128_value_t raw_value;
-      raw_value.readFrom(Float32x4::RawCast(value)->ptr()->value_);
-      Float32x4Ptr box =
-          *(reinterpret_cast<Float32x4Ptr*>(instance->ptr()) + offset_in_words);
-      ASSERT(box != null_value);  // Non-initializing store.
-      raw_value.writeTo(box->ptr()->value_);
-    } else if (unboxing && (guarded_cid == kFloat64x2Cid) &&
-               supports_unboxed_simd128_) {
-      simd128_value_t raw_value;
-      raw_value.readFrom(Float64x2::RawCast(value)->ptr()->value_);
-      Float64x2Ptr box =
-          *(reinterpret_cast<Float64x2Ptr*>(instance->ptr()) + offset_in_words);
-      ASSERT(box != null_value);  // Non-initializing store.
-      raw_value.writeTo(box->ptr()->value_);
-    } else {
-      instance->ptr()->StorePointer(
-          reinterpret_cast<InstancePtr*>(instance->ptr()) + offset_in_words,
-          value, thread);
-    }
-
-    *++SP = null_value;
-
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(VMInternal_ImplicitStaticGetter, 0);
-
-    FunctionPtr function = FrameFunction(FP);
-    ASSERT(Function::kind(function) == FunctionLayout::kImplicitStaticGetter);
-
-    BUMP_USAGE_COUNTER_ON_ENTRY(function);
-
-    // Field object is cached in function's data_.
-    FieldPtr field = static_cast<FieldPtr>(function->ptr()->data_);
-    intptr_t field_id = Smi::Value(field->ptr()->host_offset_or_field_id_);
-    InstancePtr value = thread->field_table_values()[field_id];
-    if (value == Object::sentinel().raw() ||
-        value == Object::transition_sentinel().raw()) {
-      SP[1] = 0;  // Unused result of invoking the initializer.
-      SP[2] = field;
-      Exit(thread, FP, SP + 3, pc);
-      INVOKE_RUNTIME(DRT_InitStaticField,
-                     NativeArguments(thread, 1, SP + 2, SP + 1));
-
-      // Reload objects after the call which may trigger GC.
-      function = FrameFunction(FP);
-      field = static_cast<FieldPtr>(function->ptr()->data_);
-      // The field is initialized by the runtime call, but not returned.
-      intptr_t field_id = Smi::Value(field->ptr()->host_offset_or_field_id_);
-      value = thread->field_table_values()[field_id];
-    }
-
-    // Field was initialized. Return its value.
-    *++SP = value;
-
-#if !defined(PRODUCT)
-    if (UNLIKELY(Field::NeedsLoadGuardBit::decode(field->ptr()->kind_bits_))) {
-      if (!AssertAssignableField<true>(thread, pc, FP, SP,
-                                       static_cast<InstancePtr>(null_value),
-                                       field, value)) {
-        HANDLE_EXCEPTION;
-      }
-    }
-#endif
-
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(VMInternal_MethodExtractor, 0);
-
-    FunctionPtr function = FrameFunction(FP);
-    ASSERT(Function::kind(function) == FunctionLayout::kMethodExtractor);
-
-    BUMP_USAGE_COUNTER_ON_ENTRY(function);
-
-    ASSERT(InterpreterHelpers::ArgDescTypeArgsLen(argdesc_) == 0);
-
-    ++SP;
-    if (!AllocateClosure(thread, pc, FP, SP)) {
-      HANDLE_EXCEPTION;
-    }
-
-    ++SP;
-    if (!AllocateContext(thread, 1, pc, FP, SP)) {
-      HANDLE_EXCEPTION;
-    }
-
-    ContextPtr context = Context::RawCast(*SP--);
-    InstancePtr instance = Instance::RawCast(FrameArguments(FP, 1)[0]);
-    context->ptr()->StorePointer(
-        reinterpret_cast<InstancePtr*>(&context->ptr()->data()[0]), instance);
-
-    ClosurePtr closure = Closure::RawCast(*SP);
-    closure->ptr()->StorePointer(
-        &closure->ptr()->instantiator_type_arguments_,
-        InterpreterHelpers::GetTypeArguments(thread, instance));
-    // function_type_arguments_ is already null
-    closure->ptr()->delayed_type_arguments_ =
-        Object::empty_type_arguments().raw();
-    closure->ptr()->StorePointer(
-        &closure->ptr()->function_,
-        Function::RawCast(FrameFunction(FP)->ptr()->data_));
-    closure->ptr()->StorePointer(&closure->ptr()->context_, context);
-    // hash_ is already null
-
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(VMInternal_InvokeClosure, 0);
-
-    FunctionPtr function = FrameFunction(FP);
-    ASSERT(Function::kind(function) == FunctionLayout::kInvokeFieldDispatcher);
-    const bool is_dynamic_call =
-        Function::IsDynamicInvocationForwarderName(function->ptr()->name_);
-
-    BUMP_USAGE_COUNTER_ON_ENTRY(function);
-
-    const intptr_t type_args_len =
-        InterpreterHelpers::ArgDescTypeArgsLen(argdesc_);
-    const intptr_t receiver_idx = type_args_len > 0 ? 1 : 0;
-    const intptr_t argc =
-        InterpreterHelpers::ArgDescArgCount(argdesc_) + receiver_idx;
-
-    ClosurePtr receiver =
-        Closure::RawCast(FrameArguments(FP, argc)[receiver_idx]);
-    SP[1] = receiver->ptr()->function_;
-
-    if (is_dynamic_call) {
-      {
-        SP[2] = null_value;
-        SP[3] = receiver;
-        SP[4] = argdesc_;
-        Exit(thread, FP, SP + 5, pc);
-        if (!InvokeRuntime(thread, this, DRT_ClosureArgumentsValid,
-                           NativeArguments(thread, 2, SP + 3, SP + 2))) {
-          HANDLE_EXCEPTION;
-        }
-        receiver = Closure::RawCast(SP[3]);
-        argdesc_ = Array::RawCast(SP[4]);
-      }
-
-      if (SP[2] != Bool::True().raw()) {
-        goto NoSuchMethodFromPrologue;
-      }
-
-      // TODO(dartbug.com/40813): Move other checks that are currently
-      // compiled in the closure body to here as they are also moved to
-      // FlowGraphBuilder::BuildGraphOfInvokeFieldDispatcher.
-    }
-
-    goto TailCallSP1;
-  }
-
-  {
-    BYTECODE(VMInternal_InvokeField, 0);
-
-    FunctionPtr function = FrameFunction(FP);
-    ASSERT(Function::kind(function) == FunctionLayout::kInvokeFieldDispatcher);
-
-    BUMP_USAGE_COUNTER_ON_ENTRY(function);
-
-    const intptr_t type_args_len =
-        InterpreterHelpers::ArgDescTypeArgsLen(argdesc_);
-    const intptr_t receiver_idx = type_args_len > 0 ? 1 : 0;
-    const intptr_t argc =
-        InterpreterHelpers::ArgDescArgCount(argdesc_) + receiver_idx;
-    ObjectPtr receiver = FrameArguments(FP, argc)[receiver_idx];
-
-    // Possibly demangle field name and invoke field getter on receiver.
-    {
-      SP[1] = argdesc_;                // Save argdesc_.
-      SP[2] = 0;                       // Result of runtime call.
-      SP[3] = receiver;                // Receiver.
-      SP[4] = function->ptr()->name_;  // Field name (may change during call).
-      Exit(thread, FP, SP + 5, pc);
-      if (!InvokeRuntime(thread, this, DRT_GetFieldForDispatch,
-                         NativeArguments(thread, 2, SP + 3, SP + 2))) {
-        HANDLE_EXCEPTION;
-      }
-      function = FrameFunction(FP);
-      argdesc_ = Array::RawCast(SP[1]);
-    }
-
-    // If the field name in the arguments is different after the call, then
-    // this was a dynamic call.
-    StringPtr field_name = String::RawCast(SP[4]);
-    const bool is_dynamic_call = function->ptr()->name_ != field_name;
-
-    // Replace receiver with field value, keep all other arguments, and
-    // invoke 'call' function, or if not found, invoke noSuchMethod.
-    FrameArguments(FP, argc)[receiver_idx] = receiver = SP[2];
-
-    // If the field value is a closure, no need to resolve 'call' function.
-    if (InterpreterHelpers::GetClassId(receiver) == kClosureCid) {
-      SP[1] = Closure::RawCast(receiver)->ptr()->function_;
-
-      if (is_dynamic_call) {
-        {
-          SP[2] = null_value;
-          SP[3] = receiver;
-          SP[4] = argdesc_;
-          Exit(thread, FP, SP + 5, pc);
-          if (!InvokeRuntime(thread, this, DRT_ClosureArgumentsValid,
-                             NativeArguments(thread, 2, SP + 3, SP + 2))) {
-            HANDLE_EXCEPTION;
-          }
-          receiver = SP[3];
-          argdesc_ = Array::RawCast(SP[4]);
-        }
-
-        if (SP[2] != Bool::True().raw()) {
-          goto NoSuchMethodFromPrologue;
-        }
-
-        // TODO(dartbug.com/40813): Move other checks that are currently
-        // compiled in the closure body to here as they are also moved to
-        // FlowGraphBuilder::BuildGraphOfInvokeFieldDispatcher.
-      }
-
-      goto TailCallSP1;
-    }
-
-    // Otherwise, call runtime to resolve 'call' function.
-    {
-      SP[1] = 0;  // Result slot.
-      SP[2] = receiver;
-      SP[3] = argdesc_;
-      Exit(thread, FP, SP + 4, pc);
-      if (!InvokeRuntime(thread, this, DRT_ResolveCallFunction,
-                         NativeArguments(thread, 2, SP + 2, SP + 1))) {
-        HANDLE_EXCEPTION;
-      }
-      argdesc_ = Array::RawCast(SP[3]);
-      function = Function::RawCast(SP[1]);
-      receiver = SP[2];
-    }
-
-    if (function != Function::null()) {
-      SP[1] = function;
-      goto TailCallSP1;
-    }
-
-    // Function 'call' could not be resolved for argdesc_.
-    // Invoke noSuchMethod.
-    SP[1] = null_value;
-    SP[2] = receiver;
-    SP[3] = Symbols::Call().raw();  // We failed to resolve the 'call' function.
-    SP[4] = argdesc_;
-    SP[5] = null_value;  // Array of arguments (will be filled).
-
-    // Allocate array of arguments.
-    {
-      SP[6] = Smi::New(argc);  // length
-      SP[7] = null_value;      // type
-      Exit(thread, FP, SP + 8, pc);
-      if (!InvokeRuntime(thread, this, DRT_AllocateArray,
-                         NativeArguments(thread, 2, SP + 6, SP + 5))) {
-        HANDLE_EXCEPTION;
-      }
-    }
-
-    // Copy arguments into the newly allocated array.
-    ObjectPtr* argv = FrameArguments(FP, argc);
-    ArrayPtr array = static_cast<ArrayPtr>(SP[5]);
-    ASSERT(array->GetClassId() == kArrayCid);
-    for (intptr_t i = 0; i < argc; i++) {
-      array->ptr()->data()[i] = argv[i];
-    }
-
-    // Invoke noSuchMethod passing down receiver, target name, argument
-    // descriptor, and array of arguments.
-    {
-      Exit(thread, FP, SP + 6, pc);
-      if (!InvokeRuntime(thread, this, DRT_InvokeNoSuchMethod,
-                         NativeArguments(thread, 4, SP + 2, SP + 1))) {
-        HANDLE_EXCEPTION;
-      }
-
-      ++SP;  // Result at SP[0]
-    }
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(VMInternal_ForwardDynamicInvocation, 0);
-    FunctionPtr function = FrameFunction(FP);
-    ASSERT(Function::kind(function) ==
-           FunctionLayout::kDynamicInvocationForwarder);
-
-    BUMP_USAGE_COUNTER_ON_ENTRY(function);
-
-    ArrayPtr checks = Array::RawCast(function->ptr()->data_);
-    FunctionPtr target = Function::RawCast(checks->ptr()->data()[0]);
-    ASSERT(Function::kind(target) !=
-           FunctionLayout::kDynamicInvocationForwarder);
-    BytecodePtr target_bytecode = target->ptr()->bytecode_;
-    ASSERT(target_bytecode != Bytecode::null());
-    ASSERT(target_bytecode->IsBytecode());
-
-    const KBCInstr* pc2 = reinterpret_cast<const KBCInstr*>(
-        target_bytecode->ptr()->instructions_);
-    if (KernelBytecode::IsEntryOptionalOpcode(pc2)) {
-      pp_ = target_bytecode->ptr()->object_pool_;
-      uint32_t rA, rB, rC;
-      rA = KernelBytecode::DecodeA(pc2);
-      rB = KernelBytecode::DecodeB(pc2);
-      rC = KernelBytecode::DecodeC(pc2);
-      pc2 = KernelBytecode::Next(pc2);
-      if (!CopyParameters(thread, &pc2, &FP, &SP, rA, rB, rC)) {
-        SP[1] = function;
-        goto NoSuchMethodFromPrologue;
-      }
-    }
-
-    intptr_t len = Smi::Value(checks->ptr()->length_);
-    SP[1] = checks;
-    SP[2] = argdesc_;
-
-    const intptr_t type_args_len =
-        InterpreterHelpers::ArgDescTypeArgsLen(argdesc_);
-    const intptr_t receiver_idx = type_args_len > 0 ? 1 : 0;
-    const intptr_t argc =
-        InterpreterHelpers::ArgDescArgCount(argdesc_) + receiver_idx;
-
-    InstancePtr receiver =
-        Instance::RawCast(FrameArguments(FP, argc)[receiver_idx]);
-    SP[5] = InterpreterHelpers::GetTypeArguments(thread, receiver);
-
-    if (type_args_len > 0) {
-      SP[6] = FrameArguments(FP, argc)[0];
-    } else {
-      SP[6] = TypeArguments::RawCast(checks->ptr()->data()[1]);
-      // TODO(regis): Verify this condition; why test SP[6]?
-      if (SP[5] != null_value && SP[6] != null_value) {
-        SP[7] = SP[6];       // type_arguments
-        SP[8] = SP[5];       // instantiator_type_args
-        SP[9] = null_value;  // function_type_args
-        Exit(thread, FP, SP + 10, pc);
-        INVOKE_RUNTIME(DRT_InstantiateTypeArguments,
-                       NativeArguments(thread, 3, SP + 7, SP + 7));
-        SP[6] = SP[7];
-      }
-    }
-
-    for (intptr_t i = 2; i < len; i++) {
-      ParameterTypeCheckPtr check =
-          ParameterTypeCheck::RawCast(checks->ptr()->data()[i]);
-
-      if (LIKELY(check->ptr()->index_ != 0)) {
-        ASSERT(&FP[check->ptr()->index_] <= SP);
-        SP[3] = Instance::RawCast(FP[check->ptr()->index_]);
-        // TODO(regis): Revisit null handling once interpreter supports NNBD.
-        if (SP[3] == null_value) {
-          continue;  // Not handled by AssertAssignable for some reason...
-        }
-        SP[4] = check->ptr()->type_or_bound_;
-        // SP[5]: Instantiator type args.
-        // SP[6]: Function type args.
-        SP[7] = check->ptr()->name_;
-        if (!AssertAssignable(thread, pc, FP, SP + 7, SP + 3,
-                              check->ptr()->cache_)) {
-          HANDLE_EXCEPTION;
-        }
-      } else {
-        SP[3] = 0;
-        SP[4] = 0;
-        // SP[5]: Instantiator type args.
-        // SP[6]: Function type args.
-        SP[7] = check->ptr()->param_;
-        SP[8] = check->ptr()->type_or_bound_;
-        SP[9] = check->ptr()->name_;
-        SP[10] = 0;
-        Exit(thread, FP, SP + 11, pc);
-        INVOKE_RUNTIME(DRT_SubtypeCheck,
-                       NativeArguments(thread, 5, SP + 5, SP + 10));
-      }
-
-      checks = Array::RawCast(SP[1]);  // Reload after runtime call.
-    }
-
-    target = Function::RawCast(checks->ptr()->data()[0]);
-    argdesc_ = Array::RawCast(SP[2]);
-
-    SP = FP - 1;  // Unmarshall optional parameters.
-
-    SP[1] = target;
-    goto TailCallSP1;
-  }
-
-  {
-    BYTECODE(VMInternal_NoSuchMethodDispatcher, 0);
-    FunctionPtr function = FrameFunction(FP);
-    ASSERT(Function::kind(function) == FunctionLayout::kNoSuchMethodDispatcher);
-    SP[1] = function;
-    goto NoSuchMethodFromPrologue;
-  }
-
-  {
-    BYTECODE(VMInternal_ImplicitStaticClosure, 0);
-    FunctionPtr function = FrameFunction(FP);
-    ASSERT(Function::kind(function) ==
-           FunctionLayout::kImplicitClosureFunction);
-    UNIMPLEMENTED();
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(VMInternal_ImplicitInstanceClosure, 0);
-    FunctionPtr function = FrameFunction(FP);
-    ASSERT(Function::kind(function) ==
-           FunctionLayout::kImplicitClosureFunction);
-    UNIMPLEMENTED();
-    DISPATCH();
-  }
-
-  {
-  TailCallSP1:
-    FunctionPtr function = Function::RawCast(SP[1]);
-
-    for (;;) {
-      if (Function::HasBytecode(function)) {
-        ASSERT(function->IsFunction());
-        BytecodePtr bytecode = function->ptr()->bytecode_;
-        ASSERT(bytecode->IsBytecode());
-        FP[kKBCFunctionSlotFromFp] = function;
-        FP[kKBCPcMarkerSlotFromFp] = bytecode;
-        pp_ = bytecode->ptr()->object_pool_;
-        pc = reinterpret_cast<const KBCInstr*>(bytecode->ptr()->instructions_);
-        NOT_IN_PRODUCT(pc_ = pc);  // For the profiler.
-        DISPATCH();
-      }
-
-      if (Function::HasCode(function)) {
-        const intptr_t type_args_len =
-            InterpreterHelpers::ArgDescTypeArgsLen(argdesc_);
-        const intptr_t receiver_idx = type_args_len > 0 ? 1 : 0;
-        const intptr_t argc =
-            InterpreterHelpers::ArgDescArgCount(argdesc_) + receiver_idx;
-        ObjectPtr* argv = FrameArguments(FP, argc);
-        for (intptr_t i = 0; i < argc; i++) {
-          *++SP = argv[i];
-        }
-
-        ObjectPtr* call_base = SP - argc + 1;
-        ObjectPtr* call_top = SP + 1;
-        call_top[0] = function;
-        if (!InvokeCompiled(thread, function, call_base, call_top, &pc, &FP,
-                            &SP)) {
-          HANDLE_EXCEPTION;
-        } else {
-          HANDLE_RETURN;
-        }
-        DISPATCH();
-      }
-
-      // Compile the function to either generate code or load bytecode.
-      SP[1] = argdesc_;
-      SP[2] = 0;  // Code result.
-      SP[3] = function;
-      Exit(thread, FP, SP + 4, pc);
-      if (!InvokeRuntime(thread, this, DRT_CompileFunction,
-                         NativeArguments(thread, 1, /* argv */ SP + 3,
-                                         /* retval */ SP + 2))) {
-        HANDLE_EXCEPTION;
-      }
-      function = Function::RawCast(SP[3]);
-      argdesc_ = Array::RawCast(SP[1]);
-
-      ASSERT(Function::HasCode(function) || Function::HasBytecode(function));
-    }
-  }
-
-  // Helper used to handle noSuchMethod on closures. The function should be
-  // placed into SP[1] before jumping here, similar to TailCallSP1.
-  {
-  NoSuchMethodFromPrologue:
-    FunctionPtr function = Function::RawCast(SP[1]);
-
-    const intptr_t type_args_len =
-        InterpreterHelpers::ArgDescTypeArgsLen(argdesc_);
-    const intptr_t receiver_idx = type_args_len > 0 ? 1 : 0;
-    const intptr_t argc =
-        InterpreterHelpers::ArgDescArgCount(argdesc_) + receiver_idx;
-    ObjectPtr* args = FrameArguments(FP, argc);
-
-    SP[1] = null_value;
-    SP[2] = args[receiver_idx];
-    SP[3] = function;
-    SP[4] = argdesc_;
-    SP[5] = null_value;  // Array of arguments (will be filled).
-
-    // Allocate array of arguments.
-    {
-      SP[6] = Smi::New(argc);  // length
-      SP[7] = null_value;      // type
-      Exit(thread, FP, SP + 8, pc);
-      if (!InvokeRuntime(thread, this, DRT_AllocateArray,
-                         NativeArguments(thread, 2, SP + 6, SP + 5))) {
-        HANDLE_EXCEPTION;
-      }
-
-      // Copy arguments into the newly allocated array.
-      ArrayPtr array = static_cast<ArrayPtr>(SP[5]);
-      ASSERT(array->GetClassId() == kArrayCid);
-      for (intptr_t i = 0; i < argc; i++) {
-        array->ptr()->data()[i] = args[i];
-      }
-    }
-
-    // Invoke noSuchMethod passing down receiver, function, argument descriptor
-    // and array of arguments.
-    {
-      Exit(thread, FP, SP + 6, pc);
-      INVOKE_RUNTIME(DRT_NoSuchMethodFromPrologue,
-                     NativeArguments(thread, 4, SP + 2, SP + 1));
-      ++SP;  // Result at SP[0]
-    }
-
-    DISPATCH();
-  }
-
-  {
-  ThrowNullError:
-    // SP[0] contains selector.
-    SP[1] = 0;  // Unused space for result.
-    Exit(thread, FP, SP + 2, pc);
-    INVOKE_RUNTIME(DRT_NullErrorWithSelector,
-                   NativeArguments(thread, 1, SP, SP + 1));
-    UNREACHABLE();
-  }
-
-  {
-  ThrowIntegerDivisionByZeroException:
-    SP[0] = 0;  // Unused space for result.
-    Exit(thread, FP, SP + 1, pc);
-    INVOKE_RUNTIME(DRT_IntegerDivisionByZeroException,
-                   NativeArguments(thread, 0, SP, SP));
-    UNREACHABLE();
-  }
-
-  {
-  ThrowArgumentError:
-    // SP[0] contains value.
-    SP[1] = 0;  // Unused space for result.
-    Exit(thread, FP, SP + 2, pc);
-    INVOKE_RUNTIME(DRT_ArgumentError, NativeArguments(thread, 1, SP, SP + 1));
-    UNREACHABLE();
-  }
-
-  // Exception handling helper. Gets handler FP and PC from the Interpreter
-  // where they were stored by Interpreter::Longjmp and proceeds to execute the
-  // handler. Corner case: handler PC can be a fake marker that marks entry
-  // frame, which means exception was not handled in the interpreter. In this
-  // case we return the caught exception from Interpreter::Call.
-  {
-  HandleException:
-    FP = fp_;
-    pc = pc_;
-    if (IsEntryFrameMarker(pc)) {
-      pp_ = static_cast<ObjectPoolPtr>(fp_[kKBCSavedPpSlotFromEntryFp]);
-      argdesc_ = static_cast<ArrayPtr>(fp_[kKBCSavedArgDescSlotFromEntryFp]);
-      uword exit_fp = static_cast<uword>(fp_[kKBCExitLinkSlotFromEntryFp]);
-      thread->set_top_exit_frame_info(exit_fp);
-      thread->set_top_resource(top_resource);
-      thread->set_vm_tag(vm_tag);
-#if defined(DEBUG)
-      if (IsTracingExecution()) {
-        THR_Print("%" Pu64 " ", icount_);
-        THR_Print("Returning exception from interpreter 0x%" Px " at fp_ 0x%" Px
-                  " exit 0x%" Px "\n",
-                  reinterpret_cast<uword>(this), reinterpret_cast<uword>(fp_),
-                  exit_fp);
-      }
-#endif
-      ASSERT(HasFrame(reinterpret_cast<uword>(fp_)));
-      return special_[KernelBytecode::kExceptionSpecialIndex];
-    }
-
-    pp_ = InterpreterHelpers::FrameBytecode(FP)->ptr()->object_pool_;
-    DISPATCH();
-  }
-
-  UNREACHABLE();
-  return 0;
-}
-
-void Interpreter::JumpToFrame(uword pc, uword sp, uword fp, Thread* thread) {
-  // Walk over all setjmp buffers (simulated --> C++ transitions)
-  // and try to find the setjmp associated with the simulated frame pointer.
-  InterpreterSetjmpBuffer* buf = last_setjmp_buffer();
-  while ((buf->link() != NULL) && (buf->link()->fp() > fp)) {
-    buf = buf->link();
-  }
-  ASSERT(buf != NULL);
-  ASSERT(last_setjmp_buffer() == buf);
-
-  // The C++ caller has not cleaned up the stack memory of C++ frames.
-  // Prepare for unwinding frames by destroying all the stack resources
-  // in the previous C++ frames.
-  StackResource::Unwind(thread);
-
-  fp_ = reinterpret_cast<ObjectPtr*>(fp);
-
-  if (pc == StubCode::RunExceptionHandler().EntryPoint()) {
-    // The RunExceptionHandler stub is a placeholder.  We implement
-    // its behavior here.
-    ObjectPtr raw_exception = thread->active_exception();
-    ObjectPtr raw_stacktrace = thread->active_stacktrace();
-    ASSERT(raw_exception != Object::null());
-    thread->set_active_exception(Object::null_object());
-    thread->set_active_stacktrace(Object::null_object());
-    special_[KernelBytecode::kExceptionSpecialIndex] = raw_exception;
-    special_[KernelBytecode::kStackTraceSpecialIndex] = raw_stacktrace;
-    pc_ = reinterpret_cast<const KBCInstr*>(thread->resume_pc());
-  } else {
-    pc_ = reinterpret_cast<const KBCInstr*>(pc);
-  }
-
-  // Set the tag.
-  thread->set_vm_tag(VMTag::kDartInterpretedTagId);
-  // Clear top exit frame.
-  thread->set_top_exit_frame_info(0);
-
-  buf->Longjmp();
-  UNREACHABLE();
-}
-
-void Interpreter::VisitObjectPointers(ObjectPointerVisitor* visitor) {
-  visitor->VisitPointer(reinterpret_cast<ObjectPtr*>(&pp_));
-  visitor->VisitPointer(reinterpret_cast<ObjectPtr*>(&argdesc_));
-}
-
-}  // namespace dart
-
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
diff --git a/runtime/vm/interpreter.h b/runtime/vm/interpreter.h
deleted file mode 100644
index bc76fc9..0000000
--- a/runtime/vm/interpreter.h
+++ /dev/null
@@ -1,281 +0,0 @@
-// Copyright (c) 2018, 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.
-
-#ifndef RUNTIME_VM_INTERPRETER_H_
-#define RUNTIME_VM_INTERPRETER_H_
-
-#include "vm/globals.h"
-#if !defined(DART_PRECOMPILED_RUNTIME)
-
-#include "vm/compiler/method_recognizer.h"
-#include "vm/constants_kbc.h"
-#include "vm/tagged_pointer.h"
-
-namespace dart {
-
-class Array;
-class Code;
-class InterpreterSetjmpBuffer;
-class Isolate;
-class ObjectPointerVisitor;
-class Thread;
-
-class LookupCache : public ValueObject {
- public:
-  LookupCache() {
-    ASSERT(Utils::IsPowerOfTwo(sizeof(Entry)));
-    ASSERT(Utils::IsPowerOfTwo(sizeof(kNumEntries)));
-    Clear();
-  }
-
-  void Clear();
-  bool Lookup(intptr_t receiver_cid,
-              StringPtr function_name,
-              ArrayPtr arguments_descriptor,
-              FunctionPtr* target) const;
-  void Insert(intptr_t receiver_cid,
-              StringPtr function_name,
-              ArrayPtr arguments_descriptor,
-              FunctionPtr target);
-
- private:
-  struct Entry {
-    intptr_t receiver_cid;
-    StringPtr function_name;
-    ArrayPtr arguments_descriptor;
-    FunctionPtr target;
-  };
-
-  static const intptr_t kNumEntries = 1024;
-  static const intptr_t kTableMask = kNumEntries - 1;
-
-  Entry entries_[kNumEntries];
-};
-
-// Interpreter intrinsic handler. It is invoked on entry to the intrinsified
-// function via Intrinsic bytecode before the frame is setup.
-// If the handler returns true then Intrinsic bytecode works as a return
-// instruction returning the value in result. Otherwise interpreter proceeds to
-// execute the body of the function.
-typedef bool (*IntrinsicHandler)(Thread* thread,
-                                 ObjectPtr* FP,
-                                 ObjectPtr* result);
-
-class Interpreter {
- public:
-  static const uword kInterpreterStackUnderflowSize = 0x80;
-  // The entry frame pc marker must be non-zero (a valid exception handler pc).
-  static const word kEntryFramePcMarker = -1;
-
-  Interpreter();
-  ~Interpreter();
-
-  // The currently executing Interpreter instance, which is associated to the
-  // current isolate
-  static Interpreter* Current();
-
-  // Low address (KBC stack grows up).
-  uword stack_base() const { return stack_base_; }
-  // Limit for StackOverflowError.
-  uword overflow_stack_limit() const { return overflow_stack_limit_; }
-  // High address (KBC stack grows up).
-  uword stack_limit() const { return stack_limit_; }
-
-  // Returns true if the interpreter's stack contains the given frame.
-  // TODO(regis): We should rely on a new thread vm_tag to identify an
-  // interpreter frame and not need this HasFrame() method.
-  bool HasFrame(uword frame) const {
-    return frame >= stack_base() && frame < stack_limit();
-  }
-
-  // Identify an entry frame by looking at its pc marker value.
-  static bool IsEntryFrameMarker(const KBCInstr* pc) {
-    return reinterpret_cast<word>(pc) == kEntryFramePcMarker;
-  }
-
-  ObjectPtr Call(const Function& function,
-                 const Array& arguments_descriptor,
-                 const Array& arguments,
-                 Thread* thread);
-
-  ObjectPtr Call(FunctionPtr function,
-                 ArrayPtr argdesc,
-                 intptr_t argc,
-                 ObjectPtr const* argv,
-                 Thread* thread);
-
-  void JumpToFrame(uword pc, uword sp, uword fp, Thread* thread);
-
-  uword get_sp() const { return reinterpret_cast<uword>(fp_); }  // Yes, fp_.
-  uword get_fp() const { return reinterpret_cast<uword>(fp_); }
-  uword get_pc() const { return reinterpret_cast<uword>(pc_); }
-
-  void Unexit(Thread* thread);
-
-  void VisitObjectPointers(ObjectPointerVisitor* visitor);
-  void ClearLookupCache() { lookup_cache_.Clear(); }
-
-#ifndef PRODUCT
-  void set_is_debugging(bool value) { is_debugging_ = value; }
-  bool is_debugging() const { return is_debugging_; }
-#endif  // !PRODUCT
-
- private:
-  uintptr_t* stack_;
-  uword stack_base_;
-  uword overflow_stack_limit_;
-  uword stack_limit_;
-
-  ObjectPtr* volatile fp_;
-  const KBCInstr* volatile pc_;
-  DEBUG_ONLY(uint64_t icount_;)
-
-  InterpreterSetjmpBuffer* last_setjmp_buffer_;
-
-  ObjectPoolPtr pp_;  // Pool Pointer.
-  ArrayPtr argdesc_;  // Arguments Descriptor: used to pass information between
-                      // call instruction and the function entry.
-  ObjectPtr special_[KernelBytecode::kSpecialIndexCount];
-
-  LookupCache lookup_cache_;
-
-  void Exit(Thread* thread,
-            ObjectPtr* base,
-            ObjectPtr* exit_frame,
-            const KBCInstr* pc);
-
-  bool Invoke(Thread* thread,
-              ObjectPtr* call_base,
-              ObjectPtr* call_top,
-              const KBCInstr** pc,
-              ObjectPtr** FP,
-              ObjectPtr** SP);
-
-  bool InvokeCompiled(Thread* thread,
-                      FunctionPtr function,
-                      ObjectPtr* call_base,
-                      ObjectPtr* call_top,
-                      const KBCInstr** pc,
-                      ObjectPtr** FP,
-                      ObjectPtr** SP);
-
-  bool InvokeBytecode(Thread* thread,
-                      FunctionPtr function,
-                      ObjectPtr* call_base,
-                      ObjectPtr* call_top,
-                      const KBCInstr** pc,
-                      ObjectPtr** FP,
-                      ObjectPtr** SP);
-
-  bool InstanceCall(Thread* thread,
-                    StringPtr target_name,
-                    ObjectPtr* call_base,
-                    ObjectPtr* call_top,
-                    const KBCInstr** pc,
-                    ObjectPtr** FP,
-                    ObjectPtr** SP);
-
-  bool CopyParameters(Thread* thread,
-                      const KBCInstr** pc,
-                      ObjectPtr** FP,
-                      ObjectPtr** SP,
-                      const intptr_t num_fixed_params,
-                      const intptr_t num_opt_pos_params,
-                      const intptr_t num_opt_named_params);
-
-  bool AssertAssignable(Thread* thread,
-                        const KBCInstr* pc,
-                        ObjectPtr* FP,
-                        ObjectPtr* call_top,
-                        ObjectPtr* args,
-                        SubtypeTestCachePtr cache);
-  template <bool is_getter>
-  bool AssertAssignableField(Thread* thread,
-                             const KBCInstr* pc,
-                             ObjectPtr* FP,
-                             ObjectPtr* SP,
-                             InstancePtr instance,
-                             FieldPtr field,
-                             InstancePtr value);
-
-  bool AllocateMint(Thread* thread,
-                    int64_t value,
-                    const KBCInstr* pc,
-                    ObjectPtr* FP,
-                    ObjectPtr* SP);
-  bool AllocateDouble(Thread* thread,
-                      double value,
-                      const KBCInstr* pc,
-                      ObjectPtr* FP,
-                      ObjectPtr* SP);
-  bool AllocateFloat32x4(Thread* thread,
-                         simd128_value_t value,
-                         const KBCInstr* pc,
-                         ObjectPtr* FP,
-                         ObjectPtr* SP);
-  bool AllocateFloat64x2(Thread* thread,
-                         simd128_value_t value,
-                         const KBCInstr* pc,
-                         ObjectPtr* FP,
-                         ObjectPtr* SP);
-  bool AllocateArray(Thread* thread,
-                     TypeArgumentsPtr type_args,
-                     ObjectPtr length,
-                     const KBCInstr* pc,
-                     ObjectPtr* FP,
-                     ObjectPtr* SP);
-  bool AllocateContext(Thread* thread,
-                       intptr_t num_variables,
-                       const KBCInstr* pc,
-                       ObjectPtr* FP,
-                       ObjectPtr* SP);
-  bool AllocateClosure(Thread* thread,
-                       const KBCInstr* pc,
-                       ObjectPtr* FP,
-                       ObjectPtr* SP);
-
-#if defined(DEBUG)
-  // Returns true if tracing of executed instructions is enabled.
-  bool IsTracingExecution() const;
-
-  // Prints bytecode instruction at given pc for instruction tracing.
-  void TraceInstruction(const KBCInstr* pc) const;
-
-  bool IsWritingTraceFile() const;
-  void FlushTraceBuffer();
-  void WriteInstructionToTrace(const KBCInstr* pc);
-
-  void* trace_file_;
-  uint64_t trace_file_bytes_written_;
-
-  static const intptr_t kTraceBufferSizeInBytes = 10 * KB;
-  static const intptr_t kTraceBufferInstrs =
-      kTraceBufferSizeInBytes / sizeof(KBCInstr);
-  KBCInstr* trace_buffer_;
-  intptr_t trace_buffer_idx_;
-#endif  // defined(DEBUG)
-
-  // Longjmp support for exceptions.
-  InterpreterSetjmpBuffer* last_setjmp_buffer() { return last_setjmp_buffer_; }
-  void set_last_setjmp_buffer(InterpreterSetjmpBuffer* buffer) {
-    last_setjmp_buffer_ = buffer;
-  }
-
-#ifndef PRODUCT
-  bool is_debugging_ = false;
-#endif  // !PRODUCT
-
-  bool supports_unboxed_doubles_;
-  bool supports_unboxed_simd128_;
-
-  friend class InterpreterSetjmpBuffer;
-
-  DISALLOW_COPY_AND_ASSIGN(Interpreter);
-};
-
-}  // namespace dart
-
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-
-#endif  // RUNTIME_VM_INTERPRETER_H_
diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc
index 5aa297b..222e5a3 100644
--- a/runtime/vm/isolate.cc
+++ b/runtime/vm/isolate.cc
@@ -26,7 +26,6 @@
 #include "vm/heap/safepoint.h"
 #include "vm/heap/verifier.h"
 #include "vm/image_snapshot.h"
-#include "vm/interpreter.h"
 #include "vm/isolate_reload.h"
 #include "vm/kernel_isolate.h"
 #include "vm/lockers.h"
@@ -374,6 +373,7 @@
           NOT_IN_PRODUCT("IsolateGroup::type_canonicalization_mutex_")),
       type_arguments_canonicalization_mutex_(NOT_IN_PRODUCT(
           "IsolateGroup::type_arguments_canonicalization_mutex_")),
+      program_lock_(new SafepointRwLock()),
       active_mutators_monitor_(new Monitor()),
       max_active_mutators_(Scavenger::MaxMutatorThreadCount()) {
   const bool is_vm_isolate = Dart::VmIsolateNameEquals(source_->name);
@@ -426,7 +426,7 @@
 }
 
 bool IsolateGroup::ContainsOnlyOneIsolate() {
-  SafepointWriteRwLocker ml(Thread::Current(), isolates_lock_.get());
+  SafepointReadRwLocker ml(Thread::Current(), isolates_lock_.get());
   return isolate_count_ == 0;
 }
 
@@ -448,7 +448,7 @@
 
 void IsolateGroup::CreateHeap(bool is_vm_isolate,
                               bool is_service_or_kernel_isolate) {
-  Heap::Init(this,
+  Heap::Init(this, is_vm_isolate,
              is_vm_isolate
                  ? 0  // New gen size 0; VM isolate should only allocate in old.
                  : FLAG_new_gen_semi_max_size * MBInWords,
@@ -1680,10 +1680,6 @@
         "         See dartbug.com/30524 for more information.\n");
   }
 
-  if (FLAG_enable_interpreter) {
-    NOT_IN_PRECOMPILED(background_compiler_ = new BackgroundCompiler(
-                           this, /* optimizing = */ false));
-  }
   NOT_IN_PRECOMPILED(optimizing_background_compiler_ =
                          new BackgroundCompiler(this, /* optimizing = */ true));
 }
@@ -1697,11 +1693,6 @@
   // RELEASE_ASSERT(reload_context_ == NULL);
 #endif  // !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
 
-  if (FLAG_enable_interpreter) {
-    delete background_compiler_;
-    background_compiler_ = nullptr;
-  }
-
   delete optimizing_background_compiler_;
   optimizing_background_compiler_ = nullptr;
 
@@ -2394,8 +2385,9 @@
     args.SetAt(2, Instance::Handle(state->BuildArgs(thread)));
     args.SetAt(3, Instance::Handle(state->BuildMessage(thread)));
     args.SetAt(4, is_spawn_uri ? Bool::True() : Bool::False());
-    args.SetAt(5, ReceivePort::Handle(ReceivePort::New(
-                      isolate->main_port(), true /* control port */)));
+    args.SetAt(5, ReceivePort::Handle(
+                      ReceivePort::New(isolate->main_port(), Symbols::Empty(),
+                                       true /* control port */)));
     args.SetAt(6, capabilities);
 
     const Library& lib = Library::Handle(Library::IsolateLibrary());
@@ -2601,10 +2593,6 @@
 void Isolate::Shutdown() {
   ASSERT(this == Isolate::Current());
   BackgroundCompiler::Stop(this);
-  if (FLAG_enable_interpreter) {
-    delete background_compiler_;
-    background_compiler_ = nullptr;
-  }
   delete optimizing_background_compiler_;
   optimizing_background_compiler_ = nullptr;
 
diff --git a/runtime/vm/isolate.h b/runtime/vm/isolate.h
index 51d50d91..0d3279d 100644
--- a/runtime/vm/isolate.h
+++ b/runtime/vm/isolate.h
@@ -18,7 +18,6 @@
 #include "platform/atomic.h"
 #include "vm/base_isolate.h"
 #include "vm/class_table.h"
-#include "vm/constants_kbc.h"
 #include "vm/dispatch_table.h"
 #include "vm/exceptions.h"
 #include "vm/field_table.h"
@@ -56,9 +55,6 @@
 class HandleVisitor;
 class Heap;
 class ICData;
-#if !defined(DART_PRECOMPILED_RUNTIME)
-class Interpreter;
-#endif
 class IsolateObjectStore;
 class IsolateProfilerData;
 class IsolateReloadContext;
@@ -435,6 +431,8 @@
   Mutex* initializer_functions_mutex() { return &initializer_functions_mutex_; }
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
 
+  SafepointRwLock* program_lock() { return program_lock_.get(); }
+
   static inline IsolateGroup* Current() {
     Thread* thread = Thread::Current();
     return thread == nullptr ? nullptr : thread->isolate_group();
@@ -725,6 +723,11 @@
   Mutex initializer_functions_mutex_;
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
 
+  // Ensures synchronized access to classes functions, fields and other
+  // program structure elements to accommodate concurrent modification done
+  // by multiple isolates and background compiler.
+  std::unique_ptr<SafepointRwLock> program_lock_;
+
   // Allow us to ensure the number of active mutators is limited by a maximum.
   std::unique_ptr<Monitor> active_mutators_monitor_;
   intptr_t active_mutators_ = 0;
diff --git a/runtime/vm/isolate_reload.cc b/runtime/vm/isolate_reload.cc
index 10b3e76..f9e26a0 100644
--- a/runtime/vm/isolate_reload.cc
+++ b/runtime/vm/isolate_reload.cc
@@ -857,9 +857,13 @@
     // ValidateReload mutates the direct subclass information and does
     // not remove dead subclasses.  Rebuild the direct subclass
     // information from scratch.
-    ForEachIsolate([&](Isolate* isolate) {
-      isolate->reload_context()->RebuildDirectSubclasses();
-    });
+    {
+      SafepointWriteRwLocker ml(thread,
+                                thread->isolate_group()->program_lock());
+      ForEachIsolate([&](Isolate* isolate) {
+        isolate->reload_context()->RebuildDirectSubclasses();
+      });
+    }
     const intptr_t final_library_count =
         GrowableObjectArray::Handle(Z,
                                     first_isolate_->object_store()->libraries())
@@ -1217,7 +1221,7 @@
   Function& func = Function::Handle();
   while (it.HasNextFrame()) {
     StackFrame* frame = it.NextFrame();
-    if (frame->IsDartFrame() && !frame->is_interpreted()) {
+    if (frame->IsDartFrame()) {
       func = frame->LookupDartFunction();
       ASSERT(!func.IsNull());
       // Force-optimized functions don't need unoptimized code because their
@@ -1941,31 +1945,25 @@
   Zone* zone = stack_zone.GetZone();
 
   Code& code = Code::Handle(zone);
-  Bytecode& bytecode = Bytecode::Handle(zone);
   Function& function = Function::Handle(zone);
   CallSiteResetter resetter(zone);
   DartFrameIterator iterator(thread,
                              StackFrameIterator::kNoCrossThreadIteration);
   StackFrame* frame = iterator.NextFrame();
   while (frame != NULL) {
-    if (frame->is_interpreted()) {
-      bytecode = frame->LookupDartBytecode();
-      resetter.RebindStaticTargets(bytecode);
+    code = frame->LookupDartCode();
+    if (code.is_optimized() && !code.is_force_optimized()) {
+      // If this code is optimized, we need to reset the ICs in the
+      // corresponding unoptimized code, which will be executed when the stack
+      // unwinds to the optimized code.
+      function = code.function();
+      code = function.unoptimized_code();
+      ASSERT(!code.IsNull());
+      resetter.ResetSwitchableCalls(code);
+      resetter.ResetCaches(code);
     } else {
-      code = frame->LookupDartCode();
-      if (code.is_optimized() && !code.is_force_optimized()) {
-        // If this code is optimized, we need to reset the ICs in the
-        // corresponding unoptimized code, which will be executed when the stack
-        // unwinds to the optimized code.
-        function = code.function();
-        code = function.unoptimized_code();
-        ASSERT(!code.IsNull());
-        resetter.ResetSwitchableCalls(code);
-        resetter.ResetCaches(code);
-      } else {
-        resetter.ResetSwitchableCalls(code);
-        resetter.ResetCaches(code);
-      }
+      resetter.ResetSwitchableCalls(code);
+      resetter.ResetCaches(code);
     }
     frame = iterator.NextFrame();
   }
@@ -2028,14 +2026,6 @@
   StackZone stack_zone(thread);
   Zone* zone = stack_zone.GetZone();
 
-  Thread* mutator_thread = I->mutator_thread();
-  if (mutator_thread != nullptr) {
-    Interpreter* interpreter = mutator_thread->interpreter();
-    if (interpreter != nullptr) {
-      interpreter->ClearLookupCache();
-    }
-  }
-
   GrowableArray<const Function*> functions(4 * KB);
   GrowableArray<const KernelProgramInfo*> kernel_infos(KB);
   GrowableArray<const Field*> fields(4 * KB);
@@ -2080,10 +2070,6 @@
       table.Clear();
       info.set_classes_cache(table.Release());
     }
-    // Clear the bytecode object table.
-    if (info.bytecode_component() != Array::null()) {
-      kernel::BytecodeReader::ResetObjectTable(info);
-    }
   }
 }
 
@@ -2098,7 +2084,6 @@
   Class& owning_class = Class::Handle(zone);
   Library& owning_lib = Library::Handle(zone);
   Code& code = Code::Handle(zone);
-  Bytecode& bytecode = Bytecode::Handle(zone);
   for (intptr_t i = 0; i < functions.length(); i++) {
     const Function& func = *functions[i];
     if (func.IsSignatureFunction()) {
@@ -2111,7 +2096,6 @@
     // Grab the current code.
     code = func.CurrentCode();
     ASSERT(!code.IsNull());
-    bytecode = func.bytecode();
 
     owning_class = func.Owner();
     owning_lib = owning_class.library();
@@ -2122,10 +2106,6 @@
     // they're held.
     resetter.ZeroEdgeCounters(func);
 
-    if (!bytecode.IsNull()) {
-      resetter.RebindStaticTargets(bytecode);
-    }
-
     if (stub_code) {
       // Nothing to reset.
     } else if (clear_code) {
diff --git a/runtime/vm/isolate_reload.h b/runtime/vm/isolate_reload.h
index b06ca57..ad29eb0 100644
--- a/runtime/vm/isolate_reload.h
+++ b/runtime/vm/isolate_reload.h
@@ -435,7 +435,6 @@
   void ZeroEdgeCounters(const Function& function);
   void ResetCaches(const Code& code);
   void ResetCaches(const ObjectPool& pool);
-  void RebindStaticTargets(const Bytecode& code);
   void Reset(const ICData& ic);
   void ResetSwitchableCalls(const Code& code);
 
diff --git a/runtime/vm/isolate_reload_test.cc b/runtime/vm/isolate_reload_test.cc
index eac771f..6050dd30 100644
--- a/runtime/vm/isolate_reload_test.cc
+++ b/runtime/vm/isolate_reload_test.cc
@@ -1096,12 +1096,12 @@
 
   const char* kScript =
       "main() {\n"
-      "  return importedFunc();\n"
+      "  return 'b';\n"
       "}\n";
   Dart_Handle result;
   Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
   EXPECT_VALID(lib);
-  EXPECT_ERROR(SimpleInvokeError(lib, "main"), "importedFunc");
+  EXPECT_STREQ("b", SimpleInvokeStr(lib, "main"));
 
   // Fail to find 'test:lib1' in the isolate.
   result = Dart_LookupLibrary(NewString("test:lib1"));
@@ -1122,7 +1122,7 @@
   result = Dart_LookupLibrary(NewString("test:lib1"));
   EXPECT(Dart_IsLibrary(result));
 
-  // Reload and remove 'dart:math' from isolate.
+  // Reload and remove 'test:lib1' from isolate.
   lib = TestCase::ReloadTestScript(kScript);
   EXPECT_VALID(lib);
 
@@ -1362,22 +1362,15 @@
       "}\n";
 
   EXPECT_VALID(TestCase::SetReloadTestScript(kReloadScript));
-
   const char* expected = "static";
   const char* result = SimpleInvokeStr(lib, "main");
   EXPECT_NOTNULL(result);
-
   // Bail out if we've already failed so we don't crash in StringEquals.
   if (result == NULL) {
     return;
   }
   EXPECT_STREQ(expected, result);
 
-  // Bail out if we've already failed so we don't crash in the tag handler.
-  if (strcmp(expected, result) != 0) {
-    return;
-  }
-
   lib = Dart_RootLibrary();
   EXPECT_NON_NULL(lib);
   EXPECT_STREQ(expected, SimpleInvokeStr(lib, "main"));
@@ -1390,7 +1383,6 @@
       "class C {\n"
       "  test() {\n"
       "    reloadTest();\n"
-      "    return new Foo();\n"
       "  }\n"
       "}\n"
       "main() {\n"
@@ -1480,19 +1472,7 @@
       "}\n";
 
   EXPECT_VALID(TestCase::SetReloadTestScript(kReloadScript));
-
-  const char* expected = "exception";
-  const char* result = SimpleInvokeStr(lib, "main");
-  EXPECT_STREQ(expected, result);
-
-  // Bail out if we've already failed so we don't crash in the tag handler.
-  if ((result == NULL) || (strcmp(expected, result) != 0)) {
-    return;
-  }
-
-  lib = Dart_RootLibrary();
-  EXPECT_NON_NULL(lib);
-  EXPECT_STREQ(expected, SimpleInvokeStr(lib, "main"));
+  EXPECT_ERROR(SimpleInvokeError(lib, "main"), "is abstract");
 }
 
 TEST_CASE(IsolateReload_PendingStaticCall_DefinedToNSM) {
@@ -1533,7 +1513,6 @@
       "}\n";
 
   EXPECT_VALID(TestCase::SetReloadTestScript(kReloadScript));
-
   const char* expected = "exception";
   const char* result = SimpleInvokeStr(lib, "main");
   EXPECT_NOTNULL(result);
@@ -1544,12 +1523,6 @@
   }
   EXPECT_STREQ(expected, result);
 
-  // Bail out if we've already failed so we don't crash in the tag handler.
-  if (strcmp(expected, result) != 0) {
-    return;
-  }
-
-  EXPECT_STREQ(expected, result);
   lib = Dart_RootLibrary();
   EXPECT_NON_NULL(lib);
   EXPECT_STREQ(expected, SimpleInvokeStr(lib, "main"));
@@ -1596,12 +1569,12 @@
 
   const char* expected = "static";
   const char* result = SimpleInvokeStr(lib, "main");
-  EXPECT_STREQ(expected, result);
 
   // Bail out if we've already failed so we don't crash in the tag handler.
-  if ((result == NULL) || (strcmp(expected, result) != 0)) {
+  if (result == NULL) {
     return;
   }
+  EXPECT_STREQ(expected, result);
 
   lib = Dart_RootLibrary();
   EXPECT_NON_NULL(lib);
@@ -2391,7 +2364,7 @@
 
   // Keep track of how many subclasses an Stopwatch has.
   auto& subclasses =
-      GrowableObjectArray::Handle(stopwatch_cls.direct_subclasses());
+      GrowableObjectArray::Handle(stopwatch_cls.direct_subclasses_unsafe());
   intptr_t saved_subclass_count = subclasses.IsNull() ? 0 : subclasses.Length();
 
   const char* kScript =
@@ -2410,7 +2383,7 @@
   }
 
   // Stopwatch has one non-core subclass.
-  subclasses = stopwatch_cls.direct_subclasses();
+  subclasses = stopwatch_cls.direct_subclasses_unsafe();
   EXPECT_EQ(saved_subclass_count + 1, subclasses.Length());
 
   // The new subclass is named AStopwatch.
@@ -2437,7 +2410,7 @@
   }
 
   // Stopwatch still has only one non-core subclass (AStopwatch is gone).
-  subclasses = stopwatch_cls.direct_subclasses();
+  subclasses = stopwatch_cls.direct_subclasses_unsafe();
   EXPECT_EQ(saved_subclass_count + 1, subclasses.Length());
 
   // The new subclass is named BStopwatch.
@@ -2458,7 +2431,7 @@
 
   // Keep track of how many subclasses an Stopwatch has.
   auto& subclasses =
-      GrowableObjectArray::Handle(stopwatch_cls.direct_subclasses());
+      GrowableObjectArray::Handle(stopwatch_cls.direct_subclasses_unsafe());
   intptr_t saved_subclass_count = subclasses.IsNull() ? 0 : subclasses.Length();
 
   const char* kScript =
@@ -2477,7 +2450,7 @@
   }
 
   // Stopwatch has one new subclass.
-  subclasses = stopwatch_cls.direct_subclasses();
+  subclasses = stopwatch_cls.direct_subclasses_unsafe();
   EXPECT_EQ(saved_subclass_count + 1, subclasses.Length());
 
   // The new subclass is named AStopwatch.
@@ -2501,7 +2474,7 @@
   }
 
   // Stopwatch has two non-core subclasses.
-  subclasses = stopwatch_cls.direct_subclasses();
+  subclasses = stopwatch_cls.direct_subclasses_unsafe();
   EXPECT_EQ(saved_subclass_count + 2, subclasses.Length());
 
   // The non-core subclasses are AStopwatch and BStopwatch.
@@ -2527,7 +2500,7 @@
 
   // Keep track of how many subclasses an Stopwatch has.
   auto& subclasses =
-      GrowableObjectArray::Handle(stopwatch_cls.direct_subclasses());
+      GrowableObjectArray::Handle(stopwatch_cls.direct_subclasses_unsafe());
   intptr_t saved_subclass_count = subclasses.IsNull() ? 0 : subclasses.Length();
 
   const char* kScript =
@@ -2551,11 +2524,11 @@
   }
 
   // Stopwatch has one non-core subclass...
-  subclasses = stopwatch_cls.direct_subclasses();
+  subclasses = stopwatch_cls.direct_subclasses_unsafe();
   EXPECT_EQ(saved_subclass_count + 1, subclasses.Length());
 
   // ... and the non-core subclass is named AStopwatch.
-  subclasses = stopwatch_cls.direct_subclasses();
+  subclasses = stopwatch_cls.direct_subclasses_unsafe();
   new_subclass = subclasses.At(subclasses.Length() - 1);
   name = Class::Cast(new_subclass).Name();
   EXPECT_STREQ("AStopwatch", name.ToCString());
@@ -2583,7 +2556,7 @@
   // If we don't clean up the subclasses, we would find BStopwatch in
   // the list of subclasses, which would be bad.  Make sure that
   // Stopwatch still has only one non-core subclass...
-  subclasses = stopwatch_cls.direct_subclasses();
+  subclasses = stopwatch_cls.direct_subclasses_unsafe();
   EXPECT_EQ(saved_subclass_count + 1, subclasses.Length());
 
   // ...and the non-core subclass is still named AStopwatch.
diff --git a/runtime/vm/json_stream.cc b/runtime/vm/json_stream.cc
index 041f250..30142f5 100644
--- a/runtime/vm/json_stream.cc
+++ b/runtime/vm/json_stream.cc
@@ -184,9 +184,7 @@
       Message::New(port, Object::null(), Message::kNormalPriority));
 }
 
-static void Finalizer(void* isolate_callback_data,
-                      Dart_WeakPersistentHandle handle,
-                      void* buffer) {
+static void Finalizer(void* isolate_callback_data, void* buffer) {
   free(buffer);
 }
 
diff --git a/runtime/vm/kernel.cc b/runtime/vm/kernel.cc
index 19070a4..7c53e72 100644
--- a/runtime/vm/kernel.cc
+++ b/runtime/vm/kernel.cc
@@ -7,7 +7,6 @@
 #include "vm/kernel.h"
 
 #include "vm/bit_vector.h"
-#include "vm/compiler/frontend/bytecode_reader.h"
 #include "vm/compiler/frontend/constant_reader.h"
 #include "vm/compiler/frontend/kernel_translation_helper.h"
 #include "vm/compiler/jit/compiler.h"
@@ -230,71 +229,6 @@
   token_position_collector.CollectTokenPositions(kernel_offset);
 }
 
-static void CollectTokenPosition(TokenPosition position,
-                                 GrowableArray<intptr_t>* token_positions) {
-  if (position.IsReal()) {
-    token_positions->Add(position.value());
-  }
-}
-
-static void CollectBytecodeSourceTokenPositions(
-    const Bytecode& bytecode,
-    Zone* zone,
-    GrowableArray<intptr_t>* token_positions) {
-  BytecodeSourcePositionsIterator iter(zone, bytecode);
-  while (iter.MoveNext()) {
-    CollectTokenPosition(iter.TokenPos(), token_positions);
-  }
-}
-
-static void CollectBytecodeFunctionTokenPositions(
-    const Function& function,
-    GrowableArray<intptr_t>* token_positions) {
-  Thread* thread = Thread::Current();
-  Zone* zone = thread->zone();
-  ASSERT(function.is_declared_in_bytecode());
-  CollectTokenPosition(function.token_pos(), token_positions);
-  CollectTokenPosition(function.end_token_pos(), token_positions);
-  if (!function.HasBytecode()) {
-    const Object& result = Object::Handle(
-        zone, BytecodeReader::ReadFunctionBytecode(thread, function));
-    if (!result.IsNull()) {
-      Exceptions::PropagateError(Error::Cast(result));
-    }
-  }
-  Bytecode& bytecode = Bytecode::Handle(zone, function.bytecode());
-  if (bytecode.IsNull()) {
-    return;
-  }
-  if (bytecode.HasSourcePositions() && !function.IsLocalFunction()) {
-    CollectBytecodeSourceTokenPositions(bytecode, zone, token_positions);
-    // Find closure functions in the object pool.
-    const ObjectPool& pool = ObjectPool::Handle(zone, bytecode.object_pool());
-    Object& object = Object::Handle(zone);
-    Function& closure = Function::Handle(zone);
-    for (intptr_t i = 0; i < pool.Length(); i++) {
-      ObjectPool::EntryType entry_type = pool.TypeAt(i);
-      if (entry_type != ObjectPool::EntryType::kTaggedObject) {
-        continue;
-      }
-      object = pool.ObjectAt(i);
-      if (object.IsFunction()) {
-        closure ^= object.raw();
-        if (closure.kind() == FunctionLayout::kClosureFunction &&
-            closure.IsLocalFunction()) {
-          CollectTokenPosition(closure.token_pos(), token_positions);
-          CollectTokenPosition(closure.end_token_pos(), token_positions);
-          bytecode = closure.bytecode();
-          ASSERT(!bytecode.IsNull());
-          ASSERT(bytecode.function() != Function::null());
-          ASSERT(bytecode.HasSourcePositions());
-          CollectBytecodeSourceTokenPositions(bytecode, zone, token_positions);
-        }
-      }
-    }
-  }
-}
-
 void CollectTokenPositionsFor(const Script& interesting_script) {
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
@@ -328,22 +262,11 @@
           token_positions.Add(klass.token_pos().value());
           token_positions.Add(klass.end_token_pos().value());
         }
-        // If class is declared in bytecode, its members should be loaded
-        // (via class finalization) before their token positions could be
-        // collected.
-        if (klass.is_declared_in_bytecode() && !klass.is_finalized()) {
-          const Error& error =
-              Error::Handle(zone, klass.EnsureIsFinalized(thread));
-          if (!error.IsNull()) {
-            Exceptions::PropagateError(error);
-          }
-        }
         if (klass.is_finalized()) {
           temp_array = klass.fields();
           for (intptr_t i = 0; i < temp_array.Length(); ++i) {
             temp_field ^= temp_array.At(i);
-            if (!temp_field.is_declared_in_bytecode() &&
-                temp_field.kernel_offset() <= 0) {
+            if (temp_field.kernel_offset() <= 0) {
               // Skip artificially injected fields.
               continue;
             }
@@ -351,46 +274,29 @@
             if (entry_script.raw() != interesting_script.raw()) {
               continue;
             }
-            if (temp_field.is_declared_in_bytecode()) {
-              token_positions.Add(temp_field.token_pos().value());
-              token_positions.Add(temp_field.end_token_pos().value());
-              if (temp_field.is_static() &&
-                  temp_field.has_nontrivial_initializer()) {
-                temp_function = temp_field.EnsureInitializerFunction();
-                CollectBytecodeFunctionTokenPositions(temp_function,
-                                                      &token_positions);
-              }
-            } else {
-              data = temp_field.KernelData();
-              CollectKernelDataTokenPositions(
-                  data, interesting_script, entry_script,
-                  temp_field.kernel_offset(),
-                  temp_field.KernelDataProgramOffset(), zone, &helper,
-                  &token_positions);
-            }
+            data = temp_field.KernelData();
+            CollectKernelDataTokenPositions(
+                data, interesting_script, entry_script,
+                temp_field.kernel_offset(),
+                temp_field.KernelDataProgramOffset(), zone, &helper,
+                &token_positions);
           }
-          temp_array = klass.functions();
+          temp_array = klass.current_functions();
           for (intptr_t i = 0; i < temp_array.Length(); ++i) {
             temp_function ^= temp_array.At(i);
             entry_script = temp_function.script();
             if (entry_script.raw() != interesting_script.raw()) {
               continue;
             }
-            if (temp_function.is_declared_in_bytecode()) {
-              CollectBytecodeFunctionTokenPositions(temp_function,
-                                                    &token_positions);
-            } else {
-              data = temp_function.KernelData();
-              CollectKernelDataTokenPositions(
-                  data, interesting_script, entry_script,
-                  temp_function.kernel_offset(),
-                  temp_function.KernelDataProgramOffset(), zone, &helper,
-                  &token_positions);
-            }
+            data = temp_function.KernelData();
+            CollectKernelDataTokenPositions(
+                data, interesting_script, entry_script,
+                temp_function.kernel_offset(),
+                temp_function.KernelDataProgramOffset(), zone, &helper,
+                &token_positions);
           }
         } else {
           // Class isn't finalized yet: read the data attached to it.
-          ASSERT(!klass.is_declared_in_bytecode());
           ASSERT(klass.kernel_offset() > 0);
           data = lib.kernel_data();
           ASSERT(!data.IsNull());
@@ -412,20 +318,14 @@
         if (entry_script.raw() != interesting_script.raw()) {
           continue;
         }
-        if (temp_function.is_declared_in_bytecode()) {
-          CollectBytecodeFunctionTokenPositions(temp_function,
-                                                &token_positions);
-        } else {
-          data = temp_function.KernelData();
-          CollectKernelDataTokenPositions(
-              data, interesting_script, entry_script,
-              temp_function.kernel_offset(),
-              temp_function.KernelDataProgramOffset(), zone, &helper,
-              &token_positions);
-        }
+        data = temp_function.KernelData();
+        CollectKernelDataTokenPositions(data, interesting_script, entry_script,
+                                        temp_function.kernel_offset(),
+                                        temp_function.KernelDataProgramOffset(),
+                                        zone, &helper, &token_positions);
       } else if (entry.IsField()) {
         const Field& field = Field::Cast(entry);
-        if (!field.is_declared_in_bytecode() && field.kernel_offset() <= 0) {
+        if (field.kernel_offset() <= 0) {
           // Skip artificially injected fields.
           continue;
         }
@@ -433,20 +333,10 @@
         if (entry_script.raw() != interesting_script.raw()) {
           continue;
         }
-        if (field.is_declared_in_bytecode()) {
-          token_positions.Add(field.token_pos().value());
-          token_positions.Add(field.end_token_pos().value());
-          if (field.is_static() && field.has_nontrivial_initializer()) {
-            temp_function = field.EnsureInitializerFunction();
-            CollectBytecodeFunctionTokenPositions(temp_function,
-                                                  &token_positions);
-          }
-        } else {
-          data = field.KernelData();
-          CollectKernelDataTokenPositions(
-              data, interesting_script, entry_script, field.kernel_offset(),
-              field.KernelDataProgramOffset(), zone, &helper, &token_positions);
-        }
+        data = field.KernelData();
+        CollectKernelDataTokenPositions(
+            data, interesting_script, entry_script, field.kernel_offset(),
+            field.KernelDataProgramOffset(), zone, &helper, &token_positions);
       }
     }
   }
@@ -457,6 +347,38 @@
   script.set_debug_positions(array_object);
 }
 
+ObjectPtr EvaluateStaticConstFieldInitializer(const Field& field) {
+  ASSERT(field.is_static() && field.is_const());
+
+  LongJumpScope jump;
+  if (setjmp(*jump.Set()) == 0) {
+    Thread* thread = Thread::Current();
+    Zone* zone = thread->zone();
+    TranslationHelper helper(thread);
+    Script& script = Script::Handle(zone, field.Script());
+    helper.InitFromScript(script);
+
+    const Class& owner_class = Class::Handle(zone, field.Owner());
+    ActiveClass active_class;
+    ActiveClassScope active_class_scope(&active_class, &owner_class);
+
+    KernelReaderHelper kernel_reader(
+        zone, &helper, script,
+        ExternalTypedData::Handle(zone, field.KernelData()),
+        field.KernelDataProgramOffset());
+    kernel_reader.SetOffset(field.kernel_offset());
+    ConstantReader constant_reader(&kernel_reader, &active_class);
+
+    FieldHelper field_helper(&kernel_reader);
+    field_helper.ReadUntilExcluding(FieldHelper::kInitializer);
+    ASSERT(field_helper.IsConst());
+
+    return constant_reader.ReadConstantInitializer();
+  } else {
+    return Thread::Current()->StealStickyError();
+  }
+}
+
 class MetadataEvaluator : public KernelReaderHelper {
  public:
   MetadataEvaluator(Zone* zone,
@@ -627,15 +549,6 @@
     Script& script = Script::Handle(zone, function.script());
     helper.InitFromScript(script);
 
-    if (function.is_declared_in_bytecode()) {
-      BytecodeComponentData bytecode_component(
-          &Array::Handle(zone, helper.GetBytecodeComponent()));
-      ActiveClass active_class;
-      BytecodeReaderHelper bytecode_reader_helper(&helper, &active_class,
-                                                  &bytecode_component);
-      return bytecode_reader_helper.BuildParameterDescriptor(function);
-    }
-
     const Class& owner_class = Class::Handle(zone, function.Owner());
     ActiveClass active_class;
     ActiveClassScope active_class_scope(&active_class, &owner_class);
@@ -665,14 +578,6 @@
   TranslationHelper translation_helper(thread);
   translation_helper.InitFromScript(script);
 
-  if (function.is_declared_in_bytecode()) {
-    BytecodeReaderHelper bytecode_reader_helper(&translation_helper, nullptr,
-                                                nullptr);
-    bytecode_reader_helper.ReadParameterCovariance(function, is_covariant,
-                                                   is_generic_covariant_impl);
-    return;
-  }
-
   KernelReaderHelper reader_helper(
       zone, &translation_helper, script,
       ExternalTypedData::Handle(zone, function.KernelData()),
@@ -809,55 +714,8 @@
   return attrs;
 }
 
-static void BytecodeProcedureAttributesError(const Object& function_or_field,
-                                             const Object& value) {
-  FATAL3("Unexpected value of %s bytecode attribute on %s: %s",
-         Symbols::vm_procedure_attributes_metadata().ToCString(),
-         function_or_field.ToCString(), value.ToCString());
-}
-
-static ProcedureAttributesMetadata ProcedureAttributesFromBytecodeAttribute(
-    Zone* zone,
-    const Object& function_or_field) {
-  ProcedureAttributesMetadata attrs;
-  const Object& value = Object::Handle(
-      zone,
-      BytecodeReader::GetBytecodeAttribute(
-          function_or_field, Symbols::vm_procedure_attributes_metadata()));
-  if (!value.IsNull()) {
-    const intptr_t kBytecodeAttributeLength = 3;
-    int32_t elements[kBytecodeAttributeLength];
-    if (!value.IsArray()) {
-      BytecodeProcedureAttributesError(function_or_field, value);
-    }
-    const Array& array = Array::Cast(value);
-    if (array.Length() != kBytecodeAttributeLength) {
-      BytecodeProcedureAttributesError(function_or_field, value);
-    }
-    Object& element = Object::Handle(zone);
-    for (intptr_t i = 0; i < kBytecodeAttributeLength; i++) {
-      element = array.At(i);
-      if (!element.IsSmi()) {
-        BytecodeProcedureAttributesError(function_or_field, value);
-      }
-      elements[i] = Smi::Cast(element).Value();
-    }
-    attrs.InitializeFromFlags(elements[0]);
-    attrs.method_or_setter_selector_id = elements[1];
-    attrs.getter_selector_id = elements[2];
-  }
-  return attrs;
-}
-
 ProcedureAttributesMetadata ProcedureAttributesOf(const Function& function,
                                                   Zone* zone) {
-  if (function.is_declared_in_bytecode()) {
-    if (function.IsImplicitGetterOrSetter()) {
-      const Field& field = Field::Handle(zone, function.accessor_field());
-      return ProcedureAttributesFromBytecodeAttribute(zone, field);
-    }
-    return ProcedureAttributesFromBytecodeAttribute(zone, function);
-  }
   const Script& script = Script::Handle(zone, function.script());
   return ProcedureAttributesOf(
       zone, script, ExternalTypedData::Handle(zone, function.KernelData()),
@@ -866,9 +724,6 @@
 
 ProcedureAttributesMetadata ProcedureAttributesOf(const Field& field,
                                                   Zone* zone) {
-  if (field.is_declared_in_bytecode()) {
-    return ProcedureAttributesFromBytecodeAttribute(zone, field);
-  }
   const Class& parent = Class::Handle(zone, field.Owner());
   const Script& script = Script::Handle(zone, parent.script());
   return ProcedureAttributesOf(
diff --git a/runtime/vm/kernel.h b/runtime/vm/kernel.h
index 2ac42a1..9b0d8de 100644
--- a/runtime/vm/kernel.h
+++ b/runtime/vm/kernel.h
@@ -195,6 +195,7 @@
 
 void CollectTokenPositionsFor(const Script& script);
 
+ObjectPtr EvaluateStaticConstFieldInitializer(const Field& field);
 ObjectPtr EvaluateMetadata(const Field& metadata_field,
                            bool is_annotations_offset);
 ObjectPtr BuildParameterDescriptor(const Function& function);
@@ -214,11 +215,6 @@
 // as such function already checks all of its parameters.
 bool NeedsDynamicInvocationForwarder(const Function& function);
 
-// Returns a list of ParameterTypeChecks needed by a dynamic invocation
-// forwarder that targets [function]. Indices in these checks correspond to
-// bytecode frame indices.
-ArrayPtr CollectDynamicInvocationChecks(const Function& function);
-
 ProcedureAttributesMetadata ProcedureAttributesOf(const Function& function,
                                                   Zone* zone);
 
diff --git a/runtime/vm/kernel_binary.h b/runtime/vm/kernel_binary.h
index 1b53aaa..7d5e9c5 100644
--- a/runtime/vm/kernel_binary.h
+++ b/runtime/vm/kernel_binary.h
@@ -20,8 +20,8 @@
 static const uint32_t kMagicProgramFile = 0x90ABCDEFu;
 
 // Both version numbers are inclusive.
-static const uint32_t kMinSupportedKernelFormatVersion = 46;
-static const uint32_t kMaxSupportedKernelFormatVersion = 46;
+static const uint32_t kMinSupportedKernelFormatVersion = 50;
+static const uint32_t kMaxSupportedKernelFormatVersion = 50;
 
 // Keep in sync with package:kernel/lib/binary/tag.dart
 #define KERNEL_TAG_LIST(V)                                                     \
diff --git a/runtime/vm/kernel_isolate.cc b/runtime/vm/kernel_isolate.cc
index d2cdbb5..f8f0d54 100644
--- a/runtime/vm/kernel_isolate.cc
+++ b/runtime/vm/kernel_isolate.cc
@@ -401,9 +401,7 @@
   delete[] files.value.as_array.values;
 }
 
-static void PassThroughFinalizer(void* isolate_callback_data,
-                                 Dart_WeakPersistentHandle handle,
-                                 void* peer) {}
+static void PassThroughFinalizer(void* isolate_callback_data, void* peer) {}
 
 MallocGrowableArray<char*>* KernelIsolate::experimental_flags_ =
     new MallocGrowableArray<char*>();
@@ -647,11 +645,6 @@
     experimental_flags_object.value.as_array.values = experimental_flags_array;
     experimental_flags_object.value.as_array.length = num_experimental_flags;
 
-    Dart_CObject bytecode;
-    bytecode.type = Dart_CObject_kBool;
-    bytecode.value.as_bool =
-        FLAG_enable_interpreter || FLAG_use_bytecode_compiler;
-
     Dart_CObject message;
     message.type = Dart_CObject_kArray;
     Dart_CObject* message_arr[] = {&tag,
@@ -668,8 +661,7 @@
                                    &num_blob_loads,
                                    &suppress_warnings,
                                    &enable_asserts,
-                                   &experimental_flags_object,
-                                   &bytecode};
+                                   &experimental_flags_object};
     message.value.as_array.values = message_arr;
     message.value.as_array.length = ARRAY_SIZE(message_arr);
 
@@ -813,11 +805,6 @@
     experimental_flags_object.value.as_array.values = experimental_flags_array;
     experimental_flags_object.value.as_array.length = num_experimental_flags;
 
-    Dart_CObject bytecode;
-    bytecode.type = Dart_CObject_kBool;
-    bytecode.value.as_bool =
-        FLAG_enable_interpreter || FLAG_use_bytecode_compiler;
-
     Dart_CObject package_config_uri;
     if (package_config != NULL) {
       package_config_uri.type = Dart_CObject_kString;
@@ -875,7 +862,6 @@
                                    &suppress_warnings,
                                    &enable_asserts,
                                    &experimental_flags_object,
-                                   &bytecode,
                                    &package_config_uri,
                                    &multiroot_filepaths_object,
                                    &multiroot_scheme_object,
diff --git a/runtime/vm/kernel_loader.cc b/runtime/vm/kernel_loader.cc
index 567f4e1..a64fef4 100644
--- a/runtime/vm/kernel_loader.cc
+++ b/runtime/vm/kernel_loader.cc
@@ -210,7 +210,6 @@
                        &active_class_,
                        /* finalize= */ false),
       inferred_type_metadata_helper_(&helper_, &constant_reader_),
-      bytecode_metadata_helper_(&helper_, &active_class_),
       external_name_class_(Class::Handle(Z)),
       external_name_field_(Field::Handle(Z)),
       potential_natives_(GrowableObjectArray::Handle(Z)),
@@ -450,8 +449,6 @@
     script = LoadScriptAt(index, uri_to_source_table);
     scripts.SetAt(index, script);
   }
-
-  bytecode_metadata_helper_.ReadBytecodeComponent();
 }
 
 KernelLoader::KernelLoader(const Script& script,
@@ -478,7 +475,6 @@
                        &active_class_,
                        /* finalize= */ false),
       inferred_type_metadata_helper_(&helper_, &constant_reader_),
-      bytecode_metadata_helper_(&helper_, &active_class_),
       external_name_class_(Class::Handle(Z)),
       external_name_field_(Field::Handle(Z)),
       potential_natives_(GrowableObjectArray::Handle(Z)),
@@ -653,64 +649,49 @@
   for (intptr_t i = 0; i < length; ++i) {
     library ^= potential_extension_libraries.At(i);
 
-    if (library.is_declared_in_bytecode()) {
-      const auto& imports = Array::Handle(Z, library.imports());
-      auto& ns = Namespace::Handle(Z);
-      auto& importee = Library::Handle(Z);
-      for (intptr_t j = 0; j < imports.Length(); ++j) {
-        ns ^= imports.At(j);
-        if (ns.IsNull()) continue;
-        importee = ns.library();
-        uri_path = importee.url();
-        if (uri_path.StartsWith(Symbols::DartExtensionScheme())) {
-          LoadNativeExtension(library, uri_path);
+    helper_.SetOffset(library.kernel_offset());
+
+    LibraryHelper library_helper(&helper_, kernel_binary_version_);
+    library_helper.ReadUntilExcluding(LibraryHelper::kAnnotations);
+
+    const intptr_t annotation_count = helper_.ReadListLength();
+    for (intptr_t j = 0; j < annotation_count; ++j) {
+      uri_path = String::null();
+
+      const intptr_t tag = helper_.PeekTag();
+      if (tag == kConstantExpression) {
+        helper_.ReadByte();      // Skip the tag.
+        helper_.ReadPosition();  // Skip fileOffset.
+        helper_.SkipDartType();  // Skip type.
+
+        // We have a candidate. Let's look if it's an instance of the
+        // ExternalName class.
+        const intptr_t constant_table_offset = helper_.ReadUInt();
+        if (constant_reader.IsInstanceConstant(constant_table_offset,
+                                               external_name_class_)) {
+          constant = constant_reader.ReadConstant(constant_table_offset);
+          ASSERT(constant.clazz() == external_name_class_.raw());
+          uri_path ^= constant.GetField(external_name_field_);
         }
+      } else if (tag == kConstructorInvocation ||
+                 tag == kConstConstructorInvocation) {
+        uri_path = DetectExternalNameCtor();
+      } else {
+        helper_.SkipExpression();
       }
-    } else {
-      helper_.SetOffset(library.kernel_offset());
 
-      LibraryHelper library_helper(&helper_, kernel_binary_version_);
-      library_helper.ReadUntilExcluding(LibraryHelper::kAnnotations);
+      if (uri_path.IsNull()) continue;
 
-      const intptr_t annotation_count = helper_.ReadListLength();
-      for (intptr_t j = 0; j < annotation_count; ++j) {
-        uri_path = String::null();
+      LoadNativeExtension(library, uri_path);
 
-        const intptr_t tag = helper_.PeekTag();
-        if (tag == kConstantExpression) {
-          helper_.ReadByte();      // Skip the tag.
-          helper_.ReadPosition();  // Skip fileOffset.
-          helper_.SkipDartType();  // Skip type.
-
-          // We have a candidate. Let's look if it's an instance of the
-          // ExternalName class.
-          const intptr_t constant_table_offset = helper_.ReadUInt();
-          if (constant_reader.IsInstanceConstant(constant_table_offset,
-                                                 external_name_class_)) {
-            constant = constant_reader.ReadConstant(constant_table_offset);
-            ASSERT(constant.clazz() == external_name_class_.raw());
-            uri_path ^= constant.GetField(external_name_field_);
-          }
-        } else if (tag == kConstructorInvocation ||
-                   tag == kConstConstructorInvocation) {
-          uri_path = DetectExternalNameCtor();
-        } else {
-          helper_.SkipExpression();
-        }
-
-        if (uri_path.IsNull()) continue;
-
-        LoadNativeExtension(library, uri_path);
-
-        // Create a dummy library and add it as an import to the current
-        // library. This allows later to discover and reload this native
-        // extension, e.g. when running from an app-jit snapshot.
-        // See Loader::ReloadNativeExtensions(...) which relies on
-        // Dart_GetImportsOfScheme('dart-ext').
-        const auto& native_library = Library::Handle(Library::New(uri_path));
-        library.AddImport(Namespace::Handle(Namespace::New(
-            native_library, Array::null_array(), Array::null_array())));
-      }
+      // Create a dummy library and add it as an import to the current
+      // library. This allows later to discover and reload this native
+      // extension, e.g. when running from an app-jit snapshot.
+      // See Loader::ReloadNativeExtensions(...) which relies on
+      // Dart_GetImportsOfScheme('dart-ext').
+      const auto& native_library = Library::Handle(Library::New(uri_path));
+      library.AddImport(Namespace::Handle(Namespace::New(
+          native_library, Array::null_array(), Array::null_array())));
     }
   }
 }
@@ -734,6 +715,7 @@
 }
 
 ObjectPtr KernelLoader::LoadProgram(bool process_pending_classes) {
+  SafepointWriteRwLocker ml(thread_, thread_->isolate_group()->program_lock());
   ASSERT(kernel_program_info_.constants() == Array::null());
 
   if (!program_->is_single_program()) {
@@ -744,12 +726,10 @@
 
   LongJumpScope jump;
   if (setjmp(*jump.Set()) == 0) {
-    if (!bytecode_metadata_helper_.ReadLibraries()) {
-      // Note that `problemsAsJson` on Component is implicitly skipped.
-      const intptr_t length = program_->library_count();
-      for (intptr_t i = 0; i < length; i++) {
-        LoadLibrary(i);
-      }
+    // Note that `problemsAsJson` on Component is implicitly skipped.
+    const intptr_t length = program_->library_count();
+    for (intptr_t i = 0; i < length; i++) {
+      LoadLibrary(i);
     }
 
     // Finalize still pending classes if requested.
@@ -779,7 +759,7 @@
       return LookupLibrary(main_library);
     }
 
-    return bytecode_metadata_helper_.GetMainLibrary();
+    return Library::null();
   }
 
   // Either class finalization failed or we caught a compile error.
@@ -790,10 +770,6 @@
 void KernelLoader::LoadLibrary(const Library& library) {
   ASSERT(!library.Loaded());
 
-  bytecode_metadata_helper_.ReadLibrary(library);
-  if (library.Loaded()) {
-    return;
-  }
   const auto& uri = String::Handle(Z, library.url());
   const intptr_t num_libraries = program_->library_count();
   for (intptr_t i = 0; i < num_libraries; ++i) {
@@ -839,13 +815,10 @@
   // Make the expression evaluation function have the right script,
   // kernel data and parent.
   const auto& eval_script = Script::Handle(Z, function.script());
-  auto& kernel_data = ExternalTypedData::Handle(Z);
-  intptr_t kernel_offset = -1;
-  if (!function.is_declared_in_bytecode()) {
-    ASSERT(!expression_evaluation_library_.IsNull());
-    kernel_data = expression_evaluation_library_.kernel_data();
-    kernel_offset = expression_evaluation_library_.kernel_offset();
-  }
+  ASSERT(!expression_evaluation_library_.IsNull());
+  auto& kernel_data = ExternalTypedData::Handle(
+      Z, expression_evaluation_library_.kernel_data());
+  intptr_t kernel_offset = expression_evaluation_library_.kernel_offset();
   function.SetKernelDataAndScript(eval_script, kernel_data, kernel_offset);
 
   function.set_owner(real_class);
@@ -923,10 +896,6 @@
                                            bool* is_empty_program,
                                            intptr_t* p_num_classes,
                                            intptr_t* p_num_procedures) {
-  if (bytecode_metadata_helper_.FindModifiedLibrariesForHotReload(
-          modified_libs, is_empty_program, p_num_classes, p_num_procedures)) {
-    return;
-  }
   intptr_t length = program_->library_count();
   *is_empty_program = *is_empty_program && (length == 0);
   bool collect_library_stats =
@@ -1039,13 +1008,17 @@
   Library& library =
       Library::Handle(Z, LookupLibrary(library_helper.canonical_name_));
 
-  // The Kernel library is external implies that it is already loaded.
-  ASSERT(!library_helper.IsExternal() || library.Loaded());
   if (library.Loaded()) return library.raw();
 
   library.set_is_nnbd(library_helper.IsNonNullableByDefault());
   const NNBDCompiledMode mode =
       library_helper.GetNonNullableByDefaultCompiledMode();
+  if (mode == NNBDCompiledMode::kInvalid) {
+    H.ReportError(
+        "Library '%s' was compiled in an unsupported mixed mode between sound "
+        "null safety and not sound null safety.",
+        String::Handle(library.url()).ToCString());
+  }
   if (!I->null_safety() && mode == NNBDCompiledMode::kStrong) {
     H.ReportError(
         "Library '%s' was compiled with sound null safety (in strong mode) and "
@@ -1053,8 +1026,7 @@
         "requires --sound-null-safety option at runtime",
         String::Handle(library.url()).ToCString());
   }
-  if (I->null_safety() && (mode == NNBDCompiledMode::kWeak ||
-                           mode == NNBDCompiledMode::kDisabled)) {
+  if (I->null_safety() && (mode == NNBDCompiledMode::kWeak)) {
     H.ReportError(
         "Library '%s' was compiled without sound null safety (in weak mode) "
         "and it "
@@ -1148,7 +1120,7 @@
   if (FLAG_enable_mirrors && annotation_count > 0) {
     ASSERT(annotations_kernel_offset > 0);
     library.AddLibraryMetadata(toplevel_class, TokenPosition::kNoSource,
-                               annotations_kernel_offset, 0);
+                               annotations_kernel_offset);
   }
 
   if (register_class) {
@@ -1269,8 +1241,7 @@
     }
     if ((FLAG_enable_mirrors || has_pragma_annotation) &&
         annotation_count > 0) {
-      library.AddFieldMetadata(field, TokenPosition::kNoSource, field_offset,
-                               0);
+      library.AddFieldMetadata(field, TokenPosition::kNoSource, field_offset);
     }
     fields_.Add(&field);
   }
@@ -1535,7 +1506,7 @@
   if ((FLAG_enable_mirrors || has_pragma_annotation) && annotation_count > 0) {
     library.AddClassMetadata(*out_class, toplevel_class,
                              TokenPosition::kNoSource,
-                             class_offset - correction_offset_, 0);
+                             class_offset - correction_offset_);
   }
 
   // We do not register expression evaluation classes with the VM:
@@ -1642,8 +1613,7 @@
       }
       if ((FLAG_enable_mirrors || has_pragma_annotation) &&
           annotation_count > 0) {
-        library.AddFieldMetadata(field, TokenPosition::kNoSource, field_offset,
-                                 0);
+        library.AddFieldMetadata(field, TokenPosition::kNoSource, field_offset);
       }
       fields_.Add(&field);
     }
@@ -1742,7 +1712,7 @@
     if ((FLAG_enable_mirrors || has_pragma_annotation) &&
         annotation_count > 0) {
       library.AddFunctionMetadata(function, TokenPosition::kNoSource,
-                                  constructor_offset, 0);
+                                  constructor_offset);
     }
   }
 
@@ -1781,7 +1751,6 @@
 }
 
 void KernelLoader::FinishLoading(const Class& klass) {
-  ASSERT(!klass.is_declared_in_bytecode());
   ASSERT(klass.IsTopLevel() || (klass.kernel_offset() > 0));
 
   Zone* zone = Thread::Current()->zone();
@@ -2019,29 +1988,8 @@
   ASSERT(function_node_tag == kSomething);
   FunctionNodeHelper function_node_helper(&helper_);
   function_node_helper.ReadUntilIncluding(FunctionNodeHelper::kDartAsyncMarker);
-
-  const bool is_async_await_completer_owner =
-      Symbols::_AsyncAwaitCompleter().Equals(
-          String::Handle(Z, owner.ScrubbedName()));
-
-  // _AsyncAwaitCompleter.future should be made non-debuggable, otherwise
-  // stepping out of async methods will keep hitting breakpoint resulting in
-  // infinite loop.
-  const bool is_async_await_completer_future =
-      is_async_await_completer_owner &&
-      Symbols::CompleterGetFuture().Equals(name);
   function.set_is_debuggable(function_node_helper.dart_async_marker_ ==
-                                 FunctionNodeHelper::kSync &&
-                             !is_async_await_completer_future);
-
-  // _AsyncAwaitCompleter.start should be made non-visible in stack traces,
-  // since it is an implementation detail of our await/async desugaring.
-  if (is_async_await_completer_owner &&
-      Symbols::_AsyncAwaitStart().Equals(name)) {
-    function.set_is_visible(!FLAG_causal_async_stacks &&
-                            !FLAG_lazy_async_stacks);
-  }
-
+                             FunctionNodeHelper::kSync);
   switch (function_node_helper.dart_async_marker_) {
     case FunctionNodeHelper::kSyncStar:
       function.set_modifier(FunctionLayout::kSyncGen);
@@ -2089,7 +2037,7 @@
 
   if (annotation_count > 0) {
     library.AddFunctionMetadata(function, TokenPosition::kNoSource,
-                                procedure_offset, 0);
+                                procedure_offset);
   }
 
   if (has_pragma_annotation) {
@@ -2227,7 +2175,8 @@
   }
   ASSERT(field.NeedsGetter());
 
-  const String& getter_name = H.DartGetterName(field_helper->canonical_name_);
+  const String& getter_name =
+      H.DartGetterName(field_helper->canonical_name_getter_);
   const Object& script_class =
       ClassForScriptAt(klass, field_helper->source_uri_index_);
   Function& getter = Function::ZoneHandle(
@@ -2260,7 +2209,8 @@
   if (field.NeedsSetter()) {
     // Only static fields can be const.
     ASSERT(!field_helper->IsConst());
-    const String& setter_name = H.DartSetterName(field_helper->canonical_name_);
+    const String& setter_name =
+        H.DartSetterName(field_helper->canonical_name_setter_);
     Function& setter = Function::ZoneHandle(
         Z, Function::New(setter_name, FunctionLayout::kImplicitSetter,
                          field_helper->IsStatic(),
@@ -2412,11 +2362,9 @@
   const PatchClass& initializer_owner =
       PatchClass::Handle(zone, PatchClass::New(field_owner, script));
   const Library& lib = Library::Handle(zone, field_owner.library());
-  if (!lib.is_declared_in_bytecode()) {
-    initializer_owner.set_library_kernel_data(
-        ExternalTypedData::Handle(zone, lib.kernel_data()));
-    initializer_owner.set_library_kernel_offset(lib.kernel_offset());
-  }
+  initializer_owner.set_library_kernel_data(
+      ExternalTypedData::Handle(zone, lib.kernel_data()));
+  initializer_owner.set_library_kernel_offset(lib.kernel_offset());
 
   // Create a static initializer.
   const Function& initializer_fun = Function::Handle(
@@ -2443,7 +2391,7 @@
   initializer_fun.set_token_pos(field.token_pos());
   initializer_fun.set_end_token_pos(field.end_token_pos());
   initializer_fun.set_accessor_field(field);
-  initializer_fun.InheritBinaryDeclarationFrom(field);
+  initializer_fun.InheritKernelOffsetFrom(field);
   initializer_fun.set_is_extension_member(field.is_extension_member());
   field.SetInitializerFunction(initializer_fun);
   return initializer_fun.raw();
diff --git a/runtime/vm/kernel_loader.h b/runtime/vm/kernel_loader.h
index 7826867..1129956 100644
--- a/runtime/vm/kernel_loader.h
+++ b/runtime/vm/kernel_loader.h
@@ -8,7 +8,6 @@
 #if !defined(DART_PRECOMPILED_RUNTIME)
 
 #include "vm/bit_vector.h"
-#include "vm/compiler/frontend/bytecode_reader.h"
 #include "vm/compiler/frontend/constant_reader.h"
 #include "vm/compiler/frontend/kernel_translation_helper.h"
 #include "vm/hash_map.h"
@@ -410,7 +409,6 @@
   ConstantReader constant_reader_;
   TypeTranslator type_translator_;
   InferredTypeMetadataHelper inferred_type_metadata_helper_;
-  BytecodeMetadataHelper bytecode_metadata_helper_;
 
   Class& external_name_class_;
   Field& external_name_field_;
diff --git a/runtime/vm/lockers.h b/runtime/vm/lockers.h
index 4c46acb..94a8070 100644
--- a/runtime/vm/lockers.h
+++ b/runtime/vm/lockers.h
@@ -326,6 +326,7 @@
     if (IsCurrentThreadWriter()) {
       return true;
     }
+    MutexLocker ml(&reader_ids_mutex_);
     for (intptr_t i = readers_ids_.length() - 1; i >= 0; i--) {
       if (readers_ids_.At(i) == id) {
         return true;
@@ -333,7 +334,7 @@
     }
     return false;
   }
-#endif // defined(DEBUG)
+#endif  // defined(DEBUG)
 
   bool IsCurrentThreadWriter() {
     return writer_id_ == OSThread::GetCurrentThreadId();
@@ -351,11 +352,14 @@
     if (IsCurrentThreadWriter()) {
       return false;
     }
-    while (state_ == -1) {
+    while (state_ < 0) {
       ml.Wait();
     }
 #if defined(DEBUG)
-    readers_ids_.Add(OSThread::GetCurrentThreadId());
+    {
+      MutexLocker ml(&reader_ids_mutex_);
+      readers_ids_.Add(OSThread::GetCurrentThreadId());
+    }
 #endif
     ++state_;
     return true;
@@ -364,16 +368,19 @@
     SafepointMonitorLocker ml(&monitor_);
     ASSERT(state_ > 0);
 #if defined(DEBUG)
-    intptr_t i = readers_ids_.length() - 1;
-    ThreadId id = OSThread::GetCurrentThreadId();
-    while (i >= 0) {
-      if (readers_ids_.At(i) == id) {
-        readers_ids_.RemoveAt(i);
-        break;
+    {
+      MutexLocker ml(&reader_ids_mutex_);
+      intptr_t i = readers_ids_.length() - 1;
+      ThreadId id = OSThread::GetCurrentThreadId();
+      while (i >= 0) {
+        if (readers_ids_.At(i) == id) {
+          readers_ids_.RemoveAt(i);
+          break;
+        }
+        i--;
       }
-      i--;
+      ASSERT(i >= 0);
     }
-    ASSERT(i >= 0);
 #endif
     if (--state_ == 0) {
       ml.NotifyAll();
@@ -406,10 +413,11 @@
   Monitor monitor_;
   // [state_] > 0  : The lock is held by multiple readers.
   // [state_] == 0 : The lock is free (no readers/writers).
-  // [state_] == -1: The lock is held by a single writer.
+  // [state_] < 0  : The lock is held by a single writer (possibly nested).
   intptr_t state_ = 0;
 
 #if defined(DEBUG)
+  Mutex reader_ids_mutex_;
   MallocGrowableArray<ThreadId> readers_ids_;
 #endif
   ThreadId writer_id_ = OSThread::kInvalidThreadId;
diff --git a/runtime/vm/native_api_impl.cc b/runtime/vm/native_api_impl.cc
index 388d6cb..1c7c43a 100644
--- a/runtime/vm/native_api_impl.cc
+++ b/runtime/vm/native_api_impl.cc
@@ -207,26 +207,6 @@
 #endif  // defined(DART_PRECOMPILED_RUNTIME)
 }
 
-DART_EXPORT Dart_Handle Dart_ReadAllBytecode() {
-#if defined(DART_PRECOMPILED_RUNTIME)
-  return Api::NewError("%s: Cannot read bytecode on an AOT runtime.",
-                       CURRENT_FUNC);
-#else
-  DARTSCOPE(Thread::Current());
-  API_TIMELINE_DURATION(T);
-  Dart_Handle result = Api::CheckAndFinalizePendingClasses(T);
-  if (Api::IsError(result)) {
-    return result;
-  }
-  CHECK_CALLBACK_STATE(T);
-  const Error& error = Error::Handle(T->zone(), Library::ReadAllBytecode());
-  if (!error.IsNull()) {
-    return Api::NewHandle(T, error.raw());
-  }
-  return Api::Success();
-#endif  // defined(DART_PRECOMPILED_RUNTIME)
-}
-
 DART_EXPORT Dart_Handle Dart_FinalizeAllClasses() {
 #if defined(DART_PRECOMPILED_RUNTIME)
   return Api::NewError("%s: All classes are already finalized in AOT runtime.",
diff --git a/runtime/vm/native_arguments.h b/runtime/vm/native_arguments.h
index 18fdad6..b942e80 100644
--- a/runtime/vm/native_arguments.h
+++ b/runtime/vm/native_arguments.h
@@ -234,10 +234,9 @@
       : public BitField<intptr_t, bool, kReverseArgOrderBit, 1> {};
   friend class Api;
   friend class NativeEntry;
-  friend class Interpreter;
   friend class Simulator;
 
-  // Allow simulator and interpreter to create NativeArguments in reverse order
+  // Allow simulator to create NativeArguments in reverse order
   // on the stack.
   NativeArguments(Thread* thread,
                   int argc_tag,
diff --git a/runtime/vm/native_entry.cc b/runtime/vm/native_entry.cc
index 7a13118..445ccf0 100644
--- a/runtime/vm/native_entry.cc
+++ b/runtime/vm/native_entry.cc
@@ -273,16 +273,8 @@
                                StackFrameIterator::kNoCrossThreadIteration);
     StackFrame* caller_frame = iterator.NextFrame();
 
-    Code& code = Code::Handle(zone);
-    Bytecode& bytecode = Bytecode::Handle(zone);
-    Function& func = Function::Handle(zone);
-    if (caller_frame->is_interpreted()) {
-      bytecode = caller_frame->LookupDartBytecode();
-      func = bytecode.function();
-    } else {
-      code = caller_frame->LookupDartCode();
-      func = code.function();
-    }
+    Code& code = Code::Handle(zone, caller_frame->LookupDartCode());
+    Function& func = Function::Handle(zone, code.function());
 
     if (FLAG_trace_natives) {
       THR_Print("Resolving native target for %s\n", func.ToCString());
@@ -295,63 +287,29 @@
 
 #if defined(DEBUG)
     NativeFunction current_function = NULL;
-    if (caller_frame->is_interpreted()) {
-#if !defined(DART_PRECOMPILED_RUNTIME)
-      ASSERT(FLAG_enable_interpreter);
-      NativeFunctionWrapper current_trampoline = KBCPatcher::GetNativeCallAt(
-          caller_frame->pc(), bytecode, &current_function);
-      ASSERT(current_function ==
-             reinterpret_cast<NativeFunction>(LinkNativeCall));
-      ASSERT(current_trampoline == &BootstrapNativeCallWrapper ||
-             current_trampoline == &AutoScopeNativeCallWrapper ||
-             current_trampoline == &NoScopeNativeCallWrapper);
-#else
-      UNREACHABLE();
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-    } else {
-      const Code& current_trampoline =
-          Code::Handle(zone, CodePatcher::GetNativeCallAt(
-                                 caller_frame->pc(), code, &current_function));
-      // Some other isolate(with code being shared in AOT) might have updated
-      // target function/trampoline already.
-      ASSERT(current_function ==
-                 reinterpret_cast<NativeFunction>(LinkNativeCall) ||
-             current_function == target_function);
-      ASSERT(current_trampoline.raw() ==
-                 StubCode::CallBootstrapNative().raw() ||
-             current_function == target_function);
-    }
+    const Code& current_trampoline =
+        Code::Handle(zone, CodePatcher::GetNativeCallAt(
+                               caller_frame->pc(), code, &current_function));
+    // Some other isolate(with code being shared in AOT) might have updated
+    // target function/trampoline already.
+    ASSERT(current_function ==
+               reinterpret_cast<NativeFunction>(LinkNativeCall) ||
+           current_function == target_function);
+    ASSERT(current_trampoline.raw() == StubCode::CallBootstrapNative().raw() ||
+           current_function == target_function);
 #endif
 
     NativeFunction patch_target_function = target_function;
-    if (caller_frame->is_interpreted()) {
-#if !defined(DART_PRECOMPILED_RUNTIME)
-      ASSERT(FLAG_enable_interpreter);
-      NativeFunctionWrapper trampoline;
-      if (is_bootstrap_native) {
-        trampoline = &BootstrapNativeCallWrapper;
-      } else if (is_auto_scope) {
-        trampoline = &AutoScopeNativeCallWrapper;
-      } else {
-        trampoline = &NoScopeNativeCallWrapper;
-      }
-      KBCPatcher::PatchNativeCallAt(caller_frame->pc(), bytecode,
-                                    patch_target_function, trampoline);
-#else
-      UNREACHABLE();
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
+    Code& trampoline = Code::Handle(zone);
+    if (is_bootstrap_native) {
+      trampoline = StubCode::CallBootstrapNative().raw();
+    } else if (is_auto_scope) {
+      trampoline = StubCode::CallAutoScopeNative().raw();
     } else {
-      Code& trampoline = Code::Handle(zone);
-      if (is_bootstrap_native) {
-        trampoline = StubCode::CallBootstrapNative().raw();
-      } else if (is_auto_scope) {
-        trampoline = StubCode::CallAutoScopeNative().raw();
-      } else {
-        trampoline = StubCode::CallNoScopeNative().raw();
-      }
-      CodePatcher::PatchNativeCallAt(caller_frame->pc(), code,
-                                     patch_target_function, trampoline);
+      trampoline = StubCode::CallNoScopeNative().raw();
     }
+    CodePatcher::PatchNativeCallAt(caller_frame->pc(), code,
+                                   patch_target_function, trampoline);
 
     if (FLAG_trace_natives) {
       THR_Print("    -> %p (%s)\n", target_function,
diff --git a/runtime/vm/native_entry.h b/runtime/vm/native_entry.h
index fae4261..2be609e 100644
--- a/runtime/vm/native_entry.h
+++ b/runtime/vm/native_entry.h
@@ -171,7 +171,6 @@
 
   const TypedData& data_;
 
-  friend class Interpreter;
   friend class ObjectPoolSerializationCluster;
   DISALLOW_COPY_AND_ASSIGN(NativeEntryData);
 };
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index bbbca69..82605a8 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -7,6 +7,7 @@
 #include <memory>
 
 #include "include/dart_api.h"
+#include "lib/stacktrace.h"
 #include "platform/assert.h"
 #include "platform/text_buffer.h"
 #include "platform/unaligned.h"
@@ -19,7 +20,6 @@
 #include "vm/code_descriptors.h"
 #include "vm/code_observers.h"
 #include "vm/compiler/assembler/disassembler.h"
-#include "vm/compiler/assembler/disassembler_kbc.h"
 #include "vm/compiler/jit/compiler.h"
 #include "vm/compiler/runtime_api.h"
 #include "vm/cpu.h"
@@ -66,8 +66,6 @@
 #include "vm/compiler/assembler/assembler.h"
 #include "vm/compiler/backend/code_statistics.h"
 #include "vm/compiler/compiler_state.h"
-#include "vm/compiler/frontend/bytecode_fingerprints.h"
-#include "vm/compiler/frontend/bytecode_reader.h"
 #include "vm/compiler/frontend/kernel_fingerprints.h"
 #include "vm/compiler/frontend/kernel_translation_helper.h"
 #include "vm/compiler/intrinsifier.h"
@@ -156,7 +154,6 @@
 ClassPtr Object::namespace_class_ = static_cast<ClassPtr>(RAW_NULL);
 ClassPtr Object::kernel_program_info_class_ = static_cast<ClassPtr>(RAW_NULL);
 ClassPtr Object::code_class_ = static_cast<ClassPtr>(RAW_NULL);
-ClassPtr Object::bytecode_class_ = static_cast<ClassPtr>(RAW_NULL);
 ClassPtr Object::instructions_class_ = static_cast<ClassPtr>(RAW_NULL);
 ClassPtr Object::instructions_section_class_ = static_cast<ClassPtr>(RAW_NULL);
 ClassPtr Object::object_pool_class_ = static_cast<ClassPtr>(RAW_NULL);
@@ -167,7 +164,6 @@
 ClassPtr Object::exception_handlers_class_ = static_cast<ClassPtr>(RAW_NULL);
 ClassPtr Object::context_class_ = static_cast<ClassPtr>(RAW_NULL);
 ClassPtr Object::context_scope_class_ = static_cast<ClassPtr>(RAW_NULL);
-ClassPtr Object::dyncalltypecheck_class_ = static_cast<ClassPtr>(RAW_NULL);
 ClassPtr Object::singletargetcache_class_ = static_cast<ClassPtr>(RAW_NULL);
 ClassPtr Object::unlinkedcall_class_ = static_cast<ClassPtr>(RAW_NULL);
 ClassPtr Object::monomorphicsmiablecall_class_ =
@@ -518,21 +514,6 @@
   return '\0';
 }
 
-static BytecodePtr CreateVMInternalBytecode(KernelBytecode::Opcode opcode) {
-  const KBCInstr* instructions = nullptr;
-  intptr_t instructions_size = 0;
-
-  KernelBytecode::GetVMInternalBytecodeInstructions(opcode, &instructions,
-                                                    &instructions_size);
-
-  const auto& bytecode = Bytecode::Handle(
-      Bytecode::New(reinterpret_cast<uword>(instructions), instructions_size,
-                    -1, Object::empty_object_pool()));
-  bytecode.set_pc_descriptors(Object::empty_descriptors());
-  bytecode.set_exception_handlers(Object::empty_exception_handlers());
-  return bytecode.raw();
-}
-
 void Object::InitNullAndBool(Isolate* isolate) {
   // Should only be run by the vm isolate.
   ASSERT(isolate == Dart::vm_isolate());
@@ -839,9 +820,6 @@
   cls = Class::New<Code, RTN::Code>(isolate);
   code_class_ = cls.raw();
 
-  cls = Class::New<Bytecode, RTN::Bytecode>(isolate);
-  bytecode_class_ = cls.raw();
-
   cls = Class::New<Instructions, RTN::Instructions>(isolate);
   instructions_class_ = cls.raw();
 
@@ -872,9 +850,6 @@
   cls = Class::New<ContextScope, RTN::ContextScope>(isolate);
   context_scope_class_ = cls.raw();
 
-  cls = Class::New<ParameterTypeCheck, RTN::ParameterTypeCheck>(isolate);
-  dyncalltypecheck_class_ = cls.raw();
-
   cls = Class::New<SingleTargetCache, RTN::SingleTargetCache>(isolate);
   singletargetcache_class_ = cls.raw();
 
@@ -1115,8 +1090,12 @@
   // in the vm isolate. See special handling in Class::SuperClass().
   cls = type_arguments_class_;
   cls.set_interfaces(Object::empty_array());
-  cls.SetFields(Object::empty_array());
-  cls.SetFunctions(Object::empty_array());
+  {
+    Thread* thread = Thread::Current();
+    SafepointWriteRwLocker ml(thread, thread->isolate_group()->program_lock());
+    cls.SetFields(Object::empty_array());
+    cls.SetFunctions(Object::empty_array());
+  }
 
   cls = Class::New<Bool, RTN::Bool>(isolate);
   isolate->object_store()->set_bool_class(cls);
@@ -1155,30 +1134,6 @@
   // needs to be created earlier as VM isolate snapshot reader references it
   // before Object::FinalizeVMIsolate.
 
-  *implicit_getter_bytecode_ =
-      CreateVMInternalBytecode(KernelBytecode::kVMInternal_ImplicitGetter);
-
-  *implicit_setter_bytecode_ =
-      CreateVMInternalBytecode(KernelBytecode::kVMInternal_ImplicitSetter);
-
-  *implicit_static_getter_bytecode_ = CreateVMInternalBytecode(
-      KernelBytecode::kVMInternal_ImplicitStaticGetter);
-
-  *method_extractor_bytecode_ =
-      CreateVMInternalBytecode(KernelBytecode::kVMInternal_MethodExtractor);
-
-  *invoke_closure_bytecode_ =
-      CreateVMInternalBytecode(KernelBytecode::kVMInternal_InvokeClosure);
-
-  *invoke_field_bytecode_ =
-      CreateVMInternalBytecode(KernelBytecode::kVMInternal_InvokeField);
-
-  *nsm_dispatcher_bytecode_ = CreateVMInternalBytecode(
-      KernelBytecode::kVMInternal_NoSuchMethodDispatcher);
-
-  *dynamic_invocation_forwarder_bytecode_ = CreateVMInternalBytecode(
-      KernelBytecode::kVMInternal_ForwardDynamicInvocation);
-
   // Some thread fields need to be reinitialized as null constants have not been
   // initialized until now.
   Thread* thr = Thread::Current();
@@ -1203,6 +1158,8 @@
   ASSERT(empty_array_->IsArray());
   ASSERT(!zero_array_->IsSmi());
   ASSERT(zero_array_->IsArray());
+  ASSERT(!empty_type_arguments_->IsSmi());
+  ASSERT(empty_type_arguments_->IsTypeArguments());
   ASSERT(!empty_context_scope_->IsSmi());
   ASSERT(empty_context_scope_->IsContextScope());
   ASSERT(!empty_compressed_stackmaps_->IsSmi());
@@ -1245,22 +1202,6 @@
   ASSERT(extractor_parameter_types_->IsArray());
   ASSERT(!extractor_parameter_names_->IsSmi());
   ASSERT(extractor_parameter_names_->IsArray());
-  ASSERT(!implicit_getter_bytecode_->IsSmi());
-  ASSERT(implicit_getter_bytecode_->IsBytecode());
-  ASSERT(!implicit_setter_bytecode_->IsSmi());
-  ASSERT(implicit_setter_bytecode_->IsBytecode());
-  ASSERT(!implicit_static_getter_bytecode_->IsSmi());
-  ASSERT(implicit_static_getter_bytecode_->IsBytecode());
-  ASSERT(!method_extractor_bytecode_->IsSmi());
-  ASSERT(method_extractor_bytecode_->IsBytecode());
-  ASSERT(!invoke_closure_bytecode_->IsSmi());
-  ASSERT(invoke_closure_bytecode_->IsBytecode());
-  ASSERT(!invoke_field_bytecode_->IsSmi());
-  ASSERT(invoke_field_bytecode_->IsBytecode());
-  ASSERT(!nsm_dispatcher_bytecode_->IsSmi());
-  ASSERT(nsm_dispatcher_bytecode_->IsBytecode());
-  ASSERT(!dynamic_invocation_forwarder_bytecode_->IsSmi());
-  ASSERT(dynamic_invocation_forwarder_bytecode_->IsBytecode());
 }
 
 void Object::FinishInit(Isolate* isolate) {
@@ -1296,7 +1237,6 @@
   namespace_class_ = static_cast<ClassPtr>(RAW_NULL);
   kernel_program_info_class_ = static_cast<ClassPtr>(RAW_NULL);
   code_class_ = static_cast<ClassPtr>(RAW_NULL);
-  bytecode_class_ = static_cast<ClassPtr>(RAW_NULL);
   instructions_class_ = static_cast<ClassPtr>(RAW_NULL);
   instructions_section_class_ = static_cast<ClassPtr>(RAW_NULL);
   object_pool_class_ = static_cast<ClassPtr>(RAW_NULL);
@@ -1307,7 +1247,6 @@
   exception_handlers_class_ = static_cast<ClassPtr>(RAW_NULL);
   context_class_ = static_cast<ClassPtr>(RAW_NULL);
   context_scope_class_ = static_cast<ClassPtr>(RAW_NULL);
-  dyncalltypecheck_class_ = static_cast<ClassPtr>(RAW_NULL);
   singletargetcache_class_ = static_cast<ClassPtr>(RAW_NULL);
   unlinkedcall_class_ = static_cast<ClassPtr>(RAW_NULL);
   monomorphicsmiablecall_class_ = static_cast<ClassPtr>(RAW_NULL);
@@ -1399,7 +1338,6 @@
   SET_CLASS_NAME(namespace, Namespace);
   SET_CLASS_NAME(kernel_program_info, KernelProgramInfo);
   SET_CLASS_NAME(code, Code);
-  SET_CLASS_NAME(bytecode, Bytecode);
   SET_CLASS_NAME(instructions, Instructions);
   SET_CLASS_NAME(instructions_section, InstructionsSection);
   SET_CLASS_NAME(object_pool, ObjectPool);
@@ -1410,7 +1348,6 @@
   SET_CLASS_NAME(exception_handlers, ExceptionHandlers);
   SET_CLASS_NAME(context, Context);
   SET_CLASS_NAME(context_scope, ContextScope);
-  SET_CLASS_NAME(dyncalltypecheck, ParameterTypeCheck);
   SET_CLASS_NAME(singletargetcache, SingleTargetCache);
   SET_CLASS_NAME(unlinkedcall, UnlinkedCall);
   SET_CLASS_NAME(monomorphicsmiablecall, MonomorphicSmiableCall);
@@ -1654,6 +1591,7 @@
     // This will initialize isolate group object_store, shared by all isolates
     // running in the isolate group.
     ObjectStore* object_store = isolate->object_store();
+    SafepointWriteRwLocker ml(thread, thread->isolate_group()->program_lock());
 
     Class& cls = Class::Handle(zone);
     Type& type = Type::Handle(zone);
@@ -2662,16 +2600,19 @@
 
   uword address = heap->Allocate(size, space);
   if (UNLIKELY(address == 0)) {
-    if (thread->top_exit_frame_info() != 0) {
+    // SuspendLongJumpScope during Dart entry ensures that if a longjmp base is
+    // available, it is the innermost error handler, so check for a longjmp base
+    // before checking for an exit frame.
+    if (thread->long_jump_base() != nullptr) {
+      Report::LongJump(Object::out_of_memory_error());
+      UNREACHABLE();
+    } else if (thread->top_exit_frame_info() != 0) {
       // Use the preallocated out of memory exception to avoid calling
       // into dart code or allocating any code.
       const Instance& exception =
           Instance::Handle(thread->isolate()->object_store()->out_of_memory());
       Exceptions::Throw(thread, exception);
       UNREACHABLE();
-    } else if (thread->long_jump_base() != nullptr) {
-      Report::LongJump(Object::out_of_memory_error());
-      UNREACHABLE();
     } else {
       // Nowhere to propagate an exception to.
       OUT_OF_MEMORY();
@@ -2838,7 +2779,7 @@
   const Type& type = Type::Handle(
       Type::New(*this, Object::null_type_arguments(), TokenPosition::kNoSource,
                 Nullability::kNonNullable));
-  return ClassFinalizer::FinalizeType(*this, type);
+  return ClassFinalizer::FinalizeType(type);
 }
 
 template <class FakeObject, class TargetFakeObject>
@@ -2880,8 +2821,7 @@
     // references, but do not recompute size.
     result.set_is_prefinalized();
   }
-  NOT_IN_PRECOMPILED(result.set_is_declared_in_bytecode(false));
-  NOT_IN_PRECOMPILED(result.set_binary_declaration_offset(0));
+  NOT_IN_PRECOMPILED(result.set_kernel_offset(0));
   result.InitEmptyFields();
   if (register_class) {
     isolate->class_table()->Register(result);
@@ -2906,7 +2846,7 @@
 }
 
 void Class::set_has_pragma(bool value) const {
-  set_state_bits(HasPragmaBit::update(value, raw_ptr()->state_bits_));
+  set_state_bits(HasPragmaBit::update(value, state_bits()));
 }
 
 // Initialize class fields of type Array with empty array.
@@ -2917,10 +2857,9 @@
   }
   StorePointer(&raw_ptr()->interfaces_, Object::empty_array().raw());
   StorePointer(&raw_ptr()->constants_, Object::null_array().raw());
-  StorePointer(&raw_ptr()->functions_, Object::empty_array().raw());
-  StorePointer(&raw_ptr()->fields_, Object::empty_array().raw());
-  StorePointer(&raw_ptr()->invocation_dispatcher_cache_,
-               Object::empty_array().raw());
+  set_functions(Object::empty_array());
+  set_fields(Object::empty_array());
+  set_invocation_dispatcher_cache(Object::empty_array());
 }
 
 ArrayPtr Class::OffsetToFieldMap(bool original_classes) const {
@@ -3000,9 +2939,13 @@
 typedef UnorderedHashSet<ClassFunctionsTraits> ClassFunctionsSet;
 
 void Class::SetFunctions(const Array& value) const {
-  ASSERT(Thread::Current()->IsMutatorThread());
+#if defined(DEBUG)
+  Thread* thread = Thread::Current();
+  ASSERT(thread->IsMutatorThread());
+  ASSERT(thread->isolate_group()->program_lock()->IsCurrentThreadWriter());
+#endif
   ASSERT(!value.IsNull());
-  StorePointer(&raw_ptr()->functions_, value.raw());
+  set_functions(value);
   const intptr_t len = value.Length();
   if (len >= kFunctionLookupHashTreshold) {
     ClassFunctionsSet set(HashTables::New<ClassFunctionsSet>(len, Heap::kOld));
@@ -3020,17 +2963,21 @@
 }
 
 void Class::AddFunction(const Function& function) const {
-  ASSERT(Thread::Current()->IsMutatorThread());
+#if defined(DEBUG)
+  Thread* thread = Thread::Current();
+  ASSERT(thread->IsMutatorThread());
+  ASSERT(thread->isolate_group()->program_lock()->IsCurrentThreadWriter());
+#endif
   const Array& arr = Array::Handle(functions());
-  const Array& new_arr =
+  const Array& new_array =
       Array::Handle(Array::Grow(arr, arr.Length() + 1, Heap::kOld));
-  new_arr.SetAt(arr.Length(), function);
-  StorePointer(&raw_ptr()->functions_, new_arr.raw());
+  new_array.SetAt(arr.Length(), function);
+  set_functions(new_array);
   // Add to hash table, if any.
-  const intptr_t new_len = new_arr.Length();
+  const intptr_t new_len = new_array.Length();
   if (new_len == kFunctionLookupHashTreshold) {
     // Transition to using hash table.
-    SetFunctions(new_arr);
+    SetFunctions(new_array);
   } else if (new_len > kFunctionLookupHashTreshold) {
     ClassFunctionsSet set(raw_ptr()->functions_hash_table_);
     set.Insert(function);
@@ -3038,22 +2985,8 @@
   }
 }
 
-void Class::RemoveFunction(const Function& function) const {
-  ASSERT(Thread::Current()->IsMutatorThread());
-  const Array& arr = Array::Handle(functions());
-  StorePointer(&raw_ptr()->functions_, Object::empty_array().raw());
-  StorePointer(&raw_ptr()->functions_hash_table_, Array::null());
-  Function& entry = Function::Handle();
-  for (intptr_t i = 0; i < arr.Length(); i++) {
-    entry ^= arr.At(i);
-    if (function.raw() != entry.raw()) {
-      AddFunction(entry);
-    }
-  }
-}
-
 FunctionPtr Class::FunctionFromIndex(intptr_t idx) const {
-  const Array& funcs = Array::Handle(functions());
+  const Array& funcs = Array::Handle(current_functions());
   if ((idx < 0) || (idx >= funcs.Length())) {
     return Function::null();
   }
@@ -3064,7 +2997,7 @@
 }
 
 FunctionPtr Class::ImplicitClosureFunctionFromIndex(intptr_t idx) const {
-  const Array& funcs = Array::Handle(functions());
+  const Array& funcs = Array::Handle(current_functions());
   if ((idx < 0) || (idx >= funcs.Length())) {
     return Function::null();
   }
@@ -3089,7 +3022,7 @@
   REUSABLE_FUNCTION_HANDLESCOPE(thread);
   Array& funcs = thread->ArrayHandle();
   Function& function = thread->FunctionHandle();
-  funcs = functions();
+  funcs = current_functions();
   ASSERT(!funcs.IsNull());
   Function& implicit_closure = Function::Handle(thread->zone());
   const intptr_t len = funcs.Length();
@@ -3155,7 +3088,8 @@
 }
 
 void Class::set_state_bits(intptr_t bits) const {
-  StoreNonPointer(&raw_ptr()->state_bits_, static_cast<uint32_t>(bits));
+  StoreNonPointer<uint32_t, uint32_t, std::memory_order_release>(
+      &raw_ptr()->state_bits_, static_cast<uint32_t>(bits));
 }
 
 void Class::set_library(const Library& value) const {
@@ -3164,10 +3098,31 @@
 
 void Class::set_type_parameters(const TypeArguments& value) const {
   ASSERT((num_type_arguments() == kUnknownNumTypeArguments) ||
-         is_declared_in_bytecode() || is_prefinalized());
+         is_prefinalized());
   StorePointer(&raw_ptr()->type_parameters_, value.raw());
 }
 
+void Class::set_functions(const Array& value) const {
+  // Ensure all writes to the [Function]s are visible by the time the array
+  // is visible.
+  StorePointer<ArrayPtr, std::memory_order_release>(&raw_ptr()->functions_,
+                                                    value.raw());
+}
+
+void Class::set_fields(const Array& value) const {
+  // Ensure all writes to the [Field]s are visible by the time the array
+  // is visible.
+  StorePointer<ArrayPtr, std::memory_order_release>(&raw_ptr()->fields_,
+                                                    value.raw());
+}
+
+void Class::set_invocation_dispatcher_cache(const Array& cache) const {
+  // Ensure all writes to the cache are visible by the time the array
+  // is visible.
+  StorePointer<ArrayPtr, std::memory_order_release>(
+      &raw_ptr()->invocation_dispatcher_cache_, cache.raw());
+}
+
 intptr_t Class::NumTypeParameters(Thread* thread) const {
   if (!is_declaration_loaded()) {
     ASSERT(is_prefinalized());
@@ -3270,6 +3225,33 @@
   return num_type_args;
 }
 
+static TypeArgumentsPtr InstantiateTypeArgumentsToBounds(
+    Thread* thread,
+    const TypeArguments& parameters) {
+  ASSERT(thread != nullptr);
+  if (parameters.IsNull()) {
+    return Object::empty_type_arguments().raw();
+  }
+  auto const zone = thread->zone();
+  const auto& result = TypeArguments::Handle(
+      zone, TypeArguments::New(parameters.Length(), Heap::kNew));
+  auto& param = TypeParameter::Handle(zone);
+  auto& type = AbstractType::Handle(zone);
+  for (intptr_t i = 0, n = parameters.Length(); i < n; i++) {
+    param ^= parameters.TypeAt(i);
+    type = param.default_argument();
+    ASSERT(type.IsFinalized());
+    result.SetTypeAt(i, type);
+  }
+  return result.Canonicalize(thread);
+}
+
+TypeArgumentsPtr Class::InstantiateToBounds(Thread* thread) const {
+  const auto& type_params =
+      TypeArguments::Handle(thread->zone(), type_parameters());
+  return InstantiateTypeArgumentsToBounds(thread, type_params);
+}
+
 ClassPtr Class::SuperClass(bool original_classes) const {
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
@@ -3450,7 +3432,11 @@
 void Class::AddInvocationDispatcher(const String& target_name,
                                     const Array& args_desc,
                                     const Function& dispatcher) const {
-  auto& cache = Array::Handle(invocation_dispatcher_cache());
+  auto thread = Thread::Current();
+  ASSERT(thread->isolate_group()->program_lock()->IsCurrentThreadWriter());
+
+  auto zone = thread->zone();
+  auto& cache = Array::Handle(zone, invocation_dispatcher_cache());
   InvocationDispatcherTable dispatchers(cache);
   intptr_t i = 0;
   for (auto dispatcher : dispatchers) {
@@ -3467,10 +3453,12 @@
     cache = Array::Grow(cache, new_len);
     set_invocation_dispatcher_cache(cache);
   }
+  // Ensure all stores are visible at the point the name is visible.
   auto entry = dispatchers[i];
-  entry.Set<Class::kInvocationDispatcherName>(target_name);
   entry.Set<Class::kInvocationDispatcherArgsDesc>(args_desc);
   entry.Set<Class::kInvocationDispatcherFunction>(dispatcher);
+  entry.Set<Class::kInvocationDispatcherName, std::memory_order_release>(
+      target_name);
 }
 
 FunctionPtr Class::GetInvocationDispatcher(const String& target_name,
@@ -3480,30 +3468,49 @@
   ASSERT(kind == FunctionLayout::kNoSuchMethodDispatcher ||
          kind == FunctionLayout::kInvokeFieldDispatcher ||
          kind == FunctionLayout::kDynamicInvocationForwarder);
-  auto Z = Thread::Current()->zone();
+  auto thread = Thread::Current();
+  auto Z = thread->zone();
   auto& function = Function::Handle(Z);
   auto& name = String::Handle(Z);
   auto& desc = Array::Handle(Z);
-  auto& cache = Array::Handle(Z, invocation_dispatcher_cache());
-  ASSERT(!cache.IsNull());
+  auto& cache = Array::Handle(Z);
 
-  InvocationDispatcherTable dispatchers(cache);
-  for (auto dispatcher : dispatchers) {
-    name = dispatcher.Get<Class::kInvocationDispatcherName>();
-    if (name.IsNull()) break;  // Reached last entry.
-    if (!name.Equals(target_name)) continue;
-    desc = dispatcher.Get<Class::kInvocationDispatcherArgsDesc>();
-    if (desc.raw() != args_desc.raw()) continue;
-    function = dispatcher.Get<Class::kInvocationDispatcherFunction>();
-    if (function.kind() == kind) {
-      break;  // Found match.
+  auto find_entry = [&]() {
+    cache = invocation_dispatcher_cache();
+    ASSERT(!cache.IsNull());
+    InvocationDispatcherTable dispatchers(cache);
+    for (auto dispatcher : dispatchers) {
+      // Ensure all loads are done after loading the name.
+      name = dispatcher.Get<Class::kInvocationDispatcherName,
+                            std::memory_order_acquire>();
+      if (name.IsNull()) break;  // Reached last entry.
+      if (!name.Equals(target_name)) continue;
+      desc = dispatcher.Get<Class::kInvocationDispatcherArgsDesc>();
+      if (desc.raw() != args_desc.raw()) continue;
+      function = dispatcher.Get<Class::kInvocationDispatcherFunction>();
+      if (function.kind() == kind) {
+        return function.raw();
+      }
     }
+    return Function::null();
+  };
+
+  // First we'll try to find it without using locks.
+  function = find_entry();
+  if (!function.IsNull() || !create_if_absent) {
+    return function.raw();
   }
 
-  if (function.IsNull() && create_if_absent) {
-    function = CreateInvocationDispatcher(target_name, args_desc, kind);
-    AddInvocationDispatcher(target_name, args_desc, function);
-  }
+  // If we failed to find it and possibly need to create it, use a write lock.
+  SafepointWriteRwLocker ml(thread, thread->isolate_group()->program_lock());
+
+  // Try to find it again & return if it was added in the meantime.
+  function = find_entry();
+  if (!function.IsNull()) return function.raw();
+
+  // Otherwise create it & add it.
+  function = CreateInvocationDispatcher(target_name, args_desc, kind);
+  AddInvocationDispatcher(target_name, args_desc, function);
   return function.raw();
 }
 
@@ -3599,7 +3606,7 @@
   extractor.set_parameter_names(Object::extractor_parameter_names());
   extractor.set_result_type(Object::dynamic_type());
 
-  extractor.InheritBinaryDeclarationFrom(*this);
+  extractor.InheritKernelOffsetFrom(*this);
 
   extractor.set_extracted_method_closure(closure_function);
   extractor.set_is_debuggable(false);
@@ -3615,12 +3622,19 @@
   const Function& closure_function =
       Function::Handle(ImplicitClosureFunction());
   const Class& owner = Class::Handle(closure_function.Owner());
-  if (owner.EnsureIsFinalized(Thread::Current()) != Error::null()) {
+  Thread* thread = Thread::Current();
+  if (owner.EnsureIsFinalized(thread) != Error::null()) {
     return Function::null();
   }
-  Function& result = Function::Handle(owner.LookupDynamicFunction(getter_name));
+  IsolateGroup* group = thread->isolate_group();
+  Function& result = Function::Handle(
+      Resolver::ResolveDynamicFunction(thread->zone(), owner, getter_name));
   if (result.IsNull()) {
-    result = CreateMethodExtractor(getter_name);
+    SafepointWriteRwLocker ml(thread, group->program_lock());
+    result = owner.LookupDynamicFunctionUnsafe(getter_name);
+    if (result.IsNull()) {
+      result = CreateMethodExtractor(getter_name);
+    }
   }
   ASSERT(result.kind() == FunctionLayout::kMethodExtractor);
   return result.raw();
@@ -3733,7 +3747,6 @@
   forwarder.set_is_visible(false);
 
   forwarder.ClearICDataArray();
-  forwarder.ClearBytecode();
   forwarder.ClearCode();
   forwarder.set_usage_counter(0);
   forwarder.set_deoptimization_counter(0);
@@ -3741,7 +3754,7 @@
   forwarder.set_inlining_depth(0);
   forwarder.set_optimized_call_site_count(0);
 
-  forwarder.InheritBinaryDeclarationFrom(*this);
+  forwarder.InheritKernelOffsetFrom(*this);
 
   const Array& checks = Array::Handle(zone, Array::New(1));
   checks.SetAt(0, *this);
@@ -3752,30 +3765,40 @@
 
 FunctionPtr Function::GetDynamicInvocationForwarder(
     const String& mangled_name,
-    bool allow_add /* = true */) const {
+    bool allow_add /*=true*/) const {
   ASSERT(IsDynamicInvocationForwarderName(mangled_name));
-  auto zone = Thread::Current()->zone();
+  auto thread = Thread::Current();
+  auto zone = thread->zone();
   const Class& owner = Class::Handle(zone, Owner());
-  Function& result = Function::Handle(
-      zone,
+  Function& result = Function::Handle(zone);
+
+  // First we'll try to find it without using locks.
+  result =
       owner.GetInvocationDispatcher(mangled_name, Array::null_array(),
                                     FunctionLayout::kDynamicInvocationForwarder,
-                                    /*create_if_absent=*/false));
+                                    /*create_if_absent=*/false);
+  if (!result.IsNull()) return result.raw();
 
-  if (!result.IsNull()) {
-    return result.raw();
+  const bool needs_dyn_forwarder =
+      kernel::NeedsDynamicInvocationForwarder(*this);
+  if (!allow_add) {
+    return needs_dyn_forwarder ? Function::null() : raw();
   }
 
-  // Check if function actually needs a dynamic invocation forwarder.
-  if (!kernel::NeedsDynamicInvocationForwarder(*this)) {
-    result = raw();
-  } else if (allow_add) {
-    result = CreateDynamicInvocationForwarder(mangled_name);
-  }
+  // If we failed to find it and possibly need to create it, use a write lock.
+  SafepointWriteRwLocker ml(thread, thread->isolate_group()->program_lock());
 
-  if (allow_add) {
-    owner.AddInvocationDispatcher(mangled_name, Array::null_array(), result);
-  }
+  // Try to find it again & return if it was added in the mean time.
+  result =
+      owner.GetInvocationDispatcher(mangled_name, Array::null_array(),
+                                    FunctionLayout::kDynamicInvocationForwarder,
+                                    /*create_if_absent=*/false);
+  if (!result.IsNull()) return result.raw();
+
+  // Otherwise create it & add it.
+  result = needs_dyn_forwarder ? CreateDynamicInvocationForwarder(mangled_name)
+                               : raw();
+  owner.AddInvocationDispatcher(mangled_name, Array::null_array(), result);
 
   return result.raw();
 }
@@ -3802,10 +3825,6 @@
   return raw_ptr()->invocation_dispatcher_cache_;
 }
 
-void Class::set_invocation_dispatcher_cache(const Array& cache) const {
-  StorePointer(&raw_ptr()->invocation_dispatcher_cache_, cache.raw());
-}
-
 void Class::Finalize() const {
   auto thread = Thread::Current();
   Isolate* isolate = thread->isolate();
@@ -4165,31 +4184,6 @@
   return callable_args.raw();
 }
 
-// Return the result of invoking the callable contained in the arguments.
-// Performs non-covariant type checks when the callable function does not
-// expect to be called dynamically.
-static ObjectPtr InvokeCallableWithChecks(Zone* zone,
-                                          const Array& args,
-                                          const Array& args_descriptor_array) {
-  auto& result = Object::Handle(
-      zone, DartEntry::ResolveCallable(args, args_descriptor_array));
-  if (result.IsError()) {
-    return result.raw();
-  }
-  const auto& function =
-      Function::Handle(zone, Function::RawCast(result.raw()));
-  if (!function.IsNull() && !function.CanReceiveDynamicInvocation()) {
-    // Let DoArgumentTypesMatch extract the appropriate instantiator
-    // and function tavs from the arguments (including the callable).
-    ArgumentsDescriptor call_args_descriptor(args_descriptor_array);
-    result = function.DoArgumentTypesMatch(args, call_args_descriptor);
-    if (result.IsError()) {
-      return result.raw();
-    }
-  }
-  return DartEntry::InvokeCallable(function, args, args_descriptor_array);
-}
-
 ObjectPtr Class::Invoke(const String& function_name,
                         const Array& args,
                         const Array& arg_names,
@@ -4231,7 +4225,7 @@
           zone,
           CreateCallableArgumentsFromStatic(zone, Instance::Cast(getter_result),
                                             args, arg_names, args_descriptor));
-      return InvokeCallableWithChecks(zone, call_args,
+      return DartEntry::InvokeClosure(thread, call_args,
                                       call_args_descriptor_array);
     }
   }
@@ -4288,14 +4282,7 @@
 #if defined(DART_PRECOMPILED_RUNTIME)
     UNREACHABLE();
 #else
-    // Loading of class declaration can be postponed until needed
-    // if class comes from bytecode.
-    if (!is_declared_in_bytecode()) {
-      FATAL1("Unable to use class %s which is not loaded yet.", ToCString());
-    }
-    kernel::BytecodeReader::LoadClassDeclaration(*this);
-    ASSERT(is_declaration_loaded());
-    ASSERT(is_type_finalized());
+    FATAL1("Unable to use class %s which is not loaded yet.", ToCString());
 #endif
   }
 }
@@ -4311,6 +4298,10 @@
     Compiler::AbortBackgroundCompilation(DeoptId::kNone,
                                          "Class finalization while compiling");
   }
+  SafepointWriteRwLocker ml(thread, thread->isolate_group()->program_lock());
+  if (is_finalized()) {
+    return Error::null();
+  }
   ASSERT(thread->IsMutatorThread());
   ASSERT(thread != NULL);
   const Error& error =
@@ -4354,6 +4345,9 @@
 void Class::SetFields(const Array& value) const {
   ASSERT(!value.IsNull());
 #if defined(DEBUG)
+  Thread* thread = Thread::Current();
+  ASSERT(thread->IsMutatorThread());
+  ASSERT(thread->isolate_group()->program_lock()->IsCurrentThreadWriter());
   // Verify that all the fields in the array have this class as owner.
   Field& field = Field::Handle();
   intptr_t len = value.Length();
@@ -4364,10 +4358,15 @@
   }
 #endif
   // The value of static fields is already initialized to null.
-  StorePointer(&raw_ptr()->fields_, value.raw());
+  set_fields(value);
 }
 
 void Class::AddField(const Field& field) const {
+#if defined(DEBUG)
+  Thread* thread = Thread::Current();
+  ASSERT(thread->IsMutatorThread());
+  ASSERT(thread->isolate_group()->program_lock()->IsCurrentThreadWriter());
+#endif
   const Array& arr = Array::Handle(fields());
   const Array& new_arr = Array::Handle(Array::Grow(arr, arr.Length() + 1));
   new_arr.SetAt(arr.Length(), field);
@@ -4375,6 +4374,11 @@
 }
 
 void Class::AddFields(const GrowableArray<const Field*>& new_fields) const {
+#if defined(DEBUG)
+  Thread* thread = Thread::Current();
+  ASSERT(thread->IsMutatorThread());
+  ASSERT(thread->isolate_group()->program_lock()->IsCurrentThreadWriter());
+#endif
   const intptr_t num_new_fields = new_fields.length();
   if (num_new_fields == 0) return;
   const Array& arr = Array::Handle(fields());
@@ -4469,8 +4473,7 @@
   result.set_num_type_arguments(kUnknownNumTypeArguments);
   result.set_num_native_fields(0);
   result.set_state_bits(0);
-  NOT_IN_PRECOMPILED(result.set_is_declared_in_bytecode(false));
-  NOT_IN_PRECOMPILED(result.set_binary_declaration_offset(0));
+  NOT_IN_PRECOMPILED(result.set_kernel_offset(0));
   result.InitEmptyFields();
   return result.raw();
 }
@@ -4783,8 +4786,6 @@
       return Symbols::KernelProgramInfo().ToCString();
     case kCodeCid:
       return Symbols::Code().ToCString();
-    case kBytecodeCid:
-      return Symbols::Bytecode().ToCString();
     case kInstructionsCid:
       return Symbols::Instructions().ToCString();
     case kInstructionsSectionCid:
@@ -4805,8 +4806,6 @@
       return Symbols::Context().ToCString();
     case kContextScopeCid:
       return Symbols::ContextScope().ToCString();
-    case kParameterTypeCheckCid:
-      return Symbols::ParameterTypeCheck().ToCString();
     case kSingleTargetCacheCid:
       return Symbols::SingleTargetCache().ToCString();
     case kICDataCid:
@@ -4867,9 +4866,6 @@
 
 int32_t Class::SourceFingerprint() const {
 #if !defined(DART_PRECOMPILED_RUNTIME)
-  if (is_declared_in_bytecode()) {
-    return 0;  // TODO(37353): Implement or remove.
-  }
   return kernel::KernelSourceFingerprintHelper::CalculateClassFingerprint(
       *this);
 #else
@@ -4878,71 +4874,70 @@
 }
 
 void Class::set_is_implemented() const {
-  set_state_bits(ImplementedBit::update(true, raw_ptr()->state_bits_));
+  set_state_bits(ImplementedBit::update(true, state_bits()));
 }
 
 void Class::set_is_abstract() const {
-  set_state_bits(AbstractBit::update(true, raw_ptr()->state_bits_));
+  set_state_bits(AbstractBit::update(true, state_bits()));
 }
 
 void Class::set_is_declaration_loaded() const {
   ASSERT(!is_declaration_loaded());
-  set_state_bits(ClassLoadingBits::update(ClassLayout::kDeclarationLoaded,
-                                          raw_ptr()->state_bits_));
+  set_state_bits(
+      ClassLoadingBits::update(ClassLayout::kDeclarationLoaded, state_bits()));
 }
 
 void Class::set_is_type_finalized() const {
   ASSERT(is_declaration_loaded());
   ASSERT(!is_type_finalized());
-  set_state_bits(ClassLoadingBits::update(ClassLayout::kTypeFinalized,
-                                          raw_ptr()->state_bits_));
+  set_state_bits(
+      ClassLoadingBits::update(ClassLayout::kTypeFinalized, state_bits()));
 }
 
 void Class::set_is_synthesized_class() const {
-  set_state_bits(SynthesizedClassBit::update(true, raw_ptr()->state_bits_));
+  set_state_bits(SynthesizedClassBit::update(true, state_bits()));
 }
 
 void Class::set_is_enum_class() const {
-  set_state_bits(EnumBit::update(true, raw_ptr()->state_bits_));
+  set_state_bits(EnumBit::update(true, state_bits()));
 }
 
 void Class::set_is_const() const {
-  set_state_bits(ConstBit::update(true, raw_ptr()->state_bits_));
+  set_state_bits(ConstBit::update(true, state_bits()));
 }
 
 void Class::set_is_transformed_mixin_application() const {
-  set_state_bits(
-      TransformedMixinApplicationBit::update(true, raw_ptr()->state_bits_));
+  set_state_bits(TransformedMixinApplicationBit::update(true, state_bits()));
 }
 
 void Class::set_is_fields_marked_nullable() const {
-  set_state_bits(FieldsMarkedNullableBit::update(true, raw_ptr()->state_bits_));
+  set_state_bits(FieldsMarkedNullableBit::update(true, state_bits()));
 }
 
 void Class::set_is_allocated(bool value) const {
-  set_state_bits(IsAllocatedBit::update(value, raw_ptr()->state_bits_));
+  set_state_bits(IsAllocatedBit::update(value, state_bits()));
 }
 
 void Class::set_is_loaded(bool value) const {
-  set_state_bits(IsLoadedBit::update(value, raw_ptr()->state_bits_));
+  set_state_bits(IsLoadedBit::update(value, state_bits()));
 }
 
 void Class::set_is_finalized() const {
   ASSERT(!is_finalized());
-  set_state_bits(ClassFinalizedBits::update(ClassLayout::kFinalized,
-                                            raw_ptr()->state_bits_));
+  set_state_bits(
+      ClassFinalizedBits::update(ClassLayout::kFinalized, state_bits()));
 }
 
 void Class::set_is_allocate_finalized() const {
   ASSERT(!is_allocate_finalized());
   set_state_bits(ClassFinalizedBits::update(ClassLayout::kAllocateFinalized,
-                                            raw_ptr()->state_bits_));
+                                            state_bits()));
 }
 
 void Class::set_is_prefinalized() const {
   ASSERT(!is_finalized());
-  set_state_bits(ClassFinalizedBits::update(ClassLayout::kPreFinalized,
-                                            raw_ptr()->state_bits_));
+  set_state_bits(
+      ClassFinalizedBits::update(ClassLayout::kPreFinalized, state_bits()));
 }
 
 void Class::set_interfaces(const Array& value) const {
@@ -4952,6 +4947,7 @@
 
 void Class::AddDirectImplementor(const Class& implementor,
                                  bool is_mixin) const {
+  ASSERT(IsolateGroup::Current()->program_lock()->IsCurrentThreadWriter());
   ASSERT(is_implemented());
   ASSERT(!implementor.IsNull());
   GrowableObjectArray& direct_implementors =
@@ -4976,10 +4972,12 @@
 }
 
 void Class::ClearDirectImplementors() const {
+  ASSERT(IsolateGroup::Current()->program_lock()->IsCurrentThreadWriter());
   StorePointer(&raw_ptr()->direct_implementors_, GrowableObjectArray::null());
 }
 
 void Class::AddDirectSubclass(const Class& subclass) const {
+  ASSERT(IsolateGroup::Current()->program_lock()->IsCurrentThreadWriter());
   ASSERT(!subclass.IsNull());
   ASSERT(subclass.SuperClass() == raw());
   // Do not keep track of the direct subclasses of class Object.
@@ -5000,6 +4998,7 @@
 }
 
 void Class::ClearDirectSubclasses() const {
+  ASSERT(IsolateGroup::Current()->program_lock()->IsCurrentThreadWriter());
   StorePointer(&raw_ptr()->direct_subclasses_, GrowableObjectArray::null());
 }
 
@@ -5045,7 +5044,7 @@
   Type& type =
       Type::Handle(Type::New(*this, TypeArguments::Handle(type_parameters()),
                              token_pos(), Nullability::kNonNullable));
-  type ^= ClassFinalizer::FinalizeType(*this, type);
+  type ^= ClassFinalizer::FinalizeType(type);
   set_declaration_type(type);
   return type.raw();
 }
@@ -5264,13 +5263,8 @@
   return Library::IsPrivate(String::Handle(Name()));
 }
 
-FunctionPtr Class::LookupDynamicFunction(const String& name) const {
-  return LookupFunction(name, kInstance);
-}
-
-FunctionPtr Class::LookupDynamicFunctionAllowAbstract(
-    const String& name) const {
-  return LookupFunction(name, kInstanceAllowAbstract);
+FunctionPtr Class::LookupDynamicFunctionUnsafe(const String& name) const {
+  return LookupFunctionReadLocked(name, kInstance);
 }
 
 FunctionPtr Class::LookupDynamicFunctionAllowPrivate(const String& name) const {
@@ -5278,7 +5272,9 @@
 }
 
 FunctionPtr Class::LookupStaticFunction(const String& name) const {
-  return LookupFunction(name, kStatic);
+  Thread* thread = Thread::Current();
+  SafepointReadRwLocker ml(thread, thread->isolate_group()->program_lock());
+  return LookupFunctionReadLocked(name, kStatic);
 }
 
 FunctionPtr Class::LookupStaticFunctionAllowPrivate(const String& name) const {
@@ -5286,7 +5282,9 @@
 }
 
 FunctionPtr Class::LookupConstructor(const String& name) const {
-  return LookupFunction(name, kConstructor);
+  Thread* thread = Thread::Current();
+  SafepointReadRwLocker ml(thread, thread->isolate_group()->program_lock());
+  return LookupFunctionReadLocked(name, kConstructor);
 }
 
 FunctionPtr Class::LookupConstructorAllowPrivate(const String& name) const {
@@ -5294,21 +5292,23 @@
 }
 
 FunctionPtr Class::LookupFactory(const String& name) const {
-  return LookupFunction(name, kFactory);
+  Thread* thread = Thread::Current();
+  SafepointReadRwLocker ml(thread, thread->isolate_group()->program_lock());
+  return LookupFunctionReadLocked(name, kFactory);
 }
 
 FunctionPtr Class::LookupFactoryAllowPrivate(const String& name) const {
   return LookupFunctionAllowPrivate(name, kFactory);
 }
 
-FunctionPtr Class::LookupFunction(const String& name) const {
-  return LookupFunction(name, kAny);
-}
-
 FunctionPtr Class::LookupFunctionAllowPrivate(const String& name) const {
   return LookupFunctionAllowPrivate(name, kAny);
 }
 
+FunctionPtr Class::LookupFunctionReadLocked(const String& name) const {
+  return LookupFunctionReadLocked(name, kAny);
+}
+
 // Returns true if 'prefix' and 'accessor_name' match 'name'.
 static bool MatchesAccessorName(const String& name,
                                 const char* prefix,
@@ -5358,10 +5358,16 @@
   return Function::null();
 }
 
-FunctionPtr Class::LookupFunction(const String& name, MemberKind kind) const {
+FunctionPtr Class::LookupFunctionReadLocked(const String& name,
+                                            MemberKind kind) const {
   ASSERT(!IsNull());
   Thread* thread = Thread::Current();
   RELEASE_ASSERT(is_finalized());
+  // Caller needs to ensure they grab program_lock because this method
+  // can be invoked with either ReadRwLock or WriteRwLock.
+#if defined(DEBUG)
+  ASSERT(thread->isolate_group()->program_lock()->IsCurrentThreadReader());
+#endif
   REUSABLE_ARRAY_HANDLESCOPE(thread);
   REUSABLE_FUNCTION_HANDLESCOPE(thread);
   Array& funcs = thread->ArrayHandle();
@@ -5370,7 +5376,10 @@
   const intptr_t len = funcs.Length();
   Function& function = thread->FunctionHandle();
   if (len >= kFunctionLookupHashTreshold) {
-    // Cache functions hash table to allow multi threaded access.
+    // TODO(dartbug.com/36097): We require currently a read lock in the resolver
+    // to avoid read-write race access to this hash table.
+    // If we want to increase resolver speed by avoiding the need for read lock,
+    // we could make change this hash table to be lock-free for the reader.
     const Array& hash_table =
         Array::Handle(thread->zone(), raw_ptr()->functions_hash_table_);
     if (!hash_table.IsNull()) {
@@ -5416,7 +5425,7 @@
   REUSABLE_FUNCTION_HANDLESCOPE(thread);
   REUSABLE_STRING_HANDLESCOPE(thread);
   Array& funcs = thread->ArrayHandle();
-  funcs = functions();
+  funcs = current_functions();
   ASSERT(!funcs.IsNull());
   const intptr_t len = funcs.Length();
   Function& function = thread->FunctionHandle();
@@ -5452,7 +5461,7 @@
   REUSABLE_FUNCTION_HANDLESCOPE(thread);
   REUSABLE_STRING_HANDLESCOPE(thread);
   Array& funcs = thread->ArrayHandle();
-  funcs = functions();
+  funcs = current_functions();
   intptr_t len = funcs.Length();
   Function& function = thread->FunctionHandle();
   String& function_name = thread->StringHandle();
@@ -5916,7 +5925,13 @@
                                         const TypeArguments& other,
                                         intptr_t other_length,
                                         intptr_t total_length) const {
-  if (IsNull() && other.IsNull()) {
+  if (other_length == 0) {
+    ASSERT(IsCanonical());
+    return raw();
+  } else if (other_length == total_length) {
+    ASSERT(other.IsCanonical());
+    return other.raw();
+  } else if (IsNull() && other.IsNull()) {
     return TypeArguments::null();
   }
   const TypeArguments& result =
@@ -5994,6 +6009,19 @@
   printer->AddString(">");
 }
 
+void TypeArguments::PrintTo(BaseTextBuffer* buffer) const {
+  buffer->AddString("TypeArguments: ");
+  if (IsNull()) {
+    return buffer->AddString("null");
+  }
+  buffer->Printf("(H%" Px ")", Smi::Value(raw_ptr()->hash_));
+  auto& type_at = AbstractType::Handle();
+  for (intptr_t i = 0; i < Length(); i++) {
+    type_at = TypeAt(i);
+    buffer->Printf(" [%s]", type_at.IsNull() ? "null" : type_at.ToCString());
+  }
+}
+
 bool TypeArguments::IsSubvectorEquivalent(const TypeArguments& other,
                                           intptr_t from_index,
                                           intptr_t len,
@@ -6099,6 +6127,13 @@
                                                     value.raw());
 }
 
+bool TypeArguments::HasCount(intptr_t count) const {
+  if (IsNull()) {
+    return true;
+  }
+  return Length() == count;
+}
+
 intptr_t TypeArguments::Length() const {
   if (IsNull()) {
     return 0;
@@ -6498,7 +6533,9 @@
     return this->raw();
   }
   const intptr_t num_types = Length();
-  if (IsRaw(0, num_types)) {
+  if (num_types == 0) {
+    return TypeArguments::empty_type_arguments().raw();
+  } else if (IsRaw(0, num_types)) {
     return TypeArguments::null();
   }
   Zone* zone = thread->zone();
@@ -6576,18 +6613,11 @@
 
 const char* TypeArguments::ToCString() const {
   if (IsNull()) {
-    return "TypeArguments: null";
+    return "TypeArguments: null";  // Optimizing the frequent case.
   }
-  Zone* zone = Thread::Current()->zone();
-  const char* prev_cstr = OS::SCreate(zone, "TypeArguments: (H%" Px ")",
-                                      Smi::Value(raw_ptr()->hash_));
-  for (int i = 0; i < Length(); i++) {
-    const AbstractType& type_at = AbstractType::Handle(zone, TypeAt(i));
-    const char* type_cstr = type_at.IsNull() ? "null" : type_at.ToCString();
-    char* chars = OS::SCreate(zone, "%s [%s]", prev_cstr, type_cstr);
-    prev_cstr = chars;
-  }
-  return prev_cstr;
+  ZoneTextBuffer buffer(Thread::Current()->zone());
+  PrintTo(&buffer);
+  return buffer.buffer();
 }
 
 const char* PatchClass::ToCString() const {
@@ -6686,76 +6716,13 @@
 bool Function::HasCode() const {
   NoSafepointScope no_safepoint;
   ASSERT(raw_ptr()->code_ != Code::null());
-#if defined(DART_PRECOMPILED_RUNTIME)
   return raw_ptr()->code_ != StubCode::LazyCompile().raw();
-#else
-  return raw_ptr()->code_ != StubCode::LazyCompile().raw() &&
-         raw_ptr()->code_ != StubCode::InterpretCall().raw();
-#endif  // defined(DART_PRECOMPILED_RUNTIME)
 }
 
-#if !defined(DART_PRECOMPILED_RUNTIME)
-bool Function::IsBytecodeAllowed(Zone* zone) const {
-  if (FLAG_intrinsify) {
-    // Bigint intrinsics should not be interpreted, because their Dart version
-    // is only to be used when intrinsics are disabled. Mixing an interpreted
-    // Dart version with a compiled intrinsified version results in a mismatch
-    // in the number of digits processed by each call.
-    switch (recognized_kind()) {
-      case MethodRecognizer::kBigint_lsh:
-      case MethodRecognizer::kBigint_rsh:
-      case MethodRecognizer::kBigint_absAdd:
-      case MethodRecognizer::kBigint_absSub:
-      case MethodRecognizer::kBigint_mulAdd:
-      case MethodRecognizer::kBigint_sqrAdd:
-      case MethodRecognizer::kBigint_estimateQuotientDigit:
-      case MethodRecognizer::kMontgomery_mulMod:
-        return false;
-      default:
-        break;
-    }
-  }
-  switch (kind()) {
-    case FunctionLayout::kDynamicInvocationForwarder:
-      return is_declared_in_bytecode();
-    case FunctionLayout::kImplicitClosureFunction:
-    case FunctionLayout::kIrregexpFunction:
-    case FunctionLayout::kFfiTrampoline:
-      return false;
-    default:
-      return true;
-  }
-}
-
-void Function::AttachBytecode(const Bytecode& value) const {
-  DEBUG_ASSERT(IsMutatorOrAtSafepoint());
-  ASSERT(!value.IsNull());
-  // Finish setting up code before activating it.
-  if (!value.InVMIsolateHeap()) {
-    value.set_function(*this);
-  }
-  StorePointer(&raw_ptr()->bytecode_, value.raw());
-
-  // We should not have loaded the bytecode if the function had code.
-  // However, we may load the bytecode to access source positions (see
-  // ProcessBytecodeTokenPositionsEntry in kernel.cc).
-  // In that case, do not install InterpretCall stub below.
-  if (FLAG_enable_interpreter && !HasCode()) {
-    // Set the code entry_point to InterpretCall stub.
-    SetInstructions(StubCode::InterpretCall());
-  }
-}
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-
 bool Function::HasCode(FunctionPtr function) {
   NoSafepointScope no_safepoint;
   ASSERT(function->ptr()->code_ != Code::null());
-#if defined(DART_PRECOMPILED_RUNTIME)
   return function->ptr()->code_ != StubCode::LazyCompile().raw();
-#else
-  return function->ptr()->code_ != StubCode::LazyCompile().raw() &&
-         function->ptr()->code_ != StubCode::InterpretCall().raw();
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
 }
 
 void Function::ClearCode() const {
@@ -6766,19 +6733,7 @@
 
   StorePointer(&raw_ptr()->unoptimized_code_, Code::null());
 
-  if (FLAG_enable_interpreter && HasBytecode()) {
-    SetInstructions(StubCode::InterpretCall());
-  } else {
-    SetInstructions(StubCode::LazyCompile());
-  }
-#endif  // defined(DART_PRECOMPILED_RUNTIME)
-}
-
-void Function::ClearBytecode() const {
-#if defined(DART_PRECOMPILED_RUNTIME)
-  UNREACHABLE();
-#else
-  StorePointer(&raw_ptr()->bytecode_, Bytecode::null());
+  SetInstructions(StubCode::LazyCompile());
 #endif  // defined(DART_PRECOMPILED_RUNTIME)
 }
 
@@ -6839,14 +6794,9 @@
 
   const Code& unopt_code = Code::Handle(zone, unoptimized_code());
   if (unopt_code.IsNull()) {
-    // Set the lazy compile or interpreter call stub code.
-    if (FLAG_enable_interpreter && HasBytecode()) {
-      TIR_Print("Switched to interpreter call stub for %s\n", ToCString());
-      SetInstructions(StubCode::InterpretCall());
-    } else {
-      TIR_Print("Switched to lazy compile stub for %s\n", ToCString());
-      SetInstructions(StubCode::LazyCompile());
-    }
+    // Set the lazy compile stub code.
+    TIR_Print("Switched to lazy compile stub for %s\n", ToCString());
+    SetInstructions(StubCode::LazyCompile());
     return;
   }
 
@@ -6989,6 +6939,123 @@
   }
 }
 
+TypeArgumentsPtr Function::InstantiateToBounds(
+    Thread* thread,
+    DefaultTypeArgumentsKind* kind_out) const {
+  if (CachesDefaultTypeArguments()) {
+    // Always use the cached version, even if the type parameters are null,
+    // to catch cases where the cache isn't properly initialized.
+    return default_type_arguments(kind_out);
+  }
+  // No cached version, so just retrieve from the type parameters and return
+  // a canonicalized version..
+  if (type_parameters() == TypeArguments::null()) {
+    if (kind_out != nullptr) {
+      *kind_out = DefaultTypeArgumentsKind::kIsInstantiated;
+    }
+    return Object::empty_type_arguments().raw();
+  }
+  auto& result = TypeArguments::Handle(thread->zone(), type_parameters());
+  result = InstantiateTypeArgumentsToBounds(thread, result);
+  if (kind_out != nullptr) {
+    // We just return is/is not instantiated if the value isn't cached, as
+    // the other checks may be more overhead at runtime than just doing the
+    // instantiation.
+    *kind_out = result.IsNull() || result.IsInstantiated()
+                    ? DefaultTypeArgumentsKind::kIsInstantiated
+                    : DefaultTypeArgumentsKind::kNeedsInstantiation;
+  }
+  return result.raw();
+}
+
+void Function::UpdateCachedDefaultTypeArguments(Thread* thread) const {
+  auto const zone = thread->zone();
+  auto& closure_function = Function::Handle(zone);
+  if (HasImplicitClosureFunction()) {
+    closure_function = ImplicitClosureFunction();
+  }
+  if (CachesDefaultTypeArguments()) {
+    auto defaults = &Object::empty_type_arguments();
+    if (NumTypeParameters(thread) > 0) {
+      const auto& params = TypeArguments::Handle(zone, type_parameters());
+      const intptr_t num_params = params.Length();
+      auto& new_defaults = TypeArguments::Handle(
+          zone, TypeArguments::New(num_params, Heap::kNew));
+      // Only canonicalize the result if all the default arguments have been
+      // canonicalized, to avoid premature canonicalization of the arguments.
+      bool all_canonical = true;
+      auto& type = AbstractType::Handle(zone);
+      for (intptr_t i = 0; i < num_params; i++) {
+        type = params.TypeAt(i);
+        type = TypeParameter::Cast(type).default_argument();
+        if (!type.IsCanonical()) {
+          all_canonical = false;
+        }
+        new_defaults.SetTypeAt(i, type);
+      }
+      if (all_canonical) {
+        new_defaults = new_defaults.Canonicalize(thread);
+      }
+      defaults = &new_defaults;
+    }
+    set_default_type_arguments(*defaults);
+    if (!closure_function.IsNull()) {
+      closure_function.set_default_type_arguments(*defaults);
+    }
+  } else if (!closure_function.IsNull()) {
+    closure_function.UpdateCachedDefaultTypeArguments(thread);
+  }
+}
+
+TypeArgumentsPtr Function::default_type_arguments(
+    DefaultTypeArgumentsKind* kind_out) const {
+  if (!CachesDefaultTypeArguments()) {
+    UNREACHABLE();
+  }
+  const auto& closure_data =
+      ClosureData::Handle(ClosureData::RawCast(raw_ptr()->data_));
+  ASSERT(!closure_data.IsNull());
+  if (kind_out != nullptr) {
+    *kind_out = DefaultTypeArgumentsKindField::decode(
+        closure_data.default_type_arguments_info());
+  }
+  return closure_data.default_type_arguments();
+}
+
+void Function::set_default_type_arguments(const TypeArguments& value) const {
+  if (!CachesDefaultTypeArguments()) {
+    UNREACHABLE();
+  }
+  const auto& closure_data =
+      ClosureData::Handle(ClosureData::RawCast(raw_ptr()->data_));
+  ASSERT(!closure_data.IsNull());
+  auto kind = DefaultTypeArgumentsKindFor(value);
+  ASSERT(kind != DefaultTypeArgumentsKind::kInvalid);
+  const intptr_t num_parent_type_params = NumParentTypeParameters();
+  const intptr_t default_type_args_info =
+      DefaultTypeArgumentsKindField::encode(kind) |
+      NumParentTypeParametersField::encode(num_parent_type_params);
+  closure_data.set_default_type_arguments_info(default_type_args_info);
+  // We could just store null for the ksharesFunction/kSharesInstantiator cases,
+  // assuming all clients retrieve the DefaultTypeArgumentsKind to distinguish.
+  closure_data.set_default_type_arguments(value);
+}
+
+Function::DefaultTypeArgumentsKind Function::DefaultTypeArgumentsKindFor(
+    const TypeArguments& value) const {
+  if (value.IsNull() || value.IsInstantiated()) {
+    return DefaultTypeArgumentsKind::kIsInstantiated;
+  }
+  if (value.CanShareFunctionTypeArguments(*this)) {
+    return DefaultTypeArgumentsKind::kSharesFunctionTypeArguments;
+  }
+  const auto& cls = Class::Handle(Owner());
+  if (value.CanShareInstantiatorTypeArguments(cls)) {
+    return DefaultTypeArgumentsKind::kSharesInstantiatorTypeArguments;
+  }
+  return DefaultTypeArgumentsKind::kNeedsInstantiation;
+}
+
 FunctionPtr Function::GetGeneratedClosure() const {
   const auto& closure_functions = GrowableObjectArray::Handle(
       Isolate::Current()->object_store()->closure_functions());
@@ -7319,7 +7386,6 @@
 //   ffi trampoline function: FfiTrampolineData  (Dart->C)
 //   dyn inv forwarder:       Array[0] = Function target
 //                            Array[1] = TypeArguments default type args
-//                            Array[i] = ParameterTypeCheck
 void Function::set_data(const Object& value) const {
   StorePointer(&raw_ptr()->data_, value.raw());
 }
@@ -7904,132 +7970,6 @@
   return true;
 }
 
-// Checks each supplied function type argument is a subtype of the corresponding
-// bound. Also takes the number of type arguments to skip over because they
-// belong to parent functions and are not included in the type parameters.
-// Returns null if all checks succeed, otherwise returns a non-null Error for
-// one of the failures.
-static ObjectPtr TypeArgumentsAreBoundSubtypes(
-    Zone* zone,
-    const TokenPosition& token_pos,
-    const TypeArguments& type_parameters,
-    intptr_t num_parent_type_args,
-    const TypeArguments& instantiator_type_arguments,
-    const TypeArguments& function_type_arguments) {
-  ASSERT(!type_parameters.IsNull());
-  ASSERT(!function_type_arguments.IsNull());
-  const intptr_t kNumTypeArgs = function_type_arguments.Length();
-  ASSERT_EQUAL(num_parent_type_args + type_parameters.Length(), kNumTypeArgs);
-
-  // Don't bother allocating handles, there's nothing to check.
-  if (kNumTypeArgs - num_parent_type_args == 0) return Error::null();
-
-  auto& type = AbstractType::Handle(zone);
-  auto& bound = AbstractType::Handle(zone);
-  auto& name = String::Handle(zone);
-  for (intptr_t i = num_parent_type_args; i < kNumTypeArgs; i++) {
-    type = type_parameters.TypeAt(i - num_parent_type_args);
-    ASSERT(type.IsTypeParameter());
-    const auto& parameter = TypeParameter::Cast(type);
-    bound = parameter.bound();
-    name = parameter.name();
-    // Only perform non-covariant checks where the bound is not the top type.
-    if (parameter.IsGenericCovariantImpl() || bound.IsTopTypeForSubtyping()) {
-      continue;
-    }
-    if (!AbstractType::InstantiateAndTestSubtype(&type, &bound,
-                                                 instantiator_type_arguments,
-                                                 function_type_arguments)) {
-      return Error::RawCast(ThrowTypeError(token_pos, type, bound, name));
-    }
-  }
-
-  return Error::null();
-}
-
-// Returns a TypeArguments object where, for each type parameter local to this
-// function, the entry in the TypeArguments is an instantiated version of its
-// bound. In the instantiated bound, any local function type parameter
-// references are replaced with the corresponding bound if that bound can be
-// fully instantiated without local function type parameters, otherwise dynamic.
-static TypeArgumentsPtr InstantiateTypeParametersToBounds(
-    Zone* zone,
-    const TokenPosition& token_pos,
-    const TypeArguments& type_parameters,
-    const TypeArguments& instantiator_type_args,
-    intptr_t num_parent_type_args,
-    const TypeArguments& parent_type_args) {
-  ASSERT(!type_parameters.IsNull());
-  const intptr_t kNumCurrentTypeArgs = type_parameters.Length();
-  const intptr_t kNumTypeArgs = kNumCurrentTypeArgs + num_parent_type_args;
-  auto& function_type_args = TypeArguments::Handle(zone);
-
-  bool all_bounds_instantiated = true;
-
-  // Create a type argument vector large enough for the parents' and current
-  // type arguments.
-  function_type_args = TypeArguments::New(kNumTypeArgs);
-  auto& type = AbstractType::Handle(zone);
-  auto& bound = AbstractType::Handle(zone);
-  // First copy over the parent type args (or the dynamic type if null).
-  for (intptr_t i = 0; i < num_parent_type_args; i++) {
-    type = parent_type_args.IsNull() ? Type::DynamicType()
-                                     : parent_type_args.TypeAt(i);
-    function_type_args.SetTypeAt(i, type);
-  }
-  // Now try fully instantiating the bounds of each parameter using only
-  // the instantiator and parent function type arguments. If possible, keep the
-  // instantiated bound as the entry. Otherwise, just set that entry to dynamic.
-  for (intptr_t i = num_parent_type_args; i < kNumTypeArgs; i++) {
-    type = type_parameters.TypeAt(i - num_parent_type_args);
-    const auto& param = TypeParameter::Cast(type);
-    bound = param.bound();
-    // Only instantiate up to the parent type parameters.
-    if (!bound.IsInstantiated(kAny, num_parent_type_args)) {
-      bound = bound.InstantiateFrom(instantiator_type_args, function_type_args,
-                                    num_parent_type_args, Heap::kNew);
-    }
-    if (!bound.IsInstantiated()) {
-      // There are local type variables used in this bound.
-      bound = Type::DynamicType();
-      all_bounds_instantiated = false;
-    }
-    function_type_args.SetTypeAt(i, bound);
-  }
-
-  // If all the bounds were instantiated in the first pass, then there can't
-  // be any self or mutual recursion, so skip the bounds subtype check.
-  if (all_bounds_instantiated) return function_type_args.raw();
-
-  // Do another pass, using the set of TypeArguments we just created. If a given
-  // bound was instantiated in the last pass, just copy it over. (We don't need
-  // to iterate to a fixed point, since there should be no self or mutual
-  // recursion in the bounds.)
-  const auto& first_round =
-      TypeArguments::Handle(zone, function_type_args.raw());
-  function_type_args = TypeArguments::New(kNumTypeArgs);
-  // Again, copy over the parent type arguments first.
-  for (intptr_t i = 0; i < num_parent_type_args; i++) {
-    type = first_round.TypeAt(i);
-    function_type_args.SetTypeAt(i, type);
-  }
-  for (intptr_t i = num_parent_type_args; i < kNumTypeArgs; i++) {
-    type = type_parameters.TypeAt(i - num_parent_type_args);
-    const auto& param = TypeParameter::Cast(type);
-    bound = first_round.TypeAt(i);
-    // The dynamic type is never a bound, even when implicit, so it also marks
-    // bounds that were not already fully instantiated.
-    if (bound.raw() == Type::DynamicType()) {
-      bound = param.bound();
-      bound = bound.InstantiateFrom(instantiator_type_args, first_round,
-                                    kAllFree, Heap::kNew);
-    }
-    function_type_args.SetTypeAt(i, bound);
-  }
-
-  return function_type_args.raw();
-}
-
 // Retrieves the function type arguments, if any. This could be explicitly
 // passed type from the arguments array, delayed type arguments in closures,
 // or instantiated bounds for the type parameters if no other source for
@@ -8059,46 +7999,58 @@
       function.IsClosureFunction()
           ? TypeArguments::Handle(
                 zone, Closure::Cast(receiver).function_type_arguments())
-          : Object::null_type_arguments();
+          : Object::empty_type_arguments();
   // We don't try to instantiate the parent type parameters to their bounds
   // if not provided or check any closed-over type arguments against the parent
   // type parameter bounds (since they have been type checked already).
   if (kNumCurrentTypeArgs == 0) return parent_type_args.raw();
 
   auto& function_type_args = TypeArguments::Handle(zone);
+  // First check for delayed type arguments before using either provided or
+  // default type arguments.
+  bool has_delayed_type_args = false;
   if (function.IsClosureFunction()) {
     const auto& closure = Closure::Cast(receiver);
     function_type_args = closure.delayed_type_arguments();
-    if (function_type_args.raw() == Object::empty_type_arguments().raw()) {
-      // There are no delayed type arguments, so set back to null.
-      function_type_args = TypeArguments::null();
-    } else {
-      // We should never end up here when the receiver is a closure with delayed
-      // type arguments unless this dynamically called closure function was
-      // retrieved directly from the closure instead of going through
-      // DartEntry::ResolveCallable, which appropriately checks for this case.
-      ASSERT(args_desc.TypeArgsLen() == 0);
-    }
+    has_delayed_type_args =
+        function_type_args.raw() != Object::empty_type_arguments().raw();
   }
 
   if (args_desc.TypeArgsLen() > 0) {
+    // We should never end up here when the receiver is a closure with delayed
+    // type arguments unless this dynamically called closure function was
+    // retrieved directly from the closure instead of going through
+    // DartEntry::ResolveCallable, which appropriately checks for this case.
+    ASSERT(!has_delayed_type_args);
     function_type_args ^= args.At(0);
+  } else if (!has_delayed_type_args) {
+    // We have no explicitly provided function type arguments, so instantiate
+    // the type parameters to bounds or replace as appropriate.
+    Function::DefaultTypeArgumentsKind kind;
+    function_type_args = function.InstantiateToBounds(thread, &kind);
+    switch (kind) {
+      case Function::DefaultTypeArgumentsKind::kInvalid:
+        // We shouldn't hit the invalid case.
+        UNREACHABLE();
+        break;
+      case Function::DefaultTypeArgumentsKind::kIsInstantiated:
+        // Nothing left to do.
+        break;
+      case Function::DefaultTypeArgumentsKind::kNeedsInstantiation:
+        function_type_args = function_type_args.InstantiateAndCanonicalizeFrom(
+            instantiator_type_args, parent_type_args);
+        break;
+      case Function::DefaultTypeArgumentsKind::kSharesInstantiatorTypeArguments:
+        function_type_args = instantiator_type_args.raw();
+        break;
+      case Function::DefaultTypeArgumentsKind::kSharesFunctionTypeArguments:
+        function_type_args = parent_type_args.raw();
+        break;
+    }
   }
 
-  if (function_type_args.IsNull()) {
-    // We have no explicitly provided function type arguments, so generate
-    // some by instantiating the parameters to bounds.
-    return InstantiateTypeParametersToBounds(
-        zone, function.token_pos(), type_params, instantiator_type_args,
-        kNumParentTypeArgs, parent_type_args);
-  }
-
-  if (kNumParentTypeArgs > 0) {
-    function_type_args = function_type_args.Prepend(
-        zone, parent_type_args, kNumParentTypeArgs, kNumTypeArgs);
-  }
-
-  return function_type_args.raw();
+  return function_type_args.Prepend(zone, parent_type_args, kNumParentTypeArgs,
+                                    kNumTypeArgs);
 }
 
 // Retrieves the instantiator type arguments, if any, from the receiver.
@@ -8162,10 +8114,6 @@
     const ArgumentsDescriptor& args_desc,
     const TypeArguments& instantiator_type_arguments,
     const TypeArguments& function_type_arguments) const {
-  // We need a concrete (possibly empty) type arguments vector, not the
-  // implicitly filled with dynamic one.
-  ASSERT(!function_type_arguments.IsNull());
-
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
 
@@ -8173,19 +8121,29 @@
   // arguments to make sure they are appropriate subtypes of the bounds.
   const intptr_t kNumLocalTypeArgs = NumTypeParameters(thread);
   if (kNumLocalTypeArgs > 0) {
-    const intptr_t kNumParentTypeArgs = NumParentTypeParameters();
-    ASSERT_EQUAL(kNumLocalTypeArgs + kNumParentTypeArgs,
-                 function_type_arguments.Length());
+    ASSERT(function_type_arguments.HasCount(kNumLocalTypeArgs +
+                                            NumParentTypeParameters()));
     const auto& params = TypeArguments::Handle(zone, type_parameters());
-    const auto& result = Object::Handle(
-        zone, TypeArgumentsAreBoundSubtypes(
-                  zone, token_pos(), params, kNumParentTypeArgs,
-                  instantiator_type_arguments, function_type_arguments));
-    if (result.IsError()) {
-      return result.raw();
+    auto& parameter = TypeParameter::Handle(zone);
+    auto& type = AbstractType::Handle(zone);
+    auto& bound = AbstractType::Handle(zone);
+    for (intptr_t i = 0; i < kNumLocalTypeArgs; i++) {
+      parameter ^= params.TypeAt(i);
+      type = parameter.raw();
+      bound = parameter.bound();
+      // Only perform non-covariant checks where the bound is not the top type.
+      if (parameter.IsGenericCovariantImpl() || bound.IsTopTypeForSubtyping()) {
+        continue;
+      }
+      if (!AbstractType::InstantiateAndTestSubtype(&type, &bound,
+                                                   instantiator_type_arguments,
+                                                   function_type_arguments)) {
+        const auto& name = String::Handle(zone, parameter.name());
+        return Error::RawCast(ThrowTypeError(token_pos(), type, bound, name));
+      }
     }
   } else {
-    ASSERT_EQUAL(NumParentTypeParameters(), function_type_arguments.Length());
+    ASSERT(function_type_arguments.HasCount(NumParentTypeParameters()));
   }
 
   AbstractType& type = AbstractType::Handle(zone);
@@ -8717,8 +8675,7 @@
   NOT_IN_PRECOMPILED(result.set_optimized_instruction_count(0));
   NOT_IN_PRECOMPILED(result.set_optimized_call_site_count(0));
   NOT_IN_PRECOMPILED(result.set_inlining_depth(0));
-  NOT_IN_PRECOMPILED(result.set_is_declared_in_bytecode(false));
-  NOT_IN_PRECOMPILED(result.set_binary_declaration_offset(0));
+  NOT_IN_PRECOMPILED(result.set_kernel_offset(0));
   result.set_is_optimizable(is_native ? false : true);
   result.set_is_background_optimizable(is_native ? false : true);
   result.set_is_inlinable(true);
@@ -8742,6 +8699,11 @@
     // in new space.
     ASSERT(space == Heap::kOld);
   }
+  if (result.CachesDefaultTypeArguments()) {
+    // Make sure the default type arguments are set consistently with the
+    // function type parameters (currently null).
+    result.set_default_type_arguments(Object::empty_type_arguments());
+  }
 
   // Force-optimized functions are not debuggable because they cannot
   // deoptimize.
@@ -8875,8 +8837,9 @@
   }
 
   // Set closure function's type parameters.
-  closure_function.set_type_parameters(
-      TypeArguments::Handle(zone, type_parameters()));
+  auto& type_args_handle = TypeArguments::Handle(zone, type_parameters());
+  closure_function.set_type_parameters(type_args_handle);
+  closure_function.UpdateCachedDefaultTypeArguments(thread);
 
   // Set closure function's result type to this result type.
   closure_function.set_result_type(AbstractType::Handle(zone, result_type()));
@@ -8919,7 +8882,7 @@
     }
   }
   closure_function.TruncateUnusedParameterFlags();
-  closure_function.InheritBinaryDeclarationFrom(*this);
+  closure_function.InheritKernelOffsetFrom(*this);
 
   // Change covariant parameter types to either Object? for an opted-in implicit
   // closure or to Object* for a legacy implicit closure.
@@ -8945,7 +8908,7 @@
   const Type& signature_type =
       Type::Handle(zone, closure_function.SignatureType());
   if (!signature_type.IsFinalized()) {
-    ClassFinalizer::FinalizeType(Class::Handle(zone, Owner()), signature_type);
+    ClassFinalizer::FinalizeType(signature_type);
   }
   set_implicit_closure_function(closure_function);
   ASSERT(closure_function.IsImplicitClosureFunction());
@@ -9066,9 +9029,11 @@
   const auto& parent = Function::Handle(zone, parent_function());
   const auto& func_name = String::Handle(zone, parent.name());
   const auto& owner = Class::Handle(zone, parent.Owner());
-  const auto& error = owner.EnsureIsFinalized(Thread::Current());
+  Thread* thread = Thread::Current();
+  const auto& error = owner.EnsureIsFinalized(thread);
   ASSERT(error == Error::null());
-  auto& target = Function::Handle(zone, owner.LookupFunction(func_name));
+  auto& target =
+      Function::Handle(zone, Resolver::ResolveFunction(zone, owner, func_name));
 
   if (!target.IsNull() && (target.raw() != parent.raw())) {
     DEBUG_ASSERT(Isolate::Current()->HasAttemptedReload());
@@ -9199,25 +9164,19 @@
   return PatchClass::Cast(obj).origin_class();
 }
 
-void Function::InheritBinaryDeclarationFrom(const Function& src) const {
+void Function::InheritKernelOffsetFrom(const Function& src) const {
 #if defined(DART_PRECOMPILED_RUNTIME)
   UNREACHABLE();
 #else
-  StoreNonPointer(&raw_ptr()->binary_declaration_,
-                  src.raw_ptr()->binary_declaration_);
+  StoreNonPointer(&raw_ptr()->kernel_offset_, src.raw_ptr()->kernel_offset_);
 #endif
 }
 
-void Function::InheritBinaryDeclarationFrom(const Field& src) const {
+void Function::InheritKernelOffsetFrom(const Field& src) const {
 #if defined(DART_PRECOMPILED_RUNTIME)
   UNREACHABLE();
 #else
-  if (src.is_declared_in_bytecode()) {
-    set_is_declared_in_bytecode(true);
-    set_bytecode_offset(src.bytecode_offset());
-  } else {
-    set_kernel_offset(src.kernel_offset());
-  }
+  set_kernel_offset(src.kernel_offset());
 #endif
 }
 
@@ -9296,7 +9255,6 @@
 }
 
 intptr_t Function::KernelDataProgramOffset() const {
-  ASSERT(!is_declared_in_bytecode());
   if (IsNoSuchMethodDispatcher() || IsInvokeFieldDispatcher() ||
       IsFfiTrampoline()) {
     return 0;
@@ -9317,7 +9275,6 @@
   const Object& obj = Object::Handle(raw_ptr()->owner_);
   if (obj.IsClass()) {
     Library& lib = Library::Handle(Class::Cast(obj).library());
-    ASSERT(!lib.is_declared_in_bytecode());
     return lib.kernel_offset();
   }
   ASSERT(obj.IsPatchClass());
@@ -9328,12 +9285,6 @@
   return HasCode() && Code::Handle(CurrentCode()).is_optimized();
 }
 
-bool Function::ShouldCompilerOptimize() const {
-  return !FLAG_enable_interpreter ||
-         ((unoptimized_code() != Object::null()) && WasCompiled()) ||
-         ForceOptimize();
-}
-
 const char* Function::NameCString(NameVisibility name_visibility) const {
   switch (name_visibility) {
     case kInternalName:
@@ -9415,7 +9366,7 @@
   if (IsClosureFunction()) {
     if (fun.IsLocalFunction() && !fun.IsImplicitClosureFunction()) {
       Function& parent = Function::Handle(fun.parent_function());
-      if (parent.IsAsyncClosure() || parent.IsSyncGenClosure() ||
+      if (parent.IsAsyncClosure() || parent.IsSyncGenClosureMaker() ||
           parent.IsAsyncGenClosure()) {
         // Skip the closure and use the real function name found in
         // the parent.
@@ -9535,10 +9486,6 @@
 // arguments.
 int32_t Function::SourceFingerprint() const {
 #if !defined(DART_PRECOMPILED_RUNTIME)
-  if (is_declared_in_bytecode()) {
-    return kernel::BytecodeFingerprintHelper::CalculateFunctionFingerprint(
-        *this);
-  }
   return kernel::KernelSourceFingerprintHelper::CalculateFunctionFingerprint(
       *this);
 #else
@@ -9663,12 +9610,6 @@
     return true;  // The kernel structure has been altered, skip checking.
   }
 
-  if (is_declared_in_bytecode()) {
-    // AST and bytecode compute different fingerprints, and we only track one
-    // fingerprint set.
-    return true;
-  }
-
   if (SourceFingerprint() != fp) {
     // This output can be copied into a file, then used with sed
     // to replace the old values.
@@ -9773,7 +9714,8 @@
 
 bool Function::MayHaveUncheckedEntryPoint() const {
   return FLAG_enable_multiple_entrypoints &&
-         (NeedsArgumentTypeChecks() || IsImplicitClosureFunction());
+         (NeedsTypeArgumentTypeChecks() || NeedsArgumentTypeChecks() ||
+          IsImplicitClosureFunction());
 }
 
 const char* Function::ToCString() const {
@@ -9867,6 +9809,19 @@
   StorePointer(&raw_ptr()->signature_type_, value.raw());
 }
 
+void ClosureData::set_default_type_arguments(const TypeArguments& value) const {
+  StorePointer(&raw_ptr()->default_type_arguments_, value.raw());
+}
+
+intptr_t ClosureData::default_type_arguments_info() const {
+  return Smi::Value(raw_ptr()->default_type_arguments_info_);
+}
+
+void ClosureData::set_default_type_arguments_info(intptr_t value) const {
+  ASSERT(Smi::IsValid(value));
+  StorePointer(&raw_ptr()->default_type_arguments_info_, Smi::New(value));
+}
+
 ClosureDataPtr ClosureData::New() {
   ASSERT(Object::closure_data_class() != Class::null());
   ObjectPtr raw = Object::Allocate(ClosureData::kClassId,
@@ -9878,16 +9833,32 @@
   if (IsNull()) {
     return "ClosureData: null";
   }
-  const Function& parent = Function::Handle(parent_function());
-  const Type& type = Type::Handle(signature_type());
-  return OS::SCreate(Thread::Current()->zone(),
-                     "ClosureData: context_scope: 0x%" Px
-                     " parent_function: %s signature_type: %s"
-                     " implicit_static_closure: 0x%" Px,
-                     static_cast<uword>(context_scope()),
-                     parent.IsNull() ? "null" : parent.ToCString(),
-                     type.IsNull() ? "null" : type.ToCString(),
-                     static_cast<uword>(implicit_static_closure()));
+  auto const zone = Thread::Current()->zone();
+  ZoneTextBuffer buffer(zone);
+  buffer.Printf("ClosureData: context_scope: 0x%" Px "",
+                static_cast<uword>(context_scope()));
+  buffer.AddString(" parent_function: ");
+  if (parent_function() == Function::null()) {
+    buffer.AddString("null");
+  } else {
+    buffer.AddString(Function::Handle(zone, parent_function()).ToCString());
+  }
+  buffer.AddString(" signature_type: ");
+  if (signature_type() == Type::null()) {
+    buffer.AddString("null");
+  } else {
+    buffer.AddString(Type::Handle(zone, signature_type()).ToCString());
+  }
+  buffer.Printf(" implicit_static_closure: 0x%" Px "",
+                static_cast<uword>(implicit_static_closure()));
+  buffer.AddString(" default_type_arguments: ");
+  if (default_type_arguments() == TypeArguments::null()) {
+    buffer.AddString("null");
+  } else {
+    buffer.AddString(
+        TypeArguments::Handle(zone, default_type_arguments()).ToCString());
+  }
+  return buffer.buffer();
 }
 
 void SignatureData::set_parent_function(const Function& value) const {
@@ -10150,17 +10121,15 @@
   return PatchClass::Cast(obj).library_kernel_data();
 }
 
-void Field::InheritBinaryDeclarationFrom(const Field& src) const {
+void Field::InheritKernelOffsetFrom(const Field& src) const {
 #if defined(DART_PRECOMPILED_RUNTIME)
   UNREACHABLE();
 #else
-  StoreNonPointer(&raw_ptr()->binary_declaration_,
-                  src.raw_ptr()->binary_declaration_);
+  StoreNonPointer(&raw_ptr()->kernel_offset_, src.raw_ptr()->kernel_offset_);
 #endif
 }
 
 intptr_t Field::KernelDataProgramOffset() const {
-  ASSERT(!is_declared_in_bytecode());
   const Object& obj = Object::Handle(raw_ptr()->owner_);
   // During background JIT compilation field objects are copied
   // and copy points to the original field via the owner field.
@@ -10168,7 +10137,6 @@
     return Field::Cast(obj).KernelDataProgramOffset();
   } else if (obj.IsClass()) {
     Library& lib = Library::Handle(Class::Cast(obj).library());
-    ASSERT(!lib.is_declared_in_bytecode());
     return lib.kernel_offset();
   }
   ASSERT(obj.IsPatchClass());
@@ -10225,8 +10193,7 @@
     result.set_is_unboxing_candidate(!is_final && !is_late && !is_static);
   }
   result.set_initializer_changed_after_initialization(false);
-  NOT_IN_PRECOMPILED(result.set_is_declared_in_bytecode(false));
-  NOT_IN_PRECOMPILED(result.set_binary_declaration_offset(0));
+  NOT_IN_PRECOMPILED(result.set_kernel_offset(0));
   result.set_has_pragma(false);
   result.set_static_type_exactness_state(
       StaticTypeExactnessState::NotTracking());
@@ -10298,15 +10265,12 @@
   Field& clone = Field::Handle();
   clone ^= Object::Clone(*this, Heap::kOld);
   clone.SetOriginal(original);
-  clone.InheritBinaryDeclarationFrom(original);
+  clone.InheritKernelOffsetFrom(original);
   return clone.raw();
 }
 
 int32_t Field::SourceFingerprint() const {
 #if !defined(DART_PRECOMPILED_RUNTIME)
-  if (is_declared_in_bytecode()) {
-    return 0;  // TODO(37353): Implement or remove.
-  }
   return kernel::KernelSourceFingerprintHelper::CalculateFieldFingerprint(
       *this);
 #else
@@ -10647,6 +10611,14 @@
 ObjectPtr Field::EvaluateInitializer() const {
   Thread* const thread = Thread::Current();
   ASSERT(thread->IsMutatorThread());
+
+#if !defined(DART_PRECOMPILED_RUNTIME)
+  if (is_static() && is_const()) {
+    ASSERT(!FLAG_precompiled_mode);
+    return kernel::EvaluateStaticConstFieldInitializer(*this);
+  }
+#endif  // !defined(DART_PRECOMPILED_RUNTIME)
+
   NoOOBMessageScope no_msg_scope(thread);
   NoReloadScope no_reload_scope(thread->isolate(), thread);
   const Function& initializer = Function::Handle(EnsureInitializerFunction());
@@ -11202,7 +11174,6 @@
   LookupSourceAndLineStarts(zone);
   if (line_starts() == TypedData::null()) {
     // Scripts in the AOT snapshot do not have a line starts array.
-    // Neither do some scripts coming from bytecode.
     // A well-formed line number array has a leading null.
     info.Add(line_separator);  // New line.
     return info.raw();
@@ -11323,8 +11294,7 @@
 
   Zone* zone = Thread::Current()->zone();
   TypedData& line_starts_data = TypedData::Handle(zone, line_starts());
-  // Scripts loaded from bytecode may have null line_starts().
-  if (line_starts_data.IsNull()) return false;
+  ASSERT(!line_starts_data.IsNull());
 
   kernel::KernelLineStartsReader line_starts_reader(line_starts_data, zone);
   line_starts_reader.LocationForPosition(target_token_pos.value(), line,
@@ -11364,7 +11334,6 @@
   LookupSourceAndLineStarts(zone);
   if (line_starts() == TypedData::null()) {
     // Scripts in the AOT snapshot do not have a line starts array.
-    // Neither do some scripts coming from bytecode.
     *line = -1;
     if (column != NULL) {
       *column = -1;
@@ -11407,7 +11376,6 @@
   LookupSourceAndLineStarts(zone);
   if (line_starts() == TypedData::null()) {
     // Scripts in the AOT snapshot do not have a line starts array.
-    // Neither do some scripts coming from bytecode.
     *first_token_index = TokenPosition::kNoSource;
     *last_token_index = TokenPosition::kNoSource;
     return;
@@ -11434,7 +11402,6 @@
 StringPtr Script::GetLine(intptr_t line_number, Heap::Space space) const {
   const String& src = String::Handle(Source());
   if (src.IsNull()) {
-    ASSERT(Dart::vm_snapshot_kind() == Snapshot::kFullAOT);
     return Symbols::OptimizedOut().raw();
   }
   intptr_t relative_line_number = line_number - line_offset();
@@ -11755,8 +11722,7 @@
 void Library::AddMetadata(const Object& owner,
                           const String& name,
                           TokenPosition token_pos,
-                          intptr_t kernel_offset,
-                          intptr_t bytecode_offset) const {
+                          intptr_t kernel_offset) const {
 #if defined(DART_PRECOMPILED_RUNTIME)
   UNREACHABLE();
 #else
@@ -11773,12 +11739,7 @@
   field.SetFieldType(Object::dynamic_type());
   field.set_is_reflectable(false);
   field.SetStaticValue(Array::empty_array(), true);
-  if (bytecode_offset > 0) {
-    field.set_is_declared_in_bytecode(true);
-    field.set_bytecode_offset(bytecode_offset);
-  } else {
-    field.set_kernel_offset(kernel_offset);
-  }
+  field.set_kernel_offset(kernel_offset);
   GrowableObjectArray& metadata =
       GrowableObjectArray::Handle(zone, this->metadata());
   metadata.Add(field, Heap::kOld);
@@ -11788,39 +11749,36 @@
 void Library::AddClassMetadata(const Class& cls,
                                const Object& tl_owner,
                                TokenPosition token_pos,
-                               intptr_t kernel_offset,
-                               intptr_t bytecode_offset) const {
+                               intptr_t kernel_offset) const {
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
   // We use the toplevel class as the owner of a class's metadata field because
   // a class's metadata is in scope of the library, not the class.
   AddMetadata(tl_owner,
               String::Handle(zone, MakeClassMetaName(thread, zone, cls)),
-              token_pos, kernel_offset, bytecode_offset);
+              token_pos, kernel_offset);
 }
 
 void Library::AddFieldMetadata(const Field& field,
                                TokenPosition token_pos,
-                               intptr_t kernel_offset,
-                               intptr_t bytecode_offset) const {
+                               intptr_t kernel_offset) const {
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
   const auto& owner = Object::Handle(zone, field.RawOwner());
   const auto& name =
       String::Handle(zone, MakeFieldMetaName(thread, zone, field));
-  AddMetadata(owner, name, token_pos, kernel_offset, bytecode_offset);
+  AddMetadata(owner, name, token_pos, kernel_offset);
 }
 
 void Library::AddFunctionMetadata(const Function& func,
                                   TokenPosition token_pos,
-                                  intptr_t kernel_offset,
-                                  intptr_t bytecode_offset) const {
+                                  intptr_t kernel_offset) const {
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
   const auto& owner = Object::Handle(zone, func.RawOwner());
   const auto& name =
       String::Handle(zone, MakeFunctionMetaName(thread, zone, func));
-  AddMetadata(owner, name, token_pos, kernel_offset, bytecode_offset);
+  AddMetadata(owner, name, token_pos, kernel_offset);
 }
 
 void Library::AddTypeParameterMetadata(const TypeParameter& param,
@@ -11830,15 +11788,13 @@
   const auto& owner = Class::Handle(zone, param.parameterized_class());
   const auto& name =
       String::Handle(zone, MakeTypeParameterMetaName(thread, zone, param));
-  AddMetadata(owner, name, token_pos, 0, 0);
+  AddMetadata(owner, name, token_pos, 0);
 }
 
 void Library::AddLibraryMetadata(const Object& tl_owner,
                                  TokenPosition token_pos,
-                                 intptr_t kernel_offset,
-                                 intptr_t bytecode_offset) const {
-  AddMetadata(tl_owner, Symbols::TopLevel(), token_pos, kernel_offset,
-              bytecode_offset);
+                                 intptr_t kernel_offset) const {
+  AddMetadata(tl_owner, Symbols::TopLevel(), token_pos, kernel_offset);
 }
 
 StringPtr Library::MakeMetadataName(const Object& obj) const {
@@ -11882,13 +11838,8 @@
   const Field& from_field =
       Field::Handle(from_library.GetMetadataField(metaname));
   if (!from_field.IsNull()) {
-    if (from_field.is_declared_in_bytecode()) {
-      AddFunctionMetadata(to_fun, from_field.token_pos(), 0,
-                          from_field.bytecode_offset());
-    } else {
-      AddFunctionMetadata(to_fun, from_field.token_pos(),
-                          from_field.kernel_offset(), 0);
-    }
+    AddFunctionMetadata(to_fun, from_field.token_pos(),
+                        from_field.kernel_offset());
   }
 }
 
@@ -11916,13 +11867,9 @@
   }
   Object& metadata = Object::Handle(field.StaticValue());
   if (metadata.raw() == Object::empty_array().raw()) {
-    if (field.is_declared_in_bytecode()) {
-      metadata = kernel::BytecodeReader::ReadAnnotation(field);
-    } else {
-      ASSERT(field.kernel_offset() > 0);
-      metadata = kernel::EvaluateMetadata(
-          field, /* is_annotations_offset = */ obj.IsLibrary());
-    }
+    ASSERT(field.kernel_offset() > 0);
+    metadata = kernel::EvaluateMetadata(
+        field, /* is_annotations_offset = */ obj.IsLibrary());
     if (metadata.IsArray() || metadata.IsNull()) {
       ASSERT(metadata.raw() != Object::empty_array().raw());
       if (!Compiler::IsBackgroundCompilation()) {
@@ -11940,22 +11887,6 @@
 #endif  // defined(DART_PRECOMPILED_RUNTIME)
 }
 
-ArrayPtr Library::GetExtendedMetadata(const Object& obj, intptr_t count) const {
-#if defined(DART_PRECOMPILED_RUNTIME)
-  return Object::empty_array().raw();
-#else
-  RELEASE_ASSERT(obj.IsFunction() || obj.IsLibrary());
-  const String& metaname = String::Handle(MakeMetadataName(obj));
-  Field& field = Field::Handle(GetMetadataField(metaname));
-  if (field.IsNull()) {
-    // There is no metadata for this object.
-    return Object::empty_array().raw();
-  }
-  ASSERT(field.is_declared_in_bytecode());
-  return kernel::BytecodeReader::ReadExtendedAnnotations(field, count);
-#endif  // defined(DART_PRECOMPILED_RUNTIME)
-}
-
 static bool ShouldBePrivate(const String& name) {
   return (name.Length() >= 1 && name.CharAt(0) == '_') ||
          (name.Length() >= 5 &&
@@ -12337,7 +12268,7 @@
       // are not included above, but can be referenced through a library's
       // anonymous classes. Example: dart-core:identical.dart.
       Function& func = Function::Handle();
-      Array& functions = Array::Handle(cls.functions());
+      Array& functions = Array::Handle(cls.current_functions());
       for (intptr_t j = 0; j < functions.Length(); j++) {
         func ^= functions.At(j);
         if (func.is_external()) {
@@ -12807,8 +12738,7 @@
     result.set_debuggable(true);
   }
   result.set_is_dart_scheme(dart_scheme);
-  NOT_IN_PRECOMPILED(result.set_is_declared_in_bytecode(false));
-  NOT_IN_PRECOMPILED(result.set_binary_declaration_offset(0));
+  NOT_IN_PRECOMPILED(result.set_kernel_offset(0));
   result.StoreNonPointer(&result.raw_ptr()->load_state_,
                          LibraryLayout::kAllocated);
   result.StoreNonPointer(&result.raw_ptr()->index_, -1);
@@ -12848,6 +12778,7 @@
 
 // Invoke the function, or noSuchMethod if it is null.
 static ObjectPtr InvokeInstanceFunction(
+    Thread* thread,
     const Instance& receiver,
     const Function& function,
     const String& target_name,
@@ -12861,7 +12792,7 @@
   if (function.IsNull() ||
       !function.AreValidArguments(args_descriptor, nullptr) ||
       (respect_reflectable && !function.is_reflectable())) {
-    return DartEntry::InvokeNoSuchMethod(receiver, target_name, args,
+    return DartEntry::InvokeNoSuchMethod(thread, receiver, target_name, args,
                                          args_descriptor_array);
   }
   if (!function.CanReceiveDynamicInvocation()) {
@@ -13050,7 +12981,7 @@
           zone,
           CreateCallableArgumentsFromStatic(zone, Instance::Cast(getter_result),
                                             args, arg_names, args_descriptor));
-      return InvokeCallableWithChecks(zone, call_args,
+      return DartEntry::InvokeClosure(thread, call_args,
                                       call_args_descriptor_array);
     }
   }
@@ -13147,7 +13078,8 @@
     const String& klass,
     const Array& arguments,
     const TypeArguments& type_arguments) {
-  Zone* zone = Thread::Current()->zone();
+  Thread* thread = Thread::Current();
+  Zone* zone = thread->zone();
 #if defined(DART_PRECOMPILED_RUNTIME)
   const String& error_str = String::Handle(
       zone,
@@ -13192,18 +13124,6 @@
     result = DartEntry::InvokeFunction(callee, real_arguments, args_desc);
   }
 
-  if (callee.is_declared_in_bytecode()) {
-    // Expression evaluation binary expires immediately after evaluation is
-    // finished. However, hot reload may still find corresponding
-    // KernelProgramInfo object in the heap and it would try to patch it.
-    // To prevent accessing stale kernel binary in ResetObjectTable, bytecode
-    // component of the callee's KernelProgramInfo is reset here.
-    const auto& script = Script::Handle(zone, callee.script());
-    const auto& info =
-        KernelProgramInfo::Handle(zone, script.kernel_program_info());
-    info.set_bytecode_component(Object::null_array());
-  }
-
   return result.raw();
 #endif
 }
@@ -13883,11 +13803,6 @@
   return result.raw();
 }
 
-void KernelProgramInfo::set_bytecode_component(
-    const Array& bytecode_component) const {
-  StorePointer(&raw_ptr()->bytecode_component_, bytecode_component.raw());
-}
-
 ErrorPtr Library::CompileAll(bool ignore_error /* = false */) {
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
@@ -13968,33 +13883,6 @@
   return Error::null();
 }
 
-ErrorPtr Library::ReadAllBytecode() {
-  Thread* thread = Thread::Current();
-  ASSERT(thread->IsMutatorThread());
-  Zone* zone = thread->zone();
-  Error& error = Error::Handle(zone);
-  const GrowableObjectArray& libs = GrowableObjectArray::Handle(
-      Isolate::Current()->object_store()->libraries());
-  Library& lib = Library::Handle(zone);
-  Class& cls = Class::Handle(zone);
-  for (int i = 0; i < libs.Length(); i++) {
-    lib ^= libs.At(i);
-    ClassDictionaryIterator it(lib, ClassDictionaryIterator::kIteratePrivate);
-    while (it.HasNext()) {
-      cls = it.GetNextClass();
-      error = cls.EnsureIsFinalized(thread);
-      if (!error.IsNull()) {
-        return error.raw();
-      }
-      error = Compiler::ReadAllBytecode(cls);
-      if (!error.IsNull()) {
-        return error.raw();
-      }
-    }
-  }
-
-  return Error::null();
-}
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
 
 // Return Function::null() if function does not exist in libs.
@@ -14255,8 +14143,7 @@
   for (intptr_t i = 0; i < Length(); i++) {
     intptr_t offset = OffsetFromIndex(i);
     THR_Print("  [pp+0x%" Px "] ", offset);
-    if ((TypeAt(i) == EntryType::kTaggedObject) ||
-        (TypeAt(i) == EntryType::kNativeEntryData)) {
+    if (TypeAt(i) == EntryType::kTaggedObject) {
       const Object& obj = Object::Handle(ObjectAt(i));
       THR_Print("%s (obj)\n", obj.ToCString());
     } else if (TypeAt(i) == EntryType::kNativeFunction) {
@@ -14974,43 +14861,6 @@
 #undef FORMAT2
 }
 
-void ParameterTypeCheck::set_type_or_bound(const AbstractType& value) const {
-  StorePointer(&raw_ptr()->type_or_bound_, value.raw());
-}
-
-void ParameterTypeCheck::set_param(const AbstractType& value) const {
-  StorePointer(&raw_ptr()->param_, value.raw());
-}
-
-void ParameterTypeCheck::set_name(const String& value) const {
-  StorePointer(&raw_ptr()->name_, value.raw());
-}
-
-void ParameterTypeCheck::set_cache(const SubtypeTestCache& value) const {
-  StorePointer(&raw_ptr()->cache_, value.raw());
-}
-
-const char* ParameterTypeCheck::ToCString() const {
-  Zone* zone = Thread::Current()->zone();
-  return zone->PrintToString("ParameterTypeCheck(%" Pd " %s %s %s)", index(),
-                             Object::Handle(zone, param()).ToCString(),
-                             Object::Handle(zone, type_or_bound()).ToCString(),
-                             Object::Handle(zone, name()).ToCString());
-}
-
-ParameterTypeCheckPtr ParameterTypeCheck::New() {
-  ParameterTypeCheck& result = ParameterTypeCheck::Handle();
-  {
-    ObjectPtr raw =
-        Object::Allocate(ParameterTypeCheck::kClassId,
-                         ParameterTypeCheck::InstanceSize(), Heap::kOld);
-    NoSafepointScope no_safepoint;
-    result ^= raw;
-  }
-  result.set_index(0);
-  return result.raw();
-}
-
 void SingleTargetCache::set_target(const Code& value) const {
   StorePointer(&raw_ptr()->target_, value.raw());
 }
@@ -17104,235 +16954,6 @@
   reader.DumpSourcePositions(relative_addresses ? 0 : PayloadStart());
 }
 
-void Bytecode::Disassemble(DisassemblyFormatter* formatter) const {
-#if !defined(PRODUCT) || defined(FORCE_INCLUDE_DISASSEMBLER)
-#if !defined(DART_PRECOMPILED_RUNTIME)
-  if (!FLAG_support_disassembler) {
-    return;
-  }
-  uword start = PayloadStart();
-  intptr_t size = Size();
-  if (formatter == NULL) {
-    KernelBytecodeDisassembler::Disassemble(start, start + size, *this);
-  } else {
-    KernelBytecodeDisassembler::Disassemble(start, start + size, formatter,
-                                            *this);
-  }
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-#endif  // !defined(PRODUCT) || defined(FORCE_INCLUDE_DISASSEMBLER)
-}
-
-BytecodePtr Bytecode::New(uword instructions,
-                          intptr_t instructions_size,
-                          intptr_t instructions_offset,
-                          const ObjectPool& object_pool) {
-  ASSERT(Object::bytecode_class() != Class::null());
-  Bytecode& result = Bytecode::Handle();
-  {
-    uword size = Bytecode::InstanceSize();
-    ObjectPtr raw = Object::Allocate(Bytecode::kClassId, size, Heap::kOld);
-    NoSafepointScope no_safepoint;
-    result ^= raw;
-    result.set_instructions(instructions);
-    result.set_instructions_size(instructions_size);
-    result.set_object_pool(object_pool);
-    result.set_pc_descriptors(Object::empty_descriptors());
-    result.set_instructions_binary_offset(instructions_offset);
-    result.set_source_positions_binary_offset(0);
-    result.set_local_variables_binary_offset(0);
-  }
-  return result.raw();
-}
-
-ExternalTypedDataPtr Bytecode::GetBinary(Zone* zone) const {
-  const Function& func = Function::Handle(zone, function());
-  if (func.IsNull()) {
-    return ExternalTypedData::null();
-  }
-  const Script& script = Script::Handle(zone, func.script());
-  const KernelProgramInfo& info =
-      KernelProgramInfo::Handle(zone, script.kernel_program_info());
-  return info.metadata_payloads();
-}
-
-TokenPosition Bytecode::GetTokenIndexOfPC(uword return_address) const {
-#if defined(DART_PRECOMPILED_RUNTIME)
-  UNREACHABLE();
-#else
-  if (!HasSourcePositions()) {
-    return TokenPosition::kNoSource;
-  }
-  uword pc_offset = return_address - PayloadStart();
-  // pc_offset could equal to bytecode size if the last instruction is Throw.
-  ASSERT(pc_offset <= static_cast<uword>(Size()));
-  kernel::BytecodeSourcePositionsIterator iter(Thread::Current()->zone(),
-                                               *this);
-  TokenPosition token_pos = TokenPosition::kNoSource;
-  while (iter.MoveNext()) {
-    if (pc_offset <= iter.PcOffset()) {
-      break;
-    }
-    token_pos = iter.TokenPos();
-  }
-  return token_pos;
-#endif
-}
-
-intptr_t Bytecode::GetTryIndexAtPc(uword return_address) const {
-#if defined(DART_PRECOMPILED_RUNTIME)
-  UNREACHABLE();
-#else
-  intptr_t try_index = -1;
-  const uword pc_offset = return_address - PayloadStart();
-  const PcDescriptors& descriptors = PcDescriptors::Handle(pc_descriptors());
-  PcDescriptors::Iterator iter(descriptors, PcDescriptorsLayout::kAnyKind);
-  while (iter.MoveNext()) {
-    // PC descriptors for try blocks in bytecode are generated in pairs,
-    // marking start and end of a try block.
-    // See BytecodeReaderHelper::ReadExceptionsTable for details.
-    const intptr_t current_try_index = iter.TryIndex();
-    const uword start_pc = iter.PcOffset();
-    if (pc_offset < start_pc) {
-      break;
-    }
-    const bool has_next = iter.MoveNext();
-    ASSERT(has_next);
-    const uword end_pc = iter.PcOffset();
-    if (start_pc <= pc_offset && pc_offset < end_pc) {
-      ASSERT(try_index < current_try_index);
-      try_index = current_try_index;
-    }
-  }
-  return try_index;
-#endif
-}
-
-uword Bytecode::GetFirstDebugCheckOpcodePc() const {
-#if defined(DART_PRECOMPILED_RUNTIME)
-  UNREACHABLE();
-#else
-  uword pc = PayloadStart();
-  const uword end_pc = pc + Size();
-  while (pc < end_pc) {
-    if (KernelBytecode::IsDebugCheckOpcode(
-            reinterpret_cast<const KBCInstr*>(pc))) {
-      return pc;
-    }
-    pc = KernelBytecode::Next(pc);
-  }
-  return 0;
-#endif
-}
-
-uword Bytecode::GetDebugCheckedOpcodeReturnAddress(uword from_offset,
-                                                   uword to_offset) const {
-#if defined(DART_PRECOMPILED_RUNTIME)
-  UNREACHABLE();
-#else
-  uword pc = PayloadStart() + from_offset;
-  const uword end_pc = pc + (to_offset - from_offset);
-  while (pc < end_pc) {
-    uword next_pc = KernelBytecode::Next(pc);
-    if (KernelBytecode::IsDebugCheckedOpcode(
-            reinterpret_cast<const KBCInstr*>(pc))) {
-      // Return the pc after the opcode, i.e. its 'return address'.
-      return next_pc;
-    }
-    pc = next_pc;
-  }
-  return 0;
-#endif
-}
-
-const char* Bytecode::ToCString() const {
-  return Thread::Current()->zone()->PrintToString("Bytecode(%s)",
-                                                  QualifiedName());
-}
-
-static const char* BytecodeStubName(const Bytecode& bytecode) {
-  if (bytecode.raw() == Object::implicit_getter_bytecode().raw()) {
-    return "[Bytecode Stub] VMInternal_ImplicitGetter";
-  } else if (bytecode.raw() == Object::implicit_setter_bytecode().raw()) {
-    return "[Bytecode Stub] VMInternal_ImplicitSetter";
-  } else if (bytecode.raw() ==
-             Object::implicit_static_getter_bytecode().raw()) {
-    return "[Bytecode Stub] VMInternal_ImplicitStaticGetter";
-  } else if (bytecode.raw() == Object::method_extractor_bytecode().raw()) {
-    return "[Bytecode Stub] VMInternal_MethodExtractor";
-  } else if (bytecode.raw() == Object::invoke_closure_bytecode().raw()) {
-    return "[Bytecode Stub] VMInternal_InvokeClosure";
-  } else if (bytecode.raw() == Object::invoke_field_bytecode().raw()) {
-    return "[Bytecode Stub] VMInternal_InvokeField";
-  }
-  return "[unknown stub]";
-}
-
-const char* Bytecode::Name() const {
-  Zone* zone = Thread::Current()->zone();
-  const Function& fun = Function::Handle(zone, function());
-  if (fun.IsNull()) {
-    return BytecodeStubName(*this);
-  }
-  const char* function_name =
-      String::Handle(zone, fun.UserVisibleName()).ToCString();
-  return zone->PrintToString("[Bytecode] %s", function_name);
-}
-
-const char* Bytecode::QualifiedName() const {
-  Zone* zone = Thread::Current()->zone();
-  const Function& fun = Function::Handle(zone, function());
-  if (fun.IsNull()) {
-    return BytecodeStubName(*this);
-  }
-  const char* function_name =
-      String::Handle(zone, fun.QualifiedScrubbedName()).ToCString();
-  return zone->PrintToString("[Bytecode] %s", function_name);
-}
-
-const char* Bytecode::FullyQualifiedName() const {
-  Zone* zone = Thread::Current()->zone();
-  const Function& fun = Function::Handle(zone, function());
-  if (fun.IsNull()) {
-    return BytecodeStubName(*this);
-  }
-  const char* function_name = fun.ToFullyQualifiedCString();
-  return zone->PrintToString("[Bytecode] %s", function_name);
-}
-
-bool Bytecode::SlowFindRawBytecodeVisitor::FindObject(ObjectPtr raw_obj) const {
-  return BytecodeLayout::ContainsPC(raw_obj, pc_);
-}
-
-BytecodePtr Bytecode::FindCode(uword pc) {
-  Thread* thread = Thread::Current();
-  HeapIterationScope heap_iteration_scope(thread);
-  SlowFindRawBytecodeVisitor visitor(pc);
-  ObjectPtr needle = thread->heap()->FindOldObject(&visitor);
-  if (needle != Bytecode::null()) {
-    return static_cast<BytecodePtr>(needle);
-  }
-  return Bytecode::null();
-}
-
-LocalVarDescriptorsPtr Bytecode::GetLocalVarDescriptors() const {
-#if defined(PRODUCT) || defined(DART_PRECOMPILED_RUNTIME)
-  UNREACHABLE();
-  return LocalVarDescriptors::null();
-#else
-  Zone* zone = Thread::Current()->zone();
-  auto& var_descs = LocalVarDescriptors::Handle(zone, var_descriptors());
-  if (var_descs.IsNull()) {
-    const auto& func = Function::Handle(zone, function());
-    ASSERT(!func.IsNull());
-    var_descs =
-        kernel::BytecodeReader::ComputeLocalVarDescriptors(zone, func, *this);
-    ASSERT(!var_descs.IsNull());
-    set_var_descriptors(var_descs);
-  }
-  return var_descs.raw();
-#endif
-}
-
 intptr_t Context::GetLevel() const {
   intptr_t level = 0;
   Context& parent_ctx = Context::Handle(parent());
@@ -18239,8 +17860,8 @@
       zone,
       ArgumentsDescriptor::NewBoxed(kTypeArgsLen, args.Length(), Heap::kNew));
 
-  return InvokeInstanceFunction(*this, function, internal_getter_name, args,
-                                args_descriptor, respect_reflectable,
+  return InvokeInstanceFunction(thread, *this, function, internal_getter_name,
+                                args, args_descriptor, respect_reflectable,
                                 inst_type_args);
 }
 
@@ -18286,8 +17907,8 @@
       zone,
       ArgumentsDescriptor::NewBoxed(kTypeArgsLen, args.Length(), Heap::kNew));
 
-  return InvokeInstanceFunction(*this, setter, internal_setter_name, args,
-                                args_descriptor, respect_reflectable,
+  return InvokeInstanceFunction(thread, *this, setter, internal_setter_name,
+                                args, args_descriptor, respect_reflectable,
                                 inst_type_args);
 }
 
@@ -18338,7 +17959,7 @@
           zone, ArgumentsDescriptor::NewBoxed(
                     kTypeArgsLen, getter_args.Length(), Heap::kNew));
       const Object& getter_result = Object::Handle(
-          zone, InvokeInstanceFunction(*this, function, getter_name,
+          zone, InvokeInstanceFunction(thread, *this, function, getter_name,
                                        getter_args, getter_args_descriptor,
                                        respect_reflectable, inst_type_args));
       if (getter_result.IsError()) {
@@ -18346,12 +17967,12 @@
       }
       // Replace the closure as the receiver in the arguments list.
       args.SetAt(0, getter_result);
-      return InvokeCallableWithChecks(zone, args, args_descriptor);
+      return DartEntry::InvokeClosure(thread, args, args_descriptor);
     }
   }
 
   // Found an ordinary method.
-  return InvokeInstanceFunction(*this, function, function_name, args,
+  return InvokeInstanceFunction(thread, *this, function, function_name, args,
                                 args_descriptor, respect_reflectable,
                                 inst_type_args);
 }
@@ -19024,6 +18645,8 @@
     case kArrayCid:
     case kImmutableArrayCid:
       return Array::kBytesPerElement;
+    case kTypeArgumentsCid:
+      return TypeArguments::ArrayTraits::kElementSize;
     case kOneByteStringCid:
       return OneByteString::kBytesPerElement;
     case kTwoByteStringCid:
@@ -19050,6 +18673,8 @@
     case kArrayCid:
     case kImmutableArrayCid:
       return Array::data_offset();
+    case kTypeArgumentsCid:
+      return TypeArguments::types_offset();
     case kOneByteStringCid:
       return OneByteString::data_offset();
     case kTwoByteStringCid:
@@ -21009,6 +20634,10 @@
   StorePointer(&raw_ptr()->bound_, value.raw());
 }
 
+void TypeParameter::set_default_argument(const AbstractType& value) const {
+  StorePointer(&raw_ptr()->default_argument_, value.raw());
+}
+
 AbstractTypePtr TypeParameter::GetFromTypeArguments(
     const TypeArguments& instantiator_type_arguments,
     const TypeArguments& function_type_arguments) const {
@@ -22224,7 +21853,7 @@
                               intptr_t len,
                               void* peer,
                               intptr_t external_allocation_size,
-                              Dart_WeakPersistentHandleFinalizer callback,
+                              Dart_HandleFinalizer callback,
                               Heap::Space space) {
   return ExternalOneByteString::New(characters, len, peer,
                                     external_allocation_size, callback, space);
@@ -22234,7 +21863,7 @@
                               intptr_t len,
                               void* peer,
                               intptr_t external_allocation_size,
-                              Dart_WeakPersistentHandleFinalizer callback,
+                              Dart_HandleFinalizer callback,
                               Heap::Space space) {
   return ExternalTwoByteString::New(characters, len, peer,
                                     external_allocation_size, callback, space);
@@ -22618,11 +22247,10 @@
   Utf8::Encode(*this, reinterpret_cast<char*>(utf8_array), array_len);
 }
 
-static FinalizablePersistentHandle* AddFinalizer(
-    const Object& referent,
-    void* peer,
-    Dart_WeakPersistentHandleFinalizer callback,
-    intptr_t external_size) {
+static FinalizablePersistentHandle* AddFinalizer(const Object& referent,
+                                                 void* peer,
+                                                 Dart_HandleFinalizer callback,
+                                                 intptr_t external_size) {
   ASSERT(callback != NULL);
   return FinalizablePersistentHandle::New(Isolate::Current(), referent, peer,
                                           callback, external_size,
@@ -23235,7 +22863,7 @@
     intptr_t len,
     void* peer,
     intptr_t external_allocation_size,
-    Dart_WeakPersistentHandleFinalizer callback,
+    Dart_HandleFinalizer callback,
     Heap::Space space) {
   ASSERT(Isolate::Current()->object_store()->external_one_byte_string_class() !=
          Class::null());
@@ -23264,7 +22892,7 @@
     intptr_t len,
     void* peer,
     intptr_t external_allocation_size,
-    Dart_WeakPersistentHandleFinalizer callback,
+    Dart_HandleFinalizer callback,
     Heap::Space space) {
   ASSERT(Isolate::Current()->object_store()->external_two_byte_string_class() !=
          Class::null());
@@ -24037,7 +23665,7 @@
 
 FinalizablePersistentHandle* ExternalTypedData::AddFinalizer(
     void* peer,
-    Dart_WeakPersistentHandleFinalizer callback,
+    Dart_HandleFinalizer callback,
     intptr_t external_size) const {
   return dart::AddFinalizer(*this, peer, callback, external_size);
 }
@@ -24075,10 +23703,7 @@
   ExternalTypedData& result = ExternalTypedData::Handle(ExternalTypedData::New(
       kExternalTypedDataUint8ArrayCid, data, len, Heap::kOld));
   result.AddFinalizer(
-      data,
-      [](void* isolate_callback_data, Dart_WeakPersistentHandle handle,
-         void* data) { free(data); },
-      len);
+      data, [](void* isolate_callback_data, void* data) { free(data); }, len);
   return result.raw();
 }
 
@@ -24188,6 +23813,7 @@
 }
 
 ReceivePortPtr ReceivePort::New(Dart_Port id,
+                                const String& debug_name,
                                 bool is_control_port,
                                 Heap::Space space) {
   ASSERT(id != ILLEGAL_PORT);
@@ -24195,6 +23821,10 @@
   Zone* zone = thread->zone();
   const SendPort& send_port =
       SendPort::Handle(zone, SendPort::New(id, thread->isolate()->origin_id()));
+#if !defined(PRODUCT)
+  const StackTrace& allocation_location_ =
+      HasStack() ? GetCurrentStackTrace(0) : StackTrace::Handle();
+#endif  // !defined(PRODUCT)
 
   ReceivePort& result = ReceivePort::Handle(zone);
   {
@@ -24203,6 +23833,11 @@
     NoSafepointScope no_safepoint;
     result ^= raw;
     result.StorePointer(&result.raw_ptr()->send_port_, send_port.raw());
+#if !defined(PRODUCT)
+    result.StorePointer(&result.raw_ptr()->debug_name_, debug_name.raw());
+    result.StorePointer(&result.raw_ptr()->allocation_location_,
+                        allocation_location_.raw());
+#endif  // !defined(PRODUCT)
   }
   if (is_control_port) {
     PortMap::SetPortState(id, PortMap::kControlPort);
@@ -24273,6 +23908,39 @@
   return "TransferableTypedData";
 }
 
+bool Closure::CanonicalizeEquals(const Instance& other) const {
+  if (!other.IsClosure()) return false;
+
+  const Closure& other_closure = Closure::Cast(other);
+  return (instantiator_type_arguments() ==
+          other_closure.instantiator_type_arguments()) &&
+         (function_type_arguments() ==
+          other_closure.function_type_arguments()) &&
+         (delayed_type_arguments() == other_closure.delayed_type_arguments()) &&
+         (function() == other_closure.function()) &&
+         (context() == other_closure.context());
+}
+
+void Closure::CanonicalizeFieldsLocked(Thread* thread) const {
+  TypeArguments& type_args = TypeArguments::Handle();
+  type_args = instantiator_type_arguments();
+  if (!type_args.IsNull()) {
+    type_args = type_args.Canonicalize(thread, nullptr);
+    set_instantiator_type_arguments(type_args);
+  }
+  type_args = function_type_arguments();
+  if (!type_args.IsNull()) {
+    type_args = type_args.Canonicalize(thread, nullptr);
+    set_function_type_arguments(type_args);
+  }
+  type_args = delayed_type_arguments();
+  if (!type_args.IsNull()) {
+    type_args = type_args.Canonicalize(thread, nullptr);
+    set_delayed_type_arguments(type_args);
+  }
+  // Ignore function, context, hash.
+}
+
 intptr_t Closure::NumTypeParameters(Thread* thread) const {
   // Only check for empty here, as the null TAV is used to mean that the
   // closed-over delayed type parameters were all of dynamic type.
@@ -24285,16 +23953,18 @@
 }
 
 const char* Closure::ToCString() const {
-  Zone* zone = Thread::Current()->zone();
+  auto const thread = Thread::Current();
+  auto const zone = thread->zone();
+  ZoneTextBuffer buffer(zone);
+  buffer.AddString("Closure: ");
   const Function& fun = Function::Handle(zone, function());
-  const bool is_implicit_closure = fun.IsImplicitClosureFunction();
   const Function& sig_fun =
       Function::Handle(zone, GetInstantiatedSignature(zone));
-  const char* fun_sig =
-      String::Handle(zone, sig_fun.UserVisibleSignature()).ToCString();
-  const char* from = is_implicit_closure ? " from " : "";
-  const char* fun_desc = is_implicit_closure ? fun.ToCString() : "";
-  return OS::SCreate(zone, "Closure: %s%s%s", fun_sig, from, fun_desc);
+  sig_fun.PrintSignature(NameVisibility::kUserVisibleName, &buffer);
+  if (fun.IsImplicitClosureFunction()) {
+    buffer.Printf(" from %s", fun.ToCString());
+  }
+  return buffer.buffer();
 }
 
 int64_t Closure::ComputeHash() const {
@@ -24589,7 +24259,6 @@
   auto& function = Function::Handle(zone);
   auto& code_object = Object::Handle(zone);
   auto& code = Code::Handle(zone);
-  auto& bytecode = Bytecode::Handle(zone);
 
   NoSafepointScope no_allocation;
   GrowableArray<const Function*> inlined_functions;
@@ -24663,77 +24332,65 @@
         buffer.AddString("<asynchronous suspension>\n");
       } else {
         intptr_t pc_offset = Smi::Value(stack_trace.PcOffsetAtFrame(i));
-        if (code_object.IsCode()) {
-          code ^= code_object.raw();
-          ASSERT(code.IsFunctionCode());
-          function = code.function();
-          const uword pc = code.PayloadStart() + pc_offset;
+        ASSERT(code_object.IsCode());
+        code ^= code_object.raw();
+        ASSERT(code.IsFunctionCode());
+        function = code.function();
+        const uword pc = code.PayloadStart() + pc_offset;
 #if defined(DART_PRECOMPILED_RUNTIME)
-          // When printing non-symbolic frames, we normally print call
-          // addresses, not return addresses, by subtracting one from the PC to
-          // get an address within the preceding instruction.
-          //
-          // The one exception is a normal closure registered as a listener on a
-          // future. In this case, the returned pc_offset is 0, as the closure
-          // is invoked with the value of the resolved future. Thus, we must
-          // report the return address, as returning a value before the closure
-          // payload will cause failures to decode the frame using DWARF info.
-          const bool is_future_listener = pc_offset == 0;
-          const uword call_addr = is_future_listener ? pc : pc - 1;
-          if (FLAG_dwarf_stack_traces_mode) {
-            // If we have access to the owning function and it would be
-            // invisible in a symbolic stack trace, don't show this frame.
-            // (We can't do the same for inlined functions, though.)
-            if (!FLAG_show_invisible_frames && !function.IsNull() &&
-                !function.is_visible()) {
-              continue;
-            }
-            // This output is formatted like Android's debuggerd. Note debuggerd
-            // prints call addresses instead of return addresses.
-            buffer.Printf("    #%02" Pd " abs %" Pp "", frame_index, call_addr);
-            PrintNonSymbolicStackFrameBody(
-                &buffer, call_addr, isolate_instructions, vm_instructions);
-            frame_index++;
-            continue;
-          } else if (function.IsNull()) {
-            // We can't print the symbolic information since the owner was not
-            // retained, so instead print the static symbol + offset like the
-            // non-symbolic stack traces.
-            PrintSymbolicStackFrameIndex(&buffer, frame_index);
-            PrintNonSymbolicStackFrameBody(
-                &buffer, call_addr, isolate_instructions, vm_instructions);
-            frame_index++;
+        // When printing non-symbolic frames, we normally print call
+        // addresses, not return addresses, by subtracting one from the PC to
+        // get an address within the preceding instruction.
+        //
+        // The one exception is a normal closure registered as a listener on a
+        // future. In this case, the returned pc_offset is 0, as the closure
+        // is invoked with the value of the resolved future. Thus, we must
+        // report the return address, as returning a value before the closure
+        // payload will cause failures to decode the frame using DWARF info.
+        const bool is_future_listener = pc_offset == 0;
+        const uword call_addr = is_future_listener ? pc : pc - 1;
+        if (FLAG_dwarf_stack_traces_mode) {
+          // If we have access to the owning function and it would be
+          // invisible in a symbolic stack trace, don't show this frame.
+          // (We can't do the same for inlined functions, though.)
+          if (!FLAG_show_invisible_frames && !function.IsNull() &&
+              !function.is_visible()) {
             continue;
           }
+          // This output is formatted like Android's debuggerd. Note debuggerd
+          // prints call addresses instead of return addresses.
+          buffer.Printf("    #%02" Pd " abs %" Pp "", frame_index, call_addr);
+          PrintNonSymbolicStackFrameBody(&buffer, call_addr,
+                                         isolate_instructions, vm_instructions);
+          frame_index++;
+          continue;
+        } else if (function.IsNull()) {
+          // We can't print the symbolic information since the owner was not
+          // retained, so instead print the static symbol + offset like the
+          // non-symbolic stack traces.
+          PrintSymbolicStackFrameIndex(&buffer, frame_index);
+          PrintNonSymbolicStackFrameBody(&buffer, call_addr,
+                                         isolate_instructions, vm_instructions);
+          frame_index++;
+          continue;
+        }
 #endif
-          if (code.is_optimized() && stack_trace.expand_inlined()) {
-            code.GetInlinedFunctionsAtReturnAddress(
-                pc_offset, &inlined_functions, &inlined_token_positions);
-            ASSERT(inlined_functions.length() >= 1);
-            for (intptr_t j = inlined_functions.length() - 1; j >= 0; j--) {
-              const auto& inlined = *inlined_functions[j];
-              auto const pos = inlined_token_positions[j];
-              if (FLAG_show_invisible_frames || function.is_visible()) {
-                PrintSymbolicStackFrame(zone, &buffer, inlined, pos,
-                                        frame_index);
-                frame_index++;
-              }
+        if (code.is_optimized() && stack_trace.expand_inlined()) {
+          code.GetInlinedFunctionsAtReturnAddress(pc_offset, &inlined_functions,
+                                                  &inlined_token_positions);
+          ASSERT(inlined_functions.length() >= 1);
+          for (intptr_t j = inlined_functions.length() - 1; j >= 0; j--) {
+            const auto& inlined = *inlined_functions[j];
+            auto const pos = inlined_token_positions[j];
+            if (FLAG_show_invisible_frames || function.is_visible()) {
+              PrintSymbolicStackFrame(zone, &buffer, inlined, pos, frame_index);
+              frame_index++;
             }
-          } else if (FLAG_show_invisible_frames || function.is_visible()) {
-            auto const pos = code.GetTokenIndexOfPC(pc);
-            PrintSymbolicStackFrame(zone, &buffer, function, pos, frame_index);
-            frame_index++;
           }
-        } else {
-          ASSERT(code_object.IsBytecode());
-          bytecode ^= code_object.raw();
-          function = bytecode.function();
-          if (FLAG_show_invisible_frames || function.is_visible()) {
-            uword pc = bytecode.PayloadStart() + pc_offset;
-            auto const pos = bytecode.GetTokenIndexOfPC(pc);
-            PrintSymbolicStackFrame(zone, &buffer, function, pos, frame_index);
-            frame_index++;
-          }
+        } else if (FLAG_show_invisible_frames || function.is_visible()) {
+          auto const pos = code.GetTokenIndexOfPC(pc);
+          PrintSymbolicStackFrame(zone, &buffer, function, pos, frame_index);
+          frame_index++;
         }
       }
     }
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index 230312a..85add6f 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -429,14 +429,6 @@
   V(ExceptionHandlers, empty_exception_handlers)                               \
   V(Array, extractor_parameter_types)                                          \
   V(Array, extractor_parameter_names)                                          \
-  V(Bytecode, implicit_getter_bytecode)                                        \
-  V(Bytecode, implicit_setter_bytecode)                                        \
-  V(Bytecode, implicit_static_getter_bytecode)                                 \
-  V(Bytecode, method_extractor_bytecode)                                       \
-  V(Bytecode, invoke_closure_bytecode)                                         \
-  V(Bytecode, invoke_field_bytecode)                                           \
-  V(Bytecode, nsm_dispatcher_bytecode)                                         \
-  V(Bytecode, dynamic_invocation_forwarder_bytecode)                           \
   V(Instance, sentinel)                                                        \
   V(Instance, transition_sentinel)                                             \
   V(Instance, unknown_constant)                                                \
@@ -486,7 +478,6 @@
     return kernel_program_info_class_;
   }
   static ClassPtr code_class() { return code_class_; }
-  static ClassPtr bytecode_class() { return bytecode_class_; }
   static ClassPtr instructions_class() { return instructions_class_; }
   static ClassPtr instructions_section_class() {
     return instructions_section_class_;
@@ -510,7 +501,6 @@
     return unhandled_exception_class_;
   }
   static ClassPtr unwind_error_class() { return unwind_error_class_; }
-  static ClassPtr dyncalltypecheck_class() { return dyncalltypecheck_class_; }
   static ClassPtr singletargetcache_class() { return singletargetcache_class_; }
   static ClassPtr unlinkedcall_class() { return unlinkedcall_class_; }
   static ClassPtr monomorphicsmiablecall_class() {
@@ -792,7 +782,7 @@
   static ClassPtr kernel_program_info_class_;  // Class of KernelProgramInfo vm
                                                // object.
   static ClassPtr code_class_;                 // Class of the Code vm object.
-  static ClassPtr bytecode_class_;      // Class of the Bytecode vm object.
+
   static ClassPtr instructions_class_;  // Class of the Instructions vm object.
   static ClassPtr instructions_section_class_;  // Class of InstructionsSection.
   static ClassPtr object_pool_class_;      // Class of the ObjectPool vm object.
@@ -804,7 +794,6 @@
   static ClassPtr deopt_info_class_;            // Class of DeoptInfo.
   static ClassPtr context_class_;            // Class of the Context vm object.
   static ClassPtr context_scope_class_;      // Class of ContextScope vm object.
-  static ClassPtr dyncalltypecheck_class_;   // Class of ParameterTypeCheck.
   static ClassPtr singletargetcache_class_;  // Class of SingleTargetCache.
   static ClassPtr unlinkedcall_class_;       // Class of UnlinkedCall.
   static ClassPtr
@@ -922,10 +911,10 @@
 // The NNBDCompiledMode reflects the mode in which constants of the library were
 // compiled by CFE.
 enum class NNBDCompiledMode {
-  kDisabled = 0,
-  kWeak = 1,
-  kStrong = 2,
-  kAgnostic = 3,
+  kWeak = 0,
+  kStrong = 1,
+  kAgnostic = 2,
+  kInvalid = 3,
 };
 
 class Class : public Object {
@@ -1114,6 +1103,10 @@
   // Return true if this class declares type parameters.
   bool IsGeneric() const { return NumTypeParameters(Thread::Current()) > 0; }
 
+  // Returns a canonicalized vector of the type parameters instantiated
+  // to bounds. If non-generic, the empty type arguments vector is returned.
+  TypeArgumentsPtr InstantiateToBounds(Thread* thread) const;
+
   // If this class is parameterized, each instance has a type_arguments field.
   static const intptr_t kNoTypeArguments = -1;
   intptr_t host_type_arguments_field_offset() const {
@@ -1201,6 +1194,8 @@
 
   // Returns the list of classes directly implementing this class.
   GrowableObjectArrayPtr direct_implementors() const {
+    DEBUG_ASSERT(
+        IsolateGroup::Current()->program_lock()->IsCurrentThreadReader());
     return raw_ptr()->direct_implementors_;
   }
   void AddDirectImplementor(const Class& subclass, bool is_mixin) const;
@@ -1208,6 +1203,11 @@
 
   // Returns the list of classes having this class as direct superclass.
   GrowableObjectArrayPtr direct_subclasses() const {
+    DEBUG_ASSERT(
+        IsolateGroup::Current()->program_lock()->IsCurrentThreadReader());
+    return direct_subclasses_unsafe();
+  }
+  GrowableObjectArrayPtr direct_subclasses_unsafe() const {
     return raw_ptr()->direct_subclasses_;
   }
   void AddDirectSubclass(const Class& subclass) const;
@@ -1271,7 +1271,11 @@
   ErrorPtr VerifyEntryPoint() const;
 
   // Returns an array of instance and static fields defined by this class.
-  ArrayPtr fields() const { return raw_ptr()->fields_; }
+  ArrayPtr fields() const {
+    // We rely on the fact that any loads from the array are dependent loads
+    // and avoid the load-acquire barrier here.
+    return raw_ptr()->fields_;
+  }
   void SetFields(const Array& value) const;
   void AddField(const Field& field) const;
   void AddFields(const GrowableArray<const Field*>& fields) const;
@@ -1291,17 +1295,25 @@
   // Returns true if non-static fields are defined.
   bool HasInstanceFields() const;
 
-  // TODO(koda): Unite w/ hash table.
-  ArrayPtr functions() const { return raw_ptr()->functions_; }
+  ArrayPtr current_functions() const {
+    // We rely on the fact that any loads from the array are dependent loads
+    // and avoid the load-acquire barrier here.
+    return raw_ptr()->functions_;
+  }
+  ArrayPtr functions() const {
+    DEBUG_ASSERT(
+        IsolateGroup::Current()->program_lock()->IsCurrentThreadReader());
+    return current_functions();
+  }
   void SetFunctions(const Array& value) const;
   void AddFunction(const Function& function) const;
-  void RemoveFunction(const Function& function) const;
   FunctionPtr FunctionFromIndex(intptr_t idx) const;
   intptr_t FindImplicitClosureFunctionIndex(const Function& needle) const;
   FunctionPtr ImplicitClosureFunctionFromIndex(intptr_t idx) const;
 
-  FunctionPtr LookupDynamicFunction(const String& name) const;
-  FunctionPtr LookupDynamicFunctionAllowAbstract(const String& name) const;
+  FunctionPtr LookupFunctionReadLocked(const String& name) const;
+  FunctionPtr LookupDynamicFunctionUnsafe(const String& name) const;
+
   FunctionPtr LookupDynamicFunctionAllowPrivate(const String& name) const;
   FunctionPtr LookupStaticFunction(const String& name) const;
   FunctionPtr LookupStaticFunctionAllowPrivate(const String& name) const;
@@ -1309,7 +1321,6 @@
   FunctionPtr LookupConstructorAllowPrivate(const String& name) const;
   FunctionPtr LookupFactory(const String& name) const;
   FunctionPtr LookupFactoryAllowPrivate(const String& name) const;
-  FunctionPtr LookupFunction(const String& name) const;
   FunctionPtr LookupFunctionAllowPrivate(const String& name) const;
   FunctionPtr LookupGetterFunction(const String& name) const;
   FunctionPtr LookupSetterFunction(const String& name) const;
@@ -1340,18 +1351,14 @@
     return RoundedAllocationSize(sizeof(ClassLayout));
   }
 
-  bool is_implemented() const {
-    return ImplementedBit::decode(raw_ptr()->state_bits_);
-  }
+  bool is_implemented() const { return ImplementedBit::decode(state_bits()); }
   void set_is_implemented() const;
 
-  bool is_abstract() const {
-    return AbstractBit::decode(raw_ptr()->state_bits_);
-  }
+  bool is_abstract() const { return AbstractBit::decode(state_bits()); }
   void set_is_abstract() const;
 
   ClassLayout::ClassLoadingState class_loading_state() const {
-    return ClassLoadingBits::decode(raw_ptr()->state_bits_);
+    return ClassLoadingBits::decode(state_bits());
   }
 
   bool is_declaration_loaded() const {
@@ -1365,35 +1372,35 @@
   void set_is_type_finalized() const;
 
   bool is_synthesized_class() const {
-    return SynthesizedClassBit::decode(raw_ptr()->state_bits_);
+    return SynthesizedClassBit::decode(state_bits());
   }
   void set_is_synthesized_class() const;
 
-  bool is_enum_class() const { return EnumBit::decode(raw_ptr()->state_bits_); }
+  bool is_enum_class() const { return EnumBit::decode(state_bits()); }
   void set_is_enum_class() const;
 
   bool is_finalized() const {
-    return ClassFinalizedBits::decode(raw_ptr()->state_bits_) ==
+    return ClassFinalizedBits::decode(state_bits()) ==
                ClassLayout::kFinalized ||
-           ClassFinalizedBits::decode(raw_ptr()->state_bits_) ==
+           ClassFinalizedBits::decode(state_bits()) ==
                ClassLayout::kAllocateFinalized;
   }
   void set_is_finalized() const;
 
   bool is_allocate_finalized() const {
-    return ClassFinalizedBits::decode(raw_ptr()->state_bits_) ==
+    return ClassFinalizedBits::decode(state_bits()) ==
            ClassLayout::kAllocateFinalized;
   }
   void set_is_allocate_finalized() const;
 
   bool is_prefinalized() const {
-    return ClassFinalizedBits::decode(raw_ptr()->state_bits_) ==
+    return ClassFinalizedBits::decode(state_bits()) ==
            ClassLayout::kPreFinalized;
   }
 
   void set_is_prefinalized() const;
 
-  bool is_const() const { return ConstBit::decode(raw_ptr()->state_bits_); }
+  bool is_const() const { return ConstBit::decode(state_bits()); }
   void set_is_const() const;
 
   // Tests if this is a mixin application class which was desugared
@@ -1403,21 +1410,19 @@
   // In such case, its mixed-in type was pulled into the end of
   // interfaces list.
   bool is_transformed_mixin_application() const {
-    return TransformedMixinApplicationBit::decode(raw_ptr()->state_bits_);
+    return TransformedMixinApplicationBit::decode(state_bits());
   }
   void set_is_transformed_mixin_application() const;
 
   bool is_fields_marked_nullable() const {
-    return FieldsMarkedNullableBit::decode(raw_ptr()->state_bits_);
+    return FieldsMarkedNullableBit::decode(state_bits());
   }
   void set_is_fields_marked_nullable() const;
 
-  bool is_allocated() const {
-    return IsAllocatedBit::decode(raw_ptr()->state_bits_);
-  }
+  bool is_allocated() const { return IsAllocatedBit::decode(state_bits()); }
   void set_is_allocated(bool value) const;
 
-  bool is_loaded() const { return IsLoadedBit::decode(raw_ptr()->state_bits_); }
+  bool is_loaded() const { return IsLoadedBit::decode(state_bits()); }
   void set_is_loaded(bool value) const;
 
   uint16_t num_native_fields() const { return raw_ptr()->num_native_fields_; }
@@ -1428,25 +1433,11 @@
   CodePtr allocation_stub() const { return raw_ptr()->allocation_stub_; }
   void set_allocation_stub(const Code& value) const;
 
-#if !defined(DART_PRECOMPILED_RUNTIME)
-  intptr_t binary_declaration_offset() const {
-    return ClassLayout::BinaryDeclarationOffset::decode(
-        raw_ptr()->binary_declaration_);
-  }
-  void set_binary_declaration_offset(intptr_t value) const {
-    ASSERT(value >= 0);
-    StoreNonPointer(&raw_ptr()->binary_declaration_,
-                    ClassLayout::BinaryDeclarationOffset::update(
-                        value, raw_ptr()->binary_declaration_));
-  }
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-
   intptr_t kernel_offset() const {
 #if defined(DART_PRECOMPILED_RUNTIME)
     return 0;
 #else
-    ASSERT(!is_declared_in_bytecode());
-    return binary_declaration_offset();
+    return raw_ptr()->kernel_offset_;
 #endif
   }
 
@@ -1454,46 +1445,11 @@
 #if defined(DART_PRECOMPILED_RUNTIME)
     UNREACHABLE();
 #else
-    ASSERT(!is_declared_in_bytecode());
-    set_binary_declaration_offset(value);
+    ASSERT(value >= 0);
+    StoreNonPointer(&raw_ptr()->kernel_offset_, value);
 #endif
   }
 
-  intptr_t bytecode_offset() const {
-#if defined(DART_PRECOMPILED_RUNTIME)
-    return 0;
-#else
-    ASSERT(is_declared_in_bytecode());
-    return binary_declaration_offset();
-#endif
-  }
-
-  void set_bytecode_offset(intptr_t value) const {
-#if defined(DART_PRECOMPILED_RUNTIME)
-    UNREACHABLE();
-#else
-    ASSERT(is_declared_in_bytecode());
-    set_binary_declaration_offset(value);
-#endif
-  }
-
-  bool is_declared_in_bytecode() const {
-#if defined(DART_PRECOMPILED_RUNTIME)
-    return false;
-#else
-    return ClassLayout::IsDeclaredInBytecode::decode(
-        raw_ptr()->binary_declaration_);
-#endif
-  }
-
-#if !defined(DART_PRECOMPILED_RUNTIME)
-  void set_is_declared_in_bytecode(bool value) const {
-    StoreNonPointer(&raw_ptr()->binary_declaration_,
-                    ClassLayout::IsDeclaredInBytecode::update(
-                        value, raw_ptr()->binary_declaration_));
-  }
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-
   void DisableAllocationStub() const;
 
   ArrayPtr constants() const;
@@ -1714,8 +1670,6 @@
   const char* GenerateUserVisibleName() const;
   void set_state_bits(intptr_t bits) const;
 
-  ArrayPtr invocation_dispatcher_cache() const;
-  void set_invocation_dispatcher_cache(const Array& cache) const;
   FunctionPtr CreateInvocationDispatcher(const String& target_name,
                                          const Array& args_desc,
                                          FunctionLayout::Kind kind) const;
@@ -1731,15 +1685,26 @@
 
   int16_t num_type_arguments() const { return raw_ptr()->num_type_arguments_; }
 
+  uint32_t state_bits() const {
+    // Ensure any following load instructions do not get performed before this
+    // one.
+    return LoadNonPointer<uint32_t, std::memory_order_acquire>(
+        &raw_ptr()->state_bits_);
+  }
+
  public:
   void set_num_type_arguments(intptr_t value) const;
 
-  bool has_pragma() const {
-    return HasPragmaBit::decode(raw_ptr()->state_bits_);
-  }
+  bool has_pragma() const { return HasPragmaBit::decode(state_bits()); }
   void set_has_pragma(bool has_pragma) const;
 
  private:
+  void set_functions(const Array& value) const;
+  void set_fields(const Array& value) const;
+  void set_invocation_dispatcher_cache(const Array& cache) const;
+
+  ArrayPtr invocation_dispatcher_cache() const;
+
   // Calculates number of type arguments of this class.
   // This includes type arguments of a superclass and takes overlapping
   // of type arguments into account.
@@ -1749,7 +1714,8 @@
   void InitEmptyFields();
 
   static FunctionPtr CheckFunctionType(const Function& func, MemberKind kind);
-  FunctionPtr LookupFunction(const String& name, MemberKind kind) const;
+  FunctionPtr LookupFunctionReadLocked(const String& name,
+                                       MemberKind kind) const;
   FunctionPtr LookupFunctionAllowPrivate(const String& name,
                                          MemberKind kind) const;
   FieldPtr LookupField(const String& name, MemberKind kind) const;
@@ -1773,7 +1739,6 @@
   friend class Instance;
   friend class Object;
   friend class Type;
-  friend class InterpreterHelpers;
   friend class Intrinsifier;
   friend class ProgramWalker;
   friend class Precompiler;
@@ -1832,41 +1797,6 @@
   friend class Class;
 };
 
-class ParameterTypeCheck : public Object {
- public:
-  // The FP-relative index of the parameter in a bytecode frame (after optional
-  // parameter marshalling) whose assignability needs to be checked, or 0 if
-  // this is a type parameter check.
-  intptr_t index() const { return raw_ptr()->index_; }
-  void set_index(intptr_t i) const { StoreNonPointer(&raw_ptr()->index_, i); }
-
-  // The type parameter to whose bound needs to be checked, or null if this is
-  // an ordinary parameter check.
-  AbstractTypePtr param() const { return raw_ptr()->param_; }
-  void set_param(const AbstractType& t) const;
-
-  // FP[index] assignable to type, OR param is subtype of bound.
-  AbstractTypePtr type_or_bound() const { return raw_ptr()->type_or_bound_; }
-  void set_type_or_bound(const AbstractType& t) const;
-
-  // The parameter or type parameter's name to use in an error message.
-  StringPtr name() const { return raw_ptr()->name_; }
-  void set_name(const String& n) const;
-
-  SubtypeTestCachePtr cache() const { return raw_ptr()->cache_; }
-  void set_cache(const SubtypeTestCache& c) const;
-
-  static intptr_t InstanceSize() {
-    return RoundedAllocationSize(sizeof(ParameterTypeCheckLayout));
-  }
-
-  static ParameterTypeCheckPtr New();
-
- private:
-  FINAL_HEAP_OBJECT_IMPLEMENTATION(ParameterTypeCheck, Object);
-  friend class Class;
-};
-
 class SingleTargetCache : public Object {
  public:
   CodePtr target() const { return raw_ptr()->target_; }
@@ -2406,7 +2336,6 @@
   friend class Class;
   friend class VMDeserializationRoots;
   friend class ICDataTestTask;
-  friend class Interpreter;
   friend class VMSerializationRoots;
   friend class SnapshotWriter;
 };
@@ -2675,7 +2604,6 @@
   void AttachCode(const Code& value) const;
   void SetInstructions(const Code& value) const;
   void ClearCode() const;
-  void ClearBytecode() const;
 
   // Disables optimized code and switches to unoptimized code.
   void SwitchToUnoptimizedCode() const;
@@ -2713,9 +2641,6 @@
   void set_unoptimized_code(const Code& value) const;
   bool HasCode() const;
   static bool HasCode(FunctionPtr function);
-#if !defined(DART_PRECOMPILED_RUNTIME)
-  static inline bool HasBytecode(FunctionPtr function);
-#endif
 
   static intptr_t code_offset() { return OFFSET_OF(FunctionLayout, code_); }
 
@@ -2739,15 +2664,6 @@
     return OFFSET_OF(FunctionLayout, unchecked_entry_point_);
   }
 
-#if !defined(DART_PRECOMPILED_RUNTIME)
-  bool IsBytecodeAllowed(Zone* zone) const;
-  void AttachBytecode(const Bytecode& bytecode) const;
-  BytecodePtr bytecode() const { return raw_ptr()->bytecode_; }
-  inline bool HasBytecode() const;
-#else
-  inline bool HasBytecode() const { return false; }
-#endif
-
   virtual intptr_t Hash() const;
 
   // Returns true if there is at least one debugger breakpoint
@@ -2760,6 +2676,66 @@
   // Enclosing function of this local function.
   FunctionPtr parent_function() const;
 
+  enum class DefaultTypeArgumentsKind : uint8_t {
+    // Only here to make sure it's explicitly set appropriately.
+    kInvalid = 0,
+    // Must instantiate the default type arguments before use.
+    kNeedsInstantiation,
+    // The default type arguments are already instantiated.
+    kIsInstantiated,
+    // Use the instantiator type arguments that would be used to instantiate
+    // the default type arguments, as instantiating produces the same result.
+    kSharesInstantiatorTypeArguments,
+    // Use the function type arguments that would be used to instantiate
+    // the default type arguments, as instantiating produces the same result.
+    kSharesFunctionTypeArguments,
+  };
+  static constexpr intptr_t kDefaultTypeArgumentsKindFieldSize = 3;
+  static_assert(static_cast<uint8_t>(
+                    DefaultTypeArgumentsKind::kSharesFunctionTypeArguments) <
+                    (1 << kDefaultTypeArgumentsKindFieldSize),
+                "Wrong bit size chosen for default TAV kind field");
+
+  // Fields encoded in an integer stored alongside a default TAV.
+  using DefaultTypeArgumentsKindField =
+      BitField<intptr_t,
+               DefaultTypeArgumentsKind,
+               0,
+               kDefaultTypeArgumentsKindFieldSize>;
+  // If more space is needed, we can almost certainly reduce the size of this
+  // field.
+  using NumParentTypeParametersField =
+      BitField<intptr_t,
+               uint16_t,
+               DefaultTypeArgumentsKindField::kNextBit,
+               kBitsPerByte * sizeof(uint16_t)>;
+
+  static_assert(NumParentTypeParametersField::kNextBit <=
+                    compiler::target::kSmiBits,
+                "Default TAV info does not fit in a target Smi");
+
+  // Returns a canonicalized vector of the type parameters instantiated
+  // to bounds. If non-generic, the empty type arguments vector is returned.
+  TypeArgumentsPtr InstantiateToBounds(
+      Thread* thread,
+      DefaultTypeArgumentsKind* kind_out = nullptr) const;
+
+  // Whether this function should have a cached type arguments vector for the
+  // instantiated-to-bounds version of the type parameters.
+  bool CachesDefaultTypeArguments() const { return IsClosureFunction(); }
+
+  // Updates the cached default type arguments vector for this function if it
+  // caches and for its implicit closure function if it has one. If the
+  // default arguments are all canonical, the cached default type arguments
+  // vector is canonicalized. Should be run any time the type parameters vector
+  // is changed or if the default arguments of any type parameters are updated.
+  void UpdateCachedDefaultTypeArguments(Thread* thread) const;
+
+  // These are only usable for functions that cache the default type arguments.
+  TypeArgumentsPtr default_type_arguments(
+      DefaultTypeArgumentsKind* kind_out = nullptr) const;
+  void set_default_type_arguments(const TypeArguments& value) const;
+
   // Enclosed generated closure function of this local function.
   // This will only work after the closure function has been allocated in the
   // isolate's object_store.
@@ -2874,7 +2850,7 @@
     return (kind() == FunctionLayout::kConstructor) && is_static();
   }
 
-  static bool ClosureBodiesContainNonCovariantChecks() {
+  static bool ClosureBodiesContainNonCovariantArgumentChecks() {
     return FLAG_precompiled_mode || FLAG_lazy_dispatchers;
   }
 
@@ -2946,10 +2922,15 @@
   bool IsInFactoryScope() const;
 
   bool NeedsArgumentTypeChecks() const {
-    return (IsClosureFunction() && ClosureBodiesContainNonCovariantChecks()) ||
+    return (IsClosureFunction() &&
+            ClosureBodiesContainNonCovariantArgumentChecks()) ||
            !(is_static() || (kind() == FunctionLayout::kConstructor));
   }
 
+  bool NeedsTypeArgumentTypeChecks() const {
+    return !(is_static() || (kind() == FunctionLayout::kConstructor));
+  }
+
   bool NeedsMonomorphicCheckedEntry(Zone* zone) const;
   bool HasDynamicCallers(Zone* zone) const;
   bool PrologueNeedsArgumentsDescriptor() const;
@@ -3051,25 +3032,11 @@
 
 #undef DEFINE_GETTERS_AND_SETTERS
 
-#if !defined(DART_PRECOMPILED_RUNTIME)
-  intptr_t binary_declaration_offset() const {
-    return FunctionLayout::BinaryDeclarationOffset::decode(
-        raw_ptr()->binary_declaration_);
-  }
-  void set_binary_declaration_offset(intptr_t value) const {
-    ASSERT(value >= 0);
-    StoreNonPointer(&raw_ptr()->binary_declaration_,
-                    FunctionLayout::BinaryDeclarationOffset::update(
-                        value, raw_ptr()->binary_declaration_));
-  }
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-
   intptr_t kernel_offset() const {
 #if defined(DART_PRECOMPILED_RUNTIME)
     return 0;
 #else
-    ASSERT(!is_declared_in_bytecode());
-    return binary_declaration_offset();
+    return raw_ptr()->kernel_offset_;
 #endif
   }
 
@@ -3077,48 +3044,13 @@
 #if defined(DART_PRECOMPILED_RUNTIME)
     UNREACHABLE();
 #else
-    ASSERT(!is_declared_in_bytecode());
-    set_binary_declaration_offset(value);
+    ASSERT(value >= 0);
+    StoreNonPointer(&raw_ptr()->kernel_offset_, value);
 #endif
   }
 
-  intptr_t bytecode_offset() const {
-#if defined(DART_PRECOMPILED_RUNTIME)
-    return 0;
-#else
-    ASSERT(is_declared_in_bytecode());
-    return binary_declaration_offset();
-#endif
-  }
-
-  void set_bytecode_offset(intptr_t value) const {
-#if defined(DART_PRECOMPILED_RUNTIME)
-    UNREACHABLE();
-#else
-    ASSERT(is_declared_in_bytecode());
-    set_binary_declaration_offset(value);
-#endif
-  }
-
-  bool is_declared_in_bytecode() const {
-#if defined(DART_PRECOMPILED_RUNTIME)
-    return false;
-#else
-    return FunctionLayout::IsDeclaredInBytecode::decode(
-        raw_ptr()->binary_declaration_);
-#endif
-  }
-
-#if !defined(DART_PRECOMPILED_RUNTIME)
-  void set_is_declared_in_bytecode(bool value) const {
-    StoreNonPointer(&raw_ptr()->binary_declaration_,
-                    FunctionLayout::IsDeclaredInBytecode::update(
-                        value, raw_ptr()->binary_declaration_));
-  }
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-
-  void InheritBinaryDeclarationFrom(const Function& src) const;
-  void InheritBinaryDeclarationFrom(const Field& src) const;
+  void InheritKernelOffsetFrom(const Function& src) const;
+  void InheritKernelOffsetFrom(const Field& src) const;
 
   static const intptr_t kMaxInstructionCount = (1 << 16) - 1;
 
@@ -3167,9 +3099,6 @@
 
   bool HasOptimizedCode() const;
 
-  // Whether the function is ready for compiler optimizations.
-  bool ShouldCompilerOptimize() const;
-
   // Returns true if the argument counts are valid for calling this function.
   // Otherwise, it returns false and the reason (if error_message is not NULL).
   bool AreValidArgumentCounts(intptr_t num_type_arguments,
@@ -3500,35 +3429,56 @@
     return kind == MethodRecognizer::kUtf8DecoderScan;
   }
 
+  // Recognise async functions like:
+  //   user_func async {
+  //     // ...
+  //   }
   bool IsAsyncFunction() const { return modifier() == FunctionLayout::kAsync; }
 
+  // Recognise synthetic sync-yielding functions like the inner-most:
+  //   user_func /* was async */ {
+  //      :async_op(..) yielding {
+  //        // ...
+  //      }
+  //   }
   bool IsAsyncClosure() const {
     return is_generated_body() &&
            Function::Handle(parent_function()).IsAsyncFunction();
   }
 
-  bool IsGenerator() const {
-    return (modifier() & FunctionLayout::kGeneratorBit) != 0;
-  }
-
+  // Recognise sync* functions like:
+  //   user_func sync* {
+  //     // ...
+  //   }
   bool IsSyncGenerator() const {
     return modifier() == FunctionLayout::kSyncGen;
   }
 
-  bool IsSyncGenClosure() const {
+  // Recognise synthetic :sync_op_gen()s like:
+  //   user_func /* was sync* */ {
+  //     :sync_op_gen() {
+  //        // ...
+  //      }
+  //   }
+  bool IsSyncGenClosureMaker() const {
     return is_generated_body() &&
            Function::Handle(parent_function()).IsSyncGenerator();
   }
 
-  bool IsGeneratorClosure() const {
-    return is_generated_body() &&
-           Function::Handle(parent_function()).IsGenerator();
-  }
-
+  // Recognise async* functions like:
+  //   user_func async* {
+  //     // ...
+  //   }
   bool IsAsyncGenerator() const {
     return modifier() == FunctionLayout::kAsyncGen;
   }
 
+  // Recognise synthetic sync-yielding functions like the inner-most:
+  //   user_func /* originally async* */ {
+  //      :async_op(..) yielding {
+  //        // ...
+  //      }
+  //   }
   bool IsAsyncGenClosure() const {
     return is_generated_body() &&
            Function::Handle(parent_function()).IsAsyncGenerator();
@@ -3541,15 +3491,14 @@
   // Recognise synthetic sync-yielding functions like the inner-most:
   //   user_func /* was sync* */ {
   //     :sync_op_gen() {
-  //        :sync_op() yielding {
+  //        :sync_op(..) yielding {
   //          // ...
   //        }
   //      }
   //   }
-  bool IsSyncYielding() const {
-    return (parent_function() != Function::null())
-               ? Function::Handle(parent_function()).IsSyncGenClosure()
-               : false;
+  bool IsSyncGenClosure() const {
+    return (parent_function() != Function::null()) &&
+           Function::Handle(parent_function()).IsSyncGenClosureMaker();
   }
 
   bool IsTypedDataViewFactory() const {
@@ -3698,6 +3647,12 @@
 
   void SetWasExecuted(bool value) const { SetWasExecutedBit(value); }
 
+  static intptr_t data_offset() { return OFFSET_OF(FunctionLayout, data_); }
+
+  static intptr_t kind_tag_offset() {
+    return OFFSET_OF(FunctionLayout, kind_tag_);
+  }
+
   // static: Considered during class-side or top-level resolution rather than
   //         instance-side resolution.
   // const: Valid target of a const constructor call.
@@ -3772,11 +3727,6 @@
         value, raw_ptr()->packed_fields_));
   }
 
- private:
-  void set_parameter_names(const Array& value) const;
-  void set_ic_data_array(const Array& value) const;
-  void SetInstructionsSafe(const Code& value) const;
-
   enum KindTagBits {
     kKindTagPos = 0,
     kKindTagSize = 5,
@@ -3795,8 +3745,7 @@
   COMPILE_ASSERT(MethodRecognizer::kNumRecognizedMethods <
                  (1 << kRecognizedTagSize));
   COMPILE_ASSERT(kNumTagBits <=
-                 (kBitsPerByte *
-                  sizeof(static_cast<FunctionLayout*>(nullptr)->kind_tag_)));
+                 (kBitsPerByte * sizeof(decltype(FunctionLayout::kind_tag_))));
 
   class KindBits : public BitField<uint32_t,
                                    FunctionLayout::Kind,
@@ -3817,6 +3766,15 @@
   FOR_EACH_FUNCTION_KIND_BIT(DEFINE_BIT)
 #undef DEFINE_BIT
 
+ private:
+  // Given the provided defaults type arguments, determines which
+  // DefaultTypeArgumentsKind applies.
+  DefaultTypeArgumentsKind DefaultTypeArgumentsKindFor(
+      const TypeArguments& defaults) const;
+
+  void set_parameter_names(const Array& value) const;
+  void set_ic_data_array(const Array& value) const;
+  void SetInstructionsSafe(const Code& value) const;
   void set_name(const String& value) const;
   void set_kind(FunctionLayout::Kind value) const;
   void set_parent_function(const Function& value) const;
@@ -3867,6 +3825,13 @@
     return RoundedAllocationSize(sizeof(ClosureDataLayout));
   }
 
+  static intptr_t default_type_arguments_offset() {
+    return OFFSET_OF(ClosureDataLayout, default_type_arguments_);
+  }
+  static intptr_t default_type_arguments_info_offset() {
+    return OFFSET_OF(ClosureDataLayout, default_type_arguments_info_);
+  }
+
  private:
   ContextScopePtr context_scope() const { return raw_ptr()->context_scope_; }
   void set_context_scope(const ContextScope& value) const;
@@ -3882,6 +3847,14 @@
   InstancePtr implicit_static_closure() const { return raw_ptr()->closure_; }
   void set_implicit_static_closure(const Instance& closure) const;
 
+  TypeArgumentsPtr default_type_arguments() const {
+    return raw_ptr()->default_type_arguments_;
+  }
+  void set_default_type_arguments(const TypeArguments& value) const;
+
+  intptr_t default_type_arguments_info() const;
+  void set_default_type_arguments_info(intptr_t value) const;
+
   static ClosureDataPtr New();
 
   FINAL_HEAP_OBJECT_IMPLEMENTATION(ClosureData, Object);
@@ -4073,25 +4046,11 @@
         GenericCovariantImplBit::update(value, raw_ptr()->kind_bits_));
   }
 
-#if !defined(DART_PRECOMPILED_RUNTIME)
-  intptr_t binary_declaration_offset() const {
-    return FieldLayout::BinaryDeclarationOffset::decode(
-        raw_ptr()->binary_declaration_);
-  }
-  void set_binary_declaration_offset(intptr_t value) const {
-    ASSERT(value >= 0);
-    StoreNonPointer(&raw_ptr()->binary_declaration_,
-                    FieldLayout::BinaryDeclarationOffset::update(
-                        value, raw_ptr()->binary_declaration_));
-  }
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-
   intptr_t kernel_offset() const {
 #if defined(DART_PRECOMPILED_RUNTIME)
     return 0;
 #else
-    ASSERT(!is_declared_in_bytecode());
-    return binary_declaration_offset();
+    return raw_ptr()->kernel_offset_;
 #endif
   }
 
@@ -4099,47 +4058,12 @@
 #if defined(DART_PRECOMPILED_RUNTIME)
     UNREACHABLE();
 #else
-    ASSERT(!is_declared_in_bytecode());
-    set_binary_declaration_offset(value);
+    ASSERT(value >= 0);
+    StoreNonPointer(&raw_ptr()->kernel_offset_, value);
 #endif
   }
 
-  intptr_t bytecode_offset() const {
-#if defined(DART_PRECOMPILED_RUNTIME)
-    return 0;
-#else
-    ASSERT(is_declared_in_bytecode());
-    return binary_declaration_offset();
-#endif
-  }
-
-  void set_bytecode_offset(intptr_t value) const {
-#if defined(DART_PRECOMPILED_RUNTIME)
-    UNREACHABLE();
-#else
-    ASSERT(is_declared_in_bytecode());
-    set_binary_declaration_offset(value);
-#endif
-  }
-
-  bool is_declared_in_bytecode() const {
-#if defined(DART_PRECOMPILED_RUNTIME)
-    return false;
-#else
-    return FieldLayout::IsDeclaredInBytecode::decode(
-        raw_ptr()->binary_declaration_);
-#endif
-  }
-
-#if !defined(DART_PRECOMPILED_RUNTIME)
-  void set_is_declared_in_bytecode(bool value) const {
-    StoreNonPointer(&raw_ptr()->binary_declaration_,
-                    FieldLayout::IsDeclaredInBytecode::update(
-                        value, raw_ptr()->binary_declaration_));
-  }
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-
-  void InheritBinaryDeclarationFrom(const Field& src) const;
+  void InheritKernelOffsetFrom(const Field& src) const;
 
   ExternalTypedDataPtr KernelData() const;
 
@@ -4467,7 +4391,6 @@
                             const Object& owner,
                             TokenPosition token_pos,
                             TokenPosition end_token_pos);
-  friend class Interpreter;              // Access to bit field.
   friend class StoreInstanceFieldInstr;  // Generated code access to bit field.
 
   enum {
@@ -4814,27 +4737,22 @@
   void AddClassMetadata(const Class& cls,
                         const Object& tl_owner,
                         TokenPosition token_pos,
-                        intptr_t kernel_offset,
-                        intptr_t bytecode_offset) const;
+                        intptr_t kernel_offset) const;
   void AddFieldMetadata(const Field& field,
                         TokenPosition token_pos,
-                        intptr_t kernel_offset,
-                        intptr_t bytecode_offset) const;
+                        intptr_t kernel_offset) const;
   void AddFunctionMetadata(const Function& func,
                            TokenPosition token_pos,
-                           intptr_t kernel_offset,
-                           intptr_t bytecode_offset) const;
+                           intptr_t kernel_offset) const;
   void AddLibraryMetadata(const Object& tl_owner,
                           TokenPosition token_pos,
-                          intptr_t kernel_offset,
-                          intptr_t bytecode_offset) const;
+                          intptr_t kernel_offset) const;
   void AddTypeParameterMetadata(const TypeParameter& param,
                                 TokenPosition token_pos) const;
   void CloneMetadataFrom(const Library& from_library,
                          const Function& from_fun,
                          const Function& to_fun) const;
   ObjectPtr GetMetadata(const Object& obj) const;
-  ArrayPtr GetExtendedMetadata(const Object& obj, intptr_t count) const;
 
   // Tries to finds a @pragma annotation on [object].
   //
@@ -4956,25 +4874,11 @@
   ExternalTypedDataPtr kernel_data() const { return raw_ptr()->kernel_data_; }
   void set_kernel_data(const ExternalTypedData& data) const;
 
-#if !defined(DART_PRECOMPILED_RUNTIME)
-  intptr_t binary_declaration_offset() const {
-    return LibraryLayout::BinaryDeclarationOffset::decode(
-        raw_ptr()->binary_declaration_);
-  }
-  void set_binary_declaration_offset(intptr_t value) const {
-    ASSERT(value >= 0);
-    StoreNonPointer(&raw_ptr()->binary_declaration_,
-                    LibraryLayout::BinaryDeclarationOffset::update(
-                        value, raw_ptr()->binary_declaration_));
-  }
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-
   intptr_t kernel_offset() const {
 #if defined(DART_PRECOMPILED_RUNTIME)
     return 0;
 #else
-    ASSERT(!is_declared_in_bytecode());
-    return binary_declaration_offset();
+    return raw_ptr()->kernel_offset_;
 #endif
   }
 
@@ -4982,46 +4886,11 @@
 #if defined(DART_PRECOMPILED_RUNTIME)
     UNREACHABLE();
 #else
-    ASSERT(!is_declared_in_bytecode());
-    set_binary_declaration_offset(value);
+    ASSERT(value >= 0);
+    StoreNonPointer(&raw_ptr()->kernel_offset_, value);
 #endif
   }
 
-  intptr_t bytecode_offset() const {
-#if defined(DART_PRECOMPILED_RUNTIME)
-    return 0;
-#else
-    ASSERT(is_declared_in_bytecode());
-    return binary_declaration_offset();
-#endif
-  }
-
-  void set_bytecode_offset(intptr_t value) const {
-#if defined(DART_PRECOMPILED_RUNTIME)
-    UNREACHABLE();
-#else
-    ASSERT(is_declared_in_bytecode());
-    set_binary_declaration_offset(value);
-#endif
-  }
-
-  bool is_declared_in_bytecode() const {
-#if defined(DART_PRECOMPILED_RUNTIME)
-    return false;
-#else
-    return LibraryLayout::IsDeclaredInBytecode::decode(
-        raw_ptr()->binary_declaration_);
-#endif
-  }
-
-#if !defined(DART_PRECOMPILED_RUNTIME)
-  void set_is_declared_in_bytecode(bool value) const {
-    StoreNonPointer(&raw_ptr()->binary_declaration_,
-                    LibraryLayout::IsDeclaredInBytecode::update(
-                        value, raw_ptr()->binary_declaration_));
-  }
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-
   static LibraryPtr LookupLibrary(Thread* thread, const String& url);
   static LibraryPtr GetLibrary(intptr_t index);
 
@@ -5051,8 +4920,6 @@
 #if !defined(DART_PRECOMPILED_RUNTIME)
   // Finalize all classes in all libraries.
   static ErrorPtr FinalizeAllClasses();
-  // Eagerly read all bytecode.
-  static ErrorPtr ReadAllBytecode();
 #endif
 
 #if defined(DEBUG) && !defined(DART_PRECOMPILED_RUNTIME)
@@ -5145,8 +5012,7 @@
   void AddMetadata(const Object& owner,
                    const String& name,
                    TokenPosition token_pos,
-                   intptr_t kernel_offset,
-                   intptr_t bytecode_offset) const;
+                   intptr_t kernel_offset) const;
 
   FINAL_HEAP_OBJECT_IMPLEMENTATION(Library, Object);
 
@@ -5278,9 +5144,6 @@
                        const Smi& name_index,
                        const Class& klass) const;
 
-  ArrayPtr bytecode_component() const { return raw_ptr()->bytecode_component_; }
-  void set_bytecode_component(const Array& bytecode_component) const;
-
  private:
   static KernelProgramInfoPtr New();
 
@@ -5353,15 +5216,13 @@
 
   template <std::memory_order order = std::memory_order_relaxed>
   ObjectPtr ObjectAt(intptr_t index) const {
-    ASSERT((TypeAt(index) == EntryType::kTaggedObject) ||
-           (TypeAt(index) == EntryType::kNativeEntryData));
+    ASSERT(TypeAt(index) == EntryType::kTaggedObject);
     return LoadPointer<ObjectPtr, order>(&(EntryAddr(index)->raw_obj_));
   }
 
   template <std::memory_order order = std::memory_order_relaxed>
   void SetObjectAt(intptr_t index, const Object& obj) const {
     ASSERT((TypeAt(index) == EntryType::kTaggedObject) ||
-           (TypeAt(index) == EntryType::kNativeEntryData) ||
            (TypeAt(index) == EntryType::kImmediate && obj.IsSmi()));
     StorePointer<ObjectPtr, order>(&EntryAddr(index)->raw_obj_, obj.raw());
   }
@@ -6787,151 +6648,6 @@
   friend class CodeKeyValueTrait;  // for UncheckedEntryPointOffset
 };
 
-class Bytecode : public Object {
- public:
-  uword instructions() const { return raw_ptr()->instructions_; }
-
-  uword PayloadStart() const { return instructions(); }
-  intptr_t Size() const { return raw_ptr()->instructions_size_; }
-
-  ObjectPoolPtr object_pool() const { return raw_ptr()->object_pool_; }
-
-  bool ContainsInstructionAt(uword addr) const {
-    return BytecodeLayout::ContainsPC(raw(), addr);
-  }
-
-  PcDescriptorsPtr pc_descriptors() const { return raw_ptr()->pc_descriptors_; }
-  void set_pc_descriptors(const PcDescriptors& descriptors) const {
-    ASSERT(descriptors.IsOld());
-    StorePointer(&raw_ptr()->pc_descriptors_, descriptors.raw());
-  }
-
-  void Disassemble(DisassemblyFormatter* formatter = NULL) const;
-
-  ExceptionHandlersPtr exception_handlers() const {
-    return raw_ptr()->exception_handlers_;
-  }
-  void set_exception_handlers(const ExceptionHandlers& handlers) const {
-    ASSERT(handlers.IsOld());
-    StorePointer(&raw_ptr()->exception_handlers_, handlers.raw());
-  }
-
-  FunctionPtr function() const { return raw_ptr()->function_; }
-
-  void set_function(const Function& function) const {
-    ASSERT(function.IsOld());
-    StorePointer(&raw_ptr()->function_, function.raw());
-  }
-
-  static intptr_t InstanceSize() {
-    return RoundedAllocationSize(sizeof(BytecodeLayout));
-  }
-  static BytecodePtr New(uword instructions,
-                         intptr_t instructions_size,
-                         intptr_t instructions_offset,
-                         const ObjectPool& object_pool);
-
-  ExternalTypedDataPtr GetBinary(Zone* zone) const;
-
-  TokenPosition GetTokenIndexOfPC(uword return_address) const;
-  intptr_t GetTryIndexAtPc(uword return_address) const;
-
-  // Return the pc of the first 'DebugCheck' opcode of the bytecode.
-  // Return 0 if none is found.
-  uword GetFirstDebugCheckOpcodePc() const;
-
-  // Return the pc after the first 'debug checked' opcode in the range.
-  // Return 0 if none is found.
-  uword GetDebugCheckedOpcodeReturnAddress(uword from_offset,
-                                           uword to_offset) const;
-
-  intptr_t instructions_binary_offset() const {
-    return raw_ptr()->instructions_binary_offset_;
-  }
-  void set_instructions_binary_offset(intptr_t value) const {
-    StoreNonPointer(&raw_ptr()->instructions_binary_offset_, value);
-  }
-
-  intptr_t source_positions_binary_offset() const {
-    return raw_ptr()->source_positions_binary_offset_;
-  }
-  void set_source_positions_binary_offset(intptr_t value) const {
-    StoreNonPointer(&raw_ptr()->source_positions_binary_offset_, value);
-  }
-  bool HasSourcePositions() const {
-    return (source_positions_binary_offset() != 0);
-  }
-
-  intptr_t local_variables_binary_offset() const {
-    return raw_ptr()->local_variables_binary_offset_;
-  }
-  void set_local_variables_binary_offset(intptr_t value) const {
-    StoreNonPointer(&raw_ptr()->local_variables_binary_offset_, value);
-  }
-  bool HasLocalVariablesInfo() const {
-    return (local_variables_binary_offset() != 0);
-  }
-
-  LocalVarDescriptorsPtr var_descriptors() const {
-#if defined(PRODUCT)
-    UNREACHABLE();
-    return nullptr;
-#else
-    return raw_ptr()->var_descriptors_;
-#endif
-  }
-  void set_var_descriptors(const LocalVarDescriptors& value) const {
-#if defined(PRODUCT)
-    UNREACHABLE();
-#else
-    ASSERT(value.IsOld());
-    StorePointer(&raw_ptr()->var_descriptors_, value.raw());
-#endif
-  }
-
-  // Will compute local var descriptors if necessary.
-  LocalVarDescriptorsPtr GetLocalVarDescriptors() const;
-
-  const char* Name() const;
-  const char* QualifiedName() const;
-  const char* FullyQualifiedName() const;
-
-  class SlowFindRawBytecodeVisitor : public FindObjectVisitor {
-   public:
-    explicit SlowFindRawBytecodeVisitor(uword pc) : pc_(pc) {}
-    virtual ~SlowFindRawBytecodeVisitor() {}
-
-    // Check if object matches find condition.
-    virtual bool FindObject(ObjectPtr obj) const;
-
-   private:
-    const uword pc_;
-
-    DISALLOW_COPY_AND_ASSIGN(SlowFindRawBytecodeVisitor);
-  };
-
-  static BytecodePtr FindCode(uword pc);
-
- private:
-  void set_instructions(uword instructions) const {
-    StoreNonPointer(&raw_ptr()->instructions_, instructions);
-  }
-  void set_instructions_size(intptr_t size) const {
-    StoreNonPointer(&raw_ptr()->instructions_size_, size);
-  }
-  void set_object_pool(const ObjectPool& object_pool) const {
-    StorePointer(&raw_ptr()->object_pool_, object_pool.raw());
-  }
-
-  friend class BytecodeDeserializationCluster;
-  friend class ObjectLayout;  // For ObjectLayout::SizeFromClass().
-  friend class BytecodeLayout;
-
-  FINAL_HEAP_OBJECT_IMPLEMENTATION(Bytecode, Object);
-  friend class Class;
-  friend class SnapshotWriter;
-};
-
 class Context : public Object {
  public:
   ContextPtr parent() const { return raw_ptr()->parent_; }
@@ -6961,12 +6677,13 @@
   static const intptr_t kMaxElements = kSmiMax / kBytesPerElement;
 
   static const intptr_t kAwaitJumpVarIndex = 0;
-  static const intptr_t kAsyncCompleterIndex = 1;
+  static const intptr_t kAsyncFutureIndex = 1;
   static const intptr_t kControllerIndex = 1;
   // Expected context index of chained futures in recognized async functions.
   // These are used to unwind async stacks.
   static const intptr_t kFutureTimeoutFutureIndex = 2;
   static const intptr_t kFutureWaitFutureIndex = 2;
+  static const intptr_t kIsSyncIndex = 2;
 
   static intptr_t variable_offset(intptr_t context_index) {
     return OFFSET_OF_RETURNED_VALUE(ContextLayout, data) +
@@ -7678,21 +7395,26 @@
   // Hash value for a type argument vector consisting solely of dynamic types.
   static const intptr_t kAllDynamicHash = 1;
 
+  // Returns whether this TypeArguments vector can be used in a context that
+  // expects a vector of length [count]. Always true for the null vector.
+  bool HasCount(intptr_t count) const;
   static intptr_t length_offset() {
     return OFFSET_OF(TypeArgumentsLayout, length_);
   }
   intptr_t Length() const;
   AbstractTypePtr TypeAt(intptr_t index) const;
   AbstractTypePtr TypeAtNullSafe(intptr_t index) const;
+  static intptr_t types_offset() {
+    return OFFSET_OF_RETURNED_VALUE(TypeArgumentsLayout, types);
+  }
   static intptr_t type_at_offset(intptr_t index) {
-    return OFFSET_OF_RETURNED_VALUE(TypeArgumentsLayout, types) +
-           index * kWordSize;
+    return types_offset() + index * kWordSize;
   }
   void SetTypeAt(intptr_t index, const AbstractType& value) const;
 
   struct ArrayTraits {
     static intptr_t elements_start_offset() {
-      return TypeArguments::type_at_offset(0);
+      return TypeArguments::types_offset();
     }
 
     static constexpr intptr_t kElementSize = kWordSize;
@@ -7738,6 +7460,7 @@
       NameVisibility name_visibility,
       BaseTextBuffer* printer,
       NameDisambiguation name_disambiguation = NameDisambiguation::kNo) const;
+  void PrintTo(BaseTextBuffer* printer) const;
 
   // Check if the subvector of length 'len' starting at 'from_index' of this
   // type argument vector consists solely of DynamicType.
@@ -8467,6 +8190,9 @@
   }
   virtual void SetIsFinalized() const;
   virtual bool IsBeingFinalized() const { return false; }
+  static intptr_t flags_offset() {
+    return OFFSET_OF(TypeParameterLayout, flags_);
+  }
   bool IsGenericCovariantImpl() const {
     return TypeParameterLayout::GenericCovariantImplBit::decode(
         raw_ptr()->flags_);
@@ -8502,10 +8228,20 @@
   }
 
   StringPtr name() const { return raw_ptr()->name_; }
+  static intptr_t name_offset() {
+    return OFFSET_OF(TypeParameterLayout, name_);
+  }
   intptr_t index() const { return raw_ptr()->index_; }
   void set_index(intptr_t value) const;
   AbstractTypePtr bound() const { return raw_ptr()->bound_; }
   void set_bound(const AbstractType& value) const;
+  AbstractTypePtr default_argument() const {
+    return raw_ptr()->default_argument_;
+  }
+  void set_default_argument(const AbstractType& value) const;
+  static intptr_t bound_offset() {
+    return OFFSET_OF(TypeParameterLayout, bound_);
+  }
   virtual TokenPosition token_pos() const { return raw_ptr()->token_pos_; }
   virtual bool IsInstantiated(Genericity genericity = kAny,
                               intptr_t num_free_fun_type_params = kAllFree,
@@ -8851,6 +8587,8 @@
 #endif
   static const intptr_t kMaxElements = kSmiMax / kTwoByteChar;
 
+  static intptr_t HeaderSize() { return String::kSizeofRawString; }
+
   class CodePointIterator : public ValueObject {
    public:
     explicit CodePointIterator(const String& str)
@@ -9036,7 +8774,7 @@
                                intptr_t array_len,
                                void* peer,
                                intptr_t external_allocation_size,
-                               Dart_WeakPersistentHandleFinalizer callback,
+                               Dart_HandleFinalizer callback,
                                Heap::Space = Heap::kNew);
 
   // Creates a new External String object using the specified array of
@@ -9045,7 +8783,7 @@
                                intptr_t array_len,
                                void* peer,
                                intptr_t external_allocation_size,
-                               Dart_WeakPersistentHandleFinalizer callback,
+                               Dart_HandleFinalizer callback,
                                Heap::Space = Heap::kNew);
 
   static void Copy(const String& dst,
@@ -9240,12 +8978,6 @@
   static intptr_t InstanceSize(intptr_t len) {
     ASSERT(sizeof(OneByteStringLayout) == String::kSizeofRawString);
     ASSERT(0 <= len && len <= kMaxElements);
-#if defined(HASH_IN_OBJECT_HEADER)
-    // We have to pad zero-length raw strings so that they can be externalized.
-    // If we don't pad, then the external string object does not fit in the
-    // memory allocated for the raw string.
-    if (len == 0) return InstanceSize(1);
-#endif
     return String::RoundedAllocationSize(UnroundedSize(len));
   }
 
@@ -9334,11 +9066,12 @@
                                    bool as_reference);
 
   friend class Class;
-  friend class String;
-  friend class Symbols;
   friend class ExternalOneByteString;
+  friend class ImageWriter;
   friend class SnapshotReader;
+  friend class String;
   friend class StringHasher;
+  friend class Symbols;
   friend class Utf8;
 };
 
@@ -9370,7 +9103,6 @@
   static intptr_t data_offset() {
     return OFFSET_OF_RETURNED_VALUE(TwoByteStringLayout, data);
   }
-
   static intptr_t UnroundedSize(TwoByteStringPtr str) {
     return UnroundedSize(Smi::Value(str->ptr()->length_));
   }
@@ -9385,10 +9117,6 @@
   static intptr_t InstanceSize(intptr_t len) {
     ASSERT(sizeof(TwoByteStringLayout) == String::kSizeofRawString);
     ASSERT(0 <= len && len <= kMaxElements);
-    // We have to pad zero-length raw strings so that they can be externalized.
-    // If we don't pad, then the external string object does not fit in the
-    // memory allocated for the raw string.
-    if (len == 0) return InstanceSize(1);
     return String::RoundedAllocationSize(UnroundedSize(len));
   }
 
@@ -9460,9 +9188,10 @@
                                    bool as_reference);
 
   friend class Class;
+  friend class ImageWriter;
+  friend class SnapshotReader;
   friend class String;
   friend class StringHasher;
-  friend class SnapshotReader;
   friend class Symbols;
 };
 
@@ -9494,13 +9223,12 @@
     return String::RoundedAllocationSize(sizeof(ExternalOneByteStringLayout));
   }
 
-  static ExternalOneByteStringPtr New(
-      const uint8_t* characters,
-      intptr_t len,
-      void* peer,
-      intptr_t external_allocation_size,
-      Dart_WeakPersistentHandleFinalizer callback,
-      Heap::Space space);
+  static ExternalOneByteStringPtr New(const uint8_t* characters,
+                                      intptr_t len,
+                                      void* peer,
+                                      intptr_t external_allocation_size,
+                                      Dart_HandleFinalizer callback,
+                                      Heap::Space space);
 
   static ExternalOneByteStringPtr null() {
     return static_cast<ExternalOneByteStringPtr>(Object::null());
@@ -9593,13 +9321,12 @@
     return String::RoundedAllocationSize(sizeof(ExternalTwoByteStringLayout));
   }
 
-  static ExternalTwoByteStringPtr New(
-      const uint16_t* characters,
-      intptr_t len,
-      void* peer,
-      intptr_t external_allocation_size,
-      Dart_WeakPersistentHandleFinalizer callback,
-      Heap::Space space = Heap::kNew);
+  static ExternalTwoByteStringPtr New(const uint16_t* characters,
+                                      intptr_t len,
+                                      void* peer,
+                                      intptr_t external_allocation_size,
+                                      Dart_HandleFinalizer callback,
+                                      Heap::Space space = Heap::kNew);
 
   static ExternalTwoByteStringPtr null() {
     return static_cast<ExternalTwoByteStringPtr>(Object::null());
@@ -9717,6 +9444,11 @@
   static intptr_t element_offset(intptr_t index) {
     return OFFSET_OF_RETURNED_VALUE(ArrayLayout, data) + kWordSize * index;
   }
+  static intptr_t index_at_offset(intptr_t offset_in_bytes) {
+    intptr_t index = (offset_in_bytes - data_offset()) / kWordSize;
+    ASSERT(index >= 0);
+    return index;
+  }
 
   struct ArrayTraits {
     static intptr_t elements_start_offset() { return Array::data_offset(); }
@@ -9881,7 +9613,6 @@
   FINAL_HEAP_OBJECT_IMPLEMENTATION(Array, Instance);
   friend class Class;
   friend class ImmutableArray;
-  friend class Interpreter;
   friend class Object;
   friend class String;
 };
@@ -10379,10 +10110,9 @@
 
 #undef TYPED_GETTER_SETTER
 
-  FinalizablePersistentHandle* AddFinalizer(
-      void* peer,
-      Dart_WeakPersistentHandleFinalizer callback,
-      intptr_t external_size) const;
+  FinalizablePersistentHandle* AddFinalizer(void* peer,
+                                            Dart_HandleFinalizer callback,
+                                            intptr_t external_size) const;
 
   static intptr_t data_offset() {
     return OFFSET_OF(ExternalTypedDataLayout, data_);
@@ -10736,6 +10466,9 @@
   TypeArgumentsPtr instantiator_type_arguments() const {
     return raw_ptr()->instantiator_type_arguments_;
   }
+  void set_instantiator_type_arguments(const TypeArguments& args) const {
+    StorePointer(&raw_ptr()->instantiator_type_arguments_, args.raw());
+  }
   static intptr_t instantiator_type_arguments_offset() {
     return OFFSET_OF(ClosureLayout, instantiator_type_arguments_);
   }
@@ -10743,6 +10476,9 @@
   TypeArgumentsPtr function_type_arguments() const {
     return raw_ptr()->function_type_arguments_;
   }
+  void set_function_type_arguments(const TypeArguments& args) const {
+    StorePointer(&raw_ptr()->function_type_arguments_, args.raw());
+  }
   static intptr_t function_type_arguments_offset() {
     return OFFSET_OF(ClosureLayout, function_type_arguments_);
   }
@@ -10750,6 +10486,9 @@
   TypeArgumentsPtr delayed_type_arguments() const {
     return raw_ptr()->delayed_type_arguments_;
   }
+  void set_delayed_type_arguments(const TypeArguments& args) const {
+    StorePointer(&raw_ptr()->delayed_type_arguments_, args.raw());
+  }
   static intptr_t delayed_type_arguments_offset() {
     return OFFSET_OF(ClosureLayout, delayed_type_arguments_);
   }
@@ -10776,10 +10515,8 @@
     return RoundedAllocationSize(sizeof(ClosureLayout));
   }
 
-  // Returns true if all elements are OK for canonicalization.
-  virtual void CanonicalizeFieldsLocked(Thread* thread) const {
-    // None of the fields of a closure are instances.
-  }
+  virtual void CanonicalizeFieldsLocked(Thread* thread) const;
+  virtual bool CanonicalizeEquals(const Instance& other) const;
   virtual uint32_t CanonicalizeHash() const {
     return Function::Handle(function()).Hash();
   }
@@ -10829,10 +10566,19 @@
   InstancePtr handler() const { return raw_ptr()->handler_; }
   void set_handler(const Instance& value) const;
 
+#if !defined(PRODUCT)
+  StackTracePtr allocation_location() const {
+    return raw_ptr()->allocation_location_;
+  }
+
+  StringPtr debug_name() const { return raw_ptr()->debug_name_; }
+#endif
+
   static intptr_t InstanceSize() {
     return RoundedAllocationSize(sizeof(ReceivePortLayout));
   }
   static ReceivePortPtr New(Dart_Port id,
+                            const String& debug_name,
                             bool is_control_port,
                             Heap::Space space = Heap::kNew);
 
@@ -11335,16 +11081,6 @@
 #endif
 }
 
-#if !defined(DART_PRECOMPILED_RUNTIME)
-bool Function::HasBytecode() const {
-  return raw_ptr()->bytecode_ != Bytecode::null();
-}
-
-bool Function::HasBytecode(FunctionPtr function) {
-  return function->ptr()->bytecode_ != Bytecode::null();
-}
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-
 intptr_t Field::HostOffset() const {
   ASSERT(is_instance());  // Valid only for dart instance fields.
   return (Smi::Value(raw_ptr()->host_offset_or_field_id_) * kWordSize);
diff --git a/runtime/vm/object_graph.cc b/runtime/vm/object_graph.cc
index 2cd2590..ac498cc 100644
--- a/runtime/vm/object_graph.cc
+++ b/runtime/vm/object_graph.cc
@@ -990,7 +990,7 @@
     writer_->WriteUnsigned(weak_persistent_handle->external_size());
     // Attempt to include a native symbol name.
     auto const name = NativeSymbolResolver::LookupSymbolName(
-        weak_persistent_handle->callback_address(), nullptr);
+        reinterpret_cast<uword>(weak_persistent_handle->callback()), nullptr);
     writer_->WriteUtf8((name == nullptr) ? "Unknown native function" : name);
     if (name != nullptr) {
       NativeSymbolResolver::FreeSymbolName(name);
diff --git a/runtime/vm/object_graph_test.cc b/runtime/vm/object_graph_test.cc
index a072650..882c685 100644
--- a/runtime/vm/object_graph_test.cc
+++ b/runtime/vm/object_graph_test.cc
@@ -142,9 +142,7 @@
   }
 }
 
-static void WeakHandleFinalizer(void* isolate_callback_data,
-                                Dart_WeakPersistentHandle handle,
-                                void* peer) {}
+static void WeakHandleFinalizer(void* isolate_callback_data, void* peer) {}
 
 ISOLATE_UNIT_TEST_CASE(RetainingPathGCRoot) {
   Dart_PersistentHandle persistent_handle;
diff --git a/runtime/vm/object_reload.cc b/runtime/vm/object_reload.cc
index 7cde5c3..bea8d14 100644
--- a/runtime/vm/object_reload.cc
+++ b/runtime/vm/object_reload.cc
@@ -176,57 +176,6 @@
   }
 }
 
-void CallSiteResetter::RebindStaticTargets(const Bytecode& bytecode) {
-  // Iterate over the Bytecode's object pool and reset all ICDatas.
-  pool_ = bytecode.object_pool();
-  ASSERT(!pool_.IsNull());
-
-  for (intptr_t i = 0; i < pool_.Length(); i++) {
-    ObjectPool::EntryType entry_type = pool_.TypeAt(i);
-    if (entry_type != ObjectPool::EntryType::kTaggedObject) {
-      continue;
-    }
-    object_ = pool_.ObjectAt(i);
-    if (object_.IsFunction()) {
-      const Function& old_function = Function::Cast(object_);
-      if (old_function.IsClosureFunction()) {
-        continue;
-      }
-      name_ = old_function.name();
-      new_cls_ = old_function.Owner();
-      if (new_cls_.IsTopLevel()) {
-        new_lib_ = new_cls_.library();
-        new_function_ = new_lib_.LookupLocalFunction(name_);
-      } else {
-        new_function_ = new_cls_.LookupFunction(name_);
-      }
-      if (!new_function_.IsNull() &&
-          (new_function_.is_static() == old_function.is_static()) &&
-          (new_function_.kind() == old_function.kind())) {
-        pool_.SetObjectAt(i, new_function_);
-      } else {
-        VTIR_Print("Cannot rebind function %s\n", old_function.ToCString());
-      }
-    } else if (object_.IsField()) {
-      const Field& old_field = Field::Cast(object_);
-      name_ = old_field.name();
-      new_cls_ = old_field.Owner();
-      if (new_cls_.IsTopLevel()) {
-        new_lib_ = new_cls_.library();
-        new_field_ = new_lib_.LookupLocalField(name_);
-      } else {
-        new_field_ = new_cls_.LookupField(name_);
-      }
-      if (!new_field_.IsNull() &&
-          (new_field_.is_static() == old_field.is_static())) {
-        pool_.SetObjectAt(i, new_field_);
-      } else {
-        VTIR_Print("Cannot rebind field %s\n", old_field.ToCString());
-      }
-    }
-  }
-}
-
 void CallSiteResetter::ResetCaches(const ObjectPool& pool) {
   for (intptr_t i = 0; i < pool.Length(); i++) {
     ObjectPool::EntryType entry_type = pool.TypeAt(i);
@@ -493,12 +442,10 @@
       PatchClass::Handle(PatchClass::New(*this, Script::Handle(script())));
   ASSERT(!patch.IsNull());
   const Library& lib = Library::Handle(library());
-  if (!lib.is_declared_in_bytecode()) {
-    patch.set_library_kernel_data(ExternalTypedData::Handle(lib.kernel_data()));
-    patch.set_library_kernel_offset(lib.kernel_offset());
-  }
+  patch.set_library_kernel_data(ExternalTypedData::Handle(lib.kernel_data()));
+  patch.set_library_kernel_offset(lib.kernel_offset());
 
-  const Array& funcs = Array::Handle(functions());
+  const Array& funcs = Array::Handle(current_functions());
   Function& func = Function::Handle();
   Object& owner = Object::Handle();
   for (intptr_t i = 0; i < funcs.Length(); i++) {
@@ -537,7 +484,8 @@
 
 void Class::MigrateImplicitStaticClosures(IsolateReloadContext* irc,
                                           const Class& new_cls) const {
-  const Array& funcs = Array::Handle(functions());
+  const Array& funcs = Array::Handle(current_functions());
+  Thread* thread = Thread::Current();
   Function& old_func = Function::Handle();
   String& selector = String::Handle();
   Function& new_func = Function::Handle();
@@ -547,7 +495,7 @@
     old_func ^= funcs.At(i);
     if (old_func.is_static() && old_func.HasImplicitClosureFunction()) {
       selector = old_func.name();
-      new_func = new_cls.LookupFunction(selector);
+      new_func = Resolver::ResolveFunction(thread->zone(), new_cls, selector);
       if (!new_func.IsNull() && new_func.is_static()) {
         old_func = old_func.ImplicitClosureFunction();
         old_closure = old_func.ImplicitStaticClosure();
@@ -982,7 +930,7 @@
              old_target_.kind() == FunctionLayout::kConstructor);
       // This can be incorrect if the call site was an unqualified invocation.
       new_cls_ = old_target_.Owner();
-      new_target_ = new_cls_.LookupFunction(name_);
+      new_target_ = Resolver::ResolveFunction(zone_, new_cls_, name_);
       if (new_target_.kind() != old_target_.kind()) {
         new_target_ = Function::null();
       }
diff --git a/runtime/vm/object_service.cc b/runtime/vm/object_service.cc
index c70282b..e99a13d 100644
--- a/runtime/vm/object_service.cc
+++ b/runtime/vm/object_service.cc
@@ -7,6 +7,7 @@
 #include "vm/debugger.h"
 #include "vm/object.h"
 #include "vm/object_store.h"
+#include "vm/resolver.h"
 #include "vm/stub_code.h"
 #include "vm/symbols.h"
 
@@ -141,7 +142,7 @@
   }
   {
     JSONArray functions_array(&jsobj, "functions");
-    const Array& function_array = Array::Handle(functions());
+    const Array& function_array = Array::Handle(current_functions());
     Function& function = Function::Handle();
     if (!function_array.IsNull()) {
       for (intptr_t i = 0; i < function_array.Length(); i++) {
@@ -153,7 +154,7 @@
   {
     JSONArray subclasses_array(&jsobj, "subclasses");
     const GrowableObjectArray& subclasses =
-        GrowableObjectArray::Handle(direct_subclasses());
+        GrowableObjectArray::Handle(direct_subclasses_unsafe());
     if (!subclasses.IsNull()) {
       Class& subclass = Class::Handle();
       for (intptr_t i = 0; i < subclasses.Length(); ++i) {
@@ -260,7 +261,8 @@
   }
   // Regular functions known to their owner use their name (percent-encoded).
   String& name = String::Handle(f.name());
-  if (cls.LookupFunction(name) == f.raw()) {
+  Thread* thread = Thread::Current();
+  if (Resolver::ResolveFunction(thread->zone(), cls, name) == f.raw()) {
     const char* encoded_name = String::EncodeIRI(name);
     if (cls.IsTopLevel()) {
       const auto& library = Library::Handle(cls.library());
@@ -319,12 +321,6 @@
   if (!code.IsNull()) {
     jsobj.AddProperty("code", code);
   }
-#if !defined(DART_PRECOMPILED_RUNTIME)
-  Bytecode& bytecode = Bytecode::Handle(this->bytecode());
-  if (!bytecode.IsNull()) {
-    jsobj.AddProperty("_bytecode", bytecode);
-  }
-#endif  // !DART_PRECOMPILED_RUNTIME
   Array& ics = Array::Handle(ic_data_array());
   if (!ics.IsNull()) {
     jsobj.AddProperty("_icDataArray", ics);
@@ -573,53 +569,6 @@
         }
       }
     }
-
-    if (is_declared_in_bytecode()) {
-      // Make sure top level class (containing annotations) is fully loaded.
-      EnsureTopLevelClassIsFinalized();
-      Array& metadata = Array::Handle(GetExtendedMetadata(*this, 1));
-      if (metadata.Length() != 0) {
-        // Library has the only element in the extended metadata.
-        metadata ^= metadata.At(0);
-        if (!metadata.IsNull()) {
-          Thread* thread = Thread::Current();
-          auto& desc = Array::Handle();
-          auto& target_uri = String::Handle();
-          auto& is_export = Bool::Handle();
-          auto& is_deferred = Bool::Handle();
-          for (intptr_t i = 0, n = metadata.Length(); i < n; ++i) {
-            desc ^= metadata.At(i);
-            // Each dependency is represented as an array with the following
-            // layout:
-            //  [0] = target library URI (String)
-            //  [1] = is_export (bool)
-            //  [2] = is_deferred (bool)
-            //  [3] = prefix (String or null)
-            //  ...
-            // The library dependencies are encoded by getLibraryAnnotations(),
-            // pkg/vm/lib/bytecode/gen_bytecode.dart.
-            target_uri ^= desc.At(0);
-            is_export ^= desc.At(1);
-            is_deferred ^= desc.At(2);
-            prefix_name ^= desc.At(3);
-
-            target = Library::LookupLibrary(thread, target_uri);
-            if (target.IsNull()) {
-              continue;
-            }
-
-            JSONObject jsdep(&jsarr);
-            jsdep.AddProperty("isDeferred", is_deferred.value());
-            jsdep.AddProperty("isExport", is_export.value());
-            jsdep.AddProperty("isImport", !is_export.value());
-            if (!prefix_name.IsNull()) {
-              jsdep.AddProperty("prefix", prefix_name.ToCString());
-            }
-            jsdep.AddProperty("target", target);
-          }
-        }
-      }
-    }
   }
   {
     JSONArray jsarr(&jsobj, "variables");
@@ -721,11 +670,6 @@
           jsentry.AddProperty("kind", "Immediate");
           jsentry.AddProperty64("value", imm);
           break;
-        case ObjectPool::EntryType::kNativeEntryData:
-          obj = ObjectAt(i);
-          jsentry.AddProperty("kind", "NativeEntryData");
-          jsentry.AddProperty("value", obj);
-          break;
         case ObjectPool::EntryType::kNativeFunction:
           imm = RawValueAt(i);
           jsentry.AddProperty("kind", "NativeFunction");
@@ -807,10 +751,6 @@
   Object::PrintJSONImpl(stream, ref);
 }
 
-void ParameterTypeCheck::PrintJSONImpl(JSONStream* stream, bool ref) const {
-  Object::PrintJSONImpl(stream, ref);
-}
-
 void SingleTargetCache::PrintJSONImpl(JSONStream* stream, bool ref) const {
   JSONObject jsobj(stream);
   AddCommonObjectProperties(&jsobj, "Object", ref);
@@ -892,8 +832,6 @@
 }
 
 void Code::PrintJSONImpl(JSONStream* stream, bool ref) const {
-  // N.B. This is polymorphic with Bytecode.
-
   JSONObject jsobj(stream);
   AddCommonObjectProperties(&jsobj, "Code", ref);
   jsobj.AddFixedServiceId("code/%" Px64 "-%" Px "", compile_timestamp(),
@@ -955,47 +893,6 @@
   PrintJSONInlineIntervals(&jsobj);
 }
 
-void Bytecode::PrintJSONImpl(JSONStream* stream, bool ref) const {
-  // N.B. This is polymorphic with Code.
-
-  JSONObject jsobj(stream);
-  AddCommonObjectProperties(&jsobj, "Code", ref);
-  int64_t compile_timestamp = 0;
-  jsobj.AddFixedServiceId("code/%" Px64 "-%" Px "", compile_timestamp,
-                          PayloadStart());
-  const char* qualified_name = QualifiedName();
-  const char* vm_name = Name();
-  AddNameProperties(&jsobj, qualified_name, vm_name);
-
-  jsobj.AddProperty("kind", "Dart");
-  jsobj.AddProperty("_optimized", false);
-  jsobj.AddProperty("_intrinsic", false);
-  jsobj.AddProperty("_native", false);
-  if (ref) {
-    return;
-  }
-  const Function& fun = Function::Handle(function());
-  jsobj.AddProperty("function", fun);
-  jsobj.AddPropertyF("_startAddress", "%" Px "", PayloadStart());
-  jsobj.AddPropertyF("_endAddress", "%" Px "", PayloadStart() + Size());
-  jsobj.AddProperty("_alive", true);
-  const ObjectPool& obj_pool = ObjectPool::Handle(object_pool());
-  jsobj.AddProperty("_objectPool", obj_pool);
-  {
-    JSONArray jsarr(&jsobj, "_disassembly");
-    DisassembleToJSONStream formatter(jsarr);
-    Disassemble(&formatter);
-  }
-  const PcDescriptors& descriptors = PcDescriptors::Handle(pc_descriptors());
-  if (!descriptors.IsNull()) {
-    JSONObject desc(&jsobj, "_descriptors");
-    descriptors.PrintToJSONObject(&desc, false);
-  }
-
-  { JSONArray inlined_functions(&jsobj, "_inlinedFunctions"); }
-  { JSONArray inline_intervals(&jsobj, "_inlinedIntervals"); }
-}
-
 void Context::PrintJSONImpl(JSONStream* stream, bool ref) const {
   JSONObject jsobj(stream);
   // TODO(turnidge): Should the user level type for Context be Context
@@ -1555,7 +1452,15 @@
 }
 
 void ReceivePort::PrintJSONImpl(JSONStream* stream, bool ref) const {
-  Instance::PrintJSONImpl(stream, ref);
+  JSONObject obj(stream);
+  Instance::PrintSharedInstanceJSON(&obj, ref);
+  const StackTrace& allocation_location_ =
+      StackTrace::Handle(allocation_location());
+  const String& debug_name_ = String::Handle(debug_name());
+  obj.AddProperty("kind", "ReceivePort");
+  obj.AddProperty64("portId", Id());
+  obj.AddProperty("debugName", debug_name_.ToCString());
+  obj.AddProperty("allocationLocation", allocation_location_);
 }
 
 void SendPort::PrintJSONImpl(JSONStream* stream, bool ref) const {
diff --git a/runtime/vm/object_store.cc b/runtime/vm/object_store.cc
index 36705f7..5031b69 100644
--- a/runtime/vm/object_store.cc
+++ b/runtime/vm/object_store.cc
@@ -182,9 +182,11 @@
   const Library& core_lib = Library::Handle(core_library());
   const String& mangled = String::ZoneHandle(core_lib.PrivateName(name));
   const Class& cls = Class::Handle(object_class());
-  const auto& error = cls.EnsureIsFinalized(Thread::Current());
+  Thread* thread = Thread::Current();
+  const auto& error = cls.EnsureIsFinalized(thread);
   ASSERT(error == Error::null());
-  const Function& result = Function::Handle(cls.LookupDynamicFunction(mangled));
+  const Function& result = Function::Handle(
+      Resolver::ResolveDynamicFunction(thread->zone(), cls, mangled));
   ASSERT(!result.IsNull());
   return result.raw();
 }
@@ -240,7 +242,7 @@
   function_name = async_lib.PrivateName(Symbols::_CompleteOnAsyncReturn());
   ASSERT(!function_name.IsNull());
   function = Resolver::ResolveStatic(async_lib, Object::null_string(),
-                                     function_name, 0, 2, Object::null_array());
+                                     function_name, 0, 3, Object::null_array());
   ASSERT(!function.IsNull());
   set_complete_on_async_return(function);
   if (FLAG_async_debugger) {
@@ -249,6 +251,18 @@
     function.set_is_inlinable(false);
   }
 
+  function_name = async_lib.PrivateName(Symbols::_CompleteOnAsyncError());
+  ASSERT(!function_name.IsNull());
+  function = Resolver::ResolveStatic(async_lib, Object::null_string(),
+                                     function_name, 0, 4, Object::null_array());
+  ASSERT(!function.IsNull());
+  set_complete_on_async_error(function);
+  if (FLAG_async_debugger) {
+    // Disable debugging and inlining the _CompleteOnAsyncError function.
+    function.set_is_debuggable(false);
+    function.set_is_inlinable(false);
+  }
+
   cls =
       async_lib.LookupClassAllowPrivate(Symbols::_AsyncStarStreamController());
   ASSERT(!cls.IsNull());
@@ -257,7 +271,7 @@
   if (FLAG_async_debugger) {
     // Disable debugging and inlining of all functions on the
     // _AsyncStarStreamController class.
-    const Array& functions = Array::Handle(zone, cls.functions());
+    const Array& functions = Array::Handle(zone, cls.current_functions());
     for (intptr_t i = 0; i < functions.Length(); i++) {
       function ^= functions.At(i);
       if (function.IsNull()) {
diff --git a/runtime/vm/object_store.h b/runtime/vm/object_store.h
index fa649a5..ed3e69d 100644
--- a/runtime/vm/object_store.h
+++ b/runtime/vm/object_store.h
@@ -160,6 +160,7 @@
   RW(Instance, stack_overflow)                                                 \
   RW(Instance, out_of_memory)                                                  \
   RW(Function, lookup_port_handler)                                            \
+  RW(Function, lookup_open_ports)                                              \
   RW(Function, handle_message_function)                                        \
   RW(Function, growable_list_factory)                                          \
   RW(Function, simple_instance_of_function)                                    \
@@ -169,8 +170,8 @@
   RW(Function, async_set_thread_stack_trace)                                   \
   RW(Function, async_star_move_next_helper)                                    \
   RW(Function, complete_on_async_return)                                       \
+  RW(Function, complete_on_async_error)                                        \
   RW(Class, async_star_stream_controller)                                      \
-  RW(Array, bytecode_attributes)                                               \
   RW(GrowableObjectArray, llvm_constant_pool)                                  \
   RW(GrowableObjectArray, llvm_function_pool)                                  \
   RW(Array, llvm_constant_hash_table)                                          \
@@ -180,6 +181,8 @@
   RW(GrowableObjectArray, megamorphic_cache_table)                             \
   RW(Code, build_method_extractor_code)                                        \
   RW(Code, dispatch_table_null_error_stub)                                     \
+  RW(Code, late_initialization_error_stub_with_fpu_regs_stub)                  \
+  RW(Code, late_initialization_error_stub_without_fpu_regs_stub)               \
   RW(Code, null_error_stub_with_fpu_regs_stub)                                 \
   RW(Code, null_error_stub_without_fpu_regs_stub)                              \
   RW(Code, null_arg_error_stub_with_fpu_regs_stub)                             \
@@ -242,6 +245,10 @@
 
 #define OBJECT_STORE_STUB_CODE_LIST(DO)                                        \
   DO(dispatch_table_null_error_stub, DispatchTableNullError)                   \
+  DO(late_initialization_error_stub_with_fpu_regs_stub,                        \
+     LateInitializationErrorSharedWithFPURegs)                                 \
+  DO(late_initialization_error_stub_without_fpu_regs_stub,                     \
+     LateInitializationErrorSharedWithoutFPURegs)                              \
   DO(null_error_stub_with_fpu_regs_stub, NullErrorSharedWithFPURegs)           \
   DO(null_error_stub_without_fpu_regs_stub, NullErrorSharedWithoutFPURegs)     \
   DO(null_arg_error_stub_with_fpu_regs_stub, NullArgErrorSharedWithFPURegs)    \
diff --git a/runtime/vm/object_test.cc b/runtime/vm/object_test.cc
index b0eff0e..01a7024 100644
--- a/runtime/vm/object_test.cc
+++ b/runtime/vm/object_test.cc
@@ -23,12 +23,15 @@
 #include "vm/malloc_hooks.h"
 #include "vm/object.h"
 #include "vm/object_store.h"
+#include "vm/resolver.h"
 #include "vm/simulator.h"
 #include "vm/symbols.h"
 #include "vm/unit_test.h"
 
 namespace dart {
 
+#define Z (thread->zone())
+
 DECLARE_FLAG(bool, dual_map_code);
 DECLARE_FLAG(bool, write_protect_code);
 
@@ -49,7 +52,7 @@
 
   // Class has no fields and no functions yet.
   EXPECT_EQ(Array::Handle(cls.fields()).Length(), 0);
-  EXPECT_EQ(Array::Handle(cls.functions()).Length(), 0);
+  EXPECT_EQ(Array::Handle(cls.current_functions()).Length(), 0);
 
   // Setup the interfaces in the class.
   // Normally the class finalizer is resolving super types and interfaces
@@ -118,13 +121,16 @@
   functions.SetAt(5, function);
 
   // Setup the functions in the class.
-  cls.SetFunctions(functions);
+  {
+    SafepointWriteRwLocker ml(thread, thread->isolate_group()->program_lock());
+    cls.SetFunctions(functions);
+  }
 
   // The class can now be finalized.
   cls.Finalize();
 
   function_name = String::New("Foo");
-  function = cls.LookupDynamicFunction(function_name);
+  function = Resolver::ResolveDynamicFunction(Z, cls, function_name);
   EXPECT(function.IsNull());
   function = cls.LookupStaticFunction(function_name);
   EXPECT(!function.IsNull());
@@ -132,7 +138,7 @@
   EXPECT_EQ(cls.raw(), function.Owner());
   EXPECT(function.is_static());
   function_name = String::New("baz");
-  function = cls.LookupDynamicFunction(function_name);
+  function = Resolver::ResolveDynamicFunction(Z, cls, function_name);
   EXPECT(!function.IsNull());
   EXPECT(function_name.Equals(String::Handle(function.name())));
   EXPECT_EQ(cls.raw(), function.Owner());
@@ -141,13 +147,13 @@
   EXPECT(function.IsNull());
 
   function_name = String::New("foo");
-  function = cls.LookupDynamicFunction(function_name);
+  function = Resolver::ResolveDynamicFunction(Z, cls, function_name);
   EXPECT(!function.IsNull());
   EXPECT_EQ(0, function.num_fixed_parameters());
   EXPECT(!function.HasOptionalParameters());
 
   function_name = String::New("bar");
-  function = cls.LookupDynamicFunction(function_name);
+  function = Resolver::ResolveDynamicFunction(Z, cls, function_name);
   EXPECT(!function.IsNull());
   EXPECT_EQ(kNumFixedParameters, function.num_fixed_parameters());
   EXPECT_EQ(kNumOptionalParameters, function.NumOptionalParameters());
@@ -197,8 +203,12 @@
     }
 
     cls.set_interfaces(Array::empty_array());
-    cls.SetFunctions(Array::empty_array());
-    cls.SetFields(fields);
+    {
+      SafepointWriteRwLocker ml(thread,
+                                thread->isolate_group()->program_lock());
+      cls.SetFunctions(Array::empty_array());
+      cls.SetFields(fields);
+    }
     cls.Finalize();
 
     instance = Instance::New(cls);
@@ -296,7 +306,7 @@
 
   // EmptyClass has no fields and no functions.
   EXPECT_EQ(Array::Handle(empty_class.fields()).Length(), 0);
-  EXPECT_EQ(Array::Handle(empty_class.functions()).Length(), 0);
+  EXPECT_EQ(Array::Handle(empty_class.current_functions()).Length(), 0);
 
   ClassFinalizer::FinalizeTypesInClass(empty_class);
   empty_class.Finalize();
@@ -311,7 +321,7 @@
 
   // No fields, functions, or super type for the OneFieldClass.
   EXPECT_EQ(Array::Handle(empty_class.fields()).Length(), 0);
-  EXPECT_EQ(Array::Handle(empty_class.functions()).Length(), 0);
+  EXPECT_EQ(Array::Handle(empty_class.current_functions()).Length(), 0);
   EXPECT_EQ(empty_class.super_type(), AbstractType::null());
   ClassFinalizer::FinalizeTypesInClass(one_field_class);
 
@@ -322,7 +332,10 @@
                  Object::dynamic_type(), TokenPosition::kMinSource,
                  TokenPosition::kMinSource));
   one_fields.SetAt(0, field);
-  one_field_class.SetFields(one_fields);
+  {
+    SafepointWriteRwLocker ml(thread, thread->isolate_group()->program_lock());
+    one_field_class.SetFields(one_fields);
+  }
   one_field_class.Finalize();
   intptr_t header_size = sizeof(ObjectLayout);
   EXPECT_EQ(Utils::RoundUp((header_size + (1 * kWordSize)), kObjectAlignment),
@@ -1611,9 +1624,7 @@
   EXPECT(!th_str.Equals(chars, 3));
 }
 
-static void NoopFinalizer(void* isolate_callback_data,
-                          Dart_WeakPersistentHandle handle,
-                          void* peer) {}
+static void NoopFinalizer(void* isolate_callback_data, void* peer) {}
 
 ISOLATE_UNIT_TEST_CASE(ExternalOneByteString) {
   uint8_t characters[] = {0xF6, 0xF1, 0xE9};
@@ -2513,7 +2524,10 @@
       Function::New(parent_name, FunctionLayout::kRegularFunction, false, false,
                     false, false, false, cls, TokenPosition::kMinSource);
   functions.SetAt(0, parent);
-  cls.SetFunctions(functions);
+  {
+    SafepointWriteRwLocker ml(thread, thread->isolate_group()->program_lock());
+    cls.SetFunctions(functions);
+  }
 
   Function& function = Function::Handle();
   const String& function_name = String::Handle(Symbols::New(thread, "foo"));
@@ -3717,10 +3731,11 @@
 }
 
 static FunctionPtr GetFunction(const Class& cls, const char* name) {
-  const auto& error = cls.EnsureIsFinalized(Thread::Current());
+  Thread* thread = Thread::Current();
+  const auto& error = cls.EnsureIsFinalized(thread);
   EXPECT(error == Error::null());
-  const Function& result = Function::Handle(
-      cls.LookupDynamicFunction(String::Handle(String::New(name))));
+  const Function& result = Function::Handle(Resolver::ResolveDynamicFunction(
+      Z, cls, String::Handle(String::New(name))));
   EXPECT(!result.IsNull());
   return result.raw();
 }
@@ -3762,7 +3777,10 @@
       Function::New(parent_name, FunctionLayout::kRegularFunction, false, false,
                     false, false, false, cls, TokenPosition::kMinSource);
   functions.SetAt(0, parent);
-  cls.SetFunctions(functions);
+  {
+    SafepointWriteRwLocker ml(thread, thread->isolate_group()->program_lock());
+    cls.SetFunctions(functions);
+  }
 
   Function& function = Function::Handle();
   const String& function_name = String::Handle(Symbols::New(thread, "foo"));
@@ -3798,7 +3816,10 @@
       Function::New(parent_name, FunctionLayout::kRegularFunction, false, false,
                     false, false, false, cls, TokenPosition::kMinSource);
   functions.SetAt(0, parent);
-  cls.SetFunctions(functions);
+  {
+    SafepointWriteRwLocker ml(thread, thread->isolate_group()->program_lock());
+    cls.SetFunctions(functions);
+  }
   cls.Finalize();
 
   // Add invocation dispatcher.
@@ -4063,7 +4084,7 @@
   array = cls.fields();
   EXPECT(!array.IsNull());
   EXPECT(array.IsArray());
-  array = cls.functions();
+  array = cls.current_functions();
   EXPECT(!array.IsNull());
   EXPECT(array.IsArray());
 
@@ -4071,7 +4092,7 @@
   array = cls.fields();
   EXPECT(!array.IsNull());
   EXPECT(array.IsArray());
-  array = cls.functions();
+  array = cls.current_functions();
   EXPECT(!array.IsNull());
   EXPECT(array.IsArray());
 
@@ -4079,7 +4100,7 @@
   array = cls.fields();
   EXPECT(!array.IsNull());
   EXPECT(array.IsArray());
-  array = cls.functions();
+  array = cls.current_functions();
   EXPECT(!array.IsNull());
   EXPECT(array.IsArray());
 }
@@ -4173,10 +4194,12 @@
   }
   // Function reference
   {
+    Thread* thread = Thread::Current();
     JSONStream js;
     Class& cls = Class::Handle(isolate->object_store()->bool_class());
     const String& func_name = String::Handle(String::New("toString"));
-    Function& func = Function::Handle(cls.LookupFunction(func_name));
+    Function& func =
+        Function::Handle(Resolver::ResolveFunction(Z, cls, func_name));
     ASSERT(!func.IsNull());
     func.PrintJSON(&js, true);
     ElideJSONSubstring("classes", js.ToCString(), buffer);
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
index 9902dc6..f4bf134 100644
--- a/runtime/vm/parser.cc
+++ b/runtime/vm/parser.cc
@@ -66,8 +66,7 @@
       first_parameter_index_(),
       num_stack_locals_(0),
       have_seen_await_expr_(false),
-      kernel_scopes_(NULL),
-      default_function_type_arguments_(TypeArguments::ZoneHandle(zone())) {
+      kernel_scopes_(NULL) {
   ASSERT(function.IsZoneHandle());
   // Every function has a local variable for the current context.
   LocalVariable* temp = new (zone())
@@ -309,12 +308,6 @@
   num_stack_locals_ = num_stack_locals;
 }
 
-void ParsedFunction::AllocateBytecodeVariables(intptr_t num_stack_locals) {
-  ASSERT(!function().IsIrregexpFunction());
-  first_parameter_index_ = VariableIndex(function().num_fixed_parameters());
-  num_stack_locals_ = num_stack_locals;
-}
-
 void ParsedFunction::SetCovariantParameters(
     const BitVector* covariant_parameters) {
   ASSERT(covariant_parameters_ == nullptr);
@@ -348,6 +341,9 @@
   if (dynamic_closure_call_vars_ != nullptr) return dynamic_closure_call_vars_;
   dynamic_closure_call_vars_ = new (zone()) DynamicClosureCallVars();
 
+  const auto& type_Dynamic = Object::dynamic_type();
+  const auto& type_Function =
+      Type::ZoneHandle(zone(), Type::DartFunctionType());
   const auto& type_Smi = Type::ZoneHandle(zone(), Type::SmiType());
 #define INIT_FIELD(Name, TypeName, Symbol)                                     \
   dynamic_closure_call_vars_->Name = new (zone())                              \
diff --git a/runtime/vm/parser.h b/runtime/vm/parser.h
index 9c56692..76b6249 100644
--- a/runtime/vm/parser.h
+++ b/runtime/vm/parser.h
@@ -165,7 +165,6 @@
 
   void AllocateVariables();
   void AllocateIrregexpVariables(intptr_t num_stack_locals);
-  void AllocateBytecodeVariables(intptr_t num_stack_locals);
 
   void record_await() { have_seen_await_expr_ = true; }
   bool have_seen_await() const { return have_seen_await_expr_; }
@@ -213,14 +212,6 @@
     return scope()->VariableAt(i);
   }
 
-  void SetDefaultFunctionTypeArguments(const TypeArguments& value) {
-    default_function_type_arguments_ = value.raw();
-  }
-
-  const TypeArguments& DefaultFunctionTypeArguments() const {
-    return default_function_type_arguments_;
-  }
-
   // Remembers the set of covariant parameters.
   // [covariant_parameters] is a bitvector of function.NumParameters() length.
   void SetCovariantParameters(const BitVector* covariant_parameters);
@@ -247,8 +238,10 @@
   // because they are both read and written to by the builders.
   struct DynamicClosureCallVars : ZoneAllocated {
 #define FOR_EACH_DYNAMIC_CLOSURE_CALL_VARIABLE(V)                              \
+  V(current_function, Function, CurrentFunction)                               \
   V(current_num_processed, Smi, CurrentNumProcessed)                           \
-  V(current_param_index, Smi, CurrentParamIndex)
+  V(current_param_index, Smi, CurrentParamIndex)                               \
+  V(function_type_args, Dynamic, FunctionTypeArgs)
 
 #define DEFINE_FIELD(Name, _, __) LocalVariable* Name = nullptr;
     FOR_EACH_DYNAMIC_CLOSURE_CALL_VARIABLE(DEFINE_FIELD)
@@ -288,8 +281,6 @@
   const Function* forwarding_stub_super_target_ = nullptr;
   kernel::ScopeBuildingResult* kernel_scopes_;
 
-  TypeArguments& default_function_type_arguments_;
-
   const BitVector* covariant_parameters_ = nullptr;
   const BitVector* generic_covariant_impl_parameters_ = nullptr;
 
diff --git a/runtime/vm/profiler.cc b/runtime/vm/profiler.cc
index bc8199f..d12a763 100644
--- a/runtime/vm/profiler.cc
+++ b/runtime/vm/profiler.cc
@@ -557,16 +557,6 @@
         pc_(reinterpret_cast<uword*>(pc)),
         fp_(reinterpret_cast<uword*>(fp)) {}
 
-  bool IsInterpretedFrame(uword* fp) {
-#if defined(DART_PRECOMPILED_RUNTIME)
-    return false;
-#else
-    Interpreter* interpreter = thread_->interpreter();
-    if (interpreter == nullptr) return false;
-    return interpreter->HasFrame(reinterpret_cast<uword>(fp));
-#endif
-  }
-
   void walk() {
     RELEASE_ASSERT(StubCode::HasBeenInitialized());
     if (thread_->isolate()->IsDeoptimizing()) {
@@ -575,45 +565,21 @@
     }
 
     uword* exit_fp = reinterpret_cast<uword*>(thread_->top_exit_frame_info());
-    bool in_interpreted_frame;
     bool has_exit_frame = exit_fp != 0;
     if (has_exit_frame) {
-      if (IsInterpretedFrame(exit_fp)) {
-        // Exited from interpreter.
-        pc_ = 0;
-        fp_ = exit_fp;
-        in_interpreted_frame = true;
-        RELEASE_ASSERT(IsInterpretedFrame(fp_));
-      } else {
-        // Exited from compiled code.
-        pc_ = 0;
-        fp_ = exit_fp;
-        in_interpreted_frame = false;
-      }
+      // Exited from compiled code.
+      pc_ = 0;
+      fp_ = exit_fp;
 
       // Skip exit frame.
-      pc_ = CallerPC(in_interpreted_frame);
-      fp_ = CallerFP(in_interpreted_frame);
+      pc_ = CallerPC();
+      fp_ = CallerFP();
 
-      // Can only move between interpreted and compiled frames after an exit
-      // frame.
-      RELEASE_ASSERT(IsInterpretedFrame(fp_) == in_interpreted_frame);
     } else {
-      if (thread_->vm_tag() == VMTag::kDartCompiledTagId) {
+      if (thread_->vm_tag() == VMTag::kDartTagId) {
         // Running compiled code.
         // Use the FP and PC from the thread interrupt or simulator; already set
         // in the constructor.
-        in_interpreted_frame = false;
-      } else if (thread_->vm_tag() == VMTag::kDartInterpretedTagId) {
-        // Running interpreter.
-#if defined(DART_PRECOMPILED_RUNTIME)
-        UNREACHABLE();
-#else
-        pc_ = reinterpret_cast<uword*>(thread_->interpreter()->get_pc());
-        fp_ = reinterpret_cast<uword*>(thread_->interpreter()->get_fp());
-#endif
-        in_interpreted_frame = true;
-        RELEASE_ASSERT(IsInterpretedFrame(fp_));
       } else {
         // No Dart on the stack; caller shouldn't use this walker.
         UNREACHABLE();
@@ -622,8 +588,7 @@
 
     sample_->set_exit_frame_sample(has_exit_frame);
 
-    if (!has_exit_frame && !in_interpreted_frame &&
-        (CallerPC(in_interpreted_frame) == EntryMarker(in_interpreted_frame))) {
+    if (!has_exit_frame && (CallerPC() == EntryMarker())) {
       // During the prologue of a function, CallerPC will return the caller's
       // caller. For most frames, the missing PC will be added during profile
       // processing. However, during this stack walk, it can cause us to fail
@@ -637,62 +602,53 @@
 
     for (;;) {
       // Skip entry frame.
-      if (StubCode::InInvocationStub(reinterpret_cast<uword>(pc_),
-                                     in_interpreted_frame)) {
+      if (StubCode::InInvocationStub(reinterpret_cast<uword>(pc_))) {
         pc_ = 0;
-        fp_ = ExitLink(in_interpreted_frame);
+        fp_ = ExitLink();
         if (fp_ == 0) {
           break;  // End of Dart stack.
         }
-        in_interpreted_frame = IsInterpretedFrame(fp_);
 
         // Skip exit frame.
-        pc_ = CallerPC(in_interpreted_frame);
-        fp_ = CallerFP(in_interpreted_frame);
+        pc_ = CallerPC();
+        fp_ = CallerFP();
 
         // At least one frame between exit and next entry frame.
-        RELEASE_ASSERT(!StubCode::InInvocationStub(reinterpret_cast<uword>(pc_),
-                                                   in_interpreted_frame));
+        RELEASE_ASSERT(
+            !StubCode::InInvocationStub(reinterpret_cast<uword>(pc_)));
       }
 
       if (!Append(reinterpret_cast<uword>(pc_), reinterpret_cast<uword>(fp_))) {
         break;  // Sample is full.
       }
 
-      pc_ = CallerPC(in_interpreted_frame);
-      fp_ = CallerFP(in_interpreted_frame);
-
-      // Can only move between interpreted and compiled frames after an exit
-      // frame.
-      RELEASE_ASSERT(IsInterpretedFrame(fp_) == in_interpreted_frame);
+      pc_ = CallerPC();
+      fp_ = CallerFP();
     }
   }
 
  private:
-  uword* CallerPC(bool interp) const {
+  uword* CallerPC() const {
     ASSERT(fp_ != NULL);
-    uword* caller_pc_ptr =
-        fp_ + (interp ? kKBCSavedCallerPcSlotFromFp : kSavedCallerPcSlotFromFp);
+    uword* caller_pc_ptr = fp_ + kSavedCallerPcSlotFromFp;
     // MSan/ASan are unaware of frames initialized by generated code.
     MSAN_UNPOISON(caller_pc_ptr, kWordSize);
     ASAN_UNPOISON(caller_pc_ptr, kWordSize);
     return reinterpret_cast<uword*>(*caller_pc_ptr);
   }
 
-  uword* CallerFP(bool interp) const {
+  uword* CallerFP() const {
     ASSERT(fp_ != NULL);
-    uword* caller_fp_ptr =
-        fp_ + (interp ? kKBCSavedCallerFpSlotFromFp : kSavedCallerFpSlotFromFp);
+    uword* caller_fp_ptr = fp_ + kSavedCallerFpSlotFromFp;
     // MSan/ASan are unaware of frames initialized by generated code.
     MSAN_UNPOISON(caller_fp_ptr, kWordSize);
     ASAN_UNPOISON(caller_fp_ptr, kWordSize);
     return reinterpret_cast<uword*>(*caller_fp_ptr);
   }
 
-  uword* ExitLink(bool interp) const {
+  uword* ExitLink() const {
     ASSERT(fp_ != NULL);
-    uword* exit_link_ptr =
-        fp_ + (interp ? kKBCExitLinkSlotFromEntryFp : kExitLinkSlotFromEntryFp);
+    uword* exit_link_ptr = fp_ + kExitLinkSlotFromEntryFp;
     // MSan/ASan are unaware of frames initialized by generated code.
     MSAN_UNPOISON(exit_link_ptr, kWordSize);
     ASAN_UNPOISON(exit_link_ptr, kWordSize);
@@ -701,8 +657,7 @@
 
   // Note because of stack guards, it is important that this marker lives
   // above FP.
-  uword* EntryMarker(bool interp) const {
-    ASSERT(!interp);
+  uword* EntryMarker() const {
     ASSERT(fp_ != NULL);
     uword* entry_marker_ptr = fp_ + kSavedCallerPcSlotFromFp + 1;
     // MSan/ASan are unaware of frames initialized by generated code.
@@ -1454,8 +1409,6 @@
   void VisitObject(ObjectPtr raw_obj) {
     if (raw_obj->IsCode()) {
       table_->Add(Code::Handle(Code::RawCast(raw_obj)));
-    } else if (raw_obj->IsBytecode()) {
-      table_->Add(Bytecode::Handle(Bytecode::RawCast(raw_obj)));
     }
   }
 
@@ -1506,7 +1459,7 @@
 
 void CodeLookupTable::Add(const Object& code) {
   ASSERT(!code.IsNull());
-  ASSERT(code.IsCode() || code.IsBytecode());
+  ASSERT(code.IsCode());
   CodeDescriptor* cd = new CodeDescriptor(AbstractCode(code.raw()));
   code_objects_.Add(cd);
 }
@@ -1683,11 +1636,6 @@
                                                uword pc_marker,
                                                uword* stack_buffer) {
   ASSERT(cd != NULL);
-  if (cd->code().IsBytecode()) {
-    // Bytecode frame build is atomic from the profiler's perspective: no
-    // missing frame.
-    return;
-  }
   const Code& code = Code::Handle(Code::RawCast(cd->code().raw()));
   ASSERT(!code.IsNull());
   // Some stubs (and intrinsics) do not push a frame onto the stack leaving
diff --git a/runtime/vm/profiler.h b/runtime/vm/profiler.h
index fad8a30..4f92d72 100644
--- a/runtime/vm/profiler.h
+++ b/runtime/vm/profiler.h
@@ -457,26 +457,20 @@
 class AbstractCode {
  public:
   explicit AbstractCode(ObjectPtr code) : code_(Object::Handle(code)) {
-    ASSERT(code_.IsNull() || code_.IsCode() || code_.IsBytecode());
+    ASSERT(code_.IsNull() || code_.IsCode());
   }
 
   ObjectPtr raw() const { return code_.raw(); }
   const Object* handle() const { return &code_; }
 
   uword PayloadStart() const {
-    if (code_.IsCode()) {
-      return Code::Cast(code_).PayloadStart();
-    } else {
-      return Bytecode::Cast(code_).PayloadStart();
-    }
+    ASSERT(code_.IsCode());
+    return Code::Cast(code_).PayloadStart();
   }
 
   uword Size() const {
-    if (code_.IsCode()) {
-      return Code::Cast(code_).Size();
-    } else {
-      return Bytecode::Cast(code_).Size();
-    }
+    ASSERT(code_.IsCode());
+    return Code::Cast(code_).Size();
   }
 
   int64_t compile_timestamp() const {
@@ -490,8 +484,6 @@
   const char* Name() const {
     if (code_.IsCode()) {
       return Code::Cast(code_).Name();
-    } else if (code_.IsBytecode()) {
-      return Bytecode::Cast(code_).Name();
     } else {
       return "";
     }
@@ -501,8 +493,6 @@
     if (code_.IsCode()) {
       return Code::Cast(code_).QualifiedName(
           NameFormattingParams(Object::kUserVisibleName));
-    } else if (code_.IsBytecode()) {
-      return Bytecode::Cast(code_).QualifiedName();
     } else {
       return "";
     }
@@ -511,8 +501,6 @@
   bool IsStubCode() const {
     if (code_.IsCode()) {
       return Code::Cast(code_).IsStubCode();
-    } else if (code_.IsBytecode()) {
-      return (Bytecode::Cast(code_).function() == Function::null());
     } else {
       return false;
     }
@@ -537,8 +525,6 @@
   ObjectPtr owner() const {
     if (code_.IsCode()) {
       return Code::Cast(code_).owner();
-    } else if (code_.IsBytecode()) {
-      return Bytecode::Cast(code_).function();
     } else {
       return Object::null();
     }
@@ -546,7 +532,6 @@
 
   bool IsNull() const { return code_.IsNull(); }
   bool IsCode() const { return code_.IsCode(); }
-  bool IsBytecode() const { return code_.IsBytecode(); }
 
   bool is_optimized() const {
     if (code_.IsCode()) {
diff --git a/runtime/vm/profiler_service.cc b/runtime/vm/profiler_service.cc
index 3c91049..4f88ae4 100644
--- a/runtime/vm/profiler_service.cc
+++ b/runtime/vm/profiler_service.cc
@@ -1218,11 +1218,6 @@
                     (*inlined_token_positions)[i].ToCString());
         }
       }
-    } else if (profile_code->code().IsBytecode()) {
-      // No inlining in bytecode.
-      const Bytecode& bc = Bytecode::CheckedHandle(Thread::Current()->zone(),
-                                                   profile_code->code().raw());
-      token_position = bc.GetTokenIndexOfPC(pc);
     }
 
     if (code.IsNull() || (inlined_functions == NULL) ||
@@ -1676,11 +1671,6 @@
                   (*inlined_token_positions)[i].ToCString());
       }
     }
-  } else if (profile_code->code().IsBytecode()) {
-    // No inlining in bytecode.
-    const Bytecode& bc = Bytecode::CheckedHandle(Thread::Current()->zone(),
-                                                 profile_code->code().raw());
-    token_position = bc.GetTokenIndexOfPC(pc);
   }
 
   if (code.IsNull() || (inlined_functions == NULL) ||
diff --git a/runtime/vm/profiler_test.cc b/runtime/vm/profiler_test.cc
index 1ff4b49..6c3589e 100644
--- a/runtime/vm/profiler_test.cc
+++ b/runtime/vm/profiler_test.cc
@@ -372,11 +372,6 @@
       inlined_functions_cache_.Get(pc, code, sample_, index_,
                                    &inlined_functions_,
                                    &inlined_token_positions_, &token_position);
-    } else if (profile_code->code().IsBytecode()) {
-      // No inlining in bytecode.
-      const Bytecode& bc = Bytecode::CheckedHandle(Thread::Current()->zone(),
-                                                   profile_code->code().raw());
-      token_position = bc.GetTokenIndexOfPC(pc);
     }
 
     if (code.IsNull() || (inlined_functions_ == NULL) ||
@@ -458,23 +453,16 @@
 
     // Move down from the root.
     EXPECT_STREQ("DRT_AllocateObject", walker.VMTagName());
-    if (FLAG_enable_interpreter) {
-      EXPECT_STREQ("[Bytecode] B.boo", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Bytecode] main", walker.CurrentName());
-      EXPECT(!walker.Down());
-    } else {
 #if defined(TARGET_ARCH_IA32)  // Alloc. stub not impl. for ia32.
-      EXPECT_STREQ("[Stub] Allocate A", walker.CurrentName());
+    EXPECT_STREQ("[Stub] Allocate A", walker.CurrentName());
 #else
-      EXPECT_STREQ("[Stub] AllocateObjectSlow", walker.CurrentName());
+    EXPECT_STREQ("[Stub] AllocateObjectSlow", walker.CurrentName());
 #endif
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Unoptimized] B.boo", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Unoptimized] main", walker.CurrentName());
-      EXPECT(!walker.Down());
-    }
+    EXPECT(walker.Down());
+    EXPECT_STREQ("[Unoptimized] B.boo", walker.CurrentName());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("[Unoptimized] main", walker.CurrentName());
+    EXPECT(!walker.Down());
   }
 
   // Query with a time filter where no allocations occurred.
@@ -658,23 +646,16 @@
     ProfileStackWalker walker(&profile);
 
     EXPECT_STREQ("DRT_AllocateObject", walker.VMTagName());
-    if (FLAG_enable_interpreter) {
-      EXPECT_STREQ("[Bytecode] B.boo", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Bytecode] main", walker.CurrentName());
-      EXPECT(!walker.Down());
-    } else {
 #if defined(TARGET_ARCH_IA32)  // Alloc. stub not impl. for ia32.
-      EXPECT_STREQ("[Stub] Allocate A", walker.CurrentName());
+    EXPECT_STREQ("[Stub] Allocate A", walker.CurrentName());
 #else
-      EXPECT_STREQ("[Stub] AllocateObjectSlow", walker.CurrentName());
+    EXPECT_STREQ("[Stub] AllocateObjectSlow", walker.CurrentName());
 #endif
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Unoptimized] B.boo", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Unoptimized] main", walker.CurrentName());
-      EXPECT(!walker.Down());
-    }
+    EXPECT(walker.Down());
+    EXPECT_STREQ("[Unoptimized] B.boo", walker.CurrentName());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("[Unoptimized] main", walker.CurrentName());
+    EXPECT(!walker.Down());
   }
 
   // Turn off allocation tracing for A.
@@ -754,30 +735,20 @@
 
     // Move down from the root.
     EXPECT_STREQ("DRT_AllocateObject", walker.VMTagName());
-    if (FLAG_enable_interpreter) {
-      EXPECT_STREQ("[Bytecode] B.boo", walker.CurrentName());
-      EXPECT_EQ(3, walker.CurrentInclusiveTicks());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Bytecode] main", walker.CurrentName());
-      EXPECT_EQ(3, walker.CurrentInclusiveTicks());
-      EXPECT_EQ(0, walker.CurrentExclusiveTicks());
-      EXPECT(!walker.Down());
-    } else {
 #if defined(TARGET_ARCH_IA32)  // Alloc. stub not impl. for ia32.
-      EXPECT_STREQ("[Stub] Allocate A", walker.CurrentName());
+    EXPECT_STREQ("[Stub] Allocate A", walker.CurrentName());
 #else
-      EXPECT_STREQ("[Stub] AllocateObjectSlow", walker.CurrentName());
+    EXPECT_STREQ("[Stub] AllocateObjectSlow", walker.CurrentName());
 #endif
-      EXPECT_EQ(3, walker.CurrentExclusiveTicks());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Unoptimized] B.boo", walker.CurrentName());
-      EXPECT_EQ(3, walker.CurrentInclusiveTicks());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Unoptimized] main", walker.CurrentName());
-      EXPECT_EQ(3, walker.CurrentInclusiveTicks());
-      EXPECT_EQ(0, walker.CurrentExclusiveTicks());
-      EXPECT(!walker.Down());
-    }
+    EXPECT_EQ(3, walker.CurrentExclusiveTicks());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("[Unoptimized] B.boo", walker.CurrentName());
+    EXPECT_EQ(3, walker.CurrentInclusiveTicks());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("[Unoptimized] main", walker.CurrentName());
+    EXPECT_EQ(3, walker.CurrentInclusiveTicks());
+    EXPECT_EQ(0, walker.CurrentExclusiveTicks());
+    EXPECT(!walker.Down());
   }
 }
 ISOLATE_UNIT_TEST_CASE(Profiler_FunctionTicks) {
@@ -839,15 +810,13 @@
 
     EXPECT_STREQ("DRT_AllocateObject", walker.VMTagName());
 
-    if (!FLAG_enable_interpreter) {
 #if defined(TARGET_ARCH_IA32)  // Alloc. stub not impl. for ia32.
-      EXPECT_STREQ("[Stub] Allocate A", walker.CurrentName());
+    EXPECT_STREQ("[Stub] Allocate A", walker.CurrentName());
 #else
-      EXPECT_STREQ("[Stub] AllocateObjectSlow", walker.CurrentName());
+    EXPECT_STREQ("[Stub] AllocateObjectSlow", walker.CurrentName());
 #endif
-      EXPECT_EQ(3, walker.CurrentExclusiveTicks());
-      EXPECT(walker.Down());
-    }
+    EXPECT_EQ(3, walker.CurrentExclusiveTicks());
+    EXPECT(walker.Down());
     EXPECT_STREQ("B.boo", walker.CurrentName());
     EXPECT_EQ(3, walker.CurrentInclusiveTicks());
     EXPECT(walker.Down());
@@ -902,19 +871,13 @@
     EXPECT_EQ(1, profile.sample_count());
     ProfileStackWalker walker(&profile);
 
-    if (FLAG_enable_interpreter) {
-      EXPECT_STREQ("DRT_AllocateObject", walker.VMTagName());
-      EXPECT_STREQ("[Bytecode] foo", walker.CurrentName());
-      EXPECT(!walker.Down());
-    } else {
-      EXPECT_STREQ("Double_add", walker.VMTagName());
-      EXPECT_STREQ("[Unoptimized] double._add", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Unoptimized] double.+", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Unoptimized] foo", walker.CurrentName());
-      EXPECT(!walker.Down());
-    }
+    EXPECT_STREQ("Double_add", walker.VMTagName());
+    EXPECT_STREQ("[Unoptimized] double._add", walker.CurrentName());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("[Unoptimized] double.+", walker.CurrentName());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("[Unoptimized] foo", walker.CurrentName());
+    EXPECT(!walker.Down());
   }
 
   double_class.SetTraceAllocation(false);
@@ -971,19 +934,12 @@
     ProfileStackWalker walker(&profile);
 
     EXPECT_STREQ("DRT_AllocateArray", walker.VMTagName());
-    if (FLAG_enable_interpreter) {
-      EXPECT_STREQ("[Bytecode] new _List", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Bytecode] foo", walker.CurrentName());
-      EXPECT(!walker.Down());
-    } else {
-      EXPECT_STREQ("[Stub] AllocateArray", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Unoptimized] new _List", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Unoptimized] foo", walker.CurrentName());
-      EXPECT(!walker.Down());
-    }
+    EXPECT_STREQ("[Stub] AllocateArray", walker.CurrentName());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("[Unoptimized] new _List", walker.CurrentName());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("[Unoptimized] foo", walker.CurrentName());
+    EXPECT(!walker.Down());
   }
 
   array_class.SetTraceAllocation(false);
@@ -1065,15 +1021,10 @@
     ProfileStackWalker walker(&profile);
 
     EXPECT_STREQ("DRT_AllocateContext", walker.VMTagName());
-    if (FLAG_enable_interpreter) {
-      EXPECT_STREQ("[Bytecode] foo", walker.CurrentName());
-      EXPECT(!walker.Down());
-    } else {
-      EXPECT_STREQ("[Stub] AllocateContext", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Unoptimized] foo", walker.CurrentName());
-      EXPECT(!walker.Down());
-    }
+    EXPECT_STREQ("[Stub] AllocateContext", walker.CurrentName());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("[Unoptimized] foo", walker.CurrentName());
+    EXPECT(!walker.Down());
   }
 
   context_class.SetTraceAllocation(false);
@@ -1131,14 +1082,12 @@
     ProfileStackWalker walker(&profile);
 
     EXPECT_SUBSTRING("DRT_AllocateObject", walker.VMTagName());
-    if (!FLAG_enable_interpreter) {
 #if defined(TARGET_ARCH_IA32)  // Alloc. stub not impl. for ia32.
-      EXPECT_STREQ("[Stub] Allocate _Closure", walker.CurrentName());
+    EXPECT_STREQ("[Stub] Allocate _Closure", walker.CurrentName());
 #else
-      EXPECT_STREQ("[Stub] AllocateObjectSlow", walker.CurrentName());
+    EXPECT_STREQ("[Stub] AllocateObjectSlow", walker.CurrentName());
 #endif
-      EXPECT(walker.Down());
-    }
+    EXPECT(walker.Down());
     EXPECT_SUBSTRING("foo", walker.CurrentName());
     EXPECT(!walker.Down());
   }
@@ -1204,19 +1153,12 @@
     ProfileStackWalker walker(&profile);
 
     EXPECT_STREQ("DRT_AllocateTypedData", walker.VMTagName());
-    if (FLAG_enable_interpreter) {
-      EXPECT_STREQ("[Bytecode] new Float32List", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Bytecode] foo", walker.CurrentName());
-      EXPECT(!walker.Down());
-    } else {
-      EXPECT_STREQ("[Stub] AllocateFloat32Array", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Unoptimized] new Float32List", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Unoptimized] foo", walker.CurrentName());
-      EXPECT(!walker.Down());
-    }
+    EXPECT_STREQ("[Stub] AllocateFloat32Array", walker.CurrentName());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("[Unoptimized] new Float32List", walker.CurrentName());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("[Unoptimized] foo", walker.CurrentName());
+    EXPECT(!walker.Down());
   }
 
   float32_list_class.SetTraceAllocation(false);
@@ -1291,17 +1233,10 @@
     ProfileStackWalker walker(&profile);
 
     EXPECT_STREQ("String_concat", walker.VMTagName());
-    if (FLAG_enable_interpreter) {
-      EXPECT_STREQ("[Bytecode] _StringBase.+", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Bytecode] foo", walker.CurrentName());
-      EXPECT(!walker.Down());
-    } else {
-      EXPECT_STREQ("[Unoptimized] _StringBase.+", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Unoptimized] foo", walker.CurrentName());
-      EXPECT(!walker.Down());
-    }
+    EXPECT_STREQ("[Unoptimized] _StringBase.+", walker.CurrentName());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("[Unoptimized] foo", walker.CurrentName());
+    EXPECT(!walker.Down());
   }
 
   one_byte_string_class.SetTraceAllocation(false);
@@ -1376,31 +1311,16 @@
     ProfileStackWalker walker(&profile);
 
     EXPECT_STREQ("Internal_allocateOneByteString", walker.VMTagName());
-    if (FLAG_enable_interpreter) {
-      EXPECT_STREQ("Internal_allocateOneByteString", walker.VMTagName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Unoptimized] String._allocate", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Unoptimized] String._concatAll", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Unoptimized] _StringBase._interpolate",
-                   walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Bytecode] foo", walker.CurrentName());
-      EXPECT(!walker.Down());
-    } else {
-      EXPECT_STREQ("Internal_allocateOneByteString", walker.VMTagName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Unoptimized] String._allocate", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Unoptimized] String._concatAll", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Unoptimized] _StringBase._interpolate",
-                   walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Unoptimized] foo", walker.CurrentName());
-      EXPECT(!walker.Down());
-    }
+    EXPECT(walker.Down());
+    EXPECT_STREQ("[Unoptimized] String._allocate", walker.CurrentName());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("[Unoptimized] String._concatAll", walker.CurrentName());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("[Unoptimized] _StringBase._interpolate",
+                 walker.CurrentName());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("[Unoptimized] foo", walker.CurrentName());
+    EXPECT(!walker.Down());
   }
 
   one_byte_string_class.SetTraceAllocation(false);
@@ -1435,7 +1355,6 @@
   DisableNativeProfileScope dnps;
   DisableBackgroundCompilationScope dbcs;
   SetFlagScope<int> sfs(&FLAG_optimization_counter_threshold, 30000);
-  SetFlagScope<int> sfs2(&FLAG_compilation_counter_threshold, 0);
 
   const char* kScript =
       "class A {\n"
@@ -1562,7 +1481,6 @@
   DisableNativeProfileScope dnps;
   DisableBackgroundCompilationScope dbcs;
   SetFlagScope<int> sfs(&FLAG_optimization_counter_threshold, 30000);
-  SetFlagScope<int> sfs2(&FLAG_compilation_counter_threshold, 0);
 
   const char* kScript =
       "class A {\n"
@@ -1728,95 +1646,52 @@
     ProfileStackWalker walker(&profile);
 
     EXPECT_STREQ("DRT_AllocateObject", walker.VMTagName());
-    if (FLAG_enable_interpreter) {
-      EXPECT_STREQ("[Bytecode] B.boo", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Bytecode] orange", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Bytecode] napkin", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Bytecode] mayo", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Bytecode] lemon", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Bytecode] kindle", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Bytecode] jeep", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Bytecode] ice", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Bytecode] haystack", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Bytecode] granola", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Bytecode] fred", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Bytecode] elephant", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Bytecode] dog", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Bytecode] cantaloupe", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Bytecode] banana", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Bytecode] apple", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Bytecode] secondInit", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Bytecode] init", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Bytecode] go", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Bytecode] main", walker.CurrentName());
-      EXPECT(!walker.Down());
-    } else {
 #if defined(TARGET_ARCH_IA32)  // Alloc. stub not impl. for ia32.
-      EXPECT_STREQ("[Stub] Allocate A", walker.CurrentName());
+    EXPECT_STREQ("[Stub] Allocate A", walker.CurrentName());
 #else
-      EXPECT_STREQ("[Stub] AllocateObjectSlow", walker.CurrentName());
+    EXPECT_STREQ("[Stub] AllocateObjectSlow", walker.CurrentName());
 #endif
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Unoptimized] B.boo", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Unoptimized] orange", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Unoptimized] napkin", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Unoptimized] mayo", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Unoptimized] lemon", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Unoptimized] kindle", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Unoptimized] jeep", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Unoptimized] ice", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Unoptimized] haystack", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Unoptimized] granola", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Unoptimized] fred", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Unoptimized] elephant", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Unoptimized] dog", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Unoptimized] cantaloupe", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Unoptimized] banana", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Unoptimized] apple", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Unoptimized] secondInit", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Unoptimized] init", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Unoptimized] go", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Unoptimized] main", walker.CurrentName());
-      EXPECT(!walker.Down());
-    }
+    EXPECT(walker.Down());
+    EXPECT_STREQ("[Unoptimized] B.boo", walker.CurrentName());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("[Unoptimized] orange", walker.CurrentName());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("[Unoptimized] napkin", walker.CurrentName());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("[Unoptimized] mayo", walker.CurrentName());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("[Unoptimized] lemon", walker.CurrentName());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("[Unoptimized] kindle", walker.CurrentName());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("[Unoptimized] jeep", walker.CurrentName());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("[Unoptimized] ice", walker.CurrentName());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("[Unoptimized] haystack", walker.CurrentName());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("[Unoptimized] granola", walker.CurrentName());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("[Unoptimized] fred", walker.CurrentName());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("[Unoptimized] elephant", walker.CurrentName());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("[Unoptimized] dog", walker.CurrentName());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("[Unoptimized] cantaloupe", walker.CurrentName());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("[Unoptimized] banana", walker.CurrentName());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("[Unoptimized] apple", walker.CurrentName());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("[Unoptimized] secondInit", walker.CurrentName());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("[Unoptimized] init", walker.CurrentName());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("[Unoptimized] go", walker.CurrentName());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("[Unoptimized] main", walker.CurrentName());
+    EXPECT(!walker.Down());
   }
 }
 
@@ -1866,15 +1741,13 @@
     ProfileStackWalker walker(&profile, true);
 
     EXPECT_STREQ("DRT_AllocateObject", walker.VMTagName());
-    if (!FLAG_enable_interpreter) {
 #if defined(TARGET_ARCH_IA32)  // Alloc. stub not impl. for ia32.
-      EXPECT_STREQ("[Stub] Allocate A", walker.CurrentName());
+    EXPECT_STREQ("[Stub] Allocate A", walker.CurrentName());
 #else
-      EXPECT_STREQ("[Stub] AllocateObjectSlow", walker.CurrentName());
+    EXPECT_STREQ("[Stub] AllocateObjectSlow", walker.CurrentName());
 #endif
-      EXPECT_EQ(1, walker.CurrentExclusiveTicks());
-      EXPECT(walker.Down());
-    }
+    EXPECT_EQ(1, walker.CurrentExclusiveTicks());
+    EXPECT(walker.Down());
     EXPECT_STREQ("B.boo", walker.CurrentName());
     EXPECT_EQ(1, walker.CurrentInclusiveTicks());
     EXPECT_STREQ("A", walker.CurrentToken());
@@ -1893,7 +1766,6 @@
   DisableBackgroundCompilationScope dbcs;
   // Optimize quickly.
   SetFlagScope<int> sfs(&FLAG_optimization_counter_threshold, 5);
-  SetFlagScope<int> sfs2(&FLAG_compilation_counter_threshold, 0);
   const char* kScript =
       "class A {\n"
       "  var a;\n"
@@ -2029,15 +1901,13 @@
     ProfileStackWalker walker(&profile, true);
 
     EXPECT_STREQ("DRT_AllocateObject", walker.VMTagName());
-    if (!FLAG_enable_interpreter) {
 #if defined(TARGET_ARCH_IA32)  // Alloc. stub not impl. for ia32.
-      EXPECT_STREQ("[Stub] Allocate A", walker.CurrentName());
+    EXPECT_STREQ("[Stub] Allocate A", walker.CurrentName());
 #else
-      EXPECT_STREQ("[Stub] AllocateObjectSlow", walker.CurrentName());
+    EXPECT_STREQ("[Stub] AllocateObjectSlow", walker.CurrentName());
 #endif
-      EXPECT_EQ(1, walker.CurrentExclusiveTicks());
-      EXPECT(walker.Down());
-    }
+    EXPECT_EQ(1, walker.CurrentExclusiveTicks());
+    EXPECT(walker.Down());
     EXPECT_STREQ("B.boo", walker.CurrentName());
     EXPECT_EQ(1, walker.CurrentInclusiveTicks());
     EXPECT_STREQ("A", walker.CurrentToken());
@@ -2071,7 +1941,6 @@
   DisableBackgroundCompilationScope dbcs;
   // Optimize quickly.
   SetFlagScope<int> sfs(&FLAG_optimization_counter_threshold, 5);
-  SetFlagScope<int> sfs2(&FLAG_compilation_counter_threshold, 0);
 
   const char* kScript =
       "class A {\n"
@@ -2237,15 +2106,13 @@
     ProfileStackWalker walker(&profile, true);
 
     EXPECT_STREQ("DRT_AllocateObject", walker.VMTagName());
-    if (!FLAG_enable_interpreter) {
 #if defined(TARGET_ARCH_IA32)  // Alloc. stub not impl. for ia32.
-      EXPECT_STREQ("[Stub] Allocate A", walker.CurrentName());
+    EXPECT_STREQ("[Stub] Allocate A", walker.CurrentName());
 #else
-      EXPECT_STREQ("[Stub] AllocateObjectSlow", walker.CurrentName());
+    EXPECT_STREQ("[Stub] AllocateObjectSlow", walker.CurrentName());
 #endif
-      EXPECT_EQ(1, walker.CurrentExclusiveTicks());
-      EXPECT(walker.Down());
-    }
+    EXPECT_EQ(1, walker.CurrentExclusiveTicks());
+    EXPECT(walker.Down());
     EXPECT_STREQ("B.boo", walker.CurrentName());
     EXPECT_EQ(1, walker.CurrentInclusiveTicks());
     EXPECT_STREQ("A", walker.CurrentToken());
@@ -2284,7 +2151,6 @@
   DisableBackgroundCompilationScope dbcs;
   // Optimize quickly.
   SetFlagScope<int> sfs(&FLAG_optimization_counter_threshold, 5);
-  SetFlagScope<int> sfs2(&FLAG_compilation_counter_threshold, 0);
 
   const char* kScript =
       "class A {\n"
diff --git a/runtime/vm/program_visitor.cc b/runtime/vm/program_visitor.cc
index 483ce9b..5b7319c 100644
--- a/runtime/vm/program_visitor.cc
+++ b/runtime/vm/program_visitor.cc
@@ -128,7 +128,7 @@
 
     if (!visitor_->IsFunctionVisitor()) return;
 
-    class_functions_ = cls.functions();
+    class_functions_ = cls.current_functions();
     for (intptr_t j = 0; j < class_functions_.Length(); j++) {
       class_function_ ^= class_functions_.At(j);
       AddToWorklist(class_function_);
@@ -749,7 +749,6 @@
    public:
     explicit DedupPcDescriptorsVisitor(Zone* zone)
         : Dedupper(zone),
-          bytecode_(Bytecode::Handle(zone)),
           pc_descriptor_(PcDescriptors::Handle(zone)) {
       if (Snapshot::IncludesCode(Dart::vm_snapshot_kind())) {
         // Prefer existing objects in the VM isolate.
@@ -763,17 +762,7 @@
       code.set_pc_descriptors(pc_descriptor_);
     }
 
-    void VisitFunction(const Function& function) {
-      bytecode_ = function.bytecode();
-      if (bytecode_.IsNull()) return;
-      if (bytecode_.InVMIsolateHeap()) return;
-      pc_descriptor_ = bytecode_.pc_descriptors();
-      pc_descriptor_ = Dedup(pc_descriptor_);
-      bytecode_.set_pc_descriptors(pc_descriptor_);
-    }
-
    private:
-    Bytecode& bytecode_;
     PcDescriptors& pc_descriptor_;
   };
 
diff --git a/runtime/vm/raw_object.cc b/runtime/vm/raw_object.cc
index 3dfd910..1feb330 100644
--- a/runtime/vm/raw_object.cc
+++ b/runtime/vm/raw_object.cc
@@ -505,7 +505,6 @@
   }
 
 REGULAR_VISITOR(Class)
-REGULAR_VISITOR(Bytecode)
 REGULAR_VISITOR(Type)
 REGULAR_VISITOR(TypeRef)
 REGULAR_VISITOR(TypeParameter)
@@ -520,7 +519,6 @@
 REGULAR_VISITOR(Library)
 REGULAR_VISITOR(LibraryPrefix)
 REGULAR_VISITOR(Namespace)
-REGULAR_VISITOR(ParameterTypeCheck)
 REGULAR_VISITOR(SingleTargetCache)
 REGULAR_VISITOR(UnlinkedCall)
 REGULAR_VISITOR(MonomorphicSmiableCall)
@@ -645,16 +643,6 @@
 #endif
 }
 
-bool BytecodeLayout::ContainsPC(ObjectPtr raw_obj, uword pc) {
-  if (raw_obj->IsBytecode()) {
-    BytecodePtr raw_bytecode = static_cast<BytecodePtr>(raw_obj);
-    uword start = raw_bytecode->ptr()->instructions_;
-    uword size = raw_bytecode->ptr()->instructions_size_;
-    return (pc - start) <= size;  // pc may point past last instruction.
-  }
-  return false;
-}
-
 intptr_t ObjectPoolLayout::VisitObjectPoolPointers(
     ObjectPoolPtr raw_obj,
     ObjectPointerVisitor* visitor) {
@@ -664,8 +652,7 @@
   for (intptr_t i = 0; i < length; ++i) {
     ObjectPool::EntryType entry_type =
         ObjectPool::TypeBits::decode(entry_bits[i]);
-    if ((entry_type == ObjectPool::EntryType::kTaggedObject) ||
-        (entry_type == ObjectPool::EntryType::kNativeEntryData)) {
+    if (entry_type == ObjectPool::EntryType::kTaggedObject) {
       visitor->VisitPointer(&entries[i].raw_obj_);
     }
   }
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index 498fd5d..91a2ddc 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -92,8 +92,6 @@
   friend class object;                                                         \
   friend class ObjectLayout;                                                   \
   friend class Heap;                                                           \
-  friend class Interpreter;                                                    \
-  friend class InterpreterHelpers;                                             \
   friend class Simulator;                                                      \
   friend class SimulatorHelpers;                                               \
   friend class OffsetsTable;                                                   \
@@ -694,8 +692,6 @@
   friend class Instance;                // StorePointer
   friend class StackFrame;              // GetCodeObject assertion.
   friend class CodeLookupTableBuilder;  // profiler
-  friend class Interpreter;
-  friend class InterpreterHelpers;
   friend class Simulator;
   friend class SimulatorHelpers;
   friend class ObjectLocator;
@@ -804,9 +800,7 @@
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
-  typedef BitField<uint32_t, bool, 0, 1> IsDeclaredInBytecode;
-  typedef BitField<uint32_t, uint32_t, 1, 31> BinaryDeclarationOffset;
-  uint32_t binary_declaration_;
+  uint32_t kernel_offset_;
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
 
   friend class Instance;
@@ -943,7 +937,7 @@
   // an integer or a double. It includes the two bits for the receiver, even
   // though currently we do not have information from TFA that allows the
   // receiver to be unboxed.
-  class UnboxedParameterBitmap {
+  class alignas(8) UnboxedParameterBitmap {
    public:
     static constexpr intptr_t kBitsPerParameter = 2;
     static constexpr intptr_t kParameterBitmask = (1 << kBitsPerParameter) - 1;
@@ -1044,7 +1038,6 @@
     return reinterpret_cast<ObjectPtr*>(&ic_data_array_);
   }
   CodePtr code_;  // Currently active code. Accessed from generated code.
-  NOT_IN_PRECOMPILED(BytecodePtr bytecode_);
   NOT_IN_PRECOMPILED(CodePtr unoptimized_code_);  // Unoptimized code, keep it
                                                   // after optimization.
 #if defined(DART_PRECOMPILED_RUNTIME)
@@ -1053,6 +1046,7 @@
   VISIT_TO(ObjectPtr, unoptimized_code_);
 #endif
 
+  NOT_IN_PRECOMPILED(UnboxedParameterBitmap unboxed_parameters_info_);
   NOT_IN_PRECOMPILED(TokenPosition token_pos_);
   NOT_IN_PRECOMPILED(TokenPosition end_token_pos_);
   uint32_t kind_tag_;  // See Function::KindTagBits.
@@ -1093,17 +1087,13 @@
   F(int, int8_t, inlining_depth)
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
-  typedef BitField<uint32_t, bool, 0, 1> IsDeclaredInBytecode;
-  typedef BitField<uint32_t, uint32_t, 1, 31> BinaryDeclarationOffset;
-  uint32_t binary_declaration_;
+  uint32_t kernel_offset_;
 
 #define DECLARE(return_type, type, name) type name##_;
   JIT_FUNCTION_COUNTERS(DECLARE)
 #undef DECLARE
 
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
-
-  NOT_IN_PRECOMPILED(UnboxedParameterBitmap unboxed_parameters_info_);
 };
 
 class ClosureDataLayout : public ObjectLayout {
@@ -1115,7 +1105,11 @@
   FunctionPtr parent_function_;  // Enclosing function of this local function.
   TypePtr signature_type_;
   InstancePtr closure_;  // Closure object for static implicit closures.
-  VISIT_TO(ObjectPtr, closure_);
+  // Instantiate-to-bounds TAV for use when no TAV is provided.
+  TypeArgumentsPtr default_type_arguments_;
+  // Additional information about the instantiate-to-bounds TAV.
+  SmiPtr default_type_arguments_info_;
+  VISIT_TO(ObjectPtr, default_type_arguments_info_);
 
   friend class Function;
 };
@@ -1222,9 +1216,7 @@
                                 // kInvalidCid otherwise.
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
-  typedef BitField<uint32_t, bool, 0, 1> IsDeclaredInBytecode;
-  typedef BitField<uint32_t, uint32_t, 1, 31> BinaryDeclarationOffset;
-  uint32_t binary_declaration_;
+  uint32_t kernel_offset_;
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
 
   // Offset to the guarded length field inside an instance of class matching
@@ -1372,9 +1364,7 @@
   uint8_t flags_;         // BitField for LibraryFlags.
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
-  typedef BitField<uint32_t, bool, 0, 1> IsDeclaredInBytecode;
-  typedef BitField<uint32_t, uint32_t, 1, 31> BinaryDeclarationOffset;
-  uint32_t binary_declaration_;
+  uint32_t kernel_offset_;
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
 
   friend class Class;
@@ -1405,7 +1395,6 @@
   ExternalTypedDataPtr metadata_mappings_;
   ArrayPtr scripts_;
   ArrayPtr constants_;
-  ArrayPtr bytecode_component_;
   GrowableObjectArrayPtr potential_natives_;
   GrowableObjectArrayPtr potential_pragma_functions_;
   ExternalTypedDataPtr constants_table_;
@@ -1549,39 +1538,6 @@
   friend class CallSiteResetter;
 };
 
-class BytecodeLayout : public ObjectLayout {
-  RAW_HEAP_OBJECT_IMPLEMENTATION(Bytecode);
-
-  uword instructions_;
-  intptr_t instructions_size_;
-
-  VISIT_FROM(ObjectPtr, object_pool_);
-  ObjectPoolPtr object_pool_;
-  FunctionPtr function_;
-  ArrayPtr closures_;
-  ExceptionHandlersPtr exception_handlers_;
-  PcDescriptorsPtr pc_descriptors_;
-  NOT_IN_PRODUCT(LocalVarDescriptorsPtr var_descriptors_);
-#if defined(PRODUCT)
-  VISIT_TO(ObjectPtr, pc_descriptors_);
-#else
-  VISIT_TO(ObjectPtr, var_descriptors_);
-#endif
-
-  ObjectPtr* to_snapshot(Snapshot::Kind kind) {
-    return reinterpret_cast<ObjectPtr*>(&pc_descriptors_);
-  }
-
-  int32_t instructions_binary_offset_;
-  int32_t source_positions_binary_offset_;
-  int32_t local_variables_binary_offset_;
-
-  static bool ContainsPC(ObjectPtr raw_obj, uword pc);
-
-  friend class Function;
-  friend class StackFrame;
-};
-
 class ObjectPoolLayout : public ObjectLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(ObjectPool);
 
@@ -2010,18 +1966,6 @@
   friend class SnapshotReader;
 };
 
-class ParameterTypeCheckLayout : public ObjectLayout {
-  RAW_HEAP_OBJECT_IMPLEMENTATION(ParameterTypeCheck);
-  intptr_t index_;
-  VISIT_FROM(ObjectPtr, param_);
-  AbstractTypePtr param_;
-  AbstractTypePtr type_or_bound_;
-  StringPtr name_;
-  SubtypeTestCachePtr cache_;
-  VISIT_TO(ObjectPtr, cache_);
-  ObjectPtr* to_snapshot(Snapshot::Kind kind) { return to(); }
-};
-
 class SingleTargetCacheLayout : public ObjectLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(SingleTargetCache);
   VISIT_FROM(ObjectPtr, target_);
@@ -2289,6 +2233,11 @@
   StringPtr name_;
   SmiPtr hash_;
   AbstractTypePtr bound_;  // ObjectType if no explicit bound specified.
+  // The instantiation to bounds of this parameter as calculated by the CFE.
+  //
+  // TODO(dartbug.com/43901): Once a separate TypeParameters class has been
+  // added, move these there and remove them from TypeParameter objects.
+  AbstractTypePtr default_argument_;
   FunctionPtr parameterized_function_;
   VISIT_TO(ObjectPtr, parameterized_function_)
   ClassIdTagType parameterized_class_id_;
@@ -2297,6 +2246,7 @@
   uint8_t flags_;
   int8_t nullability_;
 
+ public:
   using FinalizedBit = BitField<decltype(flags_), bool, 0, 1>;
   using GenericCovariantImplBit =
       BitField<decltype(flags_), bool, FinalizedBit::kNextBit, 1>;
@@ -2304,6 +2254,7 @@
       BitField<decltype(flags_), bool, GenericCovariantImplBit::kNextBit, 1>;
   static constexpr intptr_t kFlagsBitSize = DeclarationBit::kNextBit;
 
+ private:
   ObjectPtr* to_snapshot(Snapshot::Kind kind) { return to(); }
 
   friend class CidRewriteVisitor;
@@ -2733,8 +2684,6 @@
  protected:
   VISIT_FROM(RawCompressed, length_)
   VISIT_TO(RawCompressed, length_)
-
-  friend class BytecodeLayout;
 };
 
 class PointerLayout : public PointerBaseLayout {
@@ -2777,7 +2726,13 @@
   VISIT_FROM(ObjectPtr, send_port_)
   SendPortPtr send_port_;
   InstancePtr handler_;
-  VISIT_TO(ObjectPtr, handler_)
+#if !defined(PRODUCT)
+  StringPtr debug_name_;
+  StackTracePtr allocation_location_;
+  VISIT_TO(ObjectPtr, allocation_location_)
+#else
+  VISIT_TO(ObjectPtr, handler_);
+#endif  // !defined(PRODUCT)
 };
 
 class TransferableTypedDataLayout : public InstanceLayout {
diff --git a/runtime/vm/raw_object_fields.cc b/runtime/vm/raw_object_fields.cc
index 8b6b184..d810d3d 100644
--- a/runtime/vm/raw_object_fields.cc
+++ b/runtime/vm/raw_object_fields.cc
@@ -89,7 +89,6 @@
   F(KernelProgramInfo, metadata_mappings_)                                     \
   F(KernelProgramInfo, scripts_)                                               \
   F(KernelProgramInfo, constants_)                                             \
-  F(KernelProgramInfo, bytecode_component_)                                    \
   F(KernelProgramInfo, potential_natives_)                                     \
   F(KernelProgramInfo, potential_pragma_functions_)                            \
   F(KernelProgramInfo, constants_table_)                                       \
@@ -105,18 +104,8 @@
   F(Code, compressed_stackmaps_)                                               \
   F(Code, inlined_id_to_function_)                                             \
   F(Code, code_source_map_)                                                    \
-  F(Bytecode, object_pool_)                                                    \
-  F(Bytecode, instructions_)                                                   \
-  F(Bytecode, function_)                                                       \
-  F(Bytecode, exception_handlers_)                                             \
-  F(Bytecode, pc_descriptors_)                                                 \
-  F(Bytecode, closures_)                                                       \
   F(ExceptionHandlers, handled_types_data_)                                    \
   F(Context, parent_)                                                          \
-  F(ParameterTypeCheck, param_)                                                \
-  F(ParameterTypeCheck, type_or_bound_)                                        \
-  F(ParameterTypeCheck, name_)                                                 \
-  F(ParameterTypeCheck, cache_)                                                \
   F(SingleTargetCache, target_)                                                \
   F(UnlinkedCall, target_name_)                                                \
   F(UnlinkedCall, args_descriptor_)                                            \
@@ -215,12 +204,15 @@
   F(Code, deopt_info_array_)                                                   \
   F(Code, static_calls_target_table_)                                          \
   F(ICData, receivers_static_type_)                                            \
-  F(Function, bytecode_)                                                       \
   F(Function, unoptimized_code_)                                               \
   F(Field, saved_initial_value_)                                               \
   F(Field, type_test_cache_)                                                   \
   F(WeakSerializationReference, target_)
 
+#define NON_PRODUCT_CLASSES_AND_FIELDS(F)                                      \
+  F(ReceivePort, debug_name_)                                                  \
+  F(ReceivePort, allocation_location_)
+
 OffsetsTable::OffsetsTable(Zone* zone) : cached_offsets_(zone) {
   for (intptr_t i = 0; offsets_table[i].class_id != -1; ++i) {
     OffsetsTableEntry entry = offsets_table[i];
@@ -240,6 +232,10 @@
 // clang-format off
 OffsetsTable::OffsetsTableEntry OffsetsTable::offsets_table[] = {
     COMMON_CLASSES_AND_FIELDS(DEFINE_OFFSETS_TABLE_ENTRY)
+#if !defined(PRODUCT)
+    NON_PRODUCT_CLASSES_AND_FIELDS(DEFINE_OFFSETS_TABLE_ENTRY)
+#endif
+
 #if defined(DART_PRECOMPILED_RUNTIME)
     AOT_CLASSES_AND_FIELDS(DEFINE_OFFSETS_TABLE_ENTRY)
 #else
diff --git a/runtime/vm/raw_object_snapshot.cc b/runtime/vm/raw_object_snapshot.cc
index 2f36c97..4b011d9 100644
--- a/runtime/vm/raw_object_snapshot.cc
+++ b/runtime/vm/raw_object_snapshot.cc
@@ -545,7 +545,6 @@
 
 MESSAGE_SNAPSHOT_UNREACHABLE(AbstractType);
 MESSAGE_SNAPSHOT_UNREACHABLE(Bool);
-MESSAGE_SNAPSHOT_UNREACHABLE(Bytecode);
 MESSAGE_SNAPSHOT_UNREACHABLE(ClosureData);
 MESSAGE_SNAPSHOT_UNREACHABLE(Code);
 MESSAGE_SNAPSHOT_UNREACHABLE(CodeSourceMap);
@@ -566,7 +565,6 @@
 MESSAGE_SNAPSHOT_UNREACHABLE(MegamorphicCache);
 MESSAGE_SNAPSHOT_UNREACHABLE(Namespace);
 MESSAGE_SNAPSHOT_UNREACHABLE(ObjectPool);
-MESSAGE_SNAPSHOT_UNREACHABLE(ParameterTypeCheck);
 MESSAGE_SNAPSHOT_UNREACHABLE(PatchClass);
 MESSAGE_SNAPSHOT_UNREACHABLE(PcDescriptors);
 MESSAGE_SNAPSHOT_UNREACHABLE(RedirectionData);
@@ -1376,7 +1374,6 @@
 
 // This function's name can appear in Observatory.
 static void IsolateMessageTypedDataFinalizer(void* isolate_callback_data,
-                                             Dart_WeakPersistentHandle handle,
                                              void* buffer) {
   free(buffer);
 }
@@ -1709,9 +1706,9 @@
       length, data, tpeer,
       // Finalizer does nothing - in case of failure to serialize,
       // [data] remains wrapped in sender's [TransferableTypedData].
-      [](void* data, Dart_WeakPersistentHandle handle, void* peer) {},
+      [](void* data, void* peer) {},
       // This is invoked on successful serialization of the message
-      [](void* data, Dart_WeakPersistentHandle handle, void* peer) {
+      [](void* data, void* peer) {
         TransferableTypedDataPeer* tpeer =
             reinterpret_cast<TransferableTypedDataPeer*>(peer);
         tpeer->handle()->EnsureFreedExternal(IsolateGroup::Current());
diff --git a/runtime/vm/regexp_test.cc b/runtime/vm/regexp_test.cc
index 01eca0e..7afcd5f 100644
--- a/runtime/vm/regexp_test.cc
+++ b/runtime/vm/regexp_test.cc
@@ -64,9 +64,7 @@
   EXPECT_EQ(3, smi_2.Value());
 }
 
-static void NoopFinalizer(void* isolate_callback_data,
-                          Dart_WeakPersistentHandle handle,
-                          void* peer) {}
+static void NoopFinalizer(void* isolate_callback_data, void* peer) {}
 
 ISOLATE_UNIT_TEST_CASE(RegExp_ExternalOneByteString) {
   uint8_t chars[] = {'a', 'b', 'c', 'b', 'a'};
diff --git a/runtime/vm/resolver.cc b/runtime/vm/resolver.cc
index 341e4fb..a361c5a5 100644
--- a/runtime/vm/resolver.cc
+++ b/runtime/vm/resolver.cc
@@ -57,6 +57,8 @@
 
   const bool is_dyn_call = demangled.raw() != function_name.raw();
 
+  Thread* thread = Thread::Current();
+  bool need_to_create_method_extractor = false;
   while (!cls.IsNull()) {
     if (is_dyn_call) {
       // Try to find a dyn:* forwarder & return it.
@@ -67,7 +69,11 @@
     }
     if (!function.IsNull()) return function.raw();
 
-    function = lookup(cls, demangled);
+    ASSERT(cls.is_finalized());
+    {
+      SafepointReadRwLocker ml(thread, thread->isolate_group()->program_lock());
+      function = lookup(cls, demangled);
+    }
 #if !defined(DART_PRECOMPILED_RUNTIME)
     // In JIT we might need to lazily create a dyn:* forwarder.
     if (is_dyn_call && !function.IsNull()) {
@@ -79,15 +85,12 @@
 
     // Getter invocation might actually be a method extraction.
     if (is_getter) {
+      SafepointReadRwLocker ml(thread, thread->isolate_group()->program_lock());
       function = lookup(cls, demangled_getter_name);
       if (!function.IsNull()) {
         if (allow_add && FLAG_lazy_dispatchers) {
-          // We were looking for the getter but found a method with the same
-          // name. Create a method extractor and return it.
-          // The extractor does not exist yet, so using GetMethodExtractor is
-          // not necessary here.
-          function = function.CreateMethodExtractor(demangled);
-          return function.raw();
+          need_to_create_method_extractor = true;
+          break;
         } else {
           return Function::null();
         }
@@ -95,6 +98,13 @@
     }
     cls = cls.SuperClass();
   }
+  if (need_to_create_method_extractor) {
+    // We were looking for the getter but found a method with the same
+    // name. Create a method extractor and return it.
+    // Use GetMethodExtractor instead of CreateMethodExtractor to ensure
+    // nobody created method extractor since we last checked under ReadRwLocker.
+    function = function.GetMethodExtractor(demangled);
+  }
   return function.raw();
 }
 
@@ -136,7 +146,7 @@
     bool allow_add) {
   return ResolveDynamicForReceiverClassWithCustomLookup(
       receiver_class, function_name, args_desc, allow_add,
-      std::mem_fn(&Class::LookupDynamicFunction));
+      std::mem_fn(&Class::LookupDynamicFunctionUnsafe));
 }
 
 FunctionPtr Resolver::ResolveDynamicForReceiverClassAllowPrivate(
@@ -149,13 +159,31 @@
       std::mem_fn(&Class::LookupDynamicFunctionAllowPrivate));
 }
 
+FunctionPtr Resolver::ResolveFunction(Zone* zone,
+                                      const Class& receiver_class,
+                                      const String& function_name) {
+  return ResolveDynamicAnyArgsWithCustomLookup(
+      zone, receiver_class, function_name, /*allow_add=*/false,
+      std::mem_fn(static_cast<FunctionPtr (Class::*)(const String&) const>(
+          &Class::LookupFunctionReadLocked)));
+}
+
+FunctionPtr Resolver::ResolveDynamicFunction(Zone* zone,
+                                             const Class& receiver_class,
+                                             const String& function_name) {
+  return ResolveDynamicAnyArgsWithCustomLookup(
+      zone, receiver_class, function_name, /*allow_add=*/false,
+      std::mem_fn(static_cast<FunctionPtr (Class::*)(const String&) const>(
+          &Class::LookupDynamicFunctionUnsafe)));
+}
+
 FunctionPtr Resolver::ResolveDynamicAnyArgs(Zone* zone,
                                             const Class& receiver_class,
                                             const String& function_name,
                                             bool allow_add) {
   return ResolveDynamicAnyArgsWithCustomLookup(
       zone, receiver_class, function_name, allow_add,
-      std::mem_fn(&Class::LookupDynamicFunctionAllowPrivate));
+      std::mem_fn(&Class::LookupDynamicFunctionUnsafe));
 }
 
 FunctionPtr Resolver::ResolveDynamicAnyArgsAllowPrivate(
diff --git a/runtime/vm/resolver.h b/runtime/vm/resolver.h
index e440c24..b478615 100644
--- a/runtime/vm/resolver.h
+++ b/runtime/vm/resolver.h
@@ -50,6 +50,17 @@
       const String& function_name,
       bool allow_add);
 
+  // Resolve instance function [function_name] with any args, it doesn't
+  // allow adding methods during resolution: [allow_add] is [false].
+  static FunctionPtr ResolveDynamicFunction(Zone* zone,
+                                            const Class& receiver_class,
+                                            const String& function_name);
+  // Resolve static or instance function [function_name] with any args, it
+  // doesn't allow adding methods during resolution: [allow_add] is [false].
+  static FunctionPtr ResolveFunction(Zone* zone,
+                                     const Class& receiver_class,
+                                     const String& function_name);
+
   // Resolve specified dart static function. If library.IsNull, use
   // either application library or core library if no application library
   // exists. Passing negative num_arguments means that the function
diff --git a/runtime/vm/reusable_handles.h b/runtime/vm/reusable_handles.h
index 2c06da9..7c452bc 100644
--- a/runtime/vm/reusable_handles.h
+++ b/runtime/vm/reusable_handles.h
@@ -86,8 +86,6 @@
   ReusableClassHandleScope reused_class_handle(thread);
 #define REUSABLE_CODE_HANDLESCOPE(thread)                                      \
   ReusableCodeHandleScope reused_code_handle(thread);
-#define REUSABLE_BYTECODE_HANDLESCOPE(thread)                                  \
-  ReusableBytecodeHandleScope reused_bytecode_handle(thread);
 #define REUSABLE_ERROR_HANDLESCOPE(thread)                                     \
   ReusableErrorHandleScope reused_error_handle(thread);
 #define REUSABLE_EXCEPTION_HANDLERS_HANDLESCOPE(thread)                        \
diff --git a/runtime/vm/runtime_entry.cc b/runtime/vm/runtime_entry.cc
index 685c039..0b4ceb7 100644
--- a/runtime/vm/runtime_entry.cc
+++ b/runtime/vm/runtime_entry.cc
@@ -17,7 +17,6 @@
 #include "vm/flags.h"
 #include "vm/heap/verifier.h"
 #include "vm/instructions.h"
-#include "vm/interpreter.h"
 #include "vm/kernel_isolate.h"
 #include "vm/message.h"
 #include "vm/message_handler.h"
@@ -61,7 +60,6 @@
             false,
             "Trace deoptimization verbose");
 
-DECLARE_FLAG(bool, enable_interpreter);
 DECLARE_FLAG(int, max_deoptimization_counter_threshold);
 DECLARE_FLAG(bool, trace_compiler);
 DECLARE_FLAG(bool, trace_optimizing_compiler);
@@ -109,27 +107,6 @@
 }
 #endif
 
-// Add function to a class and that class to the class dictionary so that
-// frame walking can be used.
-const Function& RegisterFakeFunction(const char* name, const Code& code) {
-  Thread* thread = Thread::Current();
-  const String& class_name = String::Handle(Symbols::New(thread, "ownerClass"));
-  const Script& script = Script::Handle();
-  const Library& lib = Library::Handle(Library::CoreLibrary());
-  const Class& owner_class = Class::Handle(
-      Class::New(lib, class_name, script, TokenPosition::kNoSource));
-  const String& function_name = String::ZoneHandle(Symbols::New(thread, name));
-  const Function& function = Function::ZoneHandle(Function::New(
-      function_name, FunctionLayout::kRegularFunction, true, false, false,
-      false, false, owner_class, TokenPosition::kMinSource));
-  const Array& functions = Array::Handle(Array::New(1));
-  functions.SetAt(0, function);
-  owner_class.SetFunctions(functions);
-  lib.AddClass(owner_class);
-  function.AttachCode(code);
-  return function;
-}
-
 DEFINE_RUNTIME_ENTRY(RangeError, 2) {
   const Instance& length = Instance::CheckedHandle(zone, arguments.ArgAt(0));
   const Instance& index = Instance::CheckedHandle(zone, arguments.ArgAt(1));
@@ -200,7 +177,6 @@
                              StackFrameIterator::kNoCrossThreadIteration);
   const StackFrame* caller_frame = iterator.NextFrame();
   ASSERT(caller_frame->IsDartFrame());
-  ASSERT(!caller_frame->is_interpreted());
   const Code& code = Code::Handle(zone, caller_frame->LookupDartCode());
   const uword pc_offset = caller_frame->pc() - code.PayloadStart();
 
@@ -501,6 +477,10 @@
   ASSERT(!subtype.IsNull() && !subtype.IsTypeRef());
   ASSERT(!supertype.IsNull() && !supertype.IsTypeRef());
 
+  // Now that AssertSubtype may be checking types only available at runtime,
+  // we can't guarantee the supertype isn't the top type.
+  if (supertype.IsTopTypeForSubtyping()) return;
+
   // The supertype or subtype may not be instantiated.
   if (AbstractType::InstantiateAndTestSubtype(
           &subtype, &supertype, instantiator_type_args, function_type_args)) {
@@ -513,13 +493,6 @@
   UNREACHABLE();
 }
 
-// Allocate a new SubtypeTestCache for use in interpreted implicit setters.
-// Return value: newly allocated SubtypeTestCache.
-DEFINE_RUNTIME_ENTRY(AllocateSubtypeTestCache, 0) {
-  ASSERT(FLAG_enable_interpreter);
-  arguments.SetReturn(SubtypeTestCache::Handle(zone, SubtypeTestCache::New()));
-}
-
 // Allocate a new context large enough to hold the given number of variables.
 // Arg0: number of variables.
 // Return value: newly allocated context.
@@ -547,76 +520,6 @@
   arguments.SetReturn(cloned_ctx);
 }
 
-// Invoke field getter before dispatch.
-// Arg0: instance.
-// Arg1: field name (may be demangled during call).
-// Return value: field value.
-DEFINE_RUNTIME_ENTRY(GetFieldForDispatch, 2) {
-  ASSERT(FLAG_enable_interpreter);
-  const Instance& receiver = Instance::CheckedHandle(zone, arguments.ArgAt(0));
-  String& name = String::CheckedHandle(zone, arguments.ArgAt(1));
-  const Class& receiver_class = Class::Handle(zone, receiver.clazz());
-  if (Function::IsDynamicInvocationForwarderName(name)) {
-    name = Function::DemangleDynamicInvocationForwarderName(name);
-    arguments.SetArgAt(1, name);  // Reflect change in arguments.
-  }
-  const String& getter_name = String::Handle(zone, Field::GetterName(name));
-  const int kTypeArgsLen = 0;
-  const int kNumArguments = 1;
-  ArgumentsDescriptor args_desc(Array::Handle(
-      zone, ArgumentsDescriptor::NewBoxed(kTypeArgsLen, kNumArguments)));
-  const Function& getter =
-      Function::Handle(zone, Resolver::ResolveDynamicForReceiverClass(
-                                 receiver_class, getter_name, args_desc));
-  ASSERT(!getter.IsNull());  // An InvokeFieldDispatcher function was created.
-  const Array& args = Array::Handle(zone, Array::New(kNumArguments));
-  args.SetAt(0, receiver);
-  const Object& result =
-      Object::Handle(zone, DartEntry::InvokeFunction(getter, args));
-  ThrowIfError(result);
-  arguments.SetReturn(result);
-}
-
-// Check that arguments are valid for the given closure.
-// Arg0: function
-// Arg1: arguments descriptor
-// Return value: whether the arguments are valid
-DEFINE_RUNTIME_ENTRY(ClosureArgumentsValid, 2) {
-  ASSERT(FLAG_enable_interpreter);
-  const auto& closure = Closure::CheckedHandle(zone, arguments.ArgAt(0));
-  const auto& descriptor = Array::CheckedHandle(zone, arguments.ArgAt(1));
-
-  const auto& function = Function::Handle(zone, closure.function());
-  const ArgumentsDescriptor args_desc(descriptor);
-  if (!function.AreValidArguments(args_desc, nullptr)) {
-    arguments.SetReturn(Bool::False());
-  } else if (!closure.IsGeneric(thread) && args_desc.TypeArgsLen() > 0) {
-    // The arguments may be valid for the closure function itself, but if the
-    // closure has delayed type arguments, no type arguments should be provided.
-    arguments.SetReturn(Bool::False());
-  } else {
-    arguments.SetReturn(Bool::True());
-  }
-}
-
-// Resolve 'call' function of receiver.
-// Arg0: receiver (not a closure).
-// Arg1: arguments descriptor
-// Return value: 'call' function'.
-DEFINE_RUNTIME_ENTRY(ResolveCallFunction, 2) {
-  ASSERT(FLAG_enable_interpreter);
-  const Instance& receiver = Instance::CheckedHandle(zone, arguments.ArgAt(0));
-  const Array& descriptor = Array::CheckedHandle(zone, arguments.ArgAt(1));
-  ArgumentsDescriptor args_desc(descriptor);
-  ASSERT(!receiver.IsClosure());  // Interpreter tests for closure.
-  Class& cls = Class::Handle(zone, receiver.clazz());
-  Function& call_function = Function::Handle(
-      zone,
-      Resolver::ResolveDynamicForReceiverClass(cls, Symbols::Call(), args_desc,
-                                               /*allow_add=*/false));
-  arguments.SetReturn(call_function);
-}
-
 // Helper routine for tracing a type check.
 static void PrintTypeCheck(const char* message,
                            const Instance& instance,
@@ -905,7 +808,6 @@
       DartFrameIterator iterator(thread,
                                  StackFrameIterator::kNoCrossThreadIteration);
       StackFrame* caller_frame = iterator.NextFrame();
-      ASSERT(!caller_frame->is_interpreted());
       const Code& caller_code =
           Code::Handle(zone, caller_frame->LookupDartCode());
       const ObjectPool& pool =
@@ -988,7 +890,6 @@
       DartFrameIterator iterator(thread,
                                  StackFrameIterator::kNoCrossThreadIteration);
       StackFrame* caller_frame = iterator.NextFrame();
-      ASSERT(!caller_frame->is_interpreted());
       const Code& caller_code =
           Code::Handle(zone, caller_frame->LookupDartCode());
       const ObjectPool& pool =
@@ -1076,7 +977,6 @@
                              StackFrameIterator::kNoCrossThreadIteration);
   StackFrame* caller_frame = iterator.NextFrame();
   ASSERT(caller_frame != NULL);
-  ASSERT(!caller_frame->is_interpreted());
   const Code& caller_code = Code::Handle(zone, caller_frame->LookupDartCode());
   ASSERT(!caller_code.IsNull());
   ASSERT(caller_code.is_optimized());
@@ -1117,9 +1017,7 @@
   StackFrame* caller_frame = iterator.NextFrame();
   ASSERT(caller_frame != NULL);
   Code& orig_stub = Code::Handle(zone);
-  if (!caller_frame->is_interpreted()) {
-    orig_stub = isolate->debugger()->GetPatchedStubAddress(caller_frame->pc());
-  }
+  orig_stub = isolate->debugger()->GetPatchedStubAddress(caller_frame->pc());
   const Error& error =
       Error::Handle(zone, isolate->debugger()->PauseBreakpoint());
   ThrowIfError(error);
@@ -1234,7 +1132,6 @@
   ASSERT(caller_frame->IsDartFrame());
 
   // Monomorphic/megamorphic calls are only for unoptimized code.
-  if (caller_frame->is_interpreted()) return;
   Zone* zone = thread->zone();
   const Code& caller_code = Code::Handle(zone, caller_frame->LookupDartCode());
   if (caller_code.is_optimized()) return;
@@ -1266,12 +1163,6 @@
       return;
     }
 
-    // Avoid forcing foreground compilation if target function is still
-    // interpreted.
-    if (FLAG_enable_interpreter && !target_function.HasCode()) {
-      return;
-    }
-
     const Array& data = Array::Handle(zone, ic_data.entries());
     const Code& target = Code::Handle(zone, target_function.EnsureHasCode());
     CodePatcher::PatchInstanceCallAt(caller_frame->pc(), caller_code, data,
@@ -1776,10 +1667,10 @@
                            const String& name,
                            const Array& descriptor) {
   ASSERT(name.IsSymbol());
-
-  ArgumentsDescriptor args_desc(descriptor);
   Function& target_function = Function::Handle(zone);
+
   if (receiver_class.EnsureIsFinalized(thread) == Error::null()) {
+    ArgumentsDescriptor args_desc(descriptor);
     target_function = Resolver::ResolveDynamicForReceiverClass(receiver_class,
                                                                name, args_desc);
   }
@@ -2185,41 +2076,6 @@
       /*use_force_growth=*/true);
 }
 
-// Handles interpreted interface call cache miss.
-//   Arg0: receiver
-//   Arg1: target name
-//   Arg2: arguments descriptor
-//   Returns: target function (can only be null if !FLAG_lazy_dispatchers)
-// Modifies the instance call table in current interpreter.
-DEFINE_RUNTIME_ENTRY(InterpretedInstanceCallMissHandler, 3) {
-#if defined(DART_PRECOMPILED_RUNTIME)
-  UNREACHABLE();
-#else
-  ASSERT(FLAG_enable_interpreter);
-  const Instance& receiver = Instance::CheckedHandle(zone, arguments.ArgAt(0));
-  const String& target_name = String::CheckedHandle(zone, arguments.ArgAt(1));
-  const Array& arg_desc = Array::CheckedHandle(zone, arguments.ArgAt(2));
-
-  ArgumentsDescriptor arguments_descriptor(arg_desc);
-  const Class& receiver_class = Class::Handle(zone, receiver.clazz());
-  Function& target_function = Function::Handle(zone);
-  if (receiver_class.EnsureIsFinalized(thread) == Error::null()) {
-    target_function =
-        Resolver::ResolveDynamic(receiver, target_name, arguments_descriptor);
-  }
-
-  // TODO(regis): In order to substitute 'simple_instance_of_function', the 2nd
-  // arg to the call, the type, is needed.
-
-  if (target_function.IsNull()) {
-    target_function =
-        InlineCacheMissHelper(receiver_class, arg_desc, target_name);
-  }
-  ASSERT(!target_function.IsNull() || !FLAG_lazy_dispatchers);
-  arguments.SetReturn(target_function);
-#endif
-}
-
 // Used to find the correct receiver and function to invoke or to fall back to
 // invoking noSuchMethod when lazy dispatchers are disabled. Returns the
 // result of the invocation or an Error.
@@ -2258,7 +2114,7 @@
       // need to try to find a dyn:get:foo first (see assertion below)
       if (function.IsNull()) {
         if (cls.EnsureIsFinalized(thread) == Error::null()) {
-          function = cls.LookupDynamicFunction(function_name);
+          function = Resolver::ResolveDynamicFunction(zone, cls, function_name);
         }
       }
       if (!function.IsNull()) {
@@ -2285,24 +2141,8 @@
       // Special case: closures are implemented with a call getter instead of a
       // call method and with lazy dispatchers the field-invocation-dispatcher
       // would perform the closure call.
-      auto& result = Object::Handle(
-          zone,
-          DartEntry::ResolveCallable(orig_arguments, orig_arguments_desc));
-      if (result.IsError()) {
-        return result.raw();
-      }
-      function ^= result.raw();
-      if (is_dynamic_call && !function.IsNull() &&
-          !function.CanReceiveDynamicInvocation()) {
-        ArgumentsDescriptor args_desc(orig_arguments_desc);
-        result = function.DoArgumentTypesMatch(orig_arguments, args_desc);
-        if (result.IsError()) {
-          return result.raw();
-        }
-      }
-      result = DartEntry::InvokeCallable(function, orig_arguments,
-                                         orig_arguments_desc);
-      return result.raw();
+      return DartEntry::InvokeClosure(thread, orig_arguments,
+                                      orig_arguments_desc);
     }
 
     // Dynamic call sites have to use the dynamic getter as well (if it was
@@ -2318,14 +2158,15 @@
       // If there is a function with the target name but mismatched arguments
       // we need to call `receiver.noSuchMethod()`.
       if (cls.EnsureIsFinalized(thread) == Error::null()) {
-        function = cls.LookupDynamicFunction(target_name);
+        function = Resolver::ResolveDynamicFunction(zone, cls, target_name);
       }
       if (!function.IsNull()) {
         ASSERT(!function.AreValidArguments(args_desc, NULL));
         break;  // mismatch, invoke noSuchMethod
       }
       if (is_dynamic_call) {
-        function = cls.LookupDynamicFunction(demangled_target_name);
+        function =
+            Resolver::ResolveDynamicFunction(zone, cls, demangled_target_name);
         if (!function.IsNull()) {
           ASSERT(!function.AreValidArguments(args_desc, NULL));
           break;  // mismatch, invoke noSuchMethod
@@ -2334,10 +2175,10 @@
 
       // If there is a getter we need to call-through-getter.
       if (is_dynamic_call) {
-        function = cls.LookupDynamicFunction(dyn_getter_name);
+        function = Resolver::ResolveDynamicFunction(zone, cls, dyn_getter_name);
       }
       if (function.IsNull()) {
-        function = cls.LookupDynamicFunction(getter_name);
+        function = Resolver::ResolveDynamicFunction(zone, cls, getter_name);
       }
       if (!function.IsNull()) {
         const Array& getter_arguments = Array::Handle(Array::New(1));
@@ -2350,31 +2191,17 @@
         ASSERT(getter_result.IsNull() || getter_result.IsInstance());
 
         orig_arguments.SetAt(args_desc.FirstArgIndex(), getter_result);
-        auto& result = Object::Handle(
-            zone,
-            DartEntry::ResolveCallable(orig_arguments, orig_arguments_desc));
-        if (result.IsError()) {
-          return result.raw();
-        }
-        function ^= result.raw();
-        if (is_dynamic_call && !function.IsNull() &&
-            !function.CanReceiveDynamicInvocation()) {
-          result = function.DoArgumentTypesMatch(orig_arguments, args_desc);
-          if (result.IsError()) {
-            return result.raw();
-          }
-        }
-        result = DartEntry::InvokeCallable(function, orig_arguments,
-                                           orig_arguments_desc);
-        return result.raw();
+        return DartEntry::InvokeClosure(thread, orig_arguments,
+                                        orig_arguments_desc);
       }
       cls = cls.SuperClass();
     }
   }
 
   const Object& result = Object::Handle(
-      zone, DartEntry::InvokeNoSuchMethod(receiver, demangled_target_name,
-                                          orig_arguments, orig_arguments_desc));
+      zone,
+      DartEntry::InvokeNoSuchMethod(thread, receiver, demangled_target_name,
+                                    orig_arguments, orig_arguments_desc));
   return result.raw();
 }
 
@@ -2430,42 +2257,12 @@
   }
 
   const Object& result = Object::Handle(
-      zone, DartEntry::InvokeNoSuchMethod(receiver, orig_function_name,
+      zone, DartEntry::InvokeNoSuchMethod(thread, receiver, orig_function_name,
                                           orig_arguments, orig_arguments_desc));
   ThrowIfError(result);
   arguments.SetReturn(result);
 }
 
-// Invoke appropriate noSuchMethod function (or in the case of no lazy
-// dispatchers, walk the receiver to find the correct method to call).
-// Arg0: receiver
-// Arg1: function name.
-// Arg2: arguments descriptor array.
-// Arg3: arguments array.
-DEFINE_RUNTIME_ENTRY(InvokeNoSuchMethod, 4) {
-  ASSERT(FLAG_enable_interpreter);
-  const Instance& receiver = Instance::CheckedHandle(zone, arguments.ArgAt(0));
-  const String& original_function_name =
-      String::CheckedHandle(zone, arguments.ArgAt(1));
-  const Array& orig_arguments_desc =
-      Array::CheckedHandle(zone, arguments.ArgAt(2));
-  const Array& orig_arguments = Array::CheckedHandle(zone, arguments.ArgAt(3));
-
-  auto& result = Object::Handle(zone);
-  if (!FLAG_lazy_dispatchers) {
-    // Failing to find the method could be due to the lack of lazy invoke field
-    // dispatchers, so attempt a deeper search before calling noSuchMethod.
-    result = InvokeCallThroughGetterOrNoSuchMethod(
-        thread, zone, receiver, original_function_name, orig_arguments,
-        orig_arguments_desc);
-  } else {
-    result = DartEntry::InvokeNoSuchMethod(receiver, original_function_name,
-                                           orig_arguments, orig_arguments_desc);
-  }
-  ThrowIfError(result);
-  arguments.SetReturn(result);
-}
-
 #if !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
 // The following code is used to stress test
 //  - deoptimization
@@ -2514,13 +2311,9 @@
     ASSERT(frame != nullptr);
     Code& code = Code::Handle();
     Function& function = Function::Handle();
-    if (frame->is_interpreted()) {
-      function = frame->LookupDartFunction();
-    } else {
-      code = frame->LookupDartCode();
-      ASSERT(!code.IsNull());
-      function = code.function();
-    }
+    code = frame->LookupDartCode();
+    ASSERT(!code.IsNull());
+    function = code.function();
     ASSERT(!function.IsNull());
     const char* function_name = nullptr;
     if ((FLAG_deoptimize_filter != nullptr) ||
@@ -2564,7 +2357,8 @@
           Library::Handle(isolate->object_store()->_internal_library());
       const Class& cls = Class::Handle(
           lib.LookupClass(String::Handle(String::New("VMLibraryHooks"))));
-      const Function& func = Function::Handle(cls.LookupFunction(
+      const Function& func = Function::Handle(Resolver::ResolveFunction(
+          thread->zone(), cls,
           String::Handle(String::New("get:platformScript"))));
       Object& result = Object::Handle(
           DartEntry::InvokeFunction(func, Object::empty_array()));
@@ -2601,13 +2395,9 @@
       int num_vars = 0;
       // Variable locations and number are unknown when precompiling.
 #if !defined(DART_PRECOMPILED_RUNTIME)
-      // NumLocalVariables() can call EnsureHasUnoptimizedCode() for
-      // non-interpreted functions.
       if (!frame->function().ForceOptimize()) {
-        if (!frame->IsInterpreted()) {
-          // Ensure that we have unoptimized code.
-          frame->function().EnsureHasCompiledUnoptimizedCode();
-        }
+        // Ensure that we have unoptimized code.
+        frame->function().EnsureHasCompiledUnoptimizedCode();
         num_vars = frame->NumLocalVariables();
       }
 #endif
@@ -2696,8 +2486,7 @@
 DEFINE_RUNTIME_ENTRY(StackOverflow, 0) {
 #if defined(USING_SIMULATOR)
   uword stack_pos = Simulator::Current()->get_sp();
-  // If simulator was never called (for example, in pure
-  // interpreted mode) it may return 0 as a value of SPREG.
+  // If simulator was never called it may return 0 as a value of SPREG.
   if (stack_pos == 0) {
     // Use any reasonable value which would not be treated
     // as stack overflow.
@@ -2711,36 +2500,15 @@
   // persist.
   uword stack_overflow_flags = thread->GetAndClearStackOverflowFlags();
 
-  bool interpreter_stack_overflow = false;
-#if !defined(DART_PRECOMPILED_RUNTIME)
-  if (FLAG_enable_interpreter) {
-    // Do not allocate an interpreter, if none is allocated yet.
-    Interpreter* interpreter = thread->interpreter();
-    if (interpreter != NULL) {
-      interpreter_stack_overflow =
-          interpreter->get_sp() >= interpreter->overflow_stack_limit();
-    }
-  }
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-
   // If an interrupt happens at the same time as a stack overflow, we
   // process the stack overflow now and leave the interrupt for next
   // time.
-  if (interpreter_stack_overflow || !thread->os_thread()->HasStackHeadroom() ||
+  if (!thread->os_thread()->HasStackHeadroom() ||
       IsCalleeFrameOf(thread->saved_stack_limit(), stack_pos)) {
     if (FLAG_verbose_stack_overflow) {
-      OS::PrintErr("Stack overflow in %s\n",
-                   interpreter_stack_overflow ? "interpreter" : "native code");
+      OS::PrintErr("Stack overflow\n");
       OS::PrintErr("  Native SP = %" Px ", stack limit = %" Px "\n", stack_pos,
                    thread->saved_stack_limit());
-#if !defined(DART_PRECOMPILED_RUNTIME)
-      if (thread->interpreter() != nullptr) {
-        OS::PrintErr("  Interpreter SP = %" Px ", stack limit = %" Px "\n",
-                     thread->interpreter()->get_sp(),
-                     thread->interpreter()->overflow_stack_limit());
-      }
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-
       OS::PrintErr("Call stack:\n");
       OS::PrintErr("size | frame\n");
       StackFrameIterator frames(ValidationPolicy::kDontValidateFrames, thread,
@@ -2748,14 +2516,9 @@
       uword fp = stack_pos;
       StackFrame* frame = frames.NextFrame();
       while (frame != NULL) {
-        if (frame->is_interpreted() == interpreter_stack_overflow) {
-          uword delta = interpreter_stack_overflow ? (fp - frame->fp())
-                                                   : (frame->fp() - fp);
-          fp = frame->fp();
-          OS::PrintErr("%4" Pd " %s\n", delta, frame->ToCString());
-        } else {
-          OS::PrintErr("     %s\n", frame->ToCString());
-        }
+        uword delta = (frame->fp() - fp);
+        fp = frame->fp();
+        OS::PrintErr("%4" Pd " %s\n", delta, frame->ToCString());
         frame = frames.NextFrame();
       }
     }
@@ -2800,46 +2563,6 @@
       ic_data.NumberOfChecks(), function.ToFullyQualifiedCString());
 }
 
-// This is called from interpreter when function usage counter reached
-// compilation threshold and function needs to be compiled.
-DEFINE_RUNTIME_ENTRY(CompileInterpretedFunction, 1) {
-#if !defined(DART_PRECOMPILED_RUNTIME)
-  const Function& function = Function::CheckedHandle(zone, arguments.ArgAt(0));
-  ASSERT(!function.IsNull());
-  ASSERT(FLAG_enable_interpreter);
-
-#if !defined(PRODUCT)
-  if (Debugger::IsDebugging(thread, function)) {
-    return;
-  }
-#endif  // !defined(PRODUCT)
-
-  if (FLAG_background_compilation) {
-    if (!BackgroundCompiler::IsDisabled(isolate,
-                                        /* optimizing_compilation = */ false) &&
-        function.is_background_optimizable()) {
-      // Ensure background compiler is running, if not start it.
-      BackgroundCompiler::Start(isolate);
-      // Reduce the chance of triggering a compilation while the function is
-      // being compiled in the background. INT32_MIN should ensure that it
-      // takes long time to trigger a compilation.
-      // Note that the background compilation queue rejects duplicate entries.
-      function.SetUsageCounter(INT32_MIN);
-      isolate->background_compiler()->Compile(function);
-      return;
-    }
-  }
-
-  // Reset usage counter for future optimization.
-  function.SetUsageCounter(0);
-  Object& result =
-      Object::Handle(zone, Compiler::CompileFunction(thread, function));
-  ThrowIfError(result);
-#else
-  UNREACHABLE();
-#endif  // !DART_PRECOMPILED_RUNTIME
-}
-
 // This is called from function that needs to be optimized.
 // The requesting function can be already optimized (reoptimization).
 // Returns the Code object where to continue execution.
@@ -3079,7 +2802,6 @@
 
     // N.B.: Update the pending deopt table before updating the frame. The
     // profiler may attempt a stack walk in between.
-    ASSERT(!frame->is_interpreted());
     thread->isolate()->AddPendingDeopt(frame->fp(), deopt_pc);
     frame->MarkForLazyDeopt();
 
@@ -3101,12 +2823,9 @@
   StackFrame* frame = iterator.NextFrame();
   Code& optimized_code = Code::Handle();
   while (frame != NULL) {
-    if (!frame->is_interpreted()) {
-      optimized_code = frame->LookupDartCode();
-      if (optimized_code.is_optimized() &&
-          !optimized_code.is_force_optimized()) {
-        DeoptimizeAt(optimized_code, frame);
-      }
+    optimized_code = frame->LookupDartCode();
+    if (optimized_code.is_optimized() && !optimized_code.is_force_optimized()) {
+      DeoptimizeAt(optimized_code, frame);
     }
     frame = iterator.NextFrame();
   }
@@ -3454,65 +3173,6 @@
     true /* is_float */,
     reinterpret_cast<RuntimeFunction>(static_cast<UnaryMathCFunction>(&atan)));
 
-// Interpret a function call. Should be called only for non-jitted functions.
-// argc indicates the number of arguments, including the type arguments.
-// argv points to the first argument.
-// If argc < 0, arguments are passed at decreasing memory addresses from argv.
-extern "C" uword /*ObjectPtr*/ InterpretCall(uword /*FunctionPtr*/ function_in,
-                                             uword /*ArrayPtr*/ argdesc_in,
-                                             intptr_t argc,
-                                             ObjectPtr* argv,
-                                             Thread* thread) {
-#if defined(DART_PRECOMPILED_RUNTIME)
-  UNREACHABLE();
-#else
-  FunctionPtr function = static_cast<FunctionPtr>(function_in);
-  ArrayPtr argdesc = static_cast<ArrayPtr>(argdesc_in);
-  ASSERT(FLAG_enable_interpreter);
-  Interpreter* interpreter = Interpreter::Current();
-#if defined(DEBUG)
-  uword exit_fp = thread->top_exit_frame_info();
-  ASSERT(exit_fp != 0);
-  ASSERT(thread == Thread::Current());
-  // Caller is InterpretCall stub called from generated code.
-  // We stay in "in generated code" execution state when interpreting code.
-  ASSERT(thread->execution_state() == Thread::kThreadInGenerated);
-  ASSERT(!Function::HasCode(function));
-  ASSERT(Function::HasBytecode(function));
-  ASSERT(interpreter != NULL);
-#endif
-  // Tell MemorySanitizer 'argv' is initialized by generated code.
-  if (argc < 0) {
-    MSAN_UNPOISON(argv - argc, -argc * sizeof(ObjectPtr));
-  } else {
-    MSAN_UNPOISON(argv, argc * sizeof(ObjectPtr));
-  }
-  ObjectPtr result = interpreter->Call(function, argdesc, argc, argv, thread);
-  DEBUG_ASSERT(thread->top_exit_frame_info() == exit_fp);
-  if (IsErrorClassId(result->GetClassIdMayBeSmi())) {
-    // Must not leak handles in the caller's zone.
-    HANDLESCOPE(thread);
-    // Protect the result in a handle before transitioning, which may trigger
-    // GC.
-    const Error& error = Error::Handle(Error::RawCast(result));
-    // Propagating an error may cause allocation. Check if we need to block for
-    // a safepoint by switching to "in VM" execution state.
-    TransitionGeneratedToVM transition(thread);
-    Exceptions::PropagateError(error);
-  }
-  return static_cast<uword>(result);
-#endif  // defined(DART_PRECOMPILED_RUNTIME)
-}
-
-uword RuntimeEntry::InterpretCallEntry() {
-  uword entry = reinterpret_cast<uword>(InterpretCall);
-#if defined(USING_SIMULATOR)
-  entry = Simulator::RedirectExternalReference(entry,
-                                               Simulator::kLeafRuntimeCall, 5);
-#endif
-  return entry;
-}
-
 extern "C" void DFLRT_EnterSafepoint(NativeArguments __unusable_) {
   CHECK_STACK_ALIGNMENT;
   TRACE_RUNTIME_CALL("%s", "EnterSafepoint");
diff --git a/runtime/vm/runtime_entry.h b/runtime/vm/runtime_entry.h
index bede33e..d4ce293 100644
--- a/runtime/vm/runtime_entry.h
+++ b/runtime/vm/runtime_entry.h
@@ -57,8 +57,6 @@
   NOT_IN_PRECOMPILED(void Call(compiler::Assembler* assembler,
                                intptr_t argument_count) const);
 
-  static uword InterpretCallEntry();
-
  protected:
   NOT_IN_PRECOMPILED(static void CallInternal(const RuntimeEntry* runtime_entry,
                                               compiler::Assembler* assembler,
diff --git a/runtime/vm/runtime_entry_arm.cc b/runtime/vm/runtime_entry_arm.cc
index 9502b49..752ca63 100644
--- a/runtime/vm/runtime_entry_arm.cc
+++ b/runtime/vm/runtime_entry_arm.cc
@@ -56,7 +56,7 @@
     __ str(TMP,
            compiler::Address(THR, compiler::target::Thread::vm_tag_offset()));
     __ blx(TMP);
-    __ LoadImmediate(TMP, VMTag::kDartCompiledTagId);
+    __ LoadImmediate(TMP, VMTag::kDartTagId);
     __ str(TMP,
            compiler::Address(THR, compiler::target::Thread::vm_tag_offset()));
     ASSERT((kAbiPreservedCpuRegs & (1 << THR)) != 0);
diff --git a/runtime/vm/runtime_entry_arm64.cc b/runtime/vm/runtime_entry_arm64.cc
index 5fd14b5..1580e1a 100644
--- a/runtime/vm/runtime_entry_arm64.cc
+++ b/runtime/vm/runtime_entry_arm64.cc
@@ -69,7 +69,7 @@
            compiler::Address(THR, Thread::OffsetFromThread(runtime_entry)));
     __ str(TMP, compiler::Address(THR, Thread::vm_tag_offset()));
     __ blr(TMP);
-    __ LoadImmediate(TMP, VMTag::kDartCompiledTagId);
+    __ LoadImmediate(TMP, VMTag::kDartTagId);
     __ str(TMP, compiler::Address(THR, Thread::vm_tag_offset()));
     __ mov(SP, kCallLeafRuntimeCalleeSaveScratch2);
     __ mov(CSP, kCallLeafRuntimeCalleeSaveScratch1);
diff --git a/runtime/vm/runtime_entry_ia32.cc b/runtime/vm/runtime_entry_ia32.cc
index 22f67d7..8bba816 100644
--- a/runtime/vm/runtime_entry_ia32.cc
+++ b/runtime/vm/runtime_entry_ia32.cc
@@ -36,7 +36,7 @@
     __ movl(compiler::Assembler::VMTagAddress(), EAX);
     __ call(EAX);
     __ movl(compiler::Assembler::VMTagAddress(),
-            compiler::Immediate(VMTag::kDartCompiledTagId));
+            compiler::Immediate(VMTag::kDartTagId));
   } else {
     // Argument count is not checked here, but in the runtime entry for a more
     // informative error message.
diff --git a/runtime/vm/runtime_entry_list.h b/runtime/vm/runtime_entry_list.h
index 394c01d..40f5bd8 100644
--- a/runtime/vm/runtime_entry_list.h
+++ b/runtime/vm/runtime_entry_list.h
@@ -12,13 +12,9 @@
   V(AllocateTypedData)                                                         \
   V(AllocateContext)                                                           \
   V(AllocateObject)                                                            \
-  V(AllocateSubtypeTestCache)                                                  \
   V(BreakpointRuntimeHandler)                                                  \
   V(SingleStepHandler)                                                         \
   V(CloneContext)                                                              \
-  V(GetFieldForDispatch)                                                       \
-  V(ClosureArgumentsValid)                                                     \
-  V(ResolveCallFunction)                                                       \
   V(FixCallersTarget)                                                          \
   V(FixCallersTargetMonomorphic)                                               \
   V(FixAllocationStubTarget)                                                   \
@@ -26,7 +22,6 @@
   V(InlineCacheMissHandlerTwoArgs)                                             \
   V(StaticCallMissHandlerOneArg)                                               \
   V(StaticCallMissHandlerTwoArgs)                                              \
-  V(InterpretedInstanceCallMissHandler)                                        \
   V(Instanceof)                                                                \
   V(SubtypeCheck)                                                              \
   V(TypeCheck)                                                                 \
@@ -35,7 +30,6 @@
   V(InstantiateTypeArguments)                                                  \
   V(NoSuchMethodFromCallStub)                                                  \
   V(NoSuchMethodFromPrologue)                                                  \
-  V(InvokeNoSuchMethod)                                                        \
   V(OptimizeInvokedFunction)                                                   \
   V(TraceICCall)                                                               \
   V(PatchStaticCall)                                                           \
@@ -58,7 +52,6 @@
   V(InitStaticField)                                                           \
   V(LateInitializationError)                                                   \
   V(CompileFunction)                                                           \
-  V(CompileInterpretedFunction)                                                \
   V(SwitchableCallMiss)                                                        \
   V(NotLoaded)
 
diff --git a/runtime/vm/runtime_entry_x64.cc b/runtime/vm/runtime_entry_x64.cc
index caaa2a4..78d3ead 100644
--- a/runtime/vm/runtime_entry_x64.cc
+++ b/runtime/vm/runtime_entry_x64.cc
@@ -37,7 +37,7 @@
     __ movq(compiler::Assembler::VMTagAddress(), RAX);
     __ CallCFunction(RAX);
     __ movq(compiler::Assembler::VMTagAddress(),
-            compiler::Immediate(VMTag::kDartCompiledTagId));
+            compiler::Immediate(VMTag::kDartTagId));
     ASSERT((CallingConventions::kCalleeSaveCpuRegisters & (1 << THR)) != 0);
     ASSERT((CallingConventions::kCalleeSaveCpuRegisters & (1 << PP)) != 0);
   } else {
diff --git a/runtime/vm/scopes.cc b/runtime/vm/scopes.cc
index e8e2ba6..bed2d5c 100644
--- a/runtime/vm/scopes.cc
+++ b/runtime/vm/scopes.cc
@@ -210,36 +210,39 @@
       first_parameter_index;  // Current free frame index.
 
   LocalVariable* await_jump_var = nullptr;
-  LocalVariable* async_completer = nullptr;
+  LocalVariable* async_future = nullptr;
   LocalVariable* controller = nullptr;
   LocalVariable* chained_future = nullptr;
+  LocalVariable* is_sync = nullptr;
   for (intptr_t i = 0; i < num_variables(); i++) {
     LocalVariable* variable = VariableAt(i);
     if (variable->owner() == this) {
       if (variable->is_captured()) {
         if (variable->name().Equals(Symbols::AwaitJumpVar())) {
           await_jump_var = variable;
-        } else if (variable->name().Equals(Symbols::AsyncCompleter())) {
-          async_completer = variable;
+        } else if (variable->name().Equals(Symbols::AsyncFuture())) {
+          async_future = variable;
         } else if (variable->name().Equals(Symbols::Controller())) {
           controller = variable;
         } else if (variable->is_chained_future()) {
           chained_future = variable;
+        } else if (variable->name().Equals(Symbols::is_sync())) {
+          is_sync = variable;
         }
       }
     }
   }
   // If we are in an async/async* function, force :await_jump_var and
-  // :async_completer_var to be at fixed locations in the slot.
+  // :async_future to be at fixed locations in the slot.
   if (await_jump_var != nullptr) {
     AllocateContextVariable(await_jump_var, &context_owner);
     *found_captured_variables = true;
     ASSERT(await_jump_var->index().value() == Context::kAwaitJumpVarIndex);
   }
-  if (async_completer != nullptr) {
-    AllocateContextVariable(async_completer, &context_owner);
+  if (async_future != nullptr) {
+    AllocateContextVariable(async_future, &context_owner);
     *found_captured_variables = true;
-    ASSERT(async_completer->index().value() == Context::kAsyncCompleterIndex);
+    ASSERT(async_future->index().value() == Context::kAsyncFutureIndex);
   }
   if (controller != nullptr) {
     AllocateContextVariable(controller, &context_owner);
@@ -252,6 +255,11 @@
     ASSERT(chained_future->index().value() ==
            chained_future->expected_context_index());
   }
+  if (is_sync != nullptr) {
+    AllocateContextVariable(is_sync, &context_owner);
+    *found_captured_variables = true;
+    ASSERT(is_sync->index().value() == Context::kIsSyncIndex);
+  }
 
   while (pos < num_parameters) {
     LocalVariable* parameter = VariableAt(pos);
@@ -281,8 +289,9 @@
     if (variable->owner() == this) {
       if (variable->is_captured()) {
         // Skip the variables already pre-allocated above.
-        if (variable != await_jump_var && variable != async_completer &&
-            variable != controller && variable != chained_future) {
+        if (variable != await_jump_var && variable != async_future &&
+            variable != controller && variable != chained_future &&
+            variable != is_sync) {
           AllocateContextVariable(variable, &context_owner);
           *found_captured_variables = true;
         }
@@ -320,8 +329,8 @@
     // Keep :async_op for asynchronous debugging.
     return false;
   }
-  if (str.raw() == Symbols::AsyncCompleter().raw()) {
-    // Keep :async_completer for asynchronous debugging.
+  if (str.raw() == Symbols::AsyncFuture().raw()) {
+    // Keep :async_future for asynchronous debugging.
     return false;
   }
   if (str.raw() == Symbols::ControllerStream().raw()) {
@@ -332,6 +341,10 @@
     // Keep :await_jump_var for asynchronous debugging.
     return false;
   }
+  if (str.raw() == Symbols::is_sync().raw()) {
+    // Keep :is_sync for asynchronous debugging.
+    return false;
+  }
   if (str.raw() == Symbols::AsyncStackTraceVar().raw()) {
     // Keep :async_stack_trace for asynchronous debugging.
     return false;
diff --git a/runtime/vm/service.cc b/runtime/vm/service.cc
index 820e53f..b207114 100644
--- a/runtime/vm/service.cc
+++ b/runtime/vm/service.cc
@@ -12,6 +12,7 @@
 #include "platform/globals.h"
 
 #include "platform/unicode.h"
+#include "platform/utils.h"
 #include "vm/base64.h"
 #include "vm/canonical_tables.h"
 #include "vm/compiler/jit/compiler.h"
@@ -39,6 +40,7 @@
 #include "vm/port.h"
 #include "vm/profiler.h"
 #include "vm/profiler_service.h"
+#include "vm/resolver.h"
 #include "vm/reusable_handles.h"
 #include "vm/service_event.h"
 #include "vm/service_isolate.h"
@@ -973,9 +975,7 @@
   return MaybePause(isolate, error);
 }
 
-static void Finalizer(void* isolate_callback_data,
-                      Dart_WeakPersistentHandle handle,
-                      void* buffer) {
+static void Finalizer(void* isolate_callback_data, void* buffer) {
   free(buffer);
 }
 
@@ -1527,6 +1527,7 @@
 
 static const MethodParameter* get_stack_params[] = {
     RUNNABLE_ISOLATE_PARAMETER,
+    new UIntParameter("limit", false),
     NULL,
 };
 
@@ -1534,7 +1535,15 @@
   if (CheckDebuggerDisabled(thread, js)) {
     return true;
   }
-
+  intptr_t limit = 0;
+  bool has_limit = js->HasParam("limit");
+  if (has_limit) {
+    limit = UIntParameter::Parse(js->LookupParam("limit"));
+    if (limit < 0) {
+      PrintInvalidParamError(js, "limit");
+      return true;
+    }
+  }
   Isolate* isolate = thread->isolate();
   DebuggerStackTrace* stack = isolate->debugger()->StackTrace();
   DebuggerStackTrace* async_causal_stack =
@@ -1547,7 +1556,9 @@
   {
     JSONArray jsarr(&jsobj, "frames");
 
-    intptr_t num_frames = stack->Length();
+    intptr_t num_frames =
+        has_limit ? Utils::Minimum(stack->Length(), limit) : stack->Length();
+
     for (intptr_t i = 0; i < num_frames; i++) {
       ActivationFrame* frame = stack->FrameAt(i);
       JSONObject jsobj(&jsarr);
@@ -1558,7 +1569,9 @@
 
   if (async_causal_stack != NULL) {
     JSONArray jsarr(&jsobj, "asyncCausalFrames");
-    intptr_t num_frames = async_causal_stack->Length();
+    intptr_t num_frames =
+        has_limit ? Utils::Minimum(async_causal_stack->Length(), limit)
+                  : async_causal_stack->Length();
     for (intptr_t i = 0; i < num_frames; i++) {
       ActivationFrame* frame = async_causal_stack->FrameAt(i);
       JSONObject jsobj(&jsarr);
@@ -1569,7 +1582,9 @@
 
   if (awaiter_stack != NULL) {
     JSONArray jsarr(&jsobj, "awaiterFrames");
-    intptr_t num_frames = awaiter_stack->Length();
+    intptr_t num_frames = has_limit
+                              ? Utils::Minimum(awaiter_stack->Length(), limit)
+                              : awaiter_stack->Length();
     for (intptr_t i = 0; i < num_frames; i++) {
       ActivationFrame* frame = awaiter_stack->FrameAt(i);
       JSONObject jsobj(&jsarr);
@@ -1578,6 +1593,14 @@
     }
   }
 
+  const bool truncated =
+      (has_limit &&
+       (limit < stack->Length() ||
+        (async_causal_stack != nullptr &&
+         limit < async_causal_stack->Length()) ||
+        (awaiter_stack != nullptr && limit < awaiter_stack->Length())));
+  jsobj.AddProperty("truncated", truncated);
+
   {
     MessageHandler::AcquiredQueues aq(isolate->message_handler());
     jsobj.AddProperty("messages", aq.queue());
@@ -1725,7 +1748,9 @@
   }
   if (strcmp(parts[2], "functions") == 0) {
     // Function ids look like: "classes/17/functions/name"
-    const auto& function = Function::Handle(klass.LookupFunction(id));
+
+    const auto& function =
+        Function::Handle(Resolver::ResolveFunction(zone, klass, id));
     if (function.IsNull()) {
       return Object::sentinel().raw();
     }
@@ -1983,10 +2008,6 @@
   if (!code.IsNull()) {
     return code.raw();
   }
-  Bytecode& bytecode = Bytecode::Handle(Bytecode::FindCode(pc));
-  if (!bytecode.IsNull()) {
-    return bytecode.raw();
-  }
 
   // Not found.
   return Object::sentinel().raw();
@@ -3143,6 +3164,30 @@
   return true;
 }
 
+static const MethodParameter* get_ports_params[] = {
+    RUNNABLE_ISOLATE_PARAMETER,
+    NULL,
+};
+
+static bool GetPorts(Thread* thread, JSONStream* js) {
+  // Ensure the array and handles created below are promptly destroyed.
+  StackZone zone(thread);
+  HANDLESCOPE(thread);
+  const GrowableObjectArray& ports = GrowableObjectArray::Handle(
+      GrowableObjectArray::RawCast(DartLibraryCalls::LookupOpenPorts()));
+  JSONObject jsobj(js);
+  jsobj.AddProperty("type", "PortList");
+  {
+    Instance& port = Instance::Handle(zone.GetZone());
+    JSONArray arr(&jsobj, "ports");
+    for (int i = 0; i < ports.Length(); ++i) {
+      port ^= ports.At(i);
+      arr.AddValue(port);
+    }
+  }
+  return true;
+}
+
 #if !defined(DART_PRECOMPILED_RUNTIME)
 static const char* const report_enum_names[] = {
     SourceReport::kCallSitesStr,
@@ -4333,11 +4378,12 @@
     obj.AddPropertyF(
         "peer", "0x%" Px "",
         reinterpret_cast<uintptr_t>(weak_persistent_handle->peer()));
-    obj.AddPropertyF("callbackAddress", "0x%" Px "",
-                     weak_persistent_handle->callback_address());
+    obj.AddPropertyF(
+        "callbackAddress", "0x%" Px "",
+        reinterpret_cast<uintptr_t>(weak_persistent_handle->callback()));
     // Attempt to include a native symbol name.
     char* name = NativeSymbolResolver::LookupSymbolName(
-        weak_persistent_handle->callback_address(), nullptr);
+        reinterpret_cast<uword>(weak_persistent_handle->callback()), nullptr);
     obj.AddProperty("callbackSymbolName", (name == nullptr) ? "" : name);
     if (name != nullptr) {
       NativeSymbolResolver::FreeSymbolName(name);
@@ -4390,12 +4436,12 @@
   return true;
 }
 
-static const MethodParameter* get_ports_params[] = {
+static const MethodParameter* get_ports_private_params[] = {
     RUNNABLE_ISOLATE_PARAMETER,
     NULL,
 };
 
-static bool GetPorts(Thread* thread, JSONStream* js) {
+static bool GetPortsPrivate(Thread* thread, JSONStream* js) {
   MessageHandler* message_handler = thread->isolate()->message_handler();
   PortMap::PrintPortsForMessageHandler(message_handler, js);
   return true;
@@ -5055,6 +5101,8 @@
     get_inbound_references_params },
   { "getInstances", GetInstances,
     get_instances_params },
+  { "getPorts", GetPorts,
+    get_ports_params },
   { "getIsolate", GetIsolate,
     get_isolate_params },
   { "_getIsolateObjectStore", GetIsolateObjectStore,
@@ -5075,8 +5123,8 @@
     get_object_store_params },
   { "_getPersistentHandles", GetPersistentHandles,
       get_persistent_handles_params, },
-  { "_getPorts", GetPorts,
-    get_ports_params },
+  { "_getPorts", GetPortsPrivate,
+    get_ports_private_params },
   { "getProcessMemoryUsage", GetProcessMemoryUsage,
     get_process_memory_usage_params },
   { "_getReachableSize", GetReachableSize,
diff --git a/runtime/vm/service.h b/runtime/vm/service.h
index bf1d99b..f66a951 100644
--- a/runtime/vm/service.h
+++ b/runtime/vm/service.h
@@ -15,7 +15,7 @@
 namespace dart {
 
 #define SERVICE_PROTOCOL_MAJOR_VERSION 3
-#define SERVICE_PROTOCOL_MINOR_VERSION 40
+#define SERVICE_PROTOCOL_MINOR_VERSION 42
 
 class Array;
 class EmbedderServiceHandler;
diff --git a/runtime/vm/service/service.md b/runtime/vm/service/service.md
index b8d0906..281b4ba4 100644
--- a/runtime/vm/service/service.md
+++ b/runtime/vm/service/service.md
@@ -1,8 +1,8 @@
-# Dart VM Service Protocol 3.40
+# Dart VM Service Protocol 3.42
 
 > Please post feedback to the [observatory-discuss group][discuss-list]
 
-This document describes of _version 3.40_ of the Dart VM Service Protocol. This
+This document describes of _version 3.42_ of the Dart VM Service Protocol. This
 protocol is used to communicate with a running Dart Virtual Machine.
 
 To use the Service Protocol, start the VM with the *--observe* flag.
@@ -47,6 +47,7 @@
   - [getIsolateGroup](#getisolategroup)
   - [getMemoryUsage](#getmemoryusage)
   - [getObject](#getobject)
+  - [getPorts](#getports)
   - [getProcessMemoryUsage](#getprocessmemoryusage)
   - [getRetainingPath](#getretainingpath)
   - [getScripts](#getscripts)
@@ -113,6 +114,7 @@
   - [NativeFunction](#nativefunction)
   - [Null](#null)
   - [Object](#object)
+  - [PortList](#portlist)
   - [ReloadReport](#reloadreport)
   - [Response](#response)
   - [RetainingObject](#retainingobject)
@@ -936,6 +938,17 @@
 Float32x4List, and Float64x2List.  These parameters are otherwise
 ignored.
 
+### getPorts
+
+```
+PortList getPorts(string isolateId)
+```
+
+The _getPorts_ RPC is used to retrieve the list of `ReceivePort` instances for a
+given isolate.
+
+See [PortList](#portlist).
+
 ### getRetainingPath
 
 ```
@@ -982,12 +995,17 @@
 ### getStack
 
 ```
-Stack|Sentinel getStack(string isolateId)
+Stack|Sentinel getStack(string isolateId, int limit [optional])
 ```
 
 The _getStack_ RPC is used to retrieve the current execution stack and
 message queue for an isolate. The isolate does not need to be paused.
 
+If _limit_ is provided, up to _limit_ frames from the top of the stack will be
+returned. If the stack depth is smaller than _limit_ the entire stack is
+returned. Note: this limit also applies to the `asyncCausalFrames` and
+`awaiterFrames` stack representations in the _Stack_ response.
+
 If _isolateId_ refers to an isolate which has exited, then the
 _Collected_ [Sentinel](#sentinel) is returned.
 
@@ -2426,6 +2444,24 @@
   // Provided for instance kinds:
   //   Closure
   @Context closureContext [optional];
+
+  // The port ID for a ReceivePort.
+  //
+  // Provided for instance kinds:
+  //   ReceivePort
+  int portId [optional];
+
+  // The stack trace associated with the allocation of a ReceivePort.
+  //
+  // Provided for instance kinds:
+  //   ReceivePort
+  @Instance allocationLocation [optional];
+
+  // A name associated with a ReceivePort used for debugging purposes.
+  //
+  // Provided for instance kinds:
+  //   ReceivePort
+  string debugName [optional];
 }
 ```
 
@@ -2446,6 +2482,7 @@
   //   Double (suitable for passing to Double.parse())
   //   Int (suitable for passing to int.parse())
   //   String (value may be truncated)
+  //   StackTrace
   string valueAsString [optional];
 
   // The valueAsString for String references may be truncated. If so,
@@ -2658,6 +2695,24 @@
   //   BoundedType
   //   TypeParameter
   @Instance bound [optional];
+
+  // The port ID for a ReceivePort.
+  //
+  // Provided for instance kinds:
+  //   ReceivePort
+  int portId [optional];
+
+  // The stack trace associated with the allocation of a ReceivePort.
+  //
+  // Provided for instance kinds:
+  //   ReceivePort
+  @Instance allocationLocation [optional];
+
+  // A name associated with a ReceivePort used for debugging purposes.
+  //
+  // Provided for instance kinds:
+  //   ReceivePort
+  string debugName [optional];
 }
 ```
 
@@ -2742,6 +2797,9 @@
 
   // An instance of the Dart class BoundedType.
   BoundedType,
+
+  // An instance of the Dart class ReceivePort.
+  ReceivePort,
 }
 ```
 
@@ -3184,6 +3242,18 @@
 
 An _Object_ is a  persistent object that is owned by some isolate.
 
+### PortList
+
+```
+class PortList extends Response {
+  @Instance[] ports;
+}
+```
+
+A _PortList_ contains a list of ports associated with some isolate.
+
+See [getPort](#getPort).
+
 ### ProfileFunction
 
 ```
@@ -3581,13 +3651,33 @@
 
 ```
 class Stack extends Response {
+  // A list of frames that make up the synchronous stack, rooted at the message
+  // loop (i.e., the frames since the last asynchronous gap or the isolate's
+  // entrypoint).
   Frame[] frames;
+
+  // A list of frames representing the asynchronous path. Comparable to
+  // `awaiterFrames`, if provided, although some frames may be different.
   Frame[] asyncCausalFrames [optional];
+
+  // A list of frames representing the asynchronous path. Comparable to
+  // `asyncCausalFrames`, if provided, although some frames may be different.
   Frame[] awaiterFrames [optional];
+
+  // A list of messages in the isolate's message queue.
   Message[] messages;
+
+  // Specifies whether or not this stack is complete or has been artificially
+  // truncated.
+  bool truncated;
 }
 ```
 
+The _Stack_ class represents the various components of a Dart stack trace for a
+given isolate.
+
+See [getStack](#getStack).
+
 ### ExceptionPauseMode
 
 ```
@@ -3855,5 +3945,7 @@
 3.38 | Added `isSystemIsolate` property to `@Isolate` and `Isolate`, `isSystemIsolateGroup` property to `@IsolateGroup` and `IsolateGroup`, and properties `systemIsolates` and `systemIsolateGroups` to `VM`.
 3.39 | Removed the following deprecated RPCs and objects: `getClientName`, `getWebSocketTarget`, `setClientName`, `requireResumeApproval`, `ClientName`, and `WebSocketTarget`.
 3.40 | Added `IsolateFlag` object and `isolateFlags` property to `Isolate`.
+3.41 | Added `PortList` object, `ReceivePort` `InstanceKind`, and `getPorts` RPC.
+3.42 | Added `limit` optional parameter to `getStack` RPC.
 
 [discuss-list]: https://groups.google.com/a/dartlang.org/forum/#!forum/observatory-discuss
diff --git a/runtime/vm/service/service_extension.md b/runtime/vm/service/service_extension.md
index 5cb05ff..e5cc8ea 100644
--- a/runtime/vm/service/service_extension.md
+++ b/runtime/vm/service/service_extension.md
@@ -1,4 +1,4 @@
-# Dart VM Service Protocol Extension 1.4
+# Dart VM Service Protocol Extension 1.5
 
 This protocol describes service extensions that are made available through
 the Dart core libraries, but are not part of the core
@@ -10,7 +10,7 @@
 
 ## dart:io Extensions
 
-This section describes _version 1.4_ of the dart:io service protocol extensions.
+This section describes _version 1.5_ of the dart:io service protocol extensions.
 
 ### getVersion
 
@@ -22,9 +22,25 @@
 
 See [Version](#version).
 
+### socketProfilingEnabled
+
+```
+SocketProfilingState socketProfilingEnabled(string isolateId, bool enabled [optional])
+```
+
+The _socketProfilingEnabled_ RPC is used to enable/disable the socket profiler
+and query its current state. If `enabled` is provided, the profiler state will
+be updated to reflect the value of `enabled`.
+
+If the state of the socket profiler is changed, a `SocketProfilingStateChange`
+event will be sent on the `Extension` stream.
+
+See [SocketProfilingState](#socketprofilingstate).
+
 ### startSocketProfiling
 
 ```
+@Deprecated
 Success startSocketProfiling(string isolateId)
 ```
 
@@ -35,6 +51,7 @@
 ### pauseSocketProfiling
 
 ```
+@Deprecated
 Success pauseSocketProfiling(string isolateId)
 ```
 
@@ -196,6 +213,17 @@
 
 A _OpenFile_ contains information about reads and writes to a currently opened file.
 
+### HttpTimelineLoggingState
+
+```
+class HttpTimelineLoggingState extends Response {
+  // Whether Http timeline logging is enabled.
+  bool enabled;
+}
+```
+
+See [httpEnableTimelineLogging](#httpenabletimelinelogging).
+
 ### OpenFileList
 
 ```
@@ -205,6 +233,17 @@
 }
 ```
 
+### SocketProfilingState
+
+```
+class SocketProfilingState extends Response {
+  // Whether socket profiling is enabled.
+  bool enabled;
+}
+```
+
+See [socketProfilingEnabled](#socketProfilingEnabled).
+
 ### SpawnedProcess
 
 ```
@@ -345,3 +384,4 @@
 1.2 | Added `getOpenFiles`, `getOpenFileById`, `getSpawnedProcesses`, and `getSpawnedProcessById` RPCs and added `OpenFile` and `SpawnedProcess` objects.
 1.3 | Added `httpEnableTimelineLogging` RPC and `HttpTimelineLoggingStateChange` event, deprecated `getHttpEnableTimelineLogging` and `setHttpEnableTimelineLogging`.
 1.4 | Updated `httpEnableTimelineLogging` parameter `enable` to `enabled`. `enable` will continue to be accepted.
+1.5 | Added `socketProfilingEnabled` RPC and `SocketProfilingStateChanged` event, deprecated `startSocketProfiling` and `pauseSocketProfiling`.
diff --git a/runtime/vm/service_event.cc b/runtime/vm/service_event.cc
index 00d7ba3..145c9be 100644
--- a/runtime/vm/service_event.cc
+++ b/runtime/vm/service_event.cc
@@ -34,18 +34,23 @@
       bytes_(NULL),
       bytes_length_(0),
       timestamp_(OS::GetCurrentTimeMillis()) {
-  // We should never generate events for the vm isolate as it is never reported over the service.
+  // We should never generate events for the vm isolate as it is never reported
+  // over the service.
   ASSERT(isolate_ != Dart::vm_isolate());
 
-  // System isolates should never post service events. However, the Isolate service object uses a
-  // service event to represent the current running state of the isolate, so we need to allow for
-  // system isolates to create resume and none events for this purpose. The resume event represents
-  // a running isolate and the none event is returned for an isolate that has not yet been marked as
-  // runnable (see "pauseEvent" in Isolate::PrintJSON).
+  // System isolates should never post service events. However, the Isolate
+  // service object uses a service event to represent the current running state
+  // of the isolate, so we need to allow for system isolates to create resume
+  // and none events for this purpose. The resume event represents a running
+  // isolate and the none event is returned for an isolate that has not yet
+  // been marked as runnable (see "pauseEvent" in Isolate::PrintJSON).
   ASSERT(isolate == NULL || !Isolate::IsSystemIsolate(isolate) ||
          (Isolate::IsSystemIsolate(isolate) &&
           (event_kind == ServiceEvent::kResume ||
-           event_kind == ServiceEvent::kNone)));
+           event_kind == ServiceEvent::kNone ||
+           // VM service can print Observatory information to Stdout or Stderr
+           // which are embedder streams.
+           event_kind == ServiceEvent::kEmbedder)));
 
   if ((event_kind == ServiceEvent::kPauseStart) ||
       (event_kind == ServiceEvent::kPauseExit)) {
diff --git a/runtime/vm/service_test.cc b/runtime/vm/service_test.cc
index 9bec5e3..515a2b2 100644
--- a/runtime/vm/service_test.cc
+++ b/runtime/vm/service_test.cc
@@ -18,6 +18,7 @@
 #include "vm/os.h"
 #include "vm/port.h"
 #include "vm/profiler.h"
+#include "vm/resolver.h"
 #include "vm/service.h"
 #include "vm/unit_test.h"
 
@@ -119,8 +120,8 @@
 }
 
 static FunctionPtr GetFunction(const Class& cls, const char* name) {
-  const Function& result = Function::Handle(
-      cls.LookupDynamicFunction(String::Handle(String::New(name))));
+  const Function& result = Function::Handle(Resolver::ResolveDynamicFunction(
+      Thread::Current()->zone(), cls, String::Handle(String::New(name))));
   EXPECT(!result.IsNull());
   return result.raw();
 }
@@ -484,9 +485,7 @@
   EXPECT_SUBSTRING("\"members\":[", handler.msg());
 }
 
-static void WeakHandleFinalizer(void* isolate_callback_data,
-                                Dart_WeakPersistentHandle handle,
-                                void* peer) {}
+static void WeakHandleFinalizer(void* isolate_callback_data, void* peer) {}
 
 ISOLATE_UNIT_TEST_CASE(Service_PersistentHandles) {
   const char* kScript =
diff --git a/runtime/vm/simulator_arm.cc b/runtime/vm/simulator_arm.cc
index a09361b..316a56b 100644
--- a/runtime/vm/simulator_arm.cc
+++ b/runtime/vm/simulator_arm.cc
@@ -16,6 +16,7 @@
 #include "vm/compiler/assembler/disassembler.h"
 #include "vm/constants.h"
 #include "vm/cpu.h"
+#include "vm/image_snapshot.h"
 #include "vm/native_arguments.h"
 #include "vm/os_thread.h"
 #include "vm/stack_frame.h"
@@ -95,7 +96,9 @@
 
   static TokenPosition GetApproximateTokenIndex(const Code& code, uword pc);
 
-  static void PrintDartFrame(uword pc,
+  static void PrintDartFrame(uword vm_instructions,
+                             uword isolate_instructions,
+                             uword pc,
                              uword fp,
                              uword sp,
                              const Function& function,
@@ -241,7 +244,29 @@
   return token_pos;
 }
 
-void SimulatorDebugger::PrintDartFrame(uword pc,
+#if defined(DART_PRECOMPILED_RUNTIME)
+static const char* ImageName(uword vm_instructions,
+                             uword isolate_instructions,
+                             uword pc,
+                             intptr_t* offset) {
+  const Image vm_image(vm_instructions);
+  const Image isolate_image(isolate_instructions);
+  if (vm_image.contains(pc)) {
+    *offset = pc - vm_instructions;
+    return kVmSnapshotInstructionsAsmSymbol;
+  } else if (isolate_image.contains(pc)) {
+    *offset = pc - isolate_instructions;
+    return kIsolateSnapshotInstructionsAsmSymbol;
+  } else {
+    *offset = 0;
+    return "<unknown>";
+  }
+}
+#endif
+
+void SimulatorDebugger::PrintDartFrame(uword vm_instructions,
+                                       uword isolate_instructions,
+                                       uword pc,
                                        uword fp,
                                        uword sp,
                                        const Function& function,
@@ -257,25 +282,44 @@
     script.GetTokenLocation(token_pos, &line, &column);
   }
   OS::PrintErr(
-      "pc=0x%" Px " fp=0x%" Px " sp=0x%" Px " %s%s (%s:%" Pd ":%" Pd ")\n", pc,
+      "pc=0x%" Px " fp=0x%" Px " sp=0x%" Px " %s%s (%s:%" Pd ":%" Pd ")", pc,
       fp, sp, is_optimized ? (is_inlined ? "inlined " : "optimized ") : "",
       func_name.ToCString(), url.ToCString(), line, column);
+#if defined(DART_PRECOMPILED_RUNTIME)
+  intptr_t offset;
+  auto const symbol_name =
+      ImageName(vm_instructions, isolate_instructions, pc, &offset);
+  OS::PrintErr(" %s+0x%" Px "", symbol_name, offset);
+#endif
+  OS::PrintErr("\n");
 }
 
 void SimulatorDebugger::PrintBacktrace() {
-  StackFrameIterator frames(
-      sim_->get_register(FP), sim_->get_register(SP), sim_->get_pc(),
-      ValidationPolicy::kDontValidateFrames, Thread::Current(),
-      StackFrameIterator::kNoCrossThreadIteration);
+  auto const T = Thread::Current();
+  auto const Z = T->zone();
+#if defined(DART_PRECOMPILED_RUNTIME)
+  auto const vm_instructions = reinterpret_cast<uword>(
+      Dart::vm_isolate()->group()->source()->snapshot_instructions);
+  auto const isolate_instructions = reinterpret_cast<uword>(
+      T->isolate_group()->source()->snapshot_instructions);
+  OS::PrintErr("vm_instructions=0x%" Px ", isolate_instructions=0x%" Px "\n",
+               vm_instructions, isolate_instructions);
+#else
+  const uword vm_instructions = 0;
+  const uword isolate_instructions = 0;
+#endif
+  StackFrameIterator frames(sim_->get_register(FP), sim_->get_register(SP),
+                            sim_->get_pc(),
+                            ValidationPolicy::kDontValidateFrames, T,
+                            StackFrameIterator::kNoCrossThreadIteration);
   StackFrame* frame = frames.NextFrame();
   ASSERT(frame != NULL);
-  Function& function = Function::Handle();
-  Function& inlined_function = Function::Handle();
-  Code& code = Code::Handle();
-  Code& unoptimized_code = Code::Handle();
+  Function& function = Function::Handle(Z);
+  Function& inlined_function = Function::Handle(Z);
+  Code& code = Code::Handle(Z);
+  Code& unoptimized_code = Code::Handle(Z);
   while (frame != NULL) {
     if (frame->IsDartFrame()) {
-      ASSERT(!frame->is_interpreted());  // Not yet supported.
       code = frame->LookupDartCode();
       function = code.function();
       if (code.is_optimized()) {
@@ -291,24 +335,33 @@
           it.Advance();
           if (!it.Done()) {
             PrintDartFrame(
-                unoptimized_pc, frame->fp(), frame->sp(), inlined_function,
+                vm_instructions, isolate_instructions, unoptimized_pc,
+                frame->fp(), frame->sp(), inlined_function,
                 GetApproximateTokenIndex(unoptimized_code, unoptimized_pc),
                 true, true);
           }
         }
         // Print the optimized inlining frame below.
       }
-      PrintDartFrame(frame->pc(), frame->fp(), frame->sp(), function,
+      PrintDartFrame(vm_instructions, isolate_instructions, frame->pc(),
+                     frame->fp(), frame->sp(), function,
                      GetApproximateTokenIndex(code, frame->pc()),
                      code.is_optimized(), false);
     } else {
-      OS::PrintErr("pc=0x%" Px " fp=0x%" Px " sp=0x%" Px " %s frame\n",
+      OS::PrintErr("pc=0x%" Px " fp=0x%" Px " sp=0x%" Px " %s frame",
                    frame->pc(), frame->fp(), frame->sp(),
                    frame->IsEntryFrame()
                        ? "entry"
                        : frame->IsExitFrame()
                              ? "exit"
                              : frame->IsStubFrame() ? "stub" : "invalid");
+#if defined(DART_PRECOMPILED_RUNTIME)
+      intptr_t offset;
+      auto const symbol_name = ImageName(vm_instructions, isolate_instructions,
+                                         frame->pc(), &offset);
+      OS::PrintErr(" %s+0x%" Px "", symbol_name, offset);
+#endif
+      OS::PrintErr("\n");
     }
     frame = frames.NextFrame();
   }
@@ -3598,13 +3651,15 @@
   // in the previous C++ frames.
   StackResource::Unwind(thread);
 
+  // Keep the following code in sync with `StubCode::JumpToFrameStub()`.
+
   // Unwind the C++ stack and continue simulation in the target frame.
   set_register(PC, static_cast<int32_t>(pc));
   set_register(SP, static_cast<int32_t>(sp));
   set_register(FP, static_cast<int32_t>(fp));
   set_register(THR, reinterpret_cast<uword>(thread));
   // Set the tag.
-  thread->set_vm_tag(VMTag::kDartCompiledTagId);
+  thread->set_vm_tag(VMTag::kDartTagId);
   // Clear top exit frame.
   thread->set_top_exit_frame_info(0);
   // Restore pool pointer.
@@ -3617,6 +3672,10 @@
 
   set_register(CODE_REG, code);
   set_register(PP, pp);
+  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+    set_register(DISPATCH_TABLE_REG,
+                 reinterpret_cast<int32_t>(thread->dispatch_table_array()));
+  }
   buf->Longjmp();
 }
 
diff --git a/runtime/vm/simulator_arm64.cc b/runtime/vm/simulator_arm64.cc
index 456ab1c..b80c933 100644
--- a/runtime/vm/simulator_arm64.cc
+++ b/runtime/vm/simulator_arm64.cc
@@ -15,6 +15,7 @@
 
 #include "vm/compiler/assembler/disassembler.h"
 #include "vm/constants.h"
+#include "vm/image_snapshot.h"
 #include "vm/native_arguments.h"
 #include "vm/os_thread.h"
 #include "vm/stack_frame.h"
@@ -100,7 +101,9 @@
 
   static TokenPosition GetApproximateTokenIndex(const Code& code, uword pc);
 
-  static void PrintDartFrame(uword pc,
+  static void PrintDartFrame(uword vm_instructions,
+                             uword isolate_instructions,
+                             uword pc,
                              uword fp,
                              uword sp,
                              const Function& function,
@@ -269,7 +272,29 @@
   return token_pos;
 }
 
-void SimulatorDebugger::PrintDartFrame(uword pc,
+#if defined(DART_PRECOMPILED_RUNTIME)
+static const char* ImageName(uword vm_instructions,
+                             uword isolate_instructions,
+                             uword pc,
+                             intptr_t* offset) {
+  const Image vm_image(vm_instructions);
+  const Image isolate_image(isolate_instructions);
+  if (vm_image.contains(pc)) {
+    *offset = pc - vm_instructions;
+    return kVmSnapshotInstructionsAsmSymbol;
+  } else if (isolate_image.contains(pc)) {
+    *offset = pc - isolate_instructions;
+    return kIsolateSnapshotInstructionsAsmSymbol;
+  } else {
+    *offset = 0;
+    return "<unknown>";
+  }
+}
+#endif
+
+void SimulatorDebugger::PrintDartFrame(uword vm_instructions,
+                                       uword isolate_instructions,
+                                       uword pc,
                                        uword fp,
                                        uword sp,
                                        const Function& function,
@@ -285,25 +310,44 @@
     script.GetTokenLocation(token_pos, &line, &column);
   }
   OS::PrintErr(
-      "pc=0x%" Px " fp=0x%" Px " sp=0x%" Px " %s%s (%s:%" Pd ":%" Pd ")\n", pc,
+      "pc=0x%" Px " fp=0x%" Px " sp=0x%" Px " %s%s (%s:%" Pd ":%" Pd ")", pc,
       fp, sp, is_optimized ? (is_inlined ? "inlined " : "optimized ") : "",
       func_name.ToCString(), url.ToCString(), line, column);
+#if defined(DART_PRECOMPILED_RUNTIME)
+  intptr_t offset;
+  auto const symbol_name =
+      ImageName(vm_instructions, isolate_instructions, pc, &offset);
+  OS::PrintErr(" %s+0x%" Px "", symbol_name, offset);
+#endif
+  OS::PrintErr("\n");
 }
 
 void SimulatorDebugger::PrintBacktrace() {
-  StackFrameIterator frames(
-      sim_->get_register(FP), sim_->get_register(SP), sim_->get_pc(),
-      ValidationPolicy::kDontValidateFrames, Thread::Current(),
-      StackFrameIterator::kNoCrossThreadIteration);
+  auto const T = Thread::Current();
+  auto const Z = T->zone();
+#if defined(DART_PRECOMPILED_RUNTIME)
+  auto const vm_instructions = reinterpret_cast<uword>(
+      Dart::vm_isolate()->group()->source()->snapshot_instructions);
+  auto const isolate_instructions = reinterpret_cast<uword>(
+      T->isolate_group()->source()->snapshot_instructions);
+  OS::PrintErr("vm_instructions=0x%" Px ", isolate_instructions=0x%" Px "\n",
+               vm_instructions, isolate_instructions);
+#else
+  const uword vm_instructions = 0;
+  const uword isolate_instructions = 0;
+#endif
+  StackFrameIterator frames(sim_->get_register(FP), sim_->get_register(SP),
+                            sim_->get_pc(),
+                            ValidationPolicy::kDontValidateFrames, T,
+                            StackFrameIterator::kNoCrossThreadIteration);
   StackFrame* frame = frames.NextFrame();
   ASSERT(frame != NULL);
-  Function& function = Function::Handle();
-  Function& inlined_function = Function::Handle();
-  Code& code = Code::Handle();
-  Code& unoptimized_code = Code::Handle();
+  Function& function = Function::Handle(Z);
+  Function& inlined_function = Function::Handle(Z);
+  Code& code = Code::Handle(Z);
+  Code& unoptimized_code = Code::Handle(Z);
   while (frame != NULL) {
     if (frame->IsDartFrame()) {
-      ASSERT(!frame->is_interpreted());  // Not yet supported.
       code = frame->LookupDartCode();
       function = code.function();
       if (code.is_optimized()) {
@@ -319,24 +363,33 @@
           it.Advance();
           if (!it.Done()) {
             PrintDartFrame(
-                unoptimized_pc, frame->fp(), frame->sp(), inlined_function,
+                vm_instructions, isolate_instructions, unoptimized_pc,
+                frame->fp(), frame->sp(), inlined_function,
                 GetApproximateTokenIndex(unoptimized_code, unoptimized_pc),
                 true, true);
           }
         }
         // Print the optimized inlining frame below.
       }
-      PrintDartFrame(frame->pc(), frame->fp(), frame->sp(), function,
+      PrintDartFrame(vm_instructions, isolate_instructions, frame->pc(),
+                     frame->fp(), frame->sp(), function,
                      GetApproximateTokenIndex(code, frame->pc()),
                      code.is_optimized(), false);
     } else {
-      OS::PrintErr("pc=0x%" Px " fp=0x%" Px " sp=0x%" Px " %s frame\n",
+      OS::PrintErr("pc=0x%" Px " fp=0x%" Px " sp=0x%" Px " %s frame",
                    frame->pc(), frame->fp(), frame->sp(),
                    frame->IsEntryFrame()
                        ? "entry"
                        : frame->IsExitFrame()
                              ? "exit"
                              : frame->IsStubFrame() ? "stub" : "invalid");
+#if defined(DART_PRECOMPILED_RUNTIME)
+      intptr_t offset;
+      auto const symbol_name = ImageName(vm_instructions, isolate_instructions,
+                                         frame->pc(), &offset);
+      OS::PrintErr(" %s+0x%" Px "", symbol_name, offset);
+#endif
+      OS::PrintErr("\n");
     }
     frame = frames.NextFrame();
   }
@@ -3653,13 +3706,15 @@
   // in the previous C++ frames.
   StackResource::Unwind(thread);
 
+  // Keep the following code in sync with `StubCode::JumpToFrameStub()`.
+
   // Unwind the C++ stack and continue simulation in the target frame.
   set_pc(static_cast<int64_t>(pc));
   set_register(NULL, SP, static_cast<int64_t>(sp));
   set_register(NULL, FP, static_cast<int64_t>(fp));
   set_register(NULL, THR, reinterpret_cast<int64_t>(thread));
   // Set the tag.
-  thread->set_vm_tag(VMTag::kDartCompiledTagId);
+  thread->set_vm_tag(VMTag::kDartTagId);
   // Clear top exit frame.
   thread->set_top_exit_frame_info(0);
   // Restore pool pointer.
@@ -3672,6 +3727,13 @@
   pp -= kHeapObjectTag;  // In the PP register, the pool pointer is untagged.
   set_register(NULL, CODE_REG, code);
   set_register(NULL, PP, pp);
+  set_register(NULL, BARRIER_MASK, thread->write_barrier_mask());
+  set_register(NULL, NULL_REG, static_cast<int64_t>(Object::null()));
+  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+    set_register(NULL, DISPATCH_TABLE_REG,
+                 reinterpret_cast<int64_t>(thread->dispatch_table_array()));
+  }
+
   buf->Longjmp();
 }
 
diff --git a/runtime/vm/snapshot.cc b/runtime/vm/snapshot.cc
index 5c0d911..10a5996 100644
--- a/runtime/vm/snapshot.cc
+++ b/runtime/vm/snapshot.cc
@@ -1138,7 +1138,7 @@
 
   // Check if it is a code object in that case just write a Null object
   // as we do not want code objects in the snapshot.
-  if ((cid == kCodeCid) || (cid == kBytecodeCid)) {
+  if (cid == kCodeCid) {
     WriteVMIsolateObject(kNullObject);
     return true;
   }
diff --git a/runtime/vm/snapshot.h b/runtime/vm/snapshot.h
index 94aa3e7..90e62a0 100644
--- a/runtime/vm/snapshot.h
+++ b/runtime/vm/snapshot.h
@@ -138,9 +138,6 @@
   static bool IncludesCode(Kind kind) {
     return (kind == kFullJIT) || (kind == kFullAOT);
   }
-  static bool IncludesBytecode(Kind kind) {
-    return (kind == kFull) || (kind == kFullCore) || (kind == kFullJIT);
-  }
 
   const uint8_t* Addr() const { return reinterpret_cast<const uint8_t*>(this); }
 
diff --git a/runtime/vm/snapshot_test.cc b/runtime/vm/snapshot_test.cc
index ed0383c..f793f2e 100644
--- a/runtime/vm/snapshot_test.cc
+++ b/runtime/vm/snapshot_test.cc
@@ -381,7 +381,6 @@
   TEST_ROUND_TRIP_IDENTICAL(Object::script_class());
   TEST_ROUND_TRIP_IDENTICAL(Object::library_class());
   TEST_ROUND_TRIP_IDENTICAL(Object::code_class());
-  TEST_ROUND_TRIP_IDENTICAL(Object::bytecode_class());
   TEST_ROUND_TRIP_IDENTICAL(Object::instructions_class());
   TEST_ROUND_TRIP_IDENTICAL(Object::pc_descriptors_class());
   TEST_ROUND_TRIP_IDENTICAL(Object::exception_handlers_class());
diff --git a/runtime/vm/source_report.cc b/runtime/vm/source_report.cc
index 4f5dcec..4ed6a46 100644
--- a/runtime/vm/source_report.cc
+++ b/runtime/vm/source_report.cc
@@ -108,11 +108,7 @@
       func.IsRedirectingFactory() || func.is_synthetic()) {
     return true;
   }
-  // Note that context_scope() remains null for closures declared in bytecode,
-  // because the same information is retrieved from the parent's local variable
-  // descriptors.
-  // See IsLocalFunction() case in BytecodeReader::ComputeLocalVarDescriptors.
-  if (!func.is_declared_in_bytecode() && func.IsNonImplicitClosureFunction() &&
+  if (func.IsNonImplicitClosureFunction() &&
       (func.context_scope() == ContextScope::null())) {
     // TODO(iposva): This can arise if we attempt to compile an inner function
     // before we have compiled its enclosing function or if the enclosing
@@ -198,10 +194,7 @@
 void SourceReport::PrintCallSitesData(JSONObject* jsobj,
                                       const Function& function,
                                       const Code& code) {
-  if (code.IsNull()) {
-    // TODO(regis): implement for bytecode.
-    return;
-  }
+  ASSERT(!code.IsNull());
   const TokenPosition begin_pos = function.token_pos();
   const TokenPosition end_pos = function.end_token_pos();
 
@@ -234,10 +227,7 @@
 void SourceReport::PrintCoverageData(JSONObject* jsobj,
                                      const Function& function,
                                      const Code& code) {
-  if (code.IsNull()) {
-    // TODO(regis): implement for bytecode.
-    return;
-  }
+  ASSERT(!code.IsNull());
   const TokenPosition begin_pos = function.token_pos();
   const TokenPosition end_pos = function.end_token_pos();
 
@@ -319,63 +309,24 @@
 
   BitVector possible(zone(), func_length);
 
-  if (code.IsNull()) {
-    const Bytecode& bytecode = Bytecode::Handle(func.bytecode());
-    ASSERT(!bytecode.IsNull());
-    kernel::BytecodeSourcePositionsIterator iter(zone(), bytecode);
-    intptr_t token_offset = -1;
-    uword pc_offset = kUwordMax;
-    // Ignore all possible breakpoint positions until the first DebugCheck
-    // opcode of the function.
-    const uword debug_check_pc = bytecode.GetFirstDebugCheckOpcodePc();
-    if (debug_check_pc != 0) {
-      const uword debug_check_pc_offset =
-          debug_check_pc - bytecode.PayloadStart();
-      while (iter.MoveNext()) {
-        if (pc_offset != kUwordMax) {
-          // Check that there is at least one 'debug checked' opcode in the last
-          // source position range.
-          if (bytecode.GetDebugCheckedOpcodeReturnAddress(
-                  pc_offset, iter.PcOffset()) != 0) {
-            possible.Add(token_offset);
-          }
-          pc_offset = kUwordMax;
-        }
-        const TokenPosition token_pos = iter.TokenPos();
-        if ((token_pos < begin_pos) || (token_pos > end_pos)) {
-          // Does not correspond to a valid source position.
-          continue;
-        }
-        if (iter.PcOffset() < debug_check_pc_offset) {
-          // No breakpoints in prologue.
-          continue;
-        }
-        pc_offset = iter.PcOffset();
-        token_offset = token_pos.Pos() - begin_pos.Pos();
-      }
-    }
-    if (pc_offset != kUwordMax && bytecode.GetDebugCheckedOpcodeReturnAddress(
-                                      pc_offset, bytecode.Size()) != 0) {
-      possible.Add(token_offset);
-    }
-  } else {
-    const uint8_t kSafepointKind =
-        (PcDescriptorsLayout::kIcCall | PcDescriptorsLayout::kUnoptStaticCall |
-         PcDescriptorsLayout::kRuntimeCall);
+  ASSERT(!code.IsNull());
 
-    const PcDescriptors& descriptors =
-        PcDescriptors::Handle(zone(), code.pc_descriptors());
+  const uint8_t kSafepointKind =
+      (PcDescriptorsLayout::kIcCall | PcDescriptorsLayout::kUnoptStaticCall |
+       PcDescriptorsLayout::kRuntimeCall);
 
-    PcDescriptors::Iterator iter(descriptors, kSafepointKind);
-    while (iter.MoveNext()) {
-      const TokenPosition token_pos = iter.TokenPos();
-      if ((token_pos < begin_pos) || (token_pos > end_pos)) {
-        // Does not correspond to a valid source position.
-        continue;
-      }
-      intptr_t token_offset = token_pos.Pos() - begin_pos.Pos();
-      possible.Add(token_offset);
+  const PcDescriptors& descriptors =
+      PcDescriptors::Handle(zone(), code.pc_descriptors());
+
+  PcDescriptors::Iterator iter(descriptors, kSafepointKind);
+  while (iter.MoveNext()) {
+    const TokenPosition token_pos = iter.TokenPos();
+    if ((token_pos < begin_pos) || (token_pos > end_pos)) {
+      // Does not correspond to a valid source position.
+      continue;
     }
+    intptr_t token_offset = token_pos.Pos() - begin_pos.Pos();
+    possible.Add(token_offset);
   }
 
   JSONArray bpts(jsobj, "possibleBreakpoints");
@@ -454,16 +405,7 @@
   const TokenPosition end_pos = func.end_token_pos();
 
   Code& code = Code::Handle(zone(), func.unoptimized_code());
-  Bytecode& bytecode = Bytecode::Handle(zone());
-  if (FLAG_enable_interpreter && !func.HasCode() && func.HasBytecode()) {
-    // When the bytecode of a function is loaded, the function code is not null,
-    // but pointing to the stub to interpret the bytecode. The various Print
-    // functions below take code as an argument and know to process the bytecode
-    // if code is null.
-    code = Code::null();  // Ignore installed stub to interpret bytecode.
-    bytecode = func.bytecode();
-  }
-  if (code.IsNull() && bytecode.IsNull()) {
+  if (code.IsNull()) {
     if (func.HasCode() || (compile_mode_ == kForceCompile)) {
       const Error& err =
           Error::Handle(Compiler::EnsureUnoptimizedCode(thread(), func));
@@ -478,10 +420,6 @@
         return;
       }
       code = func.unoptimized_code();
-      if (FLAG_enable_interpreter && !func.HasCode() && func.HasBytecode()) {
-        code = Code::null();  // Ignore installed stub to interpret bytecode.
-        bytecode = func.bytecode();
-      }
     } else {
       // This function has not been compiled yet.
       JSONObject range(jsarr);
@@ -492,7 +430,7 @@
       return;
     }
   }
-  ASSERT(!code.IsNull() || !bytecode.IsNull());
+  ASSERT(!code.IsNull());
 
   // We skip compiled async functions.  Once an async function has
   // been compiled, there is another function with the same range which
@@ -503,7 +441,7 @@
     range.AddProperty("scriptIndex", GetScriptIndex(script));
     range.AddProperty("startPos", begin_pos);
     range.AddProperty("endPos", end_pos);
-    range.AddProperty("compiled", true);  // bytecode or code.
+    range.AddProperty("compiled", true);
 
     if (IsReportRequested(kCallSites)) {
       PrintCallSitesData(&range, func, code);
@@ -568,7 +506,7 @@
       }
     }
 
-    functions = cls.functions();
+    functions = cls.current_functions();
     for (int i = 0; i < functions.Length(); i++) {
       func ^= functions.At(i);
       // Skip getter functions of static const field.
@@ -590,8 +528,6 @@
 }
 
 void SourceReport::VisitClosures(JSONArray* jsarr) {
-  // Note that closures declared in bytecode are not visited here, but in
-  // VisitFunction while traversing the object pool of their owner functions.
   const GrowableObjectArray& closures = GrowableObjectArray::Handle(
       thread()->isolate()->object_store()->closure_functions());
 
diff --git a/runtime/vm/stack_frame.cc b/runtime/vm/stack_frame.cc
index 9df6e3c..6d6f013 100644
--- a/runtime/vm/stack_frame.cc
+++ b/runtime/vm/stack_frame.cc
@@ -26,8 +26,6 @@
 
 namespace dart {
 
-DECLARE_FLAG(bool, enable_interpreter);
-
 const FrameLayout invalid_frame_layout = {
     /*.first_object_from_fp = */ -1,
     /*.last_fixed_object_from_fp = */ -1,
@@ -151,10 +149,6 @@
 }
 
 bool StackFrame::IsStubFrame() const {
-  if (is_interpreted()) {
-    return false;
-  }
-
   if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
     return IsBareInstructionsStubFrame();
   }
@@ -177,15 +171,6 @@
   ASSERT(thread_ == Thread::Current());
   Zone* zone = Thread::Current()->zone();
   if (IsDartFrame()) {
-    if (is_interpreted()) {
-      const Bytecode& bytecode = Bytecode::Handle(zone, LookupDartBytecode());
-      ASSERT(!bytecode.IsNull());
-      return zone->PrintToString("[%-8s : sp(%#" Px ") fp(%#" Px ") pc(%#" Px
-                                 " offset:0x%" Px ") %s ]",
-                                 GetName(), sp(), fp(), pc(),
-                                 pc() - bytecode.PayloadStart(),
-                                 bytecode.FullyQualifiedName());
-    }
     const Code& code = Code::Handle(zone, LookupDartCode());
     ASSERT(!code.IsNull());
     const auto& owner = Object::Handle(
@@ -207,16 +192,11 @@
 
 void ExitFrame::VisitObjectPointers(ObjectPointerVisitor* visitor) {
   ASSERT(visitor != NULL);
-  // Visit pc marker and saved pool pointer, or, for interpreted frame, code
-  // object and function object.
-  ObjectPtr* last_fixed =
-      reinterpret_cast<ObjectPtr*>(fp()) +
-      (is_interpreted() ? kKBCLastFixedObjectSlotFromFp
-                        : runtime_frame_layout.first_object_from_fp);
-  ObjectPtr* first_fixed =
-      reinterpret_cast<ObjectPtr*>(fp()) +
-      (is_interpreted() ? kKBCFirstObjectSlotFromFp
-                        : runtime_frame_layout.last_fixed_object_from_fp);
+  // Visit pc marker and saved pool pointer.
+  ObjectPtr* last_fixed = reinterpret_cast<ObjectPtr*>(fp()) +
+                          runtime_frame_layout.first_object_from_fp;
+  ObjectPtr* first_fixed = reinterpret_cast<ObjectPtr*>(fp()) +
+                           runtime_frame_layout.last_fixed_object_from_fp;
   if (first_fixed <= last_fixed) {
     visitor->VisitPointers(first_fixed, last_fixed);
   } else {
@@ -228,12 +208,9 @@
 void EntryFrame::VisitObjectPointers(ObjectPointerVisitor* visitor) {
   ASSERT(visitor != NULL);
   // Visit objects between SP and (FP - callee_save_area).
-  ObjectPtr* first = is_interpreted() ? reinterpret_cast<ObjectPtr*>(fp()) +
-                                            kKBCSavedArgDescSlotFromEntryFp
-                                      : reinterpret_cast<ObjectPtr*>(sp());
-  ObjectPtr* last = is_interpreted() ? reinterpret_cast<ObjectPtr*>(sp())
-                                     : reinterpret_cast<ObjectPtr*>(fp()) +
-                                           kExitLinkSlotFromEntryFp - 1;
+  ObjectPtr* first = reinterpret_cast<ObjectPtr*>(sp());
+  ObjectPtr* last =
+      reinterpret_cast<ObjectPtr*>(fp()) + kExitLinkSlotFromEntryFp - 1;
   // There may not be any pointer to visit; in this case, first > last.
   visitor->VisitPointers(first, last);
 }
@@ -253,18 +230,14 @@
     code = GetCodeObject();
   } else {
     ObjectPtr pc_marker = *(reinterpret_cast<ObjectPtr*>(
-        fp() + ((is_interpreted() ? kKBCPcMarkerSlotFromFp
-                                  : runtime_frame_layout.code_from_fp) *
-                kWordSize)));
+        fp() + (runtime_frame_layout.code_from_fp * kWordSize)));
     // May forward raw code. Note we don't just visit the pc marker slot first
     // because the visitor's forwarding might not be idempotent.
     visitor->VisitPointer(&pc_marker);
     if (pc_marker->IsHeapObject() && (pc_marker->GetClassId() == kCodeCid)) {
       code ^= pc_marker;
     } else {
-      ASSERT(pc_marker == Object::null() ||
-             (is_interpreted() && (!pc_marker->IsHeapObject() ||
-                                   (pc_marker->GetClassId() == kBytecodeCid))));
+      ASSERT(pc_marker == Object::null());
     }
   }
 
@@ -288,9 +261,6 @@
     const uword start = code.PayloadStart();
     const uint32_t pc_offset = pc() - start;
     if (it.Find(pc_offset)) {
-      if (is_interpreted()) {
-        UNIMPLEMENTED();
-      }
       ObjectPtr* first = reinterpret_cast<ObjectPtr*>(sp());
       ObjectPtr* last = reinterpret_cast<ObjectPtr*>(
           fp() + (runtime_frame_layout.first_local_from_fp * kWordSize));
@@ -348,33 +318,14 @@
 
   // For normal unoptimized Dart frames and Stub frames each slot
   // between the first and last included are tagged objects.
-  if (is_interpreted()) {
-    // Do not visit caller's pc or caller's fp.
-    ObjectPtr* first =
-        reinterpret_cast<ObjectPtr*>(fp()) + kKBCFirstObjectSlotFromFp;
-    ObjectPtr* last =
-        reinterpret_cast<ObjectPtr*>(fp()) + kKBCLastFixedObjectSlotFromFp;
-
-    visitor->VisitPointers(first, last);
-  }
-  ObjectPtr* first =
-      reinterpret_cast<ObjectPtr*>(is_interpreted() ? fp() : sp());
+  ObjectPtr* first = reinterpret_cast<ObjectPtr*>(sp());
   ObjectPtr* last = reinterpret_cast<ObjectPtr*>(
-      is_interpreted()
-          ? sp()
-          : fp() + (runtime_frame_layout.first_object_from_fp * kWordSize));
+      fp() + (runtime_frame_layout.first_object_from_fp * kWordSize));
 
   visitor->VisitPointers(first, last);
 }
 
 FunctionPtr StackFrame::LookupDartFunction() const {
-  if (is_interpreted()) {
-    ObjectPtr result = *(reinterpret_cast<FunctionPtr*>(
-        fp() + kKBCFunctionSlotFromFp * kWordSize));
-    ASSERT((result == Object::null()) ||
-           (result->GetClassId() == kFunctionCid));
-    return static_cast<FunctionPtr>(result);
-  }
   const Code& code = Code::Handle(LookupDartCode());
   if (!code.IsNull()) {
     return code.function();
@@ -399,8 +350,6 @@
 }
 
 CodePtr StackFrame::GetCodeObject() const {
-  ASSERT(!is_interpreted());
-
 #if defined(DART_PRECOMPILED_RUNTIME)
   if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
     CodePtr code = ReversePc::Lookup(isolate_group(), pc(),
@@ -424,27 +373,6 @@
   return static_cast<CodePtr>(pc_marker);
 }
 
-BytecodePtr StackFrame::LookupDartBytecode() const {
-// We add a no gc scope to ensure that the code below does not trigger
-// a GC as we are handling raw object references here. It is possible
-// that the code is called while a GC is in progress, that is ok.
-#if !defined(HOST_OS_WINDOWS) && !defined(HOST_OS_FUCHSIA)
-  // On Windows and Fuchsia, the profiler calls this from a separate thread
-  // where Thread::Current() is NULL, so we cannot create a NoSafepointScope.
-  NoSafepointScope no_safepoint;
-#endif
-  return GetBytecodeObject();
-}
-
-BytecodePtr StackFrame::GetBytecodeObject() const {
-  ASSERT(is_interpreted());
-  ObjectPtr pc_marker = *(
-      reinterpret_cast<ObjectPtr*>(fp() + kKBCPcMarkerSlotFromFp * kWordSize));
-  ASSERT((pc_marker == Object::null()) ||
-         (pc_marker->GetClassId() == kBytecodeCid));
-  return static_cast<BytecodePtr>(pc_marker);
-}
-
 bool StackFrame::FindExceptionHandler(Thread* thread,
                                       uword* handler_pc,
                                       bool* needs_stacktrace,
@@ -452,28 +380,19 @@
                                       bool* is_optimized) const {
   REUSABLE_CODE_HANDLESCOPE(thread);
   Code& code = reused_code_handle.Handle();
-  REUSABLE_BYTECODE_HANDLESCOPE(thread);
-  Bytecode& bytecode = reused_bytecode_handle.Handle();
   REUSABLE_EXCEPTION_HANDLERS_HANDLESCOPE(thread);
   ExceptionHandlers& handlers = reused_exception_handlers_handle.Handle();
   REUSABLE_PC_DESCRIPTORS_HANDLESCOPE(thread);
   PcDescriptors& descriptors = reused_pc_descriptors_handle.Handle();
   uword start;
-  if (is_interpreted()) {
-    bytecode = LookupDartBytecode();
-    ASSERT(!bytecode.IsNull());
-    start = bytecode.PayloadStart();
-    handlers = bytecode.exception_handlers();
-  } else {
-    code = LookupDartCode();
-    if (code.IsNull()) {
-      return false;  // Stub frames do not have exception handlers.
-    }
-    start = code.PayloadStart();
-    handlers = code.exception_handlers();
-    descriptors = code.pc_descriptors();
-    *is_optimized = code.is_optimized();
+  code = LookupDartCode();
+  if (code.IsNull()) {
+    return false;  // Stub frames do not have exception handlers.
   }
+  start = code.PayloadStart();
+  handlers = code.exception_handlers();
+  descriptors = code.pc_descriptors();
+  *is_optimized = code.is_optimized();
   HandlerInfoCache* cache = thread->isolate()->handler_info_cache();
   ExceptionHandlerInfo* info = cache->Lookup(pc());
   if (info != NULL) {
@@ -488,17 +407,13 @@
   }
 
   intptr_t try_index = -1;
-  if (is_interpreted()) {
-    try_index = bytecode.GetTryIndexAtPc(pc());
-  } else {
-    uword pc_offset = pc() - code.PayloadStart();
-    PcDescriptors::Iterator iter(descriptors, PcDescriptorsLayout::kAnyKind);
-    while (iter.MoveNext()) {
-      const intptr_t current_try_index = iter.TryIndex();
-      if ((iter.PcOffset() == pc_offset) && (current_try_index != -1)) {
-        try_index = current_try_index;
-        break;
-      }
+  uword pc_offset = pc() - code.PayloadStart();
+  PcDescriptors::Iterator iter(descriptors, PcDescriptorsLayout::kAnyKind);
+  while (iter.MoveNext()) {
+    const intptr_t current_try_index = iter.TryIndex();
+    if ((iter.PcOffset() == pc_offset) && (current_try_index != -1)) {
+      try_index = current_try_index;
+      break;
     }
   }
   if (try_index == -1) {
@@ -514,13 +429,6 @@
 }
 
 TokenPosition StackFrame::GetTokenPos() const {
-  if (is_interpreted()) {
-    const Bytecode& bytecode = Bytecode::Handle(LookupDartBytecode());
-    if (bytecode.IsNull()) {
-      return TokenPosition::kNoSource;  // Stub frames do not have token_pos.
-    }
-    return bytecode.GetTokenIndexOfPC(pc());
-  }
   const Code& code = Code::Handle(LookupDartCode());
   if (code.IsNull()) {
     return TokenPosition::kNoSource;  // Stub frames do not have token_pos.
@@ -542,9 +450,6 @@
   if (IsEntryFrame() || IsExitFrame() || IsStubFrame()) {
     return true;
   }
-  if (is_interpreted()) {
-    return (LookupDartBytecode() != Bytecode::null());
-  }
   return (LookupDartCode() != Code::null());
 }
 
@@ -565,25 +470,16 @@
   frames_.fp_ = exit_marker;
   frames_.sp_ = 0;
   frames_.pc_ = 0;
-  if (FLAG_enable_interpreter) {
-    frames_.CheckIfInterpreted(exit_marker);
-  }
   frames_.Unpoison();
 }
 
 void StackFrameIterator::SetupNextExitFrameData() {
   ASSERT(entry_.fp() != 0);
-  uword exit_address =
-      entry_.fp() + ((entry_.is_interpreted() ? kKBCExitLinkSlotFromEntryFp
-                                              : kExitLinkSlotFromEntryFp) *
-                     kWordSize);
+  uword exit_address = entry_.fp() + (kExitLinkSlotFromEntryFp * kWordSize);
   uword exit_marker = *reinterpret_cast<uword*>(exit_address);
   frames_.fp_ = exit_marker;
   frames_.sp_ = 0;
   frames_.pc_ = 0;
-  if (FLAG_enable_interpreter) {
-    frames_.CheckIfInterpreted(exit_marker);
-  }
   frames_.Unpoison();
 }
 
@@ -616,9 +512,6 @@
   frames_.fp_ = last_fp;
   frames_.sp_ = 0;
   frames_.pc_ = 0;
-  if (FLAG_enable_interpreter) {
-    frames_.CheckIfInterpreted(last_fp);
-  }
   frames_.Unpoison();
 }
 
@@ -639,9 +532,6 @@
   frames_.fp_ = fp;
   frames_.sp_ = sp;
   frames_.pc_ = pc;
-  if (FLAG_enable_interpreter) {
-    frames_.CheckIfInterpreted(fp);
-  }
   frames_.Unpoison();
 }
 
@@ -666,10 +556,8 @@
       // Iteration starts from an exit frame given by its fp.
       current_frame_ = NextExitFrame();
     } else if (*(reinterpret_cast<uword*>(
-                   frames_.fp_ +
-                   ((frames_.is_interpreted() ? kKBCSavedCallerFpSlotFromFp
-                                              : kSavedCallerFpSlotFromFp) *
-                    kWordSize))) == 0) {
+                   frames_.fp_ + (kSavedCallerFpSlotFromFp * kWordSize))) ==
+               0) {
       // Iteration starts from an entry frame given by its fp, sp, and pc.
       current_frame_ = NextEntryFrame();
     } else {
@@ -699,17 +587,6 @@
   return current_frame_;
 }
 
-void StackFrameIterator::FrameSetIterator::CheckIfInterpreted(
-    uword exit_marker) {
-#if !defined(DART_PRECOMPILED_RUNTIME)
-  // TODO(regis): We should rely on a new thread vm_tag to identify an
-  // interpreter frame and not need the HasFrame() method.
-  ASSERT(FLAG_enable_interpreter);
-  Interpreter* interpreter = thread_->interpreter();
-  is_interpreted_ = (interpreter != NULL) && interpreter->HasFrame(exit_marker);
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-}
-
 // Tell MemorySanitizer that generated code initializes part of the stack.
 void StackFrameIterator::FrameSetIterator::Unpoison() {
   // When using a simulator, all writes to the stack happened from MSAN
@@ -719,7 +596,7 @@
 #if !defined(USING_SIMULATOR)
   if (fp_ == 0) return;
   // Note that Thread::os_thread_ is cleared when the thread is descheduled.
-  ASSERT(is_interpreted_ || (thread_->os_thread() == nullptr) ||
+  ASSERT((thread_->os_thread() == nullptr) ||
          ((thread_->os_thread()->stack_limit() < fp_) &&
           (thread_->os_thread()->stack_base() > fp_)));
   uword lower;
@@ -742,12 +619,10 @@
   frame->sp_ = sp_;
   frame->fp_ = fp_;
   frame->pc_ = pc_;
-  frame->is_interpreted_ = is_interpreted_;
   sp_ = frame->GetCallerSp();
   fp_ = frame->GetCallerFp();
   pc_ = frame->GetCallerPc();
   Unpoison();
-  ASSERT(is_interpreted_ == frame->is_interpreted_);
   ASSERT(!validate || frame->IsValid());
   return frame;
 }
@@ -756,12 +631,10 @@
   exit_.sp_ = frames_.sp_;
   exit_.fp_ = frames_.fp_;
   exit_.pc_ = frames_.pc_;
-  exit_.is_interpreted_ = frames_.is_interpreted_;
   frames_.sp_ = exit_.GetCallerSp();
   frames_.fp_ = exit_.GetCallerFp();
   frames_.pc_ = exit_.GetCallerPc();
   frames_.Unpoison();
-  ASSERT(frames_.is_interpreted_ == exit_.is_interpreted_);
   ASSERT(!validate_ || exit_.IsValid());
   return &exit_;
 }
@@ -771,7 +644,6 @@
   entry_.sp_ = frames_.sp_;
   entry_.fp_ = frames_.fp_;
   entry_.pc_ = frames_.pc_;
-  entry_.is_interpreted_ = frames_.is_interpreted_;
   SetupNextExitFrameData();  // Setup data for next exit frame in chain.
   ASSERT(!validate_ || entry_.IsValid());
   return &entry_;
diff --git a/runtime/vm/stack_frame.h b/runtime/vm/stack_frame.h
index 048ca63..dff0279 100644
--- a/runtime/vm/stack_frame.h
+++ b/runtime/vm/stack_frame.h
@@ -7,9 +7,7 @@
 
 #include "vm/allocation.h"
 #include "vm/frame_layout.h"
-#include "vm/interpreter.h"
 #include "vm/object.h"
-#include "vm/stack_frame_kbc.h"
 #include "vm/stub_code.h"
 
 #if defined(TARGET_ARCH_IA32)
@@ -44,7 +42,6 @@
 
   // The pool pointer is not implemented on all architectures.
   static int SavedCallerPpSlotFromFp() {
-    // Never called on an interpreter frame.
     if (runtime_frame_layout.saved_caller_pp_from_fp !=
         kSavedCallerFpSlotFromFp) {
       return runtime_frame_layout.saved_caller_pp_from_fp;
@@ -54,37 +51,30 @@
   }
 
   bool IsMarkedForLazyDeopt() const {
-    ASSERT(!is_interpreted());
     uword raw_pc =
         *reinterpret_cast<uword*>(sp() + (kSavedPcSlotFromSp * kWordSize));
     return raw_pc == StubCode::DeoptimizeLazyFromReturn().EntryPoint();
   }
   void MarkForLazyDeopt() {
-    ASSERT(!is_interpreted());
     set_pc(StubCode::DeoptimizeLazyFromReturn().EntryPoint());
   }
   void UnmarkForLazyDeopt() {
     // If this frame was marked for lazy deopt, pc_ was computed to be the
     // original return address using the pending deopts table in GetCallerPc.
     // Write this value back into the frame.
-    ASSERT(!is_interpreted());
     uword original_pc = pc();
     ASSERT(original_pc != StubCode::DeoptimizeLazyFromReturn().EntryPoint());
     set_pc(original_pc);
   }
 
   void set_pc(uword value) {
-    *reinterpret_cast<uword*>(sp() + ((is_interpreted() ? kKBCSavedPcSlotFromSp
-                                                        : kSavedPcSlotFromSp) *
-                                      kWordSize)) = value;
+    *reinterpret_cast<uword*>(sp() + (kSavedPcSlotFromSp * kWordSize)) = value;
     pc_ = value;
   }
 
   void set_pc_marker(CodePtr code) {
     *reinterpret_cast<CodePtr*>(
-        fp() + ((is_interpreted() ? kKBCPcMarkerSlotFromFp
-                                  : runtime_frame_layout.code_from_fp) *
-                kWordSize)) = code;
+        fp() + (runtime_frame_layout.code_from_fp * kWordSize)) = code;
   }
 
   // Visit objects in the frame.
@@ -110,11 +100,8 @@
   virtual bool IsEntryFrame() const { return false; }
   virtual bool IsExitFrame() const { return false; }
 
-  virtual bool is_interpreted() const { return is_interpreted_; }
-
   FunctionPtr LookupDartFunction() const;
   CodePtr LookupDartCode() const;
-  BytecodePtr LookupDartBytecode() const;
   bool FindExceptionHandler(Thread* thread,
                             uword* handler_pc,
                             bool* needs_stacktrace,
@@ -125,15 +112,11 @@
 
   static void DumpCurrentTrace();
 
-  uword GetCallerSp() const {
-    return fp() +
-           ((is_interpreted() ? kKBCCallerSpSlotFromFp : kCallerSpSlotFromFp) *
-            kWordSize);
-  }
+  uword GetCallerSp() const { return fp() + (kCallerSpSlotFromFp * kWordSize); }
 
  protected:
   explicit StackFrame(Thread* thread)
-      : fp_(0), sp_(0), pc_(0), thread_(thread), is_interpreted_(false) {}
+      : fp_(0), sp_(0), pc_(0), thread_(thread) {}
 
   // Name of the frame, used for generic frame printing functionality.
   virtual const char* GetName() const {
@@ -149,20 +132,15 @@
 
  private:
   CodePtr GetCodeObject() const;
-  BytecodePtr GetBytecodeObject() const;
 
   uword GetCallerFp() const {
-    return *(reinterpret_cast<uword*>(
-        fp() + ((is_interpreted() ? kKBCSavedCallerFpSlotFromFp
-                                  : kSavedCallerFpSlotFromFp) *
-                kWordSize)));
+    return *(reinterpret_cast<uword*>(fp() +
+                                      (kSavedCallerFpSlotFromFp * kWordSize)));
   }
 
   uword GetCallerPc() const {
     uword raw_pc = *(reinterpret_cast<uword*>(
-        fp() + ((is_interpreted() ? kKBCSavedCallerPcSlotFromFp
-                                  : kSavedCallerPcSlotFromFp) *
-                kWordSize)));
+        fp() + (kSavedCallerPcSlotFromFp * kWordSize)));
     ASSERT(raw_pc != StubCode::DeoptimizeLazyFromThrow().EntryPoint());
     if (raw_pc == StubCode::DeoptimizeLazyFromReturn().EntryPoint()) {
       return isolate_group()->FindPendingDeoptAtSafepoint(GetCallerFp());
@@ -174,7 +152,6 @@
   uword sp_;
   uword pc_;
   Thread* thread_;
-  bool is_interpreted_;
 
   // The iterators FrameSetIterator and StackFrameIterator set the private
   // fields fp_ and sp_ when they return the respective frame objects.
@@ -210,9 +187,7 @@
 // dart code.
 class EntryFrame : public StackFrame {
  public:
-  bool IsValid() const {
-    return StubCode::InInvocationStub(pc(), is_interpreted());
-  }
+  bool IsValid() const { return StubCode::InInvocationStub(pc()); }
   bool IsDartFrame(bool validate = true) const { return false; }
   bool IsStubFrame() const { return false; }
   bool IsEntryFrame() const { return true; }
@@ -279,11 +254,9 @@
       if (fp_ == 0) {
         return false;
       }
-      const uword pc = *(reinterpret_cast<uword*>(
-          sp_ +
-          ((is_interpreted() ? kKBCSavedPcSlotFromSp : kSavedPcSlotFromSp) *
-           kWordSize)));
-      return !StubCode::InInvocationStub(pc, is_interpreted());
+      const uword pc =
+          *(reinterpret_cast<uword*>(sp_ + (kSavedPcSlotFromSp * kWordSize)));
+      return !StubCode::InInvocationStub(pc);
     }
 
     // Get next non entry/exit frame in the set (assumes a next frame exists).
@@ -291,14 +264,7 @@
 
    private:
     explicit FrameSetIterator(Thread* thread)
-        : fp_(0),
-          sp_(0),
-          pc_(0),
-          stack_frame_(thread),
-          thread_(thread),
-          is_interpreted_(false) {}
-    bool is_interpreted() const { return is_interpreted_; }
-    void CheckIfInterpreted(uword exit_marker);
+        : fp_(0), sp_(0), pc_(0), stack_frame_(thread), thread_(thread) {}
     void Unpoison();
 
     uword fp_;
@@ -306,7 +272,6 @@
     uword pc_;
     StackFrame stack_frame_;  // Singleton frame returned by NextFrame().
     Thread* thread_;
-    bool is_interpreted_;
 
     friend class StackFrameIterator;
     DISALLOW_COPY_AND_ASSIGN(FrameSetIterator);
@@ -327,8 +292,6 @@
   void SetupLastExitFrameData();
   void SetupNextExitFrameData();
 
-  void CheckInterpreterExitFrame(uword exit_marker);
-
   bool validate_;     // Validate each frame as we traverse the frames.
   EntryFrame entry_;  // Singleton entry frame returned by NextEntryFrame().
   ExitFrame exit_;    // Singleton exit frame returned by NextExitFrame().
@@ -453,12 +416,6 @@
   return other_fp < fp;
 }
 
-// Both fp and other_fp are bytecode frame pointers.
-DART_FORCE_INLINE static bool IsBytecodeCalleeFrameOf(uword fp,
-                                                      uword other_fp) {
-  return other_fp > fp;
-}
-
 // Value for stack limit that is used to cause an interrupt.
 static const uword kInterruptStackLimit = ~static_cast<uword>(0);
 
diff --git a/runtime/vm/stack_frame_kbc.h b/runtime/vm/stack_frame_kbc.h
deleted file mode 100644
index 6af9a3a..0000000
--- a/runtime/vm/stack_frame_kbc.h
+++ /dev/null
@@ -1,64 +0,0 @@
-// Copyright (c) 2018, 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.
-
-#ifndef RUNTIME_VM_STACK_FRAME_KBC_H_
-#define RUNTIME_VM_STACK_FRAME_KBC_H_
-
-#include "platform/globals.h"
-
-namespace dart {
-
-/* Kernel Bytecode Frame Layout
-
-IMPORTANT: KBC stack is growing upwards which is different from all other
-architectures. This enables efficient addressing for locals via unsigned index.
-
-               |                    | <- TOS
-Callee frame   | ...                |
-               | saved FP           |    (FP of current frame)
-               | saved PC           |    (PC of current frame)
-               | code object        |
-               | function object    |
-               +--------------------+
-Current frame  | ...               T| <- SP of current frame
-               | ...               T|
-               | first local       T| <- FP of current frame
-               | caller's FP        |
-               | caller's PC        |
-               | code object       T|    (current frame's code object)
-               | function object   T|    (current frame's function object)
-               +--------------------+
-Caller frame   | last parameter     | <- SP of caller frame
-               |  ...               |
-
-               T against a slot indicates it needs to be traversed during GC.
-*/
-
-static const int kKBCDartFrameFixedSize = 4;  // Function, Code, PC, FP
-static const int kKBCSavedPcSlotFromSp = 3;
-
-static const int kKBCFirstObjectSlotFromFp = -4;  // Used by GC.
-static const int kKBCLastFixedObjectSlotFromFp = -3;
-
-static const int kKBCSavedCallerFpSlotFromFp = -1;
-static const int kKBCSavedCallerPcSlotFromFp = -2;
-static const int kKBCCallerSpSlotFromFp = -kKBCDartFrameFixedSize - 1;
-static const int kKBCPcMarkerSlotFromFp = -3;
-static const int kKBCFunctionSlotFromFp = -4;
-static const int kKBCParamEndSlotFromFp = 4;
-
-// Entry and exit frame layout.
-static const int kKBCEntrySavedSlots = 3;
-static const int kKBCExitLinkSlotFromEntryFp = 0;
-static const int kKBCSavedArgDescSlotFromEntryFp = 1;
-static const int kKBCSavedPpSlotFromEntryFp = 2;
-
-// Value for stack limit that is used to cause an interrupt.
-// Note that on KBC stack is growing upwards so interrupt limit is 0 unlike
-// on all other architectures.
-static const uword kKBCInterruptStackLimit = 0;
-
-}  // namespace dart
-
-#endif  // RUNTIME_VM_STACK_FRAME_KBC_H_
diff --git a/runtime/vm/stack_frame_test.cc b/runtime/vm/stack_frame_test.cc
index b20e4b8..8ed14b9 100644
--- a/runtime/vm/stack_frame_test.cc
+++ b/runtime/vm/stack_frame_test.cc
@@ -259,45 +259,7 @@
   // The true stack depends on which strategy we are using for noSuchMethod. The
   // stacktrace as seen by Dart is the same either way because dispatcher
   // methods are marked invisible.
-  if (FLAG_enable_interpreter) {
-    kScriptChars =
-        "class StackFrame {"
-        "  static equals(var obj1, var obj2) native \"StackFrame_equals\";"
-        "  static int frameCount() native \"StackFrame_frameCount\";"
-        "  static int dartFrameCount() native \"StackFrame_dartFrameCount\";"
-        "  static validateFrame(int index,"
-        "                       String name) native "
-        "\"StackFrame_validateFrame\";"
-        "} "
-        "class StackFrame2Test {"
-        "  StackFrame2Test() {}"
-        "  noSuchMethod(Invocation im) {"
-        "    /* We should have 8 general frames and 4 dart frames as follows:"
-        "     * exit frame"
-        "     * dart frame corresponding to StackFrame.frameCount"
-        "     * dart frame corresponding to StackFrame2Test.noSuchMethod"
-        "     * entry frame"
-        "     * exit frame"
-        "     * dart frame for noSuchMethod dispatcher"
-        "     * dart frame corresponding to StackFrame2Test.testMain"
-        "     * entry frame"
-        "     */"
-        "    StackFrame.equals(8, StackFrame.frameCount());"
-        "    StackFrame.equals(4, StackFrame.dartFrameCount());"
-        "    StackFrame.validateFrame(0, \"StackFrame_validateFrame\");"
-        "    StackFrame.validateFrame(1, \"StackFrame2Test_noSuchMethod\");"
-        "    StackFrame.validateFrame(2, \"StackFrame2Test_foo\");"
-        "    StackFrame.validateFrame(3, \"StackFrame2Test_testMain\");"
-        "    return 5;"
-        "  }"
-        "  static testMain() {"
-        "    /* Declare |obj| dynamic so that noSuchMethod can be"
-        "     * called in strong mode. */"
-        "    dynamic obj = new StackFrame2Test();"
-        "    StackFrame.equals(5, obj.foo(101, 202));"
-        "  }"
-        "}";
-  } else if (FLAG_lazy_dispatchers) {
+  if (FLAG_lazy_dispatchers) {
     kScriptChars =
         "class StackFrame {"
         "  static equals(var obj1, var obj2) native \"StackFrame_equals\";"
diff --git a/runtime/vm/stack_trace.cc b/runtime/vm/stack_trace.cc
index 2ea19b7..5b146ff 100644
--- a/runtime/vm/stack_trace.cc
+++ b/runtime/vm/stack_trace.cc
@@ -8,41 +8,12 @@
 #include "vm/stack_frame.h"
 #include "vm/symbols.h"
 
-#if !defined(DART_PRECOMPILED_RUNTIME)
-#include "vm/compiler/frontend/bytecode_reader.h"
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-
 namespace dart {
 
 // Keep in sync with
 // sdk/lib/async/stream_controller.dart:_StreamController._STATE_SUBSCRIBED.
 const intptr_t kStreamController_StateSubscribed = 1;
 
-ClosurePtr FindClosureInFrame(ObjectPtr* last_object_in_caller,
-                              const Function& function,
-                              bool is_interpreted) {
-  NoSafepointScope nsp;
-
-  // The callee has function signature
-  //   :async_op([result, exception, stack])
-  // So we are guaranteed to
-  //   a) have only tagged arguments on the stack until we find the :async_op
-  //      closure, and
-  //   b) find the async closure.
-  auto& closure = Closure::Handle();
-  for (intptr_t i = 0; i < 4; i++) {
-    // KBC builds the stack upwards instead of the usual downwards stack.
-    ObjectPtr arg = last_object_in_caller[(is_interpreted ? -i : i)];
-    if (arg->IsHeapObject() && arg->GetClassId() == kClosureCid) {
-      closure = Closure::RawCast(arg);
-      if (closure.function() == function.raw()) {
-        return closure.raw();
-      }
-    }
-  }
-  UNREACHABLE();
-}
-
 // Find current yield index from async closure.
 // Async closures contains a variable, :await_jump_var that holds the index into
 // async wrapper.
@@ -71,300 +42,245 @@
   UNREACHABLE();  // If we cannot find it we have a bug.
 }
 
-#if !defined(DART_PRECOMPILED_RUNTIME)
-intptr_t FindPcOffset(const Bytecode& bytecode, intptr_t yield_index) {
-  if (yield_index == PcDescriptorsLayout::kInvalidYieldIndex) {
-    return 0;
-  }
-  if (!bytecode.HasSourcePositions()) {
-    return 0;
-  }
-  intptr_t last_yield_point = 0;
-  kernel::BytecodeSourcePositionsIterator iter(Thread::Current()->zone(),
-                                               bytecode);
-  while (iter.MoveNext()) {
-    if (iter.IsYieldPoint()) {
-      last_yield_point++;
-    }
-    if (last_yield_point == yield_index) {
-      return iter.PcOffset();
-    }
-  }
-  UNREACHABLE();  // If we cannot find it we have a bug.
+// Instance caches library and field references.
+// This way we don't have to do the look-ups for every frame in the stack.
+CallerClosureFinder::CallerClosureFinder(Zone* zone)
+    : receiver_context_(Context::Handle(zone)),
+      receiver_function_(Function::Handle(zone)),
+      parent_function_(Function::Handle(zone)),
+      context_entry_(Object::Handle(zone)),
+      future_(Object::Handle(zone)),
+      listener_(Object::Handle(zone)),
+      callback_(Object::Handle(zone)),
+      controller_(Object::Handle(zone)),
+      state_(Object::Handle(zone)),
+      var_data_(Object::Handle(zone)),
+      callback_instance_(Object::Handle(zone)),
+      future_impl_class(Class::Handle(zone)),
+      future_listener_class(Class::Handle(zone)),
+      async_start_stream_controller_class(Class::Handle(zone)),
+      stream_controller_class(Class::Handle(zone)),
+      async_stream_controller_class(Class::Handle(zone)),
+      controller_subscription_class(Class::Handle(zone)),
+      buffering_stream_subscription_class(Class::Handle(zone)),
+      stream_iterator_class(Class::Handle(zone)),
+      future_result_or_listeners_field(Field::Handle(zone)),
+      callback_field(Field::Handle(zone)),
+      controller_controller_field(Field::Handle(zone)),
+      var_data_field(Field::Handle(zone)),
+      state_field(Field::Handle(zone)),
+      on_data_field(Field::Handle(zone)),
+      state_data_field(Field::Handle(zone)) {
+  const auto& async_lib = Library::Handle(zone, Library::AsyncLibrary());
+  // Look up classes:
+  // - async:
+  future_impl_class = async_lib.LookupClassAllowPrivate(Symbols::FutureImpl());
+  ASSERT(!future_impl_class.IsNull());
+  future_listener_class =
+      async_lib.LookupClassAllowPrivate(Symbols::_FutureListener());
+  ASSERT(!future_listener_class.IsNull());
+  // - async*:
+  async_start_stream_controller_class =
+      async_lib.LookupClassAllowPrivate(Symbols::_AsyncStarStreamController());
+  ASSERT(!async_start_stream_controller_class.IsNull());
+  stream_controller_class =
+      async_lib.LookupClassAllowPrivate(Symbols::_StreamController());
+  ASSERT(!stream_controller_class.IsNull());
+  async_stream_controller_class =
+      async_lib.LookupClassAllowPrivate(Symbols::_AsyncStreamController());
+  ASSERT(!async_stream_controller_class.IsNull());
+  controller_subscription_class =
+      async_lib.LookupClassAllowPrivate(Symbols::_ControllerSubscription());
+  ASSERT(!controller_subscription_class.IsNull());
+  buffering_stream_subscription_class = async_lib.LookupClassAllowPrivate(
+      Symbols::_BufferingStreamSubscription());
+  ASSERT(!buffering_stream_subscription_class.IsNull());
+  stream_iterator_class =
+      async_lib.LookupClassAllowPrivate(Symbols::_StreamIterator());
+  ASSERT(!stream_iterator_class.IsNull());
+
+  // Look up fields:
+  // - async:
+  future_result_or_listeners_field =
+      future_impl_class.LookupFieldAllowPrivate(Symbols::_resultOrListeners());
+  ASSERT(!future_result_or_listeners_field.IsNull());
+  callback_field =
+      future_listener_class.LookupFieldAllowPrivate(Symbols::callback());
+  ASSERT(!callback_field.IsNull());
+  // - async*:
+  controller_controller_field =
+      async_start_stream_controller_class.LookupFieldAllowPrivate(
+          Symbols::controller());
+  ASSERT(!controller_controller_field.IsNull());
+  state_field =
+      stream_controller_class.LookupFieldAllowPrivate(Symbols::_state());
+  ASSERT(!state_field.IsNull());
+  var_data_field =
+      stream_controller_class.LookupFieldAllowPrivate(Symbols::_varData());
+  ASSERT(!var_data_field.IsNull());
+  on_data_field = buffering_stream_subscription_class.LookupFieldAllowPrivate(
+      Symbols::_onData());
+  ASSERT(!on_data_field.IsNull());
+  state_data_field =
+      stream_iterator_class.LookupFieldAllowPrivate(Symbols::_stateData());
+  ASSERT(!state_data_field.IsNull());
 }
-#endif
 
-// Helper class for finding the closure of the caller.
-// This is done via the _AsyncAwaitCompleter which holds a
-// FutureResultOrListeners which in turn holds a callback.
-class CallerClosureFinder {
- public:
-  // Instance caches library and field references.
-  // This way we don't have to do the look-ups for every frame in the stack.
-  explicit CallerClosureFinder(Zone* zone)
-      : receiver_context_(Context::Handle(zone)),
-        receiver_function_(Function::Handle(zone)),
-        parent_function_(Function::Handle(zone)),
-        context_entry_(Object::Handle(zone)),
-        is_sync(Object::Handle(zone)),
-        future_(Object::Handle(zone)),
-        listener_(Object::Handle(zone)),
-        callback_(Object::Handle(zone)),
-        controller_(Object::Handle(zone)),
-        state_(Object::Handle(zone)),
-        var_data_(Object::Handle(zone)),
-        callback_instance_(Object::Handle(zone)),
-        future_impl_class(Class::Handle(zone)),
-        async_await_completer_class(Class::Handle(zone)),
-        future_listener_class(Class::Handle(zone)),
-        async_start_stream_controller_class(Class::Handle(zone)),
-        stream_controller_class(Class::Handle(zone)),
-        async_stream_controller_class(Class::Handle(zone)),
-        controller_subscription_class(Class::Handle(zone)),
-        buffering_stream_subscription_class(Class::Handle(zone)),
-        stream_iterator_class(Class::Handle(zone)),
-        completer_is_sync_field(Field::Handle(zone)),
-        completer_future_field(Field::Handle(zone)),
-        future_result_or_listeners_field(Field::Handle(zone)),
-        callback_field(Field::Handle(zone)),
-        controller_controller_field(Field::Handle(zone)),
-        var_data_field(Field::Handle(zone)),
-        state_field(Field::Handle(zone)),
-        on_data_field(Field::Handle(zone)),
-        state_data_field(Field::Handle(zone)) {
-    const auto& async_lib = Library::Handle(zone, Library::AsyncLibrary());
-    // Look up classes:
-    // - async:
-    future_impl_class =
-        async_lib.LookupClassAllowPrivate(Symbols::FutureImpl());
-    ASSERT(!future_impl_class.IsNull());
-    async_await_completer_class =
-        async_lib.LookupClassAllowPrivate(Symbols::_AsyncAwaitCompleter());
-    ASSERT(!async_await_completer_class.IsNull());
-    future_listener_class =
-        async_lib.LookupClassAllowPrivate(Symbols::_FutureListener());
-    ASSERT(!future_listener_class.IsNull());
-    // - async*:
-    async_start_stream_controller_class = async_lib.LookupClassAllowPrivate(
-        Symbols::_AsyncStarStreamController());
-    ASSERT(!async_start_stream_controller_class.IsNull());
-    stream_controller_class =
-        async_lib.LookupClassAllowPrivate(Symbols::_StreamController());
-    ASSERT(!stream_controller_class.IsNull());
-    async_stream_controller_class =
-        async_lib.LookupClassAllowPrivate(Symbols::_AsyncStreamController());
-    ASSERT(!async_stream_controller_class.IsNull());
-    controller_subscription_class =
-        async_lib.LookupClassAllowPrivate(Symbols::_ControllerSubscription());
-    ASSERT(!controller_subscription_class.IsNull());
-    buffering_stream_subscription_class = async_lib.LookupClassAllowPrivate(
-        Symbols::_BufferingStreamSubscription());
-    ASSERT(!buffering_stream_subscription_class.IsNull());
-    stream_iterator_class =
-        async_lib.LookupClassAllowPrivate(Symbols::_StreamIterator());
-    ASSERT(!stream_iterator_class.IsNull());
+ClosurePtr CallerClosureFinder::GetCallerInFutureImpl(const Object& future_) {
+  ASSERT(!future_.IsNull());
+  ASSERT(future_.GetClassId() == future_impl_class.id());
 
-    // Look up fields:
-    // - async:
-    completer_is_sync_field =
-        async_await_completer_class.LookupFieldAllowPrivate(Symbols::isSync());
-    ASSERT(!completer_is_sync_field.IsNull());
-    completer_future_field =
-        async_await_completer_class.LookupFieldAllowPrivate(Symbols::_future());
-    ASSERT(!completer_future_field.IsNull());
-    future_result_or_listeners_field =
-        future_impl_class.LookupFieldAllowPrivate(
-            Symbols::_resultOrListeners());
-    ASSERT(!future_result_or_listeners_field.IsNull());
-    callback_field =
-        future_listener_class.LookupFieldAllowPrivate(Symbols::callback());
-    ASSERT(!callback_field.IsNull());
-    // - async*:
-    controller_controller_field =
-        async_start_stream_controller_class.LookupFieldAllowPrivate(
-            Symbols::controller());
-    ASSERT(!controller_controller_field.IsNull());
-    state_field =
-        stream_controller_class.LookupFieldAllowPrivate(Symbols::_state());
-    ASSERT(!state_field.IsNull());
-    var_data_field =
-        stream_controller_class.LookupFieldAllowPrivate(Symbols::_varData());
-    ASSERT(!var_data_field.IsNull());
-    on_data_field = buffering_stream_subscription_class.LookupFieldAllowPrivate(
-        Symbols::_onData());
-    ASSERT(!on_data_field.IsNull());
-    state_data_field =
-        stream_iterator_class.LookupFieldAllowPrivate(Symbols::_stateData());
-    ASSERT(!state_data_field.IsNull());
-  }
-
-  ClosurePtr GetCallerInFutureImpl(const Object& future_) {
-    ASSERT(!future_.IsNull());
-    ASSERT(future_.GetClassId() == future_impl_class.id());
-
-    listener_ =
-        Instance::Cast(future_).GetField(future_result_or_listeners_field);
-    if (listener_.GetClassId() != future_listener_class.id()) {
-      return Closure::null();
-    }
-
-    callback_ = Instance::Cast(listener_).GetField(callback_field);
-    // This happens for e.g.: await f().catchError(..);
-    if (callback_.IsNull()) {
-      return Closure::null();
-    }
-    ASSERT(callback_.IsClosure());
-
-    return Closure::Cast(callback_).raw();
-  }
-
-  ClosurePtr FindCallerInAsyncClosure(const Context& receiver_context) {
-    context_entry_ = receiver_context.At(Context::kAsyncCompleterIndex);
-    ASSERT(context_entry_.IsInstance());
-    ASSERT(context_entry_.GetClassId() == async_await_completer_class.id());
-
-    const Instance& completer = Instance::Cast(context_entry_);
-    future_ = completer.GetField(completer_future_field);
-    return GetCallerInFutureImpl(future_);
-  }
-
-  ClosurePtr FindCallerInAsyncGenClosure(const Context& receiver_context) {
-    context_entry_ = receiver_context.At(Context::kControllerIndex);
-    ASSERT(context_entry_.IsInstance());
-    ASSERT(context_entry_.GetClassId() ==
-           async_start_stream_controller_class.id());
-
-    const Instance& controller = Instance::Cast(context_entry_);
-    controller_ = controller.GetField(controller_controller_field);
-    ASSERT(!controller_.IsNull());
-    ASSERT(controller_.GetClassId() == async_stream_controller_class.id());
-
-    state_ = Instance::Cast(controller_).GetField(state_field);
-    ASSERT(state_.IsSmi());
-    if (Smi::Cast(state_).Value() != kStreamController_StateSubscribed) {
-      return Closure::null();
-    }
-
-    // _StreamController._varData
-    var_data_ = Instance::Cast(controller_).GetField(var_data_field);
-    ASSERT(var_data_.GetClassId() == controller_subscription_class.id());
-
-    // _ControllerSubscription<T>/_BufferingStreamSubscription.<T>_onData
-    callback_ = Instance::Cast(var_data_).GetField(on_data_field);
-    ASSERT(callback_.IsClosure());
-
-    // If this is not the "_StreamIterator._onData" tear-off, we return the
-    // callback we found.
-    receiver_function_ = Closure::Cast(callback_).function();
-    if (!receiver_function_.IsImplicitInstanceClosureFunction() ||
-        receiver_function_.Owner() != stream_iterator_class.raw()) {
-      return Closure::Cast(callback_).raw();
-    }
-
-    // All implicit closure functions (tear-offs) have the "this" receiver
-    // captured.
-    receiver_context_ = Closure::Cast(callback_).context();
-    ASSERT(receiver_context_.num_variables() == 1);
-    callback_instance_ = receiver_context_.At(0);
-    ASSERT(callback_instance_.IsInstance());
-
-    // If the async* stream is await-for'd:
-    if (callback_instance_.GetClassId() == stream_iterator_class.id()) {
-      // _StreamIterator._stateData
-      future_ = Instance::Cast(callback_instance_).GetField(state_data_field);
-      return GetCallerInFutureImpl(future_);
-    }
-
-    UNREACHABLE();  // If no onData is found we have a bug.
-  }
-
-  ClosurePtr FindCaller(const Closure& receiver_closure) {
-    receiver_function_ = receiver_closure.function();
-    receiver_context_ = receiver_closure.context();
-
-    if (receiver_function_.IsAsyncClosure()) {
-      return FindCallerInAsyncClosure(receiver_context_);
-    } else if (receiver_function_.IsAsyncGenClosure()) {
-      return FindCallerInAsyncGenClosure(receiver_context_);
-    } else if (receiver_function_.IsLocalFunction()) {
-      parent_function_ = receiver_function_.parent_function();
-      if (parent_function_.recognized_kind() ==
-          MethodRecognizer::kFutureTimeout) {
-        context_entry_ =
-            receiver_context_.At(Context::kFutureTimeoutFutureIndex);
-        return GetCallerInFutureImpl(context_entry_);
-      } else if (parent_function_.recognized_kind() ==
-                 MethodRecognizer::kFutureWait) {
-        receiver_context_ = receiver_context_.parent();
-        ASSERT(!receiver_context_.IsNull());
-        context_entry_ = receiver_context_.At(Context::kFutureWaitFutureIndex);
-        return GetCallerInFutureImpl(context_entry_);
-      }
-    }
-
+  listener_ =
+      Instance::Cast(future_).GetField(future_result_or_listeners_field);
+  if (listener_.GetClassId() != future_listener_class.id()) {
     return Closure::null();
   }
 
-  bool IsRunningAsync(const Closure& receiver_closure) {
-    receiver_function_ = receiver_closure.function();
-    receiver_context_ = receiver_closure.context();
+  callback_ = Instance::Cast(listener_).GetField(callback_field);
+  // This happens for e.g.: await f().catchError(..);
+  if (callback_.IsNull()) {
+    return Closure::null();
+  }
+  ASSERT(callback_.IsClosure());
 
-    // The async* functions are never started synchronously, they start running
-    // after the first `listen()` call to its returned `Stream`.
-    if (receiver_function_.IsAsyncGenClosure()) {
-      return true;
-    }
-    ASSERT(receiver_function_.IsAsyncClosure());
+  return Closure::Cast(callback_).raw();
+}
 
-    context_entry_ = receiver_context_.At(Context::kAsyncCompleterIndex);
-    ASSERT(context_entry_.IsInstance());
-    ASSERT(context_entry_.GetClassId() == async_await_completer_class.id());
+ClosurePtr CallerClosureFinder::FindCallerInAsyncClosure(
+    const Context& receiver_context) {
+  future_ = receiver_context.At(Context::kAsyncFutureIndex);
+  return GetCallerInFutureImpl(future_);
+}
 
-    const Instance& completer = Instance::Cast(context_entry_);
-    is_sync = completer.GetField(completer_is_sync_field);
-    ASSERT(!is_sync.IsNull());
-    ASSERT(is_sync.IsBool());
-    // _AsyncAwaitCompleter.isSync indicates whether the future should be
-    // completed async. or sync., based on whether it has yielded yet.
-    // isSync is true when the :async_op is running async.
-    return Bool::Cast(is_sync).value();
+ClosurePtr CallerClosureFinder::FindCallerInAsyncGenClosure(
+    const Context& receiver_context) {
+  context_entry_ = receiver_context.At(Context::kControllerIndex);
+  ASSERT(context_entry_.IsInstance());
+  ASSERT(context_entry_.GetClassId() ==
+         async_start_stream_controller_class.id());
+
+  const Instance& controller = Instance::Cast(context_entry_);
+  controller_ = controller.GetField(controller_controller_field);
+  ASSERT(!controller_.IsNull());
+  ASSERT(controller_.GetClassId() == async_stream_controller_class.id());
+
+  state_ = Instance::Cast(controller_).GetField(state_field);
+  ASSERT(state_.IsSmi());
+  if (Smi::Cast(state_).Value() != kStreamController_StateSubscribed) {
+    return Closure::null();
   }
 
- private:
-  Context& receiver_context_;
-  Function& receiver_function_;
-  Function& parent_function_;
+  // _StreamController._varData
+  var_data_ = Instance::Cast(controller_).GetField(var_data_field);
+  ASSERT(var_data_.GetClassId() == controller_subscription_class.id());
 
-  Object& context_entry_;
-  Object& is_sync;
-  Object& future_;
-  Object& listener_;
-  Object& callback_;
-  Object& controller_;
-  Object& state_;
-  Object& var_data_;
-  Object& callback_instance_;
+  // _ControllerSubscription<T>/_BufferingStreamSubscription.<T>_onData
+  callback_ = Instance::Cast(var_data_).GetField(on_data_field);
+  ASSERT(callback_.IsClosure());
 
-  Class& future_impl_class;
-  Class& async_await_completer_class;
-  Class& future_listener_class;
-  Class& async_start_stream_controller_class;
-  Class& stream_controller_class;
-  Class& async_stream_controller_class;
-  Class& controller_subscription_class;
-  Class& buffering_stream_subscription_class;
-  Class& stream_iterator_class;
+  // If this is not the "_StreamIterator._onData" tear-off, we return the
+  // callback we found.
+  receiver_function_ = Closure::Cast(callback_).function();
+  if (!receiver_function_.IsImplicitInstanceClosureFunction() ||
+      receiver_function_.Owner() != stream_iterator_class.raw()) {
+    return Closure::Cast(callback_).raw();
+  }
 
-  Field& completer_is_sync_field;
-  Field& completer_future_field;
-  Field& future_result_or_listeners_field;
-  Field& callback_field;
-  Field& controller_controller_field;
-  Field& var_data_field;
-  Field& state_field;
-  Field& on_data_field;
-  Field& state_data_field;
-};
+  // All implicit closure functions (tear-offs) have the "this" receiver
+  // captured.
+  receiver_context_ = Closure::Cast(callback_).context();
+  ASSERT(receiver_context_.num_variables() == 1);
+  callback_instance_ = receiver_context_.At(0);
+  ASSERT(callback_instance_.IsInstance());
+
+  // If the async* stream is await-for'd:
+  if (callback_instance_.GetClassId() == stream_iterator_class.id()) {
+    // _StreamIterator._stateData
+    future_ = Instance::Cast(callback_instance_).GetField(state_data_field);
+    return GetCallerInFutureImpl(future_);
+  }
+
+  UNREACHABLE();  // If no onData is found we have a bug.
+}
+
+ClosurePtr CallerClosureFinder::FindCaller(const Closure& receiver_closure) {
+  receiver_function_ = receiver_closure.function();
+  receiver_context_ = receiver_closure.context();
+
+  if (receiver_function_.IsAsyncClosure()) {
+    return FindCallerInAsyncClosure(receiver_context_);
+  } else if (receiver_function_.IsAsyncGenClosure()) {
+    return FindCallerInAsyncGenClosure(receiver_context_);
+  } else if (receiver_function_.IsLocalFunction()) {
+    parent_function_ = receiver_function_.parent_function();
+    if (parent_function_.recognized_kind() ==
+        MethodRecognizer::kFutureTimeout) {
+      context_entry_ = receiver_context_.At(Context::kFutureTimeoutFutureIndex);
+      return GetCallerInFutureImpl(context_entry_);
+    } else if (parent_function_.recognized_kind() ==
+               MethodRecognizer::kFutureWait) {
+      receiver_context_ = receiver_context_.parent();
+      ASSERT(!receiver_context_.IsNull());
+      context_entry_ = receiver_context_.At(Context::kFutureWaitFutureIndex);
+      return GetCallerInFutureImpl(context_entry_);
+    }
+  }
+
+  return Closure::null();
+}
+
+bool CallerClosureFinder::IsRunningAsync(const Closure& receiver_closure) {
+  auto zone = Thread::Current()->zone();
+
+  // The async* functions are never started synchronously, they start running
+  // after the first `listen()` call to its returned `Stream`.
+  const Function& receiver_function_ =
+      Function::Handle(zone, receiver_closure.function());
+  if (receiver_function_.IsAsyncGenClosure()) {
+    return true;
+  }
+  ASSERT(receiver_function_.IsAsyncClosure());
+
+  const Context& receiver_context_ =
+      Context::Handle(zone, receiver_closure.context());
+  const Object& is_sync =
+      Object::Handle(zone, receiver_context_.At(Context::kIsSyncIndex));
+  ASSERT(!is_sync.IsNull());
+  ASSERT(is_sync.IsBool());
+  // isSync indicates whether the future should be completed async. or sync.,
+  // based on whether it has yielded yet.
+  // isSync is true when the :async_op has yielded at least once.
+  // I.e. isSync will be false even after :async_op has run, if e.g. it threw
+  // an exception before yielding.
+  return Bool::Cast(is_sync).value();
+}
+
+ClosurePtr StackTraceUtils::FindClosureInFrame(ObjectPtr* last_object_in_caller,
+                                               const Function& function) {
+  NoSafepointScope nsp;
+
+  ASSERT(!function.IsNull());
+  ASSERT(function.IsAsyncClosure() || function.IsAsyncGenClosure());
+
+  // The callee has function signature
+  //   :async_op([result, exception, stack])
+  // So we are guaranteed to
+  //   a) have only tagged arguments on the stack until we find the :async_op
+  //      closure, and
+  //   b) find the async closure.
+  const intptr_t kNumClosureAndArgs = 4;
+  auto& closure = Closure::Handle();
+  for (intptr_t i = 0; i < kNumClosureAndArgs; i++) {
+    ObjectPtr arg = last_object_in_caller[i];
+    if (arg->IsHeapObject() && arg->GetClassId() == kClosureCid) {
+      closure = Closure::RawCast(arg);
+      if (closure.function() == function.raw()) {
+        return closure.raw();
+      }
+    }
+  }
+  UNREACHABLE();
+}
 
 void StackTraceUtils::CollectFramesLazy(
     Thread* thread,
@@ -388,7 +304,6 @@
 
   auto& function = Function::Handle(zone);
   auto& code = Code::Handle(zone);
-  auto& bytecode = Bytecode::Handle(zone);
   auto& offset = Smi::Handle(zone);
 
   auto& closure = Closure::Handle(zone);
@@ -402,32 +317,15 @@
       continue;
     }
 
-    if (frame->is_interpreted()) {
-      bytecode = frame->LookupDartBytecode();
-      ASSERT(!bytecode.IsNull());
-      function = bytecode.function();
-      if (function.IsNull()) {
-        continue;
-      }
-      RELEASE_ASSERT(function.raw() == frame->LookupDartFunction());
-    } else {
-      function = frame->LookupDartFunction();
-    }
+    function = frame->LookupDartFunction();
 
     // Add the current synchronous frame.
-    if (frame->is_interpreted()) {
-      code_array.Add(bytecode);
-      const intptr_t pc_offset = frame->pc() - bytecode.PayloadStart();
-      ASSERT(pc_offset > 0 && pc_offset <= bytecode.Size());
-      offset = Smi::New(pc_offset);
-    } else {
-      code = frame->LookupDartCode();
-      ASSERT(function.raw() == code.function());
-      code_array.Add(code);
-      const intptr_t pc_offset = frame->pc() - code.PayloadStart();
-      ASSERT(pc_offset > 0 && pc_offset <= code.Size());
-      offset = Smi::New(pc_offset);
-    }
+    code = frame->LookupDartCode();
+    ASSERT(function.raw() == code.function());
+    code_array.Add(code);
+    const intptr_t pc_offset = frame->pc() - code.PayloadStart();
+    ASSERT(pc_offset > 0 && pc_offset <= code.Size());
+    offset = Smi::New(pc_offset);
     pc_offset_array.Add(offset);
     if (on_sync_frames != nullptr) {
       (*on_sync_frames)(frame);
@@ -441,17 +339,20 @@
         *has_async = true;
       }
 
-      // Next, look up caller's closure on the stack and walk backwards through
-      // the yields.
-      ObjectPtr* last_caller_obj =
-          reinterpret_cast<ObjectPtr*>(frame->GetCallerSp());
-      closure = FindClosureInFrame(last_caller_obj, function,
-                                   frame->is_interpreted());
+      {
+        NoSafepointScope nsp;
 
-      // If this async function hasn't yielded yet, we're still dealing with a
-      // normal stack. Continue to next frame as usual.
-      if (!caller_closure_finder.IsRunningAsync(closure)) {
-        continue;
+        // Next, look up caller's closure on the stack and walk backwards
+        // through the yields.
+        ObjectPtr* last_caller_obj =
+            reinterpret_cast<ObjectPtr*>(frame->GetCallerSp());
+        closure = FindClosureInFrame(last_caller_obj, function);
+
+        // If this async function hasn't yielded yet, we're still dealing with a
+        // normal stack. Continue to next frame as usual.
+        if (!caller_closure_finder.IsRunningAsync(closure)) {
+          continue;
+        }
       }
 
       // Inject async suspension marker.
@@ -467,18 +368,10 @@
            closure = caller_closure_finder.FindCaller(closure)) {
         function = closure.function();
         // In hot-reload-test-mode we sometimes have to do this:
-        if (!function.HasCode() && !function.HasBytecode()) {
+        if (!function.HasCode()) {
           function.EnsureHasCode();
         }
-        if (function.HasBytecode()) {
-#if !defined(DART_PRECOMPILED_RUNTIME)
-          bytecode = function.bytecode();
-          code_array.Add(bytecode);
-          offset = Smi::New(FindPcOffset(bytecode, GetYieldIndex(closure)));
-#else
-          UNREACHABLE();
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-        } else if (function.HasCode()) {
+        if (function.HasCode()) {
           code = function.CurrentCode();
           code_array.Add(code);
           pc_descs = code.pc_descriptors();
@@ -505,59 +398,55 @@
   return;
 }
 
-// Count the number of frames that are on the stack.
 intptr_t StackTraceUtils::CountFrames(Thread* thread,
                                       int skip_frames,
                                       const Function& async_function,
                                       bool* sync_async_end) {
   Zone* zone = thread->zone();
   intptr_t frame_count = 0;
-  StackFrameIterator frames(ValidationPolicy::kDontValidateFrames, thread,
-                            StackFrameIterator::kNoCrossThreadIteration);
+  DartFrameIterator frames(thread, StackFrameIterator::kNoCrossThreadIteration);
   StackFrame* frame = frames.NextFrame();
-  ASSERT(frame != NULL);  // We expect to find a dart invocation frame.
+  ASSERT(frame != nullptr);  // We expect to find a dart invocation frame.
   Function& function = Function::Handle(zone);
   Code& code = Code::Handle(zone);
-  Bytecode& bytecode = Bytecode::Handle(zone);
-  String& function_name = String::Handle(zone);
+  Closure& closure = Closure::Handle(zone);
   const bool async_function_is_null = async_function.IsNull();
-  int sync_async_gap_frames = -1;
-  ASSERT(async_function_is_null || sync_async_end != NULL);
-  for (; frame != NULL && sync_async_gap_frames != 0;
-       frame = frames.NextFrame()) {
-    if (!frame->IsDartFrame()) {
-      continue;
-    }
+
+  ASSERT(async_function_is_null || sync_async_end != nullptr);
+
+  for (; frame != nullptr; frame = frames.NextFrame()) {
     if (skip_frames > 0) {
       skip_frames--;
       continue;
     }
-    if (frame->is_interpreted()) {
-      bytecode = frame->LookupDartBytecode();
-      function = bytecode.function();
-      if (function.IsNull()) continue;
-    } else {
-      code = frame->LookupDartCode();
-      function = code.function();
-    }
+    code = frame->LookupDartCode();
+    function = code.function();
+
+    frame_count++;
+
     const bool function_is_null = function.IsNull();
-    if (!function_is_null && sync_async_gap_frames > 0) {
-      function_name = function.QualifiedScrubbedName();
-      if (!CheckAndSkipAsync(&sync_async_gap_frames, function_name)) {
-        *sync_async_end = false;
-        return frame_count;
-      }
-    } else {
-      frame_count++;
-    }
+
     if (!async_function_is_null && !function_is_null &&
-        (async_function.raw() == function.parent_function())) {
-      sync_async_gap_frames = kSyncAsyncFrameGap;
+        function.parent_function() != Function::null()) {
+      if (async_function.raw() == function.parent_function()) {
+        if (function.IsAsyncClosure() || function.IsAsyncGenClosure()) {
+          ObjectPtr* last_caller_obj =
+              reinterpret_cast<ObjectPtr*>(frame->GetCallerSp());
+          closure = FindClosureInFrame(last_caller_obj, function);
+          if (CallerClosureFinder::IsRunningAsync(closure)) {
+            *sync_async_end = false;
+            return frame_count;
+          }
+        }
+        break;
+      }
     }
   }
+
   if (!async_function_is_null) {
-    *sync_async_end = sync_async_gap_frames == 0;
+    *sync_async_end = true;
   }
+
   return frame_count;
 }
 
@@ -568,37 +457,21 @@
                                         intptr_t count,
                                         int skip_frames) {
   Zone* zone = thread->zone();
-  StackFrameIterator frames(ValidationPolicy::kDontValidateFrames, thread,
-                            StackFrameIterator::kNoCrossThreadIteration);
+  DartFrameIterator frames(thread, StackFrameIterator::kNoCrossThreadIteration);
   StackFrame* frame = frames.NextFrame();
   ASSERT(frame != NULL);  // We expect to find a dart invocation frame.
-  Function& function = Function::Handle(zone);
   Code& code = Code::Handle(zone);
-  Bytecode& bytecode = Bytecode::Handle(zone);
   Smi& offset = Smi::Handle(zone);
   intptr_t collected_frames_count = 0;
   for (; (frame != NULL) && (collected_frames_count < count);
        frame = frames.NextFrame()) {
-    if (!frame->IsDartFrame()) {
-      continue;
-    }
     if (skip_frames > 0) {
       skip_frames--;
       continue;
     }
-    if (frame->is_interpreted()) {
-      bytecode = frame->LookupDartBytecode();
-      function = bytecode.function();
-      if (function.IsNull()) {
-        continue;
-      }
-      offset = Smi::New(frame->pc() - bytecode.PayloadStart());
-      code_array.SetAt(array_offset, bytecode);
-    } else {
-      code = frame->LookupDartCode();
-      offset = Smi::New(frame->pc() - code.PayloadStart());
-      code_array.SetAt(array_offset, code);
-    }
+    code = frame->LookupDartCode();
+    offset = Smi::New(frame->pc() - code.PayloadStart());
+    code_array.SetAt(array_offset, code);
     pc_offset_array.SetAt(array_offset, offset);
     array_offset++;
     collected_frames_count++;
@@ -621,7 +494,7 @@
       StackTrace::Handle(thread->async_stack_trace());
   const intptr_t async_stack_trace_length = async_stack_trace.Length();
   // At least two entries (0: gap marker, 1: async function).
-  ASSERT(async_stack_trace_length >= 2);
+  RELEASE_ASSERT(async_stack_trace_length >= 2);
   // Validate the structure of this stack trace.
   *async_code_array = async_stack_trace.code_array();
   ASSERT(!async_code_array->IsNull());
@@ -631,12 +504,8 @@
   ASSERT(async_code_array->At(0) != Code::null());
   ASSERT(async_code_array->At(0) == StubCode::AsynchronousGapMarker().raw());
   const Object& code_object = Object::Handle(async_code_array->At(1));
-  if (code_object.IsCode()) {
-    *async_function = Code::Cast(code_object).function();
-  } else {
-    ASSERT(code_object.IsBytecode());
-    *async_function = Bytecode::Cast(code_object).function();
-  }
+  ASSERT(code_object.IsCode());
+  *async_function = Code::Cast(code_object).function();
   ASSERT(!async_function->IsNull());
   ASSERT(async_function->IsAsyncFunction() ||
          async_function->IsAsyncGenerator());
diff --git a/runtime/vm/stack_trace.h b/runtime/vm/stack_trace.h
index 56743e3..660746a 100644
--- a/runtime/vm/stack_trace.h
+++ b/runtime/vm/stack_trace.h
@@ -14,8 +14,59 @@
 
 namespace dart {
 
+// Helper class for finding the closure of the caller.
+class CallerClosureFinder {
+ public:
+  explicit CallerClosureFinder(Zone* zone);
+
+  ClosurePtr GetCallerInFutureImpl(const Object& future_);
+
+  ClosurePtr FindCallerInAsyncClosure(const Context& receiver_context);
+
+  ClosurePtr FindCallerInAsyncGenClosure(const Context& receiver_context);
+
+  ClosurePtr FindCaller(const Closure& receiver_closure);
+
+  static bool IsRunningAsync(const Closure& receiver_closure);
+
+ private:
+  Context& receiver_context_;
+  Function& receiver_function_;
+  Function& parent_function_;
+
+  Object& context_entry_;
+  Object& future_;
+  Object& listener_;
+  Object& callback_;
+  Object& controller_;
+  Object& state_;
+  Object& var_data_;
+  Object& callback_instance_;
+
+  Class& future_impl_class;
+  Class& future_listener_class;
+  Class& async_start_stream_controller_class;
+  Class& stream_controller_class;
+  Class& async_stream_controller_class;
+  Class& controller_subscription_class;
+  Class& buffering_stream_subscription_class;
+  Class& stream_iterator_class;
+
+  Field& future_result_or_listeners_field;
+  Field& callback_field;
+  Field& controller_controller_field;
+  Field& var_data_field;
+  Field& state_field;
+  Field& on_data_field;
+  Field& state_data_field;
+};
+
 class StackTraceUtils : public AllStatic {
  public:
+  // Find the async_op closure from the stack frame.
+  static ClosurePtr FindClosureInFrame(ObjectPtr* last_object_in_caller,
+                                       const Function& function);
+
   /// Collects all frames on the current stack until an async/async* frame is
   /// hit which has yielded before (i.e. is not in sync-async case).
   ///
@@ -71,41 +122,6 @@
                                              StackTrace* async_stack_trace,
                                              Array* async_code_array,
                                              Array* async_pc_offset_array);
-
-  // The number of frames involved in a "sync-async" gap: a synchronous initial
-  // invocation of an asynchronous function. See CheckAndSkipAsync.
-  static constexpr intptr_t kSyncAsyncFrameGap = 2;
-
-  // A synchronous invocation of an async function involves the following
-  // frames:
-  //   <async function>__<anonymous_closure>    (0)
-  //   _Closure.call                            (1)
-  //   _AsyncAwaitCompleter.start               (2)
-  //   <async_function>                         (3)
-  //
-  // Alternatively, for bytecode or optimized frames, we may see:
-  //   <async function>__<anonymous_closure>    (0)
-  //   _AsyncAwaitCompleter.start               (1)
-  //   <async_function>                         (2)
-  static bool CheckAndSkipAsync(int* skip_sync_async_frames_count,
-                                const String& function_name) {
-    ASSERT(*skip_sync_async_frames_count > 0);
-    // Make sure any function objects for methods used here are marked for
-    // retention by the precompiler, even if otherwise not needed at runtime.
-    //
-    // _AsyncAwaitCompleter.start is marked with the vm:entry-point pragma.
-    if (function_name.Equals(Symbols::_AsyncAwaitCompleterStart())) {
-      *skip_sync_async_frames_count = 0;
-      return true;
-    }
-    // _Closure.call is explicitly checked in Precompiler::MustRetainFunction.
-    if (function_name.Equals(Symbols::_ClosureCall()) &&
-        *skip_sync_async_frames_count == 2) {
-      (*skip_sync_async_frames_count)--;
-      return true;
-    }
-    return false;
-  }
 };
 
 }  // namespace dart
diff --git a/runtime/vm/stub_code.cc b/runtime/vm/stub_code.cc
index 92d8c6c..7f8f3a3 100644
--- a/runtime/vm/stub_code.cc
+++ b/runtime/vm/stub_code.cc
@@ -10,7 +10,6 @@
 #include "vm/compiler/assembler/disassembler.h"
 #include "vm/flags.h"
 #include "vm/heap/safepoint.h"
-#include "vm/interpreter.h"
 #include "vm/object_store.h"
 #include "vm/snapshot.h"
 #include "vm/virtual_memory.h"
@@ -26,8 +25,6 @@
 DEFINE_FLAG(bool, disassemble_stubs, false, "Disassemble generated stubs.");
 DECLARE_FLAG(bool, precompiled_mode);
 
-DECLARE_FLAG(bool, enable_interpreter);
-
 StubCode::StubCodeEntry StubCode::entries_[kNumStubEntries] = {
 #if defined(DART_PRECOMPILED_RUNTIME)
 #define STUB_CODE_DECLARE(name) {nullptr, #name},
@@ -97,24 +94,8 @@
   return entries_[kAsynchronousGapMarkerIndex].code != nullptr;
 }
 
-bool StubCode::InInvocationStub(uword pc, bool is_interpreted_frame) {
+bool StubCode::InInvocationStub(uword pc) {
   ASSERT(HasBeenInitialized());
-#if !defined(DART_PRECOMPILED_RUNTIME)
-  if (FLAG_enable_interpreter) {
-    if (is_interpreted_frame) {
-      // Recognize special marker set up by interpreter in entry frame.
-      return Interpreter::IsEntryFrameMarker(
-          reinterpret_cast<const KBCInstr*>(pc));
-    }
-    {
-      uword entry = StubCode::InvokeDartCodeFromBytecode().EntryPoint();
-      uword size = StubCode::InvokeDartCodeFromBytecodeSize();
-      if ((pc >= entry) && (pc < (entry + size))) {
-        return true;
-      }
-    }
-  }
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
   uword entry = StubCode::InvokeDartCode().EntryPoint();
   uword size = StubCode::InvokeDartCodeSize();
   return (pc >= entry) && (pc < (entry + size));
diff --git a/runtime/vm/stub_code.h b/runtime/vm/stub_code.h
index 016b845..a946cd5 100644
--- a/runtime/vm/stub_code.h
+++ b/runtime/vm/stub_code.h
@@ -46,7 +46,7 @@
 
   // Check if specified pc is in the dart invocation stub used for
   // transitioning into dart code.
-  static bool InInvocationStub(uword pc, bool is_interpreted_frame);
+  static bool InInvocationStub(uword pc);
 
   // Check if the specified pc is in the jump to frame stub.
   static bool InJumpToFrameStub(uword pc);
diff --git a/runtime/vm/stub_code_list.h b/runtime/vm/stub_code_list.h
index 395676c..d127701 100644
--- a/runtime/vm/stub_code_list.h
+++ b/runtime/vm/stub_code_list.h
@@ -42,7 +42,6 @@
   V(CloneContext)                                                              \
   V(CallToRuntime)                                                             \
   V(LazyCompile)                                                               \
-  V(InterpretCall)                                                             \
   V(CallBootstrapNative)                                                       \
   V(CallNoScopeNative)                                                         \
   V(CallAutoScopeNative)                                                       \
@@ -50,7 +49,6 @@
   V(CallStaticFunction)                                                        \
   V(OptimizeFunction)                                                          \
   V(InvokeDartCode)                                                            \
-  V(InvokeDartCodeFromBytecode)                                                \
   V(DebugStepCheck)                                                            \
   V(SwitchableCallMiss)                                                        \
   V(MonomorphicSmiableCheck)                                                   \
@@ -76,6 +74,7 @@
   V(ZeroArgsUnoptimizedStaticCall)                                             \
   V(OneArgUnoptimizedStaticCall)                                               \
   V(TwoArgsUnoptimizedStaticCall)                                              \
+  V(AssertSubtype)                                                             \
   V(Subtype1TestCache)                                                         \
   V(Subtype2TestCache)                                                         \
   V(Subtype4TestCache)                                                         \
@@ -94,6 +93,8 @@
   V(AsynchronousGapMarker)                                                     \
   V(NotLoaded)                                                                 \
   V(DispatchTableNullError)                                                    \
+  V(LateInitializationErrorSharedWithFPURegs)                                  \
+  V(LateInitializationErrorSharedWithoutFPURegs)                               \
   V(NullErrorSharedWithFPURegs)                                                \
   V(NullErrorSharedWithoutFPURegs)                                             \
   V(NullArgErrorSharedWithFPURegs)                                             \
diff --git a/runtime/vm/stub_code_test.cc b/runtime/vm/stub_code_test.cc
new file mode 100644
index 0000000..4b8649b
--- /dev/null
+++ b/runtime/vm/stub_code_test.cc
@@ -0,0 +1,35 @@
+// Copyright (c) 2020, 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.
+
+#include "vm/globals.h"
+#include "vm/object.h"
+#include "vm/symbols.h"
+
+namespace dart {
+
+// Add function to a class and that class to the class dictionary so that
+// frame walking can be used.
+const Function& RegisterFakeFunction(const char* name, const Code& code) {
+  Thread* thread = Thread::Current();
+  const String& class_name = String::Handle(Symbols::New(thread, "ownerClass"));
+  const Script& script = Script::Handle();
+  const Library& lib = Library::Handle(Library::CoreLibrary());
+  const Class& owner_class = Class::Handle(
+      Class::New(lib, class_name, script, TokenPosition::kNoSource));
+  const String& function_name = String::ZoneHandle(Symbols::New(thread, name));
+  const Function& function = Function::ZoneHandle(Function::New(
+      function_name, FunctionLayout::kRegularFunction, true, false, false,
+      false, false, owner_class, TokenPosition::kMinSource));
+  const Array& functions = Array::Handle(Array::New(1));
+  functions.SetAt(0, function);
+  {
+    SafepointWriteRwLocker ml(thread, thread->isolate_group()->program_lock());
+    owner_class.SetFunctions(functions);
+  }
+  lib.AddClass(owner_class);
+  function.AttachCode(code);
+  return function;
+}
+
+}  // namespace dart
diff --git a/runtime/vm/symbols.h b/runtime/vm/symbols.h
index 84b028b..7737d2a 100644
--- a/runtime/vm/symbols.h
+++ b/runtime/vm/symbols.h
@@ -28,7 +28,7 @@
   V(AsFunctionInternal, "_asFunctionInternal")                                 \
   V(AssertionError, "_AssertionError")                                         \
   V(AssignIndexToken, "[]=")                                                   \
-  V(AsyncCompleter, ":async_completer")                                        \
+  V(AsyncFuture, ":async_future")                                              \
   V(AsyncOperation, ":async_op")                                               \
   V(AsyncStackTraceVar, ":async_stack_trace")                                  \
   V(AsyncStarMoveNextHelper, "_asyncStarMoveNextHelper")                       \
@@ -40,7 +40,6 @@
   V(ByteData, "ByteData")                                                      \
   V(ByteDataDot, "ByteData.")                                                  \
   V(ByteDataDot_view, "ByteData._view")                                        \
-  V(Bytecode, "Bytecode")                                                      \
   V(Call, "call")                                                              \
   V(Cancel, "cancel")                                                          \
   V(CastError, "_CastError")                                                   \
@@ -109,7 +108,9 @@
   V(Dynamic, "dynamic")                                                        \
   V(DynamicCall, "dyn:call")                                                   \
   V(DynamicCallCurrentNumProcessedVar, ":dyn_call_current_num_processed")      \
+  V(DynamicCallCurrentFunctionVar, ":dyn_call_current_function")               \
   V(DynamicCallCurrentParamIndexVar, ":dyn_call_current_param_index")          \
+  V(DynamicCallFunctionTypeArgsVar, ":dyn_call_function_type_args")            \
   V(DynamicPrefix, "dyn:")                                                     \
   V(EntryPointsTemp, ":entry_points_temp")                                     \
   V(EqualOperator, "==")                                                       \
@@ -235,7 +236,6 @@
   V(Other, "other")                                                            \
   V(OutOfMemoryError, "OutOfMemoryError")                                      \
   V(PackageScheme, "package:")                                                 \
-  V(ParameterTypeCheck, "ParameterTypeCheck")                                  \
   V(Patch, "patch")                                                            \
   V(PatchClass, "PatchClass")                                                  \
   V(PcDescriptors, "PcDescriptors")                                            \
@@ -308,11 +308,7 @@
   V(WasmDouble, "Double")                                                      \
   V(WasmVoid, "Void")                                                          \
   V(YieldKw, "yield")                                                          \
-  V(_AsyncAwaitCompleter, "_AsyncAwaitCompleter")                              \
-  V(_AsyncAwaitCompleterConstructor, "_AsyncAwaitCompleter.")                  \
-  V(_AsyncAwaitCompleterStart, "_AsyncAwaitCompleter.start")                   \
   V(_AsyncAwaitStart, "start")                                                 \
-  V(_AsyncStarListenHelper, "_asyncStarListenHelper")                          \
   V(_AsyncStarStreamController, "_AsyncStarStreamController")                  \
   V(_AsyncStarStreamControllerConstructor, "_AsyncStarStreamController.")      \
   V(_AsyncStreamController, "_AsyncStreamController")                          \
@@ -329,6 +325,7 @@
   V(_CompileTimeError, "_CompileTimeError")                                    \
   V(_CompleteOnAsyncReturn, "_completeOnAsyncReturn")                          \
   V(_ControllerSubscription, "_ControllerSubscription")                        \
+  V(_CompleteOnAsyncError, "_completeOnAsyncError")                            \
   V(_DeletedEnumPrefix, "Deleted enum value from ")                            \
   V(_DeletedEnumSentinel, "_deleted_enum_sentinel")                            \
   V(_Double, "_Double")                                                        \
@@ -448,6 +445,7 @@
   V(_handleMessage, "_handleMessage")                                          \
   V(_instanceOf, "_instanceOf")                                                \
   V(_lookupHandler, "_lookupHandler")                                          \
+  V(_lookupOpenPorts, "_lookupOpenPorts")                                      \
   V(_name, "_name")                                                            \
   V(_onData, "_onData")                                                        \
   V(_rehashObjects, "_rehashObjects")                                          \
@@ -478,6 +476,7 @@
   V(hashCode, "get:hashCode")                                                  \
   V(identityHashCode, "identityHashCode")                                      \
   V(index_temp, ":index_temp")                                                 \
+  V(is_sync, ":is_sync")                                                       \
   V(isPaused, "isPaused")                                                      \
   V(isSync, "isSync")                                                          \
   V(last, "last")                                                              \
diff --git a/runtime/vm/tagged_pointer.h b/runtime/vm/tagged_pointer.h
index 6a8ce03..703dfabd 100644
--- a/runtime/vm/tagged_pointer.h
+++ b/runtime/vm/tagged_pointer.h
@@ -243,7 +243,6 @@
 DEFINE_TAGGED_POINTER(KernelProgramInfo, Object)
 DEFINE_TAGGED_POINTER(WeakSerializationReference, Object)
 DEFINE_TAGGED_POINTER(Code, Object)
-DEFINE_TAGGED_POINTER(Bytecode, Object)
 DEFINE_TAGGED_POINTER(ObjectPool, Object)
 DEFINE_TAGGED_POINTER(Instructions, Object)
 DEFINE_TAGGED_POINTER(InstructionsSection, Object)
@@ -254,7 +253,6 @@
 DEFINE_TAGGED_POINTER(ExceptionHandlers, Object)
 DEFINE_TAGGED_POINTER(Context, Object)
 DEFINE_TAGGED_POINTER(ContextScope, Object)
-DEFINE_TAGGED_POINTER(ParameterTypeCheck, Object)
 DEFINE_TAGGED_POINTER(SingleTargetCache, Object)
 DEFINE_TAGGED_POINTER(UnlinkedCall, Object)
 DEFINE_TAGGED_POINTER(MonomorphicSmiableCall, Object)
diff --git a/runtime/vm/tags.cc b/runtime/vm/tags.cc
index ecc7d18..8c48f22 100644
--- a/runtime/vm/tags.cc
+++ b/runtime/vm/tags.cc
@@ -36,7 +36,7 @@
 }
 
 bool VMTag::IsDartTag(uword id) {
-  return (id == kDartCompiledTagId) || (id == kDartInterpretedTagId);
+  return (id == kDartTagId);
 }
 
 bool VMTag::IsExitFrameTag(uword id) {
diff --git a/runtime/vm/tags.h b/runtime/vm/tags.h
index 4f3b665..e8d5919 100644
--- a/runtime/vm/tags.h
+++ b/runtime/vm/tags.h
@@ -18,13 +18,11 @@
   V(Idle)     /* isolate is idle and is_runnable() */                          \
   V(LoadWait) /* isolate is idle and !is_runnable() */                         \
   V(VM)       /* Catch all */                                                  \
-  V(LoadBytecode)                                                              \
   V(CompileOptimized)                                                          \
   V(CompileUnoptimized)                                                        \
   V(ClassLoading)                                                              \
   V(CompileParseRegExp)                                                        \
-  V(DartCompiled)                                                              \
-  V(DartInterpreted)                                                           \
+  V(Dart)                                                                      \
   V(GCNewSpace)                                                                \
   V(GCOldSpace)                                                                \
   V(GCIdle)                                                                    \
diff --git a/runtime/vm/thread.cc b/runtime/vm/thread.cc
index ecc51c5..68448fc 100644
--- a/runtime/vm/thread.cc
+++ b/runtime/vm/thread.cc
@@ -40,10 +40,6 @@
   ASSERT(isolate_ == NULL);
   ASSERT(store_buffer_block_ == NULL);
   ASSERT(marking_stack_block_ == NULL);
-#if !defined(DART_PRECOMPILED_RUNTIME)
-  delete interpreter_;
-  interpreter_ = nullptr;
-#endif
   // There should be no top api scopes at this point.
   ASSERT(api_top_scope() == NULL);
   // Delete the resusable api scope if there is one.
@@ -107,9 +103,6 @@
 #if defined(USING_SAFE_STACK)
               saved_safestack_limit_(0),
 #endif
-#if !defined(DART_PRECOMPILED_RUNTIME)
-      interpreter_(nullptr),
-#endif
       next_(NULL) {
 #if defined(SUPPORT_TIMELINE)
   dart_stream_ = Timeline::GetDartStream();
@@ -301,10 +294,6 @@
   async_stack_trace_ = stack_trace.raw();
 }
 
-void Thread::set_raw_async_stack_trace(StackTracePtr raw_stack_trace) {
-  async_stack_trace_ = raw_stack_trace;
-}
-
 void Thread::clear_async_stack_trace() {
   async_stack_trace_ = StackTrace::null();
 }
@@ -681,12 +670,6 @@
   visitor->VisitPointer(reinterpret_cast<ObjectPtr*>(&async_stack_trace_));
   visitor->VisitPointer(reinterpret_cast<ObjectPtr*>(&ffi_callback_code_));
 
-#if !defined(DART_PRECOMPILED_RUNTIME)
-  if (interpreter() != NULL) {
-    interpreter()->VisitObjectPointers(visitor);
-  }
-#endif
-
   // Visit the api local scope as it has all the api local handles.
   ApiLocalScope* scope = api_top_scope_;
   while (scope != NULL) {
@@ -922,11 +905,6 @@
   // False positives: simulator stack and native stack are unordered.
   return true;
 #else
-#if !defined(DART_PRECOMPILED_RUNTIME)
-  // False positives: interpreter stack and native stack are unordered.
-  if ((interpreter_ != nullptr) && interpreter_->HasFrame(top_exit_frame_info_))
-    return true;
-#endif
   return reinterpret_cast<uword>(long_jump_base()) < top_exit_frame_info_;
 #endif
 }
@@ -938,11 +916,6 @@
   // False positives: simulator stack and native stack are unordered.
   return true;
 #else
-#if !defined(DART_PRECOMPILED_RUNTIME)
-  // False positives: interpreter stack and native stack are unordered.
-  if ((interpreter_ != nullptr) && interpreter_->HasFrame(top_exit_frame_info_))
-    return true;
-#endif
   return top_exit_frame_info_ < reinterpret_cast<uword>(long_jump_base());
 #endif
 }
@@ -1083,9 +1056,9 @@
   }
 }
 
-const intptr_t kInitialCallbackIdsReserved = 1024;
+const intptr_t kInitialCallbackIdsReserved = 16;
 int32_t Thread::AllocateFfiCallbackId() {
-  Zone* Z = isolate()->current_zone();
+  Zone* Z = Thread::Current()->zone();
   if (ffi_callback_code_ == GrowableObjectArray::null()) {
     ffi_callback_code_ = GrowableObjectArray::New(kInitialCallbackIdsReserved);
   }
@@ -1106,7 +1079,7 @@
 }
 
 void Thread::SetFfiCallbackCode(int32_t callback_id, const Code& code) {
-  Zone* Z = isolate()->current_zone();
+  Zone* Z = Thread::Current()->zone();
 
   /// In AOT the callback ID might have been allocated during compilation but
   /// 'ffi_callback_code_' is initialized to empty again when the program
@@ -1120,8 +1093,12 @@
   const auto& array = GrowableObjectArray::Handle(Z, ffi_callback_code_);
 
   if (callback_id >= array.Length()) {
-    if (callback_id >= array.Capacity()) {
-      array.Grow(callback_id + 1);
+    const int32_t capacity = array.Capacity();
+    if (callback_id >= capacity) {
+      // Ensure both that we grow enough and an exponential growth strategy.
+      const int32_t new_capacity =
+          Utils::Maximum(callback_id + 1, capacity * 2);
+      array.Grow(new_capacity);
     }
     array.SetLength(callback_id + 1);
   }
diff --git a/runtime/vm/thread.h b/runtime/vm/thread.h
index 8ec17a2..9cabac7 100644
--- a/runtime/vm/thread.h
+++ b/runtime/vm/thread.h
@@ -32,7 +32,6 @@
 class CompilerState;
 class Class;
 class Code;
-class Bytecode;
 class Error;
 class ExceptionHandlers;
 class Field;
@@ -43,7 +42,6 @@
 class Heap;
 class HierarchyInfo;
 class Instance;
-class Interpreter;
 class Isolate;
 class IsolateGroup;
 class Library;
@@ -73,7 +71,6 @@
   V(Array)                                                                     \
   V(Class)                                                                     \
   V(Code)                                                                      \
-  V(Bytecode)                                                                  \
   V(Error)                                                                     \
   V(ExceptionHandlers)                                                         \
   V(Field)                                                                     \
@@ -98,9 +95,11 @@
     StubCode::FixAllocationStubTarget().raw(), nullptr)                        \
   V(CodePtr, invoke_dart_code_stub_, StubCode::InvokeDartCode().raw(),         \
     nullptr)                                                                   \
-  V(CodePtr, invoke_dart_code_from_bytecode_stub_,                             \
-    StubCode::InvokeDartCodeFromBytecode().raw(), nullptr)                     \
   V(CodePtr, call_to_runtime_stub_, StubCode::CallToRuntime().raw(), nullptr)  \
+  V(CodePtr, late_initialization_error_shared_without_fpu_regs_stub_,          \
+    StubCode::LateInitializationErrorSharedWithoutFPURegs().raw(), nullptr)    \
+  V(CodePtr, late_initialization_error_shared_with_fpu_regs_stub_,             \
+    StubCode::LateInitializationErrorSharedWithFPURegs().raw(), nullptr)       \
   V(CodePtr, null_error_shared_without_fpu_regs_stub_,                         \
     StubCode::NullErrorSharedWithoutFPURegs().raw(), nullptr)                  \
   V(CodePtr, null_error_shared_with_fpu_regs_stub_,                            \
@@ -206,7 +205,6 @@
     NativeEntry::NoScopeNativeCallWrapperEntry(), 0)                           \
   V(uword, auto_scope_native_wrapper_entry_point_,                             \
     NativeEntry::AutoScopeNativeCallWrapperEntry(), 0)                         \
-  V(uword, interpret_call_entry_point_, RuntimeEntry::InterpretCallEntry(), 0) \
   V(StringPtr*, predefined_symbols_address_, Symbols::PredefinedAddress(),     \
     NULL)                                                                      \
   V(uword, double_nan_address_, reinterpret_cast<uword>(&double_nan_constant), \
@@ -468,11 +466,6 @@
     type_usage_info_ = value;
   }
 
-#if !defined(DART_PRECOMPILED_RUNTIME)
-  Interpreter* interpreter() const { return interpreter_; }
-  void set_interpreter(Interpreter* value) { interpreter_ = value; }
-#endif
-
   int32_t no_callback_scope_depth() const { return no_callback_scope_depth_; }
 
   void IncrementNoCallbackScopeDepth() {
@@ -666,7 +659,6 @@
 
   StackTracePtr async_stack_trace() const;
   void set_async_stack_trace(const StackTrace& stack_trace);
-  void set_raw_async_stack_trace(StackTracePtr raw_stack_trace);
   void clear_async_stack_trace();
   static intptr_t async_stack_trace_offset() {
     return OFFSET_OF(Thread, async_stack_trace_);
@@ -1027,10 +1019,6 @@
   uword saved_safestack_limit_;
 #endif
 
-#if !defined(DART_PRECOMPILED_RUNTIME)
-  Interpreter* interpreter_;
-#endif
-
   Thread* next_;  // Used to chain the thread structures in an isolate.
   bool is_mutator_thread_ = false;
 
@@ -1064,7 +1052,6 @@
 #undef REUSABLE_FRIEND_DECLARATION
 
   friend class ApiZone;
-  friend class Interpreter;
   friend class InterruptChecker;
   friend class Isolate;
   friend class IsolateGroup;
diff --git a/runtime/vm/thread_test.cc b/runtime/vm/thread_test.cc
index 41e3374..048cda9 100644
--- a/runtime/vm/thread_test.cc
+++ b/runtime/vm/thread_test.cc
@@ -14,8 +14,6 @@
 
 namespace dart {
 
-DECLARE_FLAG(bool, enable_interpreter);
-
 VM_UNIT_TEST_CASE(Mutex) {
   // This unit test case needs a running isolate.
   TestCase::CreateTestIsolate();
@@ -638,7 +636,7 @@
 #if defined(USING_SIMULATOR)
   const intptr_t kLoopCount = 12345678;
 #else
-  const intptr_t kLoopCount = FLAG_enable_interpreter ? 12345678 : 1234567890;
+  const intptr_t kLoopCount = 1234567890;
 #endif  // defined(USING_SIMULATOR)
   char buffer[1024];
   Utils::SNPrint(buffer, sizeof(buffer),
@@ -1029,4 +1027,65 @@
   EXPECT(!lock.IsCurrentThreadWriter());
 }
 
+struct ReaderThreadState {
+  ThreadJoinId reader_id = OSThread::kInvalidThreadJoinId;
+  SafepointRwLock* rw_lock = nullptr;
+  IsolateGroup* isolate_group = nullptr;
+  intptr_t elapsed_us = 0;
+};
+
+void Helper(uword arg) {
+  auto state = reinterpret_cast<ReaderThreadState*>(arg);
+  state->reader_id = OSThread::GetCurrentThreadJoinId(OSThread::Current());
+
+  const bool kBypassSafepoint = false;
+  Thread::EnterIsolateGroupAsHelper(state->isolate_group, Thread::kUnknownTask,
+                                    kBypassSafepoint);
+  {
+    auto thread = Thread::Current();
+    const auto before_us = OS::GetCurrentMonotonicMicros();
+    intptr_t after_us = before_us;
+    {
+      SafepointReadRwLocker reader(thread, state->rw_lock);
+      after_us = OS::GetCurrentMonotonicMicros();
+    }
+    state->elapsed_us = (after_us - before_us);
+  }
+  Thread::ExitIsolateGroupAsHelper(kBypassSafepoint);
+}
+
+ISOLATE_UNIT_TEST_CASE(SafepointRwLockExclusiveNestedWriter_Regress44000) {
+  auto isolate_group = IsolateGroup::Current();
+
+  SafepointRwLock lock;
+  ReaderThreadState state;
+  state.rw_lock = &lock;
+  state.isolate_group = isolate_group;
+  {
+    // Hold one writer lock.
+    SafepointWriteRwLocker locker(Thread::Current(), &lock);
+    {
+      // Hold another, nested, writer lock.
+      SafepointWriteRwLocker locker2(Thread::Current(), &lock);
+
+      // Start a thread, it will try to acquire read lock but it will have to
+      // wait until we have exited both writer scopes.
+      if (OSThread::Start("DartWorker", &Helper,
+                          reinterpret_cast<uword>(&state)) != 0) {
+        FATAL("Could not start worker thread");
+      }
+      // Give thread a little time to actually start running.
+      OS::Sleep(20);
+
+      OS::Sleep(500);
+    }
+    OS::Sleep(500);
+  }
+  // Join the other thread.
+  OSThread::Join(state.reader_id);
+
+  // Ensure the reader thread had to wait for around 1 second.
+  EXPECT(state.elapsed_us > 2 * 500 * 1000);
+}
+
 }  // namespace dart
diff --git a/runtime/vm/type_testing_stubs.cc b/runtime/vm/type_testing_stubs.cc
index 60328d7..f86d082 100644
--- a/runtime/vm/type_testing_stubs.cc
+++ b/runtime/vm/type_testing_stubs.cc
@@ -525,7 +525,7 @@
   //
   //   Case b)
   //      type_arguments <- InstantiateTypeArguments(ita, fta, uta)
-  //      (where uta may or may not be a constant TypeArguments object)
+  //      (where uta may not be a constant non-null TypeArguments object)
   //
   //   Case c)
   //      type_arguments <- LoadField(vx)
@@ -544,11 +544,12 @@
     type_usage_info->UseTypeArgumentsInInstanceCreation(klass, type_arguments);
   } else if (InstantiateTypeArgumentsInstr* instantiate =
                  type_arguments->AsInstantiateTypeArguments()) {
-    ASSERT(instantiate->type_arguments()->BindsToConstant());
-    ASSERT(!instantiate->type_arguments()->BoundConstant().IsNull());
-    const auto& ta =
-        TypeArguments::Cast(instantiate->type_arguments()->BoundConstant());
-    type_usage_info->UseTypeArgumentsInInstanceCreation(klass, ta);
+    if (instantiate->type_arguments()->BindsToConstant() &&
+        !instantiate->type_arguments()->BoundConstant().IsNull()) {
+      const auto& ta =
+          TypeArguments::Cast(instantiate->type_arguments()->BoundConstant());
+      type_usage_info->UseTypeArgumentsInInstanceCreation(klass, ta);
+    }
   } else if (LoadFieldInstr* load_field = type_arguments->AsLoadField()) {
     Definition* instance = load_field->instance()->definition();
     intptr_t cid = instance->Type()->ToNullableCid();
diff --git a/runtime/vm/type_testing_stubs_test.cc b/runtime/vm/type_testing_stubs_test.cc
index c035bdf..9cc1045 100644
--- a/runtime/vm/type_testing_stubs_test.cc
+++ b/runtime/vm/type_testing_stubs_test.cc
@@ -18,8 +18,8 @@
 
 namespace dart {
 
-static void FinalizeAndCanonicalize(const Class& klass, AbstractType* type) {
-  *type = ClassFinalizer::FinalizeType(klass, *type);
+static void FinalizeAndCanonicalize(AbstractType* type) {
+  *type = ClassFinalizer::FinalizeType(*type);
   ASSERT(type->IsCanonical());
 }
 
@@ -253,7 +253,6 @@
   const auto& class_base = Class::Handle(GetClass(root_library, "Base"));
   const auto& class_i = Class::Handle(GetClass(root_library, "I"));
   const auto& class_i2 = Class::Handle(GetClass(root_library, "I2"));
-  const auto& class_null = Class::Handle(Class::null());
 
   const auto& obj_i = Object::Handle(Invoke(root_library, "createI"));
   const auto& obj_i2 = Object::Handle(Invoke(root_library, "createI2"));
@@ -321,7 +320,7 @@
   // <...> as Base<Object>
   auto& type_base = AbstractType::Handle(
       Type::New(class_base, tav_object, TokenPosition::kNoSource));
-  FinalizeAndCanonicalize(class_null, &type_base);
+  FinalizeAndCanonicalize(&type_base);
   RunTTSTest(obj_i, type_base, tav_null, tav_null, ExpectLazilyFailedViaTTS,
              ExpectFailedViaTTS);
   RunTTSTest(obj_i2, type_base, tav_null, tav_null, ExpectLazilyFailedViaTTS,
@@ -365,7 +364,7 @@
   // <...> as I<Object, dynamic>
   auto& type_i_object_dynamic = AbstractType::Handle(
       Type::New(class_i, tav_object_dynamic, TokenPosition::kNoSource));
-  FinalizeAndCanonicalize(class_null, &type_i_object_dynamic);
+  FinalizeAndCanonicalize(&type_i_object_dynamic);
   RunTTSTest(obj_i, type_i_object_dynamic, tav_null, tav_null,
              ExpectLazilyHandledViaTTS, ExpectHandledViaTTS);
   RunTTSTest(obj_i2, type_i_object_dynamic, tav_null, tav_null,
@@ -392,7 +391,7 @@
   //
   auto& type_dynamic_t = AbstractType::Handle(
       Type::New(class_i, tav_dynamic_t, TokenPosition::kNoSource));
-  FinalizeAndCanonicalize(class_base, &type_dynamic_t);
+  FinalizeAndCanonicalize(&type_dynamic_t);
   RunTTSTest(obj_i, type_dynamic_t, tav_object, tav_null,
              ExpectLazilyHandledViaSTC, ExpectHandledViaSTC);
   RunTTSTest(obj_i2, type_dynamic_t, tav_object, tav_null,
@@ -433,7 +432,6 @@
   const auto& class_i = Class::Handle(GetClass(root_library, "I"));
   const auto& fun_generic =
       Function::Handle(GetFunction(root_library, "genericFun"));
-  const auto& class_null = Class::Handle(Class::null());
 
   const auto& obj_i = Object::Handle(Invoke(root_library, "createI"));
   const auto& obj_i2 = Object::Handle(Invoke(root_library, "createI2"));
@@ -471,7 +469,7 @@
   if (!TestCase::IsNNBD()) {
     type_a1 = type_a1.ToNullability(Nullability::kLegacy, Heap::kNew);
   }
-  FinalizeAndCanonicalize(class_null, &type_a1);
+  FinalizeAndCanonicalize(&type_a1);
 
   const auto& tav_null = TypeArguments::Handle(TypeArguments::null());
 
@@ -496,7 +494,7 @@
 
   auto& type_i_object_dynamic = AbstractType::Handle(
       Type::New(class_i, tav_object_dynamic, TokenPosition::kNoSource));
-  FinalizeAndCanonicalize(class_null, &type_i_object_dynamic);
+  FinalizeAndCanonicalize(&type_i_object_dynamic);
   const auto& tav_iod = TypeArguments::Handle(TypeArguments::New(1));
   tav_iod.SetTypeAt(0, type_i_object_dynamic);
 
@@ -515,7 +513,7 @@
   // <...> as Base<I<Object, dynamic>>
   auto& type_base_i_object_dynamic = AbstractType::Handle(
       Type::New(class_base, tav_iod, TokenPosition::kNoSource));
-  FinalizeAndCanonicalize(class_null, &type_base_i_object_dynamic);
+  FinalizeAndCanonicalize(&type_base_i_object_dynamic);
   RunTTSTest(obj_baseb2int, type_base_i_object_dynamic, tav_null, tav_null,
              ExpectLazilyHandledViaTTS, ExpectHandledViaTTS);
   RunTTSTest(obj_baseistringdouble, type_base_i_object_dynamic, tav_null,
@@ -539,7 +537,7 @@
       0, TypeParameter::Handle(GetClassTypeParameter(class_base, "T")));
   auto& type_base_t = AbstractType::Handle(
       Type::New(class_base, tav_baset, TokenPosition::kNoSource));
-  FinalizeAndCanonicalize(class_base, &type_base_t);
+  FinalizeAndCanonicalize(&type_base_t);
   RunTTSTest(obj_baseint, type_base_t, tav_int, tav_null,
              ExpectLazilyHandledViaTTS, ExpectHandledViaTTS);
   RunTTSTest(obj_baseistringdouble, type_base_t, tav_int, tav_null,
@@ -551,7 +549,7 @@
       0, TypeParameter::Handle(GetFunctionTypeParameter(fun_generic, "B")));
   auto& type_base_b = AbstractType::Handle(
       Type::New(class_base, tav_baseb, TokenPosition::kNoSource));
-  FinalizeAndCanonicalize(class_null, &type_base_b);
+  FinalizeAndCanonicalize(&type_base_b);
   // With B == int
   RunTTSTest(obj_baseint, type_base_b, tav_null, tav_dynamic_int,
              ExpectLazilyHandledViaTTS, ExpectHandledViaTTS);
@@ -577,7 +575,7 @@
       Type::New(class_i, tav_dynamic_string, TokenPosition::kNoSource));
   type_i_dynamic_string = type_i_dynamic_string.ToNullability(
       Nullability::kNonNullable, Heap::kNew);
-  FinalizeAndCanonicalize(class_null, &type_i_dynamic_string);
+  FinalizeAndCanonicalize(&type_i_dynamic_string);
   RunTTSTest(obj_i, type_i_dynamic_string, tav_null, tav_null,
              ExpectLazilyHandledViaSTC, ExpectHandledViaSTC);
   RunTTSTest(obj_baseint, type_i_dynamic_string, tav_null, tav_null,
@@ -590,14 +588,14 @@
   auto& type_a2_t =
       Type::Handle(Type::New(class_a2, tav_t, TokenPosition::kNoSource));
   type_a2_t = type_a2_t.ToNullability(Nullability::kLegacy, Heap::kNew);
-  FinalizeAndCanonicalize(class_null, &type_a2_t);
+  FinalizeAndCanonicalize(&type_a2_t);
   const auto& tav_a2_t = TypeArguments::Handle(TypeArguments::New(1));
   tav_a2_t.SetTypeAt(0, type_a2_t);
   auto& type_base_a2_t =
       Type::Handle(Type::New(class_base, tav_a2_t, TokenPosition::kNoSource));
   type_base_a2_t =
       type_base_a2_t.ToNullability(Nullability::kNonNullable, Heap::kNew);
-  FinalizeAndCanonicalize(class_null, &type_base_a2_t);
+  FinalizeAndCanonicalize(&type_base_a2_t);
   RunTTSTest(obj_basea2int, type_base_a2_t, tav_null, tav_null,
              ExpectLazilyHandledViaSTC, ExpectHandledViaSTC);
   RunTTSTest(obj_baseint, type_base_a2_t, tav_null, tav_null,
@@ -609,14 +607,14 @@
   auto& type_a2_a1 =
       Type::Handle(Type::New(class_a2, tav_a1, TokenPosition::kNoSource));
   type_a2_a1 = type_a2_a1.ToNullability(Nullability::kLegacy, Heap::kNew);
-  FinalizeAndCanonicalize(class_null, &type_a2_a1);
+  FinalizeAndCanonicalize(&type_a2_a1);
   const auto& tav_a2_a1 = TypeArguments::Handle(TypeArguments::New(1));
   tav_a2_a1.SetTypeAt(0, type_a2_a1);
   auto& type_base_a2_a1 =
       Type::Handle(Type::New(class_base, tav_a2_a1, TokenPosition::kNoSource));
   type_base_a2_a1 =
       type_base_a2_a1.ToNullability(Nullability::kNonNullable, Heap::kNew);
-  FinalizeAndCanonicalize(class_null, &type_base_a2_a1);
+  FinalizeAndCanonicalize(&type_base_a2_a1);
   RunTTSTest(obj_basea2a1, type_base_a2_a1, tav_null, tav_null,
              ExpectLazilyHandledViaSTC, ExpectHandledViaSTC);
   RunTTSTest(obj_basea2int, type_base_a2_a1, tav_null, tav_null,
@@ -639,7 +637,6 @@
 
   const auto& root_library = Library::Handle(LoadTestScript(kScript));
   const auto& class_b = Class::Handle(GetClass(root_library, "B"));
-  const auto& class_null = Class::Handle(Class::null());
 
   const auto& acint = Object::Handle(Invoke(root_library, "createACint"));
   const auto& bcint = Object::Handle(Invoke(root_library, "createBCint"));
@@ -651,7 +648,7 @@
                     TypeParameter::Handle(GetClassTypeParameter(class_b, "T")));
   auto& dst_type =
       Type::Handle(Type::New(class_b, dst_tav, TokenPosition::kNoSource));
-  FinalizeAndCanonicalize(class_null, &dst_type);
+  FinalizeAndCanonicalize(&dst_type);
   const auto& cint_tav =
       TypeArguments::Handle(Instance::Cast(acint).GetTypeArguments());
   const auto& function_tav = TypeArguments::Handle();
diff --git a/runtime/vm/type_testing_stubs_test_arm.cc b/runtime/vm/type_testing_stubs_test_arm.cc
index 2970a03..0391fe9 100644
--- a/runtime/vm/type_testing_stubs_test_arm.cc
+++ b/runtime/vm/type_testing_stubs_test_arm.cc
@@ -45,8 +45,6 @@
 
   const intptr_t sub_type_cache_index = __ object_pool_builder().AddObject(
       Object::null_object(), compiler::ObjectPoolBuilderEntry::kPatchable);
-  const intptr_t sub_type_cache_offset =
-      ObjectPool::element_offset(sub_type_cache_index) - kHeapObjectTag;
   const intptr_t dst_name_index = __ object_pool_builder().AddObject(
       Symbols::OptimizedOut(), compiler::ObjectPoolBuilderEntry::kPatchable);
   ASSERT((sub_type_cache_index + 1) == dst_name_index);
@@ -56,8 +54,8 @@
   __ ldr(R9, compiler::FieldAddress(
                  TypeTestABI::kDstTypeReg,
                  AbstractType::type_test_stub_entry_point_offset()));
-  __ ldr(TypeTestABI::kSubtypeTestCacheReg,
-         compiler::Address(PP, sub_type_cache_offset));
+  __ LoadWordFromPoolIndex(TypeTestABI::kSubtypeTestCacheReg,
+                           sub_type_cache_index);
   __ blx(R9);
 
   // We have the guarantee that TTS preserve all registers except for one
diff --git a/runtime/vm/type_testing_stubs_test_arm64.cc b/runtime/vm/type_testing_stubs_test_arm64.cc
index 858cd33..39f7d36 100644
--- a/runtime/vm/type_testing_stubs_test_arm64.cc
+++ b/runtime/vm/type_testing_stubs_test_arm64.cc
@@ -45,8 +45,6 @@
 
   const intptr_t sub_type_cache_index = __ object_pool_builder().AddObject(
       Object::null_object(), compiler::ObjectPoolBuilderEntry::kPatchable);
-  const intptr_t sub_type_cache_offset =
-      ObjectPool::element_offset(sub_type_cache_index);
   const intptr_t dst_name_index = __ object_pool_builder().AddObject(
       Symbols::OptimizedOut(), compiler::ObjectPoolBuilderEntry::kPatchable);
   ASSERT((sub_type_cache_index + 1) == dst_name_index);
@@ -56,8 +54,8 @@
   __ ldr(R9, compiler::FieldAddress(
                  TypeTestABI::kDstTypeReg,
                  AbstractType::type_test_stub_entry_point_offset()));
-  __ LoadWordFromPoolOffset(TypeTestABI::kSubtypeTestCacheReg,
-                            sub_type_cache_offset);
+  __ LoadWordFromPoolIndex(TypeTestABI::kSubtypeTestCacheReg,
+                           sub_type_cache_index);
   __ blr(R9);
 
   // We have the guarantee that TTS preserve all registers except for one
diff --git a/runtime/vm/unit_test.cc b/runtime/vm/unit_test.cc
index b6cb15e..528aeb9e 100644
--- a/runtime/vm/unit_test.cc
+++ b/runtime/vm/unit_test.cc
@@ -220,7 +220,7 @@
 }
 
 bool TestCase::IsNNBD() {
-  return KernelIsolate::GetExperimentalFlag("non-nullable");
+  return !KernelIsolate::GetExperimentalFlag("no-non-nullable");
 }
 
 #ifndef PRODUCT
diff --git a/runtime/vm/vm_sources.gni b/runtime/vm/vm_sources.gni
index 2cd70b1..a0e71ef 100644
--- a/runtime/vm/vm_sources.gni
+++ b/runtime/vm/vm_sources.gni
@@ -41,7 +41,6 @@
   "code_patcher_arm.cc",
   "code_patcher_arm64.cc",
   "code_patcher_ia32.cc",
-  "code_patcher_kbc.cc",
   "code_patcher_x64.cc",
   "compilation_trace.cc",
   "compilation_trace.h",
@@ -52,8 +51,6 @@
   "constants_base.h",
   "constants_ia32.cc",
   "constants_ia32.h",
-  "constants_kbc.cc",
-  "constants_kbc.h",
   "constants_x64.cc",
   "constants_x64.h",
   "cpu.h",
@@ -85,7 +82,6 @@
   "debugger_arm.cc",
   "debugger_arm64.cc",
   "debugger_ia32.cc",
-  "debugger_kbc.cc",
   "debugger_x64.cc",
   "deferred_objects.cc",
   "deferred_objects.h",
@@ -130,12 +126,8 @@
   "instructions_arm64.h",
   "instructions_ia32.cc",
   "instructions_ia32.h",
-  "instructions_kbc.cc",
-  "instructions_kbc.h",
   "instructions_x64.cc",
   "instructions_x64.h",
-  "interpreter.cc",
-  "interpreter.h",
   "intrusive_dlist.h",
   "isolate.cc",
   "isolate.h",
@@ -298,7 +290,6 @@
   "stack_frame_arm.h",
   "stack_frame_arm64.h",
   "stack_frame_ia32.h",
-  "stack_frame_kbc.h",
   "stack_frame_x64.h",
   "stack_trace.cc",
   "stack_trace.h",
@@ -390,6 +381,7 @@
   "cpuinfo_test.cc",
   "custom_isolate_test.cc",
   "dart_api_impl_test.cc",
+  "datastream_test.cc",
   "debugger_api_impl_test.cc",
   "exceptions_test.cc",
   "fixed_cache_test.cc",
@@ -435,6 +427,7 @@
   "snapshot_test.cc",
   "source_report_test.cc",
   "stack_frame_test.cc",
+  "stub_code_test.cc",
   "stub_code_arm64_test.cc",
   "stub_code_arm_test.cc",
   "stub_code_ia32_test.cc",
diff --git a/samples-dev/swarm/App.dart b/samples-dev/swarm/App.dart
index 301021b..fc51ec9 100644
--- a/samples-dev/swarm/App.dart
+++ b/samples-dev/swarm/App.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 part of swarmlib;
 
 /**
diff --git a/samples-dev/swarm/BiIterator.dart b/samples-dev/swarm/BiIterator.dart
index b4bfce3..fb56d61 100644
--- a/samples-dev/swarm/BiIterator.dart
+++ b/samples-dev/swarm/BiIterator.dart
@@ -1,3 +1,5 @@
+// @dart = 2.9
+
 part of swarmlib;
 
 /**
diff --git a/samples-dev/swarm/CSS.dart b/samples-dev/swarm/CSS.dart
index b05bb29..be281de 100644
--- a/samples-dev/swarm/CSS.dart
+++ b/samples-dev/swarm/CSS.dart
@@ -1,6 +1,8 @@
 // File generated by Dart CSS from source file swarm.scss
 // Do not edit.
 
+// @dart = 2.9
+
 part of swarmlib;
 
 class CSS {
diff --git a/samples-dev/swarm/CannedData.dart b/samples-dev/swarm/CannedData.dart
index a6cadb9..2f5a467 100644
--- a/samples-dev/swarm/CannedData.dart
+++ b/samples-dev/swarm/CannedData.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 part of swarmlib;
 
 // TODO(jimhug): Work out correct copyright for this file.
diff --git a/samples-dev/swarm/ConfigHintDialog.dart b/samples-dev/swarm/ConfigHintDialog.dart
index 3ec6d30..92acf4b 100644
--- a/samples-dev/swarm/ConfigHintDialog.dart
+++ b/samples-dev/swarm/ConfigHintDialog.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 part of swarmlib;
 
 /** A placeholder dialog that just passes the buck to Reader on feed
diff --git a/samples-dev/swarm/DataSource.dart b/samples-dev/swarm/DataSource.dart
index 3293a95..9f350a1 100644
--- a/samples-dev/swarm/DataSource.dart
+++ b/samples-dev/swarm/DataSource.dart
@@ -2,6 +2,9 @@
 // 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.
 
+// @dart = 2.9
+
+
 part of swarmlib;
 
 /** The top-level collection of all sections for a user. */
diff --git a/samples-dev/swarm/Decoder.dart b/samples-dev/swarm/Decoder.dart
index 034b331..6e84bba 100644
--- a/samples-dev/swarm/Decoder.dart
+++ b/samples-dev/swarm/Decoder.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 part of swarmlib;
 
 // TODO(jimhug): Fill out methods, add encoder, move to shared lib.
diff --git a/samples-dev/swarm/HelpDialog.dart b/samples-dev/swarm/HelpDialog.dart
index d5024c5..dfce44c 100644
--- a/samples-dev/swarm/HelpDialog.dart
+++ b/samples-dev/swarm/HelpDialog.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 part of swarmlib;
 
 /**
diff --git a/samples-dev/swarm/SwarmApp.dart b/samples-dev/swarm/SwarmApp.dart
index 8513eb4..fc8b2a1 100644
--- a/samples-dev/swarm/SwarmApp.dart
+++ b/samples-dev/swarm/SwarmApp.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 part of swarmlib;
 
 /**
diff --git a/samples-dev/swarm/SwarmState.dart b/samples-dev/swarm/SwarmState.dart
index 2f6f76a..e710bcc 100644
--- a/samples-dev/swarm/SwarmState.dart
+++ b/samples-dev/swarm/SwarmState.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 part of swarmlib;
 
 /**
diff --git a/samples-dev/swarm/SwarmViews.dart b/samples-dev/swarm/SwarmViews.dart
index 442355a..458e4ea 100644
--- a/samples-dev/swarm/SwarmViews.dart
+++ b/samples-dev/swarm/SwarmViews.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 part of swarmlib;
 
 // TODO(jacobr): there is a lot of dead code in this class. Checking is as is
diff --git a/samples-dev/swarm/UIState.dart b/samples-dev/swarm/UIState.dart
index f2e0a9e..8d7ce1c 100644
--- a/samples-dev/swarm/UIState.dart
+++ b/samples-dev/swarm/UIState.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 part of swarmlib;
 
 /**
diff --git a/samples-dev/swarm/Views.dart b/samples-dev/swarm/Views.dart
index 0360b06..0588357 100644
--- a/samples-dev/swarm/Views.dart
+++ b/samples-dev/swarm/Views.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 part of swarmlib;
 
 // This file contains View framework classes.
diff --git a/samples-dev/swarm/swarm.dart b/samples-dev/swarm/swarm.dart
index d44bd2b..77fa3b0 100644
--- a/samples-dev/swarm/swarm.dart
+++ b/samples-dev/swarm/swarm.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 library swarm;
 
 import 'swarmlib.dart';
diff --git a/samples-dev/swarm/swarm_ui_lib/base/AnimationScheduler.dart b/samples-dev/swarm/swarm_ui_lib/base/AnimationScheduler.dart
index 577d035..cbbe50f 100644
--- a/samples-dev/swarm/swarm_ui_lib/base/AnimationScheduler.dart
+++ b/samples-dev/swarm/swarm_ui_lib/base/AnimationScheduler.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 part of base;
 
 typedef void AnimationCallback(num currentTime);
diff --git a/samples-dev/swarm/swarm_ui_lib/base/Device.dart b/samples-dev/swarm/swarm_ui_lib/base/Device.dart
index 99b0c37..c0f04cd 100644
--- a/samples-dev/swarm/swarm_ui_lib/base/Device.dart
+++ b/samples-dev/swarm/swarm_ui_lib/base/Device.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 part of base;
 
 // TODO(jacobr): cache these results.
diff --git a/samples-dev/swarm/swarm_ui_lib/base/DomWrapper.dart b/samples-dev/swarm/swarm_ui_lib/base/DomWrapper.dart
index 2839060..a27ac4b 100644
--- a/samples-dev/swarm/swarm_ui_lib/base/DomWrapper.dart
+++ b/samples-dev/swarm/swarm_ui_lib/base/DomWrapper.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 part of base;
 
 /**
diff --git a/samples-dev/swarm/swarm_ui_lib/base/Env.dart b/samples-dev/swarm/swarm_ui_lib/base/Env.dart
index 3c1b69f..e082100 100644
--- a/samples-dev/swarm/swarm_ui_lib/base/Env.dart
+++ b/samples-dev/swarm/swarm_ui_lib/base/Env.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 part of base;
 
 /**
diff --git a/samples-dev/swarm/swarm_ui_lib/base/Size.dart b/samples-dev/swarm/swarm_ui_lib/base/Size.dart
index 08fc365..bb1fd0c 100644
--- a/samples-dev/swarm/swarm_ui_lib/base/Size.dart
+++ b/samples-dev/swarm/swarm_ui_lib/base/Size.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 part of base;
 
 /**
diff --git a/samples-dev/swarm/swarm_ui_lib/base/base.dart b/samples-dev/swarm/swarm_ui_lib/base/base.dart
index f854a5e..e1a989f 100644
--- a/samples-dev/swarm/swarm_ui_lib/base/base.dart
+++ b/samples-dev/swarm/swarm_ui_lib/base/base.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 library base;
 
 import 'dart:html';
diff --git a/samples-dev/swarm/swarm_ui_lib/layout/GridLayout.dart b/samples-dev/swarm/swarm_ui_lib/layout/GridLayout.dart
index aacebb5..45773c0 100644
--- a/samples-dev/swarm/swarm_ui_lib/layout/GridLayout.dart
+++ b/samples-dev/swarm/swarm_ui_lib/layout/GridLayout.dart
@@ -2,6 +2,9 @@
 // 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.
 
+// @dart = 2.9
+
+
 part of layout;
 
 /**
diff --git a/samples-dev/swarm/swarm_ui_lib/layout/GridLayoutParams.dart b/samples-dev/swarm/swarm_ui_lib/layout/GridLayoutParams.dart
index c979aaf..f2de0f1 100644
--- a/samples-dev/swarm/swarm_ui_lib/layout/GridLayoutParams.dart
+++ b/samples-dev/swarm/swarm_ui_lib/layout/GridLayoutParams.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 part of layout;
 
 /**
diff --git a/samples-dev/swarm/swarm_ui_lib/layout/GridLayoutParser.dart b/samples-dev/swarm/swarm_ui_lib/layout/GridLayoutParser.dart
index dd3e08f..71f272d 100644
--- a/samples-dev/swarm/swarm_ui_lib/layout/GridLayoutParser.dart
+++ b/samples-dev/swarm/swarm_ui_lib/layout/GridLayoutParser.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 part of layout;
 
 /**
diff --git a/samples-dev/swarm/swarm_ui_lib/layout/GridTracks.dart b/samples-dev/swarm/swarm_ui_lib/layout/GridTracks.dart
index deb7213..2fa6eb9 100644
--- a/samples-dev/swarm/swarm_ui_lib/layout/GridTracks.dart
+++ b/samples-dev/swarm/swarm_ui_lib/layout/GridTracks.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 part of layout;
 
 // This file has classes representing the grid tracks and grid template
diff --git a/samples-dev/swarm/swarm_ui_lib/layout/SizingFunctions.dart b/samples-dev/swarm/swarm_ui_lib/layout/SizingFunctions.dart
index 60d6d0b..56e25b3 100644
--- a/samples-dev/swarm/swarm_ui_lib/layout/SizingFunctions.dart
+++ b/samples-dev/swarm/swarm_ui_lib/layout/SizingFunctions.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 part of layout;
 
 // This file has classes representing the grid sizing functions
diff --git a/samples-dev/swarm/swarm_ui_lib/layout/ViewLayout.dart b/samples-dev/swarm/swarm_ui_lib/layout/ViewLayout.dart
index 5decaec..aa0c3e9 100644
--- a/samples-dev/swarm/swarm_ui_lib/layout/ViewLayout.dart
+++ b/samples-dev/swarm/swarm_ui_lib/layout/ViewLayout.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 part of layout;
 
 /** The interface that the layout algorithms use to talk to the view. */
diff --git a/samples-dev/swarm/swarm_ui_lib/layout/layout.dart b/samples-dev/swarm/swarm_ui_lib/layout/layout.dart
index b060c6e..ddc5bb1 100644
--- a/samples-dev/swarm/swarm_ui_lib/layout/layout.dart
+++ b/samples-dev/swarm/swarm_ui_lib/layout/layout.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 library layout;
 
 import 'dart:async';
diff --git a/samples-dev/swarm/swarm_ui_lib/observable/ChangeEvent.dart b/samples-dev/swarm/swarm_ui_lib/observable/ChangeEvent.dart
index 46c89ca..6a1d050 100644
--- a/samples-dev/swarm/swarm_ui_lib/observable/ChangeEvent.dart
+++ b/samples-dev/swarm/swarm_ui_lib/observable/ChangeEvent.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 part of observable;
 
 /** A change to an observable instance. */
diff --git a/samples-dev/swarm/swarm_ui_lib/observable/EventBatch.dart b/samples-dev/swarm/swarm_ui_lib/observable/EventBatch.dart
index 58f41a5..f00567d8 100644
--- a/samples-dev/swarm/swarm_ui_lib/observable/EventBatch.dart
+++ b/samples-dev/swarm/swarm_ui_lib/observable/EventBatch.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 part of observable;
 
 /**
diff --git a/samples-dev/swarm/swarm_ui_lib/observable/observable.dart b/samples-dev/swarm/swarm_ui_lib/observable/observable.dart
index 00dcdd9..0ce07a9 100644
--- a/samples-dev/swarm/swarm_ui_lib/observable/observable.dart
+++ b/samples-dev/swarm/swarm_ui_lib/observable/observable.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 library observable;
 
 part 'ChangeEvent.dart';
diff --git a/samples-dev/swarm/swarm_ui_lib/touch/BezierPhysics.dart b/samples-dev/swarm/swarm_ui_lib/touch/BezierPhysics.dart
index e2afd18..65900d82 100644
--- a/samples-dev/swarm/swarm_ui_lib/touch/BezierPhysics.dart
+++ b/samples-dev/swarm/swarm_ui_lib/touch/BezierPhysics.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 part of touch;
 
 /**
diff --git a/samples-dev/swarm/swarm_ui_lib/touch/ClickBuster.dart b/samples-dev/swarm/swarm_ui_lib/touch/ClickBuster.dart
index a2af933..6f942b4 100644
--- a/samples-dev/swarm/swarm_ui_lib/touch/ClickBuster.dart
+++ b/samples-dev/swarm/swarm_ui_lib/touch/ClickBuster.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 part of touch;
 
 /**
diff --git a/samples-dev/swarm/swarm_ui_lib/touch/EventUtil.dart b/samples-dev/swarm/swarm_ui_lib/touch/EventUtil.dart
index 8727c09..fc71bb7 100644
--- a/samples-dev/swarm/swarm_ui_lib/touch/EventUtil.dart
+++ b/samples-dev/swarm/swarm_ui_lib/touch/EventUtil.dart
@@ -2,6 +2,9 @@
 // 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.
 
+// @dart = 2.9
+
+
 part of touch;
 
 /**
diff --git a/samples-dev/swarm/swarm_ui_lib/touch/FxUtil.dart b/samples-dev/swarm/swarm_ui_lib/touch/FxUtil.dart
index eb2e18b..e543a59 100644
--- a/samples-dev/swarm/swarm_ui_lib/touch/FxUtil.dart
+++ b/samples-dev/swarm/swarm_ui_lib/touch/FxUtil.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 part of touch;
 
 /**
diff --git a/samples-dev/swarm/swarm_ui_lib/touch/Geometry.dart b/samples-dev/swarm/swarm_ui_lib/touch/Geometry.dart
index 2686432..fcd7398 100644
--- a/samples-dev/swarm/swarm_ui_lib/touch/Geometry.dart
+++ b/samples-dev/swarm/swarm_ui_lib/touch/Geometry.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 part of touch;
 
 /**
diff --git a/samples-dev/swarm/swarm_ui_lib/touch/InfiniteScroller.dart b/samples-dev/swarm/swarm_ui_lib/touch/InfiniteScroller.dart
index 2ab03a6..d38c33b 100644
--- a/samples-dev/swarm/swarm_ui_lib/touch/InfiniteScroller.dart
+++ b/samples-dev/swarm/swarm_ui_lib/touch/InfiniteScroller.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 part of touch;
 
 /**
diff --git a/samples-dev/swarm/swarm_ui_lib/touch/Math.dart b/samples-dev/swarm/swarm_ui_lib/touch/Math.dart
index c7af934..01db437 100644
--- a/samples-dev/swarm/swarm_ui_lib/touch/Math.dart
+++ b/samples-dev/swarm/swarm_ui_lib/touch/Math.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 part of touch;
 
 // TODO(jacobr): pick a better name. This was goog.math in Closure.
diff --git a/samples-dev/swarm/swarm_ui_lib/touch/Momentum.dart b/samples-dev/swarm/swarm_ui_lib/touch/Momentum.dart
index eea39a0..7078b33 100644
--- a/samples-dev/swarm/swarm_ui_lib/touch/Momentum.dart
+++ b/samples-dev/swarm/swarm_ui_lib/touch/Momentum.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 part of touch;
 
 /**
diff --git a/samples-dev/swarm/swarm_ui_lib/touch/ScrollWatcher.dart b/samples-dev/swarm/swarm_ui_lib/touch/ScrollWatcher.dart
index 2b09539..cb4a1b6 100644
--- a/samples-dev/swarm/swarm_ui_lib/touch/ScrollWatcher.dart
+++ b/samples-dev/swarm/swarm_ui_lib/touch/ScrollWatcher.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 part of touch;
 
 abstract class ScrollListener {
diff --git a/samples-dev/swarm/swarm_ui_lib/touch/Scrollbar.dart b/samples-dev/swarm/swarm_ui_lib/touch/Scrollbar.dart
index d7b3194..aebd48d 100644
--- a/samples-dev/swarm/swarm_ui_lib/touch/Scrollbar.dart
+++ b/samples-dev/swarm/swarm_ui_lib/touch/Scrollbar.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 part of touch;
 
 /**
diff --git a/samples-dev/swarm/swarm_ui_lib/touch/Scroller.dart b/samples-dev/swarm/swarm_ui_lib/touch/Scroller.dart
index 813ba35..a9d9c13 100644
--- a/samples-dev/swarm/swarm_ui_lib/touch/Scroller.dart
+++ b/samples-dev/swarm/swarm_ui_lib/touch/Scroller.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 part of touch;
 
 /**
diff --git a/samples-dev/swarm/swarm_ui_lib/touch/TimeUtil.dart b/samples-dev/swarm/swarm_ui_lib/touch/TimeUtil.dart
index e092471..a578134 100644
--- a/samples-dev/swarm/swarm_ui_lib/touch/TimeUtil.dart
+++ b/samples-dev/swarm/swarm_ui_lib/touch/TimeUtil.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 part of touch;
 
 /**
diff --git a/samples-dev/swarm/swarm_ui_lib/touch/TouchHandler.dart b/samples-dev/swarm/swarm_ui_lib/touch/TouchHandler.dart
index a398ec3..2e362be 100644
--- a/samples-dev/swarm/swarm_ui_lib/touch/TouchHandler.dart
+++ b/samples-dev/swarm/swarm_ui_lib/touch/TouchHandler.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 part of touch;
 
 /**
diff --git a/samples-dev/swarm/swarm_ui_lib/touch/TouchUtil.dart b/samples-dev/swarm/swarm_ui_lib/touch/TouchUtil.dart
index 4a2ada6..39183c7 100644
--- a/samples-dev/swarm/swarm_ui_lib/touch/TouchUtil.dart
+++ b/samples-dev/swarm/swarm_ui_lib/touch/TouchUtil.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 part of touch;
 
 /**
diff --git a/samples-dev/swarm/swarm_ui_lib/touch/touch.dart b/samples-dev/swarm/swarm_ui_lib/touch/touch.dart
index 21e9c24..b633fa3 100644
--- a/samples-dev/swarm/swarm_ui_lib/touch/touch.dart
+++ b/samples-dev/swarm/swarm_ui_lib/touch/touch.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 library touch;
 
 import 'dart:async';
diff --git a/samples-dev/swarm/swarm_ui_lib/util/CollectionUtils.dart b/samples-dev/swarm/swarm_ui_lib/util/CollectionUtils.dart
index 60dd8ec..902a731 100644
--- a/samples-dev/swarm/swarm_ui_lib/util/CollectionUtils.dart
+++ b/samples-dev/swarm/swarm_ui_lib/util/CollectionUtils.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 part of utilslib;
 
 typedef num NumericValueSelector<T>(T value);
diff --git a/samples-dev/swarm/swarm_ui_lib/util/DateUtils.dart b/samples-dev/swarm/swarm_ui_lib/util/DateUtils.dart
index 76857782..eeec312 100644
--- a/samples-dev/swarm/swarm_ui_lib/util/DateUtils.dart
+++ b/samples-dev/swarm/swarm_ui_lib/util/DateUtils.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 part of utilslib;
 
 /**
diff --git a/samples-dev/swarm/swarm_ui_lib/util/StringUtils.dart b/samples-dev/swarm/swarm_ui_lib/util/StringUtils.dart
index a95cc09..3516032 100644
--- a/samples-dev/swarm/swarm_ui_lib/util/StringUtils.dart
+++ b/samples-dev/swarm/swarm_ui_lib/util/StringUtils.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 part of utilslib;
 
 /**
diff --git a/samples-dev/swarm/swarm_ui_lib/util/Uri.dart b/samples-dev/swarm/swarm_ui_lib/util/Uri.dart
index d04d0c5..e03e38c 100644
--- a/samples-dev/swarm/swarm_ui_lib/util/Uri.dart
+++ b/samples-dev/swarm/swarm_ui_lib/util/Uri.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 part of utilslib;
 
 /**
diff --git a/samples-dev/swarm/swarm_ui_lib/util/utilslib.dart b/samples-dev/swarm/swarm_ui_lib/util/utilslib.dart
index 55582ff..8be9f05 100644
--- a/samples-dev/swarm/swarm_ui_lib/util/utilslib.dart
+++ b/samples-dev/swarm/swarm_ui_lib/util/utilslib.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 library utilslib;
 
 import 'dart:math' as Math;
diff --git a/samples-dev/swarm/swarm_ui_lib/view/CompositeView.dart b/samples-dev/swarm/swarm_ui_lib/view/CompositeView.dart
index ad1fd84..dc6390e 100644
--- a/samples-dev/swarm/swarm_ui_lib/view/CompositeView.dart
+++ b/samples-dev/swarm/swarm_ui_lib/view/CompositeView.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 part of view;
 
 /**
diff --git a/samples-dev/swarm/swarm_ui_lib/view/ConveyorView.dart b/samples-dev/swarm/swarm_ui_lib/view/ConveyorView.dart
index d028eeb..66641e2 100644
--- a/samples-dev/swarm/swarm_ui_lib/view/ConveyorView.dart
+++ b/samples-dev/swarm/swarm_ui_lib/view/ConveyorView.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 part of view;
 
 /**
diff --git a/samples-dev/swarm/swarm_ui_lib/view/MeasureText.dart b/samples-dev/swarm/swarm_ui_lib/view/MeasureText.dart
index 8d582c5..7e768ee 100644
--- a/samples-dev/swarm/swarm_ui_lib/view/MeasureText.dart
+++ b/samples-dev/swarm/swarm_ui_lib/view/MeasureText.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 part of view;
 
 // TODO(jacobr): handle splitting lines on symbols such as '-' that aren't
diff --git a/samples-dev/swarm/swarm_ui_lib/view/PagedViews.dart b/samples-dev/swarm/swarm_ui_lib/view/PagedViews.dart
index 8e39b1a..d8e6c79 100644
--- a/samples-dev/swarm/swarm_ui_lib/view/PagedViews.dart
+++ b/samples-dev/swarm/swarm_ui_lib/view/PagedViews.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 part of view;
 
 class PageState {
diff --git a/samples-dev/swarm/swarm_ui_lib/view/SliderMenu.dart b/samples-dev/swarm/swarm_ui_lib/view/SliderMenu.dart
index 3d760b1..bd2d57f 100644
--- a/samples-dev/swarm/swarm_ui_lib/view/SliderMenu.dart
+++ b/samples-dev/swarm/swarm_ui_lib/view/SliderMenu.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 part of view;
 
 typedef void SelectHandler(String menuText);
diff --git a/samples-dev/swarm/swarm_ui_lib/view/view.dart b/samples-dev/swarm/swarm_ui_lib/view/view.dart
index ead4f2b..30f5e46 100644
--- a/samples-dev/swarm/swarm_ui_lib/view/view.dart
+++ b/samples-dev/swarm/swarm_ui_lib/view/view.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 library view;
 
 import 'dart:async';
diff --git a/samples-dev/swarm/swarmlib.dart b/samples-dev/swarm/swarmlib.dart
index 4fae6cc..b749ff0 100644
--- a/samples-dev/swarm/swarmlib.dart
+++ b/samples-dev/swarm/swarmlib.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 library swarmlib;
 
 import 'dart:async';
diff --git a/samples/ffi/async/async_test.dart b/samples/ffi/async/async_test.dart
index f438582..297a76e 100644
--- a/samples/ffi/async/async_test.dart
+++ b/samples/ffi/async/async_test.dart
@@ -6,6 +6,8 @@
 //
 // SharedObjects=ffi_test_dynamic_library ffi_test_functions
 
+// @dart = 2.9
+
 import 'sample_async_callback.dart' as sample0;
 import 'sample_native_port_call.dart' as sample1;
 
diff --git a/samples/ffi/async/sample_async_callback.dart b/samples/ffi/async/sample_async_callback.dart
index 06cbef3..5e6d79a 100644
--- a/samples/ffi/async/sample_async_callback.dart
+++ b/samples/ffi/async/sample_async_callback.dart
@@ -8,6 +8,8 @@
 //
 // TODO(dartbug.com/37022): Update this when we get real async callbacks.
 
+// @dart = 2.9
+
 import 'dart:ffi';
 import 'dart:isolate';
 
@@ -26,8 +28,8 @@
   print("C T2 = Some C thread executing C.");
   print("C    = C T1 or C T2.");
   print("Dart: Setup.");
-  Expect.isTrue(NativeApi.majorVersion == 1);
-  Expect.isTrue(NativeApi.minorVersion >= 1);
+  Expect.isTrue(NativeApi.majorVersion == 2);
+  Expect.isTrue(NativeApi.minorVersion >= 0);
   final initializeApi = dl.lookupFunction<IntPtr Function(Pointer<Void>),
       int Function(Pointer<Void>)>("InitDartApiDL");
   Expect.isTrue(initializeApi(NativeApi.initializeApiDLData) == 0);
diff --git a/samples/ffi/async/sample_native_port_call.dart b/samples/ffi/async/sample_native_port_call.dart
index 43891e2..a2c3ee4 100644
--- a/samples/ffi/async/sample_native_port_call.dart
+++ b/samples/ffi/async/sample_native_port_call.dart
@@ -16,6 +16,8 @@
 // The advantage is that finalizers can be used when passing ownership of data
 // (buffers) from C to Dart.
 
+// @dart = 2.9
+
 import 'dart:ffi';
 import 'dart:isolate';
 import 'dart:typed_data';
@@ -35,8 +37,8 @@
   print("C T2 = Some C thread executing C.");
   print("C    = C T1 or C T2.");
   print("Dart: Setup.");
-  Expect.isTrue(NativeApi.majorVersion == 1);
-  Expect.isTrue(NativeApi.minorVersion >= 1);
+  Expect.isTrue(NativeApi.majorVersion == 2);
+  Expect.isTrue(NativeApi.minorVersion >= 0);
   final initializeApi = dl.lookupFunction<IntPtr Function(Pointer<Void>),
       int Function(Pointer<Void>)>("InitDartApiDL");
   Expect.isTrue(initializeApi(NativeApi.initializeApiDLData) == 0);
diff --git a/samples/ffi/coordinate.dart b/samples/ffi/coordinate.dart
index c5d96a2..4ff34f5 100644
--- a/samples/ffi/coordinate.dart
+++ b/samples/ffi/coordinate.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 import 'dart:ffi';
 
 import "package:ffi/ffi.dart";
diff --git a/samples/ffi/dylib_utils.dart b/samples/ffi/dylib_utils.dart
index 7304a7e..39653fa 100644
--- a/samples/ffi/dylib_utils.dart
+++ b/samples/ffi/dylib_utils.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 import 'dart:ffi';
 import 'dart:io' show Platform;
 
diff --git a/samples/ffi/resource_management/pool.dart b/samples/ffi/resource_management/pool.dart
index 7064f9f..776c331 100644
--- a/samples/ffi/resource_management/pool.dart
+++ b/samples/ffi/resource_management/pool.dart
@@ -4,6 +4,8 @@
 //
 // Explicit pool used for managing resources.
 
+// @dart = 2.9
+
 import "dart:async";
 import 'dart:convert';
 import 'dart:ffi';
diff --git a/samples/ffi/resource_management/pool_isolate_shutdown_sample.dart b/samples/ffi/resource_management/pool_isolate_shutdown_sample.dart
index 9e7b16b..8d3401b 100644
--- a/samples/ffi/resource_management/pool_isolate_shutdown_sample.dart
+++ b/samples/ffi/resource_management/pool_isolate_shutdown_sample.dart
@@ -4,6 +4,8 @@
 //
 // Sample illustrating resources are not cleaned up when isolate is shutdown.
 
+// @dart = 2.9
+
 import 'dart:io';
 import "dart:isolate";
 import 'dart:ffi';
diff --git a/samples/ffi/resource_management/pool_sample.dart b/samples/ffi/resource_management/pool_sample.dart
index 00ee1ae..87c5e39 100644
--- a/samples/ffi/resource_management/pool_sample.dart
+++ b/samples/ffi/resource_management/pool_sample.dart
@@ -4,6 +4,8 @@
 //
 // Sample illustrating resource management with an explicit pool.
 
+// @dart = 2.9
+
 import 'dart:ffi';
 
 import 'package:expect/expect.dart';
diff --git a/samples/ffi/resource_management/pool_zoned_sample.dart b/samples/ffi/resource_management/pool_zoned_sample.dart
index 05f1794..0b4e8ff 100644
--- a/samples/ffi/resource_management/pool_zoned_sample.dart
+++ b/samples/ffi/resource_management/pool_zoned_sample.dart
@@ -4,6 +4,8 @@
 //
 // Sample illustrating resource management with an implicit pool in the zone.
 
+// @dart = 2.9
+
 import 'dart:ffi';
 
 import 'package:expect/expect.dart';
diff --git a/samples/ffi/resource_management/resource_management_test.dart b/samples/ffi/resource_management/resource_management_test.dart
index 1cc14f7..4b2bbb0 100644
--- a/samples/ffi/resource_management/resource_management_test.dart
+++ b/samples/ffi/resource_management/resource_management_test.dart
@@ -6,6 +6,8 @@
 //
 // SharedObjects=ffi_test_dynamic_library ffi_test_functions
 
+// @dart = 2.9
+
 import 'pool_isolate_shutdown_sample.dart' as pool_isolate;
 import 'pool_sample.dart' as pool;
 import 'pool_zoned_sample.dart' as pool_zoned;
diff --git a/samples/ffi/resource_management/unmanaged_sample.dart b/samples/ffi/resource_management/unmanaged_sample.dart
index 9c3e0f0..b8c9971 100644
--- a/samples/ffi/resource_management/unmanaged_sample.dart
+++ b/samples/ffi/resource_management/unmanaged_sample.dart
@@ -4,6 +4,8 @@
 //
 // Sample illustrating manual resource management, not advised.
 
+// @dart = 2.9
+
 import 'dart:ffi';
 
 import 'package:expect/expect.dart';
diff --git a/samples/ffi/sample_ffi_bitfield.dart b/samples/ffi/sample_ffi_bitfield.dart
index 0d91d47..91bb65d 100644
--- a/samples/ffi/sample_ffi_bitfield.dart
+++ b/samples/ffi/sample_ffi_bitfield.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 import 'dart:ffi';
 
 import 'package:ffi/ffi.dart';
diff --git a/samples/ffi/sample_ffi_data.dart b/samples/ffi/sample_ffi_data.dart
index 8e713d0..09dba76 100644
--- a/samples/ffi/sample_ffi_data.dart
+++ b/samples/ffi/sample_ffi_data.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 import 'dart:ffi';
 import 'package:ffi/ffi.dart';
 
diff --git a/samples/ffi/sample_ffi_dynamic_library.dart b/samples/ffi/sample_ffi_dynamic_library.dart
index 28772ff..94863d0 100644
--- a/samples/ffi/sample_ffi_dynamic_library.dart
+++ b/samples/ffi/sample_ffi_dynamic_library.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 import 'dart:ffi';
 
 import 'dylib_utils.dart';
diff --git a/samples/ffi/sample_ffi_functions.dart b/samples/ffi/sample_ffi_functions.dart
index ed641e9..4cd30b0 100644
--- a/samples/ffi/sample_ffi_functions.dart
+++ b/samples/ffi/sample_ffi_functions.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 import 'dart:ffi';
 
 import 'package:ffi/ffi.dart';
diff --git a/samples/ffi/sample_ffi_functions_callbacks.dart b/samples/ffi/sample_ffi_functions_callbacks.dart
index affdcef..79f9a41 100644
--- a/samples/ffi/sample_ffi_functions_callbacks.dart
+++ b/samples/ffi/sample_ffi_functions_callbacks.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 import 'dart:ffi';
 
 import 'coordinate.dart';
diff --git a/samples/ffi/sample_ffi_functions_callbacks_closures.dart b/samples/ffi/sample_ffi_functions_callbacks_closures.dart
index e5bb157..a6ce9a6 100644
--- a/samples/ffi/sample_ffi_functions_callbacks_closures.dart
+++ b/samples/ffi/sample_ffi_functions_callbacks_closures.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 import 'dart:ffi';
 
 import 'package:expect/expect.dart';
@@ -53,8 +55,8 @@
     Pointer.fromFunction<Void Function(Handle)>(doClosureCallback);
 
 void doDynamicLinking() {
-  Expect.isTrue(NativeApi.majorVersion == 1);
-  Expect.isTrue(NativeApi.minorVersion >= 1);
+  Expect.isTrue(NativeApi.majorVersion == 2);
+  Expect.isTrue(NativeApi.minorVersion >= 0);
   final initializeApi = testLibrary.lookupFunction<
       IntPtr Function(Pointer<Void>),
       int Function(Pointer<Void>)>("InitDartApiDL");
diff --git a/samples/ffi/sample_ffi_functions_structs.dart b/samples/ffi/sample_ffi_functions_structs.dart
index 9aefb57..7129658 100644
--- a/samples/ffi/sample_ffi_functions_structs.dart
+++ b/samples/ffi/sample_ffi_functions_structs.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 import 'dart:ffi';
 
 import 'coordinate.dart';
diff --git a/samples/ffi/sample_ffi_structs.dart b/samples/ffi/sample_ffi_structs.dart
index bd6d7c7..d5af59e 100644
--- a/samples/ffi/sample_ffi_structs.dart
+++ b/samples/ffi/sample_ffi_structs.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 import 'dart:ffi';
 
 import 'package:ffi/ffi.dart';
diff --git a/samples/ffi/samples_test.dart b/samples/ffi/samples_test.dart
index 954aa9c..a3674a4 100644
--- a/samples/ffi/samples_test.dart
+++ b/samples/ffi/samples_test.dart
@@ -6,6 +6,8 @@
 //
 // SharedObjects=ffi_test_dynamic_library ffi_test_functions
 
+// @dart = 2.9
+
 import 'sample_ffi_bitfield.dart' as bitfield;
 import 'sample_ffi_data.dart' as data;
 import 'sample_ffi_dynamic_library.dart' as dynamic_library;
diff --git a/samples/ffi/sqlite/docs/sqlite-tutorial.md b/samples/ffi/sqlite/docs/sqlite-tutorial.md
index 9b8e7e1..c7ea858 100644
--- a/samples/ffi/sqlite/docs/sqlite-tutorial.md
+++ b/samples/ffi/sqlite/docs/sqlite-tutorial.md
@@ -92,9 +92,9 @@
 
 ```dart
 CString string = allocate(count: 4).cast(); // Allocates 4 bytes and casts it to a string.
-string.value = 73;                          // Stores 'F' at index 0.
-string[1] = 73;                             // Stores 'F' at index 1.
-string[2] = 70;                             // Stores 'I' at index 2.
+string.value = 70;                          // Stores 'F' at index 0.
+string[1] = 70;                             // Stores 'F' at index 1.
+string[2] = 73;                             // Stores 'I' at index 2.
 string[3] = 0;                              // Null terminates the string.
 ```
 
diff --git a/samples/ffi/sqlite/example/main.dart b/samples/ffi/sqlite/example/main.dart
index 480ef42..6af01d4 100644
--- a/samples/ffi/sqlite/example/main.dart
+++ b/samples/ffi/sqlite/example/main.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 import "../lib/sqlite.dart";
 
 void main() {
diff --git a/samples/ffi/sqlite/lib/sqlite.dart b/samples/ffi/sqlite/lib/sqlite.dart
index d6bac5b..825e434 100644
--- a/samples/ffi/sqlite/lib/sqlite.dart
+++ b/samples/ffi/sqlite/lib/sqlite.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 /// A synchronous SQLite wrapper.
 ///
 /// Written using dart:ffi.
diff --git a/samples/ffi/sqlite/lib/src/bindings/bindings.dart b/samples/ffi/sqlite/lib/src/bindings/bindings.dart
index 0271506..a1cdba7 100644
--- a/samples/ffi/sqlite/lib/src/bindings/bindings.dart
+++ b/samples/ffi/sqlite/lib/src/bindings/bindings.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 import "dart:ffi";
 import "package:ffi/ffi.dart";
 
diff --git a/samples/ffi/sqlite/lib/src/bindings/constants.dart b/samples/ffi/sqlite/lib/src/bindings/constants.dart
index 71aa82e..120d567 100644
--- a/samples/ffi/sqlite/lib/src/bindings/constants.dart
+++ b/samples/ffi/sqlite/lib/src/bindings/constants.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 /// Result Codes
 ///
 /// Many SQLite functions return an integer result code from the set shown
diff --git a/samples/ffi/sqlite/lib/src/bindings/signatures.dart b/samples/ffi/sqlite/lib/src/bindings/signatures.dart
index 2f38dad..8e5d6e6 100644
--- a/samples/ffi/sqlite/lib/src/bindings/signatures.dart
+++ b/samples/ffi/sqlite/lib/src/bindings/signatures.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 import "dart:ffi";
 
 import "package:ffi/ffi.dart";
diff --git a/samples/ffi/sqlite/lib/src/bindings/types.dart b/samples/ffi/sqlite/lib/src/bindings/types.dart
index 494cdef..f6a1736 100644
--- a/samples/ffi/sqlite/lib/src/bindings/types.dart
+++ b/samples/ffi/sqlite/lib/src/bindings/types.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 import "dart:ffi";
 
 /// Database Connection Handle
diff --git a/samples/ffi/sqlite/lib/src/collections/closable_iterator.dart b/samples/ffi/sqlite/lib/src/collections/closable_iterator.dart
index a86a58b..83ca2ba 100644
--- a/samples/ffi/sqlite/lib/src/collections/closable_iterator.dart
+++ b/samples/ffi/sqlite/lib/src/collections/closable_iterator.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 /// This iterator should be [close]d after use.
 ///
 /// [ClosableIterator]s often use resources which should be freed after use.
diff --git a/samples/ffi/sqlite/lib/src/database.dart b/samples/ffi/sqlite/lib/src/database.dart
index be2b7ef..38121a9 100644
--- a/samples/ffi/sqlite/lib/src/database.dart
+++ b/samples/ffi/sqlite/lib/src/database.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 import "dart:collection";
 import "dart:ffi";
 
diff --git a/samples/ffi/sqlite/lib/src/ffi/arena.dart b/samples/ffi/sqlite/lib/src/ffi/arena.dart
index d01b64f..a26e807 100644
--- a/samples/ffi/sqlite/lib/src/ffi/arena.dart
+++ b/samples/ffi/sqlite/lib/src/ffi/arena.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 import "dart:async";
 import "dart:ffi";
 
diff --git a/samples/ffi/sqlite/lib/src/ffi/dylib_utils.dart b/samples/ffi/sqlite/lib/src/ffi/dylib_utils.dart
index 7304a7e..39653fa 100644
--- a/samples/ffi/sqlite/lib/src/ffi/dylib_utils.dart
+++ b/samples/ffi/sqlite/lib/src/ffi/dylib_utils.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 import 'dart:ffi';
 import 'dart:io' show Platform;
 
diff --git a/samples/ffi/sqlite/test/sqlite_test.dart b/samples/ffi/sqlite/test/sqlite_test.dart
index 7bef552..f7d3744 100644
--- a/samples/ffi/sqlite/test/sqlite_test.dart
+++ b/samples/ffi/sqlite/test/sqlite_test.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 // VMOptions=--optimization-counter-threshold=5
 
 import "dart:ffi";
diff --git a/samples/sample_extension/sample_asynchronous_extension.dart b/samples/sample_extension/sample_asynchronous_extension.dart
index 6b81369..541652d 100644
--- a/samples/sample_extension/sample_asynchronous_extension.dart
+++ b/samples/sample_extension/sample_asynchronous_extension.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 library sample_asynchronous_extension;
 
 import 'dart:async';
diff --git a/samples/sample_extension/sample_synchronous_extension.dart b/samples/sample_extension/sample_synchronous_extension.dart
index 727cd4c..e5ad660 100644
--- a/samples/sample_extension/sample_synchronous_extension.dart
+++ b/samples/sample_extension/sample_synchronous_extension.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 library sample_synchronous_extension;
 
 import 'dart-ext:sample_extension';
diff --git a/samples/sample_extension/test/sample_extension_app_snapshot_test.dart b/samples/sample_extension/test/sample_extension_app_snapshot_test.dart
index 558b108..b2eb204 100644
--- a/samples/sample_extension/test/sample_extension_app_snapshot_test.dart
+++ b/samples/sample_extension/test/sample_extension_app_snapshot_test.dart
@@ -4,6 +4,8 @@
 //
 // Dart test program for testing native extensions.
 
+// @dart = 2.9
+
 // OtherResources=../sample_synchronous_extension.dart
 // OtherResources=../sample_asynchronous_extension.dart
 // OtherResources=../test_sample_synchronous_extension.dart
diff --git a/samples/sample_extension/test/sample_extension_test.dart b/samples/sample_extension/test/sample_extension_test.dart
index 4311ff5..393463b 100644
--- a/samples/sample_extension/test/sample_extension_test.dart
+++ b/samples/sample_extension/test/sample_extension_test.dart
@@ -4,6 +4,8 @@
 //
 // Dart test program for testing native extensions.
 
+// @dart = 2.9
+
 import 'sample_extension_test_helper.dart';
 
 void main() {
diff --git a/samples/sample_extension/test/sample_extension_test_helper.dart b/samples/sample_extension/test/sample_extension_test_helper.dart
index 157942c..9c701bf 100644
--- a/samples/sample_extension/test/sample_extension_test_helper.dart
+++ b/samples/sample_extension/test/sample_extension_test_helper.dart
@@ -4,6 +4,8 @@
 //
 // Dart test program for testing native extensions.
 
+// @dart = 2.9
+
 import 'dart:async';
 import 'dart:io';
 import 'dart:isolate';
diff --git a/samples/sample_extension/test_sample_asynchronous_extension.dart b/samples/sample_extension/test_sample_asynchronous_extension.dart
index d8bea7e..5ceb7c8 100644
--- a/samples/sample_extension/test_sample_asynchronous_extension.dart
+++ b/samples/sample_extension/test_sample_asynchronous_extension.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 library test_sample_extension;
 
 import 'sample_asynchronous_extension.dart';
diff --git a/samples/sample_extension/test_sample_synchronous_extension.dart b/samples/sample_extension/test_sample_synchronous_extension.dart
index ac17724..77d2fc3 100644
--- a/samples/sample_extension/test_sample_synchronous_extension.dart
+++ b/samples/sample_extension/test_sample_synchronous_extension.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 library test_sample_extension;
 
 import 'sample_synchronous_extension.dart';
diff --git a/sdk/BUILD.gn b/sdk/BUILD.gn
index 9444e50..392c905 100644
--- a/sdk/BUILD.gn
+++ b/sdk/BUILD.gn
@@ -586,16 +586,17 @@
   visibility = [ ":create_common_sdk" ]
   deps = [
     ":copy_libraries",
-    "../third_party/wasmer:wasmer_wrapper",
+    "../third_party/wasmer:wasmer",
   ]
   outputs =
       [ "$root_out_dir/dart-sdk/bin/third_party/wasmer/{{source_file_part}}" ]
   if (is_win) {
-    sources = [ "$root_out_dir/wasmer_wrapper.dll" ]
+    sources = [ "$target_out_dir/../third_party/wasmer/wasmer.dll" ]
   } else if (is_mac) {
-    sources = [ "$root_out_dir/libwasmer_wrapper.dylib" ]
+    sources = [ "$target_out_dir/../third_party/wasmer/libwasmer.dylib" ]
   } else {
-    sources = [ "$root_out_dir/libwasmer_wrapper.so" ]
+    # TODO(dartbug.com/37882): Support Fuchsia.
+    sources = [ "$target_out_dir/../third_party/wasmer/libwasmer.so" ]
   }
 }
 
diff --git a/sdk/lib/_internal/allowed_experiments.json b/sdk/lib/_internal/allowed_experiments.json
index aadacfe..4644443 100644
--- a/sdk/lib/_internal/allowed_experiments.json
+++ b/sdk/lib/_internal/allowed_experiments.json
@@ -34,6 +34,12 @@
     "collection": {
       "experimentSet": "nullSafety"
     },
+    "connectivity": {
+      "experimentSet": "nullSafety"
+    },
+    "connectivity_platform_interface": {
+      "experimentSet": "nullSafety"
+    },
     "convert": {
       "experimentSet": "nullSafety"
     },
@@ -46,6 +52,12 @@
     "dart_internal": {
       "experimentSet": "nullSafety"
     },
+    "device_info": {
+      "experimentSet": "nullSafety"
+    },
+    "device_info_platform_interface": {
+      "experimentSet": "nullSafety"
+    },
     "fake_async": {
       "experimentSet": "nullSafety"
     },
@@ -94,6 +106,12 @@
     "native_stack_traces": {
       "experimentSet": "nullSafety"
     },
+    "observatory": {
+      "experimentSet": "nullSafety"
+    },
+    "observatory_test_package": {
+      "experimentSet": "nullSafety"
+    },
     "path": {
       "experimentSet": "nullSafety"
     },
@@ -103,6 +121,9 @@
     "platform": {
       "experimentSet": "nullSafety"
     },
+    "plugin_platform_interface": {
+      "experimentSet": "nullSafety"
+    },
     "pool": {
       "experimentSet": "nullSafety"
     },
@@ -148,8 +169,32 @@
     "typed_data": {
       "experimentSet": "nullSafety"
     },
+    "url_launcher": {
+      "experimentSet": "nullSafety"
+    },
+    "url_launcher_linux": {
+      "experimentSet": "nullSafety"
+    },
+    "url_launcher_macos": {
+      "experimentSet": "nullSafety"
+    },
+    "url_launcher_platform_interface": {
+      "experimentSet": "nullSafety"
+    },
+    "url_launcher_windows": {
+      "experimentSet": "nullSafety"
+    },
     "vector_math": {
       "experimentSet": "nullSafety"
+    },
+    "video_player": {
+      "experimentSet": "nullSafety"
+    },
+    "video_player_platform_interface": {
+      "experimentSet": "nullSafety"
+    },
+    "video_player_web": {
+      "experimentSet": "nullSafety"
     }
   }
 }
diff --git a/sdk/lib/_internal/js_dev_runtime/patch/core_patch.dart b/sdk/lib/_internal/js_dev_runtime/patch/core_patch.dart
index 5916674..296d654 100644
--- a/sdk/lib/_internal/js_dev_runtime/patch/core_patch.dart
+++ b/sdk/lib/_internal/js_dev_runtime/patch/core_patch.dart
@@ -508,11 +508,15 @@
     // runtime check.
     if (elements is Iterable<E>) {
       for (var e in elements) {
-        list.add(e);
+        // Unsafe add here to avoid extra casts and growable checks enforced by
+        // the exposed add method.
+        JS('', '#.push(#)', list, e);
       }
     } else {
       for (var e in elements) {
-        list.add(e as E);
+        // Unsafe add here to avoid extra casts and growable checks enforced by
+        // the exposed add method.
+        JS('', '#.push(#)', list, e as E);
       }
     }
     if (!growable) JSArray.markFixedList(list);
@@ -521,8 +525,14 @@
 
   @patch
   factory List.of(Iterable<E> elements, {bool growable = true}) {
-    // TODO(32937): Specialize to benefit from known element type.
-    return List.from(elements, growable: growable);
+    var list = JSArray<E>.of(JS('', '[]'));
+    for (var e in elements) {
+      // Unsafe add here to avoid extra casts and growable checks enforced by
+      // the exposed add method.
+      JS('', '#.push(#)', list, e);
+    }
+    if (!growable) JSArray.markFixedList(list);
+    return list;
   }
 
   @patch
@@ -531,7 +541,9 @@
     final result = JSArray<E>.of(JS('', 'new Array(#)', length));
     if (!growable) JSArray.markFixedList(result);
     for (int i = 0; i < length; i++) {
-      result[i] = generator(i);
+      // Unsafe assignment here to avoid extra casts enforced by the exposed
+      // []= operator.
+      JS('', '#[#] = #', result, i, generator(i));
     }
     return result;
   }
diff --git a/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/classes.dart b/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/classes.dart
index 8261822..d862534 100644
--- a/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/classes.dart
+++ b/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/classes.dart
@@ -107,7 +107,11 @@
 @JSExportName('implements')
 final implements_ = JS('', 'Symbol("implements")');
 
-List? Function() getImplements(clazz) => JS(
+/// Either `null` if `clazz` doesn't directly implement any interfaces or a
+/// list of type objects if it does.  Note, indirectly (e.g., via superclass)
+/// implemented interfaces aren't included here.
+/// See compiler.dart for when/how it is emitted.
+List Function()? getImplements(clazz) => JS(
     '',
     'Object.hasOwnProperty.call(#, #) ? #[#] : null',
     clazz,
@@ -164,6 +168,29 @@
     // as a FutureOr because it is equal to 'async.FutureOr` (in the JS).
     JS('!', '#[#] = #', genericType, _originalDeclaration, normalize);
     JS('!', '#(#)', addTypeCaches, genericType);
+    // Add FutureOr specific is and as methods.
+    is_FutureOr(obj) =>
+        JS<bool>('!', '#.is(#)', typeArg, obj) ||
+        JS<bool>('!', '#(#).is(#)', getGenericClass(Future), typeArg, obj);
+    JS('!', '#.is = #', genericType, is_FutureOr);
+
+    as_FutureOr(obj) {
+      // Special test to handle case for mixed mode non-nullable FutureOr of a
+      // legacy type. This allows casts like `null as FutureOr<int*>` to work
+      // in weak and sound mode.
+      if (obj == null && _jsInstanceOf(typeArg, LegacyType)) {
+        return obj;
+      }
+
+      if (JS<bool>('!', '#.is(#)', typeArg, obj) ||
+          JS<bool>('!', '#(#).is(#)', getGenericClass(Future), typeArg, obj)) {
+        return obj;
+      }
+      return cast(obj, JS('!', '#(#)', getGenericClass(FutureOr), typeArg));
+    }
+
+    JS('!', '#.as = #', genericType, as_FutureOr);
+
     return genericType;
   }
 
@@ -272,13 +299,11 @@
 getType(obj) {
   if (obj == null) return JS('!', '#', Object);
 
-  if (JS<bool>('!', '#.__proto__ == null', obj)) {
-    // Object.create(null) produces a js object without a prototype.
-    // In that case use the version from a js object literal.
-    return JS('!', '#.Object.prototype.constructor', global_);
-  }
-
-  return JS('!', '#.__proto__.constructor', obj);
+  // Object.create(null) produces a js object without a prototype.
+  // In that case use the native Object constructor.
+  var constructor = JS('!', '#.constructor', obj);
+  return JS('!', '# ? # : #.Object.prototype.constructor', constructor,
+      constructor, global_);
 }
 
 getLibraryUri(value) => JS('', '#[#]', value, _libraryUri);
diff --git a/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/errors.dart b/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/errors.dart
index 13ab061..3ec1689 100644
--- a/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/errors.dart
+++ b/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/errors.dart
@@ -44,7 +44,7 @@
 }
 
 throwLateInitializationError(String name) {
-  throw internal.LateInitializationErrorImpl(name);
+  throw internal.LateError(name);
 }
 
 throwCyclicInitializationError([String? field]) {
diff --git a/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/operations.dart b/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/operations.dart
index 6fcd3d1..4a224cd 100644
--- a/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/operations.dart
+++ b/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/operations.dart
@@ -82,7 +82,7 @@
 ///
 /// We need to apply the type arguments both to the function, as well as its
 /// associated function type.
-gbind(f, @rest List typeArgs) {
+gbind(f, @rest List<Object> typeArgs) {
   GenericFunctionType type = JS('!', '#[#]', f, _runtimeType);
   type.checkBounds(typeArgs);
   // Create a JS wrapper function that will also pass the type arguments, and
@@ -872,8 +872,15 @@
 })()''');
 
 checkNativeNonNull(dynamic variable) {
-  if (_nativeNonNullAsserts) {
-    return nullCheck(variable);
+  if (_nativeNonNullAsserts && variable == null) {
+    // TODO(srujzs): Add link/patch for instructions to disable in internal
+    // build systems.
+    throw TypeErrorImpl('''
+      Unexpected null value encountered in Dart web platform libraries.
+      This may be a bug in the Dart SDK APIs. If you would like to report a bug
+      or disable this error, you can use the following instructions:
+      https://github.com/dart-lang/sdk/tree/master/sdk/lib/html/doc/NATIVE_NULL_ASSERTIONS.md
+    ''');
   }
   return variable;
 }
diff --git a/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/runtime.dart b/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/runtime.dart
index 3738a3d..21c6f31 100644
--- a/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/runtime.dart
+++ b/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/runtime.dart
@@ -11,7 +11,7 @@
 import 'dart:_debugger' show stackTraceMapper, trackCall;
 import 'dart:_foreign_helper' show JS, JSExportName, rest, spread;
 import 'dart:_interceptors' show JSArray, jsNull, JSFunction, NativeError;
-import 'dart:_internal' as internal show LateInitializationErrorImpl, Symbol;
+import 'dart:_internal' as internal show LateError, Symbol;
 import 'dart:_js_helper'
     show
         AssertionErrorImpl,
diff --git a/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/types.dart b/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/types.dart
index 31e7e91..bac9226 100644
--- a/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/types.dart
+++ b/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/types.dart
@@ -48,7 +48,10 @@
 bool _nativeNonNullAsserts = false;
 
 /// Enables null assertions on native APIs to make sure value returned from the
-/// browser is sound. These apply to dart:html and similar web libraries.
+/// browser is sound.
+///
+/// These apply to dart:html and similar web libraries. Note that these only are
+/// added in sound null-safety only.
 void nativeNonNullAsserts(bool enable) {
   _nativeNonNullAsserts = enable;
 }
@@ -932,11 +935,11 @@
   List<TypeVariable> get typeFormals => _typeFormals;
 
   /// `true` if there are bounds on any of the generic type parameters.
-  get hasTypeBounds => _instantiateTypeBounds != null;
+  bool get hasTypeBounds => _instantiateTypeBounds != null;
 
   /// Checks that [typeArgs] satisfies the upper bounds of the [typeFormals],
   /// and throws a [TypeError] if they do not.
-  void checkBounds(List typeArgs) {
+  void checkBounds(List<Object> typeArgs) {
     // If we don't have explicit type parameter bounds, the bounds default to
     // a top type, so there's nothing to check here.
     if (!hasTypeBounds) return;
@@ -1290,7 +1293,7 @@
 
 /// Returns true if [t1] <: [t2].
 @notNull
-bool isSubtypeOf(@notNull Object t1, @notNull Object t2) {
+bool isSubtypeOf(@notNull t1, @notNull t2) {
   // TODO(jmesserly): we've optimized `is`/`as`/implicit type checks, so they're
   // dispatched on the type. Can we optimize the subtype relation too?
   var map = JS<Object>('!', '#[#]', t1, _subtypeCache);
@@ -2042,7 +2045,7 @@
   // Check interfaces.
   var getInterfaces = getImplements(subtype);
   if (getInterfaces != null) {
-    for (var iface in getInterfaces()!) {
+    for (var iface in getInterfaces()) {
       result = _getMatchingSupertype(iface, supertype);
       if (result != null) return result;
     }
diff --git a/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/utils.dart b/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/utils.dart
index 07a2faa..b933c8f 100644
--- a/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/utils.dart
+++ b/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/utils.dart
@@ -8,7 +8,7 @@
 /// by the Dart runtime.
 // TODO(ochafik): Rewrite some of these in Dart when possible.
 
-final Function(Object, Object, Object) defineProperty =
+final Function(dynamic, dynamic, dynamic) defineProperty =
     JS('', 'Object.defineProperty');
 
 defineValue(obj, name, value) {
@@ -16,23 +16,23 @@
   return value;
 }
 
-final Function(Object, Object,
-    {Object? get,
-    Object? set,
-    Object? value,
+final Function(dynamic, dynamic,
+    {dynamic get,
+    dynamic set,
+    dynamic value,
     bool? configurable,
     bool? writable}) defineAccessor = JS('', 'Object.defineProperty');
 
-final dynamic Function(Object, Object) getOwnPropertyDescriptor =
+final dynamic Function(dynamic, dynamic) getOwnPropertyDescriptor =
     JS('', 'Object.getOwnPropertyDescriptor');
 
-final List Function(Object) getOwnPropertyNames =
+final List Function(dynamic) getOwnPropertyNames =
     JS('', 'Object.getOwnPropertyNames');
 
-final List Function(Object) getOwnPropertySymbols =
+final List Function(dynamic) getOwnPropertySymbols =
     JS('', 'Object.getOwnPropertySymbols');
 
-final Function(Object) getPrototypeOf = JS('', 'Object.getPrototypeOf');
+final Function(dynamic) getPrototypeOf = JS('', 'Object.getPrototypeOf');
 
 /// This error indicates a strong mode specific failure, other than a type
 /// assertion failure (TypeError) or CastError.
diff --git a/sdk/lib/_internal/js_dev_runtime/private/debugger.dart b/sdk/lib/_internal/js_dev_runtime/private/debugger.dart
index f77d5c3..1f9e933 100644
--- a/sdk/lib/_internal/js_dev_runtime/private/debugger.dart
+++ b/sdk/lib/_internal/js_dev_runtime/private/debugger.dart
@@ -264,7 +264,7 @@
   final List types;
 }
 
-Object safeGetProperty(Object protoChain, Object name) {
+Object? safeGetProperty(Object protoChain, Object name) {
   try {
     return JSNative.getProperty(protoChain, name);
   } catch (e) {
@@ -609,7 +609,7 @@
     for (var name in getOwnPropertyNames(object)) {
       var value = safeGetProperty(object, name);
       children.add(NameValuePair(
-          name: name, value: Library(name, value), hideName: true));
+          name: name, value: Library(name, value!), hideName: true));
     }
     return children.toList();
   }
@@ -907,10 +907,10 @@
   bool accept(object, config) => config == JsonMLConfig.asClass;
 
   String preview(type) {
-    var implements = dart.getImplements(type)();
+    var implements = dart.getImplements(type);
     var typeName = getTypeName(type);
     if (implements != null) {
-      var typeNames = implements.map(getTypeName);
+      var typeNames = implements().map(getTypeName);
       return '${typeName} implements ${typeNames.join(", ")}';
     } else {
       return typeName;
diff --git a/sdk/lib/_internal/js_dev_runtime/private/interceptors.dart b/sdk/lib/_internal/js_dev_runtime/private/interceptors.dart
index 04d492f..72fff96 100644
--- a/sdk/lib/_internal/js_dev_runtime/private/interceptors.dart
+++ b/sdk/lib/_internal/js_dev_runtime/private/interceptors.dart
@@ -66,6 +66,14 @@
   E operator [](int index);
 }
 
+/// The supertype for JSMutableArray and JavaScriptIndexingBehavior.
+///
+// TODO(nshahan) Use as a type mask that contains the objects we can use the JS
+// []= operator on.
+abstract class JSMutableIndexable<E> extends JSIndexable<E> {
+  operator []=(int index, E value);
+}
+
 /**
  * The interface implemented by JavaScript objects.  These are methods in
  * addition to the regular Dart Object methods like [Object.hashCode].
diff --git a/sdk/lib/_internal/js_dev_runtime/private/js_array.dart b/sdk/lib/_internal/js_dev_runtime/private/js_array.dart
index 0f1eb4b..3d5e3d7 100644
--- a/sdk/lib/_internal/js_dev_runtime/private/js_array.dart
+++ b/sdk/lib/_internal/js_dev_runtime/private/js_array.dart
@@ -157,7 +157,9 @@
       var element = JS<E>('', '#[#]', this, i);
       // !test() ensures bool conversion in checked mode.
       if (!test(element) == removeMatching) {
-        retained.add(element);
+        // Unsafe add here to avoid extra casts and growable checks enforced by
+        // the exposed add method.
+        JS('', '#.push(#)', retained, element);
       }
       if (this.length != end) throw ConcurrentModificationError(this);
     }
@@ -645,7 +647,7 @@
  * these classes can have specialized implementations. Doing so will challenge
  * many assumptions in the JS backend.
  */
-class JSMutableArray<E> extends JSArray<E> {}
+class JSMutableArray<E> extends JSArray<E> implements JSMutableIndexable<E> {}
 
 class JSFixedArray<E> extends JSMutableArray<E> {}
 
diff --git a/sdk/lib/_internal/js_dev_runtime/private/js_helper.dart b/sdk/lib/_internal/js_dev_runtime/private/js_helper.dart
index 772263c..c49608a 100644
--- a/sdk/lib/_internal/js_dev_runtime/private/js_helper.dart
+++ b/sdk/lib/_internal/js_dev_runtime/private/js_helper.dart
@@ -692,7 +692,7 @@
  * objects that support integer indexing. This interface is not
  * visible to anyone, and is only injected into special libraries.
  */
-abstract class JavaScriptIndexingBehavior<E> {}
+abstract class JavaScriptIndexingBehavior<E> extends JSMutableIndexable<E> {}
 
 /// Thrown by type assertions that fail.
 class TypeErrorImpl extends Error implements TypeError, CastError {
diff --git a/sdk/lib/_internal/js_dev_runtime/private/native_typed_data.dart b/sdk/lib/_internal/js_dev_runtime/private/native_typed_data.dart
index e98c6c1..a36132b 100644
--- a/sdk/lib/_internal/js_dev_runtime/private/native_typed_data.dart
+++ b/sdk/lib/_internal/js_dev_runtime/private/native_typed_data.dart
@@ -392,9 +392,9 @@
   /// If the length is not specified, it defaults to null, which indicates
   /// that the view extends to the end of the byte buffer.
   ///
-  /// Throws [RangeError] if [offsetInBytes] or [length] are negative, or
-  /// if [offsetInBytes] + ([length] * elementSizeInBytes) is greater than
-  /// the length of [buffer].
+  /// The [offsetInBytes] and [length] must be non-negative, and
+  /// [offsetInBytes] + ([length] * elementSizeInBytes) must be less than or
+  /// equal to the length of [buffer].
   factory NativeByteData.view(
       ByteBuffer buffer, int offsetInBytes, int? length) {
     _checkViewArguments(buffer, offsetInBytes, length);
@@ -411,8 +411,8 @@
   /// the specified [byteOffset] in this object, in IEEE 754
   /// single-precision binary floating-point format (binary32).
   ///
-  /// Throws [RangeError] if [byteOffset] is negative, or
-  /// `byteOffset + 4` is greater than the length of this object.
+  /// The [byteOffset] must be non-negative, and
+  /// `byteOffset + 4` must be less than or equal to the length of this object.
   double getFloat32(int byteOffset, [Endian endian = Endian.big]) =>
       _getFloat32(byteOffset, Endian.little == endian);
 
@@ -424,8 +424,8 @@
   /// the specified [byteOffset] in this object, in IEEE 754
   /// double-precision binary floating-point format (binary64).
   ///
-  /// Throws [RangeError] if [byteOffset] is negative, or
-  /// `byteOffset + 8` is greater than the length of this object.
+  /// The [byteOffset] must be non-negative, and
+  /// `byteOffset + 8` must be less than or equal to the length of this object.
   double getFloat64(int byteOffset, [Endian endian = Endian.big]) =>
       _getFloat64(byteOffset, Endian.little == endian);
 
@@ -439,8 +439,8 @@
   /// The return value will be between 2<sup>15</sup> and 2<sup>15</sup> - 1,
   /// inclusive.
   ///
-  /// Throws [RangeError] if [byteOffset] is negative, or
-  /// `byteOffset + 2` is greater than the length of this object.
+  /// The [byteOffset] must be non-negative, and
+  /// `byteOffset + 2` must be less than or equal to the length of this object.
   int getInt16(int byteOffset, [Endian endian = Endian.big]) =>
       _getInt16(byteOffset, Endian.little == endian);
 
@@ -454,8 +454,8 @@
   /// The return value will be between 2<sup>31</sup> and 2<sup>31</sup> - 1,
   /// inclusive.
   ///
-  /// Throws [RangeError] if [byteOffset] is negative, or
-  /// `byteOffset + 4` is greater than the length of this object.
+  /// The [byteOffset] must be non-negative, and
+  /// `byteOffset + 4` must be less than or equal to the length of this object.
   int getInt32(int byteOffset, [Endian endian = Endian.big]) =>
       _getInt32(byteOffset, Endian.little == endian);
 
@@ -469,8 +469,8 @@
   /// The return value will be between 2<sup>63</sup> and 2<sup>63</sup> - 1,
   /// inclusive.
   ///
-  /// Throws [RangeError] if [byteOffset] is negative, or
-  /// `byteOffset + 8` is greater than the length of this object.
+  /// The [byteOffset] must be non-negative, and
+  /// `byteOffset + 8` must be less than or equal to the length of this object.
   int getInt64(int byteOffset, [Endian endian = Endian.big]) {
     throw UnsupportedError('Int64 accessor not supported by dart2js.');
   }
@@ -479,8 +479,8 @@
   /// specified [byteOffset] in this object, in two's complement binary
   /// representation. The return value will be between -128 and 127, inclusive.
   ///
-  /// Throws [RangeError] if [byteOffset] is negative, or
-  /// greater than or equal to the length of this object.
+  /// The [byteOffset] must be non-negative, and
+  /// less than the length of this object.
   int getInt8(int byteOffset) native;
 
   /// Returns the positive integer represented by the two bytes starting
@@ -488,8 +488,8 @@
   /// form.
   /// The return value will be between 0 and  2<sup>16</sup> - 1, inclusive.
   ///
-  /// Throws [RangeError] if [byteOffset] is negative, or
-  /// `byteOffset + 2` is greater than the length of this object.
+  /// The [byteOffset] must be non-negative, and
+  /// `byteOffset + 2` must be less than or equal to the length of this object.
   int getUint16(int byteOffset, [Endian endian = Endian.big]) =>
       _getUint16(byteOffset, Endian.little == endian);
 
@@ -502,8 +502,8 @@
   /// form.
   /// The return value will be between 0 and  2<sup>32</sup> - 1, inclusive.
   ///
-  /// Throws [RangeError] if [byteOffset] is negative, or
-  /// `byteOffset + 4` is greater than the length of this object.
+  /// The [byteOffset] must be non-negative, and
+  /// `byteOffset + 4` must be less than or equal to the length of this object.
   int getUint32(int byteOffset, [Endian endian = Endian.big]) =>
       _getUint32(byteOffset, Endian.little == endian);
 
@@ -516,8 +516,8 @@
   /// form.
   /// The return value will be between 0 and  2<sup>64</sup> - 1, inclusive.
   ///
-  /// Throws [RangeError] if [byteOffset] is negative, or
-  /// `byteOffset + 8` is greater than the length of this object.
+  /// The [byteOffset] must be non-negative, and
+  /// `byteOffset + 8` must be less than or equal to the length of this object.
   int getUint64(int byteOffset, [Endian endian = Endian.big]) {
     throw UnsupportedError('Uint64 accessor not supported by dart2js.');
   }
@@ -526,8 +526,8 @@
   /// [byteOffset] in this object, in unsigned binary form. The
   /// return value will be between 0 and 255, inclusive.
   ///
-  /// Throws [RangeError] if [byteOffset] is negative, or
-  /// greater than or equal to the length of this object.
+  /// The [byteOffset] must be non-negative, and
+  /// less than the length of this object.
   int getUint8(int byteOffset) native;
 
   /// Sets the four bytes starting at the specified [byteOffset] in this
@@ -543,8 +543,8 @@
   /// Note that finite (but large) values can be converted to infinity, and
   /// small non-zero values can be converted to zero.
   ///
-  /// Throws [RangeError] if [byteOffset] is negative, or
-  /// `byteOffset + 4` is greater than the length of this object.
+  /// The [byteOffset] must be non-negative, and
+  /// `byteOffset + 4` must be less than or equal to the length of this object.
   void setFloat32(int byteOffset, num value, [Endian endian = Endian.big]) =>
       _setFloat32(byteOffset, value, Endian.little == endian);
 
@@ -555,8 +555,8 @@
   /// object to the IEEE 754 double-precision binary floating-point
   /// (binary64) representation of the specified [value].
   ///
-  /// Throws [RangeError] if [byteOffset] is negative, or
-  /// `byteOffset + 8` is greater than the length of this object.
+  /// The [byteOffset] must be non-negative, and
+  /// `byteOffset + 8` must be less than or equal to the length of this object.
   void setFloat64(int byteOffset, num value, [Endian endian = Endian.big]) =>
       _setFloat64(byteOffset, value, Endian.little == endian);
 
@@ -568,8 +568,8 @@
   /// [value], which must fit in two bytes. In other words, [value] must lie
   /// between 2<sup>15</sup> and 2<sup>15</sup> - 1, inclusive.
   ///
-  /// Throws [RangeError] if [byteOffset] is negative, or
-  /// `byteOffset + 2` is greater than the length of this object.
+  /// The [byteOffset] must be non-negative, and
+  /// `byteOffset + 2` must be less than or equal to the length of this object.
   void setInt16(int byteOffset, int value, [Endian endian = Endian.big]) =>
       _setInt16(byteOffset, value, Endian.little == endian);
 
@@ -581,8 +581,8 @@
   /// [value], which must fit in four bytes. In other words, [value] must lie
   /// between 2<sup>31</sup> and 2<sup>31</sup> - 1, inclusive.
   ///
-  /// Throws [RangeError] if [byteOffset] is negative, or
-  /// `byteOffset + 4` is greater than the length of this object.
+  /// The [byteOffset] must be non-negative, and
+  /// `byteOffset + 4` must be less than or equal to the length of this object.
   void setInt32(int byteOffset, int value, [Endian endian = Endian.big]) =>
       _setInt32(byteOffset, value, Endian.little == endian);
 
@@ -594,8 +594,8 @@
   /// [value], which must fit in eight bytes. In other words, [value] must lie
   /// between 2<sup>63</sup> and 2<sup>63</sup> - 1, inclusive.
   ///
-  /// Throws [RangeError] if [byteOffset] is negative, or
-  /// `byteOffset + 8` is greater than the length of this object.
+  /// The [byteOffset] must be non-negative, and
+  /// `byteOffset + 8` must be less than or equal to the length of this object.
   void setInt64(int byteOffset, int value, [Endian endian = Endian.big]) {
     throw UnsupportedError('Int64 accessor not supported by dart2js.');
   }
@@ -605,8 +605,8 @@
   /// must fit in a single byte. In other words, [value] must be between
   /// -128 and 127, inclusive.
   ///
-  /// Throws [RangeError] if [byteOffset] is negative, or
-  /// greater than or equal to the length of this object.
+  /// The [byteOffset] must be non-negative, and
+  /// less than the length of this object.
   void setInt8(int byteOffset, int value) native;
 
   /// Sets the two bytes starting at the specified [byteOffset] in this object
@@ -614,8 +614,8 @@
   /// which must fit in two bytes. in other words, [value] must be between
   /// 0 and 2<sup>16</sup> - 1, inclusive.
   ///
-  /// Throws [RangeError] if [byteOffset] is negative, or
-  /// `byteOffset + 2` is greater than the length of this object.
+  /// The [byteOffset] must be non-negative, and
+  /// `byteOffset + 2` must be less than or equal to the length of this object.
   void setUint16(int byteOffset, int value, [Endian endian = Endian.big]) =>
       _setUint16(byteOffset, value, Endian.little == endian);
 
@@ -627,8 +627,8 @@
   /// which must fit in four bytes. in other words, [value] must be between
   /// 0 and 2<sup>32</sup> - 1, inclusive.
   ///
-  /// Throws [RangeError] if [byteOffset] is negative, or
-  /// `byteOffset + 4` is greater than the length of this object.
+  /// The [byteOffset] must be non-negative, and
+  /// `byteOffset + 4` must be less than or equal to the length of this object.
   void setUint32(int byteOffset, int value, [Endian endian = Endian.big]) =>
       _setUint32(byteOffset, value, Endian.little == endian);
 
@@ -640,8 +640,8 @@
   /// which must fit in eight bytes. in other words, [value] must be between
   /// 0 and 2<sup>64</sup> - 1, inclusive.
   ///
-  /// Throws [RangeError] if [byteOffset] is negative, or
-  /// `byteOffset + 8` is greater than the length of this object.
+  /// The [byteOffset] must be non-negative, and
+  /// `byteOffset + 8` must be less than or equal to the length of this object.
   void setUint64(int byteOffset, int value, [Endian endian = Endian.big]) {
     throw UnsupportedError('Uint64 accessor not supported by dart2js.');
   }
@@ -651,8 +651,8 @@
   /// in a single byte. in other words, [value] must be between 0 and 255,
   /// inclusive.
   ///
-  /// Throws [RangeError] if [byteOffset] is negative,
-  /// or greater than or equal to the length of this object.
+  /// The [byteOffset] must be non-negative, and
+  /// less than the length of this object.
   void setUint8(int byteOffset, int value) native;
 
   static NativeByteData _create1(arg) =>
@@ -665,8 +665,8 @@
       JS('NativeByteData', 'new DataView(#, #, #)', arg1, arg2, arg3);
 }
 
-abstract class NativeTypedArray extends NativeTypedData
-    implements JavaScriptIndexingBehavior {
+abstract class NativeTypedArray<E> extends NativeTypedData
+    implements JavaScriptIndexingBehavior<E> {
   int get length;
 
   void _setRangeFast(
@@ -692,7 +692,7 @@
   }
 }
 
-abstract class NativeTypedArrayOfDouble extends NativeTypedArray
+abstract class NativeTypedArrayOfDouble extends NativeTypedArray<double>
     with ListMixin<double>, FixedLengthListMixin<double> {
   int get length => JS<int>('!', '#.length', this);
 
@@ -716,7 +716,7 @@
   }
 }
 
-abstract class NativeTypedArrayOfInt extends NativeTypedArray
+abstract class NativeTypedArrayOfInt extends NativeTypedArray<int>
     with ListMixin<int>, FixedLengthListMixin<int>
     implements List<int> {
   int get length => JS<int>('!', '#.length', this);
diff --git a/sdk/lib/_internal/js_runtime/lib/core_patch.dart b/sdk/lib/_internal/js_runtime/lib/core_patch.dart
index 3d4b5e3..2b48b5d 100644
--- a/sdk/lib/_internal/js_runtime/lib/core_patch.dart
+++ b/sdk/lib/_internal/js_runtime/lib/core_patch.dart
@@ -8,6 +8,8 @@
 import 'dart:_interceptors';
 import 'dart:_js_helper'
     show
+        assertUnreachable,
+        boolConversionCheck,
         checkInt,
         Closure,
         ConstantMap,
@@ -448,8 +450,27 @@
 
   @patch
   factory List.of(Iterable<E> elements, {bool growable: true}) {
-    // TODO(32937): Specialize to benefit from known element type.
-    return List.from(elements, growable: growable);
+    if (growable == true) return List._of(elements);
+    if (growable == false) return List._fixedOf(elements);
+
+    // [growable] may be `null` in legacy mode. Fail with the same error as if
+    // [growable] was used in a condition position in spec mode.
+    boolConversionCheck(growable);
+    assertUnreachable();
+  }
+
+  factory List._of(Iterable<E> elements) {
+    // This is essentially `addAll`, but without a check for modifiability or
+    // ConcurrentModificationError on the receiver.
+    List<E> list = <E>[];
+    for (final e in elements) {
+      list.add(e);
+    }
+    return list;
+  }
+
+  factory List._fixedOf(Iterable<E> elements) {
+    return makeListFixedLength(List._of(elements));
   }
 
   @patch
diff --git a/sdk/lib/_internal/js_runtime/lib/js_helper.dart b/sdk/lib/_internal/js_runtime/lib/js_helper.dart
index 542f18b..3b1cca4 100644
--- a/sdk/lib/_internal/js_runtime/lib/js_helper.dart
+++ b/sdk/lib/_internal/js_runtime/lib/js_helper.dart
@@ -48,7 +48,7 @@
 import 'dart:_internal'
     show
         EfficientLengthIterable,
-        LateInitializationErrorImpl,
+        LateError,
         MappedIterable,
         IterableElementError,
         SubListIterable;
@@ -2995,7 +2995,7 @@
 }
 
 @pragma('dart2js:noInline')
-void assertUnreachable() {
+Never assertUnreachable() {
   throw new _UnreachableError();
 }
 
@@ -3026,5 +3026,4 @@
 bool isRequired(Object? value) => identical(kRequiredSentinel, value);
 
 /// Called by generated code to throw a LateInitializationError.
-void throwLateInitializationError(String name) =>
-    throw LateInitializationErrorImpl(name);
+void throwLateInitializationError(String name) => throw LateError(name);
diff --git a/sdk/lib/_internal/js_runtime/lib/native_typed_data.dart b/sdk/lib/_internal/js_runtime/lib/native_typed_data.dart
index 6a7b7b3..2b66dfc 100644
--- a/sdk/lib/_internal/js_runtime/lib/native_typed_data.dart
+++ b/sdk/lib/_internal/js_runtime/lib/native_typed_data.dart
@@ -393,9 +393,9 @@
   /// If the length is not specified, it defaults to null, which indicates
   /// that the view extends to the end of the byte buffer.
   ///
-  /// Throws [RangeError] if [offsetInBytes] or [length] are negative, or
-  /// if [offsetInBytes] + ([length] * elementSizeInBytes) is greater than
-  /// the length of [buffer].
+  /// The [offsetInBytes] and [length] must be non-negative, and
+  /// [offsetInBytes] + ([length] * elementSizeInBytes) must be less than or
+  /// equal to the length of [buffer].
   factory NativeByteData.view(
       ByteBuffer buffer, int offsetInBytes, int? length) {
     _checkViewArguments(buffer, offsetInBytes, length);
@@ -412,8 +412,8 @@
   /// the specified [byteOffset] in this object, in IEEE 754
   /// single-precision binary floating-point format (binary32).
   ///
-  /// Throws [RangeError] if [byteOffset] is negative, or
-  /// `byteOffset + 4` is greater than the length of this object.
+  /// The [byteOffset] must be non-negative, and
+  /// `byteOffset + 4` must be less than or equal to the length of this object.
   double getFloat32(int byteOffset, [Endian endian = Endian.big]) =>
       _getFloat32(byteOffset, Endian.little == endian);
 
@@ -425,8 +425,8 @@
   /// the specified [byteOffset] in this object, in IEEE 754
   /// double-precision binary floating-point format (binary64).
   ///
-  /// Throws [RangeError] if [byteOffset] is negative, or
-  /// `byteOffset + 8` is greater than the length of this object.
+  /// The [byteOffset] must be non-negative, and
+  /// `byteOffset + 8` must be less than or equal to the length of this object.
   double getFloat64(int byteOffset, [Endian endian = Endian.big]) =>
       _getFloat64(byteOffset, Endian.little == endian);
 
@@ -440,8 +440,8 @@
   /// The return value will be between 2<sup>15</sup> and 2<sup>15</sup> - 1,
   /// inclusive.
   ///
-  /// Throws [RangeError] if [byteOffset] is negative, or
-  /// `byteOffset + 2` is greater than the length of this object.
+  /// The [byteOffset] must be non-negative, and
+  /// `byteOffset + 2` must be less than or equal to the length of this object.
   int getInt16(int byteOffset, [Endian endian = Endian.big]) =>
       _getInt16(byteOffset, Endian.little == endian);
 
@@ -455,8 +455,8 @@
   /// The return value will be between 2<sup>31</sup> and 2<sup>31</sup> - 1,
   /// inclusive.
   ///
-  /// Throws [RangeError] if [byteOffset] is negative, or
-  /// `byteOffset + 4` is greater than the length of this object.
+  /// The [byteOffset] must be non-negative, and
+  /// `byteOffset + 4` must be less than or equal to the length of this object.
   int getInt32(int byteOffset, [Endian endian = Endian.big]) =>
       _getInt32(byteOffset, Endian.little == endian);
 
@@ -470,8 +470,8 @@
   /// The return value will be between 2<sup>63</sup> and 2<sup>63</sup> - 1,
   /// inclusive.
   ///
-  /// Throws [RangeError] if [byteOffset] is negative, or
-  /// `byteOffset + 8` is greater than the length of this object.
+  /// The [byteOffset] must be non-negative, and
+  /// `byteOffset + 8` must be less than or equal to the length of this object.
   int getInt64(int byteOffset, [Endian endian = Endian.big]) {
     throw UnsupportedError('Int64 accessor not supported by dart2js.');
   }
@@ -480,8 +480,8 @@
   /// specified [byteOffset] in this object, in two's complement binary
   /// representation. The return value will be between -128 and 127, inclusive.
   ///
-  /// Throws [RangeError] if [byteOffset] is negative, or
-  /// greater than or equal to the length of this object.
+  /// The [byteOffset] must be non-negative, and
+  /// less than the length of this object.
   int getInt8(int byteOffset) native;
 
   /// Returns the positive integer represented by the two bytes starting
@@ -489,8 +489,8 @@
   /// form.
   /// The return value will be between 0 and  2<sup>16</sup> - 1, inclusive.
   ///
-  /// Throws [RangeError] if [byteOffset] is negative, or
-  /// `byteOffset + 2` is greater than the length of this object.
+  /// The [byteOffset] must be non-negative, and
+  /// `byteOffset + 2` must be less than or equal to the length of this object.
   int getUint16(int byteOffset, [Endian endian = Endian.big]) =>
       _getUint16(byteOffset, Endian.little == endian);
 
@@ -503,8 +503,8 @@
   /// form.
   /// The return value will be between 0 and  2<sup>32</sup> - 1, inclusive.
   ///
-  /// Throws [RangeError] if [byteOffset] is negative, or
-  /// `byteOffset + 4` is greater than the length of this object.
+  /// The [byteOffset] must be non-negative, and
+  /// `byteOffset + 4` must be less than or equal to the length of this object.
   int getUint32(int byteOffset, [Endian endian = Endian.big]) =>
       _getUint32(byteOffset, Endian.little == endian);
 
@@ -517,8 +517,8 @@
   /// form.
   /// The return value will be between 0 and  2<sup>64</sup> - 1, inclusive.
   ///
-  /// Throws [RangeError] if [byteOffset] is negative, or
-  /// `byteOffset + 8` is greater than the length of this object.
+  /// The [byteOffset] must be non-negative, and
+  /// `byteOffset + 8` must be less than or equal to the length of this object.
   int getUint64(int byteOffset, [Endian endian = Endian.big]) {
     throw UnsupportedError('Uint64 accessor not supported by dart2js.');
   }
@@ -527,8 +527,8 @@
   /// [byteOffset] in this object, in unsigned binary form. The
   /// return value will be between 0 and 255, inclusive.
   ///
-  /// Throws [RangeError] if [byteOffset] is negative, or
-  /// greater than or equal to the length of this object.
+  /// The [byteOffset] must be non-negative, and
+  /// less than the length of this object.
   int getUint8(int byteOffset) native;
 
   /// Sets the four bytes starting at the specified [byteOffset] in this
@@ -544,8 +544,8 @@
   /// Note that finite (but large) values can be converted to infinity, and
   /// small non-zero values can be converted to zero.
   ///
-  /// Throws [RangeError] if [byteOffset] is negative, or
-  /// `byteOffset + 4` is greater than the length of this object.
+  /// The [byteOffset] must be non-negative, and
+  /// `byteOffset + 4` must be less than or equal to the length of this object.
   void setFloat32(int byteOffset, num value, [Endian endian = Endian.big]) =>
       _setFloat32(byteOffset, value, Endian.little == endian);
 
@@ -556,8 +556,8 @@
   /// object to the IEEE 754 double-precision binary floating-point
   /// (binary64) representation of the specified [value].
   ///
-  /// Throws [RangeError] if [byteOffset] is negative, or
-  /// `byteOffset + 8` is greater than the length of this object.
+  /// The [byteOffset] must be non-negative, and
+  /// `byteOffset + 8` must be less than or equal to the length of this object.
   void setFloat64(int byteOffset, num value, [Endian endian = Endian.big]) =>
       _setFloat64(byteOffset, value, Endian.little == endian);
 
@@ -569,8 +569,8 @@
   /// [value], which must fit in two bytes. In other words, [value] must lie
   /// between 2<sup>15</sup> and 2<sup>15</sup> - 1, inclusive.
   ///
-  /// Throws [RangeError] if [byteOffset] is negative, or
-  /// `byteOffset + 2` is greater than the length of this object.
+  /// The [byteOffset] must be non-negative, and
+  /// `byteOffset + 2` must be less than or equal to the length of this object.
   void setInt16(int byteOffset, int value, [Endian endian = Endian.big]) =>
       _setInt16(byteOffset, value, Endian.little == endian);
 
@@ -582,8 +582,8 @@
   /// [value], which must fit in four bytes. In other words, [value] must lie
   /// between 2<sup>31</sup> and 2<sup>31</sup> - 1, inclusive.
   ///
-  /// Throws [RangeError] if [byteOffset] is negative, or
-  /// `byteOffset + 4` is greater than the length of this object.
+  /// The [byteOffset] must be non-negative, and
+  /// `byteOffset + 4` must be less than or equal to the length of this object.
   void setInt32(int byteOffset, int value, [Endian endian = Endian.big]) =>
       _setInt32(byteOffset, value, Endian.little == endian);
 
@@ -595,8 +595,8 @@
   /// [value], which must fit in eight bytes. In other words, [value] must lie
   /// between 2<sup>63</sup> and 2<sup>63</sup> - 1, inclusive.
   ///
-  /// Throws [RangeError] if [byteOffset] is negative, or
-  /// `byteOffset + 8` is greater than the length of this object.
+  /// The [byteOffset] must be non-negative, and
+  /// `byteOffset + 8` must be less than or equal to the length of this object.
   void setInt64(int byteOffset, int value, [Endian endian = Endian.big]) {
     throw UnsupportedError('Int64 accessor not supported by dart2js.');
   }
@@ -606,8 +606,8 @@
   /// must fit in a single byte. In other words, [value] must be between
   /// -128 and 127, inclusive.
   ///
-  /// Throws [RangeError] if [byteOffset] is negative, or
-  /// greater than or equal to the length of this object.
+  /// The [byteOffset] must be non-negative, and
+  /// less than the length of this object.
   void setInt8(int byteOffset, int value) native;
 
   /// Sets the two bytes starting at the specified [byteOffset] in this object
@@ -615,8 +615,8 @@
   /// which must fit in two bytes. in other words, [value] must be between
   /// 0 and 2<sup>16</sup> - 1, inclusive.
   ///
-  /// Throws [RangeError] if [byteOffset] is negative, or
-  /// `byteOffset + 2` is greater than the length of this object.
+  /// The [byteOffset] must be non-negative, and
+  /// `byteOffset + 2` must be less than or equal to the length of this object.
   void setUint16(int byteOffset, int value, [Endian endian = Endian.big]) =>
       _setUint16(byteOffset, value, Endian.little == endian);
 
@@ -628,8 +628,8 @@
   /// which must fit in four bytes. in other words, [value] must be between
   /// 0 and 2<sup>32</sup> - 1, inclusive.
   ///
-  /// Throws [RangeError] if [byteOffset] is negative, or
-  /// `byteOffset + 4` is greater than the length of this object.
+  /// The [byteOffset] must be non-negative, and
+  /// `byteOffset + 4` must be less than or equal to the length of this object.
   void setUint32(int byteOffset, int value, [Endian endian = Endian.big]) =>
       _setUint32(byteOffset, value, Endian.little == endian);
 
@@ -641,8 +641,8 @@
   /// which must fit in eight bytes. in other words, [value] must be between
   /// 0 and 2<sup>64</sup> - 1, inclusive.
   ///
-  /// Throws [RangeError] if [byteOffset] is negative, or
-  /// `byteOffset + 8` is greater than the length of this object.
+  /// The [byteOffset] must be non-negative, and
+  /// `byteOffset + 8` must be less than or equal to the length of this object.
   void setUint64(int byteOffset, int value, [Endian endian = Endian.big]) {
     throw UnsupportedError('Uint64 accessor not supported by dart2js.');
   }
@@ -652,8 +652,8 @@
   /// in a single byte. in other words, [value] must be between 0 and 255,
   /// inclusive.
   ///
-  /// Throws [RangeError] if [byteOffset] is negative,
-  /// or greater than or equal to the length of this object.
+  /// The [byteOffset] must be non-negative, and
+  /// less than the length of this object.
   void setUint8(int byteOffset, int value) native;
 
   static NativeByteData _create1(arg) =>
diff --git a/sdk/lib/_internal/js_runtime/pubspec.yaml b/sdk/lib/_internal/js_runtime/pubspec.yaml
index f42b2cd..6ab57e6 100644
--- a/sdk/lib/_internal/js_runtime/pubspec.yaml
+++ b/sdk/lib/_internal/js_runtime/pubspec.yaml
@@ -2,3 +2,6 @@
 # make it easier to develop on dart2js.
 name: js_runtime
 publish_to: none
+
+environment:
+  sdk: '>=2.2.2'
diff --git a/sdk/lib/_internal/vm/bin/file_patch.dart b/sdk/lib/_internal/vm/bin/file_patch.dart
index b243920..43fb061 100644
--- a/sdk/lib/_internal/vm/bin/file_patch.dart
+++ b/sdk/lib/_internal/vm/bin/file_patch.dart
@@ -174,9 +174,17 @@
       assert(watcherPath.count > 0);
       watcherPath.count--;
       if (watcherPath.count == 0) {
-        _unwatchPath(_id!, watcherPath.pathId);
-        _pathWatchedEnd();
-        _idMap.remove(watcherPath.pathId);
+        var pathId = watcherPath.pathId;
+        // DirectoryWatchHandle(aka pathId) might be closed already initiated
+        // by issueReadEvent for example. When that happens, appropriate closeEvent
+        // will arrive to us and we will remove this pathId from _idMap. If that
+        // happens we should not try to close it again as pathId is no
+        // longer usable(the memory it points to might be released)
+        if (_idMap.containsKey(pathId)) {
+          _unwatchPath(_id!, pathId);
+          _pathWatchedEnd();
+          _idMap.remove(pathId);
+        }
       }
       _watcherPath = null;
     }
diff --git a/sdk/lib/_internal/vm/lib/async_patch.dart b/sdk/lib/_internal/vm/lib/async_patch.dart
index 8d43f33..659f31f 100644
--- a/sdk/lib/_internal/vm/lib/async_patch.dart
+++ b/sdk/lib/_internal/vm/lib/async_patch.dart
@@ -17,49 +17,6 @@
 // Equivalent of calling FATAL from C++ code.
 _fatal(msg) native "DartAsync_fatal";
 
-class _AsyncAwaitCompleter<T> implements Completer<T> {
-  @pragma("vm:entry-point")
-  final _future = new _Future<T>();
-  @pragma("vm:entry-point")
-  bool isSync;
-
-  @pragma("vm:entry-point")
-  _AsyncAwaitCompleter() : isSync = false;
-
-  @pragma("vm:entry-point")
-  void complete([FutureOr<T>? value]) {
-    // All paths require that if value is null, null as T succeeds.
-    value = (value == null) ? value as T : value;
-    if (!isSync) {
-      _future._asyncComplete(value);
-    } else if (value is Future<T>) {
-      assert(!_future._isComplete);
-      _future._chainFuture(value);
-    } else {
-      // TODO(40014): Remove cast when type promotion works.
-      _future._completeWithValue(value as T);
-    }
-  }
-
-  void completeError(Object e, [StackTrace? st]) {
-    st ??= AsyncError.defaultStackTrace(e);
-    if (isSync) {
-      _future._completeError(e, st);
-    } else {
-      _future._asyncCompleteError(e, st);
-    }
-  }
-
-  @pragma("vm:entry-point")
-  void start(void Function() f) {
-    f();
-    isSync = true;
-  }
-
-  Future<T> get future => _future;
-  bool get isCompleted => !_future._mayComplete;
-}
-
 // We need to pass the value as first argument and leave the second and third
 // arguments empty (used for error handling).
 dynamic Function(dynamic) _asyncThenWrapperHelper(
@@ -117,20 +74,9 @@
   //
   // We can only do this for our internal futures (the default implementation of
   // all futures that are constructed by the `dart:async` library).
-  future._awaiter = awaiter;
   return future._thenAwait<dynamic>(thenCallback, errorCallback);
 }
 
-// Called as part of the 'await for (...)' construct. Registers the
-// awaiter on the stream.
-void _asyncStarListenHelper(var object, var awaiter) {
-  if (object is! _StreamImpl) {
-    return;
-  }
-  // `object` is a `_StreamImpl`.
-  object._awaiter = awaiter;
-}
-
 @pragma("vm:entry-point", "call")
 void _asyncStarMoveNextHelper(var stream) {
   if (stream is! _StreamImpl) {
@@ -291,24 +237,32 @@
 void _rethrow(Object error, StackTrace stackTrace) native "Async_rethrow";
 
 @patch
-class _Future<T> {
-  /// The closure implementing the async[*]-body that is `await`ing this future.
-  Function? _awaiter;
-}
-
-@patch
 class _StreamImpl<T> {
-  /// The closure implementing the async[*]-body that is `await`ing this future.
-  Function? _awaiter;
-
   /// The closure implementing the async-generator body that is creating events
   /// for this stream.
   Function? _generator;
 }
 
 @pragma("vm:entry-point", "call")
-void _completeOnAsyncReturn(Completer completer, Object? value) {
-  completer.complete(value);
+void _completeOnAsyncReturn(_Future _future, Object? value, bool is_sync) {
+  // The first awaited expression is invoked sync. so complete is async. to
+  // allow then and error handlers to be attached.
+  // async_jump_var=0 is prior to first await, =1 is first await.
+  if (!is_sync || value is Future) {
+    _future._asyncComplete(value);
+  } else {
+    _future._completeWithValue(value);
+  }
+}
+
+@pragma("vm:entry-point", "call")
+void _completeOnAsyncError(
+    _Future _future, Object e, StackTrace st, bool is_sync) {
+  if (!is_sync) {
+    _future._asyncCompleteError(e, st);
+  } else {
+    _future._completeError(e, st);
+  }
 }
 
 /// Returns a [StackTrace] object containing the synchronous prefix for this
diff --git a/sdk/lib/_internal/vm/lib/core_patch.dart b/sdk/lib/_internal/vm/lib/core_patch.dart
index b4bbd57..d138549 100644
--- a/sdk/lib/_internal/vm/lib/core_patch.dart
+++ b/sdk/lib/_internal/vm/lib/core_patch.dart
@@ -103,7 +103,8 @@
 // implement sync* generator functions. A sync* generator allocates
 // and returns a new _SyncIterable object.
 
-typedef _SyncGeneratorCallback<T> = bool Function(_SyncIterator<T>);
+typedef _SyncGeneratorCallback<T> = bool Function(
+    _SyncIterator<T>, Object?, StackTrace?);
 typedef _SyncGeneratorCallbackCallback<T> = _SyncGeneratorCallback<T>
     Function();
 
@@ -123,7 +124,7 @@
   _SyncGeneratorCallback<T>? _moveNextFn;
   Iterator<T>? _yieldEachIterator;
 
-  // Stack of suspended _moveNextFn.
+  // Stack of suspended _moveNextFn (sync_op).
   List<_SyncGeneratorCallback<T>>? _stack;
 
   // These two fields are set by generated code for the yield and yield*
@@ -133,57 +134,85 @@
 
   @override
   T get current {
-    final iterator = _yieldEachIterator;
-    if (iterator != null) {
-      return iterator.current;
-    } else {
-      final cur = _current;
-      return (cur != null) ? cur : cur as T;
-    }
+    final cur = _current;
+    return (cur != null) ? cur : cur as T;
   }
 
   _SyncIterator(this._moveNextFn);
 
+  @pragma('vm:prefer-inline')
+  bool _handleMoveNextFnCompletion() {
+    _moveNextFn = null;
+    _current = null;
+    final stack = _stack;
+    if (stack != null && stack.isNotEmpty) {
+      _moveNextFn = stack.removeLast();
+      return true;
+    }
+    return false;
+  }
+
   @override
   bool moveNext() {
     if (_moveNextFn == null) {
       return false;
     }
 
+    Object? pendingException;
+    StackTrace? pendingStackTrace;
     while (true) {
       // If the active iterator isn't a nested _SyncIterator, we have to
       // delegate downwards from the immediate iterator.
       final iterator = _yieldEachIterator;
       if (iterator != null) {
-        if (iterator.moveNext()) {
-          return true;
+        try {
+          if (iterator.moveNext()) {
+            _current = iterator.current;
+            return true;
+          }
+        } catch (e, st) {
+          pendingException = e;
+          pendingStackTrace = st;
         }
         _yieldEachIterator = null;
       }
 
-      final stack = _stack;
-      if (!_moveNextFn!.call(this)) {
-        _moveNextFn = null;
-        _current = null;
-        // If we have any suspended parent generators, continue next one up:
-        if (stack != null && stack.isNotEmpty) {
-          _moveNextFn = stack.removeLast();
+      // Start by calling _moveNextFn (sync_op) to move to the next value (or
+      // nested iterator).
+      try {
+        final haveMore =
+            _moveNextFn!.call(this, pendingException, pendingStackTrace);
+        // Exception was handled.
+        pendingException = null;
+        pendingStackTrace = null;
+        if (!haveMore) {
+          if (_handleMoveNextFnCompletion()) {
+            continue;
+          }
+          return false;
+        }
+      } catch (e, st) {
+        pendingException = e;
+        pendingStackTrace = st;
+        if (_handleMoveNextFnCompletion()) {
           continue;
         }
-        return false;
+        rethrow;
       }
 
+      // Case: yield* some_iterator.
       final iterable = _yieldEachIterable;
       if (iterable != null) {
         if (iterable is _SyncIterable) {
           // We got a recursive yield* of sync* function. Instead of creating
           // a new iterator we replace our _moveNextFn (remembering the
           // current _moveNextFn for later resumption).
-          if (stack == null) {
+          if (_stack == null) {
             _stack = [];
           }
           _stack!.add(_moveNextFn!);
           final typedIterable = unsafeCast<_SyncIterable<T>>(iterable);
+
           _moveNextFn = typedIterable._moveNextFnMaker();
         } else {
           _yieldEachIterator = iterable.iterator;
@@ -195,6 +224,7 @@
         continue;
       }
 
+      // We've successfully found the next `current` value.
       return true;
     }
   }
diff --git a/sdk/lib/_internal/vm/lib/date_patch.dart b/sdk/lib/_internal/vm/lib/date_patch.dart
index ee3b5a3..3d35087 100644
--- a/sdk/lib/_internal/vm/lib/date_patch.dart
+++ b/sdk/lib/_internal/vm/lib/date_patch.dart
@@ -198,7 +198,7 @@
 
   @patch
   Duration difference(DateTime other) {
-    return new Duration(microseconds: _value - other._value);
+    return new Duration(microseconds: _value - other.microsecondsSinceEpoch);
   }
 
   @patch
diff --git a/sdk/lib/_internal/vm/lib/ffi_patch.dart b/sdk/lib/_internal/vm/lib/ffi_patch.dart
index a04c737..02bc8c7 100644
--- a/sdk/lib/_internal/vm/lib/ffi_patch.dart
+++ b/sdk/lib/_internal/vm/lib/ffi_patch.dart
@@ -39,7 +39,7 @@
 
 int _sizeOf<T extends NativeType>() native "Ffi_sizeOf";
 
-// Implemented in the method recognizer, bytecode interpreter uses runtime.
+// Implemented in the method recognizer.
 Pointer<T> _fromAddress<T extends NativeType>(int ptr) native "Ffi_fromAddress";
 
 // The real implementation of this function (for interface calls) lives in
@@ -92,7 +92,7 @@
         "Pointer.fromFunction cannot be called dynamically.");
   }
 
-  // Implemented in the method recognizer, bytecode interpreter uses runtime.
+  // Implemented in the method recognizer.
   @patch
   int get address native "Ffi_address";
 
@@ -114,10 +114,9 @@
 /// calculations. See pkg/vm/lib/transformations/ffi.dart.
 @pragma('vm:prefer-inline')
 int _abi()
-    native "Recognized method: method is directly interpreted by the bytecode interpreter or IR graph is built in the flow graph builder.";
+    native "Recognized method: IR graph is built in the flow graph builder.";
 
-// The following functions are implemented in the method recognizer, but the
-// bytecode interpreter uses native entries.
+// The following functions are implemented in the method recognizer.
 //
 // TODO(38172): Since these are not inlined (force optimize), they force
 // allocating a Pointer with in elementAt/offsetBy. Allocating these pointers
diff --git a/sdk/lib/_internal/vm/lib/function.dart b/sdk/lib/_internal/vm/lib/function.dart
index 1c99ca2..710f1ef 100644
--- a/sdk/lib/_internal/vm/lib/function.dart
+++ b/sdk/lib/_internal/vm/lib/function.dart
@@ -19,8 +19,6 @@
 
   _Closure get call => this;
 
-  _Closure _clone() native "Closure_clone";
-
   int _computeHash() native "Closure_computeHash";
 
   // No instance fields should be declared before the following fields whose
diff --git a/sdk/lib/_internal/vm/lib/internal_patch.dart b/sdk/lib/_internal/vm/lib/internal_patch.dart
index 812f18f..ad5f5b7 100644
--- a/sdk/lib/_internal/vm/lib/internal_patch.dart
+++ b/sdk/lib/_internal/vm/lib/internal_patch.dart
@@ -163,7 +163,7 @@
 
 // This function can be used to keep an object alive til that point.
 //
-// This is implemented by a recognized method, but in bytecode through a native.
+// This is implemented by a recognized method.
 @pragma('vm:prefer-inline')
 void reachabilityFence(Object object) native "Internal_reachabilityFence";
 
diff --git a/sdk/lib/_internal/vm/lib/isolate_patch.dart b/sdk/lib/_internal/vm/lib/isolate_patch.dart
index 91a567d..97e90ce 100644
--- a/sdk/lib/_internal/vm/lib/isolate_patch.dart
+++ b/sdk/lib/_internal/vm/lib/isolate_patch.dart
@@ -22,7 +22,8 @@
 @patch
 class ReceivePort {
   @patch
-  factory ReceivePort() => new _ReceivePortImpl();
+  factory ReceivePort([String debugName = '']) =>
+      new _ReceivePortImpl(debugName);
 
   @patch
   factory ReceivePort.fromRawReceivePort(RawReceivePort rawPort) {
@@ -62,15 +63,16 @@
    * event is received.
    */
   @patch
-  factory RawReceivePort([Function? handler]) {
-    _RawReceivePortImpl result = new _RawReceivePortImpl();
+  factory RawReceivePort([Function? handler, String debugName = '']) {
+    _RawReceivePortImpl result = new _RawReceivePortImpl(debugName);
     result.handler = handler;
     return result;
   }
 }
 
 class _ReceivePortImpl extends Stream implements ReceivePort {
-  _ReceivePortImpl() : this.fromRawReceivePort(new RawReceivePort());
+  _ReceivePortImpl([String debugName = ''])
+      : this.fromRawReceivePort(new RawReceivePort(null, debugName));
 
   _ReceivePortImpl.fromRawReceivePort(this._rawPort)
       : _controller = new StreamController(sync: true) {
@@ -128,11 +130,20 @@
 
 @pragma("vm:entry-point")
 class _RawReceivePortImpl implements RawReceivePort {
-  factory _RawReceivePortImpl() native "RawReceivePortImpl_factory";
+  factory _RawReceivePortImpl(String debugName) {
+    final port = _RawReceivePortImpl._(debugName);
+    _portMap[port._get_id()] = <String, dynamic>{
+      'port': port,
+    };
+    return port;
+  }
+
+  factory _RawReceivePortImpl._(String debugName)
+      native "RawReceivePortImpl_factory";
 
   close() {
     // Close the port and remove it from the handler map.
-    _handlerMap.remove(this._closeInternal());
+    _portMap.remove(this._closeInternal());
   }
 
   SendPort get sendPort {
@@ -155,10 +166,15 @@
   // Called from the VM to retrieve the handler for a message.
   @pragma("vm:entry-point", "call")
   static _lookupHandler(int id) {
-    var result = _handlerMap[id];
+    var result = _portMap[id]?['handler'];
     return result;
   }
 
+  @pragma("vm:entry-point", "call")
+  static _lookupOpenPorts() {
+    return _portMap.values.map((e) => e['port']).toList();
+  }
+
   // Called from the VM to dispatch to the handler.
   @pragma("vm:entry-point", "call")
   static void _handleMessage(Function handler, var message) {
@@ -173,22 +189,16 @@
   _closeInternal() native "RawReceivePortImpl_closeInternal";
 
   void set handler(Function? value) {
-    _handlerMap[this._get_id()] = value;
+    final id = this._get_id();
+    if (!_portMap.containsKey(id)) {
+      _portMap[id] = <String, dynamic>{
+        'port': this,
+      };
+    }
+    _portMap[id]!['handler'] = value;
   }
 
-  // TODO(iposva): Ideally keep this map in the VM.
-  // id to handler mapping.
-  static _initHandlerMap() {
-    // TODO(18511): Workaround bad CheckSmi hoisting.
-    var tempMap = new HashMap();
-    // Collect feedback that not all keys are Smis.
-    tempMap["."] = 1;
-    tempMap["."] = 2;
-
-    return new HashMap();
-  }
-
-  static final Map _handlerMap = _initHandlerMap();
+  static final _portMap = <dynamic, Map<String, dynamic>>{};
 }
 
 @pragma("vm:entry-point")
diff --git a/sdk/lib/async/stream_controller.dart b/sdk/lib/async/stream_controller.dart
index 0dc3c97..4c3e4f9 100644
--- a/sdk/lib/async/stream_controller.dart
+++ b/sdk/lib/async/stream_controller.dart
@@ -835,6 +835,7 @@
 // TODO(lrn): Use common superclass for callback-controllers when VM supports
 // constructors in mixin superclasses.
 
+@pragma("vm:entry-point")
 class _AsyncStreamController<T> = _StreamController<T>
     with _AsyncStreamControllerDispatch<T>;
 
diff --git a/sdk/lib/async/stream_impl.dart b/sdk/lib/async/stream_impl.dart
index 52e5ca3..6ec5d03 100644
--- a/sdk/lib/async/stream_impl.dart
+++ b/sdk/lib/async/stream_impl.dart
@@ -946,26 +946,32 @@
   }
 }
 
-/**
- * Simple implementation of [StreamIterator].
- *
- * Pauses the stream between calls to [moveNext].
- */
+/// Simple implementation of [StreamIterator].
+///
+/// Pauses the stream between calls to [moveNext].
 class _StreamIterator<T> implements StreamIterator<T> {
-  // The stream iterator is always in one of four states.
+  // The stream iterator is always in one of five states.
   // The value of the [_stateData] field depends on the state.
   //
-  // When `_subscription == null` and `_stateData != null`:
+  // When `_subscription == null`, `_stateData != null`, and not listened yet:
   // The stream iterator has been created, but [moveNext] has not been called
   // yet. The [_stateData] field contains the stream to listen to on the first
   // call to [moveNext] and [current] returns `null`.
   //
-  // When `_subscription != null` and `!_isPaused`:
+  // When `_subscription == null`, `_stateData != null`, during `listen` call.
+  // The `listen` call has not returned a subscription yet.
+  // The `_stateData` contains the future returned by the first [moveNext]
+  // call. This state is only detected inside the stream event callbacks,
+  // since it's the only case where they can get called while `_subscription`
+  // is `null`. (A well-behaved stream should not be emitting events during
+  // the `listen` call, but some do anyway). The [current] is `null`.
+  //
+  // When `_subscription != null` and `!_hasValue`:
   // The user has called [moveNext] and the iterator is waiting for the next
   // event. The [_stateData] field contains the [_Future] returned by the
   // [_moveNext] call and [current] returns `null.`
   //
-  // When `_subscription != null` and `_isPaused`:
+  // When `_subscription != null` and `_hasValue`:
   // The most recent call to [moveNext] has completed with a `true` value
   // and [current] provides the value of the data event.
   // The [_stateData] field contains the [current] value.
@@ -1000,26 +1006,23 @@
   /// This will usually cause the [_subscription] to be paused, but as an
   /// optimization, we only pause after the [moveNext] future has been
   /// completed.
-  bool _isPaused = false;
+  bool _hasValue = false;
 
-  _StreamIterator(final Stream<T> stream) : _stateData = stream {
-    ArgumentError.checkNotNull(stream, "stream");
-  }
+  _StreamIterator(final Stream<T> stream)
+      : _stateData = ArgumentError.checkNotNull(stream, "stream");
 
   T get current {
-    if (_subscription != null && _isPaused) {
-      return _stateData as dynamic;
-    }
+    if (_hasValue) return _stateData as dynamic;
     return null as dynamic;
   }
 
   Future<bool> moveNext() {
     var subscription = _subscription;
     if (subscription != null) {
-      if (_isPaused) {
+      if (_hasValue) {
         var future = new _Future<bool>();
         _stateData = future;
-        _isPaused = false;
+        _hasValue = false;
         subscription.resume();
         return future;
       }
@@ -1038,24 +1041,38 @@
     var stateData = _stateData;
     if (stateData != null) {
       Stream<T> stream = stateData as dynamic;
-      _subscription = stream.listen(_onData,
-          onError: _onError, onDone: _onDone, cancelOnError: true);
       var future = new _Future<bool>();
       _stateData = future;
+      // The `listen` call may invoke user code, and it might try to emit
+      // events.
+      // We ignore data events during `listen`, but error or done events
+      // are used to asynchronously complete the future and set `_stateData`
+      // to null.
+      // This ensures that we do no other user-code callbacks during `listen`
+      // than the `onListen` itself. If that code manages to call `moveNext`
+      // again on this iterator, then we will get here and fail when the
+      // `_stateData` is a future instead of a stream.
+      var subscription = stream.listen(_onData,
+          onError: _onError, onDone: _onDone, cancelOnError: true);
+      if (_stateData != null) {
+        _subscription = subscription;
+      }
       return future;
     }
     return Future._falseFuture;
   }
 
   Future cancel() {
-    StreamSubscription<T>? subscription = _subscription;
-    Object? stateData = _stateData;
+    var subscription = _subscription;
+    var stateData = _stateData;
     _stateData = null;
     if (subscription != null) {
       _subscription = null;
-      if (!_isPaused) {
+      if (!_hasValue) {
         _Future<bool> future = stateData as dynamic;
         future._asyncComplete(false);
+      } else {
+        _hasValue = false;
       }
       return subscription.cancel();
     }
@@ -1063,28 +1080,41 @@
   }
 
   void _onData(T data) {
-    assert(_subscription != null && !_isPaused);
+    // Ignore events sent during the `listen` call
+    // (which can happen if misusing synchronous broadcast stream controllers),
+    // or after `cancel` or `done` (for *really* misbehaving streams).
+    if (_subscription == null) return;
     _Future<bool> moveNextFuture = _stateData as dynamic;
     _stateData = data;
-    _isPaused = true;
+    _hasValue = true;
     moveNextFuture._complete(true);
-    if (_isPaused) _subscription?.pause();
+    if (_hasValue) _subscription?.pause();
   }
 
   void _onError(Object error, StackTrace stackTrace) {
-    assert(_subscription != null && !_isPaused);
+    var subscription = _subscription;
     _Future<bool> moveNextFuture = _stateData as dynamic;
     _subscription = null;
     _stateData = null;
-    moveNextFuture._completeError(error, stackTrace);
+    if (subscription != null) {
+      moveNextFuture._completeError(error, stackTrace);
+    } else {
+      // Event delivered during `listen` call.
+      moveNextFuture._asyncCompleteError(error, stackTrace);
+    }
   }
 
   void _onDone() {
-    assert(_subscription != null && !_isPaused);
+    var subscription = _subscription;
     _Future<bool> moveNextFuture = _stateData as dynamic;
     _subscription = null;
     _stateData = null;
-    moveNextFuture._complete(false);
+    if (subscription != null) {
+      moveNextFuture._completeWithValue(false);
+    } else {
+      // Event delivered during `listen` call.
+      moveNextFuture._asyncCompleteWithValue(false);
+    }
   }
 }
 
diff --git a/sdk/lib/core/annotations.dart b/sdk/lib/core/annotations.dart
index f407683..ec9c489 100644
--- a/sdk/lib/core/annotations.dart
+++ b/sdk/lib/core/annotations.dart
@@ -86,31 +86,32 @@
   const _Override();
 }
 
-/**
- * The annotation `@override` marks an instance member as overriding a
- * superclass member with the same name.
- *
- * The annotation applies to instance methods, getters and setters, and to
- * instance fields, where it means that the implicit getter and setter of the
- * field is marked as overriding, but the field itself is not.
- *
- * The intent of the `@override` notation is to catch situations where a
- * superclass renames a member, and an independent subclass which used to
- * override the member, could silently continue working using the
- * superclass implementation.
- *
- * The editor, or a similar tool aimed at the programmer, may report if no
- * declaration of an annotated member is inherited by the class from either a
- * superclass or an interface.
- *
- * Use the `@override` annotation judiciously and only for methods where
- * the superclass is not under the programmer's control, the superclass is in a
- * different library or package, and it is not considered stable.
- * In any case, the use of `@override` is optional.
- *
- * For example, the annotation is intentionally not used in the Dart platform
- * libraries, since they only depend on themselves.
- */
+/// Annotation on an instance members which override an interface member.
+///
+/// Annotations have no effect on the meaning of a Dart program.
+/// This annotation is recognized by the Dart analyzer, and it allows the
+/// analyzer to provide hints or warnings for some potential problems of an
+/// otherwise valid program.
+/// As such, the meaning of this annotation is defined by the Dart analyzer.
+///
+/// The `@override` annotation expresses the intent
+/// that a declaration *should* override an interface method,
+/// something which is not visible from the declaration itself.
+/// This extra information allows the analyzer to provide a warning
+/// when that intent is not satisfied,
+/// where a member is intended to override a superclass member or
+/// implement an interface member, but fails to do so.
+/// Such a situation can arise if a member name is mistyped,
+/// or if the superclass renames the member.
+///
+/// The `@override` annotation applies to instance methods, instance getters,
+/// instance setters and instance variables (fields).
+/// When applied to an instance variable,
+/// it means that the variable's implicit getter and setter (if any)
+/// are marked as overriding. It has no effect on the variable itself.
+///
+/// Further [lints](https://dart-lang.github.io/linter/lints/)
+/// can be used to enable more warnings based on `@override` annotations.
 const Object override = _Override();
 
 /**
@@ -127,64 +128,16 @@
 /**
  * An annotation that was used during development of Dart 2.
  *
- * Should not be used any more.
+ * The annotation has no effect, and will be removed.
  */
 @deprecated
 const Null provisional = null;
 
-class _Proxy {
-  const _Proxy();
-}
-
-/**
- * This annotation is deprecated and will be removed in Dart 2.
- *
- * Dart 2 has a more restrictive type system than Dart 1, and it requires
- * method access to be either through a known interface or by using
- * dynamic invocations. The original intent of `@proxy` (to implement a class
- * that isn't known statically, as documented at the end of this text),
- * is not supported by Dart 2.
- * To continue to perform dynamic invocations on an object,
- * it should be accessed through a reference of type `dynamic`.
- *
- * The annotation `@proxy` marks a class as implementing members dynamically
- * through `noSuchMethod`.
- *
- * The annotation applies to any class. It is inherited by subclasses from both
- * superclass and interfaces.
- *
- * If a class is annotated with `@proxy`, or it implements any class that is
- * annotated, then all member accesses are allowed on an object of that type.
- * As such, it is not a static type warning to access any member of the object
- * which is not implemented by the class, or to call a method with a different
- * number of parameters than it is declared with.
- *
- * The annotation does not change which classes the annotated class implements,
- * and does not prevent static warnings for assigning an object to a variable
- * with a static type not implemented by the object.
- *
- * The suppression of warnings only affect static type warnings about
- * member access.
- * The runtime type of the object is unaffected.
- * It is not considered to implement any special interfaces,
- * so assigning it to a typed variable may fail in checked mode,
- * and testing it with the `is` operator
- * will only return true for types it actually implements or extends.
- * Accessing a member which isn't implemented by the class
- * will cause the `noSuchMethod` method to be called normally,
- * the `@proxy` annotation merely states the intent to handle (some of) those
- * `noSuchMethod` calls gracefully.
- *
- * A class that marked as `@proxy` should override the `noSuchMethod`
- * declared on [Object].
- *
- * The intent of the `@proxy` notation is to create objects that implement a
- * type (or multiple types) that are not known at compile time. If the types
- * are known at compile time, a class can be written that implements these
- * types.
- */
+/// This annotation was used in Dart prior to version 2.
+///
+/// The annotation has no effect, and will be removed.
 @deprecated
-const Object proxy = _Proxy();
+const Null proxy = null;
 
 /**
  * A hint to tools.
@@ -203,7 +156,8 @@
  * A tool may recognize unprefixed names as well, if they would recognize that
  * name with their own prefix in front.
  *
- * If the hint can be parameterized, an extra [options] object can be added as well.
+ * If the hint can be parameterized,
+ * an extra [options] object can be added as well.
  *
  * For example:
  *
@@ -215,9 +169,9 @@
  * void foo() { }
  * ```
  *
- * Here class Foo is annotated with a Tool specific pragma 'pragma-name' and
- * function foo is annotated with a pragma 'other-pragma' specific to OtherTool.
- *
+ * Here class `Foo` is annotated with a Tool specific pragma 'pragma-name' and
+ * function `foo` is annotated with a pragma 'other-pragma'
+ * specific to OtherTool.
  */
 @pragma('vm:entry-point')
 class pragma {
diff --git a/sdk/lib/core/list.dart b/sdk/lib/core/list.dart
index afd7f11..ecd4c97 100644
--- a/sdk/lib/core/list.dart
+++ b/sdk/lib/core/list.dart
@@ -337,7 +337,7 @@
    * Increasing the length fails if the element type does not allow `null`.
    *
    * Throws an [UnsupportedError] if the list is fixed-length or
-   * if attempting tp enlarge the list when `null` is not a valid element.
+   * if attempting to enlarge the list when `null` is not a valid element.
    */
   set length(int newLength);
 
diff --git a/sdk/lib/core/set.dart b/sdk/lib/core/set.dart
index ae1e381..6f47e07 100644
--- a/sdk/lib/core/set.dart
+++ b/sdk/lib/core/set.dart
@@ -253,7 +253,8 @@
    */
   void clear();
 
-  /* Creates a [Set] with the same elements and behavior as this `Set`.
+  /**
+   * Creates a [Set] with the same elements and behavior as this `Set`.
    *
    * The returned set behaves the same as this set
    * with regard to adding and removing elements.
diff --git a/sdk/lib/core/symbol.dart b/sdk/lib/core/symbol.dart
index 65e83ff..d64890a 100644
--- a/sdk/lib/core/symbol.dart
+++ b/sdk/lib/core/symbol.dart
@@ -60,7 +60,7 @@
    * assert(new Symbol("[]=") == #[]=]);
    * assert(new Symbol("foo.bar") == #foo.bar);
    * assert(identical(const Symbol("foo"), #foo));
-   * assert(identical(const Symbol("[]="), #[]=]));
+   * assert(identical(const Symbol("[]="), #[]=));
    * assert(identical(const Symbol("foo.bar"), #foo.bar));
    * ```
    *
diff --git a/sdk/lib/core/type.dart b/sdk/lib/core/type.dart
index d2e107b..65cef39 100644
--- a/sdk/lib/core/type.dart
+++ b/sdk/lib/core/type.dart
@@ -6,5 +6,53 @@
 
 /**
  * Runtime representation of a type.
+ *
+ * Type objects represent types.
+ * A type object can be created in several ways:
+ * * By a *type literal*, a type name occurring as an expression,
+ *   like `Type type = int;`,
+ *   or a type variable occurring as an expression, like `Type type = T;`.
+ * * By reading the run-time type of an object,
+ *   like `Type type = o.runtimeType;`.
+ * * Through `dart:mirrors`.
+ *
+ * A type object is intended as an entry point for using `dart:mirrors`.
+ * The only operations supported are comparing to other type objects
+ * for equality, and converting it to a string for debugging.
  */
-abstract class Type {}
+abstract class Type {
+  /**
+   * A hash code for the type which is compatible with [operator==].
+   */
+  int get hashCode;
+
+  /**
+   * Whether [other] is a [Type] instance representing an equivalent type.
+   *
+   * The language specification dictates which types are considered
+   * to be the equivalent.
+   * If two types are equivalent, it's guaranteed that they are subtypes
+   * of each other,
+   * but there are also types which are subtypes of each other,
+   * and which are not equivalent (for example `dynamic` and `void`,
+   * or `FutureOr<Object>` and `Object`).
+   */
+  bool operator ==(Object other);
+
+  /**
+   * Returns a string which represents the underlying type.
+   *
+   * The string is only intended for providing information to a reader
+   * while debugging.
+   * There is no guaranteed format,
+   * the string value returned for a [Type] instances is entirely
+   * implementation dependent.
+   *
+   * The string should be consistent, so a `Type` object for the *same* type
+   * returns the same string throughout a program execution.
+   * The string may or may not contain parts corresponding to the
+   * source name of declaration of the type, if the type has a source name
+   * at all (some types reachable through `dart:mirrors` may not).
+   */
+  String toString();
+}
diff --git a/sdk/lib/ffi/struct.dart b/sdk/lib/ffi/struct.dart
index f4cb315..0faf7ca 100644
--- a/sdk/lib/ffi/struct.dart
+++ b/sdk/lib/ffi/struct.dart
@@ -18,7 +18,7 @@
 /// by native memory. The may allocated via allocation or loaded from a
 /// [Pointer], but not by a generative constructor.
 abstract class Struct extends NativeType {
-  final Pointer<Struct> _addressOf;
+  final Object _addressOf;
 
   /// Construct a reference to the [nullptr].
   ///
diff --git a/sdk/lib/html/doc/NATIVE_NULL_ASSERTIONS.md b/sdk/lib/html/doc/NATIVE_NULL_ASSERTIONS.md
new file mode 100644
index 0000000..eb9e79d
--- /dev/null
+++ b/sdk/lib/html/doc/NATIVE_NULL_ASSERTIONS.md
@@ -0,0 +1,42 @@
+# Native Null Assertions in Dart Dev Compiler and Dart2JS
+
+## Overview
+
+In the Dart web platform libraries, e.g. `dart:html`, there are APIs that depend
+on JS interoperability. With null-safety, the types returned from these interop
+procedures are not null-checked by default. In both DDC and dart2js, there
+exists a flag to turn on checks, or native null assertions, for these instances.
+In DDC, it's called `nativeNonNullAsserts` and in dart2js, it's called
+`--native-null-assertions`.
+
+Specifically, the flag focused on two cases. The first case is checks around
+types returned from APIs that are declared `native`. If the return type here is
+non-nullable, enabling native null assertions will throw an error if a `null`
+value is returned. For example,
+
+`int get foo native;`
+
+will throw an error if `.foo` returns a `null` value. This may happen due to a
+number of reasons, one of which could be browser incompatibility.
+
+The second case is on `JS()` invocations. `JS()` is an internal-only function
+that allows you to inline JavaScript. If the static type of the `JS()`
+invocation is non-nullable, but a `null` value is returned, there will be an
+error thrown if native null assertions are enabled.
+
+The goals with these native null assertions are to ensure the Dart web platform
+libraries are typed correctly and to help achieve sound null-safety.
+
+If you come across an error related to this flag, this may or may not be a bug
+in the Dart web platform libraries. If so, please file a bug at:
+https://github.com/dart-lang/sdk/issues/labels/web-libraries
+
+## Disabling native null assertions
+
+Native null assertions will be turned on by default across different build
+systems. If it is enabled, here's how you can disable it in the following build
+systems:
+
+### build_web_compilers
+
+https://github.com/dart-lang/build/tree/master/docs/native_null_assertions.md
diff --git a/sdk/lib/internal/errors.dart b/sdk/lib/internal/errors.dart
index 93c01f1..5f8ca81 100644
--- a/sdk/lib/internal/errors.dart
+++ b/sdk/lib/internal/errors.dart
@@ -4,11 +4,29 @@
 
 part of dart._internal;
 
-class LateInitializationErrorImpl extends Error
-    implements LateInitializationError {
+class LateError extends Error implements LateInitializationError {
   final String? _message;
 
-  LateInitializationErrorImpl([this._message]);
+  LateError([this._message]);
+
+  // The constructor names have been deliberately shortened to reduce the size
+  // of unminified code as used by DDC.
+
+  LateError.fieldADI(String fieldName)
+      : _message =
+            "Field '$fieldName' has been assigned during initialization.";
+
+  LateError.fieldNI(String fieldName)
+      : _message = "Field '${fieldName}' has not been initialized.";
+
+  LateError.localNI(String localName)
+      : _message = "Local '${localName}' has not been initialized.";
+
+  LateError.fieldAI(String fieldName)
+      : _message = "Field '${fieldName}' has already been initialized.";
+
+  LateError.localAI(String localName)
+      : _message = "Local '${localName}' has already been initialized.";
 
   String toString() {
     var message = _message;
diff --git a/sdk/lib/internal/internal.dart b/sdk/lib/internal/internal.dart
index f86652e..401777d 100644
--- a/sdk/lib/internal/internal.dart
+++ b/sdk/lib/internal/internal.dart
@@ -119,6 +119,163 @@
   return digit1 * 16 + digit2 - (digit2 & 256);
 }
 
+/// A default hash function used by the platform in various places.
+///
+/// This is currently the [Jenkins hash function][1] but using masking to keep
+/// values in SMI range.
+///
+/// [1]: http://en.wikipedia.org/wiki/Jenkins_hash_function
+///
+/// Usage:
+/// Hash each value with the hash of the previous value, then get the final
+/// hash by calling finish.
+/// ```
+/// var hash = 0;
+/// for (var value in values) {
+///   hash = SystemHash.combine(hash, value.hashCode);
+/// }
+/// hash = SystemHash.finish(hash);
+/// ```
+// TODO(lrn): Consider specializing this code per platform,
+// so the VM can use its 64-bit integers directly.
+@Since("2.11")
+class SystemHash {
+  static int combine(int hash, int value) {
+    hash = 0x1fffffff & (hash + value);
+    hash = 0x1fffffff & (hash + ((0x0007ffff & hash) << 10));
+    return hash ^ (hash >> 6);
+  }
+
+  static int finish(int hash) {
+    hash = 0x1fffffff & (hash + ((0x03ffffff & hash) << 3));
+    hash = hash ^ (hash >> 11);
+    return 0x1fffffff & (hash + ((0x00003fff & hash) << 15));
+  }
+
+  static int hash2(int v1, int v2) {
+    int hash = 0;
+    hash = combine(hash, v1);
+    hash = combine(hash, v2);
+    return finish(hash);
+  }
+
+  static int hash3(int v1, int v2, int v3) {
+    int hash = 0;
+    hash = combine(hash, v1);
+    hash = combine(hash, v2);
+    hash = combine(hash, v3);
+    return finish(hash);
+  }
+
+  static int hash4(int v1, int v2, int v3, int v4) {
+    int hash = 0;
+    hash = combine(hash, v1);
+    hash = combine(hash, v2);
+    hash = combine(hash, v3);
+    hash = combine(hash, v4);
+    return finish(hash);
+  }
+
+  static int hash5(int v1, int v2, int v3, int v4, int v5) {
+    int hash = 0;
+    hash = combine(hash, v1);
+    hash = combine(hash, v2);
+    hash = combine(hash, v3);
+    hash = combine(hash, v4);
+    hash = combine(hash, v5);
+    return finish(hash);
+  }
+
+  static int hash6(int v1, int v2, int v3, int v4, int v5, int v6) {
+    int hash = 0;
+    hash = combine(hash, v1);
+    hash = combine(hash, v2);
+    hash = combine(hash, v3);
+    hash = combine(hash, v4);
+    hash = combine(hash, v5);
+    hash = combine(hash, v6);
+    return finish(hash);
+  }
+
+  static int hash7(int v1, int v2, int v3, int v4, int v5, int v6, int v7) {
+    int hash = 0;
+    hash = combine(hash, v1);
+    hash = combine(hash, v2);
+    hash = combine(hash, v3);
+    hash = combine(hash, v4);
+    hash = combine(hash, v5);
+    hash = combine(hash, v6);
+    hash = combine(hash, v7);
+    return finish(hash);
+  }
+
+  static int hash8(
+      int v1, int v2, int v3, int v4, int v5, int v6, int v7, int v8) {
+    int hash = 0;
+    hash = combine(hash, v1);
+    hash = combine(hash, v2);
+    hash = combine(hash, v3);
+    hash = combine(hash, v4);
+    hash = combine(hash, v5);
+    hash = combine(hash, v6);
+    hash = combine(hash, v7);
+    hash = combine(hash, v8);
+    return finish(hash);
+  }
+
+  static int hash9(
+      int v1, int v2, int v3, int v4, int v5, int v6, int v7, int v8, int v9) {
+    int hash = 0;
+    hash = combine(hash, v1);
+    hash = combine(hash, v2);
+    hash = combine(hash, v3);
+    hash = combine(hash, v4);
+    hash = combine(hash, v5);
+    hash = combine(hash, v6);
+    hash = combine(hash, v7);
+    hash = combine(hash, v8);
+    hash = combine(hash, v9);
+    return finish(hash);
+  }
+
+  static int hash10(int v1, int v2, int v3, int v4, int v5, int v6, int v7,
+      int v8, int v9, int v10) {
+    int hash = 0;
+    hash = combine(hash, v1);
+    hash = combine(hash, v2);
+    hash = combine(hash, v3);
+    hash = combine(hash, v4);
+    hash = combine(hash, v5);
+    hash = combine(hash, v6);
+    hash = combine(hash, v7);
+    hash = combine(hash, v8);
+    hash = combine(hash, v9);
+    hash = combine(hash, v10);
+    return finish(hash);
+  }
+
+  /// Bit shuffling operation to improve hash codes.
+  ///
+  /// Dart integers have very simple hash codes (their value),
+  /// which is acceptable for the hash above because it smears the bits
+  /// as part of the combination.
+  /// However, for the unordered hash based on xor, we need to improve
+  /// the hash code of, e.g., integers, so a set containing the integers
+  /// from zero to 2^n won't always have a zero hashcode.
+  ///
+  /// Assumes the input hash code is an unsigned 32-bit integer.
+  /// Found by Christopher Wellons [https://github.com/skeeto/hash-prospector].
+  static int smear(int x) {
+    // TODO: Use >>> instead of >> when available.
+    x ^= x >> 16;
+    x = (x * 0x7feb352d) & 0xFFFFFFFF;
+    x ^= x >> 15;
+    x = (x * 0x846ca68b) & 0xFFFFFFFF;
+    x ^= x >> 16;
+    return x;
+  }
+}
+
 /// Given an [instance] of some generic type [T], and [extract], a first-class
 /// generic function that takes the same number of type parameters as [T],
 /// invokes the function with the same type arguments that were passed to T
diff --git a/sdk/lib/io/network_profiling.dart b/sdk/lib/io/network_profiling.dart
index 5c1c620..95fa5a3 100644
--- a/sdk/lib/io/network_profiling.dart
+++ b/sdk/lib/io/network_profiling.dart
@@ -6,7 +6,7 @@
 
 // TODO(bkonyi): refactor into io_resource_info.dart
 const int _versionMajor = 1;
-const int _versionMinor = 4;
+const int _versionMinor = 5;
 
 const String _tcpSocket = 'tcp';
 const String _udpSocket = 'udp';
@@ -25,7 +25,11 @@
   // Socket relative RPCs
   static const _kClearSocketProfileRPC = 'ext.dart.io.clearSocketProfile';
   static const _kGetSocketProfileRPC = 'ext.dart.io.getSocketProfile';
+  static const _kSocketProfilingEnabledRPC =
+      'ext.dart.io.socketProfilingEnabled';
+  @Deprecated('Use socketProfilingEnabled instead')
   static const _kPauseSocketProfilingRPC = 'ext.dart.io.pauseSocketProfiling';
+  @Deprecated('Use socketProfilingEnabled instead')
   static const _kStartSocketProfilingRPC = 'ext.dart.io.startSocketProfiling';
 
   // TODO(zichangguo): This version number represents the version of service
@@ -41,6 +45,7 @@
     registerExtension(_kGetSocketProfileRPC, _serviceExtensionHandler);
     registerExtension(_kStartSocketProfilingRPC, _serviceExtensionHandler);
     registerExtension(_kPauseSocketProfilingRPC, _serviceExtensionHandler);
+    registerExtension(_kSocketProfilingEnabledRPC, _serviceExtensionHandler);
     registerExtension(_kClearSocketProfileRPC, _serviceExtensionHandler);
     registerExtension(_kGetVersionRPC, _serviceExtensionHandler);
   }
@@ -73,6 +78,9 @@
         case _kGetSocketProfileRPC:
           responseJson = _SocketProfile.toJson();
           break;
+        case _kSocketProfilingEnabledRPC:
+          responseJson = _socketProfilingEnabled(parameters);
+          break;
         case _kStartSocketProfilingRPC:
           responseJson = _SocketProfile.start();
           break;
@@ -131,8 +139,35 @@
   return _success();
 }
 
+String _socketProfilingEnabled(Map<String, String> parameters) {
+  const String kEnabled = 'enabled';
+  if (parameters.containsKey(kEnabled)) {
+    final enable = parameters[kEnabled]!.toLowerCase();
+    if (enable != 'true' && enable != 'false') {
+      throw _invalidArgument(kEnabled, enable);
+    }
+    enable == 'true' ? _SocketProfile.start() : _SocketProfile.pause();
+  }
+  return json.encode({
+    'type': 'SocketProfilingState',
+    'enabled': _SocketProfile.enableSocketProfiling,
+  });
+}
+
 abstract class _SocketProfile {
   static const _kType = 'SocketProfile';
+  static set enableSocketProfiling(bool enabled) {
+    if (enabled != _enableSocketProfiling) {
+      postEvent('SocketProfilingStateChange', {
+        'isolateId': Service.getIsolateID(Isolate.current),
+        'enabled': enabled,
+      });
+      _enableSocketProfiling = enabled;
+    }
+  }
+
+  static bool get enableSocketProfiling => _enableSocketProfiling;
+
   static bool _enableSocketProfiling = false;
   static Map<int, _SocketStatistic> _idToSocketStatistic = {};
 
@@ -194,12 +229,12 @@
   }
 
   static String start() {
-    _enableSocketProfiling = true;
+    enableSocketProfiling = true;
     return _success();
   }
 
   static String pause() {
-    _enableSocketProfiling = false;
+    enableSocketProfiling = false;
     return _success();
   }
 
diff --git a/sdk/lib/io/secure_socket.dart b/sdk/lib/io/secure_socket.dart
index 98d2dcf..e5a757f 100644
--- a/sdk/lib/io/secure_socket.dart
+++ b/sdk/lib/io/secure_socket.dart
@@ -785,7 +785,7 @@
     _close();
   }
 
-  void _closeHandler() {
+  void _closeHandler() async {
     if (_status == connectedStatus) {
       if (_closedRead) return;
       _socketClosedRead = true;
@@ -796,7 +796,7 @@
           _close();
         }
       } else {
-        _scheduleFilter();
+        await _scheduleFilter();
       }
     } else if (_status == handshakeStatus) {
       _socketClosedRead = true;
@@ -805,26 +805,23 @@
             new HandshakeException('Connection terminated during handshake'),
             null);
       } else {
-        _secureHandshake();
+        await _secureHandshake();
       }
     }
   }
 
-  void _secureHandshake() {
+  Future<void> _secureHandshake() async {
     try {
-      _secureFilter!.handshake().then((needRetryHandshake) {
-        if (needRetryHandshake) {
-          // Some certificates have been evaluated, need to rety handshake.
-          _secureHandshake();
-        } else {
-          _filterStatus.writeEmpty = false;
-          _readSocket();
-          _writeSocket();
-          _scheduleFilter();
-        }
-      }).catchError((e, stackTrace) {
-        _reportError(e, stackTrace);
-      });
+      bool needRetryHandshake = await _secureFilter!.handshake();
+      if (needRetryHandshake) {
+        // Some certificates have been evaluated, need to retry handshake.
+        await _secureHandshake();
+      } else {
+        _filterStatus.writeEmpty = false;
+        _readSocket();
+        _writeSocket();
+        await _scheduleFilter();
+      }
     } catch (e, stackTrace) {
       _reportError(e, stackTrace);
     }
@@ -885,67 +882,71 @@
     }
   }
 
-  void _scheduleFilter() {
+  Future<void> _scheduleFilter() async {
     _filterPending = true;
-    _tryFilter();
+    return _tryFilter();
   }
 
-  void _tryFilter() {
+  Future<void> _tryFilter() async {
     if (_status == closedStatus) {
       return;
     }
-    if (_filterPending && !_filterActive) {
-      _filterActive = true;
-      _filterPending = false;
-      _pushAllFilterStages().then((status) {
-        _filterStatus = status;
-        _filterActive = false;
-        if (_status == closedStatus) {
-          _secureFilter!.destroy();
-          _secureFilter = null;
-          return;
-        }
-        _socket.readEventsEnabled = true;
-        if (_filterStatus.writeEmpty && _closedWrite && !_socketClosedWrite) {
-          // Checks for and handles all cases of partially closed sockets.
-          shutdown(SocketDirection.send);
-          if (_status == closedStatus) {
-            return;
-          }
-        }
-        if (_filterStatus.readEmpty && _socketClosedRead && !_closedRead) {
-          if (_status == handshakeStatus) {
-            _secureFilter!.handshake();
-            if (_status == handshakeStatus) {
-              throw new HandshakeException(
-                  'Connection terminated during handshake');
-            }
-          }
-          _closeHandler();
-        }
+    if (!_filterPending || _filterActive) {
+      return;
+    }
+    _filterActive = true;
+    _filterPending = false;
+
+    try {
+      _filterStatus = await _pushAllFilterStages();
+      _filterActive = false;
+      if (_status == closedStatus) {
+        _secureFilter!.destroy();
+        _secureFilter = null;
+        return;
+      }
+      _socket.readEventsEnabled = true;
+      if (_filterStatus.writeEmpty && _closedWrite && !_socketClosedWrite) {
+        // Checks for and handles all cases of partially closed sockets.
+        shutdown(SocketDirection.send);
         if (_status == closedStatus) {
           return;
         }
-        if (_filterStatus.progress) {
-          _filterPending = true;
-          if (_filterStatus.writeEncryptedNoLongerEmpty) {
-            _writeSocket();
-          }
-          if (_filterStatus.writePlaintextNoLongerFull) {
-            _sendWriteEvent();
-          }
-          if (_filterStatus.readEncryptedNoLongerFull) {
-            _readSocket();
-          }
-          if (_filterStatus.readPlaintextNoLongerEmpty) {
-            _scheduleReadEvent();
-          }
+      }
+      if (_filterStatus.readEmpty && _socketClosedRead && !_closedRead) {
+        if (_status == handshakeStatus) {
+          _secureFilter!.handshake();
           if (_status == handshakeStatus) {
-            _secureHandshake();
+            throw new HandshakeException(
+                'Connection terminated during handshake');
           }
         }
-        _tryFilter();
-      }).catchError(_reportError);
+        _closeHandler();
+      }
+      if (_status == closedStatus) {
+        return;
+      }
+      if (_filterStatus.progress) {
+        _filterPending = true;
+        if (_filterStatus.writeEncryptedNoLongerEmpty) {
+          _writeSocket();
+        }
+        if (_filterStatus.writePlaintextNoLongerFull) {
+          _sendWriteEvent();
+        }
+        if (_filterStatus.readEncryptedNoLongerFull) {
+          _readSocket();
+        }
+        if (_filterStatus.readPlaintextNoLongerEmpty) {
+          _scheduleReadEvent();
+        }
+        if (_status == handshakeStatus) {
+          await _secureHandshake();
+        }
+      }
+      return _tryFilter();
+    } catch (e, st) {
+      _reportError(e, st);
     }
   }
 
@@ -1024,7 +1025,7 @@
     }
   }
 
-  Future<_FilterStatus> _pushAllFilterStages() {
+  Future<_FilterStatus> _pushAllFilterStages() async {
     bool wasInHandshake = _status != connectedStatus;
     List args = new List<dynamic>.filled(2 + bufferCount * 2, null);
     args[0] = _secureFilter!._pointer();
@@ -1035,75 +1036,74 @@
       args[2 * i + 3] = bufs[i].end;
     }
 
-    return _IOService._dispatch(_IOService.sslProcessFilter, args)
-        .then((response) {
-      if (response.length == 2) {
-        if (wasInHandshake) {
-          // If we're in handshake, throw a handshake error.
-          _reportError(
-              new HandshakeException('${response[1]} error ${response[0]}'),
-              null);
-        } else {
-          // If we're connected, throw a TLS error.
-          _reportError(
-              new TlsException('${response[1]} error ${response[0]}'), null);
-        }
+    var response =
+        await _IOService._dispatch(_IOService.sslProcessFilter, args);
+    if (response.length == 2) {
+      if (wasInHandshake) {
+        // If we're in handshake, throw a handshake error.
+        _reportError(
+            new HandshakeException('${response[1]} error ${response[0]}'),
+            null);
+      } else {
+        // If we're connected, throw a TLS error.
+        _reportError(
+            new TlsException('${response[1]} error ${response[0]}'), null);
       }
-      int start(int index) => response[2 * index];
-      int end(int index) => response[2 * index + 1];
+    }
+    int start(int index) => response[2 * index];
+    int end(int index) => response[2 * index + 1];
 
-      _FilterStatus status = new _FilterStatus();
-      // Compute writeEmpty as "write plaintext buffer and write encrypted
-      // buffer were empty when we started and are empty now".
-      status.writeEmpty = bufs[writePlaintextId].isEmpty &&
-          start(writeEncryptedId) == end(writeEncryptedId);
-      // If we were in handshake when this started, _writeEmpty may be false
-      // because the handshake wrote data after we checked.
-      if (wasInHandshake) status.writeEmpty = false;
+    _FilterStatus status = new _FilterStatus();
+    // Compute writeEmpty as "write plaintext buffer and write encrypted
+    // buffer were empty when we started and are empty now".
+    status.writeEmpty = bufs[writePlaintextId].isEmpty &&
+        start(writeEncryptedId) == end(writeEncryptedId);
+    // If we were in handshake when this started, _writeEmpty may be false
+    // because the handshake wrote data after we checked.
+    if (wasInHandshake) status.writeEmpty = false;
 
-      // Compute readEmpty as "both read buffers were empty when we started
-      // and are empty now".
-      status.readEmpty = bufs[readEncryptedId].isEmpty &&
-          start(readPlaintextId) == end(readPlaintextId);
+    // Compute readEmpty as "both read buffers were empty when we started
+    // and are empty now".
+    status.readEmpty = bufs[readEncryptedId].isEmpty &&
+        start(readPlaintextId) == end(readPlaintextId);
 
-      _ExternalBuffer buffer = bufs[writePlaintextId];
-      int new_start = start(writePlaintextId);
-      if (new_start != buffer.start) {
-        status.progress = true;
-        if (buffer.free == 0) {
-          status.writePlaintextNoLongerFull = true;
-        }
-        buffer.start = new_start;
+    _ExternalBuffer buffer = bufs[writePlaintextId];
+    int new_start = start(writePlaintextId);
+    if (new_start != buffer.start) {
+      status.progress = true;
+      if (buffer.free == 0) {
+        status.writePlaintextNoLongerFull = true;
       }
-      buffer = bufs[readEncryptedId];
-      new_start = start(readEncryptedId);
-      if (new_start != buffer.start) {
-        status.progress = true;
-        if (buffer.free == 0) {
-          status.readEncryptedNoLongerFull = true;
-        }
-        buffer.start = new_start;
+      buffer.start = new_start;
+    }
+    buffer = bufs[readEncryptedId];
+    new_start = start(readEncryptedId);
+    if (new_start != buffer.start) {
+      status.progress = true;
+      if (buffer.free == 0) {
+        status.readEncryptedNoLongerFull = true;
       }
-      buffer = bufs[writeEncryptedId];
-      int new_end = end(writeEncryptedId);
-      if (new_end != buffer.end) {
-        status.progress = true;
-        if (buffer.length == 0) {
-          status.writeEncryptedNoLongerEmpty = true;
-        }
-        buffer.end = new_end;
+      buffer.start = new_start;
+    }
+    buffer = bufs[writeEncryptedId];
+    int new_end = end(writeEncryptedId);
+    if (new_end != buffer.end) {
+      status.progress = true;
+      if (buffer.length == 0) {
+        status.writeEncryptedNoLongerEmpty = true;
       }
-      buffer = bufs[readPlaintextId];
-      new_end = end(readPlaintextId);
-      if (new_end != buffer.end) {
-        status.progress = true;
-        if (buffer.length == 0) {
-          status.readPlaintextNoLongerEmpty = true;
-        }
-        buffer.end = new_end;
+      buffer.end = new_end;
+    }
+    buffer = bufs[readPlaintextId];
+    new_end = end(readPlaintextId);
+    if (new_end != buffer.end) {
+      status.progress = true;
+      if (buffer.length == 0) {
+        status.readPlaintextNoLongerEmpty = true;
       }
-      return status;
-    });
+      buffer.end = new_end;
+    }
+    return status;
   }
 }
 
diff --git a/sdk/lib/isolate/isolate.dart b/sdk/lib/isolate/isolate.dart
index 0c5747e..b7650dd 100644
--- a/sdk/lib/isolate/isolate.dart
+++ b/sdk/lib/isolate/isolate.dart
@@ -671,9 +671,12 @@
    * receive messages. See [Stream.asBroadcastStream] for transforming the port
    * to a broadcast stream.
    *
+   * The optional `debugName` parameter can be set to associate a name with
+   * this port that can be displayed in tooling.
+   *
    * A receive port is closed by canceling its subscription.
    */
-  external factory ReceivePort();
+  external factory ReceivePort([String debugName = '']);
 
   /**
    * Creates a [ReceivePort] from a [RawReceivePort].
@@ -718,8 +721,12 @@
    * A [RawReceivePort] is low level and does not work with [Zone]s. It
    * can not be paused. The data-handler must be set before the first
    * event is received.
+   *
+   * The optional `debugName` parameter can be set to associate a name with
+   * this port that can be displayed in tooling.
+   *
    */
-  external factory RawReceivePort([Function? handler]);
+  external factory RawReceivePort([Function? handler, String debugName = '']);
 
   /**
    * Sets the handler that is invoked for every incoming message.
diff --git a/sdk/lib/math/jenkins_smi_hash.dart b/sdk/lib/math/jenkins_smi_hash.dart
deleted file mode 100644
index deca56c..0000000
--- a/sdk/lib/math/jenkins_smi_hash.dart
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright (c) 2013, 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.
-
-part of dart.math;
-
-/// This is the [Jenkins hash function][1] but using masking to keep
-/// values in SMI range.
-///
-/// [1]: http://en.wikipedia.org/wiki/Jenkins_hash_function
-///
-/// Use:
-/// Hash each value with the hash of the previous value, then get the final
-/// hash by calling finish.
-///
-///     var hash = 0;
-///     for (var value in values) {
-///       hash = JenkinsSmiHash.combine(hash, value.hashCode);
-///     }
-///     hash = JenkinsSmiHash.finish(hash);
-class _JenkinsSmiHash {
-  // TODO(11617): This class should be optimized and standardized elsewhere.
-
-  static int combine(int hash, int value) {
-    hash = 0x1fffffff & (hash + value);
-    hash = 0x1fffffff & (hash + ((0x0007ffff & hash) << 10));
-    return hash ^ (hash >> 6);
-  }
-
-  static int finish(int hash) {
-    hash = 0x1fffffff & (hash + ((0x03ffffff & hash) << 3));
-    hash = hash ^ (hash >> 11);
-    return 0x1fffffff & (hash + ((0x00003fff & hash) << 15));
-  }
-
-  static int hash2(int a, int b) => finish(combine(combine(0, a), b));
-
-  static int hash4(int a, int b, int c, int d) =>
-      finish(combine(combine(combine(combine(0, a), b), c), d));
-}
diff --git a/sdk/lib/math/math.dart b/sdk/lib/math/math.dart
index b335669..8f847b1 100644
--- a/sdk/lib/math/math.dart
+++ b/sdk/lib/math/math.dart
@@ -11,7 +11,8 @@
 /// {@category Core}
 library dart.math;
 
-part "jenkins_smi_hash.dart";
+import "dart:_internal" show SystemHash;
+
 part "point.dart";
 part "random.dart";
 part "rectangle.dart";
diff --git a/sdk/lib/math/math_sources.gni b/sdk/lib/math/math_sources.gni
index ff8f3fa..c06aead 100644
--- a/sdk/lib/math/math_sources.gni
+++ b/sdk/lib/math/math_sources.gni
@@ -6,7 +6,6 @@
   "math.dart",
 
   # The above file needs to be first as it lists the parts below.
-  "jenkins_smi_hash.dart",
   "point.dart",
   "random.dart",
   "rectangle.dart",
diff --git a/sdk/lib/math/point.dart b/sdk/lib/math/point.dart
index 4b0fed5..f092fc8 100644
--- a/sdk/lib/math/point.dart
+++ b/sdk/lib/math/point.dart
@@ -23,7 +23,7 @@
   bool operator ==(Object other) =>
       other is Point && x == other.x && y == other.y;
 
-  int get hashCode => _JenkinsSmiHash.hash2(x.hashCode, y.hashCode);
+  int get hashCode => SystemHash.hash2(x.hashCode, y.hashCode);
 
   /// Add [other] to `this`, as if both points were vectors.
   ///
diff --git a/sdk/lib/math/rectangle.dart b/sdk/lib/math/rectangle.dart
index 2ee86c9..e80d790 100644
--- a/sdk/lib/math/rectangle.dart
+++ b/sdk/lib/math/rectangle.dart
@@ -48,7 +48,7 @@
       right == other.right &&
       bottom == other.bottom;
 
-  int get hashCode => _JenkinsSmiHash.hash4(
+  int get hashCode => SystemHash.hash4(
       left.hashCode, top.hashCode, right.hashCode, bottom.hashCode);
 
   /// Computes the intersection of `this` and [other].
diff --git a/sdk/lib/typed_data/typed_data.dart b/sdk/lib/typed_data/typed_data.dart
index eeafdc6..c796465 100644
--- a/sdk/lib/typed_data/typed_data.dart
+++ b/sdk/lib/typed_data/typed_data.dart
@@ -483,9 +483,9 @@
    * If the length is not specified, it defaults to `null`,
    * which indicates that the view extends to the end of the byte buffer.
    *
-   * Throws [RangeError] if [offsetInBytes] or [length] are negative, or
-   * if [offsetInBytes] + ([length] * elementSizeInBytes) is greater than
-   * the length of [buffer].
+   * The [offsetInBytes] and [length] must be non-negative, and
+   * [offsetInBytes] + ([length] * elementSizeInBytes) must be less than or
+   * equal to the length of [buffer].
    *
    * Note that when creating a view from a [TypedData] list or byte data,
    * that list or byte data may itself be a view on a larger buffer
@@ -545,8 +545,8 @@
    *
    * The return value will be between -128 and 127, inclusive.
    *
-   * Throws [RangeError] if [byteOffset] is negative, or
-   * greater than or equal to the length of this object.
+   * The [byteOffset] must be non-negative, and
+   * less than the length of this object.
    */
   int getInt8(int byteOffset);
 
@@ -557,8 +557,8 @@
    *
    * In other words, [value] must be between -128 and 127, inclusive.
    *
-   * Throws [RangeError] if [byteOffset] is negative, or
-   * greater than or equal to the length of this object.
+   * The [byteOffset] must be non-negative, and
+   * less than the length of this object.
    */
   void setInt8(int byteOffset, int value);
 
@@ -568,8 +568,8 @@
    *
    * The return value will be between 0 and 255, inclusive.
    *
-   * Throws [RangeError] if [byteOffset] is negative, or
-   * greater than or equal to the length of this object.
+   * The [byteOffset] must be non-negative, and
+   * less than the length of this object.
    */
   int getUint8(int byteOffset);
 
@@ -580,8 +580,8 @@
    *
    * In other words, [value] must be between 0 and 255, inclusive.
    *
-   * Throws [RangeError] if [byteOffset] is negative,
-   * or greater than or equal to the length of this object.
+   * The [byteOffset] must be non-negative, and
+   * less than the length of this object.
    */
   void setUint8(int byteOffset, int value);
 
@@ -593,8 +593,8 @@
    * The return value will be between -2<sup>15</sup> and 2<sup>15</sup> - 1,
    * inclusive.
    *
-   * Throws [RangeError] if [byteOffset] is negative, or
-   * `byteOffset + 2` is greater than the length of this object.
+   * The [byteOffset] must be non-negative, and
+   * `byteOffset + 2` must be less than or equal to the length of this object.
    */
   int getInt16(int byteOffset, [Endian endian = Endian.big]);
 
@@ -606,8 +606,8 @@
    * In other words, [value] must lie
    * between -2<sup>15</sup> and 2<sup>15</sup> - 1, inclusive.
    *
-   * Throws [RangeError] if [byteOffset] is negative, or
-   * `byteOffset + 2` is greater than the length of this object.
+   * The [byteOffset] must be non-negative, and
+   * `byteOffset + 2` must be less than or equal to the length of this object.
    */
   void setInt16(int byteOffset, int value, [Endian endian = Endian.big]);
 
@@ -618,8 +618,8 @@
    *
    * The return value will be between 0 and  2<sup>16</sup> - 1, inclusive.
    *
-   * Throws [RangeError] if [byteOffset] is negative, or
-   * `byteOffset + 2` is greater than the length of this object.
+   * The [byteOffset] must be non-negative, and
+   * `byteOffset + 2` must be less than or equal to the length of this object.
    */
   int getUint16(int byteOffset, [Endian endian = Endian.big]);
 
@@ -631,8 +631,8 @@
    * In other words, [value] must be between
    * 0 and 2<sup>16</sup> - 1, inclusive.
    *
-   * Throws [RangeError] if [byteOffset] is negative, or
-   * `byteOffset + 2` is greater than the length of this object.
+   * The [byteOffset] must be non-negative, and
+   * `byteOffset + 2` must be less than or equal to the length of this object.
    */
   void setUint16(int byteOffset, int value, [Endian endian = Endian.big]);
 
@@ -644,8 +644,8 @@
    * The return value will be between -2<sup>31</sup> and 2<sup>31</sup> - 1,
    * inclusive.
    *
-   * Throws [RangeError] if [byteOffset] is negative, or
-   * `byteOffset + 4` is greater than the length of this object.
+   * The [byteOffset] must be non-negative, and
+   * `byteOffset + 4` must be less than or equal to the length of this object.
    */
   int getInt32(int byteOffset, [Endian endian = Endian.big]);
 
@@ -657,8 +657,8 @@
    * In other words, [value] must lie
    * between -2<sup>31</sup> and 2<sup>31</sup> - 1, inclusive.
    *
-   * Throws [RangeError] if [byteOffset] is negative, or
-   * `byteOffset + 4` is greater than the length of this object.
+   * The [byteOffset] must be non-negative, and
+   * `byteOffset + 4` must be less than or equal to the length of this object.
    */
   void setInt32(int byteOffset, int value, [Endian endian = Endian.big]);
 
@@ -669,8 +669,8 @@
    *
    * The return value will be between 0 and  2<sup>32</sup> - 1, inclusive.
    *
-   * Throws [RangeError] if [byteOffset] is negative, or
-   * `byteOffset + 4` is greater than the length of this object.
+   * The [byteOffset] must be non-negative, and
+   * `byteOffset + 4` must be less than or equal to the length of this object.
    */
   int getUint32(int byteOffset, [Endian endian = Endian.big]);
 
@@ -682,8 +682,8 @@
    * In other words, [value] must be between
    * 0 and 2<sup>32</sup> - 1, inclusive.
    *
-   * Throws [RangeError] if [byteOffset] is negative, or
-   * `byteOffset + 4` is greater than the length of this object.
+   * The [byteOffset] must be non-negative, and
+   * `byteOffset + 4` must be less than or equal to the length of this object.
    */
   void setUint32(int byteOffset, int value, [Endian endian = Endian.big]);
 
@@ -695,8 +695,8 @@
    * The return value will be between -2<sup>63</sup> and 2<sup>63</sup> - 1,
    * inclusive.
    *
-   * Throws [RangeError] if [byteOffset] is negative, or
-   * `byteOffset + 8` is greater than the length of this object.
+   * The [byteOffset] must be non-negative, and
+   * `byteOffset + 8` must be less than or equal to the length of this object.
    */
   int getInt64(int byteOffset, [Endian endian = Endian.big]);
 
@@ -708,8 +708,8 @@
    * In other words, [value] must lie
    * between -2<sup>63</sup> and 2<sup>63</sup> - 1, inclusive.
    *
-   * Throws [RangeError] if [byteOffset] is negative, or
-   * `byteOffset + 8` is greater than the length of this object.
+   * The [byteOffset] must be non-negative, and
+   * `byteOffset + 8` must be less than or equal to the length of this object.
    */
   void setInt64(int byteOffset, int value, [Endian endian = Endian.big]);
 
@@ -720,8 +720,8 @@
    *
    * The return value will be between 0 and  2<sup>64</sup> - 1, inclusive.
    *
-   * Throws [RangeError] if [byteOffset] is negative, or
-   * `byteOffset + 8` is greater than the length of this object.
+   * The [byteOffset] must be non-negative, and
+   * `byteOffset + 8` must be less than or equal to the length of this object.
    */
   int getUint64(int byteOffset, [Endian endian = Endian.big]);
 
@@ -733,8 +733,8 @@
    * In other words, [value] must be between
    * 0 and 2<sup>64</sup> - 1, inclusive.
    *
-   * Throws [RangeError] if [byteOffset] is negative, or
-   * `byteOffset + 8` is greater than the length of this object.
+   * The [byteOffset] must be non-negative, and
+   * `byteOffset + 8` must be less than or equal to the length of this object.
    */
   void setUint64(int byteOffset, int value, [Endian endian = Endian.big]);
 
@@ -743,8 +743,8 @@
    * the specified [byteOffset] in this object, in IEEE 754
    * single-precision binary floating-point format (binary32).
    *
-   * Throws [RangeError] if [byteOffset] is negative, or
-   * `byteOffset + 4` is greater than the length of this object.
+   * The [byteOffset] must be non-negative, and
+   * `byteOffset + 4` must be less than or equal to the length of this object.
    */
   double getFloat32(int byteOffset, [Endian endian = Endian.big]);
 
@@ -762,8 +762,8 @@
    * Note that finite (but large) values can be converted to infinity, and
    * small non-zero values can be converted to zero.
    *
-   * Throws [RangeError] if [byteOffset] is negative, or
-   * `byteOffset + 4` is greater than the length of this object.
+   * The [byteOffset] must be non-negative, and
+   * `byteOffset + 4` must be less than or equal to the length of this object.
    */
   void setFloat32(int byteOffset, double value, [Endian endian = Endian.big]);
 
@@ -772,8 +772,8 @@
    * the specified [byteOffset] in this object, in IEEE 754
    * double-precision binary floating-point format (binary64).
    *
-   * Throws [RangeError] if [byteOffset] is negative, or
-   * `byteOffset + 8` is greater than the length of this object.
+   * The [byteOffset] must be non-negative, and
+   * `byteOffset + 8` must be less than or equal to the length of this object.
    */
   double getFloat64(int byteOffset, [Endian endian = Endian.big]);
 
@@ -782,8 +782,8 @@
    * object to the IEEE 754 double-precision binary floating-point
    * (binary64) representation of the specified [value].
    *
-   * Throws [RangeError] if [byteOffset] is negative, or
-   * `byteOffset + 8` is greater than the length of this object.
+   * The [byteOffset] must be non-negative, and
+   * `byteOffset + 8` must be less than or equal to the length of this object.
    */
   void setFloat64(int byteOffset, double value, [Endian endian = Endian.big]);
 }
@@ -829,9 +829,9 @@
    * If the length is not specified, it defaults to `null`,
    * which indicates that the view extends to the end of the byte buffer.
    *
-   * Throws [RangeError] if [offsetInBytes] or [length] are negative, or
-   * if [offsetInBytes] + ([length] * elementSizeInBytes) is greater than
-   * the length of [buffer].
+   * The [offsetInBytes] and [length] must be non-negative, and
+   * [offsetInBytes] + ([length] * elementSizeInBytes) must be less than or
+   * equal to the length of [buffer].
    *
    * Note that when creating a view from a [TypedData] list or byte data,
    * that list or byte data may itself be a view on a larger buffer
@@ -952,9 +952,9 @@
    * If the length is not specified, it defaults to `null`,
    * which indicates that the view extends to the end of the byte buffer.
    *
-   * Throws [RangeError] if [offsetInBytes] or [length] are negative, or
-   * if [offsetInBytes] + ([length] * elementSizeInBytes) is greater than
-   * the length of [buffer].
+   * The [offsetInBytes] and [length] must be non-negative, and
+   * [offsetInBytes] + ([length] * elementSizeInBytes) must be less than or
+   * equal to the length of [buffer].
    *
    * Note that when creating a view from a [TypedData] list or byte data,
    * that list or byte data may itself be a view on a larger buffer
@@ -1085,9 +1085,9 @@
    * If the length is not specified, it defaults to `null`,
    * which indicates that the view extends to the end of the byte buffer.
    *
-   * Throws [RangeError] if [offsetInBytes] or [length] are negative, or
-   * if [offsetInBytes] + ([length] * elementSizeInBytes) is greater than
-   * the length of [buffer].
+   * The [offsetInBytes] and [length] must be non-negative, and
+   * [offsetInBytes] + ([length] * elementSizeInBytes) must be less than or
+   * equal to the length of [buffer].
    *
    * Note that when creating a view from a [TypedData] list or byte data,
    * that list or byte data may itself be a view on a larger buffer
@@ -1211,12 +1211,11 @@
    * If the length is not specified, it defaults to `null`,
    * which indicates that the view extends to the end of the byte buffer.
    *
-   * Throws [RangeError] if [offsetInBytes] or [length] are negative, or
-   * if [offsetInBytes] + ([length] * elementSizeInBytes) is greater than
-   * the length of [buffer].
+   * The [offsetInBytes] and [length] must be non-negative, and
+   * [offsetInBytes] + ([length] * elementSizeInBytes) must be less than or
+   * equal to the length of [buffer].
    *
-   * Throws [ArgumentError] if [offsetInBytes] is not a multiple of
-   * [bytesPerElement].
+   * The [offsetInBytes] must be a multiple of [bytesPerElement].
    *
    * Note that when creating a view from a [TypedData] list or byte data,
    * that list or byte data may itself be a view on a larger buffer
@@ -1348,12 +1347,11 @@
    * If the length is not specified, it defaults to `null`,
    * which indicates that the view extends to the end of the byte buffer.
    *
-   * Throws [RangeError] if [offsetInBytes] or [length] are negative, or
-   * if [offsetInBytes] + ([length] * elementSizeInBytes) is greater than
-   * the length of [buffer].
+   * The [offsetInBytes] and [length] must be non-negative, and
+   * [offsetInBytes] + ([length] * elementSizeInBytes) must be less than or
+   * equal to the length of [buffer].
    *
-   * Throws [ArgumentError] if [offsetInBytes] is not a multiple of
-   * [bytesPerElement].
+   * The [offsetInBytes] must be a multiple of [bytesPerElement].
    *
    * Note that when creating a view from a [TypedData] list or byte data,
    * that list or byte data may itself be a view on a larger buffer
@@ -1484,12 +1482,11 @@
    * If the length is not specified, it defaults to `null`,
    * which indicates that the view extends to the end of the byte buffer.
    *
-   * Throws [RangeError] if [offsetInBytes] or [length] are negative, or
-   * if [offsetInBytes] + ([length] * elementSizeInBytes) is greater than
-   * the length of [buffer].
+   * The [offsetInBytes] and [length] must be non-negative, and
+   * [offsetInBytes] + ([length] * elementSizeInBytes) must be less than or
+   * equal to the length of [buffer].
    *
-   * Throws [ArgumentError] if [offsetInBytes] is not a multiple of
-   * [bytesPerElement].
+   * The [offsetInBytes] must be a multiple of [bytesPerElement].
    *
    * Note that when creating a view from a [TypedData] list or byte data,
    * that list or byte data may itself be a view on a larger buffer
@@ -1621,12 +1618,11 @@
    * If the length is not specified, it defaults to `null`,
    * which indicates that the view extends to the end of the byte buffer.
    *
-   * Throws [RangeError] if [offsetInBytes] or [length] are negative, or
-   * if [offsetInBytes] + ([length] * elementSizeInBytes) is greater than
-   * the length of [buffer].
+   * The [offsetInBytes] and [length] must be non-negative, and
+   * [offsetInBytes] + ([length] * elementSizeInBytes) must be less than or
+   * equal to the length of [buffer].
    *
-   * Throws [ArgumentError] if [offsetInBytes] is not a multiple of
-   * [bytesPerElement].
+   * The [offsetInBytes] must be a multiple of [bytesPerElement].
    *
    * Note that when creating a view from a [TypedData] list or byte data,
    * that list or byte data may itself be a view on a larger buffer
@@ -1757,12 +1753,11 @@
    * If the length is not specified, it defaults to `null`,
    * which indicates that the view extends to the end of the byte buffer.
    *
-   * Throws [RangeError] if [offsetInBytes] or [length] are negative, or
-   * if [offsetInBytes] + ([length] * elementSizeInBytes) is greater than
-   * the length of [buffer].
+   * The [offsetInBytes] and [length] must be non-negative, and
+   * [offsetInBytes] + ([length] * elementSizeInBytes) must be less than or
+   * equal to the length of [buffer].
    *
-   * Throws [ArgumentError] if [offsetInBytes] is not a multiple of
-   * [bytesPerElement].
+   * The [offsetInBytes] must be a multiple of [bytesPerElement].
    *
    * Note that when creating a view from a [TypedData] list or byte data,
    * that list or byte data may itself be a view on a larger buffer
@@ -1894,12 +1889,11 @@
    * If the length is not specified, it defaults to `null`,
    * which indicates that the view extends to the end of the byte buffer.
    *
-   * Throws [RangeError] if [offsetInBytes] or [length] are negative, or
-   * if [offsetInBytes] + ([length] * elementSizeInBytes) is greater than
-   * the length of [buffer].
+   * The [offsetInBytes] and [length] must be non-negative, and
+   * [offsetInBytes] + ([length] * elementSizeInBytes) must be less than or
+   * equal to the length of [buffer].
    *
-   * Throws [ArgumentError] if [offsetInBytes] is not a multiple of
-   * [bytesPerElement].
+   * The [offsetInBytes] must be a multiple of [bytesPerElement].
    *
    * Note that when creating a view from a [TypedData] list or byte data,
    * that list or byte data may itself be a view on a larger buffer
@@ -2031,12 +2025,11 @@
    * If the length is not specified, it defaults to `null`,
    * which indicates that the view extends to the end of the byte buffer.
    *
-   * Throws [RangeError] if [offsetInBytes] or [length] are negative, or
-   * if [offsetInBytes] + ([length] * elementSizeInBytes) is greater than
-   * the length of [buffer].
+   * The [offsetInBytes] and [length] must be non-negative, and
+   * [offsetInBytes] + ([length] * elementSizeInBytes) must be less than or
+   * equal to the length of [buffer].
    *
-   * Throws [ArgumentError] if [offsetInBytes] is not a multiple of
-   * [bytesPerElement].
+   * The [offsetInBytes] must be a multiple of [bytesPerElement].
    *
    * Note that when creating a view from a [TypedData] list or byte data,
    * that list or byte data may itself be a view on a larger buffer
@@ -2161,12 +2154,11 @@
    * If the length is not specified, it defaults to `null`,
    * which indicates that the view extends to the end of the byte buffer.
    *
-   * Throws [RangeError] if [offsetInBytes] or [length] are negative, or
-   * if [offsetInBytes] + ([length] * elementSizeInBytes) is greater than
-   * the length of [buffer].
+   * The [offsetInBytes] and [length] must be non-negative, and
+   * [offsetInBytes] + ([length] * elementSizeInBytes) must be less than or
+   * equal to the length of [buffer].
    *
-   * Throws [ArgumentError] if [offsetInBytes] is not a multiple of
-   * [bytesPerElement].
+   * The [offsetInBytes] must be a multiple of [bytesPerElement].
    *
    * Note that when creating a view from a [TypedData] list or byte data,
    * that list or byte data may itself be a view on a larger buffer
@@ -2290,12 +2282,11 @@
    * If the length is not specified, it defaults to `null`,
    * which indicates that the view extends to the end of the byte buffer.
    *
-   * Throws [RangeError] if [offsetInBytes] or [length] are negative, or
-   * if [offsetInBytes] + ([length] * elementSizeInBytes) is greater than
-   * the length of [buffer].
+   * The [offsetInBytes] and [length] must be non-negative, and
+   * [offsetInBytes] + ([length] * elementSizeInBytes) must be less than or
+   * equal to the length of [buffer].
    *
-   * Throws [ArgumentError] if [offsetInBytes] is not a multiple of
-   * [bytesPerElement].
+   * The [offsetInBytes] must be a multiple of [bytesPerElement].
    *
    * Note that when creating a view from a [TypedData] list or byte data,
    * that list or byte data may itself be a view on a larger buffer
@@ -2427,12 +2418,11 @@
    * If the length is not specified, it defaults to `null`,
    * which indicates that the view extends to the end of the byte buffer.
    *
-   * Throws [RangeError] if [offsetInBytes] or [length] are negative, or
-   * if [offsetInBytes] + ([length] * elementSizeInBytes) is greater than
-   * the length of [buffer].
+   * The [offsetInBytes] and [length] must be non-negative, and
+   * [offsetInBytes] + ([length] * elementSizeInBytes) must be less than or
+   * equal to the length of [buffer].
    *
-   * Throws [ArgumentError] if [offsetInBytes] is not a multiple of
-   * [bytesPerElement].
+   * The [offsetInBytes] must be a multiple of [bytesPerElement].
    *
    * Note that when creating a view from a [TypedData] list or byte data,
    * that list or byte data may itself be a view on a larger buffer
@@ -2572,12 +2562,11 @@
    * If the length is not specified, it defaults to `null`,
    * which indicates that the view extends to the end of the byte buffer.
    *
-   * Throws [RangeError] if [offsetInBytes] or [length] are negative, or
-   * if [offsetInBytes] + ([length] * elementSizeInBytes) is greater than
-   * the length of [buffer].
+   * The [offsetInBytes] and [length] must be non-negative, and
+   * [offsetInBytes] + ([length] * elementSizeInBytes) must be less than or
+   * equal to the length of [buffer].
    *
-   * Throws [ArgumentError] if [offsetInBytes] is not a multiple of
-   * [bytesPerElement].
+   * The [offsetInBytes] must be a multiple of [bytesPerElement].
    *
    * Note that when creating a view from a [TypedData] list or byte data,
    * that list or byte data may itself be a view on a larger buffer
diff --git a/sdk/lib/vmservice/vmservice.dart b/sdk/lib/vmservice/vmservice.dart
index 755e934..98ce332 100644
--- a/sdk/lib/vmservice/vmservice.dart
+++ b/sdk/lib/vmservice/vmservice.dart
@@ -258,7 +258,7 @@
     }
     acceptNewWebSocketConnections(false);
     _ddsUri = Uri.parse(uri);
-    await VMServiceEmbedderHooks?.ddsConnected!();
+    await VMServiceEmbedderHooks.ddsConnected!();
     return encodeSuccess(message);
   }
 
diff --git a/tests/co19/co19-dart2js.status b/tests/co19/co19-dart2js.status
index 8319487..6bb5259 100644
--- a/tests/co19/co19-dart2js.status
+++ b/tests/co19/co19-dart2js.status
@@ -17,6 +17,8 @@
 Language/Expressions/Shift/integer_t01: SkipByDesign # big integer cannot be represented in JavaScript
 Language/Expressions/Shift/integer_t02: SkipByDesign # big integer cannot be represented in JavaScript
 Language/Expressions/Spawning_an_Isolate/new_isolate_t01: SkipByDesign
+Language/Libraries_and_Scripts/Scripts/main_optional_parameters_t01: SkipByDesign # https://github.com/dart-lang/co19/issues/952
+Language/Libraries_and_Scripts/Scripts/main_optional_parameters_t03: SkipByDesign # https://github.com/dart-lang/co19/issues/952
 Language/Metadata/before*: Skip # dart:mirrors not supported https://github.com/dart-lang/co19/issues/523.
 Language/Reference/Operator_Precedence/precedence_15_unary_prefix_t08: SkipByDesign # binary '~' produces different results in JavaScript and Dart
 LibTest/core/DateTime/DateTime.fromMicrosecondsSinceEpoch_A01_t01: SkipByDesign # microseconds are not supported in JavaScript
diff --git a/tests/co19/co19-runtime.status b/tests/co19/co19-runtime.status
index 0a91266..8eb32b2 100644
--- a/tests/co19/co19-runtime.status
+++ b/tests/co19/co19-runtime.status
@@ -6,14 +6,39 @@
 LibTest/core/Uri/hasEmptyPath_A01_t01: RuntimeError
 LibTest/core/Uri/parse_A05_t01: RuntimeError
 
+[ $system == windows ]
+LibTest/io/Stdin/readByteSync_A01_t01: Skip # Issue 43645
+LibTest/io/Stdin/readByteSync_A01_t02: Skip # Issue 43645
+
 [ $arch == simarm64 && $runtime == dart_precompiled ]
 LibTest/async/Stream/Stream.periodic_all_t02: Skip # Issue 42898
 
 [ $compiler != dart2js && $runtime != none && $runtime != vm && !$checked ]
 LibTest/async/Future/catchError_A03_t05: RuntimeError
 
-[ $mode == debug && $nnbd != legacy && $runtime == dart_precompiled ]
-LibTest/collection/ListMixin/ListMixin_class_A01_t05: SkipSlow # Issue 43614
+[ $mode == debug && $runtime == dart_precompiled ]
+LibTest/collection/ListBase/ListBase_class_A01_t03: SkipSlow # Very slow compilation in debug mode.
+LibTest/collection/ListBase/ListBase_class_A01_t04: SkipSlow # Very slow compilation in debug mode.
+LibTest/collection/ListBase/ListBase_class_A01_t05: SkipSlow # Very slow compilation in debug mode.
+LibTest/collection/ListBase/ListBase_class_A01_t06: SkipSlow # Very slow compilation in debug mode.
+LibTest/collection/ListMixin/ListMixin_class_A01_t03: SkipSlow # Very slow compilation in debug mode.
+LibTest/collection/ListMixin/ListMixin_class_A01_t04: SkipSlow # Very slow compilation in debug mode.
+LibTest/collection/ListMixin/ListMixin_class_A01_t05: SkipSlow # Very slow compilation in debug mode.
+LibTest/collection/ListMixin/ListMixin_class_A01_t06: SkipSlow # Very slow compilation in debug mode.
+LibTest/core/List/List_all_t03: SkipSlow # Very slow compilation in debug mode.
+LibTest/core/List/List_all_t04: SkipSlow # Very slow compilation in debug mode.
+LibTest/core/List/List_all_t05: SkipSlow # Very slow compilation in debug mode.
+LibTest/core/List/List_all_t06: SkipSlow # Very slow compilation in debug mode.
+
+[ $arch == simarm || $arch == simarm64 ]
+LibTest/collection/ListBase/ListBase_class_A01_t01: SkipSlow # Very slow on sim* architectures.
+LibTest/collection/ListBase/ListBase_class_A01_t04: SkipSlow # Very slow on sim* architectures.
+LibTest/collection/ListBase/ListBase_class_A01_t05: SkipSlow # Very slow on sim* architectures.
+LibTest/collection/ListBase/ListBase_class_A01_t06: SkipSlow # Very slow on sim* architectures.
+LibTest/collection/ListMixin/ListMixin_class_A01_t01: SkipSlow # Very slow on sim* architectures.
+LibTest/collection/ListMixin/ListMixin_class_A01_t04: SkipSlow # Very slow on sim* architectures.
+LibTest/collection/ListMixin/ListMixin_class_A01_t05: SkipSlow # Very slow on sim* architectures.
+LibTest/collection/ListMixin/ListMixin_class_A01_t06: SkipSlow # Very slow on sim* architectures.
 
 [ $compiler == fasta || $runtime == dart_precompiled || $runtime == vm ]
 LibTest/html/*: SkipByDesign # dart:html not supported on VM.
diff --git a/tests/co19_2/co19_2-runtime.status b/tests/co19_2/co19_2-runtime.status
index c3ddffa..4246d55 100644
--- a/tests/co19_2/co19_2-runtime.status
+++ b/tests/co19_2/co19_2-runtime.status
@@ -6,8 +6,31 @@
 LibTest/core/Uri/hasEmptyPath_A01_t01: RuntimeError
 LibTest/core/Uri/parse_A05_t01: RuntimeError
 
+[ $system == windows ]
+LibTest/io/ProcessResult/exitCode_A01_t02: Skip # Issue 43645
+
 [ $compiler != dart2js && $runtime != none && $runtime != vm && !$checked ]
 LibTest/async/Future/catchError_A03_t05: RuntimeError
 
+[ $mode == debug && $runtime == dart_precompiled ]
+LibTest/collection/ListBase/ListBase_class_A01_t03: SkipSlow # Very slow compilation in debug mode.
+LibTest/collection/ListBase/ListBase_class_A01_t04: SkipSlow # Very slow compilation in debug mode.
+LibTest/collection/ListBase/ListBase_class_A01_t05: SkipSlow # Very slow compilation in debug mode.
+LibTest/collection/ListBase/ListBase_class_A01_t06: SkipSlow # Very slow compilation in debug mode.
+LibTest/collection/ListMixin/ListMixin_class_A01_t03: SkipSlow # Very slow compilation in debug mode.
+LibTest/collection/ListMixin/ListMixin_class_A01_t04: SkipSlow # Very slow compilation in debug mode.
+LibTest/collection/ListMixin/ListMixin_class_A01_t05: SkipSlow # Very slow compilation in debug mode.
+LibTest/collection/ListMixin/ListMixin_class_A01_t06: SkipSlow # Very slow compilation in debug mode.
+
+[ $arch == simarm || $arch == simarm64 ]
+LibTest/collection/ListBase/ListBase_class_A01_t01: SkipSlow # Very slow on sim* architectures.
+LibTest/collection/ListBase/ListBase_class_A01_t04: SkipSlow # Very slow on sim* architectures.
+LibTest/collection/ListBase/ListBase_class_A01_t05: SkipSlow # Very slow on sim* architectures.
+LibTest/collection/ListBase/ListBase_class_A01_t06: SkipSlow # Very slow on sim* architectures.
+LibTest/collection/ListMixin/ListMixin_class_A01_t01: SkipSlow # Very slow on sim* architectures.
+LibTest/collection/ListMixin/ListMixin_class_A01_t04: SkipSlow # Very slow on sim* architectures.
+LibTest/collection/ListMixin/ListMixin_class_A01_t05: SkipSlow # Very slow on sim* architectures.
+LibTest/collection/ListMixin/ListMixin_class_A01_t06: SkipSlow # Very slow on sim* architectures.
+
 [ $compiler == fasta || $runtime == dart_precompiled || $runtime == vm ]
 LibTest/html/*: SkipByDesign # dart:html not supported on VM.
diff --git a/tests/corelib/corelib.status b/tests/corelib/corelib.status
index d2b5d94..853cc32 100644
--- a/tests/corelib/corelib.status
+++ b/tests/corelib/corelib.status
@@ -42,6 +42,7 @@
 [ $compiler == dartdevc || $compiler == dartdevk ]
 bigint_test/03: SkipSlow # modPow is very slow
 bigint_test/15: SkipSlow # modPow is very slow
+list_concurrent_modify_self_test: SkipSlow # missing check causes list to grow to whole heap
 uri_parse_test: Slow, Pass
 uri_test: Slow, Pass
 
diff --git a/tests/corelib/list_concurrent_modify_self_test.dart b/tests/corelib/list_concurrent_modify_self_test.dart
new file mode 100644
index 0000000..cb481b7
--- /dev/null
+++ b/tests/corelib/list_concurrent_modify_self_test.dart
@@ -0,0 +1,17 @@
+// Copyright (c) 2020, 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:collection";
+import "dart:typed_data";
+import "package:expect/expect.dart";
+
+void main() {
+  testConcurrentAddSelf([1, 2, 3]);
+}
+
+testConcurrentAddSelf(List list) {
+  Expect.throws(() {
+    list.addAll(list);
+  }, (e) => e is ConcurrentModificationError, "testConcurrentAddSelf($list)");
+}
diff --git a/tests/corelib/list_concurrent_modify_test.dart b/tests/corelib/list_concurrent_modify_test.dart
index 9e8d338..a163524 100644
--- a/tests/corelib/list_concurrent_modify_test.dart
+++ b/tests/corelib/list_concurrent_modify_test.dart
@@ -21,9 +21,6 @@
   testConcurrentModification(new Int16List(0).toList());
   testConcurrentModification(new Uint32List(0).toList());
   testConcurrentModification(new Int32List(0).toList());
-
-  testConcurrentAddSelf([]);
-  testConcurrentAddSelf([1, 2, 3]);
 }
 
 void testConcurrentModification(List<int> list) {
@@ -77,12 +74,6 @@
   }
 }
 
-testConcurrentAddSelf(List list) {
-  Expect.throws(() {
-    list.addAll(list);
-  }, (e) => e is ConcurrentModificationError, "testConcurrentAddSelf($list)");
-}
-
 class MyList<E> extends ListBase<E> {
   // TODO(42496): Use a nullable list because insert() is implemented in terms
   // of length=. Change this back to `E` and remove the `as E` below when that
diff --git a/tests/corelib/reg_exp_all_matches_test.dart b/tests/corelib/reg_exp_all_matches_test.dart
index 54fbf10..a289723 100644
--- a/tests/corelib/reg_exp_all_matches_test.dart
+++ b/tests/corelib/reg_exp_all_matches_test.dart
@@ -10,7 +10,7 @@
   static testIterator() {
     var matches = new RegExp("foo").allMatches("foo foo");
     Iterator it = matches.iterator;
-    if (isStrongMode) {
+    if (hasSoundNullSafety) {
       Expect.throws(() => it.current);
     } else {
       Expect.isNull(it.current);
diff --git a/tests/corelib_2/corelib_2.status b/tests/corelib_2/corelib_2.status
index 316928f..5704e10 100644
--- a/tests/corelib_2/corelib_2.status
+++ b/tests/corelib_2/corelib_2.status
@@ -53,6 +53,7 @@
 [ $compiler == dartdevc || $compiler == dartdevk ]
 bigint_test/03: SkipSlow # modPow is very slow
 bigint_test/15: SkipSlow # modPow is very slow
+list_concurrent_modify_self_test: SkipSlow # missing check causes list to grow to whole heap
 uri_parse_test: Slow, Pass
 uri_test: Slow, Pass
 
diff --git a/tests/corelib_2/list_concurrent_modify_self_test.dart b/tests/corelib_2/list_concurrent_modify_self_test.dart
new file mode 100644
index 0000000..cb481b7
--- /dev/null
+++ b/tests/corelib_2/list_concurrent_modify_self_test.dart
@@ -0,0 +1,17 @@
+// Copyright (c) 2020, 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:collection";
+import "dart:typed_data";
+import "package:expect/expect.dart";
+
+void main() {
+  testConcurrentAddSelf([1, 2, 3]);
+}
+
+testConcurrentAddSelf(List list) {
+  Expect.throws(() {
+    list.addAll(list);
+  }, (e) => e is ConcurrentModificationError, "testConcurrentAddSelf($list)");
+}
diff --git a/tests/corelib_2/list_concurrent_modify_test.dart b/tests/corelib_2/list_concurrent_modify_test.dart
index 4d5de96..b3fcb17 100644
--- a/tests/corelib_2/list_concurrent_modify_test.dart
+++ b/tests/corelib_2/list_concurrent_modify_test.dart
@@ -23,9 +23,6 @@
   testConcurrentModification(new Int16List(0).toList());
   testConcurrentModification(new Uint32List(0).toList());
   testConcurrentModification(new Int32List(0).toList());
-
-  testConcurrentAddSelf([]);
-  testConcurrentAddSelf([1, 2, 3]);
 }
 
 void testConcurrentModification(List<int> list) {
@@ -79,12 +76,6 @@
   }
 }
 
-testConcurrentAddSelf(List list) {
-  Expect.throws(() {
-    list.addAll(list);
-  }, (e) => e is ConcurrentModificationError, "testConcurrentAddSelf($list)");
-}
-
 class MyList<E> extends ListBase<E> {
   List<E> _source;
   MyList(this._source);
diff --git a/tests/dart2js/boolean_conversion_test.dart b/tests/dart2js/boolean_conversion_test.dart
deleted file mode 100644
index 48c1cb6..0000000
--- a/tests/dart2js/boolean_conversion_test.dart
+++ /dev/null
@@ -1,103 +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.
-
-// dart2jsOptions=--omit-implicit-checks
-
-// Note: --omit-implicit-checks causes Expect.isNull to misbehave, so we use
-// Expect.equals(null, ...) instead.
-
-import 'package:expect/expect.dart';
-
-void main() {
-  conditionalTest();
-  orTest();
-  andTest();
-  ifTest();
-  forTest();
-  whileTest();
-  doTest();
-  notTest();
-  ifElementTest();
-  forElementTest();
-}
-
-void conditionalTest() {
-  bool x = null as dynamic;
-  Expect.isFalse(x ? true : false);
-}
-
-void orTest() {
-  bool x = null as dynamic;
-  Expect.equals(null, x || x);
-  Expect.isFalse(x || false);
-  Expect.isTrue(x || true);
-  Expect.equals(null, false || x);
-  Expect.isTrue(true || x);
-}
-
-void andTest() {
-  bool x = null as dynamic;
-  Expect.isFalse(x && x);
-  Expect.isFalse(x && false);
-  Expect.isFalse(x && true);
-  Expect.isFalse(false && x);
-  Expect.equals(null, true && x);
-}
-
-void ifTest() {
-  bool x = null as dynamic;
-  Expect.isFalse(() {
-    if (x) {
-      return true;
-    } else {
-      return false;
-    }
-  }());
-}
-
-void forTest() {
-  bool x = null as dynamic;
-  Expect.isFalse(() {
-    for (; x;) {
-      return true;
-    }
-    return false;
-  }());
-}
-
-void whileTest() {
-  bool x = null as dynamic;
-  Expect.isFalse(() {
-    while (x) {
-      return true;
-    }
-    return false;
-  }());
-}
-
-void doTest() {
-  bool x = null as dynamic;
-  Expect.equals(1, () {
-    int n = 0;
-    do {
-      n++;
-    } while (x);
-    return n;
-  }());
-}
-
-void notTest() {
-  bool x = null as dynamic;
-  Expect.isTrue(!x);
-}
-
-void ifElementTest() {
-  bool x = null as dynamic;
-  Expect.listEquals([], [if (x) 1]);
-}
-
-void forElementTest() {
-  bool x = null as dynamic;
-  Expect.listEquals([], [for (var i = 0; x; i++) i]);
-}
diff --git a/tests/dart2js/deferred/many_parts/lib1.dart b/tests/dart2js/deferred/many_parts/lib1.dart
new file mode 100644
index 0000000..4a55906
--- /dev/null
+++ b/tests/dart2js/deferred/many_parts/lib1.dart
@@ -0,0 +1,10 @@
+// Copyright (c) 2020, 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 'lib_000_000_000_000_1.dart' deferred as b1;
+
+entryLib1() async {
+  await b1.loadLibrary();
+  b1.g_000_000_000_000_1();
+}
diff --git a/tests/dart2js/deferred/many_parts/lib10.dart b/tests/dart2js/deferred/many_parts/lib10.dart
new file mode 100644
index 0000000..f684ffd
--- /dev/null
+++ b/tests/dart2js/deferred/many_parts/lib10.dart
@@ -0,0 +1,10 @@
+// Copyright (c) 2020, 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 'lib_000_100_000_000_0.dart' deferred as b10;
+
+entryLib10() async {
+  await b10.loadLibrary();
+  b10.g_000_100_000_000_0();
+}
diff --git a/tests/dart2js/deferred/many_parts/lib11.dart b/tests/dart2js/deferred/many_parts/lib11.dart
new file mode 100644
index 0000000..0f2f031
--- /dev/null
+++ b/tests/dart2js/deferred/many_parts/lib11.dart
@@ -0,0 +1,10 @@
+// Copyright (c) 2020, 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 'lib_001_000_000_000_0.dart' deferred as b11;
+
+entryLib11() async {
+  await b11.loadLibrary();
+  b11.g_001_000_000_000_0();
+}
diff --git a/tests/dart2js/deferred/many_parts/lib12.dart b/tests/dart2js/deferred/many_parts/lib12.dart
new file mode 100644
index 0000000..e89cd4c
--- /dev/null
+++ b/tests/dart2js/deferred/many_parts/lib12.dart
@@ -0,0 +1,10 @@
+// Copyright (c) 2020, 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 'lib_010_000_000_000_0.dart' deferred as b12;
+
+entryLib12() async {
+  await b12.loadLibrary();
+  b12.g_010_000_000_000_0();
+}
diff --git a/tests/dart2js/deferred/many_parts/lib13.dart b/tests/dart2js/deferred/many_parts/lib13.dart
new file mode 100644
index 0000000..c99d1b1
--- /dev/null
+++ b/tests/dart2js/deferred/many_parts/lib13.dart
@@ -0,0 +1,10 @@
+// Copyright (c) 2020, 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 'lib_100_000_000_000_0.dart' deferred as b13;
+
+entryLib13() async {
+  await b13.loadLibrary();
+  b13.g_100_000_000_000_0();
+}
diff --git a/tests/dart2js/deferred/many_parts/lib2.dart b/tests/dart2js/deferred/many_parts/lib2.dart
new file mode 100644
index 0000000..75c2f1a
--- /dev/null
+++ b/tests/dart2js/deferred/many_parts/lib2.dart
@@ -0,0 +1,10 @@
+// Copyright (c) 2020, 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 'lib_000_000_000_001_0.dart' deferred as b2;
+
+entryLib2() async {
+  await b2.loadLibrary();
+  b2.g_000_000_000_001_0();
+}
diff --git a/tests/dart2js/deferred/many_parts/lib3.dart b/tests/dart2js/deferred/many_parts/lib3.dart
new file mode 100644
index 0000000..490dd77
--- /dev/null
+++ b/tests/dart2js/deferred/many_parts/lib3.dart
@@ -0,0 +1,10 @@
+// Copyright (c) 2020, 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 'lib_000_000_000_010_0.dart' deferred as b3;
+
+entryLib3() async {
+  await b3.loadLibrary();
+  b3.g_000_000_000_010_0();
+}
diff --git a/tests/dart2js/deferred/many_parts/lib4.dart b/tests/dart2js/deferred/many_parts/lib4.dart
new file mode 100644
index 0000000..e7ac6a6
--- /dev/null
+++ b/tests/dart2js/deferred/many_parts/lib4.dart
@@ -0,0 +1,10 @@
+// Copyright (c) 2020, 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 'lib_000_000_000_100_0.dart' deferred as b4;
+
+entryLib4() async {
+  await b4.loadLibrary();
+  b4.g_000_000_000_100_0();
+}
diff --git a/tests/dart2js/deferred/many_parts/lib5.dart b/tests/dart2js/deferred/many_parts/lib5.dart
new file mode 100644
index 0000000..5409ce8
--- /dev/null
+++ b/tests/dart2js/deferred/many_parts/lib5.dart
@@ -0,0 +1,10 @@
+// Copyright (c) 2020, 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 'lib_000_000_001_000_0.dart' deferred as b5;
+
+entryLib5() async {
+  await b5.loadLibrary();
+  b5.g_000_000_001_000_0();
+}
diff --git a/tests/dart2js/deferred/many_parts/lib6.dart b/tests/dart2js/deferred/many_parts/lib6.dart
new file mode 100644
index 0000000..7823c01
--- /dev/null
+++ b/tests/dart2js/deferred/many_parts/lib6.dart
@@ -0,0 +1,10 @@
+// Copyright (c) 2020, 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 'lib_000_000_010_000_0.dart' deferred as b6;
+
+entryLib6() async {
+  await b6.loadLibrary();
+  b6.g_000_000_010_000_0();
+}
diff --git a/tests/dart2js/deferred/many_parts/lib7.dart b/tests/dart2js/deferred/many_parts/lib7.dart
new file mode 100644
index 0000000..2a2a690
--- /dev/null
+++ b/tests/dart2js/deferred/many_parts/lib7.dart
@@ -0,0 +1,10 @@
+// Copyright (c) 2020, 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 'lib_000_000_100_000_0.dart' deferred as b7;
+
+entryLib7() async {
+  await b7.loadLibrary();
+  b7.g_000_000_100_000_0();
+}
diff --git a/tests/dart2js/deferred/many_parts/lib8.dart b/tests/dart2js/deferred/many_parts/lib8.dart
new file mode 100644
index 0000000..729c4e3
--- /dev/null
+++ b/tests/dart2js/deferred/many_parts/lib8.dart
@@ -0,0 +1,10 @@
+// Copyright (c) 2020, 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 'lib_000_001_000_000_0.dart' deferred as b8;
+
+entryLib8() async {
+  await b8.loadLibrary();
+  b8.g_000_001_000_000_0();
+}
diff --git a/tests/dart2js/deferred/many_parts/lib9.dart b/tests/dart2js/deferred/many_parts/lib9.dart
new file mode 100644
index 0000000..4b4ed09
--- /dev/null
+++ b/tests/dart2js/deferred/many_parts/lib9.dart
@@ -0,0 +1,10 @@
+// Copyright (c) 2020, 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 'lib_000_010_000_000_0.dart' deferred as b9;
+
+entryLib9() async {
+  await b9.loadLibrary();
+  b9.g_000_010_000_000_0();
+}
diff --git a/tests/dart2js/deferred/many_parts/libB.dart b/tests/dart2js/deferred/many_parts/libB.dart
new file mode 100644
index 0000000..743ed9f
--- /dev/null
+++ b/tests/dart2js/deferred/many_parts/libB.dart
@@ -0,0 +1,24583 @@
+// Copyright (c) 2020, 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:expect/expect.dart";
+
+void v(Set<String> u, String name, int bit) {
+  Expect.isTrue(u.add(name));
+  Expect.equals(name[bit], '1');
+}
+
+@pragma('dart2js:noInline')
+f_000_000_000_000_1(Set<String> u, int b) => v(u, '0000000000001', b);
+
+@pragma('dart2js:noInline')
+f_000_000_000_001_1(Set<String> u, int b) => v(u, '0000000000011', b);
+
+@pragma('dart2js:noInline')
+f_000_000_000_010_1(Set<String> u, int b) => v(u, '0000000000101', b);
+
+@pragma('dart2js:noInline')
+f_000_000_000_011_1(Set<String> u, int b) => v(u, '0000000000111', b);
+
+@pragma('dart2js:noInline')
+f_000_000_000_100_1(Set<String> u, int b) => v(u, '0000000001001', b);
+
+@pragma('dart2js:noInline')
+f_000_000_000_101_1(Set<String> u, int b) => v(u, '0000000001011', b);
+
+@pragma('dart2js:noInline')
+f_000_000_000_110_1(Set<String> u, int b) => v(u, '0000000001101', b);
+
+@pragma('dart2js:noInline')
+f_000_000_000_111_1(Set<String> u, int b) => v(u, '0000000001111', b);
+
+@pragma('dart2js:noInline')
+f_000_000_001_000_1(Set<String> u, int b) => v(u, '0000000010001', b);
+
+@pragma('dart2js:noInline')
+f_000_000_001_001_1(Set<String> u, int b) => v(u, '0000000010011', b);
+
+@pragma('dart2js:noInline')
+f_000_000_001_010_1(Set<String> u, int b) => v(u, '0000000010101', b);
+
+@pragma('dart2js:noInline')
+f_000_000_001_011_1(Set<String> u, int b) => v(u, '0000000010111', b);
+
+@pragma('dart2js:noInline')
+f_000_000_001_100_1(Set<String> u, int b) => v(u, '0000000011001', b);
+
+@pragma('dart2js:noInline')
+f_000_000_001_101_1(Set<String> u, int b) => v(u, '0000000011011', b);
+
+@pragma('dart2js:noInline')
+f_000_000_001_110_1(Set<String> u, int b) => v(u, '0000000011101', b);
+
+@pragma('dart2js:noInline')
+f_000_000_001_111_1(Set<String> u, int b) => v(u, '0000000011111', b);
+
+@pragma('dart2js:noInline')
+f_000_000_010_000_1(Set<String> u, int b) => v(u, '0000000100001', b);
+
+@pragma('dart2js:noInline')
+f_000_000_010_001_1(Set<String> u, int b) => v(u, '0000000100011', b);
+
+@pragma('dart2js:noInline')
+f_000_000_010_010_1(Set<String> u, int b) => v(u, '0000000100101', b);
+
+@pragma('dart2js:noInline')
+f_000_000_010_011_1(Set<String> u, int b) => v(u, '0000000100111', b);
+
+@pragma('dart2js:noInline')
+f_000_000_010_100_1(Set<String> u, int b) => v(u, '0000000101001', b);
+
+@pragma('dart2js:noInline')
+f_000_000_010_101_1(Set<String> u, int b) => v(u, '0000000101011', b);
+
+@pragma('dart2js:noInline')
+f_000_000_010_110_1(Set<String> u, int b) => v(u, '0000000101101', b);
+
+@pragma('dart2js:noInline')
+f_000_000_010_111_1(Set<String> u, int b) => v(u, '0000000101111', b);
+
+@pragma('dart2js:noInline')
+f_000_000_011_000_1(Set<String> u, int b) => v(u, '0000000110001', b);
+
+@pragma('dart2js:noInline')
+f_000_000_011_001_1(Set<String> u, int b) => v(u, '0000000110011', b);
+
+@pragma('dart2js:noInline')
+f_000_000_011_010_1(Set<String> u, int b) => v(u, '0000000110101', b);
+
+@pragma('dart2js:noInline')
+f_000_000_011_011_1(Set<String> u, int b) => v(u, '0000000110111', b);
+
+@pragma('dart2js:noInline')
+f_000_000_011_100_1(Set<String> u, int b) => v(u, '0000000111001', b);
+
+@pragma('dart2js:noInline')
+f_000_000_011_101_1(Set<String> u, int b) => v(u, '0000000111011', b);
+
+@pragma('dart2js:noInline')
+f_000_000_011_110_1(Set<String> u, int b) => v(u, '0000000111101', b);
+
+@pragma('dart2js:noInline')
+f_000_000_011_111_1(Set<String> u, int b) => v(u, '0000000111111', b);
+
+@pragma('dart2js:noInline')
+f_000_000_100_000_1(Set<String> u, int b) => v(u, '0000001000001', b);
+
+@pragma('dart2js:noInline')
+f_000_000_100_001_1(Set<String> u, int b) => v(u, '0000001000011', b);
+
+@pragma('dart2js:noInline')
+f_000_000_100_010_1(Set<String> u, int b) => v(u, '0000001000101', b);
+
+@pragma('dart2js:noInline')
+f_000_000_100_011_1(Set<String> u, int b) => v(u, '0000001000111', b);
+
+@pragma('dart2js:noInline')
+f_000_000_100_100_1(Set<String> u, int b) => v(u, '0000001001001', b);
+
+@pragma('dart2js:noInline')
+f_000_000_100_101_1(Set<String> u, int b) => v(u, '0000001001011', b);
+
+@pragma('dart2js:noInline')
+f_000_000_100_110_1(Set<String> u, int b) => v(u, '0000001001101', b);
+
+@pragma('dart2js:noInline')
+f_000_000_100_111_1(Set<String> u, int b) => v(u, '0000001001111', b);
+
+@pragma('dart2js:noInline')
+f_000_000_101_000_1(Set<String> u, int b) => v(u, '0000001010001', b);
+
+@pragma('dart2js:noInline')
+f_000_000_101_001_1(Set<String> u, int b) => v(u, '0000001010011', b);
+
+@pragma('dart2js:noInline')
+f_000_000_101_010_1(Set<String> u, int b) => v(u, '0000001010101', b);
+
+@pragma('dart2js:noInline')
+f_000_000_101_011_1(Set<String> u, int b) => v(u, '0000001010111', b);
+
+@pragma('dart2js:noInline')
+f_000_000_101_100_1(Set<String> u, int b) => v(u, '0000001011001', b);
+
+@pragma('dart2js:noInline')
+f_000_000_101_101_1(Set<String> u, int b) => v(u, '0000001011011', b);
+
+@pragma('dart2js:noInline')
+f_000_000_101_110_1(Set<String> u, int b) => v(u, '0000001011101', b);
+
+@pragma('dart2js:noInline')
+f_000_000_101_111_1(Set<String> u, int b) => v(u, '0000001011111', b);
+
+@pragma('dart2js:noInline')
+f_000_000_110_000_1(Set<String> u, int b) => v(u, '0000001100001', b);
+
+@pragma('dart2js:noInline')
+f_000_000_110_001_1(Set<String> u, int b) => v(u, '0000001100011', b);
+
+@pragma('dart2js:noInline')
+f_000_000_110_010_1(Set<String> u, int b) => v(u, '0000001100101', b);
+
+@pragma('dart2js:noInline')
+f_000_000_110_011_1(Set<String> u, int b) => v(u, '0000001100111', b);
+
+@pragma('dart2js:noInline')
+f_000_000_110_100_1(Set<String> u, int b) => v(u, '0000001101001', b);
+
+@pragma('dart2js:noInline')
+f_000_000_110_101_1(Set<String> u, int b) => v(u, '0000001101011', b);
+
+@pragma('dart2js:noInline')
+f_000_000_110_110_1(Set<String> u, int b) => v(u, '0000001101101', b);
+
+@pragma('dart2js:noInline')
+f_000_000_110_111_1(Set<String> u, int b) => v(u, '0000001101111', b);
+
+@pragma('dart2js:noInline')
+f_000_000_111_000_1(Set<String> u, int b) => v(u, '0000001110001', b);
+
+@pragma('dart2js:noInline')
+f_000_000_111_001_1(Set<String> u, int b) => v(u, '0000001110011', b);
+
+@pragma('dart2js:noInline')
+f_000_000_111_010_1(Set<String> u, int b) => v(u, '0000001110101', b);
+
+@pragma('dart2js:noInline')
+f_000_000_111_011_1(Set<String> u, int b) => v(u, '0000001110111', b);
+
+@pragma('dart2js:noInline')
+f_000_000_111_100_1(Set<String> u, int b) => v(u, '0000001111001', b);
+
+@pragma('dart2js:noInline')
+f_000_000_111_101_1(Set<String> u, int b) => v(u, '0000001111011', b);
+
+@pragma('dart2js:noInline')
+f_000_000_111_110_1(Set<String> u, int b) => v(u, '0000001111101', b);
+
+@pragma('dart2js:noInline')
+f_000_000_111_111_1(Set<String> u, int b) => v(u, '0000001111111', b);
+
+@pragma('dart2js:noInline')
+f_000_001_000_000_1(Set<String> u, int b) => v(u, '0000010000001', b);
+
+@pragma('dart2js:noInline')
+f_000_001_000_001_1(Set<String> u, int b) => v(u, '0000010000011', b);
+
+@pragma('dart2js:noInline')
+f_000_001_000_010_1(Set<String> u, int b) => v(u, '0000010000101', b);
+
+@pragma('dart2js:noInline')
+f_000_001_000_011_1(Set<String> u, int b) => v(u, '0000010000111', b);
+
+@pragma('dart2js:noInline')
+f_000_001_000_100_1(Set<String> u, int b) => v(u, '0000010001001', b);
+
+@pragma('dart2js:noInline')
+f_000_001_000_101_1(Set<String> u, int b) => v(u, '0000010001011', b);
+
+@pragma('dart2js:noInline')
+f_000_001_000_110_1(Set<String> u, int b) => v(u, '0000010001101', b);
+
+@pragma('dart2js:noInline')
+f_000_001_000_111_1(Set<String> u, int b) => v(u, '0000010001111', b);
+
+@pragma('dart2js:noInline')
+f_000_001_001_000_1(Set<String> u, int b) => v(u, '0000010010001', b);
+
+@pragma('dart2js:noInline')
+f_000_001_001_001_1(Set<String> u, int b) => v(u, '0000010010011', b);
+
+@pragma('dart2js:noInline')
+f_000_001_001_010_1(Set<String> u, int b) => v(u, '0000010010101', b);
+
+@pragma('dart2js:noInline')
+f_000_001_001_011_1(Set<String> u, int b) => v(u, '0000010010111', b);
+
+@pragma('dart2js:noInline')
+f_000_001_001_100_1(Set<String> u, int b) => v(u, '0000010011001', b);
+
+@pragma('dart2js:noInline')
+f_000_001_001_101_1(Set<String> u, int b) => v(u, '0000010011011', b);
+
+@pragma('dart2js:noInline')
+f_000_001_001_110_1(Set<String> u, int b) => v(u, '0000010011101', b);
+
+@pragma('dart2js:noInline')
+f_000_001_001_111_1(Set<String> u, int b) => v(u, '0000010011111', b);
+
+@pragma('dart2js:noInline')
+f_000_001_010_000_1(Set<String> u, int b) => v(u, '0000010100001', b);
+
+@pragma('dart2js:noInline')
+f_000_001_010_001_1(Set<String> u, int b) => v(u, '0000010100011', b);
+
+@pragma('dart2js:noInline')
+f_000_001_010_010_1(Set<String> u, int b) => v(u, '0000010100101', b);
+
+@pragma('dart2js:noInline')
+f_000_001_010_011_1(Set<String> u, int b) => v(u, '0000010100111', b);
+
+@pragma('dart2js:noInline')
+f_000_001_010_100_1(Set<String> u, int b) => v(u, '0000010101001', b);
+
+@pragma('dart2js:noInline')
+f_000_001_010_101_1(Set<String> u, int b) => v(u, '0000010101011', b);
+
+@pragma('dart2js:noInline')
+f_000_001_010_110_1(Set<String> u, int b) => v(u, '0000010101101', b);
+
+@pragma('dart2js:noInline')
+f_000_001_010_111_1(Set<String> u, int b) => v(u, '0000010101111', b);
+
+@pragma('dart2js:noInline')
+f_000_001_011_000_1(Set<String> u, int b) => v(u, '0000010110001', b);
+
+@pragma('dart2js:noInline')
+f_000_001_011_001_1(Set<String> u, int b) => v(u, '0000010110011', b);
+
+@pragma('dart2js:noInline')
+f_000_001_011_010_1(Set<String> u, int b) => v(u, '0000010110101', b);
+
+@pragma('dart2js:noInline')
+f_000_001_011_011_1(Set<String> u, int b) => v(u, '0000010110111', b);
+
+@pragma('dart2js:noInline')
+f_000_001_011_100_1(Set<String> u, int b) => v(u, '0000010111001', b);
+
+@pragma('dart2js:noInline')
+f_000_001_011_101_1(Set<String> u, int b) => v(u, '0000010111011', b);
+
+@pragma('dart2js:noInline')
+f_000_001_011_110_1(Set<String> u, int b) => v(u, '0000010111101', b);
+
+@pragma('dart2js:noInline')
+f_000_001_011_111_1(Set<String> u, int b) => v(u, '0000010111111', b);
+
+@pragma('dart2js:noInline')
+f_000_001_100_000_1(Set<String> u, int b) => v(u, '0000011000001', b);
+
+@pragma('dart2js:noInline')
+f_000_001_100_001_1(Set<String> u, int b) => v(u, '0000011000011', b);
+
+@pragma('dart2js:noInline')
+f_000_001_100_010_1(Set<String> u, int b) => v(u, '0000011000101', b);
+
+@pragma('dart2js:noInline')
+f_000_001_100_011_1(Set<String> u, int b) => v(u, '0000011000111', b);
+
+@pragma('dart2js:noInline')
+f_000_001_100_100_1(Set<String> u, int b) => v(u, '0000011001001', b);
+
+@pragma('dart2js:noInline')
+f_000_001_100_101_1(Set<String> u, int b) => v(u, '0000011001011', b);
+
+@pragma('dart2js:noInline')
+f_000_001_100_110_1(Set<String> u, int b) => v(u, '0000011001101', b);
+
+@pragma('dart2js:noInline')
+f_000_001_100_111_1(Set<String> u, int b) => v(u, '0000011001111', b);
+
+@pragma('dart2js:noInline')
+f_000_001_101_000_1(Set<String> u, int b) => v(u, '0000011010001', b);
+
+@pragma('dart2js:noInline')
+f_000_001_101_001_1(Set<String> u, int b) => v(u, '0000011010011', b);
+
+@pragma('dart2js:noInline')
+f_000_001_101_010_1(Set<String> u, int b) => v(u, '0000011010101', b);
+
+@pragma('dart2js:noInline')
+f_000_001_101_011_1(Set<String> u, int b) => v(u, '0000011010111', b);
+
+@pragma('dart2js:noInline')
+f_000_001_101_100_1(Set<String> u, int b) => v(u, '0000011011001', b);
+
+@pragma('dart2js:noInline')
+f_000_001_101_101_1(Set<String> u, int b) => v(u, '0000011011011', b);
+
+@pragma('dart2js:noInline')
+f_000_001_101_110_1(Set<String> u, int b) => v(u, '0000011011101', b);
+
+@pragma('dart2js:noInline')
+f_000_001_101_111_1(Set<String> u, int b) => v(u, '0000011011111', b);
+
+@pragma('dart2js:noInline')
+f_000_001_110_000_1(Set<String> u, int b) => v(u, '0000011100001', b);
+
+@pragma('dart2js:noInline')
+f_000_001_110_001_1(Set<String> u, int b) => v(u, '0000011100011', b);
+
+@pragma('dart2js:noInline')
+f_000_001_110_010_1(Set<String> u, int b) => v(u, '0000011100101', b);
+
+@pragma('dart2js:noInline')
+f_000_001_110_011_1(Set<String> u, int b) => v(u, '0000011100111', b);
+
+@pragma('dart2js:noInline')
+f_000_001_110_100_1(Set<String> u, int b) => v(u, '0000011101001', b);
+
+@pragma('dart2js:noInline')
+f_000_001_110_101_1(Set<String> u, int b) => v(u, '0000011101011', b);
+
+@pragma('dart2js:noInline')
+f_000_001_110_110_1(Set<String> u, int b) => v(u, '0000011101101', b);
+
+@pragma('dart2js:noInline')
+f_000_001_110_111_1(Set<String> u, int b) => v(u, '0000011101111', b);
+
+@pragma('dart2js:noInline')
+f_000_001_111_000_1(Set<String> u, int b) => v(u, '0000011110001', b);
+
+@pragma('dart2js:noInline')
+f_000_001_111_001_1(Set<String> u, int b) => v(u, '0000011110011', b);
+
+@pragma('dart2js:noInline')
+f_000_001_111_010_1(Set<String> u, int b) => v(u, '0000011110101', b);
+
+@pragma('dart2js:noInline')
+f_000_001_111_011_1(Set<String> u, int b) => v(u, '0000011110111', b);
+
+@pragma('dart2js:noInline')
+f_000_001_111_100_1(Set<String> u, int b) => v(u, '0000011111001', b);
+
+@pragma('dart2js:noInline')
+f_000_001_111_101_1(Set<String> u, int b) => v(u, '0000011111011', b);
+
+@pragma('dart2js:noInline')
+f_000_001_111_110_1(Set<String> u, int b) => v(u, '0000011111101', b);
+
+@pragma('dart2js:noInline')
+f_000_001_111_111_1(Set<String> u, int b) => v(u, '0000011111111', b);
+
+@pragma('dart2js:noInline')
+f_000_010_000_000_1(Set<String> u, int b) => v(u, '0000100000001', b);
+
+@pragma('dart2js:noInline')
+f_000_010_000_001_1(Set<String> u, int b) => v(u, '0000100000011', b);
+
+@pragma('dart2js:noInline')
+f_000_010_000_010_1(Set<String> u, int b) => v(u, '0000100000101', b);
+
+@pragma('dart2js:noInline')
+f_000_010_000_011_1(Set<String> u, int b) => v(u, '0000100000111', b);
+
+@pragma('dart2js:noInline')
+f_000_010_000_100_1(Set<String> u, int b) => v(u, '0000100001001', b);
+
+@pragma('dart2js:noInline')
+f_000_010_000_101_1(Set<String> u, int b) => v(u, '0000100001011', b);
+
+@pragma('dart2js:noInline')
+f_000_010_000_110_1(Set<String> u, int b) => v(u, '0000100001101', b);
+
+@pragma('dart2js:noInline')
+f_000_010_000_111_1(Set<String> u, int b) => v(u, '0000100001111', b);
+
+@pragma('dart2js:noInline')
+f_000_010_001_000_1(Set<String> u, int b) => v(u, '0000100010001', b);
+
+@pragma('dart2js:noInline')
+f_000_010_001_001_1(Set<String> u, int b) => v(u, '0000100010011', b);
+
+@pragma('dart2js:noInline')
+f_000_010_001_010_1(Set<String> u, int b) => v(u, '0000100010101', b);
+
+@pragma('dart2js:noInline')
+f_000_010_001_011_1(Set<String> u, int b) => v(u, '0000100010111', b);
+
+@pragma('dart2js:noInline')
+f_000_010_001_100_1(Set<String> u, int b) => v(u, '0000100011001', b);
+
+@pragma('dart2js:noInline')
+f_000_010_001_101_1(Set<String> u, int b) => v(u, '0000100011011', b);
+
+@pragma('dart2js:noInline')
+f_000_010_001_110_1(Set<String> u, int b) => v(u, '0000100011101', b);
+
+@pragma('dart2js:noInline')
+f_000_010_001_111_1(Set<String> u, int b) => v(u, '0000100011111', b);
+
+@pragma('dart2js:noInline')
+f_000_010_010_000_1(Set<String> u, int b) => v(u, '0000100100001', b);
+
+@pragma('dart2js:noInline')
+f_000_010_010_001_1(Set<String> u, int b) => v(u, '0000100100011', b);
+
+@pragma('dart2js:noInline')
+f_000_010_010_010_1(Set<String> u, int b) => v(u, '0000100100101', b);
+
+@pragma('dart2js:noInline')
+f_000_010_010_011_1(Set<String> u, int b) => v(u, '0000100100111', b);
+
+@pragma('dart2js:noInline')
+f_000_010_010_100_1(Set<String> u, int b) => v(u, '0000100101001', b);
+
+@pragma('dart2js:noInline')
+f_000_010_010_101_1(Set<String> u, int b) => v(u, '0000100101011', b);
+
+@pragma('dart2js:noInline')
+f_000_010_010_110_1(Set<String> u, int b) => v(u, '0000100101101', b);
+
+@pragma('dart2js:noInline')
+f_000_010_010_111_1(Set<String> u, int b) => v(u, '0000100101111', b);
+
+@pragma('dart2js:noInline')
+f_000_010_011_000_1(Set<String> u, int b) => v(u, '0000100110001', b);
+
+@pragma('dart2js:noInline')
+f_000_010_011_001_1(Set<String> u, int b) => v(u, '0000100110011', b);
+
+@pragma('dart2js:noInline')
+f_000_010_011_010_1(Set<String> u, int b) => v(u, '0000100110101', b);
+
+@pragma('dart2js:noInline')
+f_000_010_011_011_1(Set<String> u, int b) => v(u, '0000100110111', b);
+
+@pragma('dart2js:noInline')
+f_000_010_011_100_1(Set<String> u, int b) => v(u, '0000100111001', b);
+
+@pragma('dart2js:noInline')
+f_000_010_011_101_1(Set<String> u, int b) => v(u, '0000100111011', b);
+
+@pragma('dart2js:noInline')
+f_000_010_011_110_1(Set<String> u, int b) => v(u, '0000100111101', b);
+
+@pragma('dart2js:noInline')
+f_000_010_011_111_1(Set<String> u, int b) => v(u, '0000100111111', b);
+
+@pragma('dart2js:noInline')
+f_000_010_100_000_1(Set<String> u, int b) => v(u, '0000101000001', b);
+
+@pragma('dart2js:noInline')
+f_000_010_100_001_1(Set<String> u, int b) => v(u, '0000101000011', b);
+
+@pragma('dart2js:noInline')
+f_000_010_100_010_1(Set<String> u, int b) => v(u, '0000101000101', b);
+
+@pragma('dart2js:noInline')
+f_000_010_100_011_1(Set<String> u, int b) => v(u, '0000101000111', b);
+
+@pragma('dart2js:noInline')
+f_000_010_100_100_1(Set<String> u, int b) => v(u, '0000101001001', b);
+
+@pragma('dart2js:noInline')
+f_000_010_100_101_1(Set<String> u, int b) => v(u, '0000101001011', b);
+
+@pragma('dart2js:noInline')
+f_000_010_100_110_1(Set<String> u, int b) => v(u, '0000101001101', b);
+
+@pragma('dart2js:noInline')
+f_000_010_100_111_1(Set<String> u, int b) => v(u, '0000101001111', b);
+
+@pragma('dart2js:noInline')
+f_000_010_101_000_1(Set<String> u, int b) => v(u, '0000101010001', b);
+
+@pragma('dart2js:noInline')
+f_000_010_101_001_1(Set<String> u, int b) => v(u, '0000101010011', b);
+
+@pragma('dart2js:noInline')
+f_000_010_101_010_1(Set<String> u, int b) => v(u, '0000101010101', b);
+
+@pragma('dart2js:noInline')
+f_000_010_101_011_1(Set<String> u, int b) => v(u, '0000101010111', b);
+
+@pragma('dart2js:noInline')
+f_000_010_101_100_1(Set<String> u, int b) => v(u, '0000101011001', b);
+
+@pragma('dart2js:noInline')
+f_000_010_101_101_1(Set<String> u, int b) => v(u, '0000101011011', b);
+
+@pragma('dart2js:noInline')
+f_000_010_101_110_1(Set<String> u, int b) => v(u, '0000101011101', b);
+
+@pragma('dart2js:noInline')
+f_000_010_101_111_1(Set<String> u, int b) => v(u, '0000101011111', b);
+
+@pragma('dart2js:noInline')
+f_000_010_110_000_1(Set<String> u, int b) => v(u, '0000101100001', b);
+
+@pragma('dart2js:noInline')
+f_000_010_110_001_1(Set<String> u, int b) => v(u, '0000101100011', b);
+
+@pragma('dart2js:noInline')
+f_000_010_110_010_1(Set<String> u, int b) => v(u, '0000101100101', b);
+
+@pragma('dart2js:noInline')
+f_000_010_110_011_1(Set<String> u, int b) => v(u, '0000101100111', b);
+
+@pragma('dart2js:noInline')
+f_000_010_110_100_1(Set<String> u, int b) => v(u, '0000101101001', b);
+
+@pragma('dart2js:noInline')
+f_000_010_110_101_1(Set<String> u, int b) => v(u, '0000101101011', b);
+
+@pragma('dart2js:noInline')
+f_000_010_110_110_1(Set<String> u, int b) => v(u, '0000101101101', b);
+
+@pragma('dart2js:noInline')
+f_000_010_110_111_1(Set<String> u, int b) => v(u, '0000101101111', b);
+
+@pragma('dart2js:noInline')
+f_000_010_111_000_1(Set<String> u, int b) => v(u, '0000101110001', b);
+
+@pragma('dart2js:noInline')
+f_000_010_111_001_1(Set<String> u, int b) => v(u, '0000101110011', b);
+
+@pragma('dart2js:noInline')
+f_000_010_111_010_1(Set<String> u, int b) => v(u, '0000101110101', b);
+
+@pragma('dart2js:noInline')
+f_000_010_111_011_1(Set<String> u, int b) => v(u, '0000101110111', b);
+
+@pragma('dart2js:noInline')
+f_000_010_111_100_1(Set<String> u, int b) => v(u, '0000101111001', b);
+
+@pragma('dart2js:noInline')
+f_000_010_111_101_1(Set<String> u, int b) => v(u, '0000101111011', b);
+
+@pragma('dart2js:noInline')
+f_000_010_111_110_1(Set<String> u, int b) => v(u, '0000101111101', b);
+
+@pragma('dart2js:noInline')
+f_000_010_111_111_1(Set<String> u, int b) => v(u, '0000101111111', b);
+
+@pragma('dart2js:noInline')
+f_000_011_000_000_1(Set<String> u, int b) => v(u, '0000110000001', b);
+
+@pragma('dart2js:noInline')
+f_000_011_000_001_1(Set<String> u, int b) => v(u, '0000110000011', b);
+
+@pragma('dart2js:noInline')
+f_000_011_000_010_1(Set<String> u, int b) => v(u, '0000110000101', b);
+
+@pragma('dart2js:noInline')
+f_000_011_000_011_1(Set<String> u, int b) => v(u, '0000110000111', b);
+
+@pragma('dart2js:noInline')
+f_000_011_000_100_1(Set<String> u, int b) => v(u, '0000110001001', b);
+
+@pragma('dart2js:noInline')
+f_000_011_000_101_1(Set<String> u, int b) => v(u, '0000110001011', b);
+
+@pragma('dart2js:noInline')
+f_000_011_000_110_1(Set<String> u, int b) => v(u, '0000110001101', b);
+
+@pragma('dart2js:noInline')
+f_000_011_000_111_1(Set<String> u, int b) => v(u, '0000110001111', b);
+
+@pragma('dart2js:noInline')
+f_000_011_001_000_1(Set<String> u, int b) => v(u, '0000110010001', b);
+
+@pragma('dart2js:noInline')
+f_000_011_001_001_1(Set<String> u, int b) => v(u, '0000110010011', b);
+
+@pragma('dart2js:noInline')
+f_000_011_001_010_1(Set<String> u, int b) => v(u, '0000110010101', b);
+
+@pragma('dart2js:noInline')
+f_000_011_001_011_1(Set<String> u, int b) => v(u, '0000110010111', b);
+
+@pragma('dart2js:noInline')
+f_000_011_001_100_1(Set<String> u, int b) => v(u, '0000110011001', b);
+
+@pragma('dart2js:noInline')
+f_000_011_001_101_1(Set<String> u, int b) => v(u, '0000110011011', b);
+
+@pragma('dart2js:noInline')
+f_000_011_001_110_1(Set<String> u, int b) => v(u, '0000110011101', b);
+
+@pragma('dart2js:noInline')
+f_000_011_001_111_1(Set<String> u, int b) => v(u, '0000110011111', b);
+
+@pragma('dart2js:noInline')
+f_000_011_010_000_1(Set<String> u, int b) => v(u, '0000110100001', b);
+
+@pragma('dart2js:noInline')
+f_000_011_010_001_1(Set<String> u, int b) => v(u, '0000110100011', b);
+
+@pragma('dart2js:noInline')
+f_000_011_010_010_1(Set<String> u, int b) => v(u, '0000110100101', b);
+
+@pragma('dart2js:noInline')
+f_000_011_010_011_1(Set<String> u, int b) => v(u, '0000110100111', b);
+
+@pragma('dart2js:noInline')
+f_000_011_010_100_1(Set<String> u, int b) => v(u, '0000110101001', b);
+
+@pragma('dart2js:noInline')
+f_000_011_010_101_1(Set<String> u, int b) => v(u, '0000110101011', b);
+
+@pragma('dart2js:noInline')
+f_000_011_010_110_1(Set<String> u, int b) => v(u, '0000110101101', b);
+
+@pragma('dart2js:noInline')
+f_000_011_010_111_1(Set<String> u, int b) => v(u, '0000110101111', b);
+
+@pragma('dart2js:noInline')
+f_000_011_011_000_1(Set<String> u, int b) => v(u, '0000110110001', b);
+
+@pragma('dart2js:noInline')
+f_000_011_011_001_1(Set<String> u, int b) => v(u, '0000110110011', b);
+
+@pragma('dart2js:noInline')
+f_000_011_011_010_1(Set<String> u, int b) => v(u, '0000110110101', b);
+
+@pragma('dart2js:noInline')
+f_000_011_011_011_1(Set<String> u, int b) => v(u, '0000110110111', b);
+
+@pragma('dart2js:noInline')
+f_000_011_011_100_1(Set<String> u, int b) => v(u, '0000110111001', b);
+
+@pragma('dart2js:noInline')
+f_000_011_011_101_1(Set<String> u, int b) => v(u, '0000110111011', b);
+
+@pragma('dart2js:noInline')
+f_000_011_011_110_1(Set<String> u, int b) => v(u, '0000110111101', b);
+
+@pragma('dart2js:noInline')
+f_000_011_011_111_1(Set<String> u, int b) => v(u, '0000110111111', b);
+
+@pragma('dart2js:noInline')
+f_000_011_100_000_1(Set<String> u, int b) => v(u, '0000111000001', b);
+
+@pragma('dart2js:noInline')
+f_000_011_100_001_1(Set<String> u, int b) => v(u, '0000111000011', b);
+
+@pragma('dart2js:noInline')
+f_000_011_100_010_1(Set<String> u, int b) => v(u, '0000111000101', b);
+
+@pragma('dart2js:noInline')
+f_000_011_100_011_1(Set<String> u, int b) => v(u, '0000111000111', b);
+
+@pragma('dart2js:noInline')
+f_000_011_100_100_1(Set<String> u, int b) => v(u, '0000111001001', b);
+
+@pragma('dart2js:noInline')
+f_000_011_100_101_1(Set<String> u, int b) => v(u, '0000111001011', b);
+
+@pragma('dart2js:noInline')
+f_000_011_100_110_1(Set<String> u, int b) => v(u, '0000111001101', b);
+
+@pragma('dart2js:noInline')
+f_000_011_100_111_1(Set<String> u, int b) => v(u, '0000111001111', b);
+
+@pragma('dart2js:noInline')
+f_000_011_101_000_1(Set<String> u, int b) => v(u, '0000111010001', b);
+
+@pragma('dart2js:noInline')
+f_000_011_101_001_1(Set<String> u, int b) => v(u, '0000111010011', b);
+
+@pragma('dart2js:noInline')
+f_000_011_101_010_1(Set<String> u, int b) => v(u, '0000111010101', b);
+
+@pragma('dart2js:noInline')
+f_000_011_101_011_1(Set<String> u, int b) => v(u, '0000111010111', b);
+
+@pragma('dart2js:noInline')
+f_000_011_101_100_1(Set<String> u, int b) => v(u, '0000111011001', b);
+
+@pragma('dart2js:noInline')
+f_000_011_101_101_1(Set<String> u, int b) => v(u, '0000111011011', b);
+
+@pragma('dart2js:noInline')
+f_000_011_101_110_1(Set<String> u, int b) => v(u, '0000111011101', b);
+
+@pragma('dart2js:noInline')
+f_000_011_101_111_1(Set<String> u, int b) => v(u, '0000111011111', b);
+
+@pragma('dart2js:noInline')
+f_000_011_110_000_1(Set<String> u, int b) => v(u, '0000111100001', b);
+
+@pragma('dart2js:noInline')
+f_000_011_110_001_1(Set<String> u, int b) => v(u, '0000111100011', b);
+
+@pragma('dart2js:noInline')
+f_000_011_110_010_1(Set<String> u, int b) => v(u, '0000111100101', b);
+
+@pragma('dart2js:noInline')
+f_000_011_110_011_1(Set<String> u, int b) => v(u, '0000111100111', b);
+
+@pragma('dart2js:noInline')
+f_000_011_110_100_1(Set<String> u, int b) => v(u, '0000111101001', b);
+
+@pragma('dart2js:noInline')
+f_000_011_110_101_1(Set<String> u, int b) => v(u, '0000111101011', b);
+
+@pragma('dart2js:noInline')
+f_000_011_110_110_1(Set<String> u, int b) => v(u, '0000111101101', b);
+
+@pragma('dart2js:noInline')
+f_000_011_110_111_1(Set<String> u, int b) => v(u, '0000111101111', b);
+
+@pragma('dart2js:noInline')
+f_000_011_111_000_1(Set<String> u, int b) => v(u, '0000111110001', b);
+
+@pragma('dart2js:noInline')
+f_000_011_111_001_1(Set<String> u, int b) => v(u, '0000111110011', b);
+
+@pragma('dart2js:noInline')
+f_000_011_111_010_1(Set<String> u, int b) => v(u, '0000111110101', b);
+
+@pragma('dart2js:noInline')
+f_000_011_111_011_1(Set<String> u, int b) => v(u, '0000111110111', b);
+
+@pragma('dart2js:noInline')
+f_000_011_111_100_1(Set<String> u, int b) => v(u, '0000111111001', b);
+
+@pragma('dart2js:noInline')
+f_000_011_111_101_1(Set<String> u, int b) => v(u, '0000111111011', b);
+
+@pragma('dart2js:noInline')
+f_000_011_111_110_1(Set<String> u, int b) => v(u, '0000111111101', b);
+
+@pragma('dart2js:noInline')
+f_000_011_111_111_1(Set<String> u, int b) => v(u, '0000111111111', b);
+
+@pragma('dart2js:noInline')
+f_000_100_000_000_1(Set<String> u, int b) => v(u, '0001000000001', b);
+
+@pragma('dart2js:noInline')
+f_000_100_000_001_1(Set<String> u, int b) => v(u, '0001000000011', b);
+
+@pragma('dart2js:noInline')
+f_000_100_000_010_1(Set<String> u, int b) => v(u, '0001000000101', b);
+
+@pragma('dart2js:noInline')
+f_000_100_000_011_1(Set<String> u, int b) => v(u, '0001000000111', b);
+
+@pragma('dart2js:noInline')
+f_000_100_000_100_1(Set<String> u, int b) => v(u, '0001000001001', b);
+
+@pragma('dart2js:noInline')
+f_000_100_000_101_1(Set<String> u, int b) => v(u, '0001000001011', b);
+
+@pragma('dart2js:noInline')
+f_000_100_000_110_1(Set<String> u, int b) => v(u, '0001000001101', b);
+
+@pragma('dart2js:noInline')
+f_000_100_000_111_1(Set<String> u, int b) => v(u, '0001000001111', b);
+
+@pragma('dart2js:noInline')
+f_000_100_001_000_1(Set<String> u, int b) => v(u, '0001000010001', b);
+
+@pragma('dart2js:noInline')
+f_000_100_001_001_1(Set<String> u, int b) => v(u, '0001000010011', b);
+
+@pragma('dart2js:noInline')
+f_000_100_001_010_1(Set<String> u, int b) => v(u, '0001000010101', b);
+
+@pragma('dart2js:noInline')
+f_000_100_001_011_1(Set<String> u, int b) => v(u, '0001000010111', b);
+
+@pragma('dart2js:noInline')
+f_000_100_001_100_1(Set<String> u, int b) => v(u, '0001000011001', b);
+
+@pragma('dart2js:noInline')
+f_000_100_001_101_1(Set<String> u, int b) => v(u, '0001000011011', b);
+
+@pragma('dart2js:noInline')
+f_000_100_001_110_1(Set<String> u, int b) => v(u, '0001000011101', b);
+
+@pragma('dart2js:noInline')
+f_000_100_001_111_1(Set<String> u, int b) => v(u, '0001000011111', b);
+
+@pragma('dart2js:noInline')
+f_000_100_010_000_1(Set<String> u, int b) => v(u, '0001000100001', b);
+
+@pragma('dart2js:noInline')
+f_000_100_010_001_1(Set<String> u, int b) => v(u, '0001000100011', b);
+
+@pragma('dart2js:noInline')
+f_000_100_010_010_1(Set<String> u, int b) => v(u, '0001000100101', b);
+
+@pragma('dart2js:noInline')
+f_000_100_010_011_1(Set<String> u, int b) => v(u, '0001000100111', b);
+
+@pragma('dart2js:noInline')
+f_000_100_010_100_1(Set<String> u, int b) => v(u, '0001000101001', b);
+
+@pragma('dart2js:noInline')
+f_000_100_010_101_1(Set<String> u, int b) => v(u, '0001000101011', b);
+
+@pragma('dart2js:noInline')
+f_000_100_010_110_1(Set<String> u, int b) => v(u, '0001000101101', b);
+
+@pragma('dart2js:noInline')
+f_000_100_010_111_1(Set<String> u, int b) => v(u, '0001000101111', b);
+
+@pragma('dart2js:noInline')
+f_000_100_011_000_1(Set<String> u, int b) => v(u, '0001000110001', b);
+
+@pragma('dart2js:noInline')
+f_000_100_011_001_1(Set<String> u, int b) => v(u, '0001000110011', b);
+
+@pragma('dart2js:noInline')
+f_000_100_011_010_1(Set<String> u, int b) => v(u, '0001000110101', b);
+
+@pragma('dart2js:noInline')
+f_000_100_011_011_1(Set<String> u, int b) => v(u, '0001000110111', b);
+
+@pragma('dart2js:noInline')
+f_000_100_011_100_1(Set<String> u, int b) => v(u, '0001000111001', b);
+
+@pragma('dart2js:noInline')
+f_000_100_011_101_1(Set<String> u, int b) => v(u, '0001000111011', b);
+
+@pragma('dart2js:noInline')
+f_000_100_011_110_1(Set<String> u, int b) => v(u, '0001000111101', b);
+
+@pragma('dart2js:noInline')
+f_000_100_011_111_1(Set<String> u, int b) => v(u, '0001000111111', b);
+
+@pragma('dart2js:noInline')
+f_000_100_100_000_1(Set<String> u, int b) => v(u, '0001001000001', b);
+
+@pragma('dart2js:noInline')
+f_000_100_100_001_1(Set<String> u, int b) => v(u, '0001001000011', b);
+
+@pragma('dart2js:noInline')
+f_000_100_100_010_1(Set<String> u, int b) => v(u, '0001001000101', b);
+
+@pragma('dart2js:noInline')
+f_000_100_100_011_1(Set<String> u, int b) => v(u, '0001001000111', b);
+
+@pragma('dart2js:noInline')
+f_000_100_100_100_1(Set<String> u, int b) => v(u, '0001001001001', b);
+
+@pragma('dart2js:noInline')
+f_000_100_100_101_1(Set<String> u, int b) => v(u, '0001001001011', b);
+
+@pragma('dart2js:noInline')
+f_000_100_100_110_1(Set<String> u, int b) => v(u, '0001001001101', b);
+
+@pragma('dart2js:noInline')
+f_000_100_100_111_1(Set<String> u, int b) => v(u, '0001001001111', b);
+
+@pragma('dart2js:noInline')
+f_000_100_101_000_1(Set<String> u, int b) => v(u, '0001001010001', b);
+
+@pragma('dart2js:noInline')
+f_000_100_101_001_1(Set<String> u, int b) => v(u, '0001001010011', b);
+
+@pragma('dart2js:noInline')
+f_000_100_101_010_1(Set<String> u, int b) => v(u, '0001001010101', b);
+
+@pragma('dart2js:noInline')
+f_000_100_101_011_1(Set<String> u, int b) => v(u, '0001001010111', b);
+
+@pragma('dart2js:noInline')
+f_000_100_101_100_1(Set<String> u, int b) => v(u, '0001001011001', b);
+
+@pragma('dart2js:noInline')
+f_000_100_101_101_1(Set<String> u, int b) => v(u, '0001001011011', b);
+
+@pragma('dart2js:noInline')
+f_000_100_101_110_1(Set<String> u, int b) => v(u, '0001001011101', b);
+
+@pragma('dart2js:noInline')
+f_000_100_101_111_1(Set<String> u, int b) => v(u, '0001001011111', b);
+
+@pragma('dart2js:noInline')
+f_000_100_110_000_1(Set<String> u, int b) => v(u, '0001001100001', b);
+
+@pragma('dart2js:noInline')
+f_000_100_110_001_1(Set<String> u, int b) => v(u, '0001001100011', b);
+
+@pragma('dart2js:noInline')
+f_000_100_110_010_1(Set<String> u, int b) => v(u, '0001001100101', b);
+
+@pragma('dart2js:noInline')
+f_000_100_110_011_1(Set<String> u, int b) => v(u, '0001001100111', b);
+
+@pragma('dart2js:noInline')
+f_000_100_110_100_1(Set<String> u, int b) => v(u, '0001001101001', b);
+
+@pragma('dart2js:noInline')
+f_000_100_110_101_1(Set<String> u, int b) => v(u, '0001001101011', b);
+
+@pragma('dart2js:noInline')
+f_000_100_110_110_1(Set<String> u, int b) => v(u, '0001001101101', b);
+
+@pragma('dart2js:noInline')
+f_000_100_110_111_1(Set<String> u, int b) => v(u, '0001001101111', b);
+
+@pragma('dart2js:noInline')
+f_000_100_111_000_1(Set<String> u, int b) => v(u, '0001001110001', b);
+
+@pragma('dart2js:noInline')
+f_000_100_111_001_1(Set<String> u, int b) => v(u, '0001001110011', b);
+
+@pragma('dart2js:noInline')
+f_000_100_111_010_1(Set<String> u, int b) => v(u, '0001001110101', b);
+
+@pragma('dart2js:noInline')
+f_000_100_111_011_1(Set<String> u, int b) => v(u, '0001001110111', b);
+
+@pragma('dart2js:noInline')
+f_000_100_111_100_1(Set<String> u, int b) => v(u, '0001001111001', b);
+
+@pragma('dart2js:noInline')
+f_000_100_111_101_1(Set<String> u, int b) => v(u, '0001001111011', b);
+
+@pragma('dart2js:noInline')
+f_000_100_111_110_1(Set<String> u, int b) => v(u, '0001001111101', b);
+
+@pragma('dart2js:noInline')
+f_000_100_111_111_1(Set<String> u, int b) => v(u, '0001001111111', b);
+
+@pragma('dart2js:noInline')
+f_000_101_000_000_1(Set<String> u, int b) => v(u, '0001010000001', b);
+
+@pragma('dart2js:noInline')
+f_000_101_000_001_1(Set<String> u, int b) => v(u, '0001010000011', b);
+
+@pragma('dart2js:noInline')
+f_000_101_000_010_1(Set<String> u, int b) => v(u, '0001010000101', b);
+
+@pragma('dart2js:noInline')
+f_000_101_000_011_1(Set<String> u, int b) => v(u, '0001010000111', b);
+
+@pragma('dart2js:noInline')
+f_000_101_000_100_1(Set<String> u, int b) => v(u, '0001010001001', b);
+
+@pragma('dart2js:noInline')
+f_000_101_000_101_1(Set<String> u, int b) => v(u, '0001010001011', b);
+
+@pragma('dart2js:noInline')
+f_000_101_000_110_1(Set<String> u, int b) => v(u, '0001010001101', b);
+
+@pragma('dart2js:noInline')
+f_000_101_000_111_1(Set<String> u, int b) => v(u, '0001010001111', b);
+
+@pragma('dart2js:noInline')
+f_000_101_001_000_1(Set<String> u, int b) => v(u, '0001010010001', b);
+
+@pragma('dart2js:noInline')
+f_000_101_001_001_1(Set<String> u, int b) => v(u, '0001010010011', b);
+
+@pragma('dart2js:noInline')
+f_000_101_001_010_1(Set<String> u, int b) => v(u, '0001010010101', b);
+
+@pragma('dart2js:noInline')
+f_000_101_001_011_1(Set<String> u, int b) => v(u, '0001010010111', b);
+
+@pragma('dart2js:noInline')
+f_000_101_001_100_1(Set<String> u, int b) => v(u, '0001010011001', b);
+
+@pragma('dart2js:noInline')
+f_000_101_001_101_1(Set<String> u, int b) => v(u, '0001010011011', b);
+
+@pragma('dart2js:noInline')
+f_000_101_001_110_1(Set<String> u, int b) => v(u, '0001010011101', b);
+
+@pragma('dart2js:noInline')
+f_000_101_001_111_1(Set<String> u, int b) => v(u, '0001010011111', b);
+
+@pragma('dart2js:noInline')
+f_000_101_010_000_1(Set<String> u, int b) => v(u, '0001010100001', b);
+
+@pragma('dart2js:noInline')
+f_000_101_010_001_1(Set<String> u, int b) => v(u, '0001010100011', b);
+
+@pragma('dart2js:noInline')
+f_000_101_010_010_1(Set<String> u, int b) => v(u, '0001010100101', b);
+
+@pragma('dart2js:noInline')
+f_000_101_010_011_1(Set<String> u, int b) => v(u, '0001010100111', b);
+
+@pragma('dart2js:noInline')
+f_000_101_010_100_1(Set<String> u, int b) => v(u, '0001010101001', b);
+
+@pragma('dart2js:noInline')
+f_000_101_010_101_1(Set<String> u, int b) => v(u, '0001010101011', b);
+
+@pragma('dart2js:noInline')
+f_000_101_010_110_1(Set<String> u, int b) => v(u, '0001010101101', b);
+
+@pragma('dart2js:noInline')
+f_000_101_010_111_1(Set<String> u, int b) => v(u, '0001010101111', b);
+
+@pragma('dart2js:noInline')
+f_000_101_011_000_1(Set<String> u, int b) => v(u, '0001010110001', b);
+
+@pragma('dart2js:noInline')
+f_000_101_011_001_1(Set<String> u, int b) => v(u, '0001010110011', b);
+
+@pragma('dart2js:noInline')
+f_000_101_011_010_1(Set<String> u, int b) => v(u, '0001010110101', b);
+
+@pragma('dart2js:noInline')
+f_000_101_011_011_1(Set<String> u, int b) => v(u, '0001010110111', b);
+
+@pragma('dart2js:noInline')
+f_000_101_011_100_1(Set<String> u, int b) => v(u, '0001010111001', b);
+
+@pragma('dart2js:noInline')
+f_000_101_011_101_1(Set<String> u, int b) => v(u, '0001010111011', b);
+
+@pragma('dart2js:noInline')
+f_000_101_011_110_1(Set<String> u, int b) => v(u, '0001010111101', b);
+
+@pragma('dart2js:noInline')
+f_000_101_011_111_1(Set<String> u, int b) => v(u, '0001010111111', b);
+
+@pragma('dart2js:noInline')
+f_000_101_100_000_1(Set<String> u, int b) => v(u, '0001011000001', b);
+
+@pragma('dart2js:noInline')
+f_000_101_100_001_1(Set<String> u, int b) => v(u, '0001011000011', b);
+
+@pragma('dart2js:noInline')
+f_000_101_100_010_1(Set<String> u, int b) => v(u, '0001011000101', b);
+
+@pragma('dart2js:noInline')
+f_000_101_100_011_1(Set<String> u, int b) => v(u, '0001011000111', b);
+
+@pragma('dart2js:noInline')
+f_000_101_100_100_1(Set<String> u, int b) => v(u, '0001011001001', b);
+
+@pragma('dart2js:noInline')
+f_000_101_100_101_1(Set<String> u, int b) => v(u, '0001011001011', b);
+
+@pragma('dart2js:noInline')
+f_000_101_100_110_1(Set<String> u, int b) => v(u, '0001011001101', b);
+
+@pragma('dart2js:noInline')
+f_000_101_100_111_1(Set<String> u, int b) => v(u, '0001011001111', b);
+
+@pragma('dart2js:noInline')
+f_000_101_101_000_1(Set<String> u, int b) => v(u, '0001011010001', b);
+
+@pragma('dart2js:noInline')
+f_000_101_101_001_1(Set<String> u, int b) => v(u, '0001011010011', b);
+
+@pragma('dart2js:noInline')
+f_000_101_101_010_1(Set<String> u, int b) => v(u, '0001011010101', b);
+
+@pragma('dart2js:noInline')
+f_000_101_101_011_1(Set<String> u, int b) => v(u, '0001011010111', b);
+
+@pragma('dart2js:noInline')
+f_000_101_101_100_1(Set<String> u, int b) => v(u, '0001011011001', b);
+
+@pragma('dart2js:noInline')
+f_000_101_101_101_1(Set<String> u, int b) => v(u, '0001011011011', b);
+
+@pragma('dart2js:noInline')
+f_000_101_101_110_1(Set<String> u, int b) => v(u, '0001011011101', b);
+
+@pragma('dart2js:noInline')
+f_000_101_101_111_1(Set<String> u, int b) => v(u, '0001011011111', b);
+
+@pragma('dart2js:noInline')
+f_000_101_110_000_1(Set<String> u, int b) => v(u, '0001011100001', b);
+
+@pragma('dart2js:noInline')
+f_000_101_110_001_1(Set<String> u, int b) => v(u, '0001011100011', b);
+
+@pragma('dart2js:noInline')
+f_000_101_110_010_1(Set<String> u, int b) => v(u, '0001011100101', b);
+
+@pragma('dart2js:noInline')
+f_000_101_110_011_1(Set<String> u, int b) => v(u, '0001011100111', b);
+
+@pragma('dart2js:noInline')
+f_000_101_110_100_1(Set<String> u, int b) => v(u, '0001011101001', b);
+
+@pragma('dart2js:noInline')
+f_000_101_110_101_1(Set<String> u, int b) => v(u, '0001011101011', b);
+
+@pragma('dart2js:noInline')
+f_000_101_110_110_1(Set<String> u, int b) => v(u, '0001011101101', b);
+
+@pragma('dart2js:noInline')
+f_000_101_110_111_1(Set<String> u, int b) => v(u, '0001011101111', b);
+
+@pragma('dart2js:noInline')
+f_000_101_111_000_1(Set<String> u, int b) => v(u, '0001011110001', b);
+
+@pragma('dart2js:noInline')
+f_000_101_111_001_1(Set<String> u, int b) => v(u, '0001011110011', b);
+
+@pragma('dart2js:noInline')
+f_000_101_111_010_1(Set<String> u, int b) => v(u, '0001011110101', b);
+
+@pragma('dart2js:noInline')
+f_000_101_111_011_1(Set<String> u, int b) => v(u, '0001011110111', b);
+
+@pragma('dart2js:noInline')
+f_000_101_111_100_1(Set<String> u, int b) => v(u, '0001011111001', b);
+
+@pragma('dart2js:noInline')
+f_000_101_111_101_1(Set<String> u, int b) => v(u, '0001011111011', b);
+
+@pragma('dart2js:noInline')
+f_000_101_111_110_1(Set<String> u, int b) => v(u, '0001011111101', b);
+
+@pragma('dart2js:noInline')
+f_000_101_111_111_1(Set<String> u, int b) => v(u, '0001011111111', b);
+
+@pragma('dart2js:noInline')
+f_000_110_000_000_1(Set<String> u, int b) => v(u, '0001100000001', b);
+
+@pragma('dart2js:noInline')
+f_000_110_000_001_1(Set<String> u, int b) => v(u, '0001100000011', b);
+
+@pragma('dart2js:noInline')
+f_000_110_000_010_1(Set<String> u, int b) => v(u, '0001100000101', b);
+
+@pragma('dart2js:noInline')
+f_000_110_000_011_1(Set<String> u, int b) => v(u, '0001100000111', b);
+
+@pragma('dart2js:noInline')
+f_000_110_000_100_1(Set<String> u, int b) => v(u, '0001100001001', b);
+
+@pragma('dart2js:noInline')
+f_000_110_000_101_1(Set<String> u, int b) => v(u, '0001100001011', b);
+
+@pragma('dart2js:noInline')
+f_000_110_000_110_1(Set<String> u, int b) => v(u, '0001100001101', b);
+
+@pragma('dart2js:noInline')
+f_000_110_000_111_1(Set<String> u, int b) => v(u, '0001100001111', b);
+
+@pragma('dart2js:noInline')
+f_000_110_001_000_1(Set<String> u, int b) => v(u, '0001100010001', b);
+
+@pragma('dart2js:noInline')
+f_000_110_001_001_1(Set<String> u, int b) => v(u, '0001100010011', b);
+
+@pragma('dart2js:noInline')
+f_000_110_001_010_1(Set<String> u, int b) => v(u, '0001100010101', b);
+
+@pragma('dart2js:noInline')
+f_000_110_001_011_1(Set<String> u, int b) => v(u, '0001100010111', b);
+
+@pragma('dart2js:noInline')
+f_000_110_001_100_1(Set<String> u, int b) => v(u, '0001100011001', b);
+
+@pragma('dart2js:noInline')
+f_000_110_001_101_1(Set<String> u, int b) => v(u, '0001100011011', b);
+
+@pragma('dart2js:noInline')
+f_000_110_001_110_1(Set<String> u, int b) => v(u, '0001100011101', b);
+
+@pragma('dart2js:noInline')
+f_000_110_001_111_1(Set<String> u, int b) => v(u, '0001100011111', b);
+
+@pragma('dart2js:noInline')
+f_000_110_010_000_1(Set<String> u, int b) => v(u, '0001100100001', b);
+
+@pragma('dart2js:noInline')
+f_000_110_010_001_1(Set<String> u, int b) => v(u, '0001100100011', b);
+
+@pragma('dart2js:noInline')
+f_000_110_010_010_1(Set<String> u, int b) => v(u, '0001100100101', b);
+
+@pragma('dart2js:noInline')
+f_000_110_010_011_1(Set<String> u, int b) => v(u, '0001100100111', b);
+
+@pragma('dart2js:noInline')
+f_000_110_010_100_1(Set<String> u, int b) => v(u, '0001100101001', b);
+
+@pragma('dart2js:noInline')
+f_000_110_010_101_1(Set<String> u, int b) => v(u, '0001100101011', b);
+
+@pragma('dart2js:noInline')
+f_000_110_010_110_1(Set<String> u, int b) => v(u, '0001100101101', b);
+
+@pragma('dart2js:noInline')
+f_000_110_010_111_1(Set<String> u, int b) => v(u, '0001100101111', b);
+
+@pragma('dart2js:noInline')
+f_000_110_011_000_1(Set<String> u, int b) => v(u, '0001100110001', b);
+
+@pragma('dart2js:noInline')
+f_000_110_011_001_1(Set<String> u, int b) => v(u, '0001100110011', b);
+
+@pragma('dart2js:noInline')
+f_000_110_011_010_1(Set<String> u, int b) => v(u, '0001100110101', b);
+
+@pragma('dart2js:noInline')
+f_000_110_011_011_1(Set<String> u, int b) => v(u, '0001100110111', b);
+
+@pragma('dart2js:noInline')
+f_000_110_011_100_1(Set<String> u, int b) => v(u, '0001100111001', b);
+
+@pragma('dart2js:noInline')
+f_000_110_011_101_1(Set<String> u, int b) => v(u, '0001100111011', b);
+
+@pragma('dart2js:noInline')
+f_000_110_011_110_1(Set<String> u, int b) => v(u, '0001100111101', b);
+
+@pragma('dart2js:noInline')
+f_000_110_011_111_1(Set<String> u, int b) => v(u, '0001100111111', b);
+
+@pragma('dart2js:noInline')
+f_000_110_100_000_1(Set<String> u, int b) => v(u, '0001101000001', b);
+
+@pragma('dart2js:noInline')
+f_000_110_100_001_1(Set<String> u, int b) => v(u, '0001101000011', b);
+
+@pragma('dart2js:noInline')
+f_000_110_100_010_1(Set<String> u, int b) => v(u, '0001101000101', b);
+
+@pragma('dart2js:noInline')
+f_000_110_100_011_1(Set<String> u, int b) => v(u, '0001101000111', b);
+
+@pragma('dart2js:noInline')
+f_000_110_100_100_1(Set<String> u, int b) => v(u, '0001101001001', b);
+
+@pragma('dart2js:noInline')
+f_000_110_100_101_1(Set<String> u, int b) => v(u, '0001101001011', b);
+
+@pragma('dart2js:noInline')
+f_000_110_100_110_1(Set<String> u, int b) => v(u, '0001101001101', b);
+
+@pragma('dart2js:noInline')
+f_000_110_100_111_1(Set<String> u, int b) => v(u, '0001101001111', b);
+
+@pragma('dart2js:noInline')
+f_000_110_101_000_1(Set<String> u, int b) => v(u, '0001101010001', b);
+
+@pragma('dart2js:noInline')
+f_000_110_101_001_1(Set<String> u, int b) => v(u, '0001101010011', b);
+
+@pragma('dart2js:noInline')
+f_000_110_101_010_1(Set<String> u, int b) => v(u, '0001101010101', b);
+
+@pragma('dart2js:noInline')
+f_000_110_101_011_1(Set<String> u, int b) => v(u, '0001101010111', b);
+
+@pragma('dart2js:noInline')
+f_000_110_101_100_1(Set<String> u, int b) => v(u, '0001101011001', b);
+
+@pragma('dart2js:noInline')
+f_000_110_101_101_1(Set<String> u, int b) => v(u, '0001101011011', b);
+
+@pragma('dart2js:noInline')
+f_000_110_101_110_1(Set<String> u, int b) => v(u, '0001101011101', b);
+
+@pragma('dart2js:noInline')
+f_000_110_101_111_1(Set<String> u, int b) => v(u, '0001101011111', b);
+
+@pragma('dart2js:noInline')
+f_000_110_110_000_1(Set<String> u, int b) => v(u, '0001101100001', b);
+
+@pragma('dart2js:noInline')
+f_000_110_110_001_1(Set<String> u, int b) => v(u, '0001101100011', b);
+
+@pragma('dart2js:noInline')
+f_000_110_110_010_1(Set<String> u, int b) => v(u, '0001101100101', b);
+
+@pragma('dart2js:noInline')
+f_000_110_110_011_1(Set<String> u, int b) => v(u, '0001101100111', b);
+
+@pragma('dart2js:noInline')
+f_000_110_110_100_1(Set<String> u, int b) => v(u, '0001101101001', b);
+
+@pragma('dart2js:noInline')
+f_000_110_110_101_1(Set<String> u, int b) => v(u, '0001101101011', b);
+
+@pragma('dart2js:noInline')
+f_000_110_110_110_1(Set<String> u, int b) => v(u, '0001101101101', b);
+
+@pragma('dart2js:noInline')
+f_000_110_110_111_1(Set<String> u, int b) => v(u, '0001101101111', b);
+
+@pragma('dart2js:noInline')
+f_000_110_111_000_1(Set<String> u, int b) => v(u, '0001101110001', b);
+
+@pragma('dart2js:noInline')
+f_000_110_111_001_1(Set<String> u, int b) => v(u, '0001101110011', b);
+
+@pragma('dart2js:noInline')
+f_000_110_111_010_1(Set<String> u, int b) => v(u, '0001101110101', b);
+
+@pragma('dart2js:noInline')
+f_000_110_111_011_1(Set<String> u, int b) => v(u, '0001101110111', b);
+
+@pragma('dart2js:noInline')
+f_000_110_111_100_1(Set<String> u, int b) => v(u, '0001101111001', b);
+
+@pragma('dart2js:noInline')
+f_000_110_111_101_1(Set<String> u, int b) => v(u, '0001101111011', b);
+
+@pragma('dart2js:noInline')
+f_000_110_111_110_1(Set<String> u, int b) => v(u, '0001101111101', b);
+
+@pragma('dart2js:noInline')
+f_000_110_111_111_1(Set<String> u, int b) => v(u, '0001101111111', b);
+
+@pragma('dart2js:noInline')
+f_000_111_000_000_1(Set<String> u, int b) => v(u, '0001110000001', b);
+
+@pragma('dart2js:noInline')
+f_000_111_000_001_1(Set<String> u, int b) => v(u, '0001110000011', b);
+
+@pragma('dart2js:noInline')
+f_000_111_000_010_1(Set<String> u, int b) => v(u, '0001110000101', b);
+
+@pragma('dart2js:noInline')
+f_000_111_000_011_1(Set<String> u, int b) => v(u, '0001110000111', b);
+
+@pragma('dart2js:noInline')
+f_000_111_000_100_1(Set<String> u, int b) => v(u, '0001110001001', b);
+
+@pragma('dart2js:noInline')
+f_000_111_000_101_1(Set<String> u, int b) => v(u, '0001110001011', b);
+
+@pragma('dart2js:noInline')
+f_000_111_000_110_1(Set<String> u, int b) => v(u, '0001110001101', b);
+
+@pragma('dart2js:noInline')
+f_000_111_000_111_1(Set<String> u, int b) => v(u, '0001110001111', b);
+
+@pragma('dart2js:noInline')
+f_000_111_001_000_1(Set<String> u, int b) => v(u, '0001110010001', b);
+
+@pragma('dart2js:noInline')
+f_000_111_001_001_1(Set<String> u, int b) => v(u, '0001110010011', b);
+
+@pragma('dart2js:noInline')
+f_000_111_001_010_1(Set<String> u, int b) => v(u, '0001110010101', b);
+
+@pragma('dart2js:noInline')
+f_000_111_001_011_1(Set<String> u, int b) => v(u, '0001110010111', b);
+
+@pragma('dart2js:noInline')
+f_000_111_001_100_1(Set<String> u, int b) => v(u, '0001110011001', b);
+
+@pragma('dart2js:noInline')
+f_000_111_001_101_1(Set<String> u, int b) => v(u, '0001110011011', b);
+
+@pragma('dart2js:noInline')
+f_000_111_001_110_1(Set<String> u, int b) => v(u, '0001110011101', b);
+
+@pragma('dart2js:noInline')
+f_000_111_001_111_1(Set<String> u, int b) => v(u, '0001110011111', b);
+
+@pragma('dart2js:noInline')
+f_000_111_010_000_1(Set<String> u, int b) => v(u, '0001110100001', b);
+
+@pragma('dart2js:noInline')
+f_000_111_010_001_1(Set<String> u, int b) => v(u, '0001110100011', b);
+
+@pragma('dart2js:noInline')
+f_000_111_010_010_1(Set<String> u, int b) => v(u, '0001110100101', b);
+
+@pragma('dart2js:noInline')
+f_000_111_010_011_1(Set<String> u, int b) => v(u, '0001110100111', b);
+
+@pragma('dart2js:noInline')
+f_000_111_010_100_1(Set<String> u, int b) => v(u, '0001110101001', b);
+
+@pragma('dart2js:noInline')
+f_000_111_010_101_1(Set<String> u, int b) => v(u, '0001110101011', b);
+
+@pragma('dart2js:noInline')
+f_000_111_010_110_1(Set<String> u, int b) => v(u, '0001110101101', b);
+
+@pragma('dart2js:noInline')
+f_000_111_010_111_1(Set<String> u, int b) => v(u, '0001110101111', b);
+
+@pragma('dart2js:noInline')
+f_000_111_011_000_1(Set<String> u, int b) => v(u, '0001110110001', b);
+
+@pragma('dart2js:noInline')
+f_000_111_011_001_1(Set<String> u, int b) => v(u, '0001110110011', b);
+
+@pragma('dart2js:noInline')
+f_000_111_011_010_1(Set<String> u, int b) => v(u, '0001110110101', b);
+
+@pragma('dart2js:noInline')
+f_000_111_011_011_1(Set<String> u, int b) => v(u, '0001110110111', b);
+
+@pragma('dart2js:noInline')
+f_000_111_011_100_1(Set<String> u, int b) => v(u, '0001110111001', b);
+
+@pragma('dart2js:noInline')
+f_000_111_011_101_1(Set<String> u, int b) => v(u, '0001110111011', b);
+
+@pragma('dart2js:noInline')
+f_000_111_011_110_1(Set<String> u, int b) => v(u, '0001110111101', b);
+
+@pragma('dart2js:noInline')
+f_000_111_011_111_1(Set<String> u, int b) => v(u, '0001110111111', b);
+
+@pragma('dart2js:noInline')
+f_000_111_100_000_1(Set<String> u, int b) => v(u, '0001111000001', b);
+
+@pragma('dart2js:noInline')
+f_000_111_100_001_1(Set<String> u, int b) => v(u, '0001111000011', b);
+
+@pragma('dart2js:noInline')
+f_000_111_100_010_1(Set<String> u, int b) => v(u, '0001111000101', b);
+
+@pragma('dart2js:noInline')
+f_000_111_100_011_1(Set<String> u, int b) => v(u, '0001111000111', b);
+
+@pragma('dart2js:noInline')
+f_000_111_100_100_1(Set<String> u, int b) => v(u, '0001111001001', b);
+
+@pragma('dart2js:noInline')
+f_000_111_100_101_1(Set<String> u, int b) => v(u, '0001111001011', b);
+
+@pragma('dart2js:noInline')
+f_000_111_100_110_1(Set<String> u, int b) => v(u, '0001111001101', b);
+
+@pragma('dart2js:noInline')
+f_000_111_100_111_1(Set<String> u, int b) => v(u, '0001111001111', b);
+
+@pragma('dart2js:noInline')
+f_000_111_101_000_1(Set<String> u, int b) => v(u, '0001111010001', b);
+
+@pragma('dart2js:noInline')
+f_000_111_101_001_1(Set<String> u, int b) => v(u, '0001111010011', b);
+
+@pragma('dart2js:noInline')
+f_000_111_101_010_1(Set<String> u, int b) => v(u, '0001111010101', b);
+
+@pragma('dart2js:noInline')
+f_000_111_101_011_1(Set<String> u, int b) => v(u, '0001111010111', b);
+
+@pragma('dart2js:noInline')
+f_000_111_101_100_1(Set<String> u, int b) => v(u, '0001111011001', b);
+
+@pragma('dart2js:noInline')
+f_000_111_101_101_1(Set<String> u, int b) => v(u, '0001111011011', b);
+
+@pragma('dart2js:noInline')
+f_000_111_101_110_1(Set<String> u, int b) => v(u, '0001111011101', b);
+
+@pragma('dart2js:noInline')
+f_000_111_101_111_1(Set<String> u, int b) => v(u, '0001111011111', b);
+
+@pragma('dart2js:noInline')
+f_000_111_110_000_1(Set<String> u, int b) => v(u, '0001111100001', b);
+
+@pragma('dart2js:noInline')
+f_000_111_110_001_1(Set<String> u, int b) => v(u, '0001111100011', b);
+
+@pragma('dart2js:noInline')
+f_000_111_110_010_1(Set<String> u, int b) => v(u, '0001111100101', b);
+
+@pragma('dart2js:noInline')
+f_000_111_110_011_1(Set<String> u, int b) => v(u, '0001111100111', b);
+
+@pragma('dart2js:noInline')
+f_000_111_110_100_1(Set<String> u, int b) => v(u, '0001111101001', b);
+
+@pragma('dart2js:noInline')
+f_000_111_110_101_1(Set<String> u, int b) => v(u, '0001111101011', b);
+
+@pragma('dart2js:noInline')
+f_000_111_110_110_1(Set<String> u, int b) => v(u, '0001111101101', b);
+
+@pragma('dart2js:noInline')
+f_000_111_110_111_1(Set<String> u, int b) => v(u, '0001111101111', b);
+
+@pragma('dart2js:noInline')
+f_000_111_111_000_1(Set<String> u, int b) => v(u, '0001111110001', b);
+
+@pragma('dart2js:noInline')
+f_000_111_111_001_1(Set<String> u, int b) => v(u, '0001111110011', b);
+
+@pragma('dart2js:noInline')
+f_000_111_111_010_1(Set<String> u, int b) => v(u, '0001111110101', b);
+
+@pragma('dart2js:noInline')
+f_000_111_111_011_1(Set<String> u, int b) => v(u, '0001111110111', b);
+
+@pragma('dart2js:noInline')
+f_000_111_111_100_1(Set<String> u, int b) => v(u, '0001111111001', b);
+
+@pragma('dart2js:noInline')
+f_000_111_111_101_1(Set<String> u, int b) => v(u, '0001111111011', b);
+
+@pragma('dart2js:noInline')
+f_000_111_111_110_1(Set<String> u, int b) => v(u, '0001111111101', b);
+
+@pragma('dart2js:noInline')
+f_000_111_111_111_1(Set<String> u, int b) => v(u, '0001111111111', b);
+
+@pragma('dart2js:noInline')
+f_001_000_000_000_1(Set<String> u, int b) => v(u, '0010000000001', b);
+
+@pragma('dart2js:noInline')
+f_001_000_000_001_1(Set<String> u, int b) => v(u, '0010000000011', b);
+
+@pragma('dart2js:noInline')
+f_001_000_000_010_1(Set<String> u, int b) => v(u, '0010000000101', b);
+
+@pragma('dart2js:noInline')
+f_001_000_000_011_1(Set<String> u, int b) => v(u, '0010000000111', b);
+
+@pragma('dart2js:noInline')
+f_001_000_000_100_1(Set<String> u, int b) => v(u, '0010000001001', b);
+
+@pragma('dart2js:noInline')
+f_001_000_000_101_1(Set<String> u, int b) => v(u, '0010000001011', b);
+
+@pragma('dart2js:noInline')
+f_001_000_000_110_1(Set<String> u, int b) => v(u, '0010000001101', b);
+
+@pragma('dart2js:noInline')
+f_001_000_000_111_1(Set<String> u, int b) => v(u, '0010000001111', b);
+
+@pragma('dart2js:noInline')
+f_001_000_001_000_1(Set<String> u, int b) => v(u, '0010000010001', b);
+
+@pragma('dart2js:noInline')
+f_001_000_001_001_1(Set<String> u, int b) => v(u, '0010000010011', b);
+
+@pragma('dart2js:noInline')
+f_001_000_001_010_1(Set<String> u, int b) => v(u, '0010000010101', b);
+
+@pragma('dart2js:noInline')
+f_001_000_001_011_1(Set<String> u, int b) => v(u, '0010000010111', b);
+
+@pragma('dart2js:noInline')
+f_001_000_001_100_1(Set<String> u, int b) => v(u, '0010000011001', b);
+
+@pragma('dart2js:noInline')
+f_001_000_001_101_1(Set<String> u, int b) => v(u, '0010000011011', b);
+
+@pragma('dart2js:noInline')
+f_001_000_001_110_1(Set<String> u, int b) => v(u, '0010000011101', b);
+
+@pragma('dart2js:noInline')
+f_001_000_001_111_1(Set<String> u, int b) => v(u, '0010000011111', b);
+
+@pragma('dart2js:noInline')
+f_001_000_010_000_1(Set<String> u, int b) => v(u, '0010000100001', b);
+
+@pragma('dart2js:noInline')
+f_001_000_010_001_1(Set<String> u, int b) => v(u, '0010000100011', b);
+
+@pragma('dart2js:noInline')
+f_001_000_010_010_1(Set<String> u, int b) => v(u, '0010000100101', b);
+
+@pragma('dart2js:noInline')
+f_001_000_010_011_1(Set<String> u, int b) => v(u, '0010000100111', b);
+
+@pragma('dart2js:noInline')
+f_001_000_010_100_1(Set<String> u, int b) => v(u, '0010000101001', b);
+
+@pragma('dart2js:noInline')
+f_001_000_010_101_1(Set<String> u, int b) => v(u, '0010000101011', b);
+
+@pragma('dart2js:noInline')
+f_001_000_010_110_1(Set<String> u, int b) => v(u, '0010000101101', b);
+
+@pragma('dart2js:noInline')
+f_001_000_010_111_1(Set<String> u, int b) => v(u, '0010000101111', b);
+
+@pragma('dart2js:noInline')
+f_001_000_011_000_1(Set<String> u, int b) => v(u, '0010000110001', b);
+
+@pragma('dart2js:noInline')
+f_001_000_011_001_1(Set<String> u, int b) => v(u, '0010000110011', b);
+
+@pragma('dart2js:noInline')
+f_001_000_011_010_1(Set<String> u, int b) => v(u, '0010000110101', b);
+
+@pragma('dart2js:noInline')
+f_001_000_011_011_1(Set<String> u, int b) => v(u, '0010000110111', b);
+
+@pragma('dart2js:noInline')
+f_001_000_011_100_1(Set<String> u, int b) => v(u, '0010000111001', b);
+
+@pragma('dart2js:noInline')
+f_001_000_011_101_1(Set<String> u, int b) => v(u, '0010000111011', b);
+
+@pragma('dart2js:noInline')
+f_001_000_011_110_1(Set<String> u, int b) => v(u, '0010000111101', b);
+
+@pragma('dart2js:noInline')
+f_001_000_011_111_1(Set<String> u, int b) => v(u, '0010000111111', b);
+
+@pragma('dart2js:noInline')
+f_001_000_100_000_1(Set<String> u, int b) => v(u, '0010001000001', b);
+
+@pragma('dart2js:noInline')
+f_001_000_100_001_1(Set<String> u, int b) => v(u, '0010001000011', b);
+
+@pragma('dart2js:noInline')
+f_001_000_100_010_1(Set<String> u, int b) => v(u, '0010001000101', b);
+
+@pragma('dart2js:noInline')
+f_001_000_100_011_1(Set<String> u, int b) => v(u, '0010001000111', b);
+
+@pragma('dart2js:noInline')
+f_001_000_100_100_1(Set<String> u, int b) => v(u, '0010001001001', b);
+
+@pragma('dart2js:noInline')
+f_001_000_100_101_1(Set<String> u, int b) => v(u, '0010001001011', b);
+
+@pragma('dart2js:noInline')
+f_001_000_100_110_1(Set<String> u, int b) => v(u, '0010001001101', b);
+
+@pragma('dart2js:noInline')
+f_001_000_100_111_1(Set<String> u, int b) => v(u, '0010001001111', b);
+
+@pragma('dart2js:noInline')
+f_001_000_101_000_1(Set<String> u, int b) => v(u, '0010001010001', b);
+
+@pragma('dart2js:noInline')
+f_001_000_101_001_1(Set<String> u, int b) => v(u, '0010001010011', b);
+
+@pragma('dart2js:noInline')
+f_001_000_101_010_1(Set<String> u, int b) => v(u, '0010001010101', b);
+
+@pragma('dart2js:noInline')
+f_001_000_101_011_1(Set<String> u, int b) => v(u, '0010001010111', b);
+
+@pragma('dart2js:noInline')
+f_001_000_101_100_1(Set<String> u, int b) => v(u, '0010001011001', b);
+
+@pragma('dart2js:noInline')
+f_001_000_101_101_1(Set<String> u, int b) => v(u, '0010001011011', b);
+
+@pragma('dart2js:noInline')
+f_001_000_101_110_1(Set<String> u, int b) => v(u, '0010001011101', b);
+
+@pragma('dart2js:noInline')
+f_001_000_101_111_1(Set<String> u, int b) => v(u, '0010001011111', b);
+
+@pragma('dart2js:noInline')
+f_001_000_110_000_1(Set<String> u, int b) => v(u, '0010001100001', b);
+
+@pragma('dart2js:noInline')
+f_001_000_110_001_1(Set<String> u, int b) => v(u, '0010001100011', b);
+
+@pragma('dart2js:noInline')
+f_001_000_110_010_1(Set<String> u, int b) => v(u, '0010001100101', b);
+
+@pragma('dart2js:noInline')
+f_001_000_110_011_1(Set<String> u, int b) => v(u, '0010001100111', b);
+
+@pragma('dart2js:noInline')
+f_001_000_110_100_1(Set<String> u, int b) => v(u, '0010001101001', b);
+
+@pragma('dart2js:noInline')
+f_001_000_110_101_1(Set<String> u, int b) => v(u, '0010001101011', b);
+
+@pragma('dart2js:noInline')
+f_001_000_110_110_1(Set<String> u, int b) => v(u, '0010001101101', b);
+
+@pragma('dart2js:noInline')
+f_001_000_110_111_1(Set<String> u, int b) => v(u, '0010001101111', b);
+
+@pragma('dart2js:noInline')
+f_001_000_111_000_1(Set<String> u, int b) => v(u, '0010001110001', b);
+
+@pragma('dart2js:noInline')
+f_001_000_111_001_1(Set<String> u, int b) => v(u, '0010001110011', b);
+
+@pragma('dart2js:noInline')
+f_001_000_111_010_1(Set<String> u, int b) => v(u, '0010001110101', b);
+
+@pragma('dart2js:noInline')
+f_001_000_111_011_1(Set<String> u, int b) => v(u, '0010001110111', b);
+
+@pragma('dart2js:noInline')
+f_001_000_111_100_1(Set<String> u, int b) => v(u, '0010001111001', b);
+
+@pragma('dart2js:noInline')
+f_001_000_111_101_1(Set<String> u, int b) => v(u, '0010001111011', b);
+
+@pragma('dart2js:noInline')
+f_001_000_111_110_1(Set<String> u, int b) => v(u, '0010001111101', b);
+
+@pragma('dart2js:noInline')
+f_001_000_111_111_1(Set<String> u, int b) => v(u, '0010001111111', b);
+
+@pragma('dart2js:noInline')
+f_001_001_000_000_1(Set<String> u, int b) => v(u, '0010010000001', b);
+
+@pragma('dart2js:noInline')
+f_001_001_000_001_1(Set<String> u, int b) => v(u, '0010010000011', b);
+
+@pragma('dart2js:noInline')
+f_001_001_000_010_1(Set<String> u, int b) => v(u, '0010010000101', b);
+
+@pragma('dart2js:noInline')
+f_001_001_000_011_1(Set<String> u, int b) => v(u, '0010010000111', b);
+
+@pragma('dart2js:noInline')
+f_001_001_000_100_1(Set<String> u, int b) => v(u, '0010010001001', b);
+
+@pragma('dart2js:noInline')
+f_001_001_000_101_1(Set<String> u, int b) => v(u, '0010010001011', b);
+
+@pragma('dart2js:noInline')
+f_001_001_000_110_1(Set<String> u, int b) => v(u, '0010010001101', b);
+
+@pragma('dart2js:noInline')
+f_001_001_000_111_1(Set<String> u, int b) => v(u, '0010010001111', b);
+
+@pragma('dart2js:noInline')
+f_001_001_001_000_1(Set<String> u, int b) => v(u, '0010010010001', b);
+
+@pragma('dart2js:noInline')
+f_001_001_001_001_1(Set<String> u, int b) => v(u, '0010010010011', b);
+
+@pragma('dart2js:noInline')
+f_001_001_001_010_1(Set<String> u, int b) => v(u, '0010010010101', b);
+
+@pragma('dart2js:noInline')
+f_001_001_001_011_1(Set<String> u, int b) => v(u, '0010010010111', b);
+
+@pragma('dart2js:noInline')
+f_001_001_001_100_1(Set<String> u, int b) => v(u, '0010010011001', b);
+
+@pragma('dart2js:noInline')
+f_001_001_001_101_1(Set<String> u, int b) => v(u, '0010010011011', b);
+
+@pragma('dart2js:noInline')
+f_001_001_001_110_1(Set<String> u, int b) => v(u, '0010010011101', b);
+
+@pragma('dart2js:noInline')
+f_001_001_001_111_1(Set<String> u, int b) => v(u, '0010010011111', b);
+
+@pragma('dart2js:noInline')
+f_001_001_010_000_1(Set<String> u, int b) => v(u, '0010010100001', b);
+
+@pragma('dart2js:noInline')
+f_001_001_010_001_1(Set<String> u, int b) => v(u, '0010010100011', b);
+
+@pragma('dart2js:noInline')
+f_001_001_010_010_1(Set<String> u, int b) => v(u, '0010010100101', b);
+
+@pragma('dart2js:noInline')
+f_001_001_010_011_1(Set<String> u, int b) => v(u, '0010010100111', b);
+
+@pragma('dart2js:noInline')
+f_001_001_010_100_1(Set<String> u, int b) => v(u, '0010010101001', b);
+
+@pragma('dart2js:noInline')
+f_001_001_010_101_1(Set<String> u, int b) => v(u, '0010010101011', b);
+
+@pragma('dart2js:noInline')
+f_001_001_010_110_1(Set<String> u, int b) => v(u, '0010010101101', b);
+
+@pragma('dart2js:noInline')
+f_001_001_010_111_1(Set<String> u, int b) => v(u, '0010010101111', b);
+
+@pragma('dart2js:noInline')
+f_001_001_011_000_1(Set<String> u, int b) => v(u, '0010010110001', b);
+
+@pragma('dart2js:noInline')
+f_001_001_011_001_1(Set<String> u, int b) => v(u, '0010010110011', b);
+
+@pragma('dart2js:noInline')
+f_001_001_011_010_1(Set<String> u, int b) => v(u, '0010010110101', b);
+
+@pragma('dart2js:noInline')
+f_001_001_011_011_1(Set<String> u, int b) => v(u, '0010010110111', b);
+
+@pragma('dart2js:noInline')
+f_001_001_011_100_1(Set<String> u, int b) => v(u, '0010010111001', b);
+
+@pragma('dart2js:noInline')
+f_001_001_011_101_1(Set<String> u, int b) => v(u, '0010010111011', b);
+
+@pragma('dart2js:noInline')
+f_001_001_011_110_1(Set<String> u, int b) => v(u, '0010010111101', b);
+
+@pragma('dart2js:noInline')
+f_001_001_011_111_1(Set<String> u, int b) => v(u, '0010010111111', b);
+
+@pragma('dart2js:noInline')
+f_001_001_100_000_1(Set<String> u, int b) => v(u, '0010011000001', b);
+
+@pragma('dart2js:noInline')
+f_001_001_100_001_1(Set<String> u, int b) => v(u, '0010011000011', b);
+
+@pragma('dart2js:noInline')
+f_001_001_100_010_1(Set<String> u, int b) => v(u, '0010011000101', b);
+
+@pragma('dart2js:noInline')
+f_001_001_100_011_1(Set<String> u, int b) => v(u, '0010011000111', b);
+
+@pragma('dart2js:noInline')
+f_001_001_100_100_1(Set<String> u, int b) => v(u, '0010011001001', b);
+
+@pragma('dart2js:noInline')
+f_001_001_100_101_1(Set<String> u, int b) => v(u, '0010011001011', b);
+
+@pragma('dart2js:noInline')
+f_001_001_100_110_1(Set<String> u, int b) => v(u, '0010011001101', b);
+
+@pragma('dart2js:noInline')
+f_001_001_100_111_1(Set<String> u, int b) => v(u, '0010011001111', b);
+
+@pragma('dart2js:noInline')
+f_001_001_101_000_1(Set<String> u, int b) => v(u, '0010011010001', b);
+
+@pragma('dart2js:noInline')
+f_001_001_101_001_1(Set<String> u, int b) => v(u, '0010011010011', b);
+
+@pragma('dart2js:noInline')
+f_001_001_101_010_1(Set<String> u, int b) => v(u, '0010011010101', b);
+
+@pragma('dart2js:noInline')
+f_001_001_101_011_1(Set<String> u, int b) => v(u, '0010011010111', b);
+
+@pragma('dart2js:noInline')
+f_001_001_101_100_1(Set<String> u, int b) => v(u, '0010011011001', b);
+
+@pragma('dart2js:noInline')
+f_001_001_101_101_1(Set<String> u, int b) => v(u, '0010011011011', b);
+
+@pragma('dart2js:noInline')
+f_001_001_101_110_1(Set<String> u, int b) => v(u, '0010011011101', b);
+
+@pragma('dart2js:noInline')
+f_001_001_101_111_1(Set<String> u, int b) => v(u, '0010011011111', b);
+
+@pragma('dart2js:noInline')
+f_001_001_110_000_1(Set<String> u, int b) => v(u, '0010011100001', b);
+
+@pragma('dart2js:noInline')
+f_001_001_110_001_1(Set<String> u, int b) => v(u, '0010011100011', b);
+
+@pragma('dart2js:noInline')
+f_001_001_110_010_1(Set<String> u, int b) => v(u, '0010011100101', b);
+
+@pragma('dart2js:noInline')
+f_001_001_110_011_1(Set<String> u, int b) => v(u, '0010011100111', b);
+
+@pragma('dart2js:noInline')
+f_001_001_110_100_1(Set<String> u, int b) => v(u, '0010011101001', b);
+
+@pragma('dart2js:noInline')
+f_001_001_110_101_1(Set<String> u, int b) => v(u, '0010011101011', b);
+
+@pragma('dart2js:noInline')
+f_001_001_110_110_1(Set<String> u, int b) => v(u, '0010011101101', b);
+
+@pragma('dart2js:noInline')
+f_001_001_110_111_1(Set<String> u, int b) => v(u, '0010011101111', b);
+
+@pragma('dart2js:noInline')
+f_001_001_111_000_1(Set<String> u, int b) => v(u, '0010011110001', b);
+
+@pragma('dart2js:noInline')
+f_001_001_111_001_1(Set<String> u, int b) => v(u, '0010011110011', b);
+
+@pragma('dart2js:noInline')
+f_001_001_111_010_1(Set<String> u, int b) => v(u, '0010011110101', b);
+
+@pragma('dart2js:noInline')
+f_001_001_111_011_1(Set<String> u, int b) => v(u, '0010011110111', b);
+
+@pragma('dart2js:noInline')
+f_001_001_111_100_1(Set<String> u, int b) => v(u, '0010011111001', b);
+
+@pragma('dart2js:noInline')
+f_001_001_111_101_1(Set<String> u, int b) => v(u, '0010011111011', b);
+
+@pragma('dart2js:noInline')
+f_001_001_111_110_1(Set<String> u, int b) => v(u, '0010011111101', b);
+
+@pragma('dart2js:noInline')
+f_001_001_111_111_1(Set<String> u, int b) => v(u, '0010011111111', b);
+
+@pragma('dart2js:noInline')
+f_001_010_000_000_1(Set<String> u, int b) => v(u, '0010100000001', b);
+
+@pragma('dart2js:noInline')
+f_001_010_000_001_1(Set<String> u, int b) => v(u, '0010100000011', b);
+
+@pragma('dart2js:noInline')
+f_001_010_000_010_1(Set<String> u, int b) => v(u, '0010100000101', b);
+
+@pragma('dart2js:noInline')
+f_001_010_000_011_1(Set<String> u, int b) => v(u, '0010100000111', b);
+
+@pragma('dart2js:noInline')
+f_001_010_000_100_1(Set<String> u, int b) => v(u, '0010100001001', b);
+
+@pragma('dart2js:noInline')
+f_001_010_000_101_1(Set<String> u, int b) => v(u, '0010100001011', b);
+
+@pragma('dart2js:noInline')
+f_001_010_000_110_1(Set<String> u, int b) => v(u, '0010100001101', b);
+
+@pragma('dart2js:noInline')
+f_001_010_000_111_1(Set<String> u, int b) => v(u, '0010100001111', b);
+
+@pragma('dart2js:noInline')
+f_001_010_001_000_1(Set<String> u, int b) => v(u, '0010100010001', b);
+
+@pragma('dart2js:noInline')
+f_001_010_001_001_1(Set<String> u, int b) => v(u, '0010100010011', b);
+
+@pragma('dart2js:noInline')
+f_001_010_001_010_1(Set<String> u, int b) => v(u, '0010100010101', b);
+
+@pragma('dart2js:noInline')
+f_001_010_001_011_1(Set<String> u, int b) => v(u, '0010100010111', b);
+
+@pragma('dart2js:noInline')
+f_001_010_001_100_1(Set<String> u, int b) => v(u, '0010100011001', b);
+
+@pragma('dart2js:noInline')
+f_001_010_001_101_1(Set<String> u, int b) => v(u, '0010100011011', b);
+
+@pragma('dart2js:noInline')
+f_001_010_001_110_1(Set<String> u, int b) => v(u, '0010100011101', b);
+
+@pragma('dart2js:noInline')
+f_001_010_001_111_1(Set<String> u, int b) => v(u, '0010100011111', b);
+
+@pragma('dart2js:noInline')
+f_001_010_010_000_1(Set<String> u, int b) => v(u, '0010100100001', b);
+
+@pragma('dart2js:noInline')
+f_001_010_010_001_1(Set<String> u, int b) => v(u, '0010100100011', b);
+
+@pragma('dart2js:noInline')
+f_001_010_010_010_1(Set<String> u, int b) => v(u, '0010100100101', b);
+
+@pragma('dart2js:noInline')
+f_001_010_010_011_1(Set<String> u, int b) => v(u, '0010100100111', b);
+
+@pragma('dart2js:noInline')
+f_001_010_010_100_1(Set<String> u, int b) => v(u, '0010100101001', b);
+
+@pragma('dart2js:noInline')
+f_001_010_010_101_1(Set<String> u, int b) => v(u, '0010100101011', b);
+
+@pragma('dart2js:noInline')
+f_001_010_010_110_1(Set<String> u, int b) => v(u, '0010100101101', b);
+
+@pragma('dart2js:noInline')
+f_001_010_010_111_1(Set<String> u, int b) => v(u, '0010100101111', b);
+
+@pragma('dart2js:noInline')
+f_001_010_011_000_1(Set<String> u, int b) => v(u, '0010100110001', b);
+
+@pragma('dart2js:noInline')
+f_001_010_011_001_1(Set<String> u, int b) => v(u, '0010100110011', b);
+
+@pragma('dart2js:noInline')
+f_001_010_011_010_1(Set<String> u, int b) => v(u, '0010100110101', b);
+
+@pragma('dart2js:noInline')
+f_001_010_011_011_1(Set<String> u, int b) => v(u, '0010100110111', b);
+
+@pragma('dart2js:noInline')
+f_001_010_011_100_1(Set<String> u, int b) => v(u, '0010100111001', b);
+
+@pragma('dart2js:noInline')
+f_001_010_011_101_1(Set<String> u, int b) => v(u, '0010100111011', b);
+
+@pragma('dart2js:noInline')
+f_001_010_011_110_1(Set<String> u, int b) => v(u, '0010100111101', b);
+
+@pragma('dart2js:noInline')
+f_001_010_011_111_1(Set<String> u, int b) => v(u, '0010100111111', b);
+
+@pragma('dart2js:noInline')
+f_001_010_100_000_1(Set<String> u, int b) => v(u, '0010101000001', b);
+
+@pragma('dart2js:noInline')
+f_001_010_100_001_1(Set<String> u, int b) => v(u, '0010101000011', b);
+
+@pragma('dart2js:noInline')
+f_001_010_100_010_1(Set<String> u, int b) => v(u, '0010101000101', b);
+
+@pragma('dart2js:noInline')
+f_001_010_100_011_1(Set<String> u, int b) => v(u, '0010101000111', b);
+
+@pragma('dart2js:noInline')
+f_001_010_100_100_1(Set<String> u, int b) => v(u, '0010101001001', b);
+
+@pragma('dart2js:noInline')
+f_001_010_100_101_1(Set<String> u, int b) => v(u, '0010101001011', b);
+
+@pragma('dart2js:noInline')
+f_001_010_100_110_1(Set<String> u, int b) => v(u, '0010101001101', b);
+
+@pragma('dart2js:noInline')
+f_001_010_100_111_1(Set<String> u, int b) => v(u, '0010101001111', b);
+
+@pragma('dart2js:noInline')
+f_001_010_101_000_1(Set<String> u, int b) => v(u, '0010101010001', b);
+
+@pragma('dart2js:noInline')
+f_001_010_101_001_1(Set<String> u, int b) => v(u, '0010101010011', b);
+
+@pragma('dart2js:noInline')
+f_001_010_101_010_1(Set<String> u, int b) => v(u, '0010101010101', b);
+
+@pragma('dart2js:noInline')
+f_001_010_101_011_1(Set<String> u, int b) => v(u, '0010101010111', b);
+
+@pragma('dart2js:noInline')
+f_001_010_101_100_1(Set<String> u, int b) => v(u, '0010101011001', b);
+
+@pragma('dart2js:noInline')
+f_001_010_101_101_1(Set<String> u, int b) => v(u, '0010101011011', b);
+
+@pragma('dart2js:noInline')
+f_001_010_101_110_1(Set<String> u, int b) => v(u, '0010101011101', b);
+
+@pragma('dart2js:noInline')
+f_001_010_101_111_1(Set<String> u, int b) => v(u, '0010101011111', b);
+
+@pragma('dart2js:noInline')
+f_001_010_110_000_1(Set<String> u, int b) => v(u, '0010101100001', b);
+
+@pragma('dart2js:noInline')
+f_001_010_110_001_1(Set<String> u, int b) => v(u, '0010101100011', b);
+
+@pragma('dart2js:noInline')
+f_001_010_110_010_1(Set<String> u, int b) => v(u, '0010101100101', b);
+
+@pragma('dart2js:noInline')
+f_001_010_110_011_1(Set<String> u, int b) => v(u, '0010101100111', b);
+
+@pragma('dart2js:noInline')
+f_001_010_110_100_1(Set<String> u, int b) => v(u, '0010101101001', b);
+
+@pragma('dart2js:noInline')
+f_001_010_110_101_1(Set<String> u, int b) => v(u, '0010101101011', b);
+
+@pragma('dart2js:noInline')
+f_001_010_110_110_1(Set<String> u, int b) => v(u, '0010101101101', b);
+
+@pragma('dart2js:noInline')
+f_001_010_110_111_1(Set<String> u, int b) => v(u, '0010101101111', b);
+
+@pragma('dart2js:noInline')
+f_001_010_111_000_1(Set<String> u, int b) => v(u, '0010101110001', b);
+
+@pragma('dart2js:noInline')
+f_001_010_111_001_1(Set<String> u, int b) => v(u, '0010101110011', b);
+
+@pragma('dart2js:noInline')
+f_001_010_111_010_1(Set<String> u, int b) => v(u, '0010101110101', b);
+
+@pragma('dart2js:noInline')
+f_001_010_111_011_1(Set<String> u, int b) => v(u, '0010101110111', b);
+
+@pragma('dart2js:noInline')
+f_001_010_111_100_1(Set<String> u, int b) => v(u, '0010101111001', b);
+
+@pragma('dart2js:noInline')
+f_001_010_111_101_1(Set<String> u, int b) => v(u, '0010101111011', b);
+
+@pragma('dart2js:noInline')
+f_001_010_111_110_1(Set<String> u, int b) => v(u, '0010101111101', b);
+
+@pragma('dart2js:noInline')
+f_001_010_111_111_1(Set<String> u, int b) => v(u, '0010101111111', b);
+
+@pragma('dart2js:noInline')
+f_001_011_000_000_1(Set<String> u, int b) => v(u, '0010110000001', b);
+
+@pragma('dart2js:noInline')
+f_001_011_000_001_1(Set<String> u, int b) => v(u, '0010110000011', b);
+
+@pragma('dart2js:noInline')
+f_001_011_000_010_1(Set<String> u, int b) => v(u, '0010110000101', b);
+
+@pragma('dart2js:noInline')
+f_001_011_000_011_1(Set<String> u, int b) => v(u, '0010110000111', b);
+
+@pragma('dart2js:noInline')
+f_001_011_000_100_1(Set<String> u, int b) => v(u, '0010110001001', b);
+
+@pragma('dart2js:noInline')
+f_001_011_000_101_1(Set<String> u, int b) => v(u, '0010110001011', b);
+
+@pragma('dart2js:noInline')
+f_001_011_000_110_1(Set<String> u, int b) => v(u, '0010110001101', b);
+
+@pragma('dart2js:noInline')
+f_001_011_000_111_1(Set<String> u, int b) => v(u, '0010110001111', b);
+
+@pragma('dart2js:noInline')
+f_001_011_001_000_1(Set<String> u, int b) => v(u, '0010110010001', b);
+
+@pragma('dart2js:noInline')
+f_001_011_001_001_1(Set<String> u, int b) => v(u, '0010110010011', b);
+
+@pragma('dart2js:noInline')
+f_001_011_001_010_1(Set<String> u, int b) => v(u, '0010110010101', b);
+
+@pragma('dart2js:noInline')
+f_001_011_001_011_1(Set<String> u, int b) => v(u, '0010110010111', b);
+
+@pragma('dart2js:noInline')
+f_001_011_001_100_1(Set<String> u, int b) => v(u, '0010110011001', b);
+
+@pragma('dart2js:noInline')
+f_001_011_001_101_1(Set<String> u, int b) => v(u, '0010110011011', b);
+
+@pragma('dart2js:noInline')
+f_001_011_001_110_1(Set<String> u, int b) => v(u, '0010110011101', b);
+
+@pragma('dart2js:noInline')
+f_001_011_001_111_1(Set<String> u, int b) => v(u, '0010110011111', b);
+
+@pragma('dart2js:noInline')
+f_001_011_010_000_1(Set<String> u, int b) => v(u, '0010110100001', b);
+
+@pragma('dart2js:noInline')
+f_001_011_010_001_1(Set<String> u, int b) => v(u, '0010110100011', b);
+
+@pragma('dart2js:noInline')
+f_001_011_010_010_1(Set<String> u, int b) => v(u, '0010110100101', b);
+
+@pragma('dart2js:noInline')
+f_001_011_010_011_1(Set<String> u, int b) => v(u, '0010110100111', b);
+
+@pragma('dart2js:noInline')
+f_001_011_010_100_1(Set<String> u, int b) => v(u, '0010110101001', b);
+
+@pragma('dart2js:noInline')
+f_001_011_010_101_1(Set<String> u, int b) => v(u, '0010110101011', b);
+
+@pragma('dart2js:noInline')
+f_001_011_010_110_1(Set<String> u, int b) => v(u, '0010110101101', b);
+
+@pragma('dart2js:noInline')
+f_001_011_010_111_1(Set<String> u, int b) => v(u, '0010110101111', b);
+
+@pragma('dart2js:noInline')
+f_001_011_011_000_1(Set<String> u, int b) => v(u, '0010110110001', b);
+
+@pragma('dart2js:noInline')
+f_001_011_011_001_1(Set<String> u, int b) => v(u, '0010110110011', b);
+
+@pragma('dart2js:noInline')
+f_001_011_011_010_1(Set<String> u, int b) => v(u, '0010110110101', b);
+
+@pragma('dart2js:noInline')
+f_001_011_011_011_1(Set<String> u, int b) => v(u, '0010110110111', b);
+
+@pragma('dart2js:noInline')
+f_001_011_011_100_1(Set<String> u, int b) => v(u, '0010110111001', b);
+
+@pragma('dart2js:noInline')
+f_001_011_011_101_1(Set<String> u, int b) => v(u, '0010110111011', b);
+
+@pragma('dart2js:noInline')
+f_001_011_011_110_1(Set<String> u, int b) => v(u, '0010110111101', b);
+
+@pragma('dart2js:noInline')
+f_001_011_011_111_1(Set<String> u, int b) => v(u, '0010110111111', b);
+
+@pragma('dart2js:noInline')
+f_001_011_100_000_1(Set<String> u, int b) => v(u, '0010111000001', b);
+
+@pragma('dart2js:noInline')
+f_001_011_100_001_1(Set<String> u, int b) => v(u, '0010111000011', b);
+
+@pragma('dart2js:noInline')
+f_001_011_100_010_1(Set<String> u, int b) => v(u, '0010111000101', b);
+
+@pragma('dart2js:noInline')
+f_001_011_100_011_1(Set<String> u, int b) => v(u, '0010111000111', b);
+
+@pragma('dart2js:noInline')
+f_001_011_100_100_1(Set<String> u, int b) => v(u, '0010111001001', b);
+
+@pragma('dart2js:noInline')
+f_001_011_100_101_1(Set<String> u, int b) => v(u, '0010111001011', b);
+
+@pragma('dart2js:noInline')
+f_001_011_100_110_1(Set<String> u, int b) => v(u, '0010111001101', b);
+
+@pragma('dart2js:noInline')
+f_001_011_100_111_1(Set<String> u, int b) => v(u, '0010111001111', b);
+
+@pragma('dart2js:noInline')
+f_001_011_101_000_1(Set<String> u, int b) => v(u, '0010111010001', b);
+
+@pragma('dart2js:noInline')
+f_001_011_101_001_1(Set<String> u, int b) => v(u, '0010111010011', b);
+
+@pragma('dart2js:noInline')
+f_001_011_101_010_1(Set<String> u, int b) => v(u, '0010111010101', b);
+
+@pragma('dart2js:noInline')
+f_001_011_101_011_1(Set<String> u, int b) => v(u, '0010111010111', b);
+
+@pragma('dart2js:noInline')
+f_001_011_101_100_1(Set<String> u, int b) => v(u, '0010111011001', b);
+
+@pragma('dart2js:noInline')
+f_001_011_101_101_1(Set<String> u, int b) => v(u, '0010111011011', b);
+
+@pragma('dart2js:noInline')
+f_001_011_101_110_1(Set<String> u, int b) => v(u, '0010111011101', b);
+
+@pragma('dart2js:noInline')
+f_001_011_101_111_1(Set<String> u, int b) => v(u, '0010111011111', b);
+
+@pragma('dart2js:noInline')
+f_001_011_110_000_1(Set<String> u, int b) => v(u, '0010111100001', b);
+
+@pragma('dart2js:noInline')
+f_001_011_110_001_1(Set<String> u, int b) => v(u, '0010111100011', b);
+
+@pragma('dart2js:noInline')
+f_001_011_110_010_1(Set<String> u, int b) => v(u, '0010111100101', b);
+
+@pragma('dart2js:noInline')
+f_001_011_110_011_1(Set<String> u, int b) => v(u, '0010111100111', b);
+
+@pragma('dart2js:noInline')
+f_001_011_110_100_1(Set<String> u, int b) => v(u, '0010111101001', b);
+
+@pragma('dart2js:noInline')
+f_001_011_110_101_1(Set<String> u, int b) => v(u, '0010111101011', b);
+
+@pragma('dart2js:noInline')
+f_001_011_110_110_1(Set<String> u, int b) => v(u, '0010111101101', b);
+
+@pragma('dart2js:noInline')
+f_001_011_110_111_1(Set<String> u, int b) => v(u, '0010111101111', b);
+
+@pragma('dart2js:noInline')
+f_001_011_111_000_1(Set<String> u, int b) => v(u, '0010111110001', b);
+
+@pragma('dart2js:noInline')
+f_001_011_111_001_1(Set<String> u, int b) => v(u, '0010111110011', b);
+
+@pragma('dart2js:noInline')
+f_001_011_111_010_1(Set<String> u, int b) => v(u, '0010111110101', b);
+
+@pragma('dart2js:noInline')
+f_001_011_111_011_1(Set<String> u, int b) => v(u, '0010111110111', b);
+
+@pragma('dart2js:noInline')
+f_001_011_111_100_1(Set<String> u, int b) => v(u, '0010111111001', b);
+
+@pragma('dart2js:noInline')
+f_001_011_111_101_1(Set<String> u, int b) => v(u, '0010111111011', b);
+
+@pragma('dart2js:noInline')
+f_001_011_111_110_1(Set<String> u, int b) => v(u, '0010111111101', b);
+
+@pragma('dart2js:noInline')
+f_001_011_111_111_1(Set<String> u, int b) => v(u, '0010111111111', b);
+
+@pragma('dart2js:noInline')
+f_001_100_000_000_1(Set<String> u, int b) => v(u, '0011000000001', b);
+
+@pragma('dart2js:noInline')
+f_001_100_000_001_1(Set<String> u, int b) => v(u, '0011000000011', b);
+
+@pragma('dart2js:noInline')
+f_001_100_000_010_1(Set<String> u, int b) => v(u, '0011000000101', b);
+
+@pragma('dart2js:noInline')
+f_001_100_000_011_1(Set<String> u, int b) => v(u, '0011000000111', b);
+
+@pragma('dart2js:noInline')
+f_001_100_000_100_1(Set<String> u, int b) => v(u, '0011000001001', b);
+
+@pragma('dart2js:noInline')
+f_001_100_000_101_1(Set<String> u, int b) => v(u, '0011000001011', b);
+
+@pragma('dart2js:noInline')
+f_001_100_000_110_1(Set<String> u, int b) => v(u, '0011000001101', b);
+
+@pragma('dart2js:noInline')
+f_001_100_000_111_1(Set<String> u, int b) => v(u, '0011000001111', b);
+
+@pragma('dart2js:noInline')
+f_001_100_001_000_1(Set<String> u, int b) => v(u, '0011000010001', b);
+
+@pragma('dart2js:noInline')
+f_001_100_001_001_1(Set<String> u, int b) => v(u, '0011000010011', b);
+
+@pragma('dart2js:noInline')
+f_001_100_001_010_1(Set<String> u, int b) => v(u, '0011000010101', b);
+
+@pragma('dart2js:noInline')
+f_001_100_001_011_1(Set<String> u, int b) => v(u, '0011000010111', b);
+
+@pragma('dart2js:noInline')
+f_001_100_001_100_1(Set<String> u, int b) => v(u, '0011000011001', b);
+
+@pragma('dart2js:noInline')
+f_001_100_001_101_1(Set<String> u, int b) => v(u, '0011000011011', b);
+
+@pragma('dart2js:noInline')
+f_001_100_001_110_1(Set<String> u, int b) => v(u, '0011000011101', b);
+
+@pragma('dart2js:noInline')
+f_001_100_001_111_1(Set<String> u, int b) => v(u, '0011000011111', b);
+
+@pragma('dart2js:noInline')
+f_001_100_010_000_1(Set<String> u, int b) => v(u, '0011000100001', b);
+
+@pragma('dart2js:noInline')
+f_001_100_010_001_1(Set<String> u, int b) => v(u, '0011000100011', b);
+
+@pragma('dart2js:noInline')
+f_001_100_010_010_1(Set<String> u, int b) => v(u, '0011000100101', b);
+
+@pragma('dart2js:noInline')
+f_001_100_010_011_1(Set<String> u, int b) => v(u, '0011000100111', b);
+
+@pragma('dart2js:noInline')
+f_001_100_010_100_1(Set<String> u, int b) => v(u, '0011000101001', b);
+
+@pragma('dart2js:noInline')
+f_001_100_010_101_1(Set<String> u, int b) => v(u, '0011000101011', b);
+
+@pragma('dart2js:noInline')
+f_001_100_010_110_1(Set<String> u, int b) => v(u, '0011000101101', b);
+
+@pragma('dart2js:noInline')
+f_001_100_010_111_1(Set<String> u, int b) => v(u, '0011000101111', b);
+
+@pragma('dart2js:noInline')
+f_001_100_011_000_1(Set<String> u, int b) => v(u, '0011000110001', b);
+
+@pragma('dart2js:noInline')
+f_001_100_011_001_1(Set<String> u, int b) => v(u, '0011000110011', b);
+
+@pragma('dart2js:noInline')
+f_001_100_011_010_1(Set<String> u, int b) => v(u, '0011000110101', b);
+
+@pragma('dart2js:noInline')
+f_001_100_011_011_1(Set<String> u, int b) => v(u, '0011000110111', b);
+
+@pragma('dart2js:noInline')
+f_001_100_011_100_1(Set<String> u, int b) => v(u, '0011000111001', b);
+
+@pragma('dart2js:noInline')
+f_001_100_011_101_1(Set<String> u, int b) => v(u, '0011000111011', b);
+
+@pragma('dart2js:noInline')
+f_001_100_011_110_1(Set<String> u, int b) => v(u, '0011000111101', b);
+
+@pragma('dart2js:noInline')
+f_001_100_011_111_1(Set<String> u, int b) => v(u, '0011000111111', b);
+
+@pragma('dart2js:noInline')
+f_001_100_100_000_1(Set<String> u, int b) => v(u, '0011001000001', b);
+
+@pragma('dart2js:noInline')
+f_001_100_100_001_1(Set<String> u, int b) => v(u, '0011001000011', b);
+
+@pragma('dart2js:noInline')
+f_001_100_100_010_1(Set<String> u, int b) => v(u, '0011001000101', b);
+
+@pragma('dart2js:noInline')
+f_001_100_100_011_1(Set<String> u, int b) => v(u, '0011001000111', b);
+
+@pragma('dart2js:noInline')
+f_001_100_100_100_1(Set<String> u, int b) => v(u, '0011001001001', b);
+
+@pragma('dart2js:noInline')
+f_001_100_100_101_1(Set<String> u, int b) => v(u, '0011001001011', b);
+
+@pragma('dart2js:noInline')
+f_001_100_100_110_1(Set<String> u, int b) => v(u, '0011001001101', b);
+
+@pragma('dart2js:noInline')
+f_001_100_100_111_1(Set<String> u, int b) => v(u, '0011001001111', b);
+
+@pragma('dart2js:noInline')
+f_001_100_101_000_1(Set<String> u, int b) => v(u, '0011001010001', b);
+
+@pragma('dart2js:noInline')
+f_001_100_101_001_1(Set<String> u, int b) => v(u, '0011001010011', b);
+
+@pragma('dart2js:noInline')
+f_001_100_101_010_1(Set<String> u, int b) => v(u, '0011001010101', b);
+
+@pragma('dart2js:noInline')
+f_001_100_101_011_1(Set<String> u, int b) => v(u, '0011001010111', b);
+
+@pragma('dart2js:noInline')
+f_001_100_101_100_1(Set<String> u, int b) => v(u, '0011001011001', b);
+
+@pragma('dart2js:noInline')
+f_001_100_101_101_1(Set<String> u, int b) => v(u, '0011001011011', b);
+
+@pragma('dart2js:noInline')
+f_001_100_101_110_1(Set<String> u, int b) => v(u, '0011001011101', b);
+
+@pragma('dart2js:noInline')
+f_001_100_101_111_1(Set<String> u, int b) => v(u, '0011001011111', b);
+
+@pragma('dart2js:noInline')
+f_001_100_110_000_1(Set<String> u, int b) => v(u, '0011001100001', b);
+
+@pragma('dart2js:noInline')
+f_001_100_110_001_1(Set<String> u, int b) => v(u, '0011001100011', b);
+
+@pragma('dart2js:noInline')
+f_001_100_110_010_1(Set<String> u, int b) => v(u, '0011001100101', b);
+
+@pragma('dart2js:noInline')
+f_001_100_110_011_1(Set<String> u, int b) => v(u, '0011001100111', b);
+
+@pragma('dart2js:noInline')
+f_001_100_110_100_1(Set<String> u, int b) => v(u, '0011001101001', b);
+
+@pragma('dart2js:noInline')
+f_001_100_110_101_1(Set<String> u, int b) => v(u, '0011001101011', b);
+
+@pragma('dart2js:noInline')
+f_001_100_110_110_1(Set<String> u, int b) => v(u, '0011001101101', b);
+
+@pragma('dart2js:noInline')
+f_001_100_110_111_1(Set<String> u, int b) => v(u, '0011001101111', b);
+
+@pragma('dart2js:noInline')
+f_001_100_111_000_1(Set<String> u, int b) => v(u, '0011001110001', b);
+
+@pragma('dart2js:noInline')
+f_001_100_111_001_1(Set<String> u, int b) => v(u, '0011001110011', b);
+
+@pragma('dart2js:noInline')
+f_001_100_111_010_1(Set<String> u, int b) => v(u, '0011001110101', b);
+
+@pragma('dart2js:noInline')
+f_001_100_111_011_1(Set<String> u, int b) => v(u, '0011001110111', b);
+
+@pragma('dart2js:noInline')
+f_001_100_111_100_1(Set<String> u, int b) => v(u, '0011001111001', b);
+
+@pragma('dart2js:noInline')
+f_001_100_111_101_1(Set<String> u, int b) => v(u, '0011001111011', b);
+
+@pragma('dart2js:noInline')
+f_001_100_111_110_1(Set<String> u, int b) => v(u, '0011001111101', b);
+
+@pragma('dart2js:noInline')
+f_001_100_111_111_1(Set<String> u, int b) => v(u, '0011001111111', b);
+
+@pragma('dart2js:noInline')
+f_001_101_000_000_1(Set<String> u, int b) => v(u, '0011010000001', b);
+
+@pragma('dart2js:noInline')
+f_001_101_000_001_1(Set<String> u, int b) => v(u, '0011010000011', b);
+
+@pragma('dart2js:noInline')
+f_001_101_000_010_1(Set<String> u, int b) => v(u, '0011010000101', b);
+
+@pragma('dart2js:noInline')
+f_001_101_000_011_1(Set<String> u, int b) => v(u, '0011010000111', b);
+
+@pragma('dart2js:noInline')
+f_001_101_000_100_1(Set<String> u, int b) => v(u, '0011010001001', b);
+
+@pragma('dart2js:noInline')
+f_001_101_000_101_1(Set<String> u, int b) => v(u, '0011010001011', b);
+
+@pragma('dart2js:noInline')
+f_001_101_000_110_1(Set<String> u, int b) => v(u, '0011010001101', b);
+
+@pragma('dart2js:noInline')
+f_001_101_000_111_1(Set<String> u, int b) => v(u, '0011010001111', b);
+
+@pragma('dart2js:noInline')
+f_001_101_001_000_1(Set<String> u, int b) => v(u, '0011010010001', b);
+
+@pragma('dart2js:noInline')
+f_001_101_001_001_1(Set<String> u, int b) => v(u, '0011010010011', b);
+
+@pragma('dart2js:noInline')
+f_001_101_001_010_1(Set<String> u, int b) => v(u, '0011010010101', b);
+
+@pragma('dart2js:noInline')
+f_001_101_001_011_1(Set<String> u, int b) => v(u, '0011010010111', b);
+
+@pragma('dart2js:noInline')
+f_001_101_001_100_1(Set<String> u, int b) => v(u, '0011010011001', b);
+
+@pragma('dart2js:noInline')
+f_001_101_001_101_1(Set<String> u, int b) => v(u, '0011010011011', b);
+
+@pragma('dart2js:noInline')
+f_001_101_001_110_1(Set<String> u, int b) => v(u, '0011010011101', b);
+
+@pragma('dart2js:noInline')
+f_001_101_001_111_1(Set<String> u, int b) => v(u, '0011010011111', b);
+
+@pragma('dart2js:noInline')
+f_001_101_010_000_1(Set<String> u, int b) => v(u, '0011010100001', b);
+
+@pragma('dart2js:noInline')
+f_001_101_010_001_1(Set<String> u, int b) => v(u, '0011010100011', b);
+
+@pragma('dart2js:noInline')
+f_001_101_010_010_1(Set<String> u, int b) => v(u, '0011010100101', b);
+
+@pragma('dart2js:noInline')
+f_001_101_010_011_1(Set<String> u, int b) => v(u, '0011010100111', b);
+
+@pragma('dart2js:noInline')
+f_001_101_010_100_1(Set<String> u, int b) => v(u, '0011010101001', b);
+
+@pragma('dart2js:noInline')
+f_001_101_010_101_1(Set<String> u, int b) => v(u, '0011010101011', b);
+
+@pragma('dart2js:noInline')
+f_001_101_010_110_1(Set<String> u, int b) => v(u, '0011010101101', b);
+
+@pragma('dart2js:noInline')
+f_001_101_010_111_1(Set<String> u, int b) => v(u, '0011010101111', b);
+
+@pragma('dart2js:noInline')
+f_001_101_011_000_1(Set<String> u, int b) => v(u, '0011010110001', b);
+
+@pragma('dart2js:noInline')
+f_001_101_011_001_1(Set<String> u, int b) => v(u, '0011010110011', b);
+
+@pragma('dart2js:noInline')
+f_001_101_011_010_1(Set<String> u, int b) => v(u, '0011010110101', b);
+
+@pragma('dart2js:noInline')
+f_001_101_011_011_1(Set<String> u, int b) => v(u, '0011010110111', b);
+
+@pragma('dart2js:noInline')
+f_001_101_011_100_1(Set<String> u, int b) => v(u, '0011010111001', b);
+
+@pragma('dart2js:noInline')
+f_001_101_011_101_1(Set<String> u, int b) => v(u, '0011010111011', b);
+
+@pragma('dart2js:noInline')
+f_001_101_011_110_1(Set<String> u, int b) => v(u, '0011010111101', b);
+
+@pragma('dart2js:noInline')
+f_001_101_011_111_1(Set<String> u, int b) => v(u, '0011010111111', b);
+
+@pragma('dart2js:noInline')
+f_001_101_100_000_1(Set<String> u, int b) => v(u, '0011011000001', b);
+
+@pragma('dart2js:noInline')
+f_001_101_100_001_1(Set<String> u, int b) => v(u, '0011011000011', b);
+
+@pragma('dart2js:noInline')
+f_001_101_100_010_1(Set<String> u, int b) => v(u, '0011011000101', b);
+
+@pragma('dart2js:noInline')
+f_001_101_100_011_1(Set<String> u, int b) => v(u, '0011011000111', b);
+
+@pragma('dart2js:noInline')
+f_001_101_100_100_1(Set<String> u, int b) => v(u, '0011011001001', b);
+
+@pragma('dart2js:noInline')
+f_001_101_100_101_1(Set<String> u, int b) => v(u, '0011011001011', b);
+
+@pragma('dart2js:noInline')
+f_001_101_100_110_1(Set<String> u, int b) => v(u, '0011011001101', b);
+
+@pragma('dart2js:noInline')
+f_001_101_100_111_1(Set<String> u, int b) => v(u, '0011011001111', b);
+
+@pragma('dart2js:noInline')
+f_001_101_101_000_1(Set<String> u, int b) => v(u, '0011011010001', b);
+
+@pragma('dart2js:noInline')
+f_001_101_101_001_1(Set<String> u, int b) => v(u, '0011011010011', b);
+
+@pragma('dart2js:noInline')
+f_001_101_101_010_1(Set<String> u, int b) => v(u, '0011011010101', b);
+
+@pragma('dart2js:noInline')
+f_001_101_101_011_1(Set<String> u, int b) => v(u, '0011011010111', b);
+
+@pragma('dart2js:noInline')
+f_001_101_101_100_1(Set<String> u, int b) => v(u, '0011011011001', b);
+
+@pragma('dart2js:noInline')
+f_001_101_101_101_1(Set<String> u, int b) => v(u, '0011011011011', b);
+
+@pragma('dart2js:noInline')
+f_001_101_101_110_1(Set<String> u, int b) => v(u, '0011011011101', b);
+
+@pragma('dart2js:noInline')
+f_001_101_101_111_1(Set<String> u, int b) => v(u, '0011011011111', b);
+
+@pragma('dart2js:noInline')
+f_001_101_110_000_1(Set<String> u, int b) => v(u, '0011011100001', b);
+
+@pragma('dart2js:noInline')
+f_001_101_110_001_1(Set<String> u, int b) => v(u, '0011011100011', b);
+
+@pragma('dart2js:noInline')
+f_001_101_110_010_1(Set<String> u, int b) => v(u, '0011011100101', b);
+
+@pragma('dart2js:noInline')
+f_001_101_110_011_1(Set<String> u, int b) => v(u, '0011011100111', b);
+
+@pragma('dart2js:noInline')
+f_001_101_110_100_1(Set<String> u, int b) => v(u, '0011011101001', b);
+
+@pragma('dart2js:noInline')
+f_001_101_110_101_1(Set<String> u, int b) => v(u, '0011011101011', b);
+
+@pragma('dart2js:noInline')
+f_001_101_110_110_1(Set<String> u, int b) => v(u, '0011011101101', b);
+
+@pragma('dart2js:noInline')
+f_001_101_110_111_1(Set<String> u, int b) => v(u, '0011011101111', b);
+
+@pragma('dart2js:noInline')
+f_001_101_111_000_1(Set<String> u, int b) => v(u, '0011011110001', b);
+
+@pragma('dart2js:noInline')
+f_001_101_111_001_1(Set<String> u, int b) => v(u, '0011011110011', b);
+
+@pragma('dart2js:noInline')
+f_001_101_111_010_1(Set<String> u, int b) => v(u, '0011011110101', b);
+
+@pragma('dart2js:noInline')
+f_001_101_111_011_1(Set<String> u, int b) => v(u, '0011011110111', b);
+
+@pragma('dart2js:noInline')
+f_001_101_111_100_1(Set<String> u, int b) => v(u, '0011011111001', b);
+
+@pragma('dart2js:noInline')
+f_001_101_111_101_1(Set<String> u, int b) => v(u, '0011011111011', b);
+
+@pragma('dart2js:noInline')
+f_001_101_111_110_1(Set<String> u, int b) => v(u, '0011011111101', b);
+
+@pragma('dart2js:noInline')
+f_001_101_111_111_1(Set<String> u, int b) => v(u, '0011011111111', b);
+
+@pragma('dart2js:noInline')
+f_001_110_000_000_1(Set<String> u, int b) => v(u, '0011100000001', b);
+
+@pragma('dart2js:noInline')
+f_001_110_000_001_1(Set<String> u, int b) => v(u, '0011100000011', b);
+
+@pragma('dart2js:noInline')
+f_001_110_000_010_1(Set<String> u, int b) => v(u, '0011100000101', b);
+
+@pragma('dart2js:noInline')
+f_001_110_000_011_1(Set<String> u, int b) => v(u, '0011100000111', b);
+
+@pragma('dart2js:noInline')
+f_001_110_000_100_1(Set<String> u, int b) => v(u, '0011100001001', b);
+
+@pragma('dart2js:noInline')
+f_001_110_000_101_1(Set<String> u, int b) => v(u, '0011100001011', b);
+
+@pragma('dart2js:noInline')
+f_001_110_000_110_1(Set<String> u, int b) => v(u, '0011100001101', b);
+
+@pragma('dart2js:noInline')
+f_001_110_000_111_1(Set<String> u, int b) => v(u, '0011100001111', b);
+
+@pragma('dart2js:noInline')
+f_001_110_001_000_1(Set<String> u, int b) => v(u, '0011100010001', b);
+
+@pragma('dart2js:noInline')
+f_001_110_001_001_1(Set<String> u, int b) => v(u, '0011100010011', b);
+
+@pragma('dart2js:noInline')
+f_001_110_001_010_1(Set<String> u, int b) => v(u, '0011100010101', b);
+
+@pragma('dart2js:noInline')
+f_001_110_001_011_1(Set<String> u, int b) => v(u, '0011100010111', b);
+
+@pragma('dart2js:noInline')
+f_001_110_001_100_1(Set<String> u, int b) => v(u, '0011100011001', b);
+
+@pragma('dart2js:noInline')
+f_001_110_001_101_1(Set<String> u, int b) => v(u, '0011100011011', b);
+
+@pragma('dart2js:noInline')
+f_001_110_001_110_1(Set<String> u, int b) => v(u, '0011100011101', b);
+
+@pragma('dart2js:noInline')
+f_001_110_001_111_1(Set<String> u, int b) => v(u, '0011100011111', b);
+
+@pragma('dart2js:noInline')
+f_001_110_010_000_1(Set<String> u, int b) => v(u, '0011100100001', b);
+
+@pragma('dart2js:noInline')
+f_001_110_010_001_1(Set<String> u, int b) => v(u, '0011100100011', b);
+
+@pragma('dart2js:noInline')
+f_001_110_010_010_1(Set<String> u, int b) => v(u, '0011100100101', b);
+
+@pragma('dart2js:noInline')
+f_001_110_010_011_1(Set<String> u, int b) => v(u, '0011100100111', b);
+
+@pragma('dart2js:noInline')
+f_001_110_010_100_1(Set<String> u, int b) => v(u, '0011100101001', b);
+
+@pragma('dart2js:noInline')
+f_001_110_010_101_1(Set<String> u, int b) => v(u, '0011100101011', b);
+
+@pragma('dart2js:noInline')
+f_001_110_010_110_1(Set<String> u, int b) => v(u, '0011100101101', b);
+
+@pragma('dart2js:noInline')
+f_001_110_010_111_1(Set<String> u, int b) => v(u, '0011100101111', b);
+
+@pragma('dart2js:noInline')
+f_001_110_011_000_1(Set<String> u, int b) => v(u, '0011100110001', b);
+
+@pragma('dart2js:noInline')
+f_001_110_011_001_1(Set<String> u, int b) => v(u, '0011100110011', b);
+
+@pragma('dart2js:noInline')
+f_001_110_011_010_1(Set<String> u, int b) => v(u, '0011100110101', b);
+
+@pragma('dart2js:noInline')
+f_001_110_011_011_1(Set<String> u, int b) => v(u, '0011100110111', b);
+
+@pragma('dart2js:noInline')
+f_001_110_011_100_1(Set<String> u, int b) => v(u, '0011100111001', b);
+
+@pragma('dart2js:noInline')
+f_001_110_011_101_1(Set<String> u, int b) => v(u, '0011100111011', b);
+
+@pragma('dart2js:noInline')
+f_001_110_011_110_1(Set<String> u, int b) => v(u, '0011100111101', b);
+
+@pragma('dart2js:noInline')
+f_001_110_011_111_1(Set<String> u, int b) => v(u, '0011100111111', b);
+
+@pragma('dart2js:noInline')
+f_001_110_100_000_1(Set<String> u, int b) => v(u, '0011101000001', b);
+
+@pragma('dart2js:noInline')
+f_001_110_100_001_1(Set<String> u, int b) => v(u, '0011101000011', b);
+
+@pragma('dart2js:noInline')
+f_001_110_100_010_1(Set<String> u, int b) => v(u, '0011101000101', b);
+
+@pragma('dart2js:noInline')
+f_001_110_100_011_1(Set<String> u, int b) => v(u, '0011101000111', b);
+
+@pragma('dart2js:noInline')
+f_001_110_100_100_1(Set<String> u, int b) => v(u, '0011101001001', b);
+
+@pragma('dart2js:noInline')
+f_001_110_100_101_1(Set<String> u, int b) => v(u, '0011101001011', b);
+
+@pragma('dart2js:noInline')
+f_001_110_100_110_1(Set<String> u, int b) => v(u, '0011101001101', b);
+
+@pragma('dart2js:noInline')
+f_001_110_100_111_1(Set<String> u, int b) => v(u, '0011101001111', b);
+
+@pragma('dart2js:noInline')
+f_001_110_101_000_1(Set<String> u, int b) => v(u, '0011101010001', b);
+
+@pragma('dart2js:noInline')
+f_001_110_101_001_1(Set<String> u, int b) => v(u, '0011101010011', b);
+
+@pragma('dart2js:noInline')
+f_001_110_101_010_1(Set<String> u, int b) => v(u, '0011101010101', b);
+
+@pragma('dart2js:noInline')
+f_001_110_101_011_1(Set<String> u, int b) => v(u, '0011101010111', b);
+
+@pragma('dart2js:noInline')
+f_001_110_101_100_1(Set<String> u, int b) => v(u, '0011101011001', b);
+
+@pragma('dart2js:noInline')
+f_001_110_101_101_1(Set<String> u, int b) => v(u, '0011101011011', b);
+
+@pragma('dart2js:noInline')
+f_001_110_101_110_1(Set<String> u, int b) => v(u, '0011101011101', b);
+
+@pragma('dart2js:noInline')
+f_001_110_101_111_1(Set<String> u, int b) => v(u, '0011101011111', b);
+
+@pragma('dart2js:noInline')
+f_001_110_110_000_1(Set<String> u, int b) => v(u, '0011101100001', b);
+
+@pragma('dart2js:noInline')
+f_001_110_110_001_1(Set<String> u, int b) => v(u, '0011101100011', b);
+
+@pragma('dart2js:noInline')
+f_001_110_110_010_1(Set<String> u, int b) => v(u, '0011101100101', b);
+
+@pragma('dart2js:noInline')
+f_001_110_110_011_1(Set<String> u, int b) => v(u, '0011101100111', b);
+
+@pragma('dart2js:noInline')
+f_001_110_110_100_1(Set<String> u, int b) => v(u, '0011101101001', b);
+
+@pragma('dart2js:noInline')
+f_001_110_110_101_1(Set<String> u, int b) => v(u, '0011101101011', b);
+
+@pragma('dart2js:noInline')
+f_001_110_110_110_1(Set<String> u, int b) => v(u, '0011101101101', b);
+
+@pragma('dart2js:noInline')
+f_001_110_110_111_1(Set<String> u, int b) => v(u, '0011101101111', b);
+
+@pragma('dart2js:noInline')
+f_001_110_111_000_1(Set<String> u, int b) => v(u, '0011101110001', b);
+
+@pragma('dart2js:noInline')
+f_001_110_111_001_1(Set<String> u, int b) => v(u, '0011101110011', b);
+
+@pragma('dart2js:noInline')
+f_001_110_111_010_1(Set<String> u, int b) => v(u, '0011101110101', b);
+
+@pragma('dart2js:noInline')
+f_001_110_111_011_1(Set<String> u, int b) => v(u, '0011101110111', b);
+
+@pragma('dart2js:noInline')
+f_001_110_111_100_1(Set<String> u, int b) => v(u, '0011101111001', b);
+
+@pragma('dart2js:noInline')
+f_001_110_111_101_1(Set<String> u, int b) => v(u, '0011101111011', b);
+
+@pragma('dart2js:noInline')
+f_001_110_111_110_1(Set<String> u, int b) => v(u, '0011101111101', b);
+
+@pragma('dart2js:noInline')
+f_001_110_111_111_1(Set<String> u, int b) => v(u, '0011101111111', b);
+
+@pragma('dart2js:noInline')
+f_001_111_000_000_1(Set<String> u, int b) => v(u, '0011110000001', b);
+
+@pragma('dart2js:noInline')
+f_001_111_000_001_1(Set<String> u, int b) => v(u, '0011110000011', b);
+
+@pragma('dart2js:noInline')
+f_001_111_000_010_1(Set<String> u, int b) => v(u, '0011110000101', b);
+
+@pragma('dart2js:noInline')
+f_001_111_000_011_1(Set<String> u, int b) => v(u, '0011110000111', b);
+
+@pragma('dart2js:noInline')
+f_001_111_000_100_1(Set<String> u, int b) => v(u, '0011110001001', b);
+
+@pragma('dart2js:noInline')
+f_001_111_000_101_1(Set<String> u, int b) => v(u, '0011110001011', b);
+
+@pragma('dart2js:noInline')
+f_001_111_000_110_1(Set<String> u, int b) => v(u, '0011110001101', b);
+
+@pragma('dart2js:noInline')
+f_001_111_000_111_1(Set<String> u, int b) => v(u, '0011110001111', b);
+
+@pragma('dart2js:noInline')
+f_001_111_001_000_1(Set<String> u, int b) => v(u, '0011110010001', b);
+
+@pragma('dart2js:noInline')
+f_001_111_001_001_1(Set<String> u, int b) => v(u, '0011110010011', b);
+
+@pragma('dart2js:noInline')
+f_001_111_001_010_1(Set<String> u, int b) => v(u, '0011110010101', b);
+
+@pragma('dart2js:noInline')
+f_001_111_001_011_1(Set<String> u, int b) => v(u, '0011110010111', b);
+
+@pragma('dart2js:noInline')
+f_001_111_001_100_1(Set<String> u, int b) => v(u, '0011110011001', b);
+
+@pragma('dart2js:noInline')
+f_001_111_001_101_1(Set<String> u, int b) => v(u, '0011110011011', b);
+
+@pragma('dart2js:noInline')
+f_001_111_001_110_1(Set<String> u, int b) => v(u, '0011110011101', b);
+
+@pragma('dart2js:noInline')
+f_001_111_001_111_1(Set<String> u, int b) => v(u, '0011110011111', b);
+
+@pragma('dart2js:noInline')
+f_001_111_010_000_1(Set<String> u, int b) => v(u, '0011110100001', b);
+
+@pragma('dart2js:noInline')
+f_001_111_010_001_1(Set<String> u, int b) => v(u, '0011110100011', b);
+
+@pragma('dart2js:noInline')
+f_001_111_010_010_1(Set<String> u, int b) => v(u, '0011110100101', b);
+
+@pragma('dart2js:noInline')
+f_001_111_010_011_1(Set<String> u, int b) => v(u, '0011110100111', b);
+
+@pragma('dart2js:noInline')
+f_001_111_010_100_1(Set<String> u, int b) => v(u, '0011110101001', b);
+
+@pragma('dart2js:noInline')
+f_001_111_010_101_1(Set<String> u, int b) => v(u, '0011110101011', b);
+
+@pragma('dart2js:noInline')
+f_001_111_010_110_1(Set<String> u, int b) => v(u, '0011110101101', b);
+
+@pragma('dart2js:noInline')
+f_001_111_010_111_1(Set<String> u, int b) => v(u, '0011110101111', b);
+
+@pragma('dart2js:noInline')
+f_001_111_011_000_1(Set<String> u, int b) => v(u, '0011110110001', b);
+
+@pragma('dart2js:noInline')
+f_001_111_011_001_1(Set<String> u, int b) => v(u, '0011110110011', b);
+
+@pragma('dart2js:noInline')
+f_001_111_011_010_1(Set<String> u, int b) => v(u, '0011110110101', b);
+
+@pragma('dart2js:noInline')
+f_001_111_011_011_1(Set<String> u, int b) => v(u, '0011110110111', b);
+
+@pragma('dart2js:noInline')
+f_001_111_011_100_1(Set<String> u, int b) => v(u, '0011110111001', b);
+
+@pragma('dart2js:noInline')
+f_001_111_011_101_1(Set<String> u, int b) => v(u, '0011110111011', b);
+
+@pragma('dart2js:noInline')
+f_001_111_011_110_1(Set<String> u, int b) => v(u, '0011110111101', b);
+
+@pragma('dart2js:noInline')
+f_001_111_011_111_1(Set<String> u, int b) => v(u, '0011110111111', b);
+
+@pragma('dart2js:noInline')
+f_001_111_100_000_1(Set<String> u, int b) => v(u, '0011111000001', b);
+
+@pragma('dart2js:noInline')
+f_001_111_100_001_1(Set<String> u, int b) => v(u, '0011111000011', b);
+
+@pragma('dart2js:noInline')
+f_001_111_100_010_1(Set<String> u, int b) => v(u, '0011111000101', b);
+
+@pragma('dart2js:noInline')
+f_001_111_100_011_1(Set<String> u, int b) => v(u, '0011111000111', b);
+
+@pragma('dart2js:noInline')
+f_001_111_100_100_1(Set<String> u, int b) => v(u, '0011111001001', b);
+
+@pragma('dart2js:noInline')
+f_001_111_100_101_1(Set<String> u, int b) => v(u, '0011111001011', b);
+
+@pragma('dart2js:noInline')
+f_001_111_100_110_1(Set<String> u, int b) => v(u, '0011111001101', b);
+
+@pragma('dart2js:noInline')
+f_001_111_100_111_1(Set<String> u, int b) => v(u, '0011111001111', b);
+
+@pragma('dart2js:noInline')
+f_001_111_101_000_1(Set<String> u, int b) => v(u, '0011111010001', b);
+
+@pragma('dart2js:noInline')
+f_001_111_101_001_1(Set<String> u, int b) => v(u, '0011111010011', b);
+
+@pragma('dart2js:noInline')
+f_001_111_101_010_1(Set<String> u, int b) => v(u, '0011111010101', b);
+
+@pragma('dart2js:noInline')
+f_001_111_101_011_1(Set<String> u, int b) => v(u, '0011111010111', b);
+
+@pragma('dart2js:noInline')
+f_001_111_101_100_1(Set<String> u, int b) => v(u, '0011111011001', b);
+
+@pragma('dart2js:noInline')
+f_001_111_101_101_1(Set<String> u, int b) => v(u, '0011111011011', b);
+
+@pragma('dart2js:noInline')
+f_001_111_101_110_1(Set<String> u, int b) => v(u, '0011111011101', b);
+
+@pragma('dart2js:noInline')
+f_001_111_101_111_1(Set<String> u, int b) => v(u, '0011111011111', b);
+
+@pragma('dart2js:noInline')
+f_001_111_110_000_1(Set<String> u, int b) => v(u, '0011111100001', b);
+
+@pragma('dart2js:noInline')
+f_001_111_110_001_1(Set<String> u, int b) => v(u, '0011111100011', b);
+
+@pragma('dart2js:noInline')
+f_001_111_110_010_1(Set<String> u, int b) => v(u, '0011111100101', b);
+
+@pragma('dart2js:noInline')
+f_001_111_110_011_1(Set<String> u, int b) => v(u, '0011111100111', b);
+
+@pragma('dart2js:noInline')
+f_001_111_110_100_1(Set<String> u, int b) => v(u, '0011111101001', b);
+
+@pragma('dart2js:noInline')
+f_001_111_110_101_1(Set<String> u, int b) => v(u, '0011111101011', b);
+
+@pragma('dart2js:noInline')
+f_001_111_110_110_1(Set<String> u, int b) => v(u, '0011111101101', b);
+
+@pragma('dart2js:noInline')
+f_001_111_110_111_1(Set<String> u, int b) => v(u, '0011111101111', b);
+
+@pragma('dart2js:noInline')
+f_001_111_111_000_1(Set<String> u, int b) => v(u, '0011111110001', b);
+
+@pragma('dart2js:noInline')
+f_001_111_111_001_1(Set<String> u, int b) => v(u, '0011111110011', b);
+
+@pragma('dart2js:noInline')
+f_001_111_111_010_1(Set<String> u, int b) => v(u, '0011111110101', b);
+
+@pragma('dart2js:noInline')
+f_001_111_111_011_1(Set<String> u, int b) => v(u, '0011111110111', b);
+
+@pragma('dart2js:noInline')
+f_001_111_111_100_1(Set<String> u, int b) => v(u, '0011111111001', b);
+
+@pragma('dart2js:noInline')
+f_001_111_111_101_1(Set<String> u, int b) => v(u, '0011111111011', b);
+
+@pragma('dart2js:noInline')
+f_001_111_111_110_1(Set<String> u, int b) => v(u, '0011111111101', b);
+
+@pragma('dart2js:noInline')
+f_001_111_111_111_1(Set<String> u, int b) => v(u, '0011111111111', b);
+
+@pragma('dart2js:noInline')
+f_010_000_000_000_1(Set<String> u, int b) => v(u, '0100000000001', b);
+
+@pragma('dart2js:noInline')
+f_010_000_000_001_1(Set<String> u, int b) => v(u, '0100000000011', b);
+
+@pragma('dart2js:noInline')
+f_010_000_000_010_1(Set<String> u, int b) => v(u, '0100000000101', b);
+
+@pragma('dart2js:noInline')
+f_010_000_000_011_1(Set<String> u, int b) => v(u, '0100000000111', b);
+
+@pragma('dart2js:noInline')
+f_010_000_000_100_1(Set<String> u, int b) => v(u, '0100000001001', b);
+
+@pragma('dart2js:noInline')
+f_010_000_000_101_1(Set<String> u, int b) => v(u, '0100000001011', b);
+
+@pragma('dart2js:noInline')
+f_010_000_000_110_1(Set<String> u, int b) => v(u, '0100000001101', b);
+
+@pragma('dart2js:noInline')
+f_010_000_000_111_1(Set<String> u, int b) => v(u, '0100000001111', b);
+
+@pragma('dart2js:noInline')
+f_010_000_001_000_1(Set<String> u, int b) => v(u, '0100000010001', b);
+
+@pragma('dart2js:noInline')
+f_010_000_001_001_1(Set<String> u, int b) => v(u, '0100000010011', b);
+
+@pragma('dart2js:noInline')
+f_010_000_001_010_1(Set<String> u, int b) => v(u, '0100000010101', b);
+
+@pragma('dart2js:noInline')
+f_010_000_001_011_1(Set<String> u, int b) => v(u, '0100000010111', b);
+
+@pragma('dart2js:noInline')
+f_010_000_001_100_1(Set<String> u, int b) => v(u, '0100000011001', b);
+
+@pragma('dart2js:noInline')
+f_010_000_001_101_1(Set<String> u, int b) => v(u, '0100000011011', b);
+
+@pragma('dart2js:noInline')
+f_010_000_001_110_1(Set<String> u, int b) => v(u, '0100000011101', b);
+
+@pragma('dart2js:noInline')
+f_010_000_001_111_1(Set<String> u, int b) => v(u, '0100000011111', b);
+
+@pragma('dart2js:noInline')
+f_010_000_010_000_1(Set<String> u, int b) => v(u, '0100000100001', b);
+
+@pragma('dart2js:noInline')
+f_010_000_010_001_1(Set<String> u, int b) => v(u, '0100000100011', b);
+
+@pragma('dart2js:noInline')
+f_010_000_010_010_1(Set<String> u, int b) => v(u, '0100000100101', b);
+
+@pragma('dart2js:noInline')
+f_010_000_010_011_1(Set<String> u, int b) => v(u, '0100000100111', b);
+
+@pragma('dart2js:noInline')
+f_010_000_010_100_1(Set<String> u, int b) => v(u, '0100000101001', b);
+
+@pragma('dart2js:noInline')
+f_010_000_010_101_1(Set<String> u, int b) => v(u, '0100000101011', b);
+
+@pragma('dart2js:noInline')
+f_010_000_010_110_1(Set<String> u, int b) => v(u, '0100000101101', b);
+
+@pragma('dart2js:noInline')
+f_010_000_010_111_1(Set<String> u, int b) => v(u, '0100000101111', b);
+
+@pragma('dart2js:noInline')
+f_010_000_011_000_1(Set<String> u, int b) => v(u, '0100000110001', b);
+
+@pragma('dart2js:noInline')
+f_010_000_011_001_1(Set<String> u, int b) => v(u, '0100000110011', b);
+
+@pragma('dart2js:noInline')
+f_010_000_011_010_1(Set<String> u, int b) => v(u, '0100000110101', b);
+
+@pragma('dart2js:noInline')
+f_010_000_011_011_1(Set<String> u, int b) => v(u, '0100000110111', b);
+
+@pragma('dart2js:noInline')
+f_010_000_011_100_1(Set<String> u, int b) => v(u, '0100000111001', b);
+
+@pragma('dart2js:noInline')
+f_010_000_011_101_1(Set<String> u, int b) => v(u, '0100000111011', b);
+
+@pragma('dart2js:noInline')
+f_010_000_011_110_1(Set<String> u, int b) => v(u, '0100000111101', b);
+
+@pragma('dart2js:noInline')
+f_010_000_011_111_1(Set<String> u, int b) => v(u, '0100000111111', b);
+
+@pragma('dart2js:noInline')
+f_010_000_100_000_1(Set<String> u, int b) => v(u, '0100001000001', b);
+
+@pragma('dart2js:noInline')
+f_010_000_100_001_1(Set<String> u, int b) => v(u, '0100001000011', b);
+
+@pragma('dart2js:noInline')
+f_010_000_100_010_1(Set<String> u, int b) => v(u, '0100001000101', b);
+
+@pragma('dart2js:noInline')
+f_010_000_100_011_1(Set<String> u, int b) => v(u, '0100001000111', b);
+
+@pragma('dart2js:noInline')
+f_010_000_100_100_1(Set<String> u, int b) => v(u, '0100001001001', b);
+
+@pragma('dart2js:noInline')
+f_010_000_100_101_1(Set<String> u, int b) => v(u, '0100001001011', b);
+
+@pragma('dart2js:noInline')
+f_010_000_100_110_1(Set<String> u, int b) => v(u, '0100001001101', b);
+
+@pragma('dart2js:noInline')
+f_010_000_100_111_1(Set<String> u, int b) => v(u, '0100001001111', b);
+
+@pragma('dart2js:noInline')
+f_010_000_101_000_1(Set<String> u, int b) => v(u, '0100001010001', b);
+
+@pragma('dart2js:noInline')
+f_010_000_101_001_1(Set<String> u, int b) => v(u, '0100001010011', b);
+
+@pragma('dart2js:noInline')
+f_010_000_101_010_1(Set<String> u, int b) => v(u, '0100001010101', b);
+
+@pragma('dart2js:noInline')
+f_010_000_101_011_1(Set<String> u, int b) => v(u, '0100001010111', b);
+
+@pragma('dart2js:noInline')
+f_010_000_101_100_1(Set<String> u, int b) => v(u, '0100001011001', b);
+
+@pragma('dart2js:noInline')
+f_010_000_101_101_1(Set<String> u, int b) => v(u, '0100001011011', b);
+
+@pragma('dart2js:noInline')
+f_010_000_101_110_1(Set<String> u, int b) => v(u, '0100001011101', b);
+
+@pragma('dart2js:noInline')
+f_010_000_101_111_1(Set<String> u, int b) => v(u, '0100001011111', b);
+
+@pragma('dart2js:noInline')
+f_010_000_110_000_1(Set<String> u, int b) => v(u, '0100001100001', b);
+
+@pragma('dart2js:noInline')
+f_010_000_110_001_1(Set<String> u, int b) => v(u, '0100001100011', b);
+
+@pragma('dart2js:noInline')
+f_010_000_110_010_1(Set<String> u, int b) => v(u, '0100001100101', b);
+
+@pragma('dart2js:noInline')
+f_010_000_110_011_1(Set<String> u, int b) => v(u, '0100001100111', b);
+
+@pragma('dart2js:noInline')
+f_010_000_110_100_1(Set<String> u, int b) => v(u, '0100001101001', b);
+
+@pragma('dart2js:noInline')
+f_010_000_110_101_1(Set<String> u, int b) => v(u, '0100001101011', b);
+
+@pragma('dart2js:noInline')
+f_010_000_110_110_1(Set<String> u, int b) => v(u, '0100001101101', b);
+
+@pragma('dart2js:noInline')
+f_010_000_110_111_1(Set<String> u, int b) => v(u, '0100001101111', b);
+
+@pragma('dart2js:noInline')
+f_010_000_111_000_1(Set<String> u, int b) => v(u, '0100001110001', b);
+
+@pragma('dart2js:noInline')
+f_010_000_111_001_1(Set<String> u, int b) => v(u, '0100001110011', b);
+
+@pragma('dart2js:noInline')
+f_010_000_111_010_1(Set<String> u, int b) => v(u, '0100001110101', b);
+
+@pragma('dart2js:noInline')
+f_010_000_111_011_1(Set<String> u, int b) => v(u, '0100001110111', b);
+
+@pragma('dart2js:noInline')
+f_010_000_111_100_1(Set<String> u, int b) => v(u, '0100001111001', b);
+
+@pragma('dart2js:noInline')
+f_010_000_111_101_1(Set<String> u, int b) => v(u, '0100001111011', b);
+
+@pragma('dart2js:noInline')
+f_010_000_111_110_1(Set<String> u, int b) => v(u, '0100001111101', b);
+
+@pragma('dart2js:noInline')
+f_010_000_111_111_1(Set<String> u, int b) => v(u, '0100001111111', b);
+
+@pragma('dart2js:noInline')
+f_010_001_000_000_1(Set<String> u, int b) => v(u, '0100010000001', b);
+
+@pragma('dart2js:noInline')
+f_010_001_000_001_1(Set<String> u, int b) => v(u, '0100010000011', b);
+
+@pragma('dart2js:noInline')
+f_010_001_000_010_1(Set<String> u, int b) => v(u, '0100010000101', b);
+
+@pragma('dart2js:noInline')
+f_010_001_000_011_1(Set<String> u, int b) => v(u, '0100010000111', b);
+
+@pragma('dart2js:noInline')
+f_010_001_000_100_1(Set<String> u, int b) => v(u, '0100010001001', b);
+
+@pragma('dart2js:noInline')
+f_010_001_000_101_1(Set<String> u, int b) => v(u, '0100010001011', b);
+
+@pragma('dart2js:noInline')
+f_010_001_000_110_1(Set<String> u, int b) => v(u, '0100010001101', b);
+
+@pragma('dart2js:noInline')
+f_010_001_000_111_1(Set<String> u, int b) => v(u, '0100010001111', b);
+
+@pragma('dart2js:noInline')
+f_010_001_001_000_1(Set<String> u, int b) => v(u, '0100010010001', b);
+
+@pragma('dart2js:noInline')
+f_010_001_001_001_1(Set<String> u, int b) => v(u, '0100010010011', b);
+
+@pragma('dart2js:noInline')
+f_010_001_001_010_1(Set<String> u, int b) => v(u, '0100010010101', b);
+
+@pragma('dart2js:noInline')
+f_010_001_001_011_1(Set<String> u, int b) => v(u, '0100010010111', b);
+
+@pragma('dart2js:noInline')
+f_010_001_001_100_1(Set<String> u, int b) => v(u, '0100010011001', b);
+
+@pragma('dart2js:noInline')
+f_010_001_001_101_1(Set<String> u, int b) => v(u, '0100010011011', b);
+
+@pragma('dart2js:noInline')
+f_010_001_001_110_1(Set<String> u, int b) => v(u, '0100010011101', b);
+
+@pragma('dart2js:noInline')
+f_010_001_001_111_1(Set<String> u, int b) => v(u, '0100010011111', b);
+
+@pragma('dart2js:noInline')
+f_010_001_010_000_1(Set<String> u, int b) => v(u, '0100010100001', b);
+
+@pragma('dart2js:noInline')
+f_010_001_010_001_1(Set<String> u, int b) => v(u, '0100010100011', b);
+
+@pragma('dart2js:noInline')
+f_010_001_010_010_1(Set<String> u, int b) => v(u, '0100010100101', b);
+
+@pragma('dart2js:noInline')
+f_010_001_010_011_1(Set<String> u, int b) => v(u, '0100010100111', b);
+
+@pragma('dart2js:noInline')
+f_010_001_010_100_1(Set<String> u, int b) => v(u, '0100010101001', b);
+
+@pragma('dart2js:noInline')
+f_010_001_010_101_1(Set<String> u, int b) => v(u, '0100010101011', b);
+
+@pragma('dart2js:noInline')
+f_010_001_010_110_1(Set<String> u, int b) => v(u, '0100010101101', b);
+
+@pragma('dart2js:noInline')
+f_010_001_010_111_1(Set<String> u, int b) => v(u, '0100010101111', b);
+
+@pragma('dart2js:noInline')
+f_010_001_011_000_1(Set<String> u, int b) => v(u, '0100010110001', b);
+
+@pragma('dart2js:noInline')
+f_010_001_011_001_1(Set<String> u, int b) => v(u, '0100010110011', b);
+
+@pragma('dart2js:noInline')
+f_010_001_011_010_1(Set<String> u, int b) => v(u, '0100010110101', b);
+
+@pragma('dart2js:noInline')
+f_010_001_011_011_1(Set<String> u, int b) => v(u, '0100010110111', b);
+
+@pragma('dart2js:noInline')
+f_010_001_011_100_1(Set<String> u, int b) => v(u, '0100010111001', b);
+
+@pragma('dart2js:noInline')
+f_010_001_011_101_1(Set<String> u, int b) => v(u, '0100010111011', b);
+
+@pragma('dart2js:noInline')
+f_010_001_011_110_1(Set<String> u, int b) => v(u, '0100010111101', b);
+
+@pragma('dart2js:noInline')
+f_010_001_011_111_1(Set<String> u, int b) => v(u, '0100010111111', b);
+
+@pragma('dart2js:noInline')
+f_010_001_100_000_1(Set<String> u, int b) => v(u, '0100011000001', b);
+
+@pragma('dart2js:noInline')
+f_010_001_100_001_1(Set<String> u, int b) => v(u, '0100011000011', b);
+
+@pragma('dart2js:noInline')
+f_010_001_100_010_1(Set<String> u, int b) => v(u, '0100011000101', b);
+
+@pragma('dart2js:noInline')
+f_010_001_100_011_1(Set<String> u, int b) => v(u, '0100011000111', b);
+
+@pragma('dart2js:noInline')
+f_010_001_100_100_1(Set<String> u, int b) => v(u, '0100011001001', b);
+
+@pragma('dart2js:noInline')
+f_010_001_100_101_1(Set<String> u, int b) => v(u, '0100011001011', b);
+
+@pragma('dart2js:noInline')
+f_010_001_100_110_1(Set<String> u, int b) => v(u, '0100011001101', b);
+
+@pragma('dart2js:noInline')
+f_010_001_100_111_1(Set<String> u, int b) => v(u, '0100011001111', b);
+
+@pragma('dart2js:noInline')
+f_010_001_101_000_1(Set<String> u, int b) => v(u, '0100011010001', b);
+
+@pragma('dart2js:noInline')
+f_010_001_101_001_1(Set<String> u, int b) => v(u, '0100011010011', b);
+
+@pragma('dart2js:noInline')
+f_010_001_101_010_1(Set<String> u, int b) => v(u, '0100011010101', b);
+
+@pragma('dart2js:noInline')
+f_010_001_101_011_1(Set<String> u, int b) => v(u, '0100011010111', b);
+
+@pragma('dart2js:noInline')
+f_010_001_101_100_1(Set<String> u, int b) => v(u, '0100011011001', b);
+
+@pragma('dart2js:noInline')
+f_010_001_101_101_1(Set<String> u, int b) => v(u, '0100011011011', b);
+
+@pragma('dart2js:noInline')
+f_010_001_101_110_1(Set<String> u, int b) => v(u, '0100011011101', b);
+
+@pragma('dart2js:noInline')
+f_010_001_101_111_1(Set<String> u, int b) => v(u, '0100011011111', b);
+
+@pragma('dart2js:noInline')
+f_010_001_110_000_1(Set<String> u, int b) => v(u, '0100011100001', b);
+
+@pragma('dart2js:noInline')
+f_010_001_110_001_1(Set<String> u, int b) => v(u, '0100011100011', b);
+
+@pragma('dart2js:noInline')
+f_010_001_110_010_1(Set<String> u, int b) => v(u, '0100011100101', b);
+
+@pragma('dart2js:noInline')
+f_010_001_110_011_1(Set<String> u, int b) => v(u, '0100011100111', b);
+
+@pragma('dart2js:noInline')
+f_010_001_110_100_1(Set<String> u, int b) => v(u, '0100011101001', b);
+
+@pragma('dart2js:noInline')
+f_010_001_110_101_1(Set<String> u, int b) => v(u, '0100011101011', b);
+
+@pragma('dart2js:noInline')
+f_010_001_110_110_1(Set<String> u, int b) => v(u, '0100011101101', b);
+
+@pragma('dart2js:noInline')
+f_010_001_110_111_1(Set<String> u, int b) => v(u, '0100011101111', b);
+
+@pragma('dart2js:noInline')
+f_010_001_111_000_1(Set<String> u, int b) => v(u, '0100011110001', b);
+
+@pragma('dart2js:noInline')
+f_010_001_111_001_1(Set<String> u, int b) => v(u, '0100011110011', b);
+
+@pragma('dart2js:noInline')
+f_010_001_111_010_1(Set<String> u, int b) => v(u, '0100011110101', b);
+
+@pragma('dart2js:noInline')
+f_010_001_111_011_1(Set<String> u, int b) => v(u, '0100011110111', b);
+
+@pragma('dart2js:noInline')
+f_010_001_111_100_1(Set<String> u, int b) => v(u, '0100011111001', b);
+
+@pragma('dart2js:noInline')
+f_010_001_111_101_1(Set<String> u, int b) => v(u, '0100011111011', b);
+
+@pragma('dart2js:noInline')
+f_010_001_111_110_1(Set<String> u, int b) => v(u, '0100011111101', b);
+
+@pragma('dart2js:noInline')
+f_010_001_111_111_1(Set<String> u, int b) => v(u, '0100011111111', b);
+
+@pragma('dart2js:noInline')
+f_010_010_000_000_1(Set<String> u, int b) => v(u, '0100100000001', b);
+
+@pragma('dart2js:noInline')
+f_010_010_000_001_1(Set<String> u, int b) => v(u, '0100100000011', b);
+
+@pragma('dart2js:noInline')
+f_010_010_000_010_1(Set<String> u, int b) => v(u, '0100100000101', b);
+
+@pragma('dart2js:noInline')
+f_010_010_000_011_1(Set<String> u, int b) => v(u, '0100100000111', b);
+
+@pragma('dart2js:noInline')
+f_010_010_000_100_1(Set<String> u, int b) => v(u, '0100100001001', b);
+
+@pragma('dart2js:noInline')
+f_010_010_000_101_1(Set<String> u, int b) => v(u, '0100100001011', b);
+
+@pragma('dart2js:noInline')
+f_010_010_000_110_1(Set<String> u, int b) => v(u, '0100100001101', b);
+
+@pragma('dart2js:noInline')
+f_010_010_000_111_1(Set<String> u, int b) => v(u, '0100100001111', b);
+
+@pragma('dart2js:noInline')
+f_010_010_001_000_1(Set<String> u, int b) => v(u, '0100100010001', b);
+
+@pragma('dart2js:noInline')
+f_010_010_001_001_1(Set<String> u, int b) => v(u, '0100100010011', b);
+
+@pragma('dart2js:noInline')
+f_010_010_001_010_1(Set<String> u, int b) => v(u, '0100100010101', b);
+
+@pragma('dart2js:noInline')
+f_010_010_001_011_1(Set<String> u, int b) => v(u, '0100100010111', b);
+
+@pragma('dart2js:noInline')
+f_010_010_001_100_1(Set<String> u, int b) => v(u, '0100100011001', b);
+
+@pragma('dart2js:noInline')
+f_010_010_001_101_1(Set<String> u, int b) => v(u, '0100100011011', b);
+
+@pragma('dart2js:noInline')
+f_010_010_001_110_1(Set<String> u, int b) => v(u, '0100100011101', b);
+
+@pragma('dart2js:noInline')
+f_010_010_001_111_1(Set<String> u, int b) => v(u, '0100100011111', b);
+
+@pragma('dart2js:noInline')
+f_010_010_010_000_1(Set<String> u, int b) => v(u, '0100100100001', b);
+
+@pragma('dart2js:noInline')
+f_010_010_010_001_1(Set<String> u, int b) => v(u, '0100100100011', b);
+
+@pragma('dart2js:noInline')
+f_010_010_010_010_1(Set<String> u, int b) => v(u, '0100100100101', b);
+
+@pragma('dart2js:noInline')
+f_010_010_010_011_1(Set<String> u, int b) => v(u, '0100100100111', b);
+
+@pragma('dart2js:noInline')
+f_010_010_010_100_1(Set<String> u, int b) => v(u, '0100100101001', b);
+
+@pragma('dart2js:noInline')
+f_010_010_010_101_1(Set<String> u, int b) => v(u, '0100100101011', b);
+
+@pragma('dart2js:noInline')
+f_010_010_010_110_1(Set<String> u, int b) => v(u, '0100100101101', b);
+
+@pragma('dart2js:noInline')
+f_010_010_010_111_1(Set<String> u, int b) => v(u, '0100100101111', b);
+
+@pragma('dart2js:noInline')
+f_010_010_011_000_1(Set<String> u, int b) => v(u, '0100100110001', b);
+
+@pragma('dart2js:noInline')
+f_010_010_011_001_1(Set<String> u, int b) => v(u, '0100100110011', b);
+
+@pragma('dart2js:noInline')
+f_010_010_011_010_1(Set<String> u, int b) => v(u, '0100100110101', b);
+
+@pragma('dart2js:noInline')
+f_010_010_011_011_1(Set<String> u, int b) => v(u, '0100100110111', b);
+
+@pragma('dart2js:noInline')
+f_010_010_011_100_1(Set<String> u, int b) => v(u, '0100100111001', b);
+
+@pragma('dart2js:noInline')
+f_010_010_011_101_1(Set<String> u, int b) => v(u, '0100100111011', b);
+
+@pragma('dart2js:noInline')
+f_010_010_011_110_1(Set<String> u, int b) => v(u, '0100100111101', b);
+
+@pragma('dart2js:noInline')
+f_010_010_011_111_1(Set<String> u, int b) => v(u, '0100100111111', b);
+
+@pragma('dart2js:noInline')
+f_010_010_100_000_1(Set<String> u, int b) => v(u, '0100101000001', b);
+
+@pragma('dart2js:noInline')
+f_010_010_100_001_1(Set<String> u, int b) => v(u, '0100101000011', b);
+
+@pragma('dart2js:noInline')
+f_010_010_100_010_1(Set<String> u, int b) => v(u, '0100101000101', b);
+
+@pragma('dart2js:noInline')
+f_010_010_100_011_1(Set<String> u, int b) => v(u, '0100101000111', b);
+
+@pragma('dart2js:noInline')
+f_010_010_100_100_1(Set<String> u, int b) => v(u, '0100101001001', b);
+
+@pragma('dart2js:noInline')
+f_010_010_100_101_1(Set<String> u, int b) => v(u, '0100101001011', b);
+
+@pragma('dart2js:noInline')
+f_010_010_100_110_1(Set<String> u, int b) => v(u, '0100101001101', b);
+
+@pragma('dart2js:noInline')
+f_010_010_100_111_1(Set<String> u, int b) => v(u, '0100101001111', b);
+
+@pragma('dart2js:noInline')
+f_010_010_101_000_1(Set<String> u, int b) => v(u, '0100101010001', b);
+
+@pragma('dart2js:noInline')
+f_010_010_101_001_1(Set<String> u, int b) => v(u, '0100101010011', b);
+
+@pragma('dart2js:noInline')
+f_010_010_101_010_1(Set<String> u, int b) => v(u, '0100101010101', b);
+
+@pragma('dart2js:noInline')
+f_010_010_101_011_1(Set<String> u, int b) => v(u, '0100101010111', b);
+
+@pragma('dart2js:noInline')
+f_010_010_101_100_1(Set<String> u, int b) => v(u, '0100101011001', b);
+
+@pragma('dart2js:noInline')
+f_010_010_101_101_1(Set<String> u, int b) => v(u, '0100101011011', b);
+
+@pragma('dart2js:noInline')
+f_010_010_101_110_1(Set<String> u, int b) => v(u, '0100101011101', b);
+
+@pragma('dart2js:noInline')
+f_010_010_101_111_1(Set<String> u, int b) => v(u, '0100101011111', b);
+
+@pragma('dart2js:noInline')
+f_010_010_110_000_1(Set<String> u, int b) => v(u, '0100101100001', b);
+
+@pragma('dart2js:noInline')
+f_010_010_110_001_1(Set<String> u, int b) => v(u, '0100101100011', b);
+
+@pragma('dart2js:noInline')
+f_010_010_110_010_1(Set<String> u, int b) => v(u, '0100101100101', b);
+
+@pragma('dart2js:noInline')
+f_010_010_110_011_1(Set<String> u, int b) => v(u, '0100101100111', b);
+
+@pragma('dart2js:noInline')
+f_010_010_110_100_1(Set<String> u, int b) => v(u, '0100101101001', b);
+
+@pragma('dart2js:noInline')
+f_010_010_110_101_1(Set<String> u, int b) => v(u, '0100101101011', b);
+
+@pragma('dart2js:noInline')
+f_010_010_110_110_1(Set<String> u, int b) => v(u, '0100101101101', b);
+
+@pragma('dart2js:noInline')
+f_010_010_110_111_1(Set<String> u, int b) => v(u, '0100101101111', b);
+
+@pragma('dart2js:noInline')
+f_010_010_111_000_1(Set<String> u, int b) => v(u, '0100101110001', b);
+
+@pragma('dart2js:noInline')
+f_010_010_111_001_1(Set<String> u, int b) => v(u, '0100101110011', b);
+
+@pragma('dart2js:noInline')
+f_010_010_111_010_1(Set<String> u, int b) => v(u, '0100101110101', b);
+
+@pragma('dart2js:noInline')
+f_010_010_111_011_1(Set<String> u, int b) => v(u, '0100101110111', b);
+
+@pragma('dart2js:noInline')
+f_010_010_111_100_1(Set<String> u, int b) => v(u, '0100101111001', b);
+
+@pragma('dart2js:noInline')
+f_010_010_111_101_1(Set<String> u, int b) => v(u, '0100101111011', b);
+
+@pragma('dart2js:noInline')
+f_010_010_111_110_1(Set<String> u, int b) => v(u, '0100101111101', b);
+
+@pragma('dart2js:noInline')
+f_010_010_111_111_1(Set<String> u, int b) => v(u, '0100101111111', b);
+
+@pragma('dart2js:noInline')
+f_010_011_000_000_1(Set<String> u, int b) => v(u, '0100110000001', b);
+
+@pragma('dart2js:noInline')
+f_010_011_000_001_1(Set<String> u, int b) => v(u, '0100110000011', b);
+
+@pragma('dart2js:noInline')
+f_010_011_000_010_1(Set<String> u, int b) => v(u, '0100110000101', b);
+
+@pragma('dart2js:noInline')
+f_010_011_000_011_1(Set<String> u, int b) => v(u, '0100110000111', b);
+
+@pragma('dart2js:noInline')
+f_010_011_000_100_1(Set<String> u, int b) => v(u, '0100110001001', b);
+
+@pragma('dart2js:noInline')
+f_010_011_000_101_1(Set<String> u, int b) => v(u, '0100110001011', b);
+
+@pragma('dart2js:noInline')
+f_010_011_000_110_1(Set<String> u, int b) => v(u, '0100110001101', b);
+
+@pragma('dart2js:noInline')
+f_010_011_000_111_1(Set<String> u, int b) => v(u, '0100110001111', b);
+
+@pragma('dart2js:noInline')
+f_010_011_001_000_1(Set<String> u, int b) => v(u, '0100110010001', b);
+
+@pragma('dart2js:noInline')
+f_010_011_001_001_1(Set<String> u, int b) => v(u, '0100110010011', b);
+
+@pragma('dart2js:noInline')
+f_010_011_001_010_1(Set<String> u, int b) => v(u, '0100110010101', b);
+
+@pragma('dart2js:noInline')
+f_010_011_001_011_1(Set<String> u, int b) => v(u, '0100110010111', b);
+
+@pragma('dart2js:noInline')
+f_010_011_001_100_1(Set<String> u, int b) => v(u, '0100110011001', b);
+
+@pragma('dart2js:noInline')
+f_010_011_001_101_1(Set<String> u, int b) => v(u, '0100110011011', b);
+
+@pragma('dart2js:noInline')
+f_010_011_001_110_1(Set<String> u, int b) => v(u, '0100110011101', b);
+
+@pragma('dart2js:noInline')
+f_010_011_001_111_1(Set<String> u, int b) => v(u, '0100110011111', b);
+
+@pragma('dart2js:noInline')
+f_010_011_010_000_1(Set<String> u, int b) => v(u, '0100110100001', b);
+
+@pragma('dart2js:noInline')
+f_010_011_010_001_1(Set<String> u, int b) => v(u, '0100110100011', b);
+
+@pragma('dart2js:noInline')
+f_010_011_010_010_1(Set<String> u, int b) => v(u, '0100110100101', b);
+
+@pragma('dart2js:noInline')
+f_010_011_010_011_1(Set<String> u, int b) => v(u, '0100110100111', b);
+
+@pragma('dart2js:noInline')
+f_010_011_010_100_1(Set<String> u, int b) => v(u, '0100110101001', b);
+
+@pragma('dart2js:noInline')
+f_010_011_010_101_1(Set<String> u, int b) => v(u, '0100110101011', b);
+
+@pragma('dart2js:noInline')
+f_010_011_010_110_1(Set<String> u, int b) => v(u, '0100110101101', b);
+
+@pragma('dart2js:noInline')
+f_010_011_010_111_1(Set<String> u, int b) => v(u, '0100110101111', b);
+
+@pragma('dart2js:noInline')
+f_010_011_011_000_1(Set<String> u, int b) => v(u, '0100110110001', b);
+
+@pragma('dart2js:noInline')
+f_010_011_011_001_1(Set<String> u, int b) => v(u, '0100110110011', b);
+
+@pragma('dart2js:noInline')
+f_010_011_011_010_1(Set<String> u, int b) => v(u, '0100110110101', b);
+
+@pragma('dart2js:noInline')
+f_010_011_011_011_1(Set<String> u, int b) => v(u, '0100110110111', b);
+
+@pragma('dart2js:noInline')
+f_010_011_011_100_1(Set<String> u, int b) => v(u, '0100110111001', b);
+
+@pragma('dart2js:noInline')
+f_010_011_011_101_1(Set<String> u, int b) => v(u, '0100110111011', b);
+
+@pragma('dart2js:noInline')
+f_010_011_011_110_1(Set<String> u, int b) => v(u, '0100110111101', b);
+
+@pragma('dart2js:noInline')
+f_010_011_011_111_1(Set<String> u, int b) => v(u, '0100110111111', b);
+
+@pragma('dart2js:noInline')
+f_010_011_100_000_1(Set<String> u, int b) => v(u, '0100111000001', b);
+
+@pragma('dart2js:noInline')
+f_010_011_100_001_1(Set<String> u, int b) => v(u, '0100111000011', b);
+
+@pragma('dart2js:noInline')
+f_010_011_100_010_1(Set<String> u, int b) => v(u, '0100111000101', b);
+
+@pragma('dart2js:noInline')
+f_010_011_100_011_1(Set<String> u, int b) => v(u, '0100111000111', b);
+
+@pragma('dart2js:noInline')
+f_010_011_100_100_1(Set<String> u, int b) => v(u, '0100111001001', b);
+
+@pragma('dart2js:noInline')
+f_010_011_100_101_1(Set<String> u, int b) => v(u, '0100111001011', b);
+
+@pragma('dart2js:noInline')
+f_010_011_100_110_1(Set<String> u, int b) => v(u, '0100111001101', b);
+
+@pragma('dart2js:noInline')
+f_010_011_100_111_1(Set<String> u, int b) => v(u, '0100111001111', b);
+
+@pragma('dart2js:noInline')
+f_010_011_101_000_1(Set<String> u, int b) => v(u, '0100111010001', b);
+
+@pragma('dart2js:noInline')
+f_010_011_101_001_1(Set<String> u, int b) => v(u, '0100111010011', b);
+
+@pragma('dart2js:noInline')
+f_010_011_101_010_1(Set<String> u, int b) => v(u, '0100111010101', b);
+
+@pragma('dart2js:noInline')
+f_010_011_101_011_1(Set<String> u, int b) => v(u, '0100111010111', b);
+
+@pragma('dart2js:noInline')
+f_010_011_101_100_1(Set<String> u, int b) => v(u, '0100111011001', b);
+
+@pragma('dart2js:noInline')
+f_010_011_101_101_1(Set<String> u, int b) => v(u, '0100111011011', b);
+
+@pragma('dart2js:noInline')
+f_010_011_101_110_1(Set<String> u, int b) => v(u, '0100111011101', b);
+
+@pragma('dart2js:noInline')
+f_010_011_101_111_1(Set<String> u, int b) => v(u, '0100111011111', b);
+
+@pragma('dart2js:noInline')
+f_010_011_110_000_1(Set<String> u, int b) => v(u, '0100111100001', b);
+
+@pragma('dart2js:noInline')
+f_010_011_110_001_1(Set<String> u, int b) => v(u, '0100111100011', b);
+
+@pragma('dart2js:noInline')
+f_010_011_110_010_1(Set<String> u, int b) => v(u, '0100111100101', b);
+
+@pragma('dart2js:noInline')
+f_010_011_110_011_1(Set<String> u, int b) => v(u, '0100111100111', b);
+
+@pragma('dart2js:noInline')
+f_010_011_110_100_1(Set<String> u, int b) => v(u, '0100111101001', b);
+
+@pragma('dart2js:noInline')
+f_010_011_110_101_1(Set<String> u, int b) => v(u, '0100111101011', b);
+
+@pragma('dart2js:noInline')
+f_010_011_110_110_1(Set<String> u, int b) => v(u, '0100111101101', b);
+
+@pragma('dart2js:noInline')
+f_010_011_110_111_1(Set<String> u, int b) => v(u, '0100111101111', b);
+
+@pragma('dart2js:noInline')
+f_010_011_111_000_1(Set<String> u, int b) => v(u, '0100111110001', b);
+
+@pragma('dart2js:noInline')
+f_010_011_111_001_1(Set<String> u, int b) => v(u, '0100111110011', b);
+
+@pragma('dart2js:noInline')
+f_010_011_111_010_1(Set<String> u, int b) => v(u, '0100111110101', b);
+
+@pragma('dart2js:noInline')
+f_010_011_111_011_1(Set<String> u, int b) => v(u, '0100111110111', b);
+
+@pragma('dart2js:noInline')
+f_010_011_111_100_1(Set<String> u, int b) => v(u, '0100111111001', b);
+
+@pragma('dart2js:noInline')
+f_010_011_111_101_1(Set<String> u, int b) => v(u, '0100111111011', b);
+
+@pragma('dart2js:noInline')
+f_010_011_111_110_1(Set<String> u, int b) => v(u, '0100111111101', b);
+
+@pragma('dart2js:noInline')
+f_010_011_111_111_1(Set<String> u, int b) => v(u, '0100111111111', b);
+
+@pragma('dart2js:noInline')
+f_010_100_000_000_1(Set<String> u, int b) => v(u, '0101000000001', b);
+
+@pragma('dart2js:noInline')
+f_010_100_000_001_1(Set<String> u, int b) => v(u, '0101000000011', b);
+
+@pragma('dart2js:noInline')
+f_010_100_000_010_1(Set<String> u, int b) => v(u, '0101000000101', b);
+
+@pragma('dart2js:noInline')
+f_010_100_000_011_1(Set<String> u, int b) => v(u, '0101000000111', b);
+
+@pragma('dart2js:noInline')
+f_010_100_000_100_1(Set<String> u, int b) => v(u, '0101000001001', b);
+
+@pragma('dart2js:noInline')
+f_010_100_000_101_1(Set<String> u, int b) => v(u, '0101000001011', b);
+
+@pragma('dart2js:noInline')
+f_010_100_000_110_1(Set<String> u, int b) => v(u, '0101000001101', b);
+
+@pragma('dart2js:noInline')
+f_010_100_000_111_1(Set<String> u, int b) => v(u, '0101000001111', b);
+
+@pragma('dart2js:noInline')
+f_010_100_001_000_1(Set<String> u, int b) => v(u, '0101000010001', b);
+
+@pragma('dart2js:noInline')
+f_010_100_001_001_1(Set<String> u, int b) => v(u, '0101000010011', b);
+
+@pragma('dart2js:noInline')
+f_010_100_001_010_1(Set<String> u, int b) => v(u, '0101000010101', b);
+
+@pragma('dart2js:noInline')
+f_010_100_001_011_1(Set<String> u, int b) => v(u, '0101000010111', b);
+
+@pragma('dart2js:noInline')
+f_010_100_001_100_1(Set<String> u, int b) => v(u, '0101000011001', b);
+
+@pragma('dart2js:noInline')
+f_010_100_001_101_1(Set<String> u, int b) => v(u, '0101000011011', b);
+
+@pragma('dart2js:noInline')
+f_010_100_001_110_1(Set<String> u, int b) => v(u, '0101000011101', b);
+
+@pragma('dart2js:noInline')
+f_010_100_001_111_1(Set<String> u, int b) => v(u, '0101000011111', b);
+
+@pragma('dart2js:noInline')
+f_010_100_010_000_1(Set<String> u, int b) => v(u, '0101000100001', b);
+
+@pragma('dart2js:noInline')
+f_010_100_010_001_1(Set<String> u, int b) => v(u, '0101000100011', b);
+
+@pragma('dart2js:noInline')
+f_010_100_010_010_1(Set<String> u, int b) => v(u, '0101000100101', b);
+
+@pragma('dart2js:noInline')
+f_010_100_010_011_1(Set<String> u, int b) => v(u, '0101000100111', b);
+
+@pragma('dart2js:noInline')
+f_010_100_010_100_1(Set<String> u, int b) => v(u, '0101000101001', b);
+
+@pragma('dart2js:noInline')
+f_010_100_010_101_1(Set<String> u, int b) => v(u, '0101000101011', b);
+
+@pragma('dart2js:noInline')
+f_010_100_010_110_1(Set<String> u, int b) => v(u, '0101000101101', b);
+
+@pragma('dart2js:noInline')
+f_010_100_010_111_1(Set<String> u, int b) => v(u, '0101000101111', b);
+
+@pragma('dart2js:noInline')
+f_010_100_011_000_1(Set<String> u, int b) => v(u, '0101000110001', b);
+
+@pragma('dart2js:noInline')
+f_010_100_011_001_1(Set<String> u, int b) => v(u, '0101000110011', b);
+
+@pragma('dart2js:noInline')
+f_010_100_011_010_1(Set<String> u, int b) => v(u, '0101000110101', b);
+
+@pragma('dart2js:noInline')
+f_010_100_011_011_1(Set<String> u, int b) => v(u, '0101000110111', b);
+
+@pragma('dart2js:noInline')
+f_010_100_011_100_1(Set<String> u, int b) => v(u, '0101000111001', b);
+
+@pragma('dart2js:noInline')
+f_010_100_011_101_1(Set<String> u, int b) => v(u, '0101000111011', b);
+
+@pragma('dart2js:noInline')
+f_010_100_011_110_1(Set<String> u, int b) => v(u, '0101000111101', b);
+
+@pragma('dart2js:noInline')
+f_010_100_011_111_1(Set<String> u, int b) => v(u, '0101000111111', b);
+
+@pragma('dart2js:noInline')
+f_010_100_100_000_1(Set<String> u, int b) => v(u, '0101001000001', b);
+
+@pragma('dart2js:noInline')
+f_010_100_100_001_1(Set<String> u, int b) => v(u, '0101001000011', b);
+
+@pragma('dart2js:noInline')
+f_010_100_100_010_1(Set<String> u, int b) => v(u, '0101001000101', b);
+
+@pragma('dart2js:noInline')
+f_010_100_100_011_1(Set<String> u, int b) => v(u, '0101001000111', b);
+
+@pragma('dart2js:noInline')
+f_010_100_100_100_1(Set<String> u, int b) => v(u, '0101001001001', b);
+
+@pragma('dart2js:noInline')
+f_010_100_100_101_1(Set<String> u, int b) => v(u, '0101001001011', b);
+
+@pragma('dart2js:noInline')
+f_010_100_100_110_1(Set<String> u, int b) => v(u, '0101001001101', b);
+
+@pragma('dart2js:noInline')
+f_010_100_100_111_1(Set<String> u, int b) => v(u, '0101001001111', b);
+
+@pragma('dart2js:noInline')
+f_010_100_101_000_1(Set<String> u, int b) => v(u, '0101001010001', b);
+
+@pragma('dart2js:noInline')
+f_010_100_101_001_1(Set<String> u, int b) => v(u, '0101001010011', b);
+
+@pragma('dart2js:noInline')
+f_010_100_101_010_1(Set<String> u, int b) => v(u, '0101001010101', b);
+
+@pragma('dart2js:noInline')
+f_010_100_101_011_1(Set<String> u, int b) => v(u, '0101001010111', b);
+
+@pragma('dart2js:noInline')
+f_010_100_101_100_1(Set<String> u, int b) => v(u, '0101001011001', b);
+
+@pragma('dart2js:noInline')
+f_010_100_101_101_1(Set<String> u, int b) => v(u, '0101001011011', b);
+
+@pragma('dart2js:noInline')
+f_010_100_101_110_1(Set<String> u, int b) => v(u, '0101001011101', b);
+
+@pragma('dart2js:noInline')
+f_010_100_101_111_1(Set<String> u, int b) => v(u, '0101001011111', b);
+
+@pragma('dart2js:noInline')
+f_010_100_110_000_1(Set<String> u, int b) => v(u, '0101001100001', b);
+
+@pragma('dart2js:noInline')
+f_010_100_110_001_1(Set<String> u, int b) => v(u, '0101001100011', b);
+
+@pragma('dart2js:noInline')
+f_010_100_110_010_1(Set<String> u, int b) => v(u, '0101001100101', b);
+
+@pragma('dart2js:noInline')
+f_010_100_110_011_1(Set<String> u, int b) => v(u, '0101001100111', b);
+
+@pragma('dart2js:noInline')
+f_010_100_110_100_1(Set<String> u, int b) => v(u, '0101001101001', b);
+
+@pragma('dart2js:noInline')
+f_010_100_110_101_1(Set<String> u, int b) => v(u, '0101001101011', b);
+
+@pragma('dart2js:noInline')
+f_010_100_110_110_1(Set<String> u, int b) => v(u, '0101001101101', b);
+
+@pragma('dart2js:noInline')
+f_010_100_110_111_1(Set<String> u, int b) => v(u, '0101001101111', b);
+
+@pragma('dart2js:noInline')
+f_010_100_111_000_1(Set<String> u, int b) => v(u, '0101001110001', b);
+
+@pragma('dart2js:noInline')
+f_010_100_111_001_1(Set<String> u, int b) => v(u, '0101001110011', b);
+
+@pragma('dart2js:noInline')
+f_010_100_111_010_1(Set<String> u, int b) => v(u, '0101001110101', b);
+
+@pragma('dart2js:noInline')
+f_010_100_111_011_1(Set<String> u, int b) => v(u, '0101001110111', b);
+
+@pragma('dart2js:noInline')
+f_010_100_111_100_1(Set<String> u, int b) => v(u, '0101001111001', b);
+
+@pragma('dart2js:noInline')
+f_010_100_111_101_1(Set<String> u, int b) => v(u, '0101001111011', b);
+
+@pragma('dart2js:noInline')
+f_010_100_111_110_1(Set<String> u, int b) => v(u, '0101001111101', b);
+
+@pragma('dart2js:noInline')
+f_010_100_111_111_1(Set<String> u, int b) => v(u, '0101001111111', b);
+
+@pragma('dart2js:noInline')
+f_010_101_000_000_1(Set<String> u, int b) => v(u, '0101010000001', b);
+
+@pragma('dart2js:noInline')
+f_010_101_000_001_1(Set<String> u, int b) => v(u, '0101010000011', b);
+
+@pragma('dart2js:noInline')
+f_010_101_000_010_1(Set<String> u, int b) => v(u, '0101010000101', b);
+
+@pragma('dart2js:noInline')
+f_010_101_000_011_1(Set<String> u, int b) => v(u, '0101010000111', b);
+
+@pragma('dart2js:noInline')
+f_010_101_000_100_1(Set<String> u, int b) => v(u, '0101010001001', b);
+
+@pragma('dart2js:noInline')
+f_010_101_000_101_1(Set<String> u, int b) => v(u, '0101010001011', b);
+
+@pragma('dart2js:noInline')
+f_010_101_000_110_1(Set<String> u, int b) => v(u, '0101010001101', b);
+
+@pragma('dart2js:noInline')
+f_010_101_000_111_1(Set<String> u, int b) => v(u, '0101010001111', b);
+
+@pragma('dart2js:noInline')
+f_010_101_001_000_1(Set<String> u, int b) => v(u, '0101010010001', b);
+
+@pragma('dart2js:noInline')
+f_010_101_001_001_1(Set<String> u, int b) => v(u, '0101010010011', b);
+
+@pragma('dart2js:noInline')
+f_010_101_001_010_1(Set<String> u, int b) => v(u, '0101010010101', b);
+
+@pragma('dart2js:noInline')
+f_010_101_001_011_1(Set<String> u, int b) => v(u, '0101010010111', b);
+
+@pragma('dart2js:noInline')
+f_010_101_001_100_1(Set<String> u, int b) => v(u, '0101010011001', b);
+
+@pragma('dart2js:noInline')
+f_010_101_001_101_1(Set<String> u, int b) => v(u, '0101010011011', b);
+
+@pragma('dart2js:noInline')
+f_010_101_001_110_1(Set<String> u, int b) => v(u, '0101010011101', b);
+
+@pragma('dart2js:noInline')
+f_010_101_001_111_1(Set<String> u, int b) => v(u, '0101010011111', b);
+
+@pragma('dart2js:noInline')
+f_010_101_010_000_1(Set<String> u, int b) => v(u, '0101010100001', b);
+
+@pragma('dart2js:noInline')
+f_010_101_010_001_1(Set<String> u, int b) => v(u, '0101010100011', b);
+
+@pragma('dart2js:noInline')
+f_010_101_010_010_1(Set<String> u, int b) => v(u, '0101010100101', b);
+
+@pragma('dart2js:noInline')
+f_010_101_010_011_1(Set<String> u, int b) => v(u, '0101010100111', b);
+
+@pragma('dart2js:noInline')
+f_010_101_010_100_1(Set<String> u, int b) => v(u, '0101010101001', b);
+
+@pragma('dart2js:noInline')
+f_010_101_010_101_1(Set<String> u, int b) => v(u, '0101010101011', b);
+
+@pragma('dart2js:noInline')
+f_010_101_010_110_1(Set<String> u, int b) => v(u, '0101010101101', b);
+
+@pragma('dart2js:noInline')
+f_010_101_010_111_1(Set<String> u, int b) => v(u, '0101010101111', b);
+
+@pragma('dart2js:noInline')
+f_010_101_011_000_1(Set<String> u, int b) => v(u, '0101010110001', b);
+
+@pragma('dart2js:noInline')
+f_010_101_011_001_1(Set<String> u, int b) => v(u, '0101010110011', b);
+
+@pragma('dart2js:noInline')
+f_010_101_011_010_1(Set<String> u, int b) => v(u, '0101010110101', b);
+
+@pragma('dart2js:noInline')
+f_010_101_011_011_1(Set<String> u, int b) => v(u, '0101010110111', b);
+
+@pragma('dart2js:noInline')
+f_010_101_011_100_1(Set<String> u, int b) => v(u, '0101010111001', b);
+
+@pragma('dart2js:noInline')
+f_010_101_011_101_1(Set<String> u, int b) => v(u, '0101010111011', b);
+
+@pragma('dart2js:noInline')
+f_010_101_011_110_1(Set<String> u, int b) => v(u, '0101010111101', b);
+
+@pragma('dart2js:noInline')
+f_010_101_011_111_1(Set<String> u, int b) => v(u, '0101010111111', b);
+
+@pragma('dart2js:noInline')
+f_010_101_100_000_1(Set<String> u, int b) => v(u, '0101011000001', b);
+
+@pragma('dart2js:noInline')
+f_010_101_100_001_1(Set<String> u, int b) => v(u, '0101011000011', b);
+
+@pragma('dart2js:noInline')
+f_010_101_100_010_1(Set<String> u, int b) => v(u, '0101011000101', b);
+
+@pragma('dart2js:noInline')
+f_010_101_100_011_1(Set<String> u, int b) => v(u, '0101011000111', b);
+
+@pragma('dart2js:noInline')
+f_010_101_100_100_1(Set<String> u, int b) => v(u, '0101011001001', b);
+
+@pragma('dart2js:noInline')
+f_010_101_100_101_1(Set<String> u, int b) => v(u, '0101011001011', b);
+
+@pragma('dart2js:noInline')
+f_010_101_100_110_1(Set<String> u, int b) => v(u, '0101011001101', b);
+
+@pragma('dart2js:noInline')
+f_010_101_100_111_1(Set<String> u, int b) => v(u, '0101011001111', b);
+
+@pragma('dart2js:noInline')
+f_010_101_101_000_1(Set<String> u, int b) => v(u, '0101011010001', b);
+
+@pragma('dart2js:noInline')
+f_010_101_101_001_1(Set<String> u, int b) => v(u, '0101011010011', b);
+
+@pragma('dart2js:noInline')
+f_010_101_101_010_1(Set<String> u, int b) => v(u, '0101011010101', b);
+
+@pragma('dart2js:noInline')
+f_010_101_101_011_1(Set<String> u, int b) => v(u, '0101011010111', b);
+
+@pragma('dart2js:noInline')
+f_010_101_101_100_1(Set<String> u, int b) => v(u, '0101011011001', b);
+
+@pragma('dart2js:noInline')
+f_010_101_101_101_1(Set<String> u, int b) => v(u, '0101011011011', b);
+
+@pragma('dart2js:noInline')
+f_010_101_101_110_1(Set<String> u, int b) => v(u, '0101011011101', b);
+
+@pragma('dart2js:noInline')
+f_010_101_101_111_1(Set<String> u, int b) => v(u, '0101011011111', b);
+
+@pragma('dart2js:noInline')
+f_010_101_110_000_1(Set<String> u, int b) => v(u, '0101011100001', b);
+
+@pragma('dart2js:noInline')
+f_010_101_110_001_1(Set<String> u, int b) => v(u, '0101011100011', b);
+
+@pragma('dart2js:noInline')
+f_010_101_110_010_1(Set<String> u, int b) => v(u, '0101011100101', b);
+
+@pragma('dart2js:noInline')
+f_010_101_110_011_1(Set<String> u, int b) => v(u, '0101011100111', b);
+
+@pragma('dart2js:noInline')
+f_010_101_110_100_1(Set<String> u, int b) => v(u, '0101011101001', b);
+
+@pragma('dart2js:noInline')
+f_010_101_110_101_1(Set<String> u, int b) => v(u, '0101011101011', b);
+
+@pragma('dart2js:noInline')
+f_010_101_110_110_1(Set<String> u, int b) => v(u, '0101011101101', b);
+
+@pragma('dart2js:noInline')
+f_010_101_110_111_1(Set<String> u, int b) => v(u, '0101011101111', b);
+
+@pragma('dart2js:noInline')
+f_010_101_111_000_1(Set<String> u, int b) => v(u, '0101011110001', b);
+
+@pragma('dart2js:noInline')
+f_010_101_111_001_1(Set<String> u, int b) => v(u, '0101011110011', b);
+
+@pragma('dart2js:noInline')
+f_010_101_111_010_1(Set<String> u, int b) => v(u, '0101011110101', b);
+
+@pragma('dart2js:noInline')
+f_010_101_111_011_1(Set<String> u, int b) => v(u, '0101011110111', b);
+
+@pragma('dart2js:noInline')
+f_010_101_111_100_1(Set<String> u, int b) => v(u, '0101011111001', b);
+
+@pragma('dart2js:noInline')
+f_010_101_111_101_1(Set<String> u, int b) => v(u, '0101011111011', b);
+
+@pragma('dart2js:noInline')
+f_010_101_111_110_1(Set<String> u, int b) => v(u, '0101011111101', b);
+
+@pragma('dart2js:noInline')
+f_010_101_111_111_1(Set<String> u, int b) => v(u, '0101011111111', b);
+
+@pragma('dart2js:noInline')
+f_010_110_000_000_1(Set<String> u, int b) => v(u, '0101100000001', b);
+
+@pragma('dart2js:noInline')
+f_010_110_000_001_1(Set<String> u, int b) => v(u, '0101100000011', b);
+
+@pragma('dart2js:noInline')
+f_010_110_000_010_1(Set<String> u, int b) => v(u, '0101100000101', b);
+
+@pragma('dart2js:noInline')
+f_010_110_000_011_1(Set<String> u, int b) => v(u, '0101100000111', b);
+
+@pragma('dart2js:noInline')
+f_010_110_000_100_1(Set<String> u, int b) => v(u, '0101100001001', b);
+
+@pragma('dart2js:noInline')
+f_010_110_000_101_1(Set<String> u, int b) => v(u, '0101100001011', b);
+
+@pragma('dart2js:noInline')
+f_010_110_000_110_1(Set<String> u, int b) => v(u, '0101100001101', b);
+
+@pragma('dart2js:noInline')
+f_010_110_000_111_1(Set<String> u, int b) => v(u, '0101100001111', b);
+
+@pragma('dart2js:noInline')
+f_010_110_001_000_1(Set<String> u, int b) => v(u, '0101100010001', b);
+
+@pragma('dart2js:noInline')
+f_010_110_001_001_1(Set<String> u, int b) => v(u, '0101100010011', b);
+
+@pragma('dart2js:noInline')
+f_010_110_001_010_1(Set<String> u, int b) => v(u, '0101100010101', b);
+
+@pragma('dart2js:noInline')
+f_010_110_001_011_1(Set<String> u, int b) => v(u, '0101100010111', b);
+
+@pragma('dart2js:noInline')
+f_010_110_001_100_1(Set<String> u, int b) => v(u, '0101100011001', b);
+
+@pragma('dart2js:noInline')
+f_010_110_001_101_1(Set<String> u, int b) => v(u, '0101100011011', b);
+
+@pragma('dart2js:noInline')
+f_010_110_001_110_1(Set<String> u, int b) => v(u, '0101100011101', b);
+
+@pragma('dart2js:noInline')
+f_010_110_001_111_1(Set<String> u, int b) => v(u, '0101100011111', b);
+
+@pragma('dart2js:noInline')
+f_010_110_010_000_1(Set<String> u, int b) => v(u, '0101100100001', b);
+
+@pragma('dart2js:noInline')
+f_010_110_010_001_1(Set<String> u, int b) => v(u, '0101100100011', b);
+
+@pragma('dart2js:noInline')
+f_010_110_010_010_1(Set<String> u, int b) => v(u, '0101100100101', b);
+
+@pragma('dart2js:noInline')
+f_010_110_010_011_1(Set<String> u, int b) => v(u, '0101100100111', b);
+
+@pragma('dart2js:noInline')
+f_010_110_010_100_1(Set<String> u, int b) => v(u, '0101100101001', b);
+
+@pragma('dart2js:noInline')
+f_010_110_010_101_1(Set<String> u, int b) => v(u, '0101100101011', b);
+
+@pragma('dart2js:noInline')
+f_010_110_010_110_1(Set<String> u, int b) => v(u, '0101100101101', b);
+
+@pragma('dart2js:noInline')
+f_010_110_010_111_1(Set<String> u, int b) => v(u, '0101100101111', b);
+
+@pragma('dart2js:noInline')
+f_010_110_011_000_1(Set<String> u, int b) => v(u, '0101100110001', b);
+
+@pragma('dart2js:noInline')
+f_010_110_011_001_1(Set<String> u, int b) => v(u, '0101100110011', b);
+
+@pragma('dart2js:noInline')
+f_010_110_011_010_1(Set<String> u, int b) => v(u, '0101100110101', b);
+
+@pragma('dart2js:noInline')
+f_010_110_011_011_1(Set<String> u, int b) => v(u, '0101100110111', b);
+
+@pragma('dart2js:noInline')
+f_010_110_011_100_1(Set<String> u, int b) => v(u, '0101100111001', b);
+
+@pragma('dart2js:noInline')
+f_010_110_011_101_1(Set<String> u, int b) => v(u, '0101100111011', b);
+
+@pragma('dart2js:noInline')
+f_010_110_011_110_1(Set<String> u, int b) => v(u, '0101100111101', b);
+
+@pragma('dart2js:noInline')
+f_010_110_011_111_1(Set<String> u, int b) => v(u, '0101100111111', b);
+
+@pragma('dart2js:noInline')
+f_010_110_100_000_1(Set<String> u, int b) => v(u, '0101101000001', b);
+
+@pragma('dart2js:noInline')
+f_010_110_100_001_1(Set<String> u, int b) => v(u, '0101101000011', b);
+
+@pragma('dart2js:noInline')
+f_010_110_100_010_1(Set<String> u, int b) => v(u, '0101101000101', b);
+
+@pragma('dart2js:noInline')
+f_010_110_100_011_1(Set<String> u, int b) => v(u, '0101101000111', b);
+
+@pragma('dart2js:noInline')
+f_010_110_100_100_1(Set<String> u, int b) => v(u, '0101101001001', b);
+
+@pragma('dart2js:noInline')
+f_010_110_100_101_1(Set<String> u, int b) => v(u, '0101101001011', b);
+
+@pragma('dart2js:noInline')
+f_010_110_100_110_1(Set<String> u, int b) => v(u, '0101101001101', b);
+
+@pragma('dart2js:noInline')
+f_010_110_100_111_1(Set<String> u, int b) => v(u, '0101101001111', b);
+
+@pragma('dart2js:noInline')
+f_010_110_101_000_1(Set<String> u, int b) => v(u, '0101101010001', b);
+
+@pragma('dart2js:noInline')
+f_010_110_101_001_1(Set<String> u, int b) => v(u, '0101101010011', b);
+
+@pragma('dart2js:noInline')
+f_010_110_101_010_1(Set<String> u, int b) => v(u, '0101101010101', b);
+
+@pragma('dart2js:noInline')
+f_010_110_101_011_1(Set<String> u, int b) => v(u, '0101101010111', b);
+
+@pragma('dart2js:noInline')
+f_010_110_101_100_1(Set<String> u, int b) => v(u, '0101101011001', b);
+
+@pragma('dart2js:noInline')
+f_010_110_101_101_1(Set<String> u, int b) => v(u, '0101101011011', b);
+
+@pragma('dart2js:noInline')
+f_010_110_101_110_1(Set<String> u, int b) => v(u, '0101101011101', b);
+
+@pragma('dart2js:noInline')
+f_010_110_101_111_1(Set<String> u, int b) => v(u, '0101101011111', b);
+
+@pragma('dart2js:noInline')
+f_010_110_110_000_1(Set<String> u, int b) => v(u, '0101101100001', b);
+
+@pragma('dart2js:noInline')
+f_010_110_110_001_1(Set<String> u, int b) => v(u, '0101101100011', b);
+
+@pragma('dart2js:noInline')
+f_010_110_110_010_1(Set<String> u, int b) => v(u, '0101101100101', b);
+
+@pragma('dart2js:noInline')
+f_010_110_110_011_1(Set<String> u, int b) => v(u, '0101101100111', b);
+
+@pragma('dart2js:noInline')
+f_010_110_110_100_1(Set<String> u, int b) => v(u, '0101101101001', b);
+
+@pragma('dart2js:noInline')
+f_010_110_110_101_1(Set<String> u, int b) => v(u, '0101101101011', b);
+
+@pragma('dart2js:noInline')
+f_010_110_110_110_1(Set<String> u, int b) => v(u, '0101101101101', b);
+
+@pragma('dart2js:noInline')
+f_010_110_110_111_1(Set<String> u, int b) => v(u, '0101101101111', b);
+
+@pragma('dart2js:noInline')
+f_010_110_111_000_1(Set<String> u, int b) => v(u, '0101101110001', b);
+
+@pragma('dart2js:noInline')
+f_010_110_111_001_1(Set<String> u, int b) => v(u, '0101101110011', b);
+
+@pragma('dart2js:noInline')
+f_010_110_111_010_1(Set<String> u, int b) => v(u, '0101101110101', b);
+
+@pragma('dart2js:noInline')
+f_010_110_111_011_1(Set<String> u, int b) => v(u, '0101101110111', b);
+
+@pragma('dart2js:noInline')
+f_010_110_111_100_1(Set<String> u, int b) => v(u, '0101101111001', b);
+
+@pragma('dart2js:noInline')
+f_010_110_111_101_1(Set<String> u, int b) => v(u, '0101101111011', b);
+
+@pragma('dart2js:noInline')
+f_010_110_111_110_1(Set<String> u, int b) => v(u, '0101101111101', b);
+
+@pragma('dart2js:noInline')
+f_010_110_111_111_1(Set<String> u, int b) => v(u, '0101101111111', b);
+
+@pragma('dart2js:noInline')
+f_010_111_000_000_1(Set<String> u, int b) => v(u, '0101110000001', b);
+
+@pragma('dart2js:noInline')
+f_010_111_000_001_1(Set<String> u, int b) => v(u, '0101110000011', b);
+
+@pragma('dart2js:noInline')
+f_010_111_000_010_1(Set<String> u, int b) => v(u, '0101110000101', b);
+
+@pragma('dart2js:noInline')
+f_010_111_000_011_1(Set<String> u, int b) => v(u, '0101110000111', b);
+
+@pragma('dart2js:noInline')
+f_010_111_000_100_1(Set<String> u, int b) => v(u, '0101110001001', b);
+
+@pragma('dart2js:noInline')
+f_010_111_000_101_1(Set<String> u, int b) => v(u, '0101110001011', b);
+
+@pragma('dart2js:noInline')
+f_010_111_000_110_1(Set<String> u, int b) => v(u, '0101110001101', b);
+
+@pragma('dart2js:noInline')
+f_010_111_000_111_1(Set<String> u, int b) => v(u, '0101110001111', b);
+
+@pragma('dart2js:noInline')
+f_010_111_001_000_1(Set<String> u, int b) => v(u, '0101110010001', b);
+
+@pragma('dart2js:noInline')
+f_010_111_001_001_1(Set<String> u, int b) => v(u, '0101110010011', b);
+
+@pragma('dart2js:noInline')
+f_010_111_001_010_1(Set<String> u, int b) => v(u, '0101110010101', b);
+
+@pragma('dart2js:noInline')
+f_010_111_001_011_1(Set<String> u, int b) => v(u, '0101110010111', b);
+
+@pragma('dart2js:noInline')
+f_010_111_001_100_1(Set<String> u, int b) => v(u, '0101110011001', b);
+
+@pragma('dart2js:noInline')
+f_010_111_001_101_1(Set<String> u, int b) => v(u, '0101110011011', b);
+
+@pragma('dart2js:noInline')
+f_010_111_001_110_1(Set<String> u, int b) => v(u, '0101110011101', b);
+
+@pragma('dart2js:noInline')
+f_010_111_001_111_1(Set<String> u, int b) => v(u, '0101110011111', b);
+
+@pragma('dart2js:noInline')
+f_010_111_010_000_1(Set<String> u, int b) => v(u, '0101110100001', b);
+
+@pragma('dart2js:noInline')
+f_010_111_010_001_1(Set<String> u, int b) => v(u, '0101110100011', b);
+
+@pragma('dart2js:noInline')
+f_010_111_010_010_1(Set<String> u, int b) => v(u, '0101110100101', b);
+
+@pragma('dart2js:noInline')
+f_010_111_010_011_1(Set<String> u, int b) => v(u, '0101110100111', b);
+
+@pragma('dart2js:noInline')
+f_010_111_010_100_1(Set<String> u, int b) => v(u, '0101110101001', b);
+
+@pragma('dart2js:noInline')
+f_010_111_010_101_1(Set<String> u, int b) => v(u, '0101110101011', b);
+
+@pragma('dart2js:noInline')
+f_010_111_010_110_1(Set<String> u, int b) => v(u, '0101110101101', b);
+
+@pragma('dart2js:noInline')
+f_010_111_010_111_1(Set<String> u, int b) => v(u, '0101110101111', b);
+
+@pragma('dart2js:noInline')
+f_010_111_011_000_1(Set<String> u, int b) => v(u, '0101110110001', b);
+
+@pragma('dart2js:noInline')
+f_010_111_011_001_1(Set<String> u, int b) => v(u, '0101110110011', b);
+
+@pragma('dart2js:noInline')
+f_010_111_011_010_1(Set<String> u, int b) => v(u, '0101110110101', b);
+
+@pragma('dart2js:noInline')
+f_010_111_011_011_1(Set<String> u, int b) => v(u, '0101110110111', b);
+
+@pragma('dart2js:noInline')
+f_010_111_011_100_1(Set<String> u, int b) => v(u, '0101110111001', b);
+
+@pragma('dart2js:noInline')
+f_010_111_011_101_1(Set<String> u, int b) => v(u, '0101110111011', b);
+
+@pragma('dart2js:noInline')
+f_010_111_011_110_1(Set<String> u, int b) => v(u, '0101110111101', b);
+
+@pragma('dart2js:noInline')
+f_010_111_011_111_1(Set<String> u, int b) => v(u, '0101110111111', b);
+
+@pragma('dart2js:noInline')
+f_010_111_100_000_1(Set<String> u, int b) => v(u, '0101111000001', b);
+
+@pragma('dart2js:noInline')
+f_010_111_100_001_1(Set<String> u, int b) => v(u, '0101111000011', b);
+
+@pragma('dart2js:noInline')
+f_010_111_100_010_1(Set<String> u, int b) => v(u, '0101111000101', b);
+
+@pragma('dart2js:noInline')
+f_010_111_100_011_1(Set<String> u, int b) => v(u, '0101111000111', b);
+
+@pragma('dart2js:noInline')
+f_010_111_100_100_1(Set<String> u, int b) => v(u, '0101111001001', b);
+
+@pragma('dart2js:noInline')
+f_010_111_100_101_1(Set<String> u, int b) => v(u, '0101111001011', b);
+
+@pragma('dart2js:noInline')
+f_010_111_100_110_1(Set<String> u, int b) => v(u, '0101111001101', b);
+
+@pragma('dart2js:noInline')
+f_010_111_100_111_1(Set<String> u, int b) => v(u, '0101111001111', b);
+
+@pragma('dart2js:noInline')
+f_010_111_101_000_1(Set<String> u, int b) => v(u, '0101111010001', b);
+
+@pragma('dart2js:noInline')
+f_010_111_101_001_1(Set<String> u, int b) => v(u, '0101111010011', b);
+
+@pragma('dart2js:noInline')
+f_010_111_101_010_1(Set<String> u, int b) => v(u, '0101111010101', b);
+
+@pragma('dart2js:noInline')
+f_010_111_101_011_1(Set<String> u, int b) => v(u, '0101111010111', b);
+
+@pragma('dart2js:noInline')
+f_010_111_101_100_1(Set<String> u, int b) => v(u, '0101111011001', b);
+
+@pragma('dart2js:noInline')
+f_010_111_101_101_1(Set<String> u, int b) => v(u, '0101111011011', b);
+
+@pragma('dart2js:noInline')
+f_010_111_101_110_1(Set<String> u, int b) => v(u, '0101111011101', b);
+
+@pragma('dart2js:noInline')
+f_010_111_101_111_1(Set<String> u, int b) => v(u, '0101111011111', b);
+
+@pragma('dart2js:noInline')
+f_010_111_110_000_1(Set<String> u, int b) => v(u, '0101111100001', b);
+
+@pragma('dart2js:noInline')
+f_010_111_110_001_1(Set<String> u, int b) => v(u, '0101111100011', b);
+
+@pragma('dart2js:noInline')
+f_010_111_110_010_1(Set<String> u, int b) => v(u, '0101111100101', b);
+
+@pragma('dart2js:noInline')
+f_010_111_110_011_1(Set<String> u, int b) => v(u, '0101111100111', b);
+
+@pragma('dart2js:noInline')
+f_010_111_110_100_1(Set<String> u, int b) => v(u, '0101111101001', b);
+
+@pragma('dart2js:noInline')
+f_010_111_110_101_1(Set<String> u, int b) => v(u, '0101111101011', b);
+
+@pragma('dart2js:noInline')
+f_010_111_110_110_1(Set<String> u, int b) => v(u, '0101111101101', b);
+
+@pragma('dart2js:noInline')
+f_010_111_110_111_1(Set<String> u, int b) => v(u, '0101111101111', b);
+
+@pragma('dart2js:noInline')
+f_010_111_111_000_1(Set<String> u, int b) => v(u, '0101111110001', b);
+
+@pragma('dart2js:noInline')
+f_010_111_111_001_1(Set<String> u, int b) => v(u, '0101111110011', b);
+
+@pragma('dart2js:noInline')
+f_010_111_111_010_1(Set<String> u, int b) => v(u, '0101111110101', b);
+
+@pragma('dart2js:noInline')
+f_010_111_111_011_1(Set<String> u, int b) => v(u, '0101111110111', b);
+
+@pragma('dart2js:noInline')
+f_010_111_111_100_1(Set<String> u, int b) => v(u, '0101111111001', b);
+
+@pragma('dart2js:noInline')
+f_010_111_111_101_1(Set<String> u, int b) => v(u, '0101111111011', b);
+
+@pragma('dart2js:noInline')
+f_010_111_111_110_1(Set<String> u, int b) => v(u, '0101111111101', b);
+
+@pragma('dart2js:noInline')
+f_010_111_111_111_1(Set<String> u, int b) => v(u, '0101111111111', b);
+
+@pragma('dart2js:noInline')
+f_011_000_000_000_1(Set<String> u, int b) => v(u, '0110000000001', b);
+
+@pragma('dart2js:noInline')
+f_011_000_000_001_1(Set<String> u, int b) => v(u, '0110000000011', b);
+
+@pragma('dart2js:noInline')
+f_011_000_000_010_1(Set<String> u, int b) => v(u, '0110000000101', b);
+
+@pragma('dart2js:noInline')
+f_011_000_000_011_1(Set<String> u, int b) => v(u, '0110000000111', b);
+
+@pragma('dart2js:noInline')
+f_011_000_000_100_1(Set<String> u, int b) => v(u, '0110000001001', b);
+
+@pragma('dart2js:noInline')
+f_011_000_000_101_1(Set<String> u, int b) => v(u, '0110000001011', b);
+
+@pragma('dart2js:noInline')
+f_011_000_000_110_1(Set<String> u, int b) => v(u, '0110000001101', b);
+
+@pragma('dart2js:noInline')
+f_011_000_000_111_1(Set<String> u, int b) => v(u, '0110000001111', b);
+
+@pragma('dart2js:noInline')
+f_011_000_001_000_1(Set<String> u, int b) => v(u, '0110000010001', b);
+
+@pragma('dart2js:noInline')
+f_011_000_001_001_1(Set<String> u, int b) => v(u, '0110000010011', b);
+
+@pragma('dart2js:noInline')
+f_011_000_001_010_1(Set<String> u, int b) => v(u, '0110000010101', b);
+
+@pragma('dart2js:noInline')
+f_011_000_001_011_1(Set<String> u, int b) => v(u, '0110000010111', b);
+
+@pragma('dart2js:noInline')
+f_011_000_001_100_1(Set<String> u, int b) => v(u, '0110000011001', b);
+
+@pragma('dart2js:noInline')
+f_011_000_001_101_1(Set<String> u, int b) => v(u, '0110000011011', b);
+
+@pragma('dart2js:noInline')
+f_011_000_001_110_1(Set<String> u, int b) => v(u, '0110000011101', b);
+
+@pragma('dart2js:noInline')
+f_011_000_001_111_1(Set<String> u, int b) => v(u, '0110000011111', b);
+
+@pragma('dart2js:noInline')
+f_011_000_010_000_1(Set<String> u, int b) => v(u, '0110000100001', b);
+
+@pragma('dart2js:noInline')
+f_011_000_010_001_1(Set<String> u, int b) => v(u, '0110000100011', b);
+
+@pragma('dart2js:noInline')
+f_011_000_010_010_1(Set<String> u, int b) => v(u, '0110000100101', b);
+
+@pragma('dart2js:noInline')
+f_011_000_010_011_1(Set<String> u, int b) => v(u, '0110000100111', b);
+
+@pragma('dart2js:noInline')
+f_011_000_010_100_1(Set<String> u, int b) => v(u, '0110000101001', b);
+
+@pragma('dart2js:noInline')
+f_011_000_010_101_1(Set<String> u, int b) => v(u, '0110000101011', b);
+
+@pragma('dart2js:noInline')
+f_011_000_010_110_1(Set<String> u, int b) => v(u, '0110000101101', b);
+
+@pragma('dart2js:noInline')
+f_011_000_010_111_1(Set<String> u, int b) => v(u, '0110000101111', b);
+
+@pragma('dart2js:noInline')
+f_011_000_011_000_1(Set<String> u, int b) => v(u, '0110000110001', b);
+
+@pragma('dart2js:noInline')
+f_011_000_011_001_1(Set<String> u, int b) => v(u, '0110000110011', b);
+
+@pragma('dart2js:noInline')
+f_011_000_011_010_1(Set<String> u, int b) => v(u, '0110000110101', b);
+
+@pragma('dart2js:noInline')
+f_011_000_011_011_1(Set<String> u, int b) => v(u, '0110000110111', b);
+
+@pragma('dart2js:noInline')
+f_011_000_011_100_1(Set<String> u, int b) => v(u, '0110000111001', b);
+
+@pragma('dart2js:noInline')
+f_011_000_011_101_1(Set<String> u, int b) => v(u, '0110000111011', b);
+
+@pragma('dart2js:noInline')
+f_011_000_011_110_1(Set<String> u, int b) => v(u, '0110000111101', b);
+
+@pragma('dart2js:noInline')
+f_011_000_011_111_1(Set<String> u, int b) => v(u, '0110000111111', b);
+
+@pragma('dart2js:noInline')
+f_011_000_100_000_1(Set<String> u, int b) => v(u, '0110001000001', b);
+
+@pragma('dart2js:noInline')
+f_011_000_100_001_1(Set<String> u, int b) => v(u, '0110001000011', b);
+
+@pragma('dart2js:noInline')
+f_011_000_100_010_1(Set<String> u, int b) => v(u, '0110001000101', b);
+
+@pragma('dart2js:noInline')
+f_011_000_100_011_1(Set<String> u, int b) => v(u, '0110001000111', b);
+
+@pragma('dart2js:noInline')
+f_011_000_100_100_1(Set<String> u, int b) => v(u, '0110001001001', b);
+
+@pragma('dart2js:noInline')
+f_011_000_100_101_1(Set<String> u, int b) => v(u, '0110001001011', b);
+
+@pragma('dart2js:noInline')
+f_011_000_100_110_1(Set<String> u, int b) => v(u, '0110001001101', b);
+
+@pragma('dart2js:noInline')
+f_011_000_100_111_1(Set<String> u, int b) => v(u, '0110001001111', b);
+
+@pragma('dart2js:noInline')
+f_011_000_101_000_1(Set<String> u, int b) => v(u, '0110001010001', b);
+
+@pragma('dart2js:noInline')
+f_011_000_101_001_1(Set<String> u, int b) => v(u, '0110001010011', b);
+
+@pragma('dart2js:noInline')
+f_011_000_101_010_1(Set<String> u, int b) => v(u, '0110001010101', b);
+
+@pragma('dart2js:noInline')
+f_011_000_101_011_1(Set<String> u, int b) => v(u, '0110001010111', b);
+
+@pragma('dart2js:noInline')
+f_011_000_101_100_1(Set<String> u, int b) => v(u, '0110001011001', b);
+
+@pragma('dart2js:noInline')
+f_011_000_101_101_1(Set<String> u, int b) => v(u, '0110001011011', b);
+
+@pragma('dart2js:noInline')
+f_011_000_101_110_1(Set<String> u, int b) => v(u, '0110001011101', b);
+
+@pragma('dart2js:noInline')
+f_011_000_101_111_1(Set<String> u, int b) => v(u, '0110001011111', b);
+
+@pragma('dart2js:noInline')
+f_011_000_110_000_1(Set<String> u, int b) => v(u, '0110001100001', b);
+
+@pragma('dart2js:noInline')
+f_011_000_110_001_1(Set<String> u, int b) => v(u, '0110001100011', b);
+
+@pragma('dart2js:noInline')
+f_011_000_110_010_1(Set<String> u, int b) => v(u, '0110001100101', b);
+
+@pragma('dart2js:noInline')
+f_011_000_110_011_1(Set<String> u, int b) => v(u, '0110001100111', b);
+
+@pragma('dart2js:noInline')
+f_011_000_110_100_1(Set<String> u, int b) => v(u, '0110001101001', b);
+
+@pragma('dart2js:noInline')
+f_011_000_110_101_1(Set<String> u, int b) => v(u, '0110001101011', b);
+
+@pragma('dart2js:noInline')
+f_011_000_110_110_1(Set<String> u, int b) => v(u, '0110001101101', b);
+
+@pragma('dart2js:noInline')
+f_011_000_110_111_1(Set<String> u, int b) => v(u, '0110001101111', b);
+
+@pragma('dart2js:noInline')
+f_011_000_111_000_1(Set<String> u, int b) => v(u, '0110001110001', b);
+
+@pragma('dart2js:noInline')
+f_011_000_111_001_1(Set<String> u, int b) => v(u, '0110001110011', b);
+
+@pragma('dart2js:noInline')
+f_011_000_111_010_1(Set<String> u, int b) => v(u, '0110001110101', b);
+
+@pragma('dart2js:noInline')
+f_011_000_111_011_1(Set<String> u, int b) => v(u, '0110001110111', b);
+
+@pragma('dart2js:noInline')
+f_011_000_111_100_1(Set<String> u, int b) => v(u, '0110001111001', b);
+
+@pragma('dart2js:noInline')
+f_011_000_111_101_1(Set<String> u, int b) => v(u, '0110001111011', b);
+
+@pragma('dart2js:noInline')
+f_011_000_111_110_1(Set<String> u, int b) => v(u, '0110001111101', b);
+
+@pragma('dart2js:noInline')
+f_011_000_111_111_1(Set<String> u, int b) => v(u, '0110001111111', b);
+
+@pragma('dart2js:noInline')
+f_011_001_000_000_1(Set<String> u, int b) => v(u, '0110010000001', b);
+
+@pragma('dart2js:noInline')
+f_011_001_000_001_1(Set<String> u, int b) => v(u, '0110010000011', b);
+
+@pragma('dart2js:noInline')
+f_011_001_000_010_1(Set<String> u, int b) => v(u, '0110010000101', b);
+
+@pragma('dart2js:noInline')
+f_011_001_000_011_1(Set<String> u, int b) => v(u, '0110010000111', b);
+
+@pragma('dart2js:noInline')
+f_011_001_000_100_1(Set<String> u, int b) => v(u, '0110010001001', b);
+
+@pragma('dart2js:noInline')
+f_011_001_000_101_1(Set<String> u, int b) => v(u, '0110010001011', b);
+
+@pragma('dart2js:noInline')
+f_011_001_000_110_1(Set<String> u, int b) => v(u, '0110010001101', b);
+
+@pragma('dart2js:noInline')
+f_011_001_000_111_1(Set<String> u, int b) => v(u, '0110010001111', b);
+
+@pragma('dart2js:noInline')
+f_011_001_001_000_1(Set<String> u, int b) => v(u, '0110010010001', b);
+
+@pragma('dart2js:noInline')
+f_011_001_001_001_1(Set<String> u, int b) => v(u, '0110010010011', b);
+
+@pragma('dart2js:noInline')
+f_011_001_001_010_1(Set<String> u, int b) => v(u, '0110010010101', b);
+
+@pragma('dart2js:noInline')
+f_011_001_001_011_1(Set<String> u, int b) => v(u, '0110010010111', b);
+
+@pragma('dart2js:noInline')
+f_011_001_001_100_1(Set<String> u, int b) => v(u, '0110010011001', b);
+
+@pragma('dart2js:noInline')
+f_011_001_001_101_1(Set<String> u, int b) => v(u, '0110010011011', b);
+
+@pragma('dart2js:noInline')
+f_011_001_001_110_1(Set<String> u, int b) => v(u, '0110010011101', b);
+
+@pragma('dart2js:noInline')
+f_011_001_001_111_1(Set<String> u, int b) => v(u, '0110010011111', b);
+
+@pragma('dart2js:noInline')
+f_011_001_010_000_1(Set<String> u, int b) => v(u, '0110010100001', b);
+
+@pragma('dart2js:noInline')
+f_011_001_010_001_1(Set<String> u, int b) => v(u, '0110010100011', b);
+
+@pragma('dart2js:noInline')
+f_011_001_010_010_1(Set<String> u, int b) => v(u, '0110010100101', b);
+
+@pragma('dart2js:noInline')
+f_011_001_010_011_1(Set<String> u, int b) => v(u, '0110010100111', b);
+
+@pragma('dart2js:noInline')
+f_011_001_010_100_1(Set<String> u, int b) => v(u, '0110010101001', b);
+
+@pragma('dart2js:noInline')
+f_011_001_010_101_1(Set<String> u, int b) => v(u, '0110010101011', b);
+
+@pragma('dart2js:noInline')
+f_011_001_010_110_1(Set<String> u, int b) => v(u, '0110010101101', b);
+
+@pragma('dart2js:noInline')
+f_011_001_010_111_1(Set<String> u, int b) => v(u, '0110010101111', b);
+
+@pragma('dart2js:noInline')
+f_011_001_011_000_1(Set<String> u, int b) => v(u, '0110010110001', b);
+
+@pragma('dart2js:noInline')
+f_011_001_011_001_1(Set<String> u, int b) => v(u, '0110010110011', b);
+
+@pragma('dart2js:noInline')
+f_011_001_011_010_1(Set<String> u, int b) => v(u, '0110010110101', b);
+
+@pragma('dart2js:noInline')
+f_011_001_011_011_1(Set<String> u, int b) => v(u, '0110010110111', b);
+
+@pragma('dart2js:noInline')
+f_011_001_011_100_1(Set<String> u, int b) => v(u, '0110010111001', b);
+
+@pragma('dart2js:noInline')
+f_011_001_011_101_1(Set<String> u, int b) => v(u, '0110010111011', b);
+
+@pragma('dart2js:noInline')
+f_011_001_011_110_1(Set<String> u, int b) => v(u, '0110010111101', b);
+
+@pragma('dart2js:noInline')
+f_011_001_011_111_1(Set<String> u, int b) => v(u, '0110010111111', b);
+
+@pragma('dart2js:noInline')
+f_011_001_100_000_1(Set<String> u, int b) => v(u, '0110011000001', b);
+
+@pragma('dart2js:noInline')
+f_011_001_100_001_1(Set<String> u, int b) => v(u, '0110011000011', b);
+
+@pragma('dart2js:noInline')
+f_011_001_100_010_1(Set<String> u, int b) => v(u, '0110011000101', b);
+
+@pragma('dart2js:noInline')
+f_011_001_100_011_1(Set<String> u, int b) => v(u, '0110011000111', b);
+
+@pragma('dart2js:noInline')
+f_011_001_100_100_1(Set<String> u, int b) => v(u, '0110011001001', b);
+
+@pragma('dart2js:noInline')
+f_011_001_100_101_1(Set<String> u, int b) => v(u, '0110011001011', b);
+
+@pragma('dart2js:noInline')
+f_011_001_100_110_1(Set<String> u, int b) => v(u, '0110011001101', b);
+
+@pragma('dart2js:noInline')
+f_011_001_100_111_1(Set<String> u, int b) => v(u, '0110011001111', b);
+
+@pragma('dart2js:noInline')
+f_011_001_101_000_1(Set<String> u, int b) => v(u, '0110011010001', b);
+
+@pragma('dart2js:noInline')
+f_011_001_101_001_1(Set<String> u, int b) => v(u, '0110011010011', b);
+
+@pragma('dart2js:noInline')
+f_011_001_101_010_1(Set<String> u, int b) => v(u, '0110011010101', b);
+
+@pragma('dart2js:noInline')
+f_011_001_101_011_1(Set<String> u, int b) => v(u, '0110011010111', b);
+
+@pragma('dart2js:noInline')
+f_011_001_101_100_1(Set<String> u, int b) => v(u, '0110011011001', b);
+
+@pragma('dart2js:noInline')
+f_011_001_101_101_1(Set<String> u, int b) => v(u, '0110011011011', b);
+
+@pragma('dart2js:noInline')
+f_011_001_101_110_1(Set<String> u, int b) => v(u, '0110011011101', b);
+
+@pragma('dart2js:noInline')
+f_011_001_101_111_1(Set<String> u, int b) => v(u, '0110011011111', b);
+
+@pragma('dart2js:noInline')
+f_011_001_110_000_1(Set<String> u, int b) => v(u, '0110011100001', b);
+
+@pragma('dart2js:noInline')
+f_011_001_110_001_1(Set<String> u, int b) => v(u, '0110011100011', b);
+
+@pragma('dart2js:noInline')
+f_011_001_110_010_1(Set<String> u, int b) => v(u, '0110011100101', b);
+
+@pragma('dart2js:noInline')
+f_011_001_110_011_1(Set<String> u, int b) => v(u, '0110011100111', b);
+
+@pragma('dart2js:noInline')
+f_011_001_110_100_1(Set<String> u, int b) => v(u, '0110011101001', b);
+
+@pragma('dart2js:noInline')
+f_011_001_110_101_1(Set<String> u, int b) => v(u, '0110011101011', b);
+
+@pragma('dart2js:noInline')
+f_011_001_110_110_1(Set<String> u, int b) => v(u, '0110011101101', b);
+
+@pragma('dart2js:noInline')
+f_011_001_110_111_1(Set<String> u, int b) => v(u, '0110011101111', b);
+
+@pragma('dart2js:noInline')
+f_011_001_111_000_1(Set<String> u, int b) => v(u, '0110011110001', b);
+
+@pragma('dart2js:noInline')
+f_011_001_111_001_1(Set<String> u, int b) => v(u, '0110011110011', b);
+
+@pragma('dart2js:noInline')
+f_011_001_111_010_1(Set<String> u, int b) => v(u, '0110011110101', b);
+
+@pragma('dart2js:noInline')
+f_011_001_111_011_1(Set<String> u, int b) => v(u, '0110011110111', b);
+
+@pragma('dart2js:noInline')
+f_011_001_111_100_1(Set<String> u, int b) => v(u, '0110011111001', b);
+
+@pragma('dart2js:noInline')
+f_011_001_111_101_1(Set<String> u, int b) => v(u, '0110011111011', b);
+
+@pragma('dart2js:noInline')
+f_011_001_111_110_1(Set<String> u, int b) => v(u, '0110011111101', b);
+
+@pragma('dart2js:noInline')
+f_011_001_111_111_1(Set<String> u, int b) => v(u, '0110011111111', b);
+
+@pragma('dart2js:noInline')
+f_011_010_000_000_1(Set<String> u, int b) => v(u, '0110100000001', b);
+
+@pragma('dart2js:noInline')
+f_011_010_000_001_1(Set<String> u, int b) => v(u, '0110100000011', b);
+
+@pragma('dart2js:noInline')
+f_011_010_000_010_1(Set<String> u, int b) => v(u, '0110100000101', b);
+
+@pragma('dart2js:noInline')
+f_011_010_000_011_1(Set<String> u, int b) => v(u, '0110100000111', b);
+
+@pragma('dart2js:noInline')
+f_011_010_000_100_1(Set<String> u, int b) => v(u, '0110100001001', b);
+
+@pragma('dart2js:noInline')
+f_011_010_000_101_1(Set<String> u, int b) => v(u, '0110100001011', b);
+
+@pragma('dart2js:noInline')
+f_011_010_000_110_1(Set<String> u, int b) => v(u, '0110100001101', b);
+
+@pragma('dart2js:noInline')
+f_011_010_000_111_1(Set<String> u, int b) => v(u, '0110100001111', b);
+
+@pragma('dart2js:noInline')
+f_011_010_001_000_1(Set<String> u, int b) => v(u, '0110100010001', b);
+
+@pragma('dart2js:noInline')
+f_011_010_001_001_1(Set<String> u, int b) => v(u, '0110100010011', b);
+
+@pragma('dart2js:noInline')
+f_011_010_001_010_1(Set<String> u, int b) => v(u, '0110100010101', b);
+
+@pragma('dart2js:noInline')
+f_011_010_001_011_1(Set<String> u, int b) => v(u, '0110100010111', b);
+
+@pragma('dart2js:noInline')
+f_011_010_001_100_1(Set<String> u, int b) => v(u, '0110100011001', b);
+
+@pragma('dart2js:noInline')
+f_011_010_001_101_1(Set<String> u, int b) => v(u, '0110100011011', b);
+
+@pragma('dart2js:noInline')
+f_011_010_001_110_1(Set<String> u, int b) => v(u, '0110100011101', b);
+
+@pragma('dart2js:noInline')
+f_011_010_001_111_1(Set<String> u, int b) => v(u, '0110100011111', b);
+
+@pragma('dart2js:noInline')
+f_011_010_010_000_1(Set<String> u, int b) => v(u, '0110100100001', b);
+
+@pragma('dart2js:noInline')
+f_011_010_010_001_1(Set<String> u, int b) => v(u, '0110100100011', b);
+
+@pragma('dart2js:noInline')
+f_011_010_010_010_1(Set<String> u, int b) => v(u, '0110100100101', b);
+
+@pragma('dart2js:noInline')
+f_011_010_010_011_1(Set<String> u, int b) => v(u, '0110100100111', b);
+
+@pragma('dart2js:noInline')
+f_011_010_010_100_1(Set<String> u, int b) => v(u, '0110100101001', b);
+
+@pragma('dart2js:noInline')
+f_011_010_010_101_1(Set<String> u, int b) => v(u, '0110100101011', b);
+
+@pragma('dart2js:noInline')
+f_011_010_010_110_1(Set<String> u, int b) => v(u, '0110100101101', b);
+
+@pragma('dart2js:noInline')
+f_011_010_010_111_1(Set<String> u, int b) => v(u, '0110100101111', b);
+
+@pragma('dart2js:noInline')
+f_011_010_011_000_1(Set<String> u, int b) => v(u, '0110100110001', b);
+
+@pragma('dart2js:noInline')
+f_011_010_011_001_1(Set<String> u, int b) => v(u, '0110100110011', b);
+
+@pragma('dart2js:noInline')
+f_011_010_011_010_1(Set<String> u, int b) => v(u, '0110100110101', b);
+
+@pragma('dart2js:noInline')
+f_011_010_011_011_1(Set<String> u, int b) => v(u, '0110100110111', b);
+
+@pragma('dart2js:noInline')
+f_011_010_011_100_1(Set<String> u, int b) => v(u, '0110100111001', b);
+
+@pragma('dart2js:noInline')
+f_011_010_011_101_1(Set<String> u, int b) => v(u, '0110100111011', b);
+
+@pragma('dart2js:noInline')
+f_011_010_011_110_1(Set<String> u, int b) => v(u, '0110100111101', b);
+
+@pragma('dart2js:noInline')
+f_011_010_011_111_1(Set<String> u, int b) => v(u, '0110100111111', b);
+
+@pragma('dart2js:noInline')
+f_011_010_100_000_1(Set<String> u, int b) => v(u, '0110101000001', b);
+
+@pragma('dart2js:noInline')
+f_011_010_100_001_1(Set<String> u, int b) => v(u, '0110101000011', b);
+
+@pragma('dart2js:noInline')
+f_011_010_100_010_1(Set<String> u, int b) => v(u, '0110101000101', b);
+
+@pragma('dart2js:noInline')
+f_011_010_100_011_1(Set<String> u, int b) => v(u, '0110101000111', b);
+
+@pragma('dart2js:noInline')
+f_011_010_100_100_1(Set<String> u, int b) => v(u, '0110101001001', b);
+
+@pragma('dart2js:noInline')
+f_011_010_100_101_1(Set<String> u, int b) => v(u, '0110101001011', b);
+
+@pragma('dart2js:noInline')
+f_011_010_100_110_1(Set<String> u, int b) => v(u, '0110101001101', b);
+
+@pragma('dart2js:noInline')
+f_011_010_100_111_1(Set<String> u, int b) => v(u, '0110101001111', b);
+
+@pragma('dart2js:noInline')
+f_011_010_101_000_1(Set<String> u, int b) => v(u, '0110101010001', b);
+
+@pragma('dart2js:noInline')
+f_011_010_101_001_1(Set<String> u, int b) => v(u, '0110101010011', b);
+
+@pragma('dart2js:noInline')
+f_011_010_101_010_1(Set<String> u, int b) => v(u, '0110101010101', b);
+
+@pragma('dart2js:noInline')
+f_011_010_101_011_1(Set<String> u, int b) => v(u, '0110101010111', b);
+
+@pragma('dart2js:noInline')
+f_011_010_101_100_1(Set<String> u, int b) => v(u, '0110101011001', b);
+
+@pragma('dart2js:noInline')
+f_011_010_101_101_1(Set<String> u, int b) => v(u, '0110101011011', b);
+
+@pragma('dart2js:noInline')
+f_011_010_101_110_1(Set<String> u, int b) => v(u, '0110101011101', b);
+
+@pragma('dart2js:noInline')
+f_011_010_101_111_1(Set<String> u, int b) => v(u, '0110101011111', b);
+
+@pragma('dart2js:noInline')
+f_011_010_110_000_1(Set<String> u, int b) => v(u, '0110101100001', b);
+
+@pragma('dart2js:noInline')
+f_011_010_110_001_1(Set<String> u, int b) => v(u, '0110101100011', b);
+
+@pragma('dart2js:noInline')
+f_011_010_110_010_1(Set<String> u, int b) => v(u, '0110101100101', b);
+
+@pragma('dart2js:noInline')
+f_011_010_110_011_1(Set<String> u, int b) => v(u, '0110101100111', b);
+
+@pragma('dart2js:noInline')
+f_011_010_110_100_1(Set<String> u, int b) => v(u, '0110101101001', b);
+
+@pragma('dart2js:noInline')
+f_011_010_110_101_1(Set<String> u, int b) => v(u, '0110101101011', b);
+
+@pragma('dart2js:noInline')
+f_011_010_110_110_1(Set<String> u, int b) => v(u, '0110101101101', b);
+
+@pragma('dart2js:noInline')
+f_011_010_110_111_1(Set<String> u, int b) => v(u, '0110101101111', b);
+
+@pragma('dart2js:noInline')
+f_011_010_111_000_1(Set<String> u, int b) => v(u, '0110101110001', b);
+
+@pragma('dart2js:noInline')
+f_011_010_111_001_1(Set<String> u, int b) => v(u, '0110101110011', b);
+
+@pragma('dart2js:noInline')
+f_011_010_111_010_1(Set<String> u, int b) => v(u, '0110101110101', b);
+
+@pragma('dart2js:noInline')
+f_011_010_111_011_1(Set<String> u, int b) => v(u, '0110101110111', b);
+
+@pragma('dart2js:noInline')
+f_011_010_111_100_1(Set<String> u, int b) => v(u, '0110101111001', b);
+
+@pragma('dart2js:noInline')
+f_011_010_111_101_1(Set<String> u, int b) => v(u, '0110101111011', b);
+
+@pragma('dart2js:noInline')
+f_011_010_111_110_1(Set<String> u, int b) => v(u, '0110101111101', b);
+
+@pragma('dart2js:noInline')
+f_011_010_111_111_1(Set<String> u, int b) => v(u, '0110101111111', b);
+
+@pragma('dart2js:noInline')
+f_011_011_000_000_1(Set<String> u, int b) => v(u, '0110110000001', b);
+
+@pragma('dart2js:noInline')
+f_011_011_000_001_1(Set<String> u, int b) => v(u, '0110110000011', b);
+
+@pragma('dart2js:noInline')
+f_011_011_000_010_1(Set<String> u, int b) => v(u, '0110110000101', b);
+
+@pragma('dart2js:noInline')
+f_011_011_000_011_1(Set<String> u, int b) => v(u, '0110110000111', b);
+
+@pragma('dart2js:noInline')
+f_011_011_000_100_1(Set<String> u, int b) => v(u, '0110110001001', b);
+
+@pragma('dart2js:noInline')
+f_011_011_000_101_1(Set<String> u, int b) => v(u, '0110110001011', b);
+
+@pragma('dart2js:noInline')
+f_011_011_000_110_1(Set<String> u, int b) => v(u, '0110110001101', b);
+
+@pragma('dart2js:noInline')
+f_011_011_000_111_1(Set<String> u, int b) => v(u, '0110110001111', b);
+
+@pragma('dart2js:noInline')
+f_011_011_001_000_1(Set<String> u, int b) => v(u, '0110110010001', b);
+
+@pragma('dart2js:noInline')
+f_011_011_001_001_1(Set<String> u, int b) => v(u, '0110110010011', b);
+
+@pragma('dart2js:noInline')
+f_011_011_001_010_1(Set<String> u, int b) => v(u, '0110110010101', b);
+
+@pragma('dart2js:noInline')
+f_011_011_001_011_1(Set<String> u, int b) => v(u, '0110110010111', b);
+
+@pragma('dart2js:noInline')
+f_011_011_001_100_1(Set<String> u, int b) => v(u, '0110110011001', b);
+
+@pragma('dart2js:noInline')
+f_011_011_001_101_1(Set<String> u, int b) => v(u, '0110110011011', b);
+
+@pragma('dart2js:noInline')
+f_011_011_001_110_1(Set<String> u, int b) => v(u, '0110110011101', b);
+
+@pragma('dart2js:noInline')
+f_011_011_001_111_1(Set<String> u, int b) => v(u, '0110110011111', b);
+
+@pragma('dart2js:noInline')
+f_011_011_010_000_1(Set<String> u, int b) => v(u, '0110110100001', b);
+
+@pragma('dart2js:noInline')
+f_011_011_010_001_1(Set<String> u, int b) => v(u, '0110110100011', b);
+
+@pragma('dart2js:noInline')
+f_011_011_010_010_1(Set<String> u, int b) => v(u, '0110110100101', b);
+
+@pragma('dart2js:noInline')
+f_011_011_010_011_1(Set<String> u, int b) => v(u, '0110110100111', b);
+
+@pragma('dart2js:noInline')
+f_011_011_010_100_1(Set<String> u, int b) => v(u, '0110110101001', b);
+
+@pragma('dart2js:noInline')
+f_011_011_010_101_1(Set<String> u, int b) => v(u, '0110110101011', b);
+
+@pragma('dart2js:noInline')
+f_011_011_010_110_1(Set<String> u, int b) => v(u, '0110110101101', b);
+
+@pragma('dart2js:noInline')
+f_011_011_010_111_1(Set<String> u, int b) => v(u, '0110110101111', b);
+
+@pragma('dart2js:noInline')
+f_011_011_011_000_1(Set<String> u, int b) => v(u, '0110110110001', b);
+
+@pragma('dart2js:noInline')
+f_011_011_011_001_1(Set<String> u, int b) => v(u, '0110110110011', b);
+
+@pragma('dart2js:noInline')
+f_011_011_011_010_1(Set<String> u, int b) => v(u, '0110110110101', b);
+
+@pragma('dart2js:noInline')
+f_011_011_011_011_1(Set<String> u, int b) => v(u, '0110110110111', b);
+
+@pragma('dart2js:noInline')
+f_011_011_011_100_1(Set<String> u, int b) => v(u, '0110110111001', b);
+
+@pragma('dart2js:noInline')
+f_011_011_011_101_1(Set<String> u, int b) => v(u, '0110110111011', b);
+
+@pragma('dart2js:noInline')
+f_011_011_011_110_1(Set<String> u, int b) => v(u, '0110110111101', b);
+
+@pragma('dart2js:noInline')
+f_011_011_011_111_1(Set<String> u, int b) => v(u, '0110110111111', b);
+
+@pragma('dart2js:noInline')
+f_011_011_100_000_1(Set<String> u, int b) => v(u, '0110111000001', b);
+
+@pragma('dart2js:noInline')
+f_011_011_100_001_1(Set<String> u, int b) => v(u, '0110111000011', b);
+
+@pragma('dart2js:noInline')
+f_011_011_100_010_1(Set<String> u, int b) => v(u, '0110111000101', b);
+
+@pragma('dart2js:noInline')
+f_011_011_100_011_1(Set<String> u, int b) => v(u, '0110111000111', b);
+
+@pragma('dart2js:noInline')
+f_011_011_100_100_1(Set<String> u, int b) => v(u, '0110111001001', b);
+
+@pragma('dart2js:noInline')
+f_011_011_100_101_1(Set<String> u, int b) => v(u, '0110111001011', b);
+
+@pragma('dart2js:noInline')
+f_011_011_100_110_1(Set<String> u, int b) => v(u, '0110111001101', b);
+
+@pragma('dart2js:noInline')
+f_011_011_100_111_1(Set<String> u, int b) => v(u, '0110111001111', b);
+
+@pragma('dart2js:noInline')
+f_011_011_101_000_1(Set<String> u, int b) => v(u, '0110111010001', b);
+
+@pragma('dart2js:noInline')
+f_011_011_101_001_1(Set<String> u, int b) => v(u, '0110111010011', b);
+
+@pragma('dart2js:noInline')
+f_011_011_101_010_1(Set<String> u, int b) => v(u, '0110111010101', b);
+
+@pragma('dart2js:noInline')
+f_011_011_101_011_1(Set<String> u, int b) => v(u, '0110111010111', b);
+
+@pragma('dart2js:noInline')
+f_011_011_101_100_1(Set<String> u, int b) => v(u, '0110111011001', b);
+
+@pragma('dart2js:noInline')
+f_011_011_101_101_1(Set<String> u, int b) => v(u, '0110111011011', b);
+
+@pragma('dart2js:noInline')
+f_011_011_101_110_1(Set<String> u, int b) => v(u, '0110111011101', b);
+
+@pragma('dart2js:noInline')
+f_011_011_101_111_1(Set<String> u, int b) => v(u, '0110111011111', b);
+
+@pragma('dart2js:noInline')
+f_011_011_110_000_1(Set<String> u, int b) => v(u, '0110111100001', b);
+
+@pragma('dart2js:noInline')
+f_011_011_110_001_1(Set<String> u, int b) => v(u, '0110111100011', b);
+
+@pragma('dart2js:noInline')
+f_011_011_110_010_1(Set<String> u, int b) => v(u, '0110111100101', b);
+
+@pragma('dart2js:noInline')
+f_011_011_110_011_1(Set<String> u, int b) => v(u, '0110111100111', b);
+
+@pragma('dart2js:noInline')
+f_011_011_110_100_1(Set<String> u, int b) => v(u, '0110111101001', b);
+
+@pragma('dart2js:noInline')
+f_011_011_110_101_1(Set<String> u, int b) => v(u, '0110111101011', b);
+
+@pragma('dart2js:noInline')
+f_011_011_110_110_1(Set<String> u, int b) => v(u, '0110111101101', b);
+
+@pragma('dart2js:noInline')
+f_011_011_110_111_1(Set<String> u, int b) => v(u, '0110111101111', b);
+
+@pragma('dart2js:noInline')
+f_011_011_111_000_1(Set<String> u, int b) => v(u, '0110111110001', b);
+
+@pragma('dart2js:noInline')
+f_011_011_111_001_1(Set<String> u, int b) => v(u, '0110111110011', b);
+
+@pragma('dart2js:noInline')
+f_011_011_111_010_1(Set<String> u, int b) => v(u, '0110111110101', b);
+
+@pragma('dart2js:noInline')
+f_011_011_111_011_1(Set<String> u, int b) => v(u, '0110111110111', b);
+
+@pragma('dart2js:noInline')
+f_011_011_111_100_1(Set<String> u, int b) => v(u, '0110111111001', b);
+
+@pragma('dart2js:noInline')
+f_011_011_111_101_1(Set<String> u, int b) => v(u, '0110111111011', b);
+
+@pragma('dart2js:noInline')
+f_011_011_111_110_1(Set<String> u, int b) => v(u, '0110111111101', b);
+
+@pragma('dart2js:noInline')
+f_011_011_111_111_1(Set<String> u, int b) => v(u, '0110111111111', b);
+
+@pragma('dart2js:noInline')
+f_011_100_000_000_1(Set<String> u, int b) => v(u, '0111000000001', b);
+
+@pragma('dart2js:noInline')
+f_011_100_000_001_1(Set<String> u, int b) => v(u, '0111000000011', b);
+
+@pragma('dart2js:noInline')
+f_011_100_000_010_1(Set<String> u, int b) => v(u, '0111000000101', b);
+
+@pragma('dart2js:noInline')
+f_011_100_000_011_1(Set<String> u, int b) => v(u, '0111000000111', b);
+
+@pragma('dart2js:noInline')
+f_011_100_000_100_1(Set<String> u, int b) => v(u, '0111000001001', b);
+
+@pragma('dart2js:noInline')
+f_011_100_000_101_1(Set<String> u, int b) => v(u, '0111000001011', b);
+
+@pragma('dart2js:noInline')
+f_011_100_000_110_1(Set<String> u, int b) => v(u, '0111000001101', b);
+
+@pragma('dart2js:noInline')
+f_011_100_000_111_1(Set<String> u, int b) => v(u, '0111000001111', b);
+
+@pragma('dart2js:noInline')
+f_011_100_001_000_1(Set<String> u, int b) => v(u, '0111000010001', b);
+
+@pragma('dart2js:noInline')
+f_011_100_001_001_1(Set<String> u, int b) => v(u, '0111000010011', b);
+
+@pragma('dart2js:noInline')
+f_011_100_001_010_1(Set<String> u, int b) => v(u, '0111000010101', b);
+
+@pragma('dart2js:noInline')
+f_011_100_001_011_1(Set<String> u, int b) => v(u, '0111000010111', b);
+
+@pragma('dart2js:noInline')
+f_011_100_001_100_1(Set<String> u, int b) => v(u, '0111000011001', b);
+
+@pragma('dart2js:noInline')
+f_011_100_001_101_1(Set<String> u, int b) => v(u, '0111000011011', b);
+
+@pragma('dart2js:noInline')
+f_011_100_001_110_1(Set<String> u, int b) => v(u, '0111000011101', b);
+
+@pragma('dart2js:noInline')
+f_011_100_001_111_1(Set<String> u, int b) => v(u, '0111000011111', b);
+
+@pragma('dart2js:noInline')
+f_011_100_010_000_1(Set<String> u, int b) => v(u, '0111000100001', b);
+
+@pragma('dart2js:noInline')
+f_011_100_010_001_1(Set<String> u, int b) => v(u, '0111000100011', b);
+
+@pragma('dart2js:noInline')
+f_011_100_010_010_1(Set<String> u, int b) => v(u, '0111000100101', b);
+
+@pragma('dart2js:noInline')
+f_011_100_010_011_1(Set<String> u, int b) => v(u, '0111000100111', b);
+
+@pragma('dart2js:noInline')
+f_011_100_010_100_1(Set<String> u, int b) => v(u, '0111000101001', b);
+
+@pragma('dart2js:noInline')
+f_011_100_010_101_1(Set<String> u, int b) => v(u, '0111000101011', b);
+
+@pragma('dart2js:noInline')
+f_011_100_010_110_1(Set<String> u, int b) => v(u, '0111000101101', b);
+
+@pragma('dart2js:noInline')
+f_011_100_010_111_1(Set<String> u, int b) => v(u, '0111000101111', b);
+
+@pragma('dart2js:noInline')
+f_011_100_011_000_1(Set<String> u, int b) => v(u, '0111000110001', b);
+
+@pragma('dart2js:noInline')
+f_011_100_011_001_1(Set<String> u, int b) => v(u, '0111000110011', b);
+
+@pragma('dart2js:noInline')
+f_011_100_011_010_1(Set<String> u, int b) => v(u, '0111000110101', b);
+
+@pragma('dart2js:noInline')
+f_011_100_011_011_1(Set<String> u, int b) => v(u, '0111000110111', b);
+
+@pragma('dart2js:noInline')
+f_011_100_011_100_1(Set<String> u, int b) => v(u, '0111000111001', b);
+
+@pragma('dart2js:noInline')
+f_011_100_011_101_1(Set<String> u, int b) => v(u, '0111000111011', b);
+
+@pragma('dart2js:noInline')
+f_011_100_011_110_1(Set<String> u, int b) => v(u, '0111000111101', b);
+
+@pragma('dart2js:noInline')
+f_011_100_011_111_1(Set<String> u, int b) => v(u, '0111000111111', b);
+
+@pragma('dart2js:noInline')
+f_011_100_100_000_1(Set<String> u, int b) => v(u, '0111001000001', b);
+
+@pragma('dart2js:noInline')
+f_011_100_100_001_1(Set<String> u, int b) => v(u, '0111001000011', b);
+
+@pragma('dart2js:noInline')
+f_011_100_100_010_1(Set<String> u, int b) => v(u, '0111001000101', b);
+
+@pragma('dart2js:noInline')
+f_011_100_100_011_1(Set<String> u, int b) => v(u, '0111001000111', b);
+
+@pragma('dart2js:noInline')
+f_011_100_100_100_1(Set<String> u, int b) => v(u, '0111001001001', b);
+
+@pragma('dart2js:noInline')
+f_011_100_100_101_1(Set<String> u, int b) => v(u, '0111001001011', b);
+
+@pragma('dart2js:noInline')
+f_011_100_100_110_1(Set<String> u, int b) => v(u, '0111001001101', b);
+
+@pragma('dart2js:noInline')
+f_011_100_100_111_1(Set<String> u, int b) => v(u, '0111001001111', b);
+
+@pragma('dart2js:noInline')
+f_011_100_101_000_1(Set<String> u, int b) => v(u, '0111001010001', b);
+
+@pragma('dart2js:noInline')
+f_011_100_101_001_1(Set<String> u, int b) => v(u, '0111001010011', b);
+
+@pragma('dart2js:noInline')
+f_011_100_101_010_1(Set<String> u, int b) => v(u, '0111001010101', b);
+
+@pragma('dart2js:noInline')
+f_011_100_101_011_1(Set<String> u, int b) => v(u, '0111001010111', b);
+
+@pragma('dart2js:noInline')
+f_011_100_101_100_1(Set<String> u, int b) => v(u, '0111001011001', b);
+
+@pragma('dart2js:noInline')
+f_011_100_101_101_1(Set<String> u, int b) => v(u, '0111001011011', b);
+
+@pragma('dart2js:noInline')
+f_011_100_101_110_1(Set<String> u, int b) => v(u, '0111001011101', b);
+
+@pragma('dart2js:noInline')
+f_011_100_101_111_1(Set<String> u, int b) => v(u, '0111001011111', b);
+
+@pragma('dart2js:noInline')
+f_011_100_110_000_1(Set<String> u, int b) => v(u, '0111001100001', b);
+
+@pragma('dart2js:noInline')
+f_011_100_110_001_1(Set<String> u, int b) => v(u, '0111001100011', b);
+
+@pragma('dart2js:noInline')
+f_011_100_110_010_1(Set<String> u, int b) => v(u, '0111001100101', b);
+
+@pragma('dart2js:noInline')
+f_011_100_110_011_1(Set<String> u, int b) => v(u, '0111001100111', b);
+
+@pragma('dart2js:noInline')
+f_011_100_110_100_1(Set<String> u, int b) => v(u, '0111001101001', b);
+
+@pragma('dart2js:noInline')
+f_011_100_110_101_1(Set<String> u, int b) => v(u, '0111001101011', b);
+
+@pragma('dart2js:noInline')
+f_011_100_110_110_1(Set<String> u, int b) => v(u, '0111001101101', b);
+
+@pragma('dart2js:noInline')
+f_011_100_110_111_1(Set<String> u, int b) => v(u, '0111001101111', b);
+
+@pragma('dart2js:noInline')
+f_011_100_111_000_1(Set<String> u, int b) => v(u, '0111001110001', b);
+
+@pragma('dart2js:noInline')
+f_011_100_111_001_1(Set<String> u, int b) => v(u, '0111001110011', b);
+
+@pragma('dart2js:noInline')
+f_011_100_111_010_1(Set<String> u, int b) => v(u, '0111001110101', b);
+
+@pragma('dart2js:noInline')
+f_011_100_111_011_1(Set<String> u, int b) => v(u, '0111001110111', b);
+
+@pragma('dart2js:noInline')
+f_011_100_111_100_1(Set<String> u, int b) => v(u, '0111001111001', b);
+
+@pragma('dart2js:noInline')
+f_011_100_111_101_1(Set<String> u, int b) => v(u, '0111001111011', b);
+
+@pragma('dart2js:noInline')
+f_011_100_111_110_1(Set<String> u, int b) => v(u, '0111001111101', b);
+
+@pragma('dart2js:noInline')
+f_011_100_111_111_1(Set<String> u, int b) => v(u, '0111001111111', b);
+
+@pragma('dart2js:noInline')
+f_011_101_000_000_1(Set<String> u, int b) => v(u, '0111010000001', b);
+
+@pragma('dart2js:noInline')
+f_011_101_000_001_1(Set<String> u, int b) => v(u, '0111010000011', b);
+
+@pragma('dart2js:noInline')
+f_011_101_000_010_1(Set<String> u, int b) => v(u, '0111010000101', b);
+
+@pragma('dart2js:noInline')
+f_011_101_000_011_1(Set<String> u, int b) => v(u, '0111010000111', b);
+
+@pragma('dart2js:noInline')
+f_011_101_000_100_1(Set<String> u, int b) => v(u, '0111010001001', b);
+
+@pragma('dart2js:noInline')
+f_011_101_000_101_1(Set<String> u, int b) => v(u, '0111010001011', b);
+
+@pragma('dart2js:noInline')
+f_011_101_000_110_1(Set<String> u, int b) => v(u, '0111010001101', b);
+
+@pragma('dart2js:noInline')
+f_011_101_000_111_1(Set<String> u, int b) => v(u, '0111010001111', b);
+
+@pragma('dart2js:noInline')
+f_011_101_001_000_1(Set<String> u, int b) => v(u, '0111010010001', b);
+
+@pragma('dart2js:noInline')
+f_011_101_001_001_1(Set<String> u, int b) => v(u, '0111010010011', b);
+
+@pragma('dart2js:noInline')
+f_011_101_001_010_1(Set<String> u, int b) => v(u, '0111010010101', b);
+
+@pragma('dart2js:noInline')
+f_011_101_001_011_1(Set<String> u, int b) => v(u, '0111010010111', b);
+
+@pragma('dart2js:noInline')
+f_011_101_001_100_1(Set<String> u, int b) => v(u, '0111010011001', b);
+
+@pragma('dart2js:noInline')
+f_011_101_001_101_1(Set<String> u, int b) => v(u, '0111010011011', b);
+
+@pragma('dart2js:noInline')
+f_011_101_001_110_1(Set<String> u, int b) => v(u, '0111010011101', b);
+
+@pragma('dart2js:noInline')
+f_011_101_001_111_1(Set<String> u, int b) => v(u, '0111010011111', b);
+
+@pragma('dart2js:noInline')
+f_011_101_010_000_1(Set<String> u, int b) => v(u, '0111010100001', b);
+
+@pragma('dart2js:noInline')
+f_011_101_010_001_1(Set<String> u, int b) => v(u, '0111010100011', b);
+
+@pragma('dart2js:noInline')
+f_011_101_010_010_1(Set<String> u, int b) => v(u, '0111010100101', b);
+
+@pragma('dart2js:noInline')
+f_011_101_010_011_1(Set<String> u, int b) => v(u, '0111010100111', b);
+
+@pragma('dart2js:noInline')
+f_011_101_010_100_1(Set<String> u, int b) => v(u, '0111010101001', b);
+
+@pragma('dart2js:noInline')
+f_011_101_010_101_1(Set<String> u, int b) => v(u, '0111010101011', b);
+
+@pragma('dart2js:noInline')
+f_011_101_010_110_1(Set<String> u, int b) => v(u, '0111010101101', b);
+
+@pragma('dart2js:noInline')
+f_011_101_010_111_1(Set<String> u, int b) => v(u, '0111010101111', b);
+
+@pragma('dart2js:noInline')
+f_011_101_011_000_1(Set<String> u, int b) => v(u, '0111010110001', b);
+
+@pragma('dart2js:noInline')
+f_011_101_011_001_1(Set<String> u, int b) => v(u, '0111010110011', b);
+
+@pragma('dart2js:noInline')
+f_011_101_011_010_1(Set<String> u, int b) => v(u, '0111010110101', b);
+
+@pragma('dart2js:noInline')
+f_011_101_011_011_1(Set<String> u, int b) => v(u, '0111010110111', b);
+
+@pragma('dart2js:noInline')
+f_011_101_011_100_1(Set<String> u, int b) => v(u, '0111010111001', b);
+
+@pragma('dart2js:noInline')
+f_011_101_011_101_1(Set<String> u, int b) => v(u, '0111010111011', b);
+
+@pragma('dart2js:noInline')
+f_011_101_011_110_1(Set<String> u, int b) => v(u, '0111010111101', b);
+
+@pragma('dart2js:noInline')
+f_011_101_011_111_1(Set<String> u, int b) => v(u, '0111010111111', b);
+
+@pragma('dart2js:noInline')
+f_011_101_100_000_1(Set<String> u, int b) => v(u, '0111011000001', b);
+
+@pragma('dart2js:noInline')
+f_011_101_100_001_1(Set<String> u, int b) => v(u, '0111011000011', b);
+
+@pragma('dart2js:noInline')
+f_011_101_100_010_1(Set<String> u, int b) => v(u, '0111011000101', b);
+
+@pragma('dart2js:noInline')
+f_011_101_100_011_1(Set<String> u, int b) => v(u, '0111011000111', b);
+
+@pragma('dart2js:noInline')
+f_011_101_100_100_1(Set<String> u, int b) => v(u, '0111011001001', b);
+
+@pragma('dart2js:noInline')
+f_011_101_100_101_1(Set<String> u, int b) => v(u, '0111011001011', b);
+
+@pragma('dart2js:noInline')
+f_011_101_100_110_1(Set<String> u, int b) => v(u, '0111011001101', b);
+
+@pragma('dart2js:noInline')
+f_011_101_100_111_1(Set<String> u, int b) => v(u, '0111011001111', b);
+
+@pragma('dart2js:noInline')
+f_011_101_101_000_1(Set<String> u, int b) => v(u, '0111011010001', b);
+
+@pragma('dart2js:noInline')
+f_011_101_101_001_1(Set<String> u, int b) => v(u, '0111011010011', b);
+
+@pragma('dart2js:noInline')
+f_011_101_101_010_1(Set<String> u, int b) => v(u, '0111011010101', b);
+
+@pragma('dart2js:noInline')
+f_011_101_101_011_1(Set<String> u, int b) => v(u, '0111011010111', b);
+
+@pragma('dart2js:noInline')
+f_011_101_101_100_1(Set<String> u, int b) => v(u, '0111011011001', b);
+
+@pragma('dart2js:noInline')
+f_011_101_101_101_1(Set<String> u, int b) => v(u, '0111011011011', b);
+
+@pragma('dart2js:noInline')
+f_011_101_101_110_1(Set<String> u, int b) => v(u, '0111011011101', b);
+
+@pragma('dart2js:noInline')
+f_011_101_101_111_1(Set<String> u, int b) => v(u, '0111011011111', b);
+
+@pragma('dart2js:noInline')
+f_011_101_110_000_1(Set<String> u, int b) => v(u, '0111011100001', b);
+
+@pragma('dart2js:noInline')
+f_011_101_110_001_1(Set<String> u, int b) => v(u, '0111011100011', b);
+
+@pragma('dart2js:noInline')
+f_011_101_110_010_1(Set<String> u, int b) => v(u, '0111011100101', b);
+
+@pragma('dart2js:noInline')
+f_011_101_110_011_1(Set<String> u, int b) => v(u, '0111011100111', b);
+
+@pragma('dart2js:noInline')
+f_011_101_110_100_1(Set<String> u, int b) => v(u, '0111011101001', b);
+
+@pragma('dart2js:noInline')
+f_011_101_110_101_1(Set<String> u, int b) => v(u, '0111011101011', b);
+
+@pragma('dart2js:noInline')
+f_011_101_110_110_1(Set<String> u, int b) => v(u, '0111011101101', b);
+
+@pragma('dart2js:noInline')
+f_011_101_110_111_1(Set<String> u, int b) => v(u, '0111011101111', b);
+
+@pragma('dart2js:noInline')
+f_011_101_111_000_1(Set<String> u, int b) => v(u, '0111011110001', b);
+
+@pragma('dart2js:noInline')
+f_011_101_111_001_1(Set<String> u, int b) => v(u, '0111011110011', b);
+
+@pragma('dart2js:noInline')
+f_011_101_111_010_1(Set<String> u, int b) => v(u, '0111011110101', b);
+
+@pragma('dart2js:noInline')
+f_011_101_111_011_1(Set<String> u, int b) => v(u, '0111011110111', b);
+
+@pragma('dart2js:noInline')
+f_011_101_111_100_1(Set<String> u, int b) => v(u, '0111011111001', b);
+
+@pragma('dart2js:noInline')
+f_011_101_111_101_1(Set<String> u, int b) => v(u, '0111011111011', b);
+
+@pragma('dart2js:noInline')
+f_011_101_111_110_1(Set<String> u, int b) => v(u, '0111011111101', b);
+
+@pragma('dart2js:noInline')
+f_011_101_111_111_1(Set<String> u, int b) => v(u, '0111011111111', b);
+
+@pragma('dart2js:noInline')
+f_011_110_000_000_1(Set<String> u, int b) => v(u, '0111100000001', b);
+
+@pragma('dart2js:noInline')
+f_011_110_000_001_1(Set<String> u, int b) => v(u, '0111100000011', b);
+
+@pragma('dart2js:noInline')
+f_011_110_000_010_1(Set<String> u, int b) => v(u, '0111100000101', b);
+
+@pragma('dart2js:noInline')
+f_011_110_000_011_1(Set<String> u, int b) => v(u, '0111100000111', b);
+
+@pragma('dart2js:noInline')
+f_011_110_000_100_1(Set<String> u, int b) => v(u, '0111100001001', b);
+
+@pragma('dart2js:noInline')
+f_011_110_000_101_1(Set<String> u, int b) => v(u, '0111100001011', b);
+
+@pragma('dart2js:noInline')
+f_011_110_000_110_1(Set<String> u, int b) => v(u, '0111100001101', b);
+
+@pragma('dart2js:noInline')
+f_011_110_000_111_1(Set<String> u, int b) => v(u, '0111100001111', b);
+
+@pragma('dart2js:noInline')
+f_011_110_001_000_1(Set<String> u, int b) => v(u, '0111100010001', b);
+
+@pragma('dart2js:noInline')
+f_011_110_001_001_1(Set<String> u, int b) => v(u, '0111100010011', b);
+
+@pragma('dart2js:noInline')
+f_011_110_001_010_1(Set<String> u, int b) => v(u, '0111100010101', b);
+
+@pragma('dart2js:noInline')
+f_011_110_001_011_1(Set<String> u, int b) => v(u, '0111100010111', b);
+
+@pragma('dart2js:noInline')
+f_011_110_001_100_1(Set<String> u, int b) => v(u, '0111100011001', b);
+
+@pragma('dart2js:noInline')
+f_011_110_001_101_1(Set<String> u, int b) => v(u, '0111100011011', b);
+
+@pragma('dart2js:noInline')
+f_011_110_001_110_1(Set<String> u, int b) => v(u, '0111100011101', b);
+
+@pragma('dart2js:noInline')
+f_011_110_001_111_1(Set<String> u, int b) => v(u, '0111100011111', b);
+
+@pragma('dart2js:noInline')
+f_011_110_010_000_1(Set<String> u, int b) => v(u, '0111100100001', b);
+
+@pragma('dart2js:noInline')
+f_011_110_010_001_1(Set<String> u, int b) => v(u, '0111100100011', b);
+
+@pragma('dart2js:noInline')
+f_011_110_010_010_1(Set<String> u, int b) => v(u, '0111100100101', b);
+
+@pragma('dart2js:noInline')
+f_011_110_010_011_1(Set<String> u, int b) => v(u, '0111100100111', b);
+
+@pragma('dart2js:noInline')
+f_011_110_010_100_1(Set<String> u, int b) => v(u, '0111100101001', b);
+
+@pragma('dart2js:noInline')
+f_011_110_010_101_1(Set<String> u, int b) => v(u, '0111100101011', b);
+
+@pragma('dart2js:noInline')
+f_011_110_010_110_1(Set<String> u, int b) => v(u, '0111100101101', b);
+
+@pragma('dart2js:noInline')
+f_011_110_010_111_1(Set<String> u, int b) => v(u, '0111100101111', b);
+
+@pragma('dart2js:noInline')
+f_011_110_011_000_1(Set<String> u, int b) => v(u, '0111100110001', b);
+
+@pragma('dart2js:noInline')
+f_011_110_011_001_1(Set<String> u, int b) => v(u, '0111100110011', b);
+
+@pragma('dart2js:noInline')
+f_011_110_011_010_1(Set<String> u, int b) => v(u, '0111100110101', b);
+
+@pragma('dart2js:noInline')
+f_011_110_011_011_1(Set<String> u, int b) => v(u, '0111100110111', b);
+
+@pragma('dart2js:noInline')
+f_011_110_011_100_1(Set<String> u, int b) => v(u, '0111100111001', b);
+
+@pragma('dart2js:noInline')
+f_011_110_011_101_1(Set<String> u, int b) => v(u, '0111100111011', b);
+
+@pragma('dart2js:noInline')
+f_011_110_011_110_1(Set<String> u, int b) => v(u, '0111100111101', b);
+
+@pragma('dart2js:noInline')
+f_011_110_011_111_1(Set<String> u, int b) => v(u, '0111100111111', b);
+
+@pragma('dart2js:noInline')
+f_011_110_100_000_1(Set<String> u, int b) => v(u, '0111101000001', b);
+
+@pragma('dart2js:noInline')
+f_011_110_100_001_1(Set<String> u, int b) => v(u, '0111101000011', b);
+
+@pragma('dart2js:noInline')
+f_011_110_100_010_1(Set<String> u, int b) => v(u, '0111101000101', b);
+
+@pragma('dart2js:noInline')
+f_011_110_100_011_1(Set<String> u, int b) => v(u, '0111101000111', b);
+
+@pragma('dart2js:noInline')
+f_011_110_100_100_1(Set<String> u, int b) => v(u, '0111101001001', b);
+
+@pragma('dart2js:noInline')
+f_011_110_100_101_1(Set<String> u, int b) => v(u, '0111101001011', b);
+
+@pragma('dart2js:noInline')
+f_011_110_100_110_1(Set<String> u, int b) => v(u, '0111101001101', b);
+
+@pragma('dart2js:noInline')
+f_011_110_100_111_1(Set<String> u, int b) => v(u, '0111101001111', b);
+
+@pragma('dart2js:noInline')
+f_011_110_101_000_1(Set<String> u, int b) => v(u, '0111101010001', b);
+
+@pragma('dart2js:noInline')
+f_011_110_101_001_1(Set<String> u, int b) => v(u, '0111101010011', b);
+
+@pragma('dart2js:noInline')
+f_011_110_101_010_1(Set<String> u, int b) => v(u, '0111101010101', b);
+
+@pragma('dart2js:noInline')
+f_011_110_101_011_1(Set<String> u, int b) => v(u, '0111101010111', b);
+
+@pragma('dart2js:noInline')
+f_011_110_101_100_1(Set<String> u, int b) => v(u, '0111101011001', b);
+
+@pragma('dart2js:noInline')
+f_011_110_101_101_1(Set<String> u, int b) => v(u, '0111101011011', b);
+
+@pragma('dart2js:noInline')
+f_011_110_101_110_1(Set<String> u, int b) => v(u, '0111101011101', b);
+
+@pragma('dart2js:noInline')
+f_011_110_101_111_1(Set<String> u, int b) => v(u, '0111101011111', b);
+
+@pragma('dart2js:noInline')
+f_011_110_110_000_1(Set<String> u, int b) => v(u, '0111101100001', b);
+
+@pragma('dart2js:noInline')
+f_011_110_110_001_1(Set<String> u, int b) => v(u, '0111101100011', b);
+
+@pragma('dart2js:noInline')
+f_011_110_110_010_1(Set<String> u, int b) => v(u, '0111101100101', b);
+
+@pragma('dart2js:noInline')
+f_011_110_110_011_1(Set<String> u, int b) => v(u, '0111101100111', b);
+
+@pragma('dart2js:noInline')
+f_011_110_110_100_1(Set<String> u, int b) => v(u, '0111101101001', b);
+
+@pragma('dart2js:noInline')
+f_011_110_110_101_1(Set<String> u, int b) => v(u, '0111101101011', b);
+
+@pragma('dart2js:noInline')
+f_011_110_110_110_1(Set<String> u, int b) => v(u, '0111101101101', b);
+
+@pragma('dart2js:noInline')
+f_011_110_110_111_1(Set<String> u, int b) => v(u, '0111101101111', b);
+
+@pragma('dart2js:noInline')
+f_011_110_111_000_1(Set<String> u, int b) => v(u, '0111101110001', b);
+
+@pragma('dart2js:noInline')
+f_011_110_111_001_1(Set<String> u, int b) => v(u, '0111101110011', b);
+
+@pragma('dart2js:noInline')
+f_011_110_111_010_1(Set<String> u, int b) => v(u, '0111101110101', b);
+
+@pragma('dart2js:noInline')
+f_011_110_111_011_1(Set<String> u, int b) => v(u, '0111101110111', b);
+
+@pragma('dart2js:noInline')
+f_011_110_111_100_1(Set<String> u, int b) => v(u, '0111101111001', b);
+
+@pragma('dart2js:noInline')
+f_011_110_111_101_1(Set<String> u, int b) => v(u, '0111101111011', b);
+
+@pragma('dart2js:noInline')
+f_011_110_111_110_1(Set<String> u, int b) => v(u, '0111101111101', b);
+
+@pragma('dart2js:noInline')
+f_011_110_111_111_1(Set<String> u, int b) => v(u, '0111101111111', b);
+
+@pragma('dart2js:noInline')
+f_011_111_000_000_1(Set<String> u, int b) => v(u, '0111110000001', b);
+
+@pragma('dart2js:noInline')
+f_011_111_000_001_1(Set<String> u, int b) => v(u, '0111110000011', b);
+
+@pragma('dart2js:noInline')
+f_011_111_000_010_1(Set<String> u, int b) => v(u, '0111110000101', b);
+
+@pragma('dart2js:noInline')
+f_011_111_000_011_1(Set<String> u, int b) => v(u, '0111110000111', b);
+
+@pragma('dart2js:noInline')
+f_011_111_000_100_1(Set<String> u, int b) => v(u, '0111110001001', b);
+
+@pragma('dart2js:noInline')
+f_011_111_000_101_1(Set<String> u, int b) => v(u, '0111110001011', b);
+
+@pragma('dart2js:noInline')
+f_011_111_000_110_1(Set<String> u, int b) => v(u, '0111110001101', b);
+
+@pragma('dart2js:noInline')
+f_011_111_000_111_1(Set<String> u, int b) => v(u, '0111110001111', b);
+
+@pragma('dart2js:noInline')
+f_011_111_001_000_1(Set<String> u, int b) => v(u, '0111110010001', b);
+
+@pragma('dart2js:noInline')
+f_011_111_001_001_1(Set<String> u, int b) => v(u, '0111110010011', b);
+
+@pragma('dart2js:noInline')
+f_011_111_001_010_1(Set<String> u, int b) => v(u, '0111110010101', b);
+
+@pragma('dart2js:noInline')
+f_011_111_001_011_1(Set<String> u, int b) => v(u, '0111110010111', b);
+
+@pragma('dart2js:noInline')
+f_011_111_001_100_1(Set<String> u, int b) => v(u, '0111110011001', b);
+
+@pragma('dart2js:noInline')
+f_011_111_001_101_1(Set<String> u, int b) => v(u, '0111110011011', b);
+
+@pragma('dart2js:noInline')
+f_011_111_001_110_1(Set<String> u, int b) => v(u, '0111110011101', b);
+
+@pragma('dart2js:noInline')
+f_011_111_001_111_1(Set<String> u, int b) => v(u, '0111110011111', b);
+
+@pragma('dart2js:noInline')
+f_011_111_010_000_1(Set<String> u, int b) => v(u, '0111110100001', b);
+
+@pragma('dart2js:noInline')
+f_011_111_010_001_1(Set<String> u, int b) => v(u, '0111110100011', b);
+
+@pragma('dart2js:noInline')
+f_011_111_010_010_1(Set<String> u, int b) => v(u, '0111110100101', b);
+
+@pragma('dart2js:noInline')
+f_011_111_010_011_1(Set<String> u, int b) => v(u, '0111110100111', b);
+
+@pragma('dart2js:noInline')
+f_011_111_010_100_1(Set<String> u, int b) => v(u, '0111110101001', b);
+
+@pragma('dart2js:noInline')
+f_011_111_010_101_1(Set<String> u, int b) => v(u, '0111110101011', b);
+
+@pragma('dart2js:noInline')
+f_011_111_010_110_1(Set<String> u, int b) => v(u, '0111110101101', b);
+
+@pragma('dart2js:noInline')
+f_011_111_010_111_1(Set<String> u, int b) => v(u, '0111110101111', b);
+
+@pragma('dart2js:noInline')
+f_011_111_011_000_1(Set<String> u, int b) => v(u, '0111110110001', b);
+
+@pragma('dart2js:noInline')
+f_011_111_011_001_1(Set<String> u, int b) => v(u, '0111110110011', b);
+
+@pragma('dart2js:noInline')
+f_011_111_011_010_1(Set<String> u, int b) => v(u, '0111110110101', b);
+
+@pragma('dart2js:noInline')
+f_011_111_011_011_1(Set<String> u, int b) => v(u, '0111110110111', b);
+
+@pragma('dart2js:noInline')
+f_011_111_011_100_1(Set<String> u, int b) => v(u, '0111110111001', b);
+
+@pragma('dart2js:noInline')
+f_011_111_011_101_1(Set<String> u, int b) => v(u, '0111110111011', b);
+
+@pragma('dart2js:noInline')
+f_011_111_011_110_1(Set<String> u, int b) => v(u, '0111110111101', b);
+
+@pragma('dart2js:noInline')
+f_011_111_011_111_1(Set<String> u, int b) => v(u, '0111110111111', b);
+
+@pragma('dart2js:noInline')
+f_011_111_100_000_1(Set<String> u, int b) => v(u, '0111111000001', b);
+
+@pragma('dart2js:noInline')
+f_011_111_100_001_1(Set<String> u, int b) => v(u, '0111111000011', b);
+
+@pragma('dart2js:noInline')
+f_011_111_100_010_1(Set<String> u, int b) => v(u, '0111111000101', b);
+
+@pragma('dart2js:noInline')
+f_011_111_100_011_1(Set<String> u, int b) => v(u, '0111111000111', b);
+
+@pragma('dart2js:noInline')
+f_011_111_100_100_1(Set<String> u, int b) => v(u, '0111111001001', b);
+
+@pragma('dart2js:noInline')
+f_011_111_100_101_1(Set<String> u, int b) => v(u, '0111111001011', b);
+
+@pragma('dart2js:noInline')
+f_011_111_100_110_1(Set<String> u, int b) => v(u, '0111111001101', b);
+
+@pragma('dart2js:noInline')
+f_011_111_100_111_1(Set<String> u, int b) => v(u, '0111111001111', b);
+
+@pragma('dart2js:noInline')
+f_011_111_101_000_1(Set<String> u, int b) => v(u, '0111111010001', b);
+
+@pragma('dart2js:noInline')
+f_011_111_101_001_1(Set<String> u, int b) => v(u, '0111111010011', b);
+
+@pragma('dart2js:noInline')
+f_011_111_101_010_1(Set<String> u, int b) => v(u, '0111111010101', b);
+
+@pragma('dart2js:noInline')
+f_011_111_101_011_1(Set<String> u, int b) => v(u, '0111111010111', b);
+
+@pragma('dart2js:noInline')
+f_011_111_101_100_1(Set<String> u, int b) => v(u, '0111111011001', b);
+
+@pragma('dart2js:noInline')
+f_011_111_101_101_1(Set<String> u, int b) => v(u, '0111111011011', b);
+
+@pragma('dart2js:noInline')
+f_011_111_101_110_1(Set<String> u, int b) => v(u, '0111111011101', b);
+
+@pragma('dart2js:noInline')
+f_011_111_101_111_1(Set<String> u, int b) => v(u, '0111111011111', b);
+
+@pragma('dart2js:noInline')
+f_011_111_110_000_1(Set<String> u, int b) => v(u, '0111111100001', b);
+
+@pragma('dart2js:noInline')
+f_011_111_110_001_1(Set<String> u, int b) => v(u, '0111111100011', b);
+
+@pragma('dart2js:noInline')
+f_011_111_110_010_1(Set<String> u, int b) => v(u, '0111111100101', b);
+
+@pragma('dart2js:noInline')
+f_011_111_110_011_1(Set<String> u, int b) => v(u, '0111111100111', b);
+
+@pragma('dart2js:noInline')
+f_011_111_110_100_1(Set<String> u, int b) => v(u, '0111111101001', b);
+
+@pragma('dart2js:noInline')
+f_011_111_110_101_1(Set<String> u, int b) => v(u, '0111111101011', b);
+
+@pragma('dart2js:noInline')
+f_011_111_110_110_1(Set<String> u, int b) => v(u, '0111111101101', b);
+
+@pragma('dart2js:noInline')
+f_011_111_110_111_1(Set<String> u, int b) => v(u, '0111111101111', b);
+
+@pragma('dart2js:noInline')
+f_011_111_111_000_1(Set<String> u, int b) => v(u, '0111111110001', b);
+
+@pragma('dart2js:noInline')
+f_011_111_111_001_1(Set<String> u, int b) => v(u, '0111111110011', b);
+
+@pragma('dart2js:noInline')
+f_011_111_111_010_1(Set<String> u, int b) => v(u, '0111111110101', b);
+
+@pragma('dart2js:noInline')
+f_011_111_111_011_1(Set<String> u, int b) => v(u, '0111111110111', b);
+
+@pragma('dart2js:noInline')
+f_011_111_111_100_1(Set<String> u, int b) => v(u, '0111111111001', b);
+
+@pragma('dart2js:noInline')
+f_011_111_111_101_1(Set<String> u, int b) => v(u, '0111111111011', b);
+
+@pragma('dart2js:noInline')
+f_011_111_111_110_1(Set<String> u, int b) => v(u, '0111111111101', b);
+
+@pragma('dart2js:noInline')
+f_011_111_111_111_1(Set<String> u, int b) => v(u, '0111111111111', b);
+
+@pragma('dart2js:noInline')
+f_100_000_000_000_1(Set<String> u, int b) => v(u, '1000000000001', b);
+
+@pragma('dart2js:noInline')
+f_100_000_000_001_1(Set<String> u, int b) => v(u, '1000000000011', b);
+
+@pragma('dart2js:noInline')
+f_100_000_000_010_1(Set<String> u, int b) => v(u, '1000000000101', b);
+
+@pragma('dart2js:noInline')
+f_100_000_000_011_1(Set<String> u, int b) => v(u, '1000000000111', b);
+
+@pragma('dart2js:noInline')
+f_100_000_000_100_1(Set<String> u, int b) => v(u, '1000000001001', b);
+
+@pragma('dart2js:noInline')
+f_100_000_000_101_1(Set<String> u, int b) => v(u, '1000000001011', b);
+
+@pragma('dart2js:noInline')
+f_100_000_000_110_1(Set<String> u, int b) => v(u, '1000000001101', b);
+
+@pragma('dart2js:noInline')
+f_100_000_000_111_1(Set<String> u, int b) => v(u, '1000000001111', b);
+
+@pragma('dart2js:noInline')
+f_100_000_001_000_1(Set<String> u, int b) => v(u, '1000000010001', b);
+
+@pragma('dart2js:noInline')
+f_100_000_001_001_1(Set<String> u, int b) => v(u, '1000000010011', b);
+
+@pragma('dart2js:noInline')
+f_100_000_001_010_1(Set<String> u, int b) => v(u, '1000000010101', b);
+
+@pragma('dart2js:noInline')
+f_100_000_001_011_1(Set<String> u, int b) => v(u, '1000000010111', b);
+
+@pragma('dart2js:noInline')
+f_100_000_001_100_1(Set<String> u, int b) => v(u, '1000000011001', b);
+
+@pragma('dart2js:noInline')
+f_100_000_001_101_1(Set<String> u, int b) => v(u, '1000000011011', b);
+
+@pragma('dart2js:noInline')
+f_100_000_001_110_1(Set<String> u, int b) => v(u, '1000000011101', b);
+
+@pragma('dart2js:noInline')
+f_100_000_001_111_1(Set<String> u, int b) => v(u, '1000000011111', b);
+
+@pragma('dart2js:noInline')
+f_100_000_010_000_1(Set<String> u, int b) => v(u, '1000000100001', b);
+
+@pragma('dart2js:noInline')
+f_100_000_010_001_1(Set<String> u, int b) => v(u, '1000000100011', b);
+
+@pragma('dart2js:noInline')
+f_100_000_010_010_1(Set<String> u, int b) => v(u, '1000000100101', b);
+
+@pragma('dart2js:noInline')
+f_100_000_010_011_1(Set<String> u, int b) => v(u, '1000000100111', b);
+
+@pragma('dart2js:noInline')
+f_100_000_010_100_1(Set<String> u, int b) => v(u, '1000000101001', b);
+
+@pragma('dart2js:noInline')
+f_100_000_010_101_1(Set<String> u, int b) => v(u, '1000000101011', b);
+
+@pragma('dart2js:noInline')
+f_100_000_010_110_1(Set<String> u, int b) => v(u, '1000000101101', b);
+
+@pragma('dart2js:noInline')
+f_100_000_010_111_1(Set<String> u, int b) => v(u, '1000000101111', b);
+
+@pragma('dart2js:noInline')
+f_100_000_011_000_1(Set<String> u, int b) => v(u, '1000000110001', b);
+
+@pragma('dart2js:noInline')
+f_100_000_011_001_1(Set<String> u, int b) => v(u, '1000000110011', b);
+
+@pragma('dart2js:noInline')
+f_100_000_011_010_1(Set<String> u, int b) => v(u, '1000000110101', b);
+
+@pragma('dart2js:noInline')
+f_100_000_011_011_1(Set<String> u, int b) => v(u, '1000000110111', b);
+
+@pragma('dart2js:noInline')
+f_100_000_011_100_1(Set<String> u, int b) => v(u, '1000000111001', b);
+
+@pragma('dart2js:noInline')
+f_100_000_011_101_1(Set<String> u, int b) => v(u, '1000000111011', b);
+
+@pragma('dart2js:noInline')
+f_100_000_011_110_1(Set<String> u, int b) => v(u, '1000000111101', b);
+
+@pragma('dart2js:noInline')
+f_100_000_011_111_1(Set<String> u, int b) => v(u, '1000000111111', b);
+
+@pragma('dart2js:noInline')
+f_100_000_100_000_1(Set<String> u, int b) => v(u, '1000001000001', b);
+
+@pragma('dart2js:noInline')
+f_100_000_100_001_1(Set<String> u, int b) => v(u, '1000001000011', b);
+
+@pragma('dart2js:noInline')
+f_100_000_100_010_1(Set<String> u, int b) => v(u, '1000001000101', b);
+
+@pragma('dart2js:noInline')
+f_100_000_100_011_1(Set<String> u, int b) => v(u, '1000001000111', b);
+
+@pragma('dart2js:noInline')
+f_100_000_100_100_1(Set<String> u, int b) => v(u, '1000001001001', b);
+
+@pragma('dart2js:noInline')
+f_100_000_100_101_1(Set<String> u, int b) => v(u, '1000001001011', b);
+
+@pragma('dart2js:noInline')
+f_100_000_100_110_1(Set<String> u, int b) => v(u, '1000001001101', b);
+
+@pragma('dart2js:noInline')
+f_100_000_100_111_1(Set<String> u, int b) => v(u, '1000001001111', b);
+
+@pragma('dart2js:noInline')
+f_100_000_101_000_1(Set<String> u, int b) => v(u, '1000001010001', b);
+
+@pragma('dart2js:noInline')
+f_100_000_101_001_1(Set<String> u, int b) => v(u, '1000001010011', b);
+
+@pragma('dart2js:noInline')
+f_100_000_101_010_1(Set<String> u, int b) => v(u, '1000001010101', b);
+
+@pragma('dart2js:noInline')
+f_100_000_101_011_1(Set<String> u, int b) => v(u, '1000001010111', b);
+
+@pragma('dart2js:noInline')
+f_100_000_101_100_1(Set<String> u, int b) => v(u, '1000001011001', b);
+
+@pragma('dart2js:noInline')
+f_100_000_101_101_1(Set<String> u, int b) => v(u, '1000001011011', b);
+
+@pragma('dart2js:noInline')
+f_100_000_101_110_1(Set<String> u, int b) => v(u, '1000001011101', b);
+
+@pragma('dart2js:noInline')
+f_100_000_101_111_1(Set<String> u, int b) => v(u, '1000001011111', b);
+
+@pragma('dart2js:noInline')
+f_100_000_110_000_1(Set<String> u, int b) => v(u, '1000001100001', b);
+
+@pragma('dart2js:noInline')
+f_100_000_110_001_1(Set<String> u, int b) => v(u, '1000001100011', b);
+
+@pragma('dart2js:noInline')
+f_100_000_110_010_1(Set<String> u, int b) => v(u, '1000001100101', b);
+
+@pragma('dart2js:noInline')
+f_100_000_110_011_1(Set<String> u, int b) => v(u, '1000001100111', b);
+
+@pragma('dart2js:noInline')
+f_100_000_110_100_1(Set<String> u, int b) => v(u, '1000001101001', b);
+
+@pragma('dart2js:noInline')
+f_100_000_110_101_1(Set<String> u, int b) => v(u, '1000001101011', b);
+
+@pragma('dart2js:noInline')
+f_100_000_110_110_1(Set<String> u, int b) => v(u, '1000001101101', b);
+
+@pragma('dart2js:noInline')
+f_100_000_110_111_1(Set<String> u, int b) => v(u, '1000001101111', b);
+
+@pragma('dart2js:noInline')
+f_100_000_111_000_1(Set<String> u, int b) => v(u, '1000001110001', b);
+
+@pragma('dart2js:noInline')
+f_100_000_111_001_1(Set<String> u, int b) => v(u, '1000001110011', b);
+
+@pragma('dart2js:noInline')
+f_100_000_111_010_1(Set<String> u, int b) => v(u, '1000001110101', b);
+
+@pragma('dart2js:noInline')
+f_100_000_111_011_1(Set<String> u, int b) => v(u, '1000001110111', b);
+
+@pragma('dart2js:noInline')
+f_100_000_111_100_1(Set<String> u, int b) => v(u, '1000001111001', b);
+
+@pragma('dart2js:noInline')
+f_100_000_111_101_1(Set<String> u, int b) => v(u, '1000001111011', b);
+
+@pragma('dart2js:noInline')
+f_100_000_111_110_1(Set<String> u, int b) => v(u, '1000001111101', b);
+
+@pragma('dart2js:noInline')
+f_100_000_111_111_1(Set<String> u, int b) => v(u, '1000001111111', b);
+
+@pragma('dart2js:noInline')
+f_100_001_000_000_1(Set<String> u, int b) => v(u, '1000010000001', b);
+
+@pragma('dart2js:noInline')
+f_100_001_000_001_1(Set<String> u, int b) => v(u, '1000010000011', b);
+
+@pragma('dart2js:noInline')
+f_100_001_000_010_1(Set<String> u, int b) => v(u, '1000010000101', b);
+
+@pragma('dart2js:noInline')
+f_100_001_000_011_1(Set<String> u, int b) => v(u, '1000010000111', b);
+
+@pragma('dart2js:noInline')
+f_100_001_000_100_1(Set<String> u, int b) => v(u, '1000010001001', b);
+
+@pragma('dart2js:noInline')
+f_100_001_000_101_1(Set<String> u, int b) => v(u, '1000010001011', b);
+
+@pragma('dart2js:noInline')
+f_100_001_000_110_1(Set<String> u, int b) => v(u, '1000010001101', b);
+
+@pragma('dart2js:noInline')
+f_100_001_000_111_1(Set<String> u, int b) => v(u, '1000010001111', b);
+
+@pragma('dart2js:noInline')
+f_100_001_001_000_1(Set<String> u, int b) => v(u, '1000010010001', b);
+
+@pragma('dart2js:noInline')
+f_100_001_001_001_1(Set<String> u, int b) => v(u, '1000010010011', b);
+
+@pragma('dart2js:noInline')
+f_100_001_001_010_1(Set<String> u, int b) => v(u, '1000010010101', b);
+
+@pragma('dart2js:noInline')
+f_100_001_001_011_1(Set<String> u, int b) => v(u, '1000010010111', b);
+
+@pragma('dart2js:noInline')
+f_100_001_001_100_1(Set<String> u, int b) => v(u, '1000010011001', b);
+
+@pragma('dart2js:noInline')
+f_100_001_001_101_1(Set<String> u, int b) => v(u, '1000010011011', b);
+
+@pragma('dart2js:noInline')
+f_100_001_001_110_1(Set<String> u, int b) => v(u, '1000010011101', b);
+
+@pragma('dart2js:noInline')
+f_100_001_001_111_1(Set<String> u, int b) => v(u, '1000010011111', b);
+
+@pragma('dart2js:noInline')
+f_100_001_010_000_1(Set<String> u, int b) => v(u, '1000010100001', b);
+
+@pragma('dart2js:noInline')
+f_100_001_010_001_1(Set<String> u, int b) => v(u, '1000010100011', b);
+
+@pragma('dart2js:noInline')
+f_100_001_010_010_1(Set<String> u, int b) => v(u, '1000010100101', b);
+
+@pragma('dart2js:noInline')
+f_100_001_010_011_1(Set<String> u, int b) => v(u, '1000010100111', b);
+
+@pragma('dart2js:noInline')
+f_100_001_010_100_1(Set<String> u, int b) => v(u, '1000010101001', b);
+
+@pragma('dart2js:noInline')
+f_100_001_010_101_1(Set<String> u, int b) => v(u, '1000010101011', b);
+
+@pragma('dart2js:noInline')
+f_100_001_010_110_1(Set<String> u, int b) => v(u, '1000010101101', b);
+
+@pragma('dart2js:noInline')
+f_100_001_010_111_1(Set<String> u, int b) => v(u, '1000010101111', b);
+
+@pragma('dart2js:noInline')
+f_100_001_011_000_1(Set<String> u, int b) => v(u, '1000010110001', b);
+
+@pragma('dart2js:noInline')
+f_100_001_011_001_1(Set<String> u, int b) => v(u, '1000010110011', b);
+
+@pragma('dart2js:noInline')
+f_100_001_011_010_1(Set<String> u, int b) => v(u, '1000010110101', b);
+
+@pragma('dart2js:noInline')
+f_100_001_011_011_1(Set<String> u, int b) => v(u, '1000010110111', b);
+
+@pragma('dart2js:noInline')
+f_100_001_011_100_1(Set<String> u, int b) => v(u, '1000010111001', b);
+
+@pragma('dart2js:noInline')
+f_100_001_011_101_1(Set<String> u, int b) => v(u, '1000010111011', b);
+
+@pragma('dart2js:noInline')
+f_100_001_011_110_1(Set<String> u, int b) => v(u, '1000010111101', b);
+
+@pragma('dart2js:noInline')
+f_100_001_011_111_1(Set<String> u, int b) => v(u, '1000010111111', b);
+
+@pragma('dart2js:noInline')
+f_100_001_100_000_1(Set<String> u, int b) => v(u, '1000011000001', b);
+
+@pragma('dart2js:noInline')
+f_100_001_100_001_1(Set<String> u, int b) => v(u, '1000011000011', b);
+
+@pragma('dart2js:noInline')
+f_100_001_100_010_1(Set<String> u, int b) => v(u, '1000011000101', b);
+
+@pragma('dart2js:noInline')
+f_100_001_100_011_1(Set<String> u, int b) => v(u, '1000011000111', b);
+
+@pragma('dart2js:noInline')
+f_100_001_100_100_1(Set<String> u, int b) => v(u, '1000011001001', b);
+
+@pragma('dart2js:noInline')
+f_100_001_100_101_1(Set<String> u, int b) => v(u, '1000011001011', b);
+
+@pragma('dart2js:noInline')
+f_100_001_100_110_1(Set<String> u, int b) => v(u, '1000011001101', b);
+
+@pragma('dart2js:noInline')
+f_100_001_100_111_1(Set<String> u, int b) => v(u, '1000011001111', b);
+
+@pragma('dart2js:noInline')
+f_100_001_101_000_1(Set<String> u, int b) => v(u, '1000011010001', b);
+
+@pragma('dart2js:noInline')
+f_100_001_101_001_1(Set<String> u, int b) => v(u, '1000011010011', b);
+
+@pragma('dart2js:noInline')
+f_100_001_101_010_1(Set<String> u, int b) => v(u, '1000011010101', b);
+
+@pragma('dart2js:noInline')
+f_100_001_101_011_1(Set<String> u, int b) => v(u, '1000011010111', b);
+
+@pragma('dart2js:noInline')
+f_100_001_101_100_1(Set<String> u, int b) => v(u, '1000011011001', b);
+
+@pragma('dart2js:noInline')
+f_100_001_101_101_1(Set<String> u, int b) => v(u, '1000011011011', b);
+
+@pragma('dart2js:noInline')
+f_100_001_101_110_1(Set<String> u, int b) => v(u, '1000011011101', b);
+
+@pragma('dart2js:noInline')
+f_100_001_101_111_1(Set<String> u, int b) => v(u, '1000011011111', b);
+
+@pragma('dart2js:noInline')
+f_100_001_110_000_1(Set<String> u, int b) => v(u, '1000011100001', b);
+
+@pragma('dart2js:noInline')
+f_100_001_110_001_1(Set<String> u, int b) => v(u, '1000011100011', b);
+
+@pragma('dart2js:noInline')
+f_100_001_110_010_1(Set<String> u, int b) => v(u, '1000011100101', b);
+
+@pragma('dart2js:noInline')
+f_100_001_110_011_1(Set<String> u, int b) => v(u, '1000011100111', b);
+
+@pragma('dart2js:noInline')
+f_100_001_110_100_1(Set<String> u, int b) => v(u, '1000011101001', b);
+
+@pragma('dart2js:noInline')
+f_100_001_110_101_1(Set<String> u, int b) => v(u, '1000011101011', b);
+
+@pragma('dart2js:noInline')
+f_100_001_110_110_1(Set<String> u, int b) => v(u, '1000011101101', b);
+
+@pragma('dart2js:noInline')
+f_100_001_110_111_1(Set<String> u, int b) => v(u, '1000011101111', b);
+
+@pragma('dart2js:noInline')
+f_100_001_111_000_1(Set<String> u, int b) => v(u, '1000011110001', b);
+
+@pragma('dart2js:noInline')
+f_100_001_111_001_1(Set<String> u, int b) => v(u, '1000011110011', b);
+
+@pragma('dart2js:noInline')
+f_100_001_111_010_1(Set<String> u, int b) => v(u, '1000011110101', b);
+
+@pragma('dart2js:noInline')
+f_100_001_111_011_1(Set<String> u, int b) => v(u, '1000011110111', b);
+
+@pragma('dart2js:noInline')
+f_100_001_111_100_1(Set<String> u, int b) => v(u, '1000011111001', b);
+
+@pragma('dart2js:noInline')
+f_100_001_111_101_1(Set<String> u, int b) => v(u, '1000011111011', b);
+
+@pragma('dart2js:noInline')
+f_100_001_111_110_1(Set<String> u, int b) => v(u, '1000011111101', b);
+
+@pragma('dart2js:noInline')
+f_100_001_111_111_1(Set<String> u, int b) => v(u, '1000011111111', b);
+
+@pragma('dart2js:noInline')
+f_100_010_000_000_1(Set<String> u, int b) => v(u, '1000100000001', b);
+
+@pragma('dart2js:noInline')
+f_100_010_000_001_1(Set<String> u, int b) => v(u, '1000100000011', b);
+
+@pragma('dart2js:noInline')
+f_100_010_000_010_1(Set<String> u, int b) => v(u, '1000100000101', b);
+
+@pragma('dart2js:noInline')
+f_100_010_000_011_1(Set<String> u, int b) => v(u, '1000100000111', b);
+
+@pragma('dart2js:noInline')
+f_100_010_000_100_1(Set<String> u, int b) => v(u, '1000100001001', b);
+
+@pragma('dart2js:noInline')
+f_100_010_000_101_1(Set<String> u, int b) => v(u, '1000100001011', b);
+
+@pragma('dart2js:noInline')
+f_100_010_000_110_1(Set<String> u, int b) => v(u, '1000100001101', b);
+
+@pragma('dart2js:noInline')
+f_100_010_000_111_1(Set<String> u, int b) => v(u, '1000100001111', b);
+
+@pragma('dart2js:noInline')
+f_100_010_001_000_1(Set<String> u, int b) => v(u, '1000100010001', b);
+
+@pragma('dart2js:noInline')
+f_100_010_001_001_1(Set<String> u, int b) => v(u, '1000100010011', b);
+
+@pragma('dart2js:noInline')
+f_100_010_001_010_1(Set<String> u, int b) => v(u, '1000100010101', b);
+
+@pragma('dart2js:noInline')
+f_100_010_001_011_1(Set<String> u, int b) => v(u, '1000100010111', b);
+
+@pragma('dart2js:noInline')
+f_100_010_001_100_1(Set<String> u, int b) => v(u, '1000100011001', b);
+
+@pragma('dart2js:noInline')
+f_100_010_001_101_1(Set<String> u, int b) => v(u, '1000100011011', b);
+
+@pragma('dart2js:noInline')
+f_100_010_001_110_1(Set<String> u, int b) => v(u, '1000100011101', b);
+
+@pragma('dart2js:noInline')
+f_100_010_001_111_1(Set<String> u, int b) => v(u, '1000100011111', b);
+
+@pragma('dart2js:noInline')
+f_100_010_010_000_1(Set<String> u, int b) => v(u, '1000100100001', b);
+
+@pragma('dart2js:noInline')
+f_100_010_010_001_1(Set<String> u, int b) => v(u, '1000100100011', b);
+
+@pragma('dart2js:noInline')
+f_100_010_010_010_1(Set<String> u, int b) => v(u, '1000100100101', b);
+
+@pragma('dart2js:noInline')
+f_100_010_010_011_1(Set<String> u, int b) => v(u, '1000100100111', b);
+
+@pragma('dart2js:noInline')
+f_100_010_010_100_1(Set<String> u, int b) => v(u, '1000100101001', b);
+
+@pragma('dart2js:noInline')
+f_100_010_010_101_1(Set<String> u, int b) => v(u, '1000100101011', b);
+
+@pragma('dart2js:noInline')
+f_100_010_010_110_1(Set<String> u, int b) => v(u, '1000100101101', b);
+
+@pragma('dart2js:noInline')
+f_100_010_010_111_1(Set<String> u, int b) => v(u, '1000100101111', b);
+
+@pragma('dart2js:noInline')
+f_100_010_011_000_1(Set<String> u, int b) => v(u, '1000100110001', b);
+
+@pragma('dart2js:noInline')
+f_100_010_011_001_1(Set<String> u, int b) => v(u, '1000100110011', b);
+
+@pragma('dart2js:noInline')
+f_100_010_011_010_1(Set<String> u, int b) => v(u, '1000100110101', b);
+
+@pragma('dart2js:noInline')
+f_100_010_011_011_1(Set<String> u, int b) => v(u, '1000100110111', b);
+
+@pragma('dart2js:noInline')
+f_100_010_011_100_1(Set<String> u, int b) => v(u, '1000100111001', b);
+
+@pragma('dart2js:noInline')
+f_100_010_011_101_1(Set<String> u, int b) => v(u, '1000100111011', b);
+
+@pragma('dart2js:noInline')
+f_100_010_011_110_1(Set<String> u, int b) => v(u, '1000100111101', b);
+
+@pragma('dart2js:noInline')
+f_100_010_011_111_1(Set<String> u, int b) => v(u, '1000100111111', b);
+
+@pragma('dart2js:noInline')
+f_100_010_100_000_1(Set<String> u, int b) => v(u, '1000101000001', b);
+
+@pragma('dart2js:noInline')
+f_100_010_100_001_1(Set<String> u, int b) => v(u, '1000101000011', b);
+
+@pragma('dart2js:noInline')
+f_100_010_100_010_1(Set<String> u, int b) => v(u, '1000101000101', b);
+
+@pragma('dart2js:noInline')
+f_100_010_100_011_1(Set<String> u, int b) => v(u, '1000101000111', b);
+
+@pragma('dart2js:noInline')
+f_100_010_100_100_1(Set<String> u, int b) => v(u, '1000101001001', b);
+
+@pragma('dart2js:noInline')
+f_100_010_100_101_1(Set<String> u, int b) => v(u, '1000101001011', b);
+
+@pragma('dart2js:noInline')
+f_100_010_100_110_1(Set<String> u, int b) => v(u, '1000101001101', b);
+
+@pragma('dart2js:noInline')
+f_100_010_100_111_1(Set<String> u, int b) => v(u, '1000101001111', b);
+
+@pragma('dart2js:noInline')
+f_100_010_101_000_1(Set<String> u, int b) => v(u, '1000101010001', b);
+
+@pragma('dart2js:noInline')
+f_100_010_101_001_1(Set<String> u, int b) => v(u, '1000101010011', b);
+
+@pragma('dart2js:noInline')
+f_100_010_101_010_1(Set<String> u, int b) => v(u, '1000101010101', b);
+
+@pragma('dart2js:noInline')
+f_100_010_101_011_1(Set<String> u, int b) => v(u, '1000101010111', b);
+
+@pragma('dart2js:noInline')
+f_100_010_101_100_1(Set<String> u, int b) => v(u, '1000101011001', b);
+
+@pragma('dart2js:noInline')
+f_100_010_101_101_1(Set<String> u, int b) => v(u, '1000101011011', b);
+
+@pragma('dart2js:noInline')
+f_100_010_101_110_1(Set<String> u, int b) => v(u, '1000101011101', b);
+
+@pragma('dart2js:noInline')
+f_100_010_101_111_1(Set<String> u, int b) => v(u, '1000101011111', b);
+
+@pragma('dart2js:noInline')
+f_100_010_110_000_1(Set<String> u, int b) => v(u, '1000101100001', b);
+
+@pragma('dart2js:noInline')
+f_100_010_110_001_1(Set<String> u, int b) => v(u, '1000101100011', b);
+
+@pragma('dart2js:noInline')
+f_100_010_110_010_1(Set<String> u, int b) => v(u, '1000101100101', b);
+
+@pragma('dart2js:noInline')
+f_100_010_110_011_1(Set<String> u, int b) => v(u, '1000101100111', b);
+
+@pragma('dart2js:noInline')
+f_100_010_110_100_1(Set<String> u, int b) => v(u, '1000101101001', b);
+
+@pragma('dart2js:noInline')
+f_100_010_110_101_1(Set<String> u, int b) => v(u, '1000101101011', b);
+
+@pragma('dart2js:noInline')
+f_100_010_110_110_1(Set<String> u, int b) => v(u, '1000101101101', b);
+
+@pragma('dart2js:noInline')
+f_100_010_110_111_1(Set<String> u, int b) => v(u, '1000101101111', b);
+
+@pragma('dart2js:noInline')
+f_100_010_111_000_1(Set<String> u, int b) => v(u, '1000101110001', b);
+
+@pragma('dart2js:noInline')
+f_100_010_111_001_1(Set<String> u, int b) => v(u, '1000101110011', b);
+
+@pragma('dart2js:noInline')
+f_100_010_111_010_1(Set<String> u, int b) => v(u, '1000101110101', b);
+
+@pragma('dart2js:noInline')
+f_100_010_111_011_1(Set<String> u, int b) => v(u, '1000101110111', b);
+
+@pragma('dart2js:noInline')
+f_100_010_111_100_1(Set<String> u, int b) => v(u, '1000101111001', b);
+
+@pragma('dart2js:noInline')
+f_100_010_111_101_1(Set<String> u, int b) => v(u, '1000101111011', b);
+
+@pragma('dart2js:noInline')
+f_100_010_111_110_1(Set<String> u, int b) => v(u, '1000101111101', b);
+
+@pragma('dart2js:noInline')
+f_100_010_111_111_1(Set<String> u, int b) => v(u, '1000101111111', b);
+
+@pragma('dart2js:noInline')
+f_100_011_000_000_1(Set<String> u, int b) => v(u, '1000110000001', b);
+
+@pragma('dart2js:noInline')
+f_100_011_000_001_1(Set<String> u, int b) => v(u, '1000110000011', b);
+
+@pragma('dart2js:noInline')
+f_100_011_000_010_1(Set<String> u, int b) => v(u, '1000110000101', b);
+
+@pragma('dart2js:noInline')
+f_100_011_000_011_1(Set<String> u, int b) => v(u, '1000110000111', b);
+
+@pragma('dart2js:noInline')
+f_100_011_000_100_1(Set<String> u, int b) => v(u, '1000110001001', b);
+
+@pragma('dart2js:noInline')
+f_100_011_000_101_1(Set<String> u, int b) => v(u, '1000110001011', b);
+
+@pragma('dart2js:noInline')
+f_100_011_000_110_1(Set<String> u, int b) => v(u, '1000110001101', b);
+
+@pragma('dart2js:noInline')
+f_100_011_000_111_1(Set<String> u, int b) => v(u, '1000110001111', b);
+
+@pragma('dart2js:noInline')
+f_100_011_001_000_1(Set<String> u, int b) => v(u, '1000110010001', b);
+
+@pragma('dart2js:noInline')
+f_100_011_001_001_1(Set<String> u, int b) => v(u, '1000110010011', b);
+
+@pragma('dart2js:noInline')
+f_100_011_001_010_1(Set<String> u, int b) => v(u, '1000110010101', b);
+
+@pragma('dart2js:noInline')
+f_100_011_001_011_1(Set<String> u, int b) => v(u, '1000110010111', b);
+
+@pragma('dart2js:noInline')
+f_100_011_001_100_1(Set<String> u, int b) => v(u, '1000110011001', b);
+
+@pragma('dart2js:noInline')
+f_100_011_001_101_1(Set<String> u, int b) => v(u, '1000110011011', b);
+
+@pragma('dart2js:noInline')
+f_100_011_001_110_1(Set<String> u, int b) => v(u, '1000110011101', b);
+
+@pragma('dart2js:noInline')
+f_100_011_001_111_1(Set<String> u, int b) => v(u, '1000110011111', b);
+
+@pragma('dart2js:noInline')
+f_100_011_010_000_1(Set<String> u, int b) => v(u, '1000110100001', b);
+
+@pragma('dart2js:noInline')
+f_100_011_010_001_1(Set<String> u, int b) => v(u, '1000110100011', b);
+
+@pragma('dart2js:noInline')
+f_100_011_010_010_1(Set<String> u, int b) => v(u, '1000110100101', b);
+
+@pragma('dart2js:noInline')
+f_100_011_010_011_1(Set<String> u, int b) => v(u, '1000110100111', b);
+
+@pragma('dart2js:noInline')
+f_100_011_010_100_1(Set<String> u, int b) => v(u, '1000110101001', b);
+
+@pragma('dart2js:noInline')
+f_100_011_010_101_1(Set<String> u, int b) => v(u, '1000110101011', b);
+
+@pragma('dart2js:noInline')
+f_100_011_010_110_1(Set<String> u, int b) => v(u, '1000110101101', b);
+
+@pragma('dart2js:noInline')
+f_100_011_010_111_1(Set<String> u, int b) => v(u, '1000110101111', b);
+
+@pragma('dart2js:noInline')
+f_100_011_011_000_1(Set<String> u, int b) => v(u, '1000110110001', b);
+
+@pragma('dart2js:noInline')
+f_100_011_011_001_1(Set<String> u, int b) => v(u, '1000110110011', b);
+
+@pragma('dart2js:noInline')
+f_100_011_011_010_1(Set<String> u, int b) => v(u, '1000110110101', b);
+
+@pragma('dart2js:noInline')
+f_100_011_011_011_1(Set<String> u, int b) => v(u, '1000110110111', b);
+
+@pragma('dart2js:noInline')
+f_100_011_011_100_1(Set<String> u, int b) => v(u, '1000110111001', b);
+
+@pragma('dart2js:noInline')
+f_100_011_011_101_1(Set<String> u, int b) => v(u, '1000110111011', b);
+
+@pragma('dart2js:noInline')
+f_100_011_011_110_1(Set<String> u, int b) => v(u, '1000110111101', b);
+
+@pragma('dart2js:noInline')
+f_100_011_011_111_1(Set<String> u, int b) => v(u, '1000110111111', b);
+
+@pragma('dart2js:noInline')
+f_100_011_100_000_1(Set<String> u, int b) => v(u, '1000111000001', b);
+
+@pragma('dart2js:noInline')
+f_100_011_100_001_1(Set<String> u, int b) => v(u, '1000111000011', b);
+
+@pragma('dart2js:noInline')
+f_100_011_100_010_1(Set<String> u, int b) => v(u, '1000111000101', b);
+
+@pragma('dart2js:noInline')
+f_100_011_100_011_1(Set<String> u, int b) => v(u, '1000111000111', b);
+
+@pragma('dart2js:noInline')
+f_100_011_100_100_1(Set<String> u, int b) => v(u, '1000111001001', b);
+
+@pragma('dart2js:noInline')
+f_100_011_100_101_1(Set<String> u, int b) => v(u, '1000111001011', b);
+
+@pragma('dart2js:noInline')
+f_100_011_100_110_1(Set<String> u, int b) => v(u, '1000111001101', b);
+
+@pragma('dart2js:noInline')
+f_100_011_100_111_1(Set<String> u, int b) => v(u, '1000111001111', b);
+
+@pragma('dart2js:noInline')
+f_100_011_101_000_1(Set<String> u, int b) => v(u, '1000111010001', b);
+
+@pragma('dart2js:noInline')
+f_100_011_101_001_1(Set<String> u, int b) => v(u, '1000111010011', b);
+
+@pragma('dart2js:noInline')
+f_100_011_101_010_1(Set<String> u, int b) => v(u, '1000111010101', b);
+
+@pragma('dart2js:noInline')
+f_100_011_101_011_1(Set<String> u, int b) => v(u, '1000111010111', b);
+
+@pragma('dart2js:noInline')
+f_100_011_101_100_1(Set<String> u, int b) => v(u, '1000111011001', b);
+
+@pragma('dart2js:noInline')
+f_100_011_101_101_1(Set<String> u, int b) => v(u, '1000111011011', b);
+
+@pragma('dart2js:noInline')
+f_100_011_101_110_1(Set<String> u, int b) => v(u, '1000111011101', b);
+
+@pragma('dart2js:noInline')
+f_100_011_101_111_1(Set<String> u, int b) => v(u, '1000111011111', b);
+
+@pragma('dart2js:noInline')
+f_100_011_110_000_1(Set<String> u, int b) => v(u, '1000111100001', b);
+
+@pragma('dart2js:noInline')
+f_100_011_110_001_1(Set<String> u, int b) => v(u, '1000111100011', b);
+
+@pragma('dart2js:noInline')
+f_100_011_110_010_1(Set<String> u, int b) => v(u, '1000111100101', b);
+
+@pragma('dart2js:noInline')
+f_100_011_110_011_1(Set<String> u, int b) => v(u, '1000111100111', b);
+
+@pragma('dart2js:noInline')
+f_100_011_110_100_1(Set<String> u, int b) => v(u, '1000111101001', b);
+
+@pragma('dart2js:noInline')
+f_100_011_110_101_1(Set<String> u, int b) => v(u, '1000111101011', b);
+
+@pragma('dart2js:noInline')
+f_100_011_110_110_1(Set<String> u, int b) => v(u, '1000111101101', b);
+
+@pragma('dart2js:noInline')
+f_100_011_110_111_1(Set<String> u, int b) => v(u, '1000111101111', b);
+
+@pragma('dart2js:noInline')
+f_100_011_111_000_1(Set<String> u, int b) => v(u, '1000111110001', b);
+
+@pragma('dart2js:noInline')
+f_100_011_111_001_1(Set<String> u, int b) => v(u, '1000111110011', b);
+
+@pragma('dart2js:noInline')
+f_100_011_111_010_1(Set<String> u, int b) => v(u, '1000111110101', b);
+
+@pragma('dart2js:noInline')
+f_100_011_111_011_1(Set<String> u, int b) => v(u, '1000111110111', b);
+
+@pragma('dart2js:noInline')
+f_100_011_111_100_1(Set<String> u, int b) => v(u, '1000111111001', b);
+
+@pragma('dart2js:noInline')
+f_100_011_111_101_1(Set<String> u, int b) => v(u, '1000111111011', b);
+
+@pragma('dart2js:noInline')
+f_100_011_111_110_1(Set<String> u, int b) => v(u, '1000111111101', b);
+
+@pragma('dart2js:noInline')
+f_100_011_111_111_1(Set<String> u, int b) => v(u, '1000111111111', b);
+
+@pragma('dart2js:noInline')
+f_100_100_000_000_1(Set<String> u, int b) => v(u, '1001000000001', b);
+
+@pragma('dart2js:noInline')
+f_100_100_000_001_1(Set<String> u, int b) => v(u, '1001000000011', b);
+
+@pragma('dart2js:noInline')
+f_100_100_000_010_1(Set<String> u, int b) => v(u, '1001000000101', b);
+
+@pragma('dart2js:noInline')
+f_100_100_000_011_1(Set<String> u, int b) => v(u, '1001000000111', b);
+
+@pragma('dart2js:noInline')
+f_100_100_000_100_1(Set<String> u, int b) => v(u, '1001000001001', b);
+
+@pragma('dart2js:noInline')
+f_100_100_000_101_1(Set<String> u, int b) => v(u, '1001000001011', b);
+
+@pragma('dart2js:noInline')
+f_100_100_000_110_1(Set<String> u, int b) => v(u, '1001000001101', b);
+
+@pragma('dart2js:noInline')
+f_100_100_000_111_1(Set<String> u, int b) => v(u, '1001000001111', b);
+
+@pragma('dart2js:noInline')
+f_100_100_001_000_1(Set<String> u, int b) => v(u, '1001000010001', b);
+
+@pragma('dart2js:noInline')
+f_100_100_001_001_1(Set<String> u, int b) => v(u, '1001000010011', b);
+
+@pragma('dart2js:noInline')
+f_100_100_001_010_1(Set<String> u, int b) => v(u, '1001000010101', b);
+
+@pragma('dart2js:noInline')
+f_100_100_001_011_1(Set<String> u, int b) => v(u, '1001000010111', b);
+
+@pragma('dart2js:noInline')
+f_100_100_001_100_1(Set<String> u, int b) => v(u, '1001000011001', b);
+
+@pragma('dart2js:noInline')
+f_100_100_001_101_1(Set<String> u, int b) => v(u, '1001000011011', b);
+
+@pragma('dart2js:noInline')
+f_100_100_001_110_1(Set<String> u, int b) => v(u, '1001000011101', b);
+
+@pragma('dart2js:noInline')
+f_100_100_001_111_1(Set<String> u, int b) => v(u, '1001000011111', b);
+
+@pragma('dart2js:noInline')
+f_100_100_010_000_1(Set<String> u, int b) => v(u, '1001000100001', b);
+
+@pragma('dart2js:noInline')
+f_100_100_010_001_1(Set<String> u, int b) => v(u, '1001000100011', b);
+
+@pragma('dart2js:noInline')
+f_100_100_010_010_1(Set<String> u, int b) => v(u, '1001000100101', b);
+
+@pragma('dart2js:noInline')
+f_100_100_010_011_1(Set<String> u, int b) => v(u, '1001000100111', b);
+
+@pragma('dart2js:noInline')
+f_100_100_010_100_1(Set<String> u, int b) => v(u, '1001000101001', b);
+
+@pragma('dart2js:noInline')
+f_100_100_010_101_1(Set<String> u, int b) => v(u, '1001000101011', b);
+
+@pragma('dart2js:noInline')
+f_100_100_010_110_1(Set<String> u, int b) => v(u, '1001000101101', b);
+
+@pragma('dart2js:noInline')
+f_100_100_010_111_1(Set<String> u, int b) => v(u, '1001000101111', b);
+
+@pragma('dart2js:noInline')
+f_100_100_011_000_1(Set<String> u, int b) => v(u, '1001000110001', b);
+
+@pragma('dart2js:noInline')
+f_100_100_011_001_1(Set<String> u, int b) => v(u, '1001000110011', b);
+
+@pragma('dart2js:noInline')
+f_100_100_011_010_1(Set<String> u, int b) => v(u, '1001000110101', b);
+
+@pragma('dart2js:noInline')
+f_100_100_011_011_1(Set<String> u, int b) => v(u, '1001000110111', b);
+
+@pragma('dart2js:noInline')
+f_100_100_011_100_1(Set<String> u, int b) => v(u, '1001000111001', b);
+
+@pragma('dart2js:noInline')
+f_100_100_011_101_1(Set<String> u, int b) => v(u, '1001000111011', b);
+
+@pragma('dart2js:noInline')
+f_100_100_011_110_1(Set<String> u, int b) => v(u, '1001000111101', b);
+
+@pragma('dart2js:noInline')
+f_100_100_011_111_1(Set<String> u, int b) => v(u, '1001000111111', b);
+
+@pragma('dart2js:noInline')
+f_100_100_100_000_1(Set<String> u, int b) => v(u, '1001001000001', b);
+
+@pragma('dart2js:noInline')
+f_100_100_100_001_1(Set<String> u, int b) => v(u, '1001001000011', b);
+
+@pragma('dart2js:noInline')
+f_100_100_100_010_1(Set<String> u, int b) => v(u, '1001001000101', b);
+
+@pragma('dart2js:noInline')
+f_100_100_100_011_1(Set<String> u, int b) => v(u, '1001001000111', b);
+
+@pragma('dart2js:noInline')
+f_100_100_100_100_1(Set<String> u, int b) => v(u, '1001001001001', b);
+
+@pragma('dart2js:noInline')
+f_100_100_100_101_1(Set<String> u, int b) => v(u, '1001001001011', b);
+
+@pragma('dart2js:noInline')
+f_100_100_100_110_1(Set<String> u, int b) => v(u, '1001001001101', b);
+
+@pragma('dart2js:noInline')
+f_100_100_100_111_1(Set<String> u, int b) => v(u, '1001001001111', b);
+
+@pragma('dart2js:noInline')
+f_100_100_101_000_1(Set<String> u, int b) => v(u, '1001001010001', b);
+
+@pragma('dart2js:noInline')
+f_100_100_101_001_1(Set<String> u, int b) => v(u, '1001001010011', b);
+
+@pragma('dart2js:noInline')
+f_100_100_101_010_1(Set<String> u, int b) => v(u, '1001001010101', b);
+
+@pragma('dart2js:noInline')
+f_100_100_101_011_1(Set<String> u, int b) => v(u, '1001001010111', b);
+
+@pragma('dart2js:noInline')
+f_100_100_101_100_1(Set<String> u, int b) => v(u, '1001001011001', b);
+
+@pragma('dart2js:noInline')
+f_100_100_101_101_1(Set<String> u, int b) => v(u, '1001001011011', b);
+
+@pragma('dart2js:noInline')
+f_100_100_101_110_1(Set<String> u, int b) => v(u, '1001001011101', b);
+
+@pragma('dart2js:noInline')
+f_100_100_101_111_1(Set<String> u, int b) => v(u, '1001001011111', b);
+
+@pragma('dart2js:noInline')
+f_100_100_110_000_1(Set<String> u, int b) => v(u, '1001001100001', b);
+
+@pragma('dart2js:noInline')
+f_100_100_110_001_1(Set<String> u, int b) => v(u, '1001001100011', b);
+
+@pragma('dart2js:noInline')
+f_100_100_110_010_1(Set<String> u, int b) => v(u, '1001001100101', b);
+
+@pragma('dart2js:noInline')
+f_100_100_110_011_1(Set<String> u, int b) => v(u, '1001001100111', b);
+
+@pragma('dart2js:noInline')
+f_100_100_110_100_1(Set<String> u, int b) => v(u, '1001001101001', b);
+
+@pragma('dart2js:noInline')
+f_100_100_110_101_1(Set<String> u, int b) => v(u, '1001001101011', b);
+
+@pragma('dart2js:noInline')
+f_100_100_110_110_1(Set<String> u, int b) => v(u, '1001001101101', b);
+
+@pragma('dart2js:noInline')
+f_100_100_110_111_1(Set<String> u, int b) => v(u, '1001001101111', b);
+
+@pragma('dart2js:noInline')
+f_100_100_111_000_1(Set<String> u, int b) => v(u, '1001001110001', b);
+
+@pragma('dart2js:noInline')
+f_100_100_111_001_1(Set<String> u, int b) => v(u, '1001001110011', b);
+
+@pragma('dart2js:noInline')
+f_100_100_111_010_1(Set<String> u, int b) => v(u, '1001001110101', b);
+
+@pragma('dart2js:noInline')
+f_100_100_111_011_1(Set<String> u, int b) => v(u, '1001001110111', b);
+
+@pragma('dart2js:noInline')
+f_100_100_111_100_1(Set<String> u, int b) => v(u, '1001001111001', b);
+
+@pragma('dart2js:noInline')
+f_100_100_111_101_1(Set<String> u, int b) => v(u, '1001001111011', b);
+
+@pragma('dart2js:noInline')
+f_100_100_111_110_1(Set<String> u, int b) => v(u, '1001001111101', b);
+
+@pragma('dart2js:noInline')
+f_100_100_111_111_1(Set<String> u, int b) => v(u, '1001001111111', b);
+
+@pragma('dart2js:noInline')
+f_100_101_000_000_1(Set<String> u, int b) => v(u, '1001010000001', b);
+
+@pragma('dart2js:noInline')
+f_100_101_000_001_1(Set<String> u, int b) => v(u, '1001010000011', b);
+
+@pragma('dart2js:noInline')
+f_100_101_000_010_1(Set<String> u, int b) => v(u, '1001010000101', b);
+
+@pragma('dart2js:noInline')
+f_100_101_000_011_1(Set<String> u, int b) => v(u, '1001010000111', b);
+
+@pragma('dart2js:noInline')
+f_100_101_000_100_1(Set<String> u, int b) => v(u, '1001010001001', b);
+
+@pragma('dart2js:noInline')
+f_100_101_000_101_1(Set<String> u, int b) => v(u, '1001010001011', b);
+
+@pragma('dart2js:noInline')
+f_100_101_000_110_1(Set<String> u, int b) => v(u, '1001010001101', b);
+
+@pragma('dart2js:noInline')
+f_100_101_000_111_1(Set<String> u, int b) => v(u, '1001010001111', b);
+
+@pragma('dart2js:noInline')
+f_100_101_001_000_1(Set<String> u, int b) => v(u, '1001010010001', b);
+
+@pragma('dart2js:noInline')
+f_100_101_001_001_1(Set<String> u, int b) => v(u, '1001010010011', b);
+
+@pragma('dart2js:noInline')
+f_100_101_001_010_1(Set<String> u, int b) => v(u, '1001010010101', b);
+
+@pragma('dart2js:noInline')
+f_100_101_001_011_1(Set<String> u, int b) => v(u, '1001010010111', b);
+
+@pragma('dart2js:noInline')
+f_100_101_001_100_1(Set<String> u, int b) => v(u, '1001010011001', b);
+
+@pragma('dart2js:noInline')
+f_100_101_001_101_1(Set<String> u, int b) => v(u, '1001010011011', b);
+
+@pragma('dart2js:noInline')
+f_100_101_001_110_1(Set<String> u, int b) => v(u, '1001010011101', b);
+
+@pragma('dart2js:noInline')
+f_100_101_001_111_1(Set<String> u, int b) => v(u, '1001010011111', b);
+
+@pragma('dart2js:noInline')
+f_100_101_010_000_1(Set<String> u, int b) => v(u, '1001010100001', b);
+
+@pragma('dart2js:noInline')
+f_100_101_010_001_1(Set<String> u, int b) => v(u, '1001010100011', b);
+
+@pragma('dart2js:noInline')
+f_100_101_010_010_1(Set<String> u, int b) => v(u, '1001010100101', b);
+
+@pragma('dart2js:noInline')
+f_100_101_010_011_1(Set<String> u, int b) => v(u, '1001010100111', b);
+
+@pragma('dart2js:noInline')
+f_100_101_010_100_1(Set<String> u, int b) => v(u, '1001010101001', b);
+
+@pragma('dart2js:noInline')
+f_100_101_010_101_1(Set<String> u, int b) => v(u, '1001010101011', b);
+
+@pragma('dart2js:noInline')
+f_100_101_010_110_1(Set<String> u, int b) => v(u, '1001010101101', b);
+
+@pragma('dart2js:noInline')
+f_100_101_010_111_1(Set<String> u, int b) => v(u, '1001010101111', b);
+
+@pragma('dart2js:noInline')
+f_100_101_011_000_1(Set<String> u, int b) => v(u, '1001010110001', b);
+
+@pragma('dart2js:noInline')
+f_100_101_011_001_1(Set<String> u, int b) => v(u, '1001010110011', b);
+
+@pragma('dart2js:noInline')
+f_100_101_011_010_1(Set<String> u, int b) => v(u, '1001010110101', b);
+
+@pragma('dart2js:noInline')
+f_100_101_011_011_1(Set<String> u, int b) => v(u, '1001010110111', b);
+
+@pragma('dart2js:noInline')
+f_100_101_011_100_1(Set<String> u, int b) => v(u, '1001010111001', b);
+
+@pragma('dart2js:noInline')
+f_100_101_011_101_1(Set<String> u, int b) => v(u, '1001010111011', b);
+
+@pragma('dart2js:noInline')
+f_100_101_011_110_1(Set<String> u, int b) => v(u, '1001010111101', b);
+
+@pragma('dart2js:noInline')
+f_100_101_011_111_1(Set<String> u, int b) => v(u, '1001010111111', b);
+
+@pragma('dart2js:noInline')
+f_100_101_100_000_1(Set<String> u, int b) => v(u, '1001011000001', b);
+
+@pragma('dart2js:noInline')
+f_100_101_100_001_1(Set<String> u, int b) => v(u, '1001011000011', b);
+
+@pragma('dart2js:noInline')
+f_100_101_100_010_1(Set<String> u, int b) => v(u, '1001011000101', b);
+
+@pragma('dart2js:noInline')
+f_100_101_100_011_1(Set<String> u, int b) => v(u, '1001011000111', b);
+
+@pragma('dart2js:noInline')
+f_100_101_100_100_1(Set<String> u, int b) => v(u, '1001011001001', b);
+
+@pragma('dart2js:noInline')
+f_100_101_100_101_1(Set<String> u, int b) => v(u, '1001011001011', b);
+
+@pragma('dart2js:noInline')
+f_100_101_100_110_1(Set<String> u, int b) => v(u, '1001011001101', b);
+
+@pragma('dart2js:noInline')
+f_100_101_100_111_1(Set<String> u, int b) => v(u, '1001011001111', b);
+
+@pragma('dart2js:noInline')
+f_100_101_101_000_1(Set<String> u, int b) => v(u, '1001011010001', b);
+
+@pragma('dart2js:noInline')
+f_100_101_101_001_1(Set<String> u, int b) => v(u, '1001011010011', b);
+
+@pragma('dart2js:noInline')
+f_100_101_101_010_1(Set<String> u, int b) => v(u, '1001011010101', b);
+
+@pragma('dart2js:noInline')
+f_100_101_101_011_1(Set<String> u, int b) => v(u, '1001011010111', b);
+
+@pragma('dart2js:noInline')
+f_100_101_101_100_1(Set<String> u, int b) => v(u, '1001011011001', b);
+
+@pragma('dart2js:noInline')
+f_100_101_101_101_1(Set<String> u, int b) => v(u, '1001011011011', b);
+
+@pragma('dart2js:noInline')
+f_100_101_101_110_1(Set<String> u, int b) => v(u, '1001011011101', b);
+
+@pragma('dart2js:noInline')
+f_100_101_101_111_1(Set<String> u, int b) => v(u, '1001011011111', b);
+
+@pragma('dart2js:noInline')
+f_100_101_110_000_1(Set<String> u, int b) => v(u, '1001011100001', b);
+
+@pragma('dart2js:noInline')
+f_100_101_110_001_1(Set<String> u, int b) => v(u, '1001011100011', b);
+
+@pragma('dart2js:noInline')
+f_100_101_110_010_1(Set<String> u, int b) => v(u, '1001011100101', b);
+
+@pragma('dart2js:noInline')
+f_100_101_110_011_1(Set<String> u, int b) => v(u, '1001011100111', b);
+
+@pragma('dart2js:noInline')
+f_100_101_110_100_1(Set<String> u, int b) => v(u, '1001011101001', b);
+
+@pragma('dart2js:noInline')
+f_100_101_110_101_1(Set<String> u, int b) => v(u, '1001011101011', b);
+
+@pragma('dart2js:noInline')
+f_100_101_110_110_1(Set<String> u, int b) => v(u, '1001011101101', b);
+
+@pragma('dart2js:noInline')
+f_100_101_110_111_1(Set<String> u, int b) => v(u, '1001011101111', b);
+
+@pragma('dart2js:noInline')
+f_100_101_111_000_1(Set<String> u, int b) => v(u, '1001011110001', b);
+
+@pragma('dart2js:noInline')
+f_100_101_111_001_1(Set<String> u, int b) => v(u, '1001011110011', b);
+
+@pragma('dart2js:noInline')
+f_100_101_111_010_1(Set<String> u, int b) => v(u, '1001011110101', b);
+
+@pragma('dart2js:noInline')
+f_100_101_111_011_1(Set<String> u, int b) => v(u, '1001011110111', b);
+
+@pragma('dart2js:noInline')
+f_100_101_111_100_1(Set<String> u, int b) => v(u, '1001011111001', b);
+
+@pragma('dart2js:noInline')
+f_100_101_111_101_1(Set<String> u, int b) => v(u, '1001011111011', b);
+
+@pragma('dart2js:noInline')
+f_100_101_111_110_1(Set<String> u, int b) => v(u, '1001011111101', b);
+
+@pragma('dart2js:noInline')
+f_100_101_111_111_1(Set<String> u, int b) => v(u, '1001011111111', b);
+
+@pragma('dart2js:noInline')
+f_100_110_000_000_1(Set<String> u, int b) => v(u, '1001100000001', b);
+
+@pragma('dart2js:noInline')
+f_100_110_000_001_1(Set<String> u, int b) => v(u, '1001100000011', b);
+
+@pragma('dart2js:noInline')
+f_100_110_000_010_1(Set<String> u, int b) => v(u, '1001100000101', b);
+
+@pragma('dart2js:noInline')
+f_100_110_000_011_1(Set<String> u, int b) => v(u, '1001100000111', b);
+
+@pragma('dart2js:noInline')
+f_100_110_000_100_1(Set<String> u, int b) => v(u, '1001100001001', b);
+
+@pragma('dart2js:noInline')
+f_100_110_000_101_1(Set<String> u, int b) => v(u, '1001100001011', b);
+
+@pragma('dart2js:noInline')
+f_100_110_000_110_1(Set<String> u, int b) => v(u, '1001100001101', b);
+
+@pragma('dart2js:noInline')
+f_100_110_000_111_1(Set<String> u, int b) => v(u, '1001100001111', b);
+
+@pragma('dart2js:noInline')
+f_100_110_001_000_1(Set<String> u, int b) => v(u, '1001100010001', b);
+
+@pragma('dart2js:noInline')
+f_100_110_001_001_1(Set<String> u, int b) => v(u, '1001100010011', b);
+
+@pragma('dart2js:noInline')
+f_100_110_001_010_1(Set<String> u, int b) => v(u, '1001100010101', b);
+
+@pragma('dart2js:noInline')
+f_100_110_001_011_1(Set<String> u, int b) => v(u, '1001100010111', b);
+
+@pragma('dart2js:noInline')
+f_100_110_001_100_1(Set<String> u, int b) => v(u, '1001100011001', b);
+
+@pragma('dart2js:noInline')
+f_100_110_001_101_1(Set<String> u, int b) => v(u, '1001100011011', b);
+
+@pragma('dart2js:noInline')
+f_100_110_001_110_1(Set<String> u, int b) => v(u, '1001100011101', b);
+
+@pragma('dart2js:noInline')
+f_100_110_001_111_1(Set<String> u, int b) => v(u, '1001100011111', b);
+
+@pragma('dart2js:noInline')
+f_100_110_010_000_1(Set<String> u, int b) => v(u, '1001100100001', b);
+
+@pragma('dart2js:noInline')
+f_100_110_010_001_1(Set<String> u, int b) => v(u, '1001100100011', b);
+
+@pragma('dart2js:noInline')
+f_100_110_010_010_1(Set<String> u, int b) => v(u, '1001100100101', b);
+
+@pragma('dart2js:noInline')
+f_100_110_010_011_1(Set<String> u, int b) => v(u, '1001100100111', b);
+
+@pragma('dart2js:noInline')
+f_100_110_010_100_1(Set<String> u, int b) => v(u, '1001100101001', b);
+
+@pragma('dart2js:noInline')
+f_100_110_010_101_1(Set<String> u, int b) => v(u, '1001100101011', b);
+
+@pragma('dart2js:noInline')
+f_100_110_010_110_1(Set<String> u, int b) => v(u, '1001100101101', b);
+
+@pragma('dart2js:noInline')
+f_100_110_010_111_1(Set<String> u, int b) => v(u, '1001100101111', b);
+
+@pragma('dart2js:noInline')
+f_100_110_011_000_1(Set<String> u, int b) => v(u, '1001100110001', b);
+
+@pragma('dart2js:noInline')
+f_100_110_011_001_1(Set<String> u, int b) => v(u, '1001100110011', b);
+
+@pragma('dart2js:noInline')
+f_100_110_011_010_1(Set<String> u, int b) => v(u, '1001100110101', b);
+
+@pragma('dart2js:noInline')
+f_100_110_011_011_1(Set<String> u, int b) => v(u, '1001100110111', b);
+
+@pragma('dart2js:noInline')
+f_100_110_011_100_1(Set<String> u, int b) => v(u, '1001100111001', b);
+
+@pragma('dart2js:noInline')
+f_100_110_011_101_1(Set<String> u, int b) => v(u, '1001100111011', b);
+
+@pragma('dart2js:noInline')
+f_100_110_011_110_1(Set<String> u, int b) => v(u, '1001100111101', b);
+
+@pragma('dart2js:noInline')
+f_100_110_011_111_1(Set<String> u, int b) => v(u, '1001100111111', b);
+
+@pragma('dart2js:noInline')
+f_100_110_100_000_1(Set<String> u, int b) => v(u, '1001101000001', b);
+
+@pragma('dart2js:noInline')
+f_100_110_100_001_1(Set<String> u, int b) => v(u, '1001101000011', b);
+
+@pragma('dart2js:noInline')
+f_100_110_100_010_1(Set<String> u, int b) => v(u, '1001101000101', b);
+
+@pragma('dart2js:noInline')
+f_100_110_100_011_1(Set<String> u, int b) => v(u, '1001101000111', b);
+
+@pragma('dart2js:noInline')
+f_100_110_100_100_1(Set<String> u, int b) => v(u, '1001101001001', b);
+
+@pragma('dart2js:noInline')
+f_100_110_100_101_1(Set<String> u, int b) => v(u, '1001101001011', b);
+
+@pragma('dart2js:noInline')
+f_100_110_100_110_1(Set<String> u, int b) => v(u, '1001101001101', b);
+
+@pragma('dart2js:noInline')
+f_100_110_100_111_1(Set<String> u, int b) => v(u, '1001101001111', b);
+
+@pragma('dart2js:noInline')
+f_100_110_101_000_1(Set<String> u, int b) => v(u, '1001101010001', b);
+
+@pragma('dart2js:noInline')
+f_100_110_101_001_1(Set<String> u, int b) => v(u, '1001101010011', b);
+
+@pragma('dart2js:noInline')
+f_100_110_101_010_1(Set<String> u, int b) => v(u, '1001101010101', b);
+
+@pragma('dart2js:noInline')
+f_100_110_101_011_1(Set<String> u, int b) => v(u, '1001101010111', b);
+
+@pragma('dart2js:noInline')
+f_100_110_101_100_1(Set<String> u, int b) => v(u, '1001101011001', b);
+
+@pragma('dart2js:noInline')
+f_100_110_101_101_1(Set<String> u, int b) => v(u, '1001101011011', b);
+
+@pragma('dart2js:noInline')
+f_100_110_101_110_1(Set<String> u, int b) => v(u, '1001101011101', b);
+
+@pragma('dart2js:noInline')
+f_100_110_101_111_1(Set<String> u, int b) => v(u, '1001101011111', b);
+
+@pragma('dart2js:noInline')
+f_100_110_110_000_1(Set<String> u, int b) => v(u, '1001101100001', b);
+
+@pragma('dart2js:noInline')
+f_100_110_110_001_1(Set<String> u, int b) => v(u, '1001101100011', b);
+
+@pragma('dart2js:noInline')
+f_100_110_110_010_1(Set<String> u, int b) => v(u, '1001101100101', b);
+
+@pragma('dart2js:noInline')
+f_100_110_110_011_1(Set<String> u, int b) => v(u, '1001101100111', b);
+
+@pragma('dart2js:noInline')
+f_100_110_110_100_1(Set<String> u, int b) => v(u, '1001101101001', b);
+
+@pragma('dart2js:noInline')
+f_100_110_110_101_1(Set<String> u, int b) => v(u, '1001101101011', b);
+
+@pragma('dart2js:noInline')
+f_100_110_110_110_1(Set<String> u, int b) => v(u, '1001101101101', b);
+
+@pragma('dart2js:noInline')
+f_100_110_110_111_1(Set<String> u, int b) => v(u, '1001101101111', b);
+
+@pragma('dart2js:noInline')
+f_100_110_111_000_1(Set<String> u, int b) => v(u, '1001101110001', b);
+
+@pragma('dart2js:noInline')
+f_100_110_111_001_1(Set<String> u, int b) => v(u, '1001101110011', b);
+
+@pragma('dart2js:noInline')
+f_100_110_111_010_1(Set<String> u, int b) => v(u, '1001101110101', b);
+
+@pragma('dart2js:noInline')
+f_100_110_111_011_1(Set<String> u, int b) => v(u, '1001101110111', b);
+
+@pragma('dart2js:noInline')
+f_100_110_111_100_1(Set<String> u, int b) => v(u, '1001101111001', b);
+
+@pragma('dart2js:noInline')
+f_100_110_111_101_1(Set<String> u, int b) => v(u, '1001101111011', b);
+
+@pragma('dart2js:noInline')
+f_100_110_111_110_1(Set<String> u, int b) => v(u, '1001101111101', b);
+
+@pragma('dart2js:noInline')
+f_100_110_111_111_1(Set<String> u, int b) => v(u, '1001101111111', b);
+
+@pragma('dart2js:noInline')
+f_100_111_000_000_1(Set<String> u, int b) => v(u, '1001110000001', b);
+
+@pragma('dart2js:noInline')
+f_100_111_000_001_1(Set<String> u, int b) => v(u, '1001110000011', b);
+
+@pragma('dart2js:noInline')
+f_100_111_000_010_1(Set<String> u, int b) => v(u, '1001110000101', b);
+
+@pragma('dart2js:noInline')
+f_100_111_000_011_1(Set<String> u, int b) => v(u, '1001110000111', b);
+
+@pragma('dart2js:noInline')
+f_100_111_000_100_1(Set<String> u, int b) => v(u, '1001110001001', b);
+
+@pragma('dart2js:noInline')
+f_100_111_000_101_1(Set<String> u, int b) => v(u, '1001110001011', b);
+
+@pragma('dart2js:noInline')
+f_100_111_000_110_1(Set<String> u, int b) => v(u, '1001110001101', b);
+
+@pragma('dart2js:noInline')
+f_100_111_000_111_1(Set<String> u, int b) => v(u, '1001110001111', b);
+
+@pragma('dart2js:noInline')
+f_100_111_001_000_1(Set<String> u, int b) => v(u, '1001110010001', b);
+
+@pragma('dart2js:noInline')
+f_100_111_001_001_1(Set<String> u, int b) => v(u, '1001110010011', b);
+
+@pragma('dart2js:noInline')
+f_100_111_001_010_1(Set<String> u, int b) => v(u, '1001110010101', b);
+
+@pragma('dart2js:noInline')
+f_100_111_001_011_1(Set<String> u, int b) => v(u, '1001110010111', b);
+
+@pragma('dart2js:noInline')
+f_100_111_001_100_1(Set<String> u, int b) => v(u, '1001110011001', b);
+
+@pragma('dart2js:noInline')
+f_100_111_001_101_1(Set<String> u, int b) => v(u, '1001110011011', b);
+
+@pragma('dart2js:noInline')
+f_100_111_001_110_1(Set<String> u, int b) => v(u, '1001110011101', b);
+
+@pragma('dart2js:noInline')
+f_100_111_001_111_1(Set<String> u, int b) => v(u, '1001110011111', b);
+
+@pragma('dart2js:noInline')
+f_100_111_010_000_1(Set<String> u, int b) => v(u, '1001110100001', b);
+
+@pragma('dart2js:noInline')
+f_100_111_010_001_1(Set<String> u, int b) => v(u, '1001110100011', b);
+
+@pragma('dart2js:noInline')
+f_100_111_010_010_1(Set<String> u, int b) => v(u, '1001110100101', b);
+
+@pragma('dart2js:noInline')
+f_100_111_010_011_1(Set<String> u, int b) => v(u, '1001110100111', b);
+
+@pragma('dart2js:noInline')
+f_100_111_010_100_1(Set<String> u, int b) => v(u, '1001110101001', b);
+
+@pragma('dart2js:noInline')
+f_100_111_010_101_1(Set<String> u, int b) => v(u, '1001110101011', b);
+
+@pragma('dart2js:noInline')
+f_100_111_010_110_1(Set<String> u, int b) => v(u, '1001110101101', b);
+
+@pragma('dart2js:noInline')
+f_100_111_010_111_1(Set<String> u, int b) => v(u, '1001110101111', b);
+
+@pragma('dart2js:noInline')
+f_100_111_011_000_1(Set<String> u, int b) => v(u, '1001110110001', b);
+
+@pragma('dart2js:noInline')
+f_100_111_011_001_1(Set<String> u, int b) => v(u, '1001110110011', b);
+
+@pragma('dart2js:noInline')
+f_100_111_011_010_1(Set<String> u, int b) => v(u, '1001110110101', b);
+
+@pragma('dart2js:noInline')
+f_100_111_011_011_1(Set<String> u, int b) => v(u, '1001110110111', b);
+
+@pragma('dart2js:noInline')
+f_100_111_011_100_1(Set<String> u, int b) => v(u, '1001110111001', b);
+
+@pragma('dart2js:noInline')
+f_100_111_011_101_1(Set<String> u, int b) => v(u, '1001110111011', b);
+
+@pragma('dart2js:noInline')
+f_100_111_011_110_1(Set<String> u, int b) => v(u, '1001110111101', b);
+
+@pragma('dart2js:noInline')
+f_100_111_011_111_1(Set<String> u, int b) => v(u, '1001110111111', b);
+
+@pragma('dart2js:noInline')
+f_100_111_100_000_1(Set<String> u, int b) => v(u, '1001111000001', b);
+
+@pragma('dart2js:noInline')
+f_100_111_100_001_1(Set<String> u, int b) => v(u, '1001111000011', b);
+
+@pragma('dart2js:noInline')
+f_100_111_100_010_1(Set<String> u, int b) => v(u, '1001111000101', b);
+
+@pragma('dart2js:noInline')
+f_100_111_100_011_1(Set<String> u, int b) => v(u, '1001111000111', b);
+
+@pragma('dart2js:noInline')
+f_100_111_100_100_1(Set<String> u, int b) => v(u, '1001111001001', b);
+
+@pragma('dart2js:noInline')
+f_100_111_100_101_1(Set<String> u, int b) => v(u, '1001111001011', b);
+
+@pragma('dart2js:noInline')
+f_100_111_100_110_1(Set<String> u, int b) => v(u, '1001111001101', b);
+
+@pragma('dart2js:noInline')
+f_100_111_100_111_1(Set<String> u, int b) => v(u, '1001111001111', b);
+
+@pragma('dart2js:noInline')
+f_100_111_101_000_1(Set<String> u, int b) => v(u, '1001111010001', b);
+
+@pragma('dart2js:noInline')
+f_100_111_101_001_1(Set<String> u, int b) => v(u, '1001111010011', b);
+
+@pragma('dart2js:noInline')
+f_100_111_101_010_1(Set<String> u, int b) => v(u, '1001111010101', b);
+
+@pragma('dart2js:noInline')
+f_100_111_101_011_1(Set<String> u, int b) => v(u, '1001111010111', b);
+
+@pragma('dart2js:noInline')
+f_100_111_101_100_1(Set<String> u, int b) => v(u, '1001111011001', b);
+
+@pragma('dart2js:noInline')
+f_100_111_101_101_1(Set<String> u, int b) => v(u, '1001111011011', b);
+
+@pragma('dart2js:noInline')
+f_100_111_101_110_1(Set<String> u, int b) => v(u, '1001111011101', b);
+
+@pragma('dart2js:noInline')
+f_100_111_101_111_1(Set<String> u, int b) => v(u, '1001111011111', b);
+
+@pragma('dart2js:noInline')
+f_100_111_110_000_1(Set<String> u, int b) => v(u, '1001111100001', b);
+
+@pragma('dart2js:noInline')
+f_100_111_110_001_1(Set<String> u, int b) => v(u, '1001111100011', b);
+
+@pragma('dart2js:noInline')
+f_100_111_110_010_1(Set<String> u, int b) => v(u, '1001111100101', b);
+
+@pragma('dart2js:noInline')
+f_100_111_110_011_1(Set<String> u, int b) => v(u, '1001111100111', b);
+
+@pragma('dart2js:noInline')
+f_100_111_110_100_1(Set<String> u, int b) => v(u, '1001111101001', b);
+
+@pragma('dart2js:noInline')
+f_100_111_110_101_1(Set<String> u, int b) => v(u, '1001111101011', b);
+
+@pragma('dart2js:noInline')
+f_100_111_110_110_1(Set<String> u, int b) => v(u, '1001111101101', b);
+
+@pragma('dart2js:noInline')
+f_100_111_110_111_1(Set<String> u, int b) => v(u, '1001111101111', b);
+
+@pragma('dart2js:noInline')
+f_100_111_111_000_1(Set<String> u, int b) => v(u, '1001111110001', b);
+
+@pragma('dart2js:noInline')
+f_100_111_111_001_1(Set<String> u, int b) => v(u, '1001111110011', b);
+
+@pragma('dart2js:noInline')
+f_100_111_111_010_1(Set<String> u, int b) => v(u, '1001111110101', b);
+
+@pragma('dart2js:noInline')
+f_100_111_111_011_1(Set<String> u, int b) => v(u, '1001111110111', b);
+
+@pragma('dart2js:noInline')
+f_100_111_111_100_1(Set<String> u, int b) => v(u, '1001111111001', b);
+
+@pragma('dart2js:noInline')
+f_100_111_111_101_1(Set<String> u, int b) => v(u, '1001111111011', b);
+
+@pragma('dart2js:noInline')
+f_100_111_111_110_1(Set<String> u, int b) => v(u, '1001111111101', b);
+
+@pragma('dart2js:noInline')
+f_100_111_111_111_1(Set<String> u, int b) => v(u, '1001111111111', b);
+
+@pragma('dart2js:noInline')
+f_101_000_000_000_1(Set<String> u, int b) => v(u, '1010000000001', b);
+
+@pragma('dart2js:noInline')
+f_101_000_000_001_1(Set<String> u, int b) => v(u, '1010000000011', b);
+
+@pragma('dart2js:noInline')
+f_101_000_000_010_1(Set<String> u, int b) => v(u, '1010000000101', b);
+
+@pragma('dart2js:noInline')
+f_101_000_000_011_1(Set<String> u, int b) => v(u, '1010000000111', b);
+
+@pragma('dart2js:noInline')
+f_101_000_000_100_1(Set<String> u, int b) => v(u, '1010000001001', b);
+
+@pragma('dart2js:noInline')
+f_101_000_000_101_1(Set<String> u, int b) => v(u, '1010000001011', b);
+
+@pragma('dart2js:noInline')
+f_101_000_000_110_1(Set<String> u, int b) => v(u, '1010000001101', b);
+
+@pragma('dart2js:noInline')
+f_101_000_000_111_1(Set<String> u, int b) => v(u, '1010000001111', b);
+
+@pragma('dart2js:noInline')
+f_101_000_001_000_1(Set<String> u, int b) => v(u, '1010000010001', b);
+
+@pragma('dart2js:noInline')
+f_101_000_001_001_1(Set<String> u, int b) => v(u, '1010000010011', b);
+
+@pragma('dart2js:noInline')
+f_101_000_001_010_1(Set<String> u, int b) => v(u, '1010000010101', b);
+
+@pragma('dart2js:noInline')
+f_101_000_001_011_1(Set<String> u, int b) => v(u, '1010000010111', b);
+
+@pragma('dart2js:noInline')
+f_101_000_001_100_1(Set<String> u, int b) => v(u, '1010000011001', b);
+
+@pragma('dart2js:noInline')
+f_101_000_001_101_1(Set<String> u, int b) => v(u, '1010000011011', b);
+
+@pragma('dart2js:noInline')
+f_101_000_001_110_1(Set<String> u, int b) => v(u, '1010000011101', b);
+
+@pragma('dart2js:noInline')
+f_101_000_001_111_1(Set<String> u, int b) => v(u, '1010000011111', b);
+
+@pragma('dart2js:noInline')
+f_101_000_010_000_1(Set<String> u, int b) => v(u, '1010000100001', b);
+
+@pragma('dart2js:noInline')
+f_101_000_010_001_1(Set<String> u, int b) => v(u, '1010000100011', b);
+
+@pragma('dart2js:noInline')
+f_101_000_010_010_1(Set<String> u, int b) => v(u, '1010000100101', b);
+
+@pragma('dart2js:noInline')
+f_101_000_010_011_1(Set<String> u, int b) => v(u, '1010000100111', b);
+
+@pragma('dart2js:noInline')
+f_101_000_010_100_1(Set<String> u, int b) => v(u, '1010000101001', b);
+
+@pragma('dart2js:noInline')
+f_101_000_010_101_1(Set<String> u, int b) => v(u, '1010000101011', b);
+
+@pragma('dart2js:noInline')
+f_101_000_010_110_1(Set<String> u, int b) => v(u, '1010000101101', b);
+
+@pragma('dart2js:noInline')
+f_101_000_010_111_1(Set<String> u, int b) => v(u, '1010000101111', b);
+
+@pragma('dart2js:noInline')
+f_101_000_011_000_1(Set<String> u, int b) => v(u, '1010000110001', b);
+
+@pragma('dart2js:noInline')
+f_101_000_011_001_1(Set<String> u, int b) => v(u, '1010000110011', b);
+
+@pragma('dart2js:noInline')
+f_101_000_011_010_1(Set<String> u, int b) => v(u, '1010000110101', b);
+
+@pragma('dart2js:noInline')
+f_101_000_011_011_1(Set<String> u, int b) => v(u, '1010000110111', b);
+
+@pragma('dart2js:noInline')
+f_101_000_011_100_1(Set<String> u, int b) => v(u, '1010000111001', b);
+
+@pragma('dart2js:noInline')
+f_101_000_011_101_1(Set<String> u, int b) => v(u, '1010000111011', b);
+
+@pragma('dart2js:noInline')
+f_101_000_011_110_1(Set<String> u, int b) => v(u, '1010000111101', b);
+
+@pragma('dart2js:noInline')
+f_101_000_011_111_1(Set<String> u, int b) => v(u, '1010000111111', b);
+
+@pragma('dart2js:noInline')
+f_101_000_100_000_1(Set<String> u, int b) => v(u, '1010001000001', b);
+
+@pragma('dart2js:noInline')
+f_101_000_100_001_1(Set<String> u, int b) => v(u, '1010001000011', b);
+
+@pragma('dart2js:noInline')
+f_101_000_100_010_1(Set<String> u, int b) => v(u, '1010001000101', b);
+
+@pragma('dart2js:noInline')
+f_101_000_100_011_1(Set<String> u, int b) => v(u, '1010001000111', b);
+
+@pragma('dart2js:noInline')
+f_101_000_100_100_1(Set<String> u, int b) => v(u, '1010001001001', b);
+
+@pragma('dart2js:noInline')
+f_101_000_100_101_1(Set<String> u, int b) => v(u, '1010001001011', b);
+
+@pragma('dart2js:noInline')
+f_101_000_100_110_1(Set<String> u, int b) => v(u, '1010001001101', b);
+
+@pragma('dart2js:noInline')
+f_101_000_100_111_1(Set<String> u, int b) => v(u, '1010001001111', b);
+
+@pragma('dart2js:noInline')
+f_101_000_101_000_1(Set<String> u, int b) => v(u, '1010001010001', b);
+
+@pragma('dart2js:noInline')
+f_101_000_101_001_1(Set<String> u, int b) => v(u, '1010001010011', b);
+
+@pragma('dart2js:noInline')
+f_101_000_101_010_1(Set<String> u, int b) => v(u, '1010001010101', b);
+
+@pragma('dart2js:noInline')
+f_101_000_101_011_1(Set<String> u, int b) => v(u, '1010001010111', b);
+
+@pragma('dart2js:noInline')
+f_101_000_101_100_1(Set<String> u, int b) => v(u, '1010001011001', b);
+
+@pragma('dart2js:noInline')
+f_101_000_101_101_1(Set<String> u, int b) => v(u, '1010001011011', b);
+
+@pragma('dart2js:noInline')
+f_101_000_101_110_1(Set<String> u, int b) => v(u, '1010001011101', b);
+
+@pragma('dart2js:noInline')
+f_101_000_101_111_1(Set<String> u, int b) => v(u, '1010001011111', b);
+
+@pragma('dart2js:noInline')
+f_101_000_110_000_1(Set<String> u, int b) => v(u, '1010001100001', b);
+
+@pragma('dart2js:noInline')
+f_101_000_110_001_1(Set<String> u, int b) => v(u, '1010001100011', b);
+
+@pragma('dart2js:noInline')
+f_101_000_110_010_1(Set<String> u, int b) => v(u, '1010001100101', b);
+
+@pragma('dart2js:noInline')
+f_101_000_110_011_1(Set<String> u, int b) => v(u, '1010001100111', b);
+
+@pragma('dart2js:noInline')
+f_101_000_110_100_1(Set<String> u, int b) => v(u, '1010001101001', b);
+
+@pragma('dart2js:noInline')
+f_101_000_110_101_1(Set<String> u, int b) => v(u, '1010001101011', b);
+
+@pragma('dart2js:noInline')
+f_101_000_110_110_1(Set<String> u, int b) => v(u, '1010001101101', b);
+
+@pragma('dart2js:noInline')
+f_101_000_110_111_1(Set<String> u, int b) => v(u, '1010001101111', b);
+
+@pragma('dart2js:noInline')
+f_101_000_111_000_1(Set<String> u, int b) => v(u, '1010001110001', b);
+
+@pragma('dart2js:noInline')
+f_101_000_111_001_1(Set<String> u, int b) => v(u, '1010001110011', b);
+
+@pragma('dart2js:noInline')
+f_101_000_111_010_1(Set<String> u, int b) => v(u, '1010001110101', b);
+
+@pragma('dart2js:noInline')
+f_101_000_111_011_1(Set<String> u, int b) => v(u, '1010001110111', b);
+
+@pragma('dart2js:noInline')
+f_101_000_111_100_1(Set<String> u, int b) => v(u, '1010001111001', b);
+
+@pragma('dart2js:noInline')
+f_101_000_111_101_1(Set<String> u, int b) => v(u, '1010001111011', b);
+
+@pragma('dart2js:noInline')
+f_101_000_111_110_1(Set<String> u, int b) => v(u, '1010001111101', b);
+
+@pragma('dart2js:noInline')
+f_101_000_111_111_1(Set<String> u, int b) => v(u, '1010001111111', b);
+
+@pragma('dart2js:noInline')
+f_101_001_000_000_1(Set<String> u, int b) => v(u, '1010010000001', b);
+
+@pragma('dart2js:noInline')
+f_101_001_000_001_1(Set<String> u, int b) => v(u, '1010010000011', b);
+
+@pragma('dart2js:noInline')
+f_101_001_000_010_1(Set<String> u, int b) => v(u, '1010010000101', b);
+
+@pragma('dart2js:noInline')
+f_101_001_000_011_1(Set<String> u, int b) => v(u, '1010010000111', b);
+
+@pragma('dart2js:noInline')
+f_101_001_000_100_1(Set<String> u, int b) => v(u, '1010010001001', b);
+
+@pragma('dart2js:noInline')
+f_101_001_000_101_1(Set<String> u, int b) => v(u, '1010010001011', b);
+
+@pragma('dart2js:noInline')
+f_101_001_000_110_1(Set<String> u, int b) => v(u, '1010010001101', b);
+
+@pragma('dart2js:noInline')
+f_101_001_000_111_1(Set<String> u, int b) => v(u, '1010010001111', b);
+
+@pragma('dart2js:noInline')
+f_101_001_001_000_1(Set<String> u, int b) => v(u, '1010010010001', b);
+
+@pragma('dart2js:noInline')
+f_101_001_001_001_1(Set<String> u, int b) => v(u, '1010010010011', b);
+
+@pragma('dart2js:noInline')
+f_101_001_001_010_1(Set<String> u, int b) => v(u, '1010010010101', b);
+
+@pragma('dart2js:noInline')
+f_101_001_001_011_1(Set<String> u, int b) => v(u, '1010010010111', b);
+
+@pragma('dart2js:noInline')
+f_101_001_001_100_1(Set<String> u, int b) => v(u, '1010010011001', b);
+
+@pragma('dart2js:noInline')
+f_101_001_001_101_1(Set<String> u, int b) => v(u, '1010010011011', b);
+
+@pragma('dart2js:noInline')
+f_101_001_001_110_1(Set<String> u, int b) => v(u, '1010010011101', b);
+
+@pragma('dart2js:noInline')
+f_101_001_001_111_1(Set<String> u, int b) => v(u, '1010010011111', b);
+
+@pragma('dart2js:noInline')
+f_101_001_010_000_1(Set<String> u, int b) => v(u, '1010010100001', b);
+
+@pragma('dart2js:noInline')
+f_101_001_010_001_1(Set<String> u, int b) => v(u, '1010010100011', b);
+
+@pragma('dart2js:noInline')
+f_101_001_010_010_1(Set<String> u, int b) => v(u, '1010010100101', b);
+
+@pragma('dart2js:noInline')
+f_101_001_010_011_1(Set<String> u, int b) => v(u, '1010010100111', b);
+
+@pragma('dart2js:noInline')
+f_101_001_010_100_1(Set<String> u, int b) => v(u, '1010010101001', b);
+
+@pragma('dart2js:noInline')
+f_101_001_010_101_1(Set<String> u, int b) => v(u, '1010010101011', b);
+
+@pragma('dart2js:noInline')
+f_101_001_010_110_1(Set<String> u, int b) => v(u, '1010010101101', b);
+
+@pragma('dart2js:noInline')
+f_101_001_010_111_1(Set<String> u, int b) => v(u, '1010010101111', b);
+
+@pragma('dart2js:noInline')
+f_101_001_011_000_1(Set<String> u, int b) => v(u, '1010010110001', b);
+
+@pragma('dart2js:noInline')
+f_101_001_011_001_1(Set<String> u, int b) => v(u, '1010010110011', b);
+
+@pragma('dart2js:noInline')
+f_101_001_011_010_1(Set<String> u, int b) => v(u, '1010010110101', b);
+
+@pragma('dart2js:noInline')
+f_101_001_011_011_1(Set<String> u, int b) => v(u, '1010010110111', b);
+
+@pragma('dart2js:noInline')
+f_101_001_011_100_1(Set<String> u, int b) => v(u, '1010010111001', b);
+
+@pragma('dart2js:noInline')
+f_101_001_011_101_1(Set<String> u, int b) => v(u, '1010010111011', b);
+
+@pragma('dart2js:noInline')
+f_101_001_011_110_1(Set<String> u, int b) => v(u, '1010010111101', b);
+
+@pragma('dart2js:noInline')
+f_101_001_011_111_1(Set<String> u, int b) => v(u, '1010010111111', b);
+
+@pragma('dart2js:noInline')
+f_101_001_100_000_1(Set<String> u, int b) => v(u, '1010011000001', b);
+
+@pragma('dart2js:noInline')
+f_101_001_100_001_1(Set<String> u, int b) => v(u, '1010011000011', b);
+
+@pragma('dart2js:noInline')
+f_101_001_100_010_1(Set<String> u, int b) => v(u, '1010011000101', b);
+
+@pragma('dart2js:noInline')
+f_101_001_100_011_1(Set<String> u, int b) => v(u, '1010011000111', b);
+
+@pragma('dart2js:noInline')
+f_101_001_100_100_1(Set<String> u, int b) => v(u, '1010011001001', b);
+
+@pragma('dart2js:noInline')
+f_101_001_100_101_1(Set<String> u, int b) => v(u, '1010011001011', b);
+
+@pragma('dart2js:noInline')
+f_101_001_100_110_1(Set<String> u, int b) => v(u, '1010011001101', b);
+
+@pragma('dart2js:noInline')
+f_101_001_100_111_1(Set<String> u, int b) => v(u, '1010011001111', b);
+
+@pragma('dart2js:noInline')
+f_101_001_101_000_1(Set<String> u, int b) => v(u, '1010011010001', b);
+
+@pragma('dart2js:noInline')
+f_101_001_101_001_1(Set<String> u, int b) => v(u, '1010011010011', b);
+
+@pragma('dart2js:noInline')
+f_101_001_101_010_1(Set<String> u, int b) => v(u, '1010011010101', b);
+
+@pragma('dart2js:noInline')
+f_101_001_101_011_1(Set<String> u, int b) => v(u, '1010011010111', b);
+
+@pragma('dart2js:noInline')
+f_101_001_101_100_1(Set<String> u, int b) => v(u, '1010011011001', b);
+
+@pragma('dart2js:noInline')
+f_101_001_101_101_1(Set<String> u, int b) => v(u, '1010011011011', b);
+
+@pragma('dart2js:noInline')
+f_101_001_101_110_1(Set<String> u, int b) => v(u, '1010011011101', b);
+
+@pragma('dart2js:noInline')
+f_101_001_101_111_1(Set<String> u, int b) => v(u, '1010011011111', b);
+
+@pragma('dart2js:noInline')
+f_101_001_110_000_1(Set<String> u, int b) => v(u, '1010011100001', b);
+
+@pragma('dart2js:noInline')
+f_101_001_110_001_1(Set<String> u, int b) => v(u, '1010011100011', b);
+
+@pragma('dart2js:noInline')
+f_101_001_110_010_1(Set<String> u, int b) => v(u, '1010011100101', b);
+
+@pragma('dart2js:noInline')
+f_101_001_110_011_1(Set<String> u, int b) => v(u, '1010011100111', b);
+
+@pragma('dart2js:noInline')
+f_101_001_110_100_1(Set<String> u, int b) => v(u, '1010011101001', b);
+
+@pragma('dart2js:noInline')
+f_101_001_110_101_1(Set<String> u, int b) => v(u, '1010011101011', b);
+
+@pragma('dart2js:noInline')
+f_101_001_110_110_1(Set<String> u, int b) => v(u, '1010011101101', b);
+
+@pragma('dart2js:noInline')
+f_101_001_110_111_1(Set<String> u, int b) => v(u, '1010011101111', b);
+
+@pragma('dart2js:noInline')
+f_101_001_111_000_1(Set<String> u, int b) => v(u, '1010011110001', b);
+
+@pragma('dart2js:noInline')
+f_101_001_111_001_1(Set<String> u, int b) => v(u, '1010011110011', b);
+
+@pragma('dart2js:noInline')
+f_101_001_111_010_1(Set<String> u, int b) => v(u, '1010011110101', b);
+
+@pragma('dart2js:noInline')
+f_101_001_111_011_1(Set<String> u, int b) => v(u, '1010011110111', b);
+
+@pragma('dart2js:noInline')
+f_101_001_111_100_1(Set<String> u, int b) => v(u, '1010011111001', b);
+
+@pragma('dart2js:noInline')
+f_101_001_111_101_1(Set<String> u, int b) => v(u, '1010011111011', b);
+
+@pragma('dart2js:noInline')
+f_101_001_111_110_1(Set<String> u, int b) => v(u, '1010011111101', b);
+
+@pragma('dart2js:noInline')
+f_101_001_111_111_1(Set<String> u, int b) => v(u, '1010011111111', b);
+
+@pragma('dart2js:noInline')
+f_101_010_000_000_1(Set<String> u, int b) => v(u, '1010100000001', b);
+
+@pragma('dart2js:noInline')
+f_101_010_000_001_1(Set<String> u, int b) => v(u, '1010100000011', b);
+
+@pragma('dart2js:noInline')
+f_101_010_000_010_1(Set<String> u, int b) => v(u, '1010100000101', b);
+
+@pragma('dart2js:noInline')
+f_101_010_000_011_1(Set<String> u, int b) => v(u, '1010100000111', b);
+
+@pragma('dart2js:noInline')
+f_101_010_000_100_1(Set<String> u, int b) => v(u, '1010100001001', b);
+
+@pragma('dart2js:noInline')
+f_101_010_000_101_1(Set<String> u, int b) => v(u, '1010100001011', b);
+
+@pragma('dart2js:noInline')
+f_101_010_000_110_1(Set<String> u, int b) => v(u, '1010100001101', b);
+
+@pragma('dart2js:noInline')
+f_101_010_000_111_1(Set<String> u, int b) => v(u, '1010100001111', b);
+
+@pragma('dart2js:noInline')
+f_101_010_001_000_1(Set<String> u, int b) => v(u, '1010100010001', b);
+
+@pragma('dart2js:noInline')
+f_101_010_001_001_1(Set<String> u, int b) => v(u, '1010100010011', b);
+
+@pragma('dart2js:noInline')
+f_101_010_001_010_1(Set<String> u, int b) => v(u, '1010100010101', b);
+
+@pragma('dart2js:noInline')
+f_101_010_001_011_1(Set<String> u, int b) => v(u, '1010100010111', b);
+
+@pragma('dart2js:noInline')
+f_101_010_001_100_1(Set<String> u, int b) => v(u, '1010100011001', b);
+
+@pragma('dart2js:noInline')
+f_101_010_001_101_1(Set<String> u, int b) => v(u, '1010100011011', b);
+
+@pragma('dart2js:noInline')
+f_101_010_001_110_1(Set<String> u, int b) => v(u, '1010100011101', b);
+
+@pragma('dart2js:noInline')
+f_101_010_001_111_1(Set<String> u, int b) => v(u, '1010100011111', b);
+
+@pragma('dart2js:noInline')
+f_101_010_010_000_1(Set<String> u, int b) => v(u, '1010100100001', b);
+
+@pragma('dart2js:noInline')
+f_101_010_010_001_1(Set<String> u, int b) => v(u, '1010100100011', b);
+
+@pragma('dart2js:noInline')
+f_101_010_010_010_1(Set<String> u, int b) => v(u, '1010100100101', b);
+
+@pragma('dart2js:noInline')
+f_101_010_010_011_1(Set<String> u, int b) => v(u, '1010100100111', b);
+
+@pragma('dart2js:noInline')
+f_101_010_010_100_1(Set<String> u, int b) => v(u, '1010100101001', b);
+
+@pragma('dart2js:noInline')
+f_101_010_010_101_1(Set<String> u, int b) => v(u, '1010100101011', b);
+
+@pragma('dart2js:noInline')
+f_101_010_010_110_1(Set<String> u, int b) => v(u, '1010100101101', b);
+
+@pragma('dart2js:noInline')
+f_101_010_010_111_1(Set<String> u, int b) => v(u, '1010100101111', b);
+
+@pragma('dart2js:noInline')
+f_101_010_011_000_1(Set<String> u, int b) => v(u, '1010100110001', b);
+
+@pragma('dart2js:noInline')
+f_101_010_011_001_1(Set<String> u, int b) => v(u, '1010100110011', b);
+
+@pragma('dart2js:noInline')
+f_101_010_011_010_1(Set<String> u, int b) => v(u, '1010100110101', b);
+
+@pragma('dart2js:noInline')
+f_101_010_011_011_1(Set<String> u, int b) => v(u, '1010100110111', b);
+
+@pragma('dart2js:noInline')
+f_101_010_011_100_1(Set<String> u, int b) => v(u, '1010100111001', b);
+
+@pragma('dart2js:noInline')
+f_101_010_011_101_1(Set<String> u, int b) => v(u, '1010100111011', b);
+
+@pragma('dart2js:noInline')
+f_101_010_011_110_1(Set<String> u, int b) => v(u, '1010100111101', b);
+
+@pragma('dart2js:noInline')
+f_101_010_011_111_1(Set<String> u, int b) => v(u, '1010100111111', b);
+
+@pragma('dart2js:noInline')
+f_101_010_100_000_1(Set<String> u, int b) => v(u, '1010101000001', b);
+
+@pragma('dart2js:noInline')
+f_101_010_100_001_1(Set<String> u, int b) => v(u, '1010101000011', b);
+
+@pragma('dart2js:noInline')
+f_101_010_100_010_1(Set<String> u, int b) => v(u, '1010101000101', b);
+
+@pragma('dart2js:noInline')
+f_101_010_100_011_1(Set<String> u, int b) => v(u, '1010101000111', b);
+
+@pragma('dart2js:noInline')
+f_101_010_100_100_1(Set<String> u, int b) => v(u, '1010101001001', b);
+
+@pragma('dart2js:noInline')
+f_101_010_100_101_1(Set<String> u, int b) => v(u, '1010101001011', b);
+
+@pragma('dart2js:noInline')
+f_101_010_100_110_1(Set<String> u, int b) => v(u, '1010101001101', b);
+
+@pragma('dart2js:noInline')
+f_101_010_100_111_1(Set<String> u, int b) => v(u, '1010101001111', b);
+
+@pragma('dart2js:noInline')
+f_101_010_101_000_1(Set<String> u, int b) => v(u, '1010101010001', b);
+
+@pragma('dart2js:noInline')
+f_101_010_101_001_1(Set<String> u, int b) => v(u, '1010101010011', b);
+
+@pragma('dart2js:noInline')
+f_101_010_101_010_1(Set<String> u, int b) => v(u, '1010101010101', b);
+
+@pragma('dart2js:noInline')
+f_101_010_101_011_1(Set<String> u, int b) => v(u, '1010101010111', b);
+
+@pragma('dart2js:noInline')
+f_101_010_101_100_1(Set<String> u, int b) => v(u, '1010101011001', b);
+
+@pragma('dart2js:noInline')
+f_101_010_101_101_1(Set<String> u, int b) => v(u, '1010101011011', b);
+
+@pragma('dart2js:noInline')
+f_101_010_101_110_1(Set<String> u, int b) => v(u, '1010101011101', b);
+
+@pragma('dart2js:noInline')
+f_101_010_101_111_1(Set<String> u, int b) => v(u, '1010101011111', b);
+
+@pragma('dart2js:noInline')
+f_101_010_110_000_1(Set<String> u, int b) => v(u, '1010101100001', b);
+
+@pragma('dart2js:noInline')
+f_101_010_110_001_1(Set<String> u, int b) => v(u, '1010101100011', b);
+
+@pragma('dart2js:noInline')
+f_101_010_110_010_1(Set<String> u, int b) => v(u, '1010101100101', b);
+
+@pragma('dart2js:noInline')
+f_101_010_110_011_1(Set<String> u, int b) => v(u, '1010101100111', b);
+
+@pragma('dart2js:noInline')
+f_101_010_110_100_1(Set<String> u, int b) => v(u, '1010101101001', b);
+
+@pragma('dart2js:noInline')
+f_101_010_110_101_1(Set<String> u, int b) => v(u, '1010101101011', b);
+
+@pragma('dart2js:noInline')
+f_101_010_110_110_1(Set<String> u, int b) => v(u, '1010101101101', b);
+
+@pragma('dart2js:noInline')
+f_101_010_110_111_1(Set<String> u, int b) => v(u, '1010101101111', b);
+
+@pragma('dart2js:noInline')
+f_101_010_111_000_1(Set<String> u, int b) => v(u, '1010101110001', b);
+
+@pragma('dart2js:noInline')
+f_101_010_111_001_1(Set<String> u, int b) => v(u, '1010101110011', b);
+
+@pragma('dart2js:noInline')
+f_101_010_111_010_1(Set<String> u, int b) => v(u, '1010101110101', b);
+
+@pragma('dart2js:noInline')
+f_101_010_111_011_1(Set<String> u, int b) => v(u, '1010101110111', b);
+
+@pragma('dart2js:noInline')
+f_101_010_111_100_1(Set<String> u, int b) => v(u, '1010101111001', b);
+
+@pragma('dart2js:noInline')
+f_101_010_111_101_1(Set<String> u, int b) => v(u, '1010101111011', b);
+
+@pragma('dart2js:noInline')
+f_101_010_111_110_1(Set<String> u, int b) => v(u, '1010101111101', b);
+
+@pragma('dart2js:noInline')
+f_101_010_111_111_1(Set<String> u, int b) => v(u, '1010101111111', b);
+
+@pragma('dart2js:noInline')
+f_101_011_000_000_1(Set<String> u, int b) => v(u, '1010110000001', b);
+
+@pragma('dart2js:noInline')
+f_101_011_000_001_1(Set<String> u, int b) => v(u, '1010110000011', b);
+
+@pragma('dart2js:noInline')
+f_101_011_000_010_1(Set<String> u, int b) => v(u, '1010110000101', b);
+
+@pragma('dart2js:noInline')
+f_101_011_000_011_1(Set<String> u, int b) => v(u, '1010110000111', b);
+
+@pragma('dart2js:noInline')
+f_101_011_000_100_1(Set<String> u, int b) => v(u, '1010110001001', b);
+
+@pragma('dart2js:noInline')
+f_101_011_000_101_1(Set<String> u, int b) => v(u, '1010110001011', b);
+
+@pragma('dart2js:noInline')
+f_101_011_000_110_1(Set<String> u, int b) => v(u, '1010110001101', b);
+
+@pragma('dart2js:noInline')
+f_101_011_000_111_1(Set<String> u, int b) => v(u, '1010110001111', b);
+
+@pragma('dart2js:noInline')
+f_101_011_001_000_1(Set<String> u, int b) => v(u, '1010110010001', b);
+
+@pragma('dart2js:noInline')
+f_101_011_001_001_1(Set<String> u, int b) => v(u, '1010110010011', b);
+
+@pragma('dart2js:noInline')
+f_101_011_001_010_1(Set<String> u, int b) => v(u, '1010110010101', b);
+
+@pragma('dart2js:noInline')
+f_101_011_001_011_1(Set<String> u, int b) => v(u, '1010110010111', b);
+
+@pragma('dart2js:noInline')
+f_101_011_001_100_1(Set<String> u, int b) => v(u, '1010110011001', b);
+
+@pragma('dart2js:noInline')
+f_101_011_001_101_1(Set<String> u, int b) => v(u, '1010110011011', b);
+
+@pragma('dart2js:noInline')
+f_101_011_001_110_1(Set<String> u, int b) => v(u, '1010110011101', b);
+
+@pragma('dart2js:noInline')
+f_101_011_001_111_1(Set<String> u, int b) => v(u, '1010110011111', b);
+
+@pragma('dart2js:noInline')
+f_101_011_010_000_1(Set<String> u, int b) => v(u, '1010110100001', b);
+
+@pragma('dart2js:noInline')
+f_101_011_010_001_1(Set<String> u, int b) => v(u, '1010110100011', b);
+
+@pragma('dart2js:noInline')
+f_101_011_010_010_1(Set<String> u, int b) => v(u, '1010110100101', b);
+
+@pragma('dart2js:noInline')
+f_101_011_010_011_1(Set<String> u, int b) => v(u, '1010110100111', b);
+
+@pragma('dart2js:noInline')
+f_101_011_010_100_1(Set<String> u, int b) => v(u, '1010110101001', b);
+
+@pragma('dart2js:noInline')
+f_101_011_010_101_1(Set<String> u, int b) => v(u, '1010110101011', b);
+
+@pragma('dart2js:noInline')
+f_101_011_010_110_1(Set<String> u, int b) => v(u, '1010110101101', b);
+
+@pragma('dart2js:noInline')
+f_101_011_010_111_1(Set<String> u, int b) => v(u, '1010110101111', b);
+
+@pragma('dart2js:noInline')
+f_101_011_011_000_1(Set<String> u, int b) => v(u, '1010110110001', b);
+
+@pragma('dart2js:noInline')
+f_101_011_011_001_1(Set<String> u, int b) => v(u, '1010110110011', b);
+
+@pragma('dart2js:noInline')
+f_101_011_011_010_1(Set<String> u, int b) => v(u, '1010110110101', b);
+
+@pragma('dart2js:noInline')
+f_101_011_011_011_1(Set<String> u, int b) => v(u, '1010110110111', b);
+
+@pragma('dart2js:noInline')
+f_101_011_011_100_1(Set<String> u, int b) => v(u, '1010110111001', b);
+
+@pragma('dart2js:noInline')
+f_101_011_011_101_1(Set<String> u, int b) => v(u, '1010110111011', b);
+
+@pragma('dart2js:noInline')
+f_101_011_011_110_1(Set<String> u, int b) => v(u, '1010110111101', b);
+
+@pragma('dart2js:noInline')
+f_101_011_011_111_1(Set<String> u, int b) => v(u, '1010110111111', b);
+
+@pragma('dart2js:noInline')
+f_101_011_100_000_1(Set<String> u, int b) => v(u, '1010111000001', b);
+
+@pragma('dart2js:noInline')
+f_101_011_100_001_1(Set<String> u, int b) => v(u, '1010111000011', b);
+
+@pragma('dart2js:noInline')
+f_101_011_100_010_1(Set<String> u, int b) => v(u, '1010111000101', b);
+
+@pragma('dart2js:noInline')
+f_101_011_100_011_1(Set<String> u, int b) => v(u, '1010111000111', b);
+
+@pragma('dart2js:noInline')
+f_101_011_100_100_1(Set<String> u, int b) => v(u, '1010111001001', b);
+
+@pragma('dart2js:noInline')
+f_101_011_100_101_1(Set<String> u, int b) => v(u, '1010111001011', b);
+
+@pragma('dart2js:noInline')
+f_101_011_100_110_1(Set<String> u, int b) => v(u, '1010111001101', b);
+
+@pragma('dart2js:noInline')
+f_101_011_100_111_1(Set<String> u, int b) => v(u, '1010111001111', b);
+
+@pragma('dart2js:noInline')
+f_101_011_101_000_1(Set<String> u, int b) => v(u, '1010111010001', b);
+
+@pragma('dart2js:noInline')
+f_101_011_101_001_1(Set<String> u, int b) => v(u, '1010111010011', b);
+
+@pragma('dart2js:noInline')
+f_101_011_101_010_1(Set<String> u, int b) => v(u, '1010111010101', b);
+
+@pragma('dart2js:noInline')
+f_101_011_101_011_1(Set<String> u, int b) => v(u, '1010111010111', b);
+
+@pragma('dart2js:noInline')
+f_101_011_101_100_1(Set<String> u, int b) => v(u, '1010111011001', b);
+
+@pragma('dart2js:noInline')
+f_101_011_101_101_1(Set<String> u, int b) => v(u, '1010111011011', b);
+
+@pragma('dart2js:noInline')
+f_101_011_101_110_1(Set<String> u, int b) => v(u, '1010111011101', b);
+
+@pragma('dart2js:noInline')
+f_101_011_101_111_1(Set<String> u, int b) => v(u, '1010111011111', b);
+
+@pragma('dart2js:noInline')
+f_101_011_110_000_1(Set<String> u, int b) => v(u, '1010111100001', b);
+
+@pragma('dart2js:noInline')
+f_101_011_110_001_1(Set<String> u, int b) => v(u, '1010111100011', b);
+
+@pragma('dart2js:noInline')
+f_101_011_110_010_1(Set<String> u, int b) => v(u, '1010111100101', b);
+
+@pragma('dart2js:noInline')
+f_101_011_110_011_1(Set<String> u, int b) => v(u, '1010111100111', b);
+
+@pragma('dart2js:noInline')
+f_101_011_110_100_1(Set<String> u, int b) => v(u, '1010111101001', b);
+
+@pragma('dart2js:noInline')
+f_101_011_110_101_1(Set<String> u, int b) => v(u, '1010111101011', b);
+
+@pragma('dart2js:noInline')
+f_101_011_110_110_1(Set<String> u, int b) => v(u, '1010111101101', b);
+
+@pragma('dart2js:noInline')
+f_101_011_110_111_1(Set<String> u, int b) => v(u, '1010111101111', b);
+
+@pragma('dart2js:noInline')
+f_101_011_111_000_1(Set<String> u, int b) => v(u, '1010111110001', b);
+
+@pragma('dart2js:noInline')
+f_101_011_111_001_1(Set<String> u, int b) => v(u, '1010111110011', b);
+
+@pragma('dart2js:noInline')
+f_101_011_111_010_1(Set<String> u, int b) => v(u, '1010111110101', b);
+
+@pragma('dart2js:noInline')
+f_101_011_111_011_1(Set<String> u, int b) => v(u, '1010111110111', b);
+
+@pragma('dart2js:noInline')
+f_101_011_111_100_1(Set<String> u, int b) => v(u, '1010111111001', b);
+
+@pragma('dart2js:noInline')
+f_101_011_111_101_1(Set<String> u, int b) => v(u, '1010111111011', b);
+
+@pragma('dart2js:noInline')
+f_101_011_111_110_1(Set<String> u, int b) => v(u, '1010111111101', b);
+
+@pragma('dart2js:noInline')
+f_101_011_111_111_1(Set<String> u, int b) => v(u, '1010111111111', b);
+
+@pragma('dart2js:noInline')
+f_101_100_000_000_1(Set<String> u, int b) => v(u, '1011000000001', b);
+
+@pragma('dart2js:noInline')
+f_101_100_000_001_1(Set<String> u, int b) => v(u, '1011000000011', b);
+
+@pragma('dart2js:noInline')
+f_101_100_000_010_1(Set<String> u, int b) => v(u, '1011000000101', b);
+
+@pragma('dart2js:noInline')
+f_101_100_000_011_1(Set<String> u, int b) => v(u, '1011000000111', b);
+
+@pragma('dart2js:noInline')
+f_101_100_000_100_1(Set<String> u, int b) => v(u, '1011000001001', b);
+
+@pragma('dart2js:noInline')
+f_101_100_000_101_1(Set<String> u, int b) => v(u, '1011000001011', b);
+
+@pragma('dart2js:noInline')
+f_101_100_000_110_1(Set<String> u, int b) => v(u, '1011000001101', b);
+
+@pragma('dart2js:noInline')
+f_101_100_000_111_1(Set<String> u, int b) => v(u, '1011000001111', b);
+
+@pragma('dart2js:noInline')
+f_101_100_001_000_1(Set<String> u, int b) => v(u, '1011000010001', b);
+
+@pragma('dart2js:noInline')
+f_101_100_001_001_1(Set<String> u, int b) => v(u, '1011000010011', b);
+
+@pragma('dart2js:noInline')
+f_101_100_001_010_1(Set<String> u, int b) => v(u, '1011000010101', b);
+
+@pragma('dart2js:noInline')
+f_101_100_001_011_1(Set<String> u, int b) => v(u, '1011000010111', b);
+
+@pragma('dart2js:noInline')
+f_101_100_001_100_1(Set<String> u, int b) => v(u, '1011000011001', b);
+
+@pragma('dart2js:noInline')
+f_101_100_001_101_1(Set<String> u, int b) => v(u, '1011000011011', b);
+
+@pragma('dart2js:noInline')
+f_101_100_001_110_1(Set<String> u, int b) => v(u, '1011000011101', b);
+
+@pragma('dart2js:noInline')
+f_101_100_001_111_1(Set<String> u, int b) => v(u, '1011000011111', b);
+
+@pragma('dart2js:noInline')
+f_101_100_010_000_1(Set<String> u, int b) => v(u, '1011000100001', b);
+
+@pragma('dart2js:noInline')
+f_101_100_010_001_1(Set<String> u, int b) => v(u, '1011000100011', b);
+
+@pragma('dart2js:noInline')
+f_101_100_010_010_1(Set<String> u, int b) => v(u, '1011000100101', b);
+
+@pragma('dart2js:noInline')
+f_101_100_010_011_1(Set<String> u, int b) => v(u, '1011000100111', b);
+
+@pragma('dart2js:noInline')
+f_101_100_010_100_1(Set<String> u, int b) => v(u, '1011000101001', b);
+
+@pragma('dart2js:noInline')
+f_101_100_010_101_1(Set<String> u, int b) => v(u, '1011000101011', b);
+
+@pragma('dart2js:noInline')
+f_101_100_010_110_1(Set<String> u, int b) => v(u, '1011000101101', b);
+
+@pragma('dart2js:noInline')
+f_101_100_010_111_1(Set<String> u, int b) => v(u, '1011000101111', b);
+
+@pragma('dart2js:noInline')
+f_101_100_011_000_1(Set<String> u, int b) => v(u, '1011000110001', b);
+
+@pragma('dart2js:noInline')
+f_101_100_011_001_1(Set<String> u, int b) => v(u, '1011000110011', b);
+
+@pragma('dart2js:noInline')
+f_101_100_011_010_1(Set<String> u, int b) => v(u, '1011000110101', b);
+
+@pragma('dart2js:noInline')
+f_101_100_011_011_1(Set<String> u, int b) => v(u, '1011000110111', b);
+
+@pragma('dart2js:noInline')
+f_101_100_011_100_1(Set<String> u, int b) => v(u, '1011000111001', b);
+
+@pragma('dart2js:noInline')
+f_101_100_011_101_1(Set<String> u, int b) => v(u, '1011000111011', b);
+
+@pragma('dart2js:noInline')
+f_101_100_011_110_1(Set<String> u, int b) => v(u, '1011000111101', b);
+
+@pragma('dart2js:noInline')
+f_101_100_011_111_1(Set<String> u, int b) => v(u, '1011000111111', b);
+
+@pragma('dart2js:noInline')
+f_101_100_100_000_1(Set<String> u, int b) => v(u, '1011001000001', b);
+
+@pragma('dart2js:noInline')
+f_101_100_100_001_1(Set<String> u, int b) => v(u, '1011001000011', b);
+
+@pragma('dart2js:noInline')
+f_101_100_100_010_1(Set<String> u, int b) => v(u, '1011001000101', b);
+
+@pragma('dart2js:noInline')
+f_101_100_100_011_1(Set<String> u, int b) => v(u, '1011001000111', b);
+
+@pragma('dart2js:noInline')
+f_101_100_100_100_1(Set<String> u, int b) => v(u, '1011001001001', b);
+
+@pragma('dart2js:noInline')
+f_101_100_100_101_1(Set<String> u, int b) => v(u, '1011001001011', b);
+
+@pragma('dart2js:noInline')
+f_101_100_100_110_1(Set<String> u, int b) => v(u, '1011001001101', b);
+
+@pragma('dart2js:noInline')
+f_101_100_100_111_1(Set<String> u, int b) => v(u, '1011001001111', b);
+
+@pragma('dart2js:noInline')
+f_101_100_101_000_1(Set<String> u, int b) => v(u, '1011001010001', b);
+
+@pragma('dart2js:noInline')
+f_101_100_101_001_1(Set<String> u, int b) => v(u, '1011001010011', b);
+
+@pragma('dart2js:noInline')
+f_101_100_101_010_1(Set<String> u, int b) => v(u, '1011001010101', b);
+
+@pragma('dart2js:noInline')
+f_101_100_101_011_1(Set<String> u, int b) => v(u, '1011001010111', b);
+
+@pragma('dart2js:noInline')
+f_101_100_101_100_1(Set<String> u, int b) => v(u, '1011001011001', b);
+
+@pragma('dart2js:noInline')
+f_101_100_101_101_1(Set<String> u, int b) => v(u, '1011001011011', b);
+
+@pragma('dart2js:noInline')
+f_101_100_101_110_1(Set<String> u, int b) => v(u, '1011001011101', b);
+
+@pragma('dart2js:noInline')
+f_101_100_101_111_1(Set<String> u, int b) => v(u, '1011001011111', b);
+
+@pragma('dart2js:noInline')
+f_101_100_110_000_1(Set<String> u, int b) => v(u, '1011001100001', b);
+
+@pragma('dart2js:noInline')
+f_101_100_110_001_1(Set<String> u, int b) => v(u, '1011001100011', b);
+
+@pragma('dart2js:noInline')
+f_101_100_110_010_1(Set<String> u, int b) => v(u, '1011001100101', b);
+
+@pragma('dart2js:noInline')
+f_101_100_110_011_1(Set<String> u, int b) => v(u, '1011001100111', b);
+
+@pragma('dart2js:noInline')
+f_101_100_110_100_1(Set<String> u, int b) => v(u, '1011001101001', b);
+
+@pragma('dart2js:noInline')
+f_101_100_110_101_1(Set<String> u, int b) => v(u, '1011001101011', b);
+
+@pragma('dart2js:noInline')
+f_101_100_110_110_1(Set<String> u, int b) => v(u, '1011001101101', b);
+
+@pragma('dart2js:noInline')
+f_101_100_110_111_1(Set<String> u, int b) => v(u, '1011001101111', b);
+
+@pragma('dart2js:noInline')
+f_101_100_111_000_1(Set<String> u, int b) => v(u, '1011001110001', b);
+
+@pragma('dart2js:noInline')
+f_101_100_111_001_1(Set<String> u, int b) => v(u, '1011001110011', b);
+
+@pragma('dart2js:noInline')
+f_101_100_111_010_1(Set<String> u, int b) => v(u, '1011001110101', b);
+
+@pragma('dart2js:noInline')
+f_101_100_111_011_1(Set<String> u, int b) => v(u, '1011001110111', b);
+
+@pragma('dart2js:noInline')
+f_101_100_111_100_1(Set<String> u, int b) => v(u, '1011001111001', b);
+
+@pragma('dart2js:noInline')
+f_101_100_111_101_1(Set<String> u, int b) => v(u, '1011001111011', b);
+
+@pragma('dart2js:noInline')
+f_101_100_111_110_1(Set<String> u, int b) => v(u, '1011001111101', b);
+
+@pragma('dart2js:noInline')
+f_101_100_111_111_1(Set<String> u, int b) => v(u, '1011001111111', b);
+
+@pragma('dart2js:noInline')
+f_101_101_000_000_1(Set<String> u, int b) => v(u, '1011010000001', b);
+
+@pragma('dart2js:noInline')
+f_101_101_000_001_1(Set<String> u, int b) => v(u, '1011010000011', b);
+
+@pragma('dart2js:noInline')
+f_101_101_000_010_1(Set<String> u, int b) => v(u, '1011010000101', b);
+
+@pragma('dart2js:noInline')
+f_101_101_000_011_1(Set<String> u, int b) => v(u, '1011010000111', b);
+
+@pragma('dart2js:noInline')
+f_101_101_000_100_1(Set<String> u, int b) => v(u, '1011010001001', b);
+
+@pragma('dart2js:noInline')
+f_101_101_000_101_1(Set<String> u, int b) => v(u, '1011010001011', b);
+
+@pragma('dart2js:noInline')
+f_101_101_000_110_1(Set<String> u, int b) => v(u, '1011010001101', b);
+
+@pragma('dart2js:noInline')
+f_101_101_000_111_1(Set<String> u, int b) => v(u, '1011010001111', b);
+
+@pragma('dart2js:noInline')
+f_101_101_001_000_1(Set<String> u, int b) => v(u, '1011010010001', b);
+
+@pragma('dart2js:noInline')
+f_101_101_001_001_1(Set<String> u, int b) => v(u, '1011010010011', b);
+
+@pragma('dart2js:noInline')
+f_101_101_001_010_1(Set<String> u, int b) => v(u, '1011010010101', b);
+
+@pragma('dart2js:noInline')
+f_101_101_001_011_1(Set<String> u, int b) => v(u, '1011010010111', b);
+
+@pragma('dart2js:noInline')
+f_101_101_001_100_1(Set<String> u, int b) => v(u, '1011010011001', b);
+
+@pragma('dart2js:noInline')
+f_101_101_001_101_1(Set<String> u, int b) => v(u, '1011010011011', b);
+
+@pragma('dart2js:noInline')
+f_101_101_001_110_1(Set<String> u, int b) => v(u, '1011010011101', b);
+
+@pragma('dart2js:noInline')
+f_101_101_001_111_1(Set<String> u, int b) => v(u, '1011010011111', b);
+
+@pragma('dart2js:noInline')
+f_101_101_010_000_1(Set<String> u, int b) => v(u, '1011010100001', b);
+
+@pragma('dart2js:noInline')
+f_101_101_010_001_1(Set<String> u, int b) => v(u, '1011010100011', b);
+
+@pragma('dart2js:noInline')
+f_101_101_010_010_1(Set<String> u, int b) => v(u, '1011010100101', b);
+
+@pragma('dart2js:noInline')
+f_101_101_010_011_1(Set<String> u, int b) => v(u, '1011010100111', b);
+
+@pragma('dart2js:noInline')
+f_101_101_010_100_1(Set<String> u, int b) => v(u, '1011010101001', b);
+
+@pragma('dart2js:noInline')
+f_101_101_010_101_1(Set<String> u, int b) => v(u, '1011010101011', b);
+
+@pragma('dart2js:noInline')
+f_101_101_010_110_1(Set<String> u, int b) => v(u, '1011010101101', b);
+
+@pragma('dart2js:noInline')
+f_101_101_010_111_1(Set<String> u, int b) => v(u, '1011010101111', b);
+
+@pragma('dart2js:noInline')
+f_101_101_011_000_1(Set<String> u, int b) => v(u, '1011010110001', b);
+
+@pragma('dart2js:noInline')
+f_101_101_011_001_1(Set<String> u, int b) => v(u, '1011010110011', b);
+
+@pragma('dart2js:noInline')
+f_101_101_011_010_1(Set<String> u, int b) => v(u, '1011010110101', b);
+
+@pragma('dart2js:noInline')
+f_101_101_011_011_1(Set<String> u, int b) => v(u, '1011010110111', b);
+
+@pragma('dart2js:noInline')
+f_101_101_011_100_1(Set<String> u, int b) => v(u, '1011010111001', b);
+
+@pragma('dart2js:noInline')
+f_101_101_011_101_1(Set<String> u, int b) => v(u, '1011010111011', b);
+
+@pragma('dart2js:noInline')
+f_101_101_011_110_1(Set<String> u, int b) => v(u, '1011010111101', b);
+
+@pragma('dart2js:noInline')
+f_101_101_011_111_1(Set<String> u, int b) => v(u, '1011010111111', b);
+
+@pragma('dart2js:noInline')
+f_101_101_100_000_1(Set<String> u, int b) => v(u, '1011011000001', b);
+
+@pragma('dart2js:noInline')
+f_101_101_100_001_1(Set<String> u, int b) => v(u, '1011011000011', b);
+
+@pragma('dart2js:noInline')
+f_101_101_100_010_1(Set<String> u, int b) => v(u, '1011011000101', b);
+
+@pragma('dart2js:noInline')
+f_101_101_100_011_1(Set<String> u, int b) => v(u, '1011011000111', b);
+
+@pragma('dart2js:noInline')
+f_101_101_100_100_1(Set<String> u, int b) => v(u, '1011011001001', b);
+
+@pragma('dart2js:noInline')
+f_101_101_100_101_1(Set<String> u, int b) => v(u, '1011011001011', b);
+
+@pragma('dart2js:noInline')
+f_101_101_100_110_1(Set<String> u, int b) => v(u, '1011011001101', b);
+
+@pragma('dart2js:noInline')
+f_101_101_100_111_1(Set<String> u, int b) => v(u, '1011011001111', b);
+
+@pragma('dart2js:noInline')
+f_101_101_101_000_1(Set<String> u, int b) => v(u, '1011011010001', b);
+
+@pragma('dart2js:noInline')
+f_101_101_101_001_1(Set<String> u, int b) => v(u, '1011011010011', b);
+
+@pragma('dart2js:noInline')
+f_101_101_101_010_1(Set<String> u, int b) => v(u, '1011011010101', b);
+
+@pragma('dart2js:noInline')
+f_101_101_101_011_1(Set<String> u, int b) => v(u, '1011011010111', b);
+
+@pragma('dart2js:noInline')
+f_101_101_101_100_1(Set<String> u, int b) => v(u, '1011011011001', b);
+
+@pragma('dart2js:noInline')
+f_101_101_101_101_1(Set<String> u, int b) => v(u, '1011011011011', b);
+
+@pragma('dart2js:noInline')
+f_101_101_101_110_1(Set<String> u, int b) => v(u, '1011011011101', b);
+
+@pragma('dart2js:noInline')
+f_101_101_101_111_1(Set<String> u, int b) => v(u, '1011011011111', b);
+
+@pragma('dart2js:noInline')
+f_101_101_110_000_1(Set<String> u, int b) => v(u, '1011011100001', b);
+
+@pragma('dart2js:noInline')
+f_101_101_110_001_1(Set<String> u, int b) => v(u, '1011011100011', b);
+
+@pragma('dart2js:noInline')
+f_101_101_110_010_1(Set<String> u, int b) => v(u, '1011011100101', b);
+
+@pragma('dart2js:noInline')
+f_101_101_110_011_1(Set<String> u, int b) => v(u, '1011011100111', b);
+
+@pragma('dart2js:noInline')
+f_101_101_110_100_1(Set<String> u, int b) => v(u, '1011011101001', b);
+
+@pragma('dart2js:noInline')
+f_101_101_110_101_1(Set<String> u, int b) => v(u, '1011011101011', b);
+
+@pragma('dart2js:noInline')
+f_101_101_110_110_1(Set<String> u, int b) => v(u, '1011011101101', b);
+
+@pragma('dart2js:noInline')
+f_101_101_110_111_1(Set<String> u, int b) => v(u, '1011011101111', b);
+
+@pragma('dart2js:noInline')
+f_101_101_111_000_1(Set<String> u, int b) => v(u, '1011011110001', b);
+
+@pragma('dart2js:noInline')
+f_101_101_111_001_1(Set<String> u, int b) => v(u, '1011011110011', b);
+
+@pragma('dart2js:noInline')
+f_101_101_111_010_1(Set<String> u, int b) => v(u, '1011011110101', b);
+
+@pragma('dart2js:noInline')
+f_101_101_111_011_1(Set<String> u, int b) => v(u, '1011011110111', b);
+
+@pragma('dart2js:noInline')
+f_101_101_111_100_1(Set<String> u, int b) => v(u, '1011011111001', b);
+
+@pragma('dart2js:noInline')
+f_101_101_111_101_1(Set<String> u, int b) => v(u, '1011011111011', b);
+
+@pragma('dart2js:noInline')
+f_101_101_111_110_1(Set<String> u, int b) => v(u, '1011011111101', b);
+
+@pragma('dart2js:noInline')
+f_101_101_111_111_1(Set<String> u, int b) => v(u, '1011011111111', b);
+
+@pragma('dart2js:noInline')
+f_101_110_000_000_1(Set<String> u, int b) => v(u, '1011100000001', b);
+
+@pragma('dart2js:noInline')
+f_101_110_000_001_1(Set<String> u, int b) => v(u, '1011100000011', b);
+
+@pragma('dart2js:noInline')
+f_101_110_000_010_1(Set<String> u, int b) => v(u, '1011100000101', b);
+
+@pragma('dart2js:noInline')
+f_101_110_000_011_1(Set<String> u, int b) => v(u, '1011100000111', b);
+
+@pragma('dart2js:noInline')
+f_101_110_000_100_1(Set<String> u, int b) => v(u, '1011100001001', b);
+
+@pragma('dart2js:noInline')
+f_101_110_000_101_1(Set<String> u, int b) => v(u, '1011100001011', b);
+
+@pragma('dart2js:noInline')
+f_101_110_000_110_1(Set<String> u, int b) => v(u, '1011100001101', b);
+
+@pragma('dart2js:noInline')
+f_101_110_000_111_1(Set<String> u, int b) => v(u, '1011100001111', b);
+
+@pragma('dart2js:noInline')
+f_101_110_001_000_1(Set<String> u, int b) => v(u, '1011100010001', b);
+
+@pragma('dart2js:noInline')
+f_101_110_001_001_1(Set<String> u, int b) => v(u, '1011100010011', b);
+
+@pragma('dart2js:noInline')
+f_101_110_001_010_1(Set<String> u, int b) => v(u, '1011100010101', b);
+
+@pragma('dart2js:noInline')
+f_101_110_001_011_1(Set<String> u, int b) => v(u, '1011100010111', b);
+
+@pragma('dart2js:noInline')
+f_101_110_001_100_1(Set<String> u, int b) => v(u, '1011100011001', b);
+
+@pragma('dart2js:noInline')
+f_101_110_001_101_1(Set<String> u, int b) => v(u, '1011100011011', b);
+
+@pragma('dart2js:noInline')
+f_101_110_001_110_1(Set<String> u, int b) => v(u, '1011100011101', b);
+
+@pragma('dart2js:noInline')
+f_101_110_001_111_1(Set<String> u, int b) => v(u, '1011100011111', b);
+
+@pragma('dart2js:noInline')
+f_101_110_010_000_1(Set<String> u, int b) => v(u, '1011100100001', b);
+
+@pragma('dart2js:noInline')
+f_101_110_010_001_1(Set<String> u, int b) => v(u, '1011100100011', b);
+
+@pragma('dart2js:noInline')
+f_101_110_010_010_1(Set<String> u, int b) => v(u, '1011100100101', b);
+
+@pragma('dart2js:noInline')
+f_101_110_010_011_1(Set<String> u, int b) => v(u, '1011100100111', b);
+
+@pragma('dart2js:noInline')
+f_101_110_010_100_1(Set<String> u, int b) => v(u, '1011100101001', b);
+
+@pragma('dart2js:noInline')
+f_101_110_010_101_1(Set<String> u, int b) => v(u, '1011100101011', b);
+
+@pragma('dart2js:noInline')
+f_101_110_010_110_1(Set<String> u, int b) => v(u, '1011100101101', b);
+
+@pragma('dart2js:noInline')
+f_101_110_010_111_1(Set<String> u, int b) => v(u, '1011100101111', b);
+
+@pragma('dart2js:noInline')
+f_101_110_011_000_1(Set<String> u, int b) => v(u, '1011100110001', b);
+
+@pragma('dart2js:noInline')
+f_101_110_011_001_1(Set<String> u, int b) => v(u, '1011100110011', b);
+
+@pragma('dart2js:noInline')
+f_101_110_011_010_1(Set<String> u, int b) => v(u, '1011100110101', b);
+
+@pragma('dart2js:noInline')
+f_101_110_011_011_1(Set<String> u, int b) => v(u, '1011100110111', b);
+
+@pragma('dart2js:noInline')
+f_101_110_011_100_1(Set<String> u, int b) => v(u, '1011100111001', b);
+
+@pragma('dart2js:noInline')
+f_101_110_011_101_1(Set<String> u, int b) => v(u, '1011100111011', b);
+
+@pragma('dart2js:noInline')
+f_101_110_011_110_1(Set<String> u, int b) => v(u, '1011100111101', b);
+
+@pragma('dart2js:noInline')
+f_101_110_011_111_1(Set<String> u, int b) => v(u, '1011100111111', b);
+
+@pragma('dart2js:noInline')
+f_101_110_100_000_1(Set<String> u, int b) => v(u, '1011101000001', b);
+
+@pragma('dart2js:noInline')
+f_101_110_100_001_1(Set<String> u, int b) => v(u, '1011101000011', b);
+
+@pragma('dart2js:noInline')
+f_101_110_100_010_1(Set<String> u, int b) => v(u, '1011101000101', b);
+
+@pragma('dart2js:noInline')
+f_101_110_100_011_1(Set<String> u, int b) => v(u, '1011101000111', b);
+
+@pragma('dart2js:noInline')
+f_101_110_100_100_1(Set<String> u, int b) => v(u, '1011101001001', b);
+
+@pragma('dart2js:noInline')
+f_101_110_100_101_1(Set<String> u, int b) => v(u, '1011101001011', b);
+
+@pragma('dart2js:noInline')
+f_101_110_100_110_1(Set<String> u, int b) => v(u, '1011101001101', b);
+
+@pragma('dart2js:noInline')
+f_101_110_100_111_1(Set<String> u, int b) => v(u, '1011101001111', b);
+
+@pragma('dart2js:noInline')
+f_101_110_101_000_1(Set<String> u, int b) => v(u, '1011101010001', b);
+
+@pragma('dart2js:noInline')
+f_101_110_101_001_1(Set<String> u, int b) => v(u, '1011101010011', b);
+
+@pragma('dart2js:noInline')
+f_101_110_101_010_1(Set<String> u, int b) => v(u, '1011101010101', b);
+
+@pragma('dart2js:noInline')
+f_101_110_101_011_1(Set<String> u, int b) => v(u, '1011101010111', b);
+
+@pragma('dart2js:noInline')
+f_101_110_101_100_1(Set<String> u, int b) => v(u, '1011101011001', b);
+
+@pragma('dart2js:noInline')
+f_101_110_101_101_1(Set<String> u, int b) => v(u, '1011101011011', b);
+
+@pragma('dart2js:noInline')
+f_101_110_101_110_1(Set<String> u, int b) => v(u, '1011101011101', b);
+
+@pragma('dart2js:noInline')
+f_101_110_101_111_1(Set<String> u, int b) => v(u, '1011101011111', b);
+
+@pragma('dart2js:noInline')
+f_101_110_110_000_1(Set<String> u, int b) => v(u, '1011101100001', b);
+
+@pragma('dart2js:noInline')
+f_101_110_110_001_1(Set<String> u, int b) => v(u, '1011101100011', b);
+
+@pragma('dart2js:noInline')
+f_101_110_110_010_1(Set<String> u, int b) => v(u, '1011101100101', b);
+
+@pragma('dart2js:noInline')
+f_101_110_110_011_1(Set<String> u, int b) => v(u, '1011101100111', b);
+
+@pragma('dart2js:noInline')
+f_101_110_110_100_1(Set<String> u, int b) => v(u, '1011101101001', b);
+
+@pragma('dart2js:noInline')
+f_101_110_110_101_1(Set<String> u, int b) => v(u, '1011101101011', b);
+
+@pragma('dart2js:noInline')
+f_101_110_110_110_1(Set<String> u, int b) => v(u, '1011101101101', b);
+
+@pragma('dart2js:noInline')
+f_101_110_110_111_1(Set<String> u, int b) => v(u, '1011101101111', b);
+
+@pragma('dart2js:noInline')
+f_101_110_111_000_1(Set<String> u, int b) => v(u, '1011101110001', b);
+
+@pragma('dart2js:noInline')
+f_101_110_111_001_1(Set<String> u, int b) => v(u, '1011101110011', b);
+
+@pragma('dart2js:noInline')
+f_101_110_111_010_1(Set<String> u, int b) => v(u, '1011101110101', b);
+
+@pragma('dart2js:noInline')
+f_101_110_111_011_1(Set<String> u, int b) => v(u, '1011101110111', b);
+
+@pragma('dart2js:noInline')
+f_101_110_111_100_1(Set<String> u, int b) => v(u, '1011101111001', b);
+
+@pragma('dart2js:noInline')
+f_101_110_111_101_1(Set<String> u, int b) => v(u, '1011101111011', b);
+
+@pragma('dart2js:noInline')
+f_101_110_111_110_1(Set<String> u, int b) => v(u, '1011101111101', b);
+
+@pragma('dart2js:noInline')
+f_101_110_111_111_1(Set<String> u, int b) => v(u, '1011101111111', b);
+
+@pragma('dart2js:noInline')
+f_101_111_000_000_1(Set<String> u, int b) => v(u, '1011110000001', b);
+
+@pragma('dart2js:noInline')
+f_101_111_000_001_1(Set<String> u, int b) => v(u, '1011110000011', b);
+
+@pragma('dart2js:noInline')
+f_101_111_000_010_1(Set<String> u, int b) => v(u, '1011110000101', b);
+
+@pragma('dart2js:noInline')
+f_101_111_000_011_1(Set<String> u, int b) => v(u, '1011110000111', b);
+
+@pragma('dart2js:noInline')
+f_101_111_000_100_1(Set<String> u, int b) => v(u, '1011110001001', b);
+
+@pragma('dart2js:noInline')
+f_101_111_000_101_1(Set<String> u, int b) => v(u, '1011110001011', b);
+
+@pragma('dart2js:noInline')
+f_101_111_000_110_1(Set<String> u, int b) => v(u, '1011110001101', b);
+
+@pragma('dart2js:noInline')
+f_101_111_000_111_1(Set<String> u, int b) => v(u, '1011110001111', b);
+
+@pragma('dart2js:noInline')
+f_101_111_001_000_1(Set<String> u, int b) => v(u, '1011110010001', b);
+
+@pragma('dart2js:noInline')
+f_101_111_001_001_1(Set<String> u, int b) => v(u, '1011110010011', b);
+
+@pragma('dart2js:noInline')
+f_101_111_001_010_1(Set<String> u, int b) => v(u, '1011110010101', b);
+
+@pragma('dart2js:noInline')
+f_101_111_001_011_1(Set<String> u, int b) => v(u, '1011110010111', b);
+
+@pragma('dart2js:noInline')
+f_101_111_001_100_1(Set<String> u, int b) => v(u, '1011110011001', b);
+
+@pragma('dart2js:noInline')
+f_101_111_001_101_1(Set<String> u, int b) => v(u, '1011110011011', b);
+
+@pragma('dart2js:noInline')
+f_101_111_001_110_1(Set<String> u, int b) => v(u, '1011110011101', b);
+
+@pragma('dart2js:noInline')
+f_101_111_001_111_1(Set<String> u, int b) => v(u, '1011110011111', b);
+
+@pragma('dart2js:noInline')
+f_101_111_010_000_1(Set<String> u, int b) => v(u, '1011110100001', b);
+
+@pragma('dart2js:noInline')
+f_101_111_010_001_1(Set<String> u, int b) => v(u, '1011110100011', b);
+
+@pragma('dart2js:noInline')
+f_101_111_010_010_1(Set<String> u, int b) => v(u, '1011110100101', b);
+
+@pragma('dart2js:noInline')
+f_101_111_010_011_1(Set<String> u, int b) => v(u, '1011110100111', b);
+
+@pragma('dart2js:noInline')
+f_101_111_010_100_1(Set<String> u, int b) => v(u, '1011110101001', b);
+
+@pragma('dart2js:noInline')
+f_101_111_010_101_1(Set<String> u, int b) => v(u, '1011110101011', b);
+
+@pragma('dart2js:noInline')
+f_101_111_010_110_1(Set<String> u, int b) => v(u, '1011110101101', b);
+
+@pragma('dart2js:noInline')
+f_101_111_010_111_1(Set<String> u, int b) => v(u, '1011110101111', b);
+
+@pragma('dart2js:noInline')
+f_101_111_011_000_1(Set<String> u, int b) => v(u, '1011110110001', b);
+
+@pragma('dart2js:noInline')
+f_101_111_011_001_1(Set<String> u, int b) => v(u, '1011110110011', b);
+
+@pragma('dart2js:noInline')
+f_101_111_011_010_1(Set<String> u, int b) => v(u, '1011110110101', b);
+
+@pragma('dart2js:noInline')
+f_101_111_011_011_1(Set<String> u, int b) => v(u, '1011110110111', b);
+
+@pragma('dart2js:noInline')
+f_101_111_011_100_1(Set<String> u, int b) => v(u, '1011110111001', b);
+
+@pragma('dart2js:noInline')
+f_101_111_011_101_1(Set<String> u, int b) => v(u, '1011110111011', b);
+
+@pragma('dart2js:noInline')
+f_101_111_011_110_1(Set<String> u, int b) => v(u, '1011110111101', b);
+
+@pragma('dart2js:noInline')
+f_101_111_011_111_1(Set<String> u, int b) => v(u, '1011110111111', b);
+
+@pragma('dart2js:noInline')
+f_101_111_100_000_1(Set<String> u, int b) => v(u, '1011111000001', b);
+
+@pragma('dart2js:noInline')
+f_101_111_100_001_1(Set<String> u, int b) => v(u, '1011111000011', b);
+
+@pragma('dart2js:noInline')
+f_101_111_100_010_1(Set<String> u, int b) => v(u, '1011111000101', b);
+
+@pragma('dart2js:noInline')
+f_101_111_100_011_1(Set<String> u, int b) => v(u, '1011111000111', b);
+
+@pragma('dart2js:noInline')
+f_101_111_100_100_1(Set<String> u, int b) => v(u, '1011111001001', b);
+
+@pragma('dart2js:noInline')
+f_101_111_100_101_1(Set<String> u, int b) => v(u, '1011111001011', b);
+
+@pragma('dart2js:noInline')
+f_101_111_100_110_1(Set<String> u, int b) => v(u, '1011111001101', b);
+
+@pragma('dart2js:noInline')
+f_101_111_100_111_1(Set<String> u, int b) => v(u, '1011111001111', b);
+
+@pragma('dart2js:noInline')
+f_101_111_101_000_1(Set<String> u, int b) => v(u, '1011111010001', b);
+
+@pragma('dart2js:noInline')
+f_101_111_101_001_1(Set<String> u, int b) => v(u, '1011111010011', b);
+
+@pragma('dart2js:noInline')
+f_101_111_101_010_1(Set<String> u, int b) => v(u, '1011111010101', b);
+
+@pragma('dart2js:noInline')
+f_101_111_101_011_1(Set<String> u, int b) => v(u, '1011111010111', b);
+
+@pragma('dart2js:noInline')
+f_101_111_101_100_1(Set<String> u, int b) => v(u, '1011111011001', b);
+
+@pragma('dart2js:noInline')
+f_101_111_101_101_1(Set<String> u, int b) => v(u, '1011111011011', b);
+
+@pragma('dart2js:noInline')
+f_101_111_101_110_1(Set<String> u, int b) => v(u, '1011111011101', b);
+
+@pragma('dart2js:noInline')
+f_101_111_101_111_1(Set<String> u, int b) => v(u, '1011111011111', b);
+
+@pragma('dart2js:noInline')
+f_101_111_110_000_1(Set<String> u, int b) => v(u, '1011111100001', b);
+
+@pragma('dart2js:noInline')
+f_101_111_110_001_1(Set<String> u, int b) => v(u, '1011111100011', b);
+
+@pragma('dart2js:noInline')
+f_101_111_110_010_1(Set<String> u, int b) => v(u, '1011111100101', b);
+
+@pragma('dart2js:noInline')
+f_101_111_110_011_1(Set<String> u, int b) => v(u, '1011111100111', b);
+
+@pragma('dart2js:noInline')
+f_101_111_110_100_1(Set<String> u, int b) => v(u, '1011111101001', b);
+
+@pragma('dart2js:noInline')
+f_101_111_110_101_1(Set<String> u, int b) => v(u, '1011111101011', b);
+
+@pragma('dart2js:noInline')
+f_101_111_110_110_1(Set<String> u, int b) => v(u, '1011111101101', b);
+
+@pragma('dart2js:noInline')
+f_101_111_110_111_1(Set<String> u, int b) => v(u, '1011111101111', b);
+
+@pragma('dart2js:noInline')
+f_101_111_111_000_1(Set<String> u, int b) => v(u, '1011111110001', b);
+
+@pragma('dart2js:noInline')
+f_101_111_111_001_1(Set<String> u, int b) => v(u, '1011111110011', b);
+
+@pragma('dart2js:noInline')
+f_101_111_111_010_1(Set<String> u, int b) => v(u, '1011111110101', b);
+
+@pragma('dart2js:noInline')
+f_101_111_111_011_1(Set<String> u, int b) => v(u, '1011111110111', b);
+
+@pragma('dart2js:noInline')
+f_101_111_111_100_1(Set<String> u, int b) => v(u, '1011111111001', b);
+
+@pragma('dart2js:noInline')
+f_101_111_111_101_1(Set<String> u, int b) => v(u, '1011111111011', b);
+
+@pragma('dart2js:noInline')
+f_101_111_111_110_1(Set<String> u, int b) => v(u, '1011111111101', b);
+
+@pragma('dart2js:noInline')
+f_101_111_111_111_1(Set<String> u, int b) => v(u, '1011111111111', b);
+
+@pragma('dart2js:noInline')
+f_110_000_000_000_1(Set<String> u, int b) => v(u, '1100000000001', b);
+
+@pragma('dart2js:noInline')
+f_110_000_000_001_1(Set<String> u, int b) => v(u, '1100000000011', b);
+
+@pragma('dart2js:noInline')
+f_110_000_000_010_1(Set<String> u, int b) => v(u, '1100000000101', b);
+
+@pragma('dart2js:noInline')
+f_110_000_000_011_1(Set<String> u, int b) => v(u, '1100000000111', b);
+
+@pragma('dart2js:noInline')
+f_110_000_000_100_1(Set<String> u, int b) => v(u, '1100000001001', b);
+
+@pragma('dart2js:noInline')
+f_110_000_000_101_1(Set<String> u, int b) => v(u, '1100000001011', b);
+
+@pragma('dart2js:noInline')
+f_110_000_000_110_1(Set<String> u, int b) => v(u, '1100000001101', b);
+
+@pragma('dart2js:noInline')
+f_110_000_000_111_1(Set<String> u, int b) => v(u, '1100000001111', b);
+
+@pragma('dart2js:noInline')
+f_110_000_001_000_1(Set<String> u, int b) => v(u, '1100000010001', b);
+
+@pragma('dart2js:noInline')
+f_110_000_001_001_1(Set<String> u, int b) => v(u, '1100000010011', b);
+
+@pragma('dart2js:noInline')
+f_110_000_001_010_1(Set<String> u, int b) => v(u, '1100000010101', b);
+
+@pragma('dart2js:noInline')
+f_110_000_001_011_1(Set<String> u, int b) => v(u, '1100000010111', b);
+
+@pragma('dart2js:noInline')
+f_110_000_001_100_1(Set<String> u, int b) => v(u, '1100000011001', b);
+
+@pragma('dart2js:noInline')
+f_110_000_001_101_1(Set<String> u, int b) => v(u, '1100000011011', b);
+
+@pragma('dart2js:noInline')
+f_110_000_001_110_1(Set<String> u, int b) => v(u, '1100000011101', b);
+
+@pragma('dart2js:noInline')
+f_110_000_001_111_1(Set<String> u, int b) => v(u, '1100000011111', b);
+
+@pragma('dart2js:noInline')
+f_110_000_010_000_1(Set<String> u, int b) => v(u, '1100000100001', b);
+
+@pragma('dart2js:noInline')
+f_110_000_010_001_1(Set<String> u, int b) => v(u, '1100000100011', b);
+
+@pragma('dart2js:noInline')
+f_110_000_010_010_1(Set<String> u, int b) => v(u, '1100000100101', b);
+
+@pragma('dart2js:noInline')
+f_110_000_010_011_1(Set<String> u, int b) => v(u, '1100000100111', b);
+
+@pragma('dart2js:noInline')
+f_110_000_010_100_1(Set<String> u, int b) => v(u, '1100000101001', b);
+
+@pragma('dart2js:noInline')
+f_110_000_010_101_1(Set<String> u, int b) => v(u, '1100000101011', b);
+
+@pragma('dart2js:noInline')
+f_110_000_010_110_1(Set<String> u, int b) => v(u, '1100000101101', b);
+
+@pragma('dart2js:noInline')
+f_110_000_010_111_1(Set<String> u, int b) => v(u, '1100000101111', b);
+
+@pragma('dart2js:noInline')
+f_110_000_011_000_1(Set<String> u, int b) => v(u, '1100000110001', b);
+
+@pragma('dart2js:noInline')
+f_110_000_011_001_1(Set<String> u, int b) => v(u, '1100000110011', b);
+
+@pragma('dart2js:noInline')
+f_110_000_011_010_1(Set<String> u, int b) => v(u, '1100000110101', b);
+
+@pragma('dart2js:noInline')
+f_110_000_011_011_1(Set<String> u, int b) => v(u, '1100000110111', b);
+
+@pragma('dart2js:noInline')
+f_110_000_011_100_1(Set<String> u, int b) => v(u, '1100000111001', b);
+
+@pragma('dart2js:noInline')
+f_110_000_011_101_1(Set<String> u, int b) => v(u, '1100000111011', b);
+
+@pragma('dart2js:noInline')
+f_110_000_011_110_1(Set<String> u, int b) => v(u, '1100000111101', b);
+
+@pragma('dart2js:noInline')
+f_110_000_011_111_1(Set<String> u, int b) => v(u, '1100000111111', b);
+
+@pragma('dart2js:noInline')
+f_110_000_100_000_1(Set<String> u, int b) => v(u, '1100001000001', b);
+
+@pragma('dart2js:noInline')
+f_110_000_100_001_1(Set<String> u, int b) => v(u, '1100001000011', b);
+
+@pragma('dart2js:noInline')
+f_110_000_100_010_1(Set<String> u, int b) => v(u, '1100001000101', b);
+
+@pragma('dart2js:noInline')
+f_110_000_100_011_1(Set<String> u, int b) => v(u, '1100001000111', b);
+
+@pragma('dart2js:noInline')
+f_110_000_100_100_1(Set<String> u, int b) => v(u, '1100001001001', b);
+
+@pragma('dart2js:noInline')
+f_110_000_100_101_1(Set<String> u, int b) => v(u, '1100001001011', b);
+
+@pragma('dart2js:noInline')
+f_110_000_100_110_1(Set<String> u, int b) => v(u, '1100001001101', b);
+
+@pragma('dart2js:noInline')
+f_110_000_100_111_1(Set<String> u, int b) => v(u, '1100001001111', b);
+
+@pragma('dart2js:noInline')
+f_110_000_101_000_1(Set<String> u, int b) => v(u, '1100001010001', b);
+
+@pragma('dart2js:noInline')
+f_110_000_101_001_1(Set<String> u, int b) => v(u, '1100001010011', b);
+
+@pragma('dart2js:noInline')
+f_110_000_101_010_1(Set<String> u, int b) => v(u, '1100001010101', b);
+
+@pragma('dart2js:noInline')
+f_110_000_101_011_1(Set<String> u, int b) => v(u, '1100001010111', b);
+
+@pragma('dart2js:noInline')
+f_110_000_101_100_1(Set<String> u, int b) => v(u, '1100001011001', b);
+
+@pragma('dart2js:noInline')
+f_110_000_101_101_1(Set<String> u, int b) => v(u, '1100001011011', b);
+
+@pragma('dart2js:noInline')
+f_110_000_101_110_1(Set<String> u, int b) => v(u, '1100001011101', b);
+
+@pragma('dart2js:noInline')
+f_110_000_101_111_1(Set<String> u, int b) => v(u, '1100001011111', b);
+
+@pragma('dart2js:noInline')
+f_110_000_110_000_1(Set<String> u, int b) => v(u, '1100001100001', b);
+
+@pragma('dart2js:noInline')
+f_110_000_110_001_1(Set<String> u, int b) => v(u, '1100001100011', b);
+
+@pragma('dart2js:noInline')
+f_110_000_110_010_1(Set<String> u, int b) => v(u, '1100001100101', b);
+
+@pragma('dart2js:noInline')
+f_110_000_110_011_1(Set<String> u, int b) => v(u, '1100001100111', b);
+
+@pragma('dart2js:noInline')
+f_110_000_110_100_1(Set<String> u, int b) => v(u, '1100001101001', b);
+
+@pragma('dart2js:noInline')
+f_110_000_110_101_1(Set<String> u, int b) => v(u, '1100001101011', b);
+
+@pragma('dart2js:noInline')
+f_110_000_110_110_1(Set<String> u, int b) => v(u, '1100001101101', b);
+
+@pragma('dart2js:noInline')
+f_110_000_110_111_1(Set<String> u, int b) => v(u, '1100001101111', b);
+
+@pragma('dart2js:noInline')
+f_110_000_111_000_1(Set<String> u, int b) => v(u, '1100001110001', b);
+
+@pragma('dart2js:noInline')
+f_110_000_111_001_1(Set<String> u, int b) => v(u, '1100001110011', b);
+
+@pragma('dart2js:noInline')
+f_110_000_111_010_1(Set<String> u, int b) => v(u, '1100001110101', b);
+
+@pragma('dart2js:noInline')
+f_110_000_111_011_1(Set<String> u, int b) => v(u, '1100001110111', b);
+
+@pragma('dart2js:noInline')
+f_110_000_111_100_1(Set<String> u, int b) => v(u, '1100001111001', b);
+
+@pragma('dart2js:noInline')
+f_110_000_111_101_1(Set<String> u, int b) => v(u, '1100001111011', b);
+
+@pragma('dart2js:noInline')
+f_110_000_111_110_1(Set<String> u, int b) => v(u, '1100001111101', b);
+
+@pragma('dart2js:noInline')
+f_110_000_111_111_1(Set<String> u, int b) => v(u, '1100001111111', b);
+
+@pragma('dart2js:noInline')
+f_110_001_000_000_1(Set<String> u, int b) => v(u, '1100010000001', b);
+
+@pragma('dart2js:noInline')
+f_110_001_000_001_1(Set<String> u, int b) => v(u, '1100010000011', b);
+
+@pragma('dart2js:noInline')
+f_110_001_000_010_1(Set<String> u, int b) => v(u, '1100010000101', b);
+
+@pragma('dart2js:noInline')
+f_110_001_000_011_1(Set<String> u, int b) => v(u, '1100010000111', b);
+
+@pragma('dart2js:noInline')
+f_110_001_000_100_1(Set<String> u, int b) => v(u, '1100010001001', b);
+
+@pragma('dart2js:noInline')
+f_110_001_000_101_1(Set<String> u, int b) => v(u, '1100010001011', b);
+
+@pragma('dart2js:noInline')
+f_110_001_000_110_1(Set<String> u, int b) => v(u, '1100010001101', b);
+
+@pragma('dart2js:noInline')
+f_110_001_000_111_1(Set<String> u, int b) => v(u, '1100010001111', b);
+
+@pragma('dart2js:noInline')
+f_110_001_001_000_1(Set<String> u, int b) => v(u, '1100010010001', b);
+
+@pragma('dart2js:noInline')
+f_110_001_001_001_1(Set<String> u, int b) => v(u, '1100010010011', b);
+
+@pragma('dart2js:noInline')
+f_110_001_001_010_1(Set<String> u, int b) => v(u, '1100010010101', b);
+
+@pragma('dart2js:noInline')
+f_110_001_001_011_1(Set<String> u, int b) => v(u, '1100010010111', b);
+
+@pragma('dart2js:noInline')
+f_110_001_001_100_1(Set<String> u, int b) => v(u, '1100010011001', b);
+
+@pragma('dart2js:noInline')
+f_110_001_001_101_1(Set<String> u, int b) => v(u, '1100010011011', b);
+
+@pragma('dart2js:noInline')
+f_110_001_001_110_1(Set<String> u, int b) => v(u, '1100010011101', b);
+
+@pragma('dart2js:noInline')
+f_110_001_001_111_1(Set<String> u, int b) => v(u, '1100010011111', b);
+
+@pragma('dart2js:noInline')
+f_110_001_010_000_1(Set<String> u, int b) => v(u, '1100010100001', b);
+
+@pragma('dart2js:noInline')
+f_110_001_010_001_1(Set<String> u, int b) => v(u, '1100010100011', b);
+
+@pragma('dart2js:noInline')
+f_110_001_010_010_1(Set<String> u, int b) => v(u, '1100010100101', b);
+
+@pragma('dart2js:noInline')
+f_110_001_010_011_1(Set<String> u, int b) => v(u, '1100010100111', b);
+
+@pragma('dart2js:noInline')
+f_110_001_010_100_1(Set<String> u, int b) => v(u, '1100010101001', b);
+
+@pragma('dart2js:noInline')
+f_110_001_010_101_1(Set<String> u, int b) => v(u, '1100010101011', b);
+
+@pragma('dart2js:noInline')
+f_110_001_010_110_1(Set<String> u, int b) => v(u, '1100010101101', b);
+
+@pragma('dart2js:noInline')
+f_110_001_010_111_1(Set<String> u, int b) => v(u, '1100010101111', b);
+
+@pragma('dart2js:noInline')
+f_110_001_011_000_1(Set<String> u, int b) => v(u, '1100010110001', b);
+
+@pragma('dart2js:noInline')
+f_110_001_011_001_1(Set<String> u, int b) => v(u, '1100010110011', b);
+
+@pragma('dart2js:noInline')
+f_110_001_011_010_1(Set<String> u, int b) => v(u, '1100010110101', b);
+
+@pragma('dart2js:noInline')
+f_110_001_011_011_1(Set<String> u, int b) => v(u, '1100010110111', b);
+
+@pragma('dart2js:noInline')
+f_110_001_011_100_1(Set<String> u, int b) => v(u, '1100010111001', b);
+
+@pragma('dart2js:noInline')
+f_110_001_011_101_1(Set<String> u, int b) => v(u, '1100010111011', b);
+
+@pragma('dart2js:noInline')
+f_110_001_011_110_1(Set<String> u, int b) => v(u, '1100010111101', b);
+
+@pragma('dart2js:noInline')
+f_110_001_011_111_1(Set<String> u, int b) => v(u, '1100010111111', b);
+
+@pragma('dart2js:noInline')
+f_110_001_100_000_1(Set<String> u, int b) => v(u, '1100011000001', b);
+
+@pragma('dart2js:noInline')
+f_110_001_100_001_1(Set<String> u, int b) => v(u, '1100011000011', b);
+
+@pragma('dart2js:noInline')
+f_110_001_100_010_1(Set<String> u, int b) => v(u, '1100011000101', b);
+
+@pragma('dart2js:noInline')
+f_110_001_100_011_1(Set<String> u, int b) => v(u, '1100011000111', b);
+
+@pragma('dart2js:noInline')
+f_110_001_100_100_1(Set<String> u, int b) => v(u, '1100011001001', b);
+
+@pragma('dart2js:noInline')
+f_110_001_100_101_1(Set<String> u, int b) => v(u, '1100011001011', b);
+
+@pragma('dart2js:noInline')
+f_110_001_100_110_1(Set<String> u, int b) => v(u, '1100011001101', b);
+
+@pragma('dart2js:noInline')
+f_110_001_100_111_1(Set<String> u, int b) => v(u, '1100011001111', b);
+
+@pragma('dart2js:noInline')
+f_110_001_101_000_1(Set<String> u, int b) => v(u, '1100011010001', b);
+
+@pragma('dart2js:noInline')
+f_110_001_101_001_1(Set<String> u, int b) => v(u, '1100011010011', b);
+
+@pragma('dart2js:noInline')
+f_110_001_101_010_1(Set<String> u, int b) => v(u, '1100011010101', b);
+
+@pragma('dart2js:noInline')
+f_110_001_101_011_1(Set<String> u, int b) => v(u, '1100011010111', b);
+
+@pragma('dart2js:noInline')
+f_110_001_101_100_1(Set<String> u, int b) => v(u, '1100011011001', b);
+
+@pragma('dart2js:noInline')
+f_110_001_101_101_1(Set<String> u, int b) => v(u, '1100011011011', b);
+
+@pragma('dart2js:noInline')
+f_110_001_101_110_1(Set<String> u, int b) => v(u, '1100011011101', b);
+
+@pragma('dart2js:noInline')
+f_110_001_101_111_1(Set<String> u, int b) => v(u, '1100011011111', b);
+
+@pragma('dart2js:noInline')
+f_110_001_110_000_1(Set<String> u, int b) => v(u, '1100011100001', b);
+
+@pragma('dart2js:noInline')
+f_110_001_110_001_1(Set<String> u, int b) => v(u, '1100011100011', b);
+
+@pragma('dart2js:noInline')
+f_110_001_110_010_1(Set<String> u, int b) => v(u, '1100011100101', b);
+
+@pragma('dart2js:noInline')
+f_110_001_110_011_1(Set<String> u, int b) => v(u, '1100011100111', b);
+
+@pragma('dart2js:noInline')
+f_110_001_110_100_1(Set<String> u, int b) => v(u, '1100011101001', b);
+
+@pragma('dart2js:noInline')
+f_110_001_110_101_1(Set<String> u, int b) => v(u, '1100011101011', b);
+
+@pragma('dart2js:noInline')
+f_110_001_110_110_1(Set<String> u, int b) => v(u, '1100011101101', b);
+
+@pragma('dart2js:noInline')
+f_110_001_110_111_1(Set<String> u, int b) => v(u, '1100011101111', b);
+
+@pragma('dart2js:noInline')
+f_110_001_111_000_1(Set<String> u, int b) => v(u, '1100011110001', b);
+
+@pragma('dart2js:noInline')
+f_110_001_111_001_1(Set<String> u, int b) => v(u, '1100011110011', b);
+
+@pragma('dart2js:noInline')
+f_110_001_111_010_1(Set<String> u, int b) => v(u, '1100011110101', b);
+
+@pragma('dart2js:noInline')
+f_110_001_111_011_1(Set<String> u, int b) => v(u, '1100011110111', b);
+
+@pragma('dart2js:noInline')
+f_110_001_111_100_1(Set<String> u, int b) => v(u, '1100011111001', b);
+
+@pragma('dart2js:noInline')
+f_110_001_111_101_1(Set<String> u, int b) => v(u, '1100011111011', b);
+
+@pragma('dart2js:noInline')
+f_110_001_111_110_1(Set<String> u, int b) => v(u, '1100011111101', b);
+
+@pragma('dart2js:noInline')
+f_110_001_111_111_1(Set<String> u, int b) => v(u, '1100011111111', b);
+
+@pragma('dart2js:noInline')
+f_110_010_000_000_1(Set<String> u, int b) => v(u, '1100100000001', b);
+
+@pragma('dart2js:noInline')
+f_110_010_000_001_1(Set<String> u, int b) => v(u, '1100100000011', b);
+
+@pragma('dart2js:noInline')
+f_110_010_000_010_1(Set<String> u, int b) => v(u, '1100100000101', b);
+
+@pragma('dart2js:noInline')
+f_110_010_000_011_1(Set<String> u, int b) => v(u, '1100100000111', b);
+
+@pragma('dart2js:noInline')
+f_110_010_000_100_1(Set<String> u, int b) => v(u, '1100100001001', b);
+
+@pragma('dart2js:noInline')
+f_110_010_000_101_1(Set<String> u, int b) => v(u, '1100100001011', b);
+
+@pragma('dart2js:noInline')
+f_110_010_000_110_1(Set<String> u, int b) => v(u, '1100100001101', b);
+
+@pragma('dart2js:noInline')
+f_110_010_000_111_1(Set<String> u, int b) => v(u, '1100100001111', b);
+
+@pragma('dart2js:noInline')
+f_110_010_001_000_1(Set<String> u, int b) => v(u, '1100100010001', b);
+
+@pragma('dart2js:noInline')
+f_110_010_001_001_1(Set<String> u, int b) => v(u, '1100100010011', b);
+
+@pragma('dart2js:noInline')
+f_110_010_001_010_1(Set<String> u, int b) => v(u, '1100100010101', b);
+
+@pragma('dart2js:noInline')
+f_110_010_001_011_1(Set<String> u, int b) => v(u, '1100100010111', b);
+
+@pragma('dart2js:noInline')
+f_110_010_001_100_1(Set<String> u, int b) => v(u, '1100100011001', b);
+
+@pragma('dart2js:noInline')
+f_110_010_001_101_1(Set<String> u, int b) => v(u, '1100100011011', b);
+
+@pragma('dart2js:noInline')
+f_110_010_001_110_1(Set<String> u, int b) => v(u, '1100100011101', b);
+
+@pragma('dart2js:noInline')
+f_110_010_001_111_1(Set<String> u, int b) => v(u, '1100100011111', b);
+
+@pragma('dart2js:noInline')
+f_110_010_010_000_1(Set<String> u, int b) => v(u, '1100100100001', b);
+
+@pragma('dart2js:noInline')
+f_110_010_010_001_1(Set<String> u, int b) => v(u, '1100100100011', b);
+
+@pragma('dart2js:noInline')
+f_110_010_010_010_1(Set<String> u, int b) => v(u, '1100100100101', b);
+
+@pragma('dart2js:noInline')
+f_110_010_010_011_1(Set<String> u, int b) => v(u, '1100100100111', b);
+
+@pragma('dart2js:noInline')
+f_110_010_010_100_1(Set<String> u, int b) => v(u, '1100100101001', b);
+
+@pragma('dart2js:noInline')
+f_110_010_010_101_1(Set<String> u, int b) => v(u, '1100100101011', b);
+
+@pragma('dart2js:noInline')
+f_110_010_010_110_1(Set<String> u, int b) => v(u, '1100100101101', b);
+
+@pragma('dart2js:noInline')
+f_110_010_010_111_1(Set<String> u, int b) => v(u, '1100100101111', b);
+
+@pragma('dart2js:noInline')
+f_110_010_011_000_1(Set<String> u, int b) => v(u, '1100100110001', b);
+
+@pragma('dart2js:noInline')
+f_110_010_011_001_1(Set<String> u, int b) => v(u, '1100100110011', b);
+
+@pragma('dart2js:noInline')
+f_110_010_011_010_1(Set<String> u, int b) => v(u, '1100100110101', b);
+
+@pragma('dart2js:noInline')
+f_110_010_011_011_1(Set<String> u, int b) => v(u, '1100100110111', b);
+
+@pragma('dart2js:noInline')
+f_110_010_011_100_1(Set<String> u, int b) => v(u, '1100100111001', b);
+
+@pragma('dart2js:noInline')
+f_110_010_011_101_1(Set<String> u, int b) => v(u, '1100100111011', b);
+
+@pragma('dart2js:noInline')
+f_110_010_011_110_1(Set<String> u, int b) => v(u, '1100100111101', b);
+
+@pragma('dart2js:noInline')
+f_110_010_011_111_1(Set<String> u, int b) => v(u, '1100100111111', b);
+
+@pragma('dart2js:noInline')
+f_110_010_100_000_1(Set<String> u, int b) => v(u, '1100101000001', b);
+
+@pragma('dart2js:noInline')
+f_110_010_100_001_1(Set<String> u, int b) => v(u, '1100101000011', b);
+
+@pragma('dart2js:noInline')
+f_110_010_100_010_1(Set<String> u, int b) => v(u, '1100101000101', b);
+
+@pragma('dart2js:noInline')
+f_110_010_100_011_1(Set<String> u, int b) => v(u, '1100101000111', b);
+
+@pragma('dart2js:noInline')
+f_110_010_100_100_1(Set<String> u, int b) => v(u, '1100101001001', b);
+
+@pragma('dart2js:noInline')
+f_110_010_100_101_1(Set<String> u, int b) => v(u, '1100101001011', b);
+
+@pragma('dart2js:noInline')
+f_110_010_100_110_1(Set<String> u, int b) => v(u, '1100101001101', b);
+
+@pragma('dart2js:noInline')
+f_110_010_100_111_1(Set<String> u, int b) => v(u, '1100101001111', b);
+
+@pragma('dart2js:noInline')
+f_110_010_101_000_1(Set<String> u, int b) => v(u, '1100101010001', b);
+
+@pragma('dart2js:noInline')
+f_110_010_101_001_1(Set<String> u, int b) => v(u, '1100101010011', b);
+
+@pragma('dart2js:noInline')
+f_110_010_101_010_1(Set<String> u, int b) => v(u, '1100101010101', b);
+
+@pragma('dart2js:noInline')
+f_110_010_101_011_1(Set<String> u, int b) => v(u, '1100101010111', b);
+
+@pragma('dart2js:noInline')
+f_110_010_101_100_1(Set<String> u, int b) => v(u, '1100101011001', b);
+
+@pragma('dart2js:noInline')
+f_110_010_101_101_1(Set<String> u, int b) => v(u, '1100101011011', b);
+
+@pragma('dart2js:noInline')
+f_110_010_101_110_1(Set<String> u, int b) => v(u, '1100101011101', b);
+
+@pragma('dart2js:noInline')
+f_110_010_101_111_1(Set<String> u, int b) => v(u, '1100101011111', b);
+
+@pragma('dart2js:noInline')
+f_110_010_110_000_1(Set<String> u, int b) => v(u, '1100101100001', b);
+
+@pragma('dart2js:noInline')
+f_110_010_110_001_1(Set<String> u, int b) => v(u, '1100101100011', b);
+
+@pragma('dart2js:noInline')
+f_110_010_110_010_1(Set<String> u, int b) => v(u, '1100101100101', b);
+
+@pragma('dart2js:noInline')
+f_110_010_110_011_1(Set<String> u, int b) => v(u, '1100101100111', b);
+
+@pragma('dart2js:noInline')
+f_110_010_110_100_1(Set<String> u, int b) => v(u, '1100101101001', b);
+
+@pragma('dart2js:noInline')
+f_110_010_110_101_1(Set<String> u, int b) => v(u, '1100101101011', b);
+
+@pragma('dart2js:noInline')
+f_110_010_110_110_1(Set<String> u, int b) => v(u, '1100101101101', b);
+
+@pragma('dart2js:noInline')
+f_110_010_110_111_1(Set<String> u, int b) => v(u, '1100101101111', b);
+
+@pragma('dart2js:noInline')
+f_110_010_111_000_1(Set<String> u, int b) => v(u, '1100101110001', b);
+
+@pragma('dart2js:noInline')
+f_110_010_111_001_1(Set<String> u, int b) => v(u, '1100101110011', b);
+
+@pragma('dart2js:noInline')
+f_110_010_111_010_1(Set<String> u, int b) => v(u, '1100101110101', b);
+
+@pragma('dart2js:noInline')
+f_110_010_111_011_1(Set<String> u, int b) => v(u, '1100101110111', b);
+
+@pragma('dart2js:noInline')
+f_110_010_111_100_1(Set<String> u, int b) => v(u, '1100101111001', b);
+
+@pragma('dart2js:noInline')
+f_110_010_111_101_1(Set<String> u, int b) => v(u, '1100101111011', b);
+
+@pragma('dart2js:noInline')
+f_110_010_111_110_1(Set<String> u, int b) => v(u, '1100101111101', b);
+
+@pragma('dart2js:noInline')
+f_110_010_111_111_1(Set<String> u, int b) => v(u, '1100101111111', b);
+
+@pragma('dart2js:noInline')
+f_110_011_000_000_1(Set<String> u, int b) => v(u, '1100110000001', b);
+
+@pragma('dart2js:noInline')
+f_110_011_000_001_1(Set<String> u, int b) => v(u, '1100110000011', b);
+
+@pragma('dart2js:noInline')
+f_110_011_000_010_1(Set<String> u, int b) => v(u, '1100110000101', b);
+
+@pragma('dart2js:noInline')
+f_110_011_000_011_1(Set<String> u, int b) => v(u, '1100110000111', b);
+
+@pragma('dart2js:noInline')
+f_110_011_000_100_1(Set<String> u, int b) => v(u, '1100110001001', b);
+
+@pragma('dart2js:noInline')
+f_110_011_000_101_1(Set<String> u, int b) => v(u, '1100110001011', b);
+
+@pragma('dart2js:noInline')
+f_110_011_000_110_1(Set<String> u, int b) => v(u, '1100110001101', b);
+
+@pragma('dart2js:noInline')
+f_110_011_000_111_1(Set<String> u, int b) => v(u, '1100110001111', b);
+
+@pragma('dart2js:noInline')
+f_110_011_001_000_1(Set<String> u, int b) => v(u, '1100110010001', b);
+
+@pragma('dart2js:noInline')
+f_110_011_001_001_1(Set<String> u, int b) => v(u, '1100110010011', b);
+
+@pragma('dart2js:noInline')
+f_110_011_001_010_1(Set<String> u, int b) => v(u, '1100110010101', b);
+
+@pragma('dart2js:noInline')
+f_110_011_001_011_1(Set<String> u, int b) => v(u, '1100110010111', b);
+
+@pragma('dart2js:noInline')
+f_110_011_001_100_1(Set<String> u, int b) => v(u, '1100110011001', b);
+
+@pragma('dart2js:noInline')
+f_110_011_001_101_1(Set<String> u, int b) => v(u, '1100110011011', b);
+
+@pragma('dart2js:noInline')
+f_110_011_001_110_1(Set<String> u, int b) => v(u, '1100110011101', b);
+
+@pragma('dart2js:noInline')
+f_110_011_001_111_1(Set<String> u, int b) => v(u, '1100110011111', b);
+
+@pragma('dart2js:noInline')
+f_110_011_010_000_1(Set<String> u, int b) => v(u, '1100110100001', b);
+
+@pragma('dart2js:noInline')
+f_110_011_010_001_1(Set<String> u, int b) => v(u, '1100110100011', b);
+
+@pragma('dart2js:noInline')
+f_110_011_010_010_1(Set<String> u, int b) => v(u, '1100110100101', b);
+
+@pragma('dart2js:noInline')
+f_110_011_010_011_1(Set<String> u, int b) => v(u, '1100110100111', b);
+
+@pragma('dart2js:noInline')
+f_110_011_010_100_1(Set<String> u, int b) => v(u, '1100110101001', b);
+
+@pragma('dart2js:noInline')
+f_110_011_010_101_1(Set<String> u, int b) => v(u, '1100110101011', b);
+
+@pragma('dart2js:noInline')
+f_110_011_010_110_1(Set<String> u, int b) => v(u, '1100110101101', b);
+
+@pragma('dart2js:noInline')
+f_110_011_010_111_1(Set<String> u, int b) => v(u, '1100110101111', b);
+
+@pragma('dart2js:noInline')
+f_110_011_011_000_1(Set<String> u, int b) => v(u, '1100110110001', b);
+
+@pragma('dart2js:noInline')
+f_110_011_011_001_1(Set<String> u, int b) => v(u, '1100110110011', b);
+
+@pragma('dart2js:noInline')
+f_110_011_011_010_1(Set<String> u, int b) => v(u, '1100110110101', b);
+
+@pragma('dart2js:noInline')
+f_110_011_011_011_1(Set<String> u, int b) => v(u, '1100110110111', b);
+
+@pragma('dart2js:noInline')
+f_110_011_011_100_1(Set<String> u, int b) => v(u, '1100110111001', b);
+
+@pragma('dart2js:noInline')
+f_110_011_011_101_1(Set<String> u, int b) => v(u, '1100110111011', b);
+
+@pragma('dart2js:noInline')
+f_110_011_011_110_1(Set<String> u, int b) => v(u, '1100110111101', b);
+
+@pragma('dart2js:noInline')
+f_110_011_011_111_1(Set<String> u, int b) => v(u, '1100110111111', b);
+
+@pragma('dart2js:noInline')
+f_110_011_100_000_1(Set<String> u, int b) => v(u, '1100111000001', b);
+
+@pragma('dart2js:noInline')
+f_110_011_100_001_1(Set<String> u, int b) => v(u, '1100111000011', b);
+
+@pragma('dart2js:noInline')
+f_110_011_100_010_1(Set<String> u, int b) => v(u, '1100111000101', b);
+
+@pragma('dart2js:noInline')
+f_110_011_100_011_1(Set<String> u, int b) => v(u, '1100111000111', b);
+
+@pragma('dart2js:noInline')
+f_110_011_100_100_1(Set<String> u, int b) => v(u, '1100111001001', b);
+
+@pragma('dart2js:noInline')
+f_110_011_100_101_1(Set<String> u, int b) => v(u, '1100111001011', b);
+
+@pragma('dart2js:noInline')
+f_110_011_100_110_1(Set<String> u, int b) => v(u, '1100111001101', b);
+
+@pragma('dart2js:noInline')
+f_110_011_100_111_1(Set<String> u, int b) => v(u, '1100111001111', b);
+
+@pragma('dart2js:noInline')
+f_110_011_101_000_1(Set<String> u, int b) => v(u, '1100111010001', b);
+
+@pragma('dart2js:noInline')
+f_110_011_101_001_1(Set<String> u, int b) => v(u, '1100111010011', b);
+
+@pragma('dart2js:noInline')
+f_110_011_101_010_1(Set<String> u, int b) => v(u, '1100111010101', b);
+
+@pragma('dart2js:noInline')
+f_110_011_101_011_1(Set<String> u, int b) => v(u, '1100111010111', b);
+
+@pragma('dart2js:noInline')
+f_110_011_101_100_1(Set<String> u, int b) => v(u, '1100111011001', b);
+
+@pragma('dart2js:noInline')
+f_110_011_101_101_1(Set<String> u, int b) => v(u, '1100111011011', b);
+
+@pragma('dart2js:noInline')
+f_110_011_101_110_1(Set<String> u, int b) => v(u, '1100111011101', b);
+
+@pragma('dart2js:noInline')
+f_110_011_101_111_1(Set<String> u, int b) => v(u, '1100111011111', b);
+
+@pragma('dart2js:noInline')
+f_110_011_110_000_1(Set<String> u, int b) => v(u, '1100111100001', b);
+
+@pragma('dart2js:noInline')
+f_110_011_110_001_1(Set<String> u, int b) => v(u, '1100111100011', b);
+
+@pragma('dart2js:noInline')
+f_110_011_110_010_1(Set<String> u, int b) => v(u, '1100111100101', b);
+
+@pragma('dart2js:noInline')
+f_110_011_110_011_1(Set<String> u, int b) => v(u, '1100111100111', b);
+
+@pragma('dart2js:noInline')
+f_110_011_110_100_1(Set<String> u, int b) => v(u, '1100111101001', b);
+
+@pragma('dart2js:noInline')
+f_110_011_110_101_1(Set<String> u, int b) => v(u, '1100111101011', b);
+
+@pragma('dart2js:noInline')
+f_110_011_110_110_1(Set<String> u, int b) => v(u, '1100111101101', b);
+
+@pragma('dart2js:noInline')
+f_110_011_110_111_1(Set<String> u, int b) => v(u, '1100111101111', b);
+
+@pragma('dart2js:noInline')
+f_110_011_111_000_1(Set<String> u, int b) => v(u, '1100111110001', b);
+
+@pragma('dart2js:noInline')
+f_110_011_111_001_1(Set<String> u, int b) => v(u, '1100111110011', b);
+
+@pragma('dart2js:noInline')
+f_110_011_111_010_1(Set<String> u, int b) => v(u, '1100111110101', b);
+
+@pragma('dart2js:noInline')
+f_110_011_111_011_1(Set<String> u, int b) => v(u, '1100111110111', b);
+
+@pragma('dart2js:noInline')
+f_110_011_111_100_1(Set<String> u, int b) => v(u, '1100111111001', b);
+
+@pragma('dart2js:noInline')
+f_110_011_111_101_1(Set<String> u, int b) => v(u, '1100111111011', b);
+
+@pragma('dart2js:noInline')
+f_110_011_111_110_1(Set<String> u, int b) => v(u, '1100111111101', b);
+
+@pragma('dart2js:noInline')
+f_110_011_111_111_1(Set<String> u, int b) => v(u, '1100111111111', b);
+
+@pragma('dart2js:noInline')
+f_110_100_000_000_1(Set<String> u, int b) => v(u, '1101000000001', b);
+
+@pragma('dart2js:noInline')
+f_110_100_000_001_1(Set<String> u, int b) => v(u, '1101000000011', b);
+
+@pragma('dart2js:noInline')
+f_110_100_000_010_1(Set<String> u, int b) => v(u, '1101000000101', b);
+
+@pragma('dart2js:noInline')
+f_110_100_000_011_1(Set<String> u, int b) => v(u, '1101000000111', b);
+
+@pragma('dart2js:noInline')
+f_110_100_000_100_1(Set<String> u, int b) => v(u, '1101000001001', b);
+
+@pragma('dart2js:noInline')
+f_110_100_000_101_1(Set<String> u, int b) => v(u, '1101000001011', b);
+
+@pragma('dart2js:noInline')
+f_110_100_000_110_1(Set<String> u, int b) => v(u, '1101000001101', b);
+
+@pragma('dart2js:noInline')
+f_110_100_000_111_1(Set<String> u, int b) => v(u, '1101000001111', b);
+
+@pragma('dart2js:noInline')
+f_110_100_001_000_1(Set<String> u, int b) => v(u, '1101000010001', b);
+
+@pragma('dart2js:noInline')
+f_110_100_001_001_1(Set<String> u, int b) => v(u, '1101000010011', b);
+
+@pragma('dart2js:noInline')
+f_110_100_001_010_1(Set<String> u, int b) => v(u, '1101000010101', b);
+
+@pragma('dart2js:noInline')
+f_110_100_001_011_1(Set<String> u, int b) => v(u, '1101000010111', b);
+
+@pragma('dart2js:noInline')
+f_110_100_001_100_1(Set<String> u, int b) => v(u, '1101000011001', b);
+
+@pragma('dart2js:noInline')
+f_110_100_001_101_1(Set<String> u, int b) => v(u, '1101000011011', b);
+
+@pragma('dart2js:noInline')
+f_110_100_001_110_1(Set<String> u, int b) => v(u, '1101000011101', b);
+
+@pragma('dart2js:noInline')
+f_110_100_001_111_1(Set<String> u, int b) => v(u, '1101000011111', b);
+
+@pragma('dart2js:noInline')
+f_110_100_010_000_1(Set<String> u, int b) => v(u, '1101000100001', b);
+
+@pragma('dart2js:noInline')
+f_110_100_010_001_1(Set<String> u, int b) => v(u, '1101000100011', b);
+
+@pragma('dart2js:noInline')
+f_110_100_010_010_1(Set<String> u, int b) => v(u, '1101000100101', b);
+
+@pragma('dart2js:noInline')
+f_110_100_010_011_1(Set<String> u, int b) => v(u, '1101000100111', b);
+
+@pragma('dart2js:noInline')
+f_110_100_010_100_1(Set<String> u, int b) => v(u, '1101000101001', b);
+
+@pragma('dart2js:noInline')
+f_110_100_010_101_1(Set<String> u, int b) => v(u, '1101000101011', b);
+
+@pragma('dart2js:noInline')
+f_110_100_010_110_1(Set<String> u, int b) => v(u, '1101000101101', b);
+
+@pragma('dart2js:noInline')
+f_110_100_010_111_1(Set<String> u, int b) => v(u, '1101000101111', b);
+
+@pragma('dart2js:noInline')
+f_110_100_011_000_1(Set<String> u, int b) => v(u, '1101000110001', b);
+
+@pragma('dart2js:noInline')
+f_110_100_011_001_1(Set<String> u, int b) => v(u, '1101000110011', b);
+
+@pragma('dart2js:noInline')
+f_110_100_011_010_1(Set<String> u, int b) => v(u, '1101000110101', b);
+
+@pragma('dart2js:noInline')
+f_110_100_011_011_1(Set<String> u, int b) => v(u, '1101000110111', b);
+
+@pragma('dart2js:noInline')
+f_110_100_011_100_1(Set<String> u, int b) => v(u, '1101000111001', b);
+
+@pragma('dart2js:noInline')
+f_110_100_011_101_1(Set<String> u, int b) => v(u, '1101000111011', b);
+
+@pragma('dart2js:noInline')
+f_110_100_011_110_1(Set<String> u, int b) => v(u, '1101000111101', b);
+
+@pragma('dart2js:noInline')
+f_110_100_011_111_1(Set<String> u, int b) => v(u, '1101000111111', b);
+
+@pragma('dart2js:noInline')
+f_110_100_100_000_1(Set<String> u, int b) => v(u, '1101001000001', b);
+
+@pragma('dart2js:noInline')
+f_110_100_100_001_1(Set<String> u, int b) => v(u, '1101001000011', b);
+
+@pragma('dart2js:noInline')
+f_110_100_100_010_1(Set<String> u, int b) => v(u, '1101001000101', b);
+
+@pragma('dart2js:noInline')
+f_110_100_100_011_1(Set<String> u, int b) => v(u, '1101001000111', b);
+
+@pragma('dart2js:noInline')
+f_110_100_100_100_1(Set<String> u, int b) => v(u, '1101001001001', b);
+
+@pragma('dart2js:noInline')
+f_110_100_100_101_1(Set<String> u, int b) => v(u, '1101001001011', b);
+
+@pragma('dart2js:noInline')
+f_110_100_100_110_1(Set<String> u, int b) => v(u, '1101001001101', b);
+
+@pragma('dart2js:noInline')
+f_110_100_100_111_1(Set<String> u, int b) => v(u, '1101001001111', b);
+
+@pragma('dart2js:noInline')
+f_110_100_101_000_1(Set<String> u, int b) => v(u, '1101001010001', b);
+
+@pragma('dart2js:noInline')
+f_110_100_101_001_1(Set<String> u, int b) => v(u, '1101001010011', b);
+
+@pragma('dart2js:noInline')
+f_110_100_101_010_1(Set<String> u, int b) => v(u, '1101001010101', b);
+
+@pragma('dart2js:noInline')
+f_110_100_101_011_1(Set<String> u, int b) => v(u, '1101001010111', b);
+
+@pragma('dart2js:noInline')
+f_110_100_101_100_1(Set<String> u, int b) => v(u, '1101001011001', b);
+
+@pragma('dart2js:noInline')
+f_110_100_101_101_1(Set<String> u, int b) => v(u, '1101001011011', b);
+
+@pragma('dart2js:noInline')
+f_110_100_101_110_1(Set<String> u, int b) => v(u, '1101001011101', b);
+
+@pragma('dart2js:noInline')
+f_110_100_101_111_1(Set<String> u, int b) => v(u, '1101001011111', b);
+
+@pragma('dart2js:noInline')
+f_110_100_110_000_1(Set<String> u, int b) => v(u, '1101001100001', b);
+
+@pragma('dart2js:noInline')
+f_110_100_110_001_1(Set<String> u, int b) => v(u, '1101001100011', b);
+
+@pragma('dart2js:noInline')
+f_110_100_110_010_1(Set<String> u, int b) => v(u, '1101001100101', b);
+
+@pragma('dart2js:noInline')
+f_110_100_110_011_1(Set<String> u, int b) => v(u, '1101001100111', b);
+
+@pragma('dart2js:noInline')
+f_110_100_110_100_1(Set<String> u, int b) => v(u, '1101001101001', b);
+
+@pragma('dart2js:noInline')
+f_110_100_110_101_1(Set<String> u, int b) => v(u, '1101001101011', b);
+
+@pragma('dart2js:noInline')
+f_110_100_110_110_1(Set<String> u, int b) => v(u, '1101001101101', b);
+
+@pragma('dart2js:noInline')
+f_110_100_110_111_1(Set<String> u, int b) => v(u, '1101001101111', b);
+
+@pragma('dart2js:noInline')
+f_110_100_111_000_1(Set<String> u, int b) => v(u, '1101001110001', b);
+
+@pragma('dart2js:noInline')
+f_110_100_111_001_1(Set<String> u, int b) => v(u, '1101001110011', b);
+
+@pragma('dart2js:noInline')
+f_110_100_111_010_1(Set<String> u, int b) => v(u, '1101001110101', b);
+
+@pragma('dart2js:noInline')
+f_110_100_111_011_1(Set<String> u, int b) => v(u, '1101001110111', b);
+
+@pragma('dart2js:noInline')
+f_110_100_111_100_1(Set<String> u, int b) => v(u, '1101001111001', b);
+
+@pragma('dart2js:noInline')
+f_110_100_111_101_1(Set<String> u, int b) => v(u, '1101001111011', b);
+
+@pragma('dart2js:noInline')
+f_110_100_111_110_1(Set<String> u, int b) => v(u, '1101001111101', b);
+
+@pragma('dart2js:noInline')
+f_110_100_111_111_1(Set<String> u, int b) => v(u, '1101001111111', b);
+
+@pragma('dart2js:noInline')
+f_110_101_000_000_1(Set<String> u, int b) => v(u, '1101010000001', b);
+
+@pragma('dart2js:noInline')
+f_110_101_000_001_1(Set<String> u, int b) => v(u, '1101010000011', b);
+
+@pragma('dart2js:noInline')
+f_110_101_000_010_1(Set<String> u, int b) => v(u, '1101010000101', b);
+
+@pragma('dart2js:noInline')
+f_110_101_000_011_1(Set<String> u, int b) => v(u, '1101010000111', b);
+
+@pragma('dart2js:noInline')
+f_110_101_000_100_1(Set<String> u, int b) => v(u, '1101010001001', b);
+
+@pragma('dart2js:noInline')
+f_110_101_000_101_1(Set<String> u, int b) => v(u, '1101010001011', b);
+
+@pragma('dart2js:noInline')
+f_110_101_000_110_1(Set<String> u, int b) => v(u, '1101010001101', b);
+
+@pragma('dart2js:noInline')
+f_110_101_000_111_1(Set<String> u, int b) => v(u, '1101010001111', b);
+
+@pragma('dart2js:noInline')
+f_110_101_001_000_1(Set<String> u, int b) => v(u, '1101010010001', b);
+
+@pragma('dart2js:noInline')
+f_110_101_001_001_1(Set<String> u, int b) => v(u, '1101010010011', b);
+
+@pragma('dart2js:noInline')
+f_110_101_001_010_1(Set<String> u, int b) => v(u, '1101010010101', b);
+
+@pragma('dart2js:noInline')
+f_110_101_001_011_1(Set<String> u, int b) => v(u, '1101010010111', b);
+
+@pragma('dart2js:noInline')
+f_110_101_001_100_1(Set<String> u, int b) => v(u, '1101010011001', b);
+
+@pragma('dart2js:noInline')
+f_110_101_001_101_1(Set<String> u, int b) => v(u, '1101010011011', b);
+
+@pragma('dart2js:noInline')
+f_110_101_001_110_1(Set<String> u, int b) => v(u, '1101010011101', b);
+
+@pragma('dart2js:noInline')
+f_110_101_001_111_1(Set<String> u, int b) => v(u, '1101010011111', b);
+
+@pragma('dart2js:noInline')
+f_110_101_010_000_1(Set<String> u, int b) => v(u, '1101010100001', b);
+
+@pragma('dart2js:noInline')
+f_110_101_010_001_1(Set<String> u, int b) => v(u, '1101010100011', b);
+
+@pragma('dart2js:noInline')
+f_110_101_010_010_1(Set<String> u, int b) => v(u, '1101010100101', b);
+
+@pragma('dart2js:noInline')
+f_110_101_010_011_1(Set<String> u, int b) => v(u, '1101010100111', b);
+
+@pragma('dart2js:noInline')
+f_110_101_010_100_1(Set<String> u, int b) => v(u, '1101010101001', b);
+
+@pragma('dart2js:noInline')
+f_110_101_010_101_1(Set<String> u, int b) => v(u, '1101010101011', b);
+
+@pragma('dart2js:noInline')
+f_110_101_010_110_1(Set<String> u, int b) => v(u, '1101010101101', b);
+
+@pragma('dart2js:noInline')
+f_110_101_010_111_1(Set<String> u, int b) => v(u, '1101010101111', b);
+
+@pragma('dart2js:noInline')
+f_110_101_011_000_1(Set<String> u, int b) => v(u, '1101010110001', b);
+
+@pragma('dart2js:noInline')
+f_110_101_011_001_1(Set<String> u, int b) => v(u, '1101010110011', b);
+
+@pragma('dart2js:noInline')
+f_110_101_011_010_1(Set<String> u, int b) => v(u, '1101010110101', b);
+
+@pragma('dart2js:noInline')
+f_110_101_011_011_1(Set<String> u, int b) => v(u, '1101010110111', b);
+
+@pragma('dart2js:noInline')
+f_110_101_011_100_1(Set<String> u, int b) => v(u, '1101010111001', b);
+
+@pragma('dart2js:noInline')
+f_110_101_011_101_1(Set<String> u, int b) => v(u, '1101010111011', b);
+
+@pragma('dart2js:noInline')
+f_110_101_011_110_1(Set<String> u, int b) => v(u, '1101010111101', b);
+
+@pragma('dart2js:noInline')
+f_110_101_011_111_1(Set<String> u, int b) => v(u, '1101010111111', b);
+
+@pragma('dart2js:noInline')
+f_110_101_100_000_1(Set<String> u, int b) => v(u, '1101011000001', b);
+
+@pragma('dart2js:noInline')
+f_110_101_100_001_1(Set<String> u, int b) => v(u, '1101011000011', b);
+
+@pragma('dart2js:noInline')
+f_110_101_100_010_1(Set<String> u, int b) => v(u, '1101011000101', b);
+
+@pragma('dart2js:noInline')
+f_110_101_100_011_1(Set<String> u, int b) => v(u, '1101011000111', b);
+
+@pragma('dart2js:noInline')
+f_110_101_100_100_1(Set<String> u, int b) => v(u, '1101011001001', b);
+
+@pragma('dart2js:noInline')
+f_110_101_100_101_1(Set<String> u, int b) => v(u, '1101011001011', b);
+
+@pragma('dart2js:noInline')
+f_110_101_100_110_1(Set<String> u, int b) => v(u, '1101011001101', b);
+
+@pragma('dart2js:noInline')
+f_110_101_100_111_1(Set<String> u, int b) => v(u, '1101011001111', b);
+
+@pragma('dart2js:noInline')
+f_110_101_101_000_1(Set<String> u, int b) => v(u, '1101011010001', b);
+
+@pragma('dart2js:noInline')
+f_110_101_101_001_1(Set<String> u, int b) => v(u, '1101011010011', b);
+
+@pragma('dart2js:noInline')
+f_110_101_101_010_1(Set<String> u, int b) => v(u, '1101011010101', b);
+
+@pragma('dart2js:noInline')
+f_110_101_101_011_1(Set<String> u, int b) => v(u, '1101011010111', b);
+
+@pragma('dart2js:noInline')
+f_110_101_101_100_1(Set<String> u, int b) => v(u, '1101011011001', b);
+
+@pragma('dart2js:noInline')
+f_110_101_101_101_1(Set<String> u, int b) => v(u, '1101011011011', b);
+
+@pragma('dart2js:noInline')
+f_110_101_101_110_1(Set<String> u, int b) => v(u, '1101011011101', b);
+
+@pragma('dart2js:noInline')
+f_110_101_101_111_1(Set<String> u, int b) => v(u, '1101011011111', b);
+
+@pragma('dart2js:noInline')
+f_110_101_110_000_1(Set<String> u, int b) => v(u, '1101011100001', b);
+
+@pragma('dart2js:noInline')
+f_110_101_110_001_1(Set<String> u, int b) => v(u, '1101011100011', b);
+
+@pragma('dart2js:noInline')
+f_110_101_110_010_1(Set<String> u, int b) => v(u, '1101011100101', b);
+
+@pragma('dart2js:noInline')
+f_110_101_110_011_1(Set<String> u, int b) => v(u, '1101011100111', b);
+
+@pragma('dart2js:noInline')
+f_110_101_110_100_1(Set<String> u, int b) => v(u, '1101011101001', b);
+
+@pragma('dart2js:noInline')
+f_110_101_110_101_1(Set<String> u, int b) => v(u, '1101011101011', b);
+
+@pragma('dart2js:noInline')
+f_110_101_110_110_1(Set<String> u, int b) => v(u, '1101011101101', b);
+
+@pragma('dart2js:noInline')
+f_110_101_110_111_1(Set<String> u, int b) => v(u, '1101011101111', b);
+
+@pragma('dart2js:noInline')
+f_110_101_111_000_1(Set<String> u, int b) => v(u, '1101011110001', b);
+
+@pragma('dart2js:noInline')
+f_110_101_111_001_1(Set<String> u, int b) => v(u, '1101011110011', b);
+
+@pragma('dart2js:noInline')
+f_110_101_111_010_1(Set<String> u, int b) => v(u, '1101011110101', b);
+
+@pragma('dart2js:noInline')
+f_110_101_111_011_1(Set<String> u, int b) => v(u, '1101011110111', b);
+
+@pragma('dart2js:noInline')
+f_110_101_111_100_1(Set<String> u, int b) => v(u, '1101011111001', b);
+
+@pragma('dart2js:noInline')
+f_110_101_111_101_1(Set<String> u, int b) => v(u, '1101011111011', b);
+
+@pragma('dart2js:noInline')
+f_110_101_111_110_1(Set<String> u, int b) => v(u, '1101011111101', b);
+
+@pragma('dart2js:noInline')
+f_110_101_111_111_1(Set<String> u, int b) => v(u, '1101011111111', b);
+
+@pragma('dart2js:noInline')
+f_110_110_000_000_1(Set<String> u, int b) => v(u, '1101100000001', b);
+
+@pragma('dart2js:noInline')
+f_110_110_000_001_1(Set<String> u, int b) => v(u, '1101100000011', b);
+
+@pragma('dart2js:noInline')
+f_110_110_000_010_1(Set<String> u, int b) => v(u, '1101100000101', b);
+
+@pragma('dart2js:noInline')
+f_110_110_000_011_1(Set<String> u, int b) => v(u, '1101100000111', b);
+
+@pragma('dart2js:noInline')
+f_110_110_000_100_1(Set<String> u, int b) => v(u, '1101100001001', b);
+
+@pragma('dart2js:noInline')
+f_110_110_000_101_1(Set<String> u, int b) => v(u, '1101100001011', b);
+
+@pragma('dart2js:noInline')
+f_110_110_000_110_1(Set<String> u, int b) => v(u, '1101100001101', b);
+
+@pragma('dart2js:noInline')
+f_110_110_000_111_1(Set<String> u, int b) => v(u, '1101100001111', b);
+
+@pragma('dart2js:noInline')
+f_110_110_001_000_1(Set<String> u, int b) => v(u, '1101100010001', b);
+
+@pragma('dart2js:noInline')
+f_110_110_001_001_1(Set<String> u, int b) => v(u, '1101100010011', b);
+
+@pragma('dart2js:noInline')
+f_110_110_001_010_1(Set<String> u, int b) => v(u, '1101100010101', b);
+
+@pragma('dart2js:noInline')
+f_110_110_001_011_1(Set<String> u, int b) => v(u, '1101100010111', b);
+
+@pragma('dart2js:noInline')
+f_110_110_001_100_1(Set<String> u, int b) => v(u, '1101100011001', b);
+
+@pragma('dart2js:noInline')
+f_110_110_001_101_1(Set<String> u, int b) => v(u, '1101100011011', b);
+
+@pragma('dart2js:noInline')
+f_110_110_001_110_1(Set<String> u, int b) => v(u, '1101100011101', b);
+
+@pragma('dart2js:noInline')
+f_110_110_001_111_1(Set<String> u, int b) => v(u, '1101100011111', b);
+
+@pragma('dart2js:noInline')
+f_110_110_010_000_1(Set<String> u, int b) => v(u, '1101100100001', b);
+
+@pragma('dart2js:noInline')
+f_110_110_010_001_1(Set<String> u, int b) => v(u, '1101100100011', b);
+
+@pragma('dart2js:noInline')
+f_110_110_010_010_1(Set<String> u, int b) => v(u, '1101100100101', b);
+
+@pragma('dart2js:noInline')
+f_110_110_010_011_1(Set<String> u, int b) => v(u, '1101100100111', b);
+
+@pragma('dart2js:noInline')
+f_110_110_010_100_1(Set<String> u, int b) => v(u, '1101100101001', b);
+
+@pragma('dart2js:noInline')
+f_110_110_010_101_1(Set<String> u, int b) => v(u, '1101100101011', b);
+
+@pragma('dart2js:noInline')
+f_110_110_010_110_1(Set<String> u, int b) => v(u, '1101100101101', b);
+
+@pragma('dart2js:noInline')
+f_110_110_010_111_1(Set<String> u, int b) => v(u, '1101100101111', b);
+
+@pragma('dart2js:noInline')
+f_110_110_011_000_1(Set<String> u, int b) => v(u, '1101100110001', b);
+
+@pragma('dart2js:noInline')
+f_110_110_011_001_1(Set<String> u, int b) => v(u, '1101100110011', b);
+
+@pragma('dart2js:noInline')
+f_110_110_011_010_1(Set<String> u, int b) => v(u, '1101100110101', b);
+
+@pragma('dart2js:noInline')
+f_110_110_011_011_1(Set<String> u, int b) => v(u, '1101100110111', b);
+
+@pragma('dart2js:noInline')
+f_110_110_011_100_1(Set<String> u, int b) => v(u, '1101100111001', b);
+
+@pragma('dart2js:noInline')
+f_110_110_011_101_1(Set<String> u, int b) => v(u, '1101100111011', b);
+
+@pragma('dart2js:noInline')
+f_110_110_011_110_1(Set<String> u, int b) => v(u, '1101100111101', b);
+
+@pragma('dart2js:noInline')
+f_110_110_011_111_1(Set<String> u, int b) => v(u, '1101100111111', b);
+
+@pragma('dart2js:noInline')
+f_110_110_100_000_1(Set<String> u, int b) => v(u, '1101101000001', b);
+
+@pragma('dart2js:noInline')
+f_110_110_100_001_1(Set<String> u, int b) => v(u, '1101101000011', b);
+
+@pragma('dart2js:noInline')
+f_110_110_100_010_1(Set<String> u, int b) => v(u, '1101101000101', b);
+
+@pragma('dart2js:noInline')
+f_110_110_100_011_1(Set<String> u, int b) => v(u, '1101101000111', b);
+
+@pragma('dart2js:noInline')
+f_110_110_100_100_1(Set<String> u, int b) => v(u, '1101101001001', b);
+
+@pragma('dart2js:noInline')
+f_110_110_100_101_1(Set<String> u, int b) => v(u, '1101101001011', b);
+
+@pragma('dart2js:noInline')
+f_110_110_100_110_1(Set<String> u, int b) => v(u, '1101101001101', b);
+
+@pragma('dart2js:noInline')
+f_110_110_100_111_1(Set<String> u, int b) => v(u, '1101101001111', b);
+
+@pragma('dart2js:noInline')
+f_110_110_101_000_1(Set<String> u, int b) => v(u, '1101101010001', b);
+
+@pragma('dart2js:noInline')
+f_110_110_101_001_1(Set<String> u, int b) => v(u, '1101101010011', b);
+
+@pragma('dart2js:noInline')
+f_110_110_101_010_1(Set<String> u, int b) => v(u, '1101101010101', b);
+
+@pragma('dart2js:noInline')
+f_110_110_101_011_1(Set<String> u, int b) => v(u, '1101101010111', b);
+
+@pragma('dart2js:noInline')
+f_110_110_101_100_1(Set<String> u, int b) => v(u, '1101101011001', b);
+
+@pragma('dart2js:noInline')
+f_110_110_101_101_1(Set<String> u, int b) => v(u, '1101101011011', b);
+
+@pragma('dart2js:noInline')
+f_110_110_101_110_1(Set<String> u, int b) => v(u, '1101101011101', b);
+
+@pragma('dart2js:noInline')
+f_110_110_101_111_1(Set<String> u, int b) => v(u, '1101101011111', b);
+
+@pragma('dart2js:noInline')
+f_110_110_110_000_1(Set<String> u, int b) => v(u, '1101101100001', b);
+
+@pragma('dart2js:noInline')
+f_110_110_110_001_1(Set<String> u, int b) => v(u, '1101101100011', b);
+
+@pragma('dart2js:noInline')
+f_110_110_110_010_1(Set<String> u, int b) => v(u, '1101101100101', b);
+
+@pragma('dart2js:noInline')
+f_110_110_110_011_1(Set<String> u, int b) => v(u, '1101101100111', b);
+
+@pragma('dart2js:noInline')
+f_110_110_110_100_1(Set<String> u, int b) => v(u, '1101101101001', b);
+
+@pragma('dart2js:noInline')
+f_110_110_110_101_1(Set<String> u, int b) => v(u, '1101101101011', b);
+
+@pragma('dart2js:noInline')
+f_110_110_110_110_1(Set<String> u, int b) => v(u, '1101101101101', b);
+
+@pragma('dart2js:noInline')
+f_110_110_110_111_1(Set<String> u, int b) => v(u, '1101101101111', b);
+
+@pragma('dart2js:noInline')
+f_110_110_111_000_1(Set<String> u, int b) => v(u, '1101101110001', b);
+
+@pragma('dart2js:noInline')
+f_110_110_111_001_1(Set<String> u, int b) => v(u, '1101101110011', b);
+
+@pragma('dart2js:noInline')
+f_110_110_111_010_1(Set<String> u, int b) => v(u, '1101101110101', b);
+
+@pragma('dart2js:noInline')
+f_110_110_111_011_1(Set<String> u, int b) => v(u, '1101101110111', b);
+
+@pragma('dart2js:noInline')
+f_110_110_111_100_1(Set<String> u, int b) => v(u, '1101101111001', b);
+
+@pragma('dart2js:noInline')
+f_110_110_111_101_1(Set<String> u, int b) => v(u, '1101101111011', b);
+
+@pragma('dart2js:noInline')
+f_110_110_111_110_1(Set<String> u, int b) => v(u, '1101101111101', b);
+
+@pragma('dart2js:noInline')
+f_110_110_111_111_1(Set<String> u, int b) => v(u, '1101101111111', b);
+
+@pragma('dart2js:noInline')
+f_110_111_000_000_1(Set<String> u, int b) => v(u, '1101110000001', b);
+
+@pragma('dart2js:noInline')
+f_110_111_000_001_1(Set<String> u, int b) => v(u, '1101110000011', b);
+
+@pragma('dart2js:noInline')
+f_110_111_000_010_1(Set<String> u, int b) => v(u, '1101110000101', b);
+
+@pragma('dart2js:noInline')
+f_110_111_000_011_1(Set<String> u, int b) => v(u, '1101110000111', b);
+
+@pragma('dart2js:noInline')
+f_110_111_000_100_1(Set<String> u, int b) => v(u, '1101110001001', b);
+
+@pragma('dart2js:noInline')
+f_110_111_000_101_1(Set<String> u, int b) => v(u, '1101110001011', b);
+
+@pragma('dart2js:noInline')
+f_110_111_000_110_1(Set<String> u, int b) => v(u, '1101110001101', b);
+
+@pragma('dart2js:noInline')
+f_110_111_000_111_1(Set<String> u, int b) => v(u, '1101110001111', b);
+
+@pragma('dart2js:noInline')
+f_110_111_001_000_1(Set<String> u, int b) => v(u, '1101110010001', b);
+
+@pragma('dart2js:noInline')
+f_110_111_001_001_1(Set<String> u, int b) => v(u, '1101110010011', b);
+
+@pragma('dart2js:noInline')
+f_110_111_001_010_1(Set<String> u, int b) => v(u, '1101110010101', b);
+
+@pragma('dart2js:noInline')
+f_110_111_001_011_1(Set<String> u, int b) => v(u, '1101110010111', b);
+
+@pragma('dart2js:noInline')
+f_110_111_001_100_1(Set<String> u, int b) => v(u, '1101110011001', b);
+
+@pragma('dart2js:noInline')
+f_110_111_001_101_1(Set<String> u, int b) => v(u, '1101110011011', b);
+
+@pragma('dart2js:noInline')
+f_110_111_001_110_1(Set<String> u, int b) => v(u, '1101110011101', b);
+
+@pragma('dart2js:noInline')
+f_110_111_001_111_1(Set<String> u, int b) => v(u, '1101110011111', b);
+
+@pragma('dart2js:noInline')
+f_110_111_010_000_1(Set<String> u, int b) => v(u, '1101110100001', b);
+
+@pragma('dart2js:noInline')
+f_110_111_010_001_1(Set<String> u, int b) => v(u, '1101110100011', b);
+
+@pragma('dart2js:noInline')
+f_110_111_010_010_1(Set<String> u, int b) => v(u, '1101110100101', b);
+
+@pragma('dart2js:noInline')
+f_110_111_010_011_1(Set<String> u, int b) => v(u, '1101110100111', b);
+
+@pragma('dart2js:noInline')
+f_110_111_010_100_1(Set<String> u, int b) => v(u, '1101110101001', b);
+
+@pragma('dart2js:noInline')
+f_110_111_010_101_1(Set<String> u, int b) => v(u, '1101110101011', b);
+
+@pragma('dart2js:noInline')
+f_110_111_010_110_1(Set<String> u, int b) => v(u, '1101110101101', b);
+
+@pragma('dart2js:noInline')
+f_110_111_010_111_1(Set<String> u, int b) => v(u, '1101110101111', b);
+
+@pragma('dart2js:noInline')
+f_110_111_011_000_1(Set<String> u, int b) => v(u, '1101110110001', b);
+
+@pragma('dart2js:noInline')
+f_110_111_011_001_1(Set<String> u, int b) => v(u, '1101110110011', b);
+
+@pragma('dart2js:noInline')
+f_110_111_011_010_1(Set<String> u, int b) => v(u, '1101110110101', b);
+
+@pragma('dart2js:noInline')
+f_110_111_011_011_1(Set<String> u, int b) => v(u, '1101110110111', b);
+
+@pragma('dart2js:noInline')
+f_110_111_011_100_1(Set<String> u, int b) => v(u, '1101110111001', b);
+
+@pragma('dart2js:noInline')
+f_110_111_011_101_1(Set<String> u, int b) => v(u, '1101110111011', b);
+
+@pragma('dart2js:noInline')
+f_110_111_011_110_1(Set<String> u, int b) => v(u, '1101110111101', b);
+
+@pragma('dart2js:noInline')
+f_110_111_011_111_1(Set<String> u, int b) => v(u, '1101110111111', b);
+
+@pragma('dart2js:noInline')
+f_110_111_100_000_1(Set<String> u, int b) => v(u, '1101111000001', b);
+
+@pragma('dart2js:noInline')
+f_110_111_100_001_1(Set<String> u, int b) => v(u, '1101111000011', b);
+
+@pragma('dart2js:noInline')
+f_110_111_100_010_1(Set<String> u, int b) => v(u, '1101111000101', b);
+
+@pragma('dart2js:noInline')
+f_110_111_100_011_1(Set<String> u, int b) => v(u, '1101111000111', b);
+
+@pragma('dart2js:noInline')
+f_110_111_100_100_1(Set<String> u, int b) => v(u, '1101111001001', b);
+
+@pragma('dart2js:noInline')
+f_110_111_100_101_1(Set<String> u, int b) => v(u, '1101111001011', b);
+
+@pragma('dart2js:noInline')
+f_110_111_100_110_1(Set<String> u, int b) => v(u, '1101111001101', b);
+
+@pragma('dart2js:noInline')
+f_110_111_100_111_1(Set<String> u, int b) => v(u, '1101111001111', b);
+
+@pragma('dart2js:noInline')
+f_110_111_101_000_1(Set<String> u, int b) => v(u, '1101111010001', b);
+
+@pragma('dart2js:noInline')
+f_110_111_101_001_1(Set<String> u, int b) => v(u, '1101111010011', b);
+
+@pragma('dart2js:noInline')
+f_110_111_101_010_1(Set<String> u, int b) => v(u, '1101111010101', b);
+
+@pragma('dart2js:noInline')
+f_110_111_101_011_1(Set<String> u, int b) => v(u, '1101111010111', b);
+
+@pragma('dart2js:noInline')
+f_110_111_101_100_1(Set<String> u, int b) => v(u, '1101111011001', b);
+
+@pragma('dart2js:noInline')
+f_110_111_101_101_1(Set<String> u, int b) => v(u, '1101111011011', b);
+
+@pragma('dart2js:noInline')
+f_110_111_101_110_1(Set<String> u, int b) => v(u, '1101111011101', b);
+
+@pragma('dart2js:noInline')
+f_110_111_101_111_1(Set<String> u, int b) => v(u, '1101111011111', b);
+
+@pragma('dart2js:noInline')
+f_110_111_110_000_1(Set<String> u, int b) => v(u, '1101111100001', b);
+
+@pragma('dart2js:noInline')
+f_110_111_110_001_1(Set<String> u, int b) => v(u, '1101111100011', b);
+
+@pragma('dart2js:noInline')
+f_110_111_110_010_1(Set<String> u, int b) => v(u, '1101111100101', b);
+
+@pragma('dart2js:noInline')
+f_110_111_110_011_1(Set<String> u, int b) => v(u, '1101111100111', b);
+
+@pragma('dart2js:noInline')
+f_110_111_110_100_1(Set<String> u, int b) => v(u, '1101111101001', b);
+
+@pragma('dart2js:noInline')
+f_110_111_110_101_1(Set<String> u, int b) => v(u, '1101111101011', b);
+
+@pragma('dart2js:noInline')
+f_110_111_110_110_1(Set<String> u, int b) => v(u, '1101111101101', b);
+
+@pragma('dart2js:noInline')
+f_110_111_110_111_1(Set<String> u, int b) => v(u, '1101111101111', b);
+
+@pragma('dart2js:noInline')
+f_110_111_111_000_1(Set<String> u, int b) => v(u, '1101111110001', b);
+
+@pragma('dart2js:noInline')
+f_110_111_111_001_1(Set<String> u, int b) => v(u, '1101111110011', b);
+
+@pragma('dart2js:noInline')
+f_110_111_111_010_1(Set<String> u, int b) => v(u, '1101111110101', b);
+
+@pragma('dart2js:noInline')
+f_110_111_111_011_1(Set<String> u, int b) => v(u, '1101111110111', b);
+
+@pragma('dart2js:noInline')
+f_110_111_111_100_1(Set<String> u, int b) => v(u, '1101111111001', b);
+
+@pragma('dart2js:noInline')
+f_110_111_111_101_1(Set<String> u, int b) => v(u, '1101111111011', b);
+
+@pragma('dart2js:noInline')
+f_110_111_111_110_1(Set<String> u, int b) => v(u, '1101111111101', b);
+
+@pragma('dart2js:noInline')
+f_110_111_111_111_1(Set<String> u, int b) => v(u, '1101111111111', b);
+
+@pragma('dart2js:noInline')
+f_111_000_000_000_1(Set<String> u, int b) => v(u, '1110000000001', b);
+
+@pragma('dart2js:noInline')
+f_111_000_000_001_1(Set<String> u, int b) => v(u, '1110000000011', b);
+
+@pragma('dart2js:noInline')
+f_111_000_000_010_1(Set<String> u, int b) => v(u, '1110000000101', b);
+
+@pragma('dart2js:noInline')
+f_111_000_000_011_1(Set<String> u, int b) => v(u, '1110000000111', b);
+
+@pragma('dart2js:noInline')
+f_111_000_000_100_1(Set<String> u, int b) => v(u, '1110000001001', b);
+
+@pragma('dart2js:noInline')
+f_111_000_000_101_1(Set<String> u, int b) => v(u, '1110000001011', b);
+
+@pragma('dart2js:noInline')
+f_111_000_000_110_1(Set<String> u, int b) => v(u, '1110000001101', b);
+
+@pragma('dart2js:noInline')
+f_111_000_000_111_1(Set<String> u, int b) => v(u, '1110000001111', b);
+
+@pragma('dart2js:noInline')
+f_111_000_001_000_1(Set<String> u, int b) => v(u, '1110000010001', b);
+
+@pragma('dart2js:noInline')
+f_111_000_001_001_1(Set<String> u, int b) => v(u, '1110000010011', b);
+
+@pragma('dart2js:noInline')
+f_111_000_001_010_1(Set<String> u, int b) => v(u, '1110000010101', b);
+
+@pragma('dart2js:noInline')
+f_111_000_001_011_1(Set<String> u, int b) => v(u, '1110000010111', b);
+
+@pragma('dart2js:noInline')
+f_111_000_001_100_1(Set<String> u, int b) => v(u, '1110000011001', b);
+
+@pragma('dart2js:noInline')
+f_111_000_001_101_1(Set<String> u, int b) => v(u, '1110000011011', b);
+
+@pragma('dart2js:noInline')
+f_111_000_001_110_1(Set<String> u, int b) => v(u, '1110000011101', b);
+
+@pragma('dart2js:noInline')
+f_111_000_001_111_1(Set<String> u, int b) => v(u, '1110000011111', b);
+
+@pragma('dart2js:noInline')
+f_111_000_010_000_1(Set<String> u, int b) => v(u, '1110000100001', b);
+
+@pragma('dart2js:noInline')
+f_111_000_010_001_1(Set<String> u, int b) => v(u, '1110000100011', b);
+
+@pragma('dart2js:noInline')
+f_111_000_010_010_1(Set<String> u, int b) => v(u, '1110000100101', b);
+
+@pragma('dart2js:noInline')
+f_111_000_010_011_1(Set<String> u, int b) => v(u, '1110000100111', b);
+
+@pragma('dart2js:noInline')
+f_111_000_010_100_1(Set<String> u, int b) => v(u, '1110000101001', b);
+
+@pragma('dart2js:noInline')
+f_111_000_010_101_1(Set<String> u, int b) => v(u, '1110000101011', b);
+
+@pragma('dart2js:noInline')
+f_111_000_010_110_1(Set<String> u, int b) => v(u, '1110000101101', b);
+
+@pragma('dart2js:noInline')
+f_111_000_010_111_1(Set<String> u, int b) => v(u, '1110000101111', b);
+
+@pragma('dart2js:noInline')
+f_111_000_011_000_1(Set<String> u, int b) => v(u, '1110000110001', b);
+
+@pragma('dart2js:noInline')
+f_111_000_011_001_1(Set<String> u, int b) => v(u, '1110000110011', b);
+
+@pragma('dart2js:noInline')
+f_111_000_011_010_1(Set<String> u, int b) => v(u, '1110000110101', b);
+
+@pragma('dart2js:noInline')
+f_111_000_011_011_1(Set<String> u, int b) => v(u, '1110000110111', b);
+
+@pragma('dart2js:noInline')
+f_111_000_011_100_1(Set<String> u, int b) => v(u, '1110000111001', b);
+
+@pragma('dart2js:noInline')
+f_111_000_011_101_1(Set<String> u, int b) => v(u, '1110000111011', b);
+
+@pragma('dart2js:noInline')
+f_111_000_011_110_1(Set<String> u, int b) => v(u, '1110000111101', b);
+
+@pragma('dart2js:noInline')
+f_111_000_011_111_1(Set<String> u, int b) => v(u, '1110000111111', b);
+
+@pragma('dart2js:noInline')
+f_111_000_100_000_1(Set<String> u, int b) => v(u, '1110001000001', b);
+
+@pragma('dart2js:noInline')
+f_111_000_100_001_1(Set<String> u, int b) => v(u, '1110001000011', b);
+
+@pragma('dart2js:noInline')
+f_111_000_100_010_1(Set<String> u, int b) => v(u, '1110001000101', b);
+
+@pragma('dart2js:noInline')
+f_111_000_100_011_1(Set<String> u, int b) => v(u, '1110001000111', b);
+
+@pragma('dart2js:noInline')
+f_111_000_100_100_1(Set<String> u, int b) => v(u, '1110001001001', b);
+
+@pragma('dart2js:noInline')
+f_111_000_100_101_1(Set<String> u, int b) => v(u, '1110001001011', b);
+
+@pragma('dart2js:noInline')
+f_111_000_100_110_1(Set<String> u, int b) => v(u, '1110001001101', b);
+
+@pragma('dart2js:noInline')
+f_111_000_100_111_1(Set<String> u, int b) => v(u, '1110001001111', b);
+
+@pragma('dart2js:noInline')
+f_111_000_101_000_1(Set<String> u, int b) => v(u, '1110001010001', b);
+
+@pragma('dart2js:noInline')
+f_111_000_101_001_1(Set<String> u, int b) => v(u, '1110001010011', b);
+
+@pragma('dart2js:noInline')
+f_111_000_101_010_1(Set<String> u, int b) => v(u, '1110001010101', b);
+
+@pragma('dart2js:noInline')
+f_111_000_101_011_1(Set<String> u, int b) => v(u, '1110001010111', b);
+
+@pragma('dart2js:noInline')
+f_111_000_101_100_1(Set<String> u, int b) => v(u, '1110001011001', b);
+
+@pragma('dart2js:noInline')
+f_111_000_101_101_1(Set<String> u, int b) => v(u, '1110001011011', b);
+
+@pragma('dart2js:noInline')
+f_111_000_101_110_1(Set<String> u, int b) => v(u, '1110001011101', b);
+
+@pragma('dart2js:noInline')
+f_111_000_101_111_1(Set<String> u, int b) => v(u, '1110001011111', b);
+
+@pragma('dart2js:noInline')
+f_111_000_110_000_1(Set<String> u, int b) => v(u, '1110001100001', b);
+
+@pragma('dart2js:noInline')
+f_111_000_110_001_1(Set<String> u, int b) => v(u, '1110001100011', b);
+
+@pragma('dart2js:noInline')
+f_111_000_110_010_1(Set<String> u, int b) => v(u, '1110001100101', b);
+
+@pragma('dart2js:noInline')
+f_111_000_110_011_1(Set<String> u, int b) => v(u, '1110001100111', b);
+
+@pragma('dart2js:noInline')
+f_111_000_110_100_1(Set<String> u, int b) => v(u, '1110001101001', b);
+
+@pragma('dart2js:noInline')
+f_111_000_110_101_1(Set<String> u, int b) => v(u, '1110001101011', b);
+
+@pragma('dart2js:noInline')
+f_111_000_110_110_1(Set<String> u, int b) => v(u, '1110001101101', b);
+
+@pragma('dart2js:noInline')
+f_111_000_110_111_1(Set<String> u, int b) => v(u, '1110001101111', b);
+
+@pragma('dart2js:noInline')
+f_111_000_111_000_1(Set<String> u, int b) => v(u, '1110001110001', b);
+
+@pragma('dart2js:noInline')
+f_111_000_111_001_1(Set<String> u, int b) => v(u, '1110001110011', b);
+
+@pragma('dart2js:noInline')
+f_111_000_111_010_1(Set<String> u, int b) => v(u, '1110001110101', b);
+
+@pragma('dart2js:noInline')
+f_111_000_111_011_1(Set<String> u, int b) => v(u, '1110001110111', b);
+
+@pragma('dart2js:noInline')
+f_111_000_111_100_1(Set<String> u, int b) => v(u, '1110001111001', b);
+
+@pragma('dart2js:noInline')
+f_111_000_111_101_1(Set<String> u, int b) => v(u, '1110001111011', b);
+
+@pragma('dart2js:noInline')
+f_111_000_111_110_1(Set<String> u, int b) => v(u, '1110001111101', b);
+
+@pragma('dart2js:noInline')
+f_111_000_111_111_1(Set<String> u, int b) => v(u, '1110001111111', b);
+
+@pragma('dart2js:noInline')
+f_111_001_000_000_1(Set<String> u, int b) => v(u, '1110010000001', b);
+
+@pragma('dart2js:noInline')
+f_111_001_000_001_1(Set<String> u, int b) => v(u, '1110010000011', b);
+
+@pragma('dart2js:noInline')
+f_111_001_000_010_1(Set<String> u, int b) => v(u, '1110010000101', b);
+
+@pragma('dart2js:noInline')
+f_111_001_000_011_1(Set<String> u, int b) => v(u, '1110010000111', b);
+
+@pragma('dart2js:noInline')
+f_111_001_000_100_1(Set<String> u, int b) => v(u, '1110010001001', b);
+
+@pragma('dart2js:noInline')
+f_111_001_000_101_1(Set<String> u, int b) => v(u, '1110010001011', b);
+
+@pragma('dart2js:noInline')
+f_111_001_000_110_1(Set<String> u, int b) => v(u, '1110010001101', b);
+
+@pragma('dart2js:noInline')
+f_111_001_000_111_1(Set<String> u, int b) => v(u, '1110010001111', b);
+
+@pragma('dart2js:noInline')
+f_111_001_001_000_1(Set<String> u, int b) => v(u, '1110010010001', b);
+
+@pragma('dart2js:noInline')
+f_111_001_001_001_1(Set<String> u, int b) => v(u, '1110010010011', b);
+
+@pragma('dart2js:noInline')
+f_111_001_001_010_1(Set<String> u, int b) => v(u, '1110010010101', b);
+
+@pragma('dart2js:noInline')
+f_111_001_001_011_1(Set<String> u, int b) => v(u, '1110010010111', b);
+
+@pragma('dart2js:noInline')
+f_111_001_001_100_1(Set<String> u, int b) => v(u, '1110010011001', b);
+
+@pragma('dart2js:noInline')
+f_111_001_001_101_1(Set<String> u, int b) => v(u, '1110010011011', b);
+
+@pragma('dart2js:noInline')
+f_111_001_001_110_1(Set<String> u, int b) => v(u, '1110010011101', b);
+
+@pragma('dart2js:noInline')
+f_111_001_001_111_1(Set<String> u, int b) => v(u, '1110010011111', b);
+
+@pragma('dart2js:noInline')
+f_111_001_010_000_1(Set<String> u, int b) => v(u, '1110010100001', b);
+
+@pragma('dart2js:noInline')
+f_111_001_010_001_1(Set<String> u, int b) => v(u, '1110010100011', b);
+
+@pragma('dart2js:noInline')
+f_111_001_010_010_1(Set<String> u, int b) => v(u, '1110010100101', b);
+
+@pragma('dart2js:noInline')
+f_111_001_010_011_1(Set<String> u, int b) => v(u, '1110010100111', b);
+
+@pragma('dart2js:noInline')
+f_111_001_010_100_1(Set<String> u, int b) => v(u, '1110010101001', b);
+
+@pragma('dart2js:noInline')
+f_111_001_010_101_1(Set<String> u, int b) => v(u, '1110010101011', b);
+
+@pragma('dart2js:noInline')
+f_111_001_010_110_1(Set<String> u, int b) => v(u, '1110010101101', b);
+
+@pragma('dart2js:noInline')
+f_111_001_010_111_1(Set<String> u, int b) => v(u, '1110010101111', b);
+
+@pragma('dart2js:noInline')
+f_111_001_011_000_1(Set<String> u, int b) => v(u, '1110010110001', b);
+
+@pragma('dart2js:noInline')
+f_111_001_011_001_1(Set<String> u, int b) => v(u, '1110010110011', b);
+
+@pragma('dart2js:noInline')
+f_111_001_011_010_1(Set<String> u, int b) => v(u, '1110010110101', b);
+
+@pragma('dart2js:noInline')
+f_111_001_011_011_1(Set<String> u, int b) => v(u, '1110010110111', b);
+
+@pragma('dart2js:noInline')
+f_111_001_011_100_1(Set<String> u, int b) => v(u, '1110010111001', b);
+
+@pragma('dart2js:noInline')
+f_111_001_011_101_1(Set<String> u, int b) => v(u, '1110010111011', b);
+
+@pragma('dart2js:noInline')
+f_111_001_011_110_1(Set<String> u, int b) => v(u, '1110010111101', b);
+
+@pragma('dart2js:noInline')
+f_111_001_011_111_1(Set<String> u, int b) => v(u, '1110010111111', b);
+
+@pragma('dart2js:noInline')
+f_111_001_100_000_1(Set<String> u, int b) => v(u, '1110011000001', b);
+
+@pragma('dart2js:noInline')
+f_111_001_100_001_1(Set<String> u, int b) => v(u, '1110011000011', b);
+
+@pragma('dart2js:noInline')
+f_111_001_100_010_1(Set<String> u, int b) => v(u, '1110011000101', b);
+
+@pragma('dart2js:noInline')
+f_111_001_100_011_1(Set<String> u, int b) => v(u, '1110011000111', b);
+
+@pragma('dart2js:noInline')
+f_111_001_100_100_1(Set<String> u, int b) => v(u, '1110011001001', b);
+
+@pragma('dart2js:noInline')
+f_111_001_100_101_1(Set<String> u, int b) => v(u, '1110011001011', b);
+
+@pragma('dart2js:noInline')
+f_111_001_100_110_1(Set<String> u, int b) => v(u, '1110011001101', b);
+
+@pragma('dart2js:noInline')
+f_111_001_100_111_1(Set<String> u, int b) => v(u, '1110011001111', b);
+
+@pragma('dart2js:noInline')
+f_111_001_101_000_1(Set<String> u, int b) => v(u, '1110011010001', b);
+
+@pragma('dart2js:noInline')
+f_111_001_101_001_1(Set<String> u, int b) => v(u, '1110011010011', b);
+
+@pragma('dart2js:noInline')
+f_111_001_101_010_1(Set<String> u, int b) => v(u, '1110011010101', b);
+
+@pragma('dart2js:noInline')
+f_111_001_101_011_1(Set<String> u, int b) => v(u, '1110011010111', b);
+
+@pragma('dart2js:noInline')
+f_111_001_101_100_1(Set<String> u, int b) => v(u, '1110011011001', b);
+
+@pragma('dart2js:noInline')
+f_111_001_101_101_1(Set<String> u, int b) => v(u, '1110011011011', b);
+
+@pragma('dart2js:noInline')
+f_111_001_101_110_1(Set<String> u, int b) => v(u, '1110011011101', b);
+
+@pragma('dart2js:noInline')
+f_111_001_101_111_1(Set<String> u, int b) => v(u, '1110011011111', b);
+
+@pragma('dart2js:noInline')
+f_111_001_110_000_1(Set<String> u, int b) => v(u, '1110011100001', b);
+
+@pragma('dart2js:noInline')
+f_111_001_110_001_1(Set<String> u, int b) => v(u, '1110011100011', b);
+
+@pragma('dart2js:noInline')
+f_111_001_110_010_1(Set<String> u, int b) => v(u, '1110011100101', b);
+
+@pragma('dart2js:noInline')
+f_111_001_110_011_1(Set<String> u, int b) => v(u, '1110011100111', b);
+
+@pragma('dart2js:noInline')
+f_111_001_110_100_1(Set<String> u, int b) => v(u, '1110011101001', b);
+
+@pragma('dart2js:noInline')
+f_111_001_110_101_1(Set<String> u, int b) => v(u, '1110011101011', b);
+
+@pragma('dart2js:noInline')
+f_111_001_110_110_1(Set<String> u, int b) => v(u, '1110011101101', b);
+
+@pragma('dart2js:noInline')
+f_111_001_110_111_1(Set<String> u, int b) => v(u, '1110011101111', b);
+
+@pragma('dart2js:noInline')
+f_111_001_111_000_1(Set<String> u, int b) => v(u, '1110011110001', b);
+
+@pragma('dart2js:noInline')
+f_111_001_111_001_1(Set<String> u, int b) => v(u, '1110011110011', b);
+
+@pragma('dart2js:noInline')
+f_111_001_111_010_1(Set<String> u, int b) => v(u, '1110011110101', b);
+
+@pragma('dart2js:noInline')
+f_111_001_111_011_1(Set<String> u, int b) => v(u, '1110011110111', b);
+
+@pragma('dart2js:noInline')
+f_111_001_111_100_1(Set<String> u, int b) => v(u, '1110011111001', b);
+
+@pragma('dart2js:noInline')
+f_111_001_111_101_1(Set<String> u, int b) => v(u, '1110011111011', b);
+
+@pragma('dart2js:noInline')
+f_111_001_111_110_1(Set<String> u, int b) => v(u, '1110011111101', b);
+
+@pragma('dart2js:noInline')
+f_111_001_111_111_1(Set<String> u, int b) => v(u, '1110011111111', b);
+
+@pragma('dart2js:noInline')
+f_111_010_000_000_1(Set<String> u, int b) => v(u, '1110100000001', b);
+
+@pragma('dart2js:noInline')
+f_111_010_000_001_1(Set<String> u, int b) => v(u, '1110100000011', b);
+
+@pragma('dart2js:noInline')
+f_111_010_000_010_1(Set<String> u, int b) => v(u, '1110100000101', b);
+
+@pragma('dart2js:noInline')
+f_111_010_000_011_1(Set<String> u, int b) => v(u, '1110100000111', b);
+
+@pragma('dart2js:noInline')
+f_111_010_000_100_1(Set<String> u, int b) => v(u, '1110100001001', b);
+
+@pragma('dart2js:noInline')
+f_111_010_000_101_1(Set<String> u, int b) => v(u, '1110100001011', b);
+
+@pragma('dart2js:noInline')
+f_111_010_000_110_1(Set<String> u, int b) => v(u, '1110100001101', b);
+
+@pragma('dart2js:noInline')
+f_111_010_000_111_1(Set<String> u, int b) => v(u, '1110100001111', b);
+
+@pragma('dart2js:noInline')
+f_111_010_001_000_1(Set<String> u, int b) => v(u, '1110100010001', b);
+
+@pragma('dart2js:noInline')
+f_111_010_001_001_1(Set<String> u, int b) => v(u, '1110100010011', b);
+
+@pragma('dart2js:noInline')
+f_111_010_001_010_1(Set<String> u, int b) => v(u, '1110100010101', b);
+
+@pragma('dart2js:noInline')
+f_111_010_001_011_1(Set<String> u, int b) => v(u, '1110100010111', b);
+
+@pragma('dart2js:noInline')
+f_111_010_001_100_1(Set<String> u, int b) => v(u, '1110100011001', b);
+
+@pragma('dart2js:noInline')
+f_111_010_001_101_1(Set<String> u, int b) => v(u, '1110100011011', b);
+
+@pragma('dart2js:noInline')
+f_111_010_001_110_1(Set<String> u, int b) => v(u, '1110100011101', b);
+
+@pragma('dart2js:noInline')
+f_111_010_001_111_1(Set<String> u, int b) => v(u, '1110100011111', b);
+
+@pragma('dart2js:noInline')
+f_111_010_010_000_1(Set<String> u, int b) => v(u, '1110100100001', b);
+
+@pragma('dart2js:noInline')
+f_111_010_010_001_1(Set<String> u, int b) => v(u, '1110100100011', b);
+
+@pragma('dart2js:noInline')
+f_111_010_010_010_1(Set<String> u, int b) => v(u, '1110100100101', b);
+
+@pragma('dart2js:noInline')
+f_111_010_010_011_1(Set<String> u, int b) => v(u, '1110100100111', b);
+
+@pragma('dart2js:noInline')
+f_111_010_010_100_1(Set<String> u, int b) => v(u, '1110100101001', b);
+
+@pragma('dart2js:noInline')
+f_111_010_010_101_1(Set<String> u, int b) => v(u, '1110100101011', b);
+
+@pragma('dart2js:noInline')
+f_111_010_010_110_1(Set<String> u, int b) => v(u, '1110100101101', b);
+
+@pragma('dart2js:noInline')
+f_111_010_010_111_1(Set<String> u, int b) => v(u, '1110100101111', b);
+
+@pragma('dart2js:noInline')
+f_111_010_011_000_1(Set<String> u, int b) => v(u, '1110100110001', b);
+
+@pragma('dart2js:noInline')
+f_111_010_011_001_1(Set<String> u, int b) => v(u, '1110100110011', b);
+
+@pragma('dart2js:noInline')
+f_111_010_011_010_1(Set<String> u, int b) => v(u, '1110100110101', b);
+
+@pragma('dart2js:noInline')
+f_111_010_011_011_1(Set<String> u, int b) => v(u, '1110100110111', b);
+
+@pragma('dart2js:noInline')
+f_111_010_011_100_1(Set<String> u, int b) => v(u, '1110100111001', b);
+
+@pragma('dart2js:noInline')
+f_111_010_011_101_1(Set<String> u, int b) => v(u, '1110100111011', b);
+
+@pragma('dart2js:noInline')
+f_111_010_011_110_1(Set<String> u, int b) => v(u, '1110100111101', b);
+
+@pragma('dart2js:noInline')
+f_111_010_011_111_1(Set<String> u, int b) => v(u, '1110100111111', b);
+
+@pragma('dart2js:noInline')
+f_111_010_100_000_1(Set<String> u, int b) => v(u, '1110101000001', b);
+
+@pragma('dart2js:noInline')
+f_111_010_100_001_1(Set<String> u, int b) => v(u, '1110101000011', b);
+
+@pragma('dart2js:noInline')
+f_111_010_100_010_1(Set<String> u, int b) => v(u, '1110101000101', b);
+
+@pragma('dart2js:noInline')
+f_111_010_100_011_1(Set<String> u, int b) => v(u, '1110101000111', b);
+
+@pragma('dart2js:noInline')
+f_111_010_100_100_1(Set<String> u, int b) => v(u, '1110101001001', b);
+
+@pragma('dart2js:noInline')
+f_111_010_100_101_1(Set<String> u, int b) => v(u, '1110101001011', b);
+
+@pragma('dart2js:noInline')
+f_111_010_100_110_1(Set<String> u, int b) => v(u, '1110101001101', b);
+
+@pragma('dart2js:noInline')
+f_111_010_100_111_1(Set<String> u, int b) => v(u, '1110101001111', b);
+
+@pragma('dart2js:noInline')
+f_111_010_101_000_1(Set<String> u, int b) => v(u, '1110101010001', b);
+
+@pragma('dart2js:noInline')
+f_111_010_101_001_1(Set<String> u, int b) => v(u, '1110101010011', b);
+
+@pragma('dart2js:noInline')
+f_111_010_101_010_1(Set<String> u, int b) => v(u, '1110101010101', b);
+
+@pragma('dart2js:noInline')
+f_111_010_101_011_1(Set<String> u, int b) => v(u, '1110101010111', b);
+
+@pragma('dart2js:noInline')
+f_111_010_101_100_1(Set<String> u, int b) => v(u, '1110101011001', b);
+
+@pragma('dart2js:noInline')
+f_111_010_101_101_1(Set<String> u, int b) => v(u, '1110101011011', b);
+
+@pragma('dart2js:noInline')
+f_111_010_101_110_1(Set<String> u, int b) => v(u, '1110101011101', b);
+
+@pragma('dart2js:noInline')
+f_111_010_101_111_1(Set<String> u, int b) => v(u, '1110101011111', b);
+
+@pragma('dart2js:noInline')
+f_111_010_110_000_1(Set<String> u, int b) => v(u, '1110101100001', b);
+
+@pragma('dart2js:noInline')
+f_111_010_110_001_1(Set<String> u, int b) => v(u, '1110101100011', b);
+
+@pragma('dart2js:noInline')
+f_111_010_110_010_1(Set<String> u, int b) => v(u, '1110101100101', b);
+
+@pragma('dart2js:noInline')
+f_111_010_110_011_1(Set<String> u, int b) => v(u, '1110101100111', b);
+
+@pragma('dart2js:noInline')
+f_111_010_110_100_1(Set<String> u, int b) => v(u, '1110101101001', b);
+
+@pragma('dart2js:noInline')
+f_111_010_110_101_1(Set<String> u, int b) => v(u, '1110101101011', b);
+
+@pragma('dart2js:noInline')
+f_111_010_110_110_1(Set<String> u, int b) => v(u, '1110101101101', b);
+
+@pragma('dart2js:noInline')
+f_111_010_110_111_1(Set<String> u, int b) => v(u, '1110101101111', b);
+
+@pragma('dart2js:noInline')
+f_111_010_111_000_1(Set<String> u, int b) => v(u, '1110101110001', b);
+
+@pragma('dart2js:noInline')
+f_111_010_111_001_1(Set<String> u, int b) => v(u, '1110101110011', b);
+
+@pragma('dart2js:noInline')
+f_111_010_111_010_1(Set<String> u, int b) => v(u, '1110101110101', b);
+
+@pragma('dart2js:noInline')
+f_111_010_111_011_1(Set<String> u, int b) => v(u, '1110101110111', b);
+
+@pragma('dart2js:noInline')
+f_111_010_111_100_1(Set<String> u, int b) => v(u, '1110101111001', b);
+
+@pragma('dart2js:noInline')
+f_111_010_111_101_1(Set<String> u, int b) => v(u, '1110101111011', b);
+
+@pragma('dart2js:noInline')
+f_111_010_111_110_1(Set<String> u, int b) => v(u, '1110101111101', b);
+
+@pragma('dart2js:noInline')
+f_111_010_111_111_1(Set<String> u, int b) => v(u, '1110101111111', b);
+
+@pragma('dart2js:noInline')
+f_111_011_000_000_1(Set<String> u, int b) => v(u, '1110110000001', b);
+
+@pragma('dart2js:noInline')
+f_111_011_000_001_1(Set<String> u, int b) => v(u, '1110110000011', b);
+
+@pragma('dart2js:noInline')
+f_111_011_000_010_1(Set<String> u, int b) => v(u, '1110110000101', b);
+
+@pragma('dart2js:noInline')
+f_111_011_000_011_1(Set<String> u, int b) => v(u, '1110110000111', b);
+
+@pragma('dart2js:noInline')
+f_111_011_000_100_1(Set<String> u, int b) => v(u, '1110110001001', b);
+
+@pragma('dart2js:noInline')
+f_111_011_000_101_1(Set<String> u, int b) => v(u, '1110110001011', b);
+
+@pragma('dart2js:noInline')
+f_111_011_000_110_1(Set<String> u, int b) => v(u, '1110110001101', b);
+
+@pragma('dart2js:noInline')
+f_111_011_000_111_1(Set<String> u, int b) => v(u, '1110110001111', b);
+
+@pragma('dart2js:noInline')
+f_111_011_001_000_1(Set<String> u, int b) => v(u, '1110110010001', b);
+
+@pragma('dart2js:noInline')
+f_111_011_001_001_1(Set<String> u, int b) => v(u, '1110110010011', b);
+
+@pragma('dart2js:noInline')
+f_111_011_001_010_1(Set<String> u, int b) => v(u, '1110110010101', b);
+
+@pragma('dart2js:noInline')
+f_111_011_001_011_1(Set<String> u, int b) => v(u, '1110110010111', b);
+
+@pragma('dart2js:noInline')
+f_111_011_001_100_1(Set<String> u, int b) => v(u, '1110110011001', b);
+
+@pragma('dart2js:noInline')
+f_111_011_001_101_1(Set<String> u, int b) => v(u, '1110110011011', b);
+
+@pragma('dart2js:noInline')
+f_111_011_001_110_1(Set<String> u, int b) => v(u, '1110110011101', b);
+
+@pragma('dart2js:noInline')
+f_111_011_001_111_1(Set<String> u, int b) => v(u, '1110110011111', b);
+
+@pragma('dart2js:noInline')
+f_111_011_010_000_1(Set<String> u, int b) => v(u, '1110110100001', b);
+
+@pragma('dart2js:noInline')
+f_111_011_010_001_1(Set<String> u, int b) => v(u, '1110110100011', b);
+
+@pragma('dart2js:noInline')
+f_111_011_010_010_1(Set<String> u, int b) => v(u, '1110110100101', b);
+
+@pragma('dart2js:noInline')
+f_111_011_010_011_1(Set<String> u, int b) => v(u, '1110110100111', b);
+
+@pragma('dart2js:noInline')
+f_111_011_010_100_1(Set<String> u, int b) => v(u, '1110110101001', b);
+
+@pragma('dart2js:noInline')
+f_111_011_010_101_1(Set<String> u, int b) => v(u, '1110110101011', b);
+
+@pragma('dart2js:noInline')
+f_111_011_010_110_1(Set<String> u, int b) => v(u, '1110110101101', b);
+
+@pragma('dart2js:noInline')
+f_111_011_010_111_1(Set<String> u, int b) => v(u, '1110110101111', b);
+
+@pragma('dart2js:noInline')
+f_111_011_011_000_1(Set<String> u, int b) => v(u, '1110110110001', b);
+
+@pragma('dart2js:noInline')
+f_111_011_011_001_1(Set<String> u, int b) => v(u, '1110110110011', b);
+
+@pragma('dart2js:noInline')
+f_111_011_011_010_1(Set<String> u, int b) => v(u, '1110110110101', b);
+
+@pragma('dart2js:noInline')
+f_111_011_011_011_1(Set<String> u, int b) => v(u, '1110110110111', b);
+
+@pragma('dart2js:noInline')
+f_111_011_011_100_1(Set<String> u, int b) => v(u, '1110110111001', b);
+
+@pragma('dart2js:noInline')
+f_111_011_011_101_1(Set<String> u, int b) => v(u, '1110110111011', b);
+
+@pragma('dart2js:noInline')
+f_111_011_011_110_1(Set<String> u, int b) => v(u, '1110110111101', b);
+
+@pragma('dart2js:noInline')
+f_111_011_011_111_1(Set<String> u, int b) => v(u, '1110110111111', b);
+
+@pragma('dart2js:noInline')
+f_111_011_100_000_1(Set<String> u, int b) => v(u, '1110111000001', b);
+
+@pragma('dart2js:noInline')
+f_111_011_100_001_1(Set<String> u, int b) => v(u, '1110111000011', b);
+
+@pragma('dart2js:noInline')
+f_111_011_100_010_1(Set<String> u, int b) => v(u, '1110111000101', b);
+
+@pragma('dart2js:noInline')
+f_111_011_100_011_1(Set<String> u, int b) => v(u, '1110111000111', b);
+
+@pragma('dart2js:noInline')
+f_111_011_100_100_1(Set<String> u, int b) => v(u, '1110111001001', b);
+
+@pragma('dart2js:noInline')
+f_111_011_100_101_1(Set<String> u, int b) => v(u, '1110111001011', b);
+
+@pragma('dart2js:noInline')
+f_111_011_100_110_1(Set<String> u, int b) => v(u, '1110111001101', b);
+
+@pragma('dart2js:noInline')
+f_111_011_100_111_1(Set<String> u, int b) => v(u, '1110111001111', b);
+
+@pragma('dart2js:noInline')
+f_111_011_101_000_1(Set<String> u, int b) => v(u, '1110111010001', b);
+
+@pragma('dart2js:noInline')
+f_111_011_101_001_1(Set<String> u, int b) => v(u, '1110111010011', b);
+
+@pragma('dart2js:noInline')
+f_111_011_101_010_1(Set<String> u, int b) => v(u, '1110111010101', b);
+
+@pragma('dart2js:noInline')
+f_111_011_101_011_1(Set<String> u, int b) => v(u, '1110111010111', b);
+
+@pragma('dart2js:noInline')
+f_111_011_101_100_1(Set<String> u, int b) => v(u, '1110111011001', b);
+
+@pragma('dart2js:noInline')
+f_111_011_101_101_1(Set<String> u, int b) => v(u, '1110111011011', b);
+
+@pragma('dart2js:noInline')
+f_111_011_101_110_1(Set<String> u, int b) => v(u, '1110111011101', b);
+
+@pragma('dart2js:noInline')
+f_111_011_101_111_1(Set<String> u, int b) => v(u, '1110111011111', b);
+
+@pragma('dart2js:noInline')
+f_111_011_110_000_1(Set<String> u, int b) => v(u, '1110111100001', b);
+
+@pragma('dart2js:noInline')
+f_111_011_110_001_1(Set<String> u, int b) => v(u, '1110111100011', b);
+
+@pragma('dart2js:noInline')
+f_111_011_110_010_1(Set<String> u, int b) => v(u, '1110111100101', b);
+
+@pragma('dart2js:noInline')
+f_111_011_110_011_1(Set<String> u, int b) => v(u, '1110111100111', b);
+
+@pragma('dart2js:noInline')
+f_111_011_110_100_1(Set<String> u, int b) => v(u, '1110111101001', b);
+
+@pragma('dart2js:noInline')
+f_111_011_110_101_1(Set<String> u, int b) => v(u, '1110111101011', b);
+
+@pragma('dart2js:noInline')
+f_111_011_110_110_1(Set<String> u, int b) => v(u, '1110111101101', b);
+
+@pragma('dart2js:noInline')
+f_111_011_110_111_1(Set<String> u, int b) => v(u, '1110111101111', b);
+
+@pragma('dart2js:noInline')
+f_111_011_111_000_1(Set<String> u, int b) => v(u, '1110111110001', b);
+
+@pragma('dart2js:noInline')
+f_111_011_111_001_1(Set<String> u, int b) => v(u, '1110111110011', b);
+
+@pragma('dart2js:noInline')
+f_111_011_111_010_1(Set<String> u, int b) => v(u, '1110111110101', b);
+
+@pragma('dart2js:noInline')
+f_111_011_111_011_1(Set<String> u, int b) => v(u, '1110111110111', b);
+
+@pragma('dart2js:noInline')
+f_111_011_111_100_1(Set<String> u, int b) => v(u, '1110111111001', b);
+
+@pragma('dart2js:noInline')
+f_111_011_111_101_1(Set<String> u, int b) => v(u, '1110111111011', b);
+
+@pragma('dart2js:noInline')
+f_111_011_111_110_1(Set<String> u, int b) => v(u, '1110111111101', b);
+
+@pragma('dart2js:noInline')
+f_111_011_111_111_1(Set<String> u, int b) => v(u, '1110111111111', b);
+
+@pragma('dart2js:noInline')
+f_111_100_000_000_1(Set<String> u, int b) => v(u, '1111000000001', b);
+
+@pragma('dart2js:noInline')
+f_111_100_000_001_1(Set<String> u, int b) => v(u, '1111000000011', b);
+
+@pragma('dart2js:noInline')
+f_111_100_000_010_1(Set<String> u, int b) => v(u, '1111000000101', b);
+
+@pragma('dart2js:noInline')
+f_111_100_000_011_1(Set<String> u, int b) => v(u, '1111000000111', b);
+
+@pragma('dart2js:noInline')
+f_111_100_000_100_1(Set<String> u, int b) => v(u, '1111000001001', b);
+
+@pragma('dart2js:noInline')
+f_111_100_000_101_1(Set<String> u, int b) => v(u, '1111000001011', b);
+
+@pragma('dart2js:noInline')
+f_111_100_000_110_1(Set<String> u, int b) => v(u, '1111000001101', b);
+
+@pragma('dart2js:noInline')
+f_111_100_000_111_1(Set<String> u, int b) => v(u, '1111000001111', b);
+
+@pragma('dart2js:noInline')
+f_111_100_001_000_1(Set<String> u, int b) => v(u, '1111000010001', b);
+
+@pragma('dart2js:noInline')
+f_111_100_001_001_1(Set<String> u, int b) => v(u, '1111000010011', b);
+
+@pragma('dart2js:noInline')
+f_111_100_001_010_1(Set<String> u, int b) => v(u, '1111000010101', b);
+
+@pragma('dart2js:noInline')
+f_111_100_001_011_1(Set<String> u, int b) => v(u, '1111000010111', b);
+
+@pragma('dart2js:noInline')
+f_111_100_001_100_1(Set<String> u, int b) => v(u, '1111000011001', b);
+
+@pragma('dart2js:noInline')
+f_111_100_001_101_1(Set<String> u, int b) => v(u, '1111000011011', b);
+
+@pragma('dart2js:noInline')
+f_111_100_001_110_1(Set<String> u, int b) => v(u, '1111000011101', b);
+
+@pragma('dart2js:noInline')
+f_111_100_001_111_1(Set<String> u, int b) => v(u, '1111000011111', b);
+
+@pragma('dart2js:noInline')
+f_111_100_010_000_1(Set<String> u, int b) => v(u, '1111000100001', b);
+
+@pragma('dart2js:noInline')
+f_111_100_010_001_1(Set<String> u, int b) => v(u, '1111000100011', b);
+
+@pragma('dart2js:noInline')
+f_111_100_010_010_1(Set<String> u, int b) => v(u, '1111000100101', b);
+
+@pragma('dart2js:noInline')
+f_111_100_010_011_1(Set<String> u, int b) => v(u, '1111000100111', b);
+
+@pragma('dart2js:noInline')
+f_111_100_010_100_1(Set<String> u, int b) => v(u, '1111000101001', b);
+
+@pragma('dart2js:noInline')
+f_111_100_010_101_1(Set<String> u, int b) => v(u, '1111000101011', b);
+
+@pragma('dart2js:noInline')
+f_111_100_010_110_1(Set<String> u, int b) => v(u, '1111000101101', b);
+
+@pragma('dart2js:noInline')
+f_111_100_010_111_1(Set<String> u, int b) => v(u, '1111000101111', b);
+
+@pragma('dart2js:noInline')
+f_111_100_011_000_1(Set<String> u, int b) => v(u, '1111000110001', b);
+
+@pragma('dart2js:noInline')
+f_111_100_011_001_1(Set<String> u, int b) => v(u, '1111000110011', b);
+
+@pragma('dart2js:noInline')
+f_111_100_011_010_1(Set<String> u, int b) => v(u, '1111000110101', b);
+
+@pragma('dart2js:noInline')
+f_111_100_011_011_1(Set<String> u, int b) => v(u, '1111000110111', b);
+
+@pragma('dart2js:noInline')
+f_111_100_011_100_1(Set<String> u, int b) => v(u, '1111000111001', b);
+
+@pragma('dart2js:noInline')
+f_111_100_011_101_1(Set<String> u, int b) => v(u, '1111000111011', b);
+
+@pragma('dart2js:noInline')
+f_111_100_011_110_1(Set<String> u, int b) => v(u, '1111000111101', b);
+
+@pragma('dart2js:noInline')
+f_111_100_011_111_1(Set<String> u, int b) => v(u, '1111000111111', b);
+
+@pragma('dart2js:noInline')
+f_111_100_100_000_1(Set<String> u, int b) => v(u, '1111001000001', b);
+
+@pragma('dart2js:noInline')
+f_111_100_100_001_1(Set<String> u, int b) => v(u, '1111001000011', b);
+
+@pragma('dart2js:noInline')
+f_111_100_100_010_1(Set<String> u, int b) => v(u, '1111001000101', b);
+
+@pragma('dart2js:noInline')
+f_111_100_100_011_1(Set<String> u, int b) => v(u, '1111001000111', b);
+
+@pragma('dart2js:noInline')
+f_111_100_100_100_1(Set<String> u, int b) => v(u, '1111001001001', b);
+
+@pragma('dart2js:noInline')
+f_111_100_100_101_1(Set<String> u, int b) => v(u, '1111001001011', b);
+
+@pragma('dart2js:noInline')
+f_111_100_100_110_1(Set<String> u, int b) => v(u, '1111001001101', b);
+
+@pragma('dart2js:noInline')
+f_111_100_100_111_1(Set<String> u, int b) => v(u, '1111001001111', b);
+
+@pragma('dart2js:noInline')
+f_111_100_101_000_1(Set<String> u, int b) => v(u, '1111001010001', b);
+
+@pragma('dart2js:noInline')
+f_111_100_101_001_1(Set<String> u, int b) => v(u, '1111001010011', b);
+
+@pragma('dart2js:noInline')
+f_111_100_101_010_1(Set<String> u, int b) => v(u, '1111001010101', b);
+
+@pragma('dart2js:noInline')
+f_111_100_101_011_1(Set<String> u, int b) => v(u, '1111001010111', b);
+
+@pragma('dart2js:noInline')
+f_111_100_101_100_1(Set<String> u, int b) => v(u, '1111001011001', b);
+
+@pragma('dart2js:noInline')
+f_111_100_101_101_1(Set<String> u, int b) => v(u, '1111001011011', b);
+
+@pragma('dart2js:noInline')
+f_111_100_101_110_1(Set<String> u, int b) => v(u, '1111001011101', b);
+
+@pragma('dart2js:noInline')
+f_111_100_101_111_1(Set<String> u, int b) => v(u, '1111001011111', b);
+
+@pragma('dart2js:noInline')
+f_111_100_110_000_1(Set<String> u, int b) => v(u, '1111001100001', b);
+
+@pragma('dart2js:noInline')
+f_111_100_110_001_1(Set<String> u, int b) => v(u, '1111001100011', b);
+
+@pragma('dart2js:noInline')
+f_111_100_110_010_1(Set<String> u, int b) => v(u, '1111001100101', b);
+
+@pragma('dart2js:noInline')
+f_111_100_110_011_1(Set<String> u, int b) => v(u, '1111001100111', b);
+
+@pragma('dart2js:noInline')
+f_111_100_110_100_1(Set<String> u, int b) => v(u, '1111001101001', b);
+
+@pragma('dart2js:noInline')
+f_111_100_110_101_1(Set<String> u, int b) => v(u, '1111001101011', b);
+
+@pragma('dart2js:noInline')
+f_111_100_110_110_1(Set<String> u, int b) => v(u, '1111001101101', b);
+
+@pragma('dart2js:noInline')
+f_111_100_110_111_1(Set<String> u, int b) => v(u, '1111001101111', b);
+
+@pragma('dart2js:noInline')
+f_111_100_111_000_1(Set<String> u, int b) => v(u, '1111001110001', b);
+
+@pragma('dart2js:noInline')
+f_111_100_111_001_1(Set<String> u, int b) => v(u, '1111001110011', b);
+
+@pragma('dart2js:noInline')
+f_111_100_111_010_1(Set<String> u, int b) => v(u, '1111001110101', b);
+
+@pragma('dart2js:noInline')
+f_111_100_111_011_1(Set<String> u, int b) => v(u, '1111001110111', b);
+
+@pragma('dart2js:noInline')
+f_111_100_111_100_1(Set<String> u, int b) => v(u, '1111001111001', b);
+
+@pragma('dart2js:noInline')
+f_111_100_111_101_1(Set<String> u, int b) => v(u, '1111001111011', b);
+
+@pragma('dart2js:noInline')
+f_111_100_111_110_1(Set<String> u, int b) => v(u, '1111001111101', b);
+
+@pragma('dart2js:noInline')
+f_111_100_111_111_1(Set<String> u, int b) => v(u, '1111001111111', b);
+
+@pragma('dart2js:noInline')
+f_111_101_000_000_1(Set<String> u, int b) => v(u, '1111010000001', b);
+
+@pragma('dart2js:noInline')
+f_111_101_000_001_1(Set<String> u, int b) => v(u, '1111010000011', b);
+
+@pragma('dart2js:noInline')
+f_111_101_000_010_1(Set<String> u, int b) => v(u, '1111010000101', b);
+
+@pragma('dart2js:noInline')
+f_111_101_000_011_1(Set<String> u, int b) => v(u, '1111010000111', b);
+
+@pragma('dart2js:noInline')
+f_111_101_000_100_1(Set<String> u, int b) => v(u, '1111010001001', b);
+
+@pragma('dart2js:noInline')
+f_111_101_000_101_1(Set<String> u, int b) => v(u, '1111010001011', b);
+
+@pragma('dart2js:noInline')
+f_111_101_000_110_1(Set<String> u, int b) => v(u, '1111010001101', b);
+
+@pragma('dart2js:noInline')
+f_111_101_000_111_1(Set<String> u, int b) => v(u, '1111010001111', b);
+
+@pragma('dart2js:noInline')
+f_111_101_001_000_1(Set<String> u, int b) => v(u, '1111010010001', b);
+
+@pragma('dart2js:noInline')
+f_111_101_001_001_1(Set<String> u, int b) => v(u, '1111010010011', b);
+
+@pragma('dart2js:noInline')
+f_111_101_001_010_1(Set<String> u, int b) => v(u, '1111010010101', b);
+
+@pragma('dart2js:noInline')
+f_111_101_001_011_1(Set<String> u, int b) => v(u, '1111010010111', b);
+
+@pragma('dart2js:noInline')
+f_111_101_001_100_1(Set<String> u, int b) => v(u, '1111010011001', b);
+
+@pragma('dart2js:noInline')
+f_111_101_001_101_1(Set<String> u, int b) => v(u, '1111010011011', b);
+
+@pragma('dart2js:noInline')
+f_111_101_001_110_1(Set<String> u, int b) => v(u, '1111010011101', b);
+
+@pragma('dart2js:noInline')
+f_111_101_001_111_1(Set<String> u, int b) => v(u, '1111010011111', b);
+
+@pragma('dart2js:noInline')
+f_111_101_010_000_1(Set<String> u, int b) => v(u, '1111010100001', b);
+
+@pragma('dart2js:noInline')
+f_111_101_010_001_1(Set<String> u, int b) => v(u, '1111010100011', b);
+
+@pragma('dart2js:noInline')
+f_111_101_010_010_1(Set<String> u, int b) => v(u, '1111010100101', b);
+
+@pragma('dart2js:noInline')
+f_111_101_010_011_1(Set<String> u, int b) => v(u, '1111010100111', b);
+
+@pragma('dart2js:noInline')
+f_111_101_010_100_1(Set<String> u, int b) => v(u, '1111010101001', b);
+
+@pragma('dart2js:noInline')
+f_111_101_010_101_1(Set<String> u, int b) => v(u, '1111010101011', b);
+
+@pragma('dart2js:noInline')
+f_111_101_010_110_1(Set<String> u, int b) => v(u, '1111010101101', b);
+
+@pragma('dart2js:noInline')
+f_111_101_010_111_1(Set<String> u, int b) => v(u, '1111010101111', b);
+
+@pragma('dart2js:noInline')
+f_111_101_011_000_1(Set<String> u, int b) => v(u, '1111010110001', b);
+
+@pragma('dart2js:noInline')
+f_111_101_011_001_1(Set<String> u, int b) => v(u, '1111010110011', b);
+
+@pragma('dart2js:noInline')
+f_111_101_011_010_1(Set<String> u, int b) => v(u, '1111010110101', b);
+
+@pragma('dart2js:noInline')
+f_111_101_011_011_1(Set<String> u, int b) => v(u, '1111010110111', b);
+
+@pragma('dart2js:noInline')
+f_111_101_011_100_1(Set<String> u, int b) => v(u, '1111010111001', b);
+
+@pragma('dart2js:noInline')
+f_111_101_011_101_1(Set<String> u, int b) => v(u, '1111010111011', b);
+
+@pragma('dart2js:noInline')
+f_111_101_011_110_1(Set<String> u, int b) => v(u, '1111010111101', b);
+
+@pragma('dart2js:noInline')
+f_111_101_011_111_1(Set<String> u, int b) => v(u, '1111010111111', b);
+
+@pragma('dart2js:noInline')
+f_111_101_100_000_1(Set<String> u, int b) => v(u, '1111011000001', b);
+
+@pragma('dart2js:noInline')
+f_111_101_100_001_1(Set<String> u, int b) => v(u, '1111011000011', b);
+
+@pragma('dart2js:noInline')
+f_111_101_100_010_1(Set<String> u, int b) => v(u, '1111011000101', b);
+
+@pragma('dart2js:noInline')
+f_111_101_100_011_1(Set<String> u, int b) => v(u, '1111011000111', b);
+
+@pragma('dart2js:noInline')
+f_111_101_100_100_1(Set<String> u, int b) => v(u, '1111011001001', b);
+
+@pragma('dart2js:noInline')
+f_111_101_100_101_1(Set<String> u, int b) => v(u, '1111011001011', b);
+
+@pragma('dart2js:noInline')
+f_111_101_100_110_1(Set<String> u, int b) => v(u, '1111011001101', b);
+
+@pragma('dart2js:noInline')
+f_111_101_100_111_1(Set<String> u, int b) => v(u, '1111011001111', b);
+
+@pragma('dart2js:noInline')
+f_111_101_101_000_1(Set<String> u, int b) => v(u, '1111011010001', b);
+
+@pragma('dart2js:noInline')
+f_111_101_101_001_1(Set<String> u, int b) => v(u, '1111011010011', b);
+
+@pragma('dart2js:noInline')
+f_111_101_101_010_1(Set<String> u, int b) => v(u, '1111011010101', b);
+
+@pragma('dart2js:noInline')
+f_111_101_101_011_1(Set<String> u, int b) => v(u, '1111011010111', b);
+
+@pragma('dart2js:noInline')
+f_111_101_101_100_1(Set<String> u, int b) => v(u, '1111011011001', b);
+
+@pragma('dart2js:noInline')
+f_111_101_101_101_1(Set<String> u, int b) => v(u, '1111011011011', b);
+
+@pragma('dart2js:noInline')
+f_111_101_101_110_1(Set<String> u, int b) => v(u, '1111011011101', b);
+
+@pragma('dart2js:noInline')
+f_111_101_101_111_1(Set<String> u, int b) => v(u, '1111011011111', b);
+
+@pragma('dart2js:noInline')
+f_111_101_110_000_1(Set<String> u, int b) => v(u, '1111011100001', b);
+
+@pragma('dart2js:noInline')
+f_111_101_110_001_1(Set<String> u, int b) => v(u, '1111011100011', b);
+
+@pragma('dart2js:noInline')
+f_111_101_110_010_1(Set<String> u, int b) => v(u, '1111011100101', b);
+
+@pragma('dart2js:noInline')
+f_111_101_110_011_1(Set<String> u, int b) => v(u, '1111011100111', b);
+
+@pragma('dart2js:noInline')
+f_111_101_110_100_1(Set<String> u, int b) => v(u, '1111011101001', b);
+
+@pragma('dart2js:noInline')
+f_111_101_110_101_1(Set<String> u, int b) => v(u, '1111011101011', b);
+
+@pragma('dart2js:noInline')
+f_111_101_110_110_1(Set<String> u, int b) => v(u, '1111011101101', b);
+
+@pragma('dart2js:noInline')
+f_111_101_110_111_1(Set<String> u, int b) => v(u, '1111011101111', b);
+
+@pragma('dart2js:noInline')
+f_111_101_111_000_1(Set<String> u, int b) => v(u, '1111011110001', b);
+
+@pragma('dart2js:noInline')
+f_111_101_111_001_1(Set<String> u, int b) => v(u, '1111011110011', b);
+
+@pragma('dart2js:noInline')
+f_111_101_111_010_1(Set<String> u, int b) => v(u, '1111011110101', b);
+
+@pragma('dart2js:noInline')
+f_111_101_111_011_1(Set<String> u, int b) => v(u, '1111011110111', b);
+
+@pragma('dart2js:noInline')
+f_111_101_111_100_1(Set<String> u, int b) => v(u, '1111011111001', b);
+
+@pragma('dart2js:noInline')
+f_111_101_111_101_1(Set<String> u, int b) => v(u, '1111011111011', b);
+
+@pragma('dart2js:noInline')
+f_111_101_111_110_1(Set<String> u, int b) => v(u, '1111011111101', b);
+
+@pragma('dart2js:noInline')
+f_111_101_111_111_1(Set<String> u, int b) => v(u, '1111011111111', b);
+
+@pragma('dart2js:noInline')
+f_111_110_000_000_1(Set<String> u, int b) => v(u, '1111100000001', b);
+
+@pragma('dart2js:noInline')
+f_111_110_000_001_1(Set<String> u, int b) => v(u, '1111100000011', b);
+
+@pragma('dart2js:noInline')
+f_111_110_000_010_1(Set<String> u, int b) => v(u, '1111100000101', b);
+
+@pragma('dart2js:noInline')
+f_111_110_000_011_1(Set<String> u, int b) => v(u, '1111100000111', b);
+
+@pragma('dart2js:noInline')
+f_111_110_000_100_1(Set<String> u, int b) => v(u, '1111100001001', b);
+
+@pragma('dart2js:noInline')
+f_111_110_000_101_1(Set<String> u, int b) => v(u, '1111100001011', b);
+
+@pragma('dart2js:noInline')
+f_111_110_000_110_1(Set<String> u, int b) => v(u, '1111100001101', b);
+
+@pragma('dart2js:noInline')
+f_111_110_000_111_1(Set<String> u, int b) => v(u, '1111100001111', b);
+
+@pragma('dart2js:noInline')
+f_111_110_001_000_1(Set<String> u, int b) => v(u, '1111100010001', b);
+
+@pragma('dart2js:noInline')
+f_111_110_001_001_1(Set<String> u, int b) => v(u, '1111100010011', b);
+
+@pragma('dart2js:noInline')
+f_111_110_001_010_1(Set<String> u, int b) => v(u, '1111100010101', b);
+
+@pragma('dart2js:noInline')
+f_111_110_001_011_1(Set<String> u, int b) => v(u, '1111100010111', b);
+
+@pragma('dart2js:noInline')
+f_111_110_001_100_1(Set<String> u, int b) => v(u, '1111100011001', b);
+
+@pragma('dart2js:noInline')
+f_111_110_001_101_1(Set<String> u, int b) => v(u, '1111100011011', b);
+
+@pragma('dart2js:noInline')
+f_111_110_001_110_1(Set<String> u, int b) => v(u, '1111100011101', b);
+
+@pragma('dart2js:noInline')
+f_111_110_001_111_1(Set<String> u, int b) => v(u, '1111100011111', b);
+
+@pragma('dart2js:noInline')
+f_111_110_010_000_1(Set<String> u, int b) => v(u, '1111100100001', b);
+
+@pragma('dart2js:noInline')
+f_111_110_010_001_1(Set<String> u, int b) => v(u, '1111100100011', b);
+
+@pragma('dart2js:noInline')
+f_111_110_010_010_1(Set<String> u, int b) => v(u, '1111100100101', b);
+
+@pragma('dart2js:noInline')
+f_111_110_010_011_1(Set<String> u, int b) => v(u, '1111100100111', b);
+
+@pragma('dart2js:noInline')
+f_111_110_010_100_1(Set<String> u, int b) => v(u, '1111100101001', b);
+
+@pragma('dart2js:noInline')
+f_111_110_010_101_1(Set<String> u, int b) => v(u, '1111100101011', b);
+
+@pragma('dart2js:noInline')
+f_111_110_010_110_1(Set<String> u, int b) => v(u, '1111100101101', b);
+
+@pragma('dart2js:noInline')
+f_111_110_010_111_1(Set<String> u, int b) => v(u, '1111100101111', b);
+
+@pragma('dart2js:noInline')
+f_111_110_011_000_1(Set<String> u, int b) => v(u, '1111100110001', b);
+
+@pragma('dart2js:noInline')
+f_111_110_011_001_1(Set<String> u, int b) => v(u, '1111100110011', b);
+
+@pragma('dart2js:noInline')
+f_111_110_011_010_1(Set<String> u, int b) => v(u, '1111100110101', b);
+
+@pragma('dart2js:noInline')
+f_111_110_011_011_1(Set<String> u, int b) => v(u, '1111100110111', b);
+
+@pragma('dart2js:noInline')
+f_111_110_011_100_1(Set<String> u, int b) => v(u, '1111100111001', b);
+
+@pragma('dart2js:noInline')
+f_111_110_011_101_1(Set<String> u, int b) => v(u, '1111100111011', b);
+
+@pragma('dart2js:noInline')
+f_111_110_011_110_1(Set<String> u, int b) => v(u, '1111100111101', b);
+
+@pragma('dart2js:noInline')
+f_111_110_011_111_1(Set<String> u, int b) => v(u, '1111100111111', b);
+
+@pragma('dart2js:noInline')
+f_111_110_100_000_1(Set<String> u, int b) => v(u, '1111101000001', b);
+
+@pragma('dart2js:noInline')
+f_111_110_100_001_1(Set<String> u, int b) => v(u, '1111101000011', b);
+
+@pragma('dart2js:noInline')
+f_111_110_100_010_1(Set<String> u, int b) => v(u, '1111101000101', b);
+
+@pragma('dart2js:noInline')
+f_111_110_100_011_1(Set<String> u, int b) => v(u, '1111101000111', b);
+
+@pragma('dart2js:noInline')
+f_111_110_100_100_1(Set<String> u, int b) => v(u, '1111101001001', b);
+
+@pragma('dart2js:noInline')
+f_111_110_100_101_1(Set<String> u, int b) => v(u, '1111101001011', b);
+
+@pragma('dart2js:noInline')
+f_111_110_100_110_1(Set<String> u, int b) => v(u, '1111101001101', b);
+
+@pragma('dart2js:noInline')
+f_111_110_100_111_1(Set<String> u, int b) => v(u, '1111101001111', b);
+
+@pragma('dart2js:noInline')
+f_111_110_101_000_1(Set<String> u, int b) => v(u, '1111101010001', b);
+
+@pragma('dart2js:noInline')
+f_111_110_101_001_1(Set<String> u, int b) => v(u, '1111101010011', b);
+
+@pragma('dart2js:noInline')
+f_111_110_101_010_1(Set<String> u, int b) => v(u, '1111101010101', b);
+
+@pragma('dart2js:noInline')
+f_111_110_101_011_1(Set<String> u, int b) => v(u, '1111101010111', b);
+
+@pragma('dart2js:noInline')
+f_111_110_101_100_1(Set<String> u, int b) => v(u, '1111101011001', b);
+
+@pragma('dart2js:noInline')
+f_111_110_101_101_1(Set<String> u, int b) => v(u, '1111101011011', b);
+
+@pragma('dart2js:noInline')
+f_111_110_101_110_1(Set<String> u, int b) => v(u, '1111101011101', b);
+
+@pragma('dart2js:noInline')
+f_111_110_101_111_1(Set<String> u, int b) => v(u, '1111101011111', b);
+
+@pragma('dart2js:noInline')
+f_111_110_110_000_1(Set<String> u, int b) => v(u, '1111101100001', b);
+
+@pragma('dart2js:noInline')
+f_111_110_110_001_1(Set<String> u, int b) => v(u, '1111101100011', b);
+
+@pragma('dart2js:noInline')
+f_111_110_110_010_1(Set<String> u, int b) => v(u, '1111101100101', b);
+
+@pragma('dart2js:noInline')
+f_111_110_110_011_1(Set<String> u, int b) => v(u, '1111101100111', b);
+
+@pragma('dart2js:noInline')
+f_111_110_110_100_1(Set<String> u, int b) => v(u, '1111101101001', b);
+
+@pragma('dart2js:noInline')
+f_111_110_110_101_1(Set<String> u, int b) => v(u, '1111101101011', b);
+
+@pragma('dart2js:noInline')
+f_111_110_110_110_1(Set<String> u, int b) => v(u, '1111101101101', b);
+
+@pragma('dart2js:noInline')
+f_111_110_110_111_1(Set<String> u, int b) => v(u, '1111101101111', b);
+
+@pragma('dart2js:noInline')
+f_111_110_111_000_1(Set<String> u, int b) => v(u, '1111101110001', b);
+
+@pragma('dart2js:noInline')
+f_111_110_111_001_1(Set<String> u, int b) => v(u, '1111101110011', b);
+
+@pragma('dart2js:noInline')
+f_111_110_111_010_1(Set<String> u, int b) => v(u, '1111101110101', b);
+
+@pragma('dart2js:noInline')
+f_111_110_111_011_1(Set<String> u, int b) => v(u, '1111101110111', b);
+
+@pragma('dart2js:noInline')
+f_111_110_111_100_1(Set<String> u, int b) => v(u, '1111101111001', b);
+
+@pragma('dart2js:noInline')
+f_111_110_111_101_1(Set<String> u, int b) => v(u, '1111101111011', b);
+
+@pragma('dart2js:noInline')
+f_111_110_111_110_1(Set<String> u, int b) => v(u, '1111101111101', b);
+
+@pragma('dart2js:noInline')
+f_111_110_111_111_1(Set<String> u, int b) => v(u, '1111101111111', b);
+
+@pragma('dart2js:noInline')
+f_111_111_000_000_1(Set<String> u, int b) => v(u, '1111110000001', b);
+
+@pragma('dart2js:noInline')
+f_111_111_000_001_1(Set<String> u, int b) => v(u, '1111110000011', b);
+
+@pragma('dart2js:noInline')
+f_111_111_000_010_1(Set<String> u, int b) => v(u, '1111110000101', b);
+
+@pragma('dart2js:noInline')
+f_111_111_000_011_1(Set<String> u, int b) => v(u, '1111110000111', b);
+
+@pragma('dart2js:noInline')
+f_111_111_000_100_1(Set<String> u, int b) => v(u, '1111110001001', b);
+
+@pragma('dart2js:noInline')
+f_111_111_000_101_1(Set<String> u, int b) => v(u, '1111110001011', b);
+
+@pragma('dart2js:noInline')
+f_111_111_000_110_1(Set<String> u, int b) => v(u, '1111110001101', b);
+
+@pragma('dart2js:noInline')
+f_111_111_000_111_1(Set<String> u, int b) => v(u, '1111110001111', b);
+
+@pragma('dart2js:noInline')
+f_111_111_001_000_1(Set<String> u, int b) => v(u, '1111110010001', b);
+
+@pragma('dart2js:noInline')
+f_111_111_001_001_1(Set<String> u, int b) => v(u, '1111110010011', b);
+
+@pragma('dart2js:noInline')
+f_111_111_001_010_1(Set<String> u, int b) => v(u, '1111110010101', b);
+
+@pragma('dart2js:noInline')
+f_111_111_001_011_1(Set<String> u, int b) => v(u, '1111110010111', b);
+
+@pragma('dart2js:noInline')
+f_111_111_001_100_1(Set<String> u, int b) => v(u, '1111110011001', b);
+
+@pragma('dart2js:noInline')
+f_111_111_001_101_1(Set<String> u, int b) => v(u, '1111110011011', b);
+
+@pragma('dart2js:noInline')
+f_111_111_001_110_1(Set<String> u, int b) => v(u, '1111110011101', b);
+
+@pragma('dart2js:noInline')
+f_111_111_001_111_1(Set<String> u, int b) => v(u, '1111110011111', b);
+
+@pragma('dart2js:noInline')
+f_111_111_010_000_1(Set<String> u, int b) => v(u, '1111110100001', b);
+
+@pragma('dart2js:noInline')
+f_111_111_010_001_1(Set<String> u, int b) => v(u, '1111110100011', b);
+
+@pragma('dart2js:noInline')
+f_111_111_010_010_1(Set<String> u, int b) => v(u, '1111110100101', b);
+
+@pragma('dart2js:noInline')
+f_111_111_010_011_1(Set<String> u, int b) => v(u, '1111110100111', b);
+
+@pragma('dart2js:noInline')
+f_111_111_010_100_1(Set<String> u, int b) => v(u, '1111110101001', b);
+
+@pragma('dart2js:noInline')
+f_111_111_010_101_1(Set<String> u, int b) => v(u, '1111110101011', b);
+
+@pragma('dart2js:noInline')
+f_111_111_010_110_1(Set<String> u, int b) => v(u, '1111110101101', b);
+
+@pragma('dart2js:noInline')
+f_111_111_010_111_1(Set<String> u, int b) => v(u, '1111110101111', b);
+
+@pragma('dart2js:noInline')
+f_111_111_011_000_1(Set<String> u, int b) => v(u, '1111110110001', b);
+
+@pragma('dart2js:noInline')
+f_111_111_011_001_1(Set<String> u, int b) => v(u, '1111110110011', b);
+
+@pragma('dart2js:noInline')
+f_111_111_011_010_1(Set<String> u, int b) => v(u, '1111110110101', b);
+
+@pragma('dart2js:noInline')
+f_111_111_011_011_1(Set<String> u, int b) => v(u, '1111110110111', b);
+
+@pragma('dart2js:noInline')
+f_111_111_011_100_1(Set<String> u, int b) => v(u, '1111110111001', b);
+
+@pragma('dart2js:noInline')
+f_111_111_011_101_1(Set<String> u, int b) => v(u, '1111110111011', b);
+
+@pragma('dart2js:noInline')
+f_111_111_011_110_1(Set<String> u, int b) => v(u, '1111110111101', b);
+
+@pragma('dart2js:noInline')
+f_111_111_011_111_1(Set<String> u, int b) => v(u, '1111110111111', b);
+
+@pragma('dart2js:noInline')
+f_111_111_100_000_1(Set<String> u, int b) => v(u, '1111111000001', b);
+
+@pragma('dart2js:noInline')
+f_111_111_100_001_1(Set<String> u, int b) => v(u, '1111111000011', b);
+
+@pragma('dart2js:noInline')
+f_111_111_100_010_1(Set<String> u, int b) => v(u, '1111111000101', b);
+
+@pragma('dart2js:noInline')
+f_111_111_100_011_1(Set<String> u, int b) => v(u, '1111111000111', b);
+
+@pragma('dart2js:noInline')
+f_111_111_100_100_1(Set<String> u, int b) => v(u, '1111111001001', b);
+
+@pragma('dart2js:noInline')
+f_111_111_100_101_1(Set<String> u, int b) => v(u, '1111111001011', b);
+
+@pragma('dart2js:noInline')
+f_111_111_100_110_1(Set<String> u, int b) => v(u, '1111111001101', b);
+
+@pragma('dart2js:noInline')
+f_111_111_100_111_1(Set<String> u, int b) => v(u, '1111111001111', b);
+
+@pragma('dart2js:noInline')
+f_111_111_101_000_1(Set<String> u, int b) => v(u, '1111111010001', b);
+
+@pragma('dart2js:noInline')
+f_111_111_101_001_1(Set<String> u, int b) => v(u, '1111111010011', b);
+
+@pragma('dart2js:noInline')
+f_111_111_101_010_1(Set<String> u, int b) => v(u, '1111111010101', b);
+
+@pragma('dart2js:noInline')
+f_111_111_101_011_1(Set<String> u, int b) => v(u, '1111111010111', b);
+
+@pragma('dart2js:noInline')
+f_111_111_101_100_1(Set<String> u, int b) => v(u, '1111111011001', b);
+
+@pragma('dart2js:noInline')
+f_111_111_101_101_1(Set<String> u, int b) => v(u, '1111111011011', b);
+
+@pragma('dart2js:noInline')
+f_111_111_101_110_1(Set<String> u, int b) => v(u, '1111111011101', b);
+
+@pragma('dart2js:noInline')
+f_111_111_101_111_1(Set<String> u, int b) => v(u, '1111111011111', b);
+
+@pragma('dart2js:noInline')
+f_111_111_110_000_1(Set<String> u, int b) => v(u, '1111111100001', b);
+
+@pragma('dart2js:noInline')
+f_111_111_110_001_1(Set<String> u, int b) => v(u, '1111111100011', b);
+
+@pragma('dart2js:noInline')
+f_111_111_110_010_1(Set<String> u, int b) => v(u, '1111111100101', b);
+
+@pragma('dart2js:noInline')
+f_111_111_110_011_1(Set<String> u, int b) => v(u, '1111111100111', b);
+
+@pragma('dart2js:noInline')
+f_111_111_110_100_1(Set<String> u, int b) => v(u, '1111111101001', b);
+
+@pragma('dart2js:noInline')
+f_111_111_110_101_1(Set<String> u, int b) => v(u, '1111111101011', b);
+
+@pragma('dart2js:noInline')
+f_111_111_110_110_1(Set<String> u, int b) => v(u, '1111111101101', b);
+
+@pragma('dart2js:noInline')
+f_111_111_110_111_1(Set<String> u, int b) => v(u, '1111111101111', b);
+
+@pragma('dart2js:noInline')
+f_111_111_111_000_1(Set<String> u, int b) => v(u, '1111111110001', b);
+
+@pragma('dart2js:noInline')
+f_111_111_111_001_1(Set<String> u, int b) => v(u, '1111111110011', b);
+
+@pragma('dart2js:noInline')
+f_111_111_111_010_1(Set<String> u, int b) => v(u, '1111111110101', b);
+
+@pragma('dart2js:noInline')
+f_111_111_111_011_1(Set<String> u, int b) => v(u, '1111111110111', b);
+
+@pragma('dart2js:noInline')
+f_111_111_111_100_1(Set<String> u, int b) => v(u, '1111111111001', b);
+
+@pragma('dart2js:noInline')
+f_111_111_111_101_1(Set<String> u, int b) => v(u, '1111111111011', b);
+
+@pragma('dart2js:noInline')
+f_111_111_111_110_1(Set<String> u, int b) => v(u, '1111111111101', b);
+
+@pragma('dart2js:noInline')
+f_111_111_111_111_1(Set<String> u, int b) => v(u, '1111111111111', b);
+
+@pragma('dart2js:noInline')
+f_000_000_000_001_0(Set<String> u, int b) => v(u, '0000000000010', b);
+
+@pragma('dart2js:noInline')
+f_000_000_000_011_0(Set<String> u, int b) => v(u, '0000000000110', b);
+
+@pragma('dart2js:noInline')
+f_000_000_000_101_0(Set<String> u, int b) => v(u, '0000000001010', b);
+
+@pragma('dart2js:noInline')
+f_000_000_000_111_0(Set<String> u, int b) => v(u, '0000000001110', b);
+
+@pragma('dart2js:noInline')
+f_000_000_001_001_0(Set<String> u, int b) => v(u, '0000000010010', b);
+
+@pragma('dart2js:noInline')
+f_000_000_001_011_0(Set<String> u, int b) => v(u, '0000000010110', b);
+
+@pragma('dart2js:noInline')
+f_000_000_001_101_0(Set<String> u, int b) => v(u, '0000000011010', b);
+
+@pragma('dart2js:noInline')
+f_000_000_001_111_0(Set<String> u, int b) => v(u, '0000000011110', b);
+
+@pragma('dart2js:noInline')
+f_000_000_010_001_0(Set<String> u, int b) => v(u, '0000000100010', b);
+
+@pragma('dart2js:noInline')
+f_000_000_010_011_0(Set<String> u, int b) => v(u, '0000000100110', b);
+
+@pragma('dart2js:noInline')
+f_000_000_010_101_0(Set<String> u, int b) => v(u, '0000000101010', b);
+
+@pragma('dart2js:noInline')
+f_000_000_010_111_0(Set<String> u, int b) => v(u, '0000000101110', b);
+
+@pragma('dart2js:noInline')
+f_000_000_011_001_0(Set<String> u, int b) => v(u, '0000000110010', b);
+
+@pragma('dart2js:noInline')
+f_000_000_011_011_0(Set<String> u, int b) => v(u, '0000000110110', b);
+
+@pragma('dart2js:noInline')
+f_000_000_011_101_0(Set<String> u, int b) => v(u, '0000000111010', b);
+
+@pragma('dart2js:noInline')
+f_000_000_011_111_0(Set<String> u, int b) => v(u, '0000000111110', b);
+
+@pragma('dart2js:noInline')
+f_000_000_100_001_0(Set<String> u, int b) => v(u, '0000001000010', b);
+
+@pragma('dart2js:noInline')
+f_000_000_100_011_0(Set<String> u, int b) => v(u, '0000001000110', b);
+
+@pragma('dart2js:noInline')
+f_000_000_100_101_0(Set<String> u, int b) => v(u, '0000001001010', b);
+
+@pragma('dart2js:noInline')
+f_000_000_100_111_0(Set<String> u, int b) => v(u, '0000001001110', b);
+
+@pragma('dart2js:noInline')
+f_000_000_101_001_0(Set<String> u, int b) => v(u, '0000001010010', b);
+
+@pragma('dart2js:noInline')
+f_000_000_101_011_0(Set<String> u, int b) => v(u, '0000001010110', b);
+
+@pragma('dart2js:noInline')
+f_000_000_101_101_0(Set<String> u, int b) => v(u, '0000001011010', b);
+
+@pragma('dart2js:noInline')
+f_000_000_101_111_0(Set<String> u, int b) => v(u, '0000001011110', b);
+
+@pragma('dart2js:noInline')
+f_000_000_110_001_0(Set<String> u, int b) => v(u, '0000001100010', b);
+
+@pragma('dart2js:noInline')
+f_000_000_110_011_0(Set<String> u, int b) => v(u, '0000001100110', b);
+
+@pragma('dart2js:noInline')
+f_000_000_110_101_0(Set<String> u, int b) => v(u, '0000001101010', b);
+
+@pragma('dart2js:noInline')
+f_000_000_110_111_0(Set<String> u, int b) => v(u, '0000001101110', b);
+
+@pragma('dart2js:noInline')
+f_000_000_111_001_0(Set<String> u, int b) => v(u, '0000001110010', b);
+
+@pragma('dart2js:noInline')
+f_000_000_111_011_0(Set<String> u, int b) => v(u, '0000001110110', b);
+
+@pragma('dart2js:noInline')
+f_000_000_111_101_0(Set<String> u, int b) => v(u, '0000001111010', b);
+
+@pragma('dart2js:noInline')
+f_000_000_111_111_0(Set<String> u, int b) => v(u, '0000001111110', b);
+
+@pragma('dart2js:noInline')
+f_000_001_000_001_0(Set<String> u, int b) => v(u, '0000010000010', b);
+
+@pragma('dart2js:noInline')
+f_000_001_000_011_0(Set<String> u, int b) => v(u, '0000010000110', b);
+
+@pragma('dart2js:noInline')
+f_000_001_000_101_0(Set<String> u, int b) => v(u, '0000010001010', b);
+
+@pragma('dart2js:noInline')
+f_000_001_000_111_0(Set<String> u, int b) => v(u, '0000010001110', b);
+
+@pragma('dart2js:noInline')
+f_000_001_001_001_0(Set<String> u, int b) => v(u, '0000010010010', b);
+
+@pragma('dart2js:noInline')
+f_000_001_001_011_0(Set<String> u, int b) => v(u, '0000010010110', b);
+
+@pragma('dart2js:noInline')
+f_000_001_001_101_0(Set<String> u, int b) => v(u, '0000010011010', b);
+
+@pragma('dart2js:noInline')
+f_000_001_001_111_0(Set<String> u, int b) => v(u, '0000010011110', b);
+
+@pragma('dart2js:noInline')
+f_000_001_010_001_0(Set<String> u, int b) => v(u, '0000010100010', b);
+
+@pragma('dart2js:noInline')
+f_000_001_010_011_0(Set<String> u, int b) => v(u, '0000010100110', b);
+
+@pragma('dart2js:noInline')
+f_000_001_010_101_0(Set<String> u, int b) => v(u, '0000010101010', b);
+
+@pragma('dart2js:noInline')
+f_000_001_010_111_0(Set<String> u, int b) => v(u, '0000010101110', b);
+
+@pragma('dart2js:noInline')
+f_000_001_011_001_0(Set<String> u, int b) => v(u, '0000010110010', b);
+
+@pragma('dart2js:noInline')
+f_000_001_011_011_0(Set<String> u, int b) => v(u, '0000010110110', b);
+
+@pragma('dart2js:noInline')
+f_000_001_011_101_0(Set<String> u, int b) => v(u, '0000010111010', b);
+
+@pragma('dart2js:noInline')
+f_000_001_011_111_0(Set<String> u, int b) => v(u, '0000010111110', b);
+
+@pragma('dart2js:noInline')
+f_000_001_100_001_0(Set<String> u, int b) => v(u, '0000011000010', b);
+
+@pragma('dart2js:noInline')
+f_000_001_100_011_0(Set<String> u, int b) => v(u, '0000011000110', b);
+
+@pragma('dart2js:noInline')
+f_000_001_100_101_0(Set<String> u, int b) => v(u, '0000011001010', b);
+
+@pragma('dart2js:noInline')
+f_000_001_100_111_0(Set<String> u, int b) => v(u, '0000011001110', b);
+
+@pragma('dart2js:noInline')
+f_000_001_101_001_0(Set<String> u, int b) => v(u, '0000011010010', b);
+
+@pragma('dart2js:noInline')
+f_000_001_101_011_0(Set<String> u, int b) => v(u, '0000011010110', b);
+
+@pragma('dart2js:noInline')
+f_000_001_101_101_0(Set<String> u, int b) => v(u, '0000011011010', b);
+
+@pragma('dart2js:noInline')
+f_000_001_101_111_0(Set<String> u, int b) => v(u, '0000011011110', b);
+
+@pragma('dart2js:noInline')
+f_000_001_110_001_0(Set<String> u, int b) => v(u, '0000011100010', b);
+
+@pragma('dart2js:noInline')
+f_000_001_110_011_0(Set<String> u, int b) => v(u, '0000011100110', b);
+
+@pragma('dart2js:noInline')
+f_000_001_110_101_0(Set<String> u, int b) => v(u, '0000011101010', b);
+
+@pragma('dart2js:noInline')
+f_000_001_110_111_0(Set<String> u, int b) => v(u, '0000011101110', b);
+
+@pragma('dart2js:noInline')
+f_000_001_111_001_0(Set<String> u, int b) => v(u, '0000011110010', b);
+
+@pragma('dart2js:noInline')
+f_000_001_111_011_0(Set<String> u, int b) => v(u, '0000011110110', b);
+
+@pragma('dart2js:noInline')
+f_000_001_111_101_0(Set<String> u, int b) => v(u, '0000011111010', b);
+
+@pragma('dart2js:noInline')
+f_000_001_111_111_0(Set<String> u, int b) => v(u, '0000011111110', b);
+
+@pragma('dart2js:noInline')
+f_000_010_000_001_0(Set<String> u, int b) => v(u, '0000100000010', b);
+
+@pragma('dart2js:noInline')
+f_000_010_000_011_0(Set<String> u, int b) => v(u, '0000100000110', b);
+
+@pragma('dart2js:noInline')
+f_000_010_000_101_0(Set<String> u, int b) => v(u, '0000100001010', b);
+
+@pragma('dart2js:noInline')
+f_000_010_000_111_0(Set<String> u, int b) => v(u, '0000100001110', b);
+
+@pragma('dart2js:noInline')
+f_000_010_001_001_0(Set<String> u, int b) => v(u, '0000100010010', b);
+
+@pragma('dart2js:noInline')
+f_000_010_001_011_0(Set<String> u, int b) => v(u, '0000100010110', b);
+
+@pragma('dart2js:noInline')
+f_000_010_001_101_0(Set<String> u, int b) => v(u, '0000100011010', b);
+
+@pragma('dart2js:noInline')
+f_000_010_001_111_0(Set<String> u, int b) => v(u, '0000100011110', b);
+
+@pragma('dart2js:noInline')
+f_000_010_010_001_0(Set<String> u, int b) => v(u, '0000100100010', b);
+
+@pragma('dart2js:noInline')
+f_000_010_010_011_0(Set<String> u, int b) => v(u, '0000100100110', b);
+
+@pragma('dart2js:noInline')
+f_000_010_010_101_0(Set<String> u, int b) => v(u, '0000100101010', b);
+
+@pragma('dart2js:noInline')
+f_000_010_010_111_0(Set<String> u, int b) => v(u, '0000100101110', b);
+
+@pragma('dart2js:noInline')
+f_000_010_011_001_0(Set<String> u, int b) => v(u, '0000100110010', b);
+
+@pragma('dart2js:noInline')
+f_000_010_011_011_0(Set<String> u, int b) => v(u, '0000100110110', b);
+
+@pragma('dart2js:noInline')
+f_000_010_011_101_0(Set<String> u, int b) => v(u, '0000100111010', b);
+
+@pragma('dart2js:noInline')
+f_000_010_011_111_0(Set<String> u, int b) => v(u, '0000100111110', b);
+
+@pragma('dart2js:noInline')
+f_000_010_100_001_0(Set<String> u, int b) => v(u, '0000101000010', b);
+
+@pragma('dart2js:noInline')
+f_000_010_100_011_0(Set<String> u, int b) => v(u, '0000101000110', b);
+
+@pragma('dart2js:noInline')
+f_000_010_100_101_0(Set<String> u, int b) => v(u, '0000101001010', b);
+
+@pragma('dart2js:noInline')
+f_000_010_100_111_0(Set<String> u, int b) => v(u, '0000101001110', b);
+
+@pragma('dart2js:noInline')
+f_000_010_101_001_0(Set<String> u, int b) => v(u, '0000101010010', b);
+
+@pragma('dart2js:noInline')
+f_000_010_101_011_0(Set<String> u, int b) => v(u, '0000101010110', b);
+
+@pragma('dart2js:noInline')
+f_000_010_101_101_0(Set<String> u, int b) => v(u, '0000101011010', b);
+
+@pragma('dart2js:noInline')
+f_000_010_101_111_0(Set<String> u, int b) => v(u, '0000101011110', b);
+
+@pragma('dart2js:noInline')
+f_000_010_110_001_0(Set<String> u, int b) => v(u, '0000101100010', b);
+
+@pragma('dart2js:noInline')
+f_000_010_110_011_0(Set<String> u, int b) => v(u, '0000101100110', b);
+
+@pragma('dart2js:noInline')
+f_000_010_110_101_0(Set<String> u, int b) => v(u, '0000101101010', b);
+
+@pragma('dart2js:noInline')
+f_000_010_110_111_0(Set<String> u, int b) => v(u, '0000101101110', b);
+
+@pragma('dart2js:noInline')
+f_000_010_111_001_0(Set<String> u, int b) => v(u, '0000101110010', b);
+
+@pragma('dart2js:noInline')
+f_000_010_111_011_0(Set<String> u, int b) => v(u, '0000101110110', b);
+
+@pragma('dart2js:noInline')
+f_000_010_111_101_0(Set<String> u, int b) => v(u, '0000101111010', b);
+
+@pragma('dart2js:noInline')
+f_000_010_111_111_0(Set<String> u, int b) => v(u, '0000101111110', b);
+
+@pragma('dart2js:noInline')
+f_000_011_000_001_0(Set<String> u, int b) => v(u, '0000110000010', b);
+
+@pragma('dart2js:noInline')
+f_000_011_000_011_0(Set<String> u, int b) => v(u, '0000110000110', b);
+
+@pragma('dart2js:noInline')
+f_000_011_000_101_0(Set<String> u, int b) => v(u, '0000110001010', b);
+
+@pragma('dart2js:noInline')
+f_000_011_000_111_0(Set<String> u, int b) => v(u, '0000110001110', b);
+
+@pragma('dart2js:noInline')
+f_000_011_001_001_0(Set<String> u, int b) => v(u, '0000110010010', b);
+
+@pragma('dart2js:noInline')
+f_000_011_001_011_0(Set<String> u, int b) => v(u, '0000110010110', b);
+
+@pragma('dart2js:noInline')
+f_000_011_001_101_0(Set<String> u, int b) => v(u, '0000110011010', b);
+
+@pragma('dart2js:noInline')
+f_000_011_001_111_0(Set<String> u, int b) => v(u, '0000110011110', b);
+
+@pragma('dart2js:noInline')
+f_000_011_010_001_0(Set<String> u, int b) => v(u, '0000110100010', b);
+
+@pragma('dart2js:noInline')
+f_000_011_010_011_0(Set<String> u, int b) => v(u, '0000110100110', b);
+
+@pragma('dart2js:noInline')
+f_000_011_010_101_0(Set<String> u, int b) => v(u, '0000110101010', b);
+
+@pragma('dart2js:noInline')
+f_000_011_010_111_0(Set<String> u, int b) => v(u, '0000110101110', b);
+
+@pragma('dart2js:noInline')
+f_000_011_011_001_0(Set<String> u, int b) => v(u, '0000110110010', b);
+
+@pragma('dart2js:noInline')
+f_000_011_011_011_0(Set<String> u, int b) => v(u, '0000110110110', b);
+
+@pragma('dart2js:noInline')
+f_000_011_011_101_0(Set<String> u, int b) => v(u, '0000110111010', b);
+
+@pragma('dart2js:noInline')
+f_000_011_011_111_0(Set<String> u, int b) => v(u, '0000110111110', b);
+
+@pragma('dart2js:noInline')
+f_000_011_100_001_0(Set<String> u, int b) => v(u, '0000111000010', b);
+
+@pragma('dart2js:noInline')
+f_000_011_100_011_0(Set<String> u, int b) => v(u, '0000111000110', b);
+
+@pragma('dart2js:noInline')
+f_000_011_100_101_0(Set<String> u, int b) => v(u, '0000111001010', b);
+
+@pragma('dart2js:noInline')
+f_000_011_100_111_0(Set<String> u, int b) => v(u, '0000111001110', b);
+
+@pragma('dart2js:noInline')
+f_000_011_101_001_0(Set<String> u, int b) => v(u, '0000111010010', b);
+
+@pragma('dart2js:noInline')
+f_000_011_101_011_0(Set<String> u, int b) => v(u, '0000111010110', b);
+
+@pragma('dart2js:noInline')
+f_000_011_101_101_0(Set<String> u, int b) => v(u, '0000111011010', b);
+
+@pragma('dart2js:noInline')
+f_000_011_101_111_0(Set<String> u, int b) => v(u, '0000111011110', b);
+
+@pragma('dart2js:noInline')
+f_000_011_110_001_0(Set<String> u, int b) => v(u, '0000111100010', b);
+
+@pragma('dart2js:noInline')
+f_000_011_110_011_0(Set<String> u, int b) => v(u, '0000111100110', b);
+
+@pragma('dart2js:noInline')
+f_000_011_110_101_0(Set<String> u, int b) => v(u, '0000111101010', b);
+
+@pragma('dart2js:noInline')
+f_000_011_110_111_0(Set<String> u, int b) => v(u, '0000111101110', b);
+
+@pragma('dart2js:noInline')
+f_000_011_111_001_0(Set<String> u, int b) => v(u, '0000111110010', b);
+
+@pragma('dart2js:noInline')
+f_000_011_111_011_0(Set<String> u, int b) => v(u, '0000111110110', b);
+
+@pragma('dart2js:noInline')
+f_000_011_111_101_0(Set<String> u, int b) => v(u, '0000111111010', b);
+
+@pragma('dart2js:noInline')
+f_000_011_111_111_0(Set<String> u, int b) => v(u, '0000111111110', b);
+
+@pragma('dart2js:noInline')
+f_000_100_000_001_0(Set<String> u, int b) => v(u, '0001000000010', b);
+
+@pragma('dart2js:noInline')
+f_000_100_000_011_0(Set<String> u, int b) => v(u, '0001000000110', b);
+
+@pragma('dart2js:noInline')
+f_000_100_000_101_0(Set<String> u, int b) => v(u, '0001000001010', b);
+
+@pragma('dart2js:noInline')
+f_000_100_000_111_0(Set<String> u, int b) => v(u, '0001000001110', b);
+
+@pragma('dart2js:noInline')
+f_000_100_001_001_0(Set<String> u, int b) => v(u, '0001000010010', b);
+
+@pragma('dart2js:noInline')
+f_000_100_001_011_0(Set<String> u, int b) => v(u, '0001000010110', b);
+
+@pragma('dart2js:noInline')
+f_000_100_001_101_0(Set<String> u, int b) => v(u, '0001000011010', b);
+
+@pragma('dart2js:noInline')
+f_000_100_001_111_0(Set<String> u, int b) => v(u, '0001000011110', b);
+
+@pragma('dart2js:noInline')
+f_000_100_010_001_0(Set<String> u, int b) => v(u, '0001000100010', b);
+
+@pragma('dart2js:noInline')
+f_000_100_010_011_0(Set<String> u, int b) => v(u, '0001000100110', b);
+
+@pragma('dart2js:noInline')
+f_000_100_010_101_0(Set<String> u, int b) => v(u, '0001000101010', b);
+
+@pragma('dart2js:noInline')
+f_000_100_010_111_0(Set<String> u, int b) => v(u, '0001000101110', b);
+
+@pragma('dart2js:noInline')
+f_000_100_011_001_0(Set<String> u, int b) => v(u, '0001000110010', b);
+
+@pragma('dart2js:noInline')
+f_000_100_011_011_0(Set<String> u, int b) => v(u, '0001000110110', b);
+
+@pragma('dart2js:noInline')
+f_000_100_011_101_0(Set<String> u, int b) => v(u, '0001000111010', b);
+
+@pragma('dart2js:noInline')
+f_000_100_011_111_0(Set<String> u, int b) => v(u, '0001000111110', b);
+
+@pragma('dart2js:noInline')
+f_000_100_100_001_0(Set<String> u, int b) => v(u, '0001001000010', b);
+
+@pragma('dart2js:noInline')
+f_000_100_100_011_0(Set<String> u, int b) => v(u, '0001001000110', b);
+
+@pragma('dart2js:noInline')
+f_000_100_100_101_0(Set<String> u, int b) => v(u, '0001001001010', b);
+
+@pragma('dart2js:noInline')
+f_000_100_100_111_0(Set<String> u, int b) => v(u, '0001001001110', b);
+
+@pragma('dart2js:noInline')
+f_000_100_101_001_0(Set<String> u, int b) => v(u, '0001001010010', b);
+
+@pragma('dart2js:noInline')
+f_000_100_101_011_0(Set<String> u, int b) => v(u, '0001001010110', b);
+
+@pragma('dart2js:noInline')
+f_000_100_101_101_0(Set<String> u, int b) => v(u, '0001001011010', b);
+
+@pragma('dart2js:noInline')
+f_000_100_101_111_0(Set<String> u, int b) => v(u, '0001001011110', b);
+
+@pragma('dart2js:noInline')
+f_000_100_110_001_0(Set<String> u, int b) => v(u, '0001001100010', b);
+
+@pragma('dart2js:noInline')
+f_000_100_110_011_0(Set<String> u, int b) => v(u, '0001001100110', b);
+
+@pragma('dart2js:noInline')
+f_000_100_110_101_0(Set<String> u, int b) => v(u, '0001001101010', b);
+
+@pragma('dart2js:noInline')
+f_000_100_110_111_0(Set<String> u, int b) => v(u, '0001001101110', b);
+
+@pragma('dart2js:noInline')
+f_000_100_111_001_0(Set<String> u, int b) => v(u, '0001001110010', b);
+
+@pragma('dart2js:noInline')
+f_000_100_111_011_0(Set<String> u, int b) => v(u, '0001001110110', b);
+
+@pragma('dart2js:noInline')
+f_000_100_111_101_0(Set<String> u, int b) => v(u, '0001001111010', b);
+
+@pragma('dart2js:noInline')
+f_000_100_111_111_0(Set<String> u, int b) => v(u, '0001001111110', b);
+
+@pragma('dart2js:noInline')
+f_000_101_000_001_0(Set<String> u, int b) => v(u, '0001010000010', b);
+
+@pragma('dart2js:noInline')
+f_000_101_000_011_0(Set<String> u, int b) => v(u, '0001010000110', b);
+
+@pragma('dart2js:noInline')
+f_000_101_000_101_0(Set<String> u, int b) => v(u, '0001010001010', b);
+
+@pragma('dart2js:noInline')
+f_000_101_000_111_0(Set<String> u, int b) => v(u, '0001010001110', b);
+
+@pragma('dart2js:noInline')
+f_000_101_001_001_0(Set<String> u, int b) => v(u, '0001010010010', b);
+
+@pragma('dart2js:noInline')
+f_000_101_001_011_0(Set<String> u, int b) => v(u, '0001010010110', b);
+
+@pragma('dart2js:noInline')
+f_000_101_001_101_0(Set<String> u, int b) => v(u, '0001010011010', b);
+
+@pragma('dart2js:noInline')
+f_000_101_001_111_0(Set<String> u, int b) => v(u, '0001010011110', b);
+
+@pragma('dart2js:noInline')
+f_000_101_010_001_0(Set<String> u, int b) => v(u, '0001010100010', b);
+
+@pragma('dart2js:noInline')
+f_000_101_010_011_0(Set<String> u, int b) => v(u, '0001010100110', b);
+
+@pragma('dart2js:noInline')
+f_000_101_010_101_0(Set<String> u, int b) => v(u, '0001010101010', b);
+
+@pragma('dart2js:noInline')
+f_000_101_010_111_0(Set<String> u, int b) => v(u, '0001010101110', b);
+
+@pragma('dart2js:noInline')
+f_000_101_011_001_0(Set<String> u, int b) => v(u, '0001010110010', b);
+
+@pragma('dart2js:noInline')
+f_000_101_011_011_0(Set<String> u, int b) => v(u, '0001010110110', b);
+
+@pragma('dart2js:noInline')
+f_000_101_011_101_0(Set<String> u, int b) => v(u, '0001010111010', b);
+
+@pragma('dart2js:noInline')
+f_000_101_011_111_0(Set<String> u, int b) => v(u, '0001010111110', b);
+
+@pragma('dart2js:noInline')
+f_000_101_100_001_0(Set<String> u, int b) => v(u, '0001011000010', b);
+
+@pragma('dart2js:noInline')
+f_000_101_100_011_0(Set<String> u, int b) => v(u, '0001011000110', b);
+
+@pragma('dart2js:noInline')
+f_000_101_100_101_0(Set<String> u, int b) => v(u, '0001011001010', b);
+
+@pragma('dart2js:noInline')
+f_000_101_100_111_0(Set<String> u, int b) => v(u, '0001011001110', b);
+
+@pragma('dart2js:noInline')
+f_000_101_101_001_0(Set<String> u, int b) => v(u, '0001011010010', b);
+
+@pragma('dart2js:noInline')
+f_000_101_101_011_0(Set<String> u, int b) => v(u, '0001011010110', b);
+
+@pragma('dart2js:noInline')
+f_000_101_101_101_0(Set<String> u, int b) => v(u, '0001011011010', b);
+
+@pragma('dart2js:noInline')
+f_000_101_101_111_0(Set<String> u, int b) => v(u, '0001011011110', b);
+
+@pragma('dart2js:noInline')
+f_000_101_110_001_0(Set<String> u, int b) => v(u, '0001011100010', b);
+
+@pragma('dart2js:noInline')
+f_000_101_110_011_0(Set<String> u, int b) => v(u, '0001011100110', b);
+
+@pragma('dart2js:noInline')
+f_000_101_110_101_0(Set<String> u, int b) => v(u, '0001011101010', b);
+
+@pragma('dart2js:noInline')
+f_000_101_110_111_0(Set<String> u, int b) => v(u, '0001011101110', b);
+
+@pragma('dart2js:noInline')
+f_000_101_111_001_0(Set<String> u, int b) => v(u, '0001011110010', b);
+
+@pragma('dart2js:noInline')
+f_000_101_111_011_0(Set<String> u, int b) => v(u, '0001011110110', b);
+
+@pragma('dart2js:noInline')
+f_000_101_111_101_0(Set<String> u, int b) => v(u, '0001011111010', b);
+
+@pragma('dart2js:noInline')
+f_000_101_111_111_0(Set<String> u, int b) => v(u, '0001011111110', b);
+
+@pragma('dart2js:noInline')
+f_000_110_000_001_0(Set<String> u, int b) => v(u, '0001100000010', b);
+
+@pragma('dart2js:noInline')
+f_000_110_000_011_0(Set<String> u, int b) => v(u, '0001100000110', b);
+
+@pragma('dart2js:noInline')
+f_000_110_000_101_0(Set<String> u, int b) => v(u, '0001100001010', b);
+
+@pragma('dart2js:noInline')
+f_000_110_000_111_0(Set<String> u, int b) => v(u, '0001100001110', b);
+
+@pragma('dart2js:noInline')
+f_000_110_001_001_0(Set<String> u, int b) => v(u, '0001100010010', b);
+
+@pragma('dart2js:noInline')
+f_000_110_001_011_0(Set<String> u, int b) => v(u, '0001100010110', b);
+
+@pragma('dart2js:noInline')
+f_000_110_001_101_0(Set<String> u, int b) => v(u, '0001100011010', b);
+
+@pragma('dart2js:noInline')
+f_000_110_001_111_0(Set<String> u, int b) => v(u, '0001100011110', b);
+
+@pragma('dart2js:noInline')
+f_000_110_010_001_0(Set<String> u, int b) => v(u, '0001100100010', b);
+
+@pragma('dart2js:noInline')
+f_000_110_010_011_0(Set<String> u, int b) => v(u, '0001100100110', b);
+
+@pragma('dart2js:noInline')
+f_000_110_010_101_0(Set<String> u, int b) => v(u, '0001100101010', b);
+
+@pragma('dart2js:noInline')
+f_000_110_010_111_0(Set<String> u, int b) => v(u, '0001100101110', b);
+
+@pragma('dart2js:noInline')
+f_000_110_011_001_0(Set<String> u, int b) => v(u, '0001100110010', b);
+
+@pragma('dart2js:noInline')
+f_000_110_011_011_0(Set<String> u, int b) => v(u, '0001100110110', b);
+
+@pragma('dart2js:noInline')
+f_000_110_011_101_0(Set<String> u, int b) => v(u, '0001100111010', b);
+
+@pragma('dart2js:noInline')
+f_000_110_011_111_0(Set<String> u, int b) => v(u, '0001100111110', b);
+
+@pragma('dart2js:noInline')
+f_000_110_100_001_0(Set<String> u, int b) => v(u, '0001101000010', b);
+
+@pragma('dart2js:noInline')
+f_000_110_100_011_0(Set<String> u, int b) => v(u, '0001101000110', b);
+
+@pragma('dart2js:noInline')
+f_000_110_100_101_0(Set<String> u, int b) => v(u, '0001101001010', b);
+
+@pragma('dart2js:noInline')
+f_000_110_100_111_0(Set<String> u, int b) => v(u, '0001101001110', b);
+
+@pragma('dart2js:noInline')
+f_000_110_101_001_0(Set<String> u, int b) => v(u, '0001101010010', b);
+
+@pragma('dart2js:noInline')
+f_000_110_101_011_0(Set<String> u, int b) => v(u, '0001101010110', b);
+
+@pragma('dart2js:noInline')
+f_000_110_101_101_0(Set<String> u, int b) => v(u, '0001101011010', b);
+
+@pragma('dart2js:noInline')
+f_000_110_101_111_0(Set<String> u, int b) => v(u, '0001101011110', b);
+
+@pragma('dart2js:noInline')
+f_000_110_110_001_0(Set<String> u, int b) => v(u, '0001101100010', b);
+
+@pragma('dart2js:noInline')
+f_000_110_110_011_0(Set<String> u, int b) => v(u, '0001101100110', b);
+
+@pragma('dart2js:noInline')
+f_000_110_110_101_0(Set<String> u, int b) => v(u, '0001101101010', b);
+
+@pragma('dart2js:noInline')
+f_000_110_110_111_0(Set<String> u, int b) => v(u, '0001101101110', b);
+
+@pragma('dart2js:noInline')
+f_000_110_111_001_0(Set<String> u, int b) => v(u, '0001101110010', b);
+
+@pragma('dart2js:noInline')
+f_000_110_111_011_0(Set<String> u, int b) => v(u, '0001101110110', b);
+
+@pragma('dart2js:noInline')
+f_000_110_111_101_0(Set<String> u, int b) => v(u, '0001101111010', b);
+
+@pragma('dart2js:noInline')
+f_000_110_111_111_0(Set<String> u, int b) => v(u, '0001101111110', b);
+
+@pragma('dart2js:noInline')
+f_000_111_000_001_0(Set<String> u, int b) => v(u, '0001110000010', b);
+
+@pragma('dart2js:noInline')
+f_000_111_000_011_0(Set<String> u, int b) => v(u, '0001110000110', b);
+
+@pragma('dart2js:noInline')
+f_000_111_000_101_0(Set<String> u, int b) => v(u, '0001110001010', b);
+
+@pragma('dart2js:noInline')
+f_000_111_000_111_0(Set<String> u, int b) => v(u, '0001110001110', b);
+
+@pragma('dart2js:noInline')
+f_000_111_001_001_0(Set<String> u, int b) => v(u, '0001110010010', b);
+
+@pragma('dart2js:noInline')
+f_000_111_001_011_0(Set<String> u, int b) => v(u, '0001110010110', b);
+
+@pragma('dart2js:noInline')
+f_000_111_001_101_0(Set<String> u, int b) => v(u, '0001110011010', b);
+
+@pragma('dart2js:noInline')
+f_000_111_001_111_0(Set<String> u, int b) => v(u, '0001110011110', b);
+
+@pragma('dart2js:noInline')
+f_000_111_010_001_0(Set<String> u, int b) => v(u, '0001110100010', b);
+
+@pragma('dart2js:noInline')
+f_000_111_010_011_0(Set<String> u, int b) => v(u, '0001110100110', b);
+
+@pragma('dart2js:noInline')
+f_000_111_010_101_0(Set<String> u, int b) => v(u, '0001110101010', b);
+
+@pragma('dart2js:noInline')
+f_000_111_010_111_0(Set<String> u, int b) => v(u, '0001110101110', b);
+
+@pragma('dart2js:noInline')
+f_000_111_011_001_0(Set<String> u, int b) => v(u, '0001110110010', b);
+
+@pragma('dart2js:noInline')
+f_000_111_011_011_0(Set<String> u, int b) => v(u, '0001110110110', b);
+
+@pragma('dart2js:noInline')
+f_000_111_011_101_0(Set<String> u, int b) => v(u, '0001110111010', b);
+
+@pragma('dart2js:noInline')
+f_000_111_011_111_0(Set<String> u, int b) => v(u, '0001110111110', b);
+
+@pragma('dart2js:noInline')
+f_000_111_100_001_0(Set<String> u, int b) => v(u, '0001111000010', b);
+
+@pragma('dart2js:noInline')
+f_000_111_100_011_0(Set<String> u, int b) => v(u, '0001111000110', b);
+
+@pragma('dart2js:noInline')
+f_000_111_100_101_0(Set<String> u, int b) => v(u, '0001111001010', b);
+
+@pragma('dart2js:noInline')
+f_000_111_100_111_0(Set<String> u, int b) => v(u, '0001111001110', b);
+
+@pragma('dart2js:noInline')
+f_000_111_101_001_0(Set<String> u, int b) => v(u, '0001111010010', b);
+
+@pragma('dart2js:noInline')
+f_000_111_101_011_0(Set<String> u, int b) => v(u, '0001111010110', b);
+
+@pragma('dart2js:noInline')
+f_000_111_101_101_0(Set<String> u, int b) => v(u, '0001111011010', b);
+
+@pragma('dart2js:noInline')
+f_000_111_101_111_0(Set<String> u, int b) => v(u, '0001111011110', b);
+
+@pragma('dart2js:noInline')
+f_000_111_110_001_0(Set<String> u, int b) => v(u, '0001111100010', b);
+
+@pragma('dart2js:noInline')
+f_000_111_110_011_0(Set<String> u, int b) => v(u, '0001111100110', b);
+
+@pragma('dart2js:noInline')
+f_000_111_110_101_0(Set<String> u, int b) => v(u, '0001111101010', b);
+
+@pragma('dart2js:noInline')
+f_000_111_110_111_0(Set<String> u, int b) => v(u, '0001111101110', b);
+
+@pragma('dart2js:noInline')
+f_000_111_111_001_0(Set<String> u, int b) => v(u, '0001111110010', b);
+
+@pragma('dart2js:noInline')
+f_000_111_111_011_0(Set<String> u, int b) => v(u, '0001111110110', b);
+
+@pragma('dart2js:noInline')
+f_000_111_111_101_0(Set<String> u, int b) => v(u, '0001111111010', b);
+
+@pragma('dart2js:noInline')
+f_000_111_111_111_0(Set<String> u, int b) => v(u, '0001111111110', b);
+
+@pragma('dart2js:noInline')
+f_001_000_000_001_0(Set<String> u, int b) => v(u, '0010000000010', b);
+
+@pragma('dart2js:noInline')
+f_001_000_000_011_0(Set<String> u, int b) => v(u, '0010000000110', b);
+
+@pragma('dart2js:noInline')
+f_001_000_000_101_0(Set<String> u, int b) => v(u, '0010000001010', b);
+
+@pragma('dart2js:noInline')
+f_001_000_000_111_0(Set<String> u, int b) => v(u, '0010000001110', b);
+
+@pragma('dart2js:noInline')
+f_001_000_001_001_0(Set<String> u, int b) => v(u, '0010000010010', b);
+
+@pragma('dart2js:noInline')
+f_001_000_001_011_0(Set<String> u, int b) => v(u, '0010000010110', b);
+
+@pragma('dart2js:noInline')
+f_001_000_001_101_0(Set<String> u, int b) => v(u, '0010000011010', b);
+
+@pragma('dart2js:noInline')
+f_001_000_001_111_0(Set<String> u, int b) => v(u, '0010000011110', b);
+
+@pragma('dart2js:noInline')
+f_001_000_010_001_0(Set<String> u, int b) => v(u, '0010000100010', b);
+
+@pragma('dart2js:noInline')
+f_001_000_010_011_0(Set<String> u, int b) => v(u, '0010000100110', b);
+
+@pragma('dart2js:noInline')
+f_001_000_010_101_0(Set<String> u, int b) => v(u, '0010000101010', b);
+
+@pragma('dart2js:noInline')
+f_001_000_010_111_0(Set<String> u, int b) => v(u, '0010000101110', b);
+
+@pragma('dart2js:noInline')
+f_001_000_011_001_0(Set<String> u, int b) => v(u, '0010000110010', b);
+
+@pragma('dart2js:noInline')
+f_001_000_011_011_0(Set<String> u, int b) => v(u, '0010000110110', b);
+
+@pragma('dart2js:noInline')
+f_001_000_011_101_0(Set<String> u, int b) => v(u, '0010000111010', b);
+
+@pragma('dart2js:noInline')
+f_001_000_011_111_0(Set<String> u, int b) => v(u, '0010000111110', b);
+
+@pragma('dart2js:noInline')
+f_001_000_100_001_0(Set<String> u, int b) => v(u, '0010001000010', b);
+
+@pragma('dart2js:noInline')
+f_001_000_100_011_0(Set<String> u, int b) => v(u, '0010001000110', b);
+
+@pragma('dart2js:noInline')
+f_001_000_100_101_0(Set<String> u, int b) => v(u, '0010001001010', b);
+
+@pragma('dart2js:noInline')
+f_001_000_100_111_0(Set<String> u, int b) => v(u, '0010001001110', b);
+
+@pragma('dart2js:noInline')
+f_001_000_101_001_0(Set<String> u, int b) => v(u, '0010001010010', b);
+
+@pragma('dart2js:noInline')
+f_001_000_101_011_0(Set<String> u, int b) => v(u, '0010001010110', b);
+
+@pragma('dart2js:noInline')
+f_001_000_101_101_0(Set<String> u, int b) => v(u, '0010001011010', b);
+
+@pragma('dart2js:noInline')
+f_001_000_101_111_0(Set<String> u, int b) => v(u, '0010001011110', b);
+
+@pragma('dart2js:noInline')
+f_001_000_110_001_0(Set<String> u, int b) => v(u, '0010001100010', b);
+
+@pragma('dart2js:noInline')
+f_001_000_110_011_0(Set<String> u, int b) => v(u, '0010001100110', b);
+
+@pragma('dart2js:noInline')
+f_001_000_110_101_0(Set<String> u, int b) => v(u, '0010001101010', b);
+
+@pragma('dart2js:noInline')
+f_001_000_110_111_0(Set<String> u, int b) => v(u, '0010001101110', b);
+
+@pragma('dart2js:noInline')
+f_001_000_111_001_0(Set<String> u, int b) => v(u, '0010001110010', b);
+
+@pragma('dart2js:noInline')
+f_001_000_111_011_0(Set<String> u, int b) => v(u, '0010001110110', b);
+
+@pragma('dart2js:noInline')
+f_001_000_111_101_0(Set<String> u, int b) => v(u, '0010001111010', b);
+
+@pragma('dart2js:noInline')
+f_001_000_111_111_0(Set<String> u, int b) => v(u, '0010001111110', b);
+
+@pragma('dart2js:noInline')
+f_001_001_000_001_0(Set<String> u, int b) => v(u, '0010010000010', b);
+
+@pragma('dart2js:noInline')
+f_001_001_000_011_0(Set<String> u, int b) => v(u, '0010010000110', b);
+
+@pragma('dart2js:noInline')
+f_001_001_000_101_0(Set<String> u, int b) => v(u, '0010010001010', b);
+
+@pragma('dart2js:noInline')
+f_001_001_000_111_0(Set<String> u, int b) => v(u, '0010010001110', b);
+
+@pragma('dart2js:noInline')
+f_001_001_001_001_0(Set<String> u, int b) => v(u, '0010010010010', b);
+
+@pragma('dart2js:noInline')
+f_001_001_001_011_0(Set<String> u, int b) => v(u, '0010010010110', b);
+
+@pragma('dart2js:noInline')
+f_001_001_001_101_0(Set<String> u, int b) => v(u, '0010010011010', b);
+
+@pragma('dart2js:noInline')
+f_001_001_001_111_0(Set<String> u, int b) => v(u, '0010010011110', b);
+
+@pragma('dart2js:noInline')
+f_001_001_010_001_0(Set<String> u, int b) => v(u, '0010010100010', b);
+
+@pragma('dart2js:noInline')
+f_001_001_010_011_0(Set<String> u, int b) => v(u, '0010010100110', b);
+
+@pragma('dart2js:noInline')
+f_001_001_010_101_0(Set<String> u, int b) => v(u, '0010010101010', b);
+
+@pragma('dart2js:noInline')
+f_001_001_010_111_0(Set<String> u, int b) => v(u, '0010010101110', b);
+
+@pragma('dart2js:noInline')
+f_001_001_011_001_0(Set<String> u, int b) => v(u, '0010010110010', b);
+
+@pragma('dart2js:noInline')
+f_001_001_011_011_0(Set<String> u, int b) => v(u, '0010010110110', b);
+
+@pragma('dart2js:noInline')
+f_001_001_011_101_0(Set<String> u, int b) => v(u, '0010010111010', b);
+
+@pragma('dart2js:noInline')
+f_001_001_011_111_0(Set<String> u, int b) => v(u, '0010010111110', b);
+
+@pragma('dart2js:noInline')
+f_001_001_100_001_0(Set<String> u, int b) => v(u, '0010011000010', b);
+
+@pragma('dart2js:noInline')
+f_001_001_100_011_0(Set<String> u, int b) => v(u, '0010011000110', b);
+
+@pragma('dart2js:noInline')
+f_001_001_100_101_0(Set<String> u, int b) => v(u, '0010011001010', b);
+
+@pragma('dart2js:noInline')
+f_001_001_100_111_0(Set<String> u, int b) => v(u, '0010011001110', b);
+
+@pragma('dart2js:noInline')
+f_001_001_101_001_0(Set<String> u, int b) => v(u, '0010011010010', b);
+
+@pragma('dart2js:noInline')
+f_001_001_101_011_0(Set<String> u, int b) => v(u, '0010011010110', b);
+
+@pragma('dart2js:noInline')
+f_001_001_101_101_0(Set<String> u, int b) => v(u, '0010011011010', b);
+
+@pragma('dart2js:noInline')
+f_001_001_101_111_0(Set<String> u, int b) => v(u, '0010011011110', b);
+
+@pragma('dart2js:noInline')
+f_001_001_110_001_0(Set<String> u, int b) => v(u, '0010011100010', b);
+
+@pragma('dart2js:noInline')
+f_001_001_110_011_0(Set<String> u, int b) => v(u, '0010011100110', b);
+
+@pragma('dart2js:noInline')
+f_001_001_110_101_0(Set<String> u, int b) => v(u, '0010011101010', b);
+
+@pragma('dart2js:noInline')
+f_001_001_110_111_0(Set<String> u, int b) => v(u, '0010011101110', b);
+
+@pragma('dart2js:noInline')
+f_001_001_111_001_0(Set<String> u, int b) => v(u, '0010011110010', b);
+
+@pragma('dart2js:noInline')
+f_001_001_111_011_0(Set<String> u, int b) => v(u, '0010011110110', b);
+
+@pragma('dart2js:noInline')
+f_001_001_111_101_0(Set<String> u, int b) => v(u, '0010011111010', b);
+
+@pragma('dart2js:noInline')
+f_001_001_111_111_0(Set<String> u, int b) => v(u, '0010011111110', b);
+
+@pragma('dart2js:noInline')
+f_001_010_000_001_0(Set<String> u, int b) => v(u, '0010100000010', b);
+
+@pragma('dart2js:noInline')
+f_001_010_000_011_0(Set<String> u, int b) => v(u, '0010100000110', b);
+
+@pragma('dart2js:noInline')
+f_001_010_000_101_0(Set<String> u, int b) => v(u, '0010100001010', b);
+
+@pragma('dart2js:noInline')
+f_001_010_000_111_0(Set<String> u, int b) => v(u, '0010100001110', b);
+
+@pragma('dart2js:noInline')
+f_001_010_001_001_0(Set<String> u, int b) => v(u, '0010100010010', b);
+
+@pragma('dart2js:noInline')
+f_001_010_001_011_0(Set<String> u, int b) => v(u, '0010100010110', b);
+
+@pragma('dart2js:noInline')
+f_001_010_001_101_0(Set<String> u, int b) => v(u, '0010100011010', b);
+
+@pragma('dart2js:noInline')
+f_001_010_001_111_0(Set<String> u, int b) => v(u, '0010100011110', b);
+
+@pragma('dart2js:noInline')
+f_001_010_010_001_0(Set<String> u, int b) => v(u, '0010100100010', b);
+
+@pragma('dart2js:noInline')
+f_001_010_010_011_0(Set<String> u, int b) => v(u, '0010100100110', b);
+
+@pragma('dart2js:noInline')
+f_001_010_010_101_0(Set<String> u, int b) => v(u, '0010100101010', b);
+
+@pragma('dart2js:noInline')
+f_001_010_010_111_0(Set<String> u, int b) => v(u, '0010100101110', b);
+
+@pragma('dart2js:noInline')
+f_001_010_011_001_0(Set<String> u, int b) => v(u, '0010100110010', b);
+
+@pragma('dart2js:noInline')
+f_001_010_011_011_0(Set<String> u, int b) => v(u, '0010100110110', b);
+
+@pragma('dart2js:noInline')
+f_001_010_011_101_0(Set<String> u, int b) => v(u, '0010100111010', b);
+
+@pragma('dart2js:noInline')
+f_001_010_011_111_0(Set<String> u, int b) => v(u, '0010100111110', b);
+
+@pragma('dart2js:noInline')
+f_001_010_100_001_0(Set<String> u, int b) => v(u, '0010101000010', b);
+
+@pragma('dart2js:noInline')
+f_001_010_100_011_0(Set<String> u, int b) => v(u, '0010101000110', b);
+
+@pragma('dart2js:noInline')
+f_001_010_100_101_0(Set<String> u, int b) => v(u, '0010101001010', b);
+
+@pragma('dart2js:noInline')
+f_001_010_100_111_0(Set<String> u, int b) => v(u, '0010101001110', b);
+
+@pragma('dart2js:noInline')
+f_001_010_101_001_0(Set<String> u, int b) => v(u, '0010101010010', b);
+
+@pragma('dart2js:noInline')
+f_001_010_101_011_0(Set<String> u, int b) => v(u, '0010101010110', b);
+
+@pragma('dart2js:noInline')
+f_001_010_101_101_0(Set<String> u, int b) => v(u, '0010101011010', b);
+
+@pragma('dart2js:noInline')
+f_001_010_101_111_0(Set<String> u, int b) => v(u, '0010101011110', b);
+
+@pragma('dart2js:noInline')
+f_001_010_110_001_0(Set<String> u, int b) => v(u, '0010101100010', b);
+
+@pragma('dart2js:noInline')
+f_001_010_110_011_0(Set<String> u, int b) => v(u, '0010101100110', b);
+
+@pragma('dart2js:noInline')
+f_001_010_110_101_0(Set<String> u, int b) => v(u, '0010101101010', b);
+
+@pragma('dart2js:noInline')
+f_001_010_110_111_0(Set<String> u, int b) => v(u, '0010101101110', b);
+
+@pragma('dart2js:noInline')
+f_001_010_111_001_0(Set<String> u, int b) => v(u, '0010101110010', b);
+
+@pragma('dart2js:noInline')
+f_001_010_111_011_0(Set<String> u, int b) => v(u, '0010101110110', b);
+
+@pragma('dart2js:noInline')
+f_001_010_111_101_0(Set<String> u, int b) => v(u, '0010101111010', b);
+
+@pragma('dart2js:noInline')
+f_001_010_111_111_0(Set<String> u, int b) => v(u, '0010101111110', b);
+
+@pragma('dart2js:noInline')
+f_001_011_000_001_0(Set<String> u, int b) => v(u, '0010110000010', b);
+
+@pragma('dart2js:noInline')
+f_001_011_000_011_0(Set<String> u, int b) => v(u, '0010110000110', b);
+
+@pragma('dart2js:noInline')
+f_001_011_000_101_0(Set<String> u, int b) => v(u, '0010110001010', b);
+
+@pragma('dart2js:noInline')
+f_001_011_000_111_0(Set<String> u, int b) => v(u, '0010110001110', b);
+
+@pragma('dart2js:noInline')
+f_001_011_001_001_0(Set<String> u, int b) => v(u, '0010110010010', b);
+
+@pragma('dart2js:noInline')
+f_001_011_001_011_0(Set<String> u, int b) => v(u, '0010110010110', b);
+
+@pragma('dart2js:noInline')
+f_001_011_001_101_0(Set<String> u, int b) => v(u, '0010110011010', b);
+
+@pragma('dart2js:noInline')
+f_001_011_001_111_0(Set<String> u, int b) => v(u, '0010110011110', b);
+
+@pragma('dart2js:noInline')
+f_001_011_010_001_0(Set<String> u, int b) => v(u, '0010110100010', b);
+
+@pragma('dart2js:noInline')
+f_001_011_010_011_0(Set<String> u, int b) => v(u, '0010110100110', b);
+
+@pragma('dart2js:noInline')
+f_001_011_010_101_0(Set<String> u, int b) => v(u, '0010110101010', b);
+
+@pragma('dart2js:noInline')
+f_001_011_010_111_0(Set<String> u, int b) => v(u, '0010110101110', b);
+
+@pragma('dart2js:noInline')
+f_001_011_011_001_0(Set<String> u, int b) => v(u, '0010110110010', b);
+
+@pragma('dart2js:noInline')
+f_001_011_011_011_0(Set<String> u, int b) => v(u, '0010110110110', b);
+
+@pragma('dart2js:noInline')
+f_001_011_011_101_0(Set<String> u, int b) => v(u, '0010110111010', b);
+
+@pragma('dart2js:noInline')
+f_001_011_011_111_0(Set<String> u, int b) => v(u, '0010110111110', b);
+
+@pragma('dart2js:noInline')
+f_001_011_100_001_0(Set<String> u, int b) => v(u, '0010111000010', b);
+
+@pragma('dart2js:noInline')
+f_001_011_100_011_0(Set<String> u, int b) => v(u, '0010111000110', b);
+
+@pragma('dart2js:noInline')
+f_001_011_100_101_0(Set<String> u, int b) => v(u, '0010111001010', b);
+
+@pragma('dart2js:noInline')
+f_001_011_100_111_0(Set<String> u, int b) => v(u, '0010111001110', b);
+
+@pragma('dart2js:noInline')
+f_001_011_101_001_0(Set<String> u, int b) => v(u, '0010111010010', b);
+
+@pragma('dart2js:noInline')
+f_001_011_101_011_0(Set<String> u, int b) => v(u, '0010111010110', b);
+
+@pragma('dart2js:noInline')
+f_001_011_101_101_0(Set<String> u, int b) => v(u, '0010111011010', b);
+
+@pragma('dart2js:noInline')
+f_001_011_101_111_0(Set<String> u, int b) => v(u, '0010111011110', b);
+
+@pragma('dart2js:noInline')
+f_001_011_110_001_0(Set<String> u, int b) => v(u, '0010111100010', b);
+
+@pragma('dart2js:noInline')
+f_001_011_110_011_0(Set<String> u, int b) => v(u, '0010111100110', b);
+
+@pragma('dart2js:noInline')
+f_001_011_110_101_0(Set<String> u, int b) => v(u, '0010111101010', b);
+
+@pragma('dart2js:noInline')
+f_001_011_110_111_0(Set<String> u, int b) => v(u, '0010111101110', b);
+
+@pragma('dart2js:noInline')
+f_001_011_111_001_0(Set<String> u, int b) => v(u, '0010111110010', b);
+
+@pragma('dart2js:noInline')
+f_001_011_111_011_0(Set<String> u, int b) => v(u, '0010111110110', b);
+
+@pragma('dart2js:noInline')
+f_001_011_111_101_0(Set<String> u, int b) => v(u, '0010111111010', b);
+
+@pragma('dart2js:noInline')
+f_001_011_111_111_0(Set<String> u, int b) => v(u, '0010111111110', b);
+
+@pragma('dart2js:noInline')
+f_001_100_000_001_0(Set<String> u, int b) => v(u, '0011000000010', b);
+
+@pragma('dart2js:noInline')
+f_001_100_000_011_0(Set<String> u, int b) => v(u, '0011000000110', b);
+
+@pragma('dart2js:noInline')
+f_001_100_000_101_0(Set<String> u, int b) => v(u, '0011000001010', b);
+
+@pragma('dart2js:noInline')
+f_001_100_000_111_0(Set<String> u, int b) => v(u, '0011000001110', b);
+
+@pragma('dart2js:noInline')
+f_001_100_001_001_0(Set<String> u, int b) => v(u, '0011000010010', b);
+
+@pragma('dart2js:noInline')
+f_001_100_001_011_0(Set<String> u, int b) => v(u, '0011000010110', b);
+
+@pragma('dart2js:noInline')
+f_001_100_001_101_0(Set<String> u, int b) => v(u, '0011000011010', b);
+
+@pragma('dart2js:noInline')
+f_001_100_001_111_0(Set<String> u, int b) => v(u, '0011000011110', b);
+
+@pragma('dart2js:noInline')
+f_001_100_010_001_0(Set<String> u, int b) => v(u, '0011000100010', b);
+
+@pragma('dart2js:noInline')
+f_001_100_010_011_0(Set<String> u, int b) => v(u, '0011000100110', b);
+
+@pragma('dart2js:noInline')
+f_001_100_010_101_0(Set<String> u, int b) => v(u, '0011000101010', b);
+
+@pragma('dart2js:noInline')
+f_001_100_010_111_0(Set<String> u, int b) => v(u, '0011000101110', b);
+
+@pragma('dart2js:noInline')
+f_001_100_011_001_0(Set<String> u, int b) => v(u, '0011000110010', b);
+
+@pragma('dart2js:noInline')
+f_001_100_011_011_0(Set<String> u, int b) => v(u, '0011000110110', b);
+
+@pragma('dart2js:noInline')
+f_001_100_011_101_0(Set<String> u, int b) => v(u, '0011000111010', b);
+
+@pragma('dart2js:noInline')
+f_001_100_011_111_0(Set<String> u, int b) => v(u, '0011000111110', b);
+
+@pragma('dart2js:noInline')
+f_001_100_100_001_0(Set<String> u, int b) => v(u, '0011001000010', b);
+
+@pragma('dart2js:noInline')
+f_001_100_100_011_0(Set<String> u, int b) => v(u, '0011001000110', b);
+
+@pragma('dart2js:noInline')
+f_001_100_100_101_0(Set<String> u, int b) => v(u, '0011001001010', b);
+
+@pragma('dart2js:noInline')
+f_001_100_100_111_0(Set<String> u, int b) => v(u, '0011001001110', b);
+
+@pragma('dart2js:noInline')
+f_001_100_101_001_0(Set<String> u, int b) => v(u, '0011001010010', b);
+
+@pragma('dart2js:noInline')
+f_001_100_101_011_0(Set<String> u, int b) => v(u, '0011001010110', b);
+
+@pragma('dart2js:noInline')
+f_001_100_101_101_0(Set<String> u, int b) => v(u, '0011001011010', b);
+
+@pragma('dart2js:noInline')
+f_001_100_101_111_0(Set<String> u, int b) => v(u, '0011001011110', b);
+
+@pragma('dart2js:noInline')
+f_001_100_110_001_0(Set<String> u, int b) => v(u, '0011001100010', b);
+
+@pragma('dart2js:noInline')
+f_001_100_110_011_0(Set<String> u, int b) => v(u, '0011001100110', b);
+
+@pragma('dart2js:noInline')
+f_001_100_110_101_0(Set<String> u, int b) => v(u, '0011001101010', b);
+
+@pragma('dart2js:noInline')
+f_001_100_110_111_0(Set<String> u, int b) => v(u, '0011001101110', b);
+
+@pragma('dart2js:noInline')
+f_001_100_111_001_0(Set<String> u, int b) => v(u, '0011001110010', b);
+
+@pragma('dart2js:noInline')
+f_001_100_111_011_0(Set<String> u, int b) => v(u, '0011001110110', b);
+
+@pragma('dart2js:noInline')
+f_001_100_111_101_0(Set<String> u, int b) => v(u, '0011001111010', b);
+
+@pragma('dart2js:noInline')
+f_001_100_111_111_0(Set<String> u, int b) => v(u, '0011001111110', b);
+
+@pragma('dart2js:noInline')
+f_001_101_000_001_0(Set<String> u, int b) => v(u, '0011010000010', b);
+
+@pragma('dart2js:noInline')
+f_001_101_000_011_0(Set<String> u, int b) => v(u, '0011010000110', b);
+
+@pragma('dart2js:noInline')
+f_001_101_000_101_0(Set<String> u, int b) => v(u, '0011010001010', b);
+
+@pragma('dart2js:noInline')
+f_001_101_000_111_0(Set<String> u, int b) => v(u, '0011010001110', b);
+
+@pragma('dart2js:noInline')
+f_001_101_001_001_0(Set<String> u, int b) => v(u, '0011010010010', b);
+
+@pragma('dart2js:noInline')
+f_001_101_001_011_0(Set<String> u, int b) => v(u, '0011010010110', b);
+
+@pragma('dart2js:noInline')
+f_001_101_001_101_0(Set<String> u, int b) => v(u, '0011010011010', b);
+
+@pragma('dart2js:noInline')
+f_001_101_001_111_0(Set<String> u, int b) => v(u, '0011010011110', b);
+
+@pragma('dart2js:noInline')
+f_001_101_010_001_0(Set<String> u, int b) => v(u, '0011010100010', b);
+
+@pragma('dart2js:noInline')
+f_001_101_010_011_0(Set<String> u, int b) => v(u, '0011010100110', b);
+
+@pragma('dart2js:noInline')
+f_001_101_010_101_0(Set<String> u, int b) => v(u, '0011010101010', b);
+
+@pragma('dart2js:noInline')
+f_001_101_010_111_0(Set<String> u, int b) => v(u, '0011010101110', b);
+
+@pragma('dart2js:noInline')
+f_001_101_011_001_0(Set<String> u, int b) => v(u, '0011010110010', b);
+
+@pragma('dart2js:noInline')
+f_001_101_011_011_0(Set<String> u, int b) => v(u, '0011010110110', b);
+
+@pragma('dart2js:noInline')
+f_001_101_011_101_0(Set<String> u, int b) => v(u, '0011010111010', b);
+
+@pragma('dart2js:noInline')
+f_001_101_011_111_0(Set<String> u, int b) => v(u, '0011010111110', b);
+
+@pragma('dart2js:noInline')
+f_001_101_100_001_0(Set<String> u, int b) => v(u, '0011011000010', b);
+
+@pragma('dart2js:noInline')
+f_001_101_100_011_0(Set<String> u, int b) => v(u, '0011011000110', b);
+
+@pragma('dart2js:noInline')
+f_001_101_100_101_0(Set<String> u, int b) => v(u, '0011011001010', b);
+
+@pragma('dart2js:noInline')
+f_001_101_100_111_0(Set<String> u, int b) => v(u, '0011011001110', b);
+
+@pragma('dart2js:noInline')
+f_001_101_101_001_0(Set<String> u, int b) => v(u, '0011011010010', b);
+
+@pragma('dart2js:noInline')
+f_001_101_101_011_0(Set<String> u, int b) => v(u, '0011011010110', b);
+
+@pragma('dart2js:noInline')
+f_001_101_101_101_0(Set<String> u, int b) => v(u, '0011011011010', b);
+
+@pragma('dart2js:noInline')
+f_001_101_101_111_0(Set<String> u, int b) => v(u, '0011011011110', b);
+
+@pragma('dart2js:noInline')
+f_001_101_110_001_0(Set<String> u, int b) => v(u, '0011011100010', b);
+
+@pragma('dart2js:noInline')
+f_001_101_110_011_0(Set<String> u, int b) => v(u, '0011011100110', b);
+
+@pragma('dart2js:noInline')
+f_001_101_110_101_0(Set<String> u, int b) => v(u, '0011011101010', b);
+
+@pragma('dart2js:noInline')
+f_001_101_110_111_0(Set<String> u, int b) => v(u, '0011011101110', b);
+
+@pragma('dart2js:noInline')
+f_001_101_111_001_0(Set<String> u, int b) => v(u, '0011011110010', b);
+
+@pragma('dart2js:noInline')
+f_001_101_111_011_0(Set<String> u, int b) => v(u, '0011011110110', b);
+
+@pragma('dart2js:noInline')
+f_001_101_111_101_0(Set<String> u, int b) => v(u, '0011011111010', b);
+
+@pragma('dart2js:noInline')
+f_001_101_111_111_0(Set<String> u, int b) => v(u, '0011011111110', b);
+
+@pragma('dart2js:noInline')
+f_001_110_000_001_0(Set<String> u, int b) => v(u, '0011100000010', b);
+
+@pragma('dart2js:noInline')
+f_001_110_000_011_0(Set<String> u, int b) => v(u, '0011100000110', b);
+
+@pragma('dart2js:noInline')
+f_001_110_000_101_0(Set<String> u, int b) => v(u, '0011100001010', b);
+
+@pragma('dart2js:noInline')
+f_001_110_000_111_0(Set<String> u, int b) => v(u, '0011100001110', b);
+
+@pragma('dart2js:noInline')
+f_001_110_001_001_0(Set<String> u, int b) => v(u, '0011100010010', b);
+
+@pragma('dart2js:noInline')
+f_001_110_001_011_0(Set<String> u, int b) => v(u, '0011100010110', b);
+
+@pragma('dart2js:noInline')
+f_001_110_001_101_0(Set<String> u, int b) => v(u, '0011100011010', b);
+
+@pragma('dart2js:noInline')
+f_001_110_001_111_0(Set<String> u, int b) => v(u, '0011100011110', b);
+
+@pragma('dart2js:noInline')
+f_001_110_010_001_0(Set<String> u, int b) => v(u, '0011100100010', b);
+
+@pragma('dart2js:noInline')
+f_001_110_010_011_0(Set<String> u, int b) => v(u, '0011100100110', b);
+
+@pragma('dart2js:noInline')
+f_001_110_010_101_0(Set<String> u, int b) => v(u, '0011100101010', b);
+
+@pragma('dart2js:noInline')
+f_001_110_010_111_0(Set<String> u, int b) => v(u, '0011100101110', b);
+
+@pragma('dart2js:noInline')
+f_001_110_011_001_0(Set<String> u, int b) => v(u, '0011100110010', b);
+
+@pragma('dart2js:noInline')
+f_001_110_011_011_0(Set<String> u, int b) => v(u, '0011100110110', b);
+
+@pragma('dart2js:noInline')
+f_001_110_011_101_0(Set<String> u, int b) => v(u, '0011100111010', b);
+
+@pragma('dart2js:noInline')
+f_001_110_011_111_0(Set<String> u, int b) => v(u, '0011100111110', b);
+
+@pragma('dart2js:noInline')
+f_001_110_100_001_0(Set<String> u, int b) => v(u, '0011101000010', b);
+
+@pragma('dart2js:noInline')
+f_001_110_100_011_0(Set<String> u, int b) => v(u, '0011101000110', b);
+
+@pragma('dart2js:noInline')
+f_001_110_100_101_0(Set<String> u, int b) => v(u, '0011101001010', b);
+
+@pragma('dart2js:noInline')
+f_001_110_100_111_0(Set<String> u, int b) => v(u, '0011101001110', b);
+
+@pragma('dart2js:noInline')
+f_001_110_101_001_0(Set<String> u, int b) => v(u, '0011101010010', b);
+
+@pragma('dart2js:noInline')
+f_001_110_101_011_0(Set<String> u, int b) => v(u, '0011101010110', b);
+
+@pragma('dart2js:noInline')
+f_001_110_101_101_0(Set<String> u, int b) => v(u, '0011101011010', b);
+
+@pragma('dart2js:noInline')
+f_001_110_101_111_0(Set<String> u, int b) => v(u, '0011101011110', b);
+
+@pragma('dart2js:noInline')
+f_001_110_110_001_0(Set<String> u, int b) => v(u, '0011101100010', b);
+
+@pragma('dart2js:noInline')
+f_001_110_110_011_0(Set<String> u, int b) => v(u, '0011101100110', b);
+
+@pragma('dart2js:noInline')
+f_001_110_110_101_0(Set<String> u, int b) => v(u, '0011101101010', b);
+
+@pragma('dart2js:noInline')
+f_001_110_110_111_0(Set<String> u, int b) => v(u, '0011101101110', b);
+
+@pragma('dart2js:noInline')
+f_001_110_111_001_0(Set<String> u, int b) => v(u, '0011101110010', b);
+
+@pragma('dart2js:noInline')
+f_001_110_111_011_0(Set<String> u, int b) => v(u, '0011101110110', b);
+
+@pragma('dart2js:noInline')
+f_001_110_111_101_0(Set<String> u, int b) => v(u, '0011101111010', b);
+
+@pragma('dart2js:noInline')
+f_001_110_111_111_0(Set<String> u, int b) => v(u, '0011101111110', b);
+
+@pragma('dart2js:noInline')
+f_001_111_000_001_0(Set<String> u, int b) => v(u, '0011110000010', b);
+
+@pragma('dart2js:noInline')
+f_001_111_000_011_0(Set<String> u, int b) => v(u, '0011110000110', b);
+
+@pragma('dart2js:noInline')
+f_001_111_000_101_0(Set<String> u, int b) => v(u, '0011110001010', b);
+
+@pragma('dart2js:noInline')
+f_001_111_000_111_0(Set<String> u, int b) => v(u, '0011110001110', b);
+
+@pragma('dart2js:noInline')
+f_001_111_001_001_0(Set<String> u, int b) => v(u, '0011110010010', b);
+
+@pragma('dart2js:noInline')
+f_001_111_001_011_0(Set<String> u, int b) => v(u, '0011110010110', b);
+
+@pragma('dart2js:noInline')
+f_001_111_001_101_0(Set<String> u, int b) => v(u, '0011110011010', b);
+
+@pragma('dart2js:noInline')
+f_001_111_001_111_0(Set<String> u, int b) => v(u, '0011110011110', b);
+
+@pragma('dart2js:noInline')
+f_001_111_010_001_0(Set<String> u, int b) => v(u, '0011110100010', b);
+
+@pragma('dart2js:noInline')
+f_001_111_010_011_0(Set<String> u, int b) => v(u, '0011110100110', b);
+
+@pragma('dart2js:noInline')
+f_001_111_010_101_0(Set<String> u, int b) => v(u, '0011110101010', b);
+
+@pragma('dart2js:noInline')
+f_001_111_010_111_0(Set<String> u, int b) => v(u, '0011110101110', b);
+
+@pragma('dart2js:noInline')
+f_001_111_011_001_0(Set<String> u, int b) => v(u, '0011110110010', b);
+
+@pragma('dart2js:noInline')
+f_001_111_011_011_0(Set<String> u, int b) => v(u, '0011110110110', b);
+
+@pragma('dart2js:noInline')
+f_001_111_011_101_0(Set<String> u, int b) => v(u, '0011110111010', b);
+
+@pragma('dart2js:noInline')
+f_001_111_011_111_0(Set<String> u, int b) => v(u, '0011110111110', b);
+
+@pragma('dart2js:noInline')
+f_001_111_100_001_0(Set<String> u, int b) => v(u, '0011111000010', b);
+
+@pragma('dart2js:noInline')
+f_001_111_100_011_0(Set<String> u, int b) => v(u, '0011111000110', b);
+
+@pragma('dart2js:noInline')
+f_001_111_100_101_0(Set<String> u, int b) => v(u, '0011111001010', b);
+
+@pragma('dart2js:noInline')
+f_001_111_100_111_0(Set<String> u, int b) => v(u, '0011111001110', b);
+
+@pragma('dart2js:noInline')
+f_001_111_101_001_0(Set<String> u, int b) => v(u, '0011111010010', b);
+
+@pragma('dart2js:noInline')
+f_001_111_101_011_0(Set<String> u, int b) => v(u, '0011111010110', b);
+
+@pragma('dart2js:noInline')
+f_001_111_101_101_0(Set<String> u, int b) => v(u, '0011111011010', b);
+
+@pragma('dart2js:noInline')
+f_001_111_101_111_0(Set<String> u, int b) => v(u, '0011111011110', b);
+
+@pragma('dart2js:noInline')
+f_001_111_110_001_0(Set<String> u, int b) => v(u, '0011111100010', b);
+
+@pragma('dart2js:noInline')
+f_001_111_110_011_0(Set<String> u, int b) => v(u, '0011111100110', b);
+
+@pragma('dart2js:noInline')
+f_001_111_110_101_0(Set<String> u, int b) => v(u, '0011111101010', b);
+
+@pragma('dart2js:noInline')
+f_001_111_110_111_0(Set<String> u, int b) => v(u, '0011111101110', b);
+
+@pragma('dart2js:noInline')
+f_001_111_111_001_0(Set<String> u, int b) => v(u, '0011111110010', b);
+
+@pragma('dart2js:noInline')
+f_001_111_111_011_0(Set<String> u, int b) => v(u, '0011111110110', b);
+
+@pragma('dart2js:noInline')
+f_001_111_111_101_0(Set<String> u, int b) => v(u, '0011111111010', b);
+
+@pragma('dart2js:noInline')
+f_001_111_111_111_0(Set<String> u, int b) => v(u, '0011111111110', b);
+
+@pragma('dart2js:noInline')
+f_010_000_000_001_0(Set<String> u, int b) => v(u, '0100000000010', b);
+
+@pragma('dart2js:noInline')
+f_010_000_000_011_0(Set<String> u, int b) => v(u, '0100000000110', b);
+
+@pragma('dart2js:noInline')
+f_010_000_000_101_0(Set<String> u, int b) => v(u, '0100000001010', b);
+
+@pragma('dart2js:noInline')
+f_010_000_000_111_0(Set<String> u, int b) => v(u, '0100000001110', b);
+
+@pragma('dart2js:noInline')
+f_010_000_001_001_0(Set<String> u, int b) => v(u, '0100000010010', b);
+
+@pragma('dart2js:noInline')
+f_010_000_001_011_0(Set<String> u, int b) => v(u, '0100000010110', b);
+
+@pragma('dart2js:noInline')
+f_010_000_001_101_0(Set<String> u, int b) => v(u, '0100000011010', b);
+
+@pragma('dart2js:noInline')
+f_010_000_001_111_0(Set<String> u, int b) => v(u, '0100000011110', b);
+
+@pragma('dart2js:noInline')
+f_010_000_010_001_0(Set<String> u, int b) => v(u, '0100000100010', b);
+
+@pragma('dart2js:noInline')
+f_010_000_010_011_0(Set<String> u, int b) => v(u, '0100000100110', b);
+
+@pragma('dart2js:noInline')
+f_010_000_010_101_0(Set<String> u, int b) => v(u, '0100000101010', b);
+
+@pragma('dart2js:noInline')
+f_010_000_010_111_0(Set<String> u, int b) => v(u, '0100000101110', b);
+
+@pragma('dart2js:noInline')
+f_010_000_011_001_0(Set<String> u, int b) => v(u, '0100000110010', b);
+
+@pragma('dart2js:noInline')
+f_010_000_011_011_0(Set<String> u, int b) => v(u, '0100000110110', b);
+
+@pragma('dart2js:noInline')
+f_010_000_011_101_0(Set<String> u, int b) => v(u, '0100000111010', b);
+
+@pragma('dart2js:noInline')
+f_010_000_011_111_0(Set<String> u, int b) => v(u, '0100000111110', b);
+
+@pragma('dart2js:noInline')
+f_010_000_100_001_0(Set<String> u, int b) => v(u, '0100001000010', b);
+
+@pragma('dart2js:noInline')
+f_010_000_100_011_0(Set<String> u, int b) => v(u, '0100001000110', b);
+
+@pragma('dart2js:noInline')
+f_010_000_100_101_0(Set<String> u, int b) => v(u, '0100001001010', b);
+
+@pragma('dart2js:noInline')
+f_010_000_100_111_0(Set<String> u, int b) => v(u, '0100001001110', b);
+
+@pragma('dart2js:noInline')
+f_010_000_101_001_0(Set<String> u, int b) => v(u, '0100001010010', b);
+
+@pragma('dart2js:noInline')
+f_010_000_101_011_0(Set<String> u, int b) => v(u, '0100001010110', b);
+
+@pragma('dart2js:noInline')
+f_010_000_101_101_0(Set<String> u, int b) => v(u, '0100001011010', b);
+
+@pragma('dart2js:noInline')
+f_010_000_101_111_0(Set<String> u, int b) => v(u, '0100001011110', b);
+
+@pragma('dart2js:noInline')
+f_010_000_110_001_0(Set<String> u, int b) => v(u, '0100001100010', b);
+
+@pragma('dart2js:noInline')
+f_010_000_110_011_0(Set<String> u, int b) => v(u, '0100001100110', b);
+
+@pragma('dart2js:noInline')
+f_010_000_110_101_0(Set<String> u, int b) => v(u, '0100001101010', b);
+
+@pragma('dart2js:noInline')
+f_010_000_110_111_0(Set<String> u, int b) => v(u, '0100001101110', b);
+
+@pragma('dart2js:noInline')
+f_010_000_111_001_0(Set<String> u, int b) => v(u, '0100001110010', b);
+
+@pragma('dart2js:noInline')
+f_010_000_111_011_0(Set<String> u, int b) => v(u, '0100001110110', b);
+
+@pragma('dart2js:noInline')
+f_010_000_111_101_0(Set<String> u, int b) => v(u, '0100001111010', b);
+
+@pragma('dart2js:noInline')
+f_010_000_111_111_0(Set<String> u, int b) => v(u, '0100001111110', b);
+
+@pragma('dart2js:noInline')
+f_010_001_000_001_0(Set<String> u, int b) => v(u, '0100010000010', b);
+
+@pragma('dart2js:noInline')
+f_010_001_000_011_0(Set<String> u, int b) => v(u, '0100010000110', b);
+
+@pragma('dart2js:noInline')
+f_010_001_000_101_0(Set<String> u, int b) => v(u, '0100010001010', b);
+
+@pragma('dart2js:noInline')
+f_010_001_000_111_0(Set<String> u, int b) => v(u, '0100010001110', b);
+
+@pragma('dart2js:noInline')
+f_010_001_001_001_0(Set<String> u, int b) => v(u, '0100010010010', b);
+
+@pragma('dart2js:noInline')
+f_010_001_001_011_0(Set<String> u, int b) => v(u, '0100010010110', b);
+
+@pragma('dart2js:noInline')
+f_010_001_001_101_0(Set<String> u, int b) => v(u, '0100010011010', b);
+
+@pragma('dart2js:noInline')
+f_010_001_001_111_0(Set<String> u, int b) => v(u, '0100010011110', b);
+
+@pragma('dart2js:noInline')
+f_010_001_010_001_0(Set<String> u, int b) => v(u, '0100010100010', b);
+
+@pragma('dart2js:noInline')
+f_010_001_010_011_0(Set<String> u, int b) => v(u, '0100010100110', b);
+
+@pragma('dart2js:noInline')
+f_010_001_010_101_0(Set<String> u, int b) => v(u, '0100010101010', b);
+
+@pragma('dart2js:noInline')
+f_010_001_010_111_0(Set<String> u, int b) => v(u, '0100010101110', b);
+
+@pragma('dart2js:noInline')
+f_010_001_011_001_0(Set<String> u, int b) => v(u, '0100010110010', b);
+
+@pragma('dart2js:noInline')
+f_010_001_011_011_0(Set<String> u, int b) => v(u, '0100010110110', b);
+
+@pragma('dart2js:noInline')
+f_010_001_011_101_0(Set<String> u, int b) => v(u, '0100010111010', b);
+
+@pragma('dart2js:noInline')
+f_010_001_011_111_0(Set<String> u, int b) => v(u, '0100010111110', b);
+
+@pragma('dart2js:noInline')
+f_010_001_100_001_0(Set<String> u, int b) => v(u, '0100011000010', b);
+
+@pragma('dart2js:noInline')
+f_010_001_100_011_0(Set<String> u, int b) => v(u, '0100011000110', b);
+
+@pragma('dart2js:noInline')
+f_010_001_100_101_0(Set<String> u, int b) => v(u, '0100011001010', b);
+
+@pragma('dart2js:noInline')
+f_010_001_100_111_0(Set<String> u, int b) => v(u, '0100011001110', b);
+
+@pragma('dart2js:noInline')
+f_010_001_101_001_0(Set<String> u, int b) => v(u, '0100011010010', b);
+
+@pragma('dart2js:noInline')
+f_010_001_101_011_0(Set<String> u, int b) => v(u, '0100011010110', b);
+
+@pragma('dart2js:noInline')
+f_010_001_101_101_0(Set<String> u, int b) => v(u, '0100011011010', b);
+
+@pragma('dart2js:noInline')
+f_010_001_101_111_0(Set<String> u, int b) => v(u, '0100011011110', b);
+
+@pragma('dart2js:noInline')
+f_010_001_110_001_0(Set<String> u, int b) => v(u, '0100011100010', b);
+
+@pragma('dart2js:noInline')
+f_010_001_110_011_0(Set<String> u, int b) => v(u, '0100011100110', b);
+
+@pragma('dart2js:noInline')
+f_010_001_110_101_0(Set<String> u, int b) => v(u, '0100011101010', b);
+
+@pragma('dart2js:noInline')
+f_010_001_110_111_0(Set<String> u, int b) => v(u, '0100011101110', b);
+
+@pragma('dart2js:noInline')
+f_010_001_111_001_0(Set<String> u, int b) => v(u, '0100011110010', b);
+
+@pragma('dart2js:noInline')
+f_010_001_111_011_0(Set<String> u, int b) => v(u, '0100011110110', b);
+
+@pragma('dart2js:noInline')
+f_010_001_111_101_0(Set<String> u, int b) => v(u, '0100011111010', b);
+
+@pragma('dart2js:noInline')
+f_010_001_111_111_0(Set<String> u, int b) => v(u, '0100011111110', b);
+
+@pragma('dart2js:noInline')
+f_010_010_000_001_0(Set<String> u, int b) => v(u, '0100100000010', b);
+
+@pragma('dart2js:noInline')
+f_010_010_000_011_0(Set<String> u, int b) => v(u, '0100100000110', b);
+
+@pragma('dart2js:noInline')
+f_010_010_000_101_0(Set<String> u, int b) => v(u, '0100100001010', b);
+
+@pragma('dart2js:noInline')
+f_010_010_000_111_0(Set<String> u, int b) => v(u, '0100100001110', b);
+
+@pragma('dart2js:noInline')
+f_010_010_001_001_0(Set<String> u, int b) => v(u, '0100100010010', b);
+
+@pragma('dart2js:noInline')
+f_010_010_001_011_0(Set<String> u, int b) => v(u, '0100100010110', b);
+
+@pragma('dart2js:noInline')
+f_010_010_001_101_0(Set<String> u, int b) => v(u, '0100100011010', b);
+
+@pragma('dart2js:noInline')
+f_010_010_001_111_0(Set<String> u, int b) => v(u, '0100100011110', b);
+
+@pragma('dart2js:noInline')
+f_010_010_010_001_0(Set<String> u, int b) => v(u, '0100100100010', b);
+
+@pragma('dart2js:noInline')
+f_010_010_010_011_0(Set<String> u, int b) => v(u, '0100100100110', b);
+
+@pragma('dart2js:noInline')
+f_010_010_010_101_0(Set<String> u, int b) => v(u, '0100100101010', b);
+
+@pragma('dart2js:noInline')
+f_010_010_010_111_0(Set<String> u, int b) => v(u, '0100100101110', b);
+
+@pragma('dart2js:noInline')
+f_010_010_011_001_0(Set<String> u, int b) => v(u, '0100100110010', b);
+
+@pragma('dart2js:noInline')
+f_010_010_011_011_0(Set<String> u, int b) => v(u, '0100100110110', b);
+
+@pragma('dart2js:noInline')
+f_010_010_011_101_0(Set<String> u, int b) => v(u, '0100100111010', b);
+
+@pragma('dart2js:noInline')
+f_010_010_011_111_0(Set<String> u, int b) => v(u, '0100100111110', b);
+
+@pragma('dart2js:noInline')
+f_010_010_100_001_0(Set<String> u, int b) => v(u, '0100101000010', b);
+
+@pragma('dart2js:noInline')
+f_010_010_100_011_0(Set<String> u, int b) => v(u, '0100101000110', b);
+
+@pragma('dart2js:noInline')
+f_010_010_100_101_0(Set<String> u, int b) => v(u, '0100101001010', b);
+
+@pragma('dart2js:noInline')
+f_010_010_100_111_0(Set<String> u, int b) => v(u, '0100101001110', b);
+
+@pragma('dart2js:noInline')
+f_010_010_101_001_0(Set<String> u, int b) => v(u, '0100101010010', b);
+
+@pragma('dart2js:noInline')
+f_010_010_101_011_0(Set<String> u, int b) => v(u, '0100101010110', b);
+
+@pragma('dart2js:noInline')
+f_010_010_101_101_0(Set<String> u, int b) => v(u, '0100101011010', b);
+
+@pragma('dart2js:noInline')
+f_010_010_101_111_0(Set<String> u, int b) => v(u, '0100101011110', b);
+
+@pragma('dart2js:noInline')
+f_010_010_110_001_0(Set<String> u, int b) => v(u, '0100101100010', b);
+
+@pragma('dart2js:noInline')
+f_010_010_110_011_0(Set<String> u, int b) => v(u, '0100101100110', b);
+
+@pragma('dart2js:noInline')
+f_010_010_110_101_0(Set<String> u, int b) => v(u, '0100101101010', b);
+
+@pragma('dart2js:noInline')
+f_010_010_110_111_0(Set<String> u, int b) => v(u, '0100101101110', b);
+
+@pragma('dart2js:noInline')
+f_010_010_111_001_0(Set<String> u, int b) => v(u, '0100101110010', b);
+
+@pragma('dart2js:noInline')
+f_010_010_111_011_0(Set<String> u, int b) => v(u, '0100101110110', b);
+
+@pragma('dart2js:noInline')
+f_010_010_111_101_0(Set<String> u, int b) => v(u, '0100101111010', b);
+
+@pragma('dart2js:noInline')
+f_010_010_111_111_0(Set<String> u, int b) => v(u, '0100101111110', b);
+
+@pragma('dart2js:noInline')
+f_010_011_000_001_0(Set<String> u, int b) => v(u, '0100110000010', b);
+
+@pragma('dart2js:noInline')
+f_010_011_000_011_0(Set<String> u, int b) => v(u, '0100110000110', b);
+
+@pragma('dart2js:noInline')
+f_010_011_000_101_0(Set<String> u, int b) => v(u, '0100110001010', b);
+
+@pragma('dart2js:noInline')
+f_010_011_000_111_0(Set<String> u, int b) => v(u, '0100110001110', b);
+
+@pragma('dart2js:noInline')
+f_010_011_001_001_0(Set<String> u, int b) => v(u, '0100110010010', b);
+
+@pragma('dart2js:noInline')
+f_010_011_001_011_0(Set<String> u, int b) => v(u, '0100110010110', b);
+
+@pragma('dart2js:noInline')
+f_010_011_001_101_0(Set<String> u, int b) => v(u, '0100110011010', b);
+
+@pragma('dart2js:noInline')
+f_010_011_001_111_0(Set<String> u, int b) => v(u, '0100110011110', b);
+
+@pragma('dart2js:noInline')
+f_010_011_010_001_0(Set<String> u, int b) => v(u, '0100110100010', b);
+
+@pragma('dart2js:noInline')
+f_010_011_010_011_0(Set<String> u, int b) => v(u, '0100110100110', b);
+
+@pragma('dart2js:noInline')
+f_010_011_010_101_0(Set<String> u, int b) => v(u, '0100110101010', b);
+
+@pragma('dart2js:noInline')
+f_010_011_010_111_0(Set<String> u, int b) => v(u, '0100110101110', b);
+
+@pragma('dart2js:noInline')
+f_010_011_011_001_0(Set<String> u, int b) => v(u, '0100110110010', b);
+
+@pragma('dart2js:noInline')
+f_010_011_011_011_0(Set<String> u, int b) => v(u, '0100110110110', b);
+
+@pragma('dart2js:noInline')
+f_010_011_011_101_0(Set<String> u, int b) => v(u, '0100110111010', b);
+
+@pragma('dart2js:noInline')
+f_010_011_011_111_0(Set<String> u, int b) => v(u, '0100110111110', b);
+
+@pragma('dart2js:noInline')
+f_010_011_100_001_0(Set<String> u, int b) => v(u, '0100111000010', b);
+
+@pragma('dart2js:noInline')
+f_010_011_100_011_0(Set<String> u, int b) => v(u, '0100111000110', b);
+
+@pragma('dart2js:noInline')
+f_010_011_100_101_0(Set<String> u, int b) => v(u, '0100111001010', b);
+
+@pragma('dart2js:noInline')
+f_010_011_100_111_0(Set<String> u, int b) => v(u, '0100111001110', b);
+
+@pragma('dart2js:noInline')
+f_010_011_101_001_0(Set<String> u, int b) => v(u, '0100111010010', b);
+
+@pragma('dart2js:noInline')
+f_010_011_101_011_0(Set<String> u, int b) => v(u, '0100111010110', b);
+
+@pragma('dart2js:noInline')
+f_010_011_101_101_0(Set<String> u, int b) => v(u, '0100111011010', b);
+
+@pragma('dart2js:noInline')
+f_010_011_101_111_0(Set<String> u, int b) => v(u, '0100111011110', b);
+
+@pragma('dart2js:noInline')
+f_010_011_110_001_0(Set<String> u, int b) => v(u, '0100111100010', b);
+
+@pragma('dart2js:noInline')
+f_010_011_110_011_0(Set<String> u, int b) => v(u, '0100111100110', b);
+
+@pragma('dart2js:noInline')
+f_010_011_110_101_0(Set<String> u, int b) => v(u, '0100111101010', b);
+
+@pragma('dart2js:noInline')
+f_010_011_110_111_0(Set<String> u, int b) => v(u, '0100111101110', b);
+
+@pragma('dart2js:noInline')
+f_010_011_111_001_0(Set<String> u, int b) => v(u, '0100111110010', b);
+
+@pragma('dart2js:noInline')
+f_010_011_111_011_0(Set<String> u, int b) => v(u, '0100111110110', b);
+
+@pragma('dart2js:noInline')
+f_010_011_111_101_0(Set<String> u, int b) => v(u, '0100111111010', b);
+
+@pragma('dart2js:noInline')
+f_010_011_111_111_0(Set<String> u, int b) => v(u, '0100111111110', b);
+
+@pragma('dart2js:noInline')
+f_010_100_000_001_0(Set<String> u, int b) => v(u, '0101000000010', b);
+
+@pragma('dart2js:noInline')
+f_010_100_000_011_0(Set<String> u, int b) => v(u, '0101000000110', b);
+
+@pragma('dart2js:noInline')
+f_010_100_000_101_0(Set<String> u, int b) => v(u, '0101000001010', b);
+
+@pragma('dart2js:noInline')
+f_010_100_000_111_0(Set<String> u, int b) => v(u, '0101000001110', b);
+
+@pragma('dart2js:noInline')
+f_010_100_001_001_0(Set<String> u, int b) => v(u, '0101000010010', b);
+
+@pragma('dart2js:noInline')
+f_010_100_001_011_0(Set<String> u, int b) => v(u, '0101000010110', b);
+
+@pragma('dart2js:noInline')
+f_010_100_001_101_0(Set<String> u, int b) => v(u, '0101000011010', b);
+
+@pragma('dart2js:noInline')
+f_010_100_001_111_0(Set<String> u, int b) => v(u, '0101000011110', b);
+
+@pragma('dart2js:noInline')
+f_010_100_010_001_0(Set<String> u, int b) => v(u, '0101000100010', b);
+
+@pragma('dart2js:noInline')
+f_010_100_010_011_0(Set<String> u, int b) => v(u, '0101000100110', b);
+
+@pragma('dart2js:noInline')
+f_010_100_010_101_0(Set<String> u, int b) => v(u, '0101000101010', b);
+
+@pragma('dart2js:noInline')
+f_010_100_010_111_0(Set<String> u, int b) => v(u, '0101000101110', b);
+
+@pragma('dart2js:noInline')
+f_010_100_011_001_0(Set<String> u, int b) => v(u, '0101000110010', b);
+
+@pragma('dart2js:noInline')
+f_010_100_011_011_0(Set<String> u, int b) => v(u, '0101000110110', b);
+
+@pragma('dart2js:noInline')
+f_010_100_011_101_0(Set<String> u, int b) => v(u, '0101000111010', b);
+
+@pragma('dart2js:noInline')
+f_010_100_011_111_0(Set<String> u, int b) => v(u, '0101000111110', b);
+
+@pragma('dart2js:noInline')
+f_010_100_100_001_0(Set<String> u, int b) => v(u, '0101001000010', b);
+
+@pragma('dart2js:noInline')
+f_010_100_100_011_0(Set<String> u, int b) => v(u, '0101001000110', b);
+
+@pragma('dart2js:noInline')
+f_010_100_100_101_0(Set<String> u, int b) => v(u, '0101001001010', b);
+
+@pragma('dart2js:noInline')
+f_010_100_100_111_0(Set<String> u, int b) => v(u, '0101001001110', b);
+
+@pragma('dart2js:noInline')
+f_010_100_101_001_0(Set<String> u, int b) => v(u, '0101001010010', b);
+
+@pragma('dart2js:noInline')
+f_010_100_101_011_0(Set<String> u, int b) => v(u, '0101001010110', b);
+
+@pragma('dart2js:noInline')
+f_010_100_101_101_0(Set<String> u, int b) => v(u, '0101001011010', b);
+
+@pragma('dart2js:noInline')
+f_010_100_101_111_0(Set<String> u, int b) => v(u, '0101001011110', b);
+
+@pragma('dart2js:noInline')
+f_010_100_110_001_0(Set<String> u, int b) => v(u, '0101001100010', b);
+
+@pragma('dart2js:noInline')
+f_010_100_110_011_0(Set<String> u, int b) => v(u, '0101001100110', b);
+
+@pragma('dart2js:noInline')
+f_010_100_110_101_0(Set<String> u, int b) => v(u, '0101001101010', b);
+
+@pragma('dart2js:noInline')
+f_010_100_110_111_0(Set<String> u, int b) => v(u, '0101001101110', b);
+
+@pragma('dart2js:noInline')
+f_010_100_111_001_0(Set<String> u, int b) => v(u, '0101001110010', b);
+
+@pragma('dart2js:noInline')
+f_010_100_111_011_0(Set<String> u, int b) => v(u, '0101001110110', b);
+
+@pragma('dart2js:noInline')
+f_010_100_111_101_0(Set<String> u, int b) => v(u, '0101001111010', b);
+
+@pragma('dart2js:noInline')
+f_010_100_111_111_0(Set<String> u, int b) => v(u, '0101001111110', b);
+
+@pragma('dart2js:noInline')
+f_010_101_000_001_0(Set<String> u, int b) => v(u, '0101010000010', b);
+
+@pragma('dart2js:noInline')
+f_010_101_000_011_0(Set<String> u, int b) => v(u, '0101010000110', b);
+
+@pragma('dart2js:noInline')
+f_010_101_000_101_0(Set<String> u, int b) => v(u, '0101010001010', b);
+
+@pragma('dart2js:noInline')
+f_010_101_000_111_0(Set<String> u, int b) => v(u, '0101010001110', b);
+
+@pragma('dart2js:noInline')
+f_010_101_001_001_0(Set<String> u, int b) => v(u, '0101010010010', b);
+
+@pragma('dart2js:noInline')
+f_010_101_001_011_0(Set<String> u, int b) => v(u, '0101010010110', b);
+
+@pragma('dart2js:noInline')
+f_010_101_001_101_0(Set<String> u, int b) => v(u, '0101010011010', b);
+
+@pragma('dart2js:noInline')
+f_010_101_001_111_0(Set<String> u, int b) => v(u, '0101010011110', b);
+
+@pragma('dart2js:noInline')
+f_010_101_010_001_0(Set<String> u, int b) => v(u, '0101010100010', b);
+
+@pragma('dart2js:noInline')
+f_010_101_010_011_0(Set<String> u, int b) => v(u, '0101010100110', b);
+
+@pragma('dart2js:noInline')
+f_010_101_010_101_0(Set<String> u, int b) => v(u, '0101010101010', b);
+
+@pragma('dart2js:noInline')
+f_010_101_010_111_0(Set<String> u, int b) => v(u, '0101010101110', b);
+
+@pragma('dart2js:noInline')
+f_010_101_011_001_0(Set<String> u, int b) => v(u, '0101010110010', b);
+
+@pragma('dart2js:noInline')
+f_010_101_011_011_0(Set<String> u, int b) => v(u, '0101010110110', b);
+
+@pragma('dart2js:noInline')
+f_010_101_011_101_0(Set<String> u, int b) => v(u, '0101010111010', b);
+
+@pragma('dart2js:noInline')
+f_010_101_011_111_0(Set<String> u, int b) => v(u, '0101010111110', b);
+
+@pragma('dart2js:noInline')
+f_010_101_100_001_0(Set<String> u, int b) => v(u, '0101011000010', b);
+
+@pragma('dart2js:noInline')
+f_010_101_100_011_0(Set<String> u, int b) => v(u, '0101011000110', b);
+
+@pragma('dart2js:noInline')
+f_010_101_100_101_0(Set<String> u, int b) => v(u, '0101011001010', b);
+
+@pragma('dart2js:noInline')
+f_010_101_100_111_0(Set<String> u, int b) => v(u, '0101011001110', b);
+
+@pragma('dart2js:noInline')
+f_010_101_101_001_0(Set<String> u, int b) => v(u, '0101011010010', b);
+
+@pragma('dart2js:noInline')
+f_010_101_101_011_0(Set<String> u, int b) => v(u, '0101011010110', b);
+
+@pragma('dart2js:noInline')
+f_010_101_101_101_0(Set<String> u, int b) => v(u, '0101011011010', b);
+
+@pragma('dart2js:noInline')
+f_010_101_101_111_0(Set<String> u, int b) => v(u, '0101011011110', b);
+
+@pragma('dart2js:noInline')
+f_010_101_110_001_0(Set<String> u, int b) => v(u, '0101011100010', b);
+
+@pragma('dart2js:noInline')
+f_010_101_110_011_0(Set<String> u, int b) => v(u, '0101011100110', b);
+
+@pragma('dart2js:noInline')
+f_010_101_110_101_0(Set<String> u, int b) => v(u, '0101011101010', b);
+
+@pragma('dart2js:noInline')
+f_010_101_110_111_0(Set<String> u, int b) => v(u, '0101011101110', b);
+
+@pragma('dart2js:noInline')
+f_010_101_111_001_0(Set<String> u, int b) => v(u, '0101011110010', b);
+
+@pragma('dart2js:noInline')
+f_010_101_111_011_0(Set<String> u, int b) => v(u, '0101011110110', b);
+
+@pragma('dart2js:noInline')
+f_010_101_111_101_0(Set<String> u, int b) => v(u, '0101011111010', b);
+
+@pragma('dart2js:noInline')
+f_010_101_111_111_0(Set<String> u, int b) => v(u, '0101011111110', b);
+
+@pragma('dart2js:noInline')
+f_010_110_000_001_0(Set<String> u, int b) => v(u, '0101100000010', b);
+
+@pragma('dart2js:noInline')
+f_010_110_000_011_0(Set<String> u, int b) => v(u, '0101100000110', b);
+
+@pragma('dart2js:noInline')
+f_010_110_000_101_0(Set<String> u, int b) => v(u, '0101100001010', b);
+
+@pragma('dart2js:noInline')
+f_010_110_000_111_0(Set<String> u, int b) => v(u, '0101100001110', b);
+
+@pragma('dart2js:noInline')
+f_010_110_001_001_0(Set<String> u, int b) => v(u, '0101100010010', b);
+
+@pragma('dart2js:noInline')
+f_010_110_001_011_0(Set<String> u, int b) => v(u, '0101100010110', b);
+
+@pragma('dart2js:noInline')
+f_010_110_001_101_0(Set<String> u, int b) => v(u, '0101100011010', b);
+
+@pragma('dart2js:noInline')
+f_010_110_001_111_0(Set<String> u, int b) => v(u, '0101100011110', b);
+
+@pragma('dart2js:noInline')
+f_010_110_010_001_0(Set<String> u, int b) => v(u, '0101100100010', b);
+
+@pragma('dart2js:noInline')
+f_010_110_010_011_0(Set<String> u, int b) => v(u, '0101100100110', b);
+
+@pragma('dart2js:noInline')
+f_010_110_010_101_0(Set<String> u, int b) => v(u, '0101100101010', b);
+
+@pragma('dart2js:noInline')
+f_010_110_010_111_0(Set<String> u, int b) => v(u, '0101100101110', b);
+
+@pragma('dart2js:noInline')
+f_010_110_011_001_0(Set<String> u, int b) => v(u, '0101100110010', b);
+
+@pragma('dart2js:noInline')
+f_010_110_011_011_0(Set<String> u, int b) => v(u, '0101100110110', b);
+
+@pragma('dart2js:noInline')
+f_010_110_011_101_0(Set<String> u, int b) => v(u, '0101100111010', b);
+
+@pragma('dart2js:noInline')
+f_010_110_011_111_0(Set<String> u, int b) => v(u, '0101100111110', b);
+
+@pragma('dart2js:noInline')
+f_010_110_100_001_0(Set<String> u, int b) => v(u, '0101101000010', b);
+
+@pragma('dart2js:noInline')
+f_010_110_100_011_0(Set<String> u, int b) => v(u, '0101101000110', b);
+
+@pragma('dart2js:noInline')
+f_010_110_100_101_0(Set<String> u, int b) => v(u, '0101101001010', b);
+
+@pragma('dart2js:noInline')
+f_010_110_100_111_0(Set<String> u, int b) => v(u, '0101101001110', b);
+
+@pragma('dart2js:noInline')
+f_010_110_101_001_0(Set<String> u, int b) => v(u, '0101101010010', b);
+
+@pragma('dart2js:noInline')
+f_010_110_101_011_0(Set<String> u, int b) => v(u, '0101101010110', b);
+
+@pragma('dart2js:noInline')
+f_010_110_101_101_0(Set<String> u, int b) => v(u, '0101101011010', b);
+
+@pragma('dart2js:noInline')
+f_010_110_101_111_0(Set<String> u, int b) => v(u, '0101101011110', b);
+
+@pragma('dart2js:noInline')
+f_010_110_110_001_0(Set<String> u, int b) => v(u, '0101101100010', b);
+
+@pragma('dart2js:noInline')
+f_010_110_110_011_0(Set<String> u, int b) => v(u, '0101101100110', b);
+
+@pragma('dart2js:noInline')
+f_010_110_110_101_0(Set<String> u, int b) => v(u, '0101101101010', b);
+
+@pragma('dart2js:noInline')
+f_010_110_110_111_0(Set<String> u, int b) => v(u, '0101101101110', b);
+
+@pragma('dart2js:noInline')
+f_010_110_111_001_0(Set<String> u, int b) => v(u, '0101101110010', b);
+
+@pragma('dart2js:noInline')
+f_010_110_111_011_0(Set<String> u, int b) => v(u, '0101101110110', b);
+
+@pragma('dart2js:noInline')
+f_010_110_111_101_0(Set<String> u, int b) => v(u, '0101101111010', b);
+
+@pragma('dart2js:noInline')
+f_010_110_111_111_0(Set<String> u, int b) => v(u, '0101101111110', b);
+
+@pragma('dart2js:noInline')
+f_010_111_000_001_0(Set<String> u, int b) => v(u, '0101110000010', b);
+
+@pragma('dart2js:noInline')
+f_010_111_000_011_0(Set<String> u, int b) => v(u, '0101110000110', b);
+
+@pragma('dart2js:noInline')
+f_010_111_000_101_0(Set<String> u, int b) => v(u, '0101110001010', b);
+
+@pragma('dart2js:noInline')
+f_010_111_000_111_0(Set<String> u, int b) => v(u, '0101110001110', b);
+
+@pragma('dart2js:noInline')
+f_010_111_001_001_0(Set<String> u, int b) => v(u, '0101110010010', b);
+
+@pragma('dart2js:noInline')
+f_010_111_001_011_0(Set<String> u, int b) => v(u, '0101110010110', b);
+
+@pragma('dart2js:noInline')
+f_010_111_001_101_0(Set<String> u, int b) => v(u, '0101110011010', b);
+
+@pragma('dart2js:noInline')
+f_010_111_001_111_0(Set<String> u, int b) => v(u, '0101110011110', b);
+
+@pragma('dart2js:noInline')
+f_010_111_010_001_0(Set<String> u, int b) => v(u, '0101110100010', b);
+
+@pragma('dart2js:noInline')
+f_010_111_010_011_0(Set<String> u, int b) => v(u, '0101110100110', b);
+
+@pragma('dart2js:noInline')
+f_010_111_010_101_0(Set<String> u, int b) => v(u, '0101110101010', b);
+
+@pragma('dart2js:noInline')
+f_010_111_010_111_0(Set<String> u, int b) => v(u, '0101110101110', b);
+
+@pragma('dart2js:noInline')
+f_010_111_011_001_0(Set<String> u, int b) => v(u, '0101110110010', b);
+
+@pragma('dart2js:noInline')
+f_010_111_011_011_0(Set<String> u, int b) => v(u, '0101110110110', b);
+
+@pragma('dart2js:noInline')
+f_010_111_011_101_0(Set<String> u, int b) => v(u, '0101110111010', b);
+
+@pragma('dart2js:noInline')
+f_010_111_011_111_0(Set<String> u, int b) => v(u, '0101110111110', b);
+
+@pragma('dart2js:noInline')
+f_010_111_100_001_0(Set<String> u, int b) => v(u, '0101111000010', b);
+
+@pragma('dart2js:noInline')
+f_010_111_100_011_0(Set<String> u, int b) => v(u, '0101111000110', b);
+
+@pragma('dart2js:noInline')
+f_010_111_100_101_0(Set<String> u, int b) => v(u, '0101111001010', b);
+
+@pragma('dart2js:noInline')
+f_010_111_100_111_0(Set<String> u, int b) => v(u, '0101111001110', b);
+
+@pragma('dart2js:noInline')
+f_010_111_101_001_0(Set<String> u, int b) => v(u, '0101111010010', b);
+
+@pragma('dart2js:noInline')
+f_010_111_101_011_0(Set<String> u, int b) => v(u, '0101111010110', b);
+
+@pragma('dart2js:noInline')
+f_010_111_101_101_0(Set<String> u, int b) => v(u, '0101111011010', b);
+
+@pragma('dart2js:noInline')
+f_010_111_101_111_0(Set<String> u, int b) => v(u, '0101111011110', b);
+
+@pragma('dart2js:noInline')
+f_010_111_110_001_0(Set<String> u, int b) => v(u, '0101111100010', b);
+
+@pragma('dart2js:noInline')
+f_010_111_110_011_0(Set<String> u, int b) => v(u, '0101111100110', b);
+
+@pragma('dart2js:noInline')
+f_010_111_110_101_0(Set<String> u, int b) => v(u, '0101111101010', b);
+
+@pragma('dart2js:noInline')
+f_010_111_110_111_0(Set<String> u, int b) => v(u, '0101111101110', b);
+
+@pragma('dart2js:noInline')
+f_010_111_111_001_0(Set<String> u, int b) => v(u, '0101111110010', b);
+
+@pragma('dart2js:noInline')
+f_010_111_111_011_0(Set<String> u, int b) => v(u, '0101111110110', b);
+
+@pragma('dart2js:noInline')
+f_010_111_111_101_0(Set<String> u, int b) => v(u, '0101111111010', b);
+
+@pragma('dart2js:noInline')
+f_010_111_111_111_0(Set<String> u, int b) => v(u, '0101111111110', b);
+
+@pragma('dart2js:noInline')
+f_011_000_000_001_0(Set<String> u, int b) => v(u, '0110000000010', b);
+
+@pragma('dart2js:noInline')
+f_011_000_000_011_0(Set<String> u, int b) => v(u, '0110000000110', b);
+
+@pragma('dart2js:noInline')
+f_011_000_000_101_0(Set<String> u, int b) => v(u, '0110000001010', b);
+
+@pragma('dart2js:noInline')
+f_011_000_000_111_0(Set<String> u, int b) => v(u, '0110000001110', b);
+
+@pragma('dart2js:noInline')
+f_011_000_001_001_0(Set<String> u, int b) => v(u, '0110000010010', b);
+
+@pragma('dart2js:noInline')
+f_011_000_001_011_0(Set<String> u, int b) => v(u, '0110000010110', b);
+
+@pragma('dart2js:noInline')
+f_011_000_001_101_0(Set<String> u, int b) => v(u, '0110000011010', b);
+
+@pragma('dart2js:noInline')
+f_011_000_001_111_0(Set<String> u, int b) => v(u, '0110000011110', b);
+
+@pragma('dart2js:noInline')
+f_011_000_010_001_0(Set<String> u, int b) => v(u, '0110000100010', b);
+
+@pragma('dart2js:noInline')
+f_011_000_010_011_0(Set<String> u, int b) => v(u, '0110000100110', b);
+
+@pragma('dart2js:noInline')
+f_011_000_010_101_0(Set<String> u, int b) => v(u, '0110000101010', b);
+
+@pragma('dart2js:noInline')
+f_011_000_010_111_0(Set<String> u, int b) => v(u, '0110000101110', b);
+
+@pragma('dart2js:noInline')
+f_011_000_011_001_0(Set<String> u, int b) => v(u, '0110000110010', b);
+
+@pragma('dart2js:noInline')
+f_011_000_011_011_0(Set<String> u, int b) => v(u, '0110000110110', b);
+
+@pragma('dart2js:noInline')
+f_011_000_011_101_0(Set<String> u, int b) => v(u, '0110000111010', b);
+
+@pragma('dart2js:noInline')
+f_011_000_011_111_0(Set<String> u, int b) => v(u, '0110000111110', b);
+
+@pragma('dart2js:noInline')
+f_011_000_100_001_0(Set<String> u, int b) => v(u, '0110001000010', b);
+
+@pragma('dart2js:noInline')
+f_011_000_100_011_0(Set<String> u, int b) => v(u, '0110001000110', b);
+
+@pragma('dart2js:noInline')
+f_011_000_100_101_0(Set<String> u, int b) => v(u, '0110001001010', b);
+
+@pragma('dart2js:noInline')
+f_011_000_100_111_0(Set<String> u, int b) => v(u, '0110001001110', b);
+
+@pragma('dart2js:noInline')
+f_011_000_101_001_0(Set<String> u, int b) => v(u, '0110001010010', b);
+
+@pragma('dart2js:noInline')
+f_011_000_101_011_0(Set<String> u, int b) => v(u, '0110001010110', b);
+
+@pragma('dart2js:noInline')
+f_011_000_101_101_0(Set<String> u, int b) => v(u, '0110001011010', b);
+
+@pragma('dart2js:noInline')
+f_011_000_101_111_0(Set<String> u, int b) => v(u, '0110001011110', b);
+
+@pragma('dart2js:noInline')
+f_011_000_110_001_0(Set<String> u, int b) => v(u, '0110001100010', b);
+
+@pragma('dart2js:noInline')
+f_011_000_110_011_0(Set<String> u, int b) => v(u, '0110001100110', b);
+
+@pragma('dart2js:noInline')
+f_011_000_110_101_0(Set<String> u, int b) => v(u, '0110001101010', b);
+
+@pragma('dart2js:noInline')
+f_011_000_110_111_0(Set<String> u, int b) => v(u, '0110001101110', b);
+
+@pragma('dart2js:noInline')
+f_011_000_111_001_0(Set<String> u, int b) => v(u, '0110001110010', b);
+
+@pragma('dart2js:noInline')
+f_011_000_111_011_0(Set<String> u, int b) => v(u, '0110001110110', b);
+
+@pragma('dart2js:noInline')
+f_011_000_111_101_0(Set<String> u, int b) => v(u, '0110001111010', b);
+
+@pragma('dart2js:noInline')
+f_011_000_111_111_0(Set<String> u, int b) => v(u, '0110001111110', b);
+
+@pragma('dart2js:noInline')
+f_011_001_000_001_0(Set<String> u, int b) => v(u, '0110010000010', b);
+
+@pragma('dart2js:noInline')
+f_011_001_000_011_0(Set<String> u, int b) => v(u, '0110010000110', b);
+
+@pragma('dart2js:noInline')
+f_011_001_000_101_0(Set<String> u, int b) => v(u, '0110010001010', b);
+
+@pragma('dart2js:noInline')
+f_011_001_000_111_0(Set<String> u, int b) => v(u, '0110010001110', b);
+
+@pragma('dart2js:noInline')
+f_011_001_001_001_0(Set<String> u, int b) => v(u, '0110010010010', b);
+
+@pragma('dart2js:noInline')
+f_011_001_001_011_0(Set<String> u, int b) => v(u, '0110010010110', b);
+
+@pragma('dart2js:noInline')
+f_011_001_001_101_0(Set<String> u, int b) => v(u, '0110010011010', b);
+
+@pragma('dart2js:noInline')
+f_011_001_001_111_0(Set<String> u, int b) => v(u, '0110010011110', b);
+
+@pragma('dart2js:noInline')
+f_011_001_010_001_0(Set<String> u, int b) => v(u, '0110010100010', b);
+
+@pragma('dart2js:noInline')
+f_011_001_010_011_0(Set<String> u, int b) => v(u, '0110010100110', b);
+
+@pragma('dart2js:noInline')
+f_011_001_010_101_0(Set<String> u, int b) => v(u, '0110010101010', b);
+
+@pragma('dart2js:noInline')
+f_011_001_010_111_0(Set<String> u, int b) => v(u, '0110010101110', b);
+
+@pragma('dart2js:noInline')
+f_011_001_011_001_0(Set<String> u, int b) => v(u, '0110010110010', b);
+
+@pragma('dart2js:noInline')
+f_011_001_011_011_0(Set<String> u, int b) => v(u, '0110010110110', b);
+
+@pragma('dart2js:noInline')
+f_011_001_011_101_0(Set<String> u, int b) => v(u, '0110010111010', b);
+
+@pragma('dart2js:noInline')
+f_011_001_011_111_0(Set<String> u, int b) => v(u, '0110010111110', b);
+
+@pragma('dart2js:noInline')
+f_011_001_100_001_0(Set<String> u, int b) => v(u, '0110011000010', b);
+
+@pragma('dart2js:noInline')
+f_011_001_100_011_0(Set<String> u, int b) => v(u, '0110011000110', b);
+
+@pragma('dart2js:noInline')
+f_011_001_100_101_0(Set<String> u, int b) => v(u, '0110011001010', b);
+
+@pragma('dart2js:noInline')
+f_011_001_100_111_0(Set<String> u, int b) => v(u, '0110011001110', b);
+
+@pragma('dart2js:noInline')
+f_011_001_101_001_0(Set<String> u, int b) => v(u, '0110011010010', b);
+
+@pragma('dart2js:noInline')
+f_011_001_101_011_0(Set<String> u, int b) => v(u, '0110011010110', b);
+
+@pragma('dart2js:noInline')
+f_011_001_101_101_0(Set<String> u, int b) => v(u, '0110011011010', b);
+
+@pragma('dart2js:noInline')
+f_011_001_101_111_0(Set<String> u, int b) => v(u, '0110011011110', b);
+
+@pragma('dart2js:noInline')
+f_011_001_110_001_0(Set<String> u, int b) => v(u, '0110011100010', b);
+
+@pragma('dart2js:noInline')
+f_011_001_110_011_0(Set<String> u, int b) => v(u, '0110011100110', b);
+
+@pragma('dart2js:noInline')
+f_011_001_110_101_0(Set<String> u, int b) => v(u, '0110011101010', b);
+
+@pragma('dart2js:noInline')
+f_011_001_110_111_0(Set<String> u, int b) => v(u, '0110011101110', b);
+
+@pragma('dart2js:noInline')
+f_011_001_111_001_0(Set<String> u, int b) => v(u, '0110011110010', b);
+
+@pragma('dart2js:noInline')
+f_011_001_111_011_0(Set<String> u, int b) => v(u, '0110011110110', b);
+
+@pragma('dart2js:noInline')
+f_011_001_111_101_0(Set<String> u, int b) => v(u, '0110011111010', b);
+
+@pragma('dart2js:noInline')
+f_011_001_111_111_0(Set<String> u, int b) => v(u, '0110011111110', b);
+
+@pragma('dart2js:noInline')
+f_011_010_000_001_0(Set<String> u, int b) => v(u, '0110100000010', b);
+
+@pragma('dart2js:noInline')
+f_011_010_000_011_0(Set<String> u, int b) => v(u, '0110100000110', b);
+
+@pragma('dart2js:noInline')
+f_011_010_000_101_0(Set<String> u, int b) => v(u, '0110100001010', b);
+
+@pragma('dart2js:noInline')
+f_011_010_000_111_0(Set<String> u, int b) => v(u, '0110100001110', b);
+
+@pragma('dart2js:noInline')
+f_011_010_001_001_0(Set<String> u, int b) => v(u, '0110100010010', b);
+
+@pragma('dart2js:noInline')
+f_011_010_001_011_0(Set<String> u, int b) => v(u, '0110100010110', b);
+
+@pragma('dart2js:noInline')
+f_011_010_001_101_0(Set<String> u, int b) => v(u, '0110100011010', b);
+
+@pragma('dart2js:noInline')
+f_011_010_001_111_0(Set<String> u, int b) => v(u, '0110100011110', b);
+
+@pragma('dart2js:noInline')
+f_011_010_010_001_0(Set<String> u, int b) => v(u, '0110100100010', b);
+
+@pragma('dart2js:noInline')
+f_011_010_010_011_0(Set<String> u, int b) => v(u, '0110100100110', b);
+
+@pragma('dart2js:noInline')
+f_011_010_010_101_0(Set<String> u, int b) => v(u, '0110100101010', b);
+
+@pragma('dart2js:noInline')
+f_011_010_010_111_0(Set<String> u, int b) => v(u, '0110100101110', b);
+
+@pragma('dart2js:noInline')
+f_011_010_011_001_0(Set<String> u, int b) => v(u, '0110100110010', b);
+
+@pragma('dart2js:noInline')
+f_011_010_011_011_0(Set<String> u, int b) => v(u, '0110100110110', b);
+
+@pragma('dart2js:noInline')
+f_011_010_011_101_0(Set<String> u, int b) => v(u, '0110100111010', b);
+
+@pragma('dart2js:noInline')
+f_011_010_011_111_0(Set<String> u, int b) => v(u, '0110100111110', b);
+
+@pragma('dart2js:noInline')
+f_011_010_100_001_0(Set<String> u, int b) => v(u, '0110101000010', b);
+
+@pragma('dart2js:noInline')
+f_011_010_100_011_0(Set<String> u, int b) => v(u, '0110101000110', b);
+
+@pragma('dart2js:noInline')
+f_011_010_100_101_0(Set<String> u, int b) => v(u, '0110101001010', b);
+
+@pragma('dart2js:noInline')
+f_011_010_100_111_0(Set<String> u, int b) => v(u, '0110101001110', b);
+
+@pragma('dart2js:noInline')
+f_011_010_101_001_0(Set<String> u, int b) => v(u, '0110101010010', b);
+
+@pragma('dart2js:noInline')
+f_011_010_101_011_0(Set<String> u, int b) => v(u, '0110101010110', b);
+
+@pragma('dart2js:noInline')
+f_011_010_101_101_0(Set<String> u, int b) => v(u, '0110101011010', b);
+
+@pragma('dart2js:noInline')
+f_011_010_101_111_0(Set<String> u, int b) => v(u, '0110101011110', b);
+
+@pragma('dart2js:noInline')
+f_011_010_110_001_0(Set<String> u, int b) => v(u, '0110101100010', b);
+
+@pragma('dart2js:noInline')
+f_011_010_110_011_0(Set<String> u, int b) => v(u, '0110101100110', b);
+
+@pragma('dart2js:noInline')
+f_011_010_110_101_0(Set<String> u, int b) => v(u, '0110101101010', b);
+
+@pragma('dart2js:noInline')
+f_011_010_110_111_0(Set<String> u, int b) => v(u, '0110101101110', b);
+
+@pragma('dart2js:noInline')
+f_011_010_111_001_0(Set<String> u, int b) => v(u, '0110101110010', b);
+
+@pragma('dart2js:noInline')
+f_011_010_111_011_0(Set<String> u, int b) => v(u, '0110101110110', b);
+
+@pragma('dart2js:noInline')
+f_011_010_111_101_0(Set<String> u, int b) => v(u, '0110101111010', b);
+
+@pragma('dart2js:noInline')
+f_011_010_111_111_0(Set<String> u, int b) => v(u, '0110101111110', b);
+
+@pragma('dart2js:noInline')
+f_011_011_000_001_0(Set<String> u, int b) => v(u, '0110110000010', b);
+
+@pragma('dart2js:noInline')
+f_011_011_000_011_0(Set<String> u, int b) => v(u, '0110110000110', b);
+
+@pragma('dart2js:noInline')
+f_011_011_000_101_0(Set<String> u, int b) => v(u, '0110110001010', b);
+
+@pragma('dart2js:noInline')
+f_011_011_000_111_0(Set<String> u, int b) => v(u, '0110110001110', b);
+
+@pragma('dart2js:noInline')
+f_011_011_001_001_0(Set<String> u, int b) => v(u, '0110110010010', b);
+
+@pragma('dart2js:noInline')
+f_011_011_001_011_0(Set<String> u, int b) => v(u, '0110110010110', b);
+
+@pragma('dart2js:noInline')
+f_011_011_001_101_0(Set<String> u, int b) => v(u, '0110110011010', b);
+
+@pragma('dart2js:noInline')
+f_011_011_001_111_0(Set<String> u, int b) => v(u, '0110110011110', b);
+
+@pragma('dart2js:noInline')
+f_011_011_010_001_0(Set<String> u, int b) => v(u, '0110110100010', b);
+
+@pragma('dart2js:noInline')
+f_011_011_010_011_0(Set<String> u, int b) => v(u, '0110110100110', b);
+
+@pragma('dart2js:noInline')
+f_011_011_010_101_0(Set<String> u, int b) => v(u, '0110110101010', b);
+
+@pragma('dart2js:noInline')
+f_011_011_010_111_0(Set<String> u, int b) => v(u, '0110110101110', b);
+
+@pragma('dart2js:noInline')
+f_011_011_011_001_0(Set<String> u, int b) => v(u, '0110110110010', b);
+
+@pragma('dart2js:noInline')
+f_011_011_011_011_0(Set<String> u, int b) => v(u, '0110110110110', b);
+
+@pragma('dart2js:noInline')
+f_011_011_011_101_0(Set<String> u, int b) => v(u, '0110110111010', b);
+
+@pragma('dart2js:noInline')
+f_011_011_011_111_0(Set<String> u, int b) => v(u, '0110110111110', b);
+
+@pragma('dart2js:noInline')
+f_011_011_100_001_0(Set<String> u, int b) => v(u, '0110111000010', b);
+
+@pragma('dart2js:noInline')
+f_011_011_100_011_0(Set<String> u, int b) => v(u, '0110111000110', b);
+
+@pragma('dart2js:noInline')
+f_011_011_100_101_0(Set<String> u, int b) => v(u, '0110111001010', b);
+
+@pragma('dart2js:noInline')
+f_011_011_100_111_0(Set<String> u, int b) => v(u, '0110111001110', b);
+
+@pragma('dart2js:noInline')
+f_011_011_101_001_0(Set<String> u, int b) => v(u, '0110111010010', b);
+
+@pragma('dart2js:noInline')
+f_011_011_101_011_0(Set<String> u, int b) => v(u, '0110111010110', b);
+
+@pragma('dart2js:noInline')
+f_011_011_101_101_0(Set<String> u, int b) => v(u, '0110111011010', b);
+
+@pragma('dart2js:noInline')
+f_011_011_101_111_0(Set<String> u, int b) => v(u, '0110111011110', b);
+
+@pragma('dart2js:noInline')
+f_011_011_110_001_0(Set<String> u, int b) => v(u, '0110111100010', b);
+
+@pragma('dart2js:noInline')
+f_011_011_110_011_0(Set<String> u, int b) => v(u, '0110111100110', b);
+
+@pragma('dart2js:noInline')
+f_011_011_110_101_0(Set<String> u, int b) => v(u, '0110111101010', b);
+
+@pragma('dart2js:noInline')
+f_011_011_110_111_0(Set<String> u, int b) => v(u, '0110111101110', b);
+
+@pragma('dart2js:noInline')
+f_011_011_111_001_0(Set<String> u, int b) => v(u, '0110111110010', b);
+
+@pragma('dart2js:noInline')
+f_011_011_111_011_0(Set<String> u, int b) => v(u, '0110111110110', b);
+
+@pragma('dart2js:noInline')
+f_011_011_111_101_0(Set<String> u, int b) => v(u, '0110111111010', b);
+
+@pragma('dart2js:noInline')
+f_011_011_111_111_0(Set<String> u, int b) => v(u, '0110111111110', b);
+
+@pragma('dart2js:noInline')
+f_011_100_000_001_0(Set<String> u, int b) => v(u, '0111000000010', b);
+
+@pragma('dart2js:noInline')
+f_011_100_000_011_0(Set<String> u, int b) => v(u, '0111000000110', b);
+
+@pragma('dart2js:noInline')
+f_011_100_000_101_0(Set<String> u, int b) => v(u, '0111000001010', b);
+
+@pragma('dart2js:noInline')
+f_011_100_000_111_0(Set<String> u, int b) => v(u, '0111000001110', b);
+
+@pragma('dart2js:noInline')
+f_011_100_001_001_0(Set<String> u, int b) => v(u, '0111000010010', b);
+
+@pragma('dart2js:noInline')
+f_011_100_001_011_0(Set<String> u, int b) => v(u, '0111000010110', b);
+
+@pragma('dart2js:noInline')
+f_011_100_001_101_0(Set<String> u, int b) => v(u, '0111000011010', b);
+
+@pragma('dart2js:noInline')
+f_011_100_001_111_0(Set<String> u, int b) => v(u, '0111000011110', b);
+
+@pragma('dart2js:noInline')
+f_011_100_010_001_0(Set<String> u, int b) => v(u, '0111000100010', b);
+
+@pragma('dart2js:noInline')
+f_011_100_010_011_0(Set<String> u, int b) => v(u, '0111000100110', b);
+
+@pragma('dart2js:noInline')
+f_011_100_010_101_0(Set<String> u, int b) => v(u, '0111000101010', b);
+
+@pragma('dart2js:noInline')
+f_011_100_010_111_0(Set<String> u, int b) => v(u, '0111000101110', b);
+
+@pragma('dart2js:noInline')
+f_011_100_011_001_0(Set<String> u, int b) => v(u, '0111000110010', b);
+
+@pragma('dart2js:noInline')
+f_011_100_011_011_0(Set<String> u, int b) => v(u, '0111000110110', b);
+
+@pragma('dart2js:noInline')
+f_011_100_011_101_0(Set<String> u, int b) => v(u, '0111000111010', b);
+
+@pragma('dart2js:noInline')
+f_011_100_011_111_0(Set<String> u, int b) => v(u, '0111000111110', b);
+
+@pragma('dart2js:noInline')
+f_011_100_100_001_0(Set<String> u, int b) => v(u, '0111001000010', b);
+
+@pragma('dart2js:noInline')
+f_011_100_100_011_0(Set<String> u, int b) => v(u, '0111001000110', b);
+
+@pragma('dart2js:noInline')
+f_011_100_100_101_0(Set<String> u, int b) => v(u, '0111001001010', b);
+
+@pragma('dart2js:noInline')
+f_011_100_100_111_0(Set<String> u, int b) => v(u, '0111001001110', b);
+
+@pragma('dart2js:noInline')
+f_011_100_101_001_0(Set<String> u, int b) => v(u, '0111001010010', b);
+
+@pragma('dart2js:noInline')
+f_011_100_101_011_0(Set<String> u, int b) => v(u, '0111001010110', b);
+
+@pragma('dart2js:noInline')
+f_011_100_101_101_0(Set<String> u, int b) => v(u, '0111001011010', b);
+
+@pragma('dart2js:noInline')
+f_011_100_101_111_0(Set<String> u, int b) => v(u, '0111001011110', b);
+
+@pragma('dart2js:noInline')
+f_011_100_110_001_0(Set<String> u, int b) => v(u, '0111001100010', b);
+
+@pragma('dart2js:noInline')
+f_011_100_110_011_0(Set<String> u, int b) => v(u, '0111001100110', b);
+
+@pragma('dart2js:noInline')
+f_011_100_110_101_0(Set<String> u, int b) => v(u, '0111001101010', b);
+
+@pragma('dart2js:noInline')
+f_011_100_110_111_0(Set<String> u, int b) => v(u, '0111001101110', b);
+
+@pragma('dart2js:noInline')
+f_011_100_111_001_0(Set<String> u, int b) => v(u, '0111001110010', b);
+
+@pragma('dart2js:noInline')
+f_011_100_111_011_0(Set<String> u, int b) => v(u, '0111001110110', b);
+
+@pragma('dart2js:noInline')
+f_011_100_111_101_0(Set<String> u, int b) => v(u, '0111001111010', b);
+
+@pragma('dart2js:noInline')
+f_011_100_111_111_0(Set<String> u, int b) => v(u, '0111001111110', b);
+
+@pragma('dart2js:noInline')
+f_011_101_000_001_0(Set<String> u, int b) => v(u, '0111010000010', b);
+
+@pragma('dart2js:noInline')
+f_011_101_000_011_0(Set<String> u, int b) => v(u, '0111010000110', b);
+
+@pragma('dart2js:noInline')
+f_011_101_000_101_0(Set<String> u, int b) => v(u, '0111010001010', b);
+
+@pragma('dart2js:noInline')
+f_011_101_000_111_0(Set<String> u, int b) => v(u, '0111010001110', b);
+
+@pragma('dart2js:noInline')
+f_011_101_001_001_0(Set<String> u, int b) => v(u, '0111010010010', b);
+
+@pragma('dart2js:noInline')
+f_011_101_001_011_0(Set<String> u, int b) => v(u, '0111010010110', b);
+
+@pragma('dart2js:noInline')
+f_011_101_001_101_0(Set<String> u, int b) => v(u, '0111010011010', b);
+
+@pragma('dart2js:noInline')
+f_011_101_001_111_0(Set<String> u, int b) => v(u, '0111010011110', b);
+
+@pragma('dart2js:noInline')
+f_011_101_010_001_0(Set<String> u, int b) => v(u, '0111010100010', b);
+
+@pragma('dart2js:noInline')
+f_011_101_010_011_0(Set<String> u, int b) => v(u, '0111010100110', b);
+
+@pragma('dart2js:noInline')
+f_011_101_010_101_0(Set<String> u, int b) => v(u, '0111010101010', b);
+
+@pragma('dart2js:noInline')
+f_011_101_010_111_0(Set<String> u, int b) => v(u, '0111010101110', b);
+
+@pragma('dart2js:noInline')
+f_011_101_011_001_0(Set<String> u, int b) => v(u, '0111010110010', b);
+
+@pragma('dart2js:noInline')
+f_011_101_011_011_0(Set<String> u, int b) => v(u, '0111010110110', b);
+
+@pragma('dart2js:noInline')
+f_011_101_011_101_0(Set<String> u, int b) => v(u, '0111010111010', b);
+
+@pragma('dart2js:noInline')
+f_011_101_011_111_0(Set<String> u, int b) => v(u, '0111010111110', b);
+
+@pragma('dart2js:noInline')
+f_011_101_100_001_0(Set<String> u, int b) => v(u, '0111011000010', b);
+
+@pragma('dart2js:noInline')
+f_011_101_100_011_0(Set<String> u, int b) => v(u, '0111011000110', b);
+
+@pragma('dart2js:noInline')
+f_011_101_100_101_0(Set<String> u, int b) => v(u, '0111011001010', b);
+
+@pragma('dart2js:noInline')
+f_011_101_100_111_0(Set<String> u, int b) => v(u, '0111011001110', b);
+
+@pragma('dart2js:noInline')
+f_011_101_101_001_0(Set<String> u, int b) => v(u, '0111011010010', b);
+
+@pragma('dart2js:noInline')
+f_011_101_101_011_0(Set<String> u, int b) => v(u, '0111011010110', b);
+
+@pragma('dart2js:noInline')
+f_011_101_101_101_0(Set<String> u, int b) => v(u, '0111011011010', b);
+
+@pragma('dart2js:noInline')
+f_011_101_101_111_0(Set<String> u, int b) => v(u, '0111011011110', b);
+
+@pragma('dart2js:noInline')
+f_011_101_110_001_0(Set<String> u, int b) => v(u, '0111011100010', b);
+
+@pragma('dart2js:noInline')
+f_011_101_110_011_0(Set<String> u, int b) => v(u, '0111011100110', b);
+
+@pragma('dart2js:noInline')
+f_011_101_110_101_0(Set<String> u, int b) => v(u, '0111011101010', b);
+
+@pragma('dart2js:noInline')
+f_011_101_110_111_0(Set<String> u, int b) => v(u, '0111011101110', b);
+
+@pragma('dart2js:noInline')
+f_011_101_111_001_0(Set<String> u, int b) => v(u, '0111011110010', b);
+
+@pragma('dart2js:noInline')
+f_011_101_111_011_0(Set<String> u, int b) => v(u, '0111011110110', b);
+
+@pragma('dart2js:noInline')
+f_011_101_111_101_0(Set<String> u, int b) => v(u, '0111011111010', b);
+
+@pragma('dart2js:noInline')
+f_011_101_111_111_0(Set<String> u, int b) => v(u, '0111011111110', b);
+
+@pragma('dart2js:noInline')
+f_011_110_000_001_0(Set<String> u, int b) => v(u, '0111100000010', b);
+
+@pragma('dart2js:noInline')
+f_011_110_000_011_0(Set<String> u, int b) => v(u, '0111100000110', b);
+
+@pragma('dart2js:noInline')
+f_011_110_000_101_0(Set<String> u, int b) => v(u, '0111100001010', b);
+
+@pragma('dart2js:noInline')
+f_011_110_000_111_0(Set<String> u, int b) => v(u, '0111100001110', b);
+
+@pragma('dart2js:noInline')
+f_011_110_001_001_0(Set<String> u, int b) => v(u, '0111100010010', b);
+
+@pragma('dart2js:noInline')
+f_011_110_001_011_0(Set<String> u, int b) => v(u, '0111100010110', b);
+
+@pragma('dart2js:noInline')
+f_011_110_001_101_0(Set<String> u, int b) => v(u, '0111100011010', b);
+
+@pragma('dart2js:noInline')
+f_011_110_001_111_0(Set<String> u, int b) => v(u, '0111100011110', b);
+
+@pragma('dart2js:noInline')
+f_011_110_010_001_0(Set<String> u, int b) => v(u, '0111100100010', b);
+
+@pragma('dart2js:noInline')
+f_011_110_010_011_0(Set<String> u, int b) => v(u, '0111100100110', b);
+
+@pragma('dart2js:noInline')
+f_011_110_010_101_0(Set<String> u, int b) => v(u, '0111100101010', b);
+
+@pragma('dart2js:noInline')
+f_011_110_010_111_0(Set<String> u, int b) => v(u, '0111100101110', b);
+
+@pragma('dart2js:noInline')
+f_011_110_011_001_0(Set<String> u, int b) => v(u, '0111100110010', b);
+
+@pragma('dart2js:noInline')
+f_011_110_011_011_0(Set<String> u, int b) => v(u, '0111100110110', b);
+
+@pragma('dart2js:noInline')
+f_011_110_011_101_0(Set<String> u, int b) => v(u, '0111100111010', b);
+
+@pragma('dart2js:noInline')
+f_011_110_011_111_0(Set<String> u, int b) => v(u, '0111100111110', b);
+
+@pragma('dart2js:noInline')
+f_011_110_100_001_0(Set<String> u, int b) => v(u, '0111101000010', b);
+
+@pragma('dart2js:noInline')
+f_011_110_100_011_0(Set<String> u, int b) => v(u, '0111101000110', b);
+
+@pragma('dart2js:noInline')
+f_011_110_100_101_0(Set<String> u, int b) => v(u, '0111101001010', b);
+
+@pragma('dart2js:noInline')
+f_011_110_100_111_0(Set<String> u, int b) => v(u, '0111101001110', b);
+
+@pragma('dart2js:noInline')
+f_011_110_101_001_0(Set<String> u, int b) => v(u, '0111101010010', b);
+
+@pragma('dart2js:noInline')
+f_011_110_101_011_0(Set<String> u, int b) => v(u, '0111101010110', b);
+
+@pragma('dart2js:noInline')
+f_011_110_101_101_0(Set<String> u, int b) => v(u, '0111101011010', b);
+
+@pragma('dart2js:noInline')
+f_011_110_101_111_0(Set<String> u, int b) => v(u, '0111101011110', b);
+
+@pragma('dart2js:noInline')
+f_011_110_110_001_0(Set<String> u, int b) => v(u, '0111101100010', b);
+
+@pragma('dart2js:noInline')
+f_011_110_110_011_0(Set<String> u, int b) => v(u, '0111101100110', b);
+
+@pragma('dart2js:noInline')
+f_011_110_110_101_0(Set<String> u, int b) => v(u, '0111101101010', b);
+
+@pragma('dart2js:noInline')
+f_011_110_110_111_0(Set<String> u, int b) => v(u, '0111101101110', b);
+
+@pragma('dart2js:noInline')
+f_011_110_111_001_0(Set<String> u, int b) => v(u, '0111101110010', b);
+
+@pragma('dart2js:noInline')
+f_011_110_111_011_0(Set<String> u, int b) => v(u, '0111101110110', b);
+
+@pragma('dart2js:noInline')
+f_011_110_111_101_0(Set<String> u, int b) => v(u, '0111101111010', b);
+
+@pragma('dart2js:noInline')
+f_011_110_111_111_0(Set<String> u, int b) => v(u, '0111101111110', b);
+
+@pragma('dart2js:noInline')
+f_011_111_000_001_0(Set<String> u, int b) => v(u, '0111110000010', b);
+
+@pragma('dart2js:noInline')
+f_011_111_000_011_0(Set<String> u, int b) => v(u, '0111110000110', b);
+
+@pragma('dart2js:noInline')
+f_011_111_000_101_0(Set<String> u, int b) => v(u, '0111110001010', b);
+
+@pragma('dart2js:noInline')
+f_011_111_000_111_0(Set<String> u, int b) => v(u, '0111110001110', b);
+
+@pragma('dart2js:noInline')
+f_011_111_001_001_0(Set<String> u, int b) => v(u, '0111110010010', b);
+
+@pragma('dart2js:noInline')
+f_011_111_001_011_0(Set<String> u, int b) => v(u, '0111110010110', b);
+
+@pragma('dart2js:noInline')
+f_011_111_001_101_0(Set<String> u, int b) => v(u, '0111110011010', b);
+
+@pragma('dart2js:noInline')
+f_011_111_001_111_0(Set<String> u, int b) => v(u, '0111110011110', b);
+
+@pragma('dart2js:noInline')
+f_011_111_010_001_0(Set<String> u, int b) => v(u, '0111110100010', b);
+
+@pragma('dart2js:noInline')
+f_011_111_010_011_0(Set<String> u, int b) => v(u, '0111110100110', b);
+
+@pragma('dart2js:noInline')
+f_011_111_010_101_0(Set<String> u, int b) => v(u, '0111110101010', b);
+
+@pragma('dart2js:noInline')
+f_011_111_010_111_0(Set<String> u, int b) => v(u, '0111110101110', b);
+
+@pragma('dart2js:noInline')
+f_011_111_011_001_0(Set<String> u, int b) => v(u, '0111110110010', b);
+
+@pragma('dart2js:noInline')
+f_011_111_011_011_0(Set<String> u, int b) => v(u, '0111110110110', b);
+
+@pragma('dart2js:noInline')
+f_011_111_011_101_0(Set<String> u, int b) => v(u, '0111110111010', b);
+
+@pragma('dart2js:noInline')
+f_011_111_011_111_0(Set<String> u, int b) => v(u, '0111110111110', b);
+
+@pragma('dart2js:noInline')
+f_011_111_100_001_0(Set<String> u, int b) => v(u, '0111111000010', b);
+
+@pragma('dart2js:noInline')
+f_011_111_100_011_0(Set<String> u, int b) => v(u, '0111111000110', b);
+
+@pragma('dart2js:noInline')
+f_011_111_100_101_0(Set<String> u, int b) => v(u, '0111111001010', b);
+
+@pragma('dart2js:noInline')
+f_011_111_100_111_0(Set<String> u, int b) => v(u, '0111111001110', b);
+
+@pragma('dart2js:noInline')
+f_011_111_101_001_0(Set<String> u, int b) => v(u, '0111111010010', b);
+
+@pragma('dart2js:noInline')
+f_011_111_101_011_0(Set<String> u, int b) => v(u, '0111111010110', b);
+
+@pragma('dart2js:noInline')
+f_011_111_101_101_0(Set<String> u, int b) => v(u, '0111111011010', b);
+
+@pragma('dart2js:noInline')
+f_011_111_101_111_0(Set<String> u, int b) => v(u, '0111111011110', b);
+
+@pragma('dart2js:noInline')
+f_011_111_110_001_0(Set<String> u, int b) => v(u, '0111111100010', b);
+
+@pragma('dart2js:noInline')
+f_011_111_110_011_0(Set<String> u, int b) => v(u, '0111111100110', b);
+
+@pragma('dart2js:noInline')
+f_011_111_110_101_0(Set<String> u, int b) => v(u, '0111111101010', b);
+
+@pragma('dart2js:noInline')
+f_011_111_110_111_0(Set<String> u, int b) => v(u, '0111111101110', b);
+
+@pragma('dart2js:noInline')
+f_011_111_111_001_0(Set<String> u, int b) => v(u, '0111111110010', b);
+
+@pragma('dart2js:noInline')
+f_011_111_111_011_0(Set<String> u, int b) => v(u, '0111111110110', b);
+
+@pragma('dart2js:noInline')
+f_011_111_111_101_0(Set<String> u, int b) => v(u, '0111111111010', b);
+
+@pragma('dart2js:noInline')
+f_011_111_111_111_0(Set<String> u, int b) => v(u, '0111111111110', b);
+
+@pragma('dart2js:noInline')
+f_100_000_000_001_0(Set<String> u, int b) => v(u, '1000000000010', b);
+
+@pragma('dart2js:noInline')
+f_100_000_000_011_0(Set<String> u, int b) => v(u, '1000000000110', b);
+
+@pragma('dart2js:noInline')
+f_100_000_000_101_0(Set<String> u, int b) => v(u, '1000000001010', b);
+
+@pragma('dart2js:noInline')
+f_100_000_000_111_0(Set<String> u, int b) => v(u, '1000000001110', b);
+
+@pragma('dart2js:noInline')
+f_100_000_001_001_0(Set<String> u, int b) => v(u, '1000000010010', b);
+
+@pragma('dart2js:noInline')
+f_100_000_001_011_0(Set<String> u, int b) => v(u, '1000000010110', b);
+
+@pragma('dart2js:noInline')
+f_100_000_001_101_0(Set<String> u, int b) => v(u, '1000000011010', b);
+
+@pragma('dart2js:noInline')
+f_100_000_001_111_0(Set<String> u, int b) => v(u, '1000000011110', b);
+
+@pragma('dart2js:noInline')
+f_100_000_010_001_0(Set<String> u, int b) => v(u, '1000000100010', b);
+
+@pragma('dart2js:noInline')
+f_100_000_010_011_0(Set<String> u, int b) => v(u, '1000000100110', b);
+
+@pragma('dart2js:noInline')
+f_100_000_010_101_0(Set<String> u, int b) => v(u, '1000000101010', b);
+
+@pragma('dart2js:noInline')
+f_100_000_010_111_0(Set<String> u, int b) => v(u, '1000000101110', b);
+
+@pragma('dart2js:noInline')
+f_100_000_011_001_0(Set<String> u, int b) => v(u, '1000000110010', b);
+
+@pragma('dart2js:noInline')
+f_100_000_011_011_0(Set<String> u, int b) => v(u, '1000000110110', b);
+
+@pragma('dart2js:noInline')
+f_100_000_011_101_0(Set<String> u, int b) => v(u, '1000000111010', b);
+
+@pragma('dart2js:noInline')
+f_100_000_011_111_0(Set<String> u, int b) => v(u, '1000000111110', b);
+
+@pragma('dart2js:noInline')
+f_100_000_100_001_0(Set<String> u, int b) => v(u, '1000001000010', b);
+
+@pragma('dart2js:noInline')
+f_100_000_100_011_0(Set<String> u, int b) => v(u, '1000001000110', b);
+
+@pragma('dart2js:noInline')
+f_100_000_100_101_0(Set<String> u, int b) => v(u, '1000001001010', b);
+
+@pragma('dart2js:noInline')
+f_100_000_100_111_0(Set<String> u, int b) => v(u, '1000001001110', b);
+
+@pragma('dart2js:noInline')
+f_100_000_101_001_0(Set<String> u, int b) => v(u, '1000001010010', b);
+
+@pragma('dart2js:noInline')
+f_100_000_101_011_0(Set<String> u, int b) => v(u, '1000001010110', b);
+
+@pragma('dart2js:noInline')
+f_100_000_101_101_0(Set<String> u, int b) => v(u, '1000001011010', b);
+
+@pragma('dart2js:noInline')
+f_100_000_101_111_0(Set<String> u, int b) => v(u, '1000001011110', b);
+
+@pragma('dart2js:noInline')
+f_100_000_110_001_0(Set<String> u, int b) => v(u, '1000001100010', b);
+
+@pragma('dart2js:noInline')
+f_100_000_110_011_0(Set<String> u, int b) => v(u, '1000001100110', b);
+
+@pragma('dart2js:noInline')
+f_100_000_110_101_0(Set<String> u, int b) => v(u, '1000001101010', b);
+
+@pragma('dart2js:noInline')
+f_100_000_110_111_0(Set<String> u, int b) => v(u, '1000001101110', b);
+
+@pragma('dart2js:noInline')
+f_100_000_111_001_0(Set<String> u, int b) => v(u, '1000001110010', b);
+
+@pragma('dart2js:noInline')
+f_100_000_111_011_0(Set<String> u, int b) => v(u, '1000001110110', b);
+
+@pragma('dart2js:noInline')
+f_100_000_111_101_0(Set<String> u, int b) => v(u, '1000001111010', b);
+
+@pragma('dart2js:noInline')
+f_100_000_111_111_0(Set<String> u, int b) => v(u, '1000001111110', b);
+
+@pragma('dart2js:noInline')
+f_100_001_000_001_0(Set<String> u, int b) => v(u, '1000010000010', b);
+
+@pragma('dart2js:noInline')
+f_100_001_000_011_0(Set<String> u, int b) => v(u, '1000010000110', b);
+
+@pragma('dart2js:noInline')
+f_100_001_000_101_0(Set<String> u, int b) => v(u, '1000010001010', b);
+
+@pragma('dart2js:noInline')
+f_100_001_000_111_0(Set<String> u, int b) => v(u, '1000010001110', b);
+
+@pragma('dart2js:noInline')
+f_100_001_001_001_0(Set<String> u, int b) => v(u, '1000010010010', b);
+
+@pragma('dart2js:noInline')
+f_100_001_001_011_0(Set<String> u, int b) => v(u, '1000010010110', b);
+
+@pragma('dart2js:noInline')
+f_100_001_001_101_0(Set<String> u, int b) => v(u, '1000010011010', b);
+
+@pragma('dart2js:noInline')
+f_100_001_001_111_0(Set<String> u, int b) => v(u, '1000010011110', b);
+
+@pragma('dart2js:noInline')
+f_100_001_010_001_0(Set<String> u, int b) => v(u, '1000010100010', b);
+
+@pragma('dart2js:noInline')
+f_100_001_010_011_0(Set<String> u, int b) => v(u, '1000010100110', b);
+
+@pragma('dart2js:noInline')
+f_100_001_010_101_0(Set<String> u, int b) => v(u, '1000010101010', b);
+
+@pragma('dart2js:noInline')
+f_100_001_010_111_0(Set<String> u, int b) => v(u, '1000010101110', b);
+
+@pragma('dart2js:noInline')
+f_100_001_011_001_0(Set<String> u, int b) => v(u, '1000010110010', b);
+
+@pragma('dart2js:noInline')
+f_100_001_011_011_0(Set<String> u, int b) => v(u, '1000010110110', b);
+
+@pragma('dart2js:noInline')
+f_100_001_011_101_0(Set<String> u, int b) => v(u, '1000010111010', b);
+
+@pragma('dart2js:noInline')
+f_100_001_011_111_0(Set<String> u, int b) => v(u, '1000010111110', b);
+
+@pragma('dart2js:noInline')
+f_100_001_100_001_0(Set<String> u, int b) => v(u, '1000011000010', b);
+
+@pragma('dart2js:noInline')
+f_100_001_100_011_0(Set<String> u, int b) => v(u, '1000011000110', b);
+
+@pragma('dart2js:noInline')
+f_100_001_100_101_0(Set<String> u, int b) => v(u, '1000011001010', b);
+
+@pragma('dart2js:noInline')
+f_100_001_100_111_0(Set<String> u, int b) => v(u, '1000011001110', b);
+
+@pragma('dart2js:noInline')
+f_100_001_101_001_0(Set<String> u, int b) => v(u, '1000011010010', b);
+
+@pragma('dart2js:noInline')
+f_100_001_101_011_0(Set<String> u, int b) => v(u, '1000011010110', b);
+
+@pragma('dart2js:noInline')
+f_100_001_101_101_0(Set<String> u, int b) => v(u, '1000011011010', b);
+
+@pragma('dart2js:noInline')
+f_100_001_101_111_0(Set<String> u, int b) => v(u, '1000011011110', b);
+
+@pragma('dart2js:noInline')
+f_100_001_110_001_0(Set<String> u, int b) => v(u, '1000011100010', b);
+
+@pragma('dart2js:noInline')
+f_100_001_110_011_0(Set<String> u, int b) => v(u, '1000011100110', b);
+
+@pragma('dart2js:noInline')
+f_100_001_110_101_0(Set<String> u, int b) => v(u, '1000011101010', b);
+
+@pragma('dart2js:noInline')
+f_100_001_110_111_0(Set<String> u, int b) => v(u, '1000011101110', b);
+
+@pragma('dart2js:noInline')
+f_100_001_111_001_0(Set<String> u, int b) => v(u, '1000011110010', b);
+
+@pragma('dart2js:noInline')
+f_100_001_111_011_0(Set<String> u, int b) => v(u, '1000011110110', b);
+
+@pragma('dart2js:noInline')
+f_100_001_111_101_0(Set<String> u, int b) => v(u, '1000011111010', b);
+
+@pragma('dart2js:noInline')
+f_100_001_111_111_0(Set<String> u, int b) => v(u, '1000011111110', b);
+
+@pragma('dart2js:noInline')
+f_100_010_000_001_0(Set<String> u, int b) => v(u, '1000100000010', b);
+
+@pragma('dart2js:noInline')
+f_100_010_000_011_0(Set<String> u, int b) => v(u, '1000100000110', b);
+
+@pragma('dart2js:noInline')
+f_100_010_000_101_0(Set<String> u, int b) => v(u, '1000100001010', b);
+
+@pragma('dart2js:noInline')
+f_100_010_000_111_0(Set<String> u, int b) => v(u, '1000100001110', b);
+
+@pragma('dart2js:noInline')
+f_100_010_001_001_0(Set<String> u, int b) => v(u, '1000100010010', b);
+
+@pragma('dart2js:noInline')
+f_100_010_001_011_0(Set<String> u, int b) => v(u, '1000100010110', b);
+
+@pragma('dart2js:noInline')
+f_100_010_001_101_0(Set<String> u, int b) => v(u, '1000100011010', b);
+
+@pragma('dart2js:noInline')
+f_100_010_001_111_0(Set<String> u, int b) => v(u, '1000100011110', b);
+
+@pragma('dart2js:noInline')
+f_100_010_010_001_0(Set<String> u, int b) => v(u, '1000100100010', b);
+
+@pragma('dart2js:noInline')
+f_100_010_010_011_0(Set<String> u, int b) => v(u, '1000100100110', b);
+
+@pragma('dart2js:noInline')
+f_100_010_010_101_0(Set<String> u, int b) => v(u, '1000100101010', b);
+
+@pragma('dart2js:noInline')
+f_100_010_010_111_0(Set<String> u, int b) => v(u, '1000100101110', b);
+
+@pragma('dart2js:noInline')
+f_100_010_011_001_0(Set<String> u, int b) => v(u, '1000100110010', b);
+
+@pragma('dart2js:noInline')
+f_100_010_011_011_0(Set<String> u, int b) => v(u, '1000100110110', b);
+
+@pragma('dart2js:noInline')
+f_100_010_011_101_0(Set<String> u, int b) => v(u, '1000100111010', b);
+
+@pragma('dart2js:noInline')
+f_100_010_011_111_0(Set<String> u, int b) => v(u, '1000100111110', b);
+
+@pragma('dart2js:noInline')
+f_100_010_100_001_0(Set<String> u, int b) => v(u, '1000101000010', b);
+
+@pragma('dart2js:noInline')
+f_100_010_100_011_0(Set<String> u, int b) => v(u, '1000101000110', b);
+
+@pragma('dart2js:noInline')
+f_100_010_100_101_0(Set<String> u, int b) => v(u, '1000101001010', b);
+
+@pragma('dart2js:noInline')
+f_100_010_100_111_0(Set<String> u, int b) => v(u, '1000101001110', b);
+
+@pragma('dart2js:noInline')
+f_100_010_101_001_0(Set<String> u, int b) => v(u, '1000101010010', b);
+
+@pragma('dart2js:noInline')
+f_100_010_101_011_0(Set<String> u, int b) => v(u, '1000101010110', b);
+
+@pragma('dart2js:noInline')
+f_100_010_101_101_0(Set<String> u, int b) => v(u, '1000101011010', b);
+
+@pragma('dart2js:noInline')
+f_100_010_101_111_0(Set<String> u, int b) => v(u, '1000101011110', b);
+
+@pragma('dart2js:noInline')
+f_100_010_110_001_0(Set<String> u, int b) => v(u, '1000101100010', b);
+
+@pragma('dart2js:noInline')
+f_100_010_110_011_0(Set<String> u, int b) => v(u, '1000101100110', b);
+
+@pragma('dart2js:noInline')
+f_100_010_110_101_0(Set<String> u, int b) => v(u, '1000101101010', b);
+
+@pragma('dart2js:noInline')
+f_100_010_110_111_0(Set<String> u, int b) => v(u, '1000101101110', b);
+
+@pragma('dart2js:noInline')
+f_100_010_111_001_0(Set<String> u, int b) => v(u, '1000101110010', b);
+
+@pragma('dart2js:noInline')
+f_100_010_111_011_0(Set<String> u, int b) => v(u, '1000101110110', b);
+
+@pragma('dart2js:noInline')
+f_100_010_111_101_0(Set<String> u, int b) => v(u, '1000101111010', b);
+
+@pragma('dart2js:noInline')
+f_100_010_111_111_0(Set<String> u, int b) => v(u, '1000101111110', b);
+
+@pragma('dart2js:noInline')
+f_100_011_000_001_0(Set<String> u, int b) => v(u, '1000110000010', b);
+
+@pragma('dart2js:noInline')
+f_100_011_000_011_0(Set<String> u, int b) => v(u, '1000110000110', b);
+
+@pragma('dart2js:noInline')
+f_100_011_000_101_0(Set<String> u, int b) => v(u, '1000110001010', b);
+
+@pragma('dart2js:noInline')
+f_100_011_000_111_0(Set<String> u, int b) => v(u, '1000110001110', b);
+
+@pragma('dart2js:noInline')
+f_100_011_001_001_0(Set<String> u, int b) => v(u, '1000110010010', b);
+
+@pragma('dart2js:noInline')
+f_100_011_001_011_0(Set<String> u, int b) => v(u, '1000110010110', b);
+
+@pragma('dart2js:noInline')
+f_100_011_001_101_0(Set<String> u, int b) => v(u, '1000110011010', b);
+
+@pragma('dart2js:noInline')
+f_100_011_001_111_0(Set<String> u, int b) => v(u, '1000110011110', b);
+
+@pragma('dart2js:noInline')
+f_100_011_010_001_0(Set<String> u, int b) => v(u, '1000110100010', b);
+
+@pragma('dart2js:noInline')
+f_100_011_010_011_0(Set<String> u, int b) => v(u, '1000110100110', b);
+
+@pragma('dart2js:noInline')
+f_100_011_010_101_0(Set<String> u, int b) => v(u, '1000110101010', b);
+
+@pragma('dart2js:noInline')
+f_100_011_010_111_0(Set<String> u, int b) => v(u, '1000110101110', b);
+
+@pragma('dart2js:noInline')
+f_100_011_011_001_0(Set<String> u, int b) => v(u, '1000110110010', b);
+
+@pragma('dart2js:noInline')
+f_100_011_011_011_0(Set<String> u, int b) => v(u, '1000110110110', b);
+
+@pragma('dart2js:noInline')
+f_100_011_011_101_0(Set<String> u, int b) => v(u, '1000110111010', b);
+
+@pragma('dart2js:noInline')
+f_100_011_011_111_0(Set<String> u, int b) => v(u, '1000110111110', b);
+
+@pragma('dart2js:noInline')
+f_100_011_100_001_0(Set<String> u, int b) => v(u, '1000111000010', b);
+
+@pragma('dart2js:noInline')
+f_100_011_100_011_0(Set<String> u, int b) => v(u, '1000111000110', b);
+
+@pragma('dart2js:noInline')
+f_100_011_100_101_0(Set<String> u, int b) => v(u, '1000111001010', b);
+
+@pragma('dart2js:noInline')
+f_100_011_100_111_0(Set<String> u, int b) => v(u, '1000111001110', b);
+
+@pragma('dart2js:noInline')
+f_100_011_101_001_0(Set<String> u, int b) => v(u, '1000111010010', b);
+
+@pragma('dart2js:noInline')
+f_100_011_101_011_0(Set<String> u, int b) => v(u, '1000111010110', b);
+
+@pragma('dart2js:noInline')
+f_100_011_101_101_0(Set<String> u, int b) => v(u, '1000111011010', b);
+
+@pragma('dart2js:noInline')
+f_100_011_101_111_0(Set<String> u, int b) => v(u, '1000111011110', b);
+
+@pragma('dart2js:noInline')
+f_100_011_110_001_0(Set<String> u, int b) => v(u, '1000111100010', b);
+
+@pragma('dart2js:noInline')
+f_100_011_110_011_0(Set<String> u, int b) => v(u, '1000111100110', b);
+
+@pragma('dart2js:noInline')
+f_100_011_110_101_0(Set<String> u, int b) => v(u, '1000111101010', b);
+
+@pragma('dart2js:noInline')
+f_100_011_110_111_0(Set<String> u, int b) => v(u, '1000111101110', b);
+
+@pragma('dart2js:noInline')
+f_100_011_111_001_0(Set<String> u, int b) => v(u, '1000111110010', b);
+
+@pragma('dart2js:noInline')
+f_100_011_111_011_0(Set<String> u, int b) => v(u, '1000111110110', b);
+
+@pragma('dart2js:noInline')
+f_100_011_111_101_0(Set<String> u, int b) => v(u, '1000111111010', b);
+
+@pragma('dart2js:noInline')
+f_100_011_111_111_0(Set<String> u, int b) => v(u, '1000111111110', b);
+
+@pragma('dart2js:noInline')
+f_100_100_000_001_0(Set<String> u, int b) => v(u, '1001000000010', b);
+
+@pragma('dart2js:noInline')
+f_100_100_000_011_0(Set<String> u, int b) => v(u, '1001000000110', b);
+
+@pragma('dart2js:noInline')
+f_100_100_000_101_0(Set<String> u, int b) => v(u, '1001000001010', b);
+
+@pragma('dart2js:noInline')
+f_100_100_000_111_0(Set<String> u, int b) => v(u, '1001000001110', b);
+
+@pragma('dart2js:noInline')
+f_100_100_001_001_0(Set<String> u, int b) => v(u, '1001000010010', b);
+
+@pragma('dart2js:noInline')
+f_100_100_001_011_0(Set<String> u, int b) => v(u, '1001000010110', b);
+
+@pragma('dart2js:noInline')
+f_100_100_001_101_0(Set<String> u, int b) => v(u, '1001000011010', b);
+
+@pragma('dart2js:noInline')
+f_100_100_001_111_0(Set<String> u, int b) => v(u, '1001000011110', b);
+
+@pragma('dart2js:noInline')
+f_100_100_010_001_0(Set<String> u, int b) => v(u, '1001000100010', b);
+
+@pragma('dart2js:noInline')
+f_100_100_010_011_0(Set<String> u, int b) => v(u, '1001000100110', b);
+
+@pragma('dart2js:noInline')
+f_100_100_010_101_0(Set<String> u, int b) => v(u, '1001000101010', b);
+
+@pragma('dart2js:noInline')
+f_100_100_010_111_0(Set<String> u, int b) => v(u, '1001000101110', b);
+
+@pragma('dart2js:noInline')
+f_100_100_011_001_0(Set<String> u, int b) => v(u, '1001000110010', b);
+
+@pragma('dart2js:noInline')
+f_100_100_011_011_0(Set<String> u, int b) => v(u, '1001000110110', b);
+
+@pragma('dart2js:noInline')
+f_100_100_011_101_0(Set<String> u, int b) => v(u, '1001000111010', b);
+
+@pragma('dart2js:noInline')
+f_100_100_011_111_0(Set<String> u, int b) => v(u, '1001000111110', b);
+
+@pragma('dart2js:noInline')
+f_100_100_100_001_0(Set<String> u, int b) => v(u, '1001001000010', b);
+
+@pragma('dart2js:noInline')
+f_100_100_100_011_0(Set<String> u, int b) => v(u, '1001001000110', b);
+
+@pragma('dart2js:noInline')
+f_100_100_100_101_0(Set<String> u, int b) => v(u, '1001001001010', b);
+
+@pragma('dart2js:noInline')
+f_100_100_100_111_0(Set<String> u, int b) => v(u, '1001001001110', b);
+
+@pragma('dart2js:noInline')
+f_100_100_101_001_0(Set<String> u, int b) => v(u, '1001001010010', b);
+
+@pragma('dart2js:noInline')
+f_100_100_101_011_0(Set<String> u, int b) => v(u, '1001001010110', b);
+
+@pragma('dart2js:noInline')
+f_100_100_101_101_0(Set<String> u, int b) => v(u, '1001001011010', b);
+
+@pragma('dart2js:noInline')
+f_100_100_101_111_0(Set<String> u, int b) => v(u, '1001001011110', b);
+
+@pragma('dart2js:noInline')
+f_100_100_110_001_0(Set<String> u, int b) => v(u, '1001001100010', b);
+
+@pragma('dart2js:noInline')
+f_100_100_110_011_0(Set<String> u, int b) => v(u, '1001001100110', b);
+
+@pragma('dart2js:noInline')
+f_100_100_110_101_0(Set<String> u, int b) => v(u, '1001001101010', b);
+
+@pragma('dart2js:noInline')
+f_100_100_110_111_0(Set<String> u, int b) => v(u, '1001001101110', b);
+
+@pragma('dart2js:noInline')
+f_100_100_111_001_0(Set<String> u, int b) => v(u, '1001001110010', b);
+
+@pragma('dart2js:noInline')
+f_100_100_111_011_0(Set<String> u, int b) => v(u, '1001001110110', b);
+
+@pragma('dart2js:noInline')
+f_100_100_111_101_0(Set<String> u, int b) => v(u, '1001001111010', b);
+
+@pragma('dart2js:noInline')
+f_100_100_111_111_0(Set<String> u, int b) => v(u, '1001001111110', b);
+
+@pragma('dart2js:noInline')
+f_100_101_000_001_0(Set<String> u, int b) => v(u, '1001010000010', b);
+
+@pragma('dart2js:noInline')
+f_100_101_000_011_0(Set<String> u, int b) => v(u, '1001010000110', b);
+
+@pragma('dart2js:noInline')
+f_100_101_000_101_0(Set<String> u, int b) => v(u, '1001010001010', b);
+
+@pragma('dart2js:noInline')
+f_100_101_000_111_0(Set<String> u, int b) => v(u, '1001010001110', b);
+
+@pragma('dart2js:noInline')
+f_100_101_001_001_0(Set<String> u, int b) => v(u, '1001010010010', b);
+
+@pragma('dart2js:noInline')
+f_100_101_001_011_0(Set<String> u, int b) => v(u, '1001010010110', b);
+
+@pragma('dart2js:noInline')
+f_100_101_001_101_0(Set<String> u, int b) => v(u, '1001010011010', b);
+
+@pragma('dart2js:noInline')
+f_100_101_001_111_0(Set<String> u, int b) => v(u, '1001010011110', b);
+
+@pragma('dart2js:noInline')
+f_100_101_010_001_0(Set<String> u, int b) => v(u, '1001010100010', b);
+
+@pragma('dart2js:noInline')
+f_100_101_010_011_0(Set<String> u, int b) => v(u, '1001010100110', b);
+
+@pragma('dart2js:noInline')
+f_100_101_010_101_0(Set<String> u, int b) => v(u, '1001010101010', b);
+
+@pragma('dart2js:noInline')
+f_100_101_010_111_0(Set<String> u, int b) => v(u, '1001010101110', b);
+
+@pragma('dart2js:noInline')
+f_100_101_011_001_0(Set<String> u, int b) => v(u, '1001010110010', b);
+
+@pragma('dart2js:noInline')
+f_100_101_011_011_0(Set<String> u, int b) => v(u, '1001010110110', b);
+
+@pragma('dart2js:noInline')
+f_100_101_011_101_0(Set<String> u, int b) => v(u, '1001010111010', b);
+
+@pragma('dart2js:noInline')
+f_100_101_011_111_0(Set<String> u, int b) => v(u, '1001010111110', b);
+
+@pragma('dart2js:noInline')
+f_100_101_100_001_0(Set<String> u, int b) => v(u, '1001011000010', b);
+
+@pragma('dart2js:noInline')
+f_100_101_100_011_0(Set<String> u, int b) => v(u, '1001011000110', b);
+
+@pragma('dart2js:noInline')
+f_100_101_100_101_0(Set<String> u, int b) => v(u, '1001011001010', b);
+
+@pragma('dart2js:noInline')
+f_100_101_100_111_0(Set<String> u, int b) => v(u, '1001011001110', b);
+
+@pragma('dart2js:noInline')
+f_100_101_101_001_0(Set<String> u, int b) => v(u, '1001011010010', b);
+
+@pragma('dart2js:noInline')
+f_100_101_101_011_0(Set<String> u, int b) => v(u, '1001011010110', b);
+
+@pragma('dart2js:noInline')
+f_100_101_101_101_0(Set<String> u, int b) => v(u, '1001011011010', b);
+
+@pragma('dart2js:noInline')
+f_100_101_101_111_0(Set<String> u, int b) => v(u, '1001011011110', b);
+
+@pragma('dart2js:noInline')
+f_100_101_110_001_0(Set<String> u, int b) => v(u, '1001011100010', b);
+
+@pragma('dart2js:noInline')
+f_100_101_110_011_0(Set<String> u, int b) => v(u, '1001011100110', b);
+
+@pragma('dart2js:noInline')
+f_100_101_110_101_0(Set<String> u, int b) => v(u, '1001011101010', b);
+
+@pragma('dart2js:noInline')
+f_100_101_110_111_0(Set<String> u, int b) => v(u, '1001011101110', b);
+
+@pragma('dart2js:noInline')
+f_100_101_111_001_0(Set<String> u, int b) => v(u, '1001011110010', b);
+
+@pragma('dart2js:noInline')
+f_100_101_111_011_0(Set<String> u, int b) => v(u, '1001011110110', b);
+
+@pragma('dart2js:noInline')
+f_100_101_111_101_0(Set<String> u, int b) => v(u, '1001011111010', b);
+
+@pragma('dart2js:noInline')
+f_100_101_111_111_0(Set<String> u, int b) => v(u, '1001011111110', b);
+
+@pragma('dart2js:noInline')
+f_100_110_000_001_0(Set<String> u, int b) => v(u, '1001100000010', b);
+
+@pragma('dart2js:noInline')
+f_100_110_000_011_0(Set<String> u, int b) => v(u, '1001100000110', b);
+
+@pragma('dart2js:noInline')
+f_100_110_000_101_0(Set<String> u, int b) => v(u, '1001100001010', b);
+
+@pragma('dart2js:noInline')
+f_100_110_000_111_0(Set<String> u, int b) => v(u, '1001100001110', b);
+
+@pragma('dart2js:noInline')
+f_100_110_001_001_0(Set<String> u, int b) => v(u, '1001100010010', b);
+
+@pragma('dart2js:noInline')
+f_100_110_001_011_0(Set<String> u, int b) => v(u, '1001100010110', b);
+
+@pragma('dart2js:noInline')
+f_100_110_001_101_0(Set<String> u, int b) => v(u, '1001100011010', b);
+
+@pragma('dart2js:noInline')
+f_100_110_001_111_0(Set<String> u, int b) => v(u, '1001100011110', b);
+
+@pragma('dart2js:noInline')
+f_100_110_010_001_0(Set<String> u, int b) => v(u, '1001100100010', b);
+
+@pragma('dart2js:noInline')
+f_100_110_010_011_0(Set<String> u, int b) => v(u, '1001100100110', b);
+
+@pragma('dart2js:noInline')
+f_100_110_010_101_0(Set<String> u, int b) => v(u, '1001100101010', b);
+
+@pragma('dart2js:noInline')
+f_100_110_010_111_0(Set<String> u, int b) => v(u, '1001100101110', b);
+
+@pragma('dart2js:noInline')
+f_100_110_011_001_0(Set<String> u, int b) => v(u, '1001100110010', b);
+
+@pragma('dart2js:noInline')
+f_100_110_011_011_0(Set<String> u, int b) => v(u, '1001100110110', b);
+
+@pragma('dart2js:noInline')
+f_100_110_011_101_0(Set<String> u, int b) => v(u, '1001100111010', b);
+
+@pragma('dart2js:noInline')
+f_100_110_011_111_0(Set<String> u, int b) => v(u, '1001100111110', b);
+
+@pragma('dart2js:noInline')
+f_100_110_100_001_0(Set<String> u, int b) => v(u, '1001101000010', b);
+
+@pragma('dart2js:noInline')
+f_100_110_100_011_0(Set<String> u, int b) => v(u, '1001101000110', b);
+
+@pragma('dart2js:noInline')
+f_100_110_100_101_0(Set<String> u, int b) => v(u, '1001101001010', b);
+
+@pragma('dart2js:noInline')
+f_100_110_100_111_0(Set<String> u, int b) => v(u, '1001101001110', b);
+
+@pragma('dart2js:noInline')
+f_100_110_101_001_0(Set<String> u, int b) => v(u, '1001101010010', b);
+
+@pragma('dart2js:noInline')
+f_100_110_101_011_0(Set<String> u, int b) => v(u, '1001101010110', b);
+
+@pragma('dart2js:noInline')
+f_100_110_101_101_0(Set<String> u, int b) => v(u, '1001101011010', b);
+
+@pragma('dart2js:noInline')
+f_100_110_101_111_0(Set<String> u, int b) => v(u, '1001101011110', b);
+
+@pragma('dart2js:noInline')
+f_100_110_110_001_0(Set<String> u, int b) => v(u, '1001101100010', b);
+
+@pragma('dart2js:noInline')
+f_100_110_110_011_0(Set<String> u, int b) => v(u, '1001101100110', b);
+
+@pragma('dart2js:noInline')
+f_100_110_110_101_0(Set<String> u, int b) => v(u, '1001101101010', b);
+
+@pragma('dart2js:noInline')
+f_100_110_110_111_0(Set<String> u, int b) => v(u, '1001101101110', b);
+
+@pragma('dart2js:noInline')
+f_100_110_111_001_0(Set<String> u, int b) => v(u, '1001101110010', b);
+
+@pragma('dart2js:noInline')
+f_100_110_111_011_0(Set<String> u, int b) => v(u, '1001101110110', b);
+
+@pragma('dart2js:noInline')
+f_100_110_111_101_0(Set<String> u, int b) => v(u, '1001101111010', b);
+
+@pragma('dart2js:noInline')
+f_100_110_111_111_0(Set<String> u, int b) => v(u, '1001101111110', b);
+
+@pragma('dart2js:noInline')
+f_100_111_000_001_0(Set<String> u, int b) => v(u, '1001110000010', b);
+
+@pragma('dart2js:noInline')
+f_100_111_000_011_0(Set<String> u, int b) => v(u, '1001110000110', b);
+
+@pragma('dart2js:noInline')
+f_100_111_000_101_0(Set<String> u, int b) => v(u, '1001110001010', b);
+
+@pragma('dart2js:noInline')
+f_100_111_000_111_0(Set<String> u, int b) => v(u, '1001110001110', b);
+
+@pragma('dart2js:noInline')
+f_100_111_001_001_0(Set<String> u, int b) => v(u, '1001110010010', b);
+
+@pragma('dart2js:noInline')
+f_100_111_001_011_0(Set<String> u, int b) => v(u, '1001110010110', b);
+
+@pragma('dart2js:noInline')
+f_100_111_001_101_0(Set<String> u, int b) => v(u, '1001110011010', b);
+
+@pragma('dart2js:noInline')
+f_100_111_001_111_0(Set<String> u, int b) => v(u, '1001110011110', b);
+
+@pragma('dart2js:noInline')
+f_100_111_010_001_0(Set<String> u, int b) => v(u, '1001110100010', b);
+
+@pragma('dart2js:noInline')
+f_100_111_010_011_0(Set<String> u, int b) => v(u, '1001110100110', b);
+
+@pragma('dart2js:noInline')
+f_100_111_010_101_0(Set<String> u, int b) => v(u, '1001110101010', b);
+
+@pragma('dart2js:noInline')
+f_100_111_010_111_0(Set<String> u, int b) => v(u, '1001110101110', b);
+
+@pragma('dart2js:noInline')
+f_100_111_011_001_0(Set<String> u, int b) => v(u, '1001110110010', b);
+
+@pragma('dart2js:noInline')
+f_100_111_011_011_0(Set<String> u, int b) => v(u, '1001110110110', b);
+
+@pragma('dart2js:noInline')
+f_100_111_011_101_0(Set<String> u, int b) => v(u, '1001110111010', b);
+
+@pragma('dart2js:noInline')
+f_100_111_011_111_0(Set<String> u, int b) => v(u, '1001110111110', b);
+
+@pragma('dart2js:noInline')
+f_100_111_100_001_0(Set<String> u, int b) => v(u, '1001111000010', b);
+
+@pragma('dart2js:noInline')
+f_100_111_100_011_0(Set<String> u, int b) => v(u, '1001111000110', b);
+
+@pragma('dart2js:noInline')
+f_100_111_100_101_0(Set<String> u, int b) => v(u, '1001111001010', b);
+
+@pragma('dart2js:noInline')
+f_100_111_100_111_0(Set<String> u, int b) => v(u, '1001111001110', b);
+
+@pragma('dart2js:noInline')
+f_100_111_101_001_0(Set<String> u, int b) => v(u, '1001111010010', b);
+
+@pragma('dart2js:noInline')
+f_100_111_101_011_0(Set<String> u, int b) => v(u, '1001111010110', b);
+
+@pragma('dart2js:noInline')
+f_100_111_101_101_0(Set<String> u, int b) => v(u, '1001111011010', b);
+
+@pragma('dart2js:noInline')
+f_100_111_101_111_0(Set<String> u, int b) => v(u, '1001111011110', b);
+
+@pragma('dart2js:noInline')
+f_100_111_110_001_0(Set<String> u, int b) => v(u, '1001111100010', b);
+
+@pragma('dart2js:noInline')
+f_100_111_110_011_0(Set<String> u, int b) => v(u, '1001111100110', b);
+
+@pragma('dart2js:noInline')
+f_100_111_110_101_0(Set<String> u, int b) => v(u, '1001111101010', b);
+
+@pragma('dart2js:noInline')
+f_100_111_110_111_0(Set<String> u, int b) => v(u, '1001111101110', b);
+
+@pragma('dart2js:noInline')
+f_100_111_111_001_0(Set<String> u, int b) => v(u, '1001111110010', b);
+
+@pragma('dart2js:noInline')
+f_100_111_111_011_0(Set<String> u, int b) => v(u, '1001111110110', b);
+
+@pragma('dart2js:noInline')
+f_100_111_111_101_0(Set<String> u, int b) => v(u, '1001111111010', b);
+
+@pragma('dart2js:noInline')
+f_100_111_111_111_0(Set<String> u, int b) => v(u, '1001111111110', b);
+
+@pragma('dart2js:noInline')
+f_101_000_000_001_0(Set<String> u, int b) => v(u, '1010000000010', b);
+
+@pragma('dart2js:noInline')
+f_101_000_000_011_0(Set<String> u, int b) => v(u, '1010000000110', b);
+
+@pragma('dart2js:noInline')
+f_101_000_000_101_0(Set<String> u, int b) => v(u, '1010000001010', b);
+
+@pragma('dart2js:noInline')
+f_101_000_000_111_0(Set<String> u, int b) => v(u, '1010000001110', b);
+
+@pragma('dart2js:noInline')
+f_101_000_001_001_0(Set<String> u, int b) => v(u, '1010000010010', b);
+
+@pragma('dart2js:noInline')
+f_101_000_001_011_0(Set<String> u, int b) => v(u, '1010000010110', b);
+
+@pragma('dart2js:noInline')
+f_101_000_001_101_0(Set<String> u, int b) => v(u, '1010000011010', b);
+
+@pragma('dart2js:noInline')
+f_101_000_001_111_0(Set<String> u, int b) => v(u, '1010000011110', b);
+
+@pragma('dart2js:noInline')
+f_101_000_010_001_0(Set<String> u, int b) => v(u, '1010000100010', b);
+
+@pragma('dart2js:noInline')
+f_101_000_010_011_0(Set<String> u, int b) => v(u, '1010000100110', b);
+
+@pragma('dart2js:noInline')
+f_101_000_010_101_0(Set<String> u, int b) => v(u, '1010000101010', b);
+
+@pragma('dart2js:noInline')
+f_101_000_010_111_0(Set<String> u, int b) => v(u, '1010000101110', b);
+
+@pragma('dart2js:noInline')
+f_101_000_011_001_0(Set<String> u, int b) => v(u, '1010000110010', b);
+
+@pragma('dart2js:noInline')
+f_101_000_011_011_0(Set<String> u, int b) => v(u, '1010000110110', b);
+
+@pragma('dart2js:noInline')
+f_101_000_011_101_0(Set<String> u, int b) => v(u, '1010000111010', b);
+
+@pragma('dart2js:noInline')
+f_101_000_011_111_0(Set<String> u, int b) => v(u, '1010000111110', b);
+
+@pragma('dart2js:noInline')
+f_101_000_100_001_0(Set<String> u, int b) => v(u, '1010001000010', b);
+
+@pragma('dart2js:noInline')
+f_101_000_100_011_0(Set<String> u, int b) => v(u, '1010001000110', b);
+
+@pragma('dart2js:noInline')
+f_101_000_100_101_0(Set<String> u, int b) => v(u, '1010001001010', b);
+
+@pragma('dart2js:noInline')
+f_101_000_100_111_0(Set<String> u, int b) => v(u, '1010001001110', b);
+
+@pragma('dart2js:noInline')
+f_101_000_101_001_0(Set<String> u, int b) => v(u, '1010001010010', b);
+
+@pragma('dart2js:noInline')
+f_101_000_101_011_0(Set<String> u, int b) => v(u, '1010001010110', b);
+
+@pragma('dart2js:noInline')
+f_101_000_101_101_0(Set<String> u, int b) => v(u, '1010001011010', b);
+
+@pragma('dart2js:noInline')
+f_101_000_101_111_0(Set<String> u, int b) => v(u, '1010001011110', b);
+
+@pragma('dart2js:noInline')
+f_101_000_110_001_0(Set<String> u, int b) => v(u, '1010001100010', b);
+
+@pragma('dart2js:noInline')
+f_101_000_110_011_0(Set<String> u, int b) => v(u, '1010001100110', b);
+
+@pragma('dart2js:noInline')
+f_101_000_110_101_0(Set<String> u, int b) => v(u, '1010001101010', b);
+
+@pragma('dart2js:noInline')
+f_101_000_110_111_0(Set<String> u, int b) => v(u, '1010001101110', b);
+
+@pragma('dart2js:noInline')
+f_101_000_111_001_0(Set<String> u, int b) => v(u, '1010001110010', b);
+
+@pragma('dart2js:noInline')
+f_101_000_111_011_0(Set<String> u, int b) => v(u, '1010001110110', b);
+
+@pragma('dart2js:noInline')
+f_101_000_111_101_0(Set<String> u, int b) => v(u, '1010001111010', b);
+
+@pragma('dart2js:noInline')
+f_101_000_111_111_0(Set<String> u, int b) => v(u, '1010001111110', b);
+
+@pragma('dart2js:noInline')
+f_101_001_000_001_0(Set<String> u, int b) => v(u, '1010010000010', b);
+
+@pragma('dart2js:noInline')
+f_101_001_000_011_0(Set<String> u, int b) => v(u, '1010010000110', b);
+
+@pragma('dart2js:noInline')
+f_101_001_000_101_0(Set<String> u, int b) => v(u, '1010010001010', b);
+
+@pragma('dart2js:noInline')
+f_101_001_000_111_0(Set<String> u, int b) => v(u, '1010010001110', b);
+
+@pragma('dart2js:noInline')
+f_101_001_001_001_0(Set<String> u, int b) => v(u, '1010010010010', b);
+
+@pragma('dart2js:noInline')
+f_101_001_001_011_0(Set<String> u, int b) => v(u, '1010010010110', b);
+
+@pragma('dart2js:noInline')
+f_101_001_001_101_0(Set<String> u, int b) => v(u, '1010010011010', b);
+
+@pragma('dart2js:noInline')
+f_101_001_001_111_0(Set<String> u, int b) => v(u, '1010010011110', b);
+
+@pragma('dart2js:noInline')
+f_101_001_010_001_0(Set<String> u, int b) => v(u, '1010010100010', b);
+
+@pragma('dart2js:noInline')
+f_101_001_010_011_0(Set<String> u, int b) => v(u, '1010010100110', b);
+
+@pragma('dart2js:noInline')
+f_101_001_010_101_0(Set<String> u, int b) => v(u, '1010010101010', b);
+
+@pragma('dart2js:noInline')
+f_101_001_010_111_0(Set<String> u, int b) => v(u, '1010010101110', b);
+
+@pragma('dart2js:noInline')
+f_101_001_011_001_0(Set<String> u, int b) => v(u, '1010010110010', b);
+
+@pragma('dart2js:noInline')
+f_101_001_011_011_0(Set<String> u, int b) => v(u, '1010010110110', b);
+
+@pragma('dart2js:noInline')
+f_101_001_011_101_0(Set<String> u, int b) => v(u, '1010010111010', b);
+
+@pragma('dart2js:noInline')
+f_101_001_011_111_0(Set<String> u, int b) => v(u, '1010010111110', b);
+
+@pragma('dart2js:noInline')
+f_101_001_100_001_0(Set<String> u, int b) => v(u, '1010011000010', b);
+
+@pragma('dart2js:noInline')
+f_101_001_100_011_0(Set<String> u, int b) => v(u, '1010011000110', b);
+
+@pragma('dart2js:noInline')
+f_101_001_100_101_0(Set<String> u, int b) => v(u, '1010011001010', b);
+
+@pragma('dart2js:noInline')
+f_101_001_100_111_0(Set<String> u, int b) => v(u, '1010011001110', b);
+
+@pragma('dart2js:noInline')
+f_101_001_101_001_0(Set<String> u, int b) => v(u, '1010011010010', b);
+
+@pragma('dart2js:noInline')
+f_101_001_101_011_0(Set<String> u, int b) => v(u, '1010011010110', b);
+
+@pragma('dart2js:noInline')
+f_101_001_101_101_0(Set<String> u, int b) => v(u, '1010011011010', b);
+
+@pragma('dart2js:noInline')
+f_101_001_101_111_0(Set<String> u, int b) => v(u, '1010011011110', b);
+
+@pragma('dart2js:noInline')
+f_101_001_110_001_0(Set<String> u, int b) => v(u, '1010011100010', b);
+
+@pragma('dart2js:noInline')
+f_101_001_110_011_0(Set<String> u, int b) => v(u, '1010011100110', b);
+
+@pragma('dart2js:noInline')
+f_101_001_110_101_0(Set<String> u, int b) => v(u, '1010011101010', b);
+
+@pragma('dart2js:noInline')
+f_101_001_110_111_0(Set<String> u, int b) => v(u, '1010011101110', b);
+
+@pragma('dart2js:noInline')
+f_101_001_111_001_0(Set<String> u, int b) => v(u, '1010011110010', b);
+
+@pragma('dart2js:noInline')
+f_101_001_111_011_0(Set<String> u, int b) => v(u, '1010011110110', b);
+
+@pragma('dart2js:noInline')
+f_101_001_111_101_0(Set<String> u, int b) => v(u, '1010011111010', b);
+
+@pragma('dart2js:noInline')
+f_101_001_111_111_0(Set<String> u, int b) => v(u, '1010011111110', b);
+
+@pragma('dart2js:noInline')
+f_101_010_000_001_0(Set<String> u, int b) => v(u, '1010100000010', b);
+
+@pragma('dart2js:noInline')
+f_101_010_000_011_0(Set<String> u, int b) => v(u, '1010100000110', b);
+
+@pragma('dart2js:noInline')
+f_101_010_000_101_0(Set<String> u, int b) => v(u, '1010100001010', b);
+
+@pragma('dart2js:noInline')
+f_101_010_000_111_0(Set<String> u, int b) => v(u, '1010100001110', b);
+
+@pragma('dart2js:noInline')
+f_101_010_001_001_0(Set<String> u, int b) => v(u, '1010100010010', b);
+
+@pragma('dart2js:noInline')
+f_101_010_001_011_0(Set<String> u, int b) => v(u, '1010100010110', b);
+
+@pragma('dart2js:noInline')
+f_101_010_001_101_0(Set<String> u, int b) => v(u, '1010100011010', b);
+
+@pragma('dart2js:noInline')
+f_101_010_001_111_0(Set<String> u, int b) => v(u, '1010100011110', b);
+
+@pragma('dart2js:noInline')
+f_101_010_010_001_0(Set<String> u, int b) => v(u, '1010100100010', b);
+
+@pragma('dart2js:noInline')
+f_101_010_010_011_0(Set<String> u, int b) => v(u, '1010100100110', b);
+
+@pragma('dart2js:noInline')
+f_101_010_010_101_0(Set<String> u, int b) => v(u, '1010100101010', b);
+
+@pragma('dart2js:noInline')
+f_101_010_010_111_0(Set<String> u, int b) => v(u, '1010100101110', b);
+
+@pragma('dart2js:noInline')
+f_101_010_011_001_0(Set<String> u, int b) => v(u, '1010100110010', b);
+
+@pragma('dart2js:noInline')
+f_101_010_011_011_0(Set<String> u, int b) => v(u, '1010100110110', b);
+
+@pragma('dart2js:noInline')
+f_101_010_011_101_0(Set<String> u, int b) => v(u, '1010100111010', b);
+
+@pragma('dart2js:noInline')
+f_101_010_011_111_0(Set<String> u, int b) => v(u, '1010100111110', b);
+
+@pragma('dart2js:noInline')
+f_101_010_100_001_0(Set<String> u, int b) => v(u, '1010101000010', b);
+
+@pragma('dart2js:noInline')
+f_101_010_100_011_0(Set<String> u, int b) => v(u, '1010101000110', b);
+
+@pragma('dart2js:noInline')
+f_101_010_100_101_0(Set<String> u, int b) => v(u, '1010101001010', b);
+
+@pragma('dart2js:noInline')
+f_101_010_100_111_0(Set<String> u, int b) => v(u, '1010101001110', b);
+
+@pragma('dart2js:noInline')
+f_101_010_101_001_0(Set<String> u, int b) => v(u, '1010101010010', b);
+
+@pragma('dart2js:noInline')
+f_101_010_101_011_0(Set<String> u, int b) => v(u, '1010101010110', b);
+
+@pragma('dart2js:noInline')
+f_101_010_101_101_0(Set<String> u, int b) => v(u, '1010101011010', b);
+
+@pragma('dart2js:noInline')
+f_101_010_101_111_0(Set<String> u, int b) => v(u, '1010101011110', b);
+
+@pragma('dart2js:noInline')
+f_101_010_110_001_0(Set<String> u, int b) => v(u, '1010101100010', b);
+
+@pragma('dart2js:noInline')
+f_101_010_110_011_0(Set<String> u, int b) => v(u, '1010101100110', b);
+
+@pragma('dart2js:noInline')
+f_101_010_110_101_0(Set<String> u, int b) => v(u, '1010101101010', b);
+
+@pragma('dart2js:noInline')
+f_101_010_110_111_0(Set<String> u, int b) => v(u, '1010101101110', b);
+
+@pragma('dart2js:noInline')
+f_101_010_111_001_0(Set<String> u, int b) => v(u, '1010101110010', b);
+
+@pragma('dart2js:noInline')
+f_101_010_111_011_0(Set<String> u, int b) => v(u, '1010101110110', b);
+
+@pragma('dart2js:noInline')
+f_101_010_111_101_0(Set<String> u, int b) => v(u, '1010101111010', b);
+
+@pragma('dart2js:noInline')
+f_101_010_111_111_0(Set<String> u, int b) => v(u, '1010101111110', b);
+
+@pragma('dart2js:noInline')
+f_101_011_000_001_0(Set<String> u, int b) => v(u, '1010110000010', b);
+
+@pragma('dart2js:noInline')
+f_101_011_000_011_0(Set<String> u, int b) => v(u, '1010110000110', b);
+
+@pragma('dart2js:noInline')
+f_101_011_000_101_0(Set<String> u, int b) => v(u, '1010110001010', b);
+
+@pragma('dart2js:noInline')
+f_101_011_000_111_0(Set<String> u, int b) => v(u, '1010110001110', b);
+
+@pragma('dart2js:noInline')
+f_101_011_001_001_0(Set<String> u, int b) => v(u, '1010110010010', b);
+
+@pragma('dart2js:noInline')
+f_101_011_001_011_0(Set<String> u, int b) => v(u, '1010110010110', b);
+
+@pragma('dart2js:noInline')
+f_101_011_001_101_0(Set<String> u, int b) => v(u, '1010110011010', b);
+
+@pragma('dart2js:noInline')
+f_101_011_001_111_0(Set<String> u, int b) => v(u, '1010110011110', b);
+
+@pragma('dart2js:noInline')
+f_101_011_010_001_0(Set<String> u, int b) => v(u, '1010110100010', b);
+
+@pragma('dart2js:noInline')
+f_101_011_010_011_0(Set<String> u, int b) => v(u, '1010110100110', b);
+
+@pragma('dart2js:noInline')
+f_101_011_010_101_0(Set<String> u, int b) => v(u, '1010110101010', b);
+
+@pragma('dart2js:noInline')
+f_101_011_010_111_0(Set<String> u, int b) => v(u, '1010110101110', b);
+
+@pragma('dart2js:noInline')
+f_101_011_011_001_0(Set<String> u, int b) => v(u, '1010110110010', b);
+
+@pragma('dart2js:noInline')
+f_101_011_011_011_0(Set<String> u, int b) => v(u, '1010110110110', b);
+
+@pragma('dart2js:noInline')
+f_101_011_011_101_0(Set<String> u, int b) => v(u, '1010110111010', b);
+
+@pragma('dart2js:noInline')
+f_101_011_011_111_0(Set<String> u, int b) => v(u, '1010110111110', b);
+
+@pragma('dart2js:noInline')
+f_101_011_100_001_0(Set<String> u, int b) => v(u, '1010111000010', b);
+
+@pragma('dart2js:noInline')
+f_101_011_100_011_0(Set<String> u, int b) => v(u, '1010111000110', b);
+
+@pragma('dart2js:noInline')
+f_101_011_100_101_0(Set<String> u, int b) => v(u, '1010111001010', b);
+
+@pragma('dart2js:noInline')
+f_101_011_100_111_0(Set<String> u, int b) => v(u, '1010111001110', b);
+
+@pragma('dart2js:noInline')
+f_101_011_101_001_0(Set<String> u, int b) => v(u, '1010111010010', b);
+
+@pragma('dart2js:noInline')
+f_101_011_101_011_0(Set<String> u, int b) => v(u, '1010111010110', b);
+
+@pragma('dart2js:noInline')
+f_101_011_101_101_0(Set<String> u, int b) => v(u, '1010111011010', b);
+
+@pragma('dart2js:noInline')
+f_101_011_101_111_0(Set<String> u, int b) => v(u, '1010111011110', b);
+
+@pragma('dart2js:noInline')
+f_101_011_110_001_0(Set<String> u, int b) => v(u, '1010111100010', b);
+
+@pragma('dart2js:noInline')
+f_101_011_110_011_0(Set<String> u, int b) => v(u, '1010111100110', b);
+
+@pragma('dart2js:noInline')
+f_101_011_110_101_0(Set<String> u, int b) => v(u, '1010111101010', b);
+
+@pragma('dart2js:noInline')
+f_101_011_110_111_0(Set<String> u, int b) => v(u, '1010111101110', b);
+
+@pragma('dart2js:noInline')
+f_101_011_111_001_0(Set<String> u, int b) => v(u, '1010111110010', b);
+
+@pragma('dart2js:noInline')
+f_101_011_111_011_0(Set<String> u, int b) => v(u, '1010111110110', b);
+
+@pragma('dart2js:noInline')
+f_101_011_111_101_0(Set<String> u, int b) => v(u, '1010111111010', b);
+
+@pragma('dart2js:noInline')
+f_101_011_111_111_0(Set<String> u, int b) => v(u, '1010111111110', b);
+
+@pragma('dart2js:noInline')
+f_101_100_000_001_0(Set<String> u, int b) => v(u, '1011000000010', b);
+
+@pragma('dart2js:noInline')
+f_101_100_000_011_0(Set<String> u, int b) => v(u, '1011000000110', b);
+
+@pragma('dart2js:noInline')
+f_101_100_000_101_0(Set<String> u, int b) => v(u, '1011000001010', b);
+
+@pragma('dart2js:noInline')
+f_101_100_000_111_0(Set<String> u, int b) => v(u, '1011000001110', b);
+
+@pragma('dart2js:noInline')
+f_101_100_001_001_0(Set<String> u, int b) => v(u, '1011000010010', b);
+
+@pragma('dart2js:noInline')
+f_101_100_001_011_0(Set<String> u, int b) => v(u, '1011000010110', b);
+
+@pragma('dart2js:noInline')
+f_101_100_001_101_0(Set<String> u, int b) => v(u, '1011000011010', b);
+
+@pragma('dart2js:noInline')
+f_101_100_001_111_0(Set<String> u, int b) => v(u, '1011000011110', b);
+
+@pragma('dart2js:noInline')
+f_101_100_010_001_0(Set<String> u, int b) => v(u, '1011000100010', b);
+
+@pragma('dart2js:noInline')
+f_101_100_010_011_0(Set<String> u, int b) => v(u, '1011000100110', b);
+
+@pragma('dart2js:noInline')
+f_101_100_010_101_0(Set<String> u, int b) => v(u, '1011000101010', b);
+
+@pragma('dart2js:noInline')
+f_101_100_010_111_0(Set<String> u, int b) => v(u, '1011000101110', b);
+
+@pragma('dart2js:noInline')
+f_101_100_011_001_0(Set<String> u, int b) => v(u, '1011000110010', b);
+
+@pragma('dart2js:noInline')
+f_101_100_011_011_0(Set<String> u, int b) => v(u, '1011000110110', b);
+
+@pragma('dart2js:noInline')
+f_101_100_011_101_0(Set<String> u, int b) => v(u, '1011000111010', b);
+
+@pragma('dart2js:noInline')
+f_101_100_011_111_0(Set<String> u, int b) => v(u, '1011000111110', b);
+
+@pragma('dart2js:noInline')
+f_101_100_100_001_0(Set<String> u, int b) => v(u, '1011001000010', b);
+
+@pragma('dart2js:noInline')
+f_101_100_100_011_0(Set<String> u, int b) => v(u, '1011001000110', b);
+
+@pragma('dart2js:noInline')
+f_101_100_100_101_0(Set<String> u, int b) => v(u, '1011001001010', b);
+
+@pragma('dart2js:noInline')
+f_101_100_100_111_0(Set<String> u, int b) => v(u, '1011001001110', b);
+
+@pragma('dart2js:noInline')
+f_101_100_101_001_0(Set<String> u, int b) => v(u, '1011001010010', b);
+
+@pragma('dart2js:noInline')
+f_101_100_101_011_0(Set<String> u, int b) => v(u, '1011001010110', b);
+
+@pragma('dart2js:noInline')
+f_101_100_101_101_0(Set<String> u, int b) => v(u, '1011001011010', b);
+
+@pragma('dart2js:noInline')
+f_101_100_101_111_0(Set<String> u, int b) => v(u, '1011001011110', b);
+
+@pragma('dart2js:noInline')
+f_101_100_110_001_0(Set<String> u, int b) => v(u, '1011001100010', b);
+
+@pragma('dart2js:noInline')
+f_101_100_110_011_0(Set<String> u, int b) => v(u, '1011001100110', b);
+
+@pragma('dart2js:noInline')
+f_101_100_110_101_0(Set<String> u, int b) => v(u, '1011001101010', b);
+
+@pragma('dart2js:noInline')
+f_101_100_110_111_0(Set<String> u, int b) => v(u, '1011001101110', b);
+
+@pragma('dart2js:noInline')
+f_101_100_111_001_0(Set<String> u, int b) => v(u, '1011001110010', b);
+
+@pragma('dart2js:noInline')
+f_101_100_111_011_0(Set<String> u, int b) => v(u, '1011001110110', b);
+
+@pragma('dart2js:noInline')
+f_101_100_111_101_0(Set<String> u, int b) => v(u, '1011001111010', b);
+
+@pragma('dart2js:noInline')
+f_101_100_111_111_0(Set<String> u, int b) => v(u, '1011001111110', b);
+
+@pragma('dart2js:noInline')
+f_101_101_000_001_0(Set<String> u, int b) => v(u, '1011010000010', b);
+
+@pragma('dart2js:noInline')
+f_101_101_000_011_0(Set<String> u, int b) => v(u, '1011010000110', b);
+
+@pragma('dart2js:noInline')
+f_101_101_000_101_0(Set<String> u, int b) => v(u, '1011010001010', b);
+
+@pragma('dart2js:noInline')
+f_101_101_000_111_0(Set<String> u, int b) => v(u, '1011010001110', b);
+
+@pragma('dart2js:noInline')
+f_101_101_001_001_0(Set<String> u, int b) => v(u, '1011010010010', b);
+
+@pragma('dart2js:noInline')
+f_101_101_001_011_0(Set<String> u, int b) => v(u, '1011010010110', b);
+
+@pragma('dart2js:noInline')
+f_101_101_001_101_0(Set<String> u, int b) => v(u, '1011010011010', b);
+
+@pragma('dart2js:noInline')
+f_101_101_001_111_0(Set<String> u, int b) => v(u, '1011010011110', b);
+
+@pragma('dart2js:noInline')
+f_101_101_010_001_0(Set<String> u, int b) => v(u, '1011010100010', b);
+
+@pragma('dart2js:noInline')
+f_101_101_010_011_0(Set<String> u, int b) => v(u, '1011010100110', b);
+
+@pragma('dart2js:noInline')
+f_101_101_010_101_0(Set<String> u, int b) => v(u, '1011010101010', b);
+
+@pragma('dart2js:noInline')
+f_101_101_010_111_0(Set<String> u, int b) => v(u, '1011010101110', b);
+
+@pragma('dart2js:noInline')
+f_101_101_011_001_0(Set<String> u, int b) => v(u, '1011010110010', b);
+
+@pragma('dart2js:noInline')
+f_101_101_011_011_0(Set<String> u, int b) => v(u, '1011010110110', b);
+
+@pragma('dart2js:noInline')
+f_101_101_011_101_0(Set<String> u, int b) => v(u, '1011010111010', b);
+
+@pragma('dart2js:noInline')
+f_101_101_011_111_0(Set<String> u, int b) => v(u, '1011010111110', b);
+
+@pragma('dart2js:noInline')
+f_101_101_100_001_0(Set<String> u, int b) => v(u, '1011011000010', b);
+
+@pragma('dart2js:noInline')
+f_101_101_100_011_0(Set<String> u, int b) => v(u, '1011011000110', b);
+
+@pragma('dart2js:noInline')
+f_101_101_100_101_0(Set<String> u, int b) => v(u, '1011011001010', b);
+
+@pragma('dart2js:noInline')
+f_101_101_100_111_0(Set<String> u, int b) => v(u, '1011011001110', b);
+
+@pragma('dart2js:noInline')
+f_101_101_101_001_0(Set<String> u, int b) => v(u, '1011011010010', b);
+
+@pragma('dart2js:noInline')
+f_101_101_101_011_0(Set<String> u, int b) => v(u, '1011011010110', b);
+
+@pragma('dart2js:noInline')
+f_101_101_101_101_0(Set<String> u, int b) => v(u, '1011011011010', b);
+
+@pragma('dart2js:noInline')
+f_101_101_101_111_0(Set<String> u, int b) => v(u, '1011011011110', b);
+
+@pragma('dart2js:noInline')
+f_101_101_110_001_0(Set<String> u, int b) => v(u, '1011011100010', b);
+
+@pragma('dart2js:noInline')
+f_101_101_110_011_0(Set<String> u, int b) => v(u, '1011011100110', b);
+
+@pragma('dart2js:noInline')
+f_101_101_110_101_0(Set<String> u, int b) => v(u, '1011011101010', b);
+
+@pragma('dart2js:noInline')
+f_101_101_110_111_0(Set<String> u, int b) => v(u, '1011011101110', b);
+
+@pragma('dart2js:noInline')
+f_101_101_111_001_0(Set<String> u, int b) => v(u, '1011011110010', b);
+
+@pragma('dart2js:noInline')
+f_101_101_111_011_0(Set<String> u, int b) => v(u, '1011011110110', b);
+
+@pragma('dart2js:noInline')
+f_101_101_111_101_0(Set<String> u, int b) => v(u, '1011011111010', b);
+
+@pragma('dart2js:noInline')
+f_101_101_111_111_0(Set<String> u, int b) => v(u, '1011011111110', b);
+
+@pragma('dart2js:noInline')
+f_101_110_000_001_0(Set<String> u, int b) => v(u, '1011100000010', b);
+
+@pragma('dart2js:noInline')
+f_101_110_000_011_0(Set<String> u, int b) => v(u, '1011100000110', b);
+
+@pragma('dart2js:noInline')
+f_101_110_000_101_0(Set<String> u, int b) => v(u, '1011100001010', b);
+
+@pragma('dart2js:noInline')
+f_101_110_000_111_0(Set<String> u, int b) => v(u, '1011100001110', b);
+
+@pragma('dart2js:noInline')
+f_101_110_001_001_0(Set<String> u, int b) => v(u, '1011100010010', b);
+
+@pragma('dart2js:noInline')
+f_101_110_001_011_0(Set<String> u, int b) => v(u, '1011100010110', b);
+
+@pragma('dart2js:noInline')
+f_101_110_001_101_0(Set<String> u, int b) => v(u, '1011100011010', b);
+
+@pragma('dart2js:noInline')
+f_101_110_001_111_0(Set<String> u, int b) => v(u, '1011100011110', b);
+
+@pragma('dart2js:noInline')
+f_101_110_010_001_0(Set<String> u, int b) => v(u, '1011100100010', b);
+
+@pragma('dart2js:noInline')
+f_101_110_010_011_0(Set<String> u, int b) => v(u, '1011100100110', b);
+
+@pragma('dart2js:noInline')
+f_101_110_010_101_0(Set<String> u, int b) => v(u, '1011100101010', b);
+
+@pragma('dart2js:noInline')
+f_101_110_010_111_0(Set<String> u, int b) => v(u, '1011100101110', b);
+
+@pragma('dart2js:noInline')
+f_101_110_011_001_0(Set<String> u, int b) => v(u, '1011100110010', b);
+
+@pragma('dart2js:noInline')
+f_101_110_011_011_0(Set<String> u, int b) => v(u, '1011100110110', b);
+
+@pragma('dart2js:noInline')
+f_101_110_011_101_0(Set<String> u, int b) => v(u, '1011100111010', b);
+
+@pragma('dart2js:noInline')
+f_101_110_011_111_0(Set<String> u, int b) => v(u, '1011100111110', b);
+
+@pragma('dart2js:noInline')
+f_101_110_100_001_0(Set<String> u, int b) => v(u, '1011101000010', b);
+
+@pragma('dart2js:noInline')
+f_101_110_100_011_0(Set<String> u, int b) => v(u, '1011101000110', b);
+
+@pragma('dart2js:noInline')
+f_101_110_100_101_0(Set<String> u, int b) => v(u, '1011101001010', b);
+
+@pragma('dart2js:noInline')
+f_101_110_100_111_0(Set<String> u, int b) => v(u, '1011101001110', b);
+
+@pragma('dart2js:noInline')
+f_101_110_101_001_0(Set<String> u, int b) => v(u, '1011101010010', b);
+
+@pragma('dart2js:noInline')
+f_101_110_101_011_0(Set<String> u, int b) => v(u, '1011101010110', b);
+
+@pragma('dart2js:noInline')
+f_101_110_101_101_0(Set<String> u, int b) => v(u, '1011101011010', b);
+
+@pragma('dart2js:noInline')
+f_101_110_101_111_0(Set<String> u, int b) => v(u, '1011101011110', b);
+
+@pragma('dart2js:noInline')
+f_101_110_110_001_0(Set<String> u, int b) => v(u, '1011101100010', b);
+
+@pragma('dart2js:noInline')
+f_101_110_110_011_0(Set<String> u, int b) => v(u, '1011101100110', b);
+
+@pragma('dart2js:noInline')
+f_101_110_110_101_0(Set<String> u, int b) => v(u, '1011101101010', b);
+
+@pragma('dart2js:noInline')
+f_101_110_110_111_0(Set<String> u, int b) => v(u, '1011101101110', b);
+
+@pragma('dart2js:noInline')
+f_101_110_111_001_0(Set<String> u, int b) => v(u, '1011101110010', b);
+
+@pragma('dart2js:noInline')
+f_101_110_111_011_0(Set<String> u, int b) => v(u, '1011101110110', b);
+
+@pragma('dart2js:noInline')
+f_101_110_111_101_0(Set<String> u, int b) => v(u, '1011101111010', b);
+
+@pragma('dart2js:noInline')
+f_101_110_111_111_0(Set<String> u, int b) => v(u, '1011101111110', b);
+
+@pragma('dart2js:noInline')
+f_101_111_000_001_0(Set<String> u, int b) => v(u, '1011110000010', b);
+
+@pragma('dart2js:noInline')
+f_101_111_000_011_0(Set<String> u, int b) => v(u, '1011110000110', b);
+
+@pragma('dart2js:noInline')
+f_101_111_000_101_0(Set<String> u, int b) => v(u, '1011110001010', b);
+
+@pragma('dart2js:noInline')
+f_101_111_000_111_0(Set<String> u, int b) => v(u, '1011110001110', b);
+
+@pragma('dart2js:noInline')
+f_101_111_001_001_0(Set<String> u, int b) => v(u, '1011110010010', b);
+
+@pragma('dart2js:noInline')
+f_101_111_001_011_0(Set<String> u, int b) => v(u, '1011110010110', b);
+
+@pragma('dart2js:noInline')
+f_101_111_001_101_0(Set<String> u, int b) => v(u, '1011110011010', b);
+
+@pragma('dart2js:noInline')
+f_101_111_001_111_0(Set<String> u, int b) => v(u, '1011110011110', b);
+
+@pragma('dart2js:noInline')
+f_101_111_010_001_0(Set<String> u, int b) => v(u, '1011110100010', b);
+
+@pragma('dart2js:noInline')
+f_101_111_010_011_0(Set<String> u, int b) => v(u, '1011110100110', b);
+
+@pragma('dart2js:noInline')
+f_101_111_010_101_0(Set<String> u, int b) => v(u, '1011110101010', b);
+
+@pragma('dart2js:noInline')
+f_101_111_010_111_0(Set<String> u, int b) => v(u, '1011110101110', b);
+
+@pragma('dart2js:noInline')
+f_101_111_011_001_0(Set<String> u, int b) => v(u, '1011110110010', b);
+
+@pragma('dart2js:noInline')
+f_101_111_011_011_0(Set<String> u, int b) => v(u, '1011110110110', b);
+
+@pragma('dart2js:noInline')
+f_101_111_011_101_0(Set<String> u, int b) => v(u, '1011110111010', b);
+
+@pragma('dart2js:noInline')
+f_101_111_011_111_0(Set<String> u, int b) => v(u, '1011110111110', b);
+
+@pragma('dart2js:noInline')
+f_101_111_100_001_0(Set<String> u, int b) => v(u, '1011111000010', b);
+
+@pragma('dart2js:noInline')
+f_101_111_100_011_0(Set<String> u, int b) => v(u, '1011111000110', b);
+
+@pragma('dart2js:noInline')
+f_101_111_100_101_0(Set<String> u, int b) => v(u, '1011111001010', b);
+
+@pragma('dart2js:noInline')
+f_101_111_100_111_0(Set<String> u, int b) => v(u, '1011111001110', b);
+
+@pragma('dart2js:noInline')
+f_101_111_101_001_0(Set<String> u, int b) => v(u, '1011111010010', b);
+
+@pragma('dart2js:noInline')
+f_101_111_101_011_0(Set<String> u, int b) => v(u, '1011111010110', b);
+
+@pragma('dart2js:noInline')
+f_101_111_101_101_0(Set<String> u, int b) => v(u, '1011111011010', b);
+
+@pragma('dart2js:noInline')
+f_101_111_101_111_0(Set<String> u, int b) => v(u, '1011111011110', b);
+
+@pragma('dart2js:noInline')
+f_101_111_110_001_0(Set<String> u, int b) => v(u, '1011111100010', b);
+
+@pragma('dart2js:noInline')
+f_101_111_110_011_0(Set<String> u, int b) => v(u, '1011111100110', b);
+
+@pragma('dart2js:noInline')
+f_101_111_110_101_0(Set<String> u, int b) => v(u, '1011111101010', b);
+
+@pragma('dart2js:noInline')
+f_101_111_110_111_0(Set<String> u, int b) => v(u, '1011111101110', b);
+
+@pragma('dart2js:noInline')
+f_101_111_111_001_0(Set<String> u, int b) => v(u, '1011111110010', b);
+
+@pragma('dart2js:noInline')
+f_101_111_111_011_0(Set<String> u, int b) => v(u, '1011111110110', b);
+
+@pragma('dart2js:noInline')
+f_101_111_111_101_0(Set<String> u, int b) => v(u, '1011111111010', b);
+
+@pragma('dart2js:noInline')
+f_101_111_111_111_0(Set<String> u, int b) => v(u, '1011111111110', b);
+
+@pragma('dart2js:noInline')
+f_110_000_000_001_0(Set<String> u, int b) => v(u, '1100000000010', b);
+
+@pragma('dart2js:noInline')
+f_110_000_000_011_0(Set<String> u, int b) => v(u, '1100000000110', b);
+
+@pragma('dart2js:noInline')
+f_110_000_000_101_0(Set<String> u, int b) => v(u, '1100000001010', b);
+
+@pragma('dart2js:noInline')
+f_110_000_000_111_0(Set<String> u, int b) => v(u, '1100000001110', b);
+
+@pragma('dart2js:noInline')
+f_110_000_001_001_0(Set<String> u, int b) => v(u, '1100000010010', b);
+
+@pragma('dart2js:noInline')
+f_110_000_001_011_0(Set<String> u, int b) => v(u, '1100000010110', b);
+
+@pragma('dart2js:noInline')
+f_110_000_001_101_0(Set<String> u, int b) => v(u, '1100000011010', b);
+
+@pragma('dart2js:noInline')
+f_110_000_001_111_0(Set<String> u, int b) => v(u, '1100000011110', b);
+
+@pragma('dart2js:noInline')
+f_110_000_010_001_0(Set<String> u, int b) => v(u, '1100000100010', b);
+
+@pragma('dart2js:noInline')
+f_110_000_010_011_0(Set<String> u, int b) => v(u, '1100000100110', b);
+
+@pragma('dart2js:noInline')
+f_110_000_010_101_0(Set<String> u, int b) => v(u, '1100000101010', b);
+
+@pragma('dart2js:noInline')
+f_110_000_010_111_0(Set<String> u, int b) => v(u, '1100000101110', b);
+
+@pragma('dart2js:noInline')
+f_110_000_011_001_0(Set<String> u, int b) => v(u, '1100000110010', b);
+
+@pragma('dart2js:noInline')
+f_110_000_011_011_0(Set<String> u, int b) => v(u, '1100000110110', b);
+
+@pragma('dart2js:noInline')
+f_110_000_011_101_0(Set<String> u, int b) => v(u, '1100000111010', b);
+
+@pragma('dart2js:noInline')
+f_110_000_011_111_0(Set<String> u, int b) => v(u, '1100000111110', b);
+
+@pragma('dart2js:noInline')
+f_110_000_100_001_0(Set<String> u, int b) => v(u, '1100001000010', b);
+
+@pragma('dart2js:noInline')
+f_110_000_100_011_0(Set<String> u, int b) => v(u, '1100001000110', b);
+
+@pragma('dart2js:noInline')
+f_110_000_100_101_0(Set<String> u, int b) => v(u, '1100001001010', b);
+
+@pragma('dart2js:noInline')
+f_110_000_100_111_0(Set<String> u, int b) => v(u, '1100001001110', b);
+
+@pragma('dart2js:noInline')
+f_110_000_101_001_0(Set<String> u, int b) => v(u, '1100001010010', b);
+
+@pragma('dart2js:noInline')
+f_110_000_101_011_0(Set<String> u, int b) => v(u, '1100001010110', b);
+
+@pragma('dart2js:noInline')
+f_110_000_101_101_0(Set<String> u, int b) => v(u, '1100001011010', b);
+
+@pragma('dart2js:noInline')
+f_110_000_101_111_0(Set<String> u, int b) => v(u, '1100001011110', b);
+
+@pragma('dart2js:noInline')
+f_110_000_110_001_0(Set<String> u, int b) => v(u, '1100001100010', b);
+
+@pragma('dart2js:noInline')
+f_110_000_110_011_0(Set<String> u, int b) => v(u, '1100001100110', b);
+
+@pragma('dart2js:noInline')
+f_110_000_110_101_0(Set<String> u, int b) => v(u, '1100001101010', b);
+
+@pragma('dart2js:noInline')
+f_110_000_110_111_0(Set<String> u, int b) => v(u, '1100001101110', b);
+
+@pragma('dart2js:noInline')
+f_110_000_111_001_0(Set<String> u, int b) => v(u, '1100001110010', b);
+
+@pragma('dart2js:noInline')
+f_110_000_111_011_0(Set<String> u, int b) => v(u, '1100001110110', b);
+
+@pragma('dart2js:noInline')
+f_110_000_111_101_0(Set<String> u, int b) => v(u, '1100001111010', b);
+
+@pragma('dart2js:noInline')
+f_110_000_111_111_0(Set<String> u, int b) => v(u, '1100001111110', b);
+
+@pragma('dart2js:noInline')
+f_110_001_000_001_0(Set<String> u, int b) => v(u, '1100010000010', b);
+
+@pragma('dart2js:noInline')
+f_110_001_000_011_0(Set<String> u, int b) => v(u, '1100010000110', b);
+
+@pragma('dart2js:noInline')
+f_110_001_000_101_0(Set<String> u, int b) => v(u, '1100010001010', b);
+
+@pragma('dart2js:noInline')
+f_110_001_000_111_0(Set<String> u, int b) => v(u, '1100010001110', b);
+
+@pragma('dart2js:noInline')
+f_110_001_001_001_0(Set<String> u, int b) => v(u, '1100010010010', b);
+
+@pragma('dart2js:noInline')
+f_110_001_001_011_0(Set<String> u, int b) => v(u, '1100010010110', b);
+
+@pragma('dart2js:noInline')
+f_110_001_001_101_0(Set<String> u, int b) => v(u, '1100010011010', b);
+
+@pragma('dart2js:noInline')
+f_110_001_001_111_0(Set<String> u, int b) => v(u, '1100010011110', b);
+
+@pragma('dart2js:noInline')
+f_110_001_010_001_0(Set<String> u, int b) => v(u, '1100010100010', b);
+
+@pragma('dart2js:noInline')
+f_110_001_010_011_0(Set<String> u, int b) => v(u, '1100010100110', b);
+
+@pragma('dart2js:noInline')
+f_110_001_010_101_0(Set<String> u, int b) => v(u, '1100010101010', b);
+
+@pragma('dart2js:noInline')
+f_110_001_010_111_0(Set<String> u, int b) => v(u, '1100010101110', b);
+
+@pragma('dart2js:noInline')
+f_110_001_011_001_0(Set<String> u, int b) => v(u, '1100010110010', b);
+
+@pragma('dart2js:noInline')
+f_110_001_011_011_0(Set<String> u, int b) => v(u, '1100010110110', b);
+
+@pragma('dart2js:noInline')
+f_110_001_011_101_0(Set<String> u, int b) => v(u, '1100010111010', b);
+
+@pragma('dart2js:noInline')
+f_110_001_011_111_0(Set<String> u, int b) => v(u, '1100010111110', b);
+
+@pragma('dart2js:noInline')
+f_110_001_100_001_0(Set<String> u, int b) => v(u, '1100011000010', b);
+
+@pragma('dart2js:noInline')
+f_110_001_100_011_0(Set<String> u, int b) => v(u, '1100011000110', b);
+
+@pragma('dart2js:noInline')
+f_110_001_100_101_0(Set<String> u, int b) => v(u, '1100011001010', b);
+
+@pragma('dart2js:noInline')
+f_110_001_100_111_0(Set<String> u, int b) => v(u, '1100011001110', b);
+
+@pragma('dart2js:noInline')
+f_110_001_101_001_0(Set<String> u, int b) => v(u, '1100011010010', b);
+
+@pragma('dart2js:noInline')
+f_110_001_101_011_0(Set<String> u, int b) => v(u, '1100011010110', b);
+
+@pragma('dart2js:noInline')
+f_110_001_101_101_0(Set<String> u, int b) => v(u, '1100011011010', b);
+
+@pragma('dart2js:noInline')
+f_110_001_101_111_0(Set<String> u, int b) => v(u, '1100011011110', b);
+
+@pragma('dart2js:noInline')
+f_110_001_110_001_0(Set<String> u, int b) => v(u, '1100011100010', b);
+
+@pragma('dart2js:noInline')
+f_110_001_110_011_0(Set<String> u, int b) => v(u, '1100011100110', b);
+
+@pragma('dart2js:noInline')
+f_110_001_110_101_0(Set<String> u, int b) => v(u, '1100011101010', b);
+
+@pragma('dart2js:noInline')
+f_110_001_110_111_0(Set<String> u, int b) => v(u, '1100011101110', b);
+
+@pragma('dart2js:noInline')
+f_110_001_111_001_0(Set<String> u, int b) => v(u, '1100011110010', b);
+
+@pragma('dart2js:noInline')
+f_110_001_111_011_0(Set<String> u, int b) => v(u, '1100011110110', b);
+
+@pragma('dart2js:noInline')
+f_110_001_111_101_0(Set<String> u, int b) => v(u, '1100011111010', b);
+
+@pragma('dart2js:noInline')
+f_110_001_111_111_0(Set<String> u, int b) => v(u, '1100011111110', b);
+
+@pragma('dart2js:noInline')
+f_110_010_000_001_0(Set<String> u, int b) => v(u, '1100100000010', b);
+
+@pragma('dart2js:noInline')
+f_110_010_000_011_0(Set<String> u, int b) => v(u, '1100100000110', b);
+
+@pragma('dart2js:noInline')
+f_110_010_000_101_0(Set<String> u, int b) => v(u, '1100100001010', b);
+
+@pragma('dart2js:noInline')
+f_110_010_000_111_0(Set<String> u, int b) => v(u, '1100100001110', b);
+
+@pragma('dart2js:noInline')
+f_110_010_001_001_0(Set<String> u, int b) => v(u, '1100100010010', b);
+
+@pragma('dart2js:noInline')
+f_110_010_001_011_0(Set<String> u, int b) => v(u, '1100100010110', b);
+
+@pragma('dart2js:noInline')
+f_110_010_001_101_0(Set<String> u, int b) => v(u, '1100100011010', b);
+
+@pragma('dart2js:noInline')
+f_110_010_001_111_0(Set<String> u, int b) => v(u, '1100100011110', b);
+
+@pragma('dart2js:noInline')
+f_110_010_010_001_0(Set<String> u, int b) => v(u, '1100100100010', b);
+
+@pragma('dart2js:noInline')
+f_110_010_010_011_0(Set<String> u, int b) => v(u, '1100100100110', b);
+
+@pragma('dart2js:noInline')
+f_110_010_010_101_0(Set<String> u, int b) => v(u, '1100100101010', b);
+
+@pragma('dart2js:noInline')
+f_110_010_010_111_0(Set<String> u, int b) => v(u, '1100100101110', b);
+
+@pragma('dart2js:noInline')
+f_110_010_011_001_0(Set<String> u, int b) => v(u, '1100100110010', b);
+
+@pragma('dart2js:noInline')
+f_110_010_011_011_0(Set<String> u, int b) => v(u, '1100100110110', b);
+
+@pragma('dart2js:noInline')
+f_110_010_011_101_0(Set<String> u, int b) => v(u, '1100100111010', b);
+
+@pragma('dart2js:noInline')
+f_110_010_011_111_0(Set<String> u, int b) => v(u, '1100100111110', b);
+
+@pragma('dart2js:noInline')
+f_110_010_100_001_0(Set<String> u, int b) => v(u, '1100101000010', b);
+
+@pragma('dart2js:noInline')
+f_110_010_100_011_0(Set<String> u, int b) => v(u, '1100101000110', b);
+
+@pragma('dart2js:noInline')
+f_110_010_100_101_0(Set<String> u, int b) => v(u, '1100101001010', b);
+
+@pragma('dart2js:noInline')
+f_110_010_100_111_0(Set<String> u, int b) => v(u, '1100101001110', b);
+
+@pragma('dart2js:noInline')
+f_110_010_101_001_0(Set<String> u, int b) => v(u, '1100101010010', b);
+
+@pragma('dart2js:noInline')
+f_110_010_101_011_0(Set<String> u, int b) => v(u, '1100101010110', b);
+
+@pragma('dart2js:noInline')
+f_110_010_101_101_0(Set<String> u, int b) => v(u, '1100101011010', b);
+
+@pragma('dart2js:noInline')
+f_110_010_101_111_0(Set<String> u, int b) => v(u, '1100101011110', b);
+
+@pragma('dart2js:noInline')
+f_110_010_110_001_0(Set<String> u, int b) => v(u, '1100101100010', b);
+
+@pragma('dart2js:noInline')
+f_110_010_110_011_0(Set<String> u, int b) => v(u, '1100101100110', b);
+
+@pragma('dart2js:noInline')
+f_110_010_110_101_0(Set<String> u, int b) => v(u, '1100101101010', b);
+
+@pragma('dart2js:noInline')
+f_110_010_110_111_0(Set<String> u, int b) => v(u, '1100101101110', b);
+
+@pragma('dart2js:noInline')
+f_110_010_111_001_0(Set<String> u, int b) => v(u, '1100101110010', b);
+
+@pragma('dart2js:noInline')
+f_110_010_111_011_0(Set<String> u, int b) => v(u, '1100101110110', b);
+
+@pragma('dart2js:noInline')
+f_110_010_111_101_0(Set<String> u, int b) => v(u, '1100101111010', b);
+
+@pragma('dart2js:noInline')
+f_110_010_111_111_0(Set<String> u, int b) => v(u, '1100101111110', b);
+
+@pragma('dart2js:noInline')
+f_110_011_000_001_0(Set<String> u, int b) => v(u, '1100110000010', b);
+
+@pragma('dart2js:noInline')
+f_110_011_000_011_0(Set<String> u, int b) => v(u, '1100110000110', b);
+
+@pragma('dart2js:noInline')
+f_110_011_000_101_0(Set<String> u, int b) => v(u, '1100110001010', b);
+
+@pragma('dart2js:noInline')
+f_110_011_000_111_0(Set<String> u, int b) => v(u, '1100110001110', b);
+
+@pragma('dart2js:noInline')
+f_110_011_001_001_0(Set<String> u, int b) => v(u, '1100110010010', b);
+
+@pragma('dart2js:noInline')
+f_110_011_001_011_0(Set<String> u, int b) => v(u, '1100110010110', b);
+
+@pragma('dart2js:noInline')
+f_110_011_001_101_0(Set<String> u, int b) => v(u, '1100110011010', b);
+
+@pragma('dart2js:noInline')
+f_110_011_001_111_0(Set<String> u, int b) => v(u, '1100110011110', b);
+
+@pragma('dart2js:noInline')
+f_110_011_010_001_0(Set<String> u, int b) => v(u, '1100110100010', b);
+
+@pragma('dart2js:noInline')
+f_110_011_010_011_0(Set<String> u, int b) => v(u, '1100110100110', b);
+
+@pragma('dart2js:noInline')
+f_110_011_010_101_0(Set<String> u, int b) => v(u, '1100110101010', b);
+
+@pragma('dart2js:noInline')
+f_110_011_010_111_0(Set<String> u, int b) => v(u, '1100110101110', b);
+
+@pragma('dart2js:noInline')
+f_110_011_011_001_0(Set<String> u, int b) => v(u, '1100110110010', b);
+
+@pragma('dart2js:noInline')
+f_110_011_011_011_0(Set<String> u, int b) => v(u, '1100110110110', b);
+
+@pragma('dart2js:noInline')
+f_110_011_011_101_0(Set<String> u, int b) => v(u, '1100110111010', b);
+
+@pragma('dart2js:noInline')
+f_110_011_011_111_0(Set<String> u, int b) => v(u, '1100110111110', b);
+
+@pragma('dart2js:noInline')
+f_110_011_100_001_0(Set<String> u, int b) => v(u, '1100111000010', b);
+
+@pragma('dart2js:noInline')
+f_110_011_100_011_0(Set<String> u, int b) => v(u, '1100111000110', b);
+
+@pragma('dart2js:noInline')
+f_110_011_100_101_0(Set<String> u, int b) => v(u, '1100111001010', b);
+
+@pragma('dart2js:noInline')
+f_110_011_100_111_0(Set<String> u, int b) => v(u, '1100111001110', b);
+
+@pragma('dart2js:noInline')
+f_110_011_101_001_0(Set<String> u, int b) => v(u, '1100111010010', b);
+
+@pragma('dart2js:noInline')
+f_110_011_101_011_0(Set<String> u, int b) => v(u, '1100111010110', b);
+
+@pragma('dart2js:noInline')
+f_110_011_101_101_0(Set<String> u, int b) => v(u, '1100111011010', b);
+
+@pragma('dart2js:noInline')
+f_110_011_101_111_0(Set<String> u, int b) => v(u, '1100111011110', b);
+
+@pragma('dart2js:noInline')
+f_110_011_110_001_0(Set<String> u, int b) => v(u, '1100111100010', b);
+
+@pragma('dart2js:noInline')
+f_110_011_110_011_0(Set<String> u, int b) => v(u, '1100111100110', b);
+
+@pragma('dart2js:noInline')
+f_110_011_110_101_0(Set<String> u, int b) => v(u, '1100111101010', b);
+
+@pragma('dart2js:noInline')
+f_110_011_110_111_0(Set<String> u, int b) => v(u, '1100111101110', b);
+
+@pragma('dart2js:noInline')
+f_110_011_111_001_0(Set<String> u, int b) => v(u, '1100111110010', b);
+
+@pragma('dart2js:noInline')
+f_110_011_111_011_0(Set<String> u, int b) => v(u, '1100111110110', b);
+
+@pragma('dart2js:noInline')
+f_110_011_111_101_0(Set<String> u, int b) => v(u, '1100111111010', b);
+
+@pragma('dart2js:noInline')
+f_110_011_111_111_0(Set<String> u, int b) => v(u, '1100111111110', b);
+
+@pragma('dart2js:noInline')
+f_110_100_000_001_0(Set<String> u, int b) => v(u, '1101000000010', b);
+
+@pragma('dart2js:noInline')
+f_110_100_000_011_0(Set<String> u, int b) => v(u, '1101000000110', b);
+
+@pragma('dart2js:noInline')
+f_110_100_000_101_0(Set<String> u, int b) => v(u, '1101000001010', b);
+
+@pragma('dart2js:noInline')
+f_110_100_000_111_0(Set<String> u, int b) => v(u, '1101000001110', b);
+
+@pragma('dart2js:noInline')
+f_110_100_001_001_0(Set<String> u, int b) => v(u, '1101000010010', b);
+
+@pragma('dart2js:noInline')
+f_110_100_001_011_0(Set<String> u, int b) => v(u, '1101000010110', b);
+
+@pragma('dart2js:noInline')
+f_110_100_001_101_0(Set<String> u, int b) => v(u, '1101000011010', b);
+
+@pragma('dart2js:noInline')
+f_110_100_001_111_0(Set<String> u, int b) => v(u, '1101000011110', b);
+
+@pragma('dart2js:noInline')
+f_110_100_010_001_0(Set<String> u, int b) => v(u, '1101000100010', b);
+
+@pragma('dart2js:noInline')
+f_110_100_010_011_0(Set<String> u, int b) => v(u, '1101000100110', b);
+
+@pragma('dart2js:noInline')
+f_110_100_010_101_0(Set<String> u, int b) => v(u, '1101000101010', b);
+
+@pragma('dart2js:noInline')
+f_110_100_010_111_0(Set<String> u, int b) => v(u, '1101000101110', b);
+
+@pragma('dart2js:noInline')
+f_110_100_011_001_0(Set<String> u, int b) => v(u, '1101000110010', b);
+
+@pragma('dart2js:noInline')
+f_110_100_011_011_0(Set<String> u, int b) => v(u, '1101000110110', b);
+
+@pragma('dart2js:noInline')
+f_110_100_011_101_0(Set<String> u, int b) => v(u, '1101000111010', b);
+
+@pragma('dart2js:noInline')
+f_110_100_011_111_0(Set<String> u, int b) => v(u, '1101000111110', b);
+
+@pragma('dart2js:noInline')
+f_110_100_100_001_0(Set<String> u, int b) => v(u, '1101001000010', b);
+
+@pragma('dart2js:noInline')
+f_110_100_100_011_0(Set<String> u, int b) => v(u, '1101001000110', b);
+
+@pragma('dart2js:noInline')
+f_110_100_100_101_0(Set<String> u, int b) => v(u, '1101001001010', b);
+
+@pragma('dart2js:noInline')
+f_110_100_100_111_0(Set<String> u, int b) => v(u, '1101001001110', b);
+
+@pragma('dart2js:noInline')
+f_110_100_101_001_0(Set<String> u, int b) => v(u, '1101001010010', b);
+
+@pragma('dart2js:noInline')
+f_110_100_101_011_0(Set<String> u, int b) => v(u, '1101001010110', b);
+
+@pragma('dart2js:noInline')
+f_110_100_101_101_0(Set<String> u, int b) => v(u, '1101001011010', b);
+
+@pragma('dart2js:noInline')
+f_110_100_101_111_0(Set<String> u, int b) => v(u, '1101001011110', b);
+
+@pragma('dart2js:noInline')
+f_110_100_110_001_0(Set<String> u, int b) => v(u, '1101001100010', b);
+
+@pragma('dart2js:noInline')
+f_110_100_110_011_0(Set<String> u, int b) => v(u, '1101001100110', b);
+
+@pragma('dart2js:noInline')
+f_110_100_110_101_0(Set<String> u, int b) => v(u, '1101001101010', b);
+
+@pragma('dart2js:noInline')
+f_110_100_110_111_0(Set<String> u, int b) => v(u, '1101001101110', b);
+
+@pragma('dart2js:noInline')
+f_110_100_111_001_0(Set<String> u, int b) => v(u, '1101001110010', b);
+
+@pragma('dart2js:noInline')
+f_110_100_111_011_0(Set<String> u, int b) => v(u, '1101001110110', b);
+
+@pragma('dart2js:noInline')
+f_110_100_111_101_0(Set<String> u, int b) => v(u, '1101001111010', b);
+
+@pragma('dart2js:noInline')
+f_110_100_111_111_0(Set<String> u, int b) => v(u, '1101001111110', b);
+
+@pragma('dart2js:noInline')
+f_110_101_000_001_0(Set<String> u, int b) => v(u, '1101010000010', b);
+
+@pragma('dart2js:noInline')
+f_110_101_000_011_0(Set<String> u, int b) => v(u, '1101010000110', b);
+
+@pragma('dart2js:noInline')
+f_110_101_000_101_0(Set<String> u, int b) => v(u, '1101010001010', b);
+
+@pragma('dart2js:noInline')
+f_110_101_000_111_0(Set<String> u, int b) => v(u, '1101010001110', b);
+
+@pragma('dart2js:noInline')
+f_110_101_001_001_0(Set<String> u, int b) => v(u, '1101010010010', b);
+
+@pragma('dart2js:noInline')
+f_110_101_001_011_0(Set<String> u, int b) => v(u, '1101010010110', b);
+
+@pragma('dart2js:noInline')
+f_110_101_001_101_0(Set<String> u, int b) => v(u, '1101010011010', b);
+
+@pragma('dart2js:noInline')
+f_110_101_001_111_0(Set<String> u, int b) => v(u, '1101010011110', b);
+
+@pragma('dart2js:noInline')
+f_110_101_010_001_0(Set<String> u, int b) => v(u, '1101010100010', b);
+
+@pragma('dart2js:noInline')
+f_110_101_010_011_0(Set<String> u, int b) => v(u, '1101010100110', b);
+
+@pragma('dart2js:noInline')
+f_110_101_010_101_0(Set<String> u, int b) => v(u, '1101010101010', b);
+
+@pragma('dart2js:noInline')
+f_110_101_010_111_0(Set<String> u, int b) => v(u, '1101010101110', b);
+
+@pragma('dart2js:noInline')
+f_110_101_011_001_0(Set<String> u, int b) => v(u, '1101010110010', b);
+
+@pragma('dart2js:noInline')
+f_110_101_011_011_0(Set<String> u, int b) => v(u, '1101010110110', b);
+
+@pragma('dart2js:noInline')
+f_110_101_011_101_0(Set<String> u, int b) => v(u, '1101010111010', b);
+
+@pragma('dart2js:noInline')
+f_110_101_011_111_0(Set<String> u, int b) => v(u, '1101010111110', b);
+
+@pragma('dart2js:noInline')
+f_110_101_100_001_0(Set<String> u, int b) => v(u, '1101011000010', b);
+
+@pragma('dart2js:noInline')
+f_110_101_100_011_0(Set<String> u, int b) => v(u, '1101011000110', b);
+
+@pragma('dart2js:noInline')
+f_110_101_100_101_0(Set<String> u, int b) => v(u, '1101011001010', b);
+
+@pragma('dart2js:noInline')
+f_110_101_100_111_0(Set<String> u, int b) => v(u, '1101011001110', b);
+
+@pragma('dart2js:noInline')
+f_110_101_101_001_0(Set<String> u, int b) => v(u, '1101011010010', b);
+
+@pragma('dart2js:noInline')
+f_110_101_101_011_0(Set<String> u, int b) => v(u, '1101011010110', b);
+
+@pragma('dart2js:noInline')
+f_110_101_101_101_0(Set<String> u, int b) => v(u, '1101011011010', b);
+
+@pragma('dart2js:noInline')
+f_110_101_101_111_0(Set<String> u, int b) => v(u, '1101011011110', b);
+
+@pragma('dart2js:noInline')
+f_110_101_110_001_0(Set<String> u, int b) => v(u, '1101011100010', b);
+
+@pragma('dart2js:noInline')
+f_110_101_110_011_0(Set<String> u, int b) => v(u, '1101011100110', b);
+
+@pragma('dart2js:noInline')
+f_110_101_110_101_0(Set<String> u, int b) => v(u, '1101011101010', b);
+
+@pragma('dart2js:noInline')
+f_110_101_110_111_0(Set<String> u, int b) => v(u, '1101011101110', b);
+
+@pragma('dart2js:noInline')
+f_110_101_111_001_0(Set<String> u, int b) => v(u, '1101011110010', b);
+
+@pragma('dart2js:noInline')
+f_110_101_111_011_0(Set<String> u, int b) => v(u, '1101011110110', b);
+
+@pragma('dart2js:noInline')
+f_110_101_111_101_0(Set<String> u, int b) => v(u, '1101011111010', b);
+
+@pragma('dart2js:noInline')
+f_110_101_111_111_0(Set<String> u, int b) => v(u, '1101011111110', b);
+
+@pragma('dart2js:noInline')
+f_110_110_000_001_0(Set<String> u, int b) => v(u, '1101100000010', b);
+
+@pragma('dart2js:noInline')
+f_110_110_000_011_0(Set<String> u, int b) => v(u, '1101100000110', b);
+
+@pragma('dart2js:noInline')
+f_110_110_000_101_0(Set<String> u, int b) => v(u, '1101100001010', b);
+
+@pragma('dart2js:noInline')
+f_110_110_000_111_0(Set<String> u, int b) => v(u, '1101100001110', b);
+
+@pragma('dart2js:noInline')
+f_110_110_001_001_0(Set<String> u, int b) => v(u, '1101100010010', b);
+
+@pragma('dart2js:noInline')
+f_110_110_001_011_0(Set<String> u, int b) => v(u, '1101100010110', b);
+
+@pragma('dart2js:noInline')
+f_110_110_001_101_0(Set<String> u, int b) => v(u, '1101100011010', b);
+
+@pragma('dart2js:noInline')
+f_110_110_001_111_0(Set<String> u, int b) => v(u, '1101100011110', b);
+
+@pragma('dart2js:noInline')
+f_110_110_010_001_0(Set<String> u, int b) => v(u, '1101100100010', b);
+
+@pragma('dart2js:noInline')
+f_110_110_010_011_0(Set<String> u, int b) => v(u, '1101100100110', b);
+
+@pragma('dart2js:noInline')
+f_110_110_010_101_0(Set<String> u, int b) => v(u, '1101100101010', b);
+
+@pragma('dart2js:noInline')
+f_110_110_010_111_0(Set<String> u, int b) => v(u, '1101100101110', b);
+
+@pragma('dart2js:noInline')
+f_110_110_011_001_0(Set<String> u, int b) => v(u, '1101100110010', b);
+
+@pragma('dart2js:noInline')
+f_110_110_011_011_0(Set<String> u, int b) => v(u, '1101100110110', b);
+
+@pragma('dart2js:noInline')
+f_110_110_011_101_0(Set<String> u, int b) => v(u, '1101100111010', b);
+
+@pragma('dart2js:noInline')
+f_110_110_011_111_0(Set<String> u, int b) => v(u, '1101100111110', b);
+
+@pragma('dart2js:noInline')
+f_110_110_100_001_0(Set<String> u, int b) => v(u, '1101101000010', b);
+
+@pragma('dart2js:noInline')
+f_110_110_100_011_0(Set<String> u, int b) => v(u, '1101101000110', b);
+
+@pragma('dart2js:noInline')
+f_110_110_100_101_0(Set<String> u, int b) => v(u, '1101101001010', b);
+
+@pragma('dart2js:noInline')
+f_110_110_100_111_0(Set<String> u, int b) => v(u, '1101101001110', b);
+
+@pragma('dart2js:noInline')
+f_110_110_101_001_0(Set<String> u, int b) => v(u, '1101101010010', b);
+
+@pragma('dart2js:noInline')
+f_110_110_101_011_0(Set<String> u, int b) => v(u, '1101101010110', b);
+
+@pragma('dart2js:noInline')
+f_110_110_101_101_0(Set<String> u, int b) => v(u, '1101101011010', b);
+
+@pragma('dart2js:noInline')
+f_110_110_101_111_0(Set<String> u, int b) => v(u, '1101101011110', b);
+
+@pragma('dart2js:noInline')
+f_110_110_110_001_0(Set<String> u, int b) => v(u, '1101101100010', b);
+
+@pragma('dart2js:noInline')
+f_110_110_110_011_0(Set<String> u, int b) => v(u, '1101101100110', b);
+
+@pragma('dart2js:noInline')
+f_110_110_110_101_0(Set<String> u, int b) => v(u, '1101101101010', b);
+
+@pragma('dart2js:noInline')
+f_110_110_110_111_0(Set<String> u, int b) => v(u, '1101101101110', b);
+
+@pragma('dart2js:noInline')
+f_110_110_111_001_0(Set<String> u, int b) => v(u, '1101101110010', b);
+
+@pragma('dart2js:noInline')
+f_110_110_111_011_0(Set<String> u, int b) => v(u, '1101101110110', b);
+
+@pragma('dart2js:noInline')
+f_110_110_111_101_0(Set<String> u, int b) => v(u, '1101101111010', b);
+
+@pragma('dart2js:noInline')
+f_110_110_111_111_0(Set<String> u, int b) => v(u, '1101101111110', b);
+
+@pragma('dart2js:noInline')
+f_110_111_000_001_0(Set<String> u, int b) => v(u, '1101110000010', b);
+
+@pragma('dart2js:noInline')
+f_110_111_000_011_0(Set<String> u, int b) => v(u, '1101110000110', b);
+
+@pragma('dart2js:noInline')
+f_110_111_000_101_0(Set<String> u, int b) => v(u, '1101110001010', b);
+
+@pragma('dart2js:noInline')
+f_110_111_000_111_0(Set<String> u, int b) => v(u, '1101110001110', b);
+
+@pragma('dart2js:noInline')
+f_110_111_001_001_0(Set<String> u, int b) => v(u, '1101110010010', b);
+
+@pragma('dart2js:noInline')
+f_110_111_001_011_0(Set<String> u, int b) => v(u, '1101110010110', b);
+
+@pragma('dart2js:noInline')
+f_110_111_001_101_0(Set<String> u, int b) => v(u, '1101110011010', b);
+
+@pragma('dart2js:noInline')
+f_110_111_001_111_0(Set<String> u, int b) => v(u, '1101110011110', b);
+
+@pragma('dart2js:noInline')
+f_110_111_010_001_0(Set<String> u, int b) => v(u, '1101110100010', b);
+
+@pragma('dart2js:noInline')
+f_110_111_010_011_0(Set<String> u, int b) => v(u, '1101110100110', b);
+
+@pragma('dart2js:noInline')
+f_110_111_010_101_0(Set<String> u, int b) => v(u, '1101110101010', b);
+
+@pragma('dart2js:noInline')
+f_110_111_010_111_0(Set<String> u, int b) => v(u, '1101110101110', b);
+
+@pragma('dart2js:noInline')
+f_110_111_011_001_0(Set<String> u, int b) => v(u, '1101110110010', b);
+
+@pragma('dart2js:noInline')
+f_110_111_011_011_0(Set<String> u, int b) => v(u, '1101110110110', b);
+
+@pragma('dart2js:noInline')
+f_110_111_011_101_0(Set<String> u, int b) => v(u, '1101110111010', b);
+
+@pragma('dart2js:noInline')
+f_110_111_011_111_0(Set<String> u, int b) => v(u, '1101110111110', b);
+
+@pragma('dart2js:noInline')
+f_110_111_100_001_0(Set<String> u, int b) => v(u, '1101111000010', b);
+
+@pragma('dart2js:noInline')
+f_110_111_100_011_0(Set<String> u, int b) => v(u, '1101111000110', b);
+
+@pragma('dart2js:noInline')
+f_110_111_100_101_0(Set<String> u, int b) => v(u, '1101111001010', b);
+
+@pragma('dart2js:noInline')
+f_110_111_100_111_0(Set<String> u, int b) => v(u, '1101111001110', b);
+
+@pragma('dart2js:noInline')
+f_110_111_101_001_0(Set<String> u, int b) => v(u, '1101111010010', b);
+
+@pragma('dart2js:noInline')
+f_110_111_101_011_0(Set<String> u, int b) => v(u, '1101111010110', b);
+
+@pragma('dart2js:noInline')
+f_110_111_101_101_0(Set<String> u, int b) => v(u, '1101111011010', b);
+
+@pragma('dart2js:noInline')
+f_110_111_101_111_0(Set<String> u, int b) => v(u, '1101111011110', b);
+
+@pragma('dart2js:noInline')
+f_110_111_110_001_0(Set<String> u, int b) => v(u, '1101111100010', b);
+
+@pragma('dart2js:noInline')
+f_110_111_110_011_0(Set<String> u, int b) => v(u, '1101111100110', b);
+
+@pragma('dart2js:noInline')
+f_110_111_110_101_0(Set<String> u, int b) => v(u, '1101111101010', b);
+
+@pragma('dart2js:noInline')
+f_110_111_110_111_0(Set<String> u, int b) => v(u, '1101111101110', b);
+
+@pragma('dart2js:noInline')
+f_110_111_111_001_0(Set<String> u, int b) => v(u, '1101111110010', b);
+
+@pragma('dart2js:noInline')
+f_110_111_111_011_0(Set<String> u, int b) => v(u, '1101111110110', b);
+
+@pragma('dart2js:noInline')
+f_110_111_111_101_0(Set<String> u, int b) => v(u, '1101111111010', b);
+
+@pragma('dart2js:noInline')
+f_110_111_111_111_0(Set<String> u, int b) => v(u, '1101111111110', b);
+
+@pragma('dart2js:noInline')
+f_111_000_000_001_0(Set<String> u, int b) => v(u, '1110000000010', b);
+
+@pragma('dart2js:noInline')
+f_111_000_000_011_0(Set<String> u, int b) => v(u, '1110000000110', b);
+
+@pragma('dart2js:noInline')
+f_111_000_000_101_0(Set<String> u, int b) => v(u, '1110000001010', b);
+
+@pragma('dart2js:noInline')
+f_111_000_000_111_0(Set<String> u, int b) => v(u, '1110000001110', b);
+
+@pragma('dart2js:noInline')
+f_111_000_001_001_0(Set<String> u, int b) => v(u, '1110000010010', b);
+
+@pragma('dart2js:noInline')
+f_111_000_001_011_0(Set<String> u, int b) => v(u, '1110000010110', b);
+
+@pragma('dart2js:noInline')
+f_111_000_001_101_0(Set<String> u, int b) => v(u, '1110000011010', b);
+
+@pragma('dart2js:noInline')
+f_111_000_001_111_0(Set<String> u, int b) => v(u, '1110000011110', b);
+
+@pragma('dart2js:noInline')
+f_111_000_010_001_0(Set<String> u, int b) => v(u, '1110000100010', b);
+
+@pragma('dart2js:noInline')
+f_111_000_010_011_0(Set<String> u, int b) => v(u, '1110000100110', b);
+
+@pragma('dart2js:noInline')
+f_111_000_010_101_0(Set<String> u, int b) => v(u, '1110000101010', b);
+
+@pragma('dart2js:noInline')
+f_111_000_010_111_0(Set<String> u, int b) => v(u, '1110000101110', b);
+
+@pragma('dart2js:noInline')
+f_111_000_011_001_0(Set<String> u, int b) => v(u, '1110000110010', b);
+
+@pragma('dart2js:noInline')
+f_111_000_011_011_0(Set<String> u, int b) => v(u, '1110000110110', b);
+
+@pragma('dart2js:noInline')
+f_111_000_011_101_0(Set<String> u, int b) => v(u, '1110000111010', b);
+
+@pragma('dart2js:noInline')
+f_111_000_011_111_0(Set<String> u, int b) => v(u, '1110000111110', b);
+
+@pragma('dart2js:noInline')
+f_111_000_100_001_0(Set<String> u, int b) => v(u, '1110001000010', b);
+
+@pragma('dart2js:noInline')
+f_111_000_100_011_0(Set<String> u, int b) => v(u, '1110001000110', b);
+
+@pragma('dart2js:noInline')
+f_111_000_100_101_0(Set<String> u, int b) => v(u, '1110001001010', b);
+
+@pragma('dart2js:noInline')
+f_111_000_100_111_0(Set<String> u, int b) => v(u, '1110001001110', b);
+
+@pragma('dart2js:noInline')
+f_111_000_101_001_0(Set<String> u, int b) => v(u, '1110001010010', b);
+
+@pragma('dart2js:noInline')
+f_111_000_101_011_0(Set<String> u, int b) => v(u, '1110001010110', b);
+
+@pragma('dart2js:noInline')
+f_111_000_101_101_0(Set<String> u, int b) => v(u, '1110001011010', b);
+
+@pragma('dart2js:noInline')
+f_111_000_101_111_0(Set<String> u, int b) => v(u, '1110001011110', b);
+
+@pragma('dart2js:noInline')
+f_111_000_110_001_0(Set<String> u, int b) => v(u, '1110001100010', b);
+
+@pragma('dart2js:noInline')
+f_111_000_110_011_0(Set<String> u, int b) => v(u, '1110001100110', b);
+
+@pragma('dart2js:noInline')
+f_111_000_110_101_0(Set<String> u, int b) => v(u, '1110001101010', b);
+
+@pragma('dart2js:noInline')
+f_111_000_110_111_0(Set<String> u, int b) => v(u, '1110001101110', b);
+
+@pragma('dart2js:noInline')
+f_111_000_111_001_0(Set<String> u, int b) => v(u, '1110001110010', b);
+
+@pragma('dart2js:noInline')
+f_111_000_111_011_0(Set<String> u, int b) => v(u, '1110001110110', b);
+
+@pragma('dart2js:noInline')
+f_111_000_111_101_0(Set<String> u, int b) => v(u, '1110001111010', b);
+
+@pragma('dart2js:noInline')
+f_111_000_111_111_0(Set<String> u, int b) => v(u, '1110001111110', b);
+
+@pragma('dart2js:noInline')
+f_111_001_000_001_0(Set<String> u, int b) => v(u, '1110010000010', b);
+
+@pragma('dart2js:noInline')
+f_111_001_000_011_0(Set<String> u, int b) => v(u, '1110010000110', b);
+
+@pragma('dart2js:noInline')
+f_111_001_000_101_0(Set<String> u, int b) => v(u, '1110010001010', b);
+
+@pragma('dart2js:noInline')
+f_111_001_000_111_0(Set<String> u, int b) => v(u, '1110010001110', b);
+
+@pragma('dart2js:noInline')
+f_111_001_001_001_0(Set<String> u, int b) => v(u, '1110010010010', b);
+
+@pragma('dart2js:noInline')
+f_111_001_001_011_0(Set<String> u, int b) => v(u, '1110010010110', b);
+
+@pragma('dart2js:noInline')
+f_111_001_001_101_0(Set<String> u, int b) => v(u, '1110010011010', b);
+
+@pragma('dart2js:noInline')
+f_111_001_001_111_0(Set<String> u, int b) => v(u, '1110010011110', b);
+
+@pragma('dart2js:noInline')
+f_111_001_010_001_0(Set<String> u, int b) => v(u, '1110010100010', b);
+
+@pragma('dart2js:noInline')
+f_111_001_010_011_0(Set<String> u, int b) => v(u, '1110010100110', b);
+
+@pragma('dart2js:noInline')
+f_111_001_010_101_0(Set<String> u, int b) => v(u, '1110010101010', b);
+
+@pragma('dart2js:noInline')
+f_111_001_010_111_0(Set<String> u, int b) => v(u, '1110010101110', b);
+
+@pragma('dart2js:noInline')
+f_111_001_011_001_0(Set<String> u, int b) => v(u, '1110010110010', b);
+
+@pragma('dart2js:noInline')
+f_111_001_011_011_0(Set<String> u, int b) => v(u, '1110010110110', b);
+
+@pragma('dart2js:noInline')
+f_111_001_011_101_0(Set<String> u, int b) => v(u, '1110010111010', b);
+
+@pragma('dart2js:noInline')
+f_111_001_011_111_0(Set<String> u, int b) => v(u, '1110010111110', b);
+
+@pragma('dart2js:noInline')
+f_111_001_100_001_0(Set<String> u, int b) => v(u, '1110011000010', b);
+
+@pragma('dart2js:noInline')
+f_111_001_100_011_0(Set<String> u, int b) => v(u, '1110011000110', b);
+
+@pragma('dart2js:noInline')
+f_111_001_100_101_0(Set<String> u, int b) => v(u, '1110011001010', b);
+
+@pragma('dart2js:noInline')
+f_111_001_100_111_0(Set<String> u, int b) => v(u, '1110011001110', b);
+
+@pragma('dart2js:noInline')
+f_111_001_101_001_0(Set<String> u, int b) => v(u, '1110011010010', b);
+
+@pragma('dart2js:noInline')
+f_111_001_101_011_0(Set<String> u, int b) => v(u, '1110011010110', b);
+
+@pragma('dart2js:noInline')
+f_111_001_101_101_0(Set<String> u, int b) => v(u, '1110011011010', b);
+
+@pragma('dart2js:noInline')
+f_111_001_101_111_0(Set<String> u, int b) => v(u, '1110011011110', b);
+
+@pragma('dart2js:noInline')
+f_111_001_110_001_0(Set<String> u, int b) => v(u, '1110011100010', b);
+
+@pragma('dart2js:noInline')
+f_111_001_110_011_0(Set<String> u, int b) => v(u, '1110011100110', b);
+
+@pragma('dart2js:noInline')
+f_111_001_110_101_0(Set<String> u, int b) => v(u, '1110011101010', b);
+
+@pragma('dart2js:noInline')
+f_111_001_110_111_0(Set<String> u, int b) => v(u, '1110011101110', b);
+
+@pragma('dart2js:noInline')
+f_111_001_111_001_0(Set<String> u, int b) => v(u, '1110011110010', b);
+
+@pragma('dart2js:noInline')
+f_111_001_111_011_0(Set<String> u, int b) => v(u, '1110011110110', b);
+
+@pragma('dart2js:noInline')
+f_111_001_111_101_0(Set<String> u, int b) => v(u, '1110011111010', b);
+
+@pragma('dart2js:noInline')
+f_111_001_111_111_0(Set<String> u, int b) => v(u, '1110011111110', b);
+
+@pragma('dart2js:noInline')
+f_111_010_000_001_0(Set<String> u, int b) => v(u, '1110100000010', b);
+
+@pragma('dart2js:noInline')
+f_111_010_000_011_0(Set<String> u, int b) => v(u, '1110100000110', b);
+
+@pragma('dart2js:noInline')
+f_111_010_000_101_0(Set<String> u, int b) => v(u, '1110100001010', b);
+
+@pragma('dart2js:noInline')
+f_111_010_000_111_0(Set<String> u, int b) => v(u, '1110100001110', b);
+
+@pragma('dart2js:noInline')
+f_111_010_001_001_0(Set<String> u, int b) => v(u, '1110100010010', b);
+
+@pragma('dart2js:noInline')
+f_111_010_001_011_0(Set<String> u, int b) => v(u, '1110100010110', b);
+
+@pragma('dart2js:noInline')
+f_111_010_001_101_0(Set<String> u, int b) => v(u, '1110100011010', b);
+
+@pragma('dart2js:noInline')
+f_111_010_001_111_0(Set<String> u, int b) => v(u, '1110100011110', b);
+
+@pragma('dart2js:noInline')
+f_111_010_010_001_0(Set<String> u, int b) => v(u, '1110100100010', b);
+
+@pragma('dart2js:noInline')
+f_111_010_010_011_0(Set<String> u, int b) => v(u, '1110100100110', b);
+
+@pragma('dart2js:noInline')
+f_111_010_010_101_0(Set<String> u, int b) => v(u, '1110100101010', b);
+
+@pragma('dart2js:noInline')
+f_111_010_010_111_0(Set<String> u, int b) => v(u, '1110100101110', b);
+
+@pragma('dart2js:noInline')
+f_111_010_011_001_0(Set<String> u, int b) => v(u, '1110100110010', b);
+
+@pragma('dart2js:noInline')
+f_111_010_011_011_0(Set<String> u, int b) => v(u, '1110100110110', b);
+
+@pragma('dart2js:noInline')
+f_111_010_011_101_0(Set<String> u, int b) => v(u, '1110100111010', b);
+
+@pragma('dart2js:noInline')
+f_111_010_011_111_0(Set<String> u, int b) => v(u, '1110100111110', b);
+
+@pragma('dart2js:noInline')
+f_111_010_100_001_0(Set<String> u, int b) => v(u, '1110101000010', b);
+
+@pragma('dart2js:noInline')
+f_111_010_100_011_0(Set<String> u, int b) => v(u, '1110101000110', b);
+
+@pragma('dart2js:noInline')
+f_111_010_100_101_0(Set<String> u, int b) => v(u, '1110101001010', b);
+
+@pragma('dart2js:noInline')
+f_111_010_100_111_0(Set<String> u, int b) => v(u, '1110101001110', b);
+
+@pragma('dart2js:noInline')
+f_111_010_101_001_0(Set<String> u, int b) => v(u, '1110101010010', b);
+
+@pragma('dart2js:noInline')
+f_111_010_101_011_0(Set<String> u, int b) => v(u, '1110101010110', b);
+
+@pragma('dart2js:noInline')
+f_111_010_101_101_0(Set<String> u, int b) => v(u, '1110101011010', b);
+
+@pragma('dart2js:noInline')
+f_111_010_101_111_0(Set<String> u, int b) => v(u, '1110101011110', b);
+
+@pragma('dart2js:noInline')
+f_111_010_110_001_0(Set<String> u, int b) => v(u, '1110101100010', b);
+
+@pragma('dart2js:noInline')
+f_111_010_110_011_0(Set<String> u, int b) => v(u, '1110101100110', b);
+
+@pragma('dart2js:noInline')
+f_111_010_110_101_0(Set<String> u, int b) => v(u, '1110101101010', b);
+
+@pragma('dart2js:noInline')
+f_111_010_110_111_0(Set<String> u, int b) => v(u, '1110101101110', b);
+
+@pragma('dart2js:noInline')
+f_111_010_111_001_0(Set<String> u, int b) => v(u, '1110101110010', b);
+
+@pragma('dart2js:noInline')
+f_111_010_111_011_0(Set<String> u, int b) => v(u, '1110101110110', b);
+
+@pragma('dart2js:noInline')
+f_111_010_111_101_0(Set<String> u, int b) => v(u, '1110101111010', b);
+
+@pragma('dart2js:noInline')
+f_111_010_111_111_0(Set<String> u, int b) => v(u, '1110101111110', b);
+
+@pragma('dart2js:noInline')
+f_111_011_000_001_0(Set<String> u, int b) => v(u, '1110110000010', b);
+
+@pragma('dart2js:noInline')
+f_111_011_000_011_0(Set<String> u, int b) => v(u, '1110110000110', b);
+
+@pragma('dart2js:noInline')
+f_111_011_000_101_0(Set<String> u, int b) => v(u, '1110110001010', b);
+
+@pragma('dart2js:noInline')
+f_111_011_000_111_0(Set<String> u, int b) => v(u, '1110110001110', b);
+
+@pragma('dart2js:noInline')
+f_111_011_001_001_0(Set<String> u, int b) => v(u, '1110110010010', b);
+
+@pragma('dart2js:noInline')
+f_111_011_001_011_0(Set<String> u, int b) => v(u, '1110110010110', b);
+
+@pragma('dart2js:noInline')
+f_111_011_001_101_0(Set<String> u, int b) => v(u, '1110110011010', b);
+
+@pragma('dart2js:noInline')
+f_111_011_001_111_0(Set<String> u, int b) => v(u, '1110110011110', b);
+
+@pragma('dart2js:noInline')
+f_111_011_010_001_0(Set<String> u, int b) => v(u, '1110110100010', b);
+
+@pragma('dart2js:noInline')
+f_111_011_010_011_0(Set<String> u, int b) => v(u, '1110110100110', b);
+
+@pragma('dart2js:noInline')
+f_111_011_010_101_0(Set<String> u, int b) => v(u, '1110110101010', b);
+
+@pragma('dart2js:noInline')
+f_111_011_010_111_0(Set<String> u, int b) => v(u, '1110110101110', b);
+
+@pragma('dart2js:noInline')
+f_111_011_011_001_0(Set<String> u, int b) => v(u, '1110110110010', b);
+
+@pragma('dart2js:noInline')
+f_111_011_011_011_0(Set<String> u, int b) => v(u, '1110110110110', b);
+
+@pragma('dart2js:noInline')
+f_111_011_011_101_0(Set<String> u, int b) => v(u, '1110110111010', b);
+
+@pragma('dart2js:noInline')
+f_111_011_011_111_0(Set<String> u, int b) => v(u, '1110110111110', b);
+
+@pragma('dart2js:noInline')
+f_111_011_100_001_0(Set<String> u, int b) => v(u, '1110111000010', b);
+
+@pragma('dart2js:noInline')
+f_111_011_100_011_0(Set<String> u, int b) => v(u, '1110111000110', b);
+
+@pragma('dart2js:noInline')
+f_111_011_100_101_0(Set<String> u, int b) => v(u, '1110111001010', b);
+
+@pragma('dart2js:noInline')
+f_111_011_100_111_0(Set<String> u, int b) => v(u, '1110111001110', b);
+
+@pragma('dart2js:noInline')
+f_111_011_101_001_0(Set<String> u, int b) => v(u, '1110111010010', b);
+
+@pragma('dart2js:noInline')
+f_111_011_101_011_0(Set<String> u, int b) => v(u, '1110111010110', b);
+
+@pragma('dart2js:noInline')
+f_111_011_101_101_0(Set<String> u, int b) => v(u, '1110111011010', b);
+
+@pragma('dart2js:noInline')
+f_111_011_101_111_0(Set<String> u, int b) => v(u, '1110111011110', b);
+
+@pragma('dart2js:noInline')
+f_111_011_110_001_0(Set<String> u, int b) => v(u, '1110111100010', b);
+
+@pragma('dart2js:noInline')
+f_111_011_110_011_0(Set<String> u, int b) => v(u, '1110111100110', b);
+
+@pragma('dart2js:noInline')
+f_111_011_110_101_0(Set<String> u, int b) => v(u, '1110111101010', b);
+
+@pragma('dart2js:noInline')
+f_111_011_110_111_0(Set<String> u, int b) => v(u, '1110111101110', b);
+
+@pragma('dart2js:noInline')
+f_111_011_111_001_0(Set<String> u, int b) => v(u, '1110111110010', b);
+
+@pragma('dart2js:noInline')
+f_111_011_111_011_0(Set<String> u, int b) => v(u, '1110111110110', b);
+
+@pragma('dart2js:noInline')
+f_111_011_111_101_0(Set<String> u, int b) => v(u, '1110111111010', b);
+
+@pragma('dart2js:noInline')
+f_111_011_111_111_0(Set<String> u, int b) => v(u, '1110111111110', b);
+
+@pragma('dart2js:noInline')
+f_111_100_000_001_0(Set<String> u, int b) => v(u, '1111000000010', b);
+
+@pragma('dart2js:noInline')
+f_111_100_000_011_0(Set<String> u, int b) => v(u, '1111000000110', b);
+
+@pragma('dart2js:noInline')
+f_111_100_000_101_0(Set<String> u, int b) => v(u, '1111000001010', b);
+
+@pragma('dart2js:noInline')
+f_111_100_000_111_0(Set<String> u, int b) => v(u, '1111000001110', b);
+
+@pragma('dart2js:noInline')
+f_111_100_001_001_0(Set<String> u, int b) => v(u, '1111000010010', b);
+
+@pragma('dart2js:noInline')
+f_111_100_001_011_0(Set<String> u, int b) => v(u, '1111000010110', b);
+
+@pragma('dart2js:noInline')
+f_111_100_001_101_0(Set<String> u, int b) => v(u, '1111000011010', b);
+
+@pragma('dart2js:noInline')
+f_111_100_001_111_0(Set<String> u, int b) => v(u, '1111000011110', b);
+
+@pragma('dart2js:noInline')
+f_111_100_010_001_0(Set<String> u, int b) => v(u, '1111000100010', b);
+
+@pragma('dart2js:noInline')
+f_111_100_010_011_0(Set<String> u, int b) => v(u, '1111000100110', b);
+
+@pragma('dart2js:noInline')
+f_111_100_010_101_0(Set<String> u, int b) => v(u, '1111000101010', b);
+
+@pragma('dart2js:noInline')
+f_111_100_010_111_0(Set<String> u, int b) => v(u, '1111000101110', b);
+
+@pragma('dart2js:noInline')
+f_111_100_011_001_0(Set<String> u, int b) => v(u, '1111000110010', b);
+
+@pragma('dart2js:noInline')
+f_111_100_011_011_0(Set<String> u, int b) => v(u, '1111000110110', b);
+
+@pragma('dart2js:noInline')
+f_111_100_011_101_0(Set<String> u, int b) => v(u, '1111000111010', b);
+
+@pragma('dart2js:noInline')
+f_111_100_011_111_0(Set<String> u, int b) => v(u, '1111000111110', b);
+
+@pragma('dart2js:noInline')
+f_111_100_100_001_0(Set<String> u, int b) => v(u, '1111001000010', b);
+
+@pragma('dart2js:noInline')
+f_111_100_100_011_0(Set<String> u, int b) => v(u, '1111001000110', b);
+
+@pragma('dart2js:noInline')
+f_111_100_100_101_0(Set<String> u, int b) => v(u, '1111001001010', b);
+
+@pragma('dart2js:noInline')
+f_111_100_100_111_0(Set<String> u, int b) => v(u, '1111001001110', b);
+
+@pragma('dart2js:noInline')
+f_111_100_101_001_0(Set<String> u, int b) => v(u, '1111001010010', b);
+
+@pragma('dart2js:noInline')
+f_111_100_101_011_0(Set<String> u, int b) => v(u, '1111001010110', b);
+
+@pragma('dart2js:noInline')
+f_111_100_101_101_0(Set<String> u, int b) => v(u, '1111001011010', b);
+
+@pragma('dart2js:noInline')
+f_111_100_101_111_0(Set<String> u, int b) => v(u, '1111001011110', b);
+
+@pragma('dart2js:noInline')
+f_111_100_110_001_0(Set<String> u, int b) => v(u, '1111001100010', b);
+
+@pragma('dart2js:noInline')
+f_111_100_110_011_0(Set<String> u, int b) => v(u, '1111001100110', b);
+
+@pragma('dart2js:noInline')
+f_111_100_110_101_0(Set<String> u, int b) => v(u, '1111001101010', b);
+
+@pragma('dart2js:noInline')
+f_111_100_110_111_0(Set<String> u, int b) => v(u, '1111001101110', b);
+
+@pragma('dart2js:noInline')
+f_111_100_111_001_0(Set<String> u, int b) => v(u, '1111001110010', b);
+
+@pragma('dart2js:noInline')
+f_111_100_111_011_0(Set<String> u, int b) => v(u, '1111001110110', b);
+
+@pragma('dart2js:noInline')
+f_111_100_111_101_0(Set<String> u, int b) => v(u, '1111001111010', b);
+
+@pragma('dart2js:noInline')
+f_111_100_111_111_0(Set<String> u, int b) => v(u, '1111001111110', b);
+
+@pragma('dart2js:noInline')
+f_111_101_000_001_0(Set<String> u, int b) => v(u, '1111010000010', b);
+
+@pragma('dart2js:noInline')
+f_111_101_000_011_0(Set<String> u, int b) => v(u, '1111010000110', b);
+
+@pragma('dart2js:noInline')
+f_111_101_000_101_0(Set<String> u, int b) => v(u, '1111010001010', b);
+
+@pragma('dart2js:noInline')
+f_111_101_000_111_0(Set<String> u, int b) => v(u, '1111010001110', b);
+
+@pragma('dart2js:noInline')
+f_111_101_001_001_0(Set<String> u, int b) => v(u, '1111010010010', b);
+
+@pragma('dart2js:noInline')
+f_111_101_001_011_0(Set<String> u, int b) => v(u, '1111010010110', b);
+
+@pragma('dart2js:noInline')
+f_111_101_001_101_0(Set<String> u, int b) => v(u, '1111010011010', b);
+
+@pragma('dart2js:noInline')
+f_111_101_001_111_0(Set<String> u, int b) => v(u, '1111010011110', b);
+
+@pragma('dart2js:noInline')
+f_111_101_010_001_0(Set<String> u, int b) => v(u, '1111010100010', b);
+
+@pragma('dart2js:noInline')
+f_111_101_010_011_0(Set<String> u, int b) => v(u, '1111010100110', b);
+
+@pragma('dart2js:noInline')
+f_111_101_010_101_0(Set<String> u, int b) => v(u, '1111010101010', b);
+
+@pragma('dart2js:noInline')
+f_111_101_010_111_0(Set<String> u, int b) => v(u, '1111010101110', b);
+
+@pragma('dart2js:noInline')
+f_111_101_011_001_0(Set<String> u, int b) => v(u, '1111010110010', b);
+
+@pragma('dart2js:noInline')
+f_111_101_011_011_0(Set<String> u, int b) => v(u, '1111010110110', b);
+
+@pragma('dart2js:noInline')
+f_111_101_011_101_0(Set<String> u, int b) => v(u, '1111010111010', b);
+
+@pragma('dart2js:noInline')
+f_111_101_011_111_0(Set<String> u, int b) => v(u, '1111010111110', b);
+
+@pragma('dart2js:noInline')
+f_111_101_100_001_0(Set<String> u, int b) => v(u, '1111011000010', b);
+
+@pragma('dart2js:noInline')
+f_111_101_100_011_0(Set<String> u, int b) => v(u, '1111011000110', b);
+
+@pragma('dart2js:noInline')
+f_111_101_100_101_0(Set<String> u, int b) => v(u, '1111011001010', b);
+
+@pragma('dart2js:noInline')
+f_111_101_100_111_0(Set<String> u, int b) => v(u, '1111011001110', b);
+
+@pragma('dart2js:noInline')
+f_111_101_101_001_0(Set<String> u, int b) => v(u, '1111011010010', b);
+
+@pragma('dart2js:noInline')
+f_111_101_101_011_0(Set<String> u, int b) => v(u, '1111011010110', b);
+
+@pragma('dart2js:noInline')
+f_111_101_101_101_0(Set<String> u, int b) => v(u, '1111011011010', b);
+
+@pragma('dart2js:noInline')
+f_111_101_101_111_0(Set<String> u, int b) => v(u, '1111011011110', b);
+
+@pragma('dart2js:noInline')
+f_111_101_110_001_0(Set<String> u, int b) => v(u, '1111011100010', b);
+
+@pragma('dart2js:noInline')
+f_111_101_110_011_0(Set<String> u, int b) => v(u, '1111011100110', b);
+
+@pragma('dart2js:noInline')
+f_111_101_110_101_0(Set<String> u, int b) => v(u, '1111011101010', b);
+
+@pragma('dart2js:noInline')
+f_111_101_110_111_0(Set<String> u, int b) => v(u, '1111011101110', b);
+
+@pragma('dart2js:noInline')
+f_111_101_111_001_0(Set<String> u, int b) => v(u, '1111011110010', b);
+
+@pragma('dart2js:noInline')
+f_111_101_111_011_0(Set<String> u, int b) => v(u, '1111011110110', b);
+
+@pragma('dart2js:noInline')
+f_111_101_111_101_0(Set<String> u, int b) => v(u, '1111011111010', b);
+
+@pragma('dart2js:noInline')
+f_111_101_111_111_0(Set<String> u, int b) => v(u, '1111011111110', b);
+
+@pragma('dart2js:noInline')
+f_111_110_000_001_0(Set<String> u, int b) => v(u, '1111100000010', b);
+
+@pragma('dart2js:noInline')
+f_111_110_000_011_0(Set<String> u, int b) => v(u, '1111100000110', b);
+
+@pragma('dart2js:noInline')
+f_111_110_000_101_0(Set<String> u, int b) => v(u, '1111100001010', b);
+
+@pragma('dart2js:noInline')
+f_111_110_000_111_0(Set<String> u, int b) => v(u, '1111100001110', b);
+
+@pragma('dart2js:noInline')
+f_111_110_001_001_0(Set<String> u, int b) => v(u, '1111100010010', b);
+
+@pragma('dart2js:noInline')
+f_111_110_001_011_0(Set<String> u, int b) => v(u, '1111100010110', b);
+
+@pragma('dart2js:noInline')
+f_111_110_001_101_0(Set<String> u, int b) => v(u, '1111100011010', b);
+
+@pragma('dart2js:noInline')
+f_111_110_001_111_0(Set<String> u, int b) => v(u, '1111100011110', b);
+
+@pragma('dart2js:noInline')
+f_111_110_010_001_0(Set<String> u, int b) => v(u, '1111100100010', b);
+
+@pragma('dart2js:noInline')
+f_111_110_010_011_0(Set<String> u, int b) => v(u, '1111100100110', b);
+
+@pragma('dart2js:noInline')
+f_111_110_010_101_0(Set<String> u, int b) => v(u, '1111100101010', b);
+
+@pragma('dart2js:noInline')
+f_111_110_010_111_0(Set<String> u, int b) => v(u, '1111100101110', b);
+
+@pragma('dart2js:noInline')
+f_111_110_011_001_0(Set<String> u, int b) => v(u, '1111100110010', b);
+
+@pragma('dart2js:noInline')
+f_111_110_011_011_0(Set<String> u, int b) => v(u, '1111100110110', b);
+
+@pragma('dart2js:noInline')
+f_111_110_011_101_0(Set<String> u, int b) => v(u, '1111100111010', b);
+
+@pragma('dart2js:noInline')
+f_111_110_011_111_0(Set<String> u, int b) => v(u, '1111100111110', b);
+
+@pragma('dart2js:noInline')
+f_111_110_100_001_0(Set<String> u, int b) => v(u, '1111101000010', b);
+
+@pragma('dart2js:noInline')
+f_111_110_100_011_0(Set<String> u, int b) => v(u, '1111101000110', b);
+
+@pragma('dart2js:noInline')
+f_111_110_100_101_0(Set<String> u, int b) => v(u, '1111101001010', b);
+
+@pragma('dart2js:noInline')
+f_111_110_100_111_0(Set<String> u, int b) => v(u, '1111101001110', b);
+
+@pragma('dart2js:noInline')
+f_111_110_101_001_0(Set<String> u, int b) => v(u, '1111101010010', b);
+
+@pragma('dart2js:noInline')
+f_111_110_101_011_0(Set<String> u, int b) => v(u, '1111101010110', b);
+
+@pragma('dart2js:noInline')
+f_111_110_101_101_0(Set<String> u, int b) => v(u, '1111101011010', b);
+
+@pragma('dart2js:noInline')
+f_111_110_101_111_0(Set<String> u, int b) => v(u, '1111101011110', b);
+
+@pragma('dart2js:noInline')
+f_111_110_110_001_0(Set<String> u, int b) => v(u, '1111101100010', b);
+
+@pragma('dart2js:noInline')
+f_111_110_110_011_0(Set<String> u, int b) => v(u, '1111101100110', b);
+
+@pragma('dart2js:noInline')
+f_111_110_110_101_0(Set<String> u, int b) => v(u, '1111101101010', b);
+
+@pragma('dart2js:noInline')
+f_111_110_110_111_0(Set<String> u, int b) => v(u, '1111101101110', b);
+
+@pragma('dart2js:noInline')
+f_111_110_111_001_0(Set<String> u, int b) => v(u, '1111101110010', b);
+
+@pragma('dart2js:noInline')
+f_111_110_111_011_0(Set<String> u, int b) => v(u, '1111101110110', b);
+
+@pragma('dart2js:noInline')
+f_111_110_111_101_0(Set<String> u, int b) => v(u, '1111101111010', b);
+
+@pragma('dart2js:noInline')
+f_111_110_111_111_0(Set<String> u, int b) => v(u, '1111101111110', b);
+
+@pragma('dart2js:noInline')
+f_111_111_000_001_0(Set<String> u, int b) => v(u, '1111110000010', b);
+
+@pragma('dart2js:noInline')
+f_111_111_000_011_0(Set<String> u, int b) => v(u, '1111110000110', b);
+
+@pragma('dart2js:noInline')
+f_111_111_000_101_0(Set<String> u, int b) => v(u, '1111110001010', b);
+
+@pragma('dart2js:noInline')
+f_111_111_000_111_0(Set<String> u, int b) => v(u, '1111110001110', b);
+
+@pragma('dart2js:noInline')
+f_111_111_001_001_0(Set<String> u, int b) => v(u, '1111110010010', b);
+
+@pragma('dart2js:noInline')
+f_111_111_001_011_0(Set<String> u, int b) => v(u, '1111110010110', b);
+
+@pragma('dart2js:noInline')
+f_111_111_001_101_0(Set<String> u, int b) => v(u, '1111110011010', b);
+
+@pragma('dart2js:noInline')
+f_111_111_001_111_0(Set<String> u, int b) => v(u, '1111110011110', b);
+
+@pragma('dart2js:noInline')
+f_111_111_010_001_0(Set<String> u, int b) => v(u, '1111110100010', b);
+
+@pragma('dart2js:noInline')
+f_111_111_010_011_0(Set<String> u, int b) => v(u, '1111110100110', b);
+
+@pragma('dart2js:noInline')
+f_111_111_010_101_0(Set<String> u, int b) => v(u, '1111110101010', b);
+
+@pragma('dart2js:noInline')
+f_111_111_010_111_0(Set<String> u, int b) => v(u, '1111110101110', b);
+
+@pragma('dart2js:noInline')
+f_111_111_011_001_0(Set<String> u, int b) => v(u, '1111110110010', b);
+
+@pragma('dart2js:noInline')
+f_111_111_011_011_0(Set<String> u, int b) => v(u, '1111110110110', b);
+
+@pragma('dart2js:noInline')
+f_111_111_011_101_0(Set<String> u, int b) => v(u, '1111110111010', b);
+
+@pragma('dart2js:noInline')
+f_111_111_011_111_0(Set<String> u, int b) => v(u, '1111110111110', b);
+
+@pragma('dart2js:noInline')
+f_111_111_100_001_0(Set<String> u, int b) => v(u, '1111111000010', b);
+
+@pragma('dart2js:noInline')
+f_111_111_100_011_0(Set<String> u, int b) => v(u, '1111111000110', b);
+
+@pragma('dart2js:noInline')
+f_111_111_100_101_0(Set<String> u, int b) => v(u, '1111111001010', b);
+
+@pragma('dart2js:noInline')
+f_111_111_100_111_0(Set<String> u, int b) => v(u, '1111111001110', b);
+
+@pragma('dart2js:noInline')
+f_111_111_101_001_0(Set<String> u, int b) => v(u, '1111111010010', b);
+
+@pragma('dart2js:noInline')
+f_111_111_101_011_0(Set<String> u, int b) => v(u, '1111111010110', b);
+
+@pragma('dart2js:noInline')
+f_111_111_101_101_0(Set<String> u, int b) => v(u, '1111111011010', b);
+
+@pragma('dart2js:noInline')
+f_111_111_101_111_0(Set<String> u, int b) => v(u, '1111111011110', b);
+
+@pragma('dart2js:noInline')
+f_111_111_110_001_0(Set<String> u, int b) => v(u, '1111111100010', b);
+
+@pragma('dart2js:noInline')
+f_111_111_110_011_0(Set<String> u, int b) => v(u, '1111111100110', b);
+
+@pragma('dart2js:noInline')
+f_111_111_110_101_0(Set<String> u, int b) => v(u, '1111111101010', b);
+
+@pragma('dart2js:noInline')
+f_111_111_110_111_0(Set<String> u, int b) => v(u, '1111111101110', b);
+
+@pragma('dart2js:noInline')
+f_111_111_111_001_0(Set<String> u, int b) => v(u, '1111111110010', b);
+
+@pragma('dart2js:noInline')
+f_111_111_111_011_0(Set<String> u, int b) => v(u, '1111111110110', b);
+
+@pragma('dart2js:noInline')
+f_111_111_111_101_0(Set<String> u, int b) => v(u, '1111111111010', b);
+
+@pragma('dart2js:noInline')
+f_111_111_111_111_0(Set<String> u, int b) => v(u, '1111111111110', b);
+
+@pragma('dart2js:noInline')
+f_000_000_000_010_0(Set<String> u, int b) => v(u, '0000000000100', b);
+
+@pragma('dart2js:noInline')
+f_000_000_000_110_0(Set<String> u, int b) => v(u, '0000000001100', b);
+
+@pragma('dart2js:noInline')
+f_000_000_001_010_0(Set<String> u, int b) => v(u, '0000000010100', b);
+
+@pragma('dart2js:noInline')
+f_000_000_001_110_0(Set<String> u, int b) => v(u, '0000000011100', b);
+
+@pragma('dart2js:noInline')
+f_000_000_010_010_0(Set<String> u, int b) => v(u, '0000000100100', b);
+
+@pragma('dart2js:noInline')
+f_000_000_010_110_0(Set<String> u, int b) => v(u, '0000000101100', b);
+
+@pragma('dart2js:noInline')
+f_000_000_011_010_0(Set<String> u, int b) => v(u, '0000000110100', b);
+
+@pragma('dart2js:noInline')
+f_000_000_011_110_0(Set<String> u, int b) => v(u, '0000000111100', b);
+
+@pragma('dart2js:noInline')
+f_000_000_100_010_0(Set<String> u, int b) => v(u, '0000001000100', b);
+
+@pragma('dart2js:noInline')
+f_000_000_100_110_0(Set<String> u, int b) => v(u, '0000001001100', b);
+
+@pragma('dart2js:noInline')
+f_000_000_101_010_0(Set<String> u, int b) => v(u, '0000001010100', b);
+
+@pragma('dart2js:noInline')
+f_000_000_101_110_0(Set<String> u, int b) => v(u, '0000001011100', b);
+
+@pragma('dart2js:noInline')
+f_000_000_110_010_0(Set<String> u, int b) => v(u, '0000001100100', b);
+
+@pragma('dart2js:noInline')
+f_000_000_110_110_0(Set<String> u, int b) => v(u, '0000001101100', b);
+
+@pragma('dart2js:noInline')
+f_000_000_111_010_0(Set<String> u, int b) => v(u, '0000001110100', b);
+
+@pragma('dart2js:noInline')
+f_000_000_111_110_0(Set<String> u, int b) => v(u, '0000001111100', b);
+
+@pragma('dart2js:noInline')
+f_000_001_000_010_0(Set<String> u, int b) => v(u, '0000010000100', b);
+
+@pragma('dart2js:noInline')
+f_000_001_000_110_0(Set<String> u, int b) => v(u, '0000010001100', b);
+
+@pragma('dart2js:noInline')
+f_000_001_001_010_0(Set<String> u, int b) => v(u, '0000010010100', b);
+
+@pragma('dart2js:noInline')
+f_000_001_001_110_0(Set<String> u, int b) => v(u, '0000010011100', b);
+
+@pragma('dart2js:noInline')
+f_000_001_010_010_0(Set<String> u, int b) => v(u, '0000010100100', b);
+
+@pragma('dart2js:noInline')
+f_000_001_010_110_0(Set<String> u, int b) => v(u, '0000010101100', b);
+
+@pragma('dart2js:noInline')
+f_000_001_011_010_0(Set<String> u, int b) => v(u, '0000010110100', b);
+
+@pragma('dart2js:noInline')
+f_000_001_011_110_0(Set<String> u, int b) => v(u, '0000010111100', b);
+
+@pragma('dart2js:noInline')
+f_000_001_100_010_0(Set<String> u, int b) => v(u, '0000011000100', b);
+
+@pragma('dart2js:noInline')
+f_000_001_100_110_0(Set<String> u, int b) => v(u, '0000011001100', b);
+
+@pragma('dart2js:noInline')
+f_000_001_101_010_0(Set<String> u, int b) => v(u, '0000011010100', b);
+
+@pragma('dart2js:noInline')
+f_000_001_101_110_0(Set<String> u, int b) => v(u, '0000011011100', b);
+
+@pragma('dart2js:noInline')
+f_000_001_110_010_0(Set<String> u, int b) => v(u, '0000011100100', b);
+
+@pragma('dart2js:noInline')
+f_000_001_110_110_0(Set<String> u, int b) => v(u, '0000011101100', b);
+
+@pragma('dart2js:noInline')
+f_000_001_111_010_0(Set<String> u, int b) => v(u, '0000011110100', b);
+
+@pragma('dart2js:noInline')
+f_000_001_111_110_0(Set<String> u, int b) => v(u, '0000011111100', b);
+
+@pragma('dart2js:noInline')
+f_000_010_000_010_0(Set<String> u, int b) => v(u, '0000100000100', b);
+
+@pragma('dart2js:noInline')
+f_000_010_000_110_0(Set<String> u, int b) => v(u, '0000100001100', b);
+
+@pragma('dart2js:noInline')
+f_000_010_001_010_0(Set<String> u, int b) => v(u, '0000100010100', b);
+
+@pragma('dart2js:noInline')
+f_000_010_001_110_0(Set<String> u, int b) => v(u, '0000100011100', b);
+
+@pragma('dart2js:noInline')
+f_000_010_010_010_0(Set<String> u, int b) => v(u, '0000100100100', b);
+
+@pragma('dart2js:noInline')
+f_000_010_010_110_0(Set<String> u, int b) => v(u, '0000100101100', b);
+
+@pragma('dart2js:noInline')
+f_000_010_011_010_0(Set<String> u, int b) => v(u, '0000100110100', b);
+
+@pragma('dart2js:noInline')
+f_000_010_011_110_0(Set<String> u, int b) => v(u, '0000100111100', b);
+
+@pragma('dart2js:noInline')
+f_000_010_100_010_0(Set<String> u, int b) => v(u, '0000101000100', b);
+
+@pragma('dart2js:noInline')
+f_000_010_100_110_0(Set<String> u, int b) => v(u, '0000101001100', b);
+
+@pragma('dart2js:noInline')
+f_000_010_101_010_0(Set<String> u, int b) => v(u, '0000101010100', b);
+
+@pragma('dart2js:noInline')
+f_000_010_101_110_0(Set<String> u, int b) => v(u, '0000101011100', b);
+
+@pragma('dart2js:noInline')
+f_000_010_110_010_0(Set<String> u, int b) => v(u, '0000101100100', b);
+
+@pragma('dart2js:noInline')
+f_000_010_110_110_0(Set<String> u, int b) => v(u, '0000101101100', b);
+
+@pragma('dart2js:noInline')
+f_000_010_111_010_0(Set<String> u, int b) => v(u, '0000101110100', b);
+
+@pragma('dart2js:noInline')
+f_000_010_111_110_0(Set<String> u, int b) => v(u, '0000101111100', b);
+
+@pragma('dart2js:noInline')
+f_000_011_000_010_0(Set<String> u, int b) => v(u, '0000110000100', b);
+
+@pragma('dart2js:noInline')
+f_000_011_000_110_0(Set<String> u, int b) => v(u, '0000110001100', b);
+
+@pragma('dart2js:noInline')
+f_000_011_001_010_0(Set<String> u, int b) => v(u, '0000110010100', b);
+
+@pragma('dart2js:noInline')
+f_000_011_001_110_0(Set<String> u, int b) => v(u, '0000110011100', b);
+
+@pragma('dart2js:noInline')
+f_000_011_010_010_0(Set<String> u, int b) => v(u, '0000110100100', b);
+
+@pragma('dart2js:noInline')
+f_000_011_010_110_0(Set<String> u, int b) => v(u, '0000110101100', b);
+
+@pragma('dart2js:noInline')
+f_000_011_011_010_0(Set<String> u, int b) => v(u, '0000110110100', b);
+
+@pragma('dart2js:noInline')
+f_000_011_011_110_0(Set<String> u, int b) => v(u, '0000110111100', b);
+
+@pragma('dart2js:noInline')
+f_000_011_100_010_0(Set<String> u, int b) => v(u, '0000111000100', b);
+
+@pragma('dart2js:noInline')
+f_000_011_100_110_0(Set<String> u, int b) => v(u, '0000111001100', b);
+
+@pragma('dart2js:noInline')
+f_000_011_101_010_0(Set<String> u, int b) => v(u, '0000111010100', b);
+
+@pragma('dart2js:noInline')
+f_000_011_101_110_0(Set<String> u, int b) => v(u, '0000111011100', b);
+
+@pragma('dart2js:noInline')
+f_000_011_110_010_0(Set<String> u, int b) => v(u, '0000111100100', b);
+
+@pragma('dart2js:noInline')
+f_000_011_110_110_0(Set<String> u, int b) => v(u, '0000111101100', b);
+
+@pragma('dart2js:noInline')
+f_000_011_111_010_0(Set<String> u, int b) => v(u, '0000111110100', b);
+
+@pragma('dart2js:noInline')
+f_000_011_111_110_0(Set<String> u, int b) => v(u, '0000111111100', b);
+
+@pragma('dart2js:noInline')
+f_000_100_000_010_0(Set<String> u, int b) => v(u, '0001000000100', b);
+
+@pragma('dart2js:noInline')
+f_000_100_000_110_0(Set<String> u, int b) => v(u, '0001000001100', b);
+
+@pragma('dart2js:noInline')
+f_000_100_001_010_0(Set<String> u, int b) => v(u, '0001000010100', b);
+
+@pragma('dart2js:noInline')
+f_000_100_001_110_0(Set<String> u, int b) => v(u, '0001000011100', b);
+
+@pragma('dart2js:noInline')
+f_000_100_010_010_0(Set<String> u, int b) => v(u, '0001000100100', b);
+
+@pragma('dart2js:noInline')
+f_000_100_010_110_0(Set<String> u, int b) => v(u, '0001000101100', b);
+
+@pragma('dart2js:noInline')
+f_000_100_011_010_0(Set<String> u, int b) => v(u, '0001000110100', b);
+
+@pragma('dart2js:noInline')
+f_000_100_011_110_0(Set<String> u, int b) => v(u, '0001000111100', b);
+
+@pragma('dart2js:noInline')
+f_000_100_100_010_0(Set<String> u, int b) => v(u, '0001001000100', b);
+
+@pragma('dart2js:noInline')
+f_000_100_100_110_0(Set<String> u, int b) => v(u, '0001001001100', b);
+
+@pragma('dart2js:noInline')
+f_000_100_101_010_0(Set<String> u, int b) => v(u, '0001001010100', b);
+
+@pragma('dart2js:noInline')
+f_000_100_101_110_0(Set<String> u, int b) => v(u, '0001001011100', b);
+
+@pragma('dart2js:noInline')
+f_000_100_110_010_0(Set<String> u, int b) => v(u, '0001001100100', b);
+
+@pragma('dart2js:noInline')
+f_000_100_110_110_0(Set<String> u, int b) => v(u, '0001001101100', b);
+
+@pragma('dart2js:noInline')
+f_000_100_111_010_0(Set<String> u, int b) => v(u, '0001001110100', b);
+
+@pragma('dart2js:noInline')
+f_000_100_111_110_0(Set<String> u, int b) => v(u, '0001001111100', b);
+
+@pragma('dart2js:noInline')
+f_000_101_000_010_0(Set<String> u, int b) => v(u, '0001010000100', b);
+
+@pragma('dart2js:noInline')
+f_000_101_000_110_0(Set<String> u, int b) => v(u, '0001010001100', b);
+
+@pragma('dart2js:noInline')
+f_000_101_001_010_0(Set<String> u, int b) => v(u, '0001010010100', b);
+
+@pragma('dart2js:noInline')
+f_000_101_001_110_0(Set<String> u, int b) => v(u, '0001010011100', b);
+
+@pragma('dart2js:noInline')
+f_000_101_010_010_0(Set<String> u, int b) => v(u, '0001010100100', b);
+
+@pragma('dart2js:noInline')
+f_000_101_010_110_0(Set<String> u, int b) => v(u, '0001010101100', b);
+
+@pragma('dart2js:noInline')
+f_000_101_011_010_0(Set<String> u, int b) => v(u, '0001010110100', b);
+
+@pragma('dart2js:noInline')
+f_000_101_011_110_0(Set<String> u, int b) => v(u, '0001010111100', b);
+
+@pragma('dart2js:noInline')
+f_000_101_100_010_0(Set<String> u, int b) => v(u, '0001011000100', b);
+
+@pragma('dart2js:noInline')
+f_000_101_100_110_0(Set<String> u, int b) => v(u, '0001011001100', b);
+
+@pragma('dart2js:noInline')
+f_000_101_101_010_0(Set<String> u, int b) => v(u, '0001011010100', b);
+
+@pragma('dart2js:noInline')
+f_000_101_101_110_0(Set<String> u, int b) => v(u, '0001011011100', b);
+
+@pragma('dart2js:noInline')
+f_000_101_110_010_0(Set<String> u, int b) => v(u, '0001011100100', b);
+
+@pragma('dart2js:noInline')
+f_000_101_110_110_0(Set<String> u, int b) => v(u, '0001011101100', b);
+
+@pragma('dart2js:noInline')
+f_000_101_111_010_0(Set<String> u, int b) => v(u, '0001011110100', b);
+
+@pragma('dart2js:noInline')
+f_000_101_111_110_0(Set<String> u, int b) => v(u, '0001011111100', b);
+
+@pragma('dart2js:noInline')
+f_000_110_000_010_0(Set<String> u, int b) => v(u, '0001100000100', b);
+
+@pragma('dart2js:noInline')
+f_000_110_000_110_0(Set<String> u, int b) => v(u, '0001100001100', b);
+
+@pragma('dart2js:noInline')
+f_000_110_001_010_0(Set<String> u, int b) => v(u, '0001100010100', b);
+
+@pragma('dart2js:noInline')
+f_000_110_001_110_0(Set<String> u, int b) => v(u, '0001100011100', b);
+
+@pragma('dart2js:noInline')
+f_000_110_010_010_0(Set<String> u, int b) => v(u, '0001100100100', b);
+
+@pragma('dart2js:noInline')
+f_000_110_010_110_0(Set<String> u, int b) => v(u, '0001100101100', b);
+
+@pragma('dart2js:noInline')
+f_000_110_011_010_0(Set<String> u, int b) => v(u, '0001100110100', b);
+
+@pragma('dart2js:noInline')
+f_000_110_011_110_0(Set<String> u, int b) => v(u, '0001100111100', b);
+
+@pragma('dart2js:noInline')
+f_000_110_100_010_0(Set<String> u, int b) => v(u, '0001101000100', b);
+
+@pragma('dart2js:noInline')
+f_000_110_100_110_0(Set<String> u, int b) => v(u, '0001101001100', b);
+
+@pragma('dart2js:noInline')
+f_000_110_101_010_0(Set<String> u, int b) => v(u, '0001101010100', b);
+
+@pragma('dart2js:noInline')
+f_000_110_101_110_0(Set<String> u, int b) => v(u, '0001101011100', b);
+
+@pragma('dart2js:noInline')
+f_000_110_110_010_0(Set<String> u, int b) => v(u, '0001101100100', b);
+
+@pragma('dart2js:noInline')
+f_000_110_110_110_0(Set<String> u, int b) => v(u, '0001101101100', b);
+
+@pragma('dart2js:noInline')
+f_000_110_111_010_0(Set<String> u, int b) => v(u, '0001101110100', b);
+
+@pragma('dart2js:noInline')
+f_000_110_111_110_0(Set<String> u, int b) => v(u, '0001101111100', b);
+
+@pragma('dart2js:noInline')
+f_000_111_000_010_0(Set<String> u, int b) => v(u, '0001110000100', b);
+
+@pragma('dart2js:noInline')
+f_000_111_000_110_0(Set<String> u, int b) => v(u, '0001110001100', b);
+
+@pragma('dart2js:noInline')
+f_000_111_001_010_0(Set<String> u, int b) => v(u, '0001110010100', b);
+
+@pragma('dart2js:noInline')
+f_000_111_001_110_0(Set<String> u, int b) => v(u, '0001110011100', b);
+
+@pragma('dart2js:noInline')
+f_000_111_010_010_0(Set<String> u, int b) => v(u, '0001110100100', b);
+
+@pragma('dart2js:noInline')
+f_000_111_010_110_0(Set<String> u, int b) => v(u, '0001110101100', b);
+
+@pragma('dart2js:noInline')
+f_000_111_011_010_0(Set<String> u, int b) => v(u, '0001110110100', b);
+
+@pragma('dart2js:noInline')
+f_000_111_011_110_0(Set<String> u, int b) => v(u, '0001110111100', b);
+
+@pragma('dart2js:noInline')
+f_000_111_100_010_0(Set<String> u, int b) => v(u, '0001111000100', b);
+
+@pragma('dart2js:noInline')
+f_000_111_100_110_0(Set<String> u, int b) => v(u, '0001111001100', b);
+
+@pragma('dart2js:noInline')
+f_000_111_101_010_0(Set<String> u, int b) => v(u, '0001111010100', b);
+
+@pragma('dart2js:noInline')
+f_000_111_101_110_0(Set<String> u, int b) => v(u, '0001111011100', b);
+
+@pragma('dart2js:noInline')
+f_000_111_110_010_0(Set<String> u, int b) => v(u, '0001111100100', b);
+
+@pragma('dart2js:noInline')
+f_000_111_110_110_0(Set<String> u, int b) => v(u, '0001111101100', b);
+
+@pragma('dart2js:noInline')
+f_000_111_111_010_0(Set<String> u, int b) => v(u, '0001111110100', b);
+
+@pragma('dart2js:noInline')
+f_000_111_111_110_0(Set<String> u, int b) => v(u, '0001111111100', b);
+
+@pragma('dart2js:noInline')
+f_001_000_000_010_0(Set<String> u, int b) => v(u, '0010000000100', b);
+
+@pragma('dart2js:noInline')
+f_001_000_000_110_0(Set<String> u, int b) => v(u, '0010000001100', b);
+
+@pragma('dart2js:noInline')
+f_001_000_001_010_0(Set<String> u, int b) => v(u, '0010000010100', b);
+
+@pragma('dart2js:noInline')
+f_001_000_001_110_0(Set<String> u, int b) => v(u, '0010000011100', b);
+
+@pragma('dart2js:noInline')
+f_001_000_010_010_0(Set<String> u, int b) => v(u, '0010000100100', b);
+
+@pragma('dart2js:noInline')
+f_001_000_010_110_0(Set<String> u, int b) => v(u, '0010000101100', b);
+
+@pragma('dart2js:noInline')
+f_001_000_011_010_0(Set<String> u, int b) => v(u, '0010000110100', b);
+
+@pragma('dart2js:noInline')
+f_001_000_011_110_0(Set<String> u, int b) => v(u, '0010000111100', b);
+
+@pragma('dart2js:noInline')
+f_001_000_100_010_0(Set<String> u, int b) => v(u, '0010001000100', b);
+
+@pragma('dart2js:noInline')
+f_001_000_100_110_0(Set<String> u, int b) => v(u, '0010001001100', b);
+
+@pragma('dart2js:noInline')
+f_001_000_101_010_0(Set<String> u, int b) => v(u, '0010001010100', b);
+
+@pragma('dart2js:noInline')
+f_001_000_101_110_0(Set<String> u, int b) => v(u, '0010001011100', b);
+
+@pragma('dart2js:noInline')
+f_001_000_110_010_0(Set<String> u, int b) => v(u, '0010001100100', b);
+
+@pragma('dart2js:noInline')
+f_001_000_110_110_0(Set<String> u, int b) => v(u, '0010001101100', b);
+
+@pragma('dart2js:noInline')
+f_001_000_111_010_0(Set<String> u, int b) => v(u, '0010001110100', b);
+
+@pragma('dart2js:noInline')
+f_001_000_111_110_0(Set<String> u, int b) => v(u, '0010001111100', b);
+
+@pragma('dart2js:noInline')
+f_001_001_000_010_0(Set<String> u, int b) => v(u, '0010010000100', b);
+
+@pragma('dart2js:noInline')
+f_001_001_000_110_0(Set<String> u, int b) => v(u, '0010010001100', b);
+
+@pragma('dart2js:noInline')
+f_001_001_001_010_0(Set<String> u, int b) => v(u, '0010010010100', b);
+
+@pragma('dart2js:noInline')
+f_001_001_001_110_0(Set<String> u, int b) => v(u, '0010010011100', b);
+
+@pragma('dart2js:noInline')
+f_001_001_010_010_0(Set<String> u, int b) => v(u, '0010010100100', b);
+
+@pragma('dart2js:noInline')
+f_001_001_010_110_0(Set<String> u, int b) => v(u, '0010010101100', b);
+
+@pragma('dart2js:noInline')
+f_001_001_011_010_0(Set<String> u, int b) => v(u, '0010010110100', b);
+
+@pragma('dart2js:noInline')
+f_001_001_011_110_0(Set<String> u, int b) => v(u, '0010010111100', b);
+
+@pragma('dart2js:noInline')
+f_001_001_100_010_0(Set<String> u, int b) => v(u, '0010011000100', b);
+
+@pragma('dart2js:noInline')
+f_001_001_100_110_0(Set<String> u, int b) => v(u, '0010011001100', b);
+
+@pragma('dart2js:noInline')
+f_001_001_101_010_0(Set<String> u, int b) => v(u, '0010011010100', b);
+
+@pragma('dart2js:noInline')
+f_001_001_101_110_0(Set<String> u, int b) => v(u, '0010011011100', b);
+
+@pragma('dart2js:noInline')
+f_001_001_110_010_0(Set<String> u, int b) => v(u, '0010011100100', b);
+
+@pragma('dart2js:noInline')
+f_001_001_110_110_0(Set<String> u, int b) => v(u, '0010011101100', b);
+
+@pragma('dart2js:noInline')
+f_001_001_111_010_0(Set<String> u, int b) => v(u, '0010011110100', b);
+
+@pragma('dart2js:noInline')
+f_001_001_111_110_0(Set<String> u, int b) => v(u, '0010011111100', b);
+
+@pragma('dart2js:noInline')
+f_001_010_000_010_0(Set<String> u, int b) => v(u, '0010100000100', b);
+
+@pragma('dart2js:noInline')
+f_001_010_000_110_0(Set<String> u, int b) => v(u, '0010100001100', b);
+
+@pragma('dart2js:noInline')
+f_001_010_001_010_0(Set<String> u, int b) => v(u, '0010100010100', b);
+
+@pragma('dart2js:noInline')
+f_001_010_001_110_0(Set<String> u, int b) => v(u, '0010100011100', b);
+
+@pragma('dart2js:noInline')
+f_001_010_010_010_0(Set<String> u, int b) => v(u, '0010100100100', b);
+
+@pragma('dart2js:noInline')
+f_001_010_010_110_0(Set<String> u, int b) => v(u, '0010100101100', b);
+
+@pragma('dart2js:noInline')
+f_001_010_011_010_0(Set<String> u, int b) => v(u, '0010100110100', b);
+
+@pragma('dart2js:noInline')
+f_001_010_011_110_0(Set<String> u, int b) => v(u, '0010100111100', b);
+
+@pragma('dart2js:noInline')
+f_001_010_100_010_0(Set<String> u, int b) => v(u, '0010101000100', b);
+
+@pragma('dart2js:noInline')
+f_001_010_100_110_0(Set<String> u, int b) => v(u, '0010101001100', b);
+
+@pragma('dart2js:noInline')
+f_001_010_101_010_0(Set<String> u, int b) => v(u, '0010101010100', b);
+
+@pragma('dart2js:noInline')
+f_001_010_101_110_0(Set<String> u, int b) => v(u, '0010101011100', b);
+
+@pragma('dart2js:noInline')
+f_001_010_110_010_0(Set<String> u, int b) => v(u, '0010101100100', b);
+
+@pragma('dart2js:noInline')
+f_001_010_110_110_0(Set<String> u, int b) => v(u, '0010101101100', b);
+
+@pragma('dart2js:noInline')
+f_001_010_111_010_0(Set<String> u, int b) => v(u, '0010101110100', b);
+
+@pragma('dart2js:noInline')
+f_001_010_111_110_0(Set<String> u, int b) => v(u, '0010101111100', b);
+
+@pragma('dart2js:noInline')
+f_001_011_000_010_0(Set<String> u, int b) => v(u, '0010110000100', b);
+
+@pragma('dart2js:noInline')
+f_001_011_000_110_0(Set<String> u, int b) => v(u, '0010110001100', b);
+
+@pragma('dart2js:noInline')
+f_001_011_001_010_0(Set<String> u, int b) => v(u, '0010110010100', b);
+
+@pragma('dart2js:noInline')
+f_001_011_001_110_0(Set<String> u, int b) => v(u, '0010110011100', b);
+
+@pragma('dart2js:noInline')
+f_001_011_010_010_0(Set<String> u, int b) => v(u, '0010110100100', b);
+
+@pragma('dart2js:noInline')
+f_001_011_010_110_0(Set<String> u, int b) => v(u, '0010110101100', b);
+
+@pragma('dart2js:noInline')
+f_001_011_011_010_0(Set<String> u, int b) => v(u, '0010110110100', b);
+
+@pragma('dart2js:noInline')
+f_001_011_011_110_0(Set<String> u, int b) => v(u, '0010110111100', b);
+
+@pragma('dart2js:noInline')
+f_001_011_100_010_0(Set<String> u, int b) => v(u, '0010111000100', b);
+
+@pragma('dart2js:noInline')
+f_001_011_100_110_0(Set<String> u, int b) => v(u, '0010111001100', b);
+
+@pragma('dart2js:noInline')
+f_001_011_101_010_0(Set<String> u, int b) => v(u, '0010111010100', b);
+
+@pragma('dart2js:noInline')
+f_001_011_101_110_0(Set<String> u, int b) => v(u, '0010111011100', b);
+
+@pragma('dart2js:noInline')
+f_001_011_110_010_0(Set<String> u, int b) => v(u, '0010111100100', b);
+
+@pragma('dart2js:noInline')
+f_001_011_110_110_0(Set<String> u, int b) => v(u, '0010111101100', b);
+
+@pragma('dart2js:noInline')
+f_001_011_111_010_0(Set<String> u, int b) => v(u, '0010111110100', b);
+
+@pragma('dart2js:noInline')
+f_001_011_111_110_0(Set<String> u, int b) => v(u, '0010111111100', b);
+
+@pragma('dart2js:noInline')
+f_001_100_000_010_0(Set<String> u, int b) => v(u, '0011000000100', b);
+
+@pragma('dart2js:noInline')
+f_001_100_000_110_0(Set<String> u, int b) => v(u, '0011000001100', b);
+
+@pragma('dart2js:noInline')
+f_001_100_001_010_0(Set<String> u, int b) => v(u, '0011000010100', b);
+
+@pragma('dart2js:noInline')
+f_001_100_001_110_0(Set<String> u, int b) => v(u, '0011000011100', b);
+
+@pragma('dart2js:noInline')
+f_001_100_010_010_0(Set<String> u, int b) => v(u, '0011000100100', b);
+
+@pragma('dart2js:noInline')
+f_001_100_010_110_0(Set<String> u, int b) => v(u, '0011000101100', b);
+
+@pragma('dart2js:noInline')
+f_001_100_011_010_0(Set<String> u, int b) => v(u, '0011000110100', b);
+
+@pragma('dart2js:noInline')
+f_001_100_011_110_0(Set<String> u, int b) => v(u, '0011000111100', b);
+
+@pragma('dart2js:noInline')
+f_001_100_100_010_0(Set<String> u, int b) => v(u, '0011001000100', b);
+
+@pragma('dart2js:noInline')
+f_001_100_100_110_0(Set<String> u, int b) => v(u, '0011001001100', b);
+
+@pragma('dart2js:noInline')
+f_001_100_101_010_0(Set<String> u, int b) => v(u, '0011001010100', b);
+
+@pragma('dart2js:noInline')
+f_001_100_101_110_0(Set<String> u, int b) => v(u, '0011001011100', b);
+
+@pragma('dart2js:noInline')
+f_001_100_110_010_0(Set<String> u, int b) => v(u, '0011001100100', b);
+
+@pragma('dart2js:noInline')
+f_001_100_110_110_0(Set<String> u, int b) => v(u, '0011001101100', b);
+
+@pragma('dart2js:noInline')
+f_001_100_111_010_0(Set<String> u, int b) => v(u, '0011001110100', b);
+
+@pragma('dart2js:noInline')
+f_001_100_111_110_0(Set<String> u, int b) => v(u, '0011001111100', b);
+
+@pragma('dart2js:noInline')
+f_001_101_000_010_0(Set<String> u, int b) => v(u, '0011010000100', b);
+
+@pragma('dart2js:noInline')
+f_001_101_000_110_0(Set<String> u, int b) => v(u, '0011010001100', b);
+
+@pragma('dart2js:noInline')
+f_001_101_001_010_0(Set<String> u, int b) => v(u, '0011010010100', b);
+
+@pragma('dart2js:noInline')
+f_001_101_001_110_0(Set<String> u, int b) => v(u, '0011010011100', b);
+
+@pragma('dart2js:noInline')
+f_001_101_010_010_0(Set<String> u, int b) => v(u, '0011010100100', b);
+
+@pragma('dart2js:noInline')
+f_001_101_010_110_0(Set<String> u, int b) => v(u, '0011010101100', b);
+
+@pragma('dart2js:noInline')
+f_001_101_011_010_0(Set<String> u, int b) => v(u, '0011010110100', b);
+
+@pragma('dart2js:noInline')
+f_001_101_011_110_0(Set<String> u, int b) => v(u, '0011010111100', b);
+
+@pragma('dart2js:noInline')
+f_001_101_100_010_0(Set<String> u, int b) => v(u, '0011011000100', b);
+
+@pragma('dart2js:noInline')
+f_001_101_100_110_0(Set<String> u, int b) => v(u, '0011011001100', b);
+
+@pragma('dart2js:noInline')
+f_001_101_101_010_0(Set<String> u, int b) => v(u, '0011011010100', b);
+
+@pragma('dart2js:noInline')
+f_001_101_101_110_0(Set<String> u, int b) => v(u, '0011011011100', b);
+
+@pragma('dart2js:noInline')
+f_001_101_110_010_0(Set<String> u, int b) => v(u, '0011011100100', b);
+
+@pragma('dart2js:noInline')
+f_001_101_110_110_0(Set<String> u, int b) => v(u, '0011011101100', b);
+
+@pragma('dart2js:noInline')
+f_001_101_111_010_0(Set<String> u, int b) => v(u, '0011011110100', b);
+
+@pragma('dart2js:noInline')
+f_001_101_111_110_0(Set<String> u, int b) => v(u, '0011011111100', b);
+
+@pragma('dart2js:noInline')
+f_001_110_000_010_0(Set<String> u, int b) => v(u, '0011100000100', b);
+
+@pragma('dart2js:noInline')
+f_001_110_000_110_0(Set<String> u, int b) => v(u, '0011100001100', b);
+
+@pragma('dart2js:noInline')
+f_001_110_001_010_0(Set<String> u, int b) => v(u, '0011100010100', b);
+
+@pragma('dart2js:noInline')
+f_001_110_001_110_0(Set<String> u, int b) => v(u, '0011100011100', b);
+
+@pragma('dart2js:noInline')
+f_001_110_010_010_0(Set<String> u, int b) => v(u, '0011100100100', b);
+
+@pragma('dart2js:noInline')
+f_001_110_010_110_0(Set<String> u, int b) => v(u, '0011100101100', b);
+
+@pragma('dart2js:noInline')
+f_001_110_011_010_0(Set<String> u, int b) => v(u, '0011100110100', b);
+
+@pragma('dart2js:noInline')
+f_001_110_011_110_0(Set<String> u, int b) => v(u, '0011100111100', b);
+
+@pragma('dart2js:noInline')
+f_001_110_100_010_0(Set<String> u, int b) => v(u, '0011101000100', b);
+
+@pragma('dart2js:noInline')
+f_001_110_100_110_0(Set<String> u, int b) => v(u, '0011101001100', b);
+
+@pragma('dart2js:noInline')
+f_001_110_101_010_0(Set<String> u, int b) => v(u, '0011101010100', b);
+
+@pragma('dart2js:noInline')
+f_001_110_101_110_0(Set<String> u, int b) => v(u, '0011101011100', b);
+
+@pragma('dart2js:noInline')
+f_001_110_110_010_0(Set<String> u, int b) => v(u, '0011101100100', b);
+
+@pragma('dart2js:noInline')
+f_001_110_110_110_0(Set<String> u, int b) => v(u, '0011101101100', b);
+
+@pragma('dart2js:noInline')
+f_001_110_111_010_0(Set<String> u, int b) => v(u, '0011101110100', b);
+
+@pragma('dart2js:noInline')
+f_001_110_111_110_0(Set<String> u, int b) => v(u, '0011101111100', b);
+
+@pragma('dart2js:noInline')
+f_001_111_000_010_0(Set<String> u, int b) => v(u, '0011110000100', b);
+
+@pragma('dart2js:noInline')
+f_001_111_000_110_0(Set<String> u, int b) => v(u, '0011110001100', b);
+
+@pragma('dart2js:noInline')
+f_001_111_001_010_0(Set<String> u, int b) => v(u, '0011110010100', b);
+
+@pragma('dart2js:noInline')
+f_001_111_001_110_0(Set<String> u, int b) => v(u, '0011110011100', b);
+
+@pragma('dart2js:noInline')
+f_001_111_010_010_0(Set<String> u, int b) => v(u, '0011110100100', b);
+
+@pragma('dart2js:noInline')
+f_001_111_010_110_0(Set<String> u, int b) => v(u, '0011110101100', b);
+
+@pragma('dart2js:noInline')
+f_001_111_011_010_0(Set<String> u, int b) => v(u, '0011110110100', b);
+
+@pragma('dart2js:noInline')
+f_001_111_011_110_0(Set<String> u, int b) => v(u, '0011110111100', b);
+
+@pragma('dart2js:noInline')
+f_001_111_100_010_0(Set<String> u, int b) => v(u, '0011111000100', b);
+
+@pragma('dart2js:noInline')
+f_001_111_100_110_0(Set<String> u, int b) => v(u, '0011111001100', b);
+
+@pragma('dart2js:noInline')
+f_001_111_101_010_0(Set<String> u, int b) => v(u, '0011111010100', b);
+
+@pragma('dart2js:noInline')
+f_001_111_101_110_0(Set<String> u, int b) => v(u, '0011111011100', b);
+
+@pragma('dart2js:noInline')
+f_001_111_110_010_0(Set<String> u, int b) => v(u, '0011111100100', b);
+
+@pragma('dart2js:noInline')
+f_001_111_110_110_0(Set<String> u, int b) => v(u, '0011111101100', b);
+
+@pragma('dart2js:noInline')
+f_001_111_111_010_0(Set<String> u, int b) => v(u, '0011111110100', b);
+
+@pragma('dart2js:noInline')
+f_001_111_111_110_0(Set<String> u, int b) => v(u, '0011111111100', b);
+
+@pragma('dart2js:noInline')
+f_010_000_000_010_0(Set<String> u, int b) => v(u, '0100000000100', b);
+
+@pragma('dart2js:noInline')
+f_010_000_000_110_0(Set<String> u, int b) => v(u, '0100000001100', b);
+
+@pragma('dart2js:noInline')
+f_010_000_001_010_0(Set<String> u, int b) => v(u, '0100000010100', b);
+
+@pragma('dart2js:noInline')
+f_010_000_001_110_0(Set<String> u, int b) => v(u, '0100000011100', b);
+
+@pragma('dart2js:noInline')
+f_010_000_010_010_0(Set<String> u, int b) => v(u, '0100000100100', b);
+
+@pragma('dart2js:noInline')
+f_010_000_010_110_0(Set<String> u, int b) => v(u, '0100000101100', b);
+
+@pragma('dart2js:noInline')
+f_010_000_011_010_0(Set<String> u, int b) => v(u, '0100000110100', b);
+
+@pragma('dart2js:noInline')
+f_010_000_011_110_0(Set<String> u, int b) => v(u, '0100000111100', b);
+
+@pragma('dart2js:noInline')
+f_010_000_100_010_0(Set<String> u, int b) => v(u, '0100001000100', b);
+
+@pragma('dart2js:noInline')
+f_010_000_100_110_0(Set<String> u, int b) => v(u, '0100001001100', b);
+
+@pragma('dart2js:noInline')
+f_010_000_101_010_0(Set<String> u, int b) => v(u, '0100001010100', b);
+
+@pragma('dart2js:noInline')
+f_010_000_101_110_0(Set<String> u, int b) => v(u, '0100001011100', b);
+
+@pragma('dart2js:noInline')
+f_010_000_110_010_0(Set<String> u, int b) => v(u, '0100001100100', b);
+
+@pragma('dart2js:noInline')
+f_010_000_110_110_0(Set<String> u, int b) => v(u, '0100001101100', b);
+
+@pragma('dart2js:noInline')
+f_010_000_111_010_0(Set<String> u, int b) => v(u, '0100001110100', b);
+
+@pragma('dart2js:noInline')
+f_010_000_111_110_0(Set<String> u, int b) => v(u, '0100001111100', b);
+
+@pragma('dart2js:noInline')
+f_010_001_000_010_0(Set<String> u, int b) => v(u, '0100010000100', b);
+
+@pragma('dart2js:noInline')
+f_010_001_000_110_0(Set<String> u, int b) => v(u, '0100010001100', b);
+
+@pragma('dart2js:noInline')
+f_010_001_001_010_0(Set<String> u, int b) => v(u, '0100010010100', b);
+
+@pragma('dart2js:noInline')
+f_010_001_001_110_0(Set<String> u, int b) => v(u, '0100010011100', b);
+
+@pragma('dart2js:noInline')
+f_010_001_010_010_0(Set<String> u, int b) => v(u, '0100010100100', b);
+
+@pragma('dart2js:noInline')
+f_010_001_010_110_0(Set<String> u, int b) => v(u, '0100010101100', b);
+
+@pragma('dart2js:noInline')
+f_010_001_011_010_0(Set<String> u, int b) => v(u, '0100010110100', b);
+
+@pragma('dart2js:noInline')
+f_010_001_011_110_0(Set<String> u, int b) => v(u, '0100010111100', b);
+
+@pragma('dart2js:noInline')
+f_010_001_100_010_0(Set<String> u, int b) => v(u, '0100011000100', b);
+
+@pragma('dart2js:noInline')
+f_010_001_100_110_0(Set<String> u, int b) => v(u, '0100011001100', b);
+
+@pragma('dart2js:noInline')
+f_010_001_101_010_0(Set<String> u, int b) => v(u, '0100011010100', b);
+
+@pragma('dart2js:noInline')
+f_010_001_101_110_0(Set<String> u, int b) => v(u, '0100011011100', b);
+
+@pragma('dart2js:noInline')
+f_010_001_110_010_0(Set<String> u, int b) => v(u, '0100011100100', b);
+
+@pragma('dart2js:noInline')
+f_010_001_110_110_0(Set<String> u, int b) => v(u, '0100011101100', b);
+
+@pragma('dart2js:noInline')
+f_010_001_111_010_0(Set<String> u, int b) => v(u, '0100011110100', b);
+
+@pragma('dart2js:noInline')
+f_010_001_111_110_0(Set<String> u, int b) => v(u, '0100011111100', b);
+
+@pragma('dart2js:noInline')
+f_010_010_000_010_0(Set<String> u, int b) => v(u, '0100100000100', b);
+
+@pragma('dart2js:noInline')
+f_010_010_000_110_0(Set<String> u, int b) => v(u, '0100100001100', b);
+
+@pragma('dart2js:noInline')
+f_010_010_001_010_0(Set<String> u, int b) => v(u, '0100100010100', b);
+
+@pragma('dart2js:noInline')
+f_010_010_001_110_0(Set<String> u, int b) => v(u, '0100100011100', b);
+
+@pragma('dart2js:noInline')
+f_010_010_010_010_0(Set<String> u, int b) => v(u, '0100100100100', b);
+
+@pragma('dart2js:noInline')
+f_010_010_010_110_0(Set<String> u, int b) => v(u, '0100100101100', b);
+
+@pragma('dart2js:noInline')
+f_010_010_011_010_0(Set<String> u, int b) => v(u, '0100100110100', b);
+
+@pragma('dart2js:noInline')
+f_010_010_011_110_0(Set<String> u, int b) => v(u, '0100100111100', b);
+
+@pragma('dart2js:noInline')
+f_010_010_100_010_0(Set<String> u, int b) => v(u, '0100101000100', b);
+
+@pragma('dart2js:noInline')
+f_010_010_100_110_0(Set<String> u, int b) => v(u, '0100101001100', b);
+
+@pragma('dart2js:noInline')
+f_010_010_101_010_0(Set<String> u, int b) => v(u, '0100101010100', b);
+
+@pragma('dart2js:noInline')
+f_010_010_101_110_0(Set<String> u, int b) => v(u, '0100101011100', b);
+
+@pragma('dart2js:noInline')
+f_010_010_110_010_0(Set<String> u, int b) => v(u, '0100101100100', b);
+
+@pragma('dart2js:noInline')
+f_010_010_110_110_0(Set<String> u, int b) => v(u, '0100101101100', b);
+
+@pragma('dart2js:noInline')
+f_010_010_111_010_0(Set<String> u, int b) => v(u, '0100101110100', b);
+
+@pragma('dart2js:noInline')
+f_010_010_111_110_0(Set<String> u, int b) => v(u, '0100101111100', b);
+
+@pragma('dart2js:noInline')
+f_010_011_000_010_0(Set<String> u, int b) => v(u, '0100110000100', b);
+
+@pragma('dart2js:noInline')
+f_010_011_000_110_0(Set<String> u, int b) => v(u, '0100110001100', b);
+
+@pragma('dart2js:noInline')
+f_010_011_001_010_0(Set<String> u, int b) => v(u, '0100110010100', b);
+
+@pragma('dart2js:noInline')
+f_010_011_001_110_0(Set<String> u, int b) => v(u, '0100110011100', b);
+
+@pragma('dart2js:noInline')
+f_010_011_010_010_0(Set<String> u, int b) => v(u, '0100110100100', b);
+
+@pragma('dart2js:noInline')
+f_010_011_010_110_0(Set<String> u, int b) => v(u, '0100110101100', b);
+
+@pragma('dart2js:noInline')
+f_010_011_011_010_0(Set<String> u, int b) => v(u, '0100110110100', b);
+
+@pragma('dart2js:noInline')
+f_010_011_011_110_0(Set<String> u, int b) => v(u, '0100110111100', b);
+
+@pragma('dart2js:noInline')
+f_010_011_100_010_0(Set<String> u, int b) => v(u, '0100111000100', b);
+
+@pragma('dart2js:noInline')
+f_010_011_100_110_0(Set<String> u, int b) => v(u, '0100111001100', b);
+
+@pragma('dart2js:noInline')
+f_010_011_101_010_0(Set<String> u, int b) => v(u, '0100111010100', b);
+
+@pragma('dart2js:noInline')
+f_010_011_101_110_0(Set<String> u, int b) => v(u, '0100111011100', b);
+
+@pragma('dart2js:noInline')
+f_010_011_110_010_0(Set<String> u, int b) => v(u, '0100111100100', b);
+
+@pragma('dart2js:noInline')
+f_010_011_110_110_0(Set<String> u, int b) => v(u, '0100111101100', b);
+
+@pragma('dart2js:noInline')
+f_010_011_111_010_0(Set<String> u, int b) => v(u, '0100111110100', b);
+
+@pragma('dart2js:noInline')
+f_010_011_111_110_0(Set<String> u, int b) => v(u, '0100111111100', b);
+
+@pragma('dart2js:noInline')
+f_010_100_000_010_0(Set<String> u, int b) => v(u, '0101000000100', b);
+
+@pragma('dart2js:noInline')
+f_010_100_000_110_0(Set<String> u, int b) => v(u, '0101000001100', b);
+
+@pragma('dart2js:noInline')
+f_010_100_001_010_0(Set<String> u, int b) => v(u, '0101000010100', b);
+
+@pragma('dart2js:noInline')
+f_010_100_001_110_0(Set<String> u, int b) => v(u, '0101000011100', b);
+
+@pragma('dart2js:noInline')
+f_010_100_010_010_0(Set<String> u, int b) => v(u, '0101000100100', b);
+
+@pragma('dart2js:noInline')
+f_010_100_010_110_0(Set<String> u, int b) => v(u, '0101000101100', b);
+
+@pragma('dart2js:noInline')
+f_010_100_011_010_0(Set<String> u, int b) => v(u, '0101000110100', b);
+
+@pragma('dart2js:noInline')
+f_010_100_011_110_0(Set<String> u, int b) => v(u, '0101000111100', b);
+
+@pragma('dart2js:noInline')
+f_010_100_100_010_0(Set<String> u, int b) => v(u, '0101001000100', b);
+
+@pragma('dart2js:noInline')
+f_010_100_100_110_0(Set<String> u, int b) => v(u, '0101001001100', b);
+
+@pragma('dart2js:noInline')
+f_010_100_101_010_0(Set<String> u, int b) => v(u, '0101001010100', b);
+
+@pragma('dart2js:noInline')
+f_010_100_101_110_0(Set<String> u, int b) => v(u, '0101001011100', b);
+
+@pragma('dart2js:noInline')
+f_010_100_110_010_0(Set<String> u, int b) => v(u, '0101001100100', b);
+
+@pragma('dart2js:noInline')
+f_010_100_110_110_0(Set<String> u, int b) => v(u, '0101001101100', b);
+
+@pragma('dart2js:noInline')
+f_010_100_111_010_0(Set<String> u, int b) => v(u, '0101001110100', b);
+
+@pragma('dart2js:noInline')
+f_010_100_111_110_0(Set<String> u, int b) => v(u, '0101001111100', b);
+
+@pragma('dart2js:noInline')
+f_010_101_000_010_0(Set<String> u, int b) => v(u, '0101010000100', b);
+
+@pragma('dart2js:noInline')
+f_010_101_000_110_0(Set<String> u, int b) => v(u, '0101010001100', b);
+
+@pragma('dart2js:noInline')
+f_010_101_001_010_0(Set<String> u, int b) => v(u, '0101010010100', b);
+
+@pragma('dart2js:noInline')
+f_010_101_001_110_0(Set<String> u, int b) => v(u, '0101010011100', b);
+
+@pragma('dart2js:noInline')
+f_010_101_010_010_0(Set<String> u, int b) => v(u, '0101010100100', b);
+
+@pragma('dart2js:noInline')
+f_010_101_010_110_0(Set<String> u, int b) => v(u, '0101010101100', b);
+
+@pragma('dart2js:noInline')
+f_010_101_011_010_0(Set<String> u, int b) => v(u, '0101010110100', b);
+
+@pragma('dart2js:noInline')
+f_010_101_011_110_0(Set<String> u, int b) => v(u, '0101010111100', b);
+
+@pragma('dart2js:noInline')
+f_010_101_100_010_0(Set<String> u, int b) => v(u, '0101011000100', b);
+
+@pragma('dart2js:noInline')
+f_010_101_100_110_0(Set<String> u, int b) => v(u, '0101011001100', b);
+
+@pragma('dart2js:noInline')
+f_010_101_101_010_0(Set<String> u, int b) => v(u, '0101011010100', b);
+
+@pragma('dart2js:noInline')
+f_010_101_101_110_0(Set<String> u, int b) => v(u, '0101011011100', b);
+
+@pragma('dart2js:noInline')
+f_010_101_110_010_0(Set<String> u, int b) => v(u, '0101011100100', b);
+
+@pragma('dart2js:noInline')
+f_010_101_110_110_0(Set<String> u, int b) => v(u, '0101011101100', b);
+
+@pragma('dart2js:noInline')
+f_010_101_111_010_0(Set<String> u, int b) => v(u, '0101011110100', b);
+
+@pragma('dart2js:noInline')
+f_010_101_111_110_0(Set<String> u, int b) => v(u, '0101011111100', b);
+
+@pragma('dart2js:noInline')
+f_010_110_000_010_0(Set<String> u, int b) => v(u, '0101100000100', b);
+
+@pragma('dart2js:noInline')
+f_010_110_000_110_0(Set<String> u, int b) => v(u, '0101100001100', b);
+
+@pragma('dart2js:noInline')
+f_010_110_001_010_0(Set<String> u, int b) => v(u, '0101100010100', b);
+
+@pragma('dart2js:noInline')
+f_010_110_001_110_0(Set<String> u, int b) => v(u, '0101100011100', b);
+
+@pragma('dart2js:noInline')
+f_010_110_010_010_0(Set<String> u, int b) => v(u, '0101100100100', b);
+
+@pragma('dart2js:noInline')
+f_010_110_010_110_0(Set<String> u, int b) => v(u, '0101100101100', b);
+
+@pragma('dart2js:noInline')
+f_010_110_011_010_0(Set<String> u, int b) => v(u, '0101100110100', b);
+
+@pragma('dart2js:noInline')
+f_010_110_011_110_0(Set<String> u, int b) => v(u, '0101100111100', b);
+
+@pragma('dart2js:noInline')
+f_010_110_100_010_0(Set<String> u, int b) => v(u, '0101101000100', b);
+
+@pragma('dart2js:noInline')
+f_010_110_100_110_0(Set<String> u, int b) => v(u, '0101101001100', b);
+
+@pragma('dart2js:noInline')
+f_010_110_101_010_0(Set<String> u, int b) => v(u, '0101101010100', b);
+
+@pragma('dart2js:noInline')
+f_010_110_101_110_0(Set<String> u, int b) => v(u, '0101101011100', b);
+
+@pragma('dart2js:noInline')
+f_010_110_110_010_0(Set<String> u, int b) => v(u, '0101101100100', b);
+
+@pragma('dart2js:noInline')
+f_010_110_110_110_0(Set<String> u, int b) => v(u, '0101101101100', b);
+
+@pragma('dart2js:noInline')
+f_010_110_111_010_0(Set<String> u, int b) => v(u, '0101101110100', b);
+
+@pragma('dart2js:noInline')
+f_010_110_111_110_0(Set<String> u, int b) => v(u, '0101101111100', b);
+
+@pragma('dart2js:noInline')
+f_010_111_000_010_0(Set<String> u, int b) => v(u, '0101110000100', b);
+
+@pragma('dart2js:noInline')
+f_010_111_000_110_0(Set<String> u, int b) => v(u, '0101110001100', b);
+
+@pragma('dart2js:noInline')
+f_010_111_001_010_0(Set<String> u, int b) => v(u, '0101110010100', b);
+
+@pragma('dart2js:noInline')
+f_010_111_001_110_0(Set<String> u, int b) => v(u, '0101110011100', b);
+
+@pragma('dart2js:noInline')
+f_010_111_010_010_0(Set<String> u, int b) => v(u, '0101110100100', b);
+
+@pragma('dart2js:noInline')
+f_010_111_010_110_0(Set<String> u, int b) => v(u, '0101110101100', b);
+
+@pragma('dart2js:noInline')
+f_010_111_011_010_0(Set<String> u, int b) => v(u, '0101110110100', b);
+
+@pragma('dart2js:noInline')
+f_010_111_011_110_0(Set<String> u, int b) => v(u, '0101110111100', b);
+
+@pragma('dart2js:noInline')
+f_010_111_100_010_0(Set<String> u, int b) => v(u, '0101111000100', b);
+
+@pragma('dart2js:noInline')
+f_010_111_100_110_0(Set<String> u, int b) => v(u, '0101111001100', b);
+
+@pragma('dart2js:noInline')
+f_010_111_101_010_0(Set<String> u, int b) => v(u, '0101111010100', b);
+
+@pragma('dart2js:noInline')
+f_010_111_101_110_0(Set<String> u, int b) => v(u, '0101111011100', b);
+
+@pragma('dart2js:noInline')
+f_010_111_110_010_0(Set<String> u, int b) => v(u, '0101111100100', b);
+
+@pragma('dart2js:noInline')
+f_010_111_110_110_0(Set<String> u, int b) => v(u, '0101111101100', b);
+
+@pragma('dart2js:noInline')
+f_010_111_111_010_0(Set<String> u, int b) => v(u, '0101111110100', b);
+
+@pragma('dart2js:noInline')
+f_010_111_111_110_0(Set<String> u, int b) => v(u, '0101111111100', b);
+
+@pragma('dart2js:noInline')
+f_011_000_000_010_0(Set<String> u, int b) => v(u, '0110000000100', b);
+
+@pragma('dart2js:noInline')
+f_011_000_000_110_0(Set<String> u, int b) => v(u, '0110000001100', b);
+
+@pragma('dart2js:noInline')
+f_011_000_001_010_0(Set<String> u, int b) => v(u, '0110000010100', b);
+
+@pragma('dart2js:noInline')
+f_011_000_001_110_0(Set<String> u, int b) => v(u, '0110000011100', b);
+
+@pragma('dart2js:noInline')
+f_011_000_010_010_0(Set<String> u, int b) => v(u, '0110000100100', b);
+
+@pragma('dart2js:noInline')
+f_011_000_010_110_0(Set<String> u, int b) => v(u, '0110000101100', b);
+
+@pragma('dart2js:noInline')
+f_011_000_011_010_0(Set<String> u, int b) => v(u, '0110000110100', b);
+
+@pragma('dart2js:noInline')
+f_011_000_011_110_0(Set<String> u, int b) => v(u, '0110000111100', b);
+
+@pragma('dart2js:noInline')
+f_011_000_100_010_0(Set<String> u, int b) => v(u, '0110001000100', b);
+
+@pragma('dart2js:noInline')
+f_011_000_100_110_0(Set<String> u, int b) => v(u, '0110001001100', b);
+
+@pragma('dart2js:noInline')
+f_011_000_101_010_0(Set<String> u, int b) => v(u, '0110001010100', b);
+
+@pragma('dart2js:noInline')
+f_011_000_101_110_0(Set<String> u, int b) => v(u, '0110001011100', b);
+
+@pragma('dart2js:noInline')
+f_011_000_110_010_0(Set<String> u, int b) => v(u, '0110001100100', b);
+
+@pragma('dart2js:noInline')
+f_011_000_110_110_0(Set<String> u, int b) => v(u, '0110001101100', b);
+
+@pragma('dart2js:noInline')
+f_011_000_111_010_0(Set<String> u, int b) => v(u, '0110001110100', b);
+
+@pragma('dart2js:noInline')
+f_011_000_111_110_0(Set<String> u, int b) => v(u, '0110001111100', b);
+
+@pragma('dart2js:noInline')
+f_011_001_000_010_0(Set<String> u, int b) => v(u, '0110010000100', b);
+
+@pragma('dart2js:noInline')
+f_011_001_000_110_0(Set<String> u, int b) => v(u, '0110010001100', b);
+
+@pragma('dart2js:noInline')
+f_011_001_001_010_0(Set<String> u, int b) => v(u, '0110010010100', b);
+
+@pragma('dart2js:noInline')
+f_011_001_001_110_0(Set<String> u, int b) => v(u, '0110010011100', b);
+
+@pragma('dart2js:noInline')
+f_011_001_010_010_0(Set<String> u, int b) => v(u, '0110010100100', b);
+
+@pragma('dart2js:noInline')
+f_011_001_010_110_0(Set<String> u, int b) => v(u, '0110010101100', b);
+
+@pragma('dart2js:noInline')
+f_011_001_011_010_0(Set<String> u, int b) => v(u, '0110010110100', b);
+
+@pragma('dart2js:noInline')
+f_011_001_011_110_0(Set<String> u, int b) => v(u, '0110010111100', b);
+
+@pragma('dart2js:noInline')
+f_011_001_100_010_0(Set<String> u, int b) => v(u, '0110011000100', b);
+
+@pragma('dart2js:noInline')
+f_011_001_100_110_0(Set<String> u, int b) => v(u, '0110011001100', b);
+
+@pragma('dart2js:noInline')
+f_011_001_101_010_0(Set<String> u, int b) => v(u, '0110011010100', b);
+
+@pragma('dart2js:noInline')
+f_011_001_101_110_0(Set<String> u, int b) => v(u, '0110011011100', b);
+
+@pragma('dart2js:noInline')
+f_011_001_110_010_0(Set<String> u, int b) => v(u, '0110011100100', b);
+
+@pragma('dart2js:noInline')
+f_011_001_110_110_0(Set<String> u, int b) => v(u, '0110011101100', b);
+
+@pragma('dart2js:noInline')
+f_011_001_111_010_0(Set<String> u, int b) => v(u, '0110011110100', b);
+
+@pragma('dart2js:noInline')
+f_011_001_111_110_0(Set<String> u, int b) => v(u, '0110011111100', b);
+
+@pragma('dart2js:noInline')
+f_011_010_000_010_0(Set<String> u, int b) => v(u, '0110100000100', b);
+
+@pragma('dart2js:noInline')
+f_011_010_000_110_0(Set<String> u, int b) => v(u, '0110100001100', b);
+
+@pragma('dart2js:noInline')
+f_011_010_001_010_0(Set<String> u, int b) => v(u, '0110100010100', b);
+
+@pragma('dart2js:noInline')
+f_011_010_001_110_0(Set<String> u, int b) => v(u, '0110100011100', b);
+
+@pragma('dart2js:noInline')
+f_011_010_010_010_0(Set<String> u, int b) => v(u, '0110100100100', b);
+
+@pragma('dart2js:noInline')
+f_011_010_010_110_0(Set<String> u, int b) => v(u, '0110100101100', b);
+
+@pragma('dart2js:noInline')
+f_011_010_011_010_0(Set<String> u, int b) => v(u, '0110100110100', b);
+
+@pragma('dart2js:noInline')
+f_011_010_011_110_0(Set<String> u, int b) => v(u, '0110100111100', b);
+
+@pragma('dart2js:noInline')
+f_011_010_100_010_0(Set<String> u, int b) => v(u, '0110101000100', b);
+
+@pragma('dart2js:noInline')
+f_011_010_100_110_0(Set<String> u, int b) => v(u, '0110101001100', b);
+
+@pragma('dart2js:noInline')
+f_011_010_101_010_0(Set<String> u, int b) => v(u, '0110101010100', b);
+
+@pragma('dart2js:noInline')
+f_011_010_101_110_0(Set<String> u, int b) => v(u, '0110101011100', b);
+
+@pragma('dart2js:noInline')
+f_011_010_110_010_0(Set<String> u, int b) => v(u, '0110101100100', b);
+
+@pragma('dart2js:noInline')
+f_011_010_110_110_0(Set<String> u, int b) => v(u, '0110101101100', b);
+
+@pragma('dart2js:noInline')
+f_011_010_111_010_0(Set<String> u, int b) => v(u, '0110101110100', b);
+
+@pragma('dart2js:noInline')
+f_011_010_111_110_0(Set<String> u, int b) => v(u, '0110101111100', b);
+
+@pragma('dart2js:noInline')
+f_011_011_000_010_0(Set<String> u, int b) => v(u, '0110110000100', b);
+
+@pragma('dart2js:noInline')
+f_011_011_000_110_0(Set<String> u, int b) => v(u, '0110110001100', b);
+
+@pragma('dart2js:noInline')
+f_011_011_001_010_0(Set<String> u, int b) => v(u, '0110110010100', b);
+
+@pragma('dart2js:noInline')
+f_011_011_001_110_0(Set<String> u, int b) => v(u, '0110110011100', b);
+
+@pragma('dart2js:noInline')
+f_011_011_010_010_0(Set<String> u, int b) => v(u, '0110110100100', b);
+
+@pragma('dart2js:noInline')
+f_011_011_010_110_0(Set<String> u, int b) => v(u, '0110110101100', b);
+
+@pragma('dart2js:noInline')
+f_011_011_011_010_0(Set<String> u, int b) => v(u, '0110110110100', b);
+
+@pragma('dart2js:noInline')
+f_011_011_011_110_0(Set<String> u, int b) => v(u, '0110110111100', b);
+
+@pragma('dart2js:noInline')
+f_011_011_100_010_0(Set<String> u, int b) => v(u, '0110111000100', b);
+
+@pragma('dart2js:noInline')
+f_011_011_100_110_0(Set<String> u, int b) => v(u, '0110111001100', b);
+
+@pragma('dart2js:noInline')
+f_011_011_101_010_0(Set<String> u, int b) => v(u, '0110111010100', b);
+
+@pragma('dart2js:noInline')
+f_011_011_101_110_0(Set<String> u, int b) => v(u, '0110111011100', b);
+
+@pragma('dart2js:noInline')
+f_011_011_110_010_0(Set<String> u, int b) => v(u, '0110111100100', b);
+
+@pragma('dart2js:noInline')
+f_011_011_110_110_0(Set<String> u, int b) => v(u, '0110111101100', b);
+
+@pragma('dart2js:noInline')
+f_011_011_111_010_0(Set<String> u, int b) => v(u, '0110111110100', b);
+
+@pragma('dart2js:noInline')
+f_011_011_111_110_0(Set<String> u, int b) => v(u, '0110111111100', b);
+
+@pragma('dart2js:noInline')
+f_011_100_000_010_0(Set<String> u, int b) => v(u, '0111000000100', b);
+
+@pragma('dart2js:noInline')
+f_011_100_000_110_0(Set<String> u, int b) => v(u, '0111000001100', b);
+
+@pragma('dart2js:noInline')
+f_011_100_001_010_0(Set<String> u, int b) => v(u, '0111000010100', b);
+
+@pragma('dart2js:noInline')
+f_011_100_001_110_0(Set<String> u, int b) => v(u, '0111000011100', b);
+
+@pragma('dart2js:noInline')
+f_011_100_010_010_0(Set<String> u, int b) => v(u, '0111000100100', b);
+
+@pragma('dart2js:noInline')
+f_011_100_010_110_0(Set<String> u, int b) => v(u, '0111000101100', b);
+
+@pragma('dart2js:noInline')
+f_011_100_011_010_0(Set<String> u, int b) => v(u, '0111000110100', b);
+
+@pragma('dart2js:noInline')
+f_011_100_011_110_0(Set<String> u, int b) => v(u, '0111000111100', b);
+
+@pragma('dart2js:noInline')
+f_011_100_100_010_0(Set<String> u, int b) => v(u, '0111001000100', b);
+
+@pragma('dart2js:noInline')
+f_011_100_100_110_0(Set<String> u, int b) => v(u, '0111001001100', b);
+
+@pragma('dart2js:noInline')
+f_011_100_101_010_0(Set<String> u, int b) => v(u, '0111001010100', b);
+
+@pragma('dart2js:noInline')
+f_011_100_101_110_0(Set<String> u, int b) => v(u, '0111001011100', b);
+
+@pragma('dart2js:noInline')
+f_011_100_110_010_0(Set<String> u, int b) => v(u, '0111001100100', b);
+
+@pragma('dart2js:noInline')
+f_011_100_110_110_0(Set<String> u, int b) => v(u, '0111001101100', b);
+
+@pragma('dart2js:noInline')
+f_011_100_111_010_0(Set<String> u, int b) => v(u, '0111001110100', b);
+
+@pragma('dart2js:noInline')
+f_011_100_111_110_0(Set<String> u, int b) => v(u, '0111001111100', b);
+
+@pragma('dart2js:noInline')
+f_011_101_000_010_0(Set<String> u, int b) => v(u, '0111010000100', b);
+
+@pragma('dart2js:noInline')
+f_011_101_000_110_0(Set<String> u, int b) => v(u, '0111010001100', b);
+
+@pragma('dart2js:noInline')
+f_011_101_001_010_0(Set<String> u, int b) => v(u, '0111010010100', b);
+
+@pragma('dart2js:noInline')
+f_011_101_001_110_0(Set<String> u, int b) => v(u, '0111010011100', b);
+
+@pragma('dart2js:noInline')
+f_011_101_010_010_0(Set<String> u, int b) => v(u, '0111010100100', b);
+
+@pragma('dart2js:noInline')
+f_011_101_010_110_0(Set<String> u, int b) => v(u, '0111010101100', b);
+
+@pragma('dart2js:noInline')
+f_011_101_011_010_0(Set<String> u, int b) => v(u, '0111010110100', b);
+
+@pragma('dart2js:noInline')
+f_011_101_011_110_0(Set<String> u, int b) => v(u, '0111010111100', b);
+
+@pragma('dart2js:noInline')
+f_011_101_100_010_0(Set<String> u, int b) => v(u, '0111011000100', b);
+
+@pragma('dart2js:noInline')
+f_011_101_100_110_0(Set<String> u, int b) => v(u, '0111011001100', b);
+
+@pragma('dart2js:noInline')
+f_011_101_101_010_0(Set<String> u, int b) => v(u, '0111011010100', b);
+
+@pragma('dart2js:noInline')
+f_011_101_101_110_0(Set<String> u, int b) => v(u, '0111011011100', b);
+
+@pragma('dart2js:noInline')
+f_011_101_110_010_0(Set<String> u, int b) => v(u, '0111011100100', b);
+
+@pragma('dart2js:noInline')
+f_011_101_110_110_0(Set<String> u, int b) => v(u, '0111011101100', b);
+
+@pragma('dart2js:noInline')
+f_011_101_111_010_0(Set<String> u, int b) => v(u, '0111011110100', b);
+
+@pragma('dart2js:noInline')
+f_011_101_111_110_0(Set<String> u, int b) => v(u, '0111011111100', b);
+
+@pragma('dart2js:noInline')
+f_011_110_000_010_0(Set<String> u, int b) => v(u, '0111100000100', b);
+
+@pragma('dart2js:noInline')
+f_011_110_000_110_0(Set<String> u, int b) => v(u, '0111100001100', b);
+
+@pragma('dart2js:noInline')
+f_011_110_001_010_0(Set<String> u, int b) => v(u, '0111100010100', b);
+
+@pragma('dart2js:noInline')
+f_011_110_001_110_0(Set<String> u, int b) => v(u, '0111100011100', b);
+
+@pragma('dart2js:noInline')
+f_011_110_010_010_0(Set<String> u, int b) => v(u, '0111100100100', b);
+
+@pragma('dart2js:noInline')
+f_011_110_010_110_0(Set<String> u, int b) => v(u, '0111100101100', b);
+
+@pragma('dart2js:noInline')
+f_011_110_011_010_0(Set<String> u, int b) => v(u, '0111100110100', b);
+
+@pragma('dart2js:noInline')
+f_011_110_011_110_0(Set<String> u, int b) => v(u, '0111100111100', b);
+
+@pragma('dart2js:noInline')
+f_011_110_100_010_0(Set<String> u, int b) => v(u, '0111101000100', b);
+
+@pragma('dart2js:noInline')
+f_011_110_100_110_0(Set<String> u, int b) => v(u, '0111101001100', b);
+
+@pragma('dart2js:noInline')
+f_011_110_101_010_0(Set<String> u, int b) => v(u, '0111101010100', b);
+
+@pragma('dart2js:noInline')
+f_011_110_101_110_0(Set<String> u, int b) => v(u, '0111101011100', b);
+
+@pragma('dart2js:noInline')
+f_011_110_110_010_0(Set<String> u, int b) => v(u, '0111101100100', b);
+
+@pragma('dart2js:noInline')
+f_011_110_110_110_0(Set<String> u, int b) => v(u, '0111101101100', b);
+
+@pragma('dart2js:noInline')
+f_011_110_111_010_0(Set<String> u, int b) => v(u, '0111101110100', b);
+
+@pragma('dart2js:noInline')
+f_011_110_111_110_0(Set<String> u, int b) => v(u, '0111101111100', b);
+
+@pragma('dart2js:noInline')
+f_011_111_000_010_0(Set<String> u, int b) => v(u, '0111110000100', b);
+
+@pragma('dart2js:noInline')
+f_011_111_000_110_0(Set<String> u, int b) => v(u, '0111110001100', b);
+
+@pragma('dart2js:noInline')
+f_011_111_001_010_0(Set<String> u, int b) => v(u, '0111110010100', b);
+
+@pragma('dart2js:noInline')
+f_011_111_001_110_0(Set<String> u, int b) => v(u, '0111110011100', b);
+
+@pragma('dart2js:noInline')
+f_011_111_010_010_0(Set<String> u, int b) => v(u, '0111110100100', b);
+
+@pragma('dart2js:noInline')
+f_011_111_010_110_0(Set<String> u, int b) => v(u, '0111110101100', b);
+
+@pragma('dart2js:noInline')
+f_011_111_011_010_0(Set<String> u, int b) => v(u, '0111110110100', b);
+
+@pragma('dart2js:noInline')
+f_011_111_011_110_0(Set<String> u, int b) => v(u, '0111110111100', b);
+
+@pragma('dart2js:noInline')
+f_011_111_100_010_0(Set<String> u, int b) => v(u, '0111111000100', b);
+
+@pragma('dart2js:noInline')
+f_011_111_100_110_0(Set<String> u, int b) => v(u, '0111111001100', b);
+
+@pragma('dart2js:noInline')
+f_011_111_101_010_0(Set<String> u, int b) => v(u, '0111111010100', b);
+
+@pragma('dart2js:noInline')
+f_011_111_101_110_0(Set<String> u, int b) => v(u, '0111111011100', b);
+
+@pragma('dart2js:noInline')
+f_011_111_110_010_0(Set<String> u, int b) => v(u, '0111111100100', b);
+
+@pragma('dart2js:noInline')
+f_011_111_110_110_0(Set<String> u, int b) => v(u, '0111111101100', b);
+
+@pragma('dart2js:noInline')
+f_011_111_111_010_0(Set<String> u, int b) => v(u, '0111111110100', b);
+
+@pragma('dart2js:noInline')
+f_011_111_111_110_0(Set<String> u, int b) => v(u, '0111111111100', b);
+
+@pragma('dart2js:noInline')
+f_100_000_000_010_0(Set<String> u, int b) => v(u, '1000000000100', b);
+
+@pragma('dart2js:noInline')
+f_100_000_000_110_0(Set<String> u, int b) => v(u, '1000000001100', b);
+
+@pragma('dart2js:noInline')
+f_100_000_001_010_0(Set<String> u, int b) => v(u, '1000000010100', b);
+
+@pragma('dart2js:noInline')
+f_100_000_001_110_0(Set<String> u, int b) => v(u, '1000000011100', b);
+
+@pragma('dart2js:noInline')
+f_100_000_010_010_0(Set<String> u, int b) => v(u, '1000000100100', b);
+
+@pragma('dart2js:noInline')
+f_100_000_010_110_0(Set<String> u, int b) => v(u, '1000000101100', b);
+
+@pragma('dart2js:noInline')
+f_100_000_011_010_0(Set<String> u, int b) => v(u, '1000000110100', b);
+
+@pragma('dart2js:noInline')
+f_100_000_011_110_0(Set<String> u, int b) => v(u, '1000000111100', b);
+
+@pragma('dart2js:noInline')
+f_100_000_100_010_0(Set<String> u, int b) => v(u, '1000001000100', b);
+
+@pragma('dart2js:noInline')
+f_100_000_100_110_0(Set<String> u, int b) => v(u, '1000001001100', b);
+
+@pragma('dart2js:noInline')
+f_100_000_101_010_0(Set<String> u, int b) => v(u, '1000001010100', b);
+
+@pragma('dart2js:noInline')
+f_100_000_101_110_0(Set<String> u, int b) => v(u, '1000001011100', b);
+
+@pragma('dart2js:noInline')
+f_100_000_110_010_0(Set<String> u, int b) => v(u, '1000001100100', b);
+
+@pragma('dart2js:noInline')
+f_100_000_110_110_0(Set<String> u, int b) => v(u, '1000001101100', b);
+
+@pragma('dart2js:noInline')
+f_100_000_111_010_0(Set<String> u, int b) => v(u, '1000001110100', b);
+
+@pragma('dart2js:noInline')
+f_100_000_111_110_0(Set<String> u, int b) => v(u, '1000001111100', b);
+
+@pragma('dart2js:noInline')
+f_100_001_000_010_0(Set<String> u, int b) => v(u, '1000010000100', b);
+
+@pragma('dart2js:noInline')
+f_100_001_000_110_0(Set<String> u, int b) => v(u, '1000010001100', b);
+
+@pragma('dart2js:noInline')
+f_100_001_001_010_0(Set<String> u, int b) => v(u, '1000010010100', b);
+
+@pragma('dart2js:noInline')
+f_100_001_001_110_0(Set<String> u, int b) => v(u, '1000010011100', b);
+
+@pragma('dart2js:noInline')
+f_100_001_010_010_0(Set<String> u, int b) => v(u, '1000010100100', b);
+
+@pragma('dart2js:noInline')
+f_100_001_010_110_0(Set<String> u, int b) => v(u, '1000010101100', b);
+
+@pragma('dart2js:noInline')
+f_100_001_011_010_0(Set<String> u, int b) => v(u, '1000010110100', b);
+
+@pragma('dart2js:noInline')
+f_100_001_011_110_0(Set<String> u, int b) => v(u, '1000010111100', b);
+
+@pragma('dart2js:noInline')
+f_100_001_100_010_0(Set<String> u, int b) => v(u, '1000011000100', b);
+
+@pragma('dart2js:noInline')
+f_100_001_100_110_0(Set<String> u, int b) => v(u, '1000011001100', b);
+
+@pragma('dart2js:noInline')
+f_100_001_101_010_0(Set<String> u, int b) => v(u, '1000011010100', b);
+
+@pragma('dart2js:noInline')
+f_100_001_101_110_0(Set<String> u, int b) => v(u, '1000011011100', b);
+
+@pragma('dart2js:noInline')
+f_100_001_110_010_0(Set<String> u, int b) => v(u, '1000011100100', b);
+
+@pragma('dart2js:noInline')
+f_100_001_110_110_0(Set<String> u, int b) => v(u, '1000011101100', b);
+
+@pragma('dart2js:noInline')
+f_100_001_111_010_0(Set<String> u, int b) => v(u, '1000011110100', b);
+
+@pragma('dart2js:noInline')
+f_100_001_111_110_0(Set<String> u, int b) => v(u, '1000011111100', b);
+
+@pragma('dart2js:noInline')
+f_100_010_000_010_0(Set<String> u, int b) => v(u, '1000100000100', b);
+
+@pragma('dart2js:noInline')
+f_100_010_000_110_0(Set<String> u, int b) => v(u, '1000100001100', b);
+
+@pragma('dart2js:noInline')
+f_100_010_001_010_0(Set<String> u, int b) => v(u, '1000100010100', b);
+
+@pragma('dart2js:noInline')
+f_100_010_001_110_0(Set<String> u, int b) => v(u, '1000100011100', b);
+
+@pragma('dart2js:noInline')
+f_100_010_010_010_0(Set<String> u, int b) => v(u, '1000100100100', b);
+
+@pragma('dart2js:noInline')
+f_100_010_010_110_0(Set<String> u, int b) => v(u, '1000100101100', b);
+
+@pragma('dart2js:noInline')
+f_100_010_011_010_0(Set<String> u, int b) => v(u, '1000100110100', b);
+
+@pragma('dart2js:noInline')
+f_100_010_011_110_0(Set<String> u, int b) => v(u, '1000100111100', b);
+
+@pragma('dart2js:noInline')
+f_100_010_100_010_0(Set<String> u, int b) => v(u, '1000101000100', b);
+
+@pragma('dart2js:noInline')
+f_100_010_100_110_0(Set<String> u, int b) => v(u, '1000101001100', b);
+
+@pragma('dart2js:noInline')
+f_100_010_101_010_0(Set<String> u, int b) => v(u, '1000101010100', b);
+
+@pragma('dart2js:noInline')
+f_100_010_101_110_0(Set<String> u, int b) => v(u, '1000101011100', b);
+
+@pragma('dart2js:noInline')
+f_100_010_110_010_0(Set<String> u, int b) => v(u, '1000101100100', b);
+
+@pragma('dart2js:noInline')
+f_100_010_110_110_0(Set<String> u, int b) => v(u, '1000101101100', b);
+
+@pragma('dart2js:noInline')
+f_100_010_111_010_0(Set<String> u, int b) => v(u, '1000101110100', b);
+
+@pragma('dart2js:noInline')
+f_100_010_111_110_0(Set<String> u, int b) => v(u, '1000101111100', b);
+
+@pragma('dart2js:noInline')
+f_100_011_000_010_0(Set<String> u, int b) => v(u, '1000110000100', b);
+
+@pragma('dart2js:noInline')
+f_100_011_000_110_0(Set<String> u, int b) => v(u, '1000110001100', b);
+
+@pragma('dart2js:noInline')
+f_100_011_001_010_0(Set<String> u, int b) => v(u, '1000110010100', b);
+
+@pragma('dart2js:noInline')
+f_100_011_001_110_0(Set<String> u, int b) => v(u, '1000110011100', b);
+
+@pragma('dart2js:noInline')
+f_100_011_010_010_0(Set<String> u, int b) => v(u, '1000110100100', b);
+
+@pragma('dart2js:noInline')
+f_100_011_010_110_0(Set<String> u, int b) => v(u, '1000110101100', b);
+
+@pragma('dart2js:noInline')
+f_100_011_011_010_0(Set<String> u, int b) => v(u, '1000110110100', b);
+
+@pragma('dart2js:noInline')
+f_100_011_011_110_0(Set<String> u, int b) => v(u, '1000110111100', b);
+
+@pragma('dart2js:noInline')
+f_100_011_100_010_0(Set<String> u, int b) => v(u, '1000111000100', b);
+
+@pragma('dart2js:noInline')
+f_100_011_100_110_0(Set<String> u, int b) => v(u, '1000111001100', b);
+
+@pragma('dart2js:noInline')
+f_100_011_101_010_0(Set<String> u, int b) => v(u, '1000111010100', b);
+
+@pragma('dart2js:noInline')
+f_100_011_101_110_0(Set<String> u, int b) => v(u, '1000111011100', b);
+
+@pragma('dart2js:noInline')
+f_100_011_110_010_0(Set<String> u, int b) => v(u, '1000111100100', b);
+
+@pragma('dart2js:noInline')
+f_100_011_110_110_0(Set<String> u, int b) => v(u, '1000111101100', b);
+
+@pragma('dart2js:noInline')
+f_100_011_111_010_0(Set<String> u, int b) => v(u, '1000111110100', b);
+
+@pragma('dart2js:noInline')
+f_100_011_111_110_0(Set<String> u, int b) => v(u, '1000111111100', b);
+
+@pragma('dart2js:noInline')
+f_100_100_000_010_0(Set<String> u, int b) => v(u, '1001000000100', b);
+
+@pragma('dart2js:noInline')
+f_100_100_000_110_0(Set<String> u, int b) => v(u, '1001000001100', b);
+
+@pragma('dart2js:noInline')
+f_100_100_001_010_0(Set<String> u, int b) => v(u, '1001000010100', b);
+
+@pragma('dart2js:noInline')
+f_100_100_001_110_0(Set<String> u, int b) => v(u, '1001000011100', b);
+
+@pragma('dart2js:noInline')
+f_100_100_010_010_0(Set<String> u, int b) => v(u, '1001000100100', b);
+
+@pragma('dart2js:noInline')
+f_100_100_010_110_0(Set<String> u, int b) => v(u, '1001000101100', b);
+
+@pragma('dart2js:noInline')
+f_100_100_011_010_0(Set<String> u, int b) => v(u, '1001000110100', b);
+
+@pragma('dart2js:noInline')
+f_100_100_011_110_0(Set<String> u, int b) => v(u, '1001000111100', b);
+
+@pragma('dart2js:noInline')
+f_100_100_100_010_0(Set<String> u, int b) => v(u, '1001001000100', b);
+
+@pragma('dart2js:noInline')
+f_100_100_100_110_0(Set<String> u, int b) => v(u, '1001001001100', b);
+
+@pragma('dart2js:noInline')
+f_100_100_101_010_0(Set<String> u, int b) => v(u, '1001001010100', b);
+
+@pragma('dart2js:noInline')
+f_100_100_101_110_0(Set<String> u, int b) => v(u, '1001001011100', b);
+
+@pragma('dart2js:noInline')
+f_100_100_110_010_0(Set<String> u, int b) => v(u, '1001001100100', b);
+
+@pragma('dart2js:noInline')
+f_100_100_110_110_0(Set<String> u, int b) => v(u, '1001001101100', b);
+
+@pragma('dart2js:noInline')
+f_100_100_111_010_0(Set<String> u, int b) => v(u, '1001001110100', b);
+
+@pragma('dart2js:noInline')
+f_100_100_111_110_0(Set<String> u, int b) => v(u, '1001001111100', b);
+
+@pragma('dart2js:noInline')
+f_100_101_000_010_0(Set<String> u, int b) => v(u, '1001010000100', b);
+
+@pragma('dart2js:noInline')
+f_100_101_000_110_0(Set<String> u, int b) => v(u, '1001010001100', b);
+
+@pragma('dart2js:noInline')
+f_100_101_001_010_0(Set<String> u, int b) => v(u, '1001010010100', b);
+
+@pragma('dart2js:noInline')
+f_100_101_001_110_0(Set<String> u, int b) => v(u, '1001010011100', b);
+
+@pragma('dart2js:noInline')
+f_100_101_010_010_0(Set<String> u, int b) => v(u, '1001010100100', b);
+
+@pragma('dart2js:noInline')
+f_100_101_010_110_0(Set<String> u, int b) => v(u, '1001010101100', b);
+
+@pragma('dart2js:noInline')
+f_100_101_011_010_0(Set<String> u, int b) => v(u, '1001010110100', b);
+
+@pragma('dart2js:noInline')
+f_100_101_011_110_0(Set<String> u, int b) => v(u, '1001010111100', b);
+
+@pragma('dart2js:noInline')
+f_100_101_100_010_0(Set<String> u, int b) => v(u, '1001011000100', b);
+
+@pragma('dart2js:noInline')
+f_100_101_100_110_0(Set<String> u, int b) => v(u, '1001011001100', b);
+
+@pragma('dart2js:noInline')
+f_100_101_101_010_0(Set<String> u, int b) => v(u, '1001011010100', b);
+
+@pragma('dart2js:noInline')
+f_100_101_101_110_0(Set<String> u, int b) => v(u, '1001011011100', b);
+
+@pragma('dart2js:noInline')
+f_100_101_110_010_0(Set<String> u, int b) => v(u, '1001011100100', b);
+
+@pragma('dart2js:noInline')
+f_100_101_110_110_0(Set<String> u, int b) => v(u, '1001011101100', b);
+
+@pragma('dart2js:noInline')
+f_100_101_111_010_0(Set<String> u, int b) => v(u, '1001011110100', b);
+
+@pragma('dart2js:noInline')
+f_100_101_111_110_0(Set<String> u, int b) => v(u, '1001011111100', b);
+
+@pragma('dart2js:noInline')
+f_100_110_000_010_0(Set<String> u, int b) => v(u, '1001100000100', b);
+
+@pragma('dart2js:noInline')
+f_100_110_000_110_0(Set<String> u, int b) => v(u, '1001100001100', b);
+
+@pragma('dart2js:noInline')
+f_100_110_001_010_0(Set<String> u, int b) => v(u, '1001100010100', b);
+
+@pragma('dart2js:noInline')
+f_100_110_001_110_0(Set<String> u, int b) => v(u, '1001100011100', b);
+
+@pragma('dart2js:noInline')
+f_100_110_010_010_0(Set<String> u, int b) => v(u, '1001100100100', b);
+
+@pragma('dart2js:noInline')
+f_100_110_010_110_0(Set<String> u, int b) => v(u, '1001100101100', b);
+
+@pragma('dart2js:noInline')
+f_100_110_011_010_0(Set<String> u, int b) => v(u, '1001100110100', b);
+
+@pragma('dart2js:noInline')
+f_100_110_011_110_0(Set<String> u, int b) => v(u, '1001100111100', b);
+
+@pragma('dart2js:noInline')
+f_100_110_100_010_0(Set<String> u, int b) => v(u, '1001101000100', b);
+
+@pragma('dart2js:noInline')
+f_100_110_100_110_0(Set<String> u, int b) => v(u, '1001101001100', b);
+
+@pragma('dart2js:noInline')
+f_100_110_101_010_0(Set<String> u, int b) => v(u, '1001101010100', b);
+
+@pragma('dart2js:noInline')
+f_100_110_101_110_0(Set<String> u, int b) => v(u, '1001101011100', b);
+
+@pragma('dart2js:noInline')
+f_100_110_110_010_0(Set<String> u, int b) => v(u, '1001101100100', b);
+
+@pragma('dart2js:noInline')
+f_100_110_110_110_0(Set<String> u, int b) => v(u, '1001101101100', b);
+
+@pragma('dart2js:noInline')
+f_100_110_111_010_0(Set<String> u, int b) => v(u, '1001101110100', b);
+
+@pragma('dart2js:noInline')
+f_100_110_111_110_0(Set<String> u, int b) => v(u, '1001101111100', b);
+
+@pragma('dart2js:noInline')
+f_100_111_000_010_0(Set<String> u, int b) => v(u, '1001110000100', b);
+
+@pragma('dart2js:noInline')
+f_100_111_000_110_0(Set<String> u, int b) => v(u, '1001110001100', b);
+
+@pragma('dart2js:noInline')
+f_100_111_001_010_0(Set<String> u, int b) => v(u, '1001110010100', b);
+
+@pragma('dart2js:noInline')
+f_100_111_001_110_0(Set<String> u, int b) => v(u, '1001110011100', b);
+
+@pragma('dart2js:noInline')
+f_100_111_010_010_0(Set<String> u, int b) => v(u, '1001110100100', b);
+
+@pragma('dart2js:noInline')
+f_100_111_010_110_0(Set<String> u, int b) => v(u, '1001110101100', b);
+
+@pragma('dart2js:noInline')
+f_100_111_011_010_0(Set<String> u, int b) => v(u, '1001110110100', b);
+
+@pragma('dart2js:noInline')
+f_100_111_011_110_0(Set<String> u, int b) => v(u, '1001110111100', b);
+
+@pragma('dart2js:noInline')
+f_100_111_100_010_0(Set<String> u, int b) => v(u, '1001111000100', b);
+
+@pragma('dart2js:noInline')
+f_100_111_100_110_0(Set<String> u, int b) => v(u, '1001111001100', b);
+
+@pragma('dart2js:noInline')
+f_100_111_101_010_0(Set<String> u, int b) => v(u, '1001111010100', b);
+
+@pragma('dart2js:noInline')
+f_100_111_101_110_0(Set<String> u, int b) => v(u, '1001111011100', b);
+
+@pragma('dart2js:noInline')
+f_100_111_110_010_0(Set<String> u, int b) => v(u, '1001111100100', b);
+
+@pragma('dart2js:noInline')
+f_100_111_110_110_0(Set<String> u, int b) => v(u, '1001111101100', b);
+
+@pragma('dart2js:noInline')
+f_100_111_111_010_0(Set<String> u, int b) => v(u, '1001111110100', b);
+
+@pragma('dart2js:noInline')
+f_100_111_111_110_0(Set<String> u, int b) => v(u, '1001111111100', b);
+
+@pragma('dart2js:noInline')
+f_101_000_000_010_0(Set<String> u, int b) => v(u, '1010000000100', b);
+
+@pragma('dart2js:noInline')
+f_101_000_000_110_0(Set<String> u, int b) => v(u, '1010000001100', b);
+
+@pragma('dart2js:noInline')
+f_101_000_001_010_0(Set<String> u, int b) => v(u, '1010000010100', b);
+
+@pragma('dart2js:noInline')
+f_101_000_001_110_0(Set<String> u, int b) => v(u, '1010000011100', b);
+
+@pragma('dart2js:noInline')
+f_101_000_010_010_0(Set<String> u, int b) => v(u, '1010000100100', b);
+
+@pragma('dart2js:noInline')
+f_101_000_010_110_0(Set<String> u, int b) => v(u, '1010000101100', b);
+
+@pragma('dart2js:noInline')
+f_101_000_011_010_0(Set<String> u, int b) => v(u, '1010000110100', b);
+
+@pragma('dart2js:noInline')
+f_101_000_011_110_0(Set<String> u, int b) => v(u, '1010000111100', b);
+
+@pragma('dart2js:noInline')
+f_101_000_100_010_0(Set<String> u, int b) => v(u, '1010001000100', b);
+
+@pragma('dart2js:noInline')
+f_101_000_100_110_0(Set<String> u, int b) => v(u, '1010001001100', b);
+
+@pragma('dart2js:noInline')
+f_101_000_101_010_0(Set<String> u, int b) => v(u, '1010001010100', b);
+
+@pragma('dart2js:noInline')
+f_101_000_101_110_0(Set<String> u, int b) => v(u, '1010001011100', b);
+
+@pragma('dart2js:noInline')
+f_101_000_110_010_0(Set<String> u, int b) => v(u, '1010001100100', b);
+
+@pragma('dart2js:noInline')
+f_101_000_110_110_0(Set<String> u, int b) => v(u, '1010001101100', b);
+
+@pragma('dart2js:noInline')
+f_101_000_111_010_0(Set<String> u, int b) => v(u, '1010001110100', b);
+
+@pragma('dart2js:noInline')
+f_101_000_111_110_0(Set<String> u, int b) => v(u, '1010001111100', b);
+
+@pragma('dart2js:noInline')
+f_101_001_000_010_0(Set<String> u, int b) => v(u, '1010010000100', b);
+
+@pragma('dart2js:noInline')
+f_101_001_000_110_0(Set<String> u, int b) => v(u, '1010010001100', b);
+
+@pragma('dart2js:noInline')
+f_101_001_001_010_0(Set<String> u, int b) => v(u, '1010010010100', b);
+
+@pragma('dart2js:noInline')
+f_101_001_001_110_0(Set<String> u, int b) => v(u, '1010010011100', b);
+
+@pragma('dart2js:noInline')
+f_101_001_010_010_0(Set<String> u, int b) => v(u, '1010010100100', b);
+
+@pragma('dart2js:noInline')
+f_101_001_010_110_0(Set<String> u, int b) => v(u, '1010010101100', b);
+
+@pragma('dart2js:noInline')
+f_101_001_011_010_0(Set<String> u, int b) => v(u, '1010010110100', b);
+
+@pragma('dart2js:noInline')
+f_101_001_011_110_0(Set<String> u, int b) => v(u, '1010010111100', b);
+
+@pragma('dart2js:noInline')
+f_101_001_100_010_0(Set<String> u, int b) => v(u, '1010011000100', b);
+
+@pragma('dart2js:noInline')
+f_101_001_100_110_0(Set<String> u, int b) => v(u, '1010011001100', b);
+
+@pragma('dart2js:noInline')
+f_101_001_101_010_0(Set<String> u, int b) => v(u, '1010011010100', b);
+
+@pragma('dart2js:noInline')
+f_101_001_101_110_0(Set<String> u, int b) => v(u, '1010011011100', b);
+
+@pragma('dart2js:noInline')
+f_101_001_110_010_0(Set<String> u, int b) => v(u, '1010011100100', b);
+
+@pragma('dart2js:noInline')
+f_101_001_110_110_0(Set<String> u, int b) => v(u, '1010011101100', b);
+
+@pragma('dart2js:noInline')
+f_101_001_111_010_0(Set<String> u, int b) => v(u, '1010011110100', b);
+
+@pragma('dart2js:noInline')
+f_101_001_111_110_0(Set<String> u, int b) => v(u, '1010011111100', b);
+
+@pragma('dart2js:noInline')
+f_101_010_000_010_0(Set<String> u, int b) => v(u, '1010100000100', b);
+
+@pragma('dart2js:noInline')
+f_101_010_000_110_0(Set<String> u, int b) => v(u, '1010100001100', b);
+
+@pragma('dart2js:noInline')
+f_101_010_001_010_0(Set<String> u, int b) => v(u, '1010100010100', b);
+
+@pragma('dart2js:noInline')
+f_101_010_001_110_0(Set<String> u, int b) => v(u, '1010100011100', b);
+
+@pragma('dart2js:noInline')
+f_101_010_010_010_0(Set<String> u, int b) => v(u, '1010100100100', b);
+
+@pragma('dart2js:noInline')
+f_101_010_010_110_0(Set<String> u, int b) => v(u, '1010100101100', b);
+
+@pragma('dart2js:noInline')
+f_101_010_011_010_0(Set<String> u, int b) => v(u, '1010100110100', b);
+
+@pragma('dart2js:noInline')
+f_101_010_011_110_0(Set<String> u, int b) => v(u, '1010100111100', b);
+
+@pragma('dart2js:noInline')
+f_101_010_100_010_0(Set<String> u, int b) => v(u, '1010101000100', b);
+
+@pragma('dart2js:noInline')
+f_101_010_100_110_0(Set<String> u, int b) => v(u, '1010101001100', b);
+
+@pragma('dart2js:noInline')
+f_101_010_101_010_0(Set<String> u, int b) => v(u, '1010101010100', b);
+
+@pragma('dart2js:noInline')
+f_101_010_101_110_0(Set<String> u, int b) => v(u, '1010101011100', b);
+
+@pragma('dart2js:noInline')
+f_101_010_110_010_0(Set<String> u, int b) => v(u, '1010101100100', b);
+
+@pragma('dart2js:noInline')
+f_101_010_110_110_0(Set<String> u, int b) => v(u, '1010101101100', b);
+
+@pragma('dart2js:noInline')
+f_101_010_111_010_0(Set<String> u, int b) => v(u, '1010101110100', b);
+
+@pragma('dart2js:noInline')
+f_101_010_111_110_0(Set<String> u, int b) => v(u, '1010101111100', b);
+
+@pragma('dart2js:noInline')
+f_101_011_000_010_0(Set<String> u, int b) => v(u, '1010110000100', b);
+
+@pragma('dart2js:noInline')
+f_101_011_000_110_0(Set<String> u, int b) => v(u, '1010110001100', b);
+
+@pragma('dart2js:noInline')
+f_101_011_001_010_0(Set<String> u, int b) => v(u, '1010110010100', b);
+
+@pragma('dart2js:noInline')
+f_101_011_001_110_0(Set<String> u, int b) => v(u, '1010110011100', b);
+
+@pragma('dart2js:noInline')
+f_101_011_010_010_0(Set<String> u, int b) => v(u, '1010110100100', b);
+
+@pragma('dart2js:noInline')
+f_101_011_010_110_0(Set<String> u, int b) => v(u, '1010110101100', b);
+
+@pragma('dart2js:noInline')
+f_101_011_011_010_0(Set<String> u, int b) => v(u, '1010110110100', b);
+
+@pragma('dart2js:noInline')
+f_101_011_011_110_0(Set<String> u, int b) => v(u, '1010110111100', b);
+
+@pragma('dart2js:noInline')
+f_101_011_100_010_0(Set<String> u, int b) => v(u, '1010111000100', b);
+
+@pragma('dart2js:noInline')
+f_101_011_100_110_0(Set<String> u, int b) => v(u, '1010111001100', b);
+
+@pragma('dart2js:noInline')
+f_101_011_101_010_0(Set<String> u, int b) => v(u, '1010111010100', b);
+
+@pragma('dart2js:noInline')
+f_101_011_101_110_0(Set<String> u, int b) => v(u, '1010111011100', b);
+
+@pragma('dart2js:noInline')
+f_101_011_110_010_0(Set<String> u, int b) => v(u, '1010111100100', b);
+
+@pragma('dart2js:noInline')
+f_101_011_110_110_0(Set<String> u, int b) => v(u, '1010111101100', b);
+
+@pragma('dart2js:noInline')
+f_101_011_111_010_0(Set<String> u, int b) => v(u, '1010111110100', b);
+
+@pragma('dart2js:noInline')
+f_101_011_111_110_0(Set<String> u, int b) => v(u, '1010111111100', b);
+
+@pragma('dart2js:noInline')
+f_101_100_000_010_0(Set<String> u, int b) => v(u, '1011000000100', b);
+
+@pragma('dart2js:noInline')
+f_101_100_000_110_0(Set<String> u, int b) => v(u, '1011000001100', b);
+
+@pragma('dart2js:noInline')
+f_101_100_001_010_0(Set<String> u, int b) => v(u, '1011000010100', b);
+
+@pragma('dart2js:noInline')
+f_101_100_001_110_0(Set<String> u, int b) => v(u, '1011000011100', b);
+
+@pragma('dart2js:noInline')
+f_101_100_010_010_0(Set<String> u, int b) => v(u, '1011000100100', b);
+
+@pragma('dart2js:noInline')
+f_101_100_010_110_0(Set<String> u, int b) => v(u, '1011000101100', b);
+
+@pragma('dart2js:noInline')
+f_101_100_011_010_0(Set<String> u, int b) => v(u, '1011000110100', b);
+
+@pragma('dart2js:noInline')
+f_101_100_011_110_0(Set<String> u, int b) => v(u, '1011000111100', b);
+
+@pragma('dart2js:noInline')
+f_101_100_100_010_0(Set<String> u, int b) => v(u, '1011001000100', b);
+
+@pragma('dart2js:noInline')
+f_101_100_100_110_0(Set<String> u, int b) => v(u, '1011001001100', b);
+
+@pragma('dart2js:noInline')
+f_101_100_101_010_0(Set<String> u, int b) => v(u, '1011001010100', b);
+
+@pragma('dart2js:noInline')
+f_101_100_101_110_0(Set<String> u, int b) => v(u, '1011001011100', b);
+
+@pragma('dart2js:noInline')
+f_101_100_110_010_0(Set<String> u, int b) => v(u, '1011001100100', b);
+
+@pragma('dart2js:noInline')
+f_101_100_110_110_0(Set<String> u, int b) => v(u, '1011001101100', b);
+
+@pragma('dart2js:noInline')
+f_101_100_111_010_0(Set<String> u, int b) => v(u, '1011001110100', b);
+
+@pragma('dart2js:noInline')
+f_101_100_111_110_0(Set<String> u, int b) => v(u, '1011001111100', b);
+
+@pragma('dart2js:noInline')
+f_101_101_000_010_0(Set<String> u, int b) => v(u, '1011010000100', b);
+
+@pragma('dart2js:noInline')
+f_101_101_000_110_0(Set<String> u, int b) => v(u, '1011010001100', b);
+
+@pragma('dart2js:noInline')
+f_101_101_001_010_0(Set<String> u, int b) => v(u, '1011010010100', b);
+
+@pragma('dart2js:noInline')
+f_101_101_001_110_0(Set<String> u, int b) => v(u, '1011010011100', b);
+
+@pragma('dart2js:noInline')
+f_101_101_010_010_0(Set<String> u, int b) => v(u, '1011010100100', b);
+
+@pragma('dart2js:noInline')
+f_101_101_010_110_0(Set<String> u, int b) => v(u, '1011010101100', b);
+
+@pragma('dart2js:noInline')
+f_101_101_011_010_0(Set<String> u, int b) => v(u, '1011010110100', b);
+
+@pragma('dart2js:noInline')
+f_101_101_011_110_0(Set<String> u, int b) => v(u, '1011010111100', b);
+
+@pragma('dart2js:noInline')
+f_101_101_100_010_0(Set<String> u, int b) => v(u, '1011011000100', b);
+
+@pragma('dart2js:noInline')
+f_101_101_100_110_0(Set<String> u, int b) => v(u, '1011011001100', b);
+
+@pragma('dart2js:noInline')
+f_101_101_101_010_0(Set<String> u, int b) => v(u, '1011011010100', b);
+
+@pragma('dart2js:noInline')
+f_101_101_101_110_0(Set<String> u, int b) => v(u, '1011011011100', b);
+
+@pragma('dart2js:noInline')
+f_101_101_110_010_0(Set<String> u, int b) => v(u, '1011011100100', b);
+
+@pragma('dart2js:noInline')
+f_101_101_110_110_0(Set<String> u, int b) => v(u, '1011011101100', b);
+
+@pragma('dart2js:noInline')
+f_101_101_111_010_0(Set<String> u, int b) => v(u, '1011011110100', b);
+
+@pragma('dart2js:noInline')
+f_101_101_111_110_0(Set<String> u, int b) => v(u, '1011011111100', b);
+
+@pragma('dart2js:noInline')
+f_101_110_000_010_0(Set<String> u, int b) => v(u, '1011100000100', b);
+
+@pragma('dart2js:noInline')
+f_101_110_000_110_0(Set<String> u, int b) => v(u, '1011100001100', b);
+
+@pragma('dart2js:noInline')
+f_101_110_001_010_0(Set<String> u, int b) => v(u, '1011100010100', b);
+
+@pragma('dart2js:noInline')
+f_101_110_001_110_0(Set<String> u, int b) => v(u, '1011100011100', b);
+
+@pragma('dart2js:noInline')
+f_101_110_010_010_0(Set<String> u, int b) => v(u, '1011100100100', b);
+
+@pragma('dart2js:noInline')
+f_101_110_010_110_0(Set<String> u, int b) => v(u, '1011100101100', b);
+
+@pragma('dart2js:noInline')
+f_101_110_011_010_0(Set<String> u, int b) => v(u, '1011100110100', b);
+
+@pragma('dart2js:noInline')
+f_101_110_011_110_0(Set<String> u, int b) => v(u, '1011100111100', b);
+
+@pragma('dart2js:noInline')
+f_101_110_100_010_0(Set<String> u, int b) => v(u, '1011101000100', b);
+
+@pragma('dart2js:noInline')
+f_101_110_100_110_0(Set<String> u, int b) => v(u, '1011101001100', b);
+
+@pragma('dart2js:noInline')
+f_101_110_101_010_0(Set<String> u, int b) => v(u, '1011101010100', b);
+
+@pragma('dart2js:noInline')
+f_101_110_101_110_0(Set<String> u, int b) => v(u, '1011101011100', b);
+
+@pragma('dart2js:noInline')
+f_101_110_110_010_0(Set<String> u, int b) => v(u, '1011101100100', b);
+
+@pragma('dart2js:noInline')
+f_101_110_110_110_0(Set<String> u, int b) => v(u, '1011101101100', b);
+
+@pragma('dart2js:noInline')
+f_101_110_111_010_0(Set<String> u, int b) => v(u, '1011101110100', b);
+
+@pragma('dart2js:noInline')
+f_101_110_111_110_0(Set<String> u, int b) => v(u, '1011101111100', b);
+
+@pragma('dart2js:noInline')
+f_101_111_000_010_0(Set<String> u, int b) => v(u, '1011110000100', b);
+
+@pragma('dart2js:noInline')
+f_101_111_000_110_0(Set<String> u, int b) => v(u, '1011110001100', b);
+
+@pragma('dart2js:noInline')
+f_101_111_001_010_0(Set<String> u, int b) => v(u, '1011110010100', b);
+
+@pragma('dart2js:noInline')
+f_101_111_001_110_0(Set<String> u, int b) => v(u, '1011110011100', b);
+
+@pragma('dart2js:noInline')
+f_101_111_010_010_0(Set<String> u, int b) => v(u, '1011110100100', b);
+
+@pragma('dart2js:noInline')
+f_101_111_010_110_0(Set<String> u, int b) => v(u, '1011110101100', b);
+
+@pragma('dart2js:noInline')
+f_101_111_011_010_0(Set<String> u, int b) => v(u, '1011110110100', b);
+
+@pragma('dart2js:noInline')
+f_101_111_011_110_0(Set<String> u, int b) => v(u, '1011110111100', b);
+
+@pragma('dart2js:noInline')
+f_101_111_100_010_0(Set<String> u, int b) => v(u, '1011111000100', b);
+
+@pragma('dart2js:noInline')
+f_101_111_100_110_0(Set<String> u, int b) => v(u, '1011111001100', b);
+
+@pragma('dart2js:noInline')
+f_101_111_101_010_0(Set<String> u, int b) => v(u, '1011111010100', b);
+
+@pragma('dart2js:noInline')
+f_101_111_101_110_0(Set<String> u, int b) => v(u, '1011111011100', b);
+
+@pragma('dart2js:noInline')
+f_101_111_110_010_0(Set<String> u, int b) => v(u, '1011111100100', b);
+
+@pragma('dart2js:noInline')
+f_101_111_110_110_0(Set<String> u, int b) => v(u, '1011111101100', b);
+
+@pragma('dart2js:noInline')
+f_101_111_111_010_0(Set<String> u, int b) => v(u, '1011111110100', b);
+
+@pragma('dart2js:noInline')
+f_101_111_111_110_0(Set<String> u, int b) => v(u, '1011111111100', b);
+
+@pragma('dart2js:noInline')
+f_110_000_000_010_0(Set<String> u, int b) => v(u, '1100000000100', b);
+
+@pragma('dart2js:noInline')
+f_110_000_000_110_0(Set<String> u, int b) => v(u, '1100000001100', b);
+
+@pragma('dart2js:noInline')
+f_110_000_001_010_0(Set<String> u, int b) => v(u, '1100000010100', b);
+
+@pragma('dart2js:noInline')
+f_110_000_001_110_0(Set<String> u, int b) => v(u, '1100000011100', b);
+
+@pragma('dart2js:noInline')
+f_110_000_010_010_0(Set<String> u, int b) => v(u, '1100000100100', b);
+
+@pragma('dart2js:noInline')
+f_110_000_010_110_0(Set<String> u, int b) => v(u, '1100000101100', b);
+
+@pragma('dart2js:noInline')
+f_110_000_011_010_0(Set<String> u, int b) => v(u, '1100000110100', b);
+
+@pragma('dart2js:noInline')
+f_110_000_011_110_0(Set<String> u, int b) => v(u, '1100000111100', b);
+
+@pragma('dart2js:noInline')
+f_110_000_100_010_0(Set<String> u, int b) => v(u, '1100001000100', b);
+
+@pragma('dart2js:noInline')
+f_110_000_100_110_0(Set<String> u, int b) => v(u, '1100001001100', b);
+
+@pragma('dart2js:noInline')
+f_110_000_101_010_0(Set<String> u, int b) => v(u, '1100001010100', b);
+
+@pragma('dart2js:noInline')
+f_110_000_101_110_0(Set<String> u, int b) => v(u, '1100001011100', b);
+
+@pragma('dart2js:noInline')
+f_110_000_110_010_0(Set<String> u, int b) => v(u, '1100001100100', b);
+
+@pragma('dart2js:noInline')
+f_110_000_110_110_0(Set<String> u, int b) => v(u, '1100001101100', b);
+
+@pragma('dart2js:noInline')
+f_110_000_111_010_0(Set<String> u, int b) => v(u, '1100001110100', b);
+
+@pragma('dart2js:noInline')
+f_110_000_111_110_0(Set<String> u, int b) => v(u, '1100001111100', b);
+
+@pragma('dart2js:noInline')
+f_110_001_000_010_0(Set<String> u, int b) => v(u, '1100010000100', b);
+
+@pragma('dart2js:noInline')
+f_110_001_000_110_0(Set<String> u, int b) => v(u, '1100010001100', b);
+
+@pragma('dart2js:noInline')
+f_110_001_001_010_0(Set<String> u, int b) => v(u, '1100010010100', b);
+
+@pragma('dart2js:noInline')
+f_110_001_001_110_0(Set<String> u, int b) => v(u, '1100010011100', b);
+
+@pragma('dart2js:noInline')
+f_110_001_010_010_0(Set<String> u, int b) => v(u, '1100010100100', b);
+
+@pragma('dart2js:noInline')
+f_110_001_010_110_0(Set<String> u, int b) => v(u, '1100010101100', b);
+
+@pragma('dart2js:noInline')
+f_110_001_011_010_0(Set<String> u, int b) => v(u, '1100010110100', b);
+
+@pragma('dart2js:noInline')
+f_110_001_011_110_0(Set<String> u, int b) => v(u, '1100010111100', b);
+
+@pragma('dart2js:noInline')
+f_110_001_100_010_0(Set<String> u, int b) => v(u, '1100011000100', b);
+
+@pragma('dart2js:noInline')
+f_110_001_100_110_0(Set<String> u, int b) => v(u, '1100011001100', b);
+
+@pragma('dart2js:noInline')
+f_110_001_101_010_0(Set<String> u, int b) => v(u, '1100011010100', b);
+
+@pragma('dart2js:noInline')
+f_110_001_101_110_0(Set<String> u, int b) => v(u, '1100011011100', b);
+
+@pragma('dart2js:noInline')
+f_110_001_110_010_0(Set<String> u, int b) => v(u, '1100011100100', b);
+
+@pragma('dart2js:noInline')
+f_110_001_110_110_0(Set<String> u, int b) => v(u, '1100011101100', b);
+
+@pragma('dart2js:noInline')
+f_110_001_111_010_0(Set<String> u, int b) => v(u, '1100011110100', b);
+
+@pragma('dart2js:noInline')
+f_110_001_111_110_0(Set<String> u, int b) => v(u, '1100011111100', b);
+
+@pragma('dart2js:noInline')
+f_110_010_000_010_0(Set<String> u, int b) => v(u, '1100100000100', b);
+
+@pragma('dart2js:noInline')
+f_110_010_000_110_0(Set<String> u, int b) => v(u, '1100100001100', b);
+
+@pragma('dart2js:noInline')
+f_110_010_001_010_0(Set<String> u, int b) => v(u, '1100100010100', b);
+
+@pragma('dart2js:noInline')
+f_110_010_001_110_0(Set<String> u, int b) => v(u, '1100100011100', b);
+
+@pragma('dart2js:noInline')
+f_110_010_010_010_0(Set<String> u, int b) => v(u, '1100100100100', b);
+
+@pragma('dart2js:noInline')
+f_110_010_010_110_0(Set<String> u, int b) => v(u, '1100100101100', b);
+
+@pragma('dart2js:noInline')
+f_110_010_011_010_0(Set<String> u, int b) => v(u, '1100100110100', b);
+
+@pragma('dart2js:noInline')
+f_110_010_011_110_0(Set<String> u, int b) => v(u, '1100100111100', b);
+
+@pragma('dart2js:noInline')
+f_110_010_100_010_0(Set<String> u, int b) => v(u, '1100101000100', b);
+
+@pragma('dart2js:noInline')
+f_110_010_100_110_0(Set<String> u, int b) => v(u, '1100101001100', b);
+
+@pragma('dart2js:noInline')
+f_110_010_101_010_0(Set<String> u, int b) => v(u, '1100101010100', b);
+
+@pragma('dart2js:noInline')
+f_110_010_101_110_0(Set<String> u, int b) => v(u, '1100101011100', b);
+
+@pragma('dart2js:noInline')
+f_110_010_110_010_0(Set<String> u, int b) => v(u, '1100101100100', b);
+
+@pragma('dart2js:noInline')
+f_110_010_110_110_0(Set<String> u, int b) => v(u, '1100101101100', b);
+
+@pragma('dart2js:noInline')
+f_110_010_111_010_0(Set<String> u, int b) => v(u, '1100101110100', b);
+
+@pragma('dart2js:noInline')
+f_110_010_111_110_0(Set<String> u, int b) => v(u, '1100101111100', b);
+
+@pragma('dart2js:noInline')
+f_110_011_000_010_0(Set<String> u, int b) => v(u, '1100110000100', b);
+
+@pragma('dart2js:noInline')
+f_110_011_000_110_0(Set<String> u, int b) => v(u, '1100110001100', b);
+
+@pragma('dart2js:noInline')
+f_110_011_001_010_0(Set<String> u, int b) => v(u, '1100110010100', b);
+
+@pragma('dart2js:noInline')
+f_110_011_001_110_0(Set<String> u, int b) => v(u, '1100110011100', b);
+
+@pragma('dart2js:noInline')
+f_110_011_010_010_0(Set<String> u, int b) => v(u, '1100110100100', b);
+
+@pragma('dart2js:noInline')
+f_110_011_010_110_0(Set<String> u, int b) => v(u, '1100110101100', b);
+
+@pragma('dart2js:noInline')
+f_110_011_011_010_0(Set<String> u, int b) => v(u, '1100110110100', b);
+
+@pragma('dart2js:noInline')
+f_110_011_011_110_0(Set<String> u, int b) => v(u, '1100110111100', b);
+
+@pragma('dart2js:noInline')
+f_110_011_100_010_0(Set<String> u, int b) => v(u, '1100111000100', b);
+
+@pragma('dart2js:noInline')
+f_110_011_100_110_0(Set<String> u, int b) => v(u, '1100111001100', b);
+
+@pragma('dart2js:noInline')
+f_110_011_101_010_0(Set<String> u, int b) => v(u, '1100111010100', b);
+
+@pragma('dart2js:noInline')
+f_110_011_101_110_0(Set<String> u, int b) => v(u, '1100111011100', b);
+
+@pragma('dart2js:noInline')
+f_110_011_110_010_0(Set<String> u, int b) => v(u, '1100111100100', b);
+
+@pragma('dart2js:noInline')
+f_110_011_110_110_0(Set<String> u, int b) => v(u, '1100111101100', b);
+
+@pragma('dart2js:noInline')
+f_110_011_111_010_0(Set<String> u, int b) => v(u, '1100111110100', b);
+
+@pragma('dart2js:noInline')
+f_110_011_111_110_0(Set<String> u, int b) => v(u, '1100111111100', b);
+
+@pragma('dart2js:noInline')
+f_110_100_000_010_0(Set<String> u, int b) => v(u, '1101000000100', b);
+
+@pragma('dart2js:noInline')
+f_110_100_000_110_0(Set<String> u, int b) => v(u, '1101000001100', b);
+
+@pragma('dart2js:noInline')
+f_110_100_001_010_0(Set<String> u, int b) => v(u, '1101000010100', b);
+
+@pragma('dart2js:noInline')
+f_110_100_001_110_0(Set<String> u, int b) => v(u, '1101000011100', b);
+
+@pragma('dart2js:noInline')
+f_110_100_010_010_0(Set<String> u, int b) => v(u, '1101000100100', b);
+
+@pragma('dart2js:noInline')
+f_110_100_010_110_0(Set<String> u, int b) => v(u, '1101000101100', b);
+
+@pragma('dart2js:noInline')
+f_110_100_011_010_0(Set<String> u, int b) => v(u, '1101000110100', b);
+
+@pragma('dart2js:noInline')
+f_110_100_011_110_0(Set<String> u, int b) => v(u, '1101000111100', b);
+
+@pragma('dart2js:noInline')
+f_110_100_100_010_0(Set<String> u, int b) => v(u, '1101001000100', b);
+
+@pragma('dart2js:noInline')
+f_110_100_100_110_0(Set<String> u, int b) => v(u, '1101001001100', b);
+
+@pragma('dart2js:noInline')
+f_110_100_101_010_0(Set<String> u, int b) => v(u, '1101001010100', b);
+
+@pragma('dart2js:noInline')
+f_110_100_101_110_0(Set<String> u, int b) => v(u, '1101001011100', b);
+
+@pragma('dart2js:noInline')
+f_110_100_110_010_0(Set<String> u, int b) => v(u, '1101001100100', b);
+
+@pragma('dart2js:noInline')
+f_110_100_110_110_0(Set<String> u, int b) => v(u, '1101001101100', b);
+
+@pragma('dart2js:noInline')
+f_110_100_111_010_0(Set<String> u, int b) => v(u, '1101001110100', b);
+
+@pragma('dart2js:noInline')
+f_110_100_111_110_0(Set<String> u, int b) => v(u, '1101001111100', b);
+
+@pragma('dart2js:noInline')
+f_110_101_000_010_0(Set<String> u, int b) => v(u, '1101010000100', b);
+
+@pragma('dart2js:noInline')
+f_110_101_000_110_0(Set<String> u, int b) => v(u, '1101010001100', b);
+
+@pragma('dart2js:noInline')
+f_110_101_001_010_0(Set<String> u, int b) => v(u, '1101010010100', b);
+
+@pragma('dart2js:noInline')
+f_110_101_001_110_0(Set<String> u, int b) => v(u, '1101010011100', b);
+
+@pragma('dart2js:noInline')
+f_110_101_010_010_0(Set<String> u, int b) => v(u, '1101010100100', b);
+
+@pragma('dart2js:noInline')
+f_110_101_010_110_0(Set<String> u, int b) => v(u, '1101010101100', b);
+
+@pragma('dart2js:noInline')
+f_110_101_011_010_0(Set<String> u, int b) => v(u, '1101010110100', b);
+
+@pragma('dart2js:noInline')
+f_110_101_011_110_0(Set<String> u, int b) => v(u, '1101010111100', b);
+
+@pragma('dart2js:noInline')
+f_110_101_100_010_0(Set<String> u, int b) => v(u, '1101011000100', b);
+
+@pragma('dart2js:noInline')
+f_110_101_100_110_0(Set<String> u, int b) => v(u, '1101011001100', b);
+
+@pragma('dart2js:noInline')
+f_110_101_101_010_0(Set<String> u, int b) => v(u, '1101011010100', b);
+
+@pragma('dart2js:noInline')
+f_110_101_101_110_0(Set<String> u, int b) => v(u, '1101011011100', b);
+
+@pragma('dart2js:noInline')
+f_110_101_110_010_0(Set<String> u, int b) => v(u, '1101011100100', b);
+
+@pragma('dart2js:noInline')
+f_110_101_110_110_0(Set<String> u, int b) => v(u, '1101011101100', b);
+
+@pragma('dart2js:noInline')
+f_110_101_111_010_0(Set<String> u, int b) => v(u, '1101011110100', b);
+
+@pragma('dart2js:noInline')
+f_110_101_111_110_0(Set<String> u, int b) => v(u, '1101011111100', b);
+
+@pragma('dart2js:noInline')
+f_110_110_000_010_0(Set<String> u, int b) => v(u, '1101100000100', b);
+
+@pragma('dart2js:noInline')
+f_110_110_000_110_0(Set<String> u, int b) => v(u, '1101100001100', b);
+
+@pragma('dart2js:noInline')
+f_110_110_001_010_0(Set<String> u, int b) => v(u, '1101100010100', b);
+
+@pragma('dart2js:noInline')
+f_110_110_001_110_0(Set<String> u, int b) => v(u, '1101100011100', b);
+
+@pragma('dart2js:noInline')
+f_110_110_010_010_0(Set<String> u, int b) => v(u, '1101100100100', b);
+
+@pragma('dart2js:noInline')
+f_110_110_010_110_0(Set<String> u, int b) => v(u, '1101100101100', b);
+
+@pragma('dart2js:noInline')
+f_110_110_011_010_0(Set<String> u, int b) => v(u, '1101100110100', b);
+
+@pragma('dart2js:noInline')
+f_110_110_011_110_0(Set<String> u, int b) => v(u, '1101100111100', b);
+
+@pragma('dart2js:noInline')
+f_110_110_100_010_0(Set<String> u, int b) => v(u, '1101101000100', b);
+
+@pragma('dart2js:noInline')
+f_110_110_100_110_0(Set<String> u, int b) => v(u, '1101101001100', b);
+
+@pragma('dart2js:noInline')
+f_110_110_101_010_0(Set<String> u, int b) => v(u, '1101101010100', b);
+
+@pragma('dart2js:noInline')
+f_110_110_101_110_0(Set<String> u, int b) => v(u, '1101101011100', b);
+
+@pragma('dart2js:noInline')
+f_110_110_110_010_0(Set<String> u, int b) => v(u, '1101101100100', b);
+
+@pragma('dart2js:noInline')
+f_110_110_110_110_0(Set<String> u, int b) => v(u, '1101101101100', b);
+
+@pragma('dart2js:noInline')
+f_110_110_111_010_0(Set<String> u, int b) => v(u, '1101101110100', b);
+
+@pragma('dart2js:noInline')
+f_110_110_111_110_0(Set<String> u, int b) => v(u, '1101101111100', b);
+
+@pragma('dart2js:noInline')
+f_110_111_000_010_0(Set<String> u, int b) => v(u, '1101110000100', b);
+
+@pragma('dart2js:noInline')
+f_110_111_000_110_0(Set<String> u, int b) => v(u, '1101110001100', b);
+
+@pragma('dart2js:noInline')
+f_110_111_001_010_0(Set<String> u, int b) => v(u, '1101110010100', b);
+
+@pragma('dart2js:noInline')
+f_110_111_001_110_0(Set<String> u, int b) => v(u, '1101110011100', b);
+
+@pragma('dart2js:noInline')
+f_110_111_010_010_0(Set<String> u, int b) => v(u, '1101110100100', b);
+
+@pragma('dart2js:noInline')
+f_110_111_010_110_0(Set<String> u, int b) => v(u, '1101110101100', b);
+
+@pragma('dart2js:noInline')
+f_110_111_011_010_0(Set<String> u, int b) => v(u, '1101110110100', b);
+
+@pragma('dart2js:noInline')
+f_110_111_011_110_0(Set<String> u, int b) => v(u, '1101110111100', b);
+
+@pragma('dart2js:noInline')
+f_110_111_100_010_0(Set<String> u, int b) => v(u, '1101111000100', b);
+
+@pragma('dart2js:noInline')
+f_110_111_100_110_0(Set<String> u, int b) => v(u, '1101111001100', b);
+
+@pragma('dart2js:noInline')
+f_110_111_101_010_0(Set<String> u, int b) => v(u, '1101111010100', b);
+
+@pragma('dart2js:noInline')
+f_110_111_101_110_0(Set<String> u, int b) => v(u, '1101111011100', b);
+
+@pragma('dart2js:noInline')
+f_110_111_110_010_0(Set<String> u, int b) => v(u, '1101111100100', b);
+
+@pragma('dart2js:noInline')
+f_110_111_110_110_0(Set<String> u, int b) => v(u, '1101111101100', b);
+
+@pragma('dart2js:noInline')
+f_110_111_111_010_0(Set<String> u, int b) => v(u, '1101111110100', b);
+
+@pragma('dart2js:noInline')
+f_110_111_111_110_0(Set<String> u, int b) => v(u, '1101111111100', b);
+
+@pragma('dart2js:noInline')
+f_111_000_000_010_0(Set<String> u, int b) => v(u, '1110000000100', b);
+
+@pragma('dart2js:noInline')
+f_111_000_000_110_0(Set<String> u, int b) => v(u, '1110000001100', b);
+
+@pragma('dart2js:noInline')
+f_111_000_001_010_0(Set<String> u, int b) => v(u, '1110000010100', b);
+
+@pragma('dart2js:noInline')
+f_111_000_001_110_0(Set<String> u, int b) => v(u, '1110000011100', b);
+
+@pragma('dart2js:noInline')
+f_111_000_010_010_0(Set<String> u, int b) => v(u, '1110000100100', b);
+
+@pragma('dart2js:noInline')
+f_111_000_010_110_0(Set<String> u, int b) => v(u, '1110000101100', b);
+
+@pragma('dart2js:noInline')
+f_111_000_011_010_0(Set<String> u, int b) => v(u, '1110000110100', b);
+
+@pragma('dart2js:noInline')
+f_111_000_011_110_0(Set<String> u, int b) => v(u, '1110000111100', b);
+
+@pragma('dart2js:noInline')
+f_111_000_100_010_0(Set<String> u, int b) => v(u, '1110001000100', b);
+
+@pragma('dart2js:noInline')
+f_111_000_100_110_0(Set<String> u, int b) => v(u, '1110001001100', b);
+
+@pragma('dart2js:noInline')
+f_111_000_101_010_0(Set<String> u, int b) => v(u, '1110001010100', b);
+
+@pragma('dart2js:noInline')
+f_111_000_101_110_0(Set<String> u, int b) => v(u, '1110001011100', b);
+
+@pragma('dart2js:noInline')
+f_111_000_110_010_0(Set<String> u, int b) => v(u, '1110001100100', b);
+
+@pragma('dart2js:noInline')
+f_111_000_110_110_0(Set<String> u, int b) => v(u, '1110001101100', b);
+
+@pragma('dart2js:noInline')
+f_111_000_111_010_0(Set<String> u, int b) => v(u, '1110001110100', b);
+
+@pragma('dart2js:noInline')
+f_111_000_111_110_0(Set<String> u, int b) => v(u, '1110001111100', b);
+
+@pragma('dart2js:noInline')
+f_111_001_000_010_0(Set<String> u, int b) => v(u, '1110010000100', b);
+
+@pragma('dart2js:noInline')
+f_111_001_000_110_0(Set<String> u, int b) => v(u, '1110010001100', b);
+
+@pragma('dart2js:noInline')
+f_111_001_001_010_0(Set<String> u, int b) => v(u, '1110010010100', b);
+
+@pragma('dart2js:noInline')
+f_111_001_001_110_0(Set<String> u, int b) => v(u, '1110010011100', b);
+
+@pragma('dart2js:noInline')
+f_111_001_010_010_0(Set<String> u, int b) => v(u, '1110010100100', b);
+
+@pragma('dart2js:noInline')
+f_111_001_010_110_0(Set<String> u, int b) => v(u, '1110010101100', b);
+
+@pragma('dart2js:noInline')
+f_111_001_011_010_0(Set<String> u, int b) => v(u, '1110010110100', b);
+
+@pragma('dart2js:noInline')
+f_111_001_011_110_0(Set<String> u, int b) => v(u, '1110010111100', b);
+
+@pragma('dart2js:noInline')
+f_111_001_100_010_0(Set<String> u, int b) => v(u, '1110011000100', b);
+
+@pragma('dart2js:noInline')
+f_111_001_100_110_0(Set<String> u, int b) => v(u, '1110011001100', b);
+
+@pragma('dart2js:noInline')
+f_111_001_101_010_0(Set<String> u, int b) => v(u, '1110011010100', b);
+
+@pragma('dart2js:noInline')
+f_111_001_101_110_0(Set<String> u, int b) => v(u, '1110011011100', b);
+
+@pragma('dart2js:noInline')
+f_111_001_110_010_0(Set<String> u, int b) => v(u, '1110011100100', b);
+
+@pragma('dart2js:noInline')
+f_111_001_110_110_0(Set<String> u, int b) => v(u, '1110011101100', b);
+
+@pragma('dart2js:noInline')
+f_111_001_111_010_0(Set<String> u, int b) => v(u, '1110011110100', b);
+
+@pragma('dart2js:noInline')
+f_111_001_111_110_0(Set<String> u, int b) => v(u, '1110011111100', b);
+
+@pragma('dart2js:noInline')
+f_111_010_000_010_0(Set<String> u, int b) => v(u, '1110100000100', b);
+
+@pragma('dart2js:noInline')
+f_111_010_000_110_0(Set<String> u, int b) => v(u, '1110100001100', b);
+
+@pragma('dart2js:noInline')
+f_111_010_001_010_0(Set<String> u, int b) => v(u, '1110100010100', b);
+
+@pragma('dart2js:noInline')
+f_111_010_001_110_0(Set<String> u, int b) => v(u, '1110100011100', b);
+
+@pragma('dart2js:noInline')
+f_111_010_010_010_0(Set<String> u, int b) => v(u, '1110100100100', b);
+
+@pragma('dart2js:noInline')
+f_111_010_010_110_0(Set<String> u, int b) => v(u, '1110100101100', b);
+
+@pragma('dart2js:noInline')
+f_111_010_011_010_0(Set<String> u, int b) => v(u, '1110100110100', b);
+
+@pragma('dart2js:noInline')
+f_111_010_011_110_0(Set<String> u, int b) => v(u, '1110100111100', b);
+
+@pragma('dart2js:noInline')
+f_111_010_100_010_0(Set<String> u, int b) => v(u, '1110101000100', b);
+
+@pragma('dart2js:noInline')
+f_111_010_100_110_0(Set<String> u, int b) => v(u, '1110101001100', b);
+
+@pragma('dart2js:noInline')
+f_111_010_101_010_0(Set<String> u, int b) => v(u, '1110101010100', b);
+
+@pragma('dart2js:noInline')
+f_111_010_101_110_0(Set<String> u, int b) => v(u, '1110101011100', b);
+
+@pragma('dart2js:noInline')
+f_111_010_110_010_0(Set<String> u, int b) => v(u, '1110101100100', b);
+
+@pragma('dart2js:noInline')
+f_111_010_110_110_0(Set<String> u, int b) => v(u, '1110101101100', b);
+
+@pragma('dart2js:noInline')
+f_111_010_111_010_0(Set<String> u, int b) => v(u, '1110101110100', b);
+
+@pragma('dart2js:noInline')
+f_111_010_111_110_0(Set<String> u, int b) => v(u, '1110101111100', b);
+
+@pragma('dart2js:noInline')
+f_111_011_000_010_0(Set<String> u, int b) => v(u, '1110110000100', b);
+
+@pragma('dart2js:noInline')
+f_111_011_000_110_0(Set<String> u, int b) => v(u, '1110110001100', b);
+
+@pragma('dart2js:noInline')
+f_111_011_001_010_0(Set<String> u, int b) => v(u, '1110110010100', b);
+
+@pragma('dart2js:noInline')
+f_111_011_001_110_0(Set<String> u, int b) => v(u, '1110110011100', b);
+
+@pragma('dart2js:noInline')
+f_111_011_010_010_0(Set<String> u, int b) => v(u, '1110110100100', b);
+
+@pragma('dart2js:noInline')
+f_111_011_010_110_0(Set<String> u, int b) => v(u, '1110110101100', b);
+
+@pragma('dart2js:noInline')
+f_111_011_011_010_0(Set<String> u, int b) => v(u, '1110110110100', b);
+
+@pragma('dart2js:noInline')
+f_111_011_011_110_0(Set<String> u, int b) => v(u, '1110110111100', b);
+
+@pragma('dart2js:noInline')
+f_111_011_100_010_0(Set<String> u, int b) => v(u, '1110111000100', b);
+
+@pragma('dart2js:noInline')
+f_111_011_100_110_0(Set<String> u, int b) => v(u, '1110111001100', b);
+
+@pragma('dart2js:noInline')
+f_111_011_101_010_0(Set<String> u, int b) => v(u, '1110111010100', b);
+
+@pragma('dart2js:noInline')
+f_111_011_101_110_0(Set<String> u, int b) => v(u, '1110111011100', b);
+
+@pragma('dart2js:noInline')
+f_111_011_110_010_0(Set<String> u, int b) => v(u, '1110111100100', b);
+
+@pragma('dart2js:noInline')
+f_111_011_110_110_0(Set<String> u, int b) => v(u, '1110111101100', b);
+
+@pragma('dart2js:noInline')
+f_111_011_111_010_0(Set<String> u, int b) => v(u, '1110111110100', b);
+
+@pragma('dart2js:noInline')
+f_111_011_111_110_0(Set<String> u, int b) => v(u, '1110111111100', b);
+
+@pragma('dart2js:noInline')
+f_111_100_000_010_0(Set<String> u, int b) => v(u, '1111000000100', b);
+
+@pragma('dart2js:noInline')
+f_111_100_000_110_0(Set<String> u, int b) => v(u, '1111000001100', b);
+
+@pragma('dart2js:noInline')
+f_111_100_001_010_0(Set<String> u, int b) => v(u, '1111000010100', b);
+
+@pragma('dart2js:noInline')
+f_111_100_001_110_0(Set<String> u, int b) => v(u, '1111000011100', b);
+
+@pragma('dart2js:noInline')
+f_111_100_010_010_0(Set<String> u, int b) => v(u, '1111000100100', b);
+
+@pragma('dart2js:noInline')
+f_111_100_010_110_0(Set<String> u, int b) => v(u, '1111000101100', b);
+
+@pragma('dart2js:noInline')
+f_111_100_011_010_0(Set<String> u, int b) => v(u, '1111000110100', b);
+
+@pragma('dart2js:noInline')
+f_111_100_011_110_0(Set<String> u, int b) => v(u, '1111000111100', b);
+
+@pragma('dart2js:noInline')
+f_111_100_100_010_0(Set<String> u, int b) => v(u, '1111001000100', b);
+
+@pragma('dart2js:noInline')
+f_111_100_100_110_0(Set<String> u, int b) => v(u, '1111001001100', b);
+
+@pragma('dart2js:noInline')
+f_111_100_101_010_0(Set<String> u, int b) => v(u, '1111001010100', b);
+
+@pragma('dart2js:noInline')
+f_111_100_101_110_0(Set<String> u, int b) => v(u, '1111001011100', b);
+
+@pragma('dart2js:noInline')
+f_111_100_110_010_0(Set<String> u, int b) => v(u, '1111001100100', b);
+
+@pragma('dart2js:noInline')
+f_111_100_110_110_0(Set<String> u, int b) => v(u, '1111001101100', b);
+
+@pragma('dart2js:noInline')
+f_111_100_111_010_0(Set<String> u, int b) => v(u, '1111001110100', b);
+
+@pragma('dart2js:noInline')
+f_111_100_111_110_0(Set<String> u, int b) => v(u, '1111001111100', b);
+
+@pragma('dart2js:noInline')
+f_111_101_000_010_0(Set<String> u, int b) => v(u, '1111010000100', b);
+
+@pragma('dart2js:noInline')
+f_111_101_000_110_0(Set<String> u, int b) => v(u, '1111010001100', b);
+
+@pragma('dart2js:noInline')
+f_111_101_001_010_0(Set<String> u, int b) => v(u, '1111010010100', b);
+
+@pragma('dart2js:noInline')
+f_111_101_001_110_0(Set<String> u, int b) => v(u, '1111010011100', b);
+
+@pragma('dart2js:noInline')
+f_111_101_010_010_0(Set<String> u, int b) => v(u, '1111010100100', b);
+
+@pragma('dart2js:noInline')
+f_111_101_010_110_0(Set<String> u, int b) => v(u, '1111010101100', b);
+
+@pragma('dart2js:noInline')
+f_111_101_011_010_0(Set<String> u, int b) => v(u, '1111010110100', b);
+
+@pragma('dart2js:noInline')
+f_111_101_011_110_0(Set<String> u, int b) => v(u, '1111010111100', b);
+
+@pragma('dart2js:noInline')
+f_111_101_100_010_0(Set<String> u, int b) => v(u, '1111011000100', b);
+
+@pragma('dart2js:noInline')
+f_111_101_100_110_0(Set<String> u, int b) => v(u, '1111011001100', b);
+
+@pragma('dart2js:noInline')
+f_111_101_101_010_0(Set<String> u, int b) => v(u, '1111011010100', b);
+
+@pragma('dart2js:noInline')
+f_111_101_101_110_0(Set<String> u, int b) => v(u, '1111011011100', b);
+
+@pragma('dart2js:noInline')
+f_111_101_110_010_0(Set<String> u, int b) => v(u, '1111011100100', b);
+
+@pragma('dart2js:noInline')
+f_111_101_110_110_0(Set<String> u, int b) => v(u, '1111011101100', b);
+
+@pragma('dart2js:noInline')
+f_111_101_111_010_0(Set<String> u, int b) => v(u, '1111011110100', b);
+
+@pragma('dart2js:noInline')
+f_111_101_111_110_0(Set<String> u, int b) => v(u, '1111011111100', b);
+
+@pragma('dart2js:noInline')
+f_111_110_000_010_0(Set<String> u, int b) => v(u, '1111100000100', b);
+
+@pragma('dart2js:noInline')
+f_111_110_000_110_0(Set<String> u, int b) => v(u, '1111100001100', b);
+
+@pragma('dart2js:noInline')
+f_111_110_001_010_0(Set<String> u, int b) => v(u, '1111100010100', b);
+
+@pragma('dart2js:noInline')
+f_111_110_001_110_0(Set<String> u, int b) => v(u, '1111100011100', b);
+
+@pragma('dart2js:noInline')
+f_111_110_010_010_0(Set<String> u, int b) => v(u, '1111100100100', b);
+
+@pragma('dart2js:noInline')
+f_111_110_010_110_0(Set<String> u, int b) => v(u, '1111100101100', b);
+
+@pragma('dart2js:noInline')
+f_111_110_011_010_0(Set<String> u, int b) => v(u, '1111100110100', b);
+
+@pragma('dart2js:noInline')
+f_111_110_011_110_0(Set<String> u, int b) => v(u, '1111100111100', b);
+
+@pragma('dart2js:noInline')
+f_111_110_100_010_0(Set<String> u, int b) => v(u, '1111101000100', b);
+
+@pragma('dart2js:noInline')
+f_111_110_100_110_0(Set<String> u, int b) => v(u, '1111101001100', b);
+
+@pragma('dart2js:noInline')
+f_111_110_101_010_0(Set<String> u, int b) => v(u, '1111101010100', b);
+
+@pragma('dart2js:noInline')
+f_111_110_101_110_0(Set<String> u, int b) => v(u, '1111101011100', b);
+
+@pragma('dart2js:noInline')
+f_111_110_110_010_0(Set<String> u, int b) => v(u, '1111101100100', b);
+
+@pragma('dart2js:noInline')
+f_111_110_110_110_0(Set<String> u, int b) => v(u, '1111101101100', b);
+
+@pragma('dart2js:noInline')
+f_111_110_111_010_0(Set<String> u, int b) => v(u, '1111101110100', b);
+
+@pragma('dart2js:noInline')
+f_111_110_111_110_0(Set<String> u, int b) => v(u, '1111101111100', b);
+
+@pragma('dart2js:noInline')
+f_111_111_000_010_0(Set<String> u, int b) => v(u, '1111110000100', b);
+
+@pragma('dart2js:noInline')
+f_111_111_000_110_0(Set<String> u, int b) => v(u, '1111110001100', b);
+
+@pragma('dart2js:noInline')
+f_111_111_001_010_0(Set<String> u, int b) => v(u, '1111110010100', b);
+
+@pragma('dart2js:noInline')
+f_111_111_001_110_0(Set<String> u, int b) => v(u, '1111110011100', b);
+
+@pragma('dart2js:noInline')
+f_111_111_010_010_0(Set<String> u, int b) => v(u, '1111110100100', b);
+
+@pragma('dart2js:noInline')
+f_111_111_010_110_0(Set<String> u, int b) => v(u, '1111110101100', b);
+
+@pragma('dart2js:noInline')
+f_111_111_011_010_0(Set<String> u, int b) => v(u, '1111110110100', b);
+
+@pragma('dart2js:noInline')
+f_111_111_011_110_0(Set<String> u, int b) => v(u, '1111110111100', b);
+
+@pragma('dart2js:noInline')
+f_111_111_100_010_0(Set<String> u, int b) => v(u, '1111111000100', b);
+
+@pragma('dart2js:noInline')
+f_111_111_100_110_0(Set<String> u, int b) => v(u, '1111111001100', b);
+
+@pragma('dart2js:noInline')
+f_111_111_101_010_0(Set<String> u, int b) => v(u, '1111111010100', b);
+
+@pragma('dart2js:noInline')
+f_111_111_101_110_0(Set<String> u, int b) => v(u, '1111111011100', b);
+
+@pragma('dart2js:noInline')
+f_111_111_110_010_0(Set<String> u, int b) => v(u, '1111111100100', b);
+
+@pragma('dart2js:noInline')
+f_111_111_110_110_0(Set<String> u, int b) => v(u, '1111111101100', b);
+
+@pragma('dart2js:noInline')
+f_111_111_111_010_0(Set<String> u, int b) => v(u, '1111111110100', b);
+
+@pragma('dart2js:noInline')
+f_111_111_111_110_0(Set<String> u, int b) => v(u, '1111111111100', b);
+
+@pragma('dart2js:noInline')
+f_000_000_000_100_0(Set<String> u, int b) => v(u, '0000000001000', b);
+
+@pragma('dart2js:noInline')
+f_000_000_001_100_0(Set<String> u, int b) => v(u, '0000000011000', b);
+
+@pragma('dart2js:noInline')
+f_000_000_010_100_0(Set<String> u, int b) => v(u, '0000000101000', b);
+
+@pragma('dart2js:noInline')
+f_000_000_011_100_0(Set<String> u, int b) => v(u, '0000000111000', b);
+
+@pragma('dart2js:noInline')
+f_000_000_100_100_0(Set<String> u, int b) => v(u, '0000001001000', b);
+
+@pragma('dart2js:noInline')
+f_000_000_101_100_0(Set<String> u, int b) => v(u, '0000001011000', b);
+
+@pragma('dart2js:noInline')
+f_000_000_110_100_0(Set<String> u, int b) => v(u, '0000001101000', b);
+
+@pragma('dart2js:noInline')
+f_000_000_111_100_0(Set<String> u, int b) => v(u, '0000001111000', b);
+
+@pragma('dart2js:noInline')
+f_000_001_000_100_0(Set<String> u, int b) => v(u, '0000010001000', b);
+
+@pragma('dart2js:noInline')
+f_000_001_001_100_0(Set<String> u, int b) => v(u, '0000010011000', b);
+
+@pragma('dart2js:noInline')
+f_000_001_010_100_0(Set<String> u, int b) => v(u, '0000010101000', b);
+
+@pragma('dart2js:noInline')
+f_000_001_011_100_0(Set<String> u, int b) => v(u, '0000010111000', b);
+
+@pragma('dart2js:noInline')
+f_000_001_100_100_0(Set<String> u, int b) => v(u, '0000011001000', b);
+
+@pragma('dart2js:noInline')
+f_000_001_101_100_0(Set<String> u, int b) => v(u, '0000011011000', b);
+
+@pragma('dart2js:noInline')
+f_000_001_110_100_0(Set<String> u, int b) => v(u, '0000011101000', b);
+
+@pragma('dart2js:noInline')
+f_000_001_111_100_0(Set<String> u, int b) => v(u, '0000011111000', b);
+
+@pragma('dart2js:noInline')
+f_000_010_000_100_0(Set<String> u, int b) => v(u, '0000100001000', b);
+
+@pragma('dart2js:noInline')
+f_000_010_001_100_0(Set<String> u, int b) => v(u, '0000100011000', b);
+
+@pragma('dart2js:noInline')
+f_000_010_010_100_0(Set<String> u, int b) => v(u, '0000100101000', b);
+
+@pragma('dart2js:noInline')
+f_000_010_011_100_0(Set<String> u, int b) => v(u, '0000100111000', b);
+
+@pragma('dart2js:noInline')
+f_000_010_100_100_0(Set<String> u, int b) => v(u, '0000101001000', b);
+
+@pragma('dart2js:noInline')
+f_000_010_101_100_0(Set<String> u, int b) => v(u, '0000101011000', b);
+
+@pragma('dart2js:noInline')
+f_000_010_110_100_0(Set<String> u, int b) => v(u, '0000101101000', b);
+
+@pragma('dart2js:noInline')
+f_000_010_111_100_0(Set<String> u, int b) => v(u, '0000101111000', b);
+
+@pragma('dart2js:noInline')
+f_000_011_000_100_0(Set<String> u, int b) => v(u, '0000110001000', b);
+
+@pragma('dart2js:noInline')
+f_000_011_001_100_0(Set<String> u, int b) => v(u, '0000110011000', b);
+
+@pragma('dart2js:noInline')
+f_000_011_010_100_0(Set<String> u, int b) => v(u, '0000110101000', b);
+
+@pragma('dart2js:noInline')
+f_000_011_011_100_0(Set<String> u, int b) => v(u, '0000110111000', b);
+
+@pragma('dart2js:noInline')
+f_000_011_100_100_0(Set<String> u, int b) => v(u, '0000111001000', b);
+
+@pragma('dart2js:noInline')
+f_000_011_101_100_0(Set<String> u, int b) => v(u, '0000111011000', b);
+
+@pragma('dart2js:noInline')
+f_000_011_110_100_0(Set<String> u, int b) => v(u, '0000111101000', b);
+
+@pragma('dart2js:noInline')
+f_000_011_111_100_0(Set<String> u, int b) => v(u, '0000111111000', b);
+
+@pragma('dart2js:noInline')
+f_000_100_000_100_0(Set<String> u, int b) => v(u, '0001000001000', b);
+
+@pragma('dart2js:noInline')
+f_000_100_001_100_0(Set<String> u, int b) => v(u, '0001000011000', b);
+
+@pragma('dart2js:noInline')
+f_000_100_010_100_0(Set<String> u, int b) => v(u, '0001000101000', b);
+
+@pragma('dart2js:noInline')
+f_000_100_011_100_0(Set<String> u, int b) => v(u, '0001000111000', b);
+
+@pragma('dart2js:noInline')
+f_000_100_100_100_0(Set<String> u, int b) => v(u, '0001001001000', b);
+
+@pragma('dart2js:noInline')
+f_000_100_101_100_0(Set<String> u, int b) => v(u, '0001001011000', b);
+
+@pragma('dart2js:noInline')
+f_000_100_110_100_0(Set<String> u, int b) => v(u, '0001001101000', b);
+
+@pragma('dart2js:noInline')
+f_000_100_111_100_0(Set<String> u, int b) => v(u, '0001001111000', b);
+
+@pragma('dart2js:noInline')
+f_000_101_000_100_0(Set<String> u, int b) => v(u, '0001010001000', b);
+
+@pragma('dart2js:noInline')
+f_000_101_001_100_0(Set<String> u, int b) => v(u, '0001010011000', b);
+
+@pragma('dart2js:noInline')
+f_000_101_010_100_0(Set<String> u, int b) => v(u, '0001010101000', b);
+
+@pragma('dart2js:noInline')
+f_000_101_011_100_0(Set<String> u, int b) => v(u, '0001010111000', b);
+
+@pragma('dart2js:noInline')
+f_000_101_100_100_0(Set<String> u, int b) => v(u, '0001011001000', b);
+
+@pragma('dart2js:noInline')
+f_000_101_101_100_0(Set<String> u, int b) => v(u, '0001011011000', b);
+
+@pragma('dart2js:noInline')
+f_000_101_110_100_0(Set<String> u, int b) => v(u, '0001011101000', b);
+
+@pragma('dart2js:noInline')
+f_000_101_111_100_0(Set<String> u, int b) => v(u, '0001011111000', b);
+
+@pragma('dart2js:noInline')
+f_000_110_000_100_0(Set<String> u, int b) => v(u, '0001100001000', b);
+
+@pragma('dart2js:noInline')
+f_000_110_001_100_0(Set<String> u, int b) => v(u, '0001100011000', b);
+
+@pragma('dart2js:noInline')
+f_000_110_010_100_0(Set<String> u, int b) => v(u, '0001100101000', b);
+
+@pragma('dart2js:noInline')
+f_000_110_011_100_0(Set<String> u, int b) => v(u, '0001100111000', b);
+
+@pragma('dart2js:noInline')
+f_000_110_100_100_0(Set<String> u, int b) => v(u, '0001101001000', b);
+
+@pragma('dart2js:noInline')
+f_000_110_101_100_0(Set<String> u, int b) => v(u, '0001101011000', b);
+
+@pragma('dart2js:noInline')
+f_000_110_110_100_0(Set<String> u, int b) => v(u, '0001101101000', b);
+
+@pragma('dart2js:noInline')
+f_000_110_111_100_0(Set<String> u, int b) => v(u, '0001101111000', b);
+
+@pragma('dart2js:noInline')
+f_000_111_000_100_0(Set<String> u, int b) => v(u, '0001110001000', b);
+
+@pragma('dart2js:noInline')
+f_000_111_001_100_0(Set<String> u, int b) => v(u, '0001110011000', b);
+
+@pragma('dart2js:noInline')
+f_000_111_010_100_0(Set<String> u, int b) => v(u, '0001110101000', b);
+
+@pragma('dart2js:noInline')
+f_000_111_011_100_0(Set<String> u, int b) => v(u, '0001110111000', b);
+
+@pragma('dart2js:noInline')
+f_000_111_100_100_0(Set<String> u, int b) => v(u, '0001111001000', b);
+
+@pragma('dart2js:noInline')
+f_000_111_101_100_0(Set<String> u, int b) => v(u, '0001111011000', b);
+
+@pragma('dart2js:noInline')
+f_000_111_110_100_0(Set<String> u, int b) => v(u, '0001111101000', b);
+
+@pragma('dart2js:noInline')
+f_000_111_111_100_0(Set<String> u, int b) => v(u, '0001111111000', b);
+
+@pragma('dart2js:noInline')
+f_001_000_000_100_0(Set<String> u, int b) => v(u, '0010000001000', b);
+
+@pragma('dart2js:noInline')
+f_001_000_001_100_0(Set<String> u, int b) => v(u, '0010000011000', b);
+
+@pragma('dart2js:noInline')
+f_001_000_010_100_0(Set<String> u, int b) => v(u, '0010000101000', b);
+
+@pragma('dart2js:noInline')
+f_001_000_011_100_0(Set<String> u, int b) => v(u, '0010000111000', b);
+
+@pragma('dart2js:noInline')
+f_001_000_100_100_0(Set<String> u, int b) => v(u, '0010001001000', b);
+
+@pragma('dart2js:noInline')
+f_001_000_101_100_0(Set<String> u, int b) => v(u, '0010001011000', b);
+
+@pragma('dart2js:noInline')
+f_001_000_110_100_0(Set<String> u, int b) => v(u, '0010001101000', b);
+
+@pragma('dart2js:noInline')
+f_001_000_111_100_0(Set<String> u, int b) => v(u, '0010001111000', b);
+
+@pragma('dart2js:noInline')
+f_001_001_000_100_0(Set<String> u, int b) => v(u, '0010010001000', b);
+
+@pragma('dart2js:noInline')
+f_001_001_001_100_0(Set<String> u, int b) => v(u, '0010010011000', b);
+
+@pragma('dart2js:noInline')
+f_001_001_010_100_0(Set<String> u, int b) => v(u, '0010010101000', b);
+
+@pragma('dart2js:noInline')
+f_001_001_011_100_0(Set<String> u, int b) => v(u, '0010010111000', b);
+
+@pragma('dart2js:noInline')
+f_001_001_100_100_0(Set<String> u, int b) => v(u, '0010011001000', b);
+
+@pragma('dart2js:noInline')
+f_001_001_101_100_0(Set<String> u, int b) => v(u, '0010011011000', b);
+
+@pragma('dart2js:noInline')
+f_001_001_110_100_0(Set<String> u, int b) => v(u, '0010011101000', b);
+
+@pragma('dart2js:noInline')
+f_001_001_111_100_0(Set<String> u, int b) => v(u, '0010011111000', b);
+
+@pragma('dart2js:noInline')
+f_001_010_000_100_0(Set<String> u, int b) => v(u, '0010100001000', b);
+
+@pragma('dart2js:noInline')
+f_001_010_001_100_0(Set<String> u, int b) => v(u, '0010100011000', b);
+
+@pragma('dart2js:noInline')
+f_001_010_010_100_0(Set<String> u, int b) => v(u, '0010100101000', b);
+
+@pragma('dart2js:noInline')
+f_001_010_011_100_0(Set<String> u, int b) => v(u, '0010100111000', b);
+
+@pragma('dart2js:noInline')
+f_001_010_100_100_0(Set<String> u, int b) => v(u, '0010101001000', b);
+
+@pragma('dart2js:noInline')
+f_001_010_101_100_0(Set<String> u, int b) => v(u, '0010101011000', b);
+
+@pragma('dart2js:noInline')
+f_001_010_110_100_0(Set<String> u, int b) => v(u, '0010101101000', b);
+
+@pragma('dart2js:noInline')
+f_001_010_111_100_0(Set<String> u, int b) => v(u, '0010101111000', b);
+
+@pragma('dart2js:noInline')
+f_001_011_000_100_0(Set<String> u, int b) => v(u, '0010110001000', b);
+
+@pragma('dart2js:noInline')
+f_001_011_001_100_0(Set<String> u, int b) => v(u, '0010110011000', b);
+
+@pragma('dart2js:noInline')
+f_001_011_010_100_0(Set<String> u, int b) => v(u, '0010110101000', b);
+
+@pragma('dart2js:noInline')
+f_001_011_011_100_0(Set<String> u, int b) => v(u, '0010110111000', b);
+
+@pragma('dart2js:noInline')
+f_001_011_100_100_0(Set<String> u, int b) => v(u, '0010111001000', b);
+
+@pragma('dart2js:noInline')
+f_001_011_101_100_0(Set<String> u, int b) => v(u, '0010111011000', b);
+
+@pragma('dart2js:noInline')
+f_001_011_110_100_0(Set<String> u, int b) => v(u, '0010111101000', b);
+
+@pragma('dart2js:noInline')
+f_001_011_111_100_0(Set<String> u, int b) => v(u, '0010111111000', b);
+
+@pragma('dart2js:noInline')
+f_001_100_000_100_0(Set<String> u, int b) => v(u, '0011000001000', b);
+
+@pragma('dart2js:noInline')
+f_001_100_001_100_0(Set<String> u, int b) => v(u, '0011000011000', b);
+
+@pragma('dart2js:noInline')
+f_001_100_010_100_0(Set<String> u, int b) => v(u, '0011000101000', b);
+
+@pragma('dart2js:noInline')
+f_001_100_011_100_0(Set<String> u, int b) => v(u, '0011000111000', b);
+
+@pragma('dart2js:noInline')
+f_001_100_100_100_0(Set<String> u, int b) => v(u, '0011001001000', b);
+
+@pragma('dart2js:noInline')
+f_001_100_101_100_0(Set<String> u, int b) => v(u, '0011001011000', b);
+
+@pragma('dart2js:noInline')
+f_001_100_110_100_0(Set<String> u, int b) => v(u, '0011001101000', b);
+
+@pragma('dart2js:noInline')
+f_001_100_111_100_0(Set<String> u, int b) => v(u, '0011001111000', b);
+
+@pragma('dart2js:noInline')
+f_001_101_000_100_0(Set<String> u, int b) => v(u, '0011010001000', b);
+
+@pragma('dart2js:noInline')
+f_001_101_001_100_0(Set<String> u, int b) => v(u, '0011010011000', b);
+
+@pragma('dart2js:noInline')
+f_001_101_010_100_0(Set<String> u, int b) => v(u, '0011010101000', b);
+
+@pragma('dart2js:noInline')
+f_001_101_011_100_0(Set<String> u, int b) => v(u, '0011010111000', b);
+
+@pragma('dart2js:noInline')
+f_001_101_100_100_0(Set<String> u, int b) => v(u, '0011011001000', b);
+
+@pragma('dart2js:noInline')
+f_001_101_101_100_0(Set<String> u, int b) => v(u, '0011011011000', b);
+
+@pragma('dart2js:noInline')
+f_001_101_110_100_0(Set<String> u, int b) => v(u, '0011011101000', b);
+
+@pragma('dart2js:noInline')
+f_001_101_111_100_0(Set<String> u, int b) => v(u, '0011011111000', b);
+
+@pragma('dart2js:noInline')
+f_001_110_000_100_0(Set<String> u, int b) => v(u, '0011100001000', b);
+
+@pragma('dart2js:noInline')
+f_001_110_001_100_0(Set<String> u, int b) => v(u, '0011100011000', b);
+
+@pragma('dart2js:noInline')
+f_001_110_010_100_0(Set<String> u, int b) => v(u, '0011100101000', b);
+
+@pragma('dart2js:noInline')
+f_001_110_011_100_0(Set<String> u, int b) => v(u, '0011100111000', b);
+
+@pragma('dart2js:noInline')
+f_001_110_100_100_0(Set<String> u, int b) => v(u, '0011101001000', b);
+
+@pragma('dart2js:noInline')
+f_001_110_101_100_0(Set<String> u, int b) => v(u, '0011101011000', b);
+
+@pragma('dart2js:noInline')
+f_001_110_110_100_0(Set<String> u, int b) => v(u, '0011101101000', b);
+
+@pragma('dart2js:noInline')
+f_001_110_111_100_0(Set<String> u, int b) => v(u, '0011101111000', b);
+
+@pragma('dart2js:noInline')
+f_001_111_000_100_0(Set<String> u, int b) => v(u, '0011110001000', b);
+
+@pragma('dart2js:noInline')
+f_001_111_001_100_0(Set<String> u, int b) => v(u, '0011110011000', b);
+
+@pragma('dart2js:noInline')
+f_001_111_010_100_0(Set<String> u, int b) => v(u, '0011110101000', b);
+
+@pragma('dart2js:noInline')
+f_001_111_011_100_0(Set<String> u, int b) => v(u, '0011110111000', b);
+
+@pragma('dart2js:noInline')
+f_001_111_100_100_0(Set<String> u, int b) => v(u, '0011111001000', b);
+
+@pragma('dart2js:noInline')
+f_001_111_101_100_0(Set<String> u, int b) => v(u, '0011111011000', b);
+
+@pragma('dart2js:noInline')
+f_001_111_110_100_0(Set<String> u, int b) => v(u, '0011111101000', b);
+
+@pragma('dart2js:noInline')
+f_001_111_111_100_0(Set<String> u, int b) => v(u, '0011111111000', b);
+
+@pragma('dart2js:noInline')
+f_010_000_000_100_0(Set<String> u, int b) => v(u, '0100000001000', b);
+
+@pragma('dart2js:noInline')
+f_010_000_001_100_0(Set<String> u, int b) => v(u, '0100000011000', b);
+
+@pragma('dart2js:noInline')
+f_010_000_010_100_0(Set<String> u, int b) => v(u, '0100000101000', b);
+
+@pragma('dart2js:noInline')
+f_010_000_011_100_0(Set<String> u, int b) => v(u, '0100000111000', b);
+
+@pragma('dart2js:noInline')
+f_010_000_100_100_0(Set<String> u, int b) => v(u, '0100001001000', b);
+
+@pragma('dart2js:noInline')
+f_010_000_101_100_0(Set<String> u, int b) => v(u, '0100001011000', b);
+
+@pragma('dart2js:noInline')
+f_010_000_110_100_0(Set<String> u, int b) => v(u, '0100001101000', b);
+
+@pragma('dart2js:noInline')
+f_010_000_111_100_0(Set<String> u, int b) => v(u, '0100001111000', b);
+
+@pragma('dart2js:noInline')
+f_010_001_000_100_0(Set<String> u, int b) => v(u, '0100010001000', b);
+
+@pragma('dart2js:noInline')
+f_010_001_001_100_0(Set<String> u, int b) => v(u, '0100010011000', b);
+
+@pragma('dart2js:noInline')
+f_010_001_010_100_0(Set<String> u, int b) => v(u, '0100010101000', b);
+
+@pragma('dart2js:noInline')
+f_010_001_011_100_0(Set<String> u, int b) => v(u, '0100010111000', b);
+
+@pragma('dart2js:noInline')
+f_010_001_100_100_0(Set<String> u, int b) => v(u, '0100011001000', b);
+
+@pragma('dart2js:noInline')
+f_010_001_101_100_0(Set<String> u, int b) => v(u, '0100011011000', b);
+
+@pragma('dart2js:noInline')
+f_010_001_110_100_0(Set<String> u, int b) => v(u, '0100011101000', b);
+
+@pragma('dart2js:noInline')
+f_010_001_111_100_0(Set<String> u, int b) => v(u, '0100011111000', b);
+
+@pragma('dart2js:noInline')
+f_010_010_000_100_0(Set<String> u, int b) => v(u, '0100100001000', b);
+
+@pragma('dart2js:noInline')
+f_010_010_001_100_0(Set<String> u, int b) => v(u, '0100100011000', b);
+
+@pragma('dart2js:noInline')
+f_010_010_010_100_0(Set<String> u, int b) => v(u, '0100100101000', b);
+
+@pragma('dart2js:noInline')
+f_010_010_011_100_0(Set<String> u, int b) => v(u, '0100100111000', b);
+
+@pragma('dart2js:noInline')
+f_010_010_100_100_0(Set<String> u, int b) => v(u, '0100101001000', b);
+
+@pragma('dart2js:noInline')
+f_010_010_101_100_0(Set<String> u, int b) => v(u, '0100101011000', b);
+
+@pragma('dart2js:noInline')
+f_010_010_110_100_0(Set<String> u, int b) => v(u, '0100101101000', b);
+
+@pragma('dart2js:noInline')
+f_010_010_111_100_0(Set<String> u, int b) => v(u, '0100101111000', b);
+
+@pragma('dart2js:noInline')
+f_010_011_000_100_0(Set<String> u, int b) => v(u, '0100110001000', b);
+
+@pragma('dart2js:noInline')
+f_010_011_001_100_0(Set<String> u, int b) => v(u, '0100110011000', b);
+
+@pragma('dart2js:noInline')
+f_010_011_010_100_0(Set<String> u, int b) => v(u, '0100110101000', b);
+
+@pragma('dart2js:noInline')
+f_010_011_011_100_0(Set<String> u, int b) => v(u, '0100110111000', b);
+
+@pragma('dart2js:noInline')
+f_010_011_100_100_0(Set<String> u, int b) => v(u, '0100111001000', b);
+
+@pragma('dart2js:noInline')
+f_010_011_101_100_0(Set<String> u, int b) => v(u, '0100111011000', b);
+
+@pragma('dart2js:noInline')
+f_010_011_110_100_0(Set<String> u, int b) => v(u, '0100111101000', b);
+
+@pragma('dart2js:noInline')
+f_010_011_111_100_0(Set<String> u, int b) => v(u, '0100111111000', b);
+
+@pragma('dart2js:noInline')
+f_010_100_000_100_0(Set<String> u, int b) => v(u, '0101000001000', b);
+
+@pragma('dart2js:noInline')
+f_010_100_001_100_0(Set<String> u, int b) => v(u, '0101000011000', b);
+
+@pragma('dart2js:noInline')
+f_010_100_010_100_0(Set<String> u, int b) => v(u, '0101000101000', b);
+
+@pragma('dart2js:noInline')
+f_010_100_011_100_0(Set<String> u, int b) => v(u, '0101000111000', b);
+
+@pragma('dart2js:noInline')
+f_010_100_100_100_0(Set<String> u, int b) => v(u, '0101001001000', b);
+
+@pragma('dart2js:noInline')
+f_010_100_101_100_0(Set<String> u, int b) => v(u, '0101001011000', b);
+
+@pragma('dart2js:noInline')
+f_010_100_110_100_0(Set<String> u, int b) => v(u, '0101001101000', b);
+
+@pragma('dart2js:noInline')
+f_010_100_111_100_0(Set<String> u, int b) => v(u, '0101001111000', b);
+
+@pragma('dart2js:noInline')
+f_010_101_000_100_0(Set<String> u, int b) => v(u, '0101010001000', b);
+
+@pragma('dart2js:noInline')
+f_010_101_001_100_0(Set<String> u, int b) => v(u, '0101010011000', b);
+
+@pragma('dart2js:noInline')
+f_010_101_010_100_0(Set<String> u, int b) => v(u, '0101010101000', b);
+
+@pragma('dart2js:noInline')
+f_010_101_011_100_0(Set<String> u, int b) => v(u, '0101010111000', b);
+
+@pragma('dart2js:noInline')
+f_010_101_100_100_0(Set<String> u, int b) => v(u, '0101011001000', b);
+
+@pragma('dart2js:noInline')
+f_010_101_101_100_0(Set<String> u, int b) => v(u, '0101011011000', b);
+
+@pragma('dart2js:noInline')
+f_010_101_110_100_0(Set<String> u, int b) => v(u, '0101011101000', b);
+
+@pragma('dart2js:noInline')
+f_010_101_111_100_0(Set<String> u, int b) => v(u, '0101011111000', b);
+
+@pragma('dart2js:noInline')
+f_010_110_000_100_0(Set<String> u, int b) => v(u, '0101100001000', b);
+
+@pragma('dart2js:noInline')
+f_010_110_001_100_0(Set<String> u, int b) => v(u, '0101100011000', b);
+
+@pragma('dart2js:noInline')
+f_010_110_010_100_0(Set<String> u, int b) => v(u, '0101100101000', b);
+
+@pragma('dart2js:noInline')
+f_010_110_011_100_0(Set<String> u, int b) => v(u, '0101100111000', b);
+
+@pragma('dart2js:noInline')
+f_010_110_100_100_0(Set<String> u, int b) => v(u, '0101101001000', b);
+
+@pragma('dart2js:noInline')
+f_010_110_101_100_0(Set<String> u, int b) => v(u, '0101101011000', b);
+
+@pragma('dart2js:noInline')
+f_010_110_110_100_0(Set<String> u, int b) => v(u, '0101101101000', b);
+
+@pragma('dart2js:noInline')
+f_010_110_111_100_0(Set<String> u, int b) => v(u, '0101101111000', b);
+
+@pragma('dart2js:noInline')
+f_010_111_000_100_0(Set<String> u, int b) => v(u, '0101110001000', b);
+
+@pragma('dart2js:noInline')
+f_010_111_001_100_0(Set<String> u, int b) => v(u, '0101110011000', b);
+
+@pragma('dart2js:noInline')
+f_010_111_010_100_0(Set<String> u, int b) => v(u, '0101110101000', b);
+
+@pragma('dart2js:noInline')
+f_010_111_011_100_0(Set<String> u, int b) => v(u, '0101110111000', b);
+
+@pragma('dart2js:noInline')
+f_010_111_100_100_0(Set<String> u, int b) => v(u, '0101111001000', b);
+
+@pragma('dart2js:noInline')
+f_010_111_101_100_0(Set<String> u, int b) => v(u, '0101111011000', b);
+
+@pragma('dart2js:noInline')
+f_010_111_110_100_0(Set<String> u, int b) => v(u, '0101111101000', b);
+
+@pragma('dart2js:noInline')
+f_010_111_111_100_0(Set<String> u, int b) => v(u, '0101111111000', b);
+
+@pragma('dart2js:noInline')
+f_011_000_000_100_0(Set<String> u, int b) => v(u, '0110000001000', b);
+
+@pragma('dart2js:noInline')
+f_011_000_001_100_0(Set<String> u, int b) => v(u, '0110000011000', b);
+
+@pragma('dart2js:noInline')
+f_011_000_010_100_0(Set<String> u, int b) => v(u, '0110000101000', b);
+
+@pragma('dart2js:noInline')
+f_011_000_011_100_0(Set<String> u, int b) => v(u, '0110000111000', b);
+
+@pragma('dart2js:noInline')
+f_011_000_100_100_0(Set<String> u, int b) => v(u, '0110001001000', b);
+
+@pragma('dart2js:noInline')
+f_011_000_101_100_0(Set<String> u, int b) => v(u, '0110001011000', b);
+
+@pragma('dart2js:noInline')
+f_011_000_110_100_0(Set<String> u, int b) => v(u, '0110001101000', b);
+
+@pragma('dart2js:noInline')
+f_011_000_111_100_0(Set<String> u, int b) => v(u, '0110001111000', b);
+
+@pragma('dart2js:noInline')
+f_011_001_000_100_0(Set<String> u, int b) => v(u, '0110010001000', b);
+
+@pragma('dart2js:noInline')
+f_011_001_001_100_0(Set<String> u, int b) => v(u, '0110010011000', b);
+
+@pragma('dart2js:noInline')
+f_011_001_010_100_0(Set<String> u, int b) => v(u, '0110010101000', b);
+
+@pragma('dart2js:noInline')
+f_011_001_011_100_0(Set<String> u, int b) => v(u, '0110010111000', b);
+
+@pragma('dart2js:noInline')
+f_011_001_100_100_0(Set<String> u, int b) => v(u, '0110011001000', b);
+
+@pragma('dart2js:noInline')
+f_011_001_101_100_0(Set<String> u, int b) => v(u, '0110011011000', b);
+
+@pragma('dart2js:noInline')
+f_011_001_110_100_0(Set<String> u, int b) => v(u, '0110011101000', b);
+
+@pragma('dart2js:noInline')
+f_011_001_111_100_0(Set<String> u, int b) => v(u, '0110011111000', b);
+
+@pragma('dart2js:noInline')
+f_011_010_000_100_0(Set<String> u, int b) => v(u, '0110100001000', b);
+
+@pragma('dart2js:noInline')
+f_011_010_001_100_0(Set<String> u, int b) => v(u, '0110100011000', b);
+
+@pragma('dart2js:noInline')
+f_011_010_010_100_0(Set<String> u, int b) => v(u, '0110100101000', b);
+
+@pragma('dart2js:noInline')
+f_011_010_011_100_0(Set<String> u, int b) => v(u, '0110100111000', b);
+
+@pragma('dart2js:noInline')
+f_011_010_100_100_0(Set<String> u, int b) => v(u, '0110101001000', b);
+
+@pragma('dart2js:noInline')
+f_011_010_101_100_0(Set<String> u, int b) => v(u, '0110101011000', b);
+
+@pragma('dart2js:noInline')
+f_011_010_110_100_0(Set<String> u, int b) => v(u, '0110101101000', b);
+
+@pragma('dart2js:noInline')
+f_011_010_111_100_0(Set<String> u, int b) => v(u, '0110101111000', b);
+
+@pragma('dart2js:noInline')
+f_011_011_000_100_0(Set<String> u, int b) => v(u, '0110110001000', b);
+
+@pragma('dart2js:noInline')
+f_011_011_001_100_0(Set<String> u, int b) => v(u, '0110110011000', b);
+
+@pragma('dart2js:noInline')
+f_011_011_010_100_0(Set<String> u, int b) => v(u, '0110110101000', b);
+
+@pragma('dart2js:noInline')
+f_011_011_011_100_0(Set<String> u, int b) => v(u, '0110110111000', b);
+
+@pragma('dart2js:noInline')
+f_011_011_100_100_0(Set<String> u, int b) => v(u, '0110111001000', b);
+
+@pragma('dart2js:noInline')
+f_011_011_101_100_0(Set<String> u, int b) => v(u, '0110111011000', b);
+
+@pragma('dart2js:noInline')
+f_011_011_110_100_0(Set<String> u, int b) => v(u, '0110111101000', b);
+
+@pragma('dart2js:noInline')
+f_011_011_111_100_0(Set<String> u, int b) => v(u, '0110111111000', b);
+
+@pragma('dart2js:noInline')
+f_011_100_000_100_0(Set<String> u, int b) => v(u, '0111000001000', b);
+
+@pragma('dart2js:noInline')
+f_011_100_001_100_0(Set<String> u, int b) => v(u, '0111000011000', b);
+
+@pragma('dart2js:noInline')
+f_011_100_010_100_0(Set<String> u, int b) => v(u, '0111000101000', b);
+
+@pragma('dart2js:noInline')
+f_011_100_011_100_0(Set<String> u, int b) => v(u, '0111000111000', b);
+
+@pragma('dart2js:noInline')
+f_011_100_100_100_0(Set<String> u, int b) => v(u, '0111001001000', b);
+
+@pragma('dart2js:noInline')
+f_011_100_101_100_0(Set<String> u, int b) => v(u, '0111001011000', b);
+
+@pragma('dart2js:noInline')
+f_011_100_110_100_0(Set<String> u, int b) => v(u, '0111001101000', b);
+
+@pragma('dart2js:noInline')
+f_011_100_111_100_0(Set<String> u, int b) => v(u, '0111001111000', b);
+
+@pragma('dart2js:noInline')
+f_011_101_000_100_0(Set<String> u, int b) => v(u, '0111010001000', b);
+
+@pragma('dart2js:noInline')
+f_011_101_001_100_0(Set<String> u, int b) => v(u, '0111010011000', b);
+
+@pragma('dart2js:noInline')
+f_011_101_010_100_0(Set<String> u, int b) => v(u, '0111010101000', b);
+
+@pragma('dart2js:noInline')
+f_011_101_011_100_0(Set<String> u, int b) => v(u, '0111010111000', b);
+
+@pragma('dart2js:noInline')
+f_011_101_100_100_0(Set<String> u, int b) => v(u, '0111011001000', b);
+
+@pragma('dart2js:noInline')
+f_011_101_101_100_0(Set<String> u, int b) => v(u, '0111011011000', b);
+
+@pragma('dart2js:noInline')
+f_011_101_110_100_0(Set<String> u, int b) => v(u, '0111011101000', b);
+
+@pragma('dart2js:noInline')
+f_011_101_111_100_0(Set<String> u, int b) => v(u, '0111011111000', b);
+
+@pragma('dart2js:noInline')
+f_011_110_000_100_0(Set<String> u, int b) => v(u, '0111100001000', b);
+
+@pragma('dart2js:noInline')
+f_011_110_001_100_0(Set<String> u, int b) => v(u, '0111100011000', b);
+
+@pragma('dart2js:noInline')
+f_011_110_010_100_0(Set<String> u, int b) => v(u, '0111100101000', b);
+
+@pragma('dart2js:noInline')
+f_011_110_011_100_0(Set<String> u, int b) => v(u, '0111100111000', b);
+
+@pragma('dart2js:noInline')
+f_011_110_100_100_0(Set<String> u, int b) => v(u, '0111101001000', b);
+
+@pragma('dart2js:noInline')
+f_011_110_101_100_0(Set<String> u, int b) => v(u, '0111101011000', b);
+
+@pragma('dart2js:noInline')
+f_011_110_110_100_0(Set<String> u, int b) => v(u, '0111101101000', b);
+
+@pragma('dart2js:noInline')
+f_011_110_111_100_0(Set<String> u, int b) => v(u, '0111101111000', b);
+
+@pragma('dart2js:noInline')
+f_011_111_000_100_0(Set<String> u, int b) => v(u, '0111110001000', b);
+
+@pragma('dart2js:noInline')
+f_011_111_001_100_0(Set<String> u, int b) => v(u, '0111110011000', b);
+
+@pragma('dart2js:noInline')
+f_011_111_010_100_0(Set<String> u, int b) => v(u, '0111110101000', b);
+
+@pragma('dart2js:noInline')
+f_011_111_011_100_0(Set<String> u, int b) => v(u, '0111110111000', b);
+
+@pragma('dart2js:noInline')
+f_011_111_100_100_0(Set<String> u, int b) => v(u, '0111111001000', b);
+
+@pragma('dart2js:noInline')
+f_011_111_101_100_0(Set<String> u, int b) => v(u, '0111111011000', b);
+
+@pragma('dart2js:noInline')
+f_011_111_110_100_0(Set<String> u, int b) => v(u, '0111111101000', b);
+
+@pragma('dart2js:noInline')
+f_011_111_111_100_0(Set<String> u, int b) => v(u, '0111111111000', b);
+
+@pragma('dart2js:noInline')
+f_100_000_000_100_0(Set<String> u, int b) => v(u, '1000000001000', b);
+
+@pragma('dart2js:noInline')
+f_100_000_001_100_0(Set<String> u, int b) => v(u, '1000000011000', b);
+
+@pragma('dart2js:noInline')
+f_100_000_010_100_0(Set<String> u, int b) => v(u, '1000000101000', b);
+
+@pragma('dart2js:noInline')
+f_100_000_011_100_0(Set<String> u, int b) => v(u, '1000000111000', b);
+
+@pragma('dart2js:noInline')
+f_100_000_100_100_0(Set<String> u, int b) => v(u, '1000001001000', b);
+
+@pragma('dart2js:noInline')
+f_100_000_101_100_0(Set<String> u, int b) => v(u, '1000001011000', b);
+
+@pragma('dart2js:noInline')
+f_100_000_110_100_0(Set<String> u, int b) => v(u, '1000001101000', b);
+
+@pragma('dart2js:noInline')
+f_100_000_111_100_0(Set<String> u, int b) => v(u, '1000001111000', b);
+
+@pragma('dart2js:noInline')
+f_100_001_000_100_0(Set<String> u, int b) => v(u, '1000010001000', b);
+
+@pragma('dart2js:noInline')
+f_100_001_001_100_0(Set<String> u, int b) => v(u, '1000010011000', b);
+
+@pragma('dart2js:noInline')
+f_100_001_010_100_0(Set<String> u, int b) => v(u, '1000010101000', b);
+
+@pragma('dart2js:noInline')
+f_100_001_011_100_0(Set<String> u, int b) => v(u, '1000010111000', b);
+
+@pragma('dart2js:noInline')
+f_100_001_100_100_0(Set<String> u, int b) => v(u, '1000011001000', b);
+
+@pragma('dart2js:noInline')
+f_100_001_101_100_0(Set<String> u, int b) => v(u, '1000011011000', b);
+
+@pragma('dart2js:noInline')
+f_100_001_110_100_0(Set<String> u, int b) => v(u, '1000011101000', b);
+
+@pragma('dart2js:noInline')
+f_100_001_111_100_0(Set<String> u, int b) => v(u, '1000011111000', b);
+
+@pragma('dart2js:noInline')
+f_100_010_000_100_0(Set<String> u, int b) => v(u, '1000100001000', b);
+
+@pragma('dart2js:noInline')
+f_100_010_001_100_0(Set<String> u, int b) => v(u, '1000100011000', b);
+
+@pragma('dart2js:noInline')
+f_100_010_010_100_0(Set<String> u, int b) => v(u, '1000100101000', b);
+
+@pragma('dart2js:noInline')
+f_100_010_011_100_0(Set<String> u, int b) => v(u, '1000100111000', b);
+
+@pragma('dart2js:noInline')
+f_100_010_100_100_0(Set<String> u, int b) => v(u, '1000101001000', b);
+
+@pragma('dart2js:noInline')
+f_100_010_101_100_0(Set<String> u, int b) => v(u, '1000101011000', b);
+
+@pragma('dart2js:noInline')
+f_100_010_110_100_0(Set<String> u, int b) => v(u, '1000101101000', b);
+
+@pragma('dart2js:noInline')
+f_100_010_111_100_0(Set<String> u, int b) => v(u, '1000101111000', b);
+
+@pragma('dart2js:noInline')
+f_100_011_000_100_0(Set<String> u, int b) => v(u, '1000110001000', b);
+
+@pragma('dart2js:noInline')
+f_100_011_001_100_0(Set<String> u, int b) => v(u, '1000110011000', b);
+
+@pragma('dart2js:noInline')
+f_100_011_010_100_0(Set<String> u, int b) => v(u, '1000110101000', b);
+
+@pragma('dart2js:noInline')
+f_100_011_011_100_0(Set<String> u, int b) => v(u, '1000110111000', b);
+
+@pragma('dart2js:noInline')
+f_100_011_100_100_0(Set<String> u, int b) => v(u, '1000111001000', b);
+
+@pragma('dart2js:noInline')
+f_100_011_101_100_0(Set<String> u, int b) => v(u, '1000111011000', b);
+
+@pragma('dart2js:noInline')
+f_100_011_110_100_0(Set<String> u, int b) => v(u, '1000111101000', b);
+
+@pragma('dart2js:noInline')
+f_100_011_111_100_0(Set<String> u, int b) => v(u, '1000111111000', b);
+
+@pragma('dart2js:noInline')
+f_100_100_000_100_0(Set<String> u, int b) => v(u, '1001000001000', b);
+
+@pragma('dart2js:noInline')
+f_100_100_001_100_0(Set<String> u, int b) => v(u, '1001000011000', b);
+
+@pragma('dart2js:noInline')
+f_100_100_010_100_0(Set<String> u, int b) => v(u, '1001000101000', b);
+
+@pragma('dart2js:noInline')
+f_100_100_011_100_0(Set<String> u, int b) => v(u, '1001000111000', b);
+
+@pragma('dart2js:noInline')
+f_100_100_100_100_0(Set<String> u, int b) => v(u, '1001001001000', b);
+
+@pragma('dart2js:noInline')
+f_100_100_101_100_0(Set<String> u, int b) => v(u, '1001001011000', b);
+
+@pragma('dart2js:noInline')
+f_100_100_110_100_0(Set<String> u, int b) => v(u, '1001001101000', b);
+
+@pragma('dart2js:noInline')
+f_100_100_111_100_0(Set<String> u, int b) => v(u, '1001001111000', b);
+
+@pragma('dart2js:noInline')
+f_100_101_000_100_0(Set<String> u, int b) => v(u, '1001010001000', b);
+
+@pragma('dart2js:noInline')
+f_100_101_001_100_0(Set<String> u, int b) => v(u, '1001010011000', b);
+
+@pragma('dart2js:noInline')
+f_100_101_010_100_0(Set<String> u, int b) => v(u, '1001010101000', b);
+
+@pragma('dart2js:noInline')
+f_100_101_011_100_0(Set<String> u, int b) => v(u, '1001010111000', b);
+
+@pragma('dart2js:noInline')
+f_100_101_100_100_0(Set<String> u, int b) => v(u, '1001011001000', b);
+
+@pragma('dart2js:noInline')
+f_100_101_101_100_0(Set<String> u, int b) => v(u, '1001011011000', b);
+
+@pragma('dart2js:noInline')
+f_100_101_110_100_0(Set<String> u, int b) => v(u, '1001011101000', b);
+
+@pragma('dart2js:noInline')
+f_100_101_111_100_0(Set<String> u, int b) => v(u, '1001011111000', b);
+
+@pragma('dart2js:noInline')
+f_100_110_000_100_0(Set<String> u, int b) => v(u, '1001100001000', b);
+
+@pragma('dart2js:noInline')
+f_100_110_001_100_0(Set<String> u, int b) => v(u, '1001100011000', b);
+
+@pragma('dart2js:noInline')
+f_100_110_010_100_0(Set<String> u, int b) => v(u, '1001100101000', b);
+
+@pragma('dart2js:noInline')
+f_100_110_011_100_0(Set<String> u, int b) => v(u, '1001100111000', b);
+
+@pragma('dart2js:noInline')
+f_100_110_100_100_0(Set<String> u, int b) => v(u, '1001101001000', b);
+
+@pragma('dart2js:noInline')
+f_100_110_101_100_0(Set<String> u, int b) => v(u, '1001101011000', b);
+
+@pragma('dart2js:noInline')
+f_100_110_110_100_0(Set<String> u, int b) => v(u, '1001101101000', b);
+
+@pragma('dart2js:noInline')
+f_100_110_111_100_0(Set<String> u, int b) => v(u, '1001101111000', b);
+
+@pragma('dart2js:noInline')
+f_100_111_000_100_0(Set<String> u, int b) => v(u, '1001110001000', b);
+
+@pragma('dart2js:noInline')
+f_100_111_001_100_0(Set<String> u, int b) => v(u, '1001110011000', b);
+
+@pragma('dart2js:noInline')
+f_100_111_010_100_0(Set<String> u, int b) => v(u, '1001110101000', b);
+
+@pragma('dart2js:noInline')
+f_100_111_011_100_0(Set<String> u, int b) => v(u, '1001110111000', b);
+
+@pragma('dart2js:noInline')
+f_100_111_100_100_0(Set<String> u, int b) => v(u, '1001111001000', b);
+
+@pragma('dart2js:noInline')
+f_100_111_101_100_0(Set<String> u, int b) => v(u, '1001111011000', b);
+
+@pragma('dart2js:noInline')
+f_100_111_110_100_0(Set<String> u, int b) => v(u, '1001111101000', b);
+
+@pragma('dart2js:noInline')
+f_100_111_111_100_0(Set<String> u, int b) => v(u, '1001111111000', b);
+
+@pragma('dart2js:noInline')
+f_101_000_000_100_0(Set<String> u, int b) => v(u, '1010000001000', b);
+
+@pragma('dart2js:noInline')
+f_101_000_001_100_0(Set<String> u, int b) => v(u, '1010000011000', b);
+
+@pragma('dart2js:noInline')
+f_101_000_010_100_0(Set<String> u, int b) => v(u, '1010000101000', b);
+
+@pragma('dart2js:noInline')
+f_101_000_011_100_0(Set<String> u, int b) => v(u, '1010000111000', b);
+
+@pragma('dart2js:noInline')
+f_101_000_100_100_0(Set<String> u, int b) => v(u, '1010001001000', b);
+
+@pragma('dart2js:noInline')
+f_101_000_101_100_0(Set<String> u, int b) => v(u, '1010001011000', b);
+
+@pragma('dart2js:noInline')
+f_101_000_110_100_0(Set<String> u, int b) => v(u, '1010001101000', b);
+
+@pragma('dart2js:noInline')
+f_101_000_111_100_0(Set<String> u, int b) => v(u, '1010001111000', b);
+
+@pragma('dart2js:noInline')
+f_101_001_000_100_0(Set<String> u, int b) => v(u, '1010010001000', b);
+
+@pragma('dart2js:noInline')
+f_101_001_001_100_0(Set<String> u, int b) => v(u, '1010010011000', b);
+
+@pragma('dart2js:noInline')
+f_101_001_010_100_0(Set<String> u, int b) => v(u, '1010010101000', b);
+
+@pragma('dart2js:noInline')
+f_101_001_011_100_0(Set<String> u, int b) => v(u, '1010010111000', b);
+
+@pragma('dart2js:noInline')
+f_101_001_100_100_0(Set<String> u, int b) => v(u, '1010011001000', b);
+
+@pragma('dart2js:noInline')
+f_101_001_101_100_0(Set<String> u, int b) => v(u, '1010011011000', b);
+
+@pragma('dart2js:noInline')
+f_101_001_110_100_0(Set<String> u, int b) => v(u, '1010011101000', b);
+
+@pragma('dart2js:noInline')
+f_101_001_111_100_0(Set<String> u, int b) => v(u, '1010011111000', b);
+
+@pragma('dart2js:noInline')
+f_101_010_000_100_0(Set<String> u, int b) => v(u, '1010100001000', b);
+
+@pragma('dart2js:noInline')
+f_101_010_001_100_0(Set<String> u, int b) => v(u, '1010100011000', b);
+
+@pragma('dart2js:noInline')
+f_101_010_010_100_0(Set<String> u, int b) => v(u, '1010100101000', b);
+
+@pragma('dart2js:noInline')
+f_101_010_011_100_0(Set<String> u, int b) => v(u, '1010100111000', b);
+
+@pragma('dart2js:noInline')
+f_101_010_100_100_0(Set<String> u, int b) => v(u, '1010101001000', b);
+
+@pragma('dart2js:noInline')
+f_101_010_101_100_0(Set<String> u, int b) => v(u, '1010101011000', b);
+
+@pragma('dart2js:noInline')
+f_101_010_110_100_0(Set<String> u, int b) => v(u, '1010101101000', b);
+
+@pragma('dart2js:noInline')
+f_101_010_111_100_0(Set<String> u, int b) => v(u, '1010101111000', b);
+
+@pragma('dart2js:noInline')
+f_101_011_000_100_0(Set<String> u, int b) => v(u, '1010110001000', b);
+
+@pragma('dart2js:noInline')
+f_101_011_001_100_0(Set<String> u, int b) => v(u, '1010110011000', b);
+
+@pragma('dart2js:noInline')
+f_101_011_010_100_0(Set<String> u, int b) => v(u, '1010110101000', b);
+
+@pragma('dart2js:noInline')
+f_101_011_011_100_0(Set<String> u, int b) => v(u, '1010110111000', b);
+
+@pragma('dart2js:noInline')
+f_101_011_100_100_0(Set<String> u, int b) => v(u, '1010111001000', b);
+
+@pragma('dart2js:noInline')
+f_101_011_101_100_0(Set<String> u, int b) => v(u, '1010111011000', b);
+
+@pragma('dart2js:noInline')
+f_101_011_110_100_0(Set<String> u, int b) => v(u, '1010111101000', b);
+
+@pragma('dart2js:noInline')
+f_101_011_111_100_0(Set<String> u, int b) => v(u, '1010111111000', b);
+
+@pragma('dart2js:noInline')
+f_101_100_000_100_0(Set<String> u, int b) => v(u, '1011000001000', b);
+
+@pragma('dart2js:noInline')
+f_101_100_001_100_0(Set<String> u, int b) => v(u, '1011000011000', b);
+
+@pragma('dart2js:noInline')
+f_101_100_010_100_0(Set<String> u, int b) => v(u, '1011000101000', b);
+
+@pragma('dart2js:noInline')
+f_101_100_011_100_0(Set<String> u, int b) => v(u, '1011000111000', b);
+
+@pragma('dart2js:noInline')
+f_101_100_100_100_0(Set<String> u, int b) => v(u, '1011001001000', b);
+
+@pragma('dart2js:noInline')
+f_101_100_101_100_0(Set<String> u, int b) => v(u, '1011001011000', b);
+
+@pragma('dart2js:noInline')
+f_101_100_110_100_0(Set<String> u, int b) => v(u, '1011001101000', b);
+
+@pragma('dart2js:noInline')
+f_101_100_111_100_0(Set<String> u, int b) => v(u, '1011001111000', b);
+
+@pragma('dart2js:noInline')
+f_101_101_000_100_0(Set<String> u, int b) => v(u, '1011010001000', b);
+
+@pragma('dart2js:noInline')
+f_101_101_001_100_0(Set<String> u, int b) => v(u, '1011010011000', b);
+
+@pragma('dart2js:noInline')
+f_101_101_010_100_0(Set<String> u, int b) => v(u, '1011010101000', b);
+
+@pragma('dart2js:noInline')
+f_101_101_011_100_0(Set<String> u, int b) => v(u, '1011010111000', b);
+
+@pragma('dart2js:noInline')
+f_101_101_100_100_0(Set<String> u, int b) => v(u, '1011011001000', b);
+
+@pragma('dart2js:noInline')
+f_101_101_101_100_0(Set<String> u, int b) => v(u, '1011011011000', b);
+
+@pragma('dart2js:noInline')
+f_101_101_110_100_0(Set<String> u, int b) => v(u, '1011011101000', b);
+
+@pragma('dart2js:noInline')
+f_101_101_111_100_0(Set<String> u, int b) => v(u, '1011011111000', b);
+
+@pragma('dart2js:noInline')
+f_101_110_000_100_0(Set<String> u, int b) => v(u, '1011100001000', b);
+
+@pragma('dart2js:noInline')
+f_101_110_001_100_0(Set<String> u, int b) => v(u, '1011100011000', b);
+
+@pragma('dart2js:noInline')
+f_101_110_010_100_0(Set<String> u, int b) => v(u, '1011100101000', b);
+
+@pragma('dart2js:noInline')
+f_101_110_011_100_0(Set<String> u, int b) => v(u, '1011100111000', b);
+
+@pragma('dart2js:noInline')
+f_101_110_100_100_0(Set<String> u, int b) => v(u, '1011101001000', b);
+
+@pragma('dart2js:noInline')
+f_101_110_101_100_0(Set<String> u, int b) => v(u, '1011101011000', b);
+
+@pragma('dart2js:noInline')
+f_101_110_110_100_0(Set<String> u, int b) => v(u, '1011101101000', b);
+
+@pragma('dart2js:noInline')
+f_101_110_111_100_0(Set<String> u, int b) => v(u, '1011101111000', b);
+
+@pragma('dart2js:noInline')
+f_101_111_000_100_0(Set<String> u, int b) => v(u, '1011110001000', b);
+
+@pragma('dart2js:noInline')
+f_101_111_001_100_0(Set<String> u, int b) => v(u, '1011110011000', b);
+
+@pragma('dart2js:noInline')
+f_101_111_010_100_0(Set<String> u, int b) => v(u, '1011110101000', b);
+
+@pragma('dart2js:noInline')
+f_101_111_011_100_0(Set<String> u, int b) => v(u, '1011110111000', b);
+
+@pragma('dart2js:noInline')
+f_101_111_100_100_0(Set<String> u, int b) => v(u, '1011111001000', b);
+
+@pragma('dart2js:noInline')
+f_101_111_101_100_0(Set<String> u, int b) => v(u, '1011111011000', b);
+
+@pragma('dart2js:noInline')
+f_101_111_110_100_0(Set<String> u, int b) => v(u, '1011111101000', b);
+
+@pragma('dart2js:noInline')
+f_101_111_111_100_0(Set<String> u, int b) => v(u, '1011111111000', b);
+
+@pragma('dart2js:noInline')
+f_110_000_000_100_0(Set<String> u, int b) => v(u, '1100000001000', b);
+
+@pragma('dart2js:noInline')
+f_110_000_001_100_0(Set<String> u, int b) => v(u, '1100000011000', b);
+
+@pragma('dart2js:noInline')
+f_110_000_010_100_0(Set<String> u, int b) => v(u, '1100000101000', b);
+
+@pragma('dart2js:noInline')
+f_110_000_011_100_0(Set<String> u, int b) => v(u, '1100000111000', b);
+
+@pragma('dart2js:noInline')
+f_110_000_100_100_0(Set<String> u, int b) => v(u, '1100001001000', b);
+
+@pragma('dart2js:noInline')
+f_110_000_101_100_0(Set<String> u, int b) => v(u, '1100001011000', b);
+
+@pragma('dart2js:noInline')
+f_110_000_110_100_0(Set<String> u, int b) => v(u, '1100001101000', b);
+
+@pragma('dart2js:noInline')
+f_110_000_111_100_0(Set<String> u, int b) => v(u, '1100001111000', b);
+
+@pragma('dart2js:noInline')
+f_110_001_000_100_0(Set<String> u, int b) => v(u, '1100010001000', b);
+
+@pragma('dart2js:noInline')
+f_110_001_001_100_0(Set<String> u, int b) => v(u, '1100010011000', b);
+
+@pragma('dart2js:noInline')
+f_110_001_010_100_0(Set<String> u, int b) => v(u, '1100010101000', b);
+
+@pragma('dart2js:noInline')
+f_110_001_011_100_0(Set<String> u, int b) => v(u, '1100010111000', b);
+
+@pragma('dart2js:noInline')
+f_110_001_100_100_0(Set<String> u, int b) => v(u, '1100011001000', b);
+
+@pragma('dart2js:noInline')
+f_110_001_101_100_0(Set<String> u, int b) => v(u, '1100011011000', b);
+
+@pragma('dart2js:noInline')
+f_110_001_110_100_0(Set<String> u, int b) => v(u, '1100011101000', b);
+
+@pragma('dart2js:noInline')
+f_110_001_111_100_0(Set<String> u, int b) => v(u, '1100011111000', b);
+
+@pragma('dart2js:noInline')
+f_110_010_000_100_0(Set<String> u, int b) => v(u, '1100100001000', b);
+
+@pragma('dart2js:noInline')
+f_110_010_001_100_0(Set<String> u, int b) => v(u, '1100100011000', b);
+
+@pragma('dart2js:noInline')
+f_110_010_010_100_0(Set<String> u, int b) => v(u, '1100100101000', b);
+
+@pragma('dart2js:noInline')
+f_110_010_011_100_0(Set<String> u, int b) => v(u, '1100100111000', b);
+
+@pragma('dart2js:noInline')
+f_110_010_100_100_0(Set<String> u, int b) => v(u, '1100101001000', b);
+
+@pragma('dart2js:noInline')
+f_110_010_101_100_0(Set<String> u, int b) => v(u, '1100101011000', b);
+
+@pragma('dart2js:noInline')
+f_110_010_110_100_0(Set<String> u, int b) => v(u, '1100101101000', b);
+
+@pragma('dart2js:noInline')
+f_110_010_111_100_0(Set<String> u, int b) => v(u, '1100101111000', b);
+
+@pragma('dart2js:noInline')
+f_110_011_000_100_0(Set<String> u, int b) => v(u, '1100110001000', b);
+
+@pragma('dart2js:noInline')
+f_110_011_001_100_0(Set<String> u, int b) => v(u, '1100110011000', b);
+
+@pragma('dart2js:noInline')
+f_110_011_010_100_0(Set<String> u, int b) => v(u, '1100110101000', b);
+
+@pragma('dart2js:noInline')
+f_110_011_011_100_0(Set<String> u, int b) => v(u, '1100110111000', b);
+
+@pragma('dart2js:noInline')
+f_110_011_100_100_0(Set<String> u, int b) => v(u, '1100111001000', b);
+
+@pragma('dart2js:noInline')
+f_110_011_101_100_0(Set<String> u, int b) => v(u, '1100111011000', b);
+
+@pragma('dart2js:noInline')
+f_110_011_110_100_0(Set<String> u, int b) => v(u, '1100111101000', b);
+
+@pragma('dart2js:noInline')
+f_110_011_111_100_0(Set<String> u, int b) => v(u, '1100111111000', b);
+
+@pragma('dart2js:noInline')
+f_110_100_000_100_0(Set<String> u, int b) => v(u, '1101000001000', b);
+
+@pragma('dart2js:noInline')
+f_110_100_001_100_0(Set<String> u, int b) => v(u, '1101000011000', b);
+
+@pragma('dart2js:noInline')
+f_110_100_010_100_0(Set<String> u, int b) => v(u, '1101000101000', b);
+
+@pragma('dart2js:noInline')
+f_110_100_011_100_0(Set<String> u, int b) => v(u, '1101000111000', b);
+
+@pragma('dart2js:noInline')
+f_110_100_100_100_0(Set<String> u, int b) => v(u, '1101001001000', b);
+
+@pragma('dart2js:noInline')
+f_110_100_101_100_0(Set<String> u, int b) => v(u, '1101001011000', b);
+
+@pragma('dart2js:noInline')
+f_110_100_110_100_0(Set<String> u, int b) => v(u, '1101001101000', b);
+
+@pragma('dart2js:noInline')
+f_110_100_111_100_0(Set<String> u, int b) => v(u, '1101001111000', b);
+
+@pragma('dart2js:noInline')
+f_110_101_000_100_0(Set<String> u, int b) => v(u, '1101010001000', b);
+
+@pragma('dart2js:noInline')
+f_110_101_001_100_0(Set<String> u, int b) => v(u, '1101010011000', b);
+
+@pragma('dart2js:noInline')
+f_110_101_010_100_0(Set<String> u, int b) => v(u, '1101010101000', b);
+
+@pragma('dart2js:noInline')
+f_110_101_011_100_0(Set<String> u, int b) => v(u, '1101010111000', b);
+
+@pragma('dart2js:noInline')
+f_110_101_100_100_0(Set<String> u, int b) => v(u, '1101011001000', b);
+
+@pragma('dart2js:noInline')
+f_110_101_101_100_0(Set<String> u, int b) => v(u, '1101011011000', b);
+
+@pragma('dart2js:noInline')
+f_110_101_110_100_0(Set<String> u, int b) => v(u, '1101011101000', b);
+
+@pragma('dart2js:noInline')
+f_110_101_111_100_0(Set<String> u, int b) => v(u, '1101011111000', b);
+
+@pragma('dart2js:noInline')
+f_110_110_000_100_0(Set<String> u, int b) => v(u, '1101100001000', b);
+
+@pragma('dart2js:noInline')
+f_110_110_001_100_0(Set<String> u, int b) => v(u, '1101100011000', b);
+
+@pragma('dart2js:noInline')
+f_110_110_010_100_0(Set<String> u, int b) => v(u, '1101100101000', b);
+
+@pragma('dart2js:noInline')
+f_110_110_011_100_0(Set<String> u, int b) => v(u, '1101100111000', b);
+
+@pragma('dart2js:noInline')
+f_110_110_100_100_0(Set<String> u, int b) => v(u, '1101101001000', b);
+
+@pragma('dart2js:noInline')
+f_110_110_101_100_0(Set<String> u, int b) => v(u, '1101101011000', b);
+
+@pragma('dart2js:noInline')
+f_110_110_110_100_0(Set<String> u, int b) => v(u, '1101101101000', b);
+
+@pragma('dart2js:noInline')
+f_110_110_111_100_0(Set<String> u, int b) => v(u, '1101101111000', b);
+
+@pragma('dart2js:noInline')
+f_110_111_000_100_0(Set<String> u, int b) => v(u, '1101110001000', b);
+
+@pragma('dart2js:noInline')
+f_110_111_001_100_0(Set<String> u, int b) => v(u, '1101110011000', b);
+
+@pragma('dart2js:noInline')
+f_110_111_010_100_0(Set<String> u, int b) => v(u, '1101110101000', b);
+
+@pragma('dart2js:noInline')
+f_110_111_011_100_0(Set<String> u, int b) => v(u, '1101110111000', b);
+
+@pragma('dart2js:noInline')
+f_110_111_100_100_0(Set<String> u, int b) => v(u, '1101111001000', b);
+
+@pragma('dart2js:noInline')
+f_110_111_101_100_0(Set<String> u, int b) => v(u, '1101111011000', b);
+
+@pragma('dart2js:noInline')
+f_110_111_110_100_0(Set<String> u, int b) => v(u, '1101111101000', b);
+
+@pragma('dart2js:noInline')
+f_110_111_111_100_0(Set<String> u, int b) => v(u, '1101111111000', b);
+
+@pragma('dart2js:noInline')
+f_111_000_000_100_0(Set<String> u, int b) => v(u, '1110000001000', b);
+
+@pragma('dart2js:noInline')
+f_111_000_001_100_0(Set<String> u, int b) => v(u, '1110000011000', b);
+
+@pragma('dart2js:noInline')
+f_111_000_010_100_0(Set<String> u, int b) => v(u, '1110000101000', b);
+
+@pragma('dart2js:noInline')
+f_111_000_011_100_0(Set<String> u, int b) => v(u, '1110000111000', b);
+
+@pragma('dart2js:noInline')
+f_111_000_100_100_0(Set<String> u, int b) => v(u, '1110001001000', b);
+
+@pragma('dart2js:noInline')
+f_111_000_101_100_0(Set<String> u, int b) => v(u, '1110001011000', b);
+
+@pragma('dart2js:noInline')
+f_111_000_110_100_0(Set<String> u, int b) => v(u, '1110001101000', b);
+
+@pragma('dart2js:noInline')
+f_111_000_111_100_0(Set<String> u, int b) => v(u, '1110001111000', b);
+
+@pragma('dart2js:noInline')
+f_111_001_000_100_0(Set<String> u, int b) => v(u, '1110010001000', b);
+
+@pragma('dart2js:noInline')
+f_111_001_001_100_0(Set<String> u, int b) => v(u, '1110010011000', b);
+
+@pragma('dart2js:noInline')
+f_111_001_010_100_0(Set<String> u, int b) => v(u, '1110010101000', b);
+
+@pragma('dart2js:noInline')
+f_111_001_011_100_0(Set<String> u, int b) => v(u, '1110010111000', b);
+
+@pragma('dart2js:noInline')
+f_111_001_100_100_0(Set<String> u, int b) => v(u, '1110011001000', b);
+
+@pragma('dart2js:noInline')
+f_111_001_101_100_0(Set<String> u, int b) => v(u, '1110011011000', b);
+
+@pragma('dart2js:noInline')
+f_111_001_110_100_0(Set<String> u, int b) => v(u, '1110011101000', b);
+
+@pragma('dart2js:noInline')
+f_111_001_111_100_0(Set<String> u, int b) => v(u, '1110011111000', b);
+
+@pragma('dart2js:noInline')
+f_111_010_000_100_0(Set<String> u, int b) => v(u, '1110100001000', b);
+
+@pragma('dart2js:noInline')
+f_111_010_001_100_0(Set<String> u, int b) => v(u, '1110100011000', b);
+
+@pragma('dart2js:noInline')
+f_111_010_010_100_0(Set<String> u, int b) => v(u, '1110100101000', b);
+
+@pragma('dart2js:noInline')
+f_111_010_011_100_0(Set<String> u, int b) => v(u, '1110100111000', b);
+
+@pragma('dart2js:noInline')
+f_111_010_100_100_0(Set<String> u, int b) => v(u, '1110101001000', b);
+
+@pragma('dart2js:noInline')
+f_111_010_101_100_0(Set<String> u, int b) => v(u, '1110101011000', b);
+
+@pragma('dart2js:noInline')
+f_111_010_110_100_0(Set<String> u, int b) => v(u, '1110101101000', b);
+
+@pragma('dart2js:noInline')
+f_111_010_111_100_0(Set<String> u, int b) => v(u, '1110101111000', b);
+
+@pragma('dart2js:noInline')
+f_111_011_000_100_0(Set<String> u, int b) => v(u, '1110110001000', b);
+
+@pragma('dart2js:noInline')
+f_111_011_001_100_0(Set<String> u, int b) => v(u, '1110110011000', b);
+
+@pragma('dart2js:noInline')
+f_111_011_010_100_0(Set<String> u, int b) => v(u, '1110110101000', b);
+
+@pragma('dart2js:noInline')
+f_111_011_011_100_0(Set<String> u, int b) => v(u, '1110110111000', b);
+
+@pragma('dart2js:noInline')
+f_111_011_100_100_0(Set<String> u, int b) => v(u, '1110111001000', b);
+
+@pragma('dart2js:noInline')
+f_111_011_101_100_0(Set<String> u, int b) => v(u, '1110111011000', b);
+
+@pragma('dart2js:noInline')
+f_111_011_110_100_0(Set<String> u, int b) => v(u, '1110111101000', b);
+
+@pragma('dart2js:noInline')
+f_111_011_111_100_0(Set<String> u, int b) => v(u, '1110111111000', b);
+
+@pragma('dart2js:noInline')
+f_111_100_000_100_0(Set<String> u, int b) => v(u, '1111000001000', b);
+
+@pragma('dart2js:noInline')
+f_111_100_001_100_0(Set<String> u, int b) => v(u, '1111000011000', b);
+
+@pragma('dart2js:noInline')
+f_111_100_010_100_0(Set<String> u, int b) => v(u, '1111000101000', b);
+
+@pragma('dart2js:noInline')
+f_111_100_011_100_0(Set<String> u, int b) => v(u, '1111000111000', b);
+
+@pragma('dart2js:noInline')
+f_111_100_100_100_0(Set<String> u, int b) => v(u, '1111001001000', b);
+
+@pragma('dart2js:noInline')
+f_111_100_101_100_0(Set<String> u, int b) => v(u, '1111001011000', b);
+
+@pragma('dart2js:noInline')
+f_111_100_110_100_0(Set<String> u, int b) => v(u, '1111001101000', b);
+
+@pragma('dart2js:noInline')
+f_111_100_111_100_0(Set<String> u, int b) => v(u, '1111001111000', b);
+
+@pragma('dart2js:noInline')
+f_111_101_000_100_0(Set<String> u, int b) => v(u, '1111010001000', b);
+
+@pragma('dart2js:noInline')
+f_111_101_001_100_0(Set<String> u, int b) => v(u, '1111010011000', b);
+
+@pragma('dart2js:noInline')
+f_111_101_010_100_0(Set<String> u, int b) => v(u, '1111010101000', b);
+
+@pragma('dart2js:noInline')
+f_111_101_011_100_0(Set<String> u, int b) => v(u, '1111010111000', b);
+
+@pragma('dart2js:noInline')
+f_111_101_100_100_0(Set<String> u, int b) => v(u, '1111011001000', b);
+
+@pragma('dart2js:noInline')
+f_111_101_101_100_0(Set<String> u, int b) => v(u, '1111011011000', b);
+
+@pragma('dart2js:noInline')
+f_111_101_110_100_0(Set<String> u, int b) => v(u, '1111011101000', b);
+
+@pragma('dart2js:noInline')
+f_111_101_111_100_0(Set<String> u, int b) => v(u, '1111011111000', b);
+
+@pragma('dart2js:noInline')
+f_111_110_000_100_0(Set<String> u, int b) => v(u, '1111100001000', b);
+
+@pragma('dart2js:noInline')
+f_111_110_001_100_0(Set<String> u, int b) => v(u, '1111100011000', b);
+
+@pragma('dart2js:noInline')
+f_111_110_010_100_0(Set<String> u, int b) => v(u, '1111100101000', b);
+
+@pragma('dart2js:noInline')
+f_111_110_011_100_0(Set<String> u, int b) => v(u, '1111100111000', b);
+
+@pragma('dart2js:noInline')
+f_111_110_100_100_0(Set<String> u, int b) => v(u, '1111101001000', b);
+
+@pragma('dart2js:noInline')
+f_111_110_101_100_0(Set<String> u, int b) => v(u, '1111101011000', b);
+
+@pragma('dart2js:noInline')
+f_111_110_110_100_0(Set<String> u, int b) => v(u, '1111101101000', b);
+
+@pragma('dart2js:noInline')
+f_111_110_111_100_0(Set<String> u, int b) => v(u, '1111101111000', b);
+
+@pragma('dart2js:noInline')
+f_111_111_000_100_0(Set<String> u, int b) => v(u, '1111110001000', b);
+
+@pragma('dart2js:noInline')
+f_111_111_001_100_0(Set<String> u, int b) => v(u, '1111110011000', b);
+
+@pragma('dart2js:noInline')
+f_111_111_010_100_0(Set<String> u, int b) => v(u, '1111110101000', b);
+
+@pragma('dart2js:noInline')
+f_111_111_011_100_0(Set<String> u, int b) => v(u, '1111110111000', b);
+
+@pragma('dart2js:noInline')
+f_111_111_100_100_0(Set<String> u, int b) => v(u, '1111111001000', b);
+
+@pragma('dart2js:noInline')
+f_111_111_101_100_0(Set<String> u, int b) => v(u, '1111111011000', b);
+
+@pragma('dart2js:noInline')
+f_111_111_110_100_0(Set<String> u, int b) => v(u, '1111111101000', b);
+
+@pragma('dart2js:noInline')
+f_111_111_111_100_0(Set<String> u, int b) => v(u, '1111111111000', b);
+
+@pragma('dart2js:noInline')
+f_000_000_001_000_0(Set<String> u, int b) => v(u, '0000000010000', b);
+
+@pragma('dart2js:noInline')
+f_000_000_011_000_0(Set<String> u, int b) => v(u, '0000000110000', b);
+
+@pragma('dart2js:noInline')
+f_000_000_101_000_0(Set<String> u, int b) => v(u, '0000001010000', b);
+
+@pragma('dart2js:noInline')
+f_000_000_111_000_0(Set<String> u, int b) => v(u, '0000001110000', b);
+
+@pragma('dart2js:noInline')
+f_000_001_001_000_0(Set<String> u, int b) => v(u, '0000010010000', b);
+
+@pragma('dart2js:noInline')
+f_000_001_011_000_0(Set<String> u, int b) => v(u, '0000010110000', b);
+
+@pragma('dart2js:noInline')
+f_000_001_101_000_0(Set<String> u, int b) => v(u, '0000011010000', b);
+
+@pragma('dart2js:noInline')
+f_000_001_111_000_0(Set<String> u, int b) => v(u, '0000011110000', b);
+
+@pragma('dart2js:noInline')
+f_000_010_001_000_0(Set<String> u, int b) => v(u, '0000100010000', b);
+
+@pragma('dart2js:noInline')
+f_000_010_011_000_0(Set<String> u, int b) => v(u, '0000100110000', b);
+
+@pragma('dart2js:noInline')
+f_000_010_101_000_0(Set<String> u, int b) => v(u, '0000101010000', b);
+
+@pragma('dart2js:noInline')
+f_000_010_111_000_0(Set<String> u, int b) => v(u, '0000101110000', b);
+
+@pragma('dart2js:noInline')
+f_000_011_001_000_0(Set<String> u, int b) => v(u, '0000110010000', b);
+
+@pragma('dart2js:noInline')
+f_000_011_011_000_0(Set<String> u, int b) => v(u, '0000110110000', b);
+
+@pragma('dart2js:noInline')
+f_000_011_101_000_0(Set<String> u, int b) => v(u, '0000111010000', b);
+
+@pragma('dart2js:noInline')
+f_000_011_111_000_0(Set<String> u, int b) => v(u, '0000111110000', b);
+
+@pragma('dart2js:noInline')
+f_000_100_001_000_0(Set<String> u, int b) => v(u, '0001000010000', b);
+
+@pragma('dart2js:noInline')
+f_000_100_011_000_0(Set<String> u, int b) => v(u, '0001000110000', b);
+
+@pragma('dart2js:noInline')
+f_000_100_101_000_0(Set<String> u, int b) => v(u, '0001001010000', b);
+
+@pragma('dart2js:noInline')
+f_000_100_111_000_0(Set<String> u, int b) => v(u, '0001001110000', b);
+
+@pragma('dart2js:noInline')
+f_000_101_001_000_0(Set<String> u, int b) => v(u, '0001010010000', b);
+
+@pragma('dart2js:noInline')
+f_000_101_011_000_0(Set<String> u, int b) => v(u, '0001010110000', b);
+
+@pragma('dart2js:noInline')
+f_000_101_101_000_0(Set<String> u, int b) => v(u, '0001011010000', b);
+
+@pragma('dart2js:noInline')
+f_000_101_111_000_0(Set<String> u, int b) => v(u, '0001011110000', b);
+
+@pragma('dart2js:noInline')
+f_000_110_001_000_0(Set<String> u, int b) => v(u, '0001100010000', b);
+
+@pragma('dart2js:noInline')
+f_000_110_011_000_0(Set<String> u, int b) => v(u, '0001100110000', b);
+
+@pragma('dart2js:noInline')
+f_000_110_101_000_0(Set<String> u, int b) => v(u, '0001101010000', b);
+
+@pragma('dart2js:noInline')
+f_000_110_111_000_0(Set<String> u, int b) => v(u, '0001101110000', b);
+
+@pragma('dart2js:noInline')
+f_000_111_001_000_0(Set<String> u, int b) => v(u, '0001110010000', b);
+
+@pragma('dart2js:noInline')
+f_000_111_011_000_0(Set<String> u, int b) => v(u, '0001110110000', b);
+
+@pragma('dart2js:noInline')
+f_000_111_101_000_0(Set<String> u, int b) => v(u, '0001111010000', b);
+
+@pragma('dart2js:noInline')
+f_000_111_111_000_0(Set<String> u, int b) => v(u, '0001111110000', b);
+
+@pragma('dart2js:noInline')
+f_001_000_001_000_0(Set<String> u, int b) => v(u, '0010000010000', b);
+
+@pragma('dart2js:noInline')
+f_001_000_011_000_0(Set<String> u, int b) => v(u, '0010000110000', b);
+
+@pragma('dart2js:noInline')
+f_001_000_101_000_0(Set<String> u, int b) => v(u, '0010001010000', b);
+
+@pragma('dart2js:noInline')
+f_001_000_111_000_0(Set<String> u, int b) => v(u, '0010001110000', b);
+
+@pragma('dart2js:noInline')
+f_001_001_001_000_0(Set<String> u, int b) => v(u, '0010010010000', b);
+
+@pragma('dart2js:noInline')
+f_001_001_011_000_0(Set<String> u, int b) => v(u, '0010010110000', b);
+
+@pragma('dart2js:noInline')
+f_001_001_101_000_0(Set<String> u, int b) => v(u, '0010011010000', b);
+
+@pragma('dart2js:noInline')
+f_001_001_111_000_0(Set<String> u, int b) => v(u, '0010011110000', b);
+
+@pragma('dart2js:noInline')
+f_001_010_001_000_0(Set<String> u, int b) => v(u, '0010100010000', b);
+
+@pragma('dart2js:noInline')
+f_001_010_011_000_0(Set<String> u, int b) => v(u, '0010100110000', b);
+
+@pragma('dart2js:noInline')
+f_001_010_101_000_0(Set<String> u, int b) => v(u, '0010101010000', b);
+
+@pragma('dart2js:noInline')
+f_001_010_111_000_0(Set<String> u, int b) => v(u, '0010101110000', b);
+
+@pragma('dart2js:noInline')
+f_001_011_001_000_0(Set<String> u, int b) => v(u, '0010110010000', b);
+
+@pragma('dart2js:noInline')
+f_001_011_011_000_0(Set<String> u, int b) => v(u, '0010110110000', b);
+
+@pragma('dart2js:noInline')
+f_001_011_101_000_0(Set<String> u, int b) => v(u, '0010111010000', b);
+
+@pragma('dart2js:noInline')
+f_001_011_111_000_0(Set<String> u, int b) => v(u, '0010111110000', b);
+
+@pragma('dart2js:noInline')
+f_001_100_001_000_0(Set<String> u, int b) => v(u, '0011000010000', b);
+
+@pragma('dart2js:noInline')
+f_001_100_011_000_0(Set<String> u, int b) => v(u, '0011000110000', b);
+
+@pragma('dart2js:noInline')
+f_001_100_101_000_0(Set<String> u, int b) => v(u, '0011001010000', b);
+
+@pragma('dart2js:noInline')
+f_001_100_111_000_0(Set<String> u, int b) => v(u, '0011001110000', b);
+
+@pragma('dart2js:noInline')
+f_001_101_001_000_0(Set<String> u, int b) => v(u, '0011010010000', b);
+
+@pragma('dart2js:noInline')
+f_001_101_011_000_0(Set<String> u, int b) => v(u, '0011010110000', b);
+
+@pragma('dart2js:noInline')
+f_001_101_101_000_0(Set<String> u, int b) => v(u, '0011011010000', b);
+
+@pragma('dart2js:noInline')
+f_001_101_111_000_0(Set<String> u, int b) => v(u, '0011011110000', b);
+
+@pragma('dart2js:noInline')
+f_001_110_001_000_0(Set<String> u, int b) => v(u, '0011100010000', b);
+
+@pragma('dart2js:noInline')
+f_001_110_011_000_0(Set<String> u, int b) => v(u, '0011100110000', b);
+
+@pragma('dart2js:noInline')
+f_001_110_101_000_0(Set<String> u, int b) => v(u, '0011101010000', b);
+
+@pragma('dart2js:noInline')
+f_001_110_111_000_0(Set<String> u, int b) => v(u, '0011101110000', b);
+
+@pragma('dart2js:noInline')
+f_001_111_001_000_0(Set<String> u, int b) => v(u, '0011110010000', b);
+
+@pragma('dart2js:noInline')
+f_001_111_011_000_0(Set<String> u, int b) => v(u, '0011110110000', b);
+
+@pragma('dart2js:noInline')
+f_001_111_101_000_0(Set<String> u, int b) => v(u, '0011111010000', b);
+
+@pragma('dart2js:noInline')
+f_001_111_111_000_0(Set<String> u, int b) => v(u, '0011111110000', b);
+
+@pragma('dart2js:noInline')
+f_010_000_001_000_0(Set<String> u, int b) => v(u, '0100000010000', b);
+
+@pragma('dart2js:noInline')
+f_010_000_011_000_0(Set<String> u, int b) => v(u, '0100000110000', b);
+
+@pragma('dart2js:noInline')
+f_010_000_101_000_0(Set<String> u, int b) => v(u, '0100001010000', b);
+
+@pragma('dart2js:noInline')
+f_010_000_111_000_0(Set<String> u, int b) => v(u, '0100001110000', b);
+
+@pragma('dart2js:noInline')
+f_010_001_001_000_0(Set<String> u, int b) => v(u, '0100010010000', b);
+
+@pragma('dart2js:noInline')
+f_010_001_011_000_0(Set<String> u, int b) => v(u, '0100010110000', b);
+
+@pragma('dart2js:noInline')
+f_010_001_101_000_0(Set<String> u, int b) => v(u, '0100011010000', b);
+
+@pragma('dart2js:noInline')
+f_010_001_111_000_0(Set<String> u, int b) => v(u, '0100011110000', b);
+
+@pragma('dart2js:noInline')
+f_010_010_001_000_0(Set<String> u, int b) => v(u, '0100100010000', b);
+
+@pragma('dart2js:noInline')
+f_010_010_011_000_0(Set<String> u, int b) => v(u, '0100100110000', b);
+
+@pragma('dart2js:noInline')
+f_010_010_101_000_0(Set<String> u, int b) => v(u, '0100101010000', b);
+
+@pragma('dart2js:noInline')
+f_010_010_111_000_0(Set<String> u, int b) => v(u, '0100101110000', b);
+
+@pragma('dart2js:noInline')
+f_010_011_001_000_0(Set<String> u, int b) => v(u, '0100110010000', b);
+
+@pragma('dart2js:noInline')
+f_010_011_011_000_0(Set<String> u, int b) => v(u, '0100110110000', b);
+
+@pragma('dart2js:noInline')
+f_010_011_101_000_0(Set<String> u, int b) => v(u, '0100111010000', b);
+
+@pragma('dart2js:noInline')
+f_010_011_111_000_0(Set<String> u, int b) => v(u, '0100111110000', b);
+
+@pragma('dart2js:noInline')
+f_010_100_001_000_0(Set<String> u, int b) => v(u, '0101000010000', b);
+
+@pragma('dart2js:noInline')
+f_010_100_011_000_0(Set<String> u, int b) => v(u, '0101000110000', b);
+
+@pragma('dart2js:noInline')
+f_010_100_101_000_0(Set<String> u, int b) => v(u, '0101001010000', b);
+
+@pragma('dart2js:noInline')
+f_010_100_111_000_0(Set<String> u, int b) => v(u, '0101001110000', b);
+
+@pragma('dart2js:noInline')
+f_010_101_001_000_0(Set<String> u, int b) => v(u, '0101010010000', b);
+
+@pragma('dart2js:noInline')
+f_010_101_011_000_0(Set<String> u, int b) => v(u, '0101010110000', b);
+
+@pragma('dart2js:noInline')
+f_010_101_101_000_0(Set<String> u, int b) => v(u, '0101011010000', b);
+
+@pragma('dart2js:noInline')
+f_010_101_111_000_0(Set<String> u, int b) => v(u, '0101011110000', b);
+
+@pragma('dart2js:noInline')
+f_010_110_001_000_0(Set<String> u, int b) => v(u, '0101100010000', b);
+
+@pragma('dart2js:noInline')
+f_010_110_011_000_0(Set<String> u, int b) => v(u, '0101100110000', b);
+
+@pragma('dart2js:noInline')
+f_010_110_101_000_0(Set<String> u, int b) => v(u, '0101101010000', b);
+
+@pragma('dart2js:noInline')
+f_010_110_111_000_0(Set<String> u, int b) => v(u, '0101101110000', b);
+
+@pragma('dart2js:noInline')
+f_010_111_001_000_0(Set<String> u, int b) => v(u, '0101110010000', b);
+
+@pragma('dart2js:noInline')
+f_010_111_011_000_0(Set<String> u, int b) => v(u, '0101110110000', b);
+
+@pragma('dart2js:noInline')
+f_010_111_101_000_0(Set<String> u, int b) => v(u, '0101111010000', b);
+
+@pragma('dart2js:noInline')
+f_010_111_111_000_0(Set<String> u, int b) => v(u, '0101111110000', b);
+
+@pragma('dart2js:noInline')
+f_011_000_001_000_0(Set<String> u, int b) => v(u, '0110000010000', b);
+
+@pragma('dart2js:noInline')
+f_011_000_011_000_0(Set<String> u, int b) => v(u, '0110000110000', b);
+
+@pragma('dart2js:noInline')
+f_011_000_101_000_0(Set<String> u, int b) => v(u, '0110001010000', b);
+
+@pragma('dart2js:noInline')
+f_011_000_111_000_0(Set<String> u, int b) => v(u, '0110001110000', b);
+
+@pragma('dart2js:noInline')
+f_011_001_001_000_0(Set<String> u, int b) => v(u, '0110010010000', b);
+
+@pragma('dart2js:noInline')
+f_011_001_011_000_0(Set<String> u, int b) => v(u, '0110010110000', b);
+
+@pragma('dart2js:noInline')
+f_011_001_101_000_0(Set<String> u, int b) => v(u, '0110011010000', b);
+
+@pragma('dart2js:noInline')
+f_011_001_111_000_0(Set<String> u, int b) => v(u, '0110011110000', b);
+
+@pragma('dart2js:noInline')
+f_011_010_001_000_0(Set<String> u, int b) => v(u, '0110100010000', b);
+
+@pragma('dart2js:noInline')
+f_011_010_011_000_0(Set<String> u, int b) => v(u, '0110100110000', b);
+
+@pragma('dart2js:noInline')
+f_011_010_101_000_0(Set<String> u, int b) => v(u, '0110101010000', b);
+
+@pragma('dart2js:noInline')
+f_011_010_111_000_0(Set<String> u, int b) => v(u, '0110101110000', b);
+
+@pragma('dart2js:noInline')
+f_011_011_001_000_0(Set<String> u, int b) => v(u, '0110110010000', b);
+
+@pragma('dart2js:noInline')
+f_011_011_011_000_0(Set<String> u, int b) => v(u, '0110110110000', b);
+
+@pragma('dart2js:noInline')
+f_011_011_101_000_0(Set<String> u, int b) => v(u, '0110111010000', b);
+
+@pragma('dart2js:noInline')
+f_011_011_111_000_0(Set<String> u, int b) => v(u, '0110111110000', b);
+
+@pragma('dart2js:noInline')
+f_011_100_001_000_0(Set<String> u, int b) => v(u, '0111000010000', b);
+
+@pragma('dart2js:noInline')
+f_011_100_011_000_0(Set<String> u, int b) => v(u, '0111000110000', b);
+
+@pragma('dart2js:noInline')
+f_011_100_101_000_0(Set<String> u, int b) => v(u, '0111001010000', b);
+
+@pragma('dart2js:noInline')
+f_011_100_111_000_0(Set<String> u, int b) => v(u, '0111001110000', b);
+
+@pragma('dart2js:noInline')
+f_011_101_001_000_0(Set<String> u, int b) => v(u, '0111010010000', b);
+
+@pragma('dart2js:noInline')
+f_011_101_011_000_0(Set<String> u, int b) => v(u, '0111010110000', b);
+
+@pragma('dart2js:noInline')
+f_011_101_101_000_0(Set<String> u, int b) => v(u, '0111011010000', b);
+
+@pragma('dart2js:noInline')
+f_011_101_111_000_0(Set<String> u, int b) => v(u, '0111011110000', b);
+
+@pragma('dart2js:noInline')
+f_011_110_001_000_0(Set<String> u, int b) => v(u, '0111100010000', b);
+
+@pragma('dart2js:noInline')
+f_011_110_011_000_0(Set<String> u, int b) => v(u, '0111100110000', b);
+
+@pragma('dart2js:noInline')
+f_011_110_101_000_0(Set<String> u, int b) => v(u, '0111101010000', b);
+
+@pragma('dart2js:noInline')
+f_011_110_111_000_0(Set<String> u, int b) => v(u, '0111101110000', b);
+
+@pragma('dart2js:noInline')
+f_011_111_001_000_0(Set<String> u, int b) => v(u, '0111110010000', b);
+
+@pragma('dart2js:noInline')
+f_011_111_011_000_0(Set<String> u, int b) => v(u, '0111110110000', b);
+
+@pragma('dart2js:noInline')
+f_011_111_101_000_0(Set<String> u, int b) => v(u, '0111111010000', b);
+
+@pragma('dart2js:noInline')
+f_011_111_111_000_0(Set<String> u, int b) => v(u, '0111111110000', b);
+
+@pragma('dart2js:noInline')
+f_100_000_001_000_0(Set<String> u, int b) => v(u, '1000000010000', b);
+
+@pragma('dart2js:noInline')
+f_100_000_011_000_0(Set<String> u, int b) => v(u, '1000000110000', b);
+
+@pragma('dart2js:noInline')
+f_100_000_101_000_0(Set<String> u, int b) => v(u, '1000001010000', b);
+
+@pragma('dart2js:noInline')
+f_100_000_111_000_0(Set<String> u, int b) => v(u, '1000001110000', b);
+
+@pragma('dart2js:noInline')
+f_100_001_001_000_0(Set<String> u, int b) => v(u, '1000010010000', b);
+
+@pragma('dart2js:noInline')
+f_100_001_011_000_0(Set<String> u, int b) => v(u, '1000010110000', b);
+
+@pragma('dart2js:noInline')
+f_100_001_101_000_0(Set<String> u, int b) => v(u, '1000011010000', b);
+
+@pragma('dart2js:noInline')
+f_100_001_111_000_0(Set<String> u, int b) => v(u, '1000011110000', b);
+
+@pragma('dart2js:noInline')
+f_100_010_001_000_0(Set<String> u, int b) => v(u, '1000100010000', b);
+
+@pragma('dart2js:noInline')
+f_100_010_011_000_0(Set<String> u, int b) => v(u, '1000100110000', b);
+
+@pragma('dart2js:noInline')
+f_100_010_101_000_0(Set<String> u, int b) => v(u, '1000101010000', b);
+
+@pragma('dart2js:noInline')
+f_100_010_111_000_0(Set<String> u, int b) => v(u, '1000101110000', b);
+
+@pragma('dart2js:noInline')
+f_100_011_001_000_0(Set<String> u, int b) => v(u, '1000110010000', b);
+
+@pragma('dart2js:noInline')
+f_100_011_011_000_0(Set<String> u, int b) => v(u, '1000110110000', b);
+
+@pragma('dart2js:noInline')
+f_100_011_101_000_0(Set<String> u, int b) => v(u, '1000111010000', b);
+
+@pragma('dart2js:noInline')
+f_100_011_111_000_0(Set<String> u, int b) => v(u, '1000111110000', b);
+
+@pragma('dart2js:noInline')
+f_100_100_001_000_0(Set<String> u, int b) => v(u, '1001000010000', b);
+
+@pragma('dart2js:noInline')
+f_100_100_011_000_0(Set<String> u, int b) => v(u, '1001000110000', b);
+
+@pragma('dart2js:noInline')
+f_100_100_101_000_0(Set<String> u, int b) => v(u, '1001001010000', b);
+
+@pragma('dart2js:noInline')
+f_100_100_111_000_0(Set<String> u, int b) => v(u, '1001001110000', b);
+
+@pragma('dart2js:noInline')
+f_100_101_001_000_0(Set<String> u, int b) => v(u, '1001010010000', b);
+
+@pragma('dart2js:noInline')
+f_100_101_011_000_0(Set<String> u, int b) => v(u, '1001010110000', b);
+
+@pragma('dart2js:noInline')
+f_100_101_101_000_0(Set<String> u, int b) => v(u, '1001011010000', b);
+
+@pragma('dart2js:noInline')
+f_100_101_111_000_0(Set<String> u, int b) => v(u, '1001011110000', b);
+
+@pragma('dart2js:noInline')
+f_100_110_001_000_0(Set<String> u, int b) => v(u, '1001100010000', b);
+
+@pragma('dart2js:noInline')
+f_100_110_011_000_0(Set<String> u, int b) => v(u, '1001100110000', b);
+
+@pragma('dart2js:noInline')
+f_100_110_101_000_0(Set<String> u, int b) => v(u, '1001101010000', b);
+
+@pragma('dart2js:noInline')
+f_100_110_111_000_0(Set<String> u, int b) => v(u, '1001101110000', b);
+
+@pragma('dart2js:noInline')
+f_100_111_001_000_0(Set<String> u, int b) => v(u, '1001110010000', b);
+
+@pragma('dart2js:noInline')
+f_100_111_011_000_0(Set<String> u, int b) => v(u, '1001110110000', b);
+
+@pragma('dart2js:noInline')
+f_100_111_101_000_0(Set<String> u, int b) => v(u, '1001111010000', b);
+
+@pragma('dart2js:noInline')
+f_100_111_111_000_0(Set<String> u, int b) => v(u, '1001111110000', b);
+
+@pragma('dart2js:noInline')
+f_101_000_001_000_0(Set<String> u, int b) => v(u, '1010000010000', b);
+
+@pragma('dart2js:noInline')
+f_101_000_011_000_0(Set<String> u, int b) => v(u, '1010000110000', b);
+
+@pragma('dart2js:noInline')
+f_101_000_101_000_0(Set<String> u, int b) => v(u, '1010001010000', b);
+
+@pragma('dart2js:noInline')
+f_101_000_111_000_0(Set<String> u, int b) => v(u, '1010001110000', b);
+
+@pragma('dart2js:noInline')
+f_101_001_001_000_0(Set<String> u, int b) => v(u, '1010010010000', b);
+
+@pragma('dart2js:noInline')
+f_101_001_011_000_0(Set<String> u, int b) => v(u, '1010010110000', b);
+
+@pragma('dart2js:noInline')
+f_101_001_101_000_0(Set<String> u, int b) => v(u, '1010011010000', b);
+
+@pragma('dart2js:noInline')
+f_101_001_111_000_0(Set<String> u, int b) => v(u, '1010011110000', b);
+
+@pragma('dart2js:noInline')
+f_101_010_001_000_0(Set<String> u, int b) => v(u, '1010100010000', b);
+
+@pragma('dart2js:noInline')
+f_101_010_011_000_0(Set<String> u, int b) => v(u, '1010100110000', b);
+
+@pragma('dart2js:noInline')
+f_101_010_101_000_0(Set<String> u, int b) => v(u, '1010101010000', b);
+
+@pragma('dart2js:noInline')
+f_101_010_111_000_0(Set<String> u, int b) => v(u, '1010101110000', b);
+
+@pragma('dart2js:noInline')
+f_101_011_001_000_0(Set<String> u, int b) => v(u, '1010110010000', b);
+
+@pragma('dart2js:noInline')
+f_101_011_011_000_0(Set<String> u, int b) => v(u, '1010110110000', b);
+
+@pragma('dart2js:noInline')
+f_101_011_101_000_0(Set<String> u, int b) => v(u, '1010111010000', b);
+
+@pragma('dart2js:noInline')
+f_101_011_111_000_0(Set<String> u, int b) => v(u, '1010111110000', b);
+
+@pragma('dart2js:noInline')
+f_101_100_001_000_0(Set<String> u, int b) => v(u, '1011000010000', b);
+
+@pragma('dart2js:noInline')
+f_101_100_011_000_0(Set<String> u, int b) => v(u, '1011000110000', b);
+
+@pragma('dart2js:noInline')
+f_101_100_101_000_0(Set<String> u, int b) => v(u, '1011001010000', b);
+
+@pragma('dart2js:noInline')
+f_101_100_111_000_0(Set<String> u, int b) => v(u, '1011001110000', b);
+
+@pragma('dart2js:noInline')
+f_101_101_001_000_0(Set<String> u, int b) => v(u, '1011010010000', b);
+
+@pragma('dart2js:noInline')
+f_101_101_011_000_0(Set<String> u, int b) => v(u, '1011010110000', b);
+
+@pragma('dart2js:noInline')
+f_101_101_101_000_0(Set<String> u, int b) => v(u, '1011011010000', b);
+
+@pragma('dart2js:noInline')
+f_101_101_111_000_0(Set<String> u, int b) => v(u, '1011011110000', b);
+
+@pragma('dart2js:noInline')
+f_101_110_001_000_0(Set<String> u, int b) => v(u, '1011100010000', b);
+
+@pragma('dart2js:noInline')
+f_101_110_011_000_0(Set<String> u, int b) => v(u, '1011100110000', b);
+
+@pragma('dart2js:noInline')
+f_101_110_101_000_0(Set<String> u, int b) => v(u, '1011101010000', b);
+
+@pragma('dart2js:noInline')
+f_101_110_111_000_0(Set<String> u, int b) => v(u, '1011101110000', b);
+
+@pragma('dart2js:noInline')
+f_101_111_001_000_0(Set<String> u, int b) => v(u, '1011110010000', b);
+
+@pragma('dart2js:noInline')
+f_101_111_011_000_0(Set<String> u, int b) => v(u, '1011110110000', b);
+
+@pragma('dart2js:noInline')
+f_101_111_101_000_0(Set<String> u, int b) => v(u, '1011111010000', b);
+
+@pragma('dart2js:noInline')
+f_101_111_111_000_0(Set<String> u, int b) => v(u, '1011111110000', b);
+
+@pragma('dart2js:noInline')
+f_110_000_001_000_0(Set<String> u, int b) => v(u, '1100000010000', b);
+
+@pragma('dart2js:noInline')
+f_110_000_011_000_0(Set<String> u, int b) => v(u, '1100000110000', b);
+
+@pragma('dart2js:noInline')
+f_110_000_101_000_0(Set<String> u, int b) => v(u, '1100001010000', b);
+
+@pragma('dart2js:noInline')
+f_110_000_111_000_0(Set<String> u, int b) => v(u, '1100001110000', b);
+
+@pragma('dart2js:noInline')
+f_110_001_001_000_0(Set<String> u, int b) => v(u, '1100010010000', b);
+
+@pragma('dart2js:noInline')
+f_110_001_011_000_0(Set<String> u, int b) => v(u, '1100010110000', b);
+
+@pragma('dart2js:noInline')
+f_110_001_101_000_0(Set<String> u, int b) => v(u, '1100011010000', b);
+
+@pragma('dart2js:noInline')
+f_110_001_111_000_0(Set<String> u, int b) => v(u, '1100011110000', b);
+
+@pragma('dart2js:noInline')
+f_110_010_001_000_0(Set<String> u, int b) => v(u, '1100100010000', b);
+
+@pragma('dart2js:noInline')
+f_110_010_011_000_0(Set<String> u, int b) => v(u, '1100100110000', b);
+
+@pragma('dart2js:noInline')
+f_110_010_101_000_0(Set<String> u, int b) => v(u, '1100101010000', b);
+
+@pragma('dart2js:noInline')
+f_110_010_111_000_0(Set<String> u, int b) => v(u, '1100101110000', b);
+
+@pragma('dart2js:noInline')
+f_110_011_001_000_0(Set<String> u, int b) => v(u, '1100110010000', b);
+
+@pragma('dart2js:noInline')
+f_110_011_011_000_0(Set<String> u, int b) => v(u, '1100110110000', b);
+
+@pragma('dart2js:noInline')
+f_110_011_101_000_0(Set<String> u, int b) => v(u, '1100111010000', b);
+
+@pragma('dart2js:noInline')
+f_110_011_111_000_0(Set<String> u, int b) => v(u, '1100111110000', b);
+
+@pragma('dart2js:noInline')
+f_110_100_001_000_0(Set<String> u, int b) => v(u, '1101000010000', b);
+
+@pragma('dart2js:noInline')
+f_110_100_011_000_0(Set<String> u, int b) => v(u, '1101000110000', b);
+
+@pragma('dart2js:noInline')
+f_110_100_101_000_0(Set<String> u, int b) => v(u, '1101001010000', b);
+
+@pragma('dart2js:noInline')
+f_110_100_111_000_0(Set<String> u, int b) => v(u, '1101001110000', b);
+
+@pragma('dart2js:noInline')
+f_110_101_001_000_0(Set<String> u, int b) => v(u, '1101010010000', b);
+
+@pragma('dart2js:noInline')
+f_110_101_011_000_0(Set<String> u, int b) => v(u, '1101010110000', b);
+
+@pragma('dart2js:noInline')
+f_110_101_101_000_0(Set<String> u, int b) => v(u, '1101011010000', b);
+
+@pragma('dart2js:noInline')
+f_110_101_111_000_0(Set<String> u, int b) => v(u, '1101011110000', b);
+
+@pragma('dart2js:noInline')
+f_110_110_001_000_0(Set<String> u, int b) => v(u, '1101100010000', b);
+
+@pragma('dart2js:noInline')
+f_110_110_011_000_0(Set<String> u, int b) => v(u, '1101100110000', b);
+
+@pragma('dart2js:noInline')
+f_110_110_101_000_0(Set<String> u, int b) => v(u, '1101101010000', b);
+
+@pragma('dart2js:noInline')
+f_110_110_111_000_0(Set<String> u, int b) => v(u, '1101101110000', b);
+
+@pragma('dart2js:noInline')
+f_110_111_001_000_0(Set<String> u, int b) => v(u, '1101110010000', b);
+
+@pragma('dart2js:noInline')
+f_110_111_011_000_0(Set<String> u, int b) => v(u, '1101110110000', b);
+
+@pragma('dart2js:noInline')
+f_110_111_101_000_0(Set<String> u, int b) => v(u, '1101111010000', b);
+
+@pragma('dart2js:noInline')
+f_110_111_111_000_0(Set<String> u, int b) => v(u, '1101111110000', b);
+
+@pragma('dart2js:noInline')
+f_111_000_001_000_0(Set<String> u, int b) => v(u, '1110000010000', b);
+
+@pragma('dart2js:noInline')
+f_111_000_011_000_0(Set<String> u, int b) => v(u, '1110000110000', b);
+
+@pragma('dart2js:noInline')
+f_111_000_101_000_0(Set<String> u, int b) => v(u, '1110001010000', b);
+
+@pragma('dart2js:noInline')
+f_111_000_111_000_0(Set<String> u, int b) => v(u, '1110001110000', b);
+
+@pragma('dart2js:noInline')
+f_111_001_001_000_0(Set<String> u, int b) => v(u, '1110010010000', b);
+
+@pragma('dart2js:noInline')
+f_111_001_011_000_0(Set<String> u, int b) => v(u, '1110010110000', b);
+
+@pragma('dart2js:noInline')
+f_111_001_101_000_0(Set<String> u, int b) => v(u, '1110011010000', b);
+
+@pragma('dart2js:noInline')
+f_111_001_111_000_0(Set<String> u, int b) => v(u, '1110011110000', b);
+
+@pragma('dart2js:noInline')
+f_111_010_001_000_0(Set<String> u, int b) => v(u, '1110100010000', b);
+
+@pragma('dart2js:noInline')
+f_111_010_011_000_0(Set<String> u, int b) => v(u, '1110100110000', b);
+
+@pragma('dart2js:noInline')
+f_111_010_101_000_0(Set<String> u, int b) => v(u, '1110101010000', b);
+
+@pragma('dart2js:noInline')
+f_111_010_111_000_0(Set<String> u, int b) => v(u, '1110101110000', b);
+
+@pragma('dart2js:noInline')
+f_111_011_001_000_0(Set<String> u, int b) => v(u, '1110110010000', b);
+
+@pragma('dart2js:noInline')
+f_111_011_011_000_0(Set<String> u, int b) => v(u, '1110110110000', b);
+
+@pragma('dart2js:noInline')
+f_111_011_101_000_0(Set<String> u, int b) => v(u, '1110111010000', b);
+
+@pragma('dart2js:noInline')
+f_111_011_111_000_0(Set<String> u, int b) => v(u, '1110111110000', b);
+
+@pragma('dart2js:noInline')
+f_111_100_001_000_0(Set<String> u, int b) => v(u, '1111000010000', b);
+
+@pragma('dart2js:noInline')
+f_111_100_011_000_0(Set<String> u, int b) => v(u, '1111000110000', b);
+
+@pragma('dart2js:noInline')
+f_111_100_101_000_0(Set<String> u, int b) => v(u, '1111001010000', b);
+
+@pragma('dart2js:noInline')
+f_111_100_111_000_0(Set<String> u, int b) => v(u, '1111001110000', b);
+
+@pragma('dart2js:noInline')
+f_111_101_001_000_0(Set<String> u, int b) => v(u, '1111010010000', b);
+
+@pragma('dart2js:noInline')
+f_111_101_011_000_0(Set<String> u, int b) => v(u, '1111010110000', b);
+
+@pragma('dart2js:noInline')
+f_111_101_101_000_0(Set<String> u, int b) => v(u, '1111011010000', b);
+
+@pragma('dart2js:noInline')
+f_111_101_111_000_0(Set<String> u, int b) => v(u, '1111011110000', b);
+
+@pragma('dart2js:noInline')
+f_111_110_001_000_0(Set<String> u, int b) => v(u, '1111100010000', b);
+
+@pragma('dart2js:noInline')
+f_111_110_011_000_0(Set<String> u, int b) => v(u, '1111100110000', b);
+
+@pragma('dart2js:noInline')
+f_111_110_101_000_0(Set<String> u, int b) => v(u, '1111101010000', b);
+
+@pragma('dart2js:noInline')
+f_111_110_111_000_0(Set<String> u, int b) => v(u, '1111101110000', b);
+
+@pragma('dart2js:noInline')
+f_111_111_001_000_0(Set<String> u, int b) => v(u, '1111110010000', b);
+
+@pragma('dart2js:noInline')
+f_111_111_011_000_0(Set<String> u, int b) => v(u, '1111110110000', b);
+
+@pragma('dart2js:noInline')
+f_111_111_101_000_0(Set<String> u, int b) => v(u, '1111111010000', b);
+
+@pragma('dart2js:noInline')
+f_111_111_111_000_0(Set<String> u, int b) => v(u, '1111111110000', b);
+
+@pragma('dart2js:noInline')
+f_000_000_010_000_0(Set<String> u, int b) => v(u, '0000000100000', b);
+
+@pragma('dart2js:noInline')
+f_000_000_110_000_0(Set<String> u, int b) => v(u, '0000001100000', b);
+
+@pragma('dart2js:noInline')
+f_000_001_010_000_0(Set<String> u, int b) => v(u, '0000010100000', b);
+
+@pragma('dart2js:noInline')
+f_000_001_110_000_0(Set<String> u, int b) => v(u, '0000011100000', b);
+
+@pragma('dart2js:noInline')
+f_000_010_010_000_0(Set<String> u, int b) => v(u, '0000100100000', b);
+
+@pragma('dart2js:noInline')
+f_000_010_110_000_0(Set<String> u, int b) => v(u, '0000101100000', b);
+
+@pragma('dart2js:noInline')
+f_000_011_010_000_0(Set<String> u, int b) => v(u, '0000110100000', b);
+
+@pragma('dart2js:noInline')
+f_000_011_110_000_0(Set<String> u, int b) => v(u, '0000111100000', b);
+
+@pragma('dart2js:noInline')
+f_000_100_010_000_0(Set<String> u, int b) => v(u, '0001000100000', b);
+
+@pragma('dart2js:noInline')
+f_000_100_110_000_0(Set<String> u, int b) => v(u, '0001001100000', b);
+
+@pragma('dart2js:noInline')
+f_000_101_010_000_0(Set<String> u, int b) => v(u, '0001010100000', b);
+
+@pragma('dart2js:noInline')
+f_000_101_110_000_0(Set<String> u, int b) => v(u, '0001011100000', b);
+
+@pragma('dart2js:noInline')
+f_000_110_010_000_0(Set<String> u, int b) => v(u, '0001100100000', b);
+
+@pragma('dart2js:noInline')
+f_000_110_110_000_0(Set<String> u, int b) => v(u, '0001101100000', b);
+
+@pragma('dart2js:noInline')
+f_000_111_010_000_0(Set<String> u, int b) => v(u, '0001110100000', b);
+
+@pragma('dart2js:noInline')
+f_000_111_110_000_0(Set<String> u, int b) => v(u, '0001111100000', b);
+
+@pragma('dart2js:noInline')
+f_001_000_010_000_0(Set<String> u, int b) => v(u, '0010000100000', b);
+
+@pragma('dart2js:noInline')
+f_001_000_110_000_0(Set<String> u, int b) => v(u, '0010001100000', b);
+
+@pragma('dart2js:noInline')
+f_001_001_010_000_0(Set<String> u, int b) => v(u, '0010010100000', b);
+
+@pragma('dart2js:noInline')
+f_001_001_110_000_0(Set<String> u, int b) => v(u, '0010011100000', b);
+
+@pragma('dart2js:noInline')
+f_001_010_010_000_0(Set<String> u, int b) => v(u, '0010100100000', b);
+
+@pragma('dart2js:noInline')
+f_001_010_110_000_0(Set<String> u, int b) => v(u, '0010101100000', b);
+
+@pragma('dart2js:noInline')
+f_001_011_010_000_0(Set<String> u, int b) => v(u, '0010110100000', b);
+
+@pragma('dart2js:noInline')
+f_001_011_110_000_0(Set<String> u, int b) => v(u, '0010111100000', b);
+
+@pragma('dart2js:noInline')
+f_001_100_010_000_0(Set<String> u, int b) => v(u, '0011000100000', b);
+
+@pragma('dart2js:noInline')
+f_001_100_110_000_0(Set<String> u, int b) => v(u, '0011001100000', b);
+
+@pragma('dart2js:noInline')
+f_001_101_010_000_0(Set<String> u, int b) => v(u, '0011010100000', b);
+
+@pragma('dart2js:noInline')
+f_001_101_110_000_0(Set<String> u, int b) => v(u, '0011011100000', b);
+
+@pragma('dart2js:noInline')
+f_001_110_010_000_0(Set<String> u, int b) => v(u, '0011100100000', b);
+
+@pragma('dart2js:noInline')
+f_001_110_110_000_0(Set<String> u, int b) => v(u, '0011101100000', b);
+
+@pragma('dart2js:noInline')
+f_001_111_010_000_0(Set<String> u, int b) => v(u, '0011110100000', b);
+
+@pragma('dart2js:noInline')
+f_001_111_110_000_0(Set<String> u, int b) => v(u, '0011111100000', b);
+
+@pragma('dart2js:noInline')
+f_010_000_010_000_0(Set<String> u, int b) => v(u, '0100000100000', b);
+
+@pragma('dart2js:noInline')
+f_010_000_110_000_0(Set<String> u, int b) => v(u, '0100001100000', b);
+
+@pragma('dart2js:noInline')
+f_010_001_010_000_0(Set<String> u, int b) => v(u, '0100010100000', b);
+
+@pragma('dart2js:noInline')
+f_010_001_110_000_0(Set<String> u, int b) => v(u, '0100011100000', b);
+
+@pragma('dart2js:noInline')
+f_010_010_010_000_0(Set<String> u, int b) => v(u, '0100100100000', b);
+
+@pragma('dart2js:noInline')
+f_010_010_110_000_0(Set<String> u, int b) => v(u, '0100101100000', b);
+
+@pragma('dart2js:noInline')
+f_010_011_010_000_0(Set<String> u, int b) => v(u, '0100110100000', b);
+
+@pragma('dart2js:noInline')
+f_010_011_110_000_0(Set<String> u, int b) => v(u, '0100111100000', b);
+
+@pragma('dart2js:noInline')
+f_010_100_010_000_0(Set<String> u, int b) => v(u, '0101000100000', b);
+
+@pragma('dart2js:noInline')
+f_010_100_110_000_0(Set<String> u, int b) => v(u, '0101001100000', b);
+
+@pragma('dart2js:noInline')
+f_010_101_010_000_0(Set<String> u, int b) => v(u, '0101010100000', b);
+
+@pragma('dart2js:noInline')
+f_010_101_110_000_0(Set<String> u, int b) => v(u, '0101011100000', b);
+
+@pragma('dart2js:noInline')
+f_010_110_010_000_0(Set<String> u, int b) => v(u, '0101100100000', b);
+
+@pragma('dart2js:noInline')
+f_010_110_110_000_0(Set<String> u, int b) => v(u, '0101101100000', b);
+
+@pragma('dart2js:noInline')
+f_010_111_010_000_0(Set<String> u, int b) => v(u, '0101110100000', b);
+
+@pragma('dart2js:noInline')
+f_010_111_110_000_0(Set<String> u, int b) => v(u, '0101111100000', b);
+
+@pragma('dart2js:noInline')
+f_011_000_010_000_0(Set<String> u, int b) => v(u, '0110000100000', b);
+
+@pragma('dart2js:noInline')
+f_011_000_110_000_0(Set<String> u, int b) => v(u, '0110001100000', b);
+
+@pragma('dart2js:noInline')
+f_011_001_010_000_0(Set<String> u, int b) => v(u, '0110010100000', b);
+
+@pragma('dart2js:noInline')
+f_011_001_110_000_0(Set<String> u, int b) => v(u, '0110011100000', b);
+
+@pragma('dart2js:noInline')
+f_011_010_010_000_0(Set<String> u, int b) => v(u, '0110100100000', b);
+
+@pragma('dart2js:noInline')
+f_011_010_110_000_0(Set<String> u, int b) => v(u, '0110101100000', b);
+
+@pragma('dart2js:noInline')
+f_011_011_010_000_0(Set<String> u, int b) => v(u, '0110110100000', b);
+
+@pragma('dart2js:noInline')
+f_011_011_110_000_0(Set<String> u, int b) => v(u, '0110111100000', b);
+
+@pragma('dart2js:noInline')
+f_011_100_010_000_0(Set<String> u, int b) => v(u, '0111000100000', b);
+
+@pragma('dart2js:noInline')
+f_011_100_110_000_0(Set<String> u, int b) => v(u, '0111001100000', b);
+
+@pragma('dart2js:noInline')
+f_011_101_010_000_0(Set<String> u, int b) => v(u, '0111010100000', b);
+
+@pragma('dart2js:noInline')
+f_011_101_110_000_0(Set<String> u, int b) => v(u, '0111011100000', b);
+
+@pragma('dart2js:noInline')
+f_011_110_010_000_0(Set<String> u, int b) => v(u, '0111100100000', b);
+
+@pragma('dart2js:noInline')
+f_011_110_110_000_0(Set<String> u, int b) => v(u, '0111101100000', b);
+
+@pragma('dart2js:noInline')
+f_011_111_010_000_0(Set<String> u, int b) => v(u, '0111110100000', b);
+
+@pragma('dart2js:noInline')
+f_011_111_110_000_0(Set<String> u, int b) => v(u, '0111111100000', b);
+
+@pragma('dart2js:noInline')
+f_100_000_010_000_0(Set<String> u, int b) => v(u, '1000000100000', b);
+
+@pragma('dart2js:noInline')
+f_100_000_110_000_0(Set<String> u, int b) => v(u, '1000001100000', b);
+
+@pragma('dart2js:noInline')
+f_100_001_010_000_0(Set<String> u, int b) => v(u, '1000010100000', b);
+
+@pragma('dart2js:noInline')
+f_100_001_110_000_0(Set<String> u, int b) => v(u, '1000011100000', b);
+
+@pragma('dart2js:noInline')
+f_100_010_010_000_0(Set<String> u, int b) => v(u, '1000100100000', b);
+
+@pragma('dart2js:noInline')
+f_100_010_110_000_0(Set<String> u, int b) => v(u, '1000101100000', b);
+
+@pragma('dart2js:noInline')
+f_100_011_010_000_0(Set<String> u, int b) => v(u, '1000110100000', b);
+
+@pragma('dart2js:noInline')
+f_100_011_110_000_0(Set<String> u, int b) => v(u, '1000111100000', b);
+
+@pragma('dart2js:noInline')
+f_100_100_010_000_0(Set<String> u, int b) => v(u, '1001000100000', b);
+
+@pragma('dart2js:noInline')
+f_100_100_110_000_0(Set<String> u, int b) => v(u, '1001001100000', b);
+
+@pragma('dart2js:noInline')
+f_100_101_010_000_0(Set<String> u, int b) => v(u, '1001010100000', b);
+
+@pragma('dart2js:noInline')
+f_100_101_110_000_0(Set<String> u, int b) => v(u, '1001011100000', b);
+
+@pragma('dart2js:noInline')
+f_100_110_010_000_0(Set<String> u, int b) => v(u, '1001100100000', b);
+
+@pragma('dart2js:noInline')
+f_100_110_110_000_0(Set<String> u, int b) => v(u, '1001101100000', b);
+
+@pragma('dart2js:noInline')
+f_100_111_010_000_0(Set<String> u, int b) => v(u, '1001110100000', b);
+
+@pragma('dart2js:noInline')
+f_100_111_110_000_0(Set<String> u, int b) => v(u, '1001111100000', b);
+
+@pragma('dart2js:noInline')
+f_101_000_010_000_0(Set<String> u, int b) => v(u, '1010000100000', b);
+
+@pragma('dart2js:noInline')
+f_101_000_110_000_0(Set<String> u, int b) => v(u, '1010001100000', b);
+
+@pragma('dart2js:noInline')
+f_101_001_010_000_0(Set<String> u, int b) => v(u, '1010010100000', b);
+
+@pragma('dart2js:noInline')
+f_101_001_110_000_0(Set<String> u, int b) => v(u, '1010011100000', b);
+
+@pragma('dart2js:noInline')
+f_101_010_010_000_0(Set<String> u, int b) => v(u, '1010100100000', b);
+
+@pragma('dart2js:noInline')
+f_101_010_110_000_0(Set<String> u, int b) => v(u, '1010101100000', b);
+
+@pragma('dart2js:noInline')
+f_101_011_010_000_0(Set<String> u, int b) => v(u, '1010110100000', b);
+
+@pragma('dart2js:noInline')
+f_101_011_110_000_0(Set<String> u, int b) => v(u, '1010111100000', b);
+
+@pragma('dart2js:noInline')
+f_101_100_010_000_0(Set<String> u, int b) => v(u, '1011000100000', b);
+
+@pragma('dart2js:noInline')
+f_101_100_110_000_0(Set<String> u, int b) => v(u, '1011001100000', b);
+
+@pragma('dart2js:noInline')
+f_101_101_010_000_0(Set<String> u, int b) => v(u, '1011010100000', b);
+
+@pragma('dart2js:noInline')
+f_101_101_110_000_0(Set<String> u, int b) => v(u, '1011011100000', b);
+
+@pragma('dart2js:noInline')
+f_101_110_010_000_0(Set<String> u, int b) => v(u, '1011100100000', b);
+
+@pragma('dart2js:noInline')
+f_101_110_110_000_0(Set<String> u, int b) => v(u, '1011101100000', b);
+
+@pragma('dart2js:noInline')
+f_101_111_010_000_0(Set<String> u, int b) => v(u, '1011110100000', b);
+
+@pragma('dart2js:noInline')
+f_101_111_110_000_0(Set<String> u, int b) => v(u, '1011111100000', b);
+
+@pragma('dart2js:noInline')
+f_110_000_010_000_0(Set<String> u, int b) => v(u, '1100000100000', b);
+
+@pragma('dart2js:noInline')
+f_110_000_110_000_0(Set<String> u, int b) => v(u, '1100001100000', b);
+
+@pragma('dart2js:noInline')
+f_110_001_010_000_0(Set<String> u, int b) => v(u, '1100010100000', b);
+
+@pragma('dart2js:noInline')
+f_110_001_110_000_0(Set<String> u, int b) => v(u, '1100011100000', b);
+
+@pragma('dart2js:noInline')
+f_110_010_010_000_0(Set<String> u, int b) => v(u, '1100100100000', b);
+
+@pragma('dart2js:noInline')
+f_110_010_110_000_0(Set<String> u, int b) => v(u, '1100101100000', b);
+
+@pragma('dart2js:noInline')
+f_110_011_010_000_0(Set<String> u, int b) => v(u, '1100110100000', b);
+
+@pragma('dart2js:noInline')
+f_110_011_110_000_0(Set<String> u, int b) => v(u, '1100111100000', b);
+
+@pragma('dart2js:noInline')
+f_110_100_010_000_0(Set<String> u, int b) => v(u, '1101000100000', b);
+
+@pragma('dart2js:noInline')
+f_110_100_110_000_0(Set<String> u, int b) => v(u, '1101001100000', b);
+
+@pragma('dart2js:noInline')
+f_110_101_010_000_0(Set<String> u, int b) => v(u, '1101010100000', b);
+
+@pragma('dart2js:noInline')
+f_110_101_110_000_0(Set<String> u, int b) => v(u, '1101011100000', b);
+
+@pragma('dart2js:noInline')
+f_110_110_010_000_0(Set<String> u, int b) => v(u, '1101100100000', b);
+
+@pragma('dart2js:noInline')
+f_110_110_110_000_0(Set<String> u, int b) => v(u, '1101101100000', b);
+
+@pragma('dart2js:noInline')
+f_110_111_010_000_0(Set<String> u, int b) => v(u, '1101110100000', b);
+
+@pragma('dart2js:noInline')
+f_110_111_110_000_0(Set<String> u, int b) => v(u, '1101111100000', b);
+
+@pragma('dart2js:noInline')
+f_111_000_010_000_0(Set<String> u, int b) => v(u, '1110000100000', b);
+
+@pragma('dart2js:noInline')
+f_111_000_110_000_0(Set<String> u, int b) => v(u, '1110001100000', b);
+
+@pragma('dart2js:noInline')
+f_111_001_010_000_0(Set<String> u, int b) => v(u, '1110010100000', b);
+
+@pragma('dart2js:noInline')
+f_111_001_110_000_0(Set<String> u, int b) => v(u, '1110011100000', b);
+
+@pragma('dart2js:noInline')
+f_111_010_010_000_0(Set<String> u, int b) => v(u, '1110100100000', b);
+
+@pragma('dart2js:noInline')
+f_111_010_110_000_0(Set<String> u, int b) => v(u, '1110101100000', b);
+
+@pragma('dart2js:noInline')
+f_111_011_010_000_0(Set<String> u, int b) => v(u, '1110110100000', b);
+
+@pragma('dart2js:noInline')
+f_111_011_110_000_0(Set<String> u, int b) => v(u, '1110111100000', b);
+
+@pragma('dart2js:noInline')
+f_111_100_010_000_0(Set<String> u, int b) => v(u, '1111000100000', b);
+
+@pragma('dart2js:noInline')
+f_111_100_110_000_0(Set<String> u, int b) => v(u, '1111001100000', b);
+
+@pragma('dart2js:noInline')
+f_111_101_010_000_0(Set<String> u, int b) => v(u, '1111010100000', b);
+
+@pragma('dart2js:noInline')
+f_111_101_110_000_0(Set<String> u, int b) => v(u, '1111011100000', b);
+
+@pragma('dart2js:noInline')
+f_111_110_010_000_0(Set<String> u, int b) => v(u, '1111100100000', b);
+
+@pragma('dart2js:noInline')
+f_111_110_110_000_0(Set<String> u, int b) => v(u, '1111101100000', b);
+
+@pragma('dart2js:noInline')
+f_111_111_010_000_0(Set<String> u, int b) => v(u, '1111110100000', b);
+
+@pragma('dart2js:noInline')
+f_111_111_110_000_0(Set<String> u, int b) => v(u, '1111111100000', b);
+
+@pragma('dart2js:noInline')
+f_000_000_100_000_0(Set<String> u, int b) => v(u, '0000001000000', b);
+
+@pragma('dart2js:noInline')
+f_000_001_100_000_0(Set<String> u, int b) => v(u, '0000011000000', b);
+
+@pragma('dart2js:noInline')
+f_000_010_100_000_0(Set<String> u, int b) => v(u, '0000101000000', b);
+
+@pragma('dart2js:noInline')
+f_000_011_100_000_0(Set<String> u, int b) => v(u, '0000111000000', b);
+
+@pragma('dart2js:noInline')
+f_000_100_100_000_0(Set<String> u, int b) => v(u, '0001001000000', b);
+
+@pragma('dart2js:noInline')
+f_000_101_100_000_0(Set<String> u, int b) => v(u, '0001011000000', b);
+
+@pragma('dart2js:noInline')
+f_000_110_100_000_0(Set<String> u, int b) => v(u, '0001101000000', b);
+
+@pragma('dart2js:noInline')
+f_000_111_100_000_0(Set<String> u, int b) => v(u, '0001111000000', b);
+
+@pragma('dart2js:noInline')
+f_001_000_100_000_0(Set<String> u, int b) => v(u, '0010001000000', b);
+
+@pragma('dart2js:noInline')
+f_001_001_100_000_0(Set<String> u, int b) => v(u, '0010011000000', b);
+
+@pragma('dart2js:noInline')
+f_001_010_100_000_0(Set<String> u, int b) => v(u, '0010101000000', b);
+
+@pragma('dart2js:noInline')
+f_001_011_100_000_0(Set<String> u, int b) => v(u, '0010111000000', b);
+
+@pragma('dart2js:noInline')
+f_001_100_100_000_0(Set<String> u, int b) => v(u, '0011001000000', b);
+
+@pragma('dart2js:noInline')
+f_001_101_100_000_0(Set<String> u, int b) => v(u, '0011011000000', b);
+
+@pragma('dart2js:noInline')
+f_001_110_100_000_0(Set<String> u, int b) => v(u, '0011101000000', b);
+
+@pragma('dart2js:noInline')
+f_001_111_100_000_0(Set<String> u, int b) => v(u, '0011111000000', b);
+
+@pragma('dart2js:noInline')
+f_010_000_100_000_0(Set<String> u, int b) => v(u, '0100001000000', b);
+
+@pragma('dart2js:noInline')
+f_010_001_100_000_0(Set<String> u, int b) => v(u, '0100011000000', b);
+
+@pragma('dart2js:noInline')
+f_010_010_100_000_0(Set<String> u, int b) => v(u, '0100101000000', b);
+
+@pragma('dart2js:noInline')
+f_010_011_100_000_0(Set<String> u, int b) => v(u, '0100111000000', b);
+
+@pragma('dart2js:noInline')
+f_010_100_100_000_0(Set<String> u, int b) => v(u, '0101001000000', b);
+
+@pragma('dart2js:noInline')
+f_010_101_100_000_0(Set<String> u, int b) => v(u, '0101011000000', b);
+
+@pragma('dart2js:noInline')
+f_010_110_100_000_0(Set<String> u, int b) => v(u, '0101101000000', b);
+
+@pragma('dart2js:noInline')
+f_010_111_100_000_0(Set<String> u, int b) => v(u, '0101111000000', b);
+
+@pragma('dart2js:noInline')
+f_011_000_100_000_0(Set<String> u, int b) => v(u, '0110001000000', b);
+
+@pragma('dart2js:noInline')
+f_011_001_100_000_0(Set<String> u, int b) => v(u, '0110011000000', b);
+
+@pragma('dart2js:noInline')
+f_011_010_100_000_0(Set<String> u, int b) => v(u, '0110101000000', b);
+
+@pragma('dart2js:noInline')
+f_011_011_100_000_0(Set<String> u, int b) => v(u, '0110111000000', b);
+
+@pragma('dart2js:noInline')
+f_011_100_100_000_0(Set<String> u, int b) => v(u, '0111001000000', b);
+
+@pragma('dart2js:noInline')
+f_011_101_100_000_0(Set<String> u, int b) => v(u, '0111011000000', b);
+
+@pragma('dart2js:noInline')
+f_011_110_100_000_0(Set<String> u, int b) => v(u, '0111101000000', b);
+
+@pragma('dart2js:noInline')
+f_011_111_100_000_0(Set<String> u, int b) => v(u, '0111111000000', b);
+
+@pragma('dart2js:noInline')
+f_100_000_100_000_0(Set<String> u, int b) => v(u, '1000001000000', b);
+
+@pragma('dart2js:noInline')
+f_100_001_100_000_0(Set<String> u, int b) => v(u, '1000011000000', b);
+
+@pragma('dart2js:noInline')
+f_100_010_100_000_0(Set<String> u, int b) => v(u, '1000101000000', b);
+
+@pragma('dart2js:noInline')
+f_100_011_100_000_0(Set<String> u, int b) => v(u, '1000111000000', b);
+
+@pragma('dart2js:noInline')
+f_100_100_100_000_0(Set<String> u, int b) => v(u, '1001001000000', b);
+
+@pragma('dart2js:noInline')
+f_100_101_100_000_0(Set<String> u, int b) => v(u, '1001011000000', b);
+
+@pragma('dart2js:noInline')
+f_100_110_100_000_0(Set<String> u, int b) => v(u, '1001101000000', b);
+
+@pragma('dart2js:noInline')
+f_100_111_100_000_0(Set<String> u, int b) => v(u, '1001111000000', b);
+
+@pragma('dart2js:noInline')
+f_101_000_100_000_0(Set<String> u, int b) => v(u, '1010001000000', b);
+
+@pragma('dart2js:noInline')
+f_101_001_100_000_0(Set<String> u, int b) => v(u, '1010011000000', b);
+
+@pragma('dart2js:noInline')
+f_101_010_100_000_0(Set<String> u, int b) => v(u, '1010101000000', b);
+
+@pragma('dart2js:noInline')
+f_101_011_100_000_0(Set<String> u, int b) => v(u, '1010111000000', b);
+
+@pragma('dart2js:noInline')
+f_101_100_100_000_0(Set<String> u, int b) => v(u, '1011001000000', b);
+
+@pragma('dart2js:noInline')
+f_101_101_100_000_0(Set<String> u, int b) => v(u, '1011011000000', b);
+
+@pragma('dart2js:noInline')
+f_101_110_100_000_0(Set<String> u, int b) => v(u, '1011101000000', b);
+
+@pragma('dart2js:noInline')
+f_101_111_100_000_0(Set<String> u, int b) => v(u, '1011111000000', b);
+
+@pragma('dart2js:noInline')
+f_110_000_100_000_0(Set<String> u, int b) => v(u, '1100001000000', b);
+
+@pragma('dart2js:noInline')
+f_110_001_100_000_0(Set<String> u, int b) => v(u, '1100011000000', b);
+
+@pragma('dart2js:noInline')
+f_110_010_100_000_0(Set<String> u, int b) => v(u, '1100101000000', b);
+
+@pragma('dart2js:noInline')
+f_110_011_100_000_0(Set<String> u, int b) => v(u, '1100111000000', b);
+
+@pragma('dart2js:noInline')
+f_110_100_100_000_0(Set<String> u, int b) => v(u, '1101001000000', b);
+
+@pragma('dart2js:noInline')
+f_110_101_100_000_0(Set<String> u, int b) => v(u, '1101011000000', b);
+
+@pragma('dart2js:noInline')
+f_110_110_100_000_0(Set<String> u, int b) => v(u, '1101101000000', b);
+
+@pragma('dart2js:noInline')
+f_110_111_100_000_0(Set<String> u, int b) => v(u, '1101111000000', b);
+
+@pragma('dart2js:noInline')
+f_111_000_100_000_0(Set<String> u, int b) => v(u, '1110001000000', b);
+
+@pragma('dart2js:noInline')
+f_111_001_100_000_0(Set<String> u, int b) => v(u, '1110011000000', b);
+
+@pragma('dart2js:noInline')
+f_111_010_100_000_0(Set<String> u, int b) => v(u, '1110101000000', b);
+
+@pragma('dart2js:noInline')
+f_111_011_100_000_0(Set<String> u, int b) => v(u, '1110111000000', b);
+
+@pragma('dart2js:noInline')
+f_111_100_100_000_0(Set<String> u, int b) => v(u, '1111001000000', b);
+
+@pragma('dart2js:noInline')
+f_111_101_100_000_0(Set<String> u, int b) => v(u, '1111011000000', b);
+
+@pragma('dart2js:noInline')
+f_111_110_100_000_0(Set<String> u, int b) => v(u, '1111101000000', b);
+
+@pragma('dart2js:noInline')
+f_111_111_100_000_0(Set<String> u, int b) => v(u, '1111111000000', b);
+
+@pragma('dart2js:noInline')
+f_000_001_000_000_0(Set<String> u, int b) => v(u, '0000010000000', b);
+
+@pragma('dart2js:noInline')
+f_000_011_000_000_0(Set<String> u, int b) => v(u, '0000110000000', b);
+
+@pragma('dart2js:noInline')
+f_000_101_000_000_0(Set<String> u, int b) => v(u, '0001010000000', b);
+
+@pragma('dart2js:noInline')
+f_000_111_000_000_0(Set<String> u, int b) => v(u, '0001110000000', b);
+
+@pragma('dart2js:noInline')
+f_001_001_000_000_0(Set<String> u, int b) => v(u, '0010010000000', b);
+
+@pragma('dart2js:noInline')
+f_001_011_000_000_0(Set<String> u, int b) => v(u, '0010110000000', b);
+
+@pragma('dart2js:noInline')
+f_001_101_000_000_0(Set<String> u, int b) => v(u, '0011010000000', b);
+
+@pragma('dart2js:noInline')
+f_001_111_000_000_0(Set<String> u, int b) => v(u, '0011110000000', b);
+
+@pragma('dart2js:noInline')
+f_010_001_000_000_0(Set<String> u, int b) => v(u, '0100010000000', b);
+
+@pragma('dart2js:noInline')
+f_010_011_000_000_0(Set<String> u, int b) => v(u, '0100110000000', b);
+
+@pragma('dart2js:noInline')
+f_010_101_000_000_0(Set<String> u, int b) => v(u, '0101010000000', b);
+
+@pragma('dart2js:noInline')
+f_010_111_000_000_0(Set<String> u, int b) => v(u, '0101110000000', b);
+
+@pragma('dart2js:noInline')
+f_011_001_000_000_0(Set<String> u, int b) => v(u, '0110010000000', b);
+
+@pragma('dart2js:noInline')
+f_011_011_000_000_0(Set<String> u, int b) => v(u, '0110110000000', b);
+
+@pragma('dart2js:noInline')
+f_011_101_000_000_0(Set<String> u, int b) => v(u, '0111010000000', b);
+
+@pragma('dart2js:noInline')
+f_011_111_000_000_0(Set<String> u, int b) => v(u, '0111110000000', b);
+
+@pragma('dart2js:noInline')
+f_100_001_000_000_0(Set<String> u, int b) => v(u, '1000010000000', b);
+
+@pragma('dart2js:noInline')
+f_100_011_000_000_0(Set<String> u, int b) => v(u, '1000110000000', b);
+
+@pragma('dart2js:noInline')
+f_100_101_000_000_0(Set<String> u, int b) => v(u, '1001010000000', b);
+
+@pragma('dart2js:noInline')
+f_100_111_000_000_0(Set<String> u, int b) => v(u, '1001110000000', b);
+
+@pragma('dart2js:noInline')
+f_101_001_000_000_0(Set<String> u, int b) => v(u, '1010010000000', b);
+
+@pragma('dart2js:noInline')
+f_101_011_000_000_0(Set<String> u, int b) => v(u, '1010110000000', b);
+
+@pragma('dart2js:noInline')
+f_101_101_000_000_0(Set<String> u, int b) => v(u, '1011010000000', b);
+
+@pragma('dart2js:noInline')
+f_101_111_000_000_0(Set<String> u, int b) => v(u, '1011110000000', b);
+
+@pragma('dart2js:noInline')
+f_110_001_000_000_0(Set<String> u, int b) => v(u, '1100010000000', b);
+
+@pragma('dart2js:noInline')
+f_110_011_000_000_0(Set<String> u, int b) => v(u, '1100110000000', b);
+
+@pragma('dart2js:noInline')
+f_110_101_000_000_0(Set<String> u, int b) => v(u, '1101010000000', b);
+
+@pragma('dart2js:noInline')
+f_110_111_000_000_0(Set<String> u, int b) => v(u, '1101110000000', b);
+
+@pragma('dart2js:noInline')
+f_111_001_000_000_0(Set<String> u, int b) => v(u, '1110010000000', b);
+
+@pragma('dart2js:noInline')
+f_111_011_000_000_0(Set<String> u, int b) => v(u, '1110110000000', b);
+
+@pragma('dart2js:noInline')
+f_111_101_000_000_0(Set<String> u, int b) => v(u, '1111010000000', b);
+
+@pragma('dart2js:noInline')
+f_111_111_000_000_0(Set<String> u, int b) => v(u, '1111110000000', b);
+
+@pragma('dart2js:noInline')
+f_000_010_000_000_0(Set<String> u, int b) => v(u, '0000100000000', b);
+
+@pragma('dart2js:noInline')
+f_000_110_000_000_0(Set<String> u, int b) => v(u, '0001100000000', b);
+
+@pragma('dart2js:noInline')
+f_001_010_000_000_0(Set<String> u, int b) => v(u, '0010100000000', b);
+
+@pragma('dart2js:noInline')
+f_001_110_000_000_0(Set<String> u, int b) => v(u, '0011100000000', b);
+
+@pragma('dart2js:noInline')
+f_010_010_000_000_0(Set<String> u, int b) => v(u, '0100100000000', b);
+
+@pragma('dart2js:noInline')
+f_010_110_000_000_0(Set<String> u, int b) => v(u, '0101100000000', b);
+
+@pragma('dart2js:noInline')
+f_011_010_000_000_0(Set<String> u, int b) => v(u, '0110100000000', b);
+
+@pragma('dart2js:noInline')
+f_011_110_000_000_0(Set<String> u, int b) => v(u, '0111100000000', b);
+
+@pragma('dart2js:noInline')
+f_100_010_000_000_0(Set<String> u, int b) => v(u, '1000100000000', b);
+
+@pragma('dart2js:noInline')
+f_100_110_000_000_0(Set<String> u, int b) => v(u, '1001100000000', b);
+
+@pragma('dart2js:noInline')
+f_101_010_000_000_0(Set<String> u, int b) => v(u, '1010100000000', b);
+
+@pragma('dart2js:noInline')
+f_101_110_000_000_0(Set<String> u, int b) => v(u, '1011100000000', b);
+
+@pragma('dart2js:noInline')
+f_110_010_000_000_0(Set<String> u, int b) => v(u, '1100100000000', b);
+
+@pragma('dart2js:noInline')
+f_110_110_000_000_0(Set<String> u, int b) => v(u, '1101100000000', b);
+
+@pragma('dart2js:noInline')
+f_111_010_000_000_0(Set<String> u, int b) => v(u, '1110100000000', b);
+
+@pragma('dart2js:noInline')
+f_111_110_000_000_0(Set<String> u, int b) => v(u, '1111100000000', b);
+
+@pragma('dart2js:noInline')
+f_000_100_000_000_0(Set<String> u, int b) => v(u, '0001000000000', b);
+
+@pragma('dart2js:noInline')
+f_001_100_000_000_0(Set<String> u, int b) => v(u, '0011000000000', b);
+
+@pragma('dart2js:noInline')
+f_010_100_000_000_0(Set<String> u, int b) => v(u, '0101000000000', b);
+
+@pragma('dart2js:noInline')
+f_011_100_000_000_0(Set<String> u, int b) => v(u, '0111000000000', b);
+
+@pragma('dart2js:noInline')
+f_100_100_000_000_0(Set<String> u, int b) => v(u, '1001000000000', b);
+
+@pragma('dart2js:noInline')
+f_101_100_000_000_0(Set<String> u, int b) => v(u, '1011000000000', b);
+
+@pragma('dart2js:noInline')
+f_110_100_000_000_0(Set<String> u, int b) => v(u, '1101000000000', b);
+
+@pragma('dart2js:noInline')
+f_111_100_000_000_0(Set<String> u, int b) => v(u, '1111000000000', b);
+
+@pragma('dart2js:noInline')
+f_001_000_000_000_0(Set<String> u, int b) => v(u, '0010000000000', b);
+
+@pragma('dart2js:noInline')
+f_011_000_000_000_0(Set<String> u, int b) => v(u, '0110000000000', b);
+
+@pragma('dart2js:noInline')
+f_101_000_000_000_0(Set<String> u, int b) => v(u, '1010000000000', b);
+
+@pragma('dart2js:noInline')
+f_111_000_000_000_0(Set<String> u, int b) => v(u, '1110000000000', b);
+
+@pragma('dart2js:noInline')
+f_010_000_000_000_0(Set<String> u, int b) => v(u, '0100000000000', b);
+
+@pragma('dart2js:noInline')
+f_110_000_000_000_0(Set<String> u, int b) => v(u, '1100000000000', b);
+
+@pragma('dart2js:noInline')
+f_100_000_000_000_0(Set<String> u, int b) => v(u, '1000000000000', b);
diff --git a/tests/dart2js/deferred/many_parts/lib_000_000_000_000_1.dart b/tests/dart2js/deferred/many_parts/lib_000_000_000_000_1.dart
new file mode 100644
index 0000000..10cfa68
--- /dev/null
+++ b/tests/dart2js/deferred/many_parts/lib_000_000_000_000_1.dart
@@ -0,0 +1,4111 @@
+// Copyright (c) 2020, 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:expect/expect.dart";
+
+import 'libB.dart';
+
+@pragma('dart2js:noInline')
+g_000_000_000_000_1() {
+  Set<String> uniques = {};
+
+  // f_***_***_***_***_1;
+  f_000_000_000_000_1(uniques, 12);
+  f_000_000_000_001_1(uniques, 12);
+  f_000_000_000_010_1(uniques, 12);
+  f_000_000_000_011_1(uniques, 12);
+  f_000_000_000_100_1(uniques, 12);
+  f_000_000_000_101_1(uniques, 12);
+  f_000_000_000_110_1(uniques, 12);
+  f_000_000_000_111_1(uniques, 12);
+  f_000_000_001_000_1(uniques, 12);
+  f_000_000_001_001_1(uniques, 12);
+  f_000_000_001_010_1(uniques, 12);
+  f_000_000_001_011_1(uniques, 12);
+  f_000_000_001_100_1(uniques, 12);
+  f_000_000_001_101_1(uniques, 12);
+  f_000_000_001_110_1(uniques, 12);
+  f_000_000_001_111_1(uniques, 12);
+  f_000_000_010_000_1(uniques, 12);
+  f_000_000_010_001_1(uniques, 12);
+  f_000_000_010_010_1(uniques, 12);
+  f_000_000_010_011_1(uniques, 12);
+  f_000_000_010_100_1(uniques, 12);
+  f_000_000_010_101_1(uniques, 12);
+  f_000_000_010_110_1(uniques, 12);
+  f_000_000_010_111_1(uniques, 12);
+  f_000_000_011_000_1(uniques, 12);
+  f_000_000_011_001_1(uniques, 12);
+  f_000_000_011_010_1(uniques, 12);
+  f_000_000_011_011_1(uniques, 12);
+  f_000_000_011_100_1(uniques, 12);
+  f_000_000_011_101_1(uniques, 12);
+  f_000_000_011_110_1(uniques, 12);
+  f_000_000_011_111_1(uniques, 12);
+  f_000_000_100_000_1(uniques, 12);
+  f_000_000_100_001_1(uniques, 12);
+  f_000_000_100_010_1(uniques, 12);
+  f_000_000_100_011_1(uniques, 12);
+  f_000_000_100_100_1(uniques, 12);
+  f_000_000_100_101_1(uniques, 12);
+  f_000_000_100_110_1(uniques, 12);
+  f_000_000_100_111_1(uniques, 12);
+  f_000_000_101_000_1(uniques, 12);
+  f_000_000_101_001_1(uniques, 12);
+  f_000_000_101_010_1(uniques, 12);
+  f_000_000_101_011_1(uniques, 12);
+  f_000_000_101_100_1(uniques, 12);
+  f_000_000_101_101_1(uniques, 12);
+  f_000_000_101_110_1(uniques, 12);
+  f_000_000_101_111_1(uniques, 12);
+  f_000_000_110_000_1(uniques, 12);
+  f_000_000_110_001_1(uniques, 12);
+  f_000_000_110_010_1(uniques, 12);
+  f_000_000_110_011_1(uniques, 12);
+  f_000_000_110_100_1(uniques, 12);
+  f_000_000_110_101_1(uniques, 12);
+  f_000_000_110_110_1(uniques, 12);
+  f_000_000_110_111_1(uniques, 12);
+  f_000_000_111_000_1(uniques, 12);
+  f_000_000_111_001_1(uniques, 12);
+  f_000_000_111_010_1(uniques, 12);
+  f_000_000_111_011_1(uniques, 12);
+  f_000_000_111_100_1(uniques, 12);
+  f_000_000_111_101_1(uniques, 12);
+  f_000_000_111_110_1(uniques, 12);
+  f_000_000_111_111_1(uniques, 12);
+  f_000_001_000_000_1(uniques, 12);
+  f_000_001_000_001_1(uniques, 12);
+  f_000_001_000_010_1(uniques, 12);
+  f_000_001_000_011_1(uniques, 12);
+  f_000_001_000_100_1(uniques, 12);
+  f_000_001_000_101_1(uniques, 12);
+  f_000_001_000_110_1(uniques, 12);
+  f_000_001_000_111_1(uniques, 12);
+  f_000_001_001_000_1(uniques, 12);
+  f_000_001_001_001_1(uniques, 12);
+  f_000_001_001_010_1(uniques, 12);
+  f_000_001_001_011_1(uniques, 12);
+  f_000_001_001_100_1(uniques, 12);
+  f_000_001_001_101_1(uniques, 12);
+  f_000_001_001_110_1(uniques, 12);
+  f_000_001_001_111_1(uniques, 12);
+  f_000_001_010_000_1(uniques, 12);
+  f_000_001_010_001_1(uniques, 12);
+  f_000_001_010_010_1(uniques, 12);
+  f_000_001_010_011_1(uniques, 12);
+  f_000_001_010_100_1(uniques, 12);
+  f_000_001_010_101_1(uniques, 12);
+  f_000_001_010_110_1(uniques, 12);
+  f_000_001_010_111_1(uniques, 12);
+  f_000_001_011_000_1(uniques, 12);
+  f_000_001_011_001_1(uniques, 12);
+  f_000_001_011_010_1(uniques, 12);
+  f_000_001_011_011_1(uniques, 12);
+  f_000_001_011_100_1(uniques, 12);
+  f_000_001_011_101_1(uniques, 12);
+  f_000_001_011_110_1(uniques, 12);
+  f_000_001_011_111_1(uniques, 12);
+  f_000_001_100_000_1(uniques, 12);
+  f_000_001_100_001_1(uniques, 12);
+  f_000_001_100_010_1(uniques, 12);
+  f_000_001_100_011_1(uniques, 12);
+  f_000_001_100_100_1(uniques, 12);
+  f_000_001_100_101_1(uniques, 12);
+  f_000_001_100_110_1(uniques, 12);
+  f_000_001_100_111_1(uniques, 12);
+  f_000_001_101_000_1(uniques, 12);
+  f_000_001_101_001_1(uniques, 12);
+  f_000_001_101_010_1(uniques, 12);
+  f_000_001_101_011_1(uniques, 12);
+  f_000_001_101_100_1(uniques, 12);
+  f_000_001_101_101_1(uniques, 12);
+  f_000_001_101_110_1(uniques, 12);
+  f_000_001_101_111_1(uniques, 12);
+  f_000_001_110_000_1(uniques, 12);
+  f_000_001_110_001_1(uniques, 12);
+  f_000_001_110_010_1(uniques, 12);
+  f_000_001_110_011_1(uniques, 12);
+  f_000_001_110_100_1(uniques, 12);
+  f_000_001_110_101_1(uniques, 12);
+  f_000_001_110_110_1(uniques, 12);
+  f_000_001_110_111_1(uniques, 12);
+  f_000_001_111_000_1(uniques, 12);
+  f_000_001_111_001_1(uniques, 12);
+  f_000_001_111_010_1(uniques, 12);
+  f_000_001_111_011_1(uniques, 12);
+  f_000_001_111_100_1(uniques, 12);
+  f_000_001_111_101_1(uniques, 12);
+  f_000_001_111_110_1(uniques, 12);
+  f_000_001_111_111_1(uniques, 12);
+  f_000_010_000_000_1(uniques, 12);
+  f_000_010_000_001_1(uniques, 12);
+  f_000_010_000_010_1(uniques, 12);
+  f_000_010_000_011_1(uniques, 12);
+  f_000_010_000_100_1(uniques, 12);
+  f_000_010_000_101_1(uniques, 12);
+  f_000_010_000_110_1(uniques, 12);
+  f_000_010_000_111_1(uniques, 12);
+  f_000_010_001_000_1(uniques, 12);
+  f_000_010_001_001_1(uniques, 12);
+  f_000_010_001_010_1(uniques, 12);
+  f_000_010_001_011_1(uniques, 12);
+  f_000_010_001_100_1(uniques, 12);
+  f_000_010_001_101_1(uniques, 12);
+  f_000_010_001_110_1(uniques, 12);
+  f_000_010_001_111_1(uniques, 12);
+  f_000_010_010_000_1(uniques, 12);
+  f_000_010_010_001_1(uniques, 12);
+  f_000_010_010_010_1(uniques, 12);
+  f_000_010_010_011_1(uniques, 12);
+  f_000_010_010_100_1(uniques, 12);
+  f_000_010_010_101_1(uniques, 12);
+  f_000_010_010_110_1(uniques, 12);
+  f_000_010_010_111_1(uniques, 12);
+  f_000_010_011_000_1(uniques, 12);
+  f_000_010_011_001_1(uniques, 12);
+  f_000_010_011_010_1(uniques, 12);
+  f_000_010_011_011_1(uniques, 12);
+  f_000_010_011_100_1(uniques, 12);
+  f_000_010_011_101_1(uniques, 12);
+  f_000_010_011_110_1(uniques, 12);
+  f_000_010_011_111_1(uniques, 12);
+  f_000_010_100_000_1(uniques, 12);
+  f_000_010_100_001_1(uniques, 12);
+  f_000_010_100_010_1(uniques, 12);
+  f_000_010_100_011_1(uniques, 12);
+  f_000_010_100_100_1(uniques, 12);
+  f_000_010_100_101_1(uniques, 12);
+  f_000_010_100_110_1(uniques, 12);
+  f_000_010_100_111_1(uniques, 12);
+  f_000_010_101_000_1(uniques, 12);
+  f_000_010_101_001_1(uniques, 12);
+  f_000_010_101_010_1(uniques, 12);
+  f_000_010_101_011_1(uniques, 12);
+  f_000_010_101_100_1(uniques, 12);
+  f_000_010_101_101_1(uniques, 12);
+  f_000_010_101_110_1(uniques, 12);
+  f_000_010_101_111_1(uniques, 12);
+  f_000_010_110_000_1(uniques, 12);
+  f_000_010_110_001_1(uniques, 12);
+  f_000_010_110_010_1(uniques, 12);
+  f_000_010_110_011_1(uniques, 12);
+  f_000_010_110_100_1(uniques, 12);
+  f_000_010_110_101_1(uniques, 12);
+  f_000_010_110_110_1(uniques, 12);
+  f_000_010_110_111_1(uniques, 12);
+  f_000_010_111_000_1(uniques, 12);
+  f_000_010_111_001_1(uniques, 12);
+  f_000_010_111_010_1(uniques, 12);
+  f_000_010_111_011_1(uniques, 12);
+  f_000_010_111_100_1(uniques, 12);
+  f_000_010_111_101_1(uniques, 12);
+  f_000_010_111_110_1(uniques, 12);
+  f_000_010_111_111_1(uniques, 12);
+  f_000_011_000_000_1(uniques, 12);
+  f_000_011_000_001_1(uniques, 12);
+  f_000_011_000_010_1(uniques, 12);
+  f_000_011_000_011_1(uniques, 12);
+  f_000_011_000_100_1(uniques, 12);
+  f_000_011_000_101_1(uniques, 12);
+  f_000_011_000_110_1(uniques, 12);
+  f_000_011_000_111_1(uniques, 12);
+  f_000_011_001_000_1(uniques, 12);
+  f_000_011_001_001_1(uniques, 12);
+  f_000_011_001_010_1(uniques, 12);
+  f_000_011_001_011_1(uniques, 12);
+  f_000_011_001_100_1(uniques, 12);
+  f_000_011_001_101_1(uniques, 12);
+  f_000_011_001_110_1(uniques, 12);
+  f_000_011_001_111_1(uniques, 12);
+  f_000_011_010_000_1(uniques, 12);
+  f_000_011_010_001_1(uniques, 12);
+  f_000_011_010_010_1(uniques, 12);
+  f_000_011_010_011_1(uniques, 12);
+  f_000_011_010_100_1(uniques, 12);
+  f_000_011_010_101_1(uniques, 12);
+  f_000_011_010_110_1(uniques, 12);
+  f_000_011_010_111_1(uniques, 12);
+  f_000_011_011_000_1(uniques, 12);
+  f_000_011_011_001_1(uniques, 12);
+  f_000_011_011_010_1(uniques, 12);
+  f_000_011_011_011_1(uniques, 12);
+  f_000_011_011_100_1(uniques, 12);
+  f_000_011_011_101_1(uniques, 12);
+  f_000_011_011_110_1(uniques, 12);
+  f_000_011_011_111_1(uniques, 12);
+  f_000_011_100_000_1(uniques, 12);
+  f_000_011_100_001_1(uniques, 12);
+  f_000_011_100_010_1(uniques, 12);
+  f_000_011_100_011_1(uniques, 12);
+  f_000_011_100_100_1(uniques, 12);
+  f_000_011_100_101_1(uniques, 12);
+  f_000_011_100_110_1(uniques, 12);
+  f_000_011_100_111_1(uniques, 12);
+  f_000_011_101_000_1(uniques, 12);
+  f_000_011_101_001_1(uniques, 12);
+  f_000_011_101_010_1(uniques, 12);
+  f_000_011_101_011_1(uniques, 12);
+  f_000_011_101_100_1(uniques, 12);
+  f_000_011_101_101_1(uniques, 12);
+  f_000_011_101_110_1(uniques, 12);
+  f_000_011_101_111_1(uniques, 12);
+  f_000_011_110_000_1(uniques, 12);
+  f_000_011_110_001_1(uniques, 12);
+  f_000_011_110_010_1(uniques, 12);
+  f_000_011_110_011_1(uniques, 12);
+  f_000_011_110_100_1(uniques, 12);
+  f_000_011_110_101_1(uniques, 12);
+  f_000_011_110_110_1(uniques, 12);
+  f_000_011_110_111_1(uniques, 12);
+  f_000_011_111_000_1(uniques, 12);
+  f_000_011_111_001_1(uniques, 12);
+  f_000_011_111_010_1(uniques, 12);
+  f_000_011_111_011_1(uniques, 12);
+  f_000_011_111_100_1(uniques, 12);
+  f_000_011_111_101_1(uniques, 12);
+  f_000_011_111_110_1(uniques, 12);
+  f_000_011_111_111_1(uniques, 12);
+  f_000_100_000_000_1(uniques, 12);
+  f_000_100_000_001_1(uniques, 12);
+  f_000_100_000_010_1(uniques, 12);
+  f_000_100_000_011_1(uniques, 12);
+  f_000_100_000_100_1(uniques, 12);
+  f_000_100_000_101_1(uniques, 12);
+  f_000_100_000_110_1(uniques, 12);
+  f_000_100_000_111_1(uniques, 12);
+  f_000_100_001_000_1(uniques, 12);
+  f_000_100_001_001_1(uniques, 12);
+  f_000_100_001_010_1(uniques, 12);
+  f_000_100_001_011_1(uniques, 12);
+  f_000_100_001_100_1(uniques, 12);
+  f_000_100_001_101_1(uniques, 12);
+  f_000_100_001_110_1(uniques, 12);
+  f_000_100_001_111_1(uniques, 12);
+  f_000_100_010_000_1(uniques, 12);
+  f_000_100_010_001_1(uniques, 12);
+  f_000_100_010_010_1(uniques, 12);
+  f_000_100_010_011_1(uniques, 12);
+  f_000_100_010_100_1(uniques, 12);
+  f_000_100_010_101_1(uniques, 12);
+  f_000_100_010_110_1(uniques, 12);
+  f_000_100_010_111_1(uniques, 12);
+  f_000_100_011_000_1(uniques, 12);
+  f_000_100_011_001_1(uniques, 12);
+  f_000_100_011_010_1(uniques, 12);
+  f_000_100_011_011_1(uniques, 12);
+  f_000_100_011_100_1(uniques, 12);
+  f_000_100_011_101_1(uniques, 12);
+  f_000_100_011_110_1(uniques, 12);
+  f_000_100_011_111_1(uniques, 12);
+  f_000_100_100_000_1(uniques, 12);
+  f_000_100_100_001_1(uniques, 12);
+  f_000_100_100_010_1(uniques, 12);
+  f_000_100_100_011_1(uniques, 12);
+  f_000_100_100_100_1(uniques, 12);
+  f_000_100_100_101_1(uniques, 12);
+  f_000_100_100_110_1(uniques, 12);
+  f_000_100_100_111_1(uniques, 12);
+  f_000_100_101_000_1(uniques, 12);
+  f_000_100_101_001_1(uniques, 12);
+  f_000_100_101_010_1(uniques, 12);
+  f_000_100_101_011_1(uniques, 12);
+  f_000_100_101_100_1(uniques, 12);
+  f_000_100_101_101_1(uniques, 12);
+  f_000_100_101_110_1(uniques, 12);
+  f_000_100_101_111_1(uniques, 12);
+  f_000_100_110_000_1(uniques, 12);
+  f_000_100_110_001_1(uniques, 12);
+  f_000_100_110_010_1(uniques, 12);
+  f_000_100_110_011_1(uniques, 12);
+  f_000_100_110_100_1(uniques, 12);
+  f_000_100_110_101_1(uniques, 12);
+  f_000_100_110_110_1(uniques, 12);
+  f_000_100_110_111_1(uniques, 12);
+  f_000_100_111_000_1(uniques, 12);
+  f_000_100_111_001_1(uniques, 12);
+  f_000_100_111_010_1(uniques, 12);
+  f_000_100_111_011_1(uniques, 12);
+  f_000_100_111_100_1(uniques, 12);
+  f_000_100_111_101_1(uniques, 12);
+  f_000_100_111_110_1(uniques, 12);
+  f_000_100_111_111_1(uniques, 12);
+  f_000_101_000_000_1(uniques, 12);
+  f_000_101_000_001_1(uniques, 12);
+  f_000_101_000_010_1(uniques, 12);
+  f_000_101_000_011_1(uniques, 12);
+  f_000_101_000_100_1(uniques, 12);
+  f_000_101_000_101_1(uniques, 12);
+  f_000_101_000_110_1(uniques, 12);
+  f_000_101_000_111_1(uniques, 12);
+  f_000_101_001_000_1(uniques, 12);
+  f_000_101_001_001_1(uniques, 12);
+  f_000_101_001_010_1(uniques, 12);
+  f_000_101_001_011_1(uniques, 12);
+  f_000_101_001_100_1(uniques, 12);
+  f_000_101_001_101_1(uniques, 12);
+  f_000_101_001_110_1(uniques, 12);
+  f_000_101_001_111_1(uniques, 12);
+  f_000_101_010_000_1(uniques, 12);
+  f_000_101_010_001_1(uniques, 12);
+  f_000_101_010_010_1(uniques, 12);
+  f_000_101_010_011_1(uniques, 12);
+  f_000_101_010_100_1(uniques, 12);
+  f_000_101_010_101_1(uniques, 12);
+  f_000_101_010_110_1(uniques, 12);
+  f_000_101_010_111_1(uniques, 12);
+  f_000_101_011_000_1(uniques, 12);
+  f_000_101_011_001_1(uniques, 12);
+  f_000_101_011_010_1(uniques, 12);
+  f_000_101_011_011_1(uniques, 12);
+  f_000_101_011_100_1(uniques, 12);
+  f_000_101_011_101_1(uniques, 12);
+  f_000_101_011_110_1(uniques, 12);
+  f_000_101_011_111_1(uniques, 12);
+  f_000_101_100_000_1(uniques, 12);
+  f_000_101_100_001_1(uniques, 12);
+  f_000_101_100_010_1(uniques, 12);
+  f_000_101_100_011_1(uniques, 12);
+  f_000_101_100_100_1(uniques, 12);
+  f_000_101_100_101_1(uniques, 12);
+  f_000_101_100_110_1(uniques, 12);
+  f_000_101_100_111_1(uniques, 12);
+  f_000_101_101_000_1(uniques, 12);
+  f_000_101_101_001_1(uniques, 12);
+  f_000_101_101_010_1(uniques, 12);
+  f_000_101_101_011_1(uniques, 12);
+  f_000_101_101_100_1(uniques, 12);
+  f_000_101_101_101_1(uniques, 12);
+  f_000_101_101_110_1(uniques, 12);
+  f_000_101_101_111_1(uniques, 12);
+  f_000_101_110_000_1(uniques, 12);
+  f_000_101_110_001_1(uniques, 12);
+  f_000_101_110_010_1(uniques, 12);
+  f_000_101_110_011_1(uniques, 12);
+  f_000_101_110_100_1(uniques, 12);
+  f_000_101_110_101_1(uniques, 12);
+  f_000_101_110_110_1(uniques, 12);
+  f_000_101_110_111_1(uniques, 12);
+  f_000_101_111_000_1(uniques, 12);
+  f_000_101_111_001_1(uniques, 12);
+  f_000_101_111_010_1(uniques, 12);
+  f_000_101_111_011_1(uniques, 12);
+  f_000_101_111_100_1(uniques, 12);
+  f_000_101_111_101_1(uniques, 12);
+  f_000_101_111_110_1(uniques, 12);
+  f_000_101_111_111_1(uniques, 12);
+  f_000_110_000_000_1(uniques, 12);
+  f_000_110_000_001_1(uniques, 12);
+  f_000_110_000_010_1(uniques, 12);
+  f_000_110_000_011_1(uniques, 12);
+  f_000_110_000_100_1(uniques, 12);
+  f_000_110_000_101_1(uniques, 12);
+  f_000_110_000_110_1(uniques, 12);
+  f_000_110_000_111_1(uniques, 12);
+  f_000_110_001_000_1(uniques, 12);
+  f_000_110_001_001_1(uniques, 12);
+  f_000_110_001_010_1(uniques, 12);
+  f_000_110_001_011_1(uniques, 12);
+  f_000_110_001_100_1(uniques, 12);
+  f_000_110_001_101_1(uniques, 12);
+  f_000_110_001_110_1(uniques, 12);
+  f_000_110_001_111_1(uniques, 12);
+  f_000_110_010_000_1(uniques, 12);
+  f_000_110_010_001_1(uniques, 12);
+  f_000_110_010_010_1(uniques, 12);
+  f_000_110_010_011_1(uniques, 12);
+  f_000_110_010_100_1(uniques, 12);
+  f_000_110_010_101_1(uniques, 12);
+  f_000_110_010_110_1(uniques, 12);
+  f_000_110_010_111_1(uniques, 12);
+  f_000_110_011_000_1(uniques, 12);
+  f_000_110_011_001_1(uniques, 12);
+  f_000_110_011_010_1(uniques, 12);
+  f_000_110_011_011_1(uniques, 12);
+  f_000_110_011_100_1(uniques, 12);
+  f_000_110_011_101_1(uniques, 12);
+  f_000_110_011_110_1(uniques, 12);
+  f_000_110_011_111_1(uniques, 12);
+  f_000_110_100_000_1(uniques, 12);
+  f_000_110_100_001_1(uniques, 12);
+  f_000_110_100_010_1(uniques, 12);
+  f_000_110_100_011_1(uniques, 12);
+  f_000_110_100_100_1(uniques, 12);
+  f_000_110_100_101_1(uniques, 12);
+  f_000_110_100_110_1(uniques, 12);
+  f_000_110_100_111_1(uniques, 12);
+  f_000_110_101_000_1(uniques, 12);
+  f_000_110_101_001_1(uniques, 12);
+  f_000_110_101_010_1(uniques, 12);
+  f_000_110_101_011_1(uniques, 12);
+  f_000_110_101_100_1(uniques, 12);
+  f_000_110_101_101_1(uniques, 12);
+  f_000_110_101_110_1(uniques, 12);
+  f_000_110_101_111_1(uniques, 12);
+  f_000_110_110_000_1(uniques, 12);
+  f_000_110_110_001_1(uniques, 12);
+  f_000_110_110_010_1(uniques, 12);
+  f_000_110_110_011_1(uniques, 12);
+  f_000_110_110_100_1(uniques, 12);
+  f_000_110_110_101_1(uniques, 12);
+  f_000_110_110_110_1(uniques, 12);
+  f_000_110_110_111_1(uniques, 12);
+  f_000_110_111_000_1(uniques, 12);
+  f_000_110_111_001_1(uniques, 12);
+  f_000_110_111_010_1(uniques, 12);
+  f_000_110_111_011_1(uniques, 12);
+  f_000_110_111_100_1(uniques, 12);
+  f_000_110_111_101_1(uniques, 12);
+  f_000_110_111_110_1(uniques, 12);
+  f_000_110_111_111_1(uniques, 12);
+  f_000_111_000_000_1(uniques, 12);
+  f_000_111_000_001_1(uniques, 12);
+  f_000_111_000_010_1(uniques, 12);
+  f_000_111_000_011_1(uniques, 12);
+  f_000_111_000_100_1(uniques, 12);
+  f_000_111_000_101_1(uniques, 12);
+  f_000_111_000_110_1(uniques, 12);
+  f_000_111_000_111_1(uniques, 12);
+  f_000_111_001_000_1(uniques, 12);
+  f_000_111_001_001_1(uniques, 12);
+  f_000_111_001_010_1(uniques, 12);
+  f_000_111_001_011_1(uniques, 12);
+  f_000_111_001_100_1(uniques, 12);
+  f_000_111_001_101_1(uniques, 12);
+  f_000_111_001_110_1(uniques, 12);
+  f_000_111_001_111_1(uniques, 12);
+  f_000_111_010_000_1(uniques, 12);
+  f_000_111_010_001_1(uniques, 12);
+  f_000_111_010_010_1(uniques, 12);
+  f_000_111_010_011_1(uniques, 12);
+  f_000_111_010_100_1(uniques, 12);
+  f_000_111_010_101_1(uniques, 12);
+  f_000_111_010_110_1(uniques, 12);
+  f_000_111_010_111_1(uniques, 12);
+  f_000_111_011_000_1(uniques, 12);
+  f_000_111_011_001_1(uniques, 12);
+  f_000_111_011_010_1(uniques, 12);
+  f_000_111_011_011_1(uniques, 12);
+  f_000_111_011_100_1(uniques, 12);
+  f_000_111_011_101_1(uniques, 12);
+  f_000_111_011_110_1(uniques, 12);
+  f_000_111_011_111_1(uniques, 12);
+  f_000_111_100_000_1(uniques, 12);
+  f_000_111_100_001_1(uniques, 12);
+  f_000_111_100_010_1(uniques, 12);
+  f_000_111_100_011_1(uniques, 12);
+  f_000_111_100_100_1(uniques, 12);
+  f_000_111_100_101_1(uniques, 12);
+  f_000_111_100_110_1(uniques, 12);
+  f_000_111_100_111_1(uniques, 12);
+  f_000_111_101_000_1(uniques, 12);
+  f_000_111_101_001_1(uniques, 12);
+  f_000_111_101_010_1(uniques, 12);
+  f_000_111_101_011_1(uniques, 12);
+  f_000_111_101_100_1(uniques, 12);
+  f_000_111_101_101_1(uniques, 12);
+  f_000_111_101_110_1(uniques, 12);
+  f_000_111_101_111_1(uniques, 12);
+  f_000_111_110_000_1(uniques, 12);
+  f_000_111_110_001_1(uniques, 12);
+  f_000_111_110_010_1(uniques, 12);
+  f_000_111_110_011_1(uniques, 12);
+  f_000_111_110_100_1(uniques, 12);
+  f_000_111_110_101_1(uniques, 12);
+  f_000_111_110_110_1(uniques, 12);
+  f_000_111_110_111_1(uniques, 12);
+  f_000_111_111_000_1(uniques, 12);
+  f_000_111_111_001_1(uniques, 12);
+  f_000_111_111_010_1(uniques, 12);
+  f_000_111_111_011_1(uniques, 12);
+  f_000_111_111_100_1(uniques, 12);
+  f_000_111_111_101_1(uniques, 12);
+  f_000_111_111_110_1(uniques, 12);
+  f_000_111_111_111_1(uniques, 12);
+  f_001_000_000_000_1(uniques, 12);
+  f_001_000_000_001_1(uniques, 12);
+  f_001_000_000_010_1(uniques, 12);
+  f_001_000_000_011_1(uniques, 12);
+  f_001_000_000_100_1(uniques, 12);
+  f_001_000_000_101_1(uniques, 12);
+  f_001_000_000_110_1(uniques, 12);
+  f_001_000_000_111_1(uniques, 12);
+  f_001_000_001_000_1(uniques, 12);
+  f_001_000_001_001_1(uniques, 12);
+  f_001_000_001_010_1(uniques, 12);
+  f_001_000_001_011_1(uniques, 12);
+  f_001_000_001_100_1(uniques, 12);
+  f_001_000_001_101_1(uniques, 12);
+  f_001_000_001_110_1(uniques, 12);
+  f_001_000_001_111_1(uniques, 12);
+  f_001_000_010_000_1(uniques, 12);
+  f_001_000_010_001_1(uniques, 12);
+  f_001_000_010_010_1(uniques, 12);
+  f_001_000_010_011_1(uniques, 12);
+  f_001_000_010_100_1(uniques, 12);
+  f_001_000_010_101_1(uniques, 12);
+  f_001_000_010_110_1(uniques, 12);
+  f_001_000_010_111_1(uniques, 12);
+  f_001_000_011_000_1(uniques, 12);
+  f_001_000_011_001_1(uniques, 12);
+  f_001_000_011_010_1(uniques, 12);
+  f_001_000_011_011_1(uniques, 12);
+  f_001_000_011_100_1(uniques, 12);
+  f_001_000_011_101_1(uniques, 12);
+  f_001_000_011_110_1(uniques, 12);
+  f_001_000_011_111_1(uniques, 12);
+  f_001_000_100_000_1(uniques, 12);
+  f_001_000_100_001_1(uniques, 12);
+  f_001_000_100_010_1(uniques, 12);
+  f_001_000_100_011_1(uniques, 12);
+  f_001_000_100_100_1(uniques, 12);
+  f_001_000_100_101_1(uniques, 12);
+  f_001_000_100_110_1(uniques, 12);
+  f_001_000_100_111_1(uniques, 12);
+  f_001_000_101_000_1(uniques, 12);
+  f_001_000_101_001_1(uniques, 12);
+  f_001_000_101_010_1(uniques, 12);
+  f_001_000_101_011_1(uniques, 12);
+  f_001_000_101_100_1(uniques, 12);
+  f_001_000_101_101_1(uniques, 12);
+  f_001_000_101_110_1(uniques, 12);
+  f_001_000_101_111_1(uniques, 12);
+  f_001_000_110_000_1(uniques, 12);
+  f_001_000_110_001_1(uniques, 12);
+  f_001_000_110_010_1(uniques, 12);
+  f_001_000_110_011_1(uniques, 12);
+  f_001_000_110_100_1(uniques, 12);
+  f_001_000_110_101_1(uniques, 12);
+  f_001_000_110_110_1(uniques, 12);
+  f_001_000_110_111_1(uniques, 12);
+  f_001_000_111_000_1(uniques, 12);
+  f_001_000_111_001_1(uniques, 12);
+  f_001_000_111_010_1(uniques, 12);
+  f_001_000_111_011_1(uniques, 12);
+  f_001_000_111_100_1(uniques, 12);
+  f_001_000_111_101_1(uniques, 12);
+  f_001_000_111_110_1(uniques, 12);
+  f_001_000_111_111_1(uniques, 12);
+  f_001_001_000_000_1(uniques, 12);
+  f_001_001_000_001_1(uniques, 12);
+  f_001_001_000_010_1(uniques, 12);
+  f_001_001_000_011_1(uniques, 12);
+  f_001_001_000_100_1(uniques, 12);
+  f_001_001_000_101_1(uniques, 12);
+  f_001_001_000_110_1(uniques, 12);
+  f_001_001_000_111_1(uniques, 12);
+  f_001_001_001_000_1(uniques, 12);
+  f_001_001_001_001_1(uniques, 12);
+  f_001_001_001_010_1(uniques, 12);
+  f_001_001_001_011_1(uniques, 12);
+  f_001_001_001_100_1(uniques, 12);
+  f_001_001_001_101_1(uniques, 12);
+  f_001_001_001_110_1(uniques, 12);
+  f_001_001_001_111_1(uniques, 12);
+  f_001_001_010_000_1(uniques, 12);
+  f_001_001_010_001_1(uniques, 12);
+  f_001_001_010_010_1(uniques, 12);
+  f_001_001_010_011_1(uniques, 12);
+  f_001_001_010_100_1(uniques, 12);
+  f_001_001_010_101_1(uniques, 12);
+  f_001_001_010_110_1(uniques, 12);
+  f_001_001_010_111_1(uniques, 12);
+  f_001_001_011_000_1(uniques, 12);
+  f_001_001_011_001_1(uniques, 12);
+  f_001_001_011_010_1(uniques, 12);
+  f_001_001_011_011_1(uniques, 12);
+  f_001_001_011_100_1(uniques, 12);
+  f_001_001_011_101_1(uniques, 12);
+  f_001_001_011_110_1(uniques, 12);
+  f_001_001_011_111_1(uniques, 12);
+  f_001_001_100_000_1(uniques, 12);
+  f_001_001_100_001_1(uniques, 12);
+  f_001_001_100_010_1(uniques, 12);
+  f_001_001_100_011_1(uniques, 12);
+  f_001_001_100_100_1(uniques, 12);
+  f_001_001_100_101_1(uniques, 12);
+  f_001_001_100_110_1(uniques, 12);
+  f_001_001_100_111_1(uniques, 12);
+  f_001_001_101_000_1(uniques, 12);
+  f_001_001_101_001_1(uniques, 12);
+  f_001_001_101_010_1(uniques, 12);
+  f_001_001_101_011_1(uniques, 12);
+  f_001_001_101_100_1(uniques, 12);
+  f_001_001_101_101_1(uniques, 12);
+  f_001_001_101_110_1(uniques, 12);
+  f_001_001_101_111_1(uniques, 12);
+  f_001_001_110_000_1(uniques, 12);
+  f_001_001_110_001_1(uniques, 12);
+  f_001_001_110_010_1(uniques, 12);
+  f_001_001_110_011_1(uniques, 12);
+  f_001_001_110_100_1(uniques, 12);
+  f_001_001_110_101_1(uniques, 12);
+  f_001_001_110_110_1(uniques, 12);
+  f_001_001_110_111_1(uniques, 12);
+  f_001_001_111_000_1(uniques, 12);
+  f_001_001_111_001_1(uniques, 12);
+  f_001_001_111_010_1(uniques, 12);
+  f_001_001_111_011_1(uniques, 12);
+  f_001_001_111_100_1(uniques, 12);
+  f_001_001_111_101_1(uniques, 12);
+  f_001_001_111_110_1(uniques, 12);
+  f_001_001_111_111_1(uniques, 12);
+  f_001_010_000_000_1(uniques, 12);
+  f_001_010_000_001_1(uniques, 12);
+  f_001_010_000_010_1(uniques, 12);
+  f_001_010_000_011_1(uniques, 12);
+  f_001_010_000_100_1(uniques, 12);
+  f_001_010_000_101_1(uniques, 12);
+  f_001_010_000_110_1(uniques, 12);
+  f_001_010_000_111_1(uniques, 12);
+  f_001_010_001_000_1(uniques, 12);
+  f_001_010_001_001_1(uniques, 12);
+  f_001_010_001_010_1(uniques, 12);
+  f_001_010_001_011_1(uniques, 12);
+  f_001_010_001_100_1(uniques, 12);
+  f_001_010_001_101_1(uniques, 12);
+  f_001_010_001_110_1(uniques, 12);
+  f_001_010_001_111_1(uniques, 12);
+  f_001_010_010_000_1(uniques, 12);
+  f_001_010_010_001_1(uniques, 12);
+  f_001_010_010_010_1(uniques, 12);
+  f_001_010_010_011_1(uniques, 12);
+  f_001_010_010_100_1(uniques, 12);
+  f_001_010_010_101_1(uniques, 12);
+  f_001_010_010_110_1(uniques, 12);
+  f_001_010_010_111_1(uniques, 12);
+  f_001_010_011_000_1(uniques, 12);
+  f_001_010_011_001_1(uniques, 12);
+  f_001_010_011_010_1(uniques, 12);
+  f_001_010_011_011_1(uniques, 12);
+  f_001_010_011_100_1(uniques, 12);
+  f_001_010_011_101_1(uniques, 12);
+  f_001_010_011_110_1(uniques, 12);
+  f_001_010_011_111_1(uniques, 12);
+  f_001_010_100_000_1(uniques, 12);
+  f_001_010_100_001_1(uniques, 12);
+  f_001_010_100_010_1(uniques, 12);
+  f_001_010_100_011_1(uniques, 12);
+  f_001_010_100_100_1(uniques, 12);
+  f_001_010_100_101_1(uniques, 12);
+  f_001_010_100_110_1(uniques, 12);
+  f_001_010_100_111_1(uniques, 12);
+  f_001_010_101_000_1(uniques, 12);
+  f_001_010_101_001_1(uniques, 12);
+  f_001_010_101_010_1(uniques, 12);
+  f_001_010_101_011_1(uniques, 12);
+  f_001_010_101_100_1(uniques, 12);
+  f_001_010_101_101_1(uniques, 12);
+  f_001_010_101_110_1(uniques, 12);
+  f_001_010_101_111_1(uniques, 12);
+  f_001_010_110_000_1(uniques, 12);
+  f_001_010_110_001_1(uniques, 12);
+  f_001_010_110_010_1(uniques, 12);
+  f_001_010_110_011_1(uniques, 12);
+  f_001_010_110_100_1(uniques, 12);
+  f_001_010_110_101_1(uniques, 12);
+  f_001_010_110_110_1(uniques, 12);
+  f_001_010_110_111_1(uniques, 12);
+  f_001_010_111_000_1(uniques, 12);
+  f_001_010_111_001_1(uniques, 12);
+  f_001_010_111_010_1(uniques, 12);
+  f_001_010_111_011_1(uniques, 12);
+  f_001_010_111_100_1(uniques, 12);
+  f_001_010_111_101_1(uniques, 12);
+  f_001_010_111_110_1(uniques, 12);
+  f_001_010_111_111_1(uniques, 12);
+  f_001_011_000_000_1(uniques, 12);
+  f_001_011_000_001_1(uniques, 12);
+  f_001_011_000_010_1(uniques, 12);
+  f_001_011_000_011_1(uniques, 12);
+  f_001_011_000_100_1(uniques, 12);
+  f_001_011_000_101_1(uniques, 12);
+  f_001_011_000_110_1(uniques, 12);
+  f_001_011_000_111_1(uniques, 12);
+  f_001_011_001_000_1(uniques, 12);
+  f_001_011_001_001_1(uniques, 12);
+  f_001_011_001_010_1(uniques, 12);
+  f_001_011_001_011_1(uniques, 12);
+  f_001_011_001_100_1(uniques, 12);
+  f_001_011_001_101_1(uniques, 12);
+  f_001_011_001_110_1(uniques, 12);
+  f_001_011_001_111_1(uniques, 12);
+  f_001_011_010_000_1(uniques, 12);
+  f_001_011_010_001_1(uniques, 12);
+  f_001_011_010_010_1(uniques, 12);
+  f_001_011_010_011_1(uniques, 12);
+  f_001_011_010_100_1(uniques, 12);
+  f_001_011_010_101_1(uniques, 12);
+  f_001_011_010_110_1(uniques, 12);
+  f_001_011_010_111_1(uniques, 12);
+  f_001_011_011_000_1(uniques, 12);
+  f_001_011_011_001_1(uniques, 12);
+  f_001_011_011_010_1(uniques, 12);
+  f_001_011_011_011_1(uniques, 12);
+  f_001_011_011_100_1(uniques, 12);
+  f_001_011_011_101_1(uniques, 12);
+  f_001_011_011_110_1(uniques, 12);
+  f_001_011_011_111_1(uniques, 12);
+  f_001_011_100_000_1(uniques, 12);
+  f_001_011_100_001_1(uniques, 12);
+  f_001_011_100_010_1(uniques, 12);
+  f_001_011_100_011_1(uniques, 12);
+  f_001_011_100_100_1(uniques, 12);
+  f_001_011_100_101_1(uniques, 12);
+  f_001_011_100_110_1(uniques, 12);
+  f_001_011_100_111_1(uniques, 12);
+  f_001_011_101_000_1(uniques, 12);
+  f_001_011_101_001_1(uniques, 12);
+  f_001_011_101_010_1(uniques, 12);
+  f_001_011_101_011_1(uniques, 12);
+  f_001_011_101_100_1(uniques, 12);
+  f_001_011_101_101_1(uniques, 12);
+  f_001_011_101_110_1(uniques, 12);
+  f_001_011_101_111_1(uniques, 12);
+  f_001_011_110_000_1(uniques, 12);
+  f_001_011_110_001_1(uniques, 12);
+  f_001_011_110_010_1(uniques, 12);
+  f_001_011_110_011_1(uniques, 12);
+  f_001_011_110_100_1(uniques, 12);
+  f_001_011_110_101_1(uniques, 12);
+  f_001_011_110_110_1(uniques, 12);
+  f_001_011_110_111_1(uniques, 12);
+  f_001_011_111_000_1(uniques, 12);
+  f_001_011_111_001_1(uniques, 12);
+  f_001_011_111_010_1(uniques, 12);
+  f_001_011_111_011_1(uniques, 12);
+  f_001_011_111_100_1(uniques, 12);
+  f_001_011_111_101_1(uniques, 12);
+  f_001_011_111_110_1(uniques, 12);
+  f_001_011_111_111_1(uniques, 12);
+  f_001_100_000_000_1(uniques, 12);
+  f_001_100_000_001_1(uniques, 12);
+  f_001_100_000_010_1(uniques, 12);
+  f_001_100_000_011_1(uniques, 12);
+  f_001_100_000_100_1(uniques, 12);
+  f_001_100_000_101_1(uniques, 12);
+  f_001_100_000_110_1(uniques, 12);
+  f_001_100_000_111_1(uniques, 12);
+  f_001_100_001_000_1(uniques, 12);
+  f_001_100_001_001_1(uniques, 12);
+  f_001_100_001_010_1(uniques, 12);
+  f_001_100_001_011_1(uniques, 12);
+  f_001_100_001_100_1(uniques, 12);
+  f_001_100_001_101_1(uniques, 12);
+  f_001_100_001_110_1(uniques, 12);
+  f_001_100_001_111_1(uniques, 12);
+  f_001_100_010_000_1(uniques, 12);
+  f_001_100_010_001_1(uniques, 12);
+  f_001_100_010_010_1(uniques, 12);
+  f_001_100_010_011_1(uniques, 12);
+  f_001_100_010_100_1(uniques, 12);
+  f_001_100_010_101_1(uniques, 12);
+  f_001_100_010_110_1(uniques, 12);
+  f_001_100_010_111_1(uniques, 12);
+  f_001_100_011_000_1(uniques, 12);
+  f_001_100_011_001_1(uniques, 12);
+  f_001_100_011_010_1(uniques, 12);
+  f_001_100_011_011_1(uniques, 12);
+  f_001_100_011_100_1(uniques, 12);
+  f_001_100_011_101_1(uniques, 12);
+  f_001_100_011_110_1(uniques, 12);
+  f_001_100_011_111_1(uniques, 12);
+  f_001_100_100_000_1(uniques, 12);
+  f_001_100_100_001_1(uniques, 12);
+  f_001_100_100_010_1(uniques, 12);
+  f_001_100_100_011_1(uniques, 12);
+  f_001_100_100_100_1(uniques, 12);
+  f_001_100_100_101_1(uniques, 12);
+  f_001_100_100_110_1(uniques, 12);
+  f_001_100_100_111_1(uniques, 12);
+  f_001_100_101_000_1(uniques, 12);
+  f_001_100_101_001_1(uniques, 12);
+  f_001_100_101_010_1(uniques, 12);
+  f_001_100_101_011_1(uniques, 12);
+  f_001_100_101_100_1(uniques, 12);
+  f_001_100_101_101_1(uniques, 12);
+  f_001_100_101_110_1(uniques, 12);
+  f_001_100_101_111_1(uniques, 12);
+  f_001_100_110_000_1(uniques, 12);
+  f_001_100_110_001_1(uniques, 12);
+  f_001_100_110_010_1(uniques, 12);
+  f_001_100_110_011_1(uniques, 12);
+  f_001_100_110_100_1(uniques, 12);
+  f_001_100_110_101_1(uniques, 12);
+  f_001_100_110_110_1(uniques, 12);
+  f_001_100_110_111_1(uniques, 12);
+  f_001_100_111_000_1(uniques, 12);
+  f_001_100_111_001_1(uniques, 12);
+  f_001_100_111_010_1(uniques, 12);
+  f_001_100_111_011_1(uniques, 12);
+  f_001_100_111_100_1(uniques, 12);
+  f_001_100_111_101_1(uniques, 12);
+  f_001_100_111_110_1(uniques, 12);
+  f_001_100_111_111_1(uniques, 12);
+  f_001_101_000_000_1(uniques, 12);
+  f_001_101_000_001_1(uniques, 12);
+  f_001_101_000_010_1(uniques, 12);
+  f_001_101_000_011_1(uniques, 12);
+  f_001_101_000_100_1(uniques, 12);
+  f_001_101_000_101_1(uniques, 12);
+  f_001_101_000_110_1(uniques, 12);
+  f_001_101_000_111_1(uniques, 12);
+  f_001_101_001_000_1(uniques, 12);
+  f_001_101_001_001_1(uniques, 12);
+  f_001_101_001_010_1(uniques, 12);
+  f_001_101_001_011_1(uniques, 12);
+  f_001_101_001_100_1(uniques, 12);
+  f_001_101_001_101_1(uniques, 12);
+  f_001_101_001_110_1(uniques, 12);
+  f_001_101_001_111_1(uniques, 12);
+  f_001_101_010_000_1(uniques, 12);
+  f_001_101_010_001_1(uniques, 12);
+  f_001_101_010_010_1(uniques, 12);
+  f_001_101_010_011_1(uniques, 12);
+  f_001_101_010_100_1(uniques, 12);
+  f_001_101_010_101_1(uniques, 12);
+  f_001_101_010_110_1(uniques, 12);
+  f_001_101_010_111_1(uniques, 12);
+  f_001_101_011_000_1(uniques, 12);
+  f_001_101_011_001_1(uniques, 12);
+  f_001_101_011_010_1(uniques, 12);
+  f_001_101_011_011_1(uniques, 12);
+  f_001_101_011_100_1(uniques, 12);
+  f_001_101_011_101_1(uniques, 12);
+  f_001_101_011_110_1(uniques, 12);
+  f_001_101_011_111_1(uniques, 12);
+  f_001_101_100_000_1(uniques, 12);
+  f_001_101_100_001_1(uniques, 12);
+  f_001_101_100_010_1(uniques, 12);
+  f_001_101_100_011_1(uniques, 12);
+  f_001_101_100_100_1(uniques, 12);
+  f_001_101_100_101_1(uniques, 12);
+  f_001_101_100_110_1(uniques, 12);
+  f_001_101_100_111_1(uniques, 12);
+  f_001_101_101_000_1(uniques, 12);
+  f_001_101_101_001_1(uniques, 12);
+  f_001_101_101_010_1(uniques, 12);
+  f_001_101_101_011_1(uniques, 12);
+  f_001_101_101_100_1(uniques, 12);
+  f_001_101_101_101_1(uniques, 12);
+  f_001_101_101_110_1(uniques, 12);
+  f_001_101_101_111_1(uniques, 12);
+  f_001_101_110_000_1(uniques, 12);
+  f_001_101_110_001_1(uniques, 12);
+  f_001_101_110_010_1(uniques, 12);
+  f_001_101_110_011_1(uniques, 12);
+  f_001_101_110_100_1(uniques, 12);
+  f_001_101_110_101_1(uniques, 12);
+  f_001_101_110_110_1(uniques, 12);
+  f_001_101_110_111_1(uniques, 12);
+  f_001_101_111_000_1(uniques, 12);
+  f_001_101_111_001_1(uniques, 12);
+  f_001_101_111_010_1(uniques, 12);
+  f_001_101_111_011_1(uniques, 12);
+  f_001_101_111_100_1(uniques, 12);
+  f_001_101_111_101_1(uniques, 12);
+  f_001_101_111_110_1(uniques, 12);
+  f_001_101_111_111_1(uniques, 12);
+  f_001_110_000_000_1(uniques, 12);
+  f_001_110_000_001_1(uniques, 12);
+  f_001_110_000_010_1(uniques, 12);
+  f_001_110_000_011_1(uniques, 12);
+  f_001_110_000_100_1(uniques, 12);
+  f_001_110_000_101_1(uniques, 12);
+  f_001_110_000_110_1(uniques, 12);
+  f_001_110_000_111_1(uniques, 12);
+  f_001_110_001_000_1(uniques, 12);
+  f_001_110_001_001_1(uniques, 12);
+  f_001_110_001_010_1(uniques, 12);
+  f_001_110_001_011_1(uniques, 12);
+  f_001_110_001_100_1(uniques, 12);
+  f_001_110_001_101_1(uniques, 12);
+  f_001_110_001_110_1(uniques, 12);
+  f_001_110_001_111_1(uniques, 12);
+  f_001_110_010_000_1(uniques, 12);
+  f_001_110_010_001_1(uniques, 12);
+  f_001_110_010_010_1(uniques, 12);
+  f_001_110_010_011_1(uniques, 12);
+  f_001_110_010_100_1(uniques, 12);
+  f_001_110_010_101_1(uniques, 12);
+  f_001_110_010_110_1(uniques, 12);
+  f_001_110_010_111_1(uniques, 12);
+  f_001_110_011_000_1(uniques, 12);
+  f_001_110_011_001_1(uniques, 12);
+  f_001_110_011_010_1(uniques, 12);
+  f_001_110_011_011_1(uniques, 12);
+  f_001_110_011_100_1(uniques, 12);
+  f_001_110_011_101_1(uniques, 12);
+  f_001_110_011_110_1(uniques, 12);
+  f_001_110_011_111_1(uniques, 12);
+  f_001_110_100_000_1(uniques, 12);
+  f_001_110_100_001_1(uniques, 12);
+  f_001_110_100_010_1(uniques, 12);
+  f_001_110_100_011_1(uniques, 12);
+  f_001_110_100_100_1(uniques, 12);
+  f_001_110_100_101_1(uniques, 12);
+  f_001_110_100_110_1(uniques, 12);
+  f_001_110_100_111_1(uniques, 12);
+  f_001_110_101_000_1(uniques, 12);
+  f_001_110_101_001_1(uniques, 12);
+  f_001_110_101_010_1(uniques, 12);
+  f_001_110_101_011_1(uniques, 12);
+  f_001_110_101_100_1(uniques, 12);
+  f_001_110_101_101_1(uniques, 12);
+  f_001_110_101_110_1(uniques, 12);
+  f_001_110_101_111_1(uniques, 12);
+  f_001_110_110_000_1(uniques, 12);
+  f_001_110_110_001_1(uniques, 12);
+  f_001_110_110_010_1(uniques, 12);
+  f_001_110_110_011_1(uniques, 12);
+  f_001_110_110_100_1(uniques, 12);
+  f_001_110_110_101_1(uniques, 12);
+  f_001_110_110_110_1(uniques, 12);
+  f_001_110_110_111_1(uniques, 12);
+  f_001_110_111_000_1(uniques, 12);
+  f_001_110_111_001_1(uniques, 12);
+  f_001_110_111_010_1(uniques, 12);
+  f_001_110_111_011_1(uniques, 12);
+  f_001_110_111_100_1(uniques, 12);
+  f_001_110_111_101_1(uniques, 12);
+  f_001_110_111_110_1(uniques, 12);
+  f_001_110_111_111_1(uniques, 12);
+  f_001_111_000_000_1(uniques, 12);
+  f_001_111_000_001_1(uniques, 12);
+  f_001_111_000_010_1(uniques, 12);
+  f_001_111_000_011_1(uniques, 12);
+  f_001_111_000_100_1(uniques, 12);
+  f_001_111_000_101_1(uniques, 12);
+  f_001_111_000_110_1(uniques, 12);
+  f_001_111_000_111_1(uniques, 12);
+  f_001_111_001_000_1(uniques, 12);
+  f_001_111_001_001_1(uniques, 12);
+  f_001_111_001_010_1(uniques, 12);
+  f_001_111_001_011_1(uniques, 12);
+  f_001_111_001_100_1(uniques, 12);
+  f_001_111_001_101_1(uniques, 12);
+  f_001_111_001_110_1(uniques, 12);
+  f_001_111_001_111_1(uniques, 12);
+  f_001_111_010_000_1(uniques, 12);
+  f_001_111_010_001_1(uniques, 12);
+  f_001_111_010_010_1(uniques, 12);
+  f_001_111_010_011_1(uniques, 12);
+  f_001_111_010_100_1(uniques, 12);
+  f_001_111_010_101_1(uniques, 12);
+  f_001_111_010_110_1(uniques, 12);
+  f_001_111_010_111_1(uniques, 12);
+  f_001_111_011_000_1(uniques, 12);
+  f_001_111_011_001_1(uniques, 12);
+  f_001_111_011_010_1(uniques, 12);
+  f_001_111_011_011_1(uniques, 12);
+  f_001_111_011_100_1(uniques, 12);
+  f_001_111_011_101_1(uniques, 12);
+  f_001_111_011_110_1(uniques, 12);
+  f_001_111_011_111_1(uniques, 12);
+  f_001_111_100_000_1(uniques, 12);
+  f_001_111_100_001_1(uniques, 12);
+  f_001_111_100_010_1(uniques, 12);
+  f_001_111_100_011_1(uniques, 12);
+  f_001_111_100_100_1(uniques, 12);
+  f_001_111_100_101_1(uniques, 12);
+  f_001_111_100_110_1(uniques, 12);
+  f_001_111_100_111_1(uniques, 12);
+  f_001_111_101_000_1(uniques, 12);
+  f_001_111_101_001_1(uniques, 12);
+  f_001_111_101_010_1(uniques, 12);
+  f_001_111_101_011_1(uniques, 12);
+  f_001_111_101_100_1(uniques, 12);
+  f_001_111_101_101_1(uniques, 12);
+  f_001_111_101_110_1(uniques, 12);
+  f_001_111_101_111_1(uniques, 12);
+  f_001_111_110_000_1(uniques, 12);
+  f_001_111_110_001_1(uniques, 12);
+  f_001_111_110_010_1(uniques, 12);
+  f_001_111_110_011_1(uniques, 12);
+  f_001_111_110_100_1(uniques, 12);
+  f_001_111_110_101_1(uniques, 12);
+  f_001_111_110_110_1(uniques, 12);
+  f_001_111_110_111_1(uniques, 12);
+  f_001_111_111_000_1(uniques, 12);
+  f_001_111_111_001_1(uniques, 12);
+  f_001_111_111_010_1(uniques, 12);
+  f_001_111_111_011_1(uniques, 12);
+  f_001_111_111_100_1(uniques, 12);
+  f_001_111_111_101_1(uniques, 12);
+  f_001_111_111_110_1(uniques, 12);
+  f_001_111_111_111_1(uniques, 12);
+  f_010_000_000_000_1(uniques, 12);
+  f_010_000_000_001_1(uniques, 12);
+  f_010_000_000_010_1(uniques, 12);
+  f_010_000_000_011_1(uniques, 12);
+  f_010_000_000_100_1(uniques, 12);
+  f_010_000_000_101_1(uniques, 12);
+  f_010_000_000_110_1(uniques, 12);
+  f_010_000_000_111_1(uniques, 12);
+  f_010_000_001_000_1(uniques, 12);
+  f_010_000_001_001_1(uniques, 12);
+  f_010_000_001_010_1(uniques, 12);
+  f_010_000_001_011_1(uniques, 12);
+  f_010_000_001_100_1(uniques, 12);
+  f_010_000_001_101_1(uniques, 12);
+  f_010_000_001_110_1(uniques, 12);
+  f_010_000_001_111_1(uniques, 12);
+  f_010_000_010_000_1(uniques, 12);
+  f_010_000_010_001_1(uniques, 12);
+  f_010_000_010_010_1(uniques, 12);
+  f_010_000_010_011_1(uniques, 12);
+  f_010_000_010_100_1(uniques, 12);
+  f_010_000_010_101_1(uniques, 12);
+  f_010_000_010_110_1(uniques, 12);
+  f_010_000_010_111_1(uniques, 12);
+  f_010_000_011_000_1(uniques, 12);
+  f_010_000_011_001_1(uniques, 12);
+  f_010_000_011_010_1(uniques, 12);
+  f_010_000_011_011_1(uniques, 12);
+  f_010_000_011_100_1(uniques, 12);
+  f_010_000_011_101_1(uniques, 12);
+  f_010_000_011_110_1(uniques, 12);
+  f_010_000_011_111_1(uniques, 12);
+  f_010_000_100_000_1(uniques, 12);
+  f_010_000_100_001_1(uniques, 12);
+  f_010_000_100_010_1(uniques, 12);
+  f_010_000_100_011_1(uniques, 12);
+  f_010_000_100_100_1(uniques, 12);
+  f_010_000_100_101_1(uniques, 12);
+  f_010_000_100_110_1(uniques, 12);
+  f_010_000_100_111_1(uniques, 12);
+  f_010_000_101_000_1(uniques, 12);
+  f_010_000_101_001_1(uniques, 12);
+  f_010_000_101_010_1(uniques, 12);
+  f_010_000_101_011_1(uniques, 12);
+  f_010_000_101_100_1(uniques, 12);
+  f_010_000_101_101_1(uniques, 12);
+  f_010_000_101_110_1(uniques, 12);
+  f_010_000_101_111_1(uniques, 12);
+  f_010_000_110_000_1(uniques, 12);
+  f_010_000_110_001_1(uniques, 12);
+  f_010_000_110_010_1(uniques, 12);
+  f_010_000_110_011_1(uniques, 12);
+  f_010_000_110_100_1(uniques, 12);
+  f_010_000_110_101_1(uniques, 12);
+  f_010_000_110_110_1(uniques, 12);
+  f_010_000_110_111_1(uniques, 12);
+  f_010_000_111_000_1(uniques, 12);
+  f_010_000_111_001_1(uniques, 12);
+  f_010_000_111_010_1(uniques, 12);
+  f_010_000_111_011_1(uniques, 12);
+  f_010_000_111_100_1(uniques, 12);
+  f_010_000_111_101_1(uniques, 12);
+  f_010_000_111_110_1(uniques, 12);
+  f_010_000_111_111_1(uniques, 12);
+  f_010_001_000_000_1(uniques, 12);
+  f_010_001_000_001_1(uniques, 12);
+  f_010_001_000_010_1(uniques, 12);
+  f_010_001_000_011_1(uniques, 12);
+  f_010_001_000_100_1(uniques, 12);
+  f_010_001_000_101_1(uniques, 12);
+  f_010_001_000_110_1(uniques, 12);
+  f_010_001_000_111_1(uniques, 12);
+  f_010_001_001_000_1(uniques, 12);
+  f_010_001_001_001_1(uniques, 12);
+  f_010_001_001_010_1(uniques, 12);
+  f_010_001_001_011_1(uniques, 12);
+  f_010_001_001_100_1(uniques, 12);
+  f_010_001_001_101_1(uniques, 12);
+  f_010_001_001_110_1(uniques, 12);
+  f_010_001_001_111_1(uniques, 12);
+  f_010_001_010_000_1(uniques, 12);
+  f_010_001_010_001_1(uniques, 12);
+  f_010_001_010_010_1(uniques, 12);
+  f_010_001_010_011_1(uniques, 12);
+  f_010_001_010_100_1(uniques, 12);
+  f_010_001_010_101_1(uniques, 12);
+  f_010_001_010_110_1(uniques, 12);
+  f_010_001_010_111_1(uniques, 12);
+  f_010_001_011_000_1(uniques, 12);
+  f_010_001_011_001_1(uniques, 12);
+  f_010_001_011_010_1(uniques, 12);
+  f_010_001_011_011_1(uniques, 12);
+  f_010_001_011_100_1(uniques, 12);
+  f_010_001_011_101_1(uniques, 12);
+  f_010_001_011_110_1(uniques, 12);
+  f_010_001_011_111_1(uniques, 12);
+  f_010_001_100_000_1(uniques, 12);
+  f_010_001_100_001_1(uniques, 12);
+  f_010_001_100_010_1(uniques, 12);
+  f_010_001_100_011_1(uniques, 12);
+  f_010_001_100_100_1(uniques, 12);
+  f_010_001_100_101_1(uniques, 12);
+  f_010_001_100_110_1(uniques, 12);
+  f_010_001_100_111_1(uniques, 12);
+  f_010_001_101_000_1(uniques, 12);
+  f_010_001_101_001_1(uniques, 12);
+  f_010_001_101_010_1(uniques, 12);
+  f_010_001_101_011_1(uniques, 12);
+  f_010_001_101_100_1(uniques, 12);
+  f_010_001_101_101_1(uniques, 12);
+  f_010_001_101_110_1(uniques, 12);
+  f_010_001_101_111_1(uniques, 12);
+  f_010_001_110_000_1(uniques, 12);
+  f_010_001_110_001_1(uniques, 12);
+  f_010_001_110_010_1(uniques, 12);
+  f_010_001_110_011_1(uniques, 12);
+  f_010_001_110_100_1(uniques, 12);
+  f_010_001_110_101_1(uniques, 12);
+  f_010_001_110_110_1(uniques, 12);
+  f_010_001_110_111_1(uniques, 12);
+  f_010_001_111_000_1(uniques, 12);
+  f_010_001_111_001_1(uniques, 12);
+  f_010_001_111_010_1(uniques, 12);
+  f_010_001_111_011_1(uniques, 12);
+  f_010_001_111_100_1(uniques, 12);
+  f_010_001_111_101_1(uniques, 12);
+  f_010_001_111_110_1(uniques, 12);
+  f_010_001_111_111_1(uniques, 12);
+  f_010_010_000_000_1(uniques, 12);
+  f_010_010_000_001_1(uniques, 12);
+  f_010_010_000_010_1(uniques, 12);
+  f_010_010_000_011_1(uniques, 12);
+  f_010_010_000_100_1(uniques, 12);
+  f_010_010_000_101_1(uniques, 12);
+  f_010_010_000_110_1(uniques, 12);
+  f_010_010_000_111_1(uniques, 12);
+  f_010_010_001_000_1(uniques, 12);
+  f_010_010_001_001_1(uniques, 12);
+  f_010_010_001_010_1(uniques, 12);
+  f_010_010_001_011_1(uniques, 12);
+  f_010_010_001_100_1(uniques, 12);
+  f_010_010_001_101_1(uniques, 12);
+  f_010_010_001_110_1(uniques, 12);
+  f_010_010_001_111_1(uniques, 12);
+  f_010_010_010_000_1(uniques, 12);
+  f_010_010_010_001_1(uniques, 12);
+  f_010_010_010_010_1(uniques, 12);
+  f_010_010_010_011_1(uniques, 12);
+  f_010_010_010_100_1(uniques, 12);
+  f_010_010_010_101_1(uniques, 12);
+  f_010_010_010_110_1(uniques, 12);
+  f_010_010_010_111_1(uniques, 12);
+  f_010_010_011_000_1(uniques, 12);
+  f_010_010_011_001_1(uniques, 12);
+  f_010_010_011_010_1(uniques, 12);
+  f_010_010_011_011_1(uniques, 12);
+  f_010_010_011_100_1(uniques, 12);
+  f_010_010_011_101_1(uniques, 12);
+  f_010_010_011_110_1(uniques, 12);
+  f_010_010_011_111_1(uniques, 12);
+  f_010_010_100_000_1(uniques, 12);
+  f_010_010_100_001_1(uniques, 12);
+  f_010_010_100_010_1(uniques, 12);
+  f_010_010_100_011_1(uniques, 12);
+  f_010_010_100_100_1(uniques, 12);
+  f_010_010_100_101_1(uniques, 12);
+  f_010_010_100_110_1(uniques, 12);
+  f_010_010_100_111_1(uniques, 12);
+  f_010_010_101_000_1(uniques, 12);
+  f_010_010_101_001_1(uniques, 12);
+  f_010_010_101_010_1(uniques, 12);
+  f_010_010_101_011_1(uniques, 12);
+  f_010_010_101_100_1(uniques, 12);
+  f_010_010_101_101_1(uniques, 12);
+  f_010_010_101_110_1(uniques, 12);
+  f_010_010_101_111_1(uniques, 12);
+  f_010_010_110_000_1(uniques, 12);
+  f_010_010_110_001_1(uniques, 12);
+  f_010_010_110_010_1(uniques, 12);
+  f_010_010_110_011_1(uniques, 12);
+  f_010_010_110_100_1(uniques, 12);
+  f_010_010_110_101_1(uniques, 12);
+  f_010_010_110_110_1(uniques, 12);
+  f_010_010_110_111_1(uniques, 12);
+  f_010_010_111_000_1(uniques, 12);
+  f_010_010_111_001_1(uniques, 12);
+  f_010_010_111_010_1(uniques, 12);
+  f_010_010_111_011_1(uniques, 12);
+  f_010_010_111_100_1(uniques, 12);
+  f_010_010_111_101_1(uniques, 12);
+  f_010_010_111_110_1(uniques, 12);
+  f_010_010_111_111_1(uniques, 12);
+  f_010_011_000_000_1(uniques, 12);
+  f_010_011_000_001_1(uniques, 12);
+  f_010_011_000_010_1(uniques, 12);
+  f_010_011_000_011_1(uniques, 12);
+  f_010_011_000_100_1(uniques, 12);
+  f_010_011_000_101_1(uniques, 12);
+  f_010_011_000_110_1(uniques, 12);
+  f_010_011_000_111_1(uniques, 12);
+  f_010_011_001_000_1(uniques, 12);
+  f_010_011_001_001_1(uniques, 12);
+  f_010_011_001_010_1(uniques, 12);
+  f_010_011_001_011_1(uniques, 12);
+  f_010_011_001_100_1(uniques, 12);
+  f_010_011_001_101_1(uniques, 12);
+  f_010_011_001_110_1(uniques, 12);
+  f_010_011_001_111_1(uniques, 12);
+  f_010_011_010_000_1(uniques, 12);
+  f_010_011_010_001_1(uniques, 12);
+  f_010_011_010_010_1(uniques, 12);
+  f_010_011_010_011_1(uniques, 12);
+  f_010_011_010_100_1(uniques, 12);
+  f_010_011_010_101_1(uniques, 12);
+  f_010_011_010_110_1(uniques, 12);
+  f_010_011_010_111_1(uniques, 12);
+  f_010_011_011_000_1(uniques, 12);
+  f_010_011_011_001_1(uniques, 12);
+  f_010_011_011_010_1(uniques, 12);
+  f_010_011_011_011_1(uniques, 12);
+  f_010_011_011_100_1(uniques, 12);
+  f_010_011_011_101_1(uniques, 12);
+  f_010_011_011_110_1(uniques, 12);
+  f_010_011_011_111_1(uniques, 12);
+  f_010_011_100_000_1(uniques, 12);
+  f_010_011_100_001_1(uniques, 12);
+  f_010_011_100_010_1(uniques, 12);
+  f_010_011_100_011_1(uniques, 12);
+  f_010_011_100_100_1(uniques, 12);
+  f_010_011_100_101_1(uniques, 12);
+  f_010_011_100_110_1(uniques, 12);
+  f_010_011_100_111_1(uniques, 12);
+  f_010_011_101_000_1(uniques, 12);
+  f_010_011_101_001_1(uniques, 12);
+  f_010_011_101_010_1(uniques, 12);
+  f_010_011_101_011_1(uniques, 12);
+  f_010_011_101_100_1(uniques, 12);
+  f_010_011_101_101_1(uniques, 12);
+  f_010_011_101_110_1(uniques, 12);
+  f_010_011_101_111_1(uniques, 12);
+  f_010_011_110_000_1(uniques, 12);
+  f_010_011_110_001_1(uniques, 12);
+  f_010_011_110_010_1(uniques, 12);
+  f_010_011_110_011_1(uniques, 12);
+  f_010_011_110_100_1(uniques, 12);
+  f_010_011_110_101_1(uniques, 12);
+  f_010_011_110_110_1(uniques, 12);
+  f_010_011_110_111_1(uniques, 12);
+  f_010_011_111_000_1(uniques, 12);
+  f_010_011_111_001_1(uniques, 12);
+  f_010_011_111_010_1(uniques, 12);
+  f_010_011_111_011_1(uniques, 12);
+  f_010_011_111_100_1(uniques, 12);
+  f_010_011_111_101_1(uniques, 12);
+  f_010_011_111_110_1(uniques, 12);
+  f_010_011_111_111_1(uniques, 12);
+  f_010_100_000_000_1(uniques, 12);
+  f_010_100_000_001_1(uniques, 12);
+  f_010_100_000_010_1(uniques, 12);
+  f_010_100_000_011_1(uniques, 12);
+  f_010_100_000_100_1(uniques, 12);
+  f_010_100_000_101_1(uniques, 12);
+  f_010_100_000_110_1(uniques, 12);
+  f_010_100_000_111_1(uniques, 12);
+  f_010_100_001_000_1(uniques, 12);
+  f_010_100_001_001_1(uniques, 12);
+  f_010_100_001_010_1(uniques, 12);
+  f_010_100_001_011_1(uniques, 12);
+  f_010_100_001_100_1(uniques, 12);
+  f_010_100_001_101_1(uniques, 12);
+  f_010_100_001_110_1(uniques, 12);
+  f_010_100_001_111_1(uniques, 12);
+  f_010_100_010_000_1(uniques, 12);
+  f_010_100_010_001_1(uniques, 12);
+  f_010_100_010_010_1(uniques, 12);
+  f_010_100_010_011_1(uniques, 12);
+  f_010_100_010_100_1(uniques, 12);
+  f_010_100_010_101_1(uniques, 12);
+  f_010_100_010_110_1(uniques, 12);
+  f_010_100_010_111_1(uniques, 12);
+  f_010_100_011_000_1(uniques, 12);
+  f_010_100_011_001_1(uniques, 12);
+  f_010_100_011_010_1(uniques, 12);
+  f_010_100_011_011_1(uniques, 12);
+  f_010_100_011_100_1(uniques, 12);
+  f_010_100_011_101_1(uniques, 12);
+  f_010_100_011_110_1(uniques, 12);
+  f_010_100_011_111_1(uniques, 12);
+  f_010_100_100_000_1(uniques, 12);
+  f_010_100_100_001_1(uniques, 12);
+  f_010_100_100_010_1(uniques, 12);
+  f_010_100_100_011_1(uniques, 12);
+  f_010_100_100_100_1(uniques, 12);
+  f_010_100_100_101_1(uniques, 12);
+  f_010_100_100_110_1(uniques, 12);
+  f_010_100_100_111_1(uniques, 12);
+  f_010_100_101_000_1(uniques, 12);
+  f_010_100_101_001_1(uniques, 12);
+  f_010_100_101_010_1(uniques, 12);
+  f_010_100_101_011_1(uniques, 12);
+  f_010_100_101_100_1(uniques, 12);
+  f_010_100_101_101_1(uniques, 12);
+  f_010_100_101_110_1(uniques, 12);
+  f_010_100_101_111_1(uniques, 12);
+  f_010_100_110_000_1(uniques, 12);
+  f_010_100_110_001_1(uniques, 12);
+  f_010_100_110_010_1(uniques, 12);
+  f_010_100_110_011_1(uniques, 12);
+  f_010_100_110_100_1(uniques, 12);
+  f_010_100_110_101_1(uniques, 12);
+  f_010_100_110_110_1(uniques, 12);
+  f_010_100_110_111_1(uniques, 12);
+  f_010_100_111_000_1(uniques, 12);
+  f_010_100_111_001_1(uniques, 12);
+  f_010_100_111_010_1(uniques, 12);
+  f_010_100_111_011_1(uniques, 12);
+  f_010_100_111_100_1(uniques, 12);
+  f_010_100_111_101_1(uniques, 12);
+  f_010_100_111_110_1(uniques, 12);
+  f_010_100_111_111_1(uniques, 12);
+  f_010_101_000_000_1(uniques, 12);
+  f_010_101_000_001_1(uniques, 12);
+  f_010_101_000_010_1(uniques, 12);
+  f_010_101_000_011_1(uniques, 12);
+  f_010_101_000_100_1(uniques, 12);
+  f_010_101_000_101_1(uniques, 12);
+  f_010_101_000_110_1(uniques, 12);
+  f_010_101_000_111_1(uniques, 12);
+  f_010_101_001_000_1(uniques, 12);
+  f_010_101_001_001_1(uniques, 12);
+  f_010_101_001_010_1(uniques, 12);
+  f_010_101_001_011_1(uniques, 12);
+  f_010_101_001_100_1(uniques, 12);
+  f_010_101_001_101_1(uniques, 12);
+  f_010_101_001_110_1(uniques, 12);
+  f_010_101_001_111_1(uniques, 12);
+  f_010_101_010_000_1(uniques, 12);
+  f_010_101_010_001_1(uniques, 12);
+  f_010_101_010_010_1(uniques, 12);
+  f_010_101_010_011_1(uniques, 12);
+  f_010_101_010_100_1(uniques, 12);
+  f_010_101_010_101_1(uniques, 12);
+  f_010_101_010_110_1(uniques, 12);
+  f_010_101_010_111_1(uniques, 12);
+  f_010_101_011_000_1(uniques, 12);
+  f_010_101_011_001_1(uniques, 12);
+  f_010_101_011_010_1(uniques, 12);
+  f_010_101_011_011_1(uniques, 12);
+  f_010_101_011_100_1(uniques, 12);
+  f_010_101_011_101_1(uniques, 12);
+  f_010_101_011_110_1(uniques, 12);
+  f_010_101_011_111_1(uniques, 12);
+  f_010_101_100_000_1(uniques, 12);
+  f_010_101_100_001_1(uniques, 12);
+  f_010_101_100_010_1(uniques, 12);
+  f_010_101_100_011_1(uniques, 12);
+  f_010_101_100_100_1(uniques, 12);
+  f_010_101_100_101_1(uniques, 12);
+  f_010_101_100_110_1(uniques, 12);
+  f_010_101_100_111_1(uniques, 12);
+  f_010_101_101_000_1(uniques, 12);
+  f_010_101_101_001_1(uniques, 12);
+  f_010_101_101_010_1(uniques, 12);
+  f_010_101_101_011_1(uniques, 12);
+  f_010_101_101_100_1(uniques, 12);
+  f_010_101_101_101_1(uniques, 12);
+  f_010_101_101_110_1(uniques, 12);
+  f_010_101_101_111_1(uniques, 12);
+  f_010_101_110_000_1(uniques, 12);
+  f_010_101_110_001_1(uniques, 12);
+  f_010_101_110_010_1(uniques, 12);
+  f_010_101_110_011_1(uniques, 12);
+  f_010_101_110_100_1(uniques, 12);
+  f_010_101_110_101_1(uniques, 12);
+  f_010_101_110_110_1(uniques, 12);
+  f_010_101_110_111_1(uniques, 12);
+  f_010_101_111_000_1(uniques, 12);
+  f_010_101_111_001_1(uniques, 12);
+  f_010_101_111_010_1(uniques, 12);
+  f_010_101_111_011_1(uniques, 12);
+  f_010_101_111_100_1(uniques, 12);
+  f_010_101_111_101_1(uniques, 12);
+  f_010_101_111_110_1(uniques, 12);
+  f_010_101_111_111_1(uniques, 12);
+  f_010_110_000_000_1(uniques, 12);
+  f_010_110_000_001_1(uniques, 12);
+  f_010_110_000_010_1(uniques, 12);
+  f_010_110_000_011_1(uniques, 12);
+  f_010_110_000_100_1(uniques, 12);
+  f_010_110_000_101_1(uniques, 12);
+  f_010_110_000_110_1(uniques, 12);
+  f_010_110_000_111_1(uniques, 12);
+  f_010_110_001_000_1(uniques, 12);
+  f_010_110_001_001_1(uniques, 12);
+  f_010_110_001_010_1(uniques, 12);
+  f_010_110_001_011_1(uniques, 12);
+  f_010_110_001_100_1(uniques, 12);
+  f_010_110_001_101_1(uniques, 12);
+  f_010_110_001_110_1(uniques, 12);
+  f_010_110_001_111_1(uniques, 12);
+  f_010_110_010_000_1(uniques, 12);
+  f_010_110_010_001_1(uniques, 12);
+  f_010_110_010_010_1(uniques, 12);
+  f_010_110_010_011_1(uniques, 12);
+  f_010_110_010_100_1(uniques, 12);
+  f_010_110_010_101_1(uniques, 12);
+  f_010_110_010_110_1(uniques, 12);
+  f_010_110_010_111_1(uniques, 12);
+  f_010_110_011_000_1(uniques, 12);
+  f_010_110_011_001_1(uniques, 12);
+  f_010_110_011_010_1(uniques, 12);
+  f_010_110_011_011_1(uniques, 12);
+  f_010_110_011_100_1(uniques, 12);
+  f_010_110_011_101_1(uniques, 12);
+  f_010_110_011_110_1(uniques, 12);
+  f_010_110_011_111_1(uniques, 12);
+  f_010_110_100_000_1(uniques, 12);
+  f_010_110_100_001_1(uniques, 12);
+  f_010_110_100_010_1(uniques, 12);
+  f_010_110_100_011_1(uniques, 12);
+  f_010_110_100_100_1(uniques, 12);
+  f_010_110_100_101_1(uniques, 12);
+  f_010_110_100_110_1(uniques, 12);
+  f_010_110_100_111_1(uniques, 12);
+  f_010_110_101_000_1(uniques, 12);
+  f_010_110_101_001_1(uniques, 12);
+  f_010_110_101_010_1(uniques, 12);
+  f_010_110_101_011_1(uniques, 12);
+  f_010_110_101_100_1(uniques, 12);
+  f_010_110_101_101_1(uniques, 12);
+  f_010_110_101_110_1(uniques, 12);
+  f_010_110_101_111_1(uniques, 12);
+  f_010_110_110_000_1(uniques, 12);
+  f_010_110_110_001_1(uniques, 12);
+  f_010_110_110_010_1(uniques, 12);
+  f_010_110_110_011_1(uniques, 12);
+  f_010_110_110_100_1(uniques, 12);
+  f_010_110_110_101_1(uniques, 12);
+  f_010_110_110_110_1(uniques, 12);
+  f_010_110_110_111_1(uniques, 12);
+  f_010_110_111_000_1(uniques, 12);
+  f_010_110_111_001_1(uniques, 12);
+  f_010_110_111_010_1(uniques, 12);
+  f_010_110_111_011_1(uniques, 12);
+  f_010_110_111_100_1(uniques, 12);
+  f_010_110_111_101_1(uniques, 12);
+  f_010_110_111_110_1(uniques, 12);
+  f_010_110_111_111_1(uniques, 12);
+  f_010_111_000_000_1(uniques, 12);
+  f_010_111_000_001_1(uniques, 12);
+  f_010_111_000_010_1(uniques, 12);
+  f_010_111_000_011_1(uniques, 12);
+  f_010_111_000_100_1(uniques, 12);
+  f_010_111_000_101_1(uniques, 12);
+  f_010_111_000_110_1(uniques, 12);
+  f_010_111_000_111_1(uniques, 12);
+  f_010_111_001_000_1(uniques, 12);
+  f_010_111_001_001_1(uniques, 12);
+  f_010_111_001_010_1(uniques, 12);
+  f_010_111_001_011_1(uniques, 12);
+  f_010_111_001_100_1(uniques, 12);
+  f_010_111_001_101_1(uniques, 12);
+  f_010_111_001_110_1(uniques, 12);
+  f_010_111_001_111_1(uniques, 12);
+  f_010_111_010_000_1(uniques, 12);
+  f_010_111_010_001_1(uniques, 12);
+  f_010_111_010_010_1(uniques, 12);
+  f_010_111_010_011_1(uniques, 12);
+  f_010_111_010_100_1(uniques, 12);
+  f_010_111_010_101_1(uniques, 12);
+  f_010_111_010_110_1(uniques, 12);
+  f_010_111_010_111_1(uniques, 12);
+  f_010_111_011_000_1(uniques, 12);
+  f_010_111_011_001_1(uniques, 12);
+  f_010_111_011_010_1(uniques, 12);
+  f_010_111_011_011_1(uniques, 12);
+  f_010_111_011_100_1(uniques, 12);
+  f_010_111_011_101_1(uniques, 12);
+  f_010_111_011_110_1(uniques, 12);
+  f_010_111_011_111_1(uniques, 12);
+  f_010_111_100_000_1(uniques, 12);
+  f_010_111_100_001_1(uniques, 12);
+  f_010_111_100_010_1(uniques, 12);
+  f_010_111_100_011_1(uniques, 12);
+  f_010_111_100_100_1(uniques, 12);
+  f_010_111_100_101_1(uniques, 12);
+  f_010_111_100_110_1(uniques, 12);
+  f_010_111_100_111_1(uniques, 12);
+  f_010_111_101_000_1(uniques, 12);
+  f_010_111_101_001_1(uniques, 12);
+  f_010_111_101_010_1(uniques, 12);
+  f_010_111_101_011_1(uniques, 12);
+  f_010_111_101_100_1(uniques, 12);
+  f_010_111_101_101_1(uniques, 12);
+  f_010_111_101_110_1(uniques, 12);
+  f_010_111_101_111_1(uniques, 12);
+  f_010_111_110_000_1(uniques, 12);
+  f_010_111_110_001_1(uniques, 12);
+  f_010_111_110_010_1(uniques, 12);
+  f_010_111_110_011_1(uniques, 12);
+  f_010_111_110_100_1(uniques, 12);
+  f_010_111_110_101_1(uniques, 12);
+  f_010_111_110_110_1(uniques, 12);
+  f_010_111_110_111_1(uniques, 12);
+  f_010_111_111_000_1(uniques, 12);
+  f_010_111_111_001_1(uniques, 12);
+  f_010_111_111_010_1(uniques, 12);
+  f_010_111_111_011_1(uniques, 12);
+  f_010_111_111_100_1(uniques, 12);
+  f_010_111_111_101_1(uniques, 12);
+  f_010_111_111_110_1(uniques, 12);
+  f_010_111_111_111_1(uniques, 12);
+  f_011_000_000_000_1(uniques, 12);
+  f_011_000_000_001_1(uniques, 12);
+  f_011_000_000_010_1(uniques, 12);
+  f_011_000_000_011_1(uniques, 12);
+  f_011_000_000_100_1(uniques, 12);
+  f_011_000_000_101_1(uniques, 12);
+  f_011_000_000_110_1(uniques, 12);
+  f_011_000_000_111_1(uniques, 12);
+  f_011_000_001_000_1(uniques, 12);
+  f_011_000_001_001_1(uniques, 12);
+  f_011_000_001_010_1(uniques, 12);
+  f_011_000_001_011_1(uniques, 12);
+  f_011_000_001_100_1(uniques, 12);
+  f_011_000_001_101_1(uniques, 12);
+  f_011_000_001_110_1(uniques, 12);
+  f_011_000_001_111_1(uniques, 12);
+  f_011_000_010_000_1(uniques, 12);
+  f_011_000_010_001_1(uniques, 12);
+  f_011_000_010_010_1(uniques, 12);
+  f_011_000_010_011_1(uniques, 12);
+  f_011_000_010_100_1(uniques, 12);
+  f_011_000_010_101_1(uniques, 12);
+  f_011_000_010_110_1(uniques, 12);
+  f_011_000_010_111_1(uniques, 12);
+  f_011_000_011_000_1(uniques, 12);
+  f_011_000_011_001_1(uniques, 12);
+  f_011_000_011_010_1(uniques, 12);
+  f_011_000_011_011_1(uniques, 12);
+  f_011_000_011_100_1(uniques, 12);
+  f_011_000_011_101_1(uniques, 12);
+  f_011_000_011_110_1(uniques, 12);
+  f_011_000_011_111_1(uniques, 12);
+  f_011_000_100_000_1(uniques, 12);
+  f_011_000_100_001_1(uniques, 12);
+  f_011_000_100_010_1(uniques, 12);
+  f_011_000_100_011_1(uniques, 12);
+  f_011_000_100_100_1(uniques, 12);
+  f_011_000_100_101_1(uniques, 12);
+  f_011_000_100_110_1(uniques, 12);
+  f_011_000_100_111_1(uniques, 12);
+  f_011_000_101_000_1(uniques, 12);
+  f_011_000_101_001_1(uniques, 12);
+  f_011_000_101_010_1(uniques, 12);
+  f_011_000_101_011_1(uniques, 12);
+  f_011_000_101_100_1(uniques, 12);
+  f_011_000_101_101_1(uniques, 12);
+  f_011_000_101_110_1(uniques, 12);
+  f_011_000_101_111_1(uniques, 12);
+  f_011_000_110_000_1(uniques, 12);
+  f_011_000_110_001_1(uniques, 12);
+  f_011_000_110_010_1(uniques, 12);
+  f_011_000_110_011_1(uniques, 12);
+  f_011_000_110_100_1(uniques, 12);
+  f_011_000_110_101_1(uniques, 12);
+  f_011_000_110_110_1(uniques, 12);
+  f_011_000_110_111_1(uniques, 12);
+  f_011_000_111_000_1(uniques, 12);
+  f_011_000_111_001_1(uniques, 12);
+  f_011_000_111_010_1(uniques, 12);
+  f_011_000_111_011_1(uniques, 12);
+  f_011_000_111_100_1(uniques, 12);
+  f_011_000_111_101_1(uniques, 12);
+  f_011_000_111_110_1(uniques, 12);
+  f_011_000_111_111_1(uniques, 12);
+  f_011_001_000_000_1(uniques, 12);
+  f_011_001_000_001_1(uniques, 12);
+  f_011_001_000_010_1(uniques, 12);
+  f_011_001_000_011_1(uniques, 12);
+  f_011_001_000_100_1(uniques, 12);
+  f_011_001_000_101_1(uniques, 12);
+  f_011_001_000_110_1(uniques, 12);
+  f_011_001_000_111_1(uniques, 12);
+  f_011_001_001_000_1(uniques, 12);
+  f_011_001_001_001_1(uniques, 12);
+  f_011_001_001_010_1(uniques, 12);
+  f_011_001_001_011_1(uniques, 12);
+  f_011_001_001_100_1(uniques, 12);
+  f_011_001_001_101_1(uniques, 12);
+  f_011_001_001_110_1(uniques, 12);
+  f_011_001_001_111_1(uniques, 12);
+  f_011_001_010_000_1(uniques, 12);
+  f_011_001_010_001_1(uniques, 12);
+  f_011_001_010_010_1(uniques, 12);
+  f_011_001_010_011_1(uniques, 12);
+  f_011_001_010_100_1(uniques, 12);
+  f_011_001_010_101_1(uniques, 12);
+  f_011_001_010_110_1(uniques, 12);
+  f_011_001_010_111_1(uniques, 12);
+  f_011_001_011_000_1(uniques, 12);
+  f_011_001_011_001_1(uniques, 12);
+  f_011_001_011_010_1(uniques, 12);
+  f_011_001_011_011_1(uniques, 12);
+  f_011_001_011_100_1(uniques, 12);
+  f_011_001_011_101_1(uniques, 12);
+  f_011_001_011_110_1(uniques, 12);
+  f_011_001_011_111_1(uniques, 12);
+  f_011_001_100_000_1(uniques, 12);
+  f_011_001_100_001_1(uniques, 12);
+  f_011_001_100_010_1(uniques, 12);
+  f_011_001_100_011_1(uniques, 12);
+  f_011_001_100_100_1(uniques, 12);
+  f_011_001_100_101_1(uniques, 12);
+  f_011_001_100_110_1(uniques, 12);
+  f_011_001_100_111_1(uniques, 12);
+  f_011_001_101_000_1(uniques, 12);
+  f_011_001_101_001_1(uniques, 12);
+  f_011_001_101_010_1(uniques, 12);
+  f_011_001_101_011_1(uniques, 12);
+  f_011_001_101_100_1(uniques, 12);
+  f_011_001_101_101_1(uniques, 12);
+  f_011_001_101_110_1(uniques, 12);
+  f_011_001_101_111_1(uniques, 12);
+  f_011_001_110_000_1(uniques, 12);
+  f_011_001_110_001_1(uniques, 12);
+  f_011_001_110_010_1(uniques, 12);
+  f_011_001_110_011_1(uniques, 12);
+  f_011_001_110_100_1(uniques, 12);
+  f_011_001_110_101_1(uniques, 12);
+  f_011_001_110_110_1(uniques, 12);
+  f_011_001_110_111_1(uniques, 12);
+  f_011_001_111_000_1(uniques, 12);
+  f_011_001_111_001_1(uniques, 12);
+  f_011_001_111_010_1(uniques, 12);
+  f_011_001_111_011_1(uniques, 12);
+  f_011_001_111_100_1(uniques, 12);
+  f_011_001_111_101_1(uniques, 12);
+  f_011_001_111_110_1(uniques, 12);
+  f_011_001_111_111_1(uniques, 12);
+  f_011_010_000_000_1(uniques, 12);
+  f_011_010_000_001_1(uniques, 12);
+  f_011_010_000_010_1(uniques, 12);
+  f_011_010_000_011_1(uniques, 12);
+  f_011_010_000_100_1(uniques, 12);
+  f_011_010_000_101_1(uniques, 12);
+  f_011_010_000_110_1(uniques, 12);
+  f_011_010_000_111_1(uniques, 12);
+  f_011_010_001_000_1(uniques, 12);
+  f_011_010_001_001_1(uniques, 12);
+  f_011_010_001_010_1(uniques, 12);
+  f_011_010_001_011_1(uniques, 12);
+  f_011_010_001_100_1(uniques, 12);
+  f_011_010_001_101_1(uniques, 12);
+  f_011_010_001_110_1(uniques, 12);
+  f_011_010_001_111_1(uniques, 12);
+  f_011_010_010_000_1(uniques, 12);
+  f_011_010_010_001_1(uniques, 12);
+  f_011_010_010_010_1(uniques, 12);
+  f_011_010_010_011_1(uniques, 12);
+  f_011_010_010_100_1(uniques, 12);
+  f_011_010_010_101_1(uniques, 12);
+  f_011_010_010_110_1(uniques, 12);
+  f_011_010_010_111_1(uniques, 12);
+  f_011_010_011_000_1(uniques, 12);
+  f_011_010_011_001_1(uniques, 12);
+  f_011_010_011_010_1(uniques, 12);
+  f_011_010_011_011_1(uniques, 12);
+  f_011_010_011_100_1(uniques, 12);
+  f_011_010_011_101_1(uniques, 12);
+  f_011_010_011_110_1(uniques, 12);
+  f_011_010_011_111_1(uniques, 12);
+  f_011_010_100_000_1(uniques, 12);
+  f_011_010_100_001_1(uniques, 12);
+  f_011_010_100_010_1(uniques, 12);
+  f_011_010_100_011_1(uniques, 12);
+  f_011_010_100_100_1(uniques, 12);
+  f_011_010_100_101_1(uniques, 12);
+  f_011_010_100_110_1(uniques, 12);
+  f_011_010_100_111_1(uniques, 12);
+  f_011_010_101_000_1(uniques, 12);
+  f_011_010_101_001_1(uniques, 12);
+  f_011_010_101_010_1(uniques, 12);
+  f_011_010_101_011_1(uniques, 12);
+  f_011_010_101_100_1(uniques, 12);
+  f_011_010_101_101_1(uniques, 12);
+  f_011_010_101_110_1(uniques, 12);
+  f_011_010_101_111_1(uniques, 12);
+  f_011_010_110_000_1(uniques, 12);
+  f_011_010_110_001_1(uniques, 12);
+  f_011_010_110_010_1(uniques, 12);
+  f_011_010_110_011_1(uniques, 12);
+  f_011_010_110_100_1(uniques, 12);
+  f_011_010_110_101_1(uniques, 12);
+  f_011_010_110_110_1(uniques, 12);
+  f_011_010_110_111_1(uniques, 12);
+  f_011_010_111_000_1(uniques, 12);
+  f_011_010_111_001_1(uniques, 12);
+  f_011_010_111_010_1(uniques, 12);
+  f_011_010_111_011_1(uniques, 12);
+  f_011_010_111_100_1(uniques, 12);
+  f_011_010_111_101_1(uniques, 12);
+  f_011_010_111_110_1(uniques, 12);
+  f_011_010_111_111_1(uniques, 12);
+  f_011_011_000_000_1(uniques, 12);
+  f_011_011_000_001_1(uniques, 12);
+  f_011_011_000_010_1(uniques, 12);
+  f_011_011_000_011_1(uniques, 12);
+  f_011_011_000_100_1(uniques, 12);
+  f_011_011_000_101_1(uniques, 12);
+  f_011_011_000_110_1(uniques, 12);
+  f_011_011_000_111_1(uniques, 12);
+  f_011_011_001_000_1(uniques, 12);
+  f_011_011_001_001_1(uniques, 12);
+  f_011_011_001_010_1(uniques, 12);
+  f_011_011_001_011_1(uniques, 12);
+  f_011_011_001_100_1(uniques, 12);
+  f_011_011_001_101_1(uniques, 12);
+  f_011_011_001_110_1(uniques, 12);
+  f_011_011_001_111_1(uniques, 12);
+  f_011_011_010_000_1(uniques, 12);
+  f_011_011_010_001_1(uniques, 12);
+  f_011_011_010_010_1(uniques, 12);
+  f_011_011_010_011_1(uniques, 12);
+  f_011_011_010_100_1(uniques, 12);
+  f_011_011_010_101_1(uniques, 12);
+  f_011_011_010_110_1(uniques, 12);
+  f_011_011_010_111_1(uniques, 12);
+  f_011_011_011_000_1(uniques, 12);
+  f_011_011_011_001_1(uniques, 12);
+  f_011_011_011_010_1(uniques, 12);
+  f_011_011_011_011_1(uniques, 12);
+  f_011_011_011_100_1(uniques, 12);
+  f_011_011_011_101_1(uniques, 12);
+  f_011_011_011_110_1(uniques, 12);
+  f_011_011_011_111_1(uniques, 12);
+  f_011_011_100_000_1(uniques, 12);
+  f_011_011_100_001_1(uniques, 12);
+  f_011_011_100_010_1(uniques, 12);
+  f_011_011_100_011_1(uniques, 12);
+  f_011_011_100_100_1(uniques, 12);
+  f_011_011_100_101_1(uniques, 12);
+  f_011_011_100_110_1(uniques, 12);
+  f_011_011_100_111_1(uniques, 12);
+  f_011_011_101_000_1(uniques, 12);
+  f_011_011_101_001_1(uniques, 12);
+  f_011_011_101_010_1(uniques, 12);
+  f_011_011_101_011_1(uniques, 12);
+  f_011_011_101_100_1(uniques, 12);
+  f_011_011_101_101_1(uniques, 12);
+  f_011_011_101_110_1(uniques, 12);
+  f_011_011_101_111_1(uniques, 12);
+  f_011_011_110_000_1(uniques, 12);
+  f_011_011_110_001_1(uniques, 12);
+  f_011_011_110_010_1(uniques, 12);
+  f_011_011_110_011_1(uniques, 12);
+  f_011_011_110_100_1(uniques, 12);
+  f_011_011_110_101_1(uniques, 12);
+  f_011_011_110_110_1(uniques, 12);
+  f_011_011_110_111_1(uniques, 12);
+  f_011_011_111_000_1(uniques, 12);
+  f_011_011_111_001_1(uniques, 12);
+  f_011_011_111_010_1(uniques, 12);
+  f_011_011_111_011_1(uniques, 12);
+  f_011_011_111_100_1(uniques, 12);
+  f_011_011_111_101_1(uniques, 12);
+  f_011_011_111_110_1(uniques, 12);
+  f_011_011_111_111_1(uniques, 12);
+  f_011_100_000_000_1(uniques, 12);
+  f_011_100_000_001_1(uniques, 12);
+  f_011_100_000_010_1(uniques, 12);
+  f_011_100_000_011_1(uniques, 12);
+  f_011_100_000_100_1(uniques, 12);
+  f_011_100_000_101_1(uniques, 12);
+  f_011_100_000_110_1(uniques, 12);
+  f_011_100_000_111_1(uniques, 12);
+  f_011_100_001_000_1(uniques, 12);
+  f_011_100_001_001_1(uniques, 12);
+  f_011_100_001_010_1(uniques, 12);
+  f_011_100_001_011_1(uniques, 12);
+  f_011_100_001_100_1(uniques, 12);
+  f_011_100_001_101_1(uniques, 12);
+  f_011_100_001_110_1(uniques, 12);
+  f_011_100_001_111_1(uniques, 12);
+  f_011_100_010_000_1(uniques, 12);
+  f_011_100_010_001_1(uniques, 12);
+  f_011_100_010_010_1(uniques, 12);
+  f_011_100_010_011_1(uniques, 12);
+  f_011_100_010_100_1(uniques, 12);
+  f_011_100_010_101_1(uniques, 12);
+  f_011_100_010_110_1(uniques, 12);
+  f_011_100_010_111_1(uniques, 12);
+  f_011_100_011_000_1(uniques, 12);
+  f_011_100_011_001_1(uniques, 12);
+  f_011_100_011_010_1(uniques, 12);
+  f_011_100_011_011_1(uniques, 12);
+  f_011_100_011_100_1(uniques, 12);
+  f_011_100_011_101_1(uniques, 12);
+  f_011_100_011_110_1(uniques, 12);
+  f_011_100_011_111_1(uniques, 12);
+  f_011_100_100_000_1(uniques, 12);
+  f_011_100_100_001_1(uniques, 12);
+  f_011_100_100_010_1(uniques, 12);
+  f_011_100_100_011_1(uniques, 12);
+  f_011_100_100_100_1(uniques, 12);
+  f_011_100_100_101_1(uniques, 12);
+  f_011_100_100_110_1(uniques, 12);
+  f_011_100_100_111_1(uniques, 12);
+  f_011_100_101_000_1(uniques, 12);
+  f_011_100_101_001_1(uniques, 12);
+  f_011_100_101_010_1(uniques, 12);
+  f_011_100_101_011_1(uniques, 12);
+  f_011_100_101_100_1(uniques, 12);
+  f_011_100_101_101_1(uniques, 12);
+  f_011_100_101_110_1(uniques, 12);
+  f_011_100_101_111_1(uniques, 12);
+  f_011_100_110_000_1(uniques, 12);
+  f_011_100_110_001_1(uniques, 12);
+  f_011_100_110_010_1(uniques, 12);
+  f_011_100_110_011_1(uniques, 12);
+  f_011_100_110_100_1(uniques, 12);
+  f_011_100_110_101_1(uniques, 12);
+  f_011_100_110_110_1(uniques, 12);
+  f_011_100_110_111_1(uniques, 12);
+  f_011_100_111_000_1(uniques, 12);
+  f_011_100_111_001_1(uniques, 12);
+  f_011_100_111_010_1(uniques, 12);
+  f_011_100_111_011_1(uniques, 12);
+  f_011_100_111_100_1(uniques, 12);
+  f_011_100_111_101_1(uniques, 12);
+  f_011_100_111_110_1(uniques, 12);
+  f_011_100_111_111_1(uniques, 12);
+  f_011_101_000_000_1(uniques, 12);
+  f_011_101_000_001_1(uniques, 12);
+  f_011_101_000_010_1(uniques, 12);
+  f_011_101_000_011_1(uniques, 12);
+  f_011_101_000_100_1(uniques, 12);
+  f_011_101_000_101_1(uniques, 12);
+  f_011_101_000_110_1(uniques, 12);
+  f_011_101_000_111_1(uniques, 12);
+  f_011_101_001_000_1(uniques, 12);
+  f_011_101_001_001_1(uniques, 12);
+  f_011_101_001_010_1(uniques, 12);
+  f_011_101_001_011_1(uniques, 12);
+  f_011_101_001_100_1(uniques, 12);
+  f_011_101_001_101_1(uniques, 12);
+  f_011_101_001_110_1(uniques, 12);
+  f_011_101_001_111_1(uniques, 12);
+  f_011_101_010_000_1(uniques, 12);
+  f_011_101_010_001_1(uniques, 12);
+  f_011_101_010_010_1(uniques, 12);
+  f_011_101_010_011_1(uniques, 12);
+  f_011_101_010_100_1(uniques, 12);
+  f_011_101_010_101_1(uniques, 12);
+  f_011_101_010_110_1(uniques, 12);
+  f_011_101_010_111_1(uniques, 12);
+  f_011_101_011_000_1(uniques, 12);
+  f_011_101_011_001_1(uniques, 12);
+  f_011_101_011_010_1(uniques, 12);
+  f_011_101_011_011_1(uniques, 12);
+  f_011_101_011_100_1(uniques, 12);
+  f_011_101_011_101_1(uniques, 12);
+  f_011_101_011_110_1(uniques, 12);
+  f_011_101_011_111_1(uniques, 12);
+  f_011_101_100_000_1(uniques, 12);
+  f_011_101_100_001_1(uniques, 12);
+  f_011_101_100_010_1(uniques, 12);
+  f_011_101_100_011_1(uniques, 12);
+  f_011_101_100_100_1(uniques, 12);
+  f_011_101_100_101_1(uniques, 12);
+  f_011_101_100_110_1(uniques, 12);
+  f_011_101_100_111_1(uniques, 12);
+  f_011_101_101_000_1(uniques, 12);
+  f_011_101_101_001_1(uniques, 12);
+  f_011_101_101_010_1(uniques, 12);
+  f_011_101_101_011_1(uniques, 12);
+  f_011_101_101_100_1(uniques, 12);
+  f_011_101_101_101_1(uniques, 12);
+  f_011_101_101_110_1(uniques, 12);
+  f_011_101_101_111_1(uniques, 12);
+  f_011_101_110_000_1(uniques, 12);
+  f_011_101_110_001_1(uniques, 12);
+  f_011_101_110_010_1(uniques, 12);
+  f_011_101_110_011_1(uniques, 12);
+  f_011_101_110_100_1(uniques, 12);
+  f_011_101_110_101_1(uniques, 12);
+  f_011_101_110_110_1(uniques, 12);
+  f_011_101_110_111_1(uniques, 12);
+  f_011_101_111_000_1(uniques, 12);
+  f_011_101_111_001_1(uniques, 12);
+  f_011_101_111_010_1(uniques, 12);
+  f_011_101_111_011_1(uniques, 12);
+  f_011_101_111_100_1(uniques, 12);
+  f_011_101_111_101_1(uniques, 12);
+  f_011_101_111_110_1(uniques, 12);
+  f_011_101_111_111_1(uniques, 12);
+  f_011_110_000_000_1(uniques, 12);
+  f_011_110_000_001_1(uniques, 12);
+  f_011_110_000_010_1(uniques, 12);
+  f_011_110_000_011_1(uniques, 12);
+  f_011_110_000_100_1(uniques, 12);
+  f_011_110_000_101_1(uniques, 12);
+  f_011_110_000_110_1(uniques, 12);
+  f_011_110_000_111_1(uniques, 12);
+  f_011_110_001_000_1(uniques, 12);
+  f_011_110_001_001_1(uniques, 12);
+  f_011_110_001_010_1(uniques, 12);
+  f_011_110_001_011_1(uniques, 12);
+  f_011_110_001_100_1(uniques, 12);
+  f_011_110_001_101_1(uniques, 12);
+  f_011_110_001_110_1(uniques, 12);
+  f_011_110_001_111_1(uniques, 12);
+  f_011_110_010_000_1(uniques, 12);
+  f_011_110_010_001_1(uniques, 12);
+  f_011_110_010_010_1(uniques, 12);
+  f_011_110_010_011_1(uniques, 12);
+  f_011_110_010_100_1(uniques, 12);
+  f_011_110_010_101_1(uniques, 12);
+  f_011_110_010_110_1(uniques, 12);
+  f_011_110_010_111_1(uniques, 12);
+  f_011_110_011_000_1(uniques, 12);
+  f_011_110_011_001_1(uniques, 12);
+  f_011_110_011_010_1(uniques, 12);
+  f_011_110_011_011_1(uniques, 12);
+  f_011_110_011_100_1(uniques, 12);
+  f_011_110_011_101_1(uniques, 12);
+  f_011_110_011_110_1(uniques, 12);
+  f_011_110_011_111_1(uniques, 12);
+  f_011_110_100_000_1(uniques, 12);
+  f_011_110_100_001_1(uniques, 12);
+  f_011_110_100_010_1(uniques, 12);
+  f_011_110_100_011_1(uniques, 12);
+  f_011_110_100_100_1(uniques, 12);
+  f_011_110_100_101_1(uniques, 12);
+  f_011_110_100_110_1(uniques, 12);
+  f_011_110_100_111_1(uniques, 12);
+  f_011_110_101_000_1(uniques, 12);
+  f_011_110_101_001_1(uniques, 12);
+  f_011_110_101_010_1(uniques, 12);
+  f_011_110_101_011_1(uniques, 12);
+  f_011_110_101_100_1(uniques, 12);
+  f_011_110_101_101_1(uniques, 12);
+  f_011_110_101_110_1(uniques, 12);
+  f_011_110_101_111_1(uniques, 12);
+  f_011_110_110_000_1(uniques, 12);
+  f_011_110_110_001_1(uniques, 12);
+  f_011_110_110_010_1(uniques, 12);
+  f_011_110_110_011_1(uniques, 12);
+  f_011_110_110_100_1(uniques, 12);
+  f_011_110_110_101_1(uniques, 12);
+  f_011_110_110_110_1(uniques, 12);
+  f_011_110_110_111_1(uniques, 12);
+  f_011_110_111_000_1(uniques, 12);
+  f_011_110_111_001_1(uniques, 12);
+  f_011_110_111_010_1(uniques, 12);
+  f_011_110_111_011_1(uniques, 12);
+  f_011_110_111_100_1(uniques, 12);
+  f_011_110_111_101_1(uniques, 12);
+  f_011_110_111_110_1(uniques, 12);
+  f_011_110_111_111_1(uniques, 12);
+  f_011_111_000_000_1(uniques, 12);
+  f_011_111_000_001_1(uniques, 12);
+  f_011_111_000_010_1(uniques, 12);
+  f_011_111_000_011_1(uniques, 12);
+  f_011_111_000_100_1(uniques, 12);
+  f_011_111_000_101_1(uniques, 12);
+  f_011_111_000_110_1(uniques, 12);
+  f_011_111_000_111_1(uniques, 12);
+  f_011_111_001_000_1(uniques, 12);
+  f_011_111_001_001_1(uniques, 12);
+  f_011_111_001_010_1(uniques, 12);
+  f_011_111_001_011_1(uniques, 12);
+  f_011_111_001_100_1(uniques, 12);
+  f_011_111_001_101_1(uniques, 12);
+  f_011_111_001_110_1(uniques, 12);
+  f_011_111_001_111_1(uniques, 12);
+  f_011_111_010_000_1(uniques, 12);
+  f_011_111_010_001_1(uniques, 12);
+  f_011_111_010_010_1(uniques, 12);
+  f_011_111_010_011_1(uniques, 12);
+  f_011_111_010_100_1(uniques, 12);
+  f_011_111_010_101_1(uniques, 12);
+  f_011_111_010_110_1(uniques, 12);
+  f_011_111_010_111_1(uniques, 12);
+  f_011_111_011_000_1(uniques, 12);
+  f_011_111_011_001_1(uniques, 12);
+  f_011_111_011_010_1(uniques, 12);
+  f_011_111_011_011_1(uniques, 12);
+  f_011_111_011_100_1(uniques, 12);
+  f_011_111_011_101_1(uniques, 12);
+  f_011_111_011_110_1(uniques, 12);
+  f_011_111_011_111_1(uniques, 12);
+  f_011_111_100_000_1(uniques, 12);
+  f_011_111_100_001_1(uniques, 12);
+  f_011_111_100_010_1(uniques, 12);
+  f_011_111_100_011_1(uniques, 12);
+  f_011_111_100_100_1(uniques, 12);
+  f_011_111_100_101_1(uniques, 12);
+  f_011_111_100_110_1(uniques, 12);
+  f_011_111_100_111_1(uniques, 12);
+  f_011_111_101_000_1(uniques, 12);
+  f_011_111_101_001_1(uniques, 12);
+  f_011_111_101_010_1(uniques, 12);
+  f_011_111_101_011_1(uniques, 12);
+  f_011_111_101_100_1(uniques, 12);
+  f_011_111_101_101_1(uniques, 12);
+  f_011_111_101_110_1(uniques, 12);
+  f_011_111_101_111_1(uniques, 12);
+  f_011_111_110_000_1(uniques, 12);
+  f_011_111_110_001_1(uniques, 12);
+  f_011_111_110_010_1(uniques, 12);
+  f_011_111_110_011_1(uniques, 12);
+  f_011_111_110_100_1(uniques, 12);
+  f_011_111_110_101_1(uniques, 12);
+  f_011_111_110_110_1(uniques, 12);
+  f_011_111_110_111_1(uniques, 12);
+  f_011_111_111_000_1(uniques, 12);
+  f_011_111_111_001_1(uniques, 12);
+  f_011_111_111_010_1(uniques, 12);
+  f_011_111_111_011_1(uniques, 12);
+  f_011_111_111_100_1(uniques, 12);
+  f_011_111_111_101_1(uniques, 12);
+  f_011_111_111_110_1(uniques, 12);
+  f_011_111_111_111_1(uniques, 12);
+  f_100_000_000_000_1(uniques, 12);
+  f_100_000_000_001_1(uniques, 12);
+  f_100_000_000_010_1(uniques, 12);
+  f_100_000_000_011_1(uniques, 12);
+  f_100_000_000_100_1(uniques, 12);
+  f_100_000_000_101_1(uniques, 12);
+  f_100_000_000_110_1(uniques, 12);
+  f_100_000_000_111_1(uniques, 12);
+  f_100_000_001_000_1(uniques, 12);
+  f_100_000_001_001_1(uniques, 12);
+  f_100_000_001_010_1(uniques, 12);
+  f_100_000_001_011_1(uniques, 12);
+  f_100_000_001_100_1(uniques, 12);
+  f_100_000_001_101_1(uniques, 12);
+  f_100_000_001_110_1(uniques, 12);
+  f_100_000_001_111_1(uniques, 12);
+  f_100_000_010_000_1(uniques, 12);
+  f_100_000_010_001_1(uniques, 12);
+  f_100_000_010_010_1(uniques, 12);
+  f_100_000_010_011_1(uniques, 12);
+  f_100_000_010_100_1(uniques, 12);
+  f_100_000_010_101_1(uniques, 12);
+  f_100_000_010_110_1(uniques, 12);
+  f_100_000_010_111_1(uniques, 12);
+  f_100_000_011_000_1(uniques, 12);
+  f_100_000_011_001_1(uniques, 12);
+  f_100_000_011_010_1(uniques, 12);
+  f_100_000_011_011_1(uniques, 12);
+  f_100_000_011_100_1(uniques, 12);
+  f_100_000_011_101_1(uniques, 12);
+  f_100_000_011_110_1(uniques, 12);
+  f_100_000_011_111_1(uniques, 12);
+  f_100_000_100_000_1(uniques, 12);
+  f_100_000_100_001_1(uniques, 12);
+  f_100_000_100_010_1(uniques, 12);
+  f_100_000_100_011_1(uniques, 12);
+  f_100_000_100_100_1(uniques, 12);
+  f_100_000_100_101_1(uniques, 12);
+  f_100_000_100_110_1(uniques, 12);
+  f_100_000_100_111_1(uniques, 12);
+  f_100_000_101_000_1(uniques, 12);
+  f_100_000_101_001_1(uniques, 12);
+  f_100_000_101_010_1(uniques, 12);
+  f_100_000_101_011_1(uniques, 12);
+  f_100_000_101_100_1(uniques, 12);
+  f_100_000_101_101_1(uniques, 12);
+  f_100_000_101_110_1(uniques, 12);
+  f_100_000_101_111_1(uniques, 12);
+  f_100_000_110_000_1(uniques, 12);
+  f_100_000_110_001_1(uniques, 12);
+  f_100_000_110_010_1(uniques, 12);
+  f_100_000_110_011_1(uniques, 12);
+  f_100_000_110_100_1(uniques, 12);
+  f_100_000_110_101_1(uniques, 12);
+  f_100_000_110_110_1(uniques, 12);
+  f_100_000_110_111_1(uniques, 12);
+  f_100_000_111_000_1(uniques, 12);
+  f_100_000_111_001_1(uniques, 12);
+  f_100_000_111_010_1(uniques, 12);
+  f_100_000_111_011_1(uniques, 12);
+  f_100_000_111_100_1(uniques, 12);
+  f_100_000_111_101_1(uniques, 12);
+  f_100_000_111_110_1(uniques, 12);
+  f_100_000_111_111_1(uniques, 12);
+  f_100_001_000_000_1(uniques, 12);
+  f_100_001_000_001_1(uniques, 12);
+  f_100_001_000_010_1(uniques, 12);
+  f_100_001_000_011_1(uniques, 12);
+  f_100_001_000_100_1(uniques, 12);
+  f_100_001_000_101_1(uniques, 12);
+  f_100_001_000_110_1(uniques, 12);
+  f_100_001_000_111_1(uniques, 12);
+  f_100_001_001_000_1(uniques, 12);
+  f_100_001_001_001_1(uniques, 12);
+  f_100_001_001_010_1(uniques, 12);
+  f_100_001_001_011_1(uniques, 12);
+  f_100_001_001_100_1(uniques, 12);
+  f_100_001_001_101_1(uniques, 12);
+  f_100_001_001_110_1(uniques, 12);
+  f_100_001_001_111_1(uniques, 12);
+  f_100_001_010_000_1(uniques, 12);
+  f_100_001_010_001_1(uniques, 12);
+  f_100_001_010_010_1(uniques, 12);
+  f_100_001_010_011_1(uniques, 12);
+  f_100_001_010_100_1(uniques, 12);
+  f_100_001_010_101_1(uniques, 12);
+  f_100_001_010_110_1(uniques, 12);
+  f_100_001_010_111_1(uniques, 12);
+  f_100_001_011_000_1(uniques, 12);
+  f_100_001_011_001_1(uniques, 12);
+  f_100_001_011_010_1(uniques, 12);
+  f_100_001_011_011_1(uniques, 12);
+  f_100_001_011_100_1(uniques, 12);
+  f_100_001_011_101_1(uniques, 12);
+  f_100_001_011_110_1(uniques, 12);
+  f_100_001_011_111_1(uniques, 12);
+  f_100_001_100_000_1(uniques, 12);
+  f_100_001_100_001_1(uniques, 12);
+  f_100_001_100_010_1(uniques, 12);
+  f_100_001_100_011_1(uniques, 12);
+  f_100_001_100_100_1(uniques, 12);
+  f_100_001_100_101_1(uniques, 12);
+  f_100_001_100_110_1(uniques, 12);
+  f_100_001_100_111_1(uniques, 12);
+  f_100_001_101_000_1(uniques, 12);
+  f_100_001_101_001_1(uniques, 12);
+  f_100_001_101_010_1(uniques, 12);
+  f_100_001_101_011_1(uniques, 12);
+  f_100_001_101_100_1(uniques, 12);
+  f_100_001_101_101_1(uniques, 12);
+  f_100_001_101_110_1(uniques, 12);
+  f_100_001_101_111_1(uniques, 12);
+  f_100_001_110_000_1(uniques, 12);
+  f_100_001_110_001_1(uniques, 12);
+  f_100_001_110_010_1(uniques, 12);
+  f_100_001_110_011_1(uniques, 12);
+  f_100_001_110_100_1(uniques, 12);
+  f_100_001_110_101_1(uniques, 12);
+  f_100_001_110_110_1(uniques, 12);
+  f_100_001_110_111_1(uniques, 12);
+  f_100_001_111_000_1(uniques, 12);
+  f_100_001_111_001_1(uniques, 12);
+  f_100_001_111_010_1(uniques, 12);
+  f_100_001_111_011_1(uniques, 12);
+  f_100_001_111_100_1(uniques, 12);
+  f_100_001_111_101_1(uniques, 12);
+  f_100_001_111_110_1(uniques, 12);
+  f_100_001_111_111_1(uniques, 12);
+  f_100_010_000_000_1(uniques, 12);
+  f_100_010_000_001_1(uniques, 12);
+  f_100_010_000_010_1(uniques, 12);
+  f_100_010_000_011_1(uniques, 12);
+  f_100_010_000_100_1(uniques, 12);
+  f_100_010_000_101_1(uniques, 12);
+  f_100_010_000_110_1(uniques, 12);
+  f_100_010_000_111_1(uniques, 12);
+  f_100_010_001_000_1(uniques, 12);
+  f_100_010_001_001_1(uniques, 12);
+  f_100_010_001_010_1(uniques, 12);
+  f_100_010_001_011_1(uniques, 12);
+  f_100_010_001_100_1(uniques, 12);
+  f_100_010_001_101_1(uniques, 12);
+  f_100_010_001_110_1(uniques, 12);
+  f_100_010_001_111_1(uniques, 12);
+  f_100_010_010_000_1(uniques, 12);
+  f_100_010_010_001_1(uniques, 12);
+  f_100_010_010_010_1(uniques, 12);
+  f_100_010_010_011_1(uniques, 12);
+  f_100_010_010_100_1(uniques, 12);
+  f_100_010_010_101_1(uniques, 12);
+  f_100_010_010_110_1(uniques, 12);
+  f_100_010_010_111_1(uniques, 12);
+  f_100_010_011_000_1(uniques, 12);
+  f_100_010_011_001_1(uniques, 12);
+  f_100_010_011_010_1(uniques, 12);
+  f_100_010_011_011_1(uniques, 12);
+  f_100_010_011_100_1(uniques, 12);
+  f_100_010_011_101_1(uniques, 12);
+  f_100_010_011_110_1(uniques, 12);
+  f_100_010_011_111_1(uniques, 12);
+  f_100_010_100_000_1(uniques, 12);
+  f_100_010_100_001_1(uniques, 12);
+  f_100_010_100_010_1(uniques, 12);
+  f_100_010_100_011_1(uniques, 12);
+  f_100_010_100_100_1(uniques, 12);
+  f_100_010_100_101_1(uniques, 12);
+  f_100_010_100_110_1(uniques, 12);
+  f_100_010_100_111_1(uniques, 12);
+  f_100_010_101_000_1(uniques, 12);
+  f_100_010_101_001_1(uniques, 12);
+  f_100_010_101_010_1(uniques, 12);
+  f_100_010_101_011_1(uniques, 12);
+  f_100_010_101_100_1(uniques, 12);
+  f_100_010_101_101_1(uniques, 12);
+  f_100_010_101_110_1(uniques, 12);
+  f_100_010_101_111_1(uniques, 12);
+  f_100_010_110_000_1(uniques, 12);
+  f_100_010_110_001_1(uniques, 12);
+  f_100_010_110_010_1(uniques, 12);
+  f_100_010_110_011_1(uniques, 12);
+  f_100_010_110_100_1(uniques, 12);
+  f_100_010_110_101_1(uniques, 12);
+  f_100_010_110_110_1(uniques, 12);
+  f_100_010_110_111_1(uniques, 12);
+  f_100_010_111_000_1(uniques, 12);
+  f_100_010_111_001_1(uniques, 12);
+  f_100_010_111_010_1(uniques, 12);
+  f_100_010_111_011_1(uniques, 12);
+  f_100_010_111_100_1(uniques, 12);
+  f_100_010_111_101_1(uniques, 12);
+  f_100_010_111_110_1(uniques, 12);
+  f_100_010_111_111_1(uniques, 12);
+  f_100_011_000_000_1(uniques, 12);
+  f_100_011_000_001_1(uniques, 12);
+  f_100_011_000_010_1(uniques, 12);
+  f_100_011_000_011_1(uniques, 12);
+  f_100_011_000_100_1(uniques, 12);
+  f_100_011_000_101_1(uniques, 12);
+  f_100_011_000_110_1(uniques, 12);
+  f_100_011_000_111_1(uniques, 12);
+  f_100_011_001_000_1(uniques, 12);
+  f_100_011_001_001_1(uniques, 12);
+  f_100_011_001_010_1(uniques, 12);
+  f_100_011_001_011_1(uniques, 12);
+  f_100_011_001_100_1(uniques, 12);
+  f_100_011_001_101_1(uniques, 12);
+  f_100_011_001_110_1(uniques, 12);
+  f_100_011_001_111_1(uniques, 12);
+  f_100_011_010_000_1(uniques, 12);
+  f_100_011_010_001_1(uniques, 12);
+  f_100_011_010_010_1(uniques, 12);
+  f_100_011_010_011_1(uniques, 12);
+  f_100_011_010_100_1(uniques, 12);
+  f_100_011_010_101_1(uniques, 12);
+  f_100_011_010_110_1(uniques, 12);
+  f_100_011_010_111_1(uniques, 12);
+  f_100_011_011_000_1(uniques, 12);
+  f_100_011_011_001_1(uniques, 12);
+  f_100_011_011_010_1(uniques, 12);
+  f_100_011_011_011_1(uniques, 12);
+  f_100_011_011_100_1(uniques, 12);
+  f_100_011_011_101_1(uniques, 12);
+  f_100_011_011_110_1(uniques, 12);
+  f_100_011_011_111_1(uniques, 12);
+  f_100_011_100_000_1(uniques, 12);
+  f_100_011_100_001_1(uniques, 12);
+  f_100_011_100_010_1(uniques, 12);
+  f_100_011_100_011_1(uniques, 12);
+  f_100_011_100_100_1(uniques, 12);
+  f_100_011_100_101_1(uniques, 12);
+  f_100_011_100_110_1(uniques, 12);
+  f_100_011_100_111_1(uniques, 12);
+  f_100_011_101_000_1(uniques, 12);
+  f_100_011_101_001_1(uniques, 12);
+  f_100_011_101_010_1(uniques, 12);
+  f_100_011_101_011_1(uniques, 12);
+  f_100_011_101_100_1(uniques, 12);
+  f_100_011_101_101_1(uniques, 12);
+  f_100_011_101_110_1(uniques, 12);
+  f_100_011_101_111_1(uniques, 12);
+  f_100_011_110_000_1(uniques, 12);
+  f_100_011_110_001_1(uniques, 12);
+  f_100_011_110_010_1(uniques, 12);
+  f_100_011_110_011_1(uniques, 12);
+  f_100_011_110_100_1(uniques, 12);
+  f_100_011_110_101_1(uniques, 12);
+  f_100_011_110_110_1(uniques, 12);
+  f_100_011_110_111_1(uniques, 12);
+  f_100_011_111_000_1(uniques, 12);
+  f_100_011_111_001_1(uniques, 12);
+  f_100_011_111_010_1(uniques, 12);
+  f_100_011_111_011_1(uniques, 12);
+  f_100_011_111_100_1(uniques, 12);
+  f_100_011_111_101_1(uniques, 12);
+  f_100_011_111_110_1(uniques, 12);
+  f_100_011_111_111_1(uniques, 12);
+  f_100_100_000_000_1(uniques, 12);
+  f_100_100_000_001_1(uniques, 12);
+  f_100_100_000_010_1(uniques, 12);
+  f_100_100_000_011_1(uniques, 12);
+  f_100_100_000_100_1(uniques, 12);
+  f_100_100_000_101_1(uniques, 12);
+  f_100_100_000_110_1(uniques, 12);
+  f_100_100_000_111_1(uniques, 12);
+  f_100_100_001_000_1(uniques, 12);
+  f_100_100_001_001_1(uniques, 12);
+  f_100_100_001_010_1(uniques, 12);
+  f_100_100_001_011_1(uniques, 12);
+  f_100_100_001_100_1(uniques, 12);
+  f_100_100_001_101_1(uniques, 12);
+  f_100_100_001_110_1(uniques, 12);
+  f_100_100_001_111_1(uniques, 12);
+  f_100_100_010_000_1(uniques, 12);
+  f_100_100_010_001_1(uniques, 12);
+  f_100_100_010_010_1(uniques, 12);
+  f_100_100_010_011_1(uniques, 12);
+  f_100_100_010_100_1(uniques, 12);
+  f_100_100_010_101_1(uniques, 12);
+  f_100_100_010_110_1(uniques, 12);
+  f_100_100_010_111_1(uniques, 12);
+  f_100_100_011_000_1(uniques, 12);
+  f_100_100_011_001_1(uniques, 12);
+  f_100_100_011_010_1(uniques, 12);
+  f_100_100_011_011_1(uniques, 12);
+  f_100_100_011_100_1(uniques, 12);
+  f_100_100_011_101_1(uniques, 12);
+  f_100_100_011_110_1(uniques, 12);
+  f_100_100_011_111_1(uniques, 12);
+  f_100_100_100_000_1(uniques, 12);
+  f_100_100_100_001_1(uniques, 12);
+  f_100_100_100_010_1(uniques, 12);
+  f_100_100_100_011_1(uniques, 12);
+  f_100_100_100_100_1(uniques, 12);
+  f_100_100_100_101_1(uniques, 12);
+  f_100_100_100_110_1(uniques, 12);
+  f_100_100_100_111_1(uniques, 12);
+  f_100_100_101_000_1(uniques, 12);
+  f_100_100_101_001_1(uniques, 12);
+  f_100_100_101_010_1(uniques, 12);
+  f_100_100_101_011_1(uniques, 12);
+  f_100_100_101_100_1(uniques, 12);
+  f_100_100_101_101_1(uniques, 12);
+  f_100_100_101_110_1(uniques, 12);
+  f_100_100_101_111_1(uniques, 12);
+  f_100_100_110_000_1(uniques, 12);
+  f_100_100_110_001_1(uniques, 12);
+  f_100_100_110_010_1(uniques, 12);
+  f_100_100_110_011_1(uniques, 12);
+  f_100_100_110_100_1(uniques, 12);
+  f_100_100_110_101_1(uniques, 12);
+  f_100_100_110_110_1(uniques, 12);
+  f_100_100_110_111_1(uniques, 12);
+  f_100_100_111_000_1(uniques, 12);
+  f_100_100_111_001_1(uniques, 12);
+  f_100_100_111_010_1(uniques, 12);
+  f_100_100_111_011_1(uniques, 12);
+  f_100_100_111_100_1(uniques, 12);
+  f_100_100_111_101_1(uniques, 12);
+  f_100_100_111_110_1(uniques, 12);
+  f_100_100_111_111_1(uniques, 12);
+  f_100_101_000_000_1(uniques, 12);
+  f_100_101_000_001_1(uniques, 12);
+  f_100_101_000_010_1(uniques, 12);
+  f_100_101_000_011_1(uniques, 12);
+  f_100_101_000_100_1(uniques, 12);
+  f_100_101_000_101_1(uniques, 12);
+  f_100_101_000_110_1(uniques, 12);
+  f_100_101_000_111_1(uniques, 12);
+  f_100_101_001_000_1(uniques, 12);
+  f_100_101_001_001_1(uniques, 12);
+  f_100_101_001_010_1(uniques, 12);
+  f_100_101_001_011_1(uniques, 12);
+  f_100_101_001_100_1(uniques, 12);
+  f_100_101_001_101_1(uniques, 12);
+  f_100_101_001_110_1(uniques, 12);
+  f_100_101_001_111_1(uniques, 12);
+  f_100_101_010_000_1(uniques, 12);
+  f_100_101_010_001_1(uniques, 12);
+  f_100_101_010_010_1(uniques, 12);
+  f_100_101_010_011_1(uniques, 12);
+  f_100_101_010_100_1(uniques, 12);
+  f_100_101_010_101_1(uniques, 12);
+  f_100_101_010_110_1(uniques, 12);
+  f_100_101_010_111_1(uniques, 12);
+  f_100_101_011_000_1(uniques, 12);
+  f_100_101_011_001_1(uniques, 12);
+  f_100_101_011_010_1(uniques, 12);
+  f_100_101_011_011_1(uniques, 12);
+  f_100_101_011_100_1(uniques, 12);
+  f_100_101_011_101_1(uniques, 12);
+  f_100_101_011_110_1(uniques, 12);
+  f_100_101_011_111_1(uniques, 12);
+  f_100_101_100_000_1(uniques, 12);
+  f_100_101_100_001_1(uniques, 12);
+  f_100_101_100_010_1(uniques, 12);
+  f_100_101_100_011_1(uniques, 12);
+  f_100_101_100_100_1(uniques, 12);
+  f_100_101_100_101_1(uniques, 12);
+  f_100_101_100_110_1(uniques, 12);
+  f_100_101_100_111_1(uniques, 12);
+  f_100_101_101_000_1(uniques, 12);
+  f_100_101_101_001_1(uniques, 12);
+  f_100_101_101_010_1(uniques, 12);
+  f_100_101_101_011_1(uniques, 12);
+  f_100_101_101_100_1(uniques, 12);
+  f_100_101_101_101_1(uniques, 12);
+  f_100_101_101_110_1(uniques, 12);
+  f_100_101_101_111_1(uniques, 12);
+  f_100_101_110_000_1(uniques, 12);
+  f_100_101_110_001_1(uniques, 12);
+  f_100_101_110_010_1(uniques, 12);
+  f_100_101_110_011_1(uniques, 12);
+  f_100_101_110_100_1(uniques, 12);
+  f_100_101_110_101_1(uniques, 12);
+  f_100_101_110_110_1(uniques, 12);
+  f_100_101_110_111_1(uniques, 12);
+  f_100_101_111_000_1(uniques, 12);
+  f_100_101_111_001_1(uniques, 12);
+  f_100_101_111_010_1(uniques, 12);
+  f_100_101_111_011_1(uniques, 12);
+  f_100_101_111_100_1(uniques, 12);
+  f_100_101_111_101_1(uniques, 12);
+  f_100_101_111_110_1(uniques, 12);
+  f_100_101_111_111_1(uniques, 12);
+  f_100_110_000_000_1(uniques, 12);
+  f_100_110_000_001_1(uniques, 12);
+  f_100_110_000_010_1(uniques, 12);
+  f_100_110_000_011_1(uniques, 12);
+  f_100_110_000_100_1(uniques, 12);
+  f_100_110_000_101_1(uniques, 12);
+  f_100_110_000_110_1(uniques, 12);
+  f_100_110_000_111_1(uniques, 12);
+  f_100_110_001_000_1(uniques, 12);
+  f_100_110_001_001_1(uniques, 12);
+  f_100_110_001_010_1(uniques, 12);
+  f_100_110_001_011_1(uniques, 12);
+  f_100_110_001_100_1(uniques, 12);
+  f_100_110_001_101_1(uniques, 12);
+  f_100_110_001_110_1(uniques, 12);
+  f_100_110_001_111_1(uniques, 12);
+  f_100_110_010_000_1(uniques, 12);
+  f_100_110_010_001_1(uniques, 12);
+  f_100_110_010_010_1(uniques, 12);
+  f_100_110_010_011_1(uniques, 12);
+  f_100_110_010_100_1(uniques, 12);
+  f_100_110_010_101_1(uniques, 12);
+  f_100_110_010_110_1(uniques, 12);
+  f_100_110_010_111_1(uniques, 12);
+  f_100_110_011_000_1(uniques, 12);
+  f_100_110_011_001_1(uniques, 12);
+  f_100_110_011_010_1(uniques, 12);
+  f_100_110_011_011_1(uniques, 12);
+  f_100_110_011_100_1(uniques, 12);
+  f_100_110_011_101_1(uniques, 12);
+  f_100_110_011_110_1(uniques, 12);
+  f_100_110_011_111_1(uniques, 12);
+  f_100_110_100_000_1(uniques, 12);
+  f_100_110_100_001_1(uniques, 12);
+  f_100_110_100_010_1(uniques, 12);
+  f_100_110_100_011_1(uniques, 12);
+  f_100_110_100_100_1(uniques, 12);
+  f_100_110_100_101_1(uniques, 12);
+  f_100_110_100_110_1(uniques, 12);
+  f_100_110_100_111_1(uniques, 12);
+  f_100_110_101_000_1(uniques, 12);
+  f_100_110_101_001_1(uniques, 12);
+  f_100_110_101_010_1(uniques, 12);
+  f_100_110_101_011_1(uniques, 12);
+  f_100_110_101_100_1(uniques, 12);
+  f_100_110_101_101_1(uniques, 12);
+  f_100_110_101_110_1(uniques, 12);
+  f_100_110_101_111_1(uniques, 12);
+  f_100_110_110_000_1(uniques, 12);
+  f_100_110_110_001_1(uniques, 12);
+  f_100_110_110_010_1(uniques, 12);
+  f_100_110_110_011_1(uniques, 12);
+  f_100_110_110_100_1(uniques, 12);
+  f_100_110_110_101_1(uniques, 12);
+  f_100_110_110_110_1(uniques, 12);
+  f_100_110_110_111_1(uniques, 12);
+  f_100_110_111_000_1(uniques, 12);
+  f_100_110_111_001_1(uniques, 12);
+  f_100_110_111_010_1(uniques, 12);
+  f_100_110_111_011_1(uniques, 12);
+  f_100_110_111_100_1(uniques, 12);
+  f_100_110_111_101_1(uniques, 12);
+  f_100_110_111_110_1(uniques, 12);
+  f_100_110_111_111_1(uniques, 12);
+  f_100_111_000_000_1(uniques, 12);
+  f_100_111_000_001_1(uniques, 12);
+  f_100_111_000_010_1(uniques, 12);
+  f_100_111_000_011_1(uniques, 12);
+  f_100_111_000_100_1(uniques, 12);
+  f_100_111_000_101_1(uniques, 12);
+  f_100_111_000_110_1(uniques, 12);
+  f_100_111_000_111_1(uniques, 12);
+  f_100_111_001_000_1(uniques, 12);
+  f_100_111_001_001_1(uniques, 12);
+  f_100_111_001_010_1(uniques, 12);
+  f_100_111_001_011_1(uniques, 12);
+  f_100_111_001_100_1(uniques, 12);
+  f_100_111_001_101_1(uniques, 12);
+  f_100_111_001_110_1(uniques, 12);
+  f_100_111_001_111_1(uniques, 12);
+  f_100_111_010_000_1(uniques, 12);
+  f_100_111_010_001_1(uniques, 12);
+  f_100_111_010_010_1(uniques, 12);
+  f_100_111_010_011_1(uniques, 12);
+  f_100_111_010_100_1(uniques, 12);
+  f_100_111_010_101_1(uniques, 12);
+  f_100_111_010_110_1(uniques, 12);
+  f_100_111_010_111_1(uniques, 12);
+  f_100_111_011_000_1(uniques, 12);
+  f_100_111_011_001_1(uniques, 12);
+  f_100_111_011_010_1(uniques, 12);
+  f_100_111_011_011_1(uniques, 12);
+  f_100_111_011_100_1(uniques, 12);
+  f_100_111_011_101_1(uniques, 12);
+  f_100_111_011_110_1(uniques, 12);
+  f_100_111_011_111_1(uniques, 12);
+  f_100_111_100_000_1(uniques, 12);
+  f_100_111_100_001_1(uniques, 12);
+  f_100_111_100_010_1(uniques, 12);
+  f_100_111_100_011_1(uniques, 12);
+  f_100_111_100_100_1(uniques, 12);
+  f_100_111_100_101_1(uniques, 12);
+  f_100_111_100_110_1(uniques, 12);
+  f_100_111_100_111_1(uniques, 12);
+  f_100_111_101_000_1(uniques, 12);
+  f_100_111_101_001_1(uniques, 12);
+  f_100_111_101_010_1(uniques, 12);
+  f_100_111_101_011_1(uniques, 12);
+  f_100_111_101_100_1(uniques, 12);
+  f_100_111_101_101_1(uniques, 12);
+  f_100_111_101_110_1(uniques, 12);
+  f_100_111_101_111_1(uniques, 12);
+  f_100_111_110_000_1(uniques, 12);
+  f_100_111_110_001_1(uniques, 12);
+  f_100_111_110_010_1(uniques, 12);
+  f_100_111_110_011_1(uniques, 12);
+  f_100_111_110_100_1(uniques, 12);
+  f_100_111_110_101_1(uniques, 12);
+  f_100_111_110_110_1(uniques, 12);
+  f_100_111_110_111_1(uniques, 12);
+  f_100_111_111_000_1(uniques, 12);
+  f_100_111_111_001_1(uniques, 12);
+  f_100_111_111_010_1(uniques, 12);
+  f_100_111_111_011_1(uniques, 12);
+  f_100_111_111_100_1(uniques, 12);
+  f_100_111_111_101_1(uniques, 12);
+  f_100_111_111_110_1(uniques, 12);
+  f_100_111_111_111_1(uniques, 12);
+  f_101_000_000_000_1(uniques, 12);
+  f_101_000_000_001_1(uniques, 12);
+  f_101_000_000_010_1(uniques, 12);
+  f_101_000_000_011_1(uniques, 12);
+  f_101_000_000_100_1(uniques, 12);
+  f_101_000_000_101_1(uniques, 12);
+  f_101_000_000_110_1(uniques, 12);
+  f_101_000_000_111_1(uniques, 12);
+  f_101_000_001_000_1(uniques, 12);
+  f_101_000_001_001_1(uniques, 12);
+  f_101_000_001_010_1(uniques, 12);
+  f_101_000_001_011_1(uniques, 12);
+  f_101_000_001_100_1(uniques, 12);
+  f_101_000_001_101_1(uniques, 12);
+  f_101_000_001_110_1(uniques, 12);
+  f_101_000_001_111_1(uniques, 12);
+  f_101_000_010_000_1(uniques, 12);
+  f_101_000_010_001_1(uniques, 12);
+  f_101_000_010_010_1(uniques, 12);
+  f_101_000_010_011_1(uniques, 12);
+  f_101_000_010_100_1(uniques, 12);
+  f_101_000_010_101_1(uniques, 12);
+  f_101_000_010_110_1(uniques, 12);
+  f_101_000_010_111_1(uniques, 12);
+  f_101_000_011_000_1(uniques, 12);
+  f_101_000_011_001_1(uniques, 12);
+  f_101_000_011_010_1(uniques, 12);
+  f_101_000_011_011_1(uniques, 12);
+  f_101_000_011_100_1(uniques, 12);
+  f_101_000_011_101_1(uniques, 12);
+  f_101_000_011_110_1(uniques, 12);
+  f_101_000_011_111_1(uniques, 12);
+  f_101_000_100_000_1(uniques, 12);
+  f_101_000_100_001_1(uniques, 12);
+  f_101_000_100_010_1(uniques, 12);
+  f_101_000_100_011_1(uniques, 12);
+  f_101_000_100_100_1(uniques, 12);
+  f_101_000_100_101_1(uniques, 12);
+  f_101_000_100_110_1(uniques, 12);
+  f_101_000_100_111_1(uniques, 12);
+  f_101_000_101_000_1(uniques, 12);
+  f_101_000_101_001_1(uniques, 12);
+  f_101_000_101_010_1(uniques, 12);
+  f_101_000_101_011_1(uniques, 12);
+  f_101_000_101_100_1(uniques, 12);
+  f_101_000_101_101_1(uniques, 12);
+  f_101_000_101_110_1(uniques, 12);
+  f_101_000_101_111_1(uniques, 12);
+  f_101_000_110_000_1(uniques, 12);
+  f_101_000_110_001_1(uniques, 12);
+  f_101_000_110_010_1(uniques, 12);
+  f_101_000_110_011_1(uniques, 12);
+  f_101_000_110_100_1(uniques, 12);
+  f_101_000_110_101_1(uniques, 12);
+  f_101_000_110_110_1(uniques, 12);
+  f_101_000_110_111_1(uniques, 12);
+  f_101_000_111_000_1(uniques, 12);
+  f_101_000_111_001_1(uniques, 12);
+  f_101_000_111_010_1(uniques, 12);
+  f_101_000_111_011_1(uniques, 12);
+  f_101_000_111_100_1(uniques, 12);
+  f_101_000_111_101_1(uniques, 12);
+  f_101_000_111_110_1(uniques, 12);
+  f_101_000_111_111_1(uniques, 12);
+  f_101_001_000_000_1(uniques, 12);
+  f_101_001_000_001_1(uniques, 12);
+  f_101_001_000_010_1(uniques, 12);
+  f_101_001_000_011_1(uniques, 12);
+  f_101_001_000_100_1(uniques, 12);
+  f_101_001_000_101_1(uniques, 12);
+  f_101_001_000_110_1(uniques, 12);
+  f_101_001_000_111_1(uniques, 12);
+  f_101_001_001_000_1(uniques, 12);
+  f_101_001_001_001_1(uniques, 12);
+  f_101_001_001_010_1(uniques, 12);
+  f_101_001_001_011_1(uniques, 12);
+  f_101_001_001_100_1(uniques, 12);
+  f_101_001_001_101_1(uniques, 12);
+  f_101_001_001_110_1(uniques, 12);
+  f_101_001_001_111_1(uniques, 12);
+  f_101_001_010_000_1(uniques, 12);
+  f_101_001_010_001_1(uniques, 12);
+  f_101_001_010_010_1(uniques, 12);
+  f_101_001_010_011_1(uniques, 12);
+  f_101_001_010_100_1(uniques, 12);
+  f_101_001_010_101_1(uniques, 12);
+  f_101_001_010_110_1(uniques, 12);
+  f_101_001_010_111_1(uniques, 12);
+  f_101_001_011_000_1(uniques, 12);
+  f_101_001_011_001_1(uniques, 12);
+  f_101_001_011_010_1(uniques, 12);
+  f_101_001_011_011_1(uniques, 12);
+  f_101_001_011_100_1(uniques, 12);
+  f_101_001_011_101_1(uniques, 12);
+  f_101_001_011_110_1(uniques, 12);
+  f_101_001_011_111_1(uniques, 12);
+  f_101_001_100_000_1(uniques, 12);
+  f_101_001_100_001_1(uniques, 12);
+  f_101_001_100_010_1(uniques, 12);
+  f_101_001_100_011_1(uniques, 12);
+  f_101_001_100_100_1(uniques, 12);
+  f_101_001_100_101_1(uniques, 12);
+  f_101_001_100_110_1(uniques, 12);
+  f_101_001_100_111_1(uniques, 12);
+  f_101_001_101_000_1(uniques, 12);
+  f_101_001_101_001_1(uniques, 12);
+  f_101_001_101_010_1(uniques, 12);
+  f_101_001_101_011_1(uniques, 12);
+  f_101_001_101_100_1(uniques, 12);
+  f_101_001_101_101_1(uniques, 12);
+  f_101_001_101_110_1(uniques, 12);
+  f_101_001_101_111_1(uniques, 12);
+  f_101_001_110_000_1(uniques, 12);
+  f_101_001_110_001_1(uniques, 12);
+  f_101_001_110_010_1(uniques, 12);
+  f_101_001_110_011_1(uniques, 12);
+  f_101_001_110_100_1(uniques, 12);
+  f_101_001_110_101_1(uniques, 12);
+  f_101_001_110_110_1(uniques, 12);
+  f_101_001_110_111_1(uniques, 12);
+  f_101_001_111_000_1(uniques, 12);
+  f_101_001_111_001_1(uniques, 12);
+  f_101_001_111_010_1(uniques, 12);
+  f_101_001_111_011_1(uniques, 12);
+  f_101_001_111_100_1(uniques, 12);
+  f_101_001_111_101_1(uniques, 12);
+  f_101_001_111_110_1(uniques, 12);
+  f_101_001_111_111_1(uniques, 12);
+  f_101_010_000_000_1(uniques, 12);
+  f_101_010_000_001_1(uniques, 12);
+  f_101_010_000_010_1(uniques, 12);
+  f_101_010_000_011_1(uniques, 12);
+  f_101_010_000_100_1(uniques, 12);
+  f_101_010_000_101_1(uniques, 12);
+  f_101_010_000_110_1(uniques, 12);
+  f_101_010_000_111_1(uniques, 12);
+  f_101_010_001_000_1(uniques, 12);
+  f_101_010_001_001_1(uniques, 12);
+  f_101_010_001_010_1(uniques, 12);
+  f_101_010_001_011_1(uniques, 12);
+  f_101_010_001_100_1(uniques, 12);
+  f_101_010_001_101_1(uniques, 12);
+  f_101_010_001_110_1(uniques, 12);
+  f_101_010_001_111_1(uniques, 12);
+  f_101_010_010_000_1(uniques, 12);
+  f_101_010_010_001_1(uniques, 12);
+  f_101_010_010_010_1(uniques, 12);
+  f_101_010_010_011_1(uniques, 12);
+  f_101_010_010_100_1(uniques, 12);
+  f_101_010_010_101_1(uniques, 12);
+  f_101_010_010_110_1(uniques, 12);
+  f_101_010_010_111_1(uniques, 12);
+  f_101_010_011_000_1(uniques, 12);
+  f_101_010_011_001_1(uniques, 12);
+  f_101_010_011_010_1(uniques, 12);
+  f_101_010_011_011_1(uniques, 12);
+  f_101_010_011_100_1(uniques, 12);
+  f_101_010_011_101_1(uniques, 12);
+  f_101_010_011_110_1(uniques, 12);
+  f_101_010_011_111_1(uniques, 12);
+  f_101_010_100_000_1(uniques, 12);
+  f_101_010_100_001_1(uniques, 12);
+  f_101_010_100_010_1(uniques, 12);
+  f_101_010_100_011_1(uniques, 12);
+  f_101_010_100_100_1(uniques, 12);
+  f_101_010_100_101_1(uniques, 12);
+  f_101_010_100_110_1(uniques, 12);
+  f_101_010_100_111_1(uniques, 12);
+  f_101_010_101_000_1(uniques, 12);
+  f_101_010_101_001_1(uniques, 12);
+  f_101_010_101_010_1(uniques, 12);
+  f_101_010_101_011_1(uniques, 12);
+  f_101_010_101_100_1(uniques, 12);
+  f_101_010_101_101_1(uniques, 12);
+  f_101_010_101_110_1(uniques, 12);
+  f_101_010_101_111_1(uniques, 12);
+  f_101_010_110_000_1(uniques, 12);
+  f_101_010_110_001_1(uniques, 12);
+  f_101_010_110_010_1(uniques, 12);
+  f_101_010_110_011_1(uniques, 12);
+  f_101_010_110_100_1(uniques, 12);
+  f_101_010_110_101_1(uniques, 12);
+  f_101_010_110_110_1(uniques, 12);
+  f_101_010_110_111_1(uniques, 12);
+  f_101_010_111_000_1(uniques, 12);
+  f_101_010_111_001_1(uniques, 12);
+  f_101_010_111_010_1(uniques, 12);
+  f_101_010_111_011_1(uniques, 12);
+  f_101_010_111_100_1(uniques, 12);
+  f_101_010_111_101_1(uniques, 12);
+  f_101_010_111_110_1(uniques, 12);
+  f_101_010_111_111_1(uniques, 12);
+  f_101_011_000_000_1(uniques, 12);
+  f_101_011_000_001_1(uniques, 12);
+  f_101_011_000_010_1(uniques, 12);
+  f_101_011_000_011_1(uniques, 12);
+  f_101_011_000_100_1(uniques, 12);
+  f_101_011_000_101_1(uniques, 12);
+  f_101_011_000_110_1(uniques, 12);
+  f_101_011_000_111_1(uniques, 12);
+  f_101_011_001_000_1(uniques, 12);
+  f_101_011_001_001_1(uniques, 12);
+  f_101_011_001_010_1(uniques, 12);
+  f_101_011_001_011_1(uniques, 12);
+  f_101_011_001_100_1(uniques, 12);
+  f_101_011_001_101_1(uniques, 12);
+  f_101_011_001_110_1(uniques, 12);
+  f_101_011_001_111_1(uniques, 12);
+  f_101_011_010_000_1(uniques, 12);
+  f_101_011_010_001_1(uniques, 12);
+  f_101_011_010_010_1(uniques, 12);
+  f_101_011_010_011_1(uniques, 12);
+  f_101_011_010_100_1(uniques, 12);
+  f_101_011_010_101_1(uniques, 12);
+  f_101_011_010_110_1(uniques, 12);
+  f_101_011_010_111_1(uniques, 12);
+  f_101_011_011_000_1(uniques, 12);
+  f_101_011_011_001_1(uniques, 12);
+  f_101_011_011_010_1(uniques, 12);
+  f_101_011_011_011_1(uniques, 12);
+  f_101_011_011_100_1(uniques, 12);
+  f_101_011_011_101_1(uniques, 12);
+  f_101_011_011_110_1(uniques, 12);
+  f_101_011_011_111_1(uniques, 12);
+  f_101_011_100_000_1(uniques, 12);
+  f_101_011_100_001_1(uniques, 12);
+  f_101_011_100_010_1(uniques, 12);
+  f_101_011_100_011_1(uniques, 12);
+  f_101_011_100_100_1(uniques, 12);
+  f_101_011_100_101_1(uniques, 12);
+  f_101_011_100_110_1(uniques, 12);
+  f_101_011_100_111_1(uniques, 12);
+  f_101_011_101_000_1(uniques, 12);
+  f_101_011_101_001_1(uniques, 12);
+  f_101_011_101_010_1(uniques, 12);
+  f_101_011_101_011_1(uniques, 12);
+  f_101_011_101_100_1(uniques, 12);
+  f_101_011_101_101_1(uniques, 12);
+  f_101_011_101_110_1(uniques, 12);
+  f_101_011_101_111_1(uniques, 12);
+  f_101_011_110_000_1(uniques, 12);
+  f_101_011_110_001_1(uniques, 12);
+  f_101_011_110_010_1(uniques, 12);
+  f_101_011_110_011_1(uniques, 12);
+  f_101_011_110_100_1(uniques, 12);
+  f_101_011_110_101_1(uniques, 12);
+  f_101_011_110_110_1(uniques, 12);
+  f_101_011_110_111_1(uniques, 12);
+  f_101_011_111_000_1(uniques, 12);
+  f_101_011_111_001_1(uniques, 12);
+  f_101_011_111_010_1(uniques, 12);
+  f_101_011_111_011_1(uniques, 12);
+  f_101_011_111_100_1(uniques, 12);
+  f_101_011_111_101_1(uniques, 12);
+  f_101_011_111_110_1(uniques, 12);
+  f_101_011_111_111_1(uniques, 12);
+  f_101_100_000_000_1(uniques, 12);
+  f_101_100_000_001_1(uniques, 12);
+  f_101_100_000_010_1(uniques, 12);
+  f_101_100_000_011_1(uniques, 12);
+  f_101_100_000_100_1(uniques, 12);
+  f_101_100_000_101_1(uniques, 12);
+  f_101_100_000_110_1(uniques, 12);
+  f_101_100_000_111_1(uniques, 12);
+  f_101_100_001_000_1(uniques, 12);
+  f_101_100_001_001_1(uniques, 12);
+  f_101_100_001_010_1(uniques, 12);
+  f_101_100_001_011_1(uniques, 12);
+  f_101_100_001_100_1(uniques, 12);
+  f_101_100_001_101_1(uniques, 12);
+  f_101_100_001_110_1(uniques, 12);
+  f_101_100_001_111_1(uniques, 12);
+  f_101_100_010_000_1(uniques, 12);
+  f_101_100_010_001_1(uniques, 12);
+  f_101_100_010_010_1(uniques, 12);
+  f_101_100_010_011_1(uniques, 12);
+  f_101_100_010_100_1(uniques, 12);
+  f_101_100_010_101_1(uniques, 12);
+  f_101_100_010_110_1(uniques, 12);
+  f_101_100_010_111_1(uniques, 12);
+  f_101_100_011_000_1(uniques, 12);
+  f_101_100_011_001_1(uniques, 12);
+  f_101_100_011_010_1(uniques, 12);
+  f_101_100_011_011_1(uniques, 12);
+  f_101_100_011_100_1(uniques, 12);
+  f_101_100_011_101_1(uniques, 12);
+  f_101_100_011_110_1(uniques, 12);
+  f_101_100_011_111_1(uniques, 12);
+  f_101_100_100_000_1(uniques, 12);
+  f_101_100_100_001_1(uniques, 12);
+  f_101_100_100_010_1(uniques, 12);
+  f_101_100_100_011_1(uniques, 12);
+  f_101_100_100_100_1(uniques, 12);
+  f_101_100_100_101_1(uniques, 12);
+  f_101_100_100_110_1(uniques, 12);
+  f_101_100_100_111_1(uniques, 12);
+  f_101_100_101_000_1(uniques, 12);
+  f_101_100_101_001_1(uniques, 12);
+  f_101_100_101_010_1(uniques, 12);
+  f_101_100_101_011_1(uniques, 12);
+  f_101_100_101_100_1(uniques, 12);
+  f_101_100_101_101_1(uniques, 12);
+  f_101_100_101_110_1(uniques, 12);
+  f_101_100_101_111_1(uniques, 12);
+  f_101_100_110_000_1(uniques, 12);
+  f_101_100_110_001_1(uniques, 12);
+  f_101_100_110_010_1(uniques, 12);
+  f_101_100_110_011_1(uniques, 12);
+  f_101_100_110_100_1(uniques, 12);
+  f_101_100_110_101_1(uniques, 12);
+  f_101_100_110_110_1(uniques, 12);
+  f_101_100_110_111_1(uniques, 12);
+  f_101_100_111_000_1(uniques, 12);
+  f_101_100_111_001_1(uniques, 12);
+  f_101_100_111_010_1(uniques, 12);
+  f_101_100_111_011_1(uniques, 12);
+  f_101_100_111_100_1(uniques, 12);
+  f_101_100_111_101_1(uniques, 12);
+  f_101_100_111_110_1(uniques, 12);
+  f_101_100_111_111_1(uniques, 12);
+  f_101_101_000_000_1(uniques, 12);
+  f_101_101_000_001_1(uniques, 12);
+  f_101_101_000_010_1(uniques, 12);
+  f_101_101_000_011_1(uniques, 12);
+  f_101_101_000_100_1(uniques, 12);
+  f_101_101_000_101_1(uniques, 12);
+  f_101_101_000_110_1(uniques, 12);
+  f_101_101_000_111_1(uniques, 12);
+  f_101_101_001_000_1(uniques, 12);
+  f_101_101_001_001_1(uniques, 12);
+  f_101_101_001_010_1(uniques, 12);
+  f_101_101_001_011_1(uniques, 12);
+  f_101_101_001_100_1(uniques, 12);
+  f_101_101_001_101_1(uniques, 12);
+  f_101_101_001_110_1(uniques, 12);
+  f_101_101_001_111_1(uniques, 12);
+  f_101_101_010_000_1(uniques, 12);
+  f_101_101_010_001_1(uniques, 12);
+  f_101_101_010_010_1(uniques, 12);
+  f_101_101_010_011_1(uniques, 12);
+  f_101_101_010_100_1(uniques, 12);
+  f_101_101_010_101_1(uniques, 12);
+  f_101_101_010_110_1(uniques, 12);
+  f_101_101_010_111_1(uniques, 12);
+  f_101_101_011_000_1(uniques, 12);
+  f_101_101_011_001_1(uniques, 12);
+  f_101_101_011_010_1(uniques, 12);
+  f_101_101_011_011_1(uniques, 12);
+  f_101_101_011_100_1(uniques, 12);
+  f_101_101_011_101_1(uniques, 12);
+  f_101_101_011_110_1(uniques, 12);
+  f_101_101_011_111_1(uniques, 12);
+  f_101_101_100_000_1(uniques, 12);
+  f_101_101_100_001_1(uniques, 12);
+  f_101_101_100_010_1(uniques, 12);
+  f_101_101_100_011_1(uniques, 12);
+  f_101_101_100_100_1(uniques, 12);
+  f_101_101_100_101_1(uniques, 12);
+  f_101_101_100_110_1(uniques, 12);
+  f_101_101_100_111_1(uniques, 12);
+  f_101_101_101_000_1(uniques, 12);
+  f_101_101_101_001_1(uniques, 12);
+  f_101_101_101_010_1(uniques, 12);
+  f_101_101_101_011_1(uniques, 12);
+  f_101_101_101_100_1(uniques, 12);
+  f_101_101_101_101_1(uniques, 12);
+  f_101_101_101_110_1(uniques, 12);
+  f_101_101_101_111_1(uniques, 12);
+  f_101_101_110_000_1(uniques, 12);
+  f_101_101_110_001_1(uniques, 12);
+  f_101_101_110_010_1(uniques, 12);
+  f_101_101_110_011_1(uniques, 12);
+  f_101_101_110_100_1(uniques, 12);
+  f_101_101_110_101_1(uniques, 12);
+  f_101_101_110_110_1(uniques, 12);
+  f_101_101_110_111_1(uniques, 12);
+  f_101_101_111_000_1(uniques, 12);
+  f_101_101_111_001_1(uniques, 12);
+  f_101_101_111_010_1(uniques, 12);
+  f_101_101_111_011_1(uniques, 12);
+  f_101_101_111_100_1(uniques, 12);
+  f_101_101_111_101_1(uniques, 12);
+  f_101_101_111_110_1(uniques, 12);
+  f_101_101_111_111_1(uniques, 12);
+  f_101_110_000_000_1(uniques, 12);
+  f_101_110_000_001_1(uniques, 12);
+  f_101_110_000_010_1(uniques, 12);
+  f_101_110_000_011_1(uniques, 12);
+  f_101_110_000_100_1(uniques, 12);
+  f_101_110_000_101_1(uniques, 12);
+  f_101_110_000_110_1(uniques, 12);
+  f_101_110_000_111_1(uniques, 12);
+  f_101_110_001_000_1(uniques, 12);
+  f_101_110_001_001_1(uniques, 12);
+  f_101_110_001_010_1(uniques, 12);
+  f_101_110_001_011_1(uniques, 12);
+  f_101_110_001_100_1(uniques, 12);
+  f_101_110_001_101_1(uniques, 12);
+  f_101_110_001_110_1(uniques, 12);
+  f_101_110_001_111_1(uniques, 12);
+  f_101_110_010_000_1(uniques, 12);
+  f_101_110_010_001_1(uniques, 12);
+  f_101_110_010_010_1(uniques, 12);
+  f_101_110_010_011_1(uniques, 12);
+  f_101_110_010_100_1(uniques, 12);
+  f_101_110_010_101_1(uniques, 12);
+  f_101_110_010_110_1(uniques, 12);
+  f_101_110_010_111_1(uniques, 12);
+  f_101_110_011_000_1(uniques, 12);
+  f_101_110_011_001_1(uniques, 12);
+  f_101_110_011_010_1(uniques, 12);
+  f_101_110_011_011_1(uniques, 12);
+  f_101_110_011_100_1(uniques, 12);
+  f_101_110_011_101_1(uniques, 12);
+  f_101_110_011_110_1(uniques, 12);
+  f_101_110_011_111_1(uniques, 12);
+  f_101_110_100_000_1(uniques, 12);
+  f_101_110_100_001_1(uniques, 12);
+  f_101_110_100_010_1(uniques, 12);
+  f_101_110_100_011_1(uniques, 12);
+  f_101_110_100_100_1(uniques, 12);
+  f_101_110_100_101_1(uniques, 12);
+  f_101_110_100_110_1(uniques, 12);
+  f_101_110_100_111_1(uniques, 12);
+  f_101_110_101_000_1(uniques, 12);
+  f_101_110_101_001_1(uniques, 12);
+  f_101_110_101_010_1(uniques, 12);
+  f_101_110_101_011_1(uniques, 12);
+  f_101_110_101_100_1(uniques, 12);
+  f_101_110_101_101_1(uniques, 12);
+  f_101_110_101_110_1(uniques, 12);
+  f_101_110_101_111_1(uniques, 12);
+  f_101_110_110_000_1(uniques, 12);
+  f_101_110_110_001_1(uniques, 12);
+  f_101_110_110_010_1(uniques, 12);
+  f_101_110_110_011_1(uniques, 12);
+  f_101_110_110_100_1(uniques, 12);
+  f_101_110_110_101_1(uniques, 12);
+  f_101_110_110_110_1(uniques, 12);
+  f_101_110_110_111_1(uniques, 12);
+  f_101_110_111_000_1(uniques, 12);
+  f_101_110_111_001_1(uniques, 12);
+  f_101_110_111_010_1(uniques, 12);
+  f_101_110_111_011_1(uniques, 12);
+  f_101_110_111_100_1(uniques, 12);
+  f_101_110_111_101_1(uniques, 12);
+  f_101_110_111_110_1(uniques, 12);
+  f_101_110_111_111_1(uniques, 12);
+  f_101_111_000_000_1(uniques, 12);
+  f_101_111_000_001_1(uniques, 12);
+  f_101_111_000_010_1(uniques, 12);
+  f_101_111_000_011_1(uniques, 12);
+  f_101_111_000_100_1(uniques, 12);
+  f_101_111_000_101_1(uniques, 12);
+  f_101_111_000_110_1(uniques, 12);
+  f_101_111_000_111_1(uniques, 12);
+  f_101_111_001_000_1(uniques, 12);
+  f_101_111_001_001_1(uniques, 12);
+  f_101_111_001_010_1(uniques, 12);
+  f_101_111_001_011_1(uniques, 12);
+  f_101_111_001_100_1(uniques, 12);
+  f_101_111_001_101_1(uniques, 12);
+  f_101_111_001_110_1(uniques, 12);
+  f_101_111_001_111_1(uniques, 12);
+  f_101_111_010_000_1(uniques, 12);
+  f_101_111_010_001_1(uniques, 12);
+  f_101_111_010_010_1(uniques, 12);
+  f_101_111_010_011_1(uniques, 12);
+  f_101_111_010_100_1(uniques, 12);
+  f_101_111_010_101_1(uniques, 12);
+  f_101_111_010_110_1(uniques, 12);
+  f_101_111_010_111_1(uniques, 12);
+  f_101_111_011_000_1(uniques, 12);
+  f_101_111_011_001_1(uniques, 12);
+  f_101_111_011_010_1(uniques, 12);
+  f_101_111_011_011_1(uniques, 12);
+  f_101_111_011_100_1(uniques, 12);
+  f_101_111_011_101_1(uniques, 12);
+  f_101_111_011_110_1(uniques, 12);
+  f_101_111_011_111_1(uniques, 12);
+  f_101_111_100_000_1(uniques, 12);
+  f_101_111_100_001_1(uniques, 12);
+  f_101_111_100_010_1(uniques, 12);
+  f_101_111_100_011_1(uniques, 12);
+  f_101_111_100_100_1(uniques, 12);
+  f_101_111_100_101_1(uniques, 12);
+  f_101_111_100_110_1(uniques, 12);
+  f_101_111_100_111_1(uniques, 12);
+  f_101_111_101_000_1(uniques, 12);
+  f_101_111_101_001_1(uniques, 12);
+  f_101_111_101_010_1(uniques, 12);
+  f_101_111_101_011_1(uniques, 12);
+  f_101_111_101_100_1(uniques, 12);
+  f_101_111_101_101_1(uniques, 12);
+  f_101_111_101_110_1(uniques, 12);
+  f_101_111_101_111_1(uniques, 12);
+  f_101_111_110_000_1(uniques, 12);
+  f_101_111_110_001_1(uniques, 12);
+  f_101_111_110_010_1(uniques, 12);
+  f_101_111_110_011_1(uniques, 12);
+  f_101_111_110_100_1(uniques, 12);
+  f_101_111_110_101_1(uniques, 12);
+  f_101_111_110_110_1(uniques, 12);
+  f_101_111_110_111_1(uniques, 12);
+  f_101_111_111_000_1(uniques, 12);
+  f_101_111_111_001_1(uniques, 12);
+  f_101_111_111_010_1(uniques, 12);
+  f_101_111_111_011_1(uniques, 12);
+  f_101_111_111_100_1(uniques, 12);
+  f_101_111_111_101_1(uniques, 12);
+  f_101_111_111_110_1(uniques, 12);
+  f_101_111_111_111_1(uniques, 12);
+  f_110_000_000_000_1(uniques, 12);
+  f_110_000_000_001_1(uniques, 12);
+  f_110_000_000_010_1(uniques, 12);
+  f_110_000_000_011_1(uniques, 12);
+  f_110_000_000_100_1(uniques, 12);
+  f_110_000_000_101_1(uniques, 12);
+  f_110_000_000_110_1(uniques, 12);
+  f_110_000_000_111_1(uniques, 12);
+  f_110_000_001_000_1(uniques, 12);
+  f_110_000_001_001_1(uniques, 12);
+  f_110_000_001_010_1(uniques, 12);
+  f_110_000_001_011_1(uniques, 12);
+  f_110_000_001_100_1(uniques, 12);
+  f_110_000_001_101_1(uniques, 12);
+  f_110_000_001_110_1(uniques, 12);
+  f_110_000_001_111_1(uniques, 12);
+  f_110_000_010_000_1(uniques, 12);
+  f_110_000_010_001_1(uniques, 12);
+  f_110_000_010_010_1(uniques, 12);
+  f_110_000_010_011_1(uniques, 12);
+  f_110_000_010_100_1(uniques, 12);
+  f_110_000_010_101_1(uniques, 12);
+  f_110_000_010_110_1(uniques, 12);
+  f_110_000_010_111_1(uniques, 12);
+  f_110_000_011_000_1(uniques, 12);
+  f_110_000_011_001_1(uniques, 12);
+  f_110_000_011_010_1(uniques, 12);
+  f_110_000_011_011_1(uniques, 12);
+  f_110_000_011_100_1(uniques, 12);
+  f_110_000_011_101_1(uniques, 12);
+  f_110_000_011_110_1(uniques, 12);
+  f_110_000_011_111_1(uniques, 12);
+  f_110_000_100_000_1(uniques, 12);
+  f_110_000_100_001_1(uniques, 12);
+  f_110_000_100_010_1(uniques, 12);
+  f_110_000_100_011_1(uniques, 12);
+  f_110_000_100_100_1(uniques, 12);
+  f_110_000_100_101_1(uniques, 12);
+  f_110_000_100_110_1(uniques, 12);
+  f_110_000_100_111_1(uniques, 12);
+  f_110_000_101_000_1(uniques, 12);
+  f_110_000_101_001_1(uniques, 12);
+  f_110_000_101_010_1(uniques, 12);
+  f_110_000_101_011_1(uniques, 12);
+  f_110_000_101_100_1(uniques, 12);
+  f_110_000_101_101_1(uniques, 12);
+  f_110_000_101_110_1(uniques, 12);
+  f_110_000_101_111_1(uniques, 12);
+  f_110_000_110_000_1(uniques, 12);
+  f_110_000_110_001_1(uniques, 12);
+  f_110_000_110_010_1(uniques, 12);
+  f_110_000_110_011_1(uniques, 12);
+  f_110_000_110_100_1(uniques, 12);
+  f_110_000_110_101_1(uniques, 12);
+  f_110_000_110_110_1(uniques, 12);
+  f_110_000_110_111_1(uniques, 12);
+  f_110_000_111_000_1(uniques, 12);
+  f_110_000_111_001_1(uniques, 12);
+  f_110_000_111_010_1(uniques, 12);
+  f_110_000_111_011_1(uniques, 12);
+  f_110_000_111_100_1(uniques, 12);
+  f_110_000_111_101_1(uniques, 12);
+  f_110_000_111_110_1(uniques, 12);
+  f_110_000_111_111_1(uniques, 12);
+  f_110_001_000_000_1(uniques, 12);
+  f_110_001_000_001_1(uniques, 12);
+  f_110_001_000_010_1(uniques, 12);
+  f_110_001_000_011_1(uniques, 12);
+  f_110_001_000_100_1(uniques, 12);
+  f_110_001_000_101_1(uniques, 12);
+  f_110_001_000_110_1(uniques, 12);
+  f_110_001_000_111_1(uniques, 12);
+  f_110_001_001_000_1(uniques, 12);
+  f_110_001_001_001_1(uniques, 12);
+  f_110_001_001_010_1(uniques, 12);
+  f_110_001_001_011_1(uniques, 12);
+  f_110_001_001_100_1(uniques, 12);
+  f_110_001_001_101_1(uniques, 12);
+  f_110_001_001_110_1(uniques, 12);
+  f_110_001_001_111_1(uniques, 12);
+  f_110_001_010_000_1(uniques, 12);
+  f_110_001_010_001_1(uniques, 12);
+  f_110_001_010_010_1(uniques, 12);
+  f_110_001_010_011_1(uniques, 12);
+  f_110_001_010_100_1(uniques, 12);
+  f_110_001_010_101_1(uniques, 12);
+  f_110_001_010_110_1(uniques, 12);
+  f_110_001_010_111_1(uniques, 12);
+  f_110_001_011_000_1(uniques, 12);
+  f_110_001_011_001_1(uniques, 12);
+  f_110_001_011_010_1(uniques, 12);
+  f_110_001_011_011_1(uniques, 12);
+  f_110_001_011_100_1(uniques, 12);
+  f_110_001_011_101_1(uniques, 12);
+  f_110_001_011_110_1(uniques, 12);
+  f_110_001_011_111_1(uniques, 12);
+  f_110_001_100_000_1(uniques, 12);
+  f_110_001_100_001_1(uniques, 12);
+  f_110_001_100_010_1(uniques, 12);
+  f_110_001_100_011_1(uniques, 12);
+  f_110_001_100_100_1(uniques, 12);
+  f_110_001_100_101_1(uniques, 12);
+  f_110_001_100_110_1(uniques, 12);
+  f_110_001_100_111_1(uniques, 12);
+  f_110_001_101_000_1(uniques, 12);
+  f_110_001_101_001_1(uniques, 12);
+  f_110_001_101_010_1(uniques, 12);
+  f_110_001_101_011_1(uniques, 12);
+  f_110_001_101_100_1(uniques, 12);
+  f_110_001_101_101_1(uniques, 12);
+  f_110_001_101_110_1(uniques, 12);
+  f_110_001_101_111_1(uniques, 12);
+  f_110_001_110_000_1(uniques, 12);
+  f_110_001_110_001_1(uniques, 12);
+  f_110_001_110_010_1(uniques, 12);
+  f_110_001_110_011_1(uniques, 12);
+  f_110_001_110_100_1(uniques, 12);
+  f_110_001_110_101_1(uniques, 12);
+  f_110_001_110_110_1(uniques, 12);
+  f_110_001_110_111_1(uniques, 12);
+  f_110_001_111_000_1(uniques, 12);
+  f_110_001_111_001_1(uniques, 12);
+  f_110_001_111_010_1(uniques, 12);
+  f_110_001_111_011_1(uniques, 12);
+  f_110_001_111_100_1(uniques, 12);
+  f_110_001_111_101_1(uniques, 12);
+  f_110_001_111_110_1(uniques, 12);
+  f_110_001_111_111_1(uniques, 12);
+  f_110_010_000_000_1(uniques, 12);
+  f_110_010_000_001_1(uniques, 12);
+  f_110_010_000_010_1(uniques, 12);
+  f_110_010_000_011_1(uniques, 12);
+  f_110_010_000_100_1(uniques, 12);
+  f_110_010_000_101_1(uniques, 12);
+  f_110_010_000_110_1(uniques, 12);
+  f_110_010_000_111_1(uniques, 12);
+  f_110_010_001_000_1(uniques, 12);
+  f_110_010_001_001_1(uniques, 12);
+  f_110_010_001_010_1(uniques, 12);
+  f_110_010_001_011_1(uniques, 12);
+  f_110_010_001_100_1(uniques, 12);
+  f_110_010_001_101_1(uniques, 12);
+  f_110_010_001_110_1(uniques, 12);
+  f_110_010_001_111_1(uniques, 12);
+  f_110_010_010_000_1(uniques, 12);
+  f_110_010_010_001_1(uniques, 12);
+  f_110_010_010_010_1(uniques, 12);
+  f_110_010_010_011_1(uniques, 12);
+  f_110_010_010_100_1(uniques, 12);
+  f_110_010_010_101_1(uniques, 12);
+  f_110_010_010_110_1(uniques, 12);
+  f_110_010_010_111_1(uniques, 12);
+  f_110_010_011_000_1(uniques, 12);
+  f_110_010_011_001_1(uniques, 12);
+  f_110_010_011_010_1(uniques, 12);
+  f_110_010_011_011_1(uniques, 12);
+  f_110_010_011_100_1(uniques, 12);
+  f_110_010_011_101_1(uniques, 12);
+  f_110_010_011_110_1(uniques, 12);
+  f_110_010_011_111_1(uniques, 12);
+  f_110_010_100_000_1(uniques, 12);
+  f_110_010_100_001_1(uniques, 12);
+  f_110_010_100_010_1(uniques, 12);
+  f_110_010_100_011_1(uniques, 12);
+  f_110_010_100_100_1(uniques, 12);
+  f_110_010_100_101_1(uniques, 12);
+  f_110_010_100_110_1(uniques, 12);
+  f_110_010_100_111_1(uniques, 12);
+  f_110_010_101_000_1(uniques, 12);
+  f_110_010_101_001_1(uniques, 12);
+  f_110_010_101_010_1(uniques, 12);
+  f_110_010_101_011_1(uniques, 12);
+  f_110_010_101_100_1(uniques, 12);
+  f_110_010_101_101_1(uniques, 12);
+  f_110_010_101_110_1(uniques, 12);
+  f_110_010_101_111_1(uniques, 12);
+  f_110_010_110_000_1(uniques, 12);
+  f_110_010_110_001_1(uniques, 12);
+  f_110_010_110_010_1(uniques, 12);
+  f_110_010_110_011_1(uniques, 12);
+  f_110_010_110_100_1(uniques, 12);
+  f_110_010_110_101_1(uniques, 12);
+  f_110_010_110_110_1(uniques, 12);
+  f_110_010_110_111_1(uniques, 12);
+  f_110_010_111_000_1(uniques, 12);
+  f_110_010_111_001_1(uniques, 12);
+  f_110_010_111_010_1(uniques, 12);
+  f_110_010_111_011_1(uniques, 12);
+  f_110_010_111_100_1(uniques, 12);
+  f_110_010_111_101_1(uniques, 12);
+  f_110_010_111_110_1(uniques, 12);
+  f_110_010_111_111_1(uniques, 12);
+  f_110_011_000_000_1(uniques, 12);
+  f_110_011_000_001_1(uniques, 12);
+  f_110_011_000_010_1(uniques, 12);
+  f_110_011_000_011_1(uniques, 12);
+  f_110_011_000_100_1(uniques, 12);
+  f_110_011_000_101_1(uniques, 12);
+  f_110_011_000_110_1(uniques, 12);
+  f_110_011_000_111_1(uniques, 12);
+  f_110_011_001_000_1(uniques, 12);
+  f_110_011_001_001_1(uniques, 12);
+  f_110_011_001_010_1(uniques, 12);
+  f_110_011_001_011_1(uniques, 12);
+  f_110_011_001_100_1(uniques, 12);
+  f_110_011_001_101_1(uniques, 12);
+  f_110_011_001_110_1(uniques, 12);
+  f_110_011_001_111_1(uniques, 12);
+  f_110_011_010_000_1(uniques, 12);
+  f_110_011_010_001_1(uniques, 12);
+  f_110_011_010_010_1(uniques, 12);
+  f_110_011_010_011_1(uniques, 12);
+  f_110_011_010_100_1(uniques, 12);
+  f_110_011_010_101_1(uniques, 12);
+  f_110_011_010_110_1(uniques, 12);
+  f_110_011_010_111_1(uniques, 12);
+  f_110_011_011_000_1(uniques, 12);
+  f_110_011_011_001_1(uniques, 12);
+  f_110_011_011_010_1(uniques, 12);
+  f_110_011_011_011_1(uniques, 12);
+  f_110_011_011_100_1(uniques, 12);
+  f_110_011_011_101_1(uniques, 12);
+  f_110_011_011_110_1(uniques, 12);
+  f_110_011_011_111_1(uniques, 12);
+  f_110_011_100_000_1(uniques, 12);
+  f_110_011_100_001_1(uniques, 12);
+  f_110_011_100_010_1(uniques, 12);
+  f_110_011_100_011_1(uniques, 12);
+  f_110_011_100_100_1(uniques, 12);
+  f_110_011_100_101_1(uniques, 12);
+  f_110_011_100_110_1(uniques, 12);
+  f_110_011_100_111_1(uniques, 12);
+  f_110_011_101_000_1(uniques, 12);
+  f_110_011_101_001_1(uniques, 12);
+  f_110_011_101_010_1(uniques, 12);
+  f_110_011_101_011_1(uniques, 12);
+  f_110_011_101_100_1(uniques, 12);
+  f_110_011_101_101_1(uniques, 12);
+  f_110_011_101_110_1(uniques, 12);
+  f_110_011_101_111_1(uniques, 12);
+  f_110_011_110_000_1(uniques, 12);
+  f_110_011_110_001_1(uniques, 12);
+  f_110_011_110_010_1(uniques, 12);
+  f_110_011_110_011_1(uniques, 12);
+  f_110_011_110_100_1(uniques, 12);
+  f_110_011_110_101_1(uniques, 12);
+  f_110_011_110_110_1(uniques, 12);
+  f_110_011_110_111_1(uniques, 12);
+  f_110_011_111_000_1(uniques, 12);
+  f_110_011_111_001_1(uniques, 12);
+  f_110_011_111_010_1(uniques, 12);
+  f_110_011_111_011_1(uniques, 12);
+  f_110_011_111_100_1(uniques, 12);
+  f_110_011_111_101_1(uniques, 12);
+  f_110_011_111_110_1(uniques, 12);
+  f_110_011_111_111_1(uniques, 12);
+  f_110_100_000_000_1(uniques, 12);
+  f_110_100_000_001_1(uniques, 12);
+  f_110_100_000_010_1(uniques, 12);
+  f_110_100_000_011_1(uniques, 12);
+  f_110_100_000_100_1(uniques, 12);
+  f_110_100_000_101_1(uniques, 12);
+  f_110_100_000_110_1(uniques, 12);
+  f_110_100_000_111_1(uniques, 12);
+  f_110_100_001_000_1(uniques, 12);
+  f_110_100_001_001_1(uniques, 12);
+  f_110_100_001_010_1(uniques, 12);
+  f_110_100_001_011_1(uniques, 12);
+  f_110_100_001_100_1(uniques, 12);
+  f_110_100_001_101_1(uniques, 12);
+  f_110_100_001_110_1(uniques, 12);
+  f_110_100_001_111_1(uniques, 12);
+  f_110_100_010_000_1(uniques, 12);
+  f_110_100_010_001_1(uniques, 12);
+  f_110_100_010_010_1(uniques, 12);
+  f_110_100_010_011_1(uniques, 12);
+  f_110_100_010_100_1(uniques, 12);
+  f_110_100_010_101_1(uniques, 12);
+  f_110_100_010_110_1(uniques, 12);
+  f_110_100_010_111_1(uniques, 12);
+  f_110_100_011_000_1(uniques, 12);
+  f_110_100_011_001_1(uniques, 12);
+  f_110_100_011_010_1(uniques, 12);
+  f_110_100_011_011_1(uniques, 12);
+  f_110_100_011_100_1(uniques, 12);
+  f_110_100_011_101_1(uniques, 12);
+  f_110_100_011_110_1(uniques, 12);
+  f_110_100_011_111_1(uniques, 12);
+  f_110_100_100_000_1(uniques, 12);
+  f_110_100_100_001_1(uniques, 12);
+  f_110_100_100_010_1(uniques, 12);
+  f_110_100_100_011_1(uniques, 12);
+  f_110_100_100_100_1(uniques, 12);
+  f_110_100_100_101_1(uniques, 12);
+  f_110_100_100_110_1(uniques, 12);
+  f_110_100_100_111_1(uniques, 12);
+  f_110_100_101_000_1(uniques, 12);
+  f_110_100_101_001_1(uniques, 12);
+  f_110_100_101_010_1(uniques, 12);
+  f_110_100_101_011_1(uniques, 12);
+  f_110_100_101_100_1(uniques, 12);
+  f_110_100_101_101_1(uniques, 12);
+  f_110_100_101_110_1(uniques, 12);
+  f_110_100_101_111_1(uniques, 12);
+  f_110_100_110_000_1(uniques, 12);
+  f_110_100_110_001_1(uniques, 12);
+  f_110_100_110_010_1(uniques, 12);
+  f_110_100_110_011_1(uniques, 12);
+  f_110_100_110_100_1(uniques, 12);
+  f_110_100_110_101_1(uniques, 12);
+  f_110_100_110_110_1(uniques, 12);
+  f_110_100_110_111_1(uniques, 12);
+  f_110_100_111_000_1(uniques, 12);
+  f_110_100_111_001_1(uniques, 12);
+  f_110_100_111_010_1(uniques, 12);
+  f_110_100_111_011_1(uniques, 12);
+  f_110_100_111_100_1(uniques, 12);
+  f_110_100_111_101_1(uniques, 12);
+  f_110_100_111_110_1(uniques, 12);
+  f_110_100_111_111_1(uniques, 12);
+  f_110_101_000_000_1(uniques, 12);
+  f_110_101_000_001_1(uniques, 12);
+  f_110_101_000_010_1(uniques, 12);
+  f_110_101_000_011_1(uniques, 12);
+  f_110_101_000_100_1(uniques, 12);
+  f_110_101_000_101_1(uniques, 12);
+  f_110_101_000_110_1(uniques, 12);
+  f_110_101_000_111_1(uniques, 12);
+  f_110_101_001_000_1(uniques, 12);
+  f_110_101_001_001_1(uniques, 12);
+  f_110_101_001_010_1(uniques, 12);
+  f_110_101_001_011_1(uniques, 12);
+  f_110_101_001_100_1(uniques, 12);
+  f_110_101_001_101_1(uniques, 12);
+  f_110_101_001_110_1(uniques, 12);
+  f_110_101_001_111_1(uniques, 12);
+  f_110_101_010_000_1(uniques, 12);
+  f_110_101_010_001_1(uniques, 12);
+  f_110_101_010_010_1(uniques, 12);
+  f_110_101_010_011_1(uniques, 12);
+  f_110_101_010_100_1(uniques, 12);
+  f_110_101_010_101_1(uniques, 12);
+  f_110_101_010_110_1(uniques, 12);
+  f_110_101_010_111_1(uniques, 12);
+  f_110_101_011_000_1(uniques, 12);
+  f_110_101_011_001_1(uniques, 12);
+  f_110_101_011_010_1(uniques, 12);
+  f_110_101_011_011_1(uniques, 12);
+  f_110_101_011_100_1(uniques, 12);
+  f_110_101_011_101_1(uniques, 12);
+  f_110_101_011_110_1(uniques, 12);
+  f_110_101_011_111_1(uniques, 12);
+  f_110_101_100_000_1(uniques, 12);
+  f_110_101_100_001_1(uniques, 12);
+  f_110_101_100_010_1(uniques, 12);
+  f_110_101_100_011_1(uniques, 12);
+  f_110_101_100_100_1(uniques, 12);
+  f_110_101_100_101_1(uniques, 12);
+  f_110_101_100_110_1(uniques, 12);
+  f_110_101_100_111_1(uniques, 12);
+  f_110_101_101_000_1(uniques, 12);
+  f_110_101_101_001_1(uniques, 12);
+  f_110_101_101_010_1(uniques, 12);
+  f_110_101_101_011_1(uniques, 12);
+  f_110_101_101_100_1(uniques, 12);
+  f_110_101_101_101_1(uniques, 12);
+  f_110_101_101_110_1(uniques, 12);
+  f_110_101_101_111_1(uniques, 12);
+  f_110_101_110_000_1(uniques, 12);
+  f_110_101_110_001_1(uniques, 12);
+  f_110_101_110_010_1(uniques, 12);
+  f_110_101_110_011_1(uniques, 12);
+  f_110_101_110_100_1(uniques, 12);
+  f_110_101_110_101_1(uniques, 12);
+  f_110_101_110_110_1(uniques, 12);
+  f_110_101_110_111_1(uniques, 12);
+  f_110_101_111_000_1(uniques, 12);
+  f_110_101_111_001_1(uniques, 12);
+  f_110_101_111_010_1(uniques, 12);
+  f_110_101_111_011_1(uniques, 12);
+  f_110_101_111_100_1(uniques, 12);
+  f_110_101_111_101_1(uniques, 12);
+  f_110_101_111_110_1(uniques, 12);
+  f_110_101_111_111_1(uniques, 12);
+  f_110_110_000_000_1(uniques, 12);
+  f_110_110_000_001_1(uniques, 12);
+  f_110_110_000_010_1(uniques, 12);
+  f_110_110_000_011_1(uniques, 12);
+  f_110_110_000_100_1(uniques, 12);
+  f_110_110_000_101_1(uniques, 12);
+  f_110_110_000_110_1(uniques, 12);
+  f_110_110_000_111_1(uniques, 12);
+  f_110_110_001_000_1(uniques, 12);
+  f_110_110_001_001_1(uniques, 12);
+  f_110_110_001_010_1(uniques, 12);
+  f_110_110_001_011_1(uniques, 12);
+  f_110_110_001_100_1(uniques, 12);
+  f_110_110_001_101_1(uniques, 12);
+  f_110_110_001_110_1(uniques, 12);
+  f_110_110_001_111_1(uniques, 12);
+  f_110_110_010_000_1(uniques, 12);
+  f_110_110_010_001_1(uniques, 12);
+  f_110_110_010_010_1(uniques, 12);
+  f_110_110_010_011_1(uniques, 12);
+  f_110_110_010_100_1(uniques, 12);
+  f_110_110_010_101_1(uniques, 12);
+  f_110_110_010_110_1(uniques, 12);
+  f_110_110_010_111_1(uniques, 12);
+  f_110_110_011_000_1(uniques, 12);
+  f_110_110_011_001_1(uniques, 12);
+  f_110_110_011_010_1(uniques, 12);
+  f_110_110_011_011_1(uniques, 12);
+  f_110_110_011_100_1(uniques, 12);
+  f_110_110_011_101_1(uniques, 12);
+  f_110_110_011_110_1(uniques, 12);
+  f_110_110_011_111_1(uniques, 12);
+  f_110_110_100_000_1(uniques, 12);
+  f_110_110_100_001_1(uniques, 12);
+  f_110_110_100_010_1(uniques, 12);
+  f_110_110_100_011_1(uniques, 12);
+  f_110_110_100_100_1(uniques, 12);
+  f_110_110_100_101_1(uniques, 12);
+  f_110_110_100_110_1(uniques, 12);
+  f_110_110_100_111_1(uniques, 12);
+  f_110_110_101_000_1(uniques, 12);
+  f_110_110_101_001_1(uniques, 12);
+  f_110_110_101_010_1(uniques, 12);
+  f_110_110_101_011_1(uniques, 12);
+  f_110_110_101_100_1(uniques, 12);
+  f_110_110_101_101_1(uniques, 12);
+  f_110_110_101_110_1(uniques, 12);
+  f_110_110_101_111_1(uniques, 12);
+  f_110_110_110_000_1(uniques, 12);
+  f_110_110_110_001_1(uniques, 12);
+  f_110_110_110_010_1(uniques, 12);
+  f_110_110_110_011_1(uniques, 12);
+  f_110_110_110_100_1(uniques, 12);
+  f_110_110_110_101_1(uniques, 12);
+  f_110_110_110_110_1(uniques, 12);
+  f_110_110_110_111_1(uniques, 12);
+  f_110_110_111_000_1(uniques, 12);
+  f_110_110_111_001_1(uniques, 12);
+  f_110_110_111_010_1(uniques, 12);
+  f_110_110_111_011_1(uniques, 12);
+  f_110_110_111_100_1(uniques, 12);
+  f_110_110_111_101_1(uniques, 12);
+  f_110_110_111_110_1(uniques, 12);
+  f_110_110_111_111_1(uniques, 12);
+  f_110_111_000_000_1(uniques, 12);
+  f_110_111_000_001_1(uniques, 12);
+  f_110_111_000_010_1(uniques, 12);
+  f_110_111_000_011_1(uniques, 12);
+  f_110_111_000_100_1(uniques, 12);
+  f_110_111_000_101_1(uniques, 12);
+  f_110_111_000_110_1(uniques, 12);
+  f_110_111_000_111_1(uniques, 12);
+  f_110_111_001_000_1(uniques, 12);
+  f_110_111_001_001_1(uniques, 12);
+  f_110_111_001_010_1(uniques, 12);
+  f_110_111_001_011_1(uniques, 12);
+  f_110_111_001_100_1(uniques, 12);
+  f_110_111_001_101_1(uniques, 12);
+  f_110_111_001_110_1(uniques, 12);
+  f_110_111_001_111_1(uniques, 12);
+  f_110_111_010_000_1(uniques, 12);
+  f_110_111_010_001_1(uniques, 12);
+  f_110_111_010_010_1(uniques, 12);
+  f_110_111_010_011_1(uniques, 12);
+  f_110_111_010_100_1(uniques, 12);
+  f_110_111_010_101_1(uniques, 12);
+  f_110_111_010_110_1(uniques, 12);
+  f_110_111_010_111_1(uniques, 12);
+  f_110_111_011_000_1(uniques, 12);
+  f_110_111_011_001_1(uniques, 12);
+  f_110_111_011_010_1(uniques, 12);
+  f_110_111_011_011_1(uniques, 12);
+  f_110_111_011_100_1(uniques, 12);
+  f_110_111_011_101_1(uniques, 12);
+  f_110_111_011_110_1(uniques, 12);
+  f_110_111_011_111_1(uniques, 12);
+  f_110_111_100_000_1(uniques, 12);
+  f_110_111_100_001_1(uniques, 12);
+  f_110_111_100_010_1(uniques, 12);
+  f_110_111_100_011_1(uniques, 12);
+  f_110_111_100_100_1(uniques, 12);
+  f_110_111_100_101_1(uniques, 12);
+  f_110_111_100_110_1(uniques, 12);
+  f_110_111_100_111_1(uniques, 12);
+  f_110_111_101_000_1(uniques, 12);
+  f_110_111_101_001_1(uniques, 12);
+  f_110_111_101_010_1(uniques, 12);
+  f_110_111_101_011_1(uniques, 12);
+  f_110_111_101_100_1(uniques, 12);
+  f_110_111_101_101_1(uniques, 12);
+  f_110_111_101_110_1(uniques, 12);
+  f_110_111_101_111_1(uniques, 12);
+  f_110_111_110_000_1(uniques, 12);
+  f_110_111_110_001_1(uniques, 12);
+  f_110_111_110_010_1(uniques, 12);
+  f_110_111_110_011_1(uniques, 12);
+  f_110_111_110_100_1(uniques, 12);
+  f_110_111_110_101_1(uniques, 12);
+  f_110_111_110_110_1(uniques, 12);
+  f_110_111_110_111_1(uniques, 12);
+  f_110_111_111_000_1(uniques, 12);
+  f_110_111_111_001_1(uniques, 12);
+  f_110_111_111_010_1(uniques, 12);
+  f_110_111_111_011_1(uniques, 12);
+  f_110_111_111_100_1(uniques, 12);
+  f_110_111_111_101_1(uniques, 12);
+  f_110_111_111_110_1(uniques, 12);
+  f_110_111_111_111_1(uniques, 12);
+  f_111_000_000_000_1(uniques, 12);
+  f_111_000_000_001_1(uniques, 12);
+  f_111_000_000_010_1(uniques, 12);
+  f_111_000_000_011_1(uniques, 12);
+  f_111_000_000_100_1(uniques, 12);
+  f_111_000_000_101_1(uniques, 12);
+  f_111_000_000_110_1(uniques, 12);
+  f_111_000_000_111_1(uniques, 12);
+  f_111_000_001_000_1(uniques, 12);
+  f_111_000_001_001_1(uniques, 12);
+  f_111_000_001_010_1(uniques, 12);
+  f_111_000_001_011_1(uniques, 12);
+  f_111_000_001_100_1(uniques, 12);
+  f_111_000_001_101_1(uniques, 12);
+  f_111_000_001_110_1(uniques, 12);
+  f_111_000_001_111_1(uniques, 12);
+  f_111_000_010_000_1(uniques, 12);
+  f_111_000_010_001_1(uniques, 12);
+  f_111_000_010_010_1(uniques, 12);
+  f_111_000_010_011_1(uniques, 12);
+  f_111_000_010_100_1(uniques, 12);
+  f_111_000_010_101_1(uniques, 12);
+  f_111_000_010_110_1(uniques, 12);
+  f_111_000_010_111_1(uniques, 12);
+  f_111_000_011_000_1(uniques, 12);
+  f_111_000_011_001_1(uniques, 12);
+  f_111_000_011_010_1(uniques, 12);
+  f_111_000_011_011_1(uniques, 12);
+  f_111_000_011_100_1(uniques, 12);
+  f_111_000_011_101_1(uniques, 12);
+  f_111_000_011_110_1(uniques, 12);
+  f_111_000_011_111_1(uniques, 12);
+  f_111_000_100_000_1(uniques, 12);
+  f_111_000_100_001_1(uniques, 12);
+  f_111_000_100_010_1(uniques, 12);
+  f_111_000_100_011_1(uniques, 12);
+  f_111_000_100_100_1(uniques, 12);
+  f_111_000_100_101_1(uniques, 12);
+  f_111_000_100_110_1(uniques, 12);
+  f_111_000_100_111_1(uniques, 12);
+  f_111_000_101_000_1(uniques, 12);
+  f_111_000_101_001_1(uniques, 12);
+  f_111_000_101_010_1(uniques, 12);
+  f_111_000_101_011_1(uniques, 12);
+  f_111_000_101_100_1(uniques, 12);
+  f_111_000_101_101_1(uniques, 12);
+  f_111_000_101_110_1(uniques, 12);
+  f_111_000_101_111_1(uniques, 12);
+  f_111_000_110_000_1(uniques, 12);
+  f_111_000_110_001_1(uniques, 12);
+  f_111_000_110_010_1(uniques, 12);
+  f_111_000_110_011_1(uniques, 12);
+  f_111_000_110_100_1(uniques, 12);
+  f_111_000_110_101_1(uniques, 12);
+  f_111_000_110_110_1(uniques, 12);
+  f_111_000_110_111_1(uniques, 12);
+  f_111_000_111_000_1(uniques, 12);
+  f_111_000_111_001_1(uniques, 12);
+  f_111_000_111_010_1(uniques, 12);
+  f_111_000_111_011_1(uniques, 12);
+  f_111_000_111_100_1(uniques, 12);
+  f_111_000_111_101_1(uniques, 12);
+  f_111_000_111_110_1(uniques, 12);
+  f_111_000_111_111_1(uniques, 12);
+  f_111_001_000_000_1(uniques, 12);
+  f_111_001_000_001_1(uniques, 12);
+  f_111_001_000_010_1(uniques, 12);
+  f_111_001_000_011_1(uniques, 12);
+  f_111_001_000_100_1(uniques, 12);
+  f_111_001_000_101_1(uniques, 12);
+  f_111_001_000_110_1(uniques, 12);
+  f_111_001_000_111_1(uniques, 12);
+  f_111_001_001_000_1(uniques, 12);
+  f_111_001_001_001_1(uniques, 12);
+  f_111_001_001_010_1(uniques, 12);
+  f_111_001_001_011_1(uniques, 12);
+  f_111_001_001_100_1(uniques, 12);
+  f_111_001_001_101_1(uniques, 12);
+  f_111_001_001_110_1(uniques, 12);
+  f_111_001_001_111_1(uniques, 12);
+  f_111_001_010_000_1(uniques, 12);
+  f_111_001_010_001_1(uniques, 12);
+  f_111_001_010_010_1(uniques, 12);
+  f_111_001_010_011_1(uniques, 12);
+  f_111_001_010_100_1(uniques, 12);
+  f_111_001_010_101_1(uniques, 12);
+  f_111_001_010_110_1(uniques, 12);
+  f_111_001_010_111_1(uniques, 12);
+  f_111_001_011_000_1(uniques, 12);
+  f_111_001_011_001_1(uniques, 12);
+  f_111_001_011_010_1(uniques, 12);
+  f_111_001_011_011_1(uniques, 12);
+  f_111_001_011_100_1(uniques, 12);
+  f_111_001_011_101_1(uniques, 12);
+  f_111_001_011_110_1(uniques, 12);
+  f_111_001_011_111_1(uniques, 12);
+  f_111_001_100_000_1(uniques, 12);
+  f_111_001_100_001_1(uniques, 12);
+  f_111_001_100_010_1(uniques, 12);
+  f_111_001_100_011_1(uniques, 12);
+  f_111_001_100_100_1(uniques, 12);
+  f_111_001_100_101_1(uniques, 12);
+  f_111_001_100_110_1(uniques, 12);
+  f_111_001_100_111_1(uniques, 12);
+  f_111_001_101_000_1(uniques, 12);
+  f_111_001_101_001_1(uniques, 12);
+  f_111_001_101_010_1(uniques, 12);
+  f_111_001_101_011_1(uniques, 12);
+  f_111_001_101_100_1(uniques, 12);
+  f_111_001_101_101_1(uniques, 12);
+  f_111_001_101_110_1(uniques, 12);
+  f_111_001_101_111_1(uniques, 12);
+  f_111_001_110_000_1(uniques, 12);
+  f_111_001_110_001_1(uniques, 12);
+  f_111_001_110_010_1(uniques, 12);
+  f_111_001_110_011_1(uniques, 12);
+  f_111_001_110_100_1(uniques, 12);
+  f_111_001_110_101_1(uniques, 12);
+  f_111_001_110_110_1(uniques, 12);
+  f_111_001_110_111_1(uniques, 12);
+  f_111_001_111_000_1(uniques, 12);
+  f_111_001_111_001_1(uniques, 12);
+  f_111_001_111_010_1(uniques, 12);
+  f_111_001_111_011_1(uniques, 12);
+  f_111_001_111_100_1(uniques, 12);
+  f_111_001_111_101_1(uniques, 12);
+  f_111_001_111_110_1(uniques, 12);
+  f_111_001_111_111_1(uniques, 12);
+  f_111_010_000_000_1(uniques, 12);
+  f_111_010_000_001_1(uniques, 12);
+  f_111_010_000_010_1(uniques, 12);
+  f_111_010_000_011_1(uniques, 12);
+  f_111_010_000_100_1(uniques, 12);
+  f_111_010_000_101_1(uniques, 12);
+  f_111_010_000_110_1(uniques, 12);
+  f_111_010_000_111_1(uniques, 12);
+  f_111_010_001_000_1(uniques, 12);
+  f_111_010_001_001_1(uniques, 12);
+  f_111_010_001_010_1(uniques, 12);
+  f_111_010_001_011_1(uniques, 12);
+  f_111_010_001_100_1(uniques, 12);
+  f_111_010_001_101_1(uniques, 12);
+  f_111_010_001_110_1(uniques, 12);
+  f_111_010_001_111_1(uniques, 12);
+  f_111_010_010_000_1(uniques, 12);
+  f_111_010_010_001_1(uniques, 12);
+  f_111_010_010_010_1(uniques, 12);
+  f_111_010_010_011_1(uniques, 12);
+  f_111_010_010_100_1(uniques, 12);
+  f_111_010_010_101_1(uniques, 12);
+  f_111_010_010_110_1(uniques, 12);
+  f_111_010_010_111_1(uniques, 12);
+  f_111_010_011_000_1(uniques, 12);
+  f_111_010_011_001_1(uniques, 12);
+  f_111_010_011_010_1(uniques, 12);
+  f_111_010_011_011_1(uniques, 12);
+  f_111_010_011_100_1(uniques, 12);
+  f_111_010_011_101_1(uniques, 12);
+  f_111_010_011_110_1(uniques, 12);
+  f_111_010_011_111_1(uniques, 12);
+  f_111_010_100_000_1(uniques, 12);
+  f_111_010_100_001_1(uniques, 12);
+  f_111_010_100_010_1(uniques, 12);
+  f_111_010_100_011_1(uniques, 12);
+  f_111_010_100_100_1(uniques, 12);
+  f_111_010_100_101_1(uniques, 12);
+  f_111_010_100_110_1(uniques, 12);
+  f_111_010_100_111_1(uniques, 12);
+  f_111_010_101_000_1(uniques, 12);
+  f_111_010_101_001_1(uniques, 12);
+  f_111_010_101_010_1(uniques, 12);
+  f_111_010_101_011_1(uniques, 12);
+  f_111_010_101_100_1(uniques, 12);
+  f_111_010_101_101_1(uniques, 12);
+  f_111_010_101_110_1(uniques, 12);
+  f_111_010_101_111_1(uniques, 12);
+  f_111_010_110_000_1(uniques, 12);
+  f_111_010_110_001_1(uniques, 12);
+  f_111_010_110_010_1(uniques, 12);
+  f_111_010_110_011_1(uniques, 12);
+  f_111_010_110_100_1(uniques, 12);
+  f_111_010_110_101_1(uniques, 12);
+  f_111_010_110_110_1(uniques, 12);
+  f_111_010_110_111_1(uniques, 12);
+  f_111_010_111_000_1(uniques, 12);
+  f_111_010_111_001_1(uniques, 12);
+  f_111_010_111_010_1(uniques, 12);
+  f_111_010_111_011_1(uniques, 12);
+  f_111_010_111_100_1(uniques, 12);
+  f_111_010_111_101_1(uniques, 12);
+  f_111_010_111_110_1(uniques, 12);
+  f_111_010_111_111_1(uniques, 12);
+  f_111_011_000_000_1(uniques, 12);
+  f_111_011_000_001_1(uniques, 12);
+  f_111_011_000_010_1(uniques, 12);
+  f_111_011_000_011_1(uniques, 12);
+  f_111_011_000_100_1(uniques, 12);
+  f_111_011_000_101_1(uniques, 12);
+  f_111_011_000_110_1(uniques, 12);
+  f_111_011_000_111_1(uniques, 12);
+  f_111_011_001_000_1(uniques, 12);
+  f_111_011_001_001_1(uniques, 12);
+  f_111_011_001_010_1(uniques, 12);
+  f_111_011_001_011_1(uniques, 12);
+  f_111_011_001_100_1(uniques, 12);
+  f_111_011_001_101_1(uniques, 12);
+  f_111_011_001_110_1(uniques, 12);
+  f_111_011_001_111_1(uniques, 12);
+  f_111_011_010_000_1(uniques, 12);
+  f_111_011_010_001_1(uniques, 12);
+  f_111_011_010_010_1(uniques, 12);
+  f_111_011_010_011_1(uniques, 12);
+  f_111_011_010_100_1(uniques, 12);
+  f_111_011_010_101_1(uniques, 12);
+  f_111_011_010_110_1(uniques, 12);
+  f_111_011_010_111_1(uniques, 12);
+  f_111_011_011_000_1(uniques, 12);
+  f_111_011_011_001_1(uniques, 12);
+  f_111_011_011_010_1(uniques, 12);
+  f_111_011_011_011_1(uniques, 12);
+  f_111_011_011_100_1(uniques, 12);
+  f_111_011_011_101_1(uniques, 12);
+  f_111_011_011_110_1(uniques, 12);
+  f_111_011_011_111_1(uniques, 12);
+  f_111_011_100_000_1(uniques, 12);
+  f_111_011_100_001_1(uniques, 12);
+  f_111_011_100_010_1(uniques, 12);
+  f_111_011_100_011_1(uniques, 12);
+  f_111_011_100_100_1(uniques, 12);
+  f_111_011_100_101_1(uniques, 12);
+  f_111_011_100_110_1(uniques, 12);
+  f_111_011_100_111_1(uniques, 12);
+  f_111_011_101_000_1(uniques, 12);
+  f_111_011_101_001_1(uniques, 12);
+  f_111_011_101_010_1(uniques, 12);
+  f_111_011_101_011_1(uniques, 12);
+  f_111_011_101_100_1(uniques, 12);
+  f_111_011_101_101_1(uniques, 12);
+  f_111_011_101_110_1(uniques, 12);
+  f_111_011_101_111_1(uniques, 12);
+  f_111_011_110_000_1(uniques, 12);
+  f_111_011_110_001_1(uniques, 12);
+  f_111_011_110_010_1(uniques, 12);
+  f_111_011_110_011_1(uniques, 12);
+  f_111_011_110_100_1(uniques, 12);
+  f_111_011_110_101_1(uniques, 12);
+  f_111_011_110_110_1(uniques, 12);
+  f_111_011_110_111_1(uniques, 12);
+  f_111_011_111_000_1(uniques, 12);
+  f_111_011_111_001_1(uniques, 12);
+  f_111_011_111_010_1(uniques, 12);
+  f_111_011_111_011_1(uniques, 12);
+  f_111_011_111_100_1(uniques, 12);
+  f_111_011_111_101_1(uniques, 12);
+  f_111_011_111_110_1(uniques, 12);
+  f_111_011_111_111_1(uniques, 12);
+  f_111_100_000_000_1(uniques, 12);
+  f_111_100_000_001_1(uniques, 12);
+  f_111_100_000_010_1(uniques, 12);
+  f_111_100_000_011_1(uniques, 12);
+  f_111_100_000_100_1(uniques, 12);
+  f_111_100_000_101_1(uniques, 12);
+  f_111_100_000_110_1(uniques, 12);
+  f_111_100_000_111_1(uniques, 12);
+  f_111_100_001_000_1(uniques, 12);
+  f_111_100_001_001_1(uniques, 12);
+  f_111_100_001_010_1(uniques, 12);
+  f_111_100_001_011_1(uniques, 12);
+  f_111_100_001_100_1(uniques, 12);
+  f_111_100_001_101_1(uniques, 12);
+  f_111_100_001_110_1(uniques, 12);
+  f_111_100_001_111_1(uniques, 12);
+  f_111_100_010_000_1(uniques, 12);
+  f_111_100_010_001_1(uniques, 12);
+  f_111_100_010_010_1(uniques, 12);
+  f_111_100_010_011_1(uniques, 12);
+  f_111_100_010_100_1(uniques, 12);
+  f_111_100_010_101_1(uniques, 12);
+  f_111_100_010_110_1(uniques, 12);
+  f_111_100_010_111_1(uniques, 12);
+  f_111_100_011_000_1(uniques, 12);
+  f_111_100_011_001_1(uniques, 12);
+  f_111_100_011_010_1(uniques, 12);
+  f_111_100_011_011_1(uniques, 12);
+  f_111_100_011_100_1(uniques, 12);
+  f_111_100_011_101_1(uniques, 12);
+  f_111_100_011_110_1(uniques, 12);
+  f_111_100_011_111_1(uniques, 12);
+  f_111_100_100_000_1(uniques, 12);
+  f_111_100_100_001_1(uniques, 12);
+  f_111_100_100_010_1(uniques, 12);
+  f_111_100_100_011_1(uniques, 12);
+  f_111_100_100_100_1(uniques, 12);
+  f_111_100_100_101_1(uniques, 12);
+  f_111_100_100_110_1(uniques, 12);
+  f_111_100_100_111_1(uniques, 12);
+  f_111_100_101_000_1(uniques, 12);
+  f_111_100_101_001_1(uniques, 12);
+  f_111_100_101_010_1(uniques, 12);
+  f_111_100_101_011_1(uniques, 12);
+  f_111_100_101_100_1(uniques, 12);
+  f_111_100_101_101_1(uniques, 12);
+  f_111_100_101_110_1(uniques, 12);
+  f_111_100_101_111_1(uniques, 12);
+  f_111_100_110_000_1(uniques, 12);
+  f_111_100_110_001_1(uniques, 12);
+  f_111_100_110_010_1(uniques, 12);
+  f_111_100_110_011_1(uniques, 12);
+  f_111_100_110_100_1(uniques, 12);
+  f_111_100_110_101_1(uniques, 12);
+  f_111_100_110_110_1(uniques, 12);
+  f_111_100_110_111_1(uniques, 12);
+  f_111_100_111_000_1(uniques, 12);
+  f_111_100_111_001_1(uniques, 12);
+  f_111_100_111_010_1(uniques, 12);
+  f_111_100_111_011_1(uniques, 12);
+  f_111_100_111_100_1(uniques, 12);
+  f_111_100_111_101_1(uniques, 12);
+  f_111_100_111_110_1(uniques, 12);
+  f_111_100_111_111_1(uniques, 12);
+  f_111_101_000_000_1(uniques, 12);
+  f_111_101_000_001_1(uniques, 12);
+  f_111_101_000_010_1(uniques, 12);
+  f_111_101_000_011_1(uniques, 12);
+  f_111_101_000_100_1(uniques, 12);
+  f_111_101_000_101_1(uniques, 12);
+  f_111_101_000_110_1(uniques, 12);
+  f_111_101_000_111_1(uniques, 12);
+  f_111_101_001_000_1(uniques, 12);
+  f_111_101_001_001_1(uniques, 12);
+  f_111_101_001_010_1(uniques, 12);
+  f_111_101_001_011_1(uniques, 12);
+  f_111_101_001_100_1(uniques, 12);
+  f_111_101_001_101_1(uniques, 12);
+  f_111_101_001_110_1(uniques, 12);
+  f_111_101_001_111_1(uniques, 12);
+  f_111_101_010_000_1(uniques, 12);
+  f_111_101_010_001_1(uniques, 12);
+  f_111_101_010_010_1(uniques, 12);
+  f_111_101_010_011_1(uniques, 12);
+  f_111_101_010_100_1(uniques, 12);
+  f_111_101_010_101_1(uniques, 12);
+  f_111_101_010_110_1(uniques, 12);
+  f_111_101_010_111_1(uniques, 12);
+  f_111_101_011_000_1(uniques, 12);
+  f_111_101_011_001_1(uniques, 12);
+  f_111_101_011_010_1(uniques, 12);
+  f_111_101_011_011_1(uniques, 12);
+  f_111_101_011_100_1(uniques, 12);
+  f_111_101_011_101_1(uniques, 12);
+  f_111_101_011_110_1(uniques, 12);
+  f_111_101_011_111_1(uniques, 12);
+  f_111_101_100_000_1(uniques, 12);
+  f_111_101_100_001_1(uniques, 12);
+  f_111_101_100_010_1(uniques, 12);
+  f_111_101_100_011_1(uniques, 12);
+  f_111_101_100_100_1(uniques, 12);
+  f_111_101_100_101_1(uniques, 12);
+  f_111_101_100_110_1(uniques, 12);
+  f_111_101_100_111_1(uniques, 12);
+  f_111_101_101_000_1(uniques, 12);
+  f_111_101_101_001_1(uniques, 12);
+  f_111_101_101_010_1(uniques, 12);
+  f_111_101_101_011_1(uniques, 12);
+  f_111_101_101_100_1(uniques, 12);
+  f_111_101_101_101_1(uniques, 12);
+  f_111_101_101_110_1(uniques, 12);
+  f_111_101_101_111_1(uniques, 12);
+  f_111_101_110_000_1(uniques, 12);
+  f_111_101_110_001_1(uniques, 12);
+  f_111_101_110_010_1(uniques, 12);
+  f_111_101_110_011_1(uniques, 12);
+  f_111_101_110_100_1(uniques, 12);
+  f_111_101_110_101_1(uniques, 12);
+  f_111_101_110_110_1(uniques, 12);
+  f_111_101_110_111_1(uniques, 12);
+  f_111_101_111_000_1(uniques, 12);
+  f_111_101_111_001_1(uniques, 12);
+  f_111_101_111_010_1(uniques, 12);
+  f_111_101_111_011_1(uniques, 12);
+  f_111_101_111_100_1(uniques, 12);
+  f_111_101_111_101_1(uniques, 12);
+  f_111_101_111_110_1(uniques, 12);
+  f_111_101_111_111_1(uniques, 12);
+  f_111_110_000_000_1(uniques, 12);
+  f_111_110_000_001_1(uniques, 12);
+  f_111_110_000_010_1(uniques, 12);
+  f_111_110_000_011_1(uniques, 12);
+  f_111_110_000_100_1(uniques, 12);
+  f_111_110_000_101_1(uniques, 12);
+  f_111_110_000_110_1(uniques, 12);
+  f_111_110_000_111_1(uniques, 12);
+  f_111_110_001_000_1(uniques, 12);
+  f_111_110_001_001_1(uniques, 12);
+  f_111_110_001_010_1(uniques, 12);
+  f_111_110_001_011_1(uniques, 12);
+  f_111_110_001_100_1(uniques, 12);
+  f_111_110_001_101_1(uniques, 12);
+  f_111_110_001_110_1(uniques, 12);
+  f_111_110_001_111_1(uniques, 12);
+  f_111_110_010_000_1(uniques, 12);
+  f_111_110_010_001_1(uniques, 12);
+  f_111_110_010_010_1(uniques, 12);
+  f_111_110_010_011_1(uniques, 12);
+  f_111_110_010_100_1(uniques, 12);
+  f_111_110_010_101_1(uniques, 12);
+  f_111_110_010_110_1(uniques, 12);
+  f_111_110_010_111_1(uniques, 12);
+  f_111_110_011_000_1(uniques, 12);
+  f_111_110_011_001_1(uniques, 12);
+  f_111_110_011_010_1(uniques, 12);
+  f_111_110_011_011_1(uniques, 12);
+  f_111_110_011_100_1(uniques, 12);
+  f_111_110_011_101_1(uniques, 12);
+  f_111_110_011_110_1(uniques, 12);
+  f_111_110_011_111_1(uniques, 12);
+  f_111_110_100_000_1(uniques, 12);
+  f_111_110_100_001_1(uniques, 12);
+  f_111_110_100_010_1(uniques, 12);
+  f_111_110_100_011_1(uniques, 12);
+  f_111_110_100_100_1(uniques, 12);
+  f_111_110_100_101_1(uniques, 12);
+  f_111_110_100_110_1(uniques, 12);
+  f_111_110_100_111_1(uniques, 12);
+  f_111_110_101_000_1(uniques, 12);
+  f_111_110_101_001_1(uniques, 12);
+  f_111_110_101_010_1(uniques, 12);
+  f_111_110_101_011_1(uniques, 12);
+  f_111_110_101_100_1(uniques, 12);
+  f_111_110_101_101_1(uniques, 12);
+  f_111_110_101_110_1(uniques, 12);
+  f_111_110_101_111_1(uniques, 12);
+  f_111_110_110_000_1(uniques, 12);
+  f_111_110_110_001_1(uniques, 12);
+  f_111_110_110_010_1(uniques, 12);
+  f_111_110_110_011_1(uniques, 12);
+  f_111_110_110_100_1(uniques, 12);
+  f_111_110_110_101_1(uniques, 12);
+  f_111_110_110_110_1(uniques, 12);
+  f_111_110_110_111_1(uniques, 12);
+  f_111_110_111_000_1(uniques, 12);
+  f_111_110_111_001_1(uniques, 12);
+  f_111_110_111_010_1(uniques, 12);
+  f_111_110_111_011_1(uniques, 12);
+  f_111_110_111_100_1(uniques, 12);
+  f_111_110_111_101_1(uniques, 12);
+  f_111_110_111_110_1(uniques, 12);
+  f_111_110_111_111_1(uniques, 12);
+  f_111_111_000_000_1(uniques, 12);
+  f_111_111_000_001_1(uniques, 12);
+  f_111_111_000_010_1(uniques, 12);
+  f_111_111_000_011_1(uniques, 12);
+  f_111_111_000_100_1(uniques, 12);
+  f_111_111_000_101_1(uniques, 12);
+  f_111_111_000_110_1(uniques, 12);
+  f_111_111_000_111_1(uniques, 12);
+  f_111_111_001_000_1(uniques, 12);
+  f_111_111_001_001_1(uniques, 12);
+  f_111_111_001_010_1(uniques, 12);
+  f_111_111_001_011_1(uniques, 12);
+  f_111_111_001_100_1(uniques, 12);
+  f_111_111_001_101_1(uniques, 12);
+  f_111_111_001_110_1(uniques, 12);
+  f_111_111_001_111_1(uniques, 12);
+  f_111_111_010_000_1(uniques, 12);
+  f_111_111_010_001_1(uniques, 12);
+  f_111_111_010_010_1(uniques, 12);
+  f_111_111_010_011_1(uniques, 12);
+  f_111_111_010_100_1(uniques, 12);
+  f_111_111_010_101_1(uniques, 12);
+  f_111_111_010_110_1(uniques, 12);
+  f_111_111_010_111_1(uniques, 12);
+  f_111_111_011_000_1(uniques, 12);
+  f_111_111_011_001_1(uniques, 12);
+  f_111_111_011_010_1(uniques, 12);
+  f_111_111_011_011_1(uniques, 12);
+  f_111_111_011_100_1(uniques, 12);
+  f_111_111_011_101_1(uniques, 12);
+  f_111_111_011_110_1(uniques, 12);
+  f_111_111_011_111_1(uniques, 12);
+  f_111_111_100_000_1(uniques, 12);
+  f_111_111_100_001_1(uniques, 12);
+  f_111_111_100_010_1(uniques, 12);
+  f_111_111_100_011_1(uniques, 12);
+  f_111_111_100_100_1(uniques, 12);
+  f_111_111_100_101_1(uniques, 12);
+  f_111_111_100_110_1(uniques, 12);
+  f_111_111_100_111_1(uniques, 12);
+  f_111_111_101_000_1(uniques, 12);
+  f_111_111_101_001_1(uniques, 12);
+  f_111_111_101_010_1(uniques, 12);
+  f_111_111_101_011_1(uniques, 12);
+  f_111_111_101_100_1(uniques, 12);
+  f_111_111_101_101_1(uniques, 12);
+  f_111_111_101_110_1(uniques, 12);
+  f_111_111_101_111_1(uniques, 12);
+  f_111_111_110_000_1(uniques, 12);
+  f_111_111_110_001_1(uniques, 12);
+  f_111_111_110_010_1(uniques, 12);
+  f_111_111_110_011_1(uniques, 12);
+  f_111_111_110_100_1(uniques, 12);
+  f_111_111_110_101_1(uniques, 12);
+  f_111_111_110_110_1(uniques, 12);
+  f_111_111_110_111_1(uniques, 12);
+  f_111_111_111_000_1(uniques, 12);
+  f_111_111_111_001_1(uniques, 12);
+  f_111_111_111_010_1(uniques, 12);
+  f_111_111_111_011_1(uniques, 12);
+  f_111_111_111_100_1(uniques, 12);
+  f_111_111_111_101_1(uniques, 12);
+  f_111_111_111_110_1(uniques, 12);
+  f_111_111_111_111_1(uniques, 12);
+  Expect.equals(4096, uniques.length);
+}
diff --git a/tests/dart2js/deferred/many_parts/lib_000_000_000_001_0.dart b/tests/dart2js/deferred/many_parts/lib_000_000_000_001_0.dart
new file mode 100644
index 0000000..38b5ca0
--- /dev/null
+++ b/tests/dart2js/deferred/many_parts/lib_000_000_000_001_0.dart
@@ -0,0 +1,4111 @@
+// Copyright (c) 2020, 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:expect/expect.dart";
+
+import 'libB.dart';
+
+@pragma('dart2js:noInline')
+g_000_000_000_001_0() {
+  Set<String> uniques = {};
+
+  // f_***_***_***_**1_*;
+  f_000_000_000_001_0(uniques, 11);
+  f_000_000_000_001_1(uniques, 11);
+  f_000_000_000_011_0(uniques, 11);
+  f_000_000_000_011_1(uniques, 11);
+  f_000_000_000_101_0(uniques, 11);
+  f_000_000_000_101_1(uniques, 11);
+  f_000_000_000_111_0(uniques, 11);
+  f_000_000_000_111_1(uniques, 11);
+  f_000_000_001_001_0(uniques, 11);
+  f_000_000_001_001_1(uniques, 11);
+  f_000_000_001_011_0(uniques, 11);
+  f_000_000_001_011_1(uniques, 11);
+  f_000_000_001_101_0(uniques, 11);
+  f_000_000_001_101_1(uniques, 11);
+  f_000_000_001_111_0(uniques, 11);
+  f_000_000_001_111_1(uniques, 11);
+  f_000_000_010_001_0(uniques, 11);
+  f_000_000_010_001_1(uniques, 11);
+  f_000_000_010_011_0(uniques, 11);
+  f_000_000_010_011_1(uniques, 11);
+  f_000_000_010_101_0(uniques, 11);
+  f_000_000_010_101_1(uniques, 11);
+  f_000_000_010_111_0(uniques, 11);
+  f_000_000_010_111_1(uniques, 11);
+  f_000_000_011_001_0(uniques, 11);
+  f_000_000_011_001_1(uniques, 11);
+  f_000_000_011_011_0(uniques, 11);
+  f_000_000_011_011_1(uniques, 11);
+  f_000_000_011_101_0(uniques, 11);
+  f_000_000_011_101_1(uniques, 11);
+  f_000_000_011_111_0(uniques, 11);
+  f_000_000_011_111_1(uniques, 11);
+  f_000_000_100_001_0(uniques, 11);
+  f_000_000_100_001_1(uniques, 11);
+  f_000_000_100_011_0(uniques, 11);
+  f_000_000_100_011_1(uniques, 11);
+  f_000_000_100_101_0(uniques, 11);
+  f_000_000_100_101_1(uniques, 11);
+  f_000_000_100_111_0(uniques, 11);
+  f_000_000_100_111_1(uniques, 11);
+  f_000_000_101_001_0(uniques, 11);
+  f_000_000_101_001_1(uniques, 11);
+  f_000_000_101_011_0(uniques, 11);
+  f_000_000_101_011_1(uniques, 11);
+  f_000_000_101_101_0(uniques, 11);
+  f_000_000_101_101_1(uniques, 11);
+  f_000_000_101_111_0(uniques, 11);
+  f_000_000_101_111_1(uniques, 11);
+  f_000_000_110_001_0(uniques, 11);
+  f_000_000_110_001_1(uniques, 11);
+  f_000_000_110_011_0(uniques, 11);
+  f_000_000_110_011_1(uniques, 11);
+  f_000_000_110_101_0(uniques, 11);
+  f_000_000_110_101_1(uniques, 11);
+  f_000_000_110_111_0(uniques, 11);
+  f_000_000_110_111_1(uniques, 11);
+  f_000_000_111_001_0(uniques, 11);
+  f_000_000_111_001_1(uniques, 11);
+  f_000_000_111_011_0(uniques, 11);
+  f_000_000_111_011_1(uniques, 11);
+  f_000_000_111_101_0(uniques, 11);
+  f_000_000_111_101_1(uniques, 11);
+  f_000_000_111_111_0(uniques, 11);
+  f_000_000_111_111_1(uniques, 11);
+  f_000_001_000_001_0(uniques, 11);
+  f_000_001_000_001_1(uniques, 11);
+  f_000_001_000_011_0(uniques, 11);
+  f_000_001_000_011_1(uniques, 11);
+  f_000_001_000_101_0(uniques, 11);
+  f_000_001_000_101_1(uniques, 11);
+  f_000_001_000_111_0(uniques, 11);
+  f_000_001_000_111_1(uniques, 11);
+  f_000_001_001_001_0(uniques, 11);
+  f_000_001_001_001_1(uniques, 11);
+  f_000_001_001_011_0(uniques, 11);
+  f_000_001_001_011_1(uniques, 11);
+  f_000_001_001_101_0(uniques, 11);
+  f_000_001_001_101_1(uniques, 11);
+  f_000_001_001_111_0(uniques, 11);
+  f_000_001_001_111_1(uniques, 11);
+  f_000_001_010_001_0(uniques, 11);
+  f_000_001_010_001_1(uniques, 11);
+  f_000_001_010_011_0(uniques, 11);
+  f_000_001_010_011_1(uniques, 11);
+  f_000_001_010_101_0(uniques, 11);
+  f_000_001_010_101_1(uniques, 11);
+  f_000_001_010_111_0(uniques, 11);
+  f_000_001_010_111_1(uniques, 11);
+  f_000_001_011_001_0(uniques, 11);
+  f_000_001_011_001_1(uniques, 11);
+  f_000_001_011_011_0(uniques, 11);
+  f_000_001_011_011_1(uniques, 11);
+  f_000_001_011_101_0(uniques, 11);
+  f_000_001_011_101_1(uniques, 11);
+  f_000_001_011_111_0(uniques, 11);
+  f_000_001_011_111_1(uniques, 11);
+  f_000_001_100_001_0(uniques, 11);
+  f_000_001_100_001_1(uniques, 11);
+  f_000_001_100_011_0(uniques, 11);
+  f_000_001_100_011_1(uniques, 11);
+  f_000_001_100_101_0(uniques, 11);
+  f_000_001_100_101_1(uniques, 11);
+  f_000_001_100_111_0(uniques, 11);
+  f_000_001_100_111_1(uniques, 11);
+  f_000_001_101_001_0(uniques, 11);
+  f_000_001_101_001_1(uniques, 11);
+  f_000_001_101_011_0(uniques, 11);
+  f_000_001_101_011_1(uniques, 11);
+  f_000_001_101_101_0(uniques, 11);
+  f_000_001_101_101_1(uniques, 11);
+  f_000_001_101_111_0(uniques, 11);
+  f_000_001_101_111_1(uniques, 11);
+  f_000_001_110_001_0(uniques, 11);
+  f_000_001_110_001_1(uniques, 11);
+  f_000_001_110_011_0(uniques, 11);
+  f_000_001_110_011_1(uniques, 11);
+  f_000_001_110_101_0(uniques, 11);
+  f_000_001_110_101_1(uniques, 11);
+  f_000_001_110_111_0(uniques, 11);
+  f_000_001_110_111_1(uniques, 11);
+  f_000_001_111_001_0(uniques, 11);
+  f_000_001_111_001_1(uniques, 11);
+  f_000_001_111_011_0(uniques, 11);
+  f_000_001_111_011_1(uniques, 11);
+  f_000_001_111_101_0(uniques, 11);
+  f_000_001_111_101_1(uniques, 11);
+  f_000_001_111_111_0(uniques, 11);
+  f_000_001_111_111_1(uniques, 11);
+  f_000_010_000_001_0(uniques, 11);
+  f_000_010_000_001_1(uniques, 11);
+  f_000_010_000_011_0(uniques, 11);
+  f_000_010_000_011_1(uniques, 11);
+  f_000_010_000_101_0(uniques, 11);
+  f_000_010_000_101_1(uniques, 11);
+  f_000_010_000_111_0(uniques, 11);
+  f_000_010_000_111_1(uniques, 11);
+  f_000_010_001_001_0(uniques, 11);
+  f_000_010_001_001_1(uniques, 11);
+  f_000_010_001_011_0(uniques, 11);
+  f_000_010_001_011_1(uniques, 11);
+  f_000_010_001_101_0(uniques, 11);
+  f_000_010_001_101_1(uniques, 11);
+  f_000_010_001_111_0(uniques, 11);
+  f_000_010_001_111_1(uniques, 11);
+  f_000_010_010_001_0(uniques, 11);
+  f_000_010_010_001_1(uniques, 11);
+  f_000_010_010_011_0(uniques, 11);
+  f_000_010_010_011_1(uniques, 11);
+  f_000_010_010_101_0(uniques, 11);
+  f_000_010_010_101_1(uniques, 11);
+  f_000_010_010_111_0(uniques, 11);
+  f_000_010_010_111_1(uniques, 11);
+  f_000_010_011_001_0(uniques, 11);
+  f_000_010_011_001_1(uniques, 11);
+  f_000_010_011_011_0(uniques, 11);
+  f_000_010_011_011_1(uniques, 11);
+  f_000_010_011_101_0(uniques, 11);
+  f_000_010_011_101_1(uniques, 11);
+  f_000_010_011_111_0(uniques, 11);
+  f_000_010_011_111_1(uniques, 11);
+  f_000_010_100_001_0(uniques, 11);
+  f_000_010_100_001_1(uniques, 11);
+  f_000_010_100_011_0(uniques, 11);
+  f_000_010_100_011_1(uniques, 11);
+  f_000_010_100_101_0(uniques, 11);
+  f_000_010_100_101_1(uniques, 11);
+  f_000_010_100_111_0(uniques, 11);
+  f_000_010_100_111_1(uniques, 11);
+  f_000_010_101_001_0(uniques, 11);
+  f_000_010_101_001_1(uniques, 11);
+  f_000_010_101_011_0(uniques, 11);
+  f_000_010_101_011_1(uniques, 11);
+  f_000_010_101_101_0(uniques, 11);
+  f_000_010_101_101_1(uniques, 11);
+  f_000_010_101_111_0(uniques, 11);
+  f_000_010_101_111_1(uniques, 11);
+  f_000_010_110_001_0(uniques, 11);
+  f_000_010_110_001_1(uniques, 11);
+  f_000_010_110_011_0(uniques, 11);
+  f_000_010_110_011_1(uniques, 11);
+  f_000_010_110_101_0(uniques, 11);
+  f_000_010_110_101_1(uniques, 11);
+  f_000_010_110_111_0(uniques, 11);
+  f_000_010_110_111_1(uniques, 11);
+  f_000_010_111_001_0(uniques, 11);
+  f_000_010_111_001_1(uniques, 11);
+  f_000_010_111_011_0(uniques, 11);
+  f_000_010_111_011_1(uniques, 11);
+  f_000_010_111_101_0(uniques, 11);
+  f_000_010_111_101_1(uniques, 11);
+  f_000_010_111_111_0(uniques, 11);
+  f_000_010_111_111_1(uniques, 11);
+  f_000_011_000_001_0(uniques, 11);
+  f_000_011_000_001_1(uniques, 11);
+  f_000_011_000_011_0(uniques, 11);
+  f_000_011_000_011_1(uniques, 11);
+  f_000_011_000_101_0(uniques, 11);
+  f_000_011_000_101_1(uniques, 11);
+  f_000_011_000_111_0(uniques, 11);
+  f_000_011_000_111_1(uniques, 11);
+  f_000_011_001_001_0(uniques, 11);
+  f_000_011_001_001_1(uniques, 11);
+  f_000_011_001_011_0(uniques, 11);
+  f_000_011_001_011_1(uniques, 11);
+  f_000_011_001_101_0(uniques, 11);
+  f_000_011_001_101_1(uniques, 11);
+  f_000_011_001_111_0(uniques, 11);
+  f_000_011_001_111_1(uniques, 11);
+  f_000_011_010_001_0(uniques, 11);
+  f_000_011_010_001_1(uniques, 11);
+  f_000_011_010_011_0(uniques, 11);
+  f_000_011_010_011_1(uniques, 11);
+  f_000_011_010_101_0(uniques, 11);
+  f_000_011_010_101_1(uniques, 11);
+  f_000_011_010_111_0(uniques, 11);
+  f_000_011_010_111_1(uniques, 11);
+  f_000_011_011_001_0(uniques, 11);
+  f_000_011_011_001_1(uniques, 11);
+  f_000_011_011_011_0(uniques, 11);
+  f_000_011_011_011_1(uniques, 11);
+  f_000_011_011_101_0(uniques, 11);
+  f_000_011_011_101_1(uniques, 11);
+  f_000_011_011_111_0(uniques, 11);
+  f_000_011_011_111_1(uniques, 11);
+  f_000_011_100_001_0(uniques, 11);
+  f_000_011_100_001_1(uniques, 11);
+  f_000_011_100_011_0(uniques, 11);
+  f_000_011_100_011_1(uniques, 11);
+  f_000_011_100_101_0(uniques, 11);
+  f_000_011_100_101_1(uniques, 11);
+  f_000_011_100_111_0(uniques, 11);
+  f_000_011_100_111_1(uniques, 11);
+  f_000_011_101_001_0(uniques, 11);
+  f_000_011_101_001_1(uniques, 11);
+  f_000_011_101_011_0(uniques, 11);
+  f_000_011_101_011_1(uniques, 11);
+  f_000_011_101_101_0(uniques, 11);
+  f_000_011_101_101_1(uniques, 11);
+  f_000_011_101_111_0(uniques, 11);
+  f_000_011_101_111_1(uniques, 11);
+  f_000_011_110_001_0(uniques, 11);
+  f_000_011_110_001_1(uniques, 11);
+  f_000_011_110_011_0(uniques, 11);
+  f_000_011_110_011_1(uniques, 11);
+  f_000_011_110_101_0(uniques, 11);
+  f_000_011_110_101_1(uniques, 11);
+  f_000_011_110_111_0(uniques, 11);
+  f_000_011_110_111_1(uniques, 11);
+  f_000_011_111_001_0(uniques, 11);
+  f_000_011_111_001_1(uniques, 11);
+  f_000_011_111_011_0(uniques, 11);
+  f_000_011_111_011_1(uniques, 11);
+  f_000_011_111_101_0(uniques, 11);
+  f_000_011_111_101_1(uniques, 11);
+  f_000_011_111_111_0(uniques, 11);
+  f_000_011_111_111_1(uniques, 11);
+  f_000_100_000_001_0(uniques, 11);
+  f_000_100_000_001_1(uniques, 11);
+  f_000_100_000_011_0(uniques, 11);
+  f_000_100_000_011_1(uniques, 11);
+  f_000_100_000_101_0(uniques, 11);
+  f_000_100_000_101_1(uniques, 11);
+  f_000_100_000_111_0(uniques, 11);
+  f_000_100_000_111_1(uniques, 11);
+  f_000_100_001_001_0(uniques, 11);
+  f_000_100_001_001_1(uniques, 11);
+  f_000_100_001_011_0(uniques, 11);
+  f_000_100_001_011_1(uniques, 11);
+  f_000_100_001_101_0(uniques, 11);
+  f_000_100_001_101_1(uniques, 11);
+  f_000_100_001_111_0(uniques, 11);
+  f_000_100_001_111_1(uniques, 11);
+  f_000_100_010_001_0(uniques, 11);
+  f_000_100_010_001_1(uniques, 11);
+  f_000_100_010_011_0(uniques, 11);
+  f_000_100_010_011_1(uniques, 11);
+  f_000_100_010_101_0(uniques, 11);
+  f_000_100_010_101_1(uniques, 11);
+  f_000_100_010_111_0(uniques, 11);
+  f_000_100_010_111_1(uniques, 11);
+  f_000_100_011_001_0(uniques, 11);
+  f_000_100_011_001_1(uniques, 11);
+  f_000_100_011_011_0(uniques, 11);
+  f_000_100_011_011_1(uniques, 11);
+  f_000_100_011_101_0(uniques, 11);
+  f_000_100_011_101_1(uniques, 11);
+  f_000_100_011_111_0(uniques, 11);
+  f_000_100_011_111_1(uniques, 11);
+  f_000_100_100_001_0(uniques, 11);
+  f_000_100_100_001_1(uniques, 11);
+  f_000_100_100_011_0(uniques, 11);
+  f_000_100_100_011_1(uniques, 11);
+  f_000_100_100_101_0(uniques, 11);
+  f_000_100_100_101_1(uniques, 11);
+  f_000_100_100_111_0(uniques, 11);
+  f_000_100_100_111_1(uniques, 11);
+  f_000_100_101_001_0(uniques, 11);
+  f_000_100_101_001_1(uniques, 11);
+  f_000_100_101_011_0(uniques, 11);
+  f_000_100_101_011_1(uniques, 11);
+  f_000_100_101_101_0(uniques, 11);
+  f_000_100_101_101_1(uniques, 11);
+  f_000_100_101_111_0(uniques, 11);
+  f_000_100_101_111_1(uniques, 11);
+  f_000_100_110_001_0(uniques, 11);
+  f_000_100_110_001_1(uniques, 11);
+  f_000_100_110_011_0(uniques, 11);
+  f_000_100_110_011_1(uniques, 11);
+  f_000_100_110_101_0(uniques, 11);
+  f_000_100_110_101_1(uniques, 11);
+  f_000_100_110_111_0(uniques, 11);
+  f_000_100_110_111_1(uniques, 11);
+  f_000_100_111_001_0(uniques, 11);
+  f_000_100_111_001_1(uniques, 11);
+  f_000_100_111_011_0(uniques, 11);
+  f_000_100_111_011_1(uniques, 11);
+  f_000_100_111_101_0(uniques, 11);
+  f_000_100_111_101_1(uniques, 11);
+  f_000_100_111_111_0(uniques, 11);
+  f_000_100_111_111_1(uniques, 11);
+  f_000_101_000_001_0(uniques, 11);
+  f_000_101_000_001_1(uniques, 11);
+  f_000_101_000_011_0(uniques, 11);
+  f_000_101_000_011_1(uniques, 11);
+  f_000_101_000_101_0(uniques, 11);
+  f_000_101_000_101_1(uniques, 11);
+  f_000_101_000_111_0(uniques, 11);
+  f_000_101_000_111_1(uniques, 11);
+  f_000_101_001_001_0(uniques, 11);
+  f_000_101_001_001_1(uniques, 11);
+  f_000_101_001_011_0(uniques, 11);
+  f_000_101_001_011_1(uniques, 11);
+  f_000_101_001_101_0(uniques, 11);
+  f_000_101_001_101_1(uniques, 11);
+  f_000_101_001_111_0(uniques, 11);
+  f_000_101_001_111_1(uniques, 11);
+  f_000_101_010_001_0(uniques, 11);
+  f_000_101_010_001_1(uniques, 11);
+  f_000_101_010_011_0(uniques, 11);
+  f_000_101_010_011_1(uniques, 11);
+  f_000_101_010_101_0(uniques, 11);
+  f_000_101_010_101_1(uniques, 11);
+  f_000_101_010_111_0(uniques, 11);
+  f_000_101_010_111_1(uniques, 11);
+  f_000_101_011_001_0(uniques, 11);
+  f_000_101_011_001_1(uniques, 11);
+  f_000_101_011_011_0(uniques, 11);
+  f_000_101_011_011_1(uniques, 11);
+  f_000_101_011_101_0(uniques, 11);
+  f_000_101_011_101_1(uniques, 11);
+  f_000_101_011_111_0(uniques, 11);
+  f_000_101_011_111_1(uniques, 11);
+  f_000_101_100_001_0(uniques, 11);
+  f_000_101_100_001_1(uniques, 11);
+  f_000_101_100_011_0(uniques, 11);
+  f_000_101_100_011_1(uniques, 11);
+  f_000_101_100_101_0(uniques, 11);
+  f_000_101_100_101_1(uniques, 11);
+  f_000_101_100_111_0(uniques, 11);
+  f_000_101_100_111_1(uniques, 11);
+  f_000_101_101_001_0(uniques, 11);
+  f_000_101_101_001_1(uniques, 11);
+  f_000_101_101_011_0(uniques, 11);
+  f_000_101_101_011_1(uniques, 11);
+  f_000_101_101_101_0(uniques, 11);
+  f_000_101_101_101_1(uniques, 11);
+  f_000_101_101_111_0(uniques, 11);
+  f_000_101_101_111_1(uniques, 11);
+  f_000_101_110_001_0(uniques, 11);
+  f_000_101_110_001_1(uniques, 11);
+  f_000_101_110_011_0(uniques, 11);
+  f_000_101_110_011_1(uniques, 11);
+  f_000_101_110_101_0(uniques, 11);
+  f_000_101_110_101_1(uniques, 11);
+  f_000_101_110_111_0(uniques, 11);
+  f_000_101_110_111_1(uniques, 11);
+  f_000_101_111_001_0(uniques, 11);
+  f_000_101_111_001_1(uniques, 11);
+  f_000_101_111_011_0(uniques, 11);
+  f_000_101_111_011_1(uniques, 11);
+  f_000_101_111_101_0(uniques, 11);
+  f_000_101_111_101_1(uniques, 11);
+  f_000_101_111_111_0(uniques, 11);
+  f_000_101_111_111_1(uniques, 11);
+  f_000_110_000_001_0(uniques, 11);
+  f_000_110_000_001_1(uniques, 11);
+  f_000_110_000_011_0(uniques, 11);
+  f_000_110_000_011_1(uniques, 11);
+  f_000_110_000_101_0(uniques, 11);
+  f_000_110_000_101_1(uniques, 11);
+  f_000_110_000_111_0(uniques, 11);
+  f_000_110_000_111_1(uniques, 11);
+  f_000_110_001_001_0(uniques, 11);
+  f_000_110_001_001_1(uniques, 11);
+  f_000_110_001_011_0(uniques, 11);
+  f_000_110_001_011_1(uniques, 11);
+  f_000_110_001_101_0(uniques, 11);
+  f_000_110_001_101_1(uniques, 11);
+  f_000_110_001_111_0(uniques, 11);
+  f_000_110_001_111_1(uniques, 11);
+  f_000_110_010_001_0(uniques, 11);
+  f_000_110_010_001_1(uniques, 11);
+  f_000_110_010_011_0(uniques, 11);
+  f_000_110_010_011_1(uniques, 11);
+  f_000_110_010_101_0(uniques, 11);
+  f_000_110_010_101_1(uniques, 11);
+  f_000_110_010_111_0(uniques, 11);
+  f_000_110_010_111_1(uniques, 11);
+  f_000_110_011_001_0(uniques, 11);
+  f_000_110_011_001_1(uniques, 11);
+  f_000_110_011_011_0(uniques, 11);
+  f_000_110_011_011_1(uniques, 11);
+  f_000_110_011_101_0(uniques, 11);
+  f_000_110_011_101_1(uniques, 11);
+  f_000_110_011_111_0(uniques, 11);
+  f_000_110_011_111_1(uniques, 11);
+  f_000_110_100_001_0(uniques, 11);
+  f_000_110_100_001_1(uniques, 11);
+  f_000_110_100_011_0(uniques, 11);
+  f_000_110_100_011_1(uniques, 11);
+  f_000_110_100_101_0(uniques, 11);
+  f_000_110_100_101_1(uniques, 11);
+  f_000_110_100_111_0(uniques, 11);
+  f_000_110_100_111_1(uniques, 11);
+  f_000_110_101_001_0(uniques, 11);
+  f_000_110_101_001_1(uniques, 11);
+  f_000_110_101_011_0(uniques, 11);
+  f_000_110_101_011_1(uniques, 11);
+  f_000_110_101_101_0(uniques, 11);
+  f_000_110_101_101_1(uniques, 11);
+  f_000_110_101_111_0(uniques, 11);
+  f_000_110_101_111_1(uniques, 11);
+  f_000_110_110_001_0(uniques, 11);
+  f_000_110_110_001_1(uniques, 11);
+  f_000_110_110_011_0(uniques, 11);
+  f_000_110_110_011_1(uniques, 11);
+  f_000_110_110_101_0(uniques, 11);
+  f_000_110_110_101_1(uniques, 11);
+  f_000_110_110_111_0(uniques, 11);
+  f_000_110_110_111_1(uniques, 11);
+  f_000_110_111_001_0(uniques, 11);
+  f_000_110_111_001_1(uniques, 11);
+  f_000_110_111_011_0(uniques, 11);
+  f_000_110_111_011_1(uniques, 11);
+  f_000_110_111_101_0(uniques, 11);
+  f_000_110_111_101_1(uniques, 11);
+  f_000_110_111_111_0(uniques, 11);
+  f_000_110_111_111_1(uniques, 11);
+  f_000_111_000_001_0(uniques, 11);
+  f_000_111_000_001_1(uniques, 11);
+  f_000_111_000_011_0(uniques, 11);
+  f_000_111_000_011_1(uniques, 11);
+  f_000_111_000_101_0(uniques, 11);
+  f_000_111_000_101_1(uniques, 11);
+  f_000_111_000_111_0(uniques, 11);
+  f_000_111_000_111_1(uniques, 11);
+  f_000_111_001_001_0(uniques, 11);
+  f_000_111_001_001_1(uniques, 11);
+  f_000_111_001_011_0(uniques, 11);
+  f_000_111_001_011_1(uniques, 11);
+  f_000_111_001_101_0(uniques, 11);
+  f_000_111_001_101_1(uniques, 11);
+  f_000_111_001_111_0(uniques, 11);
+  f_000_111_001_111_1(uniques, 11);
+  f_000_111_010_001_0(uniques, 11);
+  f_000_111_010_001_1(uniques, 11);
+  f_000_111_010_011_0(uniques, 11);
+  f_000_111_010_011_1(uniques, 11);
+  f_000_111_010_101_0(uniques, 11);
+  f_000_111_010_101_1(uniques, 11);
+  f_000_111_010_111_0(uniques, 11);
+  f_000_111_010_111_1(uniques, 11);
+  f_000_111_011_001_0(uniques, 11);
+  f_000_111_011_001_1(uniques, 11);
+  f_000_111_011_011_0(uniques, 11);
+  f_000_111_011_011_1(uniques, 11);
+  f_000_111_011_101_0(uniques, 11);
+  f_000_111_011_101_1(uniques, 11);
+  f_000_111_011_111_0(uniques, 11);
+  f_000_111_011_111_1(uniques, 11);
+  f_000_111_100_001_0(uniques, 11);
+  f_000_111_100_001_1(uniques, 11);
+  f_000_111_100_011_0(uniques, 11);
+  f_000_111_100_011_1(uniques, 11);
+  f_000_111_100_101_0(uniques, 11);
+  f_000_111_100_101_1(uniques, 11);
+  f_000_111_100_111_0(uniques, 11);
+  f_000_111_100_111_1(uniques, 11);
+  f_000_111_101_001_0(uniques, 11);
+  f_000_111_101_001_1(uniques, 11);
+  f_000_111_101_011_0(uniques, 11);
+  f_000_111_101_011_1(uniques, 11);
+  f_000_111_101_101_0(uniques, 11);
+  f_000_111_101_101_1(uniques, 11);
+  f_000_111_101_111_0(uniques, 11);
+  f_000_111_101_111_1(uniques, 11);
+  f_000_111_110_001_0(uniques, 11);
+  f_000_111_110_001_1(uniques, 11);
+  f_000_111_110_011_0(uniques, 11);
+  f_000_111_110_011_1(uniques, 11);
+  f_000_111_110_101_0(uniques, 11);
+  f_000_111_110_101_1(uniques, 11);
+  f_000_111_110_111_0(uniques, 11);
+  f_000_111_110_111_1(uniques, 11);
+  f_000_111_111_001_0(uniques, 11);
+  f_000_111_111_001_1(uniques, 11);
+  f_000_111_111_011_0(uniques, 11);
+  f_000_111_111_011_1(uniques, 11);
+  f_000_111_111_101_0(uniques, 11);
+  f_000_111_111_101_1(uniques, 11);
+  f_000_111_111_111_0(uniques, 11);
+  f_000_111_111_111_1(uniques, 11);
+  f_001_000_000_001_0(uniques, 11);
+  f_001_000_000_001_1(uniques, 11);
+  f_001_000_000_011_0(uniques, 11);
+  f_001_000_000_011_1(uniques, 11);
+  f_001_000_000_101_0(uniques, 11);
+  f_001_000_000_101_1(uniques, 11);
+  f_001_000_000_111_0(uniques, 11);
+  f_001_000_000_111_1(uniques, 11);
+  f_001_000_001_001_0(uniques, 11);
+  f_001_000_001_001_1(uniques, 11);
+  f_001_000_001_011_0(uniques, 11);
+  f_001_000_001_011_1(uniques, 11);
+  f_001_000_001_101_0(uniques, 11);
+  f_001_000_001_101_1(uniques, 11);
+  f_001_000_001_111_0(uniques, 11);
+  f_001_000_001_111_1(uniques, 11);
+  f_001_000_010_001_0(uniques, 11);
+  f_001_000_010_001_1(uniques, 11);
+  f_001_000_010_011_0(uniques, 11);
+  f_001_000_010_011_1(uniques, 11);
+  f_001_000_010_101_0(uniques, 11);
+  f_001_000_010_101_1(uniques, 11);
+  f_001_000_010_111_0(uniques, 11);
+  f_001_000_010_111_1(uniques, 11);
+  f_001_000_011_001_0(uniques, 11);
+  f_001_000_011_001_1(uniques, 11);
+  f_001_000_011_011_0(uniques, 11);
+  f_001_000_011_011_1(uniques, 11);
+  f_001_000_011_101_0(uniques, 11);
+  f_001_000_011_101_1(uniques, 11);
+  f_001_000_011_111_0(uniques, 11);
+  f_001_000_011_111_1(uniques, 11);
+  f_001_000_100_001_0(uniques, 11);
+  f_001_000_100_001_1(uniques, 11);
+  f_001_000_100_011_0(uniques, 11);
+  f_001_000_100_011_1(uniques, 11);
+  f_001_000_100_101_0(uniques, 11);
+  f_001_000_100_101_1(uniques, 11);
+  f_001_000_100_111_0(uniques, 11);
+  f_001_000_100_111_1(uniques, 11);
+  f_001_000_101_001_0(uniques, 11);
+  f_001_000_101_001_1(uniques, 11);
+  f_001_000_101_011_0(uniques, 11);
+  f_001_000_101_011_1(uniques, 11);
+  f_001_000_101_101_0(uniques, 11);
+  f_001_000_101_101_1(uniques, 11);
+  f_001_000_101_111_0(uniques, 11);
+  f_001_000_101_111_1(uniques, 11);
+  f_001_000_110_001_0(uniques, 11);
+  f_001_000_110_001_1(uniques, 11);
+  f_001_000_110_011_0(uniques, 11);
+  f_001_000_110_011_1(uniques, 11);
+  f_001_000_110_101_0(uniques, 11);
+  f_001_000_110_101_1(uniques, 11);
+  f_001_000_110_111_0(uniques, 11);
+  f_001_000_110_111_1(uniques, 11);
+  f_001_000_111_001_0(uniques, 11);
+  f_001_000_111_001_1(uniques, 11);
+  f_001_000_111_011_0(uniques, 11);
+  f_001_000_111_011_1(uniques, 11);
+  f_001_000_111_101_0(uniques, 11);
+  f_001_000_111_101_1(uniques, 11);
+  f_001_000_111_111_0(uniques, 11);
+  f_001_000_111_111_1(uniques, 11);
+  f_001_001_000_001_0(uniques, 11);
+  f_001_001_000_001_1(uniques, 11);
+  f_001_001_000_011_0(uniques, 11);
+  f_001_001_000_011_1(uniques, 11);
+  f_001_001_000_101_0(uniques, 11);
+  f_001_001_000_101_1(uniques, 11);
+  f_001_001_000_111_0(uniques, 11);
+  f_001_001_000_111_1(uniques, 11);
+  f_001_001_001_001_0(uniques, 11);
+  f_001_001_001_001_1(uniques, 11);
+  f_001_001_001_011_0(uniques, 11);
+  f_001_001_001_011_1(uniques, 11);
+  f_001_001_001_101_0(uniques, 11);
+  f_001_001_001_101_1(uniques, 11);
+  f_001_001_001_111_0(uniques, 11);
+  f_001_001_001_111_1(uniques, 11);
+  f_001_001_010_001_0(uniques, 11);
+  f_001_001_010_001_1(uniques, 11);
+  f_001_001_010_011_0(uniques, 11);
+  f_001_001_010_011_1(uniques, 11);
+  f_001_001_010_101_0(uniques, 11);
+  f_001_001_010_101_1(uniques, 11);
+  f_001_001_010_111_0(uniques, 11);
+  f_001_001_010_111_1(uniques, 11);
+  f_001_001_011_001_0(uniques, 11);
+  f_001_001_011_001_1(uniques, 11);
+  f_001_001_011_011_0(uniques, 11);
+  f_001_001_011_011_1(uniques, 11);
+  f_001_001_011_101_0(uniques, 11);
+  f_001_001_011_101_1(uniques, 11);
+  f_001_001_011_111_0(uniques, 11);
+  f_001_001_011_111_1(uniques, 11);
+  f_001_001_100_001_0(uniques, 11);
+  f_001_001_100_001_1(uniques, 11);
+  f_001_001_100_011_0(uniques, 11);
+  f_001_001_100_011_1(uniques, 11);
+  f_001_001_100_101_0(uniques, 11);
+  f_001_001_100_101_1(uniques, 11);
+  f_001_001_100_111_0(uniques, 11);
+  f_001_001_100_111_1(uniques, 11);
+  f_001_001_101_001_0(uniques, 11);
+  f_001_001_101_001_1(uniques, 11);
+  f_001_001_101_011_0(uniques, 11);
+  f_001_001_101_011_1(uniques, 11);
+  f_001_001_101_101_0(uniques, 11);
+  f_001_001_101_101_1(uniques, 11);
+  f_001_001_101_111_0(uniques, 11);
+  f_001_001_101_111_1(uniques, 11);
+  f_001_001_110_001_0(uniques, 11);
+  f_001_001_110_001_1(uniques, 11);
+  f_001_001_110_011_0(uniques, 11);
+  f_001_001_110_011_1(uniques, 11);
+  f_001_001_110_101_0(uniques, 11);
+  f_001_001_110_101_1(uniques, 11);
+  f_001_001_110_111_0(uniques, 11);
+  f_001_001_110_111_1(uniques, 11);
+  f_001_001_111_001_0(uniques, 11);
+  f_001_001_111_001_1(uniques, 11);
+  f_001_001_111_011_0(uniques, 11);
+  f_001_001_111_011_1(uniques, 11);
+  f_001_001_111_101_0(uniques, 11);
+  f_001_001_111_101_1(uniques, 11);
+  f_001_001_111_111_0(uniques, 11);
+  f_001_001_111_111_1(uniques, 11);
+  f_001_010_000_001_0(uniques, 11);
+  f_001_010_000_001_1(uniques, 11);
+  f_001_010_000_011_0(uniques, 11);
+  f_001_010_000_011_1(uniques, 11);
+  f_001_010_000_101_0(uniques, 11);
+  f_001_010_000_101_1(uniques, 11);
+  f_001_010_000_111_0(uniques, 11);
+  f_001_010_000_111_1(uniques, 11);
+  f_001_010_001_001_0(uniques, 11);
+  f_001_010_001_001_1(uniques, 11);
+  f_001_010_001_011_0(uniques, 11);
+  f_001_010_001_011_1(uniques, 11);
+  f_001_010_001_101_0(uniques, 11);
+  f_001_010_001_101_1(uniques, 11);
+  f_001_010_001_111_0(uniques, 11);
+  f_001_010_001_111_1(uniques, 11);
+  f_001_010_010_001_0(uniques, 11);
+  f_001_010_010_001_1(uniques, 11);
+  f_001_010_010_011_0(uniques, 11);
+  f_001_010_010_011_1(uniques, 11);
+  f_001_010_010_101_0(uniques, 11);
+  f_001_010_010_101_1(uniques, 11);
+  f_001_010_010_111_0(uniques, 11);
+  f_001_010_010_111_1(uniques, 11);
+  f_001_010_011_001_0(uniques, 11);
+  f_001_010_011_001_1(uniques, 11);
+  f_001_010_011_011_0(uniques, 11);
+  f_001_010_011_011_1(uniques, 11);
+  f_001_010_011_101_0(uniques, 11);
+  f_001_010_011_101_1(uniques, 11);
+  f_001_010_011_111_0(uniques, 11);
+  f_001_010_011_111_1(uniques, 11);
+  f_001_010_100_001_0(uniques, 11);
+  f_001_010_100_001_1(uniques, 11);
+  f_001_010_100_011_0(uniques, 11);
+  f_001_010_100_011_1(uniques, 11);
+  f_001_010_100_101_0(uniques, 11);
+  f_001_010_100_101_1(uniques, 11);
+  f_001_010_100_111_0(uniques, 11);
+  f_001_010_100_111_1(uniques, 11);
+  f_001_010_101_001_0(uniques, 11);
+  f_001_010_101_001_1(uniques, 11);
+  f_001_010_101_011_0(uniques, 11);
+  f_001_010_101_011_1(uniques, 11);
+  f_001_010_101_101_0(uniques, 11);
+  f_001_010_101_101_1(uniques, 11);
+  f_001_010_101_111_0(uniques, 11);
+  f_001_010_101_111_1(uniques, 11);
+  f_001_010_110_001_0(uniques, 11);
+  f_001_010_110_001_1(uniques, 11);
+  f_001_010_110_011_0(uniques, 11);
+  f_001_010_110_011_1(uniques, 11);
+  f_001_010_110_101_0(uniques, 11);
+  f_001_010_110_101_1(uniques, 11);
+  f_001_010_110_111_0(uniques, 11);
+  f_001_010_110_111_1(uniques, 11);
+  f_001_010_111_001_0(uniques, 11);
+  f_001_010_111_001_1(uniques, 11);
+  f_001_010_111_011_0(uniques, 11);
+  f_001_010_111_011_1(uniques, 11);
+  f_001_010_111_101_0(uniques, 11);
+  f_001_010_111_101_1(uniques, 11);
+  f_001_010_111_111_0(uniques, 11);
+  f_001_010_111_111_1(uniques, 11);
+  f_001_011_000_001_0(uniques, 11);
+  f_001_011_000_001_1(uniques, 11);
+  f_001_011_000_011_0(uniques, 11);
+  f_001_011_000_011_1(uniques, 11);
+  f_001_011_000_101_0(uniques, 11);
+  f_001_011_000_101_1(uniques, 11);
+  f_001_011_000_111_0(uniques, 11);
+  f_001_011_000_111_1(uniques, 11);
+  f_001_011_001_001_0(uniques, 11);
+  f_001_011_001_001_1(uniques, 11);
+  f_001_011_001_011_0(uniques, 11);
+  f_001_011_001_011_1(uniques, 11);
+  f_001_011_001_101_0(uniques, 11);
+  f_001_011_001_101_1(uniques, 11);
+  f_001_011_001_111_0(uniques, 11);
+  f_001_011_001_111_1(uniques, 11);
+  f_001_011_010_001_0(uniques, 11);
+  f_001_011_010_001_1(uniques, 11);
+  f_001_011_010_011_0(uniques, 11);
+  f_001_011_010_011_1(uniques, 11);
+  f_001_011_010_101_0(uniques, 11);
+  f_001_011_010_101_1(uniques, 11);
+  f_001_011_010_111_0(uniques, 11);
+  f_001_011_010_111_1(uniques, 11);
+  f_001_011_011_001_0(uniques, 11);
+  f_001_011_011_001_1(uniques, 11);
+  f_001_011_011_011_0(uniques, 11);
+  f_001_011_011_011_1(uniques, 11);
+  f_001_011_011_101_0(uniques, 11);
+  f_001_011_011_101_1(uniques, 11);
+  f_001_011_011_111_0(uniques, 11);
+  f_001_011_011_111_1(uniques, 11);
+  f_001_011_100_001_0(uniques, 11);
+  f_001_011_100_001_1(uniques, 11);
+  f_001_011_100_011_0(uniques, 11);
+  f_001_011_100_011_1(uniques, 11);
+  f_001_011_100_101_0(uniques, 11);
+  f_001_011_100_101_1(uniques, 11);
+  f_001_011_100_111_0(uniques, 11);
+  f_001_011_100_111_1(uniques, 11);
+  f_001_011_101_001_0(uniques, 11);
+  f_001_011_101_001_1(uniques, 11);
+  f_001_011_101_011_0(uniques, 11);
+  f_001_011_101_011_1(uniques, 11);
+  f_001_011_101_101_0(uniques, 11);
+  f_001_011_101_101_1(uniques, 11);
+  f_001_011_101_111_0(uniques, 11);
+  f_001_011_101_111_1(uniques, 11);
+  f_001_011_110_001_0(uniques, 11);
+  f_001_011_110_001_1(uniques, 11);
+  f_001_011_110_011_0(uniques, 11);
+  f_001_011_110_011_1(uniques, 11);
+  f_001_011_110_101_0(uniques, 11);
+  f_001_011_110_101_1(uniques, 11);
+  f_001_011_110_111_0(uniques, 11);
+  f_001_011_110_111_1(uniques, 11);
+  f_001_011_111_001_0(uniques, 11);
+  f_001_011_111_001_1(uniques, 11);
+  f_001_011_111_011_0(uniques, 11);
+  f_001_011_111_011_1(uniques, 11);
+  f_001_011_111_101_0(uniques, 11);
+  f_001_011_111_101_1(uniques, 11);
+  f_001_011_111_111_0(uniques, 11);
+  f_001_011_111_111_1(uniques, 11);
+  f_001_100_000_001_0(uniques, 11);
+  f_001_100_000_001_1(uniques, 11);
+  f_001_100_000_011_0(uniques, 11);
+  f_001_100_000_011_1(uniques, 11);
+  f_001_100_000_101_0(uniques, 11);
+  f_001_100_000_101_1(uniques, 11);
+  f_001_100_000_111_0(uniques, 11);
+  f_001_100_000_111_1(uniques, 11);
+  f_001_100_001_001_0(uniques, 11);
+  f_001_100_001_001_1(uniques, 11);
+  f_001_100_001_011_0(uniques, 11);
+  f_001_100_001_011_1(uniques, 11);
+  f_001_100_001_101_0(uniques, 11);
+  f_001_100_001_101_1(uniques, 11);
+  f_001_100_001_111_0(uniques, 11);
+  f_001_100_001_111_1(uniques, 11);
+  f_001_100_010_001_0(uniques, 11);
+  f_001_100_010_001_1(uniques, 11);
+  f_001_100_010_011_0(uniques, 11);
+  f_001_100_010_011_1(uniques, 11);
+  f_001_100_010_101_0(uniques, 11);
+  f_001_100_010_101_1(uniques, 11);
+  f_001_100_010_111_0(uniques, 11);
+  f_001_100_010_111_1(uniques, 11);
+  f_001_100_011_001_0(uniques, 11);
+  f_001_100_011_001_1(uniques, 11);
+  f_001_100_011_011_0(uniques, 11);
+  f_001_100_011_011_1(uniques, 11);
+  f_001_100_011_101_0(uniques, 11);
+  f_001_100_011_101_1(uniques, 11);
+  f_001_100_011_111_0(uniques, 11);
+  f_001_100_011_111_1(uniques, 11);
+  f_001_100_100_001_0(uniques, 11);
+  f_001_100_100_001_1(uniques, 11);
+  f_001_100_100_011_0(uniques, 11);
+  f_001_100_100_011_1(uniques, 11);
+  f_001_100_100_101_0(uniques, 11);
+  f_001_100_100_101_1(uniques, 11);
+  f_001_100_100_111_0(uniques, 11);
+  f_001_100_100_111_1(uniques, 11);
+  f_001_100_101_001_0(uniques, 11);
+  f_001_100_101_001_1(uniques, 11);
+  f_001_100_101_011_0(uniques, 11);
+  f_001_100_101_011_1(uniques, 11);
+  f_001_100_101_101_0(uniques, 11);
+  f_001_100_101_101_1(uniques, 11);
+  f_001_100_101_111_0(uniques, 11);
+  f_001_100_101_111_1(uniques, 11);
+  f_001_100_110_001_0(uniques, 11);
+  f_001_100_110_001_1(uniques, 11);
+  f_001_100_110_011_0(uniques, 11);
+  f_001_100_110_011_1(uniques, 11);
+  f_001_100_110_101_0(uniques, 11);
+  f_001_100_110_101_1(uniques, 11);
+  f_001_100_110_111_0(uniques, 11);
+  f_001_100_110_111_1(uniques, 11);
+  f_001_100_111_001_0(uniques, 11);
+  f_001_100_111_001_1(uniques, 11);
+  f_001_100_111_011_0(uniques, 11);
+  f_001_100_111_011_1(uniques, 11);
+  f_001_100_111_101_0(uniques, 11);
+  f_001_100_111_101_1(uniques, 11);
+  f_001_100_111_111_0(uniques, 11);
+  f_001_100_111_111_1(uniques, 11);
+  f_001_101_000_001_0(uniques, 11);
+  f_001_101_000_001_1(uniques, 11);
+  f_001_101_000_011_0(uniques, 11);
+  f_001_101_000_011_1(uniques, 11);
+  f_001_101_000_101_0(uniques, 11);
+  f_001_101_000_101_1(uniques, 11);
+  f_001_101_000_111_0(uniques, 11);
+  f_001_101_000_111_1(uniques, 11);
+  f_001_101_001_001_0(uniques, 11);
+  f_001_101_001_001_1(uniques, 11);
+  f_001_101_001_011_0(uniques, 11);
+  f_001_101_001_011_1(uniques, 11);
+  f_001_101_001_101_0(uniques, 11);
+  f_001_101_001_101_1(uniques, 11);
+  f_001_101_001_111_0(uniques, 11);
+  f_001_101_001_111_1(uniques, 11);
+  f_001_101_010_001_0(uniques, 11);
+  f_001_101_010_001_1(uniques, 11);
+  f_001_101_010_011_0(uniques, 11);
+  f_001_101_010_011_1(uniques, 11);
+  f_001_101_010_101_0(uniques, 11);
+  f_001_101_010_101_1(uniques, 11);
+  f_001_101_010_111_0(uniques, 11);
+  f_001_101_010_111_1(uniques, 11);
+  f_001_101_011_001_0(uniques, 11);
+  f_001_101_011_001_1(uniques, 11);
+  f_001_101_011_011_0(uniques, 11);
+  f_001_101_011_011_1(uniques, 11);
+  f_001_101_011_101_0(uniques, 11);
+  f_001_101_011_101_1(uniques, 11);
+  f_001_101_011_111_0(uniques, 11);
+  f_001_101_011_111_1(uniques, 11);
+  f_001_101_100_001_0(uniques, 11);
+  f_001_101_100_001_1(uniques, 11);
+  f_001_101_100_011_0(uniques, 11);
+  f_001_101_100_011_1(uniques, 11);
+  f_001_101_100_101_0(uniques, 11);
+  f_001_101_100_101_1(uniques, 11);
+  f_001_101_100_111_0(uniques, 11);
+  f_001_101_100_111_1(uniques, 11);
+  f_001_101_101_001_0(uniques, 11);
+  f_001_101_101_001_1(uniques, 11);
+  f_001_101_101_011_0(uniques, 11);
+  f_001_101_101_011_1(uniques, 11);
+  f_001_101_101_101_0(uniques, 11);
+  f_001_101_101_101_1(uniques, 11);
+  f_001_101_101_111_0(uniques, 11);
+  f_001_101_101_111_1(uniques, 11);
+  f_001_101_110_001_0(uniques, 11);
+  f_001_101_110_001_1(uniques, 11);
+  f_001_101_110_011_0(uniques, 11);
+  f_001_101_110_011_1(uniques, 11);
+  f_001_101_110_101_0(uniques, 11);
+  f_001_101_110_101_1(uniques, 11);
+  f_001_101_110_111_0(uniques, 11);
+  f_001_101_110_111_1(uniques, 11);
+  f_001_101_111_001_0(uniques, 11);
+  f_001_101_111_001_1(uniques, 11);
+  f_001_101_111_011_0(uniques, 11);
+  f_001_101_111_011_1(uniques, 11);
+  f_001_101_111_101_0(uniques, 11);
+  f_001_101_111_101_1(uniques, 11);
+  f_001_101_111_111_0(uniques, 11);
+  f_001_101_111_111_1(uniques, 11);
+  f_001_110_000_001_0(uniques, 11);
+  f_001_110_000_001_1(uniques, 11);
+  f_001_110_000_011_0(uniques, 11);
+  f_001_110_000_011_1(uniques, 11);
+  f_001_110_000_101_0(uniques, 11);
+  f_001_110_000_101_1(uniques, 11);
+  f_001_110_000_111_0(uniques, 11);
+  f_001_110_000_111_1(uniques, 11);
+  f_001_110_001_001_0(uniques, 11);
+  f_001_110_001_001_1(uniques, 11);
+  f_001_110_001_011_0(uniques, 11);
+  f_001_110_001_011_1(uniques, 11);
+  f_001_110_001_101_0(uniques, 11);
+  f_001_110_001_101_1(uniques, 11);
+  f_001_110_001_111_0(uniques, 11);
+  f_001_110_001_111_1(uniques, 11);
+  f_001_110_010_001_0(uniques, 11);
+  f_001_110_010_001_1(uniques, 11);
+  f_001_110_010_011_0(uniques, 11);
+  f_001_110_010_011_1(uniques, 11);
+  f_001_110_010_101_0(uniques, 11);
+  f_001_110_010_101_1(uniques, 11);
+  f_001_110_010_111_0(uniques, 11);
+  f_001_110_010_111_1(uniques, 11);
+  f_001_110_011_001_0(uniques, 11);
+  f_001_110_011_001_1(uniques, 11);
+  f_001_110_011_011_0(uniques, 11);
+  f_001_110_011_011_1(uniques, 11);
+  f_001_110_011_101_0(uniques, 11);
+  f_001_110_011_101_1(uniques, 11);
+  f_001_110_011_111_0(uniques, 11);
+  f_001_110_011_111_1(uniques, 11);
+  f_001_110_100_001_0(uniques, 11);
+  f_001_110_100_001_1(uniques, 11);
+  f_001_110_100_011_0(uniques, 11);
+  f_001_110_100_011_1(uniques, 11);
+  f_001_110_100_101_0(uniques, 11);
+  f_001_110_100_101_1(uniques, 11);
+  f_001_110_100_111_0(uniques, 11);
+  f_001_110_100_111_1(uniques, 11);
+  f_001_110_101_001_0(uniques, 11);
+  f_001_110_101_001_1(uniques, 11);
+  f_001_110_101_011_0(uniques, 11);
+  f_001_110_101_011_1(uniques, 11);
+  f_001_110_101_101_0(uniques, 11);
+  f_001_110_101_101_1(uniques, 11);
+  f_001_110_101_111_0(uniques, 11);
+  f_001_110_101_111_1(uniques, 11);
+  f_001_110_110_001_0(uniques, 11);
+  f_001_110_110_001_1(uniques, 11);
+  f_001_110_110_011_0(uniques, 11);
+  f_001_110_110_011_1(uniques, 11);
+  f_001_110_110_101_0(uniques, 11);
+  f_001_110_110_101_1(uniques, 11);
+  f_001_110_110_111_0(uniques, 11);
+  f_001_110_110_111_1(uniques, 11);
+  f_001_110_111_001_0(uniques, 11);
+  f_001_110_111_001_1(uniques, 11);
+  f_001_110_111_011_0(uniques, 11);
+  f_001_110_111_011_1(uniques, 11);
+  f_001_110_111_101_0(uniques, 11);
+  f_001_110_111_101_1(uniques, 11);
+  f_001_110_111_111_0(uniques, 11);
+  f_001_110_111_111_1(uniques, 11);
+  f_001_111_000_001_0(uniques, 11);
+  f_001_111_000_001_1(uniques, 11);
+  f_001_111_000_011_0(uniques, 11);
+  f_001_111_000_011_1(uniques, 11);
+  f_001_111_000_101_0(uniques, 11);
+  f_001_111_000_101_1(uniques, 11);
+  f_001_111_000_111_0(uniques, 11);
+  f_001_111_000_111_1(uniques, 11);
+  f_001_111_001_001_0(uniques, 11);
+  f_001_111_001_001_1(uniques, 11);
+  f_001_111_001_011_0(uniques, 11);
+  f_001_111_001_011_1(uniques, 11);
+  f_001_111_001_101_0(uniques, 11);
+  f_001_111_001_101_1(uniques, 11);
+  f_001_111_001_111_0(uniques, 11);
+  f_001_111_001_111_1(uniques, 11);
+  f_001_111_010_001_0(uniques, 11);
+  f_001_111_010_001_1(uniques, 11);
+  f_001_111_010_011_0(uniques, 11);
+  f_001_111_010_011_1(uniques, 11);
+  f_001_111_010_101_0(uniques, 11);
+  f_001_111_010_101_1(uniques, 11);
+  f_001_111_010_111_0(uniques, 11);
+  f_001_111_010_111_1(uniques, 11);
+  f_001_111_011_001_0(uniques, 11);
+  f_001_111_011_001_1(uniques, 11);
+  f_001_111_011_011_0(uniques, 11);
+  f_001_111_011_011_1(uniques, 11);
+  f_001_111_011_101_0(uniques, 11);
+  f_001_111_011_101_1(uniques, 11);
+  f_001_111_011_111_0(uniques, 11);
+  f_001_111_011_111_1(uniques, 11);
+  f_001_111_100_001_0(uniques, 11);
+  f_001_111_100_001_1(uniques, 11);
+  f_001_111_100_011_0(uniques, 11);
+  f_001_111_100_011_1(uniques, 11);
+  f_001_111_100_101_0(uniques, 11);
+  f_001_111_100_101_1(uniques, 11);
+  f_001_111_100_111_0(uniques, 11);
+  f_001_111_100_111_1(uniques, 11);
+  f_001_111_101_001_0(uniques, 11);
+  f_001_111_101_001_1(uniques, 11);
+  f_001_111_101_011_0(uniques, 11);
+  f_001_111_101_011_1(uniques, 11);
+  f_001_111_101_101_0(uniques, 11);
+  f_001_111_101_101_1(uniques, 11);
+  f_001_111_101_111_0(uniques, 11);
+  f_001_111_101_111_1(uniques, 11);
+  f_001_111_110_001_0(uniques, 11);
+  f_001_111_110_001_1(uniques, 11);
+  f_001_111_110_011_0(uniques, 11);
+  f_001_111_110_011_1(uniques, 11);
+  f_001_111_110_101_0(uniques, 11);
+  f_001_111_110_101_1(uniques, 11);
+  f_001_111_110_111_0(uniques, 11);
+  f_001_111_110_111_1(uniques, 11);
+  f_001_111_111_001_0(uniques, 11);
+  f_001_111_111_001_1(uniques, 11);
+  f_001_111_111_011_0(uniques, 11);
+  f_001_111_111_011_1(uniques, 11);
+  f_001_111_111_101_0(uniques, 11);
+  f_001_111_111_101_1(uniques, 11);
+  f_001_111_111_111_0(uniques, 11);
+  f_001_111_111_111_1(uniques, 11);
+  f_010_000_000_001_0(uniques, 11);
+  f_010_000_000_001_1(uniques, 11);
+  f_010_000_000_011_0(uniques, 11);
+  f_010_000_000_011_1(uniques, 11);
+  f_010_000_000_101_0(uniques, 11);
+  f_010_000_000_101_1(uniques, 11);
+  f_010_000_000_111_0(uniques, 11);
+  f_010_000_000_111_1(uniques, 11);
+  f_010_000_001_001_0(uniques, 11);
+  f_010_000_001_001_1(uniques, 11);
+  f_010_000_001_011_0(uniques, 11);
+  f_010_000_001_011_1(uniques, 11);
+  f_010_000_001_101_0(uniques, 11);
+  f_010_000_001_101_1(uniques, 11);
+  f_010_000_001_111_0(uniques, 11);
+  f_010_000_001_111_1(uniques, 11);
+  f_010_000_010_001_0(uniques, 11);
+  f_010_000_010_001_1(uniques, 11);
+  f_010_000_010_011_0(uniques, 11);
+  f_010_000_010_011_1(uniques, 11);
+  f_010_000_010_101_0(uniques, 11);
+  f_010_000_010_101_1(uniques, 11);
+  f_010_000_010_111_0(uniques, 11);
+  f_010_000_010_111_1(uniques, 11);
+  f_010_000_011_001_0(uniques, 11);
+  f_010_000_011_001_1(uniques, 11);
+  f_010_000_011_011_0(uniques, 11);
+  f_010_000_011_011_1(uniques, 11);
+  f_010_000_011_101_0(uniques, 11);
+  f_010_000_011_101_1(uniques, 11);
+  f_010_000_011_111_0(uniques, 11);
+  f_010_000_011_111_1(uniques, 11);
+  f_010_000_100_001_0(uniques, 11);
+  f_010_000_100_001_1(uniques, 11);
+  f_010_000_100_011_0(uniques, 11);
+  f_010_000_100_011_1(uniques, 11);
+  f_010_000_100_101_0(uniques, 11);
+  f_010_000_100_101_1(uniques, 11);
+  f_010_000_100_111_0(uniques, 11);
+  f_010_000_100_111_1(uniques, 11);
+  f_010_000_101_001_0(uniques, 11);
+  f_010_000_101_001_1(uniques, 11);
+  f_010_000_101_011_0(uniques, 11);
+  f_010_000_101_011_1(uniques, 11);
+  f_010_000_101_101_0(uniques, 11);
+  f_010_000_101_101_1(uniques, 11);
+  f_010_000_101_111_0(uniques, 11);
+  f_010_000_101_111_1(uniques, 11);
+  f_010_000_110_001_0(uniques, 11);
+  f_010_000_110_001_1(uniques, 11);
+  f_010_000_110_011_0(uniques, 11);
+  f_010_000_110_011_1(uniques, 11);
+  f_010_000_110_101_0(uniques, 11);
+  f_010_000_110_101_1(uniques, 11);
+  f_010_000_110_111_0(uniques, 11);
+  f_010_000_110_111_1(uniques, 11);
+  f_010_000_111_001_0(uniques, 11);
+  f_010_000_111_001_1(uniques, 11);
+  f_010_000_111_011_0(uniques, 11);
+  f_010_000_111_011_1(uniques, 11);
+  f_010_000_111_101_0(uniques, 11);
+  f_010_000_111_101_1(uniques, 11);
+  f_010_000_111_111_0(uniques, 11);
+  f_010_000_111_111_1(uniques, 11);
+  f_010_001_000_001_0(uniques, 11);
+  f_010_001_000_001_1(uniques, 11);
+  f_010_001_000_011_0(uniques, 11);
+  f_010_001_000_011_1(uniques, 11);
+  f_010_001_000_101_0(uniques, 11);
+  f_010_001_000_101_1(uniques, 11);
+  f_010_001_000_111_0(uniques, 11);
+  f_010_001_000_111_1(uniques, 11);
+  f_010_001_001_001_0(uniques, 11);
+  f_010_001_001_001_1(uniques, 11);
+  f_010_001_001_011_0(uniques, 11);
+  f_010_001_001_011_1(uniques, 11);
+  f_010_001_001_101_0(uniques, 11);
+  f_010_001_001_101_1(uniques, 11);
+  f_010_001_001_111_0(uniques, 11);
+  f_010_001_001_111_1(uniques, 11);
+  f_010_001_010_001_0(uniques, 11);
+  f_010_001_010_001_1(uniques, 11);
+  f_010_001_010_011_0(uniques, 11);
+  f_010_001_010_011_1(uniques, 11);
+  f_010_001_010_101_0(uniques, 11);
+  f_010_001_010_101_1(uniques, 11);
+  f_010_001_010_111_0(uniques, 11);
+  f_010_001_010_111_1(uniques, 11);
+  f_010_001_011_001_0(uniques, 11);
+  f_010_001_011_001_1(uniques, 11);
+  f_010_001_011_011_0(uniques, 11);
+  f_010_001_011_011_1(uniques, 11);
+  f_010_001_011_101_0(uniques, 11);
+  f_010_001_011_101_1(uniques, 11);
+  f_010_001_011_111_0(uniques, 11);
+  f_010_001_011_111_1(uniques, 11);
+  f_010_001_100_001_0(uniques, 11);
+  f_010_001_100_001_1(uniques, 11);
+  f_010_001_100_011_0(uniques, 11);
+  f_010_001_100_011_1(uniques, 11);
+  f_010_001_100_101_0(uniques, 11);
+  f_010_001_100_101_1(uniques, 11);
+  f_010_001_100_111_0(uniques, 11);
+  f_010_001_100_111_1(uniques, 11);
+  f_010_001_101_001_0(uniques, 11);
+  f_010_001_101_001_1(uniques, 11);
+  f_010_001_101_011_0(uniques, 11);
+  f_010_001_101_011_1(uniques, 11);
+  f_010_001_101_101_0(uniques, 11);
+  f_010_001_101_101_1(uniques, 11);
+  f_010_001_101_111_0(uniques, 11);
+  f_010_001_101_111_1(uniques, 11);
+  f_010_001_110_001_0(uniques, 11);
+  f_010_001_110_001_1(uniques, 11);
+  f_010_001_110_011_0(uniques, 11);
+  f_010_001_110_011_1(uniques, 11);
+  f_010_001_110_101_0(uniques, 11);
+  f_010_001_110_101_1(uniques, 11);
+  f_010_001_110_111_0(uniques, 11);
+  f_010_001_110_111_1(uniques, 11);
+  f_010_001_111_001_0(uniques, 11);
+  f_010_001_111_001_1(uniques, 11);
+  f_010_001_111_011_0(uniques, 11);
+  f_010_001_111_011_1(uniques, 11);
+  f_010_001_111_101_0(uniques, 11);
+  f_010_001_111_101_1(uniques, 11);
+  f_010_001_111_111_0(uniques, 11);
+  f_010_001_111_111_1(uniques, 11);
+  f_010_010_000_001_0(uniques, 11);
+  f_010_010_000_001_1(uniques, 11);
+  f_010_010_000_011_0(uniques, 11);
+  f_010_010_000_011_1(uniques, 11);
+  f_010_010_000_101_0(uniques, 11);
+  f_010_010_000_101_1(uniques, 11);
+  f_010_010_000_111_0(uniques, 11);
+  f_010_010_000_111_1(uniques, 11);
+  f_010_010_001_001_0(uniques, 11);
+  f_010_010_001_001_1(uniques, 11);
+  f_010_010_001_011_0(uniques, 11);
+  f_010_010_001_011_1(uniques, 11);
+  f_010_010_001_101_0(uniques, 11);
+  f_010_010_001_101_1(uniques, 11);
+  f_010_010_001_111_0(uniques, 11);
+  f_010_010_001_111_1(uniques, 11);
+  f_010_010_010_001_0(uniques, 11);
+  f_010_010_010_001_1(uniques, 11);
+  f_010_010_010_011_0(uniques, 11);
+  f_010_010_010_011_1(uniques, 11);
+  f_010_010_010_101_0(uniques, 11);
+  f_010_010_010_101_1(uniques, 11);
+  f_010_010_010_111_0(uniques, 11);
+  f_010_010_010_111_1(uniques, 11);
+  f_010_010_011_001_0(uniques, 11);
+  f_010_010_011_001_1(uniques, 11);
+  f_010_010_011_011_0(uniques, 11);
+  f_010_010_011_011_1(uniques, 11);
+  f_010_010_011_101_0(uniques, 11);
+  f_010_010_011_101_1(uniques, 11);
+  f_010_010_011_111_0(uniques, 11);
+  f_010_010_011_111_1(uniques, 11);
+  f_010_010_100_001_0(uniques, 11);
+  f_010_010_100_001_1(uniques, 11);
+  f_010_010_100_011_0(uniques, 11);
+  f_010_010_100_011_1(uniques, 11);
+  f_010_010_100_101_0(uniques, 11);
+  f_010_010_100_101_1(uniques, 11);
+  f_010_010_100_111_0(uniques, 11);
+  f_010_010_100_111_1(uniques, 11);
+  f_010_010_101_001_0(uniques, 11);
+  f_010_010_101_001_1(uniques, 11);
+  f_010_010_101_011_0(uniques, 11);
+  f_010_010_101_011_1(uniques, 11);
+  f_010_010_101_101_0(uniques, 11);
+  f_010_010_101_101_1(uniques, 11);
+  f_010_010_101_111_0(uniques, 11);
+  f_010_010_101_111_1(uniques, 11);
+  f_010_010_110_001_0(uniques, 11);
+  f_010_010_110_001_1(uniques, 11);
+  f_010_010_110_011_0(uniques, 11);
+  f_010_010_110_011_1(uniques, 11);
+  f_010_010_110_101_0(uniques, 11);
+  f_010_010_110_101_1(uniques, 11);
+  f_010_010_110_111_0(uniques, 11);
+  f_010_010_110_111_1(uniques, 11);
+  f_010_010_111_001_0(uniques, 11);
+  f_010_010_111_001_1(uniques, 11);
+  f_010_010_111_011_0(uniques, 11);
+  f_010_010_111_011_1(uniques, 11);
+  f_010_010_111_101_0(uniques, 11);
+  f_010_010_111_101_1(uniques, 11);
+  f_010_010_111_111_0(uniques, 11);
+  f_010_010_111_111_1(uniques, 11);
+  f_010_011_000_001_0(uniques, 11);
+  f_010_011_000_001_1(uniques, 11);
+  f_010_011_000_011_0(uniques, 11);
+  f_010_011_000_011_1(uniques, 11);
+  f_010_011_000_101_0(uniques, 11);
+  f_010_011_000_101_1(uniques, 11);
+  f_010_011_000_111_0(uniques, 11);
+  f_010_011_000_111_1(uniques, 11);
+  f_010_011_001_001_0(uniques, 11);
+  f_010_011_001_001_1(uniques, 11);
+  f_010_011_001_011_0(uniques, 11);
+  f_010_011_001_011_1(uniques, 11);
+  f_010_011_001_101_0(uniques, 11);
+  f_010_011_001_101_1(uniques, 11);
+  f_010_011_001_111_0(uniques, 11);
+  f_010_011_001_111_1(uniques, 11);
+  f_010_011_010_001_0(uniques, 11);
+  f_010_011_010_001_1(uniques, 11);
+  f_010_011_010_011_0(uniques, 11);
+  f_010_011_010_011_1(uniques, 11);
+  f_010_011_010_101_0(uniques, 11);
+  f_010_011_010_101_1(uniques, 11);
+  f_010_011_010_111_0(uniques, 11);
+  f_010_011_010_111_1(uniques, 11);
+  f_010_011_011_001_0(uniques, 11);
+  f_010_011_011_001_1(uniques, 11);
+  f_010_011_011_011_0(uniques, 11);
+  f_010_011_011_011_1(uniques, 11);
+  f_010_011_011_101_0(uniques, 11);
+  f_010_011_011_101_1(uniques, 11);
+  f_010_011_011_111_0(uniques, 11);
+  f_010_011_011_111_1(uniques, 11);
+  f_010_011_100_001_0(uniques, 11);
+  f_010_011_100_001_1(uniques, 11);
+  f_010_011_100_011_0(uniques, 11);
+  f_010_011_100_011_1(uniques, 11);
+  f_010_011_100_101_0(uniques, 11);
+  f_010_011_100_101_1(uniques, 11);
+  f_010_011_100_111_0(uniques, 11);
+  f_010_011_100_111_1(uniques, 11);
+  f_010_011_101_001_0(uniques, 11);
+  f_010_011_101_001_1(uniques, 11);
+  f_010_011_101_011_0(uniques, 11);
+  f_010_011_101_011_1(uniques, 11);
+  f_010_011_101_101_0(uniques, 11);
+  f_010_011_101_101_1(uniques, 11);
+  f_010_011_101_111_0(uniques, 11);
+  f_010_011_101_111_1(uniques, 11);
+  f_010_011_110_001_0(uniques, 11);
+  f_010_011_110_001_1(uniques, 11);
+  f_010_011_110_011_0(uniques, 11);
+  f_010_011_110_011_1(uniques, 11);
+  f_010_011_110_101_0(uniques, 11);
+  f_010_011_110_101_1(uniques, 11);
+  f_010_011_110_111_0(uniques, 11);
+  f_010_011_110_111_1(uniques, 11);
+  f_010_011_111_001_0(uniques, 11);
+  f_010_011_111_001_1(uniques, 11);
+  f_010_011_111_011_0(uniques, 11);
+  f_010_011_111_011_1(uniques, 11);
+  f_010_011_111_101_0(uniques, 11);
+  f_010_011_111_101_1(uniques, 11);
+  f_010_011_111_111_0(uniques, 11);
+  f_010_011_111_111_1(uniques, 11);
+  f_010_100_000_001_0(uniques, 11);
+  f_010_100_000_001_1(uniques, 11);
+  f_010_100_000_011_0(uniques, 11);
+  f_010_100_000_011_1(uniques, 11);
+  f_010_100_000_101_0(uniques, 11);
+  f_010_100_000_101_1(uniques, 11);
+  f_010_100_000_111_0(uniques, 11);
+  f_010_100_000_111_1(uniques, 11);
+  f_010_100_001_001_0(uniques, 11);
+  f_010_100_001_001_1(uniques, 11);
+  f_010_100_001_011_0(uniques, 11);
+  f_010_100_001_011_1(uniques, 11);
+  f_010_100_001_101_0(uniques, 11);
+  f_010_100_001_101_1(uniques, 11);
+  f_010_100_001_111_0(uniques, 11);
+  f_010_100_001_111_1(uniques, 11);
+  f_010_100_010_001_0(uniques, 11);
+  f_010_100_010_001_1(uniques, 11);
+  f_010_100_010_011_0(uniques, 11);
+  f_010_100_010_011_1(uniques, 11);
+  f_010_100_010_101_0(uniques, 11);
+  f_010_100_010_101_1(uniques, 11);
+  f_010_100_010_111_0(uniques, 11);
+  f_010_100_010_111_1(uniques, 11);
+  f_010_100_011_001_0(uniques, 11);
+  f_010_100_011_001_1(uniques, 11);
+  f_010_100_011_011_0(uniques, 11);
+  f_010_100_011_011_1(uniques, 11);
+  f_010_100_011_101_0(uniques, 11);
+  f_010_100_011_101_1(uniques, 11);
+  f_010_100_011_111_0(uniques, 11);
+  f_010_100_011_111_1(uniques, 11);
+  f_010_100_100_001_0(uniques, 11);
+  f_010_100_100_001_1(uniques, 11);
+  f_010_100_100_011_0(uniques, 11);
+  f_010_100_100_011_1(uniques, 11);
+  f_010_100_100_101_0(uniques, 11);
+  f_010_100_100_101_1(uniques, 11);
+  f_010_100_100_111_0(uniques, 11);
+  f_010_100_100_111_1(uniques, 11);
+  f_010_100_101_001_0(uniques, 11);
+  f_010_100_101_001_1(uniques, 11);
+  f_010_100_101_011_0(uniques, 11);
+  f_010_100_101_011_1(uniques, 11);
+  f_010_100_101_101_0(uniques, 11);
+  f_010_100_101_101_1(uniques, 11);
+  f_010_100_101_111_0(uniques, 11);
+  f_010_100_101_111_1(uniques, 11);
+  f_010_100_110_001_0(uniques, 11);
+  f_010_100_110_001_1(uniques, 11);
+  f_010_100_110_011_0(uniques, 11);
+  f_010_100_110_011_1(uniques, 11);
+  f_010_100_110_101_0(uniques, 11);
+  f_010_100_110_101_1(uniques, 11);
+  f_010_100_110_111_0(uniques, 11);
+  f_010_100_110_111_1(uniques, 11);
+  f_010_100_111_001_0(uniques, 11);
+  f_010_100_111_001_1(uniques, 11);
+  f_010_100_111_011_0(uniques, 11);
+  f_010_100_111_011_1(uniques, 11);
+  f_010_100_111_101_0(uniques, 11);
+  f_010_100_111_101_1(uniques, 11);
+  f_010_100_111_111_0(uniques, 11);
+  f_010_100_111_111_1(uniques, 11);
+  f_010_101_000_001_0(uniques, 11);
+  f_010_101_000_001_1(uniques, 11);
+  f_010_101_000_011_0(uniques, 11);
+  f_010_101_000_011_1(uniques, 11);
+  f_010_101_000_101_0(uniques, 11);
+  f_010_101_000_101_1(uniques, 11);
+  f_010_101_000_111_0(uniques, 11);
+  f_010_101_000_111_1(uniques, 11);
+  f_010_101_001_001_0(uniques, 11);
+  f_010_101_001_001_1(uniques, 11);
+  f_010_101_001_011_0(uniques, 11);
+  f_010_101_001_011_1(uniques, 11);
+  f_010_101_001_101_0(uniques, 11);
+  f_010_101_001_101_1(uniques, 11);
+  f_010_101_001_111_0(uniques, 11);
+  f_010_101_001_111_1(uniques, 11);
+  f_010_101_010_001_0(uniques, 11);
+  f_010_101_010_001_1(uniques, 11);
+  f_010_101_010_011_0(uniques, 11);
+  f_010_101_010_011_1(uniques, 11);
+  f_010_101_010_101_0(uniques, 11);
+  f_010_101_010_101_1(uniques, 11);
+  f_010_101_010_111_0(uniques, 11);
+  f_010_101_010_111_1(uniques, 11);
+  f_010_101_011_001_0(uniques, 11);
+  f_010_101_011_001_1(uniques, 11);
+  f_010_101_011_011_0(uniques, 11);
+  f_010_101_011_011_1(uniques, 11);
+  f_010_101_011_101_0(uniques, 11);
+  f_010_101_011_101_1(uniques, 11);
+  f_010_101_011_111_0(uniques, 11);
+  f_010_101_011_111_1(uniques, 11);
+  f_010_101_100_001_0(uniques, 11);
+  f_010_101_100_001_1(uniques, 11);
+  f_010_101_100_011_0(uniques, 11);
+  f_010_101_100_011_1(uniques, 11);
+  f_010_101_100_101_0(uniques, 11);
+  f_010_101_100_101_1(uniques, 11);
+  f_010_101_100_111_0(uniques, 11);
+  f_010_101_100_111_1(uniques, 11);
+  f_010_101_101_001_0(uniques, 11);
+  f_010_101_101_001_1(uniques, 11);
+  f_010_101_101_011_0(uniques, 11);
+  f_010_101_101_011_1(uniques, 11);
+  f_010_101_101_101_0(uniques, 11);
+  f_010_101_101_101_1(uniques, 11);
+  f_010_101_101_111_0(uniques, 11);
+  f_010_101_101_111_1(uniques, 11);
+  f_010_101_110_001_0(uniques, 11);
+  f_010_101_110_001_1(uniques, 11);
+  f_010_101_110_011_0(uniques, 11);
+  f_010_101_110_011_1(uniques, 11);
+  f_010_101_110_101_0(uniques, 11);
+  f_010_101_110_101_1(uniques, 11);
+  f_010_101_110_111_0(uniques, 11);
+  f_010_101_110_111_1(uniques, 11);
+  f_010_101_111_001_0(uniques, 11);
+  f_010_101_111_001_1(uniques, 11);
+  f_010_101_111_011_0(uniques, 11);
+  f_010_101_111_011_1(uniques, 11);
+  f_010_101_111_101_0(uniques, 11);
+  f_010_101_111_101_1(uniques, 11);
+  f_010_101_111_111_0(uniques, 11);
+  f_010_101_111_111_1(uniques, 11);
+  f_010_110_000_001_0(uniques, 11);
+  f_010_110_000_001_1(uniques, 11);
+  f_010_110_000_011_0(uniques, 11);
+  f_010_110_000_011_1(uniques, 11);
+  f_010_110_000_101_0(uniques, 11);
+  f_010_110_000_101_1(uniques, 11);
+  f_010_110_000_111_0(uniques, 11);
+  f_010_110_000_111_1(uniques, 11);
+  f_010_110_001_001_0(uniques, 11);
+  f_010_110_001_001_1(uniques, 11);
+  f_010_110_001_011_0(uniques, 11);
+  f_010_110_001_011_1(uniques, 11);
+  f_010_110_001_101_0(uniques, 11);
+  f_010_110_001_101_1(uniques, 11);
+  f_010_110_001_111_0(uniques, 11);
+  f_010_110_001_111_1(uniques, 11);
+  f_010_110_010_001_0(uniques, 11);
+  f_010_110_010_001_1(uniques, 11);
+  f_010_110_010_011_0(uniques, 11);
+  f_010_110_010_011_1(uniques, 11);
+  f_010_110_010_101_0(uniques, 11);
+  f_010_110_010_101_1(uniques, 11);
+  f_010_110_010_111_0(uniques, 11);
+  f_010_110_010_111_1(uniques, 11);
+  f_010_110_011_001_0(uniques, 11);
+  f_010_110_011_001_1(uniques, 11);
+  f_010_110_011_011_0(uniques, 11);
+  f_010_110_011_011_1(uniques, 11);
+  f_010_110_011_101_0(uniques, 11);
+  f_010_110_011_101_1(uniques, 11);
+  f_010_110_011_111_0(uniques, 11);
+  f_010_110_011_111_1(uniques, 11);
+  f_010_110_100_001_0(uniques, 11);
+  f_010_110_100_001_1(uniques, 11);
+  f_010_110_100_011_0(uniques, 11);
+  f_010_110_100_011_1(uniques, 11);
+  f_010_110_100_101_0(uniques, 11);
+  f_010_110_100_101_1(uniques, 11);
+  f_010_110_100_111_0(uniques, 11);
+  f_010_110_100_111_1(uniques, 11);
+  f_010_110_101_001_0(uniques, 11);
+  f_010_110_101_001_1(uniques, 11);
+  f_010_110_101_011_0(uniques, 11);
+  f_010_110_101_011_1(uniques, 11);
+  f_010_110_101_101_0(uniques, 11);
+  f_010_110_101_101_1(uniques, 11);
+  f_010_110_101_111_0(uniques, 11);
+  f_010_110_101_111_1(uniques, 11);
+  f_010_110_110_001_0(uniques, 11);
+  f_010_110_110_001_1(uniques, 11);
+  f_010_110_110_011_0(uniques, 11);
+  f_010_110_110_011_1(uniques, 11);
+  f_010_110_110_101_0(uniques, 11);
+  f_010_110_110_101_1(uniques, 11);
+  f_010_110_110_111_0(uniques, 11);
+  f_010_110_110_111_1(uniques, 11);
+  f_010_110_111_001_0(uniques, 11);
+  f_010_110_111_001_1(uniques, 11);
+  f_010_110_111_011_0(uniques, 11);
+  f_010_110_111_011_1(uniques, 11);
+  f_010_110_111_101_0(uniques, 11);
+  f_010_110_111_101_1(uniques, 11);
+  f_010_110_111_111_0(uniques, 11);
+  f_010_110_111_111_1(uniques, 11);
+  f_010_111_000_001_0(uniques, 11);
+  f_010_111_000_001_1(uniques, 11);
+  f_010_111_000_011_0(uniques, 11);
+  f_010_111_000_011_1(uniques, 11);
+  f_010_111_000_101_0(uniques, 11);
+  f_010_111_000_101_1(uniques, 11);
+  f_010_111_000_111_0(uniques, 11);
+  f_010_111_000_111_1(uniques, 11);
+  f_010_111_001_001_0(uniques, 11);
+  f_010_111_001_001_1(uniques, 11);
+  f_010_111_001_011_0(uniques, 11);
+  f_010_111_001_011_1(uniques, 11);
+  f_010_111_001_101_0(uniques, 11);
+  f_010_111_001_101_1(uniques, 11);
+  f_010_111_001_111_0(uniques, 11);
+  f_010_111_001_111_1(uniques, 11);
+  f_010_111_010_001_0(uniques, 11);
+  f_010_111_010_001_1(uniques, 11);
+  f_010_111_010_011_0(uniques, 11);
+  f_010_111_010_011_1(uniques, 11);
+  f_010_111_010_101_0(uniques, 11);
+  f_010_111_010_101_1(uniques, 11);
+  f_010_111_010_111_0(uniques, 11);
+  f_010_111_010_111_1(uniques, 11);
+  f_010_111_011_001_0(uniques, 11);
+  f_010_111_011_001_1(uniques, 11);
+  f_010_111_011_011_0(uniques, 11);
+  f_010_111_011_011_1(uniques, 11);
+  f_010_111_011_101_0(uniques, 11);
+  f_010_111_011_101_1(uniques, 11);
+  f_010_111_011_111_0(uniques, 11);
+  f_010_111_011_111_1(uniques, 11);
+  f_010_111_100_001_0(uniques, 11);
+  f_010_111_100_001_1(uniques, 11);
+  f_010_111_100_011_0(uniques, 11);
+  f_010_111_100_011_1(uniques, 11);
+  f_010_111_100_101_0(uniques, 11);
+  f_010_111_100_101_1(uniques, 11);
+  f_010_111_100_111_0(uniques, 11);
+  f_010_111_100_111_1(uniques, 11);
+  f_010_111_101_001_0(uniques, 11);
+  f_010_111_101_001_1(uniques, 11);
+  f_010_111_101_011_0(uniques, 11);
+  f_010_111_101_011_1(uniques, 11);
+  f_010_111_101_101_0(uniques, 11);
+  f_010_111_101_101_1(uniques, 11);
+  f_010_111_101_111_0(uniques, 11);
+  f_010_111_101_111_1(uniques, 11);
+  f_010_111_110_001_0(uniques, 11);
+  f_010_111_110_001_1(uniques, 11);
+  f_010_111_110_011_0(uniques, 11);
+  f_010_111_110_011_1(uniques, 11);
+  f_010_111_110_101_0(uniques, 11);
+  f_010_111_110_101_1(uniques, 11);
+  f_010_111_110_111_0(uniques, 11);
+  f_010_111_110_111_1(uniques, 11);
+  f_010_111_111_001_0(uniques, 11);
+  f_010_111_111_001_1(uniques, 11);
+  f_010_111_111_011_0(uniques, 11);
+  f_010_111_111_011_1(uniques, 11);
+  f_010_111_111_101_0(uniques, 11);
+  f_010_111_111_101_1(uniques, 11);
+  f_010_111_111_111_0(uniques, 11);
+  f_010_111_111_111_1(uniques, 11);
+  f_011_000_000_001_0(uniques, 11);
+  f_011_000_000_001_1(uniques, 11);
+  f_011_000_000_011_0(uniques, 11);
+  f_011_000_000_011_1(uniques, 11);
+  f_011_000_000_101_0(uniques, 11);
+  f_011_000_000_101_1(uniques, 11);
+  f_011_000_000_111_0(uniques, 11);
+  f_011_000_000_111_1(uniques, 11);
+  f_011_000_001_001_0(uniques, 11);
+  f_011_000_001_001_1(uniques, 11);
+  f_011_000_001_011_0(uniques, 11);
+  f_011_000_001_011_1(uniques, 11);
+  f_011_000_001_101_0(uniques, 11);
+  f_011_000_001_101_1(uniques, 11);
+  f_011_000_001_111_0(uniques, 11);
+  f_011_000_001_111_1(uniques, 11);
+  f_011_000_010_001_0(uniques, 11);
+  f_011_000_010_001_1(uniques, 11);
+  f_011_000_010_011_0(uniques, 11);
+  f_011_000_010_011_1(uniques, 11);
+  f_011_000_010_101_0(uniques, 11);
+  f_011_000_010_101_1(uniques, 11);
+  f_011_000_010_111_0(uniques, 11);
+  f_011_000_010_111_1(uniques, 11);
+  f_011_000_011_001_0(uniques, 11);
+  f_011_000_011_001_1(uniques, 11);
+  f_011_000_011_011_0(uniques, 11);
+  f_011_000_011_011_1(uniques, 11);
+  f_011_000_011_101_0(uniques, 11);
+  f_011_000_011_101_1(uniques, 11);
+  f_011_000_011_111_0(uniques, 11);
+  f_011_000_011_111_1(uniques, 11);
+  f_011_000_100_001_0(uniques, 11);
+  f_011_000_100_001_1(uniques, 11);
+  f_011_000_100_011_0(uniques, 11);
+  f_011_000_100_011_1(uniques, 11);
+  f_011_000_100_101_0(uniques, 11);
+  f_011_000_100_101_1(uniques, 11);
+  f_011_000_100_111_0(uniques, 11);
+  f_011_000_100_111_1(uniques, 11);
+  f_011_000_101_001_0(uniques, 11);
+  f_011_000_101_001_1(uniques, 11);
+  f_011_000_101_011_0(uniques, 11);
+  f_011_000_101_011_1(uniques, 11);
+  f_011_000_101_101_0(uniques, 11);
+  f_011_000_101_101_1(uniques, 11);
+  f_011_000_101_111_0(uniques, 11);
+  f_011_000_101_111_1(uniques, 11);
+  f_011_000_110_001_0(uniques, 11);
+  f_011_000_110_001_1(uniques, 11);
+  f_011_000_110_011_0(uniques, 11);
+  f_011_000_110_011_1(uniques, 11);
+  f_011_000_110_101_0(uniques, 11);
+  f_011_000_110_101_1(uniques, 11);
+  f_011_000_110_111_0(uniques, 11);
+  f_011_000_110_111_1(uniques, 11);
+  f_011_000_111_001_0(uniques, 11);
+  f_011_000_111_001_1(uniques, 11);
+  f_011_000_111_011_0(uniques, 11);
+  f_011_000_111_011_1(uniques, 11);
+  f_011_000_111_101_0(uniques, 11);
+  f_011_000_111_101_1(uniques, 11);
+  f_011_000_111_111_0(uniques, 11);
+  f_011_000_111_111_1(uniques, 11);
+  f_011_001_000_001_0(uniques, 11);
+  f_011_001_000_001_1(uniques, 11);
+  f_011_001_000_011_0(uniques, 11);
+  f_011_001_000_011_1(uniques, 11);
+  f_011_001_000_101_0(uniques, 11);
+  f_011_001_000_101_1(uniques, 11);
+  f_011_001_000_111_0(uniques, 11);
+  f_011_001_000_111_1(uniques, 11);
+  f_011_001_001_001_0(uniques, 11);
+  f_011_001_001_001_1(uniques, 11);
+  f_011_001_001_011_0(uniques, 11);
+  f_011_001_001_011_1(uniques, 11);
+  f_011_001_001_101_0(uniques, 11);
+  f_011_001_001_101_1(uniques, 11);
+  f_011_001_001_111_0(uniques, 11);
+  f_011_001_001_111_1(uniques, 11);
+  f_011_001_010_001_0(uniques, 11);
+  f_011_001_010_001_1(uniques, 11);
+  f_011_001_010_011_0(uniques, 11);
+  f_011_001_010_011_1(uniques, 11);
+  f_011_001_010_101_0(uniques, 11);
+  f_011_001_010_101_1(uniques, 11);
+  f_011_001_010_111_0(uniques, 11);
+  f_011_001_010_111_1(uniques, 11);
+  f_011_001_011_001_0(uniques, 11);
+  f_011_001_011_001_1(uniques, 11);
+  f_011_001_011_011_0(uniques, 11);
+  f_011_001_011_011_1(uniques, 11);
+  f_011_001_011_101_0(uniques, 11);
+  f_011_001_011_101_1(uniques, 11);
+  f_011_001_011_111_0(uniques, 11);
+  f_011_001_011_111_1(uniques, 11);
+  f_011_001_100_001_0(uniques, 11);
+  f_011_001_100_001_1(uniques, 11);
+  f_011_001_100_011_0(uniques, 11);
+  f_011_001_100_011_1(uniques, 11);
+  f_011_001_100_101_0(uniques, 11);
+  f_011_001_100_101_1(uniques, 11);
+  f_011_001_100_111_0(uniques, 11);
+  f_011_001_100_111_1(uniques, 11);
+  f_011_001_101_001_0(uniques, 11);
+  f_011_001_101_001_1(uniques, 11);
+  f_011_001_101_011_0(uniques, 11);
+  f_011_001_101_011_1(uniques, 11);
+  f_011_001_101_101_0(uniques, 11);
+  f_011_001_101_101_1(uniques, 11);
+  f_011_001_101_111_0(uniques, 11);
+  f_011_001_101_111_1(uniques, 11);
+  f_011_001_110_001_0(uniques, 11);
+  f_011_001_110_001_1(uniques, 11);
+  f_011_001_110_011_0(uniques, 11);
+  f_011_001_110_011_1(uniques, 11);
+  f_011_001_110_101_0(uniques, 11);
+  f_011_001_110_101_1(uniques, 11);
+  f_011_001_110_111_0(uniques, 11);
+  f_011_001_110_111_1(uniques, 11);
+  f_011_001_111_001_0(uniques, 11);
+  f_011_001_111_001_1(uniques, 11);
+  f_011_001_111_011_0(uniques, 11);
+  f_011_001_111_011_1(uniques, 11);
+  f_011_001_111_101_0(uniques, 11);
+  f_011_001_111_101_1(uniques, 11);
+  f_011_001_111_111_0(uniques, 11);
+  f_011_001_111_111_1(uniques, 11);
+  f_011_010_000_001_0(uniques, 11);
+  f_011_010_000_001_1(uniques, 11);
+  f_011_010_000_011_0(uniques, 11);
+  f_011_010_000_011_1(uniques, 11);
+  f_011_010_000_101_0(uniques, 11);
+  f_011_010_000_101_1(uniques, 11);
+  f_011_010_000_111_0(uniques, 11);
+  f_011_010_000_111_1(uniques, 11);
+  f_011_010_001_001_0(uniques, 11);
+  f_011_010_001_001_1(uniques, 11);
+  f_011_010_001_011_0(uniques, 11);
+  f_011_010_001_011_1(uniques, 11);
+  f_011_010_001_101_0(uniques, 11);
+  f_011_010_001_101_1(uniques, 11);
+  f_011_010_001_111_0(uniques, 11);
+  f_011_010_001_111_1(uniques, 11);
+  f_011_010_010_001_0(uniques, 11);
+  f_011_010_010_001_1(uniques, 11);
+  f_011_010_010_011_0(uniques, 11);
+  f_011_010_010_011_1(uniques, 11);
+  f_011_010_010_101_0(uniques, 11);
+  f_011_010_010_101_1(uniques, 11);
+  f_011_010_010_111_0(uniques, 11);
+  f_011_010_010_111_1(uniques, 11);
+  f_011_010_011_001_0(uniques, 11);
+  f_011_010_011_001_1(uniques, 11);
+  f_011_010_011_011_0(uniques, 11);
+  f_011_010_011_011_1(uniques, 11);
+  f_011_010_011_101_0(uniques, 11);
+  f_011_010_011_101_1(uniques, 11);
+  f_011_010_011_111_0(uniques, 11);
+  f_011_010_011_111_1(uniques, 11);
+  f_011_010_100_001_0(uniques, 11);
+  f_011_010_100_001_1(uniques, 11);
+  f_011_010_100_011_0(uniques, 11);
+  f_011_010_100_011_1(uniques, 11);
+  f_011_010_100_101_0(uniques, 11);
+  f_011_010_100_101_1(uniques, 11);
+  f_011_010_100_111_0(uniques, 11);
+  f_011_010_100_111_1(uniques, 11);
+  f_011_010_101_001_0(uniques, 11);
+  f_011_010_101_001_1(uniques, 11);
+  f_011_010_101_011_0(uniques, 11);
+  f_011_010_101_011_1(uniques, 11);
+  f_011_010_101_101_0(uniques, 11);
+  f_011_010_101_101_1(uniques, 11);
+  f_011_010_101_111_0(uniques, 11);
+  f_011_010_101_111_1(uniques, 11);
+  f_011_010_110_001_0(uniques, 11);
+  f_011_010_110_001_1(uniques, 11);
+  f_011_010_110_011_0(uniques, 11);
+  f_011_010_110_011_1(uniques, 11);
+  f_011_010_110_101_0(uniques, 11);
+  f_011_010_110_101_1(uniques, 11);
+  f_011_010_110_111_0(uniques, 11);
+  f_011_010_110_111_1(uniques, 11);
+  f_011_010_111_001_0(uniques, 11);
+  f_011_010_111_001_1(uniques, 11);
+  f_011_010_111_011_0(uniques, 11);
+  f_011_010_111_011_1(uniques, 11);
+  f_011_010_111_101_0(uniques, 11);
+  f_011_010_111_101_1(uniques, 11);
+  f_011_010_111_111_0(uniques, 11);
+  f_011_010_111_111_1(uniques, 11);
+  f_011_011_000_001_0(uniques, 11);
+  f_011_011_000_001_1(uniques, 11);
+  f_011_011_000_011_0(uniques, 11);
+  f_011_011_000_011_1(uniques, 11);
+  f_011_011_000_101_0(uniques, 11);
+  f_011_011_000_101_1(uniques, 11);
+  f_011_011_000_111_0(uniques, 11);
+  f_011_011_000_111_1(uniques, 11);
+  f_011_011_001_001_0(uniques, 11);
+  f_011_011_001_001_1(uniques, 11);
+  f_011_011_001_011_0(uniques, 11);
+  f_011_011_001_011_1(uniques, 11);
+  f_011_011_001_101_0(uniques, 11);
+  f_011_011_001_101_1(uniques, 11);
+  f_011_011_001_111_0(uniques, 11);
+  f_011_011_001_111_1(uniques, 11);
+  f_011_011_010_001_0(uniques, 11);
+  f_011_011_010_001_1(uniques, 11);
+  f_011_011_010_011_0(uniques, 11);
+  f_011_011_010_011_1(uniques, 11);
+  f_011_011_010_101_0(uniques, 11);
+  f_011_011_010_101_1(uniques, 11);
+  f_011_011_010_111_0(uniques, 11);
+  f_011_011_010_111_1(uniques, 11);
+  f_011_011_011_001_0(uniques, 11);
+  f_011_011_011_001_1(uniques, 11);
+  f_011_011_011_011_0(uniques, 11);
+  f_011_011_011_011_1(uniques, 11);
+  f_011_011_011_101_0(uniques, 11);
+  f_011_011_011_101_1(uniques, 11);
+  f_011_011_011_111_0(uniques, 11);
+  f_011_011_011_111_1(uniques, 11);
+  f_011_011_100_001_0(uniques, 11);
+  f_011_011_100_001_1(uniques, 11);
+  f_011_011_100_011_0(uniques, 11);
+  f_011_011_100_011_1(uniques, 11);
+  f_011_011_100_101_0(uniques, 11);
+  f_011_011_100_101_1(uniques, 11);
+  f_011_011_100_111_0(uniques, 11);
+  f_011_011_100_111_1(uniques, 11);
+  f_011_011_101_001_0(uniques, 11);
+  f_011_011_101_001_1(uniques, 11);
+  f_011_011_101_011_0(uniques, 11);
+  f_011_011_101_011_1(uniques, 11);
+  f_011_011_101_101_0(uniques, 11);
+  f_011_011_101_101_1(uniques, 11);
+  f_011_011_101_111_0(uniques, 11);
+  f_011_011_101_111_1(uniques, 11);
+  f_011_011_110_001_0(uniques, 11);
+  f_011_011_110_001_1(uniques, 11);
+  f_011_011_110_011_0(uniques, 11);
+  f_011_011_110_011_1(uniques, 11);
+  f_011_011_110_101_0(uniques, 11);
+  f_011_011_110_101_1(uniques, 11);
+  f_011_011_110_111_0(uniques, 11);
+  f_011_011_110_111_1(uniques, 11);
+  f_011_011_111_001_0(uniques, 11);
+  f_011_011_111_001_1(uniques, 11);
+  f_011_011_111_011_0(uniques, 11);
+  f_011_011_111_011_1(uniques, 11);
+  f_011_011_111_101_0(uniques, 11);
+  f_011_011_111_101_1(uniques, 11);
+  f_011_011_111_111_0(uniques, 11);
+  f_011_011_111_111_1(uniques, 11);
+  f_011_100_000_001_0(uniques, 11);
+  f_011_100_000_001_1(uniques, 11);
+  f_011_100_000_011_0(uniques, 11);
+  f_011_100_000_011_1(uniques, 11);
+  f_011_100_000_101_0(uniques, 11);
+  f_011_100_000_101_1(uniques, 11);
+  f_011_100_000_111_0(uniques, 11);
+  f_011_100_000_111_1(uniques, 11);
+  f_011_100_001_001_0(uniques, 11);
+  f_011_100_001_001_1(uniques, 11);
+  f_011_100_001_011_0(uniques, 11);
+  f_011_100_001_011_1(uniques, 11);
+  f_011_100_001_101_0(uniques, 11);
+  f_011_100_001_101_1(uniques, 11);
+  f_011_100_001_111_0(uniques, 11);
+  f_011_100_001_111_1(uniques, 11);
+  f_011_100_010_001_0(uniques, 11);
+  f_011_100_010_001_1(uniques, 11);
+  f_011_100_010_011_0(uniques, 11);
+  f_011_100_010_011_1(uniques, 11);
+  f_011_100_010_101_0(uniques, 11);
+  f_011_100_010_101_1(uniques, 11);
+  f_011_100_010_111_0(uniques, 11);
+  f_011_100_010_111_1(uniques, 11);
+  f_011_100_011_001_0(uniques, 11);
+  f_011_100_011_001_1(uniques, 11);
+  f_011_100_011_011_0(uniques, 11);
+  f_011_100_011_011_1(uniques, 11);
+  f_011_100_011_101_0(uniques, 11);
+  f_011_100_011_101_1(uniques, 11);
+  f_011_100_011_111_0(uniques, 11);
+  f_011_100_011_111_1(uniques, 11);
+  f_011_100_100_001_0(uniques, 11);
+  f_011_100_100_001_1(uniques, 11);
+  f_011_100_100_011_0(uniques, 11);
+  f_011_100_100_011_1(uniques, 11);
+  f_011_100_100_101_0(uniques, 11);
+  f_011_100_100_101_1(uniques, 11);
+  f_011_100_100_111_0(uniques, 11);
+  f_011_100_100_111_1(uniques, 11);
+  f_011_100_101_001_0(uniques, 11);
+  f_011_100_101_001_1(uniques, 11);
+  f_011_100_101_011_0(uniques, 11);
+  f_011_100_101_011_1(uniques, 11);
+  f_011_100_101_101_0(uniques, 11);
+  f_011_100_101_101_1(uniques, 11);
+  f_011_100_101_111_0(uniques, 11);
+  f_011_100_101_111_1(uniques, 11);
+  f_011_100_110_001_0(uniques, 11);
+  f_011_100_110_001_1(uniques, 11);
+  f_011_100_110_011_0(uniques, 11);
+  f_011_100_110_011_1(uniques, 11);
+  f_011_100_110_101_0(uniques, 11);
+  f_011_100_110_101_1(uniques, 11);
+  f_011_100_110_111_0(uniques, 11);
+  f_011_100_110_111_1(uniques, 11);
+  f_011_100_111_001_0(uniques, 11);
+  f_011_100_111_001_1(uniques, 11);
+  f_011_100_111_011_0(uniques, 11);
+  f_011_100_111_011_1(uniques, 11);
+  f_011_100_111_101_0(uniques, 11);
+  f_011_100_111_101_1(uniques, 11);
+  f_011_100_111_111_0(uniques, 11);
+  f_011_100_111_111_1(uniques, 11);
+  f_011_101_000_001_0(uniques, 11);
+  f_011_101_000_001_1(uniques, 11);
+  f_011_101_000_011_0(uniques, 11);
+  f_011_101_000_011_1(uniques, 11);
+  f_011_101_000_101_0(uniques, 11);
+  f_011_101_000_101_1(uniques, 11);
+  f_011_101_000_111_0(uniques, 11);
+  f_011_101_000_111_1(uniques, 11);
+  f_011_101_001_001_0(uniques, 11);
+  f_011_101_001_001_1(uniques, 11);
+  f_011_101_001_011_0(uniques, 11);
+  f_011_101_001_011_1(uniques, 11);
+  f_011_101_001_101_0(uniques, 11);
+  f_011_101_001_101_1(uniques, 11);
+  f_011_101_001_111_0(uniques, 11);
+  f_011_101_001_111_1(uniques, 11);
+  f_011_101_010_001_0(uniques, 11);
+  f_011_101_010_001_1(uniques, 11);
+  f_011_101_010_011_0(uniques, 11);
+  f_011_101_010_011_1(uniques, 11);
+  f_011_101_010_101_0(uniques, 11);
+  f_011_101_010_101_1(uniques, 11);
+  f_011_101_010_111_0(uniques, 11);
+  f_011_101_010_111_1(uniques, 11);
+  f_011_101_011_001_0(uniques, 11);
+  f_011_101_011_001_1(uniques, 11);
+  f_011_101_011_011_0(uniques, 11);
+  f_011_101_011_011_1(uniques, 11);
+  f_011_101_011_101_0(uniques, 11);
+  f_011_101_011_101_1(uniques, 11);
+  f_011_101_011_111_0(uniques, 11);
+  f_011_101_011_111_1(uniques, 11);
+  f_011_101_100_001_0(uniques, 11);
+  f_011_101_100_001_1(uniques, 11);
+  f_011_101_100_011_0(uniques, 11);
+  f_011_101_100_011_1(uniques, 11);
+  f_011_101_100_101_0(uniques, 11);
+  f_011_101_100_101_1(uniques, 11);
+  f_011_101_100_111_0(uniques, 11);
+  f_011_101_100_111_1(uniques, 11);
+  f_011_101_101_001_0(uniques, 11);
+  f_011_101_101_001_1(uniques, 11);
+  f_011_101_101_011_0(uniques, 11);
+  f_011_101_101_011_1(uniques, 11);
+  f_011_101_101_101_0(uniques, 11);
+  f_011_101_101_101_1(uniques, 11);
+  f_011_101_101_111_0(uniques, 11);
+  f_011_101_101_111_1(uniques, 11);
+  f_011_101_110_001_0(uniques, 11);
+  f_011_101_110_001_1(uniques, 11);
+  f_011_101_110_011_0(uniques, 11);
+  f_011_101_110_011_1(uniques, 11);
+  f_011_101_110_101_0(uniques, 11);
+  f_011_101_110_101_1(uniques, 11);
+  f_011_101_110_111_0(uniques, 11);
+  f_011_101_110_111_1(uniques, 11);
+  f_011_101_111_001_0(uniques, 11);
+  f_011_101_111_001_1(uniques, 11);
+  f_011_101_111_011_0(uniques, 11);
+  f_011_101_111_011_1(uniques, 11);
+  f_011_101_111_101_0(uniques, 11);
+  f_011_101_111_101_1(uniques, 11);
+  f_011_101_111_111_0(uniques, 11);
+  f_011_101_111_111_1(uniques, 11);
+  f_011_110_000_001_0(uniques, 11);
+  f_011_110_000_001_1(uniques, 11);
+  f_011_110_000_011_0(uniques, 11);
+  f_011_110_000_011_1(uniques, 11);
+  f_011_110_000_101_0(uniques, 11);
+  f_011_110_000_101_1(uniques, 11);
+  f_011_110_000_111_0(uniques, 11);
+  f_011_110_000_111_1(uniques, 11);
+  f_011_110_001_001_0(uniques, 11);
+  f_011_110_001_001_1(uniques, 11);
+  f_011_110_001_011_0(uniques, 11);
+  f_011_110_001_011_1(uniques, 11);
+  f_011_110_001_101_0(uniques, 11);
+  f_011_110_001_101_1(uniques, 11);
+  f_011_110_001_111_0(uniques, 11);
+  f_011_110_001_111_1(uniques, 11);
+  f_011_110_010_001_0(uniques, 11);
+  f_011_110_010_001_1(uniques, 11);
+  f_011_110_010_011_0(uniques, 11);
+  f_011_110_010_011_1(uniques, 11);
+  f_011_110_010_101_0(uniques, 11);
+  f_011_110_010_101_1(uniques, 11);
+  f_011_110_010_111_0(uniques, 11);
+  f_011_110_010_111_1(uniques, 11);
+  f_011_110_011_001_0(uniques, 11);
+  f_011_110_011_001_1(uniques, 11);
+  f_011_110_011_011_0(uniques, 11);
+  f_011_110_011_011_1(uniques, 11);
+  f_011_110_011_101_0(uniques, 11);
+  f_011_110_011_101_1(uniques, 11);
+  f_011_110_011_111_0(uniques, 11);
+  f_011_110_011_111_1(uniques, 11);
+  f_011_110_100_001_0(uniques, 11);
+  f_011_110_100_001_1(uniques, 11);
+  f_011_110_100_011_0(uniques, 11);
+  f_011_110_100_011_1(uniques, 11);
+  f_011_110_100_101_0(uniques, 11);
+  f_011_110_100_101_1(uniques, 11);
+  f_011_110_100_111_0(uniques, 11);
+  f_011_110_100_111_1(uniques, 11);
+  f_011_110_101_001_0(uniques, 11);
+  f_011_110_101_001_1(uniques, 11);
+  f_011_110_101_011_0(uniques, 11);
+  f_011_110_101_011_1(uniques, 11);
+  f_011_110_101_101_0(uniques, 11);
+  f_011_110_101_101_1(uniques, 11);
+  f_011_110_101_111_0(uniques, 11);
+  f_011_110_101_111_1(uniques, 11);
+  f_011_110_110_001_0(uniques, 11);
+  f_011_110_110_001_1(uniques, 11);
+  f_011_110_110_011_0(uniques, 11);
+  f_011_110_110_011_1(uniques, 11);
+  f_011_110_110_101_0(uniques, 11);
+  f_011_110_110_101_1(uniques, 11);
+  f_011_110_110_111_0(uniques, 11);
+  f_011_110_110_111_1(uniques, 11);
+  f_011_110_111_001_0(uniques, 11);
+  f_011_110_111_001_1(uniques, 11);
+  f_011_110_111_011_0(uniques, 11);
+  f_011_110_111_011_1(uniques, 11);
+  f_011_110_111_101_0(uniques, 11);
+  f_011_110_111_101_1(uniques, 11);
+  f_011_110_111_111_0(uniques, 11);
+  f_011_110_111_111_1(uniques, 11);
+  f_011_111_000_001_0(uniques, 11);
+  f_011_111_000_001_1(uniques, 11);
+  f_011_111_000_011_0(uniques, 11);
+  f_011_111_000_011_1(uniques, 11);
+  f_011_111_000_101_0(uniques, 11);
+  f_011_111_000_101_1(uniques, 11);
+  f_011_111_000_111_0(uniques, 11);
+  f_011_111_000_111_1(uniques, 11);
+  f_011_111_001_001_0(uniques, 11);
+  f_011_111_001_001_1(uniques, 11);
+  f_011_111_001_011_0(uniques, 11);
+  f_011_111_001_011_1(uniques, 11);
+  f_011_111_001_101_0(uniques, 11);
+  f_011_111_001_101_1(uniques, 11);
+  f_011_111_001_111_0(uniques, 11);
+  f_011_111_001_111_1(uniques, 11);
+  f_011_111_010_001_0(uniques, 11);
+  f_011_111_010_001_1(uniques, 11);
+  f_011_111_010_011_0(uniques, 11);
+  f_011_111_010_011_1(uniques, 11);
+  f_011_111_010_101_0(uniques, 11);
+  f_011_111_010_101_1(uniques, 11);
+  f_011_111_010_111_0(uniques, 11);
+  f_011_111_010_111_1(uniques, 11);
+  f_011_111_011_001_0(uniques, 11);
+  f_011_111_011_001_1(uniques, 11);
+  f_011_111_011_011_0(uniques, 11);
+  f_011_111_011_011_1(uniques, 11);
+  f_011_111_011_101_0(uniques, 11);
+  f_011_111_011_101_1(uniques, 11);
+  f_011_111_011_111_0(uniques, 11);
+  f_011_111_011_111_1(uniques, 11);
+  f_011_111_100_001_0(uniques, 11);
+  f_011_111_100_001_1(uniques, 11);
+  f_011_111_100_011_0(uniques, 11);
+  f_011_111_100_011_1(uniques, 11);
+  f_011_111_100_101_0(uniques, 11);
+  f_011_111_100_101_1(uniques, 11);
+  f_011_111_100_111_0(uniques, 11);
+  f_011_111_100_111_1(uniques, 11);
+  f_011_111_101_001_0(uniques, 11);
+  f_011_111_101_001_1(uniques, 11);
+  f_011_111_101_011_0(uniques, 11);
+  f_011_111_101_011_1(uniques, 11);
+  f_011_111_101_101_0(uniques, 11);
+  f_011_111_101_101_1(uniques, 11);
+  f_011_111_101_111_0(uniques, 11);
+  f_011_111_101_111_1(uniques, 11);
+  f_011_111_110_001_0(uniques, 11);
+  f_011_111_110_001_1(uniques, 11);
+  f_011_111_110_011_0(uniques, 11);
+  f_011_111_110_011_1(uniques, 11);
+  f_011_111_110_101_0(uniques, 11);
+  f_011_111_110_101_1(uniques, 11);
+  f_011_111_110_111_0(uniques, 11);
+  f_011_111_110_111_1(uniques, 11);
+  f_011_111_111_001_0(uniques, 11);
+  f_011_111_111_001_1(uniques, 11);
+  f_011_111_111_011_0(uniques, 11);
+  f_011_111_111_011_1(uniques, 11);
+  f_011_111_111_101_0(uniques, 11);
+  f_011_111_111_101_1(uniques, 11);
+  f_011_111_111_111_0(uniques, 11);
+  f_011_111_111_111_1(uniques, 11);
+  f_100_000_000_001_0(uniques, 11);
+  f_100_000_000_001_1(uniques, 11);
+  f_100_000_000_011_0(uniques, 11);
+  f_100_000_000_011_1(uniques, 11);
+  f_100_000_000_101_0(uniques, 11);
+  f_100_000_000_101_1(uniques, 11);
+  f_100_000_000_111_0(uniques, 11);
+  f_100_000_000_111_1(uniques, 11);
+  f_100_000_001_001_0(uniques, 11);
+  f_100_000_001_001_1(uniques, 11);
+  f_100_000_001_011_0(uniques, 11);
+  f_100_000_001_011_1(uniques, 11);
+  f_100_000_001_101_0(uniques, 11);
+  f_100_000_001_101_1(uniques, 11);
+  f_100_000_001_111_0(uniques, 11);
+  f_100_000_001_111_1(uniques, 11);
+  f_100_000_010_001_0(uniques, 11);
+  f_100_000_010_001_1(uniques, 11);
+  f_100_000_010_011_0(uniques, 11);
+  f_100_000_010_011_1(uniques, 11);
+  f_100_000_010_101_0(uniques, 11);
+  f_100_000_010_101_1(uniques, 11);
+  f_100_000_010_111_0(uniques, 11);
+  f_100_000_010_111_1(uniques, 11);
+  f_100_000_011_001_0(uniques, 11);
+  f_100_000_011_001_1(uniques, 11);
+  f_100_000_011_011_0(uniques, 11);
+  f_100_000_011_011_1(uniques, 11);
+  f_100_000_011_101_0(uniques, 11);
+  f_100_000_011_101_1(uniques, 11);
+  f_100_000_011_111_0(uniques, 11);
+  f_100_000_011_111_1(uniques, 11);
+  f_100_000_100_001_0(uniques, 11);
+  f_100_000_100_001_1(uniques, 11);
+  f_100_000_100_011_0(uniques, 11);
+  f_100_000_100_011_1(uniques, 11);
+  f_100_000_100_101_0(uniques, 11);
+  f_100_000_100_101_1(uniques, 11);
+  f_100_000_100_111_0(uniques, 11);
+  f_100_000_100_111_1(uniques, 11);
+  f_100_000_101_001_0(uniques, 11);
+  f_100_000_101_001_1(uniques, 11);
+  f_100_000_101_011_0(uniques, 11);
+  f_100_000_101_011_1(uniques, 11);
+  f_100_000_101_101_0(uniques, 11);
+  f_100_000_101_101_1(uniques, 11);
+  f_100_000_101_111_0(uniques, 11);
+  f_100_000_101_111_1(uniques, 11);
+  f_100_000_110_001_0(uniques, 11);
+  f_100_000_110_001_1(uniques, 11);
+  f_100_000_110_011_0(uniques, 11);
+  f_100_000_110_011_1(uniques, 11);
+  f_100_000_110_101_0(uniques, 11);
+  f_100_000_110_101_1(uniques, 11);
+  f_100_000_110_111_0(uniques, 11);
+  f_100_000_110_111_1(uniques, 11);
+  f_100_000_111_001_0(uniques, 11);
+  f_100_000_111_001_1(uniques, 11);
+  f_100_000_111_011_0(uniques, 11);
+  f_100_000_111_011_1(uniques, 11);
+  f_100_000_111_101_0(uniques, 11);
+  f_100_000_111_101_1(uniques, 11);
+  f_100_000_111_111_0(uniques, 11);
+  f_100_000_111_111_1(uniques, 11);
+  f_100_001_000_001_0(uniques, 11);
+  f_100_001_000_001_1(uniques, 11);
+  f_100_001_000_011_0(uniques, 11);
+  f_100_001_000_011_1(uniques, 11);
+  f_100_001_000_101_0(uniques, 11);
+  f_100_001_000_101_1(uniques, 11);
+  f_100_001_000_111_0(uniques, 11);
+  f_100_001_000_111_1(uniques, 11);
+  f_100_001_001_001_0(uniques, 11);
+  f_100_001_001_001_1(uniques, 11);
+  f_100_001_001_011_0(uniques, 11);
+  f_100_001_001_011_1(uniques, 11);
+  f_100_001_001_101_0(uniques, 11);
+  f_100_001_001_101_1(uniques, 11);
+  f_100_001_001_111_0(uniques, 11);
+  f_100_001_001_111_1(uniques, 11);
+  f_100_001_010_001_0(uniques, 11);
+  f_100_001_010_001_1(uniques, 11);
+  f_100_001_010_011_0(uniques, 11);
+  f_100_001_010_011_1(uniques, 11);
+  f_100_001_010_101_0(uniques, 11);
+  f_100_001_010_101_1(uniques, 11);
+  f_100_001_010_111_0(uniques, 11);
+  f_100_001_010_111_1(uniques, 11);
+  f_100_001_011_001_0(uniques, 11);
+  f_100_001_011_001_1(uniques, 11);
+  f_100_001_011_011_0(uniques, 11);
+  f_100_001_011_011_1(uniques, 11);
+  f_100_001_011_101_0(uniques, 11);
+  f_100_001_011_101_1(uniques, 11);
+  f_100_001_011_111_0(uniques, 11);
+  f_100_001_011_111_1(uniques, 11);
+  f_100_001_100_001_0(uniques, 11);
+  f_100_001_100_001_1(uniques, 11);
+  f_100_001_100_011_0(uniques, 11);
+  f_100_001_100_011_1(uniques, 11);
+  f_100_001_100_101_0(uniques, 11);
+  f_100_001_100_101_1(uniques, 11);
+  f_100_001_100_111_0(uniques, 11);
+  f_100_001_100_111_1(uniques, 11);
+  f_100_001_101_001_0(uniques, 11);
+  f_100_001_101_001_1(uniques, 11);
+  f_100_001_101_011_0(uniques, 11);
+  f_100_001_101_011_1(uniques, 11);
+  f_100_001_101_101_0(uniques, 11);
+  f_100_001_101_101_1(uniques, 11);
+  f_100_001_101_111_0(uniques, 11);
+  f_100_001_101_111_1(uniques, 11);
+  f_100_001_110_001_0(uniques, 11);
+  f_100_001_110_001_1(uniques, 11);
+  f_100_001_110_011_0(uniques, 11);
+  f_100_001_110_011_1(uniques, 11);
+  f_100_001_110_101_0(uniques, 11);
+  f_100_001_110_101_1(uniques, 11);
+  f_100_001_110_111_0(uniques, 11);
+  f_100_001_110_111_1(uniques, 11);
+  f_100_001_111_001_0(uniques, 11);
+  f_100_001_111_001_1(uniques, 11);
+  f_100_001_111_011_0(uniques, 11);
+  f_100_001_111_011_1(uniques, 11);
+  f_100_001_111_101_0(uniques, 11);
+  f_100_001_111_101_1(uniques, 11);
+  f_100_001_111_111_0(uniques, 11);
+  f_100_001_111_111_1(uniques, 11);
+  f_100_010_000_001_0(uniques, 11);
+  f_100_010_000_001_1(uniques, 11);
+  f_100_010_000_011_0(uniques, 11);
+  f_100_010_000_011_1(uniques, 11);
+  f_100_010_000_101_0(uniques, 11);
+  f_100_010_000_101_1(uniques, 11);
+  f_100_010_000_111_0(uniques, 11);
+  f_100_010_000_111_1(uniques, 11);
+  f_100_010_001_001_0(uniques, 11);
+  f_100_010_001_001_1(uniques, 11);
+  f_100_010_001_011_0(uniques, 11);
+  f_100_010_001_011_1(uniques, 11);
+  f_100_010_001_101_0(uniques, 11);
+  f_100_010_001_101_1(uniques, 11);
+  f_100_010_001_111_0(uniques, 11);
+  f_100_010_001_111_1(uniques, 11);
+  f_100_010_010_001_0(uniques, 11);
+  f_100_010_010_001_1(uniques, 11);
+  f_100_010_010_011_0(uniques, 11);
+  f_100_010_010_011_1(uniques, 11);
+  f_100_010_010_101_0(uniques, 11);
+  f_100_010_010_101_1(uniques, 11);
+  f_100_010_010_111_0(uniques, 11);
+  f_100_010_010_111_1(uniques, 11);
+  f_100_010_011_001_0(uniques, 11);
+  f_100_010_011_001_1(uniques, 11);
+  f_100_010_011_011_0(uniques, 11);
+  f_100_010_011_011_1(uniques, 11);
+  f_100_010_011_101_0(uniques, 11);
+  f_100_010_011_101_1(uniques, 11);
+  f_100_010_011_111_0(uniques, 11);
+  f_100_010_011_111_1(uniques, 11);
+  f_100_010_100_001_0(uniques, 11);
+  f_100_010_100_001_1(uniques, 11);
+  f_100_010_100_011_0(uniques, 11);
+  f_100_010_100_011_1(uniques, 11);
+  f_100_010_100_101_0(uniques, 11);
+  f_100_010_100_101_1(uniques, 11);
+  f_100_010_100_111_0(uniques, 11);
+  f_100_010_100_111_1(uniques, 11);
+  f_100_010_101_001_0(uniques, 11);
+  f_100_010_101_001_1(uniques, 11);
+  f_100_010_101_011_0(uniques, 11);
+  f_100_010_101_011_1(uniques, 11);
+  f_100_010_101_101_0(uniques, 11);
+  f_100_010_101_101_1(uniques, 11);
+  f_100_010_101_111_0(uniques, 11);
+  f_100_010_101_111_1(uniques, 11);
+  f_100_010_110_001_0(uniques, 11);
+  f_100_010_110_001_1(uniques, 11);
+  f_100_010_110_011_0(uniques, 11);
+  f_100_010_110_011_1(uniques, 11);
+  f_100_010_110_101_0(uniques, 11);
+  f_100_010_110_101_1(uniques, 11);
+  f_100_010_110_111_0(uniques, 11);
+  f_100_010_110_111_1(uniques, 11);
+  f_100_010_111_001_0(uniques, 11);
+  f_100_010_111_001_1(uniques, 11);
+  f_100_010_111_011_0(uniques, 11);
+  f_100_010_111_011_1(uniques, 11);
+  f_100_010_111_101_0(uniques, 11);
+  f_100_010_111_101_1(uniques, 11);
+  f_100_010_111_111_0(uniques, 11);
+  f_100_010_111_111_1(uniques, 11);
+  f_100_011_000_001_0(uniques, 11);
+  f_100_011_000_001_1(uniques, 11);
+  f_100_011_000_011_0(uniques, 11);
+  f_100_011_000_011_1(uniques, 11);
+  f_100_011_000_101_0(uniques, 11);
+  f_100_011_000_101_1(uniques, 11);
+  f_100_011_000_111_0(uniques, 11);
+  f_100_011_000_111_1(uniques, 11);
+  f_100_011_001_001_0(uniques, 11);
+  f_100_011_001_001_1(uniques, 11);
+  f_100_011_001_011_0(uniques, 11);
+  f_100_011_001_011_1(uniques, 11);
+  f_100_011_001_101_0(uniques, 11);
+  f_100_011_001_101_1(uniques, 11);
+  f_100_011_001_111_0(uniques, 11);
+  f_100_011_001_111_1(uniques, 11);
+  f_100_011_010_001_0(uniques, 11);
+  f_100_011_010_001_1(uniques, 11);
+  f_100_011_010_011_0(uniques, 11);
+  f_100_011_010_011_1(uniques, 11);
+  f_100_011_010_101_0(uniques, 11);
+  f_100_011_010_101_1(uniques, 11);
+  f_100_011_010_111_0(uniques, 11);
+  f_100_011_010_111_1(uniques, 11);
+  f_100_011_011_001_0(uniques, 11);
+  f_100_011_011_001_1(uniques, 11);
+  f_100_011_011_011_0(uniques, 11);
+  f_100_011_011_011_1(uniques, 11);
+  f_100_011_011_101_0(uniques, 11);
+  f_100_011_011_101_1(uniques, 11);
+  f_100_011_011_111_0(uniques, 11);
+  f_100_011_011_111_1(uniques, 11);
+  f_100_011_100_001_0(uniques, 11);
+  f_100_011_100_001_1(uniques, 11);
+  f_100_011_100_011_0(uniques, 11);
+  f_100_011_100_011_1(uniques, 11);
+  f_100_011_100_101_0(uniques, 11);
+  f_100_011_100_101_1(uniques, 11);
+  f_100_011_100_111_0(uniques, 11);
+  f_100_011_100_111_1(uniques, 11);
+  f_100_011_101_001_0(uniques, 11);
+  f_100_011_101_001_1(uniques, 11);
+  f_100_011_101_011_0(uniques, 11);
+  f_100_011_101_011_1(uniques, 11);
+  f_100_011_101_101_0(uniques, 11);
+  f_100_011_101_101_1(uniques, 11);
+  f_100_011_101_111_0(uniques, 11);
+  f_100_011_101_111_1(uniques, 11);
+  f_100_011_110_001_0(uniques, 11);
+  f_100_011_110_001_1(uniques, 11);
+  f_100_011_110_011_0(uniques, 11);
+  f_100_011_110_011_1(uniques, 11);
+  f_100_011_110_101_0(uniques, 11);
+  f_100_011_110_101_1(uniques, 11);
+  f_100_011_110_111_0(uniques, 11);
+  f_100_011_110_111_1(uniques, 11);
+  f_100_011_111_001_0(uniques, 11);
+  f_100_011_111_001_1(uniques, 11);
+  f_100_011_111_011_0(uniques, 11);
+  f_100_011_111_011_1(uniques, 11);
+  f_100_011_111_101_0(uniques, 11);
+  f_100_011_111_101_1(uniques, 11);
+  f_100_011_111_111_0(uniques, 11);
+  f_100_011_111_111_1(uniques, 11);
+  f_100_100_000_001_0(uniques, 11);
+  f_100_100_000_001_1(uniques, 11);
+  f_100_100_000_011_0(uniques, 11);
+  f_100_100_000_011_1(uniques, 11);
+  f_100_100_000_101_0(uniques, 11);
+  f_100_100_000_101_1(uniques, 11);
+  f_100_100_000_111_0(uniques, 11);
+  f_100_100_000_111_1(uniques, 11);
+  f_100_100_001_001_0(uniques, 11);
+  f_100_100_001_001_1(uniques, 11);
+  f_100_100_001_011_0(uniques, 11);
+  f_100_100_001_011_1(uniques, 11);
+  f_100_100_001_101_0(uniques, 11);
+  f_100_100_001_101_1(uniques, 11);
+  f_100_100_001_111_0(uniques, 11);
+  f_100_100_001_111_1(uniques, 11);
+  f_100_100_010_001_0(uniques, 11);
+  f_100_100_010_001_1(uniques, 11);
+  f_100_100_010_011_0(uniques, 11);
+  f_100_100_010_011_1(uniques, 11);
+  f_100_100_010_101_0(uniques, 11);
+  f_100_100_010_101_1(uniques, 11);
+  f_100_100_010_111_0(uniques, 11);
+  f_100_100_010_111_1(uniques, 11);
+  f_100_100_011_001_0(uniques, 11);
+  f_100_100_011_001_1(uniques, 11);
+  f_100_100_011_011_0(uniques, 11);
+  f_100_100_011_011_1(uniques, 11);
+  f_100_100_011_101_0(uniques, 11);
+  f_100_100_011_101_1(uniques, 11);
+  f_100_100_011_111_0(uniques, 11);
+  f_100_100_011_111_1(uniques, 11);
+  f_100_100_100_001_0(uniques, 11);
+  f_100_100_100_001_1(uniques, 11);
+  f_100_100_100_011_0(uniques, 11);
+  f_100_100_100_011_1(uniques, 11);
+  f_100_100_100_101_0(uniques, 11);
+  f_100_100_100_101_1(uniques, 11);
+  f_100_100_100_111_0(uniques, 11);
+  f_100_100_100_111_1(uniques, 11);
+  f_100_100_101_001_0(uniques, 11);
+  f_100_100_101_001_1(uniques, 11);
+  f_100_100_101_011_0(uniques, 11);
+  f_100_100_101_011_1(uniques, 11);
+  f_100_100_101_101_0(uniques, 11);
+  f_100_100_101_101_1(uniques, 11);
+  f_100_100_101_111_0(uniques, 11);
+  f_100_100_101_111_1(uniques, 11);
+  f_100_100_110_001_0(uniques, 11);
+  f_100_100_110_001_1(uniques, 11);
+  f_100_100_110_011_0(uniques, 11);
+  f_100_100_110_011_1(uniques, 11);
+  f_100_100_110_101_0(uniques, 11);
+  f_100_100_110_101_1(uniques, 11);
+  f_100_100_110_111_0(uniques, 11);
+  f_100_100_110_111_1(uniques, 11);
+  f_100_100_111_001_0(uniques, 11);
+  f_100_100_111_001_1(uniques, 11);
+  f_100_100_111_011_0(uniques, 11);
+  f_100_100_111_011_1(uniques, 11);
+  f_100_100_111_101_0(uniques, 11);
+  f_100_100_111_101_1(uniques, 11);
+  f_100_100_111_111_0(uniques, 11);
+  f_100_100_111_111_1(uniques, 11);
+  f_100_101_000_001_0(uniques, 11);
+  f_100_101_000_001_1(uniques, 11);
+  f_100_101_000_011_0(uniques, 11);
+  f_100_101_000_011_1(uniques, 11);
+  f_100_101_000_101_0(uniques, 11);
+  f_100_101_000_101_1(uniques, 11);
+  f_100_101_000_111_0(uniques, 11);
+  f_100_101_000_111_1(uniques, 11);
+  f_100_101_001_001_0(uniques, 11);
+  f_100_101_001_001_1(uniques, 11);
+  f_100_101_001_011_0(uniques, 11);
+  f_100_101_001_011_1(uniques, 11);
+  f_100_101_001_101_0(uniques, 11);
+  f_100_101_001_101_1(uniques, 11);
+  f_100_101_001_111_0(uniques, 11);
+  f_100_101_001_111_1(uniques, 11);
+  f_100_101_010_001_0(uniques, 11);
+  f_100_101_010_001_1(uniques, 11);
+  f_100_101_010_011_0(uniques, 11);
+  f_100_101_010_011_1(uniques, 11);
+  f_100_101_010_101_0(uniques, 11);
+  f_100_101_010_101_1(uniques, 11);
+  f_100_101_010_111_0(uniques, 11);
+  f_100_101_010_111_1(uniques, 11);
+  f_100_101_011_001_0(uniques, 11);
+  f_100_101_011_001_1(uniques, 11);
+  f_100_101_011_011_0(uniques, 11);
+  f_100_101_011_011_1(uniques, 11);
+  f_100_101_011_101_0(uniques, 11);
+  f_100_101_011_101_1(uniques, 11);
+  f_100_101_011_111_0(uniques, 11);
+  f_100_101_011_111_1(uniques, 11);
+  f_100_101_100_001_0(uniques, 11);
+  f_100_101_100_001_1(uniques, 11);
+  f_100_101_100_011_0(uniques, 11);
+  f_100_101_100_011_1(uniques, 11);
+  f_100_101_100_101_0(uniques, 11);
+  f_100_101_100_101_1(uniques, 11);
+  f_100_101_100_111_0(uniques, 11);
+  f_100_101_100_111_1(uniques, 11);
+  f_100_101_101_001_0(uniques, 11);
+  f_100_101_101_001_1(uniques, 11);
+  f_100_101_101_011_0(uniques, 11);
+  f_100_101_101_011_1(uniques, 11);
+  f_100_101_101_101_0(uniques, 11);
+  f_100_101_101_101_1(uniques, 11);
+  f_100_101_101_111_0(uniques, 11);
+  f_100_101_101_111_1(uniques, 11);
+  f_100_101_110_001_0(uniques, 11);
+  f_100_101_110_001_1(uniques, 11);
+  f_100_101_110_011_0(uniques, 11);
+  f_100_101_110_011_1(uniques, 11);
+  f_100_101_110_101_0(uniques, 11);
+  f_100_101_110_101_1(uniques, 11);
+  f_100_101_110_111_0(uniques, 11);
+  f_100_101_110_111_1(uniques, 11);
+  f_100_101_111_001_0(uniques, 11);
+  f_100_101_111_001_1(uniques, 11);
+  f_100_101_111_011_0(uniques, 11);
+  f_100_101_111_011_1(uniques, 11);
+  f_100_101_111_101_0(uniques, 11);
+  f_100_101_111_101_1(uniques, 11);
+  f_100_101_111_111_0(uniques, 11);
+  f_100_101_111_111_1(uniques, 11);
+  f_100_110_000_001_0(uniques, 11);
+  f_100_110_000_001_1(uniques, 11);
+  f_100_110_000_011_0(uniques, 11);
+  f_100_110_000_011_1(uniques, 11);
+  f_100_110_000_101_0(uniques, 11);
+  f_100_110_000_101_1(uniques, 11);
+  f_100_110_000_111_0(uniques, 11);
+  f_100_110_000_111_1(uniques, 11);
+  f_100_110_001_001_0(uniques, 11);
+  f_100_110_001_001_1(uniques, 11);
+  f_100_110_001_011_0(uniques, 11);
+  f_100_110_001_011_1(uniques, 11);
+  f_100_110_001_101_0(uniques, 11);
+  f_100_110_001_101_1(uniques, 11);
+  f_100_110_001_111_0(uniques, 11);
+  f_100_110_001_111_1(uniques, 11);
+  f_100_110_010_001_0(uniques, 11);
+  f_100_110_010_001_1(uniques, 11);
+  f_100_110_010_011_0(uniques, 11);
+  f_100_110_010_011_1(uniques, 11);
+  f_100_110_010_101_0(uniques, 11);
+  f_100_110_010_101_1(uniques, 11);
+  f_100_110_010_111_0(uniques, 11);
+  f_100_110_010_111_1(uniques, 11);
+  f_100_110_011_001_0(uniques, 11);
+  f_100_110_011_001_1(uniques, 11);
+  f_100_110_011_011_0(uniques, 11);
+  f_100_110_011_011_1(uniques, 11);
+  f_100_110_011_101_0(uniques, 11);
+  f_100_110_011_101_1(uniques, 11);
+  f_100_110_011_111_0(uniques, 11);
+  f_100_110_011_111_1(uniques, 11);
+  f_100_110_100_001_0(uniques, 11);
+  f_100_110_100_001_1(uniques, 11);
+  f_100_110_100_011_0(uniques, 11);
+  f_100_110_100_011_1(uniques, 11);
+  f_100_110_100_101_0(uniques, 11);
+  f_100_110_100_101_1(uniques, 11);
+  f_100_110_100_111_0(uniques, 11);
+  f_100_110_100_111_1(uniques, 11);
+  f_100_110_101_001_0(uniques, 11);
+  f_100_110_101_001_1(uniques, 11);
+  f_100_110_101_011_0(uniques, 11);
+  f_100_110_101_011_1(uniques, 11);
+  f_100_110_101_101_0(uniques, 11);
+  f_100_110_101_101_1(uniques, 11);
+  f_100_110_101_111_0(uniques, 11);
+  f_100_110_101_111_1(uniques, 11);
+  f_100_110_110_001_0(uniques, 11);
+  f_100_110_110_001_1(uniques, 11);
+  f_100_110_110_011_0(uniques, 11);
+  f_100_110_110_011_1(uniques, 11);
+  f_100_110_110_101_0(uniques, 11);
+  f_100_110_110_101_1(uniques, 11);
+  f_100_110_110_111_0(uniques, 11);
+  f_100_110_110_111_1(uniques, 11);
+  f_100_110_111_001_0(uniques, 11);
+  f_100_110_111_001_1(uniques, 11);
+  f_100_110_111_011_0(uniques, 11);
+  f_100_110_111_011_1(uniques, 11);
+  f_100_110_111_101_0(uniques, 11);
+  f_100_110_111_101_1(uniques, 11);
+  f_100_110_111_111_0(uniques, 11);
+  f_100_110_111_111_1(uniques, 11);
+  f_100_111_000_001_0(uniques, 11);
+  f_100_111_000_001_1(uniques, 11);
+  f_100_111_000_011_0(uniques, 11);
+  f_100_111_000_011_1(uniques, 11);
+  f_100_111_000_101_0(uniques, 11);
+  f_100_111_000_101_1(uniques, 11);
+  f_100_111_000_111_0(uniques, 11);
+  f_100_111_000_111_1(uniques, 11);
+  f_100_111_001_001_0(uniques, 11);
+  f_100_111_001_001_1(uniques, 11);
+  f_100_111_001_011_0(uniques, 11);
+  f_100_111_001_011_1(uniques, 11);
+  f_100_111_001_101_0(uniques, 11);
+  f_100_111_001_101_1(uniques, 11);
+  f_100_111_001_111_0(uniques, 11);
+  f_100_111_001_111_1(uniques, 11);
+  f_100_111_010_001_0(uniques, 11);
+  f_100_111_010_001_1(uniques, 11);
+  f_100_111_010_011_0(uniques, 11);
+  f_100_111_010_011_1(uniques, 11);
+  f_100_111_010_101_0(uniques, 11);
+  f_100_111_010_101_1(uniques, 11);
+  f_100_111_010_111_0(uniques, 11);
+  f_100_111_010_111_1(uniques, 11);
+  f_100_111_011_001_0(uniques, 11);
+  f_100_111_011_001_1(uniques, 11);
+  f_100_111_011_011_0(uniques, 11);
+  f_100_111_011_011_1(uniques, 11);
+  f_100_111_011_101_0(uniques, 11);
+  f_100_111_011_101_1(uniques, 11);
+  f_100_111_011_111_0(uniques, 11);
+  f_100_111_011_111_1(uniques, 11);
+  f_100_111_100_001_0(uniques, 11);
+  f_100_111_100_001_1(uniques, 11);
+  f_100_111_100_011_0(uniques, 11);
+  f_100_111_100_011_1(uniques, 11);
+  f_100_111_100_101_0(uniques, 11);
+  f_100_111_100_101_1(uniques, 11);
+  f_100_111_100_111_0(uniques, 11);
+  f_100_111_100_111_1(uniques, 11);
+  f_100_111_101_001_0(uniques, 11);
+  f_100_111_101_001_1(uniques, 11);
+  f_100_111_101_011_0(uniques, 11);
+  f_100_111_101_011_1(uniques, 11);
+  f_100_111_101_101_0(uniques, 11);
+  f_100_111_101_101_1(uniques, 11);
+  f_100_111_101_111_0(uniques, 11);
+  f_100_111_101_111_1(uniques, 11);
+  f_100_111_110_001_0(uniques, 11);
+  f_100_111_110_001_1(uniques, 11);
+  f_100_111_110_011_0(uniques, 11);
+  f_100_111_110_011_1(uniques, 11);
+  f_100_111_110_101_0(uniques, 11);
+  f_100_111_110_101_1(uniques, 11);
+  f_100_111_110_111_0(uniques, 11);
+  f_100_111_110_111_1(uniques, 11);
+  f_100_111_111_001_0(uniques, 11);
+  f_100_111_111_001_1(uniques, 11);
+  f_100_111_111_011_0(uniques, 11);
+  f_100_111_111_011_1(uniques, 11);
+  f_100_111_111_101_0(uniques, 11);
+  f_100_111_111_101_1(uniques, 11);
+  f_100_111_111_111_0(uniques, 11);
+  f_100_111_111_111_1(uniques, 11);
+  f_101_000_000_001_0(uniques, 11);
+  f_101_000_000_001_1(uniques, 11);
+  f_101_000_000_011_0(uniques, 11);
+  f_101_000_000_011_1(uniques, 11);
+  f_101_000_000_101_0(uniques, 11);
+  f_101_000_000_101_1(uniques, 11);
+  f_101_000_000_111_0(uniques, 11);
+  f_101_000_000_111_1(uniques, 11);
+  f_101_000_001_001_0(uniques, 11);
+  f_101_000_001_001_1(uniques, 11);
+  f_101_000_001_011_0(uniques, 11);
+  f_101_000_001_011_1(uniques, 11);
+  f_101_000_001_101_0(uniques, 11);
+  f_101_000_001_101_1(uniques, 11);
+  f_101_000_001_111_0(uniques, 11);
+  f_101_000_001_111_1(uniques, 11);
+  f_101_000_010_001_0(uniques, 11);
+  f_101_000_010_001_1(uniques, 11);
+  f_101_000_010_011_0(uniques, 11);
+  f_101_000_010_011_1(uniques, 11);
+  f_101_000_010_101_0(uniques, 11);
+  f_101_000_010_101_1(uniques, 11);
+  f_101_000_010_111_0(uniques, 11);
+  f_101_000_010_111_1(uniques, 11);
+  f_101_000_011_001_0(uniques, 11);
+  f_101_000_011_001_1(uniques, 11);
+  f_101_000_011_011_0(uniques, 11);
+  f_101_000_011_011_1(uniques, 11);
+  f_101_000_011_101_0(uniques, 11);
+  f_101_000_011_101_1(uniques, 11);
+  f_101_000_011_111_0(uniques, 11);
+  f_101_000_011_111_1(uniques, 11);
+  f_101_000_100_001_0(uniques, 11);
+  f_101_000_100_001_1(uniques, 11);
+  f_101_000_100_011_0(uniques, 11);
+  f_101_000_100_011_1(uniques, 11);
+  f_101_000_100_101_0(uniques, 11);
+  f_101_000_100_101_1(uniques, 11);
+  f_101_000_100_111_0(uniques, 11);
+  f_101_000_100_111_1(uniques, 11);
+  f_101_000_101_001_0(uniques, 11);
+  f_101_000_101_001_1(uniques, 11);
+  f_101_000_101_011_0(uniques, 11);
+  f_101_000_101_011_1(uniques, 11);
+  f_101_000_101_101_0(uniques, 11);
+  f_101_000_101_101_1(uniques, 11);
+  f_101_000_101_111_0(uniques, 11);
+  f_101_000_101_111_1(uniques, 11);
+  f_101_000_110_001_0(uniques, 11);
+  f_101_000_110_001_1(uniques, 11);
+  f_101_000_110_011_0(uniques, 11);
+  f_101_000_110_011_1(uniques, 11);
+  f_101_000_110_101_0(uniques, 11);
+  f_101_000_110_101_1(uniques, 11);
+  f_101_000_110_111_0(uniques, 11);
+  f_101_000_110_111_1(uniques, 11);
+  f_101_000_111_001_0(uniques, 11);
+  f_101_000_111_001_1(uniques, 11);
+  f_101_000_111_011_0(uniques, 11);
+  f_101_000_111_011_1(uniques, 11);
+  f_101_000_111_101_0(uniques, 11);
+  f_101_000_111_101_1(uniques, 11);
+  f_101_000_111_111_0(uniques, 11);
+  f_101_000_111_111_1(uniques, 11);
+  f_101_001_000_001_0(uniques, 11);
+  f_101_001_000_001_1(uniques, 11);
+  f_101_001_000_011_0(uniques, 11);
+  f_101_001_000_011_1(uniques, 11);
+  f_101_001_000_101_0(uniques, 11);
+  f_101_001_000_101_1(uniques, 11);
+  f_101_001_000_111_0(uniques, 11);
+  f_101_001_000_111_1(uniques, 11);
+  f_101_001_001_001_0(uniques, 11);
+  f_101_001_001_001_1(uniques, 11);
+  f_101_001_001_011_0(uniques, 11);
+  f_101_001_001_011_1(uniques, 11);
+  f_101_001_001_101_0(uniques, 11);
+  f_101_001_001_101_1(uniques, 11);
+  f_101_001_001_111_0(uniques, 11);
+  f_101_001_001_111_1(uniques, 11);
+  f_101_001_010_001_0(uniques, 11);
+  f_101_001_010_001_1(uniques, 11);
+  f_101_001_010_011_0(uniques, 11);
+  f_101_001_010_011_1(uniques, 11);
+  f_101_001_010_101_0(uniques, 11);
+  f_101_001_010_101_1(uniques, 11);
+  f_101_001_010_111_0(uniques, 11);
+  f_101_001_010_111_1(uniques, 11);
+  f_101_001_011_001_0(uniques, 11);
+  f_101_001_011_001_1(uniques, 11);
+  f_101_001_011_011_0(uniques, 11);
+  f_101_001_011_011_1(uniques, 11);
+  f_101_001_011_101_0(uniques, 11);
+  f_101_001_011_101_1(uniques, 11);
+  f_101_001_011_111_0(uniques, 11);
+  f_101_001_011_111_1(uniques, 11);
+  f_101_001_100_001_0(uniques, 11);
+  f_101_001_100_001_1(uniques, 11);
+  f_101_001_100_011_0(uniques, 11);
+  f_101_001_100_011_1(uniques, 11);
+  f_101_001_100_101_0(uniques, 11);
+  f_101_001_100_101_1(uniques, 11);
+  f_101_001_100_111_0(uniques, 11);
+  f_101_001_100_111_1(uniques, 11);
+  f_101_001_101_001_0(uniques, 11);
+  f_101_001_101_001_1(uniques, 11);
+  f_101_001_101_011_0(uniques, 11);
+  f_101_001_101_011_1(uniques, 11);
+  f_101_001_101_101_0(uniques, 11);
+  f_101_001_101_101_1(uniques, 11);
+  f_101_001_101_111_0(uniques, 11);
+  f_101_001_101_111_1(uniques, 11);
+  f_101_001_110_001_0(uniques, 11);
+  f_101_001_110_001_1(uniques, 11);
+  f_101_001_110_011_0(uniques, 11);
+  f_101_001_110_011_1(uniques, 11);
+  f_101_001_110_101_0(uniques, 11);
+  f_101_001_110_101_1(uniques, 11);
+  f_101_001_110_111_0(uniques, 11);
+  f_101_001_110_111_1(uniques, 11);
+  f_101_001_111_001_0(uniques, 11);
+  f_101_001_111_001_1(uniques, 11);
+  f_101_001_111_011_0(uniques, 11);
+  f_101_001_111_011_1(uniques, 11);
+  f_101_001_111_101_0(uniques, 11);
+  f_101_001_111_101_1(uniques, 11);
+  f_101_001_111_111_0(uniques, 11);
+  f_101_001_111_111_1(uniques, 11);
+  f_101_010_000_001_0(uniques, 11);
+  f_101_010_000_001_1(uniques, 11);
+  f_101_010_000_011_0(uniques, 11);
+  f_101_010_000_011_1(uniques, 11);
+  f_101_010_000_101_0(uniques, 11);
+  f_101_010_000_101_1(uniques, 11);
+  f_101_010_000_111_0(uniques, 11);
+  f_101_010_000_111_1(uniques, 11);
+  f_101_010_001_001_0(uniques, 11);
+  f_101_010_001_001_1(uniques, 11);
+  f_101_010_001_011_0(uniques, 11);
+  f_101_010_001_011_1(uniques, 11);
+  f_101_010_001_101_0(uniques, 11);
+  f_101_010_001_101_1(uniques, 11);
+  f_101_010_001_111_0(uniques, 11);
+  f_101_010_001_111_1(uniques, 11);
+  f_101_010_010_001_0(uniques, 11);
+  f_101_010_010_001_1(uniques, 11);
+  f_101_010_010_011_0(uniques, 11);
+  f_101_010_010_011_1(uniques, 11);
+  f_101_010_010_101_0(uniques, 11);
+  f_101_010_010_101_1(uniques, 11);
+  f_101_010_010_111_0(uniques, 11);
+  f_101_010_010_111_1(uniques, 11);
+  f_101_010_011_001_0(uniques, 11);
+  f_101_010_011_001_1(uniques, 11);
+  f_101_010_011_011_0(uniques, 11);
+  f_101_010_011_011_1(uniques, 11);
+  f_101_010_011_101_0(uniques, 11);
+  f_101_010_011_101_1(uniques, 11);
+  f_101_010_011_111_0(uniques, 11);
+  f_101_010_011_111_1(uniques, 11);
+  f_101_010_100_001_0(uniques, 11);
+  f_101_010_100_001_1(uniques, 11);
+  f_101_010_100_011_0(uniques, 11);
+  f_101_010_100_011_1(uniques, 11);
+  f_101_010_100_101_0(uniques, 11);
+  f_101_010_100_101_1(uniques, 11);
+  f_101_010_100_111_0(uniques, 11);
+  f_101_010_100_111_1(uniques, 11);
+  f_101_010_101_001_0(uniques, 11);
+  f_101_010_101_001_1(uniques, 11);
+  f_101_010_101_011_0(uniques, 11);
+  f_101_010_101_011_1(uniques, 11);
+  f_101_010_101_101_0(uniques, 11);
+  f_101_010_101_101_1(uniques, 11);
+  f_101_010_101_111_0(uniques, 11);
+  f_101_010_101_111_1(uniques, 11);
+  f_101_010_110_001_0(uniques, 11);
+  f_101_010_110_001_1(uniques, 11);
+  f_101_010_110_011_0(uniques, 11);
+  f_101_010_110_011_1(uniques, 11);
+  f_101_010_110_101_0(uniques, 11);
+  f_101_010_110_101_1(uniques, 11);
+  f_101_010_110_111_0(uniques, 11);
+  f_101_010_110_111_1(uniques, 11);
+  f_101_010_111_001_0(uniques, 11);
+  f_101_010_111_001_1(uniques, 11);
+  f_101_010_111_011_0(uniques, 11);
+  f_101_010_111_011_1(uniques, 11);
+  f_101_010_111_101_0(uniques, 11);
+  f_101_010_111_101_1(uniques, 11);
+  f_101_010_111_111_0(uniques, 11);
+  f_101_010_111_111_1(uniques, 11);
+  f_101_011_000_001_0(uniques, 11);
+  f_101_011_000_001_1(uniques, 11);
+  f_101_011_000_011_0(uniques, 11);
+  f_101_011_000_011_1(uniques, 11);
+  f_101_011_000_101_0(uniques, 11);
+  f_101_011_000_101_1(uniques, 11);
+  f_101_011_000_111_0(uniques, 11);
+  f_101_011_000_111_1(uniques, 11);
+  f_101_011_001_001_0(uniques, 11);
+  f_101_011_001_001_1(uniques, 11);
+  f_101_011_001_011_0(uniques, 11);
+  f_101_011_001_011_1(uniques, 11);
+  f_101_011_001_101_0(uniques, 11);
+  f_101_011_001_101_1(uniques, 11);
+  f_101_011_001_111_0(uniques, 11);
+  f_101_011_001_111_1(uniques, 11);
+  f_101_011_010_001_0(uniques, 11);
+  f_101_011_010_001_1(uniques, 11);
+  f_101_011_010_011_0(uniques, 11);
+  f_101_011_010_011_1(uniques, 11);
+  f_101_011_010_101_0(uniques, 11);
+  f_101_011_010_101_1(uniques, 11);
+  f_101_011_010_111_0(uniques, 11);
+  f_101_011_010_111_1(uniques, 11);
+  f_101_011_011_001_0(uniques, 11);
+  f_101_011_011_001_1(uniques, 11);
+  f_101_011_011_011_0(uniques, 11);
+  f_101_011_011_011_1(uniques, 11);
+  f_101_011_011_101_0(uniques, 11);
+  f_101_011_011_101_1(uniques, 11);
+  f_101_011_011_111_0(uniques, 11);
+  f_101_011_011_111_1(uniques, 11);
+  f_101_011_100_001_0(uniques, 11);
+  f_101_011_100_001_1(uniques, 11);
+  f_101_011_100_011_0(uniques, 11);
+  f_101_011_100_011_1(uniques, 11);
+  f_101_011_100_101_0(uniques, 11);
+  f_101_011_100_101_1(uniques, 11);
+  f_101_011_100_111_0(uniques, 11);
+  f_101_011_100_111_1(uniques, 11);
+  f_101_011_101_001_0(uniques, 11);
+  f_101_011_101_001_1(uniques, 11);
+  f_101_011_101_011_0(uniques, 11);
+  f_101_011_101_011_1(uniques, 11);
+  f_101_011_101_101_0(uniques, 11);
+  f_101_011_101_101_1(uniques, 11);
+  f_101_011_101_111_0(uniques, 11);
+  f_101_011_101_111_1(uniques, 11);
+  f_101_011_110_001_0(uniques, 11);
+  f_101_011_110_001_1(uniques, 11);
+  f_101_011_110_011_0(uniques, 11);
+  f_101_011_110_011_1(uniques, 11);
+  f_101_011_110_101_0(uniques, 11);
+  f_101_011_110_101_1(uniques, 11);
+  f_101_011_110_111_0(uniques, 11);
+  f_101_011_110_111_1(uniques, 11);
+  f_101_011_111_001_0(uniques, 11);
+  f_101_011_111_001_1(uniques, 11);
+  f_101_011_111_011_0(uniques, 11);
+  f_101_011_111_011_1(uniques, 11);
+  f_101_011_111_101_0(uniques, 11);
+  f_101_011_111_101_1(uniques, 11);
+  f_101_011_111_111_0(uniques, 11);
+  f_101_011_111_111_1(uniques, 11);
+  f_101_100_000_001_0(uniques, 11);
+  f_101_100_000_001_1(uniques, 11);
+  f_101_100_000_011_0(uniques, 11);
+  f_101_100_000_011_1(uniques, 11);
+  f_101_100_000_101_0(uniques, 11);
+  f_101_100_000_101_1(uniques, 11);
+  f_101_100_000_111_0(uniques, 11);
+  f_101_100_000_111_1(uniques, 11);
+  f_101_100_001_001_0(uniques, 11);
+  f_101_100_001_001_1(uniques, 11);
+  f_101_100_001_011_0(uniques, 11);
+  f_101_100_001_011_1(uniques, 11);
+  f_101_100_001_101_0(uniques, 11);
+  f_101_100_001_101_1(uniques, 11);
+  f_101_100_001_111_0(uniques, 11);
+  f_101_100_001_111_1(uniques, 11);
+  f_101_100_010_001_0(uniques, 11);
+  f_101_100_010_001_1(uniques, 11);
+  f_101_100_010_011_0(uniques, 11);
+  f_101_100_010_011_1(uniques, 11);
+  f_101_100_010_101_0(uniques, 11);
+  f_101_100_010_101_1(uniques, 11);
+  f_101_100_010_111_0(uniques, 11);
+  f_101_100_010_111_1(uniques, 11);
+  f_101_100_011_001_0(uniques, 11);
+  f_101_100_011_001_1(uniques, 11);
+  f_101_100_011_011_0(uniques, 11);
+  f_101_100_011_011_1(uniques, 11);
+  f_101_100_011_101_0(uniques, 11);
+  f_101_100_011_101_1(uniques, 11);
+  f_101_100_011_111_0(uniques, 11);
+  f_101_100_011_111_1(uniques, 11);
+  f_101_100_100_001_0(uniques, 11);
+  f_101_100_100_001_1(uniques, 11);
+  f_101_100_100_011_0(uniques, 11);
+  f_101_100_100_011_1(uniques, 11);
+  f_101_100_100_101_0(uniques, 11);
+  f_101_100_100_101_1(uniques, 11);
+  f_101_100_100_111_0(uniques, 11);
+  f_101_100_100_111_1(uniques, 11);
+  f_101_100_101_001_0(uniques, 11);
+  f_101_100_101_001_1(uniques, 11);
+  f_101_100_101_011_0(uniques, 11);
+  f_101_100_101_011_1(uniques, 11);
+  f_101_100_101_101_0(uniques, 11);
+  f_101_100_101_101_1(uniques, 11);
+  f_101_100_101_111_0(uniques, 11);
+  f_101_100_101_111_1(uniques, 11);
+  f_101_100_110_001_0(uniques, 11);
+  f_101_100_110_001_1(uniques, 11);
+  f_101_100_110_011_0(uniques, 11);
+  f_101_100_110_011_1(uniques, 11);
+  f_101_100_110_101_0(uniques, 11);
+  f_101_100_110_101_1(uniques, 11);
+  f_101_100_110_111_0(uniques, 11);
+  f_101_100_110_111_1(uniques, 11);
+  f_101_100_111_001_0(uniques, 11);
+  f_101_100_111_001_1(uniques, 11);
+  f_101_100_111_011_0(uniques, 11);
+  f_101_100_111_011_1(uniques, 11);
+  f_101_100_111_101_0(uniques, 11);
+  f_101_100_111_101_1(uniques, 11);
+  f_101_100_111_111_0(uniques, 11);
+  f_101_100_111_111_1(uniques, 11);
+  f_101_101_000_001_0(uniques, 11);
+  f_101_101_000_001_1(uniques, 11);
+  f_101_101_000_011_0(uniques, 11);
+  f_101_101_000_011_1(uniques, 11);
+  f_101_101_000_101_0(uniques, 11);
+  f_101_101_000_101_1(uniques, 11);
+  f_101_101_000_111_0(uniques, 11);
+  f_101_101_000_111_1(uniques, 11);
+  f_101_101_001_001_0(uniques, 11);
+  f_101_101_001_001_1(uniques, 11);
+  f_101_101_001_011_0(uniques, 11);
+  f_101_101_001_011_1(uniques, 11);
+  f_101_101_001_101_0(uniques, 11);
+  f_101_101_001_101_1(uniques, 11);
+  f_101_101_001_111_0(uniques, 11);
+  f_101_101_001_111_1(uniques, 11);
+  f_101_101_010_001_0(uniques, 11);
+  f_101_101_010_001_1(uniques, 11);
+  f_101_101_010_011_0(uniques, 11);
+  f_101_101_010_011_1(uniques, 11);
+  f_101_101_010_101_0(uniques, 11);
+  f_101_101_010_101_1(uniques, 11);
+  f_101_101_010_111_0(uniques, 11);
+  f_101_101_010_111_1(uniques, 11);
+  f_101_101_011_001_0(uniques, 11);
+  f_101_101_011_001_1(uniques, 11);
+  f_101_101_011_011_0(uniques, 11);
+  f_101_101_011_011_1(uniques, 11);
+  f_101_101_011_101_0(uniques, 11);
+  f_101_101_011_101_1(uniques, 11);
+  f_101_101_011_111_0(uniques, 11);
+  f_101_101_011_111_1(uniques, 11);
+  f_101_101_100_001_0(uniques, 11);
+  f_101_101_100_001_1(uniques, 11);
+  f_101_101_100_011_0(uniques, 11);
+  f_101_101_100_011_1(uniques, 11);
+  f_101_101_100_101_0(uniques, 11);
+  f_101_101_100_101_1(uniques, 11);
+  f_101_101_100_111_0(uniques, 11);
+  f_101_101_100_111_1(uniques, 11);
+  f_101_101_101_001_0(uniques, 11);
+  f_101_101_101_001_1(uniques, 11);
+  f_101_101_101_011_0(uniques, 11);
+  f_101_101_101_011_1(uniques, 11);
+  f_101_101_101_101_0(uniques, 11);
+  f_101_101_101_101_1(uniques, 11);
+  f_101_101_101_111_0(uniques, 11);
+  f_101_101_101_111_1(uniques, 11);
+  f_101_101_110_001_0(uniques, 11);
+  f_101_101_110_001_1(uniques, 11);
+  f_101_101_110_011_0(uniques, 11);
+  f_101_101_110_011_1(uniques, 11);
+  f_101_101_110_101_0(uniques, 11);
+  f_101_101_110_101_1(uniques, 11);
+  f_101_101_110_111_0(uniques, 11);
+  f_101_101_110_111_1(uniques, 11);
+  f_101_101_111_001_0(uniques, 11);
+  f_101_101_111_001_1(uniques, 11);
+  f_101_101_111_011_0(uniques, 11);
+  f_101_101_111_011_1(uniques, 11);
+  f_101_101_111_101_0(uniques, 11);
+  f_101_101_111_101_1(uniques, 11);
+  f_101_101_111_111_0(uniques, 11);
+  f_101_101_111_111_1(uniques, 11);
+  f_101_110_000_001_0(uniques, 11);
+  f_101_110_000_001_1(uniques, 11);
+  f_101_110_000_011_0(uniques, 11);
+  f_101_110_000_011_1(uniques, 11);
+  f_101_110_000_101_0(uniques, 11);
+  f_101_110_000_101_1(uniques, 11);
+  f_101_110_000_111_0(uniques, 11);
+  f_101_110_000_111_1(uniques, 11);
+  f_101_110_001_001_0(uniques, 11);
+  f_101_110_001_001_1(uniques, 11);
+  f_101_110_001_011_0(uniques, 11);
+  f_101_110_001_011_1(uniques, 11);
+  f_101_110_001_101_0(uniques, 11);
+  f_101_110_001_101_1(uniques, 11);
+  f_101_110_001_111_0(uniques, 11);
+  f_101_110_001_111_1(uniques, 11);
+  f_101_110_010_001_0(uniques, 11);
+  f_101_110_010_001_1(uniques, 11);
+  f_101_110_010_011_0(uniques, 11);
+  f_101_110_010_011_1(uniques, 11);
+  f_101_110_010_101_0(uniques, 11);
+  f_101_110_010_101_1(uniques, 11);
+  f_101_110_010_111_0(uniques, 11);
+  f_101_110_010_111_1(uniques, 11);
+  f_101_110_011_001_0(uniques, 11);
+  f_101_110_011_001_1(uniques, 11);
+  f_101_110_011_011_0(uniques, 11);
+  f_101_110_011_011_1(uniques, 11);
+  f_101_110_011_101_0(uniques, 11);
+  f_101_110_011_101_1(uniques, 11);
+  f_101_110_011_111_0(uniques, 11);
+  f_101_110_011_111_1(uniques, 11);
+  f_101_110_100_001_0(uniques, 11);
+  f_101_110_100_001_1(uniques, 11);
+  f_101_110_100_011_0(uniques, 11);
+  f_101_110_100_011_1(uniques, 11);
+  f_101_110_100_101_0(uniques, 11);
+  f_101_110_100_101_1(uniques, 11);
+  f_101_110_100_111_0(uniques, 11);
+  f_101_110_100_111_1(uniques, 11);
+  f_101_110_101_001_0(uniques, 11);
+  f_101_110_101_001_1(uniques, 11);
+  f_101_110_101_011_0(uniques, 11);
+  f_101_110_101_011_1(uniques, 11);
+  f_101_110_101_101_0(uniques, 11);
+  f_101_110_101_101_1(uniques, 11);
+  f_101_110_101_111_0(uniques, 11);
+  f_101_110_101_111_1(uniques, 11);
+  f_101_110_110_001_0(uniques, 11);
+  f_101_110_110_001_1(uniques, 11);
+  f_101_110_110_011_0(uniques, 11);
+  f_101_110_110_011_1(uniques, 11);
+  f_101_110_110_101_0(uniques, 11);
+  f_101_110_110_101_1(uniques, 11);
+  f_101_110_110_111_0(uniques, 11);
+  f_101_110_110_111_1(uniques, 11);
+  f_101_110_111_001_0(uniques, 11);
+  f_101_110_111_001_1(uniques, 11);
+  f_101_110_111_011_0(uniques, 11);
+  f_101_110_111_011_1(uniques, 11);
+  f_101_110_111_101_0(uniques, 11);
+  f_101_110_111_101_1(uniques, 11);
+  f_101_110_111_111_0(uniques, 11);
+  f_101_110_111_111_1(uniques, 11);
+  f_101_111_000_001_0(uniques, 11);
+  f_101_111_000_001_1(uniques, 11);
+  f_101_111_000_011_0(uniques, 11);
+  f_101_111_000_011_1(uniques, 11);
+  f_101_111_000_101_0(uniques, 11);
+  f_101_111_000_101_1(uniques, 11);
+  f_101_111_000_111_0(uniques, 11);
+  f_101_111_000_111_1(uniques, 11);
+  f_101_111_001_001_0(uniques, 11);
+  f_101_111_001_001_1(uniques, 11);
+  f_101_111_001_011_0(uniques, 11);
+  f_101_111_001_011_1(uniques, 11);
+  f_101_111_001_101_0(uniques, 11);
+  f_101_111_001_101_1(uniques, 11);
+  f_101_111_001_111_0(uniques, 11);
+  f_101_111_001_111_1(uniques, 11);
+  f_101_111_010_001_0(uniques, 11);
+  f_101_111_010_001_1(uniques, 11);
+  f_101_111_010_011_0(uniques, 11);
+  f_101_111_010_011_1(uniques, 11);
+  f_101_111_010_101_0(uniques, 11);
+  f_101_111_010_101_1(uniques, 11);
+  f_101_111_010_111_0(uniques, 11);
+  f_101_111_010_111_1(uniques, 11);
+  f_101_111_011_001_0(uniques, 11);
+  f_101_111_011_001_1(uniques, 11);
+  f_101_111_011_011_0(uniques, 11);
+  f_101_111_011_011_1(uniques, 11);
+  f_101_111_011_101_0(uniques, 11);
+  f_101_111_011_101_1(uniques, 11);
+  f_101_111_011_111_0(uniques, 11);
+  f_101_111_011_111_1(uniques, 11);
+  f_101_111_100_001_0(uniques, 11);
+  f_101_111_100_001_1(uniques, 11);
+  f_101_111_100_011_0(uniques, 11);
+  f_101_111_100_011_1(uniques, 11);
+  f_101_111_100_101_0(uniques, 11);
+  f_101_111_100_101_1(uniques, 11);
+  f_101_111_100_111_0(uniques, 11);
+  f_101_111_100_111_1(uniques, 11);
+  f_101_111_101_001_0(uniques, 11);
+  f_101_111_101_001_1(uniques, 11);
+  f_101_111_101_011_0(uniques, 11);
+  f_101_111_101_011_1(uniques, 11);
+  f_101_111_101_101_0(uniques, 11);
+  f_101_111_101_101_1(uniques, 11);
+  f_101_111_101_111_0(uniques, 11);
+  f_101_111_101_111_1(uniques, 11);
+  f_101_111_110_001_0(uniques, 11);
+  f_101_111_110_001_1(uniques, 11);
+  f_101_111_110_011_0(uniques, 11);
+  f_101_111_110_011_1(uniques, 11);
+  f_101_111_110_101_0(uniques, 11);
+  f_101_111_110_101_1(uniques, 11);
+  f_101_111_110_111_0(uniques, 11);
+  f_101_111_110_111_1(uniques, 11);
+  f_101_111_111_001_0(uniques, 11);
+  f_101_111_111_001_1(uniques, 11);
+  f_101_111_111_011_0(uniques, 11);
+  f_101_111_111_011_1(uniques, 11);
+  f_101_111_111_101_0(uniques, 11);
+  f_101_111_111_101_1(uniques, 11);
+  f_101_111_111_111_0(uniques, 11);
+  f_101_111_111_111_1(uniques, 11);
+  f_110_000_000_001_0(uniques, 11);
+  f_110_000_000_001_1(uniques, 11);
+  f_110_000_000_011_0(uniques, 11);
+  f_110_000_000_011_1(uniques, 11);
+  f_110_000_000_101_0(uniques, 11);
+  f_110_000_000_101_1(uniques, 11);
+  f_110_000_000_111_0(uniques, 11);
+  f_110_000_000_111_1(uniques, 11);
+  f_110_000_001_001_0(uniques, 11);
+  f_110_000_001_001_1(uniques, 11);
+  f_110_000_001_011_0(uniques, 11);
+  f_110_000_001_011_1(uniques, 11);
+  f_110_000_001_101_0(uniques, 11);
+  f_110_000_001_101_1(uniques, 11);
+  f_110_000_001_111_0(uniques, 11);
+  f_110_000_001_111_1(uniques, 11);
+  f_110_000_010_001_0(uniques, 11);
+  f_110_000_010_001_1(uniques, 11);
+  f_110_000_010_011_0(uniques, 11);
+  f_110_000_010_011_1(uniques, 11);
+  f_110_000_010_101_0(uniques, 11);
+  f_110_000_010_101_1(uniques, 11);
+  f_110_000_010_111_0(uniques, 11);
+  f_110_000_010_111_1(uniques, 11);
+  f_110_000_011_001_0(uniques, 11);
+  f_110_000_011_001_1(uniques, 11);
+  f_110_000_011_011_0(uniques, 11);
+  f_110_000_011_011_1(uniques, 11);
+  f_110_000_011_101_0(uniques, 11);
+  f_110_000_011_101_1(uniques, 11);
+  f_110_000_011_111_0(uniques, 11);
+  f_110_000_011_111_1(uniques, 11);
+  f_110_000_100_001_0(uniques, 11);
+  f_110_000_100_001_1(uniques, 11);
+  f_110_000_100_011_0(uniques, 11);
+  f_110_000_100_011_1(uniques, 11);
+  f_110_000_100_101_0(uniques, 11);
+  f_110_000_100_101_1(uniques, 11);
+  f_110_000_100_111_0(uniques, 11);
+  f_110_000_100_111_1(uniques, 11);
+  f_110_000_101_001_0(uniques, 11);
+  f_110_000_101_001_1(uniques, 11);
+  f_110_000_101_011_0(uniques, 11);
+  f_110_000_101_011_1(uniques, 11);
+  f_110_000_101_101_0(uniques, 11);
+  f_110_000_101_101_1(uniques, 11);
+  f_110_000_101_111_0(uniques, 11);
+  f_110_000_101_111_1(uniques, 11);
+  f_110_000_110_001_0(uniques, 11);
+  f_110_000_110_001_1(uniques, 11);
+  f_110_000_110_011_0(uniques, 11);
+  f_110_000_110_011_1(uniques, 11);
+  f_110_000_110_101_0(uniques, 11);
+  f_110_000_110_101_1(uniques, 11);
+  f_110_000_110_111_0(uniques, 11);
+  f_110_000_110_111_1(uniques, 11);
+  f_110_000_111_001_0(uniques, 11);
+  f_110_000_111_001_1(uniques, 11);
+  f_110_000_111_011_0(uniques, 11);
+  f_110_000_111_011_1(uniques, 11);
+  f_110_000_111_101_0(uniques, 11);
+  f_110_000_111_101_1(uniques, 11);
+  f_110_000_111_111_0(uniques, 11);
+  f_110_000_111_111_1(uniques, 11);
+  f_110_001_000_001_0(uniques, 11);
+  f_110_001_000_001_1(uniques, 11);
+  f_110_001_000_011_0(uniques, 11);
+  f_110_001_000_011_1(uniques, 11);
+  f_110_001_000_101_0(uniques, 11);
+  f_110_001_000_101_1(uniques, 11);
+  f_110_001_000_111_0(uniques, 11);
+  f_110_001_000_111_1(uniques, 11);
+  f_110_001_001_001_0(uniques, 11);
+  f_110_001_001_001_1(uniques, 11);
+  f_110_001_001_011_0(uniques, 11);
+  f_110_001_001_011_1(uniques, 11);
+  f_110_001_001_101_0(uniques, 11);
+  f_110_001_001_101_1(uniques, 11);
+  f_110_001_001_111_0(uniques, 11);
+  f_110_001_001_111_1(uniques, 11);
+  f_110_001_010_001_0(uniques, 11);
+  f_110_001_010_001_1(uniques, 11);
+  f_110_001_010_011_0(uniques, 11);
+  f_110_001_010_011_1(uniques, 11);
+  f_110_001_010_101_0(uniques, 11);
+  f_110_001_010_101_1(uniques, 11);
+  f_110_001_010_111_0(uniques, 11);
+  f_110_001_010_111_1(uniques, 11);
+  f_110_001_011_001_0(uniques, 11);
+  f_110_001_011_001_1(uniques, 11);
+  f_110_001_011_011_0(uniques, 11);
+  f_110_001_011_011_1(uniques, 11);
+  f_110_001_011_101_0(uniques, 11);
+  f_110_001_011_101_1(uniques, 11);
+  f_110_001_011_111_0(uniques, 11);
+  f_110_001_011_111_1(uniques, 11);
+  f_110_001_100_001_0(uniques, 11);
+  f_110_001_100_001_1(uniques, 11);
+  f_110_001_100_011_0(uniques, 11);
+  f_110_001_100_011_1(uniques, 11);
+  f_110_001_100_101_0(uniques, 11);
+  f_110_001_100_101_1(uniques, 11);
+  f_110_001_100_111_0(uniques, 11);
+  f_110_001_100_111_1(uniques, 11);
+  f_110_001_101_001_0(uniques, 11);
+  f_110_001_101_001_1(uniques, 11);
+  f_110_001_101_011_0(uniques, 11);
+  f_110_001_101_011_1(uniques, 11);
+  f_110_001_101_101_0(uniques, 11);
+  f_110_001_101_101_1(uniques, 11);
+  f_110_001_101_111_0(uniques, 11);
+  f_110_001_101_111_1(uniques, 11);
+  f_110_001_110_001_0(uniques, 11);
+  f_110_001_110_001_1(uniques, 11);
+  f_110_001_110_011_0(uniques, 11);
+  f_110_001_110_011_1(uniques, 11);
+  f_110_001_110_101_0(uniques, 11);
+  f_110_001_110_101_1(uniques, 11);
+  f_110_001_110_111_0(uniques, 11);
+  f_110_001_110_111_1(uniques, 11);
+  f_110_001_111_001_0(uniques, 11);
+  f_110_001_111_001_1(uniques, 11);
+  f_110_001_111_011_0(uniques, 11);
+  f_110_001_111_011_1(uniques, 11);
+  f_110_001_111_101_0(uniques, 11);
+  f_110_001_111_101_1(uniques, 11);
+  f_110_001_111_111_0(uniques, 11);
+  f_110_001_111_111_1(uniques, 11);
+  f_110_010_000_001_0(uniques, 11);
+  f_110_010_000_001_1(uniques, 11);
+  f_110_010_000_011_0(uniques, 11);
+  f_110_010_000_011_1(uniques, 11);
+  f_110_010_000_101_0(uniques, 11);
+  f_110_010_000_101_1(uniques, 11);
+  f_110_010_000_111_0(uniques, 11);
+  f_110_010_000_111_1(uniques, 11);
+  f_110_010_001_001_0(uniques, 11);
+  f_110_010_001_001_1(uniques, 11);
+  f_110_010_001_011_0(uniques, 11);
+  f_110_010_001_011_1(uniques, 11);
+  f_110_010_001_101_0(uniques, 11);
+  f_110_010_001_101_1(uniques, 11);
+  f_110_010_001_111_0(uniques, 11);
+  f_110_010_001_111_1(uniques, 11);
+  f_110_010_010_001_0(uniques, 11);
+  f_110_010_010_001_1(uniques, 11);
+  f_110_010_010_011_0(uniques, 11);
+  f_110_010_010_011_1(uniques, 11);
+  f_110_010_010_101_0(uniques, 11);
+  f_110_010_010_101_1(uniques, 11);
+  f_110_010_010_111_0(uniques, 11);
+  f_110_010_010_111_1(uniques, 11);
+  f_110_010_011_001_0(uniques, 11);
+  f_110_010_011_001_1(uniques, 11);
+  f_110_010_011_011_0(uniques, 11);
+  f_110_010_011_011_1(uniques, 11);
+  f_110_010_011_101_0(uniques, 11);
+  f_110_010_011_101_1(uniques, 11);
+  f_110_010_011_111_0(uniques, 11);
+  f_110_010_011_111_1(uniques, 11);
+  f_110_010_100_001_0(uniques, 11);
+  f_110_010_100_001_1(uniques, 11);
+  f_110_010_100_011_0(uniques, 11);
+  f_110_010_100_011_1(uniques, 11);
+  f_110_010_100_101_0(uniques, 11);
+  f_110_010_100_101_1(uniques, 11);
+  f_110_010_100_111_0(uniques, 11);
+  f_110_010_100_111_1(uniques, 11);
+  f_110_010_101_001_0(uniques, 11);
+  f_110_010_101_001_1(uniques, 11);
+  f_110_010_101_011_0(uniques, 11);
+  f_110_010_101_011_1(uniques, 11);
+  f_110_010_101_101_0(uniques, 11);
+  f_110_010_101_101_1(uniques, 11);
+  f_110_010_101_111_0(uniques, 11);
+  f_110_010_101_111_1(uniques, 11);
+  f_110_010_110_001_0(uniques, 11);
+  f_110_010_110_001_1(uniques, 11);
+  f_110_010_110_011_0(uniques, 11);
+  f_110_010_110_011_1(uniques, 11);
+  f_110_010_110_101_0(uniques, 11);
+  f_110_010_110_101_1(uniques, 11);
+  f_110_010_110_111_0(uniques, 11);
+  f_110_010_110_111_1(uniques, 11);
+  f_110_010_111_001_0(uniques, 11);
+  f_110_010_111_001_1(uniques, 11);
+  f_110_010_111_011_0(uniques, 11);
+  f_110_010_111_011_1(uniques, 11);
+  f_110_010_111_101_0(uniques, 11);
+  f_110_010_111_101_1(uniques, 11);
+  f_110_010_111_111_0(uniques, 11);
+  f_110_010_111_111_1(uniques, 11);
+  f_110_011_000_001_0(uniques, 11);
+  f_110_011_000_001_1(uniques, 11);
+  f_110_011_000_011_0(uniques, 11);
+  f_110_011_000_011_1(uniques, 11);
+  f_110_011_000_101_0(uniques, 11);
+  f_110_011_000_101_1(uniques, 11);
+  f_110_011_000_111_0(uniques, 11);
+  f_110_011_000_111_1(uniques, 11);
+  f_110_011_001_001_0(uniques, 11);
+  f_110_011_001_001_1(uniques, 11);
+  f_110_011_001_011_0(uniques, 11);
+  f_110_011_001_011_1(uniques, 11);
+  f_110_011_001_101_0(uniques, 11);
+  f_110_011_001_101_1(uniques, 11);
+  f_110_011_001_111_0(uniques, 11);
+  f_110_011_001_111_1(uniques, 11);
+  f_110_011_010_001_0(uniques, 11);
+  f_110_011_010_001_1(uniques, 11);
+  f_110_011_010_011_0(uniques, 11);
+  f_110_011_010_011_1(uniques, 11);
+  f_110_011_010_101_0(uniques, 11);
+  f_110_011_010_101_1(uniques, 11);
+  f_110_011_010_111_0(uniques, 11);
+  f_110_011_010_111_1(uniques, 11);
+  f_110_011_011_001_0(uniques, 11);
+  f_110_011_011_001_1(uniques, 11);
+  f_110_011_011_011_0(uniques, 11);
+  f_110_011_011_011_1(uniques, 11);
+  f_110_011_011_101_0(uniques, 11);
+  f_110_011_011_101_1(uniques, 11);
+  f_110_011_011_111_0(uniques, 11);
+  f_110_011_011_111_1(uniques, 11);
+  f_110_011_100_001_0(uniques, 11);
+  f_110_011_100_001_1(uniques, 11);
+  f_110_011_100_011_0(uniques, 11);
+  f_110_011_100_011_1(uniques, 11);
+  f_110_011_100_101_0(uniques, 11);
+  f_110_011_100_101_1(uniques, 11);
+  f_110_011_100_111_0(uniques, 11);
+  f_110_011_100_111_1(uniques, 11);
+  f_110_011_101_001_0(uniques, 11);
+  f_110_011_101_001_1(uniques, 11);
+  f_110_011_101_011_0(uniques, 11);
+  f_110_011_101_011_1(uniques, 11);
+  f_110_011_101_101_0(uniques, 11);
+  f_110_011_101_101_1(uniques, 11);
+  f_110_011_101_111_0(uniques, 11);
+  f_110_011_101_111_1(uniques, 11);
+  f_110_011_110_001_0(uniques, 11);
+  f_110_011_110_001_1(uniques, 11);
+  f_110_011_110_011_0(uniques, 11);
+  f_110_011_110_011_1(uniques, 11);
+  f_110_011_110_101_0(uniques, 11);
+  f_110_011_110_101_1(uniques, 11);
+  f_110_011_110_111_0(uniques, 11);
+  f_110_011_110_111_1(uniques, 11);
+  f_110_011_111_001_0(uniques, 11);
+  f_110_011_111_001_1(uniques, 11);
+  f_110_011_111_011_0(uniques, 11);
+  f_110_011_111_011_1(uniques, 11);
+  f_110_011_111_101_0(uniques, 11);
+  f_110_011_111_101_1(uniques, 11);
+  f_110_011_111_111_0(uniques, 11);
+  f_110_011_111_111_1(uniques, 11);
+  f_110_100_000_001_0(uniques, 11);
+  f_110_100_000_001_1(uniques, 11);
+  f_110_100_000_011_0(uniques, 11);
+  f_110_100_000_011_1(uniques, 11);
+  f_110_100_000_101_0(uniques, 11);
+  f_110_100_000_101_1(uniques, 11);
+  f_110_100_000_111_0(uniques, 11);
+  f_110_100_000_111_1(uniques, 11);
+  f_110_100_001_001_0(uniques, 11);
+  f_110_100_001_001_1(uniques, 11);
+  f_110_100_001_011_0(uniques, 11);
+  f_110_100_001_011_1(uniques, 11);
+  f_110_100_001_101_0(uniques, 11);
+  f_110_100_001_101_1(uniques, 11);
+  f_110_100_001_111_0(uniques, 11);
+  f_110_100_001_111_1(uniques, 11);
+  f_110_100_010_001_0(uniques, 11);
+  f_110_100_010_001_1(uniques, 11);
+  f_110_100_010_011_0(uniques, 11);
+  f_110_100_010_011_1(uniques, 11);
+  f_110_100_010_101_0(uniques, 11);
+  f_110_100_010_101_1(uniques, 11);
+  f_110_100_010_111_0(uniques, 11);
+  f_110_100_010_111_1(uniques, 11);
+  f_110_100_011_001_0(uniques, 11);
+  f_110_100_011_001_1(uniques, 11);
+  f_110_100_011_011_0(uniques, 11);
+  f_110_100_011_011_1(uniques, 11);
+  f_110_100_011_101_0(uniques, 11);
+  f_110_100_011_101_1(uniques, 11);
+  f_110_100_011_111_0(uniques, 11);
+  f_110_100_011_111_1(uniques, 11);
+  f_110_100_100_001_0(uniques, 11);
+  f_110_100_100_001_1(uniques, 11);
+  f_110_100_100_011_0(uniques, 11);
+  f_110_100_100_011_1(uniques, 11);
+  f_110_100_100_101_0(uniques, 11);
+  f_110_100_100_101_1(uniques, 11);
+  f_110_100_100_111_0(uniques, 11);
+  f_110_100_100_111_1(uniques, 11);
+  f_110_100_101_001_0(uniques, 11);
+  f_110_100_101_001_1(uniques, 11);
+  f_110_100_101_011_0(uniques, 11);
+  f_110_100_101_011_1(uniques, 11);
+  f_110_100_101_101_0(uniques, 11);
+  f_110_100_101_101_1(uniques, 11);
+  f_110_100_101_111_0(uniques, 11);
+  f_110_100_101_111_1(uniques, 11);
+  f_110_100_110_001_0(uniques, 11);
+  f_110_100_110_001_1(uniques, 11);
+  f_110_100_110_011_0(uniques, 11);
+  f_110_100_110_011_1(uniques, 11);
+  f_110_100_110_101_0(uniques, 11);
+  f_110_100_110_101_1(uniques, 11);
+  f_110_100_110_111_0(uniques, 11);
+  f_110_100_110_111_1(uniques, 11);
+  f_110_100_111_001_0(uniques, 11);
+  f_110_100_111_001_1(uniques, 11);
+  f_110_100_111_011_0(uniques, 11);
+  f_110_100_111_011_1(uniques, 11);
+  f_110_100_111_101_0(uniques, 11);
+  f_110_100_111_101_1(uniques, 11);
+  f_110_100_111_111_0(uniques, 11);
+  f_110_100_111_111_1(uniques, 11);
+  f_110_101_000_001_0(uniques, 11);
+  f_110_101_000_001_1(uniques, 11);
+  f_110_101_000_011_0(uniques, 11);
+  f_110_101_000_011_1(uniques, 11);
+  f_110_101_000_101_0(uniques, 11);
+  f_110_101_000_101_1(uniques, 11);
+  f_110_101_000_111_0(uniques, 11);
+  f_110_101_000_111_1(uniques, 11);
+  f_110_101_001_001_0(uniques, 11);
+  f_110_101_001_001_1(uniques, 11);
+  f_110_101_001_011_0(uniques, 11);
+  f_110_101_001_011_1(uniques, 11);
+  f_110_101_001_101_0(uniques, 11);
+  f_110_101_001_101_1(uniques, 11);
+  f_110_101_001_111_0(uniques, 11);
+  f_110_101_001_111_1(uniques, 11);
+  f_110_101_010_001_0(uniques, 11);
+  f_110_101_010_001_1(uniques, 11);
+  f_110_101_010_011_0(uniques, 11);
+  f_110_101_010_011_1(uniques, 11);
+  f_110_101_010_101_0(uniques, 11);
+  f_110_101_010_101_1(uniques, 11);
+  f_110_101_010_111_0(uniques, 11);
+  f_110_101_010_111_1(uniques, 11);
+  f_110_101_011_001_0(uniques, 11);
+  f_110_101_011_001_1(uniques, 11);
+  f_110_101_011_011_0(uniques, 11);
+  f_110_101_011_011_1(uniques, 11);
+  f_110_101_011_101_0(uniques, 11);
+  f_110_101_011_101_1(uniques, 11);
+  f_110_101_011_111_0(uniques, 11);
+  f_110_101_011_111_1(uniques, 11);
+  f_110_101_100_001_0(uniques, 11);
+  f_110_101_100_001_1(uniques, 11);
+  f_110_101_100_011_0(uniques, 11);
+  f_110_101_100_011_1(uniques, 11);
+  f_110_101_100_101_0(uniques, 11);
+  f_110_101_100_101_1(uniques, 11);
+  f_110_101_100_111_0(uniques, 11);
+  f_110_101_100_111_1(uniques, 11);
+  f_110_101_101_001_0(uniques, 11);
+  f_110_101_101_001_1(uniques, 11);
+  f_110_101_101_011_0(uniques, 11);
+  f_110_101_101_011_1(uniques, 11);
+  f_110_101_101_101_0(uniques, 11);
+  f_110_101_101_101_1(uniques, 11);
+  f_110_101_101_111_0(uniques, 11);
+  f_110_101_101_111_1(uniques, 11);
+  f_110_101_110_001_0(uniques, 11);
+  f_110_101_110_001_1(uniques, 11);
+  f_110_101_110_011_0(uniques, 11);
+  f_110_101_110_011_1(uniques, 11);
+  f_110_101_110_101_0(uniques, 11);
+  f_110_101_110_101_1(uniques, 11);
+  f_110_101_110_111_0(uniques, 11);
+  f_110_101_110_111_1(uniques, 11);
+  f_110_101_111_001_0(uniques, 11);
+  f_110_101_111_001_1(uniques, 11);
+  f_110_101_111_011_0(uniques, 11);
+  f_110_101_111_011_1(uniques, 11);
+  f_110_101_111_101_0(uniques, 11);
+  f_110_101_111_101_1(uniques, 11);
+  f_110_101_111_111_0(uniques, 11);
+  f_110_101_111_111_1(uniques, 11);
+  f_110_110_000_001_0(uniques, 11);
+  f_110_110_000_001_1(uniques, 11);
+  f_110_110_000_011_0(uniques, 11);
+  f_110_110_000_011_1(uniques, 11);
+  f_110_110_000_101_0(uniques, 11);
+  f_110_110_000_101_1(uniques, 11);
+  f_110_110_000_111_0(uniques, 11);
+  f_110_110_000_111_1(uniques, 11);
+  f_110_110_001_001_0(uniques, 11);
+  f_110_110_001_001_1(uniques, 11);
+  f_110_110_001_011_0(uniques, 11);
+  f_110_110_001_011_1(uniques, 11);
+  f_110_110_001_101_0(uniques, 11);
+  f_110_110_001_101_1(uniques, 11);
+  f_110_110_001_111_0(uniques, 11);
+  f_110_110_001_111_1(uniques, 11);
+  f_110_110_010_001_0(uniques, 11);
+  f_110_110_010_001_1(uniques, 11);
+  f_110_110_010_011_0(uniques, 11);
+  f_110_110_010_011_1(uniques, 11);
+  f_110_110_010_101_0(uniques, 11);
+  f_110_110_010_101_1(uniques, 11);
+  f_110_110_010_111_0(uniques, 11);
+  f_110_110_010_111_1(uniques, 11);
+  f_110_110_011_001_0(uniques, 11);
+  f_110_110_011_001_1(uniques, 11);
+  f_110_110_011_011_0(uniques, 11);
+  f_110_110_011_011_1(uniques, 11);
+  f_110_110_011_101_0(uniques, 11);
+  f_110_110_011_101_1(uniques, 11);
+  f_110_110_011_111_0(uniques, 11);
+  f_110_110_011_111_1(uniques, 11);
+  f_110_110_100_001_0(uniques, 11);
+  f_110_110_100_001_1(uniques, 11);
+  f_110_110_100_011_0(uniques, 11);
+  f_110_110_100_011_1(uniques, 11);
+  f_110_110_100_101_0(uniques, 11);
+  f_110_110_100_101_1(uniques, 11);
+  f_110_110_100_111_0(uniques, 11);
+  f_110_110_100_111_1(uniques, 11);
+  f_110_110_101_001_0(uniques, 11);
+  f_110_110_101_001_1(uniques, 11);
+  f_110_110_101_011_0(uniques, 11);
+  f_110_110_101_011_1(uniques, 11);
+  f_110_110_101_101_0(uniques, 11);
+  f_110_110_101_101_1(uniques, 11);
+  f_110_110_101_111_0(uniques, 11);
+  f_110_110_101_111_1(uniques, 11);
+  f_110_110_110_001_0(uniques, 11);
+  f_110_110_110_001_1(uniques, 11);
+  f_110_110_110_011_0(uniques, 11);
+  f_110_110_110_011_1(uniques, 11);
+  f_110_110_110_101_0(uniques, 11);
+  f_110_110_110_101_1(uniques, 11);
+  f_110_110_110_111_0(uniques, 11);
+  f_110_110_110_111_1(uniques, 11);
+  f_110_110_111_001_0(uniques, 11);
+  f_110_110_111_001_1(uniques, 11);
+  f_110_110_111_011_0(uniques, 11);
+  f_110_110_111_011_1(uniques, 11);
+  f_110_110_111_101_0(uniques, 11);
+  f_110_110_111_101_1(uniques, 11);
+  f_110_110_111_111_0(uniques, 11);
+  f_110_110_111_111_1(uniques, 11);
+  f_110_111_000_001_0(uniques, 11);
+  f_110_111_000_001_1(uniques, 11);
+  f_110_111_000_011_0(uniques, 11);
+  f_110_111_000_011_1(uniques, 11);
+  f_110_111_000_101_0(uniques, 11);
+  f_110_111_000_101_1(uniques, 11);
+  f_110_111_000_111_0(uniques, 11);
+  f_110_111_000_111_1(uniques, 11);
+  f_110_111_001_001_0(uniques, 11);
+  f_110_111_001_001_1(uniques, 11);
+  f_110_111_001_011_0(uniques, 11);
+  f_110_111_001_011_1(uniques, 11);
+  f_110_111_001_101_0(uniques, 11);
+  f_110_111_001_101_1(uniques, 11);
+  f_110_111_001_111_0(uniques, 11);
+  f_110_111_001_111_1(uniques, 11);
+  f_110_111_010_001_0(uniques, 11);
+  f_110_111_010_001_1(uniques, 11);
+  f_110_111_010_011_0(uniques, 11);
+  f_110_111_010_011_1(uniques, 11);
+  f_110_111_010_101_0(uniques, 11);
+  f_110_111_010_101_1(uniques, 11);
+  f_110_111_010_111_0(uniques, 11);
+  f_110_111_010_111_1(uniques, 11);
+  f_110_111_011_001_0(uniques, 11);
+  f_110_111_011_001_1(uniques, 11);
+  f_110_111_011_011_0(uniques, 11);
+  f_110_111_011_011_1(uniques, 11);
+  f_110_111_011_101_0(uniques, 11);
+  f_110_111_011_101_1(uniques, 11);
+  f_110_111_011_111_0(uniques, 11);
+  f_110_111_011_111_1(uniques, 11);
+  f_110_111_100_001_0(uniques, 11);
+  f_110_111_100_001_1(uniques, 11);
+  f_110_111_100_011_0(uniques, 11);
+  f_110_111_100_011_1(uniques, 11);
+  f_110_111_100_101_0(uniques, 11);
+  f_110_111_100_101_1(uniques, 11);
+  f_110_111_100_111_0(uniques, 11);
+  f_110_111_100_111_1(uniques, 11);
+  f_110_111_101_001_0(uniques, 11);
+  f_110_111_101_001_1(uniques, 11);
+  f_110_111_101_011_0(uniques, 11);
+  f_110_111_101_011_1(uniques, 11);
+  f_110_111_101_101_0(uniques, 11);
+  f_110_111_101_101_1(uniques, 11);
+  f_110_111_101_111_0(uniques, 11);
+  f_110_111_101_111_1(uniques, 11);
+  f_110_111_110_001_0(uniques, 11);
+  f_110_111_110_001_1(uniques, 11);
+  f_110_111_110_011_0(uniques, 11);
+  f_110_111_110_011_1(uniques, 11);
+  f_110_111_110_101_0(uniques, 11);
+  f_110_111_110_101_1(uniques, 11);
+  f_110_111_110_111_0(uniques, 11);
+  f_110_111_110_111_1(uniques, 11);
+  f_110_111_111_001_0(uniques, 11);
+  f_110_111_111_001_1(uniques, 11);
+  f_110_111_111_011_0(uniques, 11);
+  f_110_111_111_011_1(uniques, 11);
+  f_110_111_111_101_0(uniques, 11);
+  f_110_111_111_101_1(uniques, 11);
+  f_110_111_111_111_0(uniques, 11);
+  f_110_111_111_111_1(uniques, 11);
+  f_111_000_000_001_0(uniques, 11);
+  f_111_000_000_001_1(uniques, 11);
+  f_111_000_000_011_0(uniques, 11);
+  f_111_000_000_011_1(uniques, 11);
+  f_111_000_000_101_0(uniques, 11);
+  f_111_000_000_101_1(uniques, 11);
+  f_111_000_000_111_0(uniques, 11);
+  f_111_000_000_111_1(uniques, 11);
+  f_111_000_001_001_0(uniques, 11);
+  f_111_000_001_001_1(uniques, 11);
+  f_111_000_001_011_0(uniques, 11);
+  f_111_000_001_011_1(uniques, 11);
+  f_111_000_001_101_0(uniques, 11);
+  f_111_000_001_101_1(uniques, 11);
+  f_111_000_001_111_0(uniques, 11);
+  f_111_000_001_111_1(uniques, 11);
+  f_111_000_010_001_0(uniques, 11);
+  f_111_000_010_001_1(uniques, 11);
+  f_111_000_010_011_0(uniques, 11);
+  f_111_000_010_011_1(uniques, 11);
+  f_111_000_010_101_0(uniques, 11);
+  f_111_000_010_101_1(uniques, 11);
+  f_111_000_010_111_0(uniques, 11);
+  f_111_000_010_111_1(uniques, 11);
+  f_111_000_011_001_0(uniques, 11);
+  f_111_000_011_001_1(uniques, 11);
+  f_111_000_011_011_0(uniques, 11);
+  f_111_000_011_011_1(uniques, 11);
+  f_111_000_011_101_0(uniques, 11);
+  f_111_000_011_101_1(uniques, 11);
+  f_111_000_011_111_0(uniques, 11);
+  f_111_000_011_111_1(uniques, 11);
+  f_111_000_100_001_0(uniques, 11);
+  f_111_000_100_001_1(uniques, 11);
+  f_111_000_100_011_0(uniques, 11);
+  f_111_000_100_011_1(uniques, 11);
+  f_111_000_100_101_0(uniques, 11);
+  f_111_000_100_101_1(uniques, 11);
+  f_111_000_100_111_0(uniques, 11);
+  f_111_000_100_111_1(uniques, 11);
+  f_111_000_101_001_0(uniques, 11);
+  f_111_000_101_001_1(uniques, 11);
+  f_111_000_101_011_0(uniques, 11);
+  f_111_000_101_011_1(uniques, 11);
+  f_111_000_101_101_0(uniques, 11);
+  f_111_000_101_101_1(uniques, 11);
+  f_111_000_101_111_0(uniques, 11);
+  f_111_000_101_111_1(uniques, 11);
+  f_111_000_110_001_0(uniques, 11);
+  f_111_000_110_001_1(uniques, 11);
+  f_111_000_110_011_0(uniques, 11);
+  f_111_000_110_011_1(uniques, 11);
+  f_111_000_110_101_0(uniques, 11);
+  f_111_000_110_101_1(uniques, 11);
+  f_111_000_110_111_0(uniques, 11);
+  f_111_000_110_111_1(uniques, 11);
+  f_111_000_111_001_0(uniques, 11);
+  f_111_000_111_001_1(uniques, 11);
+  f_111_000_111_011_0(uniques, 11);
+  f_111_000_111_011_1(uniques, 11);
+  f_111_000_111_101_0(uniques, 11);
+  f_111_000_111_101_1(uniques, 11);
+  f_111_000_111_111_0(uniques, 11);
+  f_111_000_111_111_1(uniques, 11);
+  f_111_001_000_001_0(uniques, 11);
+  f_111_001_000_001_1(uniques, 11);
+  f_111_001_000_011_0(uniques, 11);
+  f_111_001_000_011_1(uniques, 11);
+  f_111_001_000_101_0(uniques, 11);
+  f_111_001_000_101_1(uniques, 11);
+  f_111_001_000_111_0(uniques, 11);
+  f_111_001_000_111_1(uniques, 11);
+  f_111_001_001_001_0(uniques, 11);
+  f_111_001_001_001_1(uniques, 11);
+  f_111_001_001_011_0(uniques, 11);
+  f_111_001_001_011_1(uniques, 11);
+  f_111_001_001_101_0(uniques, 11);
+  f_111_001_001_101_1(uniques, 11);
+  f_111_001_001_111_0(uniques, 11);
+  f_111_001_001_111_1(uniques, 11);
+  f_111_001_010_001_0(uniques, 11);
+  f_111_001_010_001_1(uniques, 11);
+  f_111_001_010_011_0(uniques, 11);
+  f_111_001_010_011_1(uniques, 11);
+  f_111_001_010_101_0(uniques, 11);
+  f_111_001_010_101_1(uniques, 11);
+  f_111_001_010_111_0(uniques, 11);
+  f_111_001_010_111_1(uniques, 11);
+  f_111_001_011_001_0(uniques, 11);
+  f_111_001_011_001_1(uniques, 11);
+  f_111_001_011_011_0(uniques, 11);
+  f_111_001_011_011_1(uniques, 11);
+  f_111_001_011_101_0(uniques, 11);
+  f_111_001_011_101_1(uniques, 11);
+  f_111_001_011_111_0(uniques, 11);
+  f_111_001_011_111_1(uniques, 11);
+  f_111_001_100_001_0(uniques, 11);
+  f_111_001_100_001_1(uniques, 11);
+  f_111_001_100_011_0(uniques, 11);
+  f_111_001_100_011_1(uniques, 11);
+  f_111_001_100_101_0(uniques, 11);
+  f_111_001_100_101_1(uniques, 11);
+  f_111_001_100_111_0(uniques, 11);
+  f_111_001_100_111_1(uniques, 11);
+  f_111_001_101_001_0(uniques, 11);
+  f_111_001_101_001_1(uniques, 11);
+  f_111_001_101_011_0(uniques, 11);
+  f_111_001_101_011_1(uniques, 11);
+  f_111_001_101_101_0(uniques, 11);
+  f_111_001_101_101_1(uniques, 11);
+  f_111_001_101_111_0(uniques, 11);
+  f_111_001_101_111_1(uniques, 11);
+  f_111_001_110_001_0(uniques, 11);
+  f_111_001_110_001_1(uniques, 11);
+  f_111_001_110_011_0(uniques, 11);
+  f_111_001_110_011_1(uniques, 11);
+  f_111_001_110_101_0(uniques, 11);
+  f_111_001_110_101_1(uniques, 11);
+  f_111_001_110_111_0(uniques, 11);
+  f_111_001_110_111_1(uniques, 11);
+  f_111_001_111_001_0(uniques, 11);
+  f_111_001_111_001_1(uniques, 11);
+  f_111_001_111_011_0(uniques, 11);
+  f_111_001_111_011_1(uniques, 11);
+  f_111_001_111_101_0(uniques, 11);
+  f_111_001_111_101_1(uniques, 11);
+  f_111_001_111_111_0(uniques, 11);
+  f_111_001_111_111_1(uniques, 11);
+  f_111_010_000_001_0(uniques, 11);
+  f_111_010_000_001_1(uniques, 11);
+  f_111_010_000_011_0(uniques, 11);
+  f_111_010_000_011_1(uniques, 11);
+  f_111_010_000_101_0(uniques, 11);
+  f_111_010_000_101_1(uniques, 11);
+  f_111_010_000_111_0(uniques, 11);
+  f_111_010_000_111_1(uniques, 11);
+  f_111_010_001_001_0(uniques, 11);
+  f_111_010_001_001_1(uniques, 11);
+  f_111_010_001_011_0(uniques, 11);
+  f_111_010_001_011_1(uniques, 11);
+  f_111_010_001_101_0(uniques, 11);
+  f_111_010_001_101_1(uniques, 11);
+  f_111_010_001_111_0(uniques, 11);
+  f_111_010_001_111_1(uniques, 11);
+  f_111_010_010_001_0(uniques, 11);
+  f_111_010_010_001_1(uniques, 11);
+  f_111_010_010_011_0(uniques, 11);
+  f_111_010_010_011_1(uniques, 11);
+  f_111_010_010_101_0(uniques, 11);
+  f_111_010_010_101_1(uniques, 11);
+  f_111_010_010_111_0(uniques, 11);
+  f_111_010_010_111_1(uniques, 11);
+  f_111_010_011_001_0(uniques, 11);
+  f_111_010_011_001_1(uniques, 11);
+  f_111_010_011_011_0(uniques, 11);
+  f_111_010_011_011_1(uniques, 11);
+  f_111_010_011_101_0(uniques, 11);
+  f_111_010_011_101_1(uniques, 11);
+  f_111_010_011_111_0(uniques, 11);
+  f_111_010_011_111_1(uniques, 11);
+  f_111_010_100_001_0(uniques, 11);
+  f_111_010_100_001_1(uniques, 11);
+  f_111_010_100_011_0(uniques, 11);
+  f_111_010_100_011_1(uniques, 11);
+  f_111_010_100_101_0(uniques, 11);
+  f_111_010_100_101_1(uniques, 11);
+  f_111_010_100_111_0(uniques, 11);
+  f_111_010_100_111_1(uniques, 11);
+  f_111_010_101_001_0(uniques, 11);
+  f_111_010_101_001_1(uniques, 11);
+  f_111_010_101_011_0(uniques, 11);
+  f_111_010_101_011_1(uniques, 11);
+  f_111_010_101_101_0(uniques, 11);
+  f_111_010_101_101_1(uniques, 11);
+  f_111_010_101_111_0(uniques, 11);
+  f_111_010_101_111_1(uniques, 11);
+  f_111_010_110_001_0(uniques, 11);
+  f_111_010_110_001_1(uniques, 11);
+  f_111_010_110_011_0(uniques, 11);
+  f_111_010_110_011_1(uniques, 11);
+  f_111_010_110_101_0(uniques, 11);
+  f_111_010_110_101_1(uniques, 11);
+  f_111_010_110_111_0(uniques, 11);
+  f_111_010_110_111_1(uniques, 11);
+  f_111_010_111_001_0(uniques, 11);
+  f_111_010_111_001_1(uniques, 11);
+  f_111_010_111_011_0(uniques, 11);
+  f_111_010_111_011_1(uniques, 11);
+  f_111_010_111_101_0(uniques, 11);
+  f_111_010_111_101_1(uniques, 11);
+  f_111_010_111_111_0(uniques, 11);
+  f_111_010_111_111_1(uniques, 11);
+  f_111_011_000_001_0(uniques, 11);
+  f_111_011_000_001_1(uniques, 11);
+  f_111_011_000_011_0(uniques, 11);
+  f_111_011_000_011_1(uniques, 11);
+  f_111_011_000_101_0(uniques, 11);
+  f_111_011_000_101_1(uniques, 11);
+  f_111_011_000_111_0(uniques, 11);
+  f_111_011_000_111_1(uniques, 11);
+  f_111_011_001_001_0(uniques, 11);
+  f_111_011_001_001_1(uniques, 11);
+  f_111_011_001_011_0(uniques, 11);
+  f_111_011_001_011_1(uniques, 11);
+  f_111_011_001_101_0(uniques, 11);
+  f_111_011_001_101_1(uniques, 11);
+  f_111_011_001_111_0(uniques, 11);
+  f_111_011_001_111_1(uniques, 11);
+  f_111_011_010_001_0(uniques, 11);
+  f_111_011_010_001_1(uniques, 11);
+  f_111_011_010_011_0(uniques, 11);
+  f_111_011_010_011_1(uniques, 11);
+  f_111_011_010_101_0(uniques, 11);
+  f_111_011_010_101_1(uniques, 11);
+  f_111_011_010_111_0(uniques, 11);
+  f_111_011_010_111_1(uniques, 11);
+  f_111_011_011_001_0(uniques, 11);
+  f_111_011_011_001_1(uniques, 11);
+  f_111_011_011_011_0(uniques, 11);
+  f_111_011_011_011_1(uniques, 11);
+  f_111_011_011_101_0(uniques, 11);
+  f_111_011_011_101_1(uniques, 11);
+  f_111_011_011_111_0(uniques, 11);
+  f_111_011_011_111_1(uniques, 11);
+  f_111_011_100_001_0(uniques, 11);
+  f_111_011_100_001_1(uniques, 11);
+  f_111_011_100_011_0(uniques, 11);
+  f_111_011_100_011_1(uniques, 11);
+  f_111_011_100_101_0(uniques, 11);
+  f_111_011_100_101_1(uniques, 11);
+  f_111_011_100_111_0(uniques, 11);
+  f_111_011_100_111_1(uniques, 11);
+  f_111_011_101_001_0(uniques, 11);
+  f_111_011_101_001_1(uniques, 11);
+  f_111_011_101_011_0(uniques, 11);
+  f_111_011_101_011_1(uniques, 11);
+  f_111_011_101_101_0(uniques, 11);
+  f_111_011_101_101_1(uniques, 11);
+  f_111_011_101_111_0(uniques, 11);
+  f_111_011_101_111_1(uniques, 11);
+  f_111_011_110_001_0(uniques, 11);
+  f_111_011_110_001_1(uniques, 11);
+  f_111_011_110_011_0(uniques, 11);
+  f_111_011_110_011_1(uniques, 11);
+  f_111_011_110_101_0(uniques, 11);
+  f_111_011_110_101_1(uniques, 11);
+  f_111_011_110_111_0(uniques, 11);
+  f_111_011_110_111_1(uniques, 11);
+  f_111_011_111_001_0(uniques, 11);
+  f_111_011_111_001_1(uniques, 11);
+  f_111_011_111_011_0(uniques, 11);
+  f_111_011_111_011_1(uniques, 11);
+  f_111_011_111_101_0(uniques, 11);
+  f_111_011_111_101_1(uniques, 11);
+  f_111_011_111_111_0(uniques, 11);
+  f_111_011_111_111_1(uniques, 11);
+  f_111_100_000_001_0(uniques, 11);
+  f_111_100_000_001_1(uniques, 11);
+  f_111_100_000_011_0(uniques, 11);
+  f_111_100_000_011_1(uniques, 11);
+  f_111_100_000_101_0(uniques, 11);
+  f_111_100_000_101_1(uniques, 11);
+  f_111_100_000_111_0(uniques, 11);
+  f_111_100_000_111_1(uniques, 11);
+  f_111_100_001_001_0(uniques, 11);
+  f_111_100_001_001_1(uniques, 11);
+  f_111_100_001_011_0(uniques, 11);
+  f_111_100_001_011_1(uniques, 11);
+  f_111_100_001_101_0(uniques, 11);
+  f_111_100_001_101_1(uniques, 11);
+  f_111_100_001_111_0(uniques, 11);
+  f_111_100_001_111_1(uniques, 11);
+  f_111_100_010_001_0(uniques, 11);
+  f_111_100_010_001_1(uniques, 11);
+  f_111_100_010_011_0(uniques, 11);
+  f_111_100_010_011_1(uniques, 11);
+  f_111_100_010_101_0(uniques, 11);
+  f_111_100_010_101_1(uniques, 11);
+  f_111_100_010_111_0(uniques, 11);
+  f_111_100_010_111_1(uniques, 11);
+  f_111_100_011_001_0(uniques, 11);
+  f_111_100_011_001_1(uniques, 11);
+  f_111_100_011_011_0(uniques, 11);
+  f_111_100_011_011_1(uniques, 11);
+  f_111_100_011_101_0(uniques, 11);
+  f_111_100_011_101_1(uniques, 11);
+  f_111_100_011_111_0(uniques, 11);
+  f_111_100_011_111_1(uniques, 11);
+  f_111_100_100_001_0(uniques, 11);
+  f_111_100_100_001_1(uniques, 11);
+  f_111_100_100_011_0(uniques, 11);
+  f_111_100_100_011_1(uniques, 11);
+  f_111_100_100_101_0(uniques, 11);
+  f_111_100_100_101_1(uniques, 11);
+  f_111_100_100_111_0(uniques, 11);
+  f_111_100_100_111_1(uniques, 11);
+  f_111_100_101_001_0(uniques, 11);
+  f_111_100_101_001_1(uniques, 11);
+  f_111_100_101_011_0(uniques, 11);
+  f_111_100_101_011_1(uniques, 11);
+  f_111_100_101_101_0(uniques, 11);
+  f_111_100_101_101_1(uniques, 11);
+  f_111_100_101_111_0(uniques, 11);
+  f_111_100_101_111_1(uniques, 11);
+  f_111_100_110_001_0(uniques, 11);
+  f_111_100_110_001_1(uniques, 11);
+  f_111_100_110_011_0(uniques, 11);
+  f_111_100_110_011_1(uniques, 11);
+  f_111_100_110_101_0(uniques, 11);
+  f_111_100_110_101_1(uniques, 11);
+  f_111_100_110_111_0(uniques, 11);
+  f_111_100_110_111_1(uniques, 11);
+  f_111_100_111_001_0(uniques, 11);
+  f_111_100_111_001_1(uniques, 11);
+  f_111_100_111_011_0(uniques, 11);
+  f_111_100_111_011_1(uniques, 11);
+  f_111_100_111_101_0(uniques, 11);
+  f_111_100_111_101_1(uniques, 11);
+  f_111_100_111_111_0(uniques, 11);
+  f_111_100_111_111_1(uniques, 11);
+  f_111_101_000_001_0(uniques, 11);
+  f_111_101_000_001_1(uniques, 11);
+  f_111_101_000_011_0(uniques, 11);
+  f_111_101_000_011_1(uniques, 11);
+  f_111_101_000_101_0(uniques, 11);
+  f_111_101_000_101_1(uniques, 11);
+  f_111_101_000_111_0(uniques, 11);
+  f_111_101_000_111_1(uniques, 11);
+  f_111_101_001_001_0(uniques, 11);
+  f_111_101_001_001_1(uniques, 11);
+  f_111_101_001_011_0(uniques, 11);
+  f_111_101_001_011_1(uniques, 11);
+  f_111_101_001_101_0(uniques, 11);
+  f_111_101_001_101_1(uniques, 11);
+  f_111_101_001_111_0(uniques, 11);
+  f_111_101_001_111_1(uniques, 11);
+  f_111_101_010_001_0(uniques, 11);
+  f_111_101_010_001_1(uniques, 11);
+  f_111_101_010_011_0(uniques, 11);
+  f_111_101_010_011_1(uniques, 11);
+  f_111_101_010_101_0(uniques, 11);
+  f_111_101_010_101_1(uniques, 11);
+  f_111_101_010_111_0(uniques, 11);
+  f_111_101_010_111_1(uniques, 11);
+  f_111_101_011_001_0(uniques, 11);
+  f_111_101_011_001_1(uniques, 11);
+  f_111_101_011_011_0(uniques, 11);
+  f_111_101_011_011_1(uniques, 11);
+  f_111_101_011_101_0(uniques, 11);
+  f_111_101_011_101_1(uniques, 11);
+  f_111_101_011_111_0(uniques, 11);
+  f_111_101_011_111_1(uniques, 11);
+  f_111_101_100_001_0(uniques, 11);
+  f_111_101_100_001_1(uniques, 11);
+  f_111_101_100_011_0(uniques, 11);
+  f_111_101_100_011_1(uniques, 11);
+  f_111_101_100_101_0(uniques, 11);
+  f_111_101_100_101_1(uniques, 11);
+  f_111_101_100_111_0(uniques, 11);
+  f_111_101_100_111_1(uniques, 11);
+  f_111_101_101_001_0(uniques, 11);
+  f_111_101_101_001_1(uniques, 11);
+  f_111_101_101_011_0(uniques, 11);
+  f_111_101_101_011_1(uniques, 11);
+  f_111_101_101_101_0(uniques, 11);
+  f_111_101_101_101_1(uniques, 11);
+  f_111_101_101_111_0(uniques, 11);
+  f_111_101_101_111_1(uniques, 11);
+  f_111_101_110_001_0(uniques, 11);
+  f_111_101_110_001_1(uniques, 11);
+  f_111_101_110_011_0(uniques, 11);
+  f_111_101_110_011_1(uniques, 11);
+  f_111_101_110_101_0(uniques, 11);
+  f_111_101_110_101_1(uniques, 11);
+  f_111_101_110_111_0(uniques, 11);
+  f_111_101_110_111_1(uniques, 11);
+  f_111_101_111_001_0(uniques, 11);
+  f_111_101_111_001_1(uniques, 11);
+  f_111_101_111_011_0(uniques, 11);
+  f_111_101_111_011_1(uniques, 11);
+  f_111_101_111_101_0(uniques, 11);
+  f_111_101_111_101_1(uniques, 11);
+  f_111_101_111_111_0(uniques, 11);
+  f_111_101_111_111_1(uniques, 11);
+  f_111_110_000_001_0(uniques, 11);
+  f_111_110_000_001_1(uniques, 11);
+  f_111_110_000_011_0(uniques, 11);
+  f_111_110_000_011_1(uniques, 11);
+  f_111_110_000_101_0(uniques, 11);
+  f_111_110_000_101_1(uniques, 11);
+  f_111_110_000_111_0(uniques, 11);
+  f_111_110_000_111_1(uniques, 11);
+  f_111_110_001_001_0(uniques, 11);
+  f_111_110_001_001_1(uniques, 11);
+  f_111_110_001_011_0(uniques, 11);
+  f_111_110_001_011_1(uniques, 11);
+  f_111_110_001_101_0(uniques, 11);
+  f_111_110_001_101_1(uniques, 11);
+  f_111_110_001_111_0(uniques, 11);
+  f_111_110_001_111_1(uniques, 11);
+  f_111_110_010_001_0(uniques, 11);
+  f_111_110_010_001_1(uniques, 11);
+  f_111_110_010_011_0(uniques, 11);
+  f_111_110_010_011_1(uniques, 11);
+  f_111_110_010_101_0(uniques, 11);
+  f_111_110_010_101_1(uniques, 11);
+  f_111_110_010_111_0(uniques, 11);
+  f_111_110_010_111_1(uniques, 11);
+  f_111_110_011_001_0(uniques, 11);
+  f_111_110_011_001_1(uniques, 11);
+  f_111_110_011_011_0(uniques, 11);
+  f_111_110_011_011_1(uniques, 11);
+  f_111_110_011_101_0(uniques, 11);
+  f_111_110_011_101_1(uniques, 11);
+  f_111_110_011_111_0(uniques, 11);
+  f_111_110_011_111_1(uniques, 11);
+  f_111_110_100_001_0(uniques, 11);
+  f_111_110_100_001_1(uniques, 11);
+  f_111_110_100_011_0(uniques, 11);
+  f_111_110_100_011_1(uniques, 11);
+  f_111_110_100_101_0(uniques, 11);
+  f_111_110_100_101_1(uniques, 11);
+  f_111_110_100_111_0(uniques, 11);
+  f_111_110_100_111_1(uniques, 11);
+  f_111_110_101_001_0(uniques, 11);
+  f_111_110_101_001_1(uniques, 11);
+  f_111_110_101_011_0(uniques, 11);
+  f_111_110_101_011_1(uniques, 11);
+  f_111_110_101_101_0(uniques, 11);
+  f_111_110_101_101_1(uniques, 11);
+  f_111_110_101_111_0(uniques, 11);
+  f_111_110_101_111_1(uniques, 11);
+  f_111_110_110_001_0(uniques, 11);
+  f_111_110_110_001_1(uniques, 11);
+  f_111_110_110_011_0(uniques, 11);
+  f_111_110_110_011_1(uniques, 11);
+  f_111_110_110_101_0(uniques, 11);
+  f_111_110_110_101_1(uniques, 11);
+  f_111_110_110_111_0(uniques, 11);
+  f_111_110_110_111_1(uniques, 11);
+  f_111_110_111_001_0(uniques, 11);
+  f_111_110_111_001_1(uniques, 11);
+  f_111_110_111_011_0(uniques, 11);
+  f_111_110_111_011_1(uniques, 11);
+  f_111_110_111_101_0(uniques, 11);
+  f_111_110_111_101_1(uniques, 11);
+  f_111_110_111_111_0(uniques, 11);
+  f_111_110_111_111_1(uniques, 11);
+  f_111_111_000_001_0(uniques, 11);
+  f_111_111_000_001_1(uniques, 11);
+  f_111_111_000_011_0(uniques, 11);
+  f_111_111_000_011_1(uniques, 11);
+  f_111_111_000_101_0(uniques, 11);
+  f_111_111_000_101_1(uniques, 11);
+  f_111_111_000_111_0(uniques, 11);
+  f_111_111_000_111_1(uniques, 11);
+  f_111_111_001_001_0(uniques, 11);
+  f_111_111_001_001_1(uniques, 11);
+  f_111_111_001_011_0(uniques, 11);
+  f_111_111_001_011_1(uniques, 11);
+  f_111_111_001_101_0(uniques, 11);
+  f_111_111_001_101_1(uniques, 11);
+  f_111_111_001_111_0(uniques, 11);
+  f_111_111_001_111_1(uniques, 11);
+  f_111_111_010_001_0(uniques, 11);
+  f_111_111_010_001_1(uniques, 11);
+  f_111_111_010_011_0(uniques, 11);
+  f_111_111_010_011_1(uniques, 11);
+  f_111_111_010_101_0(uniques, 11);
+  f_111_111_010_101_1(uniques, 11);
+  f_111_111_010_111_0(uniques, 11);
+  f_111_111_010_111_1(uniques, 11);
+  f_111_111_011_001_0(uniques, 11);
+  f_111_111_011_001_1(uniques, 11);
+  f_111_111_011_011_0(uniques, 11);
+  f_111_111_011_011_1(uniques, 11);
+  f_111_111_011_101_0(uniques, 11);
+  f_111_111_011_101_1(uniques, 11);
+  f_111_111_011_111_0(uniques, 11);
+  f_111_111_011_111_1(uniques, 11);
+  f_111_111_100_001_0(uniques, 11);
+  f_111_111_100_001_1(uniques, 11);
+  f_111_111_100_011_0(uniques, 11);
+  f_111_111_100_011_1(uniques, 11);
+  f_111_111_100_101_0(uniques, 11);
+  f_111_111_100_101_1(uniques, 11);
+  f_111_111_100_111_0(uniques, 11);
+  f_111_111_100_111_1(uniques, 11);
+  f_111_111_101_001_0(uniques, 11);
+  f_111_111_101_001_1(uniques, 11);
+  f_111_111_101_011_0(uniques, 11);
+  f_111_111_101_011_1(uniques, 11);
+  f_111_111_101_101_0(uniques, 11);
+  f_111_111_101_101_1(uniques, 11);
+  f_111_111_101_111_0(uniques, 11);
+  f_111_111_101_111_1(uniques, 11);
+  f_111_111_110_001_0(uniques, 11);
+  f_111_111_110_001_1(uniques, 11);
+  f_111_111_110_011_0(uniques, 11);
+  f_111_111_110_011_1(uniques, 11);
+  f_111_111_110_101_0(uniques, 11);
+  f_111_111_110_101_1(uniques, 11);
+  f_111_111_110_111_0(uniques, 11);
+  f_111_111_110_111_1(uniques, 11);
+  f_111_111_111_001_0(uniques, 11);
+  f_111_111_111_001_1(uniques, 11);
+  f_111_111_111_011_0(uniques, 11);
+  f_111_111_111_011_1(uniques, 11);
+  f_111_111_111_101_0(uniques, 11);
+  f_111_111_111_101_1(uniques, 11);
+  f_111_111_111_111_0(uniques, 11);
+  f_111_111_111_111_1(uniques, 11);
+  Expect.equals(4096, uniques.length);
+}
diff --git a/tests/dart2js/deferred/many_parts/lib_000_000_000_010_0.dart b/tests/dart2js/deferred/many_parts/lib_000_000_000_010_0.dart
new file mode 100644
index 0000000..1501ef1
--- /dev/null
+++ b/tests/dart2js/deferred/many_parts/lib_000_000_000_010_0.dart
@@ -0,0 +1,4111 @@
+// Copyright (c) 2020, 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:expect/expect.dart";
+
+import 'libB.dart';
+
+@pragma('dart2js:noInline')
+g_000_000_000_010_0() {
+  Set<String> uniques = {};
+
+  // f_***_***_***_*1*_*;
+  f_000_000_000_010_0(uniques, 10);
+  f_000_000_000_010_1(uniques, 10);
+  f_000_000_000_011_0(uniques, 10);
+  f_000_000_000_011_1(uniques, 10);
+  f_000_000_000_110_0(uniques, 10);
+  f_000_000_000_110_1(uniques, 10);
+  f_000_000_000_111_0(uniques, 10);
+  f_000_000_000_111_1(uniques, 10);
+  f_000_000_001_010_0(uniques, 10);
+  f_000_000_001_010_1(uniques, 10);
+  f_000_000_001_011_0(uniques, 10);
+  f_000_000_001_011_1(uniques, 10);
+  f_000_000_001_110_0(uniques, 10);
+  f_000_000_001_110_1(uniques, 10);
+  f_000_000_001_111_0(uniques, 10);
+  f_000_000_001_111_1(uniques, 10);
+  f_000_000_010_010_0(uniques, 10);
+  f_000_000_010_010_1(uniques, 10);
+  f_000_000_010_011_0(uniques, 10);
+  f_000_000_010_011_1(uniques, 10);
+  f_000_000_010_110_0(uniques, 10);
+  f_000_000_010_110_1(uniques, 10);
+  f_000_000_010_111_0(uniques, 10);
+  f_000_000_010_111_1(uniques, 10);
+  f_000_000_011_010_0(uniques, 10);
+  f_000_000_011_010_1(uniques, 10);
+  f_000_000_011_011_0(uniques, 10);
+  f_000_000_011_011_1(uniques, 10);
+  f_000_000_011_110_0(uniques, 10);
+  f_000_000_011_110_1(uniques, 10);
+  f_000_000_011_111_0(uniques, 10);
+  f_000_000_011_111_1(uniques, 10);
+  f_000_000_100_010_0(uniques, 10);
+  f_000_000_100_010_1(uniques, 10);
+  f_000_000_100_011_0(uniques, 10);
+  f_000_000_100_011_1(uniques, 10);
+  f_000_000_100_110_0(uniques, 10);
+  f_000_000_100_110_1(uniques, 10);
+  f_000_000_100_111_0(uniques, 10);
+  f_000_000_100_111_1(uniques, 10);
+  f_000_000_101_010_0(uniques, 10);
+  f_000_000_101_010_1(uniques, 10);
+  f_000_000_101_011_0(uniques, 10);
+  f_000_000_101_011_1(uniques, 10);
+  f_000_000_101_110_0(uniques, 10);
+  f_000_000_101_110_1(uniques, 10);
+  f_000_000_101_111_0(uniques, 10);
+  f_000_000_101_111_1(uniques, 10);
+  f_000_000_110_010_0(uniques, 10);
+  f_000_000_110_010_1(uniques, 10);
+  f_000_000_110_011_0(uniques, 10);
+  f_000_000_110_011_1(uniques, 10);
+  f_000_000_110_110_0(uniques, 10);
+  f_000_000_110_110_1(uniques, 10);
+  f_000_000_110_111_0(uniques, 10);
+  f_000_000_110_111_1(uniques, 10);
+  f_000_000_111_010_0(uniques, 10);
+  f_000_000_111_010_1(uniques, 10);
+  f_000_000_111_011_0(uniques, 10);
+  f_000_000_111_011_1(uniques, 10);
+  f_000_000_111_110_0(uniques, 10);
+  f_000_000_111_110_1(uniques, 10);
+  f_000_000_111_111_0(uniques, 10);
+  f_000_000_111_111_1(uniques, 10);
+  f_000_001_000_010_0(uniques, 10);
+  f_000_001_000_010_1(uniques, 10);
+  f_000_001_000_011_0(uniques, 10);
+  f_000_001_000_011_1(uniques, 10);
+  f_000_001_000_110_0(uniques, 10);
+  f_000_001_000_110_1(uniques, 10);
+  f_000_001_000_111_0(uniques, 10);
+  f_000_001_000_111_1(uniques, 10);
+  f_000_001_001_010_0(uniques, 10);
+  f_000_001_001_010_1(uniques, 10);
+  f_000_001_001_011_0(uniques, 10);
+  f_000_001_001_011_1(uniques, 10);
+  f_000_001_001_110_0(uniques, 10);
+  f_000_001_001_110_1(uniques, 10);
+  f_000_001_001_111_0(uniques, 10);
+  f_000_001_001_111_1(uniques, 10);
+  f_000_001_010_010_0(uniques, 10);
+  f_000_001_010_010_1(uniques, 10);
+  f_000_001_010_011_0(uniques, 10);
+  f_000_001_010_011_1(uniques, 10);
+  f_000_001_010_110_0(uniques, 10);
+  f_000_001_010_110_1(uniques, 10);
+  f_000_001_010_111_0(uniques, 10);
+  f_000_001_010_111_1(uniques, 10);
+  f_000_001_011_010_0(uniques, 10);
+  f_000_001_011_010_1(uniques, 10);
+  f_000_001_011_011_0(uniques, 10);
+  f_000_001_011_011_1(uniques, 10);
+  f_000_001_011_110_0(uniques, 10);
+  f_000_001_011_110_1(uniques, 10);
+  f_000_001_011_111_0(uniques, 10);
+  f_000_001_011_111_1(uniques, 10);
+  f_000_001_100_010_0(uniques, 10);
+  f_000_001_100_010_1(uniques, 10);
+  f_000_001_100_011_0(uniques, 10);
+  f_000_001_100_011_1(uniques, 10);
+  f_000_001_100_110_0(uniques, 10);
+  f_000_001_100_110_1(uniques, 10);
+  f_000_001_100_111_0(uniques, 10);
+  f_000_001_100_111_1(uniques, 10);
+  f_000_001_101_010_0(uniques, 10);
+  f_000_001_101_010_1(uniques, 10);
+  f_000_001_101_011_0(uniques, 10);
+  f_000_001_101_011_1(uniques, 10);
+  f_000_001_101_110_0(uniques, 10);
+  f_000_001_101_110_1(uniques, 10);
+  f_000_001_101_111_0(uniques, 10);
+  f_000_001_101_111_1(uniques, 10);
+  f_000_001_110_010_0(uniques, 10);
+  f_000_001_110_010_1(uniques, 10);
+  f_000_001_110_011_0(uniques, 10);
+  f_000_001_110_011_1(uniques, 10);
+  f_000_001_110_110_0(uniques, 10);
+  f_000_001_110_110_1(uniques, 10);
+  f_000_001_110_111_0(uniques, 10);
+  f_000_001_110_111_1(uniques, 10);
+  f_000_001_111_010_0(uniques, 10);
+  f_000_001_111_010_1(uniques, 10);
+  f_000_001_111_011_0(uniques, 10);
+  f_000_001_111_011_1(uniques, 10);
+  f_000_001_111_110_0(uniques, 10);
+  f_000_001_111_110_1(uniques, 10);
+  f_000_001_111_111_0(uniques, 10);
+  f_000_001_111_111_1(uniques, 10);
+  f_000_010_000_010_0(uniques, 10);
+  f_000_010_000_010_1(uniques, 10);
+  f_000_010_000_011_0(uniques, 10);
+  f_000_010_000_011_1(uniques, 10);
+  f_000_010_000_110_0(uniques, 10);
+  f_000_010_000_110_1(uniques, 10);
+  f_000_010_000_111_0(uniques, 10);
+  f_000_010_000_111_1(uniques, 10);
+  f_000_010_001_010_0(uniques, 10);
+  f_000_010_001_010_1(uniques, 10);
+  f_000_010_001_011_0(uniques, 10);
+  f_000_010_001_011_1(uniques, 10);
+  f_000_010_001_110_0(uniques, 10);
+  f_000_010_001_110_1(uniques, 10);
+  f_000_010_001_111_0(uniques, 10);
+  f_000_010_001_111_1(uniques, 10);
+  f_000_010_010_010_0(uniques, 10);
+  f_000_010_010_010_1(uniques, 10);
+  f_000_010_010_011_0(uniques, 10);
+  f_000_010_010_011_1(uniques, 10);
+  f_000_010_010_110_0(uniques, 10);
+  f_000_010_010_110_1(uniques, 10);
+  f_000_010_010_111_0(uniques, 10);
+  f_000_010_010_111_1(uniques, 10);
+  f_000_010_011_010_0(uniques, 10);
+  f_000_010_011_010_1(uniques, 10);
+  f_000_010_011_011_0(uniques, 10);
+  f_000_010_011_011_1(uniques, 10);
+  f_000_010_011_110_0(uniques, 10);
+  f_000_010_011_110_1(uniques, 10);
+  f_000_010_011_111_0(uniques, 10);
+  f_000_010_011_111_1(uniques, 10);
+  f_000_010_100_010_0(uniques, 10);
+  f_000_010_100_010_1(uniques, 10);
+  f_000_010_100_011_0(uniques, 10);
+  f_000_010_100_011_1(uniques, 10);
+  f_000_010_100_110_0(uniques, 10);
+  f_000_010_100_110_1(uniques, 10);
+  f_000_010_100_111_0(uniques, 10);
+  f_000_010_100_111_1(uniques, 10);
+  f_000_010_101_010_0(uniques, 10);
+  f_000_010_101_010_1(uniques, 10);
+  f_000_010_101_011_0(uniques, 10);
+  f_000_010_101_011_1(uniques, 10);
+  f_000_010_101_110_0(uniques, 10);
+  f_000_010_101_110_1(uniques, 10);
+  f_000_010_101_111_0(uniques, 10);
+  f_000_010_101_111_1(uniques, 10);
+  f_000_010_110_010_0(uniques, 10);
+  f_000_010_110_010_1(uniques, 10);
+  f_000_010_110_011_0(uniques, 10);
+  f_000_010_110_011_1(uniques, 10);
+  f_000_010_110_110_0(uniques, 10);
+  f_000_010_110_110_1(uniques, 10);
+  f_000_010_110_111_0(uniques, 10);
+  f_000_010_110_111_1(uniques, 10);
+  f_000_010_111_010_0(uniques, 10);
+  f_000_010_111_010_1(uniques, 10);
+  f_000_010_111_011_0(uniques, 10);
+  f_000_010_111_011_1(uniques, 10);
+  f_000_010_111_110_0(uniques, 10);
+  f_000_010_111_110_1(uniques, 10);
+  f_000_010_111_111_0(uniques, 10);
+  f_000_010_111_111_1(uniques, 10);
+  f_000_011_000_010_0(uniques, 10);
+  f_000_011_000_010_1(uniques, 10);
+  f_000_011_000_011_0(uniques, 10);
+  f_000_011_000_011_1(uniques, 10);
+  f_000_011_000_110_0(uniques, 10);
+  f_000_011_000_110_1(uniques, 10);
+  f_000_011_000_111_0(uniques, 10);
+  f_000_011_000_111_1(uniques, 10);
+  f_000_011_001_010_0(uniques, 10);
+  f_000_011_001_010_1(uniques, 10);
+  f_000_011_001_011_0(uniques, 10);
+  f_000_011_001_011_1(uniques, 10);
+  f_000_011_001_110_0(uniques, 10);
+  f_000_011_001_110_1(uniques, 10);
+  f_000_011_001_111_0(uniques, 10);
+  f_000_011_001_111_1(uniques, 10);
+  f_000_011_010_010_0(uniques, 10);
+  f_000_011_010_010_1(uniques, 10);
+  f_000_011_010_011_0(uniques, 10);
+  f_000_011_010_011_1(uniques, 10);
+  f_000_011_010_110_0(uniques, 10);
+  f_000_011_010_110_1(uniques, 10);
+  f_000_011_010_111_0(uniques, 10);
+  f_000_011_010_111_1(uniques, 10);
+  f_000_011_011_010_0(uniques, 10);
+  f_000_011_011_010_1(uniques, 10);
+  f_000_011_011_011_0(uniques, 10);
+  f_000_011_011_011_1(uniques, 10);
+  f_000_011_011_110_0(uniques, 10);
+  f_000_011_011_110_1(uniques, 10);
+  f_000_011_011_111_0(uniques, 10);
+  f_000_011_011_111_1(uniques, 10);
+  f_000_011_100_010_0(uniques, 10);
+  f_000_011_100_010_1(uniques, 10);
+  f_000_011_100_011_0(uniques, 10);
+  f_000_011_100_011_1(uniques, 10);
+  f_000_011_100_110_0(uniques, 10);
+  f_000_011_100_110_1(uniques, 10);
+  f_000_011_100_111_0(uniques, 10);
+  f_000_011_100_111_1(uniques, 10);
+  f_000_011_101_010_0(uniques, 10);
+  f_000_011_101_010_1(uniques, 10);
+  f_000_011_101_011_0(uniques, 10);
+  f_000_011_101_011_1(uniques, 10);
+  f_000_011_101_110_0(uniques, 10);
+  f_000_011_101_110_1(uniques, 10);
+  f_000_011_101_111_0(uniques, 10);
+  f_000_011_101_111_1(uniques, 10);
+  f_000_011_110_010_0(uniques, 10);
+  f_000_011_110_010_1(uniques, 10);
+  f_000_011_110_011_0(uniques, 10);
+  f_000_011_110_011_1(uniques, 10);
+  f_000_011_110_110_0(uniques, 10);
+  f_000_011_110_110_1(uniques, 10);
+  f_000_011_110_111_0(uniques, 10);
+  f_000_011_110_111_1(uniques, 10);
+  f_000_011_111_010_0(uniques, 10);
+  f_000_011_111_010_1(uniques, 10);
+  f_000_011_111_011_0(uniques, 10);
+  f_000_011_111_011_1(uniques, 10);
+  f_000_011_111_110_0(uniques, 10);
+  f_000_011_111_110_1(uniques, 10);
+  f_000_011_111_111_0(uniques, 10);
+  f_000_011_111_111_1(uniques, 10);
+  f_000_100_000_010_0(uniques, 10);
+  f_000_100_000_010_1(uniques, 10);
+  f_000_100_000_011_0(uniques, 10);
+  f_000_100_000_011_1(uniques, 10);
+  f_000_100_000_110_0(uniques, 10);
+  f_000_100_000_110_1(uniques, 10);
+  f_000_100_000_111_0(uniques, 10);
+  f_000_100_000_111_1(uniques, 10);
+  f_000_100_001_010_0(uniques, 10);
+  f_000_100_001_010_1(uniques, 10);
+  f_000_100_001_011_0(uniques, 10);
+  f_000_100_001_011_1(uniques, 10);
+  f_000_100_001_110_0(uniques, 10);
+  f_000_100_001_110_1(uniques, 10);
+  f_000_100_001_111_0(uniques, 10);
+  f_000_100_001_111_1(uniques, 10);
+  f_000_100_010_010_0(uniques, 10);
+  f_000_100_010_010_1(uniques, 10);
+  f_000_100_010_011_0(uniques, 10);
+  f_000_100_010_011_1(uniques, 10);
+  f_000_100_010_110_0(uniques, 10);
+  f_000_100_010_110_1(uniques, 10);
+  f_000_100_010_111_0(uniques, 10);
+  f_000_100_010_111_1(uniques, 10);
+  f_000_100_011_010_0(uniques, 10);
+  f_000_100_011_010_1(uniques, 10);
+  f_000_100_011_011_0(uniques, 10);
+  f_000_100_011_011_1(uniques, 10);
+  f_000_100_011_110_0(uniques, 10);
+  f_000_100_011_110_1(uniques, 10);
+  f_000_100_011_111_0(uniques, 10);
+  f_000_100_011_111_1(uniques, 10);
+  f_000_100_100_010_0(uniques, 10);
+  f_000_100_100_010_1(uniques, 10);
+  f_000_100_100_011_0(uniques, 10);
+  f_000_100_100_011_1(uniques, 10);
+  f_000_100_100_110_0(uniques, 10);
+  f_000_100_100_110_1(uniques, 10);
+  f_000_100_100_111_0(uniques, 10);
+  f_000_100_100_111_1(uniques, 10);
+  f_000_100_101_010_0(uniques, 10);
+  f_000_100_101_010_1(uniques, 10);
+  f_000_100_101_011_0(uniques, 10);
+  f_000_100_101_011_1(uniques, 10);
+  f_000_100_101_110_0(uniques, 10);
+  f_000_100_101_110_1(uniques, 10);
+  f_000_100_101_111_0(uniques, 10);
+  f_000_100_101_111_1(uniques, 10);
+  f_000_100_110_010_0(uniques, 10);
+  f_000_100_110_010_1(uniques, 10);
+  f_000_100_110_011_0(uniques, 10);
+  f_000_100_110_011_1(uniques, 10);
+  f_000_100_110_110_0(uniques, 10);
+  f_000_100_110_110_1(uniques, 10);
+  f_000_100_110_111_0(uniques, 10);
+  f_000_100_110_111_1(uniques, 10);
+  f_000_100_111_010_0(uniques, 10);
+  f_000_100_111_010_1(uniques, 10);
+  f_000_100_111_011_0(uniques, 10);
+  f_000_100_111_011_1(uniques, 10);
+  f_000_100_111_110_0(uniques, 10);
+  f_000_100_111_110_1(uniques, 10);
+  f_000_100_111_111_0(uniques, 10);
+  f_000_100_111_111_1(uniques, 10);
+  f_000_101_000_010_0(uniques, 10);
+  f_000_101_000_010_1(uniques, 10);
+  f_000_101_000_011_0(uniques, 10);
+  f_000_101_000_011_1(uniques, 10);
+  f_000_101_000_110_0(uniques, 10);
+  f_000_101_000_110_1(uniques, 10);
+  f_000_101_000_111_0(uniques, 10);
+  f_000_101_000_111_1(uniques, 10);
+  f_000_101_001_010_0(uniques, 10);
+  f_000_101_001_010_1(uniques, 10);
+  f_000_101_001_011_0(uniques, 10);
+  f_000_101_001_011_1(uniques, 10);
+  f_000_101_001_110_0(uniques, 10);
+  f_000_101_001_110_1(uniques, 10);
+  f_000_101_001_111_0(uniques, 10);
+  f_000_101_001_111_1(uniques, 10);
+  f_000_101_010_010_0(uniques, 10);
+  f_000_101_010_010_1(uniques, 10);
+  f_000_101_010_011_0(uniques, 10);
+  f_000_101_010_011_1(uniques, 10);
+  f_000_101_010_110_0(uniques, 10);
+  f_000_101_010_110_1(uniques, 10);
+  f_000_101_010_111_0(uniques, 10);
+  f_000_101_010_111_1(uniques, 10);
+  f_000_101_011_010_0(uniques, 10);
+  f_000_101_011_010_1(uniques, 10);
+  f_000_101_011_011_0(uniques, 10);
+  f_000_101_011_011_1(uniques, 10);
+  f_000_101_011_110_0(uniques, 10);
+  f_000_101_011_110_1(uniques, 10);
+  f_000_101_011_111_0(uniques, 10);
+  f_000_101_011_111_1(uniques, 10);
+  f_000_101_100_010_0(uniques, 10);
+  f_000_101_100_010_1(uniques, 10);
+  f_000_101_100_011_0(uniques, 10);
+  f_000_101_100_011_1(uniques, 10);
+  f_000_101_100_110_0(uniques, 10);
+  f_000_101_100_110_1(uniques, 10);
+  f_000_101_100_111_0(uniques, 10);
+  f_000_101_100_111_1(uniques, 10);
+  f_000_101_101_010_0(uniques, 10);
+  f_000_101_101_010_1(uniques, 10);
+  f_000_101_101_011_0(uniques, 10);
+  f_000_101_101_011_1(uniques, 10);
+  f_000_101_101_110_0(uniques, 10);
+  f_000_101_101_110_1(uniques, 10);
+  f_000_101_101_111_0(uniques, 10);
+  f_000_101_101_111_1(uniques, 10);
+  f_000_101_110_010_0(uniques, 10);
+  f_000_101_110_010_1(uniques, 10);
+  f_000_101_110_011_0(uniques, 10);
+  f_000_101_110_011_1(uniques, 10);
+  f_000_101_110_110_0(uniques, 10);
+  f_000_101_110_110_1(uniques, 10);
+  f_000_101_110_111_0(uniques, 10);
+  f_000_101_110_111_1(uniques, 10);
+  f_000_101_111_010_0(uniques, 10);
+  f_000_101_111_010_1(uniques, 10);
+  f_000_101_111_011_0(uniques, 10);
+  f_000_101_111_011_1(uniques, 10);
+  f_000_101_111_110_0(uniques, 10);
+  f_000_101_111_110_1(uniques, 10);
+  f_000_101_111_111_0(uniques, 10);
+  f_000_101_111_111_1(uniques, 10);
+  f_000_110_000_010_0(uniques, 10);
+  f_000_110_000_010_1(uniques, 10);
+  f_000_110_000_011_0(uniques, 10);
+  f_000_110_000_011_1(uniques, 10);
+  f_000_110_000_110_0(uniques, 10);
+  f_000_110_000_110_1(uniques, 10);
+  f_000_110_000_111_0(uniques, 10);
+  f_000_110_000_111_1(uniques, 10);
+  f_000_110_001_010_0(uniques, 10);
+  f_000_110_001_010_1(uniques, 10);
+  f_000_110_001_011_0(uniques, 10);
+  f_000_110_001_011_1(uniques, 10);
+  f_000_110_001_110_0(uniques, 10);
+  f_000_110_001_110_1(uniques, 10);
+  f_000_110_001_111_0(uniques, 10);
+  f_000_110_001_111_1(uniques, 10);
+  f_000_110_010_010_0(uniques, 10);
+  f_000_110_010_010_1(uniques, 10);
+  f_000_110_010_011_0(uniques, 10);
+  f_000_110_010_011_1(uniques, 10);
+  f_000_110_010_110_0(uniques, 10);
+  f_000_110_010_110_1(uniques, 10);
+  f_000_110_010_111_0(uniques, 10);
+  f_000_110_010_111_1(uniques, 10);
+  f_000_110_011_010_0(uniques, 10);
+  f_000_110_011_010_1(uniques, 10);
+  f_000_110_011_011_0(uniques, 10);
+  f_000_110_011_011_1(uniques, 10);
+  f_000_110_011_110_0(uniques, 10);
+  f_000_110_011_110_1(uniques, 10);
+  f_000_110_011_111_0(uniques, 10);
+  f_000_110_011_111_1(uniques, 10);
+  f_000_110_100_010_0(uniques, 10);
+  f_000_110_100_010_1(uniques, 10);
+  f_000_110_100_011_0(uniques, 10);
+  f_000_110_100_011_1(uniques, 10);
+  f_000_110_100_110_0(uniques, 10);
+  f_000_110_100_110_1(uniques, 10);
+  f_000_110_100_111_0(uniques, 10);
+  f_000_110_100_111_1(uniques, 10);
+  f_000_110_101_010_0(uniques, 10);
+  f_000_110_101_010_1(uniques, 10);
+  f_000_110_101_011_0(uniques, 10);
+  f_000_110_101_011_1(uniques, 10);
+  f_000_110_101_110_0(uniques, 10);
+  f_000_110_101_110_1(uniques, 10);
+  f_000_110_101_111_0(uniques, 10);
+  f_000_110_101_111_1(uniques, 10);
+  f_000_110_110_010_0(uniques, 10);
+  f_000_110_110_010_1(uniques, 10);
+  f_000_110_110_011_0(uniques, 10);
+  f_000_110_110_011_1(uniques, 10);
+  f_000_110_110_110_0(uniques, 10);
+  f_000_110_110_110_1(uniques, 10);
+  f_000_110_110_111_0(uniques, 10);
+  f_000_110_110_111_1(uniques, 10);
+  f_000_110_111_010_0(uniques, 10);
+  f_000_110_111_010_1(uniques, 10);
+  f_000_110_111_011_0(uniques, 10);
+  f_000_110_111_011_1(uniques, 10);
+  f_000_110_111_110_0(uniques, 10);
+  f_000_110_111_110_1(uniques, 10);
+  f_000_110_111_111_0(uniques, 10);
+  f_000_110_111_111_1(uniques, 10);
+  f_000_111_000_010_0(uniques, 10);
+  f_000_111_000_010_1(uniques, 10);
+  f_000_111_000_011_0(uniques, 10);
+  f_000_111_000_011_1(uniques, 10);
+  f_000_111_000_110_0(uniques, 10);
+  f_000_111_000_110_1(uniques, 10);
+  f_000_111_000_111_0(uniques, 10);
+  f_000_111_000_111_1(uniques, 10);
+  f_000_111_001_010_0(uniques, 10);
+  f_000_111_001_010_1(uniques, 10);
+  f_000_111_001_011_0(uniques, 10);
+  f_000_111_001_011_1(uniques, 10);
+  f_000_111_001_110_0(uniques, 10);
+  f_000_111_001_110_1(uniques, 10);
+  f_000_111_001_111_0(uniques, 10);
+  f_000_111_001_111_1(uniques, 10);
+  f_000_111_010_010_0(uniques, 10);
+  f_000_111_010_010_1(uniques, 10);
+  f_000_111_010_011_0(uniques, 10);
+  f_000_111_010_011_1(uniques, 10);
+  f_000_111_010_110_0(uniques, 10);
+  f_000_111_010_110_1(uniques, 10);
+  f_000_111_010_111_0(uniques, 10);
+  f_000_111_010_111_1(uniques, 10);
+  f_000_111_011_010_0(uniques, 10);
+  f_000_111_011_010_1(uniques, 10);
+  f_000_111_011_011_0(uniques, 10);
+  f_000_111_011_011_1(uniques, 10);
+  f_000_111_011_110_0(uniques, 10);
+  f_000_111_011_110_1(uniques, 10);
+  f_000_111_011_111_0(uniques, 10);
+  f_000_111_011_111_1(uniques, 10);
+  f_000_111_100_010_0(uniques, 10);
+  f_000_111_100_010_1(uniques, 10);
+  f_000_111_100_011_0(uniques, 10);
+  f_000_111_100_011_1(uniques, 10);
+  f_000_111_100_110_0(uniques, 10);
+  f_000_111_100_110_1(uniques, 10);
+  f_000_111_100_111_0(uniques, 10);
+  f_000_111_100_111_1(uniques, 10);
+  f_000_111_101_010_0(uniques, 10);
+  f_000_111_101_010_1(uniques, 10);
+  f_000_111_101_011_0(uniques, 10);
+  f_000_111_101_011_1(uniques, 10);
+  f_000_111_101_110_0(uniques, 10);
+  f_000_111_101_110_1(uniques, 10);
+  f_000_111_101_111_0(uniques, 10);
+  f_000_111_101_111_1(uniques, 10);
+  f_000_111_110_010_0(uniques, 10);
+  f_000_111_110_010_1(uniques, 10);
+  f_000_111_110_011_0(uniques, 10);
+  f_000_111_110_011_1(uniques, 10);
+  f_000_111_110_110_0(uniques, 10);
+  f_000_111_110_110_1(uniques, 10);
+  f_000_111_110_111_0(uniques, 10);
+  f_000_111_110_111_1(uniques, 10);
+  f_000_111_111_010_0(uniques, 10);
+  f_000_111_111_010_1(uniques, 10);
+  f_000_111_111_011_0(uniques, 10);
+  f_000_111_111_011_1(uniques, 10);
+  f_000_111_111_110_0(uniques, 10);
+  f_000_111_111_110_1(uniques, 10);
+  f_000_111_111_111_0(uniques, 10);
+  f_000_111_111_111_1(uniques, 10);
+  f_001_000_000_010_0(uniques, 10);
+  f_001_000_000_010_1(uniques, 10);
+  f_001_000_000_011_0(uniques, 10);
+  f_001_000_000_011_1(uniques, 10);
+  f_001_000_000_110_0(uniques, 10);
+  f_001_000_000_110_1(uniques, 10);
+  f_001_000_000_111_0(uniques, 10);
+  f_001_000_000_111_1(uniques, 10);
+  f_001_000_001_010_0(uniques, 10);
+  f_001_000_001_010_1(uniques, 10);
+  f_001_000_001_011_0(uniques, 10);
+  f_001_000_001_011_1(uniques, 10);
+  f_001_000_001_110_0(uniques, 10);
+  f_001_000_001_110_1(uniques, 10);
+  f_001_000_001_111_0(uniques, 10);
+  f_001_000_001_111_1(uniques, 10);
+  f_001_000_010_010_0(uniques, 10);
+  f_001_000_010_010_1(uniques, 10);
+  f_001_000_010_011_0(uniques, 10);
+  f_001_000_010_011_1(uniques, 10);
+  f_001_000_010_110_0(uniques, 10);
+  f_001_000_010_110_1(uniques, 10);
+  f_001_000_010_111_0(uniques, 10);
+  f_001_000_010_111_1(uniques, 10);
+  f_001_000_011_010_0(uniques, 10);
+  f_001_000_011_010_1(uniques, 10);
+  f_001_000_011_011_0(uniques, 10);
+  f_001_000_011_011_1(uniques, 10);
+  f_001_000_011_110_0(uniques, 10);
+  f_001_000_011_110_1(uniques, 10);
+  f_001_000_011_111_0(uniques, 10);
+  f_001_000_011_111_1(uniques, 10);
+  f_001_000_100_010_0(uniques, 10);
+  f_001_000_100_010_1(uniques, 10);
+  f_001_000_100_011_0(uniques, 10);
+  f_001_000_100_011_1(uniques, 10);
+  f_001_000_100_110_0(uniques, 10);
+  f_001_000_100_110_1(uniques, 10);
+  f_001_000_100_111_0(uniques, 10);
+  f_001_000_100_111_1(uniques, 10);
+  f_001_000_101_010_0(uniques, 10);
+  f_001_000_101_010_1(uniques, 10);
+  f_001_000_101_011_0(uniques, 10);
+  f_001_000_101_011_1(uniques, 10);
+  f_001_000_101_110_0(uniques, 10);
+  f_001_000_101_110_1(uniques, 10);
+  f_001_000_101_111_0(uniques, 10);
+  f_001_000_101_111_1(uniques, 10);
+  f_001_000_110_010_0(uniques, 10);
+  f_001_000_110_010_1(uniques, 10);
+  f_001_000_110_011_0(uniques, 10);
+  f_001_000_110_011_1(uniques, 10);
+  f_001_000_110_110_0(uniques, 10);
+  f_001_000_110_110_1(uniques, 10);
+  f_001_000_110_111_0(uniques, 10);
+  f_001_000_110_111_1(uniques, 10);
+  f_001_000_111_010_0(uniques, 10);
+  f_001_000_111_010_1(uniques, 10);
+  f_001_000_111_011_0(uniques, 10);
+  f_001_000_111_011_1(uniques, 10);
+  f_001_000_111_110_0(uniques, 10);
+  f_001_000_111_110_1(uniques, 10);
+  f_001_000_111_111_0(uniques, 10);
+  f_001_000_111_111_1(uniques, 10);
+  f_001_001_000_010_0(uniques, 10);
+  f_001_001_000_010_1(uniques, 10);
+  f_001_001_000_011_0(uniques, 10);
+  f_001_001_000_011_1(uniques, 10);
+  f_001_001_000_110_0(uniques, 10);
+  f_001_001_000_110_1(uniques, 10);
+  f_001_001_000_111_0(uniques, 10);
+  f_001_001_000_111_1(uniques, 10);
+  f_001_001_001_010_0(uniques, 10);
+  f_001_001_001_010_1(uniques, 10);
+  f_001_001_001_011_0(uniques, 10);
+  f_001_001_001_011_1(uniques, 10);
+  f_001_001_001_110_0(uniques, 10);
+  f_001_001_001_110_1(uniques, 10);
+  f_001_001_001_111_0(uniques, 10);
+  f_001_001_001_111_1(uniques, 10);
+  f_001_001_010_010_0(uniques, 10);
+  f_001_001_010_010_1(uniques, 10);
+  f_001_001_010_011_0(uniques, 10);
+  f_001_001_010_011_1(uniques, 10);
+  f_001_001_010_110_0(uniques, 10);
+  f_001_001_010_110_1(uniques, 10);
+  f_001_001_010_111_0(uniques, 10);
+  f_001_001_010_111_1(uniques, 10);
+  f_001_001_011_010_0(uniques, 10);
+  f_001_001_011_010_1(uniques, 10);
+  f_001_001_011_011_0(uniques, 10);
+  f_001_001_011_011_1(uniques, 10);
+  f_001_001_011_110_0(uniques, 10);
+  f_001_001_011_110_1(uniques, 10);
+  f_001_001_011_111_0(uniques, 10);
+  f_001_001_011_111_1(uniques, 10);
+  f_001_001_100_010_0(uniques, 10);
+  f_001_001_100_010_1(uniques, 10);
+  f_001_001_100_011_0(uniques, 10);
+  f_001_001_100_011_1(uniques, 10);
+  f_001_001_100_110_0(uniques, 10);
+  f_001_001_100_110_1(uniques, 10);
+  f_001_001_100_111_0(uniques, 10);
+  f_001_001_100_111_1(uniques, 10);
+  f_001_001_101_010_0(uniques, 10);
+  f_001_001_101_010_1(uniques, 10);
+  f_001_001_101_011_0(uniques, 10);
+  f_001_001_101_011_1(uniques, 10);
+  f_001_001_101_110_0(uniques, 10);
+  f_001_001_101_110_1(uniques, 10);
+  f_001_001_101_111_0(uniques, 10);
+  f_001_001_101_111_1(uniques, 10);
+  f_001_001_110_010_0(uniques, 10);
+  f_001_001_110_010_1(uniques, 10);
+  f_001_001_110_011_0(uniques, 10);
+  f_001_001_110_011_1(uniques, 10);
+  f_001_001_110_110_0(uniques, 10);
+  f_001_001_110_110_1(uniques, 10);
+  f_001_001_110_111_0(uniques, 10);
+  f_001_001_110_111_1(uniques, 10);
+  f_001_001_111_010_0(uniques, 10);
+  f_001_001_111_010_1(uniques, 10);
+  f_001_001_111_011_0(uniques, 10);
+  f_001_001_111_011_1(uniques, 10);
+  f_001_001_111_110_0(uniques, 10);
+  f_001_001_111_110_1(uniques, 10);
+  f_001_001_111_111_0(uniques, 10);
+  f_001_001_111_111_1(uniques, 10);
+  f_001_010_000_010_0(uniques, 10);
+  f_001_010_000_010_1(uniques, 10);
+  f_001_010_000_011_0(uniques, 10);
+  f_001_010_000_011_1(uniques, 10);
+  f_001_010_000_110_0(uniques, 10);
+  f_001_010_000_110_1(uniques, 10);
+  f_001_010_000_111_0(uniques, 10);
+  f_001_010_000_111_1(uniques, 10);
+  f_001_010_001_010_0(uniques, 10);
+  f_001_010_001_010_1(uniques, 10);
+  f_001_010_001_011_0(uniques, 10);
+  f_001_010_001_011_1(uniques, 10);
+  f_001_010_001_110_0(uniques, 10);
+  f_001_010_001_110_1(uniques, 10);
+  f_001_010_001_111_0(uniques, 10);
+  f_001_010_001_111_1(uniques, 10);
+  f_001_010_010_010_0(uniques, 10);
+  f_001_010_010_010_1(uniques, 10);
+  f_001_010_010_011_0(uniques, 10);
+  f_001_010_010_011_1(uniques, 10);
+  f_001_010_010_110_0(uniques, 10);
+  f_001_010_010_110_1(uniques, 10);
+  f_001_010_010_111_0(uniques, 10);
+  f_001_010_010_111_1(uniques, 10);
+  f_001_010_011_010_0(uniques, 10);
+  f_001_010_011_010_1(uniques, 10);
+  f_001_010_011_011_0(uniques, 10);
+  f_001_010_011_011_1(uniques, 10);
+  f_001_010_011_110_0(uniques, 10);
+  f_001_010_011_110_1(uniques, 10);
+  f_001_010_011_111_0(uniques, 10);
+  f_001_010_011_111_1(uniques, 10);
+  f_001_010_100_010_0(uniques, 10);
+  f_001_010_100_010_1(uniques, 10);
+  f_001_010_100_011_0(uniques, 10);
+  f_001_010_100_011_1(uniques, 10);
+  f_001_010_100_110_0(uniques, 10);
+  f_001_010_100_110_1(uniques, 10);
+  f_001_010_100_111_0(uniques, 10);
+  f_001_010_100_111_1(uniques, 10);
+  f_001_010_101_010_0(uniques, 10);
+  f_001_010_101_010_1(uniques, 10);
+  f_001_010_101_011_0(uniques, 10);
+  f_001_010_101_011_1(uniques, 10);
+  f_001_010_101_110_0(uniques, 10);
+  f_001_010_101_110_1(uniques, 10);
+  f_001_010_101_111_0(uniques, 10);
+  f_001_010_101_111_1(uniques, 10);
+  f_001_010_110_010_0(uniques, 10);
+  f_001_010_110_010_1(uniques, 10);
+  f_001_010_110_011_0(uniques, 10);
+  f_001_010_110_011_1(uniques, 10);
+  f_001_010_110_110_0(uniques, 10);
+  f_001_010_110_110_1(uniques, 10);
+  f_001_010_110_111_0(uniques, 10);
+  f_001_010_110_111_1(uniques, 10);
+  f_001_010_111_010_0(uniques, 10);
+  f_001_010_111_010_1(uniques, 10);
+  f_001_010_111_011_0(uniques, 10);
+  f_001_010_111_011_1(uniques, 10);
+  f_001_010_111_110_0(uniques, 10);
+  f_001_010_111_110_1(uniques, 10);
+  f_001_010_111_111_0(uniques, 10);
+  f_001_010_111_111_1(uniques, 10);
+  f_001_011_000_010_0(uniques, 10);
+  f_001_011_000_010_1(uniques, 10);
+  f_001_011_000_011_0(uniques, 10);
+  f_001_011_000_011_1(uniques, 10);
+  f_001_011_000_110_0(uniques, 10);
+  f_001_011_000_110_1(uniques, 10);
+  f_001_011_000_111_0(uniques, 10);
+  f_001_011_000_111_1(uniques, 10);
+  f_001_011_001_010_0(uniques, 10);
+  f_001_011_001_010_1(uniques, 10);
+  f_001_011_001_011_0(uniques, 10);
+  f_001_011_001_011_1(uniques, 10);
+  f_001_011_001_110_0(uniques, 10);
+  f_001_011_001_110_1(uniques, 10);
+  f_001_011_001_111_0(uniques, 10);
+  f_001_011_001_111_1(uniques, 10);
+  f_001_011_010_010_0(uniques, 10);
+  f_001_011_010_010_1(uniques, 10);
+  f_001_011_010_011_0(uniques, 10);
+  f_001_011_010_011_1(uniques, 10);
+  f_001_011_010_110_0(uniques, 10);
+  f_001_011_010_110_1(uniques, 10);
+  f_001_011_010_111_0(uniques, 10);
+  f_001_011_010_111_1(uniques, 10);
+  f_001_011_011_010_0(uniques, 10);
+  f_001_011_011_010_1(uniques, 10);
+  f_001_011_011_011_0(uniques, 10);
+  f_001_011_011_011_1(uniques, 10);
+  f_001_011_011_110_0(uniques, 10);
+  f_001_011_011_110_1(uniques, 10);
+  f_001_011_011_111_0(uniques, 10);
+  f_001_011_011_111_1(uniques, 10);
+  f_001_011_100_010_0(uniques, 10);
+  f_001_011_100_010_1(uniques, 10);
+  f_001_011_100_011_0(uniques, 10);
+  f_001_011_100_011_1(uniques, 10);
+  f_001_011_100_110_0(uniques, 10);
+  f_001_011_100_110_1(uniques, 10);
+  f_001_011_100_111_0(uniques, 10);
+  f_001_011_100_111_1(uniques, 10);
+  f_001_011_101_010_0(uniques, 10);
+  f_001_011_101_010_1(uniques, 10);
+  f_001_011_101_011_0(uniques, 10);
+  f_001_011_101_011_1(uniques, 10);
+  f_001_011_101_110_0(uniques, 10);
+  f_001_011_101_110_1(uniques, 10);
+  f_001_011_101_111_0(uniques, 10);
+  f_001_011_101_111_1(uniques, 10);
+  f_001_011_110_010_0(uniques, 10);
+  f_001_011_110_010_1(uniques, 10);
+  f_001_011_110_011_0(uniques, 10);
+  f_001_011_110_011_1(uniques, 10);
+  f_001_011_110_110_0(uniques, 10);
+  f_001_011_110_110_1(uniques, 10);
+  f_001_011_110_111_0(uniques, 10);
+  f_001_011_110_111_1(uniques, 10);
+  f_001_011_111_010_0(uniques, 10);
+  f_001_011_111_010_1(uniques, 10);
+  f_001_011_111_011_0(uniques, 10);
+  f_001_011_111_011_1(uniques, 10);
+  f_001_011_111_110_0(uniques, 10);
+  f_001_011_111_110_1(uniques, 10);
+  f_001_011_111_111_0(uniques, 10);
+  f_001_011_111_111_1(uniques, 10);
+  f_001_100_000_010_0(uniques, 10);
+  f_001_100_000_010_1(uniques, 10);
+  f_001_100_000_011_0(uniques, 10);
+  f_001_100_000_011_1(uniques, 10);
+  f_001_100_000_110_0(uniques, 10);
+  f_001_100_000_110_1(uniques, 10);
+  f_001_100_000_111_0(uniques, 10);
+  f_001_100_000_111_1(uniques, 10);
+  f_001_100_001_010_0(uniques, 10);
+  f_001_100_001_010_1(uniques, 10);
+  f_001_100_001_011_0(uniques, 10);
+  f_001_100_001_011_1(uniques, 10);
+  f_001_100_001_110_0(uniques, 10);
+  f_001_100_001_110_1(uniques, 10);
+  f_001_100_001_111_0(uniques, 10);
+  f_001_100_001_111_1(uniques, 10);
+  f_001_100_010_010_0(uniques, 10);
+  f_001_100_010_010_1(uniques, 10);
+  f_001_100_010_011_0(uniques, 10);
+  f_001_100_010_011_1(uniques, 10);
+  f_001_100_010_110_0(uniques, 10);
+  f_001_100_010_110_1(uniques, 10);
+  f_001_100_010_111_0(uniques, 10);
+  f_001_100_010_111_1(uniques, 10);
+  f_001_100_011_010_0(uniques, 10);
+  f_001_100_011_010_1(uniques, 10);
+  f_001_100_011_011_0(uniques, 10);
+  f_001_100_011_011_1(uniques, 10);
+  f_001_100_011_110_0(uniques, 10);
+  f_001_100_011_110_1(uniques, 10);
+  f_001_100_011_111_0(uniques, 10);
+  f_001_100_011_111_1(uniques, 10);
+  f_001_100_100_010_0(uniques, 10);
+  f_001_100_100_010_1(uniques, 10);
+  f_001_100_100_011_0(uniques, 10);
+  f_001_100_100_011_1(uniques, 10);
+  f_001_100_100_110_0(uniques, 10);
+  f_001_100_100_110_1(uniques, 10);
+  f_001_100_100_111_0(uniques, 10);
+  f_001_100_100_111_1(uniques, 10);
+  f_001_100_101_010_0(uniques, 10);
+  f_001_100_101_010_1(uniques, 10);
+  f_001_100_101_011_0(uniques, 10);
+  f_001_100_101_011_1(uniques, 10);
+  f_001_100_101_110_0(uniques, 10);
+  f_001_100_101_110_1(uniques, 10);
+  f_001_100_101_111_0(uniques, 10);
+  f_001_100_101_111_1(uniques, 10);
+  f_001_100_110_010_0(uniques, 10);
+  f_001_100_110_010_1(uniques, 10);
+  f_001_100_110_011_0(uniques, 10);
+  f_001_100_110_011_1(uniques, 10);
+  f_001_100_110_110_0(uniques, 10);
+  f_001_100_110_110_1(uniques, 10);
+  f_001_100_110_111_0(uniques, 10);
+  f_001_100_110_111_1(uniques, 10);
+  f_001_100_111_010_0(uniques, 10);
+  f_001_100_111_010_1(uniques, 10);
+  f_001_100_111_011_0(uniques, 10);
+  f_001_100_111_011_1(uniques, 10);
+  f_001_100_111_110_0(uniques, 10);
+  f_001_100_111_110_1(uniques, 10);
+  f_001_100_111_111_0(uniques, 10);
+  f_001_100_111_111_1(uniques, 10);
+  f_001_101_000_010_0(uniques, 10);
+  f_001_101_000_010_1(uniques, 10);
+  f_001_101_000_011_0(uniques, 10);
+  f_001_101_000_011_1(uniques, 10);
+  f_001_101_000_110_0(uniques, 10);
+  f_001_101_000_110_1(uniques, 10);
+  f_001_101_000_111_0(uniques, 10);
+  f_001_101_000_111_1(uniques, 10);
+  f_001_101_001_010_0(uniques, 10);
+  f_001_101_001_010_1(uniques, 10);
+  f_001_101_001_011_0(uniques, 10);
+  f_001_101_001_011_1(uniques, 10);
+  f_001_101_001_110_0(uniques, 10);
+  f_001_101_001_110_1(uniques, 10);
+  f_001_101_001_111_0(uniques, 10);
+  f_001_101_001_111_1(uniques, 10);
+  f_001_101_010_010_0(uniques, 10);
+  f_001_101_010_010_1(uniques, 10);
+  f_001_101_010_011_0(uniques, 10);
+  f_001_101_010_011_1(uniques, 10);
+  f_001_101_010_110_0(uniques, 10);
+  f_001_101_010_110_1(uniques, 10);
+  f_001_101_010_111_0(uniques, 10);
+  f_001_101_010_111_1(uniques, 10);
+  f_001_101_011_010_0(uniques, 10);
+  f_001_101_011_010_1(uniques, 10);
+  f_001_101_011_011_0(uniques, 10);
+  f_001_101_011_011_1(uniques, 10);
+  f_001_101_011_110_0(uniques, 10);
+  f_001_101_011_110_1(uniques, 10);
+  f_001_101_011_111_0(uniques, 10);
+  f_001_101_011_111_1(uniques, 10);
+  f_001_101_100_010_0(uniques, 10);
+  f_001_101_100_010_1(uniques, 10);
+  f_001_101_100_011_0(uniques, 10);
+  f_001_101_100_011_1(uniques, 10);
+  f_001_101_100_110_0(uniques, 10);
+  f_001_101_100_110_1(uniques, 10);
+  f_001_101_100_111_0(uniques, 10);
+  f_001_101_100_111_1(uniques, 10);
+  f_001_101_101_010_0(uniques, 10);
+  f_001_101_101_010_1(uniques, 10);
+  f_001_101_101_011_0(uniques, 10);
+  f_001_101_101_011_1(uniques, 10);
+  f_001_101_101_110_0(uniques, 10);
+  f_001_101_101_110_1(uniques, 10);
+  f_001_101_101_111_0(uniques, 10);
+  f_001_101_101_111_1(uniques, 10);
+  f_001_101_110_010_0(uniques, 10);
+  f_001_101_110_010_1(uniques, 10);
+  f_001_101_110_011_0(uniques, 10);
+  f_001_101_110_011_1(uniques, 10);
+  f_001_101_110_110_0(uniques, 10);
+  f_001_101_110_110_1(uniques, 10);
+  f_001_101_110_111_0(uniques, 10);
+  f_001_101_110_111_1(uniques, 10);
+  f_001_101_111_010_0(uniques, 10);
+  f_001_101_111_010_1(uniques, 10);
+  f_001_101_111_011_0(uniques, 10);
+  f_001_101_111_011_1(uniques, 10);
+  f_001_101_111_110_0(uniques, 10);
+  f_001_101_111_110_1(uniques, 10);
+  f_001_101_111_111_0(uniques, 10);
+  f_001_101_111_111_1(uniques, 10);
+  f_001_110_000_010_0(uniques, 10);
+  f_001_110_000_010_1(uniques, 10);
+  f_001_110_000_011_0(uniques, 10);
+  f_001_110_000_011_1(uniques, 10);
+  f_001_110_000_110_0(uniques, 10);
+  f_001_110_000_110_1(uniques, 10);
+  f_001_110_000_111_0(uniques, 10);
+  f_001_110_000_111_1(uniques, 10);
+  f_001_110_001_010_0(uniques, 10);
+  f_001_110_001_010_1(uniques, 10);
+  f_001_110_001_011_0(uniques, 10);
+  f_001_110_001_011_1(uniques, 10);
+  f_001_110_001_110_0(uniques, 10);
+  f_001_110_001_110_1(uniques, 10);
+  f_001_110_001_111_0(uniques, 10);
+  f_001_110_001_111_1(uniques, 10);
+  f_001_110_010_010_0(uniques, 10);
+  f_001_110_010_010_1(uniques, 10);
+  f_001_110_010_011_0(uniques, 10);
+  f_001_110_010_011_1(uniques, 10);
+  f_001_110_010_110_0(uniques, 10);
+  f_001_110_010_110_1(uniques, 10);
+  f_001_110_010_111_0(uniques, 10);
+  f_001_110_010_111_1(uniques, 10);
+  f_001_110_011_010_0(uniques, 10);
+  f_001_110_011_010_1(uniques, 10);
+  f_001_110_011_011_0(uniques, 10);
+  f_001_110_011_011_1(uniques, 10);
+  f_001_110_011_110_0(uniques, 10);
+  f_001_110_011_110_1(uniques, 10);
+  f_001_110_011_111_0(uniques, 10);
+  f_001_110_011_111_1(uniques, 10);
+  f_001_110_100_010_0(uniques, 10);
+  f_001_110_100_010_1(uniques, 10);
+  f_001_110_100_011_0(uniques, 10);
+  f_001_110_100_011_1(uniques, 10);
+  f_001_110_100_110_0(uniques, 10);
+  f_001_110_100_110_1(uniques, 10);
+  f_001_110_100_111_0(uniques, 10);
+  f_001_110_100_111_1(uniques, 10);
+  f_001_110_101_010_0(uniques, 10);
+  f_001_110_101_010_1(uniques, 10);
+  f_001_110_101_011_0(uniques, 10);
+  f_001_110_101_011_1(uniques, 10);
+  f_001_110_101_110_0(uniques, 10);
+  f_001_110_101_110_1(uniques, 10);
+  f_001_110_101_111_0(uniques, 10);
+  f_001_110_101_111_1(uniques, 10);
+  f_001_110_110_010_0(uniques, 10);
+  f_001_110_110_010_1(uniques, 10);
+  f_001_110_110_011_0(uniques, 10);
+  f_001_110_110_011_1(uniques, 10);
+  f_001_110_110_110_0(uniques, 10);
+  f_001_110_110_110_1(uniques, 10);
+  f_001_110_110_111_0(uniques, 10);
+  f_001_110_110_111_1(uniques, 10);
+  f_001_110_111_010_0(uniques, 10);
+  f_001_110_111_010_1(uniques, 10);
+  f_001_110_111_011_0(uniques, 10);
+  f_001_110_111_011_1(uniques, 10);
+  f_001_110_111_110_0(uniques, 10);
+  f_001_110_111_110_1(uniques, 10);
+  f_001_110_111_111_0(uniques, 10);
+  f_001_110_111_111_1(uniques, 10);
+  f_001_111_000_010_0(uniques, 10);
+  f_001_111_000_010_1(uniques, 10);
+  f_001_111_000_011_0(uniques, 10);
+  f_001_111_000_011_1(uniques, 10);
+  f_001_111_000_110_0(uniques, 10);
+  f_001_111_000_110_1(uniques, 10);
+  f_001_111_000_111_0(uniques, 10);
+  f_001_111_000_111_1(uniques, 10);
+  f_001_111_001_010_0(uniques, 10);
+  f_001_111_001_010_1(uniques, 10);
+  f_001_111_001_011_0(uniques, 10);
+  f_001_111_001_011_1(uniques, 10);
+  f_001_111_001_110_0(uniques, 10);
+  f_001_111_001_110_1(uniques, 10);
+  f_001_111_001_111_0(uniques, 10);
+  f_001_111_001_111_1(uniques, 10);
+  f_001_111_010_010_0(uniques, 10);
+  f_001_111_010_010_1(uniques, 10);
+  f_001_111_010_011_0(uniques, 10);
+  f_001_111_010_011_1(uniques, 10);
+  f_001_111_010_110_0(uniques, 10);
+  f_001_111_010_110_1(uniques, 10);
+  f_001_111_010_111_0(uniques, 10);
+  f_001_111_010_111_1(uniques, 10);
+  f_001_111_011_010_0(uniques, 10);
+  f_001_111_011_010_1(uniques, 10);
+  f_001_111_011_011_0(uniques, 10);
+  f_001_111_011_011_1(uniques, 10);
+  f_001_111_011_110_0(uniques, 10);
+  f_001_111_011_110_1(uniques, 10);
+  f_001_111_011_111_0(uniques, 10);
+  f_001_111_011_111_1(uniques, 10);
+  f_001_111_100_010_0(uniques, 10);
+  f_001_111_100_010_1(uniques, 10);
+  f_001_111_100_011_0(uniques, 10);
+  f_001_111_100_011_1(uniques, 10);
+  f_001_111_100_110_0(uniques, 10);
+  f_001_111_100_110_1(uniques, 10);
+  f_001_111_100_111_0(uniques, 10);
+  f_001_111_100_111_1(uniques, 10);
+  f_001_111_101_010_0(uniques, 10);
+  f_001_111_101_010_1(uniques, 10);
+  f_001_111_101_011_0(uniques, 10);
+  f_001_111_101_011_1(uniques, 10);
+  f_001_111_101_110_0(uniques, 10);
+  f_001_111_101_110_1(uniques, 10);
+  f_001_111_101_111_0(uniques, 10);
+  f_001_111_101_111_1(uniques, 10);
+  f_001_111_110_010_0(uniques, 10);
+  f_001_111_110_010_1(uniques, 10);
+  f_001_111_110_011_0(uniques, 10);
+  f_001_111_110_011_1(uniques, 10);
+  f_001_111_110_110_0(uniques, 10);
+  f_001_111_110_110_1(uniques, 10);
+  f_001_111_110_111_0(uniques, 10);
+  f_001_111_110_111_1(uniques, 10);
+  f_001_111_111_010_0(uniques, 10);
+  f_001_111_111_010_1(uniques, 10);
+  f_001_111_111_011_0(uniques, 10);
+  f_001_111_111_011_1(uniques, 10);
+  f_001_111_111_110_0(uniques, 10);
+  f_001_111_111_110_1(uniques, 10);
+  f_001_111_111_111_0(uniques, 10);
+  f_001_111_111_111_1(uniques, 10);
+  f_010_000_000_010_0(uniques, 10);
+  f_010_000_000_010_1(uniques, 10);
+  f_010_000_000_011_0(uniques, 10);
+  f_010_000_000_011_1(uniques, 10);
+  f_010_000_000_110_0(uniques, 10);
+  f_010_000_000_110_1(uniques, 10);
+  f_010_000_000_111_0(uniques, 10);
+  f_010_000_000_111_1(uniques, 10);
+  f_010_000_001_010_0(uniques, 10);
+  f_010_000_001_010_1(uniques, 10);
+  f_010_000_001_011_0(uniques, 10);
+  f_010_000_001_011_1(uniques, 10);
+  f_010_000_001_110_0(uniques, 10);
+  f_010_000_001_110_1(uniques, 10);
+  f_010_000_001_111_0(uniques, 10);
+  f_010_000_001_111_1(uniques, 10);
+  f_010_000_010_010_0(uniques, 10);
+  f_010_000_010_010_1(uniques, 10);
+  f_010_000_010_011_0(uniques, 10);
+  f_010_000_010_011_1(uniques, 10);
+  f_010_000_010_110_0(uniques, 10);
+  f_010_000_010_110_1(uniques, 10);
+  f_010_000_010_111_0(uniques, 10);
+  f_010_000_010_111_1(uniques, 10);
+  f_010_000_011_010_0(uniques, 10);
+  f_010_000_011_010_1(uniques, 10);
+  f_010_000_011_011_0(uniques, 10);
+  f_010_000_011_011_1(uniques, 10);
+  f_010_000_011_110_0(uniques, 10);
+  f_010_000_011_110_1(uniques, 10);
+  f_010_000_011_111_0(uniques, 10);
+  f_010_000_011_111_1(uniques, 10);
+  f_010_000_100_010_0(uniques, 10);
+  f_010_000_100_010_1(uniques, 10);
+  f_010_000_100_011_0(uniques, 10);
+  f_010_000_100_011_1(uniques, 10);
+  f_010_000_100_110_0(uniques, 10);
+  f_010_000_100_110_1(uniques, 10);
+  f_010_000_100_111_0(uniques, 10);
+  f_010_000_100_111_1(uniques, 10);
+  f_010_000_101_010_0(uniques, 10);
+  f_010_000_101_010_1(uniques, 10);
+  f_010_000_101_011_0(uniques, 10);
+  f_010_000_101_011_1(uniques, 10);
+  f_010_000_101_110_0(uniques, 10);
+  f_010_000_101_110_1(uniques, 10);
+  f_010_000_101_111_0(uniques, 10);
+  f_010_000_101_111_1(uniques, 10);
+  f_010_000_110_010_0(uniques, 10);
+  f_010_000_110_010_1(uniques, 10);
+  f_010_000_110_011_0(uniques, 10);
+  f_010_000_110_011_1(uniques, 10);
+  f_010_000_110_110_0(uniques, 10);
+  f_010_000_110_110_1(uniques, 10);
+  f_010_000_110_111_0(uniques, 10);
+  f_010_000_110_111_1(uniques, 10);
+  f_010_000_111_010_0(uniques, 10);
+  f_010_000_111_010_1(uniques, 10);
+  f_010_000_111_011_0(uniques, 10);
+  f_010_000_111_011_1(uniques, 10);
+  f_010_000_111_110_0(uniques, 10);
+  f_010_000_111_110_1(uniques, 10);
+  f_010_000_111_111_0(uniques, 10);
+  f_010_000_111_111_1(uniques, 10);
+  f_010_001_000_010_0(uniques, 10);
+  f_010_001_000_010_1(uniques, 10);
+  f_010_001_000_011_0(uniques, 10);
+  f_010_001_000_011_1(uniques, 10);
+  f_010_001_000_110_0(uniques, 10);
+  f_010_001_000_110_1(uniques, 10);
+  f_010_001_000_111_0(uniques, 10);
+  f_010_001_000_111_1(uniques, 10);
+  f_010_001_001_010_0(uniques, 10);
+  f_010_001_001_010_1(uniques, 10);
+  f_010_001_001_011_0(uniques, 10);
+  f_010_001_001_011_1(uniques, 10);
+  f_010_001_001_110_0(uniques, 10);
+  f_010_001_001_110_1(uniques, 10);
+  f_010_001_001_111_0(uniques, 10);
+  f_010_001_001_111_1(uniques, 10);
+  f_010_001_010_010_0(uniques, 10);
+  f_010_001_010_010_1(uniques, 10);
+  f_010_001_010_011_0(uniques, 10);
+  f_010_001_010_011_1(uniques, 10);
+  f_010_001_010_110_0(uniques, 10);
+  f_010_001_010_110_1(uniques, 10);
+  f_010_001_010_111_0(uniques, 10);
+  f_010_001_010_111_1(uniques, 10);
+  f_010_001_011_010_0(uniques, 10);
+  f_010_001_011_010_1(uniques, 10);
+  f_010_001_011_011_0(uniques, 10);
+  f_010_001_011_011_1(uniques, 10);
+  f_010_001_011_110_0(uniques, 10);
+  f_010_001_011_110_1(uniques, 10);
+  f_010_001_011_111_0(uniques, 10);
+  f_010_001_011_111_1(uniques, 10);
+  f_010_001_100_010_0(uniques, 10);
+  f_010_001_100_010_1(uniques, 10);
+  f_010_001_100_011_0(uniques, 10);
+  f_010_001_100_011_1(uniques, 10);
+  f_010_001_100_110_0(uniques, 10);
+  f_010_001_100_110_1(uniques, 10);
+  f_010_001_100_111_0(uniques, 10);
+  f_010_001_100_111_1(uniques, 10);
+  f_010_001_101_010_0(uniques, 10);
+  f_010_001_101_010_1(uniques, 10);
+  f_010_001_101_011_0(uniques, 10);
+  f_010_001_101_011_1(uniques, 10);
+  f_010_001_101_110_0(uniques, 10);
+  f_010_001_101_110_1(uniques, 10);
+  f_010_001_101_111_0(uniques, 10);
+  f_010_001_101_111_1(uniques, 10);
+  f_010_001_110_010_0(uniques, 10);
+  f_010_001_110_010_1(uniques, 10);
+  f_010_001_110_011_0(uniques, 10);
+  f_010_001_110_011_1(uniques, 10);
+  f_010_001_110_110_0(uniques, 10);
+  f_010_001_110_110_1(uniques, 10);
+  f_010_001_110_111_0(uniques, 10);
+  f_010_001_110_111_1(uniques, 10);
+  f_010_001_111_010_0(uniques, 10);
+  f_010_001_111_010_1(uniques, 10);
+  f_010_001_111_011_0(uniques, 10);
+  f_010_001_111_011_1(uniques, 10);
+  f_010_001_111_110_0(uniques, 10);
+  f_010_001_111_110_1(uniques, 10);
+  f_010_001_111_111_0(uniques, 10);
+  f_010_001_111_111_1(uniques, 10);
+  f_010_010_000_010_0(uniques, 10);
+  f_010_010_000_010_1(uniques, 10);
+  f_010_010_000_011_0(uniques, 10);
+  f_010_010_000_011_1(uniques, 10);
+  f_010_010_000_110_0(uniques, 10);
+  f_010_010_000_110_1(uniques, 10);
+  f_010_010_000_111_0(uniques, 10);
+  f_010_010_000_111_1(uniques, 10);
+  f_010_010_001_010_0(uniques, 10);
+  f_010_010_001_010_1(uniques, 10);
+  f_010_010_001_011_0(uniques, 10);
+  f_010_010_001_011_1(uniques, 10);
+  f_010_010_001_110_0(uniques, 10);
+  f_010_010_001_110_1(uniques, 10);
+  f_010_010_001_111_0(uniques, 10);
+  f_010_010_001_111_1(uniques, 10);
+  f_010_010_010_010_0(uniques, 10);
+  f_010_010_010_010_1(uniques, 10);
+  f_010_010_010_011_0(uniques, 10);
+  f_010_010_010_011_1(uniques, 10);
+  f_010_010_010_110_0(uniques, 10);
+  f_010_010_010_110_1(uniques, 10);
+  f_010_010_010_111_0(uniques, 10);
+  f_010_010_010_111_1(uniques, 10);
+  f_010_010_011_010_0(uniques, 10);
+  f_010_010_011_010_1(uniques, 10);
+  f_010_010_011_011_0(uniques, 10);
+  f_010_010_011_011_1(uniques, 10);
+  f_010_010_011_110_0(uniques, 10);
+  f_010_010_011_110_1(uniques, 10);
+  f_010_010_011_111_0(uniques, 10);
+  f_010_010_011_111_1(uniques, 10);
+  f_010_010_100_010_0(uniques, 10);
+  f_010_010_100_010_1(uniques, 10);
+  f_010_010_100_011_0(uniques, 10);
+  f_010_010_100_011_1(uniques, 10);
+  f_010_010_100_110_0(uniques, 10);
+  f_010_010_100_110_1(uniques, 10);
+  f_010_010_100_111_0(uniques, 10);
+  f_010_010_100_111_1(uniques, 10);
+  f_010_010_101_010_0(uniques, 10);
+  f_010_010_101_010_1(uniques, 10);
+  f_010_010_101_011_0(uniques, 10);
+  f_010_010_101_011_1(uniques, 10);
+  f_010_010_101_110_0(uniques, 10);
+  f_010_010_101_110_1(uniques, 10);
+  f_010_010_101_111_0(uniques, 10);
+  f_010_010_101_111_1(uniques, 10);
+  f_010_010_110_010_0(uniques, 10);
+  f_010_010_110_010_1(uniques, 10);
+  f_010_010_110_011_0(uniques, 10);
+  f_010_010_110_011_1(uniques, 10);
+  f_010_010_110_110_0(uniques, 10);
+  f_010_010_110_110_1(uniques, 10);
+  f_010_010_110_111_0(uniques, 10);
+  f_010_010_110_111_1(uniques, 10);
+  f_010_010_111_010_0(uniques, 10);
+  f_010_010_111_010_1(uniques, 10);
+  f_010_010_111_011_0(uniques, 10);
+  f_010_010_111_011_1(uniques, 10);
+  f_010_010_111_110_0(uniques, 10);
+  f_010_010_111_110_1(uniques, 10);
+  f_010_010_111_111_0(uniques, 10);
+  f_010_010_111_111_1(uniques, 10);
+  f_010_011_000_010_0(uniques, 10);
+  f_010_011_000_010_1(uniques, 10);
+  f_010_011_000_011_0(uniques, 10);
+  f_010_011_000_011_1(uniques, 10);
+  f_010_011_000_110_0(uniques, 10);
+  f_010_011_000_110_1(uniques, 10);
+  f_010_011_000_111_0(uniques, 10);
+  f_010_011_000_111_1(uniques, 10);
+  f_010_011_001_010_0(uniques, 10);
+  f_010_011_001_010_1(uniques, 10);
+  f_010_011_001_011_0(uniques, 10);
+  f_010_011_001_011_1(uniques, 10);
+  f_010_011_001_110_0(uniques, 10);
+  f_010_011_001_110_1(uniques, 10);
+  f_010_011_001_111_0(uniques, 10);
+  f_010_011_001_111_1(uniques, 10);
+  f_010_011_010_010_0(uniques, 10);
+  f_010_011_010_010_1(uniques, 10);
+  f_010_011_010_011_0(uniques, 10);
+  f_010_011_010_011_1(uniques, 10);
+  f_010_011_010_110_0(uniques, 10);
+  f_010_011_010_110_1(uniques, 10);
+  f_010_011_010_111_0(uniques, 10);
+  f_010_011_010_111_1(uniques, 10);
+  f_010_011_011_010_0(uniques, 10);
+  f_010_011_011_010_1(uniques, 10);
+  f_010_011_011_011_0(uniques, 10);
+  f_010_011_011_011_1(uniques, 10);
+  f_010_011_011_110_0(uniques, 10);
+  f_010_011_011_110_1(uniques, 10);
+  f_010_011_011_111_0(uniques, 10);
+  f_010_011_011_111_1(uniques, 10);
+  f_010_011_100_010_0(uniques, 10);
+  f_010_011_100_010_1(uniques, 10);
+  f_010_011_100_011_0(uniques, 10);
+  f_010_011_100_011_1(uniques, 10);
+  f_010_011_100_110_0(uniques, 10);
+  f_010_011_100_110_1(uniques, 10);
+  f_010_011_100_111_0(uniques, 10);
+  f_010_011_100_111_1(uniques, 10);
+  f_010_011_101_010_0(uniques, 10);
+  f_010_011_101_010_1(uniques, 10);
+  f_010_011_101_011_0(uniques, 10);
+  f_010_011_101_011_1(uniques, 10);
+  f_010_011_101_110_0(uniques, 10);
+  f_010_011_101_110_1(uniques, 10);
+  f_010_011_101_111_0(uniques, 10);
+  f_010_011_101_111_1(uniques, 10);
+  f_010_011_110_010_0(uniques, 10);
+  f_010_011_110_010_1(uniques, 10);
+  f_010_011_110_011_0(uniques, 10);
+  f_010_011_110_011_1(uniques, 10);
+  f_010_011_110_110_0(uniques, 10);
+  f_010_011_110_110_1(uniques, 10);
+  f_010_011_110_111_0(uniques, 10);
+  f_010_011_110_111_1(uniques, 10);
+  f_010_011_111_010_0(uniques, 10);
+  f_010_011_111_010_1(uniques, 10);
+  f_010_011_111_011_0(uniques, 10);
+  f_010_011_111_011_1(uniques, 10);
+  f_010_011_111_110_0(uniques, 10);
+  f_010_011_111_110_1(uniques, 10);
+  f_010_011_111_111_0(uniques, 10);
+  f_010_011_111_111_1(uniques, 10);
+  f_010_100_000_010_0(uniques, 10);
+  f_010_100_000_010_1(uniques, 10);
+  f_010_100_000_011_0(uniques, 10);
+  f_010_100_000_011_1(uniques, 10);
+  f_010_100_000_110_0(uniques, 10);
+  f_010_100_000_110_1(uniques, 10);
+  f_010_100_000_111_0(uniques, 10);
+  f_010_100_000_111_1(uniques, 10);
+  f_010_100_001_010_0(uniques, 10);
+  f_010_100_001_010_1(uniques, 10);
+  f_010_100_001_011_0(uniques, 10);
+  f_010_100_001_011_1(uniques, 10);
+  f_010_100_001_110_0(uniques, 10);
+  f_010_100_001_110_1(uniques, 10);
+  f_010_100_001_111_0(uniques, 10);
+  f_010_100_001_111_1(uniques, 10);
+  f_010_100_010_010_0(uniques, 10);
+  f_010_100_010_010_1(uniques, 10);
+  f_010_100_010_011_0(uniques, 10);
+  f_010_100_010_011_1(uniques, 10);
+  f_010_100_010_110_0(uniques, 10);
+  f_010_100_010_110_1(uniques, 10);
+  f_010_100_010_111_0(uniques, 10);
+  f_010_100_010_111_1(uniques, 10);
+  f_010_100_011_010_0(uniques, 10);
+  f_010_100_011_010_1(uniques, 10);
+  f_010_100_011_011_0(uniques, 10);
+  f_010_100_011_011_1(uniques, 10);
+  f_010_100_011_110_0(uniques, 10);
+  f_010_100_011_110_1(uniques, 10);
+  f_010_100_011_111_0(uniques, 10);
+  f_010_100_011_111_1(uniques, 10);
+  f_010_100_100_010_0(uniques, 10);
+  f_010_100_100_010_1(uniques, 10);
+  f_010_100_100_011_0(uniques, 10);
+  f_010_100_100_011_1(uniques, 10);
+  f_010_100_100_110_0(uniques, 10);
+  f_010_100_100_110_1(uniques, 10);
+  f_010_100_100_111_0(uniques, 10);
+  f_010_100_100_111_1(uniques, 10);
+  f_010_100_101_010_0(uniques, 10);
+  f_010_100_101_010_1(uniques, 10);
+  f_010_100_101_011_0(uniques, 10);
+  f_010_100_101_011_1(uniques, 10);
+  f_010_100_101_110_0(uniques, 10);
+  f_010_100_101_110_1(uniques, 10);
+  f_010_100_101_111_0(uniques, 10);
+  f_010_100_101_111_1(uniques, 10);
+  f_010_100_110_010_0(uniques, 10);
+  f_010_100_110_010_1(uniques, 10);
+  f_010_100_110_011_0(uniques, 10);
+  f_010_100_110_011_1(uniques, 10);
+  f_010_100_110_110_0(uniques, 10);
+  f_010_100_110_110_1(uniques, 10);
+  f_010_100_110_111_0(uniques, 10);
+  f_010_100_110_111_1(uniques, 10);
+  f_010_100_111_010_0(uniques, 10);
+  f_010_100_111_010_1(uniques, 10);
+  f_010_100_111_011_0(uniques, 10);
+  f_010_100_111_011_1(uniques, 10);
+  f_010_100_111_110_0(uniques, 10);
+  f_010_100_111_110_1(uniques, 10);
+  f_010_100_111_111_0(uniques, 10);
+  f_010_100_111_111_1(uniques, 10);
+  f_010_101_000_010_0(uniques, 10);
+  f_010_101_000_010_1(uniques, 10);
+  f_010_101_000_011_0(uniques, 10);
+  f_010_101_000_011_1(uniques, 10);
+  f_010_101_000_110_0(uniques, 10);
+  f_010_101_000_110_1(uniques, 10);
+  f_010_101_000_111_0(uniques, 10);
+  f_010_101_000_111_1(uniques, 10);
+  f_010_101_001_010_0(uniques, 10);
+  f_010_101_001_010_1(uniques, 10);
+  f_010_101_001_011_0(uniques, 10);
+  f_010_101_001_011_1(uniques, 10);
+  f_010_101_001_110_0(uniques, 10);
+  f_010_101_001_110_1(uniques, 10);
+  f_010_101_001_111_0(uniques, 10);
+  f_010_101_001_111_1(uniques, 10);
+  f_010_101_010_010_0(uniques, 10);
+  f_010_101_010_010_1(uniques, 10);
+  f_010_101_010_011_0(uniques, 10);
+  f_010_101_010_011_1(uniques, 10);
+  f_010_101_010_110_0(uniques, 10);
+  f_010_101_010_110_1(uniques, 10);
+  f_010_101_010_111_0(uniques, 10);
+  f_010_101_010_111_1(uniques, 10);
+  f_010_101_011_010_0(uniques, 10);
+  f_010_101_011_010_1(uniques, 10);
+  f_010_101_011_011_0(uniques, 10);
+  f_010_101_011_011_1(uniques, 10);
+  f_010_101_011_110_0(uniques, 10);
+  f_010_101_011_110_1(uniques, 10);
+  f_010_101_011_111_0(uniques, 10);
+  f_010_101_011_111_1(uniques, 10);
+  f_010_101_100_010_0(uniques, 10);
+  f_010_101_100_010_1(uniques, 10);
+  f_010_101_100_011_0(uniques, 10);
+  f_010_101_100_011_1(uniques, 10);
+  f_010_101_100_110_0(uniques, 10);
+  f_010_101_100_110_1(uniques, 10);
+  f_010_101_100_111_0(uniques, 10);
+  f_010_101_100_111_1(uniques, 10);
+  f_010_101_101_010_0(uniques, 10);
+  f_010_101_101_010_1(uniques, 10);
+  f_010_101_101_011_0(uniques, 10);
+  f_010_101_101_011_1(uniques, 10);
+  f_010_101_101_110_0(uniques, 10);
+  f_010_101_101_110_1(uniques, 10);
+  f_010_101_101_111_0(uniques, 10);
+  f_010_101_101_111_1(uniques, 10);
+  f_010_101_110_010_0(uniques, 10);
+  f_010_101_110_010_1(uniques, 10);
+  f_010_101_110_011_0(uniques, 10);
+  f_010_101_110_011_1(uniques, 10);
+  f_010_101_110_110_0(uniques, 10);
+  f_010_101_110_110_1(uniques, 10);
+  f_010_101_110_111_0(uniques, 10);
+  f_010_101_110_111_1(uniques, 10);
+  f_010_101_111_010_0(uniques, 10);
+  f_010_101_111_010_1(uniques, 10);
+  f_010_101_111_011_0(uniques, 10);
+  f_010_101_111_011_1(uniques, 10);
+  f_010_101_111_110_0(uniques, 10);
+  f_010_101_111_110_1(uniques, 10);
+  f_010_101_111_111_0(uniques, 10);
+  f_010_101_111_111_1(uniques, 10);
+  f_010_110_000_010_0(uniques, 10);
+  f_010_110_000_010_1(uniques, 10);
+  f_010_110_000_011_0(uniques, 10);
+  f_010_110_000_011_1(uniques, 10);
+  f_010_110_000_110_0(uniques, 10);
+  f_010_110_000_110_1(uniques, 10);
+  f_010_110_000_111_0(uniques, 10);
+  f_010_110_000_111_1(uniques, 10);
+  f_010_110_001_010_0(uniques, 10);
+  f_010_110_001_010_1(uniques, 10);
+  f_010_110_001_011_0(uniques, 10);
+  f_010_110_001_011_1(uniques, 10);
+  f_010_110_001_110_0(uniques, 10);
+  f_010_110_001_110_1(uniques, 10);
+  f_010_110_001_111_0(uniques, 10);
+  f_010_110_001_111_1(uniques, 10);
+  f_010_110_010_010_0(uniques, 10);
+  f_010_110_010_010_1(uniques, 10);
+  f_010_110_010_011_0(uniques, 10);
+  f_010_110_010_011_1(uniques, 10);
+  f_010_110_010_110_0(uniques, 10);
+  f_010_110_010_110_1(uniques, 10);
+  f_010_110_010_111_0(uniques, 10);
+  f_010_110_010_111_1(uniques, 10);
+  f_010_110_011_010_0(uniques, 10);
+  f_010_110_011_010_1(uniques, 10);
+  f_010_110_011_011_0(uniques, 10);
+  f_010_110_011_011_1(uniques, 10);
+  f_010_110_011_110_0(uniques, 10);
+  f_010_110_011_110_1(uniques, 10);
+  f_010_110_011_111_0(uniques, 10);
+  f_010_110_011_111_1(uniques, 10);
+  f_010_110_100_010_0(uniques, 10);
+  f_010_110_100_010_1(uniques, 10);
+  f_010_110_100_011_0(uniques, 10);
+  f_010_110_100_011_1(uniques, 10);
+  f_010_110_100_110_0(uniques, 10);
+  f_010_110_100_110_1(uniques, 10);
+  f_010_110_100_111_0(uniques, 10);
+  f_010_110_100_111_1(uniques, 10);
+  f_010_110_101_010_0(uniques, 10);
+  f_010_110_101_010_1(uniques, 10);
+  f_010_110_101_011_0(uniques, 10);
+  f_010_110_101_011_1(uniques, 10);
+  f_010_110_101_110_0(uniques, 10);
+  f_010_110_101_110_1(uniques, 10);
+  f_010_110_101_111_0(uniques, 10);
+  f_010_110_101_111_1(uniques, 10);
+  f_010_110_110_010_0(uniques, 10);
+  f_010_110_110_010_1(uniques, 10);
+  f_010_110_110_011_0(uniques, 10);
+  f_010_110_110_011_1(uniques, 10);
+  f_010_110_110_110_0(uniques, 10);
+  f_010_110_110_110_1(uniques, 10);
+  f_010_110_110_111_0(uniques, 10);
+  f_010_110_110_111_1(uniques, 10);
+  f_010_110_111_010_0(uniques, 10);
+  f_010_110_111_010_1(uniques, 10);
+  f_010_110_111_011_0(uniques, 10);
+  f_010_110_111_011_1(uniques, 10);
+  f_010_110_111_110_0(uniques, 10);
+  f_010_110_111_110_1(uniques, 10);
+  f_010_110_111_111_0(uniques, 10);
+  f_010_110_111_111_1(uniques, 10);
+  f_010_111_000_010_0(uniques, 10);
+  f_010_111_000_010_1(uniques, 10);
+  f_010_111_000_011_0(uniques, 10);
+  f_010_111_000_011_1(uniques, 10);
+  f_010_111_000_110_0(uniques, 10);
+  f_010_111_000_110_1(uniques, 10);
+  f_010_111_000_111_0(uniques, 10);
+  f_010_111_000_111_1(uniques, 10);
+  f_010_111_001_010_0(uniques, 10);
+  f_010_111_001_010_1(uniques, 10);
+  f_010_111_001_011_0(uniques, 10);
+  f_010_111_001_011_1(uniques, 10);
+  f_010_111_001_110_0(uniques, 10);
+  f_010_111_001_110_1(uniques, 10);
+  f_010_111_001_111_0(uniques, 10);
+  f_010_111_001_111_1(uniques, 10);
+  f_010_111_010_010_0(uniques, 10);
+  f_010_111_010_010_1(uniques, 10);
+  f_010_111_010_011_0(uniques, 10);
+  f_010_111_010_011_1(uniques, 10);
+  f_010_111_010_110_0(uniques, 10);
+  f_010_111_010_110_1(uniques, 10);
+  f_010_111_010_111_0(uniques, 10);
+  f_010_111_010_111_1(uniques, 10);
+  f_010_111_011_010_0(uniques, 10);
+  f_010_111_011_010_1(uniques, 10);
+  f_010_111_011_011_0(uniques, 10);
+  f_010_111_011_011_1(uniques, 10);
+  f_010_111_011_110_0(uniques, 10);
+  f_010_111_011_110_1(uniques, 10);
+  f_010_111_011_111_0(uniques, 10);
+  f_010_111_011_111_1(uniques, 10);
+  f_010_111_100_010_0(uniques, 10);
+  f_010_111_100_010_1(uniques, 10);
+  f_010_111_100_011_0(uniques, 10);
+  f_010_111_100_011_1(uniques, 10);
+  f_010_111_100_110_0(uniques, 10);
+  f_010_111_100_110_1(uniques, 10);
+  f_010_111_100_111_0(uniques, 10);
+  f_010_111_100_111_1(uniques, 10);
+  f_010_111_101_010_0(uniques, 10);
+  f_010_111_101_010_1(uniques, 10);
+  f_010_111_101_011_0(uniques, 10);
+  f_010_111_101_011_1(uniques, 10);
+  f_010_111_101_110_0(uniques, 10);
+  f_010_111_101_110_1(uniques, 10);
+  f_010_111_101_111_0(uniques, 10);
+  f_010_111_101_111_1(uniques, 10);
+  f_010_111_110_010_0(uniques, 10);
+  f_010_111_110_010_1(uniques, 10);
+  f_010_111_110_011_0(uniques, 10);
+  f_010_111_110_011_1(uniques, 10);
+  f_010_111_110_110_0(uniques, 10);
+  f_010_111_110_110_1(uniques, 10);
+  f_010_111_110_111_0(uniques, 10);
+  f_010_111_110_111_1(uniques, 10);
+  f_010_111_111_010_0(uniques, 10);
+  f_010_111_111_010_1(uniques, 10);
+  f_010_111_111_011_0(uniques, 10);
+  f_010_111_111_011_1(uniques, 10);
+  f_010_111_111_110_0(uniques, 10);
+  f_010_111_111_110_1(uniques, 10);
+  f_010_111_111_111_0(uniques, 10);
+  f_010_111_111_111_1(uniques, 10);
+  f_011_000_000_010_0(uniques, 10);
+  f_011_000_000_010_1(uniques, 10);
+  f_011_000_000_011_0(uniques, 10);
+  f_011_000_000_011_1(uniques, 10);
+  f_011_000_000_110_0(uniques, 10);
+  f_011_000_000_110_1(uniques, 10);
+  f_011_000_000_111_0(uniques, 10);
+  f_011_000_000_111_1(uniques, 10);
+  f_011_000_001_010_0(uniques, 10);
+  f_011_000_001_010_1(uniques, 10);
+  f_011_000_001_011_0(uniques, 10);
+  f_011_000_001_011_1(uniques, 10);
+  f_011_000_001_110_0(uniques, 10);
+  f_011_000_001_110_1(uniques, 10);
+  f_011_000_001_111_0(uniques, 10);
+  f_011_000_001_111_1(uniques, 10);
+  f_011_000_010_010_0(uniques, 10);
+  f_011_000_010_010_1(uniques, 10);
+  f_011_000_010_011_0(uniques, 10);
+  f_011_000_010_011_1(uniques, 10);
+  f_011_000_010_110_0(uniques, 10);
+  f_011_000_010_110_1(uniques, 10);
+  f_011_000_010_111_0(uniques, 10);
+  f_011_000_010_111_1(uniques, 10);
+  f_011_000_011_010_0(uniques, 10);
+  f_011_000_011_010_1(uniques, 10);
+  f_011_000_011_011_0(uniques, 10);
+  f_011_000_011_011_1(uniques, 10);
+  f_011_000_011_110_0(uniques, 10);
+  f_011_000_011_110_1(uniques, 10);
+  f_011_000_011_111_0(uniques, 10);
+  f_011_000_011_111_1(uniques, 10);
+  f_011_000_100_010_0(uniques, 10);
+  f_011_000_100_010_1(uniques, 10);
+  f_011_000_100_011_0(uniques, 10);
+  f_011_000_100_011_1(uniques, 10);
+  f_011_000_100_110_0(uniques, 10);
+  f_011_000_100_110_1(uniques, 10);
+  f_011_000_100_111_0(uniques, 10);
+  f_011_000_100_111_1(uniques, 10);
+  f_011_000_101_010_0(uniques, 10);
+  f_011_000_101_010_1(uniques, 10);
+  f_011_000_101_011_0(uniques, 10);
+  f_011_000_101_011_1(uniques, 10);
+  f_011_000_101_110_0(uniques, 10);
+  f_011_000_101_110_1(uniques, 10);
+  f_011_000_101_111_0(uniques, 10);
+  f_011_000_101_111_1(uniques, 10);
+  f_011_000_110_010_0(uniques, 10);
+  f_011_000_110_010_1(uniques, 10);
+  f_011_000_110_011_0(uniques, 10);
+  f_011_000_110_011_1(uniques, 10);
+  f_011_000_110_110_0(uniques, 10);
+  f_011_000_110_110_1(uniques, 10);
+  f_011_000_110_111_0(uniques, 10);
+  f_011_000_110_111_1(uniques, 10);
+  f_011_000_111_010_0(uniques, 10);
+  f_011_000_111_010_1(uniques, 10);
+  f_011_000_111_011_0(uniques, 10);
+  f_011_000_111_011_1(uniques, 10);
+  f_011_000_111_110_0(uniques, 10);
+  f_011_000_111_110_1(uniques, 10);
+  f_011_000_111_111_0(uniques, 10);
+  f_011_000_111_111_1(uniques, 10);
+  f_011_001_000_010_0(uniques, 10);
+  f_011_001_000_010_1(uniques, 10);
+  f_011_001_000_011_0(uniques, 10);
+  f_011_001_000_011_1(uniques, 10);
+  f_011_001_000_110_0(uniques, 10);
+  f_011_001_000_110_1(uniques, 10);
+  f_011_001_000_111_0(uniques, 10);
+  f_011_001_000_111_1(uniques, 10);
+  f_011_001_001_010_0(uniques, 10);
+  f_011_001_001_010_1(uniques, 10);
+  f_011_001_001_011_0(uniques, 10);
+  f_011_001_001_011_1(uniques, 10);
+  f_011_001_001_110_0(uniques, 10);
+  f_011_001_001_110_1(uniques, 10);
+  f_011_001_001_111_0(uniques, 10);
+  f_011_001_001_111_1(uniques, 10);
+  f_011_001_010_010_0(uniques, 10);
+  f_011_001_010_010_1(uniques, 10);
+  f_011_001_010_011_0(uniques, 10);
+  f_011_001_010_011_1(uniques, 10);
+  f_011_001_010_110_0(uniques, 10);
+  f_011_001_010_110_1(uniques, 10);
+  f_011_001_010_111_0(uniques, 10);
+  f_011_001_010_111_1(uniques, 10);
+  f_011_001_011_010_0(uniques, 10);
+  f_011_001_011_010_1(uniques, 10);
+  f_011_001_011_011_0(uniques, 10);
+  f_011_001_011_011_1(uniques, 10);
+  f_011_001_011_110_0(uniques, 10);
+  f_011_001_011_110_1(uniques, 10);
+  f_011_001_011_111_0(uniques, 10);
+  f_011_001_011_111_1(uniques, 10);
+  f_011_001_100_010_0(uniques, 10);
+  f_011_001_100_010_1(uniques, 10);
+  f_011_001_100_011_0(uniques, 10);
+  f_011_001_100_011_1(uniques, 10);
+  f_011_001_100_110_0(uniques, 10);
+  f_011_001_100_110_1(uniques, 10);
+  f_011_001_100_111_0(uniques, 10);
+  f_011_001_100_111_1(uniques, 10);
+  f_011_001_101_010_0(uniques, 10);
+  f_011_001_101_010_1(uniques, 10);
+  f_011_001_101_011_0(uniques, 10);
+  f_011_001_101_011_1(uniques, 10);
+  f_011_001_101_110_0(uniques, 10);
+  f_011_001_101_110_1(uniques, 10);
+  f_011_001_101_111_0(uniques, 10);
+  f_011_001_101_111_1(uniques, 10);
+  f_011_001_110_010_0(uniques, 10);
+  f_011_001_110_010_1(uniques, 10);
+  f_011_001_110_011_0(uniques, 10);
+  f_011_001_110_011_1(uniques, 10);
+  f_011_001_110_110_0(uniques, 10);
+  f_011_001_110_110_1(uniques, 10);
+  f_011_001_110_111_0(uniques, 10);
+  f_011_001_110_111_1(uniques, 10);
+  f_011_001_111_010_0(uniques, 10);
+  f_011_001_111_010_1(uniques, 10);
+  f_011_001_111_011_0(uniques, 10);
+  f_011_001_111_011_1(uniques, 10);
+  f_011_001_111_110_0(uniques, 10);
+  f_011_001_111_110_1(uniques, 10);
+  f_011_001_111_111_0(uniques, 10);
+  f_011_001_111_111_1(uniques, 10);
+  f_011_010_000_010_0(uniques, 10);
+  f_011_010_000_010_1(uniques, 10);
+  f_011_010_000_011_0(uniques, 10);
+  f_011_010_000_011_1(uniques, 10);
+  f_011_010_000_110_0(uniques, 10);
+  f_011_010_000_110_1(uniques, 10);
+  f_011_010_000_111_0(uniques, 10);
+  f_011_010_000_111_1(uniques, 10);
+  f_011_010_001_010_0(uniques, 10);
+  f_011_010_001_010_1(uniques, 10);
+  f_011_010_001_011_0(uniques, 10);
+  f_011_010_001_011_1(uniques, 10);
+  f_011_010_001_110_0(uniques, 10);
+  f_011_010_001_110_1(uniques, 10);
+  f_011_010_001_111_0(uniques, 10);
+  f_011_010_001_111_1(uniques, 10);
+  f_011_010_010_010_0(uniques, 10);
+  f_011_010_010_010_1(uniques, 10);
+  f_011_010_010_011_0(uniques, 10);
+  f_011_010_010_011_1(uniques, 10);
+  f_011_010_010_110_0(uniques, 10);
+  f_011_010_010_110_1(uniques, 10);
+  f_011_010_010_111_0(uniques, 10);
+  f_011_010_010_111_1(uniques, 10);
+  f_011_010_011_010_0(uniques, 10);
+  f_011_010_011_010_1(uniques, 10);
+  f_011_010_011_011_0(uniques, 10);
+  f_011_010_011_011_1(uniques, 10);
+  f_011_010_011_110_0(uniques, 10);
+  f_011_010_011_110_1(uniques, 10);
+  f_011_010_011_111_0(uniques, 10);
+  f_011_010_011_111_1(uniques, 10);
+  f_011_010_100_010_0(uniques, 10);
+  f_011_010_100_010_1(uniques, 10);
+  f_011_010_100_011_0(uniques, 10);
+  f_011_010_100_011_1(uniques, 10);
+  f_011_010_100_110_0(uniques, 10);
+  f_011_010_100_110_1(uniques, 10);
+  f_011_010_100_111_0(uniques, 10);
+  f_011_010_100_111_1(uniques, 10);
+  f_011_010_101_010_0(uniques, 10);
+  f_011_010_101_010_1(uniques, 10);
+  f_011_010_101_011_0(uniques, 10);
+  f_011_010_101_011_1(uniques, 10);
+  f_011_010_101_110_0(uniques, 10);
+  f_011_010_101_110_1(uniques, 10);
+  f_011_010_101_111_0(uniques, 10);
+  f_011_010_101_111_1(uniques, 10);
+  f_011_010_110_010_0(uniques, 10);
+  f_011_010_110_010_1(uniques, 10);
+  f_011_010_110_011_0(uniques, 10);
+  f_011_010_110_011_1(uniques, 10);
+  f_011_010_110_110_0(uniques, 10);
+  f_011_010_110_110_1(uniques, 10);
+  f_011_010_110_111_0(uniques, 10);
+  f_011_010_110_111_1(uniques, 10);
+  f_011_010_111_010_0(uniques, 10);
+  f_011_010_111_010_1(uniques, 10);
+  f_011_010_111_011_0(uniques, 10);
+  f_011_010_111_011_1(uniques, 10);
+  f_011_010_111_110_0(uniques, 10);
+  f_011_010_111_110_1(uniques, 10);
+  f_011_010_111_111_0(uniques, 10);
+  f_011_010_111_111_1(uniques, 10);
+  f_011_011_000_010_0(uniques, 10);
+  f_011_011_000_010_1(uniques, 10);
+  f_011_011_000_011_0(uniques, 10);
+  f_011_011_000_011_1(uniques, 10);
+  f_011_011_000_110_0(uniques, 10);
+  f_011_011_000_110_1(uniques, 10);
+  f_011_011_000_111_0(uniques, 10);
+  f_011_011_000_111_1(uniques, 10);
+  f_011_011_001_010_0(uniques, 10);
+  f_011_011_001_010_1(uniques, 10);
+  f_011_011_001_011_0(uniques, 10);
+  f_011_011_001_011_1(uniques, 10);
+  f_011_011_001_110_0(uniques, 10);
+  f_011_011_001_110_1(uniques, 10);
+  f_011_011_001_111_0(uniques, 10);
+  f_011_011_001_111_1(uniques, 10);
+  f_011_011_010_010_0(uniques, 10);
+  f_011_011_010_010_1(uniques, 10);
+  f_011_011_010_011_0(uniques, 10);
+  f_011_011_010_011_1(uniques, 10);
+  f_011_011_010_110_0(uniques, 10);
+  f_011_011_010_110_1(uniques, 10);
+  f_011_011_010_111_0(uniques, 10);
+  f_011_011_010_111_1(uniques, 10);
+  f_011_011_011_010_0(uniques, 10);
+  f_011_011_011_010_1(uniques, 10);
+  f_011_011_011_011_0(uniques, 10);
+  f_011_011_011_011_1(uniques, 10);
+  f_011_011_011_110_0(uniques, 10);
+  f_011_011_011_110_1(uniques, 10);
+  f_011_011_011_111_0(uniques, 10);
+  f_011_011_011_111_1(uniques, 10);
+  f_011_011_100_010_0(uniques, 10);
+  f_011_011_100_010_1(uniques, 10);
+  f_011_011_100_011_0(uniques, 10);
+  f_011_011_100_011_1(uniques, 10);
+  f_011_011_100_110_0(uniques, 10);
+  f_011_011_100_110_1(uniques, 10);
+  f_011_011_100_111_0(uniques, 10);
+  f_011_011_100_111_1(uniques, 10);
+  f_011_011_101_010_0(uniques, 10);
+  f_011_011_101_010_1(uniques, 10);
+  f_011_011_101_011_0(uniques, 10);
+  f_011_011_101_011_1(uniques, 10);
+  f_011_011_101_110_0(uniques, 10);
+  f_011_011_101_110_1(uniques, 10);
+  f_011_011_101_111_0(uniques, 10);
+  f_011_011_101_111_1(uniques, 10);
+  f_011_011_110_010_0(uniques, 10);
+  f_011_011_110_010_1(uniques, 10);
+  f_011_011_110_011_0(uniques, 10);
+  f_011_011_110_011_1(uniques, 10);
+  f_011_011_110_110_0(uniques, 10);
+  f_011_011_110_110_1(uniques, 10);
+  f_011_011_110_111_0(uniques, 10);
+  f_011_011_110_111_1(uniques, 10);
+  f_011_011_111_010_0(uniques, 10);
+  f_011_011_111_010_1(uniques, 10);
+  f_011_011_111_011_0(uniques, 10);
+  f_011_011_111_011_1(uniques, 10);
+  f_011_011_111_110_0(uniques, 10);
+  f_011_011_111_110_1(uniques, 10);
+  f_011_011_111_111_0(uniques, 10);
+  f_011_011_111_111_1(uniques, 10);
+  f_011_100_000_010_0(uniques, 10);
+  f_011_100_000_010_1(uniques, 10);
+  f_011_100_000_011_0(uniques, 10);
+  f_011_100_000_011_1(uniques, 10);
+  f_011_100_000_110_0(uniques, 10);
+  f_011_100_000_110_1(uniques, 10);
+  f_011_100_000_111_0(uniques, 10);
+  f_011_100_000_111_1(uniques, 10);
+  f_011_100_001_010_0(uniques, 10);
+  f_011_100_001_010_1(uniques, 10);
+  f_011_100_001_011_0(uniques, 10);
+  f_011_100_001_011_1(uniques, 10);
+  f_011_100_001_110_0(uniques, 10);
+  f_011_100_001_110_1(uniques, 10);
+  f_011_100_001_111_0(uniques, 10);
+  f_011_100_001_111_1(uniques, 10);
+  f_011_100_010_010_0(uniques, 10);
+  f_011_100_010_010_1(uniques, 10);
+  f_011_100_010_011_0(uniques, 10);
+  f_011_100_010_011_1(uniques, 10);
+  f_011_100_010_110_0(uniques, 10);
+  f_011_100_010_110_1(uniques, 10);
+  f_011_100_010_111_0(uniques, 10);
+  f_011_100_010_111_1(uniques, 10);
+  f_011_100_011_010_0(uniques, 10);
+  f_011_100_011_010_1(uniques, 10);
+  f_011_100_011_011_0(uniques, 10);
+  f_011_100_011_011_1(uniques, 10);
+  f_011_100_011_110_0(uniques, 10);
+  f_011_100_011_110_1(uniques, 10);
+  f_011_100_011_111_0(uniques, 10);
+  f_011_100_011_111_1(uniques, 10);
+  f_011_100_100_010_0(uniques, 10);
+  f_011_100_100_010_1(uniques, 10);
+  f_011_100_100_011_0(uniques, 10);
+  f_011_100_100_011_1(uniques, 10);
+  f_011_100_100_110_0(uniques, 10);
+  f_011_100_100_110_1(uniques, 10);
+  f_011_100_100_111_0(uniques, 10);
+  f_011_100_100_111_1(uniques, 10);
+  f_011_100_101_010_0(uniques, 10);
+  f_011_100_101_010_1(uniques, 10);
+  f_011_100_101_011_0(uniques, 10);
+  f_011_100_101_011_1(uniques, 10);
+  f_011_100_101_110_0(uniques, 10);
+  f_011_100_101_110_1(uniques, 10);
+  f_011_100_101_111_0(uniques, 10);
+  f_011_100_101_111_1(uniques, 10);
+  f_011_100_110_010_0(uniques, 10);
+  f_011_100_110_010_1(uniques, 10);
+  f_011_100_110_011_0(uniques, 10);
+  f_011_100_110_011_1(uniques, 10);
+  f_011_100_110_110_0(uniques, 10);
+  f_011_100_110_110_1(uniques, 10);
+  f_011_100_110_111_0(uniques, 10);
+  f_011_100_110_111_1(uniques, 10);
+  f_011_100_111_010_0(uniques, 10);
+  f_011_100_111_010_1(uniques, 10);
+  f_011_100_111_011_0(uniques, 10);
+  f_011_100_111_011_1(uniques, 10);
+  f_011_100_111_110_0(uniques, 10);
+  f_011_100_111_110_1(uniques, 10);
+  f_011_100_111_111_0(uniques, 10);
+  f_011_100_111_111_1(uniques, 10);
+  f_011_101_000_010_0(uniques, 10);
+  f_011_101_000_010_1(uniques, 10);
+  f_011_101_000_011_0(uniques, 10);
+  f_011_101_000_011_1(uniques, 10);
+  f_011_101_000_110_0(uniques, 10);
+  f_011_101_000_110_1(uniques, 10);
+  f_011_101_000_111_0(uniques, 10);
+  f_011_101_000_111_1(uniques, 10);
+  f_011_101_001_010_0(uniques, 10);
+  f_011_101_001_010_1(uniques, 10);
+  f_011_101_001_011_0(uniques, 10);
+  f_011_101_001_011_1(uniques, 10);
+  f_011_101_001_110_0(uniques, 10);
+  f_011_101_001_110_1(uniques, 10);
+  f_011_101_001_111_0(uniques, 10);
+  f_011_101_001_111_1(uniques, 10);
+  f_011_101_010_010_0(uniques, 10);
+  f_011_101_010_010_1(uniques, 10);
+  f_011_101_010_011_0(uniques, 10);
+  f_011_101_010_011_1(uniques, 10);
+  f_011_101_010_110_0(uniques, 10);
+  f_011_101_010_110_1(uniques, 10);
+  f_011_101_010_111_0(uniques, 10);
+  f_011_101_010_111_1(uniques, 10);
+  f_011_101_011_010_0(uniques, 10);
+  f_011_101_011_010_1(uniques, 10);
+  f_011_101_011_011_0(uniques, 10);
+  f_011_101_011_011_1(uniques, 10);
+  f_011_101_011_110_0(uniques, 10);
+  f_011_101_011_110_1(uniques, 10);
+  f_011_101_011_111_0(uniques, 10);
+  f_011_101_011_111_1(uniques, 10);
+  f_011_101_100_010_0(uniques, 10);
+  f_011_101_100_010_1(uniques, 10);
+  f_011_101_100_011_0(uniques, 10);
+  f_011_101_100_011_1(uniques, 10);
+  f_011_101_100_110_0(uniques, 10);
+  f_011_101_100_110_1(uniques, 10);
+  f_011_101_100_111_0(uniques, 10);
+  f_011_101_100_111_1(uniques, 10);
+  f_011_101_101_010_0(uniques, 10);
+  f_011_101_101_010_1(uniques, 10);
+  f_011_101_101_011_0(uniques, 10);
+  f_011_101_101_011_1(uniques, 10);
+  f_011_101_101_110_0(uniques, 10);
+  f_011_101_101_110_1(uniques, 10);
+  f_011_101_101_111_0(uniques, 10);
+  f_011_101_101_111_1(uniques, 10);
+  f_011_101_110_010_0(uniques, 10);
+  f_011_101_110_010_1(uniques, 10);
+  f_011_101_110_011_0(uniques, 10);
+  f_011_101_110_011_1(uniques, 10);
+  f_011_101_110_110_0(uniques, 10);
+  f_011_101_110_110_1(uniques, 10);
+  f_011_101_110_111_0(uniques, 10);
+  f_011_101_110_111_1(uniques, 10);
+  f_011_101_111_010_0(uniques, 10);
+  f_011_101_111_010_1(uniques, 10);
+  f_011_101_111_011_0(uniques, 10);
+  f_011_101_111_011_1(uniques, 10);
+  f_011_101_111_110_0(uniques, 10);
+  f_011_101_111_110_1(uniques, 10);
+  f_011_101_111_111_0(uniques, 10);
+  f_011_101_111_111_1(uniques, 10);
+  f_011_110_000_010_0(uniques, 10);
+  f_011_110_000_010_1(uniques, 10);
+  f_011_110_000_011_0(uniques, 10);
+  f_011_110_000_011_1(uniques, 10);
+  f_011_110_000_110_0(uniques, 10);
+  f_011_110_000_110_1(uniques, 10);
+  f_011_110_000_111_0(uniques, 10);
+  f_011_110_000_111_1(uniques, 10);
+  f_011_110_001_010_0(uniques, 10);
+  f_011_110_001_010_1(uniques, 10);
+  f_011_110_001_011_0(uniques, 10);
+  f_011_110_001_011_1(uniques, 10);
+  f_011_110_001_110_0(uniques, 10);
+  f_011_110_001_110_1(uniques, 10);
+  f_011_110_001_111_0(uniques, 10);
+  f_011_110_001_111_1(uniques, 10);
+  f_011_110_010_010_0(uniques, 10);
+  f_011_110_010_010_1(uniques, 10);
+  f_011_110_010_011_0(uniques, 10);
+  f_011_110_010_011_1(uniques, 10);
+  f_011_110_010_110_0(uniques, 10);
+  f_011_110_010_110_1(uniques, 10);
+  f_011_110_010_111_0(uniques, 10);
+  f_011_110_010_111_1(uniques, 10);
+  f_011_110_011_010_0(uniques, 10);
+  f_011_110_011_010_1(uniques, 10);
+  f_011_110_011_011_0(uniques, 10);
+  f_011_110_011_011_1(uniques, 10);
+  f_011_110_011_110_0(uniques, 10);
+  f_011_110_011_110_1(uniques, 10);
+  f_011_110_011_111_0(uniques, 10);
+  f_011_110_011_111_1(uniques, 10);
+  f_011_110_100_010_0(uniques, 10);
+  f_011_110_100_010_1(uniques, 10);
+  f_011_110_100_011_0(uniques, 10);
+  f_011_110_100_011_1(uniques, 10);
+  f_011_110_100_110_0(uniques, 10);
+  f_011_110_100_110_1(uniques, 10);
+  f_011_110_100_111_0(uniques, 10);
+  f_011_110_100_111_1(uniques, 10);
+  f_011_110_101_010_0(uniques, 10);
+  f_011_110_101_010_1(uniques, 10);
+  f_011_110_101_011_0(uniques, 10);
+  f_011_110_101_011_1(uniques, 10);
+  f_011_110_101_110_0(uniques, 10);
+  f_011_110_101_110_1(uniques, 10);
+  f_011_110_101_111_0(uniques, 10);
+  f_011_110_101_111_1(uniques, 10);
+  f_011_110_110_010_0(uniques, 10);
+  f_011_110_110_010_1(uniques, 10);
+  f_011_110_110_011_0(uniques, 10);
+  f_011_110_110_011_1(uniques, 10);
+  f_011_110_110_110_0(uniques, 10);
+  f_011_110_110_110_1(uniques, 10);
+  f_011_110_110_111_0(uniques, 10);
+  f_011_110_110_111_1(uniques, 10);
+  f_011_110_111_010_0(uniques, 10);
+  f_011_110_111_010_1(uniques, 10);
+  f_011_110_111_011_0(uniques, 10);
+  f_011_110_111_011_1(uniques, 10);
+  f_011_110_111_110_0(uniques, 10);
+  f_011_110_111_110_1(uniques, 10);
+  f_011_110_111_111_0(uniques, 10);
+  f_011_110_111_111_1(uniques, 10);
+  f_011_111_000_010_0(uniques, 10);
+  f_011_111_000_010_1(uniques, 10);
+  f_011_111_000_011_0(uniques, 10);
+  f_011_111_000_011_1(uniques, 10);
+  f_011_111_000_110_0(uniques, 10);
+  f_011_111_000_110_1(uniques, 10);
+  f_011_111_000_111_0(uniques, 10);
+  f_011_111_000_111_1(uniques, 10);
+  f_011_111_001_010_0(uniques, 10);
+  f_011_111_001_010_1(uniques, 10);
+  f_011_111_001_011_0(uniques, 10);
+  f_011_111_001_011_1(uniques, 10);
+  f_011_111_001_110_0(uniques, 10);
+  f_011_111_001_110_1(uniques, 10);
+  f_011_111_001_111_0(uniques, 10);
+  f_011_111_001_111_1(uniques, 10);
+  f_011_111_010_010_0(uniques, 10);
+  f_011_111_010_010_1(uniques, 10);
+  f_011_111_010_011_0(uniques, 10);
+  f_011_111_010_011_1(uniques, 10);
+  f_011_111_010_110_0(uniques, 10);
+  f_011_111_010_110_1(uniques, 10);
+  f_011_111_010_111_0(uniques, 10);
+  f_011_111_010_111_1(uniques, 10);
+  f_011_111_011_010_0(uniques, 10);
+  f_011_111_011_010_1(uniques, 10);
+  f_011_111_011_011_0(uniques, 10);
+  f_011_111_011_011_1(uniques, 10);
+  f_011_111_011_110_0(uniques, 10);
+  f_011_111_011_110_1(uniques, 10);
+  f_011_111_011_111_0(uniques, 10);
+  f_011_111_011_111_1(uniques, 10);
+  f_011_111_100_010_0(uniques, 10);
+  f_011_111_100_010_1(uniques, 10);
+  f_011_111_100_011_0(uniques, 10);
+  f_011_111_100_011_1(uniques, 10);
+  f_011_111_100_110_0(uniques, 10);
+  f_011_111_100_110_1(uniques, 10);
+  f_011_111_100_111_0(uniques, 10);
+  f_011_111_100_111_1(uniques, 10);
+  f_011_111_101_010_0(uniques, 10);
+  f_011_111_101_010_1(uniques, 10);
+  f_011_111_101_011_0(uniques, 10);
+  f_011_111_101_011_1(uniques, 10);
+  f_011_111_101_110_0(uniques, 10);
+  f_011_111_101_110_1(uniques, 10);
+  f_011_111_101_111_0(uniques, 10);
+  f_011_111_101_111_1(uniques, 10);
+  f_011_111_110_010_0(uniques, 10);
+  f_011_111_110_010_1(uniques, 10);
+  f_011_111_110_011_0(uniques, 10);
+  f_011_111_110_011_1(uniques, 10);
+  f_011_111_110_110_0(uniques, 10);
+  f_011_111_110_110_1(uniques, 10);
+  f_011_111_110_111_0(uniques, 10);
+  f_011_111_110_111_1(uniques, 10);
+  f_011_111_111_010_0(uniques, 10);
+  f_011_111_111_010_1(uniques, 10);
+  f_011_111_111_011_0(uniques, 10);
+  f_011_111_111_011_1(uniques, 10);
+  f_011_111_111_110_0(uniques, 10);
+  f_011_111_111_110_1(uniques, 10);
+  f_011_111_111_111_0(uniques, 10);
+  f_011_111_111_111_1(uniques, 10);
+  f_100_000_000_010_0(uniques, 10);
+  f_100_000_000_010_1(uniques, 10);
+  f_100_000_000_011_0(uniques, 10);
+  f_100_000_000_011_1(uniques, 10);
+  f_100_000_000_110_0(uniques, 10);
+  f_100_000_000_110_1(uniques, 10);
+  f_100_000_000_111_0(uniques, 10);
+  f_100_000_000_111_1(uniques, 10);
+  f_100_000_001_010_0(uniques, 10);
+  f_100_000_001_010_1(uniques, 10);
+  f_100_000_001_011_0(uniques, 10);
+  f_100_000_001_011_1(uniques, 10);
+  f_100_000_001_110_0(uniques, 10);
+  f_100_000_001_110_1(uniques, 10);
+  f_100_000_001_111_0(uniques, 10);
+  f_100_000_001_111_1(uniques, 10);
+  f_100_000_010_010_0(uniques, 10);
+  f_100_000_010_010_1(uniques, 10);
+  f_100_000_010_011_0(uniques, 10);
+  f_100_000_010_011_1(uniques, 10);
+  f_100_000_010_110_0(uniques, 10);
+  f_100_000_010_110_1(uniques, 10);
+  f_100_000_010_111_0(uniques, 10);
+  f_100_000_010_111_1(uniques, 10);
+  f_100_000_011_010_0(uniques, 10);
+  f_100_000_011_010_1(uniques, 10);
+  f_100_000_011_011_0(uniques, 10);
+  f_100_000_011_011_1(uniques, 10);
+  f_100_000_011_110_0(uniques, 10);
+  f_100_000_011_110_1(uniques, 10);
+  f_100_000_011_111_0(uniques, 10);
+  f_100_000_011_111_1(uniques, 10);
+  f_100_000_100_010_0(uniques, 10);
+  f_100_000_100_010_1(uniques, 10);
+  f_100_000_100_011_0(uniques, 10);
+  f_100_000_100_011_1(uniques, 10);
+  f_100_000_100_110_0(uniques, 10);
+  f_100_000_100_110_1(uniques, 10);
+  f_100_000_100_111_0(uniques, 10);
+  f_100_000_100_111_1(uniques, 10);
+  f_100_000_101_010_0(uniques, 10);
+  f_100_000_101_010_1(uniques, 10);
+  f_100_000_101_011_0(uniques, 10);
+  f_100_000_101_011_1(uniques, 10);
+  f_100_000_101_110_0(uniques, 10);
+  f_100_000_101_110_1(uniques, 10);
+  f_100_000_101_111_0(uniques, 10);
+  f_100_000_101_111_1(uniques, 10);
+  f_100_000_110_010_0(uniques, 10);
+  f_100_000_110_010_1(uniques, 10);
+  f_100_000_110_011_0(uniques, 10);
+  f_100_000_110_011_1(uniques, 10);
+  f_100_000_110_110_0(uniques, 10);
+  f_100_000_110_110_1(uniques, 10);
+  f_100_000_110_111_0(uniques, 10);
+  f_100_000_110_111_1(uniques, 10);
+  f_100_000_111_010_0(uniques, 10);
+  f_100_000_111_010_1(uniques, 10);
+  f_100_000_111_011_0(uniques, 10);
+  f_100_000_111_011_1(uniques, 10);
+  f_100_000_111_110_0(uniques, 10);
+  f_100_000_111_110_1(uniques, 10);
+  f_100_000_111_111_0(uniques, 10);
+  f_100_000_111_111_1(uniques, 10);
+  f_100_001_000_010_0(uniques, 10);
+  f_100_001_000_010_1(uniques, 10);
+  f_100_001_000_011_0(uniques, 10);
+  f_100_001_000_011_1(uniques, 10);
+  f_100_001_000_110_0(uniques, 10);
+  f_100_001_000_110_1(uniques, 10);
+  f_100_001_000_111_0(uniques, 10);
+  f_100_001_000_111_1(uniques, 10);
+  f_100_001_001_010_0(uniques, 10);
+  f_100_001_001_010_1(uniques, 10);
+  f_100_001_001_011_0(uniques, 10);
+  f_100_001_001_011_1(uniques, 10);
+  f_100_001_001_110_0(uniques, 10);
+  f_100_001_001_110_1(uniques, 10);
+  f_100_001_001_111_0(uniques, 10);
+  f_100_001_001_111_1(uniques, 10);
+  f_100_001_010_010_0(uniques, 10);
+  f_100_001_010_010_1(uniques, 10);
+  f_100_001_010_011_0(uniques, 10);
+  f_100_001_010_011_1(uniques, 10);
+  f_100_001_010_110_0(uniques, 10);
+  f_100_001_010_110_1(uniques, 10);
+  f_100_001_010_111_0(uniques, 10);
+  f_100_001_010_111_1(uniques, 10);
+  f_100_001_011_010_0(uniques, 10);
+  f_100_001_011_010_1(uniques, 10);
+  f_100_001_011_011_0(uniques, 10);
+  f_100_001_011_011_1(uniques, 10);
+  f_100_001_011_110_0(uniques, 10);
+  f_100_001_011_110_1(uniques, 10);
+  f_100_001_011_111_0(uniques, 10);
+  f_100_001_011_111_1(uniques, 10);
+  f_100_001_100_010_0(uniques, 10);
+  f_100_001_100_010_1(uniques, 10);
+  f_100_001_100_011_0(uniques, 10);
+  f_100_001_100_011_1(uniques, 10);
+  f_100_001_100_110_0(uniques, 10);
+  f_100_001_100_110_1(uniques, 10);
+  f_100_001_100_111_0(uniques, 10);
+  f_100_001_100_111_1(uniques, 10);
+  f_100_001_101_010_0(uniques, 10);
+  f_100_001_101_010_1(uniques, 10);
+  f_100_001_101_011_0(uniques, 10);
+  f_100_001_101_011_1(uniques, 10);
+  f_100_001_101_110_0(uniques, 10);
+  f_100_001_101_110_1(uniques, 10);
+  f_100_001_101_111_0(uniques, 10);
+  f_100_001_101_111_1(uniques, 10);
+  f_100_001_110_010_0(uniques, 10);
+  f_100_001_110_010_1(uniques, 10);
+  f_100_001_110_011_0(uniques, 10);
+  f_100_001_110_011_1(uniques, 10);
+  f_100_001_110_110_0(uniques, 10);
+  f_100_001_110_110_1(uniques, 10);
+  f_100_001_110_111_0(uniques, 10);
+  f_100_001_110_111_1(uniques, 10);
+  f_100_001_111_010_0(uniques, 10);
+  f_100_001_111_010_1(uniques, 10);
+  f_100_001_111_011_0(uniques, 10);
+  f_100_001_111_011_1(uniques, 10);
+  f_100_001_111_110_0(uniques, 10);
+  f_100_001_111_110_1(uniques, 10);
+  f_100_001_111_111_0(uniques, 10);
+  f_100_001_111_111_1(uniques, 10);
+  f_100_010_000_010_0(uniques, 10);
+  f_100_010_000_010_1(uniques, 10);
+  f_100_010_000_011_0(uniques, 10);
+  f_100_010_000_011_1(uniques, 10);
+  f_100_010_000_110_0(uniques, 10);
+  f_100_010_000_110_1(uniques, 10);
+  f_100_010_000_111_0(uniques, 10);
+  f_100_010_000_111_1(uniques, 10);
+  f_100_010_001_010_0(uniques, 10);
+  f_100_010_001_010_1(uniques, 10);
+  f_100_010_001_011_0(uniques, 10);
+  f_100_010_001_011_1(uniques, 10);
+  f_100_010_001_110_0(uniques, 10);
+  f_100_010_001_110_1(uniques, 10);
+  f_100_010_001_111_0(uniques, 10);
+  f_100_010_001_111_1(uniques, 10);
+  f_100_010_010_010_0(uniques, 10);
+  f_100_010_010_010_1(uniques, 10);
+  f_100_010_010_011_0(uniques, 10);
+  f_100_010_010_011_1(uniques, 10);
+  f_100_010_010_110_0(uniques, 10);
+  f_100_010_010_110_1(uniques, 10);
+  f_100_010_010_111_0(uniques, 10);
+  f_100_010_010_111_1(uniques, 10);
+  f_100_010_011_010_0(uniques, 10);
+  f_100_010_011_010_1(uniques, 10);
+  f_100_010_011_011_0(uniques, 10);
+  f_100_010_011_011_1(uniques, 10);
+  f_100_010_011_110_0(uniques, 10);
+  f_100_010_011_110_1(uniques, 10);
+  f_100_010_011_111_0(uniques, 10);
+  f_100_010_011_111_1(uniques, 10);
+  f_100_010_100_010_0(uniques, 10);
+  f_100_010_100_010_1(uniques, 10);
+  f_100_010_100_011_0(uniques, 10);
+  f_100_010_100_011_1(uniques, 10);
+  f_100_010_100_110_0(uniques, 10);
+  f_100_010_100_110_1(uniques, 10);
+  f_100_010_100_111_0(uniques, 10);
+  f_100_010_100_111_1(uniques, 10);
+  f_100_010_101_010_0(uniques, 10);
+  f_100_010_101_010_1(uniques, 10);
+  f_100_010_101_011_0(uniques, 10);
+  f_100_010_101_011_1(uniques, 10);
+  f_100_010_101_110_0(uniques, 10);
+  f_100_010_101_110_1(uniques, 10);
+  f_100_010_101_111_0(uniques, 10);
+  f_100_010_101_111_1(uniques, 10);
+  f_100_010_110_010_0(uniques, 10);
+  f_100_010_110_010_1(uniques, 10);
+  f_100_010_110_011_0(uniques, 10);
+  f_100_010_110_011_1(uniques, 10);
+  f_100_010_110_110_0(uniques, 10);
+  f_100_010_110_110_1(uniques, 10);
+  f_100_010_110_111_0(uniques, 10);
+  f_100_010_110_111_1(uniques, 10);
+  f_100_010_111_010_0(uniques, 10);
+  f_100_010_111_010_1(uniques, 10);
+  f_100_010_111_011_0(uniques, 10);
+  f_100_010_111_011_1(uniques, 10);
+  f_100_010_111_110_0(uniques, 10);
+  f_100_010_111_110_1(uniques, 10);
+  f_100_010_111_111_0(uniques, 10);
+  f_100_010_111_111_1(uniques, 10);
+  f_100_011_000_010_0(uniques, 10);
+  f_100_011_000_010_1(uniques, 10);
+  f_100_011_000_011_0(uniques, 10);
+  f_100_011_000_011_1(uniques, 10);
+  f_100_011_000_110_0(uniques, 10);
+  f_100_011_000_110_1(uniques, 10);
+  f_100_011_000_111_0(uniques, 10);
+  f_100_011_000_111_1(uniques, 10);
+  f_100_011_001_010_0(uniques, 10);
+  f_100_011_001_010_1(uniques, 10);
+  f_100_011_001_011_0(uniques, 10);
+  f_100_011_001_011_1(uniques, 10);
+  f_100_011_001_110_0(uniques, 10);
+  f_100_011_001_110_1(uniques, 10);
+  f_100_011_001_111_0(uniques, 10);
+  f_100_011_001_111_1(uniques, 10);
+  f_100_011_010_010_0(uniques, 10);
+  f_100_011_010_010_1(uniques, 10);
+  f_100_011_010_011_0(uniques, 10);
+  f_100_011_010_011_1(uniques, 10);
+  f_100_011_010_110_0(uniques, 10);
+  f_100_011_010_110_1(uniques, 10);
+  f_100_011_010_111_0(uniques, 10);
+  f_100_011_010_111_1(uniques, 10);
+  f_100_011_011_010_0(uniques, 10);
+  f_100_011_011_010_1(uniques, 10);
+  f_100_011_011_011_0(uniques, 10);
+  f_100_011_011_011_1(uniques, 10);
+  f_100_011_011_110_0(uniques, 10);
+  f_100_011_011_110_1(uniques, 10);
+  f_100_011_011_111_0(uniques, 10);
+  f_100_011_011_111_1(uniques, 10);
+  f_100_011_100_010_0(uniques, 10);
+  f_100_011_100_010_1(uniques, 10);
+  f_100_011_100_011_0(uniques, 10);
+  f_100_011_100_011_1(uniques, 10);
+  f_100_011_100_110_0(uniques, 10);
+  f_100_011_100_110_1(uniques, 10);
+  f_100_011_100_111_0(uniques, 10);
+  f_100_011_100_111_1(uniques, 10);
+  f_100_011_101_010_0(uniques, 10);
+  f_100_011_101_010_1(uniques, 10);
+  f_100_011_101_011_0(uniques, 10);
+  f_100_011_101_011_1(uniques, 10);
+  f_100_011_101_110_0(uniques, 10);
+  f_100_011_101_110_1(uniques, 10);
+  f_100_011_101_111_0(uniques, 10);
+  f_100_011_101_111_1(uniques, 10);
+  f_100_011_110_010_0(uniques, 10);
+  f_100_011_110_010_1(uniques, 10);
+  f_100_011_110_011_0(uniques, 10);
+  f_100_011_110_011_1(uniques, 10);
+  f_100_011_110_110_0(uniques, 10);
+  f_100_011_110_110_1(uniques, 10);
+  f_100_011_110_111_0(uniques, 10);
+  f_100_011_110_111_1(uniques, 10);
+  f_100_011_111_010_0(uniques, 10);
+  f_100_011_111_010_1(uniques, 10);
+  f_100_011_111_011_0(uniques, 10);
+  f_100_011_111_011_1(uniques, 10);
+  f_100_011_111_110_0(uniques, 10);
+  f_100_011_111_110_1(uniques, 10);
+  f_100_011_111_111_0(uniques, 10);
+  f_100_011_111_111_1(uniques, 10);
+  f_100_100_000_010_0(uniques, 10);
+  f_100_100_000_010_1(uniques, 10);
+  f_100_100_000_011_0(uniques, 10);
+  f_100_100_000_011_1(uniques, 10);
+  f_100_100_000_110_0(uniques, 10);
+  f_100_100_000_110_1(uniques, 10);
+  f_100_100_000_111_0(uniques, 10);
+  f_100_100_000_111_1(uniques, 10);
+  f_100_100_001_010_0(uniques, 10);
+  f_100_100_001_010_1(uniques, 10);
+  f_100_100_001_011_0(uniques, 10);
+  f_100_100_001_011_1(uniques, 10);
+  f_100_100_001_110_0(uniques, 10);
+  f_100_100_001_110_1(uniques, 10);
+  f_100_100_001_111_0(uniques, 10);
+  f_100_100_001_111_1(uniques, 10);
+  f_100_100_010_010_0(uniques, 10);
+  f_100_100_010_010_1(uniques, 10);
+  f_100_100_010_011_0(uniques, 10);
+  f_100_100_010_011_1(uniques, 10);
+  f_100_100_010_110_0(uniques, 10);
+  f_100_100_010_110_1(uniques, 10);
+  f_100_100_010_111_0(uniques, 10);
+  f_100_100_010_111_1(uniques, 10);
+  f_100_100_011_010_0(uniques, 10);
+  f_100_100_011_010_1(uniques, 10);
+  f_100_100_011_011_0(uniques, 10);
+  f_100_100_011_011_1(uniques, 10);
+  f_100_100_011_110_0(uniques, 10);
+  f_100_100_011_110_1(uniques, 10);
+  f_100_100_011_111_0(uniques, 10);
+  f_100_100_011_111_1(uniques, 10);
+  f_100_100_100_010_0(uniques, 10);
+  f_100_100_100_010_1(uniques, 10);
+  f_100_100_100_011_0(uniques, 10);
+  f_100_100_100_011_1(uniques, 10);
+  f_100_100_100_110_0(uniques, 10);
+  f_100_100_100_110_1(uniques, 10);
+  f_100_100_100_111_0(uniques, 10);
+  f_100_100_100_111_1(uniques, 10);
+  f_100_100_101_010_0(uniques, 10);
+  f_100_100_101_010_1(uniques, 10);
+  f_100_100_101_011_0(uniques, 10);
+  f_100_100_101_011_1(uniques, 10);
+  f_100_100_101_110_0(uniques, 10);
+  f_100_100_101_110_1(uniques, 10);
+  f_100_100_101_111_0(uniques, 10);
+  f_100_100_101_111_1(uniques, 10);
+  f_100_100_110_010_0(uniques, 10);
+  f_100_100_110_010_1(uniques, 10);
+  f_100_100_110_011_0(uniques, 10);
+  f_100_100_110_011_1(uniques, 10);
+  f_100_100_110_110_0(uniques, 10);
+  f_100_100_110_110_1(uniques, 10);
+  f_100_100_110_111_0(uniques, 10);
+  f_100_100_110_111_1(uniques, 10);
+  f_100_100_111_010_0(uniques, 10);
+  f_100_100_111_010_1(uniques, 10);
+  f_100_100_111_011_0(uniques, 10);
+  f_100_100_111_011_1(uniques, 10);
+  f_100_100_111_110_0(uniques, 10);
+  f_100_100_111_110_1(uniques, 10);
+  f_100_100_111_111_0(uniques, 10);
+  f_100_100_111_111_1(uniques, 10);
+  f_100_101_000_010_0(uniques, 10);
+  f_100_101_000_010_1(uniques, 10);
+  f_100_101_000_011_0(uniques, 10);
+  f_100_101_000_011_1(uniques, 10);
+  f_100_101_000_110_0(uniques, 10);
+  f_100_101_000_110_1(uniques, 10);
+  f_100_101_000_111_0(uniques, 10);
+  f_100_101_000_111_1(uniques, 10);
+  f_100_101_001_010_0(uniques, 10);
+  f_100_101_001_010_1(uniques, 10);
+  f_100_101_001_011_0(uniques, 10);
+  f_100_101_001_011_1(uniques, 10);
+  f_100_101_001_110_0(uniques, 10);
+  f_100_101_001_110_1(uniques, 10);
+  f_100_101_001_111_0(uniques, 10);
+  f_100_101_001_111_1(uniques, 10);
+  f_100_101_010_010_0(uniques, 10);
+  f_100_101_010_010_1(uniques, 10);
+  f_100_101_010_011_0(uniques, 10);
+  f_100_101_010_011_1(uniques, 10);
+  f_100_101_010_110_0(uniques, 10);
+  f_100_101_010_110_1(uniques, 10);
+  f_100_101_010_111_0(uniques, 10);
+  f_100_101_010_111_1(uniques, 10);
+  f_100_101_011_010_0(uniques, 10);
+  f_100_101_011_010_1(uniques, 10);
+  f_100_101_011_011_0(uniques, 10);
+  f_100_101_011_011_1(uniques, 10);
+  f_100_101_011_110_0(uniques, 10);
+  f_100_101_011_110_1(uniques, 10);
+  f_100_101_011_111_0(uniques, 10);
+  f_100_101_011_111_1(uniques, 10);
+  f_100_101_100_010_0(uniques, 10);
+  f_100_101_100_010_1(uniques, 10);
+  f_100_101_100_011_0(uniques, 10);
+  f_100_101_100_011_1(uniques, 10);
+  f_100_101_100_110_0(uniques, 10);
+  f_100_101_100_110_1(uniques, 10);
+  f_100_101_100_111_0(uniques, 10);
+  f_100_101_100_111_1(uniques, 10);
+  f_100_101_101_010_0(uniques, 10);
+  f_100_101_101_010_1(uniques, 10);
+  f_100_101_101_011_0(uniques, 10);
+  f_100_101_101_011_1(uniques, 10);
+  f_100_101_101_110_0(uniques, 10);
+  f_100_101_101_110_1(uniques, 10);
+  f_100_101_101_111_0(uniques, 10);
+  f_100_101_101_111_1(uniques, 10);
+  f_100_101_110_010_0(uniques, 10);
+  f_100_101_110_010_1(uniques, 10);
+  f_100_101_110_011_0(uniques, 10);
+  f_100_101_110_011_1(uniques, 10);
+  f_100_101_110_110_0(uniques, 10);
+  f_100_101_110_110_1(uniques, 10);
+  f_100_101_110_111_0(uniques, 10);
+  f_100_101_110_111_1(uniques, 10);
+  f_100_101_111_010_0(uniques, 10);
+  f_100_101_111_010_1(uniques, 10);
+  f_100_101_111_011_0(uniques, 10);
+  f_100_101_111_011_1(uniques, 10);
+  f_100_101_111_110_0(uniques, 10);
+  f_100_101_111_110_1(uniques, 10);
+  f_100_101_111_111_0(uniques, 10);
+  f_100_101_111_111_1(uniques, 10);
+  f_100_110_000_010_0(uniques, 10);
+  f_100_110_000_010_1(uniques, 10);
+  f_100_110_000_011_0(uniques, 10);
+  f_100_110_000_011_1(uniques, 10);
+  f_100_110_000_110_0(uniques, 10);
+  f_100_110_000_110_1(uniques, 10);
+  f_100_110_000_111_0(uniques, 10);
+  f_100_110_000_111_1(uniques, 10);
+  f_100_110_001_010_0(uniques, 10);
+  f_100_110_001_010_1(uniques, 10);
+  f_100_110_001_011_0(uniques, 10);
+  f_100_110_001_011_1(uniques, 10);
+  f_100_110_001_110_0(uniques, 10);
+  f_100_110_001_110_1(uniques, 10);
+  f_100_110_001_111_0(uniques, 10);
+  f_100_110_001_111_1(uniques, 10);
+  f_100_110_010_010_0(uniques, 10);
+  f_100_110_010_010_1(uniques, 10);
+  f_100_110_010_011_0(uniques, 10);
+  f_100_110_010_011_1(uniques, 10);
+  f_100_110_010_110_0(uniques, 10);
+  f_100_110_010_110_1(uniques, 10);
+  f_100_110_010_111_0(uniques, 10);
+  f_100_110_010_111_1(uniques, 10);
+  f_100_110_011_010_0(uniques, 10);
+  f_100_110_011_010_1(uniques, 10);
+  f_100_110_011_011_0(uniques, 10);
+  f_100_110_011_011_1(uniques, 10);
+  f_100_110_011_110_0(uniques, 10);
+  f_100_110_011_110_1(uniques, 10);
+  f_100_110_011_111_0(uniques, 10);
+  f_100_110_011_111_1(uniques, 10);
+  f_100_110_100_010_0(uniques, 10);
+  f_100_110_100_010_1(uniques, 10);
+  f_100_110_100_011_0(uniques, 10);
+  f_100_110_100_011_1(uniques, 10);
+  f_100_110_100_110_0(uniques, 10);
+  f_100_110_100_110_1(uniques, 10);
+  f_100_110_100_111_0(uniques, 10);
+  f_100_110_100_111_1(uniques, 10);
+  f_100_110_101_010_0(uniques, 10);
+  f_100_110_101_010_1(uniques, 10);
+  f_100_110_101_011_0(uniques, 10);
+  f_100_110_101_011_1(uniques, 10);
+  f_100_110_101_110_0(uniques, 10);
+  f_100_110_101_110_1(uniques, 10);
+  f_100_110_101_111_0(uniques, 10);
+  f_100_110_101_111_1(uniques, 10);
+  f_100_110_110_010_0(uniques, 10);
+  f_100_110_110_010_1(uniques, 10);
+  f_100_110_110_011_0(uniques, 10);
+  f_100_110_110_011_1(uniques, 10);
+  f_100_110_110_110_0(uniques, 10);
+  f_100_110_110_110_1(uniques, 10);
+  f_100_110_110_111_0(uniques, 10);
+  f_100_110_110_111_1(uniques, 10);
+  f_100_110_111_010_0(uniques, 10);
+  f_100_110_111_010_1(uniques, 10);
+  f_100_110_111_011_0(uniques, 10);
+  f_100_110_111_011_1(uniques, 10);
+  f_100_110_111_110_0(uniques, 10);
+  f_100_110_111_110_1(uniques, 10);
+  f_100_110_111_111_0(uniques, 10);
+  f_100_110_111_111_1(uniques, 10);
+  f_100_111_000_010_0(uniques, 10);
+  f_100_111_000_010_1(uniques, 10);
+  f_100_111_000_011_0(uniques, 10);
+  f_100_111_000_011_1(uniques, 10);
+  f_100_111_000_110_0(uniques, 10);
+  f_100_111_000_110_1(uniques, 10);
+  f_100_111_000_111_0(uniques, 10);
+  f_100_111_000_111_1(uniques, 10);
+  f_100_111_001_010_0(uniques, 10);
+  f_100_111_001_010_1(uniques, 10);
+  f_100_111_001_011_0(uniques, 10);
+  f_100_111_001_011_1(uniques, 10);
+  f_100_111_001_110_0(uniques, 10);
+  f_100_111_001_110_1(uniques, 10);
+  f_100_111_001_111_0(uniques, 10);
+  f_100_111_001_111_1(uniques, 10);
+  f_100_111_010_010_0(uniques, 10);
+  f_100_111_010_010_1(uniques, 10);
+  f_100_111_010_011_0(uniques, 10);
+  f_100_111_010_011_1(uniques, 10);
+  f_100_111_010_110_0(uniques, 10);
+  f_100_111_010_110_1(uniques, 10);
+  f_100_111_010_111_0(uniques, 10);
+  f_100_111_010_111_1(uniques, 10);
+  f_100_111_011_010_0(uniques, 10);
+  f_100_111_011_010_1(uniques, 10);
+  f_100_111_011_011_0(uniques, 10);
+  f_100_111_011_011_1(uniques, 10);
+  f_100_111_011_110_0(uniques, 10);
+  f_100_111_011_110_1(uniques, 10);
+  f_100_111_011_111_0(uniques, 10);
+  f_100_111_011_111_1(uniques, 10);
+  f_100_111_100_010_0(uniques, 10);
+  f_100_111_100_010_1(uniques, 10);
+  f_100_111_100_011_0(uniques, 10);
+  f_100_111_100_011_1(uniques, 10);
+  f_100_111_100_110_0(uniques, 10);
+  f_100_111_100_110_1(uniques, 10);
+  f_100_111_100_111_0(uniques, 10);
+  f_100_111_100_111_1(uniques, 10);
+  f_100_111_101_010_0(uniques, 10);
+  f_100_111_101_010_1(uniques, 10);
+  f_100_111_101_011_0(uniques, 10);
+  f_100_111_101_011_1(uniques, 10);
+  f_100_111_101_110_0(uniques, 10);
+  f_100_111_101_110_1(uniques, 10);
+  f_100_111_101_111_0(uniques, 10);
+  f_100_111_101_111_1(uniques, 10);
+  f_100_111_110_010_0(uniques, 10);
+  f_100_111_110_010_1(uniques, 10);
+  f_100_111_110_011_0(uniques, 10);
+  f_100_111_110_011_1(uniques, 10);
+  f_100_111_110_110_0(uniques, 10);
+  f_100_111_110_110_1(uniques, 10);
+  f_100_111_110_111_0(uniques, 10);
+  f_100_111_110_111_1(uniques, 10);
+  f_100_111_111_010_0(uniques, 10);
+  f_100_111_111_010_1(uniques, 10);
+  f_100_111_111_011_0(uniques, 10);
+  f_100_111_111_011_1(uniques, 10);
+  f_100_111_111_110_0(uniques, 10);
+  f_100_111_111_110_1(uniques, 10);
+  f_100_111_111_111_0(uniques, 10);
+  f_100_111_111_111_1(uniques, 10);
+  f_101_000_000_010_0(uniques, 10);
+  f_101_000_000_010_1(uniques, 10);
+  f_101_000_000_011_0(uniques, 10);
+  f_101_000_000_011_1(uniques, 10);
+  f_101_000_000_110_0(uniques, 10);
+  f_101_000_000_110_1(uniques, 10);
+  f_101_000_000_111_0(uniques, 10);
+  f_101_000_000_111_1(uniques, 10);
+  f_101_000_001_010_0(uniques, 10);
+  f_101_000_001_010_1(uniques, 10);
+  f_101_000_001_011_0(uniques, 10);
+  f_101_000_001_011_1(uniques, 10);
+  f_101_000_001_110_0(uniques, 10);
+  f_101_000_001_110_1(uniques, 10);
+  f_101_000_001_111_0(uniques, 10);
+  f_101_000_001_111_1(uniques, 10);
+  f_101_000_010_010_0(uniques, 10);
+  f_101_000_010_010_1(uniques, 10);
+  f_101_000_010_011_0(uniques, 10);
+  f_101_000_010_011_1(uniques, 10);
+  f_101_000_010_110_0(uniques, 10);
+  f_101_000_010_110_1(uniques, 10);
+  f_101_000_010_111_0(uniques, 10);
+  f_101_000_010_111_1(uniques, 10);
+  f_101_000_011_010_0(uniques, 10);
+  f_101_000_011_010_1(uniques, 10);
+  f_101_000_011_011_0(uniques, 10);
+  f_101_000_011_011_1(uniques, 10);
+  f_101_000_011_110_0(uniques, 10);
+  f_101_000_011_110_1(uniques, 10);
+  f_101_000_011_111_0(uniques, 10);
+  f_101_000_011_111_1(uniques, 10);
+  f_101_000_100_010_0(uniques, 10);
+  f_101_000_100_010_1(uniques, 10);
+  f_101_000_100_011_0(uniques, 10);
+  f_101_000_100_011_1(uniques, 10);
+  f_101_000_100_110_0(uniques, 10);
+  f_101_000_100_110_1(uniques, 10);
+  f_101_000_100_111_0(uniques, 10);
+  f_101_000_100_111_1(uniques, 10);
+  f_101_000_101_010_0(uniques, 10);
+  f_101_000_101_010_1(uniques, 10);
+  f_101_000_101_011_0(uniques, 10);
+  f_101_000_101_011_1(uniques, 10);
+  f_101_000_101_110_0(uniques, 10);
+  f_101_000_101_110_1(uniques, 10);
+  f_101_000_101_111_0(uniques, 10);
+  f_101_000_101_111_1(uniques, 10);
+  f_101_000_110_010_0(uniques, 10);
+  f_101_000_110_010_1(uniques, 10);
+  f_101_000_110_011_0(uniques, 10);
+  f_101_000_110_011_1(uniques, 10);
+  f_101_000_110_110_0(uniques, 10);
+  f_101_000_110_110_1(uniques, 10);
+  f_101_000_110_111_0(uniques, 10);
+  f_101_000_110_111_1(uniques, 10);
+  f_101_000_111_010_0(uniques, 10);
+  f_101_000_111_010_1(uniques, 10);
+  f_101_000_111_011_0(uniques, 10);
+  f_101_000_111_011_1(uniques, 10);
+  f_101_000_111_110_0(uniques, 10);
+  f_101_000_111_110_1(uniques, 10);
+  f_101_000_111_111_0(uniques, 10);
+  f_101_000_111_111_1(uniques, 10);
+  f_101_001_000_010_0(uniques, 10);
+  f_101_001_000_010_1(uniques, 10);
+  f_101_001_000_011_0(uniques, 10);
+  f_101_001_000_011_1(uniques, 10);
+  f_101_001_000_110_0(uniques, 10);
+  f_101_001_000_110_1(uniques, 10);
+  f_101_001_000_111_0(uniques, 10);
+  f_101_001_000_111_1(uniques, 10);
+  f_101_001_001_010_0(uniques, 10);
+  f_101_001_001_010_1(uniques, 10);
+  f_101_001_001_011_0(uniques, 10);
+  f_101_001_001_011_1(uniques, 10);
+  f_101_001_001_110_0(uniques, 10);
+  f_101_001_001_110_1(uniques, 10);
+  f_101_001_001_111_0(uniques, 10);
+  f_101_001_001_111_1(uniques, 10);
+  f_101_001_010_010_0(uniques, 10);
+  f_101_001_010_010_1(uniques, 10);
+  f_101_001_010_011_0(uniques, 10);
+  f_101_001_010_011_1(uniques, 10);
+  f_101_001_010_110_0(uniques, 10);
+  f_101_001_010_110_1(uniques, 10);
+  f_101_001_010_111_0(uniques, 10);
+  f_101_001_010_111_1(uniques, 10);
+  f_101_001_011_010_0(uniques, 10);
+  f_101_001_011_010_1(uniques, 10);
+  f_101_001_011_011_0(uniques, 10);
+  f_101_001_011_011_1(uniques, 10);
+  f_101_001_011_110_0(uniques, 10);
+  f_101_001_011_110_1(uniques, 10);
+  f_101_001_011_111_0(uniques, 10);
+  f_101_001_011_111_1(uniques, 10);
+  f_101_001_100_010_0(uniques, 10);
+  f_101_001_100_010_1(uniques, 10);
+  f_101_001_100_011_0(uniques, 10);
+  f_101_001_100_011_1(uniques, 10);
+  f_101_001_100_110_0(uniques, 10);
+  f_101_001_100_110_1(uniques, 10);
+  f_101_001_100_111_0(uniques, 10);
+  f_101_001_100_111_1(uniques, 10);
+  f_101_001_101_010_0(uniques, 10);
+  f_101_001_101_010_1(uniques, 10);
+  f_101_001_101_011_0(uniques, 10);
+  f_101_001_101_011_1(uniques, 10);
+  f_101_001_101_110_0(uniques, 10);
+  f_101_001_101_110_1(uniques, 10);
+  f_101_001_101_111_0(uniques, 10);
+  f_101_001_101_111_1(uniques, 10);
+  f_101_001_110_010_0(uniques, 10);
+  f_101_001_110_010_1(uniques, 10);
+  f_101_001_110_011_0(uniques, 10);
+  f_101_001_110_011_1(uniques, 10);
+  f_101_001_110_110_0(uniques, 10);
+  f_101_001_110_110_1(uniques, 10);
+  f_101_001_110_111_0(uniques, 10);
+  f_101_001_110_111_1(uniques, 10);
+  f_101_001_111_010_0(uniques, 10);
+  f_101_001_111_010_1(uniques, 10);
+  f_101_001_111_011_0(uniques, 10);
+  f_101_001_111_011_1(uniques, 10);
+  f_101_001_111_110_0(uniques, 10);
+  f_101_001_111_110_1(uniques, 10);
+  f_101_001_111_111_0(uniques, 10);
+  f_101_001_111_111_1(uniques, 10);
+  f_101_010_000_010_0(uniques, 10);
+  f_101_010_000_010_1(uniques, 10);
+  f_101_010_000_011_0(uniques, 10);
+  f_101_010_000_011_1(uniques, 10);
+  f_101_010_000_110_0(uniques, 10);
+  f_101_010_000_110_1(uniques, 10);
+  f_101_010_000_111_0(uniques, 10);
+  f_101_010_000_111_1(uniques, 10);
+  f_101_010_001_010_0(uniques, 10);
+  f_101_010_001_010_1(uniques, 10);
+  f_101_010_001_011_0(uniques, 10);
+  f_101_010_001_011_1(uniques, 10);
+  f_101_010_001_110_0(uniques, 10);
+  f_101_010_001_110_1(uniques, 10);
+  f_101_010_001_111_0(uniques, 10);
+  f_101_010_001_111_1(uniques, 10);
+  f_101_010_010_010_0(uniques, 10);
+  f_101_010_010_010_1(uniques, 10);
+  f_101_010_010_011_0(uniques, 10);
+  f_101_010_010_011_1(uniques, 10);
+  f_101_010_010_110_0(uniques, 10);
+  f_101_010_010_110_1(uniques, 10);
+  f_101_010_010_111_0(uniques, 10);
+  f_101_010_010_111_1(uniques, 10);
+  f_101_010_011_010_0(uniques, 10);
+  f_101_010_011_010_1(uniques, 10);
+  f_101_010_011_011_0(uniques, 10);
+  f_101_010_011_011_1(uniques, 10);
+  f_101_010_011_110_0(uniques, 10);
+  f_101_010_011_110_1(uniques, 10);
+  f_101_010_011_111_0(uniques, 10);
+  f_101_010_011_111_1(uniques, 10);
+  f_101_010_100_010_0(uniques, 10);
+  f_101_010_100_010_1(uniques, 10);
+  f_101_010_100_011_0(uniques, 10);
+  f_101_010_100_011_1(uniques, 10);
+  f_101_010_100_110_0(uniques, 10);
+  f_101_010_100_110_1(uniques, 10);
+  f_101_010_100_111_0(uniques, 10);
+  f_101_010_100_111_1(uniques, 10);
+  f_101_010_101_010_0(uniques, 10);
+  f_101_010_101_010_1(uniques, 10);
+  f_101_010_101_011_0(uniques, 10);
+  f_101_010_101_011_1(uniques, 10);
+  f_101_010_101_110_0(uniques, 10);
+  f_101_010_101_110_1(uniques, 10);
+  f_101_010_101_111_0(uniques, 10);
+  f_101_010_101_111_1(uniques, 10);
+  f_101_010_110_010_0(uniques, 10);
+  f_101_010_110_010_1(uniques, 10);
+  f_101_010_110_011_0(uniques, 10);
+  f_101_010_110_011_1(uniques, 10);
+  f_101_010_110_110_0(uniques, 10);
+  f_101_010_110_110_1(uniques, 10);
+  f_101_010_110_111_0(uniques, 10);
+  f_101_010_110_111_1(uniques, 10);
+  f_101_010_111_010_0(uniques, 10);
+  f_101_010_111_010_1(uniques, 10);
+  f_101_010_111_011_0(uniques, 10);
+  f_101_010_111_011_1(uniques, 10);
+  f_101_010_111_110_0(uniques, 10);
+  f_101_010_111_110_1(uniques, 10);
+  f_101_010_111_111_0(uniques, 10);
+  f_101_010_111_111_1(uniques, 10);
+  f_101_011_000_010_0(uniques, 10);
+  f_101_011_000_010_1(uniques, 10);
+  f_101_011_000_011_0(uniques, 10);
+  f_101_011_000_011_1(uniques, 10);
+  f_101_011_000_110_0(uniques, 10);
+  f_101_011_000_110_1(uniques, 10);
+  f_101_011_000_111_0(uniques, 10);
+  f_101_011_000_111_1(uniques, 10);
+  f_101_011_001_010_0(uniques, 10);
+  f_101_011_001_010_1(uniques, 10);
+  f_101_011_001_011_0(uniques, 10);
+  f_101_011_001_011_1(uniques, 10);
+  f_101_011_001_110_0(uniques, 10);
+  f_101_011_001_110_1(uniques, 10);
+  f_101_011_001_111_0(uniques, 10);
+  f_101_011_001_111_1(uniques, 10);
+  f_101_011_010_010_0(uniques, 10);
+  f_101_011_010_010_1(uniques, 10);
+  f_101_011_010_011_0(uniques, 10);
+  f_101_011_010_011_1(uniques, 10);
+  f_101_011_010_110_0(uniques, 10);
+  f_101_011_010_110_1(uniques, 10);
+  f_101_011_010_111_0(uniques, 10);
+  f_101_011_010_111_1(uniques, 10);
+  f_101_011_011_010_0(uniques, 10);
+  f_101_011_011_010_1(uniques, 10);
+  f_101_011_011_011_0(uniques, 10);
+  f_101_011_011_011_1(uniques, 10);
+  f_101_011_011_110_0(uniques, 10);
+  f_101_011_011_110_1(uniques, 10);
+  f_101_011_011_111_0(uniques, 10);
+  f_101_011_011_111_1(uniques, 10);
+  f_101_011_100_010_0(uniques, 10);
+  f_101_011_100_010_1(uniques, 10);
+  f_101_011_100_011_0(uniques, 10);
+  f_101_011_100_011_1(uniques, 10);
+  f_101_011_100_110_0(uniques, 10);
+  f_101_011_100_110_1(uniques, 10);
+  f_101_011_100_111_0(uniques, 10);
+  f_101_011_100_111_1(uniques, 10);
+  f_101_011_101_010_0(uniques, 10);
+  f_101_011_101_010_1(uniques, 10);
+  f_101_011_101_011_0(uniques, 10);
+  f_101_011_101_011_1(uniques, 10);
+  f_101_011_101_110_0(uniques, 10);
+  f_101_011_101_110_1(uniques, 10);
+  f_101_011_101_111_0(uniques, 10);
+  f_101_011_101_111_1(uniques, 10);
+  f_101_011_110_010_0(uniques, 10);
+  f_101_011_110_010_1(uniques, 10);
+  f_101_011_110_011_0(uniques, 10);
+  f_101_011_110_011_1(uniques, 10);
+  f_101_011_110_110_0(uniques, 10);
+  f_101_011_110_110_1(uniques, 10);
+  f_101_011_110_111_0(uniques, 10);
+  f_101_011_110_111_1(uniques, 10);
+  f_101_011_111_010_0(uniques, 10);
+  f_101_011_111_010_1(uniques, 10);
+  f_101_011_111_011_0(uniques, 10);
+  f_101_011_111_011_1(uniques, 10);
+  f_101_011_111_110_0(uniques, 10);
+  f_101_011_111_110_1(uniques, 10);
+  f_101_011_111_111_0(uniques, 10);
+  f_101_011_111_111_1(uniques, 10);
+  f_101_100_000_010_0(uniques, 10);
+  f_101_100_000_010_1(uniques, 10);
+  f_101_100_000_011_0(uniques, 10);
+  f_101_100_000_011_1(uniques, 10);
+  f_101_100_000_110_0(uniques, 10);
+  f_101_100_000_110_1(uniques, 10);
+  f_101_100_000_111_0(uniques, 10);
+  f_101_100_000_111_1(uniques, 10);
+  f_101_100_001_010_0(uniques, 10);
+  f_101_100_001_010_1(uniques, 10);
+  f_101_100_001_011_0(uniques, 10);
+  f_101_100_001_011_1(uniques, 10);
+  f_101_100_001_110_0(uniques, 10);
+  f_101_100_001_110_1(uniques, 10);
+  f_101_100_001_111_0(uniques, 10);
+  f_101_100_001_111_1(uniques, 10);
+  f_101_100_010_010_0(uniques, 10);
+  f_101_100_010_010_1(uniques, 10);
+  f_101_100_010_011_0(uniques, 10);
+  f_101_100_010_011_1(uniques, 10);
+  f_101_100_010_110_0(uniques, 10);
+  f_101_100_010_110_1(uniques, 10);
+  f_101_100_010_111_0(uniques, 10);
+  f_101_100_010_111_1(uniques, 10);
+  f_101_100_011_010_0(uniques, 10);
+  f_101_100_011_010_1(uniques, 10);
+  f_101_100_011_011_0(uniques, 10);
+  f_101_100_011_011_1(uniques, 10);
+  f_101_100_011_110_0(uniques, 10);
+  f_101_100_011_110_1(uniques, 10);
+  f_101_100_011_111_0(uniques, 10);
+  f_101_100_011_111_1(uniques, 10);
+  f_101_100_100_010_0(uniques, 10);
+  f_101_100_100_010_1(uniques, 10);
+  f_101_100_100_011_0(uniques, 10);
+  f_101_100_100_011_1(uniques, 10);
+  f_101_100_100_110_0(uniques, 10);
+  f_101_100_100_110_1(uniques, 10);
+  f_101_100_100_111_0(uniques, 10);
+  f_101_100_100_111_1(uniques, 10);
+  f_101_100_101_010_0(uniques, 10);
+  f_101_100_101_010_1(uniques, 10);
+  f_101_100_101_011_0(uniques, 10);
+  f_101_100_101_011_1(uniques, 10);
+  f_101_100_101_110_0(uniques, 10);
+  f_101_100_101_110_1(uniques, 10);
+  f_101_100_101_111_0(uniques, 10);
+  f_101_100_101_111_1(uniques, 10);
+  f_101_100_110_010_0(uniques, 10);
+  f_101_100_110_010_1(uniques, 10);
+  f_101_100_110_011_0(uniques, 10);
+  f_101_100_110_011_1(uniques, 10);
+  f_101_100_110_110_0(uniques, 10);
+  f_101_100_110_110_1(uniques, 10);
+  f_101_100_110_111_0(uniques, 10);
+  f_101_100_110_111_1(uniques, 10);
+  f_101_100_111_010_0(uniques, 10);
+  f_101_100_111_010_1(uniques, 10);
+  f_101_100_111_011_0(uniques, 10);
+  f_101_100_111_011_1(uniques, 10);
+  f_101_100_111_110_0(uniques, 10);
+  f_101_100_111_110_1(uniques, 10);
+  f_101_100_111_111_0(uniques, 10);
+  f_101_100_111_111_1(uniques, 10);
+  f_101_101_000_010_0(uniques, 10);
+  f_101_101_000_010_1(uniques, 10);
+  f_101_101_000_011_0(uniques, 10);
+  f_101_101_000_011_1(uniques, 10);
+  f_101_101_000_110_0(uniques, 10);
+  f_101_101_000_110_1(uniques, 10);
+  f_101_101_000_111_0(uniques, 10);
+  f_101_101_000_111_1(uniques, 10);
+  f_101_101_001_010_0(uniques, 10);
+  f_101_101_001_010_1(uniques, 10);
+  f_101_101_001_011_0(uniques, 10);
+  f_101_101_001_011_1(uniques, 10);
+  f_101_101_001_110_0(uniques, 10);
+  f_101_101_001_110_1(uniques, 10);
+  f_101_101_001_111_0(uniques, 10);
+  f_101_101_001_111_1(uniques, 10);
+  f_101_101_010_010_0(uniques, 10);
+  f_101_101_010_010_1(uniques, 10);
+  f_101_101_010_011_0(uniques, 10);
+  f_101_101_010_011_1(uniques, 10);
+  f_101_101_010_110_0(uniques, 10);
+  f_101_101_010_110_1(uniques, 10);
+  f_101_101_010_111_0(uniques, 10);
+  f_101_101_010_111_1(uniques, 10);
+  f_101_101_011_010_0(uniques, 10);
+  f_101_101_011_010_1(uniques, 10);
+  f_101_101_011_011_0(uniques, 10);
+  f_101_101_011_011_1(uniques, 10);
+  f_101_101_011_110_0(uniques, 10);
+  f_101_101_011_110_1(uniques, 10);
+  f_101_101_011_111_0(uniques, 10);
+  f_101_101_011_111_1(uniques, 10);
+  f_101_101_100_010_0(uniques, 10);
+  f_101_101_100_010_1(uniques, 10);
+  f_101_101_100_011_0(uniques, 10);
+  f_101_101_100_011_1(uniques, 10);
+  f_101_101_100_110_0(uniques, 10);
+  f_101_101_100_110_1(uniques, 10);
+  f_101_101_100_111_0(uniques, 10);
+  f_101_101_100_111_1(uniques, 10);
+  f_101_101_101_010_0(uniques, 10);
+  f_101_101_101_010_1(uniques, 10);
+  f_101_101_101_011_0(uniques, 10);
+  f_101_101_101_011_1(uniques, 10);
+  f_101_101_101_110_0(uniques, 10);
+  f_101_101_101_110_1(uniques, 10);
+  f_101_101_101_111_0(uniques, 10);
+  f_101_101_101_111_1(uniques, 10);
+  f_101_101_110_010_0(uniques, 10);
+  f_101_101_110_010_1(uniques, 10);
+  f_101_101_110_011_0(uniques, 10);
+  f_101_101_110_011_1(uniques, 10);
+  f_101_101_110_110_0(uniques, 10);
+  f_101_101_110_110_1(uniques, 10);
+  f_101_101_110_111_0(uniques, 10);
+  f_101_101_110_111_1(uniques, 10);
+  f_101_101_111_010_0(uniques, 10);
+  f_101_101_111_010_1(uniques, 10);
+  f_101_101_111_011_0(uniques, 10);
+  f_101_101_111_011_1(uniques, 10);
+  f_101_101_111_110_0(uniques, 10);
+  f_101_101_111_110_1(uniques, 10);
+  f_101_101_111_111_0(uniques, 10);
+  f_101_101_111_111_1(uniques, 10);
+  f_101_110_000_010_0(uniques, 10);
+  f_101_110_000_010_1(uniques, 10);
+  f_101_110_000_011_0(uniques, 10);
+  f_101_110_000_011_1(uniques, 10);
+  f_101_110_000_110_0(uniques, 10);
+  f_101_110_000_110_1(uniques, 10);
+  f_101_110_000_111_0(uniques, 10);
+  f_101_110_000_111_1(uniques, 10);
+  f_101_110_001_010_0(uniques, 10);
+  f_101_110_001_010_1(uniques, 10);
+  f_101_110_001_011_0(uniques, 10);
+  f_101_110_001_011_1(uniques, 10);
+  f_101_110_001_110_0(uniques, 10);
+  f_101_110_001_110_1(uniques, 10);
+  f_101_110_001_111_0(uniques, 10);
+  f_101_110_001_111_1(uniques, 10);
+  f_101_110_010_010_0(uniques, 10);
+  f_101_110_010_010_1(uniques, 10);
+  f_101_110_010_011_0(uniques, 10);
+  f_101_110_010_011_1(uniques, 10);
+  f_101_110_010_110_0(uniques, 10);
+  f_101_110_010_110_1(uniques, 10);
+  f_101_110_010_111_0(uniques, 10);
+  f_101_110_010_111_1(uniques, 10);
+  f_101_110_011_010_0(uniques, 10);
+  f_101_110_011_010_1(uniques, 10);
+  f_101_110_011_011_0(uniques, 10);
+  f_101_110_011_011_1(uniques, 10);
+  f_101_110_011_110_0(uniques, 10);
+  f_101_110_011_110_1(uniques, 10);
+  f_101_110_011_111_0(uniques, 10);
+  f_101_110_011_111_1(uniques, 10);
+  f_101_110_100_010_0(uniques, 10);
+  f_101_110_100_010_1(uniques, 10);
+  f_101_110_100_011_0(uniques, 10);
+  f_101_110_100_011_1(uniques, 10);
+  f_101_110_100_110_0(uniques, 10);
+  f_101_110_100_110_1(uniques, 10);
+  f_101_110_100_111_0(uniques, 10);
+  f_101_110_100_111_1(uniques, 10);
+  f_101_110_101_010_0(uniques, 10);
+  f_101_110_101_010_1(uniques, 10);
+  f_101_110_101_011_0(uniques, 10);
+  f_101_110_101_011_1(uniques, 10);
+  f_101_110_101_110_0(uniques, 10);
+  f_101_110_101_110_1(uniques, 10);
+  f_101_110_101_111_0(uniques, 10);
+  f_101_110_101_111_1(uniques, 10);
+  f_101_110_110_010_0(uniques, 10);
+  f_101_110_110_010_1(uniques, 10);
+  f_101_110_110_011_0(uniques, 10);
+  f_101_110_110_011_1(uniques, 10);
+  f_101_110_110_110_0(uniques, 10);
+  f_101_110_110_110_1(uniques, 10);
+  f_101_110_110_111_0(uniques, 10);
+  f_101_110_110_111_1(uniques, 10);
+  f_101_110_111_010_0(uniques, 10);
+  f_101_110_111_010_1(uniques, 10);
+  f_101_110_111_011_0(uniques, 10);
+  f_101_110_111_011_1(uniques, 10);
+  f_101_110_111_110_0(uniques, 10);
+  f_101_110_111_110_1(uniques, 10);
+  f_101_110_111_111_0(uniques, 10);
+  f_101_110_111_111_1(uniques, 10);
+  f_101_111_000_010_0(uniques, 10);
+  f_101_111_000_010_1(uniques, 10);
+  f_101_111_000_011_0(uniques, 10);
+  f_101_111_000_011_1(uniques, 10);
+  f_101_111_000_110_0(uniques, 10);
+  f_101_111_000_110_1(uniques, 10);
+  f_101_111_000_111_0(uniques, 10);
+  f_101_111_000_111_1(uniques, 10);
+  f_101_111_001_010_0(uniques, 10);
+  f_101_111_001_010_1(uniques, 10);
+  f_101_111_001_011_0(uniques, 10);
+  f_101_111_001_011_1(uniques, 10);
+  f_101_111_001_110_0(uniques, 10);
+  f_101_111_001_110_1(uniques, 10);
+  f_101_111_001_111_0(uniques, 10);
+  f_101_111_001_111_1(uniques, 10);
+  f_101_111_010_010_0(uniques, 10);
+  f_101_111_010_010_1(uniques, 10);
+  f_101_111_010_011_0(uniques, 10);
+  f_101_111_010_011_1(uniques, 10);
+  f_101_111_010_110_0(uniques, 10);
+  f_101_111_010_110_1(uniques, 10);
+  f_101_111_010_111_0(uniques, 10);
+  f_101_111_010_111_1(uniques, 10);
+  f_101_111_011_010_0(uniques, 10);
+  f_101_111_011_010_1(uniques, 10);
+  f_101_111_011_011_0(uniques, 10);
+  f_101_111_011_011_1(uniques, 10);
+  f_101_111_011_110_0(uniques, 10);
+  f_101_111_011_110_1(uniques, 10);
+  f_101_111_011_111_0(uniques, 10);
+  f_101_111_011_111_1(uniques, 10);
+  f_101_111_100_010_0(uniques, 10);
+  f_101_111_100_010_1(uniques, 10);
+  f_101_111_100_011_0(uniques, 10);
+  f_101_111_100_011_1(uniques, 10);
+  f_101_111_100_110_0(uniques, 10);
+  f_101_111_100_110_1(uniques, 10);
+  f_101_111_100_111_0(uniques, 10);
+  f_101_111_100_111_1(uniques, 10);
+  f_101_111_101_010_0(uniques, 10);
+  f_101_111_101_010_1(uniques, 10);
+  f_101_111_101_011_0(uniques, 10);
+  f_101_111_101_011_1(uniques, 10);
+  f_101_111_101_110_0(uniques, 10);
+  f_101_111_101_110_1(uniques, 10);
+  f_101_111_101_111_0(uniques, 10);
+  f_101_111_101_111_1(uniques, 10);
+  f_101_111_110_010_0(uniques, 10);
+  f_101_111_110_010_1(uniques, 10);
+  f_101_111_110_011_0(uniques, 10);
+  f_101_111_110_011_1(uniques, 10);
+  f_101_111_110_110_0(uniques, 10);
+  f_101_111_110_110_1(uniques, 10);
+  f_101_111_110_111_0(uniques, 10);
+  f_101_111_110_111_1(uniques, 10);
+  f_101_111_111_010_0(uniques, 10);
+  f_101_111_111_010_1(uniques, 10);
+  f_101_111_111_011_0(uniques, 10);
+  f_101_111_111_011_1(uniques, 10);
+  f_101_111_111_110_0(uniques, 10);
+  f_101_111_111_110_1(uniques, 10);
+  f_101_111_111_111_0(uniques, 10);
+  f_101_111_111_111_1(uniques, 10);
+  f_110_000_000_010_0(uniques, 10);
+  f_110_000_000_010_1(uniques, 10);
+  f_110_000_000_011_0(uniques, 10);
+  f_110_000_000_011_1(uniques, 10);
+  f_110_000_000_110_0(uniques, 10);
+  f_110_000_000_110_1(uniques, 10);
+  f_110_000_000_111_0(uniques, 10);
+  f_110_000_000_111_1(uniques, 10);
+  f_110_000_001_010_0(uniques, 10);
+  f_110_000_001_010_1(uniques, 10);
+  f_110_000_001_011_0(uniques, 10);
+  f_110_000_001_011_1(uniques, 10);
+  f_110_000_001_110_0(uniques, 10);
+  f_110_000_001_110_1(uniques, 10);
+  f_110_000_001_111_0(uniques, 10);
+  f_110_000_001_111_1(uniques, 10);
+  f_110_000_010_010_0(uniques, 10);
+  f_110_000_010_010_1(uniques, 10);
+  f_110_000_010_011_0(uniques, 10);
+  f_110_000_010_011_1(uniques, 10);
+  f_110_000_010_110_0(uniques, 10);
+  f_110_000_010_110_1(uniques, 10);
+  f_110_000_010_111_0(uniques, 10);
+  f_110_000_010_111_1(uniques, 10);
+  f_110_000_011_010_0(uniques, 10);
+  f_110_000_011_010_1(uniques, 10);
+  f_110_000_011_011_0(uniques, 10);
+  f_110_000_011_011_1(uniques, 10);
+  f_110_000_011_110_0(uniques, 10);
+  f_110_000_011_110_1(uniques, 10);
+  f_110_000_011_111_0(uniques, 10);
+  f_110_000_011_111_1(uniques, 10);
+  f_110_000_100_010_0(uniques, 10);
+  f_110_000_100_010_1(uniques, 10);
+  f_110_000_100_011_0(uniques, 10);
+  f_110_000_100_011_1(uniques, 10);
+  f_110_000_100_110_0(uniques, 10);
+  f_110_000_100_110_1(uniques, 10);
+  f_110_000_100_111_0(uniques, 10);
+  f_110_000_100_111_1(uniques, 10);
+  f_110_000_101_010_0(uniques, 10);
+  f_110_000_101_010_1(uniques, 10);
+  f_110_000_101_011_0(uniques, 10);
+  f_110_000_101_011_1(uniques, 10);
+  f_110_000_101_110_0(uniques, 10);
+  f_110_000_101_110_1(uniques, 10);
+  f_110_000_101_111_0(uniques, 10);
+  f_110_000_101_111_1(uniques, 10);
+  f_110_000_110_010_0(uniques, 10);
+  f_110_000_110_010_1(uniques, 10);
+  f_110_000_110_011_0(uniques, 10);
+  f_110_000_110_011_1(uniques, 10);
+  f_110_000_110_110_0(uniques, 10);
+  f_110_000_110_110_1(uniques, 10);
+  f_110_000_110_111_0(uniques, 10);
+  f_110_000_110_111_1(uniques, 10);
+  f_110_000_111_010_0(uniques, 10);
+  f_110_000_111_010_1(uniques, 10);
+  f_110_000_111_011_0(uniques, 10);
+  f_110_000_111_011_1(uniques, 10);
+  f_110_000_111_110_0(uniques, 10);
+  f_110_000_111_110_1(uniques, 10);
+  f_110_000_111_111_0(uniques, 10);
+  f_110_000_111_111_1(uniques, 10);
+  f_110_001_000_010_0(uniques, 10);
+  f_110_001_000_010_1(uniques, 10);
+  f_110_001_000_011_0(uniques, 10);
+  f_110_001_000_011_1(uniques, 10);
+  f_110_001_000_110_0(uniques, 10);
+  f_110_001_000_110_1(uniques, 10);
+  f_110_001_000_111_0(uniques, 10);
+  f_110_001_000_111_1(uniques, 10);
+  f_110_001_001_010_0(uniques, 10);
+  f_110_001_001_010_1(uniques, 10);
+  f_110_001_001_011_0(uniques, 10);
+  f_110_001_001_011_1(uniques, 10);
+  f_110_001_001_110_0(uniques, 10);
+  f_110_001_001_110_1(uniques, 10);
+  f_110_001_001_111_0(uniques, 10);
+  f_110_001_001_111_1(uniques, 10);
+  f_110_001_010_010_0(uniques, 10);
+  f_110_001_010_010_1(uniques, 10);
+  f_110_001_010_011_0(uniques, 10);
+  f_110_001_010_011_1(uniques, 10);
+  f_110_001_010_110_0(uniques, 10);
+  f_110_001_010_110_1(uniques, 10);
+  f_110_001_010_111_0(uniques, 10);
+  f_110_001_010_111_1(uniques, 10);
+  f_110_001_011_010_0(uniques, 10);
+  f_110_001_011_010_1(uniques, 10);
+  f_110_001_011_011_0(uniques, 10);
+  f_110_001_011_011_1(uniques, 10);
+  f_110_001_011_110_0(uniques, 10);
+  f_110_001_011_110_1(uniques, 10);
+  f_110_001_011_111_0(uniques, 10);
+  f_110_001_011_111_1(uniques, 10);
+  f_110_001_100_010_0(uniques, 10);
+  f_110_001_100_010_1(uniques, 10);
+  f_110_001_100_011_0(uniques, 10);
+  f_110_001_100_011_1(uniques, 10);
+  f_110_001_100_110_0(uniques, 10);
+  f_110_001_100_110_1(uniques, 10);
+  f_110_001_100_111_0(uniques, 10);
+  f_110_001_100_111_1(uniques, 10);
+  f_110_001_101_010_0(uniques, 10);
+  f_110_001_101_010_1(uniques, 10);
+  f_110_001_101_011_0(uniques, 10);
+  f_110_001_101_011_1(uniques, 10);
+  f_110_001_101_110_0(uniques, 10);
+  f_110_001_101_110_1(uniques, 10);
+  f_110_001_101_111_0(uniques, 10);
+  f_110_001_101_111_1(uniques, 10);
+  f_110_001_110_010_0(uniques, 10);
+  f_110_001_110_010_1(uniques, 10);
+  f_110_001_110_011_0(uniques, 10);
+  f_110_001_110_011_1(uniques, 10);
+  f_110_001_110_110_0(uniques, 10);
+  f_110_001_110_110_1(uniques, 10);
+  f_110_001_110_111_0(uniques, 10);
+  f_110_001_110_111_1(uniques, 10);
+  f_110_001_111_010_0(uniques, 10);
+  f_110_001_111_010_1(uniques, 10);
+  f_110_001_111_011_0(uniques, 10);
+  f_110_001_111_011_1(uniques, 10);
+  f_110_001_111_110_0(uniques, 10);
+  f_110_001_111_110_1(uniques, 10);
+  f_110_001_111_111_0(uniques, 10);
+  f_110_001_111_111_1(uniques, 10);
+  f_110_010_000_010_0(uniques, 10);
+  f_110_010_000_010_1(uniques, 10);
+  f_110_010_000_011_0(uniques, 10);
+  f_110_010_000_011_1(uniques, 10);
+  f_110_010_000_110_0(uniques, 10);
+  f_110_010_000_110_1(uniques, 10);
+  f_110_010_000_111_0(uniques, 10);
+  f_110_010_000_111_1(uniques, 10);
+  f_110_010_001_010_0(uniques, 10);
+  f_110_010_001_010_1(uniques, 10);
+  f_110_010_001_011_0(uniques, 10);
+  f_110_010_001_011_1(uniques, 10);
+  f_110_010_001_110_0(uniques, 10);
+  f_110_010_001_110_1(uniques, 10);
+  f_110_010_001_111_0(uniques, 10);
+  f_110_010_001_111_1(uniques, 10);
+  f_110_010_010_010_0(uniques, 10);
+  f_110_010_010_010_1(uniques, 10);
+  f_110_010_010_011_0(uniques, 10);
+  f_110_010_010_011_1(uniques, 10);
+  f_110_010_010_110_0(uniques, 10);
+  f_110_010_010_110_1(uniques, 10);
+  f_110_010_010_111_0(uniques, 10);
+  f_110_010_010_111_1(uniques, 10);
+  f_110_010_011_010_0(uniques, 10);
+  f_110_010_011_010_1(uniques, 10);
+  f_110_010_011_011_0(uniques, 10);
+  f_110_010_011_011_1(uniques, 10);
+  f_110_010_011_110_0(uniques, 10);
+  f_110_010_011_110_1(uniques, 10);
+  f_110_010_011_111_0(uniques, 10);
+  f_110_010_011_111_1(uniques, 10);
+  f_110_010_100_010_0(uniques, 10);
+  f_110_010_100_010_1(uniques, 10);
+  f_110_010_100_011_0(uniques, 10);
+  f_110_010_100_011_1(uniques, 10);
+  f_110_010_100_110_0(uniques, 10);
+  f_110_010_100_110_1(uniques, 10);
+  f_110_010_100_111_0(uniques, 10);
+  f_110_010_100_111_1(uniques, 10);
+  f_110_010_101_010_0(uniques, 10);
+  f_110_010_101_010_1(uniques, 10);
+  f_110_010_101_011_0(uniques, 10);
+  f_110_010_101_011_1(uniques, 10);
+  f_110_010_101_110_0(uniques, 10);
+  f_110_010_101_110_1(uniques, 10);
+  f_110_010_101_111_0(uniques, 10);
+  f_110_010_101_111_1(uniques, 10);
+  f_110_010_110_010_0(uniques, 10);
+  f_110_010_110_010_1(uniques, 10);
+  f_110_010_110_011_0(uniques, 10);
+  f_110_010_110_011_1(uniques, 10);
+  f_110_010_110_110_0(uniques, 10);
+  f_110_010_110_110_1(uniques, 10);
+  f_110_010_110_111_0(uniques, 10);
+  f_110_010_110_111_1(uniques, 10);
+  f_110_010_111_010_0(uniques, 10);
+  f_110_010_111_010_1(uniques, 10);
+  f_110_010_111_011_0(uniques, 10);
+  f_110_010_111_011_1(uniques, 10);
+  f_110_010_111_110_0(uniques, 10);
+  f_110_010_111_110_1(uniques, 10);
+  f_110_010_111_111_0(uniques, 10);
+  f_110_010_111_111_1(uniques, 10);
+  f_110_011_000_010_0(uniques, 10);
+  f_110_011_000_010_1(uniques, 10);
+  f_110_011_000_011_0(uniques, 10);
+  f_110_011_000_011_1(uniques, 10);
+  f_110_011_000_110_0(uniques, 10);
+  f_110_011_000_110_1(uniques, 10);
+  f_110_011_000_111_0(uniques, 10);
+  f_110_011_000_111_1(uniques, 10);
+  f_110_011_001_010_0(uniques, 10);
+  f_110_011_001_010_1(uniques, 10);
+  f_110_011_001_011_0(uniques, 10);
+  f_110_011_001_011_1(uniques, 10);
+  f_110_011_001_110_0(uniques, 10);
+  f_110_011_001_110_1(uniques, 10);
+  f_110_011_001_111_0(uniques, 10);
+  f_110_011_001_111_1(uniques, 10);
+  f_110_011_010_010_0(uniques, 10);
+  f_110_011_010_010_1(uniques, 10);
+  f_110_011_010_011_0(uniques, 10);
+  f_110_011_010_011_1(uniques, 10);
+  f_110_011_010_110_0(uniques, 10);
+  f_110_011_010_110_1(uniques, 10);
+  f_110_011_010_111_0(uniques, 10);
+  f_110_011_010_111_1(uniques, 10);
+  f_110_011_011_010_0(uniques, 10);
+  f_110_011_011_010_1(uniques, 10);
+  f_110_011_011_011_0(uniques, 10);
+  f_110_011_011_011_1(uniques, 10);
+  f_110_011_011_110_0(uniques, 10);
+  f_110_011_011_110_1(uniques, 10);
+  f_110_011_011_111_0(uniques, 10);
+  f_110_011_011_111_1(uniques, 10);
+  f_110_011_100_010_0(uniques, 10);
+  f_110_011_100_010_1(uniques, 10);
+  f_110_011_100_011_0(uniques, 10);
+  f_110_011_100_011_1(uniques, 10);
+  f_110_011_100_110_0(uniques, 10);
+  f_110_011_100_110_1(uniques, 10);
+  f_110_011_100_111_0(uniques, 10);
+  f_110_011_100_111_1(uniques, 10);
+  f_110_011_101_010_0(uniques, 10);
+  f_110_011_101_010_1(uniques, 10);
+  f_110_011_101_011_0(uniques, 10);
+  f_110_011_101_011_1(uniques, 10);
+  f_110_011_101_110_0(uniques, 10);
+  f_110_011_101_110_1(uniques, 10);
+  f_110_011_101_111_0(uniques, 10);
+  f_110_011_101_111_1(uniques, 10);
+  f_110_011_110_010_0(uniques, 10);
+  f_110_011_110_010_1(uniques, 10);
+  f_110_011_110_011_0(uniques, 10);
+  f_110_011_110_011_1(uniques, 10);
+  f_110_011_110_110_0(uniques, 10);
+  f_110_011_110_110_1(uniques, 10);
+  f_110_011_110_111_0(uniques, 10);
+  f_110_011_110_111_1(uniques, 10);
+  f_110_011_111_010_0(uniques, 10);
+  f_110_011_111_010_1(uniques, 10);
+  f_110_011_111_011_0(uniques, 10);
+  f_110_011_111_011_1(uniques, 10);
+  f_110_011_111_110_0(uniques, 10);
+  f_110_011_111_110_1(uniques, 10);
+  f_110_011_111_111_0(uniques, 10);
+  f_110_011_111_111_1(uniques, 10);
+  f_110_100_000_010_0(uniques, 10);
+  f_110_100_000_010_1(uniques, 10);
+  f_110_100_000_011_0(uniques, 10);
+  f_110_100_000_011_1(uniques, 10);
+  f_110_100_000_110_0(uniques, 10);
+  f_110_100_000_110_1(uniques, 10);
+  f_110_100_000_111_0(uniques, 10);
+  f_110_100_000_111_1(uniques, 10);
+  f_110_100_001_010_0(uniques, 10);
+  f_110_100_001_010_1(uniques, 10);
+  f_110_100_001_011_0(uniques, 10);
+  f_110_100_001_011_1(uniques, 10);
+  f_110_100_001_110_0(uniques, 10);
+  f_110_100_001_110_1(uniques, 10);
+  f_110_100_001_111_0(uniques, 10);
+  f_110_100_001_111_1(uniques, 10);
+  f_110_100_010_010_0(uniques, 10);
+  f_110_100_010_010_1(uniques, 10);
+  f_110_100_010_011_0(uniques, 10);
+  f_110_100_010_011_1(uniques, 10);
+  f_110_100_010_110_0(uniques, 10);
+  f_110_100_010_110_1(uniques, 10);
+  f_110_100_010_111_0(uniques, 10);
+  f_110_100_010_111_1(uniques, 10);
+  f_110_100_011_010_0(uniques, 10);
+  f_110_100_011_010_1(uniques, 10);
+  f_110_100_011_011_0(uniques, 10);
+  f_110_100_011_011_1(uniques, 10);
+  f_110_100_011_110_0(uniques, 10);
+  f_110_100_011_110_1(uniques, 10);
+  f_110_100_011_111_0(uniques, 10);
+  f_110_100_011_111_1(uniques, 10);
+  f_110_100_100_010_0(uniques, 10);
+  f_110_100_100_010_1(uniques, 10);
+  f_110_100_100_011_0(uniques, 10);
+  f_110_100_100_011_1(uniques, 10);
+  f_110_100_100_110_0(uniques, 10);
+  f_110_100_100_110_1(uniques, 10);
+  f_110_100_100_111_0(uniques, 10);
+  f_110_100_100_111_1(uniques, 10);
+  f_110_100_101_010_0(uniques, 10);
+  f_110_100_101_010_1(uniques, 10);
+  f_110_100_101_011_0(uniques, 10);
+  f_110_100_101_011_1(uniques, 10);
+  f_110_100_101_110_0(uniques, 10);
+  f_110_100_101_110_1(uniques, 10);
+  f_110_100_101_111_0(uniques, 10);
+  f_110_100_101_111_1(uniques, 10);
+  f_110_100_110_010_0(uniques, 10);
+  f_110_100_110_010_1(uniques, 10);
+  f_110_100_110_011_0(uniques, 10);
+  f_110_100_110_011_1(uniques, 10);
+  f_110_100_110_110_0(uniques, 10);
+  f_110_100_110_110_1(uniques, 10);
+  f_110_100_110_111_0(uniques, 10);
+  f_110_100_110_111_1(uniques, 10);
+  f_110_100_111_010_0(uniques, 10);
+  f_110_100_111_010_1(uniques, 10);
+  f_110_100_111_011_0(uniques, 10);
+  f_110_100_111_011_1(uniques, 10);
+  f_110_100_111_110_0(uniques, 10);
+  f_110_100_111_110_1(uniques, 10);
+  f_110_100_111_111_0(uniques, 10);
+  f_110_100_111_111_1(uniques, 10);
+  f_110_101_000_010_0(uniques, 10);
+  f_110_101_000_010_1(uniques, 10);
+  f_110_101_000_011_0(uniques, 10);
+  f_110_101_000_011_1(uniques, 10);
+  f_110_101_000_110_0(uniques, 10);
+  f_110_101_000_110_1(uniques, 10);
+  f_110_101_000_111_0(uniques, 10);
+  f_110_101_000_111_1(uniques, 10);
+  f_110_101_001_010_0(uniques, 10);
+  f_110_101_001_010_1(uniques, 10);
+  f_110_101_001_011_0(uniques, 10);
+  f_110_101_001_011_1(uniques, 10);
+  f_110_101_001_110_0(uniques, 10);
+  f_110_101_001_110_1(uniques, 10);
+  f_110_101_001_111_0(uniques, 10);
+  f_110_101_001_111_1(uniques, 10);
+  f_110_101_010_010_0(uniques, 10);
+  f_110_101_010_010_1(uniques, 10);
+  f_110_101_010_011_0(uniques, 10);
+  f_110_101_010_011_1(uniques, 10);
+  f_110_101_010_110_0(uniques, 10);
+  f_110_101_010_110_1(uniques, 10);
+  f_110_101_010_111_0(uniques, 10);
+  f_110_101_010_111_1(uniques, 10);
+  f_110_101_011_010_0(uniques, 10);
+  f_110_101_011_010_1(uniques, 10);
+  f_110_101_011_011_0(uniques, 10);
+  f_110_101_011_011_1(uniques, 10);
+  f_110_101_011_110_0(uniques, 10);
+  f_110_101_011_110_1(uniques, 10);
+  f_110_101_011_111_0(uniques, 10);
+  f_110_101_011_111_1(uniques, 10);
+  f_110_101_100_010_0(uniques, 10);
+  f_110_101_100_010_1(uniques, 10);
+  f_110_101_100_011_0(uniques, 10);
+  f_110_101_100_011_1(uniques, 10);
+  f_110_101_100_110_0(uniques, 10);
+  f_110_101_100_110_1(uniques, 10);
+  f_110_101_100_111_0(uniques, 10);
+  f_110_101_100_111_1(uniques, 10);
+  f_110_101_101_010_0(uniques, 10);
+  f_110_101_101_010_1(uniques, 10);
+  f_110_101_101_011_0(uniques, 10);
+  f_110_101_101_011_1(uniques, 10);
+  f_110_101_101_110_0(uniques, 10);
+  f_110_101_101_110_1(uniques, 10);
+  f_110_101_101_111_0(uniques, 10);
+  f_110_101_101_111_1(uniques, 10);
+  f_110_101_110_010_0(uniques, 10);
+  f_110_101_110_010_1(uniques, 10);
+  f_110_101_110_011_0(uniques, 10);
+  f_110_101_110_011_1(uniques, 10);
+  f_110_101_110_110_0(uniques, 10);
+  f_110_101_110_110_1(uniques, 10);
+  f_110_101_110_111_0(uniques, 10);
+  f_110_101_110_111_1(uniques, 10);
+  f_110_101_111_010_0(uniques, 10);
+  f_110_101_111_010_1(uniques, 10);
+  f_110_101_111_011_0(uniques, 10);
+  f_110_101_111_011_1(uniques, 10);
+  f_110_101_111_110_0(uniques, 10);
+  f_110_101_111_110_1(uniques, 10);
+  f_110_101_111_111_0(uniques, 10);
+  f_110_101_111_111_1(uniques, 10);
+  f_110_110_000_010_0(uniques, 10);
+  f_110_110_000_010_1(uniques, 10);
+  f_110_110_000_011_0(uniques, 10);
+  f_110_110_000_011_1(uniques, 10);
+  f_110_110_000_110_0(uniques, 10);
+  f_110_110_000_110_1(uniques, 10);
+  f_110_110_000_111_0(uniques, 10);
+  f_110_110_000_111_1(uniques, 10);
+  f_110_110_001_010_0(uniques, 10);
+  f_110_110_001_010_1(uniques, 10);
+  f_110_110_001_011_0(uniques, 10);
+  f_110_110_001_011_1(uniques, 10);
+  f_110_110_001_110_0(uniques, 10);
+  f_110_110_001_110_1(uniques, 10);
+  f_110_110_001_111_0(uniques, 10);
+  f_110_110_001_111_1(uniques, 10);
+  f_110_110_010_010_0(uniques, 10);
+  f_110_110_010_010_1(uniques, 10);
+  f_110_110_010_011_0(uniques, 10);
+  f_110_110_010_011_1(uniques, 10);
+  f_110_110_010_110_0(uniques, 10);
+  f_110_110_010_110_1(uniques, 10);
+  f_110_110_010_111_0(uniques, 10);
+  f_110_110_010_111_1(uniques, 10);
+  f_110_110_011_010_0(uniques, 10);
+  f_110_110_011_010_1(uniques, 10);
+  f_110_110_011_011_0(uniques, 10);
+  f_110_110_011_011_1(uniques, 10);
+  f_110_110_011_110_0(uniques, 10);
+  f_110_110_011_110_1(uniques, 10);
+  f_110_110_011_111_0(uniques, 10);
+  f_110_110_011_111_1(uniques, 10);
+  f_110_110_100_010_0(uniques, 10);
+  f_110_110_100_010_1(uniques, 10);
+  f_110_110_100_011_0(uniques, 10);
+  f_110_110_100_011_1(uniques, 10);
+  f_110_110_100_110_0(uniques, 10);
+  f_110_110_100_110_1(uniques, 10);
+  f_110_110_100_111_0(uniques, 10);
+  f_110_110_100_111_1(uniques, 10);
+  f_110_110_101_010_0(uniques, 10);
+  f_110_110_101_010_1(uniques, 10);
+  f_110_110_101_011_0(uniques, 10);
+  f_110_110_101_011_1(uniques, 10);
+  f_110_110_101_110_0(uniques, 10);
+  f_110_110_101_110_1(uniques, 10);
+  f_110_110_101_111_0(uniques, 10);
+  f_110_110_101_111_1(uniques, 10);
+  f_110_110_110_010_0(uniques, 10);
+  f_110_110_110_010_1(uniques, 10);
+  f_110_110_110_011_0(uniques, 10);
+  f_110_110_110_011_1(uniques, 10);
+  f_110_110_110_110_0(uniques, 10);
+  f_110_110_110_110_1(uniques, 10);
+  f_110_110_110_111_0(uniques, 10);
+  f_110_110_110_111_1(uniques, 10);
+  f_110_110_111_010_0(uniques, 10);
+  f_110_110_111_010_1(uniques, 10);
+  f_110_110_111_011_0(uniques, 10);
+  f_110_110_111_011_1(uniques, 10);
+  f_110_110_111_110_0(uniques, 10);
+  f_110_110_111_110_1(uniques, 10);
+  f_110_110_111_111_0(uniques, 10);
+  f_110_110_111_111_1(uniques, 10);
+  f_110_111_000_010_0(uniques, 10);
+  f_110_111_000_010_1(uniques, 10);
+  f_110_111_000_011_0(uniques, 10);
+  f_110_111_000_011_1(uniques, 10);
+  f_110_111_000_110_0(uniques, 10);
+  f_110_111_000_110_1(uniques, 10);
+  f_110_111_000_111_0(uniques, 10);
+  f_110_111_000_111_1(uniques, 10);
+  f_110_111_001_010_0(uniques, 10);
+  f_110_111_001_010_1(uniques, 10);
+  f_110_111_001_011_0(uniques, 10);
+  f_110_111_001_011_1(uniques, 10);
+  f_110_111_001_110_0(uniques, 10);
+  f_110_111_001_110_1(uniques, 10);
+  f_110_111_001_111_0(uniques, 10);
+  f_110_111_001_111_1(uniques, 10);
+  f_110_111_010_010_0(uniques, 10);
+  f_110_111_010_010_1(uniques, 10);
+  f_110_111_010_011_0(uniques, 10);
+  f_110_111_010_011_1(uniques, 10);
+  f_110_111_010_110_0(uniques, 10);
+  f_110_111_010_110_1(uniques, 10);
+  f_110_111_010_111_0(uniques, 10);
+  f_110_111_010_111_1(uniques, 10);
+  f_110_111_011_010_0(uniques, 10);
+  f_110_111_011_010_1(uniques, 10);
+  f_110_111_011_011_0(uniques, 10);
+  f_110_111_011_011_1(uniques, 10);
+  f_110_111_011_110_0(uniques, 10);
+  f_110_111_011_110_1(uniques, 10);
+  f_110_111_011_111_0(uniques, 10);
+  f_110_111_011_111_1(uniques, 10);
+  f_110_111_100_010_0(uniques, 10);
+  f_110_111_100_010_1(uniques, 10);
+  f_110_111_100_011_0(uniques, 10);
+  f_110_111_100_011_1(uniques, 10);
+  f_110_111_100_110_0(uniques, 10);
+  f_110_111_100_110_1(uniques, 10);
+  f_110_111_100_111_0(uniques, 10);
+  f_110_111_100_111_1(uniques, 10);
+  f_110_111_101_010_0(uniques, 10);
+  f_110_111_101_010_1(uniques, 10);
+  f_110_111_101_011_0(uniques, 10);
+  f_110_111_101_011_1(uniques, 10);
+  f_110_111_101_110_0(uniques, 10);
+  f_110_111_101_110_1(uniques, 10);
+  f_110_111_101_111_0(uniques, 10);
+  f_110_111_101_111_1(uniques, 10);
+  f_110_111_110_010_0(uniques, 10);
+  f_110_111_110_010_1(uniques, 10);
+  f_110_111_110_011_0(uniques, 10);
+  f_110_111_110_011_1(uniques, 10);
+  f_110_111_110_110_0(uniques, 10);
+  f_110_111_110_110_1(uniques, 10);
+  f_110_111_110_111_0(uniques, 10);
+  f_110_111_110_111_1(uniques, 10);
+  f_110_111_111_010_0(uniques, 10);
+  f_110_111_111_010_1(uniques, 10);
+  f_110_111_111_011_0(uniques, 10);
+  f_110_111_111_011_1(uniques, 10);
+  f_110_111_111_110_0(uniques, 10);
+  f_110_111_111_110_1(uniques, 10);
+  f_110_111_111_111_0(uniques, 10);
+  f_110_111_111_111_1(uniques, 10);
+  f_111_000_000_010_0(uniques, 10);
+  f_111_000_000_010_1(uniques, 10);
+  f_111_000_000_011_0(uniques, 10);
+  f_111_000_000_011_1(uniques, 10);
+  f_111_000_000_110_0(uniques, 10);
+  f_111_000_000_110_1(uniques, 10);
+  f_111_000_000_111_0(uniques, 10);
+  f_111_000_000_111_1(uniques, 10);
+  f_111_000_001_010_0(uniques, 10);
+  f_111_000_001_010_1(uniques, 10);
+  f_111_000_001_011_0(uniques, 10);
+  f_111_000_001_011_1(uniques, 10);
+  f_111_000_001_110_0(uniques, 10);
+  f_111_000_001_110_1(uniques, 10);
+  f_111_000_001_111_0(uniques, 10);
+  f_111_000_001_111_1(uniques, 10);
+  f_111_000_010_010_0(uniques, 10);
+  f_111_000_010_010_1(uniques, 10);
+  f_111_000_010_011_0(uniques, 10);
+  f_111_000_010_011_1(uniques, 10);
+  f_111_000_010_110_0(uniques, 10);
+  f_111_000_010_110_1(uniques, 10);
+  f_111_000_010_111_0(uniques, 10);
+  f_111_000_010_111_1(uniques, 10);
+  f_111_000_011_010_0(uniques, 10);
+  f_111_000_011_010_1(uniques, 10);
+  f_111_000_011_011_0(uniques, 10);
+  f_111_000_011_011_1(uniques, 10);
+  f_111_000_011_110_0(uniques, 10);
+  f_111_000_011_110_1(uniques, 10);
+  f_111_000_011_111_0(uniques, 10);
+  f_111_000_011_111_1(uniques, 10);
+  f_111_000_100_010_0(uniques, 10);
+  f_111_000_100_010_1(uniques, 10);
+  f_111_000_100_011_0(uniques, 10);
+  f_111_000_100_011_1(uniques, 10);
+  f_111_000_100_110_0(uniques, 10);
+  f_111_000_100_110_1(uniques, 10);
+  f_111_000_100_111_0(uniques, 10);
+  f_111_000_100_111_1(uniques, 10);
+  f_111_000_101_010_0(uniques, 10);
+  f_111_000_101_010_1(uniques, 10);
+  f_111_000_101_011_0(uniques, 10);
+  f_111_000_101_011_1(uniques, 10);
+  f_111_000_101_110_0(uniques, 10);
+  f_111_000_101_110_1(uniques, 10);
+  f_111_000_101_111_0(uniques, 10);
+  f_111_000_101_111_1(uniques, 10);
+  f_111_000_110_010_0(uniques, 10);
+  f_111_000_110_010_1(uniques, 10);
+  f_111_000_110_011_0(uniques, 10);
+  f_111_000_110_011_1(uniques, 10);
+  f_111_000_110_110_0(uniques, 10);
+  f_111_000_110_110_1(uniques, 10);
+  f_111_000_110_111_0(uniques, 10);
+  f_111_000_110_111_1(uniques, 10);
+  f_111_000_111_010_0(uniques, 10);
+  f_111_000_111_010_1(uniques, 10);
+  f_111_000_111_011_0(uniques, 10);
+  f_111_000_111_011_1(uniques, 10);
+  f_111_000_111_110_0(uniques, 10);
+  f_111_000_111_110_1(uniques, 10);
+  f_111_000_111_111_0(uniques, 10);
+  f_111_000_111_111_1(uniques, 10);
+  f_111_001_000_010_0(uniques, 10);
+  f_111_001_000_010_1(uniques, 10);
+  f_111_001_000_011_0(uniques, 10);
+  f_111_001_000_011_1(uniques, 10);
+  f_111_001_000_110_0(uniques, 10);
+  f_111_001_000_110_1(uniques, 10);
+  f_111_001_000_111_0(uniques, 10);
+  f_111_001_000_111_1(uniques, 10);
+  f_111_001_001_010_0(uniques, 10);
+  f_111_001_001_010_1(uniques, 10);
+  f_111_001_001_011_0(uniques, 10);
+  f_111_001_001_011_1(uniques, 10);
+  f_111_001_001_110_0(uniques, 10);
+  f_111_001_001_110_1(uniques, 10);
+  f_111_001_001_111_0(uniques, 10);
+  f_111_001_001_111_1(uniques, 10);
+  f_111_001_010_010_0(uniques, 10);
+  f_111_001_010_010_1(uniques, 10);
+  f_111_001_010_011_0(uniques, 10);
+  f_111_001_010_011_1(uniques, 10);
+  f_111_001_010_110_0(uniques, 10);
+  f_111_001_010_110_1(uniques, 10);
+  f_111_001_010_111_0(uniques, 10);
+  f_111_001_010_111_1(uniques, 10);
+  f_111_001_011_010_0(uniques, 10);
+  f_111_001_011_010_1(uniques, 10);
+  f_111_001_011_011_0(uniques, 10);
+  f_111_001_011_011_1(uniques, 10);
+  f_111_001_011_110_0(uniques, 10);
+  f_111_001_011_110_1(uniques, 10);
+  f_111_001_011_111_0(uniques, 10);
+  f_111_001_011_111_1(uniques, 10);
+  f_111_001_100_010_0(uniques, 10);
+  f_111_001_100_010_1(uniques, 10);
+  f_111_001_100_011_0(uniques, 10);
+  f_111_001_100_011_1(uniques, 10);
+  f_111_001_100_110_0(uniques, 10);
+  f_111_001_100_110_1(uniques, 10);
+  f_111_001_100_111_0(uniques, 10);
+  f_111_001_100_111_1(uniques, 10);
+  f_111_001_101_010_0(uniques, 10);
+  f_111_001_101_010_1(uniques, 10);
+  f_111_001_101_011_0(uniques, 10);
+  f_111_001_101_011_1(uniques, 10);
+  f_111_001_101_110_0(uniques, 10);
+  f_111_001_101_110_1(uniques, 10);
+  f_111_001_101_111_0(uniques, 10);
+  f_111_001_101_111_1(uniques, 10);
+  f_111_001_110_010_0(uniques, 10);
+  f_111_001_110_010_1(uniques, 10);
+  f_111_001_110_011_0(uniques, 10);
+  f_111_001_110_011_1(uniques, 10);
+  f_111_001_110_110_0(uniques, 10);
+  f_111_001_110_110_1(uniques, 10);
+  f_111_001_110_111_0(uniques, 10);
+  f_111_001_110_111_1(uniques, 10);
+  f_111_001_111_010_0(uniques, 10);
+  f_111_001_111_010_1(uniques, 10);
+  f_111_001_111_011_0(uniques, 10);
+  f_111_001_111_011_1(uniques, 10);
+  f_111_001_111_110_0(uniques, 10);
+  f_111_001_111_110_1(uniques, 10);
+  f_111_001_111_111_0(uniques, 10);
+  f_111_001_111_111_1(uniques, 10);
+  f_111_010_000_010_0(uniques, 10);
+  f_111_010_000_010_1(uniques, 10);
+  f_111_010_000_011_0(uniques, 10);
+  f_111_010_000_011_1(uniques, 10);
+  f_111_010_000_110_0(uniques, 10);
+  f_111_010_000_110_1(uniques, 10);
+  f_111_010_000_111_0(uniques, 10);
+  f_111_010_000_111_1(uniques, 10);
+  f_111_010_001_010_0(uniques, 10);
+  f_111_010_001_010_1(uniques, 10);
+  f_111_010_001_011_0(uniques, 10);
+  f_111_010_001_011_1(uniques, 10);
+  f_111_010_001_110_0(uniques, 10);
+  f_111_010_001_110_1(uniques, 10);
+  f_111_010_001_111_0(uniques, 10);
+  f_111_010_001_111_1(uniques, 10);
+  f_111_010_010_010_0(uniques, 10);
+  f_111_010_010_010_1(uniques, 10);
+  f_111_010_010_011_0(uniques, 10);
+  f_111_010_010_011_1(uniques, 10);
+  f_111_010_010_110_0(uniques, 10);
+  f_111_010_010_110_1(uniques, 10);
+  f_111_010_010_111_0(uniques, 10);
+  f_111_010_010_111_1(uniques, 10);
+  f_111_010_011_010_0(uniques, 10);
+  f_111_010_011_010_1(uniques, 10);
+  f_111_010_011_011_0(uniques, 10);
+  f_111_010_011_011_1(uniques, 10);
+  f_111_010_011_110_0(uniques, 10);
+  f_111_010_011_110_1(uniques, 10);
+  f_111_010_011_111_0(uniques, 10);
+  f_111_010_011_111_1(uniques, 10);
+  f_111_010_100_010_0(uniques, 10);
+  f_111_010_100_010_1(uniques, 10);
+  f_111_010_100_011_0(uniques, 10);
+  f_111_010_100_011_1(uniques, 10);
+  f_111_010_100_110_0(uniques, 10);
+  f_111_010_100_110_1(uniques, 10);
+  f_111_010_100_111_0(uniques, 10);
+  f_111_010_100_111_1(uniques, 10);
+  f_111_010_101_010_0(uniques, 10);
+  f_111_010_101_010_1(uniques, 10);
+  f_111_010_101_011_0(uniques, 10);
+  f_111_010_101_011_1(uniques, 10);
+  f_111_010_101_110_0(uniques, 10);
+  f_111_010_101_110_1(uniques, 10);
+  f_111_010_101_111_0(uniques, 10);
+  f_111_010_101_111_1(uniques, 10);
+  f_111_010_110_010_0(uniques, 10);
+  f_111_010_110_010_1(uniques, 10);
+  f_111_010_110_011_0(uniques, 10);
+  f_111_010_110_011_1(uniques, 10);
+  f_111_010_110_110_0(uniques, 10);
+  f_111_010_110_110_1(uniques, 10);
+  f_111_010_110_111_0(uniques, 10);
+  f_111_010_110_111_1(uniques, 10);
+  f_111_010_111_010_0(uniques, 10);
+  f_111_010_111_010_1(uniques, 10);
+  f_111_010_111_011_0(uniques, 10);
+  f_111_010_111_011_1(uniques, 10);
+  f_111_010_111_110_0(uniques, 10);
+  f_111_010_111_110_1(uniques, 10);
+  f_111_010_111_111_0(uniques, 10);
+  f_111_010_111_111_1(uniques, 10);
+  f_111_011_000_010_0(uniques, 10);
+  f_111_011_000_010_1(uniques, 10);
+  f_111_011_000_011_0(uniques, 10);
+  f_111_011_000_011_1(uniques, 10);
+  f_111_011_000_110_0(uniques, 10);
+  f_111_011_000_110_1(uniques, 10);
+  f_111_011_000_111_0(uniques, 10);
+  f_111_011_000_111_1(uniques, 10);
+  f_111_011_001_010_0(uniques, 10);
+  f_111_011_001_010_1(uniques, 10);
+  f_111_011_001_011_0(uniques, 10);
+  f_111_011_001_011_1(uniques, 10);
+  f_111_011_001_110_0(uniques, 10);
+  f_111_011_001_110_1(uniques, 10);
+  f_111_011_001_111_0(uniques, 10);
+  f_111_011_001_111_1(uniques, 10);
+  f_111_011_010_010_0(uniques, 10);
+  f_111_011_010_010_1(uniques, 10);
+  f_111_011_010_011_0(uniques, 10);
+  f_111_011_010_011_1(uniques, 10);
+  f_111_011_010_110_0(uniques, 10);
+  f_111_011_010_110_1(uniques, 10);
+  f_111_011_010_111_0(uniques, 10);
+  f_111_011_010_111_1(uniques, 10);
+  f_111_011_011_010_0(uniques, 10);
+  f_111_011_011_010_1(uniques, 10);
+  f_111_011_011_011_0(uniques, 10);
+  f_111_011_011_011_1(uniques, 10);
+  f_111_011_011_110_0(uniques, 10);
+  f_111_011_011_110_1(uniques, 10);
+  f_111_011_011_111_0(uniques, 10);
+  f_111_011_011_111_1(uniques, 10);
+  f_111_011_100_010_0(uniques, 10);
+  f_111_011_100_010_1(uniques, 10);
+  f_111_011_100_011_0(uniques, 10);
+  f_111_011_100_011_1(uniques, 10);
+  f_111_011_100_110_0(uniques, 10);
+  f_111_011_100_110_1(uniques, 10);
+  f_111_011_100_111_0(uniques, 10);
+  f_111_011_100_111_1(uniques, 10);
+  f_111_011_101_010_0(uniques, 10);
+  f_111_011_101_010_1(uniques, 10);
+  f_111_011_101_011_0(uniques, 10);
+  f_111_011_101_011_1(uniques, 10);
+  f_111_011_101_110_0(uniques, 10);
+  f_111_011_101_110_1(uniques, 10);
+  f_111_011_101_111_0(uniques, 10);
+  f_111_011_101_111_1(uniques, 10);
+  f_111_011_110_010_0(uniques, 10);
+  f_111_011_110_010_1(uniques, 10);
+  f_111_011_110_011_0(uniques, 10);
+  f_111_011_110_011_1(uniques, 10);
+  f_111_011_110_110_0(uniques, 10);
+  f_111_011_110_110_1(uniques, 10);
+  f_111_011_110_111_0(uniques, 10);
+  f_111_011_110_111_1(uniques, 10);
+  f_111_011_111_010_0(uniques, 10);
+  f_111_011_111_010_1(uniques, 10);
+  f_111_011_111_011_0(uniques, 10);
+  f_111_011_111_011_1(uniques, 10);
+  f_111_011_111_110_0(uniques, 10);
+  f_111_011_111_110_1(uniques, 10);
+  f_111_011_111_111_0(uniques, 10);
+  f_111_011_111_111_1(uniques, 10);
+  f_111_100_000_010_0(uniques, 10);
+  f_111_100_000_010_1(uniques, 10);
+  f_111_100_000_011_0(uniques, 10);
+  f_111_100_000_011_1(uniques, 10);
+  f_111_100_000_110_0(uniques, 10);
+  f_111_100_000_110_1(uniques, 10);
+  f_111_100_000_111_0(uniques, 10);
+  f_111_100_000_111_1(uniques, 10);
+  f_111_100_001_010_0(uniques, 10);
+  f_111_100_001_010_1(uniques, 10);
+  f_111_100_001_011_0(uniques, 10);
+  f_111_100_001_011_1(uniques, 10);
+  f_111_100_001_110_0(uniques, 10);
+  f_111_100_001_110_1(uniques, 10);
+  f_111_100_001_111_0(uniques, 10);
+  f_111_100_001_111_1(uniques, 10);
+  f_111_100_010_010_0(uniques, 10);
+  f_111_100_010_010_1(uniques, 10);
+  f_111_100_010_011_0(uniques, 10);
+  f_111_100_010_011_1(uniques, 10);
+  f_111_100_010_110_0(uniques, 10);
+  f_111_100_010_110_1(uniques, 10);
+  f_111_100_010_111_0(uniques, 10);
+  f_111_100_010_111_1(uniques, 10);
+  f_111_100_011_010_0(uniques, 10);
+  f_111_100_011_010_1(uniques, 10);
+  f_111_100_011_011_0(uniques, 10);
+  f_111_100_011_011_1(uniques, 10);
+  f_111_100_011_110_0(uniques, 10);
+  f_111_100_011_110_1(uniques, 10);
+  f_111_100_011_111_0(uniques, 10);
+  f_111_100_011_111_1(uniques, 10);
+  f_111_100_100_010_0(uniques, 10);
+  f_111_100_100_010_1(uniques, 10);
+  f_111_100_100_011_0(uniques, 10);
+  f_111_100_100_011_1(uniques, 10);
+  f_111_100_100_110_0(uniques, 10);
+  f_111_100_100_110_1(uniques, 10);
+  f_111_100_100_111_0(uniques, 10);
+  f_111_100_100_111_1(uniques, 10);
+  f_111_100_101_010_0(uniques, 10);
+  f_111_100_101_010_1(uniques, 10);
+  f_111_100_101_011_0(uniques, 10);
+  f_111_100_101_011_1(uniques, 10);
+  f_111_100_101_110_0(uniques, 10);
+  f_111_100_101_110_1(uniques, 10);
+  f_111_100_101_111_0(uniques, 10);
+  f_111_100_101_111_1(uniques, 10);
+  f_111_100_110_010_0(uniques, 10);
+  f_111_100_110_010_1(uniques, 10);
+  f_111_100_110_011_0(uniques, 10);
+  f_111_100_110_011_1(uniques, 10);
+  f_111_100_110_110_0(uniques, 10);
+  f_111_100_110_110_1(uniques, 10);
+  f_111_100_110_111_0(uniques, 10);
+  f_111_100_110_111_1(uniques, 10);
+  f_111_100_111_010_0(uniques, 10);
+  f_111_100_111_010_1(uniques, 10);
+  f_111_100_111_011_0(uniques, 10);
+  f_111_100_111_011_1(uniques, 10);
+  f_111_100_111_110_0(uniques, 10);
+  f_111_100_111_110_1(uniques, 10);
+  f_111_100_111_111_0(uniques, 10);
+  f_111_100_111_111_1(uniques, 10);
+  f_111_101_000_010_0(uniques, 10);
+  f_111_101_000_010_1(uniques, 10);
+  f_111_101_000_011_0(uniques, 10);
+  f_111_101_000_011_1(uniques, 10);
+  f_111_101_000_110_0(uniques, 10);
+  f_111_101_000_110_1(uniques, 10);
+  f_111_101_000_111_0(uniques, 10);
+  f_111_101_000_111_1(uniques, 10);
+  f_111_101_001_010_0(uniques, 10);
+  f_111_101_001_010_1(uniques, 10);
+  f_111_101_001_011_0(uniques, 10);
+  f_111_101_001_011_1(uniques, 10);
+  f_111_101_001_110_0(uniques, 10);
+  f_111_101_001_110_1(uniques, 10);
+  f_111_101_001_111_0(uniques, 10);
+  f_111_101_001_111_1(uniques, 10);
+  f_111_101_010_010_0(uniques, 10);
+  f_111_101_010_010_1(uniques, 10);
+  f_111_101_010_011_0(uniques, 10);
+  f_111_101_010_011_1(uniques, 10);
+  f_111_101_010_110_0(uniques, 10);
+  f_111_101_010_110_1(uniques, 10);
+  f_111_101_010_111_0(uniques, 10);
+  f_111_101_010_111_1(uniques, 10);
+  f_111_101_011_010_0(uniques, 10);
+  f_111_101_011_010_1(uniques, 10);
+  f_111_101_011_011_0(uniques, 10);
+  f_111_101_011_011_1(uniques, 10);
+  f_111_101_011_110_0(uniques, 10);
+  f_111_101_011_110_1(uniques, 10);
+  f_111_101_011_111_0(uniques, 10);
+  f_111_101_011_111_1(uniques, 10);
+  f_111_101_100_010_0(uniques, 10);
+  f_111_101_100_010_1(uniques, 10);
+  f_111_101_100_011_0(uniques, 10);
+  f_111_101_100_011_1(uniques, 10);
+  f_111_101_100_110_0(uniques, 10);
+  f_111_101_100_110_1(uniques, 10);
+  f_111_101_100_111_0(uniques, 10);
+  f_111_101_100_111_1(uniques, 10);
+  f_111_101_101_010_0(uniques, 10);
+  f_111_101_101_010_1(uniques, 10);
+  f_111_101_101_011_0(uniques, 10);
+  f_111_101_101_011_1(uniques, 10);
+  f_111_101_101_110_0(uniques, 10);
+  f_111_101_101_110_1(uniques, 10);
+  f_111_101_101_111_0(uniques, 10);
+  f_111_101_101_111_1(uniques, 10);
+  f_111_101_110_010_0(uniques, 10);
+  f_111_101_110_010_1(uniques, 10);
+  f_111_101_110_011_0(uniques, 10);
+  f_111_101_110_011_1(uniques, 10);
+  f_111_101_110_110_0(uniques, 10);
+  f_111_101_110_110_1(uniques, 10);
+  f_111_101_110_111_0(uniques, 10);
+  f_111_101_110_111_1(uniques, 10);
+  f_111_101_111_010_0(uniques, 10);
+  f_111_101_111_010_1(uniques, 10);
+  f_111_101_111_011_0(uniques, 10);
+  f_111_101_111_011_1(uniques, 10);
+  f_111_101_111_110_0(uniques, 10);
+  f_111_101_111_110_1(uniques, 10);
+  f_111_101_111_111_0(uniques, 10);
+  f_111_101_111_111_1(uniques, 10);
+  f_111_110_000_010_0(uniques, 10);
+  f_111_110_000_010_1(uniques, 10);
+  f_111_110_000_011_0(uniques, 10);
+  f_111_110_000_011_1(uniques, 10);
+  f_111_110_000_110_0(uniques, 10);
+  f_111_110_000_110_1(uniques, 10);
+  f_111_110_000_111_0(uniques, 10);
+  f_111_110_000_111_1(uniques, 10);
+  f_111_110_001_010_0(uniques, 10);
+  f_111_110_001_010_1(uniques, 10);
+  f_111_110_001_011_0(uniques, 10);
+  f_111_110_001_011_1(uniques, 10);
+  f_111_110_001_110_0(uniques, 10);
+  f_111_110_001_110_1(uniques, 10);
+  f_111_110_001_111_0(uniques, 10);
+  f_111_110_001_111_1(uniques, 10);
+  f_111_110_010_010_0(uniques, 10);
+  f_111_110_010_010_1(uniques, 10);
+  f_111_110_010_011_0(uniques, 10);
+  f_111_110_010_011_1(uniques, 10);
+  f_111_110_010_110_0(uniques, 10);
+  f_111_110_010_110_1(uniques, 10);
+  f_111_110_010_111_0(uniques, 10);
+  f_111_110_010_111_1(uniques, 10);
+  f_111_110_011_010_0(uniques, 10);
+  f_111_110_011_010_1(uniques, 10);
+  f_111_110_011_011_0(uniques, 10);
+  f_111_110_011_011_1(uniques, 10);
+  f_111_110_011_110_0(uniques, 10);
+  f_111_110_011_110_1(uniques, 10);
+  f_111_110_011_111_0(uniques, 10);
+  f_111_110_011_111_1(uniques, 10);
+  f_111_110_100_010_0(uniques, 10);
+  f_111_110_100_010_1(uniques, 10);
+  f_111_110_100_011_0(uniques, 10);
+  f_111_110_100_011_1(uniques, 10);
+  f_111_110_100_110_0(uniques, 10);
+  f_111_110_100_110_1(uniques, 10);
+  f_111_110_100_111_0(uniques, 10);
+  f_111_110_100_111_1(uniques, 10);
+  f_111_110_101_010_0(uniques, 10);
+  f_111_110_101_010_1(uniques, 10);
+  f_111_110_101_011_0(uniques, 10);
+  f_111_110_101_011_1(uniques, 10);
+  f_111_110_101_110_0(uniques, 10);
+  f_111_110_101_110_1(uniques, 10);
+  f_111_110_101_111_0(uniques, 10);
+  f_111_110_101_111_1(uniques, 10);
+  f_111_110_110_010_0(uniques, 10);
+  f_111_110_110_010_1(uniques, 10);
+  f_111_110_110_011_0(uniques, 10);
+  f_111_110_110_011_1(uniques, 10);
+  f_111_110_110_110_0(uniques, 10);
+  f_111_110_110_110_1(uniques, 10);
+  f_111_110_110_111_0(uniques, 10);
+  f_111_110_110_111_1(uniques, 10);
+  f_111_110_111_010_0(uniques, 10);
+  f_111_110_111_010_1(uniques, 10);
+  f_111_110_111_011_0(uniques, 10);
+  f_111_110_111_011_1(uniques, 10);
+  f_111_110_111_110_0(uniques, 10);
+  f_111_110_111_110_1(uniques, 10);
+  f_111_110_111_111_0(uniques, 10);
+  f_111_110_111_111_1(uniques, 10);
+  f_111_111_000_010_0(uniques, 10);
+  f_111_111_000_010_1(uniques, 10);
+  f_111_111_000_011_0(uniques, 10);
+  f_111_111_000_011_1(uniques, 10);
+  f_111_111_000_110_0(uniques, 10);
+  f_111_111_000_110_1(uniques, 10);
+  f_111_111_000_111_0(uniques, 10);
+  f_111_111_000_111_1(uniques, 10);
+  f_111_111_001_010_0(uniques, 10);
+  f_111_111_001_010_1(uniques, 10);
+  f_111_111_001_011_0(uniques, 10);
+  f_111_111_001_011_1(uniques, 10);
+  f_111_111_001_110_0(uniques, 10);
+  f_111_111_001_110_1(uniques, 10);
+  f_111_111_001_111_0(uniques, 10);
+  f_111_111_001_111_1(uniques, 10);
+  f_111_111_010_010_0(uniques, 10);
+  f_111_111_010_010_1(uniques, 10);
+  f_111_111_010_011_0(uniques, 10);
+  f_111_111_010_011_1(uniques, 10);
+  f_111_111_010_110_0(uniques, 10);
+  f_111_111_010_110_1(uniques, 10);
+  f_111_111_010_111_0(uniques, 10);
+  f_111_111_010_111_1(uniques, 10);
+  f_111_111_011_010_0(uniques, 10);
+  f_111_111_011_010_1(uniques, 10);
+  f_111_111_011_011_0(uniques, 10);
+  f_111_111_011_011_1(uniques, 10);
+  f_111_111_011_110_0(uniques, 10);
+  f_111_111_011_110_1(uniques, 10);
+  f_111_111_011_111_0(uniques, 10);
+  f_111_111_011_111_1(uniques, 10);
+  f_111_111_100_010_0(uniques, 10);
+  f_111_111_100_010_1(uniques, 10);
+  f_111_111_100_011_0(uniques, 10);
+  f_111_111_100_011_1(uniques, 10);
+  f_111_111_100_110_0(uniques, 10);
+  f_111_111_100_110_1(uniques, 10);
+  f_111_111_100_111_0(uniques, 10);
+  f_111_111_100_111_1(uniques, 10);
+  f_111_111_101_010_0(uniques, 10);
+  f_111_111_101_010_1(uniques, 10);
+  f_111_111_101_011_0(uniques, 10);
+  f_111_111_101_011_1(uniques, 10);
+  f_111_111_101_110_0(uniques, 10);
+  f_111_111_101_110_1(uniques, 10);
+  f_111_111_101_111_0(uniques, 10);
+  f_111_111_101_111_1(uniques, 10);
+  f_111_111_110_010_0(uniques, 10);
+  f_111_111_110_010_1(uniques, 10);
+  f_111_111_110_011_0(uniques, 10);
+  f_111_111_110_011_1(uniques, 10);
+  f_111_111_110_110_0(uniques, 10);
+  f_111_111_110_110_1(uniques, 10);
+  f_111_111_110_111_0(uniques, 10);
+  f_111_111_110_111_1(uniques, 10);
+  f_111_111_111_010_0(uniques, 10);
+  f_111_111_111_010_1(uniques, 10);
+  f_111_111_111_011_0(uniques, 10);
+  f_111_111_111_011_1(uniques, 10);
+  f_111_111_111_110_0(uniques, 10);
+  f_111_111_111_110_1(uniques, 10);
+  f_111_111_111_111_0(uniques, 10);
+  f_111_111_111_111_1(uniques, 10);
+  Expect.equals(4096, uniques.length);
+}
diff --git a/tests/dart2js/deferred/many_parts/lib_000_000_000_100_0.dart b/tests/dart2js/deferred/many_parts/lib_000_000_000_100_0.dart
new file mode 100644
index 0000000..58b7eea
--- /dev/null
+++ b/tests/dart2js/deferred/many_parts/lib_000_000_000_100_0.dart
@@ -0,0 +1,4111 @@
+// Copyright (c) 2020, 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:expect/expect.dart";
+
+import 'libB.dart';
+
+@pragma('dart2js:noInline')
+g_000_000_000_100_0() {
+  Set<String> uniques = {};
+
+  // f_***_***_***_1**_*;
+  f_000_000_000_100_0(uniques, 9);
+  f_000_000_000_100_1(uniques, 9);
+  f_000_000_000_101_0(uniques, 9);
+  f_000_000_000_101_1(uniques, 9);
+  f_000_000_000_110_0(uniques, 9);
+  f_000_000_000_110_1(uniques, 9);
+  f_000_000_000_111_0(uniques, 9);
+  f_000_000_000_111_1(uniques, 9);
+  f_000_000_001_100_0(uniques, 9);
+  f_000_000_001_100_1(uniques, 9);
+  f_000_000_001_101_0(uniques, 9);
+  f_000_000_001_101_1(uniques, 9);
+  f_000_000_001_110_0(uniques, 9);
+  f_000_000_001_110_1(uniques, 9);
+  f_000_000_001_111_0(uniques, 9);
+  f_000_000_001_111_1(uniques, 9);
+  f_000_000_010_100_0(uniques, 9);
+  f_000_000_010_100_1(uniques, 9);
+  f_000_000_010_101_0(uniques, 9);
+  f_000_000_010_101_1(uniques, 9);
+  f_000_000_010_110_0(uniques, 9);
+  f_000_000_010_110_1(uniques, 9);
+  f_000_000_010_111_0(uniques, 9);
+  f_000_000_010_111_1(uniques, 9);
+  f_000_000_011_100_0(uniques, 9);
+  f_000_000_011_100_1(uniques, 9);
+  f_000_000_011_101_0(uniques, 9);
+  f_000_000_011_101_1(uniques, 9);
+  f_000_000_011_110_0(uniques, 9);
+  f_000_000_011_110_1(uniques, 9);
+  f_000_000_011_111_0(uniques, 9);
+  f_000_000_011_111_1(uniques, 9);
+  f_000_000_100_100_0(uniques, 9);
+  f_000_000_100_100_1(uniques, 9);
+  f_000_000_100_101_0(uniques, 9);
+  f_000_000_100_101_1(uniques, 9);
+  f_000_000_100_110_0(uniques, 9);
+  f_000_000_100_110_1(uniques, 9);
+  f_000_000_100_111_0(uniques, 9);
+  f_000_000_100_111_1(uniques, 9);
+  f_000_000_101_100_0(uniques, 9);
+  f_000_000_101_100_1(uniques, 9);
+  f_000_000_101_101_0(uniques, 9);
+  f_000_000_101_101_1(uniques, 9);
+  f_000_000_101_110_0(uniques, 9);
+  f_000_000_101_110_1(uniques, 9);
+  f_000_000_101_111_0(uniques, 9);
+  f_000_000_101_111_1(uniques, 9);
+  f_000_000_110_100_0(uniques, 9);
+  f_000_000_110_100_1(uniques, 9);
+  f_000_000_110_101_0(uniques, 9);
+  f_000_000_110_101_1(uniques, 9);
+  f_000_000_110_110_0(uniques, 9);
+  f_000_000_110_110_1(uniques, 9);
+  f_000_000_110_111_0(uniques, 9);
+  f_000_000_110_111_1(uniques, 9);
+  f_000_000_111_100_0(uniques, 9);
+  f_000_000_111_100_1(uniques, 9);
+  f_000_000_111_101_0(uniques, 9);
+  f_000_000_111_101_1(uniques, 9);
+  f_000_000_111_110_0(uniques, 9);
+  f_000_000_111_110_1(uniques, 9);
+  f_000_000_111_111_0(uniques, 9);
+  f_000_000_111_111_1(uniques, 9);
+  f_000_001_000_100_0(uniques, 9);
+  f_000_001_000_100_1(uniques, 9);
+  f_000_001_000_101_0(uniques, 9);
+  f_000_001_000_101_1(uniques, 9);
+  f_000_001_000_110_0(uniques, 9);
+  f_000_001_000_110_1(uniques, 9);
+  f_000_001_000_111_0(uniques, 9);
+  f_000_001_000_111_1(uniques, 9);
+  f_000_001_001_100_0(uniques, 9);
+  f_000_001_001_100_1(uniques, 9);
+  f_000_001_001_101_0(uniques, 9);
+  f_000_001_001_101_1(uniques, 9);
+  f_000_001_001_110_0(uniques, 9);
+  f_000_001_001_110_1(uniques, 9);
+  f_000_001_001_111_0(uniques, 9);
+  f_000_001_001_111_1(uniques, 9);
+  f_000_001_010_100_0(uniques, 9);
+  f_000_001_010_100_1(uniques, 9);
+  f_000_001_010_101_0(uniques, 9);
+  f_000_001_010_101_1(uniques, 9);
+  f_000_001_010_110_0(uniques, 9);
+  f_000_001_010_110_1(uniques, 9);
+  f_000_001_010_111_0(uniques, 9);
+  f_000_001_010_111_1(uniques, 9);
+  f_000_001_011_100_0(uniques, 9);
+  f_000_001_011_100_1(uniques, 9);
+  f_000_001_011_101_0(uniques, 9);
+  f_000_001_011_101_1(uniques, 9);
+  f_000_001_011_110_0(uniques, 9);
+  f_000_001_011_110_1(uniques, 9);
+  f_000_001_011_111_0(uniques, 9);
+  f_000_001_011_111_1(uniques, 9);
+  f_000_001_100_100_0(uniques, 9);
+  f_000_001_100_100_1(uniques, 9);
+  f_000_001_100_101_0(uniques, 9);
+  f_000_001_100_101_1(uniques, 9);
+  f_000_001_100_110_0(uniques, 9);
+  f_000_001_100_110_1(uniques, 9);
+  f_000_001_100_111_0(uniques, 9);
+  f_000_001_100_111_1(uniques, 9);
+  f_000_001_101_100_0(uniques, 9);
+  f_000_001_101_100_1(uniques, 9);
+  f_000_001_101_101_0(uniques, 9);
+  f_000_001_101_101_1(uniques, 9);
+  f_000_001_101_110_0(uniques, 9);
+  f_000_001_101_110_1(uniques, 9);
+  f_000_001_101_111_0(uniques, 9);
+  f_000_001_101_111_1(uniques, 9);
+  f_000_001_110_100_0(uniques, 9);
+  f_000_001_110_100_1(uniques, 9);
+  f_000_001_110_101_0(uniques, 9);
+  f_000_001_110_101_1(uniques, 9);
+  f_000_001_110_110_0(uniques, 9);
+  f_000_001_110_110_1(uniques, 9);
+  f_000_001_110_111_0(uniques, 9);
+  f_000_001_110_111_1(uniques, 9);
+  f_000_001_111_100_0(uniques, 9);
+  f_000_001_111_100_1(uniques, 9);
+  f_000_001_111_101_0(uniques, 9);
+  f_000_001_111_101_1(uniques, 9);
+  f_000_001_111_110_0(uniques, 9);
+  f_000_001_111_110_1(uniques, 9);
+  f_000_001_111_111_0(uniques, 9);
+  f_000_001_111_111_1(uniques, 9);
+  f_000_010_000_100_0(uniques, 9);
+  f_000_010_000_100_1(uniques, 9);
+  f_000_010_000_101_0(uniques, 9);
+  f_000_010_000_101_1(uniques, 9);
+  f_000_010_000_110_0(uniques, 9);
+  f_000_010_000_110_1(uniques, 9);
+  f_000_010_000_111_0(uniques, 9);
+  f_000_010_000_111_1(uniques, 9);
+  f_000_010_001_100_0(uniques, 9);
+  f_000_010_001_100_1(uniques, 9);
+  f_000_010_001_101_0(uniques, 9);
+  f_000_010_001_101_1(uniques, 9);
+  f_000_010_001_110_0(uniques, 9);
+  f_000_010_001_110_1(uniques, 9);
+  f_000_010_001_111_0(uniques, 9);
+  f_000_010_001_111_1(uniques, 9);
+  f_000_010_010_100_0(uniques, 9);
+  f_000_010_010_100_1(uniques, 9);
+  f_000_010_010_101_0(uniques, 9);
+  f_000_010_010_101_1(uniques, 9);
+  f_000_010_010_110_0(uniques, 9);
+  f_000_010_010_110_1(uniques, 9);
+  f_000_010_010_111_0(uniques, 9);
+  f_000_010_010_111_1(uniques, 9);
+  f_000_010_011_100_0(uniques, 9);
+  f_000_010_011_100_1(uniques, 9);
+  f_000_010_011_101_0(uniques, 9);
+  f_000_010_011_101_1(uniques, 9);
+  f_000_010_011_110_0(uniques, 9);
+  f_000_010_011_110_1(uniques, 9);
+  f_000_010_011_111_0(uniques, 9);
+  f_000_010_011_111_1(uniques, 9);
+  f_000_010_100_100_0(uniques, 9);
+  f_000_010_100_100_1(uniques, 9);
+  f_000_010_100_101_0(uniques, 9);
+  f_000_010_100_101_1(uniques, 9);
+  f_000_010_100_110_0(uniques, 9);
+  f_000_010_100_110_1(uniques, 9);
+  f_000_010_100_111_0(uniques, 9);
+  f_000_010_100_111_1(uniques, 9);
+  f_000_010_101_100_0(uniques, 9);
+  f_000_010_101_100_1(uniques, 9);
+  f_000_010_101_101_0(uniques, 9);
+  f_000_010_101_101_1(uniques, 9);
+  f_000_010_101_110_0(uniques, 9);
+  f_000_010_101_110_1(uniques, 9);
+  f_000_010_101_111_0(uniques, 9);
+  f_000_010_101_111_1(uniques, 9);
+  f_000_010_110_100_0(uniques, 9);
+  f_000_010_110_100_1(uniques, 9);
+  f_000_010_110_101_0(uniques, 9);
+  f_000_010_110_101_1(uniques, 9);
+  f_000_010_110_110_0(uniques, 9);
+  f_000_010_110_110_1(uniques, 9);
+  f_000_010_110_111_0(uniques, 9);
+  f_000_010_110_111_1(uniques, 9);
+  f_000_010_111_100_0(uniques, 9);
+  f_000_010_111_100_1(uniques, 9);
+  f_000_010_111_101_0(uniques, 9);
+  f_000_010_111_101_1(uniques, 9);
+  f_000_010_111_110_0(uniques, 9);
+  f_000_010_111_110_1(uniques, 9);
+  f_000_010_111_111_0(uniques, 9);
+  f_000_010_111_111_1(uniques, 9);
+  f_000_011_000_100_0(uniques, 9);
+  f_000_011_000_100_1(uniques, 9);
+  f_000_011_000_101_0(uniques, 9);
+  f_000_011_000_101_1(uniques, 9);
+  f_000_011_000_110_0(uniques, 9);
+  f_000_011_000_110_1(uniques, 9);
+  f_000_011_000_111_0(uniques, 9);
+  f_000_011_000_111_1(uniques, 9);
+  f_000_011_001_100_0(uniques, 9);
+  f_000_011_001_100_1(uniques, 9);
+  f_000_011_001_101_0(uniques, 9);
+  f_000_011_001_101_1(uniques, 9);
+  f_000_011_001_110_0(uniques, 9);
+  f_000_011_001_110_1(uniques, 9);
+  f_000_011_001_111_0(uniques, 9);
+  f_000_011_001_111_1(uniques, 9);
+  f_000_011_010_100_0(uniques, 9);
+  f_000_011_010_100_1(uniques, 9);
+  f_000_011_010_101_0(uniques, 9);
+  f_000_011_010_101_1(uniques, 9);
+  f_000_011_010_110_0(uniques, 9);
+  f_000_011_010_110_1(uniques, 9);
+  f_000_011_010_111_0(uniques, 9);
+  f_000_011_010_111_1(uniques, 9);
+  f_000_011_011_100_0(uniques, 9);
+  f_000_011_011_100_1(uniques, 9);
+  f_000_011_011_101_0(uniques, 9);
+  f_000_011_011_101_1(uniques, 9);
+  f_000_011_011_110_0(uniques, 9);
+  f_000_011_011_110_1(uniques, 9);
+  f_000_011_011_111_0(uniques, 9);
+  f_000_011_011_111_1(uniques, 9);
+  f_000_011_100_100_0(uniques, 9);
+  f_000_011_100_100_1(uniques, 9);
+  f_000_011_100_101_0(uniques, 9);
+  f_000_011_100_101_1(uniques, 9);
+  f_000_011_100_110_0(uniques, 9);
+  f_000_011_100_110_1(uniques, 9);
+  f_000_011_100_111_0(uniques, 9);
+  f_000_011_100_111_1(uniques, 9);
+  f_000_011_101_100_0(uniques, 9);
+  f_000_011_101_100_1(uniques, 9);
+  f_000_011_101_101_0(uniques, 9);
+  f_000_011_101_101_1(uniques, 9);
+  f_000_011_101_110_0(uniques, 9);
+  f_000_011_101_110_1(uniques, 9);
+  f_000_011_101_111_0(uniques, 9);
+  f_000_011_101_111_1(uniques, 9);
+  f_000_011_110_100_0(uniques, 9);
+  f_000_011_110_100_1(uniques, 9);
+  f_000_011_110_101_0(uniques, 9);
+  f_000_011_110_101_1(uniques, 9);
+  f_000_011_110_110_0(uniques, 9);
+  f_000_011_110_110_1(uniques, 9);
+  f_000_011_110_111_0(uniques, 9);
+  f_000_011_110_111_1(uniques, 9);
+  f_000_011_111_100_0(uniques, 9);
+  f_000_011_111_100_1(uniques, 9);
+  f_000_011_111_101_0(uniques, 9);
+  f_000_011_111_101_1(uniques, 9);
+  f_000_011_111_110_0(uniques, 9);
+  f_000_011_111_110_1(uniques, 9);
+  f_000_011_111_111_0(uniques, 9);
+  f_000_011_111_111_1(uniques, 9);
+  f_000_100_000_100_0(uniques, 9);
+  f_000_100_000_100_1(uniques, 9);
+  f_000_100_000_101_0(uniques, 9);
+  f_000_100_000_101_1(uniques, 9);
+  f_000_100_000_110_0(uniques, 9);
+  f_000_100_000_110_1(uniques, 9);
+  f_000_100_000_111_0(uniques, 9);
+  f_000_100_000_111_1(uniques, 9);
+  f_000_100_001_100_0(uniques, 9);
+  f_000_100_001_100_1(uniques, 9);
+  f_000_100_001_101_0(uniques, 9);
+  f_000_100_001_101_1(uniques, 9);
+  f_000_100_001_110_0(uniques, 9);
+  f_000_100_001_110_1(uniques, 9);
+  f_000_100_001_111_0(uniques, 9);
+  f_000_100_001_111_1(uniques, 9);
+  f_000_100_010_100_0(uniques, 9);
+  f_000_100_010_100_1(uniques, 9);
+  f_000_100_010_101_0(uniques, 9);
+  f_000_100_010_101_1(uniques, 9);
+  f_000_100_010_110_0(uniques, 9);
+  f_000_100_010_110_1(uniques, 9);
+  f_000_100_010_111_0(uniques, 9);
+  f_000_100_010_111_1(uniques, 9);
+  f_000_100_011_100_0(uniques, 9);
+  f_000_100_011_100_1(uniques, 9);
+  f_000_100_011_101_0(uniques, 9);
+  f_000_100_011_101_1(uniques, 9);
+  f_000_100_011_110_0(uniques, 9);
+  f_000_100_011_110_1(uniques, 9);
+  f_000_100_011_111_0(uniques, 9);
+  f_000_100_011_111_1(uniques, 9);
+  f_000_100_100_100_0(uniques, 9);
+  f_000_100_100_100_1(uniques, 9);
+  f_000_100_100_101_0(uniques, 9);
+  f_000_100_100_101_1(uniques, 9);
+  f_000_100_100_110_0(uniques, 9);
+  f_000_100_100_110_1(uniques, 9);
+  f_000_100_100_111_0(uniques, 9);
+  f_000_100_100_111_1(uniques, 9);
+  f_000_100_101_100_0(uniques, 9);
+  f_000_100_101_100_1(uniques, 9);
+  f_000_100_101_101_0(uniques, 9);
+  f_000_100_101_101_1(uniques, 9);
+  f_000_100_101_110_0(uniques, 9);
+  f_000_100_101_110_1(uniques, 9);
+  f_000_100_101_111_0(uniques, 9);
+  f_000_100_101_111_1(uniques, 9);
+  f_000_100_110_100_0(uniques, 9);
+  f_000_100_110_100_1(uniques, 9);
+  f_000_100_110_101_0(uniques, 9);
+  f_000_100_110_101_1(uniques, 9);
+  f_000_100_110_110_0(uniques, 9);
+  f_000_100_110_110_1(uniques, 9);
+  f_000_100_110_111_0(uniques, 9);
+  f_000_100_110_111_1(uniques, 9);
+  f_000_100_111_100_0(uniques, 9);
+  f_000_100_111_100_1(uniques, 9);
+  f_000_100_111_101_0(uniques, 9);
+  f_000_100_111_101_1(uniques, 9);
+  f_000_100_111_110_0(uniques, 9);
+  f_000_100_111_110_1(uniques, 9);
+  f_000_100_111_111_0(uniques, 9);
+  f_000_100_111_111_1(uniques, 9);
+  f_000_101_000_100_0(uniques, 9);
+  f_000_101_000_100_1(uniques, 9);
+  f_000_101_000_101_0(uniques, 9);
+  f_000_101_000_101_1(uniques, 9);
+  f_000_101_000_110_0(uniques, 9);
+  f_000_101_000_110_1(uniques, 9);
+  f_000_101_000_111_0(uniques, 9);
+  f_000_101_000_111_1(uniques, 9);
+  f_000_101_001_100_0(uniques, 9);
+  f_000_101_001_100_1(uniques, 9);
+  f_000_101_001_101_0(uniques, 9);
+  f_000_101_001_101_1(uniques, 9);
+  f_000_101_001_110_0(uniques, 9);
+  f_000_101_001_110_1(uniques, 9);
+  f_000_101_001_111_0(uniques, 9);
+  f_000_101_001_111_1(uniques, 9);
+  f_000_101_010_100_0(uniques, 9);
+  f_000_101_010_100_1(uniques, 9);
+  f_000_101_010_101_0(uniques, 9);
+  f_000_101_010_101_1(uniques, 9);
+  f_000_101_010_110_0(uniques, 9);
+  f_000_101_010_110_1(uniques, 9);
+  f_000_101_010_111_0(uniques, 9);
+  f_000_101_010_111_1(uniques, 9);
+  f_000_101_011_100_0(uniques, 9);
+  f_000_101_011_100_1(uniques, 9);
+  f_000_101_011_101_0(uniques, 9);
+  f_000_101_011_101_1(uniques, 9);
+  f_000_101_011_110_0(uniques, 9);
+  f_000_101_011_110_1(uniques, 9);
+  f_000_101_011_111_0(uniques, 9);
+  f_000_101_011_111_1(uniques, 9);
+  f_000_101_100_100_0(uniques, 9);
+  f_000_101_100_100_1(uniques, 9);
+  f_000_101_100_101_0(uniques, 9);
+  f_000_101_100_101_1(uniques, 9);
+  f_000_101_100_110_0(uniques, 9);
+  f_000_101_100_110_1(uniques, 9);
+  f_000_101_100_111_0(uniques, 9);
+  f_000_101_100_111_1(uniques, 9);
+  f_000_101_101_100_0(uniques, 9);
+  f_000_101_101_100_1(uniques, 9);
+  f_000_101_101_101_0(uniques, 9);
+  f_000_101_101_101_1(uniques, 9);
+  f_000_101_101_110_0(uniques, 9);
+  f_000_101_101_110_1(uniques, 9);
+  f_000_101_101_111_0(uniques, 9);
+  f_000_101_101_111_1(uniques, 9);
+  f_000_101_110_100_0(uniques, 9);
+  f_000_101_110_100_1(uniques, 9);
+  f_000_101_110_101_0(uniques, 9);
+  f_000_101_110_101_1(uniques, 9);
+  f_000_101_110_110_0(uniques, 9);
+  f_000_101_110_110_1(uniques, 9);
+  f_000_101_110_111_0(uniques, 9);
+  f_000_101_110_111_1(uniques, 9);
+  f_000_101_111_100_0(uniques, 9);
+  f_000_101_111_100_1(uniques, 9);
+  f_000_101_111_101_0(uniques, 9);
+  f_000_101_111_101_1(uniques, 9);
+  f_000_101_111_110_0(uniques, 9);
+  f_000_101_111_110_1(uniques, 9);
+  f_000_101_111_111_0(uniques, 9);
+  f_000_101_111_111_1(uniques, 9);
+  f_000_110_000_100_0(uniques, 9);
+  f_000_110_000_100_1(uniques, 9);
+  f_000_110_000_101_0(uniques, 9);
+  f_000_110_000_101_1(uniques, 9);
+  f_000_110_000_110_0(uniques, 9);
+  f_000_110_000_110_1(uniques, 9);
+  f_000_110_000_111_0(uniques, 9);
+  f_000_110_000_111_1(uniques, 9);
+  f_000_110_001_100_0(uniques, 9);
+  f_000_110_001_100_1(uniques, 9);
+  f_000_110_001_101_0(uniques, 9);
+  f_000_110_001_101_1(uniques, 9);
+  f_000_110_001_110_0(uniques, 9);
+  f_000_110_001_110_1(uniques, 9);
+  f_000_110_001_111_0(uniques, 9);
+  f_000_110_001_111_1(uniques, 9);
+  f_000_110_010_100_0(uniques, 9);
+  f_000_110_010_100_1(uniques, 9);
+  f_000_110_010_101_0(uniques, 9);
+  f_000_110_010_101_1(uniques, 9);
+  f_000_110_010_110_0(uniques, 9);
+  f_000_110_010_110_1(uniques, 9);
+  f_000_110_010_111_0(uniques, 9);
+  f_000_110_010_111_1(uniques, 9);
+  f_000_110_011_100_0(uniques, 9);
+  f_000_110_011_100_1(uniques, 9);
+  f_000_110_011_101_0(uniques, 9);
+  f_000_110_011_101_1(uniques, 9);
+  f_000_110_011_110_0(uniques, 9);
+  f_000_110_011_110_1(uniques, 9);
+  f_000_110_011_111_0(uniques, 9);
+  f_000_110_011_111_1(uniques, 9);
+  f_000_110_100_100_0(uniques, 9);
+  f_000_110_100_100_1(uniques, 9);
+  f_000_110_100_101_0(uniques, 9);
+  f_000_110_100_101_1(uniques, 9);
+  f_000_110_100_110_0(uniques, 9);
+  f_000_110_100_110_1(uniques, 9);
+  f_000_110_100_111_0(uniques, 9);
+  f_000_110_100_111_1(uniques, 9);
+  f_000_110_101_100_0(uniques, 9);
+  f_000_110_101_100_1(uniques, 9);
+  f_000_110_101_101_0(uniques, 9);
+  f_000_110_101_101_1(uniques, 9);
+  f_000_110_101_110_0(uniques, 9);
+  f_000_110_101_110_1(uniques, 9);
+  f_000_110_101_111_0(uniques, 9);
+  f_000_110_101_111_1(uniques, 9);
+  f_000_110_110_100_0(uniques, 9);
+  f_000_110_110_100_1(uniques, 9);
+  f_000_110_110_101_0(uniques, 9);
+  f_000_110_110_101_1(uniques, 9);
+  f_000_110_110_110_0(uniques, 9);
+  f_000_110_110_110_1(uniques, 9);
+  f_000_110_110_111_0(uniques, 9);
+  f_000_110_110_111_1(uniques, 9);
+  f_000_110_111_100_0(uniques, 9);
+  f_000_110_111_100_1(uniques, 9);
+  f_000_110_111_101_0(uniques, 9);
+  f_000_110_111_101_1(uniques, 9);
+  f_000_110_111_110_0(uniques, 9);
+  f_000_110_111_110_1(uniques, 9);
+  f_000_110_111_111_0(uniques, 9);
+  f_000_110_111_111_1(uniques, 9);
+  f_000_111_000_100_0(uniques, 9);
+  f_000_111_000_100_1(uniques, 9);
+  f_000_111_000_101_0(uniques, 9);
+  f_000_111_000_101_1(uniques, 9);
+  f_000_111_000_110_0(uniques, 9);
+  f_000_111_000_110_1(uniques, 9);
+  f_000_111_000_111_0(uniques, 9);
+  f_000_111_000_111_1(uniques, 9);
+  f_000_111_001_100_0(uniques, 9);
+  f_000_111_001_100_1(uniques, 9);
+  f_000_111_001_101_0(uniques, 9);
+  f_000_111_001_101_1(uniques, 9);
+  f_000_111_001_110_0(uniques, 9);
+  f_000_111_001_110_1(uniques, 9);
+  f_000_111_001_111_0(uniques, 9);
+  f_000_111_001_111_1(uniques, 9);
+  f_000_111_010_100_0(uniques, 9);
+  f_000_111_010_100_1(uniques, 9);
+  f_000_111_010_101_0(uniques, 9);
+  f_000_111_010_101_1(uniques, 9);
+  f_000_111_010_110_0(uniques, 9);
+  f_000_111_010_110_1(uniques, 9);
+  f_000_111_010_111_0(uniques, 9);
+  f_000_111_010_111_1(uniques, 9);
+  f_000_111_011_100_0(uniques, 9);
+  f_000_111_011_100_1(uniques, 9);
+  f_000_111_011_101_0(uniques, 9);
+  f_000_111_011_101_1(uniques, 9);
+  f_000_111_011_110_0(uniques, 9);
+  f_000_111_011_110_1(uniques, 9);
+  f_000_111_011_111_0(uniques, 9);
+  f_000_111_011_111_1(uniques, 9);
+  f_000_111_100_100_0(uniques, 9);
+  f_000_111_100_100_1(uniques, 9);
+  f_000_111_100_101_0(uniques, 9);
+  f_000_111_100_101_1(uniques, 9);
+  f_000_111_100_110_0(uniques, 9);
+  f_000_111_100_110_1(uniques, 9);
+  f_000_111_100_111_0(uniques, 9);
+  f_000_111_100_111_1(uniques, 9);
+  f_000_111_101_100_0(uniques, 9);
+  f_000_111_101_100_1(uniques, 9);
+  f_000_111_101_101_0(uniques, 9);
+  f_000_111_101_101_1(uniques, 9);
+  f_000_111_101_110_0(uniques, 9);
+  f_000_111_101_110_1(uniques, 9);
+  f_000_111_101_111_0(uniques, 9);
+  f_000_111_101_111_1(uniques, 9);
+  f_000_111_110_100_0(uniques, 9);
+  f_000_111_110_100_1(uniques, 9);
+  f_000_111_110_101_0(uniques, 9);
+  f_000_111_110_101_1(uniques, 9);
+  f_000_111_110_110_0(uniques, 9);
+  f_000_111_110_110_1(uniques, 9);
+  f_000_111_110_111_0(uniques, 9);
+  f_000_111_110_111_1(uniques, 9);
+  f_000_111_111_100_0(uniques, 9);
+  f_000_111_111_100_1(uniques, 9);
+  f_000_111_111_101_0(uniques, 9);
+  f_000_111_111_101_1(uniques, 9);
+  f_000_111_111_110_0(uniques, 9);
+  f_000_111_111_110_1(uniques, 9);
+  f_000_111_111_111_0(uniques, 9);
+  f_000_111_111_111_1(uniques, 9);
+  f_001_000_000_100_0(uniques, 9);
+  f_001_000_000_100_1(uniques, 9);
+  f_001_000_000_101_0(uniques, 9);
+  f_001_000_000_101_1(uniques, 9);
+  f_001_000_000_110_0(uniques, 9);
+  f_001_000_000_110_1(uniques, 9);
+  f_001_000_000_111_0(uniques, 9);
+  f_001_000_000_111_1(uniques, 9);
+  f_001_000_001_100_0(uniques, 9);
+  f_001_000_001_100_1(uniques, 9);
+  f_001_000_001_101_0(uniques, 9);
+  f_001_000_001_101_1(uniques, 9);
+  f_001_000_001_110_0(uniques, 9);
+  f_001_000_001_110_1(uniques, 9);
+  f_001_000_001_111_0(uniques, 9);
+  f_001_000_001_111_1(uniques, 9);
+  f_001_000_010_100_0(uniques, 9);
+  f_001_000_010_100_1(uniques, 9);
+  f_001_000_010_101_0(uniques, 9);
+  f_001_000_010_101_1(uniques, 9);
+  f_001_000_010_110_0(uniques, 9);
+  f_001_000_010_110_1(uniques, 9);
+  f_001_000_010_111_0(uniques, 9);
+  f_001_000_010_111_1(uniques, 9);
+  f_001_000_011_100_0(uniques, 9);
+  f_001_000_011_100_1(uniques, 9);
+  f_001_000_011_101_0(uniques, 9);
+  f_001_000_011_101_1(uniques, 9);
+  f_001_000_011_110_0(uniques, 9);
+  f_001_000_011_110_1(uniques, 9);
+  f_001_000_011_111_0(uniques, 9);
+  f_001_000_011_111_1(uniques, 9);
+  f_001_000_100_100_0(uniques, 9);
+  f_001_000_100_100_1(uniques, 9);
+  f_001_000_100_101_0(uniques, 9);
+  f_001_000_100_101_1(uniques, 9);
+  f_001_000_100_110_0(uniques, 9);
+  f_001_000_100_110_1(uniques, 9);
+  f_001_000_100_111_0(uniques, 9);
+  f_001_000_100_111_1(uniques, 9);
+  f_001_000_101_100_0(uniques, 9);
+  f_001_000_101_100_1(uniques, 9);
+  f_001_000_101_101_0(uniques, 9);
+  f_001_000_101_101_1(uniques, 9);
+  f_001_000_101_110_0(uniques, 9);
+  f_001_000_101_110_1(uniques, 9);
+  f_001_000_101_111_0(uniques, 9);
+  f_001_000_101_111_1(uniques, 9);
+  f_001_000_110_100_0(uniques, 9);
+  f_001_000_110_100_1(uniques, 9);
+  f_001_000_110_101_0(uniques, 9);
+  f_001_000_110_101_1(uniques, 9);
+  f_001_000_110_110_0(uniques, 9);
+  f_001_000_110_110_1(uniques, 9);
+  f_001_000_110_111_0(uniques, 9);
+  f_001_000_110_111_1(uniques, 9);
+  f_001_000_111_100_0(uniques, 9);
+  f_001_000_111_100_1(uniques, 9);
+  f_001_000_111_101_0(uniques, 9);
+  f_001_000_111_101_1(uniques, 9);
+  f_001_000_111_110_0(uniques, 9);
+  f_001_000_111_110_1(uniques, 9);
+  f_001_000_111_111_0(uniques, 9);
+  f_001_000_111_111_1(uniques, 9);
+  f_001_001_000_100_0(uniques, 9);
+  f_001_001_000_100_1(uniques, 9);
+  f_001_001_000_101_0(uniques, 9);
+  f_001_001_000_101_1(uniques, 9);
+  f_001_001_000_110_0(uniques, 9);
+  f_001_001_000_110_1(uniques, 9);
+  f_001_001_000_111_0(uniques, 9);
+  f_001_001_000_111_1(uniques, 9);
+  f_001_001_001_100_0(uniques, 9);
+  f_001_001_001_100_1(uniques, 9);
+  f_001_001_001_101_0(uniques, 9);
+  f_001_001_001_101_1(uniques, 9);
+  f_001_001_001_110_0(uniques, 9);
+  f_001_001_001_110_1(uniques, 9);
+  f_001_001_001_111_0(uniques, 9);
+  f_001_001_001_111_1(uniques, 9);
+  f_001_001_010_100_0(uniques, 9);
+  f_001_001_010_100_1(uniques, 9);
+  f_001_001_010_101_0(uniques, 9);
+  f_001_001_010_101_1(uniques, 9);
+  f_001_001_010_110_0(uniques, 9);
+  f_001_001_010_110_1(uniques, 9);
+  f_001_001_010_111_0(uniques, 9);
+  f_001_001_010_111_1(uniques, 9);
+  f_001_001_011_100_0(uniques, 9);
+  f_001_001_011_100_1(uniques, 9);
+  f_001_001_011_101_0(uniques, 9);
+  f_001_001_011_101_1(uniques, 9);
+  f_001_001_011_110_0(uniques, 9);
+  f_001_001_011_110_1(uniques, 9);
+  f_001_001_011_111_0(uniques, 9);
+  f_001_001_011_111_1(uniques, 9);
+  f_001_001_100_100_0(uniques, 9);
+  f_001_001_100_100_1(uniques, 9);
+  f_001_001_100_101_0(uniques, 9);
+  f_001_001_100_101_1(uniques, 9);
+  f_001_001_100_110_0(uniques, 9);
+  f_001_001_100_110_1(uniques, 9);
+  f_001_001_100_111_0(uniques, 9);
+  f_001_001_100_111_1(uniques, 9);
+  f_001_001_101_100_0(uniques, 9);
+  f_001_001_101_100_1(uniques, 9);
+  f_001_001_101_101_0(uniques, 9);
+  f_001_001_101_101_1(uniques, 9);
+  f_001_001_101_110_0(uniques, 9);
+  f_001_001_101_110_1(uniques, 9);
+  f_001_001_101_111_0(uniques, 9);
+  f_001_001_101_111_1(uniques, 9);
+  f_001_001_110_100_0(uniques, 9);
+  f_001_001_110_100_1(uniques, 9);
+  f_001_001_110_101_0(uniques, 9);
+  f_001_001_110_101_1(uniques, 9);
+  f_001_001_110_110_0(uniques, 9);
+  f_001_001_110_110_1(uniques, 9);
+  f_001_001_110_111_0(uniques, 9);
+  f_001_001_110_111_1(uniques, 9);
+  f_001_001_111_100_0(uniques, 9);
+  f_001_001_111_100_1(uniques, 9);
+  f_001_001_111_101_0(uniques, 9);
+  f_001_001_111_101_1(uniques, 9);
+  f_001_001_111_110_0(uniques, 9);
+  f_001_001_111_110_1(uniques, 9);
+  f_001_001_111_111_0(uniques, 9);
+  f_001_001_111_111_1(uniques, 9);
+  f_001_010_000_100_0(uniques, 9);
+  f_001_010_000_100_1(uniques, 9);
+  f_001_010_000_101_0(uniques, 9);
+  f_001_010_000_101_1(uniques, 9);
+  f_001_010_000_110_0(uniques, 9);
+  f_001_010_000_110_1(uniques, 9);
+  f_001_010_000_111_0(uniques, 9);
+  f_001_010_000_111_1(uniques, 9);
+  f_001_010_001_100_0(uniques, 9);
+  f_001_010_001_100_1(uniques, 9);
+  f_001_010_001_101_0(uniques, 9);
+  f_001_010_001_101_1(uniques, 9);
+  f_001_010_001_110_0(uniques, 9);
+  f_001_010_001_110_1(uniques, 9);
+  f_001_010_001_111_0(uniques, 9);
+  f_001_010_001_111_1(uniques, 9);
+  f_001_010_010_100_0(uniques, 9);
+  f_001_010_010_100_1(uniques, 9);
+  f_001_010_010_101_0(uniques, 9);
+  f_001_010_010_101_1(uniques, 9);
+  f_001_010_010_110_0(uniques, 9);
+  f_001_010_010_110_1(uniques, 9);
+  f_001_010_010_111_0(uniques, 9);
+  f_001_010_010_111_1(uniques, 9);
+  f_001_010_011_100_0(uniques, 9);
+  f_001_010_011_100_1(uniques, 9);
+  f_001_010_011_101_0(uniques, 9);
+  f_001_010_011_101_1(uniques, 9);
+  f_001_010_011_110_0(uniques, 9);
+  f_001_010_011_110_1(uniques, 9);
+  f_001_010_011_111_0(uniques, 9);
+  f_001_010_011_111_1(uniques, 9);
+  f_001_010_100_100_0(uniques, 9);
+  f_001_010_100_100_1(uniques, 9);
+  f_001_010_100_101_0(uniques, 9);
+  f_001_010_100_101_1(uniques, 9);
+  f_001_010_100_110_0(uniques, 9);
+  f_001_010_100_110_1(uniques, 9);
+  f_001_010_100_111_0(uniques, 9);
+  f_001_010_100_111_1(uniques, 9);
+  f_001_010_101_100_0(uniques, 9);
+  f_001_010_101_100_1(uniques, 9);
+  f_001_010_101_101_0(uniques, 9);
+  f_001_010_101_101_1(uniques, 9);
+  f_001_010_101_110_0(uniques, 9);
+  f_001_010_101_110_1(uniques, 9);
+  f_001_010_101_111_0(uniques, 9);
+  f_001_010_101_111_1(uniques, 9);
+  f_001_010_110_100_0(uniques, 9);
+  f_001_010_110_100_1(uniques, 9);
+  f_001_010_110_101_0(uniques, 9);
+  f_001_010_110_101_1(uniques, 9);
+  f_001_010_110_110_0(uniques, 9);
+  f_001_010_110_110_1(uniques, 9);
+  f_001_010_110_111_0(uniques, 9);
+  f_001_010_110_111_1(uniques, 9);
+  f_001_010_111_100_0(uniques, 9);
+  f_001_010_111_100_1(uniques, 9);
+  f_001_010_111_101_0(uniques, 9);
+  f_001_010_111_101_1(uniques, 9);
+  f_001_010_111_110_0(uniques, 9);
+  f_001_010_111_110_1(uniques, 9);
+  f_001_010_111_111_0(uniques, 9);
+  f_001_010_111_111_1(uniques, 9);
+  f_001_011_000_100_0(uniques, 9);
+  f_001_011_000_100_1(uniques, 9);
+  f_001_011_000_101_0(uniques, 9);
+  f_001_011_000_101_1(uniques, 9);
+  f_001_011_000_110_0(uniques, 9);
+  f_001_011_000_110_1(uniques, 9);
+  f_001_011_000_111_0(uniques, 9);
+  f_001_011_000_111_1(uniques, 9);
+  f_001_011_001_100_0(uniques, 9);
+  f_001_011_001_100_1(uniques, 9);
+  f_001_011_001_101_0(uniques, 9);
+  f_001_011_001_101_1(uniques, 9);
+  f_001_011_001_110_0(uniques, 9);
+  f_001_011_001_110_1(uniques, 9);
+  f_001_011_001_111_0(uniques, 9);
+  f_001_011_001_111_1(uniques, 9);
+  f_001_011_010_100_0(uniques, 9);
+  f_001_011_010_100_1(uniques, 9);
+  f_001_011_010_101_0(uniques, 9);
+  f_001_011_010_101_1(uniques, 9);
+  f_001_011_010_110_0(uniques, 9);
+  f_001_011_010_110_1(uniques, 9);
+  f_001_011_010_111_0(uniques, 9);
+  f_001_011_010_111_1(uniques, 9);
+  f_001_011_011_100_0(uniques, 9);
+  f_001_011_011_100_1(uniques, 9);
+  f_001_011_011_101_0(uniques, 9);
+  f_001_011_011_101_1(uniques, 9);
+  f_001_011_011_110_0(uniques, 9);
+  f_001_011_011_110_1(uniques, 9);
+  f_001_011_011_111_0(uniques, 9);
+  f_001_011_011_111_1(uniques, 9);
+  f_001_011_100_100_0(uniques, 9);
+  f_001_011_100_100_1(uniques, 9);
+  f_001_011_100_101_0(uniques, 9);
+  f_001_011_100_101_1(uniques, 9);
+  f_001_011_100_110_0(uniques, 9);
+  f_001_011_100_110_1(uniques, 9);
+  f_001_011_100_111_0(uniques, 9);
+  f_001_011_100_111_1(uniques, 9);
+  f_001_011_101_100_0(uniques, 9);
+  f_001_011_101_100_1(uniques, 9);
+  f_001_011_101_101_0(uniques, 9);
+  f_001_011_101_101_1(uniques, 9);
+  f_001_011_101_110_0(uniques, 9);
+  f_001_011_101_110_1(uniques, 9);
+  f_001_011_101_111_0(uniques, 9);
+  f_001_011_101_111_1(uniques, 9);
+  f_001_011_110_100_0(uniques, 9);
+  f_001_011_110_100_1(uniques, 9);
+  f_001_011_110_101_0(uniques, 9);
+  f_001_011_110_101_1(uniques, 9);
+  f_001_011_110_110_0(uniques, 9);
+  f_001_011_110_110_1(uniques, 9);
+  f_001_011_110_111_0(uniques, 9);
+  f_001_011_110_111_1(uniques, 9);
+  f_001_011_111_100_0(uniques, 9);
+  f_001_011_111_100_1(uniques, 9);
+  f_001_011_111_101_0(uniques, 9);
+  f_001_011_111_101_1(uniques, 9);
+  f_001_011_111_110_0(uniques, 9);
+  f_001_011_111_110_1(uniques, 9);
+  f_001_011_111_111_0(uniques, 9);
+  f_001_011_111_111_1(uniques, 9);
+  f_001_100_000_100_0(uniques, 9);
+  f_001_100_000_100_1(uniques, 9);
+  f_001_100_000_101_0(uniques, 9);
+  f_001_100_000_101_1(uniques, 9);
+  f_001_100_000_110_0(uniques, 9);
+  f_001_100_000_110_1(uniques, 9);
+  f_001_100_000_111_0(uniques, 9);
+  f_001_100_000_111_1(uniques, 9);
+  f_001_100_001_100_0(uniques, 9);
+  f_001_100_001_100_1(uniques, 9);
+  f_001_100_001_101_0(uniques, 9);
+  f_001_100_001_101_1(uniques, 9);
+  f_001_100_001_110_0(uniques, 9);
+  f_001_100_001_110_1(uniques, 9);
+  f_001_100_001_111_0(uniques, 9);
+  f_001_100_001_111_1(uniques, 9);
+  f_001_100_010_100_0(uniques, 9);
+  f_001_100_010_100_1(uniques, 9);
+  f_001_100_010_101_0(uniques, 9);
+  f_001_100_010_101_1(uniques, 9);
+  f_001_100_010_110_0(uniques, 9);
+  f_001_100_010_110_1(uniques, 9);
+  f_001_100_010_111_0(uniques, 9);
+  f_001_100_010_111_1(uniques, 9);
+  f_001_100_011_100_0(uniques, 9);
+  f_001_100_011_100_1(uniques, 9);
+  f_001_100_011_101_0(uniques, 9);
+  f_001_100_011_101_1(uniques, 9);
+  f_001_100_011_110_0(uniques, 9);
+  f_001_100_011_110_1(uniques, 9);
+  f_001_100_011_111_0(uniques, 9);
+  f_001_100_011_111_1(uniques, 9);
+  f_001_100_100_100_0(uniques, 9);
+  f_001_100_100_100_1(uniques, 9);
+  f_001_100_100_101_0(uniques, 9);
+  f_001_100_100_101_1(uniques, 9);
+  f_001_100_100_110_0(uniques, 9);
+  f_001_100_100_110_1(uniques, 9);
+  f_001_100_100_111_0(uniques, 9);
+  f_001_100_100_111_1(uniques, 9);
+  f_001_100_101_100_0(uniques, 9);
+  f_001_100_101_100_1(uniques, 9);
+  f_001_100_101_101_0(uniques, 9);
+  f_001_100_101_101_1(uniques, 9);
+  f_001_100_101_110_0(uniques, 9);
+  f_001_100_101_110_1(uniques, 9);
+  f_001_100_101_111_0(uniques, 9);
+  f_001_100_101_111_1(uniques, 9);
+  f_001_100_110_100_0(uniques, 9);
+  f_001_100_110_100_1(uniques, 9);
+  f_001_100_110_101_0(uniques, 9);
+  f_001_100_110_101_1(uniques, 9);
+  f_001_100_110_110_0(uniques, 9);
+  f_001_100_110_110_1(uniques, 9);
+  f_001_100_110_111_0(uniques, 9);
+  f_001_100_110_111_1(uniques, 9);
+  f_001_100_111_100_0(uniques, 9);
+  f_001_100_111_100_1(uniques, 9);
+  f_001_100_111_101_0(uniques, 9);
+  f_001_100_111_101_1(uniques, 9);
+  f_001_100_111_110_0(uniques, 9);
+  f_001_100_111_110_1(uniques, 9);
+  f_001_100_111_111_0(uniques, 9);
+  f_001_100_111_111_1(uniques, 9);
+  f_001_101_000_100_0(uniques, 9);
+  f_001_101_000_100_1(uniques, 9);
+  f_001_101_000_101_0(uniques, 9);
+  f_001_101_000_101_1(uniques, 9);
+  f_001_101_000_110_0(uniques, 9);
+  f_001_101_000_110_1(uniques, 9);
+  f_001_101_000_111_0(uniques, 9);
+  f_001_101_000_111_1(uniques, 9);
+  f_001_101_001_100_0(uniques, 9);
+  f_001_101_001_100_1(uniques, 9);
+  f_001_101_001_101_0(uniques, 9);
+  f_001_101_001_101_1(uniques, 9);
+  f_001_101_001_110_0(uniques, 9);
+  f_001_101_001_110_1(uniques, 9);
+  f_001_101_001_111_0(uniques, 9);
+  f_001_101_001_111_1(uniques, 9);
+  f_001_101_010_100_0(uniques, 9);
+  f_001_101_010_100_1(uniques, 9);
+  f_001_101_010_101_0(uniques, 9);
+  f_001_101_010_101_1(uniques, 9);
+  f_001_101_010_110_0(uniques, 9);
+  f_001_101_010_110_1(uniques, 9);
+  f_001_101_010_111_0(uniques, 9);
+  f_001_101_010_111_1(uniques, 9);
+  f_001_101_011_100_0(uniques, 9);
+  f_001_101_011_100_1(uniques, 9);
+  f_001_101_011_101_0(uniques, 9);
+  f_001_101_011_101_1(uniques, 9);
+  f_001_101_011_110_0(uniques, 9);
+  f_001_101_011_110_1(uniques, 9);
+  f_001_101_011_111_0(uniques, 9);
+  f_001_101_011_111_1(uniques, 9);
+  f_001_101_100_100_0(uniques, 9);
+  f_001_101_100_100_1(uniques, 9);
+  f_001_101_100_101_0(uniques, 9);
+  f_001_101_100_101_1(uniques, 9);
+  f_001_101_100_110_0(uniques, 9);
+  f_001_101_100_110_1(uniques, 9);
+  f_001_101_100_111_0(uniques, 9);
+  f_001_101_100_111_1(uniques, 9);
+  f_001_101_101_100_0(uniques, 9);
+  f_001_101_101_100_1(uniques, 9);
+  f_001_101_101_101_0(uniques, 9);
+  f_001_101_101_101_1(uniques, 9);
+  f_001_101_101_110_0(uniques, 9);
+  f_001_101_101_110_1(uniques, 9);
+  f_001_101_101_111_0(uniques, 9);
+  f_001_101_101_111_1(uniques, 9);
+  f_001_101_110_100_0(uniques, 9);
+  f_001_101_110_100_1(uniques, 9);
+  f_001_101_110_101_0(uniques, 9);
+  f_001_101_110_101_1(uniques, 9);
+  f_001_101_110_110_0(uniques, 9);
+  f_001_101_110_110_1(uniques, 9);
+  f_001_101_110_111_0(uniques, 9);
+  f_001_101_110_111_1(uniques, 9);
+  f_001_101_111_100_0(uniques, 9);
+  f_001_101_111_100_1(uniques, 9);
+  f_001_101_111_101_0(uniques, 9);
+  f_001_101_111_101_1(uniques, 9);
+  f_001_101_111_110_0(uniques, 9);
+  f_001_101_111_110_1(uniques, 9);
+  f_001_101_111_111_0(uniques, 9);
+  f_001_101_111_111_1(uniques, 9);
+  f_001_110_000_100_0(uniques, 9);
+  f_001_110_000_100_1(uniques, 9);
+  f_001_110_000_101_0(uniques, 9);
+  f_001_110_000_101_1(uniques, 9);
+  f_001_110_000_110_0(uniques, 9);
+  f_001_110_000_110_1(uniques, 9);
+  f_001_110_000_111_0(uniques, 9);
+  f_001_110_000_111_1(uniques, 9);
+  f_001_110_001_100_0(uniques, 9);
+  f_001_110_001_100_1(uniques, 9);
+  f_001_110_001_101_0(uniques, 9);
+  f_001_110_001_101_1(uniques, 9);
+  f_001_110_001_110_0(uniques, 9);
+  f_001_110_001_110_1(uniques, 9);
+  f_001_110_001_111_0(uniques, 9);
+  f_001_110_001_111_1(uniques, 9);
+  f_001_110_010_100_0(uniques, 9);
+  f_001_110_010_100_1(uniques, 9);
+  f_001_110_010_101_0(uniques, 9);
+  f_001_110_010_101_1(uniques, 9);
+  f_001_110_010_110_0(uniques, 9);
+  f_001_110_010_110_1(uniques, 9);
+  f_001_110_010_111_0(uniques, 9);
+  f_001_110_010_111_1(uniques, 9);
+  f_001_110_011_100_0(uniques, 9);
+  f_001_110_011_100_1(uniques, 9);
+  f_001_110_011_101_0(uniques, 9);
+  f_001_110_011_101_1(uniques, 9);
+  f_001_110_011_110_0(uniques, 9);
+  f_001_110_011_110_1(uniques, 9);
+  f_001_110_011_111_0(uniques, 9);
+  f_001_110_011_111_1(uniques, 9);
+  f_001_110_100_100_0(uniques, 9);
+  f_001_110_100_100_1(uniques, 9);
+  f_001_110_100_101_0(uniques, 9);
+  f_001_110_100_101_1(uniques, 9);
+  f_001_110_100_110_0(uniques, 9);
+  f_001_110_100_110_1(uniques, 9);
+  f_001_110_100_111_0(uniques, 9);
+  f_001_110_100_111_1(uniques, 9);
+  f_001_110_101_100_0(uniques, 9);
+  f_001_110_101_100_1(uniques, 9);
+  f_001_110_101_101_0(uniques, 9);
+  f_001_110_101_101_1(uniques, 9);
+  f_001_110_101_110_0(uniques, 9);
+  f_001_110_101_110_1(uniques, 9);
+  f_001_110_101_111_0(uniques, 9);
+  f_001_110_101_111_1(uniques, 9);
+  f_001_110_110_100_0(uniques, 9);
+  f_001_110_110_100_1(uniques, 9);
+  f_001_110_110_101_0(uniques, 9);
+  f_001_110_110_101_1(uniques, 9);
+  f_001_110_110_110_0(uniques, 9);
+  f_001_110_110_110_1(uniques, 9);
+  f_001_110_110_111_0(uniques, 9);
+  f_001_110_110_111_1(uniques, 9);
+  f_001_110_111_100_0(uniques, 9);
+  f_001_110_111_100_1(uniques, 9);
+  f_001_110_111_101_0(uniques, 9);
+  f_001_110_111_101_1(uniques, 9);
+  f_001_110_111_110_0(uniques, 9);
+  f_001_110_111_110_1(uniques, 9);
+  f_001_110_111_111_0(uniques, 9);
+  f_001_110_111_111_1(uniques, 9);
+  f_001_111_000_100_0(uniques, 9);
+  f_001_111_000_100_1(uniques, 9);
+  f_001_111_000_101_0(uniques, 9);
+  f_001_111_000_101_1(uniques, 9);
+  f_001_111_000_110_0(uniques, 9);
+  f_001_111_000_110_1(uniques, 9);
+  f_001_111_000_111_0(uniques, 9);
+  f_001_111_000_111_1(uniques, 9);
+  f_001_111_001_100_0(uniques, 9);
+  f_001_111_001_100_1(uniques, 9);
+  f_001_111_001_101_0(uniques, 9);
+  f_001_111_001_101_1(uniques, 9);
+  f_001_111_001_110_0(uniques, 9);
+  f_001_111_001_110_1(uniques, 9);
+  f_001_111_001_111_0(uniques, 9);
+  f_001_111_001_111_1(uniques, 9);
+  f_001_111_010_100_0(uniques, 9);
+  f_001_111_010_100_1(uniques, 9);
+  f_001_111_010_101_0(uniques, 9);
+  f_001_111_010_101_1(uniques, 9);
+  f_001_111_010_110_0(uniques, 9);
+  f_001_111_010_110_1(uniques, 9);
+  f_001_111_010_111_0(uniques, 9);
+  f_001_111_010_111_1(uniques, 9);
+  f_001_111_011_100_0(uniques, 9);
+  f_001_111_011_100_1(uniques, 9);
+  f_001_111_011_101_0(uniques, 9);
+  f_001_111_011_101_1(uniques, 9);
+  f_001_111_011_110_0(uniques, 9);
+  f_001_111_011_110_1(uniques, 9);
+  f_001_111_011_111_0(uniques, 9);
+  f_001_111_011_111_1(uniques, 9);
+  f_001_111_100_100_0(uniques, 9);
+  f_001_111_100_100_1(uniques, 9);
+  f_001_111_100_101_0(uniques, 9);
+  f_001_111_100_101_1(uniques, 9);
+  f_001_111_100_110_0(uniques, 9);
+  f_001_111_100_110_1(uniques, 9);
+  f_001_111_100_111_0(uniques, 9);
+  f_001_111_100_111_1(uniques, 9);
+  f_001_111_101_100_0(uniques, 9);
+  f_001_111_101_100_1(uniques, 9);
+  f_001_111_101_101_0(uniques, 9);
+  f_001_111_101_101_1(uniques, 9);
+  f_001_111_101_110_0(uniques, 9);
+  f_001_111_101_110_1(uniques, 9);
+  f_001_111_101_111_0(uniques, 9);
+  f_001_111_101_111_1(uniques, 9);
+  f_001_111_110_100_0(uniques, 9);
+  f_001_111_110_100_1(uniques, 9);
+  f_001_111_110_101_0(uniques, 9);
+  f_001_111_110_101_1(uniques, 9);
+  f_001_111_110_110_0(uniques, 9);
+  f_001_111_110_110_1(uniques, 9);
+  f_001_111_110_111_0(uniques, 9);
+  f_001_111_110_111_1(uniques, 9);
+  f_001_111_111_100_0(uniques, 9);
+  f_001_111_111_100_1(uniques, 9);
+  f_001_111_111_101_0(uniques, 9);
+  f_001_111_111_101_1(uniques, 9);
+  f_001_111_111_110_0(uniques, 9);
+  f_001_111_111_110_1(uniques, 9);
+  f_001_111_111_111_0(uniques, 9);
+  f_001_111_111_111_1(uniques, 9);
+  f_010_000_000_100_0(uniques, 9);
+  f_010_000_000_100_1(uniques, 9);
+  f_010_000_000_101_0(uniques, 9);
+  f_010_000_000_101_1(uniques, 9);
+  f_010_000_000_110_0(uniques, 9);
+  f_010_000_000_110_1(uniques, 9);
+  f_010_000_000_111_0(uniques, 9);
+  f_010_000_000_111_1(uniques, 9);
+  f_010_000_001_100_0(uniques, 9);
+  f_010_000_001_100_1(uniques, 9);
+  f_010_000_001_101_0(uniques, 9);
+  f_010_000_001_101_1(uniques, 9);
+  f_010_000_001_110_0(uniques, 9);
+  f_010_000_001_110_1(uniques, 9);
+  f_010_000_001_111_0(uniques, 9);
+  f_010_000_001_111_1(uniques, 9);
+  f_010_000_010_100_0(uniques, 9);
+  f_010_000_010_100_1(uniques, 9);
+  f_010_000_010_101_0(uniques, 9);
+  f_010_000_010_101_1(uniques, 9);
+  f_010_000_010_110_0(uniques, 9);
+  f_010_000_010_110_1(uniques, 9);
+  f_010_000_010_111_0(uniques, 9);
+  f_010_000_010_111_1(uniques, 9);
+  f_010_000_011_100_0(uniques, 9);
+  f_010_000_011_100_1(uniques, 9);
+  f_010_000_011_101_0(uniques, 9);
+  f_010_000_011_101_1(uniques, 9);
+  f_010_000_011_110_0(uniques, 9);
+  f_010_000_011_110_1(uniques, 9);
+  f_010_000_011_111_0(uniques, 9);
+  f_010_000_011_111_1(uniques, 9);
+  f_010_000_100_100_0(uniques, 9);
+  f_010_000_100_100_1(uniques, 9);
+  f_010_000_100_101_0(uniques, 9);
+  f_010_000_100_101_1(uniques, 9);
+  f_010_000_100_110_0(uniques, 9);
+  f_010_000_100_110_1(uniques, 9);
+  f_010_000_100_111_0(uniques, 9);
+  f_010_000_100_111_1(uniques, 9);
+  f_010_000_101_100_0(uniques, 9);
+  f_010_000_101_100_1(uniques, 9);
+  f_010_000_101_101_0(uniques, 9);
+  f_010_000_101_101_1(uniques, 9);
+  f_010_000_101_110_0(uniques, 9);
+  f_010_000_101_110_1(uniques, 9);
+  f_010_000_101_111_0(uniques, 9);
+  f_010_000_101_111_1(uniques, 9);
+  f_010_000_110_100_0(uniques, 9);
+  f_010_000_110_100_1(uniques, 9);
+  f_010_000_110_101_0(uniques, 9);
+  f_010_000_110_101_1(uniques, 9);
+  f_010_000_110_110_0(uniques, 9);
+  f_010_000_110_110_1(uniques, 9);
+  f_010_000_110_111_0(uniques, 9);
+  f_010_000_110_111_1(uniques, 9);
+  f_010_000_111_100_0(uniques, 9);
+  f_010_000_111_100_1(uniques, 9);
+  f_010_000_111_101_0(uniques, 9);
+  f_010_000_111_101_1(uniques, 9);
+  f_010_000_111_110_0(uniques, 9);
+  f_010_000_111_110_1(uniques, 9);
+  f_010_000_111_111_0(uniques, 9);
+  f_010_000_111_111_1(uniques, 9);
+  f_010_001_000_100_0(uniques, 9);
+  f_010_001_000_100_1(uniques, 9);
+  f_010_001_000_101_0(uniques, 9);
+  f_010_001_000_101_1(uniques, 9);
+  f_010_001_000_110_0(uniques, 9);
+  f_010_001_000_110_1(uniques, 9);
+  f_010_001_000_111_0(uniques, 9);
+  f_010_001_000_111_1(uniques, 9);
+  f_010_001_001_100_0(uniques, 9);
+  f_010_001_001_100_1(uniques, 9);
+  f_010_001_001_101_0(uniques, 9);
+  f_010_001_001_101_1(uniques, 9);
+  f_010_001_001_110_0(uniques, 9);
+  f_010_001_001_110_1(uniques, 9);
+  f_010_001_001_111_0(uniques, 9);
+  f_010_001_001_111_1(uniques, 9);
+  f_010_001_010_100_0(uniques, 9);
+  f_010_001_010_100_1(uniques, 9);
+  f_010_001_010_101_0(uniques, 9);
+  f_010_001_010_101_1(uniques, 9);
+  f_010_001_010_110_0(uniques, 9);
+  f_010_001_010_110_1(uniques, 9);
+  f_010_001_010_111_0(uniques, 9);
+  f_010_001_010_111_1(uniques, 9);
+  f_010_001_011_100_0(uniques, 9);
+  f_010_001_011_100_1(uniques, 9);
+  f_010_001_011_101_0(uniques, 9);
+  f_010_001_011_101_1(uniques, 9);
+  f_010_001_011_110_0(uniques, 9);
+  f_010_001_011_110_1(uniques, 9);
+  f_010_001_011_111_0(uniques, 9);
+  f_010_001_011_111_1(uniques, 9);
+  f_010_001_100_100_0(uniques, 9);
+  f_010_001_100_100_1(uniques, 9);
+  f_010_001_100_101_0(uniques, 9);
+  f_010_001_100_101_1(uniques, 9);
+  f_010_001_100_110_0(uniques, 9);
+  f_010_001_100_110_1(uniques, 9);
+  f_010_001_100_111_0(uniques, 9);
+  f_010_001_100_111_1(uniques, 9);
+  f_010_001_101_100_0(uniques, 9);
+  f_010_001_101_100_1(uniques, 9);
+  f_010_001_101_101_0(uniques, 9);
+  f_010_001_101_101_1(uniques, 9);
+  f_010_001_101_110_0(uniques, 9);
+  f_010_001_101_110_1(uniques, 9);
+  f_010_001_101_111_0(uniques, 9);
+  f_010_001_101_111_1(uniques, 9);
+  f_010_001_110_100_0(uniques, 9);
+  f_010_001_110_100_1(uniques, 9);
+  f_010_001_110_101_0(uniques, 9);
+  f_010_001_110_101_1(uniques, 9);
+  f_010_001_110_110_0(uniques, 9);
+  f_010_001_110_110_1(uniques, 9);
+  f_010_001_110_111_0(uniques, 9);
+  f_010_001_110_111_1(uniques, 9);
+  f_010_001_111_100_0(uniques, 9);
+  f_010_001_111_100_1(uniques, 9);
+  f_010_001_111_101_0(uniques, 9);
+  f_010_001_111_101_1(uniques, 9);
+  f_010_001_111_110_0(uniques, 9);
+  f_010_001_111_110_1(uniques, 9);
+  f_010_001_111_111_0(uniques, 9);
+  f_010_001_111_111_1(uniques, 9);
+  f_010_010_000_100_0(uniques, 9);
+  f_010_010_000_100_1(uniques, 9);
+  f_010_010_000_101_0(uniques, 9);
+  f_010_010_000_101_1(uniques, 9);
+  f_010_010_000_110_0(uniques, 9);
+  f_010_010_000_110_1(uniques, 9);
+  f_010_010_000_111_0(uniques, 9);
+  f_010_010_000_111_1(uniques, 9);
+  f_010_010_001_100_0(uniques, 9);
+  f_010_010_001_100_1(uniques, 9);
+  f_010_010_001_101_0(uniques, 9);
+  f_010_010_001_101_1(uniques, 9);
+  f_010_010_001_110_0(uniques, 9);
+  f_010_010_001_110_1(uniques, 9);
+  f_010_010_001_111_0(uniques, 9);
+  f_010_010_001_111_1(uniques, 9);
+  f_010_010_010_100_0(uniques, 9);
+  f_010_010_010_100_1(uniques, 9);
+  f_010_010_010_101_0(uniques, 9);
+  f_010_010_010_101_1(uniques, 9);
+  f_010_010_010_110_0(uniques, 9);
+  f_010_010_010_110_1(uniques, 9);
+  f_010_010_010_111_0(uniques, 9);
+  f_010_010_010_111_1(uniques, 9);
+  f_010_010_011_100_0(uniques, 9);
+  f_010_010_011_100_1(uniques, 9);
+  f_010_010_011_101_0(uniques, 9);
+  f_010_010_011_101_1(uniques, 9);
+  f_010_010_011_110_0(uniques, 9);
+  f_010_010_011_110_1(uniques, 9);
+  f_010_010_011_111_0(uniques, 9);
+  f_010_010_011_111_1(uniques, 9);
+  f_010_010_100_100_0(uniques, 9);
+  f_010_010_100_100_1(uniques, 9);
+  f_010_010_100_101_0(uniques, 9);
+  f_010_010_100_101_1(uniques, 9);
+  f_010_010_100_110_0(uniques, 9);
+  f_010_010_100_110_1(uniques, 9);
+  f_010_010_100_111_0(uniques, 9);
+  f_010_010_100_111_1(uniques, 9);
+  f_010_010_101_100_0(uniques, 9);
+  f_010_010_101_100_1(uniques, 9);
+  f_010_010_101_101_0(uniques, 9);
+  f_010_010_101_101_1(uniques, 9);
+  f_010_010_101_110_0(uniques, 9);
+  f_010_010_101_110_1(uniques, 9);
+  f_010_010_101_111_0(uniques, 9);
+  f_010_010_101_111_1(uniques, 9);
+  f_010_010_110_100_0(uniques, 9);
+  f_010_010_110_100_1(uniques, 9);
+  f_010_010_110_101_0(uniques, 9);
+  f_010_010_110_101_1(uniques, 9);
+  f_010_010_110_110_0(uniques, 9);
+  f_010_010_110_110_1(uniques, 9);
+  f_010_010_110_111_0(uniques, 9);
+  f_010_010_110_111_1(uniques, 9);
+  f_010_010_111_100_0(uniques, 9);
+  f_010_010_111_100_1(uniques, 9);
+  f_010_010_111_101_0(uniques, 9);
+  f_010_010_111_101_1(uniques, 9);
+  f_010_010_111_110_0(uniques, 9);
+  f_010_010_111_110_1(uniques, 9);
+  f_010_010_111_111_0(uniques, 9);
+  f_010_010_111_111_1(uniques, 9);
+  f_010_011_000_100_0(uniques, 9);
+  f_010_011_000_100_1(uniques, 9);
+  f_010_011_000_101_0(uniques, 9);
+  f_010_011_000_101_1(uniques, 9);
+  f_010_011_000_110_0(uniques, 9);
+  f_010_011_000_110_1(uniques, 9);
+  f_010_011_000_111_0(uniques, 9);
+  f_010_011_000_111_1(uniques, 9);
+  f_010_011_001_100_0(uniques, 9);
+  f_010_011_001_100_1(uniques, 9);
+  f_010_011_001_101_0(uniques, 9);
+  f_010_011_001_101_1(uniques, 9);
+  f_010_011_001_110_0(uniques, 9);
+  f_010_011_001_110_1(uniques, 9);
+  f_010_011_001_111_0(uniques, 9);
+  f_010_011_001_111_1(uniques, 9);
+  f_010_011_010_100_0(uniques, 9);
+  f_010_011_010_100_1(uniques, 9);
+  f_010_011_010_101_0(uniques, 9);
+  f_010_011_010_101_1(uniques, 9);
+  f_010_011_010_110_0(uniques, 9);
+  f_010_011_010_110_1(uniques, 9);
+  f_010_011_010_111_0(uniques, 9);
+  f_010_011_010_111_1(uniques, 9);
+  f_010_011_011_100_0(uniques, 9);
+  f_010_011_011_100_1(uniques, 9);
+  f_010_011_011_101_0(uniques, 9);
+  f_010_011_011_101_1(uniques, 9);
+  f_010_011_011_110_0(uniques, 9);
+  f_010_011_011_110_1(uniques, 9);
+  f_010_011_011_111_0(uniques, 9);
+  f_010_011_011_111_1(uniques, 9);
+  f_010_011_100_100_0(uniques, 9);
+  f_010_011_100_100_1(uniques, 9);
+  f_010_011_100_101_0(uniques, 9);
+  f_010_011_100_101_1(uniques, 9);
+  f_010_011_100_110_0(uniques, 9);
+  f_010_011_100_110_1(uniques, 9);
+  f_010_011_100_111_0(uniques, 9);
+  f_010_011_100_111_1(uniques, 9);
+  f_010_011_101_100_0(uniques, 9);
+  f_010_011_101_100_1(uniques, 9);
+  f_010_011_101_101_0(uniques, 9);
+  f_010_011_101_101_1(uniques, 9);
+  f_010_011_101_110_0(uniques, 9);
+  f_010_011_101_110_1(uniques, 9);
+  f_010_011_101_111_0(uniques, 9);
+  f_010_011_101_111_1(uniques, 9);
+  f_010_011_110_100_0(uniques, 9);
+  f_010_011_110_100_1(uniques, 9);
+  f_010_011_110_101_0(uniques, 9);
+  f_010_011_110_101_1(uniques, 9);
+  f_010_011_110_110_0(uniques, 9);
+  f_010_011_110_110_1(uniques, 9);
+  f_010_011_110_111_0(uniques, 9);
+  f_010_011_110_111_1(uniques, 9);
+  f_010_011_111_100_0(uniques, 9);
+  f_010_011_111_100_1(uniques, 9);
+  f_010_011_111_101_0(uniques, 9);
+  f_010_011_111_101_1(uniques, 9);
+  f_010_011_111_110_0(uniques, 9);
+  f_010_011_111_110_1(uniques, 9);
+  f_010_011_111_111_0(uniques, 9);
+  f_010_011_111_111_1(uniques, 9);
+  f_010_100_000_100_0(uniques, 9);
+  f_010_100_000_100_1(uniques, 9);
+  f_010_100_000_101_0(uniques, 9);
+  f_010_100_000_101_1(uniques, 9);
+  f_010_100_000_110_0(uniques, 9);
+  f_010_100_000_110_1(uniques, 9);
+  f_010_100_000_111_0(uniques, 9);
+  f_010_100_000_111_1(uniques, 9);
+  f_010_100_001_100_0(uniques, 9);
+  f_010_100_001_100_1(uniques, 9);
+  f_010_100_001_101_0(uniques, 9);
+  f_010_100_001_101_1(uniques, 9);
+  f_010_100_001_110_0(uniques, 9);
+  f_010_100_001_110_1(uniques, 9);
+  f_010_100_001_111_0(uniques, 9);
+  f_010_100_001_111_1(uniques, 9);
+  f_010_100_010_100_0(uniques, 9);
+  f_010_100_010_100_1(uniques, 9);
+  f_010_100_010_101_0(uniques, 9);
+  f_010_100_010_101_1(uniques, 9);
+  f_010_100_010_110_0(uniques, 9);
+  f_010_100_010_110_1(uniques, 9);
+  f_010_100_010_111_0(uniques, 9);
+  f_010_100_010_111_1(uniques, 9);
+  f_010_100_011_100_0(uniques, 9);
+  f_010_100_011_100_1(uniques, 9);
+  f_010_100_011_101_0(uniques, 9);
+  f_010_100_011_101_1(uniques, 9);
+  f_010_100_011_110_0(uniques, 9);
+  f_010_100_011_110_1(uniques, 9);
+  f_010_100_011_111_0(uniques, 9);
+  f_010_100_011_111_1(uniques, 9);
+  f_010_100_100_100_0(uniques, 9);
+  f_010_100_100_100_1(uniques, 9);
+  f_010_100_100_101_0(uniques, 9);
+  f_010_100_100_101_1(uniques, 9);
+  f_010_100_100_110_0(uniques, 9);
+  f_010_100_100_110_1(uniques, 9);
+  f_010_100_100_111_0(uniques, 9);
+  f_010_100_100_111_1(uniques, 9);
+  f_010_100_101_100_0(uniques, 9);
+  f_010_100_101_100_1(uniques, 9);
+  f_010_100_101_101_0(uniques, 9);
+  f_010_100_101_101_1(uniques, 9);
+  f_010_100_101_110_0(uniques, 9);
+  f_010_100_101_110_1(uniques, 9);
+  f_010_100_101_111_0(uniques, 9);
+  f_010_100_101_111_1(uniques, 9);
+  f_010_100_110_100_0(uniques, 9);
+  f_010_100_110_100_1(uniques, 9);
+  f_010_100_110_101_0(uniques, 9);
+  f_010_100_110_101_1(uniques, 9);
+  f_010_100_110_110_0(uniques, 9);
+  f_010_100_110_110_1(uniques, 9);
+  f_010_100_110_111_0(uniques, 9);
+  f_010_100_110_111_1(uniques, 9);
+  f_010_100_111_100_0(uniques, 9);
+  f_010_100_111_100_1(uniques, 9);
+  f_010_100_111_101_0(uniques, 9);
+  f_010_100_111_101_1(uniques, 9);
+  f_010_100_111_110_0(uniques, 9);
+  f_010_100_111_110_1(uniques, 9);
+  f_010_100_111_111_0(uniques, 9);
+  f_010_100_111_111_1(uniques, 9);
+  f_010_101_000_100_0(uniques, 9);
+  f_010_101_000_100_1(uniques, 9);
+  f_010_101_000_101_0(uniques, 9);
+  f_010_101_000_101_1(uniques, 9);
+  f_010_101_000_110_0(uniques, 9);
+  f_010_101_000_110_1(uniques, 9);
+  f_010_101_000_111_0(uniques, 9);
+  f_010_101_000_111_1(uniques, 9);
+  f_010_101_001_100_0(uniques, 9);
+  f_010_101_001_100_1(uniques, 9);
+  f_010_101_001_101_0(uniques, 9);
+  f_010_101_001_101_1(uniques, 9);
+  f_010_101_001_110_0(uniques, 9);
+  f_010_101_001_110_1(uniques, 9);
+  f_010_101_001_111_0(uniques, 9);
+  f_010_101_001_111_1(uniques, 9);
+  f_010_101_010_100_0(uniques, 9);
+  f_010_101_010_100_1(uniques, 9);
+  f_010_101_010_101_0(uniques, 9);
+  f_010_101_010_101_1(uniques, 9);
+  f_010_101_010_110_0(uniques, 9);
+  f_010_101_010_110_1(uniques, 9);
+  f_010_101_010_111_0(uniques, 9);
+  f_010_101_010_111_1(uniques, 9);
+  f_010_101_011_100_0(uniques, 9);
+  f_010_101_011_100_1(uniques, 9);
+  f_010_101_011_101_0(uniques, 9);
+  f_010_101_011_101_1(uniques, 9);
+  f_010_101_011_110_0(uniques, 9);
+  f_010_101_011_110_1(uniques, 9);
+  f_010_101_011_111_0(uniques, 9);
+  f_010_101_011_111_1(uniques, 9);
+  f_010_101_100_100_0(uniques, 9);
+  f_010_101_100_100_1(uniques, 9);
+  f_010_101_100_101_0(uniques, 9);
+  f_010_101_100_101_1(uniques, 9);
+  f_010_101_100_110_0(uniques, 9);
+  f_010_101_100_110_1(uniques, 9);
+  f_010_101_100_111_0(uniques, 9);
+  f_010_101_100_111_1(uniques, 9);
+  f_010_101_101_100_0(uniques, 9);
+  f_010_101_101_100_1(uniques, 9);
+  f_010_101_101_101_0(uniques, 9);
+  f_010_101_101_101_1(uniques, 9);
+  f_010_101_101_110_0(uniques, 9);
+  f_010_101_101_110_1(uniques, 9);
+  f_010_101_101_111_0(uniques, 9);
+  f_010_101_101_111_1(uniques, 9);
+  f_010_101_110_100_0(uniques, 9);
+  f_010_101_110_100_1(uniques, 9);
+  f_010_101_110_101_0(uniques, 9);
+  f_010_101_110_101_1(uniques, 9);
+  f_010_101_110_110_0(uniques, 9);
+  f_010_101_110_110_1(uniques, 9);
+  f_010_101_110_111_0(uniques, 9);
+  f_010_101_110_111_1(uniques, 9);
+  f_010_101_111_100_0(uniques, 9);
+  f_010_101_111_100_1(uniques, 9);
+  f_010_101_111_101_0(uniques, 9);
+  f_010_101_111_101_1(uniques, 9);
+  f_010_101_111_110_0(uniques, 9);
+  f_010_101_111_110_1(uniques, 9);
+  f_010_101_111_111_0(uniques, 9);
+  f_010_101_111_111_1(uniques, 9);
+  f_010_110_000_100_0(uniques, 9);
+  f_010_110_000_100_1(uniques, 9);
+  f_010_110_000_101_0(uniques, 9);
+  f_010_110_000_101_1(uniques, 9);
+  f_010_110_000_110_0(uniques, 9);
+  f_010_110_000_110_1(uniques, 9);
+  f_010_110_000_111_0(uniques, 9);
+  f_010_110_000_111_1(uniques, 9);
+  f_010_110_001_100_0(uniques, 9);
+  f_010_110_001_100_1(uniques, 9);
+  f_010_110_001_101_0(uniques, 9);
+  f_010_110_001_101_1(uniques, 9);
+  f_010_110_001_110_0(uniques, 9);
+  f_010_110_001_110_1(uniques, 9);
+  f_010_110_001_111_0(uniques, 9);
+  f_010_110_001_111_1(uniques, 9);
+  f_010_110_010_100_0(uniques, 9);
+  f_010_110_010_100_1(uniques, 9);
+  f_010_110_010_101_0(uniques, 9);
+  f_010_110_010_101_1(uniques, 9);
+  f_010_110_010_110_0(uniques, 9);
+  f_010_110_010_110_1(uniques, 9);
+  f_010_110_010_111_0(uniques, 9);
+  f_010_110_010_111_1(uniques, 9);
+  f_010_110_011_100_0(uniques, 9);
+  f_010_110_011_100_1(uniques, 9);
+  f_010_110_011_101_0(uniques, 9);
+  f_010_110_011_101_1(uniques, 9);
+  f_010_110_011_110_0(uniques, 9);
+  f_010_110_011_110_1(uniques, 9);
+  f_010_110_011_111_0(uniques, 9);
+  f_010_110_011_111_1(uniques, 9);
+  f_010_110_100_100_0(uniques, 9);
+  f_010_110_100_100_1(uniques, 9);
+  f_010_110_100_101_0(uniques, 9);
+  f_010_110_100_101_1(uniques, 9);
+  f_010_110_100_110_0(uniques, 9);
+  f_010_110_100_110_1(uniques, 9);
+  f_010_110_100_111_0(uniques, 9);
+  f_010_110_100_111_1(uniques, 9);
+  f_010_110_101_100_0(uniques, 9);
+  f_010_110_101_100_1(uniques, 9);
+  f_010_110_101_101_0(uniques, 9);
+  f_010_110_101_101_1(uniques, 9);
+  f_010_110_101_110_0(uniques, 9);
+  f_010_110_101_110_1(uniques, 9);
+  f_010_110_101_111_0(uniques, 9);
+  f_010_110_101_111_1(uniques, 9);
+  f_010_110_110_100_0(uniques, 9);
+  f_010_110_110_100_1(uniques, 9);
+  f_010_110_110_101_0(uniques, 9);
+  f_010_110_110_101_1(uniques, 9);
+  f_010_110_110_110_0(uniques, 9);
+  f_010_110_110_110_1(uniques, 9);
+  f_010_110_110_111_0(uniques, 9);
+  f_010_110_110_111_1(uniques, 9);
+  f_010_110_111_100_0(uniques, 9);
+  f_010_110_111_100_1(uniques, 9);
+  f_010_110_111_101_0(uniques, 9);
+  f_010_110_111_101_1(uniques, 9);
+  f_010_110_111_110_0(uniques, 9);
+  f_010_110_111_110_1(uniques, 9);
+  f_010_110_111_111_0(uniques, 9);
+  f_010_110_111_111_1(uniques, 9);
+  f_010_111_000_100_0(uniques, 9);
+  f_010_111_000_100_1(uniques, 9);
+  f_010_111_000_101_0(uniques, 9);
+  f_010_111_000_101_1(uniques, 9);
+  f_010_111_000_110_0(uniques, 9);
+  f_010_111_000_110_1(uniques, 9);
+  f_010_111_000_111_0(uniques, 9);
+  f_010_111_000_111_1(uniques, 9);
+  f_010_111_001_100_0(uniques, 9);
+  f_010_111_001_100_1(uniques, 9);
+  f_010_111_001_101_0(uniques, 9);
+  f_010_111_001_101_1(uniques, 9);
+  f_010_111_001_110_0(uniques, 9);
+  f_010_111_001_110_1(uniques, 9);
+  f_010_111_001_111_0(uniques, 9);
+  f_010_111_001_111_1(uniques, 9);
+  f_010_111_010_100_0(uniques, 9);
+  f_010_111_010_100_1(uniques, 9);
+  f_010_111_010_101_0(uniques, 9);
+  f_010_111_010_101_1(uniques, 9);
+  f_010_111_010_110_0(uniques, 9);
+  f_010_111_010_110_1(uniques, 9);
+  f_010_111_010_111_0(uniques, 9);
+  f_010_111_010_111_1(uniques, 9);
+  f_010_111_011_100_0(uniques, 9);
+  f_010_111_011_100_1(uniques, 9);
+  f_010_111_011_101_0(uniques, 9);
+  f_010_111_011_101_1(uniques, 9);
+  f_010_111_011_110_0(uniques, 9);
+  f_010_111_011_110_1(uniques, 9);
+  f_010_111_011_111_0(uniques, 9);
+  f_010_111_011_111_1(uniques, 9);
+  f_010_111_100_100_0(uniques, 9);
+  f_010_111_100_100_1(uniques, 9);
+  f_010_111_100_101_0(uniques, 9);
+  f_010_111_100_101_1(uniques, 9);
+  f_010_111_100_110_0(uniques, 9);
+  f_010_111_100_110_1(uniques, 9);
+  f_010_111_100_111_0(uniques, 9);
+  f_010_111_100_111_1(uniques, 9);
+  f_010_111_101_100_0(uniques, 9);
+  f_010_111_101_100_1(uniques, 9);
+  f_010_111_101_101_0(uniques, 9);
+  f_010_111_101_101_1(uniques, 9);
+  f_010_111_101_110_0(uniques, 9);
+  f_010_111_101_110_1(uniques, 9);
+  f_010_111_101_111_0(uniques, 9);
+  f_010_111_101_111_1(uniques, 9);
+  f_010_111_110_100_0(uniques, 9);
+  f_010_111_110_100_1(uniques, 9);
+  f_010_111_110_101_0(uniques, 9);
+  f_010_111_110_101_1(uniques, 9);
+  f_010_111_110_110_0(uniques, 9);
+  f_010_111_110_110_1(uniques, 9);
+  f_010_111_110_111_0(uniques, 9);
+  f_010_111_110_111_1(uniques, 9);
+  f_010_111_111_100_0(uniques, 9);
+  f_010_111_111_100_1(uniques, 9);
+  f_010_111_111_101_0(uniques, 9);
+  f_010_111_111_101_1(uniques, 9);
+  f_010_111_111_110_0(uniques, 9);
+  f_010_111_111_110_1(uniques, 9);
+  f_010_111_111_111_0(uniques, 9);
+  f_010_111_111_111_1(uniques, 9);
+  f_011_000_000_100_0(uniques, 9);
+  f_011_000_000_100_1(uniques, 9);
+  f_011_000_000_101_0(uniques, 9);
+  f_011_000_000_101_1(uniques, 9);
+  f_011_000_000_110_0(uniques, 9);
+  f_011_000_000_110_1(uniques, 9);
+  f_011_000_000_111_0(uniques, 9);
+  f_011_000_000_111_1(uniques, 9);
+  f_011_000_001_100_0(uniques, 9);
+  f_011_000_001_100_1(uniques, 9);
+  f_011_000_001_101_0(uniques, 9);
+  f_011_000_001_101_1(uniques, 9);
+  f_011_000_001_110_0(uniques, 9);
+  f_011_000_001_110_1(uniques, 9);
+  f_011_000_001_111_0(uniques, 9);
+  f_011_000_001_111_1(uniques, 9);
+  f_011_000_010_100_0(uniques, 9);
+  f_011_000_010_100_1(uniques, 9);
+  f_011_000_010_101_0(uniques, 9);
+  f_011_000_010_101_1(uniques, 9);
+  f_011_000_010_110_0(uniques, 9);
+  f_011_000_010_110_1(uniques, 9);
+  f_011_000_010_111_0(uniques, 9);
+  f_011_000_010_111_1(uniques, 9);
+  f_011_000_011_100_0(uniques, 9);
+  f_011_000_011_100_1(uniques, 9);
+  f_011_000_011_101_0(uniques, 9);
+  f_011_000_011_101_1(uniques, 9);
+  f_011_000_011_110_0(uniques, 9);
+  f_011_000_011_110_1(uniques, 9);
+  f_011_000_011_111_0(uniques, 9);
+  f_011_000_011_111_1(uniques, 9);
+  f_011_000_100_100_0(uniques, 9);
+  f_011_000_100_100_1(uniques, 9);
+  f_011_000_100_101_0(uniques, 9);
+  f_011_000_100_101_1(uniques, 9);
+  f_011_000_100_110_0(uniques, 9);
+  f_011_000_100_110_1(uniques, 9);
+  f_011_000_100_111_0(uniques, 9);
+  f_011_000_100_111_1(uniques, 9);
+  f_011_000_101_100_0(uniques, 9);
+  f_011_000_101_100_1(uniques, 9);
+  f_011_000_101_101_0(uniques, 9);
+  f_011_000_101_101_1(uniques, 9);
+  f_011_000_101_110_0(uniques, 9);
+  f_011_000_101_110_1(uniques, 9);
+  f_011_000_101_111_0(uniques, 9);
+  f_011_000_101_111_1(uniques, 9);
+  f_011_000_110_100_0(uniques, 9);
+  f_011_000_110_100_1(uniques, 9);
+  f_011_000_110_101_0(uniques, 9);
+  f_011_000_110_101_1(uniques, 9);
+  f_011_000_110_110_0(uniques, 9);
+  f_011_000_110_110_1(uniques, 9);
+  f_011_000_110_111_0(uniques, 9);
+  f_011_000_110_111_1(uniques, 9);
+  f_011_000_111_100_0(uniques, 9);
+  f_011_000_111_100_1(uniques, 9);
+  f_011_000_111_101_0(uniques, 9);
+  f_011_000_111_101_1(uniques, 9);
+  f_011_000_111_110_0(uniques, 9);
+  f_011_000_111_110_1(uniques, 9);
+  f_011_000_111_111_0(uniques, 9);
+  f_011_000_111_111_1(uniques, 9);
+  f_011_001_000_100_0(uniques, 9);
+  f_011_001_000_100_1(uniques, 9);
+  f_011_001_000_101_0(uniques, 9);
+  f_011_001_000_101_1(uniques, 9);
+  f_011_001_000_110_0(uniques, 9);
+  f_011_001_000_110_1(uniques, 9);
+  f_011_001_000_111_0(uniques, 9);
+  f_011_001_000_111_1(uniques, 9);
+  f_011_001_001_100_0(uniques, 9);
+  f_011_001_001_100_1(uniques, 9);
+  f_011_001_001_101_0(uniques, 9);
+  f_011_001_001_101_1(uniques, 9);
+  f_011_001_001_110_0(uniques, 9);
+  f_011_001_001_110_1(uniques, 9);
+  f_011_001_001_111_0(uniques, 9);
+  f_011_001_001_111_1(uniques, 9);
+  f_011_001_010_100_0(uniques, 9);
+  f_011_001_010_100_1(uniques, 9);
+  f_011_001_010_101_0(uniques, 9);
+  f_011_001_010_101_1(uniques, 9);
+  f_011_001_010_110_0(uniques, 9);
+  f_011_001_010_110_1(uniques, 9);
+  f_011_001_010_111_0(uniques, 9);
+  f_011_001_010_111_1(uniques, 9);
+  f_011_001_011_100_0(uniques, 9);
+  f_011_001_011_100_1(uniques, 9);
+  f_011_001_011_101_0(uniques, 9);
+  f_011_001_011_101_1(uniques, 9);
+  f_011_001_011_110_0(uniques, 9);
+  f_011_001_011_110_1(uniques, 9);
+  f_011_001_011_111_0(uniques, 9);
+  f_011_001_011_111_1(uniques, 9);
+  f_011_001_100_100_0(uniques, 9);
+  f_011_001_100_100_1(uniques, 9);
+  f_011_001_100_101_0(uniques, 9);
+  f_011_001_100_101_1(uniques, 9);
+  f_011_001_100_110_0(uniques, 9);
+  f_011_001_100_110_1(uniques, 9);
+  f_011_001_100_111_0(uniques, 9);
+  f_011_001_100_111_1(uniques, 9);
+  f_011_001_101_100_0(uniques, 9);
+  f_011_001_101_100_1(uniques, 9);
+  f_011_001_101_101_0(uniques, 9);
+  f_011_001_101_101_1(uniques, 9);
+  f_011_001_101_110_0(uniques, 9);
+  f_011_001_101_110_1(uniques, 9);
+  f_011_001_101_111_0(uniques, 9);
+  f_011_001_101_111_1(uniques, 9);
+  f_011_001_110_100_0(uniques, 9);
+  f_011_001_110_100_1(uniques, 9);
+  f_011_001_110_101_0(uniques, 9);
+  f_011_001_110_101_1(uniques, 9);
+  f_011_001_110_110_0(uniques, 9);
+  f_011_001_110_110_1(uniques, 9);
+  f_011_001_110_111_0(uniques, 9);
+  f_011_001_110_111_1(uniques, 9);
+  f_011_001_111_100_0(uniques, 9);
+  f_011_001_111_100_1(uniques, 9);
+  f_011_001_111_101_0(uniques, 9);
+  f_011_001_111_101_1(uniques, 9);
+  f_011_001_111_110_0(uniques, 9);
+  f_011_001_111_110_1(uniques, 9);
+  f_011_001_111_111_0(uniques, 9);
+  f_011_001_111_111_1(uniques, 9);
+  f_011_010_000_100_0(uniques, 9);
+  f_011_010_000_100_1(uniques, 9);
+  f_011_010_000_101_0(uniques, 9);
+  f_011_010_000_101_1(uniques, 9);
+  f_011_010_000_110_0(uniques, 9);
+  f_011_010_000_110_1(uniques, 9);
+  f_011_010_000_111_0(uniques, 9);
+  f_011_010_000_111_1(uniques, 9);
+  f_011_010_001_100_0(uniques, 9);
+  f_011_010_001_100_1(uniques, 9);
+  f_011_010_001_101_0(uniques, 9);
+  f_011_010_001_101_1(uniques, 9);
+  f_011_010_001_110_0(uniques, 9);
+  f_011_010_001_110_1(uniques, 9);
+  f_011_010_001_111_0(uniques, 9);
+  f_011_010_001_111_1(uniques, 9);
+  f_011_010_010_100_0(uniques, 9);
+  f_011_010_010_100_1(uniques, 9);
+  f_011_010_010_101_0(uniques, 9);
+  f_011_010_010_101_1(uniques, 9);
+  f_011_010_010_110_0(uniques, 9);
+  f_011_010_010_110_1(uniques, 9);
+  f_011_010_010_111_0(uniques, 9);
+  f_011_010_010_111_1(uniques, 9);
+  f_011_010_011_100_0(uniques, 9);
+  f_011_010_011_100_1(uniques, 9);
+  f_011_010_011_101_0(uniques, 9);
+  f_011_010_011_101_1(uniques, 9);
+  f_011_010_011_110_0(uniques, 9);
+  f_011_010_011_110_1(uniques, 9);
+  f_011_010_011_111_0(uniques, 9);
+  f_011_010_011_111_1(uniques, 9);
+  f_011_010_100_100_0(uniques, 9);
+  f_011_010_100_100_1(uniques, 9);
+  f_011_010_100_101_0(uniques, 9);
+  f_011_010_100_101_1(uniques, 9);
+  f_011_010_100_110_0(uniques, 9);
+  f_011_010_100_110_1(uniques, 9);
+  f_011_010_100_111_0(uniques, 9);
+  f_011_010_100_111_1(uniques, 9);
+  f_011_010_101_100_0(uniques, 9);
+  f_011_010_101_100_1(uniques, 9);
+  f_011_010_101_101_0(uniques, 9);
+  f_011_010_101_101_1(uniques, 9);
+  f_011_010_101_110_0(uniques, 9);
+  f_011_010_101_110_1(uniques, 9);
+  f_011_010_101_111_0(uniques, 9);
+  f_011_010_101_111_1(uniques, 9);
+  f_011_010_110_100_0(uniques, 9);
+  f_011_010_110_100_1(uniques, 9);
+  f_011_010_110_101_0(uniques, 9);
+  f_011_010_110_101_1(uniques, 9);
+  f_011_010_110_110_0(uniques, 9);
+  f_011_010_110_110_1(uniques, 9);
+  f_011_010_110_111_0(uniques, 9);
+  f_011_010_110_111_1(uniques, 9);
+  f_011_010_111_100_0(uniques, 9);
+  f_011_010_111_100_1(uniques, 9);
+  f_011_010_111_101_0(uniques, 9);
+  f_011_010_111_101_1(uniques, 9);
+  f_011_010_111_110_0(uniques, 9);
+  f_011_010_111_110_1(uniques, 9);
+  f_011_010_111_111_0(uniques, 9);
+  f_011_010_111_111_1(uniques, 9);
+  f_011_011_000_100_0(uniques, 9);
+  f_011_011_000_100_1(uniques, 9);
+  f_011_011_000_101_0(uniques, 9);
+  f_011_011_000_101_1(uniques, 9);
+  f_011_011_000_110_0(uniques, 9);
+  f_011_011_000_110_1(uniques, 9);
+  f_011_011_000_111_0(uniques, 9);
+  f_011_011_000_111_1(uniques, 9);
+  f_011_011_001_100_0(uniques, 9);
+  f_011_011_001_100_1(uniques, 9);
+  f_011_011_001_101_0(uniques, 9);
+  f_011_011_001_101_1(uniques, 9);
+  f_011_011_001_110_0(uniques, 9);
+  f_011_011_001_110_1(uniques, 9);
+  f_011_011_001_111_0(uniques, 9);
+  f_011_011_001_111_1(uniques, 9);
+  f_011_011_010_100_0(uniques, 9);
+  f_011_011_010_100_1(uniques, 9);
+  f_011_011_010_101_0(uniques, 9);
+  f_011_011_010_101_1(uniques, 9);
+  f_011_011_010_110_0(uniques, 9);
+  f_011_011_010_110_1(uniques, 9);
+  f_011_011_010_111_0(uniques, 9);
+  f_011_011_010_111_1(uniques, 9);
+  f_011_011_011_100_0(uniques, 9);
+  f_011_011_011_100_1(uniques, 9);
+  f_011_011_011_101_0(uniques, 9);
+  f_011_011_011_101_1(uniques, 9);
+  f_011_011_011_110_0(uniques, 9);
+  f_011_011_011_110_1(uniques, 9);
+  f_011_011_011_111_0(uniques, 9);
+  f_011_011_011_111_1(uniques, 9);
+  f_011_011_100_100_0(uniques, 9);
+  f_011_011_100_100_1(uniques, 9);
+  f_011_011_100_101_0(uniques, 9);
+  f_011_011_100_101_1(uniques, 9);
+  f_011_011_100_110_0(uniques, 9);
+  f_011_011_100_110_1(uniques, 9);
+  f_011_011_100_111_0(uniques, 9);
+  f_011_011_100_111_1(uniques, 9);
+  f_011_011_101_100_0(uniques, 9);
+  f_011_011_101_100_1(uniques, 9);
+  f_011_011_101_101_0(uniques, 9);
+  f_011_011_101_101_1(uniques, 9);
+  f_011_011_101_110_0(uniques, 9);
+  f_011_011_101_110_1(uniques, 9);
+  f_011_011_101_111_0(uniques, 9);
+  f_011_011_101_111_1(uniques, 9);
+  f_011_011_110_100_0(uniques, 9);
+  f_011_011_110_100_1(uniques, 9);
+  f_011_011_110_101_0(uniques, 9);
+  f_011_011_110_101_1(uniques, 9);
+  f_011_011_110_110_0(uniques, 9);
+  f_011_011_110_110_1(uniques, 9);
+  f_011_011_110_111_0(uniques, 9);
+  f_011_011_110_111_1(uniques, 9);
+  f_011_011_111_100_0(uniques, 9);
+  f_011_011_111_100_1(uniques, 9);
+  f_011_011_111_101_0(uniques, 9);
+  f_011_011_111_101_1(uniques, 9);
+  f_011_011_111_110_0(uniques, 9);
+  f_011_011_111_110_1(uniques, 9);
+  f_011_011_111_111_0(uniques, 9);
+  f_011_011_111_111_1(uniques, 9);
+  f_011_100_000_100_0(uniques, 9);
+  f_011_100_000_100_1(uniques, 9);
+  f_011_100_000_101_0(uniques, 9);
+  f_011_100_000_101_1(uniques, 9);
+  f_011_100_000_110_0(uniques, 9);
+  f_011_100_000_110_1(uniques, 9);
+  f_011_100_000_111_0(uniques, 9);
+  f_011_100_000_111_1(uniques, 9);
+  f_011_100_001_100_0(uniques, 9);
+  f_011_100_001_100_1(uniques, 9);
+  f_011_100_001_101_0(uniques, 9);
+  f_011_100_001_101_1(uniques, 9);
+  f_011_100_001_110_0(uniques, 9);
+  f_011_100_001_110_1(uniques, 9);
+  f_011_100_001_111_0(uniques, 9);
+  f_011_100_001_111_1(uniques, 9);
+  f_011_100_010_100_0(uniques, 9);
+  f_011_100_010_100_1(uniques, 9);
+  f_011_100_010_101_0(uniques, 9);
+  f_011_100_010_101_1(uniques, 9);
+  f_011_100_010_110_0(uniques, 9);
+  f_011_100_010_110_1(uniques, 9);
+  f_011_100_010_111_0(uniques, 9);
+  f_011_100_010_111_1(uniques, 9);
+  f_011_100_011_100_0(uniques, 9);
+  f_011_100_011_100_1(uniques, 9);
+  f_011_100_011_101_0(uniques, 9);
+  f_011_100_011_101_1(uniques, 9);
+  f_011_100_011_110_0(uniques, 9);
+  f_011_100_011_110_1(uniques, 9);
+  f_011_100_011_111_0(uniques, 9);
+  f_011_100_011_111_1(uniques, 9);
+  f_011_100_100_100_0(uniques, 9);
+  f_011_100_100_100_1(uniques, 9);
+  f_011_100_100_101_0(uniques, 9);
+  f_011_100_100_101_1(uniques, 9);
+  f_011_100_100_110_0(uniques, 9);
+  f_011_100_100_110_1(uniques, 9);
+  f_011_100_100_111_0(uniques, 9);
+  f_011_100_100_111_1(uniques, 9);
+  f_011_100_101_100_0(uniques, 9);
+  f_011_100_101_100_1(uniques, 9);
+  f_011_100_101_101_0(uniques, 9);
+  f_011_100_101_101_1(uniques, 9);
+  f_011_100_101_110_0(uniques, 9);
+  f_011_100_101_110_1(uniques, 9);
+  f_011_100_101_111_0(uniques, 9);
+  f_011_100_101_111_1(uniques, 9);
+  f_011_100_110_100_0(uniques, 9);
+  f_011_100_110_100_1(uniques, 9);
+  f_011_100_110_101_0(uniques, 9);
+  f_011_100_110_101_1(uniques, 9);
+  f_011_100_110_110_0(uniques, 9);
+  f_011_100_110_110_1(uniques, 9);
+  f_011_100_110_111_0(uniques, 9);
+  f_011_100_110_111_1(uniques, 9);
+  f_011_100_111_100_0(uniques, 9);
+  f_011_100_111_100_1(uniques, 9);
+  f_011_100_111_101_0(uniques, 9);
+  f_011_100_111_101_1(uniques, 9);
+  f_011_100_111_110_0(uniques, 9);
+  f_011_100_111_110_1(uniques, 9);
+  f_011_100_111_111_0(uniques, 9);
+  f_011_100_111_111_1(uniques, 9);
+  f_011_101_000_100_0(uniques, 9);
+  f_011_101_000_100_1(uniques, 9);
+  f_011_101_000_101_0(uniques, 9);
+  f_011_101_000_101_1(uniques, 9);
+  f_011_101_000_110_0(uniques, 9);
+  f_011_101_000_110_1(uniques, 9);
+  f_011_101_000_111_0(uniques, 9);
+  f_011_101_000_111_1(uniques, 9);
+  f_011_101_001_100_0(uniques, 9);
+  f_011_101_001_100_1(uniques, 9);
+  f_011_101_001_101_0(uniques, 9);
+  f_011_101_001_101_1(uniques, 9);
+  f_011_101_001_110_0(uniques, 9);
+  f_011_101_001_110_1(uniques, 9);
+  f_011_101_001_111_0(uniques, 9);
+  f_011_101_001_111_1(uniques, 9);
+  f_011_101_010_100_0(uniques, 9);
+  f_011_101_010_100_1(uniques, 9);
+  f_011_101_010_101_0(uniques, 9);
+  f_011_101_010_101_1(uniques, 9);
+  f_011_101_010_110_0(uniques, 9);
+  f_011_101_010_110_1(uniques, 9);
+  f_011_101_010_111_0(uniques, 9);
+  f_011_101_010_111_1(uniques, 9);
+  f_011_101_011_100_0(uniques, 9);
+  f_011_101_011_100_1(uniques, 9);
+  f_011_101_011_101_0(uniques, 9);
+  f_011_101_011_101_1(uniques, 9);
+  f_011_101_011_110_0(uniques, 9);
+  f_011_101_011_110_1(uniques, 9);
+  f_011_101_011_111_0(uniques, 9);
+  f_011_101_011_111_1(uniques, 9);
+  f_011_101_100_100_0(uniques, 9);
+  f_011_101_100_100_1(uniques, 9);
+  f_011_101_100_101_0(uniques, 9);
+  f_011_101_100_101_1(uniques, 9);
+  f_011_101_100_110_0(uniques, 9);
+  f_011_101_100_110_1(uniques, 9);
+  f_011_101_100_111_0(uniques, 9);
+  f_011_101_100_111_1(uniques, 9);
+  f_011_101_101_100_0(uniques, 9);
+  f_011_101_101_100_1(uniques, 9);
+  f_011_101_101_101_0(uniques, 9);
+  f_011_101_101_101_1(uniques, 9);
+  f_011_101_101_110_0(uniques, 9);
+  f_011_101_101_110_1(uniques, 9);
+  f_011_101_101_111_0(uniques, 9);
+  f_011_101_101_111_1(uniques, 9);
+  f_011_101_110_100_0(uniques, 9);
+  f_011_101_110_100_1(uniques, 9);
+  f_011_101_110_101_0(uniques, 9);
+  f_011_101_110_101_1(uniques, 9);
+  f_011_101_110_110_0(uniques, 9);
+  f_011_101_110_110_1(uniques, 9);
+  f_011_101_110_111_0(uniques, 9);
+  f_011_101_110_111_1(uniques, 9);
+  f_011_101_111_100_0(uniques, 9);
+  f_011_101_111_100_1(uniques, 9);
+  f_011_101_111_101_0(uniques, 9);
+  f_011_101_111_101_1(uniques, 9);
+  f_011_101_111_110_0(uniques, 9);
+  f_011_101_111_110_1(uniques, 9);
+  f_011_101_111_111_0(uniques, 9);
+  f_011_101_111_111_1(uniques, 9);
+  f_011_110_000_100_0(uniques, 9);
+  f_011_110_000_100_1(uniques, 9);
+  f_011_110_000_101_0(uniques, 9);
+  f_011_110_000_101_1(uniques, 9);
+  f_011_110_000_110_0(uniques, 9);
+  f_011_110_000_110_1(uniques, 9);
+  f_011_110_000_111_0(uniques, 9);
+  f_011_110_000_111_1(uniques, 9);
+  f_011_110_001_100_0(uniques, 9);
+  f_011_110_001_100_1(uniques, 9);
+  f_011_110_001_101_0(uniques, 9);
+  f_011_110_001_101_1(uniques, 9);
+  f_011_110_001_110_0(uniques, 9);
+  f_011_110_001_110_1(uniques, 9);
+  f_011_110_001_111_0(uniques, 9);
+  f_011_110_001_111_1(uniques, 9);
+  f_011_110_010_100_0(uniques, 9);
+  f_011_110_010_100_1(uniques, 9);
+  f_011_110_010_101_0(uniques, 9);
+  f_011_110_010_101_1(uniques, 9);
+  f_011_110_010_110_0(uniques, 9);
+  f_011_110_010_110_1(uniques, 9);
+  f_011_110_010_111_0(uniques, 9);
+  f_011_110_010_111_1(uniques, 9);
+  f_011_110_011_100_0(uniques, 9);
+  f_011_110_011_100_1(uniques, 9);
+  f_011_110_011_101_0(uniques, 9);
+  f_011_110_011_101_1(uniques, 9);
+  f_011_110_011_110_0(uniques, 9);
+  f_011_110_011_110_1(uniques, 9);
+  f_011_110_011_111_0(uniques, 9);
+  f_011_110_011_111_1(uniques, 9);
+  f_011_110_100_100_0(uniques, 9);
+  f_011_110_100_100_1(uniques, 9);
+  f_011_110_100_101_0(uniques, 9);
+  f_011_110_100_101_1(uniques, 9);
+  f_011_110_100_110_0(uniques, 9);
+  f_011_110_100_110_1(uniques, 9);
+  f_011_110_100_111_0(uniques, 9);
+  f_011_110_100_111_1(uniques, 9);
+  f_011_110_101_100_0(uniques, 9);
+  f_011_110_101_100_1(uniques, 9);
+  f_011_110_101_101_0(uniques, 9);
+  f_011_110_101_101_1(uniques, 9);
+  f_011_110_101_110_0(uniques, 9);
+  f_011_110_101_110_1(uniques, 9);
+  f_011_110_101_111_0(uniques, 9);
+  f_011_110_101_111_1(uniques, 9);
+  f_011_110_110_100_0(uniques, 9);
+  f_011_110_110_100_1(uniques, 9);
+  f_011_110_110_101_0(uniques, 9);
+  f_011_110_110_101_1(uniques, 9);
+  f_011_110_110_110_0(uniques, 9);
+  f_011_110_110_110_1(uniques, 9);
+  f_011_110_110_111_0(uniques, 9);
+  f_011_110_110_111_1(uniques, 9);
+  f_011_110_111_100_0(uniques, 9);
+  f_011_110_111_100_1(uniques, 9);
+  f_011_110_111_101_0(uniques, 9);
+  f_011_110_111_101_1(uniques, 9);
+  f_011_110_111_110_0(uniques, 9);
+  f_011_110_111_110_1(uniques, 9);
+  f_011_110_111_111_0(uniques, 9);
+  f_011_110_111_111_1(uniques, 9);
+  f_011_111_000_100_0(uniques, 9);
+  f_011_111_000_100_1(uniques, 9);
+  f_011_111_000_101_0(uniques, 9);
+  f_011_111_000_101_1(uniques, 9);
+  f_011_111_000_110_0(uniques, 9);
+  f_011_111_000_110_1(uniques, 9);
+  f_011_111_000_111_0(uniques, 9);
+  f_011_111_000_111_1(uniques, 9);
+  f_011_111_001_100_0(uniques, 9);
+  f_011_111_001_100_1(uniques, 9);
+  f_011_111_001_101_0(uniques, 9);
+  f_011_111_001_101_1(uniques, 9);
+  f_011_111_001_110_0(uniques, 9);
+  f_011_111_001_110_1(uniques, 9);
+  f_011_111_001_111_0(uniques, 9);
+  f_011_111_001_111_1(uniques, 9);
+  f_011_111_010_100_0(uniques, 9);
+  f_011_111_010_100_1(uniques, 9);
+  f_011_111_010_101_0(uniques, 9);
+  f_011_111_010_101_1(uniques, 9);
+  f_011_111_010_110_0(uniques, 9);
+  f_011_111_010_110_1(uniques, 9);
+  f_011_111_010_111_0(uniques, 9);
+  f_011_111_010_111_1(uniques, 9);
+  f_011_111_011_100_0(uniques, 9);
+  f_011_111_011_100_1(uniques, 9);
+  f_011_111_011_101_0(uniques, 9);
+  f_011_111_011_101_1(uniques, 9);
+  f_011_111_011_110_0(uniques, 9);
+  f_011_111_011_110_1(uniques, 9);
+  f_011_111_011_111_0(uniques, 9);
+  f_011_111_011_111_1(uniques, 9);
+  f_011_111_100_100_0(uniques, 9);
+  f_011_111_100_100_1(uniques, 9);
+  f_011_111_100_101_0(uniques, 9);
+  f_011_111_100_101_1(uniques, 9);
+  f_011_111_100_110_0(uniques, 9);
+  f_011_111_100_110_1(uniques, 9);
+  f_011_111_100_111_0(uniques, 9);
+  f_011_111_100_111_1(uniques, 9);
+  f_011_111_101_100_0(uniques, 9);
+  f_011_111_101_100_1(uniques, 9);
+  f_011_111_101_101_0(uniques, 9);
+  f_011_111_101_101_1(uniques, 9);
+  f_011_111_101_110_0(uniques, 9);
+  f_011_111_101_110_1(uniques, 9);
+  f_011_111_101_111_0(uniques, 9);
+  f_011_111_101_111_1(uniques, 9);
+  f_011_111_110_100_0(uniques, 9);
+  f_011_111_110_100_1(uniques, 9);
+  f_011_111_110_101_0(uniques, 9);
+  f_011_111_110_101_1(uniques, 9);
+  f_011_111_110_110_0(uniques, 9);
+  f_011_111_110_110_1(uniques, 9);
+  f_011_111_110_111_0(uniques, 9);
+  f_011_111_110_111_1(uniques, 9);
+  f_011_111_111_100_0(uniques, 9);
+  f_011_111_111_100_1(uniques, 9);
+  f_011_111_111_101_0(uniques, 9);
+  f_011_111_111_101_1(uniques, 9);
+  f_011_111_111_110_0(uniques, 9);
+  f_011_111_111_110_1(uniques, 9);
+  f_011_111_111_111_0(uniques, 9);
+  f_011_111_111_111_1(uniques, 9);
+  f_100_000_000_100_0(uniques, 9);
+  f_100_000_000_100_1(uniques, 9);
+  f_100_000_000_101_0(uniques, 9);
+  f_100_000_000_101_1(uniques, 9);
+  f_100_000_000_110_0(uniques, 9);
+  f_100_000_000_110_1(uniques, 9);
+  f_100_000_000_111_0(uniques, 9);
+  f_100_000_000_111_1(uniques, 9);
+  f_100_000_001_100_0(uniques, 9);
+  f_100_000_001_100_1(uniques, 9);
+  f_100_000_001_101_0(uniques, 9);
+  f_100_000_001_101_1(uniques, 9);
+  f_100_000_001_110_0(uniques, 9);
+  f_100_000_001_110_1(uniques, 9);
+  f_100_000_001_111_0(uniques, 9);
+  f_100_000_001_111_1(uniques, 9);
+  f_100_000_010_100_0(uniques, 9);
+  f_100_000_010_100_1(uniques, 9);
+  f_100_000_010_101_0(uniques, 9);
+  f_100_000_010_101_1(uniques, 9);
+  f_100_000_010_110_0(uniques, 9);
+  f_100_000_010_110_1(uniques, 9);
+  f_100_000_010_111_0(uniques, 9);
+  f_100_000_010_111_1(uniques, 9);
+  f_100_000_011_100_0(uniques, 9);
+  f_100_000_011_100_1(uniques, 9);
+  f_100_000_011_101_0(uniques, 9);
+  f_100_000_011_101_1(uniques, 9);
+  f_100_000_011_110_0(uniques, 9);
+  f_100_000_011_110_1(uniques, 9);
+  f_100_000_011_111_0(uniques, 9);
+  f_100_000_011_111_1(uniques, 9);
+  f_100_000_100_100_0(uniques, 9);
+  f_100_000_100_100_1(uniques, 9);
+  f_100_000_100_101_0(uniques, 9);
+  f_100_000_100_101_1(uniques, 9);
+  f_100_000_100_110_0(uniques, 9);
+  f_100_000_100_110_1(uniques, 9);
+  f_100_000_100_111_0(uniques, 9);
+  f_100_000_100_111_1(uniques, 9);
+  f_100_000_101_100_0(uniques, 9);
+  f_100_000_101_100_1(uniques, 9);
+  f_100_000_101_101_0(uniques, 9);
+  f_100_000_101_101_1(uniques, 9);
+  f_100_000_101_110_0(uniques, 9);
+  f_100_000_101_110_1(uniques, 9);
+  f_100_000_101_111_0(uniques, 9);
+  f_100_000_101_111_1(uniques, 9);
+  f_100_000_110_100_0(uniques, 9);
+  f_100_000_110_100_1(uniques, 9);
+  f_100_000_110_101_0(uniques, 9);
+  f_100_000_110_101_1(uniques, 9);
+  f_100_000_110_110_0(uniques, 9);
+  f_100_000_110_110_1(uniques, 9);
+  f_100_000_110_111_0(uniques, 9);
+  f_100_000_110_111_1(uniques, 9);
+  f_100_000_111_100_0(uniques, 9);
+  f_100_000_111_100_1(uniques, 9);
+  f_100_000_111_101_0(uniques, 9);
+  f_100_000_111_101_1(uniques, 9);
+  f_100_000_111_110_0(uniques, 9);
+  f_100_000_111_110_1(uniques, 9);
+  f_100_000_111_111_0(uniques, 9);
+  f_100_000_111_111_1(uniques, 9);
+  f_100_001_000_100_0(uniques, 9);
+  f_100_001_000_100_1(uniques, 9);
+  f_100_001_000_101_0(uniques, 9);
+  f_100_001_000_101_1(uniques, 9);
+  f_100_001_000_110_0(uniques, 9);
+  f_100_001_000_110_1(uniques, 9);
+  f_100_001_000_111_0(uniques, 9);
+  f_100_001_000_111_1(uniques, 9);
+  f_100_001_001_100_0(uniques, 9);
+  f_100_001_001_100_1(uniques, 9);
+  f_100_001_001_101_0(uniques, 9);
+  f_100_001_001_101_1(uniques, 9);
+  f_100_001_001_110_0(uniques, 9);
+  f_100_001_001_110_1(uniques, 9);
+  f_100_001_001_111_0(uniques, 9);
+  f_100_001_001_111_1(uniques, 9);
+  f_100_001_010_100_0(uniques, 9);
+  f_100_001_010_100_1(uniques, 9);
+  f_100_001_010_101_0(uniques, 9);
+  f_100_001_010_101_1(uniques, 9);
+  f_100_001_010_110_0(uniques, 9);
+  f_100_001_010_110_1(uniques, 9);
+  f_100_001_010_111_0(uniques, 9);
+  f_100_001_010_111_1(uniques, 9);
+  f_100_001_011_100_0(uniques, 9);
+  f_100_001_011_100_1(uniques, 9);
+  f_100_001_011_101_0(uniques, 9);
+  f_100_001_011_101_1(uniques, 9);
+  f_100_001_011_110_0(uniques, 9);
+  f_100_001_011_110_1(uniques, 9);
+  f_100_001_011_111_0(uniques, 9);
+  f_100_001_011_111_1(uniques, 9);
+  f_100_001_100_100_0(uniques, 9);
+  f_100_001_100_100_1(uniques, 9);
+  f_100_001_100_101_0(uniques, 9);
+  f_100_001_100_101_1(uniques, 9);
+  f_100_001_100_110_0(uniques, 9);
+  f_100_001_100_110_1(uniques, 9);
+  f_100_001_100_111_0(uniques, 9);
+  f_100_001_100_111_1(uniques, 9);
+  f_100_001_101_100_0(uniques, 9);
+  f_100_001_101_100_1(uniques, 9);
+  f_100_001_101_101_0(uniques, 9);
+  f_100_001_101_101_1(uniques, 9);
+  f_100_001_101_110_0(uniques, 9);
+  f_100_001_101_110_1(uniques, 9);
+  f_100_001_101_111_0(uniques, 9);
+  f_100_001_101_111_1(uniques, 9);
+  f_100_001_110_100_0(uniques, 9);
+  f_100_001_110_100_1(uniques, 9);
+  f_100_001_110_101_0(uniques, 9);
+  f_100_001_110_101_1(uniques, 9);
+  f_100_001_110_110_0(uniques, 9);
+  f_100_001_110_110_1(uniques, 9);
+  f_100_001_110_111_0(uniques, 9);
+  f_100_001_110_111_1(uniques, 9);
+  f_100_001_111_100_0(uniques, 9);
+  f_100_001_111_100_1(uniques, 9);
+  f_100_001_111_101_0(uniques, 9);
+  f_100_001_111_101_1(uniques, 9);
+  f_100_001_111_110_0(uniques, 9);
+  f_100_001_111_110_1(uniques, 9);
+  f_100_001_111_111_0(uniques, 9);
+  f_100_001_111_111_1(uniques, 9);
+  f_100_010_000_100_0(uniques, 9);
+  f_100_010_000_100_1(uniques, 9);
+  f_100_010_000_101_0(uniques, 9);
+  f_100_010_000_101_1(uniques, 9);
+  f_100_010_000_110_0(uniques, 9);
+  f_100_010_000_110_1(uniques, 9);
+  f_100_010_000_111_0(uniques, 9);
+  f_100_010_000_111_1(uniques, 9);
+  f_100_010_001_100_0(uniques, 9);
+  f_100_010_001_100_1(uniques, 9);
+  f_100_010_001_101_0(uniques, 9);
+  f_100_010_001_101_1(uniques, 9);
+  f_100_010_001_110_0(uniques, 9);
+  f_100_010_001_110_1(uniques, 9);
+  f_100_010_001_111_0(uniques, 9);
+  f_100_010_001_111_1(uniques, 9);
+  f_100_010_010_100_0(uniques, 9);
+  f_100_010_010_100_1(uniques, 9);
+  f_100_010_010_101_0(uniques, 9);
+  f_100_010_010_101_1(uniques, 9);
+  f_100_010_010_110_0(uniques, 9);
+  f_100_010_010_110_1(uniques, 9);
+  f_100_010_010_111_0(uniques, 9);
+  f_100_010_010_111_1(uniques, 9);
+  f_100_010_011_100_0(uniques, 9);
+  f_100_010_011_100_1(uniques, 9);
+  f_100_010_011_101_0(uniques, 9);
+  f_100_010_011_101_1(uniques, 9);
+  f_100_010_011_110_0(uniques, 9);
+  f_100_010_011_110_1(uniques, 9);
+  f_100_010_011_111_0(uniques, 9);
+  f_100_010_011_111_1(uniques, 9);
+  f_100_010_100_100_0(uniques, 9);
+  f_100_010_100_100_1(uniques, 9);
+  f_100_010_100_101_0(uniques, 9);
+  f_100_010_100_101_1(uniques, 9);
+  f_100_010_100_110_0(uniques, 9);
+  f_100_010_100_110_1(uniques, 9);
+  f_100_010_100_111_0(uniques, 9);
+  f_100_010_100_111_1(uniques, 9);
+  f_100_010_101_100_0(uniques, 9);
+  f_100_010_101_100_1(uniques, 9);
+  f_100_010_101_101_0(uniques, 9);
+  f_100_010_101_101_1(uniques, 9);
+  f_100_010_101_110_0(uniques, 9);
+  f_100_010_101_110_1(uniques, 9);
+  f_100_010_101_111_0(uniques, 9);
+  f_100_010_101_111_1(uniques, 9);
+  f_100_010_110_100_0(uniques, 9);
+  f_100_010_110_100_1(uniques, 9);
+  f_100_010_110_101_0(uniques, 9);
+  f_100_010_110_101_1(uniques, 9);
+  f_100_010_110_110_0(uniques, 9);
+  f_100_010_110_110_1(uniques, 9);
+  f_100_010_110_111_0(uniques, 9);
+  f_100_010_110_111_1(uniques, 9);
+  f_100_010_111_100_0(uniques, 9);
+  f_100_010_111_100_1(uniques, 9);
+  f_100_010_111_101_0(uniques, 9);
+  f_100_010_111_101_1(uniques, 9);
+  f_100_010_111_110_0(uniques, 9);
+  f_100_010_111_110_1(uniques, 9);
+  f_100_010_111_111_0(uniques, 9);
+  f_100_010_111_111_1(uniques, 9);
+  f_100_011_000_100_0(uniques, 9);
+  f_100_011_000_100_1(uniques, 9);
+  f_100_011_000_101_0(uniques, 9);
+  f_100_011_000_101_1(uniques, 9);
+  f_100_011_000_110_0(uniques, 9);
+  f_100_011_000_110_1(uniques, 9);
+  f_100_011_000_111_0(uniques, 9);
+  f_100_011_000_111_1(uniques, 9);
+  f_100_011_001_100_0(uniques, 9);
+  f_100_011_001_100_1(uniques, 9);
+  f_100_011_001_101_0(uniques, 9);
+  f_100_011_001_101_1(uniques, 9);
+  f_100_011_001_110_0(uniques, 9);
+  f_100_011_001_110_1(uniques, 9);
+  f_100_011_001_111_0(uniques, 9);
+  f_100_011_001_111_1(uniques, 9);
+  f_100_011_010_100_0(uniques, 9);
+  f_100_011_010_100_1(uniques, 9);
+  f_100_011_010_101_0(uniques, 9);
+  f_100_011_010_101_1(uniques, 9);
+  f_100_011_010_110_0(uniques, 9);
+  f_100_011_010_110_1(uniques, 9);
+  f_100_011_010_111_0(uniques, 9);
+  f_100_011_010_111_1(uniques, 9);
+  f_100_011_011_100_0(uniques, 9);
+  f_100_011_011_100_1(uniques, 9);
+  f_100_011_011_101_0(uniques, 9);
+  f_100_011_011_101_1(uniques, 9);
+  f_100_011_011_110_0(uniques, 9);
+  f_100_011_011_110_1(uniques, 9);
+  f_100_011_011_111_0(uniques, 9);
+  f_100_011_011_111_1(uniques, 9);
+  f_100_011_100_100_0(uniques, 9);
+  f_100_011_100_100_1(uniques, 9);
+  f_100_011_100_101_0(uniques, 9);
+  f_100_011_100_101_1(uniques, 9);
+  f_100_011_100_110_0(uniques, 9);
+  f_100_011_100_110_1(uniques, 9);
+  f_100_011_100_111_0(uniques, 9);
+  f_100_011_100_111_1(uniques, 9);
+  f_100_011_101_100_0(uniques, 9);
+  f_100_011_101_100_1(uniques, 9);
+  f_100_011_101_101_0(uniques, 9);
+  f_100_011_101_101_1(uniques, 9);
+  f_100_011_101_110_0(uniques, 9);
+  f_100_011_101_110_1(uniques, 9);
+  f_100_011_101_111_0(uniques, 9);
+  f_100_011_101_111_1(uniques, 9);
+  f_100_011_110_100_0(uniques, 9);
+  f_100_011_110_100_1(uniques, 9);
+  f_100_011_110_101_0(uniques, 9);
+  f_100_011_110_101_1(uniques, 9);
+  f_100_011_110_110_0(uniques, 9);
+  f_100_011_110_110_1(uniques, 9);
+  f_100_011_110_111_0(uniques, 9);
+  f_100_011_110_111_1(uniques, 9);
+  f_100_011_111_100_0(uniques, 9);
+  f_100_011_111_100_1(uniques, 9);
+  f_100_011_111_101_0(uniques, 9);
+  f_100_011_111_101_1(uniques, 9);
+  f_100_011_111_110_0(uniques, 9);
+  f_100_011_111_110_1(uniques, 9);
+  f_100_011_111_111_0(uniques, 9);
+  f_100_011_111_111_1(uniques, 9);
+  f_100_100_000_100_0(uniques, 9);
+  f_100_100_000_100_1(uniques, 9);
+  f_100_100_000_101_0(uniques, 9);
+  f_100_100_000_101_1(uniques, 9);
+  f_100_100_000_110_0(uniques, 9);
+  f_100_100_000_110_1(uniques, 9);
+  f_100_100_000_111_0(uniques, 9);
+  f_100_100_000_111_1(uniques, 9);
+  f_100_100_001_100_0(uniques, 9);
+  f_100_100_001_100_1(uniques, 9);
+  f_100_100_001_101_0(uniques, 9);
+  f_100_100_001_101_1(uniques, 9);
+  f_100_100_001_110_0(uniques, 9);
+  f_100_100_001_110_1(uniques, 9);
+  f_100_100_001_111_0(uniques, 9);
+  f_100_100_001_111_1(uniques, 9);
+  f_100_100_010_100_0(uniques, 9);
+  f_100_100_010_100_1(uniques, 9);
+  f_100_100_010_101_0(uniques, 9);
+  f_100_100_010_101_1(uniques, 9);
+  f_100_100_010_110_0(uniques, 9);
+  f_100_100_010_110_1(uniques, 9);
+  f_100_100_010_111_0(uniques, 9);
+  f_100_100_010_111_1(uniques, 9);
+  f_100_100_011_100_0(uniques, 9);
+  f_100_100_011_100_1(uniques, 9);
+  f_100_100_011_101_0(uniques, 9);
+  f_100_100_011_101_1(uniques, 9);
+  f_100_100_011_110_0(uniques, 9);
+  f_100_100_011_110_1(uniques, 9);
+  f_100_100_011_111_0(uniques, 9);
+  f_100_100_011_111_1(uniques, 9);
+  f_100_100_100_100_0(uniques, 9);
+  f_100_100_100_100_1(uniques, 9);
+  f_100_100_100_101_0(uniques, 9);
+  f_100_100_100_101_1(uniques, 9);
+  f_100_100_100_110_0(uniques, 9);
+  f_100_100_100_110_1(uniques, 9);
+  f_100_100_100_111_0(uniques, 9);
+  f_100_100_100_111_1(uniques, 9);
+  f_100_100_101_100_0(uniques, 9);
+  f_100_100_101_100_1(uniques, 9);
+  f_100_100_101_101_0(uniques, 9);
+  f_100_100_101_101_1(uniques, 9);
+  f_100_100_101_110_0(uniques, 9);
+  f_100_100_101_110_1(uniques, 9);
+  f_100_100_101_111_0(uniques, 9);
+  f_100_100_101_111_1(uniques, 9);
+  f_100_100_110_100_0(uniques, 9);
+  f_100_100_110_100_1(uniques, 9);
+  f_100_100_110_101_0(uniques, 9);
+  f_100_100_110_101_1(uniques, 9);
+  f_100_100_110_110_0(uniques, 9);
+  f_100_100_110_110_1(uniques, 9);
+  f_100_100_110_111_0(uniques, 9);
+  f_100_100_110_111_1(uniques, 9);
+  f_100_100_111_100_0(uniques, 9);
+  f_100_100_111_100_1(uniques, 9);
+  f_100_100_111_101_0(uniques, 9);
+  f_100_100_111_101_1(uniques, 9);
+  f_100_100_111_110_0(uniques, 9);
+  f_100_100_111_110_1(uniques, 9);
+  f_100_100_111_111_0(uniques, 9);
+  f_100_100_111_111_1(uniques, 9);
+  f_100_101_000_100_0(uniques, 9);
+  f_100_101_000_100_1(uniques, 9);
+  f_100_101_000_101_0(uniques, 9);
+  f_100_101_000_101_1(uniques, 9);
+  f_100_101_000_110_0(uniques, 9);
+  f_100_101_000_110_1(uniques, 9);
+  f_100_101_000_111_0(uniques, 9);
+  f_100_101_000_111_1(uniques, 9);
+  f_100_101_001_100_0(uniques, 9);
+  f_100_101_001_100_1(uniques, 9);
+  f_100_101_001_101_0(uniques, 9);
+  f_100_101_001_101_1(uniques, 9);
+  f_100_101_001_110_0(uniques, 9);
+  f_100_101_001_110_1(uniques, 9);
+  f_100_101_001_111_0(uniques, 9);
+  f_100_101_001_111_1(uniques, 9);
+  f_100_101_010_100_0(uniques, 9);
+  f_100_101_010_100_1(uniques, 9);
+  f_100_101_010_101_0(uniques, 9);
+  f_100_101_010_101_1(uniques, 9);
+  f_100_101_010_110_0(uniques, 9);
+  f_100_101_010_110_1(uniques, 9);
+  f_100_101_010_111_0(uniques, 9);
+  f_100_101_010_111_1(uniques, 9);
+  f_100_101_011_100_0(uniques, 9);
+  f_100_101_011_100_1(uniques, 9);
+  f_100_101_011_101_0(uniques, 9);
+  f_100_101_011_101_1(uniques, 9);
+  f_100_101_011_110_0(uniques, 9);
+  f_100_101_011_110_1(uniques, 9);
+  f_100_101_011_111_0(uniques, 9);
+  f_100_101_011_111_1(uniques, 9);
+  f_100_101_100_100_0(uniques, 9);
+  f_100_101_100_100_1(uniques, 9);
+  f_100_101_100_101_0(uniques, 9);
+  f_100_101_100_101_1(uniques, 9);
+  f_100_101_100_110_0(uniques, 9);
+  f_100_101_100_110_1(uniques, 9);
+  f_100_101_100_111_0(uniques, 9);
+  f_100_101_100_111_1(uniques, 9);
+  f_100_101_101_100_0(uniques, 9);
+  f_100_101_101_100_1(uniques, 9);
+  f_100_101_101_101_0(uniques, 9);
+  f_100_101_101_101_1(uniques, 9);
+  f_100_101_101_110_0(uniques, 9);
+  f_100_101_101_110_1(uniques, 9);
+  f_100_101_101_111_0(uniques, 9);
+  f_100_101_101_111_1(uniques, 9);
+  f_100_101_110_100_0(uniques, 9);
+  f_100_101_110_100_1(uniques, 9);
+  f_100_101_110_101_0(uniques, 9);
+  f_100_101_110_101_1(uniques, 9);
+  f_100_101_110_110_0(uniques, 9);
+  f_100_101_110_110_1(uniques, 9);
+  f_100_101_110_111_0(uniques, 9);
+  f_100_101_110_111_1(uniques, 9);
+  f_100_101_111_100_0(uniques, 9);
+  f_100_101_111_100_1(uniques, 9);
+  f_100_101_111_101_0(uniques, 9);
+  f_100_101_111_101_1(uniques, 9);
+  f_100_101_111_110_0(uniques, 9);
+  f_100_101_111_110_1(uniques, 9);
+  f_100_101_111_111_0(uniques, 9);
+  f_100_101_111_111_1(uniques, 9);
+  f_100_110_000_100_0(uniques, 9);
+  f_100_110_000_100_1(uniques, 9);
+  f_100_110_000_101_0(uniques, 9);
+  f_100_110_000_101_1(uniques, 9);
+  f_100_110_000_110_0(uniques, 9);
+  f_100_110_000_110_1(uniques, 9);
+  f_100_110_000_111_0(uniques, 9);
+  f_100_110_000_111_1(uniques, 9);
+  f_100_110_001_100_0(uniques, 9);
+  f_100_110_001_100_1(uniques, 9);
+  f_100_110_001_101_0(uniques, 9);
+  f_100_110_001_101_1(uniques, 9);
+  f_100_110_001_110_0(uniques, 9);
+  f_100_110_001_110_1(uniques, 9);
+  f_100_110_001_111_0(uniques, 9);
+  f_100_110_001_111_1(uniques, 9);
+  f_100_110_010_100_0(uniques, 9);
+  f_100_110_010_100_1(uniques, 9);
+  f_100_110_010_101_0(uniques, 9);
+  f_100_110_010_101_1(uniques, 9);
+  f_100_110_010_110_0(uniques, 9);
+  f_100_110_010_110_1(uniques, 9);
+  f_100_110_010_111_0(uniques, 9);
+  f_100_110_010_111_1(uniques, 9);
+  f_100_110_011_100_0(uniques, 9);
+  f_100_110_011_100_1(uniques, 9);
+  f_100_110_011_101_0(uniques, 9);
+  f_100_110_011_101_1(uniques, 9);
+  f_100_110_011_110_0(uniques, 9);
+  f_100_110_011_110_1(uniques, 9);
+  f_100_110_011_111_0(uniques, 9);
+  f_100_110_011_111_1(uniques, 9);
+  f_100_110_100_100_0(uniques, 9);
+  f_100_110_100_100_1(uniques, 9);
+  f_100_110_100_101_0(uniques, 9);
+  f_100_110_100_101_1(uniques, 9);
+  f_100_110_100_110_0(uniques, 9);
+  f_100_110_100_110_1(uniques, 9);
+  f_100_110_100_111_0(uniques, 9);
+  f_100_110_100_111_1(uniques, 9);
+  f_100_110_101_100_0(uniques, 9);
+  f_100_110_101_100_1(uniques, 9);
+  f_100_110_101_101_0(uniques, 9);
+  f_100_110_101_101_1(uniques, 9);
+  f_100_110_101_110_0(uniques, 9);
+  f_100_110_101_110_1(uniques, 9);
+  f_100_110_101_111_0(uniques, 9);
+  f_100_110_101_111_1(uniques, 9);
+  f_100_110_110_100_0(uniques, 9);
+  f_100_110_110_100_1(uniques, 9);
+  f_100_110_110_101_0(uniques, 9);
+  f_100_110_110_101_1(uniques, 9);
+  f_100_110_110_110_0(uniques, 9);
+  f_100_110_110_110_1(uniques, 9);
+  f_100_110_110_111_0(uniques, 9);
+  f_100_110_110_111_1(uniques, 9);
+  f_100_110_111_100_0(uniques, 9);
+  f_100_110_111_100_1(uniques, 9);
+  f_100_110_111_101_0(uniques, 9);
+  f_100_110_111_101_1(uniques, 9);
+  f_100_110_111_110_0(uniques, 9);
+  f_100_110_111_110_1(uniques, 9);
+  f_100_110_111_111_0(uniques, 9);
+  f_100_110_111_111_1(uniques, 9);
+  f_100_111_000_100_0(uniques, 9);
+  f_100_111_000_100_1(uniques, 9);
+  f_100_111_000_101_0(uniques, 9);
+  f_100_111_000_101_1(uniques, 9);
+  f_100_111_000_110_0(uniques, 9);
+  f_100_111_000_110_1(uniques, 9);
+  f_100_111_000_111_0(uniques, 9);
+  f_100_111_000_111_1(uniques, 9);
+  f_100_111_001_100_0(uniques, 9);
+  f_100_111_001_100_1(uniques, 9);
+  f_100_111_001_101_0(uniques, 9);
+  f_100_111_001_101_1(uniques, 9);
+  f_100_111_001_110_0(uniques, 9);
+  f_100_111_001_110_1(uniques, 9);
+  f_100_111_001_111_0(uniques, 9);
+  f_100_111_001_111_1(uniques, 9);
+  f_100_111_010_100_0(uniques, 9);
+  f_100_111_010_100_1(uniques, 9);
+  f_100_111_010_101_0(uniques, 9);
+  f_100_111_010_101_1(uniques, 9);
+  f_100_111_010_110_0(uniques, 9);
+  f_100_111_010_110_1(uniques, 9);
+  f_100_111_010_111_0(uniques, 9);
+  f_100_111_010_111_1(uniques, 9);
+  f_100_111_011_100_0(uniques, 9);
+  f_100_111_011_100_1(uniques, 9);
+  f_100_111_011_101_0(uniques, 9);
+  f_100_111_011_101_1(uniques, 9);
+  f_100_111_011_110_0(uniques, 9);
+  f_100_111_011_110_1(uniques, 9);
+  f_100_111_011_111_0(uniques, 9);
+  f_100_111_011_111_1(uniques, 9);
+  f_100_111_100_100_0(uniques, 9);
+  f_100_111_100_100_1(uniques, 9);
+  f_100_111_100_101_0(uniques, 9);
+  f_100_111_100_101_1(uniques, 9);
+  f_100_111_100_110_0(uniques, 9);
+  f_100_111_100_110_1(uniques, 9);
+  f_100_111_100_111_0(uniques, 9);
+  f_100_111_100_111_1(uniques, 9);
+  f_100_111_101_100_0(uniques, 9);
+  f_100_111_101_100_1(uniques, 9);
+  f_100_111_101_101_0(uniques, 9);
+  f_100_111_101_101_1(uniques, 9);
+  f_100_111_101_110_0(uniques, 9);
+  f_100_111_101_110_1(uniques, 9);
+  f_100_111_101_111_0(uniques, 9);
+  f_100_111_101_111_1(uniques, 9);
+  f_100_111_110_100_0(uniques, 9);
+  f_100_111_110_100_1(uniques, 9);
+  f_100_111_110_101_0(uniques, 9);
+  f_100_111_110_101_1(uniques, 9);
+  f_100_111_110_110_0(uniques, 9);
+  f_100_111_110_110_1(uniques, 9);
+  f_100_111_110_111_0(uniques, 9);
+  f_100_111_110_111_1(uniques, 9);
+  f_100_111_111_100_0(uniques, 9);
+  f_100_111_111_100_1(uniques, 9);
+  f_100_111_111_101_0(uniques, 9);
+  f_100_111_111_101_1(uniques, 9);
+  f_100_111_111_110_0(uniques, 9);
+  f_100_111_111_110_1(uniques, 9);
+  f_100_111_111_111_0(uniques, 9);
+  f_100_111_111_111_1(uniques, 9);
+  f_101_000_000_100_0(uniques, 9);
+  f_101_000_000_100_1(uniques, 9);
+  f_101_000_000_101_0(uniques, 9);
+  f_101_000_000_101_1(uniques, 9);
+  f_101_000_000_110_0(uniques, 9);
+  f_101_000_000_110_1(uniques, 9);
+  f_101_000_000_111_0(uniques, 9);
+  f_101_000_000_111_1(uniques, 9);
+  f_101_000_001_100_0(uniques, 9);
+  f_101_000_001_100_1(uniques, 9);
+  f_101_000_001_101_0(uniques, 9);
+  f_101_000_001_101_1(uniques, 9);
+  f_101_000_001_110_0(uniques, 9);
+  f_101_000_001_110_1(uniques, 9);
+  f_101_000_001_111_0(uniques, 9);
+  f_101_000_001_111_1(uniques, 9);
+  f_101_000_010_100_0(uniques, 9);
+  f_101_000_010_100_1(uniques, 9);
+  f_101_000_010_101_0(uniques, 9);
+  f_101_000_010_101_1(uniques, 9);
+  f_101_000_010_110_0(uniques, 9);
+  f_101_000_010_110_1(uniques, 9);
+  f_101_000_010_111_0(uniques, 9);
+  f_101_000_010_111_1(uniques, 9);
+  f_101_000_011_100_0(uniques, 9);
+  f_101_000_011_100_1(uniques, 9);
+  f_101_000_011_101_0(uniques, 9);
+  f_101_000_011_101_1(uniques, 9);
+  f_101_000_011_110_0(uniques, 9);
+  f_101_000_011_110_1(uniques, 9);
+  f_101_000_011_111_0(uniques, 9);
+  f_101_000_011_111_1(uniques, 9);
+  f_101_000_100_100_0(uniques, 9);
+  f_101_000_100_100_1(uniques, 9);
+  f_101_000_100_101_0(uniques, 9);
+  f_101_000_100_101_1(uniques, 9);
+  f_101_000_100_110_0(uniques, 9);
+  f_101_000_100_110_1(uniques, 9);
+  f_101_000_100_111_0(uniques, 9);
+  f_101_000_100_111_1(uniques, 9);
+  f_101_000_101_100_0(uniques, 9);
+  f_101_000_101_100_1(uniques, 9);
+  f_101_000_101_101_0(uniques, 9);
+  f_101_000_101_101_1(uniques, 9);
+  f_101_000_101_110_0(uniques, 9);
+  f_101_000_101_110_1(uniques, 9);
+  f_101_000_101_111_0(uniques, 9);
+  f_101_000_101_111_1(uniques, 9);
+  f_101_000_110_100_0(uniques, 9);
+  f_101_000_110_100_1(uniques, 9);
+  f_101_000_110_101_0(uniques, 9);
+  f_101_000_110_101_1(uniques, 9);
+  f_101_000_110_110_0(uniques, 9);
+  f_101_000_110_110_1(uniques, 9);
+  f_101_000_110_111_0(uniques, 9);
+  f_101_000_110_111_1(uniques, 9);
+  f_101_000_111_100_0(uniques, 9);
+  f_101_000_111_100_1(uniques, 9);
+  f_101_000_111_101_0(uniques, 9);
+  f_101_000_111_101_1(uniques, 9);
+  f_101_000_111_110_0(uniques, 9);
+  f_101_000_111_110_1(uniques, 9);
+  f_101_000_111_111_0(uniques, 9);
+  f_101_000_111_111_1(uniques, 9);
+  f_101_001_000_100_0(uniques, 9);
+  f_101_001_000_100_1(uniques, 9);
+  f_101_001_000_101_0(uniques, 9);
+  f_101_001_000_101_1(uniques, 9);
+  f_101_001_000_110_0(uniques, 9);
+  f_101_001_000_110_1(uniques, 9);
+  f_101_001_000_111_0(uniques, 9);
+  f_101_001_000_111_1(uniques, 9);
+  f_101_001_001_100_0(uniques, 9);
+  f_101_001_001_100_1(uniques, 9);
+  f_101_001_001_101_0(uniques, 9);
+  f_101_001_001_101_1(uniques, 9);
+  f_101_001_001_110_0(uniques, 9);
+  f_101_001_001_110_1(uniques, 9);
+  f_101_001_001_111_0(uniques, 9);
+  f_101_001_001_111_1(uniques, 9);
+  f_101_001_010_100_0(uniques, 9);
+  f_101_001_010_100_1(uniques, 9);
+  f_101_001_010_101_0(uniques, 9);
+  f_101_001_010_101_1(uniques, 9);
+  f_101_001_010_110_0(uniques, 9);
+  f_101_001_010_110_1(uniques, 9);
+  f_101_001_010_111_0(uniques, 9);
+  f_101_001_010_111_1(uniques, 9);
+  f_101_001_011_100_0(uniques, 9);
+  f_101_001_011_100_1(uniques, 9);
+  f_101_001_011_101_0(uniques, 9);
+  f_101_001_011_101_1(uniques, 9);
+  f_101_001_011_110_0(uniques, 9);
+  f_101_001_011_110_1(uniques, 9);
+  f_101_001_011_111_0(uniques, 9);
+  f_101_001_011_111_1(uniques, 9);
+  f_101_001_100_100_0(uniques, 9);
+  f_101_001_100_100_1(uniques, 9);
+  f_101_001_100_101_0(uniques, 9);
+  f_101_001_100_101_1(uniques, 9);
+  f_101_001_100_110_0(uniques, 9);
+  f_101_001_100_110_1(uniques, 9);
+  f_101_001_100_111_0(uniques, 9);
+  f_101_001_100_111_1(uniques, 9);
+  f_101_001_101_100_0(uniques, 9);
+  f_101_001_101_100_1(uniques, 9);
+  f_101_001_101_101_0(uniques, 9);
+  f_101_001_101_101_1(uniques, 9);
+  f_101_001_101_110_0(uniques, 9);
+  f_101_001_101_110_1(uniques, 9);
+  f_101_001_101_111_0(uniques, 9);
+  f_101_001_101_111_1(uniques, 9);
+  f_101_001_110_100_0(uniques, 9);
+  f_101_001_110_100_1(uniques, 9);
+  f_101_001_110_101_0(uniques, 9);
+  f_101_001_110_101_1(uniques, 9);
+  f_101_001_110_110_0(uniques, 9);
+  f_101_001_110_110_1(uniques, 9);
+  f_101_001_110_111_0(uniques, 9);
+  f_101_001_110_111_1(uniques, 9);
+  f_101_001_111_100_0(uniques, 9);
+  f_101_001_111_100_1(uniques, 9);
+  f_101_001_111_101_0(uniques, 9);
+  f_101_001_111_101_1(uniques, 9);
+  f_101_001_111_110_0(uniques, 9);
+  f_101_001_111_110_1(uniques, 9);
+  f_101_001_111_111_0(uniques, 9);
+  f_101_001_111_111_1(uniques, 9);
+  f_101_010_000_100_0(uniques, 9);
+  f_101_010_000_100_1(uniques, 9);
+  f_101_010_000_101_0(uniques, 9);
+  f_101_010_000_101_1(uniques, 9);
+  f_101_010_000_110_0(uniques, 9);
+  f_101_010_000_110_1(uniques, 9);
+  f_101_010_000_111_0(uniques, 9);
+  f_101_010_000_111_1(uniques, 9);
+  f_101_010_001_100_0(uniques, 9);
+  f_101_010_001_100_1(uniques, 9);
+  f_101_010_001_101_0(uniques, 9);
+  f_101_010_001_101_1(uniques, 9);
+  f_101_010_001_110_0(uniques, 9);
+  f_101_010_001_110_1(uniques, 9);
+  f_101_010_001_111_0(uniques, 9);
+  f_101_010_001_111_1(uniques, 9);
+  f_101_010_010_100_0(uniques, 9);
+  f_101_010_010_100_1(uniques, 9);
+  f_101_010_010_101_0(uniques, 9);
+  f_101_010_010_101_1(uniques, 9);
+  f_101_010_010_110_0(uniques, 9);
+  f_101_010_010_110_1(uniques, 9);
+  f_101_010_010_111_0(uniques, 9);
+  f_101_010_010_111_1(uniques, 9);
+  f_101_010_011_100_0(uniques, 9);
+  f_101_010_011_100_1(uniques, 9);
+  f_101_010_011_101_0(uniques, 9);
+  f_101_010_011_101_1(uniques, 9);
+  f_101_010_011_110_0(uniques, 9);
+  f_101_010_011_110_1(uniques, 9);
+  f_101_010_011_111_0(uniques, 9);
+  f_101_010_011_111_1(uniques, 9);
+  f_101_010_100_100_0(uniques, 9);
+  f_101_010_100_100_1(uniques, 9);
+  f_101_010_100_101_0(uniques, 9);
+  f_101_010_100_101_1(uniques, 9);
+  f_101_010_100_110_0(uniques, 9);
+  f_101_010_100_110_1(uniques, 9);
+  f_101_010_100_111_0(uniques, 9);
+  f_101_010_100_111_1(uniques, 9);
+  f_101_010_101_100_0(uniques, 9);
+  f_101_010_101_100_1(uniques, 9);
+  f_101_010_101_101_0(uniques, 9);
+  f_101_010_101_101_1(uniques, 9);
+  f_101_010_101_110_0(uniques, 9);
+  f_101_010_101_110_1(uniques, 9);
+  f_101_010_101_111_0(uniques, 9);
+  f_101_010_101_111_1(uniques, 9);
+  f_101_010_110_100_0(uniques, 9);
+  f_101_010_110_100_1(uniques, 9);
+  f_101_010_110_101_0(uniques, 9);
+  f_101_010_110_101_1(uniques, 9);
+  f_101_010_110_110_0(uniques, 9);
+  f_101_010_110_110_1(uniques, 9);
+  f_101_010_110_111_0(uniques, 9);
+  f_101_010_110_111_1(uniques, 9);
+  f_101_010_111_100_0(uniques, 9);
+  f_101_010_111_100_1(uniques, 9);
+  f_101_010_111_101_0(uniques, 9);
+  f_101_010_111_101_1(uniques, 9);
+  f_101_010_111_110_0(uniques, 9);
+  f_101_010_111_110_1(uniques, 9);
+  f_101_010_111_111_0(uniques, 9);
+  f_101_010_111_111_1(uniques, 9);
+  f_101_011_000_100_0(uniques, 9);
+  f_101_011_000_100_1(uniques, 9);
+  f_101_011_000_101_0(uniques, 9);
+  f_101_011_000_101_1(uniques, 9);
+  f_101_011_000_110_0(uniques, 9);
+  f_101_011_000_110_1(uniques, 9);
+  f_101_011_000_111_0(uniques, 9);
+  f_101_011_000_111_1(uniques, 9);
+  f_101_011_001_100_0(uniques, 9);
+  f_101_011_001_100_1(uniques, 9);
+  f_101_011_001_101_0(uniques, 9);
+  f_101_011_001_101_1(uniques, 9);
+  f_101_011_001_110_0(uniques, 9);
+  f_101_011_001_110_1(uniques, 9);
+  f_101_011_001_111_0(uniques, 9);
+  f_101_011_001_111_1(uniques, 9);
+  f_101_011_010_100_0(uniques, 9);
+  f_101_011_010_100_1(uniques, 9);
+  f_101_011_010_101_0(uniques, 9);
+  f_101_011_010_101_1(uniques, 9);
+  f_101_011_010_110_0(uniques, 9);
+  f_101_011_010_110_1(uniques, 9);
+  f_101_011_010_111_0(uniques, 9);
+  f_101_011_010_111_1(uniques, 9);
+  f_101_011_011_100_0(uniques, 9);
+  f_101_011_011_100_1(uniques, 9);
+  f_101_011_011_101_0(uniques, 9);
+  f_101_011_011_101_1(uniques, 9);
+  f_101_011_011_110_0(uniques, 9);
+  f_101_011_011_110_1(uniques, 9);
+  f_101_011_011_111_0(uniques, 9);
+  f_101_011_011_111_1(uniques, 9);
+  f_101_011_100_100_0(uniques, 9);
+  f_101_011_100_100_1(uniques, 9);
+  f_101_011_100_101_0(uniques, 9);
+  f_101_011_100_101_1(uniques, 9);
+  f_101_011_100_110_0(uniques, 9);
+  f_101_011_100_110_1(uniques, 9);
+  f_101_011_100_111_0(uniques, 9);
+  f_101_011_100_111_1(uniques, 9);
+  f_101_011_101_100_0(uniques, 9);
+  f_101_011_101_100_1(uniques, 9);
+  f_101_011_101_101_0(uniques, 9);
+  f_101_011_101_101_1(uniques, 9);
+  f_101_011_101_110_0(uniques, 9);
+  f_101_011_101_110_1(uniques, 9);
+  f_101_011_101_111_0(uniques, 9);
+  f_101_011_101_111_1(uniques, 9);
+  f_101_011_110_100_0(uniques, 9);
+  f_101_011_110_100_1(uniques, 9);
+  f_101_011_110_101_0(uniques, 9);
+  f_101_011_110_101_1(uniques, 9);
+  f_101_011_110_110_0(uniques, 9);
+  f_101_011_110_110_1(uniques, 9);
+  f_101_011_110_111_0(uniques, 9);
+  f_101_011_110_111_1(uniques, 9);
+  f_101_011_111_100_0(uniques, 9);
+  f_101_011_111_100_1(uniques, 9);
+  f_101_011_111_101_0(uniques, 9);
+  f_101_011_111_101_1(uniques, 9);
+  f_101_011_111_110_0(uniques, 9);
+  f_101_011_111_110_1(uniques, 9);
+  f_101_011_111_111_0(uniques, 9);
+  f_101_011_111_111_1(uniques, 9);
+  f_101_100_000_100_0(uniques, 9);
+  f_101_100_000_100_1(uniques, 9);
+  f_101_100_000_101_0(uniques, 9);
+  f_101_100_000_101_1(uniques, 9);
+  f_101_100_000_110_0(uniques, 9);
+  f_101_100_000_110_1(uniques, 9);
+  f_101_100_000_111_0(uniques, 9);
+  f_101_100_000_111_1(uniques, 9);
+  f_101_100_001_100_0(uniques, 9);
+  f_101_100_001_100_1(uniques, 9);
+  f_101_100_001_101_0(uniques, 9);
+  f_101_100_001_101_1(uniques, 9);
+  f_101_100_001_110_0(uniques, 9);
+  f_101_100_001_110_1(uniques, 9);
+  f_101_100_001_111_0(uniques, 9);
+  f_101_100_001_111_1(uniques, 9);
+  f_101_100_010_100_0(uniques, 9);
+  f_101_100_010_100_1(uniques, 9);
+  f_101_100_010_101_0(uniques, 9);
+  f_101_100_010_101_1(uniques, 9);
+  f_101_100_010_110_0(uniques, 9);
+  f_101_100_010_110_1(uniques, 9);
+  f_101_100_010_111_0(uniques, 9);
+  f_101_100_010_111_1(uniques, 9);
+  f_101_100_011_100_0(uniques, 9);
+  f_101_100_011_100_1(uniques, 9);
+  f_101_100_011_101_0(uniques, 9);
+  f_101_100_011_101_1(uniques, 9);
+  f_101_100_011_110_0(uniques, 9);
+  f_101_100_011_110_1(uniques, 9);
+  f_101_100_011_111_0(uniques, 9);
+  f_101_100_011_111_1(uniques, 9);
+  f_101_100_100_100_0(uniques, 9);
+  f_101_100_100_100_1(uniques, 9);
+  f_101_100_100_101_0(uniques, 9);
+  f_101_100_100_101_1(uniques, 9);
+  f_101_100_100_110_0(uniques, 9);
+  f_101_100_100_110_1(uniques, 9);
+  f_101_100_100_111_0(uniques, 9);
+  f_101_100_100_111_1(uniques, 9);
+  f_101_100_101_100_0(uniques, 9);
+  f_101_100_101_100_1(uniques, 9);
+  f_101_100_101_101_0(uniques, 9);
+  f_101_100_101_101_1(uniques, 9);
+  f_101_100_101_110_0(uniques, 9);
+  f_101_100_101_110_1(uniques, 9);
+  f_101_100_101_111_0(uniques, 9);
+  f_101_100_101_111_1(uniques, 9);
+  f_101_100_110_100_0(uniques, 9);
+  f_101_100_110_100_1(uniques, 9);
+  f_101_100_110_101_0(uniques, 9);
+  f_101_100_110_101_1(uniques, 9);
+  f_101_100_110_110_0(uniques, 9);
+  f_101_100_110_110_1(uniques, 9);
+  f_101_100_110_111_0(uniques, 9);
+  f_101_100_110_111_1(uniques, 9);
+  f_101_100_111_100_0(uniques, 9);
+  f_101_100_111_100_1(uniques, 9);
+  f_101_100_111_101_0(uniques, 9);
+  f_101_100_111_101_1(uniques, 9);
+  f_101_100_111_110_0(uniques, 9);
+  f_101_100_111_110_1(uniques, 9);
+  f_101_100_111_111_0(uniques, 9);
+  f_101_100_111_111_1(uniques, 9);
+  f_101_101_000_100_0(uniques, 9);
+  f_101_101_000_100_1(uniques, 9);
+  f_101_101_000_101_0(uniques, 9);
+  f_101_101_000_101_1(uniques, 9);
+  f_101_101_000_110_0(uniques, 9);
+  f_101_101_000_110_1(uniques, 9);
+  f_101_101_000_111_0(uniques, 9);
+  f_101_101_000_111_1(uniques, 9);
+  f_101_101_001_100_0(uniques, 9);
+  f_101_101_001_100_1(uniques, 9);
+  f_101_101_001_101_0(uniques, 9);
+  f_101_101_001_101_1(uniques, 9);
+  f_101_101_001_110_0(uniques, 9);
+  f_101_101_001_110_1(uniques, 9);
+  f_101_101_001_111_0(uniques, 9);
+  f_101_101_001_111_1(uniques, 9);
+  f_101_101_010_100_0(uniques, 9);
+  f_101_101_010_100_1(uniques, 9);
+  f_101_101_010_101_0(uniques, 9);
+  f_101_101_010_101_1(uniques, 9);
+  f_101_101_010_110_0(uniques, 9);
+  f_101_101_010_110_1(uniques, 9);
+  f_101_101_010_111_0(uniques, 9);
+  f_101_101_010_111_1(uniques, 9);
+  f_101_101_011_100_0(uniques, 9);
+  f_101_101_011_100_1(uniques, 9);
+  f_101_101_011_101_0(uniques, 9);
+  f_101_101_011_101_1(uniques, 9);
+  f_101_101_011_110_0(uniques, 9);
+  f_101_101_011_110_1(uniques, 9);
+  f_101_101_011_111_0(uniques, 9);
+  f_101_101_011_111_1(uniques, 9);
+  f_101_101_100_100_0(uniques, 9);
+  f_101_101_100_100_1(uniques, 9);
+  f_101_101_100_101_0(uniques, 9);
+  f_101_101_100_101_1(uniques, 9);
+  f_101_101_100_110_0(uniques, 9);
+  f_101_101_100_110_1(uniques, 9);
+  f_101_101_100_111_0(uniques, 9);
+  f_101_101_100_111_1(uniques, 9);
+  f_101_101_101_100_0(uniques, 9);
+  f_101_101_101_100_1(uniques, 9);
+  f_101_101_101_101_0(uniques, 9);
+  f_101_101_101_101_1(uniques, 9);
+  f_101_101_101_110_0(uniques, 9);
+  f_101_101_101_110_1(uniques, 9);
+  f_101_101_101_111_0(uniques, 9);
+  f_101_101_101_111_1(uniques, 9);
+  f_101_101_110_100_0(uniques, 9);
+  f_101_101_110_100_1(uniques, 9);
+  f_101_101_110_101_0(uniques, 9);
+  f_101_101_110_101_1(uniques, 9);
+  f_101_101_110_110_0(uniques, 9);
+  f_101_101_110_110_1(uniques, 9);
+  f_101_101_110_111_0(uniques, 9);
+  f_101_101_110_111_1(uniques, 9);
+  f_101_101_111_100_0(uniques, 9);
+  f_101_101_111_100_1(uniques, 9);
+  f_101_101_111_101_0(uniques, 9);
+  f_101_101_111_101_1(uniques, 9);
+  f_101_101_111_110_0(uniques, 9);
+  f_101_101_111_110_1(uniques, 9);
+  f_101_101_111_111_0(uniques, 9);
+  f_101_101_111_111_1(uniques, 9);
+  f_101_110_000_100_0(uniques, 9);
+  f_101_110_000_100_1(uniques, 9);
+  f_101_110_000_101_0(uniques, 9);
+  f_101_110_000_101_1(uniques, 9);
+  f_101_110_000_110_0(uniques, 9);
+  f_101_110_000_110_1(uniques, 9);
+  f_101_110_000_111_0(uniques, 9);
+  f_101_110_000_111_1(uniques, 9);
+  f_101_110_001_100_0(uniques, 9);
+  f_101_110_001_100_1(uniques, 9);
+  f_101_110_001_101_0(uniques, 9);
+  f_101_110_001_101_1(uniques, 9);
+  f_101_110_001_110_0(uniques, 9);
+  f_101_110_001_110_1(uniques, 9);
+  f_101_110_001_111_0(uniques, 9);
+  f_101_110_001_111_1(uniques, 9);
+  f_101_110_010_100_0(uniques, 9);
+  f_101_110_010_100_1(uniques, 9);
+  f_101_110_010_101_0(uniques, 9);
+  f_101_110_010_101_1(uniques, 9);
+  f_101_110_010_110_0(uniques, 9);
+  f_101_110_010_110_1(uniques, 9);
+  f_101_110_010_111_0(uniques, 9);
+  f_101_110_010_111_1(uniques, 9);
+  f_101_110_011_100_0(uniques, 9);
+  f_101_110_011_100_1(uniques, 9);
+  f_101_110_011_101_0(uniques, 9);
+  f_101_110_011_101_1(uniques, 9);
+  f_101_110_011_110_0(uniques, 9);
+  f_101_110_011_110_1(uniques, 9);
+  f_101_110_011_111_0(uniques, 9);
+  f_101_110_011_111_1(uniques, 9);
+  f_101_110_100_100_0(uniques, 9);
+  f_101_110_100_100_1(uniques, 9);
+  f_101_110_100_101_0(uniques, 9);
+  f_101_110_100_101_1(uniques, 9);
+  f_101_110_100_110_0(uniques, 9);
+  f_101_110_100_110_1(uniques, 9);
+  f_101_110_100_111_0(uniques, 9);
+  f_101_110_100_111_1(uniques, 9);
+  f_101_110_101_100_0(uniques, 9);
+  f_101_110_101_100_1(uniques, 9);
+  f_101_110_101_101_0(uniques, 9);
+  f_101_110_101_101_1(uniques, 9);
+  f_101_110_101_110_0(uniques, 9);
+  f_101_110_101_110_1(uniques, 9);
+  f_101_110_101_111_0(uniques, 9);
+  f_101_110_101_111_1(uniques, 9);
+  f_101_110_110_100_0(uniques, 9);
+  f_101_110_110_100_1(uniques, 9);
+  f_101_110_110_101_0(uniques, 9);
+  f_101_110_110_101_1(uniques, 9);
+  f_101_110_110_110_0(uniques, 9);
+  f_101_110_110_110_1(uniques, 9);
+  f_101_110_110_111_0(uniques, 9);
+  f_101_110_110_111_1(uniques, 9);
+  f_101_110_111_100_0(uniques, 9);
+  f_101_110_111_100_1(uniques, 9);
+  f_101_110_111_101_0(uniques, 9);
+  f_101_110_111_101_1(uniques, 9);
+  f_101_110_111_110_0(uniques, 9);
+  f_101_110_111_110_1(uniques, 9);
+  f_101_110_111_111_0(uniques, 9);
+  f_101_110_111_111_1(uniques, 9);
+  f_101_111_000_100_0(uniques, 9);
+  f_101_111_000_100_1(uniques, 9);
+  f_101_111_000_101_0(uniques, 9);
+  f_101_111_000_101_1(uniques, 9);
+  f_101_111_000_110_0(uniques, 9);
+  f_101_111_000_110_1(uniques, 9);
+  f_101_111_000_111_0(uniques, 9);
+  f_101_111_000_111_1(uniques, 9);
+  f_101_111_001_100_0(uniques, 9);
+  f_101_111_001_100_1(uniques, 9);
+  f_101_111_001_101_0(uniques, 9);
+  f_101_111_001_101_1(uniques, 9);
+  f_101_111_001_110_0(uniques, 9);
+  f_101_111_001_110_1(uniques, 9);
+  f_101_111_001_111_0(uniques, 9);
+  f_101_111_001_111_1(uniques, 9);
+  f_101_111_010_100_0(uniques, 9);
+  f_101_111_010_100_1(uniques, 9);
+  f_101_111_010_101_0(uniques, 9);
+  f_101_111_010_101_1(uniques, 9);
+  f_101_111_010_110_0(uniques, 9);
+  f_101_111_010_110_1(uniques, 9);
+  f_101_111_010_111_0(uniques, 9);
+  f_101_111_010_111_1(uniques, 9);
+  f_101_111_011_100_0(uniques, 9);
+  f_101_111_011_100_1(uniques, 9);
+  f_101_111_011_101_0(uniques, 9);
+  f_101_111_011_101_1(uniques, 9);
+  f_101_111_011_110_0(uniques, 9);
+  f_101_111_011_110_1(uniques, 9);
+  f_101_111_011_111_0(uniques, 9);
+  f_101_111_011_111_1(uniques, 9);
+  f_101_111_100_100_0(uniques, 9);
+  f_101_111_100_100_1(uniques, 9);
+  f_101_111_100_101_0(uniques, 9);
+  f_101_111_100_101_1(uniques, 9);
+  f_101_111_100_110_0(uniques, 9);
+  f_101_111_100_110_1(uniques, 9);
+  f_101_111_100_111_0(uniques, 9);
+  f_101_111_100_111_1(uniques, 9);
+  f_101_111_101_100_0(uniques, 9);
+  f_101_111_101_100_1(uniques, 9);
+  f_101_111_101_101_0(uniques, 9);
+  f_101_111_101_101_1(uniques, 9);
+  f_101_111_101_110_0(uniques, 9);
+  f_101_111_101_110_1(uniques, 9);
+  f_101_111_101_111_0(uniques, 9);
+  f_101_111_101_111_1(uniques, 9);
+  f_101_111_110_100_0(uniques, 9);
+  f_101_111_110_100_1(uniques, 9);
+  f_101_111_110_101_0(uniques, 9);
+  f_101_111_110_101_1(uniques, 9);
+  f_101_111_110_110_0(uniques, 9);
+  f_101_111_110_110_1(uniques, 9);
+  f_101_111_110_111_0(uniques, 9);
+  f_101_111_110_111_1(uniques, 9);
+  f_101_111_111_100_0(uniques, 9);
+  f_101_111_111_100_1(uniques, 9);
+  f_101_111_111_101_0(uniques, 9);
+  f_101_111_111_101_1(uniques, 9);
+  f_101_111_111_110_0(uniques, 9);
+  f_101_111_111_110_1(uniques, 9);
+  f_101_111_111_111_0(uniques, 9);
+  f_101_111_111_111_1(uniques, 9);
+  f_110_000_000_100_0(uniques, 9);
+  f_110_000_000_100_1(uniques, 9);
+  f_110_000_000_101_0(uniques, 9);
+  f_110_000_000_101_1(uniques, 9);
+  f_110_000_000_110_0(uniques, 9);
+  f_110_000_000_110_1(uniques, 9);
+  f_110_000_000_111_0(uniques, 9);
+  f_110_000_000_111_1(uniques, 9);
+  f_110_000_001_100_0(uniques, 9);
+  f_110_000_001_100_1(uniques, 9);
+  f_110_000_001_101_0(uniques, 9);
+  f_110_000_001_101_1(uniques, 9);
+  f_110_000_001_110_0(uniques, 9);
+  f_110_000_001_110_1(uniques, 9);
+  f_110_000_001_111_0(uniques, 9);
+  f_110_000_001_111_1(uniques, 9);
+  f_110_000_010_100_0(uniques, 9);
+  f_110_000_010_100_1(uniques, 9);
+  f_110_000_010_101_0(uniques, 9);
+  f_110_000_010_101_1(uniques, 9);
+  f_110_000_010_110_0(uniques, 9);
+  f_110_000_010_110_1(uniques, 9);
+  f_110_000_010_111_0(uniques, 9);
+  f_110_000_010_111_1(uniques, 9);
+  f_110_000_011_100_0(uniques, 9);
+  f_110_000_011_100_1(uniques, 9);
+  f_110_000_011_101_0(uniques, 9);
+  f_110_000_011_101_1(uniques, 9);
+  f_110_000_011_110_0(uniques, 9);
+  f_110_000_011_110_1(uniques, 9);
+  f_110_000_011_111_0(uniques, 9);
+  f_110_000_011_111_1(uniques, 9);
+  f_110_000_100_100_0(uniques, 9);
+  f_110_000_100_100_1(uniques, 9);
+  f_110_000_100_101_0(uniques, 9);
+  f_110_000_100_101_1(uniques, 9);
+  f_110_000_100_110_0(uniques, 9);
+  f_110_000_100_110_1(uniques, 9);
+  f_110_000_100_111_0(uniques, 9);
+  f_110_000_100_111_1(uniques, 9);
+  f_110_000_101_100_0(uniques, 9);
+  f_110_000_101_100_1(uniques, 9);
+  f_110_000_101_101_0(uniques, 9);
+  f_110_000_101_101_1(uniques, 9);
+  f_110_000_101_110_0(uniques, 9);
+  f_110_000_101_110_1(uniques, 9);
+  f_110_000_101_111_0(uniques, 9);
+  f_110_000_101_111_1(uniques, 9);
+  f_110_000_110_100_0(uniques, 9);
+  f_110_000_110_100_1(uniques, 9);
+  f_110_000_110_101_0(uniques, 9);
+  f_110_000_110_101_1(uniques, 9);
+  f_110_000_110_110_0(uniques, 9);
+  f_110_000_110_110_1(uniques, 9);
+  f_110_000_110_111_0(uniques, 9);
+  f_110_000_110_111_1(uniques, 9);
+  f_110_000_111_100_0(uniques, 9);
+  f_110_000_111_100_1(uniques, 9);
+  f_110_000_111_101_0(uniques, 9);
+  f_110_000_111_101_1(uniques, 9);
+  f_110_000_111_110_0(uniques, 9);
+  f_110_000_111_110_1(uniques, 9);
+  f_110_000_111_111_0(uniques, 9);
+  f_110_000_111_111_1(uniques, 9);
+  f_110_001_000_100_0(uniques, 9);
+  f_110_001_000_100_1(uniques, 9);
+  f_110_001_000_101_0(uniques, 9);
+  f_110_001_000_101_1(uniques, 9);
+  f_110_001_000_110_0(uniques, 9);
+  f_110_001_000_110_1(uniques, 9);
+  f_110_001_000_111_0(uniques, 9);
+  f_110_001_000_111_1(uniques, 9);
+  f_110_001_001_100_0(uniques, 9);
+  f_110_001_001_100_1(uniques, 9);
+  f_110_001_001_101_0(uniques, 9);
+  f_110_001_001_101_1(uniques, 9);
+  f_110_001_001_110_0(uniques, 9);
+  f_110_001_001_110_1(uniques, 9);
+  f_110_001_001_111_0(uniques, 9);
+  f_110_001_001_111_1(uniques, 9);
+  f_110_001_010_100_0(uniques, 9);
+  f_110_001_010_100_1(uniques, 9);
+  f_110_001_010_101_0(uniques, 9);
+  f_110_001_010_101_1(uniques, 9);
+  f_110_001_010_110_0(uniques, 9);
+  f_110_001_010_110_1(uniques, 9);
+  f_110_001_010_111_0(uniques, 9);
+  f_110_001_010_111_1(uniques, 9);
+  f_110_001_011_100_0(uniques, 9);
+  f_110_001_011_100_1(uniques, 9);
+  f_110_001_011_101_0(uniques, 9);
+  f_110_001_011_101_1(uniques, 9);
+  f_110_001_011_110_0(uniques, 9);
+  f_110_001_011_110_1(uniques, 9);
+  f_110_001_011_111_0(uniques, 9);
+  f_110_001_011_111_1(uniques, 9);
+  f_110_001_100_100_0(uniques, 9);
+  f_110_001_100_100_1(uniques, 9);
+  f_110_001_100_101_0(uniques, 9);
+  f_110_001_100_101_1(uniques, 9);
+  f_110_001_100_110_0(uniques, 9);
+  f_110_001_100_110_1(uniques, 9);
+  f_110_001_100_111_0(uniques, 9);
+  f_110_001_100_111_1(uniques, 9);
+  f_110_001_101_100_0(uniques, 9);
+  f_110_001_101_100_1(uniques, 9);
+  f_110_001_101_101_0(uniques, 9);
+  f_110_001_101_101_1(uniques, 9);
+  f_110_001_101_110_0(uniques, 9);
+  f_110_001_101_110_1(uniques, 9);
+  f_110_001_101_111_0(uniques, 9);
+  f_110_001_101_111_1(uniques, 9);
+  f_110_001_110_100_0(uniques, 9);
+  f_110_001_110_100_1(uniques, 9);
+  f_110_001_110_101_0(uniques, 9);
+  f_110_001_110_101_1(uniques, 9);
+  f_110_001_110_110_0(uniques, 9);
+  f_110_001_110_110_1(uniques, 9);
+  f_110_001_110_111_0(uniques, 9);
+  f_110_001_110_111_1(uniques, 9);
+  f_110_001_111_100_0(uniques, 9);
+  f_110_001_111_100_1(uniques, 9);
+  f_110_001_111_101_0(uniques, 9);
+  f_110_001_111_101_1(uniques, 9);
+  f_110_001_111_110_0(uniques, 9);
+  f_110_001_111_110_1(uniques, 9);
+  f_110_001_111_111_0(uniques, 9);
+  f_110_001_111_111_1(uniques, 9);
+  f_110_010_000_100_0(uniques, 9);
+  f_110_010_000_100_1(uniques, 9);
+  f_110_010_000_101_0(uniques, 9);
+  f_110_010_000_101_1(uniques, 9);
+  f_110_010_000_110_0(uniques, 9);
+  f_110_010_000_110_1(uniques, 9);
+  f_110_010_000_111_0(uniques, 9);
+  f_110_010_000_111_1(uniques, 9);
+  f_110_010_001_100_0(uniques, 9);
+  f_110_010_001_100_1(uniques, 9);
+  f_110_010_001_101_0(uniques, 9);
+  f_110_010_001_101_1(uniques, 9);
+  f_110_010_001_110_0(uniques, 9);
+  f_110_010_001_110_1(uniques, 9);
+  f_110_010_001_111_0(uniques, 9);
+  f_110_010_001_111_1(uniques, 9);
+  f_110_010_010_100_0(uniques, 9);
+  f_110_010_010_100_1(uniques, 9);
+  f_110_010_010_101_0(uniques, 9);
+  f_110_010_010_101_1(uniques, 9);
+  f_110_010_010_110_0(uniques, 9);
+  f_110_010_010_110_1(uniques, 9);
+  f_110_010_010_111_0(uniques, 9);
+  f_110_010_010_111_1(uniques, 9);
+  f_110_010_011_100_0(uniques, 9);
+  f_110_010_011_100_1(uniques, 9);
+  f_110_010_011_101_0(uniques, 9);
+  f_110_010_011_101_1(uniques, 9);
+  f_110_010_011_110_0(uniques, 9);
+  f_110_010_011_110_1(uniques, 9);
+  f_110_010_011_111_0(uniques, 9);
+  f_110_010_011_111_1(uniques, 9);
+  f_110_010_100_100_0(uniques, 9);
+  f_110_010_100_100_1(uniques, 9);
+  f_110_010_100_101_0(uniques, 9);
+  f_110_010_100_101_1(uniques, 9);
+  f_110_010_100_110_0(uniques, 9);
+  f_110_010_100_110_1(uniques, 9);
+  f_110_010_100_111_0(uniques, 9);
+  f_110_010_100_111_1(uniques, 9);
+  f_110_010_101_100_0(uniques, 9);
+  f_110_010_101_100_1(uniques, 9);
+  f_110_010_101_101_0(uniques, 9);
+  f_110_010_101_101_1(uniques, 9);
+  f_110_010_101_110_0(uniques, 9);
+  f_110_010_101_110_1(uniques, 9);
+  f_110_010_101_111_0(uniques, 9);
+  f_110_010_101_111_1(uniques, 9);
+  f_110_010_110_100_0(uniques, 9);
+  f_110_010_110_100_1(uniques, 9);
+  f_110_010_110_101_0(uniques, 9);
+  f_110_010_110_101_1(uniques, 9);
+  f_110_010_110_110_0(uniques, 9);
+  f_110_010_110_110_1(uniques, 9);
+  f_110_010_110_111_0(uniques, 9);
+  f_110_010_110_111_1(uniques, 9);
+  f_110_010_111_100_0(uniques, 9);
+  f_110_010_111_100_1(uniques, 9);
+  f_110_010_111_101_0(uniques, 9);
+  f_110_010_111_101_1(uniques, 9);
+  f_110_010_111_110_0(uniques, 9);
+  f_110_010_111_110_1(uniques, 9);
+  f_110_010_111_111_0(uniques, 9);
+  f_110_010_111_111_1(uniques, 9);
+  f_110_011_000_100_0(uniques, 9);
+  f_110_011_000_100_1(uniques, 9);
+  f_110_011_000_101_0(uniques, 9);
+  f_110_011_000_101_1(uniques, 9);
+  f_110_011_000_110_0(uniques, 9);
+  f_110_011_000_110_1(uniques, 9);
+  f_110_011_000_111_0(uniques, 9);
+  f_110_011_000_111_1(uniques, 9);
+  f_110_011_001_100_0(uniques, 9);
+  f_110_011_001_100_1(uniques, 9);
+  f_110_011_001_101_0(uniques, 9);
+  f_110_011_001_101_1(uniques, 9);
+  f_110_011_001_110_0(uniques, 9);
+  f_110_011_001_110_1(uniques, 9);
+  f_110_011_001_111_0(uniques, 9);
+  f_110_011_001_111_1(uniques, 9);
+  f_110_011_010_100_0(uniques, 9);
+  f_110_011_010_100_1(uniques, 9);
+  f_110_011_010_101_0(uniques, 9);
+  f_110_011_010_101_1(uniques, 9);
+  f_110_011_010_110_0(uniques, 9);
+  f_110_011_010_110_1(uniques, 9);
+  f_110_011_010_111_0(uniques, 9);
+  f_110_011_010_111_1(uniques, 9);
+  f_110_011_011_100_0(uniques, 9);
+  f_110_011_011_100_1(uniques, 9);
+  f_110_011_011_101_0(uniques, 9);
+  f_110_011_011_101_1(uniques, 9);
+  f_110_011_011_110_0(uniques, 9);
+  f_110_011_011_110_1(uniques, 9);
+  f_110_011_011_111_0(uniques, 9);
+  f_110_011_011_111_1(uniques, 9);
+  f_110_011_100_100_0(uniques, 9);
+  f_110_011_100_100_1(uniques, 9);
+  f_110_011_100_101_0(uniques, 9);
+  f_110_011_100_101_1(uniques, 9);
+  f_110_011_100_110_0(uniques, 9);
+  f_110_011_100_110_1(uniques, 9);
+  f_110_011_100_111_0(uniques, 9);
+  f_110_011_100_111_1(uniques, 9);
+  f_110_011_101_100_0(uniques, 9);
+  f_110_011_101_100_1(uniques, 9);
+  f_110_011_101_101_0(uniques, 9);
+  f_110_011_101_101_1(uniques, 9);
+  f_110_011_101_110_0(uniques, 9);
+  f_110_011_101_110_1(uniques, 9);
+  f_110_011_101_111_0(uniques, 9);
+  f_110_011_101_111_1(uniques, 9);
+  f_110_011_110_100_0(uniques, 9);
+  f_110_011_110_100_1(uniques, 9);
+  f_110_011_110_101_0(uniques, 9);
+  f_110_011_110_101_1(uniques, 9);
+  f_110_011_110_110_0(uniques, 9);
+  f_110_011_110_110_1(uniques, 9);
+  f_110_011_110_111_0(uniques, 9);
+  f_110_011_110_111_1(uniques, 9);
+  f_110_011_111_100_0(uniques, 9);
+  f_110_011_111_100_1(uniques, 9);
+  f_110_011_111_101_0(uniques, 9);
+  f_110_011_111_101_1(uniques, 9);
+  f_110_011_111_110_0(uniques, 9);
+  f_110_011_111_110_1(uniques, 9);
+  f_110_011_111_111_0(uniques, 9);
+  f_110_011_111_111_1(uniques, 9);
+  f_110_100_000_100_0(uniques, 9);
+  f_110_100_000_100_1(uniques, 9);
+  f_110_100_000_101_0(uniques, 9);
+  f_110_100_000_101_1(uniques, 9);
+  f_110_100_000_110_0(uniques, 9);
+  f_110_100_000_110_1(uniques, 9);
+  f_110_100_000_111_0(uniques, 9);
+  f_110_100_000_111_1(uniques, 9);
+  f_110_100_001_100_0(uniques, 9);
+  f_110_100_001_100_1(uniques, 9);
+  f_110_100_001_101_0(uniques, 9);
+  f_110_100_001_101_1(uniques, 9);
+  f_110_100_001_110_0(uniques, 9);
+  f_110_100_001_110_1(uniques, 9);
+  f_110_100_001_111_0(uniques, 9);
+  f_110_100_001_111_1(uniques, 9);
+  f_110_100_010_100_0(uniques, 9);
+  f_110_100_010_100_1(uniques, 9);
+  f_110_100_010_101_0(uniques, 9);
+  f_110_100_010_101_1(uniques, 9);
+  f_110_100_010_110_0(uniques, 9);
+  f_110_100_010_110_1(uniques, 9);
+  f_110_100_010_111_0(uniques, 9);
+  f_110_100_010_111_1(uniques, 9);
+  f_110_100_011_100_0(uniques, 9);
+  f_110_100_011_100_1(uniques, 9);
+  f_110_100_011_101_0(uniques, 9);
+  f_110_100_011_101_1(uniques, 9);
+  f_110_100_011_110_0(uniques, 9);
+  f_110_100_011_110_1(uniques, 9);
+  f_110_100_011_111_0(uniques, 9);
+  f_110_100_011_111_1(uniques, 9);
+  f_110_100_100_100_0(uniques, 9);
+  f_110_100_100_100_1(uniques, 9);
+  f_110_100_100_101_0(uniques, 9);
+  f_110_100_100_101_1(uniques, 9);
+  f_110_100_100_110_0(uniques, 9);
+  f_110_100_100_110_1(uniques, 9);
+  f_110_100_100_111_0(uniques, 9);
+  f_110_100_100_111_1(uniques, 9);
+  f_110_100_101_100_0(uniques, 9);
+  f_110_100_101_100_1(uniques, 9);
+  f_110_100_101_101_0(uniques, 9);
+  f_110_100_101_101_1(uniques, 9);
+  f_110_100_101_110_0(uniques, 9);
+  f_110_100_101_110_1(uniques, 9);
+  f_110_100_101_111_0(uniques, 9);
+  f_110_100_101_111_1(uniques, 9);
+  f_110_100_110_100_0(uniques, 9);
+  f_110_100_110_100_1(uniques, 9);
+  f_110_100_110_101_0(uniques, 9);
+  f_110_100_110_101_1(uniques, 9);
+  f_110_100_110_110_0(uniques, 9);
+  f_110_100_110_110_1(uniques, 9);
+  f_110_100_110_111_0(uniques, 9);
+  f_110_100_110_111_1(uniques, 9);
+  f_110_100_111_100_0(uniques, 9);
+  f_110_100_111_100_1(uniques, 9);
+  f_110_100_111_101_0(uniques, 9);
+  f_110_100_111_101_1(uniques, 9);
+  f_110_100_111_110_0(uniques, 9);
+  f_110_100_111_110_1(uniques, 9);
+  f_110_100_111_111_0(uniques, 9);
+  f_110_100_111_111_1(uniques, 9);
+  f_110_101_000_100_0(uniques, 9);
+  f_110_101_000_100_1(uniques, 9);
+  f_110_101_000_101_0(uniques, 9);
+  f_110_101_000_101_1(uniques, 9);
+  f_110_101_000_110_0(uniques, 9);
+  f_110_101_000_110_1(uniques, 9);
+  f_110_101_000_111_0(uniques, 9);
+  f_110_101_000_111_1(uniques, 9);
+  f_110_101_001_100_0(uniques, 9);
+  f_110_101_001_100_1(uniques, 9);
+  f_110_101_001_101_0(uniques, 9);
+  f_110_101_001_101_1(uniques, 9);
+  f_110_101_001_110_0(uniques, 9);
+  f_110_101_001_110_1(uniques, 9);
+  f_110_101_001_111_0(uniques, 9);
+  f_110_101_001_111_1(uniques, 9);
+  f_110_101_010_100_0(uniques, 9);
+  f_110_101_010_100_1(uniques, 9);
+  f_110_101_010_101_0(uniques, 9);
+  f_110_101_010_101_1(uniques, 9);
+  f_110_101_010_110_0(uniques, 9);
+  f_110_101_010_110_1(uniques, 9);
+  f_110_101_010_111_0(uniques, 9);
+  f_110_101_010_111_1(uniques, 9);
+  f_110_101_011_100_0(uniques, 9);
+  f_110_101_011_100_1(uniques, 9);
+  f_110_101_011_101_0(uniques, 9);
+  f_110_101_011_101_1(uniques, 9);
+  f_110_101_011_110_0(uniques, 9);
+  f_110_101_011_110_1(uniques, 9);
+  f_110_101_011_111_0(uniques, 9);
+  f_110_101_011_111_1(uniques, 9);
+  f_110_101_100_100_0(uniques, 9);
+  f_110_101_100_100_1(uniques, 9);
+  f_110_101_100_101_0(uniques, 9);
+  f_110_101_100_101_1(uniques, 9);
+  f_110_101_100_110_0(uniques, 9);
+  f_110_101_100_110_1(uniques, 9);
+  f_110_101_100_111_0(uniques, 9);
+  f_110_101_100_111_1(uniques, 9);
+  f_110_101_101_100_0(uniques, 9);
+  f_110_101_101_100_1(uniques, 9);
+  f_110_101_101_101_0(uniques, 9);
+  f_110_101_101_101_1(uniques, 9);
+  f_110_101_101_110_0(uniques, 9);
+  f_110_101_101_110_1(uniques, 9);
+  f_110_101_101_111_0(uniques, 9);
+  f_110_101_101_111_1(uniques, 9);
+  f_110_101_110_100_0(uniques, 9);
+  f_110_101_110_100_1(uniques, 9);
+  f_110_101_110_101_0(uniques, 9);
+  f_110_101_110_101_1(uniques, 9);
+  f_110_101_110_110_0(uniques, 9);
+  f_110_101_110_110_1(uniques, 9);
+  f_110_101_110_111_0(uniques, 9);
+  f_110_101_110_111_1(uniques, 9);
+  f_110_101_111_100_0(uniques, 9);
+  f_110_101_111_100_1(uniques, 9);
+  f_110_101_111_101_0(uniques, 9);
+  f_110_101_111_101_1(uniques, 9);
+  f_110_101_111_110_0(uniques, 9);
+  f_110_101_111_110_1(uniques, 9);
+  f_110_101_111_111_0(uniques, 9);
+  f_110_101_111_111_1(uniques, 9);
+  f_110_110_000_100_0(uniques, 9);
+  f_110_110_000_100_1(uniques, 9);
+  f_110_110_000_101_0(uniques, 9);
+  f_110_110_000_101_1(uniques, 9);
+  f_110_110_000_110_0(uniques, 9);
+  f_110_110_000_110_1(uniques, 9);
+  f_110_110_000_111_0(uniques, 9);
+  f_110_110_000_111_1(uniques, 9);
+  f_110_110_001_100_0(uniques, 9);
+  f_110_110_001_100_1(uniques, 9);
+  f_110_110_001_101_0(uniques, 9);
+  f_110_110_001_101_1(uniques, 9);
+  f_110_110_001_110_0(uniques, 9);
+  f_110_110_001_110_1(uniques, 9);
+  f_110_110_001_111_0(uniques, 9);
+  f_110_110_001_111_1(uniques, 9);
+  f_110_110_010_100_0(uniques, 9);
+  f_110_110_010_100_1(uniques, 9);
+  f_110_110_010_101_0(uniques, 9);
+  f_110_110_010_101_1(uniques, 9);
+  f_110_110_010_110_0(uniques, 9);
+  f_110_110_010_110_1(uniques, 9);
+  f_110_110_010_111_0(uniques, 9);
+  f_110_110_010_111_1(uniques, 9);
+  f_110_110_011_100_0(uniques, 9);
+  f_110_110_011_100_1(uniques, 9);
+  f_110_110_011_101_0(uniques, 9);
+  f_110_110_011_101_1(uniques, 9);
+  f_110_110_011_110_0(uniques, 9);
+  f_110_110_011_110_1(uniques, 9);
+  f_110_110_011_111_0(uniques, 9);
+  f_110_110_011_111_1(uniques, 9);
+  f_110_110_100_100_0(uniques, 9);
+  f_110_110_100_100_1(uniques, 9);
+  f_110_110_100_101_0(uniques, 9);
+  f_110_110_100_101_1(uniques, 9);
+  f_110_110_100_110_0(uniques, 9);
+  f_110_110_100_110_1(uniques, 9);
+  f_110_110_100_111_0(uniques, 9);
+  f_110_110_100_111_1(uniques, 9);
+  f_110_110_101_100_0(uniques, 9);
+  f_110_110_101_100_1(uniques, 9);
+  f_110_110_101_101_0(uniques, 9);
+  f_110_110_101_101_1(uniques, 9);
+  f_110_110_101_110_0(uniques, 9);
+  f_110_110_101_110_1(uniques, 9);
+  f_110_110_101_111_0(uniques, 9);
+  f_110_110_101_111_1(uniques, 9);
+  f_110_110_110_100_0(uniques, 9);
+  f_110_110_110_100_1(uniques, 9);
+  f_110_110_110_101_0(uniques, 9);
+  f_110_110_110_101_1(uniques, 9);
+  f_110_110_110_110_0(uniques, 9);
+  f_110_110_110_110_1(uniques, 9);
+  f_110_110_110_111_0(uniques, 9);
+  f_110_110_110_111_1(uniques, 9);
+  f_110_110_111_100_0(uniques, 9);
+  f_110_110_111_100_1(uniques, 9);
+  f_110_110_111_101_0(uniques, 9);
+  f_110_110_111_101_1(uniques, 9);
+  f_110_110_111_110_0(uniques, 9);
+  f_110_110_111_110_1(uniques, 9);
+  f_110_110_111_111_0(uniques, 9);
+  f_110_110_111_111_1(uniques, 9);
+  f_110_111_000_100_0(uniques, 9);
+  f_110_111_000_100_1(uniques, 9);
+  f_110_111_000_101_0(uniques, 9);
+  f_110_111_000_101_1(uniques, 9);
+  f_110_111_000_110_0(uniques, 9);
+  f_110_111_000_110_1(uniques, 9);
+  f_110_111_000_111_0(uniques, 9);
+  f_110_111_000_111_1(uniques, 9);
+  f_110_111_001_100_0(uniques, 9);
+  f_110_111_001_100_1(uniques, 9);
+  f_110_111_001_101_0(uniques, 9);
+  f_110_111_001_101_1(uniques, 9);
+  f_110_111_001_110_0(uniques, 9);
+  f_110_111_001_110_1(uniques, 9);
+  f_110_111_001_111_0(uniques, 9);
+  f_110_111_001_111_1(uniques, 9);
+  f_110_111_010_100_0(uniques, 9);
+  f_110_111_010_100_1(uniques, 9);
+  f_110_111_010_101_0(uniques, 9);
+  f_110_111_010_101_1(uniques, 9);
+  f_110_111_010_110_0(uniques, 9);
+  f_110_111_010_110_1(uniques, 9);
+  f_110_111_010_111_0(uniques, 9);
+  f_110_111_010_111_1(uniques, 9);
+  f_110_111_011_100_0(uniques, 9);
+  f_110_111_011_100_1(uniques, 9);
+  f_110_111_011_101_0(uniques, 9);
+  f_110_111_011_101_1(uniques, 9);
+  f_110_111_011_110_0(uniques, 9);
+  f_110_111_011_110_1(uniques, 9);
+  f_110_111_011_111_0(uniques, 9);
+  f_110_111_011_111_1(uniques, 9);
+  f_110_111_100_100_0(uniques, 9);
+  f_110_111_100_100_1(uniques, 9);
+  f_110_111_100_101_0(uniques, 9);
+  f_110_111_100_101_1(uniques, 9);
+  f_110_111_100_110_0(uniques, 9);
+  f_110_111_100_110_1(uniques, 9);
+  f_110_111_100_111_0(uniques, 9);
+  f_110_111_100_111_1(uniques, 9);
+  f_110_111_101_100_0(uniques, 9);
+  f_110_111_101_100_1(uniques, 9);
+  f_110_111_101_101_0(uniques, 9);
+  f_110_111_101_101_1(uniques, 9);
+  f_110_111_101_110_0(uniques, 9);
+  f_110_111_101_110_1(uniques, 9);
+  f_110_111_101_111_0(uniques, 9);
+  f_110_111_101_111_1(uniques, 9);
+  f_110_111_110_100_0(uniques, 9);
+  f_110_111_110_100_1(uniques, 9);
+  f_110_111_110_101_0(uniques, 9);
+  f_110_111_110_101_1(uniques, 9);
+  f_110_111_110_110_0(uniques, 9);
+  f_110_111_110_110_1(uniques, 9);
+  f_110_111_110_111_0(uniques, 9);
+  f_110_111_110_111_1(uniques, 9);
+  f_110_111_111_100_0(uniques, 9);
+  f_110_111_111_100_1(uniques, 9);
+  f_110_111_111_101_0(uniques, 9);
+  f_110_111_111_101_1(uniques, 9);
+  f_110_111_111_110_0(uniques, 9);
+  f_110_111_111_110_1(uniques, 9);
+  f_110_111_111_111_0(uniques, 9);
+  f_110_111_111_111_1(uniques, 9);
+  f_111_000_000_100_0(uniques, 9);
+  f_111_000_000_100_1(uniques, 9);
+  f_111_000_000_101_0(uniques, 9);
+  f_111_000_000_101_1(uniques, 9);
+  f_111_000_000_110_0(uniques, 9);
+  f_111_000_000_110_1(uniques, 9);
+  f_111_000_000_111_0(uniques, 9);
+  f_111_000_000_111_1(uniques, 9);
+  f_111_000_001_100_0(uniques, 9);
+  f_111_000_001_100_1(uniques, 9);
+  f_111_000_001_101_0(uniques, 9);
+  f_111_000_001_101_1(uniques, 9);
+  f_111_000_001_110_0(uniques, 9);
+  f_111_000_001_110_1(uniques, 9);
+  f_111_000_001_111_0(uniques, 9);
+  f_111_000_001_111_1(uniques, 9);
+  f_111_000_010_100_0(uniques, 9);
+  f_111_000_010_100_1(uniques, 9);
+  f_111_000_010_101_0(uniques, 9);
+  f_111_000_010_101_1(uniques, 9);
+  f_111_000_010_110_0(uniques, 9);
+  f_111_000_010_110_1(uniques, 9);
+  f_111_000_010_111_0(uniques, 9);
+  f_111_000_010_111_1(uniques, 9);
+  f_111_000_011_100_0(uniques, 9);
+  f_111_000_011_100_1(uniques, 9);
+  f_111_000_011_101_0(uniques, 9);
+  f_111_000_011_101_1(uniques, 9);
+  f_111_000_011_110_0(uniques, 9);
+  f_111_000_011_110_1(uniques, 9);
+  f_111_000_011_111_0(uniques, 9);
+  f_111_000_011_111_1(uniques, 9);
+  f_111_000_100_100_0(uniques, 9);
+  f_111_000_100_100_1(uniques, 9);
+  f_111_000_100_101_0(uniques, 9);
+  f_111_000_100_101_1(uniques, 9);
+  f_111_000_100_110_0(uniques, 9);
+  f_111_000_100_110_1(uniques, 9);
+  f_111_000_100_111_0(uniques, 9);
+  f_111_000_100_111_1(uniques, 9);
+  f_111_000_101_100_0(uniques, 9);
+  f_111_000_101_100_1(uniques, 9);
+  f_111_000_101_101_0(uniques, 9);
+  f_111_000_101_101_1(uniques, 9);
+  f_111_000_101_110_0(uniques, 9);
+  f_111_000_101_110_1(uniques, 9);
+  f_111_000_101_111_0(uniques, 9);
+  f_111_000_101_111_1(uniques, 9);
+  f_111_000_110_100_0(uniques, 9);
+  f_111_000_110_100_1(uniques, 9);
+  f_111_000_110_101_0(uniques, 9);
+  f_111_000_110_101_1(uniques, 9);
+  f_111_000_110_110_0(uniques, 9);
+  f_111_000_110_110_1(uniques, 9);
+  f_111_000_110_111_0(uniques, 9);
+  f_111_000_110_111_1(uniques, 9);
+  f_111_000_111_100_0(uniques, 9);
+  f_111_000_111_100_1(uniques, 9);
+  f_111_000_111_101_0(uniques, 9);
+  f_111_000_111_101_1(uniques, 9);
+  f_111_000_111_110_0(uniques, 9);
+  f_111_000_111_110_1(uniques, 9);
+  f_111_000_111_111_0(uniques, 9);
+  f_111_000_111_111_1(uniques, 9);
+  f_111_001_000_100_0(uniques, 9);
+  f_111_001_000_100_1(uniques, 9);
+  f_111_001_000_101_0(uniques, 9);
+  f_111_001_000_101_1(uniques, 9);
+  f_111_001_000_110_0(uniques, 9);
+  f_111_001_000_110_1(uniques, 9);
+  f_111_001_000_111_0(uniques, 9);
+  f_111_001_000_111_1(uniques, 9);
+  f_111_001_001_100_0(uniques, 9);
+  f_111_001_001_100_1(uniques, 9);
+  f_111_001_001_101_0(uniques, 9);
+  f_111_001_001_101_1(uniques, 9);
+  f_111_001_001_110_0(uniques, 9);
+  f_111_001_001_110_1(uniques, 9);
+  f_111_001_001_111_0(uniques, 9);
+  f_111_001_001_111_1(uniques, 9);
+  f_111_001_010_100_0(uniques, 9);
+  f_111_001_010_100_1(uniques, 9);
+  f_111_001_010_101_0(uniques, 9);
+  f_111_001_010_101_1(uniques, 9);
+  f_111_001_010_110_0(uniques, 9);
+  f_111_001_010_110_1(uniques, 9);
+  f_111_001_010_111_0(uniques, 9);
+  f_111_001_010_111_1(uniques, 9);
+  f_111_001_011_100_0(uniques, 9);
+  f_111_001_011_100_1(uniques, 9);
+  f_111_001_011_101_0(uniques, 9);
+  f_111_001_011_101_1(uniques, 9);
+  f_111_001_011_110_0(uniques, 9);
+  f_111_001_011_110_1(uniques, 9);
+  f_111_001_011_111_0(uniques, 9);
+  f_111_001_011_111_1(uniques, 9);
+  f_111_001_100_100_0(uniques, 9);
+  f_111_001_100_100_1(uniques, 9);
+  f_111_001_100_101_0(uniques, 9);
+  f_111_001_100_101_1(uniques, 9);
+  f_111_001_100_110_0(uniques, 9);
+  f_111_001_100_110_1(uniques, 9);
+  f_111_001_100_111_0(uniques, 9);
+  f_111_001_100_111_1(uniques, 9);
+  f_111_001_101_100_0(uniques, 9);
+  f_111_001_101_100_1(uniques, 9);
+  f_111_001_101_101_0(uniques, 9);
+  f_111_001_101_101_1(uniques, 9);
+  f_111_001_101_110_0(uniques, 9);
+  f_111_001_101_110_1(uniques, 9);
+  f_111_001_101_111_0(uniques, 9);
+  f_111_001_101_111_1(uniques, 9);
+  f_111_001_110_100_0(uniques, 9);
+  f_111_001_110_100_1(uniques, 9);
+  f_111_001_110_101_0(uniques, 9);
+  f_111_001_110_101_1(uniques, 9);
+  f_111_001_110_110_0(uniques, 9);
+  f_111_001_110_110_1(uniques, 9);
+  f_111_001_110_111_0(uniques, 9);
+  f_111_001_110_111_1(uniques, 9);
+  f_111_001_111_100_0(uniques, 9);
+  f_111_001_111_100_1(uniques, 9);
+  f_111_001_111_101_0(uniques, 9);
+  f_111_001_111_101_1(uniques, 9);
+  f_111_001_111_110_0(uniques, 9);
+  f_111_001_111_110_1(uniques, 9);
+  f_111_001_111_111_0(uniques, 9);
+  f_111_001_111_111_1(uniques, 9);
+  f_111_010_000_100_0(uniques, 9);
+  f_111_010_000_100_1(uniques, 9);
+  f_111_010_000_101_0(uniques, 9);
+  f_111_010_000_101_1(uniques, 9);
+  f_111_010_000_110_0(uniques, 9);
+  f_111_010_000_110_1(uniques, 9);
+  f_111_010_000_111_0(uniques, 9);
+  f_111_010_000_111_1(uniques, 9);
+  f_111_010_001_100_0(uniques, 9);
+  f_111_010_001_100_1(uniques, 9);
+  f_111_010_001_101_0(uniques, 9);
+  f_111_010_001_101_1(uniques, 9);
+  f_111_010_001_110_0(uniques, 9);
+  f_111_010_001_110_1(uniques, 9);
+  f_111_010_001_111_0(uniques, 9);
+  f_111_010_001_111_1(uniques, 9);
+  f_111_010_010_100_0(uniques, 9);
+  f_111_010_010_100_1(uniques, 9);
+  f_111_010_010_101_0(uniques, 9);
+  f_111_010_010_101_1(uniques, 9);
+  f_111_010_010_110_0(uniques, 9);
+  f_111_010_010_110_1(uniques, 9);
+  f_111_010_010_111_0(uniques, 9);
+  f_111_010_010_111_1(uniques, 9);
+  f_111_010_011_100_0(uniques, 9);
+  f_111_010_011_100_1(uniques, 9);
+  f_111_010_011_101_0(uniques, 9);
+  f_111_010_011_101_1(uniques, 9);
+  f_111_010_011_110_0(uniques, 9);
+  f_111_010_011_110_1(uniques, 9);
+  f_111_010_011_111_0(uniques, 9);
+  f_111_010_011_111_1(uniques, 9);
+  f_111_010_100_100_0(uniques, 9);
+  f_111_010_100_100_1(uniques, 9);
+  f_111_010_100_101_0(uniques, 9);
+  f_111_010_100_101_1(uniques, 9);
+  f_111_010_100_110_0(uniques, 9);
+  f_111_010_100_110_1(uniques, 9);
+  f_111_010_100_111_0(uniques, 9);
+  f_111_010_100_111_1(uniques, 9);
+  f_111_010_101_100_0(uniques, 9);
+  f_111_010_101_100_1(uniques, 9);
+  f_111_010_101_101_0(uniques, 9);
+  f_111_010_101_101_1(uniques, 9);
+  f_111_010_101_110_0(uniques, 9);
+  f_111_010_101_110_1(uniques, 9);
+  f_111_010_101_111_0(uniques, 9);
+  f_111_010_101_111_1(uniques, 9);
+  f_111_010_110_100_0(uniques, 9);
+  f_111_010_110_100_1(uniques, 9);
+  f_111_010_110_101_0(uniques, 9);
+  f_111_010_110_101_1(uniques, 9);
+  f_111_010_110_110_0(uniques, 9);
+  f_111_010_110_110_1(uniques, 9);
+  f_111_010_110_111_0(uniques, 9);
+  f_111_010_110_111_1(uniques, 9);
+  f_111_010_111_100_0(uniques, 9);
+  f_111_010_111_100_1(uniques, 9);
+  f_111_010_111_101_0(uniques, 9);
+  f_111_010_111_101_1(uniques, 9);
+  f_111_010_111_110_0(uniques, 9);
+  f_111_010_111_110_1(uniques, 9);
+  f_111_010_111_111_0(uniques, 9);
+  f_111_010_111_111_1(uniques, 9);
+  f_111_011_000_100_0(uniques, 9);
+  f_111_011_000_100_1(uniques, 9);
+  f_111_011_000_101_0(uniques, 9);
+  f_111_011_000_101_1(uniques, 9);
+  f_111_011_000_110_0(uniques, 9);
+  f_111_011_000_110_1(uniques, 9);
+  f_111_011_000_111_0(uniques, 9);
+  f_111_011_000_111_1(uniques, 9);
+  f_111_011_001_100_0(uniques, 9);
+  f_111_011_001_100_1(uniques, 9);
+  f_111_011_001_101_0(uniques, 9);
+  f_111_011_001_101_1(uniques, 9);
+  f_111_011_001_110_0(uniques, 9);
+  f_111_011_001_110_1(uniques, 9);
+  f_111_011_001_111_0(uniques, 9);
+  f_111_011_001_111_1(uniques, 9);
+  f_111_011_010_100_0(uniques, 9);
+  f_111_011_010_100_1(uniques, 9);
+  f_111_011_010_101_0(uniques, 9);
+  f_111_011_010_101_1(uniques, 9);
+  f_111_011_010_110_0(uniques, 9);
+  f_111_011_010_110_1(uniques, 9);
+  f_111_011_010_111_0(uniques, 9);
+  f_111_011_010_111_1(uniques, 9);
+  f_111_011_011_100_0(uniques, 9);
+  f_111_011_011_100_1(uniques, 9);
+  f_111_011_011_101_0(uniques, 9);
+  f_111_011_011_101_1(uniques, 9);
+  f_111_011_011_110_0(uniques, 9);
+  f_111_011_011_110_1(uniques, 9);
+  f_111_011_011_111_0(uniques, 9);
+  f_111_011_011_111_1(uniques, 9);
+  f_111_011_100_100_0(uniques, 9);
+  f_111_011_100_100_1(uniques, 9);
+  f_111_011_100_101_0(uniques, 9);
+  f_111_011_100_101_1(uniques, 9);
+  f_111_011_100_110_0(uniques, 9);
+  f_111_011_100_110_1(uniques, 9);
+  f_111_011_100_111_0(uniques, 9);
+  f_111_011_100_111_1(uniques, 9);
+  f_111_011_101_100_0(uniques, 9);
+  f_111_011_101_100_1(uniques, 9);
+  f_111_011_101_101_0(uniques, 9);
+  f_111_011_101_101_1(uniques, 9);
+  f_111_011_101_110_0(uniques, 9);
+  f_111_011_101_110_1(uniques, 9);
+  f_111_011_101_111_0(uniques, 9);
+  f_111_011_101_111_1(uniques, 9);
+  f_111_011_110_100_0(uniques, 9);
+  f_111_011_110_100_1(uniques, 9);
+  f_111_011_110_101_0(uniques, 9);
+  f_111_011_110_101_1(uniques, 9);
+  f_111_011_110_110_0(uniques, 9);
+  f_111_011_110_110_1(uniques, 9);
+  f_111_011_110_111_0(uniques, 9);
+  f_111_011_110_111_1(uniques, 9);
+  f_111_011_111_100_0(uniques, 9);
+  f_111_011_111_100_1(uniques, 9);
+  f_111_011_111_101_0(uniques, 9);
+  f_111_011_111_101_1(uniques, 9);
+  f_111_011_111_110_0(uniques, 9);
+  f_111_011_111_110_1(uniques, 9);
+  f_111_011_111_111_0(uniques, 9);
+  f_111_011_111_111_1(uniques, 9);
+  f_111_100_000_100_0(uniques, 9);
+  f_111_100_000_100_1(uniques, 9);
+  f_111_100_000_101_0(uniques, 9);
+  f_111_100_000_101_1(uniques, 9);
+  f_111_100_000_110_0(uniques, 9);
+  f_111_100_000_110_1(uniques, 9);
+  f_111_100_000_111_0(uniques, 9);
+  f_111_100_000_111_1(uniques, 9);
+  f_111_100_001_100_0(uniques, 9);
+  f_111_100_001_100_1(uniques, 9);
+  f_111_100_001_101_0(uniques, 9);
+  f_111_100_001_101_1(uniques, 9);
+  f_111_100_001_110_0(uniques, 9);
+  f_111_100_001_110_1(uniques, 9);
+  f_111_100_001_111_0(uniques, 9);
+  f_111_100_001_111_1(uniques, 9);
+  f_111_100_010_100_0(uniques, 9);
+  f_111_100_010_100_1(uniques, 9);
+  f_111_100_010_101_0(uniques, 9);
+  f_111_100_010_101_1(uniques, 9);
+  f_111_100_010_110_0(uniques, 9);
+  f_111_100_010_110_1(uniques, 9);
+  f_111_100_010_111_0(uniques, 9);
+  f_111_100_010_111_1(uniques, 9);
+  f_111_100_011_100_0(uniques, 9);
+  f_111_100_011_100_1(uniques, 9);
+  f_111_100_011_101_0(uniques, 9);
+  f_111_100_011_101_1(uniques, 9);
+  f_111_100_011_110_0(uniques, 9);
+  f_111_100_011_110_1(uniques, 9);
+  f_111_100_011_111_0(uniques, 9);
+  f_111_100_011_111_1(uniques, 9);
+  f_111_100_100_100_0(uniques, 9);
+  f_111_100_100_100_1(uniques, 9);
+  f_111_100_100_101_0(uniques, 9);
+  f_111_100_100_101_1(uniques, 9);
+  f_111_100_100_110_0(uniques, 9);
+  f_111_100_100_110_1(uniques, 9);
+  f_111_100_100_111_0(uniques, 9);
+  f_111_100_100_111_1(uniques, 9);
+  f_111_100_101_100_0(uniques, 9);
+  f_111_100_101_100_1(uniques, 9);
+  f_111_100_101_101_0(uniques, 9);
+  f_111_100_101_101_1(uniques, 9);
+  f_111_100_101_110_0(uniques, 9);
+  f_111_100_101_110_1(uniques, 9);
+  f_111_100_101_111_0(uniques, 9);
+  f_111_100_101_111_1(uniques, 9);
+  f_111_100_110_100_0(uniques, 9);
+  f_111_100_110_100_1(uniques, 9);
+  f_111_100_110_101_0(uniques, 9);
+  f_111_100_110_101_1(uniques, 9);
+  f_111_100_110_110_0(uniques, 9);
+  f_111_100_110_110_1(uniques, 9);
+  f_111_100_110_111_0(uniques, 9);
+  f_111_100_110_111_1(uniques, 9);
+  f_111_100_111_100_0(uniques, 9);
+  f_111_100_111_100_1(uniques, 9);
+  f_111_100_111_101_0(uniques, 9);
+  f_111_100_111_101_1(uniques, 9);
+  f_111_100_111_110_0(uniques, 9);
+  f_111_100_111_110_1(uniques, 9);
+  f_111_100_111_111_0(uniques, 9);
+  f_111_100_111_111_1(uniques, 9);
+  f_111_101_000_100_0(uniques, 9);
+  f_111_101_000_100_1(uniques, 9);
+  f_111_101_000_101_0(uniques, 9);
+  f_111_101_000_101_1(uniques, 9);
+  f_111_101_000_110_0(uniques, 9);
+  f_111_101_000_110_1(uniques, 9);
+  f_111_101_000_111_0(uniques, 9);
+  f_111_101_000_111_1(uniques, 9);
+  f_111_101_001_100_0(uniques, 9);
+  f_111_101_001_100_1(uniques, 9);
+  f_111_101_001_101_0(uniques, 9);
+  f_111_101_001_101_1(uniques, 9);
+  f_111_101_001_110_0(uniques, 9);
+  f_111_101_001_110_1(uniques, 9);
+  f_111_101_001_111_0(uniques, 9);
+  f_111_101_001_111_1(uniques, 9);
+  f_111_101_010_100_0(uniques, 9);
+  f_111_101_010_100_1(uniques, 9);
+  f_111_101_010_101_0(uniques, 9);
+  f_111_101_010_101_1(uniques, 9);
+  f_111_101_010_110_0(uniques, 9);
+  f_111_101_010_110_1(uniques, 9);
+  f_111_101_010_111_0(uniques, 9);
+  f_111_101_010_111_1(uniques, 9);
+  f_111_101_011_100_0(uniques, 9);
+  f_111_101_011_100_1(uniques, 9);
+  f_111_101_011_101_0(uniques, 9);
+  f_111_101_011_101_1(uniques, 9);
+  f_111_101_011_110_0(uniques, 9);
+  f_111_101_011_110_1(uniques, 9);
+  f_111_101_011_111_0(uniques, 9);
+  f_111_101_011_111_1(uniques, 9);
+  f_111_101_100_100_0(uniques, 9);
+  f_111_101_100_100_1(uniques, 9);
+  f_111_101_100_101_0(uniques, 9);
+  f_111_101_100_101_1(uniques, 9);
+  f_111_101_100_110_0(uniques, 9);
+  f_111_101_100_110_1(uniques, 9);
+  f_111_101_100_111_0(uniques, 9);
+  f_111_101_100_111_1(uniques, 9);
+  f_111_101_101_100_0(uniques, 9);
+  f_111_101_101_100_1(uniques, 9);
+  f_111_101_101_101_0(uniques, 9);
+  f_111_101_101_101_1(uniques, 9);
+  f_111_101_101_110_0(uniques, 9);
+  f_111_101_101_110_1(uniques, 9);
+  f_111_101_101_111_0(uniques, 9);
+  f_111_101_101_111_1(uniques, 9);
+  f_111_101_110_100_0(uniques, 9);
+  f_111_101_110_100_1(uniques, 9);
+  f_111_101_110_101_0(uniques, 9);
+  f_111_101_110_101_1(uniques, 9);
+  f_111_101_110_110_0(uniques, 9);
+  f_111_101_110_110_1(uniques, 9);
+  f_111_101_110_111_0(uniques, 9);
+  f_111_101_110_111_1(uniques, 9);
+  f_111_101_111_100_0(uniques, 9);
+  f_111_101_111_100_1(uniques, 9);
+  f_111_101_111_101_0(uniques, 9);
+  f_111_101_111_101_1(uniques, 9);
+  f_111_101_111_110_0(uniques, 9);
+  f_111_101_111_110_1(uniques, 9);
+  f_111_101_111_111_0(uniques, 9);
+  f_111_101_111_111_1(uniques, 9);
+  f_111_110_000_100_0(uniques, 9);
+  f_111_110_000_100_1(uniques, 9);
+  f_111_110_000_101_0(uniques, 9);
+  f_111_110_000_101_1(uniques, 9);
+  f_111_110_000_110_0(uniques, 9);
+  f_111_110_000_110_1(uniques, 9);
+  f_111_110_000_111_0(uniques, 9);
+  f_111_110_000_111_1(uniques, 9);
+  f_111_110_001_100_0(uniques, 9);
+  f_111_110_001_100_1(uniques, 9);
+  f_111_110_001_101_0(uniques, 9);
+  f_111_110_001_101_1(uniques, 9);
+  f_111_110_001_110_0(uniques, 9);
+  f_111_110_001_110_1(uniques, 9);
+  f_111_110_001_111_0(uniques, 9);
+  f_111_110_001_111_1(uniques, 9);
+  f_111_110_010_100_0(uniques, 9);
+  f_111_110_010_100_1(uniques, 9);
+  f_111_110_010_101_0(uniques, 9);
+  f_111_110_010_101_1(uniques, 9);
+  f_111_110_010_110_0(uniques, 9);
+  f_111_110_010_110_1(uniques, 9);
+  f_111_110_010_111_0(uniques, 9);
+  f_111_110_010_111_1(uniques, 9);
+  f_111_110_011_100_0(uniques, 9);
+  f_111_110_011_100_1(uniques, 9);
+  f_111_110_011_101_0(uniques, 9);
+  f_111_110_011_101_1(uniques, 9);
+  f_111_110_011_110_0(uniques, 9);
+  f_111_110_011_110_1(uniques, 9);
+  f_111_110_011_111_0(uniques, 9);
+  f_111_110_011_111_1(uniques, 9);
+  f_111_110_100_100_0(uniques, 9);
+  f_111_110_100_100_1(uniques, 9);
+  f_111_110_100_101_0(uniques, 9);
+  f_111_110_100_101_1(uniques, 9);
+  f_111_110_100_110_0(uniques, 9);
+  f_111_110_100_110_1(uniques, 9);
+  f_111_110_100_111_0(uniques, 9);
+  f_111_110_100_111_1(uniques, 9);
+  f_111_110_101_100_0(uniques, 9);
+  f_111_110_101_100_1(uniques, 9);
+  f_111_110_101_101_0(uniques, 9);
+  f_111_110_101_101_1(uniques, 9);
+  f_111_110_101_110_0(uniques, 9);
+  f_111_110_101_110_1(uniques, 9);
+  f_111_110_101_111_0(uniques, 9);
+  f_111_110_101_111_1(uniques, 9);
+  f_111_110_110_100_0(uniques, 9);
+  f_111_110_110_100_1(uniques, 9);
+  f_111_110_110_101_0(uniques, 9);
+  f_111_110_110_101_1(uniques, 9);
+  f_111_110_110_110_0(uniques, 9);
+  f_111_110_110_110_1(uniques, 9);
+  f_111_110_110_111_0(uniques, 9);
+  f_111_110_110_111_1(uniques, 9);
+  f_111_110_111_100_0(uniques, 9);
+  f_111_110_111_100_1(uniques, 9);
+  f_111_110_111_101_0(uniques, 9);
+  f_111_110_111_101_1(uniques, 9);
+  f_111_110_111_110_0(uniques, 9);
+  f_111_110_111_110_1(uniques, 9);
+  f_111_110_111_111_0(uniques, 9);
+  f_111_110_111_111_1(uniques, 9);
+  f_111_111_000_100_0(uniques, 9);
+  f_111_111_000_100_1(uniques, 9);
+  f_111_111_000_101_0(uniques, 9);
+  f_111_111_000_101_1(uniques, 9);
+  f_111_111_000_110_0(uniques, 9);
+  f_111_111_000_110_1(uniques, 9);
+  f_111_111_000_111_0(uniques, 9);
+  f_111_111_000_111_1(uniques, 9);
+  f_111_111_001_100_0(uniques, 9);
+  f_111_111_001_100_1(uniques, 9);
+  f_111_111_001_101_0(uniques, 9);
+  f_111_111_001_101_1(uniques, 9);
+  f_111_111_001_110_0(uniques, 9);
+  f_111_111_001_110_1(uniques, 9);
+  f_111_111_001_111_0(uniques, 9);
+  f_111_111_001_111_1(uniques, 9);
+  f_111_111_010_100_0(uniques, 9);
+  f_111_111_010_100_1(uniques, 9);
+  f_111_111_010_101_0(uniques, 9);
+  f_111_111_010_101_1(uniques, 9);
+  f_111_111_010_110_0(uniques, 9);
+  f_111_111_010_110_1(uniques, 9);
+  f_111_111_010_111_0(uniques, 9);
+  f_111_111_010_111_1(uniques, 9);
+  f_111_111_011_100_0(uniques, 9);
+  f_111_111_011_100_1(uniques, 9);
+  f_111_111_011_101_0(uniques, 9);
+  f_111_111_011_101_1(uniques, 9);
+  f_111_111_011_110_0(uniques, 9);
+  f_111_111_011_110_1(uniques, 9);
+  f_111_111_011_111_0(uniques, 9);
+  f_111_111_011_111_1(uniques, 9);
+  f_111_111_100_100_0(uniques, 9);
+  f_111_111_100_100_1(uniques, 9);
+  f_111_111_100_101_0(uniques, 9);
+  f_111_111_100_101_1(uniques, 9);
+  f_111_111_100_110_0(uniques, 9);
+  f_111_111_100_110_1(uniques, 9);
+  f_111_111_100_111_0(uniques, 9);
+  f_111_111_100_111_1(uniques, 9);
+  f_111_111_101_100_0(uniques, 9);
+  f_111_111_101_100_1(uniques, 9);
+  f_111_111_101_101_0(uniques, 9);
+  f_111_111_101_101_1(uniques, 9);
+  f_111_111_101_110_0(uniques, 9);
+  f_111_111_101_110_1(uniques, 9);
+  f_111_111_101_111_0(uniques, 9);
+  f_111_111_101_111_1(uniques, 9);
+  f_111_111_110_100_0(uniques, 9);
+  f_111_111_110_100_1(uniques, 9);
+  f_111_111_110_101_0(uniques, 9);
+  f_111_111_110_101_1(uniques, 9);
+  f_111_111_110_110_0(uniques, 9);
+  f_111_111_110_110_1(uniques, 9);
+  f_111_111_110_111_0(uniques, 9);
+  f_111_111_110_111_1(uniques, 9);
+  f_111_111_111_100_0(uniques, 9);
+  f_111_111_111_100_1(uniques, 9);
+  f_111_111_111_101_0(uniques, 9);
+  f_111_111_111_101_1(uniques, 9);
+  f_111_111_111_110_0(uniques, 9);
+  f_111_111_111_110_1(uniques, 9);
+  f_111_111_111_111_0(uniques, 9);
+  f_111_111_111_111_1(uniques, 9);
+  Expect.equals(4096, uniques.length);
+}
diff --git a/tests/dart2js/deferred/many_parts/lib_000_000_001_000_0.dart b/tests/dart2js/deferred/many_parts/lib_000_000_001_000_0.dart
new file mode 100644
index 0000000..58f471b
--- /dev/null
+++ b/tests/dart2js/deferred/many_parts/lib_000_000_001_000_0.dart
@@ -0,0 +1,4111 @@
+// Copyright (c) 2020, 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:expect/expect.dart";
+
+import 'libB.dart';
+
+@pragma('dart2js:noInline')
+g_000_000_001_000_0() {
+  Set<String> uniques = {};
+
+  // f_***_***_**1_***_*;
+  f_000_000_001_000_0(uniques, 8);
+  f_000_000_001_000_1(uniques, 8);
+  f_000_000_001_001_0(uniques, 8);
+  f_000_000_001_001_1(uniques, 8);
+  f_000_000_001_010_0(uniques, 8);
+  f_000_000_001_010_1(uniques, 8);
+  f_000_000_001_011_0(uniques, 8);
+  f_000_000_001_011_1(uniques, 8);
+  f_000_000_001_100_0(uniques, 8);
+  f_000_000_001_100_1(uniques, 8);
+  f_000_000_001_101_0(uniques, 8);
+  f_000_000_001_101_1(uniques, 8);
+  f_000_000_001_110_0(uniques, 8);
+  f_000_000_001_110_1(uniques, 8);
+  f_000_000_001_111_0(uniques, 8);
+  f_000_000_001_111_1(uniques, 8);
+  f_000_000_011_000_0(uniques, 8);
+  f_000_000_011_000_1(uniques, 8);
+  f_000_000_011_001_0(uniques, 8);
+  f_000_000_011_001_1(uniques, 8);
+  f_000_000_011_010_0(uniques, 8);
+  f_000_000_011_010_1(uniques, 8);
+  f_000_000_011_011_0(uniques, 8);
+  f_000_000_011_011_1(uniques, 8);
+  f_000_000_011_100_0(uniques, 8);
+  f_000_000_011_100_1(uniques, 8);
+  f_000_000_011_101_0(uniques, 8);
+  f_000_000_011_101_1(uniques, 8);
+  f_000_000_011_110_0(uniques, 8);
+  f_000_000_011_110_1(uniques, 8);
+  f_000_000_011_111_0(uniques, 8);
+  f_000_000_011_111_1(uniques, 8);
+  f_000_000_101_000_0(uniques, 8);
+  f_000_000_101_000_1(uniques, 8);
+  f_000_000_101_001_0(uniques, 8);
+  f_000_000_101_001_1(uniques, 8);
+  f_000_000_101_010_0(uniques, 8);
+  f_000_000_101_010_1(uniques, 8);
+  f_000_000_101_011_0(uniques, 8);
+  f_000_000_101_011_1(uniques, 8);
+  f_000_000_101_100_0(uniques, 8);
+  f_000_000_101_100_1(uniques, 8);
+  f_000_000_101_101_0(uniques, 8);
+  f_000_000_101_101_1(uniques, 8);
+  f_000_000_101_110_0(uniques, 8);
+  f_000_000_101_110_1(uniques, 8);
+  f_000_000_101_111_0(uniques, 8);
+  f_000_000_101_111_1(uniques, 8);
+  f_000_000_111_000_0(uniques, 8);
+  f_000_000_111_000_1(uniques, 8);
+  f_000_000_111_001_0(uniques, 8);
+  f_000_000_111_001_1(uniques, 8);
+  f_000_000_111_010_0(uniques, 8);
+  f_000_000_111_010_1(uniques, 8);
+  f_000_000_111_011_0(uniques, 8);
+  f_000_000_111_011_1(uniques, 8);
+  f_000_000_111_100_0(uniques, 8);
+  f_000_000_111_100_1(uniques, 8);
+  f_000_000_111_101_0(uniques, 8);
+  f_000_000_111_101_1(uniques, 8);
+  f_000_000_111_110_0(uniques, 8);
+  f_000_000_111_110_1(uniques, 8);
+  f_000_000_111_111_0(uniques, 8);
+  f_000_000_111_111_1(uniques, 8);
+  f_000_001_001_000_0(uniques, 8);
+  f_000_001_001_000_1(uniques, 8);
+  f_000_001_001_001_0(uniques, 8);
+  f_000_001_001_001_1(uniques, 8);
+  f_000_001_001_010_0(uniques, 8);
+  f_000_001_001_010_1(uniques, 8);
+  f_000_001_001_011_0(uniques, 8);
+  f_000_001_001_011_1(uniques, 8);
+  f_000_001_001_100_0(uniques, 8);
+  f_000_001_001_100_1(uniques, 8);
+  f_000_001_001_101_0(uniques, 8);
+  f_000_001_001_101_1(uniques, 8);
+  f_000_001_001_110_0(uniques, 8);
+  f_000_001_001_110_1(uniques, 8);
+  f_000_001_001_111_0(uniques, 8);
+  f_000_001_001_111_1(uniques, 8);
+  f_000_001_011_000_0(uniques, 8);
+  f_000_001_011_000_1(uniques, 8);
+  f_000_001_011_001_0(uniques, 8);
+  f_000_001_011_001_1(uniques, 8);
+  f_000_001_011_010_0(uniques, 8);
+  f_000_001_011_010_1(uniques, 8);
+  f_000_001_011_011_0(uniques, 8);
+  f_000_001_011_011_1(uniques, 8);
+  f_000_001_011_100_0(uniques, 8);
+  f_000_001_011_100_1(uniques, 8);
+  f_000_001_011_101_0(uniques, 8);
+  f_000_001_011_101_1(uniques, 8);
+  f_000_001_011_110_0(uniques, 8);
+  f_000_001_011_110_1(uniques, 8);
+  f_000_001_011_111_0(uniques, 8);
+  f_000_001_011_111_1(uniques, 8);
+  f_000_001_101_000_0(uniques, 8);
+  f_000_001_101_000_1(uniques, 8);
+  f_000_001_101_001_0(uniques, 8);
+  f_000_001_101_001_1(uniques, 8);
+  f_000_001_101_010_0(uniques, 8);
+  f_000_001_101_010_1(uniques, 8);
+  f_000_001_101_011_0(uniques, 8);
+  f_000_001_101_011_1(uniques, 8);
+  f_000_001_101_100_0(uniques, 8);
+  f_000_001_101_100_1(uniques, 8);
+  f_000_001_101_101_0(uniques, 8);
+  f_000_001_101_101_1(uniques, 8);
+  f_000_001_101_110_0(uniques, 8);
+  f_000_001_101_110_1(uniques, 8);
+  f_000_001_101_111_0(uniques, 8);
+  f_000_001_101_111_1(uniques, 8);
+  f_000_001_111_000_0(uniques, 8);
+  f_000_001_111_000_1(uniques, 8);
+  f_000_001_111_001_0(uniques, 8);
+  f_000_001_111_001_1(uniques, 8);
+  f_000_001_111_010_0(uniques, 8);
+  f_000_001_111_010_1(uniques, 8);
+  f_000_001_111_011_0(uniques, 8);
+  f_000_001_111_011_1(uniques, 8);
+  f_000_001_111_100_0(uniques, 8);
+  f_000_001_111_100_1(uniques, 8);
+  f_000_001_111_101_0(uniques, 8);
+  f_000_001_111_101_1(uniques, 8);
+  f_000_001_111_110_0(uniques, 8);
+  f_000_001_111_110_1(uniques, 8);
+  f_000_001_111_111_0(uniques, 8);
+  f_000_001_111_111_1(uniques, 8);
+  f_000_010_001_000_0(uniques, 8);
+  f_000_010_001_000_1(uniques, 8);
+  f_000_010_001_001_0(uniques, 8);
+  f_000_010_001_001_1(uniques, 8);
+  f_000_010_001_010_0(uniques, 8);
+  f_000_010_001_010_1(uniques, 8);
+  f_000_010_001_011_0(uniques, 8);
+  f_000_010_001_011_1(uniques, 8);
+  f_000_010_001_100_0(uniques, 8);
+  f_000_010_001_100_1(uniques, 8);
+  f_000_010_001_101_0(uniques, 8);
+  f_000_010_001_101_1(uniques, 8);
+  f_000_010_001_110_0(uniques, 8);
+  f_000_010_001_110_1(uniques, 8);
+  f_000_010_001_111_0(uniques, 8);
+  f_000_010_001_111_1(uniques, 8);
+  f_000_010_011_000_0(uniques, 8);
+  f_000_010_011_000_1(uniques, 8);
+  f_000_010_011_001_0(uniques, 8);
+  f_000_010_011_001_1(uniques, 8);
+  f_000_010_011_010_0(uniques, 8);
+  f_000_010_011_010_1(uniques, 8);
+  f_000_010_011_011_0(uniques, 8);
+  f_000_010_011_011_1(uniques, 8);
+  f_000_010_011_100_0(uniques, 8);
+  f_000_010_011_100_1(uniques, 8);
+  f_000_010_011_101_0(uniques, 8);
+  f_000_010_011_101_1(uniques, 8);
+  f_000_010_011_110_0(uniques, 8);
+  f_000_010_011_110_1(uniques, 8);
+  f_000_010_011_111_0(uniques, 8);
+  f_000_010_011_111_1(uniques, 8);
+  f_000_010_101_000_0(uniques, 8);
+  f_000_010_101_000_1(uniques, 8);
+  f_000_010_101_001_0(uniques, 8);
+  f_000_010_101_001_1(uniques, 8);
+  f_000_010_101_010_0(uniques, 8);
+  f_000_010_101_010_1(uniques, 8);
+  f_000_010_101_011_0(uniques, 8);
+  f_000_010_101_011_1(uniques, 8);
+  f_000_010_101_100_0(uniques, 8);
+  f_000_010_101_100_1(uniques, 8);
+  f_000_010_101_101_0(uniques, 8);
+  f_000_010_101_101_1(uniques, 8);
+  f_000_010_101_110_0(uniques, 8);
+  f_000_010_101_110_1(uniques, 8);
+  f_000_010_101_111_0(uniques, 8);
+  f_000_010_101_111_1(uniques, 8);
+  f_000_010_111_000_0(uniques, 8);
+  f_000_010_111_000_1(uniques, 8);
+  f_000_010_111_001_0(uniques, 8);
+  f_000_010_111_001_1(uniques, 8);
+  f_000_010_111_010_0(uniques, 8);
+  f_000_010_111_010_1(uniques, 8);
+  f_000_010_111_011_0(uniques, 8);
+  f_000_010_111_011_1(uniques, 8);
+  f_000_010_111_100_0(uniques, 8);
+  f_000_010_111_100_1(uniques, 8);
+  f_000_010_111_101_0(uniques, 8);
+  f_000_010_111_101_1(uniques, 8);
+  f_000_010_111_110_0(uniques, 8);
+  f_000_010_111_110_1(uniques, 8);
+  f_000_010_111_111_0(uniques, 8);
+  f_000_010_111_111_1(uniques, 8);
+  f_000_011_001_000_0(uniques, 8);
+  f_000_011_001_000_1(uniques, 8);
+  f_000_011_001_001_0(uniques, 8);
+  f_000_011_001_001_1(uniques, 8);
+  f_000_011_001_010_0(uniques, 8);
+  f_000_011_001_010_1(uniques, 8);
+  f_000_011_001_011_0(uniques, 8);
+  f_000_011_001_011_1(uniques, 8);
+  f_000_011_001_100_0(uniques, 8);
+  f_000_011_001_100_1(uniques, 8);
+  f_000_011_001_101_0(uniques, 8);
+  f_000_011_001_101_1(uniques, 8);
+  f_000_011_001_110_0(uniques, 8);
+  f_000_011_001_110_1(uniques, 8);
+  f_000_011_001_111_0(uniques, 8);
+  f_000_011_001_111_1(uniques, 8);
+  f_000_011_011_000_0(uniques, 8);
+  f_000_011_011_000_1(uniques, 8);
+  f_000_011_011_001_0(uniques, 8);
+  f_000_011_011_001_1(uniques, 8);
+  f_000_011_011_010_0(uniques, 8);
+  f_000_011_011_010_1(uniques, 8);
+  f_000_011_011_011_0(uniques, 8);
+  f_000_011_011_011_1(uniques, 8);
+  f_000_011_011_100_0(uniques, 8);
+  f_000_011_011_100_1(uniques, 8);
+  f_000_011_011_101_0(uniques, 8);
+  f_000_011_011_101_1(uniques, 8);
+  f_000_011_011_110_0(uniques, 8);
+  f_000_011_011_110_1(uniques, 8);
+  f_000_011_011_111_0(uniques, 8);
+  f_000_011_011_111_1(uniques, 8);
+  f_000_011_101_000_0(uniques, 8);
+  f_000_011_101_000_1(uniques, 8);
+  f_000_011_101_001_0(uniques, 8);
+  f_000_011_101_001_1(uniques, 8);
+  f_000_011_101_010_0(uniques, 8);
+  f_000_011_101_010_1(uniques, 8);
+  f_000_011_101_011_0(uniques, 8);
+  f_000_011_101_011_1(uniques, 8);
+  f_000_011_101_100_0(uniques, 8);
+  f_000_011_101_100_1(uniques, 8);
+  f_000_011_101_101_0(uniques, 8);
+  f_000_011_101_101_1(uniques, 8);
+  f_000_011_101_110_0(uniques, 8);
+  f_000_011_101_110_1(uniques, 8);
+  f_000_011_101_111_0(uniques, 8);
+  f_000_011_101_111_1(uniques, 8);
+  f_000_011_111_000_0(uniques, 8);
+  f_000_011_111_000_1(uniques, 8);
+  f_000_011_111_001_0(uniques, 8);
+  f_000_011_111_001_1(uniques, 8);
+  f_000_011_111_010_0(uniques, 8);
+  f_000_011_111_010_1(uniques, 8);
+  f_000_011_111_011_0(uniques, 8);
+  f_000_011_111_011_1(uniques, 8);
+  f_000_011_111_100_0(uniques, 8);
+  f_000_011_111_100_1(uniques, 8);
+  f_000_011_111_101_0(uniques, 8);
+  f_000_011_111_101_1(uniques, 8);
+  f_000_011_111_110_0(uniques, 8);
+  f_000_011_111_110_1(uniques, 8);
+  f_000_011_111_111_0(uniques, 8);
+  f_000_011_111_111_1(uniques, 8);
+  f_000_100_001_000_0(uniques, 8);
+  f_000_100_001_000_1(uniques, 8);
+  f_000_100_001_001_0(uniques, 8);
+  f_000_100_001_001_1(uniques, 8);
+  f_000_100_001_010_0(uniques, 8);
+  f_000_100_001_010_1(uniques, 8);
+  f_000_100_001_011_0(uniques, 8);
+  f_000_100_001_011_1(uniques, 8);
+  f_000_100_001_100_0(uniques, 8);
+  f_000_100_001_100_1(uniques, 8);
+  f_000_100_001_101_0(uniques, 8);
+  f_000_100_001_101_1(uniques, 8);
+  f_000_100_001_110_0(uniques, 8);
+  f_000_100_001_110_1(uniques, 8);
+  f_000_100_001_111_0(uniques, 8);
+  f_000_100_001_111_1(uniques, 8);
+  f_000_100_011_000_0(uniques, 8);
+  f_000_100_011_000_1(uniques, 8);
+  f_000_100_011_001_0(uniques, 8);
+  f_000_100_011_001_1(uniques, 8);
+  f_000_100_011_010_0(uniques, 8);
+  f_000_100_011_010_1(uniques, 8);
+  f_000_100_011_011_0(uniques, 8);
+  f_000_100_011_011_1(uniques, 8);
+  f_000_100_011_100_0(uniques, 8);
+  f_000_100_011_100_1(uniques, 8);
+  f_000_100_011_101_0(uniques, 8);
+  f_000_100_011_101_1(uniques, 8);
+  f_000_100_011_110_0(uniques, 8);
+  f_000_100_011_110_1(uniques, 8);
+  f_000_100_011_111_0(uniques, 8);
+  f_000_100_011_111_1(uniques, 8);
+  f_000_100_101_000_0(uniques, 8);
+  f_000_100_101_000_1(uniques, 8);
+  f_000_100_101_001_0(uniques, 8);
+  f_000_100_101_001_1(uniques, 8);
+  f_000_100_101_010_0(uniques, 8);
+  f_000_100_101_010_1(uniques, 8);
+  f_000_100_101_011_0(uniques, 8);
+  f_000_100_101_011_1(uniques, 8);
+  f_000_100_101_100_0(uniques, 8);
+  f_000_100_101_100_1(uniques, 8);
+  f_000_100_101_101_0(uniques, 8);
+  f_000_100_101_101_1(uniques, 8);
+  f_000_100_101_110_0(uniques, 8);
+  f_000_100_101_110_1(uniques, 8);
+  f_000_100_101_111_0(uniques, 8);
+  f_000_100_101_111_1(uniques, 8);
+  f_000_100_111_000_0(uniques, 8);
+  f_000_100_111_000_1(uniques, 8);
+  f_000_100_111_001_0(uniques, 8);
+  f_000_100_111_001_1(uniques, 8);
+  f_000_100_111_010_0(uniques, 8);
+  f_000_100_111_010_1(uniques, 8);
+  f_000_100_111_011_0(uniques, 8);
+  f_000_100_111_011_1(uniques, 8);
+  f_000_100_111_100_0(uniques, 8);
+  f_000_100_111_100_1(uniques, 8);
+  f_000_100_111_101_0(uniques, 8);
+  f_000_100_111_101_1(uniques, 8);
+  f_000_100_111_110_0(uniques, 8);
+  f_000_100_111_110_1(uniques, 8);
+  f_000_100_111_111_0(uniques, 8);
+  f_000_100_111_111_1(uniques, 8);
+  f_000_101_001_000_0(uniques, 8);
+  f_000_101_001_000_1(uniques, 8);
+  f_000_101_001_001_0(uniques, 8);
+  f_000_101_001_001_1(uniques, 8);
+  f_000_101_001_010_0(uniques, 8);
+  f_000_101_001_010_1(uniques, 8);
+  f_000_101_001_011_0(uniques, 8);
+  f_000_101_001_011_1(uniques, 8);
+  f_000_101_001_100_0(uniques, 8);
+  f_000_101_001_100_1(uniques, 8);
+  f_000_101_001_101_0(uniques, 8);
+  f_000_101_001_101_1(uniques, 8);
+  f_000_101_001_110_0(uniques, 8);
+  f_000_101_001_110_1(uniques, 8);
+  f_000_101_001_111_0(uniques, 8);
+  f_000_101_001_111_1(uniques, 8);
+  f_000_101_011_000_0(uniques, 8);
+  f_000_101_011_000_1(uniques, 8);
+  f_000_101_011_001_0(uniques, 8);
+  f_000_101_011_001_1(uniques, 8);
+  f_000_101_011_010_0(uniques, 8);
+  f_000_101_011_010_1(uniques, 8);
+  f_000_101_011_011_0(uniques, 8);
+  f_000_101_011_011_1(uniques, 8);
+  f_000_101_011_100_0(uniques, 8);
+  f_000_101_011_100_1(uniques, 8);
+  f_000_101_011_101_0(uniques, 8);
+  f_000_101_011_101_1(uniques, 8);
+  f_000_101_011_110_0(uniques, 8);
+  f_000_101_011_110_1(uniques, 8);
+  f_000_101_011_111_0(uniques, 8);
+  f_000_101_011_111_1(uniques, 8);
+  f_000_101_101_000_0(uniques, 8);
+  f_000_101_101_000_1(uniques, 8);
+  f_000_101_101_001_0(uniques, 8);
+  f_000_101_101_001_1(uniques, 8);
+  f_000_101_101_010_0(uniques, 8);
+  f_000_101_101_010_1(uniques, 8);
+  f_000_101_101_011_0(uniques, 8);
+  f_000_101_101_011_1(uniques, 8);
+  f_000_101_101_100_0(uniques, 8);
+  f_000_101_101_100_1(uniques, 8);
+  f_000_101_101_101_0(uniques, 8);
+  f_000_101_101_101_1(uniques, 8);
+  f_000_101_101_110_0(uniques, 8);
+  f_000_101_101_110_1(uniques, 8);
+  f_000_101_101_111_0(uniques, 8);
+  f_000_101_101_111_1(uniques, 8);
+  f_000_101_111_000_0(uniques, 8);
+  f_000_101_111_000_1(uniques, 8);
+  f_000_101_111_001_0(uniques, 8);
+  f_000_101_111_001_1(uniques, 8);
+  f_000_101_111_010_0(uniques, 8);
+  f_000_101_111_010_1(uniques, 8);
+  f_000_101_111_011_0(uniques, 8);
+  f_000_101_111_011_1(uniques, 8);
+  f_000_101_111_100_0(uniques, 8);
+  f_000_101_111_100_1(uniques, 8);
+  f_000_101_111_101_0(uniques, 8);
+  f_000_101_111_101_1(uniques, 8);
+  f_000_101_111_110_0(uniques, 8);
+  f_000_101_111_110_1(uniques, 8);
+  f_000_101_111_111_0(uniques, 8);
+  f_000_101_111_111_1(uniques, 8);
+  f_000_110_001_000_0(uniques, 8);
+  f_000_110_001_000_1(uniques, 8);
+  f_000_110_001_001_0(uniques, 8);
+  f_000_110_001_001_1(uniques, 8);
+  f_000_110_001_010_0(uniques, 8);
+  f_000_110_001_010_1(uniques, 8);
+  f_000_110_001_011_0(uniques, 8);
+  f_000_110_001_011_1(uniques, 8);
+  f_000_110_001_100_0(uniques, 8);
+  f_000_110_001_100_1(uniques, 8);
+  f_000_110_001_101_0(uniques, 8);
+  f_000_110_001_101_1(uniques, 8);
+  f_000_110_001_110_0(uniques, 8);
+  f_000_110_001_110_1(uniques, 8);
+  f_000_110_001_111_0(uniques, 8);
+  f_000_110_001_111_1(uniques, 8);
+  f_000_110_011_000_0(uniques, 8);
+  f_000_110_011_000_1(uniques, 8);
+  f_000_110_011_001_0(uniques, 8);
+  f_000_110_011_001_1(uniques, 8);
+  f_000_110_011_010_0(uniques, 8);
+  f_000_110_011_010_1(uniques, 8);
+  f_000_110_011_011_0(uniques, 8);
+  f_000_110_011_011_1(uniques, 8);
+  f_000_110_011_100_0(uniques, 8);
+  f_000_110_011_100_1(uniques, 8);
+  f_000_110_011_101_0(uniques, 8);
+  f_000_110_011_101_1(uniques, 8);
+  f_000_110_011_110_0(uniques, 8);
+  f_000_110_011_110_1(uniques, 8);
+  f_000_110_011_111_0(uniques, 8);
+  f_000_110_011_111_1(uniques, 8);
+  f_000_110_101_000_0(uniques, 8);
+  f_000_110_101_000_1(uniques, 8);
+  f_000_110_101_001_0(uniques, 8);
+  f_000_110_101_001_1(uniques, 8);
+  f_000_110_101_010_0(uniques, 8);
+  f_000_110_101_010_1(uniques, 8);
+  f_000_110_101_011_0(uniques, 8);
+  f_000_110_101_011_1(uniques, 8);
+  f_000_110_101_100_0(uniques, 8);
+  f_000_110_101_100_1(uniques, 8);
+  f_000_110_101_101_0(uniques, 8);
+  f_000_110_101_101_1(uniques, 8);
+  f_000_110_101_110_0(uniques, 8);
+  f_000_110_101_110_1(uniques, 8);
+  f_000_110_101_111_0(uniques, 8);
+  f_000_110_101_111_1(uniques, 8);
+  f_000_110_111_000_0(uniques, 8);
+  f_000_110_111_000_1(uniques, 8);
+  f_000_110_111_001_0(uniques, 8);
+  f_000_110_111_001_1(uniques, 8);
+  f_000_110_111_010_0(uniques, 8);
+  f_000_110_111_010_1(uniques, 8);
+  f_000_110_111_011_0(uniques, 8);
+  f_000_110_111_011_1(uniques, 8);
+  f_000_110_111_100_0(uniques, 8);
+  f_000_110_111_100_1(uniques, 8);
+  f_000_110_111_101_0(uniques, 8);
+  f_000_110_111_101_1(uniques, 8);
+  f_000_110_111_110_0(uniques, 8);
+  f_000_110_111_110_1(uniques, 8);
+  f_000_110_111_111_0(uniques, 8);
+  f_000_110_111_111_1(uniques, 8);
+  f_000_111_001_000_0(uniques, 8);
+  f_000_111_001_000_1(uniques, 8);
+  f_000_111_001_001_0(uniques, 8);
+  f_000_111_001_001_1(uniques, 8);
+  f_000_111_001_010_0(uniques, 8);
+  f_000_111_001_010_1(uniques, 8);
+  f_000_111_001_011_0(uniques, 8);
+  f_000_111_001_011_1(uniques, 8);
+  f_000_111_001_100_0(uniques, 8);
+  f_000_111_001_100_1(uniques, 8);
+  f_000_111_001_101_0(uniques, 8);
+  f_000_111_001_101_1(uniques, 8);
+  f_000_111_001_110_0(uniques, 8);
+  f_000_111_001_110_1(uniques, 8);
+  f_000_111_001_111_0(uniques, 8);
+  f_000_111_001_111_1(uniques, 8);
+  f_000_111_011_000_0(uniques, 8);
+  f_000_111_011_000_1(uniques, 8);
+  f_000_111_011_001_0(uniques, 8);
+  f_000_111_011_001_1(uniques, 8);
+  f_000_111_011_010_0(uniques, 8);
+  f_000_111_011_010_1(uniques, 8);
+  f_000_111_011_011_0(uniques, 8);
+  f_000_111_011_011_1(uniques, 8);
+  f_000_111_011_100_0(uniques, 8);
+  f_000_111_011_100_1(uniques, 8);
+  f_000_111_011_101_0(uniques, 8);
+  f_000_111_011_101_1(uniques, 8);
+  f_000_111_011_110_0(uniques, 8);
+  f_000_111_011_110_1(uniques, 8);
+  f_000_111_011_111_0(uniques, 8);
+  f_000_111_011_111_1(uniques, 8);
+  f_000_111_101_000_0(uniques, 8);
+  f_000_111_101_000_1(uniques, 8);
+  f_000_111_101_001_0(uniques, 8);
+  f_000_111_101_001_1(uniques, 8);
+  f_000_111_101_010_0(uniques, 8);
+  f_000_111_101_010_1(uniques, 8);
+  f_000_111_101_011_0(uniques, 8);
+  f_000_111_101_011_1(uniques, 8);
+  f_000_111_101_100_0(uniques, 8);
+  f_000_111_101_100_1(uniques, 8);
+  f_000_111_101_101_0(uniques, 8);
+  f_000_111_101_101_1(uniques, 8);
+  f_000_111_101_110_0(uniques, 8);
+  f_000_111_101_110_1(uniques, 8);
+  f_000_111_101_111_0(uniques, 8);
+  f_000_111_101_111_1(uniques, 8);
+  f_000_111_111_000_0(uniques, 8);
+  f_000_111_111_000_1(uniques, 8);
+  f_000_111_111_001_0(uniques, 8);
+  f_000_111_111_001_1(uniques, 8);
+  f_000_111_111_010_0(uniques, 8);
+  f_000_111_111_010_1(uniques, 8);
+  f_000_111_111_011_0(uniques, 8);
+  f_000_111_111_011_1(uniques, 8);
+  f_000_111_111_100_0(uniques, 8);
+  f_000_111_111_100_1(uniques, 8);
+  f_000_111_111_101_0(uniques, 8);
+  f_000_111_111_101_1(uniques, 8);
+  f_000_111_111_110_0(uniques, 8);
+  f_000_111_111_110_1(uniques, 8);
+  f_000_111_111_111_0(uniques, 8);
+  f_000_111_111_111_1(uniques, 8);
+  f_001_000_001_000_0(uniques, 8);
+  f_001_000_001_000_1(uniques, 8);
+  f_001_000_001_001_0(uniques, 8);
+  f_001_000_001_001_1(uniques, 8);
+  f_001_000_001_010_0(uniques, 8);
+  f_001_000_001_010_1(uniques, 8);
+  f_001_000_001_011_0(uniques, 8);
+  f_001_000_001_011_1(uniques, 8);
+  f_001_000_001_100_0(uniques, 8);
+  f_001_000_001_100_1(uniques, 8);
+  f_001_000_001_101_0(uniques, 8);
+  f_001_000_001_101_1(uniques, 8);
+  f_001_000_001_110_0(uniques, 8);
+  f_001_000_001_110_1(uniques, 8);
+  f_001_000_001_111_0(uniques, 8);
+  f_001_000_001_111_1(uniques, 8);
+  f_001_000_011_000_0(uniques, 8);
+  f_001_000_011_000_1(uniques, 8);
+  f_001_000_011_001_0(uniques, 8);
+  f_001_000_011_001_1(uniques, 8);
+  f_001_000_011_010_0(uniques, 8);
+  f_001_000_011_010_1(uniques, 8);
+  f_001_000_011_011_0(uniques, 8);
+  f_001_000_011_011_1(uniques, 8);
+  f_001_000_011_100_0(uniques, 8);
+  f_001_000_011_100_1(uniques, 8);
+  f_001_000_011_101_0(uniques, 8);
+  f_001_000_011_101_1(uniques, 8);
+  f_001_000_011_110_0(uniques, 8);
+  f_001_000_011_110_1(uniques, 8);
+  f_001_000_011_111_0(uniques, 8);
+  f_001_000_011_111_1(uniques, 8);
+  f_001_000_101_000_0(uniques, 8);
+  f_001_000_101_000_1(uniques, 8);
+  f_001_000_101_001_0(uniques, 8);
+  f_001_000_101_001_1(uniques, 8);
+  f_001_000_101_010_0(uniques, 8);
+  f_001_000_101_010_1(uniques, 8);
+  f_001_000_101_011_0(uniques, 8);
+  f_001_000_101_011_1(uniques, 8);
+  f_001_000_101_100_0(uniques, 8);
+  f_001_000_101_100_1(uniques, 8);
+  f_001_000_101_101_0(uniques, 8);
+  f_001_000_101_101_1(uniques, 8);
+  f_001_000_101_110_0(uniques, 8);
+  f_001_000_101_110_1(uniques, 8);
+  f_001_000_101_111_0(uniques, 8);
+  f_001_000_101_111_1(uniques, 8);
+  f_001_000_111_000_0(uniques, 8);
+  f_001_000_111_000_1(uniques, 8);
+  f_001_000_111_001_0(uniques, 8);
+  f_001_000_111_001_1(uniques, 8);
+  f_001_000_111_010_0(uniques, 8);
+  f_001_000_111_010_1(uniques, 8);
+  f_001_000_111_011_0(uniques, 8);
+  f_001_000_111_011_1(uniques, 8);
+  f_001_000_111_100_0(uniques, 8);
+  f_001_000_111_100_1(uniques, 8);
+  f_001_000_111_101_0(uniques, 8);
+  f_001_000_111_101_1(uniques, 8);
+  f_001_000_111_110_0(uniques, 8);
+  f_001_000_111_110_1(uniques, 8);
+  f_001_000_111_111_0(uniques, 8);
+  f_001_000_111_111_1(uniques, 8);
+  f_001_001_001_000_0(uniques, 8);
+  f_001_001_001_000_1(uniques, 8);
+  f_001_001_001_001_0(uniques, 8);
+  f_001_001_001_001_1(uniques, 8);
+  f_001_001_001_010_0(uniques, 8);
+  f_001_001_001_010_1(uniques, 8);
+  f_001_001_001_011_0(uniques, 8);
+  f_001_001_001_011_1(uniques, 8);
+  f_001_001_001_100_0(uniques, 8);
+  f_001_001_001_100_1(uniques, 8);
+  f_001_001_001_101_0(uniques, 8);
+  f_001_001_001_101_1(uniques, 8);
+  f_001_001_001_110_0(uniques, 8);
+  f_001_001_001_110_1(uniques, 8);
+  f_001_001_001_111_0(uniques, 8);
+  f_001_001_001_111_1(uniques, 8);
+  f_001_001_011_000_0(uniques, 8);
+  f_001_001_011_000_1(uniques, 8);
+  f_001_001_011_001_0(uniques, 8);
+  f_001_001_011_001_1(uniques, 8);
+  f_001_001_011_010_0(uniques, 8);
+  f_001_001_011_010_1(uniques, 8);
+  f_001_001_011_011_0(uniques, 8);
+  f_001_001_011_011_1(uniques, 8);
+  f_001_001_011_100_0(uniques, 8);
+  f_001_001_011_100_1(uniques, 8);
+  f_001_001_011_101_0(uniques, 8);
+  f_001_001_011_101_1(uniques, 8);
+  f_001_001_011_110_0(uniques, 8);
+  f_001_001_011_110_1(uniques, 8);
+  f_001_001_011_111_0(uniques, 8);
+  f_001_001_011_111_1(uniques, 8);
+  f_001_001_101_000_0(uniques, 8);
+  f_001_001_101_000_1(uniques, 8);
+  f_001_001_101_001_0(uniques, 8);
+  f_001_001_101_001_1(uniques, 8);
+  f_001_001_101_010_0(uniques, 8);
+  f_001_001_101_010_1(uniques, 8);
+  f_001_001_101_011_0(uniques, 8);
+  f_001_001_101_011_1(uniques, 8);
+  f_001_001_101_100_0(uniques, 8);
+  f_001_001_101_100_1(uniques, 8);
+  f_001_001_101_101_0(uniques, 8);
+  f_001_001_101_101_1(uniques, 8);
+  f_001_001_101_110_0(uniques, 8);
+  f_001_001_101_110_1(uniques, 8);
+  f_001_001_101_111_0(uniques, 8);
+  f_001_001_101_111_1(uniques, 8);
+  f_001_001_111_000_0(uniques, 8);
+  f_001_001_111_000_1(uniques, 8);
+  f_001_001_111_001_0(uniques, 8);
+  f_001_001_111_001_1(uniques, 8);
+  f_001_001_111_010_0(uniques, 8);
+  f_001_001_111_010_1(uniques, 8);
+  f_001_001_111_011_0(uniques, 8);
+  f_001_001_111_011_1(uniques, 8);
+  f_001_001_111_100_0(uniques, 8);
+  f_001_001_111_100_1(uniques, 8);
+  f_001_001_111_101_0(uniques, 8);
+  f_001_001_111_101_1(uniques, 8);
+  f_001_001_111_110_0(uniques, 8);
+  f_001_001_111_110_1(uniques, 8);
+  f_001_001_111_111_0(uniques, 8);
+  f_001_001_111_111_1(uniques, 8);
+  f_001_010_001_000_0(uniques, 8);
+  f_001_010_001_000_1(uniques, 8);
+  f_001_010_001_001_0(uniques, 8);
+  f_001_010_001_001_1(uniques, 8);
+  f_001_010_001_010_0(uniques, 8);
+  f_001_010_001_010_1(uniques, 8);
+  f_001_010_001_011_0(uniques, 8);
+  f_001_010_001_011_1(uniques, 8);
+  f_001_010_001_100_0(uniques, 8);
+  f_001_010_001_100_1(uniques, 8);
+  f_001_010_001_101_0(uniques, 8);
+  f_001_010_001_101_1(uniques, 8);
+  f_001_010_001_110_0(uniques, 8);
+  f_001_010_001_110_1(uniques, 8);
+  f_001_010_001_111_0(uniques, 8);
+  f_001_010_001_111_1(uniques, 8);
+  f_001_010_011_000_0(uniques, 8);
+  f_001_010_011_000_1(uniques, 8);
+  f_001_010_011_001_0(uniques, 8);
+  f_001_010_011_001_1(uniques, 8);
+  f_001_010_011_010_0(uniques, 8);
+  f_001_010_011_010_1(uniques, 8);
+  f_001_010_011_011_0(uniques, 8);
+  f_001_010_011_011_1(uniques, 8);
+  f_001_010_011_100_0(uniques, 8);
+  f_001_010_011_100_1(uniques, 8);
+  f_001_010_011_101_0(uniques, 8);
+  f_001_010_011_101_1(uniques, 8);
+  f_001_010_011_110_0(uniques, 8);
+  f_001_010_011_110_1(uniques, 8);
+  f_001_010_011_111_0(uniques, 8);
+  f_001_010_011_111_1(uniques, 8);
+  f_001_010_101_000_0(uniques, 8);
+  f_001_010_101_000_1(uniques, 8);
+  f_001_010_101_001_0(uniques, 8);
+  f_001_010_101_001_1(uniques, 8);
+  f_001_010_101_010_0(uniques, 8);
+  f_001_010_101_010_1(uniques, 8);
+  f_001_010_101_011_0(uniques, 8);
+  f_001_010_101_011_1(uniques, 8);
+  f_001_010_101_100_0(uniques, 8);
+  f_001_010_101_100_1(uniques, 8);
+  f_001_010_101_101_0(uniques, 8);
+  f_001_010_101_101_1(uniques, 8);
+  f_001_010_101_110_0(uniques, 8);
+  f_001_010_101_110_1(uniques, 8);
+  f_001_010_101_111_0(uniques, 8);
+  f_001_010_101_111_1(uniques, 8);
+  f_001_010_111_000_0(uniques, 8);
+  f_001_010_111_000_1(uniques, 8);
+  f_001_010_111_001_0(uniques, 8);
+  f_001_010_111_001_1(uniques, 8);
+  f_001_010_111_010_0(uniques, 8);
+  f_001_010_111_010_1(uniques, 8);
+  f_001_010_111_011_0(uniques, 8);
+  f_001_010_111_011_1(uniques, 8);
+  f_001_010_111_100_0(uniques, 8);
+  f_001_010_111_100_1(uniques, 8);
+  f_001_010_111_101_0(uniques, 8);
+  f_001_010_111_101_1(uniques, 8);
+  f_001_010_111_110_0(uniques, 8);
+  f_001_010_111_110_1(uniques, 8);
+  f_001_010_111_111_0(uniques, 8);
+  f_001_010_111_111_1(uniques, 8);
+  f_001_011_001_000_0(uniques, 8);
+  f_001_011_001_000_1(uniques, 8);
+  f_001_011_001_001_0(uniques, 8);
+  f_001_011_001_001_1(uniques, 8);
+  f_001_011_001_010_0(uniques, 8);
+  f_001_011_001_010_1(uniques, 8);
+  f_001_011_001_011_0(uniques, 8);
+  f_001_011_001_011_1(uniques, 8);
+  f_001_011_001_100_0(uniques, 8);
+  f_001_011_001_100_1(uniques, 8);
+  f_001_011_001_101_0(uniques, 8);
+  f_001_011_001_101_1(uniques, 8);
+  f_001_011_001_110_0(uniques, 8);
+  f_001_011_001_110_1(uniques, 8);
+  f_001_011_001_111_0(uniques, 8);
+  f_001_011_001_111_1(uniques, 8);
+  f_001_011_011_000_0(uniques, 8);
+  f_001_011_011_000_1(uniques, 8);
+  f_001_011_011_001_0(uniques, 8);
+  f_001_011_011_001_1(uniques, 8);
+  f_001_011_011_010_0(uniques, 8);
+  f_001_011_011_010_1(uniques, 8);
+  f_001_011_011_011_0(uniques, 8);
+  f_001_011_011_011_1(uniques, 8);
+  f_001_011_011_100_0(uniques, 8);
+  f_001_011_011_100_1(uniques, 8);
+  f_001_011_011_101_0(uniques, 8);
+  f_001_011_011_101_1(uniques, 8);
+  f_001_011_011_110_0(uniques, 8);
+  f_001_011_011_110_1(uniques, 8);
+  f_001_011_011_111_0(uniques, 8);
+  f_001_011_011_111_1(uniques, 8);
+  f_001_011_101_000_0(uniques, 8);
+  f_001_011_101_000_1(uniques, 8);
+  f_001_011_101_001_0(uniques, 8);
+  f_001_011_101_001_1(uniques, 8);
+  f_001_011_101_010_0(uniques, 8);
+  f_001_011_101_010_1(uniques, 8);
+  f_001_011_101_011_0(uniques, 8);
+  f_001_011_101_011_1(uniques, 8);
+  f_001_011_101_100_0(uniques, 8);
+  f_001_011_101_100_1(uniques, 8);
+  f_001_011_101_101_0(uniques, 8);
+  f_001_011_101_101_1(uniques, 8);
+  f_001_011_101_110_0(uniques, 8);
+  f_001_011_101_110_1(uniques, 8);
+  f_001_011_101_111_0(uniques, 8);
+  f_001_011_101_111_1(uniques, 8);
+  f_001_011_111_000_0(uniques, 8);
+  f_001_011_111_000_1(uniques, 8);
+  f_001_011_111_001_0(uniques, 8);
+  f_001_011_111_001_1(uniques, 8);
+  f_001_011_111_010_0(uniques, 8);
+  f_001_011_111_010_1(uniques, 8);
+  f_001_011_111_011_0(uniques, 8);
+  f_001_011_111_011_1(uniques, 8);
+  f_001_011_111_100_0(uniques, 8);
+  f_001_011_111_100_1(uniques, 8);
+  f_001_011_111_101_0(uniques, 8);
+  f_001_011_111_101_1(uniques, 8);
+  f_001_011_111_110_0(uniques, 8);
+  f_001_011_111_110_1(uniques, 8);
+  f_001_011_111_111_0(uniques, 8);
+  f_001_011_111_111_1(uniques, 8);
+  f_001_100_001_000_0(uniques, 8);
+  f_001_100_001_000_1(uniques, 8);
+  f_001_100_001_001_0(uniques, 8);
+  f_001_100_001_001_1(uniques, 8);
+  f_001_100_001_010_0(uniques, 8);
+  f_001_100_001_010_1(uniques, 8);
+  f_001_100_001_011_0(uniques, 8);
+  f_001_100_001_011_1(uniques, 8);
+  f_001_100_001_100_0(uniques, 8);
+  f_001_100_001_100_1(uniques, 8);
+  f_001_100_001_101_0(uniques, 8);
+  f_001_100_001_101_1(uniques, 8);
+  f_001_100_001_110_0(uniques, 8);
+  f_001_100_001_110_1(uniques, 8);
+  f_001_100_001_111_0(uniques, 8);
+  f_001_100_001_111_1(uniques, 8);
+  f_001_100_011_000_0(uniques, 8);
+  f_001_100_011_000_1(uniques, 8);
+  f_001_100_011_001_0(uniques, 8);
+  f_001_100_011_001_1(uniques, 8);
+  f_001_100_011_010_0(uniques, 8);
+  f_001_100_011_010_1(uniques, 8);
+  f_001_100_011_011_0(uniques, 8);
+  f_001_100_011_011_1(uniques, 8);
+  f_001_100_011_100_0(uniques, 8);
+  f_001_100_011_100_1(uniques, 8);
+  f_001_100_011_101_0(uniques, 8);
+  f_001_100_011_101_1(uniques, 8);
+  f_001_100_011_110_0(uniques, 8);
+  f_001_100_011_110_1(uniques, 8);
+  f_001_100_011_111_0(uniques, 8);
+  f_001_100_011_111_1(uniques, 8);
+  f_001_100_101_000_0(uniques, 8);
+  f_001_100_101_000_1(uniques, 8);
+  f_001_100_101_001_0(uniques, 8);
+  f_001_100_101_001_1(uniques, 8);
+  f_001_100_101_010_0(uniques, 8);
+  f_001_100_101_010_1(uniques, 8);
+  f_001_100_101_011_0(uniques, 8);
+  f_001_100_101_011_1(uniques, 8);
+  f_001_100_101_100_0(uniques, 8);
+  f_001_100_101_100_1(uniques, 8);
+  f_001_100_101_101_0(uniques, 8);
+  f_001_100_101_101_1(uniques, 8);
+  f_001_100_101_110_0(uniques, 8);
+  f_001_100_101_110_1(uniques, 8);
+  f_001_100_101_111_0(uniques, 8);
+  f_001_100_101_111_1(uniques, 8);
+  f_001_100_111_000_0(uniques, 8);
+  f_001_100_111_000_1(uniques, 8);
+  f_001_100_111_001_0(uniques, 8);
+  f_001_100_111_001_1(uniques, 8);
+  f_001_100_111_010_0(uniques, 8);
+  f_001_100_111_010_1(uniques, 8);
+  f_001_100_111_011_0(uniques, 8);
+  f_001_100_111_011_1(uniques, 8);
+  f_001_100_111_100_0(uniques, 8);
+  f_001_100_111_100_1(uniques, 8);
+  f_001_100_111_101_0(uniques, 8);
+  f_001_100_111_101_1(uniques, 8);
+  f_001_100_111_110_0(uniques, 8);
+  f_001_100_111_110_1(uniques, 8);
+  f_001_100_111_111_0(uniques, 8);
+  f_001_100_111_111_1(uniques, 8);
+  f_001_101_001_000_0(uniques, 8);
+  f_001_101_001_000_1(uniques, 8);
+  f_001_101_001_001_0(uniques, 8);
+  f_001_101_001_001_1(uniques, 8);
+  f_001_101_001_010_0(uniques, 8);
+  f_001_101_001_010_1(uniques, 8);
+  f_001_101_001_011_0(uniques, 8);
+  f_001_101_001_011_1(uniques, 8);
+  f_001_101_001_100_0(uniques, 8);
+  f_001_101_001_100_1(uniques, 8);
+  f_001_101_001_101_0(uniques, 8);
+  f_001_101_001_101_1(uniques, 8);
+  f_001_101_001_110_0(uniques, 8);
+  f_001_101_001_110_1(uniques, 8);
+  f_001_101_001_111_0(uniques, 8);
+  f_001_101_001_111_1(uniques, 8);
+  f_001_101_011_000_0(uniques, 8);
+  f_001_101_011_000_1(uniques, 8);
+  f_001_101_011_001_0(uniques, 8);
+  f_001_101_011_001_1(uniques, 8);
+  f_001_101_011_010_0(uniques, 8);
+  f_001_101_011_010_1(uniques, 8);
+  f_001_101_011_011_0(uniques, 8);
+  f_001_101_011_011_1(uniques, 8);
+  f_001_101_011_100_0(uniques, 8);
+  f_001_101_011_100_1(uniques, 8);
+  f_001_101_011_101_0(uniques, 8);
+  f_001_101_011_101_1(uniques, 8);
+  f_001_101_011_110_0(uniques, 8);
+  f_001_101_011_110_1(uniques, 8);
+  f_001_101_011_111_0(uniques, 8);
+  f_001_101_011_111_1(uniques, 8);
+  f_001_101_101_000_0(uniques, 8);
+  f_001_101_101_000_1(uniques, 8);
+  f_001_101_101_001_0(uniques, 8);
+  f_001_101_101_001_1(uniques, 8);
+  f_001_101_101_010_0(uniques, 8);
+  f_001_101_101_010_1(uniques, 8);
+  f_001_101_101_011_0(uniques, 8);
+  f_001_101_101_011_1(uniques, 8);
+  f_001_101_101_100_0(uniques, 8);
+  f_001_101_101_100_1(uniques, 8);
+  f_001_101_101_101_0(uniques, 8);
+  f_001_101_101_101_1(uniques, 8);
+  f_001_101_101_110_0(uniques, 8);
+  f_001_101_101_110_1(uniques, 8);
+  f_001_101_101_111_0(uniques, 8);
+  f_001_101_101_111_1(uniques, 8);
+  f_001_101_111_000_0(uniques, 8);
+  f_001_101_111_000_1(uniques, 8);
+  f_001_101_111_001_0(uniques, 8);
+  f_001_101_111_001_1(uniques, 8);
+  f_001_101_111_010_0(uniques, 8);
+  f_001_101_111_010_1(uniques, 8);
+  f_001_101_111_011_0(uniques, 8);
+  f_001_101_111_011_1(uniques, 8);
+  f_001_101_111_100_0(uniques, 8);
+  f_001_101_111_100_1(uniques, 8);
+  f_001_101_111_101_0(uniques, 8);
+  f_001_101_111_101_1(uniques, 8);
+  f_001_101_111_110_0(uniques, 8);
+  f_001_101_111_110_1(uniques, 8);
+  f_001_101_111_111_0(uniques, 8);
+  f_001_101_111_111_1(uniques, 8);
+  f_001_110_001_000_0(uniques, 8);
+  f_001_110_001_000_1(uniques, 8);
+  f_001_110_001_001_0(uniques, 8);
+  f_001_110_001_001_1(uniques, 8);
+  f_001_110_001_010_0(uniques, 8);
+  f_001_110_001_010_1(uniques, 8);
+  f_001_110_001_011_0(uniques, 8);
+  f_001_110_001_011_1(uniques, 8);
+  f_001_110_001_100_0(uniques, 8);
+  f_001_110_001_100_1(uniques, 8);
+  f_001_110_001_101_0(uniques, 8);
+  f_001_110_001_101_1(uniques, 8);
+  f_001_110_001_110_0(uniques, 8);
+  f_001_110_001_110_1(uniques, 8);
+  f_001_110_001_111_0(uniques, 8);
+  f_001_110_001_111_1(uniques, 8);
+  f_001_110_011_000_0(uniques, 8);
+  f_001_110_011_000_1(uniques, 8);
+  f_001_110_011_001_0(uniques, 8);
+  f_001_110_011_001_1(uniques, 8);
+  f_001_110_011_010_0(uniques, 8);
+  f_001_110_011_010_1(uniques, 8);
+  f_001_110_011_011_0(uniques, 8);
+  f_001_110_011_011_1(uniques, 8);
+  f_001_110_011_100_0(uniques, 8);
+  f_001_110_011_100_1(uniques, 8);
+  f_001_110_011_101_0(uniques, 8);
+  f_001_110_011_101_1(uniques, 8);
+  f_001_110_011_110_0(uniques, 8);
+  f_001_110_011_110_1(uniques, 8);
+  f_001_110_011_111_0(uniques, 8);
+  f_001_110_011_111_1(uniques, 8);
+  f_001_110_101_000_0(uniques, 8);
+  f_001_110_101_000_1(uniques, 8);
+  f_001_110_101_001_0(uniques, 8);
+  f_001_110_101_001_1(uniques, 8);
+  f_001_110_101_010_0(uniques, 8);
+  f_001_110_101_010_1(uniques, 8);
+  f_001_110_101_011_0(uniques, 8);
+  f_001_110_101_011_1(uniques, 8);
+  f_001_110_101_100_0(uniques, 8);
+  f_001_110_101_100_1(uniques, 8);
+  f_001_110_101_101_0(uniques, 8);
+  f_001_110_101_101_1(uniques, 8);
+  f_001_110_101_110_0(uniques, 8);
+  f_001_110_101_110_1(uniques, 8);
+  f_001_110_101_111_0(uniques, 8);
+  f_001_110_101_111_1(uniques, 8);
+  f_001_110_111_000_0(uniques, 8);
+  f_001_110_111_000_1(uniques, 8);
+  f_001_110_111_001_0(uniques, 8);
+  f_001_110_111_001_1(uniques, 8);
+  f_001_110_111_010_0(uniques, 8);
+  f_001_110_111_010_1(uniques, 8);
+  f_001_110_111_011_0(uniques, 8);
+  f_001_110_111_011_1(uniques, 8);
+  f_001_110_111_100_0(uniques, 8);
+  f_001_110_111_100_1(uniques, 8);
+  f_001_110_111_101_0(uniques, 8);
+  f_001_110_111_101_1(uniques, 8);
+  f_001_110_111_110_0(uniques, 8);
+  f_001_110_111_110_1(uniques, 8);
+  f_001_110_111_111_0(uniques, 8);
+  f_001_110_111_111_1(uniques, 8);
+  f_001_111_001_000_0(uniques, 8);
+  f_001_111_001_000_1(uniques, 8);
+  f_001_111_001_001_0(uniques, 8);
+  f_001_111_001_001_1(uniques, 8);
+  f_001_111_001_010_0(uniques, 8);
+  f_001_111_001_010_1(uniques, 8);
+  f_001_111_001_011_0(uniques, 8);
+  f_001_111_001_011_1(uniques, 8);
+  f_001_111_001_100_0(uniques, 8);
+  f_001_111_001_100_1(uniques, 8);
+  f_001_111_001_101_0(uniques, 8);
+  f_001_111_001_101_1(uniques, 8);
+  f_001_111_001_110_0(uniques, 8);
+  f_001_111_001_110_1(uniques, 8);
+  f_001_111_001_111_0(uniques, 8);
+  f_001_111_001_111_1(uniques, 8);
+  f_001_111_011_000_0(uniques, 8);
+  f_001_111_011_000_1(uniques, 8);
+  f_001_111_011_001_0(uniques, 8);
+  f_001_111_011_001_1(uniques, 8);
+  f_001_111_011_010_0(uniques, 8);
+  f_001_111_011_010_1(uniques, 8);
+  f_001_111_011_011_0(uniques, 8);
+  f_001_111_011_011_1(uniques, 8);
+  f_001_111_011_100_0(uniques, 8);
+  f_001_111_011_100_1(uniques, 8);
+  f_001_111_011_101_0(uniques, 8);
+  f_001_111_011_101_1(uniques, 8);
+  f_001_111_011_110_0(uniques, 8);
+  f_001_111_011_110_1(uniques, 8);
+  f_001_111_011_111_0(uniques, 8);
+  f_001_111_011_111_1(uniques, 8);
+  f_001_111_101_000_0(uniques, 8);
+  f_001_111_101_000_1(uniques, 8);
+  f_001_111_101_001_0(uniques, 8);
+  f_001_111_101_001_1(uniques, 8);
+  f_001_111_101_010_0(uniques, 8);
+  f_001_111_101_010_1(uniques, 8);
+  f_001_111_101_011_0(uniques, 8);
+  f_001_111_101_011_1(uniques, 8);
+  f_001_111_101_100_0(uniques, 8);
+  f_001_111_101_100_1(uniques, 8);
+  f_001_111_101_101_0(uniques, 8);
+  f_001_111_101_101_1(uniques, 8);
+  f_001_111_101_110_0(uniques, 8);
+  f_001_111_101_110_1(uniques, 8);
+  f_001_111_101_111_0(uniques, 8);
+  f_001_111_101_111_1(uniques, 8);
+  f_001_111_111_000_0(uniques, 8);
+  f_001_111_111_000_1(uniques, 8);
+  f_001_111_111_001_0(uniques, 8);
+  f_001_111_111_001_1(uniques, 8);
+  f_001_111_111_010_0(uniques, 8);
+  f_001_111_111_010_1(uniques, 8);
+  f_001_111_111_011_0(uniques, 8);
+  f_001_111_111_011_1(uniques, 8);
+  f_001_111_111_100_0(uniques, 8);
+  f_001_111_111_100_1(uniques, 8);
+  f_001_111_111_101_0(uniques, 8);
+  f_001_111_111_101_1(uniques, 8);
+  f_001_111_111_110_0(uniques, 8);
+  f_001_111_111_110_1(uniques, 8);
+  f_001_111_111_111_0(uniques, 8);
+  f_001_111_111_111_1(uniques, 8);
+  f_010_000_001_000_0(uniques, 8);
+  f_010_000_001_000_1(uniques, 8);
+  f_010_000_001_001_0(uniques, 8);
+  f_010_000_001_001_1(uniques, 8);
+  f_010_000_001_010_0(uniques, 8);
+  f_010_000_001_010_1(uniques, 8);
+  f_010_000_001_011_0(uniques, 8);
+  f_010_000_001_011_1(uniques, 8);
+  f_010_000_001_100_0(uniques, 8);
+  f_010_000_001_100_1(uniques, 8);
+  f_010_000_001_101_0(uniques, 8);
+  f_010_000_001_101_1(uniques, 8);
+  f_010_000_001_110_0(uniques, 8);
+  f_010_000_001_110_1(uniques, 8);
+  f_010_000_001_111_0(uniques, 8);
+  f_010_000_001_111_1(uniques, 8);
+  f_010_000_011_000_0(uniques, 8);
+  f_010_000_011_000_1(uniques, 8);
+  f_010_000_011_001_0(uniques, 8);
+  f_010_000_011_001_1(uniques, 8);
+  f_010_000_011_010_0(uniques, 8);
+  f_010_000_011_010_1(uniques, 8);
+  f_010_000_011_011_0(uniques, 8);
+  f_010_000_011_011_1(uniques, 8);
+  f_010_000_011_100_0(uniques, 8);
+  f_010_000_011_100_1(uniques, 8);
+  f_010_000_011_101_0(uniques, 8);
+  f_010_000_011_101_1(uniques, 8);
+  f_010_000_011_110_0(uniques, 8);
+  f_010_000_011_110_1(uniques, 8);
+  f_010_000_011_111_0(uniques, 8);
+  f_010_000_011_111_1(uniques, 8);
+  f_010_000_101_000_0(uniques, 8);
+  f_010_000_101_000_1(uniques, 8);
+  f_010_000_101_001_0(uniques, 8);
+  f_010_000_101_001_1(uniques, 8);
+  f_010_000_101_010_0(uniques, 8);
+  f_010_000_101_010_1(uniques, 8);
+  f_010_000_101_011_0(uniques, 8);
+  f_010_000_101_011_1(uniques, 8);
+  f_010_000_101_100_0(uniques, 8);
+  f_010_000_101_100_1(uniques, 8);
+  f_010_000_101_101_0(uniques, 8);
+  f_010_000_101_101_1(uniques, 8);
+  f_010_000_101_110_0(uniques, 8);
+  f_010_000_101_110_1(uniques, 8);
+  f_010_000_101_111_0(uniques, 8);
+  f_010_000_101_111_1(uniques, 8);
+  f_010_000_111_000_0(uniques, 8);
+  f_010_000_111_000_1(uniques, 8);
+  f_010_000_111_001_0(uniques, 8);
+  f_010_000_111_001_1(uniques, 8);
+  f_010_000_111_010_0(uniques, 8);
+  f_010_000_111_010_1(uniques, 8);
+  f_010_000_111_011_0(uniques, 8);
+  f_010_000_111_011_1(uniques, 8);
+  f_010_000_111_100_0(uniques, 8);
+  f_010_000_111_100_1(uniques, 8);
+  f_010_000_111_101_0(uniques, 8);
+  f_010_000_111_101_1(uniques, 8);
+  f_010_000_111_110_0(uniques, 8);
+  f_010_000_111_110_1(uniques, 8);
+  f_010_000_111_111_0(uniques, 8);
+  f_010_000_111_111_1(uniques, 8);
+  f_010_001_001_000_0(uniques, 8);
+  f_010_001_001_000_1(uniques, 8);
+  f_010_001_001_001_0(uniques, 8);
+  f_010_001_001_001_1(uniques, 8);
+  f_010_001_001_010_0(uniques, 8);
+  f_010_001_001_010_1(uniques, 8);
+  f_010_001_001_011_0(uniques, 8);
+  f_010_001_001_011_1(uniques, 8);
+  f_010_001_001_100_0(uniques, 8);
+  f_010_001_001_100_1(uniques, 8);
+  f_010_001_001_101_0(uniques, 8);
+  f_010_001_001_101_1(uniques, 8);
+  f_010_001_001_110_0(uniques, 8);
+  f_010_001_001_110_1(uniques, 8);
+  f_010_001_001_111_0(uniques, 8);
+  f_010_001_001_111_1(uniques, 8);
+  f_010_001_011_000_0(uniques, 8);
+  f_010_001_011_000_1(uniques, 8);
+  f_010_001_011_001_0(uniques, 8);
+  f_010_001_011_001_1(uniques, 8);
+  f_010_001_011_010_0(uniques, 8);
+  f_010_001_011_010_1(uniques, 8);
+  f_010_001_011_011_0(uniques, 8);
+  f_010_001_011_011_1(uniques, 8);
+  f_010_001_011_100_0(uniques, 8);
+  f_010_001_011_100_1(uniques, 8);
+  f_010_001_011_101_0(uniques, 8);
+  f_010_001_011_101_1(uniques, 8);
+  f_010_001_011_110_0(uniques, 8);
+  f_010_001_011_110_1(uniques, 8);
+  f_010_001_011_111_0(uniques, 8);
+  f_010_001_011_111_1(uniques, 8);
+  f_010_001_101_000_0(uniques, 8);
+  f_010_001_101_000_1(uniques, 8);
+  f_010_001_101_001_0(uniques, 8);
+  f_010_001_101_001_1(uniques, 8);
+  f_010_001_101_010_0(uniques, 8);
+  f_010_001_101_010_1(uniques, 8);
+  f_010_001_101_011_0(uniques, 8);
+  f_010_001_101_011_1(uniques, 8);
+  f_010_001_101_100_0(uniques, 8);
+  f_010_001_101_100_1(uniques, 8);
+  f_010_001_101_101_0(uniques, 8);
+  f_010_001_101_101_1(uniques, 8);
+  f_010_001_101_110_0(uniques, 8);
+  f_010_001_101_110_1(uniques, 8);
+  f_010_001_101_111_0(uniques, 8);
+  f_010_001_101_111_1(uniques, 8);
+  f_010_001_111_000_0(uniques, 8);
+  f_010_001_111_000_1(uniques, 8);
+  f_010_001_111_001_0(uniques, 8);
+  f_010_001_111_001_1(uniques, 8);
+  f_010_001_111_010_0(uniques, 8);
+  f_010_001_111_010_1(uniques, 8);
+  f_010_001_111_011_0(uniques, 8);
+  f_010_001_111_011_1(uniques, 8);
+  f_010_001_111_100_0(uniques, 8);
+  f_010_001_111_100_1(uniques, 8);
+  f_010_001_111_101_0(uniques, 8);
+  f_010_001_111_101_1(uniques, 8);
+  f_010_001_111_110_0(uniques, 8);
+  f_010_001_111_110_1(uniques, 8);
+  f_010_001_111_111_0(uniques, 8);
+  f_010_001_111_111_1(uniques, 8);
+  f_010_010_001_000_0(uniques, 8);
+  f_010_010_001_000_1(uniques, 8);
+  f_010_010_001_001_0(uniques, 8);
+  f_010_010_001_001_1(uniques, 8);
+  f_010_010_001_010_0(uniques, 8);
+  f_010_010_001_010_1(uniques, 8);
+  f_010_010_001_011_0(uniques, 8);
+  f_010_010_001_011_1(uniques, 8);
+  f_010_010_001_100_0(uniques, 8);
+  f_010_010_001_100_1(uniques, 8);
+  f_010_010_001_101_0(uniques, 8);
+  f_010_010_001_101_1(uniques, 8);
+  f_010_010_001_110_0(uniques, 8);
+  f_010_010_001_110_1(uniques, 8);
+  f_010_010_001_111_0(uniques, 8);
+  f_010_010_001_111_1(uniques, 8);
+  f_010_010_011_000_0(uniques, 8);
+  f_010_010_011_000_1(uniques, 8);
+  f_010_010_011_001_0(uniques, 8);
+  f_010_010_011_001_1(uniques, 8);
+  f_010_010_011_010_0(uniques, 8);
+  f_010_010_011_010_1(uniques, 8);
+  f_010_010_011_011_0(uniques, 8);
+  f_010_010_011_011_1(uniques, 8);
+  f_010_010_011_100_0(uniques, 8);
+  f_010_010_011_100_1(uniques, 8);
+  f_010_010_011_101_0(uniques, 8);
+  f_010_010_011_101_1(uniques, 8);
+  f_010_010_011_110_0(uniques, 8);
+  f_010_010_011_110_1(uniques, 8);
+  f_010_010_011_111_0(uniques, 8);
+  f_010_010_011_111_1(uniques, 8);
+  f_010_010_101_000_0(uniques, 8);
+  f_010_010_101_000_1(uniques, 8);
+  f_010_010_101_001_0(uniques, 8);
+  f_010_010_101_001_1(uniques, 8);
+  f_010_010_101_010_0(uniques, 8);
+  f_010_010_101_010_1(uniques, 8);
+  f_010_010_101_011_0(uniques, 8);
+  f_010_010_101_011_1(uniques, 8);
+  f_010_010_101_100_0(uniques, 8);
+  f_010_010_101_100_1(uniques, 8);
+  f_010_010_101_101_0(uniques, 8);
+  f_010_010_101_101_1(uniques, 8);
+  f_010_010_101_110_0(uniques, 8);
+  f_010_010_101_110_1(uniques, 8);
+  f_010_010_101_111_0(uniques, 8);
+  f_010_010_101_111_1(uniques, 8);
+  f_010_010_111_000_0(uniques, 8);
+  f_010_010_111_000_1(uniques, 8);
+  f_010_010_111_001_0(uniques, 8);
+  f_010_010_111_001_1(uniques, 8);
+  f_010_010_111_010_0(uniques, 8);
+  f_010_010_111_010_1(uniques, 8);
+  f_010_010_111_011_0(uniques, 8);
+  f_010_010_111_011_1(uniques, 8);
+  f_010_010_111_100_0(uniques, 8);
+  f_010_010_111_100_1(uniques, 8);
+  f_010_010_111_101_0(uniques, 8);
+  f_010_010_111_101_1(uniques, 8);
+  f_010_010_111_110_0(uniques, 8);
+  f_010_010_111_110_1(uniques, 8);
+  f_010_010_111_111_0(uniques, 8);
+  f_010_010_111_111_1(uniques, 8);
+  f_010_011_001_000_0(uniques, 8);
+  f_010_011_001_000_1(uniques, 8);
+  f_010_011_001_001_0(uniques, 8);
+  f_010_011_001_001_1(uniques, 8);
+  f_010_011_001_010_0(uniques, 8);
+  f_010_011_001_010_1(uniques, 8);
+  f_010_011_001_011_0(uniques, 8);
+  f_010_011_001_011_1(uniques, 8);
+  f_010_011_001_100_0(uniques, 8);
+  f_010_011_001_100_1(uniques, 8);
+  f_010_011_001_101_0(uniques, 8);
+  f_010_011_001_101_1(uniques, 8);
+  f_010_011_001_110_0(uniques, 8);
+  f_010_011_001_110_1(uniques, 8);
+  f_010_011_001_111_0(uniques, 8);
+  f_010_011_001_111_1(uniques, 8);
+  f_010_011_011_000_0(uniques, 8);
+  f_010_011_011_000_1(uniques, 8);
+  f_010_011_011_001_0(uniques, 8);
+  f_010_011_011_001_1(uniques, 8);
+  f_010_011_011_010_0(uniques, 8);
+  f_010_011_011_010_1(uniques, 8);
+  f_010_011_011_011_0(uniques, 8);
+  f_010_011_011_011_1(uniques, 8);
+  f_010_011_011_100_0(uniques, 8);
+  f_010_011_011_100_1(uniques, 8);
+  f_010_011_011_101_0(uniques, 8);
+  f_010_011_011_101_1(uniques, 8);
+  f_010_011_011_110_0(uniques, 8);
+  f_010_011_011_110_1(uniques, 8);
+  f_010_011_011_111_0(uniques, 8);
+  f_010_011_011_111_1(uniques, 8);
+  f_010_011_101_000_0(uniques, 8);
+  f_010_011_101_000_1(uniques, 8);
+  f_010_011_101_001_0(uniques, 8);
+  f_010_011_101_001_1(uniques, 8);
+  f_010_011_101_010_0(uniques, 8);
+  f_010_011_101_010_1(uniques, 8);
+  f_010_011_101_011_0(uniques, 8);
+  f_010_011_101_011_1(uniques, 8);
+  f_010_011_101_100_0(uniques, 8);
+  f_010_011_101_100_1(uniques, 8);
+  f_010_011_101_101_0(uniques, 8);
+  f_010_011_101_101_1(uniques, 8);
+  f_010_011_101_110_0(uniques, 8);
+  f_010_011_101_110_1(uniques, 8);
+  f_010_011_101_111_0(uniques, 8);
+  f_010_011_101_111_1(uniques, 8);
+  f_010_011_111_000_0(uniques, 8);
+  f_010_011_111_000_1(uniques, 8);
+  f_010_011_111_001_0(uniques, 8);
+  f_010_011_111_001_1(uniques, 8);
+  f_010_011_111_010_0(uniques, 8);
+  f_010_011_111_010_1(uniques, 8);
+  f_010_011_111_011_0(uniques, 8);
+  f_010_011_111_011_1(uniques, 8);
+  f_010_011_111_100_0(uniques, 8);
+  f_010_011_111_100_1(uniques, 8);
+  f_010_011_111_101_0(uniques, 8);
+  f_010_011_111_101_1(uniques, 8);
+  f_010_011_111_110_0(uniques, 8);
+  f_010_011_111_110_1(uniques, 8);
+  f_010_011_111_111_0(uniques, 8);
+  f_010_011_111_111_1(uniques, 8);
+  f_010_100_001_000_0(uniques, 8);
+  f_010_100_001_000_1(uniques, 8);
+  f_010_100_001_001_0(uniques, 8);
+  f_010_100_001_001_1(uniques, 8);
+  f_010_100_001_010_0(uniques, 8);
+  f_010_100_001_010_1(uniques, 8);
+  f_010_100_001_011_0(uniques, 8);
+  f_010_100_001_011_1(uniques, 8);
+  f_010_100_001_100_0(uniques, 8);
+  f_010_100_001_100_1(uniques, 8);
+  f_010_100_001_101_0(uniques, 8);
+  f_010_100_001_101_1(uniques, 8);
+  f_010_100_001_110_0(uniques, 8);
+  f_010_100_001_110_1(uniques, 8);
+  f_010_100_001_111_0(uniques, 8);
+  f_010_100_001_111_1(uniques, 8);
+  f_010_100_011_000_0(uniques, 8);
+  f_010_100_011_000_1(uniques, 8);
+  f_010_100_011_001_0(uniques, 8);
+  f_010_100_011_001_1(uniques, 8);
+  f_010_100_011_010_0(uniques, 8);
+  f_010_100_011_010_1(uniques, 8);
+  f_010_100_011_011_0(uniques, 8);
+  f_010_100_011_011_1(uniques, 8);
+  f_010_100_011_100_0(uniques, 8);
+  f_010_100_011_100_1(uniques, 8);
+  f_010_100_011_101_0(uniques, 8);
+  f_010_100_011_101_1(uniques, 8);
+  f_010_100_011_110_0(uniques, 8);
+  f_010_100_011_110_1(uniques, 8);
+  f_010_100_011_111_0(uniques, 8);
+  f_010_100_011_111_1(uniques, 8);
+  f_010_100_101_000_0(uniques, 8);
+  f_010_100_101_000_1(uniques, 8);
+  f_010_100_101_001_0(uniques, 8);
+  f_010_100_101_001_1(uniques, 8);
+  f_010_100_101_010_0(uniques, 8);
+  f_010_100_101_010_1(uniques, 8);
+  f_010_100_101_011_0(uniques, 8);
+  f_010_100_101_011_1(uniques, 8);
+  f_010_100_101_100_0(uniques, 8);
+  f_010_100_101_100_1(uniques, 8);
+  f_010_100_101_101_0(uniques, 8);
+  f_010_100_101_101_1(uniques, 8);
+  f_010_100_101_110_0(uniques, 8);
+  f_010_100_101_110_1(uniques, 8);
+  f_010_100_101_111_0(uniques, 8);
+  f_010_100_101_111_1(uniques, 8);
+  f_010_100_111_000_0(uniques, 8);
+  f_010_100_111_000_1(uniques, 8);
+  f_010_100_111_001_0(uniques, 8);
+  f_010_100_111_001_1(uniques, 8);
+  f_010_100_111_010_0(uniques, 8);
+  f_010_100_111_010_1(uniques, 8);
+  f_010_100_111_011_0(uniques, 8);
+  f_010_100_111_011_1(uniques, 8);
+  f_010_100_111_100_0(uniques, 8);
+  f_010_100_111_100_1(uniques, 8);
+  f_010_100_111_101_0(uniques, 8);
+  f_010_100_111_101_1(uniques, 8);
+  f_010_100_111_110_0(uniques, 8);
+  f_010_100_111_110_1(uniques, 8);
+  f_010_100_111_111_0(uniques, 8);
+  f_010_100_111_111_1(uniques, 8);
+  f_010_101_001_000_0(uniques, 8);
+  f_010_101_001_000_1(uniques, 8);
+  f_010_101_001_001_0(uniques, 8);
+  f_010_101_001_001_1(uniques, 8);
+  f_010_101_001_010_0(uniques, 8);
+  f_010_101_001_010_1(uniques, 8);
+  f_010_101_001_011_0(uniques, 8);
+  f_010_101_001_011_1(uniques, 8);
+  f_010_101_001_100_0(uniques, 8);
+  f_010_101_001_100_1(uniques, 8);
+  f_010_101_001_101_0(uniques, 8);
+  f_010_101_001_101_1(uniques, 8);
+  f_010_101_001_110_0(uniques, 8);
+  f_010_101_001_110_1(uniques, 8);
+  f_010_101_001_111_0(uniques, 8);
+  f_010_101_001_111_1(uniques, 8);
+  f_010_101_011_000_0(uniques, 8);
+  f_010_101_011_000_1(uniques, 8);
+  f_010_101_011_001_0(uniques, 8);
+  f_010_101_011_001_1(uniques, 8);
+  f_010_101_011_010_0(uniques, 8);
+  f_010_101_011_010_1(uniques, 8);
+  f_010_101_011_011_0(uniques, 8);
+  f_010_101_011_011_1(uniques, 8);
+  f_010_101_011_100_0(uniques, 8);
+  f_010_101_011_100_1(uniques, 8);
+  f_010_101_011_101_0(uniques, 8);
+  f_010_101_011_101_1(uniques, 8);
+  f_010_101_011_110_0(uniques, 8);
+  f_010_101_011_110_1(uniques, 8);
+  f_010_101_011_111_0(uniques, 8);
+  f_010_101_011_111_1(uniques, 8);
+  f_010_101_101_000_0(uniques, 8);
+  f_010_101_101_000_1(uniques, 8);
+  f_010_101_101_001_0(uniques, 8);
+  f_010_101_101_001_1(uniques, 8);
+  f_010_101_101_010_0(uniques, 8);
+  f_010_101_101_010_1(uniques, 8);
+  f_010_101_101_011_0(uniques, 8);
+  f_010_101_101_011_1(uniques, 8);
+  f_010_101_101_100_0(uniques, 8);
+  f_010_101_101_100_1(uniques, 8);
+  f_010_101_101_101_0(uniques, 8);
+  f_010_101_101_101_1(uniques, 8);
+  f_010_101_101_110_0(uniques, 8);
+  f_010_101_101_110_1(uniques, 8);
+  f_010_101_101_111_0(uniques, 8);
+  f_010_101_101_111_1(uniques, 8);
+  f_010_101_111_000_0(uniques, 8);
+  f_010_101_111_000_1(uniques, 8);
+  f_010_101_111_001_0(uniques, 8);
+  f_010_101_111_001_1(uniques, 8);
+  f_010_101_111_010_0(uniques, 8);
+  f_010_101_111_010_1(uniques, 8);
+  f_010_101_111_011_0(uniques, 8);
+  f_010_101_111_011_1(uniques, 8);
+  f_010_101_111_100_0(uniques, 8);
+  f_010_101_111_100_1(uniques, 8);
+  f_010_101_111_101_0(uniques, 8);
+  f_010_101_111_101_1(uniques, 8);
+  f_010_101_111_110_0(uniques, 8);
+  f_010_101_111_110_1(uniques, 8);
+  f_010_101_111_111_0(uniques, 8);
+  f_010_101_111_111_1(uniques, 8);
+  f_010_110_001_000_0(uniques, 8);
+  f_010_110_001_000_1(uniques, 8);
+  f_010_110_001_001_0(uniques, 8);
+  f_010_110_001_001_1(uniques, 8);
+  f_010_110_001_010_0(uniques, 8);
+  f_010_110_001_010_1(uniques, 8);
+  f_010_110_001_011_0(uniques, 8);
+  f_010_110_001_011_1(uniques, 8);
+  f_010_110_001_100_0(uniques, 8);
+  f_010_110_001_100_1(uniques, 8);
+  f_010_110_001_101_0(uniques, 8);
+  f_010_110_001_101_1(uniques, 8);
+  f_010_110_001_110_0(uniques, 8);
+  f_010_110_001_110_1(uniques, 8);
+  f_010_110_001_111_0(uniques, 8);
+  f_010_110_001_111_1(uniques, 8);
+  f_010_110_011_000_0(uniques, 8);
+  f_010_110_011_000_1(uniques, 8);
+  f_010_110_011_001_0(uniques, 8);
+  f_010_110_011_001_1(uniques, 8);
+  f_010_110_011_010_0(uniques, 8);
+  f_010_110_011_010_1(uniques, 8);
+  f_010_110_011_011_0(uniques, 8);
+  f_010_110_011_011_1(uniques, 8);
+  f_010_110_011_100_0(uniques, 8);
+  f_010_110_011_100_1(uniques, 8);
+  f_010_110_011_101_0(uniques, 8);
+  f_010_110_011_101_1(uniques, 8);
+  f_010_110_011_110_0(uniques, 8);
+  f_010_110_011_110_1(uniques, 8);
+  f_010_110_011_111_0(uniques, 8);
+  f_010_110_011_111_1(uniques, 8);
+  f_010_110_101_000_0(uniques, 8);
+  f_010_110_101_000_1(uniques, 8);
+  f_010_110_101_001_0(uniques, 8);
+  f_010_110_101_001_1(uniques, 8);
+  f_010_110_101_010_0(uniques, 8);
+  f_010_110_101_010_1(uniques, 8);
+  f_010_110_101_011_0(uniques, 8);
+  f_010_110_101_011_1(uniques, 8);
+  f_010_110_101_100_0(uniques, 8);
+  f_010_110_101_100_1(uniques, 8);
+  f_010_110_101_101_0(uniques, 8);
+  f_010_110_101_101_1(uniques, 8);
+  f_010_110_101_110_0(uniques, 8);
+  f_010_110_101_110_1(uniques, 8);
+  f_010_110_101_111_0(uniques, 8);
+  f_010_110_101_111_1(uniques, 8);
+  f_010_110_111_000_0(uniques, 8);
+  f_010_110_111_000_1(uniques, 8);
+  f_010_110_111_001_0(uniques, 8);
+  f_010_110_111_001_1(uniques, 8);
+  f_010_110_111_010_0(uniques, 8);
+  f_010_110_111_010_1(uniques, 8);
+  f_010_110_111_011_0(uniques, 8);
+  f_010_110_111_011_1(uniques, 8);
+  f_010_110_111_100_0(uniques, 8);
+  f_010_110_111_100_1(uniques, 8);
+  f_010_110_111_101_0(uniques, 8);
+  f_010_110_111_101_1(uniques, 8);
+  f_010_110_111_110_0(uniques, 8);
+  f_010_110_111_110_1(uniques, 8);
+  f_010_110_111_111_0(uniques, 8);
+  f_010_110_111_111_1(uniques, 8);
+  f_010_111_001_000_0(uniques, 8);
+  f_010_111_001_000_1(uniques, 8);
+  f_010_111_001_001_0(uniques, 8);
+  f_010_111_001_001_1(uniques, 8);
+  f_010_111_001_010_0(uniques, 8);
+  f_010_111_001_010_1(uniques, 8);
+  f_010_111_001_011_0(uniques, 8);
+  f_010_111_001_011_1(uniques, 8);
+  f_010_111_001_100_0(uniques, 8);
+  f_010_111_001_100_1(uniques, 8);
+  f_010_111_001_101_0(uniques, 8);
+  f_010_111_001_101_1(uniques, 8);
+  f_010_111_001_110_0(uniques, 8);
+  f_010_111_001_110_1(uniques, 8);
+  f_010_111_001_111_0(uniques, 8);
+  f_010_111_001_111_1(uniques, 8);
+  f_010_111_011_000_0(uniques, 8);
+  f_010_111_011_000_1(uniques, 8);
+  f_010_111_011_001_0(uniques, 8);
+  f_010_111_011_001_1(uniques, 8);
+  f_010_111_011_010_0(uniques, 8);
+  f_010_111_011_010_1(uniques, 8);
+  f_010_111_011_011_0(uniques, 8);
+  f_010_111_011_011_1(uniques, 8);
+  f_010_111_011_100_0(uniques, 8);
+  f_010_111_011_100_1(uniques, 8);
+  f_010_111_011_101_0(uniques, 8);
+  f_010_111_011_101_1(uniques, 8);
+  f_010_111_011_110_0(uniques, 8);
+  f_010_111_011_110_1(uniques, 8);
+  f_010_111_011_111_0(uniques, 8);
+  f_010_111_011_111_1(uniques, 8);
+  f_010_111_101_000_0(uniques, 8);
+  f_010_111_101_000_1(uniques, 8);
+  f_010_111_101_001_0(uniques, 8);
+  f_010_111_101_001_1(uniques, 8);
+  f_010_111_101_010_0(uniques, 8);
+  f_010_111_101_010_1(uniques, 8);
+  f_010_111_101_011_0(uniques, 8);
+  f_010_111_101_011_1(uniques, 8);
+  f_010_111_101_100_0(uniques, 8);
+  f_010_111_101_100_1(uniques, 8);
+  f_010_111_101_101_0(uniques, 8);
+  f_010_111_101_101_1(uniques, 8);
+  f_010_111_101_110_0(uniques, 8);
+  f_010_111_101_110_1(uniques, 8);
+  f_010_111_101_111_0(uniques, 8);
+  f_010_111_101_111_1(uniques, 8);
+  f_010_111_111_000_0(uniques, 8);
+  f_010_111_111_000_1(uniques, 8);
+  f_010_111_111_001_0(uniques, 8);
+  f_010_111_111_001_1(uniques, 8);
+  f_010_111_111_010_0(uniques, 8);
+  f_010_111_111_010_1(uniques, 8);
+  f_010_111_111_011_0(uniques, 8);
+  f_010_111_111_011_1(uniques, 8);
+  f_010_111_111_100_0(uniques, 8);
+  f_010_111_111_100_1(uniques, 8);
+  f_010_111_111_101_0(uniques, 8);
+  f_010_111_111_101_1(uniques, 8);
+  f_010_111_111_110_0(uniques, 8);
+  f_010_111_111_110_1(uniques, 8);
+  f_010_111_111_111_0(uniques, 8);
+  f_010_111_111_111_1(uniques, 8);
+  f_011_000_001_000_0(uniques, 8);
+  f_011_000_001_000_1(uniques, 8);
+  f_011_000_001_001_0(uniques, 8);
+  f_011_000_001_001_1(uniques, 8);
+  f_011_000_001_010_0(uniques, 8);
+  f_011_000_001_010_1(uniques, 8);
+  f_011_000_001_011_0(uniques, 8);
+  f_011_000_001_011_1(uniques, 8);
+  f_011_000_001_100_0(uniques, 8);
+  f_011_000_001_100_1(uniques, 8);
+  f_011_000_001_101_0(uniques, 8);
+  f_011_000_001_101_1(uniques, 8);
+  f_011_000_001_110_0(uniques, 8);
+  f_011_000_001_110_1(uniques, 8);
+  f_011_000_001_111_0(uniques, 8);
+  f_011_000_001_111_1(uniques, 8);
+  f_011_000_011_000_0(uniques, 8);
+  f_011_000_011_000_1(uniques, 8);
+  f_011_000_011_001_0(uniques, 8);
+  f_011_000_011_001_1(uniques, 8);
+  f_011_000_011_010_0(uniques, 8);
+  f_011_000_011_010_1(uniques, 8);
+  f_011_000_011_011_0(uniques, 8);
+  f_011_000_011_011_1(uniques, 8);
+  f_011_000_011_100_0(uniques, 8);
+  f_011_000_011_100_1(uniques, 8);
+  f_011_000_011_101_0(uniques, 8);
+  f_011_000_011_101_1(uniques, 8);
+  f_011_000_011_110_0(uniques, 8);
+  f_011_000_011_110_1(uniques, 8);
+  f_011_000_011_111_0(uniques, 8);
+  f_011_000_011_111_1(uniques, 8);
+  f_011_000_101_000_0(uniques, 8);
+  f_011_000_101_000_1(uniques, 8);
+  f_011_000_101_001_0(uniques, 8);
+  f_011_000_101_001_1(uniques, 8);
+  f_011_000_101_010_0(uniques, 8);
+  f_011_000_101_010_1(uniques, 8);
+  f_011_000_101_011_0(uniques, 8);
+  f_011_000_101_011_1(uniques, 8);
+  f_011_000_101_100_0(uniques, 8);
+  f_011_000_101_100_1(uniques, 8);
+  f_011_000_101_101_0(uniques, 8);
+  f_011_000_101_101_1(uniques, 8);
+  f_011_000_101_110_0(uniques, 8);
+  f_011_000_101_110_1(uniques, 8);
+  f_011_000_101_111_0(uniques, 8);
+  f_011_000_101_111_1(uniques, 8);
+  f_011_000_111_000_0(uniques, 8);
+  f_011_000_111_000_1(uniques, 8);
+  f_011_000_111_001_0(uniques, 8);
+  f_011_000_111_001_1(uniques, 8);
+  f_011_000_111_010_0(uniques, 8);
+  f_011_000_111_010_1(uniques, 8);
+  f_011_000_111_011_0(uniques, 8);
+  f_011_000_111_011_1(uniques, 8);
+  f_011_000_111_100_0(uniques, 8);
+  f_011_000_111_100_1(uniques, 8);
+  f_011_000_111_101_0(uniques, 8);
+  f_011_000_111_101_1(uniques, 8);
+  f_011_000_111_110_0(uniques, 8);
+  f_011_000_111_110_1(uniques, 8);
+  f_011_000_111_111_0(uniques, 8);
+  f_011_000_111_111_1(uniques, 8);
+  f_011_001_001_000_0(uniques, 8);
+  f_011_001_001_000_1(uniques, 8);
+  f_011_001_001_001_0(uniques, 8);
+  f_011_001_001_001_1(uniques, 8);
+  f_011_001_001_010_0(uniques, 8);
+  f_011_001_001_010_1(uniques, 8);
+  f_011_001_001_011_0(uniques, 8);
+  f_011_001_001_011_1(uniques, 8);
+  f_011_001_001_100_0(uniques, 8);
+  f_011_001_001_100_1(uniques, 8);
+  f_011_001_001_101_0(uniques, 8);
+  f_011_001_001_101_1(uniques, 8);
+  f_011_001_001_110_0(uniques, 8);
+  f_011_001_001_110_1(uniques, 8);
+  f_011_001_001_111_0(uniques, 8);
+  f_011_001_001_111_1(uniques, 8);
+  f_011_001_011_000_0(uniques, 8);
+  f_011_001_011_000_1(uniques, 8);
+  f_011_001_011_001_0(uniques, 8);
+  f_011_001_011_001_1(uniques, 8);
+  f_011_001_011_010_0(uniques, 8);
+  f_011_001_011_010_1(uniques, 8);
+  f_011_001_011_011_0(uniques, 8);
+  f_011_001_011_011_1(uniques, 8);
+  f_011_001_011_100_0(uniques, 8);
+  f_011_001_011_100_1(uniques, 8);
+  f_011_001_011_101_0(uniques, 8);
+  f_011_001_011_101_1(uniques, 8);
+  f_011_001_011_110_0(uniques, 8);
+  f_011_001_011_110_1(uniques, 8);
+  f_011_001_011_111_0(uniques, 8);
+  f_011_001_011_111_1(uniques, 8);
+  f_011_001_101_000_0(uniques, 8);
+  f_011_001_101_000_1(uniques, 8);
+  f_011_001_101_001_0(uniques, 8);
+  f_011_001_101_001_1(uniques, 8);
+  f_011_001_101_010_0(uniques, 8);
+  f_011_001_101_010_1(uniques, 8);
+  f_011_001_101_011_0(uniques, 8);
+  f_011_001_101_011_1(uniques, 8);
+  f_011_001_101_100_0(uniques, 8);
+  f_011_001_101_100_1(uniques, 8);
+  f_011_001_101_101_0(uniques, 8);
+  f_011_001_101_101_1(uniques, 8);
+  f_011_001_101_110_0(uniques, 8);
+  f_011_001_101_110_1(uniques, 8);
+  f_011_001_101_111_0(uniques, 8);
+  f_011_001_101_111_1(uniques, 8);
+  f_011_001_111_000_0(uniques, 8);
+  f_011_001_111_000_1(uniques, 8);
+  f_011_001_111_001_0(uniques, 8);
+  f_011_001_111_001_1(uniques, 8);
+  f_011_001_111_010_0(uniques, 8);
+  f_011_001_111_010_1(uniques, 8);
+  f_011_001_111_011_0(uniques, 8);
+  f_011_001_111_011_1(uniques, 8);
+  f_011_001_111_100_0(uniques, 8);
+  f_011_001_111_100_1(uniques, 8);
+  f_011_001_111_101_0(uniques, 8);
+  f_011_001_111_101_1(uniques, 8);
+  f_011_001_111_110_0(uniques, 8);
+  f_011_001_111_110_1(uniques, 8);
+  f_011_001_111_111_0(uniques, 8);
+  f_011_001_111_111_1(uniques, 8);
+  f_011_010_001_000_0(uniques, 8);
+  f_011_010_001_000_1(uniques, 8);
+  f_011_010_001_001_0(uniques, 8);
+  f_011_010_001_001_1(uniques, 8);
+  f_011_010_001_010_0(uniques, 8);
+  f_011_010_001_010_1(uniques, 8);
+  f_011_010_001_011_0(uniques, 8);
+  f_011_010_001_011_1(uniques, 8);
+  f_011_010_001_100_0(uniques, 8);
+  f_011_010_001_100_1(uniques, 8);
+  f_011_010_001_101_0(uniques, 8);
+  f_011_010_001_101_1(uniques, 8);
+  f_011_010_001_110_0(uniques, 8);
+  f_011_010_001_110_1(uniques, 8);
+  f_011_010_001_111_0(uniques, 8);
+  f_011_010_001_111_1(uniques, 8);
+  f_011_010_011_000_0(uniques, 8);
+  f_011_010_011_000_1(uniques, 8);
+  f_011_010_011_001_0(uniques, 8);
+  f_011_010_011_001_1(uniques, 8);
+  f_011_010_011_010_0(uniques, 8);
+  f_011_010_011_010_1(uniques, 8);
+  f_011_010_011_011_0(uniques, 8);
+  f_011_010_011_011_1(uniques, 8);
+  f_011_010_011_100_0(uniques, 8);
+  f_011_010_011_100_1(uniques, 8);
+  f_011_010_011_101_0(uniques, 8);
+  f_011_010_011_101_1(uniques, 8);
+  f_011_010_011_110_0(uniques, 8);
+  f_011_010_011_110_1(uniques, 8);
+  f_011_010_011_111_0(uniques, 8);
+  f_011_010_011_111_1(uniques, 8);
+  f_011_010_101_000_0(uniques, 8);
+  f_011_010_101_000_1(uniques, 8);
+  f_011_010_101_001_0(uniques, 8);
+  f_011_010_101_001_1(uniques, 8);
+  f_011_010_101_010_0(uniques, 8);
+  f_011_010_101_010_1(uniques, 8);
+  f_011_010_101_011_0(uniques, 8);
+  f_011_010_101_011_1(uniques, 8);
+  f_011_010_101_100_0(uniques, 8);
+  f_011_010_101_100_1(uniques, 8);
+  f_011_010_101_101_0(uniques, 8);
+  f_011_010_101_101_1(uniques, 8);
+  f_011_010_101_110_0(uniques, 8);
+  f_011_010_101_110_1(uniques, 8);
+  f_011_010_101_111_0(uniques, 8);
+  f_011_010_101_111_1(uniques, 8);
+  f_011_010_111_000_0(uniques, 8);
+  f_011_010_111_000_1(uniques, 8);
+  f_011_010_111_001_0(uniques, 8);
+  f_011_010_111_001_1(uniques, 8);
+  f_011_010_111_010_0(uniques, 8);
+  f_011_010_111_010_1(uniques, 8);
+  f_011_010_111_011_0(uniques, 8);
+  f_011_010_111_011_1(uniques, 8);
+  f_011_010_111_100_0(uniques, 8);
+  f_011_010_111_100_1(uniques, 8);
+  f_011_010_111_101_0(uniques, 8);
+  f_011_010_111_101_1(uniques, 8);
+  f_011_010_111_110_0(uniques, 8);
+  f_011_010_111_110_1(uniques, 8);
+  f_011_010_111_111_0(uniques, 8);
+  f_011_010_111_111_1(uniques, 8);
+  f_011_011_001_000_0(uniques, 8);
+  f_011_011_001_000_1(uniques, 8);
+  f_011_011_001_001_0(uniques, 8);
+  f_011_011_001_001_1(uniques, 8);
+  f_011_011_001_010_0(uniques, 8);
+  f_011_011_001_010_1(uniques, 8);
+  f_011_011_001_011_0(uniques, 8);
+  f_011_011_001_011_1(uniques, 8);
+  f_011_011_001_100_0(uniques, 8);
+  f_011_011_001_100_1(uniques, 8);
+  f_011_011_001_101_0(uniques, 8);
+  f_011_011_001_101_1(uniques, 8);
+  f_011_011_001_110_0(uniques, 8);
+  f_011_011_001_110_1(uniques, 8);
+  f_011_011_001_111_0(uniques, 8);
+  f_011_011_001_111_1(uniques, 8);
+  f_011_011_011_000_0(uniques, 8);
+  f_011_011_011_000_1(uniques, 8);
+  f_011_011_011_001_0(uniques, 8);
+  f_011_011_011_001_1(uniques, 8);
+  f_011_011_011_010_0(uniques, 8);
+  f_011_011_011_010_1(uniques, 8);
+  f_011_011_011_011_0(uniques, 8);
+  f_011_011_011_011_1(uniques, 8);
+  f_011_011_011_100_0(uniques, 8);
+  f_011_011_011_100_1(uniques, 8);
+  f_011_011_011_101_0(uniques, 8);
+  f_011_011_011_101_1(uniques, 8);
+  f_011_011_011_110_0(uniques, 8);
+  f_011_011_011_110_1(uniques, 8);
+  f_011_011_011_111_0(uniques, 8);
+  f_011_011_011_111_1(uniques, 8);
+  f_011_011_101_000_0(uniques, 8);
+  f_011_011_101_000_1(uniques, 8);
+  f_011_011_101_001_0(uniques, 8);
+  f_011_011_101_001_1(uniques, 8);
+  f_011_011_101_010_0(uniques, 8);
+  f_011_011_101_010_1(uniques, 8);
+  f_011_011_101_011_0(uniques, 8);
+  f_011_011_101_011_1(uniques, 8);
+  f_011_011_101_100_0(uniques, 8);
+  f_011_011_101_100_1(uniques, 8);
+  f_011_011_101_101_0(uniques, 8);
+  f_011_011_101_101_1(uniques, 8);
+  f_011_011_101_110_0(uniques, 8);
+  f_011_011_101_110_1(uniques, 8);
+  f_011_011_101_111_0(uniques, 8);
+  f_011_011_101_111_1(uniques, 8);
+  f_011_011_111_000_0(uniques, 8);
+  f_011_011_111_000_1(uniques, 8);
+  f_011_011_111_001_0(uniques, 8);
+  f_011_011_111_001_1(uniques, 8);
+  f_011_011_111_010_0(uniques, 8);
+  f_011_011_111_010_1(uniques, 8);
+  f_011_011_111_011_0(uniques, 8);
+  f_011_011_111_011_1(uniques, 8);
+  f_011_011_111_100_0(uniques, 8);
+  f_011_011_111_100_1(uniques, 8);
+  f_011_011_111_101_0(uniques, 8);
+  f_011_011_111_101_1(uniques, 8);
+  f_011_011_111_110_0(uniques, 8);
+  f_011_011_111_110_1(uniques, 8);
+  f_011_011_111_111_0(uniques, 8);
+  f_011_011_111_111_1(uniques, 8);
+  f_011_100_001_000_0(uniques, 8);
+  f_011_100_001_000_1(uniques, 8);
+  f_011_100_001_001_0(uniques, 8);
+  f_011_100_001_001_1(uniques, 8);
+  f_011_100_001_010_0(uniques, 8);
+  f_011_100_001_010_1(uniques, 8);
+  f_011_100_001_011_0(uniques, 8);
+  f_011_100_001_011_1(uniques, 8);
+  f_011_100_001_100_0(uniques, 8);
+  f_011_100_001_100_1(uniques, 8);
+  f_011_100_001_101_0(uniques, 8);
+  f_011_100_001_101_1(uniques, 8);
+  f_011_100_001_110_0(uniques, 8);
+  f_011_100_001_110_1(uniques, 8);
+  f_011_100_001_111_0(uniques, 8);
+  f_011_100_001_111_1(uniques, 8);
+  f_011_100_011_000_0(uniques, 8);
+  f_011_100_011_000_1(uniques, 8);
+  f_011_100_011_001_0(uniques, 8);
+  f_011_100_011_001_1(uniques, 8);
+  f_011_100_011_010_0(uniques, 8);
+  f_011_100_011_010_1(uniques, 8);
+  f_011_100_011_011_0(uniques, 8);
+  f_011_100_011_011_1(uniques, 8);
+  f_011_100_011_100_0(uniques, 8);
+  f_011_100_011_100_1(uniques, 8);
+  f_011_100_011_101_0(uniques, 8);
+  f_011_100_011_101_1(uniques, 8);
+  f_011_100_011_110_0(uniques, 8);
+  f_011_100_011_110_1(uniques, 8);
+  f_011_100_011_111_0(uniques, 8);
+  f_011_100_011_111_1(uniques, 8);
+  f_011_100_101_000_0(uniques, 8);
+  f_011_100_101_000_1(uniques, 8);
+  f_011_100_101_001_0(uniques, 8);
+  f_011_100_101_001_1(uniques, 8);
+  f_011_100_101_010_0(uniques, 8);
+  f_011_100_101_010_1(uniques, 8);
+  f_011_100_101_011_0(uniques, 8);
+  f_011_100_101_011_1(uniques, 8);
+  f_011_100_101_100_0(uniques, 8);
+  f_011_100_101_100_1(uniques, 8);
+  f_011_100_101_101_0(uniques, 8);
+  f_011_100_101_101_1(uniques, 8);
+  f_011_100_101_110_0(uniques, 8);
+  f_011_100_101_110_1(uniques, 8);
+  f_011_100_101_111_0(uniques, 8);
+  f_011_100_101_111_1(uniques, 8);
+  f_011_100_111_000_0(uniques, 8);
+  f_011_100_111_000_1(uniques, 8);
+  f_011_100_111_001_0(uniques, 8);
+  f_011_100_111_001_1(uniques, 8);
+  f_011_100_111_010_0(uniques, 8);
+  f_011_100_111_010_1(uniques, 8);
+  f_011_100_111_011_0(uniques, 8);
+  f_011_100_111_011_1(uniques, 8);
+  f_011_100_111_100_0(uniques, 8);
+  f_011_100_111_100_1(uniques, 8);
+  f_011_100_111_101_0(uniques, 8);
+  f_011_100_111_101_1(uniques, 8);
+  f_011_100_111_110_0(uniques, 8);
+  f_011_100_111_110_1(uniques, 8);
+  f_011_100_111_111_0(uniques, 8);
+  f_011_100_111_111_1(uniques, 8);
+  f_011_101_001_000_0(uniques, 8);
+  f_011_101_001_000_1(uniques, 8);
+  f_011_101_001_001_0(uniques, 8);
+  f_011_101_001_001_1(uniques, 8);
+  f_011_101_001_010_0(uniques, 8);
+  f_011_101_001_010_1(uniques, 8);
+  f_011_101_001_011_0(uniques, 8);
+  f_011_101_001_011_1(uniques, 8);
+  f_011_101_001_100_0(uniques, 8);
+  f_011_101_001_100_1(uniques, 8);
+  f_011_101_001_101_0(uniques, 8);
+  f_011_101_001_101_1(uniques, 8);
+  f_011_101_001_110_0(uniques, 8);
+  f_011_101_001_110_1(uniques, 8);
+  f_011_101_001_111_0(uniques, 8);
+  f_011_101_001_111_1(uniques, 8);
+  f_011_101_011_000_0(uniques, 8);
+  f_011_101_011_000_1(uniques, 8);
+  f_011_101_011_001_0(uniques, 8);
+  f_011_101_011_001_1(uniques, 8);
+  f_011_101_011_010_0(uniques, 8);
+  f_011_101_011_010_1(uniques, 8);
+  f_011_101_011_011_0(uniques, 8);
+  f_011_101_011_011_1(uniques, 8);
+  f_011_101_011_100_0(uniques, 8);
+  f_011_101_011_100_1(uniques, 8);
+  f_011_101_011_101_0(uniques, 8);
+  f_011_101_011_101_1(uniques, 8);
+  f_011_101_011_110_0(uniques, 8);
+  f_011_101_011_110_1(uniques, 8);
+  f_011_101_011_111_0(uniques, 8);
+  f_011_101_011_111_1(uniques, 8);
+  f_011_101_101_000_0(uniques, 8);
+  f_011_101_101_000_1(uniques, 8);
+  f_011_101_101_001_0(uniques, 8);
+  f_011_101_101_001_1(uniques, 8);
+  f_011_101_101_010_0(uniques, 8);
+  f_011_101_101_010_1(uniques, 8);
+  f_011_101_101_011_0(uniques, 8);
+  f_011_101_101_011_1(uniques, 8);
+  f_011_101_101_100_0(uniques, 8);
+  f_011_101_101_100_1(uniques, 8);
+  f_011_101_101_101_0(uniques, 8);
+  f_011_101_101_101_1(uniques, 8);
+  f_011_101_101_110_0(uniques, 8);
+  f_011_101_101_110_1(uniques, 8);
+  f_011_101_101_111_0(uniques, 8);
+  f_011_101_101_111_1(uniques, 8);
+  f_011_101_111_000_0(uniques, 8);
+  f_011_101_111_000_1(uniques, 8);
+  f_011_101_111_001_0(uniques, 8);
+  f_011_101_111_001_1(uniques, 8);
+  f_011_101_111_010_0(uniques, 8);
+  f_011_101_111_010_1(uniques, 8);
+  f_011_101_111_011_0(uniques, 8);
+  f_011_101_111_011_1(uniques, 8);
+  f_011_101_111_100_0(uniques, 8);
+  f_011_101_111_100_1(uniques, 8);
+  f_011_101_111_101_0(uniques, 8);
+  f_011_101_111_101_1(uniques, 8);
+  f_011_101_111_110_0(uniques, 8);
+  f_011_101_111_110_1(uniques, 8);
+  f_011_101_111_111_0(uniques, 8);
+  f_011_101_111_111_1(uniques, 8);
+  f_011_110_001_000_0(uniques, 8);
+  f_011_110_001_000_1(uniques, 8);
+  f_011_110_001_001_0(uniques, 8);
+  f_011_110_001_001_1(uniques, 8);
+  f_011_110_001_010_0(uniques, 8);
+  f_011_110_001_010_1(uniques, 8);
+  f_011_110_001_011_0(uniques, 8);
+  f_011_110_001_011_1(uniques, 8);
+  f_011_110_001_100_0(uniques, 8);
+  f_011_110_001_100_1(uniques, 8);
+  f_011_110_001_101_0(uniques, 8);
+  f_011_110_001_101_1(uniques, 8);
+  f_011_110_001_110_0(uniques, 8);
+  f_011_110_001_110_1(uniques, 8);
+  f_011_110_001_111_0(uniques, 8);
+  f_011_110_001_111_1(uniques, 8);
+  f_011_110_011_000_0(uniques, 8);
+  f_011_110_011_000_1(uniques, 8);
+  f_011_110_011_001_0(uniques, 8);
+  f_011_110_011_001_1(uniques, 8);
+  f_011_110_011_010_0(uniques, 8);
+  f_011_110_011_010_1(uniques, 8);
+  f_011_110_011_011_0(uniques, 8);
+  f_011_110_011_011_1(uniques, 8);
+  f_011_110_011_100_0(uniques, 8);
+  f_011_110_011_100_1(uniques, 8);
+  f_011_110_011_101_0(uniques, 8);
+  f_011_110_011_101_1(uniques, 8);
+  f_011_110_011_110_0(uniques, 8);
+  f_011_110_011_110_1(uniques, 8);
+  f_011_110_011_111_0(uniques, 8);
+  f_011_110_011_111_1(uniques, 8);
+  f_011_110_101_000_0(uniques, 8);
+  f_011_110_101_000_1(uniques, 8);
+  f_011_110_101_001_0(uniques, 8);
+  f_011_110_101_001_1(uniques, 8);
+  f_011_110_101_010_0(uniques, 8);
+  f_011_110_101_010_1(uniques, 8);
+  f_011_110_101_011_0(uniques, 8);
+  f_011_110_101_011_1(uniques, 8);
+  f_011_110_101_100_0(uniques, 8);
+  f_011_110_101_100_1(uniques, 8);
+  f_011_110_101_101_0(uniques, 8);
+  f_011_110_101_101_1(uniques, 8);
+  f_011_110_101_110_0(uniques, 8);
+  f_011_110_101_110_1(uniques, 8);
+  f_011_110_101_111_0(uniques, 8);
+  f_011_110_101_111_1(uniques, 8);
+  f_011_110_111_000_0(uniques, 8);
+  f_011_110_111_000_1(uniques, 8);
+  f_011_110_111_001_0(uniques, 8);
+  f_011_110_111_001_1(uniques, 8);
+  f_011_110_111_010_0(uniques, 8);
+  f_011_110_111_010_1(uniques, 8);
+  f_011_110_111_011_0(uniques, 8);
+  f_011_110_111_011_1(uniques, 8);
+  f_011_110_111_100_0(uniques, 8);
+  f_011_110_111_100_1(uniques, 8);
+  f_011_110_111_101_0(uniques, 8);
+  f_011_110_111_101_1(uniques, 8);
+  f_011_110_111_110_0(uniques, 8);
+  f_011_110_111_110_1(uniques, 8);
+  f_011_110_111_111_0(uniques, 8);
+  f_011_110_111_111_1(uniques, 8);
+  f_011_111_001_000_0(uniques, 8);
+  f_011_111_001_000_1(uniques, 8);
+  f_011_111_001_001_0(uniques, 8);
+  f_011_111_001_001_1(uniques, 8);
+  f_011_111_001_010_0(uniques, 8);
+  f_011_111_001_010_1(uniques, 8);
+  f_011_111_001_011_0(uniques, 8);
+  f_011_111_001_011_1(uniques, 8);
+  f_011_111_001_100_0(uniques, 8);
+  f_011_111_001_100_1(uniques, 8);
+  f_011_111_001_101_0(uniques, 8);
+  f_011_111_001_101_1(uniques, 8);
+  f_011_111_001_110_0(uniques, 8);
+  f_011_111_001_110_1(uniques, 8);
+  f_011_111_001_111_0(uniques, 8);
+  f_011_111_001_111_1(uniques, 8);
+  f_011_111_011_000_0(uniques, 8);
+  f_011_111_011_000_1(uniques, 8);
+  f_011_111_011_001_0(uniques, 8);
+  f_011_111_011_001_1(uniques, 8);
+  f_011_111_011_010_0(uniques, 8);
+  f_011_111_011_010_1(uniques, 8);
+  f_011_111_011_011_0(uniques, 8);
+  f_011_111_011_011_1(uniques, 8);
+  f_011_111_011_100_0(uniques, 8);
+  f_011_111_011_100_1(uniques, 8);
+  f_011_111_011_101_0(uniques, 8);
+  f_011_111_011_101_1(uniques, 8);
+  f_011_111_011_110_0(uniques, 8);
+  f_011_111_011_110_1(uniques, 8);
+  f_011_111_011_111_0(uniques, 8);
+  f_011_111_011_111_1(uniques, 8);
+  f_011_111_101_000_0(uniques, 8);
+  f_011_111_101_000_1(uniques, 8);
+  f_011_111_101_001_0(uniques, 8);
+  f_011_111_101_001_1(uniques, 8);
+  f_011_111_101_010_0(uniques, 8);
+  f_011_111_101_010_1(uniques, 8);
+  f_011_111_101_011_0(uniques, 8);
+  f_011_111_101_011_1(uniques, 8);
+  f_011_111_101_100_0(uniques, 8);
+  f_011_111_101_100_1(uniques, 8);
+  f_011_111_101_101_0(uniques, 8);
+  f_011_111_101_101_1(uniques, 8);
+  f_011_111_101_110_0(uniques, 8);
+  f_011_111_101_110_1(uniques, 8);
+  f_011_111_101_111_0(uniques, 8);
+  f_011_111_101_111_1(uniques, 8);
+  f_011_111_111_000_0(uniques, 8);
+  f_011_111_111_000_1(uniques, 8);
+  f_011_111_111_001_0(uniques, 8);
+  f_011_111_111_001_1(uniques, 8);
+  f_011_111_111_010_0(uniques, 8);
+  f_011_111_111_010_1(uniques, 8);
+  f_011_111_111_011_0(uniques, 8);
+  f_011_111_111_011_1(uniques, 8);
+  f_011_111_111_100_0(uniques, 8);
+  f_011_111_111_100_1(uniques, 8);
+  f_011_111_111_101_0(uniques, 8);
+  f_011_111_111_101_1(uniques, 8);
+  f_011_111_111_110_0(uniques, 8);
+  f_011_111_111_110_1(uniques, 8);
+  f_011_111_111_111_0(uniques, 8);
+  f_011_111_111_111_1(uniques, 8);
+  f_100_000_001_000_0(uniques, 8);
+  f_100_000_001_000_1(uniques, 8);
+  f_100_000_001_001_0(uniques, 8);
+  f_100_000_001_001_1(uniques, 8);
+  f_100_000_001_010_0(uniques, 8);
+  f_100_000_001_010_1(uniques, 8);
+  f_100_000_001_011_0(uniques, 8);
+  f_100_000_001_011_1(uniques, 8);
+  f_100_000_001_100_0(uniques, 8);
+  f_100_000_001_100_1(uniques, 8);
+  f_100_000_001_101_0(uniques, 8);
+  f_100_000_001_101_1(uniques, 8);
+  f_100_000_001_110_0(uniques, 8);
+  f_100_000_001_110_1(uniques, 8);
+  f_100_000_001_111_0(uniques, 8);
+  f_100_000_001_111_1(uniques, 8);
+  f_100_000_011_000_0(uniques, 8);
+  f_100_000_011_000_1(uniques, 8);
+  f_100_000_011_001_0(uniques, 8);
+  f_100_000_011_001_1(uniques, 8);
+  f_100_000_011_010_0(uniques, 8);
+  f_100_000_011_010_1(uniques, 8);
+  f_100_000_011_011_0(uniques, 8);
+  f_100_000_011_011_1(uniques, 8);
+  f_100_000_011_100_0(uniques, 8);
+  f_100_000_011_100_1(uniques, 8);
+  f_100_000_011_101_0(uniques, 8);
+  f_100_000_011_101_1(uniques, 8);
+  f_100_000_011_110_0(uniques, 8);
+  f_100_000_011_110_1(uniques, 8);
+  f_100_000_011_111_0(uniques, 8);
+  f_100_000_011_111_1(uniques, 8);
+  f_100_000_101_000_0(uniques, 8);
+  f_100_000_101_000_1(uniques, 8);
+  f_100_000_101_001_0(uniques, 8);
+  f_100_000_101_001_1(uniques, 8);
+  f_100_000_101_010_0(uniques, 8);
+  f_100_000_101_010_1(uniques, 8);
+  f_100_000_101_011_0(uniques, 8);
+  f_100_000_101_011_1(uniques, 8);
+  f_100_000_101_100_0(uniques, 8);
+  f_100_000_101_100_1(uniques, 8);
+  f_100_000_101_101_0(uniques, 8);
+  f_100_000_101_101_1(uniques, 8);
+  f_100_000_101_110_0(uniques, 8);
+  f_100_000_101_110_1(uniques, 8);
+  f_100_000_101_111_0(uniques, 8);
+  f_100_000_101_111_1(uniques, 8);
+  f_100_000_111_000_0(uniques, 8);
+  f_100_000_111_000_1(uniques, 8);
+  f_100_000_111_001_0(uniques, 8);
+  f_100_000_111_001_1(uniques, 8);
+  f_100_000_111_010_0(uniques, 8);
+  f_100_000_111_010_1(uniques, 8);
+  f_100_000_111_011_0(uniques, 8);
+  f_100_000_111_011_1(uniques, 8);
+  f_100_000_111_100_0(uniques, 8);
+  f_100_000_111_100_1(uniques, 8);
+  f_100_000_111_101_0(uniques, 8);
+  f_100_000_111_101_1(uniques, 8);
+  f_100_000_111_110_0(uniques, 8);
+  f_100_000_111_110_1(uniques, 8);
+  f_100_000_111_111_0(uniques, 8);
+  f_100_000_111_111_1(uniques, 8);
+  f_100_001_001_000_0(uniques, 8);
+  f_100_001_001_000_1(uniques, 8);
+  f_100_001_001_001_0(uniques, 8);
+  f_100_001_001_001_1(uniques, 8);
+  f_100_001_001_010_0(uniques, 8);
+  f_100_001_001_010_1(uniques, 8);
+  f_100_001_001_011_0(uniques, 8);
+  f_100_001_001_011_1(uniques, 8);
+  f_100_001_001_100_0(uniques, 8);
+  f_100_001_001_100_1(uniques, 8);
+  f_100_001_001_101_0(uniques, 8);
+  f_100_001_001_101_1(uniques, 8);
+  f_100_001_001_110_0(uniques, 8);
+  f_100_001_001_110_1(uniques, 8);
+  f_100_001_001_111_0(uniques, 8);
+  f_100_001_001_111_1(uniques, 8);
+  f_100_001_011_000_0(uniques, 8);
+  f_100_001_011_000_1(uniques, 8);
+  f_100_001_011_001_0(uniques, 8);
+  f_100_001_011_001_1(uniques, 8);
+  f_100_001_011_010_0(uniques, 8);
+  f_100_001_011_010_1(uniques, 8);
+  f_100_001_011_011_0(uniques, 8);
+  f_100_001_011_011_1(uniques, 8);
+  f_100_001_011_100_0(uniques, 8);
+  f_100_001_011_100_1(uniques, 8);
+  f_100_001_011_101_0(uniques, 8);
+  f_100_001_011_101_1(uniques, 8);
+  f_100_001_011_110_0(uniques, 8);
+  f_100_001_011_110_1(uniques, 8);
+  f_100_001_011_111_0(uniques, 8);
+  f_100_001_011_111_1(uniques, 8);
+  f_100_001_101_000_0(uniques, 8);
+  f_100_001_101_000_1(uniques, 8);
+  f_100_001_101_001_0(uniques, 8);
+  f_100_001_101_001_1(uniques, 8);
+  f_100_001_101_010_0(uniques, 8);
+  f_100_001_101_010_1(uniques, 8);
+  f_100_001_101_011_0(uniques, 8);
+  f_100_001_101_011_1(uniques, 8);
+  f_100_001_101_100_0(uniques, 8);
+  f_100_001_101_100_1(uniques, 8);
+  f_100_001_101_101_0(uniques, 8);
+  f_100_001_101_101_1(uniques, 8);
+  f_100_001_101_110_0(uniques, 8);
+  f_100_001_101_110_1(uniques, 8);
+  f_100_001_101_111_0(uniques, 8);
+  f_100_001_101_111_1(uniques, 8);
+  f_100_001_111_000_0(uniques, 8);
+  f_100_001_111_000_1(uniques, 8);
+  f_100_001_111_001_0(uniques, 8);
+  f_100_001_111_001_1(uniques, 8);
+  f_100_001_111_010_0(uniques, 8);
+  f_100_001_111_010_1(uniques, 8);
+  f_100_001_111_011_0(uniques, 8);
+  f_100_001_111_011_1(uniques, 8);
+  f_100_001_111_100_0(uniques, 8);
+  f_100_001_111_100_1(uniques, 8);
+  f_100_001_111_101_0(uniques, 8);
+  f_100_001_111_101_1(uniques, 8);
+  f_100_001_111_110_0(uniques, 8);
+  f_100_001_111_110_1(uniques, 8);
+  f_100_001_111_111_0(uniques, 8);
+  f_100_001_111_111_1(uniques, 8);
+  f_100_010_001_000_0(uniques, 8);
+  f_100_010_001_000_1(uniques, 8);
+  f_100_010_001_001_0(uniques, 8);
+  f_100_010_001_001_1(uniques, 8);
+  f_100_010_001_010_0(uniques, 8);
+  f_100_010_001_010_1(uniques, 8);
+  f_100_010_001_011_0(uniques, 8);
+  f_100_010_001_011_1(uniques, 8);
+  f_100_010_001_100_0(uniques, 8);
+  f_100_010_001_100_1(uniques, 8);
+  f_100_010_001_101_0(uniques, 8);
+  f_100_010_001_101_1(uniques, 8);
+  f_100_010_001_110_0(uniques, 8);
+  f_100_010_001_110_1(uniques, 8);
+  f_100_010_001_111_0(uniques, 8);
+  f_100_010_001_111_1(uniques, 8);
+  f_100_010_011_000_0(uniques, 8);
+  f_100_010_011_000_1(uniques, 8);
+  f_100_010_011_001_0(uniques, 8);
+  f_100_010_011_001_1(uniques, 8);
+  f_100_010_011_010_0(uniques, 8);
+  f_100_010_011_010_1(uniques, 8);
+  f_100_010_011_011_0(uniques, 8);
+  f_100_010_011_011_1(uniques, 8);
+  f_100_010_011_100_0(uniques, 8);
+  f_100_010_011_100_1(uniques, 8);
+  f_100_010_011_101_0(uniques, 8);
+  f_100_010_011_101_1(uniques, 8);
+  f_100_010_011_110_0(uniques, 8);
+  f_100_010_011_110_1(uniques, 8);
+  f_100_010_011_111_0(uniques, 8);
+  f_100_010_011_111_1(uniques, 8);
+  f_100_010_101_000_0(uniques, 8);
+  f_100_010_101_000_1(uniques, 8);
+  f_100_010_101_001_0(uniques, 8);
+  f_100_010_101_001_1(uniques, 8);
+  f_100_010_101_010_0(uniques, 8);
+  f_100_010_101_010_1(uniques, 8);
+  f_100_010_101_011_0(uniques, 8);
+  f_100_010_101_011_1(uniques, 8);
+  f_100_010_101_100_0(uniques, 8);
+  f_100_010_101_100_1(uniques, 8);
+  f_100_010_101_101_0(uniques, 8);
+  f_100_010_101_101_1(uniques, 8);
+  f_100_010_101_110_0(uniques, 8);
+  f_100_010_101_110_1(uniques, 8);
+  f_100_010_101_111_0(uniques, 8);
+  f_100_010_101_111_1(uniques, 8);
+  f_100_010_111_000_0(uniques, 8);
+  f_100_010_111_000_1(uniques, 8);
+  f_100_010_111_001_0(uniques, 8);
+  f_100_010_111_001_1(uniques, 8);
+  f_100_010_111_010_0(uniques, 8);
+  f_100_010_111_010_1(uniques, 8);
+  f_100_010_111_011_0(uniques, 8);
+  f_100_010_111_011_1(uniques, 8);
+  f_100_010_111_100_0(uniques, 8);
+  f_100_010_111_100_1(uniques, 8);
+  f_100_010_111_101_0(uniques, 8);
+  f_100_010_111_101_1(uniques, 8);
+  f_100_010_111_110_0(uniques, 8);
+  f_100_010_111_110_1(uniques, 8);
+  f_100_010_111_111_0(uniques, 8);
+  f_100_010_111_111_1(uniques, 8);
+  f_100_011_001_000_0(uniques, 8);
+  f_100_011_001_000_1(uniques, 8);
+  f_100_011_001_001_0(uniques, 8);
+  f_100_011_001_001_1(uniques, 8);
+  f_100_011_001_010_0(uniques, 8);
+  f_100_011_001_010_1(uniques, 8);
+  f_100_011_001_011_0(uniques, 8);
+  f_100_011_001_011_1(uniques, 8);
+  f_100_011_001_100_0(uniques, 8);
+  f_100_011_001_100_1(uniques, 8);
+  f_100_011_001_101_0(uniques, 8);
+  f_100_011_001_101_1(uniques, 8);
+  f_100_011_001_110_0(uniques, 8);
+  f_100_011_001_110_1(uniques, 8);
+  f_100_011_001_111_0(uniques, 8);
+  f_100_011_001_111_1(uniques, 8);
+  f_100_011_011_000_0(uniques, 8);
+  f_100_011_011_000_1(uniques, 8);
+  f_100_011_011_001_0(uniques, 8);
+  f_100_011_011_001_1(uniques, 8);
+  f_100_011_011_010_0(uniques, 8);
+  f_100_011_011_010_1(uniques, 8);
+  f_100_011_011_011_0(uniques, 8);
+  f_100_011_011_011_1(uniques, 8);
+  f_100_011_011_100_0(uniques, 8);
+  f_100_011_011_100_1(uniques, 8);
+  f_100_011_011_101_0(uniques, 8);
+  f_100_011_011_101_1(uniques, 8);
+  f_100_011_011_110_0(uniques, 8);
+  f_100_011_011_110_1(uniques, 8);
+  f_100_011_011_111_0(uniques, 8);
+  f_100_011_011_111_1(uniques, 8);
+  f_100_011_101_000_0(uniques, 8);
+  f_100_011_101_000_1(uniques, 8);
+  f_100_011_101_001_0(uniques, 8);
+  f_100_011_101_001_1(uniques, 8);
+  f_100_011_101_010_0(uniques, 8);
+  f_100_011_101_010_1(uniques, 8);
+  f_100_011_101_011_0(uniques, 8);
+  f_100_011_101_011_1(uniques, 8);
+  f_100_011_101_100_0(uniques, 8);
+  f_100_011_101_100_1(uniques, 8);
+  f_100_011_101_101_0(uniques, 8);
+  f_100_011_101_101_1(uniques, 8);
+  f_100_011_101_110_0(uniques, 8);
+  f_100_011_101_110_1(uniques, 8);
+  f_100_011_101_111_0(uniques, 8);
+  f_100_011_101_111_1(uniques, 8);
+  f_100_011_111_000_0(uniques, 8);
+  f_100_011_111_000_1(uniques, 8);
+  f_100_011_111_001_0(uniques, 8);
+  f_100_011_111_001_1(uniques, 8);
+  f_100_011_111_010_0(uniques, 8);
+  f_100_011_111_010_1(uniques, 8);
+  f_100_011_111_011_0(uniques, 8);
+  f_100_011_111_011_1(uniques, 8);
+  f_100_011_111_100_0(uniques, 8);
+  f_100_011_111_100_1(uniques, 8);
+  f_100_011_111_101_0(uniques, 8);
+  f_100_011_111_101_1(uniques, 8);
+  f_100_011_111_110_0(uniques, 8);
+  f_100_011_111_110_1(uniques, 8);
+  f_100_011_111_111_0(uniques, 8);
+  f_100_011_111_111_1(uniques, 8);
+  f_100_100_001_000_0(uniques, 8);
+  f_100_100_001_000_1(uniques, 8);
+  f_100_100_001_001_0(uniques, 8);
+  f_100_100_001_001_1(uniques, 8);
+  f_100_100_001_010_0(uniques, 8);
+  f_100_100_001_010_1(uniques, 8);
+  f_100_100_001_011_0(uniques, 8);
+  f_100_100_001_011_1(uniques, 8);
+  f_100_100_001_100_0(uniques, 8);
+  f_100_100_001_100_1(uniques, 8);
+  f_100_100_001_101_0(uniques, 8);
+  f_100_100_001_101_1(uniques, 8);
+  f_100_100_001_110_0(uniques, 8);
+  f_100_100_001_110_1(uniques, 8);
+  f_100_100_001_111_0(uniques, 8);
+  f_100_100_001_111_1(uniques, 8);
+  f_100_100_011_000_0(uniques, 8);
+  f_100_100_011_000_1(uniques, 8);
+  f_100_100_011_001_0(uniques, 8);
+  f_100_100_011_001_1(uniques, 8);
+  f_100_100_011_010_0(uniques, 8);
+  f_100_100_011_010_1(uniques, 8);
+  f_100_100_011_011_0(uniques, 8);
+  f_100_100_011_011_1(uniques, 8);
+  f_100_100_011_100_0(uniques, 8);
+  f_100_100_011_100_1(uniques, 8);
+  f_100_100_011_101_0(uniques, 8);
+  f_100_100_011_101_1(uniques, 8);
+  f_100_100_011_110_0(uniques, 8);
+  f_100_100_011_110_1(uniques, 8);
+  f_100_100_011_111_0(uniques, 8);
+  f_100_100_011_111_1(uniques, 8);
+  f_100_100_101_000_0(uniques, 8);
+  f_100_100_101_000_1(uniques, 8);
+  f_100_100_101_001_0(uniques, 8);
+  f_100_100_101_001_1(uniques, 8);
+  f_100_100_101_010_0(uniques, 8);
+  f_100_100_101_010_1(uniques, 8);
+  f_100_100_101_011_0(uniques, 8);
+  f_100_100_101_011_1(uniques, 8);
+  f_100_100_101_100_0(uniques, 8);
+  f_100_100_101_100_1(uniques, 8);
+  f_100_100_101_101_0(uniques, 8);
+  f_100_100_101_101_1(uniques, 8);
+  f_100_100_101_110_0(uniques, 8);
+  f_100_100_101_110_1(uniques, 8);
+  f_100_100_101_111_0(uniques, 8);
+  f_100_100_101_111_1(uniques, 8);
+  f_100_100_111_000_0(uniques, 8);
+  f_100_100_111_000_1(uniques, 8);
+  f_100_100_111_001_0(uniques, 8);
+  f_100_100_111_001_1(uniques, 8);
+  f_100_100_111_010_0(uniques, 8);
+  f_100_100_111_010_1(uniques, 8);
+  f_100_100_111_011_0(uniques, 8);
+  f_100_100_111_011_1(uniques, 8);
+  f_100_100_111_100_0(uniques, 8);
+  f_100_100_111_100_1(uniques, 8);
+  f_100_100_111_101_0(uniques, 8);
+  f_100_100_111_101_1(uniques, 8);
+  f_100_100_111_110_0(uniques, 8);
+  f_100_100_111_110_1(uniques, 8);
+  f_100_100_111_111_0(uniques, 8);
+  f_100_100_111_111_1(uniques, 8);
+  f_100_101_001_000_0(uniques, 8);
+  f_100_101_001_000_1(uniques, 8);
+  f_100_101_001_001_0(uniques, 8);
+  f_100_101_001_001_1(uniques, 8);
+  f_100_101_001_010_0(uniques, 8);
+  f_100_101_001_010_1(uniques, 8);
+  f_100_101_001_011_0(uniques, 8);
+  f_100_101_001_011_1(uniques, 8);
+  f_100_101_001_100_0(uniques, 8);
+  f_100_101_001_100_1(uniques, 8);
+  f_100_101_001_101_0(uniques, 8);
+  f_100_101_001_101_1(uniques, 8);
+  f_100_101_001_110_0(uniques, 8);
+  f_100_101_001_110_1(uniques, 8);
+  f_100_101_001_111_0(uniques, 8);
+  f_100_101_001_111_1(uniques, 8);
+  f_100_101_011_000_0(uniques, 8);
+  f_100_101_011_000_1(uniques, 8);
+  f_100_101_011_001_0(uniques, 8);
+  f_100_101_011_001_1(uniques, 8);
+  f_100_101_011_010_0(uniques, 8);
+  f_100_101_011_010_1(uniques, 8);
+  f_100_101_011_011_0(uniques, 8);
+  f_100_101_011_011_1(uniques, 8);
+  f_100_101_011_100_0(uniques, 8);
+  f_100_101_011_100_1(uniques, 8);
+  f_100_101_011_101_0(uniques, 8);
+  f_100_101_011_101_1(uniques, 8);
+  f_100_101_011_110_0(uniques, 8);
+  f_100_101_011_110_1(uniques, 8);
+  f_100_101_011_111_0(uniques, 8);
+  f_100_101_011_111_1(uniques, 8);
+  f_100_101_101_000_0(uniques, 8);
+  f_100_101_101_000_1(uniques, 8);
+  f_100_101_101_001_0(uniques, 8);
+  f_100_101_101_001_1(uniques, 8);
+  f_100_101_101_010_0(uniques, 8);
+  f_100_101_101_010_1(uniques, 8);
+  f_100_101_101_011_0(uniques, 8);
+  f_100_101_101_011_1(uniques, 8);
+  f_100_101_101_100_0(uniques, 8);
+  f_100_101_101_100_1(uniques, 8);
+  f_100_101_101_101_0(uniques, 8);
+  f_100_101_101_101_1(uniques, 8);
+  f_100_101_101_110_0(uniques, 8);
+  f_100_101_101_110_1(uniques, 8);
+  f_100_101_101_111_0(uniques, 8);
+  f_100_101_101_111_1(uniques, 8);
+  f_100_101_111_000_0(uniques, 8);
+  f_100_101_111_000_1(uniques, 8);
+  f_100_101_111_001_0(uniques, 8);
+  f_100_101_111_001_1(uniques, 8);
+  f_100_101_111_010_0(uniques, 8);
+  f_100_101_111_010_1(uniques, 8);
+  f_100_101_111_011_0(uniques, 8);
+  f_100_101_111_011_1(uniques, 8);
+  f_100_101_111_100_0(uniques, 8);
+  f_100_101_111_100_1(uniques, 8);
+  f_100_101_111_101_0(uniques, 8);
+  f_100_101_111_101_1(uniques, 8);
+  f_100_101_111_110_0(uniques, 8);
+  f_100_101_111_110_1(uniques, 8);
+  f_100_101_111_111_0(uniques, 8);
+  f_100_101_111_111_1(uniques, 8);
+  f_100_110_001_000_0(uniques, 8);
+  f_100_110_001_000_1(uniques, 8);
+  f_100_110_001_001_0(uniques, 8);
+  f_100_110_001_001_1(uniques, 8);
+  f_100_110_001_010_0(uniques, 8);
+  f_100_110_001_010_1(uniques, 8);
+  f_100_110_001_011_0(uniques, 8);
+  f_100_110_001_011_1(uniques, 8);
+  f_100_110_001_100_0(uniques, 8);
+  f_100_110_001_100_1(uniques, 8);
+  f_100_110_001_101_0(uniques, 8);
+  f_100_110_001_101_1(uniques, 8);
+  f_100_110_001_110_0(uniques, 8);
+  f_100_110_001_110_1(uniques, 8);
+  f_100_110_001_111_0(uniques, 8);
+  f_100_110_001_111_1(uniques, 8);
+  f_100_110_011_000_0(uniques, 8);
+  f_100_110_011_000_1(uniques, 8);
+  f_100_110_011_001_0(uniques, 8);
+  f_100_110_011_001_1(uniques, 8);
+  f_100_110_011_010_0(uniques, 8);
+  f_100_110_011_010_1(uniques, 8);
+  f_100_110_011_011_0(uniques, 8);
+  f_100_110_011_011_1(uniques, 8);
+  f_100_110_011_100_0(uniques, 8);
+  f_100_110_011_100_1(uniques, 8);
+  f_100_110_011_101_0(uniques, 8);
+  f_100_110_011_101_1(uniques, 8);
+  f_100_110_011_110_0(uniques, 8);
+  f_100_110_011_110_1(uniques, 8);
+  f_100_110_011_111_0(uniques, 8);
+  f_100_110_011_111_1(uniques, 8);
+  f_100_110_101_000_0(uniques, 8);
+  f_100_110_101_000_1(uniques, 8);
+  f_100_110_101_001_0(uniques, 8);
+  f_100_110_101_001_1(uniques, 8);
+  f_100_110_101_010_0(uniques, 8);
+  f_100_110_101_010_1(uniques, 8);
+  f_100_110_101_011_0(uniques, 8);
+  f_100_110_101_011_1(uniques, 8);
+  f_100_110_101_100_0(uniques, 8);
+  f_100_110_101_100_1(uniques, 8);
+  f_100_110_101_101_0(uniques, 8);
+  f_100_110_101_101_1(uniques, 8);
+  f_100_110_101_110_0(uniques, 8);
+  f_100_110_101_110_1(uniques, 8);
+  f_100_110_101_111_0(uniques, 8);
+  f_100_110_101_111_1(uniques, 8);
+  f_100_110_111_000_0(uniques, 8);
+  f_100_110_111_000_1(uniques, 8);
+  f_100_110_111_001_0(uniques, 8);
+  f_100_110_111_001_1(uniques, 8);
+  f_100_110_111_010_0(uniques, 8);
+  f_100_110_111_010_1(uniques, 8);
+  f_100_110_111_011_0(uniques, 8);
+  f_100_110_111_011_1(uniques, 8);
+  f_100_110_111_100_0(uniques, 8);
+  f_100_110_111_100_1(uniques, 8);
+  f_100_110_111_101_0(uniques, 8);
+  f_100_110_111_101_1(uniques, 8);
+  f_100_110_111_110_0(uniques, 8);
+  f_100_110_111_110_1(uniques, 8);
+  f_100_110_111_111_0(uniques, 8);
+  f_100_110_111_111_1(uniques, 8);
+  f_100_111_001_000_0(uniques, 8);
+  f_100_111_001_000_1(uniques, 8);
+  f_100_111_001_001_0(uniques, 8);
+  f_100_111_001_001_1(uniques, 8);
+  f_100_111_001_010_0(uniques, 8);
+  f_100_111_001_010_1(uniques, 8);
+  f_100_111_001_011_0(uniques, 8);
+  f_100_111_001_011_1(uniques, 8);
+  f_100_111_001_100_0(uniques, 8);
+  f_100_111_001_100_1(uniques, 8);
+  f_100_111_001_101_0(uniques, 8);
+  f_100_111_001_101_1(uniques, 8);
+  f_100_111_001_110_0(uniques, 8);
+  f_100_111_001_110_1(uniques, 8);
+  f_100_111_001_111_0(uniques, 8);
+  f_100_111_001_111_1(uniques, 8);
+  f_100_111_011_000_0(uniques, 8);
+  f_100_111_011_000_1(uniques, 8);
+  f_100_111_011_001_0(uniques, 8);
+  f_100_111_011_001_1(uniques, 8);
+  f_100_111_011_010_0(uniques, 8);
+  f_100_111_011_010_1(uniques, 8);
+  f_100_111_011_011_0(uniques, 8);
+  f_100_111_011_011_1(uniques, 8);
+  f_100_111_011_100_0(uniques, 8);
+  f_100_111_011_100_1(uniques, 8);
+  f_100_111_011_101_0(uniques, 8);
+  f_100_111_011_101_1(uniques, 8);
+  f_100_111_011_110_0(uniques, 8);
+  f_100_111_011_110_1(uniques, 8);
+  f_100_111_011_111_0(uniques, 8);
+  f_100_111_011_111_1(uniques, 8);
+  f_100_111_101_000_0(uniques, 8);
+  f_100_111_101_000_1(uniques, 8);
+  f_100_111_101_001_0(uniques, 8);
+  f_100_111_101_001_1(uniques, 8);
+  f_100_111_101_010_0(uniques, 8);
+  f_100_111_101_010_1(uniques, 8);
+  f_100_111_101_011_0(uniques, 8);
+  f_100_111_101_011_1(uniques, 8);
+  f_100_111_101_100_0(uniques, 8);
+  f_100_111_101_100_1(uniques, 8);
+  f_100_111_101_101_0(uniques, 8);
+  f_100_111_101_101_1(uniques, 8);
+  f_100_111_101_110_0(uniques, 8);
+  f_100_111_101_110_1(uniques, 8);
+  f_100_111_101_111_0(uniques, 8);
+  f_100_111_101_111_1(uniques, 8);
+  f_100_111_111_000_0(uniques, 8);
+  f_100_111_111_000_1(uniques, 8);
+  f_100_111_111_001_0(uniques, 8);
+  f_100_111_111_001_1(uniques, 8);
+  f_100_111_111_010_0(uniques, 8);
+  f_100_111_111_010_1(uniques, 8);
+  f_100_111_111_011_0(uniques, 8);
+  f_100_111_111_011_1(uniques, 8);
+  f_100_111_111_100_0(uniques, 8);
+  f_100_111_111_100_1(uniques, 8);
+  f_100_111_111_101_0(uniques, 8);
+  f_100_111_111_101_1(uniques, 8);
+  f_100_111_111_110_0(uniques, 8);
+  f_100_111_111_110_1(uniques, 8);
+  f_100_111_111_111_0(uniques, 8);
+  f_100_111_111_111_1(uniques, 8);
+  f_101_000_001_000_0(uniques, 8);
+  f_101_000_001_000_1(uniques, 8);
+  f_101_000_001_001_0(uniques, 8);
+  f_101_000_001_001_1(uniques, 8);
+  f_101_000_001_010_0(uniques, 8);
+  f_101_000_001_010_1(uniques, 8);
+  f_101_000_001_011_0(uniques, 8);
+  f_101_000_001_011_1(uniques, 8);
+  f_101_000_001_100_0(uniques, 8);
+  f_101_000_001_100_1(uniques, 8);
+  f_101_000_001_101_0(uniques, 8);
+  f_101_000_001_101_1(uniques, 8);
+  f_101_000_001_110_0(uniques, 8);
+  f_101_000_001_110_1(uniques, 8);
+  f_101_000_001_111_0(uniques, 8);
+  f_101_000_001_111_1(uniques, 8);
+  f_101_000_011_000_0(uniques, 8);
+  f_101_000_011_000_1(uniques, 8);
+  f_101_000_011_001_0(uniques, 8);
+  f_101_000_011_001_1(uniques, 8);
+  f_101_000_011_010_0(uniques, 8);
+  f_101_000_011_010_1(uniques, 8);
+  f_101_000_011_011_0(uniques, 8);
+  f_101_000_011_011_1(uniques, 8);
+  f_101_000_011_100_0(uniques, 8);
+  f_101_000_011_100_1(uniques, 8);
+  f_101_000_011_101_0(uniques, 8);
+  f_101_000_011_101_1(uniques, 8);
+  f_101_000_011_110_0(uniques, 8);
+  f_101_000_011_110_1(uniques, 8);
+  f_101_000_011_111_0(uniques, 8);
+  f_101_000_011_111_1(uniques, 8);
+  f_101_000_101_000_0(uniques, 8);
+  f_101_000_101_000_1(uniques, 8);
+  f_101_000_101_001_0(uniques, 8);
+  f_101_000_101_001_1(uniques, 8);
+  f_101_000_101_010_0(uniques, 8);
+  f_101_000_101_010_1(uniques, 8);
+  f_101_000_101_011_0(uniques, 8);
+  f_101_000_101_011_1(uniques, 8);
+  f_101_000_101_100_0(uniques, 8);
+  f_101_000_101_100_1(uniques, 8);
+  f_101_000_101_101_0(uniques, 8);
+  f_101_000_101_101_1(uniques, 8);
+  f_101_000_101_110_0(uniques, 8);
+  f_101_000_101_110_1(uniques, 8);
+  f_101_000_101_111_0(uniques, 8);
+  f_101_000_101_111_1(uniques, 8);
+  f_101_000_111_000_0(uniques, 8);
+  f_101_000_111_000_1(uniques, 8);
+  f_101_000_111_001_0(uniques, 8);
+  f_101_000_111_001_1(uniques, 8);
+  f_101_000_111_010_0(uniques, 8);
+  f_101_000_111_010_1(uniques, 8);
+  f_101_000_111_011_0(uniques, 8);
+  f_101_000_111_011_1(uniques, 8);
+  f_101_000_111_100_0(uniques, 8);
+  f_101_000_111_100_1(uniques, 8);
+  f_101_000_111_101_0(uniques, 8);
+  f_101_000_111_101_1(uniques, 8);
+  f_101_000_111_110_0(uniques, 8);
+  f_101_000_111_110_1(uniques, 8);
+  f_101_000_111_111_0(uniques, 8);
+  f_101_000_111_111_1(uniques, 8);
+  f_101_001_001_000_0(uniques, 8);
+  f_101_001_001_000_1(uniques, 8);
+  f_101_001_001_001_0(uniques, 8);
+  f_101_001_001_001_1(uniques, 8);
+  f_101_001_001_010_0(uniques, 8);
+  f_101_001_001_010_1(uniques, 8);
+  f_101_001_001_011_0(uniques, 8);
+  f_101_001_001_011_1(uniques, 8);
+  f_101_001_001_100_0(uniques, 8);
+  f_101_001_001_100_1(uniques, 8);
+  f_101_001_001_101_0(uniques, 8);
+  f_101_001_001_101_1(uniques, 8);
+  f_101_001_001_110_0(uniques, 8);
+  f_101_001_001_110_1(uniques, 8);
+  f_101_001_001_111_0(uniques, 8);
+  f_101_001_001_111_1(uniques, 8);
+  f_101_001_011_000_0(uniques, 8);
+  f_101_001_011_000_1(uniques, 8);
+  f_101_001_011_001_0(uniques, 8);
+  f_101_001_011_001_1(uniques, 8);
+  f_101_001_011_010_0(uniques, 8);
+  f_101_001_011_010_1(uniques, 8);
+  f_101_001_011_011_0(uniques, 8);
+  f_101_001_011_011_1(uniques, 8);
+  f_101_001_011_100_0(uniques, 8);
+  f_101_001_011_100_1(uniques, 8);
+  f_101_001_011_101_0(uniques, 8);
+  f_101_001_011_101_1(uniques, 8);
+  f_101_001_011_110_0(uniques, 8);
+  f_101_001_011_110_1(uniques, 8);
+  f_101_001_011_111_0(uniques, 8);
+  f_101_001_011_111_1(uniques, 8);
+  f_101_001_101_000_0(uniques, 8);
+  f_101_001_101_000_1(uniques, 8);
+  f_101_001_101_001_0(uniques, 8);
+  f_101_001_101_001_1(uniques, 8);
+  f_101_001_101_010_0(uniques, 8);
+  f_101_001_101_010_1(uniques, 8);
+  f_101_001_101_011_0(uniques, 8);
+  f_101_001_101_011_1(uniques, 8);
+  f_101_001_101_100_0(uniques, 8);
+  f_101_001_101_100_1(uniques, 8);
+  f_101_001_101_101_0(uniques, 8);
+  f_101_001_101_101_1(uniques, 8);
+  f_101_001_101_110_0(uniques, 8);
+  f_101_001_101_110_1(uniques, 8);
+  f_101_001_101_111_0(uniques, 8);
+  f_101_001_101_111_1(uniques, 8);
+  f_101_001_111_000_0(uniques, 8);
+  f_101_001_111_000_1(uniques, 8);
+  f_101_001_111_001_0(uniques, 8);
+  f_101_001_111_001_1(uniques, 8);
+  f_101_001_111_010_0(uniques, 8);
+  f_101_001_111_010_1(uniques, 8);
+  f_101_001_111_011_0(uniques, 8);
+  f_101_001_111_011_1(uniques, 8);
+  f_101_001_111_100_0(uniques, 8);
+  f_101_001_111_100_1(uniques, 8);
+  f_101_001_111_101_0(uniques, 8);
+  f_101_001_111_101_1(uniques, 8);
+  f_101_001_111_110_0(uniques, 8);
+  f_101_001_111_110_1(uniques, 8);
+  f_101_001_111_111_0(uniques, 8);
+  f_101_001_111_111_1(uniques, 8);
+  f_101_010_001_000_0(uniques, 8);
+  f_101_010_001_000_1(uniques, 8);
+  f_101_010_001_001_0(uniques, 8);
+  f_101_010_001_001_1(uniques, 8);
+  f_101_010_001_010_0(uniques, 8);
+  f_101_010_001_010_1(uniques, 8);
+  f_101_010_001_011_0(uniques, 8);
+  f_101_010_001_011_1(uniques, 8);
+  f_101_010_001_100_0(uniques, 8);
+  f_101_010_001_100_1(uniques, 8);
+  f_101_010_001_101_0(uniques, 8);
+  f_101_010_001_101_1(uniques, 8);
+  f_101_010_001_110_0(uniques, 8);
+  f_101_010_001_110_1(uniques, 8);
+  f_101_010_001_111_0(uniques, 8);
+  f_101_010_001_111_1(uniques, 8);
+  f_101_010_011_000_0(uniques, 8);
+  f_101_010_011_000_1(uniques, 8);
+  f_101_010_011_001_0(uniques, 8);
+  f_101_010_011_001_1(uniques, 8);
+  f_101_010_011_010_0(uniques, 8);
+  f_101_010_011_010_1(uniques, 8);
+  f_101_010_011_011_0(uniques, 8);
+  f_101_010_011_011_1(uniques, 8);
+  f_101_010_011_100_0(uniques, 8);
+  f_101_010_011_100_1(uniques, 8);
+  f_101_010_011_101_0(uniques, 8);
+  f_101_010_011_101_1(uniques, 8);
+  f_101_010_011_110_0(uniques, 8);
+  f_101_010_011_110_1(uniques, 8);
+  f_101_010_011_111_0(uniques, 8);
+  f_101_010_011_111_1(uniques, 8);
+  f_101_010_101_000_0(uniques, 8);
+  f_101_010_101_000_1(uniques, 8);
+  f_101_010_101_001_0(uniques, 8);
+  f_101_010_101_001_1(uniques, 8);
+  f_101_010_101_010_0(uniques, 8);
+  f_101_010_101_010_1(uniques, 8);
+  f_101_010_101_011_0(uniques, 8);
+  f_101_010_101_011_1(uniques, 8);
+  f_101_010_101_100_0(uniques, 8);
+  f_101_010_101_100_1(uniques, 8);
+  f_101_010_101_101_0(uniques, 8);
+  f_101_010_101_101_1(uniques, 8);
+  f_101_010_101_110_0(uniques, 8);
+  f_101_010_101_110_1(uniques, 8);
+  f_101_010_101_111_0(uniques, 8);
+  f_101_010_101_111_1(uniques, 8);
+  f_101_010_111_000_0(uniques, 8);
+  f_101_010_111_000_1(uniques, 8);
+  f_101_010_111_001_0(uniques, 8);
+  f_101_010_111_001_1(uniques, 8);
+  f_101_010_111_010_0(uniques, 8);
+  f_101_010_111_010_1(uniques, 8);
+  f_101_010_111_011_0(uniques, 8);
+  f_101_010_111_011_1(uniques, 8);
+  f_101_010_111_100_0(uniques, 8);
+  f_101_010_111_100_1(uniques, 8);
+  f_101_010_111_101_0(uniques, 8);
+  f_101_010_111_101_1(uniques, 8);
+  f_101_010_111_110_0(uniques, 8);
+  f_101_010_111_110_1(uniques, 8);
+  f_101_010_111_111_0(uniques, 8);
+  f_101_010_111_111_1(uniques, 8);
+  f_101_011_001_000_0(uniques, 8);
+  f_101_011_001_000_1(uniques, 8);
+  f_101_011_001_001_0(uniques, 8);
+  f_101_011_001_001_1(uniques, 8);
+  f_101_011_001_010_0(uniques, 8);
+  f_101_011_001_010_1(uniques, 8);
+  f_101_011_001_011_0(uniques, 8);
+  f_101_011_001_011_1(uniques, 8);
+  f_101_011_001_100_0(uniques, 8);
+  f_101_011_001_100_1(uniques, 8);
+  f_101_011_001_101_0(uniques, 8);
+  f_101_011_001_101_1(uniques, 8);
+  f_101_011_001_110_0(uniques, 8);
+  f_101_011_001_110_1(uniques, 8);
+  f_101_011_001_111_0(uniques, 8);
+  f_101_011_001_111_1(uniques, 8);
+  f_101_011_011_000_0(uniques, 8);
+  f_101_011_011_000_1(uniques, 8);
+  f_101_011_011_001_0(uniques, 8);
+  f_101_011_011_001_1(uniques, 8);
+  f_101_011_011_010_0(uniques, 8);
+  f_101_011_011_010_1(uniques, 8);
+  f_101_011_011_011_0(uniques, 8);
+  f_101_011_011_011_1(uniques, 8);
+  f_101_011_011_100_0(uniques, 8);
+  f_101_011_011_100_1(uniques, 8);
+  f_101_011_011_101_0(uniques, 8);
+  f_101_011_011_101_1(uniques, 8);
+  f_101_011_011_110_0(uniques, 8);
+  f_101_011_011_110_1(uniques, 8);
+  f_101_011_011_111_0(uniques, 8);
+  f_101_011_011_111_1(uniques, 8);
+  f_101_011_101_000_0(uniques, 8);
+  f_101_011_101_000_1(uniques, 8);
+  f_101_011_101_001_0(uniques, 8);
+  f_101_011_101_001_1(uniques, 8);
+  f_101_011_101_010_0(uniques, 8);
+  f_101_011_101_010_1(uniques, 8);
+  f_101_011_101_011_0(uniques, 8);
+  f_101_011_101_011_1(uniques, 8);
+  f_101_011_101_100_0(uniques, 8);
+  f_101_011_101_100_1(uniques, 8);
+  f_101_011_101_101_0(uniques, 8);
+  f_101_011_101_101_1(uniques, 8);
+  f_101_011_101_110_0(uniques, 8);
+  f_101_011_101_110_1(uniques, 8);
+  f_101_011_101_111_0(uniques, 8);
+  f_101_011_101_111_1(uniques, 8);
+  f_101_011_111_000_0(uniques, 8);
+  f_101_011_111_000_1(uniques, 8);
+  f_101_011_111_001_0(uniques, 8);
+  f_101_011_111_001_1(uniques, 8);
+  f_101_011_111_010_0(uniques, 8);
+  f_101_011_111_010_1(uniques, 8);
+  f_101_011_111_011_0(uniques, 8);
+  f_101_011_111_011_1(uniques, 8);
+  f_101_011_111_100_0(uniques, 8);
+  f_101_011_111_100_1(uniques, 8);
+  f_101_011_111_101_0(uniques, 8);
+  f_101_011_111_101_1(uniques, 8);
+  f_101_011_111_110_0(uniques, 8);
+  f_101_011_111_110_1(uniques, 8);
+  f_101_011_111_111_0(uniques, 8);
+  f_101_011_111_111_1(uniques, 8);
+  f_101_100_001_000_0(uniques, 8);
+  f_101_100_001_000_1(uniques, 8);
+  f_101_100_001_001_0(uniques, 8);
+  f_101_100_001_001_1(uniques, 8);
+  f_101_100_001_010_0(uniques, 8);
+  f_101_100_001_010_1(uniques, 8);
+  f_101_100_001_011_0(uniques, 8);
+  f_101_100_001_011_1(uniques, 8);
+  f_101_100_001_100_0(uniques, 8);
+  f_101_100_001_100_1(uniques, 8);
+  f_101_100_001_101_0(uniques, 8);
+  f_101_100_001_101_1(uniques, 8);
+  f_101_100_001_110_0(uniques, 8);
+  f_101_100_001_110_1(uniques, 8);
+  f_101_100_001_111_0(uniques, 8);
+  f_101_100_001_111_1(uniques, 8);
+  f_101_100_011_000_0(uniques, 8);
+  f_101_100_011_000_1(uniques, 8);
+  f_101_100_011_001_0(uniques, 8);
+  f_101_100_011_001_1(uniques, 8);
+  f_101_100_011_010_0(uniques, 8);
+  f_101_100_011_010_1(uniques, 8);
+  f_101_100_011_011_0(uniques, 8);
+  f_101_100_011_011_1(uniques, 8);
+  f_101_100_011_100_0(uniques, 8);
+  f_101_100_011_100_1(uniques, 8);
+  f_101_100_011_101_0(uniques, 8);
+  f_101_100_011_101_1(uniques, 8);
+  f_101_100_011_110_0(uniques, 8);
+  f_101_100_011_110_1(uniques, 8);
+  f_101_100_011_111_0(uniques, 8);
+  f_101_100_011_111_1(uniques, 8);
+  f_101_100_101_000_0(uniques, 8);
+  f_101_100_101_000_1(uniques, 8);
+  f_101_100_101_001_0(uniques, 8);
+  f_101_100_101_001_1(uniques, 8);
+  f_101_100_101_010_0(uniques, 8);
+  f_101_100_101_010_1(uniques, 8);
+  f_101_100_101_011_0(uniques, 8);
+  f_101_100_101_011_1(uniques, 8);
+  f_101_100_101_100_0(uniques, 8);
+  f_101_100_101_100_1(uniques, 8);
+  f_101_100_101_101_0(uniques, 8);
+  f_101_100_101_101_1(uniques, 8);
+  f_101_100_101_110_0(uniques, 8);
+  f_101_100_101_110_1(uniques, 8);
+  f_101_100_101_111_0(uniques, 8);
+  f_101_100_101_111_1(uniques, 8);
+  f_101_100_111_000_0(uniques, 8);
+  f_101_100_111_000_1(uniques, 8);
+  f_101_100_111_001_0(uniques, 8);
+  f_101_100_111_001_1(uniques, 8);
+  f_101_100_111_010_0(uniques, 8);
+  f_101_100_111_010_1(uniques, 8);
+  f_101_100_111_011_0(uniques, 8);
+  f_101_100_111_011_1(uniques, 8);
+  f_101_100_111_100_0(uniques, 8);
+  f_101_100_111_100_1(uniques, 8);
+  f_101_100_111_101_0(uniques, 8);
+  f_101_100_111_101_1(uniques, 8);
+  f_101_100_111_110_0(uniques, 8);
+  f_101_100_111_110_1(uniques, 8);
+  f_101_100_111_111_0(uniques, 8);
+  f_101_100_111_111_1(uniques, 8);
+  f_101_101_001_000_0(uniques, 8);
+  f_101_101_001_000_1(uniques, 8);
+  f_101_101_001_001_0(uniques, 8);
+  f_101_101_001_001_1(uniques, 8);
+  f_101_101_001_010_0(uniques, 8);
+  f_101_101_001_010_1(uniques, 8);
+  f_101_101_001_011_0(uniques, 8);
+  f_101_101_001_011_1(uniques, 8);
+  f_101_101_001_100_0(uniques, 8);
+  f_101_101_001_100_1(uniques, 8);
+  f_101_101_001_101_0(uniques, 8);
+  f_101_101_001_101_1(uniques, 8);
+  f_101_101_001_110_0(uniques, 8);
+  f_101_101_001_110_1(uniques, 8);
+  f_101_101_001_111_0(uniques, 8);
+  f_101_101_001_111_1(uniques, 8);
+  f_101_101_011_000_0(uniques, 8);
+  f_101_101_011_000_1(uniques, 8);
+  f_101_101_011_001_0(uniques, 8);
+  f_101_101_011_001_1(uniques, 8);
+  f_101_101_011_010_0(uniques, 8);
+  f_101_101_011_010_1(uniques, 8);
+  f_101_101_011_011_0(uniques, 8);
+  f_101_101_011_011_1(uniques, 8);
+  f_101_101_011_100_0(uniques, 8);
+  f_101_101_011_100_1(uniques, 8);
+  f_101_101_011_101_0(uniques, 8);
+  f_101_101_011_101_1(uniques, 8);
+  f_101_101_011_110_0(uniques, 8);
+  f_101_101_011_110_1(uniques, 8);
+  f_101_101_011_111_0(uniques, 8);
+  f_101_101_011_111_1(uniques, 8);
+  f_101_101_101_000_0(uniques, 8);
+  f_101_101_101_000_1(uniques, 8);
+  f_101_101_101_001_0(uniques, 8);
+  f_101_101_101_001_1(uniques, 8);
+  f_101_101_101_010_0(uniques, 8);
+  f_101_101_101_010_1(uniques, 8);
+  f_101_101_101_011_0(uniques, 8);
+  f_101_101_101_011_1(uniques, 8);
+  f_101_101_101_100_0(uniques, 8);
+  f_101_101_101_100_1(uniques, 8);
+  f_101_101_101_101_0(uniques, 8);
+  f_101_101_101_101_1(uniques, 8);
+  f_101_101_101_110_0(uniques, 8);
+  f_101_101_101_110_1(uniques, 8);
+  f_101_101_101_111_0(uniques, 8);
+  f_101_101_101_111_1(uniques, 8);
+  f_101_101_111_000_0(uniques, 8);
+  f_101_101_111_000_1(uniques, 8);
+  f_101_101_111_001_0(uniques, 8);
+  f_101_101_111_001_1(uniques, 8);
+  f_101_101_111_010_0(uniques, 8);
+  f_101_101_111_010_1(uniques, 8);
+  f_101_101_111_011_0(uniques, 8);
+  f_101_101_111_011_1(uniques, 8);
+  f_101_101_111_100_0(uniques, 8);
+  f_101_101_111_100_1(uniques, 8);
+  f_101_101_111_101_0(uniques, 8);
+  f_101_101_111_101_1(uniques, 8);
+  f_101_101_111_110_0(uniques, 8);
+  f_101_101_111_110_1(uniques, 8);
+  f_101_101_111_111_0(uniques, 8);
+  f_101_101_111_111_1(uniques, 8);
+  f_101_110_001_000_0(uniques, 8);
+  f_101_110_001_000_1(uniques, 8);
+  f_101_110_001_001_0(uniques, 8);
+  f_101_110_001_001_1(uniques, 8);
+  f_101_110_001_010_0(uniques, 8);
+  f_101_110_001_010_1(uniques, 8);
+  f_101_110_001_011_0(uniques, 8);
+  f_101_110_001_011_1(uniques, 8);
+  f_101_110_001_100_0(uniques, 8);
+  f_101_110_001_100_1(uniques, 8);
+  f_101_110_001_101_0(uniques, 8);
+  f_101_110_001_101_1(uniques, 8);
+  f_101_110_001_110_0(uniques, 8);
+  f_101_110_001_110_1(uniques, 8);
+  f_101_110_001_111_0(uniques, 8);
+  f_101_110_001_111_1(uniques, 8);
+  f_101_110_011_000_0(uniques, 8);
+  f_101_110_011_000_1(uniques, 8);
+  f_101_110_011_001_0(uniques, 8);
+  f_101_110_011_001_1(uniques, 8);
+  f_101_110_011_010_0(uniques, 8);
+  f_101_110_011_010_1(uniques, 8);
+  f_101_110_011_011_0(uniques, 8);
+  f_101_110_011_011_1(uniques, 8);
+  f_101_110_011_100_0(uniques, 8);
+  f_101_110_011_100_1(uniques, 8);
+  f_101_110_011_101_0(uniques, 8);
+  f_101_110_011_101_1(uniques, 8);
+  f_101_110_011_110_0(uniques, 8);
+  f_101_110_011_110_1(uniques, 8);
+  f_101_110_011_111_0(uniques, 8);
+  f_101_110_011_111_1(uniques, 8);
+  f_101_110_101_000_0(uniques, 8);
+  f_101_110_101_000_1(uniques, 8);
+  f_101_110_101_001_0(uniques, 8);
+  f_101_110_101_001_1(uniques, 8);
+  f_101_110_101_010_0(uniques, 8);
+  f_101_110_101_010_1(uniques, 8);
+  f_101_110_101_011_0(uniques, 8);
+  f_101_110_101_011_1(uniques, 8);
+  f_101_110_101_100_0(uniques, 8);
+  f_101_110_101_100_1(uniques, 8);
+  f_101_110_101_101_0(uniques, 8);
+  f_101_110_101_101_1(uniques, 8);
+  f_101_110_101_110_0(uniques, 8);
+  f_101_110_101_110_1(uniques, 8);
+  f_101_110_101_111_0(uniques, 8);
+  f_101_110_101_111_1(uniques, 8);
+  f_101_110_111_000_0(uniques, 8);
+  f_101_110_111_000_1(uniques, 8);
+  f_101_110_111_001_0(uniques, 8);
+  f_101_110_111_001_1(uniques, 8);
+  f_101_110_111_010_0(uniques, 8);
+  f_101_110_111_010_1(uniques, 8);
+  f_101_110_111_011_0(uniques, 8);
+  f_101_110_111_011_1(uniques, 8);
+  f_101_110_111_100_0(uniques, 8);
+  f_101_110_111_100_1(uniques, 8);
+  f_101_110_111_101_0(uniques, 8);
+  f_101_110_111_101_1(uniques, 8);
+  f_101_110_111_110_0(uniques, 8);
+  f_101_110_111_110_1(uniques, 8);
+  f_101_110_111_111_0(uniques, 8);
+  f_101_110_111_111_1(uniques, 8);
+  f_101_111_001_000_0(uniques, 8);
+  f_101_111_001_000_1(uniques, 8);
+  f_101_111_001_001_0(uniques, 8);
+  f_101_111_001_001_1(uniques, 8);
+  f_101_111_001_010_0(uniques, 8);
+  f_101_111_001_010_1(uniques, 8);
+  f_101_111_001_011_0(uniques, 8);
+  f_101_111_001_011_1(uniques, 8);
+  f_101_111_001_100_0(uniques, 8);
+  f_101_111_001_100_1(uniques, 8);
+  f_101_111_001_101_0(uniques, 8);
+  f_101_111_001_101_1(uniques, 8);
+  f_101_111_001_110_0(uniques, 8);
+  f_101_111_001_110_1(uniques, 8);
+  f_101_111_001_111_0(uniques, 8);
+  f_101_111_001_111_1(uniques, 8);
+  f_101_111_011_000_0(uniques, 8);
+  f_101_111_011_000_1(uniques, 8);
+  f_101_111_011_001_0(uniques, 8);
+  f_101_111_011_001_1(uniques, 8);
+  f_101_111_011_010_0(uniques, 8);
+  f_101_111_011_010_1(uniques, 8);
+  f_101_111_011_011_0(uniques, 8);
+  f_101_111_011_011_1(uniques, 8);
+  f_101_111_011_100_0(uniques, 8);
+  f_101_111_011_100_1(uniques, 8);
+  f_101_111_011_101_0(uniques, 8);
+  f_101_111_011_101_1(uniques, 8);
+  f_101_111_011_110_0(uniques, 8);
+  f_101_111_011_110_1(uniques, 8);
+  f_101_111_011_111_0(uniques, 8);
+  f_101_111_011_111_1(uniques, 8);
+  f_101_111_101_000_0(uniques, 8);
+  f_101_111_101_000_1(uniques, 8);
+  f_101_111_101_001_0(uniques, 8);
+  f_101_111_101_001_1(uniques, 8);
+  f_101_111_101_010_0(uniques, 8);
+  f_101_111_101_010_1(uniques, 8);
+  f_101_111_101_011_0(uniques, 8);
+  f_101_111_101_011_1(uniques, 8);
+  f_101_111_101_100_0(uniques, 8);
+  f_101_111_101_100_1(uniques, 8);
+  f_101_111_101_101_0(uniques, 8);
+  f_101_111_101_101_1(uniques, 8);
+  f_101_111_101_110_0(uniques, 8);
+  f_101_111_101_110_1(uniques, 8);
+  f_101_111_101_111_0(uniques, 8);
+  f_101_111_101_111_1(uniques, 8);
+  f_101_111_111_000_0(uniques, 8);
+  f_101_111_111_000_1(uniques, 8);
+  f_101_111_111_001_0(uniques, 8);
+  f_101_111_111_001_1(uniques, 8);
+  f_101_111_111_010_0(uniques, 8);
+  f_101_111_111_010_1(uniques, 8);
+  f_101_111_111_011_0(uniques, 8);
+  f_101_111_111_011_1(uniques, 8);
+  f_101_111_111_100_0(uniques, 8);
+  f_101_111_111_100_1(uniques, 8);
+  f_101_111_111_101_0(uniques, 8);
+  f_101_111_111_101_1(uniques, 8);
+  f_101_111_111_110_0(uniques, 8);
+  f_101_111_111_110_1(uniques, 8);
+  f_101_111_111_111_0(uniques, 8);
+  f_101_111_111_111_1(uniques, 8);
+  f_110_000_001_000_0(uniques, 8);
+  f_110_000_001_000_1(uniques, 8);
+  f_110_000_001_001_0(uniques, 8);
+  f_110_000_001_001_1(uniques, 8);
+  f_110_000_001_010_0(uniques, 8);
+  f_110_000_001_010_1(uniques, 8);
+  f_110_000_001_011_0(uniques, 8);
+  f_110_000_001_011_1(uniques, 8);
+  f_110_000_001_100_0(uniques, 8);
+  f_110_000_001_100_1(uniques, 8);
+  f_110_000_001_101_0(uniques, 8);
+  f_110_000_001_101_1(uniques, 8);
+  f_110_000_001_110_0(uniques, 8);
+  f_110_000_001_110_1(uniques, 8);
+  f_110_000_001_111_0(uniques, 8);
+  f_110_000_001_111_1(uniques, 8);
+  f_110_000_011_000_0(uniques, 8);
+  f_110_000_011_000_1(uniques, 8);
+  f_110_000_011_001_0(uniques, 8);
+  f_110_000_011_001_1(uniques, 8);
+  f_110_000_011_010_0(uniques, 8);
+  f_110_000_011_010_1(uniques, 8);
+  f_110_000_011_011_0(uniques, 8);
+  f_110_000_011_011_1(uniques, 8);
+  f_110_000_011_100_0(uniques, 8);
+  f_110_000_011_100_1(uniques, 8);
+  f_110_000_011_101_0(uniques, 8);
+  f_110_000_011_101_1(uniques, 8);
+  f_110_000_011_110_0(uniques, 8);
+  f_110_000_011_110_1(uniques, 8);
+  f_110_000_011_111_0(uniques, 8);
+  f_110_000_011_111_1(uniques, 8);
+  f_110_000_101_000_0(uniques, 8);
+  f_110_000_101_000_1(uniques, 8);
+  f_110_000_101_001_0(uniques, 8);
+  f_110_000_101_001_1(uniques, 8);
+  f_110_000_101_010_0(uniques, 8);
+  f_110_000_101_010_1(uniques, 8);
+  f_110_000_101_011_0(uniques, 8);
+  f_110_000_101_011_1(uniques, 8);
+  f_110_000_101_100_0(uniques, 8);
+  f_110_000_101_100_1(uniques, 8);
+  f_110_000_101_101_0(uniques, 8);
+  f_110_000_101_101_1(uniques, 8);
+  f_110_000_101_110_0(uniques, 8);
+  f_110_000_101_110_1(uniques, 8);
+  f_110_000_101_111_0(uniques, 8);
+  f_110_000_101_111_1(uniques, 8);
+  f_110_000_111_000_0(uniques, 8);
+  f_110_000_111_000_1(uniques, 8);
+  f_110_000_111_001_0(uniques, 8);
+  f_110_000_111_001_1(uniques, 8);
+  f_110_000_111_010_0(uniques, 8);
+  f_110_000_111_010_1(uniques, 8);
+  f_110_000_111_011_0(uniques, 8);
+  f_110_000_111_011_1(uniques, 8);
+  f_110_000_111_100_0(uniques, 8);
+  f_110_000_111_100_1(uniques, 8);
+  f_110_000_111_101_0(uniques, 8);
+  f_110_000_111_101_1(uniques, 8);
+  f_110_000_111_110_0(uniques, 8);
+  f_110_000_111_110_1(uniques, 8);
+  f_110_000_111_111_0(uniques, 8);
+  f_110_000_111_111_1(uniques, 8);
+  f_110_001_001_000_0(uniques, 8);
+  f_110_001_001_000_1(uniques, 8);
+  f_110_001_001_001_0(uniques, 8);
+  f_110_001_001_001_1(uniques, 8);
+  f_110_001_001_010_0(uniques, 8);
+  f_110_001_001_010_1(uniques, 8);
+  f_110_001_001_011_0(uniques, 8);
+  f_110_001_001_011_1(uniques, 8);
+  f_110_001_001_100_0(uniques, 8);
+  f_110_001_001_100_1(uniques, 8);
+  f_110_001_001_101_0(uniques, 8);
+  f_110_001_001_101_1(uniques, 8);
+  f_110_001_001_110_0(uniques, 8);
+  f_110_001_001_110_1(uniques, 8);
+  f_110_001_001_111_0(uniques, 8);
+  f_110_001_001_111_1(uniques, 8);
+  f_110_001_011_000_0(uniques, 8);
+  f_110_001_011_000_1(uniques, 8);
+  f_110_001_011_001_0(uniques, 8);
+  f_110_001_011_001_1(uniques, 8);
+  f_110_001_011_010_0(uniques, 8);
+  f_110_001_011_010_1(uniques, 8);
+  f_110_001_011_011_0(uniques, 8);
+  f_110_001_011_011_1(uniques, 8);
+  f_110_001_011_100_0(uniques, 8);
+  f_110_001_011_100_1(uniques, 8);
+  f_110_001_011_101_0(uniques, 8);
+  f_110_001_011_101_1(uniques, 8);
+  f_110_001_011_110_0(uniques, 8);
+  f_110_001_011_110_1(uniques, 8);
+  f_110_001_011_111_0(uniques, 8);
+  f_110_001_011_111_1(uniques, 8);
+  f_110_001_101_000_0(uniques, 8);
+  f_110_001_101_000_1(uniques, 8);
+  f_110_001_101_001_0(uniques, 8);
+  f_110_001_101_001_1(uniques, 8);
+  f_110_001_101_010_0(uniques, 8);
+  f_110_001_101_010_1(uniques, 8);
+  f_110_001_101_011_0(uniques, 8);
+  f_110_001_101_011_1(uniques, 8);
+  f_110_001_101_100_0(uniques, 8);
+  f_110_001_101_100_1(uniques, 8);
+  f_110_001_101_101_0(uniques, 8);
+  f_110_001_101_101_1(uniques, 8);
+  f_110_001_101_110_0(uniques, 8);
+  f_110_001_101_110_1(uniques, 8);
+  f_110_001_101_111_0(uniques, 8);
+  f_110_001_101_111_1(uniques, 8);
+  f_110_001_111_000_0(uniques, 8);
+  f_110_001_111_000_1(uniques, 8);
+  f_110_001_111_001_0(uniques, 8);
+  f_110_001_111_001_1(uniques, 8);
+  f_110_001_111_010_0(uniques, 8);
+  f_110_001_111_010_1(uniques, 8);
+  f_110_001_111_011_0(uniques, 8);
+  f_110_001_111_011_1(uniques, 8);
+  f_110_001_111_100_0(uniques, 8);
+  f_110_001_111_100_1(uniques, 8);
+  f_110_001_111_101_0(uniques, 8);
+  f_110_001_111_101_1(uniques, 8);
+  f_110_001_111_110_0(uniques, 8);
+  f_110_001_111_110_1(uniques, 8);
+  f_110_001_111_111_0(uniques, 8);
+  f_110_001_111_111_1(uniques, 8);
+  f_110_010_001_000_0(uniques, 8);
+  f_110_010_001_000_1(uniques, 8);
+  f_110_010_001_001_0(uniques, 8);
+  f_110_010_001_001_1(uniques, 8);
+  f_110_010_001_010_0(uniques, 8);
+  f_110_010_001_010_1(uniques, 8);
+  f_110_010_001_011_0(uniques, 8);
+  f_110_010_001_011_1(uniques, 8);
+  f_110_010_001_100_0(uniques, 8);
+  f_110_010_001_100_1(uniques, 8);
+  f_110_010_001_101_0(uniques, 8);
+  f_110_010_001_101_1(uniques, 8);
+  f_110_010_001_110_0(uniques, 8);
+  f_110_010_001_110_1(uniques, 8);
+  f_110_010_001_111_0(uniques, 8);
+  f_110_010_001_111_1(uniques, 8);
+  f_110_010_011_000_0(uniques, 8);
+  f_110_010_011_000_1(uniques, 8);
+  f_110_010_011_001_0(uniques, 8);
+  f_110_010_011_001_1(uniques, 8);
+  f_110_010_011_010_0(uniques, 8);
+  f_110_010_011_010_1(uniques, 8);
+  f_110_010_011_011_0(uniques, 8);
+  f_110_010_011_011_1(uniques, 8);
+  f_110_010_011_100_0(uniques, 8);
+  f_110_010_011_100_1(uniques, 8);
+  f_110_010_011_101_0(uniques, 8);
+  f_110_010_011_101_1(uniques, 8);
+  f_110_010_011_110_0(uniques, 8);
+  f_110_010_011_110_1(uniques, 8);
+  f_110_010_011_111_0(uniques, 8);
+  f_110_010_011_111_1(uniques, 8);
+  f_110_010_101_000_0(uniques, 8);
+  f_110_010_101_000_1(uniques, 8);
+  f_110_010_101_001_0(uniques, 8);
+  f_110_010_101_001_1(uniques, 8);
+  f_110_010_101_010_0(uniques, 8);
+  f_110_010_101_010_1(uniques, 8);
+  f_110_010_101_011_0(uniques, 8);
+  f_110_010_101_011_1(uniques, 8);
+  f_110_010_101_100_0(uniques, 8);
+  f_110_010_101_100_1(uniques, 8);
+  f_110_010_101_101_0(uniques, 8);
+  f_110_010_101_101_1(uniques, 8);
+  f_110_010_101_110_0(uniques, 8);
+  f_110_010_101_110_1(uniques, 8);
+  f_110_010_101_111_0(uniques, 8);
+  f_110_010_101_111_1(uniques, 8);
+  f_110_010_111_000_0(uniques, 8);
+  f_110_010_111_000_1(uniques, 8);
+  f_110_010_111_001_0(uniques, 8);
+  f_110_010_111_001_1(uniques, 8);
+  f_110_010_111_010_0(uniques, 8);
+  f_110_010_111_010_1(uniques, 8);
+  f_110_010_111_011_0(uniques, 8);
+  f_110_010_111_011_1(uniques, 8);
+  f_110_010_111_100_0(uniques, 8);
+  f_110_010_111_100_1(uniques, 8);
+  f_110_010_111_101_0(uniques, 8);
+  f_110_010_111_101_1(uniques, 8);
+  f_110_010_111_110_0(uniques, 8);
+  f_110_010_111_110_1(uniques, 8);
+  f_110_010_111_111_0(uniques, 8);
+  f_110_010_111_111_1(uniques, 8);
+  f_110_011_001_000_0(uniques, 8);
+  f_110_011_001_000_1(uniques, 8);
+  f_110_011_001_001_0(uniques, 8);
+  f_110_011_001_001_1(uniques, 8);
+  f_110_011_001_010_0(uniques, 8);
+  f_110_011_001_010_1(uniques, 8);
+  f_110_011_001_011_0(uniques, 8);
+  f_110_011_001_011_1(uniques, 8);
+  f_110_011_001_100_0(uniques, 8);
+  f_110_011_001_100_1(uniques, 8);
+  f_110_011_001_101_0(uniques, 8);
+  f_110_011_001_101_1(uniques, 8);
+  f_110_011_001_110_0(uniques, 8);
+  f_110_011_001_110_1(uniques, 8);
+  f_110_011_001_111_0(uniques, 8);
+  f_110_011_001_111_1(uniques, 8);
+  f_110_011_011_000_0(uniques, 8);
+  f_110_011_011_000_1(uniques, 8);
+  f_110_011_011_001_0(uniques, 8);
+  f_110_011_011_001_1(uniques, 8);
+  f_110_011_011_010_0(uniques, 8);
+  f_110_011_011_010_1(uniques, 8);
+  f_110_011_011_011_0(uniques, 8);
+  f_110_011_011_011_1(uniques, 8);
+  f_110_011_011_100_0(uniques, 8);
+  f_110_011_011_100_1(uniques, 8);
+  f_110_011_011_101_0(uniques, 8);
+  f_110_011_011_101_1(uniques, 8);
+  f_110_011_011_110_0(uniques, 8);
+  f_110_011_011_110_1(uniques, 8);
+  f_110_011_011_111_0(uniques, 8);
+  f_110_011_011_111_1(uniques, 8);
+  f_110_011_101_000_0(uniques, 8);
+  f_110_011_101_000_1(uniques, 8);
+  f_110_011_101_001_0(uniques, 8);
+  f_110_011_101_001_1(uniques, 8);
+  f_110_011_101_010_0(uniques, 8);
+  f_110_011_101_010_1(uniques, 8);
+  f_110_011_101_011_0(uniques, 8);
+  f_110_011_101_011_1(uniques, 8);
+  f_110_011_101_100_0(uniques, 8);
+  f_110_011_101_100_1(uniques, 8);
+  f_110_011_101_101_0(uniques, 8);
+  f_110_011_101_101_1(uniques, 8);
+  f_110_011_101_110_0(uniques, 8);
+  f_110_011_101_110_1(uniques, 8);
+  f_110_011_101_111_0(uniques, 8);
+  f_110_011_101_111_1(uniques, 8);
+  f_110_011_111_000_0(uniques, 8);
+  f_110_011_111_000_1(uniques, 8);
+  f_110_011_111_001_0(uniques, 8);
+  f_110_011_111_001_1(uniques, 8);
+  f_110_011_111_010_0(uniques, 8);
+  f_110_011_111_010_1(uniques, 8);
+  f_110_011_111_011_0(uniques, 8);
+  f_110_011_111_011_1(uniques, 8);
+  f_110_011_111_100_0(uniques, 8);
+  f_110_011_111_100_1(uniques, 8);
+  f_110_011_111_101_0(uniques, 8);
+  f_110_011_111_101_1(uniques, 8);
+  f_110_011_111_110_0(uniques, 8);
+  f_110_011_111_110_1(uniques, 8);
+  f_110_011_111_111_0(uniques, 8);
+  f_110_011_111_111_1(uniques, 8);
+  f_110_100_001_000_0(uniques, 8);
+  f_110_100_001_000_1(uniques, 8);
+  f_110_100_001_001_0(uniques, 8);
+  f_110_100_001_001_1(uniques, 8);
+  f_110_100_001_010_0(uniques, 8);
+  f_110_100_001_010_1(uniques, 8);
+  f_110_100_001_011_0(uniques, 8);
+  f_110_100_001_011_1(uniques, 8);
+  f_110_100_001_100_0(uniques, 8);
+  f_110_100_001_100_1(uniques, 8);
+  f_110_100_001_101_0(uniques, 8);
+  f_110_100_001_101_1(uniques, 8);
+  f_110_100_001_110_0(uniques, 8);
+  f_110_100_001_110_1(uniques, 8);
+  f_110_100_001_111_0(uniques, 8);
+  f_110_100_001_111_1(uniques, 8);
+  f_110_100_011_000_0(uniques, 8);
+  f_110_100_011_000_1(uniques, 8);
+  f_110_100_011_001_0(uniques, 8);
+  f_110_100_011_001_1(uniques, 8);
+  f_110_100_011_010_0(uniques, 8);
+  f_110_100_011_010_1(uniques, 8);
+  f_110_100_011_011_0(uniques, 8);
+  f_110_100_011_011_1(uniques, 8);
+  f_110_100_011_100_0(uniques, 8);
+  f_110_100_011_100_1(uniques, 8);
+  f_110_100_011_101_0(uniques, 8);
+  f_110_100_011_101_1(uniques, 8);
+  f_110_100_011_110_0(uniques, 8);
+  f_110_100_011_110_1(uniques, 8);
+  f_110_100_011_111_0(uniques, 8);
+  f_110_100_011_111_1(uniques, 8);
+  f_110_100_101_000_0(uniques, 8);
+  f_110_100_101_000_1(uniques, 8);
+  f_110_100_101_001_0(uniques, 8);
+  f_110_100_101_001_1(uniques, 8);
+  f_110_100_101_010_0(uniques, 8);
+  f_110_100_101_010_1(uniques, 8);
+  f_110_100_101_011_0(uniques, 8);
+  f_110_100_101_011_1(uniques, 8);
+  f_110_100_101_100_0(uniques, 8);
+  f_110_100_101_100_1(uniques, 8);
+  f_110_100_101_101_0(uniques, 8);
+  f_110_100_101_101_1(uniques, 8);
+  f_110_100_101_110_0(uniques, 8);
+  f_110_100_101_110_1(uniques, 8);
+  f_110_100_101_111_0(uniques, 8);
+  f_110_100_101_111_1(uniques, 8);
+  f_110_100_111_000_0(uniques, 8);
+  f_110_100_111_000_1(uniques, 8);
+  f_110_100_111_001_0(uniques, 8);
+  f_110_100_111_001_1(uniques, 8);
+  f_110_100_111_010_0(uniques, 8);
+  f_110_100_111_010_1(uniques, 8);
+  f_110_100_111_011_0(uniques, 8);
+  f_110_100_111_011_1(uniques, 8);
+  f_110_100_111_100_0(uniques, 8);
+  f_110_100_111_100_1(uniques, 8);
+  f_110_100_111_101_0(uniques, 8);
+  f_110_100_111_101_1(uniques, 8);
+  f_110_100_111_110_0(uniques, 8);
+  f_110_100_111_110_1(uniques, 8);
+  f_110_100_111_111_0(uniques, 8);
+  f_110_100_111_111_1(uniques, 8);
+  f_110_101_001_000_0(uniques, 8);
+  f_110_101_001_000_1(uniques, 8);
+  f_110_101_001_001_0(uniques, 8);
+  f_110_101_001_001_1(uniques, 8);
+  f_110_101_001_010_0(uniques, 8);
+  f_110_101_001_010_1(uniques, 8);
+  f_110_101_001_011_0(uniques, 8);
+  f_110_101_001_011_1(uniques, 8);
+  f_110_101_001_100_0(uniques, 8);
+  f_110_101_001_100_1(uniques, 8);
+  f_110_101_001_101_0(uniques, 8);
+  f_110_101_001_101_1(uniques, 8);
+  f_110_101_001_110_0(uniques, 8);
+  f_110_101_001_110_1(uniques, 8);
+  f_110_101_001_111_0(uniques, 8);
+  f_110_101_001_111_1(uniques, 8);
+  f_110_101_011_000_0(uniques, 8);
+  f_110_101_011_000_1(uniques, 8);
+  f_110_101_011_001_0(uniques, 8);
+  f_110_101_011_001_1(uniques, 8);
+  f_110_101_011_010_0(uniques, 8);
+  f_110_101_011_010_1(uniques, 8);
+  f_110_101_011_011_0(uniques, 8);
+  f_110_101_011_011_1(uniques, 8);
+  f_110_101_011_100_0(uniques, 8);
+  f_110_101_011_100_1(uniques, 8);
+  f_110_101_011_101_0(uniques, 8);
+  f_110_101_011_101_1(uniques, 8);
+  f_110_101_011_110_0(uniques, 8);
+  f_110_101_011_110_1(uniques, 8);
+  f_110_101_011_111_0(uniques, 8);
+  f_110_101_011_111_1(uniques, 8);
+  f_110_101_101_000_0(uniques, 8);
+  f_110_101_101_000_1(uniques, 8);
+  f_110_101_101_001_0(uniques, 8);
+  f_110_101_101_001_1(uniques, 8);
+  f_110_101_101_010_0(uniques, 8);
+  f_110_101_101_010_1(uniques, 8);
+  f_110_101_101_011_0(uniques, 8);
+  f_110_101_101_011_1(uniques, 8);
+  f_110_101_101_100_0(uniques, 8);
+  f_110_101_101_100_1(uniques, 8);
+  f_110_101_101_101_0(uniques, 8);
+  f_110_101_101_101_1(uniques, 8);
+  f_110_101_101_110_0(uniques, 8);
+  f_110_101_101_110_1(uniques, 8);
+  f_110_101_101_111_0(uniques, 8);
+  f_110_101_101_111_1(uniques, 8);
+  f_110_101_111_000_0(uniques, 8);
+  f_110_101_111_000_1(uniques, 8);
+  f_110_101_111_001_0(uniques, 8);
+  f_110_101_111_001_1(uniques, 8);
+  f_110_101_111_010_0(uniques, 8);
+  f_110_101_111_010_1(uniques, 8);
+  f_110_101_111_011_0(uniques, 8);
+  f_110_101_111_011_1(uniques, 8);
+  f_110_101_111_100_0(uniques, 8);
+  f_110_101_111_100_1(uniques, 8);
+  f_110_101_111_101_0(uniques, 8);
+  f_110_101_111_101_1(uniques, 8);
+  f_110_101_111_110_0(uniques, 8);
+  f_110_101_111_110_1(uniques, 8);
+  f_110_101_111_111_0(uniques, 8);
+  f_110_101_111_111_1(uniques, 8);
+  f_110_110_001_000_0(uniques, 8);
+  f_110_110_001_000_1(uniques, 8);
+  f_110_110_001_001_0(uniques, 8);
+  f_110_110_001_001_1(uniques, 8);
+  f_110_110_001_010_0(uniques, 8);
+  f_110_110_001_010_1(uniques, 8);
+  f_110_110_001_011_0(uniques, 8);
+  f_110_110_001_011_1(uniques, 8);
+  f_110_110_001_100_0(uniques, 8);
+  f_110_110_001_100_1(uniques, 8);
+  f_110_110_001_101_0(uniques, 8);
+  f_110_110_001_101_1(uniques, 8);
+  f_110_110_001_110_0(uniques, 8);
+  f_110_110_001_110_1(uniques, 8);
+  f_110_110_001_111_0(uniques, 8);
+  f_110_110_001_111_1(uniques, 8);
+  f_110_110_011_000_0(uniques, 8);
+  f_110_110_011_000_1(uniques, 8);
+  f_110_110_011_001_0(uniques, 8);
+  f_110_110_011_001_1(uniques, 8);
+  f_110_110_011_010_0(uniques, 8);
+  f_110_110_011_010_1(uniques, 8);
+  f_110_110_011_011_0(uniques, 8);
+  f_110_110_011_011_1(uniques, 8);
+  f_110_110_011_100_0(uniques, 8);
+  f_110_110_011_100_1(uniques, 8);
+  f_110_110_011_101_0(uniques, 8);
+  f_110_110_011_101_1(uniques, 8);
+  f_110_110_011_110_0(uniques, 8);
+  f_110_110_011_110_1(uniques, 8);
+  f_110_110_011_111_0(uniques, 8);
+  f_110_110_011_111_1(uniques, 8);
+  f_110_110_101_000_0(uniques, 8);
+  f_110_110_101_000_1(uniques, 8);
+  f_110_110_101_001_0(uniques, 8);
+  f_110_110_101_001_1(uniques, 8);
+  f_110_110_101_010_0(uniques, 8);
+  f_110_110_101_010_1(uniques, 8);
+  f_110_110_101_011_0(uniques, 8);
+  f_110_110_101_011_1(uniques, 8);
+  f_110_110_101_100_0(uniques, 8);
+  f_110_110_101_100_1(uniques, 8);
+  f_110_110_101_101_0(uniques, 8);
+  f_110_110_101_101_1(uniques, 8);
+  f_110_110_101_110_0(uniques, 8);
+  f_110_110_101_110_1(uniques, 8);
+  f_110_110_101_111_0(uniques, 8);
+  f_110_110_101_111_1(uniques, 8);
+  f_110_110_111_000_0(uniques, 8);
+  f_110_110_111_000_1(uniques, 8);
+  f_110_110_111_001_0(uniques, 8);
+  f_110_110_111_001_1(uniques, 8);
+  f_110_110_111_010_0(uniques, 8);
+  f_110_110_111_010_1(uniques, 8);
+  f_110_110_111_011_0(uniques, 8);
+  f_110_110_111_011_1(uniques, 8);
+  f_110_110_111_100_0(uniques, 8);
+  f_110_110_111_100_1(uniques, 8);
+  f_110_110_111_101_0(uniques, 8);
+  f_110_110_111_101_1(uniques, 8);
+  f_110_110_111_110_0(uniques, 8);
+  f_110_110_111_110_1(uniques, 8);
+  f_110_110_111_111_0(uniques, 8);
+  f_110_110_111_111_1(uniques, 8);
+  f_110_111_001_000_0(uniques, 8);
+  f_110_111_001_000_1(uniques, 8);
+  f_110_111_001_001_0(uniques, 8);
+  f_110_111_001_001_1(uniques, 8);
+  f_110_111_001_010_0(uniques, 8);
+  f_110_111_001_010_1(uniques, 8);
+  f_110_111_001_011_0(uniques, 8);
+  f_110_111_001_011_1(uniques, 8);
+  f_110_111_001_100_0(uniques, 8);
+  f_110_111_001_100_1(uniques, 8);
+  f_110_111_001_101_0(uniques, 8);
+  f_110_111_001_101_1(uniques, 8);
+  f_110_111_001_110_0(uniques, 8);
+  f_110_111_001_110_1(uniques, 8);
+  f_110_111_001_111_0(uniques, 8);
+  f_110_111_001_111_1(uniques, 8);
+  f_110_111_011_000_0(uniques, 8);
+  f_110_111_011_000_1(uniques, 8);
+  f_110_111_011_001_0(uniques, 8);
+  f_110_111_011_001_1(uniques, 8);
+  f_110_111_011_010_0(uniques, 8);
+  f_110_111_011_010_1(uniques, 8);
+  f_110_111_011_011_0(uniques, 8);
+  f_110_111_011_011_1(uniques, 8);
+  f_110_111_011_100_0(uniques, 8);
+  f_110_111_011_100_1(uniques, 8);
+  f_110_111_011_101_0(uniques, 8);
+  f_110_111_011_101_1(uniques, 8);
+  f_110_111_011_110_0(uniques, 8);
+  f_110_111_011_110_1(uniques, 8);
+  f_110_111_011_111_0(uniques, 8);
+  f_110_111_011_111_1(uniques, 8);
+  f_110_111_101_000_0(uniques, 8);
+  f_110_111_101_000_1(uniques, 8);
+  f_110_111_101_001_0(uniques, 8);
+  f_110_111_101_001_1(uniques, 8);
+  f_110_111_101_010_0(uniques, 8);
+  f_110_111_101_010_1(uniques, 8);
+  f_110_111_101_011_0(uniques, 8);
+  f_110_111_101_011_1(uniques, 8);
+  f_110_111_101_100_0(uniques, 8);
+  f_110_111_101_100_1(uniques, 8);
+  f_110_111_101_101_0(uniques, 8);
+  f_110_111_101_101_1(uniques, 8);
+  f_110_111_101_110_0(uniques, 8);
+  f_110_111_101_110_1(uniques, 8);
+  f_110_111_101_111_0(uniques, 8);
+  f_110_111_101_111_1(uniques, 8);
+  f_110_111_111_000_0(uniques, 8);
+  f_110_111_111_000_1(uniques, 8);
+  f_110_111_111_001_0(uniques, 8);
+  f_110_111_111_001_1(uniques, 8);
+  f_110_111_111_010_0(uniques, 8);
+  f_110_111_111_010_1(uniques, 8);
+  f_110_111_111_011_0(uniques, 8);
+  f_110_111_111_011_1(uniques, 8);
+  f_110_111_111_100_0(uniques, 8);
+  f_110_111_111_100_1(uniques, 8);
+  f_110_111_111_101_0(uniques, 8);
+  f_110_111_111_101_1(uniques, 8);
+  f_110_111_111_110_0(uniques, 8);
+  f_110_111_111_110_1(uniques, 8);
+  f_110_111_111_111_0(uniques, 8);
+  f_110_111_111_111_1(uniques, 8);
+  f_111_000_001_000_0(uniques, 8);
+  f_111_000_001_000_1(uniques, 8);
+  f_111_000_001_001_0(uniques, 8);
+  f_111_000_001_001_1(uniques, 8);
+  f_111_000_001_010_0(uniques, 8);
+  f_111_000_001_010_1(uniques, 8);
+  f_111_000_001_011_0(uniques, 8);
+  f_111_000_001_011_1(uniques, 8);
+  f_111_000_001_100_0(uniques, 8);
+  f_111_000_001_100_1(uniques, 8);
+  f_111_000_001_101_0(uniques, 8);
+  f_111_000_001_101_1(uniques, 8);
+  f_111_000_001_110_0(uniques, 8);
+  f_111_000_001_110_1(uniques, 8);
+  f_111_000_001_111_0(uniques, 8);
+  f_111_000_001_111_1(uniques, 8);
+  f_111_000_011_000_0(uniques, 8);
+  f_111_000_011_000_1(uniques, 8);
+  f_111_000_011_001_0(uniques, 8);
+  f_111_000_011_001_1(uniques, 8);
+  f_111_000_011_010_0(uniques, 8);
+  f_111_000_011_010_1(uniques, 8);
+  f_111_000_011_011_0(uniques, 8);
+  f_111_000_011_011_1(uniques, 8);
+  f_111_000_011_100_0(uniques, 8);
+  f_111_000_011_100_1(uniques, 8);
+  f_111_000_011_101_0(uniques, 8);
+  f_111_000_011_101_1(uniques, 8);
+  f_111_000_011_110_0(uniques, 8);
+  f_111_000_011_110_1(uniques, 8);
+  f_111_000_011_111_0(uniques, 8);
+  f_111_000_011_111_1(uniques, 8);
+  f_111_000_101_000_0(uniques, 8);
+  f_111_000_101_000_1(uniques, 8);
+  f_111_000_101_001_0(uniques, 8);
+  f_111_000_101_001_1(uniques, 8);
+  f_111_000_101_010_0(uniques, 8);
+  f_111_000_101_010_1(uniques, 8);
+  f_111_000_101_011_0(uniques, 8);
+  f_111_000_101_011_1(uniques, 8);
+  f_111_000_101_100_0(uniques, 8);
+  f_111_000_101_100_1(uniques, 8);
+  f_111_000_101_101_0(uniques, 8);
+  f_111_000_101_101_1(uniques, 8);
+  f_111_000_101_110_0(uniques, 8);
+  f_111_000_101_110_1(uniques, 8);
+  f_111_000_101_111_0(uniques, 8);
+  f_111_000_101_111_1(uniques, 8);
+  f_111_000_111_000_0(uniques, 8);
+  f_111_000_111_000_1(uniques, 8);
+  f_111_000_111_001_0(uniques, 8);
+  f_111_000_111_001_1(uniques, 8);
+  f_111_000_111_010_0(uniques, 8);
+  f_111_000_111_010_1(uniques, 8);
+  f_111_000_111_011_0(uniques, 8);
+  f_111_000_111_011_1(uniques, 8);
+  f_111_000_111_100_0(uniques, 8);
+  f_111_000_111_100_1(uniques, 8);
+  f_111_000_111_101_0(uniques, 8);
+  f_111_000_111_101_1(uniques, 8);
+  f_111_000_111_110_0(uniques, 8);
+  f_111_000_111_110_1(uniques, 8);
+  f_111_000_111_111_0(uniques, 8);
+  f_111_000_111_111_1(uniques, 8);
+  f_111_001_001_000_0(uniques, 8);
+  f_111_001_001_000_1(uniques, 8);
+  f_111_001_001_001_0(uniques, 8);
+  f_111_001_001_001_1(uniques, 8);
+  f_111_001_001_010_0(uniques, 8);
+  f_111_001_001_010_1(uniques, 8);
+  f_111_001_001_011_0(uniques, 8);
+  f_111_001_001_011_1(uniques, 8);
+  f_111_001_001_100_0(uniques, 8);
+  f_111_001_001_100_1(uniques, 8);
+  f_111_001_001_101_0(uniques, 8);
+  f_111_001_001_101_1(uniques, 8);
+  f_111_001_001_110_0(uniques, 8);
+  f_111_001_001_110_1(uniques, 8);
+  f_111_001_001_111_0(uniques, 8);
+  f_111_001_001_111_1(uniques, 8);
+  f_111_001_011_000_0(uniques, 8);
+  f_111_001_011_000_1(uniques, 8);
+  f_111_001_011_001_0(uniques, 8);
+  f_111_001_011_001_1(uniques, 8);
+  f_111_001_011_010_0(uniques, 8);
+  f_111_001_011_010_1(uniques, 8);
+  f_111_001_011_011_0(uniques, 8);
+  f_111_001_011_011_1(uniques, 8);
+  f_111_001_011_100_0(uniques, 8);
+  f_111_001_011_100_1(uniques, 8);
+  f_111_001_011_101_0(uniques, 8);
+  f_111_001_011_101_1(uniques, 8);
+  f_111_001_011_110_0(uniques, 8);
+  f_111_001_011_110_1(uniques, 8);
+  f_111_001_011_111_0(uniques, 8);
+  f_111_001_011_111_1(uniques, 8);
+  f_111_001_101_000_0(uniques, 8);
+  f_111_001_101_000_1(uniques, 8);
+  f_111_001_101_001_0(uniques, 8);
+  f_111_001_101_001_1(uniques, 8);
+  f_111_001_101_010_0(uniques, 8);
+  f_111_001_101_010_1(uniques, 8);
+  f_111_001_101_011_0(uniques, 8);
+  f_111_001_101_011_1(uniques, 8);
+  f_111_001_101_100_0(uniques, 8);
+  f_111_001_101_100_1(uniques, 8);
+  f_111_001_101_101_0(uniques, 8);
+  f_111_001_101_101_1(uniques, 8);
+  f_111_001_101_110_0(uniques, 8);
+  f_111_001_101_110_1(uniques, 8);
+  f_111_001_101_111_0(uniques, 8);
+  f_111_001_101_111_1(uniques, 8);
+  f_111_001_111_000_0(uniques, 8);
+  f_111_001_111_000_1(uniques, 8);
+  f_111_001_111_001_0(uniques, 8);
+  f_111_001_111_001_1(uniques, 8);
+  f_111_001_111_010_0(uniques, 8);
+  f_111_001_111_010_1(uniques, 8);
+  f_111_001_111_011_0(uniques, 8);
+  f_111_001_111_011_1(uniques, 8);
+  f_111_001_111_100_0(uniques, 8);
+  f_111_001_111_100_1(uniques, 8);
+  f_111_001_111_101_0(uniques, 8);
+  f_111_001_111_101_1(uniques, 8);
+  f_111_001_111_110_0(uniques, 8);
+  f_111_001_111_110_1(uniques, 8);
+  f_111_001_111_111_0(uniques, 8);
+  f_111_001_111_111_1(uniques, 8);
+  f_111_010_001_000_0(uniques, 8);
+  f_111_010_001_000_1(uniques, 8);
+  f_111_010_001_001_0(uniques, 8);
+  f_111_010_001_001_1(uniques, 8);
+  f_111_010_001_010_0(uniques, 8);
+  f_111_010_001_010_1(uniques, 8);
+  f_111_010_001_011_0(uniques, 8);
+  f_111_010_001_011_1(uniques, 8);
+  f_111_010_001_100_0(uniques, 8);
+  f_111_010_001_100_1(uniques, 8);
+  f_111_010_001_101_0(uniques, 8);
+  f_111_010_001_101_1(uniques, 8);
+  f_111_010_001_110_0(uniques, 8);
+  f_111_010_001_110_1(uniques, 8);
+  f_111_010_001_111_0(uniques, 8);
+  f_111_010_001_111_1(uniques, 8);
+  f_111_010_011_000_0(uniques, 8);
+  f_111_010_011_000_1(uniques, 8);
+  f_111_010_011_001_0(uniques, 8);
+  f_111_010_011_001_1(uniques, 8);
+  f_111_010_011_010_0(uniques, 8);
+  f_111_010_011_010_1(uniques, 8);
+  f_111_010_011_011_0(uniques, 8);
+  f_111_010_011_011_1(uniques, 8);
+  f_111_010_011_100_0(uniques, 8);
+  f_111_010_011_100_1(uniques, 8);
+  f_111_010_011_101_0(uniques, 8);
+  f_111_010_011_101_1(uniques, 8);
+  f_111_010_011_110_0(uniques, 8);
+  f_111_010_011_110_1(uniques, 8);
+  f_111_010_011_111_0(uniques, 8);
+  f_111_010_011_111_1(uniques, 8);
+  f_111_010_101_000_0(uniques, 8);
+  f_111_010_101_000_1(uniques, 8);
+  f_111_010_101_001_0(uniques, 8);
+  f_111_010_101_001_1(uniques, 8);
+  f_111_010_101_010_0(uniques, 8);
+  f_111_010_101_010_1(uniques, 8);
+  f_111_010_101_011_0(uniques, 8);
+  f_111_010_101_011_1(uniques, 8);
+  f_111_010_101_100_0(uniques, 8);
+  f_111_010_101_100_1(uniques, 8);
+  f_111_010_101_101_0(uniques, 8);
+  f_111_010_101_101_1(uniques, 8);
+  f_111_010_101_110_0(uniques, 8);
+  f_111_010_101_110_1(uniques, 8);
+  f_111_010_101_111_0(uniques, 8);
+  f_111_010_101_111_1(uniques, 8);
+  f_111_010_111_000_0(uniques, 8);
+  f_111_010_111_000_1(uniques, 8);
+  f_111_010_111_001_0(uniques, 8);
+  f_111_010_111_001_1(uniques, 8);
+  f_111_010_111_010_0(uniques, 8);
+  f_111_010_111_010_1(uniques, 8);
+  f_111_010_111_011_0(uniques, 8);
+  f_111_010_111_011_1(uniques, 8);
+  f_111_010_111_100_0(uniques, 8);
+  f_111_010_111_100_1(uniques, 8);
+  f_111_010_111_101_0(uniques, 8);
+  f_111_010_111_101_1(uniques, 8);
+  f_111_010_111_110_0(uniques, 8);
+  f_111_010_111_110_1(uniques, 8);
+  f_111_010_111_111_0(uniques, 8);
+  f_111_010_111_111_1(uniques, 8);
+  f_111_011_001_000_0(uniques, 8);
+  f_111_011_001_000_1(uniques, 8);
+  f_111_011_001_001_0(uniques, 8);
+  f_111_011_001_001_1(uniques, 8);
+  f_111_011_001_010_0(uniques, 8);
+  f_111_011_001_010_1(uniques, 8);
+  f_111_011_001_011_0(uniques, 8);
+  f_111_011_001_011_1(uniques, 8);
+  f_111_011_001_100_0(uniques, 8);
+  f_111_011_001_100_1(uniques, 8);
+  f_111_011_001_101_0(uniques, 8);
+  f_111_011_001_101_1(uniques, 8);
+  f_111_011_001_110_0(uniques, 8);
+  f_111_011_001_110_1(uniques, 8);
+  f_111_011_001_111_0(uniques, 8);
+  f_111_011_001_111_1(uniques, 8);
+  f_111_011_011_000_0(uniques, 8);
+  f_111_011_011_000_1(uniques, 8);
+  f_111_011_011_001_0(uniques, 8);
+  f_111_011_011_001_1(uniques, 8);
+  f_111_011_011_010_0(uniques, 8);
+  f_111_011_011_010_1(uniques, 8);
+  f_111_011_011_011_0(uniques, 8);
+  f_111_011_011_011_1(uniques, 8);
+  f_111_011_011_100_0(uniques, 8);
+  f_111_011_011_100_1(uniques, 8);
+  f_111_011_011_101_0(uniques, 8);
+  f_111_011_011_101_1(uniques, 8);
+  f_111_011_011_110_0(uniques, 8);
+  f_111_011_011_110_1(uniques, 8);
+  f_111_011_011_111_0(uniques, 8);
+  f_111_011_011_111_1(uniques, 8);
+  f_111_011_101_000_0(uniques, 8);
+  f_111_011_101_000_1(uniques, 8);
+  f_111_011_101_001_0(uniques, 8);
+  f_111_011_101_001_1(uniques, 8);
+  f_111_011_101_010_0(uniques, 8);
+  f_111_011_101_010_1(uniques, 8);
+  f_111_011_101_011_0(uniques, 8);
+  f_111_011_101_011_1(uniques, 8);
+  f_111_011_101_100_0(uniques, 8);
+  f_111_011_101_100_1(uniques, 8);
+  f_111_011_101_101_0(uniques, 8);
+  f_111_011_101_101_1(uniques, 8);
+  f_111_011_101_110_0(uniques, 8);
+  f_111_011_101_110_1(uniques, 8);
+  f_111_011_101_111_0(uniques, 8);
+  f_111_011_101_111_1(uniques, 8);
+  f_111_011_111_000_0(uniques, 8);
+  f_111_011_111_000_1(uniques, 8);
+  f_111_011_111_001_0(uniques, 8);
+  f_111_011_111_001_1(uniques, 8);
+  f_111_011_111_010_0(uniques, 8);
+  f_111_011_111_010_1(uniques, 8);
+  f_111_011_111_011_0(uniques, 8);
+  f_111_011_111_011_1(uniques, 8);
+  f_111_011_111_100_0(uniques, 8);
+  f_111_011_111_100_1(uniques, 8);
+  f_111_011_111_101_0(uniques, 8);
+  f_111_011_111_101_1(uniques, 8);
+  f_111_011_111_110_0(uniques, 8);
+  f_111_011_111_110_1(uniques, 8);
+  f_111_011_111_111_0(uniques, 8);
+  f_111_011_111_111_1(uniques, 8);
+  f_111_100_001_000_0(uniques, 8);
+  f_111_100_001_000_1(uniques, 8);
+  f_111_100_001_001_0(uniques, 8);
+  f_111_100_001_001_1(uniques, 8);
+  f_111_100_001_010_0(uniques, 8);
+  f_111_100_001_010_1(uniques, 8);
+  f_111_100_001_011_0(uniques, 8);
+  f_111_100_001_011_1(uniques, 8);
+  f_111_100_001_100_0(uniques, 8);
+  f_111_100_001_100_1(uniques, 8);
+  f_111_100_001_101_0(uniques, 8);
+  f_111_100_001_101_1(uniques, 8);
+  f_111_100_001_110_0(uniques, 8);
+  f_111_100_001_110_1(uniques, 8);
+  f_111_100_001_111_0(uniques, 8);
+  f_111_100_001_111_1(uniques, 8);
+  f_111_100_011_000_0(uniques, 8);
+  f_111_100_011_000_1(uniques, 8);
+  f_111_100_011_001_0(uniques, 8);
+  f_111_100_011_001_1(uniques, 8);
+  f_111_100_011_010_0(uniques, 8);
+  f_111_100_011_010_1(uniques, 8);
+  f_111_100_011_011_0(uniques, 8);
+  f_111_100_011_011_1(uniques, 8);
+  f_111_100_011_100_0(uniques, 8);
+  f_111_100_011_100_1(uniques, 8);
+  f_111_100_011_101_0(uniques, 8);
+  f_111_100_011_101_1(uniques, 8);
+  f_111_100_011_110_0(uniques, 8);
+  f_111_100_011_110_1(uniques, 8);
+  f_111_100_011_111_0(uniques, 8);
+  f_111_100_011_111_1(uniques, 8);
+  f_111_100_101_000_0(uniques, 8);
+  f_111_100_101_000_1(uniques, 8);
+  f_111_100_101_001_0(uniques, 8);
+  f_111_100_101_001_1(uniques, 8);
+  f_111_100_101_010_0(uniques, 8);
+  f_111_100_101_010_1(uniques, 8);
+  f_111_100_101_011_0(uniques, 8);
+  f_111_100_101_011_1(uniques, 8);
+  f_111_100_101_100_0(uniques, 8);
+  f_111_100_101_100_1(uniques, 8);
+  f_111_100_101_101_0(uniques, 8);
+  f_111_100_101_101_1(uniques, 8);
+  f_111_100_101_110_0(uniques, 8);
+  f_111_100_101_110_1(uniques, 8);
+  f_111_100_101_111_0(uniques, 8);
+  f_111_100_101_111_1(uniques, 8);
+  f_111_100_111_000_0(uniques, 8);
+  f_111_100_111_000_1(uniques, 8);
+  f_111_100_111_001_0(uniques, 8);
+  f_111_100_111_001_1(uniques, 8);
+  f_111_100_111_010_0(uniques, 8);
+  f_111_100_111_010_1(uniques, 8);
+  f_111_100_111_011_0(uniques, 8);
+  f_111_100_111_011_1(uniques, 8);
+  f_111_100_111_100_0(uniques, 8);
+  f_111_100_111_100_1(uniques, 8);
+  f_111_100_111_101_0(uniques, 8);
+  f_111_100_111_101_1(uniques, 8);
+  f_111_100_111_110_0(uniques, 8);
+  f_111_100_111_110_1(uniques, 8);
+  f_111_100_111_111_0(uniques, 8);
+  f_111_100_111_111_1(uniques, 8);
+  f_111_101_001_000_0(uniques, 8);
+  f_111_101_001_000_1(uniques, 8);
+  f_111_101_001_001_0(uniques, 8);
+  f_111_101_001_001_1(uniques, 8);
+  f_111_101_001_010_0(uniques, 8);
+  f_111_101_001_010_1(uniques, 8);
+  f_111_101_001_011_0(uniques, 8);
+  f_111_101_001_011_1(uniques, 8);
+  f_111_101_001_100_0(uniques, 8);
+  f_111_101_001_100_1(uniques, 8);
+  f_111_101_001_101_0(uniques, 8);
+  f_111_101_001_101_1(uniques, 8);
+  f_111_101_001_110_0(uniques, 8);
+  f_111_101_001_110_1(uniques, 8);
+  f_111_101_001_111_0(uniques, 8);
+  f_111_101_001_111_1(uniques, 8);
+  f_111_101_011_000_0(uniques, 8);
+  f_111_101_011_000_1(uniques, 8);
+  f_111_101_011_001_0(uniques, 8);
+  f_111_101_011_001_1(uniques, 8);
+  f_111_101_011_010_0(uniques, 8);
+  f_111_101_011_010_1(uniques, 8);
+  f_111_101_011_011_0(uniques, 8);
+  f_111_101_011_011_1(uniques, 8);
+  f_111_101_011_100_0(uniques, 8);
+  f_111_101_011_100_1(uniques, 8);
+  f_111_101_011_101_0(uniques, 8);
+  f_111_101_011_101_1(uniques, 8);
+  f_111_101_011_110_0(uniques, 8);
+  f_111_101_011_110_1(uniques, 8);
+  f_111_101_011_111_0(uniques, 8);
+  f_111_101_011_111_1(uniques, 8);
+  f_111_101_101_000_0(uniques, 8);
+  f_111_101_101_000_1(uniques, 8);
+  f_111_101_101_001_0(uniques, 8);
+  f_111_101_101_001_1(uniques, 8);
+  f_111_101_101_010_0(uniques, 8);
+  f_111_101_101_010_1(uniques, 8);
+  f_111_101_101_011_0(uniques, 8);
+  f_111_101_101_011_1(uniques, 8);
+  f_111_101_101_100_0(uniques, 8);
+  f_111_101_101_100_1(uniques, 8);
+  f_111_101_101_101_0(uniques, 8);
+  f_111_101_101_101_1(uniques, 8);
+  f_111_101_101_110_0(uniques, 8);
+  f_111_101_101_110_1(uniques, 8);
+  f_111_101_101_111_0(uniques, 8);
+  f_111_101_101_111_1(uniques, 8);
+  f_111_101_111_000_0(uniques, 8);
+  f_111_101_111_000_1(uniques, 8);
+  f_111_101_111_001_0(uniques, 8);
+  f_111_101_111_001_1(uniques, 8);
+  f_111_101_111_010_0(uniques, 8);
+  f_111_101_111_010_1(uniques, 8);
+  f_111_101_111_011_0(uniques, 8);
+  f_111_101_111_011_1(uniques, 8);
+  f_111_101_111_100_0(uniques, 8);
+  f_111_101_111_100_1(uniques, 8);
+  f_111_101_111_101_0(uniques, 8);
+  f_111_101_111_101_1(uniques, 8);
+  f_111_101_111_110_0(uniques, 8);
+  f_111_101_111_110_1(uniques, 8);
+  f_111_101_111_111_0(uniques, 8);
+  f_111_101_111_111_1(uniques, 8);
+  f_111_110_001_000_0(uniques, 8);
+  f_111_110_001_000_1(uniques, 8);
+  f_111_110_001_001_0(uniques, 8);
+  f_111_110_001_001_1(uniques, 8);
+  f_111_110_001_010_0(uniques, 8);
+  f_111_110_001_010_1(uniques, 8);
+  f_111_110_001_011_0(uniques, 8);
+  f_111_110_001_011_1(uniques, 8);
+  f_111_110_001_100_0(uniques, 8);
+  f_111_110_001_100_1(uniques, 8);
+  f_111_110_001_101_0(uniques, 8);
+  f_111_110_001_101_1(uniques, 8);
+  f_111_110_001_110_0(uniques, 8);
+  f_111_110_001_110_1(uniques, 8);
+  f_111_110_001_111_0(uniques, 8);
+  f_111_110_001_111_1(uniques, 8);
+  f_111_110_011_000_0(uniques, 8);
+  f_111_110_011_000_1(uniques, 8);
+  f_111_110_011_001_0(uniques, 8);
+  f_111_110_011_001_1(uniques, 8);
+  f_111_110_011_010_0(uniques, 8);
+  f_111_110_011_010_1(uniques, 8);
+  f_111_110_011_011_0(uniques, 8);
+  f_111_110_011_011_1(uniques, 8);
+  f_111_110_011_100_0(uniques, 8);
+  f_111_110_011_100_1(uniques, 8);
+  f_111_110_011_101_0(uniques, 8);
+  f_111_110_011_101_1(uniques, 8);
+  f_111_110_011_110_0(uniques, 8);
+  f_111_110_011_110_1(uniques, 8);
+  f_111_110_011_111_0(uniques, 8);
+  f_111_110_011_111_1(uniques, 8);
+  f_111_110_101_000_0(uniques, 8);
+  f_111_110_101_000_1(uniques, 8);
+  f_111_110_101_001_0(uniques, 8);
+  f_111_110_101_001_1(uniques, 8);
+  f_111_110_101_010_0(uniques, 8);
+  f_111_110_101_010_1(uniques, 8);
+  f_111_110_101_011_0(uniques, 8);
+  f_111_110_101_011_1(uniques, 8);
+  f_111_110_101_100_0(uniques, 8);
+  f_111_110_101_100_1(uniques, 8);
+  f_111_110_101_101_0(uniques, 8);
+  f_111_110_101_101_1(uniques, 8);
+  f_111_110_101_110_0(uniques, 8);
+  f_111_110_101_110_1(uniques, 8);
+  f_111_110_101_111_0(uniques, 8);
+  f_111_110_101_111_1(uniques, 8);
+  f_111_110_111_000_0(uniques, 8);
+  f_111_110_111_000_1(uniques, 8);
+  f_111_110_111_001_0(uniques, 8);
+  f_111_110_111_001_1(uniques, 8);
+  f_111_110_111_010_0(uniques, 8);
+  f_111_110_111_010_1(uniques, 8);
+  f_111_110_111_011_0(uniques, 8);
+  f_111_110_111_011_1(uniques, 8);
+  f_111_110_111_100_0(uniques, 8);
+  f_111_110_111_100_1(uniques, 8);
+  f_111_110_111_101_0(uniques, 8);
+  f_111_110_111_101_1(uniques, 8);
+  f_111_110_111_110_0(uniques, 8);
+  f_111_110_111_110_1(uniques, 8);
+  f_111_110_111_111_0(uniques, 8);
+  f_111_110_111_111_1(uniques, 8);
+  f_111_111_001_000_0(uniques, 8);
+  f_111_111_001_000_1(uniques, 8);
+  f_111_111_001_001_0(uniques, 8);
+  f_111_111_001_001_1(uniques, 8);
+  f_111_111_001_010_0(uniques, 8);
+  f_111_111_001_010_1(uniques, 8);
+  f_111_111_001_011_0(uniques, 8);
+  f_111_111_001_011_1(uniques, 8);
+  f_111_111_001_100_0(uniques, 8);
+  f_111_111_001_100_1(uniques, 8);
+  f_111_111_001_101_0(uniques, 8);
+  f_111_111_001_101_1(uniques, 8);
+  f_111_111_001_110_0(uniques, 8);
+  f_111_111_001_110_1(uniques, 8);
+  f_111_111_001_111_0(uniques, 8);
+  f_111_111_001_111_1(uniques, 8);
+  f_111_111_011_000_0(uniques, 8);
+  f_111_111_011_000_1(uniques, 8);
+  f_111_111_011_001_0(uniques, 8);
+  f_111_111_011_001_1(uniques, 8);
+  f_111_111_011_010_0(uniques, 8);
+  f_111_111_011_010_1(uniques, 8);
+  f_111_111_011_011_0(uniques, 8);
+  f_111_111_011_011_1(uniques, 8);
+  f_111_111_011_100_0(uniques, 8);
+  f_111_111_011_100_1(uniques, 8);
+  f_111_111_011_101_0(uniques, 8);
+  f_111_111_011_101_1(uniques, 8);
+  f_111_111_011_110_0(uniques, 8);
+  f_111_111_011_110_1(uniques, 8);
+  f_111_111_011_111_0(uniques, 8);
+  f_111_111_011_111_1(uniques, 8);
+  f_111_111_101_000_0(uniques, 8);
+  f_111_111_101_000_1(uniques, 8);
+  f_111_111_101_001_0(uniques, 8);
+  f_111_111_101_001_1(uniques, 8);
+  f_111_111_101_010_0(uniques, 8);
+  f_111_111_101_010_1(uniques, 8);
+  f_111_111_101_011_0(uniques, 8);
+  f_111_111_101_011_1(uniques, 8);
+  f_111_111_101_100_0(uniques, 8);
+  f_111_111_101_100_1(uniques, 8);
+  f_111_111_101_101_0(uniques, 8);
+  f_111_111_101_101_1(uniques, 8);
+  f_111_111_101_110_0(uniques, 8);
+  f_111_111_101_110_1(uniques, 8);
+  f_111_111_101_111_0(uniques, 8);
+  f_111_111_101_111_1(uniques, 8);
+  f_111_111_111_000_0(uniques, 8);
+  f_111_111_111_000_1(uniques, 8);
+  f_111_111_111_001_0(uniques, 8);
+  f_111_111_111_001_1(uniques, 8);
+  f_111_111_111_010_0(uniques, 8);
+  f_111_111_111_010_1(uniques, 8);
+  f_111_111_111_011_0(uniques, 8);
+  f_111_111_111_011_1(uniques, 8);
+  f_111_111_111_100_0(uniques, 8);
+  f_111_111_111_100_1(uniques, 8);
+  f_111_111_111_101_0(uniques, 8);
+  f_111_111_111_101_1(uniques, 8);
+  f_111_111_111_110_0(uniques, 8);
+  f_111_111_111_110_1(uniques, 8);
+  f_111_111_111_111_0(uniques, 8);
+  f_111_111_111_111_1(uniques, 8);
+  Expect.equals(4096, uniques.length);
+}
diff --git a/tests/dart2js/deferred/many_parts/lib_000_000_010_000_0.dart b/tests/dart2js/deferred/many_parts/lib_000_000_010_000_0.dart
new file mode 100644
index 0000000..f839778
--- /dev/null
+++ b/tests/dart2js/deferred/many_parts/lib_000_000_010_000_0.dart
@@ -0,0 +1,4111 @@
+// Copyright (c) 2020, 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:expect/expect.dart";
+
+import 'libB.dart';
+
+@pragma('dart2js:noInline')
+g_000_000_010_000_0() {
+  Set<String> uniques = {};
+
+  // f_***_***_*1*_***_*;
+  f_000_000_010_000_0(uniques, 7);
+  f_000_000_010_000_1(uniques, 7);
+  f_000_000_010_001_0(uniques, 7);
+  f_000_000_010_001_1(uniques, 7);
+  f_000_000_010_010_0(uniques, 7);
+  f_000_000_010_010_1(uniques, 7);
+  f_000_000_010_011_0(uniques, 7);
+  f_000_000_010_011_1(uniques, 7);
+  f_000_000_010_100_0(uniques, 7);
+  f_000_000_010_100_1(uniques, 7);
+  f_000_000_010_101_0(uniques, 7);
+  f_000_000_010_101_1(uniques, 7);
+  f_000_000_010_110_0(uniques, 7);
+  f_000_000_010_110_1(uniques, 7);
+  f_000_000_010_111_0(uniques, 7);
+  f_000_000_010_111_1(uniques, 7);
+  f_000_000_011_000_0(uniques, 7);
+  f_000_000_011_000_1(uniques, 7);
+  f_000_000_011_001_0(uniques, 7);
+  f_000_000_011_001_1(uniques, 7);
+  f_000_000_011_010_0(uniques, 7);
+  f_000_000_011_010_1(uniques, 7);
+  f_000_000_011_011_0(uniques, 7);
+  f_000_000_011_011_1(uniques, 7);
+  f_000_000_011_100_0(uniques, 7);
+  f_000_000_011_100_1(uniques, 7);
+  f_000_000_011_101_0(uniques, 7);
+  f_000_000_011_101_1(uniques, 7);
+  f_000_000_011_110_0(uniques, 7);
+  f_000_000_011_110_1(uniques, 7);
+  f_000_000_011_111_0(uniques, 7);
+  f_000_000_011_111_1(uniques, 7);
+  f_000_000_110_000_0(uniques, 7);
+  f_000_000_110_000_1(uniques, 7);
+  f_000_000_110_001_0(uniques, 7);
+  f_000_000_110_001_1(uniques, 7);
+  f_000_000_110_010_0(uniques, 7);
+  f_000_000_110_010_1(uniques, 7);
+  f_000_000_110_011_0(uniques, 7);
+  f_000_000_110_011_1(uniques, 7);
+  f_000_000_110_100_0(uniques, 7);
+  f_000_000_110_100_1(uniques, 7);
+  f_000_000_110_101_0(uniques, 7);
+  f_000_000_110_101_1(uniques, 7);
+  f_000_000_110_110_0(uniques, 7);
+  f_000_000_110_110_1(uniques, 7);
+  f_000_000_110_111_0(uniques, 7);
+  f_000_000_110_111_1(uniques, 7);
+  f_000_000_111_000_0(uniques, 7);
+  f_000_000_111_000_1(uniques, 7);
+  f_000_000_111_001_0(uniques, 7);
+  f_000_000_111_001_1(uniques, 7);
+  f_000_000_111_010_0(uniques, 7);
+  f_000_000_111_010_1(uniques, 7);
+  f_000_000_111_011_0(uniques, 7);
+  f_000_000_111_011_1(uniques, 7);
+  f_000_000_111_100_0(uniques, 7);
+  f_000_000_111_100_1(uniques, 7);
+  f_000_000_111_101_0(uniques, 7);
+  f_000_000_111_101_1(uniques, 7);
+  f_000_000_111_110_0(uniques, 7);
+  f_000_000_111_110_1(uniques, 7);
+  f_000_000_111_111_0(uniques, 7);
+  f_000_000_111_111_1(uniques, 7);
+  f_000_001_010_000_0(uniques, 7);
+  f_000_001_010_000_1(uniques, 7);
+  f_000_001_010_001_0(uniques, 7);
+  f_000_001_010_001_1(uniques, 7);
+  f_000_001_010_010_0(uniques, 7);
+  f_000_001_010_010_1(uniques, 7);
+  f_000_001_010_011_0(uniques, 7);
+  f_000_001_010_011_1(uniques, 7);
+  f_000_001_010_100_0(uniques, 7);
+  f_000_001_010_100_1(uniques, 7);
+  f_000_001_010_101_0(uniques, 7);
+  f_000_001_010_101_1(uniques, 7);
+  f_000_001_010_110_0(uniques, 7);
+  f_000_001_010_110_1(uniques, 7);
+  f_000_001_010_111_0(uniques, 7);
+  f_000_001_010_111_1(uniques, 7);
+  f_000_001_011_000_0(uniques, 7);
+  f_000_001_011_000_1(uniques, 7);
+  f_000_001_011_001_0(uniques, 7);
+  f_000_001_011_001_1(uniques, 7);
+  f_000_001_011_010_0(uniques, 7);
+  f_000_001_011_010_1(uniques, 7);
+  f_000_001_011_011_0(uniques, 7);
+  f_000_001_011_011_1(uniques, 7);
+  f_000_001_011_100_0(uniques, 7);
+  f_000_001_011_100_1(uniques, 7);
+  f_000_001_011_101_0(uniques, 7);
+  f_000_001_011_101_1(uniques, 7);
+  f_000_001_011_110_0(uniques, 7);
+  f_000_001_011_110_1(uniques, 7);
+  f_000_001_011_111_0(uniques, 7);
+  f_000_001_011_111_1(uniques, 7);
+  f_000_001_110_000_0(uniques, 7);
+  f_000_001_110_000_1(uniques, 7);
+  f_000_001_110_001_0(uniques, 7);
+  f_000_001_110_001_1(uniques, 7);
+  f_000_001_110_010_0(uniques, 7);
+  f_000_001_110_010_1(uniques, 7);
+  f_000_001_110_011_0(uniques, 7);
+  f_000_001_110_011_1(uniques, 7);
+  f_000_001_110_100_0(uniques, 7);
+  f_000_001_110_100_1(uniques, 7);
+  f_000_001_110_101_0(uniques, 7);
+  f_000_001_110_101_1(uniques, 7);
+  f_000_001_110_110_0(uniques, 7);
+  f_000_001_110_110_1(uniques, 7);
+  f_000_001_110_111_0(uniques, 7);
+  f_000_001_110_111_1(uniques, 7);
+  f_000_001_111_000_0(uniques, 7);
+  f_000_001_111_000_1(uniques, 7);
+  f_000_001_111_001_0(uniques, 7);
+  f_000_001_111_001_1(uniques, 7);
+  f_000_001_111_010_0(uniques, 7);
+  f_000_001_111_010_1(uniques, 7);
+  f_000_001_111_011_0(uniques, 7);
+  f_000_001_111_011_1(uniques, 7);
+  f_000_001_111_100_0(uniques, 7);
+  f_000_001_111_100_1(uniques, 7);
+  f_000_001_111_101_0(uniques, 7);
+  f_000_001_111_101_1(uniques, 7);
+  f_000_001_111_110_0(uniques, 7);
+  f_000_001_111_110_1(uniques, 7);
+  f_000_001_111_111_0(uniques, 7);
+  f_000_001_111_111_1(uniques, 7);
+  f_000_010_010_000_0(uniques, 7);
+  f_000_010_010_000_1(uniques, 7);
+  f_000_010_010_001_0(uniques, 7);
+  f_000_010_010_001_1(uniques, 7);
+  f_000_010_010_010_0(uniques, 7);
+  f_000_010_010_010_1(uniques, 7);
+  f_000_010_010_011_0(uniques, 7);
+  f_000_010_010_011_1(uniques, 7);
+  f_000_010_010_100_0(uniques, 7);
+  f_000_010_010_100_1(uniques, 7);
+  f_000_010_010_101_0(uniques, 7);
+  f_000_010_010_101_1(uniques, 7);
+  f_000_010_010_110_0(uniques, 7);
+  f_000_010_010_110_1(uniques, 7);
+  f_000_010_010_111_0(uniques, 7);
+  f_000_010_010_111_1(uniques, 7);
+  f_000_010_011_000_0(uniques, 7);
+  f_000_010_011_000_1(uniques, 7);
+  f_000_010_011_001_0(uniques, 7);
+  f_000_010_011_001_1(uniques, 7);
+  f_000_010_011_010_0(uniques, 7);
+  f_000_010_011_010_1(uniques, 7);
+  f_000_010_011_011_0(uniques, 7);
+  f_000_010_011_011_1(uniques, 7);
+  f_000_010_011_100_0(uniques, 7);
+  f_000_010_011_100_1(uniques, 7);
+  f_000_010_011_101_0(uniques, 7);
+  f_000_010_011_101_1(uniques, 7);
+  f_000_010_011_110_0(uniques, 7);
+  f_000_010_011_110_1(uniques, 7);
+  f_000_010_011_111_0(uniques, 7);
+  f_000_010_011_111_1(uniques, 7);
+  f_000_010_110_000_0(uniques, 7);
+  f_000_010_110_000_1(uniques, 7);
+  f_000_010_110_001_0(uniques, 7);
+  f_000_010_110_001_1(uniques, 7);
+  f_000_010_110_010_0(uniques, 7);
+  f_000_010_110_010_1(uniques, 7);
+  f_000_010_110_011_0(uniques, 7);
+  f_000_010_110_011_1(uniques, 7);
+  f_000_010_110_100_0(uniques, 7);
+  f_000_010_110_100_1(uniques, 7);
+  f_000_010_110_101_0(uniques, 7);
+  f_000_010_110_101_1(uniques, 7);
+  f_000_010_110_110_0(uniques, 7);
+  f_000_010_110_110_1(uniques, 7);
+  f_000_010_110_111_0(uniques, 7);
+  f_000_010_110_111_1(uniques, 7);
+  f_000_010_111_000_0(uniques, 7);
+  f_000_010_111_000_1(uniques, 7);
+  f_000_010_111_001_0(uniques, 7);
+  f_000_010_111_001_1(uniques, 7);
+  f_000_010_111_010_0(uniques, 7);
+  f_000_010_111_010_1(uniques, 7);
+  f_000_010_111_011_0(uniques, 7);
+  f_000_010_111_011_1(uniques, 7);
+  f_000_010_111_100_0(uniques, 7);
+  f_000_010_111_100_1(uniques, 7);
+  f_000_010_111_101_0(uniques, 7);
+  f_000_010_111_101_1(uniques, 7);
+  f_000_010_111_110_0(uniques, 7);
+  f_000_010_111_110_1(uniques, 7);
+  f_000_010_111_111_0(uniques, 7);
+  f_000_010_111_111_1(uniques, 7);
+  f_000_011_010_000_0(uniques, 7);
+  f_000_011_010_000_1(uniques, 7);
+  f_000_011_010_001_0(uniques, 7);
+  f_000_011_010_001_1(uniques, 7);
+  f_000_011_010_010_0(uniques, 7);
+  f_000_011_010_010_1(uniques, 7);
+  f_000_011_010_011_0(uniques, 7);
+  f_000_011_010_011_1(uniques, 7);
+  f_000_011_010_100_0(uniques, 7);
+  f_000_011_010_100_1(uniques, 7);
+  f_000_011_010_101_0(uniques, 7);
+  f_000_011_010_101_1(uniques, 7);
+  f_000_011_010_110_0(uniques, 7);
+  f_000_011_010_110_1(uniques, 7);
+  f_000_011_010_111_0(uniques, 7);
+  f_000_011_010_111_1(uniques, 7);
+  f_000_011_011_000_0(uniques, 7);
+  f_000_011_011_000_1(uniques, 7);
+  f_000_011_011_001_0(uniques, 7);
+  f_000_011_011_001_1(uniques, 7);
+  f_000_011_011_010_0(uniques, 7);
+  f_000_011_011_010_1(uniques, 7);
+  f_000_011_011_011_0(uniques, 7);
+  f_000_011_011_011_1(uniques, 7);
+  f_000_011_011_100_0(uniques, 7);
+  f_000_011_011_100_1(uniques, 7);
+  f_000_011_011_101_0(uniques, 7);
+  f_000_011_011_101_1(uniques, 7);
+  f_000_011_011_110_0(uniques, 7);
+  f_000_011_011_110_1(uniques, 7);
+  f_000_011_011_111_0(uniques, 7);
+  f_000_011_011_111_1(uniques, 7);
+  f_000_011_110_000_0(uniques, 7);
+  f_000_011_110_000_1(uniques, 7);
+  f_000_011_110_001_0(uniques, 7);
+  f_000_011_110_001_1(uniques, 7);
+  f_000_011_110_010_0(uniques, 7);
+  f_000_011_110_010_1(uniques, 7);
+  f_000_011_110_011_0(uniques, 7);
+  f_000_011_110_011_1(uniques, 7);
+  f_000_011_110_100_0(uniques, 7);
+  f_000_011_110_100_1(uniques, 7);
+  f_000_011_110_101_0(uniques, 7);
+  f_000_011_110_101_1(uniques, 7);
+  f_000_011_110_110_0(uniques, 7);
+  f_000_011_110_110_1(uniques, 7);
+  f_000_011_110_111_0(uniques, 7);
+  f_000_011_110_111_1(uniques, 7);
+  f_000_011_111_000_0(uniques, 7);
+  f_000_011_111_000_1(uniques, 7);
+  f_000_011_111_001_0(uniques, 7);
+  f_000_011_111_001_1(uniques, 7);
+  f_000_011_111_010_0(uniques, 7);
+  f_000_011_111_010_1(uniques, 7);
+  f_000_011_111_011_0(uniques, 7);
+  f_000_011_111_011_1(uniques, 7);
+  f_000_011_111_100_0(uniques, 7);
+  f_000_011_111_100_1(uniques, 7);
+  f_000_011_111_101_0(uniques, 7);
+  f_000_011_111_101_1(uniques, 7);
+  f_000_011_111_110_0(uniques, 7);
+  f_000_011_111_110_1(uniques, 7);
+  f_000_011_111_111_0(uniques, 7);
+  f_000_011_111_111_1(uniques, 7);
+  f_000_100_010_000_0(uniques, 7);
+  f_000_100_010_000_1(uniques, 7);
+  f_000_100_010_001_0(uniques, 7);
+  f_000_100_010_001_1(uniques, 7);
+  f_000_100_010_010_0(uniques, 7);
+  f_000_100_010_010_1(uniques, 7);
+  f_000_100_010_011_0(uniques, 7);
+  f_000_100_010_011_1(uniques, 7);
+  f_000_100_010_100_0(uniques, 7);
+  f_000_100_010_100_1(uniques, 7);
+  f_000_100_010_101_0(uniques, 7);
+  f_000_100_010_101_1(uniques, 7);
+  f_000_100_010_110_0(uniques, 7);
+  f_000_100_010_110_1(uniques, 7);
+  f_000_100_010_111_0(uniques, 7);
+  f_000_100_010_111_1(uniques, 7);
+  f_000_100_011_000_0(uniques, 7);
+  f_000_100_011_000_1(uniques, 7);
+  f_000_100_011_001_0(uniques, 7);
+  f_000_100_011_001_1(uniques, 7);
+  f_000_100_011_010_0(uniques, 7);
+  f_000_100_011_010_1(uniques, 7);
+  f_000_100_011_011_0(uniques, 7);
+  f_000_100_011_011_1(uniques, 7);
+  f_000_100_011_100_0(uniques, 7);
+  f_000_100_011_100_1(uniques, 7);
+  f_000_100_011_101_0(uniques, 7);
+  f_000_100_011_101_1(uniques, 7);
+  f_000_100_011_110_0(uniques, 7);
+  f_000_100_011_110_1(uniques, 7);
+  f_000_100_011_111_0(uniques, 7);
+  f_000_100_011_111_1(uniques, 7);
+  f_000_100_110_000_0(uniques, 7);
+  f_000_100_110_000_1(uniques, 7);
+  f_000_100_110_001_0(uniques, 7);
+  f_000_100_110_001_1(uniques, 7);
+  f_000_100_110_010_0(uniques, 7);
+  f_000_100_110_010_1(uniques, 7);
+  f_000_100_110_011_0(uniques, 7);
+  f_000_100_110_011_1(uniques, 7);
+  f_000_100_110_100_0(uniques, 7);
+  f_000_100_110_100_1(uniques, 7);
+  f_000_100_110_101_0(uniques, 7);
+  f_000_100_110_101_1(uniques, 7);
+  f_000_100_110_110_0(uniques, 7);
+  f_000_100_110_110_1(uniques, 7);
+  f_000_100_110_111_0(uniques, 7);
+  f_000_100_110_111_1(uniques, 7);
+  f_000_100_111_000_0(uniques, 7);
+  f_000_100_111_000_1(uniques, 7);
+  f_000_100_111_001_0(uniques, 7);
+  f_000_100_111_001_1(uniques, 7);
+  f_000_100_111_010_0(uniques, 7);
+  f_000_100_111_010_1(uniques, 7);
+  f_000_100_111_011_0(uniques, 7);
+  f_000_100_111_011_1(uniques, 7);
+  f_000_100_111_100_0(uniques, 7);
+  f_000_100_111_100_1(uniques, 7);
+  f_000_100_111_101_0(uniques, 7);
+  f_000_100_111_101_1(uniques, 7);
+  f_000_100_111_110_0(uniques, 7);
+  f_000_100_111_110_1(uniques, 7);
+  f_000_100_111_111_0(uniques, 7);
+  f_000_100_111_111_1(uniques, 7);
+  f_000_101_010_000_0(uniques, 7);
+  f_000_101_010_000_1(uniques, 7);
+  f_000_101_010_001_0(uniques, 7);
+  f_000_101_010_001_1(uniques, 7);
+  f_000_101_010_010_0(uniques, 7);
+  f_000_101_010_010_1(uniques, 7);
+  f_000_101_010_011_0(uniques, 7);
+  f_000_101_010_011_1(uniques, 7);
+  f_000_101_010_100_0(uniques, 7);
+  f_000_101_010_100_1(uniques, 7);
+  f_000_101_010_101_0(uniques, 7);
+  f_000_101_010_101_1(uniques, 7);
+  f_000_101_010_110_0(uniques, 7);
+  f_000_101_010_110_1(uniques, 7);
+  f_000_101_010_111_0(uniques, 7);
+  f_000_101_010_111_1(uniques, 7);
+  f_000_101_011_000_0(uniques, 7);
+  f_000_101_011_000_1(uniques, 7);
+  f_000_101_011_001_0(uniques, 7);
+  f_000_101_011_001_1(uniques, 7);
+  f_000_101_011_010_0(uniques, 7);
+  f_000_101_011_010_1(uniques, 7);
+  f_000_101_011_011_0(uniques, 7);
+  f_000_101_011_011_1(uniques, 7);
+  f_000_101_011_100_0(uniques, 7);
+  f_000_101_011_100_1(uniques, 7);
+  f_000_101_011_101_0(uniques, 7);
+  f_000_101_011_101_1(uniques, 7);
+  f_000_101_011_110_0(uniques, 7);
+  f_000_101_011_110_1(uniques, 7);
+  f_000_101_011_111_0(uniques, 7);
+  f_000_101_011_111_1(uniques, 7);
+  f_000_101_110_000_0(uniques, 7);
+  f_000_101_110_000_1(uniques, 7);
+  f_000_101_110_001_0(uniques, 7);
+  f_000_101_110_001_1(uniques, 7);
+  f_000_101_110_010_0(uniques, 7);
+  f_000_101_110_010_1(uniques, 7);
+  f_000_101_110_011_0(uniques, 7);
+  f_000_101_110_011_1(uniques, 7);
+  f_000_101_110_100_0(uniques, 7);
+  f_000_101_110_100_1(uniques, 7);
+  f_000_101_110_101_0(uniques, 7);
+  f_000_101_110_101_1(uniques, 7);
+  f_000_101_110_110_0(uniques, 7);
+  f_000_101_110_110_1(uniques, 7);
+  f_000_101_110_111_0(uniques, 7);
+  f_000_101_110_111_1(uniques, 7);
+  f_000_101_111_000_0(uniques, 7);
+  f_000_101_111_000_1(uniques, 7);
+  f_000_101_111_001_0(uniques, 7);
+  f_000_101_111_001_1(uniques, 7);
+  f_000_101_111_010_0(uniques, 7);
+  f_000_101_111_010_1(uniques, 7);
+  f_000_101_111_011_0(uniques, 7);
+  f_000_101_111_011_1(uniques, 7);
+  f_000_101_111_100_0(uniques, 7);
+  f_000_101_111_100_1(uniques, 7);
+  f_000_101_111_101_0(uniques, 7);
+  f_000_101_111_101_1(uniques, 7);
+  f_000_101_111_110_0(uniques, 7);
+  f_000_101_111_110_1(uniques, 7);
+  f_000_101_111_111_0(uniques, 7);
+  f_000_101_111_111_1(uniques, 7);
+  f_000_110_010_000_0(uniques, 7);
+  f_000_110_010_000_1(uniques, 7);
+  f_000_110_010_001_0(uniques, 7);
+  f_000_110_010_001_1(uniques, 7);
+  f_000_110_010_010_0(uniques, 7);
+  f_000_110_010_010_1(uniques, 7);
+  f_000_110_010_011_0(uniques, 7);
+  f_000_110_010_011_1(uniques, 7);
+  f_000_110_010_100_0(uniques, 7);
+  f_000_110_010_100_1(uniques, 7);
+  f_000_110_010_101_0(uniques, 7);
+  f_000_110_010_101_1(uniques, 7);
+  f_000_110_010_110_0(uniques, 7);
+  f_000_110_010_110_1(uniques, 7);
+  f_000_110_010_111_0(uniques, 7);
+  f_000_110_010_111_1(uniques, 7);
+  f_000_110_011_000_0(uniques, 7);
+  f_000_110_011_000_1(uniques, 7);
+  f_000_110_011_001_0(uniques, 7);
+  f_000_110_011_001_1(uniques, 7);
+  f_000_110_011_010_0(uniques, 7);
+  f_000_110_011_010_1(uniques, 7);
+  f_000_110_011_011_0(uniques, 7);
+  f_000_110_011_011_1(uniques, 7);
+  f_000_110_011_100_0(uniques, 7);
+  f_000_110_011_100_1(uniques, 7);
+  f_000_110_011_101_0(uniques, 7);
+  f_000_110_011_101_1(uniques, 7);
+  f_000_110_011_110_0(uniques, 7);
+  f_000_110_011_110_1(uniques, 7);
+  f_000_110_011_111_0(uniques, 7);
+  f_000_110_011_111_1(uniques, 7);
+  f_000_110_110_000_0(uniques, 7);
+  f_000_110_110_000_1(uniques, 7);
+  f_000_110_110_001_0(uniques, 7);
+  f_000_110_110_001_1(uniques, 7);
+  f_000_110_110_010_0(uniques, 7);
+  f_000_110_110_010_1(uniques, 7);
+  f_000_110_110_011_0(uniques, 7);
+  f_000_110_110_011_1(uniques, 7);
+  f_000_110_110_100_0(uniques, 7);
+  f_000_110_110_100_1(uniques, 7);
+  f_000_110_110_101_0(uniques, 7);
+  f_000_110_110_101_1(uniques, 7);
+  f_000_110_110_110_0(uniques, 7);
+  f_000_110_110_110_1(uniques, 7);
+  f_000_110_110_111_0(uniques, 7);
+  f_000_110_110_111_1(uniques, 7);
+  f_000_110_111_000_0(uniques, 7);
+  f_000_110_111_000_1(uniques, 7);
+  f_000_110_111_001_0(uniques, 7);
+  f_000_110_111_001_1(uniques, 7);
+  f_000_110_111_010_0(uniques, 7);
+  f_000_110_111_010_1(uniques, 7);
+  f_000_110_111_011_0(uniques, 7);
+  f_000_110_111_011_1(uniques, 7);
+  f_000_110_111_100_0(uniques, 7);
+  f_000_110_111_100_1(uniques, 7);
+  f_000_110_111_101_0(uniques, 7);
+  f_000_110_111_101_1(uniques, 7);
+  f_000_110_111_110_0(uniques, 7);
+  f_000_110_111_110_1(uniques, 7);
+  f_000_110_111_111_0(uniques, 7);
+  f_000_110_111_111_1(uniques, 7);
+  f_000_111_010_000_0(uniques, 7);
+  f_000_111_010_000_1(uniques, 7);
+  f_000_111_010_001_0(uniques, 7);
+  f_000_111_010_001_1(uniques, 7);
+  f_000_111_010_010_0(uniques, 7);
+  f_000_111_010_010_1(uniques, 7);
+  f_000_111_010_011_0(uniques, 7);
+  f_000_111_010_011_1(uniques, 7);
+  f_000_111_010_100_0(uniques, 7);
+  f_000_111_010_100_1(uniques, 7);
+  f_000_111_010_101_0(uniques, 7);
+  f_000_111_010_101_1(uniques, 7);
+  f_000_111_010_110_0(uniques, 7);
+  f_000_111_010_110_1(uniques, 7);
+  f_000_111_010_111_0(uniques, 7);
+  f_000_111_010_111_1(uniques, 7);
+  f_000_111_011_000_0(uniques, 7);
+  f_000_111_011_000_1(uniques, 7);
+  f_000_111_011_001_0(uniques, 7);
+  f_000_111_011_001_1(uniques, 7);
+  f_000_111_011_010_0(uniques, 7);
+  f_000_111_011_010_1(uniques, 7);
+  f_000_111_011_011_0(uniques, 7);
+  f_000_111_011_011_1(uniques, 7);
+  f_000_111_011_100_0(uniques, 7);
+  f_000_111_011_100_1(uniques, 7);
+  f_000_111_011_101_0(uniques, 7);
+  f_000_111_011_101_1(uniques, 7);
+  f_000_111_011_110_0(uniques, 7);
+  f_000_111_011_110_1(uniques, 7);
+  f_000_111_011_111_0(uniques, 7);
+  f_000_111_011_111_1(uniques, 7);
+  f_000_111_110_000_0(uniques, 7);
+  f_000_111_110_000_1(uniques, 7);
+  f_000_111_110_001_0(uniques, 7);
+  f_000_111_110_001_1(uniques, 7);
+  f_000_111_110_010_0(uniques, 7);
+  f_000_111_110_010_1(uniques, 7);
+  f_000_111_110_011_0(uniques, 7);
+  f_000_111_110_011_1(uniques, 7);
+  f_000_111_110_100_0(uniques, 7);
+  f_000_111_110_100_1(uniques, 7);
+  f_000_111_110_101_0(uniques, 7);
+  f_000_111_110_101_1(uniques, 7);
+  f_000_111_110_110_0(uniques, 7);
+  f_000_111_110_110_1(uniques, 7);
+  f_000_111_110_111_0(uniques, 7);
+  f_000_111_110_111_1(uniques, 7);
+  f_000_111_111_000_0(uniques, 7);
+  f_000_111_111_000_1(uniques, 7);
+  f_000_111_111_001_0(uniques, 7);
+  f_000_111_111_001_1(uniques, 7);
+  f_000_111_111_010_0(uniques, 7);
+  f_000_111_111_010_1(uniques, 7);
+  f_000_111_111_011_0(uniques, 7);
+  f_000_111_111_011_1(uniques, 7);
+  f_000_111_111_100_0(uniques, 7);
+  f_000_111_111_100_1(uniques, 7);
+  f_000_111_111_101_0(uniques, 7);
+  f_000_111_111_101_1(uniques, 7);
+  f_000_111_111_110_0(uniques, 7);
+  f_000_111_111_110_1(uniques, 7);
+  f_000_111_111_111_0(uniques, 7);
+  f_000_111_111_111_1(uniques, 7);
+  f_001_000_010_000_0(uniques, 7);
+  f_001_000_010_000_1(uniques, 7);
+  f_001_000_010_001_0(uniques, 7);
+  f_001_000_010_001_1(uniques, 7);
+  f_001_000_010_010_0(uniques, 7);
+  f_001_000_010_010_1(uniques, 7);
+  f_001_000_010_011_0(uniques, 7);
+  f_001_000_010_011_1(uniques, 7);
+  f_001_000_010_100_0(uniques, 7);
+  f_001_000_010_100_1(uniques, 7);
+  f_001_000_010_101_0(uniques, 7);
+  f_001_000_010_101_1(uniques, 7);
+  f_001_000_010_110_0(uniques, 7);
+  f_001_000_010_110_1(uniques, 7);
+  f_001_000_010_111_0(uniques, 7);
+  f_001_000_010_111_1(uniques, 7);
+  f_001_000_011_000_0(uniques, 7);
+  f_001_000_011_000_1(uniques, 7);
+  f_001_000_011_001_0(uniques, 7);
+  f_001_000_011_001_1(uniques, 7);
+  f_001_000_011_010_0(uniques, 7);
+  f_001_000_011_010_1(uniques, 7);
+  f_001_000_011_011_0(uniques, 7);
+  f_001_000_011_011_1(uniques, 7);
+  f_001_000_011_100_0(uniques, 7);
+  f_001_000_011_100_1(uniques, 7);
+  f_001_000_011_101_0(uniques, 7);
+  f_001_000_011_101_1(uniques, 7);
+  f_001_000_011_110_0(uniques, 7);
+  f_001_000_011_110_1(uniques, 7);
+  f_001_000_011_111_0(uniques, 7);
+  f_001_000_011_111_1(uniques, 7);
+  f_001_000_110_000_0(uniques, 7);
+  f_001_000_110_000_1(uniques, 7);
+  f_001_000_110_001_0(uniques, 7);
+  f_001_000_110_001_1(uniques, 7);
+  f_001_000_110_010_0(uniques, 7);
+  f_001_000_110_010_1(uniques, 7);
+  f_001_000_110_011_0(uniques, 7);
+  f_001_000_110_011_1(uniques, 7);
+  f_001_000_110_100_0(uniques, 7);
+  f_001_000_110_100_1(uniques, 7);
+  f_001_000_110_101_0(uniques, 7);
+  f_001_000_110_101_1(uniques, 7);
+  f_001_000_110_110_0(uniques, 7);
+  f_001_000_110_110_1(uniques, 7);
+  f_001_000_110_111_0(uniques, 7);
+  f_001_000_110_111_1(uniques, 7);
+  f_001_000_111_000_0(uniques, 7);
+  f_001_000_111_000_1(uniques, 7);
+  f_001_000_111_001_0(uniques, 7);
+  f_001_000_111_001_1(uniques, 7);
+  f_001_000_111_010_0(uniques, 7);
+  f_001_000_111_010_1(uniques, 7);
+  f_001_000_111_011_0(uniques, 7);
+  f_001_000_111_011_1(uniques, 7);
+  f_001_000_111_100_0(uniques, 7);
+  f_001_000_111_100_1(uniques, 7);
+  f_001_000_111_101_0(uniques, 7);
+  f_001_000_111_101_1(uniques, 7);
+  f_001_000_111_110_0(uniques, 7);
+  f_001_000_111_110_1(uniques, 7);
+  f_001_000_111_111_0(uniques, 7);
+  f_001_000_111_111_1(uniques, 7);
+  f_001_001_010_000_0(uniques, 7);
+  f_001_001_010_000_1(uniques, 7);
+  f_001_001_010_001_0(uniques, 7);
+  f_001_001_010_001_1(uniques, 7);
+  f_001_001_010_010_0(uniques, 7);
+  f_001_001_010_010_1(uniques, 7);
+  f_001_001_010_011_0(uniques, 7);
+  f_001_001_010_011_1(uniques, 7);
+  f_001_001_010_100_0(uniques, 7);
+  f_001_001_010_100_1(uniques, 7);
+  f_001_001_010_101_0(uniques, 7);
+  f_001_001_010_101_1(uniques, 7);
+  f_001_001_010_110_0(uniques, 7);
+  f_001_001_010_110_1(uniques, 7);
+  f_001_001_010_111_0(uniques, 7);
+  f_001_001_010_111_1(uniques, 7);
+  f_001_001_011_000_0(uniques, 7);
+  f_001_001_011_000_1(uniques, 7);
+  f_001_001_011_001_0(uniques, 7);
+  f_001_001_011_001_1(uniques, 7);
+  f_001_001_011_010_0(uniques, 7);
+  f_001_001_011_010_1(uniques, 7);
+  f_001_001_011_011_0(uniques, 7);
+  f_001_001_011_011_1(uniques, 7);
+  f_001_001_011_100_0(uniques, 7);
+  f_001_001_011_100_1(uniques, 7);
+  f_001_001_011_101_0(uniques, 7);
+  f_001_001_011_101_1(uniques, 7);
+  f_001_001_011_110_0(uniques, 7);
+  f_001_001_011_110_1(uniques, 7);
+  f_001_001_011_111_0(uniques, 7);
+  f_001_001_011_111_1(uniques, 7);
+  f_001_001_110_000_0(uniques, 7);
+  f_001_001_110_000_1(uniques, 7);
+  f_001_001_110_001_0(uniques, 7);
+  f_001_001_110_001_1(uniques, 7);
+  f_001_001_110_010_0(uniques, 7);
+  f_001_001_110_010_1(uniques, 7);
+  f_001_001_110_011_0(uniques, 7);
+  f_001_001_110_011_1(uniques, 7);
+  f_001_001_110_100_0(uniques, 7);
+  f_001_001_110_100_1(uniques, 7);
+  f_001_001_110_101_0(uniques, 7);
+  f_001_001_110_101_1(uniques, 7);
+  f_001_001_110_110_0(uniques, 7);
+  f_001_001_110_110_1(uniques, 7);
+  f_001_001_110_111_0(uniques, 7);
+  f_001_001_110_111_1(uniques, 7);
+  f_001_001_111_000_0(uniques, 7);
+  f_001_001_111_000_1(uniques, 7);
+  f_001_001_111_001_0(uniques, 7);
+  f_001_001_111_001_1(uniques, 7);
+  f_001_001_111_010_0(uniques, 7);
+  f_001_001_111_010_1(uniques, 7);
+  f_001_001_111_011_0(uniques, 7);
+  f_001_001_111_011_1(uniques, 7);
+  f_001_001_111_100_0(uniques, 7);
+  f_001_001_111_100_1(uniques, 7);
+  f_001_001_111_101_0(uniques, 7);
+  f_001_001_111_101_1(uniques, 7);
+  f_001_001_111_110_0(uniques, 7);
+  f_001_001_111_110_1(uniques, 7);
+  f_001_001_111_111_0(uniques, 7);
+  f_001_001_111_111_1(uniques, 7);
+  f_001_010_010_000_0(uniques, 7);
+  f_001_010_010_000_1(uniques, 7);
+  f_001_010_010_001_0(uniques, 7);
+  f_001_010_010_001_1(uniques, 7);
+  f_001_010_010_010_0(uniques, 7);
+  f_001_010_010_010_1(uniques, 7);
+  f_001_010_010_011_0(uniques, 7);
+  f_001_010_010_011_1(uniques, 7);
+  f_001_010_010_100_0(uniques, 7);
+  f_001_010_010_100_1(uniques, 7);
+  f_001_010_010_101_0(uniques, 7);
+  f_001_010_010_101_1(uniques, 7);
+  f_001_010_010_110_0(uniques, 7);
+  f_001_010_010_110_1(uniques, 7);
+  f_001_010_010_111_0(uniques, 7);
+  f_001_010_010_111_1(uniques, 7);
+  f_001_010_011_000_0(uniques, 7);
+  f_001_010_011_000_1(uniques, 7);
+  f_001_010_011_001_0(uniques, 7);
+  f_001_010_011_001_1(uniques, 7);
+  f_001_010_011_010_0(uniques, 7);
+  f_001_010_011_010_1(uniques, 7);
+  f_001_010_011_011_0(uniques, 7);
+  f_001_010_011_011_1(uniques, 7);
+  f_001_010_011_100_0(uniques, 7);
+  f_001_010_011_100_1(uniques, 7);
+  f_001_010_011_101_0(uniques, 7);
+  f_001_010_011_101_1(uniques, 7);
+  f_001_010_011_110_0(uniques, 7);
+  f_001_010_011_110_1(uniques, 7);
+  f_001_010_011_111_0(uniques, 7);
+  f_001_010_011_111_1(uniques, 7);
+  f_001_010_110_000_0(uniques, 7);
+  f_001_010_110_000_1(uniques, 7);
+  f_001_010_110_001_0(uniques, 7);
+  f_001_010_110_001_1(uniques, 7);
+  f_001_010_110_010_0(uniques, 7);
+  f_001_010_110_010_1(uniques, 7);
+  f_001_010_110_011_0(uniques, 7);
+  f_001_010_110_011_1(uniques, 7);
+  f_001_010_110_100_0(uniques, 7);
+  f_001_010_110_100_1(uniques, 7);
+  f_001_010_110_101_0(uniques, 7);
+  f_001_010_110_101_1(uniques, 7);
+  f_001_010_110_110_0(uniques, 7);
+  f_001_010_110_110_1(uniques, 7);
+  f_001_010_110_111_0(uniques, 7);
+  f_001_010_110_111_1(uniques, 7);
+  f_001_010_111_000_0(uniques, 7);
+  f_001_010_111_000_1(uniques, 7);
+  f_001_010_111_001_0(uniques, 7);
+  f_001_010_111_001_1(uniques, 7);
+  f_001_010_111_010_0(uniques, 7);
+  f_001_010_111_010_1(uniques, 7);
+  f_001_010_111_011_0(uniques, 7);
+  f_001_010_111_011_1(uniques, 7);
+  f_001_010_111_100_0(uniques, 7);
+  f_001_010_111_100_1(uniques, 7);
+  f_001_010_111_101_0(uniques, 7);
+  f_001_010_111_101_1(uniques, 7);
+  f_001_010_111_110_0(uniques, 7);
+  f_001_010_111_110_1(uniques, 7);
+  f_001_010_111_111_0(uniques, 7);
+  f_001_010_111_111_1(uniques, 7);
+  f_001_011_010_000_0(uniques, 7);
+  f_001_011_010_000_1(uniques, 7);
+  f_001_011_010_001_0(uniques, 7);
+  f_001_011_010_001_1(uniques, 7);
+  f_001_011_010_010_0(uniques, 7);
+  f_001_011_010_010_1(uniques, 7);
+  f_001_011_010_011_0(uniques, 7);
+  f_001_011_010_011_1(uniques, 7);
+  f_001_011_010_100_0(uniques, 7);
+  f_001_011_010_100_1(uniques, 7);
+  f_001_011_010_101_0(uniques, 7);
+  f_001_011_010_101_1(uniques, 7);
+  f_001_011_010_110_0(uniques, 7);
+  f_001_011_010_110_1(uniques, 7);
+  f_001_011_010_111_0(uniques, 7);
+  f_001_011_010_111_1(uniques, 7);
+  f_001_011_011_000_0(uniques, 7);
+  f_001_011_011_000_1(uniques, 7);
+  f_001_011_011_001_0(uniques, 7);
+  f_001_011_011_001_1(uniques, 7);
+  f_001_011_011_010_0(uniques, 7);
+  f_001_011_011_010_1(uniques, 7);
+  f_001_011_011_011_0(uniques, 7);
+  f_001_011_011_011_1(uniques, 7);
+  f_001_011_011_100_0(uniques, 7);
+  f_001_011_011_100_1(uniques, 7);
+  f_001_011_011_101_0(uniques, 7);
+  f_001_011_011_101_1(uniques, 7);
+  f_001_011_011_110_0(uniques, 7);
+  f_001_011_011_110_1(uniques, 7);
+  f_001_011_011_111_0(uniques, 7);
+  f_001_011_011_111_1(uniques, 7);
+  f_001_011_110_000_0(uniques, 7);
+  f_001_011_110_000_1(uniques, 7);
+  f_001_011_110_001_0(uniques, 7);
+  f_001_011_110_001_1(uniques, 7);
+  f_001_011_110_010_0(uniques, 7);
+  f_001_011_110_010_1(uniques, 7);
+  f_001_011_110_011_0(uniques, 7);
+  f_001_011_110_011_1(uniques, 7);
+  f_001_011_110_100_0(uniques, 7);
+  f_001_011_110_100_1(uniques, 7);
+  f_001_011_110_101_0(uniques, 7);
+  f_001_011_110_101_1(uniques, 7);
+  f_001_011_110_110_0(uniques, 7);
+  f_001_011_110_110_1(uniques, 7);
+  f_001_011_110_111_0(uniques, 7);
+  f_001_011_110_111_1(uniques, 7);
+  f_001_011_111_000_0(uniques, 7);
+  f_001_011_111_000_1(uniques, 7);
+  f_001_011_111_001_0(uniques, 7);
+  f_001_011_111_001_1(uniques, 7);
+  f_001_011_111_010_0(uniques, 7);
+  f_001_011_111_010_1(uniques, 7);
+  f_001_011_111_011_0(uniques, 7);
+  f_001_011_111_011_1(uniques, 7);
+  f_001_011_111_100_0(uniques, 7);
+  f_001_011_111_100_1(uniques, 7);
+  f_001_011_111_101_0(uniques, 7);
+  f_001_011_111_101_1(uniques, 7);
+  f_001_011_111_110_0(uniques, 7);
+  f_001_011_111_110_1(uniques, 7);
+  f_001_011_111_111_0(uniques, 7);
+  f_001_011_111_111_1(uniques, 7);
+  f_001_100_010_000_0(uniques, 7);
+  f_001_100_010_000_1(uniques, 7);
+  f_001_100_010_001_0(uniques, 7);
+  f_001_100_010_001_1(uniques, 7);
+  f_001_100_010_010_0(uniques, 7);
+  f_001_100_010_010_1(uniques, 7);
+  f_001_100_010_011_0(uniques, 7);
+  f_001_100_010_011_1(uniques, 7);
+  f_001_100_010_100_0(uniques, 7);
+  f_001_100_010_100_1(uniques, 7);
+  f_001_100_010_101_0(uniques, 7);
+  f_001_100_010_101_1(uniques, 7);
+  f_001_100_010_110_0(uniques, 7);
+  f_001_100_010_110_1(uniques, 7);
+  f_001_100_010_111_0(uniques, 7);
+  f_001_100_010_111_1(uniques, 7);
+  f_001_100_011_000_0(uniques, 7);
+  f_001_100_011_000_1(uniques, 7);
+  f_001_100_011_001_0(uniques, 7);
+  f_001_100_011_001_1(uniques, 7);
+  f_001_100_011_010_0(uniques, 7);
+  f_001_100_011_010_1(uniques, 7);
+  f_001_100_011_011_0(uniques, 7);
+  f_001_100_011_011_1(uniques, 7);
+  f_001_100_011_100_0(uniques, 7);
+  f_001_100_011_100_1(uniques, 7);
+  f_001_100_011_101_0(uniques, 7);
+  f_001_100_011_101_1(uniques, 7);
+  f_001_100_011_110_0(uniques, 7);
+  f_001_100_011_110_1(uniques, 7);
+  f_001_100_011_111_0(uniques, 7);
+  f_001_100_011_111_1(uniques, 7);
+  f_001_100_110_000_0(uniques, 7);
+  f_001_100_110_000_1(uniques, 7);
+  f_001_100_110_001_0(uniques, 7);
+  f_001_100_110_001_1(uniques, 7);
+  f_001_100_110_010_0(uniques, 7);
+  f_001_100_110_010_1(uniques, 7);
+  f_001_100_110_011_0(uniques, 7);
+  f_001_100_110_011_1(uniques, 7);
+  f_001_100_110_100_0(uniques, 7);
+  f_001_100_110_100_1(uniques, 7);
+  f_001_100_110_101_0(uniques, 7);
+  f_001_100_110_101_1(uniques, 7);
+  f_001_100_110_110_0(uniques, 7);
+  f_001_100_110_110_1(uniques, 7);
+  f_001_100_110_111_0(uniques, 7);
+  f_001_100_110_111_1(uniques, 7);
+  f_001_100_111_000_0(uniques, 7);
+  f_001_100_111_000_1(uniques, 7);
+  f_001_100_111_001_0(uniques, 7);
+  f_001_100_111_001_1(uniques, 7);
+  f_001_100_111_010_0(uniques, 7);
+  f_001_100_111_010_1(uniques, 7);
+  f_001_100_111_011_0(uniques, 7);
+  f_001_100_111_011_1(uniques, 7);
+  f_001_100_111_100_0(uniques, 7);
+  f_001_100_111_100_1(uniques, 7);
+  f_001_100_111_101_0(uniques, 7);
+  f_001_100_111_101_1(uniques, 7);
+  f_001_100_111_110_0(uniques, 7);
+  f_001_100_111_110_1(uniques, 7);
+  f_001_100_111_111_0(uniques, 7);
+  f_001_100_111_111_1(uniques, 7);
+  f_001_101_010_000_0(uniques, 7);
+  f_001_101_010_000_1(uniques, 7);
+  f_001_101_010_001_0(uniques, 7);
+  f_001_101_010_001_1(uniques, 7);
+  f_001_101_010_010_0(uniques, 7);
+  f_001_101_010_010_1(uniques, 7);
+  f_001_101_010_011_0(uniques, 7);
+  f_001_101_010_011_1(uniques, 7);
+  f_001_101_010_100_0(uniques, 7);
+  f_001_101_010_100_1(uniques, 7);
+  f_001_101_010_101_0(uniques, 7);
+  f_001_101_010_101_1(uniques, 7);
+  f_001_101_010_110_0(uniques, 7);
+  f_001_101_010_110_1(uniques, 7);
+  f_001_101_010_111_0(uniques, 7);
+  f_001_101_010_111_1(uniques, 7);
+  f_001_101_011_000_0(uniques, 7);
+  f_001_101_011_000_1(uniques, 7);
+  f_001_101_011_001_0(uniques, 7);
+  f_001_101_011_001_1(uniques, 7);
+  f_001_101_011_010_0(uniques, 7);
+  f_001_101_011_010_1(uniques, 7);
+  f_001_101_011_011_0(uniques, 7);
+  f_001_101_011_011_1(uniques, 7);
+  f_001_101_011_100_0(uniques, 7);
+  f_001_101_011_100_1(uniques, 7);
+  f_001_101_011_101_0(uniques, 7);
+  f_001_101_011_101_1(uniques, 7);
+  f_001_101_011_110_0(uniques, 7);
+  f_001_101_011_110_1(uniques, 7);
+  f_001_101_011_111_0(uniques, 7);
+  f_001_101_011_111_1(uniques, 7);
+  f_001_101_110_000_0(uniques, 7);
+  f_001_101_110_000_1(uniques, 7);
+  f_001_101_110_001_0(uniques, 7);
+  f_001_101_110_001_1(uniques, 7);
+  f_001_101_110_010_0(uniques, 7);
+  f_001_101_110_010_1(uniques, 7);
+  f_001_101_110_011_0(uniques, 7);
+  f_001_101_110_011_1(uniques, 7);
+  f_001_101_110_100_0(uniques, 7);
+  f_001_101_110_100_1(uniques, 7);
+  f_001_101_110_101_0(uniques, 7);
+  f_001_101_110_101_1(uniques, 7);
+  f_001_101_110_110_0(uniques, 7);
+  f_001_101_110_110_1(uniques, 7);
+  f_001_101_110_111_0(uniques, 7);
+  f_001_101_110_111_1(uniques, 7);
+  f_001_101_111_000_0(uniques, 7);
+  f_001_101_111_000_1(uniques, 7);
+  f_001_101_111_001_0(uniques, 7);
+  f_001_101_111_001_1(uniques, 7);
+  f_001_101_111_010_0(uniques, 7);
+  f_001_101_111_010_1(uniques, 7);
+  f_001_101_111_011_0(uniques, 7);
+  f_001_101_111_011_1(uniques, 7);
+  f_001_101_111_100_0(uniques, 7);
+  f_001_101_111_100_1(uniques, 7);
+  f_001_101_111_101_0(uniques, 7);
+  f_001_101_111_101_1(uniques, 7);
+  f_001_101_111_110_0(uniques, 7);
+  f_001_101_111_110_1(uniques, 7);
+  f_001_101_111_111_0(uniques, 7);
+  f_001_101_111_111_1(uniques, 7);
+  f_001_110_010_000_0(uniques, 7);
+  f_001_110_010_000_1(uniques, 7);
+  f_001_110_010_001_0(uniques, 7);
+  f_001_110_010_001_1(uniques, 7);
+  f_001_110_010_010_0(uniques, 7);
+  f_001_110_010_010_1(uniques, 7);
+  f_001_110_010_011_0(uniques, 7);
+  f_001_110_010_011_1(uniques, 7);
+  f_001_110_010_100_0(uniques, 7);
+  f_001_110_010_100_1(uniques, 7);
+  f_001_110_010_101_0(uniques, 7);
+  f_001_110_010_101_1(uniques, 7);
+  f_001_110_010_110_0(uniques, 7);
+  f_001_110_010_110_1(uniques, 7);
+  f_001_110_010_111_0(uniques, 7);
+  f_001_110_010_111_1(uniques, 7);
+  f_001_110_011_000_0(uniques, 7);
+  f_001_110_011_000_1(uniques, 7);
+  f_001_110_011_001_0(uniques, 7);
+  f_001_110_011_001_1(uniques, 7);
+  f_001_110_011_010_0(uniques, 7);
+  f_001_110_011_010_1(uniques, 7);
+  f_001_110_011_011_0(uniques, 7);
+  f_001_110_011_011_1(uniques, 7);
+  f_001_110_011_100_0(uniques, 7);
+  f_001_110_011_100_1(uniques, 7);
+  f_001_110_011_101_0(uniques, 7);
+  f_001_110_011_101_1(uniques, 7);
+  f_001_110_011_110_0(uniques, 7);
+  f_001_110_011_110_1(uniques, 7);
+  f_001_110_011_111_0(uniques, 7);
+  f_001_110_011_111_1(uniques, 7);
+  f_001_110_110_000_0(uniques, 7);
+  f_001_110_110_000_1(uniques, 7);
+  f_001_110_110_001_0(uniques, 7);
+  f_001_110_110_001_1(uniques, 7);
+  f_001_110_110_010_0(uniques, 7);
+  f_001_110_110_010_1(uniques, 7);
+  f_001_110_110_011_0(uniques, 7);
+  f_001_110_110_011_1(uniques, 7);
+  f_001_110_110_100_0(uniques, 7);
+  f_001_110_110_100_1(uniques, 7);
+  f_001_110_110_101_0(uniques, 7);
+  f_001_110_110_101_1(uniques, 7);
+  f_001_110_110_110_0(uniques, 7);
+  f_001_110_110_110_1(uniques, 7);
+  f_001_110_110_111_0(uniques, 7);
+  f_001_110_110_111_1(uniques, 7);
+  f_001_110_111_000_0(uniques, 7);
+  f_001_110_111_000_1(uniques, 7);
+  f_001_110_111_001_0(uniques, 7);
+  f_001_110_111_001_1(uniques, 7);
+  f_001_110_111_010_0(uniques, 7);
+  f_001_110_111_010_1(uniques, 7);
+  f_001_110_111_011_0(uniques, 7);
+  f_001_110_111_011_1(uniques, 7);
+  f_001_110_111_100_0(uniques, 7);
+  f_001_110_111_100_1(uniques, 7);
+  f_001_110_111_101_0(uniques, 7);
+  f_001_110_111_101_1(uniques, 7);
+  f_001_110_111_110_0(uniques, 7);
+  f_001_110_111_110_1(uniques, 7);
+  f_001_110_111_111_0(uniques, 7);
+  f_001_110_111_111_1(uniques, 7);
+  f_001_111_010_000_0(uniques, 7);
+  f_001_111_010_000_1(uniques, 7);
+  f_001_111_010_001_0(uniques, 7);
+  f_001_111_010_001_1(uniques, 7);
+  f_001_111_010_010_0(uniques, 7);
+  f_001_111_010_010_1(uniques, 7);
+  f_001_111_010_011_0(uniques, 7);
+  f_001_111_010_011_1(uniques, 7);
+  f_001_111_010_100_0(uniques, 7);
+  f_001_111_010_100_1(uniques, 7);
+  f_001_111_010_101_0(uniques, 7);
+  f_001_111_010_101_1(uniques, 7);
+  f_001_111_010_110_0(uniques, 7);
+  f_001_111_010_110_1(uniques, 7);
+  f_001_111_010_111_0(uniques, 7);
+  f_001_111_010_111_1(uniques, 7);
+  f_001_111_011_000_0(uniques, 7);
+  f_001_111_011_000_1(uniques, 7);
+  f_001_111_011_001_0(uniques, 7);
+  f_001_111_011_001_1(uniques, 7);
+  f_001_111_011_010_0(uniques, 7);
+  f_001_111_011_010_1(uniques, 7);
+  f_001_111_011_011_0(uniques, 7);
+  f_001_111_011_011_1(uniques, 7);
+  f_001_111_011_100_0(uniques, 7);
+  f_001_111_011_100_1(uniques, 7);
+  f_001_111_011_101_0(uniques, 7);
+  f_001_111_011_101_1(uniques, 7);
+  f_001_111_011_110_0(uniques, 7);
+  f_001_111_011_110_1(uniques, 7);
+  f_001_111_011_111_0(uniques, 7);
+  f_001_111_011_111_1(uniques, 7);
+  f_001_111_110_000_0(uniques, 7);
+  f_001_111_110_000_1(uniques, 7);
+  f_001_111_110_001_0(uniques, 7);
+  f_001_111_110_001_1(uniques, 7);
+  f_001_111_110_010_0(uniques, 7);
+  f_001_111_110_010_1(uniques, 7);
+  f_001_111_110_011_0(uniques, 7);
+  f_001_111_110_011_1(uniques, 7);
+  f_001_111_110_100_0(uniques, 7);
+  f_001_111_110_100_1(uniques, 7);
+  f_001_111_110_101_0(uniques, 7);
+  f_001_111_110_101_1(uniques, 7);
+  f_001_111_110_110_0(uniques, 7);
+  f_001_111_110_110_1(uniques, 7);
+  f_001_111_110_111_0(uniques, 7);
+  f_001_111_110_111_1(uniques, 7);
+  f_001_111_111_000_0(uniques, 7);
+  f_001_111_111_000_1(uniques, 7);
+  f_001_111_111_001_0(uniques, 7);
+  f_001_111_111_001_1(uniques, 7);
+  f_001_111_111_010_0(uniques, 7);
+  f_001_111_111_010_1(uniques, 7);
+  f_001_111_111_011_0(uniques, 7);
+  f_001_111_111_011_1(uniques, 7);
+  f_001_111_111_100_0(uniques, 7);
+  f_001_111_111_100_1(uniques, 7);
+  f_001_111_111_101_0(uniques, 7);
+  f_001_111_111_101_1(uniques, 7);
+  f_001_111_111_110_0(uniques, 7);
+  f_001_111_111_110_1(uniques, 7);
+  f_001_111_111_111_0(uniques, 7);
+  f_001_111_111_111_1(uniques, 7);
+  f_010_000_010_000_0(uniques, 7);
+  f_010_000_010_000_1(uniques, 7);
+  f_010_000_010_001_0(uniques, 7);
+  f_010_000_010_001_1(uniques, 7);
+  f_010_000_010_010_0(uniques, 7);
+  f_010_000_010_010_1(uniques, 7);
+  f_010_000_010_011_0(uniques, 7);
+  f_010_000_010_011_1(uniques, 7);
+  f_010_000_010_100_0(uniques, 7);
+  f_010_000_010_100_1(uniques, 7);
+  f_010_000_010_101_0(uniques, 7);
+  f_010_000_010_101_1(uniques, 7);
+  f_010_000_010_110_0(uniques, 7);
+  f_010_000_010_110_1(uniques, 7);
+  f_010_000_010_111_0(uniques, 7);
+  f_010_000_010_111_1(uniques, 7);
+  f_010_000_011_000_0(uniques, 7);
+  f_010_000_011_000_1(uniques, 7);
+  f_010_000_011_001_0(uniques, 7);
+  f_010_000_011_001_1(uniques, 7);
+  f_010_000_011_010_0(uniques, 7);
+  f_010_000_011_010_1(uniques, 7);
+  f_010_000_011_011_0(uniques, 7);
+  f_010_000_011_011_1(uniques, 7);
+  f_010_000_011_100_0(uniques, 7);
+  f_010_000_011_100_1(uniques, 7);
+  f_010_000_011_101_0(uniques, 7);
+  f_010_000_011_101_1(uniques, 7);
+  f_010_000_011_110_0(uniques, 7);
+  f_010_000_011_110_1(uniques, 7);
+  f_010_000_011_111_0(uniques, 7);
+  f_010_000_011_111_1(uniques, 7);
+  f_010_000_110_000_0(uniques, 7);
+  f_010_000_110_000_1(uniques, 7);
+  f_010_000_110_001_0(uniques, 7);
+  f_010_000_110_001_1(uniques, 7);
+  f_010_000_110_010_0(uniques, 7);
+  f_010_000_110_010_1(uniques, 7);
+  f_010_000_110_011_0(uniques, 7);
+  f_010_000_110_011_1(uniques, 7);
+  f_010_000_110_100_0(uniques, 7);
+  f_010_000_110_100_1(uniques, 7);
+  f_010_000_110_101_0(uniques, 7);
+  f_010_000_110_101_1(uniques, 7);
+  f_010_000_110_110_0(uniques, 7);
+  f_010_000_110_110_1(uniques, 7);
+  f_010_000_110_111_0(uniques, 7);
+  f_010_000_110_111_1(uniques, 7);
+  f_010_000_111_000_0(uniques, 7);
+  f_010_000_111_000_1(uniques, 7);
+  f_010_000_111_001_0(uniques, 7);
+  f_010_000_111_001_1(uniques, 7);
+  f_010_000_111_010_0(uniques, 7);
+  f_010_000_111_010_1(uniques, 7);
+  f_010_000_111_011_0(uniques, 7);
+  f_010_000_111_011_1(uniques, 7);
+  f_010_000_111_100_0(uniques, 7);
+  f_010_000_111_100_1(uniques, 7);
+  f_010_000_111_101_0(uniques, 7);
+  f_010_000_111_101_1(uniques, 7);
+  f_010_000_111_110_0(uniques, 7);
+  f_010_000_111_110_1(uniques, 7);
+  f_010_000_111_111_0(uniques, 7);
+  f_010_000_111_111_1(uniques, 7);
+  f_010_001_010_000_0(uniques, 7);
+  f_010_001_010_000_1(uniques, 7);
+  f_010_001_010_001_0(uniques, 7);
+  f_010_001_010_001_1(uniques, 7);
+  f_010_001_010_010_0(uniques, 7);
+  f_010_001_010_010_1(uniques, 7);
+  f_010_001_010_011_0(uniques, 7);
+  f_010_001_010_011_1(uniques, 7);
+  f_010_001_010_100_0(uniques, 7);
+  f_010_001_010_100_1(uniques, 7);
+  f_010_001_010_101_0(uniques, 7);
+  f_010_001_010_101_1(uniques, 7);
+  f_010_001_010_110_0(uniques, 7);
+  f_010_001_010_110_1(uniques, 7);
+  f_010_001_010_111_0(uniques, 7);
+  f_010_001_010_111_1(uniques, 7);
+  f_010_001_011_000_0(uniques, 7);
+  f_010_001_011_000_1(uniques, 7);
+  f_010_001_011_001_0(uniques, 7);
+  f_010_001_011_001_1(uniques, 7);
+  f_010_001_011_010_0(uniques, 7);
+  f_010_001_011_010_1(uniques, 7);
+  f_010_001_011_011_0(uniques, 7);
+  f_010_001_011_011_1(uniques, 7);
+  f_010_001_011_100_0(uniques, 7);
+  f_010_001_011_100_1(uniques, 7);
+  f_010_001_011_101_0(uniques, 7);
+  f_010_001_011_101_1(uniques, 7);
+  f_010_001_011_110_0(uniques, 7);
+  f_010_001_011_110_1(uniques, 7);
+  f_010_001_011_111_0(uniques, 7);
+  f_010_001_011_111_1(uniques, 7);
+  f_010_001_110_000_0(uniques, 7);
+  f_010_001_110_000_1(uniques, 7);
+  f_010_001_110_001_0(uniques, 7);
+  f_010_001_110_001_1(uniques, 7);
+  f_010_001_110_010_0(uniques, 7);
+  f_010_001_110_010_1(uniques, 7);
+  f_010_001_110_011_0(uniques, 7);
+  f_010_001_110_011_1(uniques, 7);
+  f_010_001_110_100_0(uniques, 7);
+  f_010_001_110_100_1(uniques, 7);
+  f_010_001_110_101_0(uniques, 7);
+  f_010_001_110_101_1(uniques, 7);
+  f_010_001_110_110_0(uniques, 7);
+  f_010_001_110_110_1(uniques, 7);
+  f_010_001_110_111_0(uniques, 7);
+  f_010_001_110_111_1(uniques, 7);
+  f_010_001_111_000_0(uniques, 7);
+  f_010_001_111_000_1(uniques, 7);
+  f_010_001_111_001_0(uniques, 7);
+  f_010_001_111_001_1(uniques, 7);
+  f_010_001_111_010_0(uniques, 7);
+  f_010_001_111_010_1(uniques, 7);
+  f_010_001_111_011_0(uniques, 7);
+  f_010_001_111_011_1(uniques, 7);
+  f_010_001_111_100_0(uniques, 7);
+  f_010_001_111_100_1(uniques, 7);
+  f_010_001_111_101_0(uniques, 7);
+  f_010_001_111_101_1(uniques, 7);
+  f_010_001_111_110_0(uniques, 7);
+  f_010_001_111_110_1(uniques, 7);
+  f_010_001_111_111_0(uniques, 7);
+  f_010_001_111_111_1(uniques, 7);
+  f_010_010_010_000_0(uniques, 7);
+  f_010_010_010_000_1(uniques, 7);
+  f_010_010_010_001_0(uniques, 7);
+  f_010_010_010_001_1(uniques, 7);
+  f_010_010_010_010_0(uniques, 7);
+  f_010_010_010_010_1(uniques, 7);
+  f_010_010_010_011_0(uniques, 7);
+  f_010_010_010_011_1(uniques, 7);
+  f_010_010_010_100_0(uniques, 7);
+  f_010_010_010_100_1(uniques, 7);
+  f_010_010_010_101_0(uniques, 7);
+  f_010_010_010_101_1(uniques, 7);
+  f_010_010_010_110_0(uniques, 7);
+  f_010_010_010_110_1(uniques, 7);
+  f_010_010_010_111_0(uniques, 7);
+  f_010_010_010_111_1(uniques, 7);
+  f_010_010_011_000_0(uniques, 7);
+  f_010_010_011_000_1(uniques, 7);
+  f_010_010_011_001_0(uniques, 7);
+  f_010_010_011_001_1(uniques, 7);
+  f_010_010_011_010_0(uniques, 7);
+  f_010_010_011_010_1(uniques, 7);
+  f_010_010_011_011_0(uniques, 7);
+  f_010_010_011_011_1(uniques, 7);
+  f_010_010_011_100_0(uniques, 7);
+  f_010_010_011_100_1(uniques, 7);
+  f_010_010_011_101_0(uniques, 7);
+  f_010_010_011_101_1(uniques, 7);
+  f_010_010_011_110_0(uniques, 7);
+  f_010_010_011_110_1(uniques, 7);
+  f_010_010_011_111_0(uniques, 7);
+  f_010_010_011_111_1(uniques, 7);
+  f_010_010_110_000_0(uniques, 7);
+  f_010_010_110_000_1(uniques, 7);
+  f_010_010_110_001_0(uniques, 7);
+  f_010_010_110_001_1(uniques, 7);
+  f_010_010_110_010_0(uniques, 7);
+  f_010_010_110_010_1(uniques, 7);
+  f_010_010_110_011_0(uniques, 7);
+  f_010_010_110_011_1(uniques, 7);
+  f_010_010_110_100_0(uniques, 7);
+  f_010_010_110_100_1(uniques, 7);
+  f_010_010_110_101_0(uniques, 7);
+  f_010_010_110_101_1(uniques, 7);
+  f_010_010_110_110_0(uniques, 7);
+  f_010_010_110_110_1(uniques, 7);
+  f_010_010_110_111_0(uniques, 7);
+  f_010_010_110_111_1(uniques, 7);
+  f_010_010_111_000_0(uniques, 7);
+  f_010_010_111_000_1(uniques, 7);
+  f_010_010_111_001_0(uniques, 7);
+  f_010_010_111_001_1(uniques, 7);
+  f_010_010_111_010_0(uniques, 7);
+  f_010_010_111_010_1(uniques, 7);
+  f_010_010_111_011_0(uniques, 7);
+  f_010_010_111_011_1(uniques, 7);
+  f_010_010_111_100_0(uniques, 7);
+  f_010_010_111_100_1(uniques, 7);
+  f_010_010_111_101_0(uniques, 7);
+  f_010_010_111_101_1(uniques, 7);
+  f_010_010_111_110_0(uniques, 7);
+  f_010_010_111_110_1(uniques, 7);
+  f_010_010_111_111_0(uniques, 7);
+  f_010_010_111_111_1(uniques, 7);
+  f_010_011_010_000_0(uniques, 7);
+  f_010_011_010_000_1(uniques, 7);
+  f_010_011_010_001_0(uniques, 7);
+  f_010_011_010_001_1(uniques, 7);
+  f_010_011_010_010_0(uniques, 7);
+  f_010_011_010_010_1(uniques, 7);
+  f_010_011_010_011_0(uniques, 7);
+  f_010_011_010_011_1(uniques, 7);
+  f_010_011_010_100_0(uniques, 7);
+  f_010_011_010_100_1(uniques, 7);
+  f_010_011_010_101_0(uniques, 7);
+  f_010_011_010_101_1(uniques, 7);
+  f_010_011_010_110_0(uniques, 7);
+  f_010_011_010_110_1(uniques, 7);
+  f_010_011_010_111_0(uniques, 7);
+  f_010_011_010_111_1(uniques, 7);
+  f_010_011_011_000_0(uniques, 7);
+  f_010_011_011_000_1(uniques, 7);
+  f_010_011_011_001_0(uniques, 7);
+  f_010_011_011_001_1(uniques, 7);
+  f_010_011_011_010_0(uniques, 7);
+  f_010_011_011_010_1(uniques, 7);
+  f_010_011_011_011_0(uniques, 7);
+  f_010_011_011_011_1(uniques, 7);
+  f_010_011_011_100_0(uniques, 7);
+  f_010_011_011_100_1(uniques, 7);
+  f_010_011_011_101_0(uniques, 7);
+  f_010_011_011_101_1(uniques, 7);
+  f_010_011_011_110_0(uniques, 7);
+  f_010_011_011_110_1(uniques, 7);
+  f_010_011_011_111_0(uniques, 7);
+  f_010_011_011_111_1(uniques, 7);
+  f_010_011_110_000_0(uniques, 7);
+  f_010_011_110_000_1(uniques, 7);
+  f_010_011_110_001_0(uniques, 7);
+  f_010_011_110_001_1(uniques, 7);
+  f_010_011_110_010_0(uniques, 7);
+  f_010_011_110_010_1(uniques, 7);
+  f_010_011_110_011_0(uniques, 7);
+  f_010_011_110_011_1(uniques, 7);
+  f_010_011_110_100_0(uniques, 7);
+  f_010_011_110_100_1(uniques, 7);
+  f_010_011_110_101_0(uniques, 7);
+  f_010_011_110_101_1(uniques, 7);
+  f_010_011_110_110_0(uniques, 7);
+  f_010_011_110_110_1(uniques, 7);
+  f_010_011_110_111_0(uniques, 7);
+  f_010_011_110_111_1(uniques, 7);
+  f_010_011_111_000_0(uniques, 7);
+  f_010_011_111_000_1(uniques, 7);
+  f_010_011_111_001_0(uniques, 7);
+  f_010_011_111_001_1(uniques, 7);
+  f_010_011_111_010_0(uniques, 7);
+  f_010_011_111_010_1(uniques, 7);
+  f_010_011_111_011_0(uniques, 7);
+  f_010_011_111_011_1(uniques, 7);
+  f_010_011_111_100_0(uniques, 7);
+  f_010_011_111_100_1(uniques, 7);
+  f_010_011_111_101_0(uniques, 7);
+  f_010_011_111_101_1(uniques, 7);
+  f_010_011_111_110_0(uniques, 7);
+  f_010_011_111_110_1(uniques, 7);
+  f_010_011_111_111_0(uniques, 7);
+  f_010_011_111_111_1(uniques, 7);
+  f_010_100_010_000_0(uniques, 7);
+  f_010_100_010_000_1(uniques, 7);
+  f_010_100_010_001_0(uniques, 7);
+  f_010_100_010_001_1(uniques, 7);
+  f_010_100_010_010_0(uniques, 7);
+  f_010_100_010_010_1(uniques, 7);
+  f_010_100_010_011_0(uniques, 7);
+  f_010_100_010_011_1(uniques, 7);
+  f_010_100_010_100_0(uniques, 7);
+  f_010_100_010_100_1(uniques, 7);
+  f_010_100_010_101_0(uniques, 7);
+  f_010_100_010_101_1(uniques, 7);
+  f_010_100_010_110_0(uniques, 7);
+  f_010_100_010_110_1(uniques, 7);
+  f_010_100_010_111_0(uniques, 7);
+  f_010_100_010_111_1(uniques, 7);
+  f_010_100_011_000_0(uniques, 7);
+  f_010_100_011_000_1(uniques, 7);
+  f_010_100_011_001_0(uniques, 7);
+  f_010_100_011_001_1(uniques, 7);
+  f_010_100_011_010_0(uniques, 7);
+  f_010_100_011_010_1(uniques, 7);
+  f_010_100_011_011_0(uniques, 7);
+  f_010_100_011_011_1(uniques, 7);
+  f_010_100_011_100_0(uniques, 7);
+  f_010_100_011_100_1(uniques, 7);
+  f_010_100_011_101_0(uniques, 7);
+  f_010_100_011_101_1(uniques, 7);
+  f_010_100_011_110_0(uniques, 7);
+  f_010_100_011_110_1(uniques, 7);
+  f_010_100_011_111_0(uniques, 7);
+  f_010_100_011_111_1(uniques, 7);
+  f_010_100_110_000_0(uniques, 7);
+  f_010_100_110_000_1(uniques, 7);
+  f_010_100_110_001_0(uniques, 7);
+  f_010_100_110_001_1(uniques, 7);
+  f_010_100_110_010_0(uniques, 7);
+  f_010_100_110_010_1(uniques, 7);
+  f_010_100_110_011_0(uniques, 7);
+  f_010_100_110_011_1(uniques, 7);
+  f_010_100_110_100_0(uniques, 7);
+  f_010_100_110_100_1(uniques, 7);
+  f_010_100_110_101_0(uniques, 7);
+  f_010_100_110_101_1(uniques, 7);
+  f_010_100_110_110_0(uniques, 7);
+  f_010_100_110_110_1(uniques, 7);
+  f_010_100_110_111_0(uniques, 7);
+  f_010_100_110_111_1(uniques, 7);
+  f_010_100_111_000_0(uniques, 7);
+  f_010_100_111_000_1(uniques, 7);
+  f_010_100_111_001_0(uniques, 7);
+  f_010_100_111_001_1(uniques, 7);
+  f_010_100_111_010_0(uniques, 7);
+  f_010_100_111_010_1(uniques, 7);
+  f_010_100_111_011_0(uniques, 7);
+  f_010_100_111_011_1(uniques, 7);
+  f_010_100_111_100_0(uniques, 7);
+  f_010_100_111_100_1(uniques, 7);
+  f_010_100_111_101_0(uniques, 7);
+  f_010_100_111_101_1(uniques, 7);
+  f_010_100_111_110_0(uniques, 7);
+  f_010_100_111_110_1(uniques, 7);
+  f_010_100_111_111_0(uniques, 7);
+  f_010_100_111_111_1(uniques, 7);
+  f_010_101_010_000_0(uniques, 7);
+  f_010_101_010_000_1(uniques, 7);
+  f_010_101_010_001_0(uniques, 7);
+  f_010_101_010_001_1(uniques, 7);
+  f_010_101_010_010_0(uniques, 7);
+  f_010_101_010_010_1(uniques, 7);
+  f_010_101_010_011_0(uniques, 7);
+  f_010_101_010_011_1(uniques, 7);
+  f_010_101_010_100_0(uniques, 7);
+  f_010_101_010_100_1(uniques, 7);
+  f_010_101_010_101_0(uniques, 7);
+  f_010_101_010_101_1(uniques, 7);
+  f_010_101_010_110_0(uniques, 7);
+  f_010_101_010_110_1(uniques, 7);
+  f_010_101_010_111_0(uniques, 7);
+  f_010_101_010_111_1(uniques, 7);
+  f_010_101_011_000_0(uniques, 7);
+  f_010_101_011_000_1(uniques, 7);
+  f_010_101_011_001_0(uniques, 7);
+  f_010_101_011_001_1(uniques, 7);
+  f_010_101_011_010_0(uniques, 7);
+  f_010_101_011_010_1(uniques, 7);
+  f_010_101_011_011_0(uniques, 7);
+  f_010_101_011_011_1(uniques, 7);
+  f_010_101_011_100_0(uniques, 7);
+  f_010_101_011_100_1(uniques, 7);
+  f_010_101_011_101_0(uniques, 7);
+  f_010_101_011_101_1(uniques, 7);
+  f_010_101_011_110_0(uniques, 7);
+  f_010_101_011_110_1(uniques, 7);
+  f_010_101_011_111_0(uniques, 7);
+  f_010_101_011_111_1(uniques, 7);
+  f_010_101_110_000_0(uniques, 7);
+  f_010_101_110_000_1(uniques, 7);
+  f_010_101_110_001_0(uniques, 7);
+  f_010_101_110_001_1(uniques, 7);
+  f_010_101_110_010_0(uniques, 7);
+  f_010_101_110_010_1(uniques, 7);
+  f_010_101_110_011_0(uniques, 7);
+  f_010_101_110_011_1(uniques, 7);
+  f_010_101_110_100_0(uniques, 7);
+  f_010_101_110_100_1(uniques, 7);
+  f_010_101_110_101_0(uniques, 7);
+  f_010_101_110_101_1(uniques, 7);
+  f_010_101_110_110_0(uniques, 7);
+  f_010_101_110_110_1(uniques, 7);
+  f_010_101_110_111_0(uniques, 7);
+  f_010_101_110_111_1(uniques, 7);
+  f_010_101_111_000_0(uniques, 7);
+  f_010_101_111_000_1(uniques, 7);
+  f_010_101_111_001_0(uniques, 7);
+  f_010_101_111_001_1(uniques, 7);
+  f_010_101_111_010_0(uniques, 7);
+  f_010_101_111_010_1(uniques, 7);
+  f_010_101_111_011_0(uniques, 7);
+  f_010_101_111_011_1(uniques, 7);
+  f_010_101_111_100_0(uniques, 7);
+  f_010_101_111_100_1(uniques, 7);
+  f_010_101_111_101_0(uniques, 7);
+  f_010_101_111_101_1(uniques, 7);
+  f_010_101_111_110_0(uniques, 7);
+  f_010_101_111_110_1(uniques, 7);
+  f_010_101_111_111_0(uniques, 7);
+  f_010_101_111_111_1(uniques, 7);
+  f_010_110_010_000_0(uniques, 7);
+  f_010_110_010_000_1(uniques, 7);
+  f_010_110_010_001_0(uniques, 7);
+  f_010_110_010_001_1(uniques, 7);
+  f_010_110_010_010_0(uniques, 7);
+  f_010_110_010_010_1(uniques, 7);
+  f_010_110_010_011_0(uniques, 7);
+  f_010_110_010_011_1(uniques, 7);
+  f_010_110_010_100_0(uniques, 7);
+  f_010_110_010_100_1(uniques, 7);
+  f_010_110_010_101_0(uniques, 7);
+  f_010_110_010_101_1(uniques, 7);
+  f_010_110_010_110_0(uniques, 7);
+  f_010_110_010_110_1(uniques, 7);
+  f_010_110_010_111_0(uniques, 7);
+  f_010_110_010_111_1(uniques, 7);
+  f_010_110_011_000_0(uniques, 7);
+  f_010_110_011_000_1(uniques, 7);
+  f_010_110_011_001_0(uniques, 7);
+  f_010_110_011_001_1(uniques, 7);
+  f_010_110_011_010_0(uniques, 7);
+  f_010_110_011_010_1(uniques, 7);
+  f_010_110_011_011_0(uniques, 7);
+  f_010_110_011_011_1(uniques, 7);
+  f_010_110_011_100_0(uniques, 7);
+  f_010_110_011_100_1(uniques, 7);
+  f_010_110_011_101_0(uniques, 7);
+  f_010_110_011_101_1(uniques, 7);
+  f_010_110_011_110_0(uniques, 7);
+  f_010_110_011_110_1(uniques, 7);
+  f_010_110_011_111_0(uniques, 7);
+  f_010_110_011_111_1(uniques, 7);
+  f_010_110_110_000_0(uniques, 7);
+  f_010_110_110_000_1(uniques, 7);
+  f_010_110_110_001_0(uniques, 7);
+  f_010_110_110_001_1(uniques, 7);
+  f_010_110_110_010_0(uniques, 7);
+  f_010_110_110_010_1(uniques, 7);
+  f_010_110_110_011_0(uniques, 7);
+  f_010_110_110_011_1(uniques, 7);
+  f_010_110_110_100_0(uniques, 7);
+  f_010_110_110_100_1(uniques, 7);
+  f_010_110_110_101_0(uniques, 7);
+  f_010_110_110_101_1(uniques, 7);
+  f_010_110_110_110_0(uniques, 7);
+  f_010_110_110_110_1(uniques, 7);
+  f_010_110_110_111_0(uniques, 7);
+  f_010_110_110_111_1(uniques, 7);
+  f_010_110_111_000_0(uniques, 7);
+  f_010_110_111_000_1(uniques, 7);
+  f_010_110_111_001_0(uniques, 7);
+  f_010_110_111_001_1(uniques, 7);
+  f_010_110_111_010_0(uniques, 7);
+  f_010_110_111_010_1(uniques, 7);
+  f_010_110_111_011_0(uniques, 7);
+  f_010_110_111_011_1(uniques, 7);
+  f_010_110_111_100_0(uniques, 7);
+  f_010_110_111_100_1(uniques, 7);
+  f_010_110_111_101_0(uniques, 7);
+  f_010_110_111_101_1(uniques, 7);
+  f_010_110_111_110_0(uniques, 7);
+  f_010_110_111_110_1(uniques, 7);
+  f_010_110_111_111_0(uniques, 7);
+  f_010_110_111_111_1(uniques, 7);
+  f_010_111_010_000_0(uniques, 7);
+  f_010_111_010_000_1(uniques, 7);
+  f_010_111_010_001_0(uniques, 7);
+  f_010_111_010_001_1(uniques, 7);
+  f_010_111_010_010_0(uniques, 7);
+  f_010_111_010_010_1(uniques, 7);
+  f_010_111_010_011_0(uniques, 7);
+  f_010_111_010_011_1(uniques, 7);
+  f_010_111_010_100_0(uniques, 7);
+  f_010_111_010_100_1(uniques, 7);
+  f_010_111_010_101_0(uniques, 7);
+  f_010_111_010_101_1(uniques, 7);
+  f_010_111_010_110_0(uniques, 7);
+  f_010_111_010_110_1(uniques, 7);
+  f_010_111_010_111_0(uniques, 7);
+  f_010_111_010_111_1(uniques, 7);
+  f_010_111_011_000_0(uniques, 7);
+  f_010_111_011_000_1(uniques, 7);
+  f_010_111_011_001_0(uniques, 7);
+  f_010_111_011_001_1(uniques, 7);
+  f_010_111_011_010_0(uniques, 7);
+  f_010_111_011_010_1(uniques, 7);
+  f_010_111_011_011_0(uniques, 7);
+  f_010_111_011_011_1(uniques, 7);
+  f_010_111_011_100_0(uniques, 7);
+  f_010_111_011_100_1(uniques, 7);
+  f_010_111_011_101_0(uniques, 7);
+  f_010_111_011_101_1(uniques, 7);
+  f_010_111_011_110_0(uniques, 7);
+  f_010_111_011_110_1(uniques, 7);
+  f_010_111_011_111_0(uniques, 7);
+  f_010_111_011_111_1(uniques, 7);
+  f_010_111_110_000_0(uniques, 7);
+  f_010_111_110_000_1(uniques, 7);
+  f_010_111_110_001_0(uniques, 7);
+  f_010_111_110_001_1(uniques, 7);
+  f_010_111_110_010_0(uniques, 7);
+  f_010_111_110_010_1(uniques, 7);
+  f_010_111_110_011_0(uniques, 7);
+  f_010_111_110_011_1(uniques, 7);
+  f_010_111_110_100_0(uniques, 7);
+  f_010_111_110_100_1(uniques, 7);
+  f_010_111_110_101_0(uniques, 7);
+  f_010_111_110_101_1(uniques, 7);
+  f_010_111_110_110_0(uniques, 7);
+  f_010_111_110_110_1(uniques, 7);
+  f_010_111_110_111_0(uniques, 7);
+  f_010_111_110_111_1(uniques, 7);
+  f_010_111_111_000_0(uniques, 7);
+  f_010_111_111_000_1(uniques, 7);
+  f_010_111_111_001_0(uniques, 7);
+  f_010_111_111_001_1(uniques, 7);
+  f_010_111_111_010_0(uniques, 7);
+  f_010_111_111_010_1(uniques, 7);
+  f_010_111_111_011_0(uniques, 7);
+  f_010_111_111_011_1(uniques, 7);
+  f_010_111_111_100_0(uniques, 7);
+  f_010_111_111_100_1(uniques, 7);
+  f_010_111_111_101_0(uniques, 7);
+  f_010_111_111_101_1(uniques, 7);
+  f_010_111_111_110_0(uniques, 7);
+  f_010_111_111_110_1(uniques, 7);
+  f_010_111_111_111_0(uniques, 7);
+  f_010_111_111_111_1(uniques, 7);
+  f_011_000_010_000_0(uniques, 7);
+  f_011_000_010_000_1(uniques, 7);
+  f_011_000_010_001_0(uniques, 7);
+  f_011_000_010_001_1(uniques, 7);
+  f_011_000_010_010_0(uniques, 7);
+  f_011_000_010_010_1(uniques, 7);
+  f_011_000_010_011_0(uniques, 7);
+  f_011_000_010_011_1(uniques, 7);
+  f_011_000_010_100_0(uniques, 7);
+  f_011_000_010_100_1(uniques, 7);
+  f_011_000_010_101_0(uniques, 7);
+  f_011_000_010_101_1(uniques, 7);
+  f_011_000_010_110_0(uniques, 7);
+  f_011_000_010_110_1(uniques, 7);
+  f_011_000_010_111_0(uniques, 7);
+  f_011_000_010_111_1(uniques, 7);
+  f_011_000_011_000_0(uniques, 7);
+  f_011_000_011_000_1(uniques, 7);
+  f_011_000_011_001_0(uniques, 7);
+  f_011_000_011_001_1(uniques, 7);
+  f_011_000_011_010_0(uniques, 7);
+  f_011_000_011_010_1(uniques, 7);
+  f_011_000_011_011_0(uniques, 7);
+  f_011_000_011_011_1(uniques, 7);
+  f_011_000_011_100_0(uniques, 7);
+  f_011_000_011_100_1(uniques, 7);
+  f_011_000_011_101_0(uniques, 7);
+  f_011_000_011_101_1(uniques, 7);
+  f_011_000_011_110_0(uniques, 7);
+  f_011_000_011_110_1(uniques, 7);
+  f_011_000_011_111_0(uniques, 7);
+  f_011_000_011_111_1(uniques, 7);
+  f_011_000_110_000_0(uniques, 7);
+  f_011_000_110_000_1(uniques, 7);
+  f_011_000_110_001_0(uniques, 7);
+  f_011_000_110_001_1(uniques, 7);
+  f_011_000_110_010_0(uniques, 7);
+  f_011_000_110_010_1(uniques, 7);
+  f_011_000_110_011_0(uniques, 7);
+  f_011_000_110_011_1(uniques, 7);
+  f_011_000_110_100_0(uniques, 7);
+  f_011_000_110_100_1(uniques, 7);
+  f_011_000_110_101_0(uniques, 7);
+  f_011_000_110_101_1(uniques, 7);
+  f_011_000_110_110_0(uniques, 7);
+  f_011_000_110_110_1(uniques, 7);
+  f_011_000_110_111_0(uniques, 7);
+  f_011_000_110_111_1(uniques, 7);
+  f_011_000_111_000_0(uniques, 7);
+  f_011_000_111_000_1(uniques, 7);
+  f_011_000_111_001_0(uniques, 7);
+  f_011_000_111_001_1(uniques, 7);
+  f_011_000_111_010_0(uniques, 7);
+  f_011_000_111_010_1(uniques, 7);
+  f_011_000_111_011_0(uniques, 7);
+  f_011_000_111_011_1(uniques, 7);
+  f_011_000_111_100_0(uniques, 7);
+  f_011_000_111_100_1(uniques, 7);
+  f_011_000_111_101_0(uniques, 7);
+  f_011_000_111_101_1(uniques, 7);
+  f_011_000_111_110_0(uniques, 7);
+  f_011_000_111_110_1(uniques, 7);
+  f_011_000_111_111_0(uniques, 7);
+  f_011_000_111_111_1(uniques, 7);
+  f_011_001_010_000_0(uniques, 7);
+  f_011_001_010_000_1(uniques, 7);
+  f_011_001_010_001_0(uniques, 7);
+  f_011_001_010_001_1(uniques, 7);
+  f_011_001_010_010_0(uniques, 7);
+  f_011_001_010_010_1(uniques, 7);
+  f_011_001_010_011_0(uniques, 7);
+  f_011_001_010_011_1(uniques, 7);
+  f_011_001_010_100_0(uniques, 7);
+  f_011_001_010_100_1(uniques, 7);
+  f_011_001_010_101_0(uniques, 7);
+  f_011_001_010_101_1(uniques, 7);
+  f_011_001_010_110_0(uniques, 7);
+  f_011_001_010_110_1(uniques, 7);
+  f_011_001_010_111_0(uniques, 7);
+  f_011_001_010_111_1(uniques, 7);
+  f_011_001_011_000_0(uniques, 7);
+  f_011_001_011_000_1(uniques, 7);
+  f_011_001_011_001_0(uniques, 7);
+  f_011_001_011_001_1(uniques, 7);
+  f_011_001_011_010_0(uniques, 7);
+  f_011_001_011_010_1(uniques, 7);
+  f_011_001_011_011_0(uniques, 7);
+  f_011_001_011_011_1(uniques, 7);
+  f_011_001_011_100_0(uniques, 7);
+  f_011_001_011_100_1(uniques, 7);
+  f_011_001_011_101_0(uniques, 7);
+  f_011_001_011_101_1(uniques, 7);
+  f_011_001_011_110_0(uniques, 7);
+  f_011_001_011_110_1(uniques, 7);
+  f_011_001_011_111_0(uniques, 7);
+  f_011_001_011_111_1(uniques, 7);
+  f_011_001_110_000_0(uniques, 7);
+  f_011_001_110_000_1(uniques, 7);
+  f_011_001_110_001_0(uniques, 7);
+  f_011_001_110_001_1(uniques, 7);
+  f_011_001_110_010_0(uniques, 7);
+  f_011_001_110_010_1(uniques, 7);
+  f_011_001_110_011_0(uniques, 7);
+  f_011_001_110_011_1(uniques, 7);
+  f_011_001_110_100_0(uniques, 7);
+  f_011_001_110_100_1(uniques, 7);
+  f_011_001_110_101_0(uniques, 7);
+  f_011_001_110_101_1(uniques, 7);
+  f_011_001_110_110_0(uniques, 7);
+  f_011_001_110_110_1(uniques, 7);
+  f_011_001_110_111_0(uniques, 7);
+  f_011_001_110_111_1(uniques, 7);
+  f_011_001_111_000_0(uniques, 7);
+  f_011_001_111_000_1(uniques, 7);
+  f_011_001_111_001_0(uniques, 7);
+  f_011_001_111_001_1(uniques, 7);
+  f_011_001_111_010_0(uniques, 7);
+  f_011_001_111_010_1(uniques, 7);
+  f_011_001_111_011_0(uniques, 7);
+  f_011_001_111_011_1(uniques, 7);
+  f_011_001_111_100_0(uniques, 7);
+  f_011_001_111_100_1(uniques, 7);
+  f_011_001_111_101_0(uniques, 7);
+  f_011_001_111_101_1(uniques, 7);
+  f_011_001_111_110_0(uniques, 7);
+  f_011_001_111_110_1(uniques, 7);
+  f_011_001_111_111_0(uniques, 7);
+  f_011_001_111_111_1(uniques, 7);
+  f_011_010_010_000_0(uniques, 7);
+  f_011_010_010_000_1(uniques, 7);
+  f_011_010_010_001_0(uniques, 7);
+  f_011_010_010_001_1(uniques, 7);
+  f_011_010_010_010_0(uniques, 7);
+  f_011_010_010_010_1(uniques, 7);
+  f_011_010_010_011_0(uniques, 7);
+  f_011_010_010_011_1(uniques, 7);
+  f_011_010_010_100_0(uniques, 7);
+  f_011_010_010_100_1(uniques, 7);
+  f_011_010_010_101_0(uniques, 7);
+  f_011_010_010_101_1(uniques, 7);
+  f_011_010_010_110_0(uniques, 7);
+  f_011_010_010_110_1(uniques, 7);
+  f_011_010_010_111_0(uniques, 7);
+  f_011_010_010_111_1(uniques, 7);
+  f_011_010_011_000_0(uniques, 7);
+  f_011_010_011_000_1(uniques, 7);
+  f_011_010_011_001_0(uniques, 7);
+  f_011_010_011_001_1(uniques, 7);
+  f_011_010_011_010_0(uniques, 7);
+  f_011_010_011_010_1(uniques, 7);
+  f_011_010_011_011_0(uniques, 7);
+  f_011_010_011_011_1(uniques, 7);
+  f_011_010_011_100_0(uniques, 7);
+  f_011_010_011_100_1(uniques, 7);
+  f_011_010_011_101_0(uniques, 7);
+  f_011_010_011_101_1(uniques, 7);
+  f_011_010_011_110_0(uniques, 7);
+  f_011_010_011_110_1(uniques, 7);
+  f_011_010_011_111_0(uniques, 7);
+  f_011_010_011_111_1(uniques, 7);
+  f_011_010_110_000_0(uniques, 7);
+  f_011_010_110_000_1(uniques, 7);
+  f_011_010_110_001_0(uniques, 7);
+  f_011_010_110_001_1(uniques, 7);
+  f_011_010_110_010_0(uniques, 7);
+  f_011_010_110_010_1(uniques, 7);
+  f_011_010_110_011_0(uniques, 7);
+  f_011_010_110_011_1(uniques, 7);
+  f_011_010_110_100_0(uniques, 7);
+  f_011_010_110_100_1(uniques, 7);
+  f_011_010_110_101_0(uniques, 7);
+  f_011_010_110_101_1(uniques, 7);
+  f_011_010_110_110_0(uniques, 7);
+  f_011_010_110_110_1(uniques, 7);
+  f_011_010_110_111_0(uniques, 7);
+  f_011_010_110_111_1(uniques, 7);
+  f_011_010_111_000_0(uniques, 7);
+  f_011_010_111_000_1(uniques, 7);
+  f_011_010_111_001_0(uniques, 7);
+  f_011_010_111_001_1(uniques, 7);
+  f_011_010_111_010_0(uniques, 7);
+  f_011_010_111_010_1(uniques, 7);
+  f_011_010_111_011_0(uniques, 7);
+  f_011_010_111_011_1(uniques, 7);
+  f_011_010_111_100_0(uniques, 7);
+  f_011_010_111_100_1(uniques, 7);
+  f_011_010_111_101_0(uniques, 7);
+  f_011_010_111_101_1(uniques, 7);
+  f_011_010_111_110_0(uniques, 7);
+  f_011_010_111_110_1(uniques, 7);
+  f_011_010_111_111_0(uniques, 7);
+  f_011_010_111_111_1(uniques, 7);
+  f_011_011_010_000_0(uniques, 7);
+  f_011_011_010_000_1(uniques, 7);
+  f_011_011_010_001_0(uniques, 7);
+  f_011_011_010_001_1(uniques, 7);
+  f_011_011_010_010_0(uniques, 7);
+  f_011_011_010_010_1(uniques, 7);
+  f_011_011_010_011_0(uniques, 7);
+  f_011_011_010_011_1(uniques, 7);
+  f_011_011_010_100_0(uniques, 7);
+  f_011_011_010_100_1(uniques, 7);
+  f_011_011_010_101_0(uniques, 7);
+  f_011_011_010_101_1(uniques, 7);
+  f_011_011_010_110_0(uniques, 7);
+  f_011_011_010_110_1(uniques, 7);
+  f_011_011_010_111_0(uniques, 7);
+  f_011_011_010_111_1(uniques, 7);
+  f_011_011_011_000_0(uniques, 7);
+  f_011_011_011_000_1(uniques, 7);
+  f_011_011_011_001_0(uniques, 7);
+  f_011_011_011_001_1(uniques, 7);
+  f_011_011_011_010_0(uniques, 7);
+  f_011_011_011_010_1(uniques, 7);
+  f_011_011_011_011_0(uniques, 7);
+  f_011_011_011_011_1(uniques, 7);
+  f_011_011_011_100_0(uniques, 7);
+  f_011_011_011_100_1(uniques, 7);
+  f_011_011_011_101_0(uniques, 7);
+  f_011_011_011_101_1(uniques, 7);
+  f_011_011_011_110_0(uniques, 7);
+  f_011_011_011_110_1(uniques, 7);
+  f_011_011_011_111_0(uniques, 7);
+  f_011_011_011_111_1(uniques, 7);
+  f_011_011_110_000_0(uniques, 7);
+  f_011_011_110_000_1(uniques, 7);
+  f_011_011_110_001_0(uniques, 7);
+  f_011_011_110_001_1(uniques, 7);
+  f_011_011_110_010_0(uniques, 7);
+  f_011_011_110_010_1(uniques, 7);
+  f_011_011_110_011_0(uniques, 7);
+  f_011_011_110_011_1(uniques, 7);
+  f_011_011_110_100_0(uniques, 7);
+  f_011_011_110_100_1(uniques, 7);
+  f_011_011_110_101_0(uniques, 7);
+  f_011_011_110_101_1(uniques, 7);
+  f_011_011_110_110_0(uniques, 7);
+  f_011_011_110_110_1(uniques, 7);
+  f_011_011_110_111_0(uniques, 7);
+  f_011_011_110_111_1(uniques, 7);
+  f_011_011_111_000_0(uniques, 7);
+  f_011_011_111_000_1(uniques, 7);
+  f_011_011_111_001_0(uniques, 7);
+  f_011_011_111_001_1(uniques, 7);
+  f_011_011_111_010_0(uniques, 7);
+  f_011_011_111_010_1(uniques, 7);
+  f_011_011_111_011_0(uniques, 7);
+  f_011_011_111_011_1(uniques, 7);
+  f_011_011_111_100_0(uniques, 7);
+  f_011_011_111_100_1(uniques, 7);
+  f_011_011_111_101_0(uniques, 7);
+  f_011_011_111_101_1(uniques, 7);
+  f_011_011_111_110_0(uniques, 7);
+  f_011_011_111_110_1(uniques, 7);
+  f_011_011_111_111_0(uniques, 7);
+  f_011_011_111_111_1(uniques, 7);
+  f_011_100_010_000_0(uniques, 7);
+  f_011_100_010_000_1(uniques, 7);
+  f_011_100_010_001_0(uniques, 7);
+  f_011_100_010_001_1(uniques, 7);
+  f_011_100_010_010_0(uniques, 7);
+  f_011_100_010_010_1(uniques, 7);
+  f_011_100_010_011_0(uniques, 7);
+  f_011_100_010_011_1(uniques, 7);
+  f_011_100_010_100_0(uniques, 7);
+  f_011_100_010_100_1(uniques, 7);
+  f_011_100_010_101_0(uniques, 7);
+  f_011_100_010_101_1(uniques, 7);
+  f_011_100_010_110_0(uniques, 7);
+  f_011_100_010_110_1(uniques, 7);
+  f_011_100_010_111_0(uniques, 7);
+  f_011_100_010_111_1(uniques, 7);
+  f_011_100_011_000_0(uniques, 7);
+  f_011_100_011_000_1(uniques, 7);
+  f_011_100_011_001_0(uniques, 7);
+  f_011_100_011_001_1(uniques, 7);
+  f_011_100_011_010_0(uniques, 7);
+  f_011_100_011_010_1(uniques, 7);
+  f_011_100_011_011_0(uniques, 7);
+  f_011_100_011_011_1(uniques, 7);
+  f_011_100_011_100_0(uniques, 7);
+  f_011_100_011_100_1(uniques, 7);
+  f_011_100_011_101_0(uniques, 7);
+  f_011_100_011_101_1(uniques, 7);
+  f_011_100_011_110_0(uniques, 7);
+  f_011_100_011_110_1(uniques, 7);
+  f_011_100_011_111_0(uniques, 7);
+  f_011_100_011_111_1(uniques, 7);
+  f_011_100_110_000_0(uniques, 7);
+  f_011_100_110_000_1(uniques, 7);
+  f_011_100_110_001_0(uniques, 7);
+  f_011_100_110_001_1(uniques, 7);
+  f_011_100_110_010_0(uniques, 7);
+  f_011_100_110_010_1(uniques, 7);
+  f_011_100_110_011_0(uniques, 7);
+  f_011_100_110_011_1(uniques, 7);
+  f_011_100_110_100_0(uniques, 7);
+  f_011_100_110_100_1(uniques, 7);
+  f_011_100_110_101_0(uniques, 7);
+  f_011_100_110_101_1(uniques, 7);
+  f_011_100_110_110_0(uniques, 7);
+  f_011_100_110_110_1(uniques, 7);
+  f_011_100_110_111_0(uniques, 7);
+  f_011_100_110_111_1(uniques, 7);
+  f_011_100_111_000_0(uniques, 7);
+  f_011_100_111_000_1(uniques, 7);
+  f_011_100_111_001_0(uniques, 7);
+  f_011_100_111_001_1(uniques, 7);
+  f_011_100_111_010_0(uniques, 7);
+  f_011_100_111_010_1(uniques, 7);
+  f_011_100_111_011_0(uniques, 7);
+  f_011_100_111_011_1(uniques, 7);
+  f_011_100_111_100_0(uniques, 7);
+  f_011_100_111_100_1(uniques, 7);
+  f_011_100_111_101_0(uniques, 7);
+  f_011_100_111_101_1(uniques, 7);
+  f_011_100_111_110_0(uniques, 7);
+  f_011_100_111_110_1(uniques, 7);
+  f_011_100_111_111_0(uniques, 7);
+  f_011_100_111_111_1(uniques, 7);
+  f_011_101_010_000_0(uniques, 7);
+  f_011_101_010_000_1(uniques, 7);
+  f_011_101_010_001_0(uniques, 7);
+  f_011_101_010_001_1(uniques, 7);
+  f_011_101_010_010_0(uniques, 7);
+  f_011_101_010_010_1(uniques, 7);
+  f_011_101_010_011_0(uniques, 7);
+  f_011_101_010_011_1(uniques, 7);
+  f_011_101_010_100_0(uniques, 7);
+  f_011_101_010_100_1(uniques, 7);
+  f_011_101_010_101_0(uniques, 7);
+  f_011_101_010_101_1(uniques, 7);
+  f_011_101_010_110_0(uniques, 7);
+  f_011_101_010_110_1(uniques, 7);
+  f_011_101_010_111_0(uniques, 7);
+  f_011_101_010_111_1(uniques, 7);
+  f_011_101_011_000_0(uniques, 7);
+  f_011_101_011_000_1(uniques, 7);
+  f_011_101_011_001_0(uniques, 7);
+  f_011_101_011_001_1(uniques, 7);
+  f_011_101_011_010_0(uniques, 7);
+  f_011_101_011_010_1(uniques, 7);
+  f_011_101_011_011_0(uniques, 7);
+  f_011_101_011_011_1(uniques, 7);
+  f_011_101_011_100_0(uniques, 7);
+  f_011_101_011_100_1(uniques, 7);
+  f_011_101_011_101_0(uniques, 7);
+  f_011_101_011_101_1(uniques, 7);
+  f_011_101_011_110_0(uniques, 7);
+  f_011_101_011_110_1(uniques, 7);
+  f_011_101_011_111_0(uniques, 7);
+  f_011_101_011_111_1(uniques, 7);
+  f_011_101_110_000_0(uniques, 7);
+  f_011_101_110_000_1(uniques, 7);
+  f_011_101_110_001_0(uniques, 7);
+  f_011_101_110_001_1(uniques, 7);
+  f_011_101_110_010_0(uniques, 7);
+  f_011_101_110_010_1(uniques, 7);
+  f_011_101_110_011_0(uniques, 7);
+  f_011_101_110_011_1(uniques, 7);
+  f_011_101_110_100_0(uniques, 7);
+  f_011_101_110_100_1(uniques, 7);
+  f_011_101_110_101_0(uniques, 7);
+  f_011_101_110_101_1(uniques, 7);
+  f_011_101_110_110_0(uniques, 7);
+  f_011_101_110_110_1(uniques, 7);
+  f_011_101_110_111_0(uniques, 7);
+  f_011_101_110_111_1(uniques, 7);
+  f_011_101_111_000_0(uniques, 7);
+  f_011_101_111_000_1(uniques, 7);
+  f_011_101_111_001_0(uniques, 7);
+  f_011_101_111_001_1(uniques, 7);
+  f_011_101_111_010_0(uniques, 7);
+  f_011_101_111_010_1(uniques, 7);
+  f_011_101_111_011_0(uniques, 7);
+  f_011_101_111_011_1(uniques, 7);
+  f_011_101_111_100_0(uniques, 7);
+  f_011_101_111_100_1(uniques, 7);
+  f_011_101_111_101_0(uniques, 7);
+  f_011_101_111_101_1(uniques, 7);
+  f_011_101_111_110_0(uniques, 7);
+  f_011_101_111_110_1(uniques, 7);
+  f_011_101_111_111_0(uniques, 7);
+  f_011_101_111_111_1(uniques, 7);
+  f_011_110_010_000_0(uniques, 7);
+  f_011_110_010_000_1(uniques, 7);
+  f_011_110_010_001_0(uniques, 7);
+  f_011_110_010_001_1(uniques, 7);
+  f_011_110_010_010_0(uniques, 7);
+  f_011_110_010_010_1(uniques, 7);
+  f_011_110_010_011_0(uniques, 7);
+  f_011_110_010_011_1(uniques, 7);
+  f_011_110_010_100_0(uniques, 7);
+  f_011_110_010_100_1(uniques, 7);
+  f_011_110_010_101_0(uniques, 7);
+  f_011_110_010_101_1(uniques, 7);
+  f_011_110_010_110_0(uniques, 7);
+  f_011_110_010_110_1(uniques, 7);
+  f_011_110_010_111_0(uniques, 7);
+  f_011_110_010_111_1(uniques, 7);
+  f_011_110_011_000_0(uniques, 7);
+  f_011_110_011_000_1(uniques, 7);
+  f_011_110_011_001_0(uniques, 7);
+  f_011_110_011_001_1(uniques, 7);
+  f_011_110_011_010_0(uniques, 7);
+  f_011_110_011_010_1(uniques, 7);
+  f_011_110_011_011_0(uniques, 7);
+  f_011_110_011_011_1(uniques, 7);
+  f_011_110_011_100_0(uniques, 7);
+  f_011_110_011_100_1(uniques, 7);
+  f_011_110_011_101_0(uniques, 7);
+  f_011_110_011_101_1(uniques, 7);
+  f_011_110_011_110_0(uniques, 7);
+  f_011_110_011_110_1(uniques, 7);
+  f_011_110_011_111_0(uniques, 7);
+  f_011_110_011_111_1(uniques, 7);
+  f_011_110_110_000_0(uniques, 7);
+  f_011_110_110_000_1(uniques, 7);
+  f_011_110_110_001_0(uniques, 7);
+  f_011_110_110_001_1(uniques, 7);
+  f_011_110_110_010_0(uniques, 7);
+  f_011_110_110_010_1(uniques, 7);
+  f_011_110_110_011_0(uniques, 7);
+  f_011_110_110_011_1(uniques, 7);
+  f_011_110_110_100_0(uniques, 7);
+  f_011_110_110_100_1(uniques, 7);
+  f_011_110_110_101_0(uniques, 7);
+  f_011_110_110_101_1(uniques, 7);
+  f_011_110_110_110_0(uniques, 7);
+  f_011_110_110_110_1(uniques, 7);
+  f_011_110_110_111_0(uniques, 7);
+  f_011_110_110_111_1(uniques, 7);
+  f_011_110_111_000_0(uniques, 7);
+  f_011_110_111_000_1(uniques, 7);
+  f_011_110_111_001_0(uniques, 7);
+  f_011_110_111_001_1(uniques, 7);
+  f_011_110_111_010_0(uniques, 7);
+  f_011_110_111_010_1(uniques, 7);
+  f_011_110_111_011_0(uniques, 7);
+  f_011_110_111_011_1(uniques, 7);
+  f_011_110_111_100_0(uniques, 7);
+  f_011_110_111_100_1(uniques, 7);
+  f_011_110_111_101_0(uniques, 7);
+  f_011_110_111_101_1(uniques, 7);
+  f_011_110_111_110_0(uniques, 7);
+  f_011_110_111_110_1(uniques, 7);
+  f_011_110_111_111_0(uniques, 7);
+  f_011_110_111_111_1(uniques, 7);
+  f_011_111_010_000_0(uniques, 7);
+  f_011_111_010_000_1(uniques, 7);
+  f_011_111_010_001_0(uniques, 7);
+  f_011_111_010_001_1(uniques, 7);
+  f_011_111_010_010_0(uniques, 7);
+  f_011_111_010_010_1(uniques, 7);
+  f_011_111_010_011_0(uniques, 7);
+  f_011_111_010_011_1(uniques, 7);
+  f_011_111_010_100_0(uniques, 7);
+  f_011_111_010_100_1(uniques, 7);
+  f_011_111_010_101_0(uniques, 7);
+  f_011_111_010_101_1(uniques, 7);
+  f_011_111_010_110_0(uniques, 7);
+  f_011_111_010_110_1(uniques, 7);
+  f_011_111_010_111_0(uniques, 7);
+  f_011_111_010_111_1(uniques, 7);
+  f_011_111_011_000_0(uniques, 7);
+  f_011_111_011_000_1(uniques, 7);
+  f_011_111_011_001_0(uniques, 7);
+  f_011_111_011_001_1(uniques, 7);
+  f_011_111_011_010_0(uniques, 7);
+  f_011_111_011_010_1(uniques, 7);
+  f_011_111_011_011_0(uniques, 7);
+  f_011_111_011_011_1(uniques, 7);
+  f_011_111_011_100_0(uniques, 7);
+  f_011_111_011_100_1(uniques, 7);
+  f_011_111_011_101_0(uniques, 7);
+  f_011_111_011_101_1(uniques, 7);
+  f_011_111_011_110_0(uniques, 7);
+  f_011_111_011_110_1(uniques, 7);
+  f_011_111_011_111_0(uniques, 7);
+  f_011_111_011_111_1(uniques, 7);
+  f_011_111_110_000_0(uniques, 7);
+  f_011_111_110_000_1(uniques, 7);
+  f_011_111_110_001_0(uniques, 7);
+  f_011_111_110_001_1(uniques, 7);
+  f_011_111_110_010_0(uniques, 7);
+  f_011_111_110_010_1(uniques, 7);
+  f_011_111_110_011_0(uniques, 7);
+  f_011_111_110_011_1(uniques, 7);
+  f_011_111_110_100_0(uniques, 7);
+  f_011_111_110_100_1(uniques, 7);
+  f_011_111_110_101_0(uniques, 7);
+  f_011_111_110_101_1(uniques, 7);
+  f_011_111_110_110_0(uniques, 7);
+  f_011_111_110_110_1(uniques, 7);
+  f_011_111_110_111_0(uniques, 7);
+  f_011_111_110_111_1(uniques, 7);
+  f_011_111_111_000_0(uniques, 7);
+  f_011_111_111_000_1(uniques, 7);
+  f_011_111_111_001_0(uniques, 7);
+  f_011_111_111_001_1(uniques, 7);
+  f_011_111_111_010_0(uniques, 7);
+  f_011_111_111_010_1(uniques, 7);
+  f_011_111_111_011_0(uniques, 7);
+  f_011_111_111_011_1(uniques, 7);
+  f_011_111_111_100_0(uniques, 7);
+  f_011_111_111_100_1(uniques, 7);
+  f_011_111_111_101_0(uniques, 7);
+  f_011_111_111_101_1(uniques, 7);
+  f_011_111_111_110_0(uniques, 7);
+  f_011_111_111_110_1(uniques, 7);
+  f_011_111_111_111_0(uniques, 7);
+  f_011_111_111_111_1(uniques, 7);
+  f_100_000_010_000_0(uniques, 7);
+  f_100_000_010_000_1(uniques, 7);
+  f_100_000_010_001_0(uniques, 7);
+  f_100_000_010_001_1(uniques, 7);
+  f_100_000_010_010_0(uniques, 7);
+  f_100_000_010_010_1(uniques, 7);
+  f_100_000_010_011_0(uniques, 7);
+  f_100_000_010_011_1(uniques, 7);
+  f_100_000_010_100_0(uniques, 7);
+  f_100_000_010_100_1(uniques, 7);
+  f_100_000_010_101_0(uniques, 7);
+  f_100_000_010_101_1(uniques, 7);
+  f_100_000_010_110_0(uniques, 7);
+  f_100_000_010_110_1(uniques, 7);
+  f_100_000_010_111_0(uniques, 7);
+  f_100_000_010_111_1(uniques, 7);
+  f_100_000_011_000_0(uniques, 7);
+  f_100_000_011_000_1(uniques, 7);
+  f_100_000_011_001_0(uniques, 7);
+  f_100_000_011_001_1(uniques, 7);
+  f_100_000_011_010_0(uniques, 7);
+  f_100_000_011_010_1(uniques, 7);
+  f_100_000_011_011_0(uniques, 7);
+  f_100_000_011_011_1(uniques, 7);
+  f_100_000_011_100_0(uniques, 7);
+  f_100_000_011_100_1(uniques, 7);
+  f_100_000_011_101_0(uniques, 7);
+  f_100_000_011_101_1(uniques, 7);
+  f_100_000_011_110_0(uniques, 7);
+  f_100_000_011_110_1(uniques, 7);
+  f_100_000_011_111_0(uniques, 7);
+  f_100_000_011_111_1(uniques, 7);
+  f_100_000_110_000_0(uniques, 7);
+  f_100_000_110_000_1(uniques, 7);
+  f_100_000_110_001_0(uniques, 7);
+  f_100_000_110_001_1(uniques, 7);
+  f_100_000_110_010_0(uniques, 7);
+  f_100_000_110_010_1(uniques, 7);
+  f_100_000_110_011_0(uniques, 7);
+  f_100_000_110_011_1(uniques, 7);
+  f_100_000_110_100_0(uniques, 7);
+  f_100_000_110_100_1(uniques, 7);
+  f_100_000_110_101_0(uniques, 7);
+  f_100_000_110_101_1(uniques, 7);
+  f_100_000_110_110_0(uniques, 7);
+  f_100_000_110_110_1(uniques, 7);
+  f_100_000_110_111_0(uniques, 7);
+  f_100_000_110_111_1(uniques, 7);
+  f_100_000_111_000_0(uniques, 7);
+  f_100_000_111_000_1(uniques, 7);
+  f_100_000_111_001_0(uniques, 7);
+  f_100_000_111_001_1(uniques, 7);
+  f_100_000_111_010_0(uniques, 7);
+  f_100_000_111_010_1(uniques, 7);
+  f_100_000_111_011_0(uniques, 7);
+  f_100_000_111_011_1(uniques, 7);
+  f_100_000_111_100_0(uniques, 7);
+  f_100_000_111_100_1(uniques, 7);
+  f_100_000_111_101_0(uniques, 7);
+  f_100_000_111_101_1(uniques, 7);
+  f_100_000_111_110_0(uniques, 7);
+  f_100_000_111_110_1(uniques, 7);
+  f_100_000_111_111_0(uniques, 7);
+  f_100_000_111_111_1(uniques, 7);
+  f_100_001_010_000_0(uniques, 7);
+  f_100_001_010_000_1(uniques, 7);
+  f_100_001_010_001_0(uniques, 7);
+  f_100_001_010_001_1(uniques, 7);
+  f_100_001_010_010_0(uniques, 7);
+  f_100_001_010_010_1(uniques, 7);
+  f_100_001_010_011_0(uniques, 7);
+  f_100_001_010_011_1(uniques, 7);
+  f_100_001_010_100_0(uniques, 7);
+  f_100_001_010_100_1(uniques, 7);
+  f_100_001_010_101_0(uniques, 7);
+  f_100_001_010_101_1(uniques, 7);
+  f_100_001_010_110_0(uniques, 7);
+  f_100_001_010_110_1(uniques, 7);
+  f_100_001_010_111_0(uniques, 7);
+  f_100_001_010_111_1(uniques, 7);
+  f_100_001_011_000_0(uniques, 7);
+  f_100_001_011_000_1(uniques, 7);
+  f_100_001_011_001_0(uniques, 7);
+  f_100_001_011_001_1(uniques, 7);
+  f_100_001_011_010_0(uniques, 7);
+  f_100_001_011_010_1(uniques, 7);
+  f_100_001_011_011_0(uniques, 7);
+  f_100_001_011_011_1(uniques, 7);
+  f_100_001_011_100_0(uniques, 7);
+  f_100_001_011_100_1(uniques, 7);
+  f_100_001_011_101_0(uniques, 7);
+  f_100_001_011_101_1(uniques, 7);
+  f_100_001_011_110_0(uniques, 7);
+  f_100_001_011_110_1(uniques, 7);
+  f_100_001_011_111_0(uniques, 7);
+  f_100_001_011_111_1(uniques, 7);
+  f_100_001_110_000_0(uniques, 7);
+  f_100_001_110_000_1(uniques, 7);
+  f_100_001_110_001_0(uniques, 7);
+  f_100_001_110_001_1(uniques, 7);
+  f_100_001_110_010_0(uniques, 7);
+  f_100_001_110_010_1(uniques, 7);
+  f_100_001_110_011_0(uniques, 7);
+  f_100_001_110_011_1(uniques, 7);
+  f_100_001_110_100_0(uniques, 7);
+  f_100_001_110_100_1(uniques, 7);
+  f_100_001_110_101_0(uniques, 7);
+  f_100_001_110_101_1(uniques, 7);
+  f_100_001_110_110_0(uniques, 7);
+  f_100_001_110_110_1(uniques, 7);
+  f_100_001_110_111_0(uniques, 7);
+  f_100_001_110_111_1(uniques, 7);
+  f_100_001_111_000_0(uniques, 7);
+  f_100_001_111_000_1(uniques, 7);
+  f_100_001_111_001_0(uniques, 7);
+  f_100_001_111_001_1(uniques, 7);
+  f_100_001_111_010_0(uniques, 7);
+  f_100_001_111_010_1(uniques, 7);
+  f_100_001_111_011_0(uniques, 7);
+  f_100_001_111_011_1(uniques, 7);
+  f_100_001_111_100_0(uniques, 7);
+  f_100_001_111_100_1(uniques, 7);
+  f_100_001_111_101_0(uniques, 7);
+  f_100_001_111_101_1(uniques, 7);
+  f_100_001_111_110_0(uniques, 7);
+  f_100_001_111_110_1(uniques, 7);
+  f_100_001_111_111_0(uniques, 7);
+  f_100_001_111_111_1(uniques, 7);
+  f_100_010_010_000_0(uniques, 7);
+  f_100_010_010_000_1(uniques, 7);
+  f_100_010_010_001_0(uniques, 7);
+  f_100_010_010_001_1(uniques, 7);
+  f_100_010_010_010_0(uniques, 7);
+  f_100_010_010_010_1(uniques, 7);
+  f_100_010_010_011_0(uniques, 7);
+  f_100_010_010_011_1(uniques, 7);
+  f_100_010_010_100_0(uniques, 7);
+  f_100_010_010_100_1(uniques, 7);
+  f_100_010_010_101_0(uniques, 7);
+  f_100_010_010_101_1(uniques, 7);
+  f_100_010_010_110_0(uniques, 7);
+  f_100_010_010_110_1(uniques, 7);
+  f_100_010_010_111_0(uniques, 7);
+  f_100_010_010_111_1(uniques, 7);
+  f_100_010_011_000_0(uniques, 7);
+  f_100_010_011_000_1(uniques, 7);
+  f_100_010_011_001_0(uniques, 7);
+  f_100_010_011_001_1(uniques, 7);
+  f_100_010_011_010_0(uniques, 7);
+  f_100_010_011_010_1(uniques, 7);
+  f_100_010_011_011_0(uniques, 7);
+  f_100_010_011_011_1(uniques, 7);
+  f_100_010_011_100_0(uniques, 7);
+  f_100_010_011_100_1(uniques, 7);
+  f_100_010_011_101_0(uniques, 7);
+  f_100_010_011_101_1(uniques, 7);
+  f_100_010_011_110_0(uniques, 7);
+  f_100_010_011_110_1(uniques, 7);
+  f_100_010_011_111_0(uniques, 7);
+  f_100_010_011_111_1(uniques, 7);
+  f_100_010_110_000_0(uniques, 7);
+  f_100_010_110_000_1(uniques, 7);
+  f_100_010_110_001_0(uniques, 7);
+  f_100_010_110_001_1(uniques, 7);
+  f_100_010_110_010_0(uniques, 7);
+  f_100_010_110_010_1(uniques, 7);
+  f_100_010_110_011_0(uniques, 7);
+  f_100_010_110_011_1(uniques, 7);
+  f_100_010_110_100_0(uniques, 7);
+  f_100_010_110_100_1(uniques, 7);
+  f_100_010_110_101_0(uniques, 7);
+  f_100_010_110_101_1(uniques, 7);
+  f_100_010_110_110_0(uniques, 7);
+  f_100_010_110_110_1(uniques, 7);
+  f_100_010_110_111_0(uniques, 7);
+  f_100_010_110_111_1(uniques, 7);
+  f_100_010_111_000_0(uniques, 7);
+  f_100_010_111_000_1(uniques, 7);
+  f_100_010_111_001_0(uniques, 7);
+  f_100_010_111_001_1(uniques, 7);
+  f_100_010_111_010_0(uniques, 7);
+  f_100_010_111_010_1(uniques, 7);
+  f_100_010_111_011_0(uniques, 7);
+  f_100_010_111_011_1(uniques, 7);
+  f_100_010_111_100_0(uniques, 7);
+  f_100_010_111_100_1(uniques, 7);
+  f_100_010_111_101_0(uniques, 7);
+  f_100_010_111_101_1(uniques, 7);
+  f_100_010_111_110_0(uniques, 7);
+  f_100_010_111_110_1(uniques, 7);
+  f_100_010_111_111_0(uniques, 7);
+  f_100_010_111_111_1(uniques, 7);
+  f_100_011_010_000_0(uniques, 7);
+  f_100_011_010_000_1(uniques, 7);
+  f_100_011_010_001_0(uniques, 7);
+  f_100_011_010_001_1(uniques, 7);
+  f_100_011_010_010_0(uniques, 7);
+  f_100_011_010_010_1(uniques, 7);
+  f_100_011_010_011_0(uniques, 7);
+  f_100_011_010_011_1(uniques, 7);
+  f_100_011_010_100_0(uniques, 7);
+  f_100_011_010_100_1(uniques, 7);
+  f_100_011_010_101_0(uniques, 7);
+  f_100_011_010_101_1(uniques, 7);
+  f_100_011_010_110_0(uniques, 7);
+  f_100_011_010_110_1(uniques, 7);
+  f_100_011_010_111_0(uniques, 7);
+  f_100_011_010_111_1(uniques, 7);
+  f_100_011_011_000_0(uniques, 7);
+  f_100_011_011_000_1(uniques, 7);
+  f_100_011_011_001_0(uniques, 7);
+  f_100_011_011_001_1(uniques, 7);
+  f_100_011_011_010_0(uniques, 7);
+  f_100_011_011_010_1(uniques, 7);
+  f_100_011_011_011_0(uniques, 7);
+  f_100_011_011_011_1(uniques, 7);
+  f_100_011_011_100_0(uniques, 7);
+  f_100_011_011_100_1(uniques, 7);
+  f_100_011_011_101_0(uniques, 7);
+  f_100_011_011_101_1(uniques, 7);
+  f_100_011_011_110_0(uniques, 7);
+  f_100_011_011_110_1(uniques, 7);
+  f_100_011_011_111_0(uniques, 7);
+  f_100_011_011_111_1(uniques, 7);
+  f_100_011_110_000_0(uniques, 7);
+  f_100_011_110_000_1(uniques, 7);
+  f_100_011_110_001_0(uniques, 7);
+  f_100_011_110_001_1(uniques, 7);
+  f_100_011_110_010_0(uniques, 7);
+  f_100_011_110_010_1(uniques, 7);
+  f_100_011_110_011_0(uniques, 7);
+  f_100_011_110_011_1(uniques, 7);
+  f_100_011_110_100_0(uniques, 7);
+  f_100_011_110_100_1(uniques, 7);
+  f_100_011_110_101_0(uniques, 7);
+  f_100_011_110_101_1(uniques, 7);
+  f_100_011_110_110_0(uniques, 7);
+  f_100_011_110_110_1(uniques, 7);
+  f_100_011_110_111_0(uniques, 7);
+  f_100_011_110_111_1(uniques, 7);
+  f_100_011_111_000_0(uniques, 7);
+  f_100_011_111_000_1(uniques, 7);
+  f_100_011_111_001_0(uniques, 7);
+  f_100_011_111_001_1(uniques, 7);
+  f_100_011_111_010_0(uniques, 7);
+  f_100_011_111_010_1(uniques, 7);
+  f_100_011_111_011_0(uniques, 7);
+  f_100_011_111_011_1(uniques, 7);
+  f_100_011_111_100_0(uniques, 7);
+  f_100_011_111_100_1(uniques, 7);
+  f_100_011_111_101_0(uniques, 7);
+  f_100_011_111_101_1(uniques, 7);
+  f_100_011_111_110_0(uniques, 7);
+  f_100_011_111_110_1(uniques, 7);
+  f_100_011_111_111_0(uniques, 7);
+  f_100_011_111_111_1(uniques, 7);
+  f_100_100_010_000_0(uniques, 7);
+  f_100_100_010_000_1(uniques, 7);
+  f_100_100_010_001_0(uniques, 7);
+  f_100_100_010_001_1(uniques, 7);
+  f_100_100_010_010_0(uniques, 7);
+  f_100_100_010_010_1(uniques, 7);
+  f_100_100_010_011_0(uniques, 7);
+  f_100_100_010_011_1(uniques, 7);
+  f_100_100_010_100_0(uniques, 7);
+  f_100_100_010_100_1(uniques, 7);
+  f_100_100_010_101_0(uniques, 7);
+  f_100_100_010_101_1(uniques, 7);
+  f_100_100_010_110_0(uniques, 7);
+  f_100_100_010_110_1(uniques, 7);
+  f_100_100_010_111_0(uniques, 7);
+  f_100_100_010_111_1(uniques, 7);
+  f_100_100_011_000_0(uniques, 7);
+  f_100_100_011_000_1(uniques, 7);
+  f_100_100_011_001_0(uniques, 7);
+  f_100_100_011_001_1(uniques, 7);
+  f_100_100_011_010_0(uniques, 7);
+  f_100_100_011_010_1(uniques, 7);
+  f_100_100_011_011_0(uniques, 7);
+  f_100_100_011_011_1(uniques, 7);
+  f_100_100_011_100_0(uniques, 7);
+  f_100_100_011_100_1(uniques, 7);
+  f_100_100_011_101_0(uniques, 7);
+  f_100_100_011_101_1(uniques, 7);
+  f_100_100_011_110_0(uniques, 7);
+  f_100_100_011_110_1(uniques, 7);
+  f_100_100_011_111_0(uniques, 7);
+  f_100_100_011_111_1(uniques, 7);
+  f_100_100_110_000_0(uniques, 7);
+  f_100_100_110_000_1(uniques, 7);
+  f_100_100_110_001_0(uniques, 7);
+  f_100_100_110_001_1(uniques, 7);
+  f_100_100_110_010_0(uniques, 7);
+  f_100_100_110_010_1(uniques, 7);
+  f_100_100_110_011_0(uniques, 7);
+  f_100_100_110_011_1(uniques, 7);
+  f_100_100_110_100_0(uniques, 7);
+  f_100_100_110_100_1(uniques, 7);
+  f_100_100_110_101_0(uniques, 7);
+  f_100_100_110_101_1(uniques, 7);
+  f_100_100_110_110_0(uniques, 7);
+  f_100_100_110_110_1(uniques, 7);
+  f_100_100_110_111_0(uniques, 7);
+  f_100_100_110_111_1(uniques, 7);
+  f_100_100_111_000_0(uniques, 7);
+  f_100_100_111_000_1(uniques, 7);
+  f_100_100_111_001_0(uniques, 7);
+  f_100_100_111_001_1(uniques, 7);
+  f_100_100_111_010_0(uniques, 7);
+  f_100_100_111_010_1(uniques, 7);
+  f_100_100_111_011_0(uniques, 7);
+  f_100_100_111_011_1(uniques, 7);
+  f_100_100_111_100_0(uniques, 7);
+  f_100_100_111_100_1(uniques, 7);
+  f_100_100_111_101_0(uniques, 7);
+  f_100_100_111_101_1(uniques, 7);
+  f_100_100_111_110_0(uniques, 7);
+  f_100_100_111_110_1(uniques, 7);
+  f_100_100_111_111_0(uniques, 7);
+  f_100_100_111_111_1(uniques, 7);
+  f_100_101_010_000_0(uniques, 7);
+  f_100_101_010_000_1(uniques, 7);
+  f_100_101_010_001_0(uniques, 7);
+  f_100_101_010_001_1(uniques, 7);
+  f_100_101_010_010_0(uniques, 7);
+  f_100_101_010_010_1(uniques, 7);
+  f_100_101_010_011_0(uniques, 7);
+  f_100_101_010_011_1(uniques, 7);
+  f_100_101_010_100_0(uniques, 7);
+  f_100_101_010_100_1(uniques, 7);
+  f_100_101_010_101_0(uniques, 7);
+  f_100_101_010_101_1(uniques, 7);
+  f_100_101_010_110_0(uniques, 7);
+  f_100_101_010_110_1(uniques, 7);
+  f_100_101_010_111_0(uniques, 7);
+  f_100_101_010_111_1(uniques, 7);
+  f_100_101_011_000_0(uniques, 7);
+  f_100_101_011_000_1(uniques, 7);
+  f_100_101_011_001_0(uniques, 7);
+  f_100_101_011_001_1(uniques, 7);
+  f_100_101_011_010_0(uniques, 7);
+  f_100_101_011_010_1(uniques, 7);
+  f_100_101_011_011_0(uniques, 7);
+  f_100_101_011_011_1(uniques, 7);
+  f_100_101_011_100_0(uniques, 7);
+  f_100_101_011_100_1(uniques, 7);
+  f_100_101_011_101_0(uniques, 7);
+  f_100_101_011_101_1(uniques, 7);
+  f_100_101_011_110_0(uniques, 7);
+  f_100_101_011_110_1(uniques, 7);
+  f_100_101_011_111_0(uniques, 7);
+  f_100_101_011_111_1(uniques, 7);
+  f_100_101_110_000_0(uniques, 7);
+  f_100_101_110_000_1(uniques, 7);
+  f_100_101_110_001_0(uniques, 7);
+  f_100_101_110_001_1(uniques, 7);
+  f_100_101_110_010_0(uniques, 7);
+  f_100_101_110_010_1(uniques, 7);
+  f_100_101_110_011_0(uniques, 7);
+  f_100_101_110_011_1(uniques, 7);
+  f_100_101_110_100_0(uniques, 7);
+  f_100_101_110_100_1(uniques, 7);
+  f_100_101_110_101_0(uniques, 7);
+  f_100_101_110_101_1(uniques, 7);
+  f_100_101_110_110_0(uniques, 7);
+  f_100_101_110_110_1(uniques, 7);
+  f_100_101_110_111_0(uniques, 7);
+  f_100_101_110_111_1(uniques, 7);
+  f_100_101_111_000_0(uniques, 7);
+  f_100_101_111_000_1(uniques, 7);
+  f_100_101_111_001_0(uniques, 7);
+  f_100_101_111_001_1(uniques, 7);
+  f_100_101_111_010_0(uniques, 7);
+  f_100_101_111_010_1(uniques, 7);
+  f_100_101_111_011_0(uniques, 7);
+  f_100_101_111_011_1(uniques, 7);
+  f_100_101_111_100_0(uniques, 7);
+  f_100_101_111_100_1(uniques, 7);
+  f_100_101_111_101_0(uniques, 7);
+  f_100_101_111_101_1(uniques, 7);
+  f_100_101_111_110_0(uniques, 7);
+  f_100_101_111_110_1(uniques, 7);
+  f_100_101_111_111_0(uniques, 7);
+  f_100_101_111_111_1(uniques, 7);
+  f_100_110_010_000_0(uniques, 7);
+  f_100_110_010_000_1(uniques, 7);
+  f_100_110_010_001_0(uniques, 7);
+  f_100_110_010_001_1(uniques, 7);
+  f_100_110_010_010_0(uniques, 7);
+  f_100_110_010_010_1(uniques, 7);
+  f_100_110_010_011_0(uniques, 7);
+  f_100_110_010_011_1(uniques, 7);
+  f_100_110_010_100_0(uniques, 7);
+  f_100_110_010_100_1(uniques, 7);
+  f_100_110_010_101_0(uniques, 7);
+  f_100_110_010_101_1(uniques, 7);
+  f_100_110_010_110_0(uniques, 7);
+  f_100_110_010_110_1(uniques, 7);
+  f_100_110_010_111_0(uniques, 7);
+  f_100_110_010_111_1(uniques, 7);
+  f_100_110_011_000_0(uniques, 7);
+  f_100_110_011_000_1(uniques, 7);
+  f_100_110_011_001_0(uniques, 7);
+  f_100_110_011_001_1(uniques, 7);
+  f_100_110_011_010_0(uniques, 7);
+  f_100_110_011_010_1(uniques, 7);
+  f_100_110_011_011_0(uniques, 7);
+  f_100_110_011_011_1(uniques, 7);
+  f_100_110_011_100_0(uniques, 7);
+  f_100_110_011_100_1(uniques, 7);
+  f_100_110_011_101_0(uniques, 7);
+  f_100_110_011_101_1(uniques, 7);
+  f_100_110_011_110_0(uniques, 7);
+  f_100_110_011_110_1(uniques, 7);
+  f_100_110_011_111_0(uniques, 7);
+  f_100_110_011_111_1(uniques, 7);
+  f_100_110_110_000_0(uniques, 7);
+  f_100_110_110_000_1(uniques, 7);
+  f_100_110_110_001_0(uniques, 7);
+  f_100_110_110_001_1(uniques, 7);
+  f_100_110_110_010_0(uniques, 7);
+  f_100_110_110_010_1(uniques, 7);
+  f_100_110_110_011_0(uniques, 7);
+  f_100_110_110_011_1(uniques, 7);
+  f_100_110_110_100_0(uniques, 7);
+  f_100_110_110_100_1(uniques, 7);
+  f_100_110_110_101_0(uniques, 7);
+  f_100_110_110_101_1(uniques, 7);
+  f_100_110_110_110_0(uniques, 7);
+  f_100_110_110_110_1(uniques, 7);
+  f_100_110_110_111_0(uniques, 7);
+  f_100_110_110_111_1(uniques, 7);
+  f_100_110_111_000_0(uniques, 7);
+  f_100_110_111_000_1(uniques, 7);
+  f_100_110_111_001_0(uniques, 7);
+  f_100_110_111_001_1(uniques, 7);
+  f_100_110_111_010_0(uniques, 7);
+  f_100_110_111_010_1(uniques, 7);
+  f_100_110_111_011_0(uniques, 7);
+  f_100_110_111_011_1(uniques, 7);
+  f_100_110_111_100_0(uniques, 7);
+  f_100_110_111_100_1(uniques, 7);
+  f_100_110_111_101_0(uniques, 7);
+  f_100_110_111_101_1(uniques, 7);
+  f_100_110_111_110_0(uniques, 7);
+  f_100_110_111_110_1(uniques, 7);
+  f_100_110_111_111_0(uniques, 7);
+  f_100_110_111_111_1(uniques, 7);
+  f_100_111_010_000_0(uniques, 7);
+  f_100_111_010_000_1(uniques, 7);
+  f_100_111_010_001_0(uniques, 7);
+  f_100_111_010_001_1(uniques, 7);
+  f_100_111_010_010_0(uniques, 7);
+  f_100_111_010_010_1(uniques, 7);
+  f_100_111_010_011_0(uniques, 7);
+  f_100_111_010_011_1(uniques, 7);
+  f_100_111_010_100_0(uniques, 7);
+  f_100_111_010_100_1(uniques, 7);
+  f_100_111_010_101_0(uniques, 7);
+  f_100_111_010_101_1(uniques, 7);
+  f_100_111_010_110_0(uniques, 7);
+  f_100_111_010_110_1(uniques, 7);
+  f_100_111_010_111_0(uniques, 7);
+  f_100_111_010_111_1(uniques, 7);
+  f_100_111_011_000_0(uniques, 7);
+  f_100_111_011_000_1(uniques, 7);
+  f_100_111_011_001_0(uniques, 7);
+  f_100_111_011_001_1(uniques, 7);
+  f_100_111_011_010_0(uniques, 7);
+  f_100_111_011_010_1(uniques, 7);
+  f_100_111_011_011_0(uniques, 7);
+  f_100_111_011_011_1(uniques, 7);
+  f_100_111_011_100_0(uniques, 7);
+  f_100_111_011_100_1(uniques, 7);
+  f_100_111_011_101_0(uniques, 7);
+  f_100_111_011_101_1(uniques, 7);
+  f_100_111_011_110_0(uniques, 7);
+  f_100_111_011_110_1(uniques, 7);
+  f_100_111_011_111_0(uniques, 7);
+  f_100_111_011_111_1(uniques, 7);
+  f_100_111_110_000_0(uniques, 7);
+  f_100_111_110_000_1(uniques, 7);
+  f_100_111_110_001_0(uniques, 7);
+  f_100_111_110_001_1(uniques, 7);
+  f_100_111_110_010_0(uniques, 7);
+  f_100_111_110_010_1(uniques, 7);
+  f_100_111_110_011_0(uniques, 7);
+  f_100_111_110_011_1(uniques, 7);
+  f_100_111_110_100_0(uniques, 7);
+  f_100_111_110_100_1(uniques, 7);
+  f_100_111_110_101_0(uniques, 7);
+  f_100_111_110_101_1(uniques, 7);
+  f_100_111_110_110_0(uniques, 7);
+  f_100_111_110_110_1(uniques, 7);
+  f_100_111_110_111_0(uniques, 7);
+  f_100_111_110_111_1(uniques, 7);
+  f_100_111_111_000_0(uniques, 7);
+  f_100_111_111_000_1(uniques, 7);
+  f_100_111_111_001_0(uniques, 7);
+  f_100_111_111_001_1(uniques, 7);
+  f_100_111_111_010_0(uniques, 7);
+  f_100_111_111_010_1(uniques, 7);
+  f_100_111_111_011_0(uniques, 7);
+  f_100_111_111_011_1(uniques, 7);
+  f_100_111_111_100_0(uniques, 7);
+  f_100_111_111_100_1(uniques, 7);
+  f_100_111_111_101_0(uniques, 7);
+  f_100_111_111_101_1(uniques, 7);
+  f_100_111_111_110_0(uniques, 7);
+  f_100_111_111_110_1(uniques, 7);
+  f_100_111_111_111_0(uniques, 7);
+  f_100_111_111_111_1(uniques, 7);
+  f_101_000_010_000_0(uniques, 7);
+  f_101_000_010_000_1(uniques, 7);
+  f_101_000_010_001_0(uniques, 7);
+  f_101_000_010_001_1(uniques, 7);
+  f_101_000_010_010_0(uniques, 7);
+  f_101_000_010_010_1(uniques, 7);
+  f_101_000_010_011_0(uniques, 7);
+  f_101_000_010_011_1(uniques, 7);
+  f_101_000_010_100_0(uniques, 7);
+  f_101_000_010_100_1(uniques, 7);
+  f_101_000_010_101_0(uniques, 7);
+  f_101_000_010_101_1(uniques, 7);
+  f_101_000_010_110_0(uniques, 7);
+  f_101_000_010_110_1(uniques, 7);
+  f_101_000_010_111_0(uniques, 7);
+  f_101_000_010_111_1(uniques, 7);
+  f_101_000_011_000_0(uniques, 7);
+  f_101_000_011_000_1(uniques, 7);
+  f_101_000_011_001_0(uniques, 7);
+  f_101_000_011_001_1(uniques, 7);
+  f_101_000_011_010_0(uniques, 7);
+  f_101_000_011_010_1(uniques, 7);
+  f_101_000_011_011_0(uniques, 7);
+  f_101_000_011_011_1(uniques, 7);
+  f_101_000_011_100_0(uniques, 7);
+  f_101_000_011_100_1(uniques, 7);
+  f_101_000_011_101_0(uniques, 7);
+  f_101_000_011_101_1(uniques, 7);
+  f_101_000_011_110_0(uniques, 7);
+  f_101_000_011_110_1(uniques, 7);
+  f_101_000_011_111_0(uniques, 7);
+  f_101_000_011_111_1(uniques, 7);
+  f_101_000_110_000_0(uniques, 7);
+  f_101_000_110_000_1(uniques, 7);
+  f_101_000_110_001_0(uniques, 7);
+  f_101_000_110_001_1(uniques, 7);
+  f_101_000_110_010_0(uniques, 7);
+  f_101_000_110_010_1(uniques, 7);
+  f_101_000_110_011_0(uniques, 7);
+  f_101_000_110_011_1(uniques, 7);
+  f_101_000_110_100_0(uniques, 7);
+  f_101_000_110_100_1(uniques, 7);
+  f_101_000_110_101_0(uniques, 7);
+  f_101_000_110_101_1(uniques, 7);
+  f_101_000_110_110_0(uniques, 7);
+  f_101_000_110_110_1(uniques, 7);
+  f_101_000_110_111_0(uniques, 7);
+  f_101_000_110_111_1(uniques, 7);
+  f_101_000_111_000_0(uniques, 7);
+  f_101_000_111_000_1(uniques, 7);
+  f_101_000_111_001_0(uniques, 7);
+  f_101_000_111_001_1(uniques, 7);
+  f_101_000_111_010_0(uniques, 7);
+  f_101_000_111_010_1(uniques, 7);
+  f_101_000_111_011_0(uniques, 7);
+  f_101_000_111_011_1(uniques, 7);
+  f_101_000_111_100_0(uniques, 7);
+  f_101_000_111_100_1(uniques, 7);
+  f_101_000_111_101_0(uniques, 7);
+  f_101_000_111_101_1(uniques, 7);
+  f_101_000_111_110_0(uniques, 7);
+  f_101_000_111_110_1(uniques, 7);
+  f_101_000_111_111_0(uniques, 7);
+  f_101_000_111_111_1(uniques, 7);
+  f_101_001_010_000_0(uniques, 7);
+  f_101_001_010_000_1(uniques, 7);
+  f_101_001_010_001_0(uniques, 7);
+  f_101_001_010_001_1(uniques, 7);
+  f_101_001_010_010_0(uniques, 7);
+  f_101_001_010_010_1(uniques, 7);
+  f_101_001_010_011_0(uniques, 7);
+  f_101_001_010_011_1(uniques, 7);
+  f_101_001_010_100_0(uniques, 7);
+  f_101_001_010_100_1(uniques, 7);
+  f_101_001_010_101_0(uniques, 7);
+  f_101_001_010_101_1(uniques, 7);
+  f_101_001_010_110_0(uniques, 7);
+  f_101_001_010_110_1(uniques, 7);
+  f_101_001_010_111_0(uniques, 7);
+  f_101_001_010_111_1(uniques, 7);
+  f_101_001_011_000_0(uniques, 7);
+  f_101_001_011_000_1(uniques, 7);
+  f_101_001_011_001_0(uniques, 7);
+  f_101_001_011_001_1(uniques, 7);
+  f_101_001_011_010_0(uniques, 7);
+  f_101_001_011_010_1(uniques, 7);
+  f_101_001_011_011_0(uniques, 7);
+  f_101_001_011_011_1(uniques, 7);
+  f_101_001_011_100_0(uniques, 7);
+  f_101_001_011_100_1(uniques, 7);
+  f_101_001_011_101_0(uniques, 7);
+  f_101_001_011_101_1(uniques, 7);
+  f_101_001_011_110_0(uniques, 7);
+  f_101_001_011_110_1(uniques, 7);
+  f_101_001_011_111_0(uniques, 7);
+  f_101_001_011_111_1(uniques, 7);
+  f_101_001_110_000_0(uniques, 7);
+  f_101_001_110_000_1(uniques, 7);
+  f_101_001_110_001_0(uniques, 7);
+  f_101_001_110_001_1(uniques, 7);
+  f_101_001_110_010_0(uniques, 7);
+  f_101_001_110_010_1(uniques, 7);
+  f_101_001_110_011_0(uniques, 7);
+  f_101_001_110_011_1(uniques, 7);
+  f_101_001_110_100_0(uniques, 7);
+  f_101_001_110_100_1(uniques, 7);
+  f_101_001_110_101_0(uniques, 7);
+  f_101_001_110_101_1(uniques, 7);
+  f_101_001_110_110_0(uniques, 7);
+  f_101_001_110_110_1(uniques, 7);
+  f_101_001_110_111_0(uniques, 7);
+  f_101_001_110_111_1(uniques, 7);
+  f_101_001_111_000_0(uniques, 7);
+  f_101_001_111_000_1(uniques, 7);
+  f_101_001_111_001_0(uniques, 7);
+  f_101_001_111_001_1(uniques, 7);
+  f_101_001_111_010_0(uniques, 7);
+  f_101_001_111_010_1(uniques, 7);
+  f_101_001_111_011_0(uniques, 7);
+  f_101_001_111_011_1(uniques, 7);
+  f_101_001_111_100_0(uniques, 7);
+  f_101_001_111_100_1(uniques, 7);
+  f_101_001_111_101_0(uniques, 7);
+  f_101_001_111_101_1(uniques, 7);
+  f_101_001_111_110_0(uniques, 7);
+  f_101_001_111_110_1(uniques, 7);
+  f_101_001_111_111_0(uniques, 7);
+  f_101_001_111_111_1(uniques, 7);
+  f_101_010_010_000_0(uniques, 7);
+  f_101_010_010_000_1(uniques, 7);
+  f_101_010_010_001_0(uniques, 7);
+  f_101_010_010_001_1(uniques, 7);
+  f_101_010_010_010_0(uniques, 7);
+  f_101_010_010_010_1(uniques, 7);
+  f_101_010_010_011_0(uniques, 7);
+  f_101_010_010_011_1(uniques, 7);
+  f_101_010_010_100_0(uniques, 7);
+  f_101_010_010_100_1(uniques, 7);
+  f_101_010_010_101_0(uniques, 7);
+  f_101_010_010_101_1(uniques, 7);
+  f_101_010_010_110_0(uniques, 7);
+  f_101_010_010_110_1(uniques, 7);
+  f_101_010_010_111_0(uniques, 7);
+  f_101_010_010_111_1(uniques, 7);
+  f_101_010_011_000_0(uniques, 7);
+  f_101_010_011_000_1(uniques, 7);
+  f_101_010_011_001_0(uniques, 7);
+  f_101_010_011_001_1(uniques, 7);
+  f_101_010_011_010_0(uniques, 7);
+  f_101_010_011_010_1(uniques, 7);
+  f_101_010_011_011_0(uniques, 7);
+  f_101_010_011_011_1(uniques, 7);
+  f_101_010_011_100_0(uniques, 7);
+  f_101_010_011_100_1(uniques, 7);
+  f_101_010_011_101_0(uniques, 7);
+  f_101_010_011_101_1(uniques, 7);
+  f_101_010_011_110_0(uniques, 7);
+  f_101_010_011_110_1(uniques, 7);
+  f_101_010_011_111_0(uniques, 7);
+  f_101_010_011_111_1(uniques, 7);
+  f_101_010_110_000_0(uniques, 7);
+  f_101_010_110_000_1(uniques, 7);
+  f_101_010_110_001_0(uniques, 7);
+  f_101_010_110_001_1(uniques, 7);
+  f_101_010_110_010_0(uniques, 7);
+  f_101_010_110_010_1(uniques, 7);
+  f_101_010_110_011_0(uniques, 7);
+  f_101_010_110_011_1(uniques, 7);
+  f_101_010_110_100_0(uniques, 7);
+  f_101_010_110_100_1(uniques, 7);
+  f_101_010_110_101_0(uniques, 7);
+  f_101_010_110_101_1(uniques, 7);
+  f_101_010_110_110_0(uniques, 7);
+  f_101_010_110_110_1(uniques, 7);
+  f_101_010_110_111_0(uniques, 7);
+  f_101_010_110_111_1(uniques, 7);
+  f_101_010_111_000_0(uniques, 7);
+  f_101_010_111_000_1(uniques, 7);
+  f_101_010_111_001_0(uniques, 7);
+  f_101_010_111_001_1(uniques, 7);
+  f_101_010_111_010_0(uniques, 7);
+  f_101_010_111_010_1(uniques, 7);
+  f_101_010_111_011_0(uniques, 7);
+  f_101_010_111_011_1(uniques, 7);
+  f_101_010_111_100_0(uniques, 7);
+  f_101_010_111_100_1(uniques, 7);
+  f_101_010_111_101_0(uniques, 7);
+  f_101_010_111_101_1(uniques, 7);
+  f_101_010_111_110_0(uniques, 7);
+  f_101_010_111_110_1(uniques, 7);
+  f_101_010_111_111_0(uniques, 7);
+  f_101_010_111_111_1(uniques, 7);
+  f_101_011_010_000_0(uniques, 7);
+  f_101_011_010_000_1(uniques, 7);
+  f_101_011_010_001_0(uniques, 7);
+  f_101_011_010_001_1(uniques, 7);
+  f_101_011_010_010_0(uniques, 7);
+  f_101_011_010_010_1(uniques, 7);
+  f_101_011_010_011_0(uniques, 7);
+  f_101_011_010_011_1(uniques, 7);
+  f_101_011_010_100_0(uniques, 7);
+  f_101_011_010_100_1(uniques, 7);
+  f_101_011_010_101_0(uniques, 7);
+  f_101_011_010_101_1(uniques, 7);
+  f_101_011_010_110_0(uniques, 7);
+  f_101_011_010_110_1(uniques, 7);
+  f_101_011_010_111_0(uniques, 7);
+  f_101_011_010_111_1(uniques, 7);
+  f_101_011_011_000_0(uniques, 7);
+  f_101_011_011_000_1(uniques, 7);
+  f_101_011_011_001_0(uniques, 7);
+  f_101_011_011_001_1(uniques, 7);
+  f_101_011_011_010_0(uniques, 7);
+  f_101_011_011_010_1(uniques, 7);
+  f_101_011_011_011_0(uniques, 7);
+  f_101_011_011_011_1(uniques, 7);
+  f_101_011_011_100_0(uniques, 7);
+  f_101_011_011_100_1(uniques, 7);
+  f_101_011_011_101_0(uniques, 7);
+  f_101_011_011_101_1(uniques, 7);
+  f_101_011_011_110_0(uniques, 7);
+  f_101_011_011_110_1(uniques, 7);
+  f_101_011_011_111_0(uniques, 7);
+  f_101_011_011_111_1(uniques, 7);
+  f_101_011_110_000_0(uniques, 7);
+  f_101_011_110_000_1(uniques, 7);
+  f_101_011_110_001_0(uniques, 7);
+  f_101_011_110_001_1(uniques, 7);
+  f_101_011_110_010_0(uniques, 7);
+  f_101_011_110_010_1(uniques, 7);
+  f_101_011_110_011_0(uniques, 7);
+  f_101_011_110_011_1(uniques, 7);
+  f_101_011_110_100_0(uniques, 7);
+  f_101_011_110_100_1(uniques, 7);
+  f_101_011_110_101_0(uniques, 7);
+  f_101_011_110_101_1(uniques, 7);
+  f_101_011_110_110_0(uniques, 7);
+  f_101_011_110_110_1(uniques, 7);
+  f_101_011_110_111_0(uniques, 7);
+  f_101_011_110_111_1(uniques, 7);
+  f_101_011_111_000_0(uniques, 7);
+  f_101_011_111_000_1(uniques, 7);
+  f_101_011_111_001_0(uniques, 7);
+  f_101_011_111_001_1(uniques, 7);
+  f_101_011_111_010_0(uniques, 7);
+  f_101_011_111_010_1(uniques, 7);
+  f_101_011_111_011_0(uniques, 7);
+  f_101_011_111_011_1(uniques, 7);
+  f_101_011_111_100_0(uniques, 7);
+  f_101_011_111_100_1(uniques, 7);
+  f_101_011_111_101_0(uniques, 7);
+  f_101_011_111_101_1(uniques, 7);
+  f_101_011_111_110_0(uniques, 7);
+  f_101_011_111_110_1(uniques, 7);
+  f_101_011_111_111_0(uniques, 7);
+  f_101_011_111_111_1(uniques, 7);
+  f_101_100_010_000_0(uniques, 7);
+  f_101_100_010_000_1(uniques, 7);
+  f_101_100_010_001_0(uniques, 7);
+  f_101_100_010_001_1(uniques, 7);
+  f_101_100_010_010_0(uniques, 7);
+  f_101_100_010_010_1(uniques, 7);
+  f_101_100_010_011_0(uniques, 7);
+  f_101_100_010_011_1(uniques, 7);
+  f_101_100_010_100_0(uniques, 7);
+  f_101_100_010_100_1(uniques, 7);
+  f_101_100_010_101_0(uniques, 7);
+  f_101_100_010_101_1(uniques, 7);
+  f_101_100_010_110_0(uniques, 7);
+  f_101_100_010_110_1(uniques, 7);
+  f_101_100_010_111_0(uniques, 7);
+  f_101_100_010_111_1(uniques, 7);
+  f_101_100_011_000_0(uniques, 7);
+  f_101_100_011_000_1(uniques, 7);
+  f_101_100_011_001_0(uniques, 7);
+  f_101_100_011_001_1(uniques, 7);
+  f_101_100_011_010_0(uniques, 7);
+  f_101_100_011_010_1(uniques, 7);
+  f_101_100_011_011_0(uniques, 7);
+  f_101_100_011_011_1(uniques, 7);
+  f_101_100_011_100_0(uniques, 7);
+  f_101_100_011_100_1(uniques, 7);
+  f_101_100_011_101_0(uniques, 7);
+  f_101_100_011_101_1(uniques, 7);
+  f_101_100_011_110_0(uniques, 7);
+  f_101_100_011_110_1(uniques, 7);
+  f_101_100_011_111_0(uniques, 7);
+  f_101_100_011_111_1(uniques, 7);
+  f_101_100_110_000_0(uniques, 7);
+  f_101_100_110_000_1(uniques, 7);
+  f_101_100_110_001_0(uniques, 7);
+  f_101_100_110_001_1(uniques, 7);
+  f_101_100_110_010_0(uniques, 7);
+  f_101_100_110_010_1(uniques, 7);
+  f_101_100_110_011_0(uniques, 7);
+  f_101_100_110_011_1(uniques, 7);
+  f_101_100_110_100_0(uniques, 7);
+  f_101_100_110_100_1(uniques, 7);
+  f_101_100_110_101_0(uniques, 7);
+  f_101_100_110_101_1(uniques, 7);
+  f_101_100_110_110_0(uniques, 7);
+  f_101_100_110_110_1(uniques, 7);
+  f_101_100_110_111_0(uniques, 7);
+  f_101_100_110_111_1(uniques, 7);
+  f_101_100_111_000_0(uniques, 7);
+  f_101_100_111_000_1(uniques, 7);
+  f_101_100_111_001_0(uniques, 7);
+  f_101_100_111_001_1(uniques, 7);
+  f_101_100_111_010_0(uniques, 7);
+  f_101_100_111_010_1(uniques, 7);
+  f_101_100_111_011_0(uniques, 7);
+  f_101_100_111_011_1(uniques, 7);
+  f_101_100_111_100_0(uniques, 7);
+  f_101_100_111_100_1(uniques, 7);
+  f_101_100_111_101_0(uniques, 7);
+  f_101_100_111_101_1(uniques, 7);
+  f_101_100_111_110_0(uniques, 7);
+  f_101_100_111_110_1(uniques, 7);
+  f_101_100_111_111_0(uniques, 7);
+  f_101_100_111_111_1(uniques, 7);
+  f_101_101_010_000_0(uniques, 7);
+  f_101_101_010_000_1(uniques, 7);
+  f_101_101_010_001_0(uniques, 7);
+  f_101_101_010_001_1(uniques, 7);
+  f_101_101_010_010_0(uniques, 7);
+  f_101_101_010_010_1(uniques, 7);
+  f_101_101_010_011_0(uniques, 7);
+  f_101_101_010_011_1(uniques, 7);
+  f_101_101_010_100_0(uniques, 7);
+  f_101_101_010_100_1(uniques, 7);
+  f_101_101_010_101_0(uniques, 7);
+  f_101_101_010_101_1(uniques, 7);
+  f_101_101_010_110_0(uniques, 7);
+  f_101_101_010_110_1(uniques, 7);
+  f_101_101_010_111_0(uniques, 7);
+  f_101_101_010_111_1(uniques, 7);
+  f_101_101_011_000_0(uniques, 7);
+  f_101_101_011_000_1(uniques, 7);
+  f_101_101_011_001_0(uniques, 7);
+  f_101_101_011_001_1(uniques, 7);
+  f_101_101_011_010_0(uniques, 7);
+  f_101_101_011_010_1(uniques, 7);
+  f_101_101_011_011_0(uniques, 7);
+  f_101_101_011_011_1(uniques, 7);
+  f_101_101_011_100_0(uniques, 7);
+  f_101_101_011_100_1(uniques, 7);
+  f_101_101_011_101_0(uniques, 7);
+  f_101_101_011_101_1(uniques, 7);
+  f_101_101_011_110_0(uniques, 7);
+  f_101_101_011_110_1(uniques, 7);
+  f_101_101_011_111_0(uniques, 7);
+  f_101_101_011_111_1(uniques, 7);
+  f_101_101_110_000_0(uniques, 7);
+  f_101_101_110_000_1(uniques, 7);
+  f_101_101_110_001_0(uniques, 7);
+  f_101_101_110_001_1(uniques, 7);
+  f_101_101_110_010_0(uniques, 7);
+  f_101_101_110_010_1(uniques, 7);
+  f_101_101_110_011_0(uniques, 7);
+  f_101_101_110_011_1(uniques, 7);
+  f_101_101_110_100_0(uniques, 7);
+  f_101_101_110_100_1(uniques, 7);
+  f_101_101_110_101_0(uniques, 7);
+  f_101_101_110_101_1(uniques, 7);
+  f_101_101_110_110_0(uniques, 7);
+  f_101_101_110_110_1(uniques, 7);
+  f_101_101_110_111_0(uniques, 7);
+  f_101_101_110_111_1(uniques, 7);
+  f_101_101_111_000_0(uniques, 7);
+  f_101_101_111_000_1(uniques, 7);
+  f_101_101_111_001_0(uniques, 7);
+  f_101_101_111_001_1(uniques, 7);
+  f_101_101_111_010_0(uniques, 7);
+  f_101_101_111_010_1(uniques, 7);
+  f_101_101_111_011_0(uniques, 7);
+  f_101_101_111_011_1(uniques, 7);
+  f_101_101_111_100_0(uniques, 7);
+  f_101_101_111_100_1(uniques, 7);
+  f_101_101_111_101_0(uniques, 7);
+  f_101_101_111_101_1(uniques, 7);
+  f_101_101_111_110_0(uniques, 7);
+  f_101_101_111_110_1(uniques, 7);
+  f_101_101_111_111_0(uniques, 7);
+  f_101_101_111_111_1(uniques, 7);
+  f_101_110_010_000_0(uniques, 7);
+  f_101_110_010_000_1(uniques, 7);
+  f_101_110_010_001_0(uniques, 7);
+  f_101_110_010_001_1(uniques, 7);
+  f_101_110_010_010_0(uniques, 7);
+  f_101_110_010_010_1(uniques, 7);
+  f_101_110_010_011_0(uniques, 7);
+  f_101_110_010_011_1(uniques, 7);
+  f_101_110_010_100_0(uniques, 7);
+  f_101_110_010_100_1(uniques, 7);
+  f_101_110_010_101_0(uniques, 7);
+  f_101_110_010_101_1(uniques, 7);
+  f_101_110_010_110_0(uniques, 7);
+  f_101_110_010_110_1(uniques, 7);
+  f_101_110_010_111_0(uniques, 7);
+  f_101_110_010_111_1(uniques, 7);
+  f_101_110_011_000_0(uniques, 7);
+  f_101_110_011_000_1(uniques, 7);
+  f_101_110_011_001_0(uniques, 7);
+  f_101_110_011_001_1(uniques, 7);
+  f_101_110_011_010_0(uniques, 7);
+  f_101_110_011_010_1(uniques, 7);
+  f_101_110_011_011_0(uniques, 7);
+  f_101_110_011_011_1(uniques, 7);
+  f_101_110_011_100_0(uniques, 7);
+  f_101_110_011_100_1(uniques, 7);
+  f_101_110_011_101_0(uniques, 7);
+  f_101_110_011_101_1(uniques, 7);
+  f_101_110_011_110_0(uniques, 7);
+  f_101_110_011_110_1(uniques, 7);
+  f_101_110_011_111_0(uniques, 7);
+  f_101_110_011_111_1(uniques, 7);
+  f_101_110_110_000_0(uniques, 7);
+  f_101_110_110_000_1(uniques, 7);
+  f_101_110_110_001_0(uniques, 7);
+  f_101_110_110_001_1(uniques, 7);
+  f_101_110_110_010_0(uniques, 7);
+  f_101_110_110_010_1(uniques, 7);
+  f_101_110_110_011_0(uniques, 7);
+  f_101_110_110_011_1(uniques, 7);
+  f_101_110_110_100_0(uniques, 7);
+  f_101_110_110_100_1(uniques, 7);
+  f_101_110_110_101_0(uniques, 7);
+  f_101_110_110_101_1(uniques, 7);
+  f_101_110_110_110_0(uniques, 7);
+  f_101_110_110_110_1(uniques, 7);
+  f_101_110_110_111_0(uniques, 7);
+  f_101_110_110_111_1(uniques, 7);
+  f_101_110_111_000_0(uniques, 7);
+  f_101_110_111_000_1(uniques, 7);
+  f_101_110_111_001_0(uniques, 7);
+  f_101_110_111_001_1(uniques, 7);
+  f_101_110_111_010_0(uniques, 7);
+  f_101_110_111_010_1(uniques, 7);
+  f_101_110_111_011_0(uniques, 7);
+  f_101_110_111_011_1(uniques, 7);
+  f_101_110_111_100_0(uniques, 7);
+  f_101_110_111_100_1(uniques, 7);
+  f_101_110_111_101_0(uniques, 7);
+  f_101_110_111_101_1(uniques, 7);
+  f_101_110_111_110_0(uniques, 7);
+  f_101_110_111_110_1(uniques, 7);
+  f_101_110_111_111_0(uniques, 7);
+  f_101_110_111_111_1(uniques, 7);
+  f_101_111_010_000_0(uniques, 7);
+  f_101_111_010_000_1(uniques, 7);
+  f_101_111_010_001_0(uniques, 7);
+  f_101_111_010_001_1(uniques, 7);
+  f_101_111_010_010_0(uniques, 7);
+  f_101_111_010_010_1(uniques, 7);
+  f_101_111_010_011_0(uniques, 7);
+  f_101_111_010_011_1(uniques, 7);
+  f_101_111_010_100_0(uniques, 7);
+  f_101_111_010_100_1(uniques, 7);
+  f_101_111_010_101_0(uniques, 7);
+  f_101_111_010_101_1(uniques, 7);
+  f_101_111_010_110_0(uniques, 7);
+  f_101_111_010_110_1(uniques, 7);
+  f_101_111_010_111_0(uniques, 7);
+  f_101_111_010_111_1(uniques, 7);
+  f_101_111_011_000_0(uniques, 7);
+  f_101_111_011_000_1(uniques, 7);
+  f_101_111_011_001_0(uniques, 7);
+  f_101_111_011_001_1(uniques, 7);
+  f_101_111_011_010_0(uniques, 7);
+  f_101_111_011_010_1(uniques, 7);
+  f_101_111_011_011_0(uniques, 7);
+  f_101_111_011_011_1(uniques, 7);
+  f_101_111_011_100_0(uniques, 7);
+  f_101_111_011_100_1(uniques, 7);
+  f_101_111_011_101_0(uniques, 7);
+  f_101_111_011_101_1(uniques, 7);
+  f_101_111_011_110_0(uniques, 7);
+  f_101_111_011_110_1(uniques, 7);
+  f_101_111_011_111_0(uniques, 7);
+  f_101_111_011_111_1(uniques, 7);
+  f_101_111_110_000_0(uniques, 7);
+  f_101_111_110_000_1(uniques, 7);
+  f_101_111_110_001_0(uniques, 7);
+  f_101_111_110_001_1(uniques, 7);
+  f_101_111_110_010_0(uniques, 7);
+  f_101_111_110_010_1(uniques, 7);
+  f_101_111_110_011_0(uniques, 7);
+  f_101_111_110_011_1(uniques, 7);
+  f_101_111_110_100_0(uniques, 7);
+  f_101_111_110_100_1(uniques, 7);
+  f_101_111_110_101_0(uniques, 7);
+  f_101_111_110_101_1(uniques, 7);
+  f_101_111_110_110_0(uniques, 7);
+  f_101_111_110_110_1(uniques, 7);
+  f_101_111_110_111_0(uniques, 7);
+  f_101_111_110_111_1(uniques, 7);
+  f_101_111_111_000_0(uniques, 7);
+  f_101_111_111_000_1(uniques, 7);
+  f_101_111_111_001_0(uniques, 7);
+  f_101_111_111_001_1(uniques, 7);
+  f_101_111_111_010_0(uniques, 7);
+  f_101_111_111_010_1(uniques, 7);
+  f_101_111_111_011_0(uniques, 7);
+  f_101_111_111_011_1(uniques, 7);
+  f_101_111_111_100_0(uniques, 7);
+  f_101_111_111_100_1(uniques, 7);
+  f_101_111_111_101_0(uniques, 7);
+  f_101_111_111_101_1(uniques, 7);
+  f_101_111_111_110_0(uniques, 7);
+  f_101_111_111_110_1(uniques, 7);
+  f_101_111_111_111_0(uniques, 7);
+  f_101_111_111_111_1(uniques, 7);
+  f_110_000_010_000_0(uniques, 7);
+  f_110_000_010_000_1(uniques, 7);
+  f_110_000_010_001_0(uniques, 7);
+  f_110_000_010_001_1(uniques, 7);
+  f_110_000_010_010_0(uniques, 7);
+  f_110_000_010_010_1(uniques, 7);
+  f_110_000_010_011_0(uniques, 7);
+  f_110_000_010_011_1(uniques, 7);
+  f_110_000_010_100_0(uniques, 7);
+  f_110_000_010_100_1(uniques, 7);
+  f_110_000_010_101_0(uniques, 7);
+  f_110_000_010_101_1(uniques, 7);
+  f_110_000_010_110_0(uniques, 7);
+  f_110_000_010_110_1(uniques, 7);
+  f_110_000_010_111_0(uniques, 7);
+  f_110_000_010_111_1(uniques, 7);
+  f_110_000_011_000_0(uniques, 7);
+  f_110_000_011_000_1(uniques, 7);
+  f_110_000_011_001_0(uniques, 7);
+  f_110_000_011_001_1(uniques, 7);
+  f_110_000_011_010_0(uniques, 7);
+  f_110_000_011_010_1(uniques, 7);
+  f_110_000_011_011_0(uniques, 7);
+  f_110_000_011_011_1(uniques, 7);
+  f_110_000_011_100_0(uniques, 7);
+  f_110_000_011_100_1(uniques, 7);
+  f_110_000_011_101_0(uniques, 7);
+  f_110_000_011_101_1(uniques, 7);
+  f_110_000_011_110_0(uniques, 7);
+  f_110_000_011_110_1(uniques, 7);
+  f_110_000_011_111_0(uniques, 7);
+  f_110_000_011_111_1(uniques, 7);
+  f_110_000_110_000_0(uniques, 7);
+  f_110_000_110_000_1(uniques, 7);
+  f_110_000_110_001_0(uniques, 7);
+  f_110_000_110_001_1(uniques, 7);
+  f_110_000_110_010_0(uniques, 7);
+  f_110_000_110_010_1(uniques, 7);
+  f_110_000_110_011_0(uniques, 7);
+  f_110_000_110_011_1(uniques, 7);
+  f_110_000_110_100_0(uniques, 7);
+  f_110_000_110_100_1(uniques, 7);
+  f_110_000_110_101_0(uniques, 7);
+  f_110_000_110_101_1(uniques, 7);
+  f_110_000_110_110_0(uniques, 7);
+  f_110_000_110_110_1(uniques, 7);
+  f_110_000_110_111_0(uniques, 7);
+  f_110_000_110_111_1(uniques, 7);
+  f_110_000_111_000_0(uniques, 7);
+  f_110_000_111_000_1(uniques, 7);
+  f_110_000_111_001_0(uniques, 7);
+  f_110_000_111_001_1(uniques, 7);
+  f_110_000_111_010_0(uniques, 7);
+  f_110_000_111_010_1(uniques, 7);
+  f_110_000_111_011_0(uniques, 7);
+  f_110_000_111_011_1(uniques, 7);
+  f_110_000_111_100_0(uniques, 7);
+  f_110_000_111_100_1(uniques, 7);
+  f_110_000_111_101_0(uniques, 7);
+  f_110_000_111_101_1(uniques, 7);
+  f_110_000_111_110_0(uniques, 7);
+  f_110_000_111_110_1(uniques, 7);
+  f_110_000_111_111_0(uniques, 7);
+  f_110_000_111_111_1(uniques, 7);
+  f_110_001_010_000_0(uniques, 7);
+  f_110_001_010_000_1(uniques, 7);
+  f_110_001_010_001_0(uniques, 7);
+  f_110_001_010_001_1(uniques, 7);
+  f_110_001_010_010_0(uniques, 7);
+  f_110_001_010_010_1(uniques, 7);
+  f_110_001_010_011_0(uniques, 7);
+  f_110_001_010_011_1(uniques, 7);
+  f_110_001_010_100_0(uniques, 7);
+  f_110_001_010_100_1(uniques, 7);
+  f_110_001_010_101_0(uniques, 7);
+  f_110_001_010_101_1(uniques, 7);
+  f_110_001_010_110_0(uniques, 7);
+  f_110_001_010_110_1(uniques, 7);
+  f_110_001_010_111_0(uniques, 7);
+  f_110_001_010_111_1(uniques, 7);
+  f_110_001_011_000_0(uniques, 7);
+  f_110_001_011_000_1(uniques, 7);
+  f_110_001_011_001_0(uniques, 7);
+  f_110_001_011_001_1(uniques, 7);
+  f_110_001_011_010_0(uniques, 7);
+  f_110_001_011_010_1(uniques, 7);
+  f_110_001_011_011_0(uniques, 7);
+  f_110_001_011_011_1(uniques, 7);
+  f_110_001_011_100_0(uniques, 7);
+  f_110_001_011_100_1(uniques, 7);
+  f_110_001_011_101_0(uniques, 7);
+  f_110_001_011_101_1(uniques, 7);
+  f_110_001_011_110_0(uniques, 7);
+  f_110_001_011_110_1(uniques, 7);
+  f_110_001_011_111_0(uniques, 7);
+  f_110_001_011_111_1(uniques, 7);
+  f_110_001_110_000_0(uniques, 7);
+  f_110_001_110_000_1(uniques, 7);
+  f_110_001_110_001_0(uniques, 7);
+  f_110_001_110_001_1(uniques, 7);
+  f_110_001_110_010_0(uniques, 7);
+  f_110_001_110_010_1(uniques, 7);
+  f_110_001_110_011_0(uniques, 7);
+  f_110_001_110_011_1(uniques, 7);
+  f_110_001_110_100_0(uniques, 7);
+  f_110_001_110_100_1(uniques, 7);
+  f_110_001_110_101_0(uniques, 7);
+  f_110_001_110_101_1(uniques, 7);
+  f_110_001_110_110_0(uniques, 7);
+  f_110_001_110_110_1(uniques, 7);
+  f_110_001_110_111_0(uniques, 7);
+  f_110_001_110_111_1(uniques, 7);
+  f_110_001_111_000_0(uniques, 7);
+  f_110_001_111_000_1(uniques, 7);
+  f_110_001_111_001_0(uniques, 7);
+  f_110_001_111_001_1(uniques, 7);
+  f_110_001_111_010_0(uniques, 7);
+  f_110_001_111_010_1(uniques, 7);
+  f_110_001_111_011_0(uniques, 7);
+  f_110_001_111_011_1(uniques, 7);
+  f_110_001_111_100_0(uniques, 7);
+  f_110_001_111_100_1(uniques, 7);
+  f_110_001_111_101_0(uniques, 7);
+  f_110_001_111_101_1(uniques, 7);
+  f_110_001_111_110_0(uniques, 7);
+  f_110_001_111_110_1(uniques, 7);
+  f_110_001_111_111_0(uniques, 7);
+  f_110_001_111_111_1(uniques, 7);
+  f_110_010_010_000_0(uniques, 7);
+  f_110_010_010_000_1(uniques, 7);
+  f_110_010_010_001_0(uniques, 7);
+  f_110_010_010_001_1(uniques, 7);
+  f_110_010_010_010_0(uniques, 7);
+  f_110_010_010_010_1(uniques, 7);
+  f_110_010_010_011_0(uniques, 7);
+  f_110_010_010_011_1(uniques, 7);
+  f_110_010_010_100_0(uniques, 7);
+  f_110_010_010_100_1(uniques, 7);
+  f_110_010_010_101_0(uniques, 7);
+  f_110_010_010_101_1(uniques, 7);
+  f_110_010_010_110_0(uniques, 7);
+  f_110_010_010_110_1(uniques, 7);
+  f_110_010_010_111_0(uniques, 7);
+  f_110_010_010_111_1(uniques, 7);
+  f_110_010_011_000_0(uniques, 7);
+  f_110_010_011_000_1(uniques, 7);
+  f_110_010_011_001_0(uniques, 7);
+  f_110_010_011_001_1(uniques, 7);
+  f_110_010_011_010_0(uniques, 7);
+  f_110_010_011_010_1(uniques, 7);
+  f_110_010_011_011_0(uniques, 7);
+  f_110_010_011_011_1(uniques, 7);
+  f_110_010_011_100_0(uniques, 7);
+  f_110_010_011_100_1(uniques, 7);
+  f_110_010_011_101_0(uniques, 7);
+  f_110_010_011_101_1(uniques, 7);
+  f_110_010_011_110_0(uniques, 7);
+  f_110_010_011_110_1(uniques, 7);
+  f_110_010_011_111_0(uniques, 7);
+  f_110_010_011_111_1(uniques, 7);
+  f_110_010_110_000_0(uniques, 7);
+  f_110_010_110_000_1(uniques, 7);
+  f_110_010_110_001_0(uniques, 7);
+  f_110_010_110_001_1(uniques, 7);
+  f_110_010_110_010_0(uniques, 7);
+  f_110_010_110_010_1(uniques, 7);
+  f_110_010_110_011_0(uniques, 7);
+  f_110_010_110_011_1(uniques, 7);
+  f_110_010_110_100_0(uniques, 7);
+  f_110_010_110_100_1(uniques, 7);
+  f_110_010_110_101_0(uniques, 7);
+  f_110_010_110_101_1(uniques, 7);
+  f_110_010_110_110_0(uniques, 7);
+  f_110_010_110_110_1(uniques, 7);
+  f_110_010_110_111_0(uniques, 7);
+  f_110_010_110_111_1(uniques, 7);
+  f_110_010_111_000_0(uniques, 7);
+  f_110_010_111_000_1(uniques, 7);
+  f_110_010_111_001_0(uniques, 7);
+  f_110_010_111_001_1(uniques, 7);
+  f_110_010_111_010_0(uniques, 7);
+  f_110_010_111_010_1(uniques, 7);
+  f_110_010_111_011_0(uniques, 7);
+  f_110_010_111_011_1(uniques, 7);
+  f_110_010_111_100_0(uniques, 7);
+  f_110_010_111_100_1(uniques, 7);
+  f_110_010_111_101_0(uniques, 7);
+  f_110_010_111_101_1(uniques, 7);
+  f_110_010_111_110_0(uniques, 7);
+  f_110_010_111_110_1(uniques, 7);
+  f_110_010_111_111_0(uniques, 7);
+  f_110_010_111_111_1(uniques, 7);
+  f_110_011_010_000_0(uniques, 7);
+  f_110_011_010_000_1(uniques, 7);
+  f_110_011_010_001_0(uniques, 7);
+  f_110_011_010_001_1(uniques, 7);
+  f_110_011_010_010_0(uniques, 7);
+  f_110_011_010_010_1(uniques, 7);
+  f_110_011_010_011_0(uniques, 7);
+  f_110_011_010_011_1(uniques, 7);
+  f_110_011_010_100_0(uniques, 7);
+  f_110_011_010_100_1(uniques, 7);
+  f_110_011_010_101_0(uniques, 7);
+  f_110_011_010_101_1(uniques, 7);
+  f_110_011_010_110_0(uniques, 7);
+  f_110_011_010_110_1(uniques, 7);
+  f_110_011_010_111_0(uniques, 7);
+  f_110_011_010_111_1(uniques, 7);
+  f_110_011_011_000_0(uniques, 7);
+  f_110_011_011_000_1(uniques, 7);
+  f_110_011_011_001_0(uniques, 7);
+  f_110_011_011_001_1(uniques, 7);
+  f_110_011_011_010_0(uniques, 7);
+  f_110_011_011_010_1(uniques, 7);
+  f_110_011_011_011_0(uniques, 7);
+  f_110_011_011_011_1(uniques, 7);
+  f_110_011_011_100_0(uniques, 7);
+  f_110_011_011_100_1(uniques, 7);
+  f_110_011_011_101_0(uniques, 7);
+  f_110_011_011_101_1(uniques, 7);
+  f_110_011_011_110_0(uniques, 7);
+  f_110_011_011_110_1(uniques, 7);
+  f_110_011_011_111_0(uniques, 7);
+  f_110_011_011_111_1(uniques, 7);
+  f_110_011_110_000_0(uniques, 7);
+  f_110_011_110_000_1(uniques, 7);
+  f_110_011_110_001_0(uniques, 7);
+  f_110_011_110_001_1(uniques, 7);
+  f_110_011_110_010_0(uniques, 7);
+  f_110_011_110_010_1(uniques, 7);
+  f_110_011_110_011_0(uniques, 7);
+  f_110_011_110_011_1(uniques, 7);
+  f_110_011_110_100_0(uniques, 7);
+  f_110_011_110_100_1(uniques, 7);
+  f_110_011_110_101_0(uniques, 7);
+  f_110_011_110_101_1(uniques, 7);
+  f_110_011_110_110_0(uniques, 7);
+  f_110_011_110_110_1(uniques, 7);
+  f_110_011_110_111_0(uniques, 7);
+  f_110_011_110_111_1(uniques, 7);
+  f_110_011_111_000_0(uniques, 7);
+  f_110_011_111_000_1(uniques, 7);
+  f_110_011_111_001_0(uniques, 7);
+  f_110_011_111_001_1(uniques, 7);
+  f_110_011_111_010_0(uniques, 7);
+  f_110_011_111_010_1(uniques, 7);
+  f_110_011_111_011_0(uniques, 7);
+  f_110_011_111_011_1(uniques, 7);
+  f_110_011_111_100_0(uniques, 7);
+  f_110_011_111_100_1(uniques, 7);
+  f_110_011_111_101_0(uniques, 7);
+  f_110_011_111_101_1(uniques, 7);
+  f_110_011_111_110_0(uniques, 7);
+  f_110_011_111_110_1(uniques, 7);
+  f_110_011_111_111_0(uniques, 7);
+  f_110_011_111_111_1(uniques, 7);
+  f_110_100_010_000_0(uniques, 7);
+  f_110_100_010_000_1(uniques, 7);
+  f_110_100_010_001_0(uniques, 7);
+  f_110_100_010_001_1(uniques, 7);
+  f_110_100_010_010_0(uniques, 7);
+  f_110_100_010_010_1(uniques, 7);
+  f_110_100_010_011_0(uniques, 7);
+  f_110_100_010_011_1(uniques, 7);
+  f_110_100_010_100_0(uniques, 7);
+  f_110_100_010_100_1(uniques, 7);
+  f_110_100_010_101_0(uniques, 7);
+  f_110_100_010_101_1(uniques, 7);
+  f_110_100_010_110_0(uniques, 7);
+  f_110_100_010_110_1(uniques, 7);
+  f_110_100_010_111_0(uniques, 7);
+  f_110_100_010_111_1(uniques, 7);
+  f_110_100_011_000_0(uniques, 7);
+  f_110_100_011_000_1(uniques, 7);
+  f_110_100_011_001_0(uniques, 7);
+  f_110_100_011_001_1(uniques, 7);
+  f_110_100_011_010_0(uniques, 7);
+  f_110_100_011_010_1(uniques, 7);
+  f_110_100_011_011_0(uniques, 7);
+  f_110_100_011_011_1(uniques, 7);
+  f_110_100_011_100_0(uniques, 7);
+  f_110_100_011_100_1(uniques, 7);
+  f_110_100_011_101_0(uniques, 7);
+  f_110_100_011_101_1(uniques, 7);
+  f_110_100_011_110_0(uniques, 7);
+  f_110_100_011_110_1(uniques, 7);
+  f_110_100_011_111_0(uniques, 7);
+  f_110_100_011_111_1(uniques, 7);
+  f_110_100_110_000_0(uniques, 7);
+  f_110_100_110_000_1(uniques, 7);
+  f_110_100_110_001_0(uniques, 7);
+  f_110_100_110_001_1(uniques, 7);
+  f_110_100_110_010_0(uniques, 7);
+  f_110_100_110_010_1(uniques, 7);
+  f_110_100_110_011_0(uniques, 7);
+  f_110_100_110_011_1(uniques, 7);
+  f_110_100_110_100_0(uniques, 7);
+  f_110_100_110_100_1(uniques, 7);
+  f_110_100_110_101_0(uniques, 7);
+  f_110_100_110_101_1(uniques, 7);
+  f_110_100_110_110_0(uniques, 7);
+  f_110_100_110_110_1(uniques, 7);
+  f_110_100_110_111_0(uniques, 7);
+  f_110_100_110_111_1(uniques, 7);
+  f_110_100_111_000_0(uniques, 7);
+  f_110_100_111_000_1(uniques, 7);
+  f_110_100_111_001_0(uniques, 7);
+  f_110_100_111_001_1(uniques, 7);
+  f_110_100_111_010_0(uniques, 7);
+  f_110_100_111_010_1(uniques, 7);
+  f_110_100_111_011_0(uniques, 7);
+  f_110_100_111_011_1(uniques, 7);
+  f_110_100_111_100_0(uniques, 7);
+  f_110_100_111_100_1(uniques, 7);
+  f_110_100_111_101_0(uniques, 7);
+  f_110_100_111_101_1(uniques, 7);
+  f_110_100_111_110_0(uniques, 7);
+  f_110_100_111_110_1(uniques, 7);
+  f_110_100_111_111_0(uniques, 7);
+  f_110_100_111_111_1(uniques, 7);
+  f_110_101_010_000_0(uniques, 7);
+  f_110_101_010_000_1(uniques, 7);
+  f_110_101_010_001_0(uniques, 7);
+  f_110_101_010_001_1(uniques, 7);
+  f_110_101_010_010_0(uniques, 7);
+  f_110_101_010_010_1(uniques, 7);
+  f_110_101_010_011_0(uniques, 7);
+  f_110_101_010_011_1(uniques, 7);
+  f_110_101_010_100_0(uniques, 7);
+  f_110_101_010_100_1(uniques, 7);
+  f_110_101_010_101_0(uniques, 7);
+  f_110_101_010_101_1(uniques, 7);
+  f_110_101_010_110_0(uniques, 7);
+  f_110_101_010_110_1(uniques, 7);
+  f_110_101_010_111_0(uniques, 7);
+  f_110_101_010_111_1(uniques, 7);
+  f_110_101_011_000_0(uniques, 7);
+  f_110_101_011_000_1(uniques, 7);
+  f_110_101_011_001_0(uniques, 7);
+  f_110_101_011_001_1(uniques, 7);
+  f_110_101_011_010_0(uniques, 7);
+  f_110_101_011_010_1(uniques, 7);
+  f_110_101_011_011_0(uniques, 7);
+  f_110_101_011_011_1(uniques, 7);
+  f_110_101_011_100_0(uniques, 7);
+  f_110_101_011_100_1(uniques, 7);
+  f_110_101_011_101_0(uniques, 7);
+  f_110_101_011_101_1(uniques, 7);
+  f_110_101_011_110_0(uniques, 7);
+  f_110_101_011_110_1(uniques, 7);
+  f_110_101_011_111_0(uniques, 7);
+  f_110_101_011_111_1(uniques, 7);
+  f_110_101_110_000_0(uniques, 7);
+  f_110_101_110_000_1(uniques, 7);
+  f_110_101_110_001_0(uniques, 7);
+  f_110_101_110_001_1(uniques, 7);
+  f_110_101_110_010_0(uniques, 7);
+  f_110_101_110_010_1(uniques, 7);
+  f_110_101_110_011_0(uniques, 7);
+  f_110_101_110_011_1(uniques, 7);
+  f_110_101_110_100_0(uniques, 7);
+  f_110_101_110_100_1(uniques, 7);
+  f_110_101_110_101_0(uniques, 7);
+  f_110_101_110_101_1(uniques, 7);
+  f_110_101_110_110_0(uniques, 7);
+  f_110_101_110_110_1(uniques, 7);
+  f_110_101_110_111_0(uniques, 7);
+  f_110_101_110_111_1(uniques, 7);
+  f_110_101_111_000_0(uniques, 7);
+  f_110_101_111_000_1(uniques, 7);
+  f_110_101_111_001_0(uniques, 7);
+  f_110_101_111_001_1(uniques, 7);
+  f_110_101_111_010_0(uniques, 7);
+  f_110_101_111_010_1(uniques, 7);
+  f_110_101_111_011_0(uniques, 7);
+  f_110_101_111_011_1(uniques, 7);
+  f_110_101_111_100_0(uniques, 7);
+  f_110_101_111_100_1(uniques, 7);
+  f_110_101_111_101_0(uniques, 7);
+  f_110_101_111_101_1(uniques, 7);
+  f_110_101_111_110_0(uniques, 7);
+  f_110_101_111_110_1(uniques, 7);
+  f_110_101_111_111_0(uniques, 7);
+  f_110_101_111_111_1(uniques, 7);
+  f_110_110_010_000_0(uniques, 7);
+  f_110_110_010_000_1(uniques, 7);
+  f_110_110_010_001_0(uniques, 7);
+  f_110_110_010_001_1(uniques, 7);
+  f_110_110_010_010_0(uniques, 7);
+  f_110_110_010_010_1(uniques, 7);
+  f_110_110_010_011_0(uniques, 7);
+  f_110_110_010_011_1(uniques, 7);
+  f_110_110_010_100_0(uniques, 7);
+  f_110_110_010_100_1(uniques, 7);
+  f_110_110_010_101_0(uniques, 7);
+  f_110_110_010_101_1(uniques, 7);
+  f_110_110_010_110_0(uniques, 7);
+  f_110_110_010_110_1(uniques, 7);
+  f_110_110_010_111_0(uniques, 7);
+  f_110_110_010_111_1(uniques, 7);
+  f_110_110_011_000_0(uniques, 7);
+  f_110_110_011_000_1(uniques, 7);
+  f_110_110_011_001_0(uniques, 7);
+  f_110_110_011_001_1(uniques, 7);
+  f_110_110_011_010_0(uniques, 7);
+  f_110_110_011_010_1(uniques, 7);
+  f_110_110_011_011_0(uniques, 7);
+  f_110_110_011_011_1(uniques, 7);
+  f_110_110_011_100_0(uniques, 7);
+  f_110_110_011_100_1(uniques, 7);
+  f_110_110_011_101_0(uniques, 7);
+  f_110_110_011_101_1(uniques, 7);
+  f_110_110_011_110_0(uniques, 7);
+  f_110_110_011_110_1(uniques, 7);
+  f_110_110_011_111_0(uniques, 7);
+  f_110_110_011_111_1(uniques, 7);
+  f_110_110_110_000_0(uniques, 7);
+  f_110_110_110_000_1(uniques, 7);
+  f_110_110_110_001_0(uniques, 7);
+  f_110_110_110_001_1(uniques, 7);
+  f_110_110_110_010_0(uniques, 7);
+  f_110_110_110_010_1(uniques, 7);
+  f_110_110_110_011_0(uniques, 7);
+  f_110_110_110_011_1(uniques, 7);
+  f_110_110_110_100_0(uniques, 7);
+  f_110_110_110_100_1(uniques, 7);
+  f_110_110_110_101_0(uniques, 7);
+  f_110_110_110_101_1(uniques, 7);
+  f_110_110_110_110_0(uniques, 7);
+  f_110_110_110_110_1(uniques, 7);
+  f_110_110_110_111_0(uniques, 7);
+  f_110_110_110_111_1(uniques, 7);
+  f_110_110_111_000_0(uniques, 7);
+  f_110_110_111_000_1(uniques, 7);
+  f_110_110_111_001_0(uniques, 7);
+  f_110_110_111_001_1(uniques, 7);
+  f_110_110_111_010_0(uniques, 7);
+  f_110_110_111_010_1(uniques, 7);
+  f_110_110_111_011_0(uniques, 7);
+  f_110_110_111_011_1(uniques, 7);
+  f_110_110_111_100_0(uniques, 7);
+  f_110_110_111_100_1(uniques, 7);
+  f_110_110_111_101_0(uniques, 7);
+  f_110_110_111_101_1(uniques, 7);
+  f_110_110_111_110_0(uniques, 7);
+  f_110_110_111_110_1(uniques, 7);
+  f_110_110_111_111_0(uniques, 7);
+  f_110_110_111_111_1(uniques, 7);
+  f_110_111_010_000_0(uniques, 7);
+  f_110_111_010_000_1(uniques, 7);
+  f_110_111_010_001_0(uniques, 7);
+  f_110_111_010_001_1(uniques, 7);
+  f_110_111_010_010_0(uniques, 7);
+  f_110_111_010_010_1(uniques, 7);
+  f_110_111_010_011_0(uniques, 7);
+  f_110_111_010_011_1(uniques, 7);
+  f_110_111_010_100_0(uniques, 7);
+  f_110_111_010_100_1(uniques, 7);
+  f_110_111_010_101_0(uniques, 7);
+  f_110_111_010_101_1(uniques, 7);
+  f_110_111_010_110_0(uniques, 7);
+  f_110_111_010_110_1(uniques, 7);
+  f_110_111_010_111_0(uniques, 7);
+  f_110_111_010_111_1(uniques, 7);
+  f_110_111_011_000_0(uniques, 7);
+  f_110_111_011_000_1(uniques, 7);
+  f_110_111_011_001_0(uniques, 7);
+  f_110_111_011_001_1(uniques, 7);
+  f_110_111_011_010_0(uniques, 7);
+  f_110_111_011_010_1(uniques, 7);
+  f_110_111_011_011_0(uniques, 7);
+  f_110_111_011_011_1(uniques, 7);
+  f_110_111_011_100_0(uniques, 7);
+  f_110_111_011_100_1(uniques, 7);
+  f_110_111_011_101_0(uniques, 7);
+  f_110_111_011_101_1(uniques, 7);
+  f_110_111_011_110_0(uniques, 7);
+  f_110_111_011_110_1(uniques, 7);
+  f_110_111_011_111_0(uniques, 7);
+  f_110_111_011_111_1(uniques, 7);
+  f_110_111_110_000_0(uniques, 7);
+  f_110_111_110_000_1(uniques, 7);
+  f_110_111_110_001_0(uniques, 7);
+  f_110_111_110_001_1(uniques, 7);
+  f_110_111_110_010_0(uniques, 7);
+  f_110_111_110_010_1(uniques, 7);
+  f_110_111_110_011_0(uniques, 7);
+  f_110_111_110_011_1(uniques, 7);
+  f_110_111_110_100_0(uniques, 7);
+  f_110_111_110_100_1(uniques, 7);
+  f_110_111_110_101_0(uniques, 7);
+  f_110_111_110_101_1(uniques, 7);
+  f_110_111_110_110_0(uniques, 7);
+  f_110_111_110_110_1(uniques, 7);
+  f_110_111_110_111_0(uniques, 7);
+  f_110_111_110_111_1(uniques, 7);
+  f_110_111_111_000_0(uniques, 7);
+  f_110_111_111_000_1(uniques, 7);
+  f_110_111_111_001_0(uniques, 7);
+  f_110_111_111_001_1(uniques, 7);
+  f_110_111_111_010_0(uniques, 7);
+  f_110_111_111_010_1(uniques, 7);
+  f_110_111_111_011_0(uniques, 7);
+  f_110_111_111_011_1(uniques, 7);
+  f_110_111_111_100_0(uniques, 7);
+  f_110_111_111_100_1(uniques, 7);
+  f_110_111_111_101_0(uniques, 7);
+  f_110_111_111_101_1(uniques, 7);
+  f_110_111_111_110_0(uniques, 7);
+  f_110_111_111_110_1(uniques, 7);
+  f_110_111_111_111_0(uniques, 7);
+  f_110_111_111_111_1(uniques, 7);
+  f_111_000_010_000_0(uniques, 7);
+  f_111_000_010_000_1(uniques, 7);
+  f_111_000_010_001_0(uniques, 7);
+  f_111_000_010_001_1(uniques, 7);
+  f_111_000_010_010_0(uniques, 7);
+  f_111_000_010_010_1(uniques, 7);
+  f_111_000_010_011_0(uniques, 7);
+  f_111_000_010_011_1(uniques, 7);
+  f_111_000_010_100_0(uniques, 7);
+  f_111_000_010_100_1(uniques, 7);
+  f_111_000_010_101_0(uniques, 7);
+  f_111_000_010_101_1(uniques, 7);
+  f_111_000_010_110_0(uniques, 7);
+  f_111_000_010_110_1(uniques, 7);
+  f_111_000_010_111_0(uniques, 7);
+  f_111_000_010_111_1(uniques, 7);
+  f_111_000_011_000_0(uniques, 7);
+  f_111_000_011_000_1(uniques, 7);
+  f_111_000_011_001_0(uniques, 7);
+  f_111_000_011_001_1(uniques, 7);
+  f_111_000_011_010_0(uniques, 7);
+  f_111_000_011_010_1(uniques, 7);
+  f_111_000_011_011_0(uniques, 7);
+  f_111_000_011_011_1(uniques, 7);
+  f_111_000_011_100_0(uniques, 7);
+  f_111_000_011_100_1(uniques, 7);
+  f_111_000_011_101_0(uniques, 7);
+  f_111_000_011_101_1(uniques, 7);
+  f_111_000_011_110_0(uniques, 7);
+  f_111_000_011_110_1(uniques, 7);
+  f_111_000_011_111_0(uniques, 7);
+  f_111_000_011_111_1(uniques, 7);
+  f_111_000_110_000_0(uniques, 7);
+  f_111_000_110_000_1(uniques, 7);
+  f_111_000_110_001_0(uniques, 7);
+  f_111_000_110_001_1(uniques, 7);
+  f_111_000_110_010_0(uniques, 7);
+  f_111_000_110_010_1(uniques, 7);
+  f_111_000_110_011_0(uniques, 7);
+  f_111_000_110_011_1(uniques, 7);
+  f_111_000_110_100_0(uniques, 7);
+  f_111_000_110_100_1(uniques, 7);
+  f_111_000_110_101_0(uniques, 7);
+  f_111_000_110_101_1(uniques, 7);
+  f_111_000_110_110_0(uniques, 7);
+  f_111_000_110_110_1(uniques, 7);
+  f_111_000_110_111_0(uniques, 7);
+  f_111_000_110_111_1(uniques, 7);
+  f_111_000_111_000_0(uniques, 7);
+  f_111_000_111_000_1(uniques, 7);
+  f_111_000_111_001_0(uniques, 7);
+  f_111_000_111_001_1(uniques, 7);
+  f_111_000_111_010_0(uniques, 7);
+  f_111_000_111_010_1(uniques, 7);
+  f_111_000_111_011_0(uniques, 7);
+  f_111_000_111_011_1(uniques, 7);
+  f_111_000_111_100_0(uniques, 7);
+  f_111_000_111_100_1(uniques, 7);
+  f_111_000_111_101_0(uniques, 7);
+  f_111_000_111_101_1(uniques, 7);
+  f_111_000_111_110_0(uniques, 7);
+  f_111_000_111_110_1(uniques, 7);
+  f_111_000_111_111_0(uniques, 7);
+  f_111_000_111_111_1(uniques, 7);
+  f_111_001_010_000_0(uniques, 7);
+  f_111_001_010_000_1(uniques, 7);
+  f_111_001_010_001_0(uniques, 7);
+  f_111_001_010_001_1(uniques, 7);
+  f_111_001_010_010_0(uniques, 7);
+  f_111_001_010_010_1(uniques, 7);
+  f_111_001_010_011_0(uniques, 7);
+  f_111_001_010_011_1(uniques, 7);
+  f_111_001_010_100_0(uniques, 7);
+  f_111_001_010_100_1(uniques, 7);
+  f_111_001_010_101_0(uniques, 7);
+  f_111_001_010_101_1(uniques, 7);
+  f_111_001_010_110_0(uniques, 7);
+  f_111_001_010_110_1(uniques, 7);
+  f_111_001_010_111_0(uniques, 7);
+  f_111_001_010_111_1(uniques, 7);
+  f_111_001_011_000_0(uniques, 7);
+  f_111_001_011_000_1(uniques, 7);
+  f_111_001_011_001_0(uniques, 7);
+  f_111_001_011_001_1(uniques, 7);
+  f_111_001_011_010_0(uniques, 7);
+  f_111_001_011_010_1(uniques, 7);
+  f_111_001_011_011_0(uniques, 7);
+  f_111_001_011_011_1(uniques, 7);
+  f_111_001_011_100_0(uniques, 7);
+  f_111_001_011_100_1(uniques, 7);
+  f_111_001_011_101_0(uniques, 7);
+  f_111_001_011_101_1(uniques, 7);
+  f_111_001_011_110_0(uniques, 7);
+  f_111_001_011_110_1(uniques, 7);
+  f_111_001_011_111_0(uniques, 7);
+  f_111_001_011_111_1(uniques, 7);
+  f_111_001_110_000_0(uniques, 7);
+  f_111_001_110_000_1(uniques, 7);
+  f_111_001_110_001_0(uniques, 7);
+  f_111_001_110_001_1(uniques, 7);
+  f_111_001_110_010_0(uniques, 7);
+  f_111_001_110_010_1(uniques, 7);
+  f_111_001_110_011_0(uniques, 7);
+  f_111_001_110_011_1(uniques, 7);
+  f_111_001_110_100_0(uniques, 7);
+  f_111_001_110_100_1(uniques, 7);
+  f_111_001_110_101_0(uniques, 7);
+  f_111_001_110_101_1(uniques, 7);
+  f_111_001_110_110_0(uniques, 7);
+  f_111_001_110_110_1(uniques, 7);
+  f_111_001_110_111_0(uniques, 7);
+  f_111_001_110_111_1(uniques, 7);
+  f_111_001_111_000_0(uniques, 7);
+  f_111_001_111_000_1(uniques, 7);
+  f_111_001_111_001_0(uniques, 7);
+  f_111_001_111_001_1(uniques, 7);
+  f_111_001_111_010_0(uniques, 7);
+  f_111_001_111_010_1(uniques, 7);
+  f_111_001_111_011_0(uniques, 7);
+  f_111_001_111_011_1(uniques, 7);
+  f_111_001_111_100_0(uniques, 7);
+  f_111_001_111_100_1(uniques, 7);
+  f_111_001_111_101_0(uniques, 7);
+  f_111_001_111_101_1(uniques, 7);
+  f_111_001_111_110_0(uniques, 7);
+  f_111_001_111_110_1(uniques, 7);
+  f_111_001_111_111_0(uniques, 7);
+  f_111_001_111_111_1(uniques, 7);
+  f_111_010_010_000_0(uniques, 7);
+  f_111_010_010_000_1(uniques, 7);
+  f_111_010_010_001_0(uniques, 7);
+  f_111_010_010_001_1(uniques, 7);
+  f_111_010_010_010_0(uniques, 7);
+  f_111_010_010_010_1(uniques, 7);
+  f_111_010_010_011_0(uniques, 7);
+  f_111_010_010_011_1(uniques, 7);
+  f_111_010_010_100_0(uniques, 7);
+  f_111_010_010_100_1(uniques, 7);
+  f_111_010_010_101_0(uniques, 7);
+  f_111_010_010_101_1(uniques, 7);
+  f_111_010_010_110_0(uniques, 7);
+  f_111_010_010_110_1(uniques, 7);
+  f_111_010_010_111_0(uniques, 7);
+  f_111_010_010_111_1(uniques, 7);
+  f_111_010_011_000_0(uniques, 7);
+  f_111_010_011_000_1(uniques, 7);
+  f_111_010_011_001_0(uniques, 7);
+  f_111_010_011_001_1(uniques, 7);
+  f_111_010_011_010_0(uniques, 7);
+  f_111_010_011_010_1(uniques, 7);
+  f_111_010_011_011_0(uniques, 7);
+  f_111_010_011_011_1(uniques, 7);
+  f_111_010_011_100_0(uniques, 7);
+  f_111_010_011_100_1(uniques, 7);
+  f_111_010_011_101_0(uniques, 7);
+  f_111_010_011_101_1(uniques, 7);
+  f_111_010_011_110_0(uniques, 7);
+  f_111_010_011_110_1(uniques, 7);
+  f_111_010_011_111_0(uniques, 7);
+  f_111_010_011_111_1(uniques, 7);
+  f_111_010_110_000_0(uniques, 7);
+  f_111_010_110_000_1(uniques, 7);
+  f_111_010_110_001_0(uniques, 7);
+  f_111_010_110_001_1(uniques, 7);
+  f_111_010_110_010_0(uniques, 7);
+  f_111_010_110_010_1(uniques, 7);
+  f_111_010_110_011_0(uniques, 7);
+  f_111_010_110_011_1(uniques, 7);
+  f_111_010_110_100_0(uniques, 7);
+  f_111_010_110_100_1(uniques, 7);
+  f_111_010_110_101_0(uniques, 7);
+  f_111_010_110_101_1(uniques, 7);
+  f_111_010_110_110_0(uniques, 7);
+  f_111_010_110_110_1(uniques, 7);
+  f_111_010_110_111_0(uniques, 7);
+  f_111_010_110_111_1(uniques, 7);
+  f_111_010_111_000_0(uniques, 7);
+  f_111_010_111_000_1(uniques, 7);
+  f_111_010_111_001_0(uniques, 7);
+  f_111_010_111_001_1(uniques, 7);
+  f_111_010_111_010_0(uniques, 7);
+  f_111_010_111_010_1(uniques, 7);
+  f_111_010_111_011_0(uniques, 7);
+  f_111_010_111_011_1(uniques, 7);
+  f_111_010_111_100_0(uniques, 7);
+  f_111_010_111_100_1(uniques, 7);
+  f_111_010_111_101_0(uniques, 7);
+  f_111_010_111_101_1(uniques, 7);
+  f_111_010_111_110_0(uniques, 7);
+  f_111_010_111_110_1(uniques, 7);
+  f_111_010_111_111_0(uniques, 7);
+  f_111_010_111_111_1(uniques, 7);
+  f_111_011_010_000_0(uniques, 7);
+  f_111_011_010_000_1(uniques, 7);
+  f_111_011_010_001_0(uniques, 7);
+  f_111_011_010_001_1(uniques, 7);
+  f_111_011_010_010_0(uniques, 7);
+  f_111_011_010_010_1(uniques, 7);
+  f_111_011_010_011_0(uniques, 7);
+  f_111_011_010_011_1(uniques, 7);
+  f_111_011_010_100_0(uniques, 7);
+  f_111_011_010_100_1(uniques, 7);
+  f_111_011_010_101_0(uniques, 7);
+  f_111_011_010_101_1(uniques, 7);
+  f_111_011_010_110_0(uniques, 7);
+  f_111_011_010_110_1(uniques, 7);
+  f_111_011_010_111_0(uniques, 7);
+  f_111_011_010_111_1(uniques, 7);
+  f_111_011_011_000_0(uniques, 7);
+  f_111_011_011_000_1(uniques, 7);
+  f_111_011_011_001_0(uniques, 7);
+  f_111_011_011_001_1(uniques, 7);
+  f_111_011_011_010_0(uniques, 7);
+  f_111_011_011_010_1(uniques, 7);
+  f_111_011_011_011_0(uniques, 7);
+  f_111_011_011_011_1(uniques, 7);
+  f_111_011_011_100_0(uniques, 7);
+  f_111_011_011_100_1(uniques, 7);
+  f_111_011_011_101_0(uniques, 7);
+  f_111_011_011_101_1(uniques, 7);
+  f_111_011_011_110_0(uniques, 7);
+  f_111_011_011_110_1(uniques, 7);
+  f_111_011_011_111_0(uniques, 7);
+  f_111_011_011_111_1(uniques, 7);
+  f_111_011_110_000_0(uniques, 7);
+  f_111_011_110_000_1(uniques, 7);
+  f_111_011_110_001_0(uniques, 7);
+  f_111_011_110_001_1(uniques, 7);
+  f_111_011_110_010_0(uniques, 7);
+  f_111_011_110_010_1(uniques, 7);
+  f_111_011_110_011_0(uniques, 7);
+  f_111_011_110_011_1(uniques, 7);
+  f_111_011_110_100_0(uniques, 7);
+  f_111_011_110_100_1(uniques, 7);
+  f_111_011_110_101_0(uniques, 7);
+  f_111_011_110_101_1(uniques, 7);
+  f_111_011_110_110_0(uniques, 7);
+  f_111_011_110_110_1(uniques, 7);
+  f_111_011_110_111_0(uniques, 7);
+  f_111_011_110_111_1(uniques, 7);
+  f_111_011_111_000_0(uniques, 7);
+  f_111_011_111_000_1(uniques, 7);
+  f_111_011_111_001_0(uniques, 7);
+  f_111_011_111_001_1(uniques, 7);
+  f_111_011_111_010_0(uniques, 7);
+  f_111_011_111_010_1(uniques, 7);
+  f_111_011_111_011_0(uniques, 7);
+  f_111_011_111_011_1(uniques, 7);
+  f_111_011_111_100_0(uniques, 7);
+  f_111_011_111_100_1(uniques, 7);
+  f_111_011_111_101_0(uniques, 7);
+  f_111_011_111_101_1(uniques, 7);
+  f_111_011_111_110_0(uniques, 7);
+  f_111_011_111_110_1(uniques, 7);
+  f_111_011_111_111_0(uniques, 7);
+  f_111_011_111_111_1(uniques, 7);
+  f_111_100_010_000_0(uniques, 7);
+  f_111_100_010_000_1(uniques, 7);
+  f_111_100_010_001_0(uniques, 7);
+  f_111_100_010_001_1(uniques, 7);
+  f_111_100_010_010_0(uniques, 7);
+  f_111_100_010_010_1(uniques, 7);
+  f_111_100_010_011_0(uniques, 7);
+  f_111_100_010_011_1(uniques, 7);
+  f_111_100_010_100_0(uniques, 7);
+  f_111_100_010_100_1(uniques, 7);
+  f_111_100_010_101_0(uniques, 7);
+  f_111_100_010_101_1(uniques, 7);
+  f_111_100_010_110_0(uniques, 7);
+  f_111_100_010_110_1(uniques, 7);
+  f_111_100_010_111_0(uniques, 7);
+  f_111_100_010_111_1(uniques, 7);
+  f_111_100_011_000_0(uniques, 7);
+  f_111_100_011_000_1(uniques, 7);
+  f_111_100_011_001_0(uniques, 7);
+  f_111_100_011_001_1(uniques, 7);
+  f_111_100_011_010_0(uniques, 7);
+  f_111_100_011_010_1(uniques, 7);
+  f_111_100_011_011_0(uniques, 7);
+  f_111_100_011_011_1(uniques, 7);
+  f_111_100_011_100_0(uniques, 7);
+  f_111_100_011_100_1(uniques, 7);
+  f_111_100_011_101_0(uniques, 7);
+  f_111_100_011_101_1(uniques, 7);
+  f_111_100_011_110_0(uniques, 7);
+  f_111_100_011_110_1(uniques, 7);
+  f_111_100_011_111_0(uniques, 7);
+  f_111_100_011_111_1(uniques, 7);
+  f_111_100_110_000_0(uniques, 7);
+  f_111_100_110_000_1(uniques, 7);
+  f_111_100_110_001_0(uniques, 7);
+  f_111_100_110_001_1(uniques, 7);
+  f_111_100_110_010_0(uniques, 7);
+  f_111_100_110_010_1(uniques, 7);
+  f_111_100_110_011_0(uniques, 7);
+  f_111_100_110_011_1(uniques, 7);
+  f_111_100_110_100_0(uniques, 7);
+  f_111_100_110_100_1(uniques, 7);
+  f_111_100_110_101_0(uniques, 7);
+  f_111_100_110_101_1(uniques, 7);
+  f_111_100_110_110_0(uniques, 7);
+  f_111_100_110_110_1(uniques, 7);
+  f_111_100_110_111_0(uniques, 7);
+  f_111_100_110_111_1(uniques, 7);
+  f_111_100_111_000_0(uniques, 7);
+  f_111_100_111_000_1(uniques, 7);
+  f_111_100_111_001_0(uniques, 7);
+  f_111_100_111_001_1(uniques, 7);
+  f_111_100_111_010_0(uniques, 7);
+  f_111_100_111_010_1(uniques, 7);
+  f_111_100_111_011_0(uniques, 7);
+  f_111_100_111_011_1(uniques, 7);
+  f_111_100_111_100_0(uniques, 7);
+  f_111_100_111_100_1(uniques, 7);
+  f_111_100_111_101_0(uniques, 7);
+  f_111_100_111_101_1(uniques, 7);
+  f_111_100_111_110_0(uniques, 7);
+  f_111_100_111_110_1(uniques, 7);
+  f_111_100_111_111_0(uniques, 7);
+  f_111_100_111_111_1(uniques, 7);
+  f_111_101_010_000_0(uniques, 7);
+  f_111_101_010_000_1(uniques, 7);
+  f_111_101_010_001_0(uniques, 7);
+  f_111_101_010_001_1(uniques, 7);
+  f_111_101_010_010_0(uniques, 7);
+  f_111_101_010_010_1(uniques, 7);
+  f_111_101_010_011_0(uniques, 7);
+  f_111_101_010_011_1(uniques, 7);
+  f_111_101_010_100_0(uniques, 7);
+  f_111_101_010_100_1(uniques, 7);
+  f_111_101_010_101_0(uniques, 7);
+  f_111_101_010_101_1(uniques, 7);
+  f_111_101_010_110_0(uniques, 7);
+  f_111_101_010_110_1(uniques, 7);
+  f_111_101_010_111_0(uniques, 7);
+  f_111_101_010_111_1(uniques, 7);
+  f_111_101_011_000_0(uniques, 7);
+  f_111_101_011_000_1(uniques, 7);
+  f_111_101_011_001_0(uniques, 7);
+  f_111_101_011_001_1(uniques, 7);
+  f_111_101_011_010_0(uniques, 7);
+  f_111_101_011_010_1(uniques, 7);
+  f_111_101_011_011_0(uniques, 7);
+  f_111_101_011_011_1(uniques, 7);
+  f_111_101_011_100_0(uniques, 7);
+  f_111_101_011_100_1(uniques, 7);
+  f_111_101_011_101_0(uniques, 7);
+  f_111_101_011_101_1(uniques, 7);
+  f_111_101_011_110_0(uniques, 7);
+  f_111_101_011_110_1(uniques, 7);
+  f_111_101_011_111_0(uniques, 7);
+  f_111_101_011_111_1(uniques, 7);
+  f_111_101_110_000_0(uniques, 7);
+  f_111_101_110_000_1(uniques, 7);
+  f_111_101_110_001_0(uniques, 7);
+  f_111_101_110_001_1(uniques, 7);
+  f_111_101_110_010_0(uniques, 7);
+  f_111_101_110_010_1(uniques, 7);
+  f_111_101_110_011_0(uniques, 7);
+  f_111_101_110_011_1(uniques, 7);
+  f_111_101_110_100_0(uniques, 7);
+  f_111_101_110_100_1(uniques, 7);
+  f_111_101_110_101_0(uniques, 7);
+  f_111_101_110_101_1(uniques, 7);
+  f_111_101_110_110_0(uniques, 7);
+  f_111_101_110_110_1(uniques, 7);
+  f_111_101_110_111_0(uniques, 7);
+  f_111_101_110_111_1(uniques, 7);
+  f_111_101_111_000_0(uniques, 7);
+  f_111_101_111_000_1(uniques, 7);
+  f_111_101_111_001_0(uniques, 7);
+  f_111_101_111_001_1(uniques, 7);
+  f_111_101_111_010_0(uniques, 7);
+  f_111_101_111_010_1(uniques, 7);
+  f_111_101_111_011_0(uniques, 7);
+  f_111_101_111_011_1(uniques, 7);
+  f_111_101_111_100_0(uniques, 7);
+  f_111_101_111_100_1(uniques, 7);
+  f_111_101_111_101_0(uniques, 7);
+  f_111_101_111_101_1(uniques, 7);
+  f_111_101_111_110_0(uniques, 7);
+  f_111_101_111_110_1(uniques, 7);
+  f_111_101_111_111_0(uniques, 7);
+  f_111_101_111_111_1(uniques, 7);
+  f_111_110_010_000_0(uniques, 7);
+  f_111_110_010_000_1(uniques, 7);
+  f_111_110_010_001_0(uniques, 7);
+  f_111_110_010_001_1(uniques, 7);
+  f_111_110_010_010_0(uniques, 7);
+  f_111_110_010_010_1(uniques, 7);
+  f_111_110_010_011_0(uniques, 7);
+  f_111_110_010_011_1(uniques, 7);
+  f_111_110_010_100_0(uniques, 7);
+  f_111_110_010_100_1(uniques, 7);
+  f_111_110_010_101_0(uniques, 7);
+  f_111_110_010_101_1(uniques, 7);
+  f_111_110_010_110_0(uniques, 7);
+  f_111_110_010_110_1(uniques, 7);
+  f_111_110_010_111_0(uniques, 7);
+  f_111_110_010_111_1(uniques, 7);
+  f_111_110_011_000_0(uniques, 7);
+  f_111_110_011_000_1(uniques, 7);
+  f_111_110_011_001_0(uniques, 7);
+  f_111_110_011_001_1(uniques, 7);
+  f_111_110_011_010_0(uniques, 7);
+  f_111_110_011_010_1(uniques, 7);
+  f_111_110_011_011_0(uniques, 7);
+  f_111_110_011_011_1(uniques, 7);
+  f_111_110_011_100_0(uniques, 7);
+  f_111_110_011_100_1(uniques, 7);
+  f_111_110_011_101_0(uniques, 7);
+  f_111_110_011_101_1(uniques, 7);
+  f_111_110_011_110_0(uniques, 7);
+  f_111_110_011_110_1(uniques, 7);
+  f_111_110_011_111_0(uniques, 7);
+  f_111_110_011_111_1(uniques, 7);
+  f_111_110_110_000_0(uniques, 7);
+  f_111_110_110_000_1(uniques, 7);
+  f_111_110_110_001_0(uniques, 7);
+  f_111_110_110_001_1(uniques, 7);
+  f_111_110_110_010_0(uniques, 7);
+  f_111_110_110_010_1(uniques, 7);
+  f_111_110_110_011_0(uniques, 7);
+  f_111_110_110_011_1(uniques, 7);
+  f_111_110_110_100_0(uniques, 7);
+  f_111_110_110_100_1(uniques, 7);
+  f_111_110_110_101_0(uniques, 7);
+  f_111_110_110_101_1(uniques, 7);
+  f_111_110_110_110_0(uniques, 7);
+  f_111_110_110_110_1(uniques, 7);
+  f_111_110_110_111_0(uniques, 7);
+  f_111_110_110_111_1(uniques, 7);
+  f_111_110_111_000_0(uniques, 7);
+  f_111_110_111_000_1(uniques, 7);
+  f_111_110_111_001_0(uniques, 7);
+  f_111_110_111_001_1(uniques, 7);
+  f_111_110_111_010_0(uniques, 7);
+  f_111_110_111_010_1(uniques, 7);
+  f_111_110_111_011_0(uniques, 7);
+  f_111_110_111_011_1(uniques, 7);
+  f_111_110_111_100_0(uniques, 7);
+  f_111_110_111_100_1(uniques, 7);
+  f_111_110_111_101_0(uniques, 7);
+  f_111_110_111_101_1(uniques, 7);
+  f_111_110_111_110_0(uniques, 7);
+  f_111_110_111_110_1(uniques, 7);
+  f_111_110_111_111_0(uniques, 7);
+  f_111_110_111_111_1(uniques, 7);
+  f_111_111_010_000_0(uniques, 7);
+  f_111_111_010_000_1(uniques, 7);
+  f_111_111_010_001_0(uniques, 7);
+  f_111_111_010_001_1(uniques, 7);
+  f_111_111_010_010_0(uniques, 7);
+  f_111_111_010_010_1(uniques, 7);
+  f_111_111_010_011_0(uniques, 7);
+  f_111_111_010_011_1(uniques, 7);
+  f_111_111_010_100_0(uniques, 7);
+  f_111_111_010_100_1(uniques, 7);
+  f_111_111_010_101_0(uniques, 7);
+  f_111_111_010_101_1(uniques, 7);
+  f_111_111_010_110_0(uniques, 7);
+  f_111_111_010_110_1(uniques, 7);
+  f_111_111_010_111_0(uniques, 7);
+  f_111_111_010_111_1(uniques, 7);
+  f_111_111_011_000_0(uniques, 7);
+  f_111_111_011_000_1(uniques, 7);
+  f_111_111_011_001_0(uniques, 7);
+  f_111_111_011_001_1(uniques, 7);
+  f_111_111_011_010_0(uniques, 7);
+  f_111_111_011_010_1(uniques, 7);
+  f_111_111_011_011_0(uniques, 7);
+  f_111_111_011_011_1(uniques, 7);
+  f_111_111_011_100_0(uniques, 7);
+  f_111_111_011_100_1(uniques, 7);
+  f_111_111_011_101_0(uniques, 7);
+  f_111_111_011_101_1(uniques, 7);
+  f_111_111_011_110_0(uniques, 7);
+  f_111_111_011_110_1(uniques, 7);
+  f_111_111_011_111_0(uniques, 7);
+  f_111_111_011_111_1(uniques, 7);
+  f_111_111_110_000_0(uniques, 7);
+  f_111_111_110_000_1(uniques, 7);
+  f_111_111_110_001_0(uniques, 7);
+  f_111_111_110_001_1(uniques, 7);
+  f_111_111_110_010_0(uniques, 7);
+  f_111_111_110_010_1(uniques, 7);
+  f_111_111_110_011_0(uniques, 7);
+  f_111_111_110_011_1(uniques, 7);
+  f_111_111_110_100_0(uniques, 7);
+  f_111_111_110_100_1(uniques, 7);
+  f_111_111_110_101_0(uniques, 7);
+  f_111_111_110_101_1(uniques, 7);
+  f_111_111_110_110_0(uniques, 7);
+  f_111_111_110_110_1(uniques, 7);
+  f_111_111_110_111_0(uniques, 7);
+  f_111_111_110_111_1(uniques, 7);
+  f_111_111_111_000_0(uniques, 7);
+  f_111_111_111_000_1(uniques, 7);
+  f_111_111_111_001_0(uniques, 7);
+  f_111_111_111_001_1(uniques, 7);
+  f_111_111_111_010_0(uniques, 7);
+  f_111_111_111_010_1(uniques, 7);
+  f_111_111_111_011_0(uniques, 7);
+  f_111_111_111_011_1(uniques, 7);
+  f_111_111_111_100_0(uniques, 7);
+  f_111_111_111_100_1(uniques, 7);
+  f_111_111_111_101_0(uniques, 7);
+  f_111_111_111_101_1(uniques, 7);
+  f_111_111_111_110_0(uniques, 7);
+  f_111_111_111_110_1(uniques, 7);
+  f_111_111_111_111_0(uniques, 7);
+  f_111_111_111_111_1(uniques, 7);
+  Expect.equals(4096, uniques.length);
+}
diff --git a/tests/dart2js/deferred/many_parts/lib_000_000_100_000_0.dart b/tests/dart2js/deferred/many_parts/lib_000_000_100_000_0.dart
new file mode 100644
index 0000000..8ab3ffe
--- /dev/null
+++ b/tests/dart2js/deferred/many_parts/lib_000_000_100_000_0.dart
@@ -0,0 +1,4111 @@
+// Copyright (c) 2020, 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:expect/expect.dart";
+
+import 'libB.dart';
+
+@pragma('dart2js:noInline')
+g_000_000_100_000_0() {
+  Set<String> uniques = {};
+
+  // f_***_***_1**_***_*;
+  f_000_000_100_000_0(uniques, 6);
+  f_000_000_100_000_1(uniques, 6);
+  f_000_000_100_001_0(uniques, 6);
+  f_000_000_100_001_1(uniques, 6);
+  f_000_000_100_010_0(uniques, 6);
+  f_000_000_100_010_1(uniques, 6);
+  f_000_000_100_011_0(uniques, 6);
+  f_000_000_100_011_1(uniques, 6);
+  f_000_000_100_100_0(uniques, 6);
+  f_000_000_100_100_1(uniques, 6);
+  f_000_000_100_101_0(uniques, 6);
+  f_000_000_100_101_1(uniques, 6);
+  f_000_000_100_110_0(uniques, 6);
+  f_000_000_100_110_1(uniques, 6);
+  f_000_000_100_111_0(uniques, 6);
+  f_000_000_100_111_1(uniques, 6);
+  f_000_000_101_000_0(uniques, 6);
+  f_000_000_101_000_1(uniques, 6);
+  f_000_000_101_001_0(uniques, 6);
+  f_000_000_101_001_1(uniques, 6);
+  f_000_000_101_010_0(uniques, 6);
+  f_000_000_101_010_1(uniques, 6);
+  f_000_000_101_011_0(uniques, 6);
+  f_000_000_101_011_1(uniques, 6);
+  f_000_000_101_100_0(uniques, 6);
+  f_000_000_101_100_1(uniques, 6);
+  f_000_000_101_101_0(uniques, 6);
+  f_000_000_101_101_1(uniques, 6);
+  f_000_000_101_110_0(uniques, 6);
+  f_000_000_101_110_1(uniques, 6);
+  f_000_000_101_111_0(uniques, 6);
+  f_000_000_101_111_1(uniques, 6);
+  f_000_000_110_000_0(uniques, 6);
+  f_000_000_110_000_1(uniques, 6);
+  f_000_000_110_001_0(uniques, 6);
+  f_000_000_110_001_1(uniques, 6);
+  f_000_000_110_010_0(uniques, 6);
+  f_000_000_110_010_1(uniques, 6);
+  f_000_000_110_011_0(uniques, 6);
+  f_000_000_110_011_1(uniques, 6);
+  f_000_000_110_100_0(uniques, 6);
+  f_000_000_110_100_1(uniques, 6);
+  f_000_000_110_101_0(uniques, 6);
+  f_000_000_110_101_1(uniques, 6);
+  f_000_000_110_110_0(uniques, 6);
+  f_000_000_110_110_1(uniques, 6);
+  f_000_000_110_111_0(uniques, 6);
+  f_000_000_110_111_1(uniques, 6);
+  f_000_000_111_000_0(uniques, 6);
+  f_000_000_111_000_1(uniques, 6);
+  f_000_000_111_001_0(uniques, 6);
+  f_000_000_111_001_1(uniques, 6);
+  f_000_000_111_010_0(uniques, 6);
+  f_000_000_111_010_1(uniques, 6);
+  f_000_000_111_011_0(uniques, 6);
+  f_000_000_111_011_1(uniques, 6);
+  f_000_000_111_100_0(uniques, 6);
+  f_000_000_111_100_1(uniques, 6);
+  f_000_000_111_101_0(uniques, 6);
+  f_000_000_111_101_1(uniques, 6);
+  f_000_000_111_110_0(uniques, 6);
+  f_000_000_111_110_1(uniques, 6);
+  f_000_000_111_111_0(uniques, 6);
+  f_000_000_111_111_1(uniques, 6);
+  f_000_001_100_000_0(uniques, 6);
+  f_000_001_100_000_1(uniques, 6);
+  f_000_001_100_001_0(uniques, 6);
+  f_000_001_100_001_1(uniques, 6);
+  f_000_001_100_010_0(uniques, 6);
+  f_000_001_100_010_1(uniques, 6);
+  f_000_001_100_011_0(uniques, 6);
+  f_000_001_100_011_1(uniques, 6);
+  f_000_001_100_100_0(uniques, 6);
+  f_000_001_100_100_1(uniques, 6);
+  f_000_001_100_101_0(uniques, 6);
+  f_000_001_100_101_1(uniques, 6);
+  f_000_001_100_110_0(uniques, 6);
+  f_000_001_100_110_1(uniques, 6);
+  f_000_001_100_111_0(uniques, 6);
+  f_000_001_100_111_1(uniques, 6);
+  f_000_001_101_000_0(uniques, 6);
+  f_000_001_101_000_1(uniques, 6);
+  f_000_001_101_001_0(uniques, 6);
+  f_000_001_101_001_1(uniques, 6);
+  f_000_001_101_010_0(uniques, 6);
+  f_000_001_101_010_1(uniques, 6);
+  f_000_001_101_011_0(uniques, 6);
+  f_000_001_101_011_1(uniques, 6);
+  f_000_001_101_100_0(uniques, 6);
+  f_000_001_101_100_1(uniques, 6);
+  f_000_001_101_101_0(uniques, 6);
+  f_000_001_101_101_1(uniques, 6);
+  f_000_001_101_110_0(uniques, 6);
+  f_000_001_101_110_1(uniques, 6);
+  f_000_001_101_111_0(uniques, 6);
+  f_000_001_101_111_1(uniques, 6);
+  f_000_001_110_000_0(uniques, 6);
+  f_000_001_110_000_1(uniques, 6);
+  f_000_001_110_001_0(uniques, 6);
+  f_000_001_110_001_1(uniques, 6);
+  f_000_001_110_010_0(uniques, 6);
+  f_000_001_110_010_1(uniques, 6);
+  f_000_001_110_011_0(uniques, 6);
+  f_000_001_110_011_1(uniques, 6);
+  f_000_001_110_100_0(uniques, 6);
+  f_000_001_110_100_1(uniques, 6);
+  f_000_001_110_101_0(uniques, 6);
+  f_000_001_110_101_1(uniques, 6);
+  f_000_001_110_110_0(uniques, 6);
+  f_000_001_110_110_1(uniques, 6);
+  f_000_001_110_111_0(uniques, 6);
+  f_000_001_110_111_1(uniques, 6);
+  f_000_001_111_000_0(uniques, 6);
+  f_000_001_111_000_1(uniques, 6);
+  f_000_001_111_001_0(uniques, 6);
+  f_000_001_111_001_1(uniques, 6);
+  f_000_001_111_010_0(uniques, 6);
+  f_000_001_111_010_1(uniques, 6);
+  f_000_001_111_011_0(uniques, 6);
+  f_000_001_111_011_1(uniques, 6);
+  f_000_001_111_100_0(uniques, 6);
+  f_000_001_111_100_1(uniques, 6);
+  f_000_001_111_101_0(uniques, 6);
+  f_000_001_111_101_1(uniques, 6);
+  f_000_001_111_110_0(uniques, 6);
+  f_000_001_111_110_1(uniques, 6);
+  f_000_001_111_111_0(uniques, 6);
+  f_000_001_111_111_1(uniques, 6);
+  f_000_010_100_000_0(uniques, 6);
+  f_000_010_100_000_1(uniques, 6);
+  f_000_010_100_001_0(uniques, 6);
+  f_000_010_100_001_1(uniques, 6);
+  f_000_010_100_010_0(uniques, 6);
+  f_000_010_100_010_1(uniques, 6);
+  f_000_010_100_011_0(uniques, 6);
+  f_000_010_100_011_1(uniques, 6);
+  f_000_010_100_100_0(uniques, 6);
+  f_000_010_100_100_1(uniques, 6);
+  f_000_010_100_101_0(uniques, 6);
+  f_000_010_100_101_1(uniques, 6);
+  f_000_010_100_110_0(uniques, 6);
+  f_000_010_100_110_1(uniques, 6);
+  f_000_010_100_111_0(uniques, 6);
+  f_000_010_100_111_1(uniques, 6);
+  f_000_010_101_000_0(uniques, 6);
+  f_000_010_101_000_1(uniques, 6);
+  f_000_010_101_001_0(uniques, 6);
+  f_000_010_101_001_1(uniques, 6);
+  f_000_010_101_010_0(uniques, 6);
+  f_000_010_101_010_1(uniques, 6);
+  f_000_010_101_011_0(uniques, 6);
+  f_000_010_101_011_1(uniques, 6);
+  f_000_010_101_100_0(uniques, 6);
+  f_000_010_101_100_1(uniques, 6);
+  f_000_010_101_101_0(uniques, 6);
+  f_000_010_101_101_1(uniques, 6);
+  f_000_010_101_110_0(uniques, 6);
+  f_000_010_101_110_1(uniques, 6);
+  f_000_010_101_111_0(uniques, 6);
+  f_000_010_101_111_1(uniques, 6);
+  f_000_010_110_000_0(uniques, 6);
+  f_000_010_110_000_1(uniques, 6);
+  f_000_010_110_001_0(uniques, 6);
+  f_000_010_110_001_1(uniques, 6);
+  f_000_010_110_010_0(uniques, 6);
+  f_000_010_110_010_1(uniques, 6);
+  f_000_010_110_011_0(uniques, 6);
+  f_000_010_110_011_1(uniques, 6);
+  f_000_010_110_100_0(uniques, 6);
+  f_000_010_110_100_1(uniques, 6);
+  f_000_010_110_101_0(uniques, 6);
+  f_000_010_110_101_1(uniques, 6);
+  f_000_010_110_110_0(uniques, 6);
+  f_000_010_110_110_1(uniques, 6);
+  f_000_010_110_111_0(uniques, 6);
+  f_000_010_110_111_1(uniques, 6);
+  f_000_010_111_000_0(uniques, 6);
+  f_000_010_111_000_1(uniques, 6);
+  f_000_010_111_001_0(uniques, 6);
+  f_000_010_111_001_1(uniques, 6);
+  f_000_010_111_010_0(uniques, 6);
+  f_000_010_111_010_1(uniques, 6);
+  f_000_010_111_011_0(uniques, 6);
+  f_000_010_111_011_1(uniques, 6);
+  f_000_010_111_100_0(uniques, 6);
+  f_000_010_111_100_1(uniques, 6);
+  f_000_010_111_101_0(uniques, 6);
+  f_000_010_111_101_1(uniques, 6);
+  f_000_010_111_110_0(uniques, 6);
+  f_000_010_111_110_1(uniques, 6);
+  f_000_010_111_111_0(uniques, 6);
+  f_000_010_111_111_1(uniques, 6);
+  f_000_011_100_000_0(uniques, 6);
+  f_000_011_100_000_1(uniques, 6);
+  f_000_011_100_001_0(uniques, 6);
+  f_000_011_100_001_1(uniques, 6);
+  f_000_011_100_010_0(uniques, 6);
+  f_000_011_100_010_1(uniques, 6);
+  f_000_011_100_011_0(uniques, 6);
+  f_000_011_100_011_1(uniques, 6);
+  f_000_011_100_100_0(uniques, 6);
+  f_000_011_100_100_1(uniques, 6);
+  f_000_011_100_101_0(uniques, 6);
+  f_000_011_100_101_1(uniques, 6);
+  f_000_011_100_110_0(uniques, 6);
+  f_000_011_100_110_1(uniques, 6);
+  f_000_011_100_111_0(uniques, 6);
+  f_000_011_100_111_1(uniques, 6);
+  f_000_011_101_000_0(uniques, 6);
+  f_000_011_101_000_1(uniques, 6);
+  f_000_011_101_001_0(uniques, 6);
+  f_000_011_101_001_1(uniques, 6);
+  f_000_011_101_010_0(uniques, 6);
+  f_000_011_101_010_1(uniques, 6);
+  f_000_011_101_011_0(uniques, 6);
+  f_000_011_101_011_1(uniques, 6);
+  f_000_011_101_100_0(uniques, 6);
+  f_000_011_101_100_1(uniques, 6);
+  f_000_011_101_101_0(uniques, 6);
+  f_000_011_101_101_1(uniques, 6);
+  f_000_011_101_110_0(uniques, 6);
+  f_000_011_101_110_1(uniques, 6);
+  f_000_011_101_111_0(uniques, 6);
+  f_000_011_101_111_1(uniques, 6);
+  f_000_011_110_000_0(uniques, 6);
+  f_000_011_110_000_1(uniques, 6);
+  f_000_011_110_001_0(uniques, 6);
+  f_000_011_110_001_1(uniques, 6);
+  f_000_011_110_010_0(uniques, 6);
+  f_000_011_110_010_1(uniques, 6);
+  f_000_011_110_011_0(uniques, 6);
+  f_000_011_110_011_1(uniques, 6);
+  f_000_011_110_100_0(uniques, 6);
+  f_000_011_110_100_1(uniques, 6);
+  f_000_011_110_101_0(uniques, 6);
+  f_000_011_110_101_1(uniques, 6);
+  f_000_011_110_110_0(uniques, 6);
+  f_000_011_110_110_1(uniques, 6);
+  f_000_011_110_111_0(uniques, 6);
+  f_000_011_110_111_1(uniques, 6);
+  f_000_011_111_000_0(uniques, 6);
+  f_000_011_111_000_1(uniques, 6);
+  f_000_011_111_001_0(uniques, 6);
+  f_000_011_111_001_1(uniques, 6);
+  f_000_011_111_010_0(uniques, 6);
+  f_000_011_111_010_1(uniques, 6);
+  f_000_011_111_011_0(uniques, 6);
+  f_000_011_111_011_1(uniques, 6);
+  f_000_011_111_100_0(uniques, 6);
+  f_000_011_111_100_1(uniques, 6);
+  f_000_011_111_101_0(uniques, 6);
+  f_000_011_111_101_1(uniques, 6);
+  f_000_011_111_110_0(uniques, 6);
+  f_000_011_111_110_1(uniques, 6);
+  f_000_011_111_111_0(uniques, 6);
+  f_000_011_111_111_1(uniques, 6);
+  f_000_100_100_000_0(uniques, 6);
+  f_000_100_100_000_1(uniques, 6);
+  f_000_100_100_001_0(uniques, 6);
+  f_000_100_100_001_1(uniques, 6);
+  f_000_100_100_010_0(uniques, 6);
+  f_000_100_100_010_1(uniques, 6);
+  f_000_100_100_011_0(uniques, 6);
+  f_000_100_100_011_1(uniques, 6);
+  f_000_100_100_100_0(uniques, 6);
+  f_000_100_100_100_1(uniques, 6);
+  f_000_100_100_101_0(uniques, 6);
+  f_000_100_100_101_1(uniques, 6);
+  f_000_100_100_110_0(uniques, 6);
+  f_000_100_100_110_1(uniques, 6);
+  f_000_100_100_111_0(uniques, 6);
+  f_000_100_100_111_1(uniques, 6);
+  f_000_100_101_000_0(uniques, 6);
+  f_000_100_101_000_1(uniques, 6);
+  f_000_100_101_001_0(uniques, 6);
+  f_000_100_101_001_1(uniques, 6);
+  f_000_100_101_010_0(uniques, 6);
+  f_000_100_101_010_1(uniques, 6);
+  f_000_100_101_011_0(uniques, 6);
+  f_000_100_101_011_1(uniques, 6);
+  f_000_100_101_100_0(uniques, 6);
+  f_000_100_101_100_1(uniques, 6);
+  f_000_100_101_101_0(uniques, 6);
+  f_000_100_101_101_1(uniques, 6);
+  f_000_100_101_110_0(uniques, 6);
+  f_000_100_101_110_1(uniques, 6);
+  f_000_100_101_111_0(uniques, 6);
+  f_000_100_101_111_1(uniques, 6);
+  f_000_100_110_000_0(uniques, 6);
+  f_000_100_110_000_1(uniques, 6);
+  f_000_100_110_001_0(uniques, 6);
+  f_000_100_110_001_1(uniques, 6);
+  f_000_100_110_010_0(uniques, 6);
+  f_000_100_110_010_1(uniques, 6);
+  f_000_100_110_011_0(uniques, 6);
+  f_000_100_110_011_1(uniques, 6);
+  f_000_100_110_100_0(uniques, 6);
+  f_000_100_110_100_1(uniques, 6);
+  f_000_100_110_101_0(uniques, 6);
+  f_000_100_110_101_1(uniques, 6);
+  f_000_100_110_110_0(uniques, 6);
+  f_000_100_110_110_1(uniques, 6);
+  f_000_100_110_111_0(uniques, 6);
+  f_000_100_110_111_1(uniques, 6);
+  f_000_100_111_000_0(uniques, 6);
+  f_000_100_111_000_1(uniques, 6);
+  f_000_100_111_001_0(uniques, 6);
+  f_000_100_111_001_1(uniques, 6);
+  f_000_100_111_010_0(uniques, 6);
+  f_000_100_111_010_1(uniques, 6);
+  f_000_100_111_011_0(uniques, 6);
+  f_000_100_111_011_1(uniques, 6);
+  f_000_100_111_100_0(uniques, 6);
+  f_000_100_111_100_1(uniques, 6);
+  f_000_100_111_101_0(uniques, 6);
+  f_000_100_111_101_1(uniques, 6);
+  f_000_100_111_110_0(uniques, 6);
+  f_000_100_111_110_1(uniques, 6);
+  f_000_100_111_111_0(uniques, 6);
+  f_000_100_111_111_1(uniques, 6);
+  f_000_101_100_000_0(uniques, 6);
+  f_000_101_100_000_1(uniques, 6);
+  f_000_101_100_001_0(uniques, 6);
+  f_000_101_100_001_1(uniques, 6);
+  f_000_101_100_010_0(uniques, 6);
+  f_000_101_100_010_1(uniques, 6);
+  f_000_101_100_011_0(uniques, 6);
+  f_000_101_100_011_1(uniques, 6);
+  f_000_101_100_100_0(uniques, 6);
+  f_000_101_100_100_1(uniques, 6);
+  f_000_101_100_101_0(uniques, 6);
+  f_000_101_100_101_1(uniques, 6);
+  f_000_101_100_110_0(uniques, 6);
+  f_000_101_100_110_1(uniques, 6);
+  f_000_101_100_111_0(uniques, 6);
+  f_000_101_100_111_1(uniques, 6);
+  f_000_101_101_000_0(uniques, 6);
+  f_000_101_101_000_1(uniques, 6);
+  f_000_101_101_001_0(uniques, 6);
+  f_000_101_101_001_1(uniques, 6);
+  f_000_101_101_010_0(uniques, 6);
+  f_000_101_101_010_1(uniques, 6);
+  f_000_101_101_011_0(uniques, 6);
+  f_000_101_101_011_1(uniques, 6);
+  f_000_101_101_100_0(uniques, 6);
+  f_000_101_101_100_1(uniques, 6);
+  f_000_101_101_101_0(uniques, 6);
+  f_000_101_101_101_1(uniques, 6);
+  f_000_101_101_110_0(uniques, 6);
+  f_000_101_101_110_1(uniques, 6);
+  f_000_101_101_111_0(uniques, 6);
+  f_000_101_101_111_1(uniques, 6);
+  f_000_101_110_000_0(uniques, 6);
+  f_000_101_110_000_1(uniques, 6);
+  f_000_101_110_001_0(uniques, 6);
+  f_000_101_110_001_1(uniques, 6);
+  f_000_101_110_010_0(uniques, 6);
+  f_000_101_110_010_1(uniques, 6);
+  f_000_101_110_011_0(uniques, 6);
+  f_000_101_110_011_1(uniques, 6);
+  f_000_101_110_100_0(uniques, 6);
+  f_000_101_110_100_1(uniques, 6);
+  f_000_101_110_101_0(uniques, 6);
+  f_000_101_110_101_1(uniques, 6);
+  f_000_101_110_110_0(uniques, 6);
+  f_000_101_110_110_1(uniques, 6);
+  f_000_101_110_111_0(uniques, 6);
+  f_000_101_110_111_1(uniques, 6);
+  f_000_101_111_000_0(uniques, 6);
+  f_000_101_111_000_1(uniques, 6);
+  f_000_101_111_001_0(uniques, 6);
+  f_000_101_111_001_1(uniques, 6);
+  f_000_101_111_010_0(uniques, 6);
+  f_000_101_111_010_1(uniques, 6);
+  f_000_101_111_011_0(uniques, 6);
+  f_000_101_111_011_1(uniques, 6);
+  f_000_101_111_100_0(uniques, 6);
+  f_000_101_111_100_1(uniques, 6);
+  f_000_101_111_101_0(uniques, 6);
+  f_000_101_111_101_1(uniques, 6);
+  f_000_101_111_110_0(uniques, 6);
+  f_000_101_111_110_1(uniques, 6);
+  f_000_101_111_111_0(uniques, 6);
+  f_000_101_111_111_1(uniques, 6);
+  f_000_110_100_000_0(uniques, 6);
+  f_000_110_100_000_1(uniques, 6);
+  f_000_110_100_001_0(uniques, 6);
+  f_000_110_100_001_1(uniques, 6);
+  f_000_110_100_010_0(uniques, 6);
+  f_000_110_100_010_1(uniques, 6);
+  f_000_110_100_011_0(uniques, 6);
+  f_000_110_100_011_1(uniques, 6);
+  f_000_110_100_100_0(uniques, 6);
+  f_000_110_100_100_1(uniques, 6);
+  f_000_110_100_101_0(uniques, 6);
+  f_000_110_100_101_1(uniques, 6);
+  f_000_110_100_110_0(uniques, 6);
+  f_000_110_100_110_1(uniques, 6);
+  f_000_110_100_111_0(uniques, 6);
+  f_000_110_100_111_1(uniques, 6);
+  f_000_110_101_000_0(uniques, 6);
+  f_000_110_101_000_1(uniques, 6);
+  f_000_110_101_001_0(uniques, 6);
+  f_000_110_101_001_1(uniques, 6);
+  f_000_110_101_010_0(uniques, 6);
+  f_000_110_101_010_1(uniques, 6);
+  f_000_110_101_011_0(uniques, 6);
+  f_000_110_101_011_1(uniques, 6);
+  f_000_110_101_100_0(uniques, 6);
+  f_000_110_101_100_1(uniques, 6);
+  f_000_110_101_101_0(uniques, 6);
+  f_000_110_101_101_1(uniques, 6);
+  f_000_110_101_110_0(uniques, 6);
+  f_000_110_101_110_1(uniques, 6);
+  f_000_110_101_111_0(uniques, 6);
+  f_000_110_101_111_1(uniques, 6);
+  f_000_110_110_000_0(uniques, 6);
+  f_000_110_110_000_1(uniques, 6);
+  f_000_110_110_001_0(uniques, 6);
+  f_000_110_110_001_1(uniques, 6);
+  f_000_110_110_010_0(uniques, 6);
+  f_000_110_110_010_1(uniques, 6);
+  f_000_110_110_011_0(uniques, 6);
+  f_000_110_110_011_1(uniques, 6);
+  f_000_110_110_100_0(uniques, 6);
+  f_000_110_110_100_1(uniques, 6);
+  f_000_110_110_101_0(uniques, 6);
+  f_000_110_110_101_1(uniques, 6);
+  f_000_110_110_110_0(uniques, 6);
+  f_000_110_110_110_1(uniques, 6);
+  f_000_110_110_111_0(uniques, 6);
+  f_000_110_110_111_1(uniques, 6);
+  f_000_110_111_000_0(uniques, 6);
+  f_000_110_111_000_1(uniques, 6);
+  f_000_110_111_001_0(uniques, 6);
+  f_000_110_111_001_1(uniques, 6);
+  f_000_110_111_010_0(uniques, 6);
+  f_000_110_111_010_1(uniques, 6);
+  f_000_110_111_011_0(uniques, 6);
+  f_000_110_111_011_1(uniques, 6);
+  f_000_110_111_100_0(uniques, 6);
+  f_000_110_111_100_1(uniques, 6);
+  f_000_110_111_101_0(uniques, 6);
+  f_000_110_111_101_1(uniques, 6);
+  f_000_110_111_110_0(uniques, 6);
+  f_000_110_111_110_1(uniques, 6);
+  f_000_110_111_111_0(uniques, 6);
+  f_000_110_111_111_1(uniques, 6);
+  f_000_111_100_000_0(uniques, 6);
+  f_000_111_100_000_1(uniques, 6);
+  f_000_111_100_001_0(uniques, 6);
+  f_000_111_100_001_1(uniques, 6);
+  f_000_111_100_010_0(uniques, 6);
+  f_000_111_100_010_1(uniques, 6);
+  f_000_111_100_011_0(uniques, 6);
+  f_000_111_100_011_1(uniques, 6);
+  f_000_111_100_100_0(uniques, 6);
+  f_000_111_100_100_1(uniques, 6);
+  f_000_111_100_101_0(uniques, 6);
+  f_000_111_100_101_1(uniques, 6);
+  f_000_111_100_110_0(uniques, 6);
+  f_000_111_100_110_1(uniques, 6);
+  f_000_111_100_111_0(uniques, 6);
+  f_000_111_100_111_1(uniques, 6);
+  f_000_111_101_000_0(uniques, 6);
+  f_000_111_101_000_1(uniques, 6);
+  f_000_111_101_001_0(uniques, 6);
+  f_000_111_101_001_1(uniques, 6);
+  f_000_111_101_010_0(uniques, 6);
+  f_000_111_101_010_1(uniques, 6);
+  f_000_111_101_011_0(uniques, 6);
+  f_000_111_101_011_1(uniques, 6);
+  f_000_111_101_100_0(uniques, 6);
+  f_000_111_101_100_1(uniques, 6);
+  f_000_111_101_101_0(uniques, 6);
+  f_000_111_101_101_1(uniques, 6);
+  f_000_111_101_110_0(uniques, 6);
+  f_000_111_101_110_1(uniques, 6);
+  f_000_111_101_111_0(uniques, 6);
+  f_000_111_101_111_1(uniques, 6);
+  f_000_111_110_000_0(uniques, 6);
+  f_000_111_110_000_1(uniques, 6);
+  f_000_111_110_001_0(uniques, 6);
+  f_000_111_110_001_1(uniques, 6);
+  f_000_111_110_010_0(uniques, 6);
+  f_000_111_110_010_1(uniques, 6);
+  f_000_111_110_011_0(uniques, 6);
+  f_000_111_110_011_1(uniques, 6);
+  f_000_111_110_100_0(uniques, 6);
+  f_000_111_110_100_1(uniques, 6);
+  f_000_111_110_101_0(uniques, 6);
+  f_000_111_110_101_1(uniques, 6);
+  f_000_111_110_110_0(uniques, 6);
+  f_000_111_110_110_1(uniques, 6);
+  f_000_111_110_111_0(uniques, 6);
+  f_000_111_110_111_1(uniques, 6);
+  f_000_111_111_000_0(uniques, 6);
+  f_000_111_111_000_1(uniques, 6);
+  f_000_111_111_001_0(uniques, 6);
+  f_000_111_111_001_1(uniques, 6);
+  f_000_111_111_010_0(uniques, 6);
+  f_000_111_111_010_1(uniques, 6);
+  f_000_111_111_011_0(uniques, 6);
+  f_000_111_111_011_1(uniques, 6);
+  f_000_111_111_100_0(uniques, 6);
+  f_000_111_111_100_1(uniques, 6);
+  f_000_111_111_101_0(uniques, 6);
+  f_000_111_111_101_1(uniques, 6);
+  f_000_111_111_110_0(uniques, 6);
+  f_000_111_111_110_1(uniques, 6);
+  f_000_111_111_111_0(uniques, 6);
+  f_000_111_111_111_1(uniques, 6);
+  f_001_000_100_000_0(uniques, 6);
+  f_001_000_100_000_1(uniques, 6);
+  f_001_000_100_001_0(uniques, 6);
+  f_001_000_100_001_1(uniques, 6);
+  f_001_000_100_010_0(uniques, 6);
+  f_001_000_100_010_1(uniques, 6);
+  f_001_000_100_011_0(uniques, 6);
+  f_001_000_100_011_1(uniques, 6);
+  f_001_000_100_100_0(uniques, 6);
+  f_001_000_100_100_1(uniques, 6);
+  f_001_000_100_101_0(uniques, 6);
+  f_001_000_100_101_1(uniques, 6);
+  f_001_000_100_110_0(uniques, 6);
+  f_001_000_100_110_1(uniques, 6);
+  f_001_000_100_111_0(uniques, 6);
+  f_001_000_100_111_1(uniques, 6);
+  f_001_000_101_000_0(uniques, 6);
+  f_001_000_101_000_1(uniques, 6);
+  f_001_000_101_001_0(uniques, 6);
+  f_001_000_101_001_1(uniques, 6);
+  f_001_000_101_010_0(uniques, 6);
+  f_001_000_101_010_1(uniques, 6);
+  f_001_000_101_011_0(uniques, 6);
+  f_001_000_101_011_1(uniques, 6);
+  f_001_000_101_100_0(uniques, 6);
+  f_001_000_101_100_1(uniques, 6);
+  f_001_000_101_101_0(uniques, 6);
+  f_001_000_101_101_1(uniques, 6);
+  f_001_000_101_110_0(uniques, 6);
+  f_001_000_101_110_1(uniques, 6);
+  f_001_000_101_111_0(uniques, 6);
+  f_001_000_101_111_1(uniques, 6);
+  f_001_000_110_000_0(uniques, 6);
+  f_001_000_110_000_1(uniques, 6);
+  f_001_000_110_001_0(uniques, 6);
+  f_001_000_110_001_1(uniques, 6);
+  f_001_000_110_010_0(uniques, 6);
+  f_001_000_110_010_1(uniques, 6);
+  f_001_000_110_011_0(uniques, 6);
+  f_001_000_110_011_1(uniques, 6);
+  f_001_000_110_100_0(uniques, 6);
+  f_001_000_110_100_1(uniques, 6);
+  f_001_000_110_101_0(uniques, 6);
+  f_001_000_110_101_1(uniques, 6);
+  f_001_000_110_110_0(uniques, 6);
+  f_001_000_110_110_1(uniques, 6);
+  f_001_000_110_111_0(uniques, 6);
+  f_001_000_110_111_1(uniques, 6);
+  f_001_000_111_000_0(uniques, 6);
+  f_001_000_111_000_1(uniques, 6);
+  f_001_000_111_001_0(uniques, 6);
+  f_001_000_111_001_1(uniques, 6);
+  f_001_000_111_010_0(uniques, 6);
+  f_001_000_111_010_1(uniques, 6);
+  f_001_000_111_011_0(uniques, 6);
+  f_001_000_111_011_1(uniques, 6);
+  f_001_000_111_100_0(uniques, 6);
+  f_001_000_111_100_1(uniques, 6);
+  f_001_000_111_101_0(uniques, 6);
+  f_001_000_111_101_1(uniques, 6);
+  f_001_000_111_110_0(uniques, 6);
+  f_001_000_111_110_1(uniques, 6);
+  f_001_000_111_111_0(uniques, 6);
+  f_001_000_111_111_1(uniques, 6);
+  f_001_001_100_000_0(uniques, 6);
+  f_001_001_100_000_1(uniques, 6);
+  f_001_001_100_001_0(uniques, 6);
+  f_001_001_100_001_1(uniques, 6);
+  f_001_001_100_010_0(uniques, 6);
+  f_001_001_100_010_1(uniques, 6);
+  f_001_001_100_011_0(uniques, 6);
+  f_001_001_100_011_1(uniques, 6);
+  f_001_001_100_100_0(uniques, 6);
+  f_001_001_100_100_1(uniques, 6);
+  f_001_001_100_101_0(uniques, 6);
+  f_001_001_100_101_1(uniques, 6);
+  f_001_001_100_110_0(uniques, 6);
+  f_001_001_100_110_1(uniques, 6);
+  f_001_001_100_111_0(uniques, 6);
+  f_001_001_100_111_1(uniques, 6);
+  f_001_001_101_000_0(uniques, 6);
+  f_001_001_101_000_1(uniques, 6);
+  f_001_001_101_001_0(uniques, 6);
+  f_001_001_101_001_1(uniques, 6);
+  f_001_001_101_010_0(uniques, 6);
+  f_001_001_101_010_1(uniques, 6);
+  f_001_001_101_011_0(uniques, 6);
+  f_001_001_101_011_1(uniques, 6);
+  f_001_001_101_100_0(uniques, 6);
+  f_001_001_101_100_1(uniques, 6);
+  f_001_001_101_101_0(uniques, 6);
+  f_001_001_101_101_1(uniques, 6);
+  f_001_001_101_110_0(uniques, 6);
+  f_001_001_101_110_1(uniques, 6);
+  f_001_001_101_111_0(uniques, 6);
+  f_001_001_101_111_1(uniques, 6);
+  f_001_001_110_000_0(uniques, 6);
+  f_001_001_110_000_1(uniques, 6);
+  f_001_001_110_001_0(uniques, 6);
+  f_001_001_110_001_1(uniques, 6);
+  f_001_001_110_010_0(uniques, 6);
+  f_001_001_110_010_1(uniques, 6);
+  f_001_001_110_011_0(uniques, 6);
+  f_001_001_110_011_1(uniques, 6);
+  f_001_001_110_100_0(uniques, 6);
+  f_001_001_110_100_1(uniques, 6);
+  f_001_001_110_101_0(uniques, 6);
+  f_001_001_110_101_1(uniques, 6);
+  f_001_001_110_110_0(uniques, 6);
+  f_001_001_110_110_1(uniques, 6);
+  f_001_001_110_111_0(uniques, 6);
+  f_001_001_110_111_1(uniques, 6);
+  f_001_001_111_000_0(uniques, 6);
+  f_001_001_111_000_1(uniques, 6);
+  f_001_001_111_001_0(uniques, 6);
+  f_001_001_111_001_1(uniques, 6);
+  f_001_001_111_010_0(uniques, 6);
+  f_001_001_111_010_1(uniques, 6);
+  f_001_001_111_011_0(uniques, 6);
+  f_001_001_111_011_1(uniques, 6);
+  f_001_001_111_100_0(uniques, 6);
+  f_001_001_111_100_1(uniques, 6);
+  f_001_001_111_101_0(uniques, 6);
+  f_001_001_111_101_1(uniques, 6);
+  f_001_001_111_110_0(uniques, 6);
+  f_001_001_111_110_1(uniques, 6);
+  f_001_001_111_111_0(uniques, 6);
+  f_001_001_111_111_1(uniques, 6);
+  f_001_010_100_000_0(uniques, 6);
+  f_001_010_100_000_1(uniques, 6);
+  f_001_010_100_001_0(uniques, 6);
+  f_001_010_100_001_1(uniques, 6);
+  f_001_010_100_010_0(uniques, 6);
+  f_001_010_100_010_1(uniques, 6);
+  f_001_010_100_011_0(uniques, 6);
+  f_001_010_100_011_1(uniques, 6);
+  f_001_010_100_100_0(uniques, 6);
+  f_001_010_100_100_1(uniques, 6);
+  f_001_010_100_101_0(uniques, 6);
+  f_001_010_100_101_1(uniques, 6);
+  f_001_010_100_110_0(uniques, 6);
+  f_001_010_100_110_1(uniques, 6);
+  f_001_010_100_111_0(uniques, 6);
+  f_001_010_100_111_1(uniques, 6);
+  f_001_010_101_000_0(uniques, 6);
+  f_001_010_101_000_1(uniques, 6);
+  f_001_010_101_001_0(uniques, 6);
+  f_001_010_101_001_1(uniques, 6);
+  f_001_010_101_010_0(uniques, 6);
+  f_001_010_101_010_1(uniques, 6);
+  f_001_010_101_011_0(uniques, 6);
+  f_001_010_101_011_1(uniques, 6);
+  f_001_010_101_100_0(uniques, 6);
+  f_001_010_101_100_1(uniques, 6);
+  f_001_010_101_101_0(uniques, 6);
+  f_001_010_101_101_1(uniques, 6);
+  f_001_010_101_110_0(uniques, 6);
+  f_001_010_101_110_1(uniques, 6);
+  f_001_010_101_111_0(uniques, 6);
+  f_001_010_101_111_1(uniques, 6);
+  f_001_010_110_000_0(uniques, 6);
+  f_001_010_110_000_1(uniques, 6);
+  f_001_010_110_001_0(uniques, 6);
+  f_001_010_110_001_1(uniques, 6);
+  f_001_010_110_010_0(uniques, 6);
+  f_001_010_110_010_1(uniques, 6);
+  f_001_010_110_011_0(uniques, 6);
+  f_001_010_110_011_1(uniques, 6);
+  f_001_010_110_100_0(uniques, 6);
+  f_001_010_110_100_1(uniques, 6);
+  f_001_010_110_101_0(uniques, 6);
+  f_001_010_110_101_1(uniques, 6);
+  f_001_010_110_110_0(uniques, 6);
+  f_001_010_110_110_1(uniques, 6);
+  f_001_010_110_111_0(uniques, 6);
+  f_001_010_110_111_1(uniques, 6);
+  f_001_010_111_000_0(uniques, 6);
+  f_001_010_111_000_1(uniques, 6);
+  f_001_010_111_001_0(uniques, 6);
+  f_001_010_111_001_1(uniques, 6);
+  f_001_010_111_010_0(uniques, 6);
+  f_001_010_111_010_1(uniques, 6);
+  f_001_010_111_011_0(uniques, 6);
+  f_001_010_111_011_1(uniques, 6);
+  f_001_010_111_100_0(uniques, 6);
+  f_001_010_111_100_1(uniques, 6);
+  f_001_010_111_101_0(uniques, 6);
+  f_001_010_111_101_1(uniques, 6);
+  f_001_010_111_110_0(uniques, 6);
+  f_001_010_111_110_1(uniques, 6);
+  f_001_010_111_111_0(uniques, 6);
+  f_001_010_111_111_1(uniques, 6);
+  f_001_011_100_000_0(uniques, 6);
+  f_001_011_100_000_1(uniques, 6);
+  f_001_011_100_001_0(uniques, 6);
+  f_001_011_100_001_1(uniques, 6);
+  f_001_011_100_010_0(uniques, 6);
+  f_001_011_100_010_1(uniques, 6);
+  f_001_011_100_011_0(uniques, 6);
+  f_001_011_100_011_1(uniques, 6);
+  f_001_011_100_100_0(uniques, 6);
+  f_001_011_100_100_1(uniques, 6);
+  f_001_011_100_101_0(uniques, 6);
+  f_001_011_100_101_1(uniques, 6);
+  f_001_011_100_110_0(uniques, 6);
+  f_001_011_100_110_1(uniques, 6);
+  f_001_011_100_111_0(uniques, 6);
+  f_001_011_100_111_1(uniques, 6);
+  f_001_011_101_000_0(uniques, 6);
+  f_001_011_101_000_1(uniques, 6);
+  f_001_011_101_001_0(uniques, 6);
+  f_001_011_101_001_1(uniques, 6);
+  f_001_011_101_010_0(uniques, 6);
+  f_001_011_101_010_1(uniques, 6);
+  f_001_011_101_011_0(uniques, 6);
+  f_001_011_101_011_1(uniques, 6);
+  f_001_011_101_100_0(uniques, 6);
+  f_001_011_101_100_1(uniques, 6);
+  f_001_011_101_101_0(uniques, 6);
+  f_001_011_101_101_1(uniques, 6);
+  f_001_011_101_110_0(uniques, 6);
+  f_001_011_101_110_1(uniques, 6);
+  f_001_011_101_111_0(uniques, 6);
+  f_001_011_101_111_1(uniques, 6);
+  f_001_011_110_000_0(uniques, 6);
+  f_001_011_110_000_1(uniques, 6);
+  f_001_011_110_001_0(uniques, 6);
+  f_001_011_110_001_1(uniques, 6);
+  f_001_011_110_010_0(uniques, 6);
+  f_001_011_110_010_1(uniques, 6);
+  f_001_011_110_011_0(uniques, 6);
+  f_001_011_110_011_1(uniques, 6);
+  f_001_011_110_100_0(uniques, 6);
+  f_001_011_110_100_1(uniques, 6);
+  f_001_011_110_101_0(uniques, 6);
+  f_001_011_110_101_1(uniques, 6);
+  f_001_011_110_110_0(uniques, 6);
+  f_001_011_110_110_1(uniques, 6);
+  f_001_011_110_111_0(uniques, 6);
+  f_001_011_110_111_1(uniques, 6);
+  f_001_011_111_000_0(uniques, 6);
+  f_001_011_111_000_1(uniques, 6);
+  f_001_011_111_001_0(uniques, 6);
+  f_001_011_111_001_1(uniques, 6);
+  f_001_011_111_010_0(uniques, 6);
+  f_001_011_111_010_1(uniques, 6);
+  f_001_011_111_011_0(uniques, 6);
+  f_001_011_111_011_1(uniques, 6);
+  f_001_011_111_100_0(uniques, 6);
+  f_001_011_111_100_1(uniques, 6);
+  f_001_011_111_101_0(uniques, 6);
+  f_001_011_111_101_1(uniques, 6);
+  f_001_011_111_110_0(uniques, 6);
+  f_001_011_111_110_1(uniques, 6);
+  f_001_011_111_111_0(uniques, 6);
+  f_001_011_111_111_1(uniques, 6);
+  f_001_100_100_000_0(uniques, 6);
+  f_001_100_100_000_1(uniques, 6);
+  f_001_100_100_001_0(uniques, 6);
+  f_001_100_100_001_1(uniques, 6);
+  f_001_100_100_010_0(uniques, 6);
+  f_001_100_100_010_1(uniques, 6);
+  f_001_100_100_011_0(uniques, 6);
+  f_001_100_100_011_1(uniques, 6);
+  f_001_100_100_100_0(uniques, 6);
+  f_001_100_100_100_1(uniques, 6);
+  f_001_100_100_101_0(uniques, 6);
+  f_001_100_100_101_1(uniques, 6);
+  f_001_100_100_110_0(uniques, 6);
+  f_001_100_100_110_1(uniques, 6);
+  f_001_100_100_111_0(uniques, 6);
+  f_001_100_100_111_1(uniques, 6);
+  f_001_100_101_000_0(uniques, 6);
+  f_001_100_101_000_1(uniques, 6);
+  f_001_100_101_001_0(uniques, 6);
+  f_001_100_101_001_1(uniques, 6);
+  f_001_100_101_010_0(uniques, 6);
+  f_001_100_101_010_1(uniques, 6);
+  f_001_100_101_011_0(uniques, 6);
+  f_001_100_101_011_1(uniques, 6);
+  f_001_100_101_100_0(uniques, 6);
+  f_001_100_101_100_1(uniques, 6);
+  f_001_100_101_101_0(uniques, 6);
+  f_001_100_101_101_1(uniques, 6);
+  f_001_100_101_110_0(uniques, 6);
+  f_001_100_101_110_1(uniques, 6);
+  f_001_100_101_111_0(uniques, 6);
+  f_001_100_101_111_1(uniques, 6);
+  f_001_100_110_000_0(uniques, 6);
+  f_001_100_110_000_1(uniques, 6);
+  f_001_100_110_001_0(uniques, 6);
+  f_001_100_110_001_1(uniques, 6);
+  f_001_100_110_010_0(uniques, 6);
+  f_001_100_110_010_1(uniques, 6);
+  f_001_100_110_011_0(uniques, 6);
+  f_001_100_110_011_1(uniques, 6);
+  f_001_100_110_100_0(uniques, 6);
+  f_001_100_110_100_1(uniques, 6);
+  f_001_100_110_101_0(uniques, 6);
+  f_001_100_110_101_1(uniques, 6);
+  f_001_100_110_110_0(uniques, 6);
+  f_001_100_110_110_1(uniques, 6);
+  f_001_100_110_111_0(uniques, 6);
+  f_001_100_110_111_1(uniques, 6);
+  f_001_100_111_000_0(uniques, 6);
+  f_001_100_111_000_1(uniques, 6);
+  f_001_100_111_001_0(uniques, 6);
+  f_001_100_111_001_1(uniques, 6);
+  f_001_100_111_010_0(uniques, 6);
+  f_001_100_111_010_1(uniques, 6);
+  f_001_100_111_011_0(uniques, 6);
+  f_001_100_111_011_1(uniques, 6);
+  f_001_100_111_100_0(uniques, 6);
+  f_001_100_111_100_1(uniques, 6);
+  f_001_100_111_101_0(uniques, 6);
+  f_001_100_111_101_1(uniques, 6);
+  f_001_100_111_110_0(uniques, 6);
+  f_001_100_111_110_1(uniques, 6);
+  f_001_100_111_111_0(uniques, 6);
+  f_001_100_111_111_1(uniques, 6);
+  f_001_101_100_000_0(uniques, 6);
+  f_001_101_100_000_1(uniques, 6);
+  f_001_101_100_001_0(uniques, 6);
+  f_001_101_100_001_1(uniques, 6);
+  f_001_101_100_010_0(uniques, 6);
+  f_001_101_100_010_1(uniques, 6);
+  f_001_101_100_011_0(uniques, 6);
+  f_001_101_100_011_1(uniques, 6);
+  f_001_101_100_100_0(uniques, 6);
+  f_001_101_100_100_1(uniques, 6);
+  f_001_101_100_101_0(uniques, 6);
+  f_001_101_100_101_1(uniques, 6);
+  f_001_101_100_110_0(uniques, 6);
+  f_001_101_100_110_1(uniques, 6);
+  f_001_101_100_111_0(uniques, 6);
+  f_001_101_100_111_1(uniques, 6);
+  f_001_101_101_000_0(uniques, 6);
+  f_001_101_101_000_1(uniques, 6);
+  f_001_101_101_001_0(uniques, 6);
+  f_001_101_101_001_1(uniques, 6);
+  f_001_101_101_010_0(uniques, 6);
+  f_001_101_101_010_1(uniques, 6);
+  f_001_101_101_011_0(uniques, 6);
+  f_001_101_101_011_1(uniques, 6);
+  f_001_101_101_100_0(uniques, 6);
+  f_001_101_101_100_1(uniques, 6);
+  f_001_101_101_101_0(uniques, 6);
+  f_001_101_101_101_1(uniques, 6);
+  f_001_101_101_110_0(uniques, 6);
+  f_001_101_101_110_1(uniques, 6);
+  f_001_101_101_111_0(uniques, 6);
+  f_001_101_101_111_1(uniques, 6);
+  f_001_101_110_000_0(uniques, 6);
+  f_001_101_110_000_1(uniques, 6);
+  f_001_101_110_001_0(uniques, 6);
+  f_001_101_110_001_1(uniques, 6);
+  f_001_101_110_010_0(uniques, 6);
+  f_001_101_110_010_1(uniques, 6);
+  f_001_101_110_011_0(uniques, 6);
+  f_001_101_110_011_1(uniques, 6);
+  f_001_101_110_100_0(uniques, 6);
+  f_001_101_110_100_1(uniques, 6);
+  f_001_101_110_101_0(uniques, 6);
+  f_001_101_110_101_1(uniques, 6);
+  f_001_101_110_110_0(uniques, 6);
+  f_001_101_110_110_1(uniques, 6);
+  f_001_101_110_111_0(uniques, 6);
+  f_001_101_110_111_1(uniques, 6);
+  f_001_101_111_000_0(uniques, 6);
+  f_001_101_111_000_1(uniques, 6);
+  f_001_101_111_001_0(uniques, 6);
+  f_001_101_111_001_1(uniques, 6);
+  f_001_101_111_010_0(uniques, 6);
+  f_001_101_111_010_1(uniques, 6);
+  f_001_101_111_011_0(uniques, 6);
+  f_001_101_111_011_1(uniques, 6);
+  f_001_101_111_100_0(uniques, 6);
+  f_001_101_111_100_1(uniques, 6);
+  f_001_101_111_101_0(uniques, 6);
+  f_001_101_111_101_1(uniques, 6);
+  f_001_101_111_110_0(uniques, 6);
+  f_001_101_111_110_1(uniques, 6);
+  f_001_101_111_111_0(uniques, 6);
+  f_001_101_111_111_1(uniques, 6);
+  f_001_110_100_000_0(uniques, 6);
+  f_001_110_100_000_1(uniques, 6);
+  f_001_110_100_001_0(uniques, 6);
+  f_001_110_100_001_1(uniques, 6);
+  f_001_110_100_010_0(uniques, 6);
+  f_001_110_100_010_1(uniques, 6);
+  f_001_110_100_011_0(uniques, 6);
+  f_001_110_100_011_1(uniques, 6);
+  f_001_110_100_100_0(uniques, 6);
+  f_001_110_100_100_1(uniques, 6);
+  f_001_110_100_101_0(uniques, 6);
+  f_001_110_100_101_1(uniques, 6);
+  f_001_110_100_110_0(uniques, 6);
+  f_001_110_100_110_1(uniques, 6);
+  f_001_110_100_111_0(uniques, 6);
+  f_001_110_100_111_1(uniques, 6);
+  f_001_110_101_000_0(uniques, 6);
+  f_001_110_101_000_1(uniques, 6);
+  f_001_110_101_001_0(uniques, 6);
+  f_001_110_101_001_1(uniques, 6);
+  f_001_110_101_010_0(uniques, 6);
+  f_001_110_101_010_1(uniques, 6);
+  f_001_110_101_011_0(uniques, 6);
+  f_001_110_101_011_1(uniques, 6);
+  f_001_110_101_100_0(uniques, 6);
+  f_001_110_101_100_1(uniques, 6);
+  f_001_110_101_101_0(uniques, 6);
+  f_001_110_101_101_1(uniques, 6);
+  f_001_110_101_110_0(uniques, 6);
+  f_001_110_101_110_1(uniques, 6);
+  f_001_110_101_111_0(uniques, 6);
+  f_001_110_101_111_1(uniques, 6);
+  f_001_110_110_000_0(uniques, 6);
+  f_001_110_110_000_1(uniques, 6);
+  f_001_110_110_001_0(uniques, 6);
+  f_001_110_110_001_1(uniques, 6);
+  f_001_110_110_010_0(uniques, 6);
+  f_001_110_110_010_1(uniques, 6);
+  f_001_110_110_011_0(uniques, 6);
+  f_001_110_110_011_1(uniques, 6);
+  f_001_110_110_100_0(uniques, 6);
+  f_001_110_110_100_1(uniques, 6);
+  f_001_110_110_101_0(uniques, 6);
+  f_001_110_110_101_1(uniques, 6);
+  f_001_110_110_110_0(uniques, 6);
+  f_001_110_110_110_1(uniques, 6);
+  f_001_110_110_111_0(uniques, 6);
+  f_001_110_110_111_1(uniques, 6);
+  f_001_110_111_000_0(uniques, 6);
+  f_001_110_111_000_1(uniques, 6);
+  f_001_110_111_001_0(uniques, 6);
+  f_001_110_111_001_1(uniques, 6);
+  f_001_110_111_010_0(uniques, 6);
+  f_001_110_111_010_1(uniques, 6);
+  f_001_110_111_011_0(uniques, 6);
+  f_001_110_111_011_1(uniques, 6);
+  f_001_110_111_100_0(uniques, 6);
+  f_001_110_111_100_1(uniques, 6);
+  f_001_110_111_101_0(uniques, 6);
+  f_001_110_111_101_1(uniques, 6);
+  f_001_110_111_110_0(uniques, 6);
+  f_001_110_111_110_1(uniques, 6);
+  f_001_110_111_111_0(uniques, 6);
+  f_001_110_111_111_1(uniques, 6);
+  f_001_111_100_000_0(uniques, 6);
+  f_001_111_100_000_1(uniques, 6);
+  f_001_111_100_001_0(uniques, 6);
+  f_001_111_100_001_1(uniques, 6);
+  f_001_111_100_010_0(uniques, 6);
+  f_001_111_100_010_1(uniques, 6);
+  f_001_111_100_011_0(uniques, 6);
+  f_001_111_100_011_1(uniques, 6);
+  f_001_111_100_100_0(uniques, 6);
+  f_001_111_100_100_1(uniques, 6);
+  f_001_111_100_101_0(uniques, 6);
+  f_001_111_100_101_1(uniques, 6);
+  f_001_111_100_110_0(uniques, 6);
+  f_001_111_100_110_1(uniques, 6);
+  f_001_111_100_111_0(uniques, 6);
+  f_001_111_100_111_1(uniques, 6);
+  f_001_111_101_000_0(uniques, 6);
+  f_001_111_101_000_1(uniques, 6);
+  f_001_111_101_001_0(uniques, 6);
+  f_001_111_101_001_1(uniques, 6);
+  f_001_111_101_010_0(uniques, 6);
+  f_001_111_101_010_1(uniques, 6);
+  f_001_111_101_011_0(uniques, 6);
+  f_001_111_101_011_1(uniques, 6);
+  f_001_111_101_100_0(uniques, 6);
+  f_001_111_101_100_1(uniques, 6);
+  f_001_111_101_101_0(uniques, 6);
+  f_001_111_101_101_1(uniques, 6);
+  f_001_111_101_110_0(uniques, 6);
+  f_001_111_101_110_1(uniques, 6);
+  f_001_111_101_111_0(uniques, 6);
+  f_001_111_101_111_1(uniques, 6);
+  f_001_111_110_000_0(uniques, 6);
+  f_001_111_110_000_1(uniques, 6);
+  f_001_111_110_001_0(uniques, 6);
+  f_001_111_110_001_1(uniques, 6);
+  f_001_111_110_010_0(uniques, 6);
+  f_001_111_110_010_1(uniques, 6);
+  f_001_111_110_011_0(uniques, 6);
+  f_001_111_110_011_1(uniques, 6);
+  f_001_111_110_100_0(uniques, 6);
+  f_001_111_110_100_1(uniques, 6);
+  f_001_111_110_101_0(uniques, 6);
+  f_001_111_110_101_1(uniques, 6);
+  f_001_111_110_110_0(uniques, 6);
+  f_001_111_110_110_1(uniques, 6);
+  f_001_111_110_111_0(uniques, 6);
+  f_001_111_110_111_1(uniques, 6);
+  f_001_111_111_000_0(uniques, 6);
+  f_001_111_111_000_1(uniques, 6);
+  f_001_111_111_001_0(uniques, 6);
+  f_001_111_111_001_1(uniques, 6);
+  f_001_111_111_010_0(uniques, 6);
+  f_001_111_111_010_1(uniques, 6);
+  f_001_111_111_011_0(uniques, 6);
+  f_001_111_111_011_1(uniques, 6);
+  f_001_111_111_100_0(uniques, 6);
+  f_001_111_111_100_1(uniques, 6);
+  f_001_111_111_101_0(uniques, 6);
+  f_001_111_111_101_1(uniques, 6);
+  f_001_111_111_110_0(uniques, 6);
+  f_001_111_111_110_1(uniques, 6);
+  f_001_111_111_111_0(uniques, 6);
+  f_001_111_111_111_1(uniques, 6);
+  f_010_000_100_000_0(uniques, 6);
+  f_010_000_100_000_1(uniques, 6);
+  f_010_000_100_001_0(uniques, 6);
+  f_010_000_100_001_1(uniques, 6);
+  f_010_000_100_010_0(uniques, 6);
+  f_010_000_100_010_1(uniques, 6);
+  f_010_000_100_011_0(uniques, 6);
+  f_010_000_100_011_1(uniques, 6);
+  f_010_000_100_100_0(uniques, 6);
+  f_010_000_100_100_1(uniques, 6);
+  f_010_000_100_101_0(uniques, 6);
+  f_010_000_100_101_1(uniques, 6);
+  f_010_000_100_110_0(uniques, 6);
+  f_010_000_100_110_1(uniques, 6);
+  f_010_000_100_111_0(uniques, 6);
+  f_010_000_100_111_1(uniques, 6);
+  f_010_000_101_000_0(uniques, 6);
+  f_010_000_101_000_1(uniques, 6);
+  f_010_000_101_001_0(uniques, 6);
+  f_010_000_101_001_1(uniques, 6);
+  f_010_000_101_010_0(uniques, 6);
+  f_010_000_101_010_1(uniques, 6);
+  f_010_000_101_011_0(uniques, 6);
+  f_010_000_101_011_1(uniques, 6);
+  f_010_000_101_100_0(uniques, 6);
+  f_010_000_101_100_1(uniques, 6);
+  f_010_000_101_101_0(uniques, 6);
+  f_010_000_101_101_1(uniques, 6);
+  f_010_000_101_110_0(uniques, 6);
+  f_010_000_101_110_1(uniques, 6);
+  f_010_000_101_111_0(uniques, 6);
+  f_010_000_101_111_1(uniques, 6);
+  f_010_000_110_000_0(uniques, 6);
+  f_010_000_110_000_1(uniques, 6);
+  f_010_000_110_001_0(uniques, 6);
+  f_010_000_110_001_1(uniques, 6);
+  f_010_000_110_010_0(uniques, 6);
+  f_010_000_110_010_1(uniques, 6);
+  f_010_000_110_011_0(uniques, 6);
+  f_010_000_110_011_1(uniques, 6);
+  f_010_000_110_100_0(uniques, 6);
+  f_010_000_110_100_1(uniques, 6);
+  f_010_000_110_101_0(uniques, 6);
+  f_010_000_110_101_1(uniques, 6);
+  f_010_000_110_110_0(uniques, 6);
+  f_010_000_110_110_1(uniques, 6);
+  f_010_000_110_111_0(uniques, 6);
+  f_010_000_110_111_1(uniques, 6);
+  f_010_000_111_000_0(uniques, 6);
+  f_010_000_111_000_1(uniques, 6);
+  f_010_000_111_001_0(uniques, 6);
+  f_010_000_111_001_1(uniques, 6);
+  f_010_000_111_010_0(uniques, 6);
+  f_010_000_111_010_1(uniques, 6);
+  f_010_000_111_011_0(uniques, 6);
+  f_010_000_111_011_1(uniques, 6);
+  f_010_000_111_100_0(uniques, 6);
+  f_010_000_111_100_1(uniques, 6);
+  f_010_000_111_101_0(uniques, 6);
+  f_010_000_111_101_1(uniques, 6);
+  f_010_000_111_110_0(uniques, 6);
+  f_010_000_111_110_1(uniques, 6);
+  f_010_000_111_111_0(uniques, 6);
+  f_010_000_111_111_1(uniques, 6);
+  f_010_001_100_000_0(uniques, 6);
+  f_010_001_100_000_1(uniques, 6);
+  f_010_001_100_001_0(uniques, 6);
+  f_010_001_100_001_1(uniques, 6);
+  f_010_001_100_010_0(uniques, 6);
+  f_010_001_100_010_1(uniques, 6);
+  f_010_001_100_011_0(uniques, 6);
+  f_010_001_100_011_1(uniques, 6);
+  f_010_001_100_100_0(uniques, 6);
+  f_010_001_100_100_1(uniques, 6);
+  f_010_001_100_101_0(uniques, 6);
+  f_010_001_100_101_1(uniques, 6);
+  f_010_001_100_110_0(uniques, 6);
+  f_010_001_100_110_1(uniques, 6);
+  f_010_001_100_111_0(uniques, 6);
+  f_010_001_100_111_1(uniques, 6);
+  f_010_001_101_000_0(uniques, 6);
+  f_010_001_101_000_1(uniques, 6);
+  f_010_001_101_001_0(uniques, 6);
+  f_010_001_101_001_1(uniques, 6);
+  f_010_001_101_010_0(uniques, 6);
+  f_010_001_101_010_1(uniques, 6);
+  f_010_001_101_011_0(uniques, 6);
+  f_010_001_101_011_1(uniques, 6);
+  f_010_001_101_100_0(uniques, 6);
+  f_010_001_101_100_1(uniques, 6);
+  f_010_001_101_101_0(uniques, 6);
+  f_010_001_101_101_1(uniques, 6);
+  f_010_001_101_110_0(uniques, 6);
+  f_010_001_101_110_1(uniques, 6);
+  f_010_001_101_111_0(uniques, 6);
+  f_010_001_101_111_1(uniques, 6);
+  f_010_001_110_000_0(uniques, 6);
+  f_010_001_110_000_1(uniques, 6);
+  f_010_001_110_001_0(uniques, 6);
+  f_010_001_110_001_1(uniques, 6);
+  f_010_001_110_010_0(uniques, 6);
+  f_010_001_110_010_1(uniques, 6);
+  f_010_001_110_011_0(uniques, 6);
+  f_010_001_110_011_1(uniques, 6);
+  f_010_001_110_100_0(uniques, 6);
+  f_010_001_110_100_1(uniques, 6);
+  f_010_001_110_101_0(uniques, 6);
+  f_010_001_110_101_1(uniques, 6);
+  f_010_001_110_110_0(uniques, 6);
+  f_010_001_110_110_1(uniques, 6);
+  f_010_001_110_111_0(uniques, 6);
+  f_010_001_110_111_1(uniques, 6);
+  f_010_001_111_000_0(uniques, 6);
+  f_010_001_111_000_1(uniques, 6);
+  f_010_001_111_001_0(uniques, 6);
+  f_010_001_111_001_1(uniques, 6);
+  f_010_001_111_010_0(uniques, 6);
+  f_010_001_111_010_1(uniques, 6);
+  f_010_001_111_011_0(uniques, 6);
+  f_010_001_111_011_1(uniques, 6);
+  f_010_001_111_100_0(uniques, 6);
+  f_010_001_111_100_1(uniques, 6);
+  f_010_001_111_101_0(uniques, 6);
+  f_010_001_111_101_1(uniques, 6);
+  f_010_001_111_110_0(uniques, 6);
+  f_010_001_111_110_1(uniques, 6);
+  f_010_001_111_111_0(uniques, 6);
+  f_010_001_111_111_1(uniques, 6);
+  f_010_010_100_000_0(uniques, 6);
+  f_010_010_100_000_1(uniques, 6);
+  f_010_010_100_001_0(uniques, 6);
+  f_010_010_100_001_1(uniques, 6);
+  f_010_010_100_010_0(uniques, 6);
+  f_010_010_100_010_1(uniques, 6);
+  f_010_010_100_011_0(uniques, 6);
+  f_010_010_100_011_1(uniques, 6);
+  f_010_010_100_100_0(uniques, 6);
+  f_010_010_100_100_1(uniques, 6);
+  f_010_010_100_101_0(uniques, 6);
+  f_010_010_100_101_1(uniques, 6);
+  f_010_010_100_110_0(uniques, 6);
+  f_010_010_100_110_1(uniques, 6);
+  f_010_010_100_111_0(uniques, 6);
+  f_010_010_100_111_1(uniques, 6);
+  f_010_010_101_000_0(uniques, 6);
+  f_010_010_101_000_1(uniques, 6);
+  f_010_010_101_001_0(uniques, 6);
+  f_010_010_101_001_1(uniques, 6);
+  f_010_010_101_010_0(uniques, 6);
+  f_010_010_101_010_1(uniques, 6);
+  f_010_010_101_011_0(uniques, 6);
+  f_010_010_101_011_1(uniques, 6);
+  f_010_010_101_100_0(uniques, 6);
+  f_010_010_101_100_1(uniques, 6);
+  f_010_010_101_101_0(uniques, 6);
+  f_010_010_101_101_1(uniques, 6);
+  f_010_010_101_110_0(uniques, 6);
+  f_010_010_101_110_1(uniques, 6);
+  f_010_010_101_111_0(uniques, 6);
+  f_010_010_101_111_1(uniques, 6);
+  f_010_010_110_000_0(uniques, 6);
+  f_010_010_110_000_1(uniques, 6);
+  f_010_010_110_001_0(uniques, 6);
+  f_010_010_110_001_1(uniques, 6);
+  f_010_010_110_010_0(uniques, 6);
+  f_010_010_110_010_1(uniques, 6);
+  f_010_010_110_011_0(uniques, 6);
+  f_010_010_110_011_1(uniques, 6);
+  f_010_010_110_100_0(uniques, 6);
+  f_010_010_110_100_1(uniques, 6);
+  f_010_010_110_101_0(uniques, 6);
+  f_010_010_110_101_1(uniques, 6);
+  f_010_010_110_110_0(uniques, 6);
+  f_010_010_110_110_1(uniques, 6);
+  f_010_010_110_111_0(uniques, 6);
+  f_010_010_110_111_1(uniques, 6);
+  f_010_010_111_000_0(uniques, 6);
+  f_010_010_111_000_1(uniques, 6);
+  f_010_010_111_001_0(uniques, 6);
+  f_010_010_111_001_1(uniques, 6);
+  f_010_010_111_010_0(uniques, 6);
+  f_010_010_111_010_1(uniques, 6);
+  f_010_010_111_011_0(uniques, 6);
+  f_010_010_111_011_1(uniques, 6);
+  f_010_010_111_100_0(uniques, 6);
+  f_010_010_111_100_1(uniques, 6);
+  f_010_010_111_101_0(uniques, 6);
+  f_010_010_111_101_1(uniques, 6);
+  f_010_010_111_110_0(uniques, 6);
+  f_010_010_111_110_1(uniques, 6);
+  f_010_010_111_111_0(uniques, 6);
+  f_010_010_111_111_1(uniques, 6);
+  f_010_011_100_000_0(uniques, 6);
+  f_010_011_100_000_1(uniques, 6);
+  f_010_011_100_001_0(uniques, 6);
+  f_010_011_100_001_1(uniques, 6);
+  f_010_011_100_010_0(uniques, 6);
+  f_010_011_100_010_1(uniques, 6);
+  f_010_011_100_011_0(uniques, 6);
+  f_010_011_100_011_1(uniques, 6);
+  f_010_011_100_100_0(uniques, 6);
+  f_010_011_100_100_1(uniques, 6);
+  f_010_011_100_101_0(uniques, 6);
+  f_010_011_100_101_1(uniques, 6);
+  f_010_011_100_110_0(uniques, 6);
+  f_010_011_100_110_1(uniques, 6);
+  f_010_011_100_111_0(uniques, 6);
+  f_010_011_100_111_1(uniques, 6);
+  f_010_011_101_000_0(uniques, 6);
+  f_010_011_101_000_1(uniques, 6);
+  f_010_011_101_001_0(uniques, 6);
+  f_010_011_101_001_1(uniques, 6);
+  f_010_011_101_010_0(uniques, 6);
+  f_010_011_101_010_1(uniques, 6);
+  f_010_011_101_011_0(uniques, 6);
+  f_010_011_101_011_1(uniques, 6);
+  f_010_011_101_100_0(uniques, 6);
+  f_010_011_101_100_1(uniques, 6);
+  f_010_011_101_101_0(uniques, 6);
+  f_010_011_101_101_1(uniques, 6);
+  f_010_011_101_110_0(uniques, 6);
+  f_010_011_101_110_1(uniques, 6);
+  f_010_011_101_111_0(uniques, 6);
+  f_010_011_101_111_1(uniques, 6);
+  f_010_011_110_000_0(uniques, 6);
+  f_010_011_110_000_1(uniques, 6);
+  f_010_011_110_001_0(uniques, 6);
+  f_010_011_110_001_1(uniques, 6);
+  f_010_011_110_010_0(uniques, 6);
+  f_010_011_110_010_1(uniques, 6);
+  f_010_011_110_011_0(uniques, 6);
+  f_010_011_110_011_1(uniques, 6);
+  f_010_011_110_100_0(uniques, 6);
+  f_010_011_110_100_1(uniques, 6);
+  f_010_011_110_101_0(uniques, 6);
+  f_010_011_110_101_1(uniques, 6);
+  f_010_011_110_110_0(uniques, 6);
+  f_010_011_110_110_1(uniques, 6);
+  f_010_011_110_111_0(uniques, 6);
+  f_010_011_110_111_1(uniques, 6);
+  f_010_011_111_000_0(uniques, 6);
+  f_010_011_111_000_1(uniques, 6);
+  f_010_011_111_001_0(uniques, 6);
+  f_010_011_111_001_1(uniques, 6);
+  f_010_011_111_010_0(uniques, 6);
+  f_010_011_111_010_1(uniques, 6);
+  f_010_011_111_011_0(uniques, 6);
+  f_010_011_111_011_1(uniques, 6);
+  f_010_011_111_100_0(uniques, 6);
+  f_010_011_111_100_1(uniques, 6);
+  f_010_011_111_101_0(uniques, 6);
+  f_010_011_111_101_1(uniques, 6);
+  f_010_011_111_110_0(uniques, 6);
+  f_010_011_111_110_1(uniques, 6);
+  f_010_011_111_111_0(uniques, 6);
+  f_010_011_111_111_1(uniques, 6);
+  f_010_100_100_000_0(uniques, 6);
+  f_010_100_100_000_1(uniques, 6);
+  f_010_100_100_001_0(uniques, 6);
+  f_010_100_100_001_1(uniques, 6);
+  f_010_100_100_010_0(uniques, 6);
+  f_010_100_100_010_1(uniques, 6);
+  f_010_100_100_011_0(uniques, 6);
+  f_010_100_100_011_1(uniques, 6);
+  f_010_100_100_100_0(uniques, 6);
+  f_010_100_100_100_1(uniques, 6);
+  f_010_100_100_101_0(uniques, 6);
+  f_010_100_100_101_1(uniques, 6);
+  f_010_100_100_110_0(uniques, 6);
+  f_010_100_100_110_1(uniques, 6);
+  f_010_100_100_111_0(uniques, 6);
+  f_010_100_100_111_1(uniques, 6);
+  f_010_100_101_000_0(uniques, 6);
+  f_010_100_101_000_1(uniques, 6);
+  f_010_100_101_001_0(uniques, 6);
+  f_010_100_101_001_1(uniques, 6);
+  f_010_100_101_010_0(uniques, 6);
+  f_010_100_101_010_1(uniques, 6);
+  f_010_100_101_011_0(uniques, 6);
+  f_010_100_101_011_1(uniques, 6);
+  f_010_100_101_100_0(uniques, 6);
+  f_010_100_101_100_1(uniques, 6);
+  f_010_100_101_101_0(uniques, 6);
+  f_010_100_101_101_1(uniques, 6);
+  f_010_100_101_110_0(uniques, 6);
+  f_010_100_101_110_1(uniques, 6);
+  f_010_100_101_111_0(uniques, 6);
+  f_010_100_101_111_1(uniques, 6);
+  f_010_100_110_000_0(uniques, 6);
+  f_010_100_110_000_1(uniques, 6);
+  f_010_100_110_001_0(uniques, 6);
+  f_010_100_110_001_1(uniques, 6);
+  f_010_100_110_010_0(uniques, 6);
+  f_010_100_110_010_1(uniques, 6);
+  f_010_100_110_011_0(uniques, 6);
+  f_010_100_110_011_1(uniques, 6);
+  f_010_100_110_100_0(uniques, 6);
+  f_010_100_110_100_1(uniques, 6);
+  f_010_100_110_101_0(uniques, 6);
+  f_010_100_110_101_1(uniques, 6);
+  f_010_100_110_110_0(uniques, 6);
+  f_010_100_110_110_1(uniques, 6);
+  f_010_100_110_111_0(uniques, 6);
+  f_010_100_110_111_1(uniques, 6);
+  f_010_100_111_000_0(uniques, 6);
+  f_010_100_111_000_1(uniques, 6);
+  f_010_100_111_001_0(uniques, 6);
+  f_010_100_111_001_1(uniques, 6);
+  f_010_100_111_010_0(uniques, 6);
+  f_010_100_111_010_1(uniques, 6);
+  f_010_100_111_011_0(uniques, 6);
+  f_010_100_111_011_1(uniques, 6);
+  f_010_100_111_100_0(uniques, 6);
+  f_010_100_111_100_1(uniques, 6);
+  f_010_100_111_101_0(uniques, 6);
+  f_010_100_111_101_1(uniques, 6);
+  f_010_100_111_110_0(uniques, 6);
+  f_010_100_111_110_1(uniques, 6);
+  f_010_100_111_111_0(uniques, 6);
+  f_010_100_111_111_1(uniques, 6);
+  f_010_101_100_000_0(uniques, 6);
+  f_010_101_100_000_1(uniques, 6);
+  f_010_101_100_001_0(uniques, 6);
+  f_010_101_100_001_1(uniques, 6);
+  f_010_101_100_010_0(uniques, 6);
+  f_010_101_100_010_1(uniques, 6);
+  f_010_101_100_011_0(uniques, 6);
+  f_010_101_100_011_1(uniques, 6);
+  f_010_101_100_100_0(uniques, 6);
+  f_010_101_100_100_1(uniques, 6);
+  f_010_101_100_101_0(uniques, 6);
+  f_010_101_100_101_1(uniques, 6);
+  f_010_101_100_110_0(uniques, 6);
+  f_010_101_100_110_1(uniques, 6);
+  f_010_101_100_111_0(uniques, 6);
+  f_010_101_100_111_1(uniques, 6);
+  f_010_101_101_000_0(uniques, 6);
+  f_010_101_101_000_1(uniques, 6);
+  f_010_101_101_001_0(uniques, 6);
+  f_010_101_101_001_1(uniques, 6);
+  f_010_101_101_010_0(uniques, 6);
+  f_010_101_101_010_1(uniques, 6);
+  f_010_101_101_011_0(uniques, 6);
+  f_010_101_101_011_1(uniques, 6);
+  f_010_101_101_100_0(uniques, 6);
+  f_010_101_101_100_1(uniques, 6);
+  f_010_101_101_101_0(uniques, 6);
+  f_010_101_101_101_1(uniques, 6);
+  f_010_101_101_110_0(uniques, 6);
+  f_010_101_101_110_1(uniques, 6);
+  f_010_101_101_111_0(uniques, 6);
+  f_010_101_101_111_1(uniques, 6);
+  f_010_101_110_000_0(uniques, 6);
+  f_010_101_110_000_1(uniques, 6);
+  f_010_101_110_001_0(uniques, 6);
+  f_010_101_110_001_1(uniques, 6);
+  f_010_101_110_010_0(uniques, 6);
+  f_010_101_110_010_1(uniques, 6);
+  f_010_101_110_011_0(uniques, 6);
+  f_010_101_110_011_1(uniques, 6);
+  f_010_101_110_100_0(uniques, 6);
+  f_010_101_110_100_1(uniques, 6);
+  f_010_101_110_101_0(uniques, 6);
+  f_010_101_110_101_1(uniques, 6);
+  f_010_101_110_110_0(uniques, 6);
+  f_010_101_110_110_1(uniques, 6);
+  f_010_101_110_111_0(uniques, 6);
+  f_010_101_110_111_1(uniques, 6);
+  f_010_101_111_000_0(uniques, 6);
+  f_010_101_111_000_1(uniques, 6);
+  f_010_101_111_001_0(uniques, 6);
+  f_010_101_111_001_1(uniques, 6);
+  f_010_101_111_010_0(uniques, 6);
+  f_010_101_111_010_1(uniques, 6);
+  f_010_101_111_011_0(uniques, 6);
+  f_010_101_111_011_1(uniques, 6);
+  f_010_101_111_100_0(uniques, 6);
+  f_010_101_111_100_1(uniques, 6);
+  f_010_101_111_101_0(uniques, 6);
+  f_010_101_111_101_1(uniques, 6);
+  f_010_101_111_110_0(uniques, 6);
+  f_010_101_111_110_1(uniques, 6);
+  f_010_101_111_111_0(uniques, 6);
+  f_010_101_111_111_1(uniques, 6);
+  f_010_110_100_000_0(uniques, 6);
+  f_010_110_100_000_1(uniques, 6);
+  f_010_110_100_001_0(uniques, 6);
+  f_010_110_100_001_1(uniques, 6);
+  f_010_110_100_010_0(uniques, 6);
+  f_010_110_100_010_1(uniques, 6);
+  f_010_110_100_011_0(uniques, 6);
+  f_010_110_100_011_1(uniques, 6);
+  f_010_110_100_100_0(uniques, 6);
+  f_010_110_100_100_1(uniques, 6);
+  f_010_110_100_101_0(uniques, 6);
+  f_010_110_100_101_1(uniques, 6);
+  f_010_110_100_110_0(uniques, 6);
+  f_010_110_100_110_1(uniques, 6);
+  f_010_110_100_111_0(uniques, 6);
+  f_010_110_100_111_1(uniques, 6);
+  f_010_110_101_000_0(uniques, 6);
+  f_010_110_101_000_1(uniques, 6);
+  f_010_110_101_001_0(uniques, 6);
+  f_010_110_101_001_1(uniques, 6);
+  f_010_110_101_010_0(uniques, 6);
+  f_010_110_101_010_1(uniques, 6);
+  f_010_110_101_011_0(uniques, 6);
+  f_010_110_101_011_1(uniques, 6);
+  f_010_110_101_100_0(uniques, 6);
+  f_010_110_101_100_1(uniques, 6);
+  f_010_110_101_101_0(uniques, 6);
+  f_010_110_101_101_1(uniques, 6);
+  f_010_110_101_110_0(uniques, 6);
+  f_010_110_101_110_1(uniques, 6);
+  f_010_110_101_111_0(uniques, 6);
+  f_010_110_101_111_1(uniques, 6);
+  f_010_110_110_000_0(uniques, 6);
+  f_010_110_110_000_1(uniques, 6);
+  f_010_110_110_001_0(uniques, 6);
+  f_010_110_110_001_1(uniques, 6);
+  f_010_110_110_010_0(uniques, 6);
+  f_010_110_110_010_1(uniques, 6);
+  f_010_110_110_011_0(uniques, 6);
+  f_010_110_110_011_1(uniques, 6);
+  f_010_110_110_100_0(uniques, 6);
+  f_010_110_110_100_1(uniques, 6);
+  f_010_110_110_101_0(uniques, 6);
+  f_010_110_110_101_1(uniques, 6);
+  f_010_110_110_110_0(uniques, 6);
+  f_010_110_110_110_1(uniques, 6);
+  f_010_110_110_111_0(uniques, 6);
+  f_010_110_110_111_1(uniques, 6);
+  f_010_110_111_000_0(uniques, 6);
+  f_010_110_111_000_1(uniques, 6);
+  f_010_110_111_001_0(uniques, 6);
+  f_010_110_111_001_1(uniques, 6);
+  f_010_110_111_010_0(uniques, 6);
+  f_010_110_111_010_1(uniques, 6);
+  f_010_110_111_011_0(uniques, 6);
+  f_010_110_111_011_1(uniques, 6);
+  f_010_110_111_100_0(uniques, 6);
+  f_010_110_111_100_1(uniques, 6);
+  f_010_110_111_101_0(uniques, 6);
+  f_010_110_111_101_1(uniques, 6);
+  f_010_110_111_110_0(uniques, 6);
+  f_010_110_111_110_1(uniques, 6);
+  f_010_110_111_111_0(uniques, 6);
+  f_010_110_111_111_1(uniques, 6);
+  f_010_111_100_000_0(uniques, 6);
+  f_010_111_100_000_1(uniques, 6);
+  f_010_111_100_001_0(uniques, 6);
+  f_010_111_100_001_1(uniques, 6);
+  f_010_111_100_010_0(uniques, 6);
+  f_010_111_100_010_1(uniques, 6);
+  f_010_111_100_011_0(uniques, 6);
+  f_010_111_100_011_1(uniques, 6);
+  f_010_111_100_100_0(uniques, 6);
+  f_010_111_100_100_1(uniques, 6);
+  f_010_111_100_101_0(uniques, 6);
+  f_010_111_100_101_1(uniques, 6);
+  f_010_111_100_110_0(uniques, 6);
+  f_010_111_100_110_1(uniques, 6);
+  f_010_111_100_111_0(uniques, 6);
+  f_010_111_100_111_1(uniques, 6);
+  f_010_111_101_000_0(uniques, 6);
+  f_010_111_101_000_1(uniques, 6);
+  f_010_111_101_001_0(uniques, 6);
+  f_010_111_101_001_1(uniques, 6);
+  f_010_111_101_010_0(uniques, 6);
+  f_010_111_101_010_1(uniques, 6);
+  f_010_111_101_011_0(uniques, 6);
+  f_010_111_101_011_1(uniques, 6);
+  f_010_111_101_100_0(uniques, 6);
+  f_010_111_101_100_1(uniques, 6);
+  f_010_111_101_101_0(uniques, 6);
+  f_010_111_101_101_1(uniques, 6);
+  f_010_111_101_110_0(uniques, 6);
+  f_010_111_101_110_1(uniques, 6);
+  f_010_111_101_111_0(uniques, 6);
+  f_010_111_101_111_1(uniques, 6);
+  f_010_111_110_000_0(uniques, 6);
+  f_010_111_110_000_1(uniques, 6);
+  f_010_111_110_001_0(uniques, 6);
+  f_010_111_110_001_1(uniques, 6);
+  f_010_111_110_010_0(uniques, 6);
+  f_010_111_110_010_1(uniques, 6);
+  f_010_111_110_011_0(uniques, 6);
+  f_010_111_110_011_1(uniques, 6);
+  f_010_111_110_100_0(uniques, 6);
+  f_010_111_110_100_1(uniques, 6);
+  f_010_111_110_101_0(uniques, 6);
+  f_010_111_110_101_1(uniques, 6);
+  f_010_111_110_110_0(uniques, 6);
+  f_010_111_110_110_1(uniques, 6);
+  f_010_111_110_111_0(uniques, 6);
+  f_010_111_110_111_1(uniques, 6);
+  f_010_111_111_000_0(uniques, 6);
+  f_010_111_111_000_1(uniques, 6);
+  f_010_111_111_001_0(uniques, 6);
+  f_010_111_111_001_1(uniques, 6);
+  f_010_111_111_010_0(uniques, 6);
+  f_010_111_111_010_1(uniques, 6);
+  f_010_111_111_011_0(uniques, 6);
+  f_010_111_111_011_1(uniques, 6);
+  f_010_111_111_100_0(uniques, 6);
+  f_010_111_111_100_1(uniques, 6);
+  f_010_111_111_101_0(uniques, 6);
+  f_010_111_111_101_1(uniques, 6);
+  f_010_111_111_110_0(uniques, 6);
+  f_010_111_111_110_1(uniques, 6);
+  f_010_111_111_111_0(uniques, 6);
+  f_010_111_111_111_1(uniques, 6);
+  f_011_000_100_000_0(uniques, 6);
+  f_011_000_100_000_1(uniques, 6);
+  f_011_000_100_001_0(uniques, 6);
+  f_011_000_100_001_1(uniques, 6);
+  f_011_000_100_010_0(uniques, 6);
+  f_011_000_100_010_1(uniques, 6);
+  f_011_000_100_011_0(uniques, 6);
+  f_011_000_100_011_1(uniques, 6);
+  f_011_000_100_100_0(uniques, 6);
+  f_011_000_100_100_1(uniques, 6);
+  f_011_000_100_101_0(uniques, 6);
+  f_011_000_100_101_1(uniques, 6);
+  f_011_000_100_110_0(uniques, 6);
+  f_011_000_100_110_1(uniques, 6);
+  f_011_000_100_111_0(uniques, 6);
+  f_011_000_100_111_1(uniques, 6);
+  f_011_000_101_000_0(uniques, 6);
+  f_011_000_101_000_1(uniques, 6);
+  f_011_000_101_001_0(uniques, 6);
+  f_011_000_101_001_1(uniques, 6);
+  f_011_000_101_010_0(uniques, 6);
+  f_011_000_101_010_1(uniques, 6);
+  f_011_000_101_011_0(uniques, 6);
+  f_011_000_101_011_1(uniques, 6);
+  f_011_000_101_100_0(uniques, 6);
+  f_011_000_101_100_1(uniques, 6);
+  f_011_000_101_101_0(uniques, 6);
+  f_011_000_101_101_1(uniques, 6);
+  f_011_000_101_110_0(uniques, 6);
+  f_011_000_101_110_1(uniques, 6);
+  f_011_000_101_111_0(uniques, 6);
+  f_011_000_101_111_1(uniques, 6);
+  f_011_000_110_000_0(uniques, 6);
+  f_011_000_110_000_1(uniques, 6);
+  f_011_000_110_001_0(uniques, 6);
+  f_011_000_110_001_1(uniques, 6);
+  f_011_000_110_010_0(uniques, 6);
+  f_011_000_110_010_1(uniques, 6);
+  f_011_000_110_011_0(uniques, 6);
+  f_011_000_110_011_1(uniques, 6);
+  f_011_000_110_100_0(uniques, 6);
+  f_011_000_110_100_1(uniques, 6);
+  f_011_000_110_101_0(uniques, 6);
+  f_011_000_110_101_1(uniques, 6);
+  f_011_000_110_110_0(uniques, 6);
+  f_011_000_110_110_1(uniques, 6);
+  f_011_000_110_111_0(uniques, 6);
+  f_011_000_110_111_1(uniques, 6);
+  f_011_000_111_000_0(uniques, 6);
+  f_011_000_111_000_1(uniques, 6);
+  f_011_000_111_001_0(uniques, 6);
+  f_011_000_111_001_1(uniques, 6);
+  f_011_000_111_010_0(uniques, 6);
+  f_011_000_111_010_1(uniques, 6);
+  f_011_000_111_011_0(uniques, 6);
+  f_011_000_111_011_1(uniques, 6);
+  f_011_000_111_100_0(uniques, 6);
+  f_011_000_111_100_1(uniques, 6);
+  f_011_000_111_101_0(uniques, 6);
+  f_011_000_111_101_1(uniques, 6);
+  f_011_000_111_110_0(uniques, 6);
+  f_011_000_111_110_1(uniques, 6);
+  f_011_000_111_111_0(uniques, 6);
+  f_011_000_111_111_1(uniques, 6);
+  f_011_001_100_000_0(uniques, 6);
+  f_011_001_100_000_1(uniques, 6);
+  f_011_001_100_001_0(uniques, 6);
+  f_011_001_100_001_1(uniques, 6);
+  f_011_001_100_010_0(uniques, 6);
+  f_011_001_100_010_1(uniques, 6);
+  f_011_001_100_011_0(uniques, 6);
+  f_011_001_100_011_1(uniques, 6);
+  f_011_001_100_100_0(uniques, 6);
+  f_011_001_100_100_1(uniques, 6);
+  f_011_001_100_101_0(uniques, 6);
+  f_011_001_100_101_1(uniques, 6);
+  f_011_001_100_110_0(uniques, 6);
+  f_011_001_100_110_1(uniques, 6);
+  f_011_001_100_111_0(uniques, 6);
+  f_011_001_100_111_1(uniques, 6);
+  f_011_001_101_000_0(uniques, 6);
+  f_011_001_101_000_1(uniques, 6);
+  f_011_001_101_001_0(uniques, 6);
+  f_011_001_101_001_1(uniques, 6);
+  f_011_001_101_010_0(uniques, 6);
+  f_011_001_101_010_1(uniques, 6);
+  f_011_001_101_011_0(uniques, 6);
+  f_011_001_101_011_1(uniques, 6);
+  f_011_001_101_100_0(uniques, 6);
+  f_011_001_101_100_1(uniques, 6);
+  f_011_001_101_101_0(uniques, 6);
+  f_011_001_101_101_1(uniques, 6);
+  f_011_001_101_110_0(uniques, 6);
+  f_011_001_101_110_1(uniques, 6);
+  f_011_001_101_111_0(uniques, 6);
+  f_011_001_101_111_1(uniques, 6);
+  f_011_001_110_000_0(uniques, 6);
+  f_011_001_110_000_1(uniques, 6);
+  f_011_001_110_001_0(uniques, 6);
+  f_011_001_110_001_1(uniques, 6);
+  f_011_001_110_010_0(uniques, 6);
+  f_011_001_110_010_1(uniques, 6);
+  f_011_001_110_011_0(uniques, 6);
+  f_011_001_110_011_1(uniques, 6);
+  f_011_001_110_100_0(uniques, 6);
+  f_011_001_110_100_1(uniques, 6);
+  f_011_001_110_101_0(uniques, 6);
+  f_011_001_110_101_1(uniques, 6);
+  f_011_001_110_110_0(uniques, 6);
+  f_011_001_110_110_1(uniques, 6);
+  f_011_001_110_111_0(uniques, 6);
+  f_011_001_110_111_1(uniques, 6);
+  f_011_001_111_000_0(uniques, 6);
+  f_011_001_111_000_1(uniques, 6);
+  f_011_001_111_001_0(uniques, 6);
+  f_011_001_111_001_1(uniques, 6);
+  f_011_001_111_010_0(uniques, 6);
+  f_011_001_111_010_1(uniques, 6);
+  f_011_001_111_011_0(uniques, 6);
+  f_011_001_111_011_1(uniques, 6);
+  f_011_001_111_100_0(uniques, 6);
+  f_011_001_111_100_1(uniques, 6);
+  f_011_001_111_101_0(uniques, 6);
+  f_011_001_111_101_1(uniques, 6);
+  f_011_001_111_110_0(uniques, 6);
+  f_011_001_111_110_1(uniques, 6);
+  f_011_001_111_111_0(uniques, 6);
+  f_011_001_111_111_1(uniques, 6);
+  f_011_010_100_000_0(uniques, 6);
+  f_011_010_100_000_1(uniques, 6);
+  f_011_010_100_001_0(uniques, 6);
+  f_011_010_100_001_1(uniques, 6);
+  f_011_010_100_010_0(uniques, 6);
+  f_011_010_100_010_1(uniques, 6);
+  f_011_010_100_011_0(uniques, 6);
+  f_011_010_100_011_1(uniques, 6);
+  f_011_010_100_100_0(uniques, 6);
+  f_011_010_100_100_1(uniques, 6);
+  f_011_010_100_101_0(uniques, 6);
+  f_011_010_100_101_1(uniques, 6);
+  f_011_010_100_110_0(uniques, 6);
+  f_011_010_100_110_1(uniques, 6);
+  f_011_010_100_111_0(uniques, 6);
+  f_011_010_100_111_1(uniques, 6);
+  f_011_010_101_000_0(uniques, 6);
+  f_011_010_101_000_1(uniques, 6);
+  f_011_010_101_001_0(uniques, 6);
+  f_011_010_101_001_1(uniques, 6);
+  f_011_010_101_010_0(uniques, 6);
+  f_011_010_101_010_1(uniques, 6);
+  f_011_010_101_011_0(uniques, 6);
+  f_011_010_101_011_1(uniques, 6);
+  f_011_010_101_100_0(uniques, 6);
+  f_011_010_101_100_1(uniques, 6);
+  f_011_010_101_101_0(uniques, 6);
+  f_011_010_101_101_1(uniques, 6);
+  f_011_010_101_110_0(uniques, 6);
+  f_011_010_101_110_1(uniques, 6);
+  f_011_010_101_111_0(uniques, 6);
+  f_011_010_101_111_1(uniques, 6);
+  f_011_010_110_000_0(uniques, 6);
+  f_011_010_110_000_1(uniques, 6);
+  f_011_010_110_001_0(uniques, 6);
+  f_011_010_110_001_1(uniques, 6);
+  f_011_010_110_010_0(uniques, 6);
+  f_011_010_110_010_1(uniques, 6);
+  f_011_010_110_011_0(uniques, 6);
+  f_011_010_110_011_1(uniques, 6);
+  f_011_010_110_100_0(uniques, 6);
+  f_011_010_110_100_1(uniques, 6);
+  f_011_010_110_101_0(uniques, 6);
+  f_011_010_110_101_1(uniques, 6);
+  f_011_010_110_110_0(uniques, 6);
+  f_011_010_110_110_1(uniques, 6);
+  f_011_010_110_111_0(uniques, 6);
+  f_011_010_110_111_1(uniques, 6);
+  f_011_010_111_000_0(uniques, 6);
+  f_011_010_111_000_1(uniques, 6);
+  f_011_010_111_001_0(uniques, 6);
+  f_011_010_111_001_1(uniques, 6);
+  f_011_010_111_010_0(uniques, 6);
+  f_011_010_111_010_1(uniques, 6);
+  f_011_010_111_011_0(uniques, 6);
+  f_011_010_111_011_1(uniques, 6);
+  f_011_010_111_100_0(uniques, 6);
+  f_011_010_111_100_1(uniques, 6);
+  f_011_010_111_101_0(uniques, 6);
+  f_011_010_111_101_1(uniques, 6);
+  f_011_010_111_110_0(uniques, 6);
+  f_011_010_111_110_1(uniques, 6);
+  f_011_010_111_111_0(uniques, 6);
+  f_011_010_111_111_1(uniques, 6);
+  f_011_011_100_000_0(uniques, 6);
+  f_011_011_100_000_1(uniques, 6);
+  f_011_011_100_001_0(uniques, 6);
+  f_011_011_100_001_1(uniques, 6);
+  f_011_011_100_010_0(uniques, 6);
+  f_011_011_100_010_1(uniques, 6);
+  f_011_011_100_011_0(uniques, 6);
+  f_011_011_100_011_1(uniques, 6);
+  f_011_011_100_100_0(uniques, 6);
+  f_011_011_100_100_1(uniques, 6);
+  f_011_011_100_101_0(uniques, 6);
+  f_011_011_100_101_1(uniques, 6);
+  f_011_011_100_110_0(uniques, 6);
+  f_011_011_100_110_1(uniques, 6);
+  f_011_011_100_111_0(uniques, 6);
+  f_011_011_100_111_1(uniques, 6);
+  f_011_011_101_000_0(uniques, 6);
+  f_011_011_101_000_1(uniques, 6);
+  f_011_011_101_001_0(uniques, 6);
+  f_011_011_101_001_1(uniques, 6);
+  f_011_011_101_010_0(uniques, 6);
+  f_011_011_101_010_1(uniques, 6);
+  f_011_011_101_011_0(uniques, 6);
+  f_011_011_101_011_1(uniques, 6);
+  f_011_011_101_100_0(uniques, 6);
+  f_011_011_101_100_1(uniques, 6);
+  f_011_011_101_101_0(uniques, 6);
+  f_011_011_101_101_1(uniques, 6);
+  f_011_011_101_110_0(uniques, 6);
+  f_011_011_101_110_1(uniques, 6);
+  f_011_011_101_111_0(uniques, 6);
+  f_011_011_101_111_1(uniques, 6);
+  f_011_011_110_000_0(uniques, 6);
+  f_011_011_110_000_1(uniques, 6);
+  f_011_011_110_001_0(uniques, 6);
+  f_011_011_110_001_1(uniques, 6);
+  f_011_011_110_010_0(uniques, 6);
+  f_011_011_110_010_1(uniques, 6);
+  f_011_011_110_011_0(uniques, 6);
+  f_011_011_110_011_1(uniques, 6);
+  f_011_011_110_100_0(uniques, 6);
+  f_011_011_110_100_1(uniques, 6);
+  f_011_011_110_101_0(uniques, 6);
+  f_011_011_110_101_1(uniques, 6);
+  f_011_011_110_110_0(uniques, 6);
+  f_011_011_110_110_1(uniques, 6);
+  f_011_011_110_111_0(uniques, 6);
+  f_011_011_110_111_1(uniques, 6);
+  f_011_011_111_000_0(uniques, 6);
+  f_011_011_111_000_1(uniques, 6);
+  f_011_011_111_001_0(uniques, 6);
+  f_011_011_111_001_1(uniques, 6);
+  f_011_011_111_010_0(uniques, 6);
+  f_011_011_111_010_1(uniques, 6);
+  f_011_011_111_011_0(uniques, 6);
+  f_011_011_111_011_1(uniques, 6);
+  f_011_011_111_100_0(uniques, 6);
+  f_011_011_111_100_1(uniques, 6);
+  f_011_011_111_101_0(uniques, 6);
+  f_011_011_111_101_1(uniques, 6);
+  f_011_011_111_110_0(uniques, 6);
+  f_011_011_111_110_1(uniques, 6);
+  f_011_011_111_111_0(uniques, 6);
+  f_011_011_111_111_1(uniques, 6);
+  f_011_100_100_000_0(uniques, 6);
+  f_011_100_100_000_1(uniques, 6);
+  f_011_100_100_001_0(uniques, 6);
+  f_011_100_100_001_1(uniques, 6);
+  f_011_100_100_010_0(uniques, 6);
+  f_011_100_100_010_1(uniques, 6);
+  f_011_100_100_011_0(uniques, 6);
+  f_011_100_100_011_1(uniques, 6);
+  f_011_100_100_100_0(uniques, 6);
+  f_011_100_100_100_1(uniques, 6);
+  f_011_100_100_101_0(uniques, 6);
+  f_011_100_100_101_1(uniques, 6);
+  f_011_100_100_110_0(uniques, 6);
+  f_011_100_100_110_1(uniques, 6);
+  f_011_100_100_111_0(uniques, 6);
+  f_011_100_100_111_1(uniques, 6);
+  f_011_100_101_000_0(uniques, 6);
+  f_011_100_101_000_1(uniques, 6);
+  f_011_100_101_001_0(uniques, 6);
+  f_011_100_101_001_1(uniques, 6);
+  f_011_100_101_010_0(uniques, 6);
+  f_011_100_101_010_1(uniques, 6);
+  f_011_100_101_011_0(uniques, 6);
+  f_011_100_101_011_1(uniques, 6);
+  f_011_100_101_100_0(uniques, 6);
+  f_011_100_101_100_1(uniques, 6);
+  f_011_100_101_101_0(uniques, 6);
+  f_011_100_101_101_1(uniques, 6);
+  f_011_100_101_110_0(uniques, 6);
+  f_011_100_101_110_1(uniques, 6);
+  f_011_100_101_111_0(uniques, 6);
+  f_011_100_101_111_1(uniques, 6);
+  f_011_100_110_000_0(uniques, 6);
+  f_011_100_110_000_1(uniques, 6);
+  f_011_100_110_001_0(uniques, 6);
+  f_011_100_110_001_1(uniques, 6);
+  f_011_100_110_010_0(uniques, 6);
+  f_011_100_110_010_1(uniques, 6);
+  f_011_100_110_011_0(uniques, 6);
+  f_011_100_110_011_1(uniques, 6);
+  f_011_100_110_100_0(uniques, 6);
+  f_011_100_110_100_1(uniques, 6);
+  f_011_100_110_101_0(uniques, 6);
+  f_011_100_110_101_1(uniques, 6);
+  f_011_100_110_110_0(uniques, 6);
+  f_011_100_110_110_1(uniques, 6);
+  f_011_100_110_111_0(uniques, 6);
+  f_011_100_110_111_1(uniques, 6);
+  f_011_100_111_000_0(uniques, 6);
+  f_011_100_111_000_1(uniques, 6);
+  f_011_100_111_001_0(uniques, 6);
+  f_011_100_111_001_1(uniques, 6);
+  f_011_100_111_010_0(uniques, 6);
+  f_011_100_111_010_1(uniques, 6);
+  f_011_100_111_011_0(uniques, 6);
+  f_011_100_111_011_1(uniques, 6);
+  f_011_100_111_100_0(uniques, 6);
+  f_011_100_111_100_1(uniques, 6);
+  f_011_100_111_101_0(uniques, 6);
+  f_011_100_111_101_1(uniques, 6);
+  f_011_100_111_110_0(uniques, 6);
+  f_011_100_111_110_1(uniques, 6);
+  f_011_100_111_111_0(uniques, 6);
+  f_011_100_111_111_1(uniques, 6);
+  f_011_101_100_000_0(uniques, 6);
+  f_011_101_100_000_1(uniques, 6);
+  f_011_101_100_001_0(uniques, 6);
+  f_011_101_100_001_1(uniques, 6);
+  f_011_101_100_010_0(uniques, 6);
+  f_011_101_100_010_1(uniques, 6);
+  f_011_101_100_011_0(uniques, 6);
+  f_011_101_100_011_1(uniques, 6);
+  f_011_101_100_100_0(uniques, 6);
+  f_011_101_100_100_1(uniques, 6);
+  f_011_101_100_101_0(uniques, 6);
+  f_011_101_100_101_1(uniques, 6);
+  f_011_101_100_110_0(uniques, 6);
+  f_011_101_100_110_1(uniques, 6);
+  f_011_101_100_111_0(uniques, 6);
+  f_011_101_100_111_1(uniques, 6);
+  f_011_101_101_000_0(uniques, 6);
+  f_011_101_101_000_1(uniques, 6);
+  f_011_101_101_001_0(uniques, 6);
+  f_011_101_101_001_1(uniques, 6);
+  f_011_101_101_010_0(uniques, 6);
+  f_011_101_101_010_1(uniques, 6);
+  f_011_101_101_011_0(uniques, 6);
+  f_011_101_101_011_1(uniques, 6);
+  f_011_101_101_100_0(uniques, 6);
+  f_011_101_101_100_1(uniques, 6);
+  f_011_101_101_101_0(uniques, 6);
+  f_011_101_101_101_1(uniques, 6);
+  f_011_101_101_110_0(uniques, 6);
+  f_011_101_101_110_1(uniques, 6);
+  f_011_101_101_111_0(uniques, 6);
+  f_011_101_101_111_1(uniques, 6);
+  f_011_101_110_000_0(uniques, 6);
+  f_011_101_110_000_1(uniques, 6);
+  f_011_101_110_001_0(uniques, 6);
+  f_011_101_110_001_1(uniques, 6);
+  f_011_101_110_010_0(uniques, 6);
+  f_011_101_110_010_1(uniques, 6);
+  f_011_101_110_011_0(uniques, 6);
+  f_011_101_110_011_1(uniques, 6);
+  f_011_101_110_100_0(uniques, 6);
+  f_011_101_110_100_1(uniques, 6);
+  f_011_101_110_101_0(uniques, 6);
+  f_011_101_110_101_1(uniques, 6);
+  f_011_101_110_110_0(uniques, 6);
+  f_011_101_110_110_1(uniques, 6);
+  f_011_101_110_111_0(uniques, 6);
+  f_011_101_110_111_1(uniques, 6);
+  f_011_101_111_000_0(uniques, 6);
+  f_011_101_111_000_1(uniques, 6);
+  f_011_101_111_001_0(uniques, 6);
+  f_011_101_111_001_1(uniques, 6);
+  f_011_101_111_010_0(uniques, 6);
+  f_011_101_111_010_1(uniques, 6);
+  f_011_101_111_011_0(uniques, 6);
+  f_011_101_111_011_1(uniques, 6);
+  f_011_101_111_100_0(uniques, 6);
+  f_011_101_111_100_1(uniques, 6);
+  f_011_101_111_101_0(uniques, 6);
+  f_011_101_111_101_1(uniques, 6);
+  f_011_101_111_110_0(uniques, 6);
+  f_011_101_111_110_1(uniques, 6);
+  f_011_101_111_111_0(uniques, 6);
+  f_011_101_111_111_1(uniques, 6);
+  f_011_110_100_000_0(uniques, 6);
+  f_011_110_100_000_1(uniques, 6);
+  f_011_110_100_001_0(uniques, 6);
+  f_011_110_100_001_1(uniques, 6);
+  f_011_110_100_010_0(uniques, 6);
+  f_011_110_100_010_1(uniques, 6);
+  f_011_110_100_011_0(uniques, 6);
+  f_011_110_100_011_1(uniques, 6);
+  f_011_110_100_100_0(uniques, 6);
+  f_011_110_100_100_1(uniques, 6);
+  f_011_110_100_101_0(uniques, 6);
+  f_011_110_100_101_1(uniques, 6);
+  f_011_110_100_110_0(uniques, 6);
+  f_011_110_100_110_1(uniques, 6);
+  f_011_110_100_111_0(uniques, 6);
+  f_011_110_100_111_1(uniques, 6);
+  f_011_110_101_000_0(uniques, 6);
+  f_011_110_101_000_1(uniques, 6);
+  f_011_110_101_001_0(uniques, 6);
+  f_011_110_101_001_1(uniques, 6);
+  f_011_110_101_010_0(uniques, 6);
+  f_011_110_101_010_1(uniques, 6);
+  f_011_110_101_011_0(uniques, 6);
+  f_011_110_101_011_1(uniques, 6);
+  f_011_110_101_100_0(uniques, 6);
+  f_011_110_101_100_1(uniques, 6);
+  f_011_110_101_101_0(uniques, 6);
+  f_011_110_101_101_1(uniques, 6);
+  f_011_110_101_110_0(uniques, 6);
+  f_011_110_101_110_1(uniques, 6);
+  f_011_110_101_111_0(uniques, 6);
+  f_011_110_101_111_1(uniques, 6);
+  f_011_110_110_000_0(uniques, 6);
+  f_011_110_110_000_1(uniques, 6);
+  f_011_110_110_001_0(uniques, 6);
+  f_011_110_110_001_1(uniques, 6);
+  f_011_110_110_010_0(uniques, 6);
+  f_011_110_110_010_1(uniques, 6);
+  f_011_110_110_011_0(uniques, 6);
+  f_011_110_110_011_1(uniques, 6);
+  f_011_110_110_100_0(uniques, 6);
+  f_011_110_110_100_1(uniques, 6);
+  f_011_110_110_101_0(uniques, 6);
+  f_011_110_110_101_1(uniques, 6);
+  f_011_110_110_110_0(uniques, 6);
+  f_011_110_110_110_1(uniques, 6);
+  f_011_110_110_111_0(uniques, 6);
+  f_011_110_110_111_1(uniques, 6);
+  f_011_110_111_000_0(uniques, 6);
+  f_011_110_111_000_1(uniques, 6);
+  f_011_110_111_001_0(uniques, 6);
+  f_011_110_111_001_1(uniques, 6);
+  f_011_110_111_010_0(uniques, 6);
+  f_011_110_111_010_1(uniques, 6);
+  f_011_110_111_011_0(uniques, 6);
+  f_011_110_111_011_1(uniques, 6);
+  f_011_110_111_100_0(uniques, 6);
+  f_011_110_111_100_1(uniques, 6);
+  f_011_110_111_101_0(uniques, 6);
+  f_011_110_111_101_1(uniques, 6);
+  f_011_110_111_110_0(uniques, 6);
+  f_011_110_111_110_1(uniques, 6);
+  f_011_110_111_111_0(uniques, 6);
+  f_011_110_111_111_1(uniques, 6);
+  f_011_111_100_000_0(uniques, 6);
+  f_011_111_100_000_1(uniques, 6);
+  f_011_111_100_001_0(uniques, 6);
+  f_011_111_100_001_1(uniques, 6);
+  f_011_111_100_010_0(uniques, 6);
+  f_011_111_100_010_1(uniques, 6);
+  f_011_111_100_011_0(uniques, 6);
+  f_011_111_100_011_1(uniques, 6);
+  f_011_111_100_100_0(uniques, 6);
+  f_011_111_100_100_1(uniques, 6);
+  f_011_111_100_101_0(uniques, 6);
+  f_011_111_100_101_1(uniques, 6);
+  f_011_111_100_110_0(uniques, 6);
+  f_011_111_100_110_1(uniques, 6);
+  f_011_111_100_111_0(uniques, 6);
+  f_011_111_100_111_1(uniques, 6);
+  f_011_111_101_000_0(uniques, 6);
+  f_011_111_101_000_1(uniques, 6);
+  f_011_111_101_001_0(uniques, 6);
+  f_011_111_101_001_1(uniques, 6);
+  f_011_111_101_010_0(uniques, 6);
+  f_011_111_101_010_1(uniques, 6);
+  f_011_111_101_011_0(uniques, 6);
+  f_011_111_101_011_1(uniques, 6);
+  f_011_111_101_100_0(uniques, 6);
+  f_011_111_101_100_1(uniques, 6);
+  f_011_111_101_101_0(uniques, 6);
+  f_011_111_101_101_1(uniques, 6);
+  f_011_111_101_110_0(uniques, 6);
+  f_011_111_101_110_1(uniques, 6);
+  f_011_111_101_111_0(uniques, 6);
+  f_011_111_101_111_1(uniques, 6);
+  f_011_111_110_000_0(uniques, 6);
+  f_011_111_110_000_1(uniques, 6);
+  f_011_111_110_001_0(uniques, 6);
+  f_011_111_110_001_1(uniques, 6);
+  f_011_111_110_010_0(uniques, 6);
+  f_011_111_110_010_1(uniques, 6);
+  f_011_111_110_011_0(uniques, 6);
+  f_011_111_110_011_1(uniques, 6);
+  f_011_111_110_100_0(uniques, 6);
+  f_011_111_110_100_1(uniques, 6);
+  f_011_111_110_101_0(uniques, 6);
+  f_011_111_110_101_1(uniques, 6);
+  f_011_111_110_110_0(uniques, 6);
+  f_011_111_110_110_1(uniques, 6);
+  f_011_111_110_111_0(uniques, 6);
+  f_011_111_110_111_1(uniques, 6);
+  f_011_111_111_000_0(uniques, 6);
+  f_011_111_111_000_1(uniques, 6);
+  f_011_111_111_001_0(uniques, 6);
+  f_011_111_111_001_1(uniques, 6);
+  f_011_111_111_010_0(uniques, 6);
+  f_011_111_111_010_1(uniques, 6);
+  f_011_111_111_011_0(uniques, 6);
+  f_011_111_111_011_1(uniques, 6);
+  f_011_111_111_100_0(uniques, 6);
+  f_011_111_111_100_1(uniques, 6);
+  f_011_111_111_101_0(uniques, 6);
+  f_011_111_111_101_1(uniques, 6);
+  f_011_111_111_110_0(uniques, 6);
+  f_011_111_111_110_1(uniques, 6);
+  f_011_111_111_111_0(uniques, 6);
+  f_011_111_111_111_1(uniques, 6);
+  f_100_000_100_000_0(uniques, 6);
+  f_100_000_100_000_1(uniques, 6);
+  f_100_000_100_001_0(uniques, 6);
+  f_100_000_100_001_1(uniques, 6);
+  f_100_000_100_010_0(uniques, 6);
+  f_100_000_100_010_1(uniques, 6);
+  f_100_000_100_011_0(uniques, 6);
+  f_100_000_100_011_1(uniques, 6);
+  f_100_000_100_100_0(uniques, 6);
+  f_100_000_100_100_1(uniques, 6);
+  f_100_000_100_101_0(uniques, 6);
+  f_100_000_100_101_1(uniques, 6);
+  f_100_000_100_110_0(uniques, 6);
+  f_100_000_100_110_1(uniques, 6);
+  f_100_000_100_111_0(uniques, 6);
+  f_100_000_100_111_1(uniques, 6);
+  f_100_000_101_000_0(uniques, 6);
+  f_100_000_101_000_1(uniques, 6);
+  f_100_000_101_001_0(uniques, 6);
+  f_100_000_101_001_1(uniques, 6);
+  f_100_000_101_010_0(uniques, 6);
+  f_100_000_101_010_1(uniques, 6);
+  f_100_000_101_011_0(uniques, 6);
+  f_100_000_101_011_1(uniques, 6);
+  f_100_000_101_100_0(uniques, 6);
+  f_100_000_101_100_1(uniques, 6);
+  f_100_000_101_101_0(uniques, 6);
+  f_100_000_101_101_1(uniques, 6);
+  f_100_000_101_110_0(uniques, 6);
+  f_100_000_101_110_1(uniques, 6);
+  f_100_000_101_111_0(uniques, 6);
+  f_100_000_101_111_1(uniques, 6);
+  f_100_000_110_000_0(uniques, 6);
+  f_100_000_110_000_1(uniques, 6);
+  f_100_000_110_001_0(uniques, 6);
+  f_100_000_110_001_1(uniques, 6);
+  f_100_000_110_010_0(uniques, 6);
+  f_100_000_110_010_1(uniques, 6);
+  f_100_000_110_011_0(uniques, 6);
+  f_100_000_110_011_1(uniques, 6);
+  f_100_000_110_100_0(uniques, 6);
+  f_100_000_110_100_1(uniques, 6);
+  f_100_000_110_101_0(uniques, 6);
+  f_100_000_110_101_1(uniques, 6);
+  f_100_000_110_110_0(uniques, 6);
+  f_100_000_110_110_1(uniques, 6);
+  f_100_000_110_111_0(uniques, 6);
+  f_100_000_110_111_1(uniques, 6);
+  f_100_000_111_000_0(uniques, 6);
+  f_100_000_111_000_1(uniques, 6);
+  f_100_000_111_001_0(uniques, 6);
+  f_100_000_111_001_1(uniques, 6);
+  f_100_000_111_010_0(uniques, 6);
+  f_100_000_111_010_1(uniques, 6);
+  f_100_000_111_011_0(uniques, 6);
+  f_100_000_111_011_1(uniques, 6);
+  f_100_000_111_100_0(uniques, 6);
+  f_100_000_111_100_1(uniques, 6);
+  f_100_000_111_101_0(uniques, 6);
+  f_100_000_111_101_1(uniques, 6);
+  f_100_000_111_110_0(uniques, 6);
+  f_100_000_111_110_1(uniques, 6);
+  f_100_000_111_111_0(uniques, 6);
+  f_100_000_111_111_1(uniques, 6);
+  f_100_001_100_000_0(uniques, 6);
+  f_100_001_100_000_1(uniques, 6);
+  f_100_001_100_001_0(uniques, 6);
+  f_100_001_100_001_1(uniques, 6);
+  f_100_001_100_010_0(uniques, 6);
+  f_100_001_100_010_1(uniques, 6);
+  f_100_001_100_011_0(uniques, 6);
+  f_100_001_100_011_1(uniques, 6);
+  f_100_001_100_100_0(uniques, 6);
+  f_100_001_100_100_1(uniques, 6);
+  f_100_001_100_101_0(uniques, 6);
+  f_100_001_100_101_1(uniques, 6);
+  f_100_001_100_110_0(uniques, 6);
+  f_100_001_100_110_1(uniques, 6);
+  f_100_001_100_111_0(uniques, 6);
+  f_100_001_100_111_1(uniques, 6);
+  f_100_001_101_000_0(uniques, 6);
+  f_100_001_101_000_1(uniques, 6);
+  f_100_001_101_001_0(uniques, 6);
+  f_100_001_101_001_1(uniques, 6);
+  f_100_001_101_010_0(uniques, 6);
+  f_100_001_101_010_1(uniques, 6);
+  f_100_001_101_011_0(uniques, 6);
+  f_100_001_101_011_1(uniques, 6);
+  f_100_001_101_100_0(uniques, 6);
+  f_100_001_101_100_1(uniques, 6);
+  f_100_001_101_101_0(uniques, 6);
+  f_100_001_101_101_1(uniques, 6);
+  f_100_001_101_110_0(uniques, 6);
+  f_100_001_101_110_1(uniques, 6);
+  f_100_001_101_111_0(uniques, 6);
+  f_100_001_101_111_1(uniques, 6);
+  f_100_001_110_000_0(uniques, 6);
+  f_100_001_110_000_1(uniques, 6);
+  f_100_001_110_001_0(uniques, 6);
+  f_100_001_110_001_1(uniques, 6);
+  f_100_001_110_010_0(uniques, 6);
+  f_100_001_110_010_1(uniques, 6);
+  f_100_001_110_011_0(uniques, 6);
+  f_100_001_110_011_1(uniques, 6);
+  f_100_001_110_100_0(uniques, 6);
+  f_100_001_110_100_1(uniques, 6);
+  f_100_001_110_101_0(uniques, 6);
+  f_100_001_110_101_1(uniques, 6);
+  f_100_001_110_110_0(uniques, 6);
+  f_100_001_110_110_1(uniques, 6);
+  f_100_001_110_111_0(uniques, 6);
+  f_100_001_110_111_1(uniques, 6);
+  f_100_001_111_000_0(uniques, 6);
+  f_100_001_111_000_1(uniques, 6);
+  f_100_001_111_001_0(uniques, 6);
+  f_100_001_111_001_1(uniques, 6);
+  f_100_001_111_010_0(uniques, 6);
+  f_100_001_111_010_1(uniques, 6);
+  f_100_001_111_011_0(uniques, 6);
+  f_100_001_111_011_1(uniques, 6);
+  f_100_001_111_100_0(uniques, 6);
+  f_100_001_111_100_1(uniques, 6);
+  f_100_001_111_101_0(uniques, 6);
+  f_100_001_111_101_1(uniques, 6);
+  f_100_001_111_110_0(uniques, 6);
+  f_100_001_111_110_1(uniques, 6);
+  f_100_001_111_111_0(uniques, 6);
+  f_100_001_111_111_1(uniques, 6);
+  f_100_010_100_000_0(uniques, 6);
+  f_100_010_100_000_1(uniques, 6);
+  f_100_010_100_001_0(uniques, 6);
+  f_100_010_100_001_1(uniques, 6);
+  f_100_010_100_010_0(uniques, 6);
+  f_100_010_100_010_1(uniques, 6);
+  f_100_010_100_011_0(uniques, 6);
+  f_100_010_100_011_1(uniques, 6);
+  f_100_010_100_100_0(uniques, 6);
+  f_100_010_100_100_1(uniques, 6);
+  f_100_010_100_101_0(uniques, 6);
+  f_100_010_100_101_1(uniques, 6);
+  f_100_010_100_110_0(uniques, 6);
+  f_100_010_100_110_1(uniques, 6);
+  f_100_010_100_111_0(uniques, 6);
+  f_100_010_100_111_1(uniques, 6);
+  f_100_010_101_000_0(uniques, 6);
+  f_100_010_101_000_1(uniques, 6);
+  f_100_010_101_001_0(uniques, 6);
+  f_100_010_101_001_1(uniques, 6);
+  f_100_010_101_010_0(uniques, 6);
+  f_100_010_101_010_1(uniques, 6);
+  f_100_010_101_011_0(uniques, 6);
+  f_100_010_101_011_1(uniques, 6);
+  f_100_010_101_100_0(uniques, 6);
+  f_100_010_101_100_1(uniques, 6);
+  f_100_010_101_101_0(uniques, 6);
+  f_100_010_101_101_1(uniques, 6);
+  f_100_010_101_110_0(uniques, 6);
+  f_100_010_101_110_1(uniques, 6);
+  f_100_010_101_111_0(uniques, 6);
+  f_100_010_101_111_1(uniques, 6);
+  f_100_010_110_000_0(uniques, 6);
+  f_100_010_110_000_1(uniques, 6);
+  f_100_010_110_001_0(uniques, 6);
+  f_100_010_110_001_1(uniques, 6);
+  f_100_010_110_010_0(uniques, 6);
+  f_100_010_110_010_1(uniques, 6);
+  f_100_010_110_011_0(uniques, 6);
+  f_100_010_110_011_1(uniques, 6);
+  f_100_010_110_100_0(uniques, 6);
+  f_100_010_110_100_1(uniques, 6);
+  f_100_010_110_101_0(uniques, 6);
+  f_100_010_110_101_1(uniques, 6);
+  f_100_010_110_110_0(uniques, 6);
+  f_100_010_110_110_1(uniques, 6);
+  f_100_010_110_111_0(uniques, 6);
+  f_100_010_110_111_1(uniques, 6);
+  f_100_010_111_000_0(uniques, 6);
+  f_100_010_111_000_1(uniques, 6);
+  f_100_010_111_001_0(uniques, 6);
+  f_100_010_111_001_1(uniques, 6);
+  f_100_010_111_010_0(uniques, 6);
+  f_100_010_111_010_1(uniques, 6);
+  f_100_010_111_011_0(uniques, 6);
+  f_100_010_111_011_1(uniques, 6);
+  f_100_010_111_100_0(uniques, 6);
+  f_100_010_111_100_1(uniques, 6);
+  f_100_010_111_101_0(uniques, 6);
+  f_100_010_111_101_1(uniques, 6);
+  f_100_010_111_110_0(uniques, 6);
+  f_100_010_111_110_1(uniques, 6);
+  f_100_010_111_111_0(uniques, 6);
+  f_100_010_111_111_1(uniques, 6);
+  f_100_011_100_000_0(uniques, 6);
+  f_100_011_100_000_1(uniques, 6);
+  f_100_011_100_001_0(uniques, 6);
+  f_100_011_100_001_1(uniques, 6);
+  f_100_011_100_010_0(uniques, 6);
+  f_100_011_100_010_1(uniques, 6);
+  f_100_011_100_011_0(uniques, 6);
+  f_100_011_100_011_1(uniques, 6);
+  f_100_011_100_100_0(uniques, 6);
+  f_100_011_100_100_1(uniques, 6);
+  f_100_011_100_101_0(uniques, 6);
+  f_100_011_100_101_1(uniques, 6);
+  f_100_011_100_110_0(uniques, 6);
+  f_100_011_100_110_1(uniques, 6);
+  f_100_011_100_111_0(uniques, 6);
+  f_100_011_100_111_1(uniques, 6);
+  f_100_011_101_000_0(uniques, 6);
+  f_100_011_101_000_1(uniques, 6);
+  f_100_011_101_001_0(uniques, 6);
+  f_100_011_101_001_1(uniques, 6);
+  f_100_011_101_010_0(uniques, 6);
+  f_100_011_101_010_1(uniques, 6);
+  f_100_011_101_011_0(uniques, 6);
+  f_100_011_101_011_1(uniques, 6);
+  f_100_011_101_100_0(uniques, 6);
+  f_100_011_101_100_1(uniques, 6);
+  f_100_011_101_101_0(uniques, 6);
+  f_100_011_101_101_1(uniques, 6);
+  f_100_011_101_110_0(uniques, 6);
+  f_100_011_101_110_1(uniques, 6);
+  f_100_011_101_111_0(uniques, 6);
+  f_100_011_101_111_1(uniques, 6);
+  f_100_011_110_000_0(uniques, 6);
+  f_100_011_110_000_1(uniques, 6);
+  f_100_011_110_001_0(uniques, 6);
+  f_100_011_110_001_1(uniques, 6);
+  f_100_011_110_010_0(uniques, 6);
+  f_100_011_110_010_1(uniques, 6);
+  f_100_011_110_011_0(uniques, 6);
+  f_100_011_110_011_1(uniques, 6);
+  f_100_011_110_100_0(uniques, 6);
+  f_100_011_110_100_1(uniques, 6);
+  f_100_011_110_101_0(uniques, 6);
+  f_100_011_110_101_1(uniques, 6);
+  f_100_011_110_110_0(uniques, 6);
+  f_100_011_110_110_1(uniques, 6);
+  f_100_011_110_111_0(uniques, 6);
+  f_100_011_110_111_1(uniques, 6);
+  f_100_011_111_000_0(uniques, 6);
+  f_100_011_111_000_1(uniques, 6);
+  f_100_011_111_001_0(uniques, 6);
+  f_100_011_111_001_1(uniques, 6);
+  f_100_011_111_010_0(uniques, 6);
+  f_100_011_111_010_1(uniques, 6);
+  f_100_011_111_011_0(uniques, 6);
+  f_100_011_111_011_1(uniques, 6);
+  f_100_011_111_100_0(uniques, 6);
+  f_100_011_111_100_1(uniques, 6);
+  f_100_011_111_101_0(uniques, 6);
+  f_100_011_111_101_1(uniques, 6);
+  f_100_011_111_110_0(uniques, 6);
+  f_100_011_111_110_1(uniques, 6);
+  f_100_011_111_111_0(uniques, 6);
+  f_100_011_111_111_1(uniques, 6);
+  f_100_100_100_000_0(uniques, 6);
+  f_100_100_100_000_1(uniques, 6);
+  f_100_100_100_001_0(uniques, 6);
+  f_100_100_100_001_1(uniques, 6);
+  f_100_100_100_010_0(uniques, 6);
+  f_100_100_100_010_1(uniques, 6);
+  f_100_100_100_011_0(uniques, 6);
+  f_100_100_100_011_1(uniques, 6);
+  f_100_100_100_100_0(uniques, 6);
+  f_100_100_100_100_1(uniques, 6);
+  f_100_100_100_101_0(uniques, 6);
+  f_100_100_100_101_1(uniques, 6);
+  f_100_100_100_110_0(uniques, 6);
+  f_100_100_100_110_1(uniques, 6);
+  f_100_100_100_111_0(uniques, 6);
+  f_100_100_100_111_1(uniques, 6);
+  f_100_100_101_000_0(uniques, 6);
+  f_100_100_101_000_1(uniques, 6);
+  f_100_100_101_001_0(uniques, 6);
+  f_100_100_101_001_1(uniques, 6);
+  f_100_100_101_010_0(uniques, 6);
+  f_100_100_101_010_1(uniques, 6);
+  f_100_100_101_011_0(uniques, 6);
+  f_100_100_101_011_1(uniques, 6);
+  f_100_100_101_100_0(uniques, 6);
+  f_100_100_101_100_1(uniques, 6);
+  f_100_100_101_101_0(uniques, 6);
+  f_100_100_101_101_1(uniques, 6);
+  f_100_100_101_110_0(uniques, 6);
+  f_100_100_101_110_1(uniques, 6);
+  f_100_100_101_111_0(uniques, 6);
+  f_100_100_101_111_1(uniques, 6);
+  f_100_100_110_000_0(uniques, 6);
+  f_100_100_110_000_1(uniques, 6);
+  f_100_100_110_001_0(uniques, 6);
+  f_100_100_110_001_1(uniques, 6);
+  f_100_100_110_010_0(uniques, 6);
+  f_100_100_110_010_1(uniques, 6);
+  f_100_100_110_011_0(uniques, 6);
+  f_100_100_110_011_1(uniques, 6);
+  f_100_100_110_100_0(uniques, 6);
+  f_100_100_110_100_1(uniques, 6);
+  f_100_100_110_101_0(uniques, 6);
+  f_100_100_110_101_1(uniques, 6);
+  f_100_100_110_110_0(uniques, 6);
+  f_100_100_110_110_1(uniques, 6);
+  f_100_100_110_111_0(uniques, 6);
+  f_100_100_110_111_1(uniques, 6);
+  f_100_100_111_000_0(uniques, 6);
+  f_100_100_111_000_1(uniques, 6);
+  f_100_100_111_001_0(uniques, 6);
+  f_100_100_111_001_1(uniques, 6);
+  f_100_100_111_010_0(uniques, 6);
+  f_100_100_111_010_1(uniques, 6);
+  f_100_100_111_011_0(uniques, 6);
+  f_100_100_111_011_1(uniques, 6);
+  f_100_100_111_100_0(uniques, 6);
+  f_100_100_111_100_1(uniques, 6);
+  f_100_100_111_101_0(uniques, 6);
+  f_100_100_111_101_1(uniques, 6);
+  f_100_100_111_110_0(uniques, 6);
+  f_100_100_111_110_1(uniques, 6);
+  f_100_100_111_111_0(uniques, 6);
+  f_100_100_111_111_1(uniques, 6);
+  f_100_101_100_000_0(uniques, 6);
+  f_100_101_100_000_1(uniques, 6);
+  f_100_101_100_001_0(uniques, 6);
+  f_100_101_100_001_1(uniques, 6);
+  f_100_101_100_010_0(uniques, 6);
+  f_100_101_100_010_1(uniques, 6);
+  f_100_101_100_011_0(uniques, 6);
+  f_100_101_100_011_1(uniques, 6);
+  f_100_101_100_100_0(uniques, 6);
+  f_100_101_100_100_1(uniques, 6);
+  f_100_101_100_101_0(uniques, 6);
+  f_100_101_100_101_1(uniques, 6);
+  f_100_101_100_110_0(uniques, 6);
+  f_100_101_100_110_1(uniques, 6);
+  f_100_101_100_111_0(uniques, 6);
+  f_100_101_100_111_1(uniques, 6);
+  f_100_101_101_000_0(uniques, 6);
+  f_100_101_101_000_1(uniques, 6);
+  f_100_101_101_001_0(uniques, 6);
+  f_100_101_101_001_1(uniques, 6);
+  f_100_101_101_010_0(uniques, 6);
+  f_100_101_101_010_1(uniques, 6);
+  f_100_101_101_011_0(uniques, 6);
+  f_100_101_101_011_1(uniques, 6);
+  f_100_101_101_100_0(uniques, 6);
+  f_100_101_101_100_1(uniques, 6);
+  f_100_101_101_101_0(uniques, 6);
+  f_100_101_101_101_1(uniques, 6);
+  f_100_101_101_110_0(uniques, 6);
+  f_100_101_101_110_1(uniques, 6);
+  f_100_101_101_111_0(uniques, 6);
+  f_100_101_101_111_1(uniques, 6);
+  f_100_101_110_000_0(uniques, 6);
+  f_100_101_110_000_1(uniques, 6);
+  f_100_101_110_001_0(uniques, 6);
+  f_100_101_110_001_1(uniques, 6);
+  f_100_101_110_010_0(uniques, 6);
+  f_100_101_110_010_1(uniques, 6);
+  f_100_101_110_011_0(uniques, 6);
+  f_100_101_110_011_1(uniques, 6);
+  f_100_101_110_100_0(uniques, 6);
+  f_100_101_110_100_1(uniques, 6);
+  f_100_101_110_101_0(uniques, 6);
+  f_100_101_110_101_1(uniques, 6);
+  f_100_101_110_110_0(uniques, 6);
+  f_100_101_110_110_1(uniques, 6);
+  f_100_101_110_111_0(uniques, 6);
+  f_100_101_110_111_1(uniques, 6);
+  f_100_101_111_000_0(uniques, 6);
+  f_100_101_111_000_1(uniques, 6);
+  f_100_101_111_001_0(uniques, 6);
+  f_100_101_111_001_1(uniques, 6);
+  f_100_101_111_010_0(uniques, 6);
+  f_100_101_111_010_1(uniques, 6);
+  f_100_101_111_011_0(uniques, 6);
+  f_100_101_111_011_1(uniques, 6);
+  f_100_101_111_100_0(uniques, 6);
+  f_100_101_111_100_1(uniques, 6);
+  f_100_101_111_101_0(uniques, 6);
+  f_100_101_111_101_1(uniques, 6);
+  f_100_101_111_110_0(uniques, 6);
+  f_100_101_111_110_1(uniques, 6);
+  f_100_101_111_111_0(uniques, 6);
+  f_100_101_111_111_1(uniques, 6);
+  f_100_110_100_000_0(uniques, 6);
+  f_100_110_100_000_1(uniques, 6);
+  f_100_110_100_001_0(uniques, 6);
+  f_100_110_100_001_1(uniques, 6);
+  f_100_110_100_010_0(uniques, 6);
+  f_100_110_100_010_1(uniques, 6);
+  f_100_110_100_011_0(uniques, 6);
+  f_100_110_100_011_1(uniques, 6);
+  f_100_110_100_100_0(uniques, 6);
+  f_100_110_100_100_1(uniques, 6);
+  f_100_110_100_101_0(uniques, 6);
+  f_100_110_100_101_1(uniques, 6);
+  f_100_110_100_110_0(uniques, 6);
+  f_100_110_100_110_1(uniques, 6);
+  f_100_110_100_111_0(uniques, 6);
+  f_100_110_100_111_1(uniques, 6);
+  f_100_110_101_000_0(uniques, 6);
+  f_100_110_101_000_1(uniques, 6);
+  f_100_110_101_001_0(uniques, 6);
+  f_100_110_101_001_1(uniques, 6);
+  f_100_110_101_010_0(uniques, 6);
+  f_100_110_101_010_1(uniques, 6);
+  f_100_110_101_011_0(uniques, 6);
+  f_100_110_101_011_1(uniques, 6);
+  f_100_110_101_100_0(uniques, 6);
+  f_100_110_101_100_1(uniques, 6);
+  f_100_110_101_101_0(uniques, 6);
+  f_100_110_101_101_1(uniques, 6);
+  f_100_110_101_110_0(uniques, 6);
+  f_100_110_101_110_1(uniques, 6);
+  f_100_110_101_111_0(uniques, 6);
+  f_100_110_101_111_1(uniques, 6);
+  f_100_110_110_000_0(uniques, 6);
+  f_100_110_110_000_1(uniques, 6);
+  f_100_110_110_001_0(uniques, 6);
+  f_100_110_110_001_1(uniques, 6);
+  f_100_110_110_010_0(uniques, 6);
+  f_100_110_110_010_1(uniques, 6);
+  f_100_110_110_011_0(uniques, 6);
+  f_100_110_110_011_1(uniques, 6);
+  f_100_110_110_100_0(uniques, 6);
+  f_100_110_110_100_1(uniques, 6);
+  f_100_110_110_101_0(uniques, 6);
+  f_100_110_110_101_1(uniques, 6);
+  f_100_110_110_110_0(uniques, 6);
+  f_100_110_110_110_1(uniques, 6);
+  f_100_110_110_111_0(uniques, 6);
+  f_100_110_110_111_1(uniques, 6);
+  f_100_110_111_000_0(uniques, 6);
+  f_100_110_111_000_1(uniques, 6);
+  f_100_110_111_001_0(uniques, 6);
+  f_100_110_111_001_1(uniques, 6);
+  f_100_110_111_010_0(uniques, 6);
+  f_100_110_111_010_1(uniques, 6);
+  f_100_110_111_011_0(uniques, 6);
+  f_100_110_111_011_1(uniques, 6);
+  f_100_110_111_100_0(uniques, 6);
+  f_100_110_111_100_1(uniques, 6);
+  f_100_110_111_101_0(uniques, 6);
+  f_100_110_111_101_1(uniques, 6);
+  f_100_110_111_110_0(uniques, 6);
+  f_100_110_111_110_1(uniques, 6);
+  f_100_110_111_111_0(uniques, 6);
+  f_100_110_111_111_1(uniques, 6);
+  f_100_111_100_000_0(uniques, 6);
+  f_100_111_100_000_1(uniques, 6);
+  f_100_111_100_001_0(uniques, 6);
+  f_100_111_100_001_1(uniques, 6);
+  f_100_111_100_010_0(uniques, 6);
+  f_100_111_100_010_1(uniques, 6);
+  f_100_111_100_011_0(uniques, 6);
+  f_100_111_100_011_1(uniques, 6);
+  f_100_111_100_100_0(uniques, 6);
+  f_100_111_100_100_1(uniques, 6);
+  f_100_111_100_101_0(uniques, 6);
+  f_100_111_100_101_1(uniques, 6);
+  f_100_111_100_110_0(uniques, 6);
+  f_100_111_100_110_1(uniques, 6);
+  f_100_111_100_111_0(uniques, 6);
+  f_100_111_100_111_1(uniques, 6);
+  f_100_111_101_000_0(uniques, 6);
+  f_100_111_101_000_1(uniques, 6);
+  f_100_111_101_001_0(uniques, 6);
+  f_100_111_101_001_1(uniques, 6);
+  f_100_111_101_010_0(uniques, 6);
+  f_100_111_101_010_1(uniques, 6);
+  f_100_111_101_011_0(uniques, 6);
+  f_100_111_101_011_1(uniques, 6);
+  f_100_111_101_100_0(uniques, 6);
+  f_100_111_101_100_1(uniques, 6);
+  f_100_111_101_101_0(uniques, 6);
+  f_100_111_101_101_1(uniques, 6);
+  f_100_111_101_110_0(uniques, 6);
+  f_100_111_101_110_1(uniques, 6);
+  f_100_111_101_111_0(uniques, 6);
+  f_100_111_101_111_1(uniques, 6);
+  f_100_111_110_000_0(uniques, 6);
+  f_100_111_110_000_1(uniques, 6);
+  f_100_111_110_001_0(uniques, 6);
+  f_100_111_110_001_1(uniques, 6);
+  f_100_111_110_010_0(uniques, 6);
+  f_100_111_110_010_1(uniques, 6);
+  f_100_111_110_011_0(uniques, 6);
+  f_100_111_110_011_1(uniques, 6);
+  f_100_111_110_100_0(uniques, 6);
+  f_100_111_110_100_1(uniques, 6);
+  f_100_111_110_101_0(uniques, 6);
+  f_100_111_110_101_1(uniques, 6);
+  f_100_111_110_110_0(uniques, 6);
+  f_100_111_110_110_1(uniques, 6);
+  f_100_111_110_111_0(uniques, 6);
+  f_100_111_110_111_1(uniques, 6);
+  f_100_111_111_000_0(uniques, 6);
+  f_100_111_111_000_1(uniques, 6);
+  f_100_111_111_001_0(uniques, 6);
+  f_100_111_111_001_1(uniques, 6);
+  f_100_111_111_010_0(uniques, 6);
+  f_100_111_111_010_1(uniques, 6);
+  f_100_111_111_011_0(uniques, 6);
+  f_100_111_111_011_1(uniques, 6);
+  f_100_111_111_100_0(uniques, 6);
+  f_100_111_111_100_1(uniques, 6);
+  f_100_111_111_101_0(uniques, 6);
+  f_100_111_111_101_1(uniques, 6);
+  f_100_111_111_110_0(uniques, 6);
+  f_100_111_111_110_1(uniques, 6);
+  f_100_111_111_111_0(uniques, 6);
+  f_100_111_111_111_1(uniques, 6);
+  f_101_000_100_000_0(uniques, 6);
+  f_101_000_100_000_1(uniques, 6);
+  f_101_000_100_001_0(uniques, 6);
+  f_101_000_100_001_1(uniques, 6);
+  f_101_000_100_010_0(uniques, 6);
+  f_101_000_100_010_1(uniques, 6);
+  f_101_000_100_011_0(uniques, 6);
+  f_101_000_100_011_1(uniques, 6);
+  f_101_000_100_100_0(uniques, 6);
+  f_101_000_100_100_1(uniques, 6);
+  f_101_000_100_101_0(uniques, 6);
+  f_101_000_100_101_1(uniques, 6);
+  f_101_000_100_110_0(uniques, 6);
+  f_101_000_100_110_1(uniques, 6);
+  f_101_000_100_111_0(uniques, 6);
+  f_101_000_100_111_1(uniques, 6);
+  f_101_000_101_000_0(uniques, 6);
+  f_101_000_101_000_1(uniques, 6);
+  f_101_000_101_001_0(uniques, 6);
+  f_101_000_101_001_1(uniques, 6);
+  f_101_000_101_010_0(uniques, 6);
+  f_101_000_101_010_1(uniques, 6);
+  f_101_000_101_011_0(uniques, 6);
+  f_101_000_101_011_1(uniques, 6);
+  f_101_000_101_100_0(uniques, 6);
+  f_101_000_101_100_1(uniques, 6);
+  f_101_000_101_101_0(uniques, 6);
+  f_101_000_101_101_1(uniques, 6);
+  f_101_000_101_110_0(uniques, 6);
+  f_101_000_101_110_1(uniques, 6);
+  f_101_000_101_111_0(uniques, 6);
+  f_101_000_101_111_1(uniques, 6);
+  f_101_000_110_000_0(uniques, 6);
+  f_101_000_110_000_1(uniques, 6);
+  f_101_000_110_001_0(uniques, 6);
+  f_101_000_110_001_1(uniques, 6);
+  f_101_000_110_010_0(uniques, 6);
+  f_101_000_110_010_1(uniques, 6);
+  f_101_000_110_011_0(uniques, 6);
+  f_101_000_110_011_1(uniques, 6);
+  f_101_000_110_100_0(uniques, 6);
+  f_101_000_110_100_1(uniques, 6);
+  f_101_000_110_101_0(uniques, 6);
+  f_101_000_110_101_1(uniques, 6);
+  f_101_000_110_110_0(uniques, 6);
+  f_101_000_110_110_1(uniques, 6);
+  f_101_000_110_111_0(uniques, 6);
+  f_101_000_110_111_1(uniques, 6);
+  f_101_000_111_000_0(uniques, 6);
+  f_101_000_111_000_1(uniques, 6);
+  f_101_000_111_001_0(uniques, 6);
+  f_101_000_111_001_1(uniques, 6);
+  f_101_000_111_010_0(uniques, 6);
+  f_101_000_111_010_1(uniques, 6);
+  f_101_000_111_011_0(uniques, 6);
+  f_101_000_111_011_1(uniques, 6);
+  f_101_000_111_100_0(uniques, 6);
+  f_101_000_111_100_1(uniques, 6);
+  f_101_000_111_101_0(uniques, 6);
+  f_101_000_111_101_1(uniques, 6);
+  f_101_000_111_110_0(uniques, 6);
+  f_101_000_111_110_1(uniques, 6);
+  f_101_000_111_111_0(uniques, 6);
+  f_101_000_111_111_1(uniques, 6);
+  f_101_001_100_000_0(uniques, 6);
+  f_101_001_100_000_1(uniques, 6);
+  f_101_001_100_001_0(uniques, 6);
+  f_101_001_100_001_1(uniques, 6);
+  f_101_001_100_010_0(uniques, 6);
+  f_101_001_100_010_1(uniques, 6);
+  f_101_001_100_011_0(uniques, 6);
+  f_101_001_100_011_1(uniques, 6);
+  f_101_001_100_100_0(uniques, 6);
+  f_101_001_100_100_1(uniques, 6);
+  f_101_001_100_101_0(uniques, 6);
+  f_101_001_100_101_1(uniques, 6);
+  f_101_001_100_110_0(uniques, 6);
+  f_101_001_100_110_1(uniques, 6);
+  f_101_001_100_111_0(uniques, 6);
+  f_101_001_100_111_1(uniques, 6);
+  f_101_001_101_000_0(uniques, 6);
+  f_101_001_101_000_1(uniques, 6);
+  f_101_001_101_001_0(uniques, 6);
+  f_101_001_101_001_1(uniques, 6);
+  f_101_001_101_010_0(uniques, 6);
+  f_101_001_101_010_1(uniques, 6);
+  f_101_001_101_011_0(uniques, 6);
+  f_101_001_101_011_1(uniques, 6);
+  f_101_001_101_100_0(uniques, 6);
+  f_101_001_101_100_1(uniques, 6);
+  f_101_001_101_101_0(uniques, 6);
+  f_101_001_101_101_1(uniques, 6);
+  f_101_001_101_110_0(uniques, 6);
+  f_101_001_101_110_1(uniques, 6);
+  f_101_001_101_111_0(uniques, 6);
+  f_101_001_101_111_1(uniques, 6);
+  f_101_001_110_000_0(uniques, 6);
+  f_101_001_110_000_1(uniques, 6);
+  f_101_001_110_001_0(uniques, 6);
+  f_101_001_110_001_1(uniques, 6);
+  f_101_001_110_010_0(uniques, 6);
+  f_101_001_110_010_1(uniques, 6);
+  f_101_001_110_011_0(uniques, 6);
+  f_101_001_110_011_1(uniques, 6);
+  f_101_001_110_100_0(uniques, 6);
+  f_101_001_110_100_1(uniques, 6);
+  f_101_001_110_101_0(uniques, 6);
+  f_101_001_110_101_1(uniques, 6);
+  f_101_001_110_110_0(uniques, 6);
+  f_101_001_110_110_1(uniques, 6);
+  f_101_001_110_111_0(uniques, 6);
+  f_101_001_110_111_1(uniques, 6);
+  f_101_001_111_000_0(uniques, 6);
+  f_101_001_111_000_1(uniques, 6);
+  f_101_001_111_001_0(uniques, 6);
+  f_101_001_111_001_1(uniques, 6);
+  f_101_001_111_010_0(uniques, 6);
+  f_101_001_111_010_1(uniques, 6);
+  f_101_001_111_011_0(uniques, 6);
+  f_101_001_111_011_1(uniques, 6);
+  f_101_001_111_100_0(uniques, 6);
+  f_101_001_111_100_1(uniques, 6);
+  f_101_001_111_101_0(uniques, 6);
+  f_101_001_111_101_1(uniques, 6);
+  f_101_001_111_110_0(uniques, 6);
+  f_101_001_111_110_1(uniques, 6);
+  f_101_001_111_111_0(uniques, 6);
+  f_101_001_111_111_1(uniques, 6);
+  f_101_010_100_000_0(uniques, 6);
+  f_101_010_100_000_1(uniques, 6);
+  f_101_010_100_001_0(uniques, 6);
+  f_101_010_100_001_1(uniques, 6);
+  f_101_010_100_010_0(uniques, 6);
+  f_101_010_100_010_1(uniques, 6);
+  f_101_010_100_011_0(uniques, 6);
+  f_101_010_100_011_1(uniques, 6);
+  f_101_010_100_100_0(uniques, 6);
+  f_101_010_100_100_1(uniques, 6);
+  f_101_010_100_101_0(uniques, 6);
+  f_101_010_100_101_1(uniques, 6);
+  f_101_010_100_110_0(uniques, 6);
+  f_101_010_100_110_1(uniques, 6);
+  f_101_010_100_111_0(uniques, 6);
+  f_101_010_100_111_1(uniques, 6);
+  f_101_010_101_000_0(uniques, 6);
+  f_101_010_101_000_1(uniques, 6);
+  f_101_010_101_001_0(uniques, 6);
+  f_101_010_101_001_1(uniques, 6);
+  f_101_010_101_010_0(uniques, 6);
+  f_101_010_101_010_1(uniques, 6);
+  f_101_010_101_011_0(uniques, 6);
+  f_101_010_101_011_1(uniques, 6);
+  f_101_010_101_100_0(uniques, 6);
+  f_101_010_101_100_1(uniques, 6);
+  f_101_010_101_101_0(uniques, 6);
+  f_101_010_101_101_1(uniques, 6);
+  f_101_010_101_110_0(uniques, 6);
+  f_101_010_101_110_1(uniques, 6);
+  f_101_010_101_111_0(uniques, 6);
+  f_101_010_101_111_1(uniques, 6);
+  f_101_010_110_000_0(uniques, 6);
+  f_101_010_110_000_1(uniques, 6);
+  f_101_010_110_001_0(uniques, 6);
+  f_101_010_110_001_1(uniques, 6);
+  f_101_010_110_010_0(uniques, 6);
+  f_101_010_110_010_1(uniques, 6);
+  f_101_010_110_011_0(uniques, 6);
+  f_101_010_110_011_1(uniques, 6);
+  f_101_010_110_100_0(uniques, 6);
+  f_101_010_110_100_1(uniques, 6);
+  f_101_010_110_101_0(uniques, 6);
+  f_101_010_110_101_1(uniques, 6);
+  f_101_010_110_110_0(uniques, 6);
+  f_101_010_110_110_1(uniques, 6);
+  f_101_010_110_111_0(uniques, 6);
+  f_101_010_110_111_1(uniques, 6);
+  f_101_010_111_000_0(uniques, 6);
+  f_101_010_111_000_1(uniques, 6);
+  f_101_010_111_001_0(uniques, 6);
+  f_101_010_111_001_1(uniques, 6);
+  f_101_010_111_010_0(uniques, 6);
+  f_101_010_111_010_1(uniques, 6);
+  f_101_010_111_011_0(uniques, 6);
+  f_101_010_111_011_1(uniques, 6);
+  f_101_010_111_100_0(uniques, 6);
+  f_101_010_111_100_1(uniques, 6);
+  f_101_010_111_101_0(uniques, 6);
+  f_101_010_111_101_1(uniques, 6);
+  f_101_010_111_110_0(uniques, 6);
+  f_101_010_111_110_1(uniques, 6);
+  f_101_010_111_111_0(uniques, 6);
+  f_101_010_111_111_1(uniques, 6);
+  f_101_011_100_000_0(uniques, 6);
+  f_101_011_100_000_1(uniques, 6);
+  f_101_011_100_001_0(uniques, 6);
+  f_101_011_100_001_1(uniques, 6);
+  f_101_011_100_010_0(uniques, 6);
+  f_101_011_100_010_1(uniques, 6);
+  f_101_011_100_011_0(uniques, 6);
+  f_101_011_100_011_1(uniques, 6);
+  f_101_011_100_100_0(uniques, 6);
+  f_101_011_100_100_1(uniques, 6);
+  f_101_011_100_101_0(uniques, 6);
+  f_101_011_100_101_1(uniques, 6);
+  f_101_011_100_110_0(uniques, 6);
+  f_101_011_100_110_1(uniques, 6);
+  f_101_011_100_111_0(uniques, 6);
+  f_101_011_100_111_1(uniques, 6);
+  f_101_011_101_000_0(uniques, 6);
+  f_101_011_101_000_1(uniques, 6);
+  f_101_011_101_001_0(uniques, 6);
+  f_101_011_101_001_1(uniques, 6);
+  f_101_011_101_010_0(uniques, 6);
+  f_101_011_101_010_1(uniques, 6);
+  f_101_011_101_011_0(uniques, 6);
+  f_101_011_101_011_1(uniques, 6);
+  f_101_011_101_100_0(uniques, 6);
+  f_101_011_101_100_1(uniques, 6);
+  f_101_011_101_101_0(uniques, 6);
+  f_101_011_101_101_1(uniques, 6);
+  f_101_011_101_110_0(uniques, 6);
+  f_101_011_101_110_1(uniques, 6);
+  f_101_011_101_111_0(uniques, 6);
+  f_101_011_101_111_1(uniques, 6);
+  f_101_011_110_000_0(uniques, 6);
+  f_101_011_110_000_1(uniques, 6);
+  f_101_011_110_001_0(uniques, 6);
+  f_101_011_110_001_1(uniques, 6);
+  f_101_011_110_010_0(uniques, 6);
+  f_101_011_110_010_1(uniques, 6);
+  f_101_011_110_011_0(uniques, 6);
+  f_101_011_110_011_1(uniques, 6);
+  f_101_011_110_100_0(uniques, 6);
+  f_101_011_110_100_1(uniques, 6);
+  f_101_011_110_101_0(uniques, 6);
+  f_101_011_110_101_1(uniques, 6);
+  f_101_011_110_110_0(uniques, 6);
+  f_101_011_110_110_1(uniques, 6);
+  f_101_011_110_111_0(uniques, 6);
+  f_101_011_110_111_1(uniques, 6);
+  f_101_011_111_000_0(uniques, 6);
+  f_101_011_111_000_1(uniques, 6);
+  f_101_011_111_001_0(uniques, 6);
+  f_101_011_111_001_1(uniques, 6);
+  f_101_011_111_010_0(uniques, 6);
+  f_101_011_111_010_1(uniques, 6);
+  f_101_011_111_011_0(uniques, 6);
+  f_101_011_111_011_1(uniques, 6);
+  f_101_011_111_100_0(uniques, 6);
+  f_101_011_111_100_1(uniques, 6);
+  f_101_011_111_101_0(uniques, 6);
+  f_101_011_111_101_1(uniques, 6);
+  f_101_011_111_110_0(uniques, 6);
+  f_101_011_111_110_1(uniques, 6);
+  f_101_011_111_111_0(uniques, 6);
+  f_101_011_111_111_1(uniques, 6);
+  f_101_100_100_000_0(uniques, 6);
+  f_101_100_100_000_1(uniques, 6);
+  f_101_100_100_001_0(uniques, 6);
+  f_101_100_100_001_1(uniques, 6);
+  f_101_100_100_010_0(uniques, 6);
+  f_101_100_100_010_1(uniques, 6);
+  f_101_100_100_011_0(uniques, 6);
+  f_101_100_100_011_1(uniques, 6);
+  f_101_100_100_100_0(uniques, 6);
+  f_101_100_100_100_1(uniques, 6);
+  f_101_100_100_101_0(uniques, 6);
+  f_101_100_100_101_1(uniques, 6);
+  f_101_100_100_110_0(uniques, 6);
+  f_101_100_100_110_1(uniques, 6);
+  f_101_100_100_111_0(uniques, 6);
+  f_101_100_100_111_1(uniques, 6);
+  f_101_100_101_000_0(uniques, 6);
+  f_101_100_101_000_1(uniques, 6);
+  f_101_100_101_001_0(uniques, 6);
+  f_101_100_101_001_1(uniques, 6);
+  f_101_100_101_010_0(uniques, 6);
+  f_101_100_101_010_1(uniques, 6);
+  f_101_100_101_011_0(uniques, 6);
+  f_101_100_101_011_1(uniques, 6);
+  f_101_100_101_100_0(uniques, 6);
+  f_101_100_101_100_1(uniques, 6);
+  f_101_100_101_101_0(uniques, 6);
+  f_101_100_101_101_1(uniques, 6);
+  f_101_100_101_110_0(uniques, 6);
+  f_101_100_101_110_1(uniques, 6);
+  f_101_100_101_111_0(uniques, 6);
+  f_101_100_101_111_1(uniques, 6);
+  f_101_100_110_000_0(uniques, 6);
+  f_101_100_110_000_1(uniques, 6);
+  f_101_100_110_001_0(uniques, 6);
+  f_101_100_110_001_1(uniques, 6);
+  f_101_100_110_010_0(uniques, 6);
+  f_101_100_110_010_1(uniques, 6);
+  f_101_100_110_011_0(uniques, 6);
+  f_101_100_110_011_1(uniques, 6);
+  f_101_100_110_100_0(uniques, 6);
+  f_101_100_110_100_1(uniques, 6);
+  f_101_100_110_101_0(uniques, 6);
+  f_101_100_110_101_1(uniques, 6);
+  f_101_100_110_110_0(uniques, 6);
+  f_101_100_110_110_1(uniques, 6);
+  f_101_100_110_111_0(uniques, 6);
+  f_101_100_110_111_1(uniques, 6);
+  f_101_100_111_000_0(uniques, 6);
+  f_101_100_111_000_1(uniques, 6);
+  f_101_100_111_001_0(uniques, 6);
+  f_101_100_111_001_1(uniques, 6);
+  f_101_100_111_010_0(uniques, 6);
+  f_101_100_111_010_1(uniques, 6);
+  f_101_100_111_011_0(uniques, 6);
+  f_101_100_111_011_1(uniques, 6);
+  f_101_100_111_100_0(uniques, 6);
+  f_101_100_111_100_1(uniques, 6);
+  f_101_100_111_101_0(uniques, 6);
+  f_101_100_111_101_1(uniques, 6);
+  f_101_100_111_110_0(uniques, 6);
+  f_101_100_111_110_1(uniques, 6);
+  f_101_100_111_111_0(uniques, 6);
+  f_101_100_111_111_1(uniques, 6);
+  f_101_101_100_000_0(uniques, 6);
+  f_101_101_100_000_1(uniques, 6);
+  f_101_101_100_001_0(uniques, 6);
+  f_101_101_100_001_1(uniques, 6);
+  f_101_101_100_010_0(uniques, 6);
+  f_101_101_100_010_1(uniques, 6);
+  f_101_101_100_011_0(uniques, 6);
+  f_101_101_100_011_1(uniques, 6);
+  f_101_101_100_100_0(uniques, 6);
+  f_101_101_100_100_1(uniques, 6);
+  f_101_101_100_101_0(uniques, 6);
+  f_101_101_100_101_1(uniques, 6);
+  f_101_101_100_110_0(uniques, 6);
+  f_101_101_100_110_1(uniques, 6);
+  f_101_101_100_111_0(uniques, 6);
+  f_101_101_100_111_1(uniques, 6);
+  f_101_101_101_000_0(uniques, 6);
+  f_101_101_101_000_1(uniques, 6);
+  f_101_101_101_001_0(uniques, 6);
+  f_101_101_101_001_1(uniques, 6);
+  f_101_101_101_010_0(uniques, 6);
+  f_101_101_101_010_1(uniques, 6);
+  f_101_101_101_011_0(uniques, 6);
+  f_101_101_101_011_1(uniques, 6);
+  f_101_101_101_100_0(uniques, 6);
+  f_101_101_101_100_1(uniques, 6);
+  f_101_101_101_101_0(uniques, 6);
+  f_101_101_101_101_1(uniques, 6);
+  f_101_101_101_110_0(uniques, 6);
+  f_101_101_101_110_1(uniques, 6);
+  f_101_101_101_111_0(uniques, 6);
+  f_101_101_101_111_1(uniques, 6);
+  f_101_101_110_000_0(uniques, 6);
+  f_101_101_110_000_1(uniques, 6);
+  f_101_101_110_001_0(uniques, 6);
+  f_101_101_110_001_1(uniques, 6);
+  f_101_101_110_010_0(uniques, 6);
+  f_101_101_110_010_1(uniques, 6);
+  f_101_101_110_011_0(uniques, 6);
+  f_101_101_110_011_1(uniques, 6);
+  f_101_101_110_100_0(uniques, 6);
+  f_101_101_110_100_1(uniques, 6);
+  f_101_101_110_101_0(uniques, 6);
+  f_101_101_110_101_1(uniques, 6);
+  f_101_101_110_110_0(uniques, 6);
+  f_101_101_110_110_1(uniques, 6);
+  f_101_101_110_111_0(uniques, 6);
+  f_101_101_110_111_1(uniques, 6);
+  f_101_101_111_000_0(uniques, 6);
+  f_101_101_111_000_1(uniques, 6);
+  f_101_101_111_001_0(uniques, 6);
+  f_101_101_111_001_1(uniques, 6);
+  f_101_101_111_010_0(uniques, 6);
+  f_101_101_111_010_1(uniques, 6);
+  f_101_101_111_011_0(uniques, 6);
+  f_101_101_111_011_1(uniques, 6);
+  f_101_101_111_100_0(uniques, 6);
+  f_101_101_111_100_1(uniques, 6);
+  f_101_101_111_101_0(uniques, 6);
+  f_101_101_111_101_1(uniques, 6);
+  f_101_101_111_110_0(uniques, 6);
+  f_101_101_111_110_1(uniques, 6);
+  f_101_101_111_111_0(uniques, 6);
+  f_101_101_111_111_1(uniques, 6);
+  f_101_110_100_000_0(uniques, 6);
+  f_101_110_100_000_1(uniques, 6);
+  f_101_110_100_001_0(uniques, 6);
+  f_101_110_100_001_1(uniques, 6);
+  f_101_110_100_010_0(uniques, 6);
+  f_101_110_100_010_1(uniques, 6);
+  f_101_110_100_011_0(uniques, 6);
+  f_101_110_100_011_1(uniques, 6);
+  f_101_110_100_100_0(uniques, 6);
+  f_101_110_100_100_1(uniques, 6);
+  f_101_110_100_101_0(uniques, 6);
+  f_101_110_100_101_1(uniques, 6);
+  f_101_110_100_110_0(uniques, 6);
+  f_101_110_100_110_1(uniques, 6);
+  f_101_110_100_111_0(uniques, 6);
+  f_101_110_100_111_1(uniques, 6);
+  f_101_110_101_000_0(uniques, 6);
+  f_101_110_101_000_1(uniques, 6);
+  f_101_110_101_001_0(uniques, 6);
+  f_101_110_101_001_1(uniques, 6);
+  f_101_110_101_010_0(uniques, 6);
+  f_101_110_101_010_1(uniques, 6);
+  f_101_110_101_011_0(uniques, 6);
+  f_101_110_101_011_1(uniques, 6);
+  f_101_110_101_100_0(uniques, 6);
+  f_101_110_101_100_1(uniques, 6);
+  f_101_110_101_101_0(uniques, 6);
+  f_101_110_101_101_1(uniques, 6);
+  f_101_110_101_110_0(uniques, 6);
+  f_101_110_101_110_1(uniques, 6);
+  f_101_110_101_111_0(uniques, 6);
+  f_101_110_101_111_1(uniques, 6);
+  f_101_110_110_000_0(uniques, 6);
+  f_101_110_110_000_1(uniques, 6);
+  f_101_110_110_001_0(uniques, 6);
+  f_101_110_110_001_1(uniques, 6);
+  f_101_110_110_010_0(uniques, 6);
+  f_101_110_110_010_1(uniques, 6);
+  f_101_110_110_011_0(uniques, 6);
+  f_101_110_110_011_1(uniques, 6);
+  f_101_110_110_100_0(uniques, 6);
+  f_101_110_110_100_1(uniques, 6);
+  f_101_110_110_101_0(uniques, 6);
+  f_101_110_110_101_1(uniques, 6);
+  f_101_110_110_110_0(uniques, 6);
+  f_101_110_110_110_1(uniques, 6);
+  f_101_110_110_111_0(uniques, 6);
+  f_101_110_110_111_1(uniques, 6);
+  f_101_110_111_000_0(uniques, 6);
+  f_101_110_111_000_1(uniques, 6);
+  f_101_110_111_001_0(uniques, 6);
+  f_101_110_111_001_1(uniques, 6);
+  f_101_110_111_010_0(uniques, 6);
+  f_101_110_111_010_1(uniques, 6);
+  f_101_110_111_011_0(uniques, 6);
+  f_101_110_111_011_1(uniques, 6);
+  f_101_110_111_100_0(uniques, 6);
+  f_101_110_111_100_1(uniques, 6);
+  f_101_110_111_101_0(uniques, 6);
+  f_101_110_111_101_1(uniques, 6);
+  f_101_110_111_110_0(uniques, 6);
+  f_101_110_111_110_1(uniques, 6);
+  f_101_110_111_111_0(uniques, 6);
+  f_101_110_111_111_1(uniques, 6);
+  f_101_111_100_000_0(uniques, 6);
+  f_101_111_100_000_1(uniques, 6);
+  f_101_111_100_001_0(uniques, 6);
+  f_101_111_100_001_1(uniques, 6);
+  f_101_111_100_010_0(uniques, 6);
+  f_101_111_100_010_1(uniques, 6);
+  f_101_111_100_011_0(uniques, 6);
+  f_101_111_100_011_1(uniques, 6);
+  f_101_111_100_100_0(uniques, 6);
+  f_101_111_100_100_1(uniques, 6);
+  f_101_111_100_101_0(uniques, 6);
+  f_101_111_100_101_1(uniques, 6);
+  f_101_111_100_110_0(uniques, 6);
+  f_101_111_100_110_1(uniques, 6);
+  f_101_111_100_111_0(uniques, 6);
+  f_101_111_100_111_1(uniques, 6);
+  f_101_111_101_000_0(uniques, 6);
+  f_101_111_101_000_1(uniques, 6);
+  f_101_111_101_001_0(uniques, 6);
+  f_101_111_101_001_1(uniques, 6);
+  f_101_111_101_010_0(uniques, 6);
+  f_101_111_101_010_1(uniques, 6);
+  f_101_111_101_011_0(uniques, 6);
+  f_101_111_101_011_1(uniques, 6);
+  f_101_111_101_100_0(uniques, 6);
+  f_101_111_101_100_1(uniques, 6);
+  f_101_111_101_101_0(uniques, 6);
+  f_101_111_101_101_1(uniques, 6);
+  f_101_111_101_110_0(uniques, 6);
+  f_101_111_101_110_1(uniques, 6);
+  f_101_111_101_111_0(uniques, 6);
+  f_101_111_101_111_1(uniques, 6);
+  f_101_111_110_000_0(uniques, 6);
+  f_101_111_110_000_1(uniques, 6);
+  f_101_111_110_001_0(uniques, 6);
+  f_101_111_110_001_1(uniques, 6);
+  f_101_111_110_010_0(uniques, 6);
+  f_101_111_110_010_1(uniques, 6);
+  f_101_111_110_011_0(uniques, 6);
+  f_101_111_110_011_1(uniques, 6);
+  f_101_111_110_100_0(uniques, 6);
+  f_101_111_110_100_1(uniques, 6);
+  f_101_111_110_101_0(uniques, 6);
+  f_101_111_110_101_1(uniques, 6);
+  f_101_111_110_110_0(uniques, 6);
+  f_101_111_110_110_1(uniques, 6);
+  f_101_111_110_111_0(uniques, 6);
+  f_101_111_110_111_1(uniques, 6);
+  f_101_111_111_000_0(uniques, 6);
+  f_101_111_111_000_1(uniques, 6);
+  f_101_111_111_001_0(uniques, 6);
+  f_101_111_111_001_1(uniques, 6);
+  f_101_111_111_010_0(uniques, 6);
+  f_101_111_111_010_1(uniques, 6);
+  f_101_111_111_011_0(uniques, 6);
+  f_101_111_111_011_1(uniques, 6);
+  f_101_111_111_100_0(uniques, 6);
+  f_101_111_111_100_1(uniques, 6);
+  f_101_111_111_101_0(uniques, 6);
+  f_101_111_111_101_1(uniques, 6);
+  f_101_111_111_110_0(uniques, 6);
+  f_101_111_111_110_1(uniques, 6);
+  f_101_111_111_111_0(uniques, 6);
+  f_101_111_111_111_1(uniques, 6);
+  f_110_000_100_000_0(uniques, 6);
+  f_110_000_100_000_1(uniques, 6);
+  f_110_000_100_001_0(uniques, 6);
+  f_110_000_100_001_1(uniques, 6);
+  f_110_000_100_010_0(uniques, 6);
+  f_110_000_100_010_1(uniques, 6);
+  f_110_000_100_011_0(uniques, 6);
+  f_110_000_100_011_1(uniques, 6);
+  f_110_000_100_100_0(uniques, 6);
+  f_110_000_100_100_1(uniques, 6);
+  f_110_000_100_101_0(uniques, 6);
+  f_110_000_100_101_1(uniques, 6);
+  f_110_000_100_110_0(uniques, 6);
+  f_110_000_100_110_1(uniques, 6);
+  f_110_000_100_111_0(uniques, 6);
+  f_110_000_100_111_1(uniques, 6);
+  f_110_000_101_000_0(uniques, 6);
+  f_110_000_101_000_1(uniques, 6);
+  f_110_000_101_001_0(uniques, 6);
+  f_110_000_101_001_1(uniques, 6);
+  f_110_000_101_010_0(uniques, 6);
+  f_110_000_101_010_1(uniques, 6);
+  f_110_000_101_011_0(uniques, 6);
+  f_110_000_101_011_1(uniques, 6);
+  f_110_000_101_100_0(uniques, 6);
+  f_110_000_101_100_1(uniques, 6);
+  f_110_000_101_101_0(uniques, 6);
+  f_110_000_101_101_1(uniques, 6);
+  f_110_000_101_110_0(uniques, 6);
+  f_110_000_101_110_1(uniques, 6);
+  f_110_000_101_111_0(uniques, 6);
+  f_110_000_101_111_1(uniques, 6);
+  f_110_000_110_000_0(uniques, 6);
+  f_110_000_110_000_1(uniques, 6);
+  f_110_000_110_001_0(uniques, 6);
+  f_110_000_110_001_1(uniques, 6);
+  f_110_000_110_010_0(uniques, 6);
+  f_110_000_110_010_1(uniques, 6);
+  f_110_000_110_011_0(uniques, 6);
+  f_110_000_110_011_1(uniques, 6);
+  f_110_000_110_100_0(uniques, 6);
+  f_110_000_110_100_1(uniques, 6);
+  f_110_000_110_101_0(uniques, 6);
+  f_110_000_110_101_1(uniques, 6);
+  f_110_000_110_110_0(uniques, 6);
+  f_110_000_110_110_1(uniques, 6);
+  f_110_000_110_111_0(uniques, 6);
+  f_110_000_110_111_1(uniques, 6);
+  f_110_000_111_000_0(uniques, 6);
+  f_110_000_111_000_1(uniques, 6);
+  f_110_000_111_001_0(uniques, 6);
+  f_110_000_111_001_1(uniques, 6);
+  f_110_000_111_010_0(uniques, 6);
+  f_110_000_111_010_1(uniques, 6);
+  f_110_000_111_011_0(uniques, 6);
+  f_110_000_111_011_1(uniques, 6);
+  f_110_000_111_100_0(uniques, 6);
+  f_110_000_111_100_1(uniques, 6);
+  f_110_000_111_101_0(uniques, 6);
+  f_110_000_111_101_1(uniques, 6);
+  f_110_000_111_110_0(uniques, 6);
+  f_110_000_111_110_1(uniques, 6);
+  f_110_000_111_111_0(uniques, 6);
+  f_110_000_111_111_1(uniques, 6);
+  f_110_001_100_000_0(uniques, 6);
+  f_110_001_100_000_1(uniques, 6);
+  f_110_001_100_001_0(uniques, 6);
+  f_110_001_100_001_1(uniques, 6);
+  f_110_001_100_010_0(uniques, 6);
+  f_110_001_100_010_1(uniques, 6);
+  f_110_001_100_011_0(uniques, 6);
+  f_110_001_100_011_1(uniques, 6);
+  f_110_001_100_100_0(uniques, 6);
+  f_110_001_100_100_1(uniques, 6);
+  f_110_001_100_101_0(uniques, 6);
+  f_110_001_100_101_1(uniques, 6);
+  f_110_001_100_110_0(uniques, 6);
+  f_110_001_100_110_1(uniques, 6);
+  f_110_001_100_111_0(uniques, 6);
+  f_110_001_100_111_1(uniques, 6);
+  f_110_001_101_000_0(uniques, 6);
+  f_110_001_101_000_1(uniques, 6);
+  f_110_001_101_001_0(uniques, 6);
+  f_110_001_101_001_1(uniques, 6);
+  f_110_001_101_010_0(uniques, 6);
+  f_110_001_101_010_1(uniques, 6);
+  f_110_001_101_011_0(uniques, 6);
+  f_110_001_101_011_1(uniques, 6);
+  f_110_001_101_100_0(uniques, 6);
+  f_110_001_101_100_1(uniques, 6);
+  f_110_001_101_101_0(uniques, 6);
+  f_110_001_101_101_1(uniques, 6);
+  f_110_001_101_110_0(uniques, 6);
+  f_110_001_101_110_1(uniques, 6);
+  f_110_001_101_111_0(uniques, 6);
+  f_110_001_101_111_1(uniques, 6);
+  f_110_001_110_000_0(uniques, 6);
+  f_110_001_110_000_1(uniques, 6);
+  f_110_001_110_001_0(uniques, 6);
+  f_110_001_110_001_1(uniques, 6);
+  f_110_001_110_010_0(uniques, 6);
+  f_110_001_110_010_1(uniques, 6);
+  f_110_001_110_011_0(uniques, 6);
+  f_110_001_110_011_1(uniques, 6);
+  f_110_001_110_100_0(uniques, 6);
+  f_110_001_110_100_1(uniques, 6);
+  f_110_001_110_101_0(uniques, 6);
+  f_110_001_110_101_1(uniques, 6);
+  f_110_001_110_110_0(uniques, 6);
+  f_110_001_110_110_1(uniques, 6);
+  f_110_001_110_111_0(uniques, 6);
+  f_110_001_110_111_1(uniques, 6);
+  f_110_001_111_000_0(uniques, 6);
+  f_110_001_111_000_1(uniques, 6);
+  f_110_001_111_001_0(uniques, 6);
+  f_110_001_111_001_1(uniques, 6);
+  f_110_001_111_010_0(uniques, 6);
+  f_110_001_111_010_1(uniques, 6);
+  f_110_001_111_011_0(uniques, 6);
+  f_110_001_111_011_1(uniques, 6);
+  f_110_001_111_100_0(uniques, 6);
+  f_110_001_111_100_1(uniques, 6);
+  f_110_001_111_101_0(uniques, 6);
+  f_110_001_111_101_1(uniques, 6);
+  f_110_001_111_110_0(uniques, 6);
+  f_110_001_111_110_1(uniques, 6);
+  f_110_001_111_111_0(uniques, 6);
+  f_110_001_111_111_1(uniques, 6);
+  f_110_010_100_000_0(uniques, 6);
+  f_110_010_100_000_1(uniques, 6);
+  f_110_010_100_001_0(uniques, 6);
+  f_110_010_100_001_1(uniques, 6);
+  f_110_010_100_010_0(uniques, 6);
+  f_110_010_100_010_1(uniques, 6);
+  f_110_010_100_011_0(uniques, 6);
+  f_110_010_100_011_1(uniques, 6);
+  f_110_010_100_100_0(uniques, 6);
+  f_110_010_100_100_1(uniques, 6);
+  f_110_010_100_101_0(uniques, 6);
+  f_110_010_100_101_1(uniques, 6);
+  f_110_010_100_110_0(uniques, 6);
+  f_110_010_100_110_1(uniques, 6);
+  f_110_010_100_111_0(uniques, 6);
+  f_110_010_100_111_1(uniques, 6);
+  f_110_010_101_000_0(uniques, 6);
+  f_110_010_101_000_1(uniques, 6);
+  f_110_010_101_001_0(uniques, 6);
+  f_110_010_101_001_1(uniques, 6);
+  f_110_010_101_010_0(uniques, 6);
+  f_110_010_101_010_1(uniques, 6);
+  f_110_010_101_011_0(uniques, 6);
+  f_110_010_101_011_1(uniques, 6);
+  f_110_010_101_100_0(uniques, 6);
+  f_110_010_101_100_1(uniques, 6);
+  f_110_010_101_101_0(uniques, 6);
+  f_110_010_101_101_1(uniques, 6);
+  f_110_010_101_110_0(uniques, 6);
+  f_110_010_101_110_1(uniques, 6);
+  f_110_010_101_111_0(uniques, 6);
+  f_110_010_101_111_1(uniques, 6);
+  f_110_010_110_000_0(uniques, 6);
+  f_110_010_110_000_1(uniques, 6);
+  f_110_010_110_001_0(uniques, 6);
+  f_110_010_110_001_1(uniques, 6);
+  f_110_010_110_010_0(uniques, 6);
+  f_110_010_110_010_1(uniques, 6);
+  f_110_010_110_011_0(uniques, 6);
+  f_110_010_110_011_1(uniques, 6);
+  f_110_010_110_100_0(uniques, 6);
+  f_110_010_110_100_1(uniques, 6);
+  f_110_010_110_101_0(uniques, 6);
+  f_110_010_110_101_1(uniques, 6);
+  f_110_010_110_110_0(uniques, 6);
+  f_110_010_110_110_1(uniques, 6);
+  f_110_010_110_111_0(uniques, 6);
+  f_110_010_110_111_1(uniques, 6);
+  f_110_010_111_000_0(uniques, 6);
+  f_110_010_111_000_1(uniques, 6);
+  f_110_010_111_001_0(uniques, 6);
+  f_110_010_111_001_1(uniques, 6);
+  f_110_010_111_010_0(uniques, 6);
+  f_110_010_111_010_1(uniques, 6);
+  f_110_010_111_011_0(uniques, 6);
+  f_110_010_111_011_1(uniques, 6);
+  f_110_010_111_100_0(uniques, 6);
+  f_110_010_111_100_1(uniques, 6);
+  f_110_010_111_101_0(uniques, 6);
+  f_110_010_111_101_1(uniques, 6);
+  f_110_010_111_110_0(uniques, 6);
+  f_110_010_111_110_1(uniques, 6);
+  f_110_010_111_111_0(uniques, 6);
+  f_110_010_111_111_1(uniques, 6);
+  f_110_011_100_000_0(uniques, 6);
+  f_110_011_100_000_1(uniques, 6);
+  f_110_011_100_001_0(uniques, 6);
+  f_110_011_100_001_1(uniques, 6);
+  f_110_011_100_010_0(uniques, 6);
+  f_110_011_100_010_1(uniques, 6);
+  f_110_011_100_011_0(uniques, 6);
+  f_110_011_100_011_1(uniques, 6);
+  f_110_011_100_100_0(uniques, 6);
+  f_110_011_100_100_1(uniques, 6);
+  f_110_011_100_101_0(uniques, 6);
+  f_110_011_100_101_1(uniques, 6);
+  f_110_011_100_110_0(uniques, 6);
+  f_110_011_100_110_1(uniques, 6);
+  f_110_011_100_111_0(uniques, 6);
+  f_110_011_100_111_1(uniques, 6);
+  f_110_011_101_000_0(uniques, 6);
+  f_110_011_101_000_1(uniques, 6);
+  f_110_011_101_001_0(uniques, 6);
+  f_110_011_101_001_1(uniques, 6);
+  f_110_011_101_010_0(uniques, 6);
+  f_110_011_101_010_1(uniques, 6);
+  f_110_011_101_011_0(uniques, 6);
+  f_110_011_101_011_1(uniques, 6);
+  f_110_011_101_100_0(uniques, 6);
+  f_110_011_101_100_1(uniques, 6);
+  f_110_011_101_101_0(uniques, 6);
+  f_110_011_101_101_1(uniques, 6);
+  f_110_011_101_110_0(uniques, 6);
+  f_110_011_101_110_1(uniques, 6);
+  f_110_011_101_111_0(uniques, 6);
+  f_110_011_101_111_1(uniques, 6);
+  f_110_011_110_000_0(uniques, 6);
+  f_110_011_110_000_1(uniques, 6);
+  f_110_011_110_001_0(uniques, 6);
+  f_110_011_110_001_1(uniques, 6);
+  f_110_011_110_010_0(uniques, 6);
+  f_110_011_110_010_1(uniques, 6);
+  f_110_011_110_011_0(uniques, 6);
+  f_110_011_110_011_1(uniques, 6);
+  f_110_011_110_100_0(uniques, 6);
+  f_110_011_110_100_1(uniques, 6);
+  f_110_011_110_101_0(uniques, 6);
+  f_110_011_110_101_1(uniques, 6);
+  f_110_011_110_110_0(uniques, 6);
+  f_110_011_110_110_1(uniques, 6);
+  f_110_011_110_111_0(uniques, 6);
+  f_110_011_110_111_1(uniques, 6);
+  f_110_011_111_000_0(uniques, 6);
+  f_110_011_111_000_1(uniques, 6);
+  f_110_011_111_001_0(uniques, 6);
+  f_110_011_111_001_1(uniques, 6);
+  f_110_011_111_010_0(uniques, 6);
+  f_110_011_111_010_1(uniques, 6);
+  f_110_011_111_011_0(uniques, 6);
+  f_110_011_111_011_1(uniques, 6);
+  f_110_011_111_100_0(uniques, 6);
+  f_110_011_111_100_1(uniques, 6);
+  f_110_011_111_101_0(uniques, 6);
+  f_110_011_111_101_1(uniques, 6);
+  f_110_011_111_110_0(uniques, 6);
+  f_110_011_111_110_1(uniques, 6);
+  f_110_011_111_111_0(uniques, 6);
+  f_110_011_111_111_1(uniques, 6);
+  f_110_100_100_000_0(uniques, 6);
+  f_110_100_100_000_1(uniques, 6);
+  f_110_100_100_001_0(uniques, 6);
+  f_110_100_100_001_1(uniques, 6);
+  f_110_100_100_010_0(uniques, 6);
+  f_110_100_100_010_1(uniques, 6);
+  f_110_100_100_011_0(uniques, 6);
+  f_110_100_100_011_1(uniques, 6);
+  f_110_100_100_100_0(uniques, 6);
+  f_110_100_100_100_1(uniques, 6);
+  f_110_100_100_101_0(uniques, 6);
+  f_110_100_100_101_1(uniques, 6);
+  f_110_100_100_110_0(uniques, 6);
+  f_110_100_100_110_1(uniques, 6);
+  f_110_100_100_111_0(uniques, 6);
+  f_110_100_100_111_1(uniques, 6);
+  f_110_100_101_000_0(uniques, 6);
+  f_110_100_101_000_1(uniques, 6);
+  f_110_100_101_001_0(uniques, 6);
+  f_110_100_101_001_1(uniques, 6);
+  f_110_100_101_010_0(uniques, 6);
+  f_110_100_101_010_1(uniques, 6);
+  f_110_100_101_011_0(uniques, 6);
+  f_110_100_101_011_1(uniques, 6);
+  f_110_100_101_100_0(uniques, 6);
+  f_110_100_101_100_1(uniques, 6);
+  f_110_100_101_101_0(uniques, 6);
+  f_110_100_101_101_1(uniques, 6);
+  f_110_100_101_110_0(uniques, 6);
+  f_110_100_101_110_1(uniques, 6);
+  f_110_100_101_111_0(uniques, 6);
+  f_110_100_101_111_1(uniques, 6);
+  f_110_100_110_000_0(uniques, 6);
+  f_110_100_110_000_1(uniques, 6);
+  f_110_100_110_001_0(uniques, 6);
+  f_110_100_110_001_1(uniques, 6);
+  f_110_100_110_010_0(uniques, 6);
+  f_110_100_110_010_1(uniques, 6);
+  f_110_100_110_011_0(uniques, 6);
+  f_110_100_110_011_1(uniques, 6);
+  f_110_100_110_100_0(uniques, 6);
+  f_110_100_110_100_1(uniques, 6);
+  f_110_100_110_101_0(uniques, 6);
+  f_110_100_110_101_1(uniques, 6);
+  f_110_100_110_110_0(uniques, 6);
+  f_110_100_110_110_1(uniques, 6);
+  f_110_100_110_111_0(uniques, 6);
+  f_110_100_110_111_1(uniques, 6);
+  f_110_100_111_000_0(uniques, 6);
+  f_110_100_111_000_1(uniques, 6);
+  f_110_100_111_001_0(uniques, 6);
+  f_110_100_111_001_1(uniques, 6);
+  f_110_100_111_010_0(uniques, 6);
+  f_110_100_111_010_1(uniques, 6);
+  f_110_100_111_011_0(uniques, 6);
+  f_110_100_111_011_1(uniques, 6);
+  f_110_100_111_100_0(uniques, 6);
+  f_110_100_111_100_1(uniques, 6);
+  f_110_100_111_101_0(uniques, 6);
+  f_110_100_111_101_1(uniques, 6);
+  f_110_100_111_110_0(uniques, 6);
+  f_110_100_111_110_1(uniques, 6);
+  f_110_100_111_111_0(uniques, 6);
+  f_110_100_111_111_1(uniques, 6);
+  f_110_101_100_000_0(uniques, 6);
+  f_110_101_100_000_1(uniques, 6);
+  f_110_101_100_001_0(uniques, 6);
+  f_110_101_100_001_1(uniques, 6);
+  f_110_101_100_010_0(uniques, 6);
+  f_110_101_100_010_1(uniques, 6);
+  f_110_101_100_011_0(uniques, 6);
+  f_110_101_100_011_1(uniques, 6);
+  f_110_101_100_100_0(uniques, 6);
+  f_110_101_100_100_1(uniques, 6);
+  f_110_101_100_101_0(uniques, 6);
+  f_110_101_100_101_1(uniques, 6);
+  f_110_101_100_110_0(uniques, 6);
+  f_110_101_100_110_1(uniques, 6);
+  f_110_101_100_111_0(uniques, 6);
+  f_110_101_100_111_1(uniques, 6);
+  f_110_101_101_000_0(uniques, 6);
+  f_110_101_101_000_1(uniques, 6);
+  f_110_101_101_001_0(uniques, 6);
+  f_110_101_101_001_1(uniques, 6);
+  f_110_101_101_010_0(uniques, 6);
+  f_110_101_101_010_1(uniques, 6);
+  f_110_101_101_011_0(uniques, 6);
+  f_110_101_101_011_1(uniques, 6);
+  f_110_101_101_100_0(uniques, 6);
+  f_110_101_101_100_1(uniques, 6);
+  f_110_101_101_101_0(uniques, 6);
+  f_110_101_101_101_1(uniques, 6);
+  f_110_101_101_110_0(uniques, 6);
+  f_110_101_101_110_1(uniques, 6);
+  f_110_101_101_111_0(uniques, 6);
+  f_110_101_101_111_1(uniques, 6);
+  f_110_101_110_000_0(uniques, 6);
+  f_110_101_110_000_1(uniques, 6);
+  f_110_101_110_001_0(uniques, 6);
+  f_110_101_110_001_1(uniques, 6);
+  f_110_101_110_010_0(uniques, 6);
+  f_110_101_110_010_1(uniques, 6);
+  f_110_101_110_011_0(uniques, 6);
+  f_110_101_110_011_1(uniques, 6);
+  f_110_101_110_100_0(uniques, 6);
+  f_110_101_110_100_1(uniques, 6);
+  f_110_101_110_101_0(uniques, 6);
+  f_110_101_110_101_1(uniques, 6);
+  f_110_101_110_110_0(uniques, 6);
+  f_110_101_110_110_1(uniques, 6);
+  f_110_101_110_111_0(uniques, 6);
+  f_110_101_110_111_1(uniques, 6);
+  f_110_101_111_000_0(uniques, 6);
+  f_110_101_111_000_1(uniques, 6);
+  f_110_101_111_001_0(uniques, 6);
+  f_110_101_111_001_1(uniques, 6);
+  f_110_101_111_010_0(uniques, 6);
+  f_110_101_111_010_1(uniques, 6);
+  f_110_101_111_011_0(uniques, 6);
+  f_110_101_111_011_1(uniques, 6);
+  f_110_101_111_100_0(uniques, 6);
+  f_110_101_111_100_1(uniques, 6);
+  f_110_101_111_101_0(uniques, 6);
+  f_110_101_111_101_1(uniques, 6);
+  f_110_101_111_110_0(uniques, 6);
+  f_110_101_111_110_1(uniques, 6);
+  f_110_101_111_111_0(uniques, 6);
+  f_110_101_111_111_1(uniques, 6);
+  f_110_110_100_000_0(uniques, 6);
+  f_110_110_100_000_1(uniques, 6);
+  f_110_110_100_001_0(uniques, 6);
+  f_110_110_100_001_1(uniques, 6);
+  f_110_110_100_010_0(uniques, 6);
+  f_110_110_100_010_1(uniques, 6);
+  f_110_110_100_011_0(uniques, 6);
+  f_110_110_100_011_1(uniques, 6);
+  f_110_110_100_100_0(uniques, 6);
+  f_110_110_100_100_1(uniques, 6);
+  f_110_110_100_101_0(uniques, 6);
+  f_110_110_100_101_1(uniques, 6);
+  f_110_110_100_110_0(uniques, 6);
+  f_110_110_100_110_1(uniques, 6);
+  f_110_110_100_111_0(uniques, 6);
+  f_110_110_100_111_1(uniques, 6);
+  f_110_110_101_000_0(uniques, 6);
+  f_110_110_101_000_1(uniques, 6);
+  f_110_110_101_001_0(uniques, 6);
+  f_110_110_101_001_1(uniques, 6);
+  f_110_110_101_010_0(uniques, 6);
+  f_110_110_101_010_1(uniques, 6);
+  f_110_110_101_011_0(uniques, 6);
+  f_110_110_101_011_1(uniques, 6);
+  f_110_110_101_100_0(uniques, 6);
+  f_110_110_101_100_1(uniques, 6);
+  f_110_110_101_101_0(uniques, 6);
+  f_110_110_101_101_1(uniques, 6);
+  f_110_110_101_110_0(uniques, 6);
+  f_110_110_101_110_1(uniques, 6);
+  f_110_110_101_111_0(uniques, 6);
+  f_110_110_101_111_1(uniques, 6);
+  f_110_110_110_000_0(uniques, 6);
+  f_110_110_110_000_1(uniques, 6);
+  f_110_110_110_001_0(uniques, 6);
+  f_110_110_110_001_1(uniques, 6);
+  f_110_110_110_010_0(uniques, 6);
+  f_110_110_110_010_1(uniques, 6);
+  f_110_110_110_011_0(uniques, 6);
+  f_110_110_110_011_1(uniques, 6);
+  f_110_110_110_100_0(uniques, 6);
+  f_110_110_110_100_1(uniques, 6);
+  f_110_110_110_101_0(uniques, 6);
+  f_110_110_110_101_1(uniques, 6);
+  f_110_110_110_110_0(uniques, 6);
+  f_110_110_110_110_1(uniques, 6);
+  f_110_110_110_111_0(uniques, 6);
+  f_110_110_110_111_1(uniques, 6);
+  f_110_110_111_000_0(uniques, 6);
+  f_110_110_111_000_1(uniques, 6);
+  f_110_110_111_001_0(uniques, 6);
+  f_110_110_111_001_1(uniques, 6);
+  f_110_110_111_010_0(uniques, 6);
+  f_110_110_111_010_1(uniques, 6);
+  f_110_110_111_011_0(uniques, 6);
+  f_110_110_111_011_1(uniques, 6);
+  f_110_110_111_100_0(uniques, 6);
+  f_110_110_111_100_1(uniques, 6);
+  f_110_110_111_101_0(uniques, 6);
+  f_110_110_111_101_1(uniques, 6);
+  f_110_110_111_110_0(uniques, 6);
+  f_110_110_111_110_1(uniques, 6);
+  f_110_110_111_111_0(uniques, 6);
+  f_110_110_111_111_1(uniques, 6);
+  f_110_111_100_000_0(uniques, 6);
+  f_110_111_100_000_1(uniques, 6);
+  f_110_111_100_001_0(uniques, 6);
+  f_110_111_100_001_1(uniques, 6);
+  f_110_111_100_010_0(uniques, 6);
+  f_110_111_100_010_1(uniques, 6);
+  f_110_111_100_011_0(uniques, 6);
+  f_110_111_100_011_1(uniques, 6);
+  f_110_111_100_100_0(uniques, 6);
+  f_110_111_100_100_1(uniques, 6);
+  f_110_111_100_101_0(uniques, 6);
+  f_110_111_100_101_1(uniques, 6);
+  f_110_111_100_110_0(uniques, 6);
+  f_110_111_100_110_1(uniques, 6);
+  f_110_111_100_111_0(uniques, 6);
+  f_110_111_100_111_1(uniques, 6);
+  f_110_111_101_000_0(uniques, 6);
+  f_110_111_101_000_1(uniques, 6);
+  f_110_111_101_001_0(uniques, 6);
+  f_110_111_101_001_1(uniques, 6);
+  f_110_111_101_010_0(uniques, 6);
+  f_110_111_101_010_1(uniques, 6);
+  f_110_111_101_011_0(uniques, 6);
+  f_110_111_101_011_1(uniques, 6);
+  f_110_111_101_100_0(uniques, 6);
+  f_110_111_101_100_1(uniques, 6);
+  f_110_111_101_101_0(uniques, 6);
+  f_110_111_101_101_1(uniques, 6);
+  f_110_111_101_110_0(uniques, 6);
+  f_110_111_101_110_1(uniques, 6);
+  f_110_111_101_111_0(uniques, 6);
+  f_110_111_101_111_1(uniques, 6);
+  f_110_111_110_000_0(uniques, 6);
+  f_110_111_110_000_1(uniques, 6);
+  f_110_111_110_001_0(uniques, 6);
+  f_110_111_110_001_1(uniques, 6);
+  f_110_111_110_010_0(uniques, 6);
+  f_110_111_110_010_1(uniques, 6);
+  f_110_111_110_011_0(uniques, 6);
+  f_110_111_110_011_1(uniques, 6);
+  f_110_111_110_100_0(uniques, 6);
+  f_110_111_110_100_1(uniques, 6);
+  f_110_111_110_101_0(uniques, 6);
+  f_110_111_110_101_1(uniques, 6);
+  f_110_111_110_110_0(uniques, 6);
+  f_110_111_110_110_1(uniques, 6);
+  f_110_111_110_111_0(uniques, 6);
+  f_110_111_110_111_1(uniques, 6);
+  f_110_111_111_000_0(uniques, 6);
+  f_110_111_111_000_1(uniques, 6);
+  f_110_111_111_001_0(uniques, 6);
+  f_110_111_111_001_1(uniques, 6);
+  f_110_111_111_010_0(uniques, 6);
+  f_110_111_111_010_1(uniques, 6);
+  f_110_111_111_011_0(uniques, 6);
+  f_110_111_111_011_1(uniques, 6);
+  f_110_111_111_100_0(uniques, 6);
+  f_110_111_111_100_1(uniques, 6);
+  f_110_111_111_101_0(uniques, 6);
+  f_110_111_111_101_1(uniques, 6);
+  f_110_111_111_110_0(uniques, 6);
+  f_110_111_111_110_1(uniques, 6);
+  f_110_111_111_111_0(uniques, 6);
+  f_110_111_111_111_1(uniques, 6);
+  f_111_000_100_000_0(uniques, 6);
+  f_111_000_100_000_1(uniques, 6);
+  f_111_000_100_001_0(uniques, 6);
+  f_111_000_100_001_1(uniques, 6);
+  f_111_000_100_010_0(uniques, 6);
+  f_111_000_100_010_1(uniques, 6);
+  f_111_000_100_011_0(uniques, 6);
+  f_111_000_100_011_1(uniques, 6);
+  f_111_000_100_100_0(uniques, 6);
+  f_111_000_100_100_1(uniques, 6);
+  f_111_000_100_101_0(uniques, 6);
+  f_111_000_100_101_1(uniques, 6);
+  f_111_000_100_110_0(uniques, 6);
+  f_111_000_100_110_1(uniques, 6);
+  f_111_000_100_111_0(uniques, 6);
+  f_111_000_100_111_1(uniques, 6);
+  f_111_000_101_000_0(uniques, 6);
+  f_111_000_101_000_1(uniques, 6);
+  f_111_000_101_001_0(uniques, 6);
+  f_111_000_101_001_1(uniques, 6);
+  f_111_000_101_010_0(uniques, 6);
+  f_111_000_101_010_1(uniques, 6);
+  f_111_000_101_011_0(uniques, 6);
+  f_111_000_101_011_1(uniques, 6);
+  f_111_000_101_100_0(uniques, 6);
+  f_111_000_101_100_1(uniques, 6);
+  f_111_000_101_101_0(uniques, 6);
+  f_111_000_101_101_1(uniques, 6);
+  f_111_000_101_110_0(uniques, 6);
+  f_111_000_101_110_1(uniques, 6);
+  f_111_000_101_111_0(uniques, 6);
+  f_111_000_101_111_1(uniques, 6);
+  f_111_000_110_000_0(uniques, 6);
+  f_111_000_110_000_1(uniques, 6);
+  f_111_000_110_001_0(uniques, 6);
+  f_111_000_110_001_1(uniques, 6);
+  f_111_000_110_010_0(uniques, 6);
+  f_111_000_110_010_1(uniques, 6);
+  f_111_000_110_011_0(uniques, 6);
+  f_111_000_110_011_1(uniques, 6);
+  f_111_000_110_100_0(uniques, 6);
+  f_111_000_110_100_1(uniques, 6);
+  f_111_000_110_101_0(uniques, 6);
+  f_111_000_110_101_1(uniques, 6);
+  f_111_000_110_110_0(uniques, 6);
+  f_111_000_110_110_1(uniques, 6);
+  f_111_000_110_111_0(uniques, 6);
+  f_111_000_110_111_1(uniques, 6);
+  f_111_000_111_000_0(uniques, 6);
+  f_111_000_111_000_1(uniques, 6);
+  f_111_000_111_001_0(uniques, 6);
+  f_111_000_111_001_1(uniques, 6);
+  f_111_000_111_010_0(uniques, 6);
+  f_111_000_111_010_1(uniques, 6);
+  f_111_000_111_011_0(uniques, 6);
+  f_111_000_111_011_1(uniques, 6);
+  f_111_000_111_100_0(uniques, 6);
+  f_111_000_111_100_1(uniques, 6);
+  f_111_000_111_101_0(uniques, 6);
+  f_111_000_111_101_1(uniques, 6);
+  f_111_000_111_110_0(uniques, 6);
+  f_111_000_111_110_1(uniques, 6);
+  f_111_000_111_111_0(uniques, 6);
+  f_111_000_111_111_1(uniques, 6);
+  f_111_001_100_000_0(uniques, 6);
+  f_111_001_100_000_1(uniques, 6);
+  f_111_001_100_001_0(uniques, 6);
+  f_111_001_100_001_1(uniques, 6);
+  f_111_001_100_010_0(uniques, 6);
+  f_111_001_100_010_1(uniques, 6);
+  f_111_001_100_011_0(uniques, 6);
+  f_111_001_100_011_1(uniques, 6);
+  f_111_001_100_100_0(uniques, 6);
+  f_111_001_100_100_1(uniques, 6);
+  f_111_001_100_101_0(uniques, 6);
+  f_111_001_100_101_1(uniques, 6);
+  f_111_001_100_110_0(uniques, 6);
+  f_111_001_100_110_1(uniques, 6);
+  f_111_001_100_111_0(uniques, 6);
+  f_111_001_100_111_1(uniques, 6);
+  f_111_001_101_000_0(uniques, 6);
+  f_111_001_101_000_1(uniques, 6);
+  f_111_001_101_001_0(uniques, 6);
+  f_111_001_101_001_1(uniques, 6);
+  f_111_001_101_010_0(uniques, 6);
+  f_111_001_101_010_1(uniques, 6);
+  f_111_001_101_011_0(uniques, 6);
+  f_111_001_101_011_1(uniques, 6);
+  f_111_001_101_100_0(uniques, 6);
+  f_111_001_101_100_1(uniques, 6);
+  f_111_001_101_101_0(uniques, 6);
+  f_111_001_101_101_1(uniques, 6);
+  f_111_001_101_110_0(uniques, 6);
+  f_111_001_101_110_1(uniques, 6);
+  f_111_001_101_111_0(uniques, 6);
+  f_111_001_101_111_1(uniques, 6);
+  f_111_001_110_000_0(uniques, 6);
+  f_111_001_110_000_1(uniques, 6);
+  f_111_001_110_001_0(uniques, 6);
+  f_111_001_110_001_1(uniques, 6);
+  f_111_001_110_010_0(uniques, 6);
+  f_111_001_110_010_1(uniques, 6);
+  f_111_001_110_011_0(uniques, 6);
+  f_111_001_110_011_1(uniques, 6);
+  f_111_001_110_100_0(uniques, 6);
+  f_111_001_110_100_1(uniques, 6);
+  f_111_001_110_101_0(uniques, 6);
+  f_111_001_110_101_1(uniques, 6);
+  f_111_001_110_110_0(uniques, 6);
+  f_111_001_110_110_1(uniques, 6);
+  f_111_001_110_111_0(uniques, 6);
+  f_111_001_110_111_1(uniques, 6);
+  f_111_001_111_000_0(uniques, 6);
+  f_111_001_111_000_1(uniques, 6);
+  f_111_001_111_001_0(uniques, 6);
+  f_111_001_111_001_1(uniques, 6);
+  f_111_001_111_010_0(uniques, 6);
+  f_111_001_111_010_1(uniques, 6);
+  f_111_001_111_011_0(uniques, 6);
+  f_111_001_111_011_1(uniques, 6);
+  f_111_001_111_100_0(uniques, 6);
+  f_111_001_111_100_1(uniques, 6);
+  f_111_001_111_101_0(uniques, 6);
+  f_111_001_111_101_1(uniques, 6);
+  f_111_001_111_110_0(uniques, 6);
+  f_111_001_111_110_1(uniques, 6);
+  f_111_001_111_111_0(uniques, 6);
+  f_111_001_111_111_1(uniques, 6);
+  f_111_010_100_000_0(uniques, 6);
+  f_111_010_100_000_1(uniques, 6);
+  f_111_010_100_001_0(uniques, 6);
+  f_111_010_100_001_1(uniques, 6);
+  f_111_010_100_010_0(uniques, 6);
+  f_111_010_100_010_1(uniques, 6);
+  f_111_010_100_011_0(uniques, 6);
+  f_111_010_100_011_1(uniques, 6);
+  f_111_010_100_100_0(uniques, 6);
+  f_111_010_100_100_1(uniques, 6);
+  f_111_010_100_101_0(uniques, 6);
+  f_111_010_100_101_1(uniques, 6);
+  f_111_010_100_110_0(uniques, 6);
+  f_111_010_100_110_1(uniques, 6);
+  f_111_010_100_111_0(uniques, 6);
+  f_111_010_100_111_1(uniques, 6);
+  f_111_010_101_000_0(uniques, 6);
+  f_111_010_101_000_1(uniques, 6);
+  f_111_010_101_001_0(uniques, 6);
+  f_111_010_101_001_1(uniques, 6);
+  f_111_010_101_010_0(uniques, 6);
+  f_111_010_101_010_1(uniques, 6);
+  f_111_010_101_011_0(uniques, 6);
+  f_111_010_101_011_1(uniques, 6);
+  f_111_010_101_100_0(uniques, 6);
+  f_111_010_101_100_1(uniques, 6);
+  f_111_010_101_101_0(uniques, 6);
+  f_111_010_101_101_1(uniques, 6);
+  f_111_010_101_110_0(uniques, 6);
+  f_111_010_101_110_1(uniques, 6);
+  f_111_010_101_111_0(uniques, 6);
+  f_111_010_101_111_1(uniques, 6);
+  f_111_010_110_000_0(uniques, 6);
+  f_111_010_110_000_1(uniques, 6);
+  f_111_010_110_001_0(uniques, 6);
+  f_111_010_110_001_1(uniques, 6);
+  f_111_010_110_010_0(uniques, 6);
+  f_111_010_110_010_1(uniques, 6);
+  f_111_010_110_011_0(uniques, 6);
+  f_111_010_110_011_1(uniques, 6);
+  f_111_010_110_100_0(uniques, 6);
+  f_111_010_110_100_1(uniques, 6);
+  f_111_010_110_101_0(uniques, 6);
+  f_111_010_110_101_1(uniques, 6);
+  f_111_010_110_110_0(uniques, 6);
+  f_111_010_110_110_1(uniques, 6);
+  f_111_010_110_111_0(uniques, 6);
+  f_111_010_110_111_1(uniques, 6);
+  f_111_010_111_000_0(uniques, 6);
+  f_111_010_111_000_1(uniques, 6);
+  f_111_010_111_001_0(uniques, 6);
+  f_111_010_111_001_1(uniques, 6);
+  f_111_010_111_010_0(uniques, 6);
+  f_111_010_111_010_1(uniques, 6);
+  f_111_010_111_011_0(uniques, 6);
+  f_111_010_111_011_1(uniques, 6);
+  f_111_010_111_100_0(uniques, 6);
+  f_111_010_111_100_1(uniques, 6);
+  f_111_010_111_101_0(uniques, 6);
+  f_111_010_111_101_1(uniques, 6);
+  f_111_010_111_110_0(uniques, 6);
+  f_111_010_111_110_1(uniques, 6);
+  f_111_010_111_111_0(uniques, 6);
+  f_111_010_111_111_1(uniques, 6);
+  f_111_011_100_000_0(uniques, 6);
+  f_111_011_100_000_1(uniques, 6);
+  f_111_011_100_001_0(uniques, 6);
+  f_111_011_100_001_1(uniques, 6);
+  f_111_011_100_010_0(uniques, 6);
+  f_111_011_100_010_1(uniques, 6);
+  f_111_011_100_011_0(uniques, 6);
+  f_111_011_100_011_1(uniques, 6);
+  f_111_011_100_100_0(uniques, 6);
+  f_111_011_100_100_1(uniques, 6);
+  f_111_011_100_101_0(uniques, 6);
+  f_111_011_100_101_1(uniques, 6);
+  f_111_011_100_110_0(uniques, 6);
+  f_111_011_100_110_1(uniques, 6);
+  f_111_011_100_111_0(uniques, 6);
+  f_111_011_100_111_1(uniques, 6);
+  f_111_011_101_000_0(uniques, 6);
+  f_111_011_101_000_1(uniques, 6);
+  f_111_011_101_001_0(uniques, 6);
+  f_111_011_101_001_1(uniques, 6);
+  f_111_011_101_010_0(uniques, 6);
+  f_111_011_101_010_1(uniques, 6);
+  f_111_011_101_011_0(uniques, 6);
+  f_111_011_101_011_1(uniques, 6);
+  f_111_011_101_100_0(uniques, 6);
+  f_111_011_101_100_1(uniques, 6);
+  f_111_011_101_101_0(uniques, 6);
+  f_111_011_101_101_1(uniques, 6);
+  f_111_011_101_110_0(uniques, 6);
+  f_111_011_101_110_1(uniques, 6);
+  f_111_011_101_111_0(uniques, 6);
+  f_111_011_101_111_1(uniques, 6);
+  f_111_011_110_000_0(uniques, 6);
+  f_111_011_110_000_1(uniques, 6);
+  f_111_011_110_001_0(uniques, 6);
+  f_111_011_110_001_1(uniques, 6);
+  f_111_011_110_010_0(uniques, 6);
+  f_111_011_110_010_1(uniques, 6);
+  f_111_011_110_011_0(uniques, 6);
+  f_111_011_110_011_1(uniques, 6);
+  f_111_011_110_100_0(uniques, 6);
+  f_111_011_110_100_1(uniques, 6);
+  f_111_011_110_101_0(uniques, 6);
+  f_111_011_110_101_1(uniques, 6);
+  f_111_011_110_110_0(uniques, 6);
+  f_111_011_110_110_1(uniques, 6);
+  f_111_011_110_111_0(uniques, 6);
+  f_111_011_110_111_1(uniques, 6);
+  f_111_011_111_000_0(uniques, 6);
+  f_111_011_111_000_1(uniques, 6);
+  f_111_011_111_001_0(uniques, 6);
+  f_111_011_111_001_1(uniques, 6);
+  f_111_011_111_010_0(uniques, 6);
+  f_111_011_111_010_1(uniques, 6);
+  f_111_011_111_011_0(uniques, 6);
+  f_111_011_111_011_1(uniques, 6);
+  f_111_011_111_100_0(uniques, 6);
+  f_111_011_111_100_1(uniques, 6);
+  f_111_011_111_101_0(uniques, 6);
+  f_111_011_111_101_1(uniques, 6);
+  f_111_011_111_110_0(uniques, 6);
+  f_111_011_111_110_1(uniques, 6);
+  f_111_011_111_111_0(uniques, 6);
+  f_111_011_111_111_1(uniques, 6);
+  f_111_100_100_000_0(uniques, 6);
+  f_111_100_100_000_1(uniques, 6);
+  f_111_100_100_001_0(uniques, 6);
+  f_111_100_100_001_1(uniques, 6);
+  f_111_100_100_010_0(uniques, 6);
+  f_111_100_100_010_1(uniques, 6);
+  f_111_100_100_011_0(uniques, 6);
+  f_111_100_100_011_1(uniques, 6);
+  f_111_100_100_100_0(uniques, 6);
+  f_111_100_100_100_1(uniques, 6);
+  f_111_100_100_101_0(uniques, 6);
+  f_111_100_100_101_1(uniques, 6);
+  f_111_100_100_110_0(uniques, 6);
+  f_111_100_100_110_1(uniques, 6);
+  f_111_100_100_111_0(uniques, 6);
+  f_111_100_100_111_1(uniques, 6);
+  f_111_100_101_000_0(uniques, 6);
+  f_111_100_101_000_1(uniques, 6);
+  f_111_100_101_001_0(uniques, 6);
+  f_111_100_101_001_1(uniques, 6);
+  f_111_100_101_010_0(uniques, 6);
+  f_111_100_101_010_1(uniques, 6);
+  f_111_100_101_011_0(uniques, 6);
+  f_111_100_101_011_1(uniques, 6);
+  f_111_100_101_100_0(uniques, 6);
+  f_111_100_101_100_1(uniques, 6);
+  f_111_100_101_101_0(uniques, 6);
+  f_111_100_101_101_1(uniques, 6);
+  f_111_100_101_110_0(uniques, 6);
+  f_111_100_101_110_1(uniques, 6);
+  f_111_100_101_111_0(uniques, 6);
+  f_111_100_101_111_1(uniques, 6);
+  f_111_100_110_000_0(uniques, 6);
+  f_111_100_110_000_1(uniques, 6);
+  f_111_100_110_001_0(uniques, 6);
+  f_111_100_110_001_1(uniques, 6);
+  f_111_100_110_010_0(uniques, 6);
+  f_111_100_110_010_1(uniques, 6);
+  f_111_100_110_011_0(uniques, 6);
+  f_111_100_110_011_1(uniques, 6);
+  f_111_100_110_100_0(uniques, 6);
+  f_111_100_110_100_1(uniques, 6);
+  f_111_100_110_101_0(uniques, 6);
+  f_111_100_110_101_1(uniques, 6);
+  f_111_100_110_110_0(uniques, 6);
+  f_111_100_110_110_1(uniques, 6);
+  f_111_100_110_111_0(uniques, 6);
+  f_111_100_110_111_1(uniques, 6);
+  f_111_100_111_000_0(uniques, 6);
+  f_111_100_111_000_1(uniques, 6);
+  f_111_100_111_001_0(uniques, 6);
+  f_111_100_111_001_1(uniques, 6);
+  f_111_100_111_010_0(uniques, 6);
+  f_111_100_111_010_1(uniques, 6);
+  f_111_100_111_011_0(uniques, 6);
+  f_111_100_111_011_1(uniques, 6);
+  f_111_100_111_100_0(uniques, 6);
+  f_111_100_111_100_1(uniques, 6);
+  f_111_100_111_101_0(uniques, 6);
+  f_111_100_111_101_1(uniques, 6);
+  f_111_100_111_110_0(uniques, 6);
+  f_111_100_111_110_1(uniques, 6);
+  f_111_100_111_111_0(uniques, 6);
+  f_111_100_111_111_1(uniques, 6);
+  f_111_101_100_000_0(uniques, 6);
+  f_111_101_100_000_1(uniques, 6);
+  f_111_101_100_001_0(uniques, 6);
+  f_111_101_100_001_1(uniques, 6);
+  f_111_101_100_010_0(uniques, 6);
+  f_111_101_100_010_1(uniques, 6);
+  f_111_101_100_011_0(uniques, 6);
+  f_111_101_100_011_1(uniques, 6);
+  f_111_101_100_100_0(uniques, 6);
+  f_111_101_100_100_1(uniques, 6);
+  f_111_101_100_101_0(uniques, 6);
+  f_111_101_100_101_1(uniques, 6);
+  f_111_101_100_110_0(uniques, 6);
+  f_111_101_100_110_1(uniques, 6);
+  f_111_101_100_111_0(uniques, 6);
+  f_111_101_100_111_1(uniques, 6);
+  f_111_101_101_000_0(uniques, 6);
+  f_111_101_101_000_1(uniques, 6);
+  f_111_101_101_001_0(uniques, 6);
+  f_111_101_101_001_1(uniques, 6);
+  f_111_101_101_010_0(uniques, 6);
+  f_111_101_101_010_1(uniques, 6);
+  f_111_101_101_011_0(uniques, 6);
+  f_111_101_101_011_1(uniques, 6);
+  f_111_101_101_100_0(uniques, 6);
+  f_111_101_101_100_1(uniques, 6);
+  f_111_101_101_101_0(uniques, 6);
+  f_111_101_101_101_1(uniques, 6);
+  f_111_101_101_110_0(uniques, 6);
+  f_111_101_101_110_1(uniques, 6);
+  f_111_101_101_111_0(uniques, 6);
+  f_111_101_101_111_1(uniques, 6);
+  f_111_101_110_000_0(uniques, 6);
+  f_111_101_110_000_1(uniques, 6);
+  f_111_101_110_001_0(uniques, 6);
+  f_111_101_110_001_1(uniques, 6);
+  f_111_101_110_010_0(uniques, 6);
+  f_111_101_110_010_1(uniques, 6);
+  f_111_101_110_011_0(uniques, 6);
+  f_111_101_110_011_1(uniques, 6);
+  f_111_101_110_100_0(uniques, 6);
+  f_111_101_110_100_1(uniques, 6);
+  f_111_101_110_101_0(uniques, 6);
+  f_111_101_110_101_1(uniques, 6);
+  f_111_101_110_110_0(uniques, 6);
+  f_111_101_110_110_1(uniques, 6);
+  f_111_101_110_111_0(uniques, 6);
+  f_111_101_110_111_1(uniques, 6);
+  f_111_101_111_000_0(uniques, 6);
+  f_111_101_111_000_1(uniques, 6);
+  f_111_101_111_001_0(uniques, 6);
+  f_111_101_111_001_1(uniques, 6);
+  f_111_101_111_010_0(uniques, 6);
+  f_111_101_111_010_1(uniques, 6);
+  f_111_101_111_011_0(uniques, 6);
+  f_111_101_111_011_1(uniques, 6);
+  f_111_101_111_100_0(uniques, 6);
+  f_111_101_111_100_1(uniques, 6);
+  f_111_101_111_101_0(uniques, 6);
+  f_111_101_111_101_1(uniques, 6);
+  f_111_101_111_110_0(uniques, 6);
+  f_111_101_111_110_1(uniques, 6);
+  f_111_101_111_111_0(uniques, 6);
+  f_111_101_111_111_1(uniques, 6);
+  f_111_110_100_000_0(uniques, 6);
+  f_111_110_100_000_1(uniques, 6);
+  f_111_110_100_001_0(uniques, 6);
+  f_111_110_100_001_1(uniques, 6);
+  f_111_110_100_010_0(uniques, 6);
+  f_111_110_100_010_1(uniques, 6);
+  f_111_110_100_011_0(uniques, 6);
+  f_111_110_100_011_1(uniques, 6);
+  f_111_110_100_100_0(uniques, 6);
+  f_111_110_100_100_1(uniques, 6);
+  f_111_110_100_101_0(uniques, 6);
+  f_111_110_100_101_1(uniques, 6);
+  f_111_110_100_110_0(uniques, 6);
+  f_111_110_100_110_1(uniques, 6);
+  f_111_110_100_111_0(uniques, 6);
+  f_111_110_100_111_1(uniques, 6);
+  f_111_110_101_000_0(uniques, 6);
+  f_111_110_101_000_1(uniques, 6);
+  f_111_110_101_001_0(uniques, 6);
+  f_111_110_101_001_1(uniques, 6);
+  f_111_110_101_010_0(uniques, 6);
+  f_111_110_101_010_1(uniques, 6);
+  f_111_110_101_011_0(uniques, 6);
+  f_111_110_101_011_1(uniques, 6);
+  f_111_110_101_100_0(uniques, 6);
+  f_111_110_101_100_1(uniques, 6);
+  f_111_110_101_101_0(uniques, 6);
+  f_111_110_101_101_1(uniques, 6);
+  f_111_110_101_110_0(uniques, 6);
+  f_111_110_101_110_1(uniques, 6);
+  f_111_110_101_111_0(uniques, 6);
+  f_111_110_101_111_1(uniques, 6);
+  f_111_110_110_000_0(uniques, 6);
+  f_111_110_110_000_1(uniques, 6);
+  f_111_110_110_001_0(uniques, 6);
+  f_111_110_110_001_1(uniques, 6);
+  f_111_110_110_010_0(uniques, 6);
+  f_111_110_110_010_1(uniques, 6);
+  f_111_110_110_011_0(uniques, 6);
+  f_111_110_110_011_1(uniques, 6);
+  f_111_110_110_100_0(uniques, 6);
+  f_111_110_110_100_1(uniques, 6);
+  f_111_110_110_101_0(uniques, 6);
+  f_111_110_110_101_1(uniques, 6);
+  f_111_110_110_110_0(uniques, 6);
+  f_111_110_110_110_1(uniques, 6);
+  f_111_110_110_111_0(uniques, 6);
+  f_111_110_110_111_1(uniques, 6);
+  f_111_110_111_000_0(uniques, 6);
+  f_111_110_111_000_1(uniques, 6);
+  f_111_110_111_001_0(uniques, 6);
+  f_111_110_111_001_1(uniques, 6);
+  f_111_110_111_010_0(uniques, 6);
+  f_111_110_111_010_1(uniques, 6);
+  f_111_110_111_011_0(uniques, 6);
+  f_111_110_111_011_1(uniques, 6);
+  f_111_110_111_100_0(uniques, 6);
+  f_111_110_111_100_1(uniques, 6);
+  f_111_110_111_101_0(uniques, 6);
+  f_111_110_111_101_1(uniques, 6);
+  f_111_110_111_110_0(uniques, 6);
+  f_111_110_111_110_1(uniques, 6);
+  f_111_110_111_111_0(uniques, 6);
+  f_111_110_111_111_1(uniques, 6);
+  f_111_111_100_000_0(uniques, 6);
+  f_111_111_100_000_1(uniques, 6);
+  f_111_111_100_001_0(uniques, 6);
+  f_111_111_100_001_1(uniques, 6);
+  f_111_111_100_010_0(uniques, 6);
+  f_111_111_100_010_1(uniques, 6);
+  f_111_111_100_011_0(uniques, 6);
+  f_111_111_100_011_1(uniques, 6);
+  f_111_111_100_100_0(uniques, 6);
+  f_111_111_100_100_1(uniques, 6);
+  f_111_111_100_101_0(uniques, 6);
+  f_111_111_100_101_1(uniques, 6);
+  f_111_111_100_110_0(uniques, 6);
+  f_111_111_100_110_1(uniques, 6);
+  f_111_111_100_111_0(uniques, 6);
+  f_111_111_100_111_1(uniques, 6);
+  f_111_111_101_000_0(uniques, 6);
+  f_111_111_101_000_1(uniques, 6);
+  f_111_111_101_001_0(uniques, 6);
+  f_111_111_101_001_1(uniques, 6);
+  f_111_111_101_010_0(uniques, 6);
+  f_111_111_101_010_1(uniques, 6);
+  f_111_111_101_011_0(uniques, 6);
+  f_111_111_101_011_1(uniques, 6);
+  f_111_111_101_100_0(uniques, 6);
+  f_111_111_101_100_1(uniques, 6);
+  f_111_111_101_101_0(uniques, 6);
+  f_111_111_101_101_1(uniques, 6);
+  f_111_111_101_110_0(uniques, 6);
+  f_111_111_101_110_1(uniques, 6);
+  f_111_111_101_111_0(uniques, 6);
+  f_111_111_101_111_1(uniques, 6);
+  f_111_111_110_000_0(uniques, 6);
+  f_111_111_110_000_1(uniques, 6);
+  f_111_111_110_001_0(uniques, 6);
+  f_111_111_110_001_1(uniques, 6);
+  f_111_111_110_010_0(uniques, 6);
+  f_111_111_110_010_1(uniques, 6);
+  f_111_111_110_011_0(uniques, 6);
+  f_111_111_110_011_1(uniques, 6);
+  f_111_111_110_100_0(uniques, 6);
+  f_111_111_110_100_1(uniques, 6);
+  f_111_111_110_101_0(uniques, 6);
+  f_111_111_110_101_1(uniques, 6);
+  f_111_111_110_110_0(uniques, 6);
+  f_111_111_110_110_1(uniques, 6);
+  f_111_111_110_111_0(uniques, 6);
+  f_111_111_110_111_1(uniques, 6);
+  f_111_111_111_000_0(uniques, 6);
+  f_111_111_111_000_1(uniques, 6);
+  f_111_111_111_001_0(uniques, 6);
+  f_111_111_111_001_1(uniques, 6);
+  f_111_111_111_010_0(uniques, 6);
+  f_111_111_111_010_1(uniques, 6);
+  f_111_111_111_011_0(uniques, 6);
+  f_111_111_111_011_1(uniques, 6);
+  f_111_111_111_100_0(uniques, 6);
+  f_111_111_111_100_1(uniques, 6);
+  f_111_111_111_101_0(uniques, 6);
+  f_111_111_111_101_1(uniques, 6);
+  f_111_111_111_110_0(uniques, 6);
+  f_111_111_111_110_1(uniques, 6);
+  f_111_111_111_111_0(uniques, 6);
+  f_111_111_111_111_1(uniques, 6);
+  Expect.equals(4096, uniques.length);
+}
diff --git a/tests/dart2js/deferred/many_parts/lib_000_001_000_000_0.dart b/tests/dart2js/deferred/many_parts/lib_000_001_000_000_0.dart
new file mode 100644
index 0000000..c3f7c6c
--- /dev/null
+++ b/tests/dart2js/deferred/many_parts/lib_000_001_000_000_0.dart
@@ -0,0 +1,4111 @@
+// Copyright (c) 2020, 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:expect/expect.dart";
+
+import 'libB.dart';
+
+@pragma('dart2js:noInline')
+g_000_001_000_000_0() {
+  Set<String> uniques = {};
+
+  // f_***_**1_***_***_*;
+  f_000_001_000_000_0(uniques, 5);
+  f_000_001_000_000_1(uniques, 5);
+  f_000_001_000_001_0(uniques, 5);
+  f_000_001_000_001_1(uniques, 5);
+  f_000_001_000_010_0(uniques, 5);
+  f_000_001_000_010_1(uniques, 5);
+  f_000_001_000_011_0(uniques, 5);
+  f_000_001_000_011_1(uniques, 5);
+  f_000_001_000_100_0(uniques, 5);
+  f_000_001_000_100_1(uniques, 5);
+  f_000_001_000_101_0(uniques, 5);
+  f_000_001_000_101_1(uniques, 5);
+  f_000_001_000_110_0(uniques, 5);
+  f_000_001_000_110_1(uniques, 5);
+  f_000_001_000_111_0(uniques, 5);
+  f_000_001_000_111_1(uniques, 5);
+  f_000_001_001_000_0(uniques, 5);
+  f_000_001_001_000_1(uniques, 5);
+  f_000_001_001_001_0(uniques, 5);
+  f_000_001_001_001_1(uniques, 5);
+  f_000_001_001_010_0(uniques, 5);
+  f_000_001_001_010_1(uniques, 5);
+  f_000_001_001_011_0(uniques, 5);
+  f_000_001_001_011_1(uniques, 5);
+  f_000_001_001_100_0(uniques, 5);
+  f_000_001_001_100_1(uniques, 5);
+  f_000_001_001_101_0(uniques, 5);
+  f_000_001_001_101_1(uniques, 5);
+  f_000_001_001_110_0(uniques, 5);
+  f_000_001_001_110_1(uniques, 5);
+  f_000_001_001_111_0(uniques, 5);
+  f_000_001_001_111_1(uniques, 5);
+  f_000_001_010_000_0(uniques, 5);
+  f_000_001_010_000_1(uniques, 5);
+  f_000_001_010_001_0(uniques, 5);
+  f_000_001_010_001_1(uniques, 5);
+  f_000_001_010_010_0(uniques, 5);
+  f_000_001_010_010_1(uniques, 5);
+  f_000_001_010_011_0(uniques, 5);
+  f_000_001_010_011_1(uniques, 5);
+  f_000_001_010_100_0(uniques, 5);
+  f_000_001_010_100_1(uniques, 5);
+  f_000_001_010_101_0(uniques, 5);
+  f_000_001_010_101_1(uniques, 5);
+  f_000_001_010_110_0(uniques, 5);
+  f_000_001_010_110_1(uniques, 5);
+  f_000_001_010_111_0(uniques, 5);
+  f_000_001_010_111_1(uniques, 5);
+  f_000_001_011_000_0(uniques, 5);
+  f_000_001_011_000_1(uniques, 5);
+  f_000_001_011_001_0(uniques, 5);
+  f_000_001_011_001_1(uniques, 5);
+  f_000_001_011_010_0(uniques, 5);
+  f_000_001_011_010_1(uniques, 5);
+  f_000_001_011_011_0(uniques, 5);
+  f_000_001_011_011_1(uniques, 5);
+  f_000_001_011_100_0(uniques, 5);
+  f_000_001_011_100_1(uniques, 5);
+  f_000_001_011_101_0(uniques, 5);
+  f_000_001_011_101_1(uniques, 5);
+  f_000_001_011_110_0(uniques, 5);
+  f_000_001_011_110_1(uniques, 5);
+  f_000_001_011_111_0(uniques, 5);
+  f_000_001_011_111_1(uniques, 5);
+  f_000_001_100_000_0(uniques, 5);
+  f_000_001_100_000_1(uniques, 5);
+  f_000_001_100_001_0(uniques, 5);
+  f_000_001_100_001_1(uniques, 5);
+  f_000_001_100_010_0(uniques, 5);
+  f_000_001_100_010_1(uniques, 5);
+  f_000_001_100_011_0(uniques, 5);
+  f_000_001_100_011_1(uniques, 5);
+  f_000_001_100_100_0(uniques, 5);
+  f_000_001_100_100_1(uniques, 5);
+  f_000_001_100_101_0(uniques, 5);
+  f_000_001_100_101_1(uniques, 5);
+  f_000_001_100_110_0(uniques, 5);
+  f_000_001_100_110_1(uniques, 5);
+  f_000_001_100_111_0(uniques, 5);
+  f_000_001_100_111_1(uniques, 5);
+  f_000_001_101_000_0(uniques, 5);
+  f_000_001_101_000_1(uniques, 5);
+  f_000_001_101_001_0(uniques, 5);
+  f_000_001_101_001_1(uniques, 5);
+  f_000_001_101_010_0(uniques, 5);
+  f_000_001_101_010_1(uniques, 5);
+  f_000_001_101_011_0(uniques, 5);
+  f_000_001_101_011_1(uniques, 5);
+  f_000_001_101_100_0(uniques, 5);
+  f_000_001_101_100_1(uniques, 5);
+  f_000_001_101_101_0(uniques, 5);
+  f_000_001_101_101_1(uniques, 5);
+  f_000_001_101_110_0(uniques, 5);
+  f_000_001_101_110_1(uniques, 5);
+  f_000_001_101_111_0(uniques, 5);
+  f_000_001_101_111_1(uniques, 5);
+  f_000_001_110_000_0(uniques, 5);
+  f_000_001_110_000_1(uniques, 5);
+  f_000_001_110_001_0(uniques, 5);
+  f_000_001_110_001_1(uniques, 5);
+  f_000_001_110_010_0(uniques, 5);
+  f_000_001_110_010_1(uniques, 5);
+  f_000_001_110_011_0(uniques, 5);
+  f_000_001_110_011_1(uniques, 5);
+  f_000_001_110_100_0(uniques, 5);
+  f_000_001_110_100_1(uniques, 5);
+  f_000_001_110_101_0(uniques, 5);
+  f_000_001_110_101_1(uniques, 5);
+  f_000_001_110_110_0(uniques, 5);
+  f_000_001_110_110_1(uniques, 5);
+  f_000_001_110_111_0(uniques, 5);
+  f_000_001_110_111_1(uniques, 5);
+  f_000_001_111_000_0(uniques, 5);
+  f_000_001_111_000_1(uniques, 5);
+  f_000_001_111_001_0(uniques, 5);
+  f_000_001_111_001_1(uniques, 5);
+  f_000_001_111_010_0(uniques, 5);
+  f_000_001_111_010_1(uniques, 5);
+  f_000_001_111_011_0(uniques, 5);
+  f_000_001_111_011_1(uniques, 5);
+  f_000_001_111_100_0(uniques, 5);
+  f_000_001_111_100_1(uniques, 5);
+  f_000_001_111_101_0(uniques, 5);
+  f_000_001_111_101_1(uniques, 5);
+  f_000_001_111_110_0(uniques, 5);
+  f_000_001_111_110_1(uniques, 5);
+  f_000_001_111_111_0(uniques, 5);
+  f_000_001_111_111_1(uniques, 5);
+  f_000_011_000_000_0(uniques, 5);
+  f_000_011_000_000_1(uniques, 5);
+  f_000_011_000_001_0(uniques, 5);
+  f_000_011_000_001_1(uniques, 5);
+  f_000_011_000_010_0(uniques, 5);
+  f_000_011_000_010_1(uniques, 5);
+  f_000_011_000_011_0(uniques, 5);
+  f_000_011_000_011_1(uniques, 5);
+  f_000_011_000_100_0(uniques, 5);
+  f_000_011_000_100_1(uniques, 5);
+  f_000_011_000_101_0(uniques, 5);
+  f_000_011_000_101_1(uniques, 5);
+  f_000_011_000_110_0(uniques, 5);
+  f_000_011_000_110_1(uniques, 5);
+  f_000_011_000_111_0(uniques, 5);
+  f_000_011_000_111_1(uniques, 5);
+  f_000_011_001_000_0(uniques, 5);
+  f_000_011_001_000_1(uniques, 5);
+  f_000_011_001_001_0(uniques, 5);
+  f_000_011_001_001_1(uniques, 5);
+  f_000_011_001_010_0(uniques, 5);
+  f_000_011_001_010_1(uniques, 5);
+  f_000_011_001_011_0(uniques, 5);
+  f_000_011_001_011_1(uniques, 5);
+  f_000_011_001_100_0(uniques, 5);
+  f_000_011_001_100_1(uniques, 5);
+  f_000_011_001_101_0(uniques, 5);
+  f_000_011_001_101_1(uniques, 5);
+  f_000_011_001_110_0(uniques, 5);
+  f_000_011_001_110_1(uniques, 5);
+  f_000_011_001_111_0(uniques, 5);
+  f_000_011_001_111_1(uniques, 5);
+  f_000_011_010_000_0(uniques, 5);
+  f_000_011_010_000_1(uniques, 5);
+  f_000_011_010_001_0(uniques, 5);
+  f_000_011_010_001_1(uniques, 5);
+  f_000_011_010_010_0(uniques, 5);
+  f_000_011_010_010_1(uniques, 5);
+  f_000_011_010_011_0(uniques, 5);
+  f_000_011_010_011_1(uniques, 5);
+  f_000_011_010_100_0(uniques, 5);
+  f_000_011_010_100_1(uniques, 5);
+  f_000_011_010_101_0(uniques, 5);
+  f_000_011_010_101_1(uniques, 5);
+  f_000_011_010_110_0(uniques, 5);
+  f_000_011_010_110_1(uniques, 5);
+  f_000_011_010_111_0(uniques, 5);
+  f_000_011_010_111_1(uniques, 5);
+  f_000_011_011_000_0(uniques, 5);
+  f_000_011_011_000_1(uniques, 5);
+  f_000_011_011_001_0(uniques, 5);
+  f_000_011_011_001_1(uniques, 5);
+  f_000_011_011_010_0(uniques, 5);
+  f_000_011_011_010_1(uniques, 5);
+  f_000_011_011_011_0(uniques, 5);
+  f_000_011_011_011_1(uniques, 5);
+  f_000_011_011_100_0(uniques, 5);
+  f_000_011_011_100_1(uniques, 5);
+  f_000_011_011_101_0(uniques, 5);
+  f_000_011_011_101_1(uniques, 5);
+  f_000_011_011_110_0(uniques, 5);
+  f_000_011_011_110_1(uniques, 5);
+  f_000_011_011_111_0(uniques, 5);
+  f_000_011_011_111_1(uniques, 5);
+  f_000_011_100_000_0(uniques, 5);
+  f_000_011_100_000_1(uniques, 5);
+  f_000_011_100_001_0(uniques, 5);
+  f_000_011_100_001_1(uniques, 5);
+  f_000_011_100_010_0(uniques, 5);
+  f_000_011_100_010_1(uniques, 5);
+  f_000_011_100_011_0(uniques, 5);
+  f_000_011_100_011_1(uniques, 5);
+  f_000_011_100_100_0(uniques, 5);
+  f_000_011_100_100_1(uniques, 5);
+  f_000_011_100_101_0(uniques, 5);
+  f_000_011_100_101_1(uniques, 5);
+  f_000_011_100_110_0(uniques, 5);
+  f_000_011_100_110_1(uniques, 5);
+  f_000_011_100_111_0(uniques, 5);
+  f_000_011_100_111_1(uniques, 5);
+  f_000_011_101_000_0(uniques, 5);
+  f_000_011_101_000_1(uniques, 5);
+  f_000_011_101_001_0(uniques, 5);
+  f_000_011_101_001_1(uniques, 5);
+  f_000_011_101_010_0(uniques, 5);
+  f_000_011_101_010_1(uniques, 5);
+  f_000_011_101_011_0(uniques, 5);
+  f_000_011_101_011_1(uniques, 5);
+  f_000_011_101_100_0(uniques, 5);
+  f_000_011_101_100_1(uniques, 5);
+  f_000_011_101_101_0(uniques, 5);
+  f_000_011_101_101_1(uniques, 5);
+  f_000_011_101_110_0(uniques, 5);
+  f_000_011_101_110_1(uniques, 5);
+  f_000_011_101_111_0(uniques, 5);
+  f_000_011_101_111_1(uniques, 5);
+  f_000_011_110_000_0(uniques, 5);
+  f_000_011_110_000_1(uniques, 5);
+  f_000_011_110_001_0(uniques, 5);
+  f_000_011_110_001_1(uniques, 5);
+  f_000_011_110_010_0(uniques, 5);
+  f_000_011_110_010_1(uniques, 5);
+  f_000_011_110_011_0(uniques, 5);
+  f_000_011_110_011_1(uniques, 5);
+  f_000_011_110_100_0(uniques, 5);
+  f_000_011_110_100_1(uniques, 5);
+  f_000_011_110_101_0(uniques, 5);
+  f_000_011_110_101_1(uniques, 5);
+  f_000_011_110_110_0(uniques, 5);
+  f_000_011_110_110_1(uniques, 5);
+  f_000_011_110_111_0(uniques, 5);
+  f_000_011_110_111_1(uniques, 5);
+  f_000_011_111_000_0(uniques, 5);
+  f_000_011_111_000_1(uniques, 5);
+  f_000_011_111_001_0(uniques, 5);
+  f_000_011_111_001_1(uniques, 5);
+  f_000_011_111_010_0(uniques, 5);
+  f_000_011_111_010_1(uniques, 5);
+  f_000_011_111_011_0(uniques, 5);
+  f_000_011_111_011_1(uniques, 5);
+  f_000_011_111_100_0(uniques, 5);
+  f_000_011_111_100_1(uniques, 5);
+  f_000_011_111_101_0(uniques, 5);
+  f_000_011_111_101_1(uniques, 5);
+  f_000_011_111_110_0(uniques, 5);
+  f_000_011_111_110_1(uniques, 5);
+  f_000_011_111_111_0(uniques, 5);
+  f_000_011_111_111_1(uniques, 5);
+  f_000_101_000_000_0(uniques, 5);
+  f_000_101_000_000_1(uniques, 5);
+  f_000_101_000_001_0(uniques, 5);
+  f_000_101_000_001_1(uniques, 5);
+  f_000_101_000_010_0(uniques, 5);
+  f_000_101_000_010_1(uniques, 5);
+  f_000_101_000_011_0(uniques, 5);
+  f_000_101_000_011_1(uniques, 5);
+  f_000_101_000_100_0(uniques, 5);
+  f_000_101_000_100_1(uniques, 5);
+  f_000_101_000_101_0(uniques, 5);
+  f_000_101_000_101_1(uniques, 5);
+  f_000_101_000_110_0(uniques, 5);
+  f_000_101_000_110_1(uniques, 5);
+  f_000_101_000_111_0(uniques, 5);
+  f_000_101_000_111_1(uniques, 5);
+  f_000_101_001_000_0(uniques, 5);
+  f_000_101_001_000_1(uniques, 5);
+  f_000_101_001_001_0(uniques, 5);
+  f_000_101_001_001_1(uniques, 5);
+  f_000_101_001_010_0(uniques, 5);
+  f_000_101_001_010_1(uniques, 5);
+  f_000_101_001_011_0(uniques, 5);
+  f_000_101_001_011_1(uniques, 5);
+  f_000_101_001_100_0(uniques, 5);
+  f_000_101_001_100_1(uniques, 5);
+  f_000_101_001_101_0(uniques, 5);
+  f_000_101_001_101_1(uniques, 5);
+  f_000_101_001_110_0(uniques, 5);
+  f_000_101_001_110_1(uniques, 5);
+  f_000_101_001_111_0(uniques, 5);
+  f_000_101_001_111_1(uniques, 5);
+  f_000_101_010_000_0(uniques, 5);
+  f_000_101_010_000_1(uniques, 5);
+  f_000_101_010_001_0(uniques, 5);
+  f_000_101_010_001_1(uniques, 5);
+  f_000_101_010_010_0(uniques, 5);
+  f_000_101_010_010_1(uniques, 5);
+  f_000_101_010_011_0(uniques, 5);
+  f_000_101_010_011_1(uniques, 5);
+  f_000_101_010_100_0(uniques, 5);
+  f_000_101_010_100_1(uniques, 5);
+  f_000_101_010_101_0(uniques, 5);
+  f_000_101_010_101_1(uniques, 5);
+  f_000_101_010_110_0(uniques, 5);
+  f_000_101_010_110_1(uniques, 5);
+  f_000_101_010_111_0(uniques, 5);
+  f_000_101_010_111_1(uniques, 5);
+  f_000_101_011_000_0(uniques, 5);
+  f_000_101_011_000_1(uniques, 5);
+  f_000_101_011_001_0(uniques, 5);
+  f_000_101_011_001_1(uniques, 5);
+  f_000_101_011_010_0(uniques, 5);
+  f_000_101_011_010_1(uniques, 5);
+  f_000_101_011_011_0(uniques, 5);
+  f_000_101_011_011_1(uniques, 5);
+  f_000_101_011_100_0(uniques, 5);
+  f_000_101_011_100_1(uniques, 5);
+  f_000_101_011_101_0(uniques, 5);
+  f_000_101_011_101_1(uniques, 5);
+  f_000_101_011_110_0(uniques, 5);
+  f_000_101_011_110_1(uniques, 5);
+  f_000_101_011_111_0(uniques, 5);
+  f_000_101_011_111_1(uniques, 5);
+  f_000_101_100_000_0(uniques, 5);
+  f_000_101_100_000_1(uniques, 5);
+  f_000_101_100_001_0(uniques, 5);
+  f_000_101_100_001_1(uniques, 5);
+  f_000_101_100_010_0(uniques, 5);
+  f_000_101_100_010_1(uniques, 5);
+  f_000_101_100_011_0(uniques, 5);
+  f_000_101_100_011_1(uniques, 5);
+  f_000_101_100_100_0(uniques, 5);
+  f_000_101_100_100_1(uniques, 5);
+  f_000_101_100_101_0(uniques, 5);
+  f_000_101_100_101_1(uniques, 5);
+  f_000_101_100_110_0(uniques, 5);
+  f_000_101_100_110_1(uniques, 5);
+  f_000_101_100_111_0(uniques, 5);
+  f_000_101_100_111_1(uniques, 5);
+  f_000_101_101_000_0(uniques, 5);
+  f_000_101_101_000_1(uniques, 5);
+  f_000_101_101_001_0(uniques, 5);
+  f_000_101_101_001_1(uniques, 5);
+  f_000_101_101_010_0(uniques, 5);
+  f_000_101_101_010_1(uniques, 5);
+  f_000_101_101_011_0(uniques, 5);
+  f_000_101_101_011_1(uniques, 5);
+  f_000_101_101_100_0(uniques, 5);
+  f_000_101_101_100_1(uniques, 5);
+  f_000_101_101_101_0(uniques, 5);
+  f_000_101_101_101_1(uniques, 5);
+  f_000_101_101_110_0(uniques, 5);
+  f_000_101_101_110_1(uniques, 5);
+  f_000_101_101_111_0(uniques, 5);
+  f_000_101_101_111_1(uniques, 5);
+  f_000_101_110_000_0(uniques, 5);
+  f_000_101_110_000_1(uniques, 5);
+  f_000_101_110_001_0(uniques, 5);
+  f_000_101_110_001_1(uniques, 5);
+  f_000_101_110_010_0(uniques, 5);
+  f_000_101_110_010_1(uniques, 5);
+  f_000_101_110_011_0(uniques, 5);
+  f_000_101_110_011_1(uniques, 5);
+  f_000_101_110_100_0(uniques, 5);
+  f_000_101_110_100_1(uniques, 5);
+  f_000_101_110_101_0(uniques, 5);
+  f_000_101_110_101_1(uniques, 5);
+  f_000_101_110_110_0(uniques, 5);
+  f_000_101_110_110_1(uniques, 5);
+  f_000_101_110_111_0(uniques, 5);
+  f_000_101_110_111_1(uniques, 5);
+  f_000_101_111_000_0(uniques, 5);
+  f_000_101_111_000_1(uniques, 5);
+  f_000_101_111_001_0(uniques, 5);
+  f_000_101_111_001_1(uniques, 5);
+  f_000_101_111_010_0(uniques, 5);
+  f_000_101_111_010_1(uniques, 5);
+  f_000_101_111_011_0(uniques, 5);
+  f_000_101_111_011_1(uniques, 5);
+  f_000_101_111_100_0(uniques, 5);
+  f_000_101_111_100_1(uniques, 5);
+  f_000_101_111_101_0(uniques, 5);
+  f_000_101_111_101_1(uniques, 5);
+  f_000_101_111_110_0(uniques, 5);
+  f_000_101_111_110_1(uniques, 5);
+  f_000_101_111_111_0(uniques, 5);
+  f_000_101_111_111_1(uniques, 5);
+  f_000_111_000_000_0(uniques, 5);
+  f_000_111_000_000_1(uniques, 5);
+  f_000_111_000_001_0(uniques, 5);
+  f_000_111_000_001_1(uniques, 5);
+  f_000_111_000_010_0(uniques, 5);
+  f_000_111_000_010_1(uniques, 5);
+  f_000_111_000_011_0(uniques, 5);
+  f_000_111_000_011_1(uniques, 5);
+  f_000_111_000_100_0(uniques, 5);
+  f_000_111_000_100_1(uniques, 5);
+  f_000_111_000_101_0(uniques, 5);
+  f_000_111_000_101_1(uniques, 5);
+  f_000_111_000_110_0(uniques, 5);
+  f_000_111_000_110_1(uniques, 5);
+  f_000_111_000_111_0(uniques, 5);
+  f_000_111_000_111_1(uniques, 5);
+  f_000_111_001_000_0(uniques, 5);
+  f_000_111_001_000_1(uniques, 5);
+  f_000_111_001_001_0(uniques, 5);
+  f_000_111_001_001_1(uniques, 5);
+  f_000_111_001_010_0(uniques, 5);
+  f_000_111_001_010_1(uniques, 5);
+  f_000_111_001_011_0(uniques, 5);
+  f_000_111_001_011_1(uniques, 5);
+  f_000_111_001_100_0(uniques, 5);
+  f_000_111_001_100_1(uniques, 5);
+  f_000_111_001_101_0(uniques, 5);
+  f_000_111_001_101_1(uniques, 5);
+  f_000_111_001_110_0(uniques, 5);
+  f_000_111_001_110_1(uniques, 5);
+  f_000_111_001_111_0(uniques, 5);
+  f_000_111_001_111_1(uniques, 5);
+  f_000_111_010_000_0(uniques, 5);
+  f_000_111_010_000_1(uniques, 5);
+  f_000_111_010_001_0(uniques, 5);
+  f_000_111_010_001_1(uniques, 5);
+  f_000_111_010_010_0(uniques, 5);
+  f_000_111_010_010_1(uniques, 5);
+  f_000_111_010_011_0(uniques, 5);
+  f_000_111_010_011_1(uniques, 5);
+  f_000_111_010_100_0(uniques, 5);
+  f_000_111_010_100_1(uniques, 5);
+  f_000_111_010_101_0(uniques, 5);
+  f_000_111_010_101_1(uniques, 5);
+  f_000_111_010_110_0(uniques, 5);
+  f_000_111_010_110_1(uniques, 5);
+  f_000_111_010_111_0(uniques, 5);
+  f_000_111_010_111_1(uniques, 5);
+  f_000_111_011_000_0(uniques, 5);
+  f_000_111_011_000_1(uniques, 5);
+  f_000_111_011_001_0(uniques, 5);
+  f_000_111_011_001_1(uniques, 5);
+  f_000_111_011_010_0(uniques, 5);
+  f_000_111_011_010_1(uniques, 5);
+  f_000_111_011_011_0(uniques, 5);
+  f_000_111_011_011_1(uniques, 5);
+  f_000_111_011_100_0(uniques, 5);
+  f_000_111_011_100_1(uniques, 5);
+  f_000_111_011_101_0(uniques, 5);
+  f_000_111_011_101_1(uniques, 5);
+  f_000_111_011_110_0(uniques, 5);
+  f_000_111_011_110_1(uniques, 5);
+  f_000_111_011_111_0(uniques, 5);
+  f_000_111_011_111_1(uniques, 5);
+  f_000_111_100_000_0(uniques, 5);
+  f_000_111_100_000_1(uniques, 5);
+  f_000_111_100_001_0(uniques, 5);
+  f_000_111_100_001_1(uniques, 5);
+  f_000_111_100_010_0(uniques, 5);
+  f_000_111_100_010_1(uniques, 5);
+  f_000_111_100_011_0(uniques, 5);
+  f_000_111_100_011_1(uniques, 5);
+  f_000_111_100_100_0(uniques, 5);
+  f_000_111_100_100_1(uniques, 5);
+  f_000_111_100_101_0(uniques, 5);
+  f_000_111_100_101_1(uniques, 5);
+  f_000_111_100_110_0(uniques, 5);
+  f_000_111_100_110_1(uniques, 5);
+  f_000_111_100_111_0(uniques, 5);
+  f_000_111_100_111_1(uniques, 5);
+  f_000_111_101_000_0(uniques, 5);
+  f_000_111_101_000_1(uniques, 5);
+  f_000_111_101_001_0(uniques, 5);
+  f_000_111_101_001_1(uniques, 5);
+  f_000_111_101_010_0(uniques, 5);
+  f_000_111_101_010_1(uniques, 5);
+  f_000_111_101_011_0(uniques, 5);
+  f_000_111_101_011_1(uniques, 5);
+  f_000_111_101_100_0(uniques, 5);
+  f_000_111_101_100_1(uniques, 5);
+  f_000_111_101_101_0(uniques, 5);
+  f_000_111_101_101_1(uniques, 5);
+  f_000_111_101_110_0(uniques, 5);
+  f_000_111_101_110_1(uniques, 5);
+  f_000_111_101_111_0(uniques, 5);
+  f_000_111_101_111_1(uniques, 5);
+  f_000_111_110_000_0(uniques, 5);
+  f_000_111_110_000_1(uniques, 5);
+  f_000_111_110_001_0(uniques, 5);
+  f_000_111_110_001_1(uniques, 5);
+  f_000_111_110_010_0(uniques, 5);
+  f_000_111_110_010_1(uniques, 5);
+  f_000_111_110_011_0(uniques, 5);
+  f_000_111_110_011_1(uniques, 5);
+  f_000_111_110_100_0(uniques, 5);
+  f_000_111_110_100_1(uniques, 5);
+  f_000_111_110_101_0(uniques, 5);
+  f_000_111_110_101_1(uniques, 5);
+  f_000_111_110_110_0(uniques, 5);
+  f_000_111_110_110_1(uniques, 5);
+  f_000_111_110_111_0(uniques, 5);
+  f_000_111_110_111_1(uniques, 5);
+  f_000_111_111_000_0(uniques, 5);
+  f_000_111_111_000_1(uniques, 5);
+  f_000_111_111_001_0(uniques, 5);
+  f_000_111_111_001_1(uniques, 5);
+  f_000_111_111_010_0(uniques, 5);
+  f_000_111_111_010_1(uniques, 5);
+  f_000_111_111_011_0(uniques, 5);
+  f_000_111_111_011_1(uniques, 5);
+  f_000_111_111_100_0(uniques, 5);
+  f_000_111_111_100_1(uniques, 5);
+  f_000_111_111_101_0(uniques, 5);
+  f_000_111_111_101_1(uniques, 5);
+  f_000_111_111_110_0(uniques, 5);
+  f_000_111_111_110_1(uniques, 5);
+  f_000_111_111_111_0(uniques, 5);
+  f_000_111_111_111_1(uniques, 5);
+  f_001_001_000_000_0(uniques, 5);
+  f_001_001_000_000_1(uniques, 5);
+  f_001_001_000_001_0(uniques, 5);
+  f_001_001_000_001_1(uniques, 5);
+  f_001_001_000_010_0(uniques, 5);
+  f_001_001_000_010_1(uniques, 5);
+  f_001_001_000_011_0(uniques, 5);
+  f_001_001_000_011_1(uniques, 5);
+  f_001_001_000_100_0(uniques, 5);
+  f_001_001_000_100_1(uniques, 5);
+  f_001_001_000_101_0(uniques, 5);
+  f_001_001_000_101_1(uniques, 5);
+  f_001_001_000_110_0(uniques, 5);
+  f_001_001_000_110_1(uniques, 5);
+  f_001_001_000_111_0(uniques, 5);
+  f_001_001_000_111_1(uniques, 5);
+  f_001_001_001_000_0(uniques, 5);
+  f_001_001_001_000_1(uniques, 5);
+  f_001_001_001_001_0(uniques, 5);
+  f_001_001_001_001_1(uniques, 5);
+  f_001_001_001_010_0(uniques, 5);
+  f_001_001_001_010_1(uniques, 5);
+  f_001_001_001_011_0(uniques, 5);
+  f_001_001_001_011_1(uniques, 5);
+  f_001_001_001_100_0(uniques, 5);
+  f_001_001_001_100_1(uniques, 5);
+  f_001_001_001_101_0(uniques, 5);
+  f_001_001_001_101_1(uniques, 5);
+  f_001_001_001_110_0(uniques, 5);
+  f_001_001_001_110_1(uniques, 5);
+  f_001_001_001_111_0(uniques, 5);
+  f_001_001_001_111_1(uniques, 5);
+  f_001_001_010_000_0(uniques, 5);
+  f_001_001_010_000_1(uniques, 5);
+  f_001_001_010_001_0(uniques, 5);
+  f_001_001_010_001_1(uniques, 5);
+  f_001_001_010_010_0(uniques, 5);
+  f_001_001_010_010_1(uniques, 5);
+  f_001_001_010_011_0(uniques, 5);
+  f_001_001_010_011_1(uniques, 5);
+  f_001_001_010_100_0(uniques, 5);
+  f_001_001_010_100_1(uniques, 5);
+  f_001_001_010_101_0(uniques, 5);
+  f_001_001_010_101_1(uniques, 5);
+  f_001_001_010_110_0(uniques, 5);
+  f_001_001_010_110_1(uniques, 5);
+  f_001_001_010_111_0(uniques, 5);
+  f_001_001_010_111_1(uniques, 5);
+  f_001_001_011_000_0(uniques, 5);
+  f_001_001_011_000_1(uniques, 5);
+  f_001_001_011_001_0(uniques, 5);
+  f_001_001_011_001_1(uniques, 5);
+  f_001_001_011_010_0(uniques, 5);
+  f_001_001_011_010_1(uniques, 5);
+  f_001_001_011_011_0(uniques, 5);
+  f_001_001_011_011_1(uniques, 5);
+  f_001_001_011_100_0(uniques, 5);
+  f_001_001_011_100_1(uniques, 5);
+  f_001_001_011_101_0(uniques, 5);
+  f_001_001_011_101_1(uniques, 5);
+  f_001_001_011_110_0(uniques, 5);
+  f_001_001_011_110_1(uniques, 5);
+  f_001_001_011_111_0(uniques, 5);
+  f_001_001_011_111_1(uniques, 5);
+  f_001_001_100_000_0(uniques, 5);
+  f_001_001_100_000_1(uniques, 5);
+  f_001_001_100_001_0(uniques, 5);
+  f_001_001_100_001_1(uniques, 5);
+  f_001_001_100_010_0(uniques, 5);
+  f_001_001_100_010_1(uniques, 5);
+  f_001_001_100_011_0(uniques, 5);
+  f_001_001_100_011_1(uniques, 5);
+  f_001_001_100_100_0(uniques, 5);
+  f_001_001_100_100_1(uniques, 5);
+  f_001_001_100_101_0(uniques, 5);
+  f_001_001_100_101_1(uniques, 5);
+  f_001_001_100_110_0(uniques, 5);
+  f_001_001_100_110_1(uniques, 5);
+  f_001_001_100_111_0(uniques, 5);
+  f_001_001_100_111_1(uniques, 5);
+  f_001_001_101_000_0(uniques, 5);
+  f_001_001_101_000_1(uniques, 5);
+  f_001_001_101_001_0(uniques, 5);
+  f_001_001_101_001_1(uniques, 5);
+  f_001_001_101_010_0(uniques, 5);
+  f_001_001_101_010_1(uniques, 5);
+  f_001_001_101_011_0(uniques, 5);
+  f_001_001_101_011_1(uniques, 5);
+  f_001_001_101_100_0(uniques, 5);
+  f_001_001_101_100_1(uniques, 5);
+  f_001_001_101_101_0(uniques, 5);
+  f_001_001_101_101_1(uniques, 5);
+  f_001_001_101_110_0(uniques, 5);
+  f_001_001_101_110_1(uniques, 5);
+  f_001_001_101_111_0(uniques, 5);
+  f_001_001_101_111_1(uniques, 5);
+  f_001_001_110_000_0(uniques, 5);
+  f_001_001_110_000_1(uniques, 5);
+  f_001_001_110_001_0(uniques, 5);
+  f_001_001_110_001_1(uniques, 5);
+  f_001_001_110_010_0(uniques, 5);
+  f_001_001_110_010_1(uniques, 5);
+  f_001_001_110_011_0(uniques, 5);
+  f_001_001_110_011_1(uniques, 5);
+  f_001_001_110_100_0(uniques, 5);
+  f_001_001_110_100_1(uniques, 5);
+  f_001_001_110_101_0(uniques, 5);
+  f_001_001_110_101_1(uniques, 5);
+  f_001_001_110_110_0(uniques, 5);
+  f_001_001_110_110_1(uniques, 5);
+  f_001_001_110_111_0(uniques, 5);
+  f_001_001_110_111_1(uniques, 5);
+  f_001_001_111_000_0(uniques, 5);
+  f_001_001_111_000_1(uniques, 5);
+  f_001_001_111_001_0(uniques, 5);
+  f_001_001_111_001_1(uniques, 5);
+  f_001_001_111_010_0(uniques, 5);
+  f_001_001_111_010_1(uniques, 5);
+  f_001_001_111_011_0(uniques, 5);
+  f_001_001_111_011_1(uniques, 5);
+  f_001_001_111_100_0(uniques, 5);
+  f_001_001_111_100_1(uniques, 5);
+  f_001_001_111_101_0(uniques, 5);
+  f_001_001_111_101_1(uniques, 5);
+  f_001_001_111_110_0(uniques, 5);
+  f_001_001_111_110_1(uniques, 5);
+  f_001_001_111_111_0(uniques, 5);
+  f_001_001_111_111_1(uniques, 5);
+  f_001_011_000_000_0(uniques, 5);
+  f_001_011_000_000_1(uniques, 5);
+  f_001_011_000_001_0(uniques, 5);
+  f_001_011_000_001_1(uniques, 5);
+  f_001_011_000_010_0(uniques, 5);
+  f_001_011_000_010_1(uniques, 5);
+  f_001_011_000_011_0(uniques, 5);
+  f_001_011_000_011_1(uniques, 5);
+  f_001_011_000_100_0(uniques, 5);
+  f_001_011_000_100_1(uniques, 5);
+  f_001_011_000_101_0(uniques, 5);
+  f_001_011_000_101_1(uniques, 5);
+  f_001_011_000_110_0(uniques, 5);
+  f_001_011_000_110_1(uniques, 5);
+  f_001_011_000_111_0(uniques, 5);
+  f_001_011_000_111_1(uniques, 5);
+  f_001_011_001_000_0(uniques, 5);
+  f_001_011_001_000_1(uniques, 5);
+  f_001_011_001_001_0(uniques, 5);
+  f_001_011_001_001_1(uniques, 5);
+  f_001_011_001_010_0(uniques, 5);
+  f_001_011_001_010_1(uniques, 5);
+  f_001_011_001_011_0(uniques, 5);
+  f_001_011_001_011_1(uniques, 5);
+  f_001_011_001_100_0(uniques, 5);
+  f_001_011_001_100_1(uniques, 5);
+  f_001_011_001_101_0(uniques, 5);
+  f_001_011_001_101_1(uniques, 5);
+  f_001_011_001_110_0(uniques, 5);
+  f_001_011_001_110_1(uniques, 5);
+  f_001_011_001_111_0(uniques, 5);
+  f_001_011_001_111_1(uniques, 5);
+  f_001_011_010_000_0(uniques, 5);
+  f_001_011_010_000_1(uniques, 5);
+  f_001_011_010_001_0(uniques, 5);
+  f_001_011_010_001_1(uniques, 5);
+  f_001_011_010_010_0(uniques, 5);
+  f_001_011_010_010_1(uniques, 5);
+  f_001_011_010_011_0(uniques, 5);
+  f_001_011_010_011_1(uniques, 5);
+  f_001_011_010_100_0(uniques, 5);
+  f_001_011_010_100_1(uniques, 5);
+  f_001_011_010_101_0(uniques, 5);
+  f_001_011_010_101_1(uniques, 5);
+  f_001_011_010_110_0(uniques, 5);
+  f_001_011_010_110_1(uniques, 5);
+  f_001_011_010_111_0(uniques, 5);
+  f_001_011_010_111_1(uniques, 5);
+  f_001_011_011_000_0(uniques, 5);
+  f_001_011_011_000_1(uniques, 5);
+  f_001_011_011_001_0(uniques, 5);
+  f_001_011_011_001_1(uniques, 5);
+  f_001_011_011_010_0(uniques, 5);
+  f_001_011_011_010_1(uniques, 5);
+  f_001_011_011_011_0(uniques, 5);
+  f_001_011_011_011_1(uniques, 5);
+  f_001_011_011_100_0(uniques, 5);
+  f_001_011_011_100_1(uniques, 5);
+  f_001_011_011_101_0(uniques, 5);
+  f_001_011_011_101_1(uniques, 5);
+  f_001_011_011_110_0(uniques, 5);
+  f_001_011_011_110_1(uniques, 5);
+  f_001_011_011_111_0(uniques, 5);
+  f_001_011_011_111_1(uniques, 5);
+  f_001_011_100_000_0(uniques, 5);
+  f_001_011_100_000_1(uniques, 5);
+  f_001_011_100_001_0(uniques, 5);
+  f_001_011_100_001_1(uniques, 5);
+  f_001_011_100_010_0(uniques, 5);
+  f_001_011_100_010_1(uniques, 5);
+  f_001_011_100_011_0(uniques, 5);
+  f_001_011_100_011_1(uniques, 5);
+  f_001_011_100_100_0(uniques, 5);
+  f_001_011_100_100_1(uniques, 5);
+  f_001_011_100_101_0(uniques, 5);
+  f_001_011_100_101_1(uniques, 5);
+  f_001_011_100_110_0(uniques, 5);
+  f_001_011_100_110_1(uniques, 5);
+  f_001_011_100_111_0(uniques, 5);
+  f_001_011_100_111_1(uniques, 5);
+  f_001_011_101_000_0(uniques, 5);
+  f_001_011_101_000_1(uniques, 5);
+  f_001_011_101_001_0(uniques, 5);
+  f_001_011_101_001_1(uniques, 5);
+  f_001_011_101_010_0(uniques, 5);
+  f_001_011_101_010_1(uniques, 5);
+  f_001_011_101_011_0(uniques, 5);
+  f_001_011_101_011_1(uniques, 5);
+  f_001_011_101_100_0(uniques, 5);
+  f_001_011_101_100_1(uniques, 5);
+  f_001_011_101_101_0(uniques, 5);
+  f_001_011_101_101_1(uniques, 5);
+  f_001_011_101_110_0(uniques, 5);
+  f_001_011_101_110_1(uniques, 5);
+  f_001_011_101_111_0(uniques, 5);
+  f_001_011_101_111_1(uniques, 5);
+  f_001_011_110_000_0(uniques, 5);
+  f_001_011_110_000_1(uniques, 5);
+  f_001_011_110_001_0(uniques, 5);
+  f_001_011_110_001_1(uniques, 5);
+  f_001_011_110_010_0(uniques, 5);
+  f_001_011_110_010_1(uniques, 5);
+  f_001_011_110_011_0(uniques, 5);
+  f_001_011_110_011_1(uniques, 5);
+  f_001_011_110_100_0(uniques, 5);
+  f_001_011_110_100_1(uniques, 5);
+  f_001_011_110_101_0(uniques, 5);
+  f_001_011_110_101_1(uniques, 5);
+  f_001_011_110_110_0(uniques, 5);
+  f_001_011_110_110_1(uniques, 5);
+  f_001_011_110_111_0(uniques, 5);
+  f_001_011_110_111_1(uniques, 5);
+  f_001_011_111_000_0(uniques, 5);
+  f_001_011_111_000_1(uniques, 5);
+  f_001_011_111_001_0(uniques, 5);
+  f_001_011_111_001_1(uniques, 5);
+  f_001_011_111_010_0(uniques, 5);
+  f_001_011_111_010_1(uniques, 5);
+  f_001_011_111_011_0(uniques, 5);
+  f_001_011_111_011_1(uniques, 5);
+  f_001_011_111_100_0(uniques, 5);
+  f_001_011_111_100_1(uniques, 5);
+  f_001_011_111_101_0(uniques, 5);
+  f_001_011_111_101_1(uniques, 5);
+  f_001_011_111_110_0(uniques, 5);
+  f_001_011_111_110_1(uniques, 5);
+  f_001_011_111_111_0(uniques, 5);
+  f_001_011_111_111_1(uniques, 5);
+  f_001_101_000_000_0(uniques, 5);
+  f_001_101_000_000_1(uniques, 5);
+  f_001_101_000_001_0(uniques, 5);
+  f_001_101_000_001_1(uniques, 5);
+  f_001_101_000_010_0(uniques, 5);
+  f_001_101_000_010_1(uniques, 5);
+  f_001_101_000_011_0(uniques, 5);
+  f_001_101_000_011_1(uniques, 5);
+  f_001_101_000_100_0(uniques, 5);
+  f_001_101_000_100_1(uniques, 5);
+  f_001_101_000_101_0(uniques, 5);
+  f_001_101_000_101_1(uniques, 5);
+  f_001_101_000_110_0(uniques, 5);
+  f_001_101_000_110_1(uniques, 5);
+  f_001_101_000_111_0(uniques, 5);
+  f_001_101_000_111_1(uniques, 5);
+  f_001_101_001_000_0(uniques, 5);
+  f_001_101_001_000_1(uniques, 5);
+  f_001_101_001_001_0(uniques, 5);
+  f_001_101_001_001_1(uniques, 5);
+  f_001_101_001_010_0(uniques, 5);
+  f_001_101_001_010_1(uniques, 5);
+  f_001_101_001_011_0(uniques, 5);
+  f_001_101_001_011_1(uniques, 5);
+  f_001_101_001_100_0(uniques, 5);
+  f_001_101_001_100_1(uniques, 5);
+  f_001_101_001_101_0(uniques, 5);
+  f_001_101_001_101_1(uniques, 5);
+  f_001_101_001_110_0(uniques, 5);
+  f_001_101_001_110_1(uniques, 5);
+  f_001_101_001_111_0(uniques, 5);
+  f_001_101_001_111_1(uniques, 5);
+  f_001_101_010_000_0(uniques, 5);
+  f_001_101_010_000_1(uniques, 5);
+  f_001_101_010_001_0(uniques, 5);
+  f_001_101_010_001_1(uniques, 5);
+  f_001_101_010_010_0(uniques, 5);
+  f_001_101_010_010_1(uniques, 5);
+  f_001_101_010_011_0(uniques, 5);
+  f_001_101_010_011_1(uniques, 5);
+  f_001_101_010_100_0(uniques, 5);
+  f_001_101_010_100_1(uniques, 5);
+  f_001_101_010_101_0(uniques, 5);
+  f_001_101_010_101_1(uniques, 5);
+  f_001_101_010_110_0(uniques, 5);
+  f_001_101_010_110_1(uniques, 5);
+  f_001_101_010_111_0(uniques, 5);
+  f_001_101_010_111_1(uniques, 5);
+  f_001_101_011_000_0(uniques, 5);
+  f_001_101_011_000_1(uniques, 5);
+  f_001_101_011_001_0(uniques, 5);
+  f_001_101_011_001_1(uniques, 5);
+  f_001_101_011_010_0(uniques, 5);
+  f_001_101_011_010_1(uniques, 5);
+  f_001_101_011_011_0(uniques, 5);
+  f_001_101_011_011_1(uniques, 5);
+  f_001_101_011_100_0(uniques, 5);
+  f_001_101_011_100_1(uniques, 5);
+  f_001_101_011_101_0(uniques, 5);
+  f_001_101_011_101_1(uniques, 5);
+  f_001_101_011_110_0(uniques, 5);
+  f_001_101_011_110_1(uniques, 5);
+  f_001_101_011_111_0(uniques, 5);
+  f_001_101_011_111_1(uniques, 5);
+  f_001_101_100_000_0(uniques, 5);
+  f_001_101_100_000_1(uniques, 5);
+  f_001_101_100_001_0(uniques, 5);
+  f_001_101_100_001_1(uniques, 5);
+  f_001_101_100_010_0(uniques, 5);
+  f_001_101_100_010_1(uniques, 5);
+  f_001_101_100_011_0(uniques, 5);
+  f_001_101_100_011_1(uniques, 5);
+  f_001_101_100_100_0(uniques, 5);
+  f_001_101_100_100_1(uniques, 5);
+  f_001_101_100_101_0(uniques, 5);
+  f_001_101_100_101_1(uniques, 5);
+  f_001_101_100_110_0(uniques, 5);
+  f_001_101_100_110_1(uniques, 5);
+  f_001_101_100_111_0(uniques, 5);
+  f_001_101_100_111_1(uniques, 5);
+  f_001_101_101_000_0(uniques, 5);
+  f_001_101_101_000_1(uniques, 5);
+  f_001_101_101_001_0(uniques, 5);
+  f_001_101_101_001_1(uniques, 5);
+  f_001_101_101_010_0(uniques, 5);
+  f_001_101_101_010_1(uniques, 5);
+  f_001_101_101_011_0(uniques, 5);
+  f_001_101_101_011_1(uniques, 5);
+  f_001_101_101_100_0(uniques, 5);
+  f_001_101_101_100_1(uniques, 5);
+  f_001_101_101_101_0(uniques, 5);
+  f_001_101_101_101_1(uniques, 5);
+  f_001_101_101_110_0(uniques, 5);
+  f_001_101_101_110_1(uniques, 5);
+  f_001_101_101_111_0(uniques, 5);
+  f_001_101_101_111_1(uniques, 5);
+  f_001_101_110_000_0(uniques, 5);
+  f_001_101_110_000_1(uniques, 5);
+  f_001_101_110_001_0(uniques, 5);
+  f_001_101_110_001_1(uniques, 5);
+  f_001_101_110_010_0(uniques, 5);
+  f_001_101_110_010_1(uniques, 5);
+  f_001_101_110_011_0(uniques, 5);
+  f_001_101_110_011_1(uniques, 5);
+  f_001_101_110_100_0(uniques, 5);
+  f_001_101_110_100_1(uniques, 5);
+  f_001_101_110_101_0(uniques, 5);
+  f_001_101_110_101_1(uniques, 5);
+  f_001_101_110_110_0(uniques, 5);
+  f_001_101_110_110_1(uniques, 5);
+  f_001_101_110_111_0(uniques, 5);
+  f_001_101_110_111_1(uniques, 5);
+  f_001_101_111_000_0(uniques, 5);
+  f_001_101_111_000_1(uniques, 5);
+  f_001_101_111_001_0(uniques, 5);
+  f_001_101_111_001_1(uniques, 5);
+  f_001_101_111_010_0(uniques, 5);
+  f_001_101_111_010_1(uniques, 5);
+  f_001_101_111_011_0(uniques, 5);
+  f_001_101_111_011_1(uniques, 5);
+  f_001_101_111_100_0(uniques, 5);
+  f_001_101_111_100_1(uniques, 5);
+  f_001_101_111_101_0(uniques, 5);
+  f_001_101_111_101_1(uniques, 5);
+  f_001_101_111_110_0(uniques, 5);
+  f_001_101_111_110_1(uniques, 5);
+  f_001_101_111_111_0(uniques, 5);
+  f_001_101_111_111_1(uniques, 5);
+  f_001_111_000_000_0(uniques, 5);
+  f_001_111_000_000_1(uniques, 5);
+  f_001_111_000_001_0(uniques, 5);
+  f_001_111_000_001_1(uniques, 5);
+  f_001_111_000_010_0(uniques, 5);
+  f_001_111_000_010_1(uniques, 5);
+  f_001_111_000_011_0(uniques, 5);
+  f_001_111_000_011_1(uniques, 5);
+  f_001_111_000_100_0(uniques, 5);
+  f_001_111_000_100_1(uniques, 5);
+  f_001_111_000_101_0(uniques, 5);
+  f_001_111_000_101_1(uniques, 5);
+  f_001_111_000_110_0(uniques, 5);
+  f_001_111_000_110_1(uniques, 5);
+  f_001_111_000_111_0(uniques, 5);
+  f_001_111_000_111_1(uniques, 5);
+  f_001_111_001_000_0(uniques, 5);
+  f_001_111_001_000_1(uniques, 5);
+  f_001_111_001_001_0(uniques, 5);
+  f_001_111_001_001_1(uniques, 5);
+  f_001_111_001_010_0(uniques, 5);
+  f_001_111_001_010_1(uniques, 5);
+  f_001_111_001_011_0(uniques, 5);
+  f_001_111_001_011_1(uniques, 5);
+  f_001_111_001_100_0(uniques, 5);
+  f_001_111_001_100_1(uniques, 5);
+  f_001_111_001_101_0(uniques, 5);
+  f_001_111_001_101_1(uniques, 5);
+  f_001_111_001_110_0(uniques, 5);
+  f_001_111_001_110_1(uniques, 5);
+  f_001_111_001_111_0(uniques, 5);
+  f_001_111_001_111_1(uniques, 5);
+  f_001_111_010_000_0(uniques, 5);
+  f_001_111_010_000_1(uniques, 5);
+  f_001_111_010_001_0(uniques, 5);
+  f_001_111_010_001_1(uniques, 5);
+  f_001_111_010_010_0(uniques, 5);
+  f_001_111_010_010_1(uniques, 5);
+  f_001_111_010_011_0(uniques, 5);
+  f_001_111_010_011_1(uniques, 5);
+  f_001_111_010_100_0(uniques, 5);
+  f_001_111_010_100_1(uniques, 5);
+  f_001_111_010_101_0(uniques, 5);
+  f_001_111_010_101_1(uniques, 5);
+  f_001_111_010_110_0(uniques, 5);
+  f_001_111_010_110_1(uniques, 5);
+  f_001_111_010_111_0(uniques, 5);
+  f_001_111_010_111_1(uniques, 5);
+  f_001_111_011_000_0(uniques, 5);
+  f_001_111_011_000_1(uniques, 5);
+  f_001_111_011_001_0(uniques, 5);
+  f_001_111_011_001_1(uniques, 5);
+  f_001_111_011_010_0(uniques, 5);
+  f_001_111_011_010_1(uniques, 5);
+  f_001_111_011_011_0(uniques, 5);
+  f_001_111_011_011_1(uniques, 5);
+  f_001_111_011_100_0(uniques, 5);
+  f_001_111_011_100_1(uniques, 5);
+  f_001_111_011_101_0(uniques, 5);
+  f_001_111_011_101_1(uniques, 5);
+  f_001_111_011_110_0(uniques, 5);
+  f_001_111_011_110_1(uniques, 5);
+  f_001_111_011_111_0(uniques, 5);
+  f_001_111_011_111_1(uniques, 5);
+  f_001_111_100_000_0(uniques, 5);
+  f_001_111_100_000_1(uniques, 5);
+  f_001_111_100_001_0(uniques, 5);
+  f_001_111_100_001_1(uniques, 5);
+  f_001_111_100_010_0(uniques, 5);
+  f_001_111_100_010_1(uniques, 5);
+  f_001_111_100_011_0(uniques, 5);
+  f_001_111_100_011_1(uniques, 5);
+  f_001_111_100_100_0(uniques, 5);
+  f_001_111_100_100_1(uniques, 5);
+  f_001_111_100_101_0(uniques, 5);
+  f_001_111_100_101_1(uniques, 5);
+  f_001_111_100_110_0(uniques, 5);
+  f_001_111_100_110_1(uniques, 5);
+  f_001_111_100_111_0(uniques, 5);
+  f_001_111_100_111_1(uniques, 5);
+  f_001_111_101_000_0(uniques, 5);
+  f_001_111_101_000_1(uniques, 5);
+  f_001_111_101_001_0(uniques, 5);
+  f_001_111_101_001_1(uniques, 5);
+  f_001_111_101_010_0(uniques, 5);
+  f_001_111_101_010_1(uniques, 5);
+  f_001_111_101_011_0(uniques, 5);
+  f_001_111_101_011_1(uniques, 5);
+  f_001_111_101_100_0(uniques, 5);
+  f_001_111_101_100_1(uniques, 5);
+  f_001_111_101_101_0(uniques, 5);
+  f_001_111_101_101_1(uniques, 5);
+  f_001_111_101_110_0(uniques, 5);
+  f_001_111_101_110_1(uniques, 5);
+  f_001_111_101_111_0(uniques, 5);
+  f_001_111_101_111_1(uniques, 5);
+  f_001_111_110_000_0(uniques, 5);
+  f_001_111_110_000_1(uniques, 5);
+  f_001_111_110_001_0(uniques, 5);
+  f_001_111_110_001_1(uniques, 5);
+  f_001_111_110_010_0(uniques, 5);
+  f_001_111_110_010_1(uniques, 5);
+  f_001_111_110_011_0(uniques, 5);
+  f_001_111_110_011_1(uniques, 5);
+  f_001_111_110_100_0(uniques, 5);
+  f_001_111_110_100_1(uniques, 5);
+  f_001_111_110_101_0(uniques, 5);
+  f_001_111_110_101_1(uniques, 5);
+  f_001_111_110_110_0(uniques, 5);
+  f_001_111_110_110_1(uniques, 5);
+  f_001_111_110_111_0(uniques, 5);
+  f_001_111_110_111_1(uniques, 5);
+  f_001_111_111_000_0(uniques, 5);
+  f_001_111_111_000_1(uniques, 5);
+  f_001_111_111_001_0(uniques, 5);
+  f_001_111_111_001_1(uniques, 5);
+  f_001_111_111_010_0(uniques, 5);
+  f_001_111_111_010_1(uniques, 5);
+  f_001_111_111_011_0(uniques, 5);
+  f_001_111_111_011_1(uniques, 5);
+  f_001_111_111_100_0(uniques, 5);
+  f_001_111_111_100_1(uniques, 5);
+  f_001_111_111_101_0(uniques, 5);
+  f_001_111_111_101_1(uniques, 5);
+  f_001_111_111_110_0(uniques, 5);
+  f_001_111_111_110_1(uniques, 5);
+  f_001_111_111_111_0(uniques, 5);
+  f_001_111_111_111_1(uniques, 5);
+  f_010_001_000_000_0(uniques, 5);
+  f_010_001_000_000_1(uniques, 5);
+  f_010_001_000_001_0(uniques, 5);
+  f_010_001_000_001_1(uniques, 5);
+  f_010_001_000_010_0(uniques, 5);
+  f_010_001_000_010_1(uniques, 5);
+  f_010_001_000_011_0(uniques, 5);
+  f_010_001_000_011_1(uniques, 5);
+  f_010_001_000_100_0(uniques, 5);
+  f_010_001_000_100_1(uniques, 5);
+  f_010_001_000_101_0(uniques, 5);
+  f_010_001_000_101_1(uniques, 5);
+  f_010_001_000_110_0(uniques, 5);
+  f_010_001_000_110_1(uniques, 5);
+  f_010_001_000_111_0(uniques, 5);
+  f_010_001_000_111_1(uniques, 5);
+  f_010_001_001_000_0(uniques, 5);
+  f_010_001_001_000_1(uniques, 5);
+  f_010_001_001_001_0(uniques, 5);
+  f_010_001_001_001_1(uniques, 5);
+  f_010_001_001_010_0(uniques, 5);
+  f_010_001_001_010_1(uniques, 5);
+  f_010_001_001_011_0(uniques, 5);
+  f_010_001_001_011_1(uniques, 5);
+  f_010_001_001_100_0(uniques, 5);
+  f_010_001_001_100_1(uniques, 5);
+  f_010_001_001_101_0(uniques, 5);
+  f_010_001_001_101_1(uniques, 5);
+  f_010_001_001_110_0(uniques, 5);
+  f_010_001_001_110_1(uniques, 5);
+  f_010_001_001_111_0(uniques, 5);
+  f_010_001_001_111_1(uniques, 5);
+  f_010_001_010_000_0(uniques, 5);
+  f_010_001_010_000_1(uniques, 5);
+  f_010_001_010_001_0(uniques, 5);
+  f_010_001_010_001_1(uniques, 5);
+  f_010_001_010_010_0(uniques, 5);
+  f_010_001_010_010_1(uniques, 5);
+  f_010_001_010_011_0(uniques, 5);
+  f_010_001_010_011_1(uniques, 5);
+  f_010_001_010_100_0(uniques, 5);
+  f_010_001_010_100_1(uniques, 5);
+  f_010_001_010_101_0(uniques, 5);
+  f_010_001_010_101_1(uniques, 5);
+  f_010_001_010_110_0(uniques, 5);
+  f_010_001_010_110_1(uniques, 5);
+  f_010_001_010_111_0(uniques, 5);
+  f_010_001_010_111_1(uniques, 5);
+  f_010_001_011_000_0(uniques, 5);
+  f_010_001_011_000_1(uniques, 5);
+  f_010_001_011_001_0(uniques, 5);
+  f_010_001_011_001_1(uniques, 5);
+  f_010_001_011_010_0(uniques, 5);
+  f_010_001_011_010_1(uniques, 5);
+  f_010_001_011_011_0(uniques, 5);
+  f_010_001_011_011_1(uniques, 5);
+  f_010_001_011_100_0(uniques, 5);
+  f_010_001_011_100_1(uniques, 5);
+  f_010_001_011_101_0(uniques, 5);
+  f_010_001_011_101_1(uniques, 5);
+  f_010_001_011_110_0(uniques, 5);
+  f_010_001_011_110_1(uniques, 5);
+  f_010_001_011_111_0(uniques, 5);
+  f_010_001_011_111_1(uniques, 5);
+  f_010_001_100_000_0(uniques, 5);
+  f_010_001_100_000_1(uniques, 5);
+  f_010_001_100_001_0(uniques, 5);
+  f_010_001_100_001_1(uniques, 5);
+  f_010_001_100_010_0(uniques, 5);
+  f_010_001_100_010_1(uniques, 5);
+  f_010_001_100_011_0(uniques, 5);
+  f_010_001_100_011_1(uniques, 5);
+  f_010_001_100_100_0(uniques, 5);
+  f_010_001_100_100_1(uniques, 5);
+  f_010_001_100_101_0(uniques, 5);
+  f_010_001_100_101_1(uniques, 5);
+  f_010_001_100_110_0(uniques, 5);
+  f_010_001_100_110_1(uniques, 5);
+  f_010_001_100_111_0(uniques, 5);
+  f_010_001_100_111_1(uniques, 5);
+  f_010_001_101_000_0(uniques, 5);
+  f_010_001_101_000_1(uniques, 5);
+  f_010_001_101_001_0(uniques, 5);
+  f_010_001_101_001_1(uniques, 5);
+  f_010_001_101_010_0(uniques, 5);
+  f_010_001_101_010_1(uniques, 5);
+  f_010_001_101_011_0(uniques, 5);
+  f_010_001_101_011_1(uniques, 5);
+  f_010_001_101_100_0(uniques, 5);
+  f_010_001_101_100_1(uniques, 5);
+  f_010_001_101_101_0(uniques, 5);
+  f_010_001_101_101_1(uniques, 5);
+  f_010_001_101_110_0(uniques, 5);
+  f_010_001_101_110_1(uniques, 5);
+  f_010_001_101_111_0(uniques, 5);
+  f_010_001_101_111_1(uniques, 5);
+  f_010_001_110_000_0(uniques, 5);
+  f_010_001_110_000_1(uniques, 5);
+  f_010_001_110_001_0(uniques, 5);
+  f_010_001_110_001_1(uniques, 5);
+  f_010_001_110_010_0(uniques, 5);
+  f_010_001_110_010_1(uniques, 5);
+  f_010_001_110_011_0(uniques, 5);
+  f_010_001_110_011_1(uniques, 5);
+  f_010_001_110_100_0(uniques, 5);
+  f_010_001_110_100_1(uniques, 5);
+  f_010_001_110_101_0(uniques, 5);
+  f_010_001_110_101_1(uniques, 5);
+  f_010_001_110_110_0(uniques, 5);
+  f_010_001_110_110_1(uniques, 5);
+  f_010_001_110_111_0(uniques, 5);
+  f_010_001_110_111_1(uniques, 5);
+  f_010_001_111_000_0(uniques, 5);
+  f_010_001_111_000_1(uniques, 5);
+  f_010_001_111_001_0(uniques, 5);
+  f_010_001_111_001_1(uniques, 5);
+  f_010_001_111_010_0(uniques, 5);
+  f_010_001_111_010_1(uniques, 5);
+  f_010_001_111_011_0(uniques, 5);
+  f_010_001_111_011_1(uniques, 5);
+  f_010_001_111_100_0(uniques, 5);
+  f_010_001_111_100_1(uniques, 5);
+  f_010_001_111_101_0(uniques, 5);
+  f_010_001_111_101_1(uniques, 5);
+  f_010_001_111_110_0(uniques, 5);
+  f_010_001_111_110_1(uniques, 5);
+  f_010_001_111_111_0(uniques, 5);
+  f_010_001_111_111_1(uniques, 5);
+  f_010_011_000_000_0(uniques, 5);
+  f_010_011_000_000_1(uniques, 5);
+  f_010_011_000_001_0(uniques, 5);
+  f_010_011_000_001_1(uniques, 5);
+  f_010_011_000_010_0(uniques, 5);
+  f_010_011_000_010_1(uniques, 5);
+  f_010_011_000_011_0(uniques, 5);
+  f_010_011_000_011_1(uniques, 5);
+  f_010_011_000_100_0(uniques, 5);
+  f_010_011_000_100_1(uniques, 5);
+  f_010_011_000_101_0(uniques, 5);
+  f_010_011_000_101_1(uniques, 5);
+  f_010_011_000_110_0(uniques, 5);
+  f_010_011_000_110_1(uniques, 5);
+  f_010_011_000_111_0(uniques, 5);
+  f_010_011_000_111_1(uniques, 5);
+  f_010_011_001_000_0(uniques, 5);
+  f_010_011_001_000_1(uniques, 5);
+  f_010_011_001_001_0(uniques, 5);
+  f_010_011_001_001_1(uniques, 5);
+  f_010_011_001_010_0(uniques, 5);
+  f_010_011_001_010_1(uniques, 5);
+  f_010_011_001_011_0(uniques, 5);
+  f_010_011_001_011_1(uniques, 5);
+  f_010_011_001_100_0(uniques, 5);
+  f_010_011_001_100_1(uniques, 5);
+  f_010_011_001_101_0(uniques, 5);
+  f_010_011_001_101_1(uniques, 5);
+  f_010_011_001_110_0(uniques, 5);
+  f_010_011_001_110_1(uniques, 5);
+  f_010_011_001_111_0(uniques, 5);
+  f_010_011_001_111_1(uniques, 5);
+  f_010_011_010_000_0(uniques, 5);
+  f_010_011_010_000_1(uniques, 5);
+  f_010_011_010_001_0(uniques, 5);
+  f_010_011_010_001_1(uniques, 5);
+  f_010_011_010_010_0(uniques, 5);
+  f_010_011_010_010_1(uniques, 5);
+  f_010_011_010_011_0(uniques, 5);
+  f_010_011_010_011_1(uniques, 5);
+  f_010_011_010_100_0(uniques, 5);
+  f_010_011_010_100_1(uniques, 5);
+  f_010_011_010_101_0(uniques, 5);
+  f_010_011_010_101_1(uniques, 5);
+  f_010_011_010_110_0(uniques, 5);
+  f_010_011_010_110_1(uniques, 5);
+  f_010_011_010_111_0(uniques, 5);
+  f_010_011_010_111_1(uniques, 5);
+  f_010_011_011_000_0(uniques, 5);
+  f_010_011_011_000_1(uniques, 5);
+  f_010_011_011_001_0(uniques, 5);
+  f_010_011_011_001_1(uniques, 5);
+  f_010_011_011_010_0(uniques, 5);
+  f_010_011_011_010_1(uniques, 5);
+  f_010_011_011_011_0(uniques, 5);
+  f_010_011_011_011_1(uniques, 5);
+  f_010_011_011_100_0(uniques, 5);
+  f_010_011_011_100_1(uniques, 5);
+  f_010_011_011_101_0(uniques, 5);
+  f_010_011_011_101_1(uniques, 5);
+  f_010_011_011_110_0(uniques, 5);
+  f_010_011_011_110_1(uniques, 5);
+  f_010_011_011_111_0(uniques, 5);
+  f_010_011_011_111_1(uniques, 5);
+  f_010_011_100_000_0(uniques, 5);
+  f_010_011_100_000_1(uniques, 5);
+  f_010_011_100_001_0(uniques, 5);
+  f_010_011_100_001_1(uniques, 5);
+  f_010_011_100_010_0(uniques, 5);
+  f_010_011_100_010_1(uniques, 5);
+  f_010_011_100_011_0(uniques, 5);
+  f_010_011_100_011_1(uniques, 5);
+  f_010_011_100_100_0(uniques, 5);
+  f_010_011_100_100_1(uniques, 5);
+  f_010_011_100_101_0(uniques, 5);
+  f_010_011_100_101_1(uniques, 5);
+  f_010_011_100_110_0(uniques, 5);
+  f_010_011_100_110_1(uniques, 5);
+  f_010_011_100_111_0(uniques, 5);
+  f_010_011_100_111_1(uniques, 5);
+  f_010_011_101_000_0(uniques, 5);
+  f_010_011_101_000_1(uniques, 5);
+  f_010_011_101_001_0(uniques, 5);
+  f_010_011_101_001_1(uniques, 5);
+  f_010_011_101_010_0(uniques, 5);
+  f_010_011_101_010_1(uniques, 5);
+  f_010_011_101_011_0(uniques, 5);
+  f_010_011_101_011_1(uniques, 5);
+  f_010_011_101_100_0(uniques, 5);
+  f_010_011_101_100_1(uniques, 5);
+  f_010_011_101_101_0(uniques, 5);
+  f_010_011_101_101_1(uniques, 5);
+  f_010_011_101_110_0(uniques, 5);
+  f_010_011_101_110_1(uniques, 5);
+  f_010_011_101_111_0(uniques, 5);
+  f_010_011_101_111_1(uniques, 5);
+  f_010_011_110_000_0(uniques, 5);
+  f_010_011_110_000_1(uniques, 5);
+  f_010_011_110_001_0(uniques, 5);
+  f_010_011_110_001_1(uniques, 5);
+  f_010_011_110_010_0(uniques, 5);
+  f_010_011_110_010_1(uniques, 5);
+  f_010_011_110_011_0(uniques, 5);
+  f_010_011_110_011_1(uniques, 5);
+  f_010_011_110_100_0(uniques, 5);
+  f_010_011_110_100_1(uniques, 5);
+  f_010_011_110_101_0(uniques, 5);
+  f_010_011_110_101_1(uniques, 5);
+  f_010_011_110_110_0(uniques, 5);
+  f_010_011_110_110_1(uniques, 5);
+  f_010_011_110_111_0(uniques, 5);
+  f_010_011_110_111_1(uniques, 5);
+  f_010_011_111_000_0(uniques, 5);
+  f_010_011_111_000_1(uniques, 5);
+  f_010_011_111_001_0(uniques, 5);
+  f_010_011_111_001_1(uniques, 5);
+  f_010_011_111_010_0(uniques, 5);
+  f_010_011_111_010_1(uniques, 5);
+  f_010_011_111_011_0(uniques, 5);
+  f_010_011_111_011_1(uniques, 5);
+  f_010_011_111_100_0(uniques, 5);
+  f_010_011_111_100_1(uniques, 5);
+  f_010_011_111_101_0(uniques, 5);
+  f_010_011_111_101_1(uniques, 5);
+  f_010_011_111_110_0(uniques, 5);
+  f_010_011_111_110_1(uniques, 5);
+  f_010_011_111_111_0(uniques, 5);
+  f_010_011_111_111_1(uniques, 5);
+  f_010_101_000_000_0(uniques, 5);
+  f_010_101_000_000_1(uniques, 5);
+  f_010_101_000_001_0(uniques, 5);
+  f_010_101_000_001_1(uniques, 5);
+  f_010_101_000_010_0(uniques, 5);
+  f_010_101_000_010_1(uniques, 5);
+  f_010_101_000_011_0(uniques, 5);
+  f_010_101_000_011_1(uniques, 5);
+  f_010_101_000_100_0(uniques, 5);
+  f_010_101_000_100_1(uniques, 5);
+  f_010_101_000_101_0(uniques, 5);
+  f_010_101_000_101_1(uniques, 5);
+  f_010_101_000_110_0(uniques, 5);
+  f_010_101_000_110_1(uniques, 5);
+  f_010_101_000_111_0(uniques, 5);
+  f_010_101_000_111_1(uniques, 5);
+  f_010_101_001_000_0(uniques, 5);
+  f_010_101_001_000_1(uniques, 5);
+  f_010_101_001_001_0(uniques, 5);
+  f_010_101_001_001_1(uniques, 5);
+  f_010_101_001_010_0(uniques, 5);
+  f_010_101_001_010_1(uniques, 5);
+  f_010_101_001_011_0(uniques, 5);
+  f_010_101_001_011_1(uniques, 5);
+  f_010_101_001_100_0(uniques, 5);
+  f_010_101_001_100_1(uniques, 5);
+  f_010_101_001_101_0(uniques, 5);
+  f_010_101_001_101_1(uniques, 5);
+  f_010_101_001_110_0(uniques, 5);
+  f_010_101_001_110_1(uniques, 5);
+  f_010_101_001_111_0(uniques, 5);
+  f_010_101_001_111_1(uniques, 5);
+  f_010_101_010_000_0(uniques, 5);
+  f_010_101_010_000_1(uniques, 5);
+  f_010_101_010_001_0(uniques, 5);
+  f_010_101_010_001_1(uniques, 5);
+  f_010_101_010_010_0(uniques, 5);
+  f_010_101_010_010_1(uniques, 5);
+  f_010_101_010_011_0(uniques, 5);
+  f_010_101_010_011_1(uniques, 5);
+  f_010_101_010_100_0(uniques, 5);
+  f_010_101_010_100_1(uniques, 5);
+  f_010_101_010_101_0(uniques, 5);
+  f_010_101_010_101_1(uniques, 5);
+  f_010_101_010_110_0(uniques, 5);
+  f_010_101_010_110_1(uniques, 5);
+  f_010_101_010_111_0(uniques, 5);
+  f_010_101_010_111_1(uniques, 5);
+  f_010_101_011_000_0(uniques, 5);
+  f_010_101_011_000_1(uniques, 5);
+  f_010_101_011_001_0(uniques, 5);
+  f_010_101_011_001_1(uniques, 5);
+  f_010_101_011_010_0(uniques, 5);
+  f_010_101_011_010_1(uniques, 5);
+  f_010_101_011_011_0(uniques, 5);
+  f_010_101_011_011_1(uniques, 5);
+  f_010_101_011_100_0(uniques, 5);
+  f_010_101_011_100_1(uniques, 5);
+  f_010_101_011_101_0(uniques, 5);
+  f_010_101_011_101_1(uniques, 5);
+  f_010_101_011_110_0(uniques, 5);
+  f_010_101_011_110_1(uniques, 5);
+  f_010_101_011_111_0(uniques, 5);
+  f_010_101_011_111_1(uniques, 5);
+  f_010_101_100_000_0(uniques, 5);
+  f_010_101_100_000_1(uniques, 5);
+  f_010_101_100_001_0(uniques, 5);
+  f_010_101_100_001_1(uniques, 5);
+  f_010_101_100_010_0(uniques, 5);
+  f_010_101_100_010_1(uniques, 5);
+  f_010_101_100_011_0(uniques, 5);
+  f_010_101_100_011_1(uniques, 5);
+  f_010_101_100_100_0(uniques, 5);
+  f_010_101_100_100_1(uniques, 5);
+  f_010_101_100_101_0(uniques, 5);
+  f_010_101_100_101_1(uniques, 5);
+  f_010_101_100_110_0(uniques, 5);
+  f_010_101_100_110_1(uniques, 5);
+  f_010_101_100_111_0(uniques, 5);
+  f_010_101_100_111_1(uniques, 5);
+  f_010_101_101_000_0(uniques, 5);
+  f_010_101_101_000_1(uniques, 5);
+  f_010_101_101_001_0(uniques, 5);
+  f_010_101_101_001_1(uniques, 5);
+  f_010_101_101_010_0(uniques, 5);
+  f_010_101_101_010_1(uniques, 5);
+  f_010_101_101_011_0(uniques, 5);
+  f_010_101_101_011_1(uniques, 5);
+  f_010_101_101_100_0(uniques, 5);
+  f_010_101_101_100_1(uniques, 5);
+  f_010_101_101_101_0(uniques, 5);
+  f_010_101_101_101_1(uniques, 5);
+  f_010_101_101_110_0(uniques, 5);
+  f_010_101_101_110_1(uniques, 5);
+  f_010_101_101_111_0(uniques, 5);
+  f_010_101_101_111_1(uniques, 5);
+  f_010_101_110_000_0(uniques, 5);
+  f_010_101_110_000_1(uniques, 5);
+  f_010_101_110_001_0(uniques, 5);
+  f_010_101_110_001_1(uniques, 5);
+  f_010_101_110_010_0(uniques, 5);
+  f_010_101_110_010_1(uniques, 5);
+  f_010_101_110_011_0(uniques, 5);
+  f_010_101_110_011_1(uniques, 5);
+  f_010_101_110_100_0(uniques, 5);
+  f_010_101_110_100_1(uniques, 5);
+  f_010_101_110_101_0(uniques, 5);
+  f_010_101_110_101_1(uniques, 5);
+  f_010_101_110_110_0(uniques, 5);
+  f_010_101_110_110_1(uniques, 5);
+  f_010_101_110_111_0(uniques, 5);
+  f_010_101_110_111_1(uniques, 5);
+  f_010_101_111_000_0(uniques, 5);
+  f_010_101_111_000_1(uniques, 5);
+  f_010_101_111_001_0(uniques, 5);
+  f_010_101_111_001_1(uniques, 5);
+  f_010_101_111_010_0(uniques, 5);
+  f_010_101_111_010_1(uniques, 5);
+  f_010_101_111_011_0(uniques, 5);
+  f_010_101_111_011_1(uniques, 5);
+  f_010_101_111_100_0(uniques, 5);
+  f_010_101_111_100_1(uniques, 5);
+  f_010_101_111_101_0(uniques, 5);
+  f_010_101_111_101_1(uniques, 5);
+  f_010_101_111_110_0(uniques, 5);
+  f_010_101_111_110_1(uniques, 5);
+  f_010_101_111_111_0(uniques, 5);
+  f_010_101_111_111_1(uniques, 5);
+  f_010_111_000_000_0(uniques, 5);
+  f_010_111_000_000_1(uniques, 5);
+  f_010_111_000_001_0(uniques, 5);
+  f_010_111_000_001_1(uniques, 5);
+  f_010_111_000_010_0(uniques, 5);
+  f_010_111_000_010_1(uniques, 5);
+  f_010_111_000_011_0(uniques, 5);
+  f_010_111_000_011_1(uniques, 5);
+  f_010_111_000_100_0(uniques, 5);
+  f_010_111_000_100_1(uniques, 5);
+  f_010_111_000_101_0(uniques, 5);
+  f_010_111_000_101_1(uniques, 5);
+  f_010_111_000_110_0(uniques, 5);
+  f_010_111_000_110_1(uniques, 5);
+  f_010_111_000_111_0(uniques, 5);
+  f_010_111_000_111_1(uniques, 5);
+  f_010_111_001_000_0(uniques, 5);
+  f_010_111_001_000_1(uniques, 5);
+  f_010_111_001_001_0(uniques, 5);
+  f_010_111_001_001_1(uniques, 5);
+  f_010_111_001_010_0(uniques, 5);
+  f_010_111_001_010_1(uniques, 5);
+  f_010_111_001_011_0(uniques, 5);
+  f_010_111_001_011_1(uniques, 5);
+  f_010_111_001_100_0(uniques, 5);
+  f_010_111_001_100_1(uniques, 5);
+  f_010_111_001_101_0(uniques, 5);
+  f_010_111_001_101_1(uniques, 5);
+  f_010_111_001_110_0(uniques, 5);
+  f_010_111_001_110_1(uniques, 5);
+  f_010_111_001_111_0(uniques, 5);
+  f_010_111_001_111_1(uniques, 5);
+  f_010_111_010_000_0(uniques, 5);
+  f_010_111_010_000_1(uniques, 5);
+  f_010_111_010_001_0(uniques, 5);
+  f_010_111_010_001_1(uniques, 5);
+  f_010_111_010_010_0(uniques, 5);
+  f_010_111_010_010_1(uniques, 5);
+  f_010_111_010_011_0(uniques, 5);
+  f_010_111_010_011_1(uniques, 5);
+  f_010_111_010_100_0(uniques, 5);
+  f_010_111_010_100_1(uniques, 5);
+  f_010_111_010_101_0(uniques, 5);
+  f_010_111_010_101_1(uniques, 5);
+  f_010_111_010_110_0(uniques, 5);
+  f_010_111_010_110_1(uniques, 5);
+  f_010_111_010_111_0(uniques, 5);
+  f_010_111_010_111_1(uniques, 5);
+  f_010_111_011_000_0(uniques, 5);
+  f_010_111_011_000_1(uniques, 5);
+  f_010_111_011_001_0(uniques, 5);
+  f_010_111_011_001_1(uniques, 5);
+  f_010_111_011_010_0(uniques, 5);
+  f_010_111_011_010_1(uniques, 5);
+  f_010_111_011_011_0(uniques, 5);
+  f_010_111_011_011_1(uniques, 5);
+  f_010_111_011_100_0(uniques, 5);
+  f_010_111_011_100_1(uniques, 5);
+  f_010_111_011_101_0(uniques, 5);
+  f_010_111_011_101_1(uniques, 5);
+  f_010_111_011_110_0(uniques, 5);
+  f_010_111_011_110_1(uniques, 5);
+  f_010_111_011_111_0(uniques, 5);
+  f_010_111_011_111_1(uniques, 5);
+  f_010_111_100_000_0(uniques, 5);
+  f_010_111_100_000_1(uniques, 5);
+  f_010_111_100_001_0(uniques, 5);
+  f_010_111_100_001_1(uniques, 5);
+  f_010_111_100_010_0(uniques, 5);
+  f_010_111_100_010_1(uniques, 5);
+  f_010_111_100_011_0(uniques, 5);
+  f_010_111_100_011_1(uniques, 5);
+  f_010_111_100_100_0(uniques, 5);
+  f_010_111_100_100_1(uniques, 5);
+  f_010_111_100_101_0(uniques, 5);
+  f_010_111_100_101_1(uniques, 5);
+  f_010_111_100_110_0(uniques, 5);
+  f_010_111_100_110_1(uniques, 5);
+  f_010_111_100_111_0(uniques, 5);
+  f_010_111_100_111_1(uniques, 5);
+  f_010_111_101_000_0(uniques, 5);
+  f_010_111_101_000_1(uniques, 5);
+  f_010_111_101_001_0(uniques, 5);
+  f_010_111_101_001_1(uniques, 5);
+  f_010_111_101_010_0(uniques, 5);
+  f_010_111_101_010_1(uniques, 5);
+  f_010_111_101_011_0(uniques, 5);
+  f_010_111_101_011_1(uniques, 5);
+  f_010_111_101_100_0(uniques, 5);
+  f_010_111_101_100_1(uniques, 5);
+  f_010_111_101_101_0(uniques, 5);
+  f_010_111_101_101_1(uniques, 5);
+  f_010_111_101_110_0(uniques, 5);
+  f_010_111_101_110_1(uniques, 5);
+  f_010_111_101_111_0(uniques, 5);
+  f_010_111_101_111_1(uniques, 5);
+  f_010_111_110_000_0(uniques, 5);
+  f_010_111_110_000_1(uniques, 5);
+  f_010_111_110_001_0(uniques, 5);
+  f_010_111_110_001_1(uniques, 5);
+  f_010_111_110_010_0(uniques, 5);
+  f_010_111_110_010_1(uniques, 5);
+  f_010_111_110_011_0(uniques, 5);
+  f_010_111_110_011_1(uniques, 5);
+  f_010_111_110_100_0(uniques, 5);
+  f_010_111_110_100_1(uniques, 5);
+  f_010_111_110_101_0(uniques, 5);
+  f_010_111_110_101_1(uniques, 5);
+  f_010_111_110_110_0(uniques, 5);
+  f_010_111_110_110_1(uniques, 5);
+  f_010_111_110_111_0(uniques, 5);
+  f_010_111_110_111_1(uniques, 5);
+  f_010_111_111_000_0(uniques, 5);
+  f_010_111_111_000_1(uniques, 5);
+  f_010_111_111_001_0(uniques, 5);
+  f_010_111_111_001_1(uniques, 5);
+  f_010_111_111_010_0(uniques, 5);
+  f_010_111_111_010_1(uniques, 5);
+  f_010_111_111_011_0(uniques, 5);
+  f_010_111_111_011_1(uniques, 5);
+  f_010_111_111_100_0(uniques, 5);
+  f_010_111_111_100_1(uniques, 5);
+  f_010_111_111_101_0(uniques, 5);
+  f_010_111_111_101_1(uniques, 5);
+  f_010_111_111_110_0(uniques, 5);
+  f_010_111_111_110_1(uniques, 5);
+  f_010_111_111_111_0(uniques, 5);
+  f_010_111_111_111_1(uniques, 5);
+  f_011_001_000_000_0(uniques, 5);
+  f_011_001_000_000_1(uniques, 5);
+  f_011_001_000_001_0(uniques, 5);
+  f_011_001_000_001_1(uniques, 5);
+  f_011_001_000_010_0(uniques, 5);
+  f_011_001_000_010_1(uniques, 5);
+  f_011_001_000_011_0(uniques, 5);
+  f_011_001_000_011_1(uniques, 5);
+  f_011_001_000_100_0(uniques, 5);
+  f_011_001_000_100_1(uniques, 5);
+  f_011_001_000_101_0(uniques, 5);
+  f_011_001_000_101_1(uniques, 5);
+  f_011_001_000_110_0(uniques, 5);
+  f_011_001_000_110_1(uniques, 5);
+  f_011_001_000_111_0(uniques, 5);
+  f_011_001_000_111_1(uniques, 5);
+  f_011_001_001_000_0(uniques, 5);
+  f_011_001_001_000_1(uniques, 5);
+  f_011_001_001_001_0(uniques, 5);
+  f_011_001_001_001_1(uniques, 5);
+  f_011_001_001_010_0(uniques, 5);
+  f_011_001_001_010_1(uniques, 5);
+  f_011_001_001_011_0(uniques, 5);
+  f_011_001_001_011_1(uniques, 5);
+  f_011_001_001_100_0(uniques, 5);
+  f_011_001_001_100_1(uniques, 5);
+  f_011_001_001_101_0(uniques, 5);
+  f_011_001_001_101_1(uniques, 5);
+  f_011_001_001_110_0(uniques, 5);
+  f_011_001_001_110_1(uniques, 5);
+  f_011_001_001_111_0(uniques, 5);
+  f_011_001_001_111_1(uniques, 5);
+  f_011_001_010_000_0(uniques, 5);
+  f_011_001_010_000_1(uniques, 5);
+  f_011_001_010_001_0(uniques, 5);
+  f_011_001_010_001_1(uniques, 5);
+  f_011_001_010_010_0(uniques, 5);
+  f_011_001_010_010_1(uniques, 5);
+  f_011_001_010_011_0(uniques, 5);
+  f_011_001_010_011_1(uniques, 5);
+  f_011_001_010_100_0(uniques, 5);
+  f_011_001_010_100_1(uniques, 5);
+  f_011_001_010_101_0(uniques, 5);
+  f_011_001_010_101_1(uniques, 5);
+  f_011_001_010_110_0(uniques, 5);
+  f_011_001_010_110_1(uniques, 5);
+  f_011_001_010_111_0(uniques, 5);
+  f_011_001_010_111_1(uniques, 5);
+  f_011_001_011_000_0(uniques, 5);
+  f_011_001_011_000_1(uniques, 5);
+  f_011_001_011_001_0(uniques, 5);
+  f_011_001_011_001_1(uniques, 5);
+  f_011_001_011_010_0(uniques, 5);
+  f_011_001_011_010_1(uniques, 5);
+  f_011_001_011_011_0(uniques, 5);
+  f_011_001_011_011_1(uniques, 5);
+  f_011_001_011_100_0(uniques, 5);
+  f_011_001_011_100_1(uniques, 5);
+  f_011_001_011_101_0(uniques, 5);
+  f_011_001_011_101_1(uniques, 5);
+  f_011_001_011_110_0(uniques, 5);
+  f_011_001_011_110_1(uniques, 5);
+  f_011_001_011_111_0(uniques, 5);
+  f_011_001_011_111_1(uniques, 5);
+  f_011_001_100_000_0(uniques, 5);
+  f_011_001_100_000_1(uniques, 5);
+  f_011_001_100_001_0(uniques, 5);
+  f_011_001_100_001_1(uniques, 5);
+  f_011_001_100_010_0(uniques, 5);
+  f_011_001_100_010_1(uniques, 5);
+  f_011_001_100_011_0(uniques, 5);
+  f_011_001_100_011_1(uniques, 5);
+  f_011_001_100_100_0(uniques, 5);
+  f_011_001_100_100_1(uniques, 5);
+  f_011_001_100_101_0(uniques, 5);
+  f_011_001_100_101_1(uniques, 5);
+  f_011_001_100_110_0(uniques, 5);
+  f_011_001_100_110_1(uniques, 5);
+  f_011_001_100_111_0(uniques, 5);
+  f_011_001_100_111_1(uniques, 5);
+  f_011_001_101_000_0(uniques, 5);
+  f_011_001_101_000_1(uniques, 5);
+  f_011_001_101_001_0(uniques, 5);
+  f_011_001_101_001_1(uniques, 5);
+  f_011_001_101_010_0(uniques, 5);
+  f_011_001_101_010_1(uniques, 5);
+  f_011_001_101_011_0(uniques, 5);
+  f_011_001_101_011_1(uniques, 5);
+  f_011_001_101_100_0(uniques, 5);
+  f_011_001_101_100_1(uniques, 5);
+  f_011_001_101_101_0(uniques, 5);
+  f_011_001_101_101_1(uniques, 5);
+  f_011_001_101_110_0(uniques, 5);
+  f_011_001_101_110_1(uniques, 5);
+  f_011_001_101_111_0(uniques, 5);
+  f_011_001_101_111_1(uniques, 5);
+  f_011_001_110_000_0(uniques, 5);
+  f_011_001_110_000_1(uniques, 5);
+  f_011_001_110_001_0(uniques, 5);
+  f_011_001_110_001_1(uniques, 5);
+  f_011_001_110_010_0(uniques, 5);
+  f_011_001_110_010_1(uniques, 5);
+  f_011_001_110_011_0(uniques, 5);
+  f_011_001_110_011_1(uniques, 5);
+  f_011_001_110_100_0(uniques, 5);
+  f_011_001_110_100_1(uniques, 5);
+  f_011_001_110_101_0(uniques, 5);
+  f_011_001_110_101_1(uniques, 5);
+  f_011_001_110_110_0(uniques, 5);
+  f_011_001_110_110_1(uniques, 5);
+  f_011_001_110_111_0(uniques, 5);
+  f_011_001_110_111_1(uniques, 5);
+  f_011_001_111_000_0(uniques, 5);
+  f_011_001_111_000_1(uniques, 5);
+  f_011_001_111_001_0(uniques, 5);
+  f_011_001_111_001_1(uniques, 5);
+  f_011_001_111_010_0(uniques, 5);
+  f_011_001_111_010_1(uniques, 5);
+  f_011_001_111_011_0(uniques, 5);
+  f_011_001_111_011_1(uniques, 5);
+  f_011_001_111_100_0(uniques, 5);
+  f_011_001_111_100_1(uniques, 5);
+  f_011_001_111_101_0(uniques, 5);
+  f_011_001_111_101_1(uniques, 5);
+  f_011_001_111_110_0(uniques, 5);
+  f_011_001_111_110_1(uniques, 5);
+  f_011_001_111_111_0(uniques, 5);
+  f_011_001_111_111_1(uniques, 5);
+  f_011_011_000_000_0(uniques, 5);
+  f_011_011_000_000_1(uniques, 5);
+  f_011_011_000_001_0(uniques, 5);
+  f_011_011_000_001_1(uniques, 5);
+  f_011_011_000_010_0(uniques, 5);
+  f_011_011_000_010_1(uniques, 5);
+  f_011_011_000_011_0(uniques, 5);
+  f_011_011_000_011_1(uniques, 5);
+  f_011_011_000_100_0(uniques, 5);
+  f_011_011_000_100_1(uniques, 5);
+  f_011_011_000_101_0(uniques, 5);
+  f_011_011_000_101_1(uniques, 5);
+  f_011_011_000_110_0(uniques, 5);
+  f_011_011_000_110_1(uniques, 5);
+  f_011_011_000_111_0(uniques, 5);
+  f_011_011_000_111_1(uniques, 5);
+  f_011_011_001_000_0(uniques, 5);
+  f_011_011_001_000_1(uniques, 5);
+  f_011_011_001_001_0(uniques, 5);
+  f_011_011_001_001_1(uniques, 5);
+  f_011_011_001_010_0(uniques, 5);
+  f_011_011_001_010_1(uniques, 5);
+  f_011_011_001_011_0(uniques, 5);
+  f_011_011_001_011_1(uniques, 5);
+  f_011_011_001_100_0(uniques, 5);
+  f_011_011_001_100_1(uniques, 5);
+  f_011_011_001_101_0(uniques, 5);
+  f_011_011_001_101_1(uniques, 5);
+  f_011_011_001_110_0(uniques, 5);
+  f_011_011_001_110_1(uniques, 5);
+  f_011_011_001_111_0(uniques, 5);
+  f_011_011_001_111_1(uniques, 5);
+  f_011_011_010_000_0(uniques, 5);
+  f_011_011_010_000_1(uniques, 5);
+  f_011_011_010_001_0(uniques, 5);
+  f_011_011_010_001_1(uniques, 5);
+  f_011_011_010_010_0(uniques, 5);
+  f_011_011_010_010_1(uniques, 5);
+  f_011_011_010_011_0(uniques, 5);
+  f_011_011_010_011_1(uniques, 5);
+  f_011_011_010_100_0(uniques, 5);
+  f_011_011_010_100_1(uniques, 5);
+  f_011_011_010_101_0(uniques, 5);
+  f_011_011_010_101_1(uniques, 5);
+  f_011_011_010_110_0(uniques, 5);
+  f_011_011_010_110_1(uniques, 5);
+  f_011_011_010_111_0(uniques, 5);
+  f_011_011_010_111_1(uniques, 5);
+  f_011_011_011_000_0(uniques, 5);
+  f_011_011_011_000_1(uniques, 5);
+  f_011_011_011_001_0(uniques, 5);
+  f_011_011_011_001_1(uniques, 5);
+  f_011_011_011_010_0(uniques, 5);
+  f_011_011_011_010_1(uniques, 5);
+  f_011_011_011_011_0(uniques, 5);
+  f_011_011_011_011_1(uniques, 5);
+  f_011_011_011_100_0(uniques, 5);
+  f_011_011_011_100_1(uniques, 5);
+  f_011_011_011_101_0(uniques, 5);
+  f_011_011_011_101_1(uniques, 5);
+  f_011_011_011_110_0(uniques, 5);
+  f_011_011_011_110_1(uniques, 5);
+  f_011_011_011_111_0(uniques, 5);
+  f_011_011_011_111_1(uniques, 5);
+  f_011_011_100_000_0(uniques, 5);
+  f_011_011_100_000_1(uniques, 5);
+  f_011_011_100_001_0(uniques, 5);
+  f_011_011_100_001_1(uniques, 5);
+  f_011_011_100_010_0(uniques, 5);
+  f_011_011_100_010_1(uniques, 5);
+  f_011_011_100_011_0(uniques, 5);
+  f_011_011_100_011_1(uniques, 5);
+  f_011_011_100_100_0(uniques, 5);
+  f_011_011_100_100_1(uniques, 5);
+  f_011_011_100_101_0(uniques, 5);
+  f_011_011_100_101_1(uniques, 5);
+  f_011_011_100_110_0(uniques, 5);
+  f_011_011_100_110_1(uniques, 5);
+  f_011_011_100_111_0(uniques, 5);
+  f_011_011_100_111_1(uniques, 5);
+  f_011_011_101_000_0(uniques, 5);
+  f_011_011_101_000_1(uniques, 5);
+  f_011_011_101_001_0(uniques, 5);
+  f_011_011_101_001_1(uniques, 5);
+  f_011_011_101_010_0(uniques, 5);
+  f_011_011_101_010_1(uniques, 5);
+  f_011_011_101_011_0(uniques, 5);
+  f_011_011_101_011_1(uniques, 5);
+  f_011_011_101_100_0(uniques, 5);
+  f_011_011_101_100_1(uniques, 5);
+  f_011_011_101_101_0(uniques, 5);
+  f_011_011_101_101_1(uniques, 5);
+  f_011_011_101_110_0(uniques, 5);
+  f_011_011_101_110_1(uniques, 5);
+  f_011_011_101_111_0(uniques, 5);
+  f_011_011_101_111_1(uniques, 5);
+  f_011_011_110_000_0(uniques, 5);
+  f_011_011_110_000_1(uniques, 5);
+  f_011_011_110_001_0(uniques, 5);
+  f_011_011_110_001_1(uniques, 5);
+  f_011_011_110_010_0(uniques, 5);
+  f_011_011_110_010_1(uniques, 5);
+  f_011_011_110_011_0(uniques, 5);
+  f_011_011_110_011_1(uniques, 5);
+  f_011_011_110_100_0(uniques, 5);
+  f_011_011_110_100_1(uniques, 5);
+  f_011_011_110_101_0(uniques, 5);
+  f_011_011_110_101_1(uniques, 5);
+  f_011_011_110_110_0(uniques, 5);
+  f_011_011_110_110_1(uniques, 5);
+  f_011_011_110_111_0(uniques, 5);
+  f_011_011_110_111_1(uniques, 5);
+  f_011_011_111_000_0(uniques, 5);
+  f_011_011_111_000_1(uniques, 5);
+  f_011_011_111_001_0(uniques, 5);
+  f_011_011_111_001_1(uniques, 5);
+  f_011_011_111_010_0(uniques, 5);
+  f_011_011_111_010_1(uniques, 5);
+  f_011_011_111_011_0(uniques, 5);
+  f_011_011_111_011_1(uniques, 5);
+  f_011_011_111_100_0(uniques, 5);
+  f_011_011_111_100_1(uniques, 5);
+  f_011_011_111_101_0(uniques, 5);
+  f_011_011_111_101_1(uniques, 5);
+  f_011_011_111_110_0(uniques, 5);
+  f_011_011_111_110_1(uniques, 5);
+  f_011_011_111_111_0(uniques, 5);
+  f_011_011_111_111_1(uniques, 5);
+  f_011_101_000_000_0(uniques, 5);
+  f_011_101_000_000_1(uniques, 5);
+  f_011_101_000_001_0(uniques, 5);
+  f_011_101_000_001_1(uniques, 5);
+  f_011_101_000_010_0(uniques, 5);
+  f_011_101_000_010_1(uniques, 5);
+  f_011_101_000_011_0(uniques, 5);
+  f_011_101_000_011_1(uniques, 5);
+  f_011_101_000_100_0(uniques, 5);
+  f_011_101_000_100_1(uniques, 5);
+  f_011_101_000_101_0(uniques, 5);
+  f_011_101_000_101_1(uniques, 5);
+  f_011_101_000_110_0(uniques, 5);
+  f_011_101_000_110_1(uniques, 5);
+  f_011_101_000_111_0(uniques, 5);
+  f_011_101_000_111_1(uniques, 5);
+  f_011_101_001_000_0(uniques, 5);
+  f_011_101_001_000_1(uniques, 5);
+  f_011_101_001_001_0(uniques, 5);
+  f_011_101_001_001_1(uniques, 5);
+  f_011_101_001_010_0(uniques, 5);
+  f_011_101_001_010_1(uniques, 5);
+  f_011_101_001_011_0(uniques, 5);
+  f_011_101_001_011_1(uniques, 5);
+  f_011_101_001_100_0(uniques, 5);
+  f_011_101_001_100_1(uniques, 5);
+  f_011_101_001_101_0(uniques, 5);
+  f_011_101_001_101_1(uniques, 5);
+  f_011_101_001_110_0(uniques, 5);
+  f_011_101_001_110_1(uniques, 5);
+  f_011_101_001_111_0(uniques, 5);
+  f_011_101_001_111_1(uniques, 5);
+  f_011_101_010_000_0(uniques, 5);
+  f_011_101_010_000_1(uniques, 5);
+  f_011_101_010_001_0(uniques, 5);
+  f_011_101_010_001_1(uniques, 5);
+  f_011_101_010_010_0(uniques, 5);
+  f_011_101_010_010_1(uniques, 5);
+  f_011_101_010_011_0(uniques, 5);
+  f_011_101_010_011_1(uniques, 5);
+  f_011_101_010_100_0(uniques, 5);
+  f_011_101_010_100_1(uniques, 5);
+  f_011_101_010_101_0(uniques, 5);
+  f_011_101_010_101_1(uniques, 5);
+  f_011_101_010_110_0(uniques, 5);
+  f_011_101_010_110_1(uniques, 5);
+  f_011_101_010_111_0(uniques, 5);
+  f_011_101_010_111_1(uniques, 5);
+  f_011_101_011_000_0(uniques, 5);
+  f_011_101_011_000_1(uniques, 5);
+  f_011_101_011_001_0(uniques, 5);
+  f_011_101_011_001_1(uniques, 5);
+  f_011_101_011_010_0(uniques, 5);
+  f_011_101_011_010_1(uniques, 5);
+  f_011_101_011_011_0(uniques, 5);
+  f_011_101_011_011_1(uniques, 5);
+  f_011_101_011_100_0(uniques, 5);
+  f_011_101_011_100_1(uniques, 5);
+  f_011_101_011_101_0(uniques, 5);
+  f_011_101_011_101_1(uniques, 5);
+  f_011_101_011_110_0(uniques, 5);
+  f_011_101_011_110_1(uniques, 5);
+  f_011_101_011_111_0(uniques, 5);
+  f_011_101_011_111_1(uniques, 5);
+  f_011_101_100_000_0(uniques, 5);
+  f_011_101_100_000_1(uniques, 5);
+  f_011_101_100_001_0(uniques, 5);
+  f_011_101_100_001_1(uniques, 5);
+  f_011_101_100_010_0(uniques, 5);
+  f_011_101_100_010_1(uniques, 5);
+  f_011_101_100_011_0(uniques, 5);
+  f_011_101_100_011_1(uniques, 5);
+  f_011_101_100_100_0(uniques, 5);
+  f_011_101_100_100_1(uniques, 5);
+  f_011_101_100_101_0(uniques, 5);
+  f_011_101_100_101_1(uniques, 5);
+  f_011_101_100_110_0(uniques, 5);
+  f_011_101_100_110_1(uniques, 5);
+  f_011_101_100_111_0(uniques, 5);
+  f_011_101_100_111_1(uniques, 5);
+  f_011_101_101_000_0(uniques, 5);
+  f_011_101_101_000_1(uniques, 5);
+  f_011_101_101_001_0(uniques, 5);
+  f_011_101_101_001_1(uniques, 5);
+  f_011_101_101_010_0(uniques, 5);
+  f_011_101_101_010_1(uniques, 5);
+  f_011_101_101_011_0(uniques, 5);
+  f_011_101_101_011_1(uniques, 5);
+  f_011_101_101_100_0(uniques, 5);
+  f_011_101_101_100_1(uniques, 5);
+  f_011_101_101_101_0(uniques, 5);
+  f_011_101_101_101_1(uniques, 5);
+  f_011_101_101_110_0(uniques, 5);
+  f_011_101_101_110_1(uniques, 5);
+  f_011_101_101_111_0(uniques, 5);
+  f_011_101_101_111_1(uniques, 5);
+  f_011_101_110_000_0(uniques, 5);
+  f_011_101_110_000_1(uniques, 5);
+  f_011_101_110_001_0(uniques, 5);
+  f_011_101_110_001_1(uniques, 5);
+  f_011_101_110_010_0(uniques, 5);
+  f_011_101_110_010_1(uniques, 5);
+  f_011_101_110_011_0(uniques, 5);
+  f_011_101_110_011_1(uniques, 5);
+  f_011_101_110_100_0(uniques, 5);
+  f_011_101_110_100_1(uniques, 5);
+  f_011_101_110_101_0(uniques, 5);
+  f_011_101_110_101_1(uniques, 5);
+  f_011_101_110_110_0(uniques, 5);
+  f_011_101_110_110_1(uniques, 5);
+  f_011_101_110_111_0(uniques, 5);
+  f_011_101_110_111_1(uniques, 5);
+  f_011_101_111_000_0(uniques, 5);
+  f_011_101_111_000_1(uniques, 5);
+  f_011_101_111_001_0(uniques, 5);
+  f_011_101_111_001_1(uniques, 5);
+  f_011_101_111_010_0(uniques, 5);
+  f_011_101_111_010_1(uniques, 5);
+  f_011_101_111_011_0(uniques, 5);
+  f_011_101_111_011_1(uniques, 5);
+  f_011_101_111_100_0(uniques, 5);
+  f_011_101_111_100_1(uniques, 5);
+  f_011_101_111_101_0(uniques, 5);
+  f_011_101_111_101_1(uniques, 5);
+  f_011_101_111_110_0(uniques, 5);
+  f_011_101_111_110_1(uniques, 5);
+  f_011_101_111_111_0(uniques, 5);
+  f_011_101_111_111_1(uniques, 5);
+  f_011_111_000_000_0(uniques, 5);
+  f_011_111_000_000_1(uniques, 5);
+  f_011_111_000_001_0(uniques, 5);
+  f_011_111_000_001_1(uniques, 5);
+  f_011_111_000_010_0(uniques, 5);
+  f_011_111_000_010_1(uniques, 5);
+  f_011_111_000_011_0(uniques, 5);
+  f_011_111_000_011_1(uniques, 5);
+  f_011_111_000_100_0(uniques, 5);
+  f_011_111_000_100_1(uniques, 5);
+  f_011_111_000_101_0(uniques, 5);
+  f_011_111_000_101_1(uniques, 5);
+  f_011_111_000_110_0(uniques, 5);
+  f_011_111_000_110_1(uniques, 5);
+  f_011_111_000_111_0(uniques, 5);
+  f_011_111_000_111_1(uniques, 5);
+  f_011_111_001_000_0(uniques, 5);
+  f_011_111_001_000_1(uniques, 5);
+  f_011_111_001_001_0(uniques, 5);
+  f_011_111_001_001_1(uniques, 5);
+  f_011_111_001_010_0(uniques, 5);
+  f_011_111_001_010_1(uniques, 5);
+  f_011_111_001_011_0(uniques, 5);
+  f_011_111_001_011_1(uniques, 5);
+  f_011_111_001_100_0(uniques, 5);
+  f_011_111_001_100_1(uniques, 5);
+  f_011_111_001_101_0(uniques, 5);
+  f_011_111_001_101_1(uniques, 5);
+  f_011_111_001_110_0(uniques, 5);
+  f_011_111_001_110_1(uniques, 5);
+  f_011_111_001_111_0(uniques, 5);
+  f_011_111_001_111_1(uniques, 5);
+  f_011_111_010_000_0(uniques, 5);
+  f_011_111_010_000_1(uniques, 5);
+  f_011_111_010_001_0(uniques, 5);
+  f_011_111_010_001_1(uniques, 5);
+  f_011_111_010_010_0(uniques, 5);
+  f_011_111_010_010_1(uniques, 5);
+  f_011_111_010_011_0(uniques, 5);
+  f_011_111_010_011_1(uniques, 5);
+  f_011_111_010_100_0(uniques, 5);
+  f_011_111_010_100_1(uniques, 5);
+  f_011_111_010_101_0(uniques, 5);
+  f_011_111_010_101_1(uniques, 5);
+  f_011_111_010_110_0(uniques, 5);
+  f_011_111_010_110_1(uniques, 5);
+  f_011_111_010_111_0(uniques, 5);
+  f_011_111_010_111_1(uniques, 5);
+  f_011_111_011_000_0(uniques, 5);
+  f_011_111_011_000_1(uniques, 5);
+  f_011_111_011_001_0(uniques, 5);
+  f_011_111_011_001_1(uniques, 5);
+  f_011_111_011_010_0(uniques, 5);
+  f_011_111_011_010_1(uniques, 5);
+  f_011_111_011_011_0(uniques, 5);
+  f_011_111_011_011_1(uniques, 5);
+  f_011_111_011_100_0(uniques, 5);
+  f_011_111_011_100_1(uniques, 5);
+  f_011_111_011_101_0(uniques, 5);
+  f_011_111_011_101_1(uniques, 5);
+  f_011_111_011_110_0(uniques, 5);
+  f_011_111_011_110_1(uniques, 5);
+  f_011_111_011_111_0(uniques, 5);
+  f_011_111_011_111_1(uniques, 5);
+  f_011_111_100_000_0(uniques, 5);
+  f_011_111_100_000_1(uniques, 5);
+  f_011_111_100_001_0(uniques, 5);
+  f_011_111_100_001_1(uniques, 5);
+  f_011_111_100_010_0(uniques, 5);
+  f_011_111_100_010_1(uniques, 5);
+  f_011_111_100_011_0(uniques, 5);
+  f_011_111_100_011_1(uniques, 5);
+  f_011_111_100_100_0(uniques, 5);
+  f_011_111_100_100_1(uniques, 5);
+  f_011_111_100_101_0(uniques, 5);
+  f_011_111_100_101_1(uniques, 5);
+  f_011_111_100_110_0(uniques, 5);
+  f_011_111_100_110_1(uniques, 5);
+  f_011_111_100_111_0(uniques, 5);
+  f_011_111_100_111_1(uniques, 5);
+  f_011_111_101_000_0(uniques, 5);
+  f_011_111_101_000_1(uniques, 5);
+  f_011_111_101_001_0(uniques, 5);
+  f_011_111_101_001_1(uniques, 5);
+  f_011_111_101_010_0(uniques, 5);
+  f_011_111_101_010_1(uniques, 5);
+  f_011_111_101_011_0(uniques, 5);
+  f_011_111_101_011_1(uniques, 5);
+  f_011_111_101_100_0(uniques, 5);
+  f_011_111_101_100_1(uniques, 5);
+  f_011_111_101_101_0(uniques, 5);
+  f_011_111_101_101_1(uniques, 5);
+  f_011_111_101_110_0(uniques, 5);
+  f_011_111_101_110_1(uniques, 5);
+  f_011_111_101_111_0(uniques, 5);
+  f_011_111_101_111_1(uniques, 5);
+  f_011_111_110_000_0(uniques, 5);
+  f_011_111_110_000_1(uniques, 5);
+  f_011_111_110_001_0(uniques, 5);
+  f_011_111_110_001_1(uniques, 5);
+  f_011_111_110_010_0(uniques, 5);
+  f_011_111_110_010_1(uniques, 5);
+  f_011_111_110_011_0(uniques, 5);
+  f_011_111_110_011_1(uniques, 5);
+  f_011_111_110_100_0(uniques, 5);
+  f_011_111_110_100_1(uniques, 5);
+  f_011_111_110_101_0(uniques, 5);
+  f_011_111_110_101_1(uniques, 5);
+  f_011_111_110_110_0(uniques, 5);
+  f_011_111_110_110_1(uniques, 5);
+  f_011_111_110_111_0(uniques, 5);
+  f_011_111_110_111_1(uniques, 5);
+  f_011_111_111_000_0(uniques, 5);
+  f_011_111_111_000_1(uniques, 5);
+  f_011_111_111_001_0(uniques, 5);
+  f_011_111_111_001_1(uniques, 5);
+  f_011_111_111_010_0(uniques, 5);
+  f_011_111_111_010_1(uniques, 5);
+  f_011_111_111_011_0(uniques, 5);
+  f_011_111_111_011_1(uniques, 5);
+  f_011_111_111_100_0(uniques, 5);
+  f_011_111_111_100_1(uniques, 5);
+  f_011_111_111_101_0(uniques, 5);
+  f_011_111_111_101_1(uniques, 5);
+  f_011_111_111_110_0(uniques, 5);
+  f_011_111_111_110_1(uniques, 5);
+  f_011_111_111_111_0(uniques, 5);
+  f_011_111_111_111_1(uniques, 5);
+  f_100_001_000_000_0(uniques, 5);
+  f_100_001_000_000_1(uniques, 5);
+  f_100_001_000_001_0(uniques, 5);
+  f_100_001_000_001_1(uniques, 5);
+  f_100_001_000_010_0(uniques, 5);
+  f_100_001_000_010_1(uniques, 5);
+  f_100_001_000_011_0(uniques, 5);
+  f_100_001_000_011_1(uniques, 5);
+  f_100_001_000_100_0(uniques, 5);
+  f_100_001_000_100_1(uniques, 5);
+  f_100_001_000_101_0(uniques, 5);
+  f_100_001_000_101_1(uniques, 5);
+  f_100_001_000_110_0(uniques, 5);
+  f_100_001_000_110_1(uniques, 5);
+  f_100_001_000_111_0(uniques, 5);
+  f_100_001_000_111_1(uniques, 5);
+  f_100_001_001_000_0(uniques, 5);
+  f_100_001_001_000_1(uniques, 5);
+  f_100_001_001_001_0(uniques, 5);
+  f_100_001_001_001_1(uniques, 5);
+  f_100_001_001_010_0(uniques, 5);
+  f_100_001_001_010_1(uniques, 5);
+  f_100_001_001_011_0(uniques, 5);
+  f_100_001_001_011_1(uniques, 5);
+  f_100_001_001_100_0(uniques, 5);
+  f_100_001_001_100_1(uniques, 5);
+  f_100_001_001_101_0(uniques, 5);
+  f_100_001_001_101_1(uniques, 5);
+  f_100_001_001_110_0(uniques, 5);
+  f_100_001_001_110_1(uniques, 5);
+  f_100_001_001_111_0(uniques, 5);
+  f_100_001_001_111_1(uniques, 5);
+  f_100_001_010_000_0(uniques, 5);
+  f_100_001_010_000_1(uniques, 5);
+  f_100_001_010_001_0(uniques, 5);
+  f_100_001_010_001_1(uniques, 5);
+  f_100_001_010_010_0(uniques, 5);
+  f_100_001_010_010_1(uniques, 5);
+  f_100_001_010_011_0(uniques, 5);
+  f_100_001_010_011_1(uniques, 5);
+  f_100_001_010_100_0(uniques, 5);
+  f_100_001_010_100_1(uniques, 5);
+  f_100_001_010_101_0(uniques, 5);
+  f_100_001_010_101_1(uniques, 5);
+  f_100_001_010_110_0(uniques, 5);
+  f_100_001_010_110_1(uniques, 5);
+  f_100_001_010_111_0(uniques, 5);
+  f_100_001_010_111_1(uniques, 5);
+  f_100_001_011_000_0(uniques, 5);
+  f_100_001_011_000_1(uniques, 5);
+  f_100_001_011_001_0(uniques, 5);
+  f_100_001_011_001_1(uniques, 5);
+  f_100_001_011_010_0(uniques, 5);
+  f_100_001_011_010_1(uniques, 5);
+  f_100_001_011_011_0(uniques, 5);
+  f_100_001_011_011_1(uniques, 5);
+  f_100_001_011_100_0(uniques, 5);
+  f_100_001_011_100_1(uniques, 5);
+  f_100_001_011_101_0(uniques, 5);
+  f_100_001_011_101_1(uniques, 5);
+  f_100_001_011_110_0(uniques, 5);
+  f_100_001_011_110_1(uniques, 5);
+  f_100_001_011_111_0(uniques, 5);
+  f_100_001_011_111_1(uniques, 5);
+  f_100_001_100_000_0(uniques, 5);
+  f_100_001_100_000_1(uniques, 5);
+  f_100_001_100_001_0(uniques, 5);
+  f_100_001_100_001_1(uniques, 5);
+  f_100_001_100_010_0(uniques, 5);
+  f_100_001_100_010_1(uniques, 5);
+  f_100_001_100_011_0(uniques, 5);
+  f_100_001_100_011_1(uniques, 5);
+  f_100_001_100_100_0(uniques, 5);
+  f_100_001_100_100_1(uniques, 5);
+  f_100_001_100_101_0(uniques, 5);
+  f_100_001_100_101_1(uniques, 5);
+  f_100_001_100_110_0(uniques, 5);
+  f_100_001_100_110_1(uniques, 5);
+  f_100_001_100_111_0(uniques, 5);
+  f_100_001_100_111_1(uniques, 5);
+  f_100_001_101_000_0(uniques, 5);
+  f_100_001_101_000_1(uniques, 5);
+  f_100_001_101_001_0(uniques, 5);
+  f_100_001_101_001_1(uniques, 5);
+  f_100_001_101_010_0(uniques, 5);
+  f_100_001_101_010_1(uniques, 5);
+  f_100_001_101_011_0(uniques, 5);
+  f_100_001_101_011_1(uniques, 5);
+  f_100_001_101_100_0(uniques, 5);
+  f_100_001_101_100_1(uniques, 5);
+  f_100_001_101_101_0(uniques, 5);
+  f_100_001_101_101_1(uniques, 5);
+  f_100_001_101_110_0(uniques, 5);
+  f_100_001_101_110_1(uniques, 5);
+  f_100_001_101_111_0(uniques, 5);
+  f_100_001_101_111_1(uniques, 5);
+  f_100_001_110_000_0(uniques, 5);
+  f_100_001_110_000_1(uniques, 5);
+  f_100_001_110_001_0(uniques, 5);
+  f_100_001_110_001_1(uniques, 5);
+  f_100_001_110_010_0(uniques, 5);
+  f_100_001_110_010_1(uniques, 5);
+  f_100_001_110_011_0(uniques, 5);
+  f_100_001_110_011_1(uniques, 5);
+  f_100_001_110_100_0(uniques, 5);
+  f_100_001_110_100_1(uniques, 5);
+  f_100_001_110_101_0(uniques, 5);
+  f_100_001_110_101_1(uniques, 5);
+  f_100_001_110_110_0(uniques, 5);
+  f_100_001_110_110_1(uniques, 5);
+  f_100_001_110_111_0(uniques, 5);
+  f_100_001_110_111_1(uniques, 5);
+  f_100_001_111_000_0(uniques, 5);
+  f_100_001_111_000_1(uniques, 5);
+  f_100_001_111_001_0(uniques, 5);
+  f_100_001_111_001_1(uniques, 5);
+  f_100_001_111_010_0(uniques, 5);
+  f_100_001_111_010_1(uniques, 5);
+  f_100_001_111_011_0(uniques, 5);
+  f_100_001_111_011_1(uniques, 5);
+  f_100_001_111_100_0(uniques, 5);
+  f_100_001_111_100_1(uniques, 5);
+  f_100_001_111_101_0(uniques, 5);
+  f_100_001_111_101_1(uniques, 5);
+  f_100_001_111_110_0(uniques, 5);
+  f_100_001_111_110_1(uniques, 5);
+  f_100_001_111_111_0(uniques, 5);
+  f_100_001_111_111_1(uniques, 5);
+  f_100_011_000_000_0(uniques, 5);
+  f_100_011_000_000_1(uniques, 5);
+  f_100_011_000_001_0(uniques, 5);
+  f_100_011_000_001_1(uniques, 5);
+  f_100_011_000_010_0(uniques, 5);
+  f_100_011_000_010_1(uniques, 5);
+  f_100_011_000_011_0(uniques, 5);
+  f_100_011_000_011_1(uniques, 5);
+  f_100_011_000_100_0(uniques, 5);
+  f_100_011_000_100_1(uniques, 5);
+  f_100_011_000_101_0(uniques, 5);
+  f_100_011_000_101_1(uniques, 5);
+  f_100_011_000_110_0(uniques, 5);
+  f_100_011_000_110_1(uniques, 5);
+  f_100_011_000_111_0(uniques, 5);
+  f_100_011_000_111_1(uniques, 5);
+  f_100_011_001_000_0(uniques, 5);
+  f_100_011_001_000_1(uniques, 5);
+  f_100_011_001_001_0(uniques, 5);
+  f_100_011_001_001_1(uniques, 5);
+  f_100_011_001_010_0(uniques, 5);
+  f_100_011_001_010_1(uniques, 5);
+  f_100_011_001_011_0(uniques, 5);
+  f_100_011_001_011_1(uniques, 5);
+  f_100_011_001_100_0(uniques, 5);
+  f_100_011_001_100_1(uniques, 5);
+  f_100_011_001_101_0(uniques, 5);
+  f_100_011_001_101_1(uniques, 5);
+  f_100_011_001_110_0(uniques, 5);
+  f_100_011_001_110_1(uniques, 5);
+  f_100_011_001_111_0(uniques, 5);
+  f_100_011_001_111_1(uniques, 5);
+  f_100_011_010_000_0(uniques, 5);
+  f_100_011_010_000_1(uniques, 5);
+  f_100_011_010_001_0(uniques, 5);
+  f_100_011_010_001_1(uniques, 5);
+  f_100_011_010_010_0(uniques, 5);
+  f_100_011_010_010_1(uniques, 5);
+  f_100_011_010_011_0(uniques, 5);
+  f_100_011_010_011_1(uniques, 5);
+  f_100_011_010_100_0(uniques, 5);
+  f_100_011_010_100_1(uniques, 5);
+  f_100_011_010_101_0(uniques, 5);
+  f_100_011_010_101_1(uniques, 5);
+  f_100_011_010_110_0(uniques, 5);
+  f_100_011_010_110_1(uniques, 5);
+  f_100_011_010_111_0(uniques, 5);
+  f_100_011_010_111_1(uniques, 5);
+  f_100_011_011_000_0(uniques, 5);
+  f_100_011_011_000_1(uniques, 5);
+  f_100_011_011_001_0(uniques, 5);
+  f_100_011_011_001_1(uniques, 5);
+  f_100_011_011_010_0(uniques, 5);
+  f_100_011_011_010_1(uniques, 5);
+  f_100_011_011_011_0(uniques, 5);
+  f_100_011_011_011_1(uniques, 5);
+  f_100_011_011_100_0(uniques, 5);
+  f_100_011_011_100_1(uniques, 5);
+  f_100_011_011_101_0(uniques, 5);
+  f_100_011_011_101_1(uniques, 5);
+  f_100_011_011_110_0(uniques, 5);
+  f_100_011_011_110_1(uniques, 5);
+  f_100_011_011_111_0(uniques, 5);
+  f_100_011_011_111_1(uniques, 5);
+  f_100_011_100_000_0(uniques, 5);
+  f_100_011_100_000_1(uniques, 5);
+  f_100_011_100_001_0(uniques, 5);
+  f_100_011_100_001_1(uniques, 5);
+  f_100_011_100_010_0(uniques, 5);
+  f_100_011_100_010_1(uniques, 5);
+  f_100_011_100_011_0(uniques, 5);
+  f_100_011_100_011_1(uniques, 5);
+  f_100_011_100_100_0(uniques, 5);
+  f_100_011_100_100_1(uniques, 5);
+  f_100_011_100_101_0(uniques, 5);
+  f_100_011_100_101_1(uniques, 5);
+  f_100_011_100_110_0(uniques, 5);
+  f_100_011_100_110_1(uniques, 5);
+  f_100_011_100_111_0(uniques, 5);
+  f_100_011_100_111_1(uniques, 5);
+  f_100_011_101_000_0(uniques, 5);
+  f_100_011_101_000_1(uniques, 5);
+  f_100_011_101_001_0(uniques, 5);
+  f_100_011_101_001_1(uniques, 5);
+  f_100_011_101_010_0(uniques, 5);
+  f_100_011_101_010_1(uniques, 5);
+  f_100_011_101_011_0(uniques, 5);
+  f_100_011_101_011_1(uniques, 5);
+  f_100_011_101_100_0(uniques, 5);
+  f_100_011_101_100_1(uniques, 5);
+  f_100_011_101_101_0(uniques, 5);
+  f_100_011_101_101_1(uniques, 5);
+  f_100_011_101_110_0(uniques, 5);
+  f_100_011_101_110_1(uniques, 5);
+  f_100_011_101_111_0(uniques, 5);
+  f_100_011_101_111_1(uniques, 5);
+  f_100_011_110_000_0(uniques, 5);
+  f_100_011_110_000_1(uniques, 5);
+  f_100_011_110_001_0(uniques, 5);
+  f_100_011_110_001_1(uniques, 5);
+  f_100_011_110_010_0(uniques, 5);
+  f_100_011_110_010_1(uniques, 5);
+  f_100_011_110_011_0(uniques, 5);
+  f_100_011_110_011_1(uniques, 5);
+  f_100_011_110_100_0(uniques, 5);
+  f_100_011_110_100_1(uniques, 5);
+  f_100_011_110_101_0(uniques, 5);
+  f_100_011_110_101_1(uniques, 5);
+  f_100_011_110_110_0(uniques, 5);
+  f_100_011_110_110_1(uniques, 5);
+  f_100_011_110_111_0(uniques, 5);
+  f_100_011_110_111_1(uniques, 5);
+  f_100_011_111_000_0(uniques, 5);
+  f_100_011_111_000_1(uniques, 5);
+  f_100_011_111_001_0(uniques, 5);
+  f_100_011_111_001_1(uniques, 5);
+  f_100_011_111_010_0(uniques, 5);
+  f_100_011_111_010_1(uniques, 5);
+  f_100_011_111_011_0(uniques, 5);
+  f_100_011_111_011_1(uniques, 5);
+  f_100_011_111_100_0(uniques, 5);
+  f_100_011_111_100_1(uniques, 5);
+  f_100_011_111_101_0(uniques, 5);
+  f_100_011_111_101_1(uniques, 5);
+  f_100_011_111_110_0(uniques, 5);
+  f_100_011_111_110_1(uniques, 5);
+  f_100_011_111_111_0(uniques, 5);
+  f_100_011_111_111_1(uniques, 5);
+  f_100_101_000_000_0(uniques, 5);
+  f_100_101_000_000_1(uniques, 5);
+  f_100_101_000_001_0(uniques, 5);
+  f_100_101_000_001_1(uniques, 5);
+  f_100_101_000_010_0(uniques, 5);
+  f_100_101_000_010_1(uniques, 5);
+  f_100_101_000_011_0(uniques, 5);
+  f_100_101_000_011_1(uniques, 5);
+  f_100_101_000_100_0(uniques, 5);
+  f_100_101_000_100_1(uniques, 5);
+  f_100_101_000_101_0(uniques, 5);
+  f_100_101_000_101_1(uniques, 5);
+  f_100_101_000_110_0(uniques, 5);
+  f_100_101_000_110_1(uniques, 5);
+  f_100_101_000_111_0(uniques, 5);
+  f_100_101_000_111_1(uniques, 5);
+  f_100_101_001_000_0(uniques, 5);
+  f_100_101_001_000_1(uniques, 5);
+  f_100_101_001_001_0(uniques, 5);
+  f_100_101_001_001_1(uniques, 5);
+  f_100_101_001_010_0(uniques, 5);
+  f_100_101_001_010_1(uniques, 5);
+  f_100_101_001_011_0(uniques, 5);
+  f_100_101_001_011_1(uniques, 5);
+  f_100_101_001_100_0(uniques, 5);
+  f_100_101_001_100_1(uniques, 5);
+  f_100_101_001_101_0(uniques, 5);
+  f_100_101_001_101_1(uniques, 5);
+  f_100_101_001_110_0(uniques, 5);
+  f_100_101_001_110_1(uniques, 5);
+  f_100_101_001_111_0(uniques, 5);
+  f_100_101_001_111_1(uniques, 5);
+  f_100_101_010_000_0(uniques, 5);
+  f_100_101_010_000_1(uniques, 5);
+  f_100_101_010_001_0(uniques, 5);
+  f_100_101_010_001_1(uniques, 5);
+  f_100_101_010_010_0(uniques, 5);
+  f_100_101_010_010_1(uniques, 5);
+  f_100_101_010_011_0(uniques, 5);
+  f_100_101_010_011_1(uniques, 5);
+  f_100_101_010_100_0(uniques, 5);
+  f_100_101_010_100_1(uniques, 5);
+  f_100_101_010_101_0(uniques, 5);
+  f_100_101_010_101_1(uniques, 5);
+  f_100_101_010_110_0(uniques, 5);
+  f_100_101_010_110_1(uniques, 5);
+  f_100_101_010_111_0(uniques, 5);
+  f_100_101_010_111_1(uniques, 5);
+  f_100_101_011_000_0(uniques, 5);
+  f_100_101_011_000_1(uniques, 5);
+  f_100_101_011_001_0(uniques, 5);
+  f_100_101_011_001_1(uniques, 5);
+  f_100_101_011_010_0(uniques, 5);
+  f_100_101_011_010_1(uniques, 5);
+  f_100_101_011_011_0(uniques, 5);
+  f_100_101_011_011_1(uniques, 5);
+  f_100_101_011_100_0(uniques, 5);
+  f_100_101_011_100_1(uniques, 5);
+  f_100_101_011_101_0(uniques, 5);
+  f_100_101_011_101_1(uniques, 5);
+  f_100_101_011_110_0(uniques, 5);
+  f_100_101_011_110_1(uniques, 5);
+  f_100_101_011_111_0(uniques, 5);
+  f_100_101_011_111_1(uniques, 5);
+  f_100_101_100_000_0(uniques, 5);
+  f_100_101_100_000_1(uniques, 5);
+  f_100_101_100_001_0(uniques, 5);
+  f_100_101_100_001_1(uniques, 5);
+  f_100_101_100_010_0(uniques, 5);
+  f_100_101_100_010_1(uniques, 5);
+  f_100_101_100_011_0(uniques, 5);
+  f_100_101_100_011_1(uniques, 5);
+  f_100_101_100_100_0(uniques, 5);
+  f_100_101_100_100_1(uniques, 5);
+  f_100_101_100_101_0(uniques, 5);
+  f_100_101_100_101_1(uniques, 5);
+  f_100_101_100_110_0(uniques, 5);
+  f_100_101_100_110_1(uniques, 5);
+  f_100_101_100_111_0(uniques, 5);
+  f_100_101_100_111_1(uniques, 5);
+  f_100_101_101_000_0(uniques, 5);
+  f_100_101_101_000_1(uniques, 5);
+  f_100_101_101_001_0(uniques, 5);
+  f_100_101_101_001_1(uniques, 5);
+  f_100_101_101_010_0(uniques, 5);
+  f_100_101_101_010_1(uniques, 5);
+  f_100_101_101_011_0(uniques, 5);
+  f_100_101_101_011_1(uniques, 5);
+  f_100_101_101_100_0(uniques, 5);
+  f_100_101_101_100_1(uniques, 5);
+  f_100_101_101_101_0(uniques, 5);
+  f_100_101_101_101_1(uniques, 5);
+  f_100_101_101_110_0(uniques, 5);
+  f_100_101_101_110_1(uniques, 5);
+  f_100_101_101_111_0(uniques, 5);
+  f_100_101_101_111_1(uniques, 5);
+  f_100_101_110_000_0(uniques, 5);
+  f_100_101_110_000_1(uniques, 5);
+  f_100_101_110_001_0(uniques, 5);
+  f_100_101_110_001_1(uniques, 5);
+  f_100_101_110_010_0(uniques, 5);
+  f_100_101_110_010_1(uniques, 5);
+  f_100_101_110_011_0(uniques, 5);
+  f_100_101_110_011_1(uniques, 5);
+  f_100_101_110_100_0(uniques, 5);
+  f_100_101_110_100_1(uniques, 5);
+  f_100_101_110_101_0(uniques, 5);
+  f_100_101_110_101_1(uniques, 5);
+  f_100_101_110_110_0(uniques, 5);
+  f_100_101_110_110_1(uniques, 5);
+  f_100_101_110_111_0(uniques, 5);
+  f_100_101_110_111_1(uniques, 5);
+  f_100_101_111_000_0(uniques, 5);
+  f_100_101_111_000_1(uniques, 5);
+  f_100_101_111_001_0(uniques, 5);
+  f_100_101_111_001_1(uniques, 5);
+  f_100_101_111_010_0(uniques, 5);
+  f_100_101_111_010_1(uniques, 5);
+  f_100_101_111_011_0(uniques, 5);
+  f_100_101_111_011_1(uniques, 5);
+  f_100_101_111_100_0(uniques, 5);
+  f_100_101_111_100_1(uniques, 5);
+  f_100_101_111_101_0(uniques, 5);
+  f_100_101_111_101_1(uniques, 5);
+  f_100_101_111_110_0(uniques, 5);
+  f_100_101_111_110_1(uniques, 5);
+  f_100_101_111_111_0(uniques, 5);
+  f_100_101_111_111_1(uniques, 5);
+  f_100_111_000_000_0(uniques, 5);
+  f_100_111_000_000_1(uniques, 5);
+  f_100_111_000_001_0(uniques, 5);
+  f_100_111_000_001_1(uniques, 5);
+  f_100_111_000_010_0(uniques, 5);
+  f_100_111_000_010_1(uniques, 5);
+  f_100_111_000_011_0(uniques, 5);
+  f_100_111_000_011_1(uniques, 5);
+  f_100_111_000_100_0(uniques, 5);
+  f_100_111_000_100_1(uniques, 5);
+  f_100_111_000_101_0(uniques, 5);
+  f_100_111_000_101_1(uniques, 5);
+  f_100_111_000_110_0(uniques, 5);
+  f_100_111_000_110_1(uniques, 5);
+  f_100_111_000_111_0(uniques, 5);
+  f_100_111_000_111_1(uniques, 5);
+  f_100_111_001_000_0(uniques, 5);
+  f_100_111_001_000_1(uniques, 5);
+  f_100_111_001_001_0(uniques, 5);
+  f_100_111_001_001_1(uniques, 5);
+  f_100_111_001_010_0(uniques, 5);
+  f_100_111_001_010_1(uniques, 5);
+  f_100_111_001_011_0(uniques, 5);
+  f_100_111_001_011_1(uniques, 5);
+  f_100_111_001_100_0(uniques, 5);
+  f_100_111_001_100_1(uniques, 5);
+  f_100_111_001_101_0(uniques, 5);
+  f_100_111_001_101_1(uniques, 5);
+  f_100_111_001_110_0(uniques, 5);
+  f_100_111_001_110_1(uniques, 5);
+  f_100_111_001_111_0(uniques, 5);
+  f_100_111_001_111_1(uniques, 5);
+  f_100_111_010_000_0(uniques, 5);
+  f_100_111_010_000_1(uniques, 5);
+  f_100_111_010_001_0(uniques, 5);
+  f_100_111_010_001_1(uniques, 5);
+  f_100_111_010_010_0(uniques, 5);
+  f_100_111_010_010_1(uniques, 5);
+  f_100_111_010_011_0(uniques, 5);
+  f_100_111_010_011_1(uniques, 5);
+  f_100_111_010_100_0(uniques, 5);
+  f_100_111_010_100_1(uniques, 5);
+  f_100_111_010_101_0(uniques, 5);
+  f_100_111_010_101_1(uniques, 5);
+  f_100_111_010_110_0(uniques, 5);
+  f_100_111_010_110_1(uniques, 5);
+  f_100_111_010_111_0(uniques, 5);
+  f_100_111_010_111_1(uniques, 5);
+  f_100_111_011_000_0(uniques, 5);
+  f_100_111_011_000_1(uniques, 5);
+  f_100_111_011_001_0(uniques, 5);
+  f_100_111_011_001_1(uniques, 5);
+  f_100_111_011_010_0(uniques, 5);
+  f_100_111_011_010_1(uniques, 5);
+  f_100_111_011_011_0(uniques, 5);
+  f_100_111_011_011_1(uniques, 5);
+  f_100_111_011_100_0(uniques, 5);
+  f_100_111_011_100_1(uniques, 5);
+  f_100_111_011_101_0(uniques, 5);
+  f_100_111_011_101_1(uniques, 5);
+  f_100_111_011_110_0(uniques, 5);
+  f_100_111_011_110_1(uniques, 5);
+  f_100_111_011_111_0(uniques, 5);
+  f_100_111_011_111_1(uniques, 5);
+  f_100_111_100_000_0(uniques, 5);
+  f_100_111_100_000_1(uniques, 5);
+  f_100_111_100_001_0(uniques, 5);
+  f_100_111_100_001_1(uniques, 5);
+  f_100_111_100_010_0(uniques, 5);
+  f_100_111_100_010_1(uniques, 5);
+  f_100_111_100_011_0(uniques, 5);
+  f_100_111_100_011_1(uniques, 5);
+  f_100_111_100_100_0(uniques, 5);
+  f_100_111_100_100_1(uniques, 5);
+  f_100_111_100_101_0(uniques, 5);
+  f_100_111_100_101_1(uniques, 5);
+  f_100_111_100_110_0(uniques, 5);
+  f_100_111_100_110_1(uniques, 5);
+  f_100_111_100_111_0(uniques, 5);
+  f_100_111_100_111_1(uniques, 5);
+  f_100_111_101_000_0(uniques, 5);
+  f_100_111_101_000_1(uniques, 5);
+  f_100_111_101_001_0(uniques, 5);
+  f_100_111_101_001_1(uniques, 5);
+  f_100_111_101_010_0(uniques, 5);
+  f_100_111_101_010_1(uniques, 5);
+  f_100_111_101_011_0(uniques, 5);
+  f_100_111_101_011_1(uniques, 5);
+  f_100_111_101_100_0(uniques, 5);
+  f_100_111_101_100_1(uniques, 5);
+  f_100_111_101_101_0(uniques, 5);
+  f_100_111_101_101_1(uniques, 5);
+  f_100_111_101_110_0(uniques, 5);
+  f_100_111_101_110_1(uniques, 5);
+  f_100_111_101_111_0(uniques, 5);
+  f_100_111_101_111_1(uniques, 5);
+  f_100_111_110_000_0(uniques, 5);
+  f_100_111_110_000_1(uniques, 5);
+  f_100_111_110_001_0(uniques, 5);
+  f_100_111_110_001_1(uniques, 5);
+  f_100_111_110_010_0(uniques, 5);
+  f_100_111_110_010_1(uniques, 5);
+  f_100_111_110_011_0(uniques, 5);
+  f_100_111_110_011_1(uniques, 5);
+  f_100_111_110_100_0(uniques, 5);
+  f_100_111_110_100_1(uniques, 5);
+  f_100_111_110_101_0(uniques, 5);
+  f_100_111_110_101_1(uniques, 5);
+  f_100_111_110_110_0(uniques, 5);
+  f_100_111_110_110_1(uniques, 5);
+  f_100_111_110_111_0(uniques, 5);
+  f_100_111_110_111_1(uniques, 5);
+  f_100_111_111_000_0(uniques, 5);
+  f_100_111_111_000_1(uniques, 5);
+  f_100_111_111_001_0(uniques, 5);
+  f_100_111_111_001_1(uniques, 5);
+  f_100_111_111_010_0(uniques, 5);
+  f_100_111_111_010_1(uniques, 5);
+  f_100_111_111_011_0(uniques, 5);
+  f_100_111_111_011_1(uniques, 5);
+  f_100_111_111_100_0(uniques, 5);
+  f_100_111_111_100_1(uniques, 5);
+  f_100_111_111_101_0(uniques, 5);
+  f_100_111_111_101_1(uniques, 5);
+  f_100_111_111_110_0(uniques, 5);
+  f_100_111_111_110_1(uniques, 5);
+  f_100_111_111_111_0(uniques, 5);
+  f_100_111_111_111_1(uniques, 5);
+  f_101_001_000_000_0(uniques, 5);
+  f_101_001_000_000_1(uniques, 5);
+  f_101_001_000_001_0(uniques, 5);
+  f_101_001_000_001_1(uniques, 5);
+  f_101_001_000_010_0(uniques, 5);
+  f_101_001_000_010_1(uniques, 5);
+  f_101_001_000_011_0(uniques, 5);
+  f_101_001_000_011_1(uniques, 5);
+  f_101_001_000_100_0(uniques, 5);
+  f_101_001_000_100_1(uniques, 5);
+  f_101_001_000_101_0(uniques, 5);
+  f_101_001_000_101_1(uniques, 5);
+  f_101_001_000_110_0(uniques, 5);
+  f_101_001_000_110_1(uniques, 5);
+  f_101_001_000_111_0(uniques, 5);
+  f_101_001_000_111_1(uniques, 5);
+  f_101_001_001_000_0(uniques, 5);
+  f_101_001_001_000_1(uniques, 5);
+  f_101_001_001_001_0(uniques, 5);
+  f_101_001_001_001_1(uniques, 5);
+  f_101_001_001_010_0(uniques, 5);
+  f_101_001_001_010_1(uniques, 5);
+  f_101_001_001_011_0(uniques, 5);
+  f_101_001_001_011_1(uniques, 5);
+  f_101_001_001_100_0(uniques, 5);
+  f_101_001_001_100_1(uniques, 5);
+  f_101_001_001_101_0(uniques, 5);
+  f_101_001_001_101_1(uniques, 5);
+  f_101_001_001_110_0(uniques, 5);
+  f_101_001_001_110_1(uniques, 5);
+  f_101_001_001_111_0(uniques, 5);
+  f_101_001_001_111_1(uniques, 5);
+  f_101_001_010_000_0(uniques, 5);
+  f_101_001_010_000_1(uniques, 5);
+  f_101_001_010_001_0(uniques, 5);
+  f_101_001_010_001_1(uniques, 5);
+  f_101_001_010_010_0(uniques, 5);
+  f_101_001_010_010_1(uniques, 5);
+  f_101_001_010_011_0(uniques, 5);
+  f_101_001_010_011_1(uniques, 5);
+  f_101_001_010_100_0(uniques, 5);
+  f_101_001_010_100_1(uniques, 5);
+  f_101_001_010_101_0(uniques, 5);
+  f_101_001_010_101_1(uniques, 5);
+  f_101_001_010_110_0(uniques, 5);
+  f_101_001_010_110_1(uniques, 5);
+  f_101_001_010_111_0(uniques, 5);
+  f_101_001_010_111_1(uniques, 5);
+  f_101_001_011_000_0(uniques, 5);
+  f_101_001_011_000_1(uniques, 5);
+  f_101_001_011_001_0(uniques, 5);
+  f_101_001_011_001_1(uniques, 5);
+  f_101_001_011_010_0(uniques, 5);
+  f_101_001_011_010_1(uniques, 5);
+  f_101_001_011_011_0(uniques, 5);
+  f_101_001_011_011_1(uniques, 5);
+  f_101_001_011_100_0(uniques, 5);
+  f_101_001_011_100_1(uniques, 5);
+  f_101_001_011_101_0(uniques, 5);
+  f_101_001_011_101_1(uniques, 5);
+  f_101_001_011_110_0(uniques, 5);
+  f_101_001_011_110_1(uniques, 5);
+  f_101_001_011_111_0(uniques, 5);
+  f_101_001_011_111_1(uniques, 5);
+  f_101_001_100_000_0(uniques, 5);
+  f_101_001_100_000_1(uniques, 5);
+  f_101_001_100_001_0(uniques, 5);
+  f_101_001_100_001_1(uniques, 5);
+  f_101_001_100_010_0(uniques, 5);
+  f_101_001_100_010_1(uniques, 5);
+  f_101_001_100_011_0(uniques, 5);
+  f_101_001_100_011_1(uniques, 5);
+  f_101_001_100_100_0(uniques, 5);
+  f_101_001_100_100_1(uniques, 5);
+  f_101_001_100_101_0(uniques, 5);
+  f_101_001_100_101_1(uniques, 5);
+  f_101_001_100_110_0(uniques, 5);
+  f_101_001_100_110_1(uniques, 5);
+  f_101_001_100_111_0(uniques, 5);
+  f_101_001_100_111_1(uniques, 5);
+  f_101_001_101_000_0(uniques, 5);
+  f_101_001_101_000_1(uniques, 5);
+  f_101_001_101_001_0(uniques, 5);
+  f_101_001_101_001_1(uniques, 5);
+  f_101_001_101_010_0(uniques, 5);
+  f_101_001_101_010_1(uniques, 5);
+  f_101_001_101_011_0(uniques, 5);
+  f_101_001_101_011_1(uniques, 5);
+  f_101_001_101_100_0(uniques, 5);
+  f_101_001_101_100_1(uniques, 5);
+  f_101_001_101_101_0(uniques, 5);
+  f_101_001_101_101_1(uniques, 5);
+  f_101_001_101_110_0(uniques, 5);
+  f_101_001_101_110_1(uniques, 5);
+  f_101_001_101_111_0(uniques, 5);
+  f_101_001_101_111_1(uniques, 5);
+  f_101_001_110_000_0(uniques, 5);
+  f_101_001_110_000_1(uniques, 5);
+  f_101_001_110_001_0(uniques, 5);
+  f_101_001_110_001_1(uniques, 5);
+  f_101_001_110_010_0(uniques, 5);
+  f_101_001_110_010_1(uniques, 5);
+  f_101_001_110_011_0(uniques, 5);
+  f_101_001_110_011_1(uniques, 5);
+  f_101_001_110_100_0(uniques, 5);
+  f_101_001_110_100_1(uniques, 5);
+  f_101_001_110_101_0(uniques, 5);
+  f_101_001_110_101_1(uniques, 5);
+  f_101_001_110_110_0(uniques, 5);
+  f_101_001_110_110_1(uniques, 5);
+  f_101_001_110_111_0(uniques, 5);
+  f_101_001_110_111_1(uniques, 5);
+  f_101_001_111_000_0(uniques, 5);
+  f_101_001_111_000_1(uniques, 5);
+  f_101_001_111_001_0(uniques, 5);
+  f_101_001_111_001_1(uniques, 5);
+  f_101_001_111_010_0(uniques, 5);
+  f_101_001_111_010_1(uniques, 5);
+  f_101_001_111_011_0(uniques, 5);
+  f_101_001_111_011_1(uniques, 5);
+  f_101_001_111_100_0(uniques, 5);
+  f_101_001_111_100_1(uniques, 5);
+  f_101_001_111_101_0(uniques, 5);
+  f_101_001_111_101_1(uniques, 5);
+  f_101_001_111_110_0(uniques, 5);
+  f_101_001_111_110_1(uniques, 5);
+  f_101_001_111_111_0(uniques, 5);
+  f_101_001_111_111_1(uniques, 5);
+  f_101_011_000_000_0(uniques, 5);
+  f_101_011_000_000_1(uniques, 5);
+  f_101_011_000_001_0(uniques, 5);
+  f_101_011_000_001_1(uniques, 5);
+  f_101_011_000_010_0(uniques, 5);
+  f_101_011_000_010_1(uniques, 5);
+  f_101_011_000_011_0(uniques, 5);
+  f_101_011_000_011_1(uniques, 5);
+  f_101_011_000_100_0(uniques, 5);
+  f_101_011_000_100_1(uniques, 5);
+  f_101_011_000_101_0(uniques, 5);
+  f_101_011_000_101_1(uniques, 5);
+  f_101_011_000_110_0(uniques, 5);
+  f_101_011_000_110_1(uniques, 5);
+  f_101_011_000_111_0(uniques, 5);
+  f_101_011_000_111_1(uniques, 5);
+  f_101_011_001_000_0(uniques, 5);
+  f_101_011_001_000_1(uniques, 5);
+  f_101_011_001_001_0(uniques, 5);
+  f_101_011_001_001_1(uniques, 5);
+  f_101_011_001_010_0(uniques, 5);
+  f_101_011_001_010_1(uniques, 5);
+  f_101_011_001_011_0(uniques, 5);
+  f_101_011_001_011_1(uniques, 5);
+  f_101_011_001_100_0(uniques, 5);
+  f_101_011_001_100_1(uniques, 5);
+  f_101_011_001_101_0(uniques, 5);
+  f_101_011_001_101_1(uniques, 5);
+  f_101_011_001_110_0(uniques, 5);
+  f_101_011_001_110_1(uniques, 5);
+  f_101_011_001_111_0(uniques, 5);
+  f_101_011_001_111_1(uniques, 5);
+  f_101_011_010_000_0(uniques, 5);
+  f_101_011_010_000_1(uniques, 5);
+  f_101_011_010_001_0(uniques, 5);
+  f_101_011_010_001_1(uniques, 5);
+  f_101_011_010_010_0(uniques, 5);
+  f_101_011_010_010_1(uniques, 5);
+  f_101_011_010_011_0(uniques, 5);
+  f_101_011_010_011_1(uniques, 5);
+  f_101_011_010_100_0(uniques, 5);
+  f_101_011_010_100_1(uniques, 5);
+  f_101_011_010_101_0(uniques, 5);
+  f_101_011_010_101_1(uniques, 5);
+  f_101_011_010_110_0(uniques, 5);
+  f_101_011_010_110_1(uniques, 5);
+  f_101_011_010_111_0(uniques, 5);
+  f_101_011_010_111_1(uniques, 5);
+  f_101_011_011_000_0(uniques, 5);
+  f_101_011_011_000_1(uniques, 5);
+  f_101_011_011_001_0(uniques, 5);
+  f_101_011_011_001_1(uniques, 5);
+  f_101_011_011_010_0(uniques, 5);
+  f_101_011_011_010_1(uniques, 5);
+  f_101_011_011_011_0(uniques, 5);
+  f_101_011_011_011_1(uniques, 5);
+  f_101_011_011_100_0(uniques, 5);
+  f_101_011_011_100_1(uniques, 5);
+  f_101_011_011_101_0(uniques, 5);
+  f_101_011_011_101_1(uniques, 5);
+  f_101_011_011_110_0(uniques, 5);
+  f_101_011_011_110_1(uniques, 5);
+  f_101_011_011_111_0(uniques, 5);
+  f_101_011_011_111_1(uniques, 5);
+  f_101_011_100_000_0(uniques, 5);
+  f_101_011_100_000_1(uniques, 5);
+  f_101_011_100_001_0(uniques, 5);
+  f_101_011_100_001_1(uniques, 5);
+  f_101_011_100_010_0(uniques, 5);
+  f_101_011_100_010_1(uniques, 5);
+  f_101_011_100_011_0(uniques, 5);
+  f_101_011_100_011_1(uniques, 5);
+  f_101_011_100_100_0(uniques, 5);
+  f_101_011_100_100_1(uniques, 5);
+  f_101_011_100_101_0(uniques, 5);
+  f_101_011_100_101_1(uniques, 5);
+  f_101_011_100_110_0(uniques, 5);
+  f_101_011_100_110_1(uniques, 5);
+  f_101_011_100_111_0(uniques, 5);
+  f_101_011_100_111_1(uniques, 5);
+  f_101_011_101_000_0(uniques, 5);
+  f_101_011_101_000_1(uniques, 5);
+  f_101_011_101_001_0(uniques, 5);
+  f_101_011_101_001_1(uniques, 5);
+  f_101_011_101_010_0(uniques, 5);
+  f_101_011_101_010_1(uniques, 5);
+  f_101_011_101_011_0(uniques, 5);
+  f_101_011_101_011_1(uniques, 5);
+  f_101_011_101_100_0(uniques, 5);
+  f_101_011_101_100_1(uniques, 5);
+  f_101_011_101_101_0(uniques, 5);
+  f_101_011_101_101_1(uniques, 5);
+  f_101_011_101_110_0(uniques, 5);
+  f_101_011_101_110_1(uniques, 5);
+  f_101_011_101_111_0(uniques, 5);
+  f_101_011_101_111_1(uniques, 5);
+  f_101_011_110_000_0(uniques, 5);
+  f_101_011_110_000_1(uniques, 5);
+  f_101_011_110_001_0(uniques, 5);
+  f_101_011_110_001_1(uniques, 5);
+  f_101_011_110_010_0(uniques, 5);
+  f_101_011_110_010_1(uniques, 5);
+  f_101_011_110_011_0(uniques, 5);
+  f_101_011_110_011_1(uniques, 5);
+  f_101_011_110_100_0(uniques, 5);
+  f_101_011_110_100_1(uniques, 5);
+  f_101_011_110_101_0(uniques, 5);
+  f_101_011_110_101_1(uniques, 5);
+  f_101_011_110_110_0(uniques, 5);
+  f_101_011_110_110_1(uniques, 5);
+  f_101_011_110_111_0(uniques, 5);
+  f_101_011_110_111_1(uniques, 5);
+  f_101_011_111_000_0(uniques, 5);
+  f_101_011_111_000_1(uniques, 5);
+  f_101_011_111_001_0(uniques, 5);
+  f_101_011_111_001_1(uniques, 5);
+  f_101_011_111_010_0(uniques, 5);
+  f_101_011_111_010_1(uniques, 5);
+  f_101_011_111_011_0(uniques, 5);
+  f_101_011_111_011_1(uniques, 5);
+  f_101_011_111_100_0(uniques, 5);
+  f_101_011_111_100_1(uniques, 5);
+  f_101_011_111_101_0(uniques, 5);
+  f_101_011_111_101_1(uniques, 5);
+  f_101_011_111_110_0(uniques, 5);
+  f_101_011_111_110_1(uniques, 5);
+  f_101_011_111_111_0(uniques, 5);
+  f_101_011_111_111_1(uniques, 5);
+  f_101_101_000_000_0(uniques, 5);
+  f_101_101_000_000_1(uniques, 5);
+  f_101_101_000_001_0(uniques, 5);
+  f_101_101_000_001_1(uniques, 5);
+  f_101_101_000_010_0(uniques, 5);
+  f_101_101_000_010_1(uniques, 5);
+  f_101_101_000_011_0(uniques, 5);
+  f_101_101_000_011_1(uniques, 5);
+  f_101_101_000_100_0(uniques, 5);
+  f_101_101_000_100_1(uniques, 5);
+  f_101_101_000_101_0(uniques, 5);
+  f_101_101_000_101_1(uniques, 5);
+  f_101_101_000_110_0(uniques, 5);
+  f_101_101_000_110_1(uniques, 5);
+  f_101_101_000_111_0(uniques, 5);
+  f_101_101_000_111_1(uniques, 5);
+  f_101_101_001_000_0(uniques, 5);
+  f_101_101_001_000_1(uniques, 5);
+  f_101_101_001_001_0(uniques, 5);
+  f_101_101_001_001_1(uniques, 5);
+  f_101_101_001_010_0(uniques, 5);
+  f_101_101_001_010_1(uniques, 5);
+  f_101_101_001_011_0(uniques, 5);
+  f_101_101_001_011_1(uniques, 5);
+  f_101_101_001_100_0(uniques, 5);
+  f_101_101_001_100_1(uniques, 5);
+  f_101_101_001_101_0(uniques, 5);
+  f_101_101_001_101_1(uniques, 5);
+  f_101_101_001_110_0(uniques, 5);
+  f_101_101_001_110_1(uniques, 5);
+  f_101_101_001_111_0(uniques, 5);
+  f_101_101_001_111_1(uniques, 5);
+  f_101_101_010_000_0(uniques, 5);
+  f_101_101_010_000_1(uniques, 5);
+  f_101_101_010_001_0(uniques, 5);
+  f_101_101_010_001_1(uniques, 5);
+  f_101_101_010_010_0(uniques, 5);
+  f_101_101_010_010_1(uniques, 5);
+  f_101_101_010_011_0(uniques, 5);
+  f_101_101_010_011_1(uniques, 5);
+  f_101_101_010_100_0(uniques, 5);
+  f_101_101_010_100_1(uniques, 5);
+  f_101_101_010_101_0(uniques, 5);
+  f_101_101_010_101_1(uniques, 5);
+  f_101_101_010_110_0(uniques, 5);
+  f_101_101_010_110_1(uniques, 5);
+  f_101_101_010_111_0(uniques, 5);
+  f_101_101_010_111_1(uniques, 5);
+  f_101_101_011_000_0(uniques, 5);
+  f_101_101_011_000_1(uniques, 5);
+  f_101_101_011_001_0(uniques, 5);
+  f_101_101_011_001_1(uniques, 5);
+  f_101_101_011_010_0(uniques, 5);
+  f_101_101_011_010_1(uniques, 5);
+  f_101_101_011_011_0(uniques, 5);
+  f_101_101_011_011_1(uniques, 5);
+  f_101_101_011_100_0(uniques, 5);
+  f_101_101_011_100_1(uniques, 5);
+  f_101_101_011_101_0(uniques, 5);
+  f_101_101_011_101_1(uniques, 5);
+  f_101_101_011_110_0(uniques, 5);
+  f_101_101_011_110_1(uniques, 5);
+  f_101_101_011_111_0(uniques, 5);
+  f_101_101_011_111_1(uniques, 5);
+  f_101_101_100_000_0(uniques, 5);
+  f_101_101_100_000_1(uniques, 5);
+  f_101_101_100_001_0(uniques, 5);
+  f_101_101_100_001_1(uniques, 5);
+  f_101_101_100_010_0(uniques, 5);
+  f_101_101_100_010_1(uniques, 5);
+  f_101_101_100_011_0(uniques, 5);
+  f_101_101_100_011_1(uniques, 5);
+  f_101_101_100_100_0(uniques, 5);
+  f_101_101_100_100_1(uniques, 5);
+  f_101_101_100_101_0(uniques, 5);
+  f_101_101_100_101_1(uniques, 5);
+  f_101_101_100_110_0(uniques, 5);
+  f_101_101_100_110_1(uniques, 5);
+  f_101_101_100_111_0(uniques, 5);
+  f_101_101_100_111_1(uniques, 5);
+  f_101_101_101_000_0(uniques, 5);
+  f_101_101_101_000_1(uniques, 5);
+  f_101_101_101_001_0(uniques, 5);
+  f_101_101_101_001_1(uniques, 5);
+  f_101_101_101_010_0(uniques, 5);
+  f_101_101_101_010_1(uniques, 5);
+  f_101_101_101_011_0(uniques, 5);
+  f_101_101_101_011_1(uniques, 5);
+  f_101_101_101_100_0(uniques, 5);
+  f_101_101_101_100_1(uniques, 5);
+  f_101_101_101_101_0(uniques, 5);
+  f_101_101_101_101_1(uniques, 5);
+  f_101_101_101_110_0(uniques, 5);
+  f_101_101_101_110_1(uniques, 5);
+  f_101_101_101_111_0(uniques, 5);
+  f_101_101_101_111_1(uniques, 5);
+  f_101_101_110_000_0(uniques, 5);
+  f_101_101_110_000_1(uniques, 5);
+  f_101_101_110_001_0(uniques, 5);
+  f_101_101_110_001_1(uniques, 5);
+  f_101_101_110_010_0(uniques, 5);
+  f_101_101_110_010_1(uniques, 5);
+  f_101_101_110_011_0(uniques, 5);
+  f_101_101_110_011_1(uniques, 5);
+  f_101_101_110_100_0(uniques, 5);
+  f_101_101_110_100_1(uniques, 5);
+  f_101_101_110_101_0(uniques, 5);
+  f_101_101_110_101_1(uniques, 5);
+  f_101_101_110_110_0(uniques, 5);
+  f_101_101_110_110_1(uniques, 5);
+  f_101_101_110_111_0(uniques, 5);
+  f_101_101_110_111_1(uniques, 5);
+  f_101_101_111_000_0(uniques, 5);
+  f_101_101_111_000_1(uniques, 5);
+  f_101_101_111_001_0(uniques, 5);
+  f_101_101_111_001_1(uniques, 5);
+  f_101_101_111_010_0(uniques, 5);
+  f_101_101_111_010_1(uniques, 5);
+  f_101_101_111_011_0(uniques, 5);
+  f_101_101_111_011_1(uniques, 5);
+  f_101_101_111_100_0(uniques, 5);
+  f_101_101_111_100_1(uniques, 5);
+  f_101_101_111_101_0(uniques, 5);
+  f_101_101_111_101_1(uniques, 5);
+  f_101_101_111_110_0(uniques, 5);
+  f_101_101_111_110_1(uniques, 5);
+  f_101_101_111_111_0(uniques, 5);
+  f_101_101_111_111_1(uniques, 5);
+  f_101_111_000_000_0(uniques, 5);
+  f_101_111_000_000_1(uniques, 5);
+  f_101_111_000_001_0(uniques, 5);
+  f_101_111_000_001_1(uniques, 5);
+  f_101_111_000_010_0(uniques, 5);
+  f_101_111_000_010_1(uniques, 5);
+  f_101_111_000_011_0(uniques, 5);
+  f_101_111_000_011_1(uniques, 5);
+  f_101_111_000_100_0(uniques, 5);
+  f_101_111_000_100_1(uniques, 5);
+  f_101_111_000_101_0(uniques, 5);
+  f_101_111_000_101_1(uniques, 5);
+  f_101_111_000_110_0(uniques, 5);
+  f_101_111_000_110_1(uniques, 5);
+  f_101_111_000_111_0(uniques, 5);
+  f_101_111_000_111_1(uniques, 5);
+  f_101_111_001_000_0(uniques, 5);
+  f_101_111_001_000_1(uniques, 5);
+  f_101_111_001_001_0(uniques, 5);
+  f_101_111_001_001_1(uniques, 5);
+  f_101_111_001_010_0(uniques, 5);
+  f_101_111_001_010_1(uniques, 5);
+  f_101_111_001_011_0(uniques, 5);
+  f_101_111_001_011_1(uniques, 5);
+  f_101_111_001_100_0(uniques, 5);
+  f_101_111_001_100_1(uniques, 5);
+  f_101_111_001_101_0(uniques, 5);
+  f_101_111_001_101_1(uniques, 5);
+  f_101_111_001_110_0(uniques, 5);
+  f_101_111_001_110_1(uniques, 5);
+  f_101_111_001_111_0(uniques, 5);
+  f_101_111_001_111_1(uniques, 5);
+  f_101_111_010_000_0(uniques, 5);
+  f_101_111_010_000_1(uniques, 5);
+  f_101_111_010_001_0(uniques, 5);
+  f_101_111_010_001_1(uniques, 5);
+  f_101_111_010_010_0(uniques, 5);
+  f_101_111_010_010_1(uniques, 5);
+  f_101_111_010_011_0(uniques, 5);
+  f_101_111_010_011_1(uniques, 5);
+  f_101_111_010_100_0(uniques, 5);
+  f_101_111_010_100_1(uniques, 5);
+  f_101_111_010_101_0(uniques, 5);
+  f_101_111_010_101_1(uniques, 5);
+  f_101_111_010_110_0(uniques, 5);
+  f_101_111_010_110_1(uniques, 5);
+  f_101_111_010_111_0(uniques, 5);
+  f_101_111_010_111_1(uniques, 5);
+  f_101_111_011_000_0(uniques, 5);
+  f_101_111_011_000_1(uniques, 5);
+  f_101_111_011_001_0(uniques, 5);
+  f_101_111_011_001_1(uniques, 5);
+  f_101_111_011_010_0(uniques, 5);
+  f_101_111_011_010_1(uniques, 5);
+  f_101_111_011_011_0(uniques, 5);
+  f_101_111_011_011_1(uniques, 5);
+  f_101_111_011_100_0(uniques, 5);
+  f_101_111_011_100_1(uniques, 5);
+  f_101_111_011_101_0(uniques, 5);
+  f_101_111_011_101_1(uniques, 5);
+  f_101_111_011_110_0(uniques, 5);
+  f_101_111_011_110_1(uniques, 5);
+  f_101_111_011_111_0(uniques, 5);
+  f_101_111_011_111_1(uniques, 5);
+  f_101_111_100_000_0(uniques, 5);
+  f_101_111_100_000_1(uniques, 5);
+  f_101_111_100_001_0(uniques, 5);
+  f_101_111_100_001_1(uniques, 5);
+  f_101_111_100_010_0(uniques, 5);
+  f_101_111_100_010_1(uniques, 5);
+  f_101_111_100_011_0(uniques, 5);
+  f_101_111_100_011_1(uniques, 5);
+  f_101_111_100_100_0(uniques, 5);
+  f_101_111_100_100_1(uniques, 5);
+  f_101_111_100_101_0(uniques, 5);
+  f_101_111_100_101_1(uniques, 5);
+  f_101_111_100_110_0(uniques, 5);
+  f_101_111_100_110_1(uniques, 5);
+  f_101_111_100_111_0(uniques, 5);
+  f_101_111_100_111_1(uniques, 5);
+  f_101_111_101_000_0(uniques, 5);
+  f_101_111_101_000_1(uniques, 5);
+  f_101_111_101_001_0(uniques, 5);
+  f_101_111_101_001_1(uniques, 5);
+  f_101_111_101_010_0(uniques, 5);
+  f_101_111_101_010_1(uniques, 5);
+  f_101_111_101_011_0(uniques, 5);
+  f_101_111_101_011_1(uniques, 5);
+  f_101_111_101_100_0(uniques, 5);
+  f_101_111_101_100_1(uniques, 5);
+  f_101_111_101_101_0(uniques, 5);
+  f_101_111_101_101_1(uniques, 5);
+  f_101_111_101_110_0(uniques, 5);
+  f_101_111_101_110_1(uniques, 5);
+  f_101_111_101_111_0(uniques, 5);
+  f_101_111_101_111_1(uniques, 5);
+  f_101_111_110_000_0(uniques, 5);
+  f_101_111_110_000_1(uniques, 5);
+  f_101_111_110_001_0(uniques, 5);
+  f_101_111_110_001_1(uniques, 5);
+  f_101_111_110_010_0(uniques, 5);
+  f_101_111_110_010_1(uniques, 5);
+  f_101_111_110_011_0(uniques, 5);
+  f_101_111_110_011_1(uniques, 5);
+  f_101_111_110_100_0(uniques, 5);
+  f_101_111_110_100_1(uniques, 5);
+  f_101_111_110_101_0(uniques, 5);
+  f_101_111_110_101_1(uniques, 5);
+  f_101_111_110_110_0(uniques, 5);
+  f_101_111_110_110_1(uniques, 5);
+  f_101_111_110_111_0(uniques, 5);
+  f_101_111_110_111_1(uniques, 5);
+  f_101_111_111_000_0(uniques, 5);
+  f_101_111_111_000_1(uniques, 5);
+  f_101_111_111_001_0(uniques, 5);
+  f_101_111_111_001_1(uniques, 5);
+  f_101_111_111_010_0(uniques, 5);
+  f_101_111_111_010_1(uniques, 5);
+  f_101_111_111_011_0(uniques, 5);
+  f_101_111_111_011_1(uniques, 5);
+  f_101_111_111_100_0(uniques, 5);
+  f_101_111_111_100_1(uniques, 5);
+  f_101_111_111_101_0(uniques, 5);
+  f_101_111_111_101_1(uniques, 5);
+  f_101_111_111_110_0(uniques, 5);
+  f_101_111_111_110_1(uniques, 5);
+  f_101_111_111_111_0(uniques, 5);
+  f_101_111_111_111_1(uniques, 5);
+  f_110_001_000_000_0(uniques, 5);
+  f_110_001_000_000_1(uniques, 5);
+  f_110_001_000_001_0(uniques, 5);
+  f_110_001_000_001_1(uniques, 5);
+  f_110_001_000_010_0(uniques, 5);
+  f_110_001_000_010_1(uniques, 5);
+  f_110_001_000_011_0(uniques, 5);
+  f_110_001_000_011_1(uniques, 5);
+  f_110_001_000_100_0(uniques, 5);
+  f_110_001_000_100_1(uniques, 5);
+  f_110_001_000_101_0(uniques, 5);
+  f_110_001_000_101_1(uniques, 5);
+  f_110_001_000_110_0(uniques, 5);
+  f_110_001_000_110_1(uniques, 5);
+  f_110_001_000_111_0(uniques, 5);
+  f_110_001_000_111_1(uniques, 5);
+  f_110_001_001_000_0(uniques, 5);
+  f_110_001_001_000_1(uniques, 5);
+  f_110_001_001_001_0(uniques, 5);
+  f_110_001_001_001_1(uniques, 5);
+  f_110_001_001_010_0(uniques, 5);
+  f_110_001_001_010_1(uniques, 5);
+  f_110_001_001_011_0(uniques, 5);
+  f_110_001_001_011_1(uniques, 5);
+  f_110_001_001_100_0(uniques, 5);
+  f_110_001_001_100_1(uniques, 5);
+  f_110_001_001_101_0(uniques, 5);
+  f_110_001_001_101_1(uniques, 5);
+  f_110_001_001_110_0(uniques, 5);
+  f_110_001_001_110_1(uniques, 5);
+  f_110_001_001_111_0(uniques, 5);
+  f_110_001_001_111_1(uniques, 5);
+  f_110_001_010_000_0(uniques, 5);
+  f_110_001_010_000_1(uniques, 5);
+  f_110_001_010_001_0(uniques, 5);
+  f_110_001_010_001_1(uniques, 5);
+  f_110_001_010_010_0(uniques, 5);
+  f_110_001_010_010_1(uniques, 5);
+  f_110_001_010_011_0(uniques, 5);
+  f_110_001_010_011_1(uniques, 5);
+  f_110_001_010_100_0(uniques, 5);
+  f_110_001_010_100_1(uniques, 5);
+  f_110_001_010_101_0(uniques, 5);
+  f_110_001_010_101_1(uniques, 5);
+  f_110_001_010_110_0(uniques, 5);
+  f_110_001_010_110_1(uniques, 5);
+  f_110_001_010_111_0(uniques, 5);
+  f_110_001_010_111_1(uniques, 5);
+  f_110_001_011_000_0(uniques, 5);
+  f_110_001_011_000_1(uniques, 5);
+  f_110_001_011_001_0(uniques, 5);
+  f_110_001_011_001_1(uniques, 5);
+  f_110_001_011_010_0(uniques, 5);
+  f_110_001_011_010_1(uniques, 5);
+  f_110_001_011_011_0(uniques, 5);
+  f_110_001_011_011_1(uniques, 5);
+  f_110_001_011_100_0(uniques, 5);
+  f_110_001_011_100_1(uniques, 5);
+  f_110_001_011_101_0(uniques, 5);
+  f_110_001_011_101_1(uniques, 5);
+  f_110_001_011_110_0(uniques, 5);
+  f_110_001_011_110_1(uniques, 5);
+  f_110_001_011_111_0(uniques, 5);
+  f_110_001_011_111_1(uniques, 5);
+  f_110_001_100_000_0(uniques, 5);
+  f_110_001_100_000_1(uniques, 5);
+  f_110_001_100_001_0(uniques, 5);
+  f_110_001_100_001_1(uniques, 5);
+  f_110_001_100_010_0(uniques, 5);
+  f_110_001_100_010_1(uniques, 5);
+  f_110_001_100_011_0(uniques, 5);
+  f_110_001_100_011_1(uniques, 5);
+  f_110_001_100_100_0(uniques, 5);
+  f_110_001_100_100_1(uniques, 5);
+  f_110_001_100_101_0(uniques, 5);
+  f_110_001_100_101_1(uniques, 5);
+  f_110_001_100_110_0(uniques, 5);
+  f_110_001_100_110_1(uniques, 5);
+  f_110_001_100_111_0(uniques, 5);
+  f_110_001_100_111_1(uniques, 5);
+  f_110_001_101_000_0(uniques, 5);
+  f_110_001_101_000_1(uniques, 5);
+  f_110_001_101_001_0(uniques, 5);
+  f_110_001_101_001_1(uniques, 5);
+  f_110_001_101_010_0(uniques, 5);
+  f_110_001_101_010_1(uniques, 5);
+  f_110_001_101_011_0(uniques, 5);
+  f_110_001_101_011_1(uniques, 5);
+  f_110_001_101_100_0(uniques, 5);
+  f_110_001_101_100_1(uniques, 5);
+  f_110_001_101_101_0(uniques, 5);
+  f_110_001_101_101_1(uniques, 5);
+  f_110_001_101_110_0(uniques, 5);
+  f_110_001_101_110_1(uniques, 5);
+  f_110_001_101_111_0(uniques, 5);
+  f_110_001_101_111_1(uniques, 5);
+  f_110_001_110_000_0(uniques, 5);
+  f_110_001_110_000_1(uniques, 5);
+  f_110_001_110_001_0(uniques, 5);
+  f_110_001_110_001_1(uniques, 5);
+  f_110_001_110_010_0(uniques, 5);
+  f_110_001_110_010_1(uniques, 5);
+  f_110_001_110_011_0(uniques, 5);
+  f_110_001_110_011_1(uniques, 5);
+  f_110_001_110_100_0(uniques, 5);
+  f_110_001_110_100_1(uniques, 5);
+  f_110_001_110_101_0(uniques, 5);
+  f_110_001_110_101_1(uniques, 5);
+  f_110_001_110_110_0(uniques, 5);
+  f_110_001_110_110_1(uniques, 5);
+  f_110_001_110_111_0(uniques, 5);
+  f_110_001_110_111_1(uniques, 5);
+  f_110_001_111_000_0(uniques, 5);
+  f_110_001_111_000_1(uniques, 5);
+  f_110_001_111_001_0(uniques, 5);
+  f_110_001_111_001_1(uniques, 5);
+  f_110_001_111_010_0(uniques, 5);
+  f_110_001_111_010_1(uniques, 5);
+  f_110_001_111_011_0(uniques, 5);
+  f_110_001_111_011_1(uniques, 5);
+  f_110_001_111_100_0(uniques, 5);
+  f_110_001_111_100_1(uniques, 5);
+  f_110_001_111_101_0(uniques, 5);
+  f_110_001_111_101_1(uniques, 5);
+  f_110_001_111_110_0(uniques, 5);
+  f_110_001_111_110_1(uniques, 5);
+  f_110_001_111_111_0(uniques, 5);
+  f_110_001_111_111_1(uniques, 5);
+  f_110_011_000_000_0(uniques, 5);
+  f_110_011_000_000_1(uniques, 5);
+  f_110_011_000_001_0(uniques, 5);
+  f_110_011_000_001_1(uniques, 5);
+  f_110_011_000_010_0(uniques, 5);
+  f_110_011_000_010_1(uniques, 5);
+  f_110_011_000_011_0(uniques, 5);
+  f_110_011_000_011_1(uniques, 5);
+  f_110_011_000_100_0(uniques, 5);
+  f_110_011_000_100_1(uniques, 5);
+  f_110_011_000_101_0(uniques, 5);
+  f_110_011_000_101_1(uniques, 5);
+  f_110_011_000_110_0(uniques, 5);
+  f_110_011_000_110_1(uniques, 5);
+  f_110_011_000_111_0(uniques, 5);
+  f_110_011_000_111_1(uniques, 5);
+  f_110_011_001_000_0(uniques, 5);
+  f_110_011_001_000_1(uniques, 5);
+  f_110_011_001_001_0(uniques, 5);
+  f_110_011_001_001_1(uniques, 5);
+  f_110_011_001_010_0(uniques, 5);
+  f_110_011_001_010_1(uniques, 5);
+  f_110_011_001_011_0(uniques, 5);
+  f_110_011_001_011_1(uniques, 5);
+  f_110_011_001_100_0(uniques, 5);
+  f_110_011_001_100_1(uniques, 5);
+  f_110_011_001_101_0(uniques, 5);
+  f_110_011_001_101_1(uniques, 5);
+  f_110_011_001_110_0(uniques, 5);
+  f_110_011_001_110_1(uniques, 5);
+  f_110_011_001_111_0(uniques, 5);
+  f_110_011_001_111_1(uniques, 5);
+  f_110_011_010_000_0(uniques, 5);
+  f_110_011_010_000_1(uniques, 5);
+  f_110_011_010_001_0(uniques, 5);
+  f_110_011_010_001_1(uniques, 5);
+  f_110_011_010_010_0(uniques, 5);
+  f_110_011_010_010_1(uniques, 5);
+  f_110_011_010_011_0(uniques, 5);
+  f_110_011_010_011_1(uniques, 5);
+  f_110_011_010_100_0(uniques, 5);
+  f_110_011_010_100_1(uniques, 5);
+  f_110_011_010_101_0(uniques, 5);
+  f_110_011_010_101_1(uniques, 5);
+  f_110_011_010_110_0(uniques, 5);
+  f_110_011_010_110_1(uniques, 5);
+  f_110_011_010_111_0(uniques, 5);
+  f_110_011_010_111_1(uniques, 5);
+  f_110_011_011_000_0(uniques, 5);
+  f_110_011_011_000_1(uniques, 5);
+  f_110_011_011_001_0(uniques, 5);
+  f_110_011_011_001_1(uniques, 5);
+  f_110_011_011_010_0(uniques, 5);
+  f_110_011_011_010_1(uniques, 5);
+  f_110_011_011_011_0(uniques, 5);
+  f_110_011_011_011_1(uniques, 5);
+  f_110_011_011_100_0(uniques, 5);
+  f_110_011_011_100_1(uniques, 5);
+  f_110_011_011_101_0(uniques, 5);
+  f_110_011_011_101_1(uniques, 5);
+  f_110_011_011_110_0(uniques, 5);
+  f_110_011_011_110_1(uniques, 5);
+  f_110_011_011_111_0(uniques, 5);
+  f_110_011_011_111_1(uniques, 5);
+  f_110_011_100_000_0(uniques, 5);
+  f_110_011_100_000_1(uniques, 5);
+  f_110_011_100_001_0(uniques, 5);
+  f_110_011_100_001_1(uniques, 5);
+  f_110_011_100_010_0(uniques, 5);
+  f_110_011_100_010_1(uniques, 5);
+  f_110_011_100_011_0(uniques, 5);
+  f_110_011_100_011_1(uniques, 5);
+  f_110_011_100_100_0(uniques, 5);
+  f_110_011_100_100_1(uniques, 5);
+  f_110_011_100_101_0(uniques, 5);
+  f_110_011_100_101_1(uniques, 5);
+  f_110_011_100_110_0(uniques, 5);
+  f_110_011_100_110_1(uniques, 5);
+  f_110_011_100_111_0(uniques, 5);
+  f_110_011_100_111_1(uniques, 5);
+  f_110_011_101_000_0(uniques, 5);
+  f_110_011_101_000_1(uniques, 5);
+  f_110_011_101_001_0(uniques, 5);
+  f_110_011_101_001_1(uniques, 5);
+  f_110_011_101_010_0(uniques, 5);
+  f_110_011_101_010_1(uniques, 5);
+  f_110_011_101_011_0(uniques, 5);
+  f_110_011_101_011_1(uniques, 5);
+  f_110_011_101_100_0(uniques, 5);
+  f_110_011_101_100_1(uniques, 5);
+  f_110_011_101_101_0(uniques, 5);
+  f_110_011_101_101_1(uniques, 5);
+  f_110_011_101_110_0(uniques, 5);
+  f_110_011_101_110_1(uniques, 5);
+  f_110_011_101_111_0(uniques, 5);
+  f_110_011_101_111_1(uniques, 5);
+  f_110_011_110_000_0(uniques, 5);
+  f_110_011_110_000_1(uniques, 5);
+  f_110_011_110_001_0(uniques, 5);
+  f_110_011_110_001_1(uniques, 5);
+  f_110_011_110_010_0(uniques, 5);
+  f_110_011_110_010_1(uniques, 5);
+  f_110_011_110_011_0(uniques, 5);
+  f_110_011_110_011_1(uniques, 5);
+  f_110_011_110_100_0(uniques, 5);
+  f_110_011_110_100_1(uniques, 5);
+  f_110_011_110_101_0(uniques, 5);
+  f_110_011_110_101_1(uniques, 5);
+  f_110_011_110_110_0(uniques, 5);
+  f_110_011_110_110_1(uniques, 5);
+  f_110_011_110_111_0(uniques, 5);
+  f_110_011_110_111_1(uniques, 5);
+  f_110_011_111_000_0(uniques, 5);
+  f_110_011_111_000_1(uniques, 5);
+  f_110_011_111_001_0(uniques, 5);
+  f_110_011_111_001_1(uniques, 5);
+  f_110_011_111_010_0(uniques, 5);
+  f_110_011_111_010_1(uniques, 5);
+  f_110_011_111_011_0(uniques, 5);
+  f_110_011_111_011_1(uniques, 5);
+  f_110_011_111_100_0(uniques, 5);
+  f_110_011_111_100_1(uniques, 5);
+  f_110_011_111_101_0(uniques, 5);
+  f_110_011_111_101_1(uniques, 5);
+  f_110_011_111_110_0(uniques, 5);
+  f_110_011_111_110_1(uniques, 5);
+  f_110_011_111_111_0(uniques, 5);
+  f_110_011_111_111_1(uniques, 5);
+  f_110_101_000_000_0(uniques, 5);
+  f_110_101_000_000_1(uniques, 5);
+  f_110_101_000_001_0(uniques, 5);
+  f_110_101_000_001_1(uniques, 5);
+  f_110_101_000_010_0(uniques, 5);
+  f_110_101_000_010_1(uniques, 5);
+  f_110_101_000_011_0(uniques, 5);
+  f_110_101_000_011_1(uniques, 5);
+  f_110_101_000_100_0(uniques, 5);
+  f_110_101_000_100_1(uniques, 5);
+  f_110_101_000_101_0(uniques, 5);
+  f_110_101_000_101_1(uniques, 5);
+  f_110_101_000_110_0(uniques, 5);
+  f_110_101_000_110_1(uniques, 5);
+  f_110_101_000_111_0(uniques, 5);
+  f_110_101_000_111_1(uniques, 5);
+  f_110_101_001_000_0(uniques, 5);
+  f_110_101_001_000_1(uniques, 5);
+  f_110_101_001_001_0(uniques, 5);
+  f_110_101_001_001_1(uniques, 5);
+  f_110_101_001_010_0(uniques, 5);
+  f_110_101_001_010_1(uniques, 5);
+  f_110_101_001_011_0(uniques, 5);
+  f_110_101_001_011_1(uniques, 5);
+  f_110_101_001_100_0(uniques, 5);
+  f_110_101_001_100_1(uniques, 5);
+  f_110_101_001_101_0(uniques, 5);
+  f_110_101_001_101_1(uniques, 5);
+  f_110_101_001_110_0(uniques, 5);
+  f_110_101_001_110_1(uniques, 5);
+  f_110_101_001_111_0(uniques, 5);
+  f_110_101_001_111_1(uniques, 5);
+  f_110_101_010_000_0(uniques, 5);
+  f_110_101_010_000_1(uniques, 5);
+  f_110_101_010_001_0(uniques, 5);
+  f_110_101_010_001_1(uniques, 5);
+  f_110_101_010_010_0(uniques, 5);
+  f_110_101_010_010_1(uniques, 5);
+  f_110_101_010_011_0(uniques, 5);
+  f_110_101_010_011_1(uniques, 5);
+  f_110_101_010_100_0(uniques, 5);
+  f_110_101_010_100_1(uniques, 5);
+  f_110_101_010_101_0(uniques, 5);
+  f_110_101_010_101_1(uniques, 5);
+  f_110_101_010_110_0(uniques, 5);
+  f_110_101_010_110_1(uniques, 5);
+  f_110_101_010_111_0(uniques, 5);
+  f_110_101_010_111_1(uniques, 5);
+  f_110_101_011_000_0(uniques, 5);
+  f_110_101_011_000_1(uniques, 5);
+  f_110_101_011_001_0(uniques, 5);
+  f_110_101_011_001_1(uniques, 5);
+  f_110_101_011_010_0(uniques, 5);
+  f_110_101_011_010_1(uniques, 5);
+  f_110_101_011_011_0(uniques, 5);
+  f_110_101_011_011_1(uniques, 5);
+  f_110_101_011_100_0(uniques, 5);
+  f_110_101_011_100_1(uniques, 5);
+  f_110_101_011_101_0(uniques, 5);
+  f_110_101_011_101_1(uniques, 5);
+  f_110_101_011_110_0(uniques, 5);
+  f_110_101_011_110_1(uniques, 5);
+  f_110_101_011_111_0(uniques, 5);
+  f_110_101_011_111_1(uniques, 5);
+  f_110_101_100_000_0(uniques, 5);
+  f_110_101_100_000_1(uniques, 5);
+  f_110_101_100_001_0(uniques, 5);
+  f_110_101_100_001_1(uniques, 5);
+  f_110_101_100_010_0(uniques, 5);
+  f_110_101_100_010_1(uniques, 5);
+  f_110_101_100_011_0(uniques, 5);
+  f_110_101_100_011_1(uniques, 5);
+  f_110_101_100_100_0(uniques, 5);
+  f_110_101_100_100_1(uniques, 5);
+  f_110_101_100_101_0(uniques, 5);
+  f_110_101_100_101_1(uniques, 5);
+  f_110_101_100_110_0(uniques, 5);
+  f_110_101_100_110_1(uniques, 5);
+  f_110_101_100_111_0(uniques, 5);
+  f_110_101_100_111_1(uniques, 5);
+  f_110_101_101_000_0(uniques, 5);
+  f_110_101_101_000_1(uniques, 5);
+  f_110_101_101_001_0(uniques, 5);
+  f_110_101_101_001_1(uniques, 5);
+  f_110_101_101_010_0(uniques, 5);
+  f_110_101_101_010_1(uniques, 5);
+  f_110_101_101_011_0(uniques, 5);
+  f_110_101_101_011_1(uniques, 5);
+  f_110_101_101_100_0(uniques, 5);
+  f_110_101_101_100_1(uniques, 5);
+  f_110_101_101_101_0(uniques, 5);
+  f_110_101_101_101_1(uniques, 5);
+  f_110_101_101_110_0(uniques, 5);
+  f_110_101_101_110_1(uniques, 5);
+  f_110_101_101_111_0(uniques, 5);
+  f_110_101_101_111_1(uniques, 5);
+  f_110_101_110_000_0(uniques, 5);
+  f_110_101_110_000_1(uniques, 5);
+  f_110_101_110_001_0(uniques, 5);
+  f_110_101_110_001_1(uniques, 5);
+  f_110_101_110_010_0(uniques, 5);
+  f_110_101_110_010_1(uniques, 5);
+  f_110_101_110_011_0(uniques, 5);
+  f_110_101_110_011_1(uniques, 5);
+  f_110_101_110_100_0(uniques, 5);
+  f_110_101_110_100_1(uniques, 5);
+  f_110_101_110_101_0(uniques, 5);
+  f_110_101_110_101_1(uniques, 5);
+  f_110_101_110_110_0(uniques, 5);
+  f_110_101_110_110_1(uniques, 5);
+  f_110_101_110_111_0(uniques, 5);
+  f_110_101_110_111_1(uniques, 5);
+  f_110_101_111_000_0(uniques, 5);
+  f_110_101_111_000_1(uniques, 5);
+  f_110_101_111_001_0(uniques, 5);
+  f_110_101_111_001_1(uniques, 5);
+  f_110_101_111_010_0(uniques, 5);
+  f_110_101_111_010_1(uniques, 5);
+  f_110_101_111_011_0(uniques, 5);
+  f_110_101_111_011_1(uniques, 5);
+  f_110_101_111_100_0(uniques, 5);
+  f_110_101_111_100_1(uniques, 5);
+  f_110_101_111_101_0(uniques, 5);
+  f_110_101_111_101_1(uniques, 5);
+  f_110_101_111_110_0(uniques, 5);
+  f_110_101_111_110_1(uniques, 5);
+  f_110_101_111_111_0(uniques, 5);
+  f_110_101_111_111_1(uniques, 5);
+  f_110_111_000_000_0(uniques, 5);
+  f_110_111_000_000_1(uniques, 5);
+  f_110_111_000_001_0(uniques, 5);
+  f_110_111_000_001_1(uniques, 5);
+  f_110_111_000_010_0(uniques, 5);
+  f_110_111_000_010_1(uniques, 5);
+  f_110_111_000_011_0(uniques, 5);
+  f_110_111_000_011_1(uniques, 5);
+  f_110_111_000_100_0(uniques, 5);
+  f_110_111_000_100_1(uniques, 5);
+  f_110_111_000_101_0(uniques, 5);
+  f_110_111_000_101_1(uniques, 5);
+  f_110_111_000_110_0(uniques, 5);
+  f_110_111_000_110_1(uniques, 5);
+  f_110_111_000_111_0(uniques, 5);
+  f_110_111_000_111_1(uniques, 5);
+  f_110_111_001_000_0(uniques, 5);
+  f_110_111_001_000_1(uniques, 5);
+  f_110_111_001_001_0(uniques, 5);
+  f_110_111_001_001_1(uniques, 5);
+  f_110_111_001_010_0(uniques, 5);
+  f_110_111_001_010_1(uniques, 5);
+  f_110_111_001_011_0(uniques, 5);
+  f_110_111_001_011_1(uniques, 5);
+  f_110_111_001_100_0(uniques, 5);
+  f_110_111_001_100_1(uniques, 5);
+  f_110_111_001_101_0(uniques, 5);
+  f_110_111_001_101_1(uniques, 5);
+  f_110_111_001_110_0(uniques, 5);
+  f_110_111_001_110_1(uniques, 5);
+  f_110_111_001_111_0(uniques, 5);
+  f_110_111_001_111_1(uniques, 5);
+  f_110_111_010_000_0(uniques, 5);
+  f_110_111_010_000_1(uniques, 5);
+  f_110_111_010_001_0(uniques, 5);
+  f_110_111_010_001_1(uniques, 5);
+  f_110_111_010_010_0(uniques, 5);
+  f_110_111_010_010_1(uniques, 5);
+  f_110_111_010_011_0(uniques, 5);
+  f_110_111_010_011_1(uniques, 5);
+  f_110_111_010_100_0(uniques, 5);
+  f_110_111_010_100_1(uniques, 5);
+  f_110_111_010_101_0(uniques, 5);
+  f_110_111_010_101_1(uniques, 5);
+  f_110_111_010_110_0(uniques, 5);
+  f_110_111_010_110_1(uniques, 5);
+  f_110_111_010_111_0(uniques, 5);
+  f_110_111_010_111_1(uniques, 5);
+  f_110_111_011_000_0(uniques, 5);
+  f_110_111_011_000_1(uniques, 5);
+  f_110_111_011_001_0(uniques, 5);
+  f_110_111_011_001_1(uniques, 5);
+  f_110_111_011_010_0(uniques, 5);
+  f_110_111_011_010_1(uniques, 5);
+  f_110_111_011_011_0(uniques, 5);
+  f_110_111_011_011_1(uniques, 5);
+  f_110_111_011_100_0(uniques, 5);
+  f_110_111_011_100_1(uniques, 5);
+  f_110_111_011_101_0(uniques, 5);
+  f_110_111_011_101_1(uniques, 5);
+  f_110_111_011_110_0(uniques, 5);
+  f_110_111_011_110_1(uniques, 5);
+  f_110_111_011_111_0(uniques, 5);
+  f_110_111_011_111_1(uniques, 5);
+  f_110_111_100_000_0(uniques, 5);
+  f_110_111_100_000_1(uniques, 5);
+  f_110_111_100_001_0(uniques, 5);
+  f_110_111_100_001_1(uniques, 5);
+  f_110_111_100_010_0(uniques, 5);
+  f_110_111_100_010_1(uniques, 5);
+  f_110_111_100_011_0(uniques, 5);
+  f_110_111_100_011_1(uniques, 5);
+  f_110_111_100_100_0(uniques, 5);
+  f_110_111_100_100_1(uniques, 5);
+  f_110_111_100_101_0(uniques, 5);
+  f_110_111_100_101_1(uniques, 5);
+  f_110_111_100_110_0(uniques, 5);
+  f_110_111_100_110_1(uniques, 5);
+  f_110_111_100_111_0(uniques, 5);
+  f_110_111_100_111_1(uniques, 5);
+  f_110_111_101_000_0(uniques, 5);
+  f_110_111_101_000_1(uniques, 5);
+  f_110_111_101_001_0(uniques, 5);
+  f_110_111_101_001_1(uniques, 5);
+  f_110_111_101_010_0(uniques, 5);
+  f_110_111_101_010_1(uniques, 5);
+  f_110_111_101_011_0(uniques, 5);
+  f_110_111_101_011_1(uniques, 5);
+  f_110_111_101_100_0(uniques, 5);
+  f_110_111_101_100_1(uniques, 5);
+  f_110_111_101_101_0(uniques, 5);
+  f_110_111_101_101_1(uniques, 5);
+  f_110_111_101_110_0(uniques, 5);
+  f_110_111_101_110_1(uniques, 5);
+  f_110_111_101_111_0(uniques, 5);
+  f_110_111_101_111_1(uniques, 5);
+  f_110_111_110_000_0(uniques, 5);
+  f_110_111_110_000_1(uniques, 5);
+  f_110_111_110_001_0(uniques, 5);
+  f_110_111_110_001_1(uniques, 5);
+  f_110_111_110_010_0(uniques, 5);
+  f_110_111_110_010_1(uniques, 5);
+  f_110_111_110_011_0(uniques, 5);
+  f_110_111_110_011_1(uniques, 5);
+  f_110_111_110_100_0(uniques, 5);
+  f_110_111_110_100_1(uniques, 5);
+  f_110_111_110_101_0(uniques, 5);
+  f_110_111_110_101_1(uniques, 5);
+  f_110_111_110_110_0(uniques, 5);
+  f_110_111_110_110_1(uniques, 5);
+  f_110_111_110_111_0(uniques, 5);
+  f_110_111_110_111_1(uniques, 5);
+  f_110_111_111_000_0(uniques, 5);
+  f_110_111_111_000_1(uniques, 5);
+  f_110_111_111_001_0(uniques, 5);
+  f_110_111_111_001_1(uniques, 5);
+  f_110_111_111_010_0(uniques, 5);
+  f_110_111_111_010_1(uniques, 5);
+  f_110_111_111_011_0(uniques, 5);
+  f_110_111_111_011_1(uniques, 5);
+  f_110_111_111_100_0(uniques, 5);
+  f_110_111_111_100_1(uniques, 5);
+  f_110_111_111_101_0(uniques, 5);
+  f_110_111_111_101_1(uniques, 5);
+  f_110_111_111_110_0(uniques, 5);
+  f_110_111_111_110_1(uniques, 5);
+  f_110_111_111_111_0(uniques, 5);
+  f_110_111_111_111_1(uniques, 5);
+  f_111_001_000_000_0(uniques, 5);
+  f_111_001_000_000_1(uniques, 5);
+  f_111_001_000_001_0(uniques, 5);
+  f_111_001_000_001_1(uniques, 5);
+  f_111_001_000_010_0(uniques, 5);
+  f_111_001_000_010_1(uniques, 5);
+  f_111_001_000_011_0(uniques, 5);
+  f_111_001_000_011_1(uniques, 5);
+  f_111_001_000_100_0(uniques, 5);
+  f_111_001_000_100_1(uniques, 5);
+  f_111_001_000_101_0(uniques, 5);
+  f_111_001_000_101_1(uniques, 5);
+  f_111_001_000_110_0(uniques, 5);
+  f_111_001_000_110_1(uniques, 5);
+  f_111_001_000_111_0(uniques, 5);
+  f_111_001_000_111_1(uniques, 5);
+  f_111_001_001_000_0(uniques, 5);
+  f_111_001_001_000_1(uniques, 5);
+  f_111_001_001_001_0(uniques, 5);
+  f_111_001_001_001_1(uniques, 5);
+  f_111_001_001_010_0(uniques, 5);
+  f_111_001_001_010_1(uniques, 5);
+  f_111_001_001_011_0(uniques, 5);
+  f_111_001_001_011_1(uniques, 5);
+  f_111_001_001_100_0(uniques, 5);
+  f_111_001_001_100_1(uniques, 5);
+  f_111_001_001_101_0(uniques, 5);
+  f_111_001_001_101_1(uniques, 5);
+  f_111_001_001_110_0(uniques, 5);
+  f_111_001_001_110_1(uniques, 5);
+  f_111_001_001_111_0(uniques, 5);
+  f_111_001_001_111_1(uniques, 5);
+  f_111_001_010_000_0(uniques, 5);
+  f_111_001_010_000_1(uniques, 5);
+  f_111_001_010_001_0(uniques, 5);
+  f_111_001_010_001_1(uniques, 5);
+  f_111_001_010_010_0(uniques, 5);
+  f_111_001_010_010_1(uniques, 5);
+  f_111_001_010_011_0(uniques, 5);
+  f_111_001_010_011_1(uniques, 5);
+  f_111_001_010_100_0(uniques, 5);
+  f_111_001_010_100_1(uniques, 5);
+  f_111_001_010_101_0(uniques, 5);
+  f_111_001_010_101_1(uniques, 5);
+  f_111_001_010_110_0(uniques, 5);
+  f_111_001_010_110_1(uniques, 5);
+  f_111_001_010_111_0(uniques, 5);
+  f_111_001_010_111_1(uniques, 5);
+  f_111_001_011_000_0(uniques, 5);
+  f_111_001_011_000_1(uniques, 5);
+  f_111_001_011_001_0(uniques, 5);
+  f_111_001_011_001_1(uniques, 5);
+  f_111_001_011_010_0(uniques, 5);
+  f_111_001_011_010_1(uniques, 5);
+  f_111_001_011_011_0(uniques, 5);
+  f_111_001_011_011_1(uniques, 5);
+  f_111_001_011_100_0(uniques, 5);
+  f_111_001_011_100_1(uniques, 5);
+  f_111_001_011_101_0(uniques, 5);
+  f_111_001_011_101_1(uniques, 5);
+  f_111_001_011_110_0(uniques, 5);
+  f_111_001_011_110_1(uniques, 5);
+  f_111_001_011_111_0(uniques, 5);
+  f_111_001_011_111_1(uniques, 5);
+  f_111_001_100_000_0(uniques, 5);
+  f_111_001_100_000_1(uniques, 5);
+  f_111_001_100_001_0(uniques, 5);
+  f_111_001_100_001_1(uniques, 5);
+  f_111_001_100_010_0(uniques, 5);
+  f_111_001_100_010_1(uniques, 5);
+  f_111_001_100_011_0(uniques, 5);
+  f_111_001_100_011_1(uniques, 5);
+  f_111_001_100_100_0(uniques, 5);
+  f_111_001_100_100_1(uniques, 5);
+  f_111_001_100_101_0(uniques, 5);
+  f_111_001_100_101_1(uniques, 5);
+  f_111_001_100_110_0(uniques, 5);
+  f_111_001_100_110_1(uniques, 5);
+  f_111_001_100_111_0(uniques, 5);
+  f_111_001_100_111_1(uniques, 5);
+  f_111_001_101_000_0(uniques, 5);
+  f_111_001_101_000_1(uniques, 5);
+  f_111_001_101_001_0(uniques, 5);
+  f_111_001_101_001_1(uniques, 5);
+  f_111_001_101_010_0(uniques, 5);
+  f_111_001_101_010_1(uniques, 5);
+  f_111_001_101_011_0(uniques, 5);
+  f_111_001_101_011_1(uniques, 5);
+  f_111_001_101_100_0(uniques, 5);
+  f_111_001_101_100_1(uniques, 5);
+  f_111_001_101_101_0(uniques, 5);
+  f_111_001_101_101_1(uniques, 5);
+  f_111_001_101_110_0(uniques, 5);
+  f_111_001_101_110_1(uniques, 5);
+  f_111_001_101_111_0(uniques, 5);
+  f_111_001_101_111_1(uniques, 5);
+  f_111_001_110_000_0(uniques, 5);
+  f_111_001_110_000_1(uniques, 5);
+  f_111_001_110_001_0(uniques, 5);
+  f_111_001_110_001_1(uniques, 5);
+  f_111_001_110_010_0(uniques, 5);
+  f_111_001_110_010_1(uniques, 5);
+  f_111_001_110_011_0(uniques, 5);
+  f_111_001_110_011_1(uniques, 5);
+  f_111_001_110_100_0(uniques, 5);
+  f_111_001_110_100_1(uniques, 5);
+  f_111_001_110_101_0(uniques, 5);
+  f_111_001_110_101_1(uniques, 5);
+  f_111_001_110_110_0(uniques, 5);
+  f_111_001_110_110_1(uniques, 5);
+  f_111_001_110_111_0(uniques, 5);
+  f_111_001_110_111_1(uniques, 5);
+  f_111_001_111_000_0(uniques, 5);
+  f_111_001_111_000_1(uniques, 5);
+  f_111_001_111_001_0(uniques, 5);
+  f_111_001_111_001_1(uniques, 5);
+  f_111_001_111_010_0(uniques, 5);
+  f_111_001_111_010_1(uniques, 5);
+  f_111_001_111_011_0(uniques, 5);
+  f_111_001_111_011_1(uniques, 5);
+  f_111_001_111_100_0(uniques, 5);
+  f_111_001_111_100_1(uniques, 5);
+  f_111_001_111_101_0(uniques, 5);
+  f_111_001_111_101_1(uniques, 5);
+  f_111_001_111_110_0(uniques, 5);
+  f_111_001_111_110_1(uniques, 5);
+  f_111_001_111_111_0(uniques, 5);
+  f_111_001_111_111_1(uniques, 5);
+  f_111_011_000_000_0(uniques, 5);
+  f_111_011_000_000_1(uniques, 5);
+  f_111_011_000_001_0(uniques, 5);
+  f_111_011_000_001_1(uniques, 5);
+  f_111_011_000_010_0(uniques, 5);
+  f_111_011_000_010_1(uniques, 5);
+  f_111_011_000_011_0(uniques, 5);
+  f_111_011_000_011_1(uniques, 5);
+  f_111_011_000_100_0(uniques, 5);
+  f_111_011_000_100_1(uniques, 5);
+  f_111_011_000_101_0(uniques, 5);
+  f_111_011_000_101_1(uniques, 5);
+  f_111_011_000_110_0(uniques, 5);
+  f_111_011_000_110_1(uniques, 5);
+  f_111_011_000_111_0(uniques, 5);
+  f_111_011_000_111_1(uniques, 5);
+  f_111_011_001_000_0(uniques, 5);
+  f_111_011_001_000_1(uniques, 5);
+  f_111_011_001_001_0(uniques, 5);
+  f_111_011_001_001_1(uniques, 5);
+  f_111_011_001_010_0(uniques, 5);
+  f_111_011_001_010_1(uniques, 5);
+  f_111_011_001_011_0(uniques, 5);
+  f_111_011_001_011_1(uniques, 5);
+  f_111_011_001_100_0(uniques, 5);
+  f_111_011_001_100_1(uniques, 5);
+  f_111_011_001_101_0(uniques, 5);
+  f_111_011_001_101_1(uniques, 5);
+  f_111_011_001_110_0(uniques, 5);
+  f_111_011_001_110_1(uniques, 5);
+  f_111_011_001_111_0(uniques, 5);
+  f_111_011_001_111_1(uniques, 5);
+  f_111_011_010_000_0(uniques, 5);
+  f_111_011_010_000_1(uniques, 5);
+  f_111_011_010_001_0(uniques, 5);
+  f_111_011_010_001_1(uniques, 5);
+  f_111_011_010_010_0(uniques, 5);
+  f_111_011_010_010_1(uniques, 5);
+  f_111_011_010_011_0(uniques, 5);
+  f_111_011_010_011_1(uniques, 5);
+  f_111_011_010_100_0(uniques, 5);
+  f_111_011_010_100_1(uniques, 5);
+  f_111_011_010_101_0(uniques, 5);
+  f_111_011_010_101_1(uniques, 5);
+  f_111_011_010_110_0(uniques, 5);
+  f_111_011_010_110_1(uniques, 5);
+  f_111_011_010_111_0(uniques, 5);
+  f_111_011_010_111_1(uniques, 5);
+  f_111_011_011_000_0(uniques, 5);
+  f_111_011_011_000_1(uniques, 5);
+  f_111_011_011_001_0(uniques, 5);
+  f_111_011_011_001_1(uniques, 5);
+  f_111_011_011_010_0(uniques, 5);
+  f_111_011_011_010_1(uniques, 5);
+  f_111_011_011_011_0(uniques, 5);
+  f_111_011_011_011_1(uniques, 5);
+  f_111_011_011_100_0(uniques, 5);
+  f_111_011_011_100_1(uniques, 5);
+  f_111_011_011_101_0(uniques, 5);
+  f_111_011_011_101_1(uniques, 5);
+  f_111_011_011_110_0(uniques, 5);
+  f_111_011_011_110_1(uniques, 5);
+  f_111_011_011_111_0(uniques, 5);
+  f_111_011_011_111_1(uniques, 5);
+  f_111_011_100_000_0(uniques, 5);
+  f_111_011_100_000_1(uniques, 5);
+  f_111_011_100_001_0(uniques, 5);
+  f_111_011_100_001_1(uniques, 5);
+  f_111_011_100_010_0(uniques, 5);
+  f_111_011_100_010_1(uniques, 5);
+  f_111_011_100_011_0(uniques, 5);
+  f_111_011_100_011_1(uniques, 5);
+  f_111_011_100_100_0(uniques, 5);
+  f_111_011_100_100_1(uniques, 5);
+  f_111_011_100_101_0(uniques, 5);
+  f_111_011_100_101_1(uniques, 5);
+  f_111_011_100_110_0(uniques, 5);
+  f_111_011_100_110_1(uniques, 5);
+  f_111_011_100_111_0(uniques, 5);
+  f_111_011_100_111_1(uniques, 5);
+  f_111_011_101_000_0(uniques, 5);
+  f_111_011_101_000_1(uniques, 5);
+  f_111_011_101_001_0(uniques, 5);
+  f_111_011_101_001_1(uniques, 5);
+  f_111_011_101_010_0(uniques, 5);
+  f_111_011_101_010_1(uniques, 5);
+  f_111_011_101_011_0(uniques, 5);
+  f_111_011_101_011_1(uniques, 5);
+  f_111_011_101_100_0(uniques, 5);
+  f_111_011_101_100_1(uniques, 5);
+  f_111_011_101_101_0(uniques, 5);
+  f_111_011_101_101_1(uniques, 5);
+  f_111_011_101_110_0(uniques, 5);
+  f_111_011_101_110_1(uniques, 5);
+  f_111_011_101_111_0(uniques, 5);
+  f_111_011_101_111_1(uniques, 5);
+  f_111_011_110_000_0(uniques, 5);
+  f_111_011_110_000_1(uniques, 5);
+  f_111_011_110_001_0(uniques, 5);
+  f_111_011_110_001_1(uniques, 5);
+  f_111_011_110_010_0(uniques, 5);
+  f_111_011_110_010_1(uniques, 5);
+  f_111_011_110_011_0(uniques, 5);
+  f_111_011_110_011_1(uniques, 5);
+  f_111_011_110_100_0(uniques, 5);
+  f_111_011_110_100_1(uniques, 5);
+  f_111_011_110_101_0(uniques, 5);
+  f_111_011_110_101_1(uniques, 5);
+  f_111_011_110_110_0(uniques, 5);
+  f_111_011_110_110_1(uniques, 5);
+  f_111_011_110_111_0(uniques, 5);
+  f_111_011_110_111_1(uniques, 5);
+  f_111_011_111_000_0(uniques, 5);
+  f_111_011_111_000_1(uniques, 5);
+  f_111_011_111_001_0(uniques, 5);
+  f_111_011_111_001_1(uniques, 5);
+  f_111_011_111_010_0(uniques, 5);
+  f_111_011_111_010_1(uniques, 5);
+  f_111_011_111_011_0(uniques, 5);
+  f_111_011_111_011_1(uniques, 5);
+  f_111_011_111_100_0(uniques, 5);
+  f_111_011_111_100_1(uniques, 5);
+  f_111_011_111_101_0(uniques, 5);
+  f_111_011_111_101_1(uniques, 5);
+  f_111_011_111_110_0(uniques, 5);
+  f_111_011_111_110_1(uniques, 5);
+  f_111_011_111_111_0(uniques, 5);
+  f_111_011_111_111_1(uniques, 5);
+  f_111_101_000_000_0(uniques, 5);
+  f_111_101_000_000_1(uniques, 5);
+  f_111_101_000_001_0(uniques, 5);
+  f_111_101_000_001_1(uniques, 5);
+  f_111_101_000_010_0(uniques, 5);
+  f_111_101_000_010_1(uniques, 5);
+  f_111_101_000_011_0(uniques, 5);
+  f_111_101_000_011_1(uniques, 5);
+  f_111_101_000_100_0(uniques, 5);
+  f_111_101_000_100_1(uniques, 5);
+  f_111_101_000_101_0(uniques, 5);
+  f_111_101_000_101_1(uniques, 5);
+  f_111_101_000_110_0(uniques, 5);
+  f_111_101_000_110_1(uniques, 5);
+  f_111_101_000_111_0(uniques, 5);
+  f_111_101_000_111_1(uniques, 5);
+  f_111_101_001_000_0(uniques, 5);
+  f_111_101_001_000_1(uniques, 5);
+  f_111_101_001_001_0(uniques, 5);
+  f_111_101_001_001_1(uniques, 5);
+  f_111_101_001_010_0(uniques, 5);
+  f_111_101_001_010_1(uniques, 5);
+  f_111_101_001_011_0(uniques, 5);
+  f_111_101_001_011_1(uniques, 5);
+  f_111_101_001_100_0(uniques, 5);
+  f_111_101_001_100_1(uniques, 5);
+  f_111_101_001_101_0(uniques, 5);
+  f_111_101_001_101_1(uniques, 5);
+  f_111_101_001_110_0(uniques, 5);
+  f_111_101_001_110_1(uniques, 5);
+  f_111_101_001_111_0(uniques, 5);
+  f_111_101_001_111_1(uniques, 5);
+  f_111_101_010_000_0(uniques, 5);
+  f_111_101_010_000_1(uniques, 5);
+  f_111_101_010_001_0(uniques, 5);
+  f_111_101_010_001_1(uniques, 5);
+  f_111_101_010_010_0(uniques, 5);
+  f_111_101_010_010_1(uniques, 5);
+  f_111_101_010_011_0(uniques, 5);
+  f_111_101_010_011_1(uniques, 5);
+  f_111_101_010_100_0(uniques, 5);
+  f_111_101_010_100_1(uniques, 5);
+  f_111_101_010_101_0(uniques, 5);
+  f_111_101_010_101_1(uniques, 5);
+  f_111_101_010_110_0(uniques, 5);
+  f_111_101_010_110_1(uniques, 5);
+  f_111_101_010_111_0(uniques, 5);
+  f_111_101_010_111_1(uniques, 5);
+  f_111_101_011_000_0(uniques, 5);
+  f_111_101_011_000_1(uniques, 5);
+  f_111_101_011_001_0(uniques, 5);
+  f_111_101_011_001_1(uniques, 5);
+  f_111_101_011_010_0(uniques, 5);
+  f_111_101_011_010_1(uniques, 5);
+  f_111_101_011_011_0(uniques, 5);
+  f_111_101_011_011_1(uniques, 5);
+  f_111_101_011_100_0(uniques, 5);
+  f_111_101_011_100_1(uniques, 5);
+  f_111_101_011_101_0(uniques, 5);
+  f_111_101_011_101_1(uniques, 5);
+  f_111_101_011_110_0(uniques, 5);
+  f_111_101_011_110_1(uniques, 5);
+  f_111_101_011_111_0(uniques, 5);
+  f_111_101_011_111_1(uniques, 5);
+  f_111_101_100_000_0(uniques, 5);
+  f_111_101_100_000_1(uniques, 5);
+  f_111_101_100_001_0(uniques, 5);
+  f_111_101_100_001_1(uniques, 5);
+  f_111_101_100_010_0(uniques, 5);
+  f_111_101_100_010_1(uniques, 5);
+  f_111_101_100_011_0(uniques, 5);
+  f_111_101_100_011_1(uniques, 5);
+  f_111_101_100_100_0(uniques, 5);
+  f_111_101_100_100_1(uniques, 5);
+  f_111_101_100_101_0(uniques, 5);
+  f_111_101_100_101_1(uniques, 5);
+  f_111_101_100_110_0(uniques, 5);
+  f_111_101_100_110_1(uniques, 5);
+  f_111_101_100_111_0(uniques, 5);
+  f_111_101_100_111_1(uniques, 5);
+  f_111_101_101_000_0(uniques, 5);
+  f_111_101_101_000_1(uniques, 5);
+  f_111_101_101_001_0(uniques, 5);
+  f_111_101_101_001_1(uniques, 5);
+  f_111_101_101_010_0(uniques, 5);
+  f_111_101_101_010_1(uniques, 5);
+  f_111_101_101_011_0(uniques, 5);
+  f_111_101_101_011_1(uniques, 5);
+  f_111_101_101_100_0(uniques, 5);
+  f_111_101_101_100_1(uniques, 5);
+  f_111_101_101_101_0(uniques, 5);
+  f_111_101_101_101_1(uniques, 5);
+  f_111_101_101_110_0(uniques, 5);
+  f_111_101_101_110_1(uniques, 5);
+  f_111_101_101_111_0(uniques, 5);
+  f_111_101_101_111_1(uniques, 5);
+  f_111_101_110_000_0(uniques, 5);
+  f_111_101_110_000_1(uniques, 5);
+  f_111_101_110_001_0(uniques, 5);
+  f_111_101_110_001_1(uniques, 5);
+  f_111_101_110_010_0(uniques, 5);
+  f_111_101_110_010_1(uniques, 5);
+  f_111_101_110_011_0(uniques, 5);
+  f_111_101_110_011_1(uniques, 5);
+  f_111_101_110_100_0(uniques, 5);
+  f_111_101_110_100_1(uniques, 5);
+  f_111_101_110_101_0(uniques, 5);
+  f_111_101_110_101_1(uniques, 5);
+  f_111_101_110_110_0(uniques, 5);
+  f_111_101_110_110_1(uniques, 5);
+  f_111_101_110_111_0(uniques, 5);
+  f_111_101_110_111_1(uniques, 5);
+  f_111_101_111_000_0(uniques, 5);
+  f_111_101_111_000_1(uniques, 5);
+  f_111_101_111_001_0(uniques, 5);
+  f_111_101_111_001_1(uniques, 5);
+  f_111_101_111_010_0(uniques, 5);
+  f_111_101_111_010_1(uniques, 5);
+  f_111_101_111_011_0(uniques, 5);
+  f_111_101_111_011_1(uniques, 5);
+  f_111_101_111_100_0(uniques, 5);
+  f_111_101_111_100_1(uniques, 5);
+  f_111_101_111_101_0(uniques, 5);
+  f_111_101_111_101_1(uniques, 5);
+  f_111_101_111_110_0(uniques, 5);
+  f_111_101_111_110_1(uniques, 5);
+  f_111_101_111_111_0(uniques, 5);
+  f_111_101_111_111_1(uniques, 5);
+  f_111_111_000_000_0(uniques, 5);
+  f_111_111_000_000_1(uniques, 5);
+  f_111_111_000_001_0(uniques, 5);
+  f_111_111_000_001_1(uniques, 5);
+  f_111_111_000_010_0(uniques, 5);
+  f_111_111_000_010_1(uniques, 5);
+  f_111_111_000_011_0(uniques, 5);
+  f_111_111_000_011_1(uniques, 5);
+  f_111_111_000_100_0(uniques, 5);
+  f_111_111_000_100_1(uniques, 5);
+  f_111_111_000_101_0(uniques, 5);
+  f_111_111_000_101_1(uniques, 5);
+  f_111_111_000_110_0(uniques, 5);
+  f_111_111_000_110_1(uniques, 5);
+  f_111_111_000_111_0(uniques, 5);
+  f_111_111_000_111_1(uniques, 5);
+  f_111_111_001_000_0(uniques, 5);
+  f_111_111_001_000_1(uniques, 5);
+  f_111_111_001_001_0(uniques, 5);
+  f_111_111_001_001_1(uniques, 5);
+  f_111_111_001_010_0(uniques, 5);
+  f_111_111_001_010_1(uniques, 5);
+  f_111_111_001_011_0(uniques, 5);
+  f_111_111_001_011_1(uniques, 5);
+  f_111_111_001_100_0(uniques, 5);
+  f_111_111_001_100_1(uniques, 5);
+  f_111_111_001_101_0(uniques, 5);
+  f_111_111_001_101_1(uniques, 5);
+  f_111_111_001_110_0(uniques, 5);
+  f_111_111_001_110_1(uniques, 5);
+  f_111_111_001_111_0(uniques, 5);
+  f_111_111_001_111_1(uniques, 5);
+  f_111_111_010_000_0(uniques, 5);
+  f_111_111_010_000_1(uniques, 5);
+  f_111_111_010_001_0(uniques, 5);
+  f_111_111_010_001_1(uniques, 5);
+  f_111_111_010_010_0(uniques, 5);
+  f_111_111_010_010_1(uniques, 5);
+  f_111_111_010_011_0(uniques, 5);
+  f_111_111_010_011_1(uniques, 5);
+  f_111_111_010_100_0(uniques, 5);
+  f_111_111_010_100_1(uniques, 5);
+  f_111_111_010_101_0(uniques, 5);
+  f_111_111_010_101_1(uniques, 5);
+  f_111_111_010_110_0(uniques, 5);
+  f_111_111_010_110_1(uniques, 5);
+  f_111_111_010_111_0(uniques, 5);
+  f_111_111_010_111_1(uniques, 5);
+  f_111_111_011_000_0(uniques, 5);
+  f_111_111_011_000_1(uniques, 5);
+  f_111_111_011_001_0(uniques, 5);
+  f_111_111_011_001_1(uniques, 5);
+  f_111_111_011_010_0(uniques, 5);
+  f_111_111_011_010_1(uniques, 5);
+  f_111_111_011_011_0(uniques, 5);
+  f_111_111_011_011_1(uniques, 5);
+  f_111_111_011_100_0(uniques, 5);
+  f_111_111_011_100_1(uniques, 5);
+  f_111_111_011_101_0(uniques, 5);
+  f_111_111_011_101_1(uniques, 5);
+  f_111_111_011_110_0(uniques, 5);
+  f_111_111_011_110_1(uniques, 5);
+  f_111_111_011_111_0(uniques, 5);
+  f_111_111_011_111_1(uniques, 5);
+  f_111_111_100_000_0(uniques, 5);
+  f_111_111_100_000_1(uniques, 5);
+  f_111_111_100_001_0(uniques, 5);
+  f_111_111_100_001_1(uniques, 5);
+  f_111_111_100_010_0(uniques, 5);
+  f_111_111_100_010_1(uniques, 5);
+  f_111_111_100_011_0(uniques, 5);
+  f_111_111_100_011_1(uniques, 5);
+  f_111_111_100_100_0(uniques, 5);
+  f_111_111_100_100_1(uniques, 5);
+  f_111_111_100_101_0(uniques, 5);
+  f_111_111_100_101_1(uniques, 5);
+  f_111_111_100_110_0(uniques, 5);
+  f_111_111_100_110_1(uniques, 5);
+  f_111_111_100_111_0(uniques, 5);
+  f_111_111_100_111_1(uniques, 5);
+  f_111_111_101_000_0(uniques, 5);
+  f_111_111_101_000_1(uniques, 5);
+  f_111_111_101_001_0(uniques, 5);
+  f_111_111_101_001_1(uniques, 5);
+  f_111_111_101_010_0(uniques, 5);
+  f_111_111_101_010_1(uniques, 5);
+  f_111_111_101_011_0(uniques, 5);
+  f_111_111_101_011_1(uniques, 5);
+  f_111_111_101_100_0(uniques, 5);
+  f_111_111_101_100_1(uniques, 5);
+  f_111_111_101_101_0(uniques, 5);
+  f_111_111_101_101_1(uniques, 5);
+  f_111_111_101_110_0(uniques, 5);
+  f_111_111_101_110_1(uniques, 5);
+  f_111_111_101_111_0(uniques, 5);
+  f_111_111_101_111_1(uniques, 5);
+  f_111_111_110_000_0(uniques, 5);
+  f_111_111_110_000_1(uniques, 5);
+  f_111_111_110_001_0(uniques, 5);
+  f_111_111_110_001_1(uniques, 5);
+  f_111_111_110_010_0(uniques, 5);
+  f_111_111_110_010_1(uniques, 5);
+  f_111_111_110_011_0(uniques, 5);
+  f_111_111_110_011_1(uniques, 5);
+  f_111_111_110_100_0(uniques, 5);
+  f_111_111_110_100_1(uniques, 5);
+  f_111_111_110_101_0(uniques, 5);
+  f_111_111_110_101_1(uniques, 5);
+  f_111_111_110_110_0(uniques, 5);
+  f_111_111_110_110_1(uniques, 5);
+  f_111_111_110_111_0(uniques, 5);
+  f_111_111_110_111_1(uniques, 5);
+  f_111_111_111_000_0(uniques, 5);
+  f_111_111_111_000_1(uniques, 5);
+  f_111_111_111_001_0(uniques, 5);
+  f_111_111_111_001_1(uniques, 5);
+  f_111_111_111_010_0(uniques, 5);
+  f_111_111_111_010_1(uniques, 5);
+  f_111_111_111_011_0(uniques, 5);
+  f_111_111_111_011_1(uniques, 5);
+  f_111_111_111_100_0(uniques, 5);
+  f_111_111_111_100_1(uniques, 5);
+  f_111_111_111_101_0(uniques, 5);
+  f_111_111_111_101_1(uniques, 5);
+  f_111_111_111_110_0(uniques, 5);
+  f_111_111_111_110_1(uniques, 5);
+  f_111_111_111_111_0(uniques, 5);
+  f_111_111_111_111_1(uniques, 5);
+  Expect.equals(4096, uniques.length);
+}
diff --git a/tests/dart2js/deferred/many_parts/lib_000_010_000_000_0.dart b/tests/dart2js/deferred/many_parts/lib_000_010_000_000_0.dart
new file mode 100644
index 0000000..5ccc030
--- /dev/null
+++ b/tests/dart2js/deferred/many_parts/lib_000_010_000_000_0.dart
@@ -0,0 +1,4111 @@
+// Copyright (c) 2020, 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:expect/expect.dart";
+
+import 'libB.dart';
+
+@pragma('dart2js:noInline')
+g_000_010_000_000_0() {
+  Set<String> uniques = {};
+
+  // f_***_*1*_***_***_*;
+  f_000_010_000_000_0(uniques, 4);
+  f_000_010_000_000_1(uniques, 4);
+  f_000_010_000_001_0(uniques, 4);
+  f_000_010_000_001_1(uniques, 4);
+  f_000_010_000_010_0(uniques, 4);
+  f_000_010_000_010_1(uniques, 4);
+  f_000_010_000_011_0(uniques, 4);
+  f_000_010_000_011_1(uniques, 4);
+  f_000_010_000_100_0(uniques, 4);
+  f_000_010_000_100_1(uniques, 4);
+  f_000_010_000_101_0(uniques, 4);
+  f_000_010_000_101_1(uniques, 4);
+  f_000_010_000_110_0(uniques, 4);
+  f_000_010_000_110_1(uniques, 4);
+  f_000_010_000_111_0(uniques, 4);
+  f_000_010_000_111_1(uniques, 4);
+  f_000_010_001_000_0(uniques, 4);
+  f_000_010_001_000_1(uniques, 4);
+  f_000_010_001_001_0(uniques, 4);
+  f_000_010_001_001_1(uniques, 4);
+  f_000_010_001_010_0(uniques, 4);
+  f_000_010_001_010_1(uniques, 4);
+  f_000_010_001_011_0(uniques, 4);
+  f_000_010_001_011_1(uniques, 4);
+  f_000_010_001_100_0(uniques, 4);
+  f_000_010_001_100_1(uniques, 4);
+  f_000_010_001_101_0(uniques, 4);
+  f_000_010_001_101_1(uniques, 4);
+  f_000_010_001_110_0(uniques, 4);
+  f_000_010_001_110_1(uniques, 4);
+  f_000_010_001_111_0(uniques, 4);
+  f_000_010_001_111_1(uniques, 4);
+  f_000_010_010_000_0(uniques, 4);
+  f_000_010_010_000_1(uniques, 4);
+  f_000_010_010_001_0(uniques, 4);
+  f_000_010_010_001_1(uniques, 4);
+  f_000_010_010_010_0(uniques, 4);
+  f_000_010_010_010_1(uniques, 4);
+  f_000_010_010_011_0(uniques, 4);
+  f_000_010_010_011_1(uniques, 4);
+  f_000_010_010_100_0(uniques, 4);
+  f_000_010_010_100_1(uniques, 4);
+  f_000_010_010_101_0(uniques, 4);
+  f_000_010_010_101_1(uniques, 4);
+  f_000_010_010_110_0(uniques, 4);
+  f_000_010_010_110_1(uniques, 4);
+  f_000_010_010_111_0(uniques, 4);
+  f_000_010_010_111_1(uniques, 4);
+  f_000_010_011_000_0(uniques, 4);
+  f_000_010_011_000_1(uniques, 4);
+  f_000_010_011_001_0(uniques, 4);
+  f_000_010_011_001_1(uniques, 4);
+  f_000_010_011_010_0(uniques, 4);
+  f_000_010_011_010_1(uniques, 4);
+  f_000_010_011_011_0(uniques, 4);
+  f_000_010_011_011_1(uniques, 4);
+  f_000_010_011_100_0(uniques, 4);
+  f_000_010_011_100_1(uniques, 4);
+  f_000_010_011_101_0(uniques, 4);
+  f_000_010_011_101_1(uniques, 4);
+  f_000_010_011_110_0(uniques, 4);
+  f_000_010_011_110_1(uniques, 4);
+  f_000_010_011_111_0(uniques, 4);
+  f_000_010_011_111_1(uniques, 4);
+  f_000_010_100_000_0(uniques, 4);
+  f_000_010_100_000_1(uniques, 4);
+  f_000_010_100_001_0(uniques, 4);
+  f_000_010_100_001_1(uniques, 4);
+  f_000_010_100_010_0(uniques, 4);
+  f_000_010_100_010_1(uniques, 4);
+  f_000_010_100_011_0(uniques, 4);
+  f_000_010_100_011_1(uniques, 4);
+  f_000_010_100_100_0(uniques, 4);
+  f_000_010_100_100_1(uniques, 4);
+  f_000_010_100_101_0(uniques, 4);
+  f_000_010_100_101_1(uniques, 4);
+  f_000_010_100_110_0(uniques, 4);
+  f_000_010_100_110_1(uniques, 4);
+  f_000_010_100_111_0(uniques, 4);
+  f_000_010_100_111_1(uniques, 4);
+  f_000_010_101_000_0(uniques, 4);
+  f_000_010_101_000_1(uniques, 4);
+  f_000_010_101_001_0(uniques, 4);
+  f_000_010_101_001_1(uniques, 4);
+  f_000_010_101_010_0(uniques, 4);
+  f_000_010_101_010_1(uniques, 4);
+  f_000_010_101_011_0(uniques, 4);
+  f_000_010_101_011_1(uniques, 4);
+  f_000_010_101_100_0(uniques, 4);
+  f_000_010_101_100_1(uniques, 4);
+  f_000_010_101_101_0(uniques, 4);
+  f_000_010_101_101_1(uniques, 4);
+  f_000_010_101_110_0(uniques, 4);
+  f_000_010_101_110_1(uniques, 4);
+  f_000_010_101_111_0(uniques, 4);
+  f_000_010_101_111_1(uniques, 4);
+  f_000_010_110_000_0(uniques, 4);
+  f_000_010_110_000_1(uniques, 4);
+  f_000_010_110_001_0(uniques, 4);
+  f_000_010_110_001_1(uniques, 4);
+  f_000_010_110_010_0(uniques, 4);
+  f_000_010_110_010_1(uniques, 4);
+  f_000_010_110_011_0(uniques, 4);
+  f_000_010_110_011_1(uniques, 4);
+  f_000_010_110_100_0(uniques, 4);
+  f_000_010_110_100_1(uniques, 4);
+  f_000_010_110_101_0(uniques, 4);
+  f_000_010_110_101_1(uniques, 4);
+  f_000_010_110_110_0(uniques, 4);
+  f_000_010_110_110_1(uniques, 4);
+  f_000_010_110_111_0(uniques, 4);
+  f_000_010_110_111_1(uniques, 4);
+  f_000_010_111_000_0(uniques, 4);
+  f_000_010_111_000_1(uniques, 4);
+  f_000_010_111_001_0(uniques, 4);
+  f_000_010_111_001_1(uniques, 4);
+  f_000_010_111_010_0(uniques, 4);
+  f_000_010_111_010_1(uniques, 4);
+  f_000_010_111_011_0(uniques, 4);
+  f_000_010_111_011_1(uniques, 4);
+  f_000_010_111_100_0(uniques, 4);
+  f_000_010_111_100_1(uniques, 4);
+  f_000_010_111_101_0(uniques, 4);
+  f_000_010_111_101_1(uniques, 4);
+  f_000_010_111_110_0(uniques, 4);
+  f_000_010_111_110_1(uniques, 4);
+  f_000_010_111_111_0(uniques, 4);
+  f_000_010_111_111_1(uniques, 4);
+  f_000_011_000_000_0(uniques, 4);
+  f_000_011_000_000_1(uniques, 4);
+  f_000_011_000_001_0(uniques, 4);
+  f_000_011_000_001_1(uniques, 4);
+  f_000_011_000_010_0(uniques, 4);
+  f_000_011_000_010_1(uniques, 4);
+  f_000_011_000_011_0(uniques, 4);
+  f_000_011_000_011_1(uniques, 4);
+  f_000_011_000_100_0(uniques, 4);
+  f_000_011_000_100_1(uniques, 4);
+  f_000_011_000_101_0(uniques, 4);
+  f_000_011_000_101_1(uniques, 4);
+  f_000_011_000_110_0(uniques, 4);
+  f_000_011_000_110_1(uniques, 4);
+  f_000_011_000_111_0(uniques, 4);
+  f_000_011_000_111_1(uniques, 4);
+  f_000_011_001_000_0(uniques, 4);
+  f_000_011_001_000_1(uniques, 4);
+  f_000_011_001_001_0(uniques, 4);
+  f_000_011_001_001_1(uniques, 4);
+  f_000_011_001_010_0(uniques, 4);
+  f_000_011_001_010_1(uniques, 4);
+  f_000_011_001_011_0(uniques, 4);
+  f_000_011_001_011_1(uniques, 4);
+  f_000_011_001_100_0(uniques, 4);
+  f_000_011_001_100_1(uniques, 4);
+  f_000_011_001_101_0(uniques, 4);
+  f_000_011_001_101_1(uniques, 4);
+  f_000_011_001_110_0(uniques, 4);
+  f_000_011_001_110_1(uniques, 4);
+  f_000_011_001_111_0(uniques, 4);
+  f_000_011_001_111_1(uniques, 4);
+  f_000_011_010_000_0(uniques, 4);
+  f_000_011_010_000_1(uniques, 4);
+  f_000_011_010_001_0(uniques, 4);
+  f_000_011_010_001_1(uniques, 4);
+  f_000_011_010_010_0(uniques, 4);
+  f_000_011_010_010_1(uniques, 4);
+  f_000_011_010_011_0(uniques, 4);
+  f_000_011_010_011_1(uniques, 4);
+  f_000_011_010_100_0(uniques, 4);
+  f_000_011_010_100_1(uniques, 4);
+  f_000_011_010_101_0(uniques, 4);
+  f_000_011_010_101_1(uniques, 4);
+  f_000_011_010_110_0(uniques, 4);
+  f_000_011_010_110_1(uniques, 4);
+  f_000_011_010_111_0(uniques, 4);
+  f_000_011_010_111_1(uniques, 4);
+  f_000_011_011_000_0(uniques, 4);
+  f_000_011_011_000_1(uniques, 4);
+  f_000_011_011_001_0(uniques, 4);
+  f_000_011_011_001_1(uniques, 4);
+  f_000_011_011_010_0(uniques, 4);
+  f_000_011_011_010_1(uniques, 4);
+  f_000_011_011_011_0(uniques, 4);
+  f_000_011_011_011_1(uniques, 4);
+  f_000_011_011_100_0(uniques, 4);
+  f_000_011_011_100_1(uniques, 4);
+  f_000_011_011_101_0(uniques, 4);
+  f_000_011_011_101_1(uniques, 4);
+  f_000_011_011_110_0(uniques, 4);
+  f_000_011_011_110_1(uniques, 4);
+  f_000_011_011_111_0(uniques, 4);
+  f_000_011_011_111_1(uniques, 4);
+  f_000_011_100_000_0(uniques, 4);
+  f_000_011_100_000_1(uniques, 4);
+  f_000_011_100_001_0(uniques, 4);
+  f_000_011_100_001_1(uniques, 4);
+  f_000_011_100_010_0(uniques, 4);
+  f_000_011_100_010_1(uniques, 4);
+  f_000_011_100_011_0(uniques, 4);
+  f_000_011_100_011_1(uniques, 4);
+  f_000_011_100_100_0(uniques, 4);
+  f_000_011_100_100_1(uniques, 4);
+  f_000_011_100_101_0(uniques, 4);
+  f_000_011_100_101_1(uniques, 4);
+  f_000_011_100_110_0(uniques, 4);
+  f_000_011_100_110_1(uniques, 4);
+  f_000_011_100_111_0(uniques, 4);
+  f_000_011_100_111_1(uniques, 4);
+  f_000_011_101_000_0(uniques, 4);
+  f_000_011_101_000_1(uniques, 4);
+  f_000_011_101_001_0(uniques, 4);
+  f_000_011_101_001_1(uniques, 4);
+  f_000_011_101_010_0(uniques, 4);
+  f_000_011_101_010_1(uniques, 4);
+  f_000_011_101_011_0(uniques, 4);
+  f_000_011_101_011_1(uniques, 4);
+  f_000_011_101_100_0(uniques, 4);
+  f_000_011_101_100_1(uniques, 4);
+  f_000_011_101_101_0(uniques, 4);
+  f_000_011_101_101_1(uniques, 4);
+  f_000_011_101_110_0(uniques, 4);
+  f_000_011_101_110_1(uniques, 4);
+  f_000_011_101_111_0(uniques, 4);
+  f_000_011_101_111_1(uniques, 4);
+  f_000_011_110_000_0(uniques, 4);
+  f_000_011_110_000_1(uniques, 4);
+  f_000_011_110_001_0(uniques, 4);
+  f_000_011_110_001_1(uniques, 4);
+  f_000_011_110_010_0(uniques, 4);
+  f_000_011_110_010_1(uniques, 4);
+  f_000_011_110_011_0(uniques, 4);
+  f_000_011_110_011_1(uniques, 4);
+  f_000_011_110_100_0(uniques, 4);
+  f_000_011_110_100_1(uniques, 4);
+  f_000_011_110_101_0(uniques, 4);
+  f_000_011_110_101_1(uniques, 4);
+  f_000_011_110_110_0(uniques, 4);
+  f_000_011_110_110_1(uniques, 4);
+  f_000_011_110_111_0(uniques, 4);
+  f_000_011_110_111_1(uniques, 4);
+  f_000_011_111_000_0(uniques, 4);
+  f_000_011_111_000_1(uniques, 4);
+  f_000_011_111_001_0(uniques, 4);
+  f_000_011_111_001_1(uniques, 4);
+  f_000_011_111_010_0(uniques, 4);
+  f_000_011_111_010_1(uniques, 4);
+  f_000_011_111_011_0(uniques, 4);
+  f_000_011_111_011_1(uniques, 4);
+  f_000_011_111_100_0(uniques, 4);
+  f_000_011_111_100_1(uniques, 4);
+  f_000_011_111_101_0(uniques, 4);
+  f_000_011_111_101_1(uniques, 4);
+  f_000_011_111_110_0(uniques, 4);
+  f_000_011_111_110_1(uniques, 4);
+  f_000_011_111_111_0(uniques, 4);
+  f_000_011_111_111_1(uniques, 4);
+  f_000_110_000_000_0(uniques, 4);
+  f_000_110_000_000_1(uniques, 4);
+  f_000_110_000_001_0(uniques, 4);
+  f_000_110_000_001_1(uniques, 4);
+  f_000_110_000_010_0(uniques, 4);
+  f_000_110_000_010_1(uniques, 4);
+  f_000_110_000_011_0(uniques, 4);
+  f_000_110_000_011_1(uniques, 4);
+  f_000_110_000_100_0(uniques, 4);
+  f_000_110_000_100_1(uniques, 4);
+  f_000_110_000_101_0(uniques, 4);
+  f_000_110_000_101_1(uniques, 4);
+  f_000_110_000_110_0(uniques, 4);
+  f_000_110_000_110_1(uniques, 4);
+  f_000_110_000_111_0(uniques, 4);
+  f_000_110_000_111_1(uniques, 4);
+  f_000_110_001_000_0(uniques, 4);
+  f_000_110_001_000_1(uniques, 4);
+  f_000_110_001_001_0(uniques, 4);
+  f_000_110_001_001_1(uniques, 4);
+  f_000_110_001_010_0(uniques, 4);
+  f_000_110_001_010_1(uniques, 4);
+  f_000_110_001_011_0(uniques, 4);
+  f_000_110_001_011_1(uniques, 4);
+  f_000_110_001_100_0(uniques, 4);
+  f_000_110_001_100_1(uniques, 4);
+  f_000_110_001_101_0(uniques, 4);
+  f_000_110_001_101_1(uniques, 4);
+  f_000_110_001_110_0(uniques, 4);
+  f_000_110_001_110_1(uniques, 4);
+  f_000_110_001_111_0(uniques, 4);
+  f_000_110_001_111_1(uniques, 4);
+  f_000_110_010_000_0(uniques, 4);
+  f_000_110_010_000_1(uniques, 4);
+  f_000_110_010_001_0(uniques, 4);
+  f_000_110_010_001_1(uniques, 4);
+  f_000_110_010_010_0(uniques, 4);
+  f_000_110_010_010_1(uniques, 4);
+  f_000_110_010_011_0(uniques, 4);
+  f_000_110_010_011_1(uniques, 4);
+  f_000_110_010_100_0(uniques, 4);
+  f_000_110_010_100_1(uniques, 4);
+  f_000_110_010_101_0(uniques, 4);
+  f_000_110_010_101_1(uniques, 4);
+  f_000_110_010_110_0(uniques, 4);
+  f_000_110_010_110_1(uniques, 4);
+  f_000_110_010_111_0(uniques, 4);
+  f_000_110_010_111_1(uniques, 4);
+  f_000_110_011_000_0(uniques, 4);
+  f_000_110_011_000_1(uniques, 4);
+  f_000_110_011_001_0(uniques, 4);
+  f_000_110_011_001_1(uniques, 4);
+  f_000_110_011_010_0(uniques, 4);
+  f_000_110_011_010_1(uniques, 4);
+  f_000_110_011_011_0(uniques, 4);
+  f_000_110_011_011_1(uniques, 4);
+  f_000_110_011_100_0(uniques, 4);
+  f_000_110_011_100_1(uniques, 4);
+  f_000_110_011_101_0(uniques, 4);
+  f_000_110_011_101_1(uniques, 4);
+  f_000_110_011_110_0(uniques, 4);
+  f_000_110_011_110_1(uniques, 4);
+  f_000_110_011_111_0(uniques, 4);
+  f_000_110_011_111_1(uniques, 4);
+  f_000_110_100_000_0(uniques, 4);
+  f_000_110_100_000_1(uniques, 4);
+  f_000_110_100_001_0(uniques, 4);
+  f_000_110_100_001_1(uniques, 4);
+  f_000_110_100_010_0(uniques, 4);
+  f_000_110_100_010_1(uniques, 4);
+  f_000_110_100_011_0(uniques, 4);
+  f_000_110_100_011_1(uniques, 4);
+  f_000_110_100_100_0(uniques, 4);
+  f_000_110_100_100_1(uniques, 4);
+  f_000_110_100_101_0(uniques, 4);
+  f_000_110_100_101_1(uniques, 4);
+  f_000_110_100_110_0(uniques, 4);
+  f_000_110_100_110_1(uniques, 4);
+  f_000_110_100_111_0(uniques, 4);
+  f_000_110_100_111_1(uniques, 4);
+  f_000_110_101_000_0(uniques, 4);
+  f_000_110_101_000_1(uniques, 4);
+  f_000_110_101_001_0(uniques, 4);
+  f_000_110_101_001_1(uniques, 4);
+  f_000_110_101_010_0(uniques, 4);
+  f_000_110_101_010_1(uniques, 4);
+  f_000_110_101_011_0(uniques, 4);
+  f_000_110_101_011_1(uniques, 4);
+  f_000_110_101_100_0(uniques, 4);
+  f_000_110_101_100_1(uniques, 4);
+  f_000_110_101_101_0(uniques, 4);
+  f_000_110_101_101_1(uniques, 4);
+  f_000_110_101_110_0(uniques, 4);
+  f_000_110_101_110_1(uniques, 4);
+  f_000_110_101_111_0(uniques, 4);
+  f_000_110_101_111_1(uniques, 4);
+  f_000_110_110_000_0(uniques, 4);
+  f_000_110_110_000_1(uniques, 4);
+  f_000_110_110_001_0(uniques, 4);
+  f_000_110_110_001_1(uniques, 4);
+  f_000_110_110_010_0(uniques, 4);
+  f_000_110_110_010_1(uniques, 4);
+  f_000_110_110_011_0(uniques, 4);
+  f_000_110_110_011_1(uniques, 4);
+  f_000_110_110_100_0(uniques, 4);
+  f_000_110_110_100_1(uniques, 4);
+  f_000_110_110_101_0(uniques, 4);
+  f_000_110_110_101_1(uniques, 4);
+  f_000_110_110_110_0(uniques, 4);
+  f_000_110_110_110_1(uniques, 4);
+  f_000_110_110_111_0(uniques, 4);
+  f_000_110_110_111_1(uniques, 4);
+  f_000_110_111_000_0(uniques, 4);
+  f_000_110_111_000_1(uniques, 4);
+  f_000_110_111_001_0(uniques, 4);
+  f_000_110_111_001_1(uniques, 4);
+  f_000_110_111_010_0(uniques, 4);
+  f_000_110_111_010_1(uniques, 4);
+  f_000_110_111_011_0(uniques, 4);
+  f_000_110_111_011_1(uniques, 4);
+  f_000_110_111_100_0(uniques, 4);
+  f_000_110_111_100_1(uniques, 4);
+  f_000_110_111_101_0(uniques, 4);
+  f_000_110_111_101_1(uniques, 4);
+  f_000_110_111_110_0(uniques, 4);
+  f_000_110_111_110_1(uniques, 4);
+  f_000_110_111_111_0(uniques, 4);
+  f_000_110_111_111_1(uniques, 4);
+  f_000_111_000_000_0(uniques, 4);
+  f_000_111_000_000_1(uniques, 4);
+  f_000_111_000_001_0(uniques, 4);
+  f_000_111_000_001_1(uniques, 4);
+  f_000_111_000_010_0(uniques, 4);
+  f_000_111_000_010_1(uniques, 4);
+  f_000_111_000_011_0(uniques, 4);
+  f_000_111_000_011_1(uniques, 4);
+  f_000_111_000_100_0(uniques, 4);
+  f_000_111_000_100_1(uniques, 4);
+  f_000_111_000_101_0(uniques, 4);
+  f_000_111_000_101_1(uniques, 4);
+  f_000_111_000_110_0(uniques, 4);
+  f_000_111_000_110_1(uniques, 4);
+  f_000_111_000_111_0(uniques, 4);
+  f_000_111_000_111_1(uniques, 4);
+  f_000_111_001_000_0(uniques, 4);
+  f_000_111_001_000_1(uniques, 4);
+  f_000_111_001_001_0(uniques, 4);
+  f_000_111_001_001_1(uniques, 4);
+  f_000_111_001_010_0(uniques, 4);
+  f_000_111_001_010_1(uniques, 4);
+  f_000_111_001_011_0(uniques, 4);
+  f_000_111_001_011_1(uniques, 4);
+  f_000_111_001_100_0(uniques, 4);
+  f_000_111_001_100_1(uniques, 4);
+  f_000_111_001_101_0(uniques, 4);
+  f_000_111_001_101_1(uniques, 4);
+  f_000_111_001_110_0(uniques, 4);
+  f_000_111_001_110_1(uniques, 4);
+  f_000_111_001_111_0(uniques, 4);
+  f_000_111_001_111_1(uniques, 4);
+  f_000_111_010_000_0(uniques, 4);
+  f_000_111_010_000_1(uniques, 4);
+  f_000_111_010_001_0(uniques, 4);
+  f_000_111_010_001_1(uniques, 4);
+  f_000_111_010_010_0(uniques, 4);
+  f_000_111_010_010_1(uniques, 4);
+  f_000_111_010_011_0(uniques, 4);
+  f_000_111_010_011_1(uniques, 4);
+  f_000_111_010_100_0(uniques, 4);
+  f_000_111_010_100_1(uniques, 4);
+  f_000_111_010_101_0(uniques, 4);
+  f_000_111_010_101_1(uniques, 4);
+  f_000_111_010_110_0(uniques, 4);
+  f_000_111_010_110_1(uniques, 4);
+  f_000_111_010_111_0(uniques, 4);
+  f_000_111_010_111_1(uniques, 4);
+  f_000_111_011_000_0(uniques, 4);
+  f_000_111_011_000_1(uniques, 4);
+  f_000_111_011_001_0(uniques, 4);
+  f_000_111_011_001_1(uniques, 4);
+  f_000_111_011_010_0(uniques, 4);
+  f_000_111_011_010_1(uniques, 4);
+  f_000_111_011_011_0(uniques, 4);
+  f_000_111_011_011_1(uniques, 4);
+  f_000_111_011_100_0(uniques, 4);
+  f_000_111_011_100_1(uniques, 4);
+  f_000_111_011_101_0(uniques, 4);
+  f_000_111_011_101_1(uniques, 4);
+  f_000_111_011_110_0(uniques, 4);
+  f_000_111_011_110_1(uniques, 4);
+  f_000_111_011_111_0(uniques, 4);
+  f_000_111_011_111_1(uniques, 4);
+  f_000_111_100_000_0(uniques, 4);
+  f_000_111_100_000_1(uniques, 4);
+  f_000_111_100_001_0(uniques, 4);
+  f_000_111_100_001_1(uniques, 4);
+  f_000_111_100_010_0(uniques, 4);
+  f_000_111_100_010_1(uniques, 4);
+  f_000_111_100_011_0(uniques, 4);
+  f_000_111_100_011_1(uniques, 4);
+  f_000_111_100_100_0(uniques, 4);
+  f_000_111_100_100_1(uniques, 4);
+  f_000_111_100_101_0(uniques, 4);
+  f_000_111_100_101_1(uniques, 4);
+  f_000_111_100_110_0(uniques, 4);
+  f_000_111_100_110_1(uniques, 4);
+  f_000_111_100_111_0(uniques, 4);
+  f_000_111_100_111_1(uniques, 4);
+  f_000_111_101_000_0(uniques, 4);
+  f_000_111_101_000_1(uniques, 4);
+  f_000_111_101_001_0(uniques, 4);
+  f_000_111_101_001_1(uniques, 4);
+  f_000_111_101_010_0(uniques, 4);
+  f_000_111_101_010_1(uniques, 4);
+  f_000_111_101_011_0(uniques, 4);
+  f_000_111_101_011_1(uniques, 4);
+  f_000_111_101_100_0(uniques, 4);
+  f_000_111_101_100_1(uniques, 4);
+  f_000_111_101_101_0(uniques, 4);
+  f_000_111_101_101_1(uniques, 4);
+  f_000_111_101_110_0(uniques, 4);
+  f_000_111_101_110_1(uniques, 4);
+  f_000_111_101_111_0(uniques, 4);
+  f_000_111_101_111_1(uniques, 4);
+  f_000_111_110_000_0(uniques, 4);
+  f_000_111_110_000_1(uniques, 4);
+  f_000_111_110_001_0(uniques, 4);
+  f_000_111_110_001_1(uniques, 4);
+  f_000_111_110_010_0(uniques, 4);
+  f_000_111_110_010_1(uniques, 4);
+  f_000_111_110_011_0(uniques, 4);
+  f_000_111_110_011_1(uniques, 4);
+  f_000_111_110_100_0(uniques, 4);
+  f_000_111_110_100_1(uniques, 4);
+  f_000_111_110_101_0(uniques, 4);
+  f_000_111_110_101_1(uniques, 4);
+  f_000_111_110_110_0(uniques, 4);
+  f_000_111_110_110_1(uniques, 4);
+  f_000_111_110_111_0(uniques, 4);
+  f_000_111_110_111_1(uniques, 4);
+  f_000_111_111_000_0(uniques, 4);
+  f_000_111_111_000_1(uniques, 4);
+  f_000_111_111_001_0(uniques, 4);
+  f_000_111_111_001_1(uniques, 4);
+  f_000_111_111_010_0(uniques, 4);
+  f_000_111_111_010_1(uniques, 4);
+  f_000_111_111_011_0(uniques, 4);
+  f_000_111_111_011_1(uniques, 4);
+  f_000_111_111_100_0(uniques, 4);
+  f_000_111_111_100_1(uniques, 4);
+  f_000_111_111_101_0(uniques, 4);
+  f_000_111_111_101_1(uniques, 4);
+  f_000_111_111_110_0(uniques, 4);
+  f_000_111_111_110_1(uniques, 4);
+  f_000_111_111_111_0(uniques, 4);
+  f_000_111_111_111_1(uniques, 4);
+  f_001_010_000_000_0(uniques, 4);
+  f_001_010_000_000_1(uniques, 4);
+  f_001_010_000_001_0(uniques, 4);
+  f_001_010_000_001_1(uniques, 4);
+  f_001_010_000_010_0(uniques, 4);
+  f_001_010_000_010_1(uniques, 4);
+  f_001_010_000_011_0(uniques, 4);
+  f_001_010_000_011_1(uniques, 4);
+  f_001_010_000_100_0(uniques, 4);
+  f_001_010_000_100_1(uniques, 4);
+  f_001_010_000_101_0(uniques, 4);
+  f_001_010_000_101_1(uniques, 4);
+  f_001_010_000_110_0(uniques, 4);
+  f_001_010_000_110_1(uniques, 4);
+  f_001_010_000_111_0(uniques, 4);
+  f_001_010_000_111_1(uniques, 4);
+  f_001_010_001_000_0(uniques, 4);
+  f_001_010_001_000_1(uniques, 4);
+  f_001_010_001_001_0(uniques, 4);
+  f_001_010_001_001_1(uniques, 4);
+  f_001_010_001_010_0(uniques, 4);
+  f_001_010_001_010_1(uniques, 4);
+  f_001_010_001_011_0(uniques, 4);
+  f_001_010_001_011_1(uniques, 4);
+  f_001_010_001_100_0(uniques, 4);
+  f_001_010_001_100_1(uniques, 4);
+  f_001_010_001_101_0(uniques, 4);
+  f_001_010_001_101_1(uniques, 4);
+  f_001_010_001_110_0(uniques, 4);
+  f_001_010_001_110_1(uniques, 4);
+  f_001_010_001_111_0(uniques, 4);
+  f_001_010_001_111_1(uniques, 4);
+  f_001_010_010_000_0(uniques, 4);
+  f_001_010_010_000_1(uniques, 4);
+  f_001_010_010_001_0(uniques, 4);
+  f_001_010_010_001_1(uniques, 4);
+  f_001_010_010_010_0(uniques, 4);
+  f_001_010_010_010_1(uniques, 4);
+  f_001_010_010_011_0(uniques, 4);
+  f_001_010_010_011_1(uniques, 4);
+  f_001_010_010_100_0(uniques, 4);
+  f_001_010_010_100_1(uniques, 4);
+  f_001_010_010_101_0(uniques, 4);
+  f_001_010_010_101_1(uniques, 4);
+  f_001_010_010_110_0(uniques, 4);
+  f_001_010_010_110_1(uniques, 4);
+  f_001_010_010_111_0(uniques, 4);
+  f_001_010_010_111_1(uniques, 4);
+  f_001_010_011_000_0(uniques, 4);
+  f_001_010_011_000_1(uniques, 4);
+  f_001_010_011_001_0(uniques, 4);
+  f_001_010_011_001_1(uniques, 4);
+  f_001_010_011_010_0(uniques, 4);
+  f_001_010_011_010_1(uniques, 4);
+  f_001_010_011_011_0(uniques, 4);
+  f_001_010_011_011_1(uniques, 4);
+  f_001_010_011_100_0(uniques, 4);
+  f_001_010_011_100_1(uniques, 4);
+  f_001_010_011_101_0(uniques, 4);
+  f_001_010_011_101_1(uniques, 4);
+  f_001_010_011_110_0(uniques, 4);
+  f_001_010_011_110_1(uniques, 4);
+  f_001_010_011_111_0(uniques, 4);
+  f_001_010_011_111_1(uniques, 4);
+  f_001_010_100_000_0(uniques, 4);
+  f_001_010_100_000_1(uniques, 4);
+  f_001_010_100_001_0(uniques, 4);
+  f_001_010_100_001_1(uniques, 4);
+  f_001_010_100_010_0(uniques, 4);
+  f_001_010_100_010_1(uniques, 4);
+  f_001_010_100_011_0(uniques, 4);
+  f_001_010_100_011_1(uniques, 4);
+  f_001_010_100_100_0(uniques, 4);
+  f_001_010_100_100_1(uniques, 4);
+  f_001_010_100_101_0(uniques, 4);
+  f_001_010_100_101_1(uniques, 4);
+  f_001_010_100_110_0(uniques, 4);
+  f_001_010_100_110_1(uniques, 4);
+  f_001_010_100_111_0(uniques, 4);
+  f_001_010_100_111_1(uniques, 4);
+  f_001_010_101_000_0(uniques, 4);
+  f_001_010_101_000_1(uniques, 4);
+  f_001_010_101_001_0(uniques, 4);
+  f_001_010_101_001_1(uniques, 4);
+  f_001_010_101_010_0(uniques, 4);
+  f_001_010_101_010_1(uniques, 4);
+  f_001_010_101_011_0(uniques, 4);
+  f_001_010_101_011_1(uniques, 4);
+  f_001_010_101_100_0(uniques, 4);
+  f_001_010_101_100_1(uniques, 4);
+  f_001_010_101_101_0(uniques, 4);
+  f_001_010_101_101_1(uniques, 4);
+  f_001_010_101_110_0(uniques, 4);
+  f_001_010_101_110_1(uniques, 4);
+  f_001_010_101_111_0(uniques, 4);
+  f_001_010_101_111_1(uniques, 4);
+  f_001_010_110_000_0(uniques, 4);
+  f_001_010_110_000_1(uniques, 4);
+  f_001_010_110_001_0(uniques, 4);
+  f_001_010_110_001_1(uniques, 4);
+  f_001_010_110_010_0(uniques, 4);
+  f_001_010_110_010_1(uniques, 4);
+  f_001_010_110_011_0(uniques, 4);
+  f_001_010_110_011_1(uniques, 4);
+  f_001_010_110_100_0(uniques, 4);
+  f_001_010_110_100_1(uniques, 4);
+  f_001_010_110_101_0(uniques, 4);
+  f_001_010_110_101_1(uniques, 4);
+  f_001_010_110_110_0(uniques, 4);
+  f_001_010_110_110_1(uniques, 4);
+  f_001_010_110_111_0(uniques, 4);
+  f_001_010_110_111_1(uniques, 4);
+  f_001_010_111_000_0(uniques, 4);
+  f_001_010_111_000_1(uniques, 4);
+  f_001_010_111_001_0(uniques, 4);
+  f_001_010_111_001_1(uniques, 4);
+  f_001_010_111_010_0(uniques, 4);
+  f_001_010_111_010_1(uniques, 4);
+  f_001_010_111_011_0(uniques, 4);
+  f_001_010_111_011_1(uniques, 4);
+  f_001_010_111_100_0(uniques, 4);
+  f_001_010_111_100_1(uniques, 4);
+  f_001_010_111_101_0(uniques, 4);
+  f_001_010_111_101_1(uniques, 4);
+  f_001_010_111_110_0(uniques, 4);
+  f_001_010_111_110_1(uniques, 4);
+  f_001_010_111_111_0(uniques, 4);
+  f_001_010_111_111_1(uniques, 4);
+  f_001_011_000_000_0(uniques, 4);
+  f_001_011_000_000_1(uniques, 4);
+  f_001_011_000_001_0(uniques, 4);
+  f_001_011_000_001_1(uniques, 4);
+  f_001_011_000_010_0(uniques, 4);
+  f_001_011_000_010_1(uniques, 4);
+  f_001_011_000_011_0(uniques, 4);
+  f_001_011_000_011_1(uniques, 4);
+  f_001_011_000_100_0(uniques, 4);
+  f_001_011_000_100_1(uniques, 4);
+  f_001_011_000_101_0(uniques, 4);
+  f_001_011_000_101_1(uniques, 4);
+  f_001_011_000_110_0(uniques, 4);
+  f_001_011_000_110_1(uniques, 4);
+  f_001_011_000_111_0(uniques, 4);
+  f_001_011_000_111_1(uniques, 4);
+  f_001_011_001_000_0(uniques, 4);
+  f_001_011_001_000_1(uniques, 4);
+  f_001_011_001_001_0(uniques, 4);
+  f_001_011_001_001_1(uniques, 4);
+  f_001_011_001_010_0(uniques, 4);
+  f_001_011_001_010_1(uniques, 4);
+  f_001_011_001_011_0(uniques, 4);
+  f_001_011_001_011_1(uniques, 4);
+  f_001_011_001_100_0(uniques, 4);
+  f_001_011_001_100_1(uniques, 4);
+  f_001_011_001_101_0(uniques, 4);
+  f_001_011_001_101_1(uniques, 4);
+  f_001_011_001_110_0(uniques, 4);
+  f_001_011_001_110_1(uniques, 4);
+  f_001_011_001_111_0(uniques, 4);
+  f_001_011_001_111_1(uniques, 4);
+  f_001_011_010_000_0(uniques, 4);
+  f_001_011_010_000_1(uniques, 4);
+  f_001_011_010_001_0(uniques, 4);
+  f_001_011_010_001_1(uniques, 4);
+  f_001_011_010_010_0(uniques, 4);
+  f_001_011_010_010_1(uniques, 4);
+  f_001_011_010_011_0(uniques, 4);
+  f_001_011_010_011_1(uniques, 4);
+  f_001_011_010_100_0(uniques, 4);
+  f_001_011_010_100_1(uniques, 4);
+  f_001_011_010_101_0(uniques, 4);
+  f_001_011_010_101_1(uniques, 4);
+  f_001_011_010_110_0(uniques, 4);
+  f_001_011_010_110_1(uniques, 4);
+  f_001_011_010_111_0(uniques, 4);
+  f_001_011_010_111_1(uniques, 4);
+  f_001_011_011_000_0(uniques, 4);
+  f_001_011_011_000_1(uniques, 4);
+  f_001_011_011_001_0(uniques, 4);
+  f_001_011_011_001_1(uniques, 4);
+  f_001_011_011_010_0(uniques, 4);
+  f_001_011_011_010_1(uniques, 4);
+  f_001_011_011_011_0(uniques, 4);
+  f_001_011_011_011_1(uniques, 4);
+  f_001_011_011_100_0(uniques, 4);
+  f_001_011_011_100_1(uniques, 4);
+  f_001_011_011_101_0(uniques, 4);
+  f_001_011_011_101_1(uniques, 4);
+  f_001_011_011_110_0(uniques, 4);
+  f_001_011_011_110_1(uniques, 4);
+  f_001_011_011_111_0(uniques, 4);
+  f_001_011_011_111_1(uniques, 4);
+  f_001_011_100_000_0(uniques, 4);
+  f_001_011_100_000_1(uniques, 4);
+  f_001_011_100_001_0(uniques, 4);
+  f_001_011_100_001_1(uniques, 4);
+  f_001_011_100_010_0(uniques, 4);
+  f_001_011_100_010_1(uniques, 4);
+  f_001_011_100_011_0(uniques, 4);
+  f_001_011_100_011_1(uniques, 4);
+  f_001_011_100_100_0(uniques, 4);
+  f_001_011_100_100_1(uniques, 4);
+  f_001_011_100_101_0(uniques, 4);
+  f_001_011_100_101_1(uniques, 4);
+  f_001_011_100_110_0(uniques, 4);
+  f_001_011_100_110_1(uniques, 4);
+  f_001_011_100_111_0(uniques, 4);
+  f_001_011_100_111_1(uniques, 4);
+  f_001_011_101_000_0(uniques, 4);
+  f_001_011_101_000_1(uniques, 4);
+  f_001_011_101_001_0(uniques, 4);
+  f_001_011_101_001_1(uniques, 4);
+  f_001_011_101_010_0(uniques, 4);
+  f_001_011_101_010_1(uniques, 4);
+  f_001_011_101_011_0(uniques, 4);
+  f_001_011_101_011_1(uniques, 4);
+  f_001_011_101_100_0(uniques, 4);
+  f_001_011_101_100_1(uniques, 4);
+  f_001_011_101_101_0(uniques, 4);
+  f_001_011_101_101_1(uniques, 4);
+  f_001_011_101_110_0(uniques, 4);
+  f_001_011_101_110_1(uniques, 4);
+  f_001_011_101_111_0(uniques, 4);
+  f_001_011_101_111_1(uniques, 4);
+  f_001_011_110_000_0(uniques, 4);
+  f_001_011_110_000_1(uniques, 4);
+  f_001_011_110_001_0(uniques, 4);
+  f_001_011_110_001_1(uniques, 4);
+  f_001_011_110_010_0(uniques, 4);
+  f_001_011_110_010_1(uniques, 4);
+  f_001_011_110_011_0(uniques, 4);
+  f_001_011_110_011_1(uniques, 4);
+  f_001_011_110_100_0(uniques, 4);
+  f_001_011_110_100_1(uniques, 4);
+  f_001_011_110_101_0(uniques, 4);
+  f_001_011_110_101_1(uniques, 4);
+  f_001_011_110_110_0(uniques, 4);
+  f_001_011_110_110_1(uniques, 4);
+  f_001_011_110_111_0(uniques, 4);
+  f_001_011_110_111_1(uniques, 4);
+  f_001_011_111_000_0(uniques, 4);
+  f_001_011_111_000_1(uniques, 4);
+  f_001_011_111_001_0(uniques, 4);
+  f_001_011_111_001_1(uniques, 4);
+  f_001_011_111_010_0(uniques, 4);
+  f_001_011_111_010_1(uniques, 4);
+  f_001_011_111_011_0(uniques, 4);
+  f_001_011_111_011_1(uniques, 4);
+  f_001_011_111_100_0(uniques, 4);
+  f_001_011_111_100_1(uniques, 4);
+  f_001_011_111_101_0(uniques, 4);
+  f_001_011_111_101_1(uniques, 4);
+  f_001_011_111_110_0(uniques, 4);
+  f_001_011_111_110_1(uniques, 4);
+  f_001_011_111_111_0(uniques, 4);
+  f_001_011_111_111_1(uniques, 4);
+  f_001_110_000_000_0(uniques, 4);
+  f_001_110_000_000_1(uniques, 4);
+  f_001_110_000_001_0(uniques, 4);
+  f_001_110_000_001_1(uniques, 4);
+  f_001_110_000_010_0(uniques, 4);
+  f_001_110_000_010_1(uniques, 4);
+  f_001_110_000_011_0(uniques, 4);
+  f_001_110_000_011_1(uniques, 4);
+  f_001_110_000_100_0(uniques, 4);
+  f_001_110_000_100_1(uniques, 4);
+  f_001_110_000_101_0(uniques, 4);
+  f_001_110_000_101_1(uniques, 4);
+  f_001_110_000_110_0(uniques, 4);
+  f_001_110_000_110_1(uniques, 4);
+  f_001_110_000_111_0(uniques, 4);
+  f_001_110_000_111_1(uniques, 4);
+  f_001_110_001_000_0(uniques, 4);
+  f_001_110_001_000_1(uniques, 4);
+  f_001_110_001_001_0(uniques, 4);
+  f_001_110_001_001_1(uniques, 4);
+  f_001_110_001_010_0(uniques, 4);
+  f_001_110_001_010_1(uniques, 4);
+  f_001_110_001_011_0(uniques, 4);
+  f_001_110_001_011_1(uniques, 4);
+  f_001_110_001_100_0(uniques, 4);
+  f_001_110_001_100_1(uniques, 4);
+  f_001_110_001_101_0(uniques, 4);
+  f_001_110_001_101_1(uniques, 4);
+  f_001_110_001_110_0(uniques, 4);
+  f_001_110_001_110_1(uniques, 4);
+  f_001_110_001_111_0(uniques, 4);
+  f_001_110_001_111_1(uniques, 4);
+  f_001_110_010_000_0(uniques, 4);
+  f_001_110_010_000_1(uniques, 4);
+  f_001_110_010_001_0(uniques, 4);
+  f_001_110_010_001_1(uniques, 4);
+  f_001_110_010_010_0(uniques, 4);
+  f_001_110_010_010_1(uniques, 4);
+  f_001_110_010_011_0(uniques, 4);
+  f_001_110_010_011_1(uniques, 4);
+  f_001_110_010_100_0(uniques, 4);
+  f_001_110_010_100_1(uniques, 4);
+  f_001_110_010_101_0(uniques, 4);
+  f_001_110_010_101_1(uniques, 4);
+  f_001_110_010_110_0(uniques, 4);
+  f_001_110_010_110_1(uniques, 4);
+  f_001_110_010_111_0(uniques, 4);
+  f_001_110_010_111_1(uniques, 4);
+  f_001_110_011_000_0(uniques, 4);
+  f_001_110_011_000_1(uniques, 4);
+  f_001_110_011_001_0(uniques, 4);
+  f_001_110_011_001_1(uniques, 4);
+  f_001_110_011_010_0(uniques, 4);
+  f_001_110_011_010_1(uniques, 4);
+  f_001_110_011_011_0(uniques, 4);
+  f_001_110_011_011_1(uniques, 4);
+  f_001_110_011_100_0(uniques, 4);
+  f_001_110_011_100_1(uniques, 4);
+  f_001_110_011_101_0(uniques, 4);
+  f_001_110_011_101_1(uniques, 4);
+  f_001_110_011_110_0(uniques, 4);
+  f_001_110_011_110_1(uniques, 4);
+  f_001_110_011_111_0(uniques, 4);
+  f_001_110_011_111_1(uniques, 4);
+  f_001_110_100_000_0(uniques, 4);
+  f_001_110_100_000_1(uniques, 4);
+  f_001_110_100_001_0(uniques, 4);
+  f_001_110_100_001_1(uniques, 4);
+  f_001_110_100_010_0(uniques, 4);
+  f_001_110_100_010_1(uniques, 4);
+  f_001_110_100_011_0(uniques, 4);
+  f_001_110_100_011_1(uniques, 4);
+  f_001_110_100_100_0(uniques, 4);
+  f_001_110_100_100_1(uniques, 4);
+  f_001_110_100_101_0(uniques, 4);
+  f_001_110_100_101_1(uniques, 4);
+  f_001_110_100_110_0(uniques, 4);
+  f_001_110_100_110_1(uniques, 4);
+  f_001_110_100_111_0(uniques, 4);
+  f_001_110_100_111_1(uniques, 4);
+  f_001_110_101_000_0(uniques, 4);
+  f_001_110_101_000_1(uniques, 4);
+  f_001_110_101_001_0(uniques, 4);
+  f_001_110_101_001_1(uniques, 4);
+  f_001_110_101_010_0(uniques, 4);
+  f_001_110_101_010_1(uniques, 4);
+  f_001_110_101_011_0(uniques, 4);
+  f_001_110_101_011_1(uniques, 4);
+  f_001_110_101_100_0(uniques, 4);
+  f_001_110_101_100_1(uniques, 4);
+  f_001_110_101_101_0(uniques, 4);
+  f_001_110_101_101_1(uniques, 4);
+  f_001_110_101_110_0(uniques, 4);
+  f_001_110_101_110_1(uniques, 4);
+  f_001_110_101_111_0(uniques, 4);
+  f_001_110_101_111_1(uniques, 4);
+  f_001_110_110_000_0(uniques, 4);
+  f_001_110_110_000_1(uniques, 4);
+  f_001_110_110_001_0(uniques, 4);
+  f_001_110_110_001_1(uniques, 4);
+  f_001_110_110_010_0(uniques, 4);
+  f_001_110_110_010_1(uniques, 4);
+  f_001_110_110_011_0(uniques, 4);
+  f_001_110_110_011_1(uniques, 4);
+  f_001_110_110_100_0(uniques, 4);
+  f_001_110_110_100_1(uniques, 4);
+  f_001_110_110_101_0(uniques, 4);
+  f_001_110_110_101_1(uniques, 4);
+  f_001_110_110_110_0(uniques, 4);
+  f_001_110_110_110_1(uniques, 4);
+  f_001_110_110_111_0(uniques, 4);
+  f_001_110_110_111_1(uniques, 4);
+  f_001_110_111_000_0(uniques, 4);
+  f_001_110_111_000_1(uniques, 4);
+  f_001_110_111_001_0(uniques, 4);
+  f_001_110_111_001_1(uniques, 4);
+  f_001_110_111_010_0(uniques, 4);
+  f_001_110_111_010_1(uniques, 4);
+  f_001_110_111_011_0(uniques, 4);
+  f_001_110_111_011_1(uniques, 4);
+  f_001_110_111_100_0(uniques, 4);
+  f_001_110_111_100_1(uniques, 4);
+  f_001_110_111_101_0(uniques, 4);
+  f_001_110_111_101_1(uniques, 4);
+  f_001_110_111_110_0(uniques, 4);
+  f_001_110_111_110_1(uniques, 4);
+  f_001_110_111_111_0(uniques, 4);
+  f_001_110_111_111_1(uniques, 4);
+  f_001_111_000_000_0(uniques, 4);
+  f_001_111_000_000_1(uniques, 4);
+  f_001_111_000_001_0(uniques, 4);
+  f_001_111_000_001_1(uniques, 4);
+  f_001_111_000_010_0(uniques, 4);
+  f_001_111_000_010_1(uniques, 4);
+  f_001_111_000_011_0(uniques, 4);
+  f_001_111_000_011_1(uniques, 4);
+  f_001_111_000_100_0(uniques, 4);
+  f_001_111_000_100_1(uniques, 4);
+  f_001_111_000_101_0(uniques, 4);
+  f_001_111_000_101_1(uniques, 4);
+  f_001_111_000_110_0(uniques, 4);
+  f_001_111_000_110_1(uniques, 4);
+  f_001_111_000_111_0(uniques, 4);
+  f_001_111_000_111_1(uniques, 4);
+  f_001_111_001_000_0(uniques, 4);
+  f_001_111_001_000_1(uniques, 4);
+  f_001_111_001_001_0(uniques, 4);
+  f_001_111_001_001_1(uniques, 4);
+  f_001_111_001_010_0(uniques, 4);
+  f_001_111_001_010_1(uniques, 4);
+  f_001_111_001_011_0(uniques, 4);
+  f_001_111_001_011_1(uniques, 4);
+  f_001_111_001_100_0(uniques, 4);
+  f_001_111_001_100_1(uniques, 4);
+  f_001_111_001_101_0(uniques, 4);
+  f_001_111_001_101_1(uniques, 4);
+  f_001_111_001_110_0(uniques, 4);
+  f_001_111_001_110_1(uniques, 4);
+  f_001_111_001_111_0(uniques, 4);
+  f_001_111_001_111_1(uniques, 4);
+  f_001_111_010_000_0(uniques, 4);
+  f_001_111_010_000_1(uniques, 4);
+  f_001_111_010_001_0(uniques, 4);
+  f_001_111_010_001_1(uniques, 4);
+  f_001_111_010_010_0(uniques, 4);
+  f_001_111_010_010_1(uniques, 4);
+  f_001_111_010_011_0(uniques, 4);
+  f_001_111_010_011_1(uniques, 4);
+  f_001_111_010_100_0(uniques, 4);
+  f_001_111_010_100_1(uniques, 4);
+  f_001_111_010_101_0(uniques, 4);
+  f_001_111_010_101_1(uniques, 4);
+  f_001_111_010_110_0(uniques, 4);
+  f_001_111_010_110_1(uniques, 4);
+  f_001_111_010_111_0(uniques, 4);
+  f_001_111_010_111_1(uniques, 4);
+  f_001_111_011_000_0(uniques, 4);
+  f_001_111_011_000_1(uniques, 4);
+  f_001_111_011_001_0(uniques, 4);
+  f_001_111_011_001_1(uniques, 4);
+  f_001_111_011_010_0(uniques, 4);
+  f_001_111_011_010_1(uniques, 4);
+  f_001_111_011_011_0(uniques, 4);
+  f_001_111_011_011_1(uniques, 4);
+  f_001_111_011_100_0(uniques, 4);
+  f_001_111_011_100_1(uniques, 4);
+  f_001_111_011_101_0(uniques, 4);
+  f_001_111_011_101_1(uniques, 4);
+  f_001_111_011_110_0(uniques, 4);
+  f_001_111_011_110_1(uniques, 4);
+  f_001_111_011_111_0(uniques, 4);
+  f_001_111_011_111_1(uniques, 4);
+  f_001_111_100_000_0(uniques, 4);
+  f_001_111_100_000_1(uniques, 4);
+  f_001_111_100_001_0(uniques, 4);
+  f_001_111_100_001_1(uniques, 4);
+  f_001_111_100_010_0(uniques, 4);
+  f_001_111_100_010_1(uniques, 4);
+  f_001_111_100_011_0(uniques, 4);
+  f_001_111_100_011_1(uniques, 4);
+  f_001_111_100_100_0(uniques, 4);
+  f_001_111_100_100_1(uniques, 4);
+  f_001_111_100_101_0(uniques, 4);
+  f_001_111_100_101_1(uniques, 4);
+  f_001_111_100_110_0(uniques, 4);
+  f_001_111_100_110_1(uniques, 4);
+  f_001_111_100_111_0(uniques, 4);
+  f_001_111_100_111_1(uniques, 4);
+  f_001_111_101_000_0(uniques, 4);
+  f_001_111_101_000_1(uniques, 4);
+  f_001_111_101_001_0(uniques, 4);
+  f_001_111_101_001_1(uniques, 4);
+  f_001_111_101_010_0(uniques, 4);
+  f_001_111_101_010_1(uniques, 4);
+  f_001_111_101_011_0(uniques, 4);
+  f_001_111_101_011_1(uniques, 4);
+  f_001_111_101_100_0(uniques, 4);
+  f_001_111_101_100_1(uniques, 4);
+  f_001_111_101_101_0(uniques, 4);
+  f_001_111_101_101_1(uniques, 4);
+  f_001_111_101_110_0(uniques, 4);
+  f_001_111_101_110_1(uniques, 4);
+  f_001_111_101_111_0(uniques, 4);
+  f_001_111_101_111_1(uniques, 4);
+  f_001_111_110_000_0(uniques, 4);
+  f_001_111_110_000_1(uniques, 4);
+  f_001_111_110_001_0(uniques, 4);
+  f_001_111_110_001_1(uniques, 4);
+  f_001_111_110_010_0(uniques, 4);
+  f_001_111_110_010_1(uniques, 4);
+  f_001_111_110_011_0(uniques, 4);
+  f_001_111_110_011_1(uniques, 4);
+  f_001_111_110_100_0(uniques, 4);
+  f_001_111_110_100_1(uniques, 4);
+  f_001_111_110_101_0(uniques, 4);
+  f_001_111_110_101_1(uniques, 4);
+  f_001_111_110_110_0(uniques, 4);
+  f_001_111_110_110_1(uniques, 4);
+  f_001_111_110_111_0(uniques, 4);
+  f_001_111_110_111_1(uniques, 4);
+  f_001_111_111_000_0(uniques, 4);
+  f_001_111_111_000_1(uniques, 4);
+  f_001_111_111_001_0(uniques, 4);
+  f_001_111_111_001_1(uniques, 4);
+  f_001_111_111_010_0(uniques, 4);
+  f_001_111_111_010_1(uniques, 4);
+  f_001_111_111_011_0(uniques, 4);
+  f_001_111_111_011_1(uniques, 4);
+  f_001_111_111_100_0(uniques, 4);
+  f_001_111_111_100_1(uniques, 4);
+  f_001_111_111_101_0(uniques, 4);
+  f_001_111_111_101_1(uniques, 4);
+  f_001_111_111_110_0(uniques, 4);
+  f_001_111_111_110_1(uniques, 4);
+  f_001_111_111_111_0(uniques, 4);
+  f_001_111_111_111_1(uniques, 4);
+  f_010_010_000_000_0(uniques, 4);
+  f_010_010_000_000_1(uniques, 4);
+  f_010_010_000_001_0(uniques, 4);
+  f_010_010_000_001_1(uniques, 4);
+  f_010_010_000_010_0(uniques, 4);
+  f_010_010_000_010_1(uniques, 4);
+  f_010_010_000_011_0(uniques, 4);
+  f_010_010_000_011_1(uniques, 4);
+  f_010_010_000_100_0(uniques, 4);
+  f_010_010_000_100_1(uniques, 4);
+  f_010_010_000_101_0(uniques, 4);
+  f_010_010_000_101_1(uniques, 4);
+  f_010_010_000_110_0(uniques, 4);
+  f_010_010_000_110_1(uniques, 4);
+  f_010_010_000_111_0(uniques, 4);
+  f_010_010_000_111_1(uniques, 4);
+  f_010_010_001_000_0(uniques, 4);
+  f_010_010_001_000_1(uniques, 4);
+  f_010_010_001_001_0(uniques, 4);
+  f_010_010_001_001_1(uniques, 4);
+  f_010_010_001_010_0(uniques, 4);
+  f_010_010_001_010_1(uniques, 4);
+  f_010_010_001_011_0(uniques, 4);
+  f_010_010_001_011_1(uniques, 4);
+  f_010_010_001_100_0(uniques, 4);
+  f_010_010_001_100_1(uniques, 4);
+  f_010_010_001_101_0(uniques, 4);
+  f_010_010_001_101_1(uniques, 4);
+  f_010_010_001_110_0(uniques, 4);
+  f_010_010_001_110_1(uniques, 4);
+  f_010_010_001_111_0(uniques, 4);
+  f_010_010_001_111_1(uniques, 4);
+  f_010_010_010_000_0(uniques, 4);
+  f_010_010_010_000_1(uniques, 4);
+  f_010_010_010_001_0(uniques, 4);
+  f_010_010_010_001_1(uniques, 4);
+  f_010_010_010_010_0(uniques, 4);
+  f_010_010_010_010_1(uniques, 4);
+  f_010_010_010_011_0(uniques, 4);
+  f_010_010_010_011_1(uniques, 4);
+  f_010_010_010_100_0(uniques, 4);
+  f_010_010_010_100_1(uniques, 4);
+  f_010_010_010_101_0(uniques, 4);
+  f_010_010_010_101_1(uniques, 4);
+  f_010_010_010_110_0(uniques, 4);
+  f_010_010_010_110_1(uniques, 4);
+  f_010_010_010_111_0(uniques, 4);
+  f_010_010_010_111_1(uniques, 4);
+  f_010_010_011_000_0(uniques, 4);
+  f_010_010_011_000_1(uniques, 4);
+  f_010_010_011_001_0(uniques, 4);
+  f_010_010_011_001_1(uniques, 4);
+  f_010_010_011_010_0(uniques, 4);
+  f_010_010_011_010_1(uniques, 4);
+  f_010_010_011_011_0(uniques, 4);
+  f_010_010_011_011_1(uniques, 4);
+  f_010_010_011_100_0(uniques, 4);
+  f_010_010_011_100_1(uniques, 4);
+  f_010_010_011_101_0(uniques, 4);
+  f_010_010_011_101_1(uniques, 4);
+  f_010_010_011_110_0(uniques, 4);
+  f_010_010_011_110_1(uniques, 4);
+  f_010_010_011_111_0(uniques, 4);
+  f_010_010_011_111_1(uniques, 4);
+  f_010_010_100_000_0(uniques, 4);
+  f_010_010_100_000_1(uniques, 4);
+  f_010_010_100_001_0(uniques, 4);
+  f_010_010_100_001_1(uniques, 4);
+  f_010_010_100_010_0(uniques, 4);
+  f_010_010_100_010_1(uniques, 4);
+  f_010_010_100_011_0(uniques, 4);
+  f_010_010_100_011_1(uniques, 4);
+  f_010_010_100_100_0(uniques, 4);
+  f_010_010_100_100_1(uniques, 4);
+  f_010_010_100_101_0(uniques, 4);
+  f_010_010_100_101_1(uniques, 4);
+  f_010_010_100_110_0(uniques, 4);
+  f_010_010_100_110_1(uniques, 4);
+  f_010_010_100_111_0(uniques, 4);
+  f_010_010_100_111_1(uniques, 4);
+  f_010_010_101_000_0(uniques, 4);
+  f_010_010_101_000_1(uniques, 4);
+  f_010_010_101_001_0(uniques, 4);
+  f_010_010_101_001_1(uniques, 4);
+  f_010_010_101_010_0(uniques, 4);
+  f_010_010_101_010_1(uniques, 4);
+  f_010_010_101_011_0(uniques, 4);
+  f_010_010_101_011_1(uniques, 4);
+  f_010_010_101_100_0(uniques, 4);
+  f_010_010_101_100_1(uniques, 4);
+  f_010_010_101_101_0(uniques, 4);
+  f_010_010_101_101_1(uniques, 4);
+  f_010_010_101_110_0(uniques, 4);
+  f_010_010_101_110_1(uniques, 4);
+  f_010_010_101_111_0(uniques, 4);
+  f_010_010_101_111_1(uniques, 4);
+  f_010_010_110_000_0(uniques, 4);
+  f_010_010_110_000_1(uniques, 4);
+  f_010_010_110_001_0(uniques, 4);
+  f_010_010_110_001_1(uniques, 4);
+  f_010_010_110_010_0(uniques, 4);
+  f_010_010_110_010_1(uniques, 4);
+  f_010_010_110_011_0(uniques, 4);
+  f_010_010_110_011_1(uniques, 4);
+  f_010_010_110_100_0(uniques, 4);
+  f_010_010_110_100_1(uniques, 4);
+  f_010_010_110_101_0(uniques, 4);
+  f_010_010_110_101_1(uniques, 4);
+  f_010_010_110_110_0(uniques, 4);
+  f_010_010_110_110_1(uniques, 4);
+  f_010_010_110_111_0(uniques, 4);
+  f_010_010_110_111_1(uniques, 4);
+  f_010_010_111_000_0(uniques, 4);
+  f_010_010_111_000_1(uniques, 4);
+  f_010_010_111_001_0(uniques, 4);
+  f_010_010_111_001_1(uniques, 4);
+  f_010_010_111_010_0(uniques, 4);
+  f_010_010_111_010_1(uniques, 4);
+  f_010_010_111_011_0(uniques, 4);
+  f_010_010_111_011_1(uniques, 4);
+  f_010_010_111_100_0(uniques, 4);
+  f_010_010_111_100_1(uniques, 4);
+  f_010_010_111_101_0(uniques, 4);
+  f_010_010_111_101_1(uniques, 4);
+  f_010_010_111_110_0(uniques, 4);
+  f_010_010_111_110_1(uniques, 4);
+  f_010_010_111_111_0(uniques, 4);
+  f_010_010_111_111_1(uniques, 4);
+  f_010_011_000_000_0(uniques, 4);
+  f_010_011_000_000_1(uniques, 4);
+  f_010_011_000_001_0(uniques, 4);
+  f_010_011_000_001_1(uniques, 4);
+  f_010_011_000_010_0(uniques, 4);
+  f_010_011_000_010_1(uniques, 4);
+  f_010_011_000_011_0(uniques, 4);
+  f_010_011_000_011_1(uniques, 4);
+  f_010_011_000_100_0(uniques, 4);
+  f_010_011_000_100_1(uniques, 4);
+  f_010_011_000_101_0(uniques, 4);
+  f_010_011_000_101_1(uniques, 4);
+  f_010_011_000_110_0(uniques, 4);
+  f_010_011_000_110_1(uniques, 4);
+  f_010_011_000_111_0(uniques, 4);
+  f_010_011_000_111_1(uniques, 4);
+  f_010_011_001_000_0(uniques, 4);
+  f_010_011_001_000_1(uniques, 4);
+  f_010_011_001_001_0(uniques, 4);
+  f_010_011_001_001_1(uniques, 4);
+  f_010_011_001_010_0(uniques, 4);
+  f_010_011_001_010_1(uniques, 4);
+  f_010_011_001_011_0(uniques, 4);
+  f_010_011_001_011_1(uniques, 4);
+  f_010_011_001_100_0(uniques, 4);
+  f_010_011_001_100_1(uniques, 4);
+  f_010_011_001_101_0(uniques, 4);
+  f_010_011_001_101_1(uniques, 4);
+  f_010_011_001_110_0(uniques, 4);
+  f_010_011_001_110_1(uniques, 4);
+  f_010_011_001_111_0(uniques, 4);
+  f_010_011_001_111_1(uniques, 4);
+  f_010_011_010_000_0(uniques, 4);
+  f_010_011_010_000_1(uniques, 4);
+  f_010_011_010_001_0(uniques, 4);
+  f_010_011_010_001_1(uniques, 4);
+  f_010_011_010_010_0(uniques, 4);
+  f_010_011_010_010_1(uniques, 4);
+  f_010_011_010_011_0(uniques, 4);
+  f_010_011_010_011_1(uniques, 4);
+  f_010_011_010_100_0(uniques, 4);
+  f_010_011_010_100_1(uniques, 4);
+  f_010_011_010_101_0(uniques, 4);
+  f_010_011_010_101_1(uniques, 4);
+  f_010_011_010_110_0(uniques, 4);
+  f_010_011_010_110_1(uniques, 4);
+  f_010_011_010_111_0(uniques, 4);
+  f_010_011_010_111_1(uniques, 4);
+  f_010_011_011_000_0(uniques, 4);
+  f_010_011_011_000_1(uniques, 4);
+  f_010_011_011_001_0(uniques, 4);
+  f_010_011_011_001_1(uniques, 4);
+  f_010_011_011_010_0(uniques, 4);
+  f_010_011_011_010_1(uniques, 4);
+  f_010_011_011_011_0(uniques, 4);
+  f_010_011_011_011_1(uniques, 4);
+  f_010_011_011_100_0(uniques, 4);
+  f_010_011_011_100_1(uniques, 4);
+  f_010_011_011_101_0(uniques, 4);
+  f_010_011_011_101_1(uniques, 4);
+  f_010_011_011_110_0(uniques, 4);
+  f_010_011_011_110_1(uniques, 4);
+  f_010_011_011_111_0(uniques, 4);
+  f_010_011_011_111_1(uniques, 4);
+  f_010_011_100_000_0(uniques, 4);
+  f_010_011_100_000_1(uniques, 4);
+  f_010_011_100_001_0(uniques, 4);
+  f_010_011_100_001_1(uniques, 4);
+  f_010_011_100_010_0(uniques, 4);
+  f_010_011_100_010_1(uniques, 4);
+  f_010_011_100_011_0(uniques, 4);
+  f_010_011_100_011_1(uniques, 4);
+  f_010_011_100_100_0(uniques, 4);
+  f_010_011_100_100_1(uniques, 4);
+  f_010_011_100_101_0(uniques, 4);
+  f_010_011_100_101_1(uniques, 4);
+  f_010_011_100_110_0(uniques, 4);
+  f_010_011_100_110_1(uniques, 4);
+  f_010_011_100_111_0(uniques, 4);
+  f_010_011_100_111_1(uniques, 4);
+  f_010_011_101_000_0(uniques, 4);
+  f_010_011_101_000_1(uniques, 4);
+  f_010_011_101_001_0(uniques, 4);
+  f_010_011_101_001_1(uniques, 4);
+  f_010_011_101_010_0(uniques, 4);
+  f_010_011_101_010_1(uniques, 4);
+  f_010_011_101_011_0(uniques, 4);
+  f_010_011_101_011_1(uniques, 4);
+  f_010_011_101_100_0(uniques, 4);
+  f_010_011_101_100_1(uniques, 4);
+  f_010_011_101_101_0(uniques, 4);
+  f_010_011_101_101_1(uniques, 4);
+  f_010_011_101_110_0(uniques, 4);
+  f_010_011_101_110_1(uniques, 4);
+  f_010_011_101_111_0(uniques, 4);
+  f_010_011_101_111_1(uniques, 4);
+  f_010_011_110_000_0(uniques, 4);
+  f_010_011_110_000_1(uniques, 4);
+  f_010_011_110_001_0(uniques, 4);
+  f_010_011_110_001_1(uniques, 4);
+  f_010_011_110_010_0(uniques, 4);
+  f_010_011_110_010_1(uniques, 4);
+  f_010_011_110_011_0(uniques, 4);
+  f_010_011_110_011_1(uniques, 4);
+  f_010_011_110_100_0(uniques, 4);
+  f_010_011_110_100_1(uniques, 4);
+  f_010_011_110_101_0(uniques, 4);
+  f_010_011_110_101_1(uniques, 4);
+  f_010_011_110_110_0(uniques, 4);
+  f_010_011_110_110_1(uniques, 4);
+  f_010_011_110_111_0(uniques, 4);
+  f_010_011_110_111_1(uniques, 4);
+  f_010_011_111_000_0(uniques, 4);
+  f_010_011_111_000_1(uniques, 4);
+  f_010_011_111_001_0(uniques, 4);
+  f_010_011_111_001_1(uniques, 4);
+  f_010_011_111_010_0(uniques, 4);
+  f_010_011_111_010_1(uniques, 4);
+  f_010_011_111_011_0(uniques, 4);
+  f_010_011_111_011_1(uniques, 4);
+  f_010_011_111_100_0(uniques, 4);
+  f_010_011_111_100_1(uniques, 4);
+  f_010_011_111_101_0(uniques, 4);
+  f_010_011_111_101_1(uniques, 4);
+  f_010_011_111_110_0(uniques, 4);
+  f_010_011_111_110_1(uniques, 4);
+  f_010_011_111_111_0(uniques, 4);
+  f_010_011_111_111_1(uniques, 4);
+  f_010_110_000_000_0(uniques, 4);
+  f_010_110_000_000_1(uniques, 4);
+  f_010_110_000_001_0(uniques, 4);
+  f_010_110_000_001_1(uniques, 4);
+  f_010_110_000_010_0(uniques, 4);
+  f_010_110_000_010_1(uniques, 4);
+  f_010_110_000_011_0(uniques, 4);
+  f_010_110_000_011_1(uniques, 4);
+  f_010_110_000_100_0(uniques, 4);
+  f_010_110_000_100_1(uniques, 4);
+  f_010_110_000_101_0(uniques, 4);
+  f_010_110_000_101_1(uniques, 4);
+  f_010_110_000_110_0(uniques, 4);
+  f_010_110_000_110_1(uniques, 4);
+  f_010_110_000_111_0(uniques, 4);
+  f_010_110_000_111_1(uniques, 4);
+  f_010_110_001_000_0(uniques, 4);
+  f_010_110_001_000_1(uniques, 4);
+  f_010_110_001_001_0(uniques, 4);
+  f_010_110_001_001_1(uniques, 4);
+  f_010_110_001_010_0(uniques, 4);
+  f_010_110_001_010_1(uniques, 4);
+  f_010_110_001_011_0(uniques, 4);
+  f_010_110_001_011_1(uniques, 4);
+  f_010_110_001_100_0(uniques, 4);
+  f_010_110_001_100_1(uniques, 4);
+  f_010_110_001_101_0(uniques, 4);
+  f_010_110_001_101_1(uniques, 4);
+  f_010_110_001_110_0(uniques, 4);
+  f_010_110_001_110_1(uniques, 4);
+  f_010_110_001_111_0(uniques, 4);
+  f_010_110_001_111_1(uniques, 4);
+  f_010_110_010_000_0(uniques, 4);
+  f_010_110_010_000_1(uniques, 4);
+  f_010_110_010_001_0(uniques, 4);
+  f_010_110_010_001_1(uniques, 4);
+  f_010_110_010_010_0(uniques, 4);
+  f_010_110_010_010_1(uniques, 4);
+  f_010_110_010_011_0(uniques, 4);
+  f_010_110_010_011_1(uniques, 4);
+  f_010_110_010_100_0(uniques, 4);
+  f_010_110_010_100_1(uniques, 4);
+  f_010_110_010_101_0(uniques, 4);
+  f_010_110_010_101_1(uniques, 4);
+  f_010_110_010_110_0(uniques, 4);
+  f_010_110_010_110_1(uniques, 4);
+  f_010_110_010_111_0(uniques, 4);
+  f_010_110_010_111_1(uniques, 4);
+  f_010_110_011_000_0(uniques, 4);
+  f_010_110_011_000_1(uniques, 4);
+  f_010_110_011_001_0(uniques, 4);
+  f_010_110_011_001_1(uniques, 4);
+  f_010_110_011_010_0(uniques, 4);
+  f_010_110_011_010_1(uniques, 4);
+  f_010_110_011_011_0(uniques, 4);
+  f_010_110_011_011_1(uniques, 4);
+  f_010_110_011_100_0(uniques, 4);
+  f_010_110_011_100_1(uniques, 4);
+  f_010_110_011_101_0(uniques, 4);
+  f_010_110_011_101_1(uniques, 4);
+  f_010_110_011_110_0(uniques, 4);
+  f_010_110_011_110_1(uniques, 4);
+  f_010_110_011_111_0(uniques, 4);
+  f_010_110_011_111_1(uniques, 4);
+  f_010_110_100_000_0(uniques, 4);
+  f_010_110_100_000_1(uniques, 4);
+  f_010_110_100_001_0(uniques, 4);
+  f_010_110_100_001_1(uniques, 4);
+  f_010_110_100_010_0(uniques, 4);
+  f_010_110_100_010_1(uniques, 4);
+  f_010_110_100_011_0(uniques, 4);
+  f_010_110_100_011_1(uniques, 4);
+  f_010_110_100_100_0(uniques, 4);
+  f_010_110_100_100_1(uniques, 4);
+  f_010_110_100_101_0(uniques, 4);
+  f_010_110_100_101_1(uniques, 4);
+  f_010_110_100_110_0(uniques, 4);
+  f_010_110_100_110_1(uniques, 4);
+  f_010_110_100_111_0(uniques, 4);
+  f_010_110_100_111_1(uniques, 4);
+  f_010_110_101_000_0(uniques, 4);
+  f_010_110_101_000_1(uniques, 4);
+  f_010_110_101_001_0(uniques, 4);
+  f_010_110_101_001_1(uniques, 4);
+  f_010_110_101_010_0(uniques, 4);
+  f_010_110_101_010_1(uniques, 4);
+  f_010_110_101_011_0(uniques, 4);
+  f_010_110_101_011_1(uniques, 4);
+  f_010_110_101_100_0(uniques, 4);
+  f_010_110_101_100_1(uniques, 4);
+  f_010_110_101_101_0(uniques, 4);
+  f_010_110_101_101_1(uniques, 4);
+  f_010_110_101_110_0(uniques, 4);
+  f_010_110_101_110_1(uniques, 4);
+  f_010_110_101_111_0(uniques, 4);
+  f_010_110_101_111_1(uniques, 4);
+  f_010_110_110_000_0(uniques, 4);
+  f_010_110_110_000_1(uniques, 4);
+  f_010_110_110_001_0(uniques, 4);
+  f_010_110_110_001_1(uniques, 4);
+  f_010_110_110_010_0(uniques, 4);
+  f_010_110_110_010_1(uniques, 4);
+  f_010_110_110_011_0(uniques, 4);
+  f_010_110_110_011_1(uniques, 4);
+  f_010_110_110_100_0(uniques, 4);
+  f_010_110_110_100_1(uniques, 4);
+  f_010_110_110_101_0(uniques, 4);
+  f_010_110_110_101_1(uniques, 4);
+  f_010_110_110_110_0(uniques, 4);
+  f_010_110_110_110_1(uniques, 4);
+  f_010_110_110_111_0(uniques, 4);
+  f_010_110_110_111_1(uniques, 4);
+  f_010_110_111_000_0(uniques, 4);
+  f_010_110_111_000_1(uniques, 4);
+  f_010_110_111_001_0(uniques, 4);
+  f_010_110_111_001_1(uniques, 4);
+  f_010_110_111_010_0(uniques, 4);
+  f_010_110_111_010_1(uniques, 4);
+  f_010_110_111_011_0(uniques, 4);
+  f_010_110_111_011_1(uniques, 4);
+  f_010_110_111_100_0(uniques, 4);
+  f_010_110_111_100_1(uniques, 4);
+  f_010_110_111_101_0(uniques, 4);
+  f_010_110_111_101_1(uniques, 4);
+  f_010_110_111_110_0(uniques, 4);
+  f_010_110_111_110_1(uniques, 4);
+  f_010_110_111_111_0(uniques, 4);
+  f_010_110_111_111_1(uniques, 4);
+  f_010_111_000_000_0(uniques, 4);
+  f_010_111_000_000_1(uniques, 4);
+  f_010_111_000_001_0(uniques, 4);
+  f_010_111_000_001_1(uniques, 4);
+  f_010_111_000_010_0(uniques, 4);
+  f_010_111_000_010_1(uniques, 4);
+  f_010_111_000_011_0(uniques, 4);
+  f_010_111_000_011_1(uniques, 4);
+  f_010_111_000_100_0(uniques, 4);
+  f_010_111_000_100_1(uniques, 4);
+  f_010_111_000_101_0(uniques, 4);
+  f_010_111_000_101_1(uniques, 4);
+  f_010_111_000_110_0(uniques, 4);
+  f_010_111_000_110_1(uniques, 4);
+  f_010_111_000_111_0(uniques, 4);
+  f_010_111_000_111_1(uniques, 4);
+  f_010_111_001_000_0(uniques, 4);
+  f_010_111_001_000_1(uniques, 4);
+  f_010_111_001_001_0(uniques, 4);
+  f_010_111_001_001_1(uniques, 4);
+  f_010_111_001_010_0(uniques, 4);
+  f_010_111_001_010_1(uniques, 4);
+  f_010_111_001_011_0(uniques, 4);
+  f_010_111_001_011_1(uniques, 4);
+  f_010_111_001_100_0(uniques, 4);
+  f_010_111_001_100_1(uniques, 4);
+  f_010_111_001_101_0(uniques, 4);
+  f_010_111_001_101_1(uniques, 4);
+  f_010_111_001_110_0(uniques, 4);
+  f_010_111_001_110_1(uniques, 4);
+  f_010_111_001_111_0(uniques, 4);
+  f_010_111_001_111_1(uniques, 4);
+  f_010_111_010_000_0(uniques, 4);
+  f_010_111_010_000_1(uniques, 4);
+  f_010_111_010_001_0(uniques, 4);
+  f_010_111_010_001_1(uniques, 4);
+  f_010_111_010_010_0(uniques, 4);
+  f_010_111_010_010_1(uniques, 4);
+  f_010_111_010_011_0(uniques, 4);
+  f_010_111_010_011_1(uniques, 4);
+  f_010_111_010_100_0(uniques, 4);
+  f_010_111_010_100_1(uniques, 4);
+  f_010_111_010_101_0(uniques, 4);
+  f_010_111_010_101_1(uniques, 4);
+  f_010_111_010_110_0(uniques, 4);
+  f_010_111_010_110_1(uniques, 4);
+  f_010_111_010_111_0(uniques, 4);
+  f_010_111_010_111_1(uniques, 4);
+  f_010_111_011_000_0(uniques, 4);
+  f_010_111_011_000_1(uniques, 4);
+  f_010_111_011_001_0(uniques, 4);
+  f_010_111_011_001_1(uniques, 4);
+  f_010_111_011_010_0(uniques, 4);
+  f_010_111_011_010_1(uniques, 4);
+  f_010_111_011_011_0(uniques, 4);
+  f_010_111_011_011_1(uniques, 4);
+  f_010_111_011_100_0(uniques, 4);
+  f_010_111_011_100_1(uniques, 4);
+  f_010_111_011_101_0(uniques, 4);
+  f_010_111_011_101_1(uniques, 4);
+  f_010_111_011_110_0(uniques, 4);
+  f_010_111_011_110_1(uniques, 4);
+  f_010_111_011_111_0(uniques, 4);
+  f_010_111_011_111_1(uniques, 4);
+  f_010_111_100_000_0(uniques, 4);
+  f_010_111_100_000_1(uniques, 4);
+  f_010_111_100_001_0(uniques, 4);
+  f_010_111_100_001_1(uniques, 4);
+  f_010_111_100_010_0(uniques, 4);
+  f_010_111_100_010_1(uniques, 4);
+  f_010_111_100_011_0(uniques, 4);
+  f_010_111_100_011_1(uniques, 4);
+  f_010_111_100_100_0(uniques, 4);
+  f_010_111_100_100_1(uniques, 4);
+  f_010_111_100_101_0(uniques, 4);
+  f_010_111_100_101_1(uniques, 4);
+  f_010_111_100_110_0(uniques, 4);
+  f_010_111_100_110_1(uniques, 4);
+  f_010_111_100_111_0(uniques, 4);
+  f_010_111_100_111_1(uniques, 4);
+  f_010_111_101_000_0(uniques, 4);
+  f_010_111_101_000_1(uniques, 4);
+  f_010_111_101_001_0(uniques, 4);
+  f_010_111_101_001_1(uniques, 4);
+  f_010_111_101_010_0(uniques, 4);
+  f_010_111_101_010_1(uniques, 4);
+  f_010_111_101_011_0(uniques, 4);
+  f_010_111_101_011_1(uniques, 4);
+  f_010_111_101_100_0(uniques, 4);
+  f_010_111_101_100_1(uniques, 4);
+  f_010_111_101_101_0(uniques, 4);
+  f_010_111_101_101_1(uniques, 4);
+  f_010_111_101_110_0(uniques, 4);
+  f_010_111_101_110_1(uniques, 4);
+  f_010_111_101_111_0(uniques, 4);
+  f_010_111_101_111_1(uniques, 4);
+  f_010_111_110_000_0(uniques, 4);
+  f_010_111_110_000_1(uniques, 4);
+  f_010_111_110_001_0(uniques, 4);
+  f_010_111_110_001_1(uniques, 4);
+  f_010_111_110_010_0(uniques, 4);
+  f_010_111_110_010_1(uniques, 4);
+  f_010_111_110_011_0(uniques, 4);
+  f_010_111_110_011_1(uniques, 4);
+  f_010_111_110_100_0(uniques, 4);
+  f_010_111_110_100_1(uniques, 4);
+  f_010_111_110_101_0(uniques, 4);
+  f_010_111_110_101_1(uniques, 4);
+  f_010_111_110_110_0(uniques, 4);
+  f_010_111_110_110_1(uniques, 4);
+  f_010_111_110_111_0(uniques, 4);
+  f_010_111_110_111_1(uniques, 4);
+  f_010_111_111_000_0(uniques, 4);
+  f_010_111_111_000_1(uniques, 4);
+  f_010_111_111_001_0(uniques, 4);
+  f_010_111_111_001_1(uniques, 4);
+  f_010_111_111_010_0(uniques, 4);
+  f_010_111_111_010_1(uniques, 4);
+  f_010_111_111_011_0(uniques, 4);
+  f_010_111_111_011_1(uniques, 4);
+  f_010_111_111_100_0(uniques, 4);
+  f_010_111_111_100_1(uniques, 4);
+  f_010_111_111_101_0(uniques, 4);
+  f_010_111_111_101_1(uniques, 4);
+  f_010_111_111_110_0(uniques, 4);
+  f_010_111_111_110_1(uniques, 4);
+  f_010_111_111_111_0(uniques, 4);
+  f_010_111_111_111_1(uniques, 4);
+  f_011_010_000_000_0(uniques, 4);
+  f_011_010_000_000_1(uniques, 4);
+  f_011_010_000_001_0(uniques, 4);
+  f_011_010_000_001_1(uniques, 4);
+  f_011_010_000_010_0(uniques, 4);
+  f_011_010_000_010_1(uniques, 4);
+  f_011_010_000_011_0(uniques, 4);
+  f_011_010_000_011_1(uniques, 4);
+  f_011_010_000_100_0(uniques, 4);
+  f_011_010_000_100_1(uniques, 4);
+  f_011_010_000_101_0(uniques, 4);
+  f_011_010_000_101_1(uniques, 4);
+  f_011_010_000_110_0(uniques, 4);
+  f_011_010_000_110_1(uniques, 4);
+  f_011_010_000_111_0(uniques, 4);
+  f_011_010_000_111_1(uniques, 4);
+  f_011_010_001_000_0(uniques, 4);
+  f_011_010_001_000_1(uniques, 4);
+  f_011_010_001_001_0(uniques, 4);
+  f_011_010_001_001_1(uniques, 4);
+  f_011_010_001_010_0(uniques, 4);
+  f_011_010_001_010_1(uniques, 4);
+  f_011_010_001_011_0(uniques, 4);
+  f_011_010_001_011_1(uniques, 4);
+  f_011_010_001_100_0(uniques, 4);
+  f_011_010_001_100_1(uniques, 4);
+  f_011_010_001_101_0(uniques, 4);
+  f_011_010_001_101_1(uniques, 4);
+  f_011_010_001_110_0(uniques, 4);
+  f_011_010_001_110_1(uniques, 4);
+  f_011_010_001_111_0(uniques, 4);
+  f_011_010_001_111_1(uniques, 4);
+  f_011_010_010_000_0(uniques, 4);
+  f_011_010_010_000_1(uniques, 4);
+  f_011_010_010_001_0(uniques, 4);
+  f_011_010_010_001_1(uniques, 4);
+  f_011_010_010_010_0(uniques, 4);
+  f_011_010_010_010_1(uniques, 4);
+  f_011_010_010_011_0(uniques, 4);
+  f_011_010_010_011_1(uniques, 4);
+  f_011_010_010_100_0(uniques, 4);
+  f_011_010_010_100_1(uniques, 4);
+  f_011_010_010_101_0(uniques, 4);
+  f_011_010_010_101_1(uniques, 4);
+  f_011_010_010_110_0(uniques, 4);
+  f_011_010_010_110_1(uniques, 4);
+  f_011_010_010_111_0(uniques, 4);
+  f_011_010_010_111_1(uniques, 4);
+  f_011_010_011_000_0(uniques, 4);
+  f_011_010_011_000_1(uniques, 4);
+  f_011_010_011_001_0(uniques, 4);
+  f_011_010_011_001_1(uniques, 4);
+  f_011_010_011_010_0(uniques, 4);
+  f_011_010_011_010_1(uniques, 4);
+  f_011_010_011_011_0(uniques, 4);
+  f_011_010_011_011_1(uniques, 4);
+  f_011_010_011_100_0(uniques, 4);
+  f_011_010_011_100_1(uniques, 4);
+  f_011_010_011_101_0(uniques, 4);
+  f_011_010_011_101_1(uniques, 4);
+  f_011_010_011_110_0(uniques, 4);
+  f_011_010_011_110_1(uniques, 4);
+  f_011_010_011_111_0(uniques, 4);
+  f_011_010_011_111_1(uniques, 4);
+  f_011_010_100_000_0(uniques, 4);
+  f_011_010_100_000_1(uniques, 4);
+  f_011_010_100_001_0(uniques, 4);
+  f_011_010_100_001_1(uniques, 4);
+  f_011_010_100_010_0(uniques, 4);
+  f_011_010_100_010_1(uniques, 4);
+  f_011_010_100_011_0(uniques, 4);
+  f_011_010_100_011_1(uniques, 4);
+  f_011_010_100_100_0(uniques, 4);
+  f_011_010_100_100_1(uniques, 4);
+  f_011_010_100_101_0(uniques, 4);
+  f_011_010_100_101_1(uniques, 4);
+  f_011_010_100_110_0(uniques, 4);
+  f_011_010_100_110_1(uniques, 4);
+  f_011_010_100_111_0(uniques, 4);
+  f_011_010_100_111_1(uniques, 4);
+  f_011_010_101_000_0(uniques, 4);
+  f_011_010_101_000_1(uniques, 4);
+  f_011_010_101_001_0(uniques, 4);
+  f_011_010_101_001_1(uniques, 4);
+  f_011_010_101_010_0(uniques, 4);
+  f_011_010_101_010_1(uniques, 4);
+  f_011_010_101_011_0(uniques, 4);
+  f_011_010_101_011_1(uniques, 4);
+  f_011_010_101_100_0(uniques, 4);
+  f_011_010_101_100_1(uniques, 4);
+  f_011_010_101_101_0(uniques, 4);
+  f_011_010_101_101_1(uniques, 4);
+  f_011_010_101_110_0(uniques, 4);
+  f_011_010_101_110_1(uniques, 4);
+  f_011_010_101_111_0(uniques, 4);
+  f_011_010_101_111_1(uniques, 4);
+  f_011_010_110_000_0(uniques, 4);
+  f_011_010_110_000_1(uniques, 4);
+  f_011_010_110_001_0(uniques, 4);
+  f_011_010_110_001_1(uniques, 4);
+  f_011_010_110_010_0(uniques, 4);
+  f_011_010_110_010_1(uniques, 4);
+  f_011_010_110_011_0(uniques, 4);
+  f_011_010_110_011_1(uniques, 4);
+  f_011_010_110_100_0(uniques, 4);
+  f_011_010_110_100_1(uniques, 4);
+  f_011_010_110_101_0(uniques, 4);
+  f_011_010_110_101_1(uniques, 4);
+  f_011_010_110_110_0(uniques, 4);
+  f_011_010_110_110_1(uniques, 4);
+  f_011_010_110_111_0(uniques, 4);
+  f_011_010_110_111_1(uniques, 4);
+  f_011_010_111_000_0(uniques, 4);
+  f_011_010_111_000_1(uniques, 4);
+  f_011_010_111_001_0(uniques, 4);
+  f_011_010_111_001_1(uniques, 4);
+  f_011_010_111_010_0(uniques, 4);
+  f_011_010_111_010_1(uniques, 4);
+  f_011_010_111_011_0(uniques, 4);
+  f_011_010_111_011_1(uniques, 4);
+  f_011_010_111_100_0(uniques, 4);
+  f_011_010_111_100_1(uniques, 4);
+  f_011_010_111_101_0(uniques, 4);
+  f_011_010_111_101_1(uniques, 4);
+  f_011_010_111_110_0(uniques, 4);
+  f_011_010_111_110_1(uniques, 4);
+  f_011_010_111_111_0(uniques, 4);
+  f_011_010_111_111_1(uniques, 4);
+  f_011_011_000_000_0(uniques, 4);
+  f_011_011_000_000_1(uniques, 4);
+  f_011_011_000_001_0(uniques, 4);
+  f_011_011_000_001_1(uniques, 4);
+  f_011_011_000_010_0(uniques, 4);
+  f_011_011_000_010_1(uniques, 4);
+  f_011_011_000_011_0(uniques, 4);
+  f_011_011_000_011_1(uniques, 4);
+  f_011_011_000_100_0(uniques, 4);
+  f_011_011_000_100_1(uniques, 4);
+  f_011_011_000_101_0(uniques, 4);
+  f_011_011_000_101_1(uniques, 4);
+  f_011_011_000_110_0(uniques, 4);
+  f_011_011_000_110_1(uniques, 4);
+  f_011_011_000_111_0(uniques, 4);
+  f_011_011_000_111_1(uniques, 4);
+  f_011_011_001_000_0(uniques, 4);
+  f_011_011_001_000_1(uniques, 4);
+  f_011_011_001_001_0(uniques, 4);
+  f_011_011_001_001_1(uniques, 4);
+  f_011_011_001_010_0(uniques, 4);
+  f_011_011_001_010_1(uniques, 4);
+  f_011_011_001_011_0(uniques, 4);
+  f_011_011_001_011_1(uniques, 4);
+  f_011_011_001_100_0(uniques, 4);
+  f_011_011_001_100_1(uniques, 4);
+  f_011_011_001_101_0(uniques, 4);
+  f_011_011_001_101_1(uniques, 4);
+  f_011_011_001_110_0(uniques, 4);
+  f_011_011_001_110_1(uniques, 4);
+  f_011_011_001_111_0(uniques, 4);
+  f_011_011_001_111_1(uniques, 4);
+  f_011_011_010_000_0(uniques, 4);
+  f_011_011_010_000_1(uniques, 4);
+  f_011_011_010_001_0(uniques, 4);
+  f_011_011_010_001_1(uniques, 4);
+  f_011_011_010_010_0(uniques, 4);
+  f_011_011_010_010_1(uniques, 4);
+  f_011_011_010_011_0(uniques, 4);
+  f_011_011_010_011_1(uniques, 4);
+  f_011_011_010_100_0(uniques, 4);
+  f_011_011_010_100_1(uniques, 4);
+  f_011_011_010_101_0(uniques, 4);
+  f_011_011_010_101_1(uniques, 4);
+  f_011_011_010_110_0(uniques, 4);
+  f_011_011_010_110_1(uniques, 4);
+  f_011_011_010_111_0(uniques, 4);
+  f_011_011_010_111_1(uniques, 4);
+  f_011_011_011_000_0(uniques, 4);
+  f_011_011_011_000_1(uniques, 4);
+  f_011_011_011_001_0(uniques, 4);
+  f_011_011_011_001_1(uniques, 4);
+  f_011_011_011_010_0(uniques, 4);
+  f_011_011_011_010_1(uniques, 4);
+  f_011_011_011_011_0(uniques, 4);
+  f_011_011_011_011_1(uniques, 4);
+  f_011_011_011_100_0(uniques, 4);
+  f_011_011_011_100_1(uniques, 4);
+  f_011_011_011_101_0(uniques, 4);
+  f_011_011_011_101_1(uniques, 4);
+  f_011_011_011_110_0(uniques, 4);
+  f_011_011_011_110_1(uniques, 4);
+  f_011_011_011_111_0(uniques, 4);
+  f_011_011_011_111_1(uniques, 4);
+  f_011_011_100_000_0(uniques, 4);
+  f_011_011_100_000_1(uniques, 4);
+  f_011_011_100_001_0(uniques, 4);
+  f_011_011_100_001_1(uniques, 4);
+  f_011_011_100_010_0(uniques, 4);
+  f_011_011_100_010_1(uniques, 4);
+  f_011_011_100_011_0(uniques, 4);
+  f_011_011_100_011_1(uniques, 4);
+  f_011_011_100_100_0(uniques, 4);
+  f_011_011_100_100_1(uniques, 4);
+  f_011_011_100_101_0(uniques, 4);
+  f_011_011_100_101_1(uniques, 4);
+  f_011_011_100_110_0(uniques, 4);
+  f_011_011_100_110_1(uniques, 4);
+  f_011_011_100_111_0(uniques, 4);
+  f_011_011_100_111_1(uniques, 4);
+  f_011_011_101_000_0(uniques, 4);
+  f_011_011_101_000_1(uniques, 4);
+  f_011_011_101_001_0(uniques, 4);
+  f_011_011_101_001_1(uniques, 4);
+  f_011_011_101_010_0(uniques, 4);
+  f_011_011_101_010_1(uniques, 4);
+  f_011_011_101_011_0(uniques, 4);
+  f_011_011_101_011_1(uniques, 4);
+  f_011_011_101_100_0(uniques, 4);
+  f_011_011_101_100_1(uniques, 4);
+  f_011_011_101_101_0(uniques, 4);
+  f_011_011_101_101_1(uniques, 4);
+  f_011_011_101_110_0(uniques, 4);
+  f_011_011_101_110_1(uniques, 4);
+  f_011_011_101_111_0(uniques, 4);
+  f_011_011_101_111_1(uniques, 4);
+  f_011_011_110_000_0(uniques, 4);
+  f_011_011_110_000_1(uniques, 4);
+  f_011_011_110_001_0(uniques, 4);
+  f_011_011_110_001_1(uniques, 4);
+  f_011_011_110_010_0(uniques, 4);
+  f_011_011_110_010_1(uniques, 4);
+  f_011_011_110_011_0(uniques, 4);
+  f_011_011_110_011_1(uniques, 4);
+  f_011_011_110_100_0(uniques, 4);
+  f_011_011_110_100_1(uniques, 4);
+  f_011_011_110_101_0(uniques, 4);
+  f_011_011_110_101_1(uniques, 4);
+  f_011_011_110_110_0(uniques, 4);
+  f_011_011_110_110_1(uniques, 4);
+  f_011_011_110_111_0(uniques, 4);
+  f_011_011_110_111_1(uniques, 4);
+  f_011_011_111_000_0(uniques, 4);
+  f_011_011_111_000_1(uniques, 4);
+  f_011_011_111_001_0(uniques, 4);
+  f_011_011_111_001_1(uniques, 4);
+  f_011_011_111_010_0(uniques, 4);
+  f_011_011_111_010_1(uniques, 4);
+  f_011_011_111_011_0(uniques, 4);
+  f_011_011_111_011_1(uniques, 4);
+  f_011_011_111_100_0(uniques, 4);
+  f_011_011_111_100_1(uniques, 4);
+  f_011_011_111_101_0(uniques, 4);
+  f_011_011_111_101_1(uniques, 4);
+  f_011_011_111_110_0(uniques, 4);
+  f_011_011_111_110_1(uniques, 4);
+  f_011_011_111_111_0(uniques, 4);
+  f_011_011_111_111_1(uniques, 4);
+  f_011_110_000_000_0(uniques, 4);
+  f_011_110_000_000_1(uniques, 4);
+  f_011_110_000_001_0(uniques, 4);
+  f_011_110_000_001_1(uniques, 4);
+  f_011_110_000_010_0(uniques, 4);
+  f_011_110_000_010_1(uniques, 4);
+  f_011_110_000_011_0(uniques, 4);
+  f_011_110_000_011_1(uniques, 4);
+  f_011_110_000_100_0(uniques, 4);
+  f_011_110_000_100_1(uniques, 4);
+  f_011_110_000_101_0(uniques, 4);
+  f_011_110_000_101_1(uniques, 4);
+  f_011_110_000_110_0(uniques, 4);
+  f_011_110_000_110_1(uniques, 4);
+  f_011_110_000_111_0(uniques, 4);
+  f_011_110_000_111_1(uniques, 4);
+  f_011_110_001_000_0(uniques, 4);
+  f_011_110_001_000_1(uniques, 4);
+  f_011_110_001_001_0(uniques, 4);
+  f_011_110_001_001_1(uniques, 4);
+  f_011_110_001_010_0(uniques, 4);
+  f_011_110_001_010_1(uniques, 4);
+  f_011_110_001_011_0(uniques, 4);
+  f_011_110_001_011_1(uniques, 4);
+  f_011_110_001_100_0(uniques, 4);
+  f_011_110_001_100_1(uniques, 4);
+  f_011_110_001_101_0(uniques, 4);
+  f_011_110_001_101_1(uniques, 4);
+  f_011_110_001_110_0(uniques, 4);
+  f_011_110_001_110_1(uniques, 4);
+  f_011_110_001_111_0(uniques, 4);
+  f_011_110_001_111_1(uniques, 4);
+  f_011_110_010_000_0(uniques, 4);
+  f_011_110_010_000_1(uniques, 4);
+  f_011_110_010_001_0(uniques, 4);
+  f_011_110_010_001_1(uniques, 4);
+  f_011_110_010_010_0(uniques, 4);
+  f_011_110_010_010_1(uniques, 4);
+  f_011_110_010_011_0(uniques, 4);
+  f_011_110_010_011_1(uniques, 4);
+  f_011_110_010_100_0(uniques, 4);
+  f_011_110_010_100_1(uniques, 4);
+  f_011_110_010_101_0(uniques, 4);
+  f_011_110_010_101_1(uniques, 4);
+  f_011_110_010_110_0(uniques, 4);
+  f_011_110_010_110_1(uniques, 4);
+  f_011_110_010_111_0(uniques, 4);
+  f_011_110_010_111_1(uniques, 4);
+  f_011_110_011_000_0(uniques, 4);
+  f_011_110_011_000_1(uniques, 4);
+  f_011_110_011_001_0(uniques, 4);
+  f_011_110_011_001_1(uniques, 4);
+  f_011_110_011_010_0(uniques, 4);
+  f_011_110_011_010_1(uniques, 4);
+  f_011_110_011_011_0(uniques, 4);
+  f_011_110_011_011_1(uniques, 4);
+  f_011_110_011_100_0(uniques, 4);
+  f_011_110_011_100_1(uniques, 4);
+  f_011_110_011_101_0(uniques, 4);
+  f_011_110_011_101_1(uniques, 4);
+  f_011_110_011_110_0(uniques, 4);
+  f_011_110_011_110_1(uniques, 4);
+  f_011_110_011_111_0(uniques, 4);
+  f_011_110_011_111_1(uniques, 4);
+  f_011_110_100_000_0(uniques, 4);
+  f_011_110_100_000_1(uniques, 4);
+  f_011_110_100_001_0(uniques, 4);
+  f_011_110_100_001_1(uniques, 4);
+  f_011_110_100_010_0(uniques, 4);
+  f_011_110_100_010_1(uniques, 4);
+  f_011_110_100_011_0(uniques, 4);
+  f_011_110_100_011_1(uniques, 4);
+  f_011_110_100_100_0(uniques, 4);
+  f_011_110_100_100_1(uniques, 4);
+  f_011_110_100_101_0(uniques, 4);
+  f_011_110_100_101_1(uniques, 4);
+  f_011_110_100_110_0(uniques, 4);
+  f_011_110_100_110_1(uniques, 4);
+  f_011_110_100_111_0(uniques, 4);
+  f_011_110_100_111_1(uniques, 4);
+  f_011_110_101_000_0(uniques, 4);
+  f_011_110_101_000_1(uniques, 4);
+  f_011_110_101_001_0(uniques, 4);
+  f_011_110_101_001_1(uniques, 4);
+  f_011_110_101_010_0(uniques, 4);
+  f_011_110_101_010_1(uniques, 4);
+  f_011_110_101_011_0(uniques, 4);
+  f_011_110_101_011_1(uniques, 4);
+  f_011_110_101_100_0(uniques, 4);
+  f_011_110_101_100_1(uniques, 4);
+  f_011_110_101_101_0(uniques, 4);
+  f_011_110_101_101_1(uniques, 4);
+  f_011_110_101_110_0(uniques, 4);
+  f_011_110_101_110_1(uniques, 4);
+  f_011_110_101_111_0(uniques, 4);
+  f_011_110_101_111_1(uniques, 4);
+  f_011_110_110_000_0(uniques, 4);
+  f_011_110_110_000_1(uniques, 4);
+  f_011_110_110_001_0(uniques, 4);
+  f_011_110_110_001_1(uniques, 4);
+  f_011_110_110_010_0(uniques, 4);
+  f_011_110_110_010_1(uniques, 4);
+  f_011_110_110_011_0(uniques, 4);
+  f_011_110_110_011_1(uniques, 4);
+  f_011_110_110_100_0(uniques, 4);
+  f_011_110_110_100_1(uniques, 4);
+  f_011_110_110_101_0(uniques, 4);
+  f_011_110_110_101_1(uniques, 4);
+  f_011_110_110_110_0(uniques, 4);
+  f_011_110_110_110_1(uniques, 4);
+  f_011_110_110_111_0(uniques, 4);
+  f_011_110_110_111_1(uniques, 4);
+  f_011_110_111_000_0(uniques, 4);
+  f_011_110_111_000_1(uniques, 4);
+  f_011_110_111_001_0(uniques, 4);
+  f_011_110_111_001_1(uniques, 4);
+  f_011_110_111_010_0(uniques, 4);
+  f_011_110_111_010_1(uniques, 4);
+  f_011_110_111_011_0(uniques, 4);
+  f_011_110_111_011_1(uniques, 4);
+  f_011_110_111_100_0(uniques, 4);
+  f_011_110_111_100_1(uniques, 4);
+  f_011_110_111_101_0(uniques, 4);
+  f_011_110_111_101_1(uniques, 4);
+  f_011_110_111_110_0(uniques, 4);
+  f_011_110_111_110_1(uniques, 4);
+  f_011_110_111_111_0(uniques, 4);
+  f_011_110_111_111_1(uniques, 4);
+  f_011_111_000_000_0(uniques, 4);
+  f_011_111_000_000_1(uniques, 4);
+  f_011_111_000_001_0(uniques, 4);
+  f_011_111_000_001_1(uniques, 4);
+  f_011_111_000_010_0(uniques, 4);
+  f_011_111_000_010_1(uniques, 4);
+  f_011_111_000_011_0(uniques, 4);
+  f_011_111_000_011_1(uniques, 4);
+  f_011_111_000_100_0(uniques, 4);
+  f_011_111_000_100_1(uniques, 4);
+  f_011_111_000_101_0(uniques, 4);
+  f_011_111_000_101_1(uniques, 4);
+  f_011_111_000_110_0(uniques, 4);
+  f_011_111_000_110_1(uniques, 4);
+  f_011_111_000_111_0(uniques, 4);
+  f_011_111_000_111_1(uniques, 4);
+  f_011_111_001_000_0(uniques, 4);
+  f_011_111_001_000_1(uniques, 4);
+  f_011_111_001_001_0(uniques, 4);
+  f_011_111_001_001_1(uniques, 4);
+  f_011_111_001_010_0(uniques, 4);
+  f_011_111_001_010_1(uniques, 4);
+  f_011_111_001_011_0(uniques, 4);
+  f_011_111_001_011_1(uniques, 4);
+  f_011_111_001_100_0(uniques, 4);
+  f_011_111_001_100_1(uniques, 4);
+  f_011_111_001_101_0(uniques, 4);
+  f_011_111_001_101_1(uniques, 4);
+  f_011_111_001_110_0(uniques, 4);
+  f_011_111_001_110_1(uniques, 4);
+  f_011_111_001_111_0(uniques, 4);
+  f_011_111_001_111_1(uniques, 4);
+  f_011_111_010_000_0(uniques, 4);
+  f_011_111_010_000_1(uniques, 4);
+  f_011_111_010_001_0(uniques, 4);
+  f_011_111_010_001_1(uniques, 4);
+  f_011_111_010_010_0(uniques, 4);
+  f_011_111_010_010_1(uniques, 4);
+  f_011_111_010_011_0(uniques, 4);
+  f_011_111_010_011_1(uniques, 4);
+  f_011_111_010_100_0(uniques, 4);
+  f_011_111_010_100_1(uniques, 4);
+  f_011_111_010_101_0(uniques, 4);
+  f_011_111_010_101_1(uniques, 4);
+  f_011_111_010_110_0(uniques, 4);
+  f_011_111_010_110_1(uniques, 4);
+  f_011_111_010_111_0(uniques, 4);
+  f_011_111_010_111_1(uniques, 4);
+  f_011_111_011_000_0(uniques, 4);
+  f_011_111_011_000_1(uniques, 4);
+  f_011_111_011_001_0(uniques, 4);
+  f_011_111_011_001_1(uniques, 4);
+  f_011_111_011_010_0(uniques, 4);
+  f_011_111_011_010_1(uniques, 4);
+  f_011_111_011_011_0(uniques, 4);
+  f_011_111_011_011_1(uniques, 4);
+  f_011_111_011_100_0(uniques, 4);
+  f_011_111_011_100_1(uniques, 4);
+  f_011_111_011_101_0(uniques, 4);
+  f_011_111_011_101_1(uniques, 4);
+  f_011_111_011_110_0(uniques, 4);
+  f_011_111_011_110_1(uniques, 4);
+  f_011_111_011_111_0(uniques, 4);
+  f_011_111_011_111_1(uniques, 4);
+  f_011_111_100_000_0(uniques, 4);
+  f_011_111_100_000_1(uniques, 4);
+  f_011_111_100_001_0(uniques, 4);
+  f_011_111_100_001_1(uniques, 4);
+  f_011_111_100_010_0(uniques, 4);
+  f_011_111_100_010_1(uniques, 4);
+  f_011_111_100_011_0(uniques, 4);
+  f_011_111_100_011_1(uniques, 4);
+  f_011_111_100_100_0(uniques, 4);
+  f_011_111_100_100_1(uniques, 4);
+  f_011_111_100_101_0(uniques, 4);
+  f_011_111_100_101_1(uniques, 4);
+  f_011_111_100_110_0(uniques, 4);
+  f_011_111_100_110_1(uniques, 4);
+  f_011_111_100_111_0(uniques, 4);
+  f_011_111_100_111_1(uniques, 4);
+  f_011_111_101_000_0(uniques, 4);
+  f_011_111_101_000_1(uniques, 4);
+  f_011_111_101_001_0(uniques, 4);
+  f_011_111_101_001_1(uniques, 4);
+  f_011_111_101_010_0(uniques, 4);
+  f_011_111_101_010_1(uniques, 4);
+  f_011_111_101_011_0(uniques, 4);
+  f_011_111_101_011_1(uniques, 4);
+  f_011_111_101_100_0(uniques, 4);
+  f_011_111_101_100_1(uniques, 4);
+  f_011_111_101_101_0(uniques, 4);
+  f_011_111_101_101_1(uniques, 4);
+  f_011_111_101_110_0(uniques, 4);
+  f_011_111_101_110_1(uniques, 4);
+  f_011_111_101_111_0(uniques, 4);
+  f_011_111_101_111_1(uniques, 4);
+  f_011_111_110_000_0(uniques, 4);
+  f_011_111_110_000_1(uniques, 4);
+  f_011_111_110_001_0(uniques, 4);
+  f_011_111_110_001_1(uniques, 4);
+  f_011_111_110_010_0(uniques, 4);
+  f_011_111_110_010_1(uniques, 4);
+  f_011_111_110_011_0(uniques, 4);
+  f_011_111_110_011_1(uniques, 4);
+  f_011_111_110_100_0(uniques, 4);
+  f_011_111_110_100_1(uniques, 4);
+  f_011_111_110_101_0(uniques, 4);
+  f_011_111_110_101_1(uniques, 4);
+  f_011_111_110_110_0(uniques, 4);
+  f_011_111_110_110_1(uniques, 4);
+  f_011_111_110_111_0(uniques, 4);
+  f_011_111_110_111_1(uniques, 4);
+  f_011_111_111_000_0(uniques, 4);
+  f_011_111_111_000_1(uniques, 4);
+  f_011_111_111_001_0(uniques, 4);
+  f_011_111_111_001_1(uniques, 4);
+  f_011_111_111_010_0(uniques, 4);
+  f_011_111_111_010_1(uniques, 4);
+  f_011_111_111_011_0(uniques, 4);
+  f_011_111_111_011_1(uniques, 4);
+  f_011_111_111_100_0(uniques, 4);
+  f_011_111_111_100_1(uniques, 4);
+  f_011_111_111_101_0(uniques, 4);
+  f_011_111_111_101_1(uniques, 4);
+  f_011_111_111_110_0(uniques, 4);
+  f_011_111_111_110_1(uniques, 4);
+  f_011_111_111_111_0(uniques, 4);
+  f_011_111_111_111_1(uniques, 4);
+  f_100_010_000_000_0(uniques, 4);
+  f_100_010_000_000_1(uniques, 4);
+  f_100_010_000_001_0(uniques, 4);
+  f_100_010_000_001_1(uniques, 4);
+  f_100_010_000_010_0(uniques, 4);
+  f_100_010_000_010_1(uniques, 4);
+  f_100_010_000_011_0(uniques, 4);
+  f_100_010_000_011_1(uniques, 4);
+  f_100_010_000_100_0(uniques, 4);
+  f_100_010_000_100_1(uniques, 4);
+  f_100_010_000_101_0(uniques, 4);
+  f_100_010_000_101_1(uniques, 4);
+  f_100_010_000_110_0(uniques, 4);
+  f_100_010_000_110_1(uniques, 4);
+  f_100_010_000_111_0(uniques, 4);
+  f_100_010_000_111_1(uniques, 4);
+  f_100_010_001_000_0(uniques, 4);
+  f_100_010_001_000_1(uniques, 4);
+  f_100_010_001_001_0(uniques, 4);
+  f_100_010_001_001_1(uniques, 4);
+  f_100_010_001_010_0(uniques, 4);
+  f_100_010_001_010_1(uniques, 4);
+  f_100_010_001_011_0(uniques, 4);
+  f_100_010_001_011_1(uniques, 4);
+  f_100_010_001_100_0(uniques, 4);
+  f_100_010_001_100_1(uniques, 4);
+  f_100_010_001_101_0(uniques, 4);
+  f_100_010_001_101_1(uniques, 4);
+  f_100_010_001_110_0(uniques, 4);
+  f_100_010_001_110_1(uniques, 4);
+  f_100_010_001_111_0(uniques, 4);
+  f_100_010_001_111_1(uniques, 4);
+  f_100_010_010_000_0(uniques, 4);
+  f_100_010_010_000_1(uniques, 4);
+  f_100_010_010_001_0(uniques, 4);
+  f_100_010_010_001_1(uniques, 4);
+  f_100_010_010_010_0(uniques, 4);
+  f_100_010_010_010_1(uniques, 4);
+  f_100_010_010_011_0(uniques, 4);
+  f_100_010_010_011_1(uniques, 4);
+  f_100_010_010_100_0(uniques, 4);
+  f_100_010_010_100_1(uniques, 4);
+  f_100_010_010_101_0(uniques, 4);
+  f_100_010_010_101_1(uniques, 4);
+  f_100_010_010_110_0(uniques, 4);
+  f_100_010_010_110_1(uniques, 4);
+  f_100_010_010_111_0(uniques, 4);
+  f_100_010_010_111_1(uniques, 4);
+  f_100_010_011_000_0(uniques, 4);
+  f_100_010_011_000_1(uniques, 4);
+  f_100_010_011_001_0(uniques, 4);
+  f_100_010_011_001_1(uniques, 4);
+  f_100_010_011_010_0(uniques, 4);
+  f_100_010_011_010_1(uniques, 4);
+  f_100_010_011_011_0(uniques, 4);
+  f_100_010_011_011_1(uniques, 4);
+  f_100_010_011_100_0(uniques, 4);
+  f_100_010_011_100_1(uniques, 4);
+  f_100_010_011_101_0(uniques, 4);
+  f_100_010_011_101_1(uniques, 4);
+  f_100_010_011_110_0(uniques, 4);
+  f_100_010_011_110_1(uniques, 4);
+  f_100_010_011_111_0(uniques, 4);
+  f_100_010_011_111_1(uniques, 4);
+  f_100_010_100_000_0(uniques, 4);
+  f_100_010_100_000_1(uniques, 4);
+  f_100_010_100_001_0(uniques, 4);
+  f_100_010_100_001_1(uniques, 4);
+  f_100_010_100_010_0(uniques, 4);
+  f_100_010_100_010_1(uniques, 4);
+  f_100_010_100_011_0(uniques, 4);
+  f_100_010_100_011_1(uniques, 4);
+  f_100_010_100_100_0(uniques, 4);
+  f_100_010_100_100_1(uniques, 4);
+  f_100_010_100_101_0(uniques, 4);
+  f_100_010_100_101_1(uniques, 4);
+  f_100_010_100_110_0(uniques, 4);
+  f_100_010_100_110_1(uniques, 4);
+  f_100_010_100_111_0(uniques, 4);
+  f_100_010_100_111_1(uniques, 4);
+  f_100_010_101_000_0(uniques, 4);
+  f_100_010_101_000_1(uniques, 4);
+  f_100_010_101_001_0(uniques, 4);
+  f_100_010_101_001_1(uniques, 4);
+  f_100_010_101_010_0(uniques, 4);
+  f_100_010_101_010_1(uniques, 4);
+  f_100_010_101_011_0(uniques, 4);
+  f_100_010_101_011_1(uniques, 4);
+  f_100_010_101_100_0(uniques, 4);
+  f_100_010_101_100_1(uniques, 4);
+  f_100_010_101_101_0(uniques, 4);
+  f_100_010_101_101_1(uniques, 4);
+  f_100_010_101_110_0(uniques, 4);
+  f_100_010_101_110_1(uniques, 4);
+  f_100_010_101_111_0(uniques, 4);
+  f_100_010_101_111_1(uniques, 4);
+  f_100_010_110_000_0(uniques, 4);
+  f_100_010_110_000_1(uniques, 4);
+  f_100_010_110_001_0(uniques, 4);
+  f_100_010_110_001_1(uniques, 4);
+  f_100_010_110_010_0(uniques, 4);
+  f_100_010_110_010_1(uniques, 4);
+  f_100_010_110_011_0(uniques, 4);
+  f_100_010_110_011_1(uniques, 4);
+  f_100_010_110_100_0(uniques, 4);
+  f_100_010_110_100_1(uniques, 4);
+  f_100_010_110_101_0(uniques, 4);
+  f_100_010_110_101_1(uniques, 4);
+  f_100_010_110_110_0(uniques, 4);
+  f_100_010_110_110_1(uniques, 4);
+  f_100_010_110_111_0(uniques, 4);
+  f_100_010_110_111_1(uniques, 4);
+  f_100_010_111_000_0(uniques, 4);
+  f_100_010_111_000_1(uniques, 4);
+  f_100_010_111_001_0(uniques, 4);
+  f_100_010_111_001_1(uniques, 4);
+  f_100_010_111_010_0(uniques, 4);
+  f_100_010_111_010_1(uniques, 4);
+  f_100_010_111_011_0(uniques, 4);
+  f_100_010_111_011_1(uniques, 4);
+  f_100_010_111_100_0(uniques, 4);
+  f_100_010_111_100_1(uniques, 4);
+  f_100_010_111_101_0(uniques, 4);
+  f_100_010_111_101_1(uniques, 4);
+  f_100_010_111_110_0(uniques, 4);
+  f_100_010_111_110_1(uniques, 4);
+  f_100_010_111_111_0(uniques, 4);
+  f_100_010_111_111_1(uniques, 4);
+  f_100_011_000_000_0(uniques, 4);
+  f_100_011_000_000_1(uniques, 4);
+  f_100_011_000_001_0(uniques, 4);
+  f_100_011_000_001_1(uniques, 4);
+  f_100_011_000_010_0(uniques, 4);
+  f_100_011_000_010_1(uniques, 4);
+  f_100_011_000_011_0(uniques, 4);
+  f_100_011_000_011_1(uniques, 4);
+  f_100_011_000_100_0(uniques, 4);
+  f_100_011_000_100_1(uniques, 4);
+  f_100_011_000_101_0(uniques, 4);
+  f_100_011_000_101_1(uniques, 4);
+  f_100_011_000_110_0(uniques, 4);
+  f_100_011_000_110_1(uniques, 4);
+  f_100_011_000_111_0(uniques, 4);
+  f_100_011_000_111_1(uniques, 4);
+  f_100_011_001_000_0(uniques, 4);
+  f_100_011_001_000_1(uniques, 4);
+  f_100_011_001_001_0(uniques, 4);
+  f_100_011_001_001_1(uniques, 4);
+  f_100_011_001_010_0(uniques, 4);
+  f_100_011_001_010_1(uniques, 4);
+  f_100_011_001_011_0(uniques, 4);
+  f_100_011_001_011_1(uniques, 4);
+  f_100_011_001_100_0(uniques, 4);
+  f_100_011_001_100_1(uniques, 4);
+  f_100_011_001_101_0(uniques, 4);
+  f_100_011_001_101_1(uniques, 4);
+  f_100_011_001_110_0(uniques, 4);
+  f_100_011_001_110_1(uniques, 4);
+  f_100_011_001_111_0(uniques, 4);
+  f_100_011_001_111_1(uniques, 4);
+  f_100_011_010_000_0(uniques, 4);
+  f_100_011_010_000_1(uniques, 4);
+  f_100_011_010_001_0(uniques, 4);
+  f_100_011_010_001_1(uniques, 4);
+  f_100_011_010_010_0(uniques, 4);
+  f_100_011_010_010_1(uniques, 4);
+  f_100_011_010_011_0(uniques, 4);
+  f_100_011_010_011_1(uniques, 4);
+  f_100_011_010_100_0(uniques, 4);
+  f_100_011_010_100_1(uniques, 4);
+  f_100_011_010_101_0(uniques, 4);
+  f_100_011_010_101_1(uniques, 4);
+  f_100_011_010_110_0(uniques, 4);
+  f_100_011_010_110_1(uniques, 4);
+  f_100_011_010_111_0(uniques, 4);
+  f_100_011_010_111_1(uniques, 4);
+  f_100_011_011_000_0(uniques, 4);
+  f_100_011_011_000_1(uniques, 4);
+  f_100_011_011_001_0(uniques, 4);
+  f_100_011_011_001_1(uniques, 4);
+  f_100_011_011_010_0(uniques, 4);
+  f_100_011_011_010_1(uniques, 4);
+  f_100_011_011_011_0(uniques, 4);
+  f_100_011_011_011_1(uniques, 4);
+  f_100_011_011_100_0(uniques, 4);
+  f_100_011_011_100_1(uniques, 4);
+  f_100_011_011_101_0(uniques, 4);
+  f_100_011_011_101_1(uniques, 4);
+  f_100_011_011_110_0(uniques, 4);
+  f_100_011_011_110_1(uniques, 4);
+  f_100_011_011_111_0(uniques, 4);
+  f_100_011_011_111_1(uniques, 4);
+  f_100_011_100_000_0(uniques, 4);
+  f_100_011_100_000_1(uniques, 4);
+  f_100_011_100_001_0(uniques, 4);
+  f_100_011_100_001_1(uniques, 4);
+  f_100_011_100_010_0(uniques, 4);
+  f_100_011_100_010_1(uniques, 4);
+  f_100_011_100_011_0(uniques, 4);
+  f_100_011_100_011_1(uniques, 4);
+  f_100_011_100_100_0(uniques, 4);
+  f_100_011_100_100_1(uniques, 4);
+  f_100_011_100_101_0(uniques, 4);
+  f_100_011_100_101_1(uniques, 4);
+  f_100_011_100_110_0(uniques, 4);
+  f_100_011_100_110_1(uniques, 4);
+  f_100_011_100_111_0(uniques, 4);
+  f_100_011_100_111_1(uniques, 4);
+  f_100_011_101_000_0(uniques, 4);
+  f_100_011_101_000_1(uniques, 4);
+  f_100_011_101_001_0(uniques, 4);
+  f_100_011_101_001_1(uniques, 4);
+  f_100_011_101_010_0(uniques, 4);
+  f_100_011_101_010_1(uniques, 4);
+  f_100_011_101_011_0(uniques, 4);
+  f_100_011_101_011_1(uniques, 4);
+  f_100_011_101_100_0(uniques, 4);
+  f_100_011_101_100_1(uniques, 4);
+  f_100_011_101_101_0(uniques, 4);
+  f_100_011_101_101_1(uniques, 4);
+  f_100_011_101_110_0(uniques, 4);
+  f_100_011_101_110_1(uniques, 4);
+  f_100_011_101_111_0(uniques, 4);
+  f_100_011_101_111_1(uniques, 4);
+  f_100_011_110_000_0(uniques, 4);
+  f_100_011_110_000_1(uniques, 4);
+  f_100_011_110_001_0(uniques, 4);
+  f_100_011_110_001_1(uniques, 4);
+  f_100_011_110_010_0(uniques, 4);
+  f_100_011_110_010_1(uniques, 4);
+  f_100_011_110_011_0(uniques, 4);
+  f_100_011_110_011_1(uniques, 4);
+  f_100_011_110_100_0(uniques, 4);
+  f_100_011_110_100_1(uniques, 4);
+  f_100_011_110_101_0(uniques, 4);
+  f_100_011_110_101_1(uniques, 4);
+  f_100_011_110_110_0(uniques, 4);
+  f_100_011_110_110_1(uniques, 4);
+  f_100_011_110_111_0(uniques, 4);
+  f_100_011_110_111_1(uniques, 4);
+  f_100_011_111_000_0(uniques, 4);
+  f_100_011_111_000_1(uniques, 4);
+  f_100_011_111_001_0(uniques, 4);
+  f_100_011_111_001_1(uniques, 4);
+  f_100_011_111_010_0(uniques, 4);
+  f_100_011_111_010_1(uniques, 4);
+  f_100_011_111_011_0(uniques, 4);
+  f_100_011_111_011_1(uniques, 4);
+  f_100_011_111_100_0(uniques, 4);
+  f_100_011_111_100_1(uniques, 4);
+  f_100_011_111_101_0(uniques, 4);
+  f_100_011_111_101_1(uniques, 4);
+  f_100_011_111_110_0(uniques, 4);
+  f_100_011_111_110_1(uniques, 4);
+  f_100_011_111_111_0(uniques, 4);
+  f_100_011_111_111_1(uniques, 4);
+  f_100_110_000_000_0(uniques, 4);
+  f_100_110_000_000_1(uniques, 4);
+  f_100_110_000_001_0(uniques, 4);
+  f_100_110_000_001_1(uniques, 4);
+  f_100_110_000_010_0(uniques, 4);
+  f_100_110_000_010_1(uniques, 4);
+  f_100_110_000_011_0(uniques, 4);
+  f_100_110_000_011_1(uniques, 4);
+  f_100_110_000_100_0(uniques, 4);
+  f_100_110_000_100_1(uniques, 4);
+  f_100_110_000_101_0(uniques, 4);
+  f_100_110_000_101_1(uniques, 4);
+  f_100_110_000_110_0(uniques, 4);
+  f_100_110_000_110_1(uniques, 4);
+  f_100_110_000_111_0(uniques, 4);
+  f_100_110_000_111_1(uniques, 4);
+  f_100_110_001_000_0(uniques, 4);
+  f_100_110_001_000_1(uniques, 4);
+  f_100_110_001_001_0(uniques, 4);
+  f_100_110_001_001_1(uniques, 4);
+  f_100_110_001_010_0(uniques, 4);
+  f_100_110_001_010_1(uniques, 4);
+  f_100_110_001_011_0(uniques, 4);
+  f_100_110_001_011_1(uniques, 4);
+  f_100_110_001_100_0(uniques, 4);
+  f_100_110_001_100_1(uniques, 4);
+  f_100_110_001_101_0(uniques, 4);
+  f_100_110_001_101_1(uniques, 4);
+  f_100_110_001_110_0(uniques, 4);
+  f_100_110_001_110_1(uniques, 4);
+  f_100_110_001_111_0(uniques, 4);
+  f_100_110_001_111_1(uniques, 4);
+  f_100_110_010_000_0(uniques, 4);
+  f_100_110_010_000_1(uniques, 4);
+  f_100_110_010_001_0(uniques, 4);
+  f_100_110_010_001_1(uniques, 4);
+  f_100_110_010_010_0(uniques, 4);
+  f_100_110_010_010_1(uniques, 4);
+  f_100_110_010_011_0(uniques, 4);
+  f_100_110_010_011_1(uniques, 4);
+  f_100_110_010_100_0(uniques, 4);
+  f_100_110_010_100_1(uniques, 4);
+  f_100_110_010_101_0(uniques, 4);
+  f_100_110_010_101_1(uniques, 4);
+  f_100_110_010_110_0(uniques, 4);
+  f_100_110_010_110_1(uniques, 4);
+  f_100_110_010_111_0(uniques, 4);
+  f_100_110_010_111_1(uniques, 4);
+  f_100_110_011_000_0(uniques, 4);
+  f_100_110_011_000_1(uniques, 4);
+  f_100_110_011_001_0(uniques, 4);
+  f_100_110_011_001_1(uniques, 4);
+  f_100_110_011_010_0(uniques, 4);
+  f_100_110_011_010_1(uniques, 4);
+  f_100_110_011_011_0(uniques, 4);
+  f_100_110_011_011_1(uniques, 4);
+  f_100_110_011_100_0(uniques, 4);
+  f_100_110_011_100_1(uniques, 4);
+  f_100_110_011_101_0(uniques, 4);
+  f_100_110_011_101_1(uniques, 4);
+  f_100_110_011_110_0(uniques, 4);
+  f_100_110_011_110_1(uniques, 4);
+  f_100_110_011_111_0(uniques, 4);
+  f_100_110_011_111_1(uniques, 4);
+  f_100_110_100_000_0(uniques, 4);
+  f_100_110_100_000_1(uniques, 4);
+  f_100_110_100_001_0(uniques, 4);
+  f_100_110_100_001_1(uniques, 4);
+  f_100_110_100_010_0(uniques, 4);
+  f_100_110_100_010_1(uniques, 4);
+  f_100_110_100_011_0(uniques, 4);
+  f_100_110_100_011_1(uniques, 4);
+  f_100_110_100_100_0(uniques, 4);
+  f_100_110_100_100_1(uniques, 4);
+  f_100_110_100_101_0(uniques, 4);
+  f_100_110_100_101_1(uniques, 4);
+  f_100_110_100_110_0(uniques, 4);
+  f_100_110_100_110_1(uniques, 4);
+  f_100_110_100_111_0(uniques, 4);
+  f_100_110_100_111_1(uniques, 4);
+  f_100_110_101_000_0(uniques, 4);
+  f_100_110_101_000_1(uniques, 4);
+  f_100_110_101_001_0(uniques, 4);
+  f_100_110_101_001_1(uniques, 4);
+  f_100_110_101_010_0(uniques, 4);
+  f_100_110_101_010_1(uniques, 4);
+  f_100_110_101_011_0(uniques, 4);
+  f_100_110_101_011_1(uniques, 4);
+  f_100_110_101_100_0(uniques, 4);
+  f_100_110_101_100_1(uniques, 4);
+  f_100_110_101_101_0(uniques, 4);
+  f_100_110_101_101_1(uniques, 4);
+  f_100_110_101_110_0(uniques, 4);
+  f_100_110_101_110_1(uniques, 4);
+  f_100_110_101_111_0(uniques, 4);
+  f_100_110_101_111_1(uniques, 4);
+  f_100_110_110_000_0(uniques, 4);
+  f_100_110_110_000_1(uniques, 4);
+  f_100_110_110_001_0(uniques, 4);
+  f_100_110_110_001_1(uniques, 4);
+  f_100_110_110_010_0(uniques, 4);
+  f_100_110_110_010_1(uniques, 4);
+  f_100_110_110_011_0(uniques, 4);
+  f_100_110_110_011_1(uniques, 4);
+  f_100_110_110_100_0(uniques, 4);
+  f_100_110_110_100_1(uniques, 4);
+  f_100_110_110_101_0(uniques, 4);
+  f_100_110_110_101_1(uniques, 4);
+  f_100_110_110_110_0(uniques, 4);
+  f_100_110_110_110_1(uniques, 4);
+  f_100_110_110_111_0(uniques, 4);
+  f_100_110_110_111_1(uniques, 4);
+  f_100_110_111_000_0(uniques, 4);
+  f_100_110_111_000_1(uniques, 4);
+  f_100_110_111_001_0(uniques, 4);
+  f_100_110_111_001_1(uniques, 4);
+  f_100_110_111_010_0(uniques, 4);
+  f_100_110_111_010_1(uniques, 4);
+  f_100_110_111_011_0(uniques, 4);
+  f_100_110_111_011_1(uniques, 4);
+  f_100_110_111_100_0(uniques, 4);
+  f_100_110_111_100_1(uniques, 4);
+  f_100_110_111_101_0(uniques, 4);
+  f_100_110_111_101_1(uniques, 4);
+  f_100_110_111_110_0(uniques, 4);
+  f_100_110_111_110_1(uniques, 4);
+  f_100_110_111_111_0(uniques, 4);
+  f_100_110_111_111_1(uniques, 4);
+  f_100_111_000_000_0(uniques, 4);
+  f_100_111_000_000_1(uniques, 4);
+  f_100_111_000_001_0(uniques, 4);
+  f_100_111_000_001_1(uniques, 4);
+  f_100_111_000_010_0(uniques, 4);
+  f_100_111_000_010_1(uniques, 4);
+  f_100_111_000_011_0(uniques, 4);
+  f_100_111_000_011_1(uniques, 4);
+  f_100_111_000_100_0(uniques, 4);
+  f_100_111_000_100_1(uniques, 4);
+  f_100_111_000_101_0(uniques, 4);
+  f_100_111_000_101_1(uniques, 4);
+  f_100_111_000_110_0(uniques, 4);
+  f_100_111_000_110_1(uniques, 4);
+  f_100_111_000_111_0(uniques, 4);
+  f_100_111_000_111_1(uniques, 4);
+  f_100_111_001_000_0(uniques, 4);
+  f_100_111_001_000_1(uniques, 4);
+  f_100_111_001_001_0(uniques, 4);
+  f_100_111_001_001_1(uniques, 4);
+  f_100_111_001_010_0(uniques, 4);
+  f_100_111_001_010_1(uniques, 4);
+  f_100_111_001_011_0(uniques, 4);
+  f_100_111_001_011_1(uniques, 4);
+  f_100_111_001_100_0(uniques, 4);
+  f_100_111_001_100_1(uniques, 4);
+  f_100_111_001_101_0(uniques, 4);
+  f_100_111_001_101_1(uniques, 4);
+  f_100_111_001_110_0(uniques, 4);
+  f_100_111_001_110_1(uniques, 4);
+  f_100_111_001_111_0(uniques, 4);
+  f_100_111_001_111_1(uniques, 4);
+  f_100_111_010_000_0(uniques, 4);
+  f_100_111_010_000_1(uniques, 4);
+  f_100_111_010_001_0(uniques, 4);
+  f_100_111_010_001_1(uniques, 4);
+  f_100_111_010_010_0(uniques, 4);
+  f_100_111_010_010_1(uniques, 4);
+  f_100_111_010_011_0(uniques, 4);
+  f_100_111_010_011_1(uniques, 4);
+  f_100_111_010_100_0(uniques, 4);
+  f_100_111_010_100_1(uniques, 4);
+  f_100_111_010_101_0(uniques, 4);
+  f_100_111_010_101_1(uniques, 4);
+  f_100_111_010_110_0(uniques, 4);
+  f_100_111_010_110_1(uniques, 4);
+  f_100_111_010_111_0(uniques, 4);
+  f_100_111_010_111_1(uniques, 4);
+  f_100_111_011_000_0(uniques, 4);
+  f_100_111_011_000_1(uniques, 4);
+  f_100_111_011_001_0(uniques, 4);
+  f_100_111_011_001_1(uniques, 4);
+  f_100_111_011_010_0(uniques, 4);
+  f_100_111_011_010_1(uniques, 4);
+  f_100_111_011_011_0(uniques, 4);
+  f_100_111_011_011_1(uniques, 4);
+  f_100_111_011_100_0(uniques, 4);
+  f_100_111_011_100_1(uniques, 4);
+  f_100_111_011_101_0(uniques, 4);
+  f_100_111_011_101_1(uniques, 4);
+  f_100_111_011_110_0(uniques, 4);
+  f_100_111_011_110_1(uniques, 4);
+  f_100_111_011_111_0(uniques, 4);
+  f_100_111_011_111_1(uniques, 4);
+  f_100_111_100_000_0(uniques, 4);
+  f_100_111_100_000_1(uniques, 4);
+  f_100_111_100_001_0(uniques, 4);
+  f_100_111_100_001_1(uniques, 4);
+  f_100_111_100_010_0(uniques, 4);
+  f_100_111_100_010_1(uniques, 4);
+  f_100_111_100_011_0(uniques, 4);
+  f_100_111_100_011_1(uniques, 4);
+  f_100_111_100_100_0(uniques, 4);
+  f_100_111_100_100_1(uniques, 4);
+  f_100_111_100_101_0(uniques, 4);
+  f_100_111_100_101_1(uniques, 4);
+  f_100_111_100_110_0(uniques, 4);
+  f_100_111_100_110_1(uniques, 4);
+  f_100_111_100_111_0(uniques, 4);
+  f_100_111_100_111_1(uniques, 4);
+  f_100_111_101_000_0(uniques, 4);
+  f_100_111_101_000_1(uniques, 4);
+  f_100_111_101_001_0(uniques, 4);
+  f_100_111_101_001_1(uniques, 4);
+  f_100_111_101_010_0(uniques, 4);
+  f_100_111_101_010_1(uniques, 4);
+  f_100_111_101_011_0(uniques, 4);
+  f_100_111_101_011_1(uniques, 4);
+  f_100_111_101_100_0(uniques, 4);
+  f_100_111_101_100_1(uniques, 4);
+  f_100_111_101_101_0(uniques, 4);
+  f_100_111_101_101_1(uniques, 4);
+  f_100_111_101_110_0(uniques, 4);
+  f_100_111_101_110_1(uniques, 4);
+  f_100_111_101_111_0(uniques, 4);
+  f_100_111_101_111_1(uniques, 4);
+  f_100_111_110_000_0(uniques, 4);
+  f_100_111_110_000_1(uniques, 4);
+  f_100_111_110_001_0(uniques, 4);
+  f_100_111_110_001_1(uniques, 4);
+  f_100_111_110_010_0(uniques, 4);
+  f_100_111_110_010_1(uniques, 4);
+  f_100_111_110_011_0(uniques, 4);
+  f_100_111_110_011_1(uniques, 4);
+  f_100_111_110_100_0(uniques, 4);
+  f_100_111_110_100_1(uniques, 4);
+  f_100_111_110_101_0(uniques, 4);
+  f_100_111_110_101_1(uniques, 4);
+  f_100_111_110_110_0(uniques, 4);
+  f_100_111_110_110_1(uniques, 4);
+  f_100_111_110_111_0(uniques, 4);
+  f_100_111_110_111_1(uniques, 4);
+  f_100_111_111_000_0(uniques, 4);
+  f_100_111_111_000_1(uniques, 4);
+  f_100_111_111_001_0(uniques, 4);
+  f_100_111_111_001_1(uniques, 4);
+  f_100_111_111_010_0(uniques, 4);
+  f_100_111_111_010_1(uniques, 4);
+  f_100_111_111_011_0(uniques, 4);
+  f_100_111_111_011_1(uniques, 4);
+  f_100_111_111_100_0(uniques, 4);
+  f_100_111_111_100_1(uniques, 4);
+  f_100_111_111_101_0(uniques, 4);
+  f_100_111_111_101_1(uniques, 4);
+  f_100_111_111_110_0(uniques, 4);
+  f_100_111_111_110_1(uniques, 4);
+  f_100_111_111_111_0(uniques, 4);
+  f_100_111_111_111_1(uniques, 4);
+  f_101_010_000_000_0(uniques, 4);
+  f_101_010_000_000_1(uniques, 4);
+  f_101_010_000_001_0(uniques, 4);
+  f_101_010_000_001_1(uniques, 4);
+  f_101_010_000_010_0(uniques, 4);
+  f_101_010_000_010_1(uniques, 4);
+  f_101_010_000_011_0(uniques, 4);
+  f_101_010_000_011_1(uniques, 4);
+  f_101_010_000_100_0(uniques, 4);
+  f_101_010_000_100_1(uniques, 4);
+  f_101_010_000_101_0(uniques, 4);
+  f_101_010_000_101_1(uniques, 4);
+  f_101_010_000_110_0(uniques, 4);
+  f_101_010_000_110_1(uniques, 4);
+  f_101_010_000_111_0(uniques, 4);
+  f_101_010_000_111_1(uniques, 4);
+  f_101_010_001_000_0(uniques, 4);
+  f_101_010_001_000_1(uniques, 4);
+  f_101_010_001_001_0(uniques, 4);
+  f_101_010_001_001_1(uniques, 4);
+  f_101_010_001_010_0(uniques, 4);
+  f_101_010_001_010_1(uniques, 4);
+  f_101_010_001_011_0(uniques, 4);
+  f_101_010_001_011_1(uniques, 4);
+  f_101_010_001_100_0(uniques, 4);
+  f_101_010_001_100_1(uniques, 4);
+  f_101_010_001_101_0(uniques, 4);
+  f_101_010_001_101_1(uniques, 4);
+  f_101_010_001_110_0(uniques, 4);
+  f_101_010_001_110_1(uniques, 4);
+  f_101_010_001_111_0(uniques, 4);
+  f_101_010_001_111_1(uniques, 4);
+  f_101_010_010_000_0(uniques, 4);
+  f_101_010_010_000_1(uniques, 4);
+  f_101_010_010_001_0(uniques, 4);
+  f_101_010_010_001_1(uniques, 4);
+  f_101_010_010_010_0(uniques, 4);
+  f_101_010_010_010_1(uniques, 4);
+  f_101_010_010_011_0(uniques, 4);
+  f_101_010_010_011_1(uniques, 4);
+  f_101_010_010_100_0(uniques, 4);
+  f_101_010_010_100_1(uniques, 4);
+  f_101_010_010_101_0(uniques, 4);
+  f_101_010_010_101_1(uniques, 4);
+  f_101_010_010_110_0(uniques, 4);
+  f_101_010_010_110_1(uniques, 4);
+  f_101_010_010_111_0(uniques, 4);
+  f_101_010_010_111_1(uniques, 4);
+  f_101_010_011_000_0(uniques, 4);
+  f_101_010_011_000_1(uniques, 4);
+  f_101_010_011_001_0(uniques, 4);
+  f_101_010_011_001_1(uniques, 4);
+  f_101_010_011_010_0(uniques, 4);
+  f_101_010_011_010_1(uniques, 4);
+  f_101_010_011_011_0(uniques, 4);
+  f_101_010_011_011_1(uniques, 4);
+  f_101_010_011_100_0(uniques, 4);
+  f_101_010_011_100_1(uniques, 4);
+  f_101_010_011_101_0(uniques, 4);
+  f_101_010_011_101_1(uniques, 4);
+  f_101_010_011_110_0(uniques, 4);
+  f_101_010_011_110_1(uniques, 4);
+  f_101_010_011_111_0(uniques, 4);
+  f_101_010_011_111_1(uniques, 4);
+  f_101_010_100_000_0(uniques, 4);
+  f_101_010_100_000_1(uniques, 4);
+  f_101_010_100_001_0(uniques, 4);
+  f_101_010_100_001_1(uniques, 4);
+  f_101_010_100_010_0(uniques, 4);
+  f_101_010_100_010_1(uniques, 4);
+  f_101_010_100_011_0(uniques, 4);
+  f_101_010_100_011_1(uniques, 4);
+  f_101_010_100_100_0(uniques, 4);
+  f_101_010_100_100_1(uniques, 4);
+  f_101_010_100_101_0(uniques, 4);
+  f_101_010_100_101_1(uniques, 4);
+  f_101_010_100_110_0(uniques, 4);
+  f_101_010_100_110_1(uniques, 4);
+  f_101_010_100_111_0(uniques, 4);
+  f_101_010_100_111_1(uniques, 4);
+  f_101_010_101_000_0(uniques, 4);
+  f_101_010_101_000_1(uniques, 4);
+  f_101_010_101_001_0(uniques, 4);
+  f_101_010_101_001_1(uniques, 4);
+  f_101_010_101_010_0(uniques, 4);
+  f_101_010_101_010_1(uniques, 4);
+  f_101_010_101_011_0(uniques, 4);
+  f_101_010_101_011_1(uniques, 4);
+  f_101_010_101_100_0(uniques, 4);
+  f_101_010_101_100_1(uniques, 4);
+  f_101_010_101_101_0(uniques, 4);
+  f_101_010_101_101_1(uniques, 4);
+  f_101_010_101_110_0(uniques, 4);
+  f_101_010_101_110_1(uniques, 4);
+  f_101_010_101_111_0(uniques, 4);
+  f_101_010_101_111_1(uniques, 4);
+  f_101_010_110_000_0(uniques, 4);
+  f_101_010_110_000_1(uniques, 4);
+  f_101_010_110_001_0(uniques, 4);
+  f_101_010_110_001_1(uniques, 4);
+  f_101_010_110_010_0(uniques, 4);
+  f_101_010_110_010_1(uniques, 4);
+  f_101_010_110_011_0(uniques, 4);
+  f_101_010_110_011_1(uniques, 4);
+  f_101_010_110_100_0(uniques, 4);
+  f_101_010_110_100_1(uniques, 4);
+  f_101_010_110_101_0(uniques, 4);
+  f_101_010_110_101_1(uniques, 4);
+  f_101_010_110_110_0(uniques, 4);
+  f_101_010_110_110_1(uniques, 4);
+  f_101_010_110_111_0(uniques, 4);
+  f_101_010_110_111_1(uniques, 4);
+  f_101_010_111_000_0(uniques, 4);
+  f_101_010_111_000_1(uniques, 4);
+  f_101_010_111_001_0(uniques, 4);
+  f_101_010_111_001_1(uniques, 4);
+  f_101_010_111_010_0(uniques, 4);
+  f_101_010_111_010_1(uniques, 4);
+  f_101_010_111_011_0(uniques, 4);
+  f_101_010_111_011_1(uniques, 4);
+  f_101_010_111_100_0(uniques, 4);
+  f_101_010_111_100_1(uniques, 4);
+  f_101_010_111_101_0(uniques, 4);
+  f_101_010_111_101_1(uniques, 4);
+  f_101_010_111_110_0(uniques, 4);
+  f_101_010_111_110_1(uniques, 4);
+  f_101_010_111_111_0(uniques, 4);
+  f_101_010_111_111_1(uniques, 4);
+  f_101_011_000_000_0(uniques, 4);
+  f_101_011_000_000_1(uniques, 4);
+  f_101_011_000_001_0(uniques, 4);
+  f_101_011_000_001_1(uniques, 4);
+  f_101_011_000_010_0(uniques, 4);
+  f_101_011_000_010_1(uniques, 4);
+  f_101_011_000_011_0(uniques, 4);
+  f_101_011_000_011_1(uniques, 4);
+  f_101_011_000_100_0(uniques, 4);
+  f_101_011_000_100_1(uniques, 4);
+  f_101_011_000_101_0(uniques, 4);
+  f_101_011_000_101_1(uniques, 4);
+  f_101_011_000_110_0(uniques, 4);
+  f_101_011_000_110_1(uniques, 4);
+  f_101_011_000_111_0(uniques, 4);
+  f_101_011_000_111_1(uniques, 4);
+  f_101_011_001_000_0(uniques, 4);
+  f_101_011_001_000_1(uniques, 4);
+  f_101_011_001_001_0(uniques, 4);
+  f_101_011_001_001_1(uniques, 4);
+  f_101_011_001_010_0(uniques, 4);
+  f_101_011_001_010_1(uniques, 4);
+  f_101_011_001_011_0(uniques, 4);
+  f_101_011_001_011_1(uniques, 4);
+  f_101_011_001_100_0(uniques, 4);
+  f_101_011_001_100_1(uniques, 4);
+  f_101_011_001_101_0(uniques, 4);
+  f_101_011_001_101_1(uniques, 4);
+  f_101_011_001_110_0(uniques, 4);
+  f_101_011_001_110_1(uniques, 4);
+  f_101_011_001_111_0(uniques, 4);
+  f_101_011_001_111_1(uniques, 4);
+  f_101_011_010_000_0(uniques, 4);
+  f_101_011_010_000_1(uniques, 4);
+  f_101_011_010_001_0(uniques, 4);
+  f_101_011_010_001_1(uniques, 4);
+  f_101_011_010_010_0(uniques, 4);
+  f_101_011_010_010_1(uniques, 4);
+  f_101_011_010_011_0(uniques, 4);
+  f_101_011_010_011_1(uniques, 4);
+  f_101_011_010_100_0(uniques, 4);
+  f_101_011_010_100_1(uniques, 4);
+  f_101_011_010_101_0(uniques, 4);
+  f_101_011_010_101_1(uniques, 4);
+  f_101_011_010_110_0(uniques, 4);
+  f_101_011_010_110_1(uniques, 4);
+  f_101_011_010_111_0(uniques, 4);
+  f_101_011_010_111_1(uniques, 4);
+  f_101_011_011_000_0(uniques, 4);
+  f_101_011_011_000_1(uniques, 4);
+  f_101_011_011_001_0(uniques, 4);
+  f_101_011_011_001_1(uniques, 4);
+  f_101_011_011_010_0(uniques, 4);
+  f_101_011_011_010_1(uniques, 4);
+  f_101_011_011_011_0(uniques, 4);
+  f_101_011_011_011_1(uniques, 4);
+  f_101_011_011_100_0(uniques, 4);
+  f_101_011_011_100_1(uniques, 4);
+  f_101_011_011_101_0(uniques, 4);
+  f_101_011_011_101_1(uniques, 4);
+  f_101_011_011_110_0(uniques, 4);
+  f_101_011_011_110_1(uniques, 4);
+  f_101_011_011_111_0(uniques, 4);
+  f_101_011_011_111_1(uniques, 4);
+  f_101_011_100_000_0(uniques, 4);
+  f_101_011_100_000_1(uniques, 4);
+  f_101_011_100_001_0(uniques, 4);
+  f_101_011_100_001_1(uniques, 4);
+  f_101_011_100_010_0(uniques, 4);
+  f_101_011_100_010_1(uniques, 4);
+  f_101_011_100_011_0(uniques, 4);
+  f_101_011_100_011_1(uniques, 4);
+  f_101_011_100_100_0(uniques, 4);
+  f_101_011_100_100_1(uniques, 4);
+  f_101_011_100_101_0(uniques, 4);
+  f_101_011_100_101_1(uniques, 4);
+  f_101_011_100_110_0(uniques, 4);
+  f_101_011_100_110_1(uniques, 4);
+  f_101_011_100_111_0(uniques, 4);
+  f_101_011_100_111_1(uniques, 4);
+  f_101_011_101_000_0(uniques, 4);
+  f_101_011_101_000_1(uniques, 4);
+  f_101_011_101_001_0(uniques, 4);
+  f_101_011_101_001_1(uniques, 4);
+  f_101_011_101_010_0(uniques, 4);
+  f_101_011_101_010_1(uniques, 4);
+  f_101_011_101_011_0(uniques, 4);
+  f_101_011_101_011_1(uniques, 4);
+  f_101_011_101_100_0(uniques, 4);
+  f_101_011_101_100_1(uniques, 4);
+  f_101_011_101_101_0(uniques, 4);
+  f_101_011_101_101_1(uniques, 4);
+  f_101_011_101_110_0(uniques, 4);
+  f_101_011_101_110_1(uniques, 4);
+  f_101_011_101_111_0(uniques, 4);
+  f_101_011_101_111_1(uniques, 4);
+  f_101_011_110_000_0(uniques, 4);
+  f_101_011_110_000_1(uniques, 4);
+  f_101_011_110_001_0(uniques, 4);
+  f_101_011_110_001_1(uniques, 4);
+  f_101_011_110_010_0(uniques, 4);
+  f_101_011_110_010_1(uniques, 4);
+  f_101_011_110_011_0(uniques, 4);
+  f_101_011_110_011_1(uniques, 4);
+  f_101_011_110_100_0(uniques, 4);
+  f_101_011_110_100_1(uniques, 4);
+  f_101_011_110_101_0(uniques, 4);
+  f_101_011_110_101_1(uniques, 4);
+  f_101_011_110_110_0(uniques, 4);
+  f_101_011_110_110_1(uniques, 4);
+  f_101_011_110_111_0(uniques, 4);
+  f_101_011_110_111_1(uniques, 4);
+  f_101_011_111_000_0(uniques, 4);
+  f_101_011_111_000_1(uniques, 4);
+  f_101_011_111_001_0(uniques, 4);
+  f_101_011_111_001_1(uniques, 4);
+  f_101_011_111_010_0(uniques, 4);
+  f_101_011_111_010_1(uniques, 4);
+  f_101_011_111_011_0(uniques, 4);
+  f_101_011_111_011_1(uniques, 4);
+  f_101_011_111_100_0(uniques, 4);
+  f_101_011_111_100_1(uniques, 4);
+  f_101_011_111_101_0(uniques, 4);
+  f_101_011_111_101_1(uniques, 4);
+  f_101_011_111_110_0(uniques, 4);
+  f_101_011_111_110_1(uniques, 4);
+  f_101_011_111_111_0(uniques, 4);
+  f_101_011_111_111_1(uniques, 4);
+  f_101_110_000_000_0(uniques, 4);
+  f_101_110_000_000_1(uniques, 4);
+  f_101_110_000_001_0(uniques, 4);
+  f_101_110_000_001_1(uniques, 4);
+  f_101_110_000_010_0(uniques, 4);
+  f_101_110_000_010_1(uniques, 4);
+  f_101_110_000_011_0(uniques, 4);
+  f_101_110_000_011_1(uniques, 4);
+  f_101_110_000_100_0(uniques, 4);
+  f_101_110_000_100_1(uniques, 4);
+  f_101_110_000_101_0(uniques, 4);
+  f_101_110_000_101_1(uniques, 4);
+  f_101_110_000_110_0(uniques, 4);
+  f_101_110_000_110_1(uniques, 4);
+  f_101_110_000_111_0(uniques, 4);
+  f_101_110_000_111_1(uniques, 4);
+  f_101_110_001_000_0(uniques, 4);
+  f_101_110_001_000_1(uniques, 4);
+  f_101_110_001_001_0(uniques, 4);
+  f_101_110_001_001_1(uniques, 4);
+  f_101_110_001_010_0(uniques, 4);
+  f_101_110_001_010_1(uniques, 4);
+  f_101_110_001_011_0(uniques, 4);
+  f_101_110_001_011_1(uniques, 4);
+  f_101_110_001_100_0(uniques, 4);
+  f_101_110_001_100_1(uniques, 4);
+  f_101_110_001_101_0(uniques, 4);
+  f_101_110_001_101_1(uniques, 4);
+  f_101_110_001_110_0(uniques, 4);
+  f_101_110_001_110_1(uniques, 4);
+  f_101_110_001_111_0(uniques, 4);
+  f_101_110_001_111_1(uniques, 4);
+  f_101_110_010_000_0(uniques, 4);
+  f_101_110_010_000_1(uniques, 4);
+  f_101_110_010_001_0(uniques, 4);
+  f_101_110_010_001_1(uniques, 4);
+  f_101_110_010_010_0(uniques, 4);
+  f_101_110_010_010_1(uniques, 4);
+  f_101_110_010_011_0(uniques, 4);
+  f_101_110_010_011_1(uniques, 4);
+  f_101_110_010_100_0(uniques, 4);
+  f_101_110_010_100_1(uniques, 4);
+  f_101_110_010_101_0(uniques, 4);
+  f_101_110_010_101_1(uniques, 4);
+  f_101_110_010_110_0(uniques, 4);
+  f_101_110_010_110_1(uniques, 4);
+  f_101_110_010_111_0(uniques, 4);
+  f_101_110_010_111_1(uniques, 4);
+  f_101_110_011_000_0(uniques, 4);
+  f_101_110_011_000_1(uniques, 4);
+  f_101_110_011_001_0(uniques, 4);
+  f_101_110_011_001_1(uniques, 4);
+  f_101_110_011_010_0(uniques, 4);
+  f_101_110_011_010_1(uniques, 4);
+  f_101_110_011_011_0(uniques, 4);
+  f_101_110_011_011_1(uniques, 4);
+  f_101_110_011_100_0(uniques, 4);
+  f_101_110_011_100_1(uniques, 4);
+  f_101_110_011_101_0(uniques, 4);
+  f_101_110_011_101_1(uniques, 4);
+  f_101_110_011_110_0(uniques, 4);
+  f_101_110_011_110_1(uniques, 4);
+  f_101_110_011_111_0(uniques, 4);
+  f_101_110_011_111_1(uniques, 4);
+  f_101_110_100_000_0(uniques, 4);
+  f_101_110_100_000_1(uniques, 4);
+  f_101_110_100_001_0(uniques, 4);
+  f_101_110_100_001_1(uniques, 4);
+  f_101_110_100_010_0(uniques, 4);
+  f_101_110_100_010_1(uniques, 4);
+  f_101_110_100_011_0(uniques, 4);
+  f_101_110_100_011_1(uniques, 4);
+  f_101_110_100_100_0(uniques, 4);
+  f_101_110_100_100_1(uniques, 4);
+  f_101_110_100_101_0(uniques, 4);
+  f_101_110_100_101_1(uniques, 4);
+  f_101_110_100_110_0(uniques, 4);
+  f_101_110_100_110_1(uniques, 4);
+  f_101_110_100_111_0(uniques, 4);
+  f_101_110_100_111_1(uniques, 4);
+  f_101_110_101_000_0(uniques, 4);
+  f_101_110_101_000_1(uniques, 4);
+  f_101_110_101_001_0(uniques, 4);
+  f_101_110_101_001_1(uniques, 4);
+  f_101_110_101_010_0(uniques, 4);
+  f_101_110_101_010_1(uniques, 4);
+  f_101_110_101_011_0(uniques, 4);
+  f_101_110_101_011_1(uniques, 4);
+  f_101_110_101_100_0(uniques, 4);
+  f_101_110_101_100_1(uniques, 4);
+  f_101_110_101_101_0(uniques, 4);
+  f_101_110_101_101_1(uniques, 4);
+  f_101_110_101_110_0(uniques, 4);
+  f_101_110_101_110_1(uniques, 4);
+  f_101_110_101_111_0(uniques, 4);
+  f_101_110_101_111_1(uniques, 4);
+  f_101_110_110_000_0(uniques, 4);
+  f_101_110_110_000_1(uniques, 4);
+  f_101_110_110_001_0(uniques, 4);
+  f_101_110_110_001_1(uniques, 4);
+  f_101_110_110_010_0(uniques, 4);
+  f_101_110_110_010_1(uniques, 4);
+  f_101_110_110_011_0(uniques, 4);
+  f_101_110_110_011_1(uniques, 4);
+  f_101_110_110_100_0(uniques, 4);
+  f_101_110_110_100_1(uniques, 4);
+  f_101_110_110_101_0(uniques, 4);
+  f_101_110_110_101_1(uniques, 4);
+  f_101_110_110_110_0(uniques, 4);
+  f_101_110_110_110_1(uniques, 4);
+  f_101_110_110_111_0(uniques, 4);
+  f_101_110_110_111_1(uniques, 4);
+  f_101_110_111_000_0(uniques, 4);
+  f_101_110_111_000_1(uniques, 4);
+  f_101_110_111_001_0(uniques, 4);
+  f_101_110_111_001_1(uniques, 4);
+  f_101_110_111_010_0(uniques, 4);
+  f_101_110_111_010_1(uniques, 4);
+  f_101_110_111_011_0(uniques, 4);
+  f_101_110_111_011_1(uniques, 4);
+  f_101_110_111_100_0(uniques, 4);
+  f_101_110_111_100_1(uniques, 4);
+  f_101_110_111_101_0(uniques, 4);
+  f_101_110_111_101_1(uniques, 4);
+  f_101_110_111_110_0(uniques, 4);
+  f_101_110_111_110_1(uniques, 4);
+  f_101_110_111_111_0(uniques, 4);
+  f_101_110_111_111_1(uniques, 4);
+  f_101_111_000_000_0(uniques, 4);
+  f_101_111_000_000_1(uniques, 4);
+  f_101_111_000_001_0(uniques, 4);
+  f_101_111_000_001_1(uniques, 4);
+  f_101_111_000_010_0(uniques, 4);
+  f_101_111_000_010_1(uniques, 4);
+  f_101_111_000_011_0(uniques, 4);
+  f_101_111_000_011_1(uniques, 4);
+  f_101_111_000_100_0(uniques, 4);
+  f_101_111_000_100_1(uniques, 4);
+  f_101_111_000_101_0(uniques, 4);
+  f_101_111_000_101_1(uniques, 4);
+  f_101_111_000_110_0(uniques, 4);
+  f_101_111_000_110_1(uniques, 4);
+  f_101_111_000_111_0(uniques, 4);
+  f_101_111_000_111_1(uniques, 4);
+  f_101_111_001_000_0(uniques, 4);
+  f_101_111_001_000_1(uniques, 4);
+  f_101_111_001_001_0(uniques, 4);
+  f_101_111_001_001_1(uniques, 4);
+  f_101_111_001_010_0(uniques, 4);
+  f_101_111_001_010_1(uniques, 4);
+  f_101_111_001_011_0(uniques, 4);
+  f_101_111_001_011_1(uniques, 4);
+  f_101_111_001_100_0(uniques, 4);
+  f_101_111_001_100_1(uniques, 4);
+  f_101_111_001_101_0(uniques, 4);
+  f_101_111_001_101_1(uniques, 4);
+  f_101_111_001_110_0(uniques, 4);
+  f_101_111_001_110_1(uniques, 4);
+  f_101_111_001_111_0(uniques, 4);
+  f_101_111_001_111_1(uniques, 4);
+  f_101_111_010_000_0(uniques, 4);
+  f_101_111_010_000_1(uniques, 4);
+  f_101_111_010_001_0(uniques, 4);
+  f_101_111_010_001_1(uniques, 4);
+  f_101_111_010_010_0(uniques, 4);
+  f_101_111_010_010_1(uniques, 4);
+  f_101_111_010_011_0(uniques, 4);
+  f_101_111_010_011_1(uniques, 4);
+  f_101_111_010_100_0(uniques, 4);
+  f_101_111_010_100_1(uniques, 4);
+  f_101_111_010_101_0(uniques, 4);
+  f_101_111_010_101_1(uniques, 4);
+  f_101_111_010_110_0(uniques, 4);
+  f_101_111_010_110_1(uniques, 4);
+  f_101_111_010_111_0(uniques, 4);
+  f_101_111_010_111_1(uniques, 4);
+  f_101_111_011_000_0(uniques, 4);
+  f_101_111_011_000_1(uniques, 4);
+  f_101_111_011_001_0(uniques, 4);
+  f_101_111_011_001_1(uniques, 4);
+  f_101_111_011_010_0(uniques, 4);
+  f_101_111_011_010_1(uniques, 4);
+  f_101_111_011_011_0(uniques, 4);
+  f_101_111_011_011_1(uniques, 4);
+  f_101_111_011_100_0(uniques, 4);
+  f_101_111_011_100_1(uniques, 4);
+  f_101_111_011_101_0(uniques, 4);
+  f_101_111_011_101_1(uniques, 4);
+  f_101_111_011_110_0(uniques, 4);
+  f_101_111_011_110_1(uniques, 4);
+  f_101_111_011_111_0(uniques, 4);
+  f_101_111_011_111_1(uniques, 4);
+  f_101_111_100_000_0(uniques, 4);
+  f_101_111_100_000_1(uniques, 4);
+  f_101_111_100_001_0(uniques, 4);
+  f_101_111_100_001_1(uniques, 4);
+  f_101_111_100_010_0(uniques, 4);
+  f_101_111_100_010_1(uniques, 4);
+  f_101_111_100_011_0(uniques, 4);
+  f_101_111_100_011_1(uniques, 4);
+  f_101_111_100_100_0(uniques, 4);
+  f_101_111_100_100_1(uniques, 4);
+  f_101_111_100_101_0(uniques, 4);
+  f_101_111_100_101_1(uniques, 4);
+  f_101_111_100_110_0(uniques, 4);
+  f_101_111_100_110_1(uniques, 4);
+  f_101_111_100_111_0(uniques, 4);
+  f_101_111_100_111_1(uniques, 4);
+  f_101_111_101_000_0(uniques, 4);
+  f_101_111_101_000_1(uniques, 4);
+  f_101_111_101_001_0(uniques, 4);
+  f_101_111_101_001_1(uniques, 4);
+  f_101_111_101_010_0(uniques, 4);
+  f_101_111_101_010_1(uniques, 4);
+  f_101_111_101_011_0(uniques, 4);
+  f_101_111_101_011_1(uniques, 4);
+  f_101_111_101_100_0(uniques, 4);
+  f_101_111_101_100_1(uniques, 4);
+  f_101_111_101_101_0(uniques, 4);
+  f_101_111_101_101_1(uniques, 4);
+  f_101_111_101_110_0(uniques, 4);
+  f_101_111_101_110_1(uniques, 4);
+  f_101_111_101_111_0(uniques, 4);
+  f_101_111_101_111_1(uniques, 4);
+  f_101_111_110_000_0(uniques, 4);
+  f_101_111_110_000_1(uniques, 4);
+  f_101_111_110_001_0(uniques, 4);
+  f_101_111_110_001_1(uniques, 4);
+  f_101_111_110_010_0(uniques, 4);
+  f_101_111_110_010_1(uniques, 4);
+  f_101_111_110_011_0(uniques, 4);
+  f_101_111_110_011_1(uniques, 4);
+  f_101_111_110_100_0(uniques, 4);
+  f_101_111_110_100_1(uniques, 4);
+  f_101_111_110_101_0(uniques, 4);
+  f_101_111_110_101_1(uniques, 4);
+  f_101_111_110_110_0(uniques, 4);
+  f_101_111_110_110_1(uniques, 4);
+  f_101_111_110_111_0(uniques, 4);
+  f_101_111_110_111_1(uniques, 4);
+  f_101_111_111_000_0(uniques, 4);
+  f_101_111_111_000_1(uniques, 4);
+  f_101_111_111_001_0(uniques, 4);
+  f_101_111_111_001_1(uniques, 4);
+  f_101_111_111_010_0(uniques, 4);
+  f_101_111_111_010_1(uniques, 4);
+  f_101_111_111_011_0(uniques, 4);
+  f_101_111_111_011_1(uniques, 4);
+  f_101_111_111_100_0(uniques, 4);
+  f_101_111_111_100_1(uniques, 4);
+  f_101_111_111_101_0(uniques, 4);
+  f_101_111_111_101_1(uniques, 4);
+  f_101_111_111_110_0(uniques, 4);
+  f_101_111_111_110_1(uniques, 4);
+  f_101_111_111_111_0(uniques, 4);
+  f_101_111_111_111_1(uniques, 4);
+  f_110_010_000_000_0(uniques, 4);
+  f_110_010_000_000_1(uniques, 4);
+  f_110_010_000_001_0(uniques, 4);
+  f_110_010_000_001_1(uniques, 4);
+  f_110_010_000_010_0(uniques, 4);
+  f_110_010_000_010_1(uniques, 4);
+  f_110_010_000_011_0(uniques, 4);
+  f_110_010_000_011_1(uniques, 4);
+  f_110_010_000_100_0(uniques, 4);
+  f_110_010_000_100_1(uniques, 4);
+  f_110_010_000_101_0(uniques, 4);
+  f_110_010_000_101_1(uniques, 4);
+  f_110_010_000_110_0(uniques, 4);
+  f_110_010_000_110_1(uniques, 4);
+  f_110_010_000_111_0(uniques, 4);
+  f_110_010_000_111_1(uniques, 4);
+  f_110_010_001_000_0(uniques, 4);
+  f_110_010_001_000_1(uniques, 4);
+  f_110_010_001_001_0(uniques, 4);
+  f_110_010_001_001_1(uniques, 4);
+  f_110_010_001_010_0(uniques, 4);
+  f_110_010_001_010_1(uniques, 4);
+  f_110_010_001_011_0(uniques, 4);
+  f_110_010_001_011_1(uniques, 4);
+  f_110_010_001_100_0(uniques, 4);
+  f_110_010_001_100_1(uniques, 4);
+  f_110_010_001_101_0(uniques, 4);
+  f_110_010_001_101_1(uniques, 4);
+  f_110_010_001_110_0(uniques, 4);
+  f_110_010_001_110_1(uniques, 4);
+  f_110_010_001_111_0(uniques, 4);
+  f_110_010_001_111_1(uniques, 4);
+  f_110_010_010_000_0(uniques, 4);
+  f_110_010_010_000_1(uniques, 4);
+  f_110_010_010_001_0(uniques, 4);
+  f_110_010_010_001_1(uniques, 4);
+  f_110_010_010_010_0(uniques, 4);
+  f_110_010_010_010_1(uniques, 4);
+  f_110_010_010_011_0(uniques, 4);
+  f_110_010_010_011_1(uniques, 4);
+  f_110_010_010_100_0(uniques, 4);
+  f_110_010_010_100_1(uniques, 4);
+  f_110_010_010_101_0(uniques, 4);
+  f_110_010_010_101_1(uniques, 4);
+  f_110_010_010_110_0(uniques, 4);
+  f_110_010_010_110_1(uniques, 4);
+  f_110_010_010_111_0(uniques, 4);
+  f_110_010_010_111_1(uniques, 4);
+  f_110_010_011_000_0(uniques, 4);
+  f_110_010_011_000_1(uniques, 4);
+  f_110_010_011_001_0(uniques, 4);
+  f_110_010_011_001_1(uniques, 4);
+  f_110_010_011_010_0(uniques, 4);
+  f_110_010_011_010_1(uniques, 4);
+  f_110_010_011_011_0(uniques, 4);
+  f_110_010_011_011_1(uniques, 4);
+  f_110_010_011_100_0(uniques, 4);
+  f_110_010_011_100_1(uniques, 4);
+  f_110_010_011_101_0(uniques, 4);
+  f_110_010_011_101_1(uniques, 4);
+  f_110_010_011_110_0(uniques, 4);
+  f_110_010_011_110_1(uniques, 4);
+  f_110_010_011_111_0(uniques, 4);
+  f_110_010_011_111_1(uniques, 4);
+  f_110_010_100_000_0(uniques, 4);
+  f_110_010_100_000_1(uniques, 4);
+  f_110_010_100_001_0(uniques, 4);
+  f_110_010_100_001_1(uniques, 4);
+  f_110_010_100_010_0(uniques, 4);
+  f_110_010_100_010_1(uniques, 4);
+  f_110_010_100_011_0(uniques, 4);
+  f_110_010_100_011_1(uniques, 4);
+  f_110_010_100_100_0(uniques, 4);
+  f_110_010_100_100_1(uniques, 4);
+  f_110_010_100_101_0(uniques, 4);
+  f_110_010_100_101_1(uniques, 4);
+  f_110_010_100_110_0(uniques, 4);
+  f_110_010_100_110_1(uniques, 4);
+  f_110_010_100_111_0(uniques, 4);
+  f_110_010_100_111_1(uniques, 4);
+  f_110_010_101_000_0(uniques, 4);
+  f_110_010_101_000_1(uniques, 4);
+  f_110_010_101_001_0(uniques, 4);
+  f_110_010_101_001_1(uniques, 4);
+  f_110_010_101_010_0(uniques, 4);
+  f_110_010_101_010_1(uniques, 4);
+  f_110_010_101_011_0(uniques, 4);
+  f_110_010_101_011_1(uniques, 4);
+  f_110_010_101_100_0(uniques, 4);
+  f_110_010_101_100_1(uniques, 4);
+  f_110_010_101_101_0(uniques, 4);
+  f_110_010_101_101_1(uniques, 4);
+  f_110_010_101_110_0(uniques, 4);
+  f_110_010_101_110_1(uniques, 4);
+  f_110_010_101_111_0(uniques, 4);
+  f_110_010_101_111_1(uniques, 4);
+  f_110_010_110_000_0(uniques, 4);
+  f_110_010_110_000_1(uniques, 4);
+  f_110_010_110_001_0(uniques, 4);
+  f_110_010_110_001_1(uniques, 4);
+  f_110_010_110_010_0(uniques, 4);
+  f_110_010_110_010_1(uniques, 4);
+  f_110_010_110_011_0(uniques, 4);
+  f_110_010_110_011_1(uniques, 4);
+  f_110_010_110_100_0(uniques, 4);
+  f_110_010_110_100_1(uniques, 4);
+  f_110_010_110_101_0(uniques, 4);
+  f_110_010_110_101_1(uniques, 4);
+  f_110_010_110_110_0(uniques, 4);
+  f_110_010_110_110_1(uniques, 4);
+  f_110_010_110_111_0(uniques, 4);
+  f_110_010_110_111_1(uniques, 4);
+  f_110_010_111_000_0(uniques, 4);
+  f_110_010_111_000_1(uniques, 4);
+  f_110_010_111_001_0(uniques, 4);
+  f_110_010_111_001_1(uniques, 4);
+  f_110_010_111_010_0(uniques, 4);
+  f_110_010_111_010_1(uniques, 4);
+  f_110_010_111_011_0(uniques, 4);
+  f_110_010_111_011_1(uniques, 4);
+  f_110_010_111_100_0(uniques, 4);
+  f_110_010_111_100_1(uniques, 4);
+  f_110_010_111_101_0(uniques, 4);
+  f_110_010_111_101_1(uniques, 4);
+  f_110_010_111_110_0(uniques, 4);
+  f_110_010_111_110_1(uniques, 4);
+  f_110_010_111_111_0(uniques, 4);
+  f_110_010_111_111_1(uniques, 4);
+  f_110_011_000_000_0(uniques, 4);
+  f_110_011_000_000_1(uniques, 4);
+  f_110_011_000_001_0(uniques, 4);
+  f_110_011_000_001_1(uniques, 4);
+  f_110_011_000_010_0(uniques, 4);
+  f_110_011_000_010_1(uniques, 4);
+  f_110_011_000_011_0(uniques, 4);
+  f_110_011_000_011_1(uniques, 4);
+  f_110_011_000_100_0(uniques, 4);
+  f_110_011_000_100_1(uniques, 4);
+  f_110_011_000_101_0(uniques, 4);
+  f_110_011_000_101_1(uniques, 4);
+  f_110_011_000_110_0(uniques, 4);
+  f_110_011_000_110_1(uniques, 4);
+  f_110_011_000_111_0(uniques, 4);
+  f_110_011_000_111_1(uniques, 4);
+  f_110_011_001_000_0(uniques, 4);
+  f_110_011_001_000_1(uniques, 4);
+  f_110_011_001_001_0(uniques, 4);
+  f_110_011_001_001_1(uniques, 4);
+  f_110_011_001_010_0(uniques, 4);
+  f_110_011_001_010_1(uniques, 4);
+  f_110_011_001_011_0(uniques, 4);
+  f_110_011_001_011_1(uniques, 4);
+  f_110_011_001_100_0(uniques, 4);
+  f_110_011_001_100_1(uniques, 4);
+  f_110_011_001_101_0(uniques, 4);
+  f_110_011_001_101_1(uniques, 4);
+  f_110_011_001_110_0(uniques, 4);
+  f_110_011_001_110_1(uniques, 4);
+  f_110_011_001_111_0(uniques, 4);
+  f_110_011_001_111_1(uniques, 4);
+  f_110_011_010_000_0(uniques, 4);
+  f_110_011_010_000_1(uniques, 4);
+  f_110_011_010_001_0(uniques, 4);
+  f_110_011_010_001_1(uniques, 4);
+  f_110_011_010_010_0(uniques, 4);
+  f_110_011_010_010_1(uniques, 4);
+  f_110_011_010_011_0(uniques, 4);
+  f_110_011_010_011_1(uniques, 4);
+  f_110_011_010_100_0(uniques, 4);
+  f_110_011_010_100_1(uniques, 4);
+  f_110_011_010_101_0(uniques, 4);
+  f_110_011_010_101_1(uniques, 4);
+  f_110_011_010_110_0(uniques, 4);
+  f_110_011_010_110_1(uniques, 4);
+  f_110_011_010_111_0(uniques, 4);
+  f_110_011_010_111_1(uniques, 4);
+  f_110_011_011_000_0(uniques, 4);
+  f_110_011_011_000_1(uniques, 4);
+  f_110_011_011_001_0(uniques, 4);
+  f_110_011_011_001_1(uniques, 4);
+  f_110_011_011_010_0(uniques, 4);
+  f_110_011_011_010_1(uniques, 4);
+  f_110_011_011_011_0(uniques, 4);
+  f_110_011_011_011_1(uniques, 4);
+  f_110_011_011_100_0(uniques, 4);
+  f_110_011_011_100_1(uniques, 4);
+  f_110_011_011_101_0(uniques, 4);
+  f_110_011_011_101_1(uniques, 4);
+  f_110_011_011_110_0(uniques, 4);
+  f_110_011_011_110_1(uniques, 4);
+  f_110_011_011_111_0(uniques, 4);
+  f_110_011_011_111_1(uniques, 4);
+  f_110_011_100_000_0(uniques, 4);
+  f_110_011_100_000_1(uniques, 4);
+  f_110_011_100_001_0(uniques, 4);
+  f_110_011_100_001_1(uniques, 4);
+  f_110_011_100_010_0(uniques, 4);
+  f_110_011_100_010_1(uniques, 4);
+  f_110_011_100_011_0(uniques, 4);
+  f_110_011_100_011_1(uniques, 4);
+  f_110_011_100_100_0(uniques, 4);
+  f_110_011_100_100_1(uniques, 4);
+  f_110_011_100_101_0(uniques, 4);
+  f_110_011_100_101_1(uniques, 4);
+  f_110_011_100_110_0(uniques, 4);
+  f_110_011_100_110_1(uniques, 4);
+  f_110_011_100_111_0(uniques, 4);
+  f_110_011_100_111_1(uniques, 4);
+  f_110_011_101_000_0(uniques, 4);
+  f_110_011_101_000_1(uniques, 4);
+  f_110_011_101_001_0(uniques, 4);
+  f_110_011_101_001_1(uniques, 4);
+  f_110_011_101_010_0(uniques, 4);
+  f_110_011_101_010_1(uniques, 4);
+  f_110_011_101_011_0(uniques, 4);
+  f_110_011_101_011_1(uniques, 4);
+  f_110_011_101_100_0(uniques, 4);
+  f_110_011_101_100_1(uniques, 4);
+  f_110_011_101_101_0(uniques, 4);
+  f_110_011_101_101_1(uniques, 4);
+  f_110_011_101_110_0(uniques, 4);
+  f_110_011_101_110_1(uniques, 4);
+  f_110_011_101_111_0(uniques, 4);
+  f_110_011_101_111_1(uniques, 4);
+  f_110_011_110_000_0(uniques, 4);
+  f_110_011_110_000_1(uniques, 4);
+  f_110_011_110_001_0(uniques, 4);
+  f_110_011_110_001_1(uniques, 4);
+  f_110_011_110_010_0(uniques, 4);
+  f_110_011_110_010_1(uniques, 4);
+  f_110_011_110_011_0(uniques, 4);
+  f_110_011_110_011_1(uniques, 4);
+  f_110_011_110_100_0(uniques, 4);
+  f_110_011_110_100_1(uniques, 4);
+  f_110_011_110_101_0(uniques, 4);
+  f_110_011_110_101_1(uniques, 4);
+  f_110_011_110_110_0(uniques, 4);
+  f_110_011_110_110_1(uniques, 4);
+  f_110_011_110_111_0(uniques, 4);
+  f_110_011_110_111_1(uniques, 4);
+  f_110_011_111_000_0(uniques, 4);
+  f_110_011_111_000_1(uniques, 4);
+  f_110_011_111_001_0(uniques, 4);
+  f_110_011_111_001_1(uniques, 4);
+  f_110_011_111_010_0(uniques, 4);
+  f_110_011_111_010_1(uniques, 4);
+  f_110_011_111_011_0(uniques, 4);
+  f_110_011_111_011_1(uniques, 4);
+  f_110_011_111_100_0(uniques, 4);
+  f_110_011_111_100_1(uniques, 4);
+  f_110_011_111_101_0(uniques, 4);
+  f_110_011_111_101_1(uniques, 4);
+  f_110_011_111_110_0(uniques, 4);
+  f_110_011_111_110_1(uniques, 4);
+  f_110_011_111_111_0(uniques, 4);
+  f_110_011_111_111_1(uniques, 4);
+  f_110_110_000_000_0(uniques, 4);
+  f_110_110_000_000_1(uniques, 4);
+  f_110_110_000_001_0(uniques, 4);
+  f_110_110_000_001_1(uniques, 4);
+  f_110_110_000_010_0(uniques, 4);
+  f_110_110_000_010_1(uniques, 4);
+  f_110_110_000_011_0(uniques, 4);
+  f_110_110_000_011_1(uniques, 4);
+  f_110_110_000_100_0(uniques, 4);
+  f_110_110_000_100_1(uniques, 4);
+  f_110_110_000_101_0(uniques, 4);
+  f_110_110_000_101_1(uniques, 4);
+  f_110_110_000_110_0(uniques, 4);
+  f_110_110_000_110_1(uniques, 4);
+  f_110_110_000_111_0(uniques, 4);
+  f_110_110_000_111_1(uniques, 4);
+  f_110_110_001_000_0(uniques, 4);
+  f_110_110_001_000_1(uniques, 4);
+  f_110_110_001_001_0(uniques, 4);
+  f_110_110_001_001_1(uniques, 4);
+  f_110_110_001_010_0(uniques, 4);
+  f_110_110_001_010_1(uniques, 4);
+  f_110_110_001_011_0(uniques, 4);
+  f_110_110_001_011_1(uniques, 4);
+  f_110_110_001_100_0(uniques, 4);
+  f_110_110_001_100_1(uniques, 4);
+  f_110_110_001_101_0(uniques, 4);
+  f_110_110_001_101_1(uniques, 4);
+  f_110_110_001_110_0(uniques, 4);
+  f_110_110_001_110_1(uniques, 4);
+  f_110_110_001_111_0(uniques, 4);
+  f_110_110_001_111_1(uniques, 4);
+  f_110_110_010_000_0(uniques, 4);
+  f_110_110_010_000_1(uniques, 4);
+  f_110_110_010_001_0(uniques, 4);
+  f_110_110_010_001_1(uniques, 4);
+  f_110_110_010_010_0(uniques, 4);
+  f_110_110_010_010_1(uniques, 4);
+  f_110_110_010_011_0(uniques, 4);
+  f_110_110_010_011_1(uniques, 4);
+  f_110_110_010_100_0(uniques, 4);
+  f_110_110_010_100_1(uniques, 4);
+  f_110_110_010_101_0(uniques, 4);
+  f_110_110_010_101_1(uniques, 4);
+  f_110_110_010_110_0(uniques, 4);
+  f_110_110_010_110_1(uniques, 4);
+  f_110_110_010_111_0(uniques, 4);
+  f_110_110_010_111_1(uniques, 4);
+  f_110_110_011_000_0(uniques, 4);
+  f_110_110_011_000_1(uniques, 4);
+  f_110_110_011_001_0(uniques, 4);
+  f_110_110_011_001_1(uniques, 4);
+  f_110_110_011_010_0(uniques, 4);
+  f_110_110_011_010_1(uniques, 4);
+  f_110_110_011_011_0(uniques, 4);
+  f_110_110_011_011_1(uniques, 4);
+  f_110_110_011_100_0(uniques, 4);
+  f_110_110_011_100_1(uniques, 4);
+  f_110_110_011_101_0(uniques, 4);
+  f_110_110_011_101_1(uniques, 4);
+  f_110_110_011_110_0(uniques, 4);
+  f_110_110_011_110_1(uniques, 4);
+  f_110_110_011_111_0(uniques, 4);
+  f_110_110_011_111_1(uniques, 4);
+  f_110_110_100_000_0(uniques, 4);
+  f_110_110_100_000_1(uniques, 4);
+  f_110_110_100_001_0(uniques, 4);
+  f_110_110_100_001_1(uniques, 4);
+  f_110_110_100_010_0(uniques, 4);
+  f_110_110_100_010_1(uniques, 4);
+  f_110_110_100_011_0(uniques, 4);
+  f_110_110_100_011_1(uniques, 4);
+  f_110_110_100_100_0(uniques, 4);
+  f_110_110_100_100_1(uniques, 4);
+  f_110_110_100_101_0(uniques, 4);
+  f_110_110_100_101_1(uniques, 4);
+  f_110_110_100_110_0(uniques, 4);
+  f_110_110_100_110_1(uniques, 4);
+  f_110_110_100_111_0(uniques, 4);
+  f_110_110_100_111_1(uniques, 4);
+  f_110_110_101_000_0(uniques, 4);
+  f_110_110_101_000_1(uniques, 4);
+  f_110_110_101_001_0(uniques, 4);
+  f_110_110_101_001_1(uniques, 4);
+  f_110_110_101_010_0(uniques, 4);
+  f_110_110_101_010_1(uniques, 4);
+  f_110_110_101_011_0(uniques, 4);
+  f_110_110_101_011_1(uniques, 4);
+  f_110_110_101_100_0(uniques, 4);
+  f_110_110_101_100_1(uniques, 4);
+  f_110_110_101_101_0(uniques, 4);
+  f_110_110_101_101_1(uniques, 4);
+  f_110_110_101_110_0(uniques, 4);
+  f_110_110_101_110_1(uniques, 4);
+  f_110_110_101_111_0(uniques, 4);
+  f_110_110_101_111_1(uniques, 4);
+  f_110_110_110_000_0(uniques, 4);
+  f_110_110_110_000_1(uniques, 4);
+  f_110_110_110_001_0(uniques, 4);
+  f_110_110_110_001_1(uniques, 4);
+  f_110_110_110_010_0(uniques, 4);
+  f_110_110_110_010_1(uniques, 4);
+  f_110_110_110_011_0(uniques, 4);
+  f_110_110_110_011_1(uniques, 4);
+  f_110_110_110_100_0(uniques, 4);
+  f_110_110_110_100_1(uniques, 4);
+  f_110_110_110_101_0(uniques, 4);
+  f_110_110_110_101_1(uniques, 4);
+  f_110_110_110_110_0(uniques, 4);
+  f_110_110_110_110_1(uniques, 4);
+  f_110_110_110_111_0(uniques, 4);
+  f_110_110_110_111_1(uniques, 4);
+  f_110_110_111_000_0(uniques, 4);
+  f_110_110_111_000_1(uniques, 4);
+  f_110_110_111_001_0(uniques, 4);
+  f_110_110_111_001_1(uniques, 4);
+  f_110_110_111_010_0(uniques, 4);
+  f_110_110_111_010_1(uniques, 4);
+  f_110_110_111_011_0(uniques, 4);
+  f_110_110_111_011_1(uniques, 4);
+  f_110_110_111_100_0(uniques, 4);
+  f_110_110_111_100_1(uniques, 4);
+  f_110_110_111_101_0(uniques, 4);
+  f_110_110_111_101_1(uniques, 4);
+  f_110_110_111_110_0(uniques, 4);
+  f_110_110_111_110_1(uniques, 4);
+  f_110_110_111_111_0(uniques, 4);
+  f_110_110_111_111_1(uniques, 4);
+  f_110_111_000_000_0(uniques, 4);
+  f_110_111_000_000_1(uniques, 4);
+  f_110_111_000_001_0(uniques, 4);
+  f_110_111_000_001_1(uniques, 4);
+  f_110_111_000_010_0(uniques, 4);
+  f_110_111_000_010_1(uniques, 4);
+  f_110_111_000_011_0(uniques, 4);
+  f_110_111_000_011_1(uniques, 4);
+  f_110_111_000_100_0(uniques, 4);
+  f_110_111_000_100_1(uniques, 4);
+  f_110_111_000_101_0(uniques, 4);
+  f_110_111_000_101_1(uniques, 4);
+  f_110_111_000_110_0(uniques, 4);
+  f_110_111_000_110_1(uniques, 4);
+  f_110_111_000_111_0(uniques, 4);
+  f_110_111_000_111_1(uniques, 4);
+  f_110_111_001_000_0(uniques, 4);
+  f_110_111_001_000_1(uniques, 4);
+  f_110_111_001_001_0(uniques, 4);
+  f_110_111_001_001_1(uniques, 4);
+  f_110_111_001_010_0(uniques, 4);
+  f_110_111_001_010_1(uniques, 4);
+  f_110_111_001_011_0(uniques, 4);
+  f_110_111_001_011_1(uniques, 4);
+  f_110_111_001_100_0(uniques, 4);
+  f_110_111_001_100_1(uniques, 4);
+  f_110_111_001_101_0(uniques, 4);
+  f_110_111_001_101_1(uniques, 4);
+  f_110_111_001_110_0(uniques, 4);
+  f_110_111_001_110_1(uniques, 4);
+  f_110_111_001_111_0(uniques, 4);
+  f_110_111_001_111_1(uniques, 4);
+  f_110_111_010_000_0(uniques, 4);
+  f_110_111_010_000_1(uniques, 4);
+  f_110_111_010_001_0(uniques, 4);
+  f_110_111_010_001_1(uniques, 4);
+  f_110_111_010_010_0(uniques, 4);
+  f_110_111_010_010_1(uniques, 4);
+  f_110_111_010_011_0(uniques, 4);
+  f_110_111_010_011_1(uniques, 4);
+  f_110_111_010_100_0(uniques, 4);
+  f_110_111_010_100_1(uniques, 4);
+  f_110_111_010_101_0(uniques, 4);
+  f_110_111_010_101_1(uniques, 4);
+  f_110_111_010_110_0(uniques, 4);
+  f_110_111_010_110_1(uniques, 4);
+  f_110_111_010_111_0(uniques, 4);
+  f_110_111_010_111_1(uniques, 4);
+  f_110_111_011_000_0(uniques, 4);
+  f_110_111_011_000_1(uniques, 4);
+  f_110_111_011_001_0(uniques, 4);
+  f_110_111_011_001_1(uniques, 4);
+  f_110_111_011_010_0(uniques, 4);
+  f_110_111_011_010_1(uniques, 4);
+  f_110_111_011_011_0(uniques, 4);
+  f_110_111_011_011_1(uniques, 4);
+  f_110_111_011_100_0(uniques, 4);
+  f_110_111_011_100_1(uniques, 4);
+  f_110_111_011_101_0(uniques, 4);
+  f_110_111_011_101_1(uniques, 4);
+  f_110_111_011_110_0(uniques, 4);
+  f_110_111_011_110_1(uniques, 4);
+  f_110_111_011_111_0(uniques, 4);
+  f_110_111_011_111_1(uniques, 4);
+  f_110_111_100_000_0(uniques, 4);
+  f_110_111_100_000_1(uniques, 4);
+  f_110_111_100_001_0(uniques, 4);
+  f_110_111_100_001_1(uniques, 4);
+  f_110_111_100_010_0(uniques, 4);
+  f_110_111_100_010_1(uniques, 4);
+  f_110_111_100_011_0(uniques, 4);
+  f_110_111_100_011_1(uniques, 4);
+  f_110_111_100_100_0(uniques, 4);
+  f_110_111_100_100_1(uniques, 4);
+  f_110_111_100_101_0(uniques, 4);
+  f_110_111_100_101_1(uniques, 4);
+  f_110_111_100_110_0(uniques, 4);
+  f_110_111_100_110_1(uniques, 4);
+  f_110_111_100_111_0(uniques, 4);
+  f_110_111_100_111_1(uniques, 4);
+  f_110_111_101_000_0(uniques, 4);
+  f_110_111_101_000_1(uniques, 4);
+  f_110_111_101_001_0(uniques, 4);
+  f_110_111_101_001_1(uniques, 4);
+  f_110_111_101_010_0(uniques, 4);
+  f_110_111_101_010_1(uniques, 4);
+  f_110_111_101_011_0(uniques, 4);
+  f_110_111_101_011_1(uniques, 4);
+  f_110_111_101_100_0(uniques, 4);
+  f_110_111_101_100_1(uniques, 4);
+  f_110_111_101_101_0(uniques, 4);
+  f_110_111_101_101_1(uniques, 4);
+  f_110_111_101_110_0(uniques, 4);
+  f_110_111_101_110_1(uniques, 4);
+  f_110_111_101_111_0(uniques, 4);
+  f_110_111_101_111_1(uniques, 4);
+  f_110_111_110_000_0(uniques, 4);
+  f_110_111_110_000_1(uniques, 4);
+  f_110_111_110_001_0(uniques, 4);
+  f_110_111_110_001_1(uniques, 4);
+  f_110_111_110_010_0(uniques, 4);
+  f_110_111_110_010_1(uniques, 4);
+  f_110_111_110_011_0(uniques, 4);
+  f_110_111_110_011_1(uniques, 4);
+  f_110_111_110_100_0(uniques, 4);
+  f_110_111_110_100_1(uniques, 4);
+  f_110_111_110_101_0(uniques, 4);
+  f_110_111_110_101_1(uniques, 4);
+  f_110_111_110_110_0(uniques, 4);
+  f_110_111_110_110_1(uniques, 4);
+  f_110_111_110_111_0(uniques, 4);
+  f_110_111_110_111_1(uniques, 4);
+  f_110_111_111_000_0(uniques, 4);
+  f_110_111_111_000_1(uniques, 4);
+  f_110_111_111_001_0(uniques, 4);
+  f_110_111_111_001_1(uniques, 4);
+  f_110_111_111_010_0(uniques, 4);
+  f_110_111_111_010_1(uniques, 4);
+  f_110_111_111_011_0(uniques, 4);
+  f_110_111_111_011_1(uniques, 4);
+  f_110_111_111_100_0(uniques, 4);
+  f_110_111_111_100_1(uniques, 4);
+  f_110_111_111_101_0(uniques, 4);
+  f_110_111_111_101_1(uniques, 4);
+  f_110_111_111_110_0(uniques, 4);
+  f_110_111_111_110_1(uniques, 4);
+  f_110_111_111_111_0(uniques, 4);
+  f_110_111_111_111_1(uniques, 4);
+  f_111_010_000_000_0(uniques, 4);
+  f_111_010_000_000_1(uniques, 4);
+  f_111_010_000_001_0(uniques, 4);
+  f_111_010_000_001_1(uniques, 4);
+  f_111_010_000_010_0(uniques, 4);
+  f_111_010_000_010_1(uniques, 4);
+  f_111_010_000_011_0(uniques, 4);
+  f_111_010_000_011_1(uniques, 4);
+  f_111_010_000_100_0(uniques, 4);
+  f_111_010_000_100_1(uniques, 4);
+  f_111_010_000_101_0(uniques, 4);
+  f_111_010_000_101_1(uniques, 4);
+  f_111_010_000_110_0(uniques, 4);
+  f_111_010_000_110_1(uniques, 4);
+  f_111_010_000_111_0(uniques, 4);
+  f_111_010_000_111_1(uniques, 4);
+  f_111_010_001_000_0(uniques, 4);
+  f_111_010_001_000_1(uniques, 4);
+  f_111_010_001_001_0(uniques, 4);
+  f_111_010_001_001_1(uniques, 4);
+  f_111_010_001_010_0(uniques, 4);
+  f_111_010_001_010_1(uniques, 4);
+  f_111_010_001_011_0(uniques, 4);
+  f_111_010_001_011_1(uniques, 4);
+  f_111_010_001_100_0(uniques, 4);
+  f_111_010_001_100_1(uniques, 4);
+  f_111_010_001_101_0(uniques, 4);
+  f_111_010_001_101_1(uniques, 4);
+  f_111_010_001_110_0(uniques, 4);
+  f_111_010_001_110_1(uniques, 4);
+  f_111_010_001_111_0(uniques, 4);
+  f_111_010_001_111_1(uniques, 4);
+  f_111_010_010_000_0(uniques, 4);
+  f_111_010_010_000_1(uniques, 4);
+  f_111_010_010_001_0(uniques, 4);
+  f_111_010_010_001_1(uniques, 4);
+  f_111_010_010_010_0(uniques, 4);
+  f_111_010_010_010_1(uniques, 4);
+  f_111_010_010_011_0(uniques, 4);
+  f_111_010_010_011_1(uniques, 4);
+  f_111_010_010_100_0(uniques, 4);
+  f_111_010_010_100_1(uniques, 4);
+  f_111_010_010_101_0(uniques, 4);
+  f_111_010_010_101_1(uniques, 4);
+  f_111_010_010_110_0(uniques, 4);
+  f_111_010_010_110_1(uniques, 4);
+  f_111_010_010_111_0(uniques, 4);
+  f_111_010_010_111_1(uniques, 4);
+  f_111_010_011_000_0(uniques, 4);
+  f_111_010_011_000_1(uniques, 4);
+  f_111_010_011_001_0(uniques, 4);
+  f_111_010_011_001_1(uniques, 4);
+  f_111_010_011_010_0(uniques, 4);
+  f_111_010_011_010_1(uniques, 4);
+  f_111_010_011_011_0(uniques, 4);
+  f_111_010_011_011_1(uniques, 4);
+  f_111_010_011_100_0(uniques, 4);
+  f_111_010_011_100_1(uniques, 4);
+  f_111_010_011_101_0(uniques, 4);
+  f_111_010_011_101_1(uniques, 4);
+  f_111_010_011_110_0(uniques, 4);
+  f_111_010_011_110_1(uniques, 4);
+  f_111_010_011_111_0(uniques, 4);
+  f_111_010_011_111_1(uniques, 4);
+  f_111_010_100_000_0(uniques, 4);
+  f_111_010_100_000_1(uniques, 4);
+  f_111_010_100_001_0(uniques, 4);
+  f_111_010_100_001_1(uniques, 4);
+  f_111_010_100_010_0(uniques, 4);
+  f_111_010_100_010_1(uniques, 4);
+  f_111_010_100_011_0(uniques, 4);
+  f_111_010_100_011_1(uniques, 4);
+  f_111_010_100_100_0(uniques, 4);
+  f_111_010_100_100_1(uniques, 4);
+  f_111_010_100_101_0(uniques, 4);
+  f_111_010_100_101_1(uniques, 4);
+  f_111_010_100_110_0(uniques, 4);
+  f_111_010_100_110_1(uniques, 4);
+  f_111_010_100_111_0(uniques, 4);
+  f_111_010_100_111_1(uniques, 4);
+  f_111_010_101_000_0(uniques, 4);
+  f_111_010_101_000_1(uniques, 4);
+  f_111_010_101_001_0(uniques, 4);
+  f_111_010_101_001_1(uniques, 4);
+  f_111_010_101_010_0(uniques, 4);
+  f_111_010_101_010_1(uniques, 4);
+  f_111_010_101_011_0(uniques, 4);
+  f_111_010_101_011_1(uniques, 4);
+  f_111_010_101_100_0(uniques, 4);
+  f_111_010_101_100_1(uniques, 4);
+  f_111_010_101_101_0(uniques, 4);
+  f_111_010_101_101_1(uniques, 4);
+  f_111_010_101_110_0(uniques, 4);
+  f_111_010_101_110_1(uniques, 4);
+  f_111_010_101_111_0(uniques, 4);
+  f_111_010_101_111_1(uniques, 4);
+  f_111_010_110_000_0(uniques, 4);
+  f_111_010_110_000_1(uniques, 4);
+  f_111_010_110_001_0(uniques, 4);
+  f_111_010_110_001_1(uniques, 4);
+  f_111_010_110_010_0(uniques, 4);
+  f_111_010_110_010_1(uniques, 4);
+  f_111_010_110_011_0(uniques, 4);
+  f_111_010_110_011_1(uniques, 4);
+  f_111_010_110_100_0(uniques, 4);
+  f_111_010_110_100_1(uniques, 4);
+  f_111_010_110_101_0(uniques, 4);
+  f_111_010_110_101_1(uniques, 4);
+  f_111_010_110_110_0(uniques, 4);
+  f_111_010_110_110_1(uniques, 4);
+  f_111_010_110_111_0(uniques, 4);
+  f_111_010_110_111_1(uniques, 4);
+  f_111_010_111_000_0(uniques, 4);
+  f_111_010_111_000_1(uniques, 4);
+  f_111_010_111_001_0(uniques, 4);
+  f_111_010_111_001_1(uniques, 4);
+  f_111_010_111_010_0(uniques, 4);
+  f_111_010_111_010_1(uniques, 4);
+  f_111_010_111_011_0(uniques, 4);
+  f_111_010_111_011_1(uniques, 4);
+  f_111_010_111_100_0(uniques, 4);
+  f_111_010_111_100_1(uniques, 4);
+  f_111_010_111_101_0(uniques, 4);
+  f_111_010_111_101_1(uniques, 4);
+  f_111_010_111_110_0(uniques, 4);
+  f_111_010_111_110_1(uniques, 4);
+  f_111_010_111_111_0(uniques, 4);
+  f_111_010_111_111_1(uniques, 4);
+  f_111_011_000_000_0(uniques, 4);
+  f_111_011_000_000_1(uniques, 4);
+  f_111_011_000_001_0(uniques, 4);
+  f_111_011_000_001_1(uniques, 4);
+  f_111_011_000_010_0(uniques, 4);
+  f_111_011_000_010_1(uniques, 4);
+  f_111_011_000_011_0(uniques, 4);
+  f_111_011_000_011_1(uniques, 4);
+  f_111_011_000_100_0(uniques, 4);
+  f_111_011_000_100_1(uniques, 4);
+  f_111_011_000_101_0(uniques, 4);
+  f_111_011_000_101_1(uniques, 4);
+  f_111_011_000_110_0(uniques, 4);
+  f_111_011_000_110_1(uniques, 4);
+  f_111_011_000_111_0(uniques, 4);
+  f_111_011_000_111_1(uniques, 4);
+  f_111_011_001_000_0(uniques, 4);
+  f_111_011_001_000_1(uniques, 4);
+  f_111_011_001_001_0(uniques, 4);
+  f_111_011_001_001_1(uniques, 4);
+  f_111_011_001_010_0(uniques, 4);
+  f_111_011_001_010_1(uniques, 4);
+  f_111_011_001_011_0(uniques, 4);
+  f_111_011_001_011_1(uniques, 4);
+  f_111_011_001_100_0(uniques, 4);
+  f_111_011_001_100_1(uniques, 4);
+  f_111_011_001_101_0(uniques, 4);
+  f_111_011_001_101_1(uniques, 4);
+  f_111_011_001_110_0(uniques, 4);
+  f_111_011_001_110_1(uniques, 4);
+  f_111_011_001_111_0(uniques, 4);
+  f_111_011_001_111_1(uniques, 4);
+  f_111_011_010_000_0(uniques, 4);
+  f_111_011_010_000_1(uniques, 4);
+  f_111_011_010_001_0(uniques, 4);
+  f_111_011_010_001_1(uniques, 4);
+  f_111_011_010_010_0(uniques, 4);
+  f_111_011_010_010_1(uniques, 4);
+  f_111_011_010_011_0(uniques, 4);
+  f_111_011_010_011_1(uniques, 4);
+  f_111_011_010_100_0(uniques, 4);
+  f_111_011_010_100_1(uniques, 4);
+  f_111_011_010_101_0(uniques, 4);
+  f_111_011_010_101_1(uniques, 4);
+  f_111_011_010_110_0(uniques, 4);
+  f_111_011_010_110_1(uniques, 4);
+  f_111_011_010_111_0(uniques, 4);
+  f_111_011_010_111_1(uniques, 4);
+  f_111_011_011_000_0(uniques, 4);
+  f_111_011_011_000_1(uniques, 4);
+  f_111_011_011_001_0(uniques, 4);
+  f_111_011_011_001_1(uniques, 4);
+  f_111_011_011_010_0(uniques, 4);
+  f_111_011_011_010_1(uniques, 4);
+  f_111_011_011_011_0(uniques, 4);
+  f_111_011_011_011_1(uniques, 4);
+  f_111_011_011_100_0(uniques, 4);
+  f_111_011_011_100_1(uniques, 4);
+  f_111_011_011_101_0(uniques, 4);
+  f_111_011_011_101_1(uniques, 4);
+  f_111_011_011_110_0(uniques, 4);
+  f_111_011_011_110_1(uniques, 4);
+  f_111_011_011_111_0(uniques, 4);
+  f_111_011_011_111_1(uniques, 4);
+  f_111_011_100_000_0(uniques, 4);
+  f_111_011_100_000_1(uniques, 4);
+  f_111_011_100_001_0(uniques, 4);
+  f_111_011_100_001_1(uniques, 4);
+  f_111_011_100_010_0(uniques, 4);
+  f_111_011_100_010_1(uniques, 4);
+  f_111_011_100_011_0(uniques, 4);
+  f_111_011_100_011_1(uniques, 4);
+  f_111_011_100_100_0(uniques, 4);
+  f_111_011_100_100_1(uniques, 4);
+  f_111_011_100_101_0(uniques, 4);
+  f_111_011_100_101_1(uniques, 4);
+  f_111_011_100_110_0(uniques, 4);
+  f_111_011_100_110_1(uniques, 4);
+  f_111_011_100_111_0(uniques, 4);
+  f_111_011_100_111_1(uniques, 4);
+  f_111_011_101_000_0(uniques, 4);
+  f_111_011_101_000_1(uniques, 4);
+  f_111_011_101_001_0(uniques, 4);
+  f_111_011_101_001_1(uniques, 4);
+  f_111_011_101_010_0(uniques, 4);
+  f_111_011_101_010_1(uniques, 4);
+  f_111_011_101_011_0(uniques, 4);
+  f_111_011_101_011_1(uniques, 4);
+  f_111_011_101_100_0(uniques, 4);
+  f_111_011_101_100_1(uniques, 4);
+  f_111_011_101_101_0(uniques, 4);
+  f_111_011_101_101_1(uniques, 4);
+  f_111_011_101_110_0(uniques, 4);
+  f_111_011_101_110_1(uniques, 4);
+  f_111_011_101_111_0(uniques, 4);
+  f_111_011_101_111_1(uniques, 4);
+  f_111_011_110_000_0(uniques, 4);
+  f_111_011_110_000_1(uniques, 4);
+  f_111_011_110_001_0(uniques, 4);
+  f_111_011_110_001_1(uniques, 4);
+  f_111_011_110_010_0(uniques, 4);
+  f_111_011_110_010_1(uniques, 4);
+  f_111_011_110_011_0(uniques, 4);
+  f_111_011_110_011_1(uniques, 4);
+  f_111_011_110_100_0(uniques, 4);
+  f_111_011_110_100_1(uniques, 4);
+  f_111_011_110_101_0(uniques, 4);
+  f_111_011_110_101_1(uniques, 4);
+  f_111_011_110_110_0(uniques, 4);
+  f_111_011_110_110_1(uniques, 4);
+  f_111_011_110_111_0(uniques, 4);
+  f_111_011_110_111_1(uniques, 4);
+  f_111_011_111_000_0(uniques, 4);
+  f_111_011_111_000_1(uniques, 4);
+  f_111_011_111_001_0(uniques, 4);
+  f_111_011_111_001_1(uniques, 4);
+  f_111_011_111_010_0(uniques, 4);
+  f_111_011_111_010_1(uniques, 4);
+  f_111_011_111_011_0(uniques, 4);
+  f_111_011_111_011_1(uniques, 4);
+  f_111_011_111_100_0(uniques, 4);
+  f_111_011_111_100_1(uniques, 4);
+  f_111_011_111_101_0(uniques, 4);
+  f_111_011_111_101_1(uniques, 4);
+  f_111_011_111_110_0(uniques, 4);
+  f_111_011_111_110_1(uniques, 4);
+  f_111_011_111_111_0(uniques, 4);
+  f_111_011_111_111_1(uniques, 4);
+  f_111_110_000_000_0(uniques, 4);
+  f_111_110_000_000_1(uniques, 4);
+  f_111_110_000_001_0(uniques, 4);
+  f_111_110_000_001_1(uniques, 4);
+  f_111_110_000_010_0(uniques, 4);
+  f_111_110_000_010_1(uniques, 4);
+  f_111_110_000_011_0(uniques, 4);
+  f_111_110_000_011_1(uniques, 4);
+  f_111_110_000_100_0(uniques, 4);
+  f_111_110_000_100_1(uniques, 4);
+  f_111_110_000_101_0(uniques, 4);
+  f_111_110_000_101_1(uniques, 4);
+  f_111_110_000_110_0(uniques, 4);
+  f_111_110_000_110_1(uniques, 4);
+  f_111_110_000_111_0(uniques, 4);
+  f_111_110_000_111_1(uniques, 4);
+  f_111_110_001_000_0(uniques, 4);
+  f_111_110_001_000_1(uniques, 4);
+  f_111_110_001_001_0(uniques, 4);
+  f_111_110_001_001_1(uniques, 4);
+  f_111_110_001_010_0(uniques, 4);
+  f_111_110_001_010_1(uniques, 4);
+  f_111_110_001_011_0(uniques, 4);
+  f_111_110_001_011_1(uniques, 4);
+  f_111_110_001_100_0(uniques, 4);
+  f_111_110_001_100_1(uniques, 4);
+  f_111_110_001_101_0(uniques, 4);
+  f_111_110_001_101_1(uniques, 4);
+  f_111_110_001_110_0(uniques, 4);
+  f_111_110_001_110_1(uniques, 4);
+  f_111_110_001_111_0(uniques, 4);
+  f_111_110_001_111_1(uniques, 4);
+  f_111_110_010_000_0(uniques, 4);
+  f_111_110_010_000_1(uniques, 4);
+  f_111_110_010_001_0(uniques, 4);
+  f_111_110_010_001_1(uniques, 4);
+  f_111_110_010_010_0(uniques, 4);
+  f_111_110_010_010_1(uniques, 4);
+  f_111_110_010_011_0(uniques, 4);
+  f_111_110_010_011_1(uniques, 4);
+  f_111_110_010_100_0(uniques, 4);
+  f_111_110_010_100_1(uniques, 4);
+  f_111_110_010_101_0(uniques, 4);
+  f_111_110_010_101_1(uniques, 4);
+  f_111_110_010_110_0(uniques, 4);
+  f_111_110_010_110_1(uniques, 4);
+  f_111_110_010_111_0(uniques, 4);
+  f_111_110_010_111_1(uniques, 4);
+  f_111_110_011_000_0(uniques, 4);
+  f_111_110_011_000_1(uniques, 4);
+  f_111_110_011_001_0(uniques, 4);
+  f_111_110_011_001_1(uniques, 4);
+  f_111_110_011_010_0(uniques, 4);
+  f_111_110_011_010_1(uniques, 4);
+  f_111_110_011_011_0(uniques, 4);
+  f_111_110_011_011_1(uniques, 4);
+  f_111_110_011_100_0(uniques, 4);
+  f_111_110_011_100_1(uniques, 4);
+  f_111_110_011_101_0(uniques, 4);
+  f_111_110_011_101_1(uniques, 4);
+  f_111_110_011_110_0(uniques, 4);
+  f_111_110_011_110_1(uniques, 4);
+  f_111_110_011_111_0(uniques, 4);
+  f_111_110_011_111_1(uniques, 4);
+  f_111_110_100_000_0(uniques, 4);
+  f_111_110_100_000_1(uniques, 4);
+  f_111_110_100_001_0(uniques, 4);
+  f_111_110_100_001_1(uniques, 4);
+  f_111_110_100_010_0(uniques, 4);
+  f_111_110_100_010_1(uniques, 4);
+  f_111_110_100_011_0(uniques, 4);
+  f_111_110_100_011_1(uniques, 4);
+  f_111_110_100_100_0(uniques, 4);
+  f_111_110_100_100_1(uniques, 4);
+  f_111_110_100_101_0(uniques, 4);
+  f_111_110_100_101_1(uniques, 4);
+  f_111_110_100_110_0(uniques, 4);
+  f_111_110_100_110_1(uniques, 4);
+  f_111_110_100_111_0(uniques, 4);
+  f_111_110_100_111_1(uniques, 4);
+  f_111_110_101_000_0(uniques, 4);
+  f_111_110_101_000_1(uniques, 4);
+  f_111_110_101_001_0(uniques, 4);
+  f_111_110_101_001_1(uniques, 4);
+  f_111_110_101_010_0(uniques, 4);
+  f_111_110_101_010_1(uniques, 4);
+  f_111_110_101_011_0(uniques, 4);
+  f_111_110_101_011_1(uniques, 4);
+  f_111_110_101_100_0(uniques, 4);
+  f_111_110_101_100_1(uniques, 4);
+  f_111_110_101_101_0(uniques, 4);
+  f_111_110_101_101_1(uniques, 4);
+  f_111_110_101_110_0(uniques, 4);
+  f_111_110_101_110_1(uniques, 4);
+  f_111_110_101_111_0(uniques, 4);
+  f_111_110_101_111_1(uniques, 4);
+  f_111_110_110_000_0(uniques, 4);
+  f_111_110_110_000_1(uniques, 4);
+  f_111_110_110_001_0(uniques, 4);
+  f_111_110_110_001_1(uniques, 4);
+  f_111_110_110_010_0(uniques, 4);
+  f_111_110_110_010_1(uniques, 4);
+  f_111_110_110_011_0(uniques, 4);
+  f_111_110_110_011_1(uniques, 4);
+  f_111_110_110_100_0(uniques, 4);
+  f_111_110_110_100_1(uniques, 4);
+  f_111_110_110_101_0(uniques, 4);
+  f_111_110_110_101_1(uniques, 4);
+  f_111_110_110_110_0(uniques, 4);
+  f_111_110_110_110_1(uniques, 4);
+  f_111_110_110_111_0(uniques, 4);
+  f_111_110_110_111_1(uniques, 4);
+  f_111_110_111_000_0(uniques, 4);
+  f_111_110_111_000_1(uniques, 4);
+  f_111_110_111_001_0(uniques, 4);
+  f_111_110_111_001_1(uniques, 4);
+  f_111_110_111_010_0(uniques, 4);
+  f_111_110_111_010_1(uniques, 4);
+  f_111_110_111_011_0(uniques, 4);
+  f_111_110_111_011_1(uniques, 4);
+  f_111_110_111_100_0(uniques, 4);
+  f_111_110_111_100_1(uniques, 4);
+  f_111_110_111_101_0(uniques, 4);
+  f_111_110_111_101_1(uniques, 4);
+  f_111_110_111_110_0(uniques, 4);
+  f_111_110_111_110_1(uniques, 4);
+  f_111_110_111_111_0(uniques, 4);
+  f_111_110_111_111_1(uniques, 4);
+  f_111_111_000_000_0(uniques, 4);
+  f_111_111_000_000_1(uniques, 4);
+  f_111_111_000_001_0(uniques, 4);
+  f_111_111_000_001_1(uniques, 4);
+  f_111_111_000_010_0(uniques, 4);
+  f_111_111_000_010_1(uniques, 4);
+  f_111_111_000_011_0(uniques, 4);
+  f_111_111_000_011_1(uniques, 4);
+  f_111_111_000_100_0(uniques, 4);
+  f_111_111_000_100_1(uniques, 4);
+  f_111_111_000_101_0(uniques, 4);
+  f_111_111_000_101_1(uniques, 4);
+  f_111_111_000_110_0(uniques, 4);
+  f_111_111_000_110_1(uniques, 4);
+  f_111_111_000_111_0(uniques, 4);
+  f_111_111_000_111_1(uniques, 4);
+  f_111_111_001_000_0(uniques, 4);
+  f_111_111_001_000_1(uniques, 4);
+  f_111_111_001_001_0(uniques, 4);
+  f_111_111_001_001_1(uniques, 4);
+  f_111_111_001_010_0(uniques, 4);
+  f_111_111_001_010_1(uniques, 4);
+  f_111_111_001_011_0(uniques, 4);
+  f_111_111_001_011_1(uniques, 4);
+  f_111_111_001_100_0(uniques, 4);
+  f_111_111_001_100_1(uniques, 4);
+  f_111_111_001_101_0(uniques, 4);
+  f_111_111_001_101_1(uniques, 4);
+  f_111_111_001_110_0(uniques, 4);
+  f_111_111_001_110_1(uniques, 4);
+  f_111_111_001_111_0(uniques, 4);
+  f_111_111_001_111_1(uniques, 4);
+  f_111_111_010_000_0(uniques, 4);
+  f_111_111_010_000_1(uniques, 4);
+  f_111_111_010_001_0(uniques, 4);
+  f_111_111_010_001_1(uniques, 4);
+  f_111_111_010_010_0(uniques, 4);
+  f_111_111_010_010_1(uniques, 4);
+  f_111_111_010_011_0(uniques, 4);
+  f_111_111_010_011_1(uniques, 4);
+  f_111_111_010_100_0(uniques, 4);
+  f_111_111_010_100_1(uniques, 4);
+  f_111_111_010_101_0(uniques, 4);
+  f_111_111_010_101_1(uniques, 4);
+  f_111_111_010_110_0(uniques, 4);
+  f_111_111_010_110_1(uniques, 4);
+  f_111_111_010_111_0(uniques, 4);
+  f_111_111_010_111_1(uniques, 4);
+  f_111_111_011_000_0(uniques, 4);
+  f_111_111_011_000_1(uniques, 4);
+  f_111_111_011_001_0(uniques, 4);
+  f_111_111_011_001_1(uniques, 4);
+  f_111_111_011_010_0(uniques, 4);
+  f_111_111_011_010_1(uniques, 4);
+  f_111_111_011_011_0(uniques, 4);
+  f_111_111_011_011_1(uniques, 4);
+  f_111_111_011_100_0(uniques, 4);
+  f_111_111_011_100_1(uniques, 4);
+  f_111_111_011_101_0(uniques, 4);
+  f_111_111_011_101_1(uniques, 4);
+  f_111_111_011_110_0(uniques, 4);
+  f_111_111_011_110_1(uniques, 4);
+  f_111_111_011_111_0(uniques, 4);
+  f_111_111_011_111_1(uniques, 4);
+  f_111_111_100_000_0(uniques, 4);
+  f_111_111_100_000_1(uniques, 4);
+  f_111_111_100_001_0(uniques, 4);
+  f_111_111_100_001_1(uniques, 4);
+  f_111_111_100_010_0(uniques, 4);
+  f_111_111_100_010_1(uniques, 4);
+  f_111_111_100_011_0(uniques, 4);
+  f_111_111_100_011_1(uniques, 4);
+  f_111_111_100_100_0(uniques, 4);
+  f_111_111_100_100_1(uniques, 4);
+  f_111_111_100_101_0(uniques, 4);
+  f_111_111_100_101_1(uniques, 4);
+  f_111_111_100_110_0(uniques, 4);
+  f_111_111_100_110_1(uniques, 4);
+  f_111_111_100_111_0(uniques, 4);
+  f_111_111_100_111_1(uniques, 4);
+  f_111_111_101_000_0(uniques, 4);
+  f_111_111_101_000_1(uniques, 4);
+  f_111_111_101_001_0(uniques, 4);
+  f_111_111_101_001_1(uniques, 4);
+  f_111_111_101_010_0(uniques, 4);
+  f_111_111_101_010_1(uniques, 4);
+  f_111_111_101_011_0(uniques, 4);
+  f_111_111_101_011_1(uniques, 4);
+  f_111_111_101_100_0(uniques, 4);
+  f_111_111_101_100_1(uniques, 4);
+  f_111_111_101_101_0(uniques, 4);
+  f_111_111_101_101_1(uniques, 4);
+  f_111_111_101_110_0(uniques, 4);
+  f_111_111_101_110_1(uniques, 4);
+  f_111_111_101_111_0(uniques, 4);
+  f_111_111_101_111_1(uniques, 4);
+  f_111_111_110_000_0(uniques, 4);
+  f_111_111_110_000_1(uniques, 4);
+  f_111_111_110_001_0(uniques, 4);
+  f_111_111_110_001_1(uniques, 4);
+  f_111_111_110_010_0(uniques, 4);
+  f_111_111_110_010_1(uniques, 4);
+  f_111_111_110_011_0(uniques, 4);
+  f_111_111_110_011_1(uniques, 4);
+  f_111_111_110_100_0(uniques, 4);
+  f_111_111_110_100_1(uniques, 4);
+  f_111_111_110_101_0(uniques, 4);
+  f_111_111_110_101_1(uniques, 4);
+  f_111_111_110_110_0(uniques, 4);
+  f_111_111_110_110_1(uniques, 4);
+  f_111_111_110_111_0(uniques, 4);
+  f_111_111_110_111_1(uniques, 4);
+  f_111_111_111_000_0(uniques, 4);
+  f_111_111_111_000_1(uniques, 4);
+  f_111_111_111_001_0(uniques, 4);
+  f_111_111_111_001_1(uniques, 4);
+  f_111_111_111_010_0(uniques, 4);
+  f_111_111_111_010_1(uniques, 4);
+  f_111_111_111_011_0(uniques, 4);
+  f_111_111_111_011_1(uniques, 4);
+  f_111_111_111_100_0(uniques, 4);
+  f_111_111_111_100_1(uniques, 4);
+  f_111_111_111_101_0(uniques, 4);
+  f_111_111_111_101_1(uniques, 4);
+  f_111_111_111_110_0(uniques, 4);
+  f_111_111_111_110_1(uniques, 4);
+  f_111_111_111_111_0(uniques, 4);
+  f_111_111_111_111_1(uniques, 4);
+  Expect.equals(4096, uniques.length);
+}
diff --git a/tests/dart2js/deferred/many_parts/lib_000_100_000_000_0.dart b/tests/dart2js/deferred/many_parts/lib_000_100_000_000_0.dart
new file mode 100644
index 0000000..b28fac6
--- /dev/null
+++ b/tests/dart2js/deferred/many_parts/lib_000_100_000_000_0.dart
@@ -0,0 +1,4111 @@
+// Copyright (c) 2020, 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:expect/expect.dart";
+
+import 'libB.dart';
+
+@pragma('dart2js:noInline')
+g_000_100_000_000_0() {
+  Set<String> uniques = {};
+
+  // f_***_1**_***_***_*;
+  f_000_100_000_000_0(uniques, 3);
+  f_000_100_000_000_1(uniques, 3);
+  f_000_100_000_001_0(uniques, 3);
+  f_000_100_000_001_1(uniques, 3);
+  f_000_100_000_010_0(uniques, 3);
+  f_000_100_000_010_1(uniques, 3);
+  f_000_100_000_011_0(uniques, 3);
+  f_000_100_000_011_1(uniques, 3);
+  f_000_100_000_100_0(uniques, 3);
+  f_000_100_000_100_1(uniques, 3);
+  f_000_100_000_101_0(uniques, 3);
+  f_000_100_000_101_1(uniques, 3);
+  f_000_100_000_110_0(uniques, 3);
+  f_000_100_000_110_1(uniques, 3);
+  f_000_100_000_111_0(uniques, 3);
+  f_000_100_000_111_1(uniques, 3);
+  f_000_100_001_000_0(uniques, 3);
+  f_000_100_001_000_1(uniques, 3);
+  f_000_100_001_001_0(uniques, 3);
+  f_000_100_001_001_1(uniques, 3);
+  f_000_100_001_010_0(uniques, 3);
+  f_000_100_001_010_1(uniques, 3);
+  f_000_100_001_011_0(uniques, 3);
+  f_000_100_001_011_1(uniques, 3);
+  f_000_100_001_100_0(uniques, 3);
+  f_000_100_001_100_1(uniques, 3);
+  f_000_100_001_101_0(uniques, 3);
+  f_000_100_001_101_1(uniques, 3);
+  f_000_100_001_110_0(uniques, 3);
+  f_000_100_001_110_1(uniques, 3);
+  f_000_100_001_111_0(uniques, 3);
+  f_000_100_001_111_1(uniques, 3);
+  f_000_100_010_000_0(uniques, 3);
+  f_000_100_010_000_1(uniques, 3);
+  f_000_100_010_001_0(uniques, 3);
+  f_000_100_010_001_1(uniques, 3);
+  f_000_100_010_010_0(uniques, 3);
+  f_000_100_010_010_1(uniques, 3);
+  f_000_100_010_011_0(uniques, 3);
+  f_000_100_010_011_1(uniques, 3);
+  f_000_100_010_100_0(uniques, 3);
+  f_000_100_010_100_1(uniques, 3);
+  f_000_100_010_101_0(uniques, 3);
+  f_000_100_010_101_1(uniques, 3);
+  f_000_100_010_110_0(uniques, 3);
+  f_000_100_010_110_1(uniques, 3);
+  f_000_100_010_111_0(uniques, 3);
+  f_000_100_010_111_1(uniques, 3);
+  f_000_100_011_000_0(uniques, 3);
+  f_000_100_011_000_1(uniques, 3);
+  f_000_100_011_001_0(uniques, 3);
+  f_000_100_011_001_1(uniques, 3);
+  f_000_100_011_010_0(uniques, 3);
+  f_000_100_011_010_1(uniques, 3);
+  f_000_100_011_011_0(uniques, 3);
+  f_000_100_011_011_1(uniques, 3);
+  f_000_100_011_100_0(uniques, 3);
+  f_000_100_011_100_1(uniques, 3);
+  f_000_100_011_101_0(uniques, 3);
+  f_000_100_011_101_1(uniques, 3);
+  f_000_100_011_110_0(uniques, 3);
+  f_000_100_011_110_1(uniques, 3);
+  f_000_100_011_111_0(uniques, 3);
+  f_000_100_011_111_1(uniques, 3);
+  f_000_100_100_000_0(uniques, 3);
+  f_000_100_100_000_1(uniques, 3);
+  f_000_100_100_001_0(uniques, 3);
+  f_000_100_100_001_1(uniques, 3);
+  f_000_100_100_010_0(uniques, 3);
+  f_000_100_100_010_1(uniques, 3);
+  f_000_100_100_011_0(uniques, 3);
+  f_000_100_100_011_1(uniques, 3);
+  f_000_100_100_100_0(uniques, 3);
+  f_000_100_100_100_1(uniques, 3);
+  f_000_100_100_101_0(uniques, 3);
+  f_000_100_100_101_1(uniques, 3);
+  f_000_100_100_110_0(uniques, 3);
+  f_000_100_100_110_1(uniques, 3);
+  f_000_100_100_111_0(uniques, 3);
+  f_000_100_100_111_1(uniques, 3);
+  f_000_100_101_000_0(uniques, 3);
+  f_000_100_101_000_1(uniques, 3);
+  f_000_100_101_001_0(uniques, 3);
+  f_000_100_101_001_1(uniques, 3);
+  f_000_100_101_010_0(uniques, 3);
+  f_000_100_101_010_1(uniques, 3);
+  f_000_100_101_011_0(uniques, 3);
+  f_000_100_101_011_1(uniques, 3);
+  f_000_100_101_100_0(uniques, 3);
+  f_000_100_101_100_1(uniques, 3);
+  f_000_100_101_101_0(uniques, 3);
+  f_000_100_101_101_1(uniques, 3);
+  f_000_100_101_110_0(uniques, 3);
+  f_000_100_101_110_1(uniques, 3);
+  f_000_100_101_111_0(uniques, 3);
+  f_000_100_101_111_1(uniques, 3);
+  f_000_100_110_000_0(uniques, 3);
+  f_000_100_110_000_1(uniques, 3);
+  f_000_100_110_001_0(uniques, 3);
+  f_000_100_110_001_1(uniques, 3);
+  f_000_100_110_010_0(uniques, 3);
+  f_000_100_110_010_1(uniques, 3);
+  f_000_100_110_011_0(uniques, 3);
+  f_000_100_110_011_1(uniques, 3);
+  f_000_100_110_100_0(uniques, 3);
+  f_000_100_110_100_1(uniques, 3);
+  f_000_100_110_101_0(uniques, 3);
+  f_000_100_110_101_1(uniques, 3);
+  f_000_100_110_110_0(uniques, 3);
+  f_000_100_110_110_1(uniques, 3);
+  f_000_100_110_111_0(uniques, 3);
+  f_000_100_110_111_1(uniques, 3);
+  f_000_100_111_000_0(uniques, 3);
+  f_000_100_111_000_1(uniques, 3);
+  f_000_100_111_001_0(uniques, 3);
+  f_000_100_111_001_1(uniques, 3);
+  f_000_100_111_010_0(uniques, 3);
+  f_000_100_111_010_1(uniques, 3);
+  f_000_100_111_011_0(uniques, 3);
+  f_000_100_111_011_1(uniques, 3);
+  f_000_100_111_100_0(uniques, 3);
+  f_000_100_111_100_1(uniques, 3);
+  f_000_100_111_101_0(uniques, 3);
+  f_000_100_111_101_1(uniques, 3);
+  f_000_100_111_110_0(uniques, 3);
+  f_000_100_111_110_1(uniques, 3);
+  f_000_100_111_111_0(uniques, 3);
+  f_000_100_111_111_1(uniques, 3);
+  f_000_101_000_000_0(uniques, 3);
+  f_000_101_000_000_1(uniques, 3);
+  f_000_101_000_001_0(uniques, 3);
+  f_000_101_000_001_1(uniques, 3);
+  f_000_101_000_010_0(uniques, 3);
+  f_000_101_000_010_1(uniques, 3);
+  f_000_101_000_011_0(uniques, 3);
+  f_000_101_000_011_1(uniques, 3);
+  f_000_101_000_100_0(uniques, 3);
+  f_000_101_000_100_1(uniques, 3);
+  f_000_101_000_101_0(uniques, 3);
+  f_000_101_000_101_1(uniques, 3);
+  f_000_101_000_110_0(uniques, 3);
+  f_000_101_000_110_1(uniques, 3);
+  f_000_101_000_111_0(uniques, 3);
+  f_000_101_000_111_1(uniques, 3);
+  f_000_101_001_000_0(uniques, 3);
+  f_000_101_001_000_1(uniques, 3);
+  f_000_101_001_001_0(uniques, 3);
+  f_000_101_001_001_1(uniques, 3);
+  f_000_101_001_010_0(uniques, 3);
+  f_000_101_001_010_1(uniques, 3);
+  f_000_101_001_011_0(uniques, 3);
+  f_000_101_001_011_1(uniques, 3);
+  f_000_101_001_100_0(uniques, 3);
+  f_000_101_001_100_1(uniques, 3);
+  f_000_101_001_101_0(uniques, 3);
+  f_000_101_001_101_1(uniques, 3);
+  f_000_101_001_110_0(uniques, 3);
+  f_000_101_001_110_1(uniques, 3);
+  f_000_101_001_111_0(uniques, 3);
+  f_000_101_001_111_1(uniques, 3);
+  f_000_101_010_000_0(uniques, 3);
+  f_000_101_010_000_1(uniques, 3);
+  f_000_101_010_001_0(uniques, 3);
+  f_000_101_010_001_1(uniques, 3);
+  f_000_101_010_010_0(uniques, 3);
+  f_000_101_010_010_1(uniques, 3);
+  f_000_101_010_011_0(uniques, 3);
+  f_000_101_010_011_1(uniques, 3);
+  f_000_101_010_100_0(uniques, 3);
+  f_000_101_010_100_1(uniques, 3);
+  f_000_101_010_101_0(uniques, 3);
+  f_000_101_010_101_1(uniques, 3);
+  f_000_101_010_110_0(uniques, 3);
+  f_000_101_010_110_1(uniques, 3);
+  f_000_101_010_111_0(uniques, 3);
+  f_000_101_010_111_1(uniques, 3);
+  f_000_101_011_000_0(uniques, 3);
+  f_000_101_011_000_1(uniques, 3);
+  f_000_101_011_001_0(uniques, 3);
+  f_000_101_011_001_1(uniques, 3);
+  f_000_101_011_010_0(uniques, 3);
+  f_000_101_011_010_1(uniques, 3);
+  f_000_101_011_011_0(uniques, 3);
+  f_000_101_011_011_1(uniques, 3);
+  f_000_101_011_100_0(uniques, 3);
+  f_000_101_011_100_1(uniques, 3);
+  f_000_101_011_101_0(uniques, 3);
+  f_000_101_011_101_1(uniques, 3);
+  f_000_101_011_110_0(uniques, 3);
+  f_000_101_011_110_1(uniques, 3);
+  f_000_101_011_111_0(uniques, 3);
+  f_000_101_011_111_1(uniques, 3);
+  f_000_101_100_000_0(uniques, 3);
+  f_000_101_100_000_1(uniques, 3);
+  f_000_101_100_001_0(uniques, 3);
+  f_000_101_100_001_1(uniques, 3);
+  f_000_101_100_010_0(uniques, 3);
+  f_000_101_100_010_1(uniques, 3);
+  f_000_101_100_011_0(uniques, 3);
+  f_000_101_100_011_1(uniques, 3);
+  f_000_101_100_100_0(uniques, 3);
+  f_000_101_100_100_1(uniques, 3);
+  f_000_101_100_101_0(uniques, 3);
+  f_000_101_100_101_1(uniques, 3);
+  f_000_101_100_110_0(uniques, 3);
+  f_000_101_100_110_1(uniques, 3);
+  f_000_101_100_111_0(uniques, 3);
+  f_000_101_100_111_1(uniques, 3);
+  f_000_101_101_000_0(uniques, 3);
+  f_000_101_101_000_1(uniques, 3);
+  f_000_101_101_001_0(uniques, 3);
+  f_000_101_101_001_1(uniques, 3);
+  f_000_101_101_010_0(uniques, 3);
+  f_000_101_101_010_1(uniques, 3);
+  f_000_101_101_011_0(uniques, 3);
+  f_000_101_101_011_1(uniques, 3);
+  f_000_101_101_100_0(uniques, 3);
+  f_000_101_101_100_1(uniques, 3);
+  f_000_101_101_101_0(uniques, 3);
+  f_000_101_101_101_1(uniques, 3);
+  f_000_101_101_110_0(uniques, 3);
+  f_000_101_101_110_1(uniques, 3);
+  f_000_101_101_111_0(uniques, 3);
+  f_000_101_101_111_1(uniques, 3);
+  f_000_101_110_000_0(uniques, 3);
+  f_000_101_110_000_1(uniques, 3);
+  f_000_101_110_001_0(uniques, 3);
+  f_000_101_110_001_1(uniques, 3);
+  f_000_101_110_010_0(uniques, 3);
+  f_000_101_110_010_1(uniques, 3);
+  f_000_101_110_011_0(uniques, 3);
+  f_000_101_110_011_1(uniques, 3);
+  f_000_101_110_100_0(uniques, 3);
+  f_000_101_110_100_1(uniques, 3);
+  f_000_101_110_101_0(uniques, 3);
+  f_000_101_110_101_1(uniques, 3);
+  f_000_101_110_110_0(uniques, 3);
+  f_000_101_110_110_1(uniques, 3);
+  f_000_101_110_111_0(uniques, 3);
+  f_000_101_110_111_1(uniques, 3);
+  f_000_101_111_000_0(uniques, 3);
+  f_000_101_111_000_1(uniques, 3);
+  f_000_101_111_001_0(uniques, 3);
+  f_000_101_111_001_1(uniques, 3);
+  f_000_101_111_010_0(uniques, 3);
+  f_000_101_111_010_1(uniques, 3);
+  f_000_101_111_011_0(uniques, 3);
+  f_000_101_111_011_1(uniques, 3);
+  f_000_101_111_100_0(uniques, 3);
+  f_000_101_111_100_1(uniques, 3);
+  f_000_101_111_101_0(uniques, 3);
+  f_000_101_111_101_1(uniques, 3);
+  f_000_101_111_110_0(uniques, 3);
+  f_000_101_111_110_1(uniques, 3);
+  f_000_101_111_111_0(uniques, 3);
+  f_000_101_111_111_1(uniques, 3);
+  f_000_110_000_000_0(uniques, 3);
+  f_000_110_000_000_1(uniques, 3);
+  f_000_110_000_001_0(uniques, 3);
+  f_000_110_000_001_1(uniques, 3);
+  f_000_110_000_010_0(uniques, 3);
+  f_000_110_000_010_1(uniques, 3);
+  f_000_110_000_011_0(uniques, 3);
+  f_000_110_000_011_1(uniques, 3);
+  f_000_110_000_100_0(uniques, 3);
+  f_000_110_000_100_1(uniques, 3);
+  f_000_110_000_101_0(uniques, 3);
+  f_000_110_000_101_1(uniques, 3);
+  f_000_110_000_110_0(uniques, 3);
+  f_000_110_000_110_1(uniques, 3);
+  f_000_110_000_111_0(uniques, 3);
+  f_000_110_000_111_1(uniques, 3);
+  f_000_110_001_000_0(uniques, 3);
+  f_000_110_001_000_1(uniques, 3);
+  f_000_110_001_001_0(uniques, 3);
+  f_000_110_001_001_1(uniques, 3);
+  f_000_110_001_010_0(uniques, 3);
+  f_000_110_001_010_1(uniques, 3);
+  f_000_110_001_011_0(uniques, 3);
+  f_000_110_001_011_1(uniques, 3);
+  f_000_110_001_100_0(uniques, 3);
+  f_000_110_001_100_1(uniques, 3);
+  f_000_110_001_101_0(uniques, 3);
+  f_000_110_001_101_1(uniques, 3);
+  f_000_110_001_110_0(uniques, 3);
+  f_000_110_001_110_1(uniques, 3);
+  f_000_110_001_111_0(uniques, 3);
+  f_000_110_001_111_1(uniques, 3);
+  f_000_110_010_000_0(uniques, 3);
+  f_000_110_010_000_1(uniques, 3);
+  f_000_110_010_001_0(uniques, 3);
+  f_000_110_010_001_1(uniques, 3);
+  f_000_110_010_010_0(uniques, 3);
+  f_000_110_010_010_1(uniques, 3);
+  f_000_110_010_011_0(uniques, 3);
+  f_000_110_010_011_1(uniques, 3);
+  f_000_110_010_100_0(uniques, 3);
+  f_000_110_010_100_1(uniques, 3);
+  f_000_110_010_101_0(uniques, 3);
+  f_000_110_010_101_1(uniques, 3);
+  f_000_110_010_110_0(uniques, 3);
+  f_000_110_010_110_1(uniques, 3);
+  f_000_110_010_111_0(uniques, 3);
+  f_000_110_010_111_1(uniques, 3);
+  f_000_110_011_000_0(uniques, 3);
+  f_000_110_011_000_1(uniques, 3);
+  f_000_110_011_001_0(uniques, 3);
+  f_000_110_011_001_1(uniques, 3);
+  f_000_110_011_010_0(uniques, 3);
+  f_000_110_011_010_1(uniques, 3);
+  f_000_110_011_011_0(uniques, 3);
+  f_000_110_011_011_1(uniques, 3);
+  f_000_110_011_100_0(uniques, 3);
+  f_000_110_011_100_1(uniques, 3);
+  f_000_110_011_101_0(uniques, 3);
+  f_000_110_011_101_1(uniques, 3);
+  f_000_110_011_110_0(uniques, 3);
+  f_000_110_011_110_1(uniques, 3);
+  f_000_110_011_111_0(uniques, 3);
+  f_000_110_011_111_1(uniques, 3);
+  f_000_110_100_000_0(uniques, 3);
+  f_000_110_100_000_1(uniques, 3);
+  f_000_110_100_001_0(uniques, 3);
+  f_000_110_100_001_1(uniques, 3);
+  f_000_110_100_010_0(uniques, 3);
+  f_000_110_100_010_1(uniques, 3);
+  f_000_110_100_011_0(uniques, 3);
+  f_000_110_100_011_1(uniques, 3);
+  f_000_110_100_100_0(uniques, 3);
+  f_000_110_100_100_1(uniques, 3);
+  f_000_110_100_101_0(uniques, 3);
+  f_000_110_100_101_1(uniques, 3);
+  f_000_110_100_110_0(uniques, 3);
+  f_000_110_100_110_1(uniques, 3);
+  f_000_110_100_111_0(uniques, 3);
+  f_000_110_100_111_1(uniques, 3);
+  f_000_110_101_000_0(uniques, 3);
+  f_000_110_101_000_1(uniques, 3);
+  f_000_110_101_001_0(uniques, 3);
+  f_000_110_101_001_1(uniques, 3);
+  f_000_110_101_010_0(uniques, 3);
+  f_000_110_101_010_1(uniques, 3);
+  f_000_110_101_011_0(uniques, 3);
+  f_000_110_101_011_1(uniques, 3);
+  f_000_110_101_100_0(uniques, 3);
+  f_000_110_101_100_1(uniques, 3);
+  f_000_110_101_101_0(uniques, 3);
+  f_000_110_101_101_1(uniques, 3);
+  f_000_110_101_110_0(uniques, 3);
+  f_000_110_101_110_1(uniques, 3);
+  f_000_110_101_111_0(uniques, 3);
+  f_000_110_101_111_1(uniques, 3);
+  f_000_110_110_000_0(uniques, 3);
+  f_000_110_110_000_1(uniques, 3);
+  f_000_110_110_001_0(uniques, 3);
+  f_000_110_110_001_1(uniques, 3);
+  f_000_110_110_010_0(uniques, 3);
+  f_000_110_110_010_1(uniques, 3);
+  f_000_110_110_011_0(uniques, 3);
+  f_000_110_110_011_1(uniques, 3);
+  f_000_110_110_100_0(uniques, 3);
+  f_000_110_110_100_1(uniques, 3);
+  f_000_110_110_101_0(uniques, 3);
+  f_000_110_110_101_1(uniques, 3);
+  f_000_110_110_110_0(uniques, 3);
+  f_000_110_110_110_1(uniques, 3);
+  f_000_110_110_111_0(uniques, 3);
+  f_000_110_110_111_1(uniques, 3);
+  f_000_110_111_000_0(uniques, 3);
+  f_000_110_111_000_1(uniques, 3);
+  f_000_110_111_001_0(uniques, 3);
+  f_000_110_111_001_1(uniques, 3);
+  f_000_110_111_010_0(uniques, 3);
+  f_000_110_111_010_1(uniques, 3);
+  f_000_110_111_011_0(uniques, 3);
+  f_000_110_111_011_1(uniques, 3);
+  f_000_110_111_100_0(uniques, 3);
+  f_000_110_111_100_1(uniques, 3);
+  f_000_110_111_101_0(uniques, 3);
+  f_000_110_111_101_1(uniques, 3);
+  f_000_110_111_110_0(uniques, 3);
+  f_000_110_111_110_1(uniques, 3);
+  f_000_110_111_111_0(uniques, 3);
+  f_000_110_111_111_1(uniques, 3);
+  f_000_111_000_000_0(uniques, 3);
+  f_000_111_000_000_1(uniques, 3);
+  f_000_111_000_001_0(uniques, 3);
+  f_000_111_000_001_1(uniques, 3);
+  f_000_111_000_010_0(uniques, 3);
+  f_000_111_000_010_1(uniques, 3);
+  f_000_111_000_011_0(uniques, 3);
+  f_000_111_000_011_1(uniques, 3);
+  f_000_111_000_100_0(uniques, 3);
+  f_000_111_000_100_1(uniques, 3);
+  f_000_111_000_101_0(uniques, 3);
+  f_000_111_000_101_1(uniques, 3);
+  f_000_111_000_110_0(uniques, 3);
+  f_000_111_000_110_1(uniques, 3);
+  f_000_111_000_111_0(uniques, 3);
+  f_000_111_000_111_1(uniques, 3);
+  f_000_111_001_000_0(uniques, 3);
+  f_000_111_001_000_1(uniques, 3);
+  f_000_111_001_001_0(uniques, 3);
+  f_000_111_001_001_1(uniques, 3);
+  f_000_111_001_010_0(uniques, 3);
+  f_000_111_001_010_1(uniques, 3);
+  f_000_111_001_011_0(uniques, 3);
+  f_000_111_001_011_1(uniques, 3);
+  f_000_111_001_100_0(uniques, 3);
+  f_000_111_001_100_1(uniques, 3);
+  f_000_111_001_101_0(uniques, 3);
+  f_000_111_001_101_1(uniques, 3);
+  f_000_111_001_110_0(uniques, 3);
+  f_000_111_001_110_1(uniques, 3);
+  f_000_111_001_111_0(uniques, 3);
+  f_000_111_001_111_1(uniques, 3);
+  f_000_111_010_000_0(uniques, 3);
+  f_000_111_010_000_1(uniques, 3);
+  f_000_111_010_001_0(uniques, 3);
+  f_000_111_010_001_1(uniques, 3);
+  f_000_111_010_010_0(uniques, 3);
+  f_000_111_010_010_1(uniques, 3);
+  f_000_111_010_011_0(uniques, 3);
+  f_000_111_010_011_1(uniques, 3);
+  f_000_111_010_100_0(uniques, 3);
+  f_000_111_010_100_1(uniques, 3);
+  f_000_111_010_101_0(uniques, 3);
+  f_000_111_010_101_1(uniques, 3);
+  f_000_111_010_110_0(uniques, 3);
+  f_000_111_010_110_1(uniques, 3);
+  f_000_111_010_111_0(uniques, 3);
+  f_000_111_010_111_1(uniques, 3);
+  f_000_111_011_000_0(uniques, 3);
+  f_000_111_011_000_1(uniques, 3);
+  f_000_111_011_001_0(uniques, 3);
+  f_000_111_011_001_1(uniques, 3);
+  f_000_111_011_010_0(uniques, 3);
+  f_000_111_011_010_1(uniques, 3);
+  f_000_111_011_011_0(uniques, 3);
+  f_000_111_011_011_1(uniques, 3);
+  f_000_111_011_100_0(uniques, 3);
+  f_000_111_011_100_1(uniques, 3);
+  f_000_111_011_101_0(uniques, 3);
+  f_000_111_011_101_1(uniques, 3);
+  f_000_111_011_110_0(uniques, 3);
+  f_000_111_011_110_1(uniques, 3);
+  f_000_111_011_111_0(uniques, 3);
+  f_000_111_011_111_1(uniques, 3);
+  f_000_111_100_000_0(uniques, 3);
+  f_000_111_100_000_1(uniques, 3);
+  f_000_111_100_001_0(uniques, 3);
+  f_000_111_100_001_1(uniques, 3);
+  f_000_111_100_010_0(uniques, 3);
+  f_000_111_100_010_1(uniques, 3);
+  f_000_111_100_011_0(uniques, 3);
+  f_000_111_100_011_1(uniques, 3);
+  f_000_111_100_100_0(uniques, 3);
+  f_000_111_100_100_1(uniques, 3);
+  f_000_111_100_101_0(uniques, 3);
+  f_000_111_100_101_1(uniques, 3);
+  f_000_111_100_110_0(uniques, 3);
+  f_000_111_100_110_1(uniques, 3);
+  f_000_111_100_111_0(uniques, 3);
+  f_000_111_100_111_1(uniques, 3);
+  f_000_111_101_000_0(uniques, 3);
+  f_000_111_101_000_1(uniques, 3);
+  f_000_111_101_001_0(uniques, 3);
+  f_000_111_101_001_1(uniques, 3);
+  f_000_111_101_010_0(uniques, 3);
+  f_000_111_101_010_1(uniques, 3);
+  f_000_111_101_011_0(uniques, 3);
+  f_000_111_101_011_1(uniques, 3);
+  f_000_111_101_100_0(uniques, 3);
+  f_000_111_101_100_1(uniques, 3);
+  f_000_111_101_101_0(uniques, 3);
+  f_000_111_101_101_1(uniques, 3);
+  f_000_111_101_110_0(uniques, 3);
+  f_000_111_101_110_1(uniques, 3);
+  f_000_111_101_111_0(uniques, 3);
+  f_000_111_101_111_1(uniques, 3);
+  f_000_111_110_000_0(uniques, 3);
+  f_000_111_110_000_1(uniques, 3);
+  f_000_111_110_001_0(uniques, 3);
+  f_000_111_110_001_1(uniques, 3);
+  f_000_111_110_010_0(uniques, 3);
+  f_000_111_110_010_1(uniques, 3);
+  f_000_111_110_011_0(uniques, 3);
+  f_000_111_110_011_1(uniques, 3);
+  f_000_111_110_100_0(uniques, 3);
+  f_000_111_110_100_1(uniques, 3);
+  f_000_111_110_101_0(uniques, 3);
+  f_000_111_110_101_1(uniques, 3);
+  f_000_111_110_110_0(uniques, 3);
+  f_000_111_110_110_1(uniques, 3);
+  f_000_111_110_111_0(uniques, 3);
+  f_000_111_110_111_1(uniques, 3);
+  f_000_111_111_000_0(uniques, 3);
+  f_000_111_111_000_1(uniques, 3);
+  f_000_111_111_001_0(uniques, 3);
+  f_000_111_111_001_1(uniques, 3);
+  f_000_111_111_010_0(uniques, 3);
+  f_000_111_111_010_1(uniques, 3);
+  f_000_111_111_011_0(uniques, 3);
+  f_000_111_111_011_1(uniques, 3);
+  f_000_111_111_100_0(uniques, 3);
+  f_000_111_111_100_1(uniques, 3);
+  f_000_111_111_101_0(uniques, 3);
+  f_000_111_111_101_1(uniques, 3);
+  f_000_111_111_110_0(uniques, 3);
+  f_000_111_111_110_1(uniques, 3);
+  f_000_111_111_111_0(uniques, 3);
+  f_000_111_111_111_1(uniques, 3);
+  f_001_100_000_000_0(uniques, 3);
+  f_001_100_000_000_1(uniques, 3);
+  f_001_100_000_001_0(uniques, 3);
+  f_001_100_000_001_1(uniques, 3);
+  f_001_100_000_010_0(uniques, 3);
+  f_001_100_000_010_1(uniques, 3);
+  f_001_100_000_011_0(uniques, 3);
+  f_001_100_000_011_1(uniques, 3);
+  f_001_100_000_100_0(uniques, 3);
+  f_001_100_000_100_1(uniques, 3);
+  f_001_100_000_101_0(uniques, 3);
+  f_001_100_000_101_1(uniques, 3);
+  f_001_100_000_110_0(uniques, 3);
+  f_001_100_000_110_1(uniques, 3);
+  f_001_100_000_111_0(uniques, 3);
+  f_001_100_000_111_1(uniques, 3);
+  f_001_100_001_000_0(uniques, 3);
+  f_001_100_001_000_1(uniques, 3);
+  f_001_100_001_001_0(uniques, 3);
+  f_001_100_001_001_1(uniques, 3);
+  f_001_100_001_010_0(uniques, 3);
+  f_001_100_001_010_1(uniques, 3);
+  f_001_100_001_011_0(uniques, 3);
+  f_001_100_001_011_1(uniques, 3);
+  f_001_100_001_100_0(uniques, 3);
+  f_001_100_001_100_1(uniques, 3);
+  f_001_100_001_101_0(uniques, 3);
+  f_001_100_001_101_1(uniques, 3);
+  f_001_100_001_110_0(uniques, 3);
+  f_001_100_001_110_1(uniques, 3);
+  f_001_100_001_111_0(uniques, 3);
+  f_001_100_001_111_1(uniques, 3);
+  f_001_100_010_000_0(uniques, 3);
+  f_001_100_010_000_1(uniques, 3);
+  f_001_100_010_001_0(uniques, 3);
+  f_001_100_010_001_1(uniques, 3);
+  f_001_100_010_010_0(uniques, 3);
+  f_001_100_010_010_1(uniques, 3);
+  f_001_100_010_011_0(uniques, 3);
+  f_001_100_010_011_1(uniques, 3);
+  f_001_100_010_100_0(uniques, 3);
+  f_001_100_010_100_1(uniques, 3);
+  f_001_100_010_101_0(uniques, 3);
+  f_001_100_010_101_1(uniques, 3);
+  f_001_100_010_110_0(uniques, 3);
+  f_001_100_010_110_1(uniques, 3);
+  f_001_100_010_111_0(uniques, 3);
+  f_001_100_010_111_1(uniques, 3);
+  f_001_100_011_000_0(uniques, 3);
+  f_001_100_011_000_1(uniques, 3);
+  f_001_100_011_001_0(uniques, 3);
+  f_001_100_011_001_1(uniques, 3);
+  f_001_100_011_010_0(uniques, 3);
+  f_001_100_011_010_1(uniques, 3);
+  f_001_100_011_011_0(uniques, 3);
+  f_001_100_011_011_1(uniques, 3);
+  f_001_100_011_100_0(uniques, 3);
+  f_001_100_011_100_1(uniques, 3);
+  f_001_100_011_101_0(uniques, 3);
+  f_001_100_011_101_1(uniques, 3);
+  f_001_100_011_110_0(uniques, 3);
+  f_001_100_011_110_1(uniques, 3);
+  f_001_100_011_111_0(uniques, 3);
+  f_001_100_011_111_1(uniques, 3);
+  f_001_100_100_000_0(uniques, 3);
+  f_001_100_100_000_1(uniques, 3);
+  f_001_100_100_001_0(uniques, 3);
+  f_001_100_100_001_1(uniques, 3);
+  f_001_100_100_010_0(uniques, 3);
+  f_001_100_100_010_1(uniques, 3);
+  f_001_100_100_011_0(uniques, 3);
+  f_001_100_100_011_1(uniques, 3);
+  f_001_100_100_100_0(uniques, 3);
+  f_001_100_100_100_1(uniques, 3);
+  f_001_100_100_101_0(uniques, 3);
+  f_001_100_100_101_1(uniques, 3);
+  f_001_100_100_110_0(uniques, 3);
+  f_001_100_100_110_1(uniques, 3);
+  f_001_100_100_111_0(uniques, 3);
+  f_001_100_100_111_1(uniques, 3);
+  f_001_100_101_000_0(uniques, 3);
+  f_001_100_101_000_1(uniques, 3);
+  f_001_100_101_001_0(uniques, 3);
+  f_001_100_101_001_1(uniques, 3);
+  f_001_100_101_010_0(uniques, 3);
+  f_001_100_101_010_1(uniques, 3);
+  f_001_100_101_011_0(uniques, 3);
+  f_001_100_101_011_1(uniques, 3);
+  f_001_100_101_100_0(uniques, 3);
+  f_001_100_101_100_1(uniques, 3);
+  f_001_100_101_101_0(uniques, 3);
+  f_001_100_101_101_1(uniques, 3);
+  f_001_100_101_110_0(uniques, 3);
+  f_001_100_101_110_1(uniques, 3);
+  f_001_100_101_111_0(uniques, 3);
+  f_001_100_101_111_1(uniques, 3);
+  f_001_100_110_000_0(uniques, 3);
+  f_001_100_110_000_1(uniques, 3);
+  f_001_100_110_001_0(uniques, 3);
+  f_001_100_110_001_1(uniques, 3);
+  f_001_100_110_010_0(uniques, 3);
+  f_001_100_110_010_1(uniques, 3);
+  f_001_100_110_011_0(uniques, 3);
+  f_001_100_110_011_1(uniques, 3);
+  f_001_100_110_100_0(uniques, 3);
+  f_001_100_110_100_1(uniques, 3);
+  f_001_100_110_101_0(uniques, 3);
+  f_001_100_110_101_1(uniques, 3);
+  f_001_100_110_110_0(uniques, 3);
+  f_001_100_110_110_1(uniques, 3);
+  f_001_100_110_111_0(uniques, 3);
+  f_001_100_110_111_1(uniques, 3);
+  f_001_100_111_000_0(uniques, 3);
+  f_001_100_111_000_1(uniques, 3);
+  f_001_100_111_001_0(uniques, 3);
+  f_001_100_111_001_1(uniques, 3);
+  f_001_100_111_010_0(uniques, 3);
+  f_001_100_111_010_1(uniques, 3);
+  f_001_100_111_011_0(uniques, 3);
+  f_001_100_111_011_1(uniques, 3);
+  f_001_100_111_100_0(uniques, 3);
+  f_001_100_111_100_1(uniques, 3);
+  f_001_100_111_101_0(uniques, 3);
+  f_001_100_111_101_1(uniques, 3);
+  f_001_100_111_110_0(uniques, 3);
+  f_001_100_111_110_1(uniques, 3);
+  f_001_100_111_111_0(uniques, 3);
+  f_001_100_111_111_1(uniques, 3);
+  f_001_101_000_000_0(uniques, 3);
+  f_001_101_000_000_1(uniques, 3);
+  f_001_101_000_001_0(uniques, 3);
+  f_001_101_000_001_1(uniques, 3);
+  f_001_101_000_010_0(uniques, 3);
+  f_001_101_000_010_1(uniques, 3);
+  f_001_101_000_011_0(uniques, 3);
+  f_001_101_000_011_1(uniques, 3);
+  f_001_101_000_100_0(uniques, 3);
+  f_001_101_000_100_1(uniques, 3);
+  f_001_101_000_101_0(uniques, 3);
+  f_001_101_000_101_1(uniques, 3);
+  f_001_101_000_110_0(uniques, 3);
+  f_001_101_000_110_1(uniques, 3);
+  f_001_101_000_111_0(uniques, 3);
+  f_001_101_000_111_1(uniques, 3);
+  f_001_101_001_000_0(uniques, 3);
+  f_001_101_001_000_1(uniques, 3);
+  f_001_101_001_001_0(uniques, 3);
+  f_001_101_001_001_1(uniques, 3);
+  f_001_101_001_010_0(uniques, 3);
+  f_001_101_001_010_1(uniques, 3);
+  f_001_101_001_011_0(uniques, 3);
+  f_001_101_001_011_1(uniques, 3);
+  f_001_101_001_100_0(uniques, 3);
+  f_001_101_001_100_1(uniques, 3);
+  f_001_101_001_101_0(uniques, 3);
+  f_001_101_001_101_1(uniques, 3);
+  f_001_101_001_110_0(uniques, 3);
+  f_001_101_001_110_1(uniques, 3);
+  f_001_101_001_111_0(uniques, 3);
+  f_001_101_001_111_1(uniques, 3);
+  f_001_101_010_000_0(uniques, 3);
+  f_001_101_010_000_1(uniques, 3);
+  f_001_101_010_001_0(uniques, 3);
+  f_001_101_010_001_1(uniques, 3);
+  f_001_101_010_010_0(uniques, 3);
+  f_001_101_010_010_1(uniques, 3);
+  f_001_101_010_011_0(uniques, 3);
+  f_001_101_010_011_1(uniques, 3);
+  f_001_101_010_100_0(uniques, 3);
+  f_001_101_010_100_1(uniques, 3);
+  f_001_101_010_101_0(uniques, 3);
+  f_001_101_010_101_1(uniques, 3);
+  f_001_101_010_110_0(uniques, 3);
+  f_001_101_010_110_1(uniques, 3);
+  f_001_101_010_111_0(uniques, 3);
+  f_001_101_010_111_1(uniques, 3);
+  f_001_101_011_000_0(uniques, 3);
+  f_001_101_011_000_1(uniques, 3);
+  f_001_101_011_001_0(uniques, 3);
+  f_001_101_011_001_1(uniques, 3);
+  f_001_101_011_010_0(uniques, 3);
+  f_001_101_011_010_1(uniques, 3);
+  f_001_101_011_011_0(uniques, 3);
+  f_001_101_011_011_1(uniques, 3);
+  f_001_101_011_100_0(uniques, 3);
+  f_001_101_011_100_1(uniques, 3);
+  f_001_101_011_101_0(uniques, 3);
+  f_001_101_011_101_1(uniques, 3);
+  f_001_101_011_110_0(uniques, 3);
+  f_001_101_011_110_1(uniques, 3);
+  f_001_101_011_111_0(uniques, 3);
+  f_001_101_011_111_1(uniques, 3);
+  f_001_101_100_000_0(uniques, 3);
+  f_001_101_100_000_1(uniques, 3);
+  f_001_101_100_001_0(uniques, 3);
+  f_001_101_100_001_1(uniques, 3);
+  f_001_101_100_010_0(uniques, 3);
+  f_001_101_100_010_1(uniques, 3);
+  f_001_101_100_011_0(uniques, 3);
+  f_001_101_100_011_1(uniques, 3);
+  f_001_101_100_100_0(uniques, 3);
+  f_001_101_100_100_1(uniques, 3);
+  f_001_101_100_101_0(uniques, 3);
+  f_001_101_100_101_1(uniques, 3);
+  f_001_101_100_110_0(uniques, 3);
+  f_001_101_100_110_1(uniques, 3);
+  f_001_101_100_111_0(uniques, 3);
+  f_001_101_100_111_1(uniques, 3);
+  f_001_101_101_000_0(uniques, 3);
+  f_001_101_101_000_1(uniques, 3);
+  f_001_101_101_001_0(uniques, 3);
+  f_001_101_101_001_1(uniques, 3);
+  f_001_101_101_010_0(uniques, 3);
+  f_001_101_101_010_1(uniques, 3);
+  f_001_101_101_011_0(uniques, 3);
+  f_001_101_101_011_1(uniques, 3);
+  f_001_101_101_100_0(uniques, 3);
+  f_001_101_101_100_1(uniques, 3);
+  f_001_101_101_101_0(uniques, 3);
+  f_001_101_101_101_1(uniques, 3);
+  f_001_101_101_110_0(uniques, 3);
+  f_001_101_101_110_1(uniques, 3);
+  f_001_101_101_111_0(uniques, 3);
+  f_001_101_101_111_1(uniques, 3);
+  f_001_101_110_000_0(uniques, 3);
+  f_001_101_110_000_1(uniques, 3);
+  f_001_101_110_001_0(uniques, 3);
+  f_001_101_110_001_1(uniques, 3);
+  f_001_101_110_010_0(uniques, 3);
+  f_001_101_110_010_1(uniques, 3);
+  f_001_101_110_011_0(uniques, 3);
+  f_001_101_110_011_1(uniques, 3);
+  f_001_101_110_100_0(uniques, 3);
+  f_001_101_110_100_1(uniques, 3);
+  f_001_101_110_101_0(uniques, 3);
+  f_001_101_110_101_1(uniques, 3);
+  f_001_101_110_110_0(uniques, 3);
+  f_001_101_110_110_1(uniques, 3);
+  f_001_101_110_111_0(uniques, 3);
+  f_001_101_110_111_1(uniques, 3);
+  f_001_101_111_000_0(uniques, 3);
+  f_001_101_111_000_1(uniques, 3);
+  f_001_101_111_001_0(uniques, 3);
+  f_001_101_111_001_1(uniques, 3);
+  f_001_101_111_010_0(uniques, 3);
+  f_001_101_111_010_1(uniques, 3);
+  f_001_101_111_011_0(uniques, 3);
+  f_001_101_111_011_1(uniques, 3);
+  f_001_101_111_100_0(uniques, 3);
+  f_001_101_111_100_1(uniques, 3);
+  f_001_101_111_101_0(uniques, 3);
+  f_001_101_111_101_1(uniques, 3);
+  f_001_101_111_110_0(uniques, 3);
+  f_001_101_111_110_1(uniques, 3);
+  f_001_101_111_111_0(uniques, 3);
+  f_001_101_111_111_1(uniques, 3);
+  f_001_110_000_000_0(uniques, 3);
+  f_001_110_000_000_1(uniques, 3);
+  f_001_110_000_001_0(uniques, 3);
+  f_001_110_000_001_1(uniques, 3);
+  f_001_110_000_010_0(uniques, 3);
+  f_001_110_000_010_1(uniques, 3);
+  f_001_110_000_011_0(uniques, 3);
+  f_001_110_000_011_1(uniques, 3);
+  f_001_110_000_100_0(uniques, 3);
+  f_001_110_000_100_1(uniques, 3);
+  f_001_110_000_101_0(uniques, 3);
+  f_001_110_000_101_1(uniques, 3);
+  f_001_110_000_110_0(uniques, 3);
+  f_001_110_000_110_1(uniques, 3);
+  f_001_110_000_111_0(uniques, 3);
+  f_001_110_000_111_1(uniques, 3);
+  f_001_110_001_000_0(uniques, 3);
+  f_001_110_001_000_1(uniques, 3);
+  f_001_110_001_001_0(uniques, 3);
+  f_001_110_001_001_1(uniques, 3);
+  f_001_110_001_010_0(uniques, 3);
+  f_001_110_001_010_1(uniques, 3);
+  f_001_110_001_011_0(uniques, 3);
+  f_001_110_001_011_1(uniques, 3);
+  f_001_110_001_100_0(uniques, 3);
+  f_001_110_001_100_1(uniques, 3);
+  f_001_110_001_101_0(uniques, 3);
+  f_001_110_001_101_1(uniques, 3);
+  f_001_110_001_110_0(uniques, 3);
+  f_001_110_001_110_1(uniques, 3);
+  f_001_110_001_111_0(uniques, 3);
+  f_001_110_001_111_1(uniques, 3);
+  f_001_110_010_000_0(uniques, 3);
+  f_001_110_010_000_1(uniques, 3);
+  f_001_110_010_001_0(uniques, 3);
+  f_001_110_010_001_1(uniques, 3);
+  f_001_110_010_010_0(uniques, 3);
+  f_001_110_010_010_1(uniques, 3);
+  f_001_110_010_011_0(uniques, 3);
+  f_001_110_010_011_1(uniques, 3);
+  f_001_110_010_100_0(uniques, 3);
+  f_001_110_010_100_1(uniques, 3);
+  f_001_110_010_101_0(uniques, 3);
+  f_001_110_010_101_1(uniques, 3);
+  f_001_110_010_110_0(uniques, 3);
+  f_001_110_010_110_1(uniques, 3);
+  f_001_110_010_111_0(uniques, 3);
+  f_001_110_010_111_1(uniques, 3);
+  f_001_110_011_000_0(uniques, 3);
+  f_001_110_011_000_1(uniques, 3);
+  f_001_110_011_001_0(uniques, 3);
+  f_001_110_011_001_1(uniques, 3);
+  f_001_110_011_010_0(uniques, 3);
+  f_001_110_011_010_1(uniques, 3);
+  f_001_110_011_011_0(uniques, 3);
+  f_001_110_011_011_1(uniques, 3);
+  f_001_110_011_100_0(uniques, 3);
+  f_001_110_011_100_1(uniques, 3);
+  f_001_110_011_101_0(uniques, 3);
+  f_001_110_011_101_1(uniques, 3);
+  f_001_110_011_110_0(uniques, 3);
+  f_001_110_011_110_1(uniques, 3);
+  f_001_110_011_111_0(uniques, 3);
+  f_001_110_011_111_1(uniques, 3);
+  f_001_110_100_000_0(uniques, 3);
+  f_001_110_100_000_1(uniques, 3);
+  f_001_110_100_001_0(uniques, 3);
+  f_001_110_100_001_1(uniques, 3);
+  f_001_110_100_010_0(uniques, 3);
+  f_001_110_100_010_1(uniques, 3);
+  f_001_110_100_011_0(uniques, 3);
+  f_001_110_100_011_1(uniques, 3);
+  f_001_110_100_100_0(uniques, 3);
+  f_001_110_100_100_1(uniques, 3);
+  f_001_110_100_101_0(uniques, 3);
+  f_001_110_100_101_1(uniques, 3);
+  f_001_110_100_110_0(uniques, 3);
+  f_001_110_100_110_1(uniques, 3);
+  f_001_110_100_111_0(uniques, 3);
+  f_001_110_100_111_1(uniques, 3);
+  f_001_110_101_000_0(uniques, 3);
+  f_001_110_101_000_1(uniques, 3);
+  f_001_110_101_001_0(uniques, 3);
+  f_001_110_101_001_1(uniques, 3);
+  f_001_110_101_010_0(uniques, 3);
+  f_001_110_101_010_1(uniques, 3);
+  f_001_110_101_011_0(uniques, 3);
+  f_001_110_101_011_1(uniques, 3);
+  f_001_110_101_100_0(uniques, 3);
+  f_001_110_101_100_1(uniques, 3);
+  f_001_110_101_101_0(uniques, 3);
+  f_001_110_101_101_1(uniques, 3);
+  f_001_110_101_110_0(uniques, 3);
+  f_001_110_101_110_1(uniques, 3);
+  f_001_110_101_111_0(uniques, 3);
+  f_001_110_101_111_1(uniques, 3);
+  f_001_110_110_000_0(uniques, 3);
+  f_001_110_110_000_1(uniques, 3);
+  f_001_110_110_001_0(uniques, 3);
+  f_001_110_110_001_1(uniques, 3);
+  f_001_110_110_010_0(uniques, 3);
+  f_001_110_110_010_1(uniques, 3);
+  f_001_110_110_011_0(uniques, 3);
+  f_001_110_110_011_1(uniques, 3);
+  f_001_110_110_100_0(uniques, 3);
+  f_001_110_110_100_1(uniques, 3);
+  f_001_110_110_101_0(uniques, 3);
+  f_001_110_110_101_1(uniques, 3);
+  f_001_110_110_110_0(uniques, 3);
+  f_001_110_110_110_1(uniques, 3);
+  f_001_110_110_111_0(uniques, 3);
+  f_001_110_110_111_1(uniques, 3);
+  f_001_110_111_000_0(uniques, 3);
+  f_001_110_111_000_1(uniques, 3);
+  f_001_110_111_001_0(uniques, 3);
+  f_001_110_111_001_1(uniques, 3);
+  f_001_110_111_010_0(uniques, 3);
+  f_001_110_111_010_1(uniques, 3);
+  f_001_110_111_011_0(uniques, 3);
+  f_001_110_111_011_1(uniques, 3);
+  f_001_110_111_100_0(uniques, 3);
+  f_001_110_111_100_1(uniques, 3);
+  f_001_110_111_101_0(uniques, 3);
+  f_001_110_111_101_1(uniques, 3);
+  f_001_110_111_110_0(uniques, 3);
+  f_001_110_111_110_1(uniques, 3);
+  f_001_110_111_111_0(uniques, 3);
+  f_001_110_111_111_1(uniques, 3);
+  f_001_111_000_000_0(uniques, 3);
+  f_001_111_000_000_1(uniques, 3);
+  f_001_111_000_001_0(uniques, 3);
+  f_001_111_000_001_1(uniques, 3);
+  f_001_111_000_010_0(uniques, 3);
+  f_001_111_000_010_1(uniques, 3);
+  f_001_111_000_011_0(uniques, 3);
+  f_001_111_000_011_1(uniques, 3);
+  f_001_111_000_100_0(uniques, 3);
+  f_001_111_000_100_1(uniques, 3);
+  f_001_111_000_101_0(uniques, 3);
+  f_001_111_000_101_1(uniques, 3);
+  f_001_111_000_110_0(uniques, 3);
+  f_001_111_000_110_1(uniques, 3);
+  f_001_111_000_111_0(uniques, 3);
+  f_001_111_000_111_1(uniques, 3);
+  f_001_111_001_000_0(uniques, 3);
+  f_001_111_001_000_1(uniques, 3);
+  f_001_111_001_001_0(uniques, 3);
+  f_001_111_001_001_1(uniques, 3);
+  f_001_111_001_010_0(uniques, 3);
+  f_001_111_001_010_1(uniques, 3);
+  f_001_111_001_011_0(uniques, 3);
+  f_001_111_001_011_1(uniques, 3);
+  f_001_111_001_100_0(uniques, 3);
+  f_001_111_001_100_1(uniques, 3);
+  f_001_111_001_101_0(uniques, 3);
+  f_001_111_001_101_1(uniques, 3);
+  f_001_111_001_110_0(uniques, 3);
+  f_001_111_001_110_1(uniques, 3);
+  f_001_111_001_111_0(uniques, 3);
+  f_001_111_001_111_1(uniques, 3);
+  f_001_111_010_000_0(uniques, 3);
+  f_001_111_010_000_1(uniques, 3);
+  f_001_111_010_001_0(uniques, 3);
+  f_001_111_010_001_1(uniques, 3);
+  f_001_111_010_010_0(uniques, 3);
+  f_001_111_010_010_1(uniques, 3);
+  f_001_111_010_011_0(uniques, 3);
+  f_001_111_010_011_1(uniques, 3);
+  f_001_111_010_100_0(uniques, 3);
+  f_001_111_010_100_1(uniques, 3);
+  f_001_111_010_101_0(uniques, 3);
+  f_001_111_010_101_1(uniques, 3);
+  f_001_111_010_110_0(uniques, 3);
+  f_001_111_010_110_1(uniques, 3);
+  f_001_111_010_111_0(uniques, 3);
+  f_001_111_010_111_1(uniques, 3);
+  f_001_111_011_000_0(uniques, 3);
+  f_001_111_011_000_1(uniques, 3);
+  f_001_111_011_001_0(uniques, 3);
+  f_001_111_011_001_1(uniques, 3);
+  f_001_111_011_010_0(uniques, 3);
+  f_001_111_011_010_1(uniques, 3);
+  f_001_111_011_011_0(uniques, 3);
+  f_001_111_011_011_1(uniques, 3);
+  f_001_111_011_100_0(uniques, 3);
+  f_001_111_011_100_1(uniques, 3);
+  f_001_111_011_101_0(uniques, 3);
+  f_001_111_011_101_1(uniques, 3);
+  f_001_111_011_110_0(uniques, 3);
+  f_001_111_011_110_1(uniques, 3);
+  f_001_111_011_111_0(uniques, 3);
+  f_001_111_011_111_1(uniques, 3);
+  f_001_111_100_000_0(uniques, 3);
+  f_001_111_100_000_1(uniques, 3);
+  f_001_111_100_001_0(uniques, 3);
+  f_001_111_100_001_1(uniques, 3);
+  f_001_111_100_010_0(uniques, 3);
+  f_001_111_100_010_1(uniques, 3);
+  f_001_111_100_011_0(uniques, 3);
+  f_001_111_100_011_1(uniques, 3);
+  f_001_111_100_100_0(uniques, 3);
+  f_001_111_100_100_1(uniques, 3);
+  f_001_111_100_101_0(uniques, 3);
+  f_001_111_100_101_1(uniques, 3);
+  f_001_111_100_110_0(uniques, 3);
+  f_001_111_100_110_1(uniques, 3);
+  f_001_111_100_111_0(uniques, 3);
+  f_001_111_100_111_1(uniques, 3);
+  f_001_111_101_000_0(uniques, 3);
+  f_001_111_101_000_1(uniques, 3);
+  f_001_111_101_001_0(uniques, 3);
+  f_001_111_101_001_1(uniques, 3);
+  f_001_111_101_010_0(uniques, 3);
+  f_001_111_101_010_1(uniques, 3);
+  f_001_111_101_011_0(uniques, 3);
+  f_001_111_101_011_1(uniques, 3);
+  f_001_111_101_100_0(uniques, 3);
+  f_001_111_101_100_1(uniques, 3);
+  f_001_111_101_101_0(uniques, 3);
+  f_001_111_101_101_1(uniques, 3);
+  f_001_111_101_110_0(uniques, 3);
+  f_001_111_101_110_1(uniques, 3);
+  f_001_111_101_111_0(uniques, 3);
+  f_001_111_101_111_1(uniques, 3);
+  f_001_111_110_000_0(uniques, 3);
+  f_001_111_110_000_1(uniques, 3);
+  f_001_111_110_001_0(uniques, 3);
+  f_001_111_110_001_1(uniques, 3);
+  f_001_111_110_010_0(uniques, 3);
+  f_001_111_110_010_1(uniques, 3);
+  f_001_111_110_011_0(uniques, 3);
+  f_001_111_110_011_1(uniques, 3);
+  f_001_111_110_100_0(uniques, 3);
+  f_001_111_110_100_1(uniques, 3);
+  f_001_111_110_101_0(uniques, 3);
+  f_001_111_110_101_1(uniques, 3);
+  f_001_111_110_110_0(uniques, 3);
+  f_001_111_110_110_1(uniques, 3);
+  f_001_111_110_111_0(uniques, 3);
+  f_001_111_110_111_1(uniques, 3);
+  f_001_111_111_000_0(uniques, 3);
+  f_001_111_111_000_1(uniques, 3);
+  f_001_111_111_001_0(uniques, 3);
+  f_001_111_111_001_1(uniques, 3);
+  f_001_111_111_010_0(uniques, 3);
+  f_001_111_111_010_1(uniques, 3);
+  f_001_111_111_011_0(uniques, 3);
+  f_001_111_111_011_1(uniques, 3);
+  f_001_111_111_100_0(uniques, 3);
+  f_001_111_111_100_1(uniques, 3);
+  f_001_111_111_101_0(uniques, 3);
+  f_001_111_111_101_1(uniques, 3);
+  f_001_111_111_110_0(uniques, 3);
+  f_001_111_111_110_1(uniques, 3);
+  f_001_111_111_111_0(uniques, 3);
+  f_001_111_111_111_1(uniques, 3);
+  f_010_100_000_000_0(uniques, 3);
+  f_010_100_000_000_1(uniques, 3);
+  f_010_100_000_001_0(uniques, 3);
+  f_010_100_000_001_1(uniques, 3);
+  f_010_100_000_010_0(uniques, 3);
+  f_010_100_000_010_1(uniques, 3);
+  f_010_100_000_011_0(uniques, 3);
+  f_010_100_000_011_1(uniques, 3);
+  f_010_100_000_100_0(uniques, 3);
+  f_010_100_000_100_1(uniques, 3);
+  f_010_100_000_101_0(uniques, 3);
+  f_010_100_000_101_1(uniques, 3);
+  f_010_100_000_110_0(uniques, 3);
+  f_010_100_000_110_1(uniques, 3);
+  f_010_100_000_111_0(uniques, 3);
+  f_010_100_000_111_1(uniques, 3);
+  f_010_100_001_000_0(uniques, 3);
+  f_010_100_001_000_1(uniques, 3);
+  f_010_100_001_001_0(uniques, 3);
+  f_010_100_001_001_1(uniques, 3);
+  f_010_100_001_010_0(uniques, 3);
+  f_010_100_001_010_1(uniques, 3);
+  f_010_100_001_011_0(uniques, 3);
+  f_010_100_001_011_1(uniques, 3);
+  f_010_100_001_100_0(uniques, 3);
+  f_010_100_001_100_1(uniques, 3);
+  f_010_100_001_101_0(uniques, 3);
+  f_010_100_001_101_1(uniques, 3);
+  f_010_100_001_110_0(uniques, 3);
+  f_010_100_001_110_1(uniques, 3);
+  f_010_100_001_111_0(uniques, 3);
+  f_010_100_001_111_1(uniques, 3);
+  f_010_100_010_000_0(uniques, 3);
+  f_010_100_010_000_1(uniques, 3);
+  f_010_100_010_001_0(uniques, 3);
+  f_010_100_010_001_1(uniques, 3);
+  f_010_100_010_010_0(uniques, 3);
+  f_010_100_010_010_1(uniques, 3);
+  f_010_100_010_011_0(uniques, 3);
+  f_010_100_010_011_1(uniques, 3);
+  f_010_100_010_100_0(uniques, 3);
+  f_010_100_010_100_1(uniques, 3);
+  f_010_100_010_101_0(uniques, 3);
+  f_010_100_010_101_1(uniques, 3);
+  f_010_100_010_110_0(uniques, 3);
+  f_010_100_010_110_1(uniques, 3);
+  f_010_100_010_111_0(uniques, 3);
+  f_010_100_010_111_1(uniques, 3);
+  f_010_100_011_000_0(uniques, 3);
+  f_010_100_011_000_1(uniques, 3);
+  f_010_100_011_001_0(uniques, 3);
+  f_010_100_011_001_1(uniques, 3);
+  f_010_100_011_010_0(uniques, 3);
+  f_010_100_011_010_1(uniques, 3);
+  f_010_100_011_011_0(uniques, 3);
+  f_010_100_011_011_1(uniques, 3);
+  f_010_100_011_100_0(uniques, 3);
+  f_010_100_011_100_1(uniques, 3);
+  f_010_100_011_101_0(uniques, 3);
+  f_010_100_011_101_1(uniques, 3);
+  f_010_100_011_110_0(uniques, 3);
+  f_010_100_011_110_1(uniques, 3);
+  f_010_100_011_111_0(uniques, 3);
+  f_010_100_011_111_1(uniques, 3);
+  f_010_100_100_000_0(uniques, 3);
+  f_010_100_100_000_1(uniques, 3);
+  f_010_100_100_001_0(uniques, 3);
+  f_010_100_100_001_1(uniques, 3);
+  f_010_100_100_010_0(uniques, 3);
+  f_010_100_100_010_1(uniques, 3);
+  f_010_100_100_011_0(uniques, 3);
+  f_010_100_100_011_1(uniques, 3);
+  f_010_100_100_100_0(uniques, 3);
+  f_010_100_100_100_1(uniques, 3);
+  f_010_100_100_101_0(uniques, 3);
+  f_010_100_100_101_1(uniques, 3);
+  f_010_100_100_110_0(uniques, 3);
+  f_010_100_100_110_1(uniques, 3);
+  f_010_100_100_111_0(uniques, 3);
+  f_010_100_100_111_1(uniques, 3);
+  f_010_100_101_000_0(uniques, 3);
+  f_010_100_101_000_1(uniques, 3);
+  f_010_100_101_001_0(uniques, 3);
+  f_010_100_101_001_1(uniques, 3);
+  f_010_100_101_010_0(uniques, 3);
+  f_010_100_101_010_1(uniques, 3);
+  f_010_100_101_011_0(uniques, 3);
+  f_010_100_101_011_1(uniques, 3);
+  f_010_100_101_100_0(uniques, 3);
+  f_010_100_101_100_1(uniques, 3);
+  f_010_100_101_101_0(uniques, 3);
+  f_010_100_101_101_1(uniques, 3);
+  f_010_100_101_110_0(uniques, 3);
+  f_010_100_101_110_1(uniques, 3);
+  f_010_100_101_111_0(uniques, 3);
+  f_010_100_101_111_1(uniques, 3);
+  f_010_100_110_000_0(uniques, 3);
+  f_010_100_110_000_1(uniques, 3);
+  f_010_100_110_001_0(uniques, 3);
+  f_010_100_110_001_1(uniques, 3);
+  f_010_100_110_010_0(uniques, 3);
+  f_010_100_110_010_1(uniques, 3);
+  f_010_100_110_011_0(uniques, 3);
+  f_010_100_110_011_1(uniques, 3);
+  f_010_100_110_100_0(uniques, 3);
+  f_010_100_110_100_1(uniques, 3);
+  f_010_100_110_101_0(uniques, 3);
+  f_010_100_110_101_1(uniques, 3);
+  f_010_100_110_110_0(uniques, 3);
+  f_010_100_110_110_1(uniques, 3);
+  f_010_100_110_111_0(uniques, 3);
+  f_010_100_110_111_1(uniques, 3);
+  f_010_100_111_000_0(uniques, 3);
+  f_010_100_111_000_1(uniques, 3);
+  f_010_100_111_001_0(uniques, 3);
+  f_010_100_111_001_1(uniques, 3);
+  f_010_100_111_010_0(uniques, 3);
+  f_010_100_111_010_1(uniques, 3);
+  f_010_100_111_011_0(uniques, 3);
+  f_010_100_111_011_1(uniques, 3);
+  f_010_100_111_100_0(uniques, 3);
+  f_010_100_111_100_1(uniques, 3);
+  f_010_100_111_101_0(uniques, 3);
+  f_010_100_111_101_1(uniques, 3);
+  f_010_100_111_110_0(uniques, 3);
+  f_010_100_111_110_1(uniques, 3);
+  f_010_100_111_111_0(uniques, 3);
+  f_010_100_111_111_1(uniques, 3);
+  f_010_101_000_000_0(uniques, 3);
+  f_010_101_000_000_1(uniques, 3);
+  f_010_101_000_001_0(uniques, 3);
+  f_010_101_000_001_1(uniques, 3);
+  f_010_101_000_010_0(uniques, 3);
+  f_010_101_000_010_1(uniques, 3);
+  f_010_101_000_011_0(uniques, 3);
+  f_010_101_000_011_1(uniques, 3);
+  f_010_101_000_100_0(uniques, 3);
+  f_010_101_000_100_1(uniques, 3);
+  f_010_101_000_101_0(uniques, 3);
+  f_010_101_000_101_1(uniques, 3);
+  f_010_101_000_110_0(uniques, 3);
+  f_010_101_000_110_1(uniques, 3);
+  f_010_101_000_111_0(uniques, 3);
+  f_010_101_000_111_1(uniques, 3);
+  f_010_101_001_000_0(uniques, 3);
+  f_010_101_001_000_1(uniques, 3);
+  f_010_101_001_001_0(uniques, 3);
+  f_010_101_001_001_1(uniques, 3);
+  f_010_101_001_010_0(uniques, 3);
+  f_010_101_001_010_1(uniques, 3);
+  f_010_101_001_011_0(uniques, 3);
+  f_010_101_001_011_1(uniques, 3);
+  f_010_101_001_100_0(uniques, 3);
+  f_010_101_001_100_1(uniques, 3);
+  f_010_101_001_101_0(uniques, 3);
+  f_010_101_001_101_1(uniques, 3);
+  f_010_101_001_110_0(uniques, 3);
+  f_010_101_001_110_1(uniques, 3);
+  f_010_101_001_111_0(uniques, 3);
+  f_010_101_001_111_1(uniques, 3);
+  f_010_101_010_000_0(uniques, 3);
+  f_010_101_010_000_1(uniques, 3);
+  f_010_101_010_001_0(uniques, 3);
+  f_010_101_010_001_1(uniques, 3);
+  f_010_101_010_010_0(uniques, 3);
+  f_010_101_010_010_1(uniques, 3);
+  f_010_101_010_011_0(uniques, 3);
+  f_010_101_010_011_1(uniques, 3);
+  f_010_101_010_100_0(uniques, 3);
+  f_010_101_010_100_1(uniques, 3);
+  f_010_101_010_101_0(uniques, 3);
+  f_010_101_010_101_1(uniques, 3);
+  f_010_101_010_110_0(uniques, 3);
+  f_010_101_010_110_1(uniques, 3);
+  f_010_101_010_111_0(uniques, 3);
+  f_010_101_010_111_1(uniques, 3);
+  f_010_101_011_000_0(uniques, 3);
+  f_010_101_011_000_1(uniques, 3);
+  f_010_101_011_001_0(uniques, 3);
+  f_010_101_011_001_1(uniques, 3);
+  f_010_101_011_010_0(uniques, 3);
+  f_010_101_011_010_1(uniques, 3);
+  f_010_101_011_011_0(uniques, 3);
+  f_010_101_011_011_1(uniques, 3);
+  f_010_101_011_100_0(uniques, 3);
+  f_010_101_011_100_1(uniques, 3);
+  f_010_101_011_101_0(uniques, 3);
+  f_010_101_011_101_1(uniques, 3);
+  f_010_101_011_110_0(uniques, 3);
+  f_010_101_011_110_1(uniques, 3);
+  f_010_101_011_111_0(uniques, 3);
+  f_010_101_011_111_1(uniques, 3);
+  f_010_101_100_000_0(uniques, 3);
+  f_010_101_100_000_1(uniques, 3);
+  f_010_101_100_001_0(uniques, 3);
+  f_010_101_100_001_1(uniques, 3);
+  f_010_101_100_010_0(uniques, 3);
+  f_010_101_100_010_1(uniques, 3);
+  f_010_101_100_011_0(uniques, 3);
+  f_010_101_100_011_1(uniques, 3);
+  f_010_101_100_100_0(uniques, 3);
+  f_010_101_100_100_1(uniques, 3);
+  f_010_101_100_101_0(uniques, 3);
+  f_010_101_100_101_1(uniques, 3);
+  f_010_101_100_110_0(uniques, 3);
+  f_010_101_100_110_1(uniques, 3);
+  f_010_101_100_111_0(uniques, 3);
+  f_010_101_100_111_1(uniques, 3);
+  f_010_101_101_000_0(uniques, 3);
+  f_010_101_101_000_1(uniques, 3);
+  f_010_101_101_001_0(uniques, 3);
+  f_010_101_101_001_1(uniques, 3);
+  f_010_101_101_010_0(uniques, 3);
+  f_010_101_101_010_1(uniques, 3);
+  f_010_101_101_011_0(uniques, 3);
+  f_010_101_101_011_1(uniques, 3);
+  f_010_101_101_100_0(uniques, 3);
+  f_010_101_101_100_1(uniques, 3);
+  f_010_101_101_101_0(uniques, 3);
+  f_010_101_101_101_1(uniques, 3);
+  f_010_101_101_110_0(uniques, 3);
+  f_010_101_101_110_1(uniques, 3);
+  f_010_101_101_111_0(uniques, 3);
+  f_010_101_101_111_1(uniques, 3);
+  f_010_101_110_000_0(uniques, 3);
+  f_010_101_110_000_1(uniques, 3);
+  f_010_101_110_001_0(uniques, 3);
+  f_010_101_110_001_1(uniques, 3);
+  f_010_101_110_010_0(uniques, 3);
+  f_010_101_110_010_1(uniques, 3);
+  f_010_101_110_011_0(uniques, 3);
+  f_010_101_110_011_1(uniques, 3);
+  f_010_101_110_100_0(uniques, 3);
+  f_010_101_110_100_1(uniques, 3);
+  f_010_101_110_101_0(uniques, 3);
+  f_010_101_110_101_1(uniques, 3);
+  f_010_101_110_110_0(uniques, 3);
+  f_010_101_110_110_1(uniques, 3);
+  f_010_101_110_111_0(uniques, 3);
+  f_010_101_110_111_1(uniques, 3);
+  f_010_101_111_000_0(uniques, 3);
+  f_010_101_111_000_1(uniques, 3);
+  f_010_101_111_001_0(uniques, 3);
+  f_010_101_111_001_1(uniques, 3);
+  f_010_101_111_010_0(uniques, 3);
+  f_010_101_111_010_1(uniques, 3);
+  f_010_101_111_011_0(uniques, 3);
+  f_010_101_111_011_1(uniques, 3);
+  f_010_101_111_100_0(uniques, 3);
+  f_010_101_111_100_1(uniques, 3);
+  f_010_101_111_101_0(uniques, 3);
+  f_010_101_111_101_1(uniques, 3);
+  f_010_101_111_110_0(uniques, 3);
+  f_010_101_111_110_1(uniques, 3);
+  f_010_101_111_111_0(uniques, 3);
+  f_010_101_111_111_1(uniques, 3);
+  f_010_110_000_000_0(uniques, 3);
+  f_010_110_000_000_1(uniques, 3);
+  f_010_110_000_001_0(uniques, 3);
+  f_010_110_000_001_1(uniques, 3);
+  f_010_110_000_010_0(uniques, 3);
+  f_010_110_000_010_1(uniques, 3);
+  f_010_110_000_011_0(uniques, 3);
+  f_010_110_000_011_1(uniques, 3);
+  f_010_110_000_100_0(uniques, 3);
+  f_010_110_000_100_1(uniques, 3);
+  f_010_110_000_101_0(uniques, 3);
+  f_010_110_000_101_1(uniques, 3);
+  f_010_110_000_110_0(uniques, 3);
+  f_010_110_000_110_1(uniques, 3);
+  f_010_110_000_111_0(uniques, 3);
+  f_010_110_000_111_1(uniques, 3);
+  f_010_110_001_000_0(uniques, 3);
+  f_010_110_001_000_1(uniques, 3);
+  f_010_110_001_001_0(uniques, 3);
+  f_010_110_001_001_1(uniques, 3);
+  f_010_110_001_010_0(uniques, 3);
+  f_010_110_001_010_1(uniques, 3);
+  f_010_110_001_011_0(uniques, 3);
+  f_010_110_001_011_1(uniques, 3);
+  f_010_110_001_100_0(uniques, 3);
+  f_010_110_001_100_1(uniques, 3);
+  f_010_110_001_101_0(uniques, 3);
+  f_010_110_001_101_1(uniques, 3);
+  f_010_110_001_110_0(uniques, 3);
+  f_010_110_001_110_1(uniques, 3);
+  f_010_110_001_111_0(uniques, 3);
+  f_010_110_001_111_1(uniques, 3);
+  f_010_110_010_000_0(uniques, 3);
+  f_010_110_010_000_1(uniques, 3);
+  f_010_110_010_001_0(uniques, 3);
+  f_010_110_010_001_1(uniques, 3);
+  f_010_110_010_010_0(uniques, 3);
+  f_010_110_010_010_1(uniques, 3);
+  f_010_110_010_011_0(uniques, 3);
+  f_010_110_010_011_1(uniques, 3);
+  f_010_110_010_100_0(uniques, 3);
+  f_010_110_010_100_1(uniques, 3);
+  f_010_110_010_101_0(uniques, 3);
+  f_010_110_010_101_1(uniques, 3);
+  f_010_110_010_110_0(uniques, 3);
+  f_010_110_010_110_1(uniques, 3);
+  f_010_110_010_111_0(uniques, 3);
+  f_010_110_010_111_1(uniques, 3);
+  f_010_110_011_000_0(uniques, 3);
+  f_010_110_011_000_1(uniques, 3);
+  f_010_110_011_001_0(uniques, 3);
+  f_010_110_011_001_1(uniques, 3);
+  f_010_110_011_010_0(uniques, 3);
+  f_010_110_011_010_1(uniques, 3);
+  f_010_110_011_011_0(uniques, 3);
+  f_010_110_011_011_1(uniques, 3);
+  f_010_110_011_100_0(uniques, 3);
+  f_010_110_011_100_1(uniques, 3);
+  f_010_110_011_101_0(uniques, 3);
+  f_010_110_011_101_1(uniques, 3);
+  f_010_110_011_110_0(uniques, 3);
+  f_010_110_011_110_1(uniques, 3);
+  f_010_110_011_111_0(uniques, 3);
+  f_010_110_011_111_1(uniques, 3);
+  f_010_110_100_000_0(uniques, 3);
+  f_010_110_100_000_1(uniques, 3);
+  f_010_110_100_001_0(uniques, 3);
+  f_010_110_100_001_1(uniques, 3);
+  f_010_110_100_010_0(uniques, 3);
+  f_010_110_100_010_1(uniques, 3);
+  f_010_110_100_011_0(uniques, 3);
+  f_010_110_100_011_1(uniques, 3);
+  f_010_110_100_100_0(uniques, 3);
+  f_010_110_100_100_1(uniques, 3);
+  f_010_110_100_101_0(uniques, 3);
+  f_010_110_100_101_1(uniques, 3);
+  f_010_110_100_110_0(uniques, 3);
+  f_010_110_100_110_1(uniques, 3);
+  f_010_110_100_111_0(uniques, 3);
+  f_010_110_100_111_1(uniques, 3);
+  f_010_110_101_000_0(uniques, 3);
+  f_010_110_101_000_1(uniques, 3);
+  f_010_110_101_001_0(uniques, 3);
+  f_010_110_101_001_1(uniques, 3);
+  f_010_110_101_010_0(uniques, 3);
+  f_010_110_101_010_1(uniques, 3);
+  f_010_110_101_011_0(uniques, 3);
+  f_010_110_101_011_1(uniques, 3);
+  f_010_110_101_100_0(uniques, 3);
+  f_010_110_101_100_1(uniques, 3);
+  f_010_110_101_101_0(uniques, 3);
+  f_010_110_101_101_1(uniques, 3);
+  f_010_110_101_110_0(uniques, 3);
+  f_010_110_101_110_1(uniques, 3);
+  f_010_110_101_111_0(uniques, 3);
+  f_010_110_101_111_1(uniques, 3);
+  f_010_110_110_000_0(uniques, 3);
+  f_010_110_110_000_1(uniques, 3);
+  f_010_110_110_001_0(uniques, 3);
+  f_010_110_110_001_1(uniques, 3);
+  f_010_110_110_010_0(uniques, 3);
+  f_010_110_110_010_1(uniques, 3);
+  f_010_110_110_011_0(uniques, 3);
+  f_010_110_110_011_1(uniques, 3);
+  f_010_110_110_100_0(uniques, 3);
+  f_010_110_110_100_1(uniques, 3);
+  f_010_110_110_101_0(uniques, 3);
+  f_010_110_110_101_1(uniques, 3);
+  f_010_110_110_110_0(uniques, 3);
+  f_010_110_110_110_1(uniques, 3);
+  f_010_110_110_111_0(uniques, 3);
+  f_010_110_110_111_1(uniques, 3);
+  f_010_110_111_000_0(uniques, 3);
+  f_010_110_111_000_1(uniques, 3);
+  f_010_110_111_001_0(uniques, 3);
+  f_010_110_111_001_1(uniques, 3);
+  f_010_110_111_010_0(uniques, 3);
+  f_010_110_111_010_1(uniques, 3);
+  f_010_110_111_011_0(uniques, 3);
+  f_010_110_111_011_1(uniques, 3);
+  f_010_110_111_100_0(uniques, 3);
+  f_010_110_111_100_1(uniques, 3);
+  f_010_110_111_101_0(uniques, 3);
+  f_010_110_111_101_1(uniques, 3);
+  f_010_110_111_110_0(uniques, 3);
+  f_010_110_111_110_1(uniques, 3);
+  f_010_110_111_111_0(uniques, 3);
+  f_010_110_111_111_1(uniques, 3);
+  f_010_111_000_000_0(uniques, 3);
+  f_010_111_000_000_1(uniques, 3);
+  f_010_111_000_001_0(uniques, 3);
+  f_010_111_000_001_1(uniques, 3);
+  f_010_111_000_010_0(uniques, 3);
+  f_010_111_000_010_1(uniques, 3);
+  f_010_111_000_011_0(uniques, 3);
+  f_010_111_000_011_1(uniques, 3);
+  f_010_111_000_100_0(uniques, 3);
+  f_010_111_000_100_1(uniques, 3);
+  f_010_111_000_101_0(uniques, 3);
+  f_010_111_000_101_1(uniques, 3);
+  f_010_111_000_110_0(uniques, 3);
+  f_010_111_000_110_1(uniques, 3);
+  f_010_111_000_111_0(uniques, 3);
+  f_010_111_000_111_1(uniques, 3);
+  f_010_111_001_000_0(uniques, 3);
+  f_010_111_001_000_1(uniques, 3);
+  f_010_111_001_001_0(uniques, 3);
+  f_010_111_001_001_1(uniques, 3);
+  f_010_111_001_010_0(uniques, 3);
+  f_010_111_001_010_1(uniques, 3);
+  f_010_111_001_011_0(uniques, 3);
+  f_010_111_001_011_1(uniques, 3);
+  f_010_111_001_100_0(uniques, 3);
+  f_010_111_001_100_1(uniques, 3);
+  f_010_111_001_101_0(uniques, 3);
+  f_010_111_001_101_1(uniques, 3);
+  f_010_111_001_110_0(uniques, 3);
+  f_010_111_001_110_1(uniques, 3);
+  f_010_111_001_111_0(uniques, 3);
+  f_010_111_001_111_1(uniques, 3);
+  f_010_111_010_000_0(uniques, 3);
+  f_010_111_010_000_1(uniques, 3);
+  f_010_111_010_001_0(uniques, 3);
+  f_010_111_010_001_1(uniques, 3);
+  f_010_111_010_010_0(uniques, 3);
+  f_010_111_010_010_1(uniques, 3);
+  f_010_111_010_011_0(uniques, 3);
+  f_010_111_010_011_1(uniques, 3);
+  f_010_111_010_100_0(uniques, 3);
+  f_010_111_010_100_1(uniques, 3);
+  f_010_111_010_101_0(uniques, 3);
+  f_010_111_010_101_1(uniques, 3);
+  f_010_111_010_110_0(uniques, 3);
+  f_010_111_010_110_1(uniques, 3);
+  f_010_111_010_111_0(uniques, 3);
+  f_010_111_010_111_1(uniques, 3);
+  f_010_111_011_000_0(uniques, 3);
+  f_010_111_011_000_1(uniques, 3);
+  f_010_111_011_001_0(uniques, 3);
+  f_010_111_011_001_1(uniques, 3);
+  f_010_111_011_010_0(uniques, 3);
+  f_010_111_011_010_1(uniques, 3);
+  f_010_111_011_011_0(uniques, 3);
+  f_010_111_011_011_1(uniques, 3);
+  f_010_111_011_100_0(uniques, 3);
+  f_010_111_011_100_1(uniques, 3);
+  f_010_111_011_101_0(uniques, 3);
+  f_010_111_011_101_1(uniques, 3);
+  f_010_111_011_110_0(uniques, 3);
+  f_010_111_011_110_1(uniques, 3);
+  f_010_111_011_111_0(uniques, 3);
+  f_010_111_011_111_1(uniques, 3);
+  f_010_111_100_000_0(uniques, 3);
+  f_010_111_100_000_1(uniques, 3);
+  f_010_111_100_001_0(uniques, 3);
+  f_010_111_100_001_1(uniques, 3);
+  f_010_111_100_010_0(uniques, 3);
+  f_010_111_100_010_1(uniques, 3);
+  f_010_111_100_011_0(uniques, 3);
+  f_010_111_100_011_1(uniques, 3);
+  f_010_111_100_100_0(uniques, 3);
+  f_010_111_100_100_1(uniques, 3);
+  f_010_111_100_101_0(uniques, 3);
+  f_010_111_100_101_1(uniques, 3);
+  f_010_111_100_110_0(uniques, 3);
+  f_010_111_100_110_1(uniques, 3);
+  f_010_111_100_111_0(uniques, 3);
+  f_010_111_100_111_1(uniques, 3);
+  f_010_111_101_000_0(uniques, 3);
+  f_010_111_101_000_1(uniques, 3);
+  f_010_111_101_001_0(uniques, 3);
+  f_010_111_101_001_1(uniques, 3);
+  f_010_111_101_010_0(uniques, 3);
+  f_010_111_101_010_1(uniques, 3);
+  f_010_111_101_011_0(uniques, 3);
+  f_010_111_101_011_1(uniques, 3);
+  f_010_111_101_100_0(uniques, 3);
+  f_010_111_101_100_1(uniques, 3);
+  f_010_111_101_101_0(uniques, 3);
+  f_010_111_101_101_1(uniques, 3);
+  f_010_111_101_110_0(uniques, 3);
+  f_010_111_101_110_1(uniques, 3);
+  f_010_111_101_111_0(uniques, 3);
+  f_010_111_101_111_1(uniques, 3);
+  f_010_111_110_000_0(uniques, 3);
+  f_010_111_110_000_1(uniques, 3);
+  f_010_111_110_001_0(uniques, 3);
+  f_010_111_110_001_1(uniques, 3);
+  f_010_111_110_010_0(uniques, 3);
+  f_010_111_110_010_1(uniques, 3);
+  f_010_111_110_011_0(uniques, 3);
+  f_010_111_110_011_1(uniques, 3);
+  f_010_111_110_100_0(uniques, 3);
+  f_010_111_110_100_1(uniques, 3);
+  f_010_111_110_101_0(uniques, 3);
+  f_010_111_110_101_1(uniques, 3);
+  f_010_111_110_110_0(uniques, 3);
+  f_010_111_110_110_1(uniques, 3);
+  f_010_111_110_111_0(uniques, 3);
+  f_010_111_110_111_1(uniques, 3);
+  f_010_111_111_000_0(uniques, 3);
+  f_010_111_111_000_1(uniques, 3);
+  f_010_111_111_001_0(uniques, 3);
+  f_010_111_111_001_1(uniques, 3);
+  f_010_111_111_010_0(uniques, 3);
+  f_010_111_111_010_1(uniques, 3);
+  f_010_111_111_011_0(uniques, 3);
+  f_010_111_111_011_1(uniques, 3);
+  f_010_111_111_100_0(uniques, 3);
+  f_010_111_111_100_1(uniques, 3);
+  f_010_111_111_101_0(uniques, 3);
+  f_010_111_111_101_1(uniques, 3);
+  f_010_111_111_110_0(uniques, 3);
+  f_010_111_111_110_1(uniques, 3);
+  f_010_111_111_111_0(uniques, 3);
+  f_010_111_111_111_1(uniques, 3);
+  f_011_100_000_000_0(uniques, 3);
+  f_011_100_000_000_1(uniques, 3);
+  f_011_100_000_001_0(uniques, 3);
+  f_011_100_000_001_1(uniques, 3);
+  f_011_100_000_010_0(uniques, 3);
+  f_011_100_000_010_1(uniques, 3);
+  f_011_100_000_011_0(uniques, 3);
+  f_011_100_000_011_1(uniques, 3);
+  f_011_100_000_100_0(uniques, 3);
+  f_011_100_000_100_1(uniques, 3);
+  f_011_100_000_101_0(uniques, 3);
+  f_011_100_000_101_1(uniques, 3);
+  f_011_100_000_110_0(uniques, 3);
+  f_011_100_000_110_1(uniques, 3);
+  f_011_100_000_111_0(uniques, 3);
+  f_011_100_000_111_1(uniques, 3);
+  f_011_100_001_000_0(uniques, 3);
+  f_011_100_001_000_1(uniques, 3);
+  f_011_100_001_001_0(uniques, 3);
+  f_011_100_001_001_1(uniques, 3);
+  f_011_100_001_010_0(uniques, 3);
+  f_011_100_001_010_1(uniques, 3);
+  f_011_100_001_011_0(uniques, 3);
+  f_011_100_001_011_1(uniques, 3);
+  f_011_100_001_100_0(uniques, 3);
+  f_011_100_001_100_1(uniques, 3);
+  f_011_100_001_101_0(uniques, 3);
+  f_011_100_001_101_1(uniques, 3);
+  f_011_100_001_110_0(uniques, 3);
+  f_011_100_001_110_1(uniques, 3);
+  f_011_100_001_111_0(uniques, 3);
+  f_011_100_001_111_1(uniques, 3);
+  f_011_100_010_000_0(uniques, 3);
+  f_011_100_010_000_1(uniques, 3);
+  f_011_100_010_001_0(uniques, 3);
+  f_011_100_010_001_1(uniques, 3);
+  f_011_100_010_010_0(uniques, 3);
+  f_011_100_010_010_1(uniques, 3);
+  f_011_100_010_011_0(uniques, 3);
+  f_011_100_010_011_1(uniques, 3);
+  f_011_100_010_100_0(uniques, 3);
+  f_011_100_010_100_1(uniques, 3);
+  f_011_100_010_101_0(uniques, 3);
+  f_011_100_010_101_1(uniques, 3);
+  f_011_100_010_110_0(uniques, 3);
+  f_011_100_010_110_1(uniques, 3);
+  f_011_100_010_111_0(uniques, 3);
+  f_011_100_010_111_1(uniques, 3);
+  f_011_100_011_000_0(uniques, 3);
+  f_011_100_011_000_1(uniques, 3);
+  f_011_100_011_001_0(uniques, 3);
+  f_011_100_011_001_1(uniques, 3);
+  f_011_100_011_010_0(uniques, 3);
+  f_011_100_011_010_1(uniques, 3);
+  f_011_100_011_011_0(uniques, 3);
+  f_011_100_011_011_1(uniques, 3);
+  f_011_100_011_100_0(uniques, 3);
+  f_011_100_011_100_1(uniques, 3);
+  f_011_100_011_101_0(uniques, 3);
+  f_011_100_011_101_1(uniques, 3);
+  f_011_100_011_110_0(uniques, 3);
+  f_011_100_011_110_1(uniques, 3);
+  f_011_100_011_111_0(uniques, 3);
+  f_011_100_011_111_1(uniques, 3);
+  f_011_100_100_000_0(uniques, 3);
+  f_011_100_100_000_1(uniques, 3);
+  f_011_100_100_001_0(uniques, 3);
+  f_011_100_100_001_1(uniques, 3);
+  f_011_100_100_010_0(uniques, 3);
+  f_011_100_100_010_1(uniques, 3);
+  f_011_100_100_011_0(uniques, 3);
+  f_011_100_100_011_1(uniques, 3);
+  f_011_100_100_100_0(uniques, 3);
+  f_011_100_100_100_1(uniques, 3);
+  f_011_100_100_101_0(uniques, 3);
+  f_011_100_100_101_1(uniques, 3);
+  f_011_100_100_110_0(uniques, 3);
+  f_011_100_100_110_1(uniques, 3);
+  f_011_100_100_111_0(uniques, 3);
+  f_011_100_100_111_1(uniques, 3);
+  f_011_100_101_000_0(uniques, 3);
+  f_011_100_101_000_1(uniques, 3);
+  f_011_100_101_001_0(uniques, 3);
+  f_011_100_101_001_1(uniques, 3);
+  f_011_100_101_010_0(uniques, 3);
+  f_011_100_101_010_1(uniques, 3);
+  f_011_100_101_011_0(uniques, 3);
+  f_011_100_101_011_1(uniques, 3);
+  f_011_100_101_100_0(uniques, 3);
+  f_011_100_101_100_1(uniques, 3);
+  f_011_100_101_101_0(uniques, 3);
+  f_011_100_101_101_1(uniques, 3);
+  f_011_100_101_110_0(uniques, 3);
+  f_011_100_101_110_1(uniques, 3);
+  f_011_100_101_111_0(uniques, 3);
+  f_011_100_101_111_1(uniques, 3);
+  f_011_100_110_000_0(uniques, 3);
+  f_011_100_110_000_1(uniques, 3);
+  f_011_100_110_001_0(uniques, 3);
+  f_011_100_110_001_1(uniques, 3);
+  f_011_100_110_010_0(uniques, 3);
+  f_011_100_110_010_1(uniques, 3);
+  f_011_100_110_011_0(uniques, 3);
+  f_011_100_110_011_1(uniques, 3);
+  f_011_100_110_100_0(uniques, 3);
+  f_011_100_110_100_1(uniques, 3);
+  f_011_100_110_101_0(uniques, 3);
+  f_011_100_110_101_1(uniques, 3);
+  f_011_100_110_110_0(uniques, 3);
+  f_011_100_110_110_1(uniques, 3);
+  f_011_100_110_111_0(uniques, 3);
+  f_011_100_110_111_1(uniques, 3);
+  f_011_100_111_000_0(uniques, 3);
+  f_011_100_111_000_1(uniques, 3);
+  f_011_100_111_001_0(uniques, 3);
+  f_011_100_111_001_1(uniques, 3);
+  f_011_100_111_010_0(uniques, 3);
+  f_011_100_111_010_1(uniques, 3);
+  f_011_100_111_011_0(uniques, 3);
+  f_011_100_111_011_1(uniques, 3);
+  f_011_100_111_100_0(uniques, 3);
+  f_011_100_111_100_1(uniques, 3);
+  f_011_100_111_101_0(uniques, 3);
+  f_011_100_111_101_1(uniques, 3);
+  f_011_100_111_110_0(uniques, 3);
+  f_011_100_111_110_1(uniques, 3);
+  f_011_100_111_111_0(uniques, 3);
+  f_011_100_111_111_1(uniques, 3);
+  f_011_101_000_000_0(uniques, 3);
+  f_011_101_000_000_1(uniques, 3);
+  f_011_101_000_001_0(uniques, 3);
+  f_011_101_000_001_1(uniques, 3);
+  f_011_101_000_010_0(uniques, 3);
+  f_011_101_000_010_1(uniques, 3);
+  f_011_101_000_011_0(uniques, 3);
+  f_011_101_000_011_1(uniques, 3);
+  f_011_101_000_100_0(uniques, 3);
+  f_011_101_000_100_1(uniques, 3);
+  f_011_101_000_101_0(uniques, 3);
+  f_011_101_000_101_1(uniques, 3);
+  f_011_101_000_110_0(uniques, 3);
+  f_011_101_000_110_1(uniques, 3);
+  f_011_101_000_111_0(uniques, 3);
+  f_011_101_000_111_1(uniques, 3);
+  f_011_101_001_000_0(uniques, 3);
+  f_011_101_001_000_1(uniques, 3);
+  f_011_101_001_001_0(uniques, 3);
+  f_011_101_001_001_1(uniques, 3);
+  f_011_101_001_010_0(uniques, 3);
+  f_011_101_001_010_1(uniques, 3);
+  f_011_101_001_011_0(uniques, 3);
+  f_011_101_001_011_1(uniques, 3);
+  f_011_101_001_100_0(uniques, 3);
+  f_011_101_001_100_1(uniques, 3);
+  f_011_101_001_101_0(uniques, 3);
+  f_011_101_001_101_1(uniques, 3);
+  f_011_101_001_110_0(uniques, 3);
+  f_011_101_001_110_1(uniques, 3);
+  f_011_101_001_111_0(uniques, 3);
+  f_011_101_001_111_1(uniques, 3);
+  f_011_101_010_000_0(uniques, 3);
+  f_011_101_010_000_1(uniques, 3);
+  f_011_101_010_001_0(uniques, 3);
+  f_011_101_010_001_1(uniques, 3);
+  f_011_101_010_010_0(uniques, 3);
+  f_011_101_010_010_1(uniques, 3);
+  f_011_101_010_011_0(uniques, 3);
+  f_011_101_010_011_1(uniques, 3);
+  f_011_101_010_100_0(uniques, 3);
+  f_011_101_010_100_1(uniques, 3);
+  f_011_101_010_101_0(uniques, 3);
+  f_011_101_010_101_1(uniques, 3);
+  f_011_101_010_110_0(uniques, 3);
+  f_011_101_010_110_1(uniques, 3);
+  f_011_101_010_111_0(uniques, 3);
+  f_011_101_010_111_1(uniques, 3);
+  f_011_101_011_000_0(uniques, 3);
+  f_011_101_011_000_1(uniques, 3);
+  f_011_101_011_001_0(uniques, 3);
+  f_011_101_011_001_1(uniques, 3);
+  f_011_101_011_010_0(uniques, 3);
+  f_011_101_011_010_1(uniques, 3);
+  f_011_101_011_011_0(uniques, 3);
+  f_011_101_011_011_1(uniques, 3);
+  f_011_101_011_100_0(uniques, 3);
+  f_011_101_011_100_1(uniques, 3);
+  f_011_101_011_101_0(uniques, 3);
+  f_011_101_011_101_1(uniques, 3);
+  f_011_101_011_110_0(uniques, 3);
+  f_011_101_011_110_1(uniques, 3);
+  f_011_101_011_111_0(uniques, 3);
+  f_011_101_011_111_1(uniques, 3);
+  f_011_101_100_000_0(uniques, 3);
+  f_011_101_100_000_1(uniques, 3);
+  f_011_101_100_001_0(uniques, 3);
+  f_011_101_100_001_1(uniques, 3);
+  f_011_101_100_010_0(uniques, 3);
+  f_011_101_100_010_1(uniques, 3);
+  f_011_101_100_011_0(uniques, 3);
+  f_011_101_100_011_1(uniques, 3);
+  f_011_101_100_100_0(uniques, 3);
+  f_011_101_100_100_1(uniques, 3);
+  f_011_101_100_101_0(uniques, 3);
+  f_011_101_100_101_1(uniques, 3);
+  f_011_101_100_110_0(uniques, 3);
+  f_011_101_100_110_1(uniques, 3);
+  f_011_101_100_111_0(uniques, 3);
+  f_011_101_100_111_1(uniques, 3);
+  f_011_101_101_000_0(uniques, 3);
+  f_011_101_101_000_1(uniques, 3);
+  f_011_101_101_001_0(uniques, 3);
+  f_011_101_101_001_1(uniques, 3);
+  f_011_101_101_010_0(uniques, 3);
+  f_011_101_101_010_1(uniques, 3);
+  f_011_101_101_011_0(uniques, 3);
+  f_011_101_101_011_1(uniques, 3);
+  f_011_101_101_100_0(uniques, 3);
+  f_011_101_101_100_1(uniques, 3);
+  f_011_101_101_101_0(uniques, 3);
+  f_011_101_101_101_1(uniques, 3);
+  f_011_101_101_110_0(uniques, 3);
+  f_011_101_101_110_1(uniques, 3);
+  f_011_101_101_111_0(uniques, 3);
+  f_011_101_101_111_1(uniques, 3);
+  f_011_101_110_000_0(uniques, 3);
+  f_011_101_110_000_1(uniques, 3);
+  f_011_101_110_001_0(uniques, 3);
+  f_011_101_110_001_1(uniques, 3);
+  f_011_101_110_010_0(uniques, 3);
+  f_011_101_110_010_1(uniques, 3);
+  f_011_101_110_011_0(uniques, 3);
+  f_011_101_110_011_1(uniques, 3);
+  f_011_101_110_100_0(uniques, 3);
+  f_011_101_110_100_1(uniques, 3);
+  f_011_101_110_101_0(uniques, 3);
+  f_011_101_110_101_1(uniques, 3);
+  f_011_101_110_110_0(uniques, 3);
+  f_011_101_110_110_1(uniques, 3);
+  f_011_101_110_111_0(uniques, 3);
+  f_011_101_110_111_1(uniques, 3);
+  f_011_101_111_000_0(uniques, 3);
+  f_011_101_111_000_1(uniques, 3);
+  f_011_101_111_001_0(uniques, 3);
+  f_011_101_111_001_1(uniques, 3);
+  f_011_101_111_010_0(uniques, 3);
+  f_011_101_111_010_1(uniques, 3);
+  f_011_101_111_011_0(uniques, 3);
+  f_011_101_111_011_1(uniques, 3);
+  f_011_101_111_100_0(uniques, 3);
+  f_011_101_111_100_1(uniques, 3);
+  f_011_101_111_101_0(uniques, 3);
+  f_011_101_111_101_1(uniques, 3);
+  f_011_101_111_110_0(uniques, 3);
+  f_011_101_111_110_1(uniques, 3);
+  f_011_101_111_111_0(uniques, 3);
+  f_011_101_111_111_1(uniques, 3);
+  f_011_110_000_000_0(uniques, 3);
+  f_011_110_000_000_1(uniques, 3);
+  f_011_110_000_001_0(uniques, 3);
+  f_011_110_000_001_1(uniques, 3);
+  f_011_110_000_010_0(uniques, 3);
+  f_011_110_000_010_1(uniques, 3);
+  f_011_110_000_011_0(uniques, 3);
+  f_011_110_000_011_1(uniques, 3);
+  f_011_110_000_100_0(uniques, 3);
+  f_011_110_000_100_1(uniques, 3);
+  f_011_110_000_101_0(uniques, 3);
+  f_011_110_000_101_1(uniques, 3);
+  f_011_110_000_110_0(uniques, 3);
+  f_011_110_000_110_1(uniques, 3);
+  f_011_110_000_111_0(uniques, 3);
+  f_011_110_000_111_1(uniques, 3);
+  f_011_110_001_000_0(uniques, 3);
+  f_011_110_001_000_1(uniques, 3);
+  f_011_110_001_001_0(uniques, 3);
+  f_011_110_001_001_1(uniques, 3);
+  f_011_110_001_010_0(uniques, 3);
+  f_011_110_001_010_1(uniques, 3);
+  f_011_110_001_011_0(uniques, 3);
+  f_011_110_001_011_1(uniques, 3);
+  f_011_110_001_100_0(uniques, 3);
+  f_011_110_001_100_1(uniques, 3);
+  f_011_110_001_101_0(uniques, 3);
+  f_011_110_001_101_1(uniques, 3);
+  f_011_110_001_110_0(uniques, 3);
+  f_011_110_001_110_1(uniques, 3);
+  f_011_110_001_111_0(uniques, 3);
+  f_011_110_001_111_1(uniques, 3);
+  f_011_110_010_000_0(uniques, 3);
+  f_011_110_010_000_1(uniques, 3);
+  f_011_110_010_001_0(uniques, 3);
+  f_011_110_010_001_1(uniques, 3);
+  f_011_110_010_010_0(uniques, 3);
+  f_011_110_010_010_1(uniques, 3);
+  f_011_110_010_011_0(uniques, 3);
+  f_011_110_010_011_1(uniques, 3);
+  f_011_110_010_100_0(uniques, 3);
+  f_011_110_010_100_1(uniques, 3);
+  f_011_110_010_101_0(uniques, 3);
+  f_011_110_010_101_1(uniques, 3);
+  f_011_110_010_110_0(uniques, 3);
+  f_011_110_010_110_1(uniques, 3);
+  f_011_110_010_111_0(uniques, 3);
+  f_011_110_010_111_1(uniques, 3);
+  f_011_110_011_000_0(uniques, 3);
+  f_011_110_011_000_1(uniques, 3);
+  f_011_110_011_001_0(uniques, 3);
+  f_011_110_011_001_1(uniques, 3);
+  f_011_110_011_010_0(uniques, 3);
+  f_011_110_011_010_1(uniques, 3);
+  f_011_110_011_011_0(uniques, 3);
+  f_011_110_011_011_1(uniques, 3);
+  f_011_110_011_100_0(uniques, 3);
+  f_011_110_011_100_1(uniques, 3);
+  f_011_110_011_101_0(uniques, 3);
+  f_011_110_011_101_1(uniques, 3);
+  f_011_110_011_110_0(uniques, 3);
+  f_011_110_011_110_1(uniques, 3);
+  f_011_110_011_111_0(uniques, 3);
+  f_011_110_011_111_1(uniques, 3);
+  f_011_110_100_000_0(uniques, 3);
+  f_011_110_100_000_1(uniques, 3);
+  f_011_110_100_001_0(uniques, 3);
+  f_011_110_100_001_1(uniques, 3);
+  f_011_110_100_010_0(uniques, 3);
+  f_011_110_100_010_1(uniques, 3);
+  f_011_110_100_011_0(uniques, 3);
+  f_011_110_100_011_1(uniques, 3);
+  f_011_110_100_100_0(uniques, 3);
+  f_011_110_100_100_1(uniques, 3);
+  f_011_110_100_101_0(uniques, 3);
+  f_011_110_100_101_1(uniques, 3);
+  f_011_110_100_110_0(uniques, 3);
+  f_011_110_100_110_1(uniques, 3);
+  f_011_110_100_111_0(uniques, 3);
+  f_011_110_100_111_1(uniques, 3);
+  f_011_110_101_000_0(uniques, 3);
+  f_011_110_101_000_1(uniques, 3);
+  f_011_110_101_001_0(uniques, 3);
+  f_011_110_101_001_1(uniques, 3);
+  f_011_110_101_010_0(uniques, 3);
+  f_011_110_101_010_1(uniques, 3);
+  f_011_110_101_011_0(uniques, 3);
+  f_011_110_101_011_1(uniques, 3);
+  f_011_110_101_100_0(uniques, 3);
+  f_011_110_101_100_1(uniques, 3);
+  f_011_110_101_101_0(uniques, 3);
+  f_011_110_101_101_1(uniques, 3);
+  f_011_110_101_110_0(uniques, 3);
+  f_011_110_101_110_1(uniques, 3);
+  f_011_110_101_111_0(uniques, 3);
+  f_011_110_101_111_1(uniques, 3);
+  f_011_110_110_000_0(uniques, 3);
+  f_011_110_110_000_1(uniques, 3);
+  f_011_110_110_001_0(uniques, 3);
+  f_011_110_110_001_1(uniques, 3);
+  f_011_110_110_010_0(uniques, 3);
+  f_011_110_110_010_1(uniques, 3);
+  f_011_110_110_011_0(uniques, 3);
+  f_011_110_110_011_1(uniques, 3);
+  f_011_110_110_100_0(uniques, 3);
+  f_011_110_110_100_1(uniques, 3);
+  f_011_110_110_101_0(uniques, 3);
+  f_011_110_110_101_1(uniques, 3);
+  f_011_110_110_110_0(uniques, 3);
+  f_011_110_110_110_1(uniques, 3);
+  f_011_110_110_111_0(uniques, 3);
+  f_011_110_110_111_1(uniques, 3);
+  f_011_110_111_000_0(uniques, 3);
+  f_011_110_111_000_1(uniques, 3);
+  f_011_110_111_001_0(uniques, 3);
+  f_011_110_111_001_1(uniques, 3);
+  f_011_110_111_010_0(uniques, 3);
+  f_011_110_111_010_1(uniques, 3);
+  f_011_110_111_011_0(uniques, 3);
+  f_011_110_111_011_1(uniques, 3);
+  f_011_110_111_100_0(uniques, 3);
+  f_011_110_111_100_1(uniques, 3);
+  f_011_110_111_101_0(uniques, 3);
+  f_011_110_111_101_1(uniques, 3);
+  f_011_110_111_110_0(uniques, 3);
+  f_011_110_111_110_1(uniques, 3);
+  f_011_110_111_111_0(uniques, 3);
+  f_011_110_111_111_1(uniques, 3);
+  f_011_111_000_000_0(uniques, 3);
+  f_011_111_000_000_1(uniques, 3);
+  f_011_111_000_001_0(uniques, 3);
+  f_011_111_000_001_1(uniques, 3);
+  f_011_111_000_010_0(uniques, 3);
+  f_011_111_000_010_1(uniques, 3);
+  f_011_111_000_011_0(uniques, 3);
+  f_011_111_000_011_1(uniques, 3);
+  f_011_111_000_100_0(uniques, 3);
+  f_011_111_000_100_1(uniques, 3);
+  f_011_111_000_101_0(uniques, 3);
+  f_011_111_000_101_1(uniques, 3);
+  f_011_111_000_110_0(uniques, 3);
+  f_011_111_000_110_1(uniques, 3);
+  f_011_111_000_111_0(uniques, 3);
+  f_011_111_000_111_1(uniques, 3);
+  f_011_111_001_000_0(uniques, 3);
+  f_011_111_001_000_1(uniques, 3);
+  f_011_111_001_001_0(uniques, 3);
+  f_011_111_001_001_1(uniques, 3);
+  f_011_111_001_010_0(uniques, 3);
+  f_011_111_001_010_1(uniques, 3);
+  f_011_111_001_011_0(uniques, 3);
+  f_011_111_001_011_1(uniques, 3);
+  f_011_111_001_100_0(uniques, 3);
+  f_011_111_001_100_1(uniques, 3);
+  f_011_111_001_101_0(uniques, 3);
+  f_011_111_001_101_1(uniques, 3);
+  f_011_111_001_110_0(uniques, 3);
+  f_011_111_001_110_1(uniques, 3);
+  f_011_111_001_111_0(uniques, 3);
+  f_011_111_001_111_1(uniques, 3);
+  f_011_111_010_000_0(uniques, 3);
+  f_011_111_010_000_1(uniques, 3);
+  f_011_111_010_001_0(uniques, 3);
+  f_011_111_010_001_1(uniques, 3);
+  f_011_111_010_010_0(uniques, 3);
+  f_011_111_010_010_1(uniques, 3);
+  f_011_111_010_011_0(uniques, 3);
+  f_011_111_010_011_1(uniques, 3);
+  f_011_111_010_100_0(uniques, 3);
+  f_011_111_010_100_1(uniques, 3);
+  f_011_111_010_101_0(uniques, 3);
+  f_011_111_010_101_1(uniques, 3);
+  f_011_111_010_110_0(uniques, 3);
+  f_011_111_010_110_1(uniques, 3);
+  f_011_111_010_111_0(uniques, 3);
+  f_011_111_010_111_1(uniques, 3);
+  f_011_111_011_000_0(uniques, 3);
+  f_011_111_011_000_1(uniques, 3);
+  f_011_111_011_001_0(uniques, 3);
+  f_011_111_011_001_1(uniques, 3);
+  f_011_111_011_010_0(uniques, 3);
+  f_011_111_011_010_1(uniques, 3);
+  f_011_111_011_011_0(uniques, 3);
+  f_011_111_011_011_1(uniques, 3);
+  f_011_111_011_100_0(uniques, 3);
+  f_011_111_011_100_1(uniques, 3);
+  f_011_111_011_101_0(uniques, 3);
+  f_011_111_011_101_1(uniques, 3);
+  f_011_111_011_110_0(uniques, 3);
+  f_011_111_011_110_1(uniques, 3);
+  f_011_111_011_111_0(uniques, 3);
+  f_011_111_011_111_1(uniques, 3);
+  f_011_111_100_000_0(uniques, 3);
+  f_011_111_100_000_1(uniques, 3);
+  f_011_111_100_001_0(uniques, 3);
+  f_011_111_100_001_1(uniques, 3);
+  f_011_111_100_010_0(uniques, 3);
+  f_011_111_100_010_1(uniques, 3);
+  f_011_111_100_011_0(uniques, 3);
+  f_011_111_100_011_1(uniques, 3);
+  f_011_111_100_100_0(uniques, 3);
+  f_011_111_100_100_1(uniques, 3);
+  f_011_111_100_101_0(uniques, 3);
+  f_011_111_100_101_1(uniques, 3);
+  f_011_111_100_110_0(uniques, 3);
+  f_011_111_100_110_1(uniques, 3);
+  f_011_111_100_111_0(uniques, 3);
+  f_011_111_100_111_1(uniques, 3);
+  f_011_111_101_000_0(uniques, 3);
+  f_011_111_101_000_1(uniques, 3);
+  f_011_111_101_001_0(uniques, 3);
+  f_011_111_101_001_1(uniques, 3);
+  f_011_111_101_010_0(uniques, 3);
+  f_011_111_101_010_1(uniques, 3);
+  f_011_111_101_011_0(uniques, 3);
+  f_011_111_101_011_1(uniques, 3);
+  f_011_111_101_100_0(uniques, 3);
+  f_011_111_101_100_1(uniques, 3);
+  f_011_111_101_101_0(uniques, 3);
+  f_011_111_101_101_1(uniques, 3);
+  f_011_111_101_110_0(uniques, 3);
+  f_011_111_101_110_1(uniques, 3);
+  f_011_111_101_111_0(uniques, 3);
+  f_011_111_101_111_1(uniques, 3);
+  f_011_111_110_000_0(uniques, 3);
+  f_011_111_110_000_1(uniques, 3);
+  f_011_111_110_001_0(uniques, 3);
+  f_011_111_110_001_1(uniques, 3);
+  f_011_111_110_010_0(uniques, 3);
+  f_011_111_110_010_1(uniques, 3);
+  f_011_111_110_011_0(uniques, 3);
+  f_011_111_110_011_1(uniques, 3);
+  f_011_111_110_100_0(uniques, 3);
+  f_011_111_110_100_1(uniques, 3);
+  f_011_111_110_101_0(uniques, 3);
+  f_011_111_110_101_1(uniques, 3);
+  f_011_111_110_110_0(uniques, 3);
+  f_011_111_110_110_1(uniques, 3);
+  f_011_111_110_111_0(uniques, 3);
+  f_011_111_110_111_1(uniques, 3);
+  f_011_111_111_000_0(uniques, 3);
+  f_011_111_111_000_1(uniques, 3);
+  f_011_111_111_001_0(uniques, 3);
+  f_011_111_111_001_1(uniques, 3);
+  f_011_111_111_010_0(uniques, 3);
+  f_011_111_111_010_1(uniques, 3);
+  f_011_111_111_011_0(uniques, 3);
+  f_011_111_111_011_1(uniques, 3);
+  f_011_111_111_100_0(uniques, 3);
+  f_011_111_111_100_1(uniques, 3);
+  f_011_111_111_101_0(uniques, 3);
+  f_011_111_111_101_1(uniques, 3);
+  f_011_111_111_110_0(uniques, 3);
+  f_011_111_111_110_1(uniques, 3);
+  f_011_111_111_111_0(uniques, 3);
+  f_011_111_111_111_1(uniques, 3);
+  f_100_100_000_000_0(uniques, 3);
+  f_100_100_000_000_1(uniques, 3);
+  f_100_100_000_001_0(uniques, 3);
+  f_100_100_000_001_1(uniques, 3);
+  f_100_100_000_010_0(uniques, 3);
+  f_100_100_000_010_1(uniques, 3);
+  f_100_100_000_011_0(uniques, 3);
+  f_100_100_000_011_1(uniques, 3);
+  f_100_100_000_100_0(uniques, 3);
+  f_100_100_000_100_1(uniques, 3);
+  f_100_100_000_101_0(uniques, 3);
+  f_100_100_000_101_1(uniques, 3);
+  f_100_100_000_110_0(uniques, 3);
+  f_100_100_000_110_1(uniques, 3);
+  f_100_100_000_111_0(uniques, 3);
+  f_100_100_000_111_1(uniques, 3);
+  f_100_100_001_000_0(uniques, 3);
+  f_100_100_001_000_1(uniques, 3);
+  f_100_100_001_001_0(uniques, 3);
+  f_100_100_001_001_1(uniques, 3);
+  f_100_100_001_010_0(uniques, 3);
+  f_100_100_001_010_1(uniques, 3);
+  f_100_100_001_011_0(uniques, 3);
+  f_100_100_001_011_1(uniques, 3);
+  f_100_100_001_100_0(uniques, 3);
+  f_100_100_001_100_1(uniques, 3);
+  f_100_100_001_101_0(uniques, 3);
+  f_100_100_001_101_1(uniques, 3);
+  f_100_100_001_110_0(uniques, 3);
+  f_100_100_001_110_1(uniques, 3);
+  f_100_100_001_111_0(uniques, 3);
+  f_100_100_001_111_1(uniques, 3);
+  f_100_100_010_000_0(uniques, 3);
+  f_100_100_010_000_1(uniques, 3);
+  f_100_100_010_001_0(uniques, 3);
+  f_100_100_010_001_1(uniques, 3);
+  f_100_100_010_010_0(uniques, 3);
+  f_100_100_010_010_1(uniques, 3);
+  f_100_100_010_011_0(uniques, 3);
+  f_100_100_010_011_1(uniques, 3);
+  f_100_100_010_100_0(uniques, 3);
+  f_100_100_010_100_1(uniques, 3);
+  f_100_100_010_101_0(uniques, 3);
+  f_100_100_010_101_1(uniques, 3);
+  f_100_100_010_110_0(uniques, 3);
+  f_100_100_010_110_1(uniques, 3);
+  f_100_100_010_111_0(uniques, 3);
+  f_100_100_010_111_1(uniques, 3);
+  f_100_100_011_000_0(uniques, 3);
+  f_100_100_011_000_1(uniques, 3);
+  f_100_100_011_001_0(uniques, 3);
+  f_100_100_011_001_1(uniques, 3);
+  f_100_100_011_010_0(uniques, 3);
+  f_100_100_011_010_1(uniques, 3);
+  f_100_100_011_011_0(uniques, 3);
+  f_100_100_011_011_1(uniques, 3);
+  f_100_100_011_100_0(uniques, 3);
+  f_100_100_011_100_1(uniques, 3);
+  f_100_100_011_101_0(uniques, 3);
+  f_100_100_011_101_1(uniques, 3);
+  f_100_100_011_110_0(uniques, 3);
+  f_100_100_011_110_1(uniques, 3);
+  f_100_100_011_111_0(uniques, 3);
+  f_100_100_011_111_1(uniques, 3);
+  f_100_100_100_000_0(uniques, 3);
+  f_100_100_100_000_1(uniques, 3);
+  f_100_100_100_001_0(uniques, 3);
+  f_100_100_100_001_1(uniques, 3);
+  f_100_100_100_010_0(uniques, 3);
+  f_100_100_100_010_1(uniques, 3);
+  f_100_100_100_011_0(uniques, 3);
+  f_100_100_100_011_1(uniques, 3);
+  f_100_100_100_100_0(uniques, 3);
+  f_100_100_100_100_1(uniques, 3);
+  f_100_100_100_101_0(uniques, 3);
+  f_100_100_100_101_1(uniques, 3);
+  f_100_100_100_110_0(uniques, 3);
+  f_100_100_100_110_1(uniques, 3);
+  f_100_100_100_111_0(uniques, 3);
+  f_100_100_100_111_1(uniques, 3);
+  f_100_100_101_000_0(uniques, 3);
+  f_100_100_101_000_1(uniques, 3);
+  f_100_100_101_001_0(uniques, 3);
+  f_100_100_101_001_1(uniques, 3);
+  f_100_100_101_010_0(uniques, 3);
+  f_100_100_101_010_1(uniques, 3);
+  f_100_100_101_011_0(uniques, 3);
+  f_100_100_101_011_1(uniques, 3);
+  f_100_100_101_100_0(uniques, 3);
+  f_100_100_101_100_1(uniques, 3);
+  f_100_100_101_101_0(uniques, 3);
+  f_100_100_101_101_1(uniques, 3);
+  f_100_100_101_110_0(uniques, 3);
+  f_100_100_101_110_1(uniques, 3);
+  f_100_100_101_111_0(uniques, 3);
+  f_100_100_101_111_1(uniques, 3);
+  f_100_100_110_000_0(uniques, 3);
+  f_100_100_110_000_1(uniques, 3);
+  f_100_100_110_001_0(uniques, 3);
+  f_100_100_110_001_1(uniques, 3);
+  f_100_100_110_010_0(uniques, 3);
+  f_100_100_110_010_1(uniques, 3);
+  f_100_100_110_011_0(uniques, 3);
+  f_100_100_110_011_1(uniques, 3);
+  f_100_100_110_100_0(uniques, 3);
+  f_100_100_110_100_1(uniques, 3);
+  f_100_100_110_101_0(uniques, 3);
+  f_100_100_110_101_1(uniques, 3);
+  f_100_100_110_110_0(uniques, 3);
+  f_100_100_110_110_1(uniques, 3);
+  f_100_100_110_111_0(uniques, 3);
+  f_100_100_110_111_1(uniques, 3);
+  f_100_100_111_000_0(uniques, 3);
+  f_100_100_111_000_1(uniques, 3);
+  f_100_100_111_001_0(uniques, 3);
+  f_100_100_111_001_1(uniques, 3);
+  f_100_100_111_010_0(uniques, 3);
+  f_100_100_111_010_1(uniques, 3);
+  f_100_100_111_011_0(uniques, 3);
+  f_100_100_111_011_1(uniques, 3);
+  f_100_100_111_100_0(uniques, 3);
+  f_100_100_111_100_1(uniques, 3);
+  f_100_100_111_101_0(uniques, 3);
+  f_100_100_111_101_1(uniques, 3);
+  f_100_100_111_110_0(uniques, 3);
+  f_100_100_111_110_1(uniques, 3);
+  f_100_100_111_111_0(uniques, 3);
+  f_100_100_111_111_1(uniques, 3);
+  f_100_101_000_000_0(uniques, 3);
+  f_100_101_000_000_1(uniques, 3);
+  f_100_101_000_001_0(uniques, 3);
+  f_100_101_000_001_1(uniques, 3);
+  f_100_101_000_010_0(uniques, 3);
+  f_100_101_000_010_1(uniques, 3);
+  f_100_101_000_011_0(uniques, 3);
+  f_100_101_000_011_1(uniques, 3);
+  f_100_101_000_100_0(uniques, 3);
+  f_100_101_000_100_1(uniques, 3);
+  f_100_101_000_101_0(uniques, 3);
+  f_100_101_000_101_1(uniques, 3);
+  f_100_101_000_110_0(uniques, 3);
+  f_100_101_000_110_1(uniques, 3);
+  f_100_101_000_111_0(uniques, 3);
+  f_100_101_000_111_1(uniques, 3);
+  f_100_101_001_000_0(uniques, 3);
+  f_100_101_001_000_1(uniques, 3);
+  f_100_101_001_001_0(uniques, 3);
+  f_100_101_001_001_1(uniques, 3);
+  f_100_101_001_010_0(uniques, 3);
+  f_100_101_001_010_1(uniques, 3);
+  f_100_101_001_011_0(uniques, 3);
+  f_100_101_001_011_1(uniques, 3);
+  f_100_101_001_100_0(uniques, 3);
+  f_100_101_001_100_1(uniques, 3);
+  f_100_101_001_101_0(uniques, 3);
+  f_100_101_001_101_1(uniques, 3);
+  f_100_101_001_110_0(uniques, 3);
+  f_100_101_001_110_1(uniques, 3);
+  f_100_101_001_111_0(uniques, 3);
+  f_100_101_001_111_1(uniques, 3);
+  f_100_101_010_000_0(uniques, 3);
+  f_100_101_010_000_1(uniques, 3);
+  f_100_101_010_001_0(uniques, 3);
+  f_100_101_010_001_1(uniques, 3);
+  f_100_101_010_010_0(uniques, 3);
+  f_100_101_010_010_1(uniques, 3);
+  f_100_101_010_011_0(uniques, 3);
+  f_100_101_010_011_1(uniques, 3);
+  f_100_101_010_100_0(uniques, 3);
+  f_100_101_010_100_1(uniques, 3);
+  f_100_101_010_101_0(uniques, 3);
+  f_100_101_010_101_1(uniques, 3);
+  f_100_101_010_110_0(uniques, 3);
+  f_100_101_010_110_1(uniques, 3);
+  f_100_101_010_111_0(uniques, 3);
+  f_100_101_010_111_1(uniques, 3);
+  f_100_101_011_000_0(uniques, 3);
+  f_100_101_011_000_1(uniques, 3);
+  f_100_101_011_001_0(uniques, 3);
+  f_100_101_011_001_1(uniques, 3);
+  f_100_101_011_010_0(uniques, 3);
+  f_100_101_011_010_1(uniques, 3);
+  f_100_101_011_011_0(uniques, 3);
+  f_100_101_011_011_1(uniques, 3);
+  f_100_101_011_100_0(uniques, 3);
+  f_100_101_011_100_1(uniques, 3);
+  f_100_101_011_101_0(uniques, 3);
+  f_100_101_011_101_1(uniques, 3);
+  f_100_101_011_110_0(uniques, 3);
+  f_100_101_011_110_1(uniques, 3);
+  f_100_101_011_111_0(uniques, 3);
+  f_100_101_011_111_1(uniques, 3);
+  f_100_101_100_000_0(uniques, 3);
+  f_100_101_100_000_1(uniques, 3);
+  f_100_101_100_001_0(uniques, 3);
+  f_100_101_100_001_1(uniques, 3);
+  f_100_101_100_010_0(uniques, 3);
+  f_100_101_100_010_1(uniques, 3);
+  f_100_101_100_011_0(uniques, 3);
+  f_100_101_100_011_1(uniques, 3);
+  f_100_101_100_100_0(uniques, 3);
+  f_100_101_100_100_1(uniques, 3);
+  f_100_101_100_101_0(uniques, 3);
+  f_100_101_100_101_1(uniques, 3);
+  f_100_101_100_110_0(uniques, 3);
+  f_100_101_100_110_1(uniques, 3);
+  f_100_101_100_111_0(uniques, 3);
+  f_100_101_100_111_1(uniques, 3);
+  f_100_101_101_000_0(uniques, 3);
+  f_100_101_101_000_1(uniques, 3);
+  f_100_101_101_001_0(uniques, 3);
+  f_100_101_101_001_1(uniques, 3);
+  f_100_101_101_010_0(uniques, 3);
+  f_100_101_101_010_1(uniques, 3);
+  f_100_101_101_011_0(uniques, 3);
+  f_100_101_101_011_1(uniques, 3);
+  f_100_101_101_100_0(uniques, 3);
+  f_100_101_101_100_1(uniques, 3);
+  f_100_101_101_101_0(uniques, 3);
+  f_100_101_101_101_1(uniques, 3);
+  f_100_101_101_110_0(uniques, 3);
+  f_100_101_101_110_1(uniques, 3);
+  f_100_101_101_111_0(uniques, 3);
+  f_100_101_101_111_1(uniques, 3);
+  f_100_101_110_000_0(uniques, 3);
+  f_100_101_110_000_1(uniques, 3);
+  f_100_101_110_001_0(uniques, 3);
+  f_100_101_110_001_1(uniques, 3);
+  f_100_101_110_010_0(uniques, 3);
+  f_100_101_110_010_1(uniques, 3);
+  f_100_101_110_011_0(uniques, 3);
+  f_100_101_110_011_1(uniques, 3);
+  f_100_101_110_100_0(uniques, 3);
+  f_100_101_110_100_1(uniques, 3);
+  f_100_101_110_101_0(uniques, 3);
+  f_100_101_110_101_1(uniques, 3);
+  f_100_101_110_110_0(uniques, 3);
+  f_100_101_110_110_1(uniques, 3);
+  f_100_101_110_111_0(uniques, 3);
+  f_100_101_110_111_1(uniques, 3);
+  f_100_101_111_000_0(uniques, 3);
+  f_100_101_111_000_1(uniques, 3);
+  f_100_101_111_001_0(uniques, 3);
+  f_100_101_111_001_1(uniques, 3);
+  f_100_101_111_010_0(uniques, 3);
+  f_100_101_111_010_1(uniques, 3);
+  f_100_101_111_011_0(uniques, 3);
+  f_100_101_111_011_1(uniques, 3);
+  f_100_101_111_100_0(uniques, 3);
+  f_100_101_111_100_1(uniques, 3);
+  f_100_101_111_101_0(uniques, 3);
+  f_100_101_111_101_1(uniques, 3);
+  f_100_101_111_110_0(uniques, 3);
+  f_100_101_111_110_1(uniques, 3);
+  f_100_101_111_111_0(uniques, 3);
+  f_100_101_111_111_1(uniques, 3);
+  f_100_110_000_000_0(uniques, 3);
+  f_100_110_000_000_1(uniques, 3);
+  f_100_110_000_001_0(uniques, 3);
+  f_100_110_000_001_1(uniques, 3);
+  f_100_110_000_010_0(uniques, 3);
+  f_100_110_000_010_1(uniques, 3);
+  f_100_110_000_011_0(uniques, 3);
+  f_100_110_000_011_1(uniques, 3);
+  f_100_110_000_100_0(uniques, 3);
+  f_100_110_000_100_1(uniques, 3);
+  f_100_110_000_101_0(uniques, 3);
+  f_100_110_000_101_1(uniques, 3);
+  f_100_110_000_110_0(uniques, 3);
+  f_100_110_000_110_1(uniques, 3);
+  f_100_110_000_111_0(uniques, 3);
+  f_100_110_000_111_1(uniques, 3);
+  f_100_110_001_000_0(uniques, 3);
+  f_100_110_001_000_1(uniques, 3);
+  f_100_110_001_001_0(uniques, 3);
+  f_100_110_001_001_1(uniques, 3);
+  f_100_110_001_010_0(uniques, 3);
+  f_100_110_001_010_1(uniques, 3);
+  f_100_110_001_011_0(uniques, 3);
+  f_100_110_001_011_1(uniques, 3);
+  f_100_110_001_100_0(uniques, 3);
+  f_100_110_001_100_1(uniques, 3);
+  f_100_110_001_101_0(uniques, 3);
+  f_100_110_001_101_1(uniques, 3);
+  f_100_110_001_110_0(uniques, 3);
+  f_100_110_001_110_1(uniques, 3);
+  f_100_110_001_111_0(uniques, 3);
+  f_100_110_001_111_1(uniques, 3);
+  f_100_110_010_000_0(uniques, 3);
+  f_100_110_010_000_1(uniques, 3);
+  f_100_110_010_001_0(uniques, 3);
+  f_100_110_010_001_1(uniques, 3);
+  f_100_110_010_010_0(uniques, 3);
+  f_100_110_010_010_1(uniques, 3);
+  f_100_110_010_011_0(uniques, 3);
+  f_100_110_010_011_1(uniques, 3);
+  f_100_110_010_100_0(uniques, 3);
+  f_100_110_010_100_1(uniques, 3);
+  f_100_110_010_101_0(uniques, 3);
+  f_100_110_010_101_1(uniques, 3);
+  f_100_110_010_110_0(uniques, 3);
+  f_100_110_010_110_1(uniques, 3);
+  f_100_110_010_111_0(uniques, 3);
+  f_100_110_010_111_1(uniques, 3);
+  f_100_110_011_000_0(uniques, 3);
+  f_100_110_011_000_1(uniques, 3);
+  f_100_110_011_001_0(uniques, 3);
+  f_100_110_011_001_1(uniques, 3);
+  f_100_110_011_010_0(uniques, 3);
+  f_100_110_011_010_1(uniques, 3);
+  f_100_110_011_011_0(uniques, 3);
+  f_100_110_011_011_1(uniques, 3);
+  f_100_110_011_100_0(uniques, 3);
+  f_100_110_011_100_1(uniques, 3);
+  f_100_110_011_101_0(uniques, 3);
+  f_100_110_011_101_1(uniques, 3);
+  f_100_110_011_110_0(uniques, 3);
+  f_100_110_011_110_1(uniques, 3);
+  f_100_110_011_111_0(uniques, 3);
+  f_100_110_011_111_1(uniques, 3);
+  f_100_110_100_000_0(uniques, 3);
+  f_100_110_100_000_1(uniques, 3);
+  f_100_110_100_001_0(uniques, 3);
+  f_100_110_100_001_1(uniques, 3);
+  f_100_110_100_010_0(uniques, 3);
+  f_100_110_100_010_1(uniques, 3);
+  f_100_110_100_011_0(uniques, 3);
+  f_100_110_100_011_1(uniques, 3);
+  f_100_110_100_100_0(uniques, 3);
+  f_100_110_100_100_1(uniques, 3);
+  f_100_110_100_101_0(uniques, 3);
+  f_100_110_100_101_1(uniques, 3);
+  f_100_110_100_110_0(uniques, 3);
+  f_100_110_100_110_1(uniques, 3);
+  f_100_110_100_111_0(uniques, 3);
+  f_100_110_100_111_1(uniques, 3);
+  f_100_110_101_000_0(uniques, 3);
+  f_100_110_101_000_1(uniques, 3);
+  f_100_110_101_001_0(uniques, 3);
+  f_100_110_101_001_1(uniques, 3);
+  f_100_110_101_010_0(uniques, 3);
+  f_100_110_101_010_1(uniques, 3);
+  f_100_110_101_011_0(uniques, 3);
+  f_100_110_101_011_1(uniques, 3);
+  f_100_110_101_100_0(uniques, 3);
+  f_100_110_101_100_1(uniques, 3);
+  f_100_110_101_101_0(uniques, 3);
+  f_100_110_101_101_1(uniques, 3);
+  f_100_110_101_110_0(uniques, 3);
+  f_100_110_101_110_1(uniques, 3);
+  f_100_110_101_111_0(uniques, 3);
+  f_100_110_101_111_1(uniques, 3);
+  f_100_110_110_000_0(uniques, 3);
+  f_100_110_110_000_1(uniques, 3);
+  f_100_110_110_001_0(uniques, 3);
+  f_100_110_110_001_1(uniques, 3);
+  f_100_110_110_010_0(uniques, 3);
+  f_100_110_110_010_1(uniques, 3);
+  f_100_110_110_011_0(uniques, 3);
+  f_100_110_110_011_1(uniques, 3);
+  f_100_110_110_100_0(uniques, 3);
+  f_100_110_110_100_1(uniques, 3);
+  f_100_110_110_101_0(uniques, 3);
+  f_100_110_110_101_1(uniques, 3);
+  f_100_110_110_110_0(uniques, 3);
+  f_100_110_110_110_1(uniques, 3);
+  f_100_110_110_111_0(uniques, 3);
+  f_100_110_110_111_1(uniques, 3);
+  f_100_110_111_000_0(uniques, 3);
+  f_100_110_111_000_1(uniques, 3);
+  f_100_110_111_001_0(uniques, 3);
+  f_100_110_111_001_1(uniques, 3);
+  f_100_110_111_010_0(uniques, 3);
+  f_100_110_111_010_1(uniques, 3);
+  f_100_110_111_011_0(uniques, 3);
+  f_100_110_111_011_1(uniques, 3);
+  f_100_110_111_100_0(uniques, 3);
+  f_100_110_111_100_1(uniques, 3);
+  f_100_110_111_101_0(uniques, 3);
+  f_100_110_111_101_1(uniques, 3);
+  f_100_110_111_110_0(uniques, 3);
+  f_100_110_111_110_1(uniques, 3);
+  f_100_110_111_111_0(uniques, 3);
+  f_100_110_111_111_1(uniques, 3);
+  f_100_111_000_000_0(uniques, 3);
+  f_100_111_000_000_1(uniques, 3);
+  f_100_111_000_001_0(uniques, 3);
+  f_100_111_000_001_1(uniques, 3);
+  f_100_111_000_010_0(uniques, 3);
+  f_100_111_000_010_1(uniques, 3);
+  f_100_111_000_011_0(uniques, 3);
+  f_100_111_000_011_1(uniques, 3);
+  f_100_111_000_100_0(uniques, 3);
+  f_100_111_000_100_1(uniques, 3);
+  f_100_111_000_101_0(uniques, 3);
+  f_100_111_000_101_1(uniques, 3);
+  f_100_111_000_110_0(uniques, 3);
+  f_100_111_000_110_1(uniques, 3);
+  f_100_111_000_111_0(uniques, 3);
+  f_100_111_000_111_1(uniques, 3);
+  f_100_111_001_000_0(uniques, 3);
+  f_100_111_001_000_1(uniques, 3);
+  f_100_111_001_001_0(uniques, 3);
+  f_100_111_001_001_1(uniques, 3);
+  f_100_111_001_010_0(uniques, 3);
+  f_100_111_001_010_1(uniques, 3);
+  f_100_111_001_011_0(uniques, 3);
+  f_100_111_001_011_1(uniques, 3);
+  f_100_111_001_100_0(uniques, 3);
+  f_100_111_001_100_1(uniques, 3);
+  f_100_111_001_101_0(uniques, 3);
+  f_100_111_001_101_1(uniques, 3);
+  f_100_111_001_110_0(uniques, 3);
+  f_100_111_001_110_1(uniques, 3);
+  f_100_111_001_111_0(uniques, 3);
+  f_100_111_001_111_1(uniques, 3);
+  f_100_111_010_000_0(uniques, 3);
+  f_100_111_010_000_1(uniques, 3);
+  f_100_111_010_001_0(uniques, 3);
+  f_100_111_010_001_1(uniques, 3);
+  f_100_111_010_010_0(uniques, 3);
+  f_100_111_010_010_1(uniques, 3);
+  f_100_111_010_011_0(uniques, 3);
+  f_100_111_010_011_1(uniques, 3);
+  f_100_111_010_100_0(uniques, 3);
+  f_100_111_010_100_1(uniques, 3);
+  f_100_111_010_101_0(uniques, 3);
+  f_100_111_010_101_1(uniques, 3);
+  f_100_111_010_110_0(uniques, 3);
+  f_100_111_010_110_1(uniques, 3);
+  f_100_111_010_111_0(uniques, 3);
+  f_100_111_010_111_1(uniques, 3);
+  f_100_111_011_000_0(uniques, 3);
+  f_100_111_011_000_1(uniques, 3);
+  f_100_111_011_001_0(uniques, 3);
+  f_100_111_011_001_1(uniques, 3);
+  f_100_111_011_010_0(uniques, 3);
+  f_100_111_011_010_1(uniques, 3);
+  f_100_111_011_011_0(uniques, 3);
+  f_100_111_011_011_1(uniques, 3);
+  f_100_111_011_100_0(uniques, 3);
+  f_100_111_011_100_1(uniques, 3);
+  f_100_111_011_101_0(uniques, 3);
+  f_100_111_011_101_1(uniques, 3);
+  f_100_111_011_110_0(uniques, 3);
+  f_100_111_011_110_1(uniques, 3);
+  f_100_111_011_111_0(uniques, 3);
+  f_100_111_011_111_1(uniques, 3);
+  f_100_111_100_000_0(uniques, 3);
+  f_100_111_100_000_1(uniques, 3);
+  f_100_111_100_001_0(uniques, 3);
+  f_100_111_100_001_1(uniques, 3);
+  f_100_111_100_010_0(uniques, 3);
+  f_100_111_100_010_1(uniques, 3);
+  f_100_111_100_011_0(uniques, 3);
+  f_100_111_100_011_1(uniques, 3);
+  f_100_111_100_100_0(uniques, 3);
+  f_100_111_100_100_1(uniques, 3);
+  f_100_111_100_101_0(uniques, 3);
+  f_100_111_100_101_1(uniques, 3);
+  f_100_111_100_110_0(uniques, 3);
+  f_100_111_100_110_1(uniques, 3);
+  f_100_111_100_111_0(uniques, 3);
+  f_100_111_100_111_1(uniques, 3);
+  f_100_111_101_000_0(uniques, 3);
+  f_100_111_101_000_1(uniques, 3);
+  f_100_111_101_001_0(uniques, 3);
+  f_100_111_101_001_1(uniques, 3);
+  f_100_111_101_010_0(uniques, 3);
+  f_100_111_101_010_1(uniques, 3);
+  f_100_111_101_011_0(uniques, 3);
+  f_100_111_101_011_1(uniques, 3);
+  f_100_111_101_100_0(uniques, 3);
+  f_100_111_101_100_1(uniques, 3);
+  f_100_111_101_101_0(uniques, 3);
+  f_100_111_101_101_1(uniques, 3);
+  f_100_111_101_110_0(uniques, 3);
+  f_100_111_101_110_1(uniques, 3);
+  f_100_111_101_111_0(uniques, 3);
+  f_100_111_101_111_1(uniques, 3);
+  f_100_111_110_000_0(uniques, 3);
+  f_100_111_110_000_1(uniques, 3);
+  f_100_111_110_001_0(uniques, 3);
+  f_100_111_110_001_1(uniques, 3);
+  f_100_111_110_010_0(uniques, 3);
+  f_100_111_110_010_1(uniques, 3);
+  f_100_111_110_011_0(uniques, 3);
+  f_100_111_110_011_1(uniques, 3);
+  f_100_111_110_100_0(uniques, 3);
+  f_100_111_110_100_1(uniques, 3);
+  f_100_111_110_101_0(uniques, 3);
+  f_100_111_110_101_1(uniques, 3);
+  f_100_111_110_110_0(uniques, 3);
+  f_100_111_110_110_1(uniques, 3);
+  f_100_111_110_111_0(uniques, 3);
+  f_100_111_110_111_1(uniques, 3);
+  f_100_111_111_000_0(uniques, 3);
+  f_100_111_111_000_1(uniques, 3);
+  f_100_111_111_001_0(uniques, 3);
+  f_100_111_111_001_1(uniques, 3);
+  f_100_111_111_010_0(uniques, 3);
+  f_100_111_111_010_1(uniques, 3);
+  f_100_111_111_011_0(uniques, 3);
+  f_100_111_111_011_1(uniques, 3);
+  f_100_111_111_100_0(uniques, 3);
+  f_100_111_111_100_1(uniques, 3);
+  f_100_111_111_101_0(uniques, 3);
+  f_100_111_111_101_1(uniques, 3);
+  f_100_111_111_110_0(uniques, 3);
+  f_100_111_111_110_1(uniques, 3);
+  f_100_111_111_111_0(uniques, 3);
+  f_100_111_111_111_1(uniques, 3);
+  f_101_100_000_000_0(uniques, 3);
+  f_101_100_000_000_1(uniques, 3);
+  f_101_100_000_001_0(uniques, 3);
+  f_101_100_000_001_1(uniques, 3);
+  f_101_100_000_010_0(uniques, 3);
+  f_101_100_000_010_1(uniques, 3);
+  f_101_100_000_011_0(uniques, 3);
+  f_101_100_000_011_1(uniques, 3);
+  f_101_100_000_100_0(uniques, 3);
+  f_101_100_000_100_1(uniques, 3);
+  f_101_100_000_101_0(uniques, 3);
+  f_101_100_000_101_1(uniques, 3);
+  f_101_100_000_110_0(uniques, 3);
+  f_101_100_000_110_1(uniques, 3);
+  f_101_100_000_111_0(uniques, 3);
+  f_101_100_000_111_1(uniques, 3);
+  f_101_100_001_000_0(uniques, 3);
+  f_101_100_001_000_1(uniques, 3);
+  f_101_100_001_001_0(uniques, 3);
+  f_101_100_001_001_1(uniques, 3);
+  f_101_100_001_010_0(uniques, 3);
+  f_101_100_001_010_1(uniques, 3);
+  f_101_100_001_011_0(uniques, 3);
+  f_101_100_001_011_1(uniques, 3);
+  f_101_100_001_100_0(uniques, 3);
+  f_101_100_001_100_1(uniques, 3);
+  f_101_100_001_101_0(uniques, 3);
+  f_101_100_001_101_1(uniques, 3);
+  f_101_100_001_110_0(uniques, 3);
+  f_101_100_001_110_1(uniques, 3);
+  f_101_100_001_111_0(uniques, 3);
+  f_101_100_001_111_1(uniques, 3);
+  f_101_100_010_000_0(uniques, 3);
+  f_101_100_010_000_1(uniques, 3);
+  f_101_100_010_001_0(uniques, 3);
+  f_101_100_010_001_1(uniques, 3);
+  f_101_100_010_010_0(uniques, 3);
+  f_101_100_010_010_1(uniques, 3);
+  f_101_100_010_011_0(uniques, 3);
+  f_101_100_010_011_1(uniques, 3);
+  f_101_100_010_100_0(uniques, 3);
+  f_101_100_010_100_1(uniques, 3);
+  f_101_100_010_101_0(uniques, 3);
+  f_101_100_010_101_1(uniques, 3);
+  f_101_100_010_110_0(uniques, 3);
+  f_101_100_010_110_1(uniques, 3);
+  f_101_100_010_111_0(uniques, 3);
+  f_101_100_010_111_1(uniques, 3);
+  f_101_100_011_000_0(uniques, 3);
+  f_101_100_011_000_1(uniques, 3);
+  f_101_100_011_001_0(uniques, 3);
+  f_101_100_011_001_1(uniques, 3);
+  f_101_100_011_010_0(uniques, 3);
+  f_101_100_011_010_1(uniques, 3);
+  f_101_100_011_011_0(uniques, 3);
+  f_101_100_011_011_1(uniques, 3);
+  f_101_100_011_100_0(uniques, 3);
+  f_101_100_011_100_1(uniques, 3);
+  f_101_100_011_101_0(uniques, 3);
+  f_101_100_011_101_1(uniques, 3);
+  f_101_100_011_110_0(uniques, 3);
+  f_101_100_011_110_1(uniques, 3);
+  f_101_100_011_111_0(uniques, 3);
+  f_101_100_011_111_1(uniques, 3);
+  f_101_100_100_000_0(uniques, 3);
+  f_101_100_100_000_1(uniques, 3);
+  f_101_100_100_001_0(uniques, 3);
+  f_101_100_100_001_1(uniques, 3);
+  f_101_100_100_010_0(uniques, 3);
+  f_101_100_100_010_1(uniques, 3);
+  f_101_100_100_011_0(uniques, 3);
+  f_101_100_100_011_1(uniques, 3);
+  f_101_100_100_100_0(uniques, 3);
+  f_101_100_100_100_1(uniques, 3);
+  f_101_100_100_101_0(uniques, 3);
+  f_101_100_100_101_1(uniques, 3);
+  f_101_100_100_110_0(uniques, 3);
+  f_101_100_100_110_1(uniques, 3);
+  f_101_100_100_111_0(uniques, 3);
+  f_101_100_100_111_1(uniques, 3);
+  f_101_100_101_000_0(uniques, 3);
+  f_101_100_101_000_1(uniques, 3);
+  f_101_100_101_001_0(uniques, 3);
+  f_101_100_101_001_1(uniques, 3);
+  f_101_100_101_010_0(uniques, 3);
+  f_101_100_101_010_1(uniques, 3);
+  f_101_100_101_011_0(uniques, 3);
+  f_101_100_101_011_1(uniques, 3);
+  f_101_100_101_100_0(uniques, 3);
+  f_101_100_101_100_1(uniques, 3);
+  f_101_100_101_101_0(uniques, 3);
+  f_101_100_101_101_1(uniques, 3);
+  f_101_100_101_110_0(uniques, 3);
+  f_101_100_101_110_1(uniques, 3);
+  f_101_100_101_111_0(uniques, 3);
+  f_101_100_101_111_1(uniques, 3);
+  f_101_100_110_000_0(uniques, 3);
+  f_101_100_110_000_1(uniques, 3);
+  f_101_100_110_001_0(uniques, 3);
+  f_101_100_110_001_1(uniques, 3);
+  f_101_100_110_010_0(uniques, 3);
+  f_101_100_110_010_1(uniques, 3);
+  f_101_100_110_011_0(uniques, 3);
+  f_101_100_110_011_1(uniques, 3);
+  f_101_100_110_100_0(uniques, 3);
+  f_101_100_110_100_1(uniques, 3);
+  f_101_100_110_101_0(uniques, 3);
+  f_101_100_110_101_1(uniques, 3);
+  f_101_100_110_110_0(uniques, 3);
+  f_101_100_110_110_1(uniques, 3);
+  f_101_100_110_111_0(uniques, 3);
+  f_101_100_110_111_1(uniques, 3);
+  f_101_100_111_000_0(uniques, 3);
+  f_101_100_111_000_1(uniques, 3);
+  f_101_100_111_001_0(uniques, 3);
+  f_101_100_111_001_1(uniques, 3);
+  f_101_100_111_010_0(uniques, 3);
+  f_101_100_111_010_1(uniques, 3);
+  f_101_100_111_011_0(uniques, 3);
+  f_101_100_111_011_1(uniques, 3);
+  f_101_100_111_100_0(uniques, 3);
+  f_101_100_111_100_1(uniques, 3);
+  f_101_100_111_101_0(uniques, 3);
+  f_101_100_111_101_1(uniques, 3);
+  f_101_100_111_110_0(uniques, 3);
+  f_101_100_111_110_1(uniques, 3);
+  f_101_100_111_111_0(uniques, 3);
+  f_101_100_111_111_1(uniques, 3);
+  f_101_101_000_000_0(uniques, 3);
+  f_101_101_000_000_1(uniques, 3);
+  f_101_101_000_001_0(uniques, 3);
+  f_101_101_000_001_1(uniques, 3);
+  f_101_101_000_010_0(uniques, 3);
+  f_101_101_000_010_1(uniques, 3);
+  f_101_101_000_011_0(uniques, 3);
+  f_101_101_000_011_1(uniques, 3);
+  f_101_101_000_100_0(uniques, 3);
+  f_101_101_000_100_1(uniques, 3);
+  f_101_101_000_101_0(uniques, 3);
+  f_101_101_000_101_1(uniques, 3);
+  f_101_101_000_110_0(uniques, 3);
+  f_101_101_000_110_1(uniques, 3);
+  f_101_101_000_111_0(uniques, 3);
+  f_101_101_000_111_1(uniques, 3);
+  f_101_101_001_000_0(uniques, 3);
+  f_101_101_001_000_1(uniques, 3);
+  f_101_101_001_001_0(uniques, 3);
+  f_101_101_001_001_1(uniques, 3);
+  f_101_101_001_010_0(uniques, 3);
+  f_101_101_001_010_1(uniques, 3);
+  f_101_101_001_011_0(uniques, 3);
+  f_101_101_001_011_1(uniques, 3);
+  f_101_101_001_100_0(uniques, 3);
+  f_101_101_001_100_1(uniques, 3);
+  f_101_101_001_101_0(uniques, 3);
+  f_101_101_001_101_1(uniques, 3);
+  f_101_101_001_110_0(uniques, 3);
+  f_101_101_001_110_1(uniques, 3);
+  f_101_101_001_111_0(uniques, 3);
+  f_101_101_001_111_1(uniques, 3);
+  f_101_101_010_000_0(uniques, 3);
+  f_101_101_010_000_1(uniques, 3);
+  f_101_101_010_001_0(uniques, 3);
+  f_101_101_010_001_1(uniques, 3);
+  f_101_101_010_010_0(uniques, 3);
+  f_101_101_010_010_1(uniques, 3);
+  f_101_101_010_011_0(uniques, 3);
+  f_101_101_010_011_1(uniques, 3);
+  f_101_101_010_100_0(uniques, 3);
+  f_101_101_010_100_1(uniques, 3);
+  f_101_101_010_101_0(uniques, 3);
+  f_101_101_010_101_1(uniques, 3);
+  f_101_101_010_110_0(uniques, 3);
+  f_101_101_010_110_1(uniques, 3);
+  f_101_101_010_111_0(uniques, 3);
+  f_101_101_010_111_1(uniques, 3);
+  f_101_101_011_000_0(uniques, 3);
+  f_101_101_011_000_1(uniques, 3);
+  f_101_101_011_001_0(uniques, 3);
+  f_101_101_011_001_1(uniques, 3);
+  f_101_101_011_010_0(uniques, 3);
+  f_101_101_011_010_1(uniques, 3);
+  f_101_101_011_011_0(uniques, 3);
+  f_101_101_011_011_1(uniques, 3);
+  f_101_101_011_100_0(uniques, 3);
+  f_101_101_011_100_1(uniques, 3);
+  f_101_101_011_101_0(uniques, 3);
+  f_101_101_011_101_1(uniques, 3);
+  f_101_101_011_110_0(uniques, 3);
+  f_101_101_011_110_1(uniques, 3);
+  f_101_101_011_111_0(uniques, 3);
+  f_101_101_011_111_1(uniques, 3);
+  f_101_101_100_000_0(uniques, 3);
+  f_101_101_100_000_1(uniques, 3);
+  f_101_101_100_001_0(uniques, 3);
+  f_101_101_100_001_1(uniques, 3);
+  f_101_101_100_010_0(uniques, 3);
+  f_101_101_100_010_1(uniques, 3);
+  f_101_101_100_011_0(uniques, 3);
+  f_101_101_100_011_1(uniques, 3);
+  f_101_101_100_100_0(uniques, 3);
+  f_101_101_100_100_1(uniques, 3);
+  f_101_101_100_101_0(uniques, 3);
+  f_101_101_100_101_1(uniques, 3);
+  f_101_101_100_110_0(uniques, 3);
+  f_101_101_100_110_1(uniques, 3);
+  f_101_101_100_111_0(uniques, 3);
+  f_101_101_100_111_1(uniques, 3);
+  f_101_101_101_000_0(uniques, 3);
+  f_101_101_101_000_1(uniques, 3);
+  f_101_101_101_001_0(uniques, 3);
+  f_101_101_101_001_1(uniques, 3);
+  f_101_101_101_010_0(uniques, 3);
+  f_101_101_101_010_1(uniques, 3);
+  f_101_101_101_011_0(uniques, 3);
+  f_101_101_101_011_1(uniques, 3);
+  f_101_101_101_100_0(uniques, 3);
+  f_101_101_101_100_1(uniques, 3);
+  f_101_101_101_101_0(uniques, 3);
+  f_101_101_101_101_1(uniques, 3);
+  f_101_101_101_110_0(uniques, 3);
+  f_101_101_101_110_1(uniques, 3);
+  f_101_101_101_111_0(uniques, 3);
+  f_101_101_101_111_1(uniques, 3);
+  f_101_101_110_000_0(uniques, 3);
+  f_101_101_110_000_1(uniques, 3);
+  f_101_101_110_001_0(uniques, 3);
+  f_101_101_110_001_1(uniques, 3);
+  f_101_101_110_010_0(uniques, 3);
+  f_101_101_110_010_1(uniques, 3);
+  f_101_101_110_011_0(uniques, 3);
+  f_101_101_110_011_1(uniques, 3);
+  f_101_101_110_100_0(uniques, 3);
+  f_101_101_110_100_1(uniques, 3);
+  f_101_101_110_101_0(uniques, 3);
+  f_101_101_110_101_1(uniques, 3);
+  f_101_101_110_110_0(uniques, 3);
+  f_101_101_110_110_1(uniques, 3);
+  f_101_101_110_111_0(uniques, 3);
+  f_101_101_110_111_1(uniques, 3);
+  f_101_101_111_000_0(uniques, 3);
+  f_101_101_111_000_1(uniques, 3);
+  f_101_101_111_001_0(uniques, 3);
+  f_101_101_111_001_1(uniques, 3);
+  f_101_101_111_010_0(uniques, 3);
+  f_101_101_111_010_1(uniques, 3);
+  f_101_101_111_011_0(uniques, 3);
+  f_101_101_111_011_1(uniques, 3);
+  f_101_101_111_100_0(uniques, 3);
+  f_101_101_111_100_1(uniques, 3);
+  f_101_101_111_101_0(uniques, 3);
+  f_101_101_111_101_1(uniques, 3);
+  f_101_101_111_110_0(uniques, 3);
+  f_101_101_111_110_1(uniques, 3);
+  f_101_101_111_111_0(uniques, 3);
+  f_101_101_111_111_1(uniques, 3);
+  f_101_110_000_000_0(uniques, 3);
+  f_101_110_000_000_1(uniques, 3);
+  f_101_110_000_001_0(uniques, 3);
+  f_101_110_000_001_1(uniques, 3);
+  f_101_110_000_010_0(uniques, 3);
+  f_101_110_000_010_1(uniques, 3);
+  f_101_110_000_011_0(uniques, 3);
+  f_101_110_000_011_1(uniques, 3);
+  f_101_110_000_100_0(uniques, 3);
+  f_101_110_000_100_1(uniques, 3);
+  f_101_110_000_101_0(uniques, 3);
+  f_101_110_000_101_1(uniques, 3);
+  f_101_110_000_110_0(uniques, 3);
+  f_101_110_000_110_1(uniques, 3);
+  f_101_110_000_111_0(uniques, 3);
+  f_101_110_000_111_1(uniques, 3);
+  f_101_110_001_000_0(uniques, 3);
+  f_101_110_001_000_1(uniques, 3);
+  f_101_110_001_001_0(uniques, 3);
+  f_101_110_001_001_1(uniques, 3);
+  f_101_110_001_010_0(uniques, 3);
+  f_101_110_001_010_1(uniques, 3);
+  f_101_110_001_011_0(uniques, 3);
+  f_101_110_001_011_1(uniques, 3);
+  f_101_110_001_100_0(uniques, 3);
+  f_101_110_001_100_1(uniques, 3);
+  f_101_110_001_101_0(uniques, 3);
+  f_101_110_001_101_1(uniques, 3);
+  f_101_110_001_110_0(uniques, 3);
+  f_101_110_001_110_1(uniques, 3);
+  f_101_110_001_111_0(uniques, 3);
+  f_101_110_001_111_1(uniques, 3);
+  f_101_110_010_000_0(uniques, 3);
+  f_101_110_010_000_1(uniques, 3);
+  f_101_110_010_001_0(uniques, 3);
+  f_101_110_010_001_1(uniques, 3);
+  f_101_110_010_010_0(uniques, 3);
+  f_101_110_010_010_1(uniques, 3);
+  f_101_110_010_011_0(uniques, 3);
+  f_101_110_010_011_1(uniques, 3);
+  f_101_110_010_100_0(uniques, 3);
+  f_101_110_010_100_1(uniques, 3);
+  f_101_110_010_101_0(uniques, 3);
+  f_101_110_010_101_1(uniques, 3);
+  f_101_110_010_110_0(uniques, 3);
+  f_101_110_010_110_1(uniques, 3);
+  f_101_110_010_111_0(uniques, 3);
+  f_101_110_010_111_1(uniques, 3);
+  f_101_110_011_000_0(uniques, 3);
+  f_101_110_011_000_1(uniques, 3);
+  f_101_110_011_001_0(uniques, 3);
+  f_101_110_011_001_1(uniques, 3);
+  f_101_110_011_010_0(uniques, 3);
+  f_101_110_011_010_1(uniques, 3);
+  f_101_110_011_011_0(uniques, 3);
+  f_101_110_011_011_1(uniques, 3);
+  f_101_110_011_100_0(uniques, 3);
+  f_101_110_011_100_1(uniques, 3);
+  f_101_110_011_101_0(uniques, 3);
+  f_101_110_011_101_1(uniques, 3);
+  f_101_110_011_110_0(uniques, 3);
+  f_101_110_011_110_1(uniques, 3);
+  f_101_110_011_111_0(uniques, 3);
+  f_101_110_011_111_1(uniques, 3);
+  f_101_110_100_000_0(uniques, 3);
+  f_101_110_100_000_1(uniques, 3);
+  f_101_110_100_001_0(uniques, 3);
+  f_101_110_100_001_1(uniques, 3);
+  f_101_110_100_010_0(uniques, 3);
+  f_101_110_100_010_1(uniques, 3);
+  f_101_110_100_011_0(uniques, 3);
+  f_101_110_100_011_1(uniques, 3);
+  f_101_110_100_100_0(uniques, 3);
+  f_101_110_100_100_1(uniques, 3);
+  f_101_110_100_101_0(uniques, 3);
+  f_101_110_100_101_1(uniques, 3);
+  f_101_110_100_110_0(uniques, 3);
+  f_101_110_100_110_1(uniques, 3);
+  f_101_110_100_111_0(uniques, 3);
+  f_101_110_100_111_1(uniques, 3);
+  f_101_110_101_000_0(uniques, 3);
+  f_101_110_101_000_1(uniques, 3);
+  f_101_110_101_001_0(uniques, 3);
+  f_101_110_101_001_1(uniques, 3);
+  f_101_110_101_010_0(uniques, 3);
+  f_101_110_101_010_1(uniques, 3);
+  f_101_110_101_011_0(uniques, 3);
+  f_101_110_101_011_1(uniques, 3);
+  f_101_110_101_100_0(uniques, 3);
+  f_101_110_101_100_1(uniques, 3);
+  f_101_110_101_101_0(uniques, 3);
+  f_101_110_101_101_1(uniques, 3);
+  f_101_110_101_110_0(uniques, 3);
+  f_101_110_101_110_1(uniques, 3);
+  f_101_110_101_111_0(uniques, 3);
+  f_101_110_101_111_1(uniques, 3);
+  f_101_110_110_000_0(uniques, 3);
+  f_101_110_110_000_1(uniques, 3);
+  f_101_110_110_001_0(uniques, 3);
+  f_101_110_110_001_1(uniques, 3);
+  f_101_110_110_010_0(uniques, 3);
+  f_101_110_110_010_1(uniques, 3);
+  f_101_110_110_011_0(uniques, 3);
+  f_101_110_110_011_1(uniques, 3);
+  f_101_110_110_100_0(uniques, 3);
+  f_101_110_110_100_1(uniques, 3);
+  f_101_110_110_101_0(uniques, 3);
+  f_101_110_110_101_1(uniques, 3);
+  f_101_110_110_110_0(uniques, 3);
+  f_101_110_110_110_1(uniques, 3);
+  f_101_110_110_111_0(uniques, 3);
+  f_101_110_110_111_1(uniques, 3);
+  f_101_110_111_000_0(uniques, 3);
+  f_101_110_111_000_1(uniques, 3);
+  f_101_110_111_001_0(uniques, 3);
+  f_101_110_111_001_1(uniques, 3);
+  f_101_110_111_010_0(uniques, 3);
+  f_101_110_111_010_1(uniques, 3);
+  f_101_110_111_011_0(uniques, 3);
+  f_101_110_111_011_1(uniques, 3);
+  f_101_110_111_100_0(uniques, 3);
+  f_101_110_111_100_1(uniques, 3);
+  f_101_110_111_101_0(uniques, 3);
+  f_101_110_111_101_1(uniques, 3);
+  f_101_110_111_110_0(uniques, 3);
+  f_101_110_111_110_1(uniques, 3);
+  f_101_110_111_111_0(uniques, 3);
+  f_101_110_111_111_1(uniques, 3);
+  f_101_111_000_000_0(uniques, 3);
+  f_101_111_000_000_1(uniques, 3);
+  f_101_111_000_001_0(uniques, 3);
+  f_101_111_000_001_1(uniques, 3);
+  f_101_111_000_010_0(uniques, 3);
+  f_101_111_000_010_1(uniques, 3);
+  f_101_111_000_011_0(uniques, 3);
+  f_101_111_000_011_1(uniques, 3);
+  f_101_111_000_100_0(uniques, 3);
+  f_101_111_000_100_1(uniques, 3);
+  f_101_111_000_101_0(uniques, 3);
+  f_101_111_000_101_1(uniques, 3);
+  f_101_111_000_110_0(uniques, 3);
+  f_101_111_000_110_1(uniques, 3);
+  f_101_111_000_111_0(uniques, 3);
+  f_101_111_000_111_1(uniques, 3);
+  f_101_111_001_000_0(uniques, 3);
+  f_101_111_001_000_1(uniques, 3);
+  f_101_111_001_001_0(uniques, 3);
+  f_101_111_001_001_1(uniques, 3);
+  f_101_111_001_010_0(uniques, 3);
+  f_101_111_001_010_1(uniques, 3);
+  f_101_111_001_011_0(uniques, 3);
+  f_101_111_001_011_1(uniques, 3);
+  f_101_111_001_100_0(uniques, 3);
+  f_101_111_001_100_1(uniques, 3);
+  f_101_111_001_101_0(uniques, 3);
+  f_101_111_001_101_1(uniques, 3);
+  f_101_111_001_110_0(uniques, 3);
+  f_101_111_001_110_1(uniques, 3);
+  f_101_111_001_111_0(uniques, 3);
+  f_101_111_001_111_1(uniques, 3);
+  f_101_111_010_000_0(uniques, 3);
+  f_101_111_010_000_1(uniques, 3);
+  f_101_111_010_001_0(uniques, 3);
+  f_101_111_010_001_1(uniques, 3);
+  f_101_111_010_010_0(uniques, 3);
+  f_101_111_010_010_1(uniques, 3);
+  f_101_111_010_011_0(uniques, 3);
+  f_101_111_010_011_1(uniques, 3);
+  f_101_111_010_100_0(uniques, 3);
+  f_101_111_010_100_1(uniques, 3);
+  f_101_111_010_101_0(uniques, 3);
+  f_101_111_010_101_1(uniques, 3);
+  f_101_111_010_110_0(uniques, 3);
+  f_101_111_010_110_1(uniques, 3);
+  f_101_111_010_111_0(uniques, 3);
+  f_101_111_010_111_1(uniques, 3);
+  f_101_111_011_000_0(uniques, 3);
+  f_101_111_011_000_1(uniques, 3);
+  f_101_111_011_001_0(uniques, 3);
+  f_101_111_011_001_1(uniques, 3);
+  f_101_111_011_010_0(uniques, 3);
+  f_101_111_011_010_1(uniques, 3);
+  f_101_111_011_011_0(uniques, 3);
+  f_101_111_011_011_1(uniques, 3);
+  f_101_111_011_100_0(uniques, 3);
+  f_101_111_011_100_1(uniques, 3);
+  f_101_111_011_101_0(uniques, 3);
+  f_101_111_011_101_1(uniques, 3);
+  f_101_111_011_110_0(uniques, 3);
+  f_101_111_011_110_1(uniques, 3);
+  f_101_111_011_111_0(uniques, 3);
+  f_101_111_011_111_1(uniques, 3);
+  f_101_111_100_000_0(uniques, 3);
+  f_101_111_100_000_1(uniques, 3);
+  f_101_111_100_001_0(uniques, 3);
+  f_101_111_100_001_1(uniques, 3);
+  f_101_111_100_010_0(uniques, 3);
+  f_101_111_100_010_1(uniques, 3);
+  f_101_111_100_011_0(uniques, 3);
+  f_101_111_100_011_1(uniques, 3);
+  f_101_111_100_100_0(uniques, 3);
+  f_101_111_100_100_1(uniques, 3);
+  f_101_111_100_101_0(uniques, 3);
+  f_101_111_100_101_1(uniques, 3);
+  f_101_111_100_110_0(uniques, 3);
+  f_101_111_100_110_1(uniques, 3);
+  f_101_111_100_111_0(uniques, 3);
+  f_101_111_100_111_1(uniques, 3);
+  f_101_111_101_000_0(uniques, 3);
+  f_101_111_101_000_1(uniques, 3);
+  f_101_111_101_001_0(uniques, 3);
+  f_101_111_101_001_1(uniques, 3);
+  f_101_111_101_010_0(uniques, 3);
+  f_101_111_101_010_1(uniques, 3);
+  f_101_111_101_011_0(uniques, 3);
+  f_101_111_101_011_1(uniques, 3);
+  f_101_111_101_100_0(uniques, 3);
+  f_101_111_101_100_1(uniques, 3);
+  f_101_111_101_101_0(uniques, 3);
+  f_101_111_101_101_1(uniques, 3);
+  f_101_111_101_110_0(uniques, 3);
+  f_101_111_101_110_1(uniques, 3);
+  f_101_111_101_111_0(uniques, 3);
+  f_101_111_101_111_1(uniques, 3);
+  f_101_111_110_000_0(uniques, 3);
+  f_101_111_110_000_1(uniques, 3);
+  f_101_111_110_001_0(uniques, 3);
+  f_101_111_110_001_1(uniques, 3);
+  f_101_111_110_010_0(uniques, 3);
+  f_101_111_110_010_1(uniques, 3);
+  f_101_111_110_011_0(uniques, 3);
+  f_101_111_110_011_1(uniques, 3);
+  f_101_111_110_100_0(uniques, 3);
+  f_101_111_110_100_1(uniques, 3);
+  f_101_111_110_101_0(uniques, 3);
+  f_101_111_110_101_1(uniques, 3);
+  f_101_111_110_110_0(uniques, 3);
+  f_101_111_110_110_1(uniques, 3);
+  f_101_111_110_111_0(uniques, 3);
+  f_101_111_110_111_1(uniques, 3);
+  f_101_111_111_000_0(uniques, 3);
+  f_101_111_111_000_1(uniques, 3);
+  f_101_111_111_001_0(uniques, 3);
+  f_101_111_111_001_1(uniques, 3);
+  f_101_111_111_010_0(uniques, 3);
+  f_101_111_111_010_1(uniques, 3);
+  f_101_111_111_011_0(uniques, 3);
+  f_101_111_111_011_1(uniques, 3);
+  f_101_111_111_100_0(uniques, 3);
+  f_101_111_111_100_1(uniques, 3);
+  f_101_111_111_101_0(uniques, 3);
+  f_101_111_111_101_1(uniques, 3);
+  f_101_111_111_110_0(uniques, 3);
+  f_101_111_111_110_1(uniques, 3);
+  f_101_111_111_111_0(uniques, 3);
+  f_101_111_111_111_1(uniques, 3);
+  f_110_100_000_000_0(uniques, 3);
+  f_110_100_000_000_1(uniques, 3);
+  f_110_100_000_001_0(uniques, 3);
+  f_110_100_000_001_1(uniques, 3);
+  f_110_100_000_010_0(uniques, 3);
+  f_110_100_000_010_1(uniques, 3);
+  f_110_100_000_011_0(uniques, 3);
+  f_110_100_000_011_1(uniques, 3);
+  f_110_100_000_100_0(uniques, 3);
+  f_110_100_000_100_1(uniques, 3);
+  f_110_100_000_101_0(uniques, 3);
+  f_110_100_000_101_1(uniques, 3);
+  f_110_100_000_110_0(uniques, 3);
+  f_110_100_000_110_1(uniques, 3);
+  f_110_100_000_111_0(uniques, 3);
+  f_110_100_000_111_1(uniques, 3);
+  f_110_100_001_000_0(uniques, 3);
+  f_110_100_001_000_1(uniques, 3);
+  f_110_100_001_001_0(uniques, 3);
+  f_110_100_001_001_1(uniques, 3);
+  f_110_100_001_010_0(uniques, 3);
+  f_110_100_001_010_1(uniques, 3);
+  f_110_100_001_011_0(uniques, 3);
+  f_110_100_001_011_1(uniques, 3);
+  f_110_100_001_100_0(uniques, 3);
+  f_110_100_001_100_1(uniques, 3);
+  f_110_100_001_101_0(uniques, 3);
+  f_110_100_001_101_1(uniques, 3);
+  f_110_100_001_110_0(uniques, 3);
+  f_110_100_001_110_1(uniques, 3);
+  f_110_100_001_111_0(uniques, 3);
+  f_110_100_001_111_1(uniques, 3);
+  f_110_100_010_000_0(uniques, 3);
+  f_110_100_010_000_1(uniques, 3);
+  f_110_100_010_001_0(uniques, 3);
+  f_110_100_010_001_1(uniques, 3);
+  f_110_100_010_010_0(uniques, 3);
+  f_110_100_010_010_1(uniques, 3);
+  f_110_100_010_011_0(uniques, 3);
+  f_110_100_010_011_1(uniques, 3);
+  f_110_100_010_100_0(uniques, 3);
+  f_110_100_010_100_1(uniques, 3);
+  f_110_100_010_101_0(uniques, 3);
+  f_110_100_010_101_1(uniques, 3);
+  f_110_100_010_110_0(uniques, 3);
+  f_110_100_010_110_1(uniques, 3);
+  f_110_100_010_111_0(uniques, 3);
+  f_110_100_010_111_1(uniques, 3);
+  f_110_100_011_000_0(uniques, 3);
+  f_110_100_011_000_1(uniques, 3);
+  f_110_100_011_001_0(uniques, 3);
+  f_110_100_011_001_1(uniques, 3);
+  f_110_100_011_010_0(uniques, 3);
+  f_110_100_011_010_1(uniques, 3);
+  f_110_100_011_011_0(uniques, 3);
+  f_110_100_011_011_1(uniques, 3);
+  f_110_100_011_100_0(uniques, 3);
+  f_110_100_011_100_1(uniques, 3);
+  f_110_100_011_101_0(uniques, 3);
+  f_110_100_011_101_1(uniques, 3);
+  f_110_100_011_110_0(uniques, 3);
+  f_110_100_011_110_1(uniques, 3);
+  f_110_100_011_111_0(uniques, 3);
+  f_110_100_011_111_1(uniques, 3);
+  f_110_100_100_000_0(uniques, 3);
+  f_110_100_100_000_1(uniques, 3);
+  f_110_100_100_001_0(uniques, 3);
+  f_110_100_100_001_1(uniques, 3);
+  f_110_100_100_010_0(uniques, 3);
+  f_110_100_100_010_1(uniques, 3);
+  f_110_100_100_011_0(uniques, 3);
+  f_110_100_100_011_1(uniques, 3);
+  f_110_100_100_100_0(uniques, 3);
+  f_110_100_100_100_1(uniques, 3);
+  f_110_100_100_101_0(uniques, 3);
+  f_110_100_100_101_1(uniques, 3);
+  f_110_100_100_110_0(uniques, 3);
+  f_110_100_100_110_1(uniques, 3);
+  f_110_100_100_111_0(uniques, 3);
+  f_110_100_100_111_1(uniques, 3);
+  f_110_100_101_000_0(uniques, 3);
+  f_110_100_101_000_1(uniques, 3);
+  f_110_100_101_001_0(uniques, 3);
+  f_110_100_101_001_1(uniques, 3);
+  f_110_100_101_010_0(uniques, 3);
+  f_110_100_101_010_1(uniques, 3);
+  f_110_100_101_011_0(uniques, 3);
+  f_110_100_101_011_1(uniques, 3);
+  f_110_100_101_100_0(uniques, 3);
+  f_110_100_101_100_1(uniques, 3);
+  f_110_100_101_101_0(uniques, 3);
+  f_110_100_101_101_1(uniques, 3);
+  f_110_100_101_110_0(uniques, 3);
+  f_110_100_101_110_1(uniques, 3);
+  f_110_100_101_111_0(uniques, 3);
+  f_110_100_101_111_1(uniques, 3);
+  f_110_100_110_000_0(uniques, 3);
+  f_110_100_110_000_1(uniques, 3);
+  f_110_100_110_001_0(uniques, 3);
+  f_110_100_110_001_1(uniques, 3);
+  f_110_100_110_010_0(uniques, 3);
+  f_110_100_110_010_1(uniques, 3);
+  f_110_100_110_011_0(uniques, 3);
+  f_110_100_110_011_1(uniques, 3);
+  f_110_100_110_100_0(uniques, 3);
+  f_110_100_110_100_1(uniques, 3);
+  f_110_100_110_101_0(uniques, 3);
+  f_110_100_110_101_1(uniques, 3);
+  f_110_100_110_110_0(uniques, 3);
+  f_110_100_110_110_1(uniques, 3);
+  f_110_100_110_111_0(uniques, 3);
+  f_110_100_110_111_1(uniques, 3);
+  f_110_100_111_000_0(uniques, 3);
+  f_110_100_111_000_1(uniques, 3);
+  f_110_100_111_001_0(uniques, 3);
+  f_110_100_111_001_1(uniques, 3);
+  f_110_100_111_010_0(uniques, 3);
+  f_110_100_111_010_1(uniques, 3);
+  f_110_100_111_011_0(uniques, 3);
+  f_110_100_111_011_1(uniques, 3);
+  f_110_100_111_100_0(uniques, 3);
+  f_110_100_111_100_1(uniques, 3);
+  f_110_100_111_101_0(uniques, 3);
+  f_110_100_111_101_1(uniques, 3);
+  f_110_100_111_110_0(uniques, 3);
+  f_110_100_111_110_1(uniques, 3);
+  f_110_100_111_111_0(uniques, 3);
+  f_110_100_111_111_1(uniques, 3);
+  f_110_101_000_000_0(uniques, 3);
+  f_110_101_000_000_1(uniques, 3);
+  f_110_101_000_001_0(uniques, 3);
+  f_110_101_000_001_1(uniques, 3);
+  f_110_101_000_010_0(uniques, 3);
+  f_110_101_000_010_1(uniques, 3);
+  f_110_101_000_011_0(uniques, 3);
+  f_110_101_000_011_1(uniques, 3);
+  f_110_101_000_100_0(uniques, 3);
+  f_110_101_000_100_1(uniques, 3);
+  f_110_101_000_101_0(uniques, 3);
+  f_110_101_000_101_1(uniques, 3);
+  f_110_101_000_110_0(uniques, 3);
+  f_110_101_000_110_1(uniques, 3);
+  f_110_101_000_111_0(uniques, 3);
+  f_110_101_000_111_1(uniques, 3);
+  f_110_101_001_000_0(uniques, 3);
+  f_110_101_001_000_1(uniques, 3);
+  f_110_101_001_001_0(uniques, 3);
+  f_110_101_001_001_1(uniques, 3);
+  f_110_101_001_010_0(uniques, 3);
+  f_110_101_001_010_1(uniques, 3);
+  f_110_101_001_011_0(uniques, 3);
+  f_110_101_001_011_1(uniques, 3);
+  f_110_101_001_100_0(uniques, 3);
+  f_110_101_001_100_1(uniques, 3);
+  f_110_101_001_101_0(uniques, 3);
+  f_110_101_001_101_1(uniques, 3);
+  f_110_101_001_110_0(uniques, 3);
+  f_110_101_001_110_1(uniques, 3);
+  f_110_101_001_111_0(uniques, 3);
+  f_110_101_001_111_1(uniques, 3);
+  f_110_101_010_000_0(uniques, 3);
+  f_110_101_010_000_1(uniques, 3);
+  f_110_101_010_001_0(uniques, 3);
+  f_110_101_010_001_1(uniques, 3);
+  f_110_101_010_010_0(uniques, 3);
+  f_110_101_010_010_1(uniques, 3);
+  f_110_101_010_011_0(uniques, 3);
+  f_110_101_010_011_1(uniques, 3);
+  f_110_101_010_100_0(uniques, 3);
+  f_110_101_010_100_1(uniques, 3);
+  f_110_101_010_101_0(uniques, 3);
+  f_110_101_010_101_1(uniques, 3);
+  f_110_101_010_110_0(uniques, 3);
+  f_110_101_010_110_1(uniques, 3);
+  f_110_101_010_111_0(uniques, 3);
+  f_110_101_010_111_1(uniques, 3);
+  f_110_101_011_000_0(uniques, 3);
+  f_110_101_011_000_1(uniques, 3);
+  f_110_101_011_001_0(uniques, 3);
+  f_110_101_011_001_1(uniques, 3);
+  f_110_101_011_010_0(uniques, 3);
+  f_110_101_011_010_1(uniques, 3);
+  f_110_101_011_011_0(uniques, 3);
+  f_110_101_011_011_1(uniques, 3);
+  f_110_101_011_100_0(uniques, 3);
+  f_110_101_011_100_1(uniques, 3);
+  f_110_101_011_101_0(uniques, 3);
+  f_110_101_011_101_1(uniques, 3);
+  f_110_101_011_110_0(uniques, 3);
+  f_110_101_011_110_1(uniques, 3);
+  f_110_101_011_111_0(uniques, 3);
+  f_110_101_011_111_1(uniques, 3);
+  f_110_101_100_000_0(uniques, 3);
+  f_110_101_100_000_1(uniques, 3);
+  f_110_101_100_001_0(uniques, 3);
+  f_110_101_100_001_1(uniques, 3);
+  f_110_101_100_010_0(uniques, 3);
+  f_110_101_100_010_1(uniques, 3);
+  f_110_101_100_011_0(uniques, 3);
+  f_110_101_100_011_1(uniques, 3);
+  f_110_101_100_100_0(uniques, 3);
+  f_110_101_100_100_1(uniques, 3);
+  f_110_101_100_101_0(uniques, 3);
+  f_110_101_100_101_1(uniques, 3);
+  f_110_101_100_110_0(uniques, 3);
+  f_110_101_100_110_1(uniques, 3);
+  f_110_101_100_111_0(uniques, 3);
+  f_110_101_100_111_1(uniques, 3);
+  f_110_101_101_000_0(uniques, 3);
+  f_110_101_101_000_1(uniques, 3);
+  f_110_101_101_001_0(uniques, 3);
+  f_110_101_101_001_1(uniques, 3);
+  f_110_101_101_010_0(uniques, 3);
+  f_110_101_101_010_1(uniques, 3);
+  f_110_101_101_011_0(uniques, 3);
+  f_110_101_101_011_1(uniques, 3);
+  f_110_101_101_100_0(uniques, 3);
+  f_110_101_101_100_1(uniques, 3);
+  f_110_101_101_101_0(uniques, 3);
+  f_110_101_101_101_1(uniques, 3);
+  f_110_101_101_110_0(uniques, 3);
+  f_110_101_101_110_1(uniques, 3);
+  f_110_101_101_111_0(uniques, 3);
+  f_110_101_101_111_1(uniques, 3);
+  f_110_101_110_000_0(uniques, 3);
+  f_110_101_110_000_1(uniques, 3);
+  f_110_101_110_001_0(uniques, 3);
+  f_110_101_110_001_1(uniques, 3);
+  f_110_101_110_010_0(uniques, 3);
+  f_110_101_110_010_1(uniques, 3);
+  f_110_101_110_011_0(uniques, 3);
+  f_110_101_110_011_1(uniques, 3);
+  f_110_101_110_100_0(uniques, 3);
+  f_110_101_110_100_1(uniques, 3);
+  f_110_101_110_101_0(uniques, 3);
+  f_110_101_110_101_1(uniques, 3);
+  f_110_101_110_110_0(uniques, 3);
+  f_110_101_110_110_1(uniques, 3);
+  f_110_101_110_111_0(uniques, 3);
+  f_110_101_110_111_1(uniques, 3);
+  f_110_101_111_000_0(uniques, 3);
+  f_110_101_111_000_1(uniques, 3);
+  f_110_101_111_001_0(uniques, 3);
+  f_110_101_111_001_1(uniques, 3);
+  f_110_101_111_010_0(uniques, 3);
+  f_110_101_111_010_1(uniques, 3);
+  f_110_101_111_011_0(uniques, 3);
+  f_110_101_111_011_1(uniques, 3);
+  f_110_101_111_100_0(uniques, 3);
+  f_110_101_111_100_1(uniques, 3);
+  f_110_101_111_101_0(uniques, 3);
+  f_110_101_111_101_1(uniques, 3);
+  f_110_101_111_110_0(uniques, 3);
+  f_110_101_111_110_1(uniques, 3);
+  f_110_101_111_111_0(uniques, 3);
+  f_110_101_111_111_1(uniques, 3);
+  f_110_110_000_000_0(uniques, 3);
+  f_110_110_000_000_1(uniques, 3);
+  f_110_110_000_001_0(uniques, 3);
+  f_110_110_000_001_1(uniques, 3);
+  f_110_110_000_010_0(uniques, 3);
+  f_110_110_000_010_1(uniques, 3);
+  f_110_110_000_011_0(uniques, 3);
+  f_110_110_000_011_1(uniques, 3);
+  f_110_110_000_100_0(uniques, 3);
+  f_110_110_000_100_1(uniques, 3);
+  f_110_110_000_101_0(uniques, 3);
+  f_110_110_000_101_1(uniques, 3);
+  f_110_110_000_110_0(uniques, 3);
+  f_110_110_000_110_1(uniques, 3);
+  f_110_110_000_111_0(uniques, 3);
+  f_110_110_000_111_1(uniques, 3);
+  f_110_110_001_000_0(uniques, 3);
+  f_110_110_001_000_1(uniques, 3);
+  f_110_110_001_001_0(uniques, 3);
+  f_110_110_001_001_1(uniques, 3);
+  f_110_110_001_010_0(uniques, 3);
+  f_110_110_001_010_1(uniques, 3);
+  f_110_110_001_011_0(uniques, 3);
+  f_110_110_001_011_1(uniques, 3);
+  f_110_110_001_100_0(uniques, 3);
+  f_110_110_001_100_1(uniques, 3);
+  f_110_110_001_101_0(uniques, 3);
+  f_110_110_001_101_1(uniques, 3);
+  f_110_110_001_110_0(uniques, 3);
+  f_110_110_001_110_1(uniques, 3);
+  f_110_110_001_111_0(uniques, 3);
+  f_110_110_001_111_1(uniques, 3);
+  f_110_110_010_000_0(uniques, 3);
+  f_110_110_010_000_1(uniques, 3);
+  f_110_110_010_001_0(uniques, 3);
+  f_110_110_010_001_1(uniques, 3);
+  f_110_110_010_010_0(uniques, 3);
+  f_110_110_010_010_1(uniques, 3);
+  f_110_110_010_011_0(uniques, 3);
+  f_110_110_010_011_1(uniques, 3);
+  f_110_110_010_100_0(uniques, 3);
+  f_110_110_010_100_1(uniques, 3);
+  f_110_110_010_101_0(uniques, 3);
+  f_110_110_010_101_1(uniques, 3);
+  f_110_110_010_110_0(uniques, 3);
+  f_110_110_010_110_1(uniques, 3);
+  f_110_110_010_111_0(uniques, 3);
+  f_110_110_010_111_1(uniques, 3);
+  f_110_110_011_000_0(uniques, 3);
+  f_110_110_011_000_1(uniques, 3);
+  f_110_110_011_001_0(uniques, 3);
+  f_110_110_011_001_1(uniques, 3);
+  f_110_110_011_010_0(uniques, 3);
+  f_110_110_011_010_1(uniques, 3);
+  f_110_110_011_011_0(uniques, 3);
+  f_110_110_011_011_1(uniques, 3);
+  f_110_110_011_100_0(uniques, 3);
+  f_110_110_011_100_1(uniques, 3);
+  f_110_110_011_101_0(uniques, 3);
+  f_110_110_011_101_1(uniques, 3);
+  f_110_110_011_110_0(uniques, 3);
+  f_110_110_011_110_1(uniques, 3);
+  f_110_110_011_111_0(uniques, 3);
+  f_110_110_011_111_1(uniques, 3);
+  f_110_110_100_000_0(uniques, 3);
+  f_110_110_100_000_1(uniques, 3);
+  f_110_110_100_001_0(uniques, 3);
+  f_110_110_100_001_1(uniques, 3);
+  f_110_110_100_010_0(uniques, 3);
+  f_110_110_100_010_1(uniques, 3);
+  f_110_110_100_011_0(uniques, 3);
+  f_110_110_100_011_1(uniques, 3);
+  f_110_110_100_100_0(uniques, 3);
+  f_110_110_100_100_1(uniques, 3);
+  f_110_110_100_101_0(uniques, 3);
+  f_110_110_100_101_1(uniques, 3);
+  f_110_110_100_110_0(uniques, 3);
+  f_110_110_100_110_1(uniques, 3);
+  f_110_110_100_111_0(uniques, 3);
+  f_110_110_100_111_1(uniques, 3);
+  f_110_110_101_000_0(uniques, 3);
+  f_110_110_101_000_1(uniques, 3);
+  f_110_110_101_001_0(uniques, 3);
+  f_110_110_101_001_1(uniques, 3);
+  f_110_110_101_010_0(uniques, 3);
+  f_110_110_101_010_1(uniques, 3);
+  f_110_110_101_011_0(uniques, 3);
+  f_110_110_101_011_1(uniques, 3);
+  f_110_110_101_100_0(uniques, 3);
+  f_110_110_101_100_1(uniques, 3);
+  f_110_110_101_101_0(uniques, 3);
+  f_110_110_101_101_1(uniques, 3);
+  f_110_110_101_110_0(uniques, 3);
+  f_110_110_101_110_1(uniques, 3);
+  f_110_110_101_111_0(uniques, 3);
+  f_110_110_101_111_1(uniques, 3);
+  f_110_110_110_000_0(uniques, 3);
+  f_110_110_110_000_1(uniques, 3);
+  f_110_110_110_001_0(uniques, 3);
+  f_110_110_110_001_1(uniques, 3);
+  f_110_110_110_010_0(uniques, 3);
+  f_110_110_110_010_1(uniques, 3);
+  f_110_110_110_011_0(uniques, 3);
+  f_110_110_110_011_1(uniques, 3);
+  f_110_110_110_100_0(uniques, 3);
+  f_110_110_110_100_1(uniques, 3);
+  f_110_110_110_101_0(uniques, 3);
+  f_110_110_110_101_1(uniques, 3);
+  f_110_110_110_110_0(uniques, 3);
+  f_110_110_110_110_1(uniques, 3);
+  f_110_110_110_111_0(uniques, 3);
+  f_110_110_110_111_1(uniques, 3);
+  f_110_110_111_000_0(uniques, 3);
+  f_110_110_111_000_1(uniques, 3);
+  f_110_110_111_001_0(uniques, 3);
+  f_110_110_111_001_1(uniques, 3);
+  f_110_110_111_010_0(uniques, 3);
+  f_110_110_111_010_1(uniques, 3);
+  f_110_110_111_011_0(uniques, 3);
+  f_110_110_111_011_1(uniques, 3);
+  f_110_110_111_100_0(uniques, 3);
+  f_110_110_111_100_1(uniques, 3);
+  f_110_110_111_101_0(uniques, 3);
+  f_110_110_111_101_1(uniques, 3);
+  f_110_110_111_110_0(uniques, 3);
+  f_110_110_111_110_1(uniques, 3);
+  f_110_110_111_111_0(uniques, 3);
+  f_110_110_111_111_1(uniques, 3);
+  f_110_111_000_000_0(uniques, 3);
+  f_110_111_000_000_1(uniques, 3);
+  f_110_111_000_001_0(uniques, 3);
+  f_110_111_000_001_1(uniques, 3);
+  f_110_111_000_010_0(uniques, 3);
+  f_110_111_000_010_1(uniques, 3);
+  f_110_111_000_011_0(uniques, 3);
+  f_110_111_000_011_1(uniques, 3);
+  f_110_111_000_100_0(uniques, 3);
+  f_110_111_000_100_1(uniques, 3);
+  f_110_111_000_101_0(uniques, 3);
+  f_110_111_000_101_1(uniques, 3);
+  f_110_111_000_110_0(uniques, 3);
+  f_110_111_000_110_1(uniques, 3);
+  f_110_111_000_111_0(uniques, 3);
+  f_110_111_000_111_1(uniques, 3);
+  f_110_111_001_000_0(uniques, 3);
+  f_110_111_001_000_1(uniques, 3);
+  f_110_111_001_001_0(uniques, 3);
+  f_110_111_001_001_1(uniques, 3);
+  f_110_111_001_010_0(uniques, 3);
+  f_110_111_001_010_1(uniques, 3);
+  f_110_111_001_011_0(uniques, 3);
+  f_110_111_001_011_1(uniques, 3);
+  f_110_111_001_100_0(uniques, 3);
+  f_110_111_001_100_1(uniques, 3);
+  f_110_111_001_101_0(uniques, 3);
+  f_110_111_001_101_1(uniques, 3);
+  f_110_111_001_110_0(uniques, 3);
+  f_110_111_001_110_1(uniques, 3);
+  f_110_111_001_111_0(uniques, 3);
+  f_110_111_001_111_1(uniques, 3);
+  f_110_111_010_000_0(uniques, 3);
+  f_110_111_010_000_1(uniques, 3);
+  f_110_111_010_001_0(uniques, 3);
+  f_110_111_010_001_1(uniques, 3);
+  f_110_111_010_010_0(uniques, 3);
+  f_110_111_010_010_1(uniques, 3);
+  f_110_111_010_011_0(uniques, 3);
+  f_110_111_010_011_1(uniques, 3);
+  f_110_111_010_100_0(uniques, 3);
+  f_110_111_010_100_1(uniques, 3);
+  f_110_111_010_101_0(uniques, 3);
+  f_110_111_010_101_1(uniques, 3);
+  f_110_111_010_110_0(uniques, 3);
+  f_110_111_010_110_1(uniques, 3);
+  f_110_111_010_111_0(uniques, 3);
+  f_110_111_010_111_1(uniques, 3);
+  f_110_111_011_000_0(uniques, 3);
+  f_110_111_011_000_1(uniques, 3);
+  f_110_111_011_001_0(uniques, 3);
+  f_110_111_011_001_1(uniques, 3);
+  f_110_111_011_010_0(uniques, 3);
+  f_110_111_011_010_1(uniques, 3);
+  f_110_111_011_011_0(uniques, 3);
+  f_110_111_011_011_1(uniques, 3);
+  f_110_111_011_100_0(uniques, 3);
+  f_110_111_011_100_1(uniques, 3);
+  f_110_111_011_101_0(uniques, 3);
+  f_110_111_011_101_1(uniques, 3);
+  f_110_111_011_110_0(uniques, 3);
+  f_110_111_011_110_1(uniques, 3);
+  f_110_111_011_111_0(uniques, 3);
+  f_110_111_011_111_1(uniques, 3);
+  f_110_111_100_000_0(uniques, 3);
+  f_110_111_100_000_1(uniques, 3);
+  f_110_111_100_001_0(uniques, 3);
+  f_110_111_100_001_1(uniques, 3);
+  f_110_111_100_010_0(uniques, 3);
+  f_110_111_100_010_1(uniques, 3);
+  f_110_111_100_011_0(uniques, 3);
+  f_110_111_100_011_1(uniques, 3);
+  f_110_111_100_100_0(uniques, 3);
+  f_110_111_100_100_1(uniques, 3);
+  f_110_111_100_101_0(uniques, 3);
+  f_110_111_100_101_1(uniques, 3);
+  f_110_111_100_110_0(uniques, 3);
+  f_110_111_100_110_1(uniques, 3);
+  f_110_111_100_111_0(uniques, 3);
+  f_110_111_100_111_1(uniques, 3);
+  f_110_111_101_000_0(uniques, 3);
+  f_110_111_101_000_1(uniques, 3);
+  f_110_111_101_001_0(uniques, 3);
+  f_110_111_101_001_1(uniques, 3);
+  f_110_111_101_010_0(uniques, 3);
+  f_110_111_101_010_1(uniques, 3);
+  f_110_111_101_011_0(uniques, 3);
+  f_110_111_101_011_1(uniques, 3);
+  f_110_111_101_100_0(uniques, 3);
+  f_110_111_101_100_1(uniques, 3);
+  f_110_111_101_101_0(uniques, 3);
+  f_110_111_101_101_1(uniques, 3);
+  f_110_111_101_110_0(uniques, 3);
+  f_110_111_101_110_1(uniques, 3);
+  f_110_111_101_111_0(uniques, 3);
+  f_110_111_101_111_1(uniques, 3);
+  f_110_111_110_000_0(uniques, 3);
+  f_110_111_110_000_1(uniques, 3);
+  f_110_111_110_001_0(uniques, 3);
+  f_110_111_110_001_1(uniques, 3);
+  f_110_111_110_010_0(uniques, 3);
+  f_110_111_110_010_1(uniques, 3);
+  f_110_111_110_011_0(uniques, 3);
+  f_110_111_110_011_1(uniques, 3);
+  f_110_111_110_100_0(uniques, 3);
+  f_110_111_110_100_1(uniques, 3);
+  f_110_111_110_101_0(uniques, 3);
+  f_110_111_110_101_1(uniques, 3);
+  f_110_111_110_110_0(uniques, 3);
+  f_110_111_110_110_1(uniques, 3);
+  f_110_111_110_111_0(uniques, 3);
+  f_110_111_110_111_1(uniques, 3);
+  f_110_111_111_000_0(uniques, 3);
+  f_110_111_111_000_1(uniques, 3);
+  f_110_111_111_001_0(uniques, 3);
+  f_110_111_111_001_1(uniques, 3);
+  f_110_111_111_010_0(uniques, 3);
+  f_110_111_111_010_1(uniques, 3);
+  f_110_111_111_011_0(uniques, 3);
+  f_110_111_111_011_1(uniques, 3);
+  f_110_111_111_100_0(uniques, 3);
+  f_110_111_111_100_1(uniques, 3);
+  f_110_111_111_101_0(uniques, 3);
+  f_110_111_111_101_1(uniques, 3);
+  f_110_111_111_110_0(uniques, 3);
+  f_110_111_111_110_1(uniques, 3);
+  f_110_111_111_111_0(uniques, 3);
+  f_110_111_111_111_1(uniques, 3);
+  f_111_100_000_000_0(uniques, 3);
+  f_111_100_000_000_1(uniques, 3);
+  f_111_100_000_001_0(uniques, 3);
+  f_111_100_000_001_1(uniques, 3);
+  f_111_100_000_010_0(uniques, 3);
+  f_111_100_000_010_1(uniques, 3);
+  f_111_100_000_011_0(uniques, 3);
+  f_111_100_000_011_1(uniques, 3);
+  f_111_100_000_100_0(uniques, 3);
+  f_111_100_000_100_1(uniques, 3);
+  f_111_100_000_101_0(uniques, 3);
+  f_111_100_000_101_1(uniques, 3);
+  f_111_100_000_110_0(uniques, 3);
+  f_111_100_000_110_1(uniques, 3);
+  f_111_100_000_111_0(uniques, 3);
+  f_111_100_000_111_1(uniques, 3);
+  f_111_100_001_000_0(uniques, 3);
+  f_111_100_001_000_1(uniques, 3);
+  f_111_100_001_001_0(uniques, 3);
+  f_111_100_001_001_1(uniques, 3);
+  f_111_100_001_010_0(uniques, 3);
+  f_111_100_001_010_1(uniques, 3);
+  f_111_100_001_011_0(uniques, 3);
+  f_111_100_001_011_1(uniques, 3);
+  f_111_100_001_100_0(uniques, 3);
+  f_111_100_001_100_1(uniques, 3);
+  f_111_100_001_101_0(uniques, 3);
+  f_111_100_001_101_1(uniques, 3);
+  f_111_100_001_110_0(uniques, 3);
+  f_111_100_001_110_1(uniques, 3);
+  f_111_100_001_111_0(uniques, 3);
+  f_111_100_001_111_1(uniques, 3);
+  f_111_100_010_000_0(uniques, 3);
+  f_111_100_010_000_1(uniques, 3);
+  f_111_100_010_001_0(uniques, 3);
+  f_111_100_010_001_1(uniques, 3);
+  f_111_100_010_010_0(uniques, 3);
+  f_111_100_010_010_1(uniques, 3);
+  f_111_100_010_011_0(uniques, 3);
+  f_111_100_010_011_1(uniques, 3);
+  f_111_100_010_100_0(uniques, 3);
+  f_111_100_010_100_1(uniques, 3);
+  f_111_100_010_101_0(uniques, 3);
+  f_111_100_010_101_1(uniques, 3);
+  f_111_100_010_110_0(uniques, 3);
+  f_111_100_010_110_1(uniques, 3);
+  f_111_100_010_111_0(uniques, 3);
+  f_111_100_010_111_1(uniques, 3);
+  f_111_100_011_000_0(uniques, 3);
+  f_111_100_011_000_1(uniques, 3);
+  f_111_100_011_001_0(uniques, 3);
+  f_111_100_011_001_1(uniques, 3);
+  f_111_100_011_010_0(uniques, 3);
+  f_111_100_011_010_1(uniques, 3);
+  f_111_100_011_011_0(uniques, 3);
+  f_111_100_011_011_1(uniques, 3);
+  f_111_100_011_100_0(uniques, 3);
+  f_111_100_011_100_1(uniques, 3);
+  f_111_100_011_101_0(uniques, 3);
+  f_111_100_011_101_1(uniques, 3);
+  f_111_100_011_110_0(uniques, 3);
+  f_111_100_011_110_1(uniques, 3);
+  f_111_100_011_111_0(uniques, 3);
+  f_111_100_011_111_1(uniques, 3);
+  f_111_100_100_000_0(uniques, 3);
+  f_111_100_100_000_1(uniques, 3);
+  f_111_100_100_001_0(uniques, 3);
+  f_111_100_100_001_1(uniques, 3);
+  f_111_100_100_010_0(uniques, 3);
+  f_111_100_100_010_1(uniques, 3);
+  f_111_100_100_011_0(uniques, 3);
+  f_111_100_100_011_1(uniques, 3);
+  f_111_100_100_100_0(uniques, 3);
+  f_111_100_100_100_1(uniques, 3);
+  f_111_100_100_101_0(uniques, 3);
+  f_111_100_100_101_1(uniques, 3);
+  f_111_100_100_110_0(uniques, 3);
+  f_111_100_100_110_1(uniques, 3);
+  f_111_100_100_111_0(uniques, 3);
+  f_111_100_100_111_1(uniques, 3);
+  f_111_100_101_000_0(uniques, 3);
+  f_111_100_101_000_1(uniques, 3);
+  f_111_100_101_001_0(uniques, 3);
+  f_111_100_101_001_1(uniques, 3);
+  f_111_100_101_010_0(uniques, 3);
+  f_111_100_101_010_1(uniques, 3);
+  f_111_100_101_011_0(uniques, 3);
+  f_111_100_101_011_1(uniques, 3);
+  f_111_100_101_100_0(uniques, 3);
+  f_111_100_101_100_1(uniques, 3);
+  f_111_100_101_101_0(uniques, 3);
+  f_111_100_101_101_1(uniques, 3);
+  f_111_100_101_110_0(uniques, 3);
+  f_111_100_101_110_1(uniques, 3);
+  f_111_100_101_111_0(uniques, 3);
+  f_111_100_101_111_1(uniques, 3);
+  f_111_100_110_000_0(uniques, 3);
+  f_111_100_110_000_1(uniques, 3);
+  f_111_100_110_001_0(uniques, 3);
+  f_111_100_110_001_1(uniques, 3);
+  f_111_100_110_010_0(uniques, 3);
+  f_111_100_110_010_1(uniques, 3);
+  f_111_100_110_011_0(uniques, 3);
+  f_111_100_110_011_1(uniques, 3);
+  f_111_100_110_100_0(uniques, 3);
+  f_111_100_110_100_1(uniques, 3);
+  f_111_100_110_101_0(uniques, 3);
+  f_111_100_110_101_1(uniques, 3);
+  f_111_100_110_110_0(uniques, 3);
+  f_111_100_110_110_1(uniques, 3);
+  f_111_100_110_111_0(uniques, 3);
+  f_111_100_110_111_1(uniques, 3);
+  f_111_100_111_000_0(uniques, 3);
+  f_111_100_111_000_1(uniques, 3);
+  f_111_100_111_001_0(uniques, 3);
+  f_111_100_111_001_1(uniques, 3);
+  f_111_100_111_010_0(uniques, 3);
+  f_111_100_111_010_1(uniques, 3);
+  f_111_100_111_011_0(uniques, 3);
+  f_111_100_111_011_1(uniques, 3);
+  f_111_100_111_100_0(uniques, 3);
+  f_111_100_111_100_1(uniques, 3);
+  f_111_100_111_101_0(uniques, 3);
+  f_111_100_111_101_1(uniques, 3);
+  f_111_100_111_110_0(uniques, 3);
+  f_111_100_111_110_1(uniques, 3);
+  f_111_100_111_111_0(uniques, 3);
+  f_111_100_111_111_1(uniques, 3);
+  f_111_101_000_000_0(uniques, 3);
+  f_111_101_000_000_1(uniques, 3);
+  f_111_101_000_001_0(uniques, 3);
+  f_111_101_000_001_1(uniques, 3);
+  f_111_101_000_010_0(uniques, 3);
+  f_111_101_000_010_1(uniques, 3);
+  f_111_101_000_011_0(uniques, 3);
+  f_111_101_000_011_1(uniques, 3);
+  f_111_101_000_100_0(uniques, 3);
+  f_111_101_000_100_1(uniques, 3);
+  f_111_101_000_101_0(uniques, 3);
+  f_111_101_000_101_1(uniques, 3);
+  f_111_101_000_110_0(uniques, 3);
+  f_111_101_000_110_1(uniques, 3);
+  f_111_101_000_111_0(uniques, 3);
+  f_111_101_000_111_1(uniques, 3);
+  f_111_101_001_000_0(uniques, 3);
+  f_111_101_001_000_1(uniques, 3);
+  f_111_101_001_001_0(uniques, 3);
+  f_111_101_001_001_1(uniques, 3);
+  f_111_101_001_010_0(uniques, 3);
+  f_111_101_001_010_1(uniques, 3);
+  f_111_101_001_011_0(uniques, 3);
+  f_111_101_001_011_1(uniques, 3);
+  f_111_101_001_100_0(uniques, 3);
+  f_111_101_001_100_1(uniques, 3);
+  f_111_101_001_101_0(uniques, 3);
+  f_111_101_001_101_1(uniques, 3);
+  f_111_101_001_110_0(uniques, 3);
+  f_111_101_001_110_1(uniques, 3);
+  f_111_101_001_111_0(uniques, 3);
+  f_111_101_001_111_1(uniques, 3);
+  f_111_101_010_000_0(uniques, 3);
+  f_111_101_010_000_1(uniques, 3);
+  f_111_101_010_001_0(uniques, 3);
+  f_111_101_010_001_1(uniques, 3);
+  f_111_101_010_010_0(uniques, 3);
+  f_111_101_010_010_1(uniques, 3);
+  f_111_101_010_011_0(uniques, 3);
+  f_111_101_010_011_1(uniques, 3);
+  f_111_101_010_100_0(uniques, 3);
+  f_111_101_010_100_1(uniques, 3);
+  f_111_101_010_101_0(uniques, 3);
+  f_111_101_010_101_1(uniques, 3);
+  f_111_101_010_110_0(uniques, 3);
+  f_111_101_010_110_1(uniques, 3);
+  f_111_101_010_111_0(uniques, 3);
+  f_111_101_010_111_1(uniques, 3);
+  f_111_101_011_000_0(uniques, 3);
+  f_111_101_011_000_1(uniques, 3);
+  f_111_101_011_001_0(uniques, 3);
+  f_111_101_011_001_1(uniques, 3);
+  f_111_101_011_010_0(uniques, 3);
+  f_111_101_011_010_1(uniques, 3);
+  f_111_101_011_011_0(uniques, 3);
+  f_111_101_011_011_1(uniques, 3);
+  f_111_101_011_100_0(uniques, 3);
+  f_111_101_011_100_1(uniques, 3);
+  f_111_101_011_101_0(uniques, 3);
+  f_111_101_011_101_1(uniques, 3);
+  f_111_101_011_110_0(uniques, 3);
+  f_111_101_011_110_1(uniques, 3);
+  f_111_101_011_111_0(uniques, 3);
+  f_111_101_011_111_1(uniques, 3);
+  f_111_101_100_000_0(uniques, 3);
+  f_111_101_100_000_1(uniques, 3);
+  f_111_101_100_001_0(uniques, 3);
+  f_111_101_100_001_1(uniques, 3);
+  f_111_101_100_010_0(uniques, 3);
+  f_111_101_100_010_1(uniques, 3);
+  f_111_101_100_011_0(uniques, 3);
+  f_111_101_100_011_1(uniques, 3);
+  f_111_101_100_100_0(uniques, 3);
+  f_111_101_100_100_1(uniques, 3);
+  f_111_101_100_101_0(uniques, 3);
+  f_111_101_100_101_1(uniques, 3);
+  f_111_101_100_110_0(uniques, 3);
+  f_111_101_100_110_1(uniques, 3);
+  f_111_101_100_111_0(uniques, 3);
+  f_111_101_100_111_1(uniques, 3);
+  f_111_101_101_000_0(uniques, 3);
+  f_111_101_101_000_1(uniques, 3);
+  f_111_101_101_001_0(uniques, 3);
+  f_111_101_101_001_1(uniques, 3);
+  f_111_101_101_010_0(uniques, 3);
+  f_111_101_101_010_1(uniques, 3);
+  f_111_101_101_011_0(uniques, 3);
+  f_111_101_101_011_1(uniques, 3);
+  f_111_101_101_100_0(uniques, 3);
+  f_111_101_101_100_1(uniques, 3);
+  f_111_101_101_101_0(uniques, 3);
+  f_111_101_101_101_1(uniques, 3);
+  f_111_101_101_110_0(uniques, 3);
+  f_111_101_101_110_1(uniques, 3);
+  f_111_101_101_111_0(uniques, 3);
+  f_111_101_101_111_1(uniques, 3);
+  f_111_101_110_000_0(uniques, 3);
+  f_111_101_110_000_1(uniques, 3);
+  f_111_101_110_001_0(uniques, 3);
+  f_111_101_110_001_1(uniques, 3);
+  f_111_101_110_010_0(uniques, 3);
+  f_111_101_110_010_1(uniques, 3);
+  f_111_101_110_011_0(uniques, 3);
+  f_111_101_110_011_1(uniques, 3);
+  f_111_101_110_100_0(uniques, 3);
+  f_111_101_110_100_1(uniques, 3);
+  f_111_101_110_101_0(uniques, 3);
+  f_111_101_110_101_1(uniques, 3);
+  f_111_101_110_110_0(uniques, 3);
+  f_111_101_110_110_1(uniques, 3);
+  f_111_101_110_111_0(uniques, 3);
+  f_111_101_110_111_1(uniques, 3);
+  f_111_101_111_000_0(uniques, 3);
+  f_111_101_111_000_1(uniques, 3);
+  f_111_101_111_001_0(uniques, 3);
+  f_111_101_111_001_1(uniques, 3);
+  f_111_101_111_010_0(uniques, 3);
+  f_111_101_111_010_1(uniques, 3);
+  f_111_101_111_011_0(uniques, 3);
+  f_111_101_111_011_1(uniques, 3);
+  f_111_101_111_100_0(uniques, 3);
+  f_111_101_111_100_1(uniques, 3);
+  f_111_101_111_101_0(uniques, 3);
+  f_111_101_111_101_1(uniques, 3);
+  f_111_101_111_110_0(uniques, 3);
+  f_111_101_111_110_1(uniques, 3);
+  f_111_101_111_111_0(uniques, 3);
+  f_111_101_111_111_1(uniques, 3);
+  f_111_110_000_000_0(uniques, 3);
+  f_111_110_000_000_1(uniques, 3);
+  f_111_110_000_001_0(uniques, 3);
+  f_111_110_000_001_1(uniques, 3);
+  f_111_110_000_010_0(uniques, 3);
+  f_111_110_000_010_1(uniques, 3);
+  f_111_110_000_011_0(uniques, 3);
+  f_111_110_000_011_1(uniques, 3);
+  f_111_110_000_100_0(uniques, 3);
+  f_111_110_000_100_1(uniques, 3);
+  f_111_110_000_101_0(uniques, 3);
+  f_111_110_000_101_1(uniques, 3);
+  f_111_110_000_110_0(uniques, 3);
+  f_111_110_000_110_1(uniques, 3);
+  f_111_110_000_111_0(uniques, 3);
+  f_111_110_000_111_1(uniques, 3);
+  f_111_110_001_000_0(uniques, 3);
+  f_111_110_001_000_1(uniques, 3);
+  f_111_110_001_001_0(uniques, 3);
+  f_111_110_001_001_1(uniques, 3);
+  f_111_110_001_010_0(uniques, 3);
+  f_111_110_001_010_1(uniques, 3);
+  f_111_110_001_011_0(uniques, 3);
+  f_111_110_001_011_1(uniques, 3);
+  f_111_110_001_100_0(uniques, 3);
+  f_111_110_001_100_1(uniques, 3);
+  f_111_110_001_101_0(uniques, 3);
+  f_111_110_001_101_1(uniques, 3);
+  f_111_110_001_110_0(uniques, 3);
+  f_111_110_001_110_1(uniques, 3);
+  f_111_110_001_111_0(uniques, 3);
+  f_111_110_001_111_1(uniques, 3);
+  f_111_110_010_000_0(uniques, 3);
+  f_111_110_010_000_1(uniques, 3);
+  f_111_110_010_001_0(uniques, 3);
+  f_111_110_010_001_1(uniques, 3);
+  f_111_110_010_010_0(uniques, 3);
+  f_111_110_010_010_1(uniques, 3);
+  f_111_110_010_011_0(uniques, 3);
+  f_111_110_010_011_1(uniques, 3);
+  f_111_110_010_100_0(uniques, 3);
+  f_111_110_010_100_1(uniques, 3);
+  f_111_110_010_101_0(uniques, 3);
+  f_111_110_010_101_1(uniques, 3);
+  f_111_110_010_110_0(uniques, 3);
+  f_111_110_010_110_1(uniques, 3);
+  f_111_110_010_111_0(uniques, 3);
+  f_111_110_010_111_1(uniques, 3);
+  f_111_110_011_000_0(uniques, 3);
+  f_111_110_011_000_1(uniques, 3);
+  f_111_110_011_001_0(uniques, 3);
+  f_111_110_011_001_1(uniques, 3);
+  f_111_110_011_010_0(uniques, 3);
+  f_111_110_011_010_1(uniques, 3);
+  f_111_110_011_011_0(uniques, 3);
+  f_111_110_011_011_1(uniques, 3);
+  f_111_110_011_100_0(uniques, 3);
+  f_111_110_011_100_1(uniques, 3);
+  f_111_110_011_101_0(uniques, 3);
+  f_111_110_011_101_1(uniques, 3);
+  f_111_110_011_110_0(uniques, 3);
+  f_111_110_011_110_1(uniques, 3);
+  f_111_110_011_111_0(uniques, 3);
+  f_111_110_011_111_1(uniques, 3);
+  f_111_110_100_000_0(uniques, 3);
+  f_111_110_100_000_1(uniques, 3);
+  f_111_110_100_001_0(uniques, 3);
+  f_111_110_100_001_1(uniques, 3);
+  f_111_110_100_010_0(uniques, 3);
+  f_111_110_100_010_1(uniques, 3);
+  f_111_110_100_011_0(uniques, 3);
+  f_111_110_100_011_1(uniques, 3);
+  f_111_110_100_100_0(uniques, 3);
+  f_111_110_100_100_1(uniques, 3);
+  f_111_110_100_101_0(uniques, 3);
+  f_111_110_100_101_1(uniques, 3);
+  f_111_110_100_110_0(uniques, 3);
+  f_111_110_100_110_1(uniques, 3);
+  f_111_110_100_111_0(uniques, 3);
+  f_111_110_100_111_1(uniques, 3);
+  f_111_110_101_000_0(uniques, 3);
+  f_111_110_101_000_1(uniques, 3);
+  f_111_110_101_001_0(uniques, 3);
+  f_111_110_101_001_1(uniques, 3);
+  f_111_110_101_010_0(uniques, 3);
+  f_111_110_101_010_1(uniques, 3);
+  f_111_110_101_011_0(uniques, 3);
+  f_111_110_101_011_1(uniques, 3);
+  f_111_110_101_100_0(uniques, 3);
+  f_111_110_101_100_1(uniques, 3);
+  f_111_110_101_101_0(uniques, 3);
+  f_111_110_101_101_1(uniques, 3);
+  f_111_110_101_110_0(uniques, 3);
+  f_111_110_101_110_1(uniques, 3);
+  f_111_110_101_111_0(uniques, 3);
+  f_111_110_101_111_1(uniques, 3);
+  f_111_110_110_000_0(uniques, 3);
+  f_111_110_110_000_1(uniques, 3);
+  f_111_110_110_001_0(uniques, 3);
+  f_111_110_110_001_1(uniques, 3);
+  f_111_110_110_010_0(uniques, 3);
+  f_111_110_110_010_1(uniques, 3);
+  f_111_110_110_011_0(uniques, 3);
+  f_111_110_110_011_1(uniques, 3);
+  f_111_110_110_100_0(uniques, 3);
+  f_111_110_110_100_1(uniques, 3);
+  f_111_110_110_101_0(uniques, 3);
+  f_111_110_110_101_1(uniques, 3);
+  f_111_110_110_110_0(uniques, 3);
+  f_111_110_110_110_1(uniques, 3);
+  f_111_110_110_111_0(uniques, 3);
+  f_111_110_110_111_1(uniques, 3);
+  f_111_110_111_000_0(uniques, 3);
+  f_111_110_111_000_1(uniques, 3);
+  f_111_110_111_001_0(uniques, 3);
+  f_111_110_111_001_1(uniques, 3);
+  f_111_110_111_010_0(uniques, 3);
+  f_111_110_111_010_1(uniques, 3);
+  f_111_110_111_011_0(uniques, 3);
+  f_111_110_111_011_1(uniques, 3);
+  f_111_110_111_100_0(uniques, 3);
+  f_111_110_111_100_1(uniques, 3);
+  f_111_110_111_101_0(uniques, 3);
+  f_111_110_111_101_1(uniques, 3);
+  f_111_110_111_110_0(uniques, 3);
+  f_111_110_111_110_1(uniques, 3);
+  f_111_110_111_111_0(uniques, 3);
+  f_111_110_111_111_1(uniques, 3);
+  f_111_111_000_000_0(uniques, 3);
+  f_111_111_000_000_1(uniques, 3);
+  f_111_111_000_001_0(uniques, 3);
+  f_111_111_000_001_1(uniques, 3);
+  f_111_111_000_010_0(uniques, 3);
+  f_111_111_000_010_1(uniques, 3);
+  f_111_111_000_011_0(uniques, 3);
+  f_111_111_000_011_1(uniques, 3);
+  f_111_111_000_100_0(uniques, 3);
+  f_111_111_000_100_1(uniques, 3);
+  f_111_111_000_101_0(uniques, 3);
+  f_111_111_000_101_1(uniques, 3);
+  f_111_111_000_110_0(uniques, 3);
+  f_111_111_000_110_1(uniques, 3);
+  f_111_111_000_111_0(uniques, 3);
+  f_111_111_000_111_1(uniques, 3);
+  f_111_111_001_000_0(uniques, 3);
+  f_111_111_001_000_1(uniques, 3);
+  f_111_111_001_001_0(uniques, 3);
+  f_111_111_001_001_1(uniques, 3);
+  f_111_111_001_010_0(uniques, 3);
+  f_111_111_001_010_1(uniques, 3);
+  f_111_111_001_011_0(uniques, 3);
+  f_111_111_001_011_1(uniques, 3);
+  f_111_111_001_100_0(uniques, 3);
+  f_111_111_001_100_1(uniques, 3);
+  f_111_111_001_101_0(uniques, 3);
+  f_111_111_001_101_1(uniques, 3);
+  f_111_111_001_110_0(uniques, 3);
+  f_111_111_001_110_1(uniques, 3);
+  f_111_111_001_111_0(uniques, 3);
+  f_111_111_001_111_1(uniques, 3);
+  f_111_111_010_000_0(uniques, 3);
+  f_111_111_010_000_1(uniques, 3);
+  f_111_111_010_001_0(uniques, 3);
+  f_111_111_010_001_1(uniques, 3);
+  f_111_111_010_010_0(uniques, 3);
+  f_111_111_010_010_1(uniques, 3);
+  f_111_111_010_011_0(uniques, 3);
+  f_111_111_010_011_1(uniques, 3);
+  f_111_111_010_100_0(uniques, 3);
+  f_111_111_010_100_1(uniques, 3);
+  f_111_111_010_101_0(uniques, 3);
+  f_111_111_010_101_1(uniques, 3);
+  f_111_111_010_110_0(uniques, 3);
+  f_111_111_010_110_1(uniques, 3);
+  f_111_111_010_111_0(uniques, 3);
+  f_111_111_010_111_1(uniques, 3);
+  f_111_111_011_000_0(uniques, 3);
+  f_111_111_011_000_1(uniques, 3);
+  f_111_111_011_001_0(uniques, 3);
+  f_111_111_011_001_1(uniques, 3);
+  f_111_111_011_010_0(uniques, 3);
+  f_111_111_011_010_1(uniques, 3);
+  f_111_111_011_011_0(uniques, 3);
+  f_111_111_011_011_1(uniques, 3);
+  f_111_111_011_100_0(uniques, 3);
+  f_111_111_011_100_1(uniques, 3);
+  f_111_111_011_101_0(uniques, 3);
+  f_111_111_011_101_1(uniques, 3);
+  f_111_111_011_110_0(uniques, 3);
+  f_111_111_011_110_1(uniques, 3);
+  f_111_111_011_111_0(uniques, 3);
+  f_111_111_011_111_1(uniques, 3);
+  f_111_111_100_000_0(uniques, 3);
+  f_111_111_100_000_1(uniques, 3);
+  f_111_111_100_001_0(uniques, 3);
+  f_111_111_100_001_1(uniques, 3);
+  f_111_111_100_010_0(uniques, 3);
+  f_111_111_100_010_1(uniques, 3);
+  f_111_111_100_011_0(uniques, 3);
+  f_111_111_100_011_1(uniques, 3);
+  f_111_111_100_100_0(uniques, 3);
+  f_111_111_100_100_1(uniques, 3);
+  f_111_111_100_101_0(uniques, 3);
+  f_111_111_100_101_1(uniques, 3);
+  f_111_111_100_110_0(uniques, 3);
+  f_111_111_100_110_1(uniques, 3);
+  f_111_111_100_111_0(uniques, 3);
+  f_111_111_100_111_1(uniques, 3);
+  f_111_111_101_000_0(uniques, 3);
+  f_111_111_101_000_1(uniques, 3);
+  f_111_111_101_001_0(uniques, 3);
+  f_111_111_101_001_1(uniques, 3);
+  f_111_111_101_010_0(uniques, 3);
+  f_111_111_101_010_1(uniques, 3);
+  f_111_111_101_011_0(uniques, 3);
+  f_111_111_101_011_1(uniques, 3);
+  f_111_111_101_100_0(uniques, 3);
+  f_111_111_101_100_1(uniques, 3);
+  f_111_111_101_101_0(uniques, 3);
+  f_111_111_101_101_1(uniques, 3);
+  f_111_111_101_110_0(uniques, 3);
+  f_111_111_101_110_1(uniques, 3);
+  f_111_111_101_111_0(uniques, 3);
+  f_111_111_101_111_1(uniques, 3);
+  f_111_111_110_000_0(uniques, 3);
+  f_111_111_110_000_1(uniques, 3);
+  f_111_111_110_001_0(uniques, 3);
+  f_111_111_110_001_1(uniques, 3);
+  f_111_111_110_010_0(uniques, 3);
+  f_111_111_110_010_1(uniques, 3);
+  f_111_111_110_011_0(uniques, 3);
+  f_111_111_110_011_1(uniques, 3);
+  f_111_111_110_100_0(uniques, 3);
+  f_111_111_110_100_1(uniques, 3);
+  f_111_111_110_101_0(uniques, 3);
+  f_111_111_110_101_1(uniques, 3);
+  f_111_111_110_110_0(uniques, 3);
+  f_111_111_110_110_1(uniques, 3);
+  f_111_111_110_111_0(uniques, 3);
+  f_111_111_110_111_1(uniques, 3);
+  f_111_111_111_000_0(uniques, 3);
+  f_111_111_111_000_1(uniques, 3);
+  f_111_111_111_001_0(uniques, 3);
+  f_111_111_111_001_1(uniques, 3);
+  f_111_111_111_010_0(uniques, 3);
+  f_111_111_111_010_1(uniques, 3);
+  f_111_111_111_011_0(uniques, 3);
+  f_111_111_111_011_1(uniques, 3);
+  f_111_111_111_100_0(uniques, 3);
+  f_111_111_111_100_1(uniques, 3);
+  f_111_111_111_101_0(uniques, 3);
+  f_111_111_111_101_1(uniques, 3);
+  f_111_111_111_110_0(uniques, 3);
+  f_111_111_111_110_1(uniques, 3);
+  f_111_111_111_111_0(uniques, 3);
+  f_111_111_111_111_1(uniques, 3);
+  Expect.equals(4096, uniques.length);
+}
diff --git a/tests/dart2js/deferred/many_parts/lib_001_000_000_000_0.dart b/tests/dart2js/deferred/many_parts/lib_001_000_000_000_0.dart
new file mode 100644
index 0000000..b3f1f7b
--- /dev/null
+++ b/tests/dart2js/deferred/many_parts/lib_001_000_000_000_0.dart
@@ -0,0 +1,4111 @@
+// Copyright (c) 2020, 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:expect/expect.dart";
+
+import 'libB.dart';
+
+@pragma('dart2js:noInline')
+g_001_000_000_000_0() {
+  Set<String> uniques = {};
+
+  // f_**1_***_***_***_*;
+  f_001_000_000_000_0(uniques, 2);
+  f_001_000_000_000_1(uniques, 2);
+  f_001_000_000_001_0(uniques, 2);
+  f_001_000_000_001_1(uniques, 2);
+  f_001_000_000_010_0(uniques, 2);
+  f_001_000_000_010_1(uniques, 2);
+  f_001_000_000_011_0(uniques, 2);
+  f_001_000_000_011_1(uniques, 2);
+  f_001_000_000_100_0(uniques, 2);
+  f_001_000_000_100_1(uniques, 2);
+  f_001_000_000_101_0(uniques, 2);
+  f_001_000_000_101_1(uniques, 2);
+  f_001_000_000_110_0(uniques, 2);
+  f_001_000_000_110_1(uniques, 2);
+  f_001_000_000_111_0(uniques, 2);
+  f_001_000_000_111_1(uniques, 2);
+  f_001_000_001_000_0(uniques, 2);
+  f_001_000_001_000_1(uniques, 2);
+  f_001_000_001_001_0(uniques, 2);
+  f_001_000_001_001_1(uniques, 2);
+  f_001_000_001_010_0(uniques, 2);
+  f_001_000_001_010_1(uniques, 2);
+  f_001_000_001_011_0(uniques, 2);
+  f_001_000_001_011_1(uniques, 2);
+  f_001_000_001_100_0(uniques, 2);
+  f_001_000_001_100_1(uniques, 2);
+  f_001_000_001_101_0(uniques, 2);
+  f_001_000_001_101_1(uniques, 2);
+  f_001_000_001_110_0(uniques, 2);
+  f_001_000_001_110_1(uniques, 2);
+  f_001_000_001_111_0(uniques, 2);
+  f_001_000_001_111_1(uniques, 2);
+  f_001_000_010_000_0(uniques, 2);
+  f_001_000_010_000_1(uniques, 2);
+  f_001_000_010_001_0(uniques, 2);
+  f_001_000_010_001_1(uniques, 2);
+  f_001_000_010_010_0(uniques, 2);
+  f_001_000_010_010_1(uniques, 2);
+  f_001_000_010_011_0(uniques, 2);
+  f_001_000_010_011_1(uniques, 2);
+  f_001_000_010_100_0(uniques, 2);
+  f_001_000_010_100_1(uniques, 2);
+  f_001_000_010_101_0(uniques, 2);
+  f_001_000_010_101_1(uniques, 2);
+  f_001_000_010_110_0(uniques, 2);
+  f_001_000_010_110_1(uniques, 2);
+  f_001_000_010_111_0(uniques, 2);
+  f_001_000_010_111_1(uniques, 2);
+  f_001_000_011_000_0(uniques, 2);
+  f_001_000_011_000_1(uniques, 2);
+  f_001_000_011_001_0(uniques, 2);
+  f_001_000_011_001_1(uniques, 2);
+  f_001_000_011_010_0(uniques, 2);
+  f_001_000_011_010_1(uniques, 2);
+  f_001_000_011_011_0(uniques, 2);
+  f_001_000_011_011_1(uniques, 2);
+  f_001_000_011_100_0(uniques, 2);
+  f_001_000_011_100_1(uniques, 2);
+  f_001_000_011_101_0(uniques, 2);
+  f_001_000_011_101_1(uniques, 2);
+  f_001_000_011_110_0(uniques, 2);
+  f_001_000_011_110_1(uniques, 2);
+  f_001_000_011_111_0(uniques, 2);
+  f_001_000_011_111_1(uniques, 2);
+  f_001_000_100_000_0(uniques, 2);
+  f_001_000_100_000_1(uniques, 2);
+  f_001_000_100_001_0(uniques, 2);
+  f_001_000_100_001_1(uniques, 2);
+  f_001_000_100_010_0(uniques, 2);
+  f_001_000_100_010_1(uniques, 2);
+  f_001_000_100_011_0(uniques, 2);
+  f_001_000_100_011_1(uniques, 2);
+  f_001_000_100_100_0(uniques, 2);
+  f_001_000_100_100_1(uniques, 2);
+  f_001_000_100_101_0(uniques, 2);
+  f_001_000_100_101_1(uniques, 2);
+  f_001_000_100_110_0(uniques, 2);
+  f_001_000_100_110_1(uniques, 2);
+  f_001_000_100_111_0(uniques, 2);
+  f_001_000_100_111_1(uniques, 2);
+  f_001_000_101_000_0(uniques, 2);
+  f_001_000_101_000_1(uniques, 2);
+  f_001_000_101_001_0(uniques, 2);
+  f_001_000_101_001_1(uniques, 2);
+  f_001_000_101_010_0(uniques, 2);
+  f_001_000_101_010_1(uniques, 2);
+  f_001_000_101_011_0(uniques, 2);
+  f_001_000_101_011_1(uniques, 2);
+  f_001_000_101_100_0(uniques, 2);
+  f_001_000_101_100_1(uniques, 2);
+  f_001_000_101_101_0(uniques, 2);
+  f_001_000_101_101_1(uniques, 2);
+  f_001_000_101_110_0(uniques, 2);
+  f_001_000_101_110_1(uniques, 2);
+  f_001_000_101_111_0(uniques, 2);
+  f_001_000_101_111_1(uniques, 2);
+  f_001_000_110_000_0(uniques, 2);
+  f_001_000_110_000_1(uniques, 2);
+  f_001_000_110_001_0(uniques, 2);
+  f_001_000_110_001_1(uniques, 2);
+  f_001_000_110_010_0(uniques, 2);
+  f_001_000_110_010_1(uniques, 2);
+  f_001_000_110_011_0(uniques, 2);
+  f_001_000_110_011_1(uniques, 2);
+  f_001_000_110_100_0(uniques, 2);
+  f_001_000_110_100_1(uniques, 2);
+  f_001_000_110_101_0(uniques, 2);
+  f_001_000_110_101_1(uniques, 2);
+  f_001_000_110_110_0(uniques, 2);
+  f_001_000_110_110_1(uniques, 2);
+  f_001_000_110_111_0(uniques, 2);
+  f_001_000_110_111_1(uniques, 2);
+  f_001_000_111_000_0(uniques, 2);
+  f_001_000_111_000_1(uniques, 2);
+  f_001_000_111_001_0(uniques, 2);
+  f_001_000_111_001_1(uniques, 2);
+  f_001_000_111_010_0(uniques, 2);
+  f_001_000_111_010_1(uniques, 2);
+  f_001_000_111_011_0(uniques, 2);
+  f_001_000_111_011_1(uniques, 2);
+  f_001_000_111_100_0(uniques, 2);
+  f_001_000_111_100_1(uniques, 2);
+  f_001_000_111_101_0(uniques, 2);
+  f_001_000_111_101_1(uniques, 2);
+  f_001_000_111_110_0(uniques, 2);
+  f_001_000_111_110_1(uniques, 2);
+  f_001_000_111_111_0(uniques, 2);
+  f_001_000_111_111_1(uniques, 2);
+  f_001_001_000_000_0(uniques, 2);
+  f_001_001_000_000_1(uniques, 2);
+  f_001_001_000_001_0(uniques, 2);
+  f_001_001_000_001_1(uniques, 2);
+  f_001_001_000_010_0(uniques, 2);
+  f_001_001_000_010_1(uniques, 2);
+  f_001_001_000_011_0(uniques, 2);
+  f_001_001_000_011_1(uniques, 2);
+  f_001_001_000_100_0(uniques, 2);
+  f_001_001_000_100_1(uniques, 2);
+  f_001_001_000_101_0(uniques, 2);
+  f_001_001_000_101_1(uniques, 2);
+  f_001_001_000_110_0(uniques, 2);
+  f_001_001_000_110_1(uniques, 2);
+  f_001_001_000_111_0(uniques, 2);
+  f_001_001_000_111_1(uniques, 2);
+  f_001_001_001_000_0(uniques, 2);
+  f_001_001_001_000_1(uniques, 2);
+  f_001_001_001_001_0(uniques, 2);
+  f_001_001_001_001_1(uniques, 2);
+  f_001_001_001_010_0(uniques, 2);
+  f_001_001_001_010_1(uniques, 2);
+  f_001_001_001_011_0(uniques, 2);
+  f_001_001_001_011_1(uniques, 2);
+  f_001_001_001_100_0(uniques, 2);
+  f_001_001_001_100_1(uniques, 2);
+  f_001_001_001_101_0(uniques, 2);
+  f_001_001_001_101_1(uniques, 2);
+  f_001_001_001_110_0(uniques, 2);
+  f_001_001_001_110_1(uniques, 2);
+  f_001_001_001_111_0(uniques, 2);
+  f_001_001_001_111_1(uniques, 2);
+  f_001_001_010_000_0(uniques, 2);
+  f_001_001_010_000_1(uniques, 2);
+  f_001_001_010_001_0(uniques, 2);
+  f_001_001_010_001_1(uniques, 2);
+  f_001_001_010_010_0(uniques, 2);
+  f_001_001_010_010_1(uniques, 2);
+  f_001_001_010_011_0(uniques, 2);
+  f_001_001_010_011_1(uniques, 2);
+  f_001_001_010_100_0(uniques, 2);
+  f_001_001_010_100_1(uniques, 2);
+  f_001_001_010_101_0(uniques, 2);
+  f_001_001_010_101_1(uniques, 2);
+  f_001_001_010_110_0(uniques, 2);
+  f_001_001_010_110_1(uniques, 2);
+  f_001_001_010_111_0(uniques, 2);
+  f_001_001_010_111_1(uniques, 2);
+  f_001_001_011_000_0(uniques, 2);
+  f_001_001_011_000_1(uniques, 2);
+  f_001_001_011_001_0(uniques, 2);
+  f_001_001_011_001_1(uniques, 2);
+  f_001_001_011_010_0(uniques, 2);
+  f_001_001_011_010_1(uniques, 2);
+  f_001_001_011_011_0(uniques, 2);
+  f_001_001_011_011_1(uniques, 2);
+  f_001_001_011_100_0(uniques, 2);
+  f_001_001_011_100_1(uniques, 2);
+  f_001_001_011_101_0(uniques, 2);
+  f_001_001_011_101_1(uniques, 2);
+  f_001_001_011_110_0(uniques, 2);
+  f_001_001_011_110_1(uniques, 2);
+  f_001_001_011_111_0(uniques, 2);
+  f_001_001_011_111_1(uniques, 2);
+  f_001_001_100_000_0(uniques, 2);
+  f_001_001_100_000_1(uniques, 2);
+  f_001_001_100_001_0(uniques, 2);
+  f_001_001_100_001_1(uniques, 2);
+  f_001_001_100_010_0(uniques, 2);
+  f_001_001_100_010_1(uniques, 2);
+  f_001_001_100_011_0(uniques, 2);
+  f_001_001_100_011_1(uniques, 2);
+  f_001_001_100_100_0(uniques, 2);
+  f_001_001_100_100_1(uniques, 2);
+  f_001_001_100_101_0(uniques, 2);
+  f_001_001_100_101_1(uniques, 2);
+  f_001_001_100_110_0(uniques, 2);
+  f_001_001_100_110_1(uniques, 2);
+  f_001_001_100_111_0(uniques, 2);
+  f_001_001_100_111_1(uniques, 2);
+  f_001_001_101_000_0(uniques, 2);
+  f_001_001_101_000_1(uniques, 2);
+  f_001_001_101_001_0(uniques, 2);
+  f_001_001_101_001_1(uniques, 2);
+  f_001_001_101_010_0(uniques, 2);
+  f_001_001_101_010_1(uniques, 2);
+  f_001_001_101_011_0(uniques, 2);
+  f_001_001_101_011_1(uniques, 2);
+  f_001_001_101_100_0(uniques, 2);
+  f_001_001_101_100_1(uniques, 2);
+  f_001_001_101_101_0(uniques, 2);
+  f_001_001_101_101_1(uniques, 2);
+  f_001_001_101_110_0(uniques, 2);
+  f_001_001_101_110_1(uniques, 2);
+  f_001_001_101_111_0(uniques, 2);
+  f_001_001_101_111_1(uniques, 2);
+  f_001_001_110_000_0(uniques, 2);
+  f_001_001_110_000_1(uniques, 2);
+  f_001_001_110_001_0(uniques, 2);
+  f_001_001_110_001_1(uniques, 2);
+  f_001_001_110_010_0(uniques, 2);
+  f_001_001_110_010_1(uniques, 2);
+  f_001_001_110_011_0(uniques, 2);
+  f_001_001_110_011_1(uniques, 2);
+  f_001_001_110_100_0(uniques, 2);
+  f_001_001_110_100_1(uniques, 2);
+  f_001_001_110_101_0(uniques, 2);
+  f_001_001_110_101_1(uniques, 2);
+  f_001_001_110_110_0(uniques, 2);
+  f_001_001_110_110_1(uniques, 2);
+  f_001_001_110_111_0(uniques, 2);
+  f_001_001_110_111_1(uniques, 2);
+  f_001_001_111_000_0(uniques, 2);
+  f_001_001_111_000_1(uniques, 2);
+  f_001_001_111_001_0(uniques, 2);
+  f_001_001_111_001_1(uniques, 2);
+  f_001_001_111_010_0(uniques, 2);
+  f_001_001_111_010_1(uniques, 2);
+  f_001_001_111_011_0(uniques, 2);
+  f_001_001_111_011_1(uniques, 2);
+  f_001_001_111_100_0(uniques, 2);
+  f_001_001_111_100_1(uniques, 2);
+  f_001_001_111_101_0(uniques, 2);
+  f_001_001_111_101_1(uniques, 2);
+  f_001_001_111_110_0(uniques, 2);
+  f_001_001_111_110_1(uniques, 2);
+  f_001_001_111_111_0(uniques, 2);
+  f_001_001_111_111_1(uniques, 2);
+  f_001_010_000_000_0(uniques, 2);
+  f_001_010_000_000_1(uniques, 2);
+  f_001_010_000_001_0(uniques, 2);
+  f_001_010_000_001_1(uniques, 2);
+  f_001_010_000_010_0(uniques, 2);
+  f_001_010_000_010_1(uniques, 2);
+  f_001_010_000_011_0(uniques, 2);
+  f_001_010_000_011_1(uniques, 2);
+  f_001_010_000_100_0(uniques, 2);
+  f_001_010_000_100_1(uniques, 2);
+  f_001_010_000_101_0(uniques, 2);
+  f_001_010_000_101_1(uniques, 2);
+  f_001_010_000_110_0(uniques, 2);
+  f_001_010_000_110_1(uniques, 2);
+  f_001_010_000_111_0(uniques, 2);
+  f_001_010_000_111_1(uniques, 2);
+  f_001_010_001_000_0(uniques, 2);
+  f_001_010_001_000_1(uniques, 2);
+  f_001_010_001_001_0(uniques, 2);
+  f_001_010_001_001_1(uniques, 2);
+  f_001_010_001_010_0(uniques, 2);
+  f_001_010_001_010_1(uniques, 2);
+  f_001_010_001_011_0(uniques, 2);
+  f_001_010_001_011_1(uniques, 2);
+  f_001_010_001_100_0(uniques, 2);
+  f_001_010_001_100_1(uniques, 2);
+  f_001_010_001_101_0(uniques, 2);
+  f_001_010_001_101_1(uniques, 2);
+  f_001_010_001_110_0(uniques, 2);
+  f_001_010_001_110_1(uniques, 2);
+  f_001_010_001_111_0(uniques, 2);
+  f_001_010_001_111_1(uniques, 2);
+  f_001_010_010_000_0(uniques, 2);
+  f_001_010_010_000_1(uniques, 2);
+  f_001_010_010_001_0(uniques, 2);
+  f_001_010_010_001_1(uniques, 2);
+  f_001_010_010_010_0(uniques, 2);
+  f_001_010_010_010_1(uniques, 2);
+  f_001_010_010_011_0(uniques, 2);
+  f_001_010_010_011_1(uniques, 2);
+  f_001_010_010_100_0(uniques, 2);
+  f_001_010_010_100_1(uniques, 2);
+  f_001_010_010_101_0(uniques, 2);
+  f_001_010_010_101_1(uniques, 2);
+  f_001_010_010_110_0(uniques, 2);
+  f_001_010_010_110_1(uniques, 2);
+  f_001_010_010_111_0(uniques, 2);
+  f_001_010_010_111_1(uniques, 2);
+  f_001_010_011_000_0(uniques, 2);
+  f_001_010_011_000_1(uniques, 2);
+  f_001_010_011_001_0(uniques, 2);
+  f_001_010_011_001_1(uniques, 2);
+  f_001_010_011_010_0(uniques, 2);
+  f_001_010_011_010_1(uniques, 2);
+  f_001_010_011_011_0(uniques, 2);
+  f_001_010_011_011_1(uniques, 2);
+  f_001_010_011_100_0(uniques, 2);
+  f_001_010_011_100_1(uniques, 2);
+  f_001_010_011_101_0(uniques, 2);
+  f_001_010_011_101_1(uniques, 2);
+  f_001_010_011_110_0(uniques, 2);
+  f_001_010_011_110_1(uniques, 2);
+  f_001_010_011_111_0(uniques, 2);
+  f_001_010_011_111_1(uniques, 2);
+  f_001_010_100_000_0(uniques, 2);
+  f_001_010_100_000_1(uniques, 2);
+  f_001_010_100_001_0(uniques, 2);
+  f_001_010_100_001_1(uniques, 2);
+  f_001_010_100_010_0(uniques, 2);
+  f_001_010_100_010_1(uniques, 2);
+  f_001_010_100_011_0(uniques, 2);
+  f_001_010_100_011_1(uniques, 2);
+  f_001_010_100_100_0(uniques, 2);
+  f_001_010_100_100_1(uniques, 2);
+  f_001_010_100_101_0(uniques, 2);
+  f_001_010_100_101_1(uniques, 2);
+  f_001_010_100_110_0(uniques, 2);
+  f_001_010_100_110_1(uniques, 2);
+  f_001_010_100_111_0(uniques, 2);
+  f_001_010_100_111_1(uniques, 2);
+  f_001_010_101_000_0(uniques, 2);
+  f_001_010_101_000_1(uniques, 2);
+  f_001_010_101_001_0(uniques, 2);
+  f_001_010_101_001_1(uniques, 2);
+  f_001_010_101_010_0(uniques, 2);
+  f_001_010_101_010_1(uniques, 2);
+  f_001_010_101_011_0(uniques, 2);
+  f_001_010_101_011_1(uniques, 2);
+  f_001_010_101_100_0(uniques, 2);
+  f_001_010_101_100_1(uniques, 2);
+  f_001_010_101_101_0(uniques, 2);
+  f_001_010_101_101_1(uniques, 2);
+  f_001_010_101_110_0(uniques, 2);
+  f_001_010_101_110_1(uniques, 2);
+  f_001_010_101_111_0(uniques, 2);
+  f_001_010_101_111_1(uniques, 2);
+  f_001_010_110_000_0(uniques, 2);
+  f_001_010_110_000_1(uniques, 2);
+  f_001_010_110_001_0(uniques, 2);
+  f_001_010_110_001_1(uniques, 2);
+  f_001_010_110_010_0(uniques, 2);
+  f_001_010_110_010_1(uniques, 2);
+  f_001_010_110_011_0(uniques, 2);
+  f_001_010_110_011_1(uniques, 2);
+  f_001_010_110_100_0(uniques, 2);
+  f_001_010_110_100_1(uniques, 2);
+  f_001_010_110_101_0(uniques, 2);
+  f_001_010_110_101_1(uniques, 2);
+  f_001_010_110_110_0(uniques, 2);
+  f_001_010_110_110_1(uniques, 2);
+  f_001_010_110_111_0(uniques, 2);
+  f_001_010_110_111_1(uniques, 2);
+  f_001_010_111_000_0(uniques, 2);
+  f_001_010_111_000_1(uniques, 2);
+  f_001_010_111_001_0(uniques, 2);
+  f_001_010_111_001_1(uniques, 2);
+  f_001_010_111_010_0(uniques, 2);
+  f_001_010_111_010_1(uniques, 2);
+  f_001_010_111_011_0(uniques, 2);
+  f_001_010_111_011_1(uniques, 2);
+  f_001_010_111_100_0(uniques, 2);
+  f_001_010_111_100_1(uniques, 2);
+  f_001_010_111_101_0(uniques, 2);
+  f_001_010_111_101_1(uniques, 2);
+  f_001_010_111_110_0(uniques, 2);
+  f_001_010_111_110_1(uniques, 2);
+  f_001_010_111_111_0(uniques, 2);
+  f_001_010_111_111_1(uniques, 2);
+  f_001_011_000_000_0(uniques, 2);
+  f_001_011_000_000_1(uniques, 2);
+  f_001_011_000_001_0(uniques, 2);
+  f_001_011_000_001_1(uniques, 2);
+  f_001_011_000_010_0(uniques, 2);
+  f_001_011_000_010_1(uniques, 2);
+  f_001_011_000_011_0(uniques, 2);
+  f_001_011_000_011_1(uniques, 2);
+  f_001_011_000_100_0(uniques, 2);
+  f_001_011_000_100_1(uniques, 2);
+  f_001_011_000_101_0(uniques, 2);
+  f_001_011_000_101_1(uniques, 2);
+  f_001_011_000_110_0(uniques, 2);
+  f_001_011_000_110_1(uniques, 2);
+  f_001_011_000_111_0(uniques, 2);
+  f_001_011_000_111_1(uniques, 2);
+  f_001_011_001_000_0(uniques, 2);
+  f_001_011_001_000_1(uniques, 2);
+  f_001_011_001_001_0(uniques, 2);
+  f_001_011_001_001_1(uniques, 2);
+  f_001_011_001_010_0(uniques, 2);
+  f_001_011_001_010_1(uniques, 2);
+  f_001_011_001_011_0(uniques, 2);
+  f_001_011_001_011_1(uniques, 2);
+  f_001_011_001_100_0(uniques, 2);
+  f_001_011_001_100_1(uniques, 2);
+  f_001_011_001_101_0(uniques, 2);
+  f_001_011_001_101_1(uniques, 2);
+  f_001_011_001_110_0(uniques, 2);
+  f_001_011_001_110_1(uniques, 2);
+  f_001_011_001_111_0(uniques, 2);
+  f_001_011_001_111_1(uniques, 2);
+  f_001_011_010_000_0(uniques, 2);
+  f_001_011_010_000_1(uniques, 2);
+  f_001_011_010_001_0(uniques, 2);
+  f_001_011_010_001_1(uniques, 2);
+  f_001_011_010_010_0(uniques, 2);
+  f_001_011_010_010_1(uniques, 2);
+  f_001_011_010_011_0(uniques, 2);
+  f_001_011_010_011_1(uniques, 2);
+  f_001_011_010_100_0(uniques, 2);
+  f_001_011_010_100_1(uniques, 2);
+  f_001_011_010_101_0(uniques, 2);
+  f_001_011_010_101_1(uniques, 2);
+  f_001_011_010_110_0(uniques, 2);
+  f_001_011_010_110_1(uniques, 2);
+  f_001_011_010_111_0(uniques, 2);
+  f_001_011_010_111_1(uniques, 2);
+  f_001_011_011_000_0(uniques, 2);
+  f_001_011_011_000_1(uniques, 2);
+  f_001_011_011_001_0(uniques, 2);
+  f_001_011_011_001_1(uniques, 2);
+  f_001_011_011_010_0(uniques, 2);
+  f_001_011_011_010_1(uniques, 2);
+  f_001_011_011_011_0(uniques, 2);
+  f_001_011_011_011_1(uniques, 2);
+  f_001_011_011_100_0(uniques, 2);
+  f_001_011_011_100_1(uniques, 2);
+  f_001_011_011_101_0(uniques, 2);
+  f_001_011_011_101_1(uniques, 2);
+  f_001_011_011_110_0(uniques, 2);
+  f_001_011_011_110_1(uniques, 2);
+  f_001_011_011_111_0(uniques, 2);
+  f_001_011_011_111_1(uniques, 2);
+  f_001_011_100_000_0(uniques, 2);
+  f_001_011_100_000_1(uniques, 2);
+  f_001_011_100_001_0(uniques, 2);
+  f_001_011_100_001_1(uniques, 2);
+  f_001_011_100_010_0(uniques, 2);
+  f_001_011_100_010_1(uniques, 2);
+  f_001_011_100_011_0(uniques, 2);
+  f_001_011_100_011_1(uniques, 2);
+  f_001_011_100_100_0(uniques, 2);
+  f_001_011_100_100_1(uniques, 2);
+  f_001_011_100_101_0(uniques, 2);
+  f_001_011_100_101_1(uniques, 2);
+  f_001_011_100_110_0(uniques, 2);
+  f_001_011_100_110_1(uniques, 2);
+  f_001_011_100_111_0(uniques, 2);
+  f_001_011_100_111_1(uniques, 2);
+  f_001_011_101_000_0(uniques, 2);
+  f_001_011_101_000_1(uniques, 2);
+  f_001_011_101_001_0(uniques, 2);
+  f_001_011_101_001_1(uniques, 2);
+  f_001_011_101_010_0(uniques, 2);
+  f_001_011_101_010_1(uniques, 2);
+  f_001_011_101_011_0(uniques, 2);
+  f_001_011_101_011_1(uniques, 2);
+  f_001_011_101_100_0(uniques, 2);
+  f_001_011_101_100_1(uniques, 2);
+  f_001_011_101_101_0(uniques, 2);
+  f_001_011_101_101_1(uniques, 2);
+  f_001_011_101_110_0(uniques, 2);
+  f_001_011_101_110_1(uniques, 2);
+  f_001_011_101_111_0(uniques, 2);
+  f_001_011_101_111_1(uniques, 2);
+  f_001_011_110_000_0(uniques, 2);
+  f_001_011_110_000_1(uniques, 2);
+  f_001_011_110_001_0(uniques, 2);
+  f_001_011_110_001_1(uniques, 2);
+  f_001_011_110_010_0(uniques, 2);
+  f_001_011_110_010_1(uniques, 2);
+  f_001_011_110_011_0(uniques, 2);
+  f_001_011_110_011_1(uniques, 2);
+  f_001_011_110_100_0(uniques, 2);
+  f_001_011_110_100_1(uniques, 2);
+  f_001_011_110_101_0(uniques, 2);
+  f_001_011_110_101_1(uniques, 2);
+  f_001_011_110_110_0(uniques, 2);
+  f_001_011_110_110_1(uniques, 2);
+  f_001_011_110_111_0(uniques, 2);
+  f_001_011_110_111_1(uniques, 2);
+  f_001_011_111_000_0(uniques, 2);
+  f_001_011_111_000_1(uniques, 2);
+  f_001_011_111_001_0(uniques, 2);
+  f_001_011_111_001_1(uniques, 2);
+  f_001_011_111_010_0(uniques, 2);
+  f_001_011_111_010_1(uniques, 2);
+  f_001_011_111_011_0(uniques, 2);
+  f_001_011_111_011_1(uniques, 2);
+  f_001_011_111_100_0(uniques, 2);
+  f_001_011_111_100_1(uniques, 2);
+  f_001_011_111_101_0(uniques, 2);
+  f_001_011_111_101_1(uniques, 2);
+  f_001_011_111_110_0(uniques, 2);
+  f_001_011_111_110_1(uniques, 2);
+  f_001_011_111_111_0(uniques, 2);
+  f_001_011_111_111_1(uniques, 2);
+  f_001_100_000_000_0(uniques, 2);
+  f_001_100_000_000_1(uniques, 2);
+  f_001_100_000_001_0(uniques, 2);
+  f_001_100_000_001_1(uniques, 2);
+  f_001_100_000_010_0(uniques, 2);
+  f_001_100_000_010_1(uniques, 2);
+  f_001_100_000_011_0(uniques, 2);
+  f_001_100_000_011_1(uniques, 2);
+  f_001_100_000_100_0(uniques, 2);
+  f_001_100_000_100_1(uniques, 2);
+  f_001_100_000_101_0(uniques, 2);
+  f_001_100_000_101_1(uniques, 2);
+  f_001_100_000_110_0(uniques, 2);
+  f_001_100_000_110_1(uniques, 2);
+  f_001_100_000_111_0(uniques, 2);
+  f_001_100_000_111_1(uniques, 2);
+  f_001_100_001_000_0(uniques, 2);
+  f_001_100_001_000_1(uniques, 2);
+  f_001_100_001_001_0(uniques, 2);
+  f_001_100_001_001_1(uniques, 2);
+  f_001_100_001_010_0(uniques, 2);
+  f_001_100_001_010_1(uniques, 2);
+  f_001_100_001_011_0(uniques, 2);
+  f_001_100_001_011_1(uniques, 2);
+  f_001_100_001_100_0(uniques, 2);
+  f_001_100_001_100_1(uniques, 2);
+  f_001_100_001_101_0(uniques, 2);
+  f_001_100_001_101_1(uniques, 2);
+  f_001_100_001_110_0(uniques, 2);
+  f_001_100_001_110_1(uniques, 2);
+  f_001_100_001_111_0(uniques, 2);
+  f_001_100_001_111_1(uniques, 2);
+  f_001_100_010_000_0(uniques, 2);
+  f_001_100_010_000_1(uniques, 2);
+  f_001_100_010_001_0(uniques, 2);
+  f_001_100_010_001_1(uniques, 2);
+  f_001_100_010_010_0(uniques, 2);
+  f_001_100_010_010_1(uniques, 2);
+  f_001_100_010_011_0(uniques, 2);
+  f_001_100_010_011_1(uniques, 2);
+  f_001_100_010_100_0(uniques, 2);
+  f_001_100_010_100_1(uniques, 2);
+  f_001_100_010_101_0(uniques, 2);
+  f_001_100_010_101_1(uniques, 2);
+  f_001_100_010_110_0(uniques, 2);
+  f_001_100_010_110_1(uniques, 2);
+  f_001_100_010_111_0(uniques, 2);
+  f_001_100_010_111_1(uniques, 2);
+  f_001_100_011_000_0(uniques, 2);
+  f_001_100_011_000_1(uniques, 2);
+  f_001_100_011_001_0(uniques, 2);
+  f_001_100_011_001_1(uniques, 2);
+  f_001_100_011_010_0(uniques, 2);
+  f_001_100_011_010_1(uniques, 2);
+  f_001_100_011_011_0(uniques, 2);
+  f_001_100_011_011_1(uniques, 2);
+  f_001_100_011_100_0(uniques, 2);
+  f_001_100_011_100_1(uniques, 2);
+  f_001_100_011_101_0(uniques, 2);
+  f_001_100_011_101_1(uniques, 2);
+  f_001_100_011_110_0(uniques, 2);
+  f_001_100_011_110_1(uniques, 2);
+  f_001_100_011_111_0(uniques, 2);
+  f_001_100_011_111_1(uniques, 2);
+  f_001_100_100_000_0(uniques, 2);
+  f_001_100_100_000_1(uniques, 2);
+  f_001_100_100_001_0(uniques, 2);
+  f_001_100_100_001_1(uniques, 2);
+  f_001_100_100_010_0(uniques, 2);
+  f_001_100_100_010_1(uniques, 2);
+  f_001_100_100_011_0(uniques, 2);
+  f_001_100_100_011_1(uniques, 2);
+  f_001_100_100_100_0(uniques, 2);
+  f_001_100_100_100_1(uniques, 2);
+  f_001_100_100_101_0(uniques, 2);
+  f_001_100_100_101_1(uniques, 2);
+  f_001_100_100_110_0(uniques, 2);
+  f_001_100_100_110_1(uniques, 2);
+  f_001_100_100_111_0(uniques, 2);
+  f_001_100_100_111_1(uniques, 2);
+  f_001_100_101_000_0(uniques, 2);
+  f_001_100_101_000_1(uniques, 2);
+  f_001_100_101_001_0(uniques, 2);
+  f_001_100_101_001_1(uniques, 2);
+  f_001_100_101_010_0(uniques, 2);
+  f_001_100_101_010_1(uniques, 2);
+  f_001_100_101_011_0(uniques, 2);
+  f_001_100_101_011_1(uniques, 2);
+  f_001_100_101_100_0(uniques, 2);
+  f_001_100_101_100_1(uniques, 2);
+  f_001_100_101_101_0(uniques, 2);
+  f_001_100_101_101_1(uniques, 2);
+  f_001_100_101_110_0(uniques, 2);
+  f_001_100_101_110_1(uniques, 2);
+  f_001_100_101_111_0(uniques, 2);
+  f_001_100_101_111_1(uniques, 2);
+  f_001_100_110_000_0(uniques, 2);
+  f_001_100_110_000_1(uniques, 2);
+  f_001_100_110_001_0(uniques, 2);
+  f_001_100_110_001_1(uniques, 2);
+  f_001_100_110_010_0(uniques, 2);
+  f_001_100_110_010_1(uniques, 2);
+  f_001_100_110_011_0(uniques, 2);
+  f_001_100_110_011_1(uniques, 2);
+  f_001_100_110_100_0(uniques, 2);
+  f_001_100_110_100_1(uniques, 2);
+  f_001_100_110_101_0(uniques, 2);
+  f_001_100_110_101_1(uniques, 2);
+  f_001_100_110_110_0(uniques, 2);
+  f_001_100_110_110_1(uniques, 2);
+  f_001_100_110_111_0(uniques, 2);
+  f_001_100_110_111_1(uniques, 2);
+  f_001_100_111_000_0(uniques, 2);
+  f_001_100_111_000_1(uniques, 2);
+  f_001_100_111_001_0(uniques, 2);
+  f_001_100_111_001_1(uniques, 2);
+  f_001_100_111_010_0(uniques, 2);
+  f_001_100_111_010_1(uniques, 2);
+  f_001_100_111_011_0(uniques, 2);
+  f_001_100_111_011_1(uniques, 2);
+  f_001_100_111_100_0(uniques, 2);
+  f_001_100_111_100_1(uniques, 2);
+  f_001_100_111_101_0(uniques, 2);
+  f_001_100_111_101_1(uniques, 2);
+  f_001_100_111_110_0(uniques, 2);
+  f_001_100_111_110_1(uniques, 2);
+  f_001_100_111_111_0(uniques, 2);
+  f_001_100_111_111_1(uniques, 2);
+  f_001_101_000_000_0(uniques, 2);
+  f_001_101_000_000_1(uniques, 2);
+  f_001_101_000_001_0(uniques, 2);
+  f_001_101_000_001_1(uniques, 2);
+  f_001_101_000_010_0(uniques, 2);
+  f_001_101_000_010_1(uniques, 2);
+  f_001_101_000_011_0(uniques, 2);
+  f_001_101_000_011_1(uniques, 2);
+  f_001_101_000_100_0(uniques, 2);
+  f_001_101_000_100_1(uniques, 2);
+  f_001_101_000_101_0(uniques, 2);
+  f_001_101_000_101_1(uniques, 2);
+  f_001_101_000_110_0(uniques, 2);
+  f_001_101_000_110_1(uniques, 2);
+  f_001_101_000_111_0(uniques, 2);
+  f_001_101_000_111_1(uniques, 2);
+  f_001_101_001_000_0(uniques, 2);
+  f_001_101_001_000_1(uniques, 2);
+  f_001_101_001_001_0(uniques, 2);
+  f_001_101_001_001_1(uniques, 2);
+  f_001_101_001_010_0(uniques, 2);
+  f_001_101_001_010_1(uniques, 2);
+  f_001_101_001_011_0(uniques, 2);
+  f_001_101_001_011_1(uniques, 2);
+  f_001_101_001_100_0(uniques, 2);
+  f_001_101_001_100_1(uniques, 2);
+  f_001_101_001_101_0(uniques, 2);
+  f_001_101_001_101_1(uniques, 2);
+  f_001_101_001_110_0(uniques, 2);
+  f_001_101_001_110_1(uniques, 2);
+  f_001_101_001_111_0(uniques, 2);
+  f_001_101_001_111_1(uniques, 2);
+  f_001_101_010_000_0(uniques, 2);
+  f_001_101_010_000_1(uniques, 2);
+  f_001_101_010_001_0(uniques, 2);
+  f_001_101_010_001_1(uniques, 2);
+  f_001_101_010_010_0(uniques, 2);
+  f_001_101_010_010_1(uniques, 2);
+  f_001_101_010_011_0(uniques, 2);
+  f_001_101_010_011_1(uniques, 2);
+  f_001_101_010_100_0(uniques, 2);
+  f_001_101_010_100_1(uniques, 2);
+  f_001_101_010_101_0(uniques, 2);
+  f_001_101_010_101_1(uniques, 2);
+  f_001_101_010_110_0(uniques, 2);
+  f_001_101_010_110_1(uniques, 2);
+  f_001_101_010_111_0(uniques, 2);
+  f_001_101_010_111_1(uniques, 2);
+  f_001_101_011_000_0(uniques, 2);
+  f_001_101_011_000_1(uniques, 2);
+  f_001_101_011_001_0(uniques, 2);
+  f_001_101_011_001_1(uniques, 2);
+  f_001_101_011_010_0(uniques, 2);
+  f_001_101_011_010_1(uniques, 2);
+  f_001_101_011_011_0(uniques, 2);
+  f_001_101_011_011_1(uniques, 2);
+  f_001_101_011_100_0(uniques, 2);
+  f_001_101_011_100_1(uniques, 2);
+  f_001_101_011_101_0(uniques, 2);
+  f_001_101_011_101_1(uniques, 2);
+  f_001_101_011_110_0(uniques, 2);
+  f_001_101_011_110_1(uniques, 2);
+  f_001_101_011_111_0(uniques, 2);
+  f_001_101_011_111_1(uniques, 2);
+  f_001_101_100_000_0(uniques, 2);
+  f_001_101_100_000_1(uniques, 2);
+  f_001_101_100_001_0(uniques, 2);
+  f_001_101_100_001_1(uniques, 2);
+  f_001_101_100_010_0(uniques, 2);
+  f_001_101_100_010_1(uniques, 2);
+  f_001_101_100_011_0(uniques, 2);
+  f_001_101_100_011_1(uniques, 2);
+  f_001_101_100_100_0(uniques, 2);
+  f_001_101_100_100_1(uniques, 2);
+  f_001_101_100_101_0(uniques, 2);
+  f_001_101_100_101_1(uniques, 2);
+  f_001_101_100_110_0(uniques, 2);
+  f_001_101_100_110_1(uniques, 2);
+  f_001_101_100_111_0(uniques, 2);
+  f_001_101_100_111_1(uniques, 2);
+  f_001_101_101_000_0(uniques, 2);
+  f_001_101_101_000_1(uniques, 2);
+  f_001_101_101_001_0(uniques, 2);
+  f_001_101_101_001_1(uniques, 2);
+  f_001_101_101_010_0(uniques, 2);
+  f_001_101_101_010_1(uniques, 2);
+  f_001_101_101_011_0(uniques, 2);
+  f_001_101_101_011_1(uniques, 2);
+  f_001_101_101_100_0(uniques, 2);
+  f_001_101_101_100_1(uniques, 2);
+  f_001_101_101_101_0(uniques, 2);
+  f_001_101_101_101_1(uniques, 2);
+  f_001_101_101_110_0(uniques, 2);
+  f_001_101_101_110_1(uniques, 2);
+  f_001_101_101_111_0(uniques, 2);
+  f_001_101_101_111_1(uniques, 2);
+  f_001_101_110_000_0(uniques, 2);
+  f_001_101_110_000_1(uniques, 2);
+  f_001_101_110_001_0(uniques, 2);
+  f_001_101_110_001_1(uniques, 2);
+  f_001_101_110_010_0(uniques, 2);
+  f_001_101_110_010_1(uniques, 2);
+  f_001_101_110_011_0(uniques, 2);
+  f_001_101_110_011_1(uniques, 2);
+  f_001_101_110_100_0(uniques, 2);
+  f_001_101_110_100_1(uniques, 2);
+  f_001_101_110_101_0(uniques, 2);
+  f_001_101_110_101_1(uniques, 2);
+  f_001_101_110_110_0(uniques, 2);
+  f_001_101_110_110_1(uniques, 2);
+  f_001_101_110_111_0(uniques, 2);
+  f_001_101_110_111_1(uniques, 2);
+  f_001_101_111_000_0(uniques, 2);
+  f_001_101_111_000_1(uniques, 2);
+  f_001_101_111_001_0(uniques, 2);
+  f_001_101_111_001_1(uniques, 2);
+  f_001_101_111_010_0(uniques, 2);
+  f_001_101_111_010_1(uniques, 2);
+  f_001_101_111_011_0(uniques, 2);
+  f_001_101_111_011_1(uniques, 2);
+  f_001_101_111_100_0(uniques, 2);
+  f_001_101_111_100_1(uniques, 2);
+  f_001_101_111_101_0(uniques, 2);
+  f_001_101_111_101_1(uniques, 2);
+  f_001_101_111_110_0(uniques, 2);
+  f_001_101_111_110_1(uniques, 2);
+  f_001_101_111_111_0(uniques, 2);
+  f_001_101_111_111_1(uniques, 2);
+  f_001_110_000_000_0(uniques, 2);
+  f_001_110_000_000_1(uniques, 2);
+  f_001_110_000_001_0(uniques, 2);
+  f_001_110_000_001_1(uniques, 2);
+  f_001_110_000_010_0(uniques, 2);
+  f_001_110_000_010_1(uniques, 2);
+  f_001_110_000_011_0(uniques, 2);
+  f_001_110_000_011_1(uniques, 2);
+  f_001_110_000_100_0(uniques, 2);
+  f_001_110_000_100_1(uniques, 2);
+  f_001_110_000_101_0(uniques, 2);
+  f_001_110_000_101_1(uniques, 2);
+  f_001_110_000_110_0(uniques, 2);
+  f_001_110_000_110_1(uniques, 2);
+  f_001_110_000_111_0(uniques, 2);
+  f_001_110_000_111_1(uniques, 2);
+  f_001_110_001_000_0(uniques, 2);
+  f_001_110_001_000_1(uniques, 2);
+  f_001_110_001_001_0(uniques, 2);
+  f_001_110_001_001_1(uniques, 2);
+  f_001_110_001_010_0(uniques, 2);
+  f_001_110_001_010_1(uniques, 2);
+  f_001_110_001_011_0(uniques, 2);
+  f_001_110_001_011_1(uniques, 2);
+  f_001_110_001_100_0(uniques, 2);
+  f_001_110_001_100_1(uniques, 2);
+  f_001_110_001_101_0(uniques, 2);
+  f_001_110_001_101_1(uniques, 2);
+  f_001_110_001_110_0(uniques, 2);
+  f_001_110_001_110_1(uniques, 2);
+  f_001_110_001_111_0(uniques, 2);
+  f_001_110_001_111_1(uniques, 2);
+  f_001_110_010_000_0(uniques, 2);
+  f_001_110_010_000_1(uniques, 2);
+  f_001_110_010_001_0(uniques, 2);
+  f_001_110_010_001_1(uniques, 2);
+  f_001_110_010_010_0(uniques, 2);
+  f_001_110_010_010_1(uniques, 2);
+  f_001_110_010_011_0(uniques, 2);
+  f_001_110_010_011_1(uniques, 2);
+  f_001_110_010_100_0(uniques, 2);
+  f_001_110_010_100_1(uniques, 2);
+  f_001_110_010_101_0(uniques, 2);
+  f_001_110_010_101_1(uniques, 2);
+  f_001_110_010_110_0(uniques, 2);
+  f_001_110_010_110_1(uniques, 2);
+  f_001_110_010_111_0(uniques, 2);
+  f_001_110_010_111_1(uniques, 2);
+  f_001_110_011_000_0(uniques, 2);
+  f_001_110_011_000_1(uniques, 2);
+  f_001_110_011_001_0(uniques, 2);
+  f_001_110_011_001_1(uniques, 2);
+  f_001_110_011_010_0(uniques, 2);
+  f_001_110_011_010_1(uniques, 2);
+  f_001_110_011_011_0(uniques, 2);
+  f_001_110_011_011_1(uniques, 2);
+  f_001_110_011_100_0(uniques, 2);
+  f_001_110_011_100_1(uniques, 2);
+  f_001_110_011_101_0(uniques, 2);
+  f_001_110_011_101_1(uniques, 2);
+  f_001_110_011_110_0(uniques, 2);
+  f_001_110_011_110_1(uniques, 2);
+  f_001_110_011_111_0(uniques, 2);
+  f_001_110_011_111_1(uniques, 2);
+  f_001_110_100_000_0(uniques, 2);
+  f_001_110_100_000_1(uniques, 2);
+  f_001_110_100_001_0(uniques, 2);
+  f_001_110_100_001_1(uniques, 2);
+  f_001_110_100_010_0(uniques, 2);
+  f_001_110_100_010_1(uniques, 2);
+  f_001_110_100_011_0(uniques, 2);
+  f_001_110_100_011_1(uniques, 2);
+  f_001_110_100_100_0(uniques, 2);
+  f_001_110_100_100_1(uniques, 2);
+  f_001_110_100_101_0(uniques, 2);
+  f_001_110_100_101_1(uniques, 2);
+  f_001_110_100_110_0(uniques, 2);
+  f_001_110_100_110_1(uniques, 2);
+  f_001_110_100_111_0(uniques, 2);
+  f_001_110_100_111_1(uniques, 2);
+  f_001_110_101_000_0(uniques, 2);
+  f_001_110_101_000_1(uniques, 2);
+  f_001_110_101_001_0(uniques, 2);
+  f_001_110_101_001_1(uniques, 2);
+  f_001_110_101_010_0(uniques, 2);
+  f_001_110_101_010_1(uniques, 2);
+  f_001_110_101_011_0(uniques, 2);
+  f_001_110_101_011_1(uniques, 2);
+  f_001_110_101_100_0(uniques, 2);
+  f_001_110_101_100_1(uniques, 2);
+  f_001_110_101_101_0(uniques, 2);
+  f_001_110_101_101_1(uniques, 2);
+  f_001_110_101_110_0(uniques, 2);
+  f_001_110_101_110_1(uniques, 2);
+  f_001_110_101_111_0(uniques, 2);
+  f_001_110_101_111_1(uniques, 2);
+  f_001_110_110_000_0(uniques, 2);
+  f_001_110_110_000_1(uniques, 2);
+  f_001_110_110_001_0(uniques, 2);
+  f_001_110_110_001_1(uniques, 2);
+  f_001_110_110_010_0(uniques, 2);
+  f_001_110_110_010_1(uniques, 2);
+  f_001_110_110_011_0(uniques, 2);
+  f_001_110_110_011_1(uniques, 2);
+  f_001_110_110_100_0(uniques, 2);
+  f_001_110_110_100_1(uniques, 2);
+  f_001_110_110_101_0(uniques, 2);
+  f_001_110_110_101_1(uniques, 2);
+  f_001_110_110_110_0(uniques, 2);
+  f_001_110_110_110_1(uniques, 2);
+  f_001_110_110_111_0(uniques, 2);
+  f_001_110_110_111_1(uniques, 2);
+  f_001_110_111_000_0(uniques, 2);
+  f_001_110_111_000_1(uniques, 2);
+  f_001_110_111_001_0(uniques, 2);
+  f_001_110_111_001_1(uniques, 2);
+  f_001_110_111_010_0(uniques, 2);
+  f_001_110_111_010_1(uniques, 2);
+  f_001_110_111_011_0(uniques, 2);
+  f_001_110_111_011_1(uniques, 2);
+  f_001_110_111_100_0(uniques, 2);
+  f_001_110_111_100_1(uniques, 2);
+  f_001_110_111_101_0(uniques, 2);
+  f_001_110_111_101_1(uniques, 2);
+  f_001_110_111_110_0(uniques, 2);
+  f_001_110_111_110_1(uniques, 2);
+  f_001_110_111_111_0(uniques, 2);
+  f_001_110_111_111_1(uniques, 2);
+  f_001_111_000_000_0(uniques, 2);
+  f_001_111_000_000_1(uniques, 2);
+  f_001_111_000_001_0(uniques, 2);
+  f_001_111_000_001_1(uniques, 2);
+  f_001_111_000_010_0(uniques, 2);
+  f_001_111_000_010_1(uniques, 2);
+  f_001_111_000_011_0(uniques, 2);
+  f_001_111_000_011_1(uniques, 2);
+  f_001_111_000_100_0(uniques, 2);
+  f_001_111_000_100_1(uniques, 2);
+  f_001_111_000_101_0(uniques, 2);
+  f_001_111_000_101_1(uniques, 2);
+  f_001_111_000_110_0(uniques, 2);
+  f_001_111_000_110_1(uniques, 2);
+  f_001_111_000_111_0(uniques, 2);
+  f_001_111_000_111_1(uniques, 2);
+  f_001_111_001_000_0(uniques, 2);
+  f_001_111_001_000_1(uniques, 2);
+  f_001_111_001_001_0(uniques, 2);
+  f_001_111_001_001_1(uniques, 2);
+  f_001_111_001_010_0(uniques, 2);
+  f_001_111_001_010_1(uniques, 2);
+  f_001_111_001_011_0(uniques, 2);
+  f_001_111_001_011_1(uniques, 2);
+  f_001_111_001_100_0(uniques, 2);
+  f_001_111_001_100_1(uniques, 2);
+  f_001_111_001_101_0(uniques, 2);
+  f_001_111_001_101_1(uniques, 2);
+  f_001_111_001_110_0(uniques, 2);
+  f_001_111_001_110_1(uniques, 2);
+  f_001_111_001_111_0(uniques, 2);
+  f_001_111_001_111_1(uniques, 2);
+  f_001_111_010_000_0(uniques, 2);
+  f_001_111_010_000_1(uniques, 2);
+  f_001_111_010_001_0(uniques, 2);
+  f_001_111_010_001_1(uniques, 2);
+  f_001_111_010_010_0(uniques, 2);
+  f_001_111_010_010_1(uniques, 2);
+  f_001_111_010_011_0(uniques, 2);
+  f_001_111_010_011_1(uniques, 2);
+  f_001_111_010_100_0(uniques, 2);
+  f_001_111_010_100_1(uniques, 2);
+  f_001_111_010_101_0(uniques, 2);
+  f_001_111_010_101_1(uniques, 2);
+  f_001_111_010_110_0(uniques, 2);
+  f_001_111_010_110_1(uniques, 2);
+  f_001_111_010_111_0(uniques, 2);
+  f_001_111_010_111_1(uniques, 2);
+  f_001_111_011_000_0(uniques, 2);
+  f_001_111_011_000_1(uniques, 2);
+  f_001_111_011_001_0(uniques, 2);
+  f_001_111_011_001_1(uniques, 2);
+  f_001_111_011_010_0(uniques, 2);
+  f_001_111_011_010_1(uniques, 2);
+  f_001_111_011_011_0(uniques, 2);
+  f_001_111_011_011_1(uniques, 2);
+  f_001_111_011_100_0(uniques, 2);
+  f_001_111_011_100_1(uniques, 2);
+  f_001_111_011_101_0(uniques, 2);
+  f_001_111_011_101_1(uniques, 2);
+  f_001_111_011_110_0(uniques, 2);
+  f_001_111_011_110_1(uniques, 2);
+  f_001_111_011_111_0(uniques, 2);
+  f_001_111_011_111_1(uniques, 2);
+  f_001_111_100_000_0(uniques, 2);
+  f_001_111_100_000_1(uniques, 2);
+  f_001_111_100_001_0(uniques, 2);
+  f_001_111_100_001_1(uniques, 2);
+  f_001_111_100_010_0(uniques, 2);
+  f_001_111_100_010_1(uniques, 2);
+  f_001_111_100_011_0(uniques, 2);
+  f_001_111_100_011_1(uniques, 2);
+  f_001_111_100_100_0(uniques, 2);
+  f_001_111_100_100_1(uniques, 2);
+  f_001_111_100_101_0(uniques, 2);
+  f_001_111_100_101_1(uniques, 2);
+  f_001_111_100_110_0(uniques, 2);
+  f_001_111_100_110_1(uniques, 2);
+  f_001_111_100_111_0(uniques, 2);
+  f_001_111_100_111_1(uniques, 2);
+  f_001_111_101_000_0(uniques, 2);
+  f_001_111_101_000_1(uniques, 2);
+  f_001_111_101_001_0(uniques, 2);
+  f_001_111_101_001_1(uniques, 2);
+  f_001_111_101_010_0(uniques, 2);
+  f_001_111_101_010_1(uniques, 2);
+  f_001_111_101_011_0(uniques, 2);
+  f_001_111_101_011_1(uniques, 2);
+  f_001_111_101_100_0(uniques, 2);
+  f_001_111_101_100_1(uniques, 2);
+  f_001_111_101_101_0(uniques, 2);
+  f_001_111_101_101_1(uniques, 2);
+  f_001_111_101_110_0(uniques, 2);
+  f_001_111_101_110_1(uniques, 2);
+  f_001_111_101_111_0(uniques, 2);
+  f_001_111_101_111_1(uniques, 2);
+  f_001_111_110_000_0(uniques, 2);
+  f_001_111_110_000_1(uniques, 2);
+  f_001_111_110_001_0(uniques, 2);
+  f_001_111_110_001_1(uniques, 2);
+  f_001_111_110_010_0(uniques, 2);
+  f_001_111_110_010_1(uniques, 2);
+  f_001_111_110_011_0(uniques, 2);
+  f_001_111_110_011_1(uniques, 2);
+  f_001_111_110_100_0(uniques, 2);
+  f_001_111_110_100_1(uniques, 2);
+  f_001_111_110_101_0(uniques, 2);
+  f_001_111_110_101_1(uniques, 2);
+  f_001_111_110_110_0(uniques, 2);
+  f_001_111_110_110_1(uniques, 2);
+  f_001_111_110_111_0(uniques, 2);
+  f_001_111_110_111_1(uniques, 2);
+  f_001_111_111_000_0(uniques, 2);
+  f_001_111_111_000_1(uniques, 2);
+  f_001_111_111_001_0(uniques, 2);
+  f_001_111_111_001_1(uniques, 2);
+  f_001_111_111_010_0(uniques, 2);
+  f_001_111_111_010_1(uniques, 2);
+  f_001_111_111_011_0(uniques, 2);
+  f_001_111_111_011_1(uniques, 2);
+  f_001_111_111_100_0(uniques, 2);
+  f_001_111_111_100_1(uniques, 2);
+  f_001_111_111_101_0(uniques, 2);
+  f_001_111_111_101_1(uniques, 2);
+  f_001_111_111_110_0(uniques, 2);
+  f_001_111_111_110_1(uniques, 2);
+  f_001_111_111_111_0(uniques, 2);
+  f_001_111_111_111_1(uniques, 2);
+  f_011_000_000_000_0(uniques, 2);
+  f_011_000_000_000_1(uniques, 2);
+  f_011_000_000_001_0(uniques, 2);
+  f_011_000_000_001_1(uniques, 2);
+  f_011_000_000_010_0(uniques, 2);
+  f_011_000_000_010_1(uniques, 2);
+  f_011_000_000_011_0(uniques, 2);
+  f_011_000_000_011_1(uniques, 2);
+  f_011_000_000_100_0(uniques, 2);
+  f_011_000_000_100_1(uniques, 2);
+  f_011_000_000_101_0(uniques, 2);
+  f_011_000_000_101_1(uniques, 2);
+  f_011_000_000_110_0(uniques, 2);
+  f_011_000_000_110_1(uniques, 2);
+  f_011_000_000_111_0(uniques, 2);
+  f_011_000_000_111_1(uniques, 2);
+  f_011_000_001_000_0(uniques, 2);
+  f_011_000_001_000_1(uniques, 2);
+  f_011_000_001_001_0(uniques, 2);
+  f_011_000_001_001_1(uniques, 2);
+  f_011_000_001_010_0(uniques, 2);
+  f_011_000_001_010_1(uniques, 2);
+  f_011_000_001_011_0(uniques, 2);
+  f_011_000_001_011_1(uniques, 2);
+  f_011_000_001_100_0(uniques, 2);
+  f_011_000_001_100_1(uniques, 2);
+  f_011_000_001_101_0(uniques, 2);
+  f_011_000_001_101_1(uniques, 2);
+  f_011_000_001_110_0(uniques, 2);
+  f_011_000_001_110_1(uniques, 2);
+  f_011_000_001_111_0(uniques, 2);
+  f_011_000_001_111_1(uniques, 2);
+  f_011_000_010_000_0(uniques, 2);
+  f_011_000_010_000_1(uniques, 2);
+  f_011_000_010_001_0(uniques, 2);
+  f_011_000_010_001_1(uniques, 2);
+  f_011_000_010_010_0(uniques, 2);
+  f_011_000_010_010_1(uniques, 2);
+  f_011_000_010_011_0(uniques, 2);
+  f_011_000_010_011_1(uniques, 2);
+  f_011_000_010_100_0(uniques, 2);
+  f_011_000_010_100_1(uniques, 2);
+  f_011_000_010_101_0(uniques, 2);
+  f_011_000_010_101_1(uniques, 2);
+  f_011_000_010_110_0(uniques, 2);
+  f_011_000_010_110_1(uniques, 2);
+  f_011_000_010_111_0(uniques, 2);
+  f_011_000_010_111_1(uniques, 2);
+  f_011_000_011_000_0(uniques, 2);
+  f_011_000_011_000_1(uniques, 2);
+  f_011_000_011_001_0(uniques, 2);
+  f_011_000_011_001_1(uniques, 2);
+  f_011_000_011_010_0(uniques, 2);
+  f_011_000_011_010_1(uniques, 2);
+  f_011_000_011_011_0(uniques, 2);
+  f_011_000_011_011_1(uniques, 2);
+  f_011_000_011_100_0(uniques, 2);
+  f_011_000_011_100_1(uniques, 2);
+  f_011_000_011_101_0(uniques, 2);
+  f_011_000_011_101_1(uniques, 2);
+  f_011_000_011_110_0(uniques, 2);
+  f_011_000_011_110_1(uniques, 2);
+  f_011_000_011_111_0(uniques, 2);
+  f_011_000_011_111_1(uniques, 2);
+  f_011_000_100_000_0(uniques, 2);
+  f_011_000_100_000_1(uniques, 2);
+  f_011_000_100_001_0(uniques, 2);
+  f_011_000_100_001_1(uniques, 2);
+  f_011_000_100_010_0(uniques, 2);
+  f_011_000_100_010_1(uniques, 2);
+  f_011_000_100_011_0(uniques, 2);
+  f_011_000_100_011_1(uniques, 2);
+  f_011_000_100_100_0(uniques, 2);
+  f_011_000_100_100_1(uniques, 2);
+  f_011_000_100_101_0(uniques, 2);
+  f_011_000_100_101_1(uniques, 2);
+  f_011_000_100_110_0(uniques, 2);
+  f_011_000_100_110_1(uniques, 2);
+  f_011_000_100_111_0(uniques, 2);
+  f_011_000_100_111_1(uniques, 2);
+  f_011_000_101_000_0(uniques, 2);
+  f_011_000_101_000_1(uniques, 2);
+  f_011_000_101_001_0(uniques, 2);
+  f_011_000_101_001_1(uniques, 2);
+  f_011_000_101_010_0(uniques, 2);
+  f_011_000_101_010_1(uniques, 2);
+  f_011_000_101_011_0(uniques, 2);
+  f_011_000_101_011_1(uniques, 2);
+  f_011_000_101_100_0(uniques, 2);
+  f_011_000_101_100_1(uniques, 2);
+  f_011_000_101_101_0(uniques, 2);
+  f_011_000_101_101_1(uniques, 2);
+  f_011_000_101_110_0(uniques, 2);
+  f_011_000_101_110_1(uniques, 2);
+  f_011_000_101_111_0(uniques, 2);
+  f_011_000_101_111_1(uniques, 2);
+  f_011_000_110_000_0(uniques, 2);
+  f_011_000_110_000_1(uniques, 2);
+  f_011_000_110_001_0(uniques, 2);
+  f_011_000_110_001_1(uniques, 2);
+  f_011_000_110_010_0(uniques, 2);
+  f_011_000_110_010_1(uniques, 2);
+  f_011_000_110_011_0(uniques, 2);
+  f_011_000_110_011_1(uniques, 2);
+  f_011_000_110_100_0(uniques, 2);
+  f_011_000_110_100_1(uniques, 2);
+  f_011_000_110_101_0(uniques, 2);
+  f_011_000_110_101_1(uniques, 2);
+  f_011_000_110_110_0(uniques, 2);
+  f_011_000_110_110_1(uniques, 2);
+  f_011_000_110_111_0(uniques, 2);
+  f_011_000_110_111_1(uniques, 2);
+  f_011_000_111_000_0(uniques, 2);
+  f_011_000_111_000_1(uniques, 2);
+  f_011_000_111_001_0(uniques, 2);
+  f_011_000_111_001_1(uniques, 2);
+  f_011_000_111_010_0(uniques, 2);
+  f_011_000_111_010_1(uniques, 2);
+  f_011_000_111_011_0(uniques, 2);
+  f_011_000_111_011_1(uniques, 2);
+  f_011_000_111_100_0(uniques, 2);
+  f_011_000_111_100_1(uniques, 2);
+  f_011_000_111_101_0(uniques, 2);
+  f_011_000_111_101_1(uniques, 2);
+  f_011_000_111_110_0(uniques, 2);
+  f_011_000_111_110_1(uniques, 2);
+  f_011_000_111_111_0(uniques, 2);
+  f_011_000_111_111_1(uniques, 2);
+  f_011_001_000_000_0(uniques, 2);
+  f_011_001_000_000_1(uniques, 2);
+  f_011_001_000_001_0(uniques, 2);
+  f_011_001_000_001_1(uniques, 2);
+  f_011_001_000_010_0(uniques, 2);
+  f_011_001_000_010_1(uniques, 2);
+  f_011_001_000_011_0(uniques, 2);
+  f_011_001_000_011_1(uniques, 2);
+  f_011_001_000_100_0(uniques, 2);
+  f_011_001_000_100_1(uniques, 2);
+  f_011_001_000_101_0(uniques, 2);
+  f_011_001_000_101_1(uniques, 2);
+  f_011_001_000_110_0(uniques, 2);
+  f_011_001_000_110_1(uniques, 2);
+  f_011_001_000_111_0(uniques, 2);
+  f_011_001_000_111_1(uniques, 2);
+  f_011_001_001_000_0(uniques, 2);
+  f_011_001_001_000_1(uniques, 2);
+  f_011_001_001_001_0(uniques, 2);
+  f_011_001_001_001_1(uniques, 2);
+  f_011_001_001_010_0(uniques, 2);
+  f_011_001_001_010_1(uniques, 2);
+  f_011_001_001_011_0(uniques, 2);
+  f_011_001_001_011_1(uniques, 2);
+  f_011_001_001_100_0(uniques, 2);
+  f_011_001_001_100_1(uniques, 2);
+  f_011_001_001_101_0(uniques, 2);
+  f_011_001_001_101_1(uniques, 2);
+  f_011_001_001_110_0(uniques, 2);
+  f_011_001_001_110_1(uniques, 2);
+  f_011_001_001_111_0(uniques, 2);
+  f_011_001_001_111_1(uniques, 2);
+  f_011_001_010_000_0(uniques, 2);
+  f_011_001_010_000_1(uniques, 2);
+  f_011_001_010_001_0(uniques, 2);
+  f_011_001_010_001_1(uniques, 2);
+  f_011_001_010_010_0(uniques, 2);
+  f_011_001_010_010_1(uniques, 2);
+  f_011_001_010_011_0(uniques, 2);
+  f_011_001_010_011_1(uniques, 2);
+  f_011_001_010_100_0(uniques, 2);
+  f_011_001_010_100_1(uniques, 2);
+  f_011_001_010_101_0(uniques, 2);
+  f_011_001_010_101_1(uniques, 2);
+  f_011_001_010_110_0(uniques, 2);
+  f_011_001_010_110_1(uniques, 2);
+  f_011_001_010_111_0(uniques, 2);
+  f_011_001_010_111_1(uniques, 2);
+  f_011_001_011_000_0(uniques, 2);
+  f_011_001_011_000_1(uniques, 2);
+  f_011_001_011_001_0(uniques, 2);
+  f_011_001_011_001_1(uniques, 2);
+  f_011_001_011_010_0(uniques, 2);
+  f_011_001_011_010_1(uniques, 2);
+  f_011_001_011_011_0(uniques, 2);
+  f_011_001_011_011_1(uniques, 2);
+  f_011_001_011_100_0(uniques, 2);
+  f_011_001_011_100_1(uniques, 2);
+  f_011_001_011_101_0(uniques, 2);
+  f_011_001_011_101_1(uniques, 2);
+  f_011_001_011_110_0(uniques, 2);
+  f_011_001_011_110_1(uniques, 2);
+  f_011_001_011_111_0(uniques, 2);
+  f_011_001_011_111_1(uniques, 2);
+  f_011_001_100_000_0(uniques, 2);
+  f_011_001_100_000_1(uniques, 2);
+  f_011_001_100_001_0(uniques, 2);
+  f_011_001_100_001_1(uniques, 2);
+  f_011_001_100_010_0(uniques, 2);
+  f_011_001_100_010_1(uniques, 2);
+  f_011_001_100_011_0(uniques, 2);
+  f_011_001_100_011_1(uniques, 2);
+  f_011_001_100_100_0(uniques, 2);
+  f_011_001_100_100_1(uniques, 2);
+  f_011_001_100_101_0(uniques, 2);
+  f_011_001_100_101_1(uniques, 2);
+  f_011_001_100_110_0(uniques, 2);
+  f_011_001_100_110_1(uniques, 2);
+  f_011_001_100_111_0(uniques, 2);
+  f_011_001_100_111_1(uniques, 2);
+  f_011_001_101_000_0(uniques, 2);
+  f_011_001_101_000_1(uniques, 2);
+  f_011_001_101_001_0(uniques, 2);
+  f_011_001_101_001_1(uniques, 2);
+  f_011_001_101_010_0(uniques, 2);
+  f_011_001_101_010_1(uniques, 2);
+  f_011_001_101_011_0(uniques, 2);
+  f_011_001_101_011_1(uniques, 2);
+  f_011_001_101_100_0(uniques, 2);
+  f_011_001_101_100_1(uniques, 2);
+  f_011_001_101_101_0(uniques, 2);
+  f_011_001_101_101_1(uniques, 2);
+  f_011_001_101_110_0(uniques, 2);
+  f_011_001_101_110_1(uniques, 2);
+  f_011_001_101_111_0(uniques, 2);
+  f_011_001_101_111_1(uniques, 2);
+  f_011_001_110_000_0(uniques, 2);
+  f_011_001_110_000_1(uniques, 2);
+  f_011_001_110_001_0(uniques, 2);
+  f_011_001_110_001_1(uniques, 2);
+  f_011_001_110_010_0(uniques, 2);
+  f_011_001_110_010_1(uniques, 2);
+  f_011_001_110_011_0(uniques, 2);
+  f_011_001_110_011_1(uniques, 2);
+  f_011_001_110_100_0(uniques, 2);
+  f_011_001_110_100_1(uniques, 2);
+  f_011_001_110_101_0(uniques, 2);
+  f_011_001_110_101_1(uniques, 2);
+  f_011_001_110_110_0(uniques, 2);
+  f_011_001_110_110_1(uniques, 2);
+  f_011_001_110_111_0(uniques, 2);
+  f_011_001_110_111_1(uniques, 2);
+  f_011_001_111_000_0(uniques, 2);
+  f_011_001_111_000_1(uniques, 2);
+  f_011_001_111_001_0(uniques, 2);
+  f_011_001_111_001_1(uniques, 2);
+  f_011_001_111_010_0(uniques, 2);
+  f_011_001_111_010_1(uniques, 2);
+  f_011_001_111_011_0(uniques, 2);
+  f_011_001_111_011_1(uniques, 2);
+  f_011_001_111_100_0(uniques, 2);
+  f_011_001_111_100_1(uniques, 2);
+  f_011_001_111_101_0(uniques, 2);
+  f_011_001_111_101_1(uniques, 2);
+  f_011_001_111_110_0(uniques, 2);
+  f_011_001_111_110_1(uniques, 2);
+  f_011_001_111_111_0(uniques, 2);
+  f_011_001_111_111_1(uniques, 2);
+  f_011_010_000_000_0(uniques, 2);
+  f_011_010_000_000_1(uniques, 2);
+  f_011_010_000_001_0(uniques, 2);
+  f_011_010_000_001_1(uniques, 2);
+  f_011_010_000_010_0(uniques, 2);
+  f_011_010_000_010_1(uniques, 2);
+  f_011_010_000_011_0(uniques, 2);
+  f_011_010_000_011_1(uniques, 2);
+  f_011_010_000_100_0(uniques, 2);
+  f_011_010_000_100_1(uniques, 2);
+  f_011_010_000_101_0(uniques, 2);
+  f_011_010_000_101_1(uniques, 2);
+  f_011_010_000_110_0(uniques, 2);
+  f_011_010_000_110_1(uniques, 2);
+  f_011_010_000_111_0(uniques, 2);
+  f_011_010_000_111_1(uniques, 2);
+  f_011_010_001_000_0(uniques, 2);
+  f_011_010_001_000_1(uniques, 2);
+  f_011_010_001_001_0(uniques, 2);
+  f_011_010_001_001_1(uniques, 2);
+  f_011_010_001_010_0(uniques, 2);
+  f_011_010_001_010_1(uniques, 2);
+  f_011_010_001_011_0(uniques, 2);
+  f_011_010_001_011_1(uniques, 2);
+  f_011_010_001_100_0(uniques, 2);
+  f_011_010_001_100_1(uniques, 2);
+  f_011_010_001_101_0(uniques, 2);
+  f_011_010_001_101_1(uniques, 2);
+  f_011_010_001_110_0(uniques, 2);
+  f_011_010_001_110_1(uniques, 2);
+  f_011_010_001_111_0(uniques, 2);
+  f_011_010_001_111_1(uniques, 2);
+  f_011_010_010_000_0(uniques, 2);
+  f_011_010_010_000_1(uniques, 2);
+  f_011_010_010_001_0(uniques, 2);
+  f_011_010_010_001_1(uniques, 2);
+  f_011_010_010_010_0(uniques, 2);
+  f_011_010_010_010_1(uniques, 2);
+  f_011_010_010_011_0(uniques, 2);
+  f_011_010_010_011_1(uniques, 2);
+  f_011_010_010_100_0(uniques, 2);
+  f_011_010_010_100_1(uniques, 2);
+  f_011_010_010_101_0(uniques, 2);
+  f_011_010_010_101_1(uniques, 2);
+  f_011_010_010_110_0(uniques, 2);
+  f_011_010_010_110_1(uniques, 2);
+  f_011_010_010_111_0(uniques, 2);
+  f_011_010_010_111_1(uniques, 2);
+  f_011_010_011_000_0(uniques, 2);
+  f_011_010_011_000_1(uniques, 2);
+  f_011_010_011_001_0(uniques, 2);
+  f_011_010_011_001_1(uniques, 2);
+  f_011_010_011_010_0(uniques, 2);
+  f_011_010_011_010_1(uniques, 2);
+  f_011_010_011_011_0(uniques, 2);
+  f_011_010_011_011_1(uniques, 2);
+  f_011_010_011_100_0(uniques, 2);
+  f_011_010_011_100_1(uniques, 2);
+  f_011_010_011_101_0(uniques, 2);
+  f_011_010_011_101_1(uniques, 2);
+  f_011_010_011_110_0(uniques, 2);
+  f_011_010_011_110_1(uniques, 2);
+  f_011_010_011_111_0(uniques, 2);
+  f_011_010_011_111_1(uniques, 2);
+  f_011_010_100_000_0(uniques, 2);
+  f_011_010_100_000_1(uniques, 2);
+  f_011_010_100_001_0(uniques, 2);
+  f_011_010_100_001_1(uniques, 2);
+  f_011_010_100_010_0(uniques, 2);
+  f_011_010_100_010_1(uniques, 2);
+  f_011_010_100_011_0(uniques, 2);
+  f_011_010_100_011_1(uniques, 2);
+  f_011_010_100_100_0(uniques, 2);
+  f_011_010_100_100_1(uniques, 2);
+  f_011_010_100_101_0(uniques, 2);
+  f_011_010_100_101_1(uniques, 2);
+  f_011_010_100_110_0(uniques, 2);
+  f_011_010_100_110_1(uniques, 2);
+  f_011_010_100_111_0(uniques, 2);
+  f_011_010_100_111_1(uniques, 2);
+  f_011_010_101_000_0(uniques, 2);
+  f_011_010_101_000_1(uniques, 2);
+  f_011_010_101_001_0(uniques, 2);
+  f_011_010_101_001_1(uniques, 2);
+  f_011_010_101_010_0(uniques, 2);
+  f_011_010_101_010_1(uniques, 2);
+  f_011_010_101_011_0(uniques, 2);
+  f_011_010_101_011_1(uniques, 2);
+  f_011_010_101_100_0(uniques, 2);
+  f_011_010_101_100_1(uniques, 2);
+  f_011_010_101_101_0(uniques, 2);
+  f_011_010_101_101_1(uniques, 2);
+  f_011_010_101_110_0(uniques, 2);
+  f_011_010_101_110_1(uniques, 2);
+  f_011_010_101_111_0(uniques, 2);
+  f_011_010_101_111_1(uniques, 2);
+  f_011_010_110_000_0(uniques, 2);
+  f_011_010_110_000_1(uniques, 2);
+  f_011_010_110_001_0(uniques, 2);
+  f_011_010_110_001_1(uniques, 2);
+  f_011_010_110_010_0(uniques, 2);
+  f_011_010_110_010_1(uniques, 2);
+  f_011_010_110_011_0(uniques, 2);
+  f_011_010_110_011_1(uniques, 2);
+  f_011_010_110_100_0(uniques, 2);
+  f_011_010_110_100_1(uniques, 2);
+  f_011_010_110_101_0(uniques, 2);
+  f_011_010_110_101_1(uniques, 2);
+  f_011_010_110_110_0(uniques, 2);
+  f_011_010_110_110_1(uniques, 2);
+  f_011_010_110_111_0(uniques, 2);
+  f_011_010_110_111_1(uniques, 2);
+  f_011_010_111_000_0(uniques, 2);
+  f_011_010_111_000_1(uniques, 2);
+  f_011_010_111_001_0(uniques, 2);
+  f_011_010_111_001_1(uniques, 2);
+  f_011_010_111_010_0(uniques, 2);
+  f_011_010_111_010_1(uniques, 2);
+  f_011_010_111_011_0(uniques, 2);
+  f_011_010_111_011_1(uniques, 2);
+  f_011_010_111_100_0(uniques, 2);
+  f_011_010_111_100_1(uniques, 2);
+  f_011_010_111_101_0(uniques, 2);
+  f_011_010_111_101_1(uniques, 2);
+  f_011_010_111_110_0(uniques, 2);
+  f_011_010_111_110_1(uniques, 2);
+  f_011_010_111_111_0(uniques, 2);
+  f_011_010_111_111_1(uniques, 2);
+  f_011_011_000_000_0(uniques, 2);
+  f_011_011_000_000_1(uniques, 2);
+  f_011_011_000_001_0(uniques, 2);
+  f_011_011_000_001_1(uniques, 2);
+  f_011_011_000_010_0(uniques, 2);
+  f_011_011_000_010_1(uniques, 2);
+  f_011_011_000_011_0(uniques, 2);
+  f_011_011_000_011_1(uniques, 2);
+  f_011_011_000_100_0(uniques, 2);
+  f_011_011_000_100_1(uniques, 2);
+  f_011_011_000_101_0(uniques, 2);
+  f_011_011_000_101_1(uniques, 2);
+  f_011_011_000_110_0(uniques, 2);
+  f_011_011_000_110_1(uniques, 2);
+  f_011_011_000_111_0(uniques, 2);
+  f_011_011_000_111_1(uniques, 2);
+  f_011_011_001_000_0(uniques, 2);
+  f_011_011_001_000_1(uniques, 2);
+  f_011_011_001_001_0(uniques, 2);
+  f_011_011_001_001_1(uniques, 2);
+  f_011_011_001_010_0(uniques, 2);
+  f_011_011_001_010_1(uniques, 2);
+  f_011_011_001_011_0(uniques, 2);
+  f_011_011_001_011_1(uniques, 2);
+  f_011_011_001_100_0(uniques, 2);
+  f_011_011_001_100_1(uniques, 2);
+  f_011_011_001_101_0(uniques, 2);
+  f_011_011_001_101_1(uniques, 2);
+  f_011_011_001_110_0(uniques, 2);
+  f_011_011_001_110_1(uniques, 2);
+  f_011_011_001_111_0(uniques, 2);
+  f_011_011_001_111_1(uniques, 2);
+  f_011_011_010_000_0(uniques, 2);
+  f_011_011_010_000_1(uniques, 2);
+  f_011_011_010_001_0(uniques, 2);
+  f_011_011_010_001_1(uniques, 2);
+  f_011_011_010_010_0(uniques, 2);
+  f_011_011_010_010_1(uniques, 2);
+  f_011_011_010_011_0(uniques, 2);
+  f_011_011_010_011_1(uniques, 2);
+  f_011_011_010_100_0(uniques, 2);
+  f_011_011_010_100_1(uniques, 2);
+  f_011_011_010_101_0(uniques, 2);
+  f_011_011_010_101_1(uniques, 2);
+  f_011_011_010_110_0(uniques, 2);
+  f_011_011_010_110_1(uniques, 2);
+  f_011_011_010_111_0(uniques, 2);
+  f_011_011_010_111_1(uniques, 2);
+  f_011_011_011_000_0(uniques, 2);
+  f_011_011_011_000_1(uniques, 2);
+  f_011_011_011_001_0(uniques, 2);
+  f_011_011_011_001_1(uniques, 2);
+  f_011_011_011_010_0(uniques, 2);
+  f_011_011_011_010_1(uniques, 2);
+  f_011_011_011_011_0(uniques, 2);
+  f_011_011_011_011_1(uniques, 2);
+  f_011_011_011_100_0(uniques, 2);
+  f_011_011_011_100_1(uniques, 2);
+  f_011_011_011_101_0(uniques, 2);
+  f_011_011_011_101_1(uniques, 2);
+  f_011_011_011_110_0(uniques, 2);
+  f_011_011_011_110_1(uniques, 2);
+  f_011_011_011_111_0(uniques, 2);
+  f_011_011_011_111_1(uniques, 2);
+  f_011_011_100_000_0(uniques, 2);
+  f_011_011_100_000_1(uniques, 2);
+  f_011_011_100_001_0(uniques, 2);
+  f_011_011_100_001_1(uniques, 2);
+  f_011_011_100_010_0(uniques, 2);
+  f_011_011_100_010_1(uniques, 2);
+  f_011_011_100_011_0(uniques, 2);
+  f_011_011_100_011_1(uniques, 2);
+  f_011_011_100_100_0(uniques, 2);
+  f_011_011_100_100_1(uniques, 2);
+  f_011_011_100_101_0(uniques, 2);
+  f_011_011_100_101_1(uniques, 2);
+  f_011_011_100_110_0(uniques, 2);
+  f_011_011_100_110_1(uniques, 2);
+  f_011_011_100_111_0(uniques, 2);
+  f_011_011_100_111_1(uniques, 2);
+  f_011_011_101_000_0(uniques, 2);
+  f_011_011_101_000_1(uniques, 2);
+  f_011_011_101_001_0(uniques, 2);
+  f_011_011_101_001_1(uniques, 2);
+  f_011_011_101_010_0(uniques, 2);
+  f_011_011_101_010_1(uniques, 2);
+  f_011_011_101_011_0(uniques, 2);
+  f_011_011_101_011_1(uniques, 2);
+  f_011_011_101_100_0(uniques, 2);
+  f_011_011_101_100_1(uniques, 2);
+  f_011_011_101_101_0(uniques, 2);
+  f_011_011_101_101_1(uniques, 2);
+  f_011_011_101_110_0(uniques, 2);
+  f_011_011_101_110_1(uniques, 2);
+  f_011_011_101_111_0(uniques, 2);
+  f_011_011_101_111_1(uniques, 2);
+  f_011_011_110_000_0(uniques, 2);
+  f_011_011_110_000_1(uniques, 2);
+  f_011_011_110_001_0(uniques, 2);
+  f_011_011_110_001_1(uniques, 2);
+  f_011_011_110_010_0(uniques, 2);
+  f_011_011_110_010_1(uniques, 2);
+  f_011_011_110_011_0(uniques, 2);
+  f_011_011_110_011_1(uniques, 2);
+  f_011_011_110_100_0(uniques, 2);
+  f_011_011_110_100_1(uniques, 2);
+  f_011_011_110_101_0(uniques, 2);
+  f_011_011_110_101_1(uniques, 2);
+  f_011_011_110_110_0(uniques, 2);
+  f_011_011_110_110_1(uniques, 2);
+  f_011_011_110_111_0(uniques, 2);
+  f_011_011_110_111_1(uniques, 2);
+  f_011_011_111_000_0(uniques, 2);
+  f_011_011_111_000_1(uniques, 2);
+  f_011_011_111_001_0(uniques, 2);
+  f_011_011_111_001_1(uniques, 2);
+  f_011_011_111_010_0(uniques, 2);
+  f_011_011_111_010_1(uniques, 2);
+  f_011_011_111_011_0(uniques, 2);
+  f_011_011_111_011_1(uniques, 2);
+  f_011_011_111_100_0(uniques, 2);
+  f_011_011_111_100_1(uniques, 2);
+  f_011_011_111_101_0(uniques, 2);
+  f_011_011_111_101_1(uniques, 2);
+  f_011_011_111_110_0(uniques, 2);
+  f_011_011_111_110_1(uniques, 2);
+  f_011_011_111_111_0(uniques, 2);
+  f_011_011_111_111_1(uniques, 2);
+  f_011_100_000_000_0(uniques, 2);
+  f_011_100_000_000_1(uniques, 2);
+  f_011_100_000_001_0(uniques, 2);
+  f_011_100_000_001_1(uniques, 2);
+  f_011_100_000_010_0(uniques, 2);
+  f_011_100_000_010_1(uniques, 2);
+  f_011_100_000_011_0(uniques, 2);
+  f_011_100_000_011_1(uniques, 2);
+  f_011_100_000_100_0(uniques, 2);
+  f_011_100_000_100_1(uniques, 2);
+  f_011_100_000_101_0(uniques, 2);
+  f_011_100_000_101_1(uniques, 2);
+  f_011_100_000_110_0(uniques, 2);
+  f_011_100_000_110_1(uniques, 2);
+  f_011_100_000_111_0(uniques, 2);
+  f_011_100_000_111_1(uniques, 2);
+  f_011_100_001_000_0(uniques, 2);
+  f_011_100_001_000_1(uniques, 2);
+  f_011_100_001_001_0(uniques, 2);
+  f_011_100_001_001_1(uniques, 2);
+  f_011_100_001_010_0(uniques, 2);
+  f_011_100_001_010_1(uniques, 2);
+  f_011_100_001_011_0(uniques, 2);
+  f_011_100_001_011_1(uniques, 2);
+  f_011_100_001_100_0(uniques, 2);
+  f_011_100_001_100_1(uniques, 2);
+  f_011_100_001_101_0(uniques, 2);
+  f_011_100_001_101_1(uniques, 2);
+  f_011_100_001_110_0(uniques, 2);
+  f_011_100_001_110_1(uniques, 2);
+  f_011_100_001_111_0(uniques, 2);
+  f_011_100_001_111_1(uniques, 2);
+  f_011_100_010_000_0(uniques, 2);
+  f_011_100_010_000_1(uniques, 2);
+  f_011_100_010_001_0(uniques, 2);
+  f_011_100_010_001_1(uniques, 2);
+  f_011_100_010_010_0(uniques, 2);
+  f_011_100_010_010_1(uniques, 2);
+  f_011_100_010_011_0(uniques, 2);
+  f_011_100_010_011_1(uniques, 2);
+  f_011_100_010_100_0(uniques, 2);
+  f_011_100_010_100_1(uniques, 2);
+  f_011_100_010_101_0(uniques, 2);
+  f_011_100_010_101_1(uniques, 2);
+  f_011_100_010_110_0(uniques, 2);
+  f_011_100_010_110_1(uniques, 2);
+  f_011_100_010_111_0(uniques, 2);
+  f_011_100_010_111_1(uniques, 2);
+  f_011_100_011_000_0(uniques, 2);
+  f_011_100_011_000_1(uniques, 2);
+  f_011_100_011_001_0(uniques, 2);
+  f_011_100_011_001_1(uniques, 2);
+  f_011_100_011_010_0(uniques, 2);
+  f_011_100_011_010_1(uniques, 2);
+  f_011_100_011_011_0(uniques, 2);
+  f_011_100_011_011_1(uniques, 2);
+  f_011_100_011_100_0(uniques, 2);
+  f_011_100_011_100_1(uniques, 2);
+  f_011_100_011_101_0(uniques, 2);
+  f_011_100_011_101_1(uniques, 2);
+  f_011_100_011_110_0(uniques, 2);
+  f_011_100_011_110_1(uniques, 2);
+  f_011_100_011_111_0(uniques, 2);
+  f_011_100_011_111_1(uniques, 2);
+  f_011_100_100_000_0(uniques, 2);
+  f_011_100_100_000_1(uniques, 2);
+  f_011_100_100_001_0(uniques, 2);
+  f_011_100_100_001_1(uniques, 2);
+  f_011_100_100_010_0(uniques, 2);
+  f_011_100_100_010_1(uniques, 2);
+  f_011_100_100_011_0(uniques, 2);
+  f_011_100_100_011_1(uniques, 2);
+  f_011_100_100_100_0(uniques, 2);
+  f_011_100_100_100_1(uniques, 2);
+  f_011_100_100_101_0(uniques, 2);
+  f_011_100_100_101_1(uniques, 2);
+  f_011_100_100_110_0(uniques, 2);
+  f_011_100_100_110_1(uniques, 2);
+  f_011_100_100_111_0(uniques, 2);
+  f_011_100_100_111_1(uniques, 2);
+  f_011_100_101_000_0(uniques, 2);
+  f_011_100_101_000_1(uniques, 2);
+  f_011_100_101_001_0(uniques, 2);
+  f_011_100_101_001_1(uniques, 2);
+  f_011_100_101_010_0(uniques, 2);
+  f_011_100_101_010_1(uniques, 2);
+  f_011_100_101_011_0(uniques, 2);
+  f_011_100_101_011_1(uniques, 2);
+  f_011_100_101_100_0(uniques, 2);
+  f_011_100_101_100_1(uniques, 2);
+  f_011_100_101_101_0(uniques, 2);
+  f_011_100_101_101_1(uniques, 2);
+  f_011_100_101_110_0(uniques, 2);
+  f_011_100_101_110_1(uniques, 2);
+  f_011_100_101_111_0(uniques, 2);
+  f_011_100_101_111_1(uniques, 2);
+  f_011_100_110_000_0(uniques, 2);
+  f_011_100_110_000_1(uniques, 2);
+  f_011_100_110_001_0(uniques, 2);
+  f_011_100_110_001_1(uniques, 2);
+  f_011_100_110_010_0(uniques, 2);
+  f_011_100_110_010_1(uniques, 2);
+  f_011_100_110_011_0(uniques, 2);
+  f_011_100_110_011_1(uniques, 2);
+  f_011_100_110_100_0(uniques, 2);
+  f_011_100_110_100_1(uniques, 2);
+  f_011_100_110_101_0(uniques, 2);
+  f_011_100_110_101_1(uniques, 2);
+  f_011_100_110_110_0(uniques, 2);
+  f_011_100_110_110_1(uniques, 2);
+  f_011_100_110_111_0(uniques, 2);
+  f_011_100_110_111_1(uniques, 2);
+  f_011_100_111_000_0(uniques, 2);
+  f_011_100_111_000_1(uniques, 2);
+  f_011_100_111_001_0(uniques, 2);
+  f_011_100_111_001_1(uniques, 2);
+  f_011_100_111_010_0(uniques, 2);
+  f_011_100_111_010_1(uniques, 2);
+  f_011_100_111_011_0(uniques, 2);
+  f_011_100_111_011_1(uniques, 2);
+  f_011_100_111_100_0(uniques, 2);
+  f_011_100_111_100_1(uniques, 2);
+  f_011_100_111_101_0(uniques, 2);
+  f_011_100_111_101_1(uniques, 2);
+  f_011_100_111_110_0(uniques, 2);
+  f_011_100_111_110_1(uniques, 2);
+  f_011_100_111_111_0(uniques, 2);
+  f_011_100_111_111_1(uniques, 2);
+  f_011_101_000_000_0(uniques, 2);
+  f_011_101_000_000_1(uniques, 2);
+  f_011_101_000_001_0(uniques, 2);
+  f_011_101_000_001_1(uniques, 2);
+  f_011_101_000_010_0(uniques, 2);
+  f_011_101_000_010_1(uniques, 2);
+  f_011_101_000_011_0(uniques, 2);
+  f_011_101_000_011_1(uniques, 2);
+  f_011_101_000_100_0(uniques, 2);
+  f_011_101_000_100_1(uniques, 2);
+  f_011_101_000_101_0(uniques, 2);
+  f_011_101_000_101_1(uniques, 2);
+  f_011_101_000_110_0(uniques, 2);
+  f_011_101_000_110_1(uniques, 2);
+  f_011_101_000_111_0(uniques, 2);
+  f_011_101_000_111_1(uniques, 2);
+  f_011_101_001_000_0(uniques, 2);
+  f_011_101_001_000_1(uniques, 2);
+  f_011_101_001_001_0(uniques, 2);
+  f_011_101_001_001_1(uniques, 2);
+  f_011_101_001_010_0(uniques, 2);
+  f_011_101_001_010_1(uniques, 2);
+  f_011_101_001_011_0(uniques, 2);
+  f_011_101_001_011_1(uniques, 2);
+  f_011_101_001_100_0(uniques, 2);
+  f_011_101_001_100_1(uniques, 2);
+  f_011_101_001_101_0(uniques, 2);
+  f_011_101_001_101_1(uniques, 2);
+  f_011_101_001_110_0(uniques, 2);
+  f_011_101_001_110_1(uniques, 2);
+  f_011_101_001_111_0(uniques, 2);
+  f_011_101_001_111_1(uniques, 2);
+  f_011_101_010_000_0(uniques, 2);
+  f_011_101_010_000_1(uniques, 2);
+  f_011_101_010_001_0(uniques, 2);
+  f_011_101_010_001_1(uniques, 2);
+  f_011_101_010_010_0(uniques, 2);
+  f_011_101_010_010_1(uniques, 2);
+  f_011_101_010_011_0(uniques, 2);
+  f_011_101_010_011_1(uniques, 2);
+  f_011_101_010_100_0(uniques, 2);
+  f_011_101_010_100_1(uniques, 2);
+  f_011_101_010_101_0(uniques, 2);
+  f_011_101_010_101_1(uniques, 2);
+  f_011_101_010_110_0(uniques, 2);
+  f_011_101_010_110_1(uniques, 2);
+  f_011_101_010_111_0(uniques, 2);
+  f_011_101_010_111_1(uniques, 2);
+  f_011_101_011_000_0(uniques, 2);
+  f_011_101_011_000_1(uniques, 2);
+  f_011_101_011_001_0(uniques, 2);
+  f_011_101_011_001_1(uniques, 2);
+  f_011_101_011_010_0(uniques, 2);
+  f_011_101_011_010_1(uniques, 2);
+  f_011_101_011_011_0(uniques, 2);
+  f_011_101_011_011_1(uniques, 2);
+  f_011_101_011_100_0(uniques, 2);
+  f_011_101_011_100_1(uniques, 2);
+  f_011_101_011_101_0(uniques, 2);
+  f_011_101_011_101_1(uniques, 2);
+  f_011_101_011_110_0(uniques, 2);
+  f_011_101_011_110_1(uniques, 2);
+  f_011_101_011_111_0(uniques, 2);
+  f_011_101_011_111_1(uniques, 2);
+  f_011_101_100_000_0(uniques, 2);
+  f_011_101_100_000_1(uniques, 2);
+  f_011_101_100_001_0(uniques, 2);
+  f_011_101_100_001_1(uniques, 2);
+  f_011_101_100_010_0(uniques, 2);
+  f_011_101_100_010_1(uniques, 2);
+  f_011_101_100_011_0(uniques, 2);
+  f_011_101_100_011_1(uniques, 2);
+  f_011_101_100_100_0(uniques, 2);
+  f_011_101_100_100_1(uniques, 2);
+  f_011_101_100_101_0(uniques, 2);
+  f_011_101_100_101_1(uniques, 2);
+  f_011_101_100_110_0(uniques, 2);
+  f_011_101_100_110_1(uniques, 2);
+  f_011_101_100_111_0(uniques, 2);
+  f_011_101_100_111_1(uniques, 2);
+  f_011_101_101_000_0(uniques, 2);
+  f_011_101_101_000_1(uniques, 2);
+  f_011_101_101_001_0(uniques, 2);
+  f_011_101_101_001_1(uniques, 2);
+  f_011_101_101_010_0(uniques, 2);
+  f_011_101_101_010_1(uniques, 2);
+  f_011_101_101_011_0(uniques, 2);
+  f_011_101_101_011_1(uniques, 2);
+  f_011_101_101_100_0(uniques, 2);
+  f_011_101_101_100_1(uniques, 2);
+  f_011_101_101_101_0(uniques, 2);
+  f_011_101_101_101_1(uniques, 2);
+  f_011_101_101_110_0(uniques, 2);
+  f_011_101_101_110_1(uniques, 2);
+  f_011_101_101_111_0(uniques, 2);
+  f_011_101_101_111_1(uniques, 2);
+  f_011_101_110_000_0(uniques, 2);
+  f_011_101_110_000_1(uniques, 2);
+  f_011_101_110_001_0(uniques, 2);
+  f_011_101_110_001_1(uniques, 2);
+  f_011_101_110_010_0(uniques, 2);
+  f_011_101_110_010_1(uniques, 2);
+  f_011_101_110_011_0(uniques, 2);
+  f_011_101_110_011_1(uniques, 2);
+  f_011_101_110_100_0(uniques, 2);
+  f_011_101_110_100_1(uniques, 2);
+  f_011_101_110_101_0(uniques, 2);
+  f_011_101_110_101_1(uniques, 2);
+  f_011_101_110_110_0(uniques, 2);
+  f_011_101_110_110_1(uniques, 2);
+  f_011_101_110_111_0(uniques, 2);
+  f_011_101_110_111_1(uniques, 2);
+  f_011_101_111_000_0(uniques, 2);
+  f_011_101_111_000_1(uniques, 2);
+  f_011_101_111_001_0(uniques, 2);
+  f_011_101_111_001_1(uniques, 2);
+  f_011_101_111_010_0(uniques, 2);
+  f_011_101_111_010_1(uniques, 2);
+  f_011_101_111_011_0(uniques, 2);
+  f_011_101_111_011_1(uniques, 2);
+  f_011_101_111_100_0(uniques, 2);
+  f_011_101_111_100_1(uniques, 2);
+  f_011_101_111_101_0(uniques, 2);
+  f_011_101_111_101_1(uniques, 2);
+  f_011_101_111_110_0(uniques, 2);
+  f_011_101_111_110_1(uniques, 2);
+  f_011_101_111_111_0(uniques, 2);
+  f_011_101_111_111_1(uniques, 2);
+  f_011_110_000_000_0(uniques, 2);
+  f_011_110_000_000_1(uniques, 2);
+  f_011_110_000_001_0(uniques, 2);
+  f_011_110_000_001_1(uniques, 2);
+  f_011_110_000_010_0(uniques, 2);
+  f_011_110_000_010_1(uniques, 2);
+  f_011_110_000_011_0(uniques, 2);
+  f_011_110_000_011_1(uniques, 2);
+  f_011_110_000_100_0(uniques, 2);
+  f_011_110_000_100_1(uniques, 2);
+  f_011_110_000_101_0(uniques, 2);
+  f_011_110_000_101_1(uniques, 2);
+  f_011_110_000_110_0(uniques, 2);
+  f_011_110_000_110_1(uniques, 2);
+  f_011_110_000_111_0(uniques, 2);
+  f_011_110_000_111_1(uniques, 2);
+  f_011_110_001_000_0(uniques, 2);
+  f_011_110_001_000_1(uniques, 2);
+  f_011_110_001_001_0(uniques, 2);
+  f_011_110_001_001_1(uniques, 2);
+  f_011_110_001_010_0(uniques, 2);
+  f_011_110_001_010_1(uniques, 2);
+  f_011_110_001_011_0(uniques, 2);
+  f_011_110_001_011_1(uniques, 2);
+  f_011_110_001_100_0(uniques, 2);
+  f_011_110_001_100_1(uniques, 2);
+  f_011_110_001_101_0(uniques, 2);
+  f_011_110_001_101_1(uniques, 2);
+  f_011_110_001_110_0(uniques, 2);
+  f_011_110_001_110_1(uniques, 2);
+  f_011_110_001_111_0(uniques, 2);
+  f_011_110_001_111_1(uniques, 2);
+  f_011_110_010_000_0(uniques, 2);
+  f_011_110_010_000_1(uniques, 2);
+  f_011_110_010_001_0(uniques, 2);
+  f_011_110_010_001_1(uniques, 2);
+  f_011_110_010_010_0(uniques, 2);
+  f_011_110_010_010_1(uniques, 2);
+  f_011_110_010_011_0(uniques, 2);
+  f_011_110_010_011_1(uniques, 2);
+  f_011_110_010_100_0(uniques, 2);
+  f_011_110_010_100_1(uniques, 2);
+  f_011_110_010_101_0(uniques, 2);
+  f_011_110_010_101_1(uniques, 2);
+  f_011_110_010_110_0(uniques, 2);
+  f_011_110_010_110_1(uniques, 2);
+  f_011_110_010_111_0(uniques, 2);
+  f_011_110_010_111_1(uniques, 2);
+  f_011_110_011_000_0(uniques, 2);
+  f_011_110_011_000_1(uniques, 2);
+  f_011_110_011_001_0(uniques, 2);
+  f_011_110_011_001_1(uniques, 2);
+  f_011_110_011_010_0(uniques, 2);
+  f_011_110_011_010_1(uniques, 2);
+  f_011_110_011_011_0(uniques, 2);
+  f_011_110_011_011_1(uniques, 2);
+  f_011_110_011_100_0(uniques, 2);
+  f_011_110_011_100_1(uniques, 2);
+  f_011_110_011_101_0(uniques, 2);
+  f_011_110_011_101_1(uniques, 2);
+  f_011_110_011_110_0(uniques, 2);
+  f_011_110_011_110_1(uniques, 2);
+  f_011_110_011_111_0(uniques, 2);
+  f_011_110_011_111_1(uniques, 2);
+  f_011_110_100_000_0(uniques, 2);
+  f_011_110_100_000_1(uniques, 2);
+  f_011_110_100_001_0(uniques, 2);
+  f_011_110_100_001_1(uniques, 2);
+  f_011_110_100_010_0(uniques, 2);
+  f_011_110_100_010_1(uniques, 2);
+  f_011_110_100_011_0(uniques, 2);
+  f_011_110_100_011_1(uniques, 2);
+  f_011_110_100_100_0(uniques, 2);
+  f_011_110_100_100_1(uniques, 2);
+  f_011_110_100_101_0(uniques, 2);
+  f_011_110_100_101_1(uniques, 2);
+  f_011_110_100_110_0(uniques, 2);
+  f_011_110_100_110_1(uniques, 2);
+  f_011_110_100_111_0(uniques, 2);
+  f_011_110_100_111_1(uniques, 2);
+  f_011_110_101_000_0(uniques, 2);
+  f_011_110_101_000_1(uniques, 2);
+  f_011_110_101_001_0(uniques, 2);
+  f_011_110_101_001_1(uniques, 2);
+  f_011_110_101_010_0(uniques, 2);
+  f_011_110_101_010_1(uniques, 2);
+  f_011_110_101_011_0(uniques, 2);
+  f_011_110_101_011_1(uniques, 2);
+  f_011_110_101_100_0(uniques, 2);
+  f_011_110_101_100_1(uniques, 2);
+  f_011_110_101_101_0(uniques, 2);
+  f_011_110_101_101_1(uniques, 2);
+  f_011_110_101_110_0(uniques, 2);
+  f_011_110_101_110_1(uniques, 2);
+  f_011_110_101_111_0(uniques, 2);
+  f_011_110_101_111_1(uniques, 2);
+  f_011_110_110_000_0(uniques, 2);
+  f_011_110_110_000_1(uniques, 2);
+  f_011_110_110_001_0(uniques, 2);
+  f_011_110_110_001_1(uniques, 2);
+  f_011_110_110_010_0(uniques, 2);
+  f_011_110_110_010_1(uniques, 2);
+  f_011_110_110_011_0(uniques, 2);
+  f_011_110_110_011_1(uniques, 2);
+  f_011_110_110_100_0(uniques, 2);
+  f_011_110_110_100_1(uniques, 2);
+  f_011_110_110_101_0(uniques, 2);
+  f_011_110_110_101_1(uniques, 2);
+  f_011_110_110_110_0(uniques, 2);
+  f_011_110_110_110_1(uniques, 2);
+  f_011_110_110_111_0(uniques, 2);
+  f_011_110_110_111_1(uniques, 2);
+  f_011_110_111_000_0(uniques, 2);
+  f_011_110_111_000_1(uniques, 2);
+  f_011_110_111_001_0(uniques, 2);
+  f_011_110_111_001_1(uniques, 2);
+  f_011_110_111_010_0(uniques, 2);
+  f_011_110_111_010_1(uniques, 2);
+  f_011_110_111_011_0(uniques, 2);
+  f_011_110_111_011_1(uniques, 2);
+  f_011_110_111_100_0(uniques, 2);
+  f_011_110_111_100_1(uniques, 2);
+  f_011_110_111_101_0(uniques, 2);
+  f_011_110_111_101_1(uniques, 2);
+  f_011_110_111_110_0(uniques, 2);
+  f_011_110_111_110_1(uniques, 2);
+  f_011_110_111_111_0(uniques, 2);
+  f_011_110_111_111_1(uniques, 2);
+  f_011_111_000_000_0(uniques, 2);
+  f_011_111_000_000_1(uniques, 2);
+  f_011_111_000_001_0(uniques, 2);
+  f_011_111_000_001_1(uniques, 2);
+  f_011_111_000_010_0(uniques, 2);
+  f_011_111_000_010_1(uniques, 2);
+  f_011_111_000_011_0(uniques, 2);
+  f_011_111_000_011_1(uniques, 2);
+  f_011_111_000_100_0(uniques, 2);
+  f_011_111_000_100_1(uniques, 2);
+  f_011_111_000_101_0(uniques, 2);
+  f_011_111_000_101_1(uniques, 2);
+  f_011_111_000_110_0(uniques, 2);
+  f_011_111_000_110_1(uniques, 2);
+  f_011_111_000_111_0(uniques, 2);
+  f_011_111_000_111_1(uniques, 2);
+  f_011_111_001_000_0(uniques, 2);
+  f_011_111_001_000_1(uniques, 2);
+  f_011_111_001_001_0(uniques, 2);
+  f_011_111_001_001_1(uniques, 2);
+  f_011_111_001_010_0(uniques, 2);
+  f_011_111_001_010_1(uniques, 2);
+  f_011_111_001_011_0(uniques, 2);
+  f_011_111_001_011_1(uniques, 2);
+  f_011_111_001_100_0(uniques, 2);
+  f_011_111_001_100_1(uniques, 2);
+  f_011_111_001_101_0(uniques, 2);
+  f_011_111_001_101_1(uniques, 2);
+  f_011_111_001_110_0(uniques, 2);
+  f_011_111_001_110_1(uniques, 2);
+  f_011_111_001_111_0(uniques, 2);
+  f_011_111_001_111_1(uniques, 2);
+  f_011_111_010_000_0(uniques, 2);
+  f_011_111_010_000_1(uniques, 2);
+  f_011_111_010_001_0(uniques, 2);
+  f_011_111_010_001_1(uniques, 2);
+  f_011_111_010_010_0(uniques, 2);
+  f_011_111_010_010_1(uniques, 2);
+  f_011_111_010_011_0(uniques, 2);
+  f_011_111_010_011_1(uniques, 2);
+  f_011_111_010_100_0(uniques, 2);
+  f_011_111_010_100_1(uniques, 2);
+  f_011_111_010_101_0(uniques, 2);
+  f_011_111_010_101_1(uniques, 2);
+  f_011_111_010_110_0(uniques, 2);
+  f_011_111_010_110_1(uniques, 2);
+  f_011_111_010_111_0(uniques, 2);
+  f_011_111_010_111_1(uniques, 2);
+  f_011_111_011_000_0(uniques, 2);
+  f_011_111_011_000_1(uniques, 2);
+  f_011_111_011_001_0(uniques, 2);
+  f_011_111_011_001_1(uniques, 2);
+  f_011_111_011_010_0(uniques, 2);
+  f_011_111_011_010_1(uniques, 2);
+  f_011_111_011_011_0(uniques, 2);
+  f_011_111_011_011_1(uniques, 2);
+  f_011_111_011_100_0(uniques, 2);
+  f_011_111_011_100_1(uniques, 2);
+  f_011_111_011_101_0(uniques, 2);
+  f_011_111_011_101_1(uniques, 2);
+  f_011_111_011_110_0(uniques, 2);
+  f_011_111_011_110_1(uniques, 2);
+  f_011_111_011_111_0(uniques, 2);
+  f_011_111_011_111_1(uniques, 2);
+  f_011_111_100_000_0(uniques, 2);
+  f_011_111_100_000_1(uniques, 2);
+  f_011_111_100_001_0(uniques, 2);
+  f_011_111_100_001_1(uniques, 2);
+  f_011_111_100_010_0(uniques, 2);
+  f_011_111_100_010_1(uniques, 2);
+  f_011_111_100_011_0(uniques, 2);
+  f_011_111_100_011_1(uniques, 2);
+  f_011_111_100_100_0(uniques, 2);
+  f_011_111_100_100_1(uniques, 2);
+  f_011_111_100_101_0(uniques, 2);
+  f_011_111_100_101_1(uniques, 2);
+  f_011_111_100_110_0(uniques, 2);
+  f_011_111_100_110_1(uniques, 2);
+  f_011_111_100_111_0(uniques, 2);
+  f_011_111_100_111_1(uniques, 2);
+  f_011_111_101_000_0(uniques, 2);
+  f_011_111_101_000_1(uniques, 2);
+  f_011_111_101_001_0(uniques, 2);
+  f_011_111_101_001_1(uniques, 2);
+  f_011_111_101_010_0(uniques, 2);
+  f_011_111_101_010_1(uniques, 2);
+  f_011_111_101_011_0(uniques, 2);
+  f_011_111_101_011_1(uniques, 2);
+  f_011_111_101_100_0(uniques, 2);
+  f_011_111_101_100_1(uniques, 2);
+  f_011_111_101_101_0(uniques, 2);
+  f_011_111_101_101_1(uniques, 2);
+  f_011_111_101_110_0(uniques, 2);
+  f_011_111_101_110_1(uniques, 2);
+  f_011_111_101_111_0(uniques, 2);
+  f_011_111_101_111_1(uniques, 2);
+  f_011_111_110_000_0(uniques, 2);
+  f_011_111_110_000_1(uniques, 2);
+  f_011_111_110_001_0(uniques, 2);
+  f_011_111_110_001_1(uniques, 2);
+  f_011_111_110_010_0(uniques, 2);
+  f_011_111_110_010_1(uniques, 2);
+  f_011_111_110_011_0(uniques, 2);
+  f_011_111_110_011_1(uniques, 2);
+  f_011_111_110_100_0(uniques, 2);
+  f_011_111_110_100_1(uniques, 2);
+  f_011_111_110_101_0(uniques, 2);
+  f_011_111_110_101_1(uniques, 2);
+  f_011_111_110_110_0(uniques, 2);
+  f_011_111_110_110_1(uniques, 2);
+  f_011_111_110_111_0(uniques, 2);
+  f_011_111_110_111_1(uniques, 2);
+  f_011_111_111_000_0(uniques, 2);
+  f_011_111_111_000_1(uniques, 2);
+  f_011_111_111_001_0(uniques, 2);
+  f_011_111_111_001_1(uniques, 2);
+  f_011_111_111_010_0(uniques, 2);
+  f_011_111_111_010_1(uniques, 2);
+  f_011_111_111_011_0(uniques, 2);
+  f_011_111_111_011_1(uniques, 2);
+  f_011_111_111_100_0(uniques, 2);
+  f_011_111_111_100_1(uniques, 2);
+  f_011_111_111_101_0(uniques, 2);
+  f_011_111_111_101_1(uniques, 2);
+  f_011_111_111_110_0(uniques, 2);
+  f_011_111_111_110_1(uniques, 2);
+  f_011_111_111_111_0(uniques, 2);
+  f_011_111_111_111_1(uniques, 2);
+  f_101_000_000_000_0(uniques, 2);
+  f_101_000_000_000_1(uniques, 2);
+  f_101_000_000_001_0(uniques, 2);
+  f_101_000_000_001_1(uniques, 2);
+  f_101_000_000_010_0(uniques, 2);
+  f_101_000_000_010_1(uniques, 2);
+  f_101_000_000_011_0(uniques, 2);
+  f_101_000_000_011_1(uniques, 2);
+  f_101_000_000_100_0(uniques, 2);
+  f_101_000_000_100_1(uniques, 2);
+  f_101_000_000_101_0(uniques, 2);
+  f_101_000_000_101_1(uniques, 2);
+  f_101_000_000_110_0(uniques, 2);
+  f_101_000_000_110_1(uniques, 2);
+  f_101_000_000_111_0(uniques, 2);
+  f_101_000_000_111_1(uniques, 2);
+  f_101_000_001_000_0(uniques, 2);
+  f_101_000_001_000_1(uniques, 2);
+  f_101_000_001_001_0(uniques, 2);
+  f_101_000_001_001_1(uniques, 2);
+  f_101_000_001_010_0(uniques, 2);
+  f_101_000_001_010_1(uniques, 2);
+  f_101_000_001_011_0(uniques, 2);
+  f_101_000_001_011_1(uniques, 2);
+  f_101_000_001_100_0(uniques, 2);
+  f_101_000_001_100_1(uniques, 2);
+  f_101_000_001_101_0(uniques, 2);
+  f_101_000_001_101_1(uniques, 2);
+  f_101_000_001_110_0(uniques, 2);
+  f_101_000_001_110_1(uniques, 2);
+  f_101_000_001_111_0(uniques, 2);
+  f_101_000_001_111_1(uniques, 2);
+  f_101_000_010_000_0(uniques, 2);
+  f_101_000_010_000_1(uniques, 2);
+  f_101_000_010_001_0(uniques, 2);
+  f_101_000_010_001_1(uniques, 2);
+  f_101_000_010_010_0(uniques, 2);
+  f_101_000_010_010_1(uniques, 2);
+  f_101_000_010_011_0(uniques, 2);
+  f_101_000_010_011_1(uniques, 2);
+  f_101_000_010_100_0(uniques, 2);
+  f_101_000_010_100_1(uniques, 2);
+  f_101_000_010_101_0(uniques, 2);
+  f_101_000_010_101_1(uniques, 2);
+  f_101_000_010_110_0(uniques, 2);
+  f_101_000_010_110_1(uniques, 2);
+  f_101_000_010_111_0(uniques, 2);
+  f_101_000_010_111_1(uniques, 2);
+  f_101_000_011_000_0(uniques, 2);
+  f_101_000_011_000_1(uniques, 2);
+  f_101_000_011_001_0(uniques, 2);
+  f_101_000_011_001_1(uniques, 2);
+  f_101_000_011_010_0(uniques, 2);
+  f_101_000_011_010_1(uniques, 2);
+  f_101_000_011_011_0(uniques, 2);
+  f_101_000_011_011_1(uniques, 2);
+  f_101_000_011_100_0(uniques, 2);
+  f_101_000_011_100_1(uniques, 2);
+  f_101_000_011_101_0(uniques, 2);
+  f_101_000_011_101_1(uniques, 2);
+  f_101_000_011_110_0(uniques, 2);
+  f_101_000_011_110_1(uniques, 2);
+  f_101_000_011_111_0(uniques, 2);
+  f_101_000_011_111_1(uniques, 2);
+  f_101_000_100_000_0(uniques, 2);
+  f_101_000_100_000_1(uniques, 2);
+  f_101_000_100_001_0(uniques, 2);
+  f_101_000_100_001_1(uniques, 2);
+  f_101_000_100_010_0(uniques, 2);
+  f_101_000_100_010_1(uniques, 2);
+  f_101_000_100_011_0(uniques, 2);
+  f_101_000_100_011_1(uniques, 2);
+  f_101_000_100_100_0(uniques, 2);
+  f_101_000_100_100_1(uniques, 2);
+  f_101_000_100_101_0(uniques, 2);
+  f_101_000_100_101_1(uniques, 2);
+  f_101_000_100_110_0(uniques, 2);
+  f_101_000_100_110_1(uniques, 2);
+  f_101_000_100_111_0(uniques, 2);
+  f_101_000_100_111_1(uniques, 2);
+  f_101_000_101_000_0(uniques, 2);
+  f_101_000_101_000_1(uniques, 2);
+  f_101_000_101_001_0(uniques, 2);
+  f_101_000_101_001_1(uniques, 2);
+  f_101_000_101_010_0(uniques, 2);
+  f_101_000_101_010_1(uniques, 2);
+  f_101_000_101_011_0(uniques, 2);
+  f_101_000_101_011_1(uniques, 2);
+  f_101_000_101_100_0(uniques, 2);
+  f_101_000_101_100_1(uniques, 2);
+  f_101_000_101_101_0(uniques, 2);
+  f_101_000_101_101_1(uniques, 2);
+  f_101_000_101_110_0(uniques, 2);
+  f_101_000_101_110_1(uniques, 2);
+  f_101_000_101_111_0(uniques, 2);
+  f_101_000_101_111_1(uniques, 2);
+  f_101_000_110_000_0(uniques, 2);
+  f_101_000_110_000_1(uniques, 2);
+  f_101_000_110_001_0(uniques, 2);
+  f_101_000_110_001_1(uniques, 2);
+  f_101_000_110_010_0(uniques, 2);
+  f_101_000_110_010_1(uniques, 2);
+  f_101_000_110_011_0(uniques, 2);
+  f_101_000_110_011_1(uniques, 2);
+  f_101_000_110_100_0(uniques, 2);
+  f_101_000_110_100_1(uniques, 2);
+  f_101_000_110_101_0(uniques, 2);
+  f_101_000_110_101_1(uniques, 2);
+  f_101_000_110_110_0(uniques, 2);
+  f_101_000_110_110_1(uniques, 2);
+  f_101_000_110_111_0(uniques, 2);
+  f_101_000_110_111_1(uniques, 2);
+  f_101_000_111_000_0(uniques, 2);
+  f_101_000_111_000_1(uniques, 2);
+  f_101_000_111_001_0(uniques, 2);
+  f_101_000_111_001_1(uniques, 2);
+  f_101_000_111_010_0(uniques, 2);
+  f_101_000_111_010_1(uniques, 2);
+  f_101_000_111_011_0(uniques, 2);
+  f_101_000_111_011_1(uniques, 2);
+  f_101_000_111_100_0(uniques, 2);
+  f_101_000_111_100_1(uniques, 2);
+  f_101_000_111_101_0(uniques, 2);
+  f_101_000_111_101_1(uniques, 2);
+  f_101_000_111_110_0(uniques, 2);
+  f_101_000_111_110_1(uniques, 2);
+  f_101_000_111_111_0(uniques, 2);
+  f_101_000_111_111_1(uniques, 2);
+  f_101_001_000_000_0(uniques, 2);
+  f_101_001_000_000_1(uniques, 2);
+  f_101_001_000_001_0(uniques, 2);
+  f_101_001_000_001_1(uniques, 2);
+  f_101_001_000_010_0(uniques, 2);
+  f_101_001_000_010_1(uniques, 2);
+  f_101_001_000_011_0(uniques, 2);
+  f_101_001_000_011_1(uniques, 2);
+  f_101_001_000_100_0(uniques, 2);
+  f_101_001_000_100_1(uniques, 2);
+  f_101_001_000_101_0(uniques, 2);
+  f_101_001_000_101_1(uniques, 2);
+  f_101_001_000_110_0(uniques, 2);
+  f_101_001_000_110_1(uniques, 2);
+  f_101_001_000_111_0(uniques, 2);
+  f_101_001_000_111_1(uniques, 2);
+  f_101_001_001_000_0(uniques, 2);
+  f_101_001_001_000_1(uniques, 2);
+  f_101_001_001_001_0(uniques, 2);
+  f_101_001_001_001_1(uniques, 2);
+  f_101_001_001_010_0(uniques, 2);
+  f_101_001_001_010_1(uniques, 2);
+  f_101_001_001_011_0(uniques, 2);
+  f_101_001_001_011_1(uniques, 2);
+  f_101_001_001_100_0(uniques, 2);
+  f_101_001_001_100_1(uniques, 2);
+  f_101_001_001_101_0(uniques, 2);
+  f_101_001_001_101_1(uniques, 2);
+  f_101_001_001_110_0(uniques, 2);
+  f_101_001_001_110_1(uniques, 2);
+  f_101_001_001_111_0(uniques, 2);
+  f_101_001_001_111_1(uniques, 2);
+  f_101_001_010_000_0(uniques, 2);
+  f_101_001_010_000_1(uniques, 2);
+  f_101_001_010_001_0(uniques, 2);
+  f_101_001_010_001_1(uniques, 2);
+  f_101_001_010_010_0(uniques, 2);
+  f_101_001_010_010_1(uniques, 2);
+  f_101_001_010_011_0(uniques, 2);
+  f_101_001_010_011_1(uniques, 2);
+  f_101_001_010_100_0(uniques, 2);
+  f_101_001_010_100_1(uniques, 2);
+  f_101_001_010_101_0(uniques, 2);
+  f_101_001_010_101_1(uniques, 2);
+  f_101_001_010_110_0(uniques, 2);
+  f_101_001_010_110_1(uniques, 2);
+  f_101_001_010_111_0(uniques, 2);
+  f_101_001_010_111_1(uniques, 2);
+  f_101_001_011_000_0(uniques, 2);
+  f_101_001_011_000_1(uniques, 2);
+  f_101_001_011_001_0(uniques, 2);
+  f_101_001_011_001_1(uniques, 2);
+  f_101_001_011_010_0(uniques, 2);
+  f_101_001_011_010_1(uniques, 2);
+  f_101_001_011_011_0(uniques, 2);
+  f_101_001_011_011_1(uniques, 2);
+  f_101_001_011_100_0(uniques, 2);
+  f_101_001_011_100_1(uniques, 2);
+  f_101_001_011_101_0(uniques, 2);
+  f_101_001_011_101_1(uniques, 2);
+  f_101_001_011_110_0(uniques, 2);
+  f_101_001_011_110_1(uniques, 2);
+  f_101_001_011_111_0(uniques, 2);
+  f_101_001_011_111_1(uniques, 2);
+  f_101_001_100_000_0(uniques, 2);
+  f_101_001_100_000_1(uniques, 2);
+  f_101_001_100_001_0(uniques, 2);
+  f_101_001_100_001_1(uniques, 2);
+  f_101_001_100_010_0(uniques, 2);
+  f_101_001_100_010_1(uniques, 2);
+  f_101_001_100_011_0(uniques, 2);
+  f_101_001_100_011_1(uniques, 2);
+  f_101_001_100_100_0(uniques, 2);
+  f_101_001_100_100_1(uniques, 2);
+  f_101_001_100_101_0(uniques, 2);
+  f_101_001_100_101_1(uniques, 2);
+  f_101_001_100_110_0(uniques, 2);
+  f_101_001_100_110_1(uniques, 2);
+  f_101_001_100_111_0(uniques, 2);
+  f_101_001_100_111_1(uniques, 2);
+  f_101_001_101_000_0(uniques, 2);
+  f_101_001_101_000_1(uniques, 2);
+  f_101_001_101_001_0(uniques, 2);
+  f_101_001_101_001_1(uniques, 2);
+  f_101_001_101_010_0(uniques, 2);
+  f_101_001_101_010_1(uniques, 2);
+  f_101_001_101_011_0(uniques, 2);
+  f_101_001_101_011_1(uniques, 2);
+  f_101_001_101_100_0(uniques, 2);
+  f_101_001_101_100_1(uniques, 2);
+  f_101_001_101_101_0(uniques, 2);
+  f_101_001_101_101_1(uniques, 2);
+  f_101_001_101_110_0(uniques, 2);
+  f_101_001_101_110_1(uniques, 2);
+  f_101_001_101_111_0(uniques, 2);
+  f_101_001_101_111_1(uniques, 2);
+  f_101_001_110_000_0(uniques, 2);
+  f_101_001_110_000_1(uniques, 2);
+  f_101_001_110_001_0(uniques, 2);
+  f_101_001_110_001_1(uniques, 2);
+  f_101_001_110_010_0(uniques, 2);
+  f_101_001_110_010_1(uniques, 2);
+  f_101_001_110_011_0(uniques, 2);
+  f_101_001_110_011_1(uniques, 2);
+  f_101_001_110_100_0(uniques, 2);
+  f_101_001_110_100_1(uniques, 2);
+  f_101_001_110_101_0(uniques, 2);
+  f_101_001_110_101_1(uniques, 2);
+  f_101_001_110_110_0(uniques, 2);
+  f_101_001_110_110_1(uniques, 2);
+  f_101_001_110_111_0(uniques, 2);
+  f_101_001_110_111_1(uniques, 2);
+  f_101_001_111_000_0(uniques, 2);
+  f_101_001_111_000_1(uniques, 2);
+  f_101_001_111_001_0(uniques, 2);
+  f_101_001_111_001_1(uniques, 2);
+  f_101_001_111_010_0(uniques, 2);
+  f_101_001_111_010_1(uniques, 2);
+  f_101_001_111_011_0(uniques, 2);
+  f_101_001_111_011_1(uniques, 2);
+  f_101_001_111_100_0(uniques, 2);
+  f_101_001_111_100_1(uniques, 2);
+  f_101_001_111_101_0(uniques, 2);
+  f_101_001_111_101_1(uniques, 2);
+  f_101_001_111_110_0(uniques, 2);
+  f_101_001_111_110_1(uniques, 2);
+  f_101_001_111_111_0(uniques, 2);
+  f_101_001_111_111_1(uniques, 2);
+  f_101_010_000_000_0(uniques, 2);
+  f_101_010_000_000_1(uniques, 2);
+  f_101_010_000_001_0(uniques, 2);
+  f_101_010_000_001_1(uniques, 2);
+  f_101_010_000_010_0(uniques, 2);
+  f_101_010_000_010_1(uniques, 2);
+  f_101_010_000_011_0(uniques, 2);
+  f_101_010_000_011_1(uniques, 2);
+  f_101_010_000_100_0(uniques, 2);
+  f_101_010_000_100_1(uniques, 2);
+  f_101_010_000_101_0(uniques, 2);
+  f_101_010_000_101_1(uniques, 2);
+  f_101_010_000_110_0(uniques, 2);
+  f_101_010_000_110_1(uniques, 2);
+  f_101_010_000_111_0(uniques, 2);
+  f_101_010_000_111_1(uniques, 2);
+  f_101_010_001_000_0(uniques, 2);
+  f_101_010_001_000_1(uniques, 2);
+  f_101_010_001_001_0(uniques, 2);
+  f_101_010_001_001_1(uniques, 2);
+  f_101_010_001_010_0(uniques, 2);
+  f_101_010_001_010_1(uniques, 2);
+  f_101_010_001_011_0(uniques, 2);
+  f_101_010_001_011_1(uniques, 2);
+  f_101_010_001_100_0(uniques, 2);
+  f_101_010_001_100_1(uniques, 2);
+  f_101_010_001_101_0(uniques, 2);
+  f_101_010_001_101_1(uniques, 2);
+  f_101_010_001_110_0(uniques, 2);
+  f_101_010_001_110_1(uniques, 2);
+  f_101_010_001_111_0(uniques, 2);
+  f_101_010_001_111_1(uniques, 2);
+  f_101_010_010_000_0(uniques, 2);
+  f_101_010_010_000_1(uniques, 2);
+  f_101_010_010_001_0(uniques, 2);
+  f_101_010_010_001_1(uniques, 2);
+  f_101_010_010_010_0(uniques, 2);
+  f_101_010_010_010_1(uniques, 2);
+  f_101_010_010_011_0(uniques, 2);
+  f_101_010_010_011_1(uniques, 2);
+  f_101_010_010_100_0(uniques, 2);
+  f_101_010_010_100_1(uniques, 2);
+  f_101_010_010_101_0(uniques, 2);
+  f_101_010_010_101_1(uniques, 2);
+  f_101_010_010_110_0(uniques, 2);
+  f_101_010_010_110_1(uniques, 2);
+  f_101_010_010_111_0(uniques, 2);
+  f_101_010_010_111_1(uniques, 2);
+  f_101_010_011_000_0(uniques, 2);
+  f_101_010_011_000_1(uniques, 2);
+  f_101_010_011_001_0(uniques, 2);
+  f_101_010_011_001_1(uniques, 2);
+  f_101_010_011_010_0(uniques, 2);
+  f_101_010_011_010_1(uniques, 2);
+  f_101_010_011_011_0(uniques, 2);
+  f_101_010_011_011_1(uniques, 2);
+  f_101_010_011_100_0(uniques, 2);
+  f_101_010_011_100_1(uniques, 2);
+  f_101_010_011_101_0(uniques, 2);
+  f_101_010_011_101_1(uniques, 2);
+  f_101_010_011_110_0(uniques, 2);
+  f_101_010_011_110_1(uniques, 2);
+  f_101_010_011_111_0(uniques, 2);
+  f_101_010_011_111_1(uniques, 2);
+  f_101_010_100_000_0(uniques, 2);
+  f_101_010_100_000_1(uniques, 2);
+  f_101_010_100_001_0(uniques, 2);
+  f_101_010_100_001_1(uniques, 2);
+  f_101_010_100_010_0(uniques, 2);
+  f_101_010_100_010_1(uniques, 2);
+  f_101_010_100_011_0(uniques, 2);
+  f_101_010_100_011_1(uniques, 2);
+  f_101_010_100_100_0(uniques, 2);
+  f_101_010_100_100_1(uniques, 2);
+  f_101_010_100_101_0(uniques, 2);
+  f_101_010_100_101_1(uniques, 2);
+  f_101_010_100_110_0(uniques, 2);
+  f_101_010_100_110_1(uniques, 2);
+  f_101_010_100_111_0(uniques, 2);
+  f_101_010_100_111_1(uniques, 2);
+  f_101_010_101_000_0(uniques, 2);
+  f_101_010_101_000_1(uniques, 2);
+  f_101_010_101_001_0(uniques, 2);
+  f_101_010_101_001_1(uniques, 2);
+  f_101_010_101_010_0(uniques, 2);
+  f_101_010_101_010_1(uniques, 2);
+  f_101_010_101_011_0(uniques, 2);
+  f_101_010_101_011_1(uniques, 2);
+  f_101_010_101_100_0(uniques, 2);
+  f_101_010_101_100_1(uniques, 2);
+  f_101_010_101_101_0(uniques, 2);
+  f_101_010_101_101_1(uniques, 2);
+  f_101_010_101_110_0(uniques, 2);
+  f_101_010_101_110_1(uniques, 2);
+  f_101_010_101_111_0(uniques, 2);
+  f_101_010_101_111_1(uniques, 2);
+  f_101_010_110_000_0(uniques, 2);
+  f_101_010_110_000_1(uniques, 2);
+  f_101_010_110_001_0(uniques, 2);
+  f_101_010_110_001_1(uniques, 2);
+  f_101_010_110_010_0(uniques, 2);
+  f_101_010_110_010_1(uniques, 2);
+  f_101_010_110_011_0(uniques, 2);
+  f_101_010_110_011_1(uniques, 2);
+  f_101_010_110_100_0(uniques, 2);
+  f_101_010_110_100_1(uniques, 2);
+  f_101_010_110_101_0(uniques, 2);
+  f_101_010_110_101_1(uniques, 2);
+  f_101_010_110_110_0(uniques, 2);
+  f_101_010_110_110_1(uniques, 2);
+  f_101_010_110_111_0(uniques, 2);
+  f_101_010_110_111_1(uniques, 2);
+  f_101_010_111_000_0(uniques, 2);
+  f_101_010_111_000_1(uniques, 2);
+  f_101_010_111_001_0(uniques, 2);
+  f_101_010_111_001_1(uniques, 2);
+  f_101_010_111_010_0(uniques, 2);
+  f_101_010_111_010_1(uniques, 2);
+  f_101_010_111_011_0(uniques, 2);
+  f_101_010_111_011_1(uniques, 2);
+  f_101_010_111_100_0(uniques, 2);
+  f_101_010_111_100_1(uniques, 2);
+  f_101_010_111_101_0(uniques, 2);
+  f_101_010_111_101_1(uniques, 2);
+  f_101_010_111_110_0(uniques, 2);
+  f_101_010_111_110_1(uniques, 2);
+  f_101_010_111_111_0(uniques, 2);
+  f_101_010_111_111_1(uniques, 2);
+  f_101_011_000_000_0(uniques, 2);
+  f_101_011_000_000_1(uniques, 2);
+  f_101_011_000_001_0(uniques, 2);
+  f_101_011_000_001_1(uniques, 2);
+  f_101_011_000_010_0(uniques, 2);
+  f_101_011_000_010_1(uniques, 2);
+  f_101_011_000_011_0(uniques, 2);
+  f_101_011_000_011_1(uniques, 2);
+  f_101_011_000_100_0(uniques, 2);
+  f_101_011_000_100_1(uniques, 2);
+  f_101_011_000_101_0(uniques, 2);
+  f_101_011_000_101_1(uniques, 2);
+  f_101_011_000_110_0(uniques, 2);
+  f_101_011_000_110_1(uniques, 2);
+  f_101_011_000_111_0(uniques, 2);
+  f_101_011_000_111_1(uniques, 2);
+  f_101_011_001_000_0(uniques, 2);
+  f_101_011_001_000_1(uniques, 2);
+  f_101_011_001_001_0(uniques, 2);
+  f_101_011_001_001_1(uniques, 2);
+  f_101_011_001_010_0(uniques, 2);
+  f_101_011_001_010_1(uniques, 2);
+  f_101_011_001_011_0(uniques, 2);
+  f_101_011_001_011_1(uniques, 2);
+  f_101_011_001_100_0(uniques, 2);
+  f_101_011_001_100_1(uniques, 2);
+  f_101_011_001_101_0(uniques, 2);
+  f_101_011_001_101_1(uniques, 2);
+  f_101_011_001_110_0(uniques, 2);
+  f_101_011_001_110_1(uniques, 2);
+  f_101_011_001_111_0(uniques, 2);
+  f_101_011_001_111_1(uniques, 2);
+  f_101_011_010_000_0(uniques, 2);
+  f_101_011_010_000_1(uniques, 2);
+  f_101_011_010_001_0(uniques, 2);
+  f_101_011_010_001_1(uniques, 2);
+  f_101_011_010_010_0(uniques, 2);
+  f_101_011_010_010_1(uniques, 2);
+  f_101_011_010_011_0(uniques, 2);
+  f_101_011_010_011_1(uniques, 2);
+  f_101_011_010_100_0(uniques, 2);
+  f_101_011_010_100_1(uniques, 2);
+  f_101_011_010_101_0(uniques, 2);
+  f_101_011_010_101_1(uniques, 2);
+  f_101_011_010_110_0(uniques, 2);
+  f_101_011_010_110_1(uniques, 2);
+  f_101_011_010_111_0(uniques, 2);
+  f_101_011_010_111_1(uniques, 2);
+  f_101_011_011_000_0(uniques, 2);
+  f_101_011_011_000_1(uniques, 2);
+  f_101_011_011_001_0(uniques, 2);
+  f_101_011_011_001_1(uniques, 2);
+  f_101_011_011_010_0(uniques, 2);
+  f_101_011_011_010_1(uniques, 2);
+  f_101_011_011_011_0(uniques, 2);
+  f_101_011_011_011_1(uniques, 2);
+  f_101_011_011_100_0(uniques, 2);
+  f_101_011_011_100_1(uniques, 2);
+  f_101_011_011_101_0(uniques, 2);
+  f_101_011_011_101_1(uniques, 2);
+  f_101_011_011_110_0(uniques, 2);
+  f_101_011_011_110_1(uniques, 2);
+  f_101_011_011_111_0(uniques, 2);
+  f_101_011_011_111_1(uniques, 2);
+  f_101_011_100_000_0(uniques, 2);
+  f_101_011_100_000_1(uniques, 2);
+  f_101_011_100_001_0(uniques, 2);
+  f_101_011_100_001_1(uniques, 2);
+  f_101_011_100_010_0(uniques, 2);
+  f_101_011_100_010_1(uniques, 2);
+  f_101_011_100_011_0(uniques, 2);
+  f_101_011_100_011_1(uniques, 2);
+  f_101_011_100_100_0(uniques, 2);
+  f_101_011_100_100_1(uniques, 2);
+  f_101_011_100_101_0(uniques, 2);
+  f_101_011_100_101_1(uniques, 2);
+  f_101_011_100_110_0(uniques, 2);
+  f_101_011_100_110_1(uniques, 2);
+  f_101_011_100_111_0(uniques, 2);
+  f_101_011_100_111_1(uniques, 2);
+  f_101_011_101_000_0(uniques, 2);
+  f_101_011_101_000_1(uniques, 2);
+  f_101_011_101_001_0(uniques, 2);
+  f_101_011_101_001_1(uniques, 2);
+  f_101_011_101_010_0(uniques, 2);
+  f_101_011_101_010_1(uniques, 2);
+  f_101_011_101_011_0(uniques, 2);
+  f_101_011_101_011_1(uniques, 2);
+  f_101_011_101_100_0(uniques, 2);
+  f_101_011_101_100_1(uniques, 2);
+  f_101_011_101_101_0(uniques, 2);
+  f_101_011_101_101_1(uniques, 2);
+  f_101_011_101_110_0(uniques, 2);
+  f_101_011_101_110_1(uniques, 2);
+  f_101_011_101_111_0(uniques, 2);
+  f_101_011_101_111_1(uniques, 2);
+  f_101_011_110_000_0(uniques, 2);
+  f_101_011_110_000_1(uniques, 2);
+  f_101_011_110_001_0(uniques, 2);
+  f_101_011_110_001_1(uniques, 2);
+  f_101_011_110_010_0(uniques, 2);
+  f_101_011_110_010_1(uniques, 2);
+  f_101_011_110_011_0(uniques, 2);
+  f_101_011_110_011_1(uniques, 2);
+  f_101_011_110_100_0(uniques, 2);
+  f_101_011_110_100_1(uniques, 2);
+  f_101_011_110_101_0(uniques, 2);
+  f_101_011_110_101_1(uniques, 2);
+  f_101_011_110_110_0(uniques, 2);
+  f_101_011_110_110_1(uniques, 2);
+  f_101_011_110_111_0(uniques, 2);
+  f_101_011_110_111_1(uniques, 2);
+  f_101_011_111_000_0(uniques, 2);
+  f_101_011_111_000_1(uniques, 2);
+  f_101_011_111_001_0(uniques, 2);
+  f_101_011_111_001_1(uniques, 2);
+  f_101_011_111_010_0(uniques, 2);
+  f_101_011_111_010_1(uniques, 2);
+  f_101_011_111_011_0(uniques, 2);
+  f_101_011_111_011_1(uniques, 2);
+  f_101_011_111_100_0(uniques, 2);
+  f_101_011_111_100_1(uniques, 2);
+  f_101_011_111_101_0(uniques, 2);
+  f_101_011_111_101_1(uniques, 2);
+  f_101_011_111_110_0(uniques, 2);
+  f_101_011_111_110_1(uniques, 2);
+  f_101_011_111_111_0(uniques, 2);
+  f_101_011_111_111_1(uniques, 2);
+  f_101_100_000_000_0(uniques, 2);
+  f_101_100_000_000_1(uniques, 2);
+  f_101_100_000_001_0(uniques, 2);
+  f_101_100_000_001_1(uniques, 2);
+  f_101_100_000_010_0(uniques, 2);
+  f_101_100_000_010_1(uniques, 2);
+  f_101_100_000_011_0(uniques, 2);
+  f_101_100_000_011_1(uniques, 2);
+  f_101_100_000_100_0(uniques, 2);
+  f_101_100_000_100_1(uniques, 2);
+  f_101_100_000_101_0(uniques, 2);
+  f_101_100_000_101_1(uniques, 2);
+  f_101_100_000_110_0(uniques, 2);
+  f_101_100_000_110_1(uniques, 2);
+  f_101_100_000_111_0(uniques, 2);
+  f_101_100_000_111_1(uniques, 2);
+  f_101_100_001_000_0(uniques, 2);
+  f_101_100_001_000_1(uniques, 2);
+  f_101_100_001_001_0(uniques, 2);
+  f_101_100_001_001_1(uniques, 2);
+  f_101_100_001_010_0(uniques, 2);
+  f_101_100_001_010_1(uniques, 2);
+  f_101_100_001_011_0(uniques, 2);
+  f_101_100_001_011_1(uniques, 2);
+  f_101_100_001_100_0(uniques, 2);
+  f_101_100_001_100_1(uniques, 2);
+  f_101_100_001_101_0(uniques, 2);
+  f_101_100_001_101_1(uniques, 2);
+  f_101_100_001_110_0(uniques, 2);
+  f_101_100_001_110_1(uniques, 2);
+  f_101_100_001_111_0(uniques, 2);
+  f_101_100_001_111_1(uniques, 2);
+  f_101_100_010_000_0(uniques, 2);
+  f_101_100_010_000_1(uniques, 2);
+  f_101_100_010_001_0(uniques, 2);
+  f_101_100_010_001_1(uniques, 2);
+  f_101_100_010_010_0(uniques, 2);
+  f_101_100_010_010_1(uniques, 2);
+  f_101_100_010_011_0(uniques, 2);
+  f_101_100_010_011_1(uniques, 2);
+  f_101_100_010_100_0(uniques, 2);
+  f_101_100_010_100_1(uniques, 2);
+  f_101_100_010_101_0(uniques, 2);
+  f_101_100_010_101_1(uniques, 2);
+  f_101_100_010_110_0(uniques, 2);
+  f_101_100_010_110_1(uniques, 2);
+  f_101_100_010_111_0(uniques, 2);
+  f_101_100_010_111_1(uniques, 2);
+  f_101_100_011_000_0(uniques, 2);
+  f_101_100_011_000_1(uniques, 2);
+  f_101_100_011_001_0(uniques, 2);
+  f_101_100_011_001_1(uniques, 2);
+  f_101_100_011_010_0(uniques, 2);
+  f_101_100_011_010_1(uniques, 2);
+  f_101_100_011_011_0(uniques, 2);
+  f_101_100_011_011_1(uniques, 2);
+  f_101_100_011_100_0(uniques, 2);
+  f_101_100_011_100_1(uniques, 2);
+  f_101_100_011_101_0(uniques, 2);
+  f_101_100_011_101_1(uniques, 2);
+  f_101_100_011_110_0(uniques, 2);
+  f_101_100_011_110_1(uniques, 2);
+  f_101_100_011_111_0(uniques, 2);
+  f_101_100_011_111_1(uniques, 2);
+  f_101_100_100_000_0(uniques, 2);
+  f_101_100_100_000_1(uniques, 2);
+  f_101_100_100_001_0(uniques, 2);
+  f_101_100_100_001_1(uniques, 2);
+  f_101_100_100_010_0(uniques, 2);
+  f_101_100_100_010_1(uniques, 2);
+  f_101_100_100_011_0(uniques, 2);
+  f_101_100_100_011_1(uniques, 2);
+  f_101_100_100_100_0(uniques, 2);
+  f_101_100_100_100_1(uniques, 2);
+  f_101_100_100_101_0(uniques, 2);
+  f_101_100_100_101_1(uniques, 2);
+  f_101_100_100_110_0(uniques, 2);
+  f_101_100_100_110_1(uniques, 2);
+  f_101_100_100_111_0(uniques, 2);
+  f_101_100_100_111_1(uniques, 2);
+  f_101_100_101_000_0(uniques, 2);
+  f_101_100_101_000_1(uniques, 2);
+  f_101_100_101_001_0(uniques, 2);
+  f_101_100_101_001_1(uniques, 2);
+  f_101_100_101_010_0(uniques, 2);
+  f_101_100_101_010_1(uniques, 2);
+  f_101_100_101_011_0(uniques, 2);
+  f_101_100_101_011_1(uniques, 2);
+  f_101_100_101_100_0(uniques, 2);
+  f_101_100_101_100_1(uniques, 2);
+  f_101_100_101_101_0(uniques, 2);
+  f_101_100_101_101_1(uniques, 2);
+  f_101_100_101_110_0(uniques, 2);
+  f_101_100_101_110_1(uniques, 2);
+  f_101_100_101_111_0(uniques, 2);
+  f_101_100_101_111_1(uniques, 2);
+  f_101_100_110_000_0(uniques, 2);
+  f_101_100_110_000_1(uniques, 2);
+  f_101_100_110_001_0(uniques, 2);
+  f_101_100_110_001_1(uniques, 2);
+  f_101_100_110_010_0(uniques, 2);
+  f_101_100_110_010_1(uniques, 2);
+  f_101_100_110_011_0(uniques, 2);
+  f_101_100_110_011_1(uniques, 2);
+  f_101_100_110_100_0(uniques, 2);
+  f_101_100_110_100_1(uniques, 2);
+  f_101_100_110_101_0(uniques, 2);
+  f_101_100_110_101_1(uniques, 2);
+  f_101_100_110_110_0(uniques, 2);
+  f_101_100_110_110_1(uniques, 2);
+  f_101_100_110_111_0(uniques, 2);
+  f_101_100_110_111_1(uniques, 2);
+  f_101_100_111_000_0(uniques, 2);
+  f_101_100_111_000_1(uniques, 2);
+  f_101_100_111_001_0(uniques, 2);
+  f_101_100_111_001_1(uniques, 2);
+  f_101_100_111_010_0(uniques, 2);
+  f_101_100_111_010_1(uniques, 2);
+  f_101_100_111_011_0(uniques, 2);
+  f_101_100_111_011_1(uniques, 2);
+  f_101_100_111_100_0(uniques, 2);
+  f_101_100_111_100_1(uniques, 2);
+  f_101_100_111_101_0(uniques, 2);
+  f_101_100_111_101_1(uniques, 2);
+  f_101_100_111_110_0(uniques, 2);
+  f_101_100_111_110_1(uniques, 2);
+  f_101_100_111_111_0(uniques, 2);
+  f_101_100_111_111_1(uniques, 2);
+  f_101_101_000_000_0(uniques, 2);
+  f_101_101_000_000_1(uniques, 2);
+  f_101_101_000_001_0(uniques, 2);
+  f_101_101_000_001_1(uniques, 2);
+  f_101_101_000_010_0(uniques, 2);
+  f_101_101_000_010_1(uniques, 2);
+  f_101_101_000_011_0(uniques, 2);
+  f_101_101_000_011_1(uniques, 2);
+  f_101_101_000_100_0(uniques, 2);
+  f_101_101_000_100_1(uniques, 2);
+  f_101_101_000_101_0(uniques, 2);
+  f_101_101_000_101_1(uniques, 2);
+  f_101_101_000_110_0(uniques, 2);
+  f_101_101_000_110_1(uniques, 2);
+  f_101_101_000_111_0(uniques, 2);
+  f_101_101_000_111_1(uniques, 2);
+  f_101_101_001_000_0(uniques, 2);
+  f_101_101_001_000_1(uniques, 2);
+  f_101_101_001_001_0(uniques, 2);
+  f_101_101_001_001_1(uniques, 2);
+  f_101_101_001_010_0(uniques, 2);
+  f_101_101_001_010_1(uniques, 2);
+  f_101_101_001_011_0(uniques, 2);
+  f_101_101_001_011_1(uniques, 2);
+  f_101_101_001_100_0(uniques, 2);
+  f_101_101_001_100_1(uniques, 2);
+  f_101_101_001_101_0(uniques, 2);
+  f_101_101_001_101_1(uniques, 2);
+  f_101_101_001_110_0(uniques, 2);
+  f_101_101_001_110_1(uniques, 2);
+  f_101_101_001_111_0(uniques, 2);
+  f_101_101_001_111_1(uniques, 2);
+  f_101_101_010_000_0(uniques, 2);
+  f_101_101_010_000_1(uniques, 2);
+  f_101_101_010_001_0(uniques, 2);
+  f_101_101_010_001_1(uniques, 2);
+  f_101_101_010_010_0(uniques, 2);
+  f_101_101_010_010_1(uniques, 2);
+  f_101_101_010_011_0(uniques, 2);
+  f_101_101_010_011_1(uniques, 2);
+  f_101_101_010_100_0(uniques, 2);
+  f_101_101_010_100_1(uniques, 2);
+  f_101_101_010_101_0(uniques, 2);
+  f_101_101_010_101_1(uniques, 2);
+  f_101_101_010_110_0(uniques, 2);
+  f_101_101_010_110_1(uniques, 2);
+  f_101_101_010_111_0(uniques, 2);
+  f_101_101_010_111_1(uniques, 2);
+  f_101_101_011_000_0(uniques, 2);
+  f_101_101_011_000_1(uniques, 2);
+  f_101_101_011_001_0(uniques, 2);
+  f_101_101_011_001_1(uniques, 2);
+  f_101_101_011_010_0(uniques, 2);
+  f_101_101_011_010_1(uniques, 2);
+  f_101_101_011_011_0(uniques, 2);
+  f_101_101_011_011_1(uniques, 2);
+  f_101_101_011_100_0(uniques, 2);
+  f_101_101_011_100_1(uniques, 2);
+  f_101_101_011_101_0(uniques, 2);
+  f_101_101_011_101_1(uniques, 2);
+  f_101_101_011_110_0(uniques, 2);
+  f_101_101_011_110_1(uniques, 2);
+  f_101_101_011_111_0(uniques, 2);
+  f_101_101_011_111_1(uniques, 2);
+  f_101_101_100_000_0(uniques, 2);
+  f_101_101_100_000_1(uniques, 2);
+  f_101_101_100_001_0(uniques, 2);
+  f_101_101_100_001_1(uniques, 2);
+  f_101_101_100_010_0(uniques, 2);
+  f_101_101_100_010_1(uniques, 2);
+  f_101_101_100_011_0(uniques, 2);
+  f_101_101_100_011_1(uniques, 2);
+  f_101_101_100_100_0(uniques, 2);
+  f_101_101_100_100_1(uniques, 2);
+  f_101_101_100_101_0(uniques, 2);
+  f_101_101_100_101_1(uniques, 2);
+  f_101_101_100_110_0(uniques, 2);
+  f_101_101_100_110_1(uniques, 2);
+  f_101_101_100_111_0(uniques, 2);
+  f_101_101_100_111_1(uniques, 2);
+  f_101_101_101_000_0(uniques, 2);
+  f_101_101_101_000_1(uniques, 2);
+  f_101_101_101_001_0(uniques, 2);
+  f_101_101_101_001_1(uniques, 2);
+  f_101_101_101_010_0(uniques, 2);
+  f_101_101_101_010_1(uniques, 2);
+  f_101_101_101_011_0(uniques, 2);
+  f_101_101_101_011_1(uniques, 2);
+  f_101_101_101_100_0(uniques, 2);
+  f_101_101_101_100_1(uniques, 2);
+  f_101_101_101_101_0(uniques, 2);
+  f_101_101_101_101_1(uniques, 2);
+  f_101_101_101_110_0(uniques, 2);
+  f_101_101_101_110_1(uniques, 2);
+  f_101_101_101_111_0(uniques, 2);
+  f_101_101_101_111_1(uniques, 2);
+  f_101_101_110_000_0(uniques, 2);
+  f_101_101_110_000_1(uniques, 2);
+  f_101_101_110_001_0(uniques, 2);
+  f_101_101_110_001_1(uniques, 2);
+  f_101_101_110_010_0(uniques, 2);
+  f_101_101_110_010_1(uniques, 2);
+  f_101_101_110_011_0(uniques, 2);
+  f_101_101_110_011_1(uniques, 2);
+  f_101_101_110_100_0(uniques, 2);
+  f_101_101_110_100_1(uniques, 2);
+  f_101_101_110_101_0(uniques, 2);
+  f_101_101_110_101_1(uniques, 2);
+  f_101_101_110_110_0(uniques, 2);
+  f_101_101_110_110_1(uniques, 2);
+  f_101_101_110_111_0(uniques, 2);
+  f_101_101_110_111_1(uniques, 2);
+  f_101_101_111_000_0(uniques, 2);
+  f_101_101_111_000_1(uniques, 2);
+  f_101_101_111_001_0(uniques, 2);
+  f_101_101_111_001_1(uniques, 2);
+  f_101_101_111_010_0(uniques, 2);
+  f_101_101_111_010_1(uniques, 2);
+  f_101_101_111_011_0(uniques, 2);
+  f_101_101_111_011_1(uniques, 2);
+  f_101_101_111_100_0(uniques, 2);
+  f_101_101_111_100_1(uniques, 2);
+  f_101_101_111_101_0(uniques, 2);
+  f_101_101_111_101_1(uniques, 2);
+  f_101_101_111_110_0(uniques, 2);
+  f_101_101_111_110_1(uniques, 2);
+  f_101_101_111_111_0(uniques, 2);
+  f_101_101_111_111_1(uniques, 2);
+  f_101_110_000_000_0(uniques, 2);
+  f_101_110_000_000_1(uniques, 2);
+  f_101_110_000_001_0(uniques, 2);
+  f_101_110_000_001_1(uniques, 2);
+  f_101_110_000_010_0(uniques, 2);
+  f_101_110_000_010_1(uniques, 2);
+  f_101_110_000_011_0(uniques, 2);
+  f_101_110_000_011_1(uniques, 2);
+  f_101_110_000_100_0(uniques, 2);
+  f_101_110_000_100_1(uniques, 2);
+  f_101_110_000_101_0(uniques, 2);
+  f_101_110_000_101_1(uniques, 2);
+  f_101_110_000_110_0(uniques, 2);
+  f_101_110_000_110_1(uniques, 2);
+  f_101_110_000_111_0(uniques, 2);
+  f_101_110_000_111_1(uniques, 2);
+  f_101_110_001_000_0(uniques, 2);
+  f_101_110_001_000_1(uniques, 2);
+  f_101_110_001_001_0(uniques, 2);
+  f_101_110_001_001_1(uniques, 2);
+  f_101_110_001_010_0(uniques, 2);
+  f_101_110_001_010_1(uniques, 2);
+  f_101_110_001_011_0(uniques, 2);
+  f_101_110_001_011_1(uniques, 2);
+  f_101_110_001_100_0(uniques, 2);
+  f_101_110_001_100_1(uniques, 2);
+  f_101_110_001_101_0(uniques, 2);
+  f_101_110_001_101_1(uniques, 2);
+  f_101_110_001_110_0(uniques, 2);
+  f_101_110_001_110_1(uniques, 2);
+  f_101_110_001_111_0(uniques, 2);
+  f_101_110_001_111_1(uniques, 2);
+  f_101_110_010_000_0(uniques, 2);
+  f_101_110_010_000_1(uniques, 2);
+  f_101_110_010_001_0(uniques, 2);
+  f_101_110_010_001_1(uniques, 2);
+  f_101_110_010_010_0(uniques, 2);
+  f_101_110_010_010_1(uniques, 2);
+  f_101_110_010_011_0(uniques, 2);
+  f_101_110_010_011_1(uniques, 2);
+  f_101_110_010_100_0(uniques, 2);
+  f_101_110_010_100_1(uniques, 2);
+  f_101_110_010_101_0(uniques, 2);
+  f_101_110_010_101_1(uniques, 2);
+  f_101_110_010_110_0(uniques, 2);
+  f_101_110_010_110_1(uniques, 2);
+  f_101_110_010_111_0(uniques, 2);
+  f_101_110_010_111_1(uniques, 2);
+  f_101_110_011_000_0(uniques, 2);
+  f_101_110_011_000_1(uniques, 2);
+  f_101_110_011_001_0(uniques, 2);
+  f_101_110_011_001_1(uniques, 2);
+  f_101_110_011_010_0(uniques, 2);
+  f_101_110_011_010_1(uniques, 2);
+  f_101_110_011_011_0(uniques, 2);
+  f_101_110_011_011_1(uniques, 2);
+  f_101_110_011_100_0(uniques, 2);
+  f_101_110_011_100_1(uniques, 2);
+  f_101_110_011_101_0(uniques, 2);
+  f_101_110_011_101_1(uniques, 2);
+  f_101_110_011_110_0(uniques, 2);
+  f_101_110_011_110_1(uniques, 2);
+  f_101_110_011_111_0(uniques, 2);
+  f_101_110_011_111_1(uniques, 2);
+  f_101_110_100_000_0(uniques, 2);
+  f_101_110_100_000_1(uniques, 2);
+  f_101_110_100_001_0(uniques, 2);
+  f_101_110_100_001_1(uniques, 2);
+  f_101_110_100_010_0(uniques, 2);
+  f_101_110_100_010_1(uniques, 2);
+  f_101_110_100_011_0(uniques, 2);
+  f_101_110_100_011_1(uniques, 2);
+  f_101_110_100_100_0(uniques, 2);
+  f_101_110_100_100_1(uniques, 2);
+  f_101_110_100_101_0(uniques, 2);
+  f_101_110_100_101_1(uniques, 2);
+  f_101_110_100_110_0(uniques, 2);
+  f_101_110_100_110_1(uniques, 2);
+  f_101_110_100_111_0(uniques, 2);
+  f_101_110_100_111_1(uniques, 2);
+  f_101_110_101_000_0(uniques, 2);
+  f_101_110_101_000_1(uniques, 2);
+  f_101_110_101_001_0(uniques, 2);
+  f_101_110_101_001_1(uniques, 2);
+  f_101_110_101_010_0(uniques, 2);
+  f_101_110_101_010_1(uniques, 2);
+  f_101_110_101_011_0(uniques, 2);
+  f_101_110_101_011_1(uniques, 2);
+  f_101_110_101_100_0(uniques, 2);
+  f_101_110_101_100_1(uniques, 2);
+  f_101_110_101_101_0(uniques, 2);
+  f_101_110_101_101_1(uniques, 2);
+  f_101_110_101_110_0(uniques, 2);
+  f_101_110_101_110_1(uniques, 2);
+  f_101_110_101_111_0(uniques, 2);
+  f_101_110_101_111_1(uniques, 2);
+  f_101_110_110_000_0(uniques, 2);
+  f_101_110_110_000_1(uniques, 2);
+  f_101_110_110_001_0(uniques, 2);
+  f_101_110_110_001_1(uniques, 2);
+  f_101_110_110_010_0(uniques, 2);
+  f_101_110_110_010_1(uniques, 2);
+  f_101_110_110_011_0(uniques, 2);
+  f_101_110_110_011_1(uniques, 2);
+  f_101_110_110_100_0(uniques, 2);
+  f_101_110_110_100_1(uniques, 2);
+  f_101_110_110_101_0(uniques, 2);
+  f_101_110_110_101_1(uniques, 2);
+  f_101_110_110_110_0(uniques, 2);
+  f_101_110_110_110_1(uniques, 2);
+  f_101_110_110_111_0(uniques, 2);
+  f_101_110_110_111_1(uniques, 2);
+  f_101_110_111_000_0(uniques, 2);
+  f_101_110_111_000_1(uniques, 2);
+  f_101_110_111_001_0(uniques, 2);
+  f_101_110_111_001_1(uniques, 2);
+  f_101_110_111_010_0(uniques, 2);
+  f_101_110_111_010_1(uniques, 2);
+  f_101_110_111_011_0(uniques, 2);
+  f_101_110_111_011_1(uniques, 2);
+  f_101_110_111_100_0(uniques, 2);
+  f_101_110_111_100_1(uniques, 2);
+  f_101_110_111_101_0(uniques, 2);
+  f_101_110_111_101_1(uniques, 2);
+  f_101_110_111_110_0(uniques, 2);
+  f_101_110_111_110_1(uniques, 2);
+  f_101_110_111_111_0(uniques, 2);
+  f_101_110_111_111_1(uniques, 2);
+  f_101_111_000_000_0(uniques, 2);
+  f_101_111_000_000_1(uniques, 2);
+  f_101_111_000_001_0(uniques, 2);
+  f_101_111_000_001_1(uniques, 2);
+  f_101_111_000_010_0(uniques, 2);
+  f_101_111_000_010_1(uniques, 2);
+  f_101_111_000_011_0(uniques, 2);
+  f_101_111_000_011_1(uniques, 2);
+  f_101_111_000_100_0(uniques, 2);
+  f_101_111_000_100_1(uniques, 2);
+  f_101_111_000_101_0(uniques, 2);
+  f_101_111_000_101_1(uniques, 2);
+  f_101_111_000_110_0(uniques, 2);
+  f_101_111_000_110_1(uniques, 2);
+  f_101_111_000_111_0(uniques, 2);
+  f_101_111_000_111_1(uniques, 2);
+  f_101_111_001_000_0(uniques, 2);
+  f_101_111_001_000_1(uniques, 2);
+  f_101_111_001_001_0(uniques, 2);
+  f_101_111_001_001_1(uniques, 2);
+  f_101_111_001_010_0(uniques, 2);
+  f_101_111_001_010_1(uniques, 2);
+  f_101_111_001_011_0(uniques, 2);
+  f_101_111_001_011_1(uniques, 2);
+  f_101_111_001_100_0(uniques, 2);
+  f_101_111_001_100_1(uniques, 2);
+  f_101_111_001_101_0(uniques, 2);
+  f_101_111_001_101_1(uniques, 2);
+  f_101_111_001_110_0(uniques, 2);
+  f_101_111_001_110_1(uniques, 2);
+  f_101_111_001_111_0(uniques, 2);
+  f_101_111_001_111_1(uniques, 2);
+  f_101_111_010_000_0(uniques, 2);
+  f_101_111_010_000_1(uniques, 2);
+  f_101_111_010_001_0(uniques, 2);
+  f_101_111_010_001_1(uniques, 2);
+  f_101_111_010_010_0(uniques, 2);
+  f_101_111_010_010_1(uniques, 2);
+  f_101_111_010_011_0(uniques, 2);
+  f_101_111_010_011_1(uniques, 2);
+  f_101_111_010_100_0(uniques, 2);
+  f_101_111_010_100_1(uniques, 2);
+  f_101_111_010_101_0(uniques, 2);
+  f_101_111_010_101_1(uniques, 2);
+  f_101_111_010_110_0(uniques, 2);
+  f_101_111_010_110_1(uniques, 2);
+  f_101_111_010_111_0(uniques, 2);
+  f_101_111_010_111_1(uniques, 2);
+  f_101_111_011_000_0(uniques, 2);
+  f_101_111_011_000_1(uniques, 2);
+  f_101_111_011_001_0(uniques, 2);
+  f_101_111_011_001_1(uniques, 2);
+  f_101_111_011_010_0(uniques, 2);
+  f_101_111_011_010_1(uniques, 2);
+  f_101_111_011_011_0(uniques, 2);
+  f_101_111_011_011_1(uniques, 2);
+  f_101_111_011_100_0(uniques, 2);
+  f_101_111_011_100_1(uniques, 2);
+  f_101_111_011_101_0(uniques, 2);
+  f_101_111_011_101_1(uniques, 2);
+  f_101_111_011_110_0(uniques, 2);
+  f_101_111_011_110_1(uniques, 2);
+  f_101_111_011_111_0(uniques, 2);
+  f_101_111_011_111_1(uniques, 2);
+  f_101_111_100_000_0(uniques, 2);
+  f_101_111_100_000_1(uniques, 2);
+  f_101_111_100_001_0(uniques, 2);
+  f_101_111_100_001_1(uniques, 2);
+  f_101_111_100_010_0(uniques, 2);
+  f_101_111_100_010_1(uniques, 2);
+  f_101_111_100_011_0(uniques, 2);
+  f_101_111_100_011_1(uniques, 2);
+  f_101_111_100_100_0(uniques, 2);
+  f_101_111_100_100_1(uniques, 2);
+  f_101_111_100_101_0(uniques, 2);
+  f_101_111_100_101_1(uniques, 2);
+  f_101_111_100_110_0(uniques, 2);
+  f_101_111_100_110_1(uniques, 2);
+  f_101_111_100_111_0(uniques, 2);
+  f_101_111_100_111_1(uniques, 2);
+  f_101_111_101_000_0(uniques, 2);
+  f_101_111_101_000_1(uniques, 2);
+  f_101_111_101_001_0(uniques, 2);
+  f_101_111_101_001_1(uniques, 2);
+  f_101_111_101_010_0(uniques, 2);
+  f_101_111_101_010_1(uniques, 2);
+  f_101_111_101_011_0(uniques, 2);
+  f_101_111_101_011_1(uniques, 2);
+  f_101_111_101_100_0(uniques, 2);
+  f_101_111_101_100_1(uniques, 2);
+  f_101_111_101_101_0(uniques, 2);
+  f_101_111_101_101_1(uniques, 2);
+  f_101_111_101_110_0(uniques, 2);
+  f_101_111_101_110_1(uniques, 2);
+  f_101_111_101_111_0(uniques, 2);
+  f_101_111_101_111_1(uniques, 2);
+  f_101_111_110_000_0(uniques, 2);
+  f_101_111_110_000_1(uniques, 2);
+  f_101_111_110_001_0(uniques, 2);
+  f_101_111_110_001_1(uniques, 2);
+  f_101_111_110_010_0(uniques, 2);
+  f_101_111_110_010_1(uniques, 2);
+  f_101_111_110_011_0(uniques, 2);
+  f_101_111_110_011_1(uniques, 2);
+  f_101_111_110_100_0(uniques, 2);
+  f_101_111_110_100_1(uniques, 2);
+  f_101_111_110_101_0(uniques, 2);
+  f_101_111_110_101_1(uniques, 2);
+  f_101_111_110_110_0(uniques, 2);
+  f_101_111_110_110_1(uniques, 2);
+  f_101_111_110_111_0(uniques, 2);
+  f_101_111_110_111_1(uniques, 2);
+  f_101_111_111_000_0(uniques, 2);
+  f_101_111_111_000_1(uniques, 2);
+  f_101_111_111_001_0(uniques, 2);
+  f_101_111_111_001_1(uniques, 2);
+  f_101_111_111_010_0(uniques, 2);
+  f_101_111_111_010_1(uniques, 2);
+  f_101_111_111_011_0(uniques, 2);
+  f_101_111_111_011_1(uniques, 2);
+  f_101_111_111_100_0(uniques, 2);
+  f_101_111_111_100_1(uniques, 2);
+  f_101_111_111_101_0(uniques, 2);
+  f_101_111_111_101_1(uniques, 2);
+  f_101_111_111_110_0(uniques, 2);
+  f_101_111_111_110_1(uniques, 2);
+  f_101_111_111_111_0(uniques, 2);
+  f_101_111_111_111_1(uniques, 2);
+  f_111_000_000_000_0(uniques, 2);
+  f_111_000_000_000_1(uniques, 2);
+  f_111_000_000_001_0(uniques, 2);
+  f_111_000_000_001_1(uniques, 2);
+  f_111_000_000_010_0(uniques, 2);
+  f_111_000_000_010_1(uniques, 2);
+  f_111_000_000_011_0(uniques, 2);
+  f_111_000_000_011_1(uniques, 2);
+  f_111_000_000_100_0(uniques, 2);
+  f_111_000_000_100_1(uniques, 2);
+  f_111_000_000_101_0(uniques, 2);
+  f_111_000_000_101_1(uniques, 2);
+  f_111_000_000_110_0(uniques, 2);
+  f_111_000_000_110_1(uniques, 2);
+  f_111_000_000_111_0(uniques, 2);
+  f_111_000_000_111_1(uniques, 2);
+  f_111_000_001_000_0(uniques, 2);
+  f_111_000_001_000_1(uniques, 2);
+  f_111_000_001_001_0(uniques, 2);
+  f_111_000_001_001_1(uniques, 2);
+  f_111_000_001_010_0(uniques, 2);
+  f_111_000_001_010_1(uniques, 2);
+  f_111_000_001_011_0(uniques, 2);
+  f_111_000_001_011_1(uniques, 2);
+  f_111_000_001_100_0(uniques, 2);
+  f_111_000_001_100_1(uniques, 2);
+  f_111_000_001_101_0(uniques, 2);
+  f_111_000_001_101_1(uniques, 2);
+  f_111_000_001_110_0(uniques, 2);
+  f_111_000_001_110_1(uniques, 2);
+  f_111_000_001_111_0(uniques, 2);
+  f_111_000_001_111_1(uniques, 2);
+  f_111_000_010_000_0(uniques, 2);
+  f_111_000_010_000_1(uniques, 2);
+  f_111_000_010_001_0(uniques, 2);
+  f_111_000_010_001_1(uniques, 2);
+  f_111_000_010_010_0(uniques, 2);
+  f_111_000_010_010_1(uniques, 2);
+  f_111_000_010_011_0(uniques, 2);
+  f_111_000_010_011_1(uniques, 2);
+  f_111_000_010_100_0(uniques, 2);
+  f_111_000_010_100_1(uniques, 2);
+  f_111_000_010_101_0(uniques, 2);
+  f_111_000_010_101_1(uniques, 2);
+  f_111_000_010_110_0(uniques, 2);
+  f_111_000_010_110_1(uniques, 2);
+  f_111_000_010_111_0(uniques, 2);
+  f_111_000_010_111_1(uniques, 2);
+  f_111_000_011_000_0(uniques, 2);
+  f_111_000_011_000_1(uniques, 2);
+  f_111_000_011_001_0(uniques, 2);
+  f_111_000_011_001_1(uniques, 2);
+  f_111_000_011_010_0(uniques, 2);
+  f_111_000_011_010_1(uniques, 2);
+  f_111_000_011_011_0(uniques, 2);
+  f_111_000_011_011_1(uniques, 2);
+  f_111_000_011_100_0(uniques, 2);
+  f_111_000_011_100_1(uniques, 2);
+  f_111_000_011_101_0(uniques, 2);
+  f_111_000_011_101_1(uniques, 2);
+  f_111_000_011_110_0(uniques, 2);
+  f_111_000_011_110_1(uniques, 2);
+  f_111_000_011_111_0(uniques, 2);
+  f_111_000_011_111_1(uniques, 2);
+  f_111_000_100_000_0(uniques, 2);
+  f_111_000_100_000_1(uniques, 2);
+  f_111_000_100_001_0(uniques, 2);
+  f_111_000_100_001_1(uniques, 2);
+  f_111_000_100_010_0(uniques, 2);
+  f_111_000_100_010_1(uniques, 2);
+  f_111_000_100_011_0(uniques, 2);
+  f_111_000_100_011_1(uniques, 2);
+  f_111_000_100_100_0(uniques, 2);
+  f_111_000_100_100_1(uniques, 2);
+  f_111_000_100_101_0(uniques, 2);
+  f_111_000_100_101_1(uniques, 2);
+  f_111_000_100_110_0(uniques, 2);
+  f_111_000_100_110_1(uniques, 2);
+  f_111_000_100_111_0(uniques, 2);
+  f_111_000_100_111_1(uniques, 2);
+  f_111_000_101_000_0(uniques, 2);
+  f_111_000_101_000_1(uniques, 2);
+  f_111_000_101_001_0(uniques, 2);
+  f_111_000_101_001_1(uniques, 2);
+  f_111_000_101_010_0(uniques, 2);
+  f_111_000_101_010_1(uniques, 2);
+  f_111_000_101_011_0(uniques, 2);
+  f_111_000_101_011_1(uniques, 2);
+  f_111_000_101_100_0(uniques, 2);
+  f_111_000_101_100_1(uniques, 2);
+  f_111_000_101_101_0(uniques, 2);
+  f_111_000_101_101_1(uniques, 2);
+  f_111_000_101_110_0(uniques, 2);
+  f_111_000_101_110_1(uniques, 2);
+  f_111_000_101_111_0(uniques, 2);
+  f_111_000_101_111_1(uniques, 2);
+  f_111_000_110_000_0(uniques, 2);
+  f_111_000_110_000_1(uniques, 2);
+  f_111_000_110_001_0(uniques, 2);
+  f_111_000_110_001_1(uniques, 2);
+  f_111_000_110_010_0(uniques, 2);
+  f_111_000_110_010_1(uniques, 2);
+  f_111_000_110_011_0(uniques, 2);
+  f_111_000_110_011_1(uniques, 2);
+  f_111_000_110_100_0(uniques, 2);
+  f_111_000_110_100_1(uniques, 2);
+  f_111_000_110_101_0(uniques, 2);
+  f_111_000_110_101_1(uniques, 2);
+  f_111_000_110_110_0(uniques, 2);
+  f_111_000_110_110_1(uniques, 2);
+  f_111_000_110_111_0(uniques, 2);
+  f_111_000_110_111_1(uniques, 2);
+  f_111_000_111_000_0(uniques, 2);
+  f_111_000_111_000_1(uniques, 2);
+  f_111_000_111_001_0(uniques, 2);
+  f_111_000_111_001_1(uniques, 2);
+  f_111_000_111_010_0(uniques, 2);
+  f_111_000_111_010_1(uniques, 2);
+  f_111_000_111_011_0(uniques, 2);
+  f_111_000_111_011_1(uniques, 2);
+  f_111_000_111_100_0(uniques, 2);
+  f_111_000_111_100_1(uniques, 2);
+  f_111_000_111_101_0(uniques, 2);
+  f_111_000_111_101_1(uniques, 2);
+  f_111_000_111_110_0(uniques, 2);
+  f_111_000_111_110_1(uniques, 2);
+  f_111_000_111_111_0(uniques, 2);
+  f_111_000_111_111_1(uniques, 2);
+  f_111_001_000_000_0(uniques, 2);
+  f_111_001_000_000_1(uniques, 2);
+  f_111_001_000_001_0(uniques, 2);
+  f_111_001_000_001_1(uniques, 2);
+  f_111_001_000_010_0(uniques, 2);
+  f_111_001_000_010_1(uniques, 2);
+  f_111_001_000_011_0(uniques, 2);
+  f_111_001_000_011_1(uniques, 2);
+  f_111_001_000_100_0(uniques, 2);
+  f_111_001_000_100_1(uniques, 2);
+  f_111_001_000_101_0(uniques, 2);
+  f_111_001_000_101_1(uniques, 2);
+  f_111_001_000_110_0(uniques, 2);
+  f_111_001_000_110_1(uniques, 2);
+  f_111_001_000_111_0(uniques, 2);
+  f_111_001_000_111_1(uniques, 2);
+  f_111_001_001_000_0(uniques, 2);
+  f_111_001_001_000_1(uniques, 2);
+  f_111_001_001_001_0(uniques, 2);
+  f_111_001_001_001_1(uniques, 2);
+  f_111_001_001_010_0(uniques, 2);
+  f_111_001_001_010_1(uniques, 2);
+  f_111_001_001_011_0(uniques, 2);
+  f_111_001_001_011_1(uniques, 2);
+  f_111_001_001_100_0(uniques, 2);
+  f_111_001_001_100_1(uniques, 2);
+  f_111_001_001_101_0(uniques, 2);
+  f_111_001_001_101_1(uniques, 2);
+  f_111_001_001_110_0(uniques, 2);
+  f_111_001_001_110_1(uniques, 2);
+  f_111_001_001_111_0(uniques, 2);
+  f_111_001_001_111_1(uniques, 2);
+  f_111_001_010_000_0(uniques, 2);
+  f_111_001_010_000_1(uniques, 2);
+  f_111_001_010_001_0(uniques, 2);
+  f_111_001_010_001_1(uniques, 2);
+  f_111_001_010_010_0(uniques, 2);
+  f_111_001_010_010_1(uniques, 2);
+  f_111_001_010_011_0(uniques, 2);
+  f_111_001_010_011_1(uniques, 2);
+  f_111_001_010_100_0(uniques, 2);
+  f_111_001_010_100_1(uniques, 2);
+  f_111_001_010_101_0(uniques, 2);
+  f_111_001_010_101_1(uniques, 2);
+  f_111_001_010_110_0(uniques, 2);
+  f_111_001_010_110_1(uniques, 2);
+  f_111_001_010_111_0(uniques, 2);
+  f_111_001_010_111_1(uniques, 2);
+  f_111_001_011_000_0(uniques, 2);
+  f_111_001_011_000_1(uniques, 2);
+  f_111_001_011_001_0(uniques, 2);
+  f_111_001_011_001_1(uniques, 2);
+  f_111_001_011_010_0(uniques, 2);
+  f_111_001_011_010_1(uniques, 2);
+  f_111_001_011_011_0(uniques, 2);
+  f_111_001_011_011_1(uniques, 2);
+  f_111_001_011_100_0(uniques, 2);
+  f_111_001_011_100_1(uniques, 2);
+  f_111_001_011_101_0(uniques, 2);
+  f_111_001_011_101_1(uniques, 2);
+  f_111_001_011_110_0(uniques, 2);
+  f_111_001_011_110_1(uniques, 2);
+  f_111_001_011_111_0(uniques, 2);
+  f_111_001_011_111_1(uniques, 2);
+  f_111_001_100_000_0(uniques, 2);
+  f_111_001_100_000_1(uniques, 2);
+  f_111_001_100_001_0(uniques, 2);
+  f_111_001_100_001_1(uniques, 2);
+  f_111_001_100_010_0(uniques, 2);
+  f_111_001_100_010_1(uniques, 2);
+  f_111_001_100_011_0(uniques, 2);
+  f_111_001_100_011_1(uniques, 2);
+  f_111_001_100_100_0(uniques, 2);
+  f_111_001_100_100_1(uniques, 2);
+  f_111_001_100_101_0(uniques, 2);
+  f_111_001_100_101_1(uniques, 2);
+  f_111_001_100_110_0(uniques, 2);
+  f_111_001_100_110_1(uniques, 2);
+  f_111_001_100_111_0(uniques, 2);
+  f_111_001_100_111_1(uniques, 2);
+  f_111_001_101_000_0(uniques, 2);
+  f_111_001_101_000_1(uniques, 2);
+  f_111_001_101_001_0(uniques, 2);
+  f_111_001_101_001_1(uniques, 2);
+  f_111_001_101_010_0(uniques, 2);
+  f_111_001_101_010_1(uniques, 2);
+  f_111_001_101_011_0(uniques, 2);
+  f_111_001_101_011_1(uniques, 2);
+  f_111_001_101_100_0(uniques, 2);
+  f_111_001_101_100_1(uniques, 2);
+  f_111_001_101_101_0(uniques, 2);
+  f_111_001_101_101_1(uniques, 2);
+  f_111_001_101_110_0(uniques, 2);
+  f_111_001_101_110_1(uniques, 2);
+  f_111_001_101_111_0(uniques, 2);
+  f_111_001_101_111_1(uniques, 2);
+  f_111_001_110_000_0(uniques, 2);
+  f_111_001_110_000_1(uniques, 2);
+  f_111_001_110_001_0(uniques, 2);
+  f_111_001_110_001_1(uniques, 2);
+  f_111_001_110_010_0(uniques, 2);
+  f_111_001_110_010_1(uniques, 2);
+  f_111_001_110_011_0(uniques, 2);
+  f_111_001_110_011_1(uniques, 2);
+  f_111_001_110_100_0(uniques, 2);
+  f_111_001_110_100_1(uniques, 2);
+  f_111_001_110_101_0(uniques, 2);
+  f_111_001_110_101_1(uniques, 2);
+  f_111_001_110_110_0(uniques, 2);
+  f_111_001_110_110_1(uniques, 2);
+  f_111_001_110_111_0(uniques, 2);
+  f_111_001_110_111_1(uniques, 2);
+  f_111_001_111_000_0(uniques, 2);
+  f_111_001_111_000_1(uniques, 2);
+  f_111_001_111_001_0(uniques, 2);
+  f_111_001_111_001_1(uniques, 2);
+  f_111_001_111_010_0(uniques, 2);
+  f_111_001_111_010_1(uniques, 2);
+  f_111_001_111_011_0(uniques, 2);
+  f_111_001_111_011_1(uniques, 2);
+  f_111_001_111_100_0(uniques, 2);
+  f_111_001_111_100_1(uniques, 2);
+  f_111_001_111_101_0(uniques, 2);
+  f_111_001_111_101_1(uniques, 2);
+  f_111_001_111_110_0(uniques, 2);
+  f_111_001_111_110_1(uniques, 2);
+  f_111_001_111_111_0(uniques, 2);
+  f_111_001_111_111_1(uniques, 2);
+  f_111_010_000_000_0(uniques, 2);
+  f_111_010_000_000_1(uniques, 2);
+  f_111_010_000_001_0(uniques, 2);
+  f_111_010_000_001_1(uniques, 2);
+  f_111_010_000_010_0(uniques, 2);
+  f_111_010_000_010_1(uniques, 2);
+  f_111_010_000_011_0(uniques, 2);
+  f_111_010_000_011_1(uniques, 2);
+  f_111_010_000_100_0(uniques, 2);
+  f_111_010_000_100_1(uniques, 2);
+  f_111_010_000_101_0(uniques, 2);
+  f_111_010_000_101_1(uniques, 2);
+  f_111_010_000_110_0(uniques, 2);
+  f_111_010_000_110_1(uniques, 2);
+  f_111_010_000_111_0(uniques, 2);
+  f_111_010_000_111_1(uniques, 2);
+  f_111_010_001_000_0(uniques, 2);
+  f_111_010_001_000_1(uniques, 2);
+  f_111_010_001_001_0(uniques, 2);
+  f_111_010_001_001_1(uniques, 2);
+  f_111_010_001_010_0(uniques, 2);
+  f_111_010_001_010_1(uniques, 2);
+  f_111_010_001_011_0(uniques, 2);
+  f_111_010_001_011_1(uniques, 2);
+  f_111_010_001_100_0(uniques, 2);
+  f_111_010_001_100_1(uniques, 2);
+  f_111_010_001_101_0(uniques, 2);
+  f_111_010_001_101_1(uniques, 2);
+  f_111_010_001_110_0(uniques, 2);
+  f_111_010_001_110_1(uniques, 2);
+  f_111_010_001_111_0(uniques, 2);
+  f_111_010_001_111_1(uniques, 2);
+  f_111_010_010_000_0(uniques, 2);
+  f_111_010_010_000_1(uniques, 2);
+  f_111_010_010_001_0(uniques, 2);
+  f_111_010_010_001_1(uniques, 2);
+  f_111_010_010_010_0(uniques, 2);
+  f_111_010_010_010_1(uniques, 2);
+  f_111_010_010_011_0(uniques, 2);
+  f_111_010_010_011_1(uniques, 2);
+  f_111_010_010_100_0(uniques, 2);
+  f_111_010_010_100_1(uniques, 2);
+  f_111_010_010_101_0(uniques, 2);
+  f_111_010_010_101_1(uniques, 2);
+  f_111_010_010_110_0(uniques, 2);
+  f_111_010_010_110_1(uniques, 2);
+  f_111_010_010_111_0(uniques, 2);
+  f_111_010_010_111_1(uniques, 2);
+  f_111_010_011_000_0(uniques, 2);
+  f_111_010_011_000_1(uniques, 2);
+  f_111_010_011_001_0(uniques, 2);
+  f_111_010_011_001_1(uniques, 2);
+  f_111_010_011_010_0(uniques, 2);
+  f_111_010_011_010_1(uniques, 2);
+  f_111_010_011_011_0(uniques, 2);
+  f_111_010_011_011_1(uniques, 2);
+  f_111_010_011_100_0(uniques, 2);
+  f_111_010_011_100_1(uniques, 2);
+  f_111_010_011_101_0(uniques, 2);
+  f_111_010_011_101_1(uniques, 2);
+  f_111_010_011_110_0(uniques, 2);
+  f_111_010_011_110_1(uniques, 2);
+  f_111_010_011_111_0(uniques, 2);
+  f_111_010_011_111_1(uniques, 2);
+  f_111_010_100_000_0(uniques, 2);
+  f_111_010_100_000_1(uniques, 2);
+  f_111_010_100_001_0(uniques, 2);
+  f_111_010_100_001_1(uniques, 2);
+  f_111_010_100_010_0(uniques, 2);
+  f_111_010_100_010_1(uniques, 2);
+  f_111_010_100_011_0(uniques, 2);
+  f_111_010_100_011_1(uniques, 2);
+  f_111_010_100_100_0(uniques, 2);
+  f_111_010_100_100_1(uniques, 2);
+  f_111_010_100_101_0(uniques, 2);
+  f_111_010_100_101_1(uniques, 2);
+  f_111_010_100_110_0(uniques, 2);
+  f_111_010_100_110_1(uniques, 2);
+  f_111_010_100_111_0(uniques, 2);
+  f_111_010_100_111_1(uniques, 2);
+  f_111_010_101_000_0(uniques, 2);
+  f_111_010_101_000_1(uniques, 2);
+  f_111_010_101_001_0(uniques, 2);
+  f_111_010_101_001_1(uniques, 2);
+  f_111_010_101_010_0(uniques, 2);
+  f_111_010_101_010_1(uniques, 2);
+  f_111_010_101_011_0(uniques, 2);
+  f_111_010_101_011_1(uniques, 2);
+  f_111_010_101_100_0(uniques, 2);
+  f_111_010_101_100_1(uniques, 2);
+  f_111_010_101_101_0(uniques, 2);
+  f_111_010_101_101_1(uniques, 2);
+  f_111_010_101_110_0(uniques, 2);
+  f_111_010_101_110_1(uniques, 2);
+  f_111_010_101_111_0(uniques, 2);
+  f_111_010_101_111_1(uniques, 2);
+  f_111_010_110_000_0(uniques, 2);
+  f_111_010_110_000_1(uniques, 2);
+  f_111_010_110_001_0(uniques, 2);
+  f_111_010_110_001_1(uniques, 2);
+  f_111_010_110_010_0(uniques, 2);
+  f_111_010_110_010_1(uniques, 2);
+  f_111_010_110_011_0(uniques, 2);
+  f_111_010_110_011_1(uniques, 2);
+  f_111_010_110_100_0(uniques, 2);
+  f_111_010_110_100_1(uniques, 2);
+  f_111_010_110_101_0(uniques, 2);
+  f_111_010_110_101_1(uniques, 2);
+  f_111_010_110_110_0(uniques, 2);
+  f_111_010_110_110_1(uniques, 2);
+  f_111_010_110_111_0(uniques, 2);
+  f_111_010_110_111_1(uniques, 2);
+  f_111_010_111_000_0(uniques, 2);
+  f_111_010_111_000_1(uniques, 2);
+  f_111_010_111_001_0(uniques, 2);
+  f_111_010_111_001_1(uniques, 2);
+  f_111_010_111_010_0(uniques, 2);
+  f_111_010_111_010_1(uniques, 2);
+  f_111_010_111_011_0(uniques, 2);
+  f_111_010_111_011_1(uniques, 2);
+  f_111_010_111_100_0(uniques, 2);
+  f_111_010_111_100_1(uniques, 2);
+  f_111_010_111_101_0(uniques, 2);
+  f_111_010_111_101_1(uniques, 2);
+  f_111_010_111_110_0(uniques, 2);
+  f_111_010_111_110_1(uniques, 2);
+  f_111_010_111_111_0(uniques, 2);
+  f_111_010_111_111_1(uniques, 2);
+  f_111_011_000_000_0(uniques, 2);
+  f_111_011_000_000_1(uniques, 2);
+  f_111_011_000_001_0(uniques, 2);
+  f_111_011_000_001_1(uniques, 2);
+  f_111_011_000_010_0(uniques, 2);
+  f_111_011_000_010_1(uniques, 2);
+  f_111_011_000_011_0(uniques, 2);
+  f_111_011_000_011_1(uniques, 2);
+  f_111_011_000_100_0(uniques, 2);
+  f_111_011_000_100_1(uniques, 2);
+  f_111_011_000_101_0(uniques, 2);
+  f_111_011_000_101_1(uniques, 2);
+  f_111_011_000_110_0(uniques, 2);
+  f_111_011_000_110_1(uniques, 2);
+  f_111_011_000_111_0(uniques, 2);
+  f_111_011_000_111_1(uniques, 2);
+  f_111_011_001_000_0(uniques, 2);
+  f_111_011_001_000_1(uniques, 2);
+  f_111_011_001_001_0(uniques, 2);
+  f_111_011_001_001_1(uniques, 2);
+  f_111_011_001_010_0(uniques, 2);
+  f_111_011_001_010_1(uniques, 2);
+  f_111_011_001_011_0(uniques, 2);
+  f_111_011_001_011_1(uniques, 2);
+  f_111_011_001_100_0(uniques, 2);
+  f_111_011_001_100_1(uniques, 2);
+  f_111_011_001_101_0(uniques, 2);
+  f_111_011_001_101_1(uniques, 2);
+  f_111_011_001_110_0(uniques, 2);
+  f_111_011_001_110_1(uniques, 2);
+  f_111_011_001_111_0(uniques, 2);
+  f_111_011_001_111_1(uniques, 2);
+  f_111_011_010_000_0(uniques, 2);
+  f_111_011_010_000_1(uniques, 2);
+  f_111_011_010_001_0(uniques, 2);
+  f_111_011_010_001_1(uniques, 2);
+  f_111_011_010_010_0(uniques, 2);
+  f_111_011_010_010_1(uniques, 2);
+  f_111_011_010_011_0(uniques, 2);
+  f_111_011_010_011_1(uniques, 2);
+  f_111_011_010_100_0(uniques, 2);
+  f_111_011_010_100_1(uniques, 2);
+  f_111_011_010_101_0(uniques, 2);
+  f_111_011_010_101_1(uniques, 2);
+  f_111_011_010_110_0(uniques, 2);
+  f_111_011_010_110_1(uniques, 2);
+  f_111_011_010_111_0(uniques, 2);
+  f_111_011_010_111_1(uniques, 2);
+  f_111_011_011_000_0(uniques, 2);
+  f_111_011_011_000_1(uniques, 2);
+  f_111_011_011_001_0(uniques, 2);
+  f_111_011_011_001_1(uniques, 2);
+  f_111_011_011_010_0(uniques, 2);
+  f_111_011_011_010_1(uniques, 2);
+  f_111_011_011_011_0(uniques, 2);
+  f_111_011_011_011_1(uniques, 2);
+  f_111_011_011_100_0(uniques, 2);
+  f_111_011_011_100_1(uniques, 2);
+  f_111_011_011_101_0(uniques, 2);
+  f_111_011_011_101_1(uniques, 2);
+  f_111_011_011_110_0(uniques, 2);
+  f_111_011_011_110_1(uniques, 2);
+  f_111_011_011_111_0(uniques, 2);
+  f_111_011_011_111_1(uniques, 2);
+  f_111_011_100_000_0(uniques, 2);
+  f_111_011_100_000_1(uniques, 2);
+  f_111_011_100_001_0(uniques, 2);
+  f_111_011_100_001_1(uniques, 2);
+  f_111_011_100_010_0(uniques, 2);
+  f_111_011_100_010_1(uniques, 2);
+  f_111_011_100_011_0(uniques, 2);
+  f_111_011_100_011_1(uniques, 2);
+  f_111_011_100_100_0(uniques, 2);
+  f_111_011_100_100_1(uniques, 2);
+  f_111_011_100_101_0(uniques, 2);
+  f_111_011_100_101_1(uniques, 2);
+  f_111_011_100_110_0(uniques, 2);
+  f_111_011_100_110_1(uniques, 2);
+  f_111_011_100_111_0(uniques, 2);
+  f_111_011_100_111_1(uniques, 2);
+  f_111_011_101_000_0(uniques, 2);
+  f_111_011_101_000_1(uniques, 2);
+  f_111_011_101_001_0(uniques, 2);
+  f_111_011_101_001_1(uniques, 2);
+  f_111_011_101_010_0(uniques, 2);
+  f_111_011_101_010_1(uniques, 2);
+  f_111_011_101_011_0(uniques, 2);
+  f_111_011_101_011_1(uniques, 2);
+  f_111_011_101_100_0(uniques, 2);
+  f_111_011_101_100_1(uniques, 2);
+  f_111_011_101_101_0(uniques, 2);
+  f_111_011_101_101_1(uniques, 2);
+  f_111_011_101_110_0(uniques, 2);
+  f_111_011_101_110_1(uniques, 2);
+  f_111_011_101_111_0(uniques, 2);
+  f_111_011_101_111_1(uniques, 2);
+  f_111_011_110_000_0(uniques, 2);
+  f_111_011_110_000_1(uniques, 2);
+  f_111_011_110_001_0(uniques, 2);
+  f_111_011_110_001_1(uniques, 2);
+  f_111_011_110_010_0(uniques, 2);
+  f_111_011_110_010_1(uniques, 2);
+  f_111_011_110_011_0(uniques, 2);
+  f_111_011_110_011_1(uniques, 2);
+  f_111_011_110_100_0(uniques, 2);
+  f_111_011_110_100_1(uniques, 2);
+  f_111_011_110_101_0(uniques, 2);
+  f_111_011_110_101_1(uniques, 2);
+  f_111_011_110_110_0(uniques, 2);
+  f_111_011_110_110_1(uniques, 2);
+  f_111_011_110_111_0(uniques, 2);
+  f_111_011_110_111_1(uniques, 2);
+  f_111_011_111_000_0(uniques, 2);
+  f_111_011_111_000_1(uniques, 2);
+  f_111_011_111_001_0(uniques, 2);
+  f_111_011_111_001_1(uniques, 2);
+  f_111_011_111_010_0(uniques, 2);
+  f_111_011_111_010_1(uniques, 2);
+  f_111_011_111_011_0(uniques, 2);
+  f_111_011_111_011_1(uniques, 2);
+  f_111_011_111_100_0(uniques, 2);
+  f_111_011_111_100_1(uniques, 2);
+  f_111_011_111_101_0(uniques, 2);
+  f_111_011_111_101_1(uniques, 2);
+  f_111_011_111_110_0(uniques, 2);
+  f_111_011_111_110_1(uniques, 2);
+  f_111_011_111_111_0(uniques, 2);
+  f_111_011_111_111_1(uniques, 2);
+  f_111_100_000_000_0(uniques, 2);
+  f_111_100_000_000_1(uniques, 2);
+  f_111_100_000_001_0(uniques, 2);
+  f_111_100_000_001_1(uniques, 2);
+  f_111_100_000_010_0(uniques, 2);
+  f_111_100_000_010_1(uniques, 2);
+  f_111_100_000_011_0(uniques, 2);
+  f_111_100_000_011_1(uniques, 2);
+  f_111_100_000_100_0(uniques, 2);
+  f_111_100_000_100_1(uniques, 2);
+  f_111_100_000_101_0(uniques, 2);
+  f_111_100_000_101_1(uniques, 2);
+  f_111_100_000_110_0(uniques, 2);
+  f_111_100_000_110_1(uniques, 2);
+  f_111_100_000_111_0(uniques, 2);
+  f_111_100_000_111_1(uniques, 2);
+  f_111_100_001_000_0(uniques, 2);
+  f_111_100_001_000_1(uniques, 2);
+  f_111_100_001_001_0(uniques, 2);
+  f_111_100_001_001_1(uniques, 2);
+  f_111_100_001_010_0(uniques, 2);
+  f_111_100_001_010_1(uniques, 2);
+  f_111_100_001_011_0(uniques, 2);
+  f_111_100_001_011_1(uniques, 2);
+  f_111_100_001_100_0(uniques, 2);
+  f_111_100_001_100_1(uniques, 2);
+  f_111_100_001_101_0(uniques, 2);
+  f_111_100_001_101_1(uniques, 2);
+  f_111_100_001_110_0(uniques, 2);
+  f_111_100_001_110_1(uniques, 2);
+  f_111_100_001_111_0(uniques, 2);
+  f_111_100_001_111_1(uniques, 2);
+  f_111_100_010_000_0(uniques, 2);
+  f_111_100_010_000_1(uniques, 2);
+  f_111_100_010_001_0(uniques, 2);
+  f_111_100_010_001_1(uniques, 2);
+  f_111_100_010_010_0(uniques, 2);
+  f_111_100_010_010_1(uniques, 2);
+  f_111_100_010_011_0(uniques, 2);
+  f_111_100_010_011_1(uniques, 2);
+  f_111_100_010_100_0(uniques, 2);
+  f_111_100_010_100_1(uniques, 2);
+  f_111_100_010_101_0(uniques, 2);
+  f_111_100_010_101_1(uniques, 2);
+  f_111_100_010_110_0(uniques, 2);
+  f_111_100_010_110_1(uniques, 2);
+  f_111_100_010_111_0(uniques, 2);
+  f_111_100_010_111_1(uniques, 2);
+  f_111_100_011_000_0(uniques, 2);
+  f_111_100_011_000_1(uniques, 2);
+  f_111_100_011_001_0(uniques, 2);
+  f_111_100_011_001_1(uniques, 2);
+  f_111_100_011_010_0(uniques, 2);
+  f_111_100_011_010_1(uniques, 2);
+  f_111_100_011_011_0(uniques, 2);
+  f_111_100_011_011_1(uniques, 2);
+  f_111_100_011_100_0(uniques, 2);
+  f_111_100_011_100_1(uniques, 2);
+  f_111_100_011_101_0(uniques, 2);
+  f_111_100_011_101_1(uniques, 2);
+  f_111_100_011_110_0(uniques, 2);
+  f_111_100_011_110_1(uniques, 2);
+  f_111_100_011_111_0(uniques, 2);
+  f_111_100_011_111_1(uniques, 2);
+  f_111_100_100_000_0(uniques, 2);
+  f_111_100_100_000_1(uniques, 2);
+  f_111_100_100_001_0(uniques, 2);
+  f_111_100_100_001_1(uniques, 2);
+  f_111_100_100_010_0(uniques, 2);
+  f_111_100_100_010_1(uniques, 2);
+  f_111_100_100_011_0(uniques, 2);
+  f_111_100_100_011_1(uniques, 2);
+  f_111_100_100_100_0(uniques, 2);
+  f_111_100_100_100_1(uniques, 2);
+  f_111_100_100_101_0(uniques, 2);
+  f_111_100_100_101_1(uniques, 2);
+  f_111_100_100_110_0(uniques, 2);
+  f_111_100_100_110_1(uniques, 2);
+  f_111_100_100_111_0(uniques, 2);
+  f_111_100_100_111_1(uniques, 2);
+  f_111_100_101_000_0(uniques, 2);
+  f_111_100_101_000_1(uniques, 2);
+  f_111_100_101_001_0(uniques, 2);
+  f_111_100_101_001_1(uniques, 2);
+  f_111_100_101_010_0(uniques, 2);
+  f_111_100_101_010_1(uniques, 2);
+  f_111_100_101_011_0(uniques, 2);
+  f_111_100_101_011_1(uniques, 2);
+  f_111_100_101_100_0(uniques, 2);
+  f_111_100_101_100_1(uniques, 2);
+  f_111_100_101_101_0(uniques, 2);
+  f_111_100_101_101_1(uniques, 2);
+  f_111_100_101_110_0(uniques, 2);
+  f_111_100_101_110_1(uniques, 2);
+  f_111_100_101_111_0(uniques, 2);
+  f_111_100_101_111_1(uniques, 2);
+  f_111_100_110_000_0(uniques, 2);
+  f_111_100_110_000_1(uniques, 2);
+  f_111_100_110_001_0(uniques, 2);
+  f_111_100_110_001_1(uniques, 2);
+  f_111_100_110_010_0(uniques, 2);
+  f_111_100_110_010_1(uniques, 2);
+  f_111_100_110_011_0(uniques, 2);
+  f_111_100_110_011_1(uniques, 2);
+  f_111_100_110_100_0(uniques, 2);
+  f_111_100_110_100_1(uniques, 2);
+  f_111_100_110_101_0(uniques, 2);
+  f_111_100_110_101_1(uniques, 2);
+  f_111_100_110_110_0(uniques, 2);
+  f_111_100_110_110_1(uniques, 2);
+  f_111_100_110_111_0(uniques, 2);
+  f_111_100_110_111_1(uniques, 2);
+  f_111_100_111_000_0(uniques, 2);
+  f_111_100_111_000_1(uniques, 2);
+  f_111_100_111_001_0(uniques, 2);
+  f_111_100_111_001_1(uniques, 2);
+  f_111_100_111_010_0(uniques, 2);
+  f_111_100_111_010_1(uniques, 2);
+  f_111_100_111_011_0(uniques, 2);
+  f_111_100_111_011_1(uniques, 2);
+  f_111_100_111_100_0(uniques, 2);
+  f_111_100_111_100_1(uniques, 2);
+  f_111_100_111_101_0(uniques, 2);
+  f_111_100_111_101_1(uniques, 2);
+  f_111_100_111_110_0(uniques, 2);
+  f_111_100_111_110_1(uniques, 2);
+  f_111_100_111_111_0(uniques, 2);
+  f_111_100_111_111_1(uniques, 2);
+  f_111_101_000_000_0(uniques, 2);
+  f_111_101_000_000_1(uniques, 2);
+  f_111_101_000_001_0(uniques, 2);
+  f_111_101_000_001_1(uniques, 2);
+  f_111_101_000_010_0(uniques, 2);
+  f_111_101_000_010_1(uniques, 2);
+  f_111_101_000_011_0(uniques, 2);
+  f_111_101_000_011_1(uniques, 2);
+  f_111_101_000_100_0(uniques, 2);
+  f_111_101_000_100_1(uniques, 2);
+  f_111_101_000_101_0(uniques, 2);
+  f_111_101_000_101_1(uniques, 2);
+  f_111_101_000_110_0(uniques, 2);
+  f_111_101_000_110_1(uniques, 2);
+  f_111_101_000_111_0(uniques, 2);
+  f_111_101_000_111_1(uniques, 2);
+  f_111_101_001_000_0(uniques, 2);
+  f_111_101_001_000_1(uniques, 2);
+  f_111_101_001_001_0(uniques, 2);
+  f_111_101_001_001_1(uniques, 2);
+  f_111_101_001_010_0(uniques, 2);
+  f_111_101_001_010_1(uniques, 2);
+  f_111_101_001_011_0(uniques, 2);
+  f_111_101_001_011_1(uniques, 2);
+  f_111_101_001_100_0(uniques, 2);
+  f_111_101_001_100_1(uniques, 2);
+  f_111_101_001_101_0(uniques, 2);
+  f_111_101_001_101_1(uniques, 2);
+  f_111_101_001_110_0(uniques, 2);
+  f_111_101_001_110_1(uniques, 2);
+  f_111_101_001_111_0(uniques, 2);
+  f_111_101_001_111_1(uniques, 2);
+  f_111_101_010_000_0(uniques, 2);
+  f_111_101_010_000_1(uniques, 2);
+  f_111_101_010_001_0(uniques, 2);
+  f_111_101_010_001_1(uniques, 2);
+  f_111_101_010_010_0(uniques, 2);
+  f_111_101_010_010_1(uniques, 2);
+  f_111_101_010_011_0(uniques, 2);
+  f_111_101_010_011_1(uniques, 2);
+  f_111_101_010_100_0(uniques, 2);
+  f_111_101_010_100_1(uniques, 2);
+  f_111_101_010_101_0(uniques, 2);
+  f_111_101_010_101_1(uniques, 2);
+  f_111_101_010_110_0(uniques, 2);
+  f_111_101_010_110_1(uniques, 2);
+  f_111_101_010_111_0(uniques, 2);
+  f_111_101_010_111_1(uniques, 2);
+  f_111_101_011_000_0(uniques, 2);
+  f_111_101_011_000_1(uniques, 2);
+  f_111_101_011_001_0(uniques, 2);
+  f_111_101_011_001_1(uniques, 2);
+  f_111_101_011_010_0(uniques, 2);
+  f_111_101_011_010_1(uniques, 2);
+  f_111_101_011_011_0(uniques, 2);
+  f_111_101_011_011_1(uniques, 2);
+  f_111_101_011_100_0(uniques, 2);
+  f_111_101_011_100_1(uniques, 2);
+  f_111_101_011_101_0(uniques, 2);
+  f_111_101_011_101_1(uniques, 2);
+  f_111_101_011_110_0(uniques, 2);
+  f_111_101_011_110_1(uniques, 2);
+  f_111_101_011_111_0(uniques, 2);
+  f_111_101_011_111_1(uniques, 2);
+  f_111_101_100_000_0(uniques, 2);
+  f_111_101_100_000_1(uniques, 2);
+  f_111_101_100_001_0(uniques, 2);
+  f_111_101_100_001_1(uniques, 2);
+  f_111_101_100_010_0(uniques, 2);
+  f_111_101_100_010_1(uniques, 2);
+  f_111_101_100_011_0(uniques, 2);
+  f_111_101_100_011_1(uniques, 2);
+  f_111_101_100_100_0(uniques, 2);
+  f_111_101_100_100_1(uniques, 2);
+  f_111_101_100_101_0(uniques, 2);
+  f_111_101_100_101_1(uniques, 2);
+  f_111_101_100_110_0(uniques, 2);
+  f_111_101_100_110_1(uniques, 2);
+  f_111_101_100_111_0(uniques, 2);
+  f_111_101_100_111_1(uniques, 2);
+  f_111_101_101_000_0(uniques, 2);
+  f_111_101_101_000_1(uniques, 2);
+  f_111_101_101_001_0(uniques, 2);
+  f_111_101_101_001_1(uniques, 2);
+  f_111_101_101_010_0(uniques, 2);
+  f_111_101_101_010_1(uniques, 2);
+  f_111_101_101_011_0(uniques, 2);
+  f_111_101_101_011_1(uniques, 2);
+  f_111_101_101_100_0(uniques, 2);
+  f_111_101_101_100_1(uniques, 2);
+  f_111_101_101_101_0(uniques, 2);
+  f_111_101_101_101_1(uniques, 2);
+  f_111_101_101_110_0(uniques, 2);
+  f_111_101_101_110_1(uniques, 2);
+  f_111_101_101_111_0(uniques, 2);
+  f_111_101_101_111_1(uniques, 2);
+  f_111_101_110_000_0(uniques, 2);
+  f_111_101_110_000_1(uniques, 2);
+  f_111_101_110_001_0(uniques, 2);
+  f_111_101_110_001_1(uniques, 2);
+  f_111_101_110_010_0(uniques, 2);
+  f_111_101_110_010_1(uniques, 2);
+  f_111_101_110_011_0(uniques, 2);
+  f_111_101_110_011_1(uniques, 2);
+  f_111_101_110_100_0(uniques, 2);
+  f_111_101_110_100_1(uniques, 2);
+  f_111_101_110_101_0(uniques, 2);
+  f_111_101_110_101_1(uniques, 2);
+  f_111_101_110_110_0(uniques, 2);
+  f_111_101_110_110_1(uniques, 2);
+  f_111_101_110_111_0(uniques, 2);
+  f_111_101_110_111_1(uniques, 2);
+  f_111_101_111_000_0(uniques, 2);
+  f_111_101_111_000_1(uniques, 2);
+  f_111_101_111_001_0(uniques, 2);
+  f_111_101_111_001_1(uniques, 2);
+  f_111_101_111_010_0(uniques, 2);
+  f_111_101_111_010_1(uniques, 2);
+  f_111_101_111_011_0(uniques, 2);
+  f_111_101_111_011_1(uniques, 2);
+  f_111_101_111_100_0(uniques, 2);
+  f_111_101_111_100_1(uniques, 2);
+  f_111_101_111_101_0(uniques, 2);
+  f_111_101_111_101_1(uniques, 2);
+  f_111_101_111_110_0(uniques, 2);
+  f_111_101_111_110_1(uniques, 2);
+  f_111_101_111_111_0(uniques, 2);
+  f_111_101_111_111_1(uniques, 2);
+  f_111_110_000_000_0(uniques, 2);
+  f_111_110_000_000_1(uniques, 2);
+  f_111_110_000_001_0(uniques, 2);
+  f_111_110_000_001_1(uniques, 2);
+  f_111_110_000_010_0(uniques, 2);
+  f_111_110_000_010_1(uniques, 2);
+  f_111_110_000_011_0(uniques, 2);
+  f_111_110_000_011_1(uniques, 2);
+  f_111_110_000_100_0(uniques, 2);
+  f_111_110_000_100_1(uniques, 2);
+  f_111_110_000_101_0(uniques, 2);
+  f_111_110_000_101_1(uniques, 2);
+  f_111_110_000_110_0(uniques, 2);
+  f_111_110_000_110_1(uniques, 2);
+  f_111_110_000_111_0(uniques, 2);
+  f_111_110_000_111_1(uniques, 2);
+  f_111_110_001_000_0(uniques, 2);
+  f_111_110_001_000_1(uniques, 2);
+  f_111_110_001_001_0(uniques, 2);
+  f_111_110_001_001_1(uniques, 2);
+  f_111_110_001_010_0(uniques, 2);
+  f_111_110_001_010_1(uniques, 2);
+  f_111_110_001_011_0(uniques, 2);
+  f_111_110_001_011_1(uniques, 2);
+  f_111_110_001_100_0(uniques, 2);
+  f_111_110_001_100_1(uniques, 2);
+  f_111_110_001_101_0(uniques, 2);
+  f_111_110_001_101_1(uniques, 2);
+  f_111_110_001_110_0(uniques, 2);
+  f_111_110_001_110_1(uniques, 2);
+  f_111_110_001_111_0(uniques, 2);
+  f_111_110_001_111_1(uniques, 2);
+  f_111_110_010_000_0(uniques, 2);
+  f_111_110_010_000_1(uniques, 2);
+  f_111_110_010_001_0(uniques, 2);
+  f_111_110_010_001_1(uniques, 2);
+  f_111_110_010_010_0(uniques, 2);
+  f_111_110_010_010_1(uniques, 2);
+  f_111_110_010_011_0(uniques, 2);
+  f_111_110_010_011_1(uniques, 2);
+  f_111_110_010_100_0(uniques, 2);
+  f_111_110_010_100_1(uniques, 2);
+  f_111_110_010_101_0(uniques, 2);
+  f_111_110_010_101_1(uniques, 2);
+  f_111_110_010_110_0(uniques, 2);
+  f_111_110_010_110_1(uniques, 2);
+  f_111_110_010_111_0(uniques, 2);
+  f_111_110_010_111_1(uniques, 2);
+  f_111_110_011_000_0(uniques, 2);
+  f_111_110_011_000_1(uniques, 2);
+  f_111_110_011_001_0(uniques, 2);
+  f_111_110_011_001_1(uniques, 2);
+  f_111_110_011_010_0(uniques, 2);
+  f_111_110_011_010_1(uniques, 2);
+  f_111_110_011_011_0(uniques, 2);
+  f_111_110_011_011_1(uniques, 2);
+  f_111_110_011_100_0(uniques, 2);
+  f_111_110_011_100_1(uniques, 2);
+  f_111_110_011_101_0(uniques, 2);
+  f_111_110_011_101_1(uniques, 2);
+  f_111_110_011_110_0(uniques, 2);
+  f_111_110_011_110_1(uniques, 2);
+  f_111_110_011_111_0(uniques, 2);
+  f_111_110_011_111_1(uniques, 2);
+  f_111_110_100_000_0(uniques, 2);
+  f_111_110_100_000_1(uniques, 2);
+  f_111_110_100_001_0(uniques, 2);
+  f_111_110_100_001_1(uniques, 2);
+  f_111_110_100_010_0(uniques, 2);
+  f_111_110_100_010_1(uniques, 2);
+  f_111_110_100_011_0(uniques, 2);
+  f_111_110_100_011_1(uniques, 2);
+  f_111_110_100_100_0(uniques, 2);
+  f_111_110_100_100_1(uniques, 2);
+  f_111_110_100_101_0(uniques, 2);
+  f_111_110_100_101_1(uniques, 2);
+  f_111_110_100_110_0(uniques, 2);
+  f_111_110_100_110_1(uniques, 2);
+  f_111_110_100_111_0(uniques, 2);
+  f_111_110_100_111_1(uniques, 2);
+  f_111_110_101_000_0(uniques, 2);
+  f_111_110_101_000_1(uniques, 2);
+  f_111_110_101_001_0(uniques, 2);
+  f_111_110_101_001_1(uniques, 2);
+  f_111_110_101_010_0(uniques, 2);
+  f_111_110_101_010_1(uniques, 2);
+  f_111_110_101_011_0(uniques, 2);
+  f_111_110_101_011_1(uniques, 2);
+  f_111_110_101_100_0(uniques, 2);
+  f_111_110_101_100_1(uniques, 2);
+  f_111_110_101_101_0(uniques, 2);
+  f_111_110_101_101_1(uniques, 2);
+  f_111_110_101_110_0(uniques, 2);
+  f_111_110_101_110_1(uniques, 2);
+  f_111_110_101_111_0(uniques, 2);
+  f_111_110_101_111_1(uniques, 2);
+  f_111_110_110_000_0(uniques, 2);
+  f_111_110_110_000_1(uniques, 2);
+  f_111_110_110_001_0(uniques, 2);
+  f_111_110_110_001_1(uniques, 2);
+  f_111_110_110_010_0(uniques, 2);
+  f_111_110_110_010_1(uniques, 2);
+  f_111_110_110_011_0(uniques, 2);
+  f_111_110_110_011_1(uniques, 2);
+  f_111_110_110_100_0(uniques, 2);
+  f_111_110_110_100_1(uniques, 2);
+  f_111_110_110_101_0(uniques, 2);
+  f_111_110_110_101_1(uniques, 2);
+  f_111_110_110_110_0(uniques, 2);
+  f_111_110_110_110_1(uniques, 2);
+  f_111_110_110_111_0(uniques, 2);
+  f_111_110_110_111_1(uniques, 2);
+  f_111_110_111_000_0(uniques, 2);
+  f_111_110_111_000_1(uniques, 2);
+  f_111_110_111_001_0(uniques, 2);
+  f_111_110_111_001_1(uniques, 2);
+  f_111_110_111_010_0(uniques, 2);
+  f_111_110_111_010_1(uniques, 2);
+  f_111_110_111_011_0(uniques, 2);
+  f_111_110_111_011_1(uniques, 2);
+  f_111_110_111_100_0(uniques, 2);
+  f_111_110_111_100_1(uniques, 2);
+  f_111_110_111_101_0(uniques, 2);
+  f_111_110_111_101_1(uniques, 2);
+  f_111_110_111_110_0(uniques, 2);
+  f_111_110_111_110_1(uniques, 2);
+  f_111_110_111_111_0(uniques, 2);
+  f_111_110_111_111_1(uniques, 2);
+  f_111_111_000_000_0(uniques, 2);
+  f_111_111_000_000_1(uniques, 2);
+  f_111_111_000_001_0(uniques, 2);
+  f_111_111_000_001_1(uniques, 2);
+  f_111_111_000_010_0(uniques, 2);
+  f_111_111_000_010_1(uniques, 2);
+  f_111_111_000_011_0(uniques, 2);
+  f_111_111_000_011_1(uniques, 2);
+  f_111_111_000_100_0(uniques, 2);
+  f_111_111_000_100_1(uniques, 2);
+  f_111_111_000_101_0(uniques, 2);
+  f_111_111_000_101_1(uniques, 2);
+  f_111_111_000_110_0(uniques, 2);
+  f_111_111_000_110_1(uniques, 2);
+  f_111_111_000_111_0(uniques, 2);
+  f_111_111_000_111_1(uniques, 2);
+  f_111_111_001_000_0(uniques, 2);
+  f_111_111_001_000_1(uniques, 2);
+  f_111_111_001_001_0(uniques, 2);
+  f_111_111_001_001_1(uniques, 2);
+  f_111_111_001_010_0(uniques, 2);
+  f_111_111_001_010_1(uniques, 2);
+  f_111_111_001_011_0(uniques, 2);
+  f_111_111_001_011_1(uniques, 2);
+  f_111_111_001_100_0(uniques, 2);
+  f_111_111_001_100_1(uniques, 2);
+  f_111_111_001_101_0(uniques, 2);
+  f_111_111_001_101_1(uniques, 2);
+  f_111_111_001_110_0(uniques, 2);
+  f_111_111_001_110_1(uniques, 2);
+  f_111_111_001_111_0(uniques, 2);
+  f_111_111_001_111_1(uniques, 2);
+  f_111_111_010_000_0(uniques, 2);
+  f_111_111_010_000_1(uniques, 2);
+  f_111_111_010_001_0(uniques, 2);
+  f_111_111_010_001_1(uniques, 2);
+  f_111_111_010_010_0(uniques, 2);
+  f_111_111_010_010_1(uniques, 2);
+  f_111_111_010_011_0(uniques, 2);
+  f_111_111_010_011_1(uniques, 2);
+  f_111_111_010_100_0(uniques, 2);
+  f_111_111_010_100_1(uniques, 2);
+  f_111_111_010_101_0(uniques, 2);
+  f_111_111_010_101_1(uniques, 2);
+  f_111_111_010_110_0(uniques, 2);
+  f_111_111_010_110_1(uniques, 2);
+  f_111_111_010_111_0(uniques, 2);
+  f_111_111_010_111_1(uniques, 2);
+  f_111_111_011_000_0(uniques, 2);
+  f_111_111_011_000_1(uniques, 2);
+  f_111_111_011_001_0(uniques, 2);
+  f_111_111_011_001_1(uniques, 2);
+  f_111_111_011_010_0(uniques, 2);
+  f_111_111_011_010_1(uniques, 2);
+  f_111_111_011_011_0(uniques, 2);
+  f_111_111_011_011_1(uniques, 2);
+  f_111_111_011_100_0(uniques, 2);
+  f_111_111_011_100_1(uniques, 2);
+  f_111_111_011_101_0(uniques, 2);
+  f_111_111_011_101_1(uniques, 2);
+  f_111_111_011_110_0(uniques, 2);
+  f_111_111_011_110_1(uniques, 2);
+  f_111_111_011_111_0(uniques, 2);
+  f_111_111_011_111_1(uniques, 2);
+  f_111_111_100_000_0(uniques, 2);
+  f_111_111_100_000_1(uniques, 2);
+  f_111_111_100_001_0(uniques, 2);
+  f_111_111_100_001_1(uniques, 2);
+  f_111_111_100_010_0(uniques, 2);
+  f_111_111_100_010_1(uniques, 2);
+  f_111_111_100_011_0(uniques, 2);
+  f_111_111_100_011_1(uniques, 2);
+  f_111_111_100_100_0(uniques, 2);
+  f_111_111_100_100_1(uniques, 2);
+  f_111_111_100_101_0(uniques, 2);
+  f_111_111_100_101_1(uniques, 2);
+  f_111_111_100_110_0(uniques, 2);
+  f_111_111_100_110_1(uniques, 2);
+  f_111_111_100_111_0(uniques, 2);
+  f_111_111_100_111_1(uniques, 2);
+  f_111_111_101_000_0(uniques, 2);
+  f_111_111_101_000_1(uniques, 2);
+  f_111_111_101_001_0(uniques, 2);
+  f_111_111_101_001_1(uniques, 2);
+  f_111_111_101_010_0(uniques, 2);
+  f_111_111_101_010_1(uniques, 2);
+  f_111_111_101_011_0(uniques, 2);
+  f_111_111_101_011_1(uniques, 2);
+  f_111_111_101_100_0(uniques, 2);
+  f_111_111_101_100_1(uniques, 2);
+  f_111_111_101_101_0(uniques, 2);
+  f_111_111_101_101_1(uniques, 2);
+  f_111_111_101_110_0(uniques, 2);
+  f_111_111_101_110_1(uniques, 2);
+  f_111_111_101_111_0(uniques, 2);
+  f_111_111_101_111_1(uniques, 2);
+  f_111_111_110_000_0(uniques, 2);
+  f_111_111_110_000_1(uniques, 2);
+  f_111_111_110_001_0(uniques, 2);
+  f_111_111_110_001_1(uniques, 2);
+  f_111_111_110_010_0(uniques, 2);
+  f_111_111_110_010_1(uniques, 2);
+  f_111_111_110_011_0(uniques, 2);
+  f_111_111_110_011_1(uniques, 2);
+  f_111_111_110_100_0(uniques, 2);
+  f_111_111_110_100_1(uniques, 2);
+  f_111_111_110_101_0(uniques, 2);
+  f_111_111_110_101_1(uniques, 2);
+  f_111_111_110_110_0(uniques, 2);
+  f_111_111_110_110_1(uniques, 2);
+  f_111_111_110_111_0(uniques, 2);
+  f_111_111_110_111_1(uniques, 2);
+  f_111_111_111_000_0(uniques, 2);
+  f_111_111_111_000_1(uniques, 2);
+  f_111_111_111_001_0(uniques, 2);
+  f_111_111_111_001_1(uniques, 2);
+  f_111_111_111_010_0(uniques, 2);
+  f_111_111_111_010_1(uniques, 2);
+  f_111_111_111_011_0(uniques, 2);
+  f_111_111_111_011_1(uniques, 2);
+  f_111_111_111_100_0(uniques, 2);
+  f_111_111_111_100_1(uniques, 2);
+  f_111_111_111_101_0(uniques, 2);
+  f_111_111_111_101_1(uniques, 2);
+  f_111_111_111_110_0(uniques, 2);
+  f_111_111_111_110_1(uniques, 2);
+  f_111_111_111_111_0(uniques, 2);
+  f_111_111_111_111_1(uniques, 2);
+  Expect.equals(4096, uniques.length);
+}
diff --git a/tests/dart2js/deferred/many_parts/lib_010_000_000_000_0.dart b/tests/dart2js/deferred/many_parts/lib_010_000_000_000_0.dart
new file mode 100644
index 0000000..045bcb9
--- /dev/null
+++ b/tests/dart2js/deferred/many_parts/lib_010_000_000_000_0.dart
@@ -0,0 +1,4111 @@
+// Copyright (c) 2020, 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:expect/expect.dart";
+
+import 'libB.dart';
+
+@pragma('dart2js:noInline')
+g_010_000_000_000_0() {
+  Set<String> uniques = {};
+
+  // f_*1*_***_***_***_*;
+  f_010_000_000_000_0(uniques, 1);
+  f_010_000_000_000_1(uniques, 1);
+  f_010_000_000_001_0(uniques, 1);
+  f_010_000_000_001_1(uniques, 1);
+  f_010_000_000_010_0(uniques, 1);
+  f_010_000_000_010_1(uniques, 1);
+  f_010_000_000_011_0(uniques, 1);
+  f_010_000_000_011_1(uniques, 1);
+  f_010_000_000_100_0(uniques, 1);
+  f_010_000_000_100_1(uniques, 1);
+  f_010_000_000_101_0(uniques, 1);
+  f_010_000_000_101_1(uniques, 1);
+  f_010_000_000_110_0(uniques, 1);
+  f_010_000_000_110_1(uniques, 1);
+  f_010_000_000_111_0(uniques, 1);
+  f_010_000_000_111_1(uniques, 1);
+  f_010_000_001_000_0(uniques, 1);
+  f_010_000_001_000_1(uniques, 1);
+  f_010_000_001_001_0(uniques, 1);
+  f_010_000_001_001_1(uniques, 1);
+  f_010_000_001_010_0(uniques, 1);
+  f_010_000_001_010_1(uniques, 1);
+  f_010_000_001_011_0(uniques, 1);
+  f_010_000_001_011_1(uniques, 1);
+  f_010_000_001_100_0(uniques, 1);
+  f_010_000_001_100_1(uniques, 1);
+  f_010_000_001_101_0(uniques, 1);
+  f_010_000_001_101_1(uniques, 1);
+  f_010_000_001_110_0(uniques, 1);
+  f_010_000_001_110_1(uniques, 1);
+  f_010_000_001_111_0(uniques, 1);
+  f_010_000_001_111_1(uniques, 1);
+  f_010_000_010_000_0(uniques, 1);
+  f_010_000_010_000_1(uniques, 1);
+  f_010_000_010_001_0(uniques, 1);
+  f_010_000_010_001_1(uniques, 1);
+  f_010_000_010_010_0(uniques, 1);
+  f_010_000_010_010_1(uniques, 1);
+  f_010_000_010_011_0(uniques, 1);
+  f_010_000_010_011_1(uniques, 1);
+  f_010_000_010_100_0(uniques, 1);
+  f_010_000_010_100_1(uniques, 1);
+  f_010_000_010_101_0(uniques, 1);
+  f_010_000_010_101_1(uniques, 1);
+  f_010_000_010_110_0(uniques, 1);
+  f_010_000_010_110_1(uniques, 1);
+  f_010_000_010_111_0(uniques, 1);
+  f_010_000_010_111_1(uniques, 1);
+  f_010_000_011_000_0(uniques, 1);
+  f_010_000_011_000_1(uniques, 1);
+  f_010_000_011_001_0(uniques, 1);
+  f_010_000_011_001_1(uniques, 1);
+  f_010_000_011_010_0(uniques, 1);
+  f_010_000_011_010_1(uniques, 1);
+  f_010_000_011_011_0(uniques, 1);
+  f_010_000_011_011_1(uniques, 1);
+  f_010_000_011_100_0(uniques, 1);
+  f_010_000_011_100_1(uniques, 1);
+  f_010_000_011_101_0(uniques, 1);
+  f_010_000_011_101_1(uniques, 1);
+  f_010_000_011_110_0(uniques, 1);
+  f_010_000_011_110_1(uniques, 1);
+  f_010_000_011_111_0(uniques, 1);
+  f_010_000_011_111_1(uniques, 1);
+  f_010_000_100_000_0(uniques, 1);
+  f_010_000_100_000_1(uniques, 1);
+  f_010_000_100_001_0(uniques, 1);
+  f_010_000_100_001_1(uniques, 1);
+  f_010_000_100_010_0(uniques, 1);
+  f_010_000_100_010_1(uniques, 1);
+  f_010_000_100_011_0(uniques, 1);
+  f_010_000_100_011_1(uniques, 1);
+  f_010_000_100_100_0(uniques, 1);
+  f_010_000_100_100_1(uniques, 1);
+  f_010_000_100_101_0(uniques, 1);
+  f_010_000_100_101_1(uniques, 1);
+  f_010_000_100_110_0(uniques, 1);
+  f_010_000_100_110_1(uniques, 1);
+  f_010_000_100_111_0(uniques, 1);
+  f_010_000_100_111_1(uniques, 1);
+  f_010_000_101_000_0(uniques, 1);
+  f_010_000_101_000_1(uniques, 1);
+  f_010_000_101_001_0(uniques, 1);
+  f_010_000_101_001_1(uniques, 1);
+  f_010_000_101_010_0(uniques, 1);
+  f_010_000_101_010_1(uniques, 1);
+  f_010_000_101_011_0(uniques, 1);
+  f_010_000_101_011_1(uniques, 1);
+  f_010_000_101_100_0(uniques, 1);
+  f_010_000_101_100_1(uniques, 1);
+  f_010_000_101_101_0(uniques, 1);
+  f_010_000_101_101_1(uniques, 1);
+  f_010_000_101_110_0(uniques, 1);
+  f_010_000_101_110_1(uniques, 1);
+  f_010_000_101_111_0(uniques, 1);
+  f_010_000_101_111_1(uniques, 1);
+  f_010_000_110_000_0(uniques, 1);
+  f_010_000_110_000_1(uniques, 1);
+  f_010_000_110_001_0(uniques, 1);
+  f_010_000_110_001_1(uniques, 1);
+  f_010_000_110_010_0(uniques, 1);
+  f_010_000_110_010_1(uniques, 1);
+  f_010_000_110_011_0(uniques, 1);
+  f_010_000_110_011_1(uniques, 1);
+  f_010_000_110_100_0(uniques, 1);
+  f_010_000_110_100_1(uniques, 1);
+  f_010_000_110_101_0(uniques, 1);
+  f_010_000_110_101_1(uniques, 1);
+  f_010_000_110_110_0(uniques, 1);
+  f_010_000_110_110_1(uniques, 1);
+  f_010_000_110_111_0(uniques, 1);
+  f_010_000_110_111_1(uniques, 1);
+  f_010_000_111_000_0(uniques, 1);
+  f_010_000_111_000_1(uniques, 1);
+  f_010_000_111_001_0(uniques, 1);
+  f_010_000_111_001_1(uniques, 1);
+  f_010_000_111_010_0(uniques, 1);
+  f_010_000_111_010_1(uniques, 1);
+  f_010_000_111_011_0(uniques, 1);
+  f_010_000_111_011_1(uniques, 1);
+  f_010_000_111_100_0(uniques, 1);
+  f_010_000_111_100_1(uniques, 1);
+  f_010_000_111_101_0(uniques, 1);
+  f_010_000_111_101_1(uniques, 1);
+  f_010_000_111_110_0(uniques, 1);
+  f_010_000_111_110_1(uniques, 1);
+  f_010_000_111_111_0(uniques, 1);
+  f_010_000_111_111_1(uniques, 1);
+  f_010_001_000_000_0(uniques, 1);
+  f_010_001_000_000_1(uniques, 1);
+  f_010_001_000_001_0(uniques, 1);
+  f_010_001_000_001_1(uniques, 1);
+  f_010_001_000_010_0(uniques, 1);
+  f_010_001_000_010_1(uniques, 1);
+  f_010_001_000_011_0(uniques, 1);
+  f_010_001_000_011_1(uniques, 1);
+  f_010_001_000_100_0(uniques, 1);
+  f_010_001_000_100_1(uniques, 1);
+  f_010_001_000_101_0(uniques, 1);
+  f_010_001_000_101_1(uniques, 1);
+  f_010_001_000_110_0(uniques, 1);
+  f_010_001_000_110_1(uniques, 1);
+  f_010_001_000_111_0(uniques, 1);
+  f_010_001_000_111_1(uniques, 1);
+  f_010_001_001_000_0(uniques, 1);
+  f_010_001_001_000_1(uniques, 1);
+  f_010_001_001_001_0(uniques, 1);
+  f_010_001_001_001_1(uniques, 1);
+  f_010_001_001_010_0(uniques, 1);
+  f_010_001_001_010_1(uniques, 1);
+  f_010_001_001_011_0(uniques, 1);
+  f_010_001_001_011_1(uniques, 1);
+  f_010_001_001_100_0(uniques, 1);
+  f_010_001_001_100_1(uniques, 1);
+  f_010_001_001_101_0(uniques, 1);
+  f_010_001_001_101_1(uniques, 1);
+  f_010_001_001_110_0(uniques, 1);
+  f_010_001_001_110_1(uniques, 1);
+  f_010_001_001_111_0(uniques, 1);
+  f_010_001_001_111_1(uniques, 1);
+  f_010_001_010_000_0(uniques, 1);
+  f_010_001_010_000_1(uniques, 1);
+  f_010_001_010_001_0(uniques, 1);
+  f_010_001_010_001_1(uniques, 1);
+  f_010_001_010_010_0(uniques, 1);
+  f_010_001_010_010_1(uniques, 1);
+  f_010_001_010_011_0(uniques, 1);
+  f_010_001_010_011_1(uniques, 1);
+  f_010_001_010_100_0(uniques, 1);
+  f_010_001_010_100_1(uniques, 1);
+  f_010_001_010_101_0(uniques, 1);
+  f_010_001_010_101_1(uniques, 1);
+  f_010_001_010_110_0(uniques, 1);
+  f_010_001_010_110_1(uniques, 1);
+  f_010_001_010_111_0(uniques, 1);
+  f_010_001_010_111_1(uniques, 1);
+  f_010_001_011_000_0(uniques, 1);
+  f_010_001_011_000_1(uniques, 1);
+  f_010_001_011_001_0(uniques, 1);
+  f_010_001_011_001_1(uniques, 1);
+  f_010_001_011_010_0(uniques, 1);
+  f_010_001_011_010_1(uniques, 1);
+  f_010_001_011_011_0(uniques, 1);
+  f_010_001_011_011_1(uniques, 1);
+  f_010_001_011_100_0(uniques, 1);
+  f_010_001_011_100_1(uniques, 1);
+  f_010_001_011_101_0(uniques, 1);
+  f_010_001_011_101_1(uniques, 1);
+  f_010_001_011_110_0(uniques, 1);
+  f_010_001_011_110_1(uniques, 1);
+  f_010_001_011_111_0(uniques, 1);
+  f_010_001_011_111_1(uniques, 1);
+  f_010_001_100_000_0(uniques, 1);
+  f_010_001_100_000_1(uniques, 1);
+  f_010_001_100_001_0(uniques, 1);
+  f_010_001_100_001_1(uniques, 1);
+  f_010_001_100_010_0(uniques, 1);
+  f_010_001_100_010_1(uniques, 1);
+  f_010_001_100_011_0(uniques, 1);
+  f_010_001_100_011_1(uniques, 1);
+  f_010_001_100_100_0(uniques, 1);
+  f_010_001_100_100_1(uniques, 1);
+  f_010_001_100_101_0(uniques, 1);
+  f_010_001_100_101_1(uniques, 1);
+  f_010_001_100_110_0(uniques, 1);
+  f_010_001_100_110_1(uniques, 1);
+  f_010_001_100_111_0(uniques, 1);
+  f_010_001_100_111_1(uniques, 1);
+  f_010_001_101_000_0(uniques, 1);
+  f_010_001_101_000_1(uniques, 1);
+  f_010_001_101_001_0(uniques, 1);
+  f_010_001_101_001_1(uniques, 1);
+  f_010_001_101_010_0(uniques, 1);
+  f_010_001_101_010_1(uniques, 1);
+  f_010_001_101_011_0(uniques, 1);
+  f_010_001_101_011_1(uniques, 1);
+  f_010_001_101_100_0(uniques, 1);
+  f_010_001_101_100_1(uniques, 1);
+  f_010_001_101_101_0(uniques, 1);
+  f_010_001_101_101_1(uniques, 1);
+  f_010_001_101_110_0(uniques, 1);
+  f_010_001_101_110_1(uniques, 1);
+  f_010_001_101_111_0(uniques, 1);
+  f_010_001_101_111_1(uniques, 1);
+  f_010_001_110_000_0(uniques, 1);
+  f_010_001_110_000_1(uniques, 1);
+  f_010_001_110_001_0(uniques, 1);
+  f_010_001_110_001_1(uniques, 1);
+  f_010_001_110_010_0(uniques, 1);
+  f_010_001_110_010_1(uniques, 1);
+  f_010_001_110_011_0(uniques, 1);
+  f_010_001_110_011_1(uniques, 1);
+  f_010_001_110_100_0(uniques, 1);
+  f_010_001_110_100_1(uniques, 1);
+  f_010_001_110_101_0(uniques, 1);
+  f_010_001_110_101_1(uniques, 1);
+  f_010_001_110_110_0(uniques, 1);
+  f_010_001_110_110_1(uniques, 1);
+  f_010_001_110_111_0(uniques, 1);
+  f_010_001_110_111_1(uniques, 1);
+  f_010_001_111_000_0(uniques, 1);
+  f_010_001_111_000_1(uniques, 1);
+  f_010_001_111_001_0(uniques, 1);
+  f_010_001_111_001_1(uniques, 1);
+  f_010_001_111_010_0(uniques, 1);
+  f_010_001_111_010_1(uniques, 1);
+  f_010_001_111_011_0(uniques, 1);
+  f_010_001_111_011_1(uniques, 1);
+  f_010_001_111_100_0(uniques, 1);
+  f_010_001_111_100_1(uniques, 1);
+  f_010_001_111_101_0(uniques, 1);
+  f_010_001_111_101_1(uniques, 1);
+  f_010_001_111_110_0(uniques, 1);
+  f_010_001_111_110_1(uniques, 1);
+  f_010_001_111_111_0(uniques, 1);
+  f_010_001_111_111_1(uniques, 1);
+  f_010_010_000_000_0(uniques, 1);
+  f_010_010_000_000_1(uniques, 1);
+  f_010_010_000_001_0(uniques, 1);
+  f_010_010_000_001_1(uniques, 1);
+  f_010_010_000_010_0(uniques, 1);
+  f_010_010_000_010_1(uniques, 1);
+  f_010_010_000_011_0(uniques, 1);
+  f_010_010_000_011_1(uniques, 1);
+  f_010_010_000_100_0(uniques, 1);
+  f_010_010_000_100_1(uniques, 1);
+  f_010_010_000_101_0(uniques, 1);
+  f_010_010_000_101_1(uniques, 1);
+  f_010_010_000_110_0(uniques, 1);
+  f_010_010_000_110_1(uniques, 1);
+  f_010_010_000_111_0(uniques, 1);
+  f_010_010_000_111_1(uniques, 1);
+  f_010_010_001_000_0(uniques, 1);
+  f_010_010_001_000_1(uniques, 1);
+  f_010_010_001_001_0(uniques, 1);
+  f_010_010_001_001_1(uniques, 1);
+  f_010_010_001_010_0(uniques, 1);
+  f_010_010_001_010_1(uniques, 1);
+  f_010_010_001_011_0(uniques, 1);
+  f_010_010_001_011_1(uniques, 1);
+  f_010_010_001_100_0(uniques, 1);
+  f_010_010_001_100_1(uniques, 1);
+  f_010_010_001_101_0(uniques, 1);
+  f_010_010_001_101_1(uniques, 1);
+  f_010_010_001_110_0(uniques, 1);
+  f_010_010_001_110_1(uniques, 1);
+  f_010_010_001_111_0(uniques, 1);
+  f_010_010_001_111_1(uniques, 1);
+  f_010_010_010_000_0(uniques, 1);
+  f_010_010_010_000_1(uniques, 1);
+  f_010_010_010_001_0(uniques, 1);
+  f_010_010_010_001_1(uniques, 1);
+  f_010_010_010_010_0(uniques, 1);
+  f_010_010_010_010_1(uniques, 1);
+  f_010_010_010_011_0(uniques, 1);
+  f_010_010_010_011_1(uniques, 1);
+  f_010_010_010_100_0(uniques, 1);
+  f_010_010_010_100_1(uniques, 1);
+  f_010_010_010_101_0(uniques, 1);
+  f_010_010_010_101_1(uniques, 1);
+  f_010_010_010_110_0(uniques, 1);
+  f_010_010_010_110_1(uniques, 1);
+  f_010_010_010_111_0(uniques, 1);
+  f_010_010_010_111_1(uniques, 1);
+  f_010_010_011_000_0(uniques, 1);
+  f_010_010_011_000_1(uniques, 1);
+  f_010_010_011_001_0(uniques, 1);
+  f_010_010_011_001_1(uniques, 1);
+  f_010_010_011_010_0(uniques, 1);
+  f_010_010_011_010_1(uniques, 1);
+  f_010_010_011_011_0(uniques, 1);
+  f_010_010_011_011_1(uniques, 1);
+  f_010_010_011_100_0(uniques, 1);
+  f_010_010_011_100_1(uniques, 1);
+  f_010_010_011_101_0(uniques, 1);
+  f_010_010_011_101_1(uniques, 1);
+  f_010_010_011_110_0(uniques, 1);
+  f_010_010_011_110_1(uniques, 1);
+  f_010_010_011_111_0(uniques, 1);
+  f_010_010_011_111_1(uniques, 1);
+  f_010_010_100_000_0(uniques, 1);
+  f_010_010_100_000_1(uniques, 1);
+  f_010_010_100_001_0(uniques, 1);
+  f_010_010_100_001_1(uniques, 1);
+  f_010_010_100_010_0(uniques, 1);
+  f_010_010_100_010_1(uniques, 1);
+  f_010_010_100_011_0(uniques, 1);
+  f_010_010_100_011_1(uniques, 1);
+  f_010_010_100_100_0(uniques, 1);
+  f_010_010_100_100_1(uniques, 1);
+  f_010_010_100_101_0(uniques, 1);
+  f_010_010_100_101_1(uniques, 1);
+  f_010_010_100_110_0(uniques, 1);
+  f_010_010_100_110_1(uniques, 1);
+  f_010_010_100_111_0(uniques, 1);
+  f_010_010_100_111_1(uniques, 1);
+  f_010_010_101_000_0(uniques, 1);
+  f_010_010_101_000_1(uniques, 1);
+  f_010_010_101_001_0(uniques, 1);
+  f_010_010_101_001_1(uniques, 1);
+  f_010_010_101_010_0(uniques, 1);
+  f_010_010_101_010_1(uniques, 1);
+  f_010_010_101_011_0(uniques, 1);
+  f_010_010_101_011_1(uniques, 1);
+  f_010_010_101_100_0(uniques, 1);
+  f_010_010_101_100_1(uniques, 1);
+  f_010_010_101_101_0(uniques, 1);
+  f_010_010_101_101_1(uniques, 1);
+  f_010_010_101_110_0(uniques, 1);
+  f_010_010_101_110_1(uniques, 1);
+  f_010_010_101_111_0(uniques, 1);
+  f_010_010_101_111_1(uniques, 1);
+  f_010_010_110_000_0(uniques, 1);
+  f_010_010_110_000_1(uniques, 1);
+  f_010_010_110_001_0(uniques, 1);
+  f_010_010_110_001_1(uniques, 1);
+  f_010_010_110_010_0(uniques, 1);
+  f_010_010_110_010_1(uniques, 1);
+  f_010_010_110_011_0(uniques, 1);
+  f_010_010_110_011_1(uniques, 1);
+  f_010_010_110_100_0(uniques, 1);
+  f_010_010_110_100_1(uniques, 1);
+  f_010_010_110_101_0(uniques, 1);
+  f_010_010_110_101_1(uniques, 1);
+  f_010_010_110_110_0(uniques, 1);
+  f_010_010_110_110_1(uniques, 1);
+  f_010_010_110_111_0(uniques, 1);
+  f_010_010_110_111_1(uniques, 1);
+  f_010_010_111_000_0(uniques, 1);
+  f_010_010_111_000_1(uniques, 1);
+  f_010_010_111_001_0(uniques, 1);
+  f_010_010_111_001_1(uniques, 1);
+  f_010_010_111_010_0(uniques, 1);
+  f_010_010_111_010_1(uniques, 1);
+  f_010_010_111_011_0(uniques, 1);
+  f_010_010_111_011_1(uniques, 1);
+  f_010_010_111_100_0(uniques, 1);
+  f_010_010_111_100_1(uniques, 1);
+  f_010_010_111_101_0(uniques, 1);
+  f_010_010_111_101_1(uniques, 1);
+  f_010_010_111_110_0(uniques, 1);
+  f_010_010_111_110_1(uniques, 1);
+  f_010_010_111_111_0(uniques, 1);
+  f_010_010_111_111_1(uniques, 1);
+  f_010_011_000_000_0(uniques, 1);
+  f_010_011_000_000_1(uniques, 1);
+  f_010_011_000_001_0(uniques, 1);
+  f_010_011_000_001_1(uniques, 1);
+  f_010_011_000_010_0(uniques, 1);
+  f_010_011_000_010_1(uniques, 1);
+  f_010_011_000_011_0(uniques, 1);
+  f_010_011_000_011_1(uniques, 1);
+  f_010_011_000_100_0(uniques, 1);
+  f_010_011_000_100_1(uniques, 1);
+  f_010_011_000_101_0(uniques, 1);
+  f_010_011_000_101_1(uniques, 1);
+  f_010_011_000_110_0(uniques, 1);
+  f_010_011_000_110_1(uniques, 1);
+  f_010_011_000_111_0(uniques, 1);
+  f_010_011_000_111_1(uniques, 1);
+  f_010_011_001_000_0(uniques, 1);
+  f_010_011_001_000_1(uniques, 1);
+  f_010_011_001_001_0(uniques, 1);
+  f_010_011_001_001_1(uniques, 1);
+  f_010_011_001_010_0(uniques, 1);
+  f_010_011_001_010_1(uniques, 1);
+  f_010_011_001_011_0(uniques, 1);
+  f_010_011_001_011_1(uniques, 1);
+  f_010_011_001_100_0(uniques, 1);
+  f_010_011_001_100_1(uniques, 1);
+  f_010_011_001_101_0(uniques, 1);
+  f_010_011_001_101_1(uniques, 1);
+  f_010_011_001_110_0(uniques, 1);
+  f_010_011_001_110_1(uniques, 1);
+  f_010_011_001_111_0(uniques, 1);
+  f_010_011_001_111_1(uniques, 1);
+  f_010_011_010_000_0(uniques, 1);
+  f_010_011_010_000_1(uniques, 1);
+  f_010_011_010_001_0(uniques, 1);
+  f_010_011_010_001_1(uniques, 1);
+  f_010_011_010_010_0(uniques, 1);
+  f_010_011_010_010_1(uniques, 1);
+  f_010_011_010_011_0(uniques, 1);
+  f_010_011_010_011_1(uniques, 1);
+  f_010_011_010_100_0(uniques, 1);
+  f_010_011_010_100_1(uniques, 1);
+  f_010_011_010_101_0(uniques, 1);
+  f_010_011_010_101_1(uniques, 1);
+  f_010_011_010_110_0(uniques, 1);
+  f_010_011_010_110_1(uniques, 1);
+  f_010_011_010_111_0(uniques, 1);
+  f_010_011_010_111_1(uniques, 1);
+  f_010_011_011_000_0(uniques, 1);
+  f_010_011_011_000_1(uniques, 1);
+  f_010_011_011_001_0(uniques, 1);
+  f_010_011_011_001_1(uniques, 1);
+  f_010_011_011_010_0(uniques, 1);
+  f_010_011_011_010_1(uniques, 1);
+  f_010_011_011_011_0(uniques, 1);
+  f_010_011_011_011_1(uniques, 1);
+  f_010_011_011_100_0(uniques, 1);
+  f_010_011_011_100_1(uniques, 1);
+  f_010_011_011_101_0(uniques, 1);
+  f_010_011_011_101_1(uniques, 1);
+  f_010_011_011_110_0(uniques, 1);
+  f_010_011_011_110_1(uniques, 1);
+  f_010_011_011_111_0(uniques, 1);
+  f_010_011_011_111_1(uniques, 1);
+  f_010_011_100_000_0(uniques, 1);
+  f_010_011_100_000_1(uniques, 1);
+  f_010_011_100_001_0(uniques, 1);
+  f_010_011_100_001_1(uniques, 1);
+  f_010_011_100_010_0(uniques, 1);
+  f_010_011_100_010_1(uniques, 1);
+  f_010_011_100_011_0(uniques, 1);
+  f_010_011_100_011_1(uniques, 1);
+  f_010_011_100_100_0(uniques, 1);
+  f_010_011_100_100_1(uniques, 1);
+  f_010_011_100_101_0(uniques, 1);
+  f_010_011_100_101_1(uniques, 1);
+  f_010_011_100_110_0(uniques, 1);
+  f_010_011_100_110_1(uniques, 1);
+  f_010_011_100_111_0(uniques, 1);
+  f_010_011_100_111_1(uniques, 1);
+  f_010_011_101_000_0(uniques, 1);
+  f_010_011_101_000_1(uniques, 1);
+  f_010_011_101_001_0(uniques, 1);
+  f_010_011_101_001_1(uniques, 1);
+  f_010_011_101_010_0(uniques, 1);
+  f_010_011_101_010_1(uniques, 1);
+  f_010_011_101_011_0(uniques, 1);
+  f_010_011_101_011_1(uniques, 1);
+  f_010_011_101_100_0(uniques, 1);
+  f_010_011_101_100_1(uniques, 1);
+  f_010_011_101_101_0(uniques, 1);
+  f_010_011_101_101_1(uniques, 1);
+  f_010_011_101_110_0(uniques, 1);
+  f_010_011_101_110_1(uniques, 1);
+  f_010_011_101_111_0(uniques, 1);
+  f_010_011_101_111_1(uniques, 1);
+  f_010_011_110_000_0(uniques, 1);
+  f_010_011_110_000_1(uniques, 1);
+  f_010_011_110_001_0(uniques, 1);
+  f_010_011_110_001_1(uniques, 1);
+  f_010_011_110_010_0(uniques, 1);
+  f_010_011_110_010_1(uniques, 1);
+  f_010_011_110_011_0(uniques, 1);
+  f_010_011_110_011_1(uniques, 1);
+  f_010_011_110_100_0(uniques, 1);
+  f_010_011_110_100_1(uniques, 1);
+  f_010_011_110_101_0(uniques, 1);
+  f_010_011_110_101_1(uniques, 1);
+  f_010_011_110_110_0(uniques, 1);
+  f_010_011_110_110_1(uniques, 1);
+  f_010_011_110_111_0(uniques, 1);
+  f_010_011_110_111_1(uniques, 1);
+  f_010_011_111_000_0(uniques, 1);
+  f_010_011_111_000_1(uniques, 1);
+  f_010_011_111_001_0(uniques, 1);
+  f_010_011_111_001_1(uniques, 1);
+  f_010_011_111_010_0(uniques, 1);
+  f_010_011_111_010_1(uniques, 1);
+  f_010_011_111_011_0(uniques, 1);
+  f_010_011_111_011_1(uniques, 1);
+  f_010_011_111_100_0(uniques, 1);
+  f_010_011_111_100_1(uniques, 1);
+  f_010_011_111_101_0(uniques, 1);
+  f_010_011_111_101_1(uniques, 1);
+  f_010_011_111_110_0(uniques, 1);
+  f_010_011_111_110_1(uniques, 1);
+  f_010_011_111_111_0(uniques, 1);
+  f_010_011_111_111_1(uniques, 1);
+  f_010_100_000_000_0(uniques, 1);
+  f_010_100_000_000_1(uniques, 1);
+  f_010_100_000_001_0(uniques, 1);
+  f_010_100_000_001_1(uniques, 1);
+  f_010_100_000_010_0(uniques, 1);
+  f_010_100_000_010_1(uniques, 1);
+  f_010_100_000_011_0(uniques, 1);
+  f_010_100_000_011_1(uniques, 1);
+  f_010_100_000_100_0(uniques, 1);
+  f_010_100_000_100_1(uniques, 1);
+  f_010_100_000_101_0(uniques, 1);
+  f_010_100_000_101_1(uniques, 1);
+  f_010_100_000_110_0(uniques, 1);
+  f_010_100_000_110_1(uniques, 1);
+  f_010_100_000_111_0(uniques, 1);
+  f_010_100_000_111_1(uniques, 1);
+  f_010_100_001_000_0(uniques, 1);
+  f_010_100_001_000_1(uniques, 1);
+  f_010_100_001_001_0(uniques, 1);
+  f_010_100_001_001_1(uniques, 1);
+  f_010_100_001_010_0(uniques, 1);
+  f_010_100_001_010_1(uniques, 1);
+  f_010_100_001_011_0(uniques, 1);
+  f_010_100_001_011_1(uniques, 1);
+  f_010_100_001_100_0(uniques, 1);
+  f_010_100_001_100_1(uniques, 1);
+  f_010_100_001_101_0(uniques, 1);
+  f_010_100_001_101_1(uniques, 1);
+  f_010_100_001_110_0(uniques, 1);
+  f_010_100_001_110_1(uniques, 1);
+  f_010_100_001_111_0(uniques, 1);
+  f_010_100_001_111_1(uniques, 1);
+  f_010_100_010_000_0(uniques, 1);
+  f_010_100_010_000_1(uniques, 1);
+  f_010_100_010_001_0(uniques, 1);
+  f_010_100_010_001_1(uniques, 1);
+  f_010_100_010_010_0(uniques, 1);
+  f_010_100_010_010_1(uniques, 1);
+  f_010_100_010_011_0(uniques, 1);
+  f_010_100_010_011_1(uniques, 1);
+  f_010_100_010_100_0(uniques, 1);
+  f_010_100_010_100_1(uniques, 1);
+  f_010_100_010_101_0(uniques, 1);
+  f_010_100_010_101_1(uniques, 1);
+  f_010_100_010_110_0(uniques, 1);
+  f_010_100_010_110_1(uniques, 1);
+  f_010_100_010_111_0(uniques, 1);
+  f_010_100_010_111_1(uniques, 1);
+  f_010_100_011_000_0(uniques, 1);
+  f_010_100_011_000_1(uniques, 1);
+  f_010_100_011_001_0(uniques, 1);
+  f_010_100_011_001_1(uniques, 1);
+  f_010_100_011_010_0(uniques, 1);
+  f_010_100_011_010_1(uniques, 1);
+  f_010_100_011_011_0(uniques, 1);
+  f_010_100_011_011_1(uniques, 1);
+  f_010_100_011_100_0(uniques, 1);
+  f_010_100_011_100_1(uniques, 1);
+  f_010_100_011_101_0(uniques, 1);
+  f_010_100_011_101_1(uniques, 1);
+  f_010_100_011_110_0(uniques, 1);
+  f_010_100_011_110_1(uniques, 1);
+  f_010_100_011_111_0(uniques, 1);
+  f_010_100_011_111_1(uniques, 1);
+  f_010_100_100_000_0(uniques, 1);
+  f_010_100_100_000_1(uniques, 1);
+  f_010_100_100_001_0(uniques, 1);
+  f_010_100_100_001_1(uniques, 1);
+  f_010_100_100_010_0(uniques, 1);
+  f_010_100_100_010_1(uniques, 1);
+  f_010_100_100_011_0(uniques, 1);
+  f_010_100_100_011_1(uniques, 1);
+  f_010_100_100_100_0(uniques, 1);
+  f_010_100_100_100_1(uniques, 1);
+  f_010_100_100_101_0(uniques, 1);
+  f_010_100_100_101_1(uniques, 1);
+  f_010_100_100_110_0(uniques, 1);
+  f_010_100_100_110_1(uniques, 1);
+  f_010_100_100_111_0(uniques, 1);
+  f_010_100_100_111_1(uniques, 1);
+  f_010_100_101_000_0(uniques, 1);
+  f_010_100_101_000_1(uniques, 1);
+  f_010_100_101_001_0(uniques, 1);
+  f_010_100_101_001_1(uniques, 1);
+  f_010_100_101_010_0(uniques, 1);
+  f_010_100_101_010_1(uniques, 1);
+  f_010_100_101_011_0(uniques, 1);
+  f_010_100_101_011_1(uniques, 1);
+  f_010_100_101_100_0(uniques, 1);
+  f_010_100_101_100_1(uniques, 1);
+  f_010_100_101_101_0(uniques, 1);
+  f_010_100_101_101_1(uniques, 1);
+  f_010_100_101_110_0(uniques, 1);
+  f_010_100_101_110_1(uniques, 1);
+  f_010_100_101_111_0(uniques, 1);
+  f_010_100_101_111_1(uniques, 1);
+  f_010_100_110_000_0(uniques, 1);
+  f_010_100_110_000_1(uniques, 1);
+  f_010_100_110_001_0(uniques, 1);
+  f_010_100_110_001_1(uniques, 1);
+  f_010_100_110_010_0(uniques, 1);
+  f_010_100_110_010_1(uniques, 1);
+  f_010_100_110_011_0(uniques, 1);
+  f_010_100_110_011_1(uniques, 1);
+  f_010_100_110_100_0(uniques, 1);
+  f_010_100_110_100_1(uniques, 1);
+  f_010_100_110_101_0(uniques, 1);
+  f_010_100_110_101_1(uniques, 1);
+  f_010_100_110_110_0(uniques, 1);
+  f_010_100_110_110_1(uniques, 1);
+  f_010_100_110_111_0(uniques, 1);
+  f_010_100_110_111_1(uniques, 1);
+  f_010_100_111_000_0(uniques, 1);
+  f_010_100_111_000_1(uniques, 1);
+  f_010_100_111_001_0(uniques, 1);
+  f_010_100_111_001_1(uniques, 1);
+  f_010_100_111_010_0(uniques, 1);
+  f_010_100_111_010_1(uniques, 1);
+  f_010_100_111_011_0(uniques, 1);
+  f_010_100_111_011_1(uniques, 1);
+  f_010_100_111_100_0(uniques, 1);
+  f_010_100_111_100_1(uniques, 1);
+  f_010_100_111_101_0(uniques, 1);
+  f_010_100_111_101_1(uniques, 1);
+  f_010_100_111_110_0(uniques, 1);
+  f_010_100_111_110_1(uniques, 1);
+  f_010_100_111_111_0(uniques, 1);
+  f_010_100_111_111_1(uniques, 1);
+  f_010_101_000_000_0(uniques, 1);
+  f_010_101_000_000_1(uniques, 1);
+  f_010_101_000_001_0(uniques, 1);
+  f_010_101_000_001_1(uniques, 1);
+  f_010_101_000_010_0(uniques, 1);
+  f_010_101_000_010_1(uniques, 1);
+  f_010_101_000_011_0(uniques, 1);
+  f_010_101_000_011_1(uniques, 1);
+  f_010_101_000_100_0(uniques, 1);
+  f_010_101_000_100_1(uniques, 1);
+  f_010_101_000_101_0(uniques, 1);
+  f_010_101_000_101_1(uniques, 1);
+  f_010_101_000_110_0(uniques, 1);
+  f_010_101_000_110_1(uniques, 1);
+  f_010_101_000_111_0(uniques, 1);
+  f_010_101_000_111_1(uniques, 1);
+  f_010_101_001_000_0(uniques, 1);
+  f_010_101_001_000_1(uniques, 1);
+  f_010_101_001_001_0(uniques, 1);
+  f_010_101_001_001_1(uniques, 1);
+  f_010_101_001_010_0(uniques, 1);
+  f_010_101_001_010_1(uniques, 1);
+  f_010_101_001_011_0(uniques, 1);
+  f_010_101_001_011_1(uniques, 1);
+  f_010_101_001_100_0(uniques, 1);
+  f_010_101_001_100_1(uniques, 1);
+  f_010_101_001_101_0(uniques, 1);
+  f_010_101_001_101_1(uniques, 1);
+  f_010_101_001_110_0(uniques, 1);
+  f_010_101_001_110_1(uniques, 1);
+  f_010_101_001_111_0(uniques, 1);
+  f_010_101_001_111_1(uniques, 1);
+  f_010_101_010_000_0(uniques, 1);
+  f_010_101_010_000_1(uniques, 1);
+  f_010_101_010_001_0(uniques, 1);
+  f_010_101_010_001_1(uniques, 1);
+  f_010_101_010_010_0(uniques, 1);
+  f_010_101_010_010_1(uniques, 1);
+  f_010_101_010_011_0(uniques, 1);
+  f_010_101_010_011_1(uniques, 1);
+  f_010_101_010_100_0(uniques, 1);
+  f_010_101_010_100_1(uniques, 1);
+  f_010_101_010_101_0(uniques, 1);
+  f_010_101_010_101_1(uniques, 1);
+  f_010_101_010_110_0(uniques, 1);
+  f_010_101_010_110_1(uniques, 1);
+  f_010_101_010_111_0(uniques, 1);
+  f_010_101_010_111_1(uniques, 1);
+  f_010_101_011_000_0(uniques, 1);
+  f_010_101_011_000_1(uniques, 1);
+  f_010_101_011_001_0(uniques, 1);
+  f_010_101_011_001_1(uniques, 1);
+  f_010_101_011_010_0(uniques, 1);
+  f_010_101_011_010_1(uniques, 1);
+  f_010_101_011_011_0(uniques, 1);
+  f_010_101_011_011_1(uniques, 1);
+  f_010_101_011_100_0(uniques, 1);
+  f_010_101_011_100_1(uniques, 1);
+  f_010_101_011_101_0(uniques, 1);
+  f_010_101_011_101_1(uniques, 1);
+  f_010_101_011_110_0(uniques, 1);
+  f_010_101_011_110_1(uniques, 1);
+  f_010_101_011_111_0(uniques, 1);
+  f_010_101_011_111_1(uniques, 1);
+  f_010_101_100_000_0(uniques, 1);
+  f_010_101_100_000_1(uniques, 1);
+  f_010_101_100_001_0(uniques, 1);
+  f_010_101_100_001_1(uniques, 1);
+  f_010_101_100_010_0(uniques, 1);
+  f_010_101_100_010_1(uniques, 1);
+  f_010_101_100_011_0(uniques, 1);
+  f_010_101_100_011_1(uniques, 1);
+  f_010_101_100_100_0(uniques, 1);
+  f_010_101_100_100_1(uniques, 1);
+  f_010_101_100_101_0(uniques, 1);
+  f_010_101_100_101_1(uniques, 1);
+  f_010_101_100_110_0(uniques, 1);
+  f_010_101_100_110_1(uniques, 1);
+  f_010_101_100_111_0(uniques, 1);
+  f_010_101_100_111_1(uniques, 1);
+  f_010_101_101_000_0(uniques, 1);
+  f_010_101_101_000_1(uniques, 1);
+  f_010_101_101_001_0(uniques, 1);
+  f_010_101_101_001_1(uniques, 1);
+  f_010_101_101_010_0(uniques, 1);
+  f_010_101_101_010_1(uniques, 1);
+  f_010_101_101_011_0(uniques, 1);
+  f_010_101_101_011_1(uniques, 1);
+  f_010_101_101_100_0(uniques, 1);
+  f_010_101_101_100_1(uniques, 1);
+  f_010_101_101_101_0(uniques, 1);
+  f_010_101_101_101_1(uniques, 1);
+  f_010_101_101_110_0(uniques, 1);
+  f_010_101_101_110_1(uniques, 1);
+  f_010_101_101_111_0(uniques, 1);
+  f_010_101_101_111_1(uniques, 1);
+  f_010_101_110_000_0(uniques, 1);
+  f_010_101_110_000_1(uniques, 1);
+  f_010_101_110_001_0(uniques, 1);
+  f_010_101_110_001_1(uniques, 1);
+  f_010_101_110_010_0(uniques, 1);
+  f_010_101_110_010_1(uniques, 1);
+  f_010_101_110_011_0(uniques, 1);
+  f_010_101_110_011_1(uniques, 1);
+  f_010_101_110_100_0(uniques, 1);
+  f_010_101_110_100_1(uniques, 1);
+  f_010_101_110_101_0(uniques, 1);
+  f_010_101_110_101_1(uniques, 1);
+  f_010_101_110_110_0(uniques, 1);
+  f_010_101_110_110_1(uniques, 1);
+  f_010_101_110_111_0(uniques, 1);
+  f_010_101_110_111_1(uniques, 1);
+  f_010_101_111_000_0(uniques, 1);
+  f_010_101_111_000_1(uniques, 1);
+  f_010_101_111_001_0(uniques, 1);
+  f_010_101_111_001_1(uniques, 1);
+  f_010_101_111_010_0(uniques, 1);
+  f_010_101_111_010_1(uniques, 1);
+  f_010_101_111_011_0(uniques, 1);
+  f_010_101_111_011_1(uniques, 1);
+  f_010_101_111_100_0(uniques, 1);
+  f_010_101_111_100_1(uniques, 1);
+  f_010_101_111_101_0(uniques, 1);
+  f_010_101_111_101_1(uniques, 1);
+  f_010_101_111_110_0(uniques, 1);
+  f_010_101_111_110_1(uniques, 1);
+  f_010_101_111_111_0(uniques, 1);
+  f_010_101_111_111_1(uniques, 1);
+  f_010_110_000_000_0(uniques, 1);
+  f_010_110_000_000_1(uniques, 1);
+  f_010_110_000_001_0(uniques, 1);
+  f_010_110_000_001_1(uniques, 1);
+  f_010_110_000_010_0(uniques, 1);
+  f_010_110_000_010_1(uniques, 1);
+  f_010_110_000_011_0(uniques, 1);
+  f_010_110_000_011_1(uniques, 1);
+  f_010_110_000_100_0(uniques, 1);
+  f_010_110_000_100_1(uniques, 1);
+  f_010_110_000_101_0(uniques, 1);
+  f_010_110_000_101_1(uniques, 1);
+  f_010_110_000_110_0(uniques, 1);
+  f_010_110_000_110_1(uniques, 1);
+  f_010_110_000_111_0(uniques, 1);
+  f_010_110_000_111_1(uniques, 1);
+  f_010_110_001_000_0(uniques, 1);
+  f_010_110_001_000_1(uniques, 1);
+  f_010_110_001_001_0(uniques, 1);
+  f_010_110_001_001_1(uniques, 1);
+  f_010_110_001_010_0(uniques, 1);
+  f_010_110_001_010_1(uniques, 1);
+  f_010_110_001_011_0(uniques, 1);
+  f_010_110_001_011_1(uniques, 1);
+  f_010_110_001_100_0(uniques, 1);
+  f_010_110_001_100_1(uniques, 1);
+  f_010_110_001_101_0(uniques, 1);
+  f_010_110_001_101_1(uniques, 1);
+  f_010_110_001_110_0(uniques, 1);
+  f_010_110_001_110_1(uniques, 1);
+  f_010_110_001_111_0(uniques, 1);
+  f_010_110_001_111_1(uniques, 1);
+  f_010_110_010_000_0(uniques, 1);
+  f_010_110_010_000_1(uniques, 1);
+  f_010_110_010_001_0(uniques, 1);
+  f_010_110_010_001_1(uniques, 1);
+  f_010_110_010_010_0(uniques, 1);
+  f_010_110_010_010_1(uniques, 1);
+  f_010_110_010_011_0(uniques, 1);
+  f_010_110_010_011_1(uniques, 1);
+  f_010_110_010_100_0(uniques, 1);
+  f_010_110_010_100_1(uniques, 1);
+  f_010_110_010_101_0(uniques, 1);
+  f_010_110_010_101_1(uniques, 1);
+  f_010_110_010_110_0(uniques, 1);
+  f_010_110_010_110_1(uniques, 1);
+  f_010_110_010_111_0(uniques, 1);
+  f_010_110_010_111_1(uniques, 1);
+  f_010_110_011_000_0(uniques, 1);
+  f_010_110_011_000_1(uniques, 1);
+  f_010_110_011_001_0(uniques, 1);
+  f_010_110_011_001_1(uniques, 1);
+  f_010_110_011_010_0(uniques, 1);
+  f_010_110_011_010_1(uniques, 1);
+  f_010_110_011_011_0(uniques, 1);
+  f_010_110_011_011_1(uniques, 1);
+  f_010_110_011_100_0(uniques, 1);
+  f_010_110_011_100_1(uniques, 1);
+  f_010_110_011_101_0(uniques, 1);
+  f_010_110_011_101_1(uniques, 1);
+  f_010_110_011_110_0(uniques, 1);
+  f_010_110_011_110_1(uniques, 1);
+  f_010_110_011_111_0(uniques, 1);
+  f_010_110_011_111_1(uniques, 1);
+  f_010_110_100_000_0(uniques, 1);
+  f_010_110_100_000_1(uniques, 1);
+  f_010_110_100_001_0(uniques, 1);
+  f_010_110_100_001_1(uniques, 1);
+  f_010_110_100_010_0(uniques, 1);
+  f_010_110_100_010_1(uniques, 1);
+  f_010_110_100_011_0(uniques, 1);
+  f_010_110_100_011_1(uniques, 1);
+  f_010_110_100_100_0(uniques, 1);
+  f_010_110_100_100_1(uniques, 1);
+  f_010_110_100_101_0(uniques, 1);
+  f_010_110_100_101_1(uniques, 1);
+  f_010_110_100_110_0(uniques, 1);
+  f_010_110_100_110_1(uniques, 1);
+  f_010_110_100_111_0(uniques, 1);
+  f_010_110_100_111_1(uniques, 1);
+  f_010_110_101_000_0(uniques, 1);
+  f_010_110_101_000_1(uniques, 1);
+  f_010_110_101_001_0(uniques, 1);
+  f_010_110_101_001_1(uniques, 1);
+  f_010_110_101_010_0(uniques, 1);
+  f_010_110_101_010_1(uniques, 1);
+  f_010_110_101_011_0(uniques, 1);
+  f_010_110_101_011_1(uniques, 1);
+  f_010_110_101_100_0(uniques, 1);
+  f_010_110_101_100_1(uniques, 1);
+  f_010_110_101_101_0(uniques, 1);
+  f_010_110_101_101_1(uniques, 1);
+  f_010_110_101_110_0(uniques, 1);
+  f_010_110_101_110_1(uniques, 1);
+  f_010_110_101_111_0(uniques, 1);
+  f_010_110_101_111_1(uniques, 1);
+  f_010_110_110_000_0(uniques, 1);
+  f_010_110_110_000_1(uniques, 1);
+  f_010_110_110_001_0(uniques, 1);
+  f_010_110_110_001_1(uniques, 1);
+  f_010_110_110_010_0(uniques, 1);
+  f_010_110_110_010_1(uniques, 1);
+  f_010_110_110_011_0(uniques, 1);
+  f_010_110_110_011_1(uniques, 1);
+  f_010_110_110_100_0(uniques, 1);
+  f_010_110_110_100_1(uniques, 1);
+  f_010_110_110_101_0(uniques, 1);
+  f_010_110_110_101_1(uniques, 1);
+  f_010_110_110_110_0(uniques, 1);
+  f_010_110_110_110_1(uniques, 1);
+  f_010_110_110_111_0(uniques, 1);
+  f_010_110_110_111_1(uniques, 1);
+  f_010_110_111_000_0(uniques, 1);
+  f_010_110_111_000_1(uniques, 1);
+  f_010_110_111_001_0(uniques, 1);
+  f_010_110_111_001_1(uniques, 1);
+  f_010_110_111_010_0(uniques, 1);
+  f_010_110_111_010_1(uniques, 1);
+  f_010_110_111_011_0(uniques, 1);
+  f_010_110_111_011_1(uniques, 1);
+  f_010_110_111_100_0(uniques, 1);
+  f_010_110_111_100_1(uniques, 1);
+  f_010_110_111_101_0(uniques, 1);
+  f_010_110_111_101_1(uniques, 1);
+  f_010_110_111_110_0(uniques, 1);
+  f_010_110_111_110_1(uniques, 1);
+  f_010_110_111_111_0(uniques, 1);
+  f_010_110_111_111_1(uniques, 1);
+  f_010_111_000_000_0(uniques, 1);
+  f_010_111_000_000_1(uniques, 1);
+  f_010_111_000_001_0(uniques, 1);
+  f_010_111_000_001_1(uniques, 1);
+  f_010_111_000_010_0(uniques, 1);
+  f_010_111_000_010_1(uniques, 1);
+  f_010_111_000_011_0(uniques, 1);
+  f_010_111_000_011_1(uniques, 1);
+  f_010_111_000_100_0(uniques, 1);
+  f_010_111_000_100_1(uniques, 1);
+  f_010_111_000_101_0(uniques, 1);
+  f_010_111_000_101_1(uniques, 1);
+  f_010_111_000_110_0(uniques, 1);
+  f_010_111_000_110_1(uniques, 1);
+  f_010_111_000_111_0(uniques, 1);
+  f_010_111_000_111_1(uniques, 1);
+  f_010_111_001_000_0(uniques, 1);
+  f_010_111_001_000_1(uniques, 1);
+  f_010_111_001_001_0(uniques, 1);
+  f_010_111_001_001_1(uniques, 1);
+  f_010_111_001_010_0(uniques, 1);
+  f_010_111_001_010_1(uniques, 1);
+  f_010_111_001_011_0(uniques, 1);
+  f_010_111_001_011_1(uniques, 1);
+  f_010_111_001_100_0(uniques, 1);
+  f_010_111_001_100_1(uniques, 1);
+  f_010_111_001_101_0(uniques, 1);
+  f_010_111_001_101_1(uniques, 1);
+  f_010_111_001_110_0(uniques, 1);
+  f_010_111_001_110_1(uniques, 1);
+  f_010_111_001_111_0(uniques, 1);
+  f_010_111_001_111_1(uniques, 1);
+  f_010_111_010_000_0(uniques, 1);
+  f_010_111_010_000_1(uniques, 1);
+  f_010_111_010_001_0(uniques, 1);
+  f_010_111_010_001_1(uniques, 1);
+  f_010_111_010_010_0(uniques, 1);
+  f_010_111_010_010_1(uniques, 1);
+  f_010_111_010_011_0(uniques, 1);
+  f_010_111_010_011_1(uniques, 1);
+  f_010_111_010_100_0(uniques, 1);
+  f_010_111_010_100_1(uniques, 1);
+  f_010_111_010_101_0(uniques, 1);
+  f_010_111_010_101_1(uniques, 1);
+  f_010_111_010_110_0(uniques, 1);
+  f_010_111_010_110_1(uniques, 1);
+  f_010_111_010_111_0(uniques, 1);
+  f_010_111_010_111_1(uniques, 1);
+  f_010_111_011_000_0(uniques, 1);
+  f_010_111_011_000_1(uniques, 1);
+  f_010_111_011_001_0(uniques, 1);
+  f_010_111_011_001_1(uniques, 1);
+  f_010_111_011_010_0(uniques, 1);
+  f_010_111_011_010_1(uniques, 1);
+  f_010_111_011_011_0(uniques, 1);
+  f_010_111_011_011_1(uniques, 1);
+  f_010_111_011_100_0(uniques, 1);
+  f_010_111_011_100_1(uniques, 1);
+  f_010_111_011_101_0(uniques, 1);
+  f_010_111_011_101_1(uniques, 1);
+  f_010_111_011_110_0(uniques, 1);
+  f_010_111_011_110_1(uniques, 1);
+  f_010_111_011_111_0(uniques, 1);
+  f_010_111_011_111_1(uniques, 1);
+  f_010_111_100_000_0(uniques, 1);
+  f_010_111_100_000_1(uniques, 1);
+  f_010_111_100_001_0(uniques, 1);
+  f_010_111_100_001_1(uniques, 1);
+  f_010_111_100_010_0(uniques, 1);
+  f_010_111_100_010_1(uniques, 1);
+  f_010_111_100_011_0(uniques, 1);
+  f_010_111_100_011_1(uniques, 1);
+  f_010_111_100_100_0(uniques, 1);
+  f_010_111_100_100_1(uniques, 1);
+  f_010_111_100_101_0(uniques, 1);
+  f_010_111_100_101_1(uniques, 1);
+  f_010_111_100_110_0(uniques, 1);
+  f_010_111_100_110_1(uniques, 1);
+  f_010_111_100_111_0(uniques, 1);
+  f_010_111_100_111_1(uniques, 1);
+  f_010_111_101_000_0(uniques, 1);
+  f_010_111_101_000_1(uniques, 1);
+  f_010_111_101_001_0(uniques, 1);
+  f_010_111_101_001_1(uniques, 1);
+  f_010_111_101_010_0(uniques, 1);
+  f_010_111_101_010_1(uniques, 1);
+  f_010_111_101_011_0(uniques, 1);
+  f_010_111_101_011_1(uniques, 1);
+  f_010_111_101_100_0(uniques, 1);
+  f_010_111_101_100_1(uniques, 1);
+  f_010_111_101_101_0(uniques, 1);
+  f_010_111_101_101_1(uniques, 1);
+  f_010_111_101_110_0(uniques, 1);
+  f_010_111_101_110_1(uniques, 1);
+  f_010_111_101_111_0(uniques, 1);
+  f_010_111_101_111_1(uniques, 1);
+  f_010_111_110_000_0(uniques, 1);
+  f_010_111_110_000_1(uniques, 1);
+  f_010_111_110_001_0(uniques, 1);
+  f_010_111_110_001_1(uniques, 1);
+  f_010_111_110_010_0(uniques, 1);
+  f_010_111_110_010_1(uniques, 1);
+  f_010_111_110_011_0(uniques, 1);
+  f_010_111_110_011_1(uniques, 1);
+  f_010_111_110_100_0(uniques, 1);
+  f_010_111_110_100_1(uniques, 1);
+  f_010_111_110_101_0(uniques, 1);
+  f_010_111_110_101_1(uniques, 1);
+  f_010_111_110_110_0(uniques, 1);
+  f_010_111_110_110_1(uniques, 1);
+  f_010_111_110_111_0(uniques, 1);
+  f_010_111_110_111_1(uniques, 1);
+  f_010_111_111_000_0(uniques, 1);
+  f_010_111_111_000_1(uniques, 1);
+  f_010_111_111_001_0(uniques, 1);
+  f_010_111_111_001_1(uniques, 1);
+  f_010_111_111_010_0(uniques, 1);
+  f_010_111_111_010_1(uniques, 1);
+  f_010_111_111_011_0(uniques, 1);
+  f_010_111_111_011_1(uniques, 1);
+  f_010_111_111_100_0(uniques, 1);
+  f_010_111_111_100_1(uniques, 1);
+  f_010_111_111_101_0(uniques, 1);
+  f_010_111_111_101_1(uniques, 1);
+  f_010_111_111_110_0(uniques, 1);
+  f_010_111_111_110_1(uniques, 1);
+  f_010_111_111_111_0(uniques, 1);
+  f_010_111_111_111_1(uniques, 1);
+  f_011_000_000_000_0(uniques, 1);
+  f_011_000_000_000_1(uniques, 1);
+  f_011_000_000_001_0(uniques, 1);
+  f_011_000_000_001_1(uniques, 1);
+  f_011_000_000_010_0(uniques, 1);
+  f_011_000_000_010_1(uniques, 1);
+  f_011_000_000_011_0(uniques, 1);
+  f_011_000_000_011_1(uniques, 1);
+  f_011_000_000_100_0(uniques, 1);
+  f_011_000_000_100_1(uniques, 1);
+  f_011_000_000_101_0(uniques, 1);
+  f_011_000_000_101_1(uniques, 1);
+  f_011_000_000_110_0(uniques, 1);
+  f_011_000_000_110_1(uniques, 1);
+  f_011_000_000_111_0(uniques, 1);
+  f_011_000_000_111_1(uniques, 1);
+  f_011_000_001_000_0(uniques, 1);
+  f_011_000_001_000_1(uniques, 1);
+  f_011_000_001_001_0(uniques, 1);
+  f_011_000_001_001_1(uniques, 1);
+  f_011_000_001_010_0(uniques, 1);
+  f_011_000_001_010_1(uniques, 1);
+  f_011_000_001_011_0(uniques, 1);
+  f_011_000_001_011_1(uniques, 1);
+  f_011_000_001_100_0(uniques, 1);
+  f_011_000_001_100_1(uniques, 1);
+  f_011_000_001_101_0(uniques, 1);
+  f_011_000_001_101_1(uniques, 1);
+  f_011_000_001_110_0(uniques, 1);
+  f_011_000_001_110_1(uniques, 1);
+  f_011_000_001_111_0(uniques, 1);
+  f_011_000_001_111_1(uniques, 1);
+  f_011_000_010_000_0(uniques, 1);
+  f_011_000_010_000_1(uniques, 1);
+  f_011_000_010_001_0(uniques, 1);
+  f_011_000_010_001_1(uniques, 1);
+  f_011_000_010_010_0(uniques, 1);
+  f_011_000_010_010_1(uniques, 1);
+  f_011_000_010_011_0(uniques, 1);
+  f_011_000_010_011_1(uniques, 1);
+  f_011_000_010_100_0(uniques, 1);
+  f_011_000_010_100_1(uniques, 1);
+  f_011_000_010_101_0(uniques, 1);
+  f_011_000_010_101_1(uniques, 1);
+  f_011_000_010_110_0(uniques, 1);
+  f_011_000_010_110_1(uniques, 1);
+  f_011_000_010_111_0(uniques, 1);
+  f_011_000_010_111_1(uniques, 1);
+  f_011_000_011_000_0(uniques, 1);
+  f_011_000_011_000_1(uniques, 1);
+  f_011_000_011_001_0(uniques, 1);
+  f_011_000_011_001_1(uniques, 1);
+  f_011_000_011_010_0(uniques, 1);
+  f_011_000_011_010_1(uniques, 1);
+  f_011_000_011_011_0(uniques, 1);
+  f_011_000_011_011_1(uniques, 1);
+  f_011_000_011_100_0(uniques, 1);
+  f_011_000_011_100_1(uniques, 1);
+  f_011_000_011_101_0(uniques, 1);
+  f_011_000_011_101_1(uniques, 1);
+  f_011_000_011_110_0(uniques, 1);
+  f_011_000_011_110_1(uniques, 1);
+  f_011_000_011_111_0(uniques, 1);
+  f_011_000_011_111_1(uniques, 1);
+  f_011_000_100_000_0(uniques, 1);
+  f_011_000_100_000_1(uniques, 1);
+  f_011_000_100_001_0(uniques, 1);
+  f_011_000_100_001_1(uniques, 1);
+  f_011_000_100_010_0(uniques, 1);
+  f_011_000_100_010_1(uniques, 1);
+  f_011_000_100_011_0(uniques, 1);
+  f_011_000_100_011_1(uniques, 1);
+  f_011_000_100_100_0(uniques, 1);
+  f_011_000_100_100_1(uniques, 1);
+  f_011_000_100_101_0(uniques, 1);
+  f_011_000_100_101_1(uniques, 1);
+  f_011_000_100_110_0(uniques, 1);
+  f_011_000_100_110_1(uniques, 1);
+  f_011_000_100_111_0(uniques, 1);
+  f_011_000_100_111_1(uniques, 1);
+  f_011_000_101_000_0(uniques, 1);
+  f_011_000_101_000_1(uniques, 1);
+  f_011_000_101_001_0(uniques, 1);
+  f_011_000_101_001_1(uniques, 1);
+  f_011_000_101_010_0(uniques, 1);
+  f_011_000_101_010_1(uniques, 1);
+  f_011_000_101_011_0(uniques, 1);
+  f_011_000_101_011_1(uniques, 1);
+  f_011_000_101_100_0(uniques, 1);
+  f_011_000_101_100_1(uniques, 1);
+  f_011_000_101_101_0(uniques, 1);
+  f_011_000_101_101_1(uniques, 1);
+  f_011_000_101_110_0(uniques, 1);
+  f_011_000_101_110_1(uniques, 1);
+  f_011_000_101_111_0(uniques, 1);
+  f_011_000_101_111_1(uniques, 1);
+  f_011_000_110_000_0(uniques, 1);
+  f_011_000_110_000_1(uniques, 1);
+  f_011_000_110_001_0(uniques, 1);
+  f_011_000_110_001_1(uniques, 1);
+  f_011_000_110_010_0(uniques, 1);
+  f_011_000_110_010_1(uniques, 1);
+  f_011_000_110_011_0(uniques, 1);
+  f_011_000_110_011_1(uniques, 1);
+  f_011_000_110_100_0(uniques, 1);
+  f_011_000_110_100_1(uniques, 1);
+  f_011_000_110_101_0(uniques, 1);
+  f_011_000_110_101_1(uniques, 1);
+  f_011_000_110_110_0(uniques, 1);
+  f_011_000_110_110_1(uniques, 1);
+  f_011_000_110_111_0(uniques, 1);
+  f_011_000_110_111_1(uniques, 1);
+  f_011_000_111_000_0(uniques, 1);
+  f_011_000_111_000_1(uniques, 1);
+  f_011_000_111_001_0(uniques, 1);
+  f_011_000_111_001_1(uniques, 1);
+  f_011_000_111_010_0(uniques, 1);
+  f_011_000_111_010_1(uniques, 1);
+  f_011_000_111_011_0(uniques, 1);
+  f_011_000_111_011_1(uniques, 1);
+  f_011_000_111_100_0(uniques, 1);
+  f_011_000_111_100_1(uniques, 1);
+  f_011_000_111_101_0(uniques, 1);
+  f_011_000_111_101_1(uniques, 1);
+  f_011_000_111_110_0(uniques, 1);
+  f_011_000_111_110_1(uniques, 1);
+  f_011_000_111_111_0(uniques, 1);
+  f_011_000_111_111_1(uniques, 1);
+  f_011_001_000_000_0(uniques, 1);
+  f_011_001_000_000_1(uniques, 1);
+  f_011_001_000_001_0(uniques, 1);
+  f_011_001_000_001_1(uniques, 1);
+  f_011_001_000_010_0(uniques, 1);
+  f_011_001_000_010_1(uniques, 1);
+  f_011_001_000_011_0(uniques, 1);
+  f_011_001_000_011_1(uniques, 1);
+  f_011_001_000_100_0(uniques, 1);
+  f_011_001_000_100_1(uniques, 1);
+  f_011_001_000_101_0(uniques, 1);
+  f_011_001_000_101_1(uniques, 1);
+  f_011_001_000_110_0(uniques, 1);
+  f_011_001_000_110_1(uniques, 1);
+  f_011_001_000_111_0(uniques, 1);
+  f_011_001_000_111_1(uniques, 1);
+  f_011_001_001_000_0(uniques, 1);
+  f_011_001_001_000_1(uniques, 1);
+  f_011_001_001_001_0(uniques, 1);
+  f_011_001_001_001_1(uniques, 1);
+  f_011_001_001_010_0(uniques, 1);
+  f_011_001_001_010_1(uniques, 1);
+  f_011_001_001_011_0(uniques, 1);
+  f_011_001_001_011_1(uniques, 1);
+  f_011_001_001_100_0(uniques, 1);
+  f_011_001_001_100_1(uniques, 1);
+  f_011_001_001_101_0(uniques, 1);
+  f_011_001_001_101_1(uniques, 1);
+  f_011_001_001_110_0(uniques, 1);
+  f_011_001_001_110_1(uniques, 1);
+  f_011_001_001_111_0(uniques, 1);
+  f_011_001_001_111_1(uniques, 1);
+  f_011_001_010_000_0(uniques, 1);
+  f_011_001_010_000_1(uniques, 1);
+  f_011_001_010_001_0(uniques, 1);
+  f_011_001_010_001_1(uniques, 1);
+  f_011_001_010_010_0(uniques, 1);
+  f_011_001_010_010_1(uniques, 1);
+  f_011_001_010_011_0(uniques, 1);
+  f_011_001_010_011_1(uniques, 1);
+  f_011_001_010_100_0(uniques, 1);
+  f_011_001_010_100_1(uniques, 1);
+  f_011_001_010_101_0(uniques, 1);
+  f_011_001_010_101_1(uniques, 1);
+  f_011_001_010_110_0(uniques, 1);
+  f_011_001_010_110_1(uniques, 1);
+  f_011_001_010_111_0(uniques, 1);
+  f_011_001_010_111_1(uniques, 1);
+  f_011_001_011_000_0(uniques, 1);
+  f_011_001_011_000_1(uniques, 1);
+  f_011_001_011_001_0(uniques, 1);
+  f_011_001_011_001_1(uniques, 1);
+  f_011_001_011_010_0(uniques, 1);
+  f_011_001_011_010_1(uniques, 1);
+  f_011_001_011_011_0(uniques, 1);
+  f_011_001_011_011_1(uniques, 1);
+  f_011_001_011_100_0(uniques, 1);
+  f_011_001_011_100_1(uniques, 1);
+  f_011_001_011_101_0(uniques, 1);
+  f_011_001_011_101_1(uniques, 1);
+  f_011_001_011_110_0(uniques, 1);
+  f_011_001_011_110_1(uniques, 1);
+  f_011_001_011_111_0(uniques, 1);
+  f_011_001_011_111_1(uniques, 1);
+  f_011_001_100_000_0(uniques, 1);
+  f_011_001_100_000_1(uniques, 1);
+  f_011_001_100_001_0(uniques, 1);
+  f_011_001_100_001_1(uniques, 1);
+  f_011_001_100_010_0(uniques, 1);
+  f_011_001_100_010_1(uniques, 1);
+  f_011_001_100_011_0(uniques, 1);
+  f_011_001_100_011_1(uniques, 1);
+  f_011_001_100_100_0(uniques, 1);
+  f_011_001_100_100_1(uniques, 1);
+  f_011_001_100_101_0(uniques, 1);
+  f_011_001_100_101_1(uniques, 1);
+  f_011_001_100_110_0(uniques, 1);
+  f_011_001_100_110_1(uniques, 1);
+  f_011_001_100_111_0(uniques, 1);
+  f_011_001_100_111_1(uniques, 1);
+  f_011_001_101_000_0(uniques, 1);
+  f_011_001_101_000_1(uniques, 1);
+  f_011_001_101_001_0(uniques, 1);
+  f_011_001_101_001_1(uniques, 1);
+  f_011_001_101_010_0(uniques, 1);
+  f_011_001_101_010_1(uniques, 1);
+  f_011_001_101_011_0(uniques, 1);
+  f_011_001_101_011_1(uniques, 1);
+  f_011_001_101_100_0(uniques, 1);
+  f_011_001_101_100_1(uniques, 1);
+  f_011_001_101_101_0(uniques, 1);
+  f_011_001_101_101_1(uniques, 1);
+  f_011_001_101_110_0(uniques, 1);
+  f_011_001_101_110_1(uniques, 1);
+  f_011_001_101_111_0(uniques, 1);
+  f_011_001_101_111_1(uniques, 1);
+  f_011_001_110_000_0(uniques, 1);
+  f_011_001_110_000_1(uniques, 1);
+  f_011_001_110_001_0(uniques, 1);
+  f_011_001_110_001_1(uniques, 1);
+  f_011_001_110_010_0(uniques, 1);
+  f_011_001_110_010_1(uniques, 1);
+  f_011_001_110_011_0(uniques, 1);
+  f_011_001_110_011_1(uniques, 1);
+  f_011_001_110_100_0(uniques, 1);
+  f_011_001_110_100_1(uniques, 1);
+  f_011_001_110_101_0(uniques, 1);
+  f_011_001_110_101_1(uniques, 1);
+  f_011_001_110_110_0(uniques, 1);
+  f_011_001_110_110_1(uniques, 1);
+  f_011_001_110_111_0(uniques, 1);
+  f_011_001_110_111_1(uniques, 1);
+  f_011_001_111_000_0(uniques, 1);
+  f_011_001_111_000_1(uniques, 1);
+  f_011_001_111_001_0(uniques, 1);
+  f_011_001_111_001_1(uniques, 1);
+  f_011_001_111_010_0(uniques, 1);
+  f_011_001_111_010_1(uniques, 1);
+  f_011_001_111_011_0(uniques, 1);
+  f_011_001_111_011_1(uniques, 1);
+  f_011_001_111_100_0(uniques, 1);
+  f_011_001_111_100_1(uniques, 1);
+  f_011_001_111_101_0(uniques, 1);
+  f_011_001_111_101_1(uniques, 1);
+  f_011_001_111_110_0(uniques, 1);
+  f_011_001_111_110_1(uniques, 1);
+  f_011_001_111_111_0(uniques, 1);
+  f_011_001_111_111_1(uniques, 1);
+  f_011_010_000_000_0(uniques, 1);
+  f_011_010_000_000_1(uniques, 1);
+  f_011_010_000_001_0(uniques, 1);
+  f_011_010_000_001_1(uniques, 1);
+  f_011_010_000_010_0(uniques, 1);
+  f_011_010_000_010_1(uniques, 1);
+  f_011_010_000_011_0(uniques, 1);
+  f_011_010_000_011_1(uniques, 1);
+  f_011_010_000_100_0(uniques, 1);
+  f_011_010_000_100_1(uniques, 1);
+  f_011_010_000_101_0(uniques, 1);
+  f_011_010_000_101_1(uniques, 1);
+  f_011_010_000_110_0(uniques, 1);
+  f_011_010_000_110_1(uniques, 1);
+  f_011_010_000_111_0(uniques, 1);
+  f_011_010_000_111_1(uniques, 1);
+  f_011_010_001_000_0(uniques, 1);
+  f_011_010_001_000_1(uniques, 1);
+  f_011_010_001_001_0(uniques, 1);
+  f_011_010_001_001_1(uniques, 1);
+  f_011_010_001_010_0(uniques, 1);
+  f_011_010_001_010_1(uniques, 1);
+  f_011_010_001_011_0(uniques, 1);
+  f_011_010_001_011_1(uniques, 1);
+  f_011_010_001_100_0(uniques, 1);
+  f_011_010_001_100_1(uniques, 1);
+  f_011_010_001_101_0(uniques, 1);
+  f_011_010_001_101_1(uniques, 1);
+  f_011_010_001_110_0(uniques, 1);
+  f_011_010_001_110_1(uniques, 1);
+  f_011_010_001_111_0(uniques, 1);
+  f_011_010_001_111_1(uniques, 1);
+  f_011_010_010_000_0(uniques, 1);
+  f_011_010_010_000_1(uniques, 1);
+  f_011_010_010_001_0(uniques, 1);
+  f_011_010_010_001_1(uniques, 1);
+  f_011_010_010_010_0(uniques, 1);
+  f_011_010_010_010_1(uniques, 1);
+  f_011_010_010_011_0(uniques, 1);
+  f_011_010_010_011_1(uniques, 1);
+  f_011_010_010_100_0(uniques, 1);
+  f_011_010_010_100_1(uniques, 1);
+  f_011_010_010_101_0(uniques, 1);
+  f_011_010_010_101_1(uniques, 1);
+  f_011_010_010_110_0(uniques, 1);
+  f_011_010_010_110_1(uniques, 1);
+  f_011_010_010_111_0(uniques, 1);
+  f_011_010_010_111_1(uniques, 1);
+  f_011_010_011_000_0(uniques, 1);
+  f_011_010_011_000_1(uniques, 1);
+  f_011_010_011_001_0(uniques, 1);
+  f_011_010_011_001_1(uniques, 1);
+  f_011_010_011_010_0(uniques, 1);
+  f_011_010_011_010_1(uniques, 1);
+  f_011_010_011_011_0(uniques, 1);
+  f_011_010_011_011_1(uniques, 1);
+  f_011_010_011_100_0(uniques, 1);
+  f_011_010_011_100_1(uniques, 1);
+  f_011_010_011_101_0(uniques, 1);
+  f_011_010_011_101_1(uniques, 1);
+  f_011_010_011_110_0(uniques, 1);
+  f_011_010_011_110_1(uniques, 1);
+  f_011_010_011_111_0(uniques, 1);
+  f_011_010_011_111_1(uniques, 1);
+  f_011_010_100_000_0(uniques, 1);
+  f_011_010_100_000_1(uniques, 1);
+  f_011_010_100_001_0(uniques, 1);
+  f_011_010_100_001_1(uniques, 1);
+  f_011_010_100_010_0(uniques, 1);
+  f_011_010_100_010_1(uniques, 1);
+  f_011_010_100_011_0(uniques, 1);
+  f_011_010_100_011_1(uniques, 1);
+  f_011_010_100_100_0(uniques, 1);
+  f_011_010_100_100_1(uniques, 1);
+  f_011_010_100_101_0(uniques, 1);
+  f_011_010_100_101_1(uniques, 1);
+  f_011_010_100_110_0(uniques, 1);
+  f_011_010_100_110_1(uniques, 1);
+  f_011_010_100_111_0(uniques, 1);
+  f_011_010_100_111_1(uniques, 1);
+  f_011_010_101_000_0(uniques, 1);
+  f_011_010_101_000_1(uniques, 1);
+  f_011_010_101_001_0(uniques, 1);
+  f_011_010_101_001_1(uniques, 1);
+  f_011_010_101_010_0(uniques, 1);
+  f_011_010_101_010_1(uniques, 1);
+  f_011_010_101_011_0(uniques, 1);
+  f_011_010_101_011_1(uniques, 1);
+  f_011_010_101_100_0(uniques, 1);
+  f_011_010_101_100_1(uniques, 1);
+  f_011_010_101_101_0(uniques, 1);
+  f_011_010_101_101_1(uniques, 1);
+  f_011_010_101_110_0(uniques, 1);
+  f_011_010_101_110_1(uniques, 1);
+  f_011_010_101_111_0(uniques, 1);
+  f_011_010_101_111_1(uniques, 1);
+  f_011_010_110_000_0(uniques, 1);
+  f_011_010_110_000_1(uniques, 1);
+  f_011_010_110_001_0(uniques, 1);
+  f_011_010_110_001_1(uniques, 1);
+  f_011_010_110_010_0(uniques, 1);
+  f_011_010_110_010_1(uniques, 1);
+  f_011_010_110_011_0(uniques, 1);
+  f_011_010_110_011_1(uniques, 1);
+  f_011_010_110_100_0(uniques, 1);
+  f_011_010_110_100_1(uniques, 1);
+  f_011_010_110_101_0(uniques, 1);
+  f_011_010_110_101_1(uniques, 1);
+  f_011_010_110_110_0(uniques, 1);
+  f_011_010_110_110_1(uniques, 1);
+  f_011_010_110_111_0(uniques, 1);
+  f_011_010_110_111_1(uniques, 1);
+  f_011_010_111_000_0(uniques, 1);
+  f_011_010_111_000_1(uniques, 1);
+  f_011_010_111_001_0(uniques, 1);
+  f_011_010_111_001_1(uniques, 1);
+  f_011_010_111_010_0(uniques, 1);
+  f_011_010_111_010_1(uniques, 1);
+  f_011_010_111_011_0(uniques, 1);
+  f_011_010_111_011_1(uniques, 1);
+  f_011_010_111_100_0(uniques, 1);
+  f_011_010_111_100_1(uniques, 1);
+  f_011_010_111_101_0(uniques, 1);
+  f_011_010_111_101_1(uniques, 1);
+  f_011_010_111_110_0(uniques, 1);
+  f_011_010_111_110_1(uniques, 1);
+  f_011_010_111_111_0(uniques, 1);
+  f_011_010_111_111_1(uniques, 1);
+  f_011_011_000_000_0(uniques, 1);
+  f_011_011_000_000_1(uniques, 1);
+  f_011_011_000_001_0(uniques, 1);
+  f_011_011_000_001_1(uniques, 1);
+  f_011_011_000_010_0(uniques, 1);
+  f_011_011_000_010_1(uniques, 1);
+  f_011_011_000_011_0(uniques, 1);
+  f_011_011_000_011_1(uniques, 1);
+  f_011_011_000_100_0(uniques, 1);
+  f_011_011_000_100_1(uniques, 1);
+  f_011_011_000_101_0(uniques, 1);
+  f_011_011_000_101_1(uniques, 1);
+  f_011_011_000_110_0(uniques, 1);
+  f_011_011_000_110_1(uniques, 1);
+  f_011_011_000_111_0(uniques, 1);
+  f_011_011_000_111_1(uniques, 1);
+  f_011_011_001_000_0(uniques, 1);
+  f_011_011_001_000_1(uniques, 1);
+  f_011_011_001_001_0(uniques, 1);
+  f_011_011_001_001_1(uniques, 1);
+  f_011_011_001_010_0(uniques, 1);
+  f_011_011_001_010_1(uniques, 1);
+  f_011_011_001_011_0(uniques, 1);
+  f_011_011_001_011_1(uniques, 1);
+  f_011_011_001_100_0(uniques, 1);
+  f_011_011_001_100_1(uniques, 1);
+  f_011_011_001_101_0(uniques, 1);
+  f_011_011_001_101_1(uniques, 1);
+  f_011_011_001_110_0(uniques, 1);
+  f_011_011_001_110_1(uniques, 1);
+  f_011_011_001_111_0(uniques, 1);
+  f_011_011_001_111_1(uniques, 1);
+  f_011_011_010_000_0(uniques, 1);
+  f_011_011_010_000_1(uniques, 1);
+  f_011_011_010_001_0(uniques, 1);
+  f_011_011_010_001_1(uniques, 1);
+  f_011_011_010_010_0(uniques, 1);
+  f_011_011_010_010_1(uniques, 1);
+  f_011_011_010_011_0(uniques, 1);
+  f_011_011_010_011_1(uniques, 1);
+  f_011_011_010_100_0(uniques, 1);
+  f_011_011_010_100_1(uniques, 1);
+  f_011_011_010_101_0(uniques, 1);
+  f_011_011_010_101_1(uniques, 1);
+  f_011_011_010_110_0(uniques, 1);
+  f_011_011_010_110_1(uniques, 1);
+  f_011_011_010_111_0(uniques, 1);
+  f_011_011_010_111_1(uniques, 1);
+  f_011_011_011_000_0(uniques, 1);
+  f_011_011_011_000_1(uniques, 1);
+  f_011_011_011_001_0(uniques, 1);
+  f_011_011_011_001_1(uniques, 1);
+  f_011_011_011_010_0(uniques, 1);
+  f_011_011_011_010_1(uniques, 1);
+  f_011_011_011_011_0(uniques, 1);
+  f_011_011_011_011_1(uniques, 1);
+  f_011_011_011_100_0(uniques, 1);
+  f_011_011_011_100_1(uniques, 1);
+  f_011_011_011_101_0(uniques, 1);
+  f_011_011_011_101_1(uniques, 1);
+  f_011_011_011_110_0(uniques, 1);
+  f_011_011_011_110_1(uniques, 1);
+  f_011_011_011_111_0(uniques, 1);
+  f_011_011_011_111_1(uniques, 1);
+  f_011_011_100_000_0(uniques, 1);
+  f_011_011_100_000_1(uniques, 1);
+  f_011_011_100_001_0(uniques, 1);
+  f_011_011_100_001_1(uniques, 1);
+  f_011_011_100_010_0(uniques, 1);
+  f_011_011_100_010_1(uniques, 1);
+  f_011_011_100_011_0(uniques, 1);
+  f_011_011_100_011_1(uniques, 1);
+  f_011_011_100_100_0(uniques, 1);
+  f_011_011_100_100_1(uniques, 1);
+  f_011_011_100_101_0(uniques, 1);
+  f_011_011_100_101_1(uniques, 1);
+  f_011_011_100_110_0(uniques, 1);
+  f_011_011_100_110_1(uniques, 1);
+  f_011_011_100_111_0(uniques, 1);
+  f_011_011_100_111_1(uniques, 1);
+  f_011_011_101_000_0(uniques, 1);
+  f_011_011_101_000_1(uniques, 1);
+  f_011_011_101_001_0(uniques, 1);
+  f_011_011_101_001_1(uniques, 1);
+  f_011_011_101_010_0(uniques, 1);
+  f_011_011_101_010_1(uniques, 1);
+  f_011_011_101_011_0(uniques, 1);
+  f_011_011_101_011_1(uniques, 1);
+  f_011_011_101_100_0(uniques, 1);
+  f_011_011_101_100_1(uniques, 1);
+  f_011_011_101_101_0(uniques, 1);
+  f_011_011_101_101_1(uniques, 1);
+  f_011_011_101_110_0(uniques, 1);
+  f_011_011_101_110_1(uniques, 1);
+  f_011_011_101_111_0(uniques, 1);
+  f_011_011_101_111_1(uniques, 1);
+  f_011_011_110_000_0(uniques, 1);
+  f_011_011_110_000_1(uniques, 1);
+  f_011_011_110_001_0(uniques, 1);
+  f_011_011_110_001_1(uniques, 1);
+  f_011_011_110_010_0(uniques, 1);
+  f_011_011_110_010_1(uniques, 1);
+  f_011_011_110_011_0(uniques, 1);
+  f_011_011_110_011_1(uniques, 1);
+  f_011_011_110_100_0(uniques, 1);
+  f_011_011_110_100_1(uniques, 1);
+  f_011_011_110_101_0(uniques, 1);
+  f_011_011_110_101_1(uniques, 1);
+  f_011_011_110_110_0(uniques, 1);
+  f_011_011_110_110_1(uniques, 1);
+  f_011_011_110_111_0(uniques, 1);
+  f_011_011_110_111_1(uniques, 1);
+  f_011_011_111_000_0(uniques, 1);
+  f_011_011_111_000_1(uniques, 1);
+  f_011_011_111_001_0(uniques, 1);
+  f_011_011_111_001_1(uniques, 1);
+  f_011_011_111_010_0(uniques, 1);
+  f_011_011_111_010_1(uniques, 1);
+  f_011_011_111_011_0(uniques, 1);
+  f_011_011_111_011_1(uniques, 1);
+  f_011_011_111_100_0(uniques, 1);
+  f_011_011_111_100_1(uniques, 1);
+  f_011_011_111_101_0(uniques, 1);
+  f_011_011_111_101_1(uniques, 1);
+  f_011_011_111_110_0(uniques, 1);
+  f_011_011_111_110_1(uniques, 1);
+  f_011_011_111_111_0(uniques, 1);
+  f_011_011_111_111_1(uniques, 1);
+  f_011_100_000_000_0(uniques, 1);
+  f_011_100_000_000_1(uniques, 1);
+  f_011_100_000_001_0(uniques, 1);
+  f_011_100_000_001_1(uniques, 1);
+  f_011_100_000_010_0(uniques, 1);
+  f_011_100_000_010_1(uniques, 1);
+  f_011_100_000_011_0(uniques, 1);
+  f_011_100_000_011_1(uniques, 1);
+  f_011_100_000_100_0(uniques, 1);
+  f_011_100_000_100_1(uniques, 1);
+  f_011_100_000_101_0(uniques, 1);
+  f_011_100_000_101_1(uniques, 1);
+  f_011_100_000_110_0(uniques, 1);
+  f_011_100_000_110_1(uniques, 1);
+  f_011_100_000_111_0(uniques, 1);
+  f_011_100_000_111_1(uniques, 1);
+  f_011_100_001_000_0(uniques, 1);
+  f_011_100_001_000_1(uniques, 1);
+  f_011_100_001_001_0(uniques, 1);
+  f_011_100_001_001_1(uniques, 1);
+  f_011_100_001_010_0(uniques, 1);
+  f_011_100_001_010_1(uniques, 1);
+  f_011_100_001_011_0(uniques, 1);
+  f_011_100_001_011_1(uniques, 1);
+  f_011_100_001_100_0(uniques, 1);
+  f_011_100_001_100_1(uniques, 1);
+  f_011_100_001_101_0(uniques, 1);
+  f_011_100_001_101_1(uniques, 1);
+  f_011_100_001_110_0(uniques, 1);
+  f_011_100_001_110_1(uniques, 1);
+  f_011_100_001_111_0(uniques, 1);
+  f_011_100_001_111_1(uniques, 1);
+  f_011_100_010_000_0(uniques, 1);
+  f_011_100_010_000_1(uniques, 1);
+  f_011_100_010_001_0(uniques, 1);
+  f_011_100_010_001_1(uniques, 1);
+  f_011_100_010_010_0(uniques, 1);
+  f_011_100_010_010_1(uniques, 1);
+  f_011_100_010_011_0(uniques, 1);
+  f_011_100_010_011_1(uniques, 1);
+  f_011_100_010_100_0(uniques, 1);
+  f_011_100_010_100_1(uniques, 1);
+  f_011_100_010_101_0(uniques, 1);
+  f_011_100_010_101_1(uniques, 1);
+  f_011_100_010_110_0(uniques, 1);
+  f_011_100_010_110_1(uniques, 1);
+  f_011_100_010_111_0(uniques, 1);
+  f_011_100_010_111_1(uniques, 1);
+  f_011_100_011_000_0(uniques, 1);
+  f_011_100_011_000_1(uniques, 1);
+  f_011_100_011_001_0(uniques, 1);
+  f_011_100_011_001_1(uniques, 1);
+  f_011_100_011_010_0(uniques, 1);
+  f_011_100_011_010_1(uniques, 1);
+  f_011_100_011_011_0(uniques, 1);
+  f_011_100_011_011_1(uniques, 1);
+  f_011_100_011_100_0(uniques, 1);
+  f_011_100_011_100_1(uniques, 1);
+  f_011_100_011_101_0(uniques, 1);
+  f_011_100_011_101_1(uniques, 1);
+  f_011_100_011_110_0(uniques, 1);
+  f_011_100_011_110_1(uniques, 1);
+  f_011_100_011_111_0(uniques, 1);
+  f_011_100_011_111_1(uniques, 1);
+  f_011_100_100_000_0(uniques, 1);
+  f_011_100_100_000_1(uniques, 1);
+  f_011_100_100_001_0(uniques, 1);
+  f_011_100_100_001_1(uniques, 1);
+  f_011_100_100_010_0(uniques, 1);
+  f_011_100_100_010_1(uniques, 1);
+  f_011_100_100_011_0(uniques, 1);
+  f_011_100_100_011_1(uniques, 1);
+  f_011_100_100_100_0(uniques, 1);
+  f_011_100_100_100_1(uniques, 1);
+  f_011_100_100_101_0(uniques, 1);
+  f_011_100_100_101_1(uniques, 1);
+  f_011_100_100_110_0(uniques, 1);
+  f_011_100_100_110_1(uniques, 1);
+  f_011_100_100_111_0(uniques, 1);
+  f_011_100_100_111_1(uniques, 1);
+  f_011_100_101_000_0(uniques, 1);
+  f_011_100_101_000_1(uniques, 1);
+  f_011_100_101_001_0(uniques, 1);
+  f_011_100_101_001_1(uniques, 1);
+  f_011_100_101_010_0(uniques, 1);
+  f_011_100_101_010_1(uniques, 1);
+  f_011_100_101_011_0(uniques, 1);
+  f_011_100_101_011_1(uniques, 1);
+  f_011_100_101_100_0(uniques, 1);
+  f_011_100_101_100_1(uniques, 1);
+  f_011_100_101_101_0(uniques, 1);
+  f_011_100_101_101_1(uniques, 1);
+  f_011_100_101_110_0(uniques, 1);
+  f_011_100_101_110_1(uniques, 1);
+  f_011_100_101_111_0(uniques, 1);
+  f_011_100_101_111_1(uniques, 1);
+  f_011_100_110_000_0(uniques, 1);
+  f_011_100_110_000_1(uniques, 1);
+  f_011_100_110_001_0(uniques, 1);
+  f_011_100_110_001_1(uniques, 1);
+  f_011_100_110_010_0(uniques, 1);
+  f_011_100_110_010_1(uniques, 1);
+  f_011_100_110_011_0(uniques, 1);
+  f_011_100_110_011_1(uniques, 1);
+  f_011_100_110_100_0(uniques, 1);
+  f_011_100_110_100_1(uniques, 1);
+  f_011_100_110_101_0(uniques, 1);
+  f_011_100_110_101_1(uniques, 1);
+  f_011_100_110_110_0(uniques, 1);
+  f_011_100_110_110_1(uniques, 1);
+  f_011_100_110_111_0(uniques, 1);
+  f_011_100_110_111_1(uniques, 1);
+  f_011_100_111_000_0(uniques, 1);
+  f_011_100_111_000_1(uniques, 1);
+  f_011_100_111_001_0(uniques, 1);
+  f_011_100_111_001_1(uniques, 1);
+  f_011_100_111_010_0(uniques, 1);
+  f_011_100_111_010_1(uniques, 1);
+  f_011_100_111_011_0(uniques, 1);
+  f_011_100_111_011_1(uniques, 1);
+  f_011_100_111_100_0(uniques, 1);
+  f_011_100_111_100_1(uniques, 1);
+  f_011_100_111_101_0(uniques, 1);
+  f_011_100_111_101_1(uniques, 1);
+  f_011_100_111_110_0(uniques, 1);
+  f_011_100_111_110_1(uniques, 1);
+  f_011_100_111_111_0(uniques, 1);
+  f_011_100_111_111_1(uniques, 1);
+  f_011_101_000_000_0(uniques, 1);
+  f_011_101_000_000_1(uniques, 1);
+  f_011_101_000_001_0(uniques, 1);
+  f_011_101_000_001_1(uniques, 1);
+  f_011_101_000_010_0(uniques, 1);
+  f_011_101_000_010_1(uniques, 1);
+  f_011_101_000_011_0(uniques, 1);
+  f_011_101_000_011_1(uniques, 1);
+  f_011_101_000_100_0(uniques, 1);
+  f_011_101_000_100_1(uniques, 1);
+  f_011_101_000_101_0(uniques, 1);
+  f_011_101_000_101_1(uniques, 1);
+  f_011_101_000_110_0(uniques, 1);
+  f_011_101_000_110_1(uniques, 1);
+  f_011_101_000_111_0(uniques, 1);
+  f_011_101_000_111_1(uniques, 1);
+  f_011_101_001_000_0(uniques, 1);
+  f_011_101_001_000_1(uniques, 1);
+  f_011_101_001_001_0(uniques, 1);
+  f_011_101_001_001_1(uniques, 1);
+  f_011_101_001_010_0(uniques, 1);
+  f_011_101_001_010_1(uniques, 1);
+  f_011_101_001_011_0(uniques, 1);
+  f_011_101_001_011_1(uniques, 1);
+  f_011_101_001_100_0(uniques, 1);
+  f_011_101_001_100_1(uniques, 1);
+  f_011_101_001_101_0(uniques, 1);
+  f_011_101_001_101_1(uniques, 1);
+  f_011_101_001_110_0(uniques, 1);
+  f_011_101_001_110_1(uniques, 1);
+  f_011_101_001_111_0(uniques, 1);
+  f_011_101_001_111_1(uniques, 1);
+  f_011_101_010_000_0(uniques, 1);
+  f_011_101_010_000_1(uniques, 1);
+  f_011_101_010_001_0(uniques, 1);
+  f_011_101_010_001_1(uniques, 1);
+  f_011_101_010_010_0(uniques, 1);
+  f_011_101_010_010_1(uniques, 1);
+  f_011_101_010_011_0(uniques, 1);
+  f_011_101_010_011_1(uniques, 1);
+  f_011_101_010_100_0(uniques, 1);
+  f_011_101_010_100_1(uniques, 1);
+  f_011_101_010_101_0(uniques, 1);
+  f_011_101_010_101_1(uniques, 1);
+  f_011_101_010_110_0(uniques, 1);
+  f_011_101_010_110_1(uniques, 1);
+  f_011_101_010_111_0(uniques, 1);
+  f_011_101_010_111_1(uniques, 1);
+  f_011_101_011_000_0(uniques, 1);
+  f_011_101_011_000_1(uniques, 1);
+  f_011_101_011_001_0(uniques, 1);
+  f_011_101_011_001_1(uniques, 1);
+  f_011_101_011_010_0(uniques, 1);
+  f_011_101_011_010_1(uniques, 1);
+  f_011_101_011_011_0(uniques, 1);
+  f_011_101_011_011_1(uniques, 1);
+  f_011_101_011_100_0(uniques, 1);
+  f_011_101_011_100_1(uniques, 1);
+  f_011_101_011_101_0(uniques, 1);
+  f_011_101_011_101_1(uniques, 1);
+  f_011_101_011_110_0(uniques, 1);
+  f_011_101_011_110_1(uniques, 1);
+  f_011_101_011_111_0(uniques, 1);
+  f_011_101_011_111_1(uniques, 1);
+  f_011_101_100_000_0(uniques, 1);
+  f_011_101_100_000_1(uniques, 1);
+  f_011_101_100_001_0(uniques, 1);
+  f_011_101_100_001_1(uniques, 1);
+  f_011_101_100_010_0(uniques, 1);
+  f_011_101_100_010_1(uniques, 1);
+  f_011_101_100_011_0(uniques, 1);
+  f_011_101_100_011_1(uniques, 1);
+  f_011_101_100_100_0(uniques, 1);
+  f_011_101_100_100_1(uniques, 1);
+  f_011_101_100_101_0(uniques, 1);
+  f_011_101_100_101_1(uniques, 1);
+  f_011_101_100_110_0(uniques, 1);
+  f_011_101_100_110_1(uniques, 1);
+  f_011_101_100_111_0(uniques, 1);
+  f_011_101_100_111_1(uniques, 1);
+  f_011_101_101_000_0(uniques, 1);
+  f_011_101_101_000_1(uniques, 1);
+  f_011_101_101_001_0(uniques, 1);
+  f_011_101_101_001_1(uniques, 1);
+  f_011_101_101_010_0(uniques, 1);
+  f_011_101_101_010_1(uniques, 1);
+  f_011_101_101_011_0(uniques, 1);
+  f_011_101_101_011_1(uniques, 1);
+  f_011_101_101_100_0(uniques, 1);
+  f_011_101_101_100_1(uniques, 1);
+  f_011_101_101_101_0(uniques, 1);
+  f_011_101_101_101_1(uniques, 1);
+  f_011_101_101_110_0(uniques, 1);
+  f_011_101_101_110_1(uniques, 1);
+  f_011_101_101_111_0(uniques, 1);
+  f_011_101_101_111_1(uniques, 1);
+  f_011_101_110_000_0(uniques, 1);
+  f_011_101_110_000_1(uniques, 1);
+  f_011_101_110_001_0(uniques, 1);
+  f_011_101_110_001_1(uniques, 1);
+  f_011_101_110_010_0(uniques, 1);
+  f_011_101_110_010_1(uniques, 1);
+  f_011_101_110_011_0(uniques, 1);
+  f_011_101_110_011_1(uniques, 1);
+  f_011_101_110_100_0(uniques, 1);
+  f_011_101_110_100_1(uniques, 1);
+  f_011_101_110_101_0(uniques, 1);
+  f_011_101_110_101_1(uniques, 1);
+  f_011_101_110_110_0(uniques, 1);
+  f_011_101_110_110_1(uniques, 1);
+  f_011_101_110_111_0(uniques, 1);
+  f_011_101_110_111_1(uniques, 1);
+  f_011_101_111_000_0(uniques, 1);
+  f_011_101_111_000_1(uniques, 1);
+  f_011_101_111_001_0(uniques, 1);
+  f_011_101_111_001_1(uniques, 1);
+  f_011_101_111_010_0(uniques, 1);
+  f_011_101_111_010_1(uniques, 1);
+  f_011_101_111_011_0(uniques, 1);
+  f_011_101_111_011_1(uniques, 1);
+  f_011_101_111_100_0(uniques, 1);
+  f_011_101_111_100_1(uniques, 1);
+  f_011_101_111_101_0(uniques, 1);
+  f_011_101_111_101_1(uniques, 1);
+  f_011_101_111_110_0(uniques, 1);
+  f_011_101_111_110_1(uniques, 1);
+  f_011_101_111_111_0(uniques, 1);
+  f_011_101_111_111_1(uniques, 1);
+  f_011_110_000_000_0(uniques, 1);
+  f_011_110_000_000_1(uniques, 1);
+  f_011_110_000_001_0(uniques, 1);
+  f_011_110_000_001_1(uniques, 1);
+  f_011_110_000_010_0(uniques, 1);
+  f_011_110_000_010_1(uniques, 1);
+  f_011_110_000_011_0(uniques, 1);
+  f_011_110_000_011_1(uniques, 1);
+  f_011_110_000_100_0(uniques, 1);
+  f_011_110_000_100_1(uniques, 1);
+  f_011_110_000_101_0(uniques, 1);
+  f_011_110_000_101_1(uniques, 1);
+  f_011_110_000_110_0(uniques, 1);
+  f_011_110_000_110_1(uniques, 1);
+  f_011_110_000_111_0(uniques, 1);
+  f_011_110_000_111_1(uniques, 1);
+  f_011_110_001_000_0(uniques, 1);
+  f_011_110_001_000_1(uniques, 1);
+  f_011_110_001_001_0(uniques, 1);
+  f_011_110_001_001_1(uniques, 1);
+  f_011_110_001_010_0(uniques, 1);
+  f_011_110_001_010_1(uniques, 1);
+  f_011_110_001_011_0(uniques, 1);
+  f_011_110_001_011_1(uniques, 1);
+  f_011_110_001_100_0(uniques, 1);
+  f_011_110_001_100_1(uniques, 1);
+  f_011_110_001_101_0(uniques, 1);
+  f_011_110_001_101_1(uniques, 1);
+  f_011_110_001_110_0(uniques, 1);
+  f_011_110_001_110_1(uniques, 1);
+  f_011_110_001_111_0(uniques, 1);
+  f_011_110_001_111_1(uniques, 1);
+  f_011_110_010_000_0(uniques, 1);
+  f_011_110_010_000_1(uniques, 1);
+  f_011_110_010_001_0(uniques, 1);
+  f_011_110_010_001_1(uniques, 1);
+  f_011_110_010_010_0(uniques, 1);
+  f_011_110_010_010_1(uniques, 1);
+  f_011_110_010_011_0(uniques, 1);
+  f_011_110_010_011_1(uniques, 1);
+  f_011_110_010_100_0(uniques, 1);
+  f_011_110_010_100_1(uniques, 1);
+  f_011_110_010_101_0(uniques, 1);
+  f_011_110_010_101_1(uniques, 1);
+  f_011_110_010_110_0(uniques, 1);
+  f_011_110_010_110_1(uniques, 1);
+  f_011_110_010_111_0(uniques, 1);
+  f_011_110_010_111_1(uniques, 1);
+  f_011_110_011_000_0(uniques, 1);
+  f_011_110_011_000_1(uniques, 1);
+  f_011_110_011_001_0(uniques, 1);
+  f_011_110_011_001_1(uniques, 1);
+  f_011_110_011_010_0(uniques, 1);
+  f_011_110_011_010_1(uniques, 1);
+  f_011_110_011_011_0(uniques, 1);
+  f_011_110_011_011_1(uniques, 1);
+  f_011_110_011_100_0(uniques, 1);
+  f_011_110_011_100_1(uniques, 1);
+  f_011_110_011_101_0(uniques, 1);
+  f_011_110_011_101_1(uniques, 1);
+  f_011_110_011_110_0(uniques, 1);
+  f_011_110_011_110_1(uniques, 1);
+  f_011_110_011_111_0(uniques, 1);
+  f_011_110_011_111_1(uniques, 1);
+  f_011_110_100_000_0(uniques, 1);
+  f_011_110_100_000_1(uniques, 1);
+  f_011_110_100_001_0(uniques, 1);
+  f_011_110_100_001_1(uniques, 1);
+  f_011_110_100_010_0(uniques, 1);
+  f_011_110_100_010_1(uniques, 1);
+  f_011_110_100_011_0(uniques, 1);
+  f_011_110_100_011_1(uniques, 1);
+  f_011_110_100_100_0(uniques, 1);
+  f_011_110_100_100_1(uniques, 1);
+  f_011_110_100_101_0(uniques, 1);
+  f_011_110_100_101_1(uniques, 1);
+  f_011_110_100_110_0(uniques, 1);
+  f_011_110_100_110_1(uniques, 1);
+  f_011_110_100_111_0(uniques, 1);
+  f_011_110_100_111_1(uniques, 1);
+  f_011_110_101_000_0(uniques, 1);
+  f_011_110_101_000_1(uniques, 1);
+  f_011_110_101_001_0(uniques, 1);
+  f_011_110_101_001_1(uniques, 1);
+  f_011_110_101_010_0(uniques, 1);
+  f_011_110_101_010_1(uniques, 1);
+  f_011_110_101_011_0(uniques, 1);
+  f_011_110_101_011_1(uniques, 1);
+  f_011_110_101_100_0(uniques, 1);
+  f_011_110_101_100_1(uniques, 1);
+  f_011_110_101_101_0(uniques, 1);
+  f_011_110_101_101_1(uniques, 1);
+  f_011_110_101_110_0(uniques, 1);
+  f_011_110_101_110_1(uniques, 1);
+  f_011_110_101_111_0(uniques, 1);
+  f_011_110_101_111_1(uniques, 1);
+  f_011_110_110_000_0(uniques, 1);
+  f_011_110_110_000_1(uniques, 1);
+  f_011_110_110_001_0(uniques, 1);
+  f_011_110_110_001_1(uniques, 1);
+  f_011_110_110_010_0(uniques, 1);
+  f_011_110_110_010_1(uniques, 1);
+  f_011_110_110_011_0(uniques, 1);
+  f_011_110_110_011_1(uniques, 1);
+  f_011_110_110_100_0(uniques, 1);
+  f_011_110_110_100_1(uniques, 1);
+  f_011_110_110_101_0(uniques, 1);
+  f_011_110_110_101_1(uniques, 1);
+  f_011_110_110_110_0(uniques, 1);
+  f_011_110_110_110_1(uniques, 1);
+  f_011_110_110_111_0(uniques, 1);
+  f_011_110_110_111_1(uniques, 1);
+  f_011_110_111_000_0(uniques, 1);
+  f_011_110_111_000_1(uniques, 1);
+  f_011_110_111_001_0(uniques, 1);
+  f_011_110_111_001_1(uniques, 1);
+  f_011_110_111_010_0(uniques, 1);
+  f_011_110_111_010_1(uniques, 1);
+  f_011_110_111_011_0(uniques, 1);
+  f_011_110_111_011_1(uniques, 1);
+  f_011_110_111_100_0(uniques, 1);
+  f_011_110_111_100_1(uniques, 1);
+  f_011_110_111_101_0(uniques, 1);
+  f_011_110_111_101_1(uniques, 1);
+  f_011_110_111_110_0(uniques, 1);
+  f_011_110_111_110_1(uniques, 1);
+  f_011_110_111_111_0(uniques, 1);
+  f_011_110_111_111_1(uniques, 1);
+  f_011_111_000_000_0(uniques, 1);
+  f_011_111_000_000_1(uniques, 1);
+  f_011_111_000_001_0(uniques, 1);
+  f_011_111_000_001_1(uniques, 1);
+  f_011_111_000_010_0(uniques, 1);
+  f_011_111_000_010_1(uniques, 1);
+  f_011_111_000_011_0(uniques, 1);
+  f_011_111_000_011_1(uniques, 1);
+  f_011_111_000_100_0(uniques, 1);
+  f_011_111_000_100_1(uniques, 1);
+  f_011_111_000_101_0(uniques, 1);
+  f_011_111_000_101_1(uniques, 1);
+  f_011_111_000_110_0(uniques, 1);
+  f_011_111_000_110_1(uniques, 1);
+  f_011_111_000_111_0(uniques, 1);
+  f_011_111_000_111_1(uniques, 1);
+  f_011_111_001_000_0(uniques, 1);
+  f_011_111_001_000_1(uniques, 1);
+  f_011_111_001_001_0(uniques, 1);
+  f_011_111_001_001_1(uniques, 1);
+  f_011_111_001_010_0(uniques, 1);
+  f_011_111_001_010_1(uniques, 1);
+  f_011_111_001_011_0(uniques, 1);
+  f_011_111_001_011_1(uniques, 1);
+  f_011_111_001_100_0(uniques, 1);
+  f_011_111_001_100_1(uniques, 1);
+  f_011_111_001_101_0(uniques, 1);
+  f_011_111_001_101_1(uniques, 1);
+  f_011_111_001_110_0(uniques, 1);
+  f_011_111_001_110_1(uniques, 1);
+  f_011_111_001_111_0(uniques, 1);
+  f_011_111_001_111_1(uniques, 1);
+  f_011_111_010_000_0(uniques, 1);
+  f_011_111_010_000_1(uniques, 1);
+  f_011_111_010_001_0(uniques, 1);
+  f_011_111_010_001_1(uniques, 1);
+  f_011_111_010_010_0(uniques, 1);
+  f_011_111_010_010_1(uniques, 1);
+  f_011_111_010_011_0(uniques, 1);
+  f_011_111_010_011_1(uniques, 1);
+  f_011_111_010_100_0(uniques, 1);
+  f_011_111_010_100_1(uniques, 1);
+  f_011_111_010_101_0(uniques, 1);
+  f_011_111_010_101_1(uniques, 1);
+  f_011_111_010_110_0(uniques, 1);
+  f_011_111_010_110_1(uniques, 1);
+  f_011_111_010_111_0(uniques, 1);
+  f_011_111_010_111_1(uniques, 1);
+  f_011_111_011_000_0(uniques, 1);
+  f_011_111_011_000_1(uniques, 1);
+  f_011_111_011_001_0(uniques, 1);
+  f_011_111_011_001_1(uniques, 1);
+  f_011_111_011_010_0(uniques, 1);
+  f_011_111_011_010_1(uniques, 1);
+  f_011_111_011_011_0(uniques, 1);
+  f_011_111_011_011_1(uniques, 1);
+  f_011_111_011_100_0(uniques, 1);
+  f_011_111_011_100_1(uniques, 1);
+  f_011_111_011_101_0(uniques, 1);
+  f_011_111_011_101_1(uniques, 1);
+  f_011_111_011_110_0(uniques, 1);
+  f_011_111_011_110_1(uniques, 1);
+  f_011_111_011_111_0(uniques, 1);
+  f_011_111_011_111_1(uniques, 1);
+  f_011_111_100_000_0(uniques, 1);
+  f_011_111_100_000_1(uniques, 1);
+  f_011_111_100_001_0(uniques, 1);
+  f_011_111_100_001_1(uniques, 1);
+  f_011_111_100_010_0(uniques, 1);
+  f_011_111_100_010_1(uniques, 1);
+  f_011_111_100_011_0(uniques, 1);
+  f_011_111_100_011_1(uniques, 1);
+  f_011_111_100_100_0(uniques, 1);
+  f_011_111_100_100_1(uniques, 1);
+  f_011_111_100_101_0(uniques, 1);
+  f_011_111_100_101_1(uniques, 1);
+  f_011_111_100_110_0(uniques, 1);
+  f_011_111_100_110_1(uniques, 1);
+  f_011_111_100_111_0(uniques, 1);
+  f_011_111_100_111_1(uniques, 1);
+  f_011_111_101_000_0(uniques, 1);
+  f_011_111_101_000_1(uniques, 1);
+  f_011_111_101_001_0(uniques, 1);
+  f_011_111_101_001_1(uniques, 1);
+  f_011_111_101_010_0(uniques, 1);
+  f_011_111_101_010_1(uniques, 1);
+  f_011_111_101_011_0(uniques, 1);
+  f_011_111_101_011_1(uniques, 1);
+  f_011_111_101_100_0(uniques, 1);
+  f_011_111_101_100_1(uniques, 1);
+  f_011_111_101_101_0(uniques, 1);
+  f_011_111_101_101_1(uniques, 1);
+  f_011_111_101_110_0(uniques, 1);
+  f_011_111_101_110_1(uniques, 1);
+  f_011_111_101_111_0(uniques, 1);
+  f_011_111_101_111_1(uniques, 1);
+  f_011_111_110_000_0(uniques, 1);
+  f_011_111_110_000_1(uniques, 1);
+  f_011_111_110_001_0(uniques, 1);
+  f_011_111_110_001_1(uniques, 1);
+  f_011_111_110_010_0(uniques, 1);
+  f_011_111_110_010_1(uniques, 1);
+  f_011_111_110_011_0(uniques, 1);
+  f_011_111_110_011_1(uniques, 1);
+  f_011_111_110_100_0(uniques, 1);
+  f_011_111_110_100_1(uniques, 1);
+  f_011_111_110_101_0(uniques, 1);
+  f_011_111_110_101_1(uniques, 1);
+  f_011_111_110_110_0(uniques, 1);
+  f_011_111_110_110_1(uniques, 1);
+  f_011_111_110_111_0(uniques, 1);
+  f_011_111_110_111_1(uniques, 1);
+  f_011_111_111_000_0(uniques, 1);
+  f_011_111_111_000_1(uniques, 1);
+  f_011_111_111_001_0(uniques, 1);
+  f_011_111_111_001_1(uniques, 1);
+  f_011_111_111_010_0(uniques, 1);
+  f_011_111_111_010_1(uniques, 1);
+  f_011_111_111_011_0(uniques, 1);
+  f_011_111_111_011_1(uniques, 1);
+  f_011_111_111_100_0(uniques, 1);
+  f_011_111_111_100_1(uniques, 1);
+  f_011_111_111_101_0(uniques, 1);
+  f_011_111_111_101_1(uniques, 1);
+  f_011_111_111_110_0(uniques, 1);
+  f_011_111_111_110_1(uniques, 1);
+  f_011_111_111_111_0(uniques, 1);
+  f_011_111_111_111_1(uniques, 1);
+  f_110_000_000_000_0(uniques, 1);
+  f_110_000_000_000_1(uniques, 1);
+  f_110_000_000_001_0(uniques, 1);
+  f_110_000_000_001_1(uniques, 1);
+  f_110_000_000_010_0(uniques, 1);
+  f_110_000_000_010_1(uniques, 1);
+  f_110_000_000_011_0(uniques, 1);
+  f_110_000_000_011_1(uniques, 1);
+  f_110_000_000_100_0(uniques, 1);
+  f_110_000_000_100_1(uniques, 1);
+  f_110_000_000_101_0(uniques, 1);
+  f_110_000_000_101_1(uniques, 1);
+  f_110_000_000_110_0(uniques, 1);
+  f_110_000_000_110_1(uniques, 1);
+  f_110_000_000_111_0(uniques, 1);
+  f_110_000_000_111_1(uniques, 1);
+  f_110_000_001_000_0(uniques, 1);
+  f_110_000_001_000_1(uniques, 1);
+  f_110_000_001_001_0(uniques, 1);
+  f_110_000_001_001_1(uniques, 1);
+  f_110_000_001_010_0(uniques, 1);
+  f_110_000_001_010_1(uniques, 1);
+  f_110_000_001_011_0(uniques, 1);
+  f_110_000_001_011_1(uniques, 1);
+  f_110_000_001_100_0(uniques, 1);
+  f_110_000_001_100_1(uniques, 1);
+  f_110_000_001_101_0(uniques, 1);
+  f_110_000_001_101_1(uniques, 1);
+  f_110_000_001_110_0(uniques, 1);
+  f_110_000_001_110_1(uniques, 1);
+  f_110_000_001_111_0(uniques, 1);
+  f_110_000_001_111_1(uniques, 1);
+  f_110_000_010_000_0(uniques, 1);
+  f_110_000_010_000_1(uniques, 1);
+  f_110_000_010_001_0(uniques, 1);
+  f_110_000_010_001_1(uniques, 1);
+  f_110_000_010_010_0(uniques, 1);
+  f_110_000_010_010_1(uniques, 1);
+  f_110_000_010_011_0(uniques, 1);
+  f_110_000_010_011_1(uniques, 1);
+  f_110_000_010_100_0(uniques, 1);
+  f_110_000_010_100_1(uniques, 1);
+  f_110_000_010_101_0(uniques, 1);
+  f_110_000_010_101_1(uniques, 1);
+  f_110_000_010_110_0(uniques, 1);
+  f_110_000_010_110_1(uniques, 1);
+  f_110_000_010_111_0(uniques, 1);
+  f_110_000_010_111_1(uniques, 1);
+  f_110_000_011_000_0(uniques, 1);
+  f_110_000_011_000_1(uniques, 1);
+  f_110_000_011_001_0(uniques, 1);
+  f_110_000_011_001_1(uniques, 1);
+  f_110_000_011_010_0(uniques, 1);
+  f_110_000_011_010_1(uniques, 1);
+  f_110_000_011_011_0(uniques, 1);
+  f_110_000_011_011_1(uniques, 1);
+  f_110_000_011_100_0(uniques, 1);
+  f_110_000_011_100_1(uniques, 1);
+  f_110_000_011_101_0(uniques, 1);
+  f_110_000_011_101_1(uniques, 1);
+  f_110_000_011_110_0(uniques, 1);
+  f_110_000_011_110_1(uniques, 1);
+  f_110_000_011_111_0(uniques, 1);
+  f_110_000_011_111_1(uniques, 1);
+  f_110_000_100_000_0(uniques, 1);
+  f_110_000_100_000_1(uniques, 1);
+  f_110_000_100_001_0(uniques, 1);
+  f_110_000_100_001_1(uniques, 1);
+  f_110_000_100_010_0(uniques, 1);
+  f_110_000_100_010_1(uniques, 1);
+  f_110_000_100_011_0(uniques, 1);
+  f_110_000_100_011_1(uniques, 1);
+  f_110_000_100_100_0(uniques, 1);
+  f_110_000_100_100_1(uniques, 1);
+  f_110_000_100_101_0(uniques, 1);
+  f_110_000_100_101_1(uniques, 1);
+  f_110_000_100_110_0(uniques, 1);
+  f_110_000_100_110_1(uniques, 1);
+  f_110_000_100_111_0(uniques, 1);
+  f_110_000_100_111_1(uniques, 1);
+  f_110_000_101_000_0(uniques, 1);
+  f_110_000_101_000_1(uniques, 1);
+  f_110_000_101_001_0(uniques, 1);
+  f_110_000_101_001_1(uniques, 1);
+  f_110_000_101_010_0(uniques, 1);
+  f_110_000_101_010_1(uniques, 1);
+  f_110_000_101_011_0(uniques, 1);
+  f_110_000_101_011_1(uniques, 1);
+  f_110_000_101_100_0(uniques, 1);
+  f_110_000_101_100_1(uniques, 1);
+  f_110_000_101_101_0(uniques, 1);
+  f_110_000_101_101_1(uniques, 1);
+  f_110_000_101_110_0(uniques, 1);
+  f_110_000_101_110_1(uniques, 1);
+  f_110_000_101_111_0(uniques, 1);
+  f_110_000_101_111_1(uniques, 1);
+  f_110_000_110_000_0(uniques, 1);
+  f_110_000_110_000_1(uniques, 1);
+  f_110_000_110_001_0(uniques, 1);
+  f_110_000_110_001_1(uniques, 1);
+  f_110_000_110_010_0(uniques, 1);
+  f_110_000_110_010_1(uniques, 1);
+  f_110_000_110_011_0(uniques, 1);
+  f_110_000_110_011_1(uniques, 1);
+  f_110_000_110_100_0(uniques, 1);
+  f_110_000_110_100_1(uniques, 1);
+  f_110_000_110_101_0(uniques, 1);
+  f_110_000_110_101_1(uniques, 1);
+  f_110_000_110_110_0(uniques, 1);
+  f_110_000_110_110_1(uniques, 1);
+  f_110_000_110_111_0(uniques, 1);
+  f_110_000_110_111_1(uniques, 1);
+  f_110_000_111_000_0(uniques, 1);
+  f_110_000_111_000_1(uniques, 1);
+  f_110_000_111_001_0(uniques, 1);
+  f_110_000_111_001_1(uniques, 1);
+  f_110_000_111_010_0(uniques, 1);
+  f_110_000_111_010_1(uniques, 1);
+  f_110_000_111_011_0(uniques, 1);
+  f_110_000_111_011_1(uniques, 1);
+  f_110_000_111_100_0(uniques, 1);
+  f_110_000_111_100_1(uniques, 1);
+  f_110_000_111_101_0(uniques, 1);
+  f_110_000_111_101_1(uniques, 1);
+  f_110_000_111_110_0(uniques, 1);
+  f_110_000_111_110_1(uniques, 1);
+  f_110_000_111_111_0(uniques, 1);
+  f_110_000_111_111_1(uniques, 1);
+  f_110_001_000_000_0(uniques, 1);
+  f_110_001_000_000_1(uniques, 1);
+  f_110_001_000_001_0(uniques, 1);
+  f_110_001_000_001_1(uniques, 1);
+  f_110_001_000_010_0(uniques, 1);
+  f_110_001_000_010_1(uniques, 1);
+  f_110_001_000_011_0(uniques, 1);
+  f_110_001_000_011_1(uniques, 1);
+  f_110_001_000_100_0(uniques, 1);
+  f_110_001_000_100_1(uniques, 1);
+  f_110_001_000_101_0(uniques, 1);
+  f_110_001_000_101_1(uniques, 1);
+  f_110_001_000_110_0(uniques, 1);
+  f_110_001_000_110_1(uniques, 1);
+  f_110_001_000_111_0(uniques, 1);
+  f_110_001_000_111_1(uniques, 1);
+  f_110_001_001_000_0(uniques, 1);
+  f_110_001_001_000_1(uniques, 1);
+  f_110_001_001_001_0(uniques, 1);
+  f_110_001_001_001_1(uniques, 1);
+  f_110_001_001_010_0(uniques, 1);
+  f_110_001_001_010_1(uniques, 1);
+  f_110_001_001_011_0(uniques, 1);
+  f_110_001_001_011_1(uniques, 1);
+  f_110_001_001_100_0(uniques, 1);
+  f_110_001_001_100_1(uniques, 1);
+  f_110_001_001_101_0(uniques, 1);
+  f_110_001_001_101_1(uniques, 1);
+  f_110_001_001_110_0(uniques, 1);
+  f_110_001_001_110_1(uniques, 1);
+  f_110_001_001_111_0(uniques, 1);
+  f_110_001_001_111_1(uniques, 1);
+  f_110_001_010_000_0(uniques, 1);
+  f_110_001_010_000_1(uniques, 1);
+  f_110_001_010_001_0(uniques, 1);
+  f_110_001_010_001_1(uniques, 1);
+  f_110_001_010_010_0(uniques, 1);
+  f_110_001_010_010_1(uniques, 1);
+  f_110_001_010_011_0(uniques, 1);
+  f_110_001_010_011_1(uniques, 1);
+  f_110_001_010_100_0(uniques, 1);
+  f_110_001_010_100_1(uniques, 1);
+  f_110_001_010_101_0(uniques, 1);
+  f_110_001_010_101_1(uniques, 1);
+  f_110_001_010_110_0(uniques, 1);
+  f_110_001_010_110_1(uniques, 1);
+  f_110_001_010_111_0(uniques, 1);
+  f_110_001_010_111_1(uniques, 1);
+  f_110_001_011_000_0(uniques, 1);
+  f_110_001_011_000_1(uniques, 1);
+  f_110_001_011_001_0(uniques, 1);
+  f_110_001_011_001_1(uniques, 1);
+  f_110_001_011_010_0(uniques, 1);
+  f_110_001_011_010_1(uniques, 1);
+  f_110_001_011_011_0(uniques, 1);
+  f_110_001_011_011_1(uniques, 1);
+  f_110_001_011_100_0(uniques, 1);
+  f_110_001_011_100_1(uniques, 1);
+  f_110_001_011_101_0(uniques, 1);
+  f_110_001_011_101_1(uniques, 1);
+  f_110_001_011_110_0(uniques, 1);
+  f_110_001_011_110_1(uniques, 1);
+  f_110_001_011_111_0(uniques, 1);
+  f_110_001_011_111_1(uniques, 1);
+  f_110_001_100_000_0(uniques, 1);
+  f_110_001_100_000_1(uniques, 1);
+  f_110_001_100_001_0(uniques, 1);
+  f_110_001_100_001_1(uniques, 1);
+  f_110_001_100_010_0(uniques, 1);
+  f_110_001_100_010_1(uniques, 1);
+  f_110_001_100_011_0(uniques, 1);
+  f_110_001_100_011_1(uniques, 1);
+  f_110_001_100_100_0(uniques, 1);
+  f_110_001_100_100_1(uniques, 1);
+  f_110_001_100_101_0(uniques, 1);
+  f_110_001_100_101_1(uniques, 1);
+  f_110_001_100_110_0(uniques, 1);
+  f_110_001_100_110_1(uniques, 1);
+  f_110_001_100_111_0(uniques, 1);
+  f_110_001_100_111_1(uniques, 1);
+  f_110_001_101_000_0(uniques, 1);
+  f_110_001_101_000_1(uniques, 1);
+  f_110_001_101_001_0(uniques, 1);
+  f_110_001_101_001_1(uniques, 1);
+  f_110_001_101_010_0(uniques, 1);
+  f_110_001_101_010_1(uniques, 1);
+  f_110_001_101_011_0(uniques, 1);
+  f_110_001_101_011_1(uniques, 1);
+  f_110_001_101_100_0(uniques, 1);
+  f_110_001_101_100_1(uniques, 1);
+  f_110_001_101_101_0(uniques, 1);
+  f_110_001_101_101_1(uniques, 1);
+  f_110_001_101_110_0(uniques, 1);
+  f_110_001_101_110_1(uniques, 1);
+  f_110_001_101_111_0(uniques, 1);
+  f_110_001_101_111_1(uniques, 1);
+  f_110_001_110_000_0(uniques, 1);
+  f_110_001_110_000_1(uniques, 1);
+  f_110_001_110_001_0(uniques, 1);
+  f_110_001_110_001_1(uniques, 1);
+  f_110_001_110_010_0(uniques, 1);
+  f_110_001_110_010_1(uniques, 1);
+  f_110_001_110_011_0(uniques, 1);
+  f_110_001_110_011_1(uniques, 1);
+  f_110_001_110_100_0(uniques, 1);
+  f_110_001_110_100_1(uniques, 1);
+  f_110_001_110_101_0(uniques, 1);
+  f_110_001_110_101_1(uniques, 1);
+  f_110_001_110_110_0(uniques, 1);
+  f_110_001_110_110_1(uniques, 1);
+  f_110_001_110_111_0(uniques, 1);
+  f_110_001_110_111_1(uniques, 1);
+  f_110_001_111_000_0(uniques, 1);
+  f_110_001_111_000_1(uniques, 1);
+  f_110_001_111_001_0(uniques, 1);
+  f_110_001_111_001_1(uniques, 1);
+  f_110_001_111_010_0(uniques, 1);
+  f_110_001_111_010_1(uniques, 1);
+  f_110_001_111_011_0(uniques, 1);
+  f_110_001_111_011_1(uniques, 1);
+  f_110_001_111_100_0(uniques, 1);
+  f_110_001_111_100_1(uniques, 1);
+  f_110_001_111_101_0(uniques, 1);
+  f_110_001_111_101_1(uniques, 1);
+  f_110_001_111_110_0(uniques, 1);
+  f_110_001_111_110_1(uniques, 1);
+  f_110_001_111_111_0(uniques, 1);
+  f_110_001_111_111_1(uniques, 1);
+  f_110_010_000_000_0(uniques, 1);
+  f_110_010_000_000_1(uniques, 1);
+  f_110_010_000_001_0(uniques, 1);
+  f_110_010_000_001_1(uniques, 1);
+  f_110_010_000_010_0(uniques, 1);
+  f_110_010_000_010_1(uniques, 1);
+  f_110_010_000_011_0(uniques, 1);
+  f_110_010_000_011_1(uniques, 1);
+  f_110_010_000_100_0(uniques, 1);
+  f_110_010_000_100_1(uniques, 1);
+  f_110_010_000_101_0(uniques, 1);
+  f_110_010_000_101_1(uniques, 1);
+  f_110_010_000_110_0(uniques, 1);
+  f_110_010_000_110_1(uniques, 1);
+  f_110_010_000_111_0(uniques, 1);
+  f_110_010_000_111_1(uniques, 1);
+  f_110_010_001_000_0(uniques, 1);
+  f_110_010_001_000_1(uniques, 1);
+  f_110_010_001_001_0(uniques, 1);
+  f_110_010_001_001_1(uniques, 1);
+  f_110_010_001_010_0(uniques, 1);
+  f_110_010_001_010_1(uniques, 1);
+  f_110_010_001_011_0(uniques, 1);
+  f_110_010_001_011_1(uniques, 1);
+  f_110_010_001_100_0(uniques, 1);
+  f_110_010_001_100_1(uniques, 1);
+  f_110_010_001_101_0(uniques, 1);
+  f_110_010_001_101_1(uniques, 1);
+  f_110_010_001_110_0(uniques, 1);
+  f_110_010_001_110_1(uniques, 1);
+  f_110_010_001_111_0(uniques, 1);
+  f_110_010_001_111_1(uniques, 1);
+  f_110_010_010_000_0(uniques, 1);
+  f_110_010_010_000_1(uniques, 1);
+  f_110_010_010_001_0(uniques, 1);
+  f_110_010_010_001_1(uniques, 1);
+  f_110_010_010_010_0(uniques, 1);
+  f_110_010_010_010_1(uniques, 1);
+  f_110_010_010_011_0(uniques, 1);
+  f_110_010_010_011_1(uniques, 1);
+  f_110_010_010_100_0(uniques, 1);
+  f_110_010_010_100_1(uniques, 1);
+  f_110_010_010_101_0(uniques, 1);
+  f_110_010_010_101_1(uniques, 1);
+  f_110_010_010_110_0(uniques, 1);
+  f_110_010_010_110_1(uniques, 1);
+  f_110_010_010_111_0(uniques, 1);
+  f_110_010_010_111_1(uniques, 1);
+  f_110_010_011_000_0(uniques, 1);
+  f_110_010_011_000_1(uniques, 1);
+  f_110_010_011_001_0(uniques, 1);
+  f_110_010_011_001_1(uniques, 1);
+  f_110_010_011_010_0(uniques, 1);
+  f_110_010_011_010_1(uniques, 1);
+  f_110_010_011_011_0(uniques, 1);
+  f_110_010_011_011_1(uniques, 1);
+  f_110_010_011_100_0(uniques, 1);
+  f_110_010_011_100_1(uniques, 1);
+  f_110_010_011_101_0(uniques, 1);
+  f_110_010_011_101_1(uniques, 1);
+  f_110_010_011_110_0(uniques, 1);
+  f_110_010_011_110_1(uniques, 1);
+  f_110_010_011_111_0(uniques, 1);
+  f_110_010_011_111_1(uniques, 1);
+  f_110_010_100_000_0(uniques, 1);
+  f_110_010_100_000_1(uniques, 1);
+  f_110_010_100_001_0(uniques, 1);
+  f_110_010_100_001_1(uniques, 1);
+  f_110_010_100_010_0(uniques, 1);
+  f_110_010_100_010_1(uniques, 1);
+  f_110_010_100_011_0(uniques, 1);
+  f_110_010_100_011_1(uniques, 1);
+  f_110_010_100_100_0(uniques, 1);
+  f_110_010_100_100_1(uniques, 1);
+  f_110_010_100_101_0(uniques, 1);
+  f_110_010_100_101_1(uniques, 1);
+  f_110_010_100_110_0(uniques, 1);
+  f_110_010_100_110_1(uniques, 1);
+  f_110_010_100_111_0(uniques, 1);
+  f_110_010_100_111_1(uniques, 1);
+  f_110_010_101_000_0(uniques, 1);
+  f_110_010_101_000_1(uniques, 1);
+  f_110_010_101_001_0(uniques, 1);
+  f_110_010_101_001_1(uniques, 1);
+  f_110_010_101_010_0(uniques, 1);
+  f_110_010_101_010_1(uniques, 1);
+  f_110_010_101_011_0(uniques, 1);
+  f_110_010_101_011_1(uniques, 1);
+  f_110_010_101_100_0(uniques, 1);
+  f_110_010_101_100_1(uniques, 1);
+  f_110_010_101_101_0(uniques, 1);
+  f_110_010_101_101_1(uniques, 1);
+  f_110_010_101_110_0(uniques, 1);
+  f_110_010_101_110_1(uniques, 1);
+  f_110_010_101_111_0(uniques, 1);
+  f_110_010_101_111_1(uniques, 1);
+  f_110_010_110_000_0(uniques, 1);
+  f_110_010_110_000_1(uniques, 1);
+  f_110_010_110_001_0(uniques, 1);
+  f_110_010_110_001_1(uniques, 1);
+  f_110_010_110_010_0(uniques, 1);
+  f_110_010_110_010_1(uniques, 1);
+  f_110_010_110_011_0(uniques, 1);
+  f_110_010_110_011_1(uniques, 1);
+  f_110_010_110_100_0(uniques, 1);
+  f_110_010_110_100_1(uniques, 1);
+  f_110_010_110_101_0(uniques, 1);
+  f_110_010_110_101_1(uniques, 1);
+  f_110_010_110_110_0(uniques, 1);
+  f_110_010_110_110_1(uniques, 1);
+  f_110_010_110_111_0(uniques, 1);
+  f_110_010_110_111_1(uniques, 1);
+  f_110_010_111_000_0(uniques, 1);
+  f_110_010_111_000_1(uniques, 1);
+  f_110_010_111_001_0(uniques, 1);
+  f_110_010_111_001_1(uniques, 1);
+  f_110_010_111_010_0(uniques, 1);
+  f_110_010_111_010_1(uniques, 1);
+  f_110_010_111_011_0(uniques, 1);
+  f_110_010_111_011_1(uniques, 1);
+  f_110_010_111_100_0(uniques, 1);
+  f_110_010_111_100_1(uniques, 1);
+  f_110_010_111_101_0(uniques, 1);
+  f_110_010_111_101_1(uniques, 1);
+  f_110_010_111_110_0(uniques, 1);
+  f_110_010_111_110_1(uniques, 1);
+  f_110_010_111_111_0(uniques, 1);
+  f_110_010_111_111_1(uniques, 1);
+  f_110_011_000_000_0(uniques, 1);
+  f_110_011_000_000_1(uniques, 1);
+  f_110_011_000_001_0(uniques, 1);
+  f_110_011_000_001_1(uniques, 1);
+  f_110_011_000_010_0(uniques, 1);
+  f_110_011_000_010_1(uniques, 1);
+  f_110_011_000_011_0(uniques, 1);
+  f_110_011_000_011_1(uniques, 1);
+  f_110_011_000_100_0(uniques, 1);
+  f_110_011_000_100_1(uniques, 1);
+  f_110_011_000_101_0(uniques, 1);
+  f_110_011_000_101_1(uniques, 1);
+  f_110_011_000_110_0(uniques, 1);
+  f_110_011_000_110_1(uniques, 1);
+  f_110_011_000_111_0(uniques, 1);
+  f_110_011_000_111_1(uniques, 1);
+  f_110_011_001_000_0(uniques, 1);
+  f_110_011_001_000_1(uniques, 1);
+  f_110_011_001_001_0(uniques, 1);
+  f_110_011_001_001_1(uniques, 1);
+  f_110_011_001_010_0(uniques, 1);
+  f_110_011_001_010_1(uniques, 1);
+  f_110_011_001_011_0(uniques, 1);
+  f_110_011_001_011_1(uniques, 1);
+  f_110_011_001_100_0(uniques, 1);
+  f_110_011_001_100_1(uniques, 1);
+  f_110_011_001_101_0(uniques, 1);
+  f_110_011_001_101_1(uniques, 1);
+  f_110_011_001_110_0(uniques, 1);
+  f_110_011_001_110_1(uniques, 1);
+  f_110_011_001_111_0(uniques, 1);
+  f_110_011_001_111_1(uniques, 1);
+  f_110_011_010_000_0(uniques, 1);
+  f_110_011_010_000_1(uniques, 1);
+  f_110_011_010_001_0(uniques, 1);
+  f_110_011_010_001_1(uniques, 1);
+  f_110_011_010_010_0(uniques, 1);
+  f_110_011_010_010_1(uniques, 1);
+  f_110_011_010_011_0(uniques, 1);
+  f_110_011_010_011_1(uniques, 1);
+  f_110_011_010_100_0(uniques, 1);
+  f_110_011_010_100_1(uniques, 1);
+  f_110_011_010_101_0(uniques, 1);
+  f_110_011_010_101_1(uniques, 1);
+  f_110_011_010_110_0(uniques, 1);
+  f_110_011_010_110_1(uniques, 1);
+  f_110_011_010_111_0(uniques, 1);
+  f_110_011_010_111_1(uniques, 1);
+  f_110_011_011_000_0(uniques, 1);
+  f_110_011_011_000_1(uniques, 1);
+  f_110_011_011_001_0(uniques, 1);
+  f_110_011_011_001_1(uniques, 1);
+  f_110_011_011_010_0(uniques, 1);
+  f_110_011_011_010_1(uniques, 1);
+  f_110_011_011_011_0(uniques, 1);
+  f_110_011_011_011_1(uniques, 1);
+  f_110_011_011_100_0(uniques, 1);
+  f_110_011_011_100_1(uniques, 1);
+  f_110_011_011_101_0(uniques, 1);
+  f_110_011_011_101_1(uniques, 1);
+  f_110_011_011_110_0(uniques, 1);
+  f_110_011_011_110_1(uniques, 1);
+  f_110_011_011_111_0(uniques, 1);
+  f_110_011_011_111_1(uniques, 1);
+  f_110_011_100_000_0(uniques, 1);
+  f_110_011_100_000_1(uniques, 1);
+  f_110_011_100_001_0(uniques, 1);
+  f_110_011_100_001_1(uniques, 1);
+  f_110_011_100_010_0(uniques, 1);
+  f_110_011_100_010_1(uniques, 1);
+  f_110_011_100_011_0(uniques, 1);
+  f_110_011_100_011_1(uniques, 1);
+  f_110_011_100_100_0(uniques, 1);
+  f_110_011_100_100_1(uniques, 1);
+  f_110_011_100_101_0(uniques, 1);
+  f_110_011_100_101_1(uniques, 1);
+  f_110_011_100_110_0(uniques, 1);
+  f_110_011_100_110_1(uniques, 1);
+  f_110_011_100_111_0(uniques, 1);
+  f_110_011_100_111_1(uniques, 1);
+  f_110_011_101_000_0(uniques, 1);
+  f_110_011_101_000_1(uniques, 1);
+  f_110_011_101_001_0(uniques, 1);
+  f_110_011_101_001_1(uniques, 1);
+  f_110_011_101_010_0(uniques, 1);
+  f_110_011_101_010_1(uniques, 1);
+  f_110_011_101_011_0(uniques, 1);
+  f_110_011_101_011_1(uniques, 1);
+  f_110_011_101_100_0(uniques, 1);
+  f_110_011_101_100_1(uniques, 1);
+  f_110_011_101_101_0(uniques, 1);
+  f_110_011_101_101_1(uniques, 1);
+  f_110_011_101_110_0(uniques, 1);
+  f_110_011_101_110_1(uniques, 1);
+  f_110_011_101_111_0(uniques, 1);
+  f_110_011_101_111_1(uniques, 1);
+  f_110_011_110_000_0(uniques, 1);
+  f_110_011_110_000_1(uniques, 1);
+  f_110_011_110_001_0(uniques, 1);
+  f_110_011_110_001_1(uniques, 1);
+  f_110_011_110_010_0(uniques, 1);
+  f_110_011_110_010_1(uniques, 1);
+  f_110_011_110_011_0(uniques, 1);
+  f_110_011_110_011_1(uniques, 1);
+  f_110_011_110_100_0(uniques, 1);
+  f_110_011_110_100_1(uniques, 1);
+  f_110_011_110_101_0(uniques, 1);
+  f_110_011_110_101_1(uniques, 1);
+  f_110_011_110_110_0(uniques, 1);
+  f_110_011_110_110_1(uniques, 1);
+  f_110_011_110_111_0(uniques, 1);
+  f_110_011_110_111_1(uniques, 1);
+  f_110_011_111_000_0(uniques, 1);
+  f_110_011_111_000_1(uniques, 1);
+  f_110_011_111_001_0(uniques, 1);
+  f_110_011_111_001_1(uniques, 1);
+  f_110_011_111_010_0(uniques, 1);
+  f_110_011_111_010_1(uniques, 1);
+  f_110_011_111_011_0(uniques, 1);
+  f_110_011_111_011_1(uniques, 1);
+  f_110_011_111_100_0(uniques, 1);
+  f_110_011_111_100_1(uniques, 1);
+  f_110_011_111_101_0(uniques, 1);
+  f_110_011_111_101_1(uniques, 1);
+  f_110_011_111_110_0(uniques, 1);
+  f_110_011_111_110_1(uniques, 1);
+  f_110_011_111_111_0(uniques, 1);
+  f_110_011_111_111_1(uniques, 1);
+  f_110_100_000_000_0(uniques, 1);
+  f_110_100_000_000_1(uniques, 1);
+  f_110_100_000_001_0(uniques, 1);
+  f_110_100_000_001_1(uniques, 1);
+  f_110_100_000_010_0(uniques, 1);
+  f_110_100_000_010_1(uniques, 1);
+  f_110_100_000_011_0(uniques, 1);
+  f_110_100_000_011_1(uniques, 1);
+  f_110_100_000_100_0(uniques, 1);
+  f_110_100_000_100_1(uniques, 1);
+  f_110_100_000_101_0(uniques, 1);
+  f_110_100_000_101_1(uniques, 1);
+  f_110_100_000_110_0(uniques, 1);
+  f_110_100_000_110_1(uniques, 1);
+  f_110_100_000_111_0(uniques, 1);
+  f_110_100_000_111_1(uniques, 1);
+  f_110_100_001_000_0(uniques, 1);
+  f_110_100_001_000_1(uniques, 1);
+  f_110_100_001_001_0(uniques, 1);
+  f_110_100_001_001_1(uniques, 1);
+  f_110_100_001_010_0(uniques, 1);
+  f_110_100_001_010_1(uniques, 1);
+  f_110_100_001_011_0(uniques, 1);
+  f_110_100_001_011_1(uniques, 1);
+  f_110_100_001_100_0(uniques, 1);
+  f_110_100_001_100_1(uniques, 1);
+  f_110_100_001_101_0(uniques, 1);
+  f_110_100_001_101_1(uniques, 1);
+  f_110_100_001_110_0(uniques, 1);
+  f_110_100_001_110_1(uniques, 1);
+  f_110_100_001_111_0(uniques, 1);
+  f_110_100_001_111_1(uniques, 1);
+  f_110_100_010_000_0(uniques, 1);
+  f_110_100_010_000_1(uniques, 1);
+  f_110_100_010_001_0(uniques, 1);
+  f_110_100_010_001_1(uniques, 1);
+  f_110_100_010_010_0(uniques, 1);
+  f_110_100_010_010_1(uniques, 1);
+  f_110_100_010_011_0(uniques, 1);
+  f_110_100_010_011_1(uniques, 1);
+  f_110_100_010_100_0(uniques, 1);
+  f_110_100_010_100_1(uniques, 1);
+  f_110_100_010_101_0(uniques, 1);
+  f_110_100_010_101_1(uniques, 1);
+  f_110_100_010_110_0(uniques, 1);
+  f_110_100_010_110_1(uniques, 1);
+  f_110_100_010_111_0(uniques, 1);
+  f_110_100_010_111_1(uniques, 1);
+  f_110_100_011_000_0(uniques, 1);
+  f_110_100_011_000_1(uniques, 1);
+  f_110_100_011_001_0(uniques, 1);
+  f_110_100_011_001_1(uniques, 1);
+  f_110_100_011_010_0(uniques, 1);
+  f_110_100_011_010_1(uniques, 1);
+  f_110_100_011_011_0(uniques, 1);
+  f_110_100_011_011_1(uniques, 1);
+  f_110_100_011_100_0(uniques, 1);
+  f_110_100_011_100_1(uniques, 1);
+  f_110_100_011_101_0(uniques, 1);
+  f_110_100_011_101_1(uniques, 1);
+  f_110_100_011_110_0(uniques, 1);
+  f_110_100_011_110_1(uniques, 1);
+  f_110_100_011_111_0(uniques, 1);
+  f_110_100_011_111_1(uniques, 1);
+  f_110_100_100_000_0(uniques, 1);
+  f_110_100_100_000_1(uniques, 1);
+  f_110_100_100_001_0(uniques, 1);
+  f_110_100_100_001_1(uniques, 1);
+  f_110_100_100_010_0(uniques, 1);
+  f_110_100_100_010_1(uniques, 1);
+  f_110_100_100_011_0(uniques, 1);
+  f_110_100_100_011_1(uniques, 1);
+  f_110_100_100_100_0(uniques, 1);
+  f_110_100_100_100_1(uniques, 1);
+  f_110_100_100_101_0(uniques, 1);
+  f_110_100_100_101_1(uniques, 1);
+  f_110_100_100_110_0(uniques, 1);
+  f_110_100_100_110_1(uniques, 1);
+  f_110_100_100_111_0(uniques, 1);
+  f_110_100_100_111_1(uniques, 1);
+  f_110_100_101_000_0(uniques, 1);
+  f_110_100_101_000_1(uniques, 1);
+  f_110_100_101_001_0(uniques, 1);
+  f_110_100_101_001_1(uniques, 1);
+  f_110_100_101_010_0(uniques, 1);
+  f_110_100_101_010_1(uniques, 1);
+  f_110_100_101_011_0(uniques, 1);
+  f_110_100_101_011_1(uniques, 1);
+  f_110_100_101_100_0(uniques, 1);
+  f_110_100_101_100_1(uniques, 1);
+  f_110_100_101_101_0(uniques, 1);
+  f_110_100_101_101_1(uniques, 1);
+  f_110_100_101_110_0(uniques, 1);
+  f_110_100_101_110_1(uniques, 1);
+  f_110_100_101_111_0(uniques, 1);
+  f_110_100_101_111_1(uniques, 1);
+  f_110_100_110_000_0(uniques, 1);
+  f_110_100_110_000_1(uniques, 1);
+  f_110_100_110_001_0(uniques, 1);
+  f_110_100_110_001_1(uniques, 1);
+  f_110_100_110_010_0(uniques, 1);
+  f_110_100_110_010_1(uniques, 1);
+  f_110_100_110_011_0(uniques, 1);
+  f_110_100_110_011_1(uniques, 1);
+  f_110_100_110_100_0(uniques, 1);
+  f_110_100_110_100_1(uniques, 1);
+  f_110_100_110_101_0(uniques, 1);
+  f_110_100_110_101_1(uniques, 1);
+  f_110_100_110_110_0(uniques, 1);
+  f_110_100_110_110_1(uniques, 1);
+  f_110_100_110_111_0(uniques, 1);
+  f_110_100_110_111_1(uniques, 1);
+  f_110_100_111_000_0(uniques, 1);
+  f_110_100_111_000_1(uniques, 1);
+  f_110_100_111_001_0(uniques, 1);
+  f_110_100_111_001_1(uniques, 1);
+  f_110_100_111_010_0(uniques, 1);
+  f_110_100_111_010_1(uniques, 1);
+  f_110_100_111_011_0(uniques, 1);
+  f_110_100_111_011_1(uniques, 1);
+  f_110_100_111_100_0(uniques, 1);
+  f_110_100_111_100_1(uniques, 1);
+  f_110_100_111_101_0(uniques, 1);
+  f_110_100_111_101_1(uniques, 1);
+  f_110_100_111_110_0(uniques, 1);
+  f_110_100_111_110_1(uniques, 1);
+  f_110_100_111_111_0(uniques, 1);
+  f_110_100_111_111_1(uniques, 1);
+  f_110_101_000_000_0(uniques, 1);
+  f_110_101_000_000_1(uniques, 1);
+  f_110_101_000_001_0(uniques, 1);
+  f_110_101_000_001_1(uniques, 1);
+  f_110_101_000_010_0(uniques, 1);
+  f_110_101_000_010_1(uniques, 1);
+  f_110_101_000_011_0(uniques, 1);
+  f_110_101_000_011_1(uniques, 1);
+  f_110_101_000_100_0(uniques, 1);
+  f_110_101_000_100_1(uniques, 1);
+  f_110_101_000_101_0(uniques, 1);
+  f_110_101_000_101_1(uniques, 1);
+  f_110_101_000_110_0(uniques, 1);
+  f_110_101_000_110_1(uniques, 1);
+  f_110_101_000_111_0(uniques, 1);
+  f_110_101_000_111_1(uniques, 1);
+  f_110_101_001_000_0(uniques, 1);
+  f_110_101_001_000_1(uniques, 1);
+  f_110_101_001_001_0(uniques, 1);
+  f_110_101_001_001_1(uniques, 1);
+  f_110_101_001_010_0(uniques, 1);
+  f_110_101_001_010_1(uniques, 1);
+  f_110_101_001_011_0(uniques, 1);
+  f_110_101_001_011_1(uniques, 1);
+  f_110_101_001_100_0(uniques, 1);
+  f_110_101_001_100_1(uniques, 1);
+  f_110_101_001_101_0(uniques, 1);
+  f_110_101_001_101_1(uniques, 1);
+  f_110_101_001_110_0(uniques, 1);
+  f_110_101_001_110_1(uniques, 1);
+  f_110_101_001_111_0(uniques, 1);
+  f_110_101_001_111_1(uniques, 1);
+  f_110_101_010_000_0(uniques, 1);
+  f_110_101_010_000_1(uniques, 1);
+  f_110_101_010_001_0(uniques, 1);
+  f_110_101_010_001_1(uniques, 1);
+  f_110_101_010_010_0(uniques, 1);
+  f_110_101_010_010_1(uniques, 1);
+  f_110_101_010_011_0(uniques, 1);
+  f_110_101_010_011_1(uniques, 1);
+  f_110_101_010_100_0(uniques, 1);
+  f_110_101_010_100_1(uniques, 1);
+  f_110_101_010_101_0(uniques, 1);
+  f_110_101_010_101_1(uniques, 1);
+  f_110_101_010_110_0(uniques, 1);
+  f_110_101_010_110_1(uniques, 1);
+  f_110_101_010_111_0(uniques, 1);
+  f_110_101_010_111_1(uniques, 1);
+  f_110_101_011_000_0(uniques, 1);
+  f_110_101_011_000_1(uniques, 1);
+  f_110_101_011_001_0(uniques, 1);
+  f_110_101_011_001_1(uniques, 1);
+  f_110_101_011_010_0(uniques, 1);
+  f_110_101_011_010_1(uniques, 1);
+  f_110_101_011_011_0(uniques, 1);
+  f_110_101_011_011_1(uniques, 1);
+  f_110_101_011_100_0(uniques, 1);
+  f_110_101_011_100_1(uniques, 1);
+  f_110_101_011_101_0(uniques, 1);
+  f_110_101_011_101_1(uniques, 1);
+  f_110_101_011_110_0(uniques, 1);
+  f_110_101_011_110_1(uniques, 1);
+  f_110_101_011_111_0(uniques, 1);
+  f_110_101_011_111_1(uniques, 1);
+  f_110_101_100_000_0(uniques, 1);
+  f_110_101_100_000_1(uniques, 1);
+  f_110_101_100_001_0(uniques, 1);
+  f_110_101_100_001_1(uniques, 1);
+  f_110_101_100_010_0(uniques, 1);
+  f_110_101_100_010_1(uniques, 1);
+  f_110_101_100_011_0(uniques, 1);
+  f_110_101_100_011_1(uniques, 1);
+  f_110_101_100_100_0(uniques, 1);
+  f_110_101_100_100_1(uniques, 1);
+  f_110_101_100_101_0(uniques, 1);
+  f_110_101_100_101_1(uniques, 1);
+  f_110_101_100_110_0(uniques, 1);
+  f_110_101_100_110_1(uniques, 1);
+  f_110_101_100_111_0(uniques, 1);
+  f_110_101_100_111_1(uniques, 1);
+  f_110_101_101_000_0(uniques, 1);
+  f_110_101_101_000_1(uniques, 1);
+  f_110_101_101_001_0(uniques, 1);
+  f_110_101_101_001_1(uniques, 1);
+  f_110_101_101_010_0(uniques, 1);
+  f_110_101_101_010_1(uniques, 1);
+  f_110_101_101_011_0(uniques, 1);
+  f_110_101_101_011_1(uniques, 1);
+  f_110_101_101_100_0(uniques, 1);
+  f_110_101_101_100_1(uniques, 1);
+  f_110_101_101_101_0(uniques, 1);
+  f_110_101_101_101_1(uniques, 1);
+  f_110_101_101_110_0(uniques, 1);
+  f_110_101_101_110_1(uniques, 1);
+  f_110_101_101_111_0(uniques, 1);
+  f_110_101_101_111_1(uniques, 1);
+  f_110_101_110_000_0(uniques, 1);
+  f_110_101_110_000_1(uniques, 1);
+  f_110_101_110_001_0(uniques, 1);
+  f_110_101_110_001_1(uniques, 1);
+  f_110_101_110_010_0(uniques, 1);
+  f_110_101_110_010_1(uniques, 1);
+  f_110_101_110_011_0(uniques, 1);
+  f_110_101_110_011_1(uniques, 1);
+  f_110_101_110_100_0(uniques, 1);
+  f_110_101_110_100_1(uniques, 1);
+  f_110_101_110_101_0(uniques, 1);
+  f_110_101_110_101_1(uniques, 1);
+  f_110_101_110_110_0(uniques, 1);
+  f_110_101_110_110_1(uniques, 1);
+  f_110_101_110_111_0(uniques, 1);
+  f_110_101_110_111_1(uniques, 1);
+  f_110_101_111_000_0(uniques, 1);
+  f_110_101_111_000_1(uniques, 1);
+  f_110_101_111_001_0(uniques, 1);
+  f_110_101_111_001_1(uniques, 1);
+  f_110_101_111_010_0(uniques, 1);
+  f_110_101_111_010_1(uniques, 1);
+  f_110_101_111_011_0(uniques, 1);
+  f_110_101_111_011_1(uniques, 1);
+  f_110_101_111_100_0(uniques, 1);
+  f_110_101_111_100_1(uniques, 1);
+  f_110_101_111_101_0(uniques, 1);
+  f_110_101_111_101_1(uniques, 1);
+  f_110_101_111_110_0(uniques, 1);
+  f_110_101_111_110_1(uniques, 1);
+  f_110_101_111_111_0(uniques, 1);
+  f_110_101_111_111_1(uniques, 1);
+  f_110_110_000_000_0(uniques, 1);
+  f_110_110_000_000_1(uniques, 1);
+  f_110_110_000_001_0(uniques, 1);
+  f_110_110_000_001_1(uniques, 1);
+  f_110_110_000_010_0(uniques, 1);
+  f_110_110_000_010_1(uniques, 1);
+  f_110_110_000_011_0(uniques, 1);
+  f_110_110_000_011_1(uniques, 1);
+  f_110_110_000_100_0(uniques, 1);
+  f_110_110_000_100_1(uniques, 1);
+  f_110_110_000_101_0(uniques, 1);
+  f_110_110_000_101_1(uniques, 1);
+  f_110_110_000_110_0(uniques, 1);
+  f_110_110_000_110_1(uniques, 1);
+  f_110_110_000_111_0(uniques, 1);
+  f_110_110_000_111_1(uniques, 1);
+  f_110_110_001_000_0(uniques, 1);
+  f_110_110_001_000_1(uniques, 1);
+  f_110_110_001_001_0(uniques, 1);
+  f_110_110_001_001_1(uniques, 1);
+  f_110_110_001_010_0(uniques, 1);
+  f_110_110_001_010_1(uniques, 1);
+  f_110_110_001_011_0(uniques, 1);
+  f_110_110_001_011_1(uniques, 1);
+  f_110_110_001_100_0(uniques, 1);
+  f_110_110_001_100_1(uniques, 1);
+  f_110_110_001_101_0(uniques, 1);
+  f_110_110_001_101_1(uniques, 1);
+  f_110_110_001_110_0(uniques, 1);
+  f_110_110_001_110_1(uniques, 1);
+  f_110_110_001_111_0(uniques, 1);
+  f_110_110_001_111_1(uniques, 1);
+  f_110_110_010_000_0(uniques, 1);
+  f_110_110_010_000_1(uniques, 1);
+  f_110_110_010_001_0(uniques, 1);
+  f_110_110_010_001_1(uniques, 1);
+  f_110_110_010_010_0(uniques, 1);
+  f_110_110_010_010_1(uniques, 1);
+  f_110_110_010_011_0(uniques, 1);
+  f_110_110_010_011_1(uniques, 1);
+  f_110_110_010_100_0(uniques, 1);
+  f_110_110_010_100_1(uniques, 1);
+  f_110_110_010_101_0(uniques, 1);
+  f_110_110_010_101_1(uniques, 1);
+  f_110_110_010_110_0(uniques, 1);
+  f_110_110_010_110_1(uniques, 1);
+  f_110_110_010_111_0(uniques, 1);
+  f_110_110_010_111_1(uniques, 1);
+  f_110_110_011_000_0(uniques, 1);
+  f_110_110_011_000_1(uniques, 1);
+  f_110_110_011_001_0(uniques, 1);
+  f_110_110_011_001_1(uniques, 1);
+  f_110_110_011_010_0(uniques, 1);
+  f_110_110_011_010_1(uniques, 1);
+  f_110_110_011_011_0(uniques, 1);
+  f_110_110_011_011_1(uniques, 1);
+  f_110_110_011_100_0(uniques, 1);
+  f_110_110_011_100_1(uniques, 1);
+  f_110_110_011_101_0(uniques, 1);
+  f_110_110_011_101_1(uniques, 1);
+  f_110_110_011_110_0(uniques, 1);
+  f_110_110_011_110_1(uniques, 1);
+  f_110_110_011_111_0(uniques, 1);
+  f_110_110_011_111_1(uniques, 1);
+  f_110_110_100_000_0(uniques, 1);
+  f_110_110_100_000_1(uniques, 1);
+  f_110_110_100_001_0(uniques, 1);
+  f_110_110_100_001_1(uniques, 1);
+  f_110_110_100_010_0(uniques, 1);
+  f_110_110_100_010_1(uniques, 1);
+  f_110_110_100_011_0(uniques, 1);
+  f_110_110_100_011_1(uniques, 1);
+  f_110_110_100_100_0(uniques, 1);
+  f_110_110_100_100_1(uniques, 1);
+  f_110_110_100_101_0(uniques, 1);
+  f_110_110_100_101_1(uniques, 1);
+  f_110_110_100_110_0(uniques, 1);
+  f_110_110_100_110_1(uniques, 1);
+  f_110_110_100_111_0(uniques, 1);
+  f_110_110_100_111_1(uniques, 1);
+  f_110_110_101_000_0(uniques, 1);
+  f_110_110_101_000_1(uniques, 1);
+  f_110_110_101_001_0(uniques, 1);
+  f_110_110_101_001_1(uniques, 1);
+  f_110_110_101_010_0(uniques, 1);
+  f_110_110_101_010_1(uniques, 1);
+  f_110_110_101_011_0(uniques, 1);
+  f_110_110_101_011_1(uniques, 1);
+  f_110_110_101_100_0(uniques, 1);
+  f_110_110_101_100_1(uniques, 1);
+  f_110_110_101_101_0(uniques, 1);
+  f_110_110_101_101_1(uniques, 1);
+  f_110_110_101_110_0(uniques, 1);
+  f_110_110_101_110_1(uniques, 1);
+  f_110_110_101_111_0(uniques, 1);
+  f_110_110_101_111_1(uniques, 1);
+  f_110_110_110_000_0(uniques, 1);
+  f_110_110_110_000_1(uniques, 1);
+  f_110_110_110_001_0(uniques, 1);
+  f_110_110_110_001_1(uniques, 1);
+  f_110_110_110_010_0(uniques, 1);
+  f_110_110_110_010_1(uniques, 1);
+  f_110_110_110_011_0(uniques, 1);
+  f_110_110_110_011_1(uniques, 1);
+  f_110_110_110_100_0(uniques, 1);
+  f_110_110_110_100_1(uniques, 1);
+  f_110_110_110_101_0(uniques, 1);
+  f_110_110_110_101_1(uniques, 1);
+  f_110_110_110_110_0(uniques, 1);
+  f_110_110_110_110_1(uniques, 1);
+  f_110_110_110_111_0(uniques, 1);
+  f_110_110_110_111_1(uniques, 1);
+  f_110_110_111_000_0(uniques, 1);
+  f_110_110_111_000_1(uniques, 1);
+  f_110_110_111_001_0(uniques, 1);
+  f_110_110_111_001_1(uniques, 1);
+  f_110_110_111_010_0(uniques, 1);
+  f_110_110_111_010_1(uniques, 1);
+  f_110_110_111_011_0(uniques, 1);
+  f_110_110_111_011_1(uniques, 1);
+  f_110_110_111_100_0(uniques, 1);
+  f_110_110_111_100_1(uniques, 1);
+  f_110_110_111_101_0(uniques, 1);
+  f_110_110_111_101_1(uniques, 1);
+  f_110_110_111_110_0(uniques, 1);
+  f_110_110_111_110_1(uniques, 1);
+  f_110_110_111_111_0(uniques, 1);
+  f_110_110_111_111_1(uniques, 1);
+  f_110_111_000_000_0(uniques, 1);
+  f_110_111_000_000_1(uniques, 1);
+  f_110_111_000_001_0(uniques, 1);
+  f_110_111_000_001_1(uniques, 1);
+  f_110_111_000_010_0(uniques, 1);
+  f_110_111_000_010_1(uniques, 1);
+  f_110_111_000_011_0(uniques, 1);
+  f_110_111_000_011_1(uniques, 1);
+  f_110_111_000_100_0(uniques, 1);
+  f_110_111_000_100_1(uniques, 1);
+  f_110_111_000_101_0(uniques, 1);
+  f_110_111_000_101_1(uniques, 1);
+  f_110_111_000_110_0(uniques, 1);
+  f_110_111_000_110_1(uniques, 1);
+  f_110_111_000_111_0(uniques, 1);
+  f_110_111_000_111_1(uniques, 1);
+  f_110_111_001_000_0(uniques, 1);
+  f_110_111_001_000_1(uniques, 1);
+  f_110_111_001_001_0(uniques, 1);
+  f_110_111_001_001_1(uniques, 1);
+  f_110_111_001_010_0(uniques, 1);
+  f_110_111_001_010_1(uniques, 1);
+  f_110_111_001_011_0(uniques, 1);
+  f_110_111_001_011_1(uniques, 1);
+  f_110_111_001_100_0(uniques, 1);
+  f_110_111_001_100_1(uniques, 1);
+  f_110_111_001_101_0(uniques, 1);
+  f_110_111_001_101_1(uniques, 1);
+  f_110_111_001_110_0(uniques, 1);
+  f_110_111_001_110_1(uniques, 1);
+  f_110_111_001_111_0(uniques, 1);
+  f_110_111_001_111_1(uniques, 1);
+  f_110_111_010_000_0(uniques, 1);
+  f_110_111_010_000_1(uniques, 1);
+  f_110_111_010_001_0(uniques, 1);
+  f_110_111_010_001_1(uniques, 1);
+  f_110_111_010_010_0(uniques, 1);
+  f_110_111_010_010_1(uniques, 1);
+  f_110_111_010_011_0(uniques, 1);
+  f_110_111_010_011_1(uniques, 1);
+  f_110_111_010_100_0(uniques, 1);
+  f_110_111_010_100_1(uniques, 1);
+  f_110_111_010_101_0(uniques, 1);
+  f_110_111_010_101_1(uniques, 1);
+  f_110_111_010_110_0(uniques, 1);
+  f_110_111_010_110_1(uniques, 1);
+  f_110_111_010_111_0(uniques, 1);
+  f_110_111_010_111_1(uniques, 1);
+  f_110_111_011_000_0(uniques, 1);
+  f_110_111_011_000_1(uniques, 1);
+  f_110_111_011_001_0(uniques, 1);
+  f_110_111_011_001_1(uniques, 1);
+  f_110_111_011_010_0(uniques, 1);
+  f_110_111_011_010_1(uniques, 1);
+  f_110_111_011_011_0(uniques, 1);
+  f_110_111_011_011_1(uniques, 1);
+  f_110_111_011_100_0(uniques, 1);
+  f_110_111_011_100_1(uniques, 1);
+  f_110_111_011_101_0(uniques, 1);
+  f_110_111_011_101_1(uniques, 1);
+  f_110_111_011_110_0(uniques, 1);
+  f_110_111_011_110_1(uniques, 1);
+  f_110_111_011_111_0(uniques, 1);
+  f_110_111_011_111_1(uniques, 1);
+  f_110_111_100_000_0(uniques, 1);
+  f_110_111_100_000_1(uniques, 1);
+  f_110_111_100_001_0(uniques, 1);
+  f_110_111_100_001_1(uniques, 1);
+  f_110_111_100_010_0(uniques, 1);
+  f_110_111_100_010_1(uniques, 1);
+  f_110_111_100_011_0(uniques, 1);
+  f_110_111_100_011_1(uniques, 1);
+  f_110_111_100_100_0(uniques, 1);
+  f_110_111_100_100_1(uniques, 1);
+  f_110_111_100_101_0(uniques, 1);
+  f_110_111_100_101_1(uniques, 1);
+  f_110_111_100_110_0(uniques, 1);
+  f_110_111_100_110_1(uniques, 1);
+  f_110_111_100_111_0(uniques, 1);
+  f_110_111_100_111_1(uniques, 1);
+  f_110_111_101_000_0(uniques, 1);
+  f_110_111_101_000_1(uniques, 1);
+  f_110_111_101_001_0(uniques, 1);
+  f_110_111_101_001_1(uniques, 1);
+  f_110_111_101_010_0(uniques, 1);
+  f_110_111_101_010_1(uniques, 1);
+  f_110_111_101_011_0(uniques, 1);
+  f_110_111_101_011_1(uniques, 1);
+  f_110_111_101_100_0(uniques, 1);
+  f_110_111_101_100_1(uniques, 1);
+  f_110_111_101_101_0(uniques, 1);
+  f_110_111_101_101_1(uniques, 1);
+  f_110_111_101_110_0(uniques, 1);
+  f_110_111_101_110_1(uniques, 1);
+  f_110_111_101_111_0(uniques, 1);
+  f_110_111_101_111_1(uniques, 1);
+  f_110_111_110_000_0(uniques, 1);
+  f_110_111_110_000_1(uniques, 1);
+  f_110_111_110_001_0(uniques, 1);
+  f_110_111_110_001_1(uniques, 1);
+  f_110_111_110_010_0(uniques, 1);
+  f_110_111_110_010_1(uniques, 1);
+  f_110_111_110_011_0(uniques, 1);
+  f_110_111_110_011_1(uniques, 1);
+  f_110_111_110_100_0(uniques, 1);
+  f_110_111_110_100_1(uniques, 1);
+  f_110_111_110_101_0(uniques, 1);
+  f_110_111_110_101_1(uniques, 1);
+  f_110_111_110_110_0(uniques, 1);
+  f_110_111_110_110_1(uniques, 1);
+  f_110_111_110_111_0(uniques, 1);
+  f_110_111_110_111_1(uniques, 1);
+  f_110_111_111_000_0(uniques, 1);
+  f_110_111_111_000_1(uniques, 1);
+  f_110_111_111_001_0(uniques, 1);
+  f_110_111_111_001_1(uniques, 1);
+  f_110_111_111_010_0(uniques, 1);
+  f_110_111_111_010_1(uniques, 1);
+  f_110_111_111_011_0(uniques, 1);
+  f_110_111_111_011_1(uniques, 1);
+  f_110_111_111_100_0(uniques, 1);
+  f_110_111_111_100_1(uniques, 1);
+  f_110_111_111_101_0(uniques, 1);
+  f_110_111_111_101_1(uniques, 1);
+  f_110_111_111_110_0(uniques, 1);
+  f_110_111_111_110_1(uniques, 1);
+  f_110_111_111_111_0(uniques, 1);
+  f_110_111_111_111_1(uniques, 1);
+  f_111_000_000_000_0(uniques, 1);
+  f_111_000_000_000_1(uniques, 1);
+  f_111_000_000_001_0(uniques, 1);
+  f_111_000_000_001_1(uniques, 1);
+  f_111_000_000_010_0(uniques, 1);
+  f_111_000_000_010_1(uniques, 1);
+  f_111_000_000_011_0(uniques, 1);
+  f_111_000_000_011_1(uniques, 1);
+  f_111_000_000_100_0(uniques, 1);
+  f_111_000_000_100_1(uniques, 1);
+  f_111_000_000_101_0(uniques, 1);
+  f_111_000_000_101_1(uniques, 1);
+  f_111_000_000_110_0(uniques, 1);
+  f_111_000_000_110_1(uniques, 1);
+  f_111_000_000_111_0(uniques, 1);
+  f_111_000_000_111_1(uniques, 1);
+  f_111_000_001_000_0(uniques, 1);
+  f_111_000_001_000_1(uniques, 1);
+  f_111_000_001_001_0(uniques, 1);
+  f_111_000_001_001_1(uniques, 1);
+  f_111_000_001_010_0(uniques, 1);
+  f_111_000_001_010_1(uniques, 1);
+  f_111_000_001_011_0(uniques, 1);
+  f_111_000_001_011_1(uniques, 1);
+  f_111_000_001_100_0(uniques, 1);
+  f_111_000_001_100_1(uniques, 1);
+  f_111_000_001_101_0(uniques, 1);
+  f_111_000_001_101_1(uniques, 1);
+  f_111_000_001_110_0(uniques, 1);
+  f_111_000_001_110_1(uniques, 1);
+  f_111_000_001_111_0(uniques, 1);
+  f_111_000_001_111_1(uniques, 1);
+  f_111_000_010_000_0(uniques, 1);
+  f_111_000_010_000_1(uniques, 1);
+  f_111_000_010_001_0(uniques, 1);
+  f_111_000_010_001_1(uniques, 1);
+  f_111_000_010_010_0(uniques, 1);
+  f_111_000_010_010_1(uniques, 1);
+  f_111_000_010_011_0(uniques, 1);
+  f_111_000_010_011_1(uniques, 1);
+  f_111_000_010_100_0(uniques, 1);
+  f_111_000_010_100_1(uniques, 1);
+  f_111_000_010_101_0(uniques, 1);
+  f_111_000_010_101_1(uniques, 1);
+  f_111_000_010_110_0(uniques, 1);
+  f_111_000_010_110_1(uniques, 1);
+  f_111_000_010_111_0(uniques, 1);
+  f_111_000_010_111_1(uniques, 1);
+  f_111_000_011_000_0(uniques, 1);
+  f_111_000_011_000_1(uniques, 1);
+  f_111_000_011_001_0(uniques, 1);
+  f_111_000_011_001_1(uniques, 1);
+  f_111_000_011_010_0(uniques, 1);
+  f_111_000_011_010_1(uniques, 1);
+  f_111_000_011_011_0(uniques, 1);
+  f_111_000_011_011_1(uniques, 1);
+  f_111_000_011_100_0(uniques, 1);
+  f_111_000_011_100_1(uniques, 1);
+  f_111_000_011_101_0(uniques, 1);
+  f_111_000_011_101_1(uniques, 1);
+  f_111_000_011_110_0(uniques, 1);
+  f_111_000_011_110_1(uniques, 1);
+  f_111_000_011_111_0(uniques, 1);
+  f_111_000_011_111_1(uniques, 1);
+  f_111_000_100_000_0(uniques, 1);
+  f_111_000_100_000_1(uniques, 1);
+  f_111_000_100_001_0(uniques, 1);
+  f_111_000_100_001_1(uniques, 1);
+  f_111_000_100_010_0(uniques, 1);
+  f_111_000_100_010_1(uniques, 1);
+  f_111_000_100_011_0(uniques, 1);
+  f_111_000_100_011_1(uniques, 1);
+  f_111_000_100_100_0(uniques, 1);
+  f_111_000_100_100_1(uniques, 1);
+  f_111_000_100_101_0(uniques, 1);
+  f_111_000_100_101_1(uniques, 1);
+  f_111_000_100_110_0(uniques, 1);
+  f_111_000_100_110_1(uniques, 1);
+  f_111_000_100_111_0(uniques, 1);
+  f_111_000_100_111_1(uniques, 1);
+  f_111_000_101_000_0(uniques, 1);
+  f_111_000_101_000_1(uniques, 1);
+  f_111_000_101_001_0(uniques, 1);
+  f_111_000_101_001_1(uniques, 1);
+  f_111_000_101_010_0(uniques, 1);
+  f_111_000_101_010_1(uniques, 1);
+  f_111_000_101_011_0(uniques, 1);
+  f_111_000_101_011_1(uniques, 1);
+  f_111_000_101_100_0(uniques, 1);
+  f_111_000_101_100_1(uniques, 1);
+  f_111_000_101_101_0(uniques, 1);
+  f_111_000_101_101_1(uniques, 1);
+  f_111_000_101_110_0(uniques, 1);
+  f_111_000_101_110_1(uniques, 1);
+  f_111_000_101_111_0(uniques, 1);
+  f_111_000_101_111_1(uniques, 1);
+  f_111_000_110_000_0(uniques, 1);
+  f_111_000_110_000_1(uniques, 1);
+  f_111_000_110_001_0(uniques, 1);
+  f_111_000_110_001_1(uniques, 1);
+  f_111_000_110_010_0(uniques, 1);
+  f_111_000_110_010_1(uniques, 1);
+  f_111_000_110_011_0(uniques, 1);
+  f_111_000_110_011_1(uniques, 1);
+  f_111_000_110_100_0(uniques, 1);
+  f_111_000_110_100_1(uniques, 1);
+  f_111_000_110_101_0(uniques, 1);
+  f_111_000_110_101_1(uniques, 1);
+  f_111_000_110_110_0(uniques, 1);
+  f_111_000_110_110_1(uniques, 1);
+  f_111_000_110_111_0(uniques, 1);
+  f_111_000_110_111_1(uniques, 1);
+  f_111_000_111_000_0(uniques, 1);
+  f_111_000_111_000_1(uniques, 1);
+  f_111_000_111_001_0(uniques, 1);
+  f_111_000_111_001_1(uniques, 1);
+  f_111_000_111_010_0(uniques, 1);
+  f_111_000_111_010_1(uniques, 1);
+  f_111_000_111_011_0(uniques, 1);
+  f_111_000_111_011_1(uniques, 1);
+  f_111_000_111_100_0(uniques, 1);
+  f_111_000_111_100_1(uniques, 1);
+  f_111_000_111_101_0(uniques, 1);
+  f_111_000_111_101_1(uniques, 1);
+  f_111_000_111_110_0(uniques, 1);
+  f_111_000_111_110_1(uniques, 1);
+  f_111_000_111_111_0(uniques, 1);
+  f_111_000_111_111_1(uniques, 1);
+  f_111_001_000_000_0(uniques, 1);
+  f_111_001_000_000_1(uniques, 1);
+  f_111_001_000_001_0(uniques, 1);
+  f_111_001_000_001_1(uniques, 1);
+  f_111_001_000_010_0(uniques, 1);
+  f_111_001_000_010_1(uniques, 1);
+  f_111_001_000_011_0(uniques, 1);
+  f_111_001_000_011_1(uniques, 1);
+  f_111_001_000_100_0(uniques, 1);
+  f_111_001_000_100_1(uniques, 1);
+  f_111_001_000_101_0(uniques, 1);
+  f_111_001_000_101_1(uniques, 1);
+  f_111_001_000_110_0(uniques, 1);
+  f_111_001_000_110_1(uniques, 1);
+  f_111_001_000_111_0(uniques, 1);
+  f_111_001_000_111_1(uniques, 1);
+  f_111_001_001_000_0(uniques, 1);
+  f_111_001_001_000_1(uniques, 1);
+  f_111_001_001_001_0(uniques, 1);
+  f_111_001_001_001_1(uniques, 1);
+  f_111_001_001_010_0(uniques, 1);
+  f_111_001_001_010_1(uniques, 1);
+  f_111_001_001_011_0(uniques, 1);
+  f_111_001_001_011_1(uniques, 1);
+  f_111_001_001_100_0(uniques, 1);
+  f_111_001_001_100_1(uniques, 1);
+  f_111_001_001_101_0(uniques, 1);
+  f_111_001_001_101_1(uniques, 1);
+  f_111_001_001_110_0(uniques, 1);
+  f_111_001_001_110_1(uniques, 1);
+  f_111_001_001_111_0(uniques, 1);
+  f_111_001_001_111_1(uniques, 1);
+  f_111_001_010_000_0(uniques, 1);
+  f_111_001_010_000_1(uniques, 1);
+  f_111_001_010_001_0(uniques, 1);
+  f_111_001_010_001_1(uniques, 1);
+  f_111_001_010_010_0(uniques, 1);
+  f_111_001_010_010_1(uniques, 1);
+  f_111_001_010_011_0(uniques, 1);
+  f_111_001_010_011_1(uniques, 1);
+  f_111_001_010_100_0(uniques, 1);
+  f_111_001_010_100_1(uniques, 1);
+  f_111_001_010_101_0(uniques, 1);
+  f_111_001_010_101_1(uniques, 1);
+  f_111_001_010_110_0(uniques, 1);
+  f_111_001_010_110_1(uniques, 1);
+  f_111_001_010_111_0(uniques, 1);
+  f_111_001_010_111_1(uniques, 1);
+  f_111_001_011_000_0(uniques, 1);
+  f_111_001_011_000_1(uniques, 1);
+  f_111_001_011_001_0(uniques, 1);
+  f_111_001_011_001_1(uniques, 1);
+  f_111_001_011_010_0(uniques, 1);
+  f_111_001_011_010_1(uniques, 1);
+  f_111_001_011_011_0(uniques, 1);
+  f_111_001_011_011_1(uniques, 1);
+  f_111_001_011_100_0(uniques, 1);
+  f_111_001_011_100_1(uniques, 1);
+  f_111_001_011_101_0(uniques, 1);
+  f_111_001_011_101_1(uniques, 1);
+  f_111_001_011_110_0(uniques, 1);
+  f_111_001_011_110_1(uniques, 1);
+  f_111_001_011_111_0(uniques, 1);
+  f_111_001_011_111_1(uniques, 1);
+  f_111_001_100_000_0(uniques, 1);
+  f_111_001_100_000_1(uniques, 1);
+  f_111_001_100_001_0(uniques, 1);
+  f_111_001_100_001_1(uniques, 1);
+  f_111_001_100_010_0(uniques, 1);
+  f_111_001_100_010_1(uniques, 1);
+  f_111_001_100_011_0(uniques, 1);
+  f_111_001_100_011_1(uniques, 1);
+  f_111_001_100_100_0(uniques, 1);
+  f_111_001_100_100_1(uniques, 1);
+  f_111_001_100_101_0(uniques, 1);
+  f_111_001_100_101_1(uniques, 1);
+  f_111_001_100_110_0(uniques, 1);
+  f_111_001_100_110_1(uniques, 1);
+  f_111_001_100_111_0(uniques, 1);
+  f_111_001_100_111_1(uniques, 1);
+  f_111_001_101_000_0(uniques, 1);
+  f_111_001_101_000_1(uniques, 1);
+  f_111_001_101_001_0(uniques, 1);
+  f_111_001_101_001_1(uniques, 1);
+  f_111_001_101_010_0(uniques, 1);
+  f_111_001_101_010_1(uniques, 1);
+  f_111_001_101_011_0(uniques, 1);
+  f_111_001_101_011_1(uniques, 1);
+  f_111_001_101_100_0(uniques, 1);
+  f_111_001_101_100_1(uniques, 1);
+  f_111_001_101_101_0(uniques, 1);
+  f_111_001_101_101_1(uniques, 1);
+  f_111_001_101_110_0(uniques, 1);
+  f_111_001_101_110_1(uniques, 1);
+  f_111_001_101_111_0(uniques, 1);
+  f_111_001_101_111_1(uniques, 1);
+  f_111_001_110_000_0(uniques, 1);
+  f_111_001_110_000_1(uniques, 1);
+  f_111_001_110_001_0(uniques, 1);
+  f_111_001_110_001_1(uniques, 1);
+  f_111_001_110_010_0(uniques, 1);
+  f_111_001_110_010_1(uniques, 1);
+  f_111_001_110_011_0(uniques, 1);
+  f_111_001_110_011_1(uniques, 1);
+  f_111_001_110_100_0(uniques, 1);
+  f_111_001_110_100_1(uniques, 1);
+  f_111_001_110_101_0(uniques, 1);
+  f_111_001_110_101_1(uniques, 1);
+  f_111_001_110_110_0(uniques, 1);
+  f_111_001_110_110_1(uniques, 1);
+  f_111_001_110_111_0(uniques, 1);
+  f_111_001_110_111_1(uniques, 1);
+  f_111_001_111_000_0(uniques, 1);
+  f_111_001_111_000_1(uniques, 1);
+  f_111_001_111_001_0(uniques, 1);
+  f_111_001_111_001_1(uniques, 1);
+  f_111_001_111_010_0(uniques, 1);
+  f_111_001_111_010_1(uniques, 1);
+  f_111_001_111_011_0(uniques, 1);
+  f_111_001_111_011_1(uniques, 1);
+  f_111_001_111_100_0(uniques, 1);
+  f_111_001_111_100_1(uniques, 1);
+  f_111_001_111_101_0(uniques, 1);
+  f_111_001_111_101_1(uniques, 1);
+  f_111_001_111_110_0(uniques, 1);
+  f_111_001_111_110_1(uniques, 1);
+  f_111_001_111_111_0(uniques, 1);
+  f_111_001_111_111_1(uniques, 1);
+  f_111_010_000_000_0(uniques, 1);
+  f_111_010_000_000_1(uniques, 1);
+  f_111_010_000_001_0(uniques, 1);
+  f_111_010_000_001_1(uniques, 1);
+  f_111_010_000_010_0(uniques, 1);
+  f_111_010_000_010_1(uniques, 1);
+  f_111_010_000_011_0(uniques, 1);
+  f_111_010_000_011_1(uniques, 1);
+  f_111_010_000_100_0(uniques, 1);
+  f_111_010_000_100_1(uniques, 1);
+  f_111_010_000_101_0(uniques, 1);
+  f_111_010_000_101_1(uniques, 1);
+  f_111_010_000_110_0(uniques, 1);
+  f_111_010_000_110_1(uniques, 1);
+  f_111_010_000_111_0(uniques, 1);
+  f_111_010_000_111_1(uniques, 1);
+  f_111_010_001_000_0(uniques, 1);
+  f_111_010_001_000_1(uniques, 1);
+  f_111_010_001_001_0(uniques, 1);
+  f_111_010_001_001_1(uniques, 1);
+  f_111_010_001_010_0(uniques, 1);
+  f_111_010_001_010_1(uniques, 1);
+  f_111_010_001_011_0(uniques, 1);
+  f_111_010_001_011_1(uniques, 1);
+  f_111_010_001_100_0(uniques, 1);
+  f_111_010_001_100_1(uniques, 1);
+  f_111_010_001_101_0(uniques, 1);
+  f_111_010_001_101_1(uniques, 1);
+  f_111_010_001_110_0(uniques, 1);
+  f_111_010_001_110_1(uniques, 1);
+  f_111_010_001_111_0(uniques, 1);
+  f_111_010_001_111_1(uniques, 1);
+  f_111_010_010_000_0(uniques, 1);
+  f_111_010_010_000_1(uniques, 1);
+  f_111_010_010_001_0(uniques, 1);
+  f_111_010_010_001_1(uniques, 1);
+  f_111_010_010_010_0(uniques, 1);
+  f_111_010_010_010_1(uniques, 1);
+  f_111_010_010_011_0(uniques, 1);
+  f_111_010_010_011_1(uniques, 1);
+  f_111_010_010_100_0(uniques, 1);
+  f_111_010_010_100_1(uniques, 1);
+  f_111_010_010_101_0(uniques, 1);
+  f_111_010_010_101_1(uniques, 1);
+  f_111_010_010_110_0(uniques, 1);
+  f_111_010_010_110_1(uniques, 1);
+  f_111_010_010_111_0(uniques, 1);
+  f_111_010_010_111_1(uniques, 1);
+  f_111_010_011_000_0(uniques, 1);
+  f_111_010_011_000_1(uniques, 1);
+  f_111_010_011_001_0(uniques, 1);
+  f_111_010_011_001_1(uniques, 1);
+  f_111_010_011_010_0(uniques, 1);
+  f_111_010_011_010_1(uniques, 1);
+  f_111_010_011_011_0(uniques, 1);
+  f_111_010_011_011_1(uniques, 1);
+  f_111_010_011_100_0(uniques, 1);
+  f_111_010_011_100_1(uniques, 1);
+  f_111_010_011_101_0(uniques, 1);
+  f_111_010_011_101_1(uniques, 1);
+  f_111_010_011_110_0(uniques, 1);
+  f_111_010_011_110_1(uniques, 1);
+  f_111_010_011_111_0(uniques, 1);
+  f_111_010_011_111_1(uniques, 1);
+  f_111_010_100_000_0(uniques, 1);
+  f_111_010_100_000_1(uniques, 1);
+  f_111_010_100_001_0(uniques, 1);
+  f_111_010_100_001_1(uniques, 1);
+  f_111_010_100_010_0(uniques, 1);
+  f_111_010_100_010_1(uniques, 1);
+  f_111_010_100_011_0(uniques, 1);
+  f_111_010_100_011_1(uniques, 1);
+  f_111_010_100_100_0(uniques, 1);
+  f_111_010_100_100_1(uniques, 1);
+  f_111_010_100_101_0(uniques, 1);
+  f_111_010_100_101_1(uniques, 1);
+  f_111_010_100_110_0(uniques, 1);
+  f_111_010_100_110_1(uniques, 1);
+  f_111_010_100_111_0(uniques, 1);
+  f_111_010_100_111_1(uniques, 1);
+  f_111_010_101_000_0(uniques, 1);
+  f_111_010_101_000_1(uniques, 1);
+  f_111_010_101_001_0(uniques, 1);
+  f_111_010_101_001_1(uniques, 1);
+  f_111_010_101_010_0(uniques, 1);
+  f_111_010_101_010_1(uniques, 1);
+  f_111_010_101_011_0(uniques, 1);
+  f_111_010_101_011_1(uniques, 1);
+  f_111_010_101_100_0(uniques, 1);
+  f_111_010_101_100_1(uniques, 1);
+  f_111_010_101_101_0(uniques, 1);
+  f_111_010_101_101_1(uniques, 1);
+  f_111_010_101_110_0(uniques, 1);
+  f_111_010_101_110_1(uniques, 1);
+  f_111_010_101_111_0(uniques, 1);
+  f_111_010_101_111_1(uniques, 1);
+  f_111_010_110_000_0(uniques, 1);
+  f_111_010_110_000_1(uniques, 1);
+  f_111_010_110_001_0(uniques, 1);
+  f_111_010_110_001_1(uniques, 1);
+  f_111_010_110_010_0(uniques, 1);
+  f_111_010_110_010_1(uniques, 1);
+  f_111_010_110_011_0(uniques, 1);
+  f_111_010_110_011_1(uniques, 1);
+  f_111_010_110_100_0(uniques, 1);
+  f_111_010_110_100_1(uniques, 1);
+  f_111_010_110_101_0(uniques, 1);
+  f_111_010_110_101_1(uniques, 1);
+  f_111_010_110_110_0(uniques, 1);
+  f_111_010_110_110_1(uniques, 1);
+  f_111_010_110_111_0(uniques, 1);
+  f_111_010_110_111_1(uniques, 1);
+  f_111_010_111_000_0(uniques, 1);
+  f_111_010_111_000_1(uniques, 1);
+  f_111_010_111_001_0(uniques, 1);
+  f_111_010_111_001_1(uniques, 1);
+  f_111_010_111_010_0(uniques, 1);
+  f_111_010_111_010_1(uniques, 1);
+  f_111_010_111_011_0(uniques, 1);
+  f_111_010_111_011_1(uniques, 1);
+  f_111_010_111_100_0(uniques, 1);
+  f_111_010_111_100_1(uniques, 1);
+  f_111_010_111_101_0(uniques, 1);
+  f_111_010_111_101_1(uniques, 1);
+  f_111_010_111_110_0(uniques, 1);
+  f_111_010_111_110_1(uniques, 1);
+  f_111_010_111_111_0(uniques, 1);
+  f_111_010_111_111_1(uniques, 1);
+  f_111_011_000_000_0(uniques, 1);
+  f_111_011_000_000_1(uniques, 1);
+  f_111_011_000_001_0(uniques, 1);
+  f_111_011_000_001_1(uniques, 1);
+  f_111_011_000_010_0(uniques, 1);
+  f_111_011_000_010_1(uniques, 1);
+  f_111_011_000_011_0(uniques, 1);
+  f_111_011_000_011_1(uniques, 1);
+  f_111_011_000_100_0(uniques, 1);
+  f_111_011_000_100_1(uniques, 1);
+  f_111_011_000_101_0(uniques, 1);
+  f_111_011_000_101_1(uniques, 1);
+  f_111_011_000_110_0(uniques, 1);
+  f_111_011_000_110_1(uniques, 1);
+  f_111_011_000_111_0(uniques, 1);
+  f_111_011_000_111_1(uniques, 1);
+  f_111_011_001_000_0(uniques, 1);
+  f_111_011_001_000_1(uniques, 1);
+  f_111_011_001_001_0(uniques, 1);
+  f_111_011_001_001_1(uniques, 1);
+  f_111_011_001_010_0(uniques, 1);
+  f_111_011_001_010_1(uniques, 1);
+  f_111_011_001_011_0(uniques, 1);
+  f_111_011_001_011_1(uniques, 1);
+  f_111_011_001_100_0(uniques, 1);
+  f_111_011_001_100_1(uniques, 1);
+  f_111_011_001_101_0(uniques, 1);
+  f_111_011_001_101_1(uniques, 1);
+  f_111_011_001_110_0(uniques, 1);
+  f_111_011_001_110_1(uniques, 1);
+  f_111_011_001_111_0(uniques, 1);
+  f_111_011_001_111_1(uniques, 1);
+  f_111_011_010_000_0(uniques, 1);
+  f_111_011_010_000_1(uniques, 1);
+  f_111_011_010_001_0(uniques, 1);
+  f_111_011_010_001_1(uniques, 1);
+  f_111_011_010_010_0(uniques, 1);
+  f_111_011_010_010_1(uniques, 1);
+  f_111_011_010_011_0(uniques, 1);
+  f_111_011_010_011_1(uniques, 1);
+  f_111_011_010_100_0(uniques, 1);
+  f_111_011_010_100_1(uniques, 1);
+  f_111_011_010_101_0(uniques, 1);
+  f_111_011_010_101_1(uniques, 1);
+  f_111_011_010_110_0(uniques, 1);
+  f_111_011_010_110_1(uniques, 1);
+  f_111_011_010_111_0(uniques, 1);
+  f_111_011_010_111_1(uniques, 1);
+  f_111_011_011_000_0(uniques, 1);
+  f_111_011_011_000_1(uniques, 1);
+  f_111_011_011_001_0(uniques, 1);
+  f_111_011_011_001_1(uniques, 1);
+  f_111_011_011_010_0(uniques, 1);
+  f_111_011_011_010_1(uniques, 1);
+  f_111_011_011_011_0(uniques, 1);
+  f_111_011_011_011_1(uniques, 1);
+  f_111_011_011_100_0(uniques, 1);
+  f_111_011_011_100_1(uniques, 1);
+  f_111_011_011_101_0(uniques, 1);
+  f_111_011_011_101_1(uniques, 1);
+  f_111_011_011_110_0(uniques, 1);
+  f_111_011_011_110_1(uniques, 1);
+  f_111_011_011_111_0(uniques, 1);
+  f_111_011_011_111_1(uniques, 1);
+  f_111_011_100_000_0(uniques, 1);
+  f_111_011_100_000_1(uniques, 1);
+  f_111_011_100_001_0(uniques, 1);
+  f_111_011_100_001_1(uniques, 1);
+  f_111_011_100_010_0(uniques, 1);
+  f_111_011_100_010_1(uniques, 1);
+  f_111_011_100_011_0(uniques, 1);
+  f_111_011_100_011_1(uniques, 1);
+  f_111_011_100_100_0(uniques, 1);
+  f_111_011_100_100_1(uniques, 1);
+  f_111_011_100_101_0(uniques, 1);
+  f_111_011_100_101_1(uniques, 1);
+  f_111_011_100_110_0(uniques, 1);
+  f_111_011_100_110_1(uniques, 1);
+  f_111_011_100_111_0(uniques, 1);
+  f_111_011_100_111_1(uniques, 1);
+  f_111_011_101_000_0(uniques, 1);
+  f_111_011_101_000_1(uniques, 1);
+  f_111_011_101_001_0(uniques, 1);
+  f_111_011_101_001_1(uniques, 1);
+  f_111_011_101_010_0(uniques, 1);
+  f_111_011_101_010_1(uniques, 1);
+  f_111_011_101_011_0(uniques, 1);
+  f_111_011_101_011_1(uniques, 1);
+  f_111_011_101_100_0(uniques, 1);
+  f_111_011_101_100_1(uniques, 1);
+  f_111_011_101_101_0(uniques, 1);
+  f_111_011_101_101_1(uniques, 1);
+  f_111_011_101_110_0(uniques, 1);
+  f_111_011_101_110_1(uniques, 1);
+  f_111_011_101_111_0(uniques, 1);
+  f_111_011_101_111_1(uniques, 1);
+  f_111_011_110_000_0(uniques, 1);
+  f_111_011_110_000_1(uniques, 1);
+  f_111_011_110_001_0(uniques, 1);
+  f_111_011_110_001_1(uniques, 1);
+  f_111_011_110_010_0(uniques, 1);
+  f_111_011_110_010_1(uniques, 1);
+  f_111_011_110_011_0(uniques, 1);
+  f_111_011_110_011_1(uniques, 1);
+  f_111_011_110_100_0(uniques, 1);
+  f_111_011_110_100_1(uniques, 1);
+  f_111_011_110_101_0(uniques, 1);
+  f_111_011_110_101_1(uniques, 1);
+  f_111_011_110_110_0(uniques, 1);
+  f_111_011_110_110_1(uniques, 1);
+  f_111_011_110_111_0(uniques, 1);
+  f_111_011_110_111_1(uniques, 1);
+  f_111_011_111_000_0(uniques, 1);
+  f_111_011_111_000_1(uniques, 1);
+  f_111_011_111_001_0(uniques, 1);
+  f_111_011_111_001_1(uniques, 1);
+  f_111_011_111_010_0(uniques, 1);
+  f_111_011_111_010_1(uniques, 1);
+  f_111_011_111_011_0(uniques, 1);
+  f_111_011_111_011_1(uniques, 1);
+  f_111_011_111_100_0(uniques, 1);
+  f_111_011_111_100_1(uniques, 1);
+  f_111_011_111_101_0(uniques, 1);
+  f_111_011_111_101_1(uniques, 1);
+  f_111_011_111_110_0(uniques, 1);
+  f_111_011_111_110_1(uniques, 1);
+  f_111_011_111_111_0(uniques, 1);
+  f_111_011_111_111_1(uniques, 1);
+  f_111_100_000_000_0(uniques, 1);
+  f_111_100_000_000_1(uniques, 1);
+  f_111_100_000_001_0(uniques, 1);
+  f_111_100_000_001_1(uniques, 1);
+  f_111_100_000_010_0(uniques, 1);
+  f_111_100_000_010_1(uniques, 1);
+  f_111_100_000_011_0(uniques, 1);
+  f_111_100_000_011_1(uniques, 1);
+  f_111_100_000_100_0(uniques, 1);
+  f_111_100_000_100_1(uniques, 1);
+  f_111_100_000_101_0(uniques, 1);
+  f_111_100_000_101_1(uniques, 1);
+  f_111_100_000_110_0(uniques, 1);
+  f_111_100_000_110_1(uniques, 1);
+  f_111_100_000_111_0(uniques, 1);
+  f_111_100_000_111_1(uniques, 1);
+  f_111_100_001_000_0(uniques, 1);
+  f_111_100_001_000_1(uniques, 1);
+  f_111_100_001_001_0(uniques, 1);
+  f_111_100_001_001_1(uniques, 1);
+  f_111_100_001_010_0(uniques, 1);
+  f_111_100_001_010_1(uniques, 1);
+  f_111_100_001_011_0(uniques, 1);
+  f_111_100_001_011_1(uniques, 1);
+  f_111_100_001_100_0(uniques, 1);
+  f_111_100_001_100_1(uniques, 1);
+  f_111_100_001_101_0(uniques, 1);
+  f_111_100_001_101_1(uniques, 1);
+  f_111_100_001_110_0(uniques, 1);
+  f_111_100_001_110_1(uniques, 1);
+  f_111_100_001_111_0(uniques, 1);
+  f_111_100_001_111_1(uniques, 1);
+  f_111_100_010_000_0(uniques, 1);
+  f_111_100_010_000_1(uniques, 1);
+  f_111_100_010_001_0(uniques, 1);
+  f_111_100_010_001_1(uniques, 1);
+  f_111_100_010_010_0(uniques, 1);
+  f_111_100_010_010_1(uniques, 1);
+  f_111_100_010_011_0(uniques, 1);
+  f_111_100_010_011_1(uniques, 1);
+  f_111_100_010_100_0(uniques, 1);
+  f_111_100_010_100_1(uniques, 1);
+  f_111_100_010_101_0(uniques, 1);
+  f_111_100_010_101_1(uniques, 1);
+  f_111_100_010_110_0(uniques, 1);
+  f_111_100_010_110_1(uniques, 1);
+  f_111_100_010_111_0(uniques, 1);
+  f_111_100_010_111_1(uniques, 1);
+  f_111_100_011_000_0(uniques, 1);
+  f_111_100_011_000_1(uniques, 1);
+  f_111_100_011_001_0(uniques, 1);
+  f_111_100_011_001_1(uniques, 1);
+  f_111_100_011_010_0(uniques, 1);
+  f_111_100_011_010_1(uniques, 1);
+  f_111_100_011_011_0(uniques, 1);
+  f_111_100_011_011_1(uniques, 1);
+  f_111_100_011_100_0(uniques, 1);
+  f_111_100_011_100_1(uniques, 1);
+  f_111_100_011_101_0(uniques, 1);
+  f_111_100_011_101_1(uniques, 1);
+  f_111_100_011_110_0(uniques, 1);
+  f_111_100_011_110_1(uniques, 1);
+  f_111_100_011_111_0(uniques, 1);
+  f_111_100_011_111_1(uniques, 1);
+  f_111_100_100_000_0(uniques, 1);
+  f_111_100_100_000_1(uniques, 1);
+  f_111_100_100_001_0(uniques, 1);
+  f_111_100_100_001_1(uniques, 1);
+  f_111_100_100_010_0(uniques, 1);
+  f_111_100_100_010_1(uniques, 1);
+  f_111_100_100_011_0(uniques, 1);
+  f_111_100_100_011_1(uniques, 1);
+  f_111_100_100_100_0(uniques, 1);
+  f_111_100_100_100_1(uniques, 1);
+  f_111_100_100_101_0(uniques, 1);
+  f_111_100_100_101_1(uniques, 1);
+  f_111_100_100_110_0(uniques, 1);
+  f_111_100_100_110_1(uniques, 1);
+  f_111_100_100_111_0(uniques, 1);
+  f_111_100_100_111_1(uniques, 1);
+  f_111_100_101_000_0(uniques, 1);
+  f_111_100_101_000_1(uniques, 1);
+  f_111_100_101_001_0(uniques, 1);
+  f_111_100_101_001_1(uniques, 1);
+  f_111_100_101_010_0(uniques, 1);
+  f_111_100_101_010_1(uniques, 1);
+  f_111_100_101_011_0(uniques, 1);
+  f_111_100_101_011_1(uniques, 1);
+  f_111_100_101_100_0(uniques, 1);
+  f_111_100_101_100_1(uniques, 1);
+  f_111_100_101_101_0(uniques, 1);
+  f_111_100_101_101_1(uniques, 1);
+  f_111_100_101_110_0(uniques, 1);
+  f_111_100_101_110_1(uniques, 1);
+  f_111_100_101_111_0(uniques, 1);
+  f_111_100_101_111_1(uniques, 1);
+  f_111_100_110_000_0(uniques, 1);
+  f_111_100_110_000_1(uniques, 1);
+  f_111_100_110_001_0(uniques, 1);
+  f_111_100_110_001_1(uniques, 1);
+  f_111_100_110_010_0(uniques, 1);
+  f_111_100_110_010_1(uniques, 1);
+  f_111_100_110_011_0(uniques, 1);
+  f_111_100_110_011_1(uniques, 1);
+  f_111_100_110_100_0(uniques, 1);
+  f_111_100_110_100_1(uniques, 1);
+  f_111_100_110_101_0(uniques, 1);
+  f_111_100_110_101_1(uniques, 1);
+  f_111_100_110_110_0(uniques, 1);
+  f_111_100_110_110_1(uniques, 1);
+  f_111_100_110_111_0(uniques, 1);
+  f_111_100_110_111_1(uniques, 1);
+  f_111_100_111_000_0(uniques, 1);
+  f_111_100_111_000_1(uniques, 1);
+  f_111_100_111_001_0(uniques, 1);
+  f_111_100_111_001_1(uniques, 1);
+  f_111_100_111_010_0(uniques, 1);
+  f_111_100_111_010_1(uniques, 1);
+  f_111_100_111_011_0(uniques, 1);
+  f_111_100_111_011_1(uniques, 1);
+  f_111_100_111_100_0(uniques, 1);
+  f_111_100_111_100_1(uniques, 1);
+  f_111_100_111_101_0(uniques, 1);
+  f_111_100_111_101_1(uniques, 1);
+  f_111_100_111_110_0(uniques, 1);
+  f_111_100_111_110_1(uniques, 1);
+  f_111_100_111_111_0(uniques, 1);
+  f_111_100_111_111_1(uniques, 1);
+  f_111_101_000_000_0(uniques, 1);
+  f_111_101_000_000_1(uniques, 1);
+  f_111_101_000_001_0(uniques, 1);
+  f_111_101_000_001_1(uniques, 1);
+  f_111_101_000_010_0(uniques, 1);
+  f_111_101_000_010_1(uniques, 1);
+  f_111_101_000_011_0(uniques, 1);
+  f_111_101_000_011_1(uniques, 1);
+  f_111_101_000_100_0(uniques, 1);
+  f_111_101_000_100_1(uniques, 1);
+  f_111_101_000_101_0(uniques, 1);
+  f_111_101_000_101_1(uniques, 1);
+  f_111_101_000_110_0(uniques, 1);
+  f_111_101_000_110_1(uniques, 1);
+  f_111_101_000_111_0(uniques, 1);
+  f_111_101_000_111_1(uniques, 1);
+  f_111_101_001_000_0(uniques, 1);
+  f_111_101_001_000_1(uniques, 1);
+  f_111_101_001_001_0(uniques, 1);
+  f_111_101_001_001_1(uniques, 1);
+  f_111_101_001_010_0(uniques, 1);
+  f_111_101_001_010_1(uniques, 1);
+  f_111_101_001_011_0(uniques, 1);
+  f_111_101_001_011_1(uniques, 1);
+  f_111_101_001_100_0(uniques, 1);
+  f_111_101_001_100_1(uniques, 1);
+  f_111_101_001_101_0(uniques, 1);
+  f_111_101_001_101_1(uniques, 1);
+  f_111_101_001_110_0(uniques, 1);
+  f_111_101_001_110_1(uniques, 1);
+  f_111_101_001_111_0(uniques, 1);
+  f_111_101_001_111_1(uniques, 1);
+  f_111_101_010_000_0(uniques, 1);
+  f_111_101_010_000_1(uniques, 1);
+  f_111_101_010_001_0(uniques, 1);
+  f_111_101_010_001_1(uniques, 1);
+  f_111_101_010_010_0(uniques, 1);
+  f_111_101_010_010_1(uniques, 1);
+  f_111_101_010_011_0(uniques, 1);
+  f_111_101_010_011_1(uniques, 1);
+  f_111_101_010_100_0(uniques, 1);
+  f_111_101_010_100_1(uniques, 1);
+  f_111_101_010_101_0(uniques, 1);
+  f_111_101_010_101_1(uniques, 1);
+  f_111_101_010_110_0(uniques, 1);
+  f_111_101_010_110_1(uniques, 1);
+  f_111_101_010_111_0(uniques, 1);
+  f_111_101_010_111_1(uniques, 1);
+  f_111_101_011_000_0(uniques, 1);
+  f_111_101_011_000_1(uniques, 1);
+  f_111_101_011_001_0(uniques, 1);
+  f_111_101_011_001_1(uniques, 1);
+  f_111_101_011_010_0(uniques, 1);
+  f_111_101_011_010_1(uniques, 1);
+  f_111_101_011_011_0(uniques, 1);
+  f_111_101_011_011_1(uniques, 1);
+  f_111_101_011_100_0(uniques, 1);
+  f_111_101_011_100_1(uniques, 1);
+  f_111_101_011_101_0(uniques, 1);
+  f_111_101_011_101_1(uniques, 1);
+  f_111_101_011_110_0(uniques, 1);
+  f_111_101_011_110_1(uniques, 1);
+  f_111_101_011_111_0(uniques, 1);
+  f_111_101_011_111_1(uniques, 1);
+  f_111_101_100_000_0(uniques, 1);
+  f_111_101_100_000_1(uniques, 1);
+  f_111_101_100_001_0(uniques, 1);
+  f_111_101_100_001_1(uniques, 1);
+  f_111_101_100_010_0(uniques, 1);
+  f_111_101_100_010_1(uniques, 1);
+  f_111_101_100_011_0(uniques, 1);
+  f_111_101_100_011_1(uniques, 1);
+  f_111_101_100_100_0(uniques, 1);
+  f_111_101_100_100_1(uniques, 1);
+  f_111_101_100_101_0(uniques, 1);
+  f_111_101_100_101_1(uniques, 1);
+  f_111_101_100_110_0(uniques, 1);
+  f_111_101_100_110_1(uniques, 1);
+  f_111_101_100_111_0(uniques, 1);
+  f_111_101_100_111_1(uniques, 1);
+  f_111_101_101_000_0(uniques, 1);
+  f_111_101_101_000_1(uniques, 1);
+  f_111_101_101_001_0(uniques, 1);
+  f_111_101_101_001_1(uniques, 1);
+  f_111_101_101_010_0(uniques, 1);
+  f_111_101_101_010_1(uniques, 1);
+  f_111_101_101_011_0(uniques, 1);
+  f_111_101_101_011_1(uniques, 1);
+  f_111_101_101_100_0(uniques, 1);
+  f_111_101_101_100_1(uniques, 1);
+  f_111_101_101_101_0(uniques, 1);
+  f_111_101_101_101_1(uniques, 1);
+  f_111_101_101_110_0(uniques, 1);
+  f_111_101_101_110_1(uniques, 1);
+  f_111_101_101_111_0(uniques, 1);
+  f_111_101_101_111_1(uniques, 1);
+  f_111_101_110_000_0(uniques, 1);
+  f_111_101_110_000_1(uniques, 1);
+  f_111_101_110_001_0(uniques, 1);
+  f_111_101_110_001_1(uniques, 1);
+  f_111_101_110_010_0(uniques, 1);
+  f_111_101_110_010_1(uniques, 1);
+  f_111_101_110_011_0(uniques, 1);
+  f_111_101_110_011_1(uniques, 1);
+  f_111_101_110_100_0(uniques, 1);
+  f_111_101_110_100_1(uniques, 1);
+  f_111_101_110_101_0(uniques, 1);
+  f_111_101_110_101_1(uniques, 1);
+  f_111_101_110_110_0(uniques, 1);
+  f_111_101_110_110_1(uniques, 1);
+  f_111_101_110_111_0(uniques, 1);
+  f_111_101_110_111_1(uniques, 1);
+  f_111_101_111_000_0(uniques, 1);
+  f_111_101_111_000_1(uniques, 1);
+  f_111_101_111_001_0(uniques, 1);
+  f_111_101_111_001_1(uniques, 1);
+  f_111_101_111_010_0(uniques, 1);
+  f_111_101_111_010_1(uniques, 1);
+  f_111_101_111_011_0(uniques, 1);
+  f_111_101_111_011_1(uniques, 1);
+  f_111_101_111_100_0(uniques, 1);
+  f_111_101_111_100_1(uniques, 1);
+  f_111_101_111_101_0(uniques, 1);
+  f_111_101_111_101_1(uniques, 1);
+  f_111_101_111_110_0(uniques, 1);
+  f_111_101_111_110_1(uniques, 1);
+  f_111_101_111_111_0(uniques, 1);
+  f_111_101_111_111_1(uniques, 1);
+  f_111_110_000_000_0(uniques, 1);
+  f_111_110_000_000_1(uniques, 1);
+  f_111_110_000_001_0(uniques, 1);
+  f_111_110_000_001_1(uniques, 1);
+  f_111_110_000_010_0(uniques, 1);
+  f_111_110_000_010_1(uniques, 1);
+  f_111_110_000_011_0(uniques, 1);
+  f_111_110_000_011_1(uniques, 1);
+  f_111_110_000_100_0(uniques, 1);
+  f_111_110_000_100_1(uniques, 1);
+  f_111_110_000_101_0(uniques, 1);
+  f_111_110_000_101_1(uniques, 1);
+  f_111_110_000_110_0(uniques, 1);
+  f_111_110_000_110_1(uniques, 1);
+  f_111_110_000_111_0(uniques, 1);
+  f_111_110_000_111_1(uniques, 1);
+  f_111_110_001_000_0(uniques, 1);
+  f_111_110_001_000_1(uniques, 1);
+  f_111_110_001_001_0(uniques, 1);
+  f_111_110_001_001_1(uniques, 1);
+  f_111_110_001_010_0(uniques, 1);
+  f_111_110_001_010_1(uniques, 1);
+  f_111_110_001_011_0(uniques, 1);
+  f_111_110_001_011_1(uniques, 1);
+  f_111_110_001_100_0(uniques, 1);
+  f_111_110_001_100_1(uniques, 1);
+  f_111_110_001_101_0(uniques, 1);
+  f_111_110_001_101_1(uniques, 1);
+  f_111_110_001_110_0(uniques, 1);
+  f_111_110_001_110_1(uniques, 1);
+  f_111_110_001_111_0(uniques, 1);
+  f_111_110_001_111_1(uniques, 1);
+  f_111_110_010_000_0(uniques, 1);
+  f_111_110_010_000_1(uniques, 1);
+  f_111_110_010_001_0(uniques, 1);
+  f_111_110_010_001_1(uniques, 1);
+  f_111_110_010_010_0(uniques, 1);
+  f_111_110_010_010_1(uniques, 1);
+  f_111_110_010_011_0(uniques, 1);
+  f_111_110_010_011_1(uniques, 1);
+  f_111_110_010_100_0(uniques, 1);
+  f_111_110_010_100_1(uniques, 1);
+  f_111_110_010_101_0(uniques, 1);
+  f_111_110_010_101_1(uniques, 1);
+  f_111_110_010_110_0(uniques, 1);
+  f_111_110_010_110_1(uniques, 1);
+  f_111_110_010_111_0(uniques, 1);
+  f_111_110_010_111_1(uniques, 1);
+  f_111_110_011_000_0(uniques, 1);
+  f_111_110_011_000_1(uniques, 1);
+  f_111_110_011_001_0(uniques, 1);
+  f_111_110_011_001_1(uniques, 1);
+  f_111_110_011_010_0(uniques, 1);
+  f_111_110_011_010_1(uniques, 1);
+  f_111_110_011_011_0(uniques, 1);
+  f_111_110_011_011_1(uniques, 1);
+  f_111_110_011_100_0(uniques, 1);
+  f_111_110_011_100_1(uniques, 1);
+  f_111_110_011_101_0(uniques, 1);
+  f_111_110_011_101_1(uniques, 1);
+  f_111_110_011_110_0(uniques, 1);
+  f_111_110_011_110_1(uniques, 1);
+  f_111_110_011_111_0(uniques, 1);
+  f_111_110_011_111_1(uniques, 1);
+  f_111_110_100_000_0(uniques, 1);
+  f_111_110_100_000_1(uniques, 1);
+  f_111_110_100_001_0(uniques, 1);
+  f_111_110_100_001_1(uniques, 1);
+  f_111_110_100_010_0(uniques, 1);
+  f_111_110_100_010_1(uniques, 1);
+  f_111_110_100_011_0(uniques, 1);
+  f_111_110_100_011_1(uniques, 1);
+  f_111_110_100_100_0(uniques, 1);
+  f_111_110_100_100_1(uniques, 1);
+  f_111_110_100_101_0(uniques, 1);
+  f_111_110_100_101_1(uniques, 1);
+  f_111_110_100_110_0(uniques, 1);
+  f_111_110_100_110_1(uniques, 1);
+  f_111_110_100_111_0(uniques, 1);
+  f_111_110_100_111_1(uniques, 1);
+  f_111_110_101_000_0(uniques, 1);
+  f_111_110_101_000_1(uniques, 1);
+  f_111_110_101_001_0(uniques, 1);
+  f_111_110_101_001_1(uniques, 1);
+  f_111_110_101_010_0(uniques, 1);
+  f_111_110_101_010_1(uniques, 1);
+  f_111_110_101_011_0(uniques, 1);
+  f_111_110_101_011_1(uniques, 1);
+  f_111_110_101_100_0(uniques, 1);
+  f_111_110_101_100_1(uniques, 1);
+  f_111_110_101_101_0(uniques, 1);
+  f_111_110_101_101_1(uniques, 1);
+  f_111_110_101_110_0(uniques, 1);
+  f_111_110_101_110_1(uniques, 1);
+  f_111_110_101_111_0(uniques, 1);
+  f_111_110_101_111_1(uniques, 1);
+  f_111_110_110_000_0(uniques, 1);
+  f_111_110_110_000_1(uniques, 1);
+  f_111_110_110_001_0(uniques, 1);
+  f_111_110_110_001_1(uniques, 1);
+  f_111_110_110_010_0(uniques, 1);
+  f_111_110_110_010_1(uniques, 1);
+  f_111_110_110_011_0(uniques, 1);
+  f_111_110_110_011_1(uniques, 1);
+  f_111_110_110_100_0(uniques, 1);
+  f_111_110_110_100_1(uniques, 1);
+  f_111_110_110_101_0(uniques, 1);
+  f_111_110_110_101_1(uniques, 1);
+  f_111_110_110_110_0(uniques, 1);
+  f_111_110_110_110_1(uniques, 1);
+  f_111_110_110_111_0(uniques, 1);
+  f_111_110_110_111_1(uniques, 1);
+  f_111_110_111_000_0(uniques, 1);
+  f_111_110_111_000_1(uniques, 1);
+  f_111_110_111_001_0(uniques, 1);
+  f_111_110_111_001_1(uniques, 1);
+  f_111_110_111_010_0(uniques, 1);
+  f_111_110_111_010_1(uniques, 1);
+  f_111_110_111_011_0(uniques, 1);
+  f_111_110_111_011_1(uniques, 1);
+  f_111_110_111_100_0(uniques, 1);
+  f_111_110_111_100_1(uniques, 1);
+  f_111_110_111_101_0(uniques, 1);
+  f_111_110_111_101_1(uniques, 1);
+  f_111_110_111_110_0(uniques, 1);
+  f_111_110_111_110_1(uniques, 1);
+  f_111_110_111_111_0(uniques, 1);
+  f_111_110_111_111_1(uniques, 1);
+  f_111_111_000_000_0(uniques, 1);
+  f_111_111_000_000_1(uniques, 1);
+  f_111_111_000_001_0(uniques, 1);
+  f_111_111_000_001_1(uniques, 1);
+  f_111_111_000_010_0(uniques, 1);
+  f_111_111_000_010_1(uniques, 1);
+  f_111_111_000_011_0(uniques, 1);
+  f_111_111_000_011_1(uniques, 1);
+  f_111_111_000_100_0(uniques, 1);
+  f_111_111_000_100_1(uniques, 1);
+  f_111_111_000_101_0(uniques, 1);
+  f_111_111_000_101_1(uniques, 1);
+  f_111_111_000_110_0(uniques, 1);
+  f_111_111_000_110_1(uniques, 1);
+  f_111_111_000_111_0(uniques, 1);
+  f_111_111_000_111_1(uniques, 1);
+  f_111_111_001_000_0(uniques, 1);
+  f_111_111_001_000_1(uniques, 1);
+  f_111_111_001_001_0(uniques, 1);
+  f_111_111_001_001_1(uniques, 1);
+  f_111_111_001_010_0(uniques, 1);
+  f_111_111_001_010_1(uniques, 1);
+  f_111_111_001_011_0(uniques, 1);
+  f_111_111_001_011_1(uniques, 1);
+  f_111_111_001_100_0(uniques, 1);
+  f_111_111_001_100_1(uniques, 1);
+  f_111_111_001_101_0(uniques, 1);
+  f_111_111_001_101_1(uniques, 1);
+  f_111_111_001_110_0(uniques, 1);
+  f_111_111_001_110_1(uniques, 1);
+  f_111_111_001_111_0(uniques, 1);
+  f_111_111_001_111_1(uniques, 1);
+  f_111_111_010_000_0(uniques, 1);
+  f_111_111_010_000_1(uniques, 1);
+  f_111_111_010_001_0(uniques, 1);
+  f_111_111_010_001_1(uniques, 1);
+  f_111_111_010_010_0(uniques, 1);
+  f_111_111_010_010_1(uniques, 1);
+  f_111_111_010_011_0(uniques, 1);
+  f_111_111_010_011_1(uniques, 1);
+  f_111_111_010_100_0(uniques, 1);
+  f_111_111_010_100_1(uniques, 1);
+  f_111_111_010_101_0(uniques, 1);
+  f_111_111_010_101_1(uniques, 1);
+  f_111_111_010_110_0(uniques, 1);
+  f_111_111_010_110_1(uniques, 1);
+  f_111_111_010_111_0(uniques, 1);
+  f_111_111_010_111_1(uniques, 1);
+  f_111_111_011_000_0(uniques, 1);
+  f_111_111_011_000_1(uniques, 1);
+  f_111_111_011_001_0(uniques, 1);
+  f_111_111_011_001_1(uniques, 1);
+  f_111_111_011_010_0(uniques, 1);
+  f_111_111_011_010_1(uniques, 1);
+  f_111_111_011_011_0(uniques, 1);
+  f_111_111_011_011_1(uniques, 1);
+  f_111_111_011_100_0(uniques, 1);
+  f_111_111_011_100_1(uniques, 1);
+  f_111_111_011_101_0(uniques, 1);
+  f_111_111_011_101_1(uniques, 1);
+  f_111_111_011_110_0(uniques, 1);
+  f_111_111_011_110_1(uniques, 1);
+  f_111_111_011_111_0(uniques, 1);
+  f_111_111_011_111_1(uniques, 1);
+  f_111_111_100_000_0(uniques, 1);
+  f_111_111_100_000_1(uniques, 1);
+  f_111_111_100_001_0(uniques, 1);
+  f_111_111_100_001_1(uniques, 1);
+  f_111_111_100_010_0(uniques, 1);
+  f_111_111_100_010_1(uniques, 1);
+  f_111_111_100_011_0(uniques, 1);
+  f_111_111_100_011_1(uniques, 1);
+  f_111_111_100_100_0(uniques, 1);
+  f_111_111_100_100_1(uniques, 1);
+  f_111_111_100_101_0(uniques, 1);
+  f_111_111_100_101_1(uniques, 1);
+  f_111_111_100_110_0(uniques, 1);
+  f_111_111_100_110_1(uniques, 1);
+  f_111_111_100_111_0(uniques, 1);
+  f_111_111_100_111_1(uniques, 1);
+  f_111_111_101_000_0(uniques, 1);
+  f_111_111_101_000_1(uniques, 1);
+  f_111_111_101_001_0(uniques, 1);
+  f_111_111_101_001_1(uniques, 1);
+  f_111_111_101_010_0(uniques, 1);
+  f_111_111_101_010_1(uniques, 1);
+  f_111_111_101_011_0(uniques, 1);
+  f_111_111_101_011_1(uniques, 1);
+  f_111_111_101_100_0(uniques, 1);
+  f_111_111_101_100_1(uniques, 1);
+  f_111_111_101_101_0(uniques, 1);
+  f_111_111_101_101_1(uniques, 1);
+  f_111_111_101_110_0(uniques, 1);
+  f_111_111_101_110_1(uniques, 1);
+  f_111_111_101_111_0(uniques, 1);
+  f_111_111_101_111_1(uniques, 1);
+  f_111_111_110_000_0(uniques, 1);
+  f_111_111_110_000_1(uniques, 1);
+  f_111_111_110_001_0(uniques, 1);
+  f_111_111_110_001_1(uniques, 1);
+  f_111_111_110_010_0(uniques, 1);
+  f_111_111_110_010_1(uniques, 1);
+  f_111_111_110_011_0(uniques, 1);
+  f_111_111_110_011_1(uniques, 1);
+  f_111_111_110_100_0(uniques, 1);
+  f_111_111_110_100_1(uniques, 1);
+  f_111_111_110_101_0(uniques, 1);
+  f_111_111_110_101_1(uniques, 1);
+  f_111_111_110_110_0(uniques, 1);
+  f_111_111_110_110_1(uniques, 1);
+  f_111_111_110_111_0(uniques, 1);
+  f_111_111_110_111_1(uniques, 1);
+  f_111_111_111_000_0(uniques, 1);
+  f_111_111_111_000_1(uniques, 1);
+  f_111_111_111_001_0(uniques, 1);
+  f_111_111_111_001_1(uniques, 1);
+  f_111_111_111_010_0(uniques, 1);
+  f_111_111_111_010_1(uniques, 1);
+  f_111_111_111_011_0(uniques, 1);
+  f_111_111_111_011_1(uniques, 1);
+  f_111_111_111_100_0(uniques, 1);
+  f_111_111_111_100_1(uniques, 1);
+  f_111_111_111_101_0(uniques, 1);
+  f_111_111_111_101_1(uniques, 1);
+  f_111_111_111_110_0(uniques, 1);
+  f_111_111_111_110_1(uniques, 1);
+  f_111_111_111_111_0(uniques, 1);
+  f_111_111_111_111_1(uniques, 1);
+  Expect.equals(4096, uniques.length);
+}
diff --git a/tests/dart2js/deferred/many_parts/lib_100_000_000_000_0.dart b/tests/dart2js/deferred/many_parts/lib_100_000_000_000_0.dart
new file mode 100644
index 0000000..7436b98
--- /dev/null
+++ b/tests/dart2js/deferred/many_parts/lib_100_000_000_000_0.dart
@@ -0,0 +1,4111 @@
+// Copyright (c) 2020, 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:expect/expect.dart";
+
+import 'libB.dart';
+
+@pragma('dart2js:noInline')
+g_100_000_000_000_0() {
+  Set<String> uniques = {};
+
+  // f_1**_***_***_***_*;
+  f_100_000_000_000_0(uniques, 0);
+  f_100_000_000_000_1(uniques, 0);
+  f_100_000_000_001_0(uniques, 0);
+  f_100_000_000_001_1(uniques, 0);
+  f_100_000_000_010_0(uniques, 0);
+  f_100_000_000_010_1(uniques, 0);
+  f_100_000_000_011_0(uniques, 0);
+  f_100_000_000_011_1(uniques, 0);
+  f_100_000_000_100_0(uniques, 0);
+  f_100_000_000_100_1(uniques, 0);
+  f_100_000_000_101_0(uniques, 0);
+  f_100_000_000_101_1(uniques, 0);
+  f_100_000_000_110_0(uniques, 0);
+  f_100_000_000_110_1(uniques, 0);
+  f_100_000_000_111_0(uniques, 0);
+  f_100_000_000_111_1(uniques, 0);
+  f_100_000_001_000_0(uniques, 0);
+  f_100_000_001_000_1(uniques, 0);
+  f_100_000_001_001_0(uniques, 0);
+  f_100_000_001_001_1(uniques, 0);
+  f_100_000_001_010_0(uniques, 0);
+  f_100_000_001_010_1(uniques, 0);
+  f_100_000_001_011_0(uniques, 0);
+  f_100_000_001_011_1(uniques, 0);
+  f_100_000_001_100_0(uniques, 0);
+  f_100_000_001_100_1(uniques, 0);
+  f_100_000_001_101_0(uniques, 0);
+  f_100_000_001_101_1(uniques, 0);
+  f_100_000_001_110_0(uniques, 0);
+  f_100_000_001_110_1(uniques, 0);
+  f_100_000_001_111_0(uniques, 0);
+  f_100_000_001_111_1(uniques, 0);
+  f_100_000_010_000_0(uniques, 0);
+  f_100_000_010_000_1(uniques, 0);
+  f_100_000_010_001_0(uniques, 0);
+  f_100_000_010_001_1(uniques, 0);
+  f_100_000_010_010_0(uniques, 0);
+  f_100_000_010_010_1(uniques, 0);
+  f_100_000_010_011_0(uniques, 0);
+  f_100_000_010_011_1(uniques, 0);
+  f_100_000_010_100_0(uniques, 0);
+  f_100_000_010_100_1(uniques, 0);
+  f_100_000_010_101_0(uniques, 0);
+  f_100_000_010_101_1(uniques, 0);
+  f_100_000_010_110_0(uniques, 0);
+  f_100_000_010_110_1(uniques, 0);
+  f_100_000_010_111_0(uniques, 0);
+  f_100_000_010_111_1(uniques, 0);
+  f_100_000_011_000_0(uniques, 0);
+  f_100_000_011_000_1(uniques, 0);
+  f_100_000_011_001_0(uniques, 0);
+  f_100_000_011_001_1(uniques, 0);
+  f_100_000_011_010_0(uniques, 0);
+  f_100_000_011_010_1(uniques, 0);
+  f_100_000_011_011_0(uniques, 0);
+  f_100_000_011_011_1(uniques, 0);
+  f_100_000_011_100_0(uniques, 0);
+  f_100_000_011_100_1(uniques, 0);
+  f_100_000_011_101_0(uniques, 0);
+  f_100_000_011_101_1(uniques, 0);
+  f_100_000_011_110_0(uniques, 0);
+  f_100_000_011_110_1(uniques, 0);
+  f_100_000_011_111_0(uniques, 0);
+  f_100_000_011_111_1(uniques, 0);
+  f_100_000_100_000_0(uniques, 0);
+  f_100_000_100_000_1(uniques, 0);
+  f_100_000_100_001_0(uniques, 0);
+  f_100_000_100_001_1(uniques, 0);
+  f_100_000_100_010_0(uniques, 0);
+  f_100_000_100_010_1(uniques, 0);
+  f_100_000_100_011_0(uniques, 0);
+  f_100_000_100_011_1(uniques, 0);
+  f_100_000_100_100_0(uniques, 0);
+  f_100_000_100_100_1(uniques, 0);
+  f_100_000_100_101_0(uniques, 0);
+  f_100_000_100_101_1(uniques, 0);
+  f_100_000_100_110_0(uniques, 0);
+  f_100_000_100_110_1(uniques, 0);
+  f_100_000_100_111_0(uniques, 0);
+  f_100_000_100_111_1(uniques, 0);
+  f_100_000_101_000_0(uniques, 0);
+  f_100_000_101_000_1(uniques, 0);
+  f_100_000_101_001_0(uniques, 0);
+  f_100_000_101_001_1(uniques, 0);
+  f_100_000_101_010_0(uniques, 0);
+  f_100_000_101_010_1(uniques, 0);
+  f_100_000_101_011_0(uniques, 0);
+  f_100_000_101_011_1(uniques, 0);
+  f_100_000_101_100_0(uniques, 0);
+  f_100_000_101_100_1(uniques, 0);
+  f_100_000_101_101_0(uniques, 0);
+  f_100_000_101_101_1(uniques, 0);
+  f_100_000_101_110_0(uniques, 0);
+  f_100_000_101_110_1(uniques, 0);
+  f_100_000_101_111_0(uniques, 0);
+  f_100_000_101_111_1(uniques, 0);
+  f_100_000_110_000_0(uniques, 0);
+  f_100_000_110_000_1(uniques, 0);
+  f_100_000_110_001_0(uniques, 0);
+  f_100_000_110_001_1(uniques, 0);
+  f_100_000_110_010_0(uniques, 0);
+  f_100_000_110_010_1(uniques, 0);
+  f_100_000_110_011_0(uniques, 0);
+  f_100_000_110_011_1(uniques, 0);
+  f_100_000_110_100_0(uniques, 0);
+  f_100_000_110_100_1(uniques, 0);
+  f_100_000_110_101_0(uniques, 0);
+  f_100_000_110_101_1(uniques, 0);
+  f_100_000_110_110_0(uniques, 0);
+  f_100_000_110_110_1(uniques, 0);
+  f_100_000_110_111_0(uniques, 0);
+  f_100_000_110_111_1(uniques, 0);
+  f_100_000_111_000_0(uniques, 0);
+  f_100_000_111_000_1(uniques, 0);
+  f_100_000_111_001_0(uniques, 0);
+  f_100_000_111_001_1(uniques, 0);
+  f_100_000_111_010_0(uniques, 0);
+  f_100_000_111_010_1(uniques, 0);
+  f_100_000_111_011_0(uniques, 0);
+  f_100_000_111_011_1(uniques, 0);
+  f_100_000_111_100_0(uniques, 0);
+  f_100_000_111_100_1(uniques, 0);
+  f_100_000_111_101_0(uniques, 0);
+  f_100_000_111_101_1(uniques, 0);
+  f_100_000_111_110_0(uniques, 0);
+  f_100_000_111_110_1(uniques, 0);
+  f_100_000_111_111_0(uniques, 0);
+  f_100_000_111_111_1(uniques, 0);
+  f_100_001_000_000_0(uniques, 0);
+  f_100_001_000_000_1(uniques, 0);
+  f_100_001_000_001_0(uniques, 0);
+  f_100_001_000_001_1(uniques, 0);
+  f_100_001_000_010_0(uniques, 0);
+  f_100_001_000_010_1(uniques, 0);
+  f_100_001_000_011_0(uniques, 0);
+  f_100_001_000_011_1(uniques, 0);
+  f_100_001_000_100_0(uniques, 0);
+  f_100_001_000_100_1(uniques, 0);
+  f_100_001_000_101_0(uniques, 0);
+  f_100_001_000_101_1(uniques, 0);
+  f_100_001_000_110_0(uniques, 0);
+  f_100_001_000_110_1(uniques, 0);
+  f_100_001_000_111_0(uniques, 0);
+  f_100_001_000_111_1(uniques, 0);
+  f_100_001_001_000_0(uniques, 0);
+  f_100_001_001_000_1(uniques, 0);
+  f_100_001_001_001_0(uniques, 0);
+  f_100_001_001_001_1(uniques, 0);
+  f_100_001_001_010_0(uniques, 0);
+  f_100_001_001_010_1(uniques, 0);
+  f_100_001_001_011_0(uniques, 0);
+  f_100_001_001_011_1(uniques, 0);
+  f_100_001_001_100_0(uniques, 0);
+  f_100_001_001_100_1(uniques, 0);
+  f_100_001_001_101_0(uniques, 0);
+  f_100_001_001_101_1(uniques, 0);
+  f_100_001_001_110_0(uniques, 0);
+  f_100_001_001_110_1(uniques, 0);
+  f_100_001_001_111_0(uniques, 0);
+  f_100_001_001_111_1(uniques, 0);
+  f_100_001_010_000_0(uniques, 0);
+  f_100_001_010_000_1(uniques, 0);
+  f_100_001_010_001_0(uniques, 0);
+  f_100_001_010_001_1(uniques, 0);
+  f_100_001_010_010_0(uniques, 0);
+  f_100_001_010_010_1(uniques, 0);
+  f_100_001_010_011_0(uniques, 0);
+  f_100_001_010_011_1(uniques, 0);
+  f_100_001_010_100_0(uniques, 0);
+  f_100_001_010_100_1(uniques, 0);
+  f_100_001_010_101_0(uniques, 0);
+  f_100_001_010_101_1(uniques, 0);
+  f_100_001_010_110_0(uniques, 0);
+  f_100_001_010_110_1(uniques, 0);
+  f_100_001_010_111_0(uniques, 0);
+  f_100_001_010_111_1(uniques, 0);
+  f_100_001_011_000_0(uniques, 0);
+  f_100_001_011_000_1(uniques, 0);
+  f_100_001_011_001_0(uniques, 0);
+  f_100_001_011_001_1(uniques, 0);
+  f_100_001_011_010_0(uniques, 0);
+  f_100_001_011_010_1(uniques, 0);
+  f_100_001_011_011_0(uniques, 0);
+  f_100_001_011_011_1(uniques, 0);
+  f_100_001_011_100_0(uniques, 0);
+  f_100_001_011_100_1(uniques, 0);
+  f_100_001_011_101_0(uniques, 0);
+  f_100_001_011_101_1(uniques, 0);
+  f_100_001_011_110_0(uniques, 0);
+  f_100_001_011_110_1(uniques, 0);
+  f_100_001_011_111_0(uniques, 0);
+  f_100_001_011_111_1(uniques, 0);
+  f_100_001_100_000_0(uniques, 0);
+  f_100_001_100_000_1(uniques, 0);
+  f_100_001_100_001_0(uniques, 0);
+  f_100_001_100_001_1(uniques, 0);
+  f_100_001_100_010_0(uniques, 0);
+  f_100_001_100_010_1(uniques, 0);
+  f_100_001_100_011_0(uniques, 0);
+  f_100_001_100_011_1(uniques, 0);
+  f_100_001_100_100_0(uniques, 0);
+  f_100_001_100_100_1(uniques, 0);
+  f_100_001_100_101_0(uniques, 0);
+  f_100_001_100_101_1(uniques, 0);
+  f_100_001_100_110_0(uniques, 0);
+  f_100_001_100_110_1(uniques, 0);
+  f_100_001_100_111_0(uniques, 0);
+  f_100_001_100_111_1(uniques, 0);
+  f_100_001_101_000_0(uniques, 0);
+  f_100_001_101_000_1(uniques, 0);
+  f_100_001_101_001_0(uniques, 0);
+  f_100_001_101_001_1(uniques, 0);
+  f_100_001_101_010_0(uniques, 0);
+  f_100_001_101_010_1(uniques, 0);
+  f_100_001_101_011_0(uniques, 0);
+  f_100_001_101_011_1(uniques, 0);
+  f_100_001_101_100_0(uniques, 0);
+  f_100_001_101_100_1(uniques, 0);
+  f_100_001_101_101_0(uniques, 0);
+  f_100_001_101_101_1(uniques, 0);
+  f_100_001_101_110_0(uniques, 0);
+  f_100_001_101_110_1(uniques, 0);
+  f_100_001_101_111_0(uniques, 0);
+  f_100_001_101_111_1(uniques, 0);
+  f_100_001_110_000_0(uniques, 0);
+  f_100_001_110_000_1(uniques, 0);
+  f_100_001_110_001_0(uniques, 0);
+  f_100_001_110_001_1(uniques, 0);
+  f_100_001_110_010_0(uniques, 0);
+  f_100_001_110_010_1(uniques, 0);
+  f_100_001_110_011_0(uniques, 0);
+  f_100_001_110_011_1(uniques, 0);
+  f_100_001_110_100_0(uniques, 0);
+  f_100_001_110_100_1(uniques, 0);
+  f_100_001_110_101_0(uniques, 0);
+  f_100_001_110_101_1(uniques, 0);
+  f_100_001_110_110_0(uniques, 0);
+  f_100_001_110_110_1(uniques, 0);
+  f_100_001_110_111_0(uniques, 0);
+  f_100_001_110_111_1(uniques, 0);
+  f_100_001_111_000_0(uniques, 0);
+  f_100_001_111_000_1(uniques, 0);
+  f_100_001_111_001_0(uniques, 0);
+  f_100_001_111_001_1(uniques, 0);
+  f_100_001_111_010_0(uniques, 0);
+  f_100_001_111_010_1(uniques, 0);
+  f_100_001_111_011_0(uniques, 0);
+  f_100_001_111_011_1(uniques, 0);
+  f_100_001_111_100_0(uniques, 0);
+  f_100_001_111_100_1(uniques, 0);
+  f_100_001_111_101_0(uniques, 0);
+  f_100_001_111_101_1(uniques, 0);
+  f_100_001_111_110_0(uniques, 0);
+  f_100_001_111_110_1(uniques, 0);
+  f_100_001_111_111_0(uniques, 0);
+  f_100_001_111_111_1(uniques, 0);
+  f_100_010_000_000_0(uniques, 0);
+  f_100_010_000_000_1(uniques, 0);
+  f_100_010_000_001_0(uniques, 0);
+  f_100_010_000_001_1(uniques, 0);
+  f_100_010_000_010_0(uniques, 0);
+  f_100_010_000_010_1(uniques, 0);
+  f_100_010_000_011_0(uniques, 0);
+  f_100_010_000_011_1(uniques, 0);
+  f_100_010_000_100_0(uniques, 0);
+  f_100_010_000_100_1(uniques, 0);
+  f_100_010_000_101_0(uniques, 0);
+  f_100_010_000_101_1(uniques, 0);
+  f_100_010_000_110_0(uniques, 0);
+  f_100_010_000_110_1(uniques, 0);
+  f_100_010_000_111_0(uniques, 0);
+  f_100_010_000_111_1(uniques, 0);
+  f_100_010_001_000_0(uniques, 0);
+  f_100_010_001_000_1(uniques, 0);
+  f_100_010_001_001_0(uniques, 0);
+  f_100_010_001_001_1(uniques, 0);
+  f_100_010_001_010_0(uniques, 0);
+  f_100_010_001_010_1(uniques, 0);
+  f_100_010_001_011_0(uniques, 0);
+  f_100_010_001_011_1(uniques, 0);
+  f_100_010_001_100_0(uniques, 0);
+  f_100_010_001_100_1(uniques, 0);
+  f_100_010_001_101_0(uniques, 0);
+  f_100_010_001_101_1(uniques, 0);
+  f_100_010_001_110_0(uniques, 0);
+  f_100_010_001_110_1(uniques, 0);
+  f_100_010_001_111_0(uniques, 0);
+  f_100_010_001_111_1(uniques, 0);
+  f_100_010_010_000_0(uniques, 0);
+  f_100_010_010_000_1(uniques, 0);
+  f_100_010_010_001_0(uniques, 0);
+  f_100_010_010_001_1(uniques, 0);
+  f_100_010_010_010_0(uniques, 0);
+  f_100_010_010_010_1(uniques, 0);
+  f_100_010_010_011_0(uniques, 0);
+  f_100_010_010_011_1(uniques, 0);
+  f_100_010_010_100_0(uniques, 0);
+  f_100_010_010_100_1(uniques, 0);
+  f_100_010_010_101_0(uniques, 0);
+  f_100_010_010_101_1(uniques, 0);
+  f_100_010_010_110_0(uniques, 0);
+  f_100_010_010_110_1(uniques, 0);
+  f_100_010_010_111_0(uniques, 0);
+  f_100_010_010_111_1(uniques, 0);
+  f_100_010_011_000_0(uniques, 0);
+  f_100_010_011_000_1(uniques, 0);
+  f_100_010_011_001_0(uniques, 0);
+  f_100_010_011_001_1(uniques, 0);
+  f_100_010_011_010_0(uniques, 0);
+  f_100_010_011_010_1(uniques, 0);
+  f_100_010_011_011_0(uniques, 0);
+  f_100_010_011_011_1(uniques, 0);
+  f_100_010_011_100_0(uniques, 0);
+  f_100_010_011_100_1(uniques, 0);
+  f_100_010_011_101_0(uniques, 0);
+  f_100_010_011_101_1(uniques, 0);
+  f_100_010_011_110_0(uniques, 0);
+  f_100_010_011_110_1(uniques, 0);
+  f_100_010_011_111_0(uniques, 0);
+  f_100_010_011_111_1(uniques, 0);
+  f_100_010_100_000_0(uniques, 0);
+  f_100_010_100_000_1(uniques, 0);
+  f_100_010_100_001_0(uniques, 0);
+  f_100_010_100_001_1(uniques, 0);
+  f_100_010_100_010_0(uniques, 0);
+  f_100_010_100_010_1(uniques, 0);
+  f_100_010_100_011_0(uniques, 0);
+  f_100_010_100_011_1(uniques, 0);
+  f_100_010_100_100_0(uniques, 0);
+  f_100_010_100_100_1(uniques, 0);
+  f_100_010_100_101_0(uniques, 0);
+  f_100_010_100_101_1(uniques, 0);
+  f_100_010_100_110_0(uniques, 0);
+  f_100_010_100_110_1(uniques, 0);
+  f_100_010_100_111_0(uniques, 0);
+  f_100_010_100_111_1(uniques, 0);
+  f_100_010_101_000_0(uniques, 0);
+  f_100_010_101_000_1(uniques, 0);
+  f_100_010_101_001_0(uniques, 0);
+  f_100_010_101_001_1(uniques, 0);
+  f_100_010_101_010_0(uniques, 0);
+  f_100_010_101_010_1(uniques, 0);
+  f_100_010_101_011_0(uniques, 0);
+  f_100_010_101_011_1(uniques, 0);
+  f_100_010_101_100_0(uniques, 0);
+  f_100_010_101_100_1(uniques, 0);
+  f_100_010_101_101_0(uniques, 0);
+  f_100_010_101_101_1(uniques, 0);
+  f_100_010_101_110_0(uniques, 0);
+  f_100_010_101_110_1(uniques, 0);
+  f_100_010_101_111_0(uniques, 0);
+  f_100_010_101_111_1(uniques, 0);
+  f_100_010_110_000_0(uniques, 0);
+  f_100_010_110_000_1(uniques, 0);
+  f_100_010_110_001_0(uniques, 0);
+  f_100_010_110_001_1(uniques, 0);
+  f_100_010_110_010_0(uniques, 0);
+  f_100_010_110_010_1(uniques, 0);
+  f_100_010_110_011_0(uniques, 0);
+  f_100_010_110_011_1(uniques, 0);
+  f_100_010_110_100_0(uniques, 0);
+  f_100_010_110_100_1(uniques, 0);
+  f_100_010_110_101_0(uniques, 0);
+  f_100_010_110_101_1(uniques, 0);
+  f_100_010_110_110_0(uniques, 0);
+  f_100_010_110_110_1(uniques, 0);
+  f_100_010_110_111_0(uniques, 0);
+  f_100_010_110_111_1(uniques, 0);
+  f_100_010_111_000_0(uniques, 0);
+  f_100_010_111_000_1(uniques, 0);
+  f_100_010_111_001_0(uniques, 0);
+  f_100_010_111_001_1(uniques, 0);
+  f_100_010_111_010_0(uniques, 0);
+  f_100_010_111_010_1(uniques, 0);
+  f_100_010_111_011_0(uniques, 0);
+  f_100_010_111_011_1(uniques, 0);
+  f_100_010_111_100_0(uniques, 0);
+  f_100_010_111_100_1(uniques, 0);
+  f_100_010_111_101_0(uniques, 0);
+  f_100_010_111_101_1(uniques, 0);
+  f_100_010_111_110_0(uniques, 0);
+  f_100_010_111_110_1(uniques, 0);
+  f_100_010_111_111_0(uniques, 0);
+  f_100_010_111_111_1(uniques, 0);
+  f_100_011_000_000_0(uniques, 0);
+  f_100_011_000_000_1(uniques, 0);
+  f_100_011_000_001_0(uniques, 0);
+  f_100_011_000_001_1(uniques, 0);
+  f_100_011_000_010_0(uniques, 0);
+  f_100_011_000_010_1(uniques, 0);
+  f_100_011_000_011_0(uniques, 0);
+  f_100_011_000_011_1(uniques, 0);
+  f_100_011_000_100_0(uniques, 0);
+  f_100_011_000_100_1(uniques, 0);
+  f_100_011_000_101_0(uniques, 0);
+  f_100_011_000_101_1(uniques, 0);
+  f_100_011_000_110_0(uniques, 0);
+  f_100_011_000_110_1(uniques, 0);
+  f_100_011_000_111_0(uniques, 0);
+  f_100_011_000_111_1(uniques, 0);
+  f_100_011_001_000_0(uniques, 0);
+  f_100_011_001_000_1(uniques, 0);
+  f_100_011_001_001_0(uniques, 0);
+  f_100_011_001_001_1(uniques, 0);
+  f_100_011_001_010_0(uniques, 0);
+  f_100_011_001_010_1(uniques, 0);
+  f_100_011_001_011_0(uniques, 0);
+  f_100_011_001_011_1(uniques, 0);
+  f_100_011_001_100_0(uniques, 0);
+  f_100_011_001_100_1(uniques, 0);
+  f_100_011_001_101_0(uniques, 0);
+  f_100_011_001_101_1(uniques, 0);
+  f_100_011_001_110_0(uniques, 0);
+  f_100_011_001_110_1(uniques, 0);
+  f_100_011_001_111_0(uniques, 0);
+  f_100_011_001_111_1(uniques, 0);
+  f_100_011_010_000_0(uniques, 0);
+  f_100_011_010_000_1(uniques, 0);
+  f_100_011_010_001_0(uniques, 0);
+  f_100_011_010_001_1(uniques, 0);
+  f_100_011_010_010_0(uniques, 0);
+  f_100_011_010_010_1(uniques, 0);
+  f_100_011_010_011_0(uniques, 0);
+  f_100_011_010_011_1(uniques, 0);
+  f_100_011_010_100_0(uniques, 0);
+  f_100_011_010_100_1(uniques, 0);
+  f_100_011_010_101_0(uniques, 0);
+  f_100_011_010_101_1(uniques, 0);
+  f_100_011_010_110_0(uniques, 0);
+  f_100_011_010_110_1(uniques, 0);
+  f_100_011_010_111_0(uniques, 0);
+  f_100_011_010_111_1(uniques, 0);
+  f_100_011_011_000_0(uniques, 0);
+  f_100_011_011_000_1(uniques, 0);
+  f_100_011_011_001_0(uniques, 0);
+  f_100_011_011_001_1(uniques, 0);
+  f_100_011_011_010_0(uniques, 0);
+  f_100_011_011_010_1(uniques, 0);
+  f_100_011_011_011_0(uniques, 0);
+  f_100_011_011_011_1(uniques, 0);
+  f_100_011_011_100_0(uniques, 0);
+  f_100_011_011_100_1(uniques, 0);
+  f_100_011_011_101_0(uniques, 0);
+  f_100_011_011_101_1(uniques, 0);
+  f_100_011_011_110_0(uniques, 0);
+  f_100_011_011_110_1(uniques, 0);
+  f_100_011_011_111_0(uniques, 0);
+  f_100_011_011_111_1(uniques, 0);
+  f_100_011_100_000_0(uniques, 0);
+  f_100_011_100_000_1(uniques, 0);
+  f_100_011_100_001_0(uniques, 0);
+  f_100_011_100_001_1(uniques, 0);
+  f_100_011_100_010_0(uniques, 0);
+  f_100_011_100_010_1(uniques, 0);
+  f_100_011_100_011_0(uniques, 0);
+  f_100_011_100_011_1(uniques, 0);
+  f_100_011_100_100_0(uniques, 0);
+  f_100_011_100_100_1(uniques, 0);
+  f_100_011_100_101_0(uniques, 0);
+  f_100_011_100_101_1(uniques, 0);
+  f_100_011_100_110_0(uniques, 0);
+  f_100_011_100_110_1(uniques, 0);
+  f_100_011_100_111_0(uniques, 0);
+  f_100_011_100_111_1(uniques, 0);
+  f_100_011_101_000_0(uniques, 0);
+  f_100_011_101_000_1(uniques, 0);
+  f_100_011_101_001_0(uniques, 0);
+  f_100_011_101_001_1(uniques, 0);
+  f_100_011_101_010_0(uniques, 0);
+  f_100_011_101_010_1(uniques, 0);
+  f_100_011_101_011_0(uniques, 0);
+  f_100_011_101_011_1(uniques, 0);
+  f_100_011_101_100_0(uniques, 0);
+  f_100_011_101_100_1(uniques, 0);
+  f_100_011_101_101_0(uniques, 0);
+  f_100_011_101_101_1(uniques, 0);
+  f_100_011_101_110_0(uniques, 0);
+  f_100_011_101_110_1(uniques, 0);
+  f_100_011_101_111_0(uniques, 0);
+  f_100_011_101_111_1(uniques, 0);
+  f_100_011_110_000_0(uniques, 0);
+  f_100_011_110_000_1(uniques, 0);
+  f_100_011_110_001_0(uniques, 0);
+  f_100_011_110_001_1(uniques, 0);
+  f_100_011_110_010_0(uniques, 0);
+  f_100_011_110_010_1(uniques, 0);
+  f_100_011_110_011_0(uniques, 0);
+  f_100_011_110_011_1(uniques, 0);
+  f_100_011_110_100_0(uniques, 0);
+  f_100_011_110_100_1(uniques, 0);
+  f_100_011_110_101_0(uniques, 0);
+  f_100_011_110_101_1(uniques, 0);
+  f_100_011_110_110_0(uniques, 0);
+  f_100_011_110_110_1(uniques, 0);
+  f_100_011_110_111_0(uniques, 0);
+  f_100_011_110_111_1(uniques, 0);
+  f_100_011_111_000_0(uniques, 0);
+  f_100_011_111_000_1(uniques, 0);
+  f_100_011_111_001_0(uniques, 0);
+  f_100_011_111_001_1(uniques, 0);
+  f_100_011_111_010_0(uniques, 0);
+  f_100_011_111_010_1(uniques, 0);
+  f_100_011_111_011_0(uniques, 0);
+  f_100_011_111_011_1(uniques, 0);
+  f_100_011_111_100_0(uniques, 0);
+  f_100_011_111_100_1(uniques, 0);
+  f_100_011_111_101_0(uniques, 0);
+  f_100_011_111_101_1(uniques, 0);
+  f_100_011_111_110_0(uniques, 0);
+  f_100_011_111_110_1(uniques, 0);
+  f_100_011_111_111_0(uniques, 0);
+  f_100_011_111_111_1(uniques, 0);
+  f_100_100_000_000_0(uniques, 0);
+  f_100_100_000_000_1(uniques, 0);
+  f_100_100_000_001_0(uniques, 0);
+  f_100_100_000_001_1(uniques, 0);
+  f_100_100_000_010_0(uniques, 0);
+  f_100_100_000_010_1(uniques, 0);
+  f_100_100_000_011_0(uniques, 0);
+  f_100_100_000_011_1(uniques, 0);
+  f_100_100_000_100_0(uniques, 0);
+  f_100_100_000_100_1(uniques, 0);
+  f_100_100_000_101_0(uniques, 0);
+  f_100_100_000_101_1(uniques, 0);
+  f_100_100_000_110_0(uniques, 0);
+  f_100_100_000_110_1(uniques, 0);
+  f_100_100_000_111_0(uniques, 0);
+  f_100_100_000_111_1(uniques, 0);
+  f_100_100_001_000_0(uniques, 0);
+  f_100_100_001_000_1(uniques, 0);
+  f_100_100_001_001_0(uniques, 0);
+  f_100_100_001_001_1(uniques, 0);
+  f_100_100_001_010_0(uniques, 0);
+  f_100_100_001_010_1(uniques, 0);
+  f_100_100_001_011_0(uniques, 0);
+  f_100_100_001_011_1(uniques, 0);
+  f_100_100_001_100_0(uniques, 0);
+  f_100_100_001_100_1(uniques, 0);
+  f_100_100_001_101_0(uniques, 0);
+  f_100_100_001_101_1(uniques, 0);
+  f_100_100_001_110_0(uniques, 0);
+  f_100_100_001_110_1(uniques, 0);
+  f_100_100_001_111_0(uniques, 0);
+  f_100_100_001_111_1(uniques, 0);
+  f_100_100_010_000_0(uniques, 0);
+  f_100_100_010_000_1(uniques, 0);
+  f_100_100_010_001_0(uniques, 0);
+  f_100_100_010_001_1(uniques, 0);
+  f_100_100_010_010_0(uniques, 0);
+  f_100_100_010_010_1(uniques, 0);
+  f_100_100_010_011_0(uniques, 0);
+  f_100_100_010_011_1(uniques, 0);
+  f_100_100_010_100_0(uniques, 0);
+  f_100_100_010_100_1(uniques, 0);
+  f_100_100_010_101_0(uniques, 0);
+  f_100_100_010_101_1(uniques, 0);
+  f_100_100_010_110_0(uniques, 0);
+  f_100_100_010_110_1(uniques, 0);
+  f_100_100_010_111_0(uniques, 0);
+  f_100_100_010_111_1(uniques, 0);
+  f_100_100_011_000_0(uniques, 0);
+  f_100_100_011_000_1(uniques, 0);
+  f_100_100_011_001_0(uniques, 0);
+  f_100_100_011_001_1(uniques, 0);
+  f_100_100_011_010_0(uniques, 0);
+  f_100_100_011_010_1(uniques, 0);
+  f_100_100_011_011_0(uniques, 0);
+  f_100_100_011_011_1(uniques, 0);
+  f_100_100_011_100_0(uniques, 0);
+  f_100_100_011_100_1(uniques, 0);
+  f_100_100_011_101_0(uniques, 0);
+  f_100_100_011_101_1(uniques, 0);
+  f_100_100_011_110_0(uniques, 0);
+  f_100_100_011_110_1(uniques, 0);
+  f_100_100_011_111_0(uniques, 0);
+  f_100_100_011_111_1(uniques, 0);
+  f_100_100_100_000_0(uniques, 0);
+  f_100_100_100_000_1(uniques, 0);
+  f_100_100_100_001_0(uniques, 0);
+  f_100_100_100_001_1(uniques, 0);
+  f_100_100_100_010_0(uniques, 0);
+  f_100_100_100_010_1(uniques, 0);
+  f_100_100_100_011_0(uniques, 0);
+  f_100_100_100_011_1(uniques, 0);
+  f_100_100_100_100_0(uniques, 0);
+  f_100_100_100_100_1(uniques, 0);
+  f_100_100_100_101_0(uniques, 0);
+  f_100_100_100_101_1(uniques, 0);
+  f_100_100_100_110_0(uniques, 0);
+  f_100_100_100_110_1(uniques, 0);
+  f_100_100_100_111_0(uniques, 0);
+  f_100_100_100_111_1(uniques, 0);
+  f_100_100_101_000_0(uniques, 0);
+  f_100_100_101_000_1(uniques, 0);
+  f_100_100_101_001_0(uniques, 0);
+  f_100_100_101_001_1(uniques, 0);
+  f_100_100_101_010_0(uniques, 0);
+  f_100_100_101_010_1(uniques, 0);
+  f_100_100_101_011_0(uniques, 0);
+  f_100_100_101_011_1(uniques, 0);
+  f_100_100_101_100_0(uniques, 0);
+  f_100_100_101_100_1(uniques, 0);
+  f_100_100_101_101_0(uniques, 0);
+  f_100_100_101_101_1(uniques, 0);
+  f_100_100_101_110_0(uniques, 0);
+  f_100_100_101_110_1(uniques, 0);
+  f_100_100_101_111_0(uniques, 0);
+  f_100_100_101_111_1(uniques, 0);
+  f_100_100_110_000_0(uniques, 0);
+  f_100_100_110_000_1(uniques, 0);
+  f_100_100_110_001_0(uniques, 0);
+  f_100_100_110_001_1(uniques, 0);
+  f_100_100_110_010_0(uniques, 0);
+  f_100_100_110_010_1(uniques, 0);
+  f_100_100_110_011_0(uniques, 0);
+  f_100_100_110_011_1(uniques, 0);
+  f_100_100_110_100_0(uniques, 0);
+  f_100_100_110_100_1(uniques, 0);
+  f_100_100_110_101_0(uniques, 0);
+  f_100_100_110_101_1(uniques, 0);
+  f_100_100_110_110_0(uniques, 0);
+  f_100_100_110_110_1(uniques, 0);
+  f_100_100_110_111_0(uniques, 0);
+  f_100_100_110_111_1(uniques, 0);
+  f_100_100_111_000_0(uniques, 0);
+  f_100_100_111_000_1(uniques, 0);
+  f_100_100_111_001_0(uniques, 0);
+  f_100_100_111_001_1(uniques, 0);
+  f_100_100_111_010_0(uniques, 0);
+  f_100_100_111_010_1(uniques, 0);
+  f_100_100_111_011_0(uniques, 0);
+  f_100_100_111_011_1(uniques, 0);
+  f_100_100_111_100_0(uniques, 0);
+  f_100_100_111_100_1(uniques, 0);
+  f_100_100_111_101_0(uniques, 0);
+  f_100_100_111_101_1(uniques, 0);
+  f_100_100_111_110_0(uniques, 0);
+  f_100_100_111_110_1(uniques, 0);
+  f_100_100_111_111_0(uniques, 0);
+  f_100_100_111_111_1(uniques, 0);
+  f_100_101_000_000_0(uniques, 0);
+  f_100_101_000_000_1(uniques, 0);
+  f_100_101_000_001_0(uniques, 0);
+  f_100_101_000_001_1(uniques, 0);
+  f_100_101_000_010_0(uniques, 0);
+  f_100_101_000_010_1(uniques, 0);
+  f_100_101_000_011_0(uniques, 0);
+  f_100_101_000_011_1(uniques, 0);
+  f_100_101_000_100_0(uniques, 0);
+  f_100_101_000_100_1(uniques, 0);
+  f_100_101_000_101_0(uniques, 0);
+  f_100_101_000_101_1(uniques, 0);
+  f_100_101_000_110_0(uniques, 0);
+  f_100_101_000_110_1(uniques, 0);
+  f_100_101_000_111_0(uniques, 0);
+  f_100_101_000_111_1(uniques, 0);
+  f_100_101_001_000_0(uniques, 0);
+  f_100_101_001_000_1(uniques, 0);
+  f_100_101_001_001_0(uniques, 0);
+  f_100_101_001_001_1(uniques, 0);
+  f_100_101_001_010_0(uniques, 0);
+  f_100_101_001_010_1(uniques, 0);
+  f_100_101_001_011_0(uniques, 0);
+  f_100_101_001_011_1(uniques, 0);
+  f_100_101_001_100_0(uniques, 0);
+  f_100_101_001_100_1(uniques, 0);
+  f_100_101_001_101_0(uniques, 0);
+  f_100_101_001_101_1(uniques, 0);
+  f_100_101_001_110_0(uniques, 0);
+  f_100_101_001_110_1(uniques, 0);
+  f_100_101_001_111_0(uniques, 0);
+  f_100_101_001_111_1(uniques, 0);
+  f_100_101_010_000_0(uniques, 0);
+  f_100_101_010_000_1(uniques, 0);
+  f_100_101_010_001_0(uniques, 0);
+  f_100_101_010_001_1(uniques, 0);
+  f_100_101_010_010_0(uniques, 0);
+  f_100_101_010_010_1(uniques, 0);
+  f_100_101_010_011_0(uniques, 0);
+  f_100_101_010_011_1(uniques, 0);
+  f_100_101_010_100_0(uniques, 0);
+  f_100_101_010_100_1(uniques, 0);
+  f_100_101_010_101_0(uniques, 0);
+  f_100_101_010_101_1(uniques, 0);
+  f_100_101_010_110_0(uniques, 0);
+  f_100_101_010_110_1(uniques, 0);
+  f_100_101_010_111_0(uniques, 0);
+  f_100_101_010_111_1(uniques, 0);
+  f_100_101_011_000_0(uniques, 0);
+  f_100_101_011_000_1(uniques, 0);
+  f_100_101_011_001_0(uniques, 0);
+  f_100_101_011_001_1(uniques, 0);
+  f_100_101_011_010_0(uniques, 0);
+  f_100_101_011_010_1(uniques, 0);
+  f_100_101_011_011_0(uniques, 0);
+  f_100_101_011_011_1(uniques, 0);
+  f_100_101_011_100_0(uniques, 0);
+  f_100_101_011_100_1(uniques, 0);
+  f_100_101_011_101_0(uniques, 0);
+  f_100_101_011_101_1(uniques, 0);
+  f_100_101_011_110_0(uniques, 0);
+  f_100_101_011_110_1(uniques, 0);
+  f_100_101_011_111_0(uniques, 0);
+  f_100_101_011_111_1(uniques, 0);
+  f_100_101_100_000_0(uniques, 0);
+  f_100_101_100_000_1(uniques, 0);
+  f_100_101_100_001_0(uniques, 0);
+  f_100_101_100_001_1(uniques, 0);
+  f_100_101_100_010_0(uniques, 0);
+  f_100_101_100_010_1(uniques, 0);
+  f_100_101_100_011_0(uniques, 0);
+  f_100_101_100_011_1(uniques, 0);
+  f_100_101_100_100_0(uniques, 0);
+  f_100_101_100_100_1(uniques, 0);
+  f_100_101_100_101_0(uniques, 0);
+  f_100_101_100_101_1(uniques, 0);
+  f_100_101_100_110_0(uniques, 0);
+  f_100_101_100_110_1(uniques, 0);
+  f_100_101_100_111_0(uniques, 0);
+  f_100_101_100_111_1(uniques, 0);
+  f_100_101_101_000_0(uniques, 0);
+  f_100_101_101_000_1(uniques, 0);
+  f_100_101_101_001_0(uniques, 0);
+  f_100_101_101_001_1(uniques, 0);
+  f_100_101_101_010_0(uniques, 0);
+  f_100_101_101_010_1(uniques, 0);
+  f_100_101_101_011_0(uniques, 0);
+  f_100_101_101_011_1(uniques, 0);
+  f_100_101_101_100_0(uniques, 0);
+  f_100_101_101_100_1(uniques, 0);
+  f_100_101_101_101_0(uniques, 0);
+  f_100_101_101_101_1(uniques, 0);
+  f_100_101_101_110_0(uniques, 0);
+  f_100_101_101_110_1(uniques, 0);
+  f_100_101_101_111_0(uniques, 0);
+  f_100_101_101_111_1(uniques, 0);
+  f_100_101_110_000_0(uniques, 0);
+  f_100_101_110_000_1(uniques, 0);
+  f_100_101_110_001_0(uniques, 0);
+  f_100_101_110_001_1(uniques, 0);
+  f_100_101_110_010_0(uniques, 0);
+  f_100_101_110_010_1(uniques, 0);
+  f_100_101_110_011_0(uniques, 0);
+  f_100_101_110_011_1(uniques, 0);
+  f_100_101_110_100_0(uniques, 0);
+  f_100_101_110_100_1(uniques, 0);
+  f_100_101_110_101_0(uniques, 0);
+  f_100_101_110_101_1(uniques, 0);
+  f_100_101_110_110_0(uniques, 0);
+  f_100_101_110_110_1(uniques, 0);
+  f_100_101_110_111_0(uniques, 0);
+  f_100_101_110_111_1(uniques, 0);
+  f_100_101_111_000_0(uniques, 0);
+  f_100_101_111_000_1(uniques, 0);
+  f_100_101_111_001_0(uniques, 0);
+  f_100_101_111_001_1(uniques, 0);
+  f_100_101_111_010_0(uniques, 0);
+  f_100_101_111_010_1(uniques, 0);
+  f_100_101_111_011_0(uniques, 0);
+  f_100_101_111_011_1(uniques, 0);
+  f_100_101_111_100_0(uniques, 0);
+  f_100_101_111_100_1(uniques, 0);
+  f_100_101_111_101_0(uniques, 0);
+  f_100_101_111_101_1(uniques, 0);
+  f_100_101_111_110_0(uniques, 0);
+  f_100_101_111_110_1(uniques, 0);
+  f_100_101_111_111_0(uniques, 0);
+  f_100_101_111_111_1(uniques, 0);
+  f_100_110_000_000_0(uniques, 0);
+  f_100_110_000_000_1(uniques, 0);
+  f_100_110_000_001_0(uniques, 0);
+  f_100_110_000_001_1(uniques, 0);
+  f_100_110_000_010_0(uniques, 0);
+  f_100_110_000_010_1(uniques, 0);
+  f_100_110_000_011_0(uniques, 0);
+  f_100_110_000_011_1(uniques, 0);
+  f_100_110_000_100_0(uniques, 0);
+  f_100_110_000_100_1(uniques, 0);
+  f_100_110_000_101_0(uniques, 0);
+  f_100_110_000_101_1(uniques, 0);
+  f_100_110_000_110_0(uniques, 0);
+  f_100_110_000_110_1(uniques, 0);
+  f_100_110_000_111_0(uniques, 0);
+  f_100_110_000_111_1(uniques, 0);
+  f_100_110_001_000_0(uniques, 0);
+  f_100_110_001_000_1(uniques, 0);
+  f_100_110_001_001_0(uniques, 0);
+  f_100_110_001_001_1(uniques, 0);
+  f_100_110_001_010_0(uniques, 0);
+  f_100_110_001_010_1(uniques, 0);
+  f_100_110_001_011_0(uniques, 0);
+  f_100_110_001_011_1(uniques, 0);
+  f_100_110_001_100_0(uniques, 0);
+  f_100_110_001_100_1(uniques, 0);
+  f_100_110_001_101_0(uniques, 0);
+  f_100_110_001_101_1(uniques, 0);
+  f_100_110_001_110_0(uniques, 0);
+  f_100_110_001_110_1(uniques, 0);
+  f_100_110_001_111_0(uniques, 0);
+  f_100_110_001_111_1(uniques, 0);
+  f_100_110_010_000_0(uniques, 0);
+  f_100_110_010_000_1(uniques, 0);
+  f_100_110_010_001_0(uniques, 0);
+  f_100_110_010_001_1(uniques, 0);
+  f_100_110_010_010_0(uniques, 0);
+  f_100_110_010_010_1(uniques, 0);
+  f_100_110_010_011_0(uniques, 0);
+  f_100_110_010_011_1(uniques, 0);
+  f_100_110_010_100_0(uniques, 0);
+  f_100_110_010_100_1(uniques, 0);
+  f_100_110_010_101_0(uniques, 0);
+  f_100_110_010_101_1(uniques, 0);
+  f_100_110_010_110_0(uniques, 0);
+  f_100_110_010_110_1(uniques, 0);
+  f_100_110_010_111_0(uniques, 0);
+  f_100_110_010_111_1(uniques, 0);
+  f_100_110_011_000_0(uniques, 0);
+  f_100_110_011_000_1(uniques, 0);
+  f_100_110_011_001_0(uniques, 0);
+  f_100_110_011_001_1(uniques, 0);
+  f_100_110_011_010_0(uniques, 0);
+  f_100_110_011_010_1(uniques, 0);
+  f_100_110_011_011_0(uniques, 0);
+  f_100_110_011_011_1(uniques, 0);
+  f_100_110_011_100_0(uniques, 0);
+  f_100_110_011_100_1(uniques, 0);
+  f_100_110_011_101_0(uniques, 0);
+  f_100_110_011_101_1(uniques, 0);
+  f_100_110_011_110_0(uniques, 0);
+  f_100_110_011_110_1(uniques, 0);
+  f_100_110_011_111_0(uniques, 0);
+  f_100_110_011_111_1(uniques, 0);
+  f_100_110_100_000_0(uniques, 0);
+  f_100_110_100_000_1(uniques, 0);
+  f_100_110_100_001_0(uniques, 0);
+  f_100_110_100_001_1(uniques, 0);
+  f_100_110_100_010_0(uniques, 0);
+  f_100_110_100_010_1(uniques, 0);
+  f_100_110_100_011_0(uniques, 0);
+  f_100_110_100_011_1(uniques, 0);
+  f_100_110_100_100_0(uniques, 0);
+  f_100_110_100_100_1(uniques, 0);
+  f_100_110_100_101_0(uniques, 0);
+  f_100_110_100_101_1(uniques, 0);
+  f_100_110_100_110_0(uniques, 0);
+  f_100_110_100_110_1(uniques, 0);
+  f_100_110_100_111_0(uniques, 0);
+  f_100_110_100_111_1(uniques, 0);
+  f_100_110_101_000_0(uniques, 0);
+  f_100_110_101_000_1(uniques, 0);
+  f_100_110_101_001_0(uniques, 0);
+  f_100_110_101_001_1(uniques, 0);
+  f_100_110_101_010_0(uniques, 0);
+  f_100_110_101_010_1(uniques, 0);
+  f_100_110_101_011_0(uniques, 0);
+  f_100_110_101_011_1(uniques, 0);
+  f_100_110_101_100_0(uniques, 0);
+  f_100_110_101_100_1(uniques, 0);
+  f_100_110_101_101_0(uniques, 0);
+  f_100_110_101_101_1(uniques, 0);
+  f_100_110_101_110_0(uniques, 0);
+  f_100_110_101_110_1(uniques, 0);
+  f_100_110_101_111_0(uniques, 0);
+  f_100_110_101_111_1(uniques, 0);
+  f_100_110_110_000_0(uniques, 0);
+  f_100_110_110_000_1(uniques, 0);
+  f_100_110_110_001_0(uniques, 0);
+  f_100_110_110_001_1(uniques, 0);
+  f_100_110_110_010_0(uniques, 0);
+  f_100_110_110_010_1(uniques, 0);
+  f_100_110_110_011_0(uniques, 0);
+  f_100_110_110_011_1(uniques, 0);
+  f_100_110_110_100_0(uniques, 0);
+  f_100_110_110_100_1(uniques, 0);
+  f_100_110_110_101_0(uniques, 0);
+  f_100_110_110_101_1(uniques, 0);
+  f_100_110_110_110_0(uniques, 0);
+  f_100_110_110_110_1(uniques, 0);
+  f_100_110_110_111_0(uniques, 0);
+  f_100_110_110_111_1(uniques, 0);
+  f_100_110_111_000_0(uniques, 0);
+  f_100_110_111_000_1(uniques, 0);
+  f_100_110_111_001_0(uniques, 0);
+  f_100_110_111_001_1(uniques, 0);
+  f_100_110_111_010_0(uniques, 0);
+  f_100_110_111_010_1(uniques, 0);
+  f_100_110_111_011_0(uniques, 0);
+  f_100_110_111_011_1(uniques, 0);
+  f_100_110_111_100_0(uniques, 0);
+  f_100_110_111_100_1(uniques, 0);
+  f_100_110_111_101_0(uniques, 0);
+  f_100_110_111_101_1(uniques, 0);
+  f_100_110_111_110_0(uniques, 0);
+  f_100_110_111_110_1(uniques, 0);
+  f_100_110_111_111_0(uniques, 0);
+  f_100_110_111_111_1(uniques, 0);
+  f_100_111_000_000_0(uniques, 0);
+  f_100_111_000_000_1(uniques, 0);
+  f_100_111_000_001_0(uniques, 0);
+  f_100_111_000_001_1(uniques, 0);
+  f_100_111_000_010_0(uniques, 0);
+  f_100_111_000_010_1(uniques, 0);
+  f_100_111_000_011_0(uniques, 0);
+  f_100_111_000_011_1(uniques, 0);
+  f_100_111_000_100_0(uniques, 0);
+  f_100_111_000_100_1(uniques, 0);
+  f_100_111_000_101_0(uniques, 0);
+  f_100_111_000_101_1(uniques, 0);
+  f_100_111_000_110_0(uniques, 0);
+  f_100_111_000_110_1(uniques, 0);
+  f_100_111_000_111_0(uniques, 0);
+  f_100_111_000_111_1(uniques, 0);
+  f_100_111_001_000_0(uniques, 0);
+  f_100_111_001_000_1(uniques, 0);
+  f_100_111_001_001_0(uniques, 0);
+  f_100_111_001_001_1(uniques, 0);
+  f_100_111_001_010_0(uniques, 0);
+  f_100_111_001_010_1(uniques, 0);
+  f_100_111_001_011_0(uniques, 0);
+  f_100_111_001_011_1(uniques, 0);
+  f_100_111_001_100_0(uniques, 0);
+  f_100_111_001_100_1(uniques, 0);
+  f_100_111_001_101_0(uniques, 0);
+  f_100_111_001_101_1(uniques, 0);
+  f_100_111_001_110_0(uniques, 0);
+  f_100_111_001_110_1(uniques, 0);
+  f_100_111_001_111_0(uniques, 0);
+  f_100_111_001_111_1(uniques, 0);
+  f_100_111_010_000_0(uniques, 0);
+  f_100_111_010_000_1(uniques, 0);
+  f_100_111_010_001_0(uniques, 0);
+  f_100_111_010_001_1(uniques, 0);
+  f_100_111_010_010_0(uniques, 0);
+  f_100_111_010_010_1(uniques, 0);
+  f_100_111_010_011_0(uniques, 0);
+  f_100_111_010_011_1(uniques, 0);
+  f_100_111_010_100_0(uniques, 0);
+  f_100_111_010_100_1(uniques, 0);
+  f_100_111_010_101_0(uniques, 0);
+  f_100_111_010_101_1(uniques, 0);
+  f_100_111_010_110_0(uniques, 0);
+  f_100_111_010_110_1(uniques, 0);
+  f_100_111_010_111_0(uniques, 0);
+  f_100_111_010_111_1(uniques, 0);
+  f_100_111_011_000_0(uniques, 0);
+  f_100_111_011_000_1(uniques, 0);
+  f_100_111_011_001_0(uniques, 0);
+  f_100_111_011_001_1(uniques, 0);
+  f_100_111_011_010_0(uniques, 0);
+  f_100_111_011_010_1(uniques, 0);
+  f_100_111_011_011_0(uniques, 0);
+  f_100_111_011_011_1(uniques, 0);
+  f_100_111_011_100_0(uniques, 0);
+  f_100_111_011_100_1(uniques, 0);
+  f_100_111_011_101_0(uniques, 0);
+  f_100_111_011_101_1(uniques, 0);
+  f_100_111_011_110_0(uniques, 0);
+  f_100_111_011_110_1(uniques, 0);
+  f_100_111_011_111_0(uniques, 0);
+  f_100_111_011_111_1(uniques, 0);
+  f_100_111_100_000_0(uniques, 0);
+  f_100_111_100_000_1(uniques, 0);
+  f_100_111_100_001_0(uniques, 0);
+  f_100_111_100_001_1(uniques, 0);
+  f_100_111_100_010_0(uniques, 0);
+  f_100_111_100_010_1(uniques, 0);
+  f_100_111_100_011_0(uniques, 0);
+  f_100_111_100_011_1(uniques, 0);
+  f_100_111_100_100_0(uniques, 0);
+  f_100_111_100_100_1(uniques, 0);
+  f_100_111_100_101_0(uniques, 0);
+  f_100_111_100_101_1(uniques, 0);
+  f_100_111_100_110_0(uniques, 0);
+  f_100_111_100_110_1(uniques, 0);
+  f_100_111_100_111_0(uniques, 0);
+  f_100_111_100_111_1(uniques, 0);
+  f_100_111_101_000_0(uniques, 0);
+  f_100_111_101_000_1(uniques, 0);
+  f_100_111_101_001_0(uniques, 0);
+  f_100_111_101_001_1(uniques, 0);
+  f_100_111_101_010_0(uniques, 0);
+  f_100_111_101_010_1(uniques, 0);
+  f_100_111_101_011_0(uniques, 0);
+  f_100_111_101_011_1(uniques, 0);
+  f_100_111_101_100_0(uniques, 0);
+  f_100_111_101_100_1(uniques, 0);
+  f_100_111_101_101_0(uniques, 0);
+  f_100_111_101_101_1(uniques, 0);
+  f_100_111_101_110_0(uniques, 0);
+  f_100_111_101_110_1(uniques, 0);
+  f_100_111_101_111_0(uniques, 0);
+  f_100_111_101_111_1(uniques, 0);
+  f_100_111_110_000_0(uniques, 0);
+  f_100_111_110_000_1(uniques, 0);
+  f_100_111_110_001_0(uniques, 0);
+  f_100_111_110_001_1(uniques, 0);
+  f_100_111_110_010_0(uniques, 0);
+  f_100_111_110_010_1(uniques, 0);
+  f_100_111_110_011_0(uniques, 0);
+  f_100_111_110_011_1(uniques, 0);
+  f_100_111_110_100_0(uniques, 0);
+  f_100_111_110_100_1(uniques, 0);
+  f_100_111_110_101_0(uniques, 0);
+  f_100_111_110_101_1(uniques, 0);
+  f_100_111_110_110_0(uniques, 0);
+  f_100_111_110_110_1(uniques, 0);
+  f_100_111_110_111_0(uniques, 0);
+  f_100_111_110_111_1(uniques, 0);
+  f_100_111_111_000_0(uniques, 0);
+  f_100_111_111_000_1(uniques, 0);
+  f_100_111_111_001_0(uniques, 0);
+  f_100_111_111_001_1(uniques, 0);
+  f_100_111_111_010_0(uniques, 0);
+  f_100_111_111_010_1(uniques, 0);
+  f_100_111_111_011_0(uniques, 0);
+  f_100_111_111_011_1(uniques, 0);
+  f_100_111_111_100_0(uniques, 0);
+  f_100_111_111_100_1(uniques, 0);
+  f_100_111_111_101_0(uniques, 0);
+  f_100_111_111_101_1(uniques, 0);
+  f_100_111_111_110_0(uniques, 0);
+  f_100_111_111_110_1(uniques, 0);
+  f_100_111_111_111_0(uniques, 0);
+  f_100_111_111_111_1(uniques, 0);
+  f_101_000_000_000_0(uniques, 0);
+  f_101_000_000_000_1(uniques, 0);
+  f_101_000_000_001_0(uniques, 0);
+  f_101_000_000_001_1(uniques, 0);
+  f_101_000_000_010_0(uniques, 0);
+  f_101_000_000_010_1(uniques, 0);
+  f_101_000_000_011_0(uniques, 0);
+  f_101_000_000_011_1(uniques, 0);
+  f_101_000_000_100_0(uniques, 0);
+  f_101_000_000_100_1(uniques, 0);
+  f_101_000_000_101_0(uniques, 0);
+  f_101_000_000_101_1(uniques, 0);
+  f_101_000_000_110_0(uniques, 0);
+  f_101_000_000_110_1(uniques, 0);
+  f_101_000_000_111_0(uniques, 0);
+  f_101_000_000_111_1(uniques, 0);
+  f_101_000_001_000_0(uniques, 0);
+  f_101_000_001_000_1(uniques, 0);
+  f_101_000_001_001_0(uniques, 0);
+  f_101_000_001_001_1(uniques, 0);
+  f_101_000_001_010_0(uniques, 0);
+  f_101_000_001_010_1(uniques, 0);
+  f_101_000_001_011_0(uniques, 0);
+  f_101_000_001_011_1(uniques, 0);
+  f_101_000_001_100_0(uniques, 0);
+  f_101_000_001_100_1(uniques, 0);
+  f_101_000_001_101_0(uniques, 0);
+  f_101_000_001_101_1(uniques, 0);
+  f_101_000_001_110_0(uniques, 0);
+  f_101_000_001_110_1(uniques, 0);
+  f_101_000_001_111_0(uniques, 0);
+  f_101_000_001_111_1(uniques, 0);
+  f_101_000_010_000_0(uniques, 0);
+  f_101_000_010_000_1(uniques, 0);
+  f_101_000_010_001_0(uniques, 0);
+  f_101_000_010_001_1(uniques, 0);
+  f_101_000_010_010_0(uniques, 0);
+  f_101_000_010_010_1(uniques, 0);
+  f_101_000_010_011_0(uniques, 0);
+  f_101_000_010_011_1(uniques, 0);
+  f_101_000_010_100_0(uniques, 0);
+  f_101_000_010_100_1(uniques, 0);
+  f_101_000_010_101_0(uniques, 0);
+  f_101_000_010_101_1(uniques, 0);
+  f_101_000_010_110_0(uniques, 0);
+  f_101_000_010_110_1(uniques, 0);
+  f_101_000_010_111_0(uniques, 0);
+  f_101_000_010_111_1(uniques, 0);
+  f_101_000_011_000_0(uniques, 0);
+  f_101_000_011_000_1(uniques, 0);
+  f_101_000_011_001_0(uniques, 0);
+  f_101_000_011_001_1(uniques, 0);
+  f_101_000_011_010_0(uniques, 0);
+  f_101_000_011_010_1(uniques, 0);
+  f_101_000_011_011_0(uniques, 0);
+  f_101_000_011_011_1(uniques, 0);
+  f_101_000_011_100_0(uniques, 0);
+  f_101_000_011_100_1(uniques, 0);
+  f_101_000_011_101_0(uniques, 0);
+  f_101_000_011_101_1(uniques, 0);
+  f_101_000_011_110_0(uniques, 0);
+  f_101_000_011_110_1(uniques, 0);
+  f_101_000_011_111_0(uniques, 0);
+  f_101_000_011_111_1(uniques, 0);
+  f_101_000_100_000_0(uniques, 0);
+  f_101_000_100_000_1(uniques, 0);
+  f_101_000_100_001_0(uniques, 0);
+  f_101_000_100_001_1(uniques, 0);
+  f_101_000_100_010_0(uniques, 0);
+  f_101_000_100_010_1(uniques, 0);
+  f_101_000_100_011_0(uniques, 0);
+  f_101_000_100_011_1(uniques, 0);
+  f_101_000_100_100_0(uniques, 0);
+  f_101_000_100_100_1(uniques, 0);
+  f_101_000_100_101_0(uniques, 0);
+  f_101_000_100_101_1(uniques, 0);
+  f_101_000_100_110_0(uniques, 0);
+  f_101_000_100_110_1(uniques, 0);
+  f_101_000_100_111_0(uniques, 0);
+  f_101_000_100_111_1(uniques, 0);
+  f_101_000_101_000_0(uniques, 0);
+  f_101_000_101_000_1(uniques, 0);
+  f_101_000_101_001_0(uniques, 0);
+  f_101_000_101_001_1(uniques, 0);
+  f_101_000_101_010_0(uniques, 0);
+  f_101_000_101_010_1(uniques, 0);
+  f_101_000_101_011_0(uniques, 0);
+  f_101_000_101_011_1(uniques, 0);
+  f_101_000_101_100_0(uniques, 0);
+  f_101_000_101_100_1(uniques, 0);
+  f_101_000_101_101_0(uniques, 0);
+  f_101_000_101_101_1(uniques, 0);
+  f_101_000_101_110_0(uniques, 0);
+  f_101_000_101_110_1(uniques, 0);
+  f_101_000_101_111_0(uniques, 0);
+  f_101_000_101_111_1(uniques, 0);
+  f_101_000_110_000_0(uniques, 0);
+  f_101_000_110_000_1(uniques, 0);
+  f_101_000_110_001_0(uniques, 0);
+  f_101_000_110_001_1(uniques, 0);
+  f_101_000_110_010_0(uniques, 0);
+  f_101_000_110_010_1(uniques, 0);
+  f_101_000_110_011_0(uniques, 0);
+  f_101_000_110_011_1(uniques, 0);
+  f_101_000_110_100_0(uniques, 0);
+  f_101_000_110_100_1(uniques, 0);
+  f_101_000_110_101_0(uniques, 0);
+  f_101_000_110_101_1(uniques, 0);
+  f_101_000_110_110_0(uniques, 0);
+  f_101_000_110_110_1(uniques, 0);
+  f_101_000_110_111_0(uniques, 0);
+  f_101_000_110_111_1(uniques, 0);
+  f_101_000_111_000_0(uniques, 0);
+  f_101_000_111_000_1(uniques, 0);
+  f_101_000_111_001_0(uniques, 0);
+  f_101_000_111_001_1(uniques, 0);
+  f_101_000_111_010_0(uniques, 0);
+  f_101_000_111_010_1(uniques, 0);
+  f_101_000_111_011_0(uniques, 0);
+  f_101_000_111_011_1(uniques, 0);
+  f_101_000_111_100_0(uniques, 0);
+  f_101_000_111_100_1(uniques, 0);
+  f_101_000_111_101_0(uniques, 0);
+  f_101_000_111_101_1(uniques, 0);
+  f_101_000_111_110_0(uniques, 0);
+  f_101_000_111_110_1(uniques, 0);
+  f_101_000_111_111_0(uniques, 0);
+  f_101_000_111_111_1(uniques, 0);
+  f_101_001_000_000_0(uniques, 0);
+  f_101_001_000_000_1(uniques, 0);
+  f_101_001_000_001_0(uniques, 0);
+  f_101_001_000_001_1(uniques, 0);
+  f_101_001_000_010_0(uniques, 0);
+  f_101_001_000_010_1(uniques, 0);
+  f_101_001_000_011_0(uniques, 0);
+  f_101_001_000_011_1(uniques, 0);
+  f_101_001_000_100_0(uniques, 0);
+  f_101_001_000_100_1(uniques, 0);
+  f_101_001_000_101_0(uniques, 0);
+  f_101_001_000_101_1(uniques, 0);
+  f_101_001_000_110_0(uniques, 0);
+  f_101_001_000_110_1(uniques, 0);
+  f_101_001_000_111_0(uniques, 0);
+  f_101_001_000_111_1(uniques, 0);
+  f_101_001_001_000_0(uniques, 0);
+  f_101_001_001_000_1(uniques, 0);
+  f_101_001_001_001_0(uniques, 0);
+  f_101_001_001_001_1(uniques, 0);
+  f_101_001_001_010_0(uniques, 0);
+  f_101_001_001_010_1(uniques, 0);
+  f_101_001_001_011_0(uniques, 0);
+  f_101_001_001_011_1(uniques, 0);
+  f_101_001_001_100_0(uniques, 0);
+  f_101_001_001_100_1(uniques, 0);
+  f_101_001_001_101_0(uniques, 0);
+  f_101_001_001_101_1(uniques, 0);
+  f_101_001_001_110_0(uniques, 0);
+  f_101_001_001_110_1(uniques, 0);
+  f_101_001_001_111_0(uniques, 0);
+  f_101_001_001_111_1(uniques, 0);
+  f_101_001_010_000_0(uniques, 0);
+  f_101_001_010_000_1(uniques, 0);
+  f_101_001_010_001_0(uniques, 0);
+  f_101_001_010_001_1(uniques, 0);
+  f_101_001_010_010_0(uniques, 0);
+  f_101_001_010_010_1(uniques, 0);
+  f_101_001_010_011_0(uniques, 0);
+  f_101_001_010_011_1(uniques, 0);
+  f_101_001_010_100_0(uniques, 0);
+  f_101_001_010_100_1(uniques, 0);
+  f_101_001_010_101_0(uniques, 0);
+  f_101_001_010_101_1(uniques, 0);
+  f_101_001_010_110_0(uniques, 0);
+  f_101_001_010_110_1(uniques, 0);
+  f_101_001_010_111_0(uniques, 0);
+  f_101_001_010_111_1(uniques, 0);
+  f_101_001_011_000_0(uniques, 0);
+  f_101_001_011_000_1(uniques, 0);
+  f_101_001_011_001_0(uniques, 0);
+  f_101_001_011_001_1(uniques, 0);
+  f_101_001_011_010_0(uniques, 0);
+  f_101_001_011_010_1(uniques, 0);
+  f_101_001_011_011_0(uniques, 0);
+  f_101_001_011_011_1(uniques, 0);
+  f_101_001_011_100_0(uniques, 0);
+  f_101_001_011_100_1(uniques, 0);
+  f_101_001_011_101_0(uniques, 0);
+  f_101_001_011_101_1(uniques, 0);
+  f_101_001_011_110_0(uniques, 0);
+  f_101_001_011_110_1(uniques, 0);
+  f_101_001_011_111_0(uniques, 0);
+  f_101_001_011_111_1(uniques, 0);
+  f_101_001_100_000_0(uniques, 0);
+  f_101_001_100_000_1(uniques, 0);
+  f_101_001_100_001_0(uniques, 0);
+  f_101_001_100_001_1(uniques, 0);
+  f_101_001_100_010_0(uniques, 0);
+  f_101_001_100_010_1(uniques, 0);
+  f_101_001_100_011_0(uniques, 0);
+  f_101_001_100_011_1(uniques, 0);
+  f_101_001_100_100_0(uniques, 0);
+  f_101_001_100_100_1(uniques, 0);
+  f_101_001_100_101_0(uniques, 0);
+  f_101_001_100_101_1(uniques, 0);
+  f_101_001_100_110_0(uniques, 0);
+  f_101_001_100_110_1(uniques, 0);
+  f_101_001_100_111_0(uniques, 0);
+  f_101_001_100_111_1(uniques, 0);
+  f_101_001_101_000_0(uniques, 0);
+  f_101_001_101_000_1(uniques, 0);
+  f_101_001_101_001_0(uniques, 0);
+  f_101_001_101_001_1(uniques, 0);
+  f_101_001_101_010_0(uniques, 0);
+  f_101_001_101_010_1(uniques, 0);
+  f_101_001_101_011_0(uniques, 0);
+  f_101_001_101_011_1(uniques, 0);
+  f_101_001_101_100_0(uniques, 0);
+  f_101_001_101_100_1(uniques, 0);
+  f_101_001_101_101_0(uniques, 0);
+  f_101_001_101_101_1(uniques, 0);
+  f_101_001_101_110_0(uniques, 0);
+  f_101_001_101_110_1(uniques, 0);
+  f_101_001_101_111_0(uniques, 0);
+  f_101_001_101_111_1(uniques, 0);
+  f_101_001_110_000_0(uniques, 0);
+  f_101_001_110_000_1(uniques, 0);
+  f_101_001_110_001_0(uniques, 0);
+  f_101_001_110_001_1(uniques, 0);
+  f_101_001_110_010_0(uniques, 0);
+  f_101_001_110_010_1(uniques, 0);
+  f_101_001_110_011_0(uniques, 0);
+  f_101_001_110_011_1(uniques, 0);
+  f_101_001_110_100_0(uniques, 0);
+  f_101_001_110_100_1(uniques, 0);
+  f_101_001_110_101_0(uniques, 0);
+  f_101_001_110_101_1(uniques, 0);
+  f_101_001_110_110_0(uniques, 0);
+  f_101_001_110_110_1(uniques, 0);
+  f_101_001_110_111_0(uniques, 0);
+  f_101_001_110_111_1(uniques, 0);
+  f_101_001_111_000_0(uniques, 0);
+  f_101_001_111_000_1(uniques, 0);
+  f_101_001_111_001_0(uniques, 0);
+  f_101_001_111_001_1(uniques, 0);
+  f_101_001_111_010_0(uniques, 0);
+  f_101_001_111_010_1(uniques, 0);
+  f_101_001_111_011_0(uniques, 0);
+  f_101_001_111_011_1(uniques, 0);
+  f_101_001_111_100_0(uniques, 0);
+  f_101_001_111_100_1(uniques, 0);
+  f_101_001_111_101_0(uniques, 0);
+  f_101_001_111_101_1(uniques, 0);
+  f_101_001_111_110_0(uniques, 0);
+  f_101_001_111_110_1(uniques, 0);
+  f_101_001_111_111_0(uniques, 0);
+  f_101_001_111_111_1(uniques, 0);
+  f_101_010_000_000_0(uniques, 0);
+  f_101_010_000_000_1(uniques, 0);
+  f_101_010_000_001_0(uniques, 0);
+  f_101_010_000_001_1(uniques, 0);
+  f_101_010_000_010_0(uniques, 0);
+  f_101_010_000_010_1(uniques, 0);
+  f_101_010_000_011_0(uniques, 0);
+  f_101_010_000_011_1(uniques, 0);
+  f_101_010_000_100_0(uniques, 0);
+  f_101_010_000_100_1(uniques, 0);
+  f_101_010_000_101_0(uniques, 0);
+  f_101_010_000_101_1(uniques, 0);
+  f_101_010_000_110_0(uniques, 0);
+  f_101_010_000_110_1(uniques, 0);
+  f_101_010_000_111_0(uniques, 0);
+  f_101_010_000_111_1(uniques, 0);
+  f_101_010_001_000_0(uniques, 0);
+  f_101_010_001_000_1(uniques, 0);
+  f_101_010_001_001_0(uniques, 0);
+  f_101_010_001_001_1(uniques, 0);
+  f_101_010_001_010_0(uniques, 0);
+  f_101_010_001_010_1(uniques, 0);
+  f_101_010_001_011_0(uniques, 0);
+  f_101_010_001_011_1(uniques, 0);
+  f_101_010_001_100_0(uniques, 0);
+  f_101_010_001_100_1(uniques, 0);
+  f_101_010_001_101_0(uniques, 0);
+  f_101_010_001_101_1(uniques, 0);
+  f_101_010_001_110_0(uniques, 0);
+  f_101_010_001_110_1(uniques, 0);
+  f_101_010_001_111_0(uniques, 0);
+  f_101_010_001_111_1(uniques, 0);
+  f_101_010_010_000_0(uniques, 0);
+  f_101_010_010_000_1(uniques, 0);
+  f_101_010_010_001_0(uniques, 0);
+  f_101_010_010_001_1(uniques, 0);
+  f_101_010_010_010_0(uniques, 0);
+  f_101_010_010_010_1(uniques, 0);
+  f_101_010_010_011_0(uniques, 0);
+  f_101_010_010_011_1(uniques, 0);
+  f_101_010_010_100_0(uniques, 0);
+  f_101_010_010_100_1(uniques, 0);
+  f_101_010_010_101_0(uniques, 0);
+  f_101_010_010_101_1(uniques, 0);
+  f_101_010_010_110_0(uniques, 0);
+  f_101_010_010_110_1(uniques, 0);
+  f_101_010_010_111_0(uniques, 0);
+  f_101_010_010_111_1(uniques, 0);
+  f_101_010_011_000_0(uniques, 0);
+  f_101_010_011_000_1(uniques, 0);
+  f_101_010_011_001_0(uniques, 0);
+  f_101_010_011_001_1(uniques, 0);
+  f_101_010_011_010_0(uniques, 0);
+  f_101_010_011_010_1(uniques, 0);
+  f_101_010_011_011_0(uniques, 0);
+  f_101_010_011_011_1(uniques, 0);
+  f_101_010_011_100_0(uniques, 0);
+  f_101_010_011_100_1(uniques, 0);
+  f_101_010_011_101_0(uniques, 0);
+  f_101_010_011_101_1(uniques, 0);
+  f_101_010_011_110_0(uniques, 0);
+  f_101_010_011_110_1(uniques, 0);
+  f_101_010_011_111_0(uniques, 0);
+  f_101_010_011_111_1(uniques, 0);
+  f_101_010_100_000_0(uniques, 0);
+  f_101_010_100_000_1(uniques, 0);
+  f_101_010_100_001_0(uniques, 0);
+  f_101_010_100_001_1(uniques, 0);
+  f_101_010_100_010_0(uniques, 0);
+  f_101_010_100_010_1(uniques, 0);
+  f_101_010_100_011_0(uniques, 0);
+  f_101_010_100_011_1(uniques, 0);
+  f_101_010_100_100_0(uniques, 0);
+  f_101_010_100_100_1(uniques, 0);
+  f_101_010_100_101_0(uniques, 0);
+  f_101_010_100_101_1(uniques, 0);
+  f_101_010_100_110_0(uniques, 0);
+  f_101_010_100_110_1(uniques, 0);
+  f_101_010_100_111_0(uniques, 0);
+  f_101_010_100_111_1(uniques, 0);
+  f_101_010_101_000_0(uniques, 0);
+  f_101_010_101_000_1(uniques, 0);
+  f_101_010_101_001_0(uniques, 0);
+  f_101_010_101_001_1(uniques, 0);
+  f_101_010_101_010_0(uniques, 0);
+  f_101_010_101_010_1(uniques, 0);
+  f_101_010_101_011_0(uniques, 0);
+  f_101_010_101_011_1(uniques, 0);
+  f_101_010_101_100_0(uniques, 0);
+  f_101_010_101_100_1(uniques, 0);
+  f_101_010_101_101_0(uniques, 0);
+  f_101_010_101_101_1(uniques, 0);
+  f_101_010_101_110_0(uniques, 0);
+  f_101_010_101_110_1(uniques, 0);
+  f_101_010_101_111_0(uniques, 0);
+  f_101_010_101_111_1(uniques, 0);
+  f_101_010_110_000_0(uniques, 0);
+  f_101_010_110_000_1(uniques, 0);
+  f_101_010_110_001_0(uniques, 0);
+  f_101_010_110_001_1(uniques, 0);
+  f_101_010_110_010_0(uniques, 0);
+  f_101_010_110_010_1(uniques, 0);
+  f_101_010_110_011_0(uniques, 0);
+  f_101_010_110_011_1(uniques, 0);
+  f_101_010_110_100_0(uniques, 0);
+  f_101_010_110_100_1(uniques, 0);
+  f_101_010_110_101_0(uniques, 0);
+  f_101_010_110_101_1(uniques, 0);
+  f_101_010_110_110_0(uniques, 0);
+  f_101_010_110_110_1(uniques, 0);
+  f_101_010_110_111_0(uniques, 0);
+  f_101_010_110_111_1(uniques, 0);
+  f_101_010_111_000_0(uniques, 0);
+  f_101_010_111_000_1(uniques, 0);
+  f_101_010_111_001_0(uniques, 0);
+  f_101_010_111_001_1(uniques, 0);
+  f_101_010_111_010_0(uniques, 0);
+  f_101_010_111_010_1(uniques, 0);
+  f_101_010_111_011_0(uniques, 0);
+  f_101_010_111_011_1(uniques, 0);
+  f_101_010_111_100_0(uniques, 0);
+  f_101_010_111_100_1(uniques, 0);
+  f_101_010_111_101_0(uniques, 0);
+  f_101_010_111_101_1(uniques, 0);
+  f_101_010_111_110_0(uniques, 0);
+  f_101_010_111_110_1(uniques, 0);
+  f_101_010_111_111_0(uniques, 0);
+  f_101_010_111_111_1(uniques, 0);
+  f_101_011_000_000_0(uniques, 0);
+  f_101_011_000_000_1(uniques, 0);
+  f_101_011_000_001_0(uniques, 0);
+  f_101_011_000_001_1(uniques, 0);
+  f_101_011_000_010_0(uniques, 0);
+  f_101_011_000_010_1(uniques, 0);
+  f_101_011_000_011_0(uniques, 0);
+  f_101_011_000_011_1(uniques, 0);
+  f_101_011_000_100_0(uniques, 0);
+  f_101_011_000_100_1(uniques, 0);
+  f_101_011_000_101_0(uniques, 0);
+  f_101_011_000_101_1(uniques, 0);
+  f_101_011_000_110_0(uniques, 0);
+  f_101_011_000_110_1(uniques, 0);
+  f_101_011_000_111_0(uniques, 0);
+  f_101_011_000_111_1(uniques, 0);
+  f_101_011_001_000_0(uniques, 0);
+  f_101_011_001_000_1(uniques, 0);
+  f_101_011_001_001_0(uniques, 0);
+  f_101_011_001_001_1(uniques, 0);
+  f_101_011_001_010_0(uniques, 0);
+  f_101_011_001_010_1(uniques, 0);
+  f_101_011_001_011_0(uniques, 0);
+  f_101_011_001_011_1(uniques, 0);
+  f_101_011_001_100_0(uniques, 0);
+  f_101_011_001_100_1(uniques, 0);
+  f_101_011_001_101_0(uniques, 0);
+  f_101_011_001_101_1(uniques, 0);
+  f_101_011_001_110_0(uniques, 0);
+  f_101_011_001_110_1(uniques, 0);
+  f_101_011_001_111_0(uniques, 0);
+  f_101_011_001_111_1(uniques, 0);
+  f_101_011_010_000_0(uniques, 0);
+  f_101_011_010_000_1(uniques, 0);
+  f_101_011_010_001_0(uniques, 0);
+  f_101_011_010_001_1(uniques, 0);
+  f_101_011_010_010_0(uniques, 0);
+  f_101_011_010_010_1(uniques, 0);
+  f_101_011_010_011_0(uniques, 0);
+  f_101_011_010_011_1(uniques, 0);
+  f_101_011_010_100_0(uniques, 0);
+  f_101_011_010_100_1(uniques, 0);
+  f_101_011_010_101_0(uniques, 0);
+  f_101_011_010_101_1(uniques, 0);
+  f_101_011_010_110_0(uniques, 0);
+  f_101_011_010_110_1(uniques, 0);
+  f_101_011_010_111_0(uniques, 0);
+  f_101_011_010_111_1(uniques, 0);
+  f_101_011_011_000_0(uniques, 0);
+  f_101_011_011_000_1(uniques, 0);
+  f_101_011_011_001_0(uniques, 0);
+  f_101_011_011_001_1(uniques, 0);
+  f_101_011_011_010_0(uniques, 0);
+  f_101_011_011_010_1(uniques, 0);
+  f_101_011_011_011_0(uniques, 0);
+  f_101_011_011_011_1(uniques, 0);
+  f_101_011_011_100_0(uniques, 0);
+  f_101_011_011_100_1(uniques, 0);
+  f_101_011_011_101_0(uniques, 0);
+  f_101_011_011_101_1(uniques, 0);
+  f_101_011_011_110_0(uniques, 0);
+  f_101_011_011_110_1(uniques, 0);
+  f_101_011_011_111_0(uniques, 0);
+  f_101_011_011_111_1(uniques, 0);
+  f_101_011_100_000_0(uniques, 0);
+  f_101_011_100_000_1(uniques, 0);
+  f_101_011_100_001_0(uniques, 0);
+  f_101_011_100_001_1(uniques, 0);
+  f_101_011_100_010_0(uniques, 0);
+  f_101_011_100_010_1(uniques, 0);
+  f_101_011_100_011_0(uniques, 0);
+  f_101_011_100_011_1(uniques, 0);
+  f_101_011_100_100_0(uniques, 0);
+  f_101_011_100_100_1(uniques, 0);
+  f_101_011_100_101_0(uniques, 0);
+  f_101_011_100_101_1(uniques, 0);
+  f_101_011_100_110_0(uniques, 0);
+  f_101_011_100_110_1(uniques, 0);
+  f_101_011_100_111_0(uniques, 0);
+  f_101_011_100_111_1(uniques, 0);
+  f_101_011_101_000_0(uniques, 0);
+  f_101_011_101_000_1(uniques, 0);
+  f_101_011_101_001_0(uniques, 0);
+  f_101_011_101_001_1(uniques, 0);
+  f_101_011_101_010_0(uniques, 0);
+  f_101_011_101_010_1(uniques, 0);
+  f_101_011_101_011_0(uniques, 0);
+  f_101_011_101_011_1(uniques, 0);
+  f_101_011_101_100_0(uniques, 0);
+  f_101_011_101_100_1(uniques, 0);
+  f_101_011_101_101_0(uniques, 0);
+  f_101_011_101_101_1(uniques, 0);
+  f_101_011_101_110_0(uniques, 0);
+  f_101_011_101_110_1(uniques, 0);
+  f_101_011_101_111_0(uniques, 0);
+  f_101_011_101_111_1(uniques, 0);
+  f_101_011_110_000_0(uniques, 0);
+  f_101_011_110_000_1(uniques, 0);
+  f_101_011_110_001_0(uniques, 0);
+  f_101_011_110_001_1(uniques, 0);
+  f_101_011_110_010_0(uniques, 0);
+  f_101_011_110_010_1(uniques, 0);
+  f_101_011_110_011_0(uniques, 0);
+  f_101_011_110_011_1(uniques, 0);
+  f_101_011_110_100_0(uniques, 0);
+  f_101_011_110_100_1(uniques, 0);
+  f_101_011_110_101_0(uniques, 0);
+  f_101_011_110_101_1(uniques, 0);
+  f_101_011_110_110_0(uniques, 0);
+  f_101_011_110_110_1(uniques, 0);
+  f_101_011_110_111_0(uniques, 0);
+  f_101_011_110_111_1(uniques, 0);
+  f_101_011_111_000_0(uniques, 0);
+  f_101_011_111_000_1(uniques, 0);
+  f_101_011_111_001_0(uniques, 0);
+  f_101_011_111_001_1(uniques, 0);
+  f_101_011_111_010_0(uniques, 0);
+  f_101_011_111_010_1(uniques, 0);
+  f_101_011_111_011_0(uniques, 0);
+  f_101_011_111_011_1(uniques, 0);
+  f_101_011_111_100_0(uniques, 0);
+  f_101_011_111_100_1(uniques, 0);
+  f_101_011_111_101_0(uniques, 0);
+  f_101_011_111_101_1(uniques, 0);
+  f_101_011_111_110_0(uniques, 0);
+  f_101_011_111_110_1(uniques, 0);
+  f_101_011_111_111_0(uniques, 0);
+  f_101_011_111_111_1(uniques, 0);
+  f_101_100_000_000_0(uniques, 0);
+  f_101_100_000_000_1(uniques, 0);
+  f_101_100_000_001_0(uniques, 0);
+  f_101_100_000_001_1(uniques, 0);
+  f_101_100_000_010_0(uniques, 0);
+  f_101_100_000_010_1(uniques, 0);
+  f_101_100_000_011_0(uniques, 0);
+  f_101_100_000_011_1(uniques, 0);
+  f_101_100_000_100_0(uniques, 0);
+  f_101_100_000_100_1(uniques, 0);
+  f_101_100_000_101_0(uniques, 0);
+  f_101_100_000_101_1(uniques, 0);
+  f_101_100_000_110_0(uniques, 0);
+  f_101_100_000_110_1(uniques, 0);
+  f_101_100_000_111_0(uniques, 0);
+  f_101_100_000_111_1(uniques, 0);
+  f_101_100_001_000_0(uniques, 0);
+  f_101_100_001_000_1(uniques, 0);
+  f_101_100_001_001_0(uniques, 0);
+  f_101_100_001_001_1(uniques, 0);
+  f_101_100_001_010_0(uniques, 0);
+  f_101_100_001_010_1(uniques, 0);
+  f_101_100_001_011_0(uniques, 0);
+  f_101_100_001_011_1(uniques, 0);
+  f_101_100_001_100_0(uniques, 0);
+  f_101_100_001_100_1(uniques, 0);
+  f_101_100_001_101_0(uniques, 0);
+  f_101_100_001_101_1(uniques, 0);
+  f_101_100_001_110_0(uniques, 0);
+  f_101_100_001_110_1(uniques, 0);
+  f_101_100_001_111_0(uniques, 0);
+  f_101_100_001_111_1(uniques, 0);
+  f_101_100_010_000_0(uniques, 0);
+  f_101_100_010_000_1(uniques, 0);
+  f_101_100_010_001_0(uniques, 0);
+  f_101_100_010_001_1(uniques, 0);
+  f_101_100_010_010_0(uniques, 0);
+  f_101_100_010_010_1(uniques, 0);
+  f_101_100_010_011_0(uniques, 0);
+  f_101_100_010_011_1(uniques, 0);
+  f_101_100_010_100_0(uniques, 0);
+  f_101_100_010_100_1(uniques, 0);
+  f_101_100_010_101_0(uniques, 0);
+  f_101_100_010_101_1(uniques, 0);
+  f_101_100_010_110_0(uniques, 0);
+  f_101_100_010_110_1(uniques, 0);
+  f_101_100_010_111_0(uniques, 0);
+  f_101_100_010_111_1(uniques, 0);
+  f_101_100_011_000_0(uniques, 0);
+  f_101_100_011_000_1(uniques, 0);
+  f_101_100_011_001_0(uniques, 0);
+  f_101_100_011_001_1(uniques, 0);
+  f_101_100_011_010_0(uniques, 0);
+  f_101_100_011_010_1(uniques, 0);
+  f_101_100_011_011_0(uniques, 0);
+  f_101_100_011_011_1(uniques, 0);
+  f_101_100_011_100_0(uniques, 0);
+  f_101_100_011_100_1(uniques, 0);
+  f_101_100_011_101_0(uniques, 0);
+  f_101_100_011_101_1(uniques, 0);
+  f_101_100_011_110_0(uniques, 0);
+  f_101_100_011_110_1(uniques, 0);
+  f_101_100_011_111_0(uniques, 0);
+  f_101_100_011_111_1(uniques, 0);
+  f_101_100_100_000_0(uniques, 0);
+  f_101_100_100_000_1(uniques, 0);
+  f_101_100_100_001_0(uniques, 0);
+  f_101_100_100_001_1(uniques, 0);
+  f_101_100_100_010_0(uniques, 0);
+  f_101_100_100_010_1(uniques, 0);
+  f_101_100_100_011_0(uniques, 0);
+  f_101_100_100_011_1(uniques, 0);
+  f_101_100_100_100_0(uniques, 0);
+  f_101_100_100_100_1(uniques, 0);
+  f_101_100_100_101_0(uniques, 0);
+  f_101_100_100_101_1(uniques, 0);
+  f_101_100_100_110_0(uniques, 0);
+  f_101_100_100_110_1(uniques, 0);
+  f_101_100_100_111_0(uniques, 0);
+  f_101_100_100_111_1(uniques, 0);
+  f_101_100_101_000_0(uniques, 0);
+  f_101_100_101_000_1(uniques, 0);
+  f_101_100_101_001_0(uniques, 0);
+  f_101_100_101_001_1(uniques, 0);
+  f_101_100_101_010_0(uniques, 0);
+  f_101_100_101_010_1(uniques, 0);
+  f_101_100_101_011_0(uniques, 0);
+  f_101_100_101_011_1(uniques, 0);
+  f_101_100_101_100_0(uniques, 0);
+  f_101_100_101_100_1(uniques, 0);
+  f_101_100_101_101_0(uniques, 0);
+  f_101_100_101_101_1(uniques, 0);
+  f_101_100_101_110_0(uniques, 0);
+  f_101_100_101_110_1(uniques, 0);
+  f_101_100_101_111_0(uniques, 0);
+  f_101_100_101_111_1(uniques, 0);
+  f_101_100_110_000_0(uniques, 0);
+  f_101_100_110_000_1(uniques, 0);
+  f_101_100_110_001_0(uniques, 0);
+  f_101_100_110_001_1(uniques, 0);
+  f_101_100_110_010_0(uniques, 0);
+  f_101_100_110_010_1(uniques, 0);
+  f_101_100_110_011_0(uniques, 0);
+  f_101_100_110_011_1(uniques, 0);
+  f_101_100_110_100_0(uniques, 0);
+  f_101_100_110_100_1(uniques, 0);
+  f_101_100_110_101_0(uniques, 0);
+  f_101_100_110_101_1(uniques, 0);
+  f_101_100_110_110_0(uniques, 0);
+  f_101_100_110_110_1(uniques, 0);
+  f_101_100_110_111_0(uniques, 0);
+  f_101_100_110_111_1(uniques, 0);
+  f_101_100_111_000_0(uniques, 0);
+  f_101_100_111_000_1(uniques, 0);
+  f_101_100_111_001_0(uniques, 0);
+  f_101_100_111_001_1(uniques, 0);
+  f_101_100_111_010_0(uniques, 0);
+  f_101_100_111_010_1(uniques, 0);
+  f_101_100_111_011_0(uniques, 0);
+  f_101_100_111_011_1(uniques, 0);
+  f_101_100_111_100_0(uniques, 0);
+  f_101_100_111_100_1(uniques, 0);
+  f_101_100_111_101_0(uniques, 0);
+  f_101_100_111_101_1(uniques, 0);
+  f_101_100_111_110_0(uniques, 0);
+  f_101_100_111_110_1(uniques, 0);
+  f_101_100_111_111_0(uniques, 0);
+  f_101_100_111_111_1(uniques, 0);
+  f_101_101_000_000_0(uniques, 0);
+  f_101_101_000_000_1(uniques, 0);
+  f_101_101_000_001_0(uniques, 0);
+  f_101_101_000_001_1(uniques, 0);
+  f_101_101_000_010_0(uniques, 0);
+  f_101_101_000_010_1(uniques, 0);
+  f_101_101_000_011_0(uniques, 0);
+  f_101_101_000_011_1(uniques, 0);
+  f_101_101_000_100_0(uniques, 0);
+  f_101_101_000_100_1(uniques, 0);
+  f_101_101_000_101_0(uniques, 0);
+  f_101_101_000_101_1(uniques, 0);
+  f_101_101_000_110_0(uniques, 0);
+  f_101_101_000_110_1(uniques, 0);
+  f_101_101_000_111_0(uniques, 0);
+  f_101_101_000_111_1(uniques, 0);
+  f_101_101_001_000_0(uniques, 0);
+  f_101_101_001_000_1(uniques, 0);
+  f_101_101_001_001_0(uniques, 0);
+  f_101_101_001_001_1(uniques, 0);
+  f_101_101_001_010_0(uniques, 0);
+  f_101_101_001_010_1(uniques, 0);
+  f_101_101_001_011_0(uniques, 0);
+  f_101_101_001_011_1(uniques, 0);
+  f_101_101_001_100_0(uniques, 0);
+  f_101_101_001_100_1(uniques, 0);
+  f_101_101_001_101_0(uniques, 0);
+  f_101_101_001_101_1(uniques, 0);
+  f_101_101_001_110_0(uniques, 0);
+  f_101_101_001_110_1(uniques, 0);
+  f_101_101_001_111_0(uniques, 0);
+  f_101_101_001_111_1(uniques, 0);
+  f_101_101_010_000_0(uniques, 0);
+  f_101_101_010_000_1(uniques, 0);
+  f_101_101_010_001_0(uniques, 0);
+  f_101_101_010_001_1(uniques, 0);
+  f_101_101_010_010_0(uniques, 0);
+  f_101_101_010_010_1(uniques, 0);
+  f_101_101_010_011_0(uniques, 0);
+  f_101_101_010_011_1(uniques, 0);
+  f_101_101_010_100_0(uniques, 0);
+  f_101_101_010_100_1(uniques, 0);
+  f_101_101_010_101_0(uniques, 0);
+  f_101_101_010_101_1(uniques, 0);
+  f_101_101_010_110_0(uniques, 0);
+  f_101_101_010_110_1(uniques, 0);
+  f_101_101_010_111_0(uniques, 0);
+  f_101_101_010_111_1(uniques, 0);
+  f_101_101_011_000_0(uniques, 0);
+  f_101_101_011_000_1(uniques, 0);
+  f_101_101_011_001_0(uniques, 0);
+  f_101_101_011_001_1(uniques, 0);
+  f_101_101_011_010_0(uniques, 0);
+  f_101_101_011_010_1(uniques, 0);
+  f_101_101_011_011_0(uniques, 0);
+  f_101_101_011_011_1(uniques, 0);
+  f_101_101_011_100_0(uniques, 0);
+  f_101_101_011_100_1(uniques, 0);
+  f_101_101_011_101_0(uniques, 0);
+  f_101_101_011_101_1(uniques, 0);
+  f_101_101_011_110_0(uniques, 0);
+  f_101_101_011_110_1(uniques, 0);
+  f_101_101_011_111_0(uniques, 0);
+  f_101_101_011_111_1(uniques, 0);
+  f_101_101_100_000_0(uniques, 0);
+  f_101_101_100_000_1(uniques, 0);
+  f_101_101_100_001_0(uniques, 0);
+  f_101_101_100_001_1(uniques, 0);
+  f_101_101_100_010_0(uniques, 0);
+  f_101_101_100_010_1(uniques, 0);
+  f_101_101_100_011_0(uniques, 0);
+  f_101_101_100_011_1(uniques, 0);
+  f_101_101_100_100_0(uniques, 0);
+  f_101_101_100_100_1(uniques, 0);
+  f_101_101_100_101_0(uniques, 0);
+  f_101_101_100_101_1(uniques, 0);
+  f_101_101_100_110_0(uniques, 0);
+  f_101_101_100_110_1(uniques, 0);
+  f_101_101_100_111_0(uniques, 0);
+  f_101_101_100_111_1(uniques, 0);
+  f_101_101_101_000_0(uniques, 0);
+  f_101_101_101_000_1(uniques, 0);
+  f_101_101_101_001_0(uniques, 0);
+  f_101_101_101_001_1(uniques, 0);
+  f_101_101_101_010_0(uniques, 0);
+  f_101_101_101_010_1(uniques, 0);
+  f_101_101_101_011_0(uniques, 0);
+  f_101_101_101_011_1(uniques, 0);
+  f_101_101_101_100_0(uniques, 0);
+  f_101_101_101_100_1(uniques, 0);
+  f_101_101_101_101_0(uniques, 0);
+  f_101_101_101_101_1(uniques, 0);
+  f_101_101_101_110_0(uniques, 0);
+  f_101_101_101_110_1(uniques, 0);
+  f_101_101_101_111_0(uniques, 0);
+  f_101_101_101_111_1(uniques, 0);
+  f_101_101_110_000_0(uniques, 0);
+  f_101_101_110_000_1(uniques, 0);
+  f_101_101_110_001_0(uniques, 0);
+  f_101_101_110_001_1(uniques, 0);
+  f_101_101_110_010_0(uniques, 0);
+  f_101_101_110_010_1(uniques, 0);
+  f_101_101_110_011_0(uniques, 0);
+  f_101_101_110_011_1(uniques, 0);
+  f_101_101_110_100_0(uniques, 0);
+  f_101_101_110_100_1(uniques, 0);
+  f_101_101_110_101_0(uniques, 0);
+  f_101_101_110_101_1(uniques, 0);
+  f_101_101_110_110_0(uniques, 0);
+  f_101_101_110_110_1(uniques, 0);
+  f_101_101_110_111_0(uniques, 0);
+  f_101_101_110_111_1(uniques, 0);
+  f_101_101_111_000_0(uniques, 0);
+  f_101_101_111_000_1(uniques, 0);
+  f_101_101_111_001_0(uniques, 0);
+  f_101_101_111_001_1(uniques, 0);
+  f_101_101_111_010_0(uniques, 0);
+  f_101_101_111_010_1(uniques, 0);
+  f_101_101_111_011_0(uniques, 0);
+  f_101_101_111_011_1(uniques, 0);
+  f_101_101_111_100_0(uniques, 0);
+  f_101_101_111_100_1(uniques, 0);
+  f_101_101_111_101_0(uniques, 0);
+  f_101_101_111_101_1(uniques, 0);
+  f_101_101_111_110_0(uniques, 0);
+  f_101_101_111_110_1(uniques, 0);
+  f_101_101_111_111_0(uniques, 0);
+  f_101_101_111_111_1(uniques, 0);
+  f_101_110_000_000_0(uniques, 0);
+  f_101_110_000_000_1(uniques, 0);
+  f_101_110_000_001_0(uniques, 0);
+  f_101_110_000_001_1(uniques, 0);
+  f_101_110_000_010_0(uniques, 0);
+  f_101_110_000_010_1(uniques, 0);
+  f_101_110_000_011_0(uniques, 0);
+  f_101_110_000_011_1(uniques, 0);
+  f_101_110_000_100_0(uniques, 0);
+  f_101_110_000_100_1(uniques, 0);
+  f_101_110_000_101_0(uniques, 0);
+  f_101_110_000_101_1(uniques, 0);
+  f_101_110_000_110_0(uniques, 0);
+  f_101_110_000_110_1(uniques, 0);
+  f_101_110_000_111_0(uniques, 0);
+  f_101_110_000_111_1(uniques, 0);
+  f_101_110_001_000_0(uniques, 0);
+  f_101_110_001_000_1(uniques, 0);
+  f_101_110_001_001_0(uniques, 0);
+  f_101_110_001_001_1(uniques, 0);
+  f_101_110_001_010_0(uniques, 0);
+  f_101_110_001_010_1(uniques, 0);
+  f_101_110_001_011_0(uniques, 0);
+  f_101_110_001_011_1(uniques, 0);
+  f_101_110_001_100_0(uniques, 0);
+  f_101_110_001_100_1(uniques, 0);
+  f_101_110_001_101_0(uniques, 0);
+  f_101_110_001_101_1(uniques, 0);
+  f_101_110_001_110_0(uniques, 0);
+  f_101_110_001_110_1(uniques, 0);
+  f_101_110_001_111_0(uniques, 0);
+  f_101_110_001_111_1(uniques, 0);
+  f_101_110_010_000_0(uniques, 0);
+  f_101_110_010_000_1(uniques, 0);
+  f_101_110_010_001_0(uniques, 0);
+  f_101_110_010_001_1(uniques, 0);
+  f_101_110_010_010_0(uniques, 0);
+  f_101_110_010_010_1(uniques, 0);
+  f_101_110_010_011_0(uniques, 0);
+  f_101_110_010_011_1(uniques, 0);
+  f_101_110_010_100_0(uniques, 0);
+  f_101_110_010_100_1(uniques, 0);
+  f_101_110_010_101_0(uniques, 0);
+  f_101_110_010_101_1(uniques, 0);
+  f_101_110_010_110_0(uniques, 0);
+  f_101_110_010_110_1(uniques, 0);
+  f_101_110_010_111_0(uniques, 0);
+  f_101_110_010_111_1(uniques, 0);
+  f_101_110_011_000_0(uniques, 0);
+  f_101_110_011_000_1(uniques, 0);
+  f_101_110_011_001_0(uniques, 0);
+  f_101_110_011_001_1(uniques, 0);
+  f_101_110_011_010_0(uniques, 0);
+  f_101_110_011_010_1(uniques, 0);
+  f_101_110_011_011_0(uniques, 0);
+  f_101_110_011_011_1(uniques, 0);
+  f_101_110_011_100_0(uniques, 0);
+  f_101_110_011_100_1(uniques, 0);
+  f_101_110_011_101_0(uniques, 0);
+  f_101_110_011_101_1(uniques, 0);
+  f_101_110_011_110_0(uniques, 0);
+  f_101_110_011_110_1(uniques, 0);
+  f_101_110_011_111_0(uniques, 0);
+  f_101_110_011_111_1(uniques, 0);
+  f_101_110_100_000_0(uniques, 0);
+  f_101_110_100_000_1(uniques, 0);
+  f_101_110_100_001_0(uniques, 0);
+  f_101_110_100_001_1(uniques, 0);
+  f_101_110_100_010_0(uniques, 0);
+  f_101_110_100_010_1(uniques, 0);
+  f_101_110_100_011_0(uniques, 0);
+  f_101_110_100_011_1(uniques, 0);
+  f_101_110_100_100_0(uniques, 0);
+  f_101_110_100_100_1(uniques, 0);
+  f_101_110_100_101_0(uniques, 0);
+  f_101_110_100_101_1(uniques, 0);
+  f_101_110_100_110_0(uniques, 0);
+  f_101_110_100_110_1(uniques, 0);
+  f_101_110_100_111_0(uniques, 0);
+  f_101_110_100_111_1(uniques, 0);
+  f_101_110_101_000_0(uniques, 0);
+  f_101_110_101_000_1(uniques, 0);
+  f_101_110_101_001_0(uniques, 0);
+  f_101_110_101_001_1(uniques, 0);
+  f_101_110_101_010_0(uniques, 0);
+  f_101_110_101_010_1(uniques, 0);
+  f_101_110_101_011_0(uniques, 0);
+  f_101_110_101_011_1(uniques, 0);
+  f_101_110_101_100_0(uniques, 0);
+  f_101_110_101_100_1(uniques, 0);
+  f_101_110_101_101_0(uniques, 0);
+  f_101_110_101_101_1(uniques, 0);
+  f_101_110_101_110_0(uniques, 0);
+  f_101_110_101_110_1(uniques, 0);
+  f_101_110_101_111_0(uniques, 0);
+  f_101_110_101_111_1(uniques, 0);
+  f_101_110_110_000_0(uniques, 0);
+  f_101_110_110_000_1(uniques, 0);
+  f_101_110_110_001_0(uniques, 0);
+  f_101_110_110_001_1(uniques, 0);
+  f_101_110_110_010_0(uniques, 0);
+  f_101_110_110_010_1(uniques, 0);
+  f_101_110_110_011_0(uniques, 0);
+  f_101_110_110_011_1(uniques, 0);
+  f_101_110_110_100_0(uniques, 0);
+  f_101_110_110_100_1(uniques, 0);
+  f_101_110_110_101_0(uniques, 0);
+  f_101_110_110_101_1(uniques, 0);
+  f_101_110_110_110_0(uniques, 0);
+  f_101_110_110_110_1(uniques, 0);
+  f_101_110_110_111_0(uniques, 0);
+  f_101_110_110_111_1(uniques, 0);
+  f_101_110_111_000_0(uniques, 0);
+  f_101_110_111_000_1(uniques, 0);
+  f_101_110_111_001_0(uniques, 0);
+  f_101_110_111_001_1(uniques, 0);
+  f_101_110_111_010_0(uniques, 0);
+  f_101_110_111_010_1(uniques, 0);
+  f_101_110_111_011_0(uniques, 0);
+  f_101_110_111_011_1(uniques, 0);
+  f_101_110_111_100_0(uniques, 0);
+  f_101_110_111_100_1(uniques, 0);
+  f_101_110_111_101_0(uniques, 0);
+  f_101_110_111_101_1(uniques, 0);
+  f_101_110_111_110_0(uniques, 0);
+  f_101_110_111_110_1(uniques, 0);
+  f_101_110_111_111_0(uniques, 0);
+  f_101_110_111_111_1(uniques, 0);
+  f_101_111_000_000_0(uniques, 0);
+  f_101_111_000_000_1(uniques, 0);
+  f_101_111_000_001_0(uniques, 0);
+  f_101_111_000_001_1(uniques, 0);
+  f_101_111_000_010_0(uniques, 0);
+  f_101_111_000_010_1(uniques, 0);
+  f_101_111_000_011_0(uniques, 0);
+  f_101_111_000_011_1(uniques, 0);
+  f_101_111_000_100_0(uniques, 0);
+  f_101_111_000_100_1(uniques, 0);
+  f_101_111_000_101_0(uniques, 0);
+  f_101_111_000_101_1(uniques, 0);
+  f_101_111_000_110_0(uniques, 0);
+  f_101_111_000_110_1(uniques, 0);
+  f_101_111_000_111_0(uniques, 0);
+  f_101_111_000_111_1(uniques, 0);
+  f_101_111_001_000_0(uniques, 0);
+  f_101_111_001_000_1(uniques, 0);
+  f_101_111_001_001_0(uniques, 0);
+  f_101_111_001_001_1(uniques, 0);
+  f_101_111_001_010_0(uniques, 0);
+  f_101_111_001_010_1(uniques, 0);
+  f_101_111_001_011_0(uniques, 0);
+  f_101_111_001_011_1(uniques, 0);
+  f_101_111_001_100_0(uniques, 0);
+  f_101_111_001_100_1(uniques, 0);
+  f_101_111_001_101_0(uniques, 0);
+  f_101_111_001_101_1(uniques, 0);
+  f_101_111_001_110_0(uniques, 0);
+  f_101_111_001_110_1(uniques, 0);
+  f_101_111_001_111_0(uniques, 0);
+  f_101_111_001_111_1(uniques, 0);
+  f_101_111_010_000_0(uniques, 0);
+  f_101_111_010_000_1(uniques, 0);
+  f_101_111_010_001_0(uniques, 0);
+  f_101_111_010_001_1(uniques, 0);
+  f_101_111_010_010_0(uniques, 0);
+  f_101_111_010_010_1(uniques, 0);
+  f_101_111_010_011_0(uniques, 0);
+  f_101_111_010_011_1(uniques, 0);
+  f_101_111_010_100_0(uniques, 0);
+  f_101_111_010_100_1(uniques, 0);
+  f_101_111_010_101_0(uniques, 0);
+  f_101_111_010_101_1(uniques, 0);
+  f_101_111_010_110_0(uniques, 0);
+  f_101_111_010_110_1(uniques, 0);
+  f_101_111_010_111_0(uniques, 0);
+  f_101_111_010_111_1(uniques, 0);
+  f_101_111_011_000_0(uniques, 0);
+  f_101_111_011_000_1(uniques, 0);
+  f_101_111_011_001_0(uniques, 0);
+  f_101_111_011_001_1(uniques, 0);
+  f_101_111_011_010_0(uniques, 0);
+  f_101_111_011_010_1(uniques, 0);
+  f_101_111_011_011_0(uniques, 0);
+  f_101_111_011_011_1(uniques, 0);
+  f_101_111_011_100_0(uniques, 0);
+  f_101_111_011_100_1(uniques, 0);
+  f_101_111_011_101_0(uniques, 0);
+  f_101_111_011_101_1(uniques, 0);
+  f_101_111_011_110_0(uniques, 0);
+  f_101_111_011_110_1(uniques, 0);
+  f_101_111_011_111_0(uniques, 0);
+  f_101_111_011_111_1(uniques, 0);
+  f_101_111_100_000_0(uniques, 0);
+  f_101_111_100_000_1(uniques, 0);
+  f_101_111_100_001_0(uniques, 0);
+  f_101_111_100_001_1(uniques, 0);
+  f_101_111_100_010_0(uniques, 0);
+  f_101_111_100_010_1(uniques, 0);
+  f_101_111_100_011_0(uniques, 0);
+  f_101_111_100_011_1(uniques, 0);
+  f_101_111_100_100_0(uniques, 0);
+  f_101_111_100_100_1(uniques, 0);
+  f_101_111_100_101_0(uniques, 0);
+  f_101_111_100_101_1(uniques, 0);
+  f_101_111_100_110_0(uniques, 0);
+  f_101_111_100_110_1(uniques, 0);
+  f_101_111_100_111_0(uniques, 0);
+  f_101_111_100_111_1(uniques, 0);
+  f_101_111_101_000_0(uniques, 0);
+  f_101_111_101_000_1(uniques, 0);
+  f_101_111_101_001_0(uniques, 0);
+  f_101_111_101_001_1(uniques, 0);
+  f_101_111_101_010_0(uniques, 0);
+  f_101_111_101_010_1(uniques, 0);
+  f_101_111_101_011_0(uniques, 0);
+  f_101_111_101_011_1(uniques, 0);
+  f_101_111_101_100_0(uniques, 0);
+  f_101_111_101_100_1(uniques, 0);
+  f_101_111_101_101_0(uniques, 0);
+  f_101_111_101_101_1(uniques, 0);
+  f_101_111_101_110_0(uniques, 0);
+  f_101_111_101_110_1(uniques, 0);
+  f_101_111_101_111_0(uniques, 0);
+  f_101_111_101_111_1(uniques, 0);
+  f_101_111_110_000_0(uniques, 0);
+  f_101_111_110_000_1(uniques, 0);
+  f_101_111_110_001_0(uniques, 0);
+  f_101_111_110_001_1(uniques, 0);
+  f_101_111_110_010_0(uniques, 0);
+  f_101_111_110_010_1(uniques, 0);
+  f_101_111_110_011_0(uniques, 0);
+  f_101_111_110_011_1(uniques, 0);
+  f_101_111_110_100_0(uniques, 0);
+  f_101_111_110_100_1(uniques, 0);
+  f_101_111_110_101_0(uniques, 0);
+  f_101_111_110_101_1(uniques, 0);
+  f_101_111_110_110_0(uniques, 0);
+  f_101_111_110_110_1(uniques, 0);
+  f_101_111_110_111_0(uniques, 0);
+  f_101_111_110_111_1(uniques, 0);
+  f_101_111_111_000_0(uniques, 0);
+  f_101_111_111_000_1(uniques, 0);
+  f_101_111_111_001_0(uniques, 0);
+  f_101_111_111_001_1(uniques, 0);
+  f_101_111_111_010_0(uniques, 0);
+  f_101_111_111_010_1(uniques, 0);
+  f_101_111_111_011_0(uniques, 0);
+  f_101_111_111_011_1(uniques, 0);
+  f_101_111_111_100_0(uniques, 0);
+  f_101_111_111_100_1(uniques, 0);
+  f_101_111_111_101_0(uniques, 0);
+  f_101_111_111_101_1(uniques, 0);
+  f_101_111_111_110_0(uniques, 0);
+  f_101_111_111_110_1(uniques, 0);
+  f_101_111_111_111_0(uniques, 0);
+  f_101_111_111_111_1(uniques, 0);
+  f_110_000_000_000_0(uniques, 0);
+  f_110_000_000_000_1(uniques, 0);
+  f_110_000_000_001_0(uniques, 0);
+  f_110_000_000_001_1(uniques, 0);
+  f_110_000_000_010_0(uniques, 0);
+  f_110_000_000_010_1(uniques, 0);
+  f_110_000_000_011_0(uniques, 0);
+  f_110_000_000_011_1(uniques, 0);
+  f_110_000_000_100_0(uniques, 0);
+  f_110_000_000_100_1(uniques, 0);
+  f_110_000_000_101_0(uniques, 0);
+  f_110_000_000_101_1(uniques, 0);
+  f_110_000_000_110_0(uniques, 0);
+  f_110_000_000_110_1(uniques, 0);
+  f_110_000_000_111_0(uniques, 0);
+  f_110_000_000_111_1(uniques, 0);
+  f_110_000_001_000_0(uniques, 0);
+  f_110_000_001_000_1(uniques, 0);
+  f_110_000_001_001_0(uniques, 0);
+  f_110_000_001_001_1(uniques, 0);
+  f_110_000_001_010_0(uniques, 0);
+  f_110_000_001_010_1(uniques, 0);
+  f_110_000_001_011_0(uniques, 0);
+  f_110_000_001_011_1(uniques, 0);
+  f_110_000_001_100_0(uniques, 0);
+  f_110_000_001_100_1(uniques, 0);
+  f_110_000_001_101_0(uniques, 0);
+  f_110_000_001_101_1(uniques, 0);
+  f_110_000_001_110_0(uniques, 0);
+  f_110_000_001_110_1(uniques, 0);
+  f_110_000_001_111_0(uniques, 0);
+  f_110_000_001_111_1(uniques, 0);
+  f_110_000_010_000_0(uniques, 0);
+  f_110_000_010_000_1(uniques, 0);
+  f_110_000_010_001_0(uniques, 0);
+  f_110_000_010_001_1(uniques, 0);
+  f_110_000_010_010_0(uniques, 0);
+  f_110_000_010_010_1(uniques, 0);
+  f_110_000_010_011_0(uniques, 0);
+  f_110_000_010_011_1(uniques, 0);
+  f_110_000_010_100_0(uniques, 0);
+  f_110_000_010_100_1(uniques, 0);
+  f_110_000_010_101_0(uniques, 0);
+  f_110_000_010_101_1(uniques, 0);
+  f_110_000_010_110_0(uniques, 0);
+  f_110_000_010_110_1(uniques, 0);
+  f_110_000_010_111_0(uniques, 0);
+  f_110_000_010_111_1(uniques, 0);
+  f_110_000_011_000_0(uniques, 0);
+  f_110_000_011_000_1(uniques, 0);
+  f_110_000_011_001_0(uniques, 0);
+  f_110_000_011_001_1(uniques, 0);
+  f_110_000_011_010_0(uniques, 0);
+  f_110_000_011_010_1(uniques, 0);
+  f_110_000_011_011_0(uniques, 0);
+  f_110_000_011_011_1(uniques, 0);
+  f_110_000_011_100_0(uniques, 0);
+  f_110_000_011_100_1(uniques, 0);
+  f_110_000_011_101_0(uniques, 0);
+  f_110_000_011_101_1(uniques, 0);
+  f_110_000_011_110_0(uniques, 0);
+  f_110_000_011_110_1(uniques, 0);
+  f_110_000_011_111_0(uniques, 0);
+  f_110_000_011_111_1(uniques, 0);
+  f_110_000_100_000_0(uniques, 0);
+  f_110_000_100_000_1(uniques, 0);
+  f_110_000_100_001_0(uniques, 0);
+  f_110_000_100_001_1(uniques, 0);
+  f_110_000_100_010_0(uniques, 0);
+  f_110_000_100_010_1(uniques, 0);
+  f_110_000_100_011_0(uniques, 0);
+  f_110_000_100_011_1(uniques, 0);
+  f_110_000_100_100_0(uniques, 0);
+  f_110_000_100_100_1(uniques, 0);
+  f_110_000_100_101_0(uniques, 0);
+  f_110_000_100_101_1(uniques, 0);
+  f_110_000_100_110_0(uniques, 0);
+  f_110_000_100_110_1(uniques, 0);
+  f_110_000_100_111_0(uniques, 0);
+  f_110_000_100_111_1(uniques, 0);
+  f_110_000_101_000_0(uniques, 0);
+  f_110_000_101_000_1(uniques, 0);
+  f_110_000_101_001_0(uniques, 0);
+  f_110_000_101_001_1(uniques, 0);
+  f_110_000_101_010_0(uniques, 0);
+  f_110_000_101_010_1(uniques, 0);
+  f_110_000_101_011_0(uniques, 0);
+  f_110_000_101_011_1(uniques, 0);
+  f_110_000_101_100_0(uniques, 0);
+  f_110_000_101_100_1(uniques, 0);
+  f_110_000_101_101_0(uniques, 0);
+  f_110_000_101_101_1(uniques, 0);
+  f_110_000_101_110_0(uniques, 0);
+  f_110_000_101_110_1(uniques, 0);
+  f_110_000_101_111_0(uniques, 0);
+  f_110_000_101_111_1(uniques, 0);
+  f_110_000_110_000_0(uniques, 0);
+  f_110_000_110_000_1(uniques, 0);
+  f_110_000_110_001_0(uniques, 0);
+  f_110_000_110_001_1(uniques, 0);
+  f_110_000_110_010_0(uniques, 0);
+  f_110_000_110_010_1(uniques, 0);
+  f_110_000_110_011_0(uniques, 0);
+  f_110_000_110_011_1(uniques, 0);
+  f_110_000_110_100_0(uniques, 0);
+  f_110_000_110_100_1(uniques, 0);
+  f_110_000_110_101_0(uniques, 0);
+  f_110_000_110_101_1(uniques, 0);
+  f_110_000_110_110_0(uniques, 0);
+  f_110_000_110_110_1(uniques, 0);
+  f_110_000_110_111_0(uniques, 0);
+  f_110_000_110_111_1(uniques, 0);
+  f_110_000_111_000_0(uniques, 0);
+  f_110_000_111_000_1(uniques, 0);
+  f_110_000_111_001_0(uniques, 0);
+  f_110_000_111_001_1(uniques, 0);
+  f_110_000_111_010_0(uniques, 0);
+  f_110_000_111_010_1(uniques, 0);
+  f_110_000_111_011_0(uniques, 0);
+  f_110_000_111_011_1(uniques, 0);
+  f_110_000_111_100_0(uniques, 0);
+  f_110_000_111_100_1(uniques, 0);
+  f_110_000_111_101_0(uniques, 0);
+  f_110_000_111_101_1(uniques, 0);
+  f_110_000_111_110_0(uniques, 0);
+  f_110_000_111_110_1(uniques, 0);
+  f_110_000_111_111_0(uniques, 0);
+  f_110_000_111_111_1(uniques, 0);
+  f_110_001_000_000_0(uniques, 0);
+  f_110_001_000_000_1(uniques, 0);
+  f_110_001_000_001_0(uniques, 0);
+  f_110_001_000_001_1(uniques, 0);
+  f_110_001_000_010_0(uniques, 0);
+  f_110_001_000_010_1(uniques, 0);
+  f_110_001_000_011_0(uniques, 0);
+  f_110_001_000_011_1(uniques, 0);
+  f_110_001_000_100_0(uniques, 0);
+  f_110_001_000_100_1(uniques, 0);
+  f_110_001_000_101_0(uniques, 0);
+  f_110_001_000_101_1(uniques, 0);
+  f_110_001_000_110_0(uniques, 0);
+  f_110_001_000_110_1(uniques, 0);
+  f_110_001_000_111_0(uniques, 0);
+  f_110_001_000_111_1(uniques, 0);
+  f_110_001_001_000_0(uniques, 0);
+  f_110_001_001_000_1(uniques, 0);
+  f_110_001_001_001_0(uniques, 0);
+  f_110_001_001_001_1(uniques, 0);
+  f_110_001_001_010_0(uniques, 0);
+  f_110_001_001_010_1(uniques, 0);
+  f_110_001_001_011_0(uniques, 0);
+  f_110_001_001_011_1(uniques, 0);
+  f_110_001_001_100_0(uniques, 0);
+  f_110_001_001_100_1(uniques, 0);
+  f_110_001_001_101_0(uniques, 0);
+  f_110_001_001_101_1(uniques, 0);
+  f_110_001_001_110_0(uniques, 0);
+  f_110_001_001_110_1(uniques, 0);
+  f_110_001_001_111_0(uniques, 0);
+  f_110_001_001_111_1(uniques, 0);
+  f_110_001_010_000_0(uniques, 0);
+  f_110_001_010_000_1(uniques, 0);
+  f_110_001_010_001_0(uniques, 0);
+  f_110_001_010_001_1(uniques, 0);
+  f_110_001_010_010_0(uniques, 0);
+  f_110_001_010_010_1(uniques, 0);
+  f_110_001_010_011_0(uniques, 0);
+  f_110_001_010_011_1(uniques, 0);
+  f_110_001_010_100_0(uniques, 0);
+  f_110_001_010_100_1(uniques, 0);
+  f_110_001_010_101_0(uniques, 0);
+  f_110_001_010_101_1(uniques, 0);
+  f_110_001_010_110_0(uniques, 0);
+  f_110_001_010_110_1(uniques, 0);
+  f_110_001_010_111_0(uniques, 0);
+  f_110_001_010_111_1(uniques, 0);
+  f_110_001_011_000_0(uniques, 0);
+  f_110_001_011_000_1(uniques, 0);
+  f_110_001_011_001_0(uniques, 0);
+  f_110_001_011_001_1(uniques, 0);
+  f_110_001_011_010_0(uniques, 0);
+  f_110_001_011_010_1(uniques, 0);
+  f_110_001_011_011_0(uniques, 0);
+  f_110_001_011_011_1(uniques, 0);
+  f_110_001_011_100_0(uniques, 0);
+  f_110_001_011_100_1(uniques, 0);
+  f_110_001_011_101_0(uniques, 0);
+  f_110_001_011_101_1(uniques, 0);
+  f_110_001_011_110_0(uniques, 0);
+  f_110_001_011_110_1(uniques, 0);
+  f_110_001_011_111_0(uniques, 0);
+  f_110_001_011_111_1(uniques, 0);
+  f_110_001_100_000_0(uniques, 0);
+  f_110_001_100_000_1(uniques, 0);
+  f_110_001_100_001_0(uniques, 0);
+  f_110_001_100_001_1(uniques, 0);
+  f_110_001_100_010_0(uniques, 0);
+  f_110_001_100_010_1(uniques, 0);
+  f_110_001_100_011_0(uniques, 0);
+  f_110_001_100_011_1(uniques, 0);
+  f_110_001_100_100_0(uniques, 0);
+  f_110_001_100_100_1(uniques, 0);
+  f_110_001_100_101_0(uniques, 0);
+  f_110_001_100_101_1(uniques, 0);
+  f_110_001_100_110_0(uniques, 0);
+  f_110_001_100_110_1(uniques, 0);
+  f_110_001_100_111_0(uniques, 0);
+  f_110_001_100_111_1(uniques, 0);
+  f_110_001_101_000_0(uniques, 0);
+  f_110_001_101_000_1(uniques, 0);
+  f_110_001_101_001_0(uniques, 0);
+  f_110_001_101_001_1(uniques, 0);
+  f_110_001_101_010_0(uniques, 0);
+  f_110_001_101_010_1(uniques, 0);
+  f_110_001_101_011_0(uniques, 0);
+  f_110_001_101_011_1(uniques, 0);
+  f_110_001_101_100_0(uniques, 0);
+  f_110_001_101_100_1(uniques, 0);
+  f_110_001_101_101_0(uniques, 0);
+  f_110_001_101_101_1(uniques, 0);
+  f_110_001_101_110_0(uniques, 0);
+  f_110_001_101_110_1(uniques, 0);
+  f_110_001_101_111_0(uniques, 0);
+  f_110_001_101_111_1(uniques, 0);
+  f_110_001_110_000_0(uniques, 0);
+  f_110_001_110_000_1(uniques, 0);
+  f_110_001_110_001_0(uniques, 0);
+  f_110_001_110_001_1(uniques, 0);
+  f_110_001_110_010_0(uniques, 0);
+  f_110_001_110_010_1(uniques, 0);
+  f_110_001_110_011_0(uniques, 0);
+  f_110_001_110_011_1(uniques, 0);
+  f_110_001_110_100_0(uniques, 0);
+  f_110_001_110_100_1(uniques, 0);
+  f_110_001_110_101_0(uniques, 0);
+  f_110_001_110_101_1(uniques, 0);
+  f_110_001_110_110_0(uniques, 0);
+  f_110_001_110_110_1(uniques, 0);
+  f_110_001_110_111_0(uniques, 0);
+  f_110_001_110_111_1(uniques, 0);
+  f_110_001_111_000_0(uniques, 0);
+  f_110_001_111_000_1(uniques, 0);
+  f_110_001_111_001_0(uniques, 0);
+  f_110_001_111_001_1(uniques, 0);
+  f_110_001_111_010_0(uniques, 0);
+  f_110_001_111_010_1(uniques, 0);
+  f_110_001_111_011_0(uniques, 0);
+  f_110_001_111_011_1(uniques, 0);
+  f_110_001_111_100_0(uniques, 0);
+  f_110_001_111_100_1(uniques, 0);
+  f_110_001_111_101_0(uniques, 0);
+  f_110_001_111_101_1(uniques, 0);
+  f_110_001_111_110_0(uniques, 0);
+  f_110_001_111_110_1(uniques, 0);
+  f_110_001_111_111_0(uniques, 0);
+  f_110_001_111_111_1(uniques, 0);
+  f_110_010_000_000_0(uniques, 0);
+  f_110_010_000_000_1(uniques, 0);
+  f_110_010_000_001_0(uniques, 0);
+  f_110_010_000_001_1(uniques, 0);
+  f_110_010_000_010_0(uniques, 0);
+  f_110_010_000_010_1(uniques, 0);
+  f_110_010_000_011_0(uniques, 0);
+  f_110_010_000_011_1(uniques, 0);
+  f_110_010_000_100_0(uniques, 0);
+  f_110_010_000_100_1(uniques, 0);
+  f_110_010_000_101_0(uniques, 0);
+  f_110_010_000_101_1(uniques, 0);
+  f_110_010_000_110_0(uniques, 0);
+  f_110_010_000_110_1(uniques, 0);
+  f_110_010_000_111_0(uniques, 0);
+  f_110_010_000_111_1(uniques, 0);
+  f_110_010_001_000_0(uniques, 0);
+  f_110_010_001_000_1(uniques, 0);
+  f_110_010_001_001_0(uniques, 0);
+  f_110_010_001_001_1(uniques, 0);
+  f_110_010_001_010_0(uniques, 0);
+  f_110_010_001_010_1(uniques, 0);
+  f_110_010_001_011_0(uniques, 0);
+  f_110_010_001_011_1(uniques, 0);
+  f_110_010_001_100_0(uniques, 0);
+  f_110_010_001_100_1(uniques, 0);
+  f_110_010_001_101_0(uniques, 0);
+  f_110_010_001_101_1(uniques, 0);
+  f_110_010_001_110_0(uniques, 0);
+  f_110_010_001_110_1(uniques, 0);
+  f_110_010_001_111_0(uniques, 0);
+  f_110_010_001_111_1(uniques, 0);
+  f_110_010_010_000_0(uniques, 0);
+  f_110_010_010_000_1(uniques, 0);
+  f_110_010_010_001_0(uniques, 0);
+  f_110_010_010_001_1(uniques, 0);
+  f_110_010_010_010_0(uniques, 0);
+  f_110_010_010_010_1(uniques, 0);
+  f_110_010_010_011_0(uniques, 0);
+  f_110_010_010_011_1(uniques, 0);
+  f_110_010_010_100_0(uniques, 0);
+  f_110_010_010_100_1(uniques, 0);
+  f_110_010_010_101_0(uniques, 0);
+  f_110_010_010_101_1(uniques, 0);
+  f_110_010_010_110_0(uniques, 0);
+  f_110_010_010_110_1(uniques, 0);
+  f_110_010_010_111_0(uniques, 0);
+  f_110_010_010_111_1(uniques, 0);
+  f_110_010_011_000_0(uniques, 0);
+  f_110_010_011_000_1(uniques, 0);
+  f_110_010_011_001_0(uniques, 0);
+  f_110_010_011_001_1(uniques, 0);
+  f_110_010_011_010_0(uniques, 0);
+  f_110_010_011_010_1(uniques, 0);
+  f_110_010_011_011_0(uniques, 0);
+  f_110_010_011_011_1(uniques, 0);
+  f_110_010_011_100_0(uniques, 0);
+  f_110_010_011_100_1(uniques, 0);
+  f_110_010_011_101_0(uniques, 0);
+  f_110_010_011_101_1(uniques, 0);
+  f_110_010_011_110_0(uniques, 0);
+  f_110_010_011_110_1(uniques, 0);
+  f_110_010_011_111_0(uniques, 0);
+  f_110_010_011_111_1(uniques, 0);
+  f_110_010_100_000_0(uniques, 0);
+  f_110_010_100_000_1(uniques, 0);
+  f_110_010_100_001_0(uniques, 0);
+  f_110_010_100_001_1(uniques, 0);
+  f_110_010_100_010_0(uniques, 0);
+  f_110_010_100_010_1(uniques, 0);
+  f_110_010_100_011_0(uniques, 0);
+  f_110_010_100_011_1(uniques, 0);
+  f_110_010_100_100_0(uniques, 0);
+  f_110_010_100_100_1(uniques, 0);
+  f_110_010_100_101_0(uniques, 0);
+  f_110_010_100_101_1(uniques, 0);
+  f_110_010_100_110_0(uniques, 0);
+  f_110_010_100_110_1(uniques, 0);
+  f_110_010_100_111_0(uniques, 0);
+  f_110_010_100_111_1(uniques, 0);
+  f_110_010_101_000_0(uniques, 0);
+  f_110_010_101_000_1(uniques, 0);
+  f_110_010_101_001_0(uniques, 0);
+  f_110_010_101_001_1(uniques, 0);
+  f_110_010_101_010_0(uniques, 0);
+  f_110_010_101_010_1(uniques, 0);
+  f_110_010_101_011_0(uniques, 0);
+  f_110_010_101_011_1(uniques, 0);
+  f_110_010_101_100_0(uniques, 0);
+  f_110_010_101_100_1(uniques, 0);
+  f_110_010_101_101_0(uniques, 0);
+  f_110_010_101_101_1(uniques, 0);
+  f_110_010_101_110_0(uniques, 0);
+  f_110_010_101_110_1(uniques, 0);
+  f_110_010_101_111_0(uniques, 0);
+  f_110_010_101_111_1(uniques, 0);
+  f_110_010_110_000_0(uniques, 0);
+  f_110_010_110_000_1(uniques, 0);
+  f_110_010_110_001_0(uniques, 0);
+  f_110_010_110_001_1(uniques, 0);
+  f_110_010_110_010_0(uniques, 0);
+  f_110_010_110_010_1(uniques, 0);
+  f_110_010_110_011_0(uniques, 0);
+  f_110_010_110_011_1(uniques, 0);
+  f_110_010_110_100_0(uniques, 0);
+  f_110_010_110_100_1(uniques, 0);
+  f_110_010_110_101_0(uniques, 0);
+  f_110_010_110_101_1(uniques, 0);
+  f_110_010_110_110_0(uniques, 0);
+  f_110_010_110_110_1(uniques, 0);
+  f_110_010_110_111_0(uniques, 0);
+  f_110_010_110_111_1(uniques, 0);
+  f_110_010_111_000_0(uniques, 0);
+  f_110_010_111_000_1(uniques, 0);
+  f_110_010_111_001_0(uniques, 0);
+  f_110_010_111_001_1(uniques, 0);
+  f_110_010_111_010_0(uniques, 0);
+  f_110_010_111_010_1(uniques, 0);
+  f_110_010_111_011_0(uniques, 0);
+  f_110_010_111_011_1(uniques, 0);
+  f_110_010_111_100_0(uniques, 0);
+  f_110_010_111_100_1(uniques, 0);
+  f_110_010_111_101_0(uniques, 0);
+  f_110_010_111_101_1(uniques, 0);
+  f_110_010_111_110_0(uniques, 0);
+  f_110_010_111_110_1(uniques, 0);
+  f_110_010_111_111_0(uniques, 0);
+  f_110_010_111_111_1(uniques, 0);
+  f_110_011_000_000_0(uniques, 0);
+  f_110_011_000_000_1(uniques, 0);
+  f_110_011_000_001_0(uniques, 0);
+  f_110_011_000_001_1(uniques, 0);
+  f_110_011_000_010_0(uniques, 0);
+  f_110_011_000_010_1(uniques, 0);
+  f_110_011_000_011_0(uniques, 0);
+  f_110_011_000_011_1(uniques, 0);
+  f_110_011_000_100_0(uniques, 0);
+  f_110_011_000_100_1(uniques, 0);
+  f_110_011_000_101_0(uniques, 0);
+  f_110_011_000_101_1(uniques, 0);
+  f_110_011_000_110_0(uniques, 0);
+  f_110_011_000_110_1(uniques, 0);
+  f_110_011_000_111_0(uniques, 0);
+  f_110_011_000_111_1(uniques, 0);
+  f_110_011_001_000_0(uniques, 0);
+  f_110_011_001_000_1(uniques, 0);
+  f_110_011_001_001_0(uniques, 0);
+  f_110_011_001_001_1(uniques, 0);
+  f_110_011_001_010_0(uniques, 0);
+  f_110_011_001_010_1(uniques, 0);
+  f_110_011_001_011_0(uniques, 0);
+  f_110_011_001_011_1(uniques, 0);
+  f_110_011_001_100_0(uniques, 0);
+  f_110_011_001_100_1(uniques, 0);
+  f_110_011_001_101_0(uniques, 0);
+  f_110_011_001_101_1(uniques, 0);
+  f_110_011_001_110_0(uniques, 0);
+  f_110_011_001_110_1(uniques, 0);
+  f_110_011_001_111_0(uniques, 0);
+  f_110_011_001_111_1(uniques, 0);
+  f_110_011_010_000_0(uniques, 0);
+  f_110_011_010_000_1(uniques, 0);
+  f_110_011_010_001_0(uniques, 0);
+  f_110_011_010_001_1(uniques, 0);
+  f_110_011_010_010_0(uniques, 0);
+  f_110_011_010_010_1(uniques, 0);
+  f_110_011_010_011_0(uniques, 0);
+  f_110_011_010_011_1(uniques, 0);
+  f_110_011_010_100_0(uniques, 0);
+  f_110_011_010_100_1(uniques, 0);
+  f_110_011_010_101_0(uniques, 0);
+  f_110_011_010_101_1(uniques, 0);
+  f_110_011_010_110_0(uniques, 0);
+  f_110_011_010_110_1(uniques, 0);
+  f_110_011_010_111_0(uniques, 0);
+  f_110_011_010_111_1(uniques, 0);
+  f_110_011_011_000_0(uniques, 0);
+  f_110_011_011_000_1(uniques, 0);
+  f_110_011_011_001_0(uniques, 0);
+  f_110_011_011_001_1(uniques, 0);
+  f_110_011_011_010_0(uniques, 0);
+  f_110_011_011_010_1(uniques, 0);
+  f_110_011_011_011_0(uniques, 0);
+  f_110_011_011_011_1(uniques, 0);
+  f_110_011_011_100_0(uniques, 0);
+  f_110_011_011_100_1(uniques, 0);
+  f_110_011_011_101_0(uniques, 0);
+  f_110_011_011_101_1(uniques, 0);
+  f_110_011_011_110_0(uniques, 0);
+  f_110_011_011_110_1(uniques, 0);
+  f_110_011_011_111_0(uniques, 0);
+  f_110_011_011_111_1(uniques, 0);
+  f_110_011_100_000_0(uniques, 0);
+  f_110_011_100_000_1(uniques, 0);
+  f_110_011_100_001_0(uniques, 0);
+  f_110_011_100_001_1(uniques, 0);
+  f_110_011_100_010_0(uniques, 0);
+  f_110_011_100_010_1(uniques, 0);
+  f_110_011_100_011_0(uniques, 0);
+  f_110_011_100_011_1(uniques, 0);
+  f_110_011_100_100_0(uniques, 0);
+  f_110_011_100_100_1(uniques, 0);
+  f_110_011_100_101_0(uniques, 0);
+  f_110_011_100_101_1(uniques, 0);
+  f_110_011_100_110_0(uniques, 0);
+  f_110_011_100_110_1(uniques, 0);
+  f_110_011_100_111_0(uniques, 0);
+  f_110_011_100_111_1(uniques, 0);
+  f_110_011_101_000_0(uniques, 0);
+  f_110_011_101_000_1(uniques, 0);
+  f_110_011_101_001_0(uniques, 0);
+  f_110_011_101_001_1(uniques, 0);
+  f_110_011_101_010_0(uniques, 0);
+  f_110_011_101_010_1(uniques, 0);
+  f_110_011_101_011_0(uniques, 0);
+  f_110_011_101_011_1(uniques, 0);
+  f_110_011_101_100_0(uniques, 0);
+  f_110_011_101_100_1(uniques, 0);
+  f_110_011_101_101_0(uniques, 0);
+  f_110_011_101_101_1(uniques, 0);
+  f_110_011_101_110_0(uniques, 0);
+  f_110_011_101_110_1(uniques, 0);
+  f_110_011_101_111_0(uniques, 0);
+  f_110_011_101_111_1(uniques, 0);
+  f_110_011_110_000_0(uniques, 0);
+  f_110_011_110_000_1(uniques, 0);
+  f_110_011_110_001_0(uniques, 0);
+  f_110_011_110_001_1(uniques, 0);
+  f_110_011_110_010_0(uniques, 0);
+  f_110_011_110_010_1(uniques, 0);
+  f_110_011_110_011_0(uniques, 0);
+  f_110_011_110_011_1(uniques, 0);
+  f_110_011_110_100_0(uniques, 0);
+  f_110_011_110_100_1(uniques, 0);
+  f_110_011_110_101_0(uniques, 0);
+  f_110_011_110_101_1(uniques, 0);
+  f_110_011_110_110_0(uniques, 0);
+  f_110_011_110_110_1(uniques, 0);
+  f_110_011_110_111_0(uniques, 0);
+  f_110_011_110_111_1(uniques, 0);
+  f_110_011_111_000_0(uniques, 0);
+  f_110_011_111_000_1(uniques, 0);
+  f_110_011_111_001_0(uniques, 0);
+  f_110_011_111_001_1(uniques, 0);
+  f_110_011_111_010_0(uniques, 0);
+  f_110_011_111_010_1(uniques, 0);
+  f_110_011_111_011_0(uniques, 0);
+  f_110_011_111_011_1(uniques, 0);
+  f_110_011_111_100_0(uniques, 0);
+  f_110_011_111_100_1(uniques, 0);
+  f_110_011_111_101_0(uniques, 0);
+  f_110_011_111_101_1(uniques, 0);
+  f_110_011_111_110_0(uniques, 0);
+  f_110_011_111_110_1(uniques, 0);
+  f_110_011_111_111_0(uniques, 0);
+  f_110_011_111_111_1(uniques, 0);
+  f_110_100_000_000_0(uniques, 0);
+  f_110_100_000_000_1(uniques, 0);
+  f_110_100_000_001_0(uniques, 0);
+  f_110_100_000_001_1(uniques, 0);
+  f_110_100_000_010_0(uniques, 0);
+  f_110_100_000_010_1(uniques, 0);
+  f_110_100_000_011_0(uniques, 0);
+  f_110_100_000_011_1(uniques, 0);
+  f_110_100_000_100_0(uniques, 0);
+  f_110_100_000_100_1(uniques, 0);
+  f_110_100_000_101_0(uniques, 0);
+  f_110_100_000_101_1(uniques, 0);
+  f_110_100_000_110_0(uniques, 0);
+  f_110_100_000_110_1(uniques, 0);
+  f_110_100_000_111_0(uniques, 0);
+  f_110_100_000_111_1(uniques, 0);
+  f_110_100_001_000_0(uniques, 0);
+  f_110_100_001_000_1(uniques, 0);
+  f_110_100_001_001_0(uniques, 0);
+  f_110_100_001_001_1(uniques, 0);
+  f_110_100_001_010_0(uniques, 0);
+  f_110_100_001_010_1(uniques, 0);
+  f_110_100_001_011_0(uniques, 0);
+  f_110_100_001_011_1(uniques, 0);
+  f_110_100_001_100_0(uniques, 0);
+  f_110_100_001_100_1(uniques, 0);
+  f_110_100_001_101_0(uniques, 0);
+  f_110_100_001_101_1(uniques, 0);
+  f_110_100_001_110_0(uniques, 0);
+  f_110_100_001_110_1(uniques, 0);
+  f_110_100_001_111_0(uniques, 0);
+  f_110_100_001_111_1(uniques, 0);
+  f_110_100_010_000_0(uniques, 0);
+  f_110_100_010_000_1(uniques, 0);
+  f_110_100_010_001_0(uniques, 0);
+  f_110_100_010_001_1(uniques, 0);
+  f_110_100_010_010_0(uniques, 0);
+  f_110_100_010_010_1(uniques, 0);
+  f_110_100_010_011_0(uniques, 0);
+  f_110_100_010_011_1(uniques, 0);
+  f_110_100_010_100_0(uniques, 0);
+  f_110_100_010_100_1(uniques, 0);
+  f_110_100_010_101_0(uniques, 0);
+  f_110_100_010_101_1(uniques, 0);
+  f_110_100_010_110_0(uniques, 0);
+  f_110_100_010_110_1(uniques, 0);
+  f_110_100_010_111_0(uniques, 0);
+  f_110_100_010_111_1(uniques, 0);
+  f_110_100_011_000_0(uniques, 0);
+  f_110_100_011_000_1(uniques, 0);
+  f_110_100_011_001_0(uniques, 0);
+  f_110_100_011_001_1(uniques, 0);
+  f_110_100_011_010_0(uniques, 0);
+  f_110_100_011_010_1(uniques, 0);
+  f_110_100_011_011_0(uniques, 0);
+  f_110_100_011_011_1(uniques, 0);
+  f_110_100_011_100_0(uniques, 0);
+  f_110_100_011_100_1(uniques, 0);
+  f_110_100_011_101_0(uniques, 0);
+  f_110_100_011_101_1(uniques, 0);
+  f_110_100_011_110_0(uniques, 0);
+  f_110_100_011_110_1(uniques, 0);
+  f_110_100_011_111_0(uniques, 0);
+  f_110_100_011_111_1(uniques, 0);
+  f_110_100_100_000_0(uniques, 0);
+  f_110_100_100_000_1(uniques, 0);
+  f_110_100_100_001_0(uniques, 0);
+  f_110_100_100_001_1(uniques, 0);
+  f_110_100_100_010_0(uniques, 0);
+  f_110_100_100_010_1(uniques, 0);
+  f_110_100_100_011_0(uniques, 0);
+  f_110_100_100_011_1(uniques, 0);
+  f_110_100_100_100_0(uniques, 0);
+  f_110_100_100_100_1(uniques, 0);
+  f_110_100_100_101_0(uniques, 0);
+  f_110_100_100_101_1(uniques, 0);
+  f_110_100_100_110_0(uniques, 0);
+  f_110_100_100_110_1(uniques, 0);
+  f_110_100_100_111_0(uniques, 0);
+  f_110_100_100_111_1(uniques, 0);
+  f_110_100_101_000_0(uniques, 0);
+  f_110_100_101_000_1(uniques, 0);
+  f_110_100_101_001_0(uniques, 0);
+  f_110_100_101_001_1(uniques, 0);
+  f_110_100_101_010_0(uniques, 0);
+  f_110_100_101_010_1(uniques, 0);
+  f_110_100_101_011_0(uniques, 0);
+  f_110_100_101_011_1(uniques, 0);
+  f_110_100_101_100_0(uniques, 0);
+  f_110_100_101_100_1(uniques, 0);
+  f_110_100_101_101_0(uniques, 0);
+  f_110_100_101_101_1(uniques, 0);
+  f_110_100_101_110_0(uniques, 0);
+  f_110_100_101_110_1(uniques, 0);
+  f_110_100_101_111_0(uniques, 0);
+  f_110_100_101_111_1(uniques, 0);
+  f_110_100_110_000_0(uniques, 0);
+  f_110_100_110_000_1(uniques, 0);
+  f_110_100_110_001_0(uniques, 0);
+  f_110_100_110_001_1(uniques, 0);
+  f_110_100_110_010_0(uniques, 0);
+  f_110_100_110_010_1(uniques, 0);
+  f_110_100_110_011_0(uniques, 0);
+  f_110_100_110_011_1(uniques, 0);
+  f_110_100_110_100_0(uniques, 0);
+  f_110_100_110_100_1(uniques, 0);
+  f_110_100_110_101_0(uniques, 0);
+  f_110_100_110_101_1(uniques, 0);
+  f_110_100_110_110_0(uniques, 0);
+  f_110_100_110_110_1(uniques, 0);
+  f_110_100_110_111_0(uniques, 0);
+  f_110_100_110_111_1(uniques, 0);
+  f_110_100_111_000_0(uniques, 0);
+  f_110_100_111_000_1(uniques, 0);
+  f_110_100_111_001_0(uniques, 0);
+  f_110_100_111_001_1(uniques, 0);
+  f_110_100_111_010_0(uniques, 0);
+  f_110_100_111_010_1(uniques, 0);
+  f_110_100_111_011_0(uniques, 0);
+  f_110_100_111_011_1(uniques, 0);
+  f_110_100_111_100_0(uniques, 0);
+  f_110_100_111_100_1(uniques, 0);
+  f_110_100_111_101_0(uniques, 0);
+  f_110_100_111_101_1(uniques, 0);
+  f_110_100_111_110_0(uniques, 0);
+  f_110_100_111_110_1(uniques, 0);
+  f_110_100_111_111_0(uniques, 0);
+  f_110_100_111_111_1(uniques, 0);
+  f_110_101_000_000_0(uniques, 0);
+  f_110_101_000_000_1(uniques, 0);
+  f_110_101_000_001_0(uniques, 0);
+  f_110_101_000_001_1(uniques, 0);
+  f_110_101_000_010_0(uniques, 0);
+  f_110_101_000_010_1(uniques, 0);
+  f_110_101_000_011_0(uniques, 0);
+  f_110_101_000_011_1(uniques, 0);
+  f_110_101_000_100_0(uniques, 0);
+  f_110_101_000_100_1(uniques, 0);
+  f_110_101_000_101_0(uniques, 0);
+  f_110_101_000_101_1(uniques, 0);
+  f_110_101_000_110_0(uniques, 0);
+  f_110_101_000_110_1(uniques, 0);
+  f_110_101_000_111_0(uniques, 0);
+  f_110_101_000_111_1(uniques, 0);
+  f_110_101_001_000_0(uniques, 0);
+  f_110_101_001_000_1(uniques, 0);
+  f_110_101_001_001_0(uniques, 0);
+  f_110_101_001_001_1(uniques, 0);
+  f_110_101_001_010_0(uniques, 0);
+  f_110_101_001_010_1(uniques, 0);
+  f_110_101_001_011_0(uniques, 0);
+  f_110_101_001_011_1(uniques, 0);
+  f_110_101_001_100_0(uniques, 0);
+  f_110_101_001_100_1(uniques, 0);
+  f_110_101_001_101_0(uniques, 0);
+  f_110_101_001_101_1(uniques, 0);
+  f_110_101_001_110_0(uniques, 0);
+  f_110_101_001_110_1(uniques, 0);
+  f_110_101_001_111_0(uniques, 0);
+  f_110_101_001_111_1(uniques, 0);
+  f_110_101_010_000_0(uniques, 0);
+  f_110_101_010_000_1(uniques, 0);
+  f_110_101_010_001_0(uniques, 0);
+  f_110_101_010_001_1(uniques, 0);
+  f_110_101_010_010_0(uniques, 0);
+  f_110_101_010_010_1(uniques, 0);
+  f_110_101_010_011_0(uniques, 0);
+  f_110_101_010_011_1(uniques, 0);
+  f_110_101_010_100_0(uniques, 0);
+  f_110_101_010_100_1(uniques, 0);
+  f_110_101_010_101_0(uniques, 0);
+  f_110_101_010_101_1(uniques, 0);
+  f_110_101_010_110_0(uniques, 0);
+  f_110_101_010_110_1(uniques, 0);
+  f_110_101_010_111_0(uniques, 0);
+  f_110_101_010_111_1(uniques, 0);
+  f_110_101_011_000_0(uniques, 0);
+  f_110_101_011_000_1(uniques, 0);
+  f_110_101_011_001_0(uniques, 0);
+  f_110_101_011_001_1(uniques, 0);
+  f_110_101_011_010_0(uniques, 0);
+  f_110_101_011_010_1(uniques, 0);
+  f_110_101_011_011_0(uniques, 0);
+  f_110_101_011_011_1(uniques, 0);
+  f_110_101_011_100_0(uniques, 0);
+  f_110_101_011_100_1(uniques, 0);
+  f_110_101_011_101_0(uniques, 0);
+  f_110_101_011_101_1(uniques, 0);
+  f_110_101_011_110_0(uniques, 0);
+  f_110_101_011_110_1(uniques, 0);
+  f_110_101_011_111_0(uniques, 0);
+  f_110_101_011_111_1(uniques, 0);
+  f_110_101_100_000_0(uniques, 0);
+  f_110_101_100_000_1(uniques, 0);
+  f_110_101_100_001_0(uniques, 0);
+  f_110_101_100_001_1(uniques, 0);
+  f_110_101_100_010_0(uniques, 0);
+  f_110_101_100_010_1(uniques, 0);
+  f_110_101_100_011_0(uniques, 0);
+  f_110_101_100_011_1(uniques, 0);
+  f_110_101_100_100_0(uniques, 0);
+  f_110_101_100_100_1(uniques, 0);
+  f_110_101_100_101_0(uniques, 0);
+  f_110_101_100_101_1(uniques, 0);
+  f_110_101_100_110_0(uniques, 0);
+  f_110_101_100_110_1(uniques, 0);
+  f_110_101_100_111_0(uniques, 0);
+  f_110_101_100_111_1(uniques, 0);
+  f_110_101_101_000_0(uniques, 0);
+  f_110_101_101_000_1(uniques, 0);
+  f_110_101_101_001_0(uniques, 0);
+  f_110_101_101_001_1(uniques, 0);
+  f_110_101_101_010_0(uniques, 0);
+  f_110_101_101_010_1(uniques, 0);
+  f_110_101_101_011_0(uniques, 0);
+  f_110_101_101_011_1(uniques, 0);
+  f_110_101_101_100_0(uniques, 0);
+  f_110_101_101_100_1(uniques, 0);
+  f_110_101_101_101_0(uniques, 0);
+  f_110_101_101_101_1(uniques, 0);
+  f_110_101_101_110_0(uniques, 0);
+  f_110_101_101_110_1(uniques, 0);
+  f_110_101_101_111_0(uniques, 0);
+  f_110_101_101_111_1(uniques, 0);
+  f_110_101_110_000_0(uniques, 0);
+  f_110_101_110_000_1(uniques, 0);
+  f_110_101_110_001_0(uniques, 0);
+  f_110_101_110_001_1(uniques, 0);
+  f_110_101_110_010_0(uniques, 0);
+  f_110_101_110_010_1(uniques, 0);
+  f_110_101_110_011_0(uniques, 0);
+  f_110_101_110_011_1(uniques, 0);
+  f_110_101_110_100_0(uniques, 0);
+  f_110_101_110_100_1(uniques, 0);
+  f_110_101_110_101_0(uniques, 0);
+  f_110_101_110_101_1(uniques, 0);
+  f_110_101_110_110_0(uniques, 0);
+  f_110_101_110_110_1(uniques, 0);
+  f_110_101_110_111_0(uniques, 0);
+  f_110_101_110_111_1(uniques, 0);
+  f_110_101_111_000_0(uniques, 0);
+  f_110_101_111_000_1(uniques, 0);
+  f_110_101_111_001_0(uniques, 0);
+  f_110_101_111_001_1(uniques, 0);
+  f_110_101_111_010_0(uniques, 0);
+  f_110_101_111_010_1(uniques, 0);
+  f_110_101_111_011_0(uniques, 0);
+  f_110_101_111_011_1(uniques, 0);
+  f_110_101_111_100_0(uniques, 0);
+  f_110_101_111_100_1(uniques, 0);
+  f_110_101_111_101_0(uniques, 0);
+  f_110_101_111_101_1(uniques, 0);
+  f_110_101_111_110_0(uniques, 0);
+  f_110_101_111_110_1(uniques, 0);
+  f_110_101_111_111_0(uniques, 0);
+  f_110_101_111_111_1(uniques, 0);
+  f_110_110_000_000_0(uniques, 0);
+  f_110_110_000_000_1(uniques, 0);
+  f_110_110_000_001_0(uniques, 0);
+  f_110_110_000_001_1(uniques, 0);
+  f_110_110_000_010_0(uniques, 0);
+  f_110_110_000_010_1(uniques, 0);
+  f_110_110_000_011_0(uniques, 0);
+  f_110_110_000_011_1(uniques, 0);
+  f_110_110_000_100_0(uniques, 0);
+  f_110_110_000_100_1(uniques, 0);
+  f_110_110_000_101_0(uniques, 0);
+  f_110_110_000_101_1(uniques, 0);
+  f_110_110_000_110_0(uniques, 0);
+  f_110_110_000_110_1(uniques, 0);
+  f_110_110_000_111_0(uniques, 0);
+  f_110_110_000_111_1(uniques, 0);
+  f_110_110_001_000_0(uniques, 0);
+  f_110_110_001_000_1(uniques, 0);
+  f_110_110_001_001_0(uniques, 0);
+  f_110_110_001_001_1(uniques, 0);
+  f_110_110_001_010_0(uniques, 0);
+  f_110_110_001_010_1(uniques, 0);
+  f_110_110_001_011_0(uniques, 0);
+  f_110_110_001_011_1(uniques, 0);
+  f_110_110_001_100_0(uniques, 0);
+  f_110_110_001_100_1(uniques, 0);
+  f_110_110_001_101_0(uniques, 0);
+  f_110_110_001_101_1(uniques, 0);
+  f_110_110_001_110_0(uniques, 0);
+  f_110_110_001_110_1(uniques, 0);
+  f_110_110_001_111_0(uniques, 0);
+  f_110_110_001_111_1(uniques, 0);
+  f_110_110_010_000_0(uniques, 0);
+  f_110_110_010_000_1(uniques, 0);
+  f_110_110_010_001_0(uniques, 0);
+  f_110_110_010_001_1(uniques, 0);
+  f_110_110_010_010_0(uniques, 0);
+  f_110_110_010_010_1(uniques, 0);
+  f_110_110_010_011_0(uniques, 0);
+  f_110_110_010_011_1(uniques, 0);
+  f_110_110_010_100_0(uniques, 0);
+  f_110_110_010_100_1(uniques, 0);
+  f_110_110_010_101_0(uniques, 0);
+  f_110_110_010_101_1(uniques, 0);
+  f_110_110_010_110_0(uniques, 0);
+  f_110_110_010_110_1(uniques, 0);
+  f_110_110_010_111_0(uniques, 0);
+  f_110_110_010_111_1(uniques, 0);
+  f_110_110_011_000_0(uniques, 0);
+  f_110_110_011_000_1(uniques, 0);
+  f_110_110_011_001_0(uniques, 0);
+  f_110_110_011_001_1(uniques, 0);
+  f_110_110_011_010_0(uniques, 0);
+  f_110_110_011_010_1(uniques, 0);
+  f_110_110_011_011_0(uniques, 0);
+  f_110_110_011_011_1(uniques, 0);
+  f_110_110_011_100_0(uniques, 0);
+  f_110_110_011_100_1(uniques, 0);
+  f_110_110_011_101_0(uniques, 0);
+  f_110_110_011_101_1(uniques, 0);
+  f_110_110_011_110_0(uniques, 0);
+  f_110_110_011_110_1(uniques, 0);
+  f_110_110_011_111_0(uniques, 0);
+  f_110_110_011_111_1(uniques, 0);
+  f_110_110_100_000_0(uniques, 0);
+  f_110_110_100_000_1(uniques, 0);
+  f_110_110_100_001_0(uniques, 0);
+  f_110_110_100_001_1(uniques, 0);
+  f_110_110_100_010_0(uniques, 0);
+  f_110_110_100_010_1(uniques, 0);
+  f_110_110_100_011_0(uniques, 0);
+  f_110_110_100_011_1(uniques, 0);
+  f_110_110_100_100_0(uniques, 0);
+  f_110_110_100_100_1(uniques, 0);
+  f_110_110_100_101_0(uniques, 0);
+  f_110_110_100_101_1(uniques, 0);
+  f_110_110_100_110_0(uniques, 0);
+  f_110_110_100_110_1(uniques, 0);
+  f_110_110_100_111_0(uniques, 0);
+  f_110_110_100_111_1(uniques, 0);
+  f_110_110_101_000_0(uniques, 0);
+  f_110_110_101_000_1(uniques, 0);
+  f_110_110_101_001_0(uniques, 0);
+  f_110_110_101_001_1(uniques, 0);
+  f_110_110_101_010_0(uniques, 0);
+  f_110_110_101_010_1(uniques, 0);
+  f_110_110_101_011_0(uniques, 0);
+  f_110_110_101_011_1(uniques, 0);
+  f_110_110_101_100_0(uniques, 0);
+  f_110_110_101_100_1(uniques, 0);
+  f_110_110_101_101_0(uniques, 0);
+  f_110_110_101_101_1(uniques, 0);
+  f_110_110_101_110_0(uniques, 0);
+  f_110_110_101_110_1(uniques, 0);
+  f_110_110_101_111_0(uniques, 0);
+  f_110_110_101_111_1(uniques, 0);
+  f_110_110_110_000_0(uniques, 0);
+  f_110_110_110_000_1(uniques, 0);
+  f_110_110_110_001_0(uniques, 0);
+  f_110_110_110_001_1(uniques, 0);
+  f_110_110_110_010_0(uniques, 0);
+  f_110_110_110_010_1(uniques, 0);
+  f_110_110_110_011_0(uniques, 0);
+  f_110_110_110_011_1(uniques, 0);
+  f_110_110_110_100_0(uniques, 0);
+  f_110_110_110_100_1(uniques, 0);
+  f_110_110_110_101_0(uniques, 0);
+  f_110_110_110_101_1(uniques, 0);
+  f_110_110_110_110_0(uniques, 0);
+  f_110_110_110_110_1(uniques, 0);
+  f_110_110_110_111_0(uniques, 0);
+  f_110_110_110_111_1(uniques, 0);
+  f_110_110_111_000_0(uniques, 0);
+  f_110_110_111_000_1(uniques, 0);
+  f_110_110_111_001_0(uniques, 0);
+  f_110_110_111_001_1(uniques, 0);
+  f_110_110_111_010_0(uniques, 0);
+  f_110_110_111_010_1(uniques, 0);
+  f_110_110_111_011_0(uniques, 0);
+  f_110_110_111_011_1(uniques, 0);
+  f_110_110_111_100_0(uniques, 0);
+  f_110_110_111_100_1(uniques, 0);
+  f_110_110_111_101_0(uniques, 0);
+  f_110_110_111_101_1(uniques, 0);
+  f_110_110_111_110_0(uniques, 0);
+  f_110_110_111_110_1(uniques, 0);
+  f_110_110_111_111_0(uniques, 0);
+  f_110_110_111_111_1(uniques, 0);
+  f_110_111_000_000_0(uniques, 0);
+  f_110_111_000_000_1(uniques, 0);
+  f_110_111_000_001_0(uniques, 0);
+  f_110_111_000_001_1(uniques, 0);
+  f_110_111_000_010_0(uniques, 0);
+  f_110_111_000_010_1(uniques, 0);
+  f_110_111_000_011_0(uniques, 0);
+  f_110_111_000_011_1(uniques, 0);
+  f_110_111_000_100_0(uniques, 0);
+  f_110_111_000_100_1(uniques, 0);
+  f_110_111_000_101_0(uniques, 0);
+  f_110_111_000_101_1(uniques, 0);
+  f_110_111_000_110_0(uniques, 0);
+  f_110_111_000_110_1(uniques, 0);
+  f_110_111_000_111_0(uniques, 0);
+  f_110_111_000_111_1(uniques, 0);
+  f_110_111_001_000_0(uniques, 0);
+  f_110_111_001_000_1(uniques, 0);
+  f_110_111_001_001_0(uniques, 0);
+  f_110_111_001_001_1(uniques, 0);
+  f_110_111_001_010_0(uniques, 0);
+  f_110_111_001_010_1(uniques, 0);
+  f_110_111_001_011_0(uniques, 0);
+  f_110_111_001_011_1(uniques, 0);
+  f_110_111_001_100_0(uniques, 0);
+  f_110_111_001_100_1(uniques, 0);
+  f_110_111_001_101_0(uniques, 0);
+  f_110_111_001_101_1(uniques, 0);
+  f_110_111_001_110_0(uniques, 0);
+  f_110_111_001_110_1(uniques, 0);
+  f_110_111_001_111_0(uniques, 0);
+  f_110_111_001_111_1(uniques, 0);
+  f_110_111_010_000_0(uniques, 0);
+  f_110_111_010_000_1(uniques, 0);
+  f_110_111_010_001_0(uniques, 0);
+  f_110_111_010_001_1(uniques, 0);
+  f_110_111_010_010_0(uniques, 0);
+  f_110_111_010_010_1(uniques, 0);
+  f_110_111_010_011_0(uniques, 0);
+  f_110_111_010_011_1(uniques, 0);
+  f_110_111_010_100_0(uniques, 0);
+  f_110_111_010_100_1(uniques, 0);
+  f_110_111_010_101_0(uniques, 0);
+  f_110_111_010_101_1(uniques, 0);
+  f_110_111_010_110_0(uniques, 0);
+  f_110_111_010_110_1(uniques, 0);
+  f_110_111_010_111_0(uniques, 0);
+  f_110_111_010_111_1(uniques, 0);
+  f_110_111_011_000_0(uniques, 0);
+  f_110_111_011_000_1(uniques, 0);
+  f_110_111_011_001_0(uniques, 0);
+  f_110_111_011_001_1(uniques, 0);
+  f_110_111_011_010_0(uniques, 0);
+  f_110_111_011_010_1(uniques, 0);
+  f_110_111_011_011_0(uniques, 0);
+  f_110_111_011_011_1(uniques, 0);
+  f_110_111_011_100_0(uniques, 0);
+  f_110_111_011_100_1(uniques, 0);
+  f_110_111_011_101_0(uniques, 0);
+  f_110_111_011_101_1(uniques, 0);
+  f_110_111_011_110_0(uniques, 0);
+  f_110_111_011_110_1(uniques, 0);
+  f_110_111_011_111_0(uniques, 0);
+  f_110_111_011_111_1(uniques, 0);
+  f_110_111_100_000_0(uniques, 0);
+  f_110_111_100_000_1(uniques, 0);
+  f_110_111_100_001_0(uniques, 0);
+  f_110_111_100_001_1(uniques, 0);
+  f_110_111_100_010_0(uniques, 0);
+  f_110_111_100_010_1(uniques, 0);
+  f_110_111_100_011_0(uniques, 0);
+  f_110_111_100_011_1(uniques, 0);
+  f_110_111_100_100_0(uniques, 0);
+  f_110_111_100_100_1(uniques, 0);
+  f_110_111_100_101_0(uniques, 0);
+  f_110_111_100_101_1(uniques, 0);
+  f_110_111_100_110_0(uniques, 0);
+  f_110_111_100_110_1(uniques, 0);
+  f_110_111_100_111_0(uniques, 0);
+  f_110_111_100_111_1(uniques, 0);
+  f_110_111_101_000_0(uniques, 0);
+  f_110_111_101_000_1(uniques, 0);
+  f_110_111_101_001_0(uniques, 0);
+  f_110_111_101_001_1(uniques, 0);
+  f_110_111_101_010_0(uniques, 0);
+  f_110_111_101_010_1(uniques, 0);
+  f_110_111_101_011_0(uniques, 0);
+  f_110_111_101_011_1(uniques, 0);
+  f_110_111_101_100_0(uniques, 0);
+  f_110_111_101_100_1(uniques, 0);
+  f_110_111_101_101_0(uniques, 0);
+  f_110_111_101_101_1(uniques, 0);
+  f_110_111_101_110_0(uniques, 0);
+  f_110_111_101_110_1(uniques, 0);
+  f_110_111_101_111_0(uniques, 0);
+  f_110_111_101_111_1(uniques, 0);
+  f_110_111_110_000_0(uniques, 0);
+  f_110_111_110_000_1(uniques, 0);
+  f_110_111_110_001_0(uniques, 0);
+  f_110_111_110_001_1(uniques, 0);
+  f_110_111_110_010_0(uniques, 0);
+  f_110_111_110_010_1(uniques, 0);
+  f_110_111_110_011_0(uniques, 0);
+  f_110_111_110_011_1(uniques, 0);
+  f_110_111_110_100_0(uniques, 0);
+  f_110_111_110_100_1(uniques, 0);
+  f_110_111_110_101_0(uniques, 0);
+  f_110_111_110_101_1(uniques, 0);
+  f_110_111_110_110_0(uniques, 0);
+  f_110_111_110_110_1(uniques, 0);
+  f_110_111_110_111_0(uniques, 0);
+  f_110_111_110_111_1(uniques, 0);
+  f_110_111_111_000_0(uniques, 0);
+  f_110_111_111_000_1(uniques, 0);
+  f_110_111_111_001_0(uniques, 0);
+  f_110_111_111_001_1(uniques, 0);
+  f_110_111_111_010_0(uniques, 0);
+  f_110_111_111_010_1(uniques, 0);
+  f_110_111_111_011_0(uniques, 0);
+  f_110_111_111_011_1(uniques, 0);
+  f_110_111_111_100_0(uniques, 0);
+  f_110_111_111_100_1(uniques, 0);
+  f_110_111_111_101_0(uniques, 0);
+  f_110_111_111_101_1(uniques, 0);
+  f_110_111_111_110_0(uniques, 0);
+  f_110_111_111_110_1(uniques, 0);
+  f_110_111_111_111_0(uniques, 0);
+  f_110_111_111_111_1(uniques, 0);
+  f_111_000_000_000_0(uniques, 0);
+  f_111_000_000_000_1(uniques, 0);
+  f_111_000_000_001_0(uniques, 0);
+  f_111_000_000_001_1(uniques, 0);
+  f_111_000_000_010_0(uniques, 0);
+  f_111_000_000_010_1(uniques, 0);
+  f_111_000_000_011_0(uniques, 0);
+  f_111_000_000_011_1(uniques, 0);
+  f_111_000_000_100_0(uniques, 0);
+  f_111_000_000_100_1(uniques, 0);
+  f_111_000_000_101_0(uniques, 0);
+  f_111_000_000_101_1(uniques, 0);
+  f_111_000_000_110_0(uniques, 0);
+  f_111_000_000_110_1(uniques, 0);
+  f_111_000_000_111_0(uniques, 0);
+  f_111_000_000_111_1(uniques, 0);
+  f_111_000_001_000_0(uniques, 0);
+  f_111_000_001_000_1(uniques, 0);
+  f_111_000_001_001_0(uniques, 0);
+  f_111_000_001_001_1(uniques, 0);
+  f_111_000_001_010_0(uniques, 0);
+  f_111_000_001_010_1(uniques, 0);
+  f_111_000_001_011_0(uniques, 0);
+  f_111_000_001_011_1(uniques, 0);
+  f_111_000_001_100_0(uniques, 0);
+  f_111_000_001_100_1(uniques, 0);
+  f_111_000_001_101_0(uniques, 0);
+  f_111_000_001_101_1(uniques, 0);
+  f_111_000_001_110_0(uniques, 0);
+  f_111_000_001_110_1(uniques, 0);
+  f_111_000_001_111_0(uniques, 0);
+  f_111_000_001_111_1(uniques, 0);
+  f_111_000_010_000_0(uniques, 0);
+  f_111_000_010_000_1(uniques, 0);
+  f_111_000_010_001_0(uniques, 0);
+  f_111_000_010_001_1(uniques, 0);
+  f_111_000_010_010_0(uniques, 0);
+  f_111_000_010_010_1(uniques, 0);
+  f_111_000_010_011_0(uniques, 0);
+  f_111_000_010_011_1(uniques, 0);
+  f_111_000_010_100_0(uniques, 0);
+  f_111_000_010_100_1(uniques, 0);
+  f_111_000_010_101_0(uniques, 0);
+  f_111_000_010_101_1(uniques, 0);
+  f_111_000_010_110_0(uniques, 0);
+  f_111_000_010_110_1(uniques, 0);
+  f_111_000_010_111_0(uniques, 0);
+  f_111_000_010_111_1(uniques, 0);
+  f_111_000_011_000_0(uniques, 0);
+  f_111_000_011_000_1(uniques, 0);
+  f_111_000_011_001_0(uniques, 0);
+  f_111_000_011_001_1(uniques, 0);
+  f_111_000_011_010_0(uniques, 0);
+  f_111_000_011_010_1(uniques, 0);
+  f_111_000_011_011_0(uniques, 0);
+  f_111_000_011_011_1(uniques, 0);
+  f_111_000_011_100_0(uniques, 0);
+  f_111_000_011_100_1(uniques, 0);
+  f_111_000_011_101_0(uniques, 0);
+  f_111_000_011_101_1(uniques, 0);
+  f_111_000_011_110_0(uniques, 0);
+  f_111_000_011_110_1(uniques, 0);
+  f_111_000_011_111_0(uniques, 0);
+  f_111_000_011_111_1(uniques, 0);
+  f_111_000_100_000_0(uniques, 0);
+  f_111_000_100_000_1(uniques, 0);
+  f_111_000_100_001_0(uniques, 0);
+  f_111_000_100_001_1(uniques, 0);
+  f_111_000_100_010_0(uniques, 0);
+  f_111_000_100_010_1(uniques, 0);
+  f_111_000_100_011_0(uniques, 0);
+  f_111_000_100_011_1(uniques, 0);
+  f_111_000_100_100_0(uniques, 0);
+  f_111_000_100_100_1(uniques, 0);
+  f_111_000_100_101_0(uniques, 0);
+  f_111_000_100_101_1(uniques, 0);
+  f_111_000_100_110_0(uniques, 0);
+  f_111_000_100_110_1(uniques, 0);
+  f_111_000_100_111_0(uniques, 0);
+  f_111_000_100_111_1(uniques, 0);
+  f_111_000_101_000_0(uniques, 0);
+  f_111_000_101_000_1(uniques, 0);
+  f_111_000_101_001_0(uniques, 0);
+  f_111_000_101_001_1(uniques, 0);
+  f_111_000_101_010_0(uniques, 0);
+  f_111_000_101_010_1(uniques, 0);
+  f_111_000_101_011_0(uniques, 0);
+  f_111_000_101_011_1(uniques, 0);
+  f_111_000_101_100_0(uniques, 0);
+  f_111_000_101_100_1(uniques, 0);
+  f_111_000_101_101_0(uniques, 0);
+  f_111_000_101_101_1(uniques, 0);
+  f_111_000_101_110_0(uniques, 0);
+  f_111_000_101_110_1(uniques, 0);
+  f_111_000_101_111_0(uniques, 0);
+  f_111_000_101_111_1(uniques, 0);
+  f_111_000_110_000_0(uniques, 0);
+  f_111_000_110_000_1(uniques, 0);
+  f_111_000_110_001_0(uniques, 0);
+  f_111_000_110_001_1(uniques, 0);
+  f_111_000_110_010_0(uniques, 0);
+  f_111_000_110_010_1(uniques, 0);
+  f_111_000_110_011_0(uniques, 0);
+  f_111_000_110_011_1(uniques, 0);
+  f_111_000_110_100_0(uniques, 0);
+  f_111_000_110_100_1(uniques, 0);
+  f_111_000_110_101_0(uniques, 0);
+  f_111_000_110_101_1(uniques, 0);
+  f_111_000_110_110_0(uniques, 0);
+  f_111_000_110_110_1(uniques, 0);
+  f_111_000_110_111_0(uniques, 0);
+  f_111_000_110_111_1(uniques, 0);
+  f_111_000_111_000_0(uniques, 0);
+  f_111_000_111_000_1(uniques, 0);
+  f_111_000_111_001_0(uniques, 0);
+  f_111_000_111_001_1(uniques, 0);
+  f_111_000_111_010_0(uniques, 0);
+  f_111_000_111_010_1(uniques, 0);
+  f_111_000_111_011_0(uniques, 0);
+  f_111_000_111_011_1(uniques, 0);
+  f_111_000_111_100_0(uniques, 0);
+  f_111_000_111_100_1(uniques, 0);
+  f_111_000_111_101_0(uniques, 0);
+  f_111_000_111_101_1(uniques, 0);
+  f_111_000_111_110_0(uniques, 0);
+  f_111_000_111_110_1(uniques, 0);
+  f_111_000_111_111_0(uniques, 0);
+  f_111_000_111_111_1(uniques, 0);
+  f_111_001_000_000_0(uniques, 0);
+  f_111_001_000_000_1(uniques, 0);
+  f_111_001_000_001_0(uniques, 0);
+  f_111_001_000_001_1(uniques, 0);
+  f_111_001_000_010_0(uniques, 0);
+  f_111_001_000_010_1(uniques, 0);
+  f_111_001_000_011_0(uniques, 0);
+  f_111_001_000_011_1(uniques, 0);
+  f_111_001_000_100_0(uniques, 0);
+  f_111_001_000_100_1(uniques, 0);
+  f_111_001_000_101_0(uniques, 0);
+  f_111_001_000_101_1(uniques, 0);
+  f_111_001_000_110_0(uniques, 0);
+  f_111_001_000_110_1(uniques, 0);
+  f_111_001_000_111_0(uniques, 0);
+  f_111_001_000_111_1(uniques, 0);
+  f_111_001_001_000_0(uniques, 0);
+  f_111_001_001_000_1(uniques, 0);
+  f_111_001_001_001_0(uniques, 0);
+  f_111_001_001_001_1(uniques, 0);
+  f_111_001_001_010_0(uniques, 0);
+  f_111_001_001_010_1(uniques, 0);
+  f_111_001_001_011_0(uniques, 0);
+  f_111_001_001_011_1(uniques, 0);
+  f_111_001_001_100_0(uniques, 0);
+  f_111_001_001_100_1(uniques, 0);
+  f_111_001_001_101_0(uniques, 0);
+  f_111_001_001_101_1(uniques, 0);
+  f_111_001_001_110_0(uniques, 0);
+  f_111_001_001_110_1(uniques, 0);
+  f_111_001_001_111_0(uniques, 0);
+  f_111_001_001_111_1(uniques, 0);
+  f_111_001_010_000_0(uniques, 0);
+  f_111_001_010_000_1(uniques, 0);
+  f_111_001_010_001_0(uniques, 0);
+  f_111_001_010_001_1(uniques, 0);
+  f_111_001_010_010_0(uniques, 0);
+  f_111_001_010_010_1(uniques, 0);
+  f_111_001_010_011_0(uniques, 0);
+  f_111_001_010_011_1(uniques, 0);
+  f_111_001_010_100_0(uniques, 0);
+  f_111_001_010_100_1(uniques, 0);
+  f_111_001_010_101_0(uniques, 0);
+  f_111_001_010_101_1(uniques, 0);
+  f_111_001_010_110_0(uniques, 0);
+  f_111_001_010_110_1(uniques, 0);
+  f_111_001_010_111_0(uniques, 0);
+  f_111_001_010_111_1(uniques, 0);
+  f_111_001_011_000_0(uniques, 0);
+  f_111_001_011_000_1(uniques, 0);
+  f_111_001_011_001_0(uniques, 0);
+  f_111_001_011_001_1(uniques, 0);
+  f_111_001_011_010_0(uniques, 0);
+  f_111_001_011_010_1(uniques, 0);
+  f_111_001_011_011_0(uniques, 0);
+  f_111_001_011_011_1(uniques, 0);
+  f_111_001_011_100_0(uniques, 0);
+  f_111_001_011_100_1(uniques, 0);
+  f_111_001_011_101_0(uniques, 0);
+  f_111_001_011_101_1(uniques, 0);
+  f_111_001_011_110_0(uniques, 0);
+  f_111_001_011_110_1(uniques, 0);
+  f_111_001_011_111_0(uniques, 0);
+  f_111_001_011_111_1(uniques, 0);
+  f_111_001_100_000_0(uniques, 0);
+  f_111_001_100_000_1(uniques, 0);
+  f_111_001_100_001_0(uniques, 0);
+  f_111_001_100_001_1(uniques, 0);
+  f_111_001_100_010_0(uniques, 0);
+  f_111_001_100_010_1(uniques, 0);
+  f_111_001_100_011_0(uniques, 0);
+  f_111_001_100_011_1(uniques, 0);
+  f_111_001_100_100_0(uniques, 0);
+  f_111_001_100_100_1(uniques, 0);
+  f_111_001_100_101_0(uniques, 0);
+  f_111_001_100_101_1(uniques, 0);
+  f_111_001_100_110_0(uniques, 0);
+  f_111_001_100_110_1(uniques, 0);
+  f_111_001_100_111_0(uniques, 0);
+  f_111_001_100_111_1(uniques, 0);
+  f_111_001_101_000_0(uniques, 0);
+  f_111_001_101_000_1(uniques, 0);
+  f_111_001_101_001_0(uniques, 0);
+  f_111_001_101_001_1(uniques, 0);
+  f_111_001_101_010_0(uniques, 0);
+  f_111_001_101_010_1(uniques, 0);
+  f_111_001_101_011_0(uniques, 0);
+  f_111_001_101_011_1(uniques, 0);
+  f_111_001_101_100_0(uniques, 0);
+  f_111_001_101_100_1(uniques, 0);
+  f_111_001_101_101_0(uniques, 0);
+  f_111_001_101_101_1(uniques, 0);
+  f_111_001_101_110_0(uniques, 0);
+  f_111_001_101_110_1(uniques, 0);
+  f_111_001_101_111_0(uniques, 0);
+  f_111_001_101_111_1(uniques, 0);
+  f_111_001_110_000_0(uniques, 0);
+  f_111_001_110_000_1(uniques, 0);
+  f_111_001_110_001_0(uniques, 0);
+  f_111_001_110_001_1(uniques, 0);
+  f_111_001_110_010_0(uniques, 0);
+  f_111_001_110_010_1(uniques, 0);
+  f_111_001_110_011_0(uniques, 0);
+  f_111_001_110_011_1(uniques, 0);
+  f_111_001_110_100_0(uniques, 0);
+  f_111_001_110_100_1(uniques, 0);
+  f_111_001_110_101_0(uniques, 0);
+  f_111_001_110_101_1(uniques, 0);
+  f_111_001_110_110_0(uniques, 0);
+  f_111_001_110_110_1(uniques, 0);
+  f_111_001_110_111_0(uniques, 0);
+  f_111_001_110_111_1(uniques, 0);
+  f_111_001_111_000_0(uniques, 0);
+  f_111_001_111_000_1(uniques, 0);
+  f_111_001_111_001_0(uniques, 0);
+  f_111_001_111_001_1(uniques, 0);
+  f_111_001_111_010_0(uniques, 0);
+  f_111_001_111_010_1(uniques, 0);
+  f_111_001_111_011_0(uniques, 0);
+  f_111_001_111_011_1(uniques, 0);
+  f_111_001_111_100_0(uniques, 0);
+  f_111_001_111_100_1(uniques, 0);
+  f_111_001_111_101_0(uniques, 0);
+  f_111_001_111_101_1(uniques, 0);
+  f_111_001_111_110_0(uniques, 0);
+  f_111_001_111_110_1(uniques, 0);
+  f_111_001_111_111_0(uniques, 0);
+  f_111_001_111_111_1(uniques, 0);
+  f_111_010_000_000_0(uniques, 0);
+  f_111_010_000_000_1(uniques, 0);
+  f_111_010_000_001_0(uniques, 0);
+  f_111_010_000_001_1(uniques, 0);
+  f_111_010_000_010_0(uniques, 0);
+  f_111_010_000_010_1(uniques, 0);
+  f_111_010_000_011_0(uniques, 0);
+  f_111_010_000_011_1(uniques, 0);
+  f_111_010_000_100_0(uniques, 0);
+  f_111_010_000_100_1(uniques, 0);
+  f_111_010_000_101_0(uniques, 0);
+  f_111_010_000_101_1(uniques, 0);
+  f_111_010_000_110_0(uniques, 0);
+  f_111_010_000_110_1(uniques, 0);
+  f_111_010_000_111_0(uniques, 0);
+  f_111_010_000_111_1(uniques, 0);
+  f_111_010_001_000_0(uniques, 0);
+  f_111_010_001_000_1(uniques, 0);
+  f_111_010_001_001_0(uniques, 0);
+  f_111_010_001_001_1(uniques, 0);
+  f_111_010_001_010_0(uniques, 0);
+  f_111_010_001_010_1(uniques, 0);
+  f_111_010_001_011_0(uniques, 0);
+  f_111_010_001_011_1(uniques, 0);
+  f_111_010_001_100_0(uniques, 0);
+  f_111_010_001_100_1(uniques, 0);
+  f_111_010_001_101_0(uniques, 0);
+  f_111_010_001_101_1(uniques, 0);
+  f_111_010_001_110_0(uniques, 0);
+  f_111_010_001_110_1(uniques, 0);
+  f_111_010_001_111_0(uniques, 0);
+  f_111_010_001_111_1(uniques, 0);
+  f_111_010_010_000_0(uniques, 0);
+  f_111_010_010_000_1(uniques, 0);
+  f_111_010_010_001_0(uniques, 0);
+  f_111_010_010_001_1(uniques, 0);
+  f_111_010_010_010_0(uniques, 0);
+  f_111_010_010_010_1(uniques, 0);
+  f_111_010_010_011_0(uniques, 0);
+  f_111_010_010_011_1(uniques, 0);
+  f_111_010_010_100_0(uniques, 0);
+  f_111_010_010_100_1(uniques, 0);
+  f_111_010_010_101_0(uniques, 0);
+  f_111_010_010_101_1(uniques, 0);
+  f_111_010_010_110_0(uniques, 0);
+  f_111_010_010_110_1(uniques, 0);
+  f_111_010_010_111_0(uniques, 0);
+  f_111_010_010_111_1(uniques, 0);
+  f_111_010_011_000_0(uniques, 0);
+  f_111_010_011_000_1(uniques, 0);
+  f_111_010_011_001_0(uniques, 0);
+  f_111_010_011_001_1(uniques, 0);
+  f_111_010_011_010_0(uniques, 0);
+  f_111_010_011_010_1(uniques, 0);
+  f_111_010_011_011_0(uniques, 0);
+  f_111_010_011_011_1(uniques, 0);
+  f_111_010_011_100_0(uniques, 0);
+  f_111_010_011_100_1(uniques, 0);
+  f_111_010_011_101_0(uniques, 0);
+  f_111_010_011_101_1(uniques, 0);
+  f_111_010_011_110_0(uniques, 0);
+  f_111_010_011_110_1(uniques, 0);
+  f_111_010_011_111_0(uniques, 0);
+  f_111_010_011_111_1(uniques, 0);
+  f_111_010_100_000_0(uniques, 0);
+  f_111_010_100_000_1(uniques, 0);
+  f_111_010_100_001_0(uniques, 0);
+  f_111_010_100_001_1(uniques, 0);
+  f_111_010_100_010_0(uniques, 0);
+  f_111_010_100_010_1(uniques, 0);
+  f_111_010_100_011_0(uniques, 0);
+  f_111_010_100_011_1(uniques, 0);
+  f_111_010_100_100_0(uniques, 0);
+  f_111_010_100_100_1(uniques, 0);
+  f_111_010_100_101_0(uniques, 0);
+  f_111_010_100_101_1(uniques, 0);
+  f_111_010_100_110_0(uniques, 0);
+  f_111_010_100_110_1(uniques, 0);
+  f_111_010_100_111_0(uniques, 0);
+  f_111_010_100_111_1(uniques, 0);
+  f_111_010_101_000_0(uniques, 0);
+  f_111_010_101_000_1(uniques, 0);
+  f_111_010_101_001_0(uniques, 0);
+  f_111_010_101_001_1(uniques, 0);
+  f_111_010_101_010_0(uniques, 0);
+  f_111_010_101_010_1(uniques, 0);
+  f_111_010_101_011_0(uniques, 0);
+  f_111_010_101_011_1(uniques, 0);
+  f_111_010_101_100_0(uniques, 0);
+  f_111_010_101_100_1(uniques, 0);
+  f_111_010_101_101_0(uniques, 0);
+  f_111_010_101_101_1(uniques, 0);
+  f_111_010_101_110_0(uniques, 0);
+  f_111_010_101_110_1(uniques, 0);
+  f_111_010_101_111_0(uniques, 0);
+  f_111_010_101_111_1(uniques, 0);
+  f_111_010_110_000_0(uniques, 0);
+  f_111_010_110_000_1(uniques, 0);
+  f_111_010_110_001_0(uniques, 0);
+  f_111_010_110_001_1(uniques, 0);
+  f_111_010_110_010_0(uniques, 0);
+  f_111_010_110_010_1(uniques, 0);
+  f_111_010_110_011_0(uniques, 0);
+  f_111_010_110_011_1(uniques, 0);
+  f_111_010_110_100_0(uniques, 0);
+  f_111_010_110_100_1(uniques, 0);
+  f_111_010_110_101_0(uniques, 0);
+  f_111_010_110_101_1(uniques, 0);
+  f_111_010_110_110_0(uniques, 0);
+  f_111_010_110_110_1(uniques, 0);
+  f_111_010_110_111_0(uniques, 0);
+  f_111_010_110_111_1(uniques, 0);
+  f_111_010_111_000_0(uniques, 0);
+  f_111_010_111_000_1(uniques, 0);
+  f_111_010_111_001_0(uniques, 0);
+  f_111_010_111_001_1(uniques, 0);
+  f_111_010_111_010_0(uniques, 0);
+  f_111_010_111_010_1(uniques, 0);
+  f_111_010_111_011_0(uniques, 0);
+  f_111_010_111_011_1(uniques, 0);
+  f_111_010_111_100_0(uniques, 0);
+  f_111_010_111_100_1(uniques, 0);
+  f_111_010_111_101_0(uniques, 0);
+  f_111_010_111_101_1(uniques, 0);
+  f_111_010_111_110_0(uniques, 0);
+  f_111_010_111_110_1(uniques, 0);
+  f_111_010_111_111_0(uniques, 0);
+  f_111_010_111_111_1(uniques, 0);
+  f_111_011_000_000_0(uniques, 0);
+  f_111_011_000_000_1(uniques, 0);
+  f_111_011_000_001_0(uniques, 0);
+  f_111_011_000_001_1(uniques, 0);
+  f_111_011_000_010_0(uniques, 0);
+  f_111_011_000_010_1(uniques, 0);
+  f_111_011_000_011_0(uniques, 0);
+  f_111_011_000_011_1(uniques, 0);
+  f_111_011_000_100_0(uniques, 0);
+  f_111_011_000_100_1(uniques, 0);
+  f_111_011_000_101_0(uniques, 0);
+  f_111_011_000_101_1(uniques, 0);
+  f_111_011_000_110_0(uniques, 0);
+  f_111_011_000_110_1(uniques, 0);
+  f_111_011_000_111_0(uniques, 0);
+  f_111_011_000_111_1(uniques, 0);
+  f_111_011_001_000_0(uniques, 0);
+  f_111_011_001_000_1(uniques, 0);
+  f_111_011_001_001_0(uniques, 0);
+  f_111_011_001_001_1(uniques, 0);
+  f_111_011_001_010_0(uniques, 0);
+  f_111_011_001_010_1(uniques, 0);
+  f_111_011_001_011_0(uniques, 0);
+  f_111_011_001_011_1(uniques, 0);
+  f_111_011_001_100_0(uniques, 0);
+  f_111_011_001_100_1(uniques, 0);
+  f_111_011_001_101_0(uniques, 0);
+  f_111_011_001_101_1(uniques, 0);
+  f_111_011_001_110_0(uniques, 0);
+  f_111_011_001_110_1(uniques, 0);
+  f_111_011_001_111_0(uniques, 0);
+  f_111_011_001_111_1(uniques, 0);
+  f_111_011_010_000_0(uniques, 0);
+  f_111_011_010_000_1(uniques, 0);
+  f_111_011_010_001_0(uniques, 0);
+  f_111_011_010_001_1(uniques, 0);
+  f_111_011_010_010_0(uniques, 0);
+  f_111_011_010_010_1(uniques, 0);
+  f_111_011_010_011_0(uniques, 0);
+  f_111_011_010_011_1(uniques, 0);
+  f_111_011_010_100_0(uniques, 0);
+  f_111_011_010_100_1(uniques, 0);
+  f_111_011_010_101_0(uniques, 0);
+  f_111_011_010_101_1(uniques, 0);
+  f_111_011_010_110_0(uniques, 0);
+  f_111_011_010_110_1(uniques, 0);
+  f_111_011_010_111_0(uniques, 0);
+  f_111_011_010_111_1(uniques, 0);
+  f_111_011_011_000_0(uniques, 0);
+  f_111_011_011_000_1(uniques, 0);
+  f_111_011_011_001_0(uniques, 0);
+  f_111_011_011_001_1(uniques, 0);
+  f_111_011_011_010_0(uniques, 0);
+  f_111_011_011_010_1(uniques, 0);
+  f_111_011_011_011_0(uniques, 0);
+  f_111_011_011_011_1(uniques, 0);
+  f_111_011_011_100_0(uniques, 0);
+  f_111_011_011_100_1(uniques, 0);
+  f_111_011_011_101_0(uniques, 0);
+  f_111_011_011_101_1(uniques, 0);
+  f_111_011_011_110_0(uniques, 0);
+  f_111_011_011_110_1(uniques, 0);
+  f_111_011_011_111_0(uniques, 0);
+  f_111_011_011_111_1(uniques, 0);
+  f_111_011_100_000_0(uniques, 0);
+  f_111_011_100_000_1(uniques, 0);
+  f_111_011_100_001_0(uniques, 0);
+  f_111_011_100_001_1(uniques, 0);
+  f_111_011_100_010_0(uniques, 0);
+  f_111_011_100_010_1(uniques, 0);
+  f_111_011_100_011_0(uniques, 0);
+  f_111_011_100_011_1(uniques, 0);
+  f_111_011_100_100_0(uniques, 0);
+  f_111_011_100_100_1(uniques, 0);
+  f_111_011_100_101_0(uniques, 0);
+  f_111_011_100_101_1(uniques, 0);
+  f_111_011_100_110_0(uniques, 0);
+  f_111_011_100_110_1(uniques, 0);
+  f_111_011_100_111_0(uniques, 0);
+  f_111_011_100_111_1(uniques, 0);
+  f_111_011_101_000_0(uniques, 0);
+  f_111_011_101_000_1(uniques, 0);
+  f_111_011_101_001_0(uniques, 0);
+  f_111_011_101_001_1(uniques, 0);
+  f_111_011_101_010_0(uniques, 0);
+  f_111_011_101_010_1(uniques, 0);
+  f_111_011_101_011_0(uniques, 0);
+  f_111_011_101_011_1(uniques, 0);
+  f_111_011_101_100_0(uniques, 0);
+  f_111_011_101_100_1(uniques, 0);
+  f_111_011_101_101_0(uniques, 0);
+  f_111_011_101_101_1(uniques, 0);
+  f_111_011_101_110_0(uniques, 0);
+  f_111_011_101_110_1(uniques, 0);
+  f_111_011_101_111_0(uniques, 0);
+  f_111_011_101_111_1(uniques, 0);
+  f_111_011_110_000_0(uniques, 0);
+  f_111_011_110_000_1(uniques, 0);
+  f_111_011_110_001_0(uniques, 0);
+  f_111_011_110_001_1(uniques, 0);
+  f_111_011_110_010_0(uniques, 0);
+  f_111_011_110_010_1(uniques, 0);
+  f_111_011_110_011_0(uniques, 0);
+  f_111_011_110_011_1(uniques, 0);
+  f_111_011_110_100_0(uniques, 0);
+  f_111_011_110_100_1(uniques, 0);
+  f_111_011_110_101_0(uniques, 0);
+  f_111_011_110_101_1(uniques, 0);
+  f_111_011_110_110_0(uniques, 0);
+  f_111_011_110_110_1(uniques, 0);
+  f_111_011_110_111_0(uniques, 0);
+  f_111_011_110_111_1(uniques, 0);
+  f_111_011_111_000_0(uniques, 0);
+  f_111_011_111_000_1(uniques, 0);
+  f_111_011_111_001_0(uniques, 0);
+  f_111_011_111_001_1(uniques, 0);
+  f_111_011_111_010_0(uniques, 0);
+  f_111_011_111_010_1(uniques, 0);
+  f_111_011_111_011_0(uniques, 0);
+  f_111_011_111_011_1(uniques, 0);
+  f_111_011_111_100_0(uniques, 0);
+  f_111_011_111_100_1(uniques, 0);
+  f_111_011_111_101_0(uniques, 0);
+  f_111_011_111_101_1(uniques, 0);
+  f_111_011_111_110_0(uniques, 0);
+  f_111_011_111_110_1(uniques, 0);
+  f_111_011_111_111_0(uniques, 0);
+  f_111_011_111_111_1(uniques, 0);
+  f_111_100_000_000_0(uniques, 0);
+  f_111_100_000_000_1(uniques, 0);
+  f_111_100_000_001_0(uniques, 0);
+  f_111_100_000_001_1(uniques, 0);
+  f_111_100_000_010_0(uniques, 0);
+  f_111_100_000_010_1(uniques, 0);
+  f_111_100_000_011_0(uniques, 0);
+  f_111_100_000_011_1(uniques, 0);
+  f_111_100_000_100_0(uniques, 0);
+  f_111_100_000_100_1(uniques, 0);
+  f_111_100_000_101_0(uniques, 0);
+  f_111_100_000_101_1(uniques, 0);
+  f_111_100_000_110_0(uniques, 0);
+  f_111_100_000_110_1(uniques, 0);
+  f_111_100_000_111_0(uniques, 0);
+  f_111_100_000_111_1(uniques, 0);
+  f_111_100_001_000_0(uniques, 0);
+  f_111_100_001_000_1(uniques, 0);
+  f_111_100_001_001_0(uniques, 0);
+  f_111_100_001_001_1(uniques, 0);
+  f_111_100_001_010_0(uniques, 0);
+  f_111_100_001_010_1(uniques, 0);
+  f_111_100_001_011_0(uniques, 0);
+  f_111_100_001_011_1(uniques, 0);
+  f_111_100_001_100_0(uniques, 0);
+  f_111_100_001_100_1(uniques, 0);
+  f_111_100_001_101_0(uniques, 0);
+  f_111_100_001_101_1(uniques, 0);
+  f_111_100_001_110_0(uniques, 0);
+  f_111_100_001_110_1(uniques, 0);
+  f_111_100_001_111_0(uniques, 0);
+  f_111_100_001_111_1(uniques, 0);
+  f_111_100_010_000_0(uniques, 0);
+  f_111_100_010_000_1(uniques, 0);
+  f_111_100_010_001_0(uniques, 0);
+  f_111_100_010_001_1(uniques, 0);
+  f_111_100_010_010_0(uniques, 0);
+  f_111_100_010_010_1(uniques, 0);
+  f_111_100_010_011_0(uniques, 0);
+  f_111_100_010_011_1(uniques, 0);
+  f_111_100_010_100_0(uniques, 0);
+  f_111_100_010_100_1(uniques, 0);
+  f_111_100_010_101_0(uniques, 0);
+  f_111_100_010_101_1(uniques, 0);
+  f_111_100_010_110_0(uniques, 0);
+  f_111_100_010_110_1(uniques, 0);
+  f_111_100_010_111_0(uniques, 0);
+  f_111_100_010_111_1(uniques, 0);
+  f_111_100_011_000_0(uniques, 0);
+  f_111_100_011_000_1(uniques, 0);
+  f_111_100_011_001_0(uniques, 0);
+  f_111_100_011_001_1(uniques, 0);
+  f_111_100_011_010_0(uniques, 0);
+  f_111_100_011_010_1(uniques, 0);
+  f_111_100_011_011_0(uniques, 0);
+  f_111_100_011_011_1(uniques, 0);
+  f_111_100_011_100_0(uniques, 0);
+  f_111_100_011_100_1(uniques, 0);
+  f_111_100_011_101_0(uniques, 0);
+  f_111_100_011_101_1(uniques, 0);
+  f_111_100_011_110_0(uniques, 0);
+  f_111_100_011_110_1(uniques, 0);
+  f_111_100_011_111_0(uniques, 0);
+  f_111_100_011_111_1(uniques, 0);
+  f_111_100_100_000_0(uniques, 0);
+  f_111_100_100_000_1(uniques, 0);
+  f_111_100_100_001_0(uniques, 0);
+  f_111_100_100_001_1(uniques, 0);
+  f_111_100_100_010_0(uniques, 0);
+  f_111_100_100_010_1(uniques, 0);
+  f_111_100_100_011_0(uniques, 0);
+  f_111_100_100_011_1(uniques, 0);
+  f_111_100_100_100_0(uniques, 0);
+  f_111_100_100_100_1(uniques, 0);
+  f_111_100_100_101_0(uniques, 0);
+  f_111_100_100_101_1(uniques, 0);
+  f_111_100_100_110_0(uniques, 0);
+  f_111_100_100_110_1(uniques, 0);
+  f_111_100_100_111_0(uniques, 0);
+  f_111_100_100_111_1(uniques, 0);
+  f_111_100_101_000_0(uniques, 0);
+  f_111_100_101_000_1(uniques, 0);
+  f_111_100_101_001_0(uniques, 0);
+  f_111_100_101_001_1(uniques, 0);
+  f_111_100_101_010_0(uniques, 0);
+  f_111_100_101_010_1(uniques, 0);
+  f_111_100_101_011_0(uniques, 0);
+  f_111_100_101_011_1(uniques, 0);
+  f_111_100_101_100_0(uniques, 0);
+  f_111_100_101_100_1(uniques, 0);
+  f_111_100_101_101_0(uniques, 0);
+  f_111_100_101_101_1(uniques, 0);
+  f_111_100_101_110_0(uniques, 0);
+  f_111_100_101_110_1(uniques, 0);
+  f_111_100_101_111_0(uniques, 0);
+  f_111_100_101_111_1(uniques, 0);
+  f_111_100_110_000_0(uniques, 0);
+  f_111_100_110_000_1(uniques, 0);
+  f_111_100_110_001_0(uniques, 0);
+  f_111_100_110_001_1(uniques, 0);
+  f_111_100_110_010_0(uniques, 0);
+  f_111_100_110_010_1(uniques, 0);
+  f_111_100_110_011_0(uniques, 0);
+  f_111_100_110_011_1(uniques, 0);
+  f_111_100_110_100_0(uniques, 0);
+  f_111_100_110_100_1(uniques, 0);
+  f_111_100_110_101_0(uniques, 0);
+  f_111_100_110_101_1(uniques, 0);
+  f_111_100_110_110_0(uniques, 0);
+  f_111_100_110_110_1(uniques, 0);
+  f_111_100_110_111_0(uniques, 0);
+  f_111_100_110_111_1(uniques, 0);
+  f_111_100_111_000_0(uniques, 0);
+  f_111_100_111_000_1(uniques, 0);
+  f_111_100_111_001_0(uniques, 0);
+  f_111_100_111_001_1(uniques, 0);
+  f_111_100_111_010_0(uniques, 0);
+  f_111_100_111_010_1(uniques, 0);
+  f_111_100_111_011_0(uniques, 0);
+  f_111_100_111_011_1(uniques, 0);
+  f_111_100_111_100_0(uniques, 0);
+  f_111_100_111_100_1(uniques, 0);
+  f_111_100_111_101_0(uniques, 0);
+  f_111_100_111_101_1(uniques, 0);
+  f_111_100_111_110_0(uniques, 0);
+  f_111_100_111_110_1(uniques, 0);
+  f_111_100_111_111_0(uniques, 0);
+  f_111_100_111_111_1(uniques, 0);
+  f_111_101_000_000_0(uniques, 0);
+  f_111_101_000_000_1(uniques, 0);
+  f_111_101_000_001_0(uniques, 0);
+  f_111_101_000_001_1(uniques, 0);
+  f_111_101_000_010_0(uniques, 0);
+  f_111_101_000_010_1(uniques, 0);
+  f_111_101_000_011_0(uniques, 0);
+  f_111_101_000_011_1(uniques, 0);
+  f_111_101_000_100_0(uniques, 0);
+  f_111_101_000_100_1(uniques, 0);
+  f_111_101_000_101_0(uniques, 0);
+  f_111_101_000_101_1(uniques, 0);
+  f_111_101_000_110_0(uniques, 0);
+  f_111_101_000_110_1(uniques, 0);
+  f_111_101_000_111_0(uniques, 0);
+  f_111_101_000_111_1(uniques, 0);
+  f_111_101_001_000_0(uniques, 0);
+  f_111_101_001_000_1(uniques, 0);
+  f_111_101_001_001_0(uniques, 0);
+  f_111_101_001_001_1(uniques, 0);
+  f_111_101_001_010_0(uniques, 0);
+  f_111_101_001_010_1(uniques, 0);
+  f_111_101_001_011_0(uniques, 0);
+  f_111_101_001_011_1(uniques, 0);
+  f_111_101_001_100_0(uniques, 0);
+  f_111_101_001_100_1(uniques, 0);
+  f_111_101_001_101_0(uniques, 0);
+  f_111_101_001_101_1(uniques, 0);
+  f_111_101_001_110_0(uniques, 0);
+  f_111_101_001_110_1(uniques, 0);
+  f_111_101_001_111_0(uniques, 0);
+  f_111_101_001_111_1(uniques, 0);
+  f_111_101_010_000_0(uniques, 0);
+  f_111_101_010_000_1(uniques, 0);
+  f_111_101_010_001_0(uniques, 0);
+  f_111_101_010_001_1(uniques, 0);
+  f_111_101_010_010_0(uniques, 0);
+  f_111_101_010_010_1(uniques, 0);
+  f_111_101_010_011_0(uniques, 0);
+  f_111_101_010_011_1(uniques, 0);
+  f_111_101_010_100_0(uniques, 0);
+  f_111_101_010_100_1(uniques, 0);
+  f_111_101_010_101_0(uniques, 0);
+  f_111_101_010_101_1(uniques, 0);
+  f_111_101_010_110_0(uniques, 0);
+  f_111_101_010_110_1(uniques, 0);
+  f_111_101_010_111_0(uniques, 0);
+  f_111_101_010_111_1(uniques, 0);
+  f_111_101_011_000_0(uniques, 0);
+  f_111_101_011_000_1(uniques, 0);
+  f_111_101_011_001_0(uniques, 0);
+  f_111_101_011_001_1(uniques, 0);
+  f_111_101_011_010_0(uniques, 0);
+  f_111_101_011_010_1(uniques, 0);
+  f_111_101_011_011_0(uniques, 0);
+  f_111_101_011_011_1(uniques, 0);
+  f_111_101_011_100_0(uniques, 0);
+  f_111_101_011_100_1(uniques, 0);
+  f_111_101_011_101_0(uniques, 0);
+  f_111_101_011_101_1(uniques, 0);
+  f_111_101_011_110_0(uniques, 0);
+  f_111_101_011_110_1(uniques, 0);
+  f_111_101_011_111_0(uniques, 0);
+  f_111_101_011_111_1(uniques, 0);
+  f_111_101_100_000_0(uniques, 0);
+  f_111_101_100_000_1(uniques, 0);
+  f_111_101_100_001_0(uniques, 0);
+  f_111_101_100_001_1(uniques, 0);
+  f_111_101_100_010_0(uniques, 0);
+  f_111_101_100_010_1(uniques, 0);
+  f_111_101_100_011_0(uniques, 0);
+  f_111_101_100_011_1(uniques, 0);
+  f_111_101_100_100_0(uniques, 0);
+  f_111_101_100_100_1(uniques, 0);
+  f_111_101_100_101_0(uniques, 0);
+  f_111_101_100_101_1(uniques, 0);
+  f_111_101_100_110_0(uniques, 0);
+  f_111_101_100_110_1(uniques, 0);
+  f_111_101_100_111_0(uniques, 0);
+  f_111_101_100_111_1(uniques, 0);
+  f_111_101_101_000_0(uniques, 0);
+  f_111_101_101_000_1(uniques, 0);
+  f_111_101_101_001_0(uniques, 0);
+  f_111_101_101_001_1(uniques, 0);
+  f_111_101_101_010_0(uniques, 0);
+  f_111_101_101_010_1(uniques, 0);
+  f_111_101_101_011_0(uniques, 0);
+  f_111_101_101_011_1(uniques, 0);
+  f_111_101_101_100_0(uniques, 0);
+  f_111_101_101_100_1(uniques, 0);
+  f_111_101_101_101_0(uniques, 0);
+  f_111_101_101_101_1(uniques, 0);
+  f_111_101_101_110_0(uniques, 0);
+  f_111_101_101_110_1(uniques, 0);
+  f_111_101_101_111_0(uniques, 0);
+  f_111_101_101_111_1(uniques, 0);
+  f_111_101_110_000_0(uniques, 0);
+  f_111_101_110_000_1(uniques, 0);
+  f_111_101_110_001_0(uniques, 0);
+  f_111_101_110_001_1(uniques, 0);
+  f_111_101_110_010_0(uniques, 0);
+  f_111_101_110_010_1(uniques, 0);
+  f_111_101_110_011_0(uniques, 0);
+  f_111_101_110_011_1(uniques, 0);
+  f_111_101_110_100_0(uniques, 0);
+  f_111_101_110_100_1(uniques, 0);
+  f_111_101_110_101_0(uniques, 0);
+  f_111_101_110_101_1(uniques, 0);
+  f_111_101_110_110_0(uniques, 0);
+  f_111_101_110_110_1(uniques, 0);
+  f_111_101_110_111_0(uniques, 0);
+  f_111_101_110_111_1(uniques, 0);
+  f_111_101_111_000_0(uniques, 0);
+  f_111_101_111_000_1(uniques, 0);
+  f_111_101_111_001_0(uniques, 0);
+  f_111_101_111_001_1(uniques, 0);
+  f_111_101_111_010_0(uniques, 0);
+  f_111_101_111_010_1(uniques, 0);
+  f_111_101_111_011_0(uniques, 0);
+  f_111_101_111_011_1(uniques, 0);
+  f_111_101_111_100_0(uniques, 0);
+  f_111_101_111_100_1(uniques, 0);
+  f_111_101_111_101_0(uniques, 0);
+  f_111_101_111_101_1(uniques, 0);
+  f_111_101_111_110_0(uniques, 0);
+  f_111_101_111_110_1(uniques, 0);
+  f_111_101_111_111_0(uniques, 0);
+  f_111_101_111_111_1(uniques, 0);
+  f_111_110_000_000_0(uniques, 0);
+  f_111_110_000_000_1(uniques, 0);
+  f_111_110_000_001_0(uniques, 0);
+  f_111_110_000_001_1(uniques, 0);
+  f_111_110_000_010_0(uniques, 0);
+  f_111_110_000_010_1(uniques, 0);
+  f_111_110_000_011_0(uniques, 0);
+  f_111_110_000_011_1(uniques, 0);
+  f_111_110_000_100_0(uniques, 0);
+  f_111_110_000_100_1(uniques, 0);
+  f_111_110_000_101_0(uniques, 0);
+  f_111_110_000_101_1(uniques, 0);
+  f_111_110_000_110_0(uniques, 0);
+  f_111_110_000_110_1(uniques, 0);
+  f_111_110_000_111_0(uniques, 0);
+  f_111_110_000_111_1(uniques, 0);
+  f_111_110_001_000_0(uniques, 0);
+  f_111_110_001_000_1(uniques, 0);
+  f_111_110_001_001_0(uniques, 0);
+  f_111_110_001_001_1(uniques, 0);
+  f_111_110_001_010_0(uniques, 0);
+  f_111_110_001_010_1(uniques, 0);
+  f_111_110_001_011_0(uniques, 0);
+  f_111_110_001_011_1(uniques, 0);
+  f_111_110_001_100_0(uniques, 0);
+  f_111_110_001_100_1(uniques, 0);
+  f_111_110_001_101_0(uniques, 0);
+  f_111_110_001_101_1(uniques, 0);
+  f_111_110_001_110_0(uniques, 0);
+  f_111_110_001_110_1(uniques, 0);
+  f_111_110_001_111_0(uniques, 0);
+  f_111_110_001_111_1(uniques, 0);
+  f_111_110_010_000_0(uniques, 0);
+  f_111_110_010_000_1(uniques, 0);
+  f_111_110_010_001_0(uniques, 0);
+  f_111_110_010_001_1(uniques, 0);
+  f_111_110_010_010_0(uniques, 0);
+  f_111_110_010_010_1(uniques, 0);
+  f_111_110_010_011_0(uniques, 0);
+  f_111_110_010_011_1(uniques, 0);
+  f_111_110_010_100_0(uniques, 0);
+  f_111_110_010_100_1(uniques, 0);
+  f_111_110_010_101_0(uniques, 0);
+  f_111_110_010_101_1(uniques, 0);
+  f_111_110_010_110_0(uniques, 0);
+  f_111_110_010_110_1(uniques, 0);
+  f_111_110_010_111_0(uniques, 0);
+  f_111_110_010_111_1(uniques, 0);
+  f_111_110_011_000_0(uniques, 0);
+  f_111_110_011_000_1(uniques, 0);
+  f_111_110_011_001_0(uniques, 0);
+  f_111_110_011_001_1(uniques, 0);
+  f_111_110_011_010_0(uniques, 0);
+  f_111_110_011_010_1(uniques, 0);
+  f_111_110_011_011_0(uniques, 0);
+  f_111_110_011_011_1(uniques, 0);
+  f_111_110_011_100_0(uniques, 0);
+  f_111_110_011_100_1(uniques, 0);
+  f_111_110_011_101_0(uniques, 0);
+  f_111_110_011_101_1(uniques, 0);
+  f_111_110_011_110_0(uniques, 0);
+  f_111_110_011_110_1(uniques, 0);
+  f_111_110_011_111_0(uniques, 0);
+  f_111_110_011_111_1(uniques, 0);
+  f_111_110_100_000_0(uniques, 0);
+  f_111_110_100_000_1(uniques, 0);
+  f_111_110_100_001_0(uniques, 0);
+  f_111_110_100_001_1(uniques, 0);
+  f_111_110_100_010_0(uniques, 0);
+  f_111_110_100_010_1(uniques, 0);
+  f_111_110_100_011_0(uniques, 0);
+  f_111_110_100_011_1(uniques, 0);
+  f_111_110_100_100_0(uniques, 0);
+  f_111_110_100_100_1(uniques, 0);
+  f_111_110_100_101_0(uniques, 0);
+  f_111_110_100_101_1(uniques, 0);
+  f_111_110_100_110_0(uniques, 0);
+  f_111_110_100_110_1(uniques, 0);
+  f_111_110_100_111_0(uniques, 0);
+  f_111_110_100_111_1(uniques, 0);
+  f_111_110_101_000_0(uniques, 0);
+  f_111_110_101_000_1(uniques, 0);
+  f_111_110_101_001_0(uniques, 0);
+  f_111_110_101_001_1(uniques, 0);
+  f_111_110_101_010_0(uniques, 0);
+  f_111_110_101_010_1(uniques, 0);
+  f_111_110_101_011_0(uniques, 0);
+  f_111_110_101_011_1(uniques, 0);
+  f_111_110_101_100_0(uniques, 0);
+  f_111_110_101_100_1(uniques, 0);
+  f_111_110_101_101_0(uniques, 0);
+  f_111_110_101_101_1(uniques, 0);
+  f_111_110_101_110_0(uniques, 0);
+  f_111_110_101_110_1(uniques, 0);
+  f_111_110_101_111_0(uniques, 0);
+  f_111_110_101_111_1(uniques, 0);
+  f_111_110_110_000_0(uniques, 0);
+  f_111_110_110_000_1(uniques, 0);
+  f_111_110_110_001_0(uniques, 0);
+  f_111_110_110_001_1(uniques, 0);
+  f_111_110_110_010_0(uniques, 0);
+  f_111_110_110_010_1(uniques, 0);
+  f_111_110_110_011_0(uniques, 0);
+  f_111_110_110_011_1(uniques, 0);
+  f_111_110_110_100_0(uniques, 0);
+  f_111_110_110_100_1(uniques, 0);
+  f_111_110_110_101_0(uniques, 0);
+  f_111_110_110_101_1(uniques, 0);
+  f_111_110_110_110_0(uniques, 0);
+  f_111_110_110_110_1(uniques, 0);
+  f_111_110_110_111_0(uniques, 0);
+  f_111_110_110_111_1(uniques, 0);
+  f_111_110_111_000_0(uniques, 0);
+  f_111_110_111_000_1(uniques, 0);
+  f_111_110_111_001_0(uniques, 0);
+  f_111_110_111_001_1(uniques, 0);
+  f_111_110_111_010_0(uniques, 0);
+  f_111_110_111_010_1(uniques, 0);
+  f_111_110_111_011_0(uniques, 0);
+  f_111_110_111_011_1(uniques, 0);
+  f_111_110_111_100_0(uniques, 0);
+  f_111_110_111_100_1(uniques, 0);
+  f_111_110_111_101_0(uniques, 0);
+  f_111_110_111_101_1(uniques, 0);
+  f_111_110_111_110_0(uniques, 0);
+  f_111_110_111_110_1(uniques, 0);
+  f_111_110_111_111_0(uniques, 0);
+  f_111_110_111_111_1(uniques, 0);
+  f_111_111_000_000_0(uniques, 0);
+  f_111_111_000_000_1(uniques, 0);
+  f_111_111_000_001_0(uniques, 0);
+  f_111_111_000_001_1(uniques, 0);
+  f_111_111_000_010_0(uniques, 0);
+  f_111_111_000_010_1(uniques, 0);
+  f_111_111_000_011_0(uniques, 0);
+  f_111_111_000_011_1(uniques, 0);
+  f_111_111_000_100_0(uniques, 0);
+  f_111_111_000_100_1(uniques, 0);
+  f_111_111_000_101_0(uniques, 0);
+  f_111_111_000_101_1(uniques, 0);
+  f_111_111_000_110_0(uniques, 0);
+  f_111_111_000_110_1(uniques, 0);
+  f_111_111_000_111_0(uniques, 0);
+  f_111_111_000_111_1(uniques, 0);
+  f_111_111_001_000_0(uniques, 0);
+  f_111_111_001_000_1(uniques, 0);
+  f_111_111_001_001_0(uniques, 0);
+  f_111_111_001_001_1(uniques, 0);
+  f_111_111_001_010_0(uniques, 0);
+  f_111_111_001_010_1(uniques, 0);
+  f_111_111_001_011_0(uniques, 0);
+  f_111_111_001_011_1(uniques, 0);
+  f_111_111_001_100_0(uniques, 0);
+  f_111_111_001_100_1(uniques, 0);
+  f_111_111_001_101_0(uniques, 0);
+  f_111_111_001_101_1(uniques, 0);
+  f_111_111_001_110_0(uniques, 0);
+  f_111_111_001_110_1(uniques, 0);
+  f_111_111_001_111_0(uniques, 0);
+  f_111_111_001_111_1(uniques, 0);
+  f_111_111_010_000_0(uniques, 0);
+  f_111_111_010_000_1(uniques, 0);
+  f_111_111_010_001_0(uniques, 0);
+  f_111_111_010_001_1(uniques, 0);
+  f_111_111_010_010_0(uniques, 0);
+  f_111_111_010_010_1(uniques, 0);
+  f_111_111_010_011_0(uniques, 0);
+  f_111_111_010_011_1(uniques, 0);
+  f_111_111_010_100_0(uniques, 0);
+  f_111_111_010_100_1(uniques, 0);
+  f_111_111_010_101_0(uniques, 0);
+  f_111_111_010_101_1(uniques, 0);
+  f_111_111_010_110_0(uniques, 0);
+  f_111_111_010_110_1(uniques, 0);
+  f_111_111_010_111_0(uniques, 0);
+  f_111_111_010_111_1(uniques, 0);
+  f_111_111_011_000_0(uniques, 0);
+  f_111_111_011_000_1(uniques, 0);
+  f_111_111_011_001_0(uniques, 0);
+  f_111_111_011_001_1(uniques, 0);
+  f_111_111_011_010_0(uniques, 0);
+  f_111_111_011_010_1(uniques, 0);
+  f_111_111_011_011_0(uniques, 0);
+  f_111_111_011_011_1(uniques, 0);
+  f_111_111_011_100_0(uniques, 0);
+  f_111_111_011_100_1(uniques, 0);
+  f_111_111_011_101_0(uniques, 0);
+  f_111_111_011_101_1(uniques, 0);
+  f_111_111_011_110_0(uniques, 0);
+  f_111_111_011_110_1(uniques, 0);
+  f_111_111_011_111_0(uniques, 0);
+  f_111_111_011_111_1(uniques, 0);
+  f_111_111_100_000_0(uniques, 0);
+  f_111_111_100_000_1(uniques, 0);
+  f_111_111_100_001_0(uniques, 0);
+  f_111_111_100_001_1(uniques, 0);
+  f_111_111_100_010_0(uniques, 0);
+  f_111_111_100_010_1(uniques, 0);
+  f_111_111_100_011_0(uniques, 0);
+  f_111_111_100_011_1(uniques, 0);
+  f_111_111_100_100_0(uniques, 0);
+  f_111_111_100_100_1(uniques, 0);
+  f_111_111_100_101_0(uniques, 0);
+  f_111_111_100_101_1(uniques, 0);
+  f_111_111_100_110_0(uniques, 0);
+  f_111_111_100_110_1(uniques, 0);
+  f_111_111_100_111_0(uniques, 0);
+  f_111_111_100_111_1(uniques, 0);
+  f_111_111_101_000_0(uniques, 0);
+  f_111_111_101_000_1(uniques, 0);
+  f_111_111_101_001_0(uniques, 0);
+  f_111_111_101_001_1(uniques, 0);
+  f_111_111_101_010_0(uniques, 0);
+  f_111_111_101_010_1(uniques, 0);
+  f_111_111_101_011_0(uniques, 0);
+  f_111_111_101_011_1(uniques, 0);
+  f_111_111_101_100_0(uniques, 0);
+  f_111_111_101_100_1(uniques, 0);
+  f_111_111_101_101_0(uniques, 0);
+  f_111_111_101_101_1(uniques, 0);
+  f_111_111_101_110_0(uniques, 0);
+  f_111_111_101_110_1(uniques, 0);
+  f_111_111_101_111_0(uniques, 0);
+  f_111_111_101_111_1(uniques, 0);
+  f_111_111_110_000_0(uniques, 0);
+  f_111_111_110_000_1(uniques, 0);
+  f_111_111_110_001_0(uniques, 0);
+  f_111_111_110_001_1(uniques, 0);
+  f_111_111_110_010_0(uniques, 0);
+  f_111_111_110_010_1(uniques, 0);
+  f_111_111_110_011_0(uniques, 0);
+  f_111_111_110_011_1(uniques, 0);
+  f_111_111_110_100_0(uniques, 0);
+  f_111_111_110_100_1(uniques, 0);
+  f_111_111_110_101_0(uniques, 0);
+  f_111_111_110_101_1(uniques, 0);
+  f_111_111_110_110_0(uniques, 0);
+  f_111_111_110_110_1(uniques, 0);
+  f_111_111_110_111_0(uniques, 0);
+  f_111_111_110_111_1(uniques, 0);
+  f_111_111_111_000_0(uniques, 0);
+  f_111_111_111_000_1(uniques, 0);
+  f_111_111_111_001_0(uniques, 0);
+  f_111_111_111_001_1(uniques, 0);
+  f_111_111_111_010_0(uniques, 0);
+  f_111_111_111_010_1(uniques, 0);
+  f_111_111_111_011_0(uniques, 0);
+  f_111_111_111_011_1(uniques, 0);
+  f_111_111_111_100_0(uniques, 0);
+  f_111_111_111_100_1(uniques, 0);
+  f_111_111_111_101_0(uniques, 0);
+  f_111_111_111_101_1(uniques, 0);
+  f_111_111_111_110_0(uniques, 0);
+  f_111_111_111_110_1(uniques, 0);
+  f_111_111_111_111_0(uniques, 0);
+  f_111_111_111_111_1(uniques, 0);
+  Expect.equals(4096, uniques.length);
+}
diff --git a/tests/dart2js/deferred/many_parts/many_parts_test.dart b/tests/dart2js/deferred/many_parts/many_parts_test.dart
new file mode 100644
index 0000000..5b83b21
--- /dev/null
+++ b/tests/dart2js/deferred/many_parts/many_parts_test.dart
@@ -0,0 +1,33 @@
+// Copyright (c) 2020, 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 'lib1.dart';
+import 'lib2.dart';
+import 'lib3.dart';
+import 'lib4.dart';
+import 'lib5.dart';
+import 'lib6.dart';
+import 'lib7.dart';
+import 'lib8.dart';
+import 'lib9.dart';
+import 'lib10.dart';
+import 'lib11.dart';
+import 'lib12.dart';
+import 'lib13.dart';
+
+main() {
+  entryLib1();
+  entryLib2();
+  entryLib3();
+  entryLib4();
+  entryLib5();
+  entryLib6();
+  entryLib7();
+  entryLib8();
+  entryLib9();
+  entryLib10();
+  entryLib11();
+  entryLib12();
+  entryLib13();
+}
diff --git a/tests/dart2js/internal/rti/required_named_parameters_test.dart b/tests/dart2js/internal/rti/required_named_parameters_test.dart
index c07f7a4..ccf3f7d 100644
--- a/tests/dart2js/internal/rti/required_named_parameters_test.dart
+++ b/tests/dart2js/internal/rti/required_named_parameters_test.dart
@@ -51,11 +51,13 @@
 
   // Subtype may not redeclare optional parameters as required
   rti2 = rti.testingUniverseEval(universe, "@(A,{a!A,b!A,c!A})");
-  Expect.equals(isWeakMode, rti.testingIsSubtype(universe, rti2, rti1));
+  Expect.equals(
+      hasUnsoundNullSafety, rti.testingIsSubtype(universe, rti2, rti1));
 
   // Subtype may not declare new required named parameters
   rti2 = rti.testingUniverseEval(universe, "@(A,{a!A,b:A,c!A,d!A})");
-  Expect.equals(isWeakMode, rti.testingIsSubtype(universe, rti2, rti1));
+  Expect.equals(
+      hasUnsoundNullSafety, rti.testingIsSubtype(universe, rti2, rti1));
 
   // Rti.toString() appears as expected
   Expect.equals('(B, {required B a, B b, required B c}) => dynamic',
diff --git a/tests/dart2js/internal/rti/subtype_test.dart b/tests/dart2js/internal/rti/subtype_test.dart
index 68f4de7..d4f0c48 100644
--- a/tests/dart2js/internal/rti/subtype_test.dart
+++ b/tests/dart2js/internal/rti/subtype_test.dart
@@ -78,7 +78,7 @@
 }
 
 void testNull() {
-  if (isStrongMode) {
+  if (hasSoundNullSafety) {
     unrelated(nullName, 'int');
     unrelated(nullName, 'Iterable<CodeUnits>');
     unrelated(nullName, objectName);
@@ -93,7 +93,7 @@
 
 void testBottom() {
   String never = '0&';
-  if (isStrongMode) {
+  if (hasSoundNullSafety) {
     strictSubtype(never, nullName);
   } else {
     equivalent(never, nullName);
diff --git a/tests/dart2js/native/native_null_assertions/flag_disabled_non_web_test.dart b/tests/dart2js/native/native_null_assertions/flag_disabled_non_web_test.dart
new file mode 100644
index 0000000..660a546
--- /dev/null
+++ b/tests/dart2js/native/native_null_assertions/flag_disabled_non_web_test.dart
@@ -0,0 +1,15 @@
+// Copyright (c) 2020, 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.
+
+// Requirements=nnbd-strong
+// dart2jsOptions=--no-native-null-assertions
+
+import 'non_web_library_interfaces.dart';
+import 'null_assertions_test_lib.dart';
+
+void main() {
+  var flagEnabled = false;
+  testNativeNullAssertions(flagEnabled);
+  testJSInvocationNullAssertions(flagEnabled);
+}
diff --git a/tests/dart2js/native/native_null_assertions/flag_disabled_test.dart b/tests/dart2js/native/native_null_assertions/flag_disabled_test.dart
deleted file mode 100644
index e307833..0000000
--- a/tests/dart2js/native/native_null_assertions/flag_disabled_test.dart
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright (c) 2020, 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 'null_assertions_test_lib.dart';
-
-void main() {
-  var flagEnabled = false;
-  testNativeNullAssertions(flagEnabled);
-  testJSInvocationNullAssertions(flagEnabled);
-}
diff --git a/tests/dart2js/native/native_null_assertions/flag_disabled_web_test.dart b/tests/dart2js/native/native_null_assertions/flag_disabled_web_test.dart
new file mode 100644
index 0000000..8b7ee4c
--- /dev/null
+++ b/tests/dart2js/native/native_null_assertions/flag_disabled_web_test.dart
@@ -0,0 +1,15 @@
+// Copyright (c) 2020, 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.
+
+// Requirements=nnbd-strong
+// dart2jsOptions=--no-native-null-assertions
+
+import 'null_assertions_test_lib.dart';
+import 'web_library_interfaces.dart';
+
+void main() {
+  var flagEnabled = false;
+  testNativeNullAssertions(flagEnabled);
+  testJSInvocationNullAssertions(flagEnabled);
+}
diff --git a/tests/dart2js/native/native_null_assertions/flag_enabled_non_web_test.dart b/tests/dart2js/native/native_null_assertions/flag_enabled_non_web_test.dart
new file mode 100644
index 0000000..e923657
--- /dev/null
+++ b/tests/dart2js/native/native_null_assertions/flag_enabled_non_web_test.dart
@@ -0,0 +1,15 @@
+// Copyright (c) 2020, 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.
+
+// Requirements=nnbd-strong
+// dart2jsOptions=--native-null-assertions
+
+import 'non_web_library_interfaces.dart';
+import 'null_assertions_test_lib.dart';
+
+void main() {
+  var flagEnabled = true;
+  testNativeNullAssertions(flagEnabled);
+  testJSInvocationNullAssertions(flagEnabled);
+}
diff --git a/tests/dart2js/native/native_null_assertions/flag_enabled_test.dart b/tests/dart2js/native/native_null_assertions/flag_enabled_test.dart
deleted file mode 100644
index 0eb3965..0000000
--- a/tests/dart2js/native/native_null_assertions/flag_enabled_test.dart
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright (c) 2020, 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.
-
-// dart2jsOptions=--native-null-assertions
-
-import 'null_assertions_test_lib.dart';
-
-void main() {
-  var flagEnabled = true;
-  testNativeNullAssertions(flagEnabled);
-  testJSInvocationNullAssertions(flagEnabled);
-}
diff --git a/tests/dart2js/native/native_null_assertions/flag_enabled_web_test.dart b/tests/dart2js/native/native_null_assertions/flag_enabled_web_test.dart
new file mode 100644
index 0000000..2c41d2a
--- /dev/null
+++ b/tests/dart2js/native/native_null_assertions/flag_enabled_web_test.dart
@@ -0,0 +1,15 @@
+// Copyright (c) 2020, 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.
+
+// Requirements=nnbd-strong
+// dart2jsOptions=--native-null-assertions
+
+import 'null_assertions_test_lib.dart';
+import 'web_library_interfaces.dart';
+
+void main() {
+  var flagEnabled = true;
+  testNativeNullAssertions(flagEnabled);
+  testJSInvocationNullAssertions(flagEnabled);
+}
diff --git a/tests/dart2js/native/native_null_assertions/js_invocations_in_non_web_library.dart b/tests/dart2js/native/native_null_assertions/js_invocations_in_non_web_library.dart
deleted file mode 100644
index 9dd2be1..0000000
--- a/tests/dart2js/native/native_null_assertions/js_invocations_in_non_web_library.dart
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright (c) 2020, 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 '../native_testing.dart';
-import 'null_assertions_lib.dart';
-
-// Implementation of `JSInterface` except in a folder that is not part of the
-// allowlist for the `--native-null-assertions` flag. This file is not treated
-// as a web library, and therefore the `JS()` invocations should not be checked.
-
-@Native('CCCInNonWebLibrary')
-class CCCInNonWebLibrary implements JSInterface {
-  String get name => JS('String', '#.name', this);
-  String? get optName => JS('String|Null', '#.optName', this);
-}
diff --git a/tests/dart2js/native/native_null_assertions/js_invocations_in_web_library.dart b/tests/dart2js/native/native_null_assertions/js_invocations_in_web_library.dart
deleted file mode 100644
index 0554ab4..0000000
--- a/tests/dart2js/native/native_null_assertions/js_invocations_in_web_library.dart
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright (c) 2020, 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 '../native_testing.dart';
-import 'null_assertions_lib.dart';
-
-// Implementation of `JSInterface` in a folder that is explicitly part of the
-// allowlist for the `--native-null-assertions` flag. This file is treated as a
-// web library, and therefore the `JS()` invocations should be checked.
-
-@Native('CCCInWebLibrary')
-class CCCInWebLibrary implements JSInterface {
-  String get name => JS('String', '#.name', this);
-  String? get optName => JS('String|Null', '#.optName', this);
-}
diff --git a/tests/dart2js/native/native_null_assertions/non_web_library_interfaces.dart b/tests/dart2js/native/native_null_assertions/non_web_library_interfaces.dart
new file mode 100644
index 0000000..f0b6f95
--- /dev/null
+++ b/tests/dart2js/native/native_null_assertions/non_web_library_interfaces.dart
@@ -0,0 +1,105 @@
+// Copyright (c) 2020, 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 '../native_testing.dart';
+import 'null_assertions_test_lib.dart';
+
+// Implementations of `NativeInterface` and `JSInterface` in a folder that is
+// not part of the allowlist for the `--native-null-assertions` flag. This file
+// is not treated as a web library, and therefore native members and `JS()`
+// invocations should not be checked.
+
+@Native("AAA")
+class AAA implements NativeInterface {
+  int get size native;
+  String get name native;
+  String? get optName native;
+  int method1() native;
+  String method2() native;
+  String? optMethod() native;
+}
+
+@Native('CCC')
+class CCC implements JSInterface {
+  String get name => JS('String', '#.name', this);
+  String? get optName => JS('String|Null', '#.optName', this);
+}
+
+/// Returns an 'AAA' object that satisfies the interface.
+AAA makeA() native;
+
+/// Returns an 'AAA' object where each method breaks the interface's contract.
+AAA makeAX() native;
+
+/// Returns a 'CCC' object that satisfies the interface using `JS()`
+/// invocations.
+CCC makeC() native;
+
+/// Returns a 'CCC' object where each method breaks the interface's contract.
+CCC makeCX() native;
+
+// The 'AAA' version of the code is passed only objects of a single native
+// class, so the native method can be inlined (which happens in the optimizer).
+// This tests that the null-check exists in the 'inlined' code.
+
+@pragma('dart2js:noInline')
+String describeAAA(AAA o) {
+  return '${o.name} ${o.method2()} ${o.size} ${o.method1()}';
+}
+
+@pragma('dart2js:noInline')
+String describeOptAAA(AAA o) {
+  return '${o.optName} ${o.optMethod()}';
+}
+
+void testNativeNullAssertions(bool flagEnabled) {
+  nativeTesting();
+  setup();
+  AAA a = makeA();
+  BBB b = BBB();
+
+  Expect.equals(expectedA, describeNativeInterface(a));
+  Expect.equals(expectedB, describeNativeInterface(b));
+
+  Expect.equals(expectedA, describeAAA(a));
+
+  AAA x = makeAX(); // This object returns `null`!
+  // Since native members are not in a web library, there should be no checks,
+  // regardless of if the flag is enabled.
+  var checkExpectation = (f) => f();
+  checkExpectation(() => describeNativeInterface(x));
+  checkExpectation(() => describeAAA(x));
+
+  checkExpectation(() => x.name);
+  checkExpectation(() => x.size);
+  checkExpectation(() => x.method1());
+  checkExpectation(() => x.method2());
+
+  // Now test that a nullable return type does not have a check.
+  Expect.equals(expectedOptA, describeOptNativeInterface(a));
+  Expect.equals(expectedOptB, describeOptNativeInterface(b));
+  Expect.equals(expectedOptX, describeOptNativeInterface(x));
+
+  Expect.equals(expectedOptA, describeOptAAA(a));
+  Expect.equals(expectedOptX, describeOptAAA(x));
+}
+
+void testJSInvocationNullAssertions(bool flagEnabled) {
+  nativeTesting();
+  setup();
+
+  CCC c = makeC();
+  CCC cx = makeCX();
+
+  Expect.equals(expectedC, describeJSInterface(c));
+
+  // Since invocations are not in a web library, there should be no checks,
+  // regardless of if the flag is enabled.
+  var checkExpectation = (f) => f();
+  checkExpectation(() => describeJSInterface(cx));
+
+  // Test that invocations with a nullable static type do not have checks.
+  Expect.equals(expectedOptC, describeOptJSInterface(c));
+  Expect.equals(expectedOptCX, describeOptJSInterface(cx));
+}
diff --git a/tests/dart2js/native/native_null_assertions/null_assertions_lib.dart b/tests/dart2js/native/native_null_assertions/null_assertions_lib.dart
deleted file mode 100644
index 894fdf0..0000000
--- a/tests/dart2js/native/native_null_assertions/null_assertions_lib.dart
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright (c) 2020, 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 '../native_testing.dart';
-
-abstract class NativeInterface {
-  int get size;
-  String get name;
-  String? get optName;
-  int method1();
-  String method2();
-  String? optMethod();
-}
-
-@Native("AAA")
-class AAA implements NativeInterface {
-  int get size native;
-  String get name native;
-  String? get optName native;
-  int method1() native;
-  String method2() native;
-  String? optMethod() native;
-}
-
-abstract class JSInterface {
-  String get name;
-  String? get optName;
-}
-
-class BBB implements NativeInterface {
-  int get size => 300;
-  String get name => 'Brenda';
-  String? get optName => name;
-  int method1() => 400;
-  String method2() => 'brilliant!';
-  String? optMethod() => method2();
-}
diff --git a/tests/dart2js/native/native_null_assertions/null_assertions_test_lib.dart b/tests/dart2js/native/native_null_assertions/null_assertions_test_lib.dart
index 3f1f540..049cd36 100644
--- a/tests/dart2js/native/native_null_assertions/null_assertions_test_lib.dart
+++ b/tests/dart2js/native/native_null_assertions/null_assertions_test_lib.dart
@@ -3,31 +3,29 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import '../native_testing.dart';
-import 'js_invocations_in_non_web_library.dart';
-import 'js_invocations_in_web_library.dart';
-import 'null_assertions_lib.dart';
 
-/// Returns an 'AAA' object that satisfies the interface.
-AAA makeA() native;
+abstract class NativeInterface {
+  int get size;
+  String get name;
+  String? get optName;
+  int method1();
+  String method2();
+  String? optMethod();
+}
 
-/// Returns an 'AAA' object where each method breaks the interface's contract.
-AAA makeAX() native;
+abstract class JSInterface {
+  String get name;
+  String? get optName;
+}
 
-/// Returns a 'JSInterface' object whose `JS()` invocations exist in a library
-/// that is part of the allowlist.
-CCCInWebLibrary makeWebC() native;
-
-/// Returns the same as above but where each method breaks the interface's
-/// contract.
-CCCInWebLibrary makeWebCX() native;
-
-/// Returns a 'JSInterface' object whose `JS()` invocations exist in a library
-/// that is not part of the allowlist.
-CCCInNonWebLibrary makeNonWebC() native;
-
-/// Returns the same as above but where each method breaks the interface's
-/// contract.
-CCCInNonWebLibrary makeNonWebCX() native;
+class BBB implements NativeInterface {
+  int get size => 300;
+  String get name => 'Brenda';
+  String? get optName => name;
+  int method1() => 400;
+  String method2() => 'brilliant!';
+  String? optMethod() => method2();
+}
 
 void setup() {
   JS('', r"""
@@ -52,40 +50,25 @@
 
   self.nativeConstructor(AAA);
 
-  function CCCInWebLibrary(n) {
-    this.name = n;
-    this.optName = n;
-  }
-  function CCCInNonWebLibrary(n) {
+  function CCC(n) {
     this.name = n;
     this.optName = n;
   }
 
-  makeWebC = function() {
-    return new CCCInWebLibrary('Carol');
+  makeC = function() {
+    return new CCC('Carol');
   };
-  makeWebCX = function() {
-    return new CCCInWebLibrary(void 0);
-  };
-  makeNonWebC = function() {
-    return new CCCInNonWebLibrary('Carol');
-  };
-  makeNonWebCX = function() {
-    return new CCCInNonWebLibrary(void 0);
+  makeCX = function() {
+    return new CCC(void 0);
   };
 
-  self.nativeConstructor(CCCInWebLibrary);
-  self.nativeConstructor(CCCInNonWebLibrary);
+  self.nativeConstructor(CCC);
 })()""");
 }
 
 // The 'NativeInterface' version of the code is passed both native and Dart
 // objects, so there will be an interceptor dispatch to the method. This tests
 // that the null-check exists in the forwarding method.
-//
-// The 'AAA' version of the code is passed only objects of a single native
-// class, so the native method can be inlined (which happens in the optimizer).
-// This tests that the null-check exists in the 'inlined' code.
 
 @pragma('dart2js:noInline')
 String describeNativeInterface(NativeInterface o) {
@@ -93,21 +76,11 @@
 }
 
 @pragma('dart2js:noInline')
-String describeAAA(AAA o) {
-  return '${o.name} ${o.method2()} ${o.size} ${o.method1()}';
-}
-
-@pragma('dart2js:noInline')
 String describeOptNativeInterface(NativeInterface o) {
   return '${o.optName} ${o.optMethod()}';
 }
 
 @pragma('dart2js:noInline')
-String describeOptAAA(AAA o) {
-  return '${o.optName} ${o.optMethod()}';
-}
-
-@pragma('dart2js:noInline')
 String describeJSInterface(JSInterface o) {
   return '${o.name}';
 }
@@ -126,68 +99,3 @@
 const expectedC = 'Carol';
 const expectedOptC = 'Carol';
 const expectedOptCX = 'null';
-
-// Test that `--native-null-assertions` injects null-checks on the returned
-// value of native methods with a non-nullable return type in an opt-in library.
-void testNativeNullAssertions(bool flagEnabled) {
-  nativeTesting();
-  setup();
-  AAA a = makeA();
-  BBB b = BBB();
-
-  Expect.equals(expectedA, describeNativeInterface(a));
-  Expect.equals(expectedB, describeNativeInterface(b));
-
-  Expect.equals(expectedA, describeAAA(a));
-
-  AAA x = makeAX(); // This object returns `null`!
-  var checkExpectation = flagEnabled ? Expect.throws : (f) => f();
-  checkExpectation(() => describeNativeInterface(x));
-  checkExpectation(() => describeAAA(x));
-
-  checkExpectation(() => x.name);
-  checkExpectation(() => x.size);
-  checkExpectation(() => x.method1());
-  checkExpectation(() => x.method2());
-
-  // Now test that a nullable return type does not have a check.
-  Expect.equals(expectedOptA, describeOptNativeInterface(a));
-  Expect.equals(expectedOptB, describeOptNativeInterface(b));
-  Expect.equals(expectedOptX, describeOptNativeInterface(x));
-
-  Expect.equals(expectedOptA, describeOptAAA(a));
-  Expect.equals(expectedOptX, describeOptAAA(x));
-}
-
-// Test that `--native-null-assertions` injects null-checks on the returned
-// value of `JS()` invocations with a non-nullable static type in an opt-in
-// library.
-void testJSInvocationNullAssertions(bool flagEnabled) {
-  nativeTesting();
-  setup();
-
-  CCCInWebLibrary webC = makeWebC();
-  CCCInWebLibrary webCX = makeWebCX();
-
-  CCCInNonWebLibrary nonWebC = makeNonWebC();
-  CCCInNonWebLibrary nonWebCX = makeNonWebCX();
-
-  Expect.equals(expectedC, describeJSInterface(webC));
-  Expect.equals(expectedC, describeJSInterface(nonWebC));
-
-  // If invocations are in a web library, this should throw if null checks are
-  // enabled.
-  var checkExpectationWeb = flagEnabled ? Expect.throws : (f) => f();
-  checkExpectationWeb(() => describeJSInterface(webCX));
-
-  // If invocations are not in a web library, there should not be a null check
-  // regardless if the flag is enabled or not.
-  var checkExpectationNonWeb = (f) => f();
-  checkExpectationNonWeb(() => describeJSInterface(nonWebCX));
-
-  // Test that invocations with a nullable static type do not have checks.
-  Expect.equals(expectedOptC, describeOptJSInterface(webC));
-  Expect.equals(expectedOptC, describeOptJSInterface(nonWebC));
-  Expect.equals(expectedOptCX, describeOptJSInterface(webCX));
-  Expect.equals(expectedOptCX, describeOptJSInterface(nonWebCX));
-}
diff --git a/tests/dart2js/native/native_null_assertions/web_library_interfaces.dart b/tests/dart2js/native/native_null_assertions/web_library_interfaces.dart
new file mode 100644
index 0000000..48bb86b
--- /dev/null
+++ b/tests/dart2js/native/native_null_assertions/web_library_interfaces.dart
@@ -0,0 +1,105 @@
+// Copyright (c) 2020, 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 '../native_testing.dart';
+import 'null_assertions_test_lib.dart';
+
+// Implementations of `NativeInterface` and `JSInterface` in a folder that is
+// part of the allowlist for the `--native-null-assertions` flag. This file is
+// treated as a web library, and therefore native members and `JS()` invocations
+// should be checked.
+
+@Native("AAA")
+class AAA implements NativeInterface {
+  int get size native;
+  String get name native;
+  String? get optName native;
+  int method1() native;
+  String method2() native;
+  String? optMethod() native;
+}
+
+@Native('CCC')
+class CCC implements JSInterface {
+  String get name => JS('String', '#.name', this);
+  String? get optName => JS('String|Null', '#.optName', this);
+}
+
+/// Returns an 'AAA' object that satisfies the interface.
+AAA makeA() native;
+
+/// Returns an 'AAA' object where each method breaks the interface's contract.
+AAA makeAX() native;
+
+/// Returns a 'CCC' object that satisfies the interface using `JS()`
+/// invocations.
+CCC makeC() native;
+
+/// Returns a 'CCC' object where each method breaks the interface's contract.
+CCC makeCX() native;
+
+// The 'AAA' version of the code is passed only objects of a single native
+// class, so the native method can be inlined (which happens in the optimizer).
+// This tests that the null-check exists in the 'inlined' code.
+
+@pragma('dart2js:noInline')
+String describeAAA(AAA o) {
+  return '${o.name} ${o.method2()} ${o.size} ${o.method1()}';
+}
+
+@pragma('dart2js:noInline')
+String describeOptAAA(AAA o) {
+  return '${o.optName} ${o.optMethod()}';
+}
+
+void testNativeNullAssertions(bool flagEnabled) {
+  nativeTesting();
+  setup();
+  AAA a = makeA();
+  BBB b = BBB();
+
+  Expect.equals(expectedA, describeNativeInterface(a));
+  Expect.equals(expectedB, describeNativeInterface(b));
+
+  Expect.equals(expectedA, describeAAA(a));
+
+  AAA x = makeAX(); // This object returns `null`!
+  // Since native members are in a web library, this should throw if null checks
+  // are enabled.
+  var checkExpectation = flagEnabled ? Expect.throws : (f) => f();
+  checkExpectation(() => describeNativeInterface(x));
+  checkExpectation(() => describeAAA(x));
+
+  checkExpectation(() => x.name);
+  checkExpectation(() => x.size);
+  checkExpectation(() => x.method1());
+  checkExpectation(() => x.method2());
+
+  // Now test that a nullable return type does not have a check.
+  Expect.equals(expectedOptA, describeOptNativeInterface(a));
+  Expect.equals(expectedOptB, describeOptNativeInterface(b));
+  Expect.equals(expectedOptX, describeOptNativeInterface(x));
+
+  Expect.equals(expectedOptA, describeOptAAA(a));
+  Expect.equals(expectedOptX, describeOptAAA(x));
+}
+
+void testJSInvocationNullAssertions(bool flagEnabled) {
+  nativeTesting();
+  setup();
+
+  CCC c = makeC();
+  CCC cx = makeCX();
+
+  Expect.equals(expectedC, describeJSInterface(c));
+
+  // Since invocations are in a web library, this should throw if null checks
+  // are enabled.
+  var checkExpectation = flagEnabled ? Expect.throws : (f) => f();
+  checkExpectation(() => describeJSInterface(cx));
+
+  // Test that invocations with a nullable static type do not have checks.
+  Expect.equals(expectedOptC, describeOptJSInterface(c));
+  Expect.equals(expectedOptCX, describeOptJSInterface(cx));
+}
diff --git a/tests/dart2js_2/internal/rti/required_named_parameters_test.dart b/tests/dart2js_2/internal/rti/required_named_parameters_test.dart
index c07f7a4..ccf3f7d 100644
--- a/tests/dart2js_2/internal/rti/required_named_parameters_test.dart
+++ b/tests/dart2js_2/internal/rti/required_named_parameters_test.dart
@@ -51,11 +51,13 @@
 
   // Subtype may not redeclare optional parameters as required
   rti2 = rti.testingUniverseEval(universe, "@(A,{a!A,b!A,c!A})");
-  Expect.equals(isWeakMode, rti.testingIsSubtype(universe, rti2, rti1));
+  Expect.equals(
+      hasUnsoundNullSafety, rti.testingIsSubtype(universe, rti2, rti1));
 
   // Subtype may not declare new required named parameters
   rti2 = rti.testingUniverseEval(universe, "@(A,{a!A,b:A,c!A,d!A})");
-  Expect.equals(isWeakMode, rti.testingIsSubtype(universe, rti2, rti1));
+  Expect.equals(
+      hasUnsoundNullSafety, rti.testingIsSubtype(universe, rti2, rti1));
 
   // Rti.toString() appears as expected
   Expect.equals('(B, {required B a, B b, required B c}) => dynamic',
diff --git a/tests/dartdevc/debugger/debugger_test.dart b/tests/dartdevc/debugger/debugger_test.dart
index 3765d6b..79b12a1 100644
--- a/tests/dartdevc/debugger/debugger_test.dart
+++ b/tests/dartdevc/debugger/debugger_test.dart
@@ -81,7 +81,7 @@
   return value;
 }
 
-String format(value) {
+String? format(value) {
   // Avoid double-escaping strings.
   if (value is String) return value;
   return stringify(value, allowInterop(replacer), 4);
@@ -90,8 +90,8 @@
 class FormattedObject {
   FormattedObject(this.object, this.config);
 
-  Object object;
-  Object config;
+  Object? object;
+  Object? config;
 }
 
 /// Extract all object tags from a json ml expression to enable
@@ -130,14 +130,14 @@
   var goldenUrl = '/root_dart/tests/dartdevc_2/debugger/'
       'debugger_test_golden.txt?cacheBlock=$cacheBlocker';
 
-  String golden;
+  String? golden;
   try {
     golden = (await HttpRequest.getString(goldenUrl)).trim();
   } catch (e) {
     print("Warning: couldn't load golden file from $goldenUrl");
   }
 
-  document.body.append(new ScriptElement()
+  document.body!.append(new ScriptElement()
     ..type = 'text/javascript'
     ..innerHtml = r"""
 window.ExampleJSClass = function ExampleJSClass(x) {
@@ -333,16 +333,16 @@
       print(helpMessage);
       // Copy text to clipboard on page click. We can't copy to the clipboard
       // without a click due to Chrome security.
-      TextAreaElement textField = new Element.tag('textarea');
+      var textField = new Element.tag('textarea') as TextAreaElement;
       textField.maxLength = 100000000;
       textField.text = actualStr;
       textField.style
         ..width = '800px'
         ..height = '400px';
-      document.body.append(new Element.tag('h3')
+      document.body!.append(new Element.tag('h3')
         ..innerHtml = helpMessage.replaceAll('\n', '<br>'));
-      document.body.append(textField);
-      document.body.onClick.listen((_) {
+      document.body!.append(textField);
+      document.body!.onClick.listen((_) {
         textField.select();
         var result = document.execCommand('copy');
         if (result) {
@@ -352,6 +352,12 @@
         }
       });
     }
-    expect(actualStr == golden, isTrue);
+    // TODO(vsm): This comparison appears to be badly broken for several
+    // reasons:
+    //   (1) The golden file isn't properly read on the bots or locally (see try
+    //       / catch above).
+    //   (2) The actual string appears to vary locally vs on the bots.
+    //   (3) Because of (2), visualizing the diff is difficult.
+    // expect(actualStr == golden, isTrue);
   });
 }
diff --git a/tests/dartdevc_2/debugger/debugger_test.dart b/tests/dartdevc_2/debugger/debugger_test.dart
index 94d4a63..062088f 100644
--- a/tests/dartdevc_2/debugger/debugger_test.dart
+++ b/tests/dartdevc_2/debugger/debugger_test.dart
@@ -354,6 +354,12 @@
         }
       });
     }
-    expect(actualStr == golden, isTrue);
+    // TODO(vsm): This comparison appears to be badly broken for several
+    // reasons:
+    //   (1) The golden file isn't properly read on the bots or locally (see try
+    //       / catch above).
+    //   (2) The actual string appears to vary locally vs on the bots.
+    //   (3) Because of (2), visualizing the diff is difficult.
+    // expect(actualStr == golden, isTrue);
   });
 }
diff --git a/tests/dartdevc_2/debugger/debugger_test_golden.txt b/tests/dartdevc_2/debugger/debugger_test_golden.txt
index 0b12aa0..80f211d 100644
--- a/tests/dartdevc_2/debugger/debugger_test_golden.txt
+++ b/tests/dartdevc_2/debugger/debugger_test_golden.txt
@@ -108,9 +108,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "asClass"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -227,9 +225,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "asClass"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -291,9 +287,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -319,9 +313,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -347,9 +339,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -375,9 +365,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -403,9 +391,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -431,9 +417,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -459,9 +443,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -487,9 +469,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -515,9 +495,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -543,9 +521,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -571,9 +547,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -599,9 +573,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -627,9 +599,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -655,9 +625,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -683,9 +651,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -711,9 +677,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -739,9 +703,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -767,9 +729,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -795,9 +755,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -823,9 +781,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -851,9 +807,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -879,9 +833,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -907,9 +859,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -935,9 +885,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -963,9 +911,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -991,9 +937,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -1019,9 +963,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -1047,9 +989,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -1075,9 +1015,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -1103,9 +1041,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -1131,9 +1067,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -1159,9 +1093,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -1187,9 +1119,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -1215,9 +1145,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -1243,9 +1171,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -1271,9 +1197,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -1299,9 +1223,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -1327,9 +1249,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -1355,9 +1275,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -1383,9 +1301,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -1411,9 +1327,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -1439,9 +1353,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -1467,9 +1379,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -1495,9 +1405,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -1523,9 +1431,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -1551,9 +1457,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -1579,9 +1483,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -1607,9 +1509,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -1635,9 +1535,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -1663,9 +1561,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -1691,9 +1587,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -1719,9 +1613,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -1747,9 +1639,33 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "_setLengthUnsafe: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
                 }
             ]
         ]
@@ -1775,9 +1691,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "asClass"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -1815,9 +1729,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -1836,9 +1748,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -1864,9 +1774,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "asClass"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -1928,9 +1836,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -1956,9 +1862,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -1984,9 +1888,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -2012,9 +1914,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -2040,9 +1940,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -2068,9 +1966,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -2096,9 +1992,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -2124,9 +2018,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -2152,9 +2044,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -2180,9 +2070,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -2208,9 +2096,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -2236,9 +2122,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -2264,9 +2148,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -2292,9 +2174,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -2320,9 +2200,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -2348,9 +2226,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -2376,9 +2252,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -2404,9 +2278,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -2432,9 +2304,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -2460,9 +2330,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -2488,9 +2356,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -2516,9 +2382,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -2544,9 +2408,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -2572,9 +2434,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -2600,9 +2460,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -2628,9 +2486,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -2656,9 +2512,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -2684,9 +2538,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -2712,9 +2564,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -2740,9 +2590,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -2768,9 +2616,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -2796,9 +2642,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -2824,9 +2668,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -2852,9 +2694,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -2880,9 +2720,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -2908,9 +2746,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -2936,9 +2772,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -2964,9 +2798,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -2992,9 +2824,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -3020,9 +2850,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -3048,9 +2876,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -3076,9 +2902,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -3104,9 +2928,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -3132,9 +2954,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -3160,9 +2980,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -3188,9 +3006,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -3216,9 +3032,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -3244,9 +3058,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -3272,9 +3084,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -3300,9 +3110,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -3328,9 +3136,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -3356,9 +3162,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -3384,9 +3188,33 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "_setLengthUnsafe: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
                 }
             ]
         ]
@@ -3412,9 +3240,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "asClass"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -3531,9 +3357,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "asClass"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -3584,7 +3408,7 @@
             {
                 "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
-            "elementAt: "
+            "fold: "
         ],
         [
             "span",
@@ -3595,9 +3419,33 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "map: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
                 }
             ]
         ]
@@ -3623,9 +3471,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "asClass"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -3742,9 +3588,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "asClass"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -3806,37 +3650,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
-                }
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {
-                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
-            },
-            "addAll: "
-        ],
-        [
-            "span",
-            {
-                "style": "margin-left: 13px"
-            },
-            [
-                "object",
-                {
-                    "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -3862,9 +3676,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -3890,9 +3702,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -3918,9 +3728,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -3946,9 +3754,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -3974,9 +3780,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -4002,9 +3806,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "asClass"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -4049,9 +3851,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -4077,9 +3877,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -4105,9 +3903,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -4133,9 +3929,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "asClass"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -4180,9 +3974,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -4208,9 +4000,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -4236,9 +4026,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -4264,9 +4052,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "asClass"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -4317,34 +4103,6 @@
             {
                 "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
-            "addAll: "
-        ],
-        [
-            "span",
-            {
-                "style": "margin-left: 13px"
-            },
-            [
-                "object",
-                {
-                    "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
-                }
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {
-                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
-            },
             "clear: "
         ],
         [
@@ -4356,37 +4114,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
-                }
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {
-                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
-            },
-            "putIfAbsent: "
-        ],
-        [
-            "span",
-            {
-                "style": "margin-left: 13px"
-            },
-            [
-                "object",
-                {
-                    "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -4412,9 +4140,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -4440,9 +4166,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -4468,9 +4192,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -4496,9 +4218,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "asClass"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -4567,9 +4287,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "skipDart"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -4638,9 +4356,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "skipDart"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -4708,9 +4424,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -4736,9 +4450,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "asClass"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -4814,9 +4526,121 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": ""
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": ""
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": ""
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": ""
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": ""
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": ""
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
                 }
             ]
         ]
@@ -4861,9 +4685,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "asClass"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -4889,93 +4711,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "asClass"
-                    }
-                }
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {
-                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
-            },
-            "devtoolsFormatters: "
-        ],
-        [
-            "span",
-            {
-                "style": "margin-left: 13px"
-            },
-            [
-                "object",
-                {
-                    "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
-                }
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {
-                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
-            },
-            "replacer: "
-        ],
-        [
-            "span",
-            {
-                "style": "margin-left: 13px"
-            },
-            [
-                "object",
-                {
-                    "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
-                }
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {
-                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
-            },
-            "format: "
-        ],
-        [
-            "span",
-            {
-                "style": "margin-left: 13px"
-            },
-            [
-                "object",
-                {
-                    "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -5001,9 +4737,59 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "asClass"
-                    }
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "replacer: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "format: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
                 }
             ]
         ]
@@ -5029,9 +4815,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -5057,9 +4841,2269 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "devtoolsFormatters: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ]
+]
+-----------------------------------
+Test: Test library Module child 1 formatting header
+Value:
+[
+    "span",
+    {
+        "style": "background-color: #d9edf7;color: black"
+    },
+    "<FILE>"
+]
+-----------------------------------
+Test: Test library Module child 1 formatting body
+Value:
+[
+    "ol",
+    {
+        "style": "list-style-type: none;padding-left: 0px;margin-top: 0px;margin-bottom: 0px;margin-left: 12px;"
+    },
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "JS: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "_Anonymous: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "anonymous: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ]
+]
+-----------------------------------
+Test: Test library Module child 2 formatting header
+Value:
+[
+    "span",
+    {
+        "style": "background-color: #d9edf7;color: black"
+    },
+    "<FILE>"
+]
+-----------------------------------
+Test: Test library Module child 2 formatting body
+Value:
+[
+    "ol",
+    {
+        "style": "list-style-type: none;padding-left: 0px;margin-top: 0px;margin-bottom: 0px;margin-left: 12px;"
+    }
+]
+-----------------------------------
+Test: Test library Module child 3 formatting header
+Value:
+[
+    "span",
+    {
+        "style": "background-color: #d9edf7;color: black"
+    },
+    "<FILE>"
+]
+-----------------------------------
+Test: Test library Module child 3 formatting body
+Value:
+[
+    "ol",
+    {
+        "style": "list-style-type: none;padding-left: 0px;margin-top: 0px;margin-bottom: 0px;margin-left: 12px;"
+    },
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "_Group: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "_Expectation: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "finishTests: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "group: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "test: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "setUp: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "tearDown: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "expect: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "fail: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "equals: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "notEquals: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "unorderedEquals: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "predicate: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "inInclusiveRange: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "greaterThan: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "same: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "closeTo: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "anyOf: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "_defaultAction: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "_groups: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "isFalse: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "isNotNull: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "isNull: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "isTrue: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "returnsNormally: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "throws: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "throwsArgumentError: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "throwsNoSuchMethodError: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "throwsRangeError: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "throwsStateError: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "throwsUnsupportedError: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ]
+]
+-----------------------------------
+Test: Test library Module child 4 formatting header
+Value:
+[
+    "span",
+    {
+        "style": "background-color: #d9edf7;color: black"
+    },
+    "<FILE>"
+]
+-----------------------------------
+Test: Test library Module child 4 formatting body
+Value:
+[
+    "ol",
+    {
+        "style": "list-style-type: none;padding-left: 0px;margin-top: 0px;margin-bottom: 0px;margin-left: 12px;"
+    },
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "Expect: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "ExpectException: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "_identical: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+                },
+                "isWeakMode: "
+            ],
+            [
+                "span",
+                {
+                    "style": "margin-left: 13px"
+                },
+                "true"
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+                },
+                "isStrongMode: "
+            ],
+            [
+                "span",
+                {
+                    "style": "margin-left: 13px"
+                },
+                "false"
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+                },
+                "typeAssertionsEnabled: "
+            ],
+            [
+                "span",
+                {
+                    "style": "margin-left: 13px"
+                },
+                "true"
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+                },
+                "assertStatementsEnabled: "
+            ],
+            [
+                "span",
+                {
+                    "style": "margin-left: 13px"
+                },
+                "true"
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+                },
+                "checkedModeEnabled: "
+            ],
+            [
+                "span",
+                {
+                    "style": "margin-left: 13px"
+                },
+                "true"
+            ]
+        ]
+    ]
+]
+-----------------------------------
+Test: Test library Module child 5 formatting header
+Value:
+[
+    "span",
+    {
+        "style": "background-color: #d9edf7;color: black"
+    },
+    "<FILE>"
+]
+-----------------------------------
+Test: Test library Module child 5 formatting body
+Value:
+[
+    "ol",
+    {
+        "style": "list-style-type: none;padding-left: 0px;margin-top: 0px;margin-bottom: 0px;margin-left: 12px;"
+    },
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "Immutable: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "Required: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "_AlwaysThrows: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "_Checked: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "_DoNotStore: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "_Experimental: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "_Factory: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "_Internal: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "_IsTest: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "_IsTestGroup: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "_Literal: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "_MustCallSuper: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "_NonVirtual: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "_OptionalTypeArgs: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "_Protected: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "_Sealed: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "_Virtual: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "_VisibleForOverriding: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "_VisibleForTesting: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "alwaysThrows: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "checked: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "doNotStore: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "experimental: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "factory: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "immutable: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "internal: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "isTest: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "isTestGroup: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "literal: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "mustCallSuper: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "nonVirtual: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "optionalTypeArgs: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "protected: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "required: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "sealed: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "virtual: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "visibleForOverriding: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "visibleForTesting: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ]
+]
+-----------------------------------
+Test: Test library Module child 6 formatting header
+Value:
+[
+    "span",
+    {
+        "style": "background-color: #d9edf7;color: black"
+    },
+    "<FILE>"
+]
+-----------------------------------
+Test: Test library Module child 6 formatting body
+Value:
+[
+    "ol",
+    {
+        "style": "list-style-type: none;padding-left: 0px;margin-top: 0px;margin-bottom: 0px;margin-left: 12px;"
+    },
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "Target: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "TargetKind: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
                 }
             ]
         ]
@@ -5443,9 +7487,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -5495,9 +7537,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -5547,9 +7587,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "asClass"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -5611,9 +7649,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -5639,9 +7675,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -5667,9 +7701,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -5695,9 +7727,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -5723,9 +7753,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "asClass"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -5756,6 +7784,240 @@
         },
         [
             "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "on: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "onAbort: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "onError: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "onLoad: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "onLoadEnd: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "onLoadStart: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "onProgress: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "onReadyStateChange: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "onTimeout: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
             {},
             [
                 "span",
@@ -5786,6 +8048,56 @@
                 {
                     "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
                 },
+                "response: "
+            ],
+            [
+                "span",
+                {
+                    "style": "margin-left: 13px"
+                },
+                ""
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "responseHeaders: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+                },
                 "responseText: "
             ],
             [
@@ -5866,9 +8178,33 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "runtimeType: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {}
                 }
             ]
         ]
@@ -5966,9 +8302,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -6031,338 +8365,6 @@
             {
                 "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
             },
-            "on: "
-        ],
-        [
-            "span",
-            {
-                "style": "margin-left: 13px"
-            },
-            [
-                "object",
-                {
-                    "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
-                }
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {
-                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
-            },
-            "onAbort: "
-        ],
-        [
-            "span",
-            {
-                "style": "margin-left: 13px"
-            },
-            [
-                "object",
-                {
-                    "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
-                }
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {
-                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
-            },
-            "onError: "
-        ],
-        [
-            "span",
-            {
-                "style": "margin-left: 13px"
-            },
-            [
-                "object",
-                {
-                    "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
-                }
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {
-                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
-            },
-            "onLoad: "
-        ],
-        [
-            "span",
-            {
-                "style": "margin-left: 13px"
-            },
-            [
-                "object",
-                {
-                    "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
-                }
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {
-                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
-            },
-            "onLoadEnd: "
-        ],
-        [
-            "span",
-            {
-                "style": "margin-left: 13px"
-            },
-            [
-                "object",
-                {
-                    "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
-                }
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {
-                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
-            },
-            "onLoadStart: "
-        ],
-        [
-            "span",
-            {
-                "style": "margin-left: 13px"
-            },
-            [
-                "object",
-                {
-                    "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
-                }
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {
-                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
-            },
-            "onProgress: "
-        ],
-        [
-            "span",
-            {
-                "style": "margin-left: 13px"
-            },
-            [
-                "object",
-                {
-                    "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
-                }
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {
-                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
-            },
-            "onReadyStateChange: "
-        ],
-        [
-            "span",
-            {
-                "style": "margin-left: 13px"
-            },
-            [
-                "object",
-                {
-                    "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
-                }
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {
-                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
-            },
-            "onTimeout: "
-        ],
-        [
-            "span",
-            {
-                "style": "margin-left: 13px"
-            },
-            [
-                "object",
-                {
-                    "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
-                }
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {},
-            [
-                "span",
-                {
-                    "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
-                },
-                "response: "
-            ],
-            [
-                "span",
-                {
-                    "style": "margin-left: 13px"
-                },
-                ""
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {
-                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
-            },
-            "responseHeaders: "
-        ],
-        [
-            "span",
-            {
-                "style": "margin-left: 13px"
-            },
-            [
-                "object",
-                {
-                    "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
-                }
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {
-                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
-            },
-            "runtimeType: "
-        ],
-        [
-            "span",
-            {
-                "style": "margin-left: 13px"
-            },
-            [
-                "object",
-                {
-                    "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
-                }
-            ]
-        ]
-    ],
-    [
-        "li",
-        {
-            "style": "padding-left: 13px;"
-        },
-        [
-            "span",
-            {
-                "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
-            },
             "[[class]]: "
         ],
         [
@@ -6374,9 +8376,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "asClass"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -6438,9 +8438,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -6466,9 +8464,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -6494,9 +8490,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -6522,9 +8516,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -6550,9 +8542,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -6578,9 +8568,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -6606,9 +8594,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -6634,9 +8620,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "asClass"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -6705,9 +8689,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -6733,9 +8715,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "asClass"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -6797,9 +8777,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -6825,9 +8803,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -6853,9 +8829,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -6881,9 +8855,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "asClass"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -6928,9 +8900,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -6956,9 +8926,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -6984,9 +8952,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "asClass"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -7048,9 +9014,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -7076,9 +9040,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -7104,9 +9066,7 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "none"
-                    }
+                    "config": {}
                 }
             ]
         ]
@@ -7132,12 +9092,10 @@
                 "object",
                 {
                     "object": "<OBJECT>",
-                    "config": {
-                        "name": "asClass"
-                    }
+                    "config": {}
                 }
             ]
         ]
     ]
 ]
------------------------------------
+-----------------------------------
\ No newline at end of file
diff --git a/tests/ffi/callback_tests_utils.dart b/tests/ffi/callback_tests_utils.dart
index ac5fdcb..e34a52b 100644
--- a/tests/ffi/callback_tests_utils.dart
+++ b/tests/ffi/callback_tests_utils.dart
@@ -16,19 +16,23 @@
 class CallbackTest {
   final String name;
   final Pointer callback;
-  final bool skip;
+  final void Function() afterCallbackChecks;
 
-  CallbackTest(this.name, this.callback, {bool skipIf: false})
-      : skip = skipIf {}
+  CallbackTest(this.name, this.callback) : afterCallbackChecks = noChecks {}
+  CallbackTest.withCheck(this.name, this.callback, this.afterCallbackChecks) {}
 
   void run() {
-    if (skip) return;
-
     final NativeCallbackTestFn tester = ffiTestFunctions
         .lookupFunction<NativeCallbackTest, NativeCallbackTestFn>("Test$name");
+
     final int testCode = tester(callback);
+
     if (testCode != 0) {
       Expect.fail("Test $name failed.");
     }
+
+    afterCallbackChecks();
   }
 }
+
+void noChecks() {}
diff --git a/tests/ffi/dylib_isolates_test.dart b/tests/ffi/dylib_isolates_test.dart
index 5eb73ef..f790e12 100644
--- a/tests/ffi/dylib_isolates_test.dart
+++ b/tests/ffi/dylib_isolates_test.dart
@@ -7,6 +7,7 @@
 // SharedObjects=ffi_test_functions
 
 import 'dart:ffi';
+import 'dart:io';
 import 'dart:isolate';
 
 import "package:expect/expect.dart";
@@ -29,7 +30,9 @@
   final receivePort = ReceivePort();
   Isolate.spawn(secondIsolateMain, receivePort.sendPort);
   await receivePort.first;
-  Expect.equals(42, getGlobalVar());
+  if (!Platform.isIOS /* Static linking causes different behavior. */) {
+    Expect.equals(42, getGlobalVar());
+  }
 }
 
 void secondIsolateMain(SendPort sendPort) {
diff --git a/tests/ffi/ffi.status b/tests/ffi/ffi.status
index 37ab3e9..3baf069 100644
--- a/tests/ffi/ffi.status
+++ b/tests/ffi/ffi.status
@@ -2,6 +2,11 @@
 # 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.
 
+# TODO(dartbug.com/36730): Implement structs by value.
+function_callbacks_structs_by_value_generated_test: Skip
+function_callbacks_structs_by_value_test: Skip
+function_structs_by_value_generated_test: Skip
+
 [ $builder_tag == msan ]
 vmspecific_handle_test: Skip # https://dartbug.com/42314
 
diff --git a/tests/ffi/function_callbacks_structs_by_value_generated_test.dart b/tests/ffi/function_callbacks_structs_by_value_generated_test.dart
new file mode 100644
index 0000000..845ebb9
--- /dev/null
+++ b/tests/ffi/function_callbacks_structs_by_value_generated_test.dart
@@ -0,0 +1,6668 @@
+// Copyright (c) 2020, 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.
+//
+// This file has been automatically generated. Please do not edit it manually.
+//
+// SharedObjects=ffi_test_functions
+// VMOptions=
+// VMOptions=--deterministic --optimization-counter-threshold=10
+// VMOptions=--use-slow-path
+// VMOptions=--use-slow-path --stacktrace-every=100
+
+import 'dart:ffi';
+
+import "package:expect/expect.dart";
+import "package:ffi/ffi.dart";
+
+import 'callback_tests_utils.dart';
+
+// Reuse the struct classes.
+import 'function_structs_by_value_generated_test.dart';
+
+void main() {
+  testCases.forEach((t) {
+    print("==== Running " + t.name);
+    t.run();
+  });
+}
+
+final testCases = [
+  CallbackTest.withCheck(
+      "PassStruct1ByteIntx10",
+      Pointer.fromFunction<PassStruct1ByteIntx10Type>(passStruct1ByteIntx10, 0),
+      passStruct1ByteIntx10AfterCallback),
+  CallbackTest.withCheck(
+      "PassStruct3BytesHomogeneousUint8x10",
+      Pointer.fromFunction<PassStruct3BytesHomogeneousUint8x10Type>(
+          passStruct3BytesHomogeneousUint8x10, 0),
+      passStruct3BytesHomogeneousUint8x10AfterCallback),
+  CallbackTest.withCheck(
+      "PassStruct3BytesInt2ByteAlignedx10",
+      Pointer.fromFunction<PassStruct3BytesInt2ByteAlignedx10Type>(
+          passStruct3BytesInt2ByteAlignedx10, 0),
+      passStruct3BytesInt2ByteAlignedx10AfterCallback),
+  CallbackTest.withCheck(
+      "PassStruct4BytesHomogeneousInt16x10",
+      Pointer.fromFunction<PassStruct4BytesHomogeneousInt16x10Type>(
+          passStruct4BytesHomogeneousInt16x10, 0),
+      passStruct4BytesHomogeneousInt16x10AfterCallback),
+  CallbackTest.withCheck(
+      "PassStruct7BytesHomogeneousUint8x10",
+      Pointer.fromFunction<PassStruct7BytesHomogeneousUint8x10Type>(
+          passStruct7BytesHomogeneousUint8x10, 0),
+      passStruct7BytesHomogeneousUint8x10AfterCallback),
+  CallbackTest.withCheck(
+      "PassStruct7BytesInt4ByteAlignedx10",
+      Pointer.fromFunction<PassStruct7BytesInt4ByteAlignedx10Type>(
+          passStruct7BytesInt4ByteAlignedx10, 0),
+      passStruct7BytesInt4ByteAlignedx10AfterCallback),
+  CallbackTest.withCheck(
+      "PassStruct8BytesIntx10",
+      Pointer.fromFunction<PassStruct8BytesIntx10Type>(
+          passStruct8BytesIntx10, 0),
+      passStruct8BytesIntx10AfterCallback),
+  CallbackTest.withCheck(
+      "PassStruct8BytesHomogeneousFloatx10",
+      Pointer.fromFunction<PassStruct8BytesHomogeneousFloatx10Type>(
+          passStruct8BytesHomogeneousFloatx10, 0.0),
+      passStruct8BytesHomogeneousFloatx10AfterCallback),
+  CallbackTest.withCheck(
+      "PassStruct8BytesMixedx10",
+      Pointer.fromFunction<PassStruct8BytesMixedx10Type>(
+          passStruct8BytesMixedx10, 0.0),
+      passStruct8BytesMixedx10AfterCallback),
+  CallbackTest.withCheck(
+      "PassStruct9BytesHomogeneousUint8x10",
+      Pointer.fromFunction<PassStruct9BytesHomogeneousUint8x10Type>(
+          passStruct9BytesHomogeneousUint8x10, 0),
+      passStruct9BytesHomogeneousUint8x10AfterCallback),
+  CallbackTest.withCheck(
+      "PassStruct9BytesInt4Or8ByteAlignedx10",
+      Pointer.fromFunction<PassStruct9BytesInt4Or8ByteAlignedx10Type>(
+          passStruct9BytesInt4Or8ByteAlignedx10, 0),
+      passStruct9BytesInt4Or8ByteAlignedx10AfterCallback),
+  CallbackTest.withCheck(
+      "PassStruct12BytesHomogeneousFloatx6",
+      Pointer.fromFunction<PassStruct12BytesHomogeneousFloatx6Type>(
+          passStruct12BytesHomogeneousFloatx6, 0.0),
+      passStruct12BytesHomogeneousFloatx6AfterCallback),
+  CallbackTest.withCheck(
+      "PassStruct16BytesHomogeneousFloatx5",
+      Pointer.fromFunction<PassStruct16BytesHomogeneousFloatx5Type>(
+          passStruct16BytesHomogeneousFloatx5, 0.0),
+      passStruct16BytesHomogeneousFloatx5AfterCallback),
+  CallbackTest.withCheck(
+      "PassStruct16BytesMixedx10",
+      Pointer.fromFunction<PassStruct16BytesMixedx10Type>(
+          passStruct16BytesMixedx10, 0.0),
+      passStruct16BytesMixedx10AfterCallback),
+  CallbackTest.withCheck(
+      "PassStruct16BytesMixed2x10",
+      Pointer.fromFunction<PassStruct16BytesMixed2x10Type>(
+          passStruct16BytesMixed2x10, 0.0),
+      passStruct16BytesMixed2x10AfterCallback),
+  CallbackTest.withCheck(
+      "PassStruct17BytesIntx10",
+      Pointer.fromFunction<PassStruct17BytesIntx10Type>(
+          passStruct17BytesIntx10, 0),
+      passStruct17BytesIntx10AfterCallback),
+  CallbackTest.withCheck(
+      "PassStruct19BytesHomogeneousUint8x10",
+      Pointer.fromFunction<PassStruct19BytesHomogeneousUint8x10Type>(
+          passStruct19BytesHomogeneousUint8x10, 0),
+      passStruct19BytesHomogeneousUint8x10AfterCallback),
+  CallbackTest.withCheck(
+      "PassStruct20BytesHomogeneousInt32x10",
+      Pointer.fromFunction<PassStruct20BytesHomogeneousInt32x10Type>(
+          passStruct20BytesHomogeneousInt32x10, 0),
+      passStruct20BytesHomogeneousInt32x10AfterCallback),
+  CallbackTest.withCheck(
+      "PassStruct20BytesHomogeneousFloat",
+      Pointer.fromFunction<PassStruct20BytesHomogeneousFloatType>(
+          passStruct20BytesHomogeneousFloat, 0.0),
+      passStruct20BytesHomogeneousFloatAfterCallback),
+  CallbackTest.withCheck(
+      "PassStruct32BytesHomogeneousDoublex5",
+      Pointer.fromFunction<PassStruct32BytesHomogeneousDoublex5Type>(
+          passStruct32BytesHomogeneousDoublex5, 0.0),
+      passStruct32BytesHomogeneousDoublex5AfterCallback),
+  CallbackTest.withCheck(
+      "PassStruct40BytesHomogeneousDouble",
+      Pointer.fromFunction<PassStruct40BytesHomogeneousDoubleType>(
+          passStruct40BytesHomogeneousDouble, 0.0),
+      passStruct40BytesHomogeneousDoubleAfterCallback),
+  CallbackTest.withCheck(
+      "PassStruct1024BytesHomogeneousUint64",
+      Pointer.fromFunction<PassStruct1024BytesHomogeneousUint64Type>(
+          passStruct1024BytesHomogeneousUint64, 0),
+      passStruct1024BytesHomogeneousUint64AfterCallback),
+  CallbackTest.withCheck(
+      "PassFloatStruct16BytesHomogeneousFloatFloatStruct1",
+      Pointer.fromFunction<
+              PassFloatStruct16BytesHomogeneousFloatFloatStruct1Type>(
+          passFloatStruct16BytesHomogeneousFloatFloatStruct1, 0.0),
+      passFloatStruct16BytesHomogeneousFloatFloatStruct1AfterCallback),
+  CallbackTest.withCheck(
+      "PassFloatStruct32BytesHomogeneousDoubleFloatStruct",
+      Pointer.fromFunction<
+              PassFloatStruct32BytesHomogeneousDoubleFloatStructType>(
+          passFloatStruct32BytesHomogeneousDoubleFloatStruct, 0.0),
+      passFloatStruct32BytesHomogeneousDoubleFloatStructAfterCallback),
+  CallbackTest.withCheck(
+      "PassInt8Struct16BytesMixedInt8Struct16BytesMixedIn",
+      Pointer.fromFunction<
+              PassInt8Struct16BytesMixedInt8Struct16BytesMixedInType>(
+          passInt8Struct16BytesMixedInt8Struct16BytesMixedIn, 0.0),
+      passInt8Struct16BytesMixedInt8Struct16BytesMixedInAfterCallback),
+  CallbackTest.withCheck(
+      "PassDoublex6Struct16BytesMixedx4Int32",
+      Pointer.fromFunction<PassDoublex6Struct16BytesMixedx4Int32Type>(
+          passDoublex6Struct16BytesMixedx4Int32, 0.0),
+      passDoublex6Struct16BytesMixedx4Int32AfterCallback),
+  CallbackTest.withCheck(
+      "PassInt32x4Struct16BytesMixedx4Double",
+      Pointer.fromFunction<PassInt32x4Struct16BytesMixedx4DoubleType>(
+          passInt32x4Struct16BytesMixedx4Double, 0.0),
+      passInt32x4Struct16BytesMixedx4DoubleAfterCallback),
+  CallbackTest.withCheck(
+      "PassStruct40BytesHomogeneousDoubleStruct4BytesHomo",
+      Pointer.fromFunction<
+              PassStruct40BytesHomogeneousDoubleStruct4BytesHomoType>(
+          passStruct40BytesHomogeneousDoubleStruct4BytesHomo, 0.0),
+      passStruct40BytesHomogeneousDoubleStruct4BytesHomoAfterCallback),
+  CallbackTest.withCheck(
+      "PassInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int",
+      Pointer.fromFunction<
+              PassInt32x8Doublex8Int64Int8Struct1ByteIntInt64IntType>(
+          passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int, 0.0),
+      passInt32x8Doublex8Int64Int8Struct1ByteIntInt64IntAfterCallback),
+  CallbackTest.withCheck(
+      "PassStructAlignmentInt16",
+      Pointer.fromFunction<PassStructAlignmentInt16Type>(
+          passStructAlignmentInt16, 0),
+      passStructAlignmentInt16AfterCallback),
+  CallbackTest.withCheck(
+      "PassStructAlignmentInt32",
+      Pointer.fromFunction<PassStructAlignmentInt32Type>(
+          passStructAlignmentInt32, 0),
+      passStructAlignmentInt32AfterCallback),
+  CallbackTest.withCheck(
+      "PassStructAlignmentInt64",
+      Pointer.fromFunction<PassStructAlignmentInt64Type>(
+          passStructAlignmentInt64, 0),
+      passStructAlignmentInt64AfterCallback),
+  CallbackTest.withCheck(
+      "ReturnStruct1ByteInt",
+      Pointer.fromFunction<ReturnStruct1ByteIntType>(returnStruct1ByteInt),
+      returnStruct1ByteIntAfterCallback),
+  CallbackTest.withCheck(
+      "ReturnStruct3BytesHomogeneousUint8",
+      Pointer.fromFunction<ReturnStruct3BytesHomogeneousUint8Type>(
+          returnStruct3BytesHomogeneousUint8),
+      returnStruct3BytesHomogeneousUint8AfterCallback),
+  CallbackTest.withCheck(
+      "ReturnStruct3BytesInt2ByteAligned",
+      Pointer.fromFunction<ReturnStruct3BytesInt2ByteAlignedType>(
+          returnStruct3BytesInt2ByteAligned),
+      returnStruct3BytesInt2ByteAlignedAfterCallback),
+  CallbackTest.withCheck(
+      "ReturnStruct4BytesHomogeneousInt16",
+      Pointer.fromFunction<ReturnStruct4BytesHomogeneousInt16Type>(
+          returnStruct4BytesHomogeneousInt16),
+      returnStruct4BytesHomogeneousInt16AfterCallback),
+  CallbackTest.withCheck(
+      "ReturnStruct7BytesHomogeneousUint8",
+      Pointer.fromFunction<ReturnStruct7BytesHomogeneousUint8Type>(
+          returnStruct7BytesHomogeneousUint8),
+      returnStruct7BytesHomogeneousUint8AfterCallback),
+  CallbackTest.withCheck(
+      "ReturnStruct7BytesInt4ByteAligned",
+      Pointer.fromFunction<ReturnStruct7BytesInt4ByteAlignedType>(
+          returnStruct7BytesInt4ByteAligned),
+      returnStruct7BytesInt4ByteAlignedAfterCallback),
+  CallbackTest.withCheck(
+      "ReturnStruct8BytesInt",
+      Pointer.fromFunction<ReturnStruct8BytesIntType>(returnStruct8BytesInt),
+      returnStruct8BytesIntAfterCallback),
+  CallbackTest.withCheck(
+      "ReturnStruct8BytesHomogeneousFloat",
+      Pointer.fromFunction<ReturnStruct8BytesHomogeneousFloatType>(
+          returnStruct8BytesHomogeneousFloat),
+      returnStruct8BytesHomogeneousFloatAfterCallback),
+  CallbackTest.withCheck(
+      "ReturnStruct8BytesMixed",
+      Pointer.fromFunction<ReturnStruct8BytesMixedType>(
+          returnStruct8BytesMixed),
+      returnStruct8BytesMixedAfterCallback),
+  CallbackTest.withCheck(
+      "ReturnStruct9BytesHomogeneousUint8",
+      Pointer.fromFunction<ReturnStruct9BytesHomogeneousUint8Type>(
+          returnStruct9BytesHomogeneousUint8),
+      returnStruct9BytesHomogeneousUint8AfterCallback),
+  CallbackTest.withCheck(
+      "ReturnStruct9BytesInt4Or8ByteAligned",
+      Pointer.fromFunction<ReturnStruct9BytesInt4Or8ByteAlignedType>(
+          returnStruct9BytesInt4Or8ByteAligned),
+      returnStruct9BytesInt4Or8ByteAlignedAfterCallback),
+  CallbackTest.withCheck(
+      "ReturnStruct12BytesHomogeneousFloat",
+      Pointer.fromFunction<ReturnStruct12BytesHomogeneousFloatType>(
+          returnStruct12BytesHomogeneousFloat),
+      returnStruct12BytesHomogeneousFloatAfterCallback),
+  CallbackTest.withCheck(
+      "ReturnStruct16BytesHomogeneousFloat",
+      Pointer.fromFunction<ReturnStruct16BytesHomogeneousFloatType>(
+          returnStruct16BytesHomogeneousFloat),
+      returnStruct16BytesHomogeneousFloatAfterCallback),
+  CallbackTest.withCheck(
+      "ReturnStruct16BytesMixed",
+      Pointer.fromFunction<ReturnStruct16BytesMixedType>(
+          returnStruct16BytesMixed),
+      returnStruct16BytesMixedAfterCallback),
+  CallbackTest.withCheck(
+      "ReturnStruct16BytesMixed2",
+      Pointer.fromFunction<ReturnStruct16BytesMixed2Type>(
+          returnStruct16BytesMixed2),
+      returnStruct16BytesMixed2AfterCallback),
+  CallbackTest.withCheck(
+      "ReturnStruct17BytesInt",
+      Pointer.fromFunction<ReturnStruct17BytesIntType>(returnStruct17BytesInt),
+      returnStruct17BytesIntAfterCallback),
+  CallbackTest.withCheck(
+      "ReturnStruct19BytesHomogeneousUint8",
+      Pointer.fromFunction<ReturnStruct19BytesHomogeneousUint8Type>(
+          returnStruct19BytesHomogeneousUint8),
+      returnStruct19BytesHomogeneousUint8AfterCallback),
+  CallbackTest.withCheck(
+      "ReturnStruct20BytesHomogeneousInt32",
+      Pointer.fromFunction<ReturnStruct20BytesHomogeneousInt32Type>(
+          returnStruct20BytesHomogeneousInt32),
+      returnStruct20BytesHomogeneousInt32AfterCallback),
+  CallbackTest.withCheck(
+      "ReturnStruct20BytesHomogeneousFloat",
+      Pointer.fromFunction<ReturnStruct20BytesHomogeneousFloatType>(
+          returnStruct20BytesHomogeneousFloat),
+      returnStruct20BytesHomogeneousFloatAfterCallback),
+  CallbackTest.withCheck(
+      "ReturnStruct32BytesHomogeneousDouble",
+      Pointer.fromFunction<ReturnStruct32BytesHomogeneousDoubleType>(
+          returnStruct32BytesHomogeneousDouble),
+      returnStruct32BytesHomogeneousDoubleAfterCallback),
+  CallbackTest.withCheck(
+      "ReturnStruct40BytesHomogeneousDouble",
+      Pointer.fromFunction<ReturnStruct40BytesHomogeneousDoubleType>(
+          returnStruct40BytesHomogeneousDouble),
+      returnStruct40BytesHomogeneousDoubleAfterCallback),
+  CallbackTest.withCheck(
+      "ReturnStruct1024BytesHomogeneousUint64",
+      Pointer.fromFunction<ReturnStruct1024BytesHomogeneousUint64Type>(
+          returnStruct1024BytesHomogeneousUint64),
+      returnStruct1024BytesHomogeneousUint64AfterCallback),
+  CallbackTest.withCheck(
+      "ReturnStructArgumentStruct1ByteInt",
+      Pointer.fromFunction<ReturnStructArgumentStruct1ByteIntType>(
+          returnStructArgumentStruct1ByteInt),
+      returnStructArgumentStruct1ByteIntAfterCallback),
+  CallbackTest.withCheck(
+      "ReturnStructArgumentInt32x8Struct1ByteInt",
+      Pointer.fromFunction<ReturnStructArgumentInt32x8Struct1ByteIntType>(
+          returnStructArgumentInt32x8Struct1ByteInt),
+      returnStructArgumentInt32x8Struct1ByteIntAfterCallback),
+  CallbackTest.withCheck(
+      "ReturnStructArgumentStruct8BytesHomogeneousFloat",
+      Pointer.fromFunction<
+              ReturnStructArgumentStruct8BytesHomogeneousFloatType>(
+          returnStructArgumentStruct8BytesHomogeneousFloat),
+      returnStructArgumentStruct8BytesHomogeneousFloatAfterCallback),
+  CallbackTest.withCheck(
+      "ReturnStructArgumentStruct20BytesHomogeneousInt32",
+      Pointer.fromFunction<
+              ReturnStructArgumentStruct20BytesHomogeneousInt32Type>(
+          returnStructArgumentStruct20BytesHomogeneousInt32),
+      returnStructArgumentStruct20BytesHomogeneousInt32AfterCallback),
+  CallbackTest.withCheck(
+      "ReturnStructArgumentInt32x8Struct20BytesHomogeneou",
+      Pointer.fromFunction<
+              ReturnStructArgumentInt32x8Struct20BytesHomogeneouType>(
+          returnStructArgumentInt32x8Struct20BytesHomogeneou),
+      returnStructArgumentInt32x8Struct20BytesHomogeneouAfterCallback),
+  CallbackTest.withCheck(
+      "ReturnStructAlignmentInt16",
+      Pointer.fromFunction<ReturnStructAlignmentInt16Type>(
+          returnStructAlignmentInt16),
+      returnStructAlignmentInt16AfterCallback),
+  CallbackTest.withCheck(
+      "ReturnStructAlignmentInt32",
+      Pointer.fromFunction<ReturnStructAlignmentInt32Type>(
+          returnStructAlignmentInt32),
+      returnStructAlignmentInt32AfterCallback),
+  CallbackTest.withCheck(
+      "ReturnStructAlignmentInt64",
+      Pointer.fromFunction<ReturnStructAlignmentInt64Type>(
+          returnStructAlignmentInt64),
+      returnStructAlignmentInt64AfterCallback),
+];
+typedef PassStruct1ByteIntx10Type = Int64 Function(
+    Struct1ByteInt,
+    Struct1ByteInt,
+    Struct1ByteInt,
+    Struct1ByteInt,
+    Struct1ByteInt,
+    Struct1ByteInt,
+    Struct1ByteInt,
+    Struct1ByteInt,
+    Struct1ByteInt,
+    Struct1ByteInt);
+
+// Global variables to be able to test inputs after callback returned.
+Struct1ByteInt passStruct1ByteIntx10_a0 = Struct1ByteInt();
+Struct1ByteInt passStruct1ByteIntx10_a1 = Struct1ByteInt();
+Struct1ByteInt passStruct1ByteIntx10_a2 = Struct1ByteInt();
+Struct1ByteInt passStruct1ByteIntx10_a3 = Struct1ByteInt();
+Struct1ByteInt passStruct1ByteIntx10_a4 = Struct1ByteInt();
+Struct1ByteInt passStruct1ByteIntx10_a5 = Struct1ByteInt();
+Struct1ByteInt passStruct1ByteIntx10_a6 = Struct1ByteInt();
+Struct1ByteInt passStruct1ByteIntx10_a7 = Struct1ByteInt();
+Struct1ByteInt passStruct1ByteIntx10_a8 = Struct1ByteInt();
+Struct1ByteInt passStruct1ByteIntx10_a9 = Struct1ByteInt();
+
+// Result variable also global, so we can delete it after the callback.
+int passStruct1ByteIntx10Result = 0;
+
+int passStruct1ByteIntx10CalculateResult() {
+  int result = 0;
+
+  result += passStruct1ByteIntx10_a0.a0;
+  result += passStruct1ByteIntx10_a1.a0;
+  result += passStruct1ByteIntx10_a2.a0;
+  result += passStruct1ByteIntx10_a3.a0;
+  result += passStruct1ByteIntx10_a4.a0;
+  result += passStruct1ByteIntx10_a5.a0;
+  result += passStruct1ByteIntx10_a6.a0;
+  result += passStruct1ByteIntx10_a7.a0;
+  result += passStruct1ByteIntx10_a8.a0;
+  result += passStruct1ByteIntx10_a9.a0;
+
+  passStruct1ByteIntx10Result = result;
+
+  return result;
+}
+
+/// Smallest struct with data.
+/// 10 struct arguments will exhaust available registers.
+int passStruct1ByteIntx10(
+    Struct1ByteInt a0,
+    Struct1ByteInt a1,
+    Struct1ByteInt a2,
+    Struct1ByteInt a3,
+    Struct1ByteInt a4,
+    Struct1ByteInt a5,
+    Struct1ByteInt a6,
+    Struct1ByteInt a7,
+    Struct1ByteInt a8,
+    Struct1ByteInt a9) {
+  print(
+      "passStruct1ByteIntx10(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5}, ${a6}, ${a7}, ${a8}, ${a9})");
+
+  // In legacy mode, possibly return null.
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0.a0 == 42 || a0.a0 == 84) {
+    print("throwing!");
+    throw Exception("PassStruct1ByteIntx10 throwing on purpuse!");
+  }
+
+  passStruct1ByteIntx10_a0 = a0;
+  passStruct1ByteIntx10_a1 = a1;
+  passStruct1ByteIntx10_a2 = a2;
+  passStruct1ByteIntx10_a3 = a3;
+  passStruct1ByteIntx10_a4 = a4;
+  passStruct1ByteIntx10_a5 = a5;
+  passStruct1ByteIntx10_a6 = a6;
+  passStruct1ByteIntx10_a7 = a7;
+  passStruct1ByteIntx10_a8 = a8;
+  passStruct1ByteIntx10_a9 = a9;
+
+  final result = passStruct1ByteIntx10CalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void passStruct1ByteIntx10AfterCallback() {
+  final result = passStruct1ByteIntx10CalculateResult();
+
+  print("after callback result = $result");
+
+  Expect.equals(5, result);
+}
+
+typedef PassStruct3BytesHomogeneousUint8x10Type = Int64 Function(
+    Struct3BytesHomogeneousUint8,
+    Struct3BytesHomogeneousUint8,
+    Struct3BytesHomogeneousUint8,
+    Struct3BytesHomogeneousUint8,
+    Struct3BytesHomogeneousUint8,
+    Struct3BytesHomogeneousUint8,
+    Struct3BytesHomogeneousUint8,
+    Struct3BytesHomogeneousUint8,
+    Struct3BytesHomogeneousUint8,
+    Struct3BytesHomogeneousUint8);
+
+// Global variables to be able to test inputs after callback returned.
+Struct3BytesHomogeneousUint8 passStruct3BytesHomogeneousUint8x10_a0 =
+    Struct3BytesHomogeneousUint8();
+Struct3BytesHomogeneousUint8 passStruct3BytesHomogeneousUint8x10_a1 =
+    Struct3BytesHomogeneousUint8();
+Struct3BytesHomogeneousUint8 passStruct3BytesHomogeneousUint8x10_a2 =
+    Struct3BytesHomogeneousUint8();
+Struct3BytesHomogeneousUint8 passStruct3BytesHomogeneousUint8x10_a3 =
+    Struct3BytesHomogeneousUint8();
+Struct3BytesHomogeneousUint8 passStruct3BytesHomogeneousUint8x10_a4 =
+    Struct3BytesHomogeneousUint8();
+Struct3BytesHomogeneousUint8 passStruct3BytesHomogeneousUint8x10_a5 =
+    Struct3BytesHomogeneousUint8();
+Struct3BytesHomogeneousUint8 passStruct3BytesHomogeneousUint8x10_a6 =
+    Struct3BytesHomogeneousUint8();
+Struct3BytesHomogeneousUint8 passStruct3BytesHomogeneousUint8x10_a7 =
+    Struct3BytesHomogeneousUint8();
+Struct3BytesHomogeneousUint8 passStruct3BytesHomogeneousUint8x10_a8 =
+    Struct3BytesHomogeneousUint8();
+Struct3BytesHomogeneousUint8 passStruct3BytesHomogeneousUint8x10_a9 =
+    Struct3BytesHomogeneousUint8();
+
+// Result variable also global, so we can delete it after the callback.
+int passStruct3BytesHomogeneousUint8x10Result = 0;
+
+int passStruct3BytesHomogeneousUint8x10CalculateResult() {
+  int result = 0;
+
+  result += passStruct3BytesHomogeneousUint8x10_a0.a0;
+  result += passStruct3BytesHomogeneousUint8x10_a0.a1;
+  result += passStruct3BytesHomogeneousUint8x10_a0.a2;
+  result += passStruct3BytesHomogeneousUint8x10_a1.a0;
+  result += passStruct3BytesHomogeneousUint8x10_a1.a1;
+  result += passStruct3BytesHomogeneousUint8x10_a1.a2;
+  result += passStruct3BytesHomogeneousUint8x10_a2.a0;
+  result += passStruct3BytesHomogeneousUint8x10_a2.a1;
+  result += passStruct3BytesHomogeneousUint8x10_a2.a2;
+  result += passStruct3BytesHomogeneousUint8x10_a3.a0;
+  result += passStruct3BytesHomogeneousUint8x10_a3.a1;
+  result += passStruct3BytesHomogeneousUint8x10_a3.a2;
+  result += passStruct3BytesHomogeneousUint8x10_a4.a0;
+  result += passStruct3BytesHomogeneousUint8x10_a4.a1;
+  result += passStruct3BytesHomogeneousUint8x10_a4.a2;
+  result += passStruct3BytesHomogeneousUint8x10_a5.a0;
+  result += passStruct3BytesHomogeneousUint8x10_a5.a1;
+  result += passStruct3BytesHomogeneousUint8x10_a5.a2;
+  result += passStruct3BytesHomogeneousUint8x10_a6.a0;
+  result += passStruct3BytesHomogeneousUint8x10_a6.a1;
+  result += passStruct3BytesHomogeneousUint8x10_a6.a2;
+  result += passStruct3BytesHomogeneousUint8x10_a7.a0;
+  result += passStruct3BytesHomogeneousUint8x10_a7.a1;
+  result += passStruct3BytesHomogeneousUint8x10_a7.a2;
+  result += passStruct3BytesHomogeneousUint8x10_a8.a0;
+  result += passStruct3BytesHomogeneousUint8x10_a8.a1;
+  result += passStruct3BytesHomogeneousUint8x10_a8.a2;
+  result += passStruct3BytesHomogeneousUint8x10_a9.a0;
+  result += passStruct3BytesHomogeneousUint8x10_a9.a1;
+  result += passStruct3BytesHomogeneousUint8x10_a9.a2;
+
+  passStruct3BytesHomogeneousUint8x10Result = result;
+
+  return result;
+}
+
+/// Not a multiple of word size, not a power of two.
+/// 10 struct arguments will exhaust available registers.
+int passStruct3BytesHomogeneousUint8x10(
+    Struct3BytesHomogeneousUint8 a0,
+    Struct3BytesHomogeneousUint8 a1,
+    Struct3BytesHomogeneousUint8 a2,
+    Struct3BytesHomogeneousUint8 a3,
+    Struct3BytesHomogeneousUint8 a4,
+    Struct3BytesHomogeneousUint8 a5,
+    Struct3BytesHomogeneousUint8 a6,
+    Struct3BytesHomogeneousUint8 a7,
+    Struct3BytesHomogeneousUint8 a8,
+    Struct3BytesHomogeneousUint8 a9) {
+  print(
+      "passStruct3BytesHomogeneousUint8x10(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5}, ${a6}, ${a7}, ${a8}, ${a9})");
+
+  // In legacy mode, possibly return null.
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0.a0 == 42 || a0.a0 == 84) {
+    print("throwing!");
+    throw Exception("PassStruct3BytesHomogeneousUint8x10 throwing on purpuse!");
+  }
+
+  passStruct3BytesHomogeneousUint8x10_a0 = a0;
+  passStruct3BytesHomogeneousUint8x10_a1 = a1;
+  passStruct3BytesHomogeneousUint8x10_a2 = a2;
+  passStruct3BytesHomogeneousUint8x10_a3 = a3;
+  passStruct3BytesHomogeneousUint8x10_a4 = a4;
+  passStruct3BytesHomogeneousUint8x10_a5 = a5;
+  passStruct3BytesHomogeneousUint8x10_a6 = a6;
+  passStruct3BytesHomogeneousUint8x10_a7 = a7;
+  passStruct3BytesHomogeneousUint8x10_a8 = a8;
+  passStruct3BytesHomogeneousUint8x10_a9 = a9;
+
+  final result = passStruct3BytesHomogeneousUint8x10CalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void passStruct3BytesHomogeneousUint8x10AfterCallback() {
+  final result = passStruct3BytesHomogeneousUint8x10CalculateResult();
+
+  print("after callback result = $result");
+
+  Expect.equals(465, result);
+}
+
+typedef PassStruct3BytesInt2ByteAlignedx10Type = Int64 Function(
+    Struct3BytesInt2ByteAligned,
+    Struct3BytesInt2ByteAligned,
+    Struct3BytesInt2ByteAligned,
+    Struct3BytesInt2ByteAligned,
+    Struct3BytesInt2ByteAligned,
+    Struct3BytesInt2ByteAligned,
+    Struct3BytesInt2ByteAligned,
+    Struct3BytesInt2ByteAligned,
+    Struct3BytesInt2ByteAligned,
+    Struct3BytesInt2ByteAligned);
+
+// Global variables to be able to test inputs after callback returned.
+Struct3BytesInt2ByteAligned passStruct3BytesInt2ByteAlignedx10_a0 =
+    Struct3BytesInt2ByteAligned();
+Struct3BytesInt2ByteAligned passStruct3BytesInt2ByteAlignedx10_a1 =
+    Struct3BytesInt2ByteAligned();
+Struct3BytesInt2ByteAligned passStruct3BytesInt2ByteAlignedx10_a2 =
+    Struct3BytesInt2ByteAligned();
+Struct3BytesInt2ByteAligned passStruct3BytesInt2ByteAlignedx10_a3 =
+    Struct3BytesInt2ByteAligned();
+Struct3BytesInt2ByteAligned passStruct3BytesInt2ByteAlignedx10_a4 =
+    Struct3BytesInt2ByteAligned();
+Struct3BytesInt2ByteAligned passStruct3BytesInt2ByteAlignedx10_a5 =
+    Struct3BytesInt2ByteAligned();
+Struct3BytesInt2ByteAligned passStruct3BytesInt2ByteAlignedx10_a6 =
+    Struct3BytesInt2ByteAligned();
+Struct3BytesInt2ByteAligned passStruct3BytesInt2ByteAlignedx10_a7 =
+    Struct3BytesInt2ByteAligned();
+Struct3BytesInt2ByteAligned passStruct3BytesInt2ByteAlignedx10_a8 =
+    Struct3BytesInt2ByteAligned();
+Struct3BytesInt2ByteAligned passStruct3BytesInt2ByteAlignedx10_a9 =
+    Struct3BytesInt2ByteAligned();
+
+// Result variable also global, so we can delete it after the callback.
+int passStruct3BytesInt2ByteAlignedx10Result = 0;
+
+int passStruct3BytesInt2ByteAlignedx10CalculateResult() {
+  int result = 0;
+
+  result += passStruct3BytesInt2ByteAlignedx10_a0.a0;
+  result += passStruct3BytesInt2ByteAlignedx10_a0.a1;
+  result += passStruct3BytesInt2ByteAlignedx10_a1.a0;
+  result += passStruct3BytesInt2ByteAlignedx10_a1.a1;
+  result += passStruct3BytesInt2ByteAlignedx10_a2.a0;
+  result += passStruct3BytesInt2ByteAlignedx10_a2.a1;
+  result += passStruct3BytesInt2ByteAlignedx10_a3.a0;
+  result += passStruct3BytesInt2ByteAlignedx10_a3.a1;
+  result += passStruct3BytesInt2ByteAlignedx10_a4.a0;
+  result += passStruct3BytesInt2ByteAlignedx10_a4.a1;
+  result += passStruct3BytesInt2ByteAlignedx10_a5.a0;
+  result += passStruct3BytesInt2ByteAlignedx10_a5.a1;
+  result += passStruct3BytesInt2ByteAlignedx10_a6.a0;
+  result += passStruct3BytesInt2ByteAlignedx10_a6.a1;
+  result += passStruct3BytesInt2ByteAlignedx10_a7.a0;
+  result += passStruct3BytesInt2ByteAlignedx10_a7.a1;
+  result += passStruct3BytesInt2ByteAlignedx10_a8.a0;
+  result += passStruct3BytesInt2ByteAlignedx10_a8.a1;
+  result += passStruct3BytesInt2ByteAlignedx10_a9.a0;
+  result += passStruct3BytesInt2ByteAlignedx10_a9.a1;
+
+  passStruct3BytesInt2ByteAlignedx10Result = result;
+
+  return result;
+}
+
+/// Not a multiple of word size, not a power of two.
+/// With alignment rules taken into account size is 4 bytes.
+/// 10 struct arguments will exhaust available registers.
+int passStruct3BytesInt2ByteAlignedx10(
+    Struct3BytesInt2ByteAligned a0,
+    Struct3BytesInt2ByteAligned a1,
+    Struct3BytesInt2ByteAligned a2,
+    Struct3BytesInt2ByteAligned a3,
+    Struct3BytesInt2ByteAligned a4,
+    Struct3BytesInt2ByteAligned a5,
+    Struct3BytesInt2ByteAligned a6,
+    Struct3BytesInt2ByteAligned a7,
+    Struct3BytesInt2ByteAligned a8,
+    Struct3BytesInt2ByteAligned a9) {
+  print(
+      "passStruct3BytesInt2ByteAlignedx10(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5}, ${a6}, ${a7}, ${a8}, ${a9})");
+
+  // In legacy mode, possibly return null.
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0.a0 == 42 || a0.a0 == 84) {
+    print("throwing!");
+    throw Exception("PassStruct3BytesInt2ByteAlignedx10 throwing on purpuse!");
+  }
+
+  passStruct3BytesInt2ByteAlignedx10_a0 = a0;
+  passStruct3BytesInt2ByteAlignedx10_a1 = a1;
+  passStruct3BytesInt2ByteAlignedx10_a2 = a2;
+  passStruct3BytesInt2ByteAlignedx10_a3 = a3;
+  passStruct3BytesInt2ByteAlignedx10_a4 = a4;
+  passStruct3BytesInt2ByteAlignedx10_a5 = a5;
+  passStruct3BytesInt2ByteAlignedx10_a6 = a6;
+  passStruct3BytesInt2ByteAlignedx10_a7 = a7;
+  passStruct3BytesInt2ByteAlignedx10_a8 = a8;
+  passStruct3BytesInt2ByteAlignedx10_a9 = a9;
+
+  final result = passStruct3BytesInt2ByteAlignedx10CalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void passStruct3BytesInt2ByteAlignedx10AfterCallback() {
+  final result = passStruct3BytesInt2ByteAlignedx10CalculateResult();
+
+  print("after callback result = $result");
+
+  Expect.equals(10, result);
+}
+
+typedef PassStruct4BytesHomogeneousInt16x10Type = Int64 Function(
+    Struct4BytesHomogeneousInt16,
+    Struct4BytesHomogeneousInt16,
+    Struct4BytesHomogeneousInt16,
+    Struct4BytesHomogeneousInt16,
+    Struct4BytesHomogeneousInt16,
+    Struct4BytesHomogeneousInt16,
+    Struct4BytesHomogeneousInt16,
+    Struct4BytesHomogeneousInt16,
+    Struct4BytesHomogeneousInt16,
+    Struct4BytesHomogeneousInt16);
+
+// Global variables to be able to test inputs after callback returned.
+Struct4BytesHomogeneousInt16 passStruct4BytesHomogeneousInt16x10_a0 =
+    Struct4BytesHomogeneousInt16();
+Struct4BytesHomogeneousInt16 passStruct4BytesHomogeneousInt16x10_a1 =
+    Struct4BytesHomogeneousInt16();
+Struct4BytesHomogeneousInt16 passStruct4BytesHomogeneousInt16x10_a2 =
+    Struct4BytesHomogeneousInt16();
+Struct4BytesHomogeneousInt16 passStruct4BytesHomogeneousInt16x10_a3 =
+    Struct4BytesHomogeneousInt16();
+Struct4BytesHomogeneousInt16 passStruct4BytesHomogeneousInt16x10_a4 =
+    Struct4BytesHomogeneousInt16();
+Struct4BytesHomogeneousInt16 passStruct4BytesHomogeneousInt16x10_a5 =
+    Struct4BytesHomogeneousInt16();
+Struct4BytesHomogeneousInt16 passStruct4BytesHomogeneousInt16x10_a6 =
+    Struct4BytesHomogeneousInt16();
+Struct4BytesHomogeneousInt16 passStruct4BytesHomogeneousInt16x10_a7 =
+    Struct4BytesHomogeneousInt16();
+Struct4BytesHomogeneousInt16 passStruct4BytesHomogeneousInt16x10_a8 =
+    Struct4BytesHomogeneousInt16();
+Struct4BytesHomogeneousInt16 passStruct4BytesHomogeneousInt16x10_a9 =
+    Struct4BytesHomogeneousInt16();
+
+// Result variable also global, so we can delete it after the callback.
+int passStruct4BytesHomogeneousInt16x10Result = 0;
+
+int passStruct4BytesHomogeneousInt16x10CalculateResult() {
+  int result = 0;
+
+  result += passStruct4BytesHomogeneousInt16x10_a0.a0;
+  result += passStruct4BytesHomogeneousInt16x10_a0.a1;
+  result += passStruct4BytesHomogeneousInt16x10_a1.a0;
+  result += passStruct4BytesHomogeneousInt16x10_a1.a1;
+  result += passStruct4BytesHomogeneousInt16x10_a2.a0;
+  result += passStruct4BytesHomogeneousInt16x10_a2.a1;
+  result += passStruct4BytesHomogeneousInt16x10_a3.a0;
+  result += passStruct4BytesHomogeneousInt16x10_a3.a1;
+  result += passStruct4BytesHomogeneousInt16x10_a4.a0;
+  result += passStruct4BytesHomogeneousInt16x10_a4.a1;
+  result += passStruct4BytesHomogeneousInt16x10_a5.a0;
+  result += passStruct4BytesHomogeneousInt16x10_a5.a1;
+  result += passStruct4BytesHomogeneousInt16x10_a6.a0;
+  result += passStruct4BytesHomogeneousInt16x10_a6.a1;
+  result += passStruct4BytesHomogeneousInt16x10_a7.a0;
+  result += passStruct4BytesHomogeneousInt16x10_a7.a1;
+  result += passStruct4BytesHomogeneousInt16x10_a8.a0;
+  result += passStruct4BytesHomogeneousInt16x10_a8.a1;
+  result += passStruct4BytesHomogeneousInt16x10_a9.a0;
+  result += passStruct4BytesHomogeneousInt16x10_a9.a1;
+
+  passStruct4BytesHomogeneousInt16x10Result = result;
+
+  return result;
+}
+
+/// Exactly word size on 32-bit architectures.
+/// 10 struct arguments will exhaust available registers.
+int passStruct4BytesHomogeneousInt16x10(
+    Struct4BytesHomogeneousInt16 a0,
+    Struct4BytesHomogeneousInt16 a1,
+    Struct4BytesHomogeneousInt16 a2,
+    Struct4BytesHomogeneousInt16 a3,
+    Struct4BytesHomogeneousInt16 a4,
+    Struct4BytesHomogeneousInt16 a5,
+    Struct4BytesHomogeneousInt16 a6,
+    Struct4BytesHomogeneousInt16 a7,
+    Struct4BytesHomogeneousInt16 a8,
+    Struct4BytesHomogeneousInt16 a9) {
+  print(
+      "passStruct4BytesHomogeneousInt16x10(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5}, ${a6}, ${a7}, ${a8}, ${a9})");
+
+  // In legacy mode, possibly return null.
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0.a0 == 42 || a0.a0 == 84) {
+    print("throwing!");
+    throw Exception("PassStruct4BytesHomogeneousInt16x10 throwing on purpuse!");
+  }
+
+  passStruct4BytesHomogeneousInt16x10_a0 = a0;
+  passStruct4BytesHomogeneousInt16x10_a1 = a1;
+  passStruct4BytesHomogeneousInt16x10_a2 = a2;
+  passStruct4BytesHomogeneousInt16x10_a3 = a3;
+  passStruct4BytesHomogeneousInt16x10_a4 = a4;
+  passStruct4BytesHomogeneousInt16x10_a5 = a5;
+  passStruct4BytesHomogeneousInt16x10_a6 = a6;
+  passStruct4BytesHomogeneousInt16x10_a7 = a7;
+  passStruct4BytesHomogeneousInt16x10_a8 = a8;
+  passStruct4BytesHomogeneousInt16x10_a9 = a9;
+
+  final result = passStruct4BytesHomogeneousInt16x10CalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void passStruct4BytesHomogeneousInt16x10AfterCallback() {
+  final result = passStruct4BytesHomogeneousInt16x10CalculateResult();
+
+  print("after callback result = $result");
+
+  Expect.equals(10, result);
+}
+
+typedef PassStruct7BytesHomogeneousUint8x10Type = Int64 Function(
+    Struct7BytesHomogeneousUint8,
+    Struct7BytesHomogeneousUint8,
+    Struct7BytesHomogeneousUint8,
+    Struct7BytesHomogeneousUint8,
+    Struct7BytesHomogeneousUint8,
+    Struct7BytesHomogeneousUint8,
+    Struct7BytesHomogeneousUint8,
+    Struct7BytesHomogeneousUint8,
+    Struct7BytesHomogeneousUint8,
+    Struct7BytesHomogeneousUint8);
+
+// Global variables to be able to test inputs after callback returned.
+Struct7BytesHomogeneousUint8 passStruct7BytesHomogeneousUint8x10_a0 =
+    Struct7BytesHomogeneousUint8();
+Struct7BytesHomogeneousUint8 passStruct7BytesHomogeneousUint8x10_a1 =
+    Struct7BytesHomogeneousUint8();
+Struct7BytesHomogeneousUint8 passStruct7BytesHomogeneousUint8x10_a2 =
+    Struct7BytesHomogeneousUint8();
+Struct7BytesHomogeneousUint8 passStruct7BytesHomogeneousUint8x10_a3 =
+    Struct7BytesHomogeneousUint8();
+Struct7BytesHomogeneousUint8 passStruct7BytesHomogeneousUint8x10_a4 =
+    Struct7BytesHomogeneousUint8();
+Struct7BytesHomogeneousUint8 passStruct7BytesHomogeneousUint8x10_a5 =
+    Struct7BytesHomogeneousUint8();
+Struct7BytesHomogeneousUint8 passStruct7BytesHomogeneousUint8x10_a6 =
+    Struct7BytesHomogeneousUint8();
+Struct7BytesHomogeneousUint8 passStruct7BytesHomogeneousUint8x10_a7 =
+    Struct7BytesHomogeneousUint8();
+Struct7BytesHomogeneousUint8 passStruct7BytesHomogeneousUint8x10_a8 =
+    Struct7BytesHomogeneousUint8();
+Struct7BytesHomogeneousUint8 passStruct7BytesHomogeneousUint8x10_a9 =
+    Struct7BytesHomogeneousUint8();
+
+// Result variable also global, so we can delete it after the callback.
+int passStruct7BytesHomogeneousUint8x10Result = 0;
+
+int passStruct7BytesHomogeneousUint8x10CalculateResult() {
+  int result = 0;
+
+  result += passStruct7BytesHomogeneousUint8x10_a0.a0;
+  result += passStruct7BytesHomogeneousUint8x10_a0.a1;
+  result += passStruct7BytesHomogeneousUint8x10_a0.a2;
+  result += passStruct7BytesHomogeneousUint8x10_a0.a3;
+  result += passStruct7BytesHomogeneousUint8x10_a0.a4;
+  result += passStruct7BytesHomogeneousUint8x10_a0.a5;
+  result += passStruct7BytesHomogeneousUint8x10_a0.a6;
+  result += passStruct7BytesHomogeneousUint8x10_a1.a0;
+  result += passStruct7BytesHomogeneousUint8x10_a1.a1;
+  result += passStruct7BytesHomogeneousUint8x10_a1.a2;
+  result += passStruct7BytesHomogeneousUint8x10_a1.a3;
+  result += passStruct7BytesHomogeneousUint8x10_a1.a4;
+  result += passStruct7BytesHomogeneousUint8x10_a1.a5;
+  result += passStruct7BytesHomogeneousUint8x10_a1.a6;
+  result += passStruct7BytesHomogeneousUint8x10_a2.a0;
+  result += passStruct7BytesHomogeneousUint8x10_a2.a1;
+  result += passStruct7BytesHomogeneousUint8x10_a2.a2;
+  result += passStruct7BytesHomogeneousUint8x10_a2.a3;
+  result += passStruct7BytesHomogeneousUint8x10_a2.a4;
+  result += passStruct7BytesHomogeneousUint8x10_a2.a5;
+  result += passStruct7BytesHomogeneousUint8x10_a2.a6;
+  result += passStruct7BytesHomogeneousUint8x10_a3.a0;
+  result += passStruct7BytesHomogeneousUint8x10_a3.a1;
+  result += passStruct7BytesHomogeneousUint8x10_a3.a2;
+  result += passStruct7BytesHomogeneousUint8x10_a3.a3;
+  result += passStruct7BytesHomogeneousUint8x10_a3.a4;
+  result += passStruct7BytesHomogeneousUint8x10_a3.a5;
+  result += passStruct7BytesHomogeneousUint8x10_a3.a6;
+  result += passStruct7BytesHomogeneousUint8x10_a4.a0;
+  result += passStruct7BytesHomogeneousUint8x10_a4.a1;
+  result += passStruct7BytesHomogeneousUint8x10_a4.a2;
+  result += passStruct7BytesHomogeneousUint8x10_a4.a3;
+  result += passStruct7BytesHomogeneousUint8x10_a4.a4;
+  result += passStruct7BytesHomogeneousUint8x10_a4.a5;
+  result += passStruct7BytesHomogeneousUint8x10_a4.a6;
+  result += passStruct7BytesHomogeneousUint8x10_a5.a0;
+  result += passStruct7BytesHomogeneousUint8x10_a5.a1;
+  result += passStruct7BytesHomogeneousUint8x10_a5.a2;
+  result += passStruct7BytesHomogeneousUint8x10_a5.a3;
+  result += passStruct7BytesHomogeneousUint8x10_a5.a4;
+  result += passStruct7BytesHomogeneousUint8x10_a5.a5;
+  result += passStruct7BytesHomogeneousUint8x10_a5.a6;
+  result += passStruct7BytesHomogeneousUint8x10_a6.a0;
+  result += passStruct7BytesHomogeneousUint8x10_a6.a1;
+  result += passStruct7BytesHomogeneousUint8x10_a6.a2;
+  result += passStruct7BytesHomogeneousUint8x10_a6.a3;
+  result += passStruct7BytesHomogeneousUint8x10_a6.a4;
+  result += passStruct7BytesHomogeneousUint8x10_a6.a5;
+  result += passStruct7BytesHomogeneousUint8x10_a6.a6;
+  result += passStruct7BytesHomogeneousUint8x10_a7.a0;
+  result += passStruct7BytesHomogeneousUint8x10_a7.a1;
+  result += passStruct7BytesHomogeneousUint8x10_a7.a2;
+  result += passStruct7BytesHomogeneousUint8x10_a7.a3;
+  result += passStruct7BytesHomogeneousUint8x10_a7.a4;
+  result += passStruct7BytesHomogeneousUint8x10_a7.a5;
+  result += passStruct7BytesHomogeneousUint8x10_a7.a6;
+  result += passStruct7BytesHomogeneousUint8x10_a8.a0;
+  result += passStruct7BytesHomogeneousUint8x10_a8.a1;
+  result += passStruct7BytesHomogeneousUint8x10_a8.a2;
+  result += passStruct7BytesHomogeneousUint8x10_a8.a3;
+  result += passStruct7BytesHomogeneousUint8x10_a8.a4;
+  result += passStruct7BytesHomogeneousUint8x10_a8.a5;
+  result += passStruct7BytesHomogeneousUint8x10_a8.a6;
+  result += passStruct7BytesHomogeneousUint8x10_a9.a0;
+  result += passStruct7BytesHomogeneousUint8x10_a9.a1;
+  result += passStruct7BytesHomogeneousUint8x10_a9.a2;
+  result += passStruct7BytesHomogeneousUint8x10_a9.a3;
+  result += passStruct7BytesHomogeneousUint8x10_a9.a4;
+  result += passStruct7BytesHomogeneousUint8x10_a9.a5;
+  result += passStruct7BytesHomogeneousUint8x10_a9.a6;
+
+  passStruct7BytesHomogeneousUint8x10Result = result;
+
+  return result;
+}
+
+/// Sub word size on 64 bit architectures.
+/// 10 struct arguments will exhaust available registers.
+int passStruct7BytesHomogeneousUint8x10(
+    Struct7BytesHomogeneousUint8 a0,
+    Struct7BytesHomogeneousUint8 a1,
+    Struct7BytesHomogeneousUint8 a2,
+    Struct7BytesHomogeneousUint8 a3,
+    Struct7BytesHomogeneousUint8 a4,
+    Struct7BytesHomogeneousUint8 a5,
+    Struct7BytesHomogeneousUint8 a6,
+    Struct7BytesHomogeneousUint8 a7,
+    Struct7BytesHomogeneousUint8 a8,
+    Struct7BytesHomogeneousUint8 a9) {
+  print(
+      "passStruct7BytesHomogeneousUint8x10(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5}, ${a6}, ${a7}, ${a8}, ${a9})");
+
+  // In legacy mode, possibly return null.
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0.a0 == 42 || a0.a0 == 84) {
+    print("throwing!");
+    throw Exception("PassStruct7BytesHomogeneousUint8x10 throwing on purpuse!");
+  }
+
+  passStruct7BytesHomogeneousUint8x10_a0 = a0;
+  passStruct7BytesHomogeneousUint8x10_a1 = a1;
+  passStruct7BytesHomogeneousUint8x10_a2 = a2;
+  passStruct7BytesHomogeneousUint8x10_a3 = a3;
+  passStruct7BytesHomogeneousUint8x10_a4 = a4;
+  passStruct7BytesHomogeneousUint8x10_a5 = a5;
+  passStruct7BytesHomogeneousUint8x10_a6 = a6;
+  passStruct7BytesHomogeneousUint8x10_a7 = a7;
+  passStruct7BytesHomogeneousUint8x10_a8 = a8;
+  passStruct7BytesHomogeneousUint8x10_a9 = a9;
+
+  final result = passStruct7BytesHomogeneousUint8x10CalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void passStruct7BytesHomogeneousUint8x10AfterCallback() {
+  final result = passStruct7BytesHomogeneousUint8x10CalculateResult();
+
+  print("after callback result = $result");
+
+  Expect.equals(2485, result);
+}
+
+typedef PassStruct7BytesInt4ByteAlignedx10Type = Int64 Function(
+    Struct7BytesInt4ByteAligned,
+    Struct7BytesInt4ByteAligned,
+    Struct7BytesInt4ByteAligned,
+    Struct7BytesInt4ByteAligned,
+    Struct7BytesInt4ByteAligned,
+    Struct7BytesInt4ByteAligned,
+    Struct7BytesInt4ByteAligned,
+    Struct7BytesInt4ByteAligned,
+    Struct7BytesInt4ByteAligned,
+    Struct7BytesInt4ByteAligned);
+
+// Global variables to be able to test inputs after callback returned.
+Struct7BytesInt4ByteAligned passStruct7BytesInt4ByteAlignedx10_a0 =
+    Struct7BytesInt4ByteAligned();
+Struct7BytesInt4ByteAligned passStruct7BytesInt4ByteAlignedx10_a1 =
+    Struct7BytesInt4ByteAligned();
+Struct7BytesInt4ByteAligned passStruct7BytesInt4ByteAlignedx10_a2 =
+    Struct7BytesInt4ByteAligned();
+Struct7BytesInt4ByteAligned passStruct7BytesInt4ByteAlignedx10_a3 =
+    Struct7BytesInt4ByteAligned();
+Struct7BytesInt4ByteAligned passStruct7BytesInt4ByteAlignedx10_a4 =
+    Struct7BytesInt4ByteAligned();
+Struct7BytesInt4ByteAligned passStruct7BytesInt4ByteAlignedx10_a5 =
+    Struct7BytesInt4ByteAligned();
+Struct7BytesInt4ByteAligned passStruct7BytesInt4ByteAlignedx10_a6 =
+    Struct7BytesInt4ByteAligned();
+Struct7BytesInt4ByteAligned passStruct7BytesInt4ByteAlignedx10_a7 =
+    Struct7BytesInt4ByteAligned();
+Struct7BytesInt4ByteAligned passStruct7BytesInt4ByteAlignedx10_a8 =
+    Struct7BytesInt4ByteAligned();
+Struct7BytesInt4ByteAligned passStruct7BytesInt4ByteAlignedx10_a9 =
+    Struct7BytesInt4ByteAligned();
+
+// Result variable also global, so we can delete it after the callback.
+int passStruct7BytesInt4ByteAlignedx10Result = 0;
+
+int passStruct7BytesInt4ByteAlignedx10CalculateResult() {
+  int result = 0;
+
+  result += passStruct7BytesInt4ByteAlignedx10_a0.a0;
+  result += passStruct7BytesInt4ByteAlignedx10_a0.a1;
+  result += passStruct7BytesInt4ByteAlignedx10_a0.a2;
+  result += passStruct7BytesInt4ByteAlignedx10_a1.a0;
+  result += passStruct7BytesInt4ByteAlignedx10_a1.a1;
+  result += passStruct7BytesInt4ByteAlignedx10_a1.a2;
+  result += passStruct7BytesInt4ByteAlignedx10_a2.a0;
+  result += passStruct7BytesInt4ByteAlignedx10_a2.a1;
+  result += passStruct7BytesInt4ByteAlignedx10_a2.a2;
+  result += passStruct7BytesInt4ByteAlignedx10_a3.a0;
+  result += passStruct7BytesInt4ByteAlignedx10_a3.a1;
+  result += passStruct7BytesInt4ByteAlignedx10_a3.a2;
+  result += passStruct7BytesInt4ByteAlignedx10_a4.a0;
+  result += passStruct7BytesInt4ByteAlignedx10_a4.a1;
+  result += passStruct7BytesInt4ByteAlignedx10_a4.a2;
+  result += passStruct7BytesInt4ByteAlignedx10_a5.a0;
+  result += passStruct7BytesInt4ByteAlignedx10_a5.a1;
+  result += passStruct7BytesInt4ByteAlignedx10_a5.a2;
+  result += passStruct7BytesInt4ByteAlignedx10_a6.a0;
+  result += passStruct7BytesInt4ByteAlignedx10_a6.a1;
+  result += passStruct7BytesInt4ByteAlignedx10_a6.a2;
+  result += passStruct7BytesInt4ByteAlignedx10_a7.a0;
+  result += passStruct7BytesInt4ByteAlignedx10_a7.a1;
+  result += passStruct7BytesInt4ByteAlignedx10_a7.a2;
+  result += passStruct7BytesInt4ByteAlignedx10_a8.a0;
+  result += passStruct7BytesInt4ByteAlignedx10_a8.a1;
+  result += passStruct7BytesInt4ByteAlignedx10_a8.a2;
+  result += passStruct7BytesInt4ByteAlignedx10_a9.a0;
+  result += passStruct7BytesInt4ByteAlignedx10_a9.a1;
+  result += passStruct7BytesInt4ByteAlignedx10_a9.a2;
+
+  passStruct7BytesInt4ByteAlignedx10Result = result;
+
+  return result;
+}
+
+/// Sub word size on 64 bit architectures.
+/// With alignment rules taken into account size is 8 bytes.
+/// 10 struct arguments will exhaust available registers.
+int passStruct7BytesInt4ByteAlignedx10(
+    Struct7BytesInt4ByteAligned a0,
+    Struct7BytesInt4ByteAligned a1,
+    Struct7BytesInt4ByteAligned a2,
+    Struct7BytesInt4ByteAligned a3,
+    Struct7BytesInt4ByteAligned a4,
+    Struct7BytesInt4ByteAligned a5,
+    Struct7BytesInt4ByteAligned a6,
+    Struct7BytesInt4ByteAligned a7,
+    Struct7BytesInt4ByteAligned a8,
+    Struct7BytesInt4ByteAligned a9) {
+  print(
+      "passStruct7BytesInt4ByteAlignedx10(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5}, ${a6}, ${a7}, ${a8}, ${a9})");
+
+  // In legacy mode, possibly return null.
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0.a0 == 42 || a0.a0 == 84) {
+    print("throwing!");
+    throw Exception("PassStruct7BytesInt4ByteAlignedx10 throwing on purpuse!");
+  }
+
+  passStruct7BytesInt4ByteAlignedx10_a0 = a0;
+  passStruct7BytesInt4ByteAlignedx10_a1 = a1;
+  passStruct7BytesInt4ByteAlignedx10_a2 = a2;
+  passStruct7BytesInt4ByteAlignedx10_a3 = a3;
+  passStruct7BytesInt4ByteAlignedx10_a4 = a4;
+  passStruct7BytesInt4ByteAlignedx10_a5 = a5;
+  passStruct7BytesInt4ByteAlignedx10_a6 = a6;
+  passStruct7BytesInt4ByteAlignedx10_a7 = a7;
+  passStruct7BytesInt4ByteAlignedx10_a8 = a8;
+  passStruct7BytesInt4ByteAlignedx10_a9 = a9;
+
+  final result = passStruct7BytesInt4ByteAlignedx10CalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void passStruct7BytesInt4ByteAlignedx10AfterCallback() {
+  final result = passStruct7BytesInt4ByteAlignedx10CalculateResult();
+
+  print("after callback result = $result");
+
+  Expect.equals(15, result);
+}
+
+typedef PassStruct8BytesIntx10Type = Int64 Function(
+    Struct8BytesInt,
+    Struct8BytesInt,
+    Struct8BytesInt,
+    Struct8BytesInt,
+    Struct8BytesInt,
+    Struct8BytesInt,
+    Struct8BytesInt,
+    Struct8BytesInt,
+    Struct8BytesInt,
+    Struct8BytesInt);
+
+// Global variables to be able to test inputs after callback returned.
+Struct8BytesInt passStruct8BytesIntx10_a0 = Struct8BytesInt();
+Struct8BytesInt passStruct8BytesIntx10_a1 = Struct8BytesInt();
+Struct8BytesInt passStruct8BytesIntx10_a2 = Struct8BytesInt();
+Struct8BytesInt passStruct8BytesIntx10_a3 = Struct8BytesInt();
+Struct8BytesInt passStruct8BytesIntx10_a4 = Struct8BytesInt();
+Struct8BytesInt passStruct8BytesIntx10_a5 = Struct8BytesInt();
+Struct8BytesInt passStruct8BytesIntx10_a6 = Struct8BytesInt();
+Struct8BytesInt passStruct8BytesIntx10_a7 = Struct8BytesInt();
+Struct8BytesInt passStruct8BytesIntx10_a8 = Struct8BytesInt();
+Struct8BytesInt passStruct8BytesIntx10_a9 = Struct8BytesInt();
+
+// Result variable also global, so we can delete it after the callback.
+int passStruct8BytesIntx10Result = 0;
+
+int passStruct8BytesIntx10CalculateResult() {
+  int result = 0;
+
+  result += passStruct8BytesIntx10_a0.a0;
+  result += passStruct8BytesIntx10_a0.a1;
+  result += passStruct8BytesIntx10_a0.a2;
+  result += passStruct8BytesIntx10_a1.a0;
+  result += passStruct8BytesIntx10_a1.a1;
+  result += passStruct8BytesIntx10_a1.a2;
+  result += passStruct8BytesIntx10_a2.a0;
+  result += passStruct8BytesIntx10_a2.a1;
+  result += passStruct8BytesIntx10_a2.a2;
+  result += passStruct8BytesIntx10_a3.a0;
+  result += passStruct8BytesIntx10_a3.a1;
+  result += passStruct8BytesIntx10_a3.a2;
+  result += passStruct8BytesIntx10_a4.a0;
+  result += passStruct8BytesIntx10_a4.a1;
+  result += passStruct8BytesIntx10_a4.a2;
+  result += passStruct8BytesIntx10_a5.a0;
+  result += passStruct8BytesIntx10_a5.a1;
+  result += passStruct8BytesIntx10_a5.a2;
+  result += passStruct8BytesIntx10_a6.a0;
+  result += passStruct8BytesIntx10_a6.a1;
+  result += passStruct8BytesIntx10_a6.a2;
+  result += passStruct8BytesIntx10_a7.a0;
+  result += passStruct8BytesIntx10_a7.a1;
+  result += passStruct8BytesIntx10_a7.a2;
+  result += passStruct8BytesIntx10_a8.a0;
+  result += passStruct8BytesIntx10_a8.a1;
+  result += passStruct8BytesIntx10_a8.a2;
+  result += passStruct8BytesIntx10_a9.a0;
+  result += passStruct8BytesIntx10_a9.a1;
+  result += passStruct8BytesIntx10_a9.a2;
+
+  passStruct8BytesIntx10Result = result;
+
+  return result;
+}
+
+/// Exactly word size struct on 64bit architectures.
+/// 10 struct arguments will exhaust available registers.
+int passStruct8BytesIntx10(
+    Struct8BytesInt a0,
+    Struct8BytesInt a1,
+    Struct8BytesInt a2,
+    Struct8BytesInt a3,
+    Struct8BytesInt a4,
+    Struct8BytesInt a5,
+    Struct8BytesInt a6,
+    Struct8BytesInt a7,
+    Struct8BytesInt a8,
+    Struct8BytesInt a9) {
+  print(
+      "passStruct8BytesIntx10(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5}, ${a6}, ${a7}, ${a8}, ${a9})");
+
+  // In legacy mode, possibly return null.
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0.a0 == 42 || a0.a0 == 84) {
+    print("throwing!");
+    throw Exception("PassStruct8BytesIntx10 throwing on purpuse!");
+  }
+
+  passStruct8BytesIntx10_a0 = a0;
+  passStruct8BytesIntx10_a1 = a1;
+  passStruct8BytesIntx10_a2 = a2;
+  passStruct8BytesIntx10_a3 = a3;
+  passStruct8BytesIntx10_a4 = a4;
+  passStruct8BytesIntx10_a5 = a5;
+  passStruct8BytesIntx10_a6 = a6;
+  passStruct8BytesIntx10_a7 = a7;
+  passStruct8BytesIntx10_a8 = a8;
+  passStruct8BytesIntx10_a9 = a9;
+
+  final result = passStruct8BytesIntx10CalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void passStruct8BytesIntx10AfterCallback() {
+  final result = passStruct8BytesIntx10CalculateResult();
+
+  print("after callback result = $result");
+
+  Expect.equals(15, result);
+}
+
+typedef PassStruct8BytesHomogeneousFloatx10Type = Float Function(
+    Struct8BytesHomogeneousFloat,
+    Struct8BytesHomogeneousFloat,
+    Struct8BytesHomogeneousFloat,
+    Struct8BytesHomogeneousFloat,
+    Struct8BytesHomogeneousFloat,
+    Struct8BytesHomogeneousFloat,
+    Struct8BytesHomogeneousFloat,
+    Struct8BytesHomogeneousFloat,
+    Struct8BytesHomogeneousFloat,
+    Struct8BytesHomogeneousFloat);
+
+// Global variables to be able to test inputs after callback returned.
+Struct8BytesHomogeneousFloat passStruct8BytesHomogeneousFloatx10_a0 =
+    Struct8BytesHomogeneousFloat();
+Struct8BytesHomogeneousFloat passStruct8BytesHomogeneousFloatx10_a1 =
+    Struct8BytesHomogeneousFloat();
+Struct8BytesHomogeneousFloat passStruct8BytesHomogeneousFloatx10_a2 =
+    Struct8BytesHomogeneousFloat();
+Struct8BytesHomogeneousFloat passStruct8BytesHomogeneousFloatx10_a3 =
+    Struct8BytesHomogeneousFloat();
+Struct8BytesHomogeneousFloat passStruct8BytesHomogeneousFloatx10_a4 =
+    Struct8BytesHomogeneousFloat();
+Struct8BytesHomogeneousFloat passStruct8BytesHomogeneousFloatx10_a5 =
+    Struct8BytesHomogeneousFloat();
+Struct8BytesHomogeneousFloat passStruct8BytesHomogeneousFloatx10_a6 =
+    Struct8BytesHomogeneousFloat();
+Struct8BytesHomogeneousFloat passStruct8BytesHomogeneousFloatx10_a7 =
+    Struct8BytesHomogeneousFloat();
+Struct8BytesHomogeneousFloat passStruct8BytesHomogeneousFloatx10_a8 =
+    Struct8BytesHomogeneousFloat();
+Struct8BytesHomogeneousFloat passStruct8BytesHomogeneousFloatx10_a9 =
+    Struct8BytesHomogeneousFloat();
+
+// Result variable also global, so we can delete it after the callback.
+double passStruct8BytesHomogeneousFloatx10Result = 0.0;
+
+double passStruct8BytesHomogeneousFloatx10CalculateResult() {
+  double result = 0;
+
+  result += passStruct8BytesHomogeneousFloatx10_a0.a0;
+  result += passStruct8BytesHomogeneousFloatx10_a0.a1;
+  result += passStruct8BytesHomogeneousFloatx10_a1.a0;
+  result += passStruct8BytesHomogeneousFloatx10_a1.a1;
+  result += passStruct8BytesHomogeneousFloatx10_a2.a0;
+  result += passStruct8BytesHomogeneousFloatx10_a2.a1;
+  result += passStruct8BytesHomogeneousFloatx10_a3.a0;
+  result += passStruct8BytesHomogeneousFloatx10_a3.a1;
+  result += passStruct8BytesHomogeneousFloatx10_a4.a0;
+  result += passStruct8BytesHomogeneousFloatx10_a4.a1;
+  result += passStruct8BytesHomogeneousFloatx10_a5.a0;
+  result += passStruct8BytesHomogeneousFloatx10_a5.a1;
+  result += passStruct8BytesHomogeneousFloatx10_a6.a0;
+  result += passStruct8BytesHomogeneousFloatx10_a6.a1;
+  result += passStruct8BytesHomogeneousFloatx10_a7.a0;
+  result += passStruct8BytesHomogeneousFloatx10_a7.a1;
+  result += passStruct8BytesHomogeneousFloatx10_a8.a0;
+  result += passStruct8BytesHomogeneousFloatx10_a8.a1;
+  result += passStruct8BytesHomogeneousFloatx10_a9.a0;
+  result += passStruct8BytesHomogeneousFloatx10_a9.a1;
+
+  passStruct8BytesHomogeneousFloatx10Result = result;
+
+  return result;
+}
+
+/// Arguments passed in FP registers as long as they fit.
+/// 10 struct arguments will exhaust available registers.
+double passStruct8BytesHomogeneousFloatx10(
+    Struct8BytesHomogeneousFloat a0,
+    Struct8BytesHomogeneousFloat a1,
+    Struct8BytesHomogeneousFloat a2,
+    Struct8BytesHomogeneousFloat a3,
+    Struct8BytesHomogeneousFloat a4,
+    Struct8BytesHomogeneousFloat a5,
+    Struct8BytesHomogeneousFloat a6,
+    Struct8BytesHomogeneousFloat a7,
+    Struct8BytesHomogeneousFloat a8,
+    Struct8BytesHomogeneousFloat a9) {
+  print(
+      "passStruct8BytesHomogeneousFloatx10(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5}, ${a6}, ${a7}, ${a8}, ${a9})");
+
+  // In legacy mode, possibly return null.
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0.a0 == 42 || a0.a0 == 84) {
+    print("throwing!");
+    throw Exception("PassStruct8BytesHomogeneousFloatx10 throwing on purpuse!");
+  }
+
+  passStruct8BytesHomogeneousFloatx10_a0 = a0;
+  passStruct8BytesHomogeneousFloatx10_a1 = a1;
+  passStruct8BytesHomogeneousFloatx10_a2 = a2;
+  passStruct8BytesHomogeneousFloatx10_a3 = a3;
+  passStruct8BytesHomogeneousFloatx10_a4 = a4;
+  passStruct8BytesHomogeneousFloatx10_a5 = a5;
+  passStruct8BytesHomogeneousFloatx10_a6 = a6;
+  passStruct8BytesHomogeneousFloatx10_a7 = a7;
+  passStruct8BytesHomogeneousFloatx10_a8 = a8;
+  passStruct8BytesHomogeneousFloatx10_a9 = a9;
+
+  final result = passStruct8BytesHomogeneousFloatx10CalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void passStruct8BytesHomogeneousFloatx10AfterCallback() {
+  final result = passStruct8BytesHomogeneousFloatx10CalculateResult();
+
+  print("after callback result = $result");
+
+  Expect.approxEquals(10.0, result);
+}
+
+typedef PassStruct8BytesMixedx10Type = Float Function(
+    Struct8BytesMixed,
+    Struct8BytesMixed,
+    Struct8BytesMixed,
+    Struct8BytesMixed,
+    Struct8BytesMixed,
+    Struct8BytesMixed,
+    Struct8BytesMixed,
+    Struct8BytesMixed,
+    Struct8BytesMixed,
+    Struct8BytesMixed);
+
+// Global variables to be able to test inputs after callback returned.
+Struct8BytesMixed passStruct8BytesMixedx10_a0 = Struct8BytesMixed();
+Struct8BytesMixed passStruct8BytesMixedx10_a1 = Struct8BytesMixed();
+Struct8BytesMixed passStruct8BytesMixedx10_a2 = Struct8BytesMixed();
+Struct8BytesMixed passStruct8BytesMixedx10_a3 = Struct8BytesMixed();
+Struct8BytesMixed passStruct8BytesMixedx10_a4 = Struct8BytesMixed();
+Struct8BytesMixed passStruct8BytesMixedx10_a5 = Struct8BytesMixed();
+Struct8BytesMixed passStruct8BytesMixedx10_a6 = Struct8BytesMixed();
+Struct8BytesMixed passStruct8BytesMixedx10_a7 = Struct8BytesMixed();
+Struct8BytesMixed passStruct8BytesMixedx10_a8 = Struct8BytesMixed();
+Struct8BytesMixed passStruct8BytesMixedx10_a9 = Struct8BytesMixed();
+
+// Result variable also global, so we can delete it after the callback.
+double passStruct8BytesMixedx10Result = 0.0;
+
+double passStruct8BytesMixedx10CalculateResult() {
+  double result = 0;
+
+  result += passStruct8BytesMixedx10_a0.a0;
+  result += passStruct8BytesMixedx10_a0.a1;
+  result += passStruct8BytesMixedx10_a0.a2;
+  result += passStruct8BytesMixedx10_a1.a0;
+  result += passStruct8BytesMixedx10_a1.a1;
+  result += passStruct8BytesMixedx10_a1.a2;
+  result += passStruct8BytesMixedx10_a2.a0;
+  result += passStruct8BytesMixedx10_a2.a1;
+  result += passStruct8BytesMixedx10_a2.a2;
+  result += passStruct8BytesMixedx10_a3.a0;
+  result += passStruct8BytesMixedx10_a3.a1;
+  result += passStruct8BytesMixedx10_a3.a2;
+  result += passStruct8BytesMixedx10_a4.a0;
+  result += passStruct8BytesMixedx10_a4.a1;
+  result += passStruct8BytesMixedx10_a4.a2;
+  result += passStruct8BytesMixedx10_a5.a0;
+  result += passStruct8BytesMixedx10_a5.a1;
+  result += passStruct8BytesMixedx10_a5.a2;
+  result += passStruct8BytesMixedx10_a6.a0;
+  result += passStruct8BytesMixedx10_a6.a1;
+  result += passStruct8BytesMixedx10_a6.a2;
+  result += passStruct8BytesMixedx10_a7.a0;
+  result += passStruct8BytesMixedx10_a7.a1;
+  result += passStruct8BytesMixedx10_a7.a2;
+  result += passStruct8BytesMixedx10_a8.a0;
+  result += passStruct8BytesMixedx10_a8.a1;
+  result += passStruct8BytesMixedx10_a8.a2;
+  result += passStruct8BytesMixedx10_a9.a0;
+  result += passStruct8BytesMixedx10_a9.a1;
+  result += passStruct8BytesMixedx10_a9.a2;
+
+  passStruct8BytesMixedx10Result = result;
+
+  return result;
+}
+
+/// On x64, arguments go in int registers because it is not only float.
+/// 10 struct arguments will exhaust available registers.
+double passStruct8BytesMixedx10(
+    Struct8BytesMixed a0,
+    Struct8BytesMixed a1,
+    Struct8BytesMixed a2,
+    Struct8BytesMixed a3,
+    Struct8BytesMixed a4,
+    Struct8BytesMixed a5,
+    Struct8BytesMixed a6,
+    Struct8BytesMixed a7,
+    Struct8BytesMixed a8,
+    Struct8BytesMixed a9) {
+  print(
+      "passStruct8BytesMixedx10(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5}, ${a6}, ${a7}, ${a8}, ${a9})");
+
+  // In legacy mode, possibly return null.
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0.a0 == 42 || a0.a0 == 84) {
+    print("throwing!");
+    throw Exception("PassStruct8BytesMixedx10 throwing on purpuse!");
+  }
+
+  passStruct8BytesMixedx10_a0 = a0;
+  passStruct8BytesMixedx10_a1 = a1;
+  passStruct8BytesMixedx10_a2 = a2;
+  passStruct8BytesMixedx10_a3 = a3;
+  passStruct8BytesMixedx10_a4 = a4;
+  passStruct8BytesMixedx10_a5 = a5;
+  passStruct8BytesMixedx10_a6 = a6;
+  passStruct8BytesMixedx10_a7 = a7;
+  passStruct8BytesMixedx10_a8 = a8;
+  passStruct8BytesMixedx10_a9 = a9;
+
+  final result = passStruct8BytesMixedx10CalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void passStruct8BytesMixedx10AfterCallback() {
+  final result = passStruct8BytesMixedx10CalculateResult();
+
+  print("after callback result = $result");
+
+  Expect.approxEquals(15.0, result);
+}
+
+typedef PassStruct9BytesHomogeneousUint8x10Type = Int64 Function(
+    Struct9BytesHomogeneousUint8,
+    Struct9BytesHomogeneousUint8,
+    Struct9BytesHomogeneousUint8,
+    Struct9BytesHomogeneousUint8,
+    Struct9BytesHomogeneousUint8,
+    Struct9BytesHomogeneousUint8,
+    Struct9BytesHomogeneousUint8,
+    Struct9BytesHomogeneousUint8,
+    Struct9BytesHomogeneousUint8,
+    Struct9BytesHomogeneousUint8);
+
+// Global variables to be able to test inputs after callback returned.
+Struct9BytesHomogeneousUint8 passStruct9BytesHomogeneousUint8x10_a0 =
+    Struct9BytesHomogeneousUint8();
+Struct9BytesHomogeneousUint8 passStruct9BytesHomogeneousUint8x10_a1 =
+    Struct9BytesHomogeneousUint8();
+Struct9BytesHomogeneousUint8 passStruct9BytesHomogeneousUint8x10_a2 =
+    Struct9BytesHomogeneousUint8();
+Struct9BytesHomogeneousUint8 passStruct9BytesHomogeneousUint8x10_a3 =
+    Struct9BytesHomogeneousUint8();
+Struct9BytesHomogeneousUint8 passStruct9BytesHomogeneousUint8x10_a4 =
+    Struct9BytesHomogeneousUint8();
+Struct9BytesHomogeneousUint8 passStruct9BytesHomogeneousUint8x10_a5 =
+    Struct9BytesHomogeneousUint8();
+Struct9BytesHomogeneousUint8 passStruct9BytesHomogeneousUint8x10_a6 =
+    Struct9BytesHomogeneousUint8();
+Struct9BytesHomogeneousUint8 passStruct9BytesHomogeneousUint8x10_a7 =
+    Struct9BytesHomogeneousUint8();
+Struct9BytesHomogeneousUint8 passStruct9BytesHomogeneousUint8x10_a8 =
+    Struct9BytesHomogeneousUint8();
+Struct9BytesHomogeneousUint8 passStruct9BytesHomogeneousUint8x10_a9 =
+    Struct9BytesHomogeneousUint8();
+
+// Result variable also global, so we can delete it after the callback.
+int passStruct9BytesHomogeneousUint8x10Result = 0;
+
+int passStruct9BytesHomogeneousUint8x10CalculateResult() {
+  int result = 0;
+
+  result += passStruct9BytesHomogeneousUint8x10_a0.a0;
+  result += passStruct9BytesHomogeneousUint8x10_a0.a1;
+  result += passStruct9BytesHomogeneousUint8x10_a0.a2;
+  result += passStruct9BytesHomogeneousUint8x10_a0.a3;
+  result += passStruct9BytesHomogeneousUint8x10_a0.a4;
+  result += passStruct9BytesHomogeneousUint8x10_a0.a5;
+  result += passStruct9BytesHomogeneousUint8x10_a0.a6;
+  result += passStruct9BytesHomogeneousUint8x10_a0.a7;
+  result += passStruct9BytesHomogeneousUint8x10_a0.a8;
+  result += passStruct9BytesHomogeneousUint8x10_a1.a0;
+  result += passStruct9BytesHomogeneousUint8x10_a1.a1;
+  result += passStruct9BytesHomogeneousUint8x10_a1.a2;
+  result += passStruct9BytesHomogeneousUint8x10_a1.a3;
+  result += passStruct9BytesHomogeneousUint8x10_a1.a4;
+  result += passStruct9BytesHomogeneousUint8x10_a1.a5;
+  result += passStruct9BytesHomogeneousUint8x10_a1.a6;
+  result += passStruct9BytesHomogeneousUint8x10_a1.a7;
+  result += passStruct9BytesHomogeneousUint8x10_a1.a8;
+  result += passStruct9BytesHomogeneousUint8x10_a2.a0;
+  result += passStruct9BytesHomogeneousUint8x10_a2.a1;
+  result += passStruct9BytesHomogeneousUint8x10_a2.a2;
+  result += passStruct9BytesHomogeneousUint8x10_a2.a3;
+  result += passStruct9BytesHomogeneousUint8x10_a2.a4;
+  result += passStruct9BytesHomogeneousUint8x10_a2.a5;
+  result += passStruct9BytesHomogeneousUint8x10_a2.a6;
+  result += passStruct9BytesHomogeneousUint8x10_a2.a7;
+  result += passStruct9BytesHomogeneousUint8x10_a2.a8;
+  result += passStruct9BytesHomogeneousUint8x10_a3.a0;
+  result += passStruct9BytesHomogeneousUint8x10_a3.a1;
+  result += passStruct9BytesHomogeneousUint8x10_a3.a2;
+  result += passStruct9BytesHomogeneousUint8x10_a3.a3;
+  result += passStruct9BytesHomogeneousUint8x10_a3.a4;
+  result += passStruct9BytesHomogeneousUint8x10_a3.a5;
+  result += passStruct9BytesHomogeneousUint8x10_a3.a6;
+  result += passStruct9BytesHomogeneousUint8x10_a3.a7;
+  result += passStruct9BytesHomogeneousUint8x10_a3.a8;
+  result += passStruct9BytesHomogeneousUint8x10_a4.a0;
+  result += passStruct9BytesHomogeneousUint8x10_a4.a1;
+  result += passStruct9BytesHomogeneousUint8x10_a4.a2;
+  result += passStruct9BytesHomogeneousUint8x10_a4.a3;
+  result += passStruct9BytesHomogeneousUint8x10_a4.a4;
+  result += passStruct9BytesHomogeneousUint8x10_a4.a5;
+  result += passStruct9BytesHomogeneousUint8x10_a4.a6;
+  result += passStruct9BytesHomogeneousUint8x10_a4.a7;
+  result += passStruct9BytesHomogeneousUint8x10_a4.a8;
+  result += passStruct9BytesHomogeneousUint8x10_a5.a0;
+  result += passStruct9BytesHomogeneousUint8x10_a5.a1;
+  result += passStruct9BytesHomogeneousUint8x10_a5.a2;
+  result += passStruct9BytesHomogeneousUint8x10_a5.a3;
+  result += passStruct9BytesHomogeneousUint8x10_a5.a4;
+  result += passStruct9BytesHomogeneousUint8x10_a5.a5;
+  result += passStruct9BytesHomogeneousUint8x10_a5.a6;
+  result += passStruct9BytesHomogeneousUint8x10_a5.a7;
+  result += passStruct9BytesHomogeneousUint8x10_a5.a8;
+  result += passStruct9BytesHomogeneousUint8x10_a6.a0;
+  result += passStruct9BytesHomogeneousUint8x10_a6.a1;
+  result += passStruct9BytesHomogeneousUint8x10_a6.a2;
+  result += passStruct9BytesHomogeneousUint8x10_a6.a3;
+  result += passStruct9BytesHomogeneousUint8x10_a6.a4;
+  result += passStruct9BytesHomogeneousUint8x10_a6.a5;
+  result += passStruct9BytesHomogeneousUint8x10_a6.a6;
+  result += passStruct9BytesHomogeneousUint8x10_a6.a7;
+  result += passStruct9BytesHomogeneousUint8x10_a6.a8;
+  result += passStruct9BytesHomogeneousUint8x10_a7.a0;
+  result += passStruct9BytesHomogeneousUint8x10_a7.a1;
+  result += passStruct9BytesHomogeneousUint8x10_a7.a2;
+  result += passStruct9BytesHomogeneousUint8x10_a7.a3;
+  result += passStruct9BytesHomogeneousUint8x10_a7.a4;
+  result += passStruct9BytesHomogeneousUint8x10_a7.a5;
+  result += passStruct9BytesHomogeneousUint8x10_a7.a6;
+  result += passStruct9BytesHomogeneousUint8x10_a7.a7;
+  result += passStruct9BytesHomogeneousUint8x10_a7.a8;
+  result += passStruct9BytesHomogeneousUint8x10_a8.a0;
+  result += passStruct9BytesHomogeneousUint8x10_a8.a1;
+  result += passStruct9BytesHomogeneousUint8x10_a8.a2;
+  result += passStruct9BytesHomogeneousUint8x10_a8.a3;
+  result += passStruct9BytesHomogeneousUint8x10_a8.a4;
+  result += passStruct9BytesHomogeneousUint8x10_a8.a5;
+  result += passStruct9BytesHomogeneousUint8x10_a8.a6;
+  result += passStruct9BytesHomogeneousUint8x10_a8.a7;
+  result += passStruct9BytesHomogeneousUint8x10_a8.a8;
+  result += passStruct9BytesHomogeneousUint8x10_a9.a0;
+  result += passStruct9BytesHomogeneousUint8x10_a9.a1;
+  result += passStruct9BytesHomogeneousUint8x10_a9.a2;
+  result += passStruct9BytesHomogeneousUint8x10_a9.a3;
+  result += passStruct9BytesHomogeneousUint8x10_a9.a4;
+  result += passStruct9BytesHomogeneousUint8x10_a9.a5;
+  result += passStruct9BytesHomogeneousUint8x10_a9.a6;
+  result += passStruct9BytesHomogeneousUint8x10_a9.a7;
+  result += passStruct9BytesHomogeneousUint8x10_a9.a8;
+
+  passStruct9BytesHomogeneousUint8x10Result = result;
+
+  return result;
+}
+
+/// Argument is a single byte over a multiple of word size.
+/// 10 struct arguments will exhaust available registers.
+/// Struct only has 1-byte aligned fields to test struct alignment itself.
+/// Tests upper bytes in the integer registers that are partly filled.
+/// Tests stack alignment of non word size stack arguments.
+int passStruct9BytesHomogeneousUint8x10(
+    Struct9BytesHomogeneousUint8 a0,
+    Struct9BytesHomogeneousUint8 a1,
+    Struct9BytesHomogeneousUint8 a2,
+    Struct9BytesHomogeneousUint8 a3,
+    Struct9BytesHomogeneousUint8 a4,
+    Struct9BytesHomogeneousUint8 a5,
+    Struct9BytesHomogeneousUint8 a6,
+    Struct9BytesHomogeneousUint8 a7,
+    Struct9BytesHomogeneousUint8 a8,
+    Struct9BytesHomogeneousUint8 a9) {
+  print(
+      "passStruct9BytesHomogeneousUint8x10(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5}, ${a6}, ${a7}, ${a8}, ${a9})");
+
+  // In legacy mode, possibly return null.
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0.a0 == 42 || a0.a0 == 84) {
+    print("throwing!");
+    throw Exception("PassStruct9BytesHomogeneousUint8x10 throwing on purpuse!");
+  }
+
+  passStruct9BytesHomogeneousUint8x10_a0 = a0;
+  passStruct9BytesHomogeneousUint8x10_a1 = a1;
+  passStruct9BytesHomogeneousUint8x10_a2 = a2;
+  passStruct9BytesHomogeneousUint8x10_a3 = a3;
+  passStruct9BytesHomogeneousUint8x10_a4 = a4;
+  passStruct9BytesHomogeneousUint8x10_a5 = a5;
+  passStruct9BytesHomogeneousUint8x10_a6 = a6;
+  passStruct9BytesHomogeneousUint8x10_a7 = a7;
+  passStruct9BytesHomogeneousUint8x10_a8 = a8;
+  passStruct9BytesHomogeneousUint8x10_a9 = a9;
+
+  final result = passStruct9BytesHomogeneousUint8x10CalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void passStruct9BytesHomogeneousUint8x10AfterCallback() {
+  final result = passStruct9BytesHomogeneousUint8x10CalculateResult();
+
+  print("after callback result = $result");
+
+  Expect.equals(4095, result);
+}
+
+typedef PassStruct9BytesInt4Or8ByteAlignedx10Type = Int64 Function(
+    Struct9BytesInt4Or8ByteAligned,
+    Struct9BytesInt4Or8ByteAligned,
+    Struct9BytesInt4Or8ByteAligned,
+    Struct9BytesInt4Or8ByteAligned,
+    Struct9BytesInt4Or8ByteAligned,
+    Struct9BytesInt4Or8ByteAligned,
+    Struct9BytesInt4Or8ByteAligned,
+    Struct9BytesInt4Or8ByteAligned,
+    Struct9BytesInt4Or8ByteAligned,
+    Struct9BytesInt4Or8ByteAligned);
+
+// Global variables to be able to test inputs after callback returned.
+Struct9BytesInt4Or8ByteAligned passStruct9BytesInt4Or8ByteAlignedx10_a0 =
+    Struct9BytesInt4Or8ByteAligned();
+Struct9BytesInt4Or8ByteAligned passStruct9BytesInt4Or8ByteAlignedx10_a1 =
+    Struct9BytesInt4Or8ByteAligned();
+Struct9BytesInt4Or8ByteAligned passStruct9BytesInt4Or8ByteAlignedx10_a2 =
+    Struct9BytesInt4Or8ByteAligned();
+Struct9BytesInt4Or8ByteAligned passStruct9BytesInt4Or8ByteAlignedx10_a3 =
+    Struct9BytesInt4Or8ByteAligned();
+Struct9BytesInt4Or8ByteAligned passStruct9BytesInt4Or8ByteAlignedx10_a4 =
+    Struct9BytesInt4Or8ByteAligned();
+Struct9BytesInt4Or8ByteAligned passStruct9BytesInt4Or8ByteAlignedx10_a5 =
+    Struct9BytesInt4Or8ByteAligned();
+Struct9BytesInt4Or8ByteAligned passStruct9BytesInt4Or8ByteAlignedx10_a6 =
+    Struct9BytesInt4Or8ByteAligned();
+Struct9BytesInt4Or8ByteAligned passStruct9BytesInt4Or8ByteAlignedx10_a7 =
+    Struct9BytesInt4Or8ByteAligned();
+Struct9BytesInt4Or8ByteAligned passStruct9BytesInt4Or8ByteAlignedx10_a8 =
+    Struct9BytesInt4Or8ByteAligned();
+Struct9BytesInt4Or8ByteAligned passStruct9BytesInt4Or8ByteAlignedx10_a9 =
+    Struct9BytesInt4Or8ByteAligned();
+
+// Result variable also global, so we can delete it after the callback.
+int passStruct9BytesInt4Or8ByteAlignedx10Result = 0;
+
+int passStruct9BytesInt4Or8ByteAlignedx10CalculateResult() {
+  int result = 0;
+
+  result += passStruct9BytesInt4Or8ByteAlignedx10_a0.a0;
+  result += passStruct9BytesInt4Or8ByteAlignedx10_a0.a1;
+  result += passStruct9BytesInt4Or8ByteAlignedx10_a1.a0;
+  result += passStruct9BytesInt4Or8ByteAlignedx10_a1.a1;
+  result += passStruct9BytesInt4Or8ByteAlignedx10_a2.a0;
+  result += passStruct9BytesInt4Or8ByteAlignedx10_a2.a1;
+  result += passStruct9BytesInt4Or8ByteAlignedx10_a3.a0;
+  result += passStruct9BytesInt4Or8ByteAlignedx10_a3.a1;
+  result += passStruct9BytesInt4Or8ByteAlignedx10_a4.a0;
+  result += passStruct9BytesInt4Or8ByteAlignedx10_a4.a1;
+  result += passStruct9BytesInt4Or8ByteAlignedx10_a5.a0;
+  result += passStruct9BytesInt4Or8ByteAlignedx10_a5.a1;
+  result += passStruct9BytesInt4Or8ByteAlignedx10_a6.a0;
+  result += passStruct9BytesInt4Or8ByteAlignedx10_a6.a1;
+  result += passStruct9BytesInt4Or8ByteAlignedx10_a7.a0;
+  result += passStruct9BytesInt4Or8ByteAlignedx10_a7.a1;
+  result += passStruct9BytesInt4Or8ByteAlignedx10_a8.a0;
+  result += passStruct9BytesInt4Or8ByteAlignedx10_a8.a1;
+  result += passStruct9BytesInt4Or8ByteAlignedx10_a9.a0;
+  result += passStruct9BytesInt4Or8ByteAlignedx10_a9.a1;
+
+  passStruct9BytesInt4Or8ByteAlignedx10Result = result;
+
+  return result;
+}
+
+/// Argument is a single byte over a multiple of word size.
+/// With alignment rules taken into account size is 12 or 16 bytes.
+/// 10 struct arguments will exhaust available registers.
+///
+int passStruct9BytesInt4Or8ByteAlignedx10(
+    Struct9BytesInt4Or8ByteAligned a0,
+    Struct9BytesInt4Or8ByteAligned a1,
+    Struct9BytesInt4Or8ByteAligned a2,
+    Struct9BytesInt4Or8ByteAligned a3,
+    Struct9BytesInt4Or8ByteAligned a4,
+    Struct9BytesInt4Or8ByteAligned a5,
+    Struct9BytesInt4Or8ByteAligned a6,
+    Struct9BytesInt4Or8ByteAligned a7,
+    Struct9BytesInt4Or8ByteAligned a8,
+    Struct9BytesInt4Or8ByteAligned a9) {
+  print(
+      "passStruct9BytesInt4Or8ByteAlignedx10(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5}, ${a6}, ${a7}, ${a8}, ${a9})");
+
+  // In legacy mode, possibly return null.
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0.a0 == 42 || a0.a0 == 84) {
+    print("throwing!");
+    throw Exception(
+        "PassStruct9BytesInt4Or8ByteAlignedx10 throwing on purpuse!");
+  }
+
+  passStruct9BytesInt4Or8ByteAlignedx10_a0 = a0;
+  passStruct9BytesInt4Or8ByteAlignedx10_a1 = a1;
+  passStruct9BytesInt4Or8ByteAlignedx10_a2 = a2;
+  passStruct9BytesInt4Or8ByteAlignedx10_a3 = a3;
+  passStruct9BytesInt4Or8ByteAlignedx10_a4 = a4;
+  passStruct9BytesInt4Or8ByteAlignedx10_a5 = a5;
+  passStruct9BytesInt4Or8ByteAlignedx10_a6 = a6;
+  passStruct9BytesInt4Or8ByteAlignedx10_a7 = a7;
+  passStruct9BytesInt4Or8ByteAlignedx10_a8 = a8;
+  passStruct9BytesInt4Or8ByteAlignedx10_a9 = a9;
+
+  final result = passStruct9BytesInt4Or8ByteAlignedx10CalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void passStruct9BytesInt4Or8ByteAlignedx10AfterCallback() {
+  final result = passStruct9BytesInt4Or8ByteAlignedx10CalculateResult();
+
+  print("after callback result = $result");
+
+  Expect.equals(10, result);
+}
+
+typedef PassStruct12BytesHomogeneousFloatx6Type = Float Function(
+    Struct12BytesHomogeneousFloat,
+    Struct12BytesHomogeneousFloat,
+    Struct12BytesHomogeneousFloat,
+    Struct12BytesHomogeneousFloat,
+    Struct12BytesHomogeneousFloat,
+    Struct12BytesHomogeneousFloat);
+
+// Global variables to be able to test inputs after callback returned.
+Struct12BytesHomogeneousFloat passStruct12BytesHomogeneousFloatx6_a0 =
+    Struct12BytesHomogeneousFloat();
+Struct12BytesHomogeneousFloat passStruct12BytesHomogeneousFloatx6_a1 =
+    Struct12BytesHomogeneousFloat();
+Struct12BytesHomogeneousFloat passStruct12BytesHomogeneousFloatx6_a2 =
+    Struct12BytesHomogeneousFloat();
+Struct12BytesHomogeneousFloat passStruct12BytesHomogeneousFloatx6_a3 =
+    Struct12BytesHomogeneousFloat();
+Struct12BytesHomogeneousFloat passStruct12BytesHomogeneousFloatx6_a4 =
+    Struct12BytesHomogeneousFloat();
+Struct12BytesHomogeneousFloat passStruct12BytesHomogeneousFloatx6_a5 =
+    Struct12BytesHomogeneousFloat();
+
+// Result variable also global, so we can delete it after the callback.
+double passStruct12BytesHomogeneousFloatx6Result = 0.0;
+
+double passStruct12BytesHomogeneousFloatx6CalculateResult() {
+  double result = 0;
+
+  result += passStruct12BytesHomogeneousFloatx6_a0.a0;
+  result += passStruct12BytesHomogeneousFloatx6_a0.a1;
+  result += passStruct12BytesHomogeneousFloatx6_a0.a2;
+  result += passStruct12BytesHomogeneousFloatx6_a1.a0;
+  result += passStruct12BytesHomogeneousFloatx6_a1.a1;
+  result += passStruct12BytesHomogeneousFloatx6_a1.a2;
+  result += passStruct12BytesHomogeneousFloatx6_a2.a0;
+  result += passStruct12BytesHomogeneousFloatx6_a2.a1;
+  result += passStruct12BytesHomogeneousFloatx6_a2.a2;
+  result += passStruct12BytesHomogeneousFloatx6_a3.a0;
+  result += passStruct12BytesHomogeneousFloatx6_a3.a1;
+  result += passStruct12BytesHomogeneousFloatx6_a3.a2;
+  result += passStruct12BytesHomogeneousFloatx6_a4.a0;
+  result += passStruct12BytesHomogeneousFloatx6_a4.a1;
+  result += passStruct12BytesHomogeneousFloatx6_a4.a2;
+  result += passStruct12BytesHomogeneousFloatx6_a5.a0;
+  result += passStruct12BytesHomogeneousFloatx6_a5.a1;
+  result += passStruct12BytesHomogeneousFloatx6_a5.a2;
+
+  passStruct12BytesHomogeneousFloatx6Result = result;
+
+  return result;
+}
+
+/// Arguments in FPU registers on arm hardfp and arm64.
+/// Struct arguments will exhaust available registers, and leave some empty.
+/// The last argument is to test whether arguments are backfilled.
+double passStruct12BytesHomogeneousFloatx6(
+    Struct12BytesHomogeneousFloat a0,
+    Struct12BytesHomogeneousFloat a1,
+    Struct12BytesHomogeneousFloat a2,
+    Struct12BytesHomogeneousFloat a3,
+    Struct12BytesHomogeneousFloat a4,
+    Struct12BytesHomogeneousFloat a5) {
+  print(
+      "passStruct12BytesHomogeneousFloatx6(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5})");
+
+  // In legacy mode, possibly return null.
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0.a0 == 42 || a0.a0 == 84) {
+    print("throwing!");
+    throw Exception("PassStruct12BytesHomogeneousFloatx6 throwing on purpuse!");
+  }
+
+  passStruct12BytesHomogeneousFloatx6_a0 = a0;
+  passStruct12BytesHomogeneousFloatx6_a1 = a1;
+  passStruct12BytesHomogeneousFloatx6_a2 = a2;
+  passStruct12BytesHomogeneousFloatx6_a3 = a3;
+  passStruct12BytesHomogeneousFloatx6_a4 = a4;
+  passStruct12BytesHomogeneousFloatx6_a5 = a5;
+
+  final result = passStruct12BytesHomogeneousFloatx6CalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void passStruct12BytesHomogeneousFloatx6AfterCallback() {
+  final result = passStruct12BytesHomogeneousFloatx6CalculateResult();
+
+  print("after callback result = $result");
+
+  Expect.approxEquals(9.0, result);
+}
+
+typedef PassStruct16BytesHomogeneousFloatx5Type = Float Function(
+    Struct16BytesHomogeneousFloat,
+    Struct16BytesHomogeneousFloat,
+    Struct16BytesHomogeneousFloat,
+    Struct16BytesHomogeneousFloat,
+    Struct16BytesHomogeneousFloat);
+
+// Global variables to be able to test inputs after callback returned.
+Struct16BytesHomogeneousFloat passStruct16BytesHomogeneousFloatx5_a0 =
+    Struct16BytesHomogeneousFloat();
+Struct16BytesHomogeneousFloat passStruct16BytesHomogeneousFloatx5_a1 =
+    Struct16BytesHomogeneousFloat();
+Struct16BytesHomogeneousFloat passStruct16BytesHomogeneousFloatx5_a2 =
+    Struct16BytesHomogeneousFloat();
+Struct16BytesHomogeneousFloat passStruct16BytesHomogeneousFloatx5_a3 =
+    Struct16BytesHomogeneousFloat();
+Struct16BytesHomogeneousFloat passStruct16BytesHomogeneousFloatx5_a4 =
+    Struct16BytesHomogeneousFloat();
+
+// Result variable also global, so we can delete it after the callback.
+double passStruct16BytesHomogeneousFloatx5Result = 0.0;
+
+double passStruct16BytesHomogeneousFloatx5CalculateResult() {
+  double result = 0;
+
+  result += passStruct16BytesHomogeneousFloatx5_a0.a0;
+  result += passStruct16BytesHomogeneousFloatx5_a0.a1;
+  result += passStruct16BytesHomogeneousFloatx5_a0.a2;
+  result += passStruct16BytesHomogeneousFloatx5_a0.a3;
+  result += passStruct16BytesHomogeneousFloatx5_a1.a0;
+  result += passStruct16BytesHomogeneousFloatx5_a1.a1;
+  result += passStruct16BytesHomogeneousFloatx5_a1.a2;
+  result += passStruct16BytesHomogeneousFloatx5_a1.a3;
+  result += passStruct16BytesHomogeneousFloatx5_a2.a0;
+  result += passStruct16BytesHomogeneousFloatx5_a2.a1;
+  result += passStruct16BytesHomogeneousFloatx5_a2.a2;
+  result += passStruct16BytesHomogeneousFloatx5_a2.a3;
+  result += passStruct16BytesHomogeneousFloatx5_a3.a0;
+  result += passStruct16BytesHomogeneousFloatx5_a3.a1;
+  result += passStruct16BytesHomogeneousFloatx5_a3.a2;
+  result += passStruct16BytesHomogeneousFloatx5_a3.a3;
+  result += passStruct16BytesHomogeneousFloatx5_a4.a0;
+  result += passStruct16BytesHomogeneousFloatx5_a4.a1;
+  result += passStruct16BytesHomogeneousFloatx5_a4.a2;
+  result += passStruct16BytesHomogeneousFloatx5_a4.a3;
+
+  passStruct16BytesHomogeneousFloatx5Result = result;
+
+  return result;
+}
+
+/// On Linux x64 argument is transferred on stack because it is over 16 bytes.
+/// Arguments in FPU registers on arm hardfp and arm64.
+/// 5 struct arguments will exhaust available registers.
+double passStruct16BytesHomogeneousFloatx5(
+    Struct16BytesHomogeneousFloat a0,
+    Struct16BytesHomogeneousFloat a1,
+    Struct16BytesHomogeneousFloat a2,
+    Struct16BytesHomogeneousFloat a3,
+    Struct16BytesHomogeneousFloat a4) {
+  print(
+      "passStruct16BytesHomogeneousFloatx5(${a0}, ${a1}, ${a2}, ${a3}, ${a4})");
+
+  // In legacy mode, possibly return null.
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0.a0 == 42 || a0.a0 == 84) {
+    print("throwing!");
+    throw Exception("PassStruct16BytesHomogeneousFloatx5 throwing on purpuse!");
+  }
+
+  passStruct16BytesHomogeneousFloatx5_a0 = a0;
+  passStruct16BytesHomogeneousFloatx5_a1 = a1;
+  passStruct16BytesHomogeneousFloatx5_a2 = a2;
+  passStruct16BytesHomogeneousFloatx5_a3 = a3;
+  passStruct16BytesHomogeneousFloatx5_a4 = a4;
+
+  final result = passStruct16BytesHomogeneousFloatx5CalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void passStruct16BytesHomogeneousFloatx5AfterCallback() {
+  final result = passStruct16BytesHomogeneousFloatx5CalculateResult();
+
+  print("after callback result = $result");
+
+  Expect.approxEquals(10.0, result);
+}
+
+typedef PassStruct16BytesMixedx10Type = Double Function(
+    Struct16BytesMixed,
+    Struct16BytesMixed,
+    Struct16BytesMixed,
+    Struct16BytesMixed,
+    Struct16BytesMixed,
+    Struct16BytesMixed,
+    Struct16BytesMixed,
+    Struct16BytesMixed,
+    Struct16BytesMixed,
+    Struct16BytesMixed);
+
+// Global variables to be able to test inputs after callback returned.
+Struct16BytesMixed passStruct16BytesMixedx10_a0 = Struct16BytesMixed();
+Struct16BytesMixed passStruct16BytesMixedx10_a1 = Struct16BytesMixed();
+Struct16BytesMixed passStruct16BytesMixedx10_a2 = Struct16BytesMixed();
+Struct16BytesMixed passStruct16BytesMixedx10_a3 = Struct16BytesMixed();
+Struct16BytesMixed passStruct16BytesMixedx10_a4 = Struct16BytesMixed();
+Struct16BytesMixed passStruct16BytesMixedx10_a5 = Struct16BytesMixed();
+Struct16BytesMixed passStruct16BytesMixedx10_a6 = Struct16BytesMixed();
+Struct16BytesMixed passStruct16BytesMixedx10_a7 = Struct16BytesMixed();
+Struct16BytesMixed passStruct16BytesMixedx10_a8 = Struct16BytesMixed();
+Struct16BytesMixed passStruct16BytesMixedx10_a9 = Struct16BytesMixed();
+
+// Result variable also global, so we can delete it after the callback.
+double passStruct16BytesMixedx10Result = 0.0;
+
+double passStruct16BytesMixedx10CalculateResult() {
+  double result = 0;
+
+  result += passStruct16BytesMixedx10_a0.a0;
+  result += passStruct16BytesMixedx10_a0.a1;
+  result += passStruct16BytesMixedx10_a1.a0;
+  result += passStruct16BytesMixedx10_a1.a1;
+  result += passStruct16BytesMixedx10_a2.a0;
+  result += passStruct16BytesMixedx10_a2.a1;
+  result += passStruct16BytesMixedx10_a3.a0;
+  result += passStruct16BytesMixedx10_a3.a1;
+  result += passStruct16BytesMixedx10_a4.a0;
+  result += passStruct16BytesMixedx10_a4.a1;
+  result += passStruct16BytesMixedx10_a5.a0;
+  result += passStruct16BytesMixedx10_a5.a1;
+  result += passStruct16BytesMixedx10_a6.a0;
+  result += passStruct16BytesMixedx10_a6.a1;
+  result += passStruct16BytesMixedx10_a7.a0;
+  result += passStruct16BytesMixedx10_a7.a1;
+  result += passStruct16BytesMixedx10_a8.a0;
+  result += passStruct16BytesMixedx10_a8.a1;
+  result += passStruct16BytesMixedx10_a9.a0;
+  result += passStruct16BytesMixedx10_a9.a1;
+
+  passStruct16BytesMixedx10Result = result;
+
+  return result;
+}
+
+/// On x64, arguments are split over FP and int registers.
+/// On x64, it will exhaust the integer registers with the 6th argument.
+/// The rest goes on the stack.
+/// On arm, arguments are 8 byte aligned.
+double passStruct16BytesMixedx10(
+    Struct16BytesMixed a0,
+    Struct16BytesMixed a1,
+    Struct16BytesMixed a2,
+    Struct16BytesMixed a3,
+    Struct16BytesMixed a4,
+    Struct16BytesMixed a5,
+    Struct16BytesMixed a6,
+    Struct16BytesMixed a7,
+    Struct16BytesMixed a8,
+    Struct16BytesMixed a9) {
+  print(
+      "passStruct16BytesMixedx10(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5}, ${a6}, ${a7}, ${a8}, ${a9})");
+
+  // In legacy mode, possibly return null.
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0.a0 == 42 || a0.a0 == 84) {
+    print("throwing!");
+    throw Exception("PassStruct16BytesMixedx10 throwing on purpuse!");
+  }
+
+  passStruct16BytesMixedx10_a0 = a0;
+  passStruct16BytesMixedx10_a1 = a1;
+  passStruct16BytesMixedx10_a2 = a2;
+  passStruct16BytesMixedx10_a3 = a3;
+  passStruct16BytesMixedx10_a4 = a4;
+  passStruct16BytesMixedx10_a5 = a5;
+  passStruct16BytesMixedx10_a6 = a6;
+  passStruct16BytesMixedx10_a7 = a7;
+  passStruct16BytesMixedx10_a8 = a8;
+  passStruct16BytesMixedx10_a9 = a9;
+
+  final result = passStruct16BytesMixedx10CalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void passStruct16BytesMixedx10AfterCallback() {
+  final result = passStruct16BytesMixedx10CalculateResult();
+
+  print("after callback result = $result");
+
+  Expect.approxEquals(10.0, result);
+}
+
+typedef PassStruct16BytesMixed2x10Type = Float Function(
+    Struct16BytesMixed2,
+    Struct16BytesMixed2,
+    Struct16BytesMixed2,
+    Struct16BytesMixed2,
+    Struct16BytesMixed2,
+    Struct16BytesMixed2,
+    Struct16BytesMixed2,
+    Struct16BytesMixed2,
+    Struct16BytesMixed2,
+    Struct16BytesMixed2);
+
+// Global variables to be able to test inputs after callback returned.
+Struct16BytesMixed2 passStruct16BytesMixed2x10_a0 = Struct16BytesMixed2();
+Struct16BytesMixed2 passStruct16BytesMixed2x10_a1 = Struct16BytesMixed2();
+Struct16BytesMixed2 passStruct16BytesMixed2x10_a2 = Struct16BytesMixed2();
+Struct16BytesMixed2 passStruct16BytesMixed2x10_a3 = Struct16BytesMixed2();
+Struct16BytesMixed2 passStruct16BytesMixed2x10_a4 = Struct16BytesMixed2();
+Struct16BytesMixed2 passStruct16BytesMixed2x10_a5 = Struct16BytesMixed2();
+Struct16BytesMixed2 passStruct16BytesMixed2x10_a6 = Struct16BytesMixed2();
+Struct16BytesMixed2 passStruct16BytesMixed2x10_a7 = Struct16BytesMixed2();
+Struct16BytesMixed2 passStruct16BytesMixed2x10_a8 = Struct16BytesMixed2();
+Struct16BytesMixed2 passStruct16BytesMixed2x10_a9 = Struct16BytesMixed2();
+
+// Result variable also global, so we can delete it after the callback.
+double passStruct16BytesMixed2x10Result = 0.0;
+
+double passStruct16BytesMixed2x10CalculateResult() {
+  double result = 0;
+
+  result += passStruct16BytesMixed2x10_a0.a0;
+  result += passStruct16BytesMixed2x10_a0.a1;
+  result += passStruct16BytesMixed2x10_a0.a2;
+  result += passStruct16BytesMixed2x10_a0.a3;
+  result += passStruct16BytesMixed2x10_a1.a0;
+  result += passStruct16BytesMixed2x10_a1.a1;
+  result += passStruct16BytesMixed2x10_a1.a2;
+  result += passStruct16BytesMixed2x10_a1.a3;
+  result += passStruct16BytesMixed2x10_a2.a0;
+  result += passStruct16BytesMixed2x10_a2.a1;
+  result += passStruct16BytesMixed2x10_a2.a2;
+  result += passStruct16BytesMixed2x10_a2.a3;
+  result += passStruct16BytesMixed2x10_a3.a0;
+  result += passStruct16BytesMixed2x10_a3.a1;
+  result += passStruct16BytesMixed2x10_a3.a2;
+  result += passStruct16BytesMixed2x10_a3.a3;
+  result += passStruct16BytesMixed2x10_a4.a0;
+  result += passStruct16BytesMixed2x10_a4.a1;
+  result += passStruct16BytesMixed2x10_a4.a2;
+  result += passStruct16BytesMixed2x10_a4.a3;
+  result += passStruct16BytesMixed2x10_a5.a0;
+  result += passStruct16BytesMixed2x10_a5.a1;
+  result += passStruct16BytesMixed2x10_a5.a2;
+  result += passStruct16BytesMixed2x10_a5.a3;
+  result += passStruct16BytesMixed2x10_a6.a0;
+  result += passStruct16BytesMixed2x10_a6.a1;
+  result += passStruct16BytesMixed2x10_a6.a2;
+  result += passStruct16BytesMixed2x10_a6.a3;
+  result += passStruct16BytesMixed2x10_a7.a0;
+  result += passStruct16BytesMixed2x10_a7.a1;
+  result += passStruct16BytesMixed2x10_a7.a2;
+  result += passStruct16BytesMixed2x10_a7.a3;
+  result += passStruct16BytesMixed2x10_a8.a0;
+  result += passStruct16BytesMixed2x10_a8.a1;
+  result += passStruct16BytesMixed2x10_a8.a2;
+  result += passStruct16BytesMixed2x10_a8.a3;
+  result += passStruct16BytesMixed2x10_a9.a0;
+  result += passStruct16BytesMixed2x10_a9.a1;
+  result += passStruct16BytesMixed2x10_a9.a2;
+  result += passStruct16BytesMixed2x10_a9.a3;
+
+  passStruct16BytesMixed2x10Result = result;
+
+  return result;
+}
+
+/// On x64, arguments are split over FP and int registers.
+/// On x64, it will exhaust the integer registers with the 6th argument.
+/// The rest goes on the stack.
+/// On arm, arguments are 4 byte aligned.
+double passStruct16BytesMixed2x10(
+    Struct16BytesMixed2 a0,
+    Struct16BytesMixed2 a1,
+    Struct16BytesMixed2 a2,
+    Struct16BytesMixed2 a3,
+    Struct16BytesMixed2 a4,
+    Struct16BytesMixed2 a5,
+    Struct16BytesMixed2 a6,
+    Struct16BytesMixed2 a7,
+    Struct16BytesMixed2 a8,
+    Struct16BytesMixed2 a9) {
+  print(
+      "passStruct16BytesMixed2x10(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5}, ${a6}, ${a7}, ${a8}, ${a9})");
+
+  // In legacy mode, possibly return null.
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0.a0 == 42 || a0.a0 == 84) {
+    print("throwing!");
+    throw Exception("PassStruct16BytesMixed2x10 throwing on purpuse!");
+  }
+
+  passStruct16BytesMixed2x10_a0 = a0;
+  passStruct16BytesMixed2x10_a1 = a1;
+  passStruct16BytesMixed2x10_a2 = a2;
+  passStruct16BytesMixed2x10_a3 = a3;
+  passStruct16BytesMixed2x10_a4 = a4;
+  passStruct16BytesMixed2x10_a5 = a5;
+  passStruct16BytesMixed2x10_a6 = a6;
+  passStruct16BytesMixed2x10_a7 = a7;
+  passStruct16BytesMixed2x10_a8 = a8;
+  passStruct16BytesMixed2x10_a9 = a9;
+
+  final result = passStruct16BytesMixed2x10CalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void passStruct16BytesMixed2x10AfterCallback() {
+  final result = passStruct16BytesMixed2x10CalculateResult();
+
+  print("after callback result = $result");
+
+  Expect.approxEquals(20.0, result);
+}
+
+typedef PassStruct17BytesIntx10Type = Int64 Function(
+    Struct17BytesInt,
+    Struct17BytesInt,
+    Struct17BytesInt,
+    Struct17BytesInt,
+    Struct17BytesInt,
+    Struct17BytesInt,
+    Struct17BytesInt,
+    Struct17BytesInt,
+    Struct17BytesInt,
+    Struct17BytesInt);
+
+// Global variables to be able to test inputs after callback returned.
+Struct17BytesInt passStruct17BytesIntx10_a0 = Struct17BytesInt();
+Struct17BytesInt passStruct17BytesIntx10_a1 = Struct17BytesInt();
+Struct17BytesInt passStruct17BytesIntx10_a2 = Struct17BytesInt();
+Struct17BytesInt passStruct17BytesIntx10_a3 = Struct17BytesInt();
+Struct17BytesInt passStruct17BytesIntx10_a4 = Struct17BytesInt();
+Struct17BytesInt passStruct17BytesIntx10_a5 = Struct17BytesInt();
+Struct17BytesInt passStruct17BytesIntx10_a6 = Struct17BytesInt();
+Struct17BytesInt passStruct17BytesIntx10_a7 = Struct17BytesInt();
+Struct17BytesInt passStruct17BytesIntx10_a8 = Struct17BytesInt();
+Struct17BytesInt passStruct17BytesIntx10_a9 = Struct17BytesInt();
+
+// Result variable also global, so we can delete it after the callback.
+int passStruct17BytesIntx10Result = 0;
+
+int passStruct17BytesIntx10CalculateResult() {
+  int result = 0;
+
+  result += passStruct17BytesIntx10_a0.a0;
+  result += passStruct17BytesIntx10_a0.a1;
+  result += passStruct17BytesIntx10_a0.a2;
+  result += passStruct17BytesIntx10_a1.a0;
+  result += passStruct17BytesIntx10_a1.a1;
+  result += passStruct17BytesIntx10_a1.a2;
+  result += passStruct17BytesIntx10_a2.a0;
+  result += passStruct17BytesIntx10_a2.a1;
+  result += passStruct17BytesIntx10_a2.a2;
+  result += passStruct17BytesIntx10_a3.a0;
+  result += passStruct17BytesIntx10_a3.a1;
+  result += passStruct17BytesIntx10_a3.a2;
+  result += passStruct17BytesIntx10_a4.a0;
+  result += passStruct17BytesIntx10_a4.a1;
+  result += passStruct17BytesIntx10_a4.a2;
+  result += passStruct17BytesIntx10_a5.a0;
+  result += passStruct17BytesIntx10_a5.a1;
+  result += passStruct17BytesIntx10_a5.a2;
+  result += passStruct17BytesIntx10_a6.a0;
+  result += passStruct17BytesIntx10_a6.a1;
+  result += passStruct17BytesIntx10_a6.a2;
+  result += passStruct17BytesIntx10_a7.a0;
+  result += passStruct17BytesIntx10_a7.a1;
+  result += passStruct17BytesIntx10_a7.a2;
+  result += passStruct17BytesIntx10_a8.a0;
+  result += passStruct17BytesIntx10_a8.a1;
+  result += passStruct17BytesIntx10_a8.a2;
+  result += passStruct17BytesIntx10_a9.a0;
+  result += passStruct17BytesIntx10_a9.a1;
+  result += passStruct17BytesIntx10_a9.a2;
+
+  passStruct17BytesIntx10Result = result;
+
+  return result;
+}
+
+/// Arguments are passed as pointer to copy on arm64.
+/// Tests that the memory allocated for copies are rounded up to word size.
+int passStruct17BytesIntx10(
+    Struct17BytesInt a0,
+    Struct17BytesInt a1,
+    Struct17BytesInt a2,
+    Struct17BytesInt a3,
+    Struct17BytesInt a4,
+    Struct17BytesInt a5,
+    Struct17BytesInt a6,
+    Struct17BytesInt a7,
+    Struct17BytesInt a8,
+    Struct17BytesInt a9) {
+  print(
+      "passStruct17BytesIntx10(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5}, ${a6}, ${a7}, ${a8}, ${a9})");
+
+  // In legacy mode, possibly return null.
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0.a0 == 42 || a0.a0 == 84) {
+    print("throwing!");
+    throw Exception("PassStruct17BytesIntx10 throwing on purpuse!");
+  }
+
+  passStruct17BytesIntx10_a0 = a0;
+  passStruct17BytesIntx10_a1 = a1;
+  passStruct17BytesIntx10_a2 = a2;
+  passStruct17BytesIntx10_a3 = a3;
+  passStruct17BytesIntx10_a4 = a4;
+  passStruct17BytesIntx10_a5 = a5;
+  passStruct17BytesIntx10_a6 = a6;
+  passStruct17BytesIntx10_a7 = a7;
+  passStruct17BytesIntx10_a8 = a8;
+  passStruct17BytesIntx10_a9 = a9;
+
+  final result = passStruct17BytesIntx10CalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void passStruct17BytesIntx10AfterCallback() {
+  final result = passStruct17BytesIntx10CalculateResult();
+
+  print("after callback result = $result");
+
+  Expect.equals(15, result);
+}
+
+typedef PassStruct19BytesHomogeneousUint8x10Type = Int64 Function(
+    Struct19BytesHomogeneousUint8,
+    Struct19BytesHomogeneousUint8,
+    Struct19BytesHomogeneousUint8,
+    Struct19BytesHomogeneousUint8,
+    Struct19BytesHomogeneousUint8,
+    Struct19BytesHomogeneousUint8,
+    Struct19BytesHomogeneousUint8,
+    Struct19BytesHomogeneousUint8,
+    Struct19BytesHomogeneousUint8,
+    Struct19BytesHomogeneousUint8);
+
+// Global variables to be able to test inputs after callback returned.
+Struct19BytesHomogeneousUint8 passStruct19BytesHomogeneousUint8x10_a0 =
+    Struct19BytesHomogeneousUint8();
+Struct19BytesHomogeneousUint8 passStruct19BytesHomogeneousUint8x10_a1 =
+    Struct19BytesHomogeneousUint8();
+Struct19BytesHomogeneousUint8 passStruct19BytesHomogeneousUint8x10_a2 =
+    Struct19BytesHomogeneousUint8();
+Struct19BytesHomogeneousUint8 passStruct19BytesHomogeneousUint8x10_a3 =
+    Struct19BytesHomogeneousUint8();
+Struct19BytesHomogeneousUint8 passStruct19BytesHomogeneousUint8x10_a4 =
+    Struct19BytesHomogeneousUint8();
+Struct19BytesHomogeneousUint8 passStruct19BytesHomogeneousUint8x10_a5 =
+    Struct19BytesHomogeneousUint8();
+Struct19BytesHomogeneousUint8 passStruct19BytesHomogeneousUint8x10_a6 =
+    Struct19BytesHomogeneousUint8();
+Struct19BytesHomogeneousUint8 passStruct19BytesHomogeneousUint8x10_a7 =
+    Struct19BytesHomogeneousUint8();
+Struct19BytesHomogeneousUint8 passStruct19BytesHomogeneousUint8x10_a8 =
+    Struct19BytesHomogeneousUint8();
+Struct19BytesHomogeneousUint8 passStruct19BytesHomogeneousUint8x10_a9 =
+    Struct19BytesHomogeneousUint8();
+
+// Result variable also global, so we can delete it after the callback.
+int passStruct19BytesHomogeneousUint8x10Result = 0;
+
+int passStruct19BytesHomogeneousUint8x10CalculateResult() {
+  int result = 0;
+
+  result += passStruct19BytesHomogeneousUint8x10_a0.a0;
+  result += passStruct19BytesHomogeneousUint8x10_a0.a1;
+  result += passStruct19BytesHomogeneousUint8x10_a0.a2;
+  result += passStruct19BytesHomogeneousUint8x10_a0.a3;
+  result += passStruct19BytesHomogeneousUint8x10_a0.a4;
+  result += passStruct19BytesHomogeneousUint8x10_a0.a5;
+  result += passStruct19BytesHomogeneousUint8x10_a0.a6;
+  result += passStruct19BytesHomogeneousUint8x10_a0.a7;
+  result += passStruct19BytesHomogeneousUint8x10_a0.a8;
+  result += passStruct19BytesHomogeneousUint8x10_a0.a9;
+  result += passStruct19BytesHomogeneousUint8x10_a0.a10;
+  result += passStruct19BytesHomogeneousUint8x10_a0.a11;
+  result += passStruct19BytesHomogeneousUint8x10_a0.a12;
+  result += passStruct19BytesHomogeneousUint8x10_a0.a13;
+  result += passStruct19BytesHomogeneousUint8x10_a0.a14;
+  result += passStruct19BytesHomogeneousUint8x10_a0.a15;
+  result += passStruct19BytesHomogeneousUint8x10_a0.a16;
+  result += passStruct19BytesHomogeneousUint8x10_a0.a17;
+  result += passStruct19BytesHomogeneousUint8x10_a0.a18;
+  result += passStruct19BytesHomogeneousUint8x10_a1.a0;
+  result += passStruct19BytesHomogeneousUint8x10_a1.a1;
+  result += passStruct19BytesHomogeneousUint8x10_a1.a2;
+  result += passStruct19BytesHomogeneousUint8x10_a1.a3;
+  result += passStruct19BytesHomogeneousUint8x10_a1.a4;
+  result += passStruct19BytesHomogeneousUint8x10_a1.a5;
+  result += passStruct19BytesHomogeneousUint8x10_a1.a6;
+  result += passStruct19BytesHomogeneousUint8x10_a1.a7;
+  result += passStruct19BytesHomogeneousUint8x10_a1.a8;
+  result += passStruct19BytesHomogeneousUint8x10_a1.a9;
+  result += passStruct19BytesHomogeneousUint8x10_a1.a10;
+  result += passStruct19BytesHomogeneousUint8x10_a1.a11;
+  result += passStruct19BytesHomogeneousUint8x10_a1.a12;
+  result += passStruct19BytesHomogeneousUint8x10_a1.a13;
+  result += passStruct19BytesHomogeneousUint8x10_a1.a14;
+  result += passStruct19BytesHomogeneousUint8x10_a1.a15;
+  result += passStruct19BytesHomogeneousUint8x10_a1.a16;
+  result += passStruct19BytesHomogeneousUint8x10_a1.a17;
+  result += passStruct19BytesHomogeneousUint8x10_a1.a18;
+  result += passStruct19BytesHomogeneousUint8x10_a2.a0;
+  result += passStruct19BytesHomogeneousUint8x10_a2.a1;
+  result += passStruct19BytesHomogeneousUint8x10_a2.a2;
+  result += passStruct19BytesHomogeneousUint8x10_a2.a3;
+  result += passStruct19BytesHomogeneousUint8x10_a2.a4;
+  result += passStruct19BytesHomogeneousUint8x10_a2.a5;
+  result += passStruct19BytesHomogeneousUint8x10_a2.a6;
+  result += passStruct19BytesHomogeneousUint8x10_a2.a7;
+  result += passStruct19BytesHomogeneousUint8x10_a2.a8;
+  result += passStruct19BytesHomogeneousUint8x10_a2.a9;
+  result += passStruct19BytesHomogeneousUint8x10_a2.a10;
+  result += passStruct19BytesHomogeneousUint8x10_a2.a11;
+  result += passStruct19BytesHomogeneousUint8x10_a2.a12;
+  result += passStruct19BytesHomogeneousUint8x10_a2.a13;
+  result += passStruct19BytesHomogeneousUint8x10_a2.a14;
+  result += passStruct19BytesHomogeneousUint8x10_a2.a15;
+  result += passStruct19BytesHomogeneousUint8x10_a2.a16;
+  result += passStruct19BytesHomogeneousUint8x10_a2.a17;
+  result += passStruct19BytesHomogeneousUint8x10_a2.a18;
+  result += passStruct19BytesHomogeneousUint8x10_a3.a0;
+  result += passStruct19BytesHomogeneousUint8x10_a3.a1;
+  result += passStruct19BytesHomogeneousUint8x10_a3.a2;
+  result += passStruct19BytesHomogeneousUint8x10_a3.a3;
+  result += passStruct19BytesHomogeneousUint8x10_a3.a4;
+  result += passStruct19BytesHomogeneousUint8x10_a3.a5;
+  result += passStruct19BytesHomogeneousUint8x10_a3.a6;
+  result += passStruct19BytesHomogeneousUint8x10_a3.a7;
+  result += passStruct19BytesHomogeneousUint8x10_a3.a8;
+  result += passStruct19BytesHomogeneousUint8x10_a3.a9;
+  result += passStruct19BytesHomogeneousUint8x10_a3.a10;
+  result += passStruct19BytesHomogeneousUint8x10_a3.a11;
+  result += passStruct19BytesHomogeneousUint8x10_a3.a12;
+  result += passStruct19BytesHomogeneousUint8x10_a3.a13;
+  result += passStruct19BytesHomogeneousUint8x10_a3.a14;
+  result += passStruct19BytesHomogeneousUint8x10_a3.a15;
+  result += passStruct19BytesHomogeneousUint8x10_a3.a16;
+  result += passStruct19BytesHomogeneousUint8x10_a3.a17;
+  result += passStruct19BytesHomogeneousUint8x10_a3.a18;
+  result += passStruct19BytesHomogeneousUint8x10_a4.a0;
+  result += passStruct19BytesHomogeneousUint8x10_a4.a1;
+  result += passStruct19BytesHomogeneousUint8x10_a4.a2;
+  result += passStruct19BytesHomogeneousUint8x10_a4.a3;
+  result += passStruct19BytesHomogeneousUint8x10_a4.a4;
+  result += passStruct19BytesHomogeneousUint8x10_a4.a5;
+  result += passStruct19BytesHomogeneousUint8x10_a4.a6;
+  result += passStruct19BytesHomogeneousUint8x10_a4.a7;
+  result += passStruct19BytesHomogeneousUint8x10_a4.a8;
+  result += passStruct19BytesHomogeneousUint8x10_a4.a9;
+  result += passStruct19BytesHomogeneousUint8x10_a4.a10;
+  result += passStruct19BytesHomogeneousUint8x10_a4.a11;
+  result += passStruct19BytesHomogeneousUint8x10_a4.a12;
+  result += passStruct19BytesHomogeneousUint8x10_a4.a13;
+  result += passStruct19BytesHomogeneousUint8x10_a4.a14;
+  result += passStruct19BytesHomogeneousUint8x10_a4.a15;
+  result += passStruct19BytesHomogeneousUint8x10_a4.a16;
+  result += passStruct19BytesHomogeneousUint8x10_a4.a17;
+  result += passStruct19BytesHomogeneousUint8x10_a4.a18;
+  result += passStruct19BytesHomogeneousUint8x10_a5.a0;
+  result += passStruct19BytesHomogeneousUint8x10_a5.a1;
+  result += passStruct19BytesHomogeneousUint8x10_a5.a2;
+  result += passStruct19BytesHomogeneousUint8x10_a5.a3;
+  result += passStruct19BytesHomogeneousUint8x10_a5.a4;
+  result += passStruct19BytesHomogeneousUint8x10_a5.a5;
+  result += passStruct19BytesHomogeneousUint8x10_a5.a6;
+  result += passStruct19BytesHomogeneousUint8x10_a5.a7;
+  result += passStruct19BytesHomogeneousUint8x10_a5.a8;
+  result += passStruct19BytesHomogeneousUint8x10_a5.a9;
+  result += passStruct19BytesHomogeneousUint8x10_a5.a10;
+  result += passStruct19BytesHomogeneousUint8x10_a5.a11;
+  result += passStruct19BytesHomogeneousUint8x10_a5.a12;
+  result += passStruct19BytesHomogeneousUint8x10_a5.a13;
+  result += passStruct19BytesHomogeneousUint8x10_a5.a14;
+  result += passStruct19BytesHomogeneousUint8x10_a5.a15;
+  result += passStruct19BytesHomogeneousUint8x10_a5.a16;
+  result += passStruct19BytesHomogeneousUint8x10_a5.a17;
+  result += passStruct19BytesHomogeneousUint8x10_a5.a18;
+  result += passStruct19BytesHomogeneousUint8x10_a6.a0;
+  result += passStruct19BytesHomogeneousUint8x10_a6.a1;
+  result += passStruct19BytesHomogeneousUint8x10_a6.a2;
+  result += passStruct19BytesHomogeneousUint8x10_a6.a3;
+  result += passStruct19BytesHomogeneousUint8x10_a6.a4;
+  result += passStruct19BytesHomogeneousUint8x10_a6.a5;
+  result += passStruct19BytesHomogeneousUint8x10_a6.a6;
+  result += passStruct19BytesHomogeneousUint8x10_a6.a7;
+  result += passStruct19BytesHomogeneousUint8x10_a6.a8;
+  result += passStruct19BytesHomogeneousUint8x10_a6.a9;
+  result += passStruct19BytesHomogeneousUint8x10_a6.a10;
+  result += passStruct19BytesHomogeneousUint8x10_a6.a11;
+  result += passStruct19BytesHomogeneousUint8x10_a6.a12;
+  result += passStruct19BytesHomogeneousUint8x10_a6.a13;
+  result += passStruct19BytesHomogeneousUint8x10_a6.a14;
+  result += passStruct19BytesHomogeneousUint8x10_a6.a15;
+  result += passStruct19BytesHomogeneousUint8x10_a6.a16;
+  result += passStruct19BytesHomogeneousUint8x10_a6.a17;
+  result += passStruct19BytesHomogeneousUint8x10_a6.a18;
+  result += passStruct19BytesHomogeneousUint8x10_a7.a0;
+  result += passStruct19BytesHomogeneousUint8x10_a7.a1;
+  result += passStruct19BytesHomogeneousUint8x10_a7.a2;
+  result += passStruct19BytesHomogeneousUint8x10_a7.a3;
+  result += passStruct19BytesHomogeneousUint8x10_a7.a4;
+  result += passStruct19BytesHomogeneousUint8x10_a7.a5;
+  result += passStruct19BytesHomogeneousUint8x10_a7.a6;
+  result += passStruct19BytesHomogeneousUint8x10_a7.a7;
+  result += passStruct19BytesHomogeneousUint8x10_a7.a8;
+  result += passStruct19BytesHomogeneousUint8x10_a7.a9;
+  result += passStruct19BytesHomogeneousUint8x10_a7.a10;
+  result += passStruct19BytesHomogeneousUint8x10_a7.a11;
+  result += passStruct19BytesHomogeneousUint8x10_a7.a12;
+  result += passStruct19BytesHomogeneousUint8x10_a7.a13;
+  result += passStruct19BytesHomogeneousUint8x10_a7.a14;
+  result += passStruct19BytesHomogeneousUint8x10_a7.a15;
+  result += passStruct19BytesHomogeneousUint8x10_a7.a16;
+  result += passStruct19BytesHomogeneousUint8x10_a7.a17;
+  result += passStruct19BytesHomogeneousUint8x10_a7.a18;
+  result += passStruct19BytesHomogeneousUint8x10_a8.a0;
+  result += passStruct19BytesHomogeneousUint8x10_a8.a1;
+  result += passStruct19BytesHomogeneousUint8x10_a8.a2;
+  result += passStruct19BytesHomogeneousUint8x10_a8.a3;
+  result += passStruct19BytesHomogeneousUint8x10_a8.a4;
+  result += passStruct19BytesHomogeneousUint8x10_a8.a5;
+  result += passStruct19BytesHomogeneousUint8x10_a8.a6;
+  result += passStruct19BytesHomogeneousUint8x10_a8.a7;
+  result += passStruct19BytesHomogeneousUint8x10_a8.a8;
+  result += passStruct19BytesHomogeneousUint8x10_a8.a9;
+  result += passStruct19BytesHomogeneousUint8x10_a8.a10;
+  result += passStruct19BytesHomogeneousUint8x10_a8.a11;
+  result += passStruct19BytesHomogeneousUint8x10_a8.a12;
+  result += passStruct19BytesHomogeneousUint8x10_a8.a13;
+  result += passStruct19BytesHomogeneousUint8x10_a8.a14;
+  result += passStruct19BytesHomogeneousUint8x10_a8.a15;
+  result += passStruct19BytesHomogeneousUint8x10_a8.a16;
+  result += passStruct19BytesHomogeneousUint8x10_a8.a17;
+  result += passStruct19BytesHomogeneousUint8x10_a8.a18;
+  result += passStruct19BytesHomogeneousUint8x10_a9.a0;
+  result += passStruct19BytesHomogeneousUint8x10_a9.a1;
+  result += passStruct19BytesHomogeneousUint8x10_a9.a2;
+  result += passStruct19BytesHomogeneousUint8x10_a9.a3;
+  result += passStruct19BytesHomogeneousUint8x10_a9.a4;
+  result += passStruct19BytesHomogeneousUint8x10_a9.a5;
+  result += passStruct19BytesHomogeneousUint8x10_a9.a6;
+  result += passStruct19BytesHomogeneousUint8x10_a9.a7;
+  result += passStruct19BytesHomogeneousUint8x10_a9.a8;
+  result += passStruct19BytesHomogeneousUint8x10_a9.a9;
+  result += passStruct19BytesHomogeneousUint8x10_a9.a10;
+  result += passStruct19BytesHomogeneousUint8x10_a9.a11;
+  result += passStruct19BytesHomogeneousUint8x10_a9.a12;
+  result += passStruct19BytesHomogeneousUint8x10_a9.a13;
+  result += passStruct19BytesHomogeneousUint8x10_a9.a14;
+  result += passStruct19BytesHomogeneousUint8x10_a9.a15;
+  result += passStruct19BytesHomogeneousUint8x10_a9.a16;
+  result += passStruct19BytesHomogeneousUint8x10_a9.a17;
+  result += passStruct19BytesHomogeneousUint8x10_a9.a18;
+
+  passStruct19BytesHomogeneousUint8x10Result = result;
+
+  return result;
+}
+
+/// The minimum alignment of this struct is only 1 byte based on its fields.
+/// Test that the memory backing these structs is extended to the right size.
+///
+int passStruct19BytesHomogeneousUint8x10(
+    Struct19BytesHomogeneousUint8 a0,
+    Struct19BytesHomogeneousUint8 a1,
+    Struct19BytesHomogeneousUint8 a2,
+    Struct19BytesHomogeneousUint8 a3,
+    Struct19BytesHomogeneousUint8 a4,
+    Struct19BytesHomogeneousUint8 a5,
+    Struct19BytesHomogeneousUint8 a6,
+    Struct19BytesHomogeneousUint8 a7,
+    Struct19BytesHomogeneousUint8 a8,
+    Struct19BytesHomogeneousUint8 a9) {
+  print(
+      "passStruct19BytesHomogeneousUint8x10(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5}, ${a6}, ${a7}, ${a8}, ${a9})");
+
+  // In legacy mode, possibly return null.
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0.a0 == 42 || a0.a0 == 84) {
+    print("throwing!");
+    throw Exception(
+        "PassStruct19BytesHomogeneousUint8x10 throwing on purpuse!");
+  }
+
+  passStruct19BytesHomogeneousUint8x10_a0 = a0;
+  passStruct19BytesHomogeneousUint8x10_a1 = a1;
+  passStruct19BytesHomogeneousUint8x10_a2 = a2;
+  passStruct19BytesHomogeneousUint8x10_a3 = a3;
+  passStruct19BytesHomogeneousUint8x10_a4 = a4;
+  passStruct19BytesHomogeneousUint8x10_a5 = a5;
+  passStruct19BytesHomogeneousUint8x10_a6 = a6;
+  passStruct19BytesHomogeneousUint8x10_a7 = a7;
+  passStruct19BytesHomogeneousUint8x10_a8 = a8;
+  passStruct19BytesHomogeneousUint8x10_a9 = a9;
+
+  final result = passStruct19BytesHomogeneousUint8x10CalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void passStruct19BytesHomogeneousUint8x10AfterCallback() {
+  final result = passStruct19BytesHomogeneousUint8x10CalculateResult();
+
+  print("after callback result = $result");
+
+  Expect.equals(18145, result);
+}
+
+typedef PassStruct20BytesHomogeneousInt32x10Type = Int32 Function(
+    Struct20BytesHomogeneousInt32,
+    Struct20BytesHomogeneousInt32,
+    Struct20BytesHomogeneousInt32,
+    Struct20BytesHomogeneousInt32,
+    Struct20BytesHomogeneousInt32,
+    Struct20BytesHomogeneousInt32,
+    Struct20BytesHomogeneousInt32,
+    Struct20BytesHomogeneousInt32,
+    Struct20BytesHomogeneousInt32,
+    Struct20BytesHomogeneousInt32);
+
+// Global variables to be able to test inputs after callback returned.
+Struct20BytesHomogeneousInt32 passStruct20BytesHomogeneousInt32x10_a0 =
+    Struct20BytesHomogeneousInt32();
+Struct20BytesHomogeneousInt32 passStruct20BytesHomogeneousInt32x10_a1 =
+    Struct20BytesHomogeneousInt32();
+Struct20BytesHomogeneousInt32 passStruct20BytesHomogeneousInt32x10_a2 =
+    Struct20BytesHomogeneousInt32();
+Struct20BytesHomogeneousInt32 passStruct20BytesHomogeneousInt32x10_a3 =
+    Struct20BytesHomogeneousInt32();
+Struct20BytesHomogeneousInt32 passStruct20BytesHomogeneousInt32x10_a4 =
+    Struct20BytesHomogeneousInt32();
+Struct20BytesHomogeneousInt32 passStruct20BytesHomogeneousInt32x10_a5 =
+    Struct20BytesHomogeneousInt32();
+Struct20BytesHomogeneousInt32 passStruct20BytesHomogeneousInt32x10_a6 =
+    Struct20BytesHomogeneousInt32();
+Struct20BytesHomogeneousInt32 passStruct20BytesHomogeneousInt32x10_a7 =
+    Struct20BytesHomogeneousInt32();
+Struct20BytesHomogeneousInt32 passStruct20BytesHomogeneousInt32x10_a8 =
+    Struct20BytesHomogeneousInt32();
+Struct20BytesHomogeneousInt32 passStruct20BytesHomogeneousInt32x10_a9 =
+    Struct20BytesHomogeneousInt32();
+
+// Result variable also global, so we can delete it after the callback.
+int passStruct20BytesHomogeneousInt32x10Result = 0;
+
+int passStruct20BytesHomogeneousInt32x10CalculateResult() {
+  int result = 0;
+
+  result += passStruct20BytesHomogeneousInt32x10_a0.a0;
+  result += passStruct20BytesHomogeneousInt32x10_a0.a1;
+  result += passStruct20BytesHomogeneousInt32x10_a0.a2;
+  result += passStruct20BytesHomogeneousInt32x10_a0.a3;
+  result += passStruct20BytesHomogeneousInt32x10_a0.a4;
+  result += passStruct20BytesHomogeneousInt32x10_a1.a0;
+  result += passStruct20BytesHomogeneousInt32x10_a1.a1;
+  result += passStruct20BytesHomogeneousInt32x10_a1.a2;
+  result += passStruct20BytesHomogeneousInt32x10_a1.a3;
+  result += passStruct20BytesHomogeneousInt32x10_a1.a4;
+  result += passStruct20BytesHomogeneousInt32x10_a2.a0;
+  result += passStruct20BytesHomogeneousInt32x10_a2.a1;
+  result += passStruct20BytesHomogeneousInt32x10_a2.a2;
+  result += passStruct20BytesHomogeneousInt32x10_a2.a3;
+  result += passStruct20BytesHomogeneousInt32x10_a2.a4;
+  result += passStruct20BytesHomogeneousInt32x10_a3.a0;
+  result += passStruct20BytesHomogeneousInt32x10_a3.a1;
+  result += passStruct20BytesHomogeneousInt32x10_a3.a2;
+  result += passStruct20BytesHomogeneousInt32x10_a3.a3;
+  result += passStruct20BytesHomogeneousInt32x10_a3.a4;
+  result += passStruct20BytesHomogeneousInt32x10_a4.a0;
+  result += passStruct20BytesHomogeneousInt32x10_a4.a1;
+  result += passStruct20BytesHomogeneousInt32x10_a4.a2;
+  result += passStruct20BytesHomogeneousInt32x10_a4.a3;
+  result += passStruct20BytesHomogeneousInt32x10_a4.a4;
+  result += passStruct20BytesHomogeneousInt32x10_a5.a0;
+  result += passStruct20BytesHomogeneousInt32x10_a5.a1;
+  result += passStruct20BytesHomogeneousInt32x10_a5.a2;
+  result += passStruct20BytesHomogeneousInt32x10_a5.a3;
+  result += passStruct20BytesHomogeneousInt32x10_a5.a4;
+  result += passStruct20BytesHomogeneousInt32x10_a6.a0;
+  result += passStruct20BytesHomogeneousInt32x10_a6.a1;
+  result += passStruct20BytesHomogeneousInt32x10_a6.a2;
+  result += passStruct20BytesHomogeneousInt32x10_a6.a3;
+  result += passStruct20BytesHomogeneousInt32x10_a6.a4;
+  result += passStruct20BytesHomogeneousInt32x10_a7.a0;
+  result += passStruct20BytesHomogeneousInt32x10_a7.a1;
+  result += passStruct20BytesHomogeneousInt32x10_a7.a2;
+  result += passStruct20BytesHomogeneousInt32x10_a7.a3;
+  result += passStruct20BytesHomogeneousInt32x10_a7.a4;
+  result += passStruct20BytesHomogeneousInt32x10_a8.a0;
+  result += passStruct20BytesHomogeneousInt32x10_a8.a1;
+  result += passStruct20BytesHomogeneousInt32x10_a8.a2;
+  result += passStruct20BytesHomogeneousInt32x10_a8.a3;
+  result += passStruct20BytesHomogeneousInt32x10_a8.a4;
+  result += passStruct20BytesHomogeneousInt32x10_a9.a0;
+  result += passStruct20BytesHomogeneousInt32x10_a9.a1;
+  result += passStruct20BytesHomogeneousInt32x10_a9.a2;
+  result += passStruct20BytesHomogeneousInt32x10_a9.a3;
+  result += passStruct20BytesHomogeneousInt32x10_a9.a4;
+
+  passStruct20BytesHomogeneousInt32x10Result = result;
+
+  return result;
+}
+
+/// Argument too big to go into integer registers on arm64.
+/// The arguments are passed as pointers to copies.
+/// The amount of arguments exhausts the number of integer registers, such that
+/// pointers to copies are also passed on the stack.
+int passStruct20BytesHomogeneousInt32x10(
+    Struct20BytesHomogeneousInt32 a0,
+    Struct20BytesHomogeneousInt32 a1,
+    Struct20BytesHomogeneousInt32 a2,
+    Struct20BytesHomogeneousInt32 a3,
+    Struct20BytesHomogeneousInt32 a4,
+    Struct20BytesHomogeneousInt32 a5,
+    Struct20BytesHomogeneousInt32 a6,
+    Struct20BytesHomogeneousInt32 a7,
+    Struct20BytesHomogeneousInt32 a8,
+    Struct20BytesHomogeneousInt32 a9) {
+  print(
+      "passStruct20BytesHomogeneousInt32x10(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5}, ${a6}, ${a7}, ${a8}, ${a9})");
+
+  // In legacy mode, possibly return null.
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0.a0 == 42 || a0.a0 == 84) {
+    print("throwing!");
+    throw Exception(
+        "PassStruct20BytesHomogeneousInt32x10 throwing on purpuse!");
+  }
+
+  passStruct20BytesHomogeneousInt32x10_a0 = a0;
+  passStruct20BytesHomogeneousInt32x10_a1 = a1;
+  passStruct20BytesHomogeneousInt32x10_a2 = a2;
+  passStruct20BytesHomogeneousInt32x10_a3 = a3;
+  passStruct20BytesHomogeneousInt32x10_a4 = a4;
+  passStruct20BytesHomogeneousInt32x10_a5 = a5;
+  passStruct20BytesHomogeneousInt32x10_a6 = a6;
+  passStruct20BytesHomogeneousInt32x10_a7 = a7;
+  passStruct20BytesHomogeneousInt32x10_a8 = a8;
+  passStruct20BytesHomogeneousInt32x10_a9 = a9;
+
+  final result = passStruct20BytesHomogeneousInt32x10CalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void passStruct20BytesHomogeneousInt32x10AfterCallback() {
+  final result = passStruct20BytesHomogeneousInt32x10CalculateResult();
+
+  print("after callback result = $result");
+
+  Expect.equals(25, result);
+}
+
+typedef PassStruct20BytesHomogeneousFloatType = Float Function(
+    Struct20BytesHomogeneousFloat);
+
+// Global variables to be able to test inputs after callback returned.
+Struct20BytesHomogeneousFloat passStruct20BytesHomogeneousFloat_a0 =
+    Struct20BytesHomogeneousFloat();
+
+// Result variable also global, so we can delete it after the callback.
+double passStruct20BytesHomogeneousFloatResult = 0.0;
+
+double passStruct20BytesHomogeneousFloatCalculateResult() {
+  double result = 0;
+
+  result += passStruct20BytesHomogeneousFloat_a0.a0;
+  result += passStruct20BytesHomogeneousFloat_a0.a1;
+  result += passStruct20BytesHomogeneousFloat_a0.a2;
+  result += passStruct20BytesHomogeneousFloat_a0.a3;
+  result += passStruct20BytesHomogeneousFloat_a0.a4;
+
+  passStruct20BytesHomogeneousFloatResult = result;
+
+  return result;
+}
+
+/// Argument too big to go into FPU registers in hardfp and arm64.
+double passStruct20BytesHomogeneousFloat(Struct20BytesHomogeneousFloat a0) {
+  print("passStruct20BytesHomogeneousFloat(${a0})");
+
+  // In legacy mode, possibly return null.
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0.a0 == 42 || a0.a0 == 84) {
+    print("throwing!");
+    throw Exception("PassStruct20BytesHomogeneousFloat throwing on purpuse!");
+  }
+
+  passStruct20BytesHomogeneousFloat_a0 = a0;
+
+  final result = passStruct20BytesHomogeneousFloatCalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void passStruct20BytesHomogeneousFloatAfterCallback() {
+  final result = passStruct20BytesHomogeneousFloatCalculateResult();
+
+  print("after callback result = $result");
+
+  Expect.approxEquals(-3.0, result);
+}
+
+typedef PassStruct32BytesHomogeneousDoublex5Type = Double Function(
+    Struct32BytesHomogeneousDouble,
+    Struct32BytesHomogeneousDouble,
+    Struct32BytesHomogeneousDouble,
+    Struct32BytesHomogeneousDouble,
+    Struct32BytesHomogeneousDouble);
+
+// Global variables to be able to test inputs after callback returned.
+Struct32BytesHomogeneousDouble passStruct32BytesHomogeneousDoublex5_a0 =
+    Struct32BytesHomogeneousDouble();
+Struct32BytesHomogeneousDouble passStruct32BytesHomogeneousDoublex5_a1 =
+    Struct32BytesHomogeneousDouble();
+Struct32BytesHomogeneousDouble passStruct32BytesHomogeneousDoublex5_a2 =
+    Struct32BytesHomogeneousDouble();
+Struct32BytesHomogeneousDouble passStruct32BytesHomogeneousDoublex5_a3 =
+    Struct32BytesHomogeneousDouble();
+Struct32BytesHomogeneousDouble passStruct32BytesHomogeneousDoublex5_a4 =
+    Struct32BytesHomogeneousDouble();
+
+// Result variable also global, so we can delete it after the callback.
+double passStruct32BytesHomogeneousDoublex5Result = 0.0;
+
+double passStruct32BytesHomogeneousDoublex5CalculateResult() {
+  double result = 0;
+
+  result += passStruct32BytesHomogeneousDoublex5_a0.a0;
+  result += passStruct32BytesHomogeneousDoublex5_a0.a1;
+  result += passStruct32BytesHomogeneousDoublex5_a0.a2;
+  result += passStruct32BytesHomogeneousDoublex5_a0.a3;
+  result += passStruct32BytesHomogeneousDoublex5_a1.a0;
+  result += passStruct32BytesHomogeneousDoublex5_a1.a1;
+  result += passStruct32BytesHomogeneousDoublex5_a1.a2;
+  result += passStruct32BytesHomogeneousDoublex5_a1.a3;
+  result += passStruct32BytesHomogeneousDoublex5_a2.a0;
+  result += passStruct32BytesHomogeneousDoublex5_a2.a1;
+  result += passStruct32BytesHomogeneousDoublex5_a2.a2;
+  result += passStruct32BytesHomogeneousDoublex5_a2.a3;
+  result += passStruct32BytesHomogeneousDoublex5_a3.a0;
+  result += passStruct32BytesHomogeneousDoublex5_a3.a1;
+  result += passStruct32BytesHomogeneousDoublex5_a3.a2;
+  result += passStruct32BytesHomogeneousDoublex5_a3.a3;
+  result += passStruct32BytesHomogeneousDoublex5_a4.a0;
+  result += passStruct32BytesHomogeneousDoublex5_a4.a1;
+  result += passStruct32BytesHomogeneousDoublex5_a4.a2;
+  result += passStruct32BytesHomogeneousDoublex5_a4.a3;
+
+  passStruct32BytesHomogeneousDoublex5Result = result;
+
+  return result;
+}
+
+/// Arguments in FPU registers on arm64.
+/// 5 struct arguments will exhaust available registers.
+double passStruct32BytesHomogeneousDoublex5(
+    Struct32BytesHomogeneousDouble a0,
+    Struct32BytesHomogeneousDouble a1,
+    Struct32BytesHomogeneousDouble a2,
+    Struct32BytesHomogeneousDouble a3,
+    Struct32BytesHomogeneousDouble a4) {
+  print(
+      "passStruct32BytesHomogeneousDoublex5(${a0}, ${a1}, ${a2}, ${a3}, ${a4})");
+
+  // In legacy mode, possibly return null.
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0.a0 == 42 || a0.a0 == 84) {
+    print("throwing!");
+    throw Exception(
+        "PassStruct32BytesHomogeneousDoublex5 throwing on purpuse!");
+  }
+
+  passStruct32BytesHomogeneousDoublex5_a0 = a0;
+  passStruct32BytesHomogeneousDoublex5_a1 = a1;
+  passStruct32BytesHomogeneousDoublex5_a2 = a2;
+  passStruct32BytesHomogeneousDoublex5_a3 = a3;
+  passStruct32BytesHomogeneousDoublex5_a4 = a4;
+
+  final result = passStruct32BytesHomogeneousDoublex5CalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void passStruct32BytesHomogeneousDoublex5AfterCallback() {
+  final result = passStruct32BytesHomogeneousDoublex5CalculateResult();
+
+  print("after callback result = $result");
+
+  Expect.approxEquals(10.0, result);
+}
+
+typedef PassStruct40BytesHomogeneousDoubleType = Double Function(
+    Struct40BytesHomogeneousDouble);
+
+// Global variables to be able to test inputs after callback returned.
+Struct40BytesHomogeneousDouble passStruct40BytesHomogeneousDouble_a0 =
+    Struct40BytesHomogeneousDouble();
+
+// Result variable also global, so we can delete it after the callback.
+double passStruct40BytesHomogeneousDoubleResult = 0.0;
+
+double passStruct40BytesHomogeneousDoubleCalculateResult() {
+  double result = 0;
+
+  result += passStruct40BytesHomogeneousDouble_a0.a0;
+  result += passStruct40BytesHomogeneousDouble_a0.a1;
+  result += passStruct40BytesHomogeneousDouble_a0.a2;
+  result += passStruct40BytesHomogeneousDouble_a0.a3;
+  result += passStruct40BytesHomogeneousDouble_a0.a4;
+
+  passStruct40BytesHomogeneousDoubleResult = result;
+
+  return result;
+}
+
+/// Argument too big to go into FPU registers in arm64.
+double passStruct40BytesHomogeneousDouble(Struct40BytesHomogeneousDouble a0) {
+  print("passStruct40BytesHomogeneousDouble(${a0})");
+
+  // In legacy mode, possibly return null.
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0.a0 == 42 || a0.a0 == 84) {
+    print("throwing!");
+    throw Exception("PassStruct40BytesHomogeneousDouble throwing on purpuse!");
+  }
+
+  passStruct40BytesHomogeneousDouble_a0 = a0;
+
+  final result = passStruct40BytesHomogeneousDoubleCalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void passStruct40BytesHomogeneousDoubleAfterCallback() {
+  final result = passStruct40BytesHomogeneousDoubleCalculateResult();
+
+  print("after callback result = $result");
+
+  Expect.approxEquals(-3.0, result);
+}
+
+typedef PassStruct1024BytesHomogeneousUint64Type = Uint64 Function(
+    Struct1024BytesHomogeneousUint64);
+
+// Global variables to be able to test inputs after callback returned.
+Struct1024BytesHomogeneousUint64 passStruct1024BytesHomogeneousUint64_a0 =
+    Struct1024BytesHomogeneousUint64();
+
+// Result variable also global, so we can delete it after the callback.
+int passStruct1024BytesHomogeneousUint64Result = 0;
+
+int passStruct1024BytesHomogeneousUint64CalculateResult() {
+  int result = 0;
+
+  result += passStruct1024BytesHomogeneousUint64_a0.a0;
+  result += passStruct1024BytesHomogeneousUint64_a0.a1;
+  result += passStruct1024BytesHomogeneousUint64_a0.a2;
+  result += passStruct1024BytesHomogeneousUint64_a0.a3;
+  result += passStruct1024BytesHomogeneousUint64_a0.a4;
+  result += passStruct1024BytesHomogeneousUint64_a0.a5;
+  result += passStruct1024BytesHomogeneousUint64_a0.a6;
+  result += passStruct1024BytesHomogeneousUint64_a0.a7;
+  result += passStruct1024BytesHomogeneousUint64_a0.a8;
+  result += passStruct1024BytesHomogeneousUint64_a0.a9;
+  result += passStruct1024BytesHomogeneousUint64_a0.a10;
+  result += passStruct1024BytesHomogeneousUint64_a0.a11;
+  result += passStruct1024BytesHomogeneousUint64_a0.a12;
+  result += passStruct1024BytesHomogeneousUint64_a0.a13;
+  result += passStruct1024BytesHomogeneousUint64_a0.a14;
+  result += passStruct1024BytesHomogeneousUint64_a0.a15;
+  result += passStruct1024BytesHomogeneousUint64_a0.a16;
+  result += passStruct1024BytesHomogeneousUint64_a0.a17;
+  result += passStruct1024BytesHomogeneousUint64_a0.a18;
+  result += passStruct1024BytesHomogeneousUint64_a0.a19;
+  result += passStruct1024BytesHomogeneousUint64_a0.a20;
+  result += passStruct1024BytesHomogeneousUint64_a0.a21;
+  result += passStruct1024BytesHomogeneousUint64_a0.a22;
+  result += passStruct1024BytesHomogeneousUint64_a0.a23;
+  result += passStruct1024BytesHomogeneousUint64_a0.a24;
+  result += passStruct1024BytesHomogeneousUint64_a0.a25;
+  result += passStruct1024BytesHomogeneousUint64_a0.a26;
+  result += passStruct1024BytesHomogeneousUint64_a0.a27;
+  result += passStruct1024BytesHomogeneousUint64_a0.a28;
+  result += passStruct1024BytesHomogeneousUint64_a0.a29;
+  result += passStruct1024BytesHomogeneousUint64_a0.a30;
+  result += passStruct1024BytesHomogeneousUint64_a0.a31;
+  result += passStruct1024BytesHomogeneousUint64_a0.a32;
+  result += passStruct1024BytesHomogeneousUint64_a0.a33;
+  result += passStruct1024BytesHomogeneousUint64_a0.a34;
+  result += passStruct1024BytesHomogeneousUint64_a0.a35;
+  result += passStruct1024BytesHomogeneousUint64_a0.a36;
+  result += passStruct1024BytesHomogeneousUint64_a0.a37;
+  result += passStruct1024BytesHomogeneousUint64_a0.a38;
+  result += passStruct1024BytesHomogeneousUint64_a0.a39;
+  result += passStruct1024BytesHomogeneousUint64_a0.a40;
+  result += passStruct1024BytesHomogeneousUint64_a0.a41;
+  result += passStruct1024BytesHomogeneousUint64_a0.a42;
+  result += passStruct1024BytesHomogeneousUint64_a0.a43;
+  result += passStruct1024BytesHomogeneousUint64_a0.a44;
+  result += passStruct1024BytesHomogeneousUint64_a0.a45;
+  result += passStruct1024BytesHomogeneousUint64_a0.a46;
+  result += passStruct1024BytesHomogeneousUint64_a0.a47;
+  result += passStruct1024BytesHomogeneousUint64_a0.a48;
+  result += passStruct1024BytesHomogeneousUint64_a0.a49;
+  result += passStruct1024BytesHomogeneousUint64_a0.a50;
+  result += passStruct1024BytesHomogeneousUint64_a0.a51;
+  result += passStruct1024BytesHomogeneousUint64_a0.a52;
+  result += passStruct1024BytesHomogeneousUint64_a0.a53;
+  result += passStruct1024BytesHomogeneousUint64_a0.a54;
+  result += passStruct1024BytesHomogeneousUint64_a0.a55;
+  result += passStruct1024BytesHomogeneousUint64_a0.a56;
+  result += passStruct1024BytesHomogeneousUint64_a0.a57;
+  result += passStruct1024BytesHomogeneousUint64_a0.a58;
+  result += passStruct1024BytesHomogeneousUint64_a0.a59;
+  result += passStruct1024BytesHomogeneousUint64_a0.a60;
+  result += passStruct1024BytesHomogeneousUint64_a0.a61;
+  result += passStruct1024BytesHomogeneousUint64_a0.a62;
+  result += passStruct1024BytesHomogeneousUint64_a0.a63;
+  result += passStruct1024BytesHomogeneousUint64_a0.a64;
+  result += passStruct1024BytesHomogeneousUint64_a0.a65;
+  result += passStruct1024BytesHomogeneousUint64_a0.a66;
+  result += passStruct1024BytesHomogeneousUint64_a0.a67;
+  result += passStruct1024BytesHomogeneousUint64_a0.a68;
+  result += passStruct1024BytesHomogeneousUint64_a0.a69;
+  result += passStruct1024BytesHomogeneousUint64_a0.a70;
+  result += passStruct1024BytesHomogeneousUint64_a0.a71;
+  result += passStruct1024BytesHomogeneousUint64_a0.a72;
+  result += passStruct1024BytesHomogeneousUint64_a0.a73;
+  result += passStruct1024BytesHomogeneousUint64_a0.a74;
+  result += passStruct1024BytesHomogeneousUint64_a0.a75;
+  result += passStruct1024BytesHomogeneousUint64_a0.a76;
+  result += passStruct1024BytesHomogeneousUint64_a0.a77;
+  result += passStruct1024BytesHomogeneousUint64_a0.a78;
+  result += passStruct1024BytesHomogeneousUint64_a0.a79;
+  result += passStruct1024BytesHomogeneousUint64_a0.a80;
+  result += passStruct1024BytesHomogeneousUint64_a0.a81;
+  result += passStruct1024BytesHomogeneousUint64_a0.a82;
+  result += passStruct1024BytesHomogeneousUint64_a0.a83;
+  result += passStruct1024BytesHomogeneousUint64_a0.a84;
+  result += passStruct1024BytesHomogeneousUint64_a0.a85;
+  result += passStruct1024BytesHomogeneousUint64_a0.a86;
+  result += passStruct1024BytesHomogeneousUint64_a0.a87;
+  result += passStruct1024BytesHomogeneousUint64_a0.a88;
+  result += passStruct1024BytesHomogeneousUint64_a0.a89;
+  result += passStruct1024BytesHomogeneousUint64_a0.a90;
+  result += passStruct1024BytesHomogeneousUint64_a0.a91;
+  result += passStruct1024BytesHomogeneousUint64_a0.a92;
+  result += passStruct1024BytesHomogeneousUint64_a0.a93;
+  result += passStruct1024BytesHomogeneousUint64_a0.a94;
+  result += passStruct1024BytesHomogeneousUint64_a0.a95;
+  result += passStruct1024BytesHomogeneousUint64_a0.a96;
+  result += passStruct1024BytesHomogeneousUint64_a0.a97;
+  result += passStruct1024BytesHomogeneousUint64_a0.a98;
+  result += passStruct1024BytesHomogeneousUint64_a0.a99;
+  result += passStruct1024BytesHomogeneousUint64_a0.a100;
+  result += passStruct1024BytesHomogeneousUint64_a0.a101;
+  result += passStruct1024BytesHomogeneousUint64_a0.a102;
+  result += passStruct1024BytesHomogeneousUint64_a0.a103;
+  result += passStruct1024BytesHomogeneousUint64_a0.a104;
+  result += passStruct1024BytesHomogeneousUint64_a0.a105;
+  result += passStruct1024BytesHomogeneousUint64_a0.a106;
+  result += passStruct1024BytesHomogeneousUint64_a0.a107;
+  result += passStruct1024BytesHomogeneousUint64_a0.a108;
+  result += passStruct1024BytesHomogeneousUint64_a0.a109;
+  result += passStruct1024BytesHomogeneousUint64_a0.a110;
+  result += passStruct1024BytesHomogeneousUint64_a0.a111;
+  result += passStruct1024BytesHomogeneousUint64_a0.a112;
+  result += passStruct1024BytesHomogeneousUint64_a0.a113;
+  result += passStruct1024BytesHomogeneousUint64_a0.a114;
+  result += passStruct1024BytesHomogeneousUint64_a0.a115;
+  result += passStruct1024BytesHomogeneousUint64_a0.a116;
+  result += passStruct1024BytesHomogeneousUint64_a0.a117;
+  result += passStruct1024BytesHomogeneousUint64_a0.a118;
+  result += passStruct1024BytesHomogeneousUint64_a0.a119;
+  result += passStruct1024BytesHomogeneousUint64_a0.a120;
+  result += passStruct1024BytesHomogeneousUint64_a0.a121;
+  result += passStruct1024BytesHomogeneousUint64_a0.a122;
+  result += passStruct1024BytesHomogeneousUint64_a0.a123;
+  result += passStruct1024BytesHomogeneousUint64_a0.a124;
+  result += passStruct1024BytesHomogeneousUint64_a0.a125;
+  result += passStruct1024BytesHomogeneousUint64_a0.a126;
+  result += passStruct1024BytesHomogeneousUint64_a0.a127;
+
+  passStruct1024BytesHomogeneousUint64Result = result;
+
+  return result;
+}
+
+/// Test 1kb struct.
+int passStruct1024BytesHomogeneousUint64(Struct1024BytesHomogeneousUint64 a0) {
+  print("passStruct1024BytesHomogeneousUint64(${a0})");
+
+  // In legacy mode, possibly return null.
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0.a0 == 42 || a0.a0 == 84) {
+    print("throwing!");
+    throw Exception(
+        "PassStruct1024BytesHomogeneousUint64 throwing on purpuse!");
+  }
+
+  passStruct1024BytesHomogeneousUint64_a0 = a0;
+
+  final result = passStruct1024BytesHomogeneousUint64CalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void passStruct1024BytesHomogeneousUint64AfterCallback() {
+  final result = passStruct1024BytesHomogeneousUint64CalculateResult();
+
+  print("after callback result = $result");
+
+  Expect.equals(8256, result);
+}
+
+typedef PassFloatStruct16BytesHomogeneousFloatFloatStruct1Type = Float Function(
+    Float,
+    Struct16BytesHomogeneousFloat,
+    Float,
+    Struct16BytesHomogeneousFloat,
+    Float,
+    Struct16BytesHomogeneousFloat,
+    Float,
+    Struct16BytesHomogeneousFloat,
+    Float);
+
+// Global variables to be able to test inputs after callback returned.
+double passFloatStruct16BytesHomogeneousFloatFloatStruct1_a0 = 0.0;
+Struct16BytesHomogeneousFloat
+    passFloatStruct16BytesHomogeneousFloatFloatStruct1_a1 =
+    Struct16BytesHomogeneousFloat();
+double passFloatStruct16BytesHomogeneousFloatFloatStruct1_a2 = 0.0;
+Struct16BytesHomogeneousFloat
+    passFloatStruct16BytesHomogeneousFloatFloatStruct1_a3 =
+    Struct16BytesHomogeneousFloat();
+double passFloatStruct16BytesHomogeneousFloatFloatStruct1_a4 = 0.0;
+Struct16BytesHomogeneousFloat
+    passFloatStruct16BytesHomogeneousFloatFloatStruct1_a5 =
+    Struct16BytesHomogeneousFloat();
+double passFloatStruct16BytesHomogeneousFloatFloatStruct1_a6 = 0.0;
+Struct16BytesHomogeneousFloat
+    passFloatStruct16BytesHomogeneousFloatFloatStruct1_a7 =
+    Struct16BytesHomogeneousFloat();
+double passFloatStruct16BytesHomogeneousFloatFloatStruct1_a8 = 0.0;
+
+// Result variable also global, so we can delete it after the callback.
+double passFloatStruct16BytesHomogeneousFloatFloatStruct1Result = 0.0;
+
+double passFloatStruct16BytesHomogeneousFloatFloatStruct1CalculateResult() {
+  double result = 0;
+
+  result += passFloatStruct16BytesHomogeneousFloatFloatStruct1_a0;
+  result += passFloatStruct16BytesHomogeneousFloatFloatStruct1_a1.a0;
+  result += passFloatStruct16BytesHomogeneousFloatFloatStruct1_a1.a1;
+  result += passFloatStruct16BytesHomogeneousFloatFloatStruct1_a1.a2;
+  result += passFloatStruct16BytesHomogeneousFloatFloatStruct1_a1.a3;
+  result += passFloatStruct16BytesHomogeneousFloatFloatStruct1_a2;
+  result += passFloatStruct16BytesHomogeneousFloatFloatStruct1_a3.a0;
+  result += passFloatStruct16BytesHomogeneousFloatFloatStruct1_a3.a1;
+  result += passFloatStruct16BytesHomogeneousFloatFloatStruct1_a3.a2;
+  result += passFloatStruct16BytesHomogeneousFloatFloatStruct1_a3.a3;
+  result += passFloatStruct16BytesHomogeneousFloatFloatStruct1_a4;
+  result += passFloatStruct16BytesHomogeneousFloatFloatStruct1_a5.a0;
+  result += passFloatStruct16BytesHomogeneousFloatFloatStruct1_a5.a1;
+  result += passFloatStruct16BytesHomogeneousFloatFloatStruct1_a5.a2;
+  result += passFloatStruct16BytesHomogeneousFloatFloatStruct1_a5.a3;
+  result += passFloatStruct16BytesHomogeneousFloatFloatStruct1_a6;
+  result += passFloatStruct16BytesHomogeneousFloatFloatStruct1_a7.a0;
+  result += passFloatStruct16BytesHomogeneousFloatFloatStruct1_a7.a1;
+  result += passFloatStruct16BytesHomogeneousFloatFloatStruct1_a7.a2;
+  result += passFloatStruct16BytesHomogeneousFloatFloatStruct1_a7.a3;
+  result += passFloatStruct16BytesHomogeneousFloatFloatStruct1_a8;
+
+  passFloatStruct16BytesHomogeneousFloatFloatStruct1Result = result;
+
+  return result;
+}
+
+/// Tests the alignment of structs in FPU registers and backfilling.
+double passFloatStruct16BytesHomogeneousFloatFloatStruct1(
+    double a0,
+    Struct16BytesHomogeneousFloat a1,
+    double a2,
+    Struct16BytesHomogeneousFloat a3,
+    double a4,
+    Struct16BytesHomogeneousFloat a5,
+    double a6,
+    Struct16BytesHomogeneousFloat a7,
+    double a8) {
+  print(
+      "passFloatStruct16BytesHomogeneousFloatFloatStruct1(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5}, ${a6}, ${a7}, ${a8})");
+
+  // In legacy mode, possibly return null.
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0 == 42 || a0 == 84) {
+    print("throwing!");
+    throw Exception(
+        "PassFloatStruct16BytesHomogeneousFloatFloatStruct1 throwing on purpuse!");
+  }
+
+  passFloatStruct16BytesHomogeneousFloatFloatStruct1_a0 = a0;
+  passFloatStruct16BytesHomogeneousFloatFloatStruct1_a1 = a1;
+  passFloatStruct16BytesHomogeneousFloatFloatStruct1_a2 = a2;
+  passFloatStruct16BytesHomogeneousFloatFloatStruct1_a3 = a3;
+  passFloatStruct16BytesHomogeneousFloatFloatStruct1_a4 = a4;
+  passFloatStruct16BytesHomogeneousFloatFloatStruct1_a5 = a5;
+  passFloatStruct16BytesHomogeneousFloatFloatStruct1_a6 = a6;
+  passFloatStruct16BytesHomogeneousFloatFloatStruct1_a7 = a7;
+  passFloatStruct16BytesHomogeneousFloatFloatStruct1_a8 = a8;
+
+  final result =
+      passFloatStruct16BytesHomogeneousFloatFloatStruct1CalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void passFloatStruct16BytesHomogeneousFloatFloatStruct1AfterCallback() {
+  final result =
+      passFloatStruct16BytesHomogeneousFloatFloatStruct1CalculateResult();
+
+  print("after callback result = $result");
+
+  Expect.approxEquals(-11.0, result);
+}
+
+typedef PassFloatStruct32BytesHomogeneousDoubleFloatStructType
+    = Double Function(
+        Float,
+        Struct32BytesHomogeneousDouble,
+        Float,
+        Struct32BytesHomogeneousDouble,
+        Float,
+        Struct32BytesHomogeneousDouble,
+        Float,
+        Struct32BytesHomogeneousDouble,
+        Float);
+
+// Global variables to be able to test inputs after callback returned.
+double passFloatStruct32BytesHomogeneousDoubleFloatStruct_a0 = 0.0;
+Struct32BytesHomogeneousDouble
+    passFloatStruct32BytesHomogeneousDoubleFloatStruct_a1 =
+    Struct32BytesHomogeneousDouble();
+double passFloatStruct32BytesHomogeneousDoubleFloatStruct_a2 = 0.0;
+Struct32BytesHomogeneousDouble
+    passFloatStruct32BytesHomogeneousDoubleFloatStruct_a3 =
+    Struct32BytesHomogeneousDouble();
+double passFloatStruct32BytesHomogeneousDoubleFloatStruct_a4 = 0.0;
+Struct32BytesHomogeneousDouble
+    passFloatStruct32BytesHomogeneousDoubleFloatStruct_a5 =
+    Struct32BytesHomogeneousDouble();
+double passFloatStruct32BytesHomogeneousDoubleFloatStruct_a6 = 0.0;
+Struct32BytesHomogeneousDouble
+    passFloatStruct32BytesHomogeneousDoubleFloatStruct_a7 =
+    Struct32BytesHomogeneousDouble();
+double passFloatStruct32BytesHomogeneousDoubleFloatStruct_a8 = 0.0;
+
+// Result variable also global, so we can delete it after the callback.
+double passFloatStruct32BytesHomogeneousDoubleFloatStructResult = 0.0;
+
+double passFloatStruct32BytesHomogeneousDoubleFloatStructCalculateResult() {
+  double result = 0;
+
+  result += passFloatStruct32BytesHomogeneousDoubleFloatStruct_a0;
+  result += passFloatStruct32BytesHomogeneousDoubleFloatStruct_a1.a0;
+  result += passFloatStruct32BytesHomogeneousDoubleFloatStruct_a1.a1;
+  result += passFloatStruct32BytesHomogeneousDoubleFloatStruct_a1.a2;
+  result += passFloatStruct32BytesHomogeneousDoubleFloatStruct_a1.a3;
+  result += passFloatStruct32BytesHomogeneousDoubleFloatStruct_a2;
+  result += passFloatStruct32BytesHomogeneousDoubleFloatStruct_a3.a0;
+  result += passFloatStruct32BytesHomogeneousDoubleFloatStruct_a3.a1;
+  result += passFloatStruct32BytesHomogeneousDoubleFloatStruct_a3.a2;
+  result += passFloatStruct32BytesHomogeneousDoubleFloatStruct_a3.a3;
+  result += passFloatStruct32BytesHomogeneousDoubleFloatStruct_a4;
+  result += passFloatStruct32BytesHomogeneousDoubleFloatStruct_a5.a0;
+  result += passFloatStruct32BytesHomogeneousDoubleFloatStruct_a5.a1;
+  result += passFloatStruct32BytesHomogeneousDoubleFloatStruct_a5.a2;
+  result += passFloatStruct32BytesHomogeneousDoubleFloatStruct_a5.a3;
+  result += passFloatStruct32BytesHomogeneousDoubleFloatStruct_a6;
+  result += passFloatStruct32BytesHomogeneousDoubleFloatStruct_a7.a0;
+  result += passFloatStruct32BytesHomogeneousDoubleFloatStruct_a7.a1;
+  result += passFloatStruct32BytesHomogeneousDoubleFloatStruct_a7.a2;
+  result += passFloatStruct32BytesHomogeneousDoubleFloatStruct_a7.a3;
+  result += passFloatStruct32BytesHomogeneousDoubleFloatStruct_a8;
+
+  passFloatStruct32BytesHomogeneousDoubleFloatStructResult = result;
+
+  return result;
+}
+
+/// Tests the alignment of structs in FPU registers and backfilling.
+double passFloatStruct32BytesHomogeneousDoubleFloatStruct(
+    double a0,
+    Struct32BytesHomogeneousDouble a1,
+    double a2,
+    Struct32BytesHomogeneousDouble a3,
+    double a4,
+    Struct32BytesHomogeneousDouble a5,
+    double a6,
+    Struct32BytesHomogeneousDouble a7,
+    double a8) {
+  print(
+      "passFloatStruct32BytesHomogeneousDoubleFloatStruct(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5}, ${a6}, ${a7}, ${a8})");
+
+  // In legacy mode, possibly return null.
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0 == 42 || a0 == 84) {
+    print("throwing!");
+    throw Exception(
+        "PassFloatStruct32BytesHomogeneousDoubleFloatStruct throwing on purpuse!");
+  }
+
+  passFloatStruct32BytesHomogeneousDoubleFloatStruct_a0 = a0;
+  passFloatStruct32BytesHomogeneousDoubleFloatStruct_a1 = a1;
+  passFloatStruct32BytesHomogeneousDoubleFloatStruct_a2 = a2;
+  passFloatStruct32BytesHomogeneousDoubleFloatStruct_a3 = a3;
+  passFloatStruct32BytesHomogeneousDoubleFloatStruct_a4 = a4;
+  passFloatStruct32BytesHomogeneousDoubleFloatStruct_a5 = a5;
+  passFloatStruct32BytesHomogeneousDoubleFloatStruct_a6 = a6;
+  passFloatStruct32BytesHomogeneousDoubleFloatStruct_a7 = a7;
+  passFloatStruct32BytesHomogeneousDoubleFloatStruct_a8 = a8;
+
+  final result =
+      passFloatStruct32BytesHomogeneousDoubleFloatStructCalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void passFloatStruct32BytesHomogeneousDoubleFloatStructAfterCallback() {
+  final result =
+      passFloatStruct32BytesHomogeneousDoubleFloatStructCalculateResult();
+
+  print("after callback result = $result");
+
+  Expect.approxEquals(-11.0, result);
+}
+
+typedef PassInt8Struct16BytesMixedInt8Struct16BytesMixedInType
+    = Double Function(Int8, Struct16BytesMixed, Int8, Struct16BytesMixed, Int8,
+        Struct16BytesMixed, Int8, Struct16BytesMixed, Int8);
+
+// Global variables to be able to test inputs after callback returned.
+int passInt8Struct16BytesMixedInt8Struct16BytesMixedIn_a0 = 0;
+Struct16BytesMixed passInt8Struct16BytesMixedInt8Struct16BytesMixedIn_a1 =
+    Struct16BytesMixed();
+int passInt8Struct16BytesMixedInt8Struct16BytesMixedIn_a2 = 0;
+Struct16BytesMixed passInt8Struct16BytesMixedInt8Struct16BytesMixedIn_a3 =
+    Struct16BytesMixed();
+int passInt8Struct16BytesMixedInt8Struct16BytesMixedIn_a4 = 0;
+Struct16BytesMixed passInt8Struct16BytesMixedInt8Struct16BytesMixedIn_a5 =
+    Struct16BytesMixed();
+int passInt8Struct16BytesMixedInt8Struct16BytesMixedIn_a6 = 0;
+Struct16BytesMixed passInt8Struct16BytesMixedInt8Struct16BytesMixedIn_a7 =
+    Struct16BytesMixed();
+int passInt8Struct16BytesMixedInt8Struct16BytesMixedIn_a8 = 0;
+
+// Result variable also global, so we can delete it after the callback.
+double passInt8Struct16BytesMixedInt8Struct16BytesMixedInResult = 0.0;
+
+double passInt8Struct16BytesMixedInt8Struct16BytesMixedInCalculateResult() {
+  double result = 0;
+
+  result += passInt8Struct16BytesMixedInt8Struct16BytesMixedIn_a0;
+  result += passInt8Struct16BytesMixedInt8Struct16BytesMixedIn_a1.a0;
+  result += passInt8Struct16BytesMixedInt8Struct16BytesMixedIn_a1.a1;
+  result += passInt8Struct16BytesMixedInt8Struct16BytesMixedIn_a2;
+  result += passInt8Struct16BytesMixedInt8Struct16BytesMixedIn_a3.a0;
+  result += passInt8Struct16BytesMixedInt8Struct16BytesMixedIn_a3.a1;
+  result += passInt8Struct16BytesMixedInt8Struct16BytesMixedIn_a4;
+  result += passInt8Struct16BytesMixedInt8Struct16BytesMixedIn_a5.a0;
+  result += passInt8Struct16BytesMixedInt8Struct16BytesMixedIn_a5.a1;
+  result += passInt8Struct16BytesMixedInt8Struct16BytesMixedIn_a6;
+  result += passInt8Struct16BytesMixedInt8Struct16BytesMixedIn_a7.a0;
+  result += passInt8Struct16BytesMixedInt8Struct16BytesMixedIn_a7.a1;
+  result += passInt8Struct16BytesMixedInt8Struct16BytesMixedIn_a8;
+
+  passInt8Struct16BytesMixedInt8Struct16BytesMixedInResult = result;
+
+  return result;
+}
+
+/// Tests the alignment of structs in integers registers and on the stack.
+/// Arm32 aligns this struct at 8.
+/// Also, arm32 allocates the second struct partially in registers, partially
+/// on stack.
+/// Test backfilling of integer registers.
+double passInt8Struct16BytesMixedInt8Struct16BytesMixedIn(
+    int a0,
+    Struct16BytesMixed a1,
+    int a2,
+    Struct16BytesMixed a3,
+    int a4,
+    Struct16BytesMixed a5,
+    int a6,
+    Struct16BytesMixed a7,
+    int a8) {
+  print(
+      "passInt8Struct16BytesMixedInt8Struct16BytesMixedIn(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5}, ${a6}, ${a7}, ${a8})");
+
+  // In legacy mode, possibly return null.
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0 == 42 || a0 == 84) {
+    print("throwing!");
+    throw Exception(
+        "PassInt8Struct16BytesMixedInt8Struct16BytesMixedIn throwing on purpuse!");
+  }
+
+  passInt8Struct16BytesMixedInt8Struct16BytesMixedIn_a0 = a0;
+  passInt8Struct16BytesMixedInt8Struct16BytesMixedIn_a1 = a1;
+  passInt8Struct16BytesMixedInt8Struct16BytesMixedIn_a2 = a2;
+  passInt8Struct16BytesMixedInt8Struct16BytesMixedIn_a3 = a3;
+  passInt8Struct16BytesMixedInt8Struct16BytesMixedIn_a4 = a4;
+  passInt8Struct16BytesMixedInt8Struct16BytesMixedIn_a5 = a5;
+  passInt8Struct16BytesMixedInt8Struct16BytesMixedIn_a6 = a6;
+  passInt8Struct16BytesMixedInt8Struct16BytesMixedIn_a7 = a7;
+  passInt8Struct16BytesMixedInt8Struct16BytesMixedIn_a8 = a8;
+
+  final result =
+      passInt8Struct16BytesMixedInt8Struct16BytesMixedInCalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void passInt8Struct16BytesMixedInt8Struct16BytesMixedInAfterCallback() {
+  final result =
+      passInt8Struct16BytesMixedInt8Struct16BytesMixedInCalculateResult();
+
+  print("after callback result = $result");
+
+  Expect.approxEquals(-7.0, result);
+}
+
+typedef PassDoublex6Struct16BytesMixedx4Int32Type = Double Function(
+    Double,
+    Double,
+    Double,
+    Double,
+    Double,
+    Double,
+    Struct16BytesMixed,
+    Struct16BytesMixed,
+    Struct16BytesMixed,
+    Struct16BytesMixed,
+    Int32);
+
+// Global variables to be able to test inputs after callback returned.
+double passDoublex6Struct16BytesMixedx4Int32_a0 = 0.0;
+double passDoublex6Struct16BytesMixedx4Int32_a1 = 0.0;
+double passDoublex6Struct16BytesMixedx4Int32_a2 = 0.0;
+double passDoublex6Struct16BytesMixedx4Int32_a3 = 0.0;
+double passDoublex6Struct16BytesMixedx4Int32_a4 = 0.0;
+double passDoublex6Struct16BytesMixedx4Int32_a5 = 0.0;
+Struct16BytesMixed passDoublex6Struct16BytesMixedx4Int32_a6 =
+    Struct16BytesMixed();
+Struct16BytesMixed passDoublex6Struct16BytesMixedx4Int32_a7 =
+    Struct16BytesMixed();
+Struct16BytesMixed passDoublex6Struct16BytesMixedx4Int32_a8 =
+    Struct16BytesMixed();
+Struct16BytesMixed passDoublex6Struct16BytesMixedx4Int32_a9 =
+    Struct16BytesMixed();
+int passDoublex6Struct16BytesMixedx4Int32_a10 = 0;
+
+// Result variable also global, so we can delete it after the callback.
+double passDoublex6Struct16BytesMixedx4Int32Result = 0.0;
+
+double passDoublex6Struct16BytesMixedx4Int32CalculateResult() {
+  double result = 0;
+
+  result += passDoublex6Struct16BytesMixedx4Int32_a0;
+  result += passDoublex6Struct16BytesMixedx4Int32_a1;
+  result += passDoublex6Struct16BytesMixedx4Int32_a2;
+  result += passDoublex6Struct16BytesMixedx4Int32_a3;
+  result += passDoublex6Struct16BytesMixedx4Int32_a4;
+  result += passDoublex6Struct16BytesMixedx4Int32_a5;
+  result += passDoublex6Struct16BytesMixedx4Int32_a6.a0;
+  result += passDoublex6Struct16BytesMixedx4Int32_a6.a1;
+  result += passDoublex6Struct16BytesMixedx4Int32_a7.a0;
+  result += passDoublex6Struct16BytesMixedx4Int32_a7.a1;
+  result += passDoublex6Struct16BytesMixedx4Int32_a8.a0;
+  result += passDoublex6Struct16BytesMixedx4Int32_a8.a1;
+  result += passDoublex6Struct16BytesMixedx4Int32_a9.a0;
+  result += passDoublex6Struct16BytesMixedx4Int32_a9.a1;
+  result += passDoublex6Struct16BytesMixedx4Int32_a10;
+
+  passDoublex6Struct16BytesMixedx4Int32Result = result;
+
+  return result;
+}
+
+/// On Linux x64, it will exhaust xmm registers first, after 6 doubles and 2
+/// structs. The rest of the structs will go on the stack.
+/// The int will be backfilled into the int register.
+double passDoublex6Struct16BytesMixedx4Int32(
+    double a0,
+    double a1,
+    double a2,
+    double a3,
+    double a4,
+    double a5,
+    Struct16BytesMixed a6,
+    Struct16BytesMixed a7,
+    Struct16BytesMixed a8,
+    Struct16BytesMixed a9,
+    int a10) {
+  print(
+      "passDoublex6Struct16BytesMixedx4Int32(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5}, ${a6}, ${a7}, ${a8}, ${a9}, ${a10})");
+
+  // In legacy mode, possibly return null.
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0 == 42 || a0 == 84) {
+    print("throwing!");
+    throw Exception(
+        "PassDoublex6Struct16BytesMixedx4Int32 throwing on purpuse!");
+  }
+
+  passDoublex6Struct16BytesMixedx4Int32_a0 = a0;
+  passDoublex6Struct16BytesMixedx4Int32_a1 = a1;
+  passDoublex6Struct16BytesMixedx4Int32_a2 = a2;
+  passDoublex6Struct16BytesMixedx4Int32_a3 = a3;
+  passDoublex6Struct16BytesMixedx4Int32_a4 = a4;
+  passDoublex6Struct16BytesMixedx4Int32_a5 = a5;
+  passDoublex6Struct16BytesMixedx4Int32_a6 = a6;
+  passDoublex6Struct16BytesMixedx4Int32_a7 = a7;
+  passDoublex6Struct16BytesMixedx4Int32_a8 = a8;
+  passDoublex6Struct16BytesMixedx4Int32_a9 = a9;
+  passDoublex6Struct16BytesMixedx4Int32_a10 = a10;
+
+  final result = passDoublex6Struct16BytesMixedx4Int32CalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void passDoublex6Struct16BytesMixedx4Int32AfterCallback() {
+  final result = passDoublex6Struct16BytesMixedx4Int32CalculateResult();
+
+  print("after callback result = $result");
+
+  Expect.approxEquals(-8.0, result);
+}
+
+typedef PassInt32x4Struct16BytesMixedx4DoubleType = Double Function(
+    Int32,
+    Int32,
+    Int32,
+    Int32,
+    Struct16BytesMixed,
+    Struct16BytesMixed,
+    Struct16BytesMixed,
+    Struct16BytesMixed,
+    Double);
+
+// Global variables to be able to test inputs after callback returned.
+int passInt32x4Struct16BytesMixedx4Double_a0 = 0;
+int passInt32x4Struct16BytesMixedx4Double_a1 = 0;
+int passInt32x4Struct16BytesMixedx4Double_a2 = 0;
+int passInt32x4Struct16BytesMixedx4Double_a3 = 0;
+Struct16BytesMixed passInt32x4Struct16BytesMixedx4Double_a4 =
+    Struct16BytesMixed();
+Struct16BytesMixed passInt32x4Struct16BytesMixedx4Double_a5 =
+    Struct16BytesMixed();
+Struct16BytesMixed passInt32x4Struct16BytesMixedx4Double_a6 =
+    Struct16BytesMixed();
+Struct16BytesMixed passInt32x4Struct16BytesMixedx4Double_a7 =
+    Struct16BytesMixed();
+double passInt32x4Struct16BytesMixedx4Double_a8 = 0.0;
+
+// Result variable also global, so we can delete it after the callback.
+double passInt32x4Struct16BytesMixedx4DoubleResult = 0.0;
+
+double passInt32x4Struct16BytesMixedx4DoubleCalculateResult() {
+  double result = 0;
+
+  result += passInt32x4Struct16BytesMixedx4Double_a0;
+  result += passInt32x4Struct16BytesMixedx4Double_a1;
+  result += passInt32x4Struct16BytesMixedx4Double_a2;
+  result += passInt32x4Struct16BytesMixedx4Double_a3;
+  result += passInt32x4Struct16BytesMixedx4Double_a4.a0;
+  result += passInt32x4Struct16BytesMixedx4Double_a4.a1;
+  result += passInt32x4Struct16BytesMixedx4Double_a5.a0;
+  result += passInt32x4Struct16BytesMixedx4Double_a5.a1;
+  result += passInt32x4Struct16BytesMixedx4Double_a6.a0;
+  result += passInt32x4Struct16BytesMixedx4Double_a6.a1;
+  result += passInt32x4Struct16BytesMixedx4Double_a7.a0;
+  result += passInt32x4Struct16BytesMixedx4Double_a7.a1;
+  result += passInt32x4Struct16BytesMixedx4Double_a8;
+
+  passInt32x4Struct16BytesMixedx4DoubleResult = result;
+
+  return result;
+}
+
+/// On Linux x64, it will exhaust int registers first.
+/// The rest of the structs will go on the stack.
+/// The double will be backfilled into the xmm register.
+double passInt32x4Struct16BytesMixedx4Double(
+    int a0,
+    int a1,
+    int a2,
+    int a3,
+    Struct16BytesMixed a4,
+    Struct16BytesMixed a5,
+    Struct16BytesMixed a6,
+    Struct16BytesMixed a7,
+    double a8) {
+  print(
+      "passInt32x4Struct16BytesMixedx4Double(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5}, ${a6}, ${a7}, ${a8})");
+
+  // In legacy mode, possibly return null.
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0 == 42 || a0 == 84) {
+    print("throwing!");
+    throw Exception(
+        "PassInt32x4Struct16BytesMixedx4Double throwing on purpuse!");
+  }
+
+  passInt32x4Struct16BytesMixedx4Double_a0 = a0;
+  passInt32x4Struct16BytesMixedx4Double_a1 = a1;
+  passInt32x4Struct16BytesMixedx4Double_a2 = a2;
+  passInt32x4Struct16BytesMixedx4Double_a3 = a3;
+  passInt32x4Struct16BytesMixedx4Double_a4 = a4;
+  passInt32x4Struct16BytesMixedx4Double_a5 = a5;
+  passInt32x4Struct16BytesMixedx4Double_a6 = a6;
+  passInt32x4Struct16BytesMixedx4Double_a7 = a7;
+  passInt32x4Struct16BytesMixedx4Double_a8 = a8;
+
+  final result = passInt32x4Struct16BytesMixedx4DoubleCalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void passInt32x4Struct16BytesMixedx4DoubleAfterCallback() {
+  final result = passInt32x4Struct16BytesMixedx4DoubleCalculateResult();
+
+  print("after callback result = $result");
+
+  Expect.approxEquals(-7.0, result);
+}
+
+typedef PassStruct40BytesHomogeneousDoubleStruct4BytesHomoType
+    = Double Function(Struct40BytesHomogeneousDouble,
+        Struct4BytesHomogeneousInt16, Struct8BytesHomogeneousFloat);
+
+// Global variables to be able to test inputs after callback returned.
+Struct40BytesHomogeneousDouble
+    passStruct40BytesHomogeneousDoubleStruct4BytesHomo_a0 =
+    Struct40BytesHomogeneousDouble();
+Struct4BytesHomogeneousInt16
+    passStruct40BytesHomogeneousDoubleStruct4BytesHomo_a1 =
+    Struct4BytesHomogeneousInt16();
+Struct8BytesHomogeneousFloat
+    passStruct40BytesHomogeneousDoubleStruct4BytesHomo_a2 =
+    Struct8BytesHomogeneousFloat();
+
+// Result variable also global, so we can delete it after the callback.
+double passStruct40BytesHomogeneousDoubleStruct4BytesHomoResult = 0.0;
+
+double passStruct40BytesHomogeneousDoubleStruct4BytesHomoCalculateResult() {
+  double result = 0;
+
+  result += passStruct40BytesHomogeneousDoubleStruct4BytesHomo_a0.a0;
+  result += passStruct40BytesHomogeneousDoubleStruct4BytesHomo_a0.a1;
+  result += passStruct40BytesHomogeneousDoubleStruct4BytesHomo_a0.a2;
+  result += passStruct40BytesHomogeneousDoubleStruct4BytesHomo_a0.a3;
+  result += passStruct40BytesHomogeneousDoubleStruct4BytesHomo_a0.a4;
+  result += passStruct40BytesHomogeneousDoubleStruct4BytesHomo_a1.a0;
+  result += passStruct40BytesHomogeneousDoubleStruct4BytesHomo_a1.a1;
+  result += passStruct40BytesHomogeneousDoubleStruct4BytesHomo_a2.a0;
+  result += passStruct40BytesHomogeneousDoubleStruct4BytesHomo_a2.a1;
+
+  passStruct40BytesHomogeneousDoubleStruct4BytesHomoResult = result;
+
+  return result;
+}
+
+/// On various architectures, first struct is allocated on stack.
+/// Check that the other two arguments are allocated on registers.
+double passStruct40BytesHomogeneousDoubleStruct4BytesHomo(
+    Struct40BytesHomogeneousDouble a0,
+    Struct4BytesHomogeneousInt16 a1,
+    Struct8BytesHomogeneousFloat a2) {
+  print(
+      "passStruct40BytesHomogeneousDoubleStruct4BytesHomo(${a0}, ${a1}, ${a2})");
+
+  // In legacy mode, possibly return null.
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0.a0 == 42 || a0.a0 == 84) {
+    print("throwing!");
+    throw Exception(
+        "PassStruct40BytesHomogeneousDoubleStruct4BytesHomo throwing on purpuse!");
+  }
+
+  passStruct40BytesHomogeneousDoubleStruct4BytesHomo_a0 = a0;
+  passStruct40BytesHomogeneousDoubleStruct4BytesHomo_a1 = a1;
+  passStruct40BytesHomogeneousDoubleStruct4BytesHomo_a2 = a2;
+
+  final result =
+      passStruct40BytesHomogeneousDoubleStruct4BytesHomoCalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void passStruct40BytesHomogeneousDoubleStruct4BytesHomoAfterCallback() {
+  final result =
+      passStruct40BytesHomogeneousDoubleStruct4BytesHomoCalculateResult();
+
+  print("after callback result = $result");
+
+  Expect.approxEquals(-5.0, result);
+}
+
+typedef PassInt32x8Doublex8Int64Int8Struct1ByteIntInt64IntType
+    = Double Function(
+        Int32,
+        Int32,
+        Int32,
+        Int32,
+        Int32,
+        Int32,
+        Int32,
+        Int32,
+        Double,
+        Double,
+        Double,
+        Double,
+        Double,
+        Double,
+        Double,
+        Double,
+        Int64,
+        Int8,
+        Struct1ByteInt,
+        Int64,
+        Int8,
+        Struct4BytesHomogeneousInt16,
+        Int64,
+        Int8,
+        Struct8BytesInt,
+        Int64,
+        Int8,
+        Struct8BytesHomogeneousFloat,
+        Int64,
+        Int8,
+        Struct8BytesMixed,
+        Int64,
+        Int8,
+        StructAlignmentInt16,
+        Int64,
+        Int8,
+        StructAlignmentInt32,
+        Int64,
+        Int8,
+        StructAlignmentInt64);
+
+// Global variables to be able to test inputs after callback returned.
+int passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a0 = 0;
+int passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a1 = 0;
+int passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a2 = 0;
+int passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a3 = 0;
+int passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a4 = 0;
+int passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a5 = 0;
+int passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a6 = 0;
+int passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a7 = 0;
+double passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a8 = 0.0;
+double passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a9 = 0.0;
+double passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a10 = 0.0;
+double passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a11 = 0.0;
+double passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a12 = 0.0;
+double passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a13 = 0.0;
+double passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a14 = 0.0;
+double passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a15 = 0.0;
+int passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a16 = 0;
+int passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a17 = 0;
+Struct1ByteInt passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a18 =
+    Struct1ByteInt();
+int passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a19 = 0;
+int passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a20 = 0;
+Struct4BytesHomogeneousInt16
+    passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a21 =
+    Struct4BytesHomogeneousInt16();
+int passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a22 = 0;
+int passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a23 = 0;
+Struct8BytesInt passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a24 =
+    Struct8BytesInt();
+int passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a25 = 0;
+int passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a26 = 0;
+Struct8BytesHomogeneousFloat
+    passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a27 =
+    Struct8BytesHomogeneousFloat();
+int passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a28 = 0;
+int passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a29 = 0;
+Struct8BytesMixed passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a30 =
+    Struct8BytesMixed();
+int passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a31 = 0;
+int passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a32 = 0;
+StructAlignmentInt16 passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a33 =
+    StructAlignmentInt16();
+int passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a34 = 0;
+int passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a35 = 0;
+StructAlignmentInt32 passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a36 =
+    StructAlignmentInt32();
+int passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a37 = 0;
+int passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a38 = 0;
+StructAlignmentInt64 passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a39 =
+    StructAlignmentInt64();
+
+// Result variable also global, so we can delete it after the callback.
+double passInt32x8Doublex8Int64Int8Struct1ByteIntInt64IntResult = 0.0;
+
+double passInt32x8Doublex8Int64Int8Struct1ByteIntInt64IntCalculateResult() {
+  double result = 0;
+
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a0;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a1;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a2;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a3;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a4;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a5;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a6;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a7;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a8;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a9;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a10;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a11;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a12;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a13;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a14;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a15;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a16;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a17;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a18.a0;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a19;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a20;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a21.a0;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a21.a1;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a22;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a23;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a24.a0;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a24.a1;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a24.a2;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a25;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a26;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a27.a0;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a27.a1;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a28;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a29;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a30.a0;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a30.a1;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a30.a2;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a31;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a32;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a33.a0;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a33.a1;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a33.a2;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a34;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a35;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a36.a0;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a36.a1;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a36.a2;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a37;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a38;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a39.a0;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a39.a1;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a39.a2;
+
+  passInt32x8Doublex8Int64Int8Struct1ByteIntInt64IntResult = result;
+
+  return result;
+}
+
+/// Test alignment and padding of 16 byte int within struct.
+double passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int(
+    int a0,
+    int a1,
+    int a2,
+    int a3,
+    int a4,
+    int a5,
+    int a6,
+    int a7,
+    double a8,
+    double a9,
+    double a10,
+    double a11,
+    double a12,
+    double a13,
+    double a14,
+    double a15,
+    int a16,
+    int a17,
+    Struct1ByteInt a18,
+    int a19,
+    int a20,
+    Struct4BytesHomogeneousInt16 a21,
+    int a22,
+    int a23,
+    Struct8BytesInt a24,
+    int a25,
+    int a26,
+    Struct8BytesHomogeneousFloat a27,
+    int a28,
+    int a29,
+    Struct8BytesMixed a30,
+    int a31,
+    int a32,
+    StructAlignmentInt16 a33,
+    int a34,
+    int a35,
+    StructAlignmentInt32 a36,
+    int a37,
+    int a38,
+    StructAlignmentInt64 a39) {
+  print(
+      "passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5}, ${a6}, ${a7}, ${a8}, ${a9}, ${a10}, ${a11}, ${a12}, ${a13}, ${a14}, ${a15}, ${a16}, ${a17}, ${a18}, ${a19}, ${a20}, ${a21}, ${a22}, ${a23}, ${a24}, ${a25}, ${a26}, ${a27}, ${a28}, ${a29}, ${a30}, ${a31}, ${a32}, ${a33}, ${a34}, ${a35}, ${a36}, ${a37}, ${a38}, ${a39})");
+
+  // In legacy mode, possibly return null.
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0 == 42 || a0 == 84) {
+    print("throwing!");
+    throw Exception(
+        "PassInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int throwing on purpuse!");
+  }
+
+  passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a0 = a0;
+  passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a1 = a1;
+  passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a2 = a2;
+  passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a3 = a3;
+  passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a4 = a4;
+  passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a5 = a5;
+  passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a6 = a6;
+  passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a7 = a7;
+  passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a8 = a8;
+  passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a9 = a9;
+  passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a10 = a10;
+  passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a11 = a11;
+  passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a12 = a12;
+  passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a13 = a13;
+  passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a14 = a14;
+  passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a15 = a15;
+  passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a16 = a16;
+  passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a17 = a17;
+  passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a18 = a18;
+  passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a19 = a19;
+  passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a20 = a20;
+  passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a21 = a21;
+  passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a22 = a22;
+  passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a23 = a23;
+  passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a24 = a24;
+  passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a25 = a25;
+  passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a26 = a26;
+  passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a27 = a27;
+  passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a28 = a28;
+  passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a29 = a29;
+  passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a30 = a30;
+  passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a31 = a31;
+  passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a32 = a32;
+  passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a33 = a33;
+  passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a34 = a34;
+  passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a35 = a35;
+  passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a36 = a36;
+  passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a37 = a37;
+  passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a38 = a38;
+  passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a39 = a39;
+
+  final result =
+      passInt32x8Doublex8Int64Int8Struct1ByteIntInt64IntCalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void passInt32x8Doublex8Int64Int8Struct1ByteIntInt64IntAfterCallback() {
+  final result =
+      passInt32x8Doublex8Int64Int8Struct1ByteIntInt64IntCalculateResult();
+
+  print("after callback result = $result");
+
+  Expect.approxEquals(26.0, result);
+}
+
+typedef PassStructAlignmentInt16Type = Int64 Function(StructAlignmentInt16);
+
+// Global variables to be able to test inputs after callback returned.
+StructAlignmentInt16 passStructAlignmentInt16_a0 = StructAlignmentInt16();
+
+// Result variable also global, so we can delete it after the callback.
+int passStructAlignmentInt16Result = 0;
+
+int passStructAlignmentInt16CalculateResult() {
+  int result = 0;
+
+  result += passStructAlignmentInt16_a0.a0;
+  result += passStructAlignmentInt16_a0.a1;
+  result += passStructAlignmentInt16_a0.a2;
+
+  passStructAlignmentInt16Result = result;
+
+  return result;
+}
+
+/// Test alignment and padding of 16 byte int within struct.
+int passStructAlignmentInt16(StructAlignmentInt16 a0) {
+  print("passStructAlignmentInt16(${a0})");
+
+  // In legacy mode, possibly return null.
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0.a0 == 42 || a0.a0 == 84) {
+    print("throwing!");
+    throw Exception("PassStructAlignmentInt16 throwing on purpuse!");
+  }
+
+  passStructAlignmentInt16_a0 = a0;
+
+  final result = passStructAlignmentInt16CalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void passStructAlignmentInt16AfterCallback() {
+  final result = passStructAlignmentInt16CalculateResult();
+
+  print("after callback result = $result");
+
+  Expect.equals(-2, result);
+}
+
+typedef PassStructAlignmentInt32Type = Int64 Function(StructAlignmentInt32);
+
+// Global variables to be able to test inputs after callback returned.
+StructAlignmentInt32 passStructAlignmentInt32_a0 = StructAlignmentInt32();
+
+// Result variable also global, so we can delete it after the callback.
+int passStructAlignmentInt32Result = 0;
+
+int passStructAlignmentInt32CalculateResult() {
+  int result = 0;
+
+  result += passStructAlignmentInt32_a0.a0;
+  result += passStructAlignmentInt32_a0.a1;
+  result += passStructAlignmentInt32_a0.a2;
+
+  passStructAlignmentInt32Result = result;
+
+  return result;
+}
+
+/// Test alignment and padding of 32 byte int within struct.
+int passStructAlignmentInt32(StructAlignmentInt32 a0) {
+  print("passStructAlignmentInt32(${a0})");
+
+  // In legacy mode, possibly return null.
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0.a0 == 42 || a0.a0 == 84) {
+    print("throwing!");
+    throw Exception("PassStructAlignmentInt32 throwing on purpuse!");
+  }
+
+  passStructAlignmentInt32_a0 = a0;
+
+  final result = passStructAlignmentInt32CalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void passStructAlignmentInt32AfterCallback() {
+  final result = passStructAlignmentInt32CalculateResult();
+
+  print("after callback result = $result");
+
+  Expect.equals(-2, result);
+}
+
+typedef PassStructAlignmentInt64Type = Int64 Function(StructAlignmentInt64);
+
+// Global variables to be able to test inputs after callback returned.
+StructAlignmentInt64 passStructAlignmentInt64_a0 = StructAlignmentInt64();
+
+// Result variable also global, so we can delete it after the callback.
+int passStructAlignmentInt64Result = 0;
+
+int passStructAlignmentInt64CalculateResult() {
+  int result = 0;
+
+  result += passStructAlignmentInt64_a0.a0;
+  result += passStructAlignmentInt64_a0.a1;
+  result += passStructAlignmentInt64_a0.a2;
+
+  passStructAlignmentInt64Result = result;
+
+  return result;
+}
+
+/// Test alignment and padding of 64 byte int within struct.
+int passStructAlignmentInt64(StructAlignmentInt64 a0) {
+  print("passStructAlignmentInt64(${a0})");
+
+  // In legacy mode, possibly return null.
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0.a0 == 42 || a0.a0 == 84) {
+    print("throwing!");
+    throw Exception("PassStructAlignmentInt64 throwing on purpuse!");
+  }
+
+  passStructAlignmentInt64_a0 = a0;
+
+  final result = passStructAlignmentInt64CalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void passStructAlignmentInt64AfterCallback() {
+  final result = passStructAlignmentInt64CalculateResult();
+
+  print("after callback result = $result");
+
+  Expect.equals(-2, result);
+}
+
+typedef ReturnStruct1ByteIntType = Struct1ByteInt Function(Int8);
+
+// Global variables to be able to test inputs after callback returned.
+int returnStruct1ByteInt_a0 = 0;
+
+// Result variable also global, so we can delete it after the callback.
+Struct1ByteInt returnStruct1ByteIntResult = Struct1ByteInt();
+
+Struct1ByteInt returnStruct1ByteIntCalculateResult() {
+  Struct1ByteInt result = allocate<Struct1ByteInt>().ref;
+
+  result.a0 = returnStruct1ByteInt_a0;
+
+  returnStruct1ByteIntResult = result;
+
+  return result;
+}
+
+/// Smallest struct with data.
+Struct1ByteInt returnStruct1ByteInt(int a0) {
+  print("returnStruct1ByteInt(${a0})");
+
+  // In legacy mode, possibly return null.
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0 == 42 || a0 == 84) {
+    print("throwing!");
+    throw Exception("ReturnStruct1ByteInt throwing on purpuse!");
+  }
+
+  returnStruct1ByteInt_a0 = a0;
+
+  final result = returnStruct1ByteIntCalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void returnStruct1ByteIntAfterCallback() {
+  free(returnStruct1ByteIntResult.addressOf);
+
+  final result = returnStruct1ByteIntCalculateResult();
+
+  print("after callback result = $result");
+
+  free(returnStruct1ByteIntResult.addressOf);
+}
+
+typedef ReturnStruct3BytesHomogeneousUint8Type = Struct3BytesHomogeneousUint8
+    Function(Uint8, Uint8, Uint8);
+
+// Global variables to be able to test inputs after callback returned.
+int returnStruct3BytesHomogeneousUint8_a0 = 0;
+int returnStruct3BytesHomogeneousUint8_a1 = 0;
+int returnStruct3BytesHomogeneousUint8_a2 = 0;
+
+// Result variable also global, so we can delete it after the callback.
+Struct3BytesHomogeneousUint8 returnStruct3BytesHomogeneousUint8Result =
+    Struct3BytesHomogeneousUint8();
+
+Struct3BytesHomogeneousUint8
+    returnStruct3BytesHomogeneousUint8CalculateResult() {
+  Struct3BytesHomogeneousUint8 result =
+      allocate<Struct3BytesHomogeneousUint8>().ref;
+
+  result.a0 = returnStruct3BytesHomogeneousUint8_a0;
+  result.a1 = returnStruct3BytesHomogeneousUint8_a1;
+  result.a2 = returnStruct3BytesHomogeneousUint8_a2;
+
+  returnStruct3BytesHomogeneousUint8Result = result;
+
+  return result;
+}
+
+/// Smaller than word size return value on all architectures.
+Struct3BytesHomogeneousUint8 returnStruct3BytesHomogeneousUint8(
+    int a0, int a1, int a2) {
+  print("returnStruct3BytesHomogeneousUint8(${a0}, ${a1}, ${a2})");
+
+  // In legacy mode, possibly return null.
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0 == 42 || a0 == 84) {
+    print("throwing!");
+    throw Exception("ReturnStruct3BytesHomogeneousUint8 throwing on purpuse!");
+  }
+
+  returnStruct3BytesHomogeneousUint8_a0 = a0;
+  returnStruct3BytesHomogeneousUint8_a1 = a1;
+  returnStruct3BytesHomogeneousUint8_a2 = a2;
+
+  final result = returnStruct3BytesHomogeneousUint8CalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void returnStruct3BytesHomogeneousUint8AfterCallback() {
+  free(returnStruct3BytesHomogeneousUint8Result.addressOf);
+
+  final result = returnStruct3BytesHomogeneousUint8CalculateResult();
+
+  print("after callback result = $result");
+
+  free(returnStruct3BytesHomogeneousUint8Result.addressOf);
+}
+
+typedef ReturnStruct3BytesInt2ByteAlignedType = Struct3BytesInt2ByteAligned
+    Function(Int16, Int8);
+
+// Global variables to be able to test inputs after callback returned.
+int returnStruct3BytesInt2ByteAligned_a0 = 0;
+int returnStruct3BytesInt2ByteAligned_a1 = 0;
+
+// Result variable also global, so we can delete it after the callback.
+Struct3BytesInt2ByteAligned returnStruct3BytesInt2ByteAlignedResult =
+    Struct3BytesInt2ByteAligned();
+
+Struct3BytesInt2ByteAligned returnStruct3BytesInt2ByteAlignedCalculateResult() {
+  Struct3BytesInt2ByteAligned result =
+      allocate<Struct3BytesInt2ByteAligned>().ref;
+
+  result.a0 = returnStruct3BytesInt2ByteAligned_a0;
+  result.a1 = returnStruct3BytesInt2ByteAligned_a1;
+
+  returnStruct3BytesInt2ByteAlignedResult = result;
+
+  return result;
+}
+
+/// Smaller than word size return value on all architectures.
+/// With alignment rules taken into account size is 4 bytes.
+Struct3BytesInt2ByteAligned returnStruct3BytesInt2ByteAligned(int a0, int a1) {
+  print("returnStruct3BytesInt2ByteAligned(${a0}, ${a1})");
+
+  // In legacy mode, possibly return null.
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0 == 42 || a0 == 84) {
+    print("throwing!");
+    throw Exception("ReturnStruct3BytesInt2ByteAligned throwing on purpuse!");
+  }
+
+  returnStruct3BytesInt2ByteAligned_a0 = a0;
+  returnStruct3BytesInt2ByteAligned_a1 = a1;
+
+  final result = returnStruct3BytesInt2ByteAlignedCalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void returnStruct3BytesInt2ByteAlignedAfterCallback() {
+  free(returnStruct3BytesInt2ByteAlignedResult.addressOf);
+
+  final result = returnStruct3BytesInt2ByteAlignedCalculateResult();
+
+  print("after callback result = $result");
+
+  free(returnStruct3BytesInt2ByteAlignedResult.addressOf);
+}
+
+typedef ReturnStruct4BytesHomogeneousInt16Type = Struct4BytesHomogeneousInt16
+    Function(Int16, Int16);
+
+// Global variables to be able to test inputs after callback returned.
+int returnStruct4BytesHomogeneousInt16_a0 = 0;
+int returnStruct4BytesHomogeneousInt16_a1 = 0;
+
+// Result variable also global, so we can delete it after the callback.
+Struct4BytesHomogeneousInt16 returnStruct4BytesHomogeneousInt16Result =
+    Struct4BytesHomogeneousInt16();
+
+Struct4BytesHomogeneousInt16
+    returnStruct4BytesHomogeneousInt16CalculateResult() {
+  Struct4BytesHomogeneousInt16 result =
+      allocate<Struct4BytesHomogeneousInt16>().ref;
+
+  result.a0 = returnStruct4BytesHomogeneousInt16_a0;
+  result.a1 = returnStruct4BytesHomogeneousInt16_a1;
+
+  returnStruct4BytesHomogeneousInt16Result = result;
+
+  return result;
+}
+
+/// Word size return value on 32 bit architectures..
+Struct4BytesHomogeneousInt16 returnStruct4BytesHomogeneousInt16(
+    int a0, int a1) {
+  print("returnStruct4BytesHomogeneousInt16(${a0}, ${a1})");
+
+  // In legacy mode, possibly return null.
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0 == 42 || a0 == 84) {
+    print("throwing!");
+    throw Exception("ReturnStruct4BytesHomogeneousInt16 throwing on purpuse!");
+  }
+
+  returnStruct4BytesHomogeneousInt16_a0 = a0;
+  returnStruct4BytesHomogeneousInt16_a1 = a1;
+
+  final result = returnStruct4BytesHomogeneousInt16CalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void returnStruct4BytesHomogeneousInt16AfterCallback() {
+  free(returnStruct4BytesHomogeneousInt16Result.addressOf);
+
+  final result = returnStruct4BytesHomogeneousInt16CalculateResult();
+
+  print("after callback result = $result");
+
+  free(returnStruct4BytesHomogeneousInt16Result.addressOf);
+}
+
+typedef ReturnStruct7BytesHomogeneousUint8Type = Struct7BytesHomogeneousUint8
+    Function(Uint8, Uint8, Uint8, Uint8, Uint8, Uint8, Uint8);
+
+// Global variables to be able to test inputs after callback returned.
+int returnStruct7BytesHomogeneousUint8_a0 = 0;
+int returnStruct7BytesHomogeneousUint8_a1 = 0;
+int returnStruct7BytesHomogeneousUint8_a2 = 0;
+int returnStruct7BytesHomogeneousUint8_a3 = 0;
+int returnStruct7BytesHomogeneousUint8_a4 = 0;
+int returnStruct7BytesHomogeneousUint8_a5 = 0;
+int returnStruct7BytesHomogeneousUint8_a6 = 0;
+
+// Result variable also global, so we can delete it after the callback.
+Struct7BytesHomogeneousUint8 returnStruct7BytesHomogeneousUint8Result =
+    Struct7BytesHomogeneousUint8();
+
+Struct7BytesHomogeneousUint8
+    returnStruct7BytesHomogeneousUint8CalculateResult() {
+  Struct7BytesHomogeneousUint8 result =
+      allocate<Struct7BytesHomogeneousUint8>().ref;
+
+  result.a0 = returnStruct7BytesHomogeneousUint8_a0;
+  result.a1 = returnStruct7BytesHomogeneousUint8_a1;
+  result.a2 = returnStruct7BytesHomogeneousUint8_a2;
+  result.a3 = returnStruct7BytesHomogeneousUint8_a3;
+  result.a4 = returnStruct7BytesHomogeneousUint8_a4;
+  result.a5 = returnStruct7BytesHomogeneousUint8_a5;
+  result.a6 = returnStruct7BytesHomogeneousUint8_a6;
+
+  returnStruct7BytesHomogeneousUint8Result = result;
+
+  return result;
+}
+
+/// Non-wordsize return value.
+Struct7BytesHomogeneousUint8 returnStruct7BytesHomogeneousUint8(
+    int a0, int a1, int a2, int a3, int a4, int a5, int a6) {
+  print(
+      "returnStruct7BytesHomogeneousUint8(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5}, ${a6})");
+
+  // In legacy mode, possibly return null.
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0 == 42 || a0 == 84) {
+    print("throwing!");
+    throw Exception("ReturnStruct7BytesHomogeneousUint8 throwing on purpuse!");
+  }
+
+  returnStruct7BytesHomogeneousUint8_a0 = a0;
+  returnStruct7BytesHomogeneousUint8_a1 = a1;
+  returnStruct7BytesHomogeneousUint8_a2 = a2;
+  returnStruct7BytesHomogeneousUint8_a3 = a3;
+  returnStruct7BytesHomogeneousUint8_a4 = a4;
+  returnStruct7BytesHomogeneousUint8_a5 = a5;
+  returnStruct7BytesHomogeneousUint8_a6 = a6;
+
+  final result = returnStruct7BytesHomogeneousUint8CalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void returnStruct7BytesHomogeneousUint8AfterCallback() {
+  free(returnStruct7BytesHomogeneousUint8Result.addressOf);
+
+  final result = returnStruct7BytesHomogeneousUint8CalculateResult();
+
+  print("after callback result = $result");
+
+  free(returnStruct7BytesHomogeneousUint8Result.addressOf);
+}
+
+typedef ReturnStruct7BytesInt4ByteAlignedType = Struct7BytesInt4ByteAligned
+    Function(Int32, Int16, Int8);
+
+// Global variables to be able to test inputs after callback returned.
+int returnStruct7BytesInt4ByteAligned_a0 = 0;
+int returnStruct7BytesInt4ByteAligned_a1 = 0;
+int returnStruct7BytesInt4ByteAligned_a2 = 0;
+
+// Result variable also global, so we can delete it after the callback.
+Struct7BytesInt4ByteAligned returnStruct7BytesInt4ByteAlignedResult =
+    Struct7BytesInt4ByteAligned();
+
+Struct7BytesInt4ByteAligned returnStruct7BytesInt4ByteAlignedCalculateResult() {
+  Struct7BytesInt4ByteAligned result =
+      allocate<Struct7BytesInt4ByteAligned>().ref;
+
+  result.a0 = returnStruct7BytesInt4ByteAligned_a0;
+  result.a1 = returnStruct7BytesInt4ByteAligned_a1;
+  result.a2 = returnStruct7BytesInt4ByteAligned_a2;
+
+  returnStruct7BytesInt4ByteAlignedResult = result;
+
+  return result;
+}
+
+/// Non-wordsize return value.
+/// With alignment rules taken into account size is 8 bytes.
+Struct7BytesInt4ByteAligned returnStruct7BytesInt4ByteAligned(
+    int a0, int a1, int a2) {
+  print("returnStruct7BytesInt4ByteAligned(${a0}, ${a1}, ${a2})");
+
+  // In legacy mode, possibly return null.
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0 == 42 || a0 == 84) {
+    print("throwing!");
+    throw Exception("ReturnStruct7BytesInt4ByteAligned throwing on purpuse!");
+  }
+
+  returnStruct7BytesInt4ByteAligned_a0 = a0;
+  returnStruct7BytesInt4ByteAligned_a1 = a1;
+  returnStruct7BytesInt4ByteAligned_a2 = a2;
+
+  final result = returnStruct7BytesInt4ByteAlignedCalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void returnStruct7BytesInt4ByteAlignedAfterCallback() {
+  free(returnStruct7BytesInt4ByteAlignedResult.addressOf);
+
+  final result = returnStruct7BytesInt4ByteAlignedCalculateResult();
+
+  print("after callback result = $result");
+
+  free(returnStruct7BytesInt4ByteAlignedResult.addressOf);
+}
+
+typedef ReturnStruct8BytesIntType = Struct8BytesInt Function(
+    Int16, Int16, Int32);
+
+// Global variables to be able to test inputs after callback returned.
+int returnStruct8BytesInt_a0 = 0;
+int returnStruct8BytesInt_a1 = 0;
+int returnStruct8BytesInt_a2 = 0;
+
+// Result variable also global, so we can delete it after the callback.
+Struct8BytesInt returnStruct8BytesIntResult = Struct8BytesInt();
+
+Struct8BytesInt returnStruct8BytesIntCalculateResult() {
+  Struct8BytesInt result = allocate<Struct8BytesInt>().ref;
+
+  result.a0 = returnStruct8BytesInt_a0;
+  result.a1 = returnStruct8BytesInt_a1;
+  result.a2 = returnStruct8BytesInt_a2;
+
+  returnStruct8BytesIntResult = result;
+
+  return result;
+}
+
+/// Return value in integer registers on many architectures.
+Struct8BytesInt returnStruct8BytesInt(int a0, int a1, int a2) {
+  print("returnStruct8BytesInt(${a0}, ${a1}, ${a2})");
+
+  // In legacy mode, possibly return null.
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0 == 42 || a0 == 84) {
+    print("throwing!");
+    throw Exception("ReturnStruct8BytesInt throwing on purpuse!");
+  }
+
+  returnStruct8BytesInt_a0 = a0;
+  returnStruct8BytesInt_a1 = a1;
+  returnStruct8BytesInt_a2 = a2;
+
+  final result = returnStruct8BytesIntCalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void returnStruct8BytesIntAfterCallback() {
+  free(returnStruct8BytesIntResult.addressOf);
+
+  final result = returnStruct8BytesIntCalculateResult();
+
+  print("after callback result = $result");
+
+  free(returnStruct8BytesIntResult.addressOf);
+}
+
+typedef ReturnStruct8BytesHomogeneousFloatType = Struct8BytesHomogeneousFloat
+    Function(Float, Float);
+
+// Global variables to be able to test inputs after callback returned.
+double returnStruct8BytesHomogeneousFloat_a0 = 0.0;
+double returnStruct8BytesHomogeneousFloat_a1 = 0.0;
+
+// Result variable also global, so we can delete it after the callback.
+Struct8BytesHomogeneousFloat returnStruct8BytesHomogeneousFloatResult =
+    Struct8BytesHomogeneousFloat();
+
+Struct8BytesHomogeneousFloat
+    returnStruct8BytesHomogeneousFloatCalculateResult() {
+  Struct8BytesHomogeneousFloat result =
+      allocate<Struct8BytesHomogeneousFloat>().ref;
+
+  result.a0 = returnStruct8BytesHomogeneousFloat_a0;
+  result.a1 = returnStruct8BytesHomogeneousFloat_a1;
+
+  returnStruct8BytesHomogeneousFloatResult = result;
+
+  return result;
+}
+
+/// Return value in FP registers on many architectures.
+Struct8BytesHomogeneousFloat returnStruct8BytesHomogeneousFloat(
+    double a0, double a1) {
+  print("returnStruct8BytesHomogeneousFloat(${a0}, ${a1})");
+
+  // In legacy mode, possibly return null.
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0 == 42 || a0 == 84) {
+    print("throwing!");
+    throw Exception("ReturnStruct8BytesHomogeneousFloat throwing on purpuse!");
+  }
+
+  returnStruct8BytesHomogeneousFloat_a0 = a0;
+  returnStruct8BytesHomogeneousFloat_a1 = a1;
+
+  final result = returnStruct8BytesHomogeneousFloatCalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void returnStruct8BytesHomogeneousFloatAfterCallback() {
+  free(returnStruct8BytesHomogeneousFloatResult.addressOf);
+
+  final result = returnStruct8BytesHomogeneousFloatCalculateResult();
+
+  print("after callback result = $result");
+
+  free(returnStruct8BytesHomogeneousFloatResult.addressOf);
+}
+
+typedef ReturnStruct8BytesMixedType = Struct8BytesMixed Function(
+    Float, Int16, Int16);
+
+// Global variables to be able to test inputs after callback returned.
+double returnStruct8BytesMixed_a0 = 0.0;
+int returnStruct8BytesMixed_a1 = 0;
+int returnStruct8BytesMixed_a2 = 0;
+
+// Result variable also global, so we can delete it after the callback.
+Struct8BytesMixed returnStruct8BytesMixedResult = Struct8BytesMixed();
+
+Struct8BytesMixed returnStruct8BytesMixedCalculateResult() {
+  Struct8BytesMixed result = allocate<Struct8BytesMixed>().ref;
+
+  result.a0 = returnStruct8BytesMixed_a0;
+  result.a1 = returnStruct8BytesMixed_a1;
+  result.a2 = returnStruct8BytesMixed_a2;
+
+  returnStruct8BytesMixedResult = result;
+
+  return result;
+}
+
+/// Return value split over FP and integer register in x64.
+Struct8BytesMixed returnStruct8BytesMixed(double a0, int a1, int a2) {
+  print("returnStruct8BytesMixed(${a0}, ${a1}, ${a2})");
+
+  // In legacy mode, possibly return null.
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0 == 42 || a0 == 84) {
+    print("throwing!");
+    throw Exception("ReturnStruct8BytesMixed throwing on purpuse!");
+  }
+
+  returnStruct8BytesMixed_a0 = a0;
+  returnStruct8BytesMixed_a1 = a1;
+  returnStruct8BytesMixed_a2 = a2;
+
+  final result = returnStruct8BytesMixedCalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void returnStruct8BytesMixedAfterCallback() {
+  free(returnStruct8BytesMixedResult.addressOf);
+
+  final result = returnStruct8BytesMixedCalculateResult();
+
+  print("after callback result = $result");
+
+  free(returnStruct8BytesMixedResult.addressOf);
+}
+
+typedef ReturnStruct9BytesHomogeneousUint8Type = Struct9BytesHomogeneousUint8
+    Function(Uint8, Uint8, Uint8, Uint8, Uint8, Uint8, Uint8, Uint8, Uint8);
+
+// Global variables to be able to test inputs after callback returned.
+int returnStruct9BytesHomogeneousUint8_a0 = 0;
+int returnStruct9BytesHomogeneousUint8_a1 = 0;
+int returnStruct9BytesHomogeneousUint8_a2 = 0;
+int returnStruct9BytesHomogeneousUint8_a3 = 0;
+int returnStruct9BytesHomogeneousUint8_a4 = 0;
+int returnStruct9BytesHomogeneousUint8_a5 = 0;
+int returnStruct9BytesHomogeneousUint8_a6 = 0;
+int returnStruct9BytesHomogeneousUint8_a7 = 0;
+int returnStruct9BytesHomogeneousUint8_a8 = 0;
+
+// Result variable also global, so we can delete it after the callback.
+Struct9BytesHomogeneousUint8 returnStruct9BytesHomogeneousUint8Result =
+    Struct9BytesHomogeneousUint8();
+
+Struct9BytesHomogeneousUint8
+    returnStruct9BytesHomogeneousUint8CalculateResult() {
+  Struct9BytesHomogeneousUint8 result =
+      allocate<Struct9BytesHomogeneousUint8>().ref;
+
+  result.a0 = returnStruct9BytesHomogeneousUint8_a0;
+  result.a1 = returnStruct9BytesHomogeneousUint8_a1;
+  result.a2 = returnStruct9BytesHomogeneousUint8_a2;
+  result.a3 = returnStruct9BytesHomogeneousUint8_a3;
+  result.a4 = returnStruct9BytesHomogeneousUint8_a4;
+  result.a5 = returnStruct9BytesHomogeneousUint8_a5;
+  result.a6 = returnStruct9BytesHomogeneousUint8_a6;
+  result.a7 = returnStruct9BytesHomogeneousUint8_a7;
+  result.a8 = returnStruct9BytesHomogeneousUint8_a8;
+
+  returnStruct9BytesHomogeneousUint8Result = result;
+
+  return result;
+}
+
+/// The minimum alignment of this struct is only 1 byte based on its fields.
+/// Test that the memory backing these structs is the right size and that
+/// dart:ffi trampolines do not write outside this size.
+Struct9BytesHomogeneousUint8 returnStruct9BytesHomogeneousUint8(
+    int a0, int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8) {
+  print(
+      "returnStruct9BytesHomogeneousUint8(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5}, ${a6}, ${a7}, ${a8})");
+
+  // In legacy mode, possibly return null.
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0 == 42 || a0 == 84) {
+    print("throwing!");
+    throw Exception("ReturnStruct9BytesHomogeneousUint8 throwing on purpuse!");
+  }
+
+  returnStruct9BytesHomogeneousUint8_a0 = a0;
+  returnStruct9BytesHomogeneousUint8_a1 = a1;
+  returnStruct9BytesHomogeneousUint8_a2 = a2;
+  returnStruct9BytesHomogeneousUint8_a3 = a3;
+  returnStruct9BytesHomogeneousUint8_a4 = a4;
+  returnStruct9BytesHomogeneousUint8_a5 = a5;
+  returnStruct9BytesHomogeneousUint8_a6 = a6;
+  returnStruct9BytesHomogeneousUint8_a7 = a7;
+  returnStruct9BytesHomogeneousUint8_a8 = a8;
+
+  final result = returnStruct9BytesHomogeneousUint8CalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void returnStruct9BytesHomogeneousUint8AfterCallback() {
+  free(returnStruct9BytesHomogeneousUint8Result.addressOf);
+
+  final result = returnStruct9BytesHomogeneousUint8CalculateResult();
+
+  print("after callback result = $result");
+
+  free(returnStruct9BytesHomogeneousUint8Result.addressOf);
+}
+
+typedef ReturnStruct9BytesInt4Or8ByteAlignedType
+    = Struct9BytesInt4Or8ByteAligned Function(Int64, Int8);
+
+// Global variables to be able to test inputs after callback returned.
+int returnStruct9BytesInt4Or8ByteAligned_a0 = 0;
+int returnStruct9BytesInt4Or8ByteAligned_a1 = 0;
+
+// Result variable also global, so we can delete it after the callback.
+Struct9BytesInt4Or8ByteAligned returnStruct9BytesInt4Or8ByteAlignedResult =
+    Struct9BytesInt4Or8ByteAligned();
+
+Struct9BytesInt4Or8ByteAligned
+    returnStruct9BytesInt4Or8ByteAlignedCalculateResult() {
+  Struct9BytesInt4Or8ByteAligned result =
+      allocate<Struct9BytesInt4Or8ByteAligned>().ref;
+
+  result.a0 = returnStruct9BytesInt4Or8ByteAligned_a0;
+  result.a1 = returnStruct9BytesInt4Or8ByteAligned_a1;
+
+  returnStruct9BytesInt4Or8ByteAlignedResult = result;
+
+  return result;
+}
+
+/// Return value in two integer registers on x64.
+/// With alignment rules taken into account size is 12 or 16 bytes.
+Struct9BytesInt4Or8ByteAligned returnStruct9BytesInt4Or8ByteAligned(
+    int a0, int a1) {
+  print("returnStruct9BytesInt4Or8ByteAligned(${a0}, ${a1})");
+
+  // In legacy mode, possibly return null.
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0 == 42 || a0 == 84) {
+    print("throwing!");
+    throw Exception(
+        "ReturnStruct9BytesInt4Or8ByteAligned throwing on purpuse!");
+  }
+
+  returnStruct9BytesInt4Or8ByteAligned_a0 = a0;
+  returnStruct9BytesInt4Or8ByteAligned_a1 = a1;
+
+  final result = returnStruct9BytesInt4Or8ByteAlignedCalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void returnStruct9BytesInt4Or8ByteAlignedAfterCallback() {
+  free(returnStruct9BytesInt4Or8ByteAlignedResult.addressOf);
+
+  final result = returnStruct9BytesInt4Or8ByteAlignedCalculateResult();
+
+  print("after callback result = $result");
+
+  free(returnStruct9BytesInt4Or8ByteAlignedResult.addressOf);
+}
+
+typedef ReturnStruct12BytesHomogeneousFloatType = Struct12BytesHomogeneousFloat
+    Function(Float, Float, Float);
+
+// Global variables to be able to test inputs after callback returned.
+double returnStruct12BytesHomogeneousFloat_a0 = 0.0;
+double returnStruct12BytesHomogeneousFloat_a1 = 0.0;
+double returnStruct12BytesHomogeneousFloat_a2 = 0.0;
+
+// Result variable also global, so we can delete it after the callback.
+Struct12BytesHomogeneousFloat returnStruct12BytesHomogeneousFloatResult =
+    Struct12BytesHomogeneousFloat();
+
+Struct12BytesHomogeneousFloat
+    returnStruct12BytesHomogeneousFloatCalculateResult() {
+  Struct12BytesHomogeneousFloat result =
+      allocate<Struct12BytesHomogeneousFloat>().ref;
+
+  result.a0 = returnStruct12BytesHomogeneousFloat_a0;
+  result.a1 = returnStruct12BytesHomogeneousFloat_a1;
+  result.a2 = returnStruct12BytesHomogeneousFloat_a2;
+
+  returnStruct12BytesHomogeneousFloatResult = result;
+
+  return result;
+}
+
+/// Return value in FPU registers, but does not use all registers on arm hardfp
+/// and arm64.
+Struct12BytesHomogeneousFloat returnStruct12BytesHomogeneousFloat(
+    double a0, double a1, double a2) {
+  print("returnStruct12BytesHomogeneousFloat(${a0}, ${a1}, ${a2})");
+
+  // In legacy mode, possibly return null.
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0 == 42 || a0 == 84) {
+    print("throwing!");
+    throw Exception("ReturnStruct12BytesHomogeneousFloat throwing on purpuse!");
+  }
+
+  returnStruct12BytesHomogeneousFloat_a0 = a0;
+  returnStruct12BytesHomogeneousFloat_a1 = a1;
+  returnStruct12BytesHomogeneousFloat_a2 = a2;
+
+  final result = returnStruct12BytesHomogeneousFloatCalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void returnStruct12BytesHomogeneousFloatAfterCallback() {
+  free(returnStruct12BytesHomogeneousFloatResult.addressOf);
+
+  final result = returnStruct12BytesHomogeneousFloatCalculateResult();
+
+  print("after callback result = $result");
+
+  free(returnStruct12BytesHomogeneousFloatResult.addressOf);
+}
+
+typedef ReturnStruct16BytesHomogeneousFloatType = Struct16BytesHomogeneousFloat
+    Function(Float, Float, Float, Float);
+
+// Global variables to be able to test inputs after callback returned.
+double returnStruct16BytesHomogeneousFloat_a0 = 0.0;
+double returnStruct16BytesHomogeneousFloat_a1 = 0.0;
+double returnStruct16BytesHomogeneousFloat_a2 = 0.0;
+double returnStruct16BytesHomogeneousFloat_a3 = 0.0;
+
+// Result variable also global, so we can delete it after the callback.
+Struct16BytesHomogeneousFloat returnStruct16BytesHomogeneousFloatResult =
+    Struct16BytesHomogeneousFloat();
+
+Struct16BytesHomogeneousFloat
+    returnStruct16BytesHomogeneousFloatCalculateResult() {
+  Struct16BytesHomogeneousFloat result =
+      allocate<Struct16BytesHomogeneousFloat>().ref;
+
+  result.a0 = returnStruct16BytesHomogeneousFloat_a0;
+  result.a1 = returnStruct16BytesHomogeneousFloat_a1;
+  result.a2 = returnStruct16BytesHomogeneousFloat_a2;
+  result.a3 = returnStruct16BytesHomogeneousFloat_a3;
+
+  returnStruct16BytesHomogeneousFloatResult = result;
+
+  return result;
+}
+
+/// Return value in FPU registers on arm hardfp and arm64.
+Struct16BytesHomogeneousFloat returnStruct16BytesHomogeneousFloat(
+    double a0, double a1, double a2, double a3) {
+  print("returnStruct16BytesHomogeneousFloat(${a0}, ${a1}, ${a2}, ${a3})");
+
+  // In legacy mode, possibly return null.
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0 == 42 || a0 == 84) {
+    print("throwing!");
+    throw Exception("ReturnStruct16BytesHomogeneousFloat throwing on purpuse!");
+  }
+
+  returnStruct16BytesHomogeneousFloat_a0 = a0;
+  returnStruct16BytesHomogeneousFloat_a1 = a1;
+  returnStruct16BytesHomogeneousFloat_a2 = a2;
+  returnStruct16BytesHomogeneousFloat_a3 = a3;
+
+  final result = returnStruct16BytesHomogeneousFloatCalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void returnStruct16BytesHomogeneousFloatAfterCallback() {
+  free(returnStruct16BytesHomogeneousFloatResult.addressOf);
+
+  final result = returnStruct16BytesHomogeneousFloatCalculateResult();
+
+  print("after callback result = $result");
+
+  free(returnStruct16BytesHomogeneousFloatResult.addressOf);
+}
+
+typedef ReturnStruct16BytesMixedType = Struct16BytesMixed Function(
+    Double, Int64);
+
+// Global variables to be able to test inputs after callback returned.
+double returnStruct16BytesMixed_a0 = 0.0;
+int returnStruct16BytesMixed_a1 = 0;
+
+// Result variable also global, so we can delete it after the callback.
+Struct16BytesMixed returnStruct16BytesMixedResult = Struct16BytesMixed();
+
+Struct16BytesMixed returnStruct16BytesMixedCalculateResult() {
+  Struct16BytesMixed result = allocate<Struct16BytesMixed>().ref;
+
+  result.a0 = returnStruct16BytesMixed_a0;
+  result.a1 = returnStruct16BytesMixed_a1;
+
+  returnStruct16BytesMixedResult = result;
+
+  return result;
+}
+
+/// Return value split over FP and integer register in x64.
+Struct16BytesMixed returnStruct16BytesMixed(double a0, int a1) {
+  print("returnStruct16BytesMixed(${a0}, ${a1})");
+
+  // In legacy mode, possibly return null.
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0 == 42 || a0 == 84) {
+    print("throwing!");
+    throw Exception("ReturnStruct16BytesMixed throwing on purpuse!");
+  }
+
+  returnStruct16BytesMixed_a0 = a0;
+  returnStruct16BytesMixed_a1 = a1;
+
+  final result = returnStruct16BytesMixedCalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void returnStruct16BytesMixedAfterCallback() {
+  free(returnStruct16BytesMixedResult.addressOf);
+
+  final result = returnStruct16BytesMixedCalculateResult();
+
+  print("after callback result = $result");
+
+  free(returnStruct16BytesMixedResult.addressOf);
+}
+
+typedef ReturnStruct16BytesMixed2Type = Struct16BytesMixed2 Function(
+    Float, Float, Float, Int32);
+
+// Global variables to be able to test inputs after callback returned.
+double returnStruct16BytesMixed2_a0 = 0.0;
+double returnStruct16BytesMixed2_a1 = 0.0;
+double returnStruct16BytesMixed2_a2 = 0.0;
+int returnStruct16BytesMixed2_a3 = 0;
+
+// Result variable also global, so we can delete it after the callback.
+Struct16BytesMixed2 returnStruct16BytesMixed2Result = Struct16BytesMixed2();
+
+Struct16BytesMixed2 returnStruct16BytesMixed2CalculateResult() {
+  Struct16BytesMixed2 result = allocate<Struct16BytesMixed2>().ref;
+
+  result.a0 = returnStruct16BytesMixed2_a0;
+  result.a1 = returnStruct16BytesMixed2_a1;
+  result.a2 = returnStruct16BytesMixed2_a2;
+  result.a3 = returnStruct16BytesMixed2_a3;
+
+  returnStruct16BytesMixed2Result = result;
+
+  return result;
+}
+
+/// Return value split over FP and integer register in x64.
+/// The integer register contains half float half int.
+Struct16BytesMixed2 returnStruct16BytesMixed2(
+    double a0, double a1, double a2, int a3) {
+  print("returnStruct16BytesMixed2(${a0}, ${a1}, ${a2}, ${a3})");
+
+  // In legacy mode, possibly return null.
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0 == 42 || a0 == 84) {
+    print("throwing!");
+    throw Exception("ReturnStruct16BytesMixed2 throwing on purpuse!");
+  }
+
+  returnStruct16BytesMixed2_a0 = a0;
+  returnStruct16BytesMixed2_a1 = a1;
+  returnStruct16BytesMixed2_a2 = a2;
+  returnStruct16BytesMixed2_a3 = a3;
+
+  final result = returnStruct16BytesMixed2CalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void returnStruct16BytesMixed2AfterCallback() {
+  free(returnStruct16BytesMixed2Result.addressOf);
+
+  final result = returnStruct16BytesMixed2CalculateResult();
+
+  print("after callback result = $result");
+
+  free(returnStruct16BytesMixed2Result.addressOf);
+}
+
+typedef ReturnStruct17BytesIntType = Struct17BytesInt Function(
+    Int64, Int64, Int8);
+
+// Global variables to be able to test inputs after callback returned.
+int returnStruct17BytesInt_a0 = 0;
+int returnStruct17BytesInt_a1 = 0;
+int returnStruct17BytesInt_a2 = 0;
+
+// Result variable also global, so we can delete it after the callback.
+Struct17BytesInt returnStruct17BytesIntResult = Struct17BytesInt();
+
+Struct17BytesInt returnStruct17BytesIntCalculateResult() {
+  Struct17BytesInt result = allocate<Struct17BytesInt>().ref;
+
+  result.a0 = returnStruct17BytesInt_a0;
+  result.a1 = returnStruct17BytesInt_a1;
+  result.a2 = returnStruct17BytesInt_a2;
+
+  returnStruct17BytesIntResult = result;
+
+  return result;
+}
+
+/// Rerturn value returned in preallocated space passed by pointer on most ABIs.
+/// Is non word size on purpose, to test that structs are rounded up to word size
+/// on all ABIs.
+Struct17BytesInt returnStruct17BytesInt(int a0, int a1, int a2) {
+  print("returnStruct17BytesInt(${a0}, ${a1}, ${a2})");
+
+  // In legacy mode, possibly return null.
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0 == 42 || a0 == 84) {
+    print("throwing!");
+    throw Exception("ReturnStruct17BytesInt throwing on purpuse!");
+  }
+
+  returnStruct17BytesInt_a0 = a0;
+  returnStruct17BytesInt_a1 = a1;
+  returnStruct17BytesInt_a2 = a2;
+
+  final result = returnStruct17BytesIntCalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void returnStruct17BytesIntAfterCallback() {
+  free(returnStruct17BytesIntResult.addressOf);
+
+  final result = returnStruct17BytesIntCalculateResult();
+
+  print("after callback result = $result");
+
+  free(returnStruct17BytesIntResult.addressOf);
+}
+
+typedef ReturnStruct19BytesHomogeneousUint8Type
+    = Struct19BytesHomogeneousUint8 Function(
+        Uint8,
+        Uint8,
+        Uint8,
+        Uint8,
+        Uint8,
+        Uint8,
+        Uint8,
+        Uint8,
+        Uint8,
+        Uint8,
+        Uint8,
+        Uint8,
+        Uint8,
+        Uint8,
+        Uint8,
+        Uint8,
+        Uint8,
+        Uint8,
+        Uint8);
+
+// Global variables to be able to test inputs after callback returned.
+int returnStruct19BytesHomogeneousUint8_a0 = 0;
+int returnStruct19BytesHomogeneousUint8_a1 = 0;
+int returnStruct19BytesHomogeneousUint8_a2 = 0;
+int returnStruct19BytesHomogeneousUint8_a3 = 0;
+int returnStruct19BytesHomogeneousUint8_a4 = 0;
+int returnStruct19BytesHomogeneousUint8_a5 = 0;
+int returnStruct19BytesHomogeneousUint8_a6 = 0;
+int returnStruct19BytesHomogeneousUint8_a7 = 0;
+int returnStruct19BytesHomogeneousUint8_a8 = 0;
+int returnStruct19BytesHomogeneousUint8_a9 = 0;
+int returnStruct19BytesHomogeneousUint8_a10 = 0;
+int returnStruct19BytesHomogeneousUint8_a11 = 0;
+int returnStruct19BytesHomogeneousUint8_a12 = 0;
+int returnStruct19BytesHomogeneousUint8_a13 = 0;
+int returnStruct19BytesHomogeneousUint8_a14 = 0;
+int returnStruct19BytesHomogeneousUint8_a15 = 0;
+int returnStruct19BytesHomogeneousUint8_a16 = 0;
+int returnStruct19BytesHomogeneousUint8_a17 = 0;
+int returnStruct19BytesHomogeneousUint8_a18 = 0;
+
+// Result variable also global, so we can delete it after the callback.
+Struct19BytesHomogeneousUint8 returnStruct19BytesHomogeneousUint8Result =
+    Struct19BytesHomogeneousUint8();
+
+Struct19BytesHomogeneousUint8
+    returnStruct19BytesHomogeneousUint8CalculateResult() {
+  Struct19BytesHomogeneousUint8 result =
+      allocate<Struct19BytesHomogeneousUint8>().ref;
+
+  result.a0 = returnStruct19BytesHomogeneousUint8_a0;
+  result.a1 = returnStruct19BytesHomogeneousUint8_a1;
+  result.a2 = returnStruct19BytesHomogeneousUint8_a2;
+  result.a3 = returnStruct19BytesHomogeneousUint8_a3;
+  result.a4 = returnStruct19BytesHomogeneousUint8_a4;
+  result.a5 = returnStruct19BytesHomogeneousUint8_a5;
+  result.a6 = returnStruct19BytesHomogeneousUint8_a6;
+  result.a7 = returnStruct19BytesHomogeneousUint8_a7;
+  result.a8 = returnStruct19BytesHomogeneousUint8_a8;
+  result.a9 = returnStruct19BytesHomogeneousUint8_a9;
+  result.a10 = returnStruct19BytesHomogeneousUint8_a10;
+  result.a11 = returnStruct19BytesHomogeneousUint8_a11;
+  result.a12 = returnStruct19BytesHomogeneousUint8_a12;
+  result.a13 = returnStruct19BytesHomogeneousUint8_a13;
+  result.a14 = returnStruct19BytesHomogeneousUint8_a14;
+  result.a15 = returnStruct19BytesHomogeneousUint8_a15;
+  result.a16 = returnStruct19BytesHomogeneousUint8_a16;
+  result.a17 = returnStruct19BytesHomogeneousUint8_a17;
+  result.a18 = returnStruct19BytesHomogeneousUint8_a18;
+
+  returnStruct19BytesHomogeneousUint8Result = result;
+
+  return result;
+}
+
+/// The minimum alignment of this struct is only 1 byte based on its fields.
+/// Test that the memory backing these structs is the right size and that
+/// dart:ffi trampolines do not write outside this size.
+Struct19BytesHomogeneousUint8 returnStruct19BytesHomogeneousUint8(
+    int a0,
+    int a1,
+    int a2,
+    int a3,
+    int a4,
+    int a5,
+    int a6,
+    int a7,
+    int a8,
+    int a9,
+    int a10,
+    int a11,
+    int a12,
+    int a13,
+    int a14,
+    int a15,
+    int a16,
+    int a17,
+    int a18) {
+  print(
+      "returnStruct19BytesHomogeneousUint8(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5}, ${a6}, ${a7}, ${a8}, ${a9}, ${a10}, ${a11}, ${a12}, ${a13}, ${a14}, ${a15}, ${a16}, ${a17}, ${a18})");
+
+  // In legacy mode, possibly return null.
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0 == 42 || a0 == 84) {
+    print("throwing!");
+    throw Exception("ReturnStruct19BytesHomogeneousUint8 throwing on purpuse!");
+  }
+
+  returnStruct19BytesHomogeneousUint8_a0 = a0;
+  returnStruct19BytesHomogeneousUint8_a1 = a1;
+  returnStruct19BytesHomogeneousUint8_a2 = a2;
+  returnStruct19BytesHomogeneousUint8_a3 = a3;
+  returnStruct19BytesHomogeneousUint8_a4 = a4;
+  returnStruct19BytesHomogeneousUint8_a5 = a5;
+  returnStruct19BytesHomogeneousUint8_a6 = a6;
+  returnStruct19BytesHomogeneousUint8_a7 = a7;
+  returnStruct19BytesHomogeneousUint8_a8 = a8;
+  returnStruct19BytesHomogeneousUint8_a9 = a9;
+  returnStruct19BytesHomogeneousUint8_a10 = a10;
+  returnStruct19BytesHomogeneousUint8_a11 = a11;
+  returnStruct19BytesHomogeneousUint8_a12 = a12;
+  returnStruct19BytesHomogeneousUint8_a13 = a13;
+  returnStruct19BytesHomogeneousUint8_a14 = a14;
+  returnStruct19BytesHomogeneousUint8_a15 = a15;
+  returnStruct19BytesHomogeneousUint8_a16 = a16;
+  returnStruct19BytesHomogeneousUint8_a17 = a17;
+  returnStruct19BytesHomogeneousUint8_a18 = a18;
+
+  final result = returnStruct19BytesHomogeneousUint8CalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void returnStruct19BytesHomogeneousUint8AfterCallback() {
+  free(returnStruct19BytesHomogeneousUint8Result.addressOf);
+
+  final result = returnStruct19BytesHomogeneousUint8CalculateResult();
+
+  print("after callback result = $result");
+
+  free(returnStruct19BytesHomogeneousUint8Result.addressOf);
+}
+
+typedef ReturnStruct20BytesHomogeneousInt32Type = Struct20BytesHomogeneousInt32
+    Function(Int32, Int32, Int32, Int32, Int32);
+
+// Global variables to be able to test inputs after callback returned.
+int returnStruct20BytesHomogeneousInt32_a0 = 0;
+int returnStruct20BytesHomogeneousInt32_a1 = 0;
+int returnStruct20BytesHomogeneousInt32_a2 = 0;
+int returnStruct20BytesHomogeneousInt32_a3 = 0;
+int returnStruct20BytesHomogeneousInt32_a4 = 0;
+
+// Result variable also global, so we can delete it after the callback.
+Struct20BytesHomogeneousInt32 returnStruct20BytesHomogeneousInt32Result =
+    Struct20BytesHomogeneousInt32();
+
+Struct20BytesHomogeneousInt32
+    returnStruct20BytesHomogeneousInt32CalculateResult() {
+  Struct20BytesHomogeneousInt32 result =
+      allocate<Struct20BytesHomogeneousInt32>().ref;
+
+  result.a0 = returnStruct20BytesHomogeneousInt32_a0;
+  result.a1 = returnStruct20BytesHomogeneousInt32_a1;
+  result.a2 = returnStruct20BytesHomogeneousInt32_a2;
+  result.a3 = returnStruct20BytesHomogeneousInt32_a3;
+  result.a4 = returnStruct20BytesHomogeneousInt32_a4;
+
+  returnStruct20BytesHomogeneousInt32Result = result;
+
+  return result;
+}
+
+/// Return value too big to go in cpu registers on arm64.
+Struct20BytesHomogeneousInt32 returnStruct20BytesHomogeneousInt32(
+    int a0, int a1, int a2, int a3, int a4) {
+  print(
+      "returnStruct20BytesHomogeneousInt32(${a0}, ${a1}, ${a2}, ${a3}, ${a4})");
+
+  // In legacy mode, possibly return null.
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0 == 42 || a0 == 84) {
+    print("throwing!");
+    throw Exception("ReturnStruct20BytesHomogeneousInt32 throwing on purpuse!");
+  }
+
+  returnStruct20BytesHomogeneousInt32_a0 = a0;
+  returnStruct20BytesHomogeneousInt32_a1 = a1;
+  returnStruct20BytesHomogeneousInt32_a2 = a2;
+  returnStruct20BytesHomogeneousInt32_a3 = a3;
+  returnStruct20BytesHomogeneousInt32_a4 = a4;
+
+  final result = returnStruct20BytesHomogeneousInt32CalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void returnStruct20BytesHomogeneousInt32AfterCallback() {
+  free(returnStruct20BytesHomogeneousInt32Result.addressOf);
+
+  final result = returnStruct20BytesHomogeneousInt32CalculateResult();
+
+  print("after callback result = $result");
+
+  free(returnStruct20BytesHomogeneousInt32Result.addressOf);
+}
+
+typedef ReturnStruct20BytesHomogeneousFloatType = Struct20BytesHomogeneousFloat
+    Function(Float, Float, Float, Float, Float);
+
+// Global variables to be able to test inputs after callback returned.
+double returnStruct20BytesHomogeneousFloat_a0 = 0.0;
+double returnStruct20BytesHomogeneousFloat_a1 = 0.0;
+double returnStruct20BytesHomogeneousFloat_a2 = 0.0;
+double returnStruct20BytesHomogeneousFloat_a3 = 0.0;
+double returnStruct20BytesHomogeneousFloat_a4 = 0.0;
+
+// Result variable also global, so we can delete it after the callback.
+Struct20BytesHomogeneousFloat returnStruct20BytesHomogeneousFloatResult =
+    Struct20BytesHomogeneousFloat();
+
+Struct20BytesHomogeneousFloat
+    returnStruct20BytesHomogeneousFloatCalculateResult() {
+  Struct20BytesHomogeneousFloat result =
+      allocate<Struct20BytesHomogeneousFloat>().ref;
+
+  result.a0 = returnStruct20BytesHomogeneousFloat_a0;
+  result.a1 = returnStruct20BytesHomogeneousFloat_a1;
+  result.a2 = returnStruct20BytesHomogeneousFloat_a2;
+  result.a3 = returnStruct20BytesHomogeneousFloat_a3;
+  result.a4 = returnStruct20BytesHomogeneousFloat_a4;
+
+  returnStruct20BytesHomogeneousFloatResult = result;
+
+  return result;
+}
+
+/// Return value too big to go in FPU registers on x64, arm hardfp and arm64.
+Struct20BytesHomogeneousFloat returnStruct20BytesHomogeneousFloat(
+    double a0, double a1, double a2, double a3, double a4) {
+  print(
+      "returnStruct20BytesHomogeneousFloat(${a0}, ${a1}, ${a2}, ${a3}, ${a4})");
+
+  // In legacy mode, possibly return null.
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0 == 42 || a0 == 84) {
+    print("throwing!");
+    throw Exception("ReturnStruct20BytesHomogeneousFloat throwing on purpuse!");
+  }
+
+  returnStruct20BytesHomogeneousFloat_a0 = a0;
+  returnStruct20BytesHomogeneousFloat_a1 = a1;
+  returnStruct20BytesHomogeneousFloat_a2 = a2;
+  returnStruct20BytesHomogeneousFloat_a3 = a3;
+  returnStruct20BytesHomogeneousFloat_a4 = a4;
+
+  final result = returnStruct20BytesHomogeneousFloatCalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void returnStruct20BytesHomogeneousFloatAfterCallback() {
+  free(returnStruct20BytesHomogeneousFloatResult.addressOf);
+
+  final result = returnStruct20BytesHomogeneousFloatCalculateResult();
+
+  print("after callback result = $result");
+
+  free(returnStruct20BytesHomogeneousFloatResult.addressOf);
+}
+
+typedef ReturnStruct32BytesHomogeneousDoubleType
+    = Struct32BytesHomogeneousDouble Function(Double, Double, Double, Double);
+
+// Global variables to be able to test inputs after callback returned.
+double returnStruct32BytesHomogeneousDouble_a0 = 0.0;
+double returnStruct32BytesHomogeneousDouble_a1 = 0.0;
+double returnStruct32BytesHomogeneousDouble_a2 = 0.0;
+double returnStruct32BytesHomogeneousDouble_a3 = 0.0;
+
+// Result variable also global, so we can delete it after the callback.
+Struct32BytesHomogeneousDouble returnStruct32BytesHomogeneousDoubleResult =
+    Struct32BytesHomogeneousDouble();
+
+Struct32BytesHomogeneousDouble
+    returnStruct32BytesHomogeneousDoubleCalculateResult() {
+  Struct32BytesHomogeneousDouble result =
+      allocate<Struct32BytesHomogeneousDouble>().ref;
+
+  result.a0 = returnStruct32BytesHomogeneousDouble_a0;
+  result.a1 = returnStruct32BytesHomogeneousDouble_a1;
+  result.a2 = returnStruct32BytesHomogeneousDouble_a2;
+  result.a3 = returnStruct32BytesHomogeneousDouble_a3;
+
+  returnStruct32BytesHomogeneousDoubleResult = result;
+
+  return result;
+}
+
+/// Return value in FPU registers on arm64.
+Struct32BytesHomogeneousDouble returnStruct32BytesHomogeneousDouble(
+    double a0, double a1, double a2, double a3) {
+  print("returnStruct32BytesHomogeneousDouble(${a0}, ${a1}, ${a2}, ${a3})");
+
+  // In legacy mode, possibly return null.
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0 == 42 || a0 == 84) {
+    print("throwing!");
+    throw Exception(
+        "ReturnStruct32BytesHomogeneousDouble throwing on purpuse!");
+  }
+
+  returnStruct32BytesHomogeneousDouble_a0 = a0;
+  returnStruct32BytesHomogeneousDouble_a1 = a1;
+  returnStruct32BytesHomogeneousDouble_a2 = a2;
+  returnStruct32BytesHomogeneousDouble_a3 = a3;
+
+  final result = returnStruct32BytesHomogeneousDoubleCalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void returnStruct32BytesHomogeneousDoubleAfterCallback() {
+  free(returnStruct32BytesHomogeneousDoubleResult.addressOf);
+
+  final result = returnStruct32BytesHomogeneousDoubleCalculateResult();
+
+  print("after callback result = $result");
+
+  free(returnStruct32BytesHomogeneousDoubleResult.addressOf);
+}
+
+typedef ReturnStruct40BytesHomogeneousDoubleType
+    = Struct40BytesHomogeneousDouble Function(
+        Double, Double, Double, Double, Double);
+
+// Global variables to be able to test inputs after callback returned.
+double returnStruct40BytesHomogeneousDouble_a0 = 0.0;
+double returnStruct40BytesHomogeneousDouble_a1 = 0.0;
+double returnStruct40BytesHomogeneousDouble_a2 = 0.0;
+double returnStruct40BytesHomogeneousDouble_a3 = 0.0;
+double returnStruct40BytesHomogeneousDouble_a4 = 0.0;
+
+// Result variable also global, so we can delete it after the callback.
+Struct40BytesHomogeneousDouble returnStruct40BytesHomogeneousDoubleResult =
+    Struct40BytesHomogeneousDouble();
+
+Struct40BytesHomogeneousDouble
+    returnStruct40BytesHomogeneousDoubleCalculateResult() {
+  Struct40BytesHomogeneousDouble result =
+      allocate<Struct40BytesHomogeneousDouble>().ref;
+
+  result.a0 = returnStruct40BytesHomogeneousDouble_a0;
+  result.a1 = returnStruct40BytesHomogeneousDouble_a1;
+  result.a2 = returnStruct40BytesHomogeneousDouble_a2;
+  result.a3 = returnStruct40BytesHomogeneousDouble_a3;
+  result.a4 = returnStruct40BytesHomogeneousDouble_a4;
+
+  returnStruct40BytesHomogeneousDoubleResult = result;
+
+  return result;
+}
+
+/// Return value too big to go in FPU registers on arm64.
+Struct40BytesHomogeneousDouble returnStruct40BytesHomogeneousDouble(
+    double a0, double a1, double a2, double a3, double a4) {
+  print(
+      "returnStruct40BytesHomogeneousDouble(${a0}, ${a1}, ${a2}, ${a3}, ${a4})");
+
+  // In legacy mode, possibly return null.
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0 == 42 || a0 == 84) {
+    print("throwing!");
+    throw Exception(
+        "ReturnStruct40BytesHomogeneousDouble throwing on purpuse!");
+  }
+
+  returnStruct40BytesHomogeneousDouble_a0 = a0;
+  returnStruct40BytesHomogeneousDouble_a1 = a1;
+  returnStruct40BytesHomogeneousDouble_a2 = a2;
+  returnStruct40BytesHomogeneousDouble_a3 = a3;
+  returnStruct40BytesHomogeneousDouble_a4 = a4;
+
+  final result = returnStruct40BytesHomogeneousDoubleCalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void returnStruct40BytesHomogeneousDoubleAfterCallback() {
+  free(returnStruct40BytesHomogeneousDoubleResult.addressOf);
+
+  final result = returnStruct40BytesHomogeneousDoubleCalculateResult();
+
+  print("after callback result = $result");
+
+  free(returnStruct40BytesHomogeneousDoubleResult.addressOf);
+}
+
+typedef ReturnStruct1024BytesHomogeneousUint64Type
+    = Struct1024BytesHomogeneousUint64 Function(
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64);
+
+// Global variables to be able to test inputs after callback returned.
+int returnStruct1024BytesHomogeneousUint64_a0 = 0;
+int returnStruct1024BytesHomogeneousUint64_a1 = 0;
+int returnStruct1024BytesHomogeneousUint64_a2 = 0;
+int returnStruct1024BytesHomogeneousUint64_a3 = 0;
+int returnStruct1024BytesHomogeneousUint64_a4 = 0;
+int returnStruct1024BytesHomogeneousUint64_a5 = 0;
+int returnStruct1024BytesHomogeneousUint64_a6 = 0;
+int returnStruct1024BytesHomogeneousUint64_a7 = 0;
+int returnStruct1024BytesHomogeneousUint64_a8 = 0;
+int returnStruct1024BytesHomogeneousUint64_a9 = 0;
+int returnStruct1024BytesHomogeneousUint64_a10 = 0;
+int returnStruct1024BytesHomogeneousUint64_a11 = 0;
+int returnStruct1024BytesHomogeneousUint64_a12 = 0;
+int returnStruct1024BytesHomogeneousUint64_a13 = 0;
+int returnStruct1024BytesHomogeneousUint64_a14 = 0;
+int returnStruct1024BytesHomogeneousUint64_a15 = 0;
+int returnStruct1024BytesHomogeneousUint64_a16 = 0;
+int returnStruct1024BytesHomogeneousUint64_a17 = 0;
+int returnStruct1024BytesHomogeneousUint64_a18 = 0;
+int returnStruct1024BytesHomogeneousUint64_a19 = 0;
+int returnStruct1024BytesHomogeneousUint64_a20 = 0;
+int returnStruct1024BytesHomogeneousUint64_a21 = 0;
+int returnStruct1024BytesHomogeneousUint64_a22 = 0;
+int returnStruct1024BytesHomogeneousUint64_a23 = 0;
+int returnStruct1024BytesHomogeneousUint64_a24 = 0;
+int returnStruct1024BytesHomogeneousUint64_a25 = 0;
+int returnStruct1024BytesHomogeneousUint64_a26 = 0;
+int returnStruct1024BytesHomogeneousUint64_a27 = 0;
+int returnStruct1024BytesHomogeneousUint64_a28 = 0;
+int returnStruct1024BytesHomogeneousUint64_a29 = 0;
+int returnStruct1024BytesHomogeneousUint64_a30 = 0;
+int returnStruct1024BytesHomogeneousUint64_a31 = 0;
+int returnStruct1024BytesHomogeneousUint64_a32 = 0;
+int returnStruct1024BytesHomogeneousUint64_a33 = 0;
+int returnStruct1024BytesHomogeneousUint64_a34 = 0;
+int returnStruct1024BytesHomogeneousUint64_a35 = 0;
+int returnStruct1024BytesHomogeneousUint64_a36 = 0;
+int returnStruct1024BytesHomogeneousUint64_a37 = 0;
+int returnStruct1024BytesHomogeneousUint64_a38 = 0;
+int returnStruct1024BytesHomogeneousUint64_a39 = 0;
+int returnStruct1024BytesHomogeneousUint64_a40 = 0;
+int returnStruct1024BytesHomogeneousUint64_a41 = 0;
+int returnStruct1024BytesHomogeneousUint64_a42 = 0;
+int returnStruct1024BytesHomogeneousUint64_a43 = 0;
+int returnStruct1024BytesHomogeneousUint64_a44 = 0;
+int returnStruct1024BytesHomogeneousUint64_a45 = 0;
+int returnStruct1024BytesHomogeneousUint64_a46 = 0;
+int returnStruct1024BytesHomogeneousUint64_a47 = 0;
+int returnStruct1024BytesHomogeneousUint64_a48 = 0;
+int returnStruct1024BytesHomogeneousUint64_a49 = 0;
+int returnStruct1024BytesHomogeneousUint64_a50 = 0;
+int returnStruct1024BytesHomogeneousUint64_a51 = 0;
+int returnStruct1024BytesHomogeneousUint64_a52 = 0;
+int returnStruct1024BytesHomogeneousUint64_a53 = 0;
+int returnStruct1024BytesHomogeneousUint64_a54 = 0;
+int returnStruct1024BytesHomogeneousUint64_a55 = 0;
+int returnStruct1024BytesHomogeneousUint64_a56 = 0;
+int returnStruct1024BytesHomogeneousUint64_a57 = 0;
+int returnStruct1024BytesHomogeneousUint64_a58 = 0;
+int returnStruct1024BytesHomogeneousUint64_a59 = 0;
+int returnStruct1024BytesHomogeneousUint64_a60 = 0;
+int returnStruct1024BytesHomogeneousUint64_a61 = 0;
+int returnStruct1024BytesHomogeneousUint64_a62 = 0;
+int returnStruct1024BytesHomogeneousUint64_a63 = 0;
+int returnStruct1024BytesHomogeneousUint64_a64 = 0;
+int returnStruct1024BytesHomogeneousUint64_a65 = 0;
+int returnStruct1024BytesHomogeneousUint64_a66 = 0;
+int returnStruct1024BytesHomogeneousUint64_a67 = 0;
+int returnStruct1024BytesHomogeneousUint64_a68 = 0;
+int returnStruct1024BytesHomogeneousUint64_a69 = 0;
+int returnStruct1024BytesHomogeneousUint64_a70 = 0;
+int returnStruct1024BytesHomogeneousUint64_a71 = 0;
+int returnStruct1024BytesHomogeneousUint64_a72 = 0;
+int returnStruct1024BytesHomogeneousUint64_a73 = 0;
+int returnStruct1024BytesHomogeneousUint64_a74 = 0;
+int returnStruct1024BytesHomogeneousUint64_a75 = 0;
+int returnStruct1024BytesHomogeneousUint64_a76 = 0;
+int returnStruct1024BytesHomogeneousUint64_a77 = 0;
+int returnStruct1024BytesHomogeneousUint64_a78 = 0;
+int returnStruct1024BytesHomogeneousUint64_a79 = 0;
+int returnStruct1024BytesHomogeneousUint64_a80 = 0;
+int returnStruct1024BytesHomogeneousUint64_a81 = 0;
+int returnStruct1024BytesHomogeneousUint64_a82 = 0;
+int returnStruct1024BytesHomogeneousUint64_a83 = 0;
+int returnStruct1024BytesHomogeneousUint64_a84 = 0;
+int returnStruct1024BytesHomogeneousUint64_a85 = 0;
+int returnStruct1024BytesHomogeneousUint64_a86 = 0;
+int returnStruct1024BytesHomogeneousUint64_a87 = 0;
+int returnStruct1024BytesHomogeneousUint64_a88 = 0;
+int returnStruct1024BytesHomogeneousUint64_a89 = 0;
+int returnStruct1024BytesHomogeneousUint64_a90 = 0;
+int returnStruct1024BytesHomogeneousUint64_a91 = 0;
+int returnStruct1024BytesHomogeneousUint64_a92 = 0;
+int returnStruct1024BytesHomogeneousUint64_a93 = 0;
+int returnStruct1024BytesHomogeneousUint64_a94 = 0;
+int returnStruct1024BytesHomogeneousUint64_a95 = 0;
+int returnStruct1024BytesHomogeneousUint64_a96 = 0;
+int returnStruct1024BytesHomogeneousUint64_a97 = 0;
+int returnStruct1024BytesHomogeneousUint64_a98 = 0;
+int returnStruct1024BytesHomogeneousUint64_a99 = 0;
+int returnStruct1024BytesHomogeneousUint64_a100 = 0;
+int returnStruct1024BytesHomogeneousUint64_a101 = 0;
+int returnStruct1024BytesHomogeneousUint64_a102 = 0;
+int returnStruct1024BytesHomogeneousUint64_a103 = 0;
+int returnStruct1024BytesHomogeneousUint64_a104 = 0;
+int returnStruct1024BytesHomogeneousUint64_a105 = 0;
+int returnStruct1024BytesHomogeneousUint64_a106 = 0;
+int returnStruct1024BytesHomogeneousUint64_a107 = 0;
+int returnStruct1024BytesHomogeneousUint64_a108 = 0;
+int returnStruct1024BytesHomogeneousUint64_a109 = 0;
+int returnStruct1024BytesHomogeneousUint64_a110 = 0;
+int returnStruct1024BytesHomogeneousUint64_a111 = 0;
+int returnStruct1024BytesHomogeneousUint64_a112 = 0;
+int returnStruct1024BytesHomogeneousUint64_a113 = 0;
+int returnStruct1024BytesHomogeneousUint64_a114 = 0;
+int returnStruct1024BytesHomogeneousUint64_a115 = 0;
+int returnStruct1024BytesHomogeneousUint64_a116 = 0;
+int returnStruct1024BytesHomogeneousUint64_a117 = 0;
+int returnStruct1024BytesHomogeneousUint64_a118 = 0;
+int returnStruct1024BytesHomogeneousUint64_a119 = 0;
+int returnStruct1024BytesHomogeneousUint64_a120 = 0;
+int returnStruct1024BytesHomogeneousUint64_a121 = 0;
+int returnStruct1024BytesHomogeneousUint64_a122 = 0;
+int returnStruct1024BytesHomogeneousUint64_a123 = 0;
+int returnStruct1024BytesHomogeneousUint64_a124 = 0;
+int returnStruct1024BytesHomogeneousUint64_a125 = 0;
+int returnStruct1024BytesHomogeneousUint64_a126 = 0;
+int returnStruct1024BytesHomogeneousUint64_a127 = 0;
+
+// Result variable also global, so we can delete it after the callback.
+Struct1024BytesHomogeneousUint64 returnStruct1024BytesHomogeneousUint64Result =
+    Struct1024BytesHomogeneousUint64();
+
+Struct1024BytesHomogeneousUint64
+    returnStruct1024BytesHomogeneousUint64CalculateResult() {
+  Struct1024BytesHomogeneousUint64 result =
+      allocate<Struct1024BytesHomogeneousUint64>().ref;
+
+  result.a0 = returnStruct1024BytesHomogeneousUint64_a0;
+  result.a1 = returnStruct1024BytesHomogeneousUint64_a1;
+  result.a2 = returnStruct1024BytesHomogeneousUint64_a2;
+  result.a3 = returnStruct1024BytesHomogeneousUint64_a3;
+  result.a4 = returnStruct1024BytesHomogeneousUint64_a4;
+  result.a5 = returnStruct1024BytesHomogeneousUint64_a5;
+  result.a6 = returnStruct1024BytesHomogeneousUint64_a6;
+  result.a7 = returnStruct1024BytesHomogeneousUint64_a7;
+  result.a8 = returnStruct1024BytesHomogeneousUint64_a8;
+  result.a9 = returnStruct1024BytesHomogeneousUint64_a9;
+  result.a10 = returnStruct1024BytesHomogeneousUint64_a10;
+  result.a11 = returnStruct1024BytesHomogeneousUint64_a11;
+  result.a12 = returnStruct1024BytesHomogeneousUint64_a12;
+  result.a13 = returnStruct1024BytesHomogeneousUint64_a13;
+  result.a14 = returnStruct1024BytesHomogeneousUint64_a14;
+  result.a15 = returnStruct1024BytesHomogeneousUint64_a15;
+  result.a16 = returnStruct1024BytesHomogeneousUint64_a16;
+  result.a17 = returnStruct1024BytesHomogeneousUint64_a17;
+  result.a18 = returnStruct1024BytesHomogeneousUint64_a18;
+  result.a19 = returnStruct1024BytesHomogeneousUint64_a19;
+  result.a20 = returnStruct1024BytesHomogeneousUint64_a20;
+  result.a21 = returnStruct1024BytesHomogeneousUint64_a21;
+  result.a22 = returnStruct1024BytesHomogeneousUint64_a22;
+  result.a23 = returnStruct1024BytesHomogeneousUint64_a23;
+  result.a24 = returnStruct1024BytesHomogeneousUint64_a24;
+  result.a25 = returnStruct1024BytesHomogeneousUint64_a25;
+  result.a26 = returnStruct1024BytesHomogeneousUint64_a26;
+  result.a27 = returnStruct1024BytesHomogeneousUint64_a27;
+  result.a28 = returnStruct1024BytesHomogeneousUint64_a28;
+  result.a29 = returnStruct1024BytesHomogeneousUint64_a29;
+  result.a30 = returnStruct1024BytesHomogeneousUint64_a30;
+  result.a31 = returnStruct1024BytesHomogeneousUint64_a31;
+  result.a32 = returnStruct1024BytesHomogeneousUint64_a32;
+  result.a33 = returnStruct1024BytesHomogeneousUint64_a33;
+  result.a34 = returnStruct1024BytesHomogeneousUint64_a34;
+  result.a35 = returnStruct1024BytesHomogeneousUint64_a35;
+  result.a36 = returnStruct1024BytesHomogeneousUint64_a36;
+  result.a37 = returnStruct1024BytesHomogeneousUint64_a37;
+  result.a38 = returnStruct1024BytesHomogeneousUint64_a38;
+  result.a39 = returnStruct1024BytesHomogeneousUint64_a39;
+  result.a40 = returnStruct1024BytesHomogeneousUint64_a40;
+  result.a41 = returnStruct1024BytesHomogeneousUint64_a41;
+  result.a42 = returnStruct1024BytesHomogeneousUint64_a42;
+  result.a43 = returnStruct1024BytesHomogeneousUint64_a43;
+  result.a44 = returnStruct1024BytesHomogeneousUint64_a44;
+  result.a45 = returnStruct1024BytesHomogeneousUint64_a45;
+  result.a46 = returnStruct1024BytesHomogeneousUint64_a46;
+  result.a47 = returnStruct1024BytesHomogeneousUint64_a47;
+  result.a48 = returnStruct1024BytesHomogeneousUint64_a48;
+  result.a49 = returnStruct1024BytesHomogeneousUint64_a49;
+  result.a50 = returnStruct1024BytesHomogeneousUint64_a50;
+  result.a51 = returnStruct1024BytesHomogeneousUint64_a51;
+  result.a52 = returnStruct1024BytesHomogeneousUint64_a52;
+  result.a53 = returnStruct1024BytesHomogeneousUint64_a53;
+  result.a54 = returnStruct1024BytesHomogeneousUint64_a54;
+  result.a55 = returnStruct1024BytesHomogeneousUint64_a55;
+  result.a56 = returnStruct1024BytesHomogeneousUint64_a56;
+  result.a57 = returnStruct1024BytesHomogeneousUint64_a57;
+  result.a58 = returnStruct1024BytesHomogeneousUint64_a58;
+  result.a59 = returnStruct1024BytesHomogeneousUint64_a59;
+  result.a60 = returnStruct1024BytesHomogeneousUint64_a60;
+  result.a61 = returnStruct1024BytesHomogeneousUint64_a61;
+  result.a62 = returnStruct1024BytesHomogeneousUint64_a62;
+  result.a63 = returnStruct1024BytesHomogeneousUint64_a63;
+  result.a64 = returnStruct1024BytesHomogeneousUint64_a64;
+  result.a65 = returnStruct1024BytesHomogeneousUint64_a65;
+  result.a66 = returnStruct1024BytesHomogeneousUint64_a66;
+  result.a67 = returnStruct1024BytesHomogeneousUint64_a67;
+  result.a68 = returnStruct1024BytesHomogeneousUint64_a68;
+  result.a69 = returnStruct1024BytesHomogeneousUint64_a69;
+  result.a70 = returnStruct1024BytesHomogeneousUint64_a70;
+  result.a71 = returnStruct1024BytesHomogeneousUint64_a71;
+  result.a72 = returnStruct1024BytesHomogeneousUint64_a72;
+  result.a73 = returnStruct1024BytesHomogeneousUint64_a73;
+  result.a74 = returnStruct1024BytesHomogeneousUint64_a74;
+  result.a75 = returnStruct1024BytesHomogeneousUint64_a75;
+  result.a76 = returnStruct1024BytesHomogeneousUint64_a76;
+  result.a77 = returnStruct1024BytesHomogeneousUint64_a77;
+  result.a78 = returnStruct1024BytesHomogeneousUint64_a78;
+  result.a79 = returnStruct1024BytesHomogeneousUint64_a79;
+  result.a80 = returnStruct1024BytesHomogeneousUint64_a80;
+  result.a81 = returnStruct1024BytesHomogeneousUint64_a81;
+  result.a82 = returnStruct1024BytesHomogeneousUint64_a82;
+  result.a83 = returnStruct1024BytesHomogeneousUint64_a83;
+  result.a84 = returnStruct1024BytesHomogeneousUint64_a84;
+  result.a85 = returnStruct1024BytesHomogeneousUint64_a85;
+  result.a86 = returnStruct1024BytesHomogeneousUint64_a86;
+  result.a87 = returnStruct1024BytesHomogeneousUint64_a87;
+  result.a88 = returnStruct1024BytesHomogeneousUint64_a88;
+  result.a89 = returnStruct1024BytesHomogeneousUint64_a89;
+  result.a90 = returnStruct1024BytesHomogeneousUint64_a90;
+  result.a91 = returnStruct1024BytesHomogeneousUint64_a91;
+  result.a92 = returnStruct1024BytesHomogeneousUint64_a92;
+  result.a93 = returnStruct1024BytesHomogeneousUint64_a93;
+  result.a94 = returnStruct1024BytesHomogeneousUint64_a94;
+  result.a95 = returnStruct1024BytesHomogeneousUint64_a95;
+  result.a96 = returnStruct1024BytesHomogeneousUint64_a96;
+  result.a97 = returnStruct1024BytesHomogeneousUint64_a97;
+  result.a98 = returnStruct1024BytesHomogeneousUint64_a98;
+  result.a99 = returnStruct1024BytesHomogeneousUint64_a99;
+  result.a100 = returnStruct1024BytesHomogeneousUint64_a100;
+  result.a101 = returnStruct1024BytesHomogeneousUint64_a101;
+  result.a102 = returnStruct1024BytesHomogeneousUint64_a102;
+  result.a103 = returnStruct1024BytesHomogeneousUint64_a103;
+  result.a104 = returnStruct1024BytesHomogeneousUint64_a104;
+  result.a105 = returnStruct1024BytesHomogeneousUint64_a105;
+  result.a106 = returnStruct1024BytesHomogeneousUint64_a106;
+  result.a107 = returnStruct1024BytesHomogeneousUint64_a107;
+  result.a108 = returnStruct1024BytesHomogeneousUint64_a108;
+  result.a109 = returnStruct1024BytesHomogeneousUint64_a109;
+  result.a110 = returnStruct1024BytesHomogeneousUint64_a110;
+  result.a111 = returnStruct1024BytesHomogeneousUint64_a111;
+  result.a112 = returnStruct1024BytesHomogeneousUint64_a112;
+  result.a113 = returnStruct1024BytesHomogeneousUint64_a113;
+  result.a114 = returnStruct1024BytesHomogeneousUint64_a114;
+  result.a115 = returnStruct1024BytesHomogeneousUint64_a115;
+  result.a116 = returnStruct1024BytesHomogeneousUint64_a116;
+  result.a117 = returnStruct1024BytesHomogeneousUint64_a117;
+  result.a118 = returnStruct1024BytesHomogeneousUint64_a118;
+  result.a119 = returnStruct1024BytesHomogeneousUint64_a119;
+  result.a120 = returnStruct1024BytesHomogeneousUint64_a120;
+  result.a121 = returnStruct1024BytesHomogeneousUint64_a121;
+  result.a122 = returnStruct1024BytesHomogeneousUint64_a122;
+  result.a123 = returnStruct1024BytesHomogeneousUint64_a123;
+  result.a124 = returnStruct1024BytesHomogeneousUint64_a124;
+  result.a125 = returnStruct1024BytesHomogeneousUint64_a125;
+  result.a126 = returnStruct1024BytesHomogeneousUint64_a126;
+  result.a127 = returnStruct1024BytesHomogeneousUint64_a127;
+
+  returnStruct1024BytesHomogeneousUint64Result = result;
+
+  return result;
+}
+
+/// Test 1kb struct.
+Struct1024BytesHomogeneousUint64 returnStruct1024BytesHomogeneousUint64(
+    int a0,
+    int a1,
+    int a2,
+    int a3,
+    int a4,
+    int a5,
+    int a6,
+    int a7,
+    int a8,
+    int a9,
+    int a10,
+    int a11,
+    int a12,
+    int a13,
+    int a14,
+    int a15,
+    int a16,
+    int a17,
+    int a18,
+    int a19,
+    int a20,
+    int a21,
+    int a22,
+    int a23,
+    int a24,
+    int a25,
+    int a26,
+    int a27,
+    int a28,
+    int a29,
+    int a30,
+    int a31,
+    int a32,
+    int a33,
+    int a34,
+    int a35,
+    int a36,
+    int a37,
+    int a38,
+    int a39,
+    int a40,
+    int a41,
+    int a42,
+    int a43,
+    int a44,
+    int a45,
+    int a46,
+    int a47,
+    int a48,
+    int a49,
+    int a50,
+    int a51,
+    int a52,
+    int a53,
+    int a54,
+    int a55,
+    int a56,
+    int a57,
+    int a58,
+    int a59,
+    int a60,
+    int a61,
+    int a62,
+    int a63,
+    int a64,
+    int a65,
+    int a66,
+    int a67,
+    int a68,
+    int a69,
+    int a70,
+    int a71,
+    int a72,
+    int a73,
+    int a74,
+    int a75,
+    int a76,
+    int a77,
+    int a78,
+    int a79,
+    int a80,
+    int a81,
+    int a82,
+    int a83,
+    int a84,
+    int a85,
+    int a86,
+    int a87,
+    int a88,
+    int a89,
+    int a90,
+    int a91,
+    int a92,
+    int a93,
+    int a94,
+    int a95,
+    int a96,
+    int a97,
+    int a98,
+    int a99,
+    int a100,
+    int a101,
+    int a102,
+    int a103,
+    int a104,
+    int a105,
+    int a106,
+    int a107,
+    int a108,
+    int a109,
+    int a110,
+    int a111,
+    int a112,
+    int a113,
+    int a114,
+    int a115,
+    int a116,
+    int a117,
+    int a118,
+    int a119,
+    int a120,
+    int a121,
+    int a122,
+    int a123,
+    int a124,
+    int a125,
+    int a126,
+    int a127) {
+  print(
+      "returnStruct1024BytesHomogeneousUint64(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5}, ${a6}, ${a7}, ${a8}, ${a9}, ${a10}, ${a11}, ${a12}, ${a13}, ${a14}, ${a15}, ${a16}, ${a17}, ${a18}, ${a19}, ${a20}, ${a21}, ${a22}, ${a23}, ${a24}, ${a25}, ${a26}, ${a27}, ${a28}, ${a29}, ${a30}, ${a31}, ${a32}, ${a33}, ${a34}, ${a35}, ${a36}, ${a37}, ${a38}, ${a39}, ${a40}, ${a41}, ${a42}, ${a43}, ${a44}, ${a45}, ${a46}, ${a47}, ${a48}, ${a49}, ${a50}, ${a51}, ${a52}, ${a53}, ${a54}, ${a55}, ${a56}, ${a57}, ${a58}, ${a59}, ${a60}, ${a61}, ${a62}, ${a63}, ${a64}, ${a65}, ${a66}, ${a67}, ${a68}, ${a69}, ${a70}, ${a71}, ${a72}, ${a73}, ${a74}, ${a75}, ${a76}, ${a77}, ${a78}, ${a79}, ${a80}, ${a81}, ${a82}, ${a83}, ${a84}, ${a85}, ${a86}, ${a87}, ${a88}, ${a89}, ${a90}, ${a91}, ${a92}, ${a93}, ${a94}, ${a95}, ${a96}, ${a97}, ${a98}, ${a99}, ${a100}, ${a101}, ${a102}, ${a103}, ${a104}, ${a105}, ${a106}, ${a107}, ${a108}, ${a109}, ${a110}, ${a111}, ${a112}, ${a113}, ${a114}, ${a115}, ${a116}, ${a117}, ${a118}, ${a119}, ${a120}, ${a121}, ${a122}, ${a123}, ${a124}, ${a125}, ${a126}, ${a127})");
+
+  // In legacy mode, possibly return null.
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0 == 42 || a0 == 84) {
+    print("throwing!");
+    throw Exception(
+        "ReturnStruct1024BytesHomogeneousUint64 throwing on purpuse!");
+  }
+
+  returnStruct1024BytesHomogeneousUint64_a0 = a0;
+  returnStruct1024BytesHomogeneousUint64_a1 = a1;
+  returnStruct1024BytesHomogeneousUint64_a2 = a2;
+  returnStruct1024BytesHomogeneousUint64_a3 = a3;
+  returnStruct1024BytesHomogeneousUint64_a4 = a4;
+  returnStruct1024BytesHomogeneousUint64_a5 = a5;
+  returnStruct1024BytesHomogeneousUint64_a6 = a6;
+  returnStruct1024BytesHomogeneousUint64_a7 = a7;
+  returnStruct1024BytesHomogeneousUint64_a8 = a8;
+  returnStruct1024BytesHomogeneousUint64_a9 = a9;
+  returnStruct1024BytesHomogeneousUint64_a10 = a10;
+  returnStruct1024BytesHomogeneousUint64_a11 = a11;
+  returnStruct1024BytesHomogeneousUint64_a12 = a12;
+  returnStruct1024BytesHomogeneousUint64_a13 = a13;
+  returnStruct1024BytesHomogeneousUint64_a14 = a14;
+  returnStruct1024BytesHomogeneousUint64_a15 = a15;
+  returnStruct1024BytesHomogeneousUint64_a16 = a16;
+  returnStruct1024BytesHomogeneousUint64_a17 = a17;
+  returnStruct1024BytesHomogeneousUint64_a18 = a18;
+  returnStruct1024BytesHomogeneousUint64_a19 = a19;
+  returnStruct1024BytesHomogeneousUint64_a20 = a20;
+  returnStruct1024BytesHomogeneousUint64_a21 = a21;
+  returnStruct1024BytesHomogeneousUint64_a22 = a22;
+  returnStruct1024BytesHomogeneousUint64_a23 = a23;
+  returnStruct1024BytesHomogeneousUint64_a24 = a24;
+  returnStruct1024BytesHomogeneousUint64_a25 = a25;
+  returnStruct1024BytesHomogeneousUint64_a26 = a26;
+  returnStruct1024BytesHomogeneousUint64_a27 = a27;
+  returnStruct1024BytesHomogeneousUint64_a28 = a28;
+  returnStruct1024BytesHomogeneousUint64_a29 = a29;
+  returnStruct1024BytesHomogeneousUint64_a30 = a30;
+  returnStruct1024BytesHomogeneousUint64_a31 = a31;
+  returnStruct1024BytesHomogeneousUint64_a32 = a32;
+  returnStruct1024BytesHomogeneousUint64_a33 = a33;
+  returnStruct1024BytesHomogeneousUint64_a34 = a34;
+  returnStruct1024BytesHomogeneousUint64_a35 = a35;
+  returnStruct1024BytesHomogeneousUint64_a36 = a36;
+  returnStruct1024BytesHomogeneousUint64_a37 = a37;
+  returnStruct1024BytesHomogeneousUint64_a38 = a38;
+  returnStruct1024BytesHomogeneousUint64_a39 = a39;
+  returnStruct1024BytesHomogeneousUint64_a40 = a40;
+  returnStruct1024BytesHomogeneousUint64_a41 = a41;
+  returnStruct1024BytesHomogeneousUint64_a42 = a42;
+  returnStruct1024BytesHomogeneousUint64_a43 = a43;
+  returnStruct1024BytesHomogeneousUint64_a44 = a44;
+  returnStruct1024BytesHomogeneousUint64_a45 = a45;
+  returnStruct1024BytesHomogeneousUint64_a46 = a46;
+  returnStruct1024BytesHomogeneousUint64_a47 = a47;
+  returnStruct1024BytesHomogeneousUint64_a48 = a48;
+  returnStruct1024BytesHomogeneousUint64_a49 = a49;
+  returnStruct1024BytesHomogeneousUint64_a50 = a50;
+  returnStruct1024BytesHomogeneousUint64_a51 = a51;
+  returnStruct1024BytesHomogeneousUint64_a52 = a52;
+  returnStruct1024BytesHomogeneousUint64_a53 = a53;
+  returnStruct1024BytesHomogeneousUint64_a54 = a54;
+  returnStruct1024BytesHomogeneousUint64_a55 = a55;
+  returnStruct1024BytesHomogeneousUint64_a56 = a56;
+  returnStruct1024BytesHomogeneousUint64_a57 = a57;
+  returnStruct1024BytesHomogeneousUint64_a58 = a58;
+  returnStruct1024BytesHomogeneousUint64_a59 = a59;
+  returnStruct1024BytesHomogeneousUint64_a60 = a60;
+  returnStruct1024BytesHomogeneousUint64_a61 = a61;
+  returnStruct1024BytesHomogeneousUint64_a62 = a62;
+  returnStruct1024BytesHomogeneousUint64_a63 = a63;
+  returnStruct1024BytesHomogeneousUint64_a64 = a64;
+  returnStruct1024BytesHomogeneousUint64_a65 = a65;
+  returnStruct1024BytesHomogeneousUint64_a66 = a66;
+  returnStruct1024BytesHomogeneousUint64_a67 = a67;
+  returnStruct1024BytesHomogeneousUint64_a68 = a68;
+  returnStruct1024BytesHomogeneousUint64_a69 = a69;
+  returnStruct1024BytesHomogeneousUint64_a70 = a70;
+  returnStruct1024BytesHomogeneousUint64_a71 = a71;
+  returnStruct1024BytesHomogeneousUint64_a72 = a72;
+  returnStruct1024BytesHomogeneousUint64_a73 = a73;
+  returnStruct1024BytesHomogeneousUint64_a74 = a74;
+  returnStruct1024BytesHomogeneousUint64_a75 = a75;
+  returnStruct1024BytesHomogeneousUint64_a76 = a76;
+  returnStruct1024BytesHomogeneousUint64_a77 = a77;
+  returnStruct1024BytesHomogeneousUint64_a78 = a78;
+  returnStruct1024BytesHomogeneousUint64_a79 = a79;
+  returnStruct1024BytesHomogeneousUint64_a80 = a80;
+  returnStruct1024BytesHomogeneousUint64_a81 = a81;
+  returnStruct1024BytesHomogeneousUint64_a82 = a82;
+  returnStruct1024BytesHomogeneousUint64_a83 = a83;
+  returnStruct1024BytesHomogeneousUint64_a84 = a84;
+  returnStruct1024BytesHomogeneousUint64_a85 = a85;
+  returnStruct1024BytesHomogeneousUint64_a86 = a86;
+  returnStruct1024BytesHomogeneousUint64_a87 = a87;
+  returnStruct1024BytesHomogeneousUint64_a88 = a88;
+  returnStruct1024BytesHomogeneousUint64_a89 = a89;
+  returnStruct1024BytesHomogeneousUint64_a90 = a90;
+  returnStruct1024BytesHomogeneousUint64_a91 = a91;
+  returnStruct1024BytesHomogeneousUint64_a92 = a92;
+  returnStruct1024BytesHomogeneousUint64_a93 = a93;
+  returnStruct1024BytesHomogeneousUint64_a94 = a94;
+  returnStruct1024BytesHomogeneousUint64_a95 = a95;
+  returnStruct1024BytesHomogeneousUint64_a96 = a96;
+  returnStruct1024BytesHomogeneousUint64_a97 = a97;
+  returnStruct1024BytesHomogeneousUint64_a98 = a98;
+  returnStruct1024BytesHomogeneousUint64_a99 = a99;
+  returnStruct1024BytesHomogeneousUint64_a100 = a100;
+  returnStruct1024BytesHomogeneousUint64_a101 = a101;
+  returnStruct1024BytesHomogeneousUint64_a102 = a102;
+  returnStruct1024BytesHomogeneousUint64_a103 = a103;
+  returnStruct1024BytesHomogeneousUint64_a104 = a104;
+  returnStruct1024BytesHomogeneousUint64_a105 = a105;
+  returnStruct1024BytesHomogeneousUint64_a106 = a106;
+  returnStruct1024BytesHomogeneousUint64_a107 = a107;
+  returnStruct1024BytesHomogeneousUint64_a108 = a108;
+  returnStruct1024BytesHomogeneousUint64_a109 = a109;
+  returnStruct1024BytesHomogeneousUint64_a110 = a110;
+  returnStruct1024BytesHomogeneousUint64_a111 = a111;
+  returnStruct1024BytesHomogeneousUint64_a112 = a112;
+  returnStruct1024BytesHomogeneousUint64_a113 = a113;
+  returnStruct1024BytesHomogeneousUint64_a114 = a114;
+  returnStruct1024BytesHomogeneousUint64_a115 = a115;
+  returnStruct1024BytesHomogeneousUint64_a116 = a116;
+  returnStruct1024BytesHomogeneousUint64_a117 = a117;
+  returnStruct1024BytesHomogeneousUint64_a118 = a118;
+  returnStruct1024BytesHomogeneousUint64_a119 = a119;
+  returnStruct1024BytesHomogeneousUint64_a120 = a120;
+  returnStruct1024BytesHomogeneousUint64_a121 = a121;
+  returnStruct1024BytesHomogeneousUint64_a122 = a122;
+  returnStruct1024BytesHomogeneousUint64_a123 = a123;
+  returnStruct1024BytesHomogeneousUint64_a124 = a124;
+  returnStruct1024BytesHomogeneousUint64_a125 = a125;
+  returnStruct1024BytesHomogeneousUint64_a126 = a126;
+  returnStruct1024BytesHomogeneousUint64_a127 = a127;
+
+  final result = returnStruct1024BytesHomogeneousUint64CalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void returnStruct1024BytesHomogeneousUint64AfterCallback() {
+  free(returnStruct1024BytesHomogeneousUint64Result.addressOf);
+
+  final result = returnStruct1024BytesHomogeneousUint64CalculateResult();
+
+  print("after callback result = $result");
+
+  free(returnStruct1024BytesHomogeneousUint64Result.addressOf);
+}
+
+typedef ReturnStructArgumentStruct1ByteIntType = Struct1ByteInt Function(
+    Struct1ByteInt);
+
+// Global variables to be able to test inputs after callback returned.
+Struct1ByteInt returnStructArgumentStruct1ByteInt_a0 = Struct1ByteInt();
+
+// Result variable also global, so we can delete it after the callback.
+Struct1ByteInt returnStructArgumentStruct1ByteIntResult = Struct1ByteInt();
+
+Struct1ByteInt returnStructArgumentStruct1ByteIntCalculateResult() {
+  Struct1ByteInt result = returnStructArgumentStruct1ByteInt_a0;
+
+  returnStructArgumentStruct1ByteIntResult = result;
+
+  return result;
+}
+
+/// Test that a struct passed in as argument can be returned.
+/// Especially for ffi callbacks.
+/// Struct is passed in int registers in most ABIs.
+Struct1ByteInt returnStructArgumentStruct1ByteInt(Struct1ByteInt a0) {
+  print("returnStructArgumentStruct1ByteInt(${a0})");
+
+  // In legacy mode, possibly return null.
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0.a0 == 42 || a0.a0 == 84) {
+    print("throwing!");
+    throw Exception("ReturnStructArgumentStruct1ByteInt throwing on purpuse!");
+  }
+
+  returnStructArgumentStruct1ByteInt_a0 = a0;
+
+  final result = returnStructArgumentStruct1ByteIntCalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void returnStructArgumentStruct1ByteIntAfterCallback() {
+  final result = returnStructArgumentStruct1ByteIntCalculateResult();
+
+  print("after callback result = $result");
+}
+
+typedef ReturnStructArgumentInt32x8Struct1ByteIntType = Struct1ByteInt Function(
+    Int32, Int32, Int32, Int32, Int32, Int32, Int32, Int32, Struct1ByteInt);
+
+// Global variables to be able to test inputs after callback returned.
+int returnStructArgumentInt32x8Struct1ByteInt_a0 = 0;
+int returnStructArgumentInt32x8Struct1ByteInt_a1 = 0;
+int returnStructArgumentInt32x8Struct1ByteInt_a2 = 0;
+int returnStructArgumentInt32x8Struct1ByteInt_a3 = 0;
+int returnStructArgumentInt32x8Struct1ByteInt_a4 = 0;
+int returnStructArgumentInt32x8Struct1ByteInt_a5 = 0;
+int returnStructArgumentInt32x8Struct1ByteInt_a6 = 0;
+int returnStructArgumentInt32x8Struct1ByteInt_a7 = 0;
+Struct1ByteInt returnStructArgumentInt32x8Struct1ByteInt_a8 = Struct1ByteInt();
+
+// Result variable also global, so we can delete it after the callback.
+Struct1ByteInt returnStructArgumentInt32x8Struct1ByteIntResult =
+    Struct1ByteInt();
+
+Struct1ByteInt returnStructArgumentInt32x8Struct1ByteIntCalculateResult() {
+  Struct1ByteInt result = returnStructArgumentInt32x8Struct1ByteInt_a8;
+
+  returnStructArgumentInt32x8Struct1ByteIntResult = result;
+
+  return result;
+}
+
+/// Test that a struct passed in as argument can be returned.
+/// Especially for ffi callbacks.
+/// Struct is passed on stack on all ABIs.
+Struct1ByteInt returnStructArgumentInt32x8Struct1ByteInt(int a0, int a1, int a2,
+    int a3, int a4, int a5, int a6, int a7, Struct1ByteInt a8) {
+  print(
+      "returnStructArgumentInt32x8Struct1ByteInt(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5}, ${a6}, ${a7}, ${a8})");
+
+  // In legacy mode, possibly return null.
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0 == 42 || a0 == 84) {
+    print("throwing!");
+    throw Exception(
+        "ReturnStructArgumentInt32x8Struct1ByteInt throwing on purpuse!");
+  }
+
+  returnStructArgumentInt32x8Struct1ByteInt_a0 = a0;
+  returnStructArgumentInt32x8Struct1ByteInt_a1 = a1;
+  returnStructArgumentInt32x8Struct1ByteInt_a2 = a2;
+  returnStructArgumentInt32x8Struct1ByteInt_a3 = a3;
+  returnStructArgumentInt32x8Struct1ByteInt_a4 = a4;
+  returnStructArgumentInt32x8Struct1ByteInt_a5 = a5;
+  returnStructArgumentInt32x8Struct1ByteInt_a6 = a6;
+  returnStructArgumentInt32x8Struct1ByteInt_a7 = a7;
+  returnStructArgumentInt32x8Struct1ByteInt_a8 = a8;
+
+  final result = returnStructArgumentInt32x8Struct1ByteIntCalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void returnStructArgumentInt32x8Struct1ByteIntAfterCallback() {
+  final result = returnStructArgumentInt32x8Struct1ByteIntCalculateResult();
+
+  print("after callback result = $result");
+}
+
+typedef ReturnStructArgumentStruct8BytesHomogeneousFloatType
+    = Struct8BytesHomogeneousFloat Function(Struct8BytesHomogeneousFloat);
+
+// Global variables to be able to test inputs after callback returned.
+Struct8BytesHomogeneousFloat
+    returnStructArgumentStruct8BytesHomogeneousFloat_a0 =
+    Struct8BytesHomogeneousFloat();
+
+// Result variable also global, so we can delete it after the callback.
+Struct8BytesHomogeneousFloat
+    returnStructArgumentStruct8BytesHomogeneousFloatResult =
+    Struct8BytesHomogeneousFloat();
+
+Struct8BytesHomogeneousFloat
+    returnStructArgumentStruct8BytesHomogeneousFloatCalculateResult() {
+  Struct8BytesHomogeneousFloat result =
+      returnStructArgumentStruct8BytesHomogeneousFloat_a0;
+
+  returnStructArgumentStruct8BytesHomogeneousFloatResult = result;
+
+  return result;
+}
+
+/// Test that a struct passed in as argument can be returned.
+/// Especially for ffi callbacks.
+/// Struct is passed in float registers in most ABIs.
+Struct8BytesHomogeneousFloat returnStructArgumentStruct8BytesHomogeneousFloat(
+    Struct8BytesHomogeneousFloat a0) {
+  print("returnStructArgumentStruct8BytesHomogeneousFloat(${a0})");
+
+  // In legacy mode, possibly return null.
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0.a0 == 42 || a0.a0 == 84) {
+    print("throwing!");
+    throw Exception(
+        "ReturnStructArgumentStruct8BytesHomogeneousFloat throwing on purpuse!");
+  }
+
+  returnStructArgumentStruct8BytesHomogeneousFloat_a0 = a0;
+
+  final result =
+      returnStructArgumentStruct8BytesHomogeneousFloatCalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void returnStructArgumentStruct8BytesHomogeneousFloatAfterCallback() {
+  final result =
+      returnStructArgumentStruct8BytesHomogeneousFloatCalculateResult();
+
+  print("after callback result = $result");
+}
+
+typedef ReturnStructArgumentStruct20BytesHomogeneousInt32Type
+    = Struct20BytesHomogeneousInt32 Function(Struct20BytesHomogeneousInt32);
+
+// Global variables to be able to test inputs after callback returned.
+Struct20BytesHomogeneousInt32
+    returnStructArgumentStruct20BytesHomogeneousInt32_a0 =
+    Struct20BytesHomogeneousInt32();
+
+// Result variable also global, so we can delete it after the callback.
+Struct20BytesHomogeneousInt32
+    returnStructArgumentStruct20BytesHomogeneousInt32Result =
+    Struct20BytesHomogeneousInt32();
+
+Struct20BytesHomogeneousInt32
+    returnStructArgumentStruct20BytesHomogeneousInt32CalculateResult() {
+  Struct20BytesHomogeneousInt32 result =
+      returnStructArgumentStruct20BytesHomogeneousInt32_a0;
+
+  returnStructArgumentStruct20BytesHomogeneousInt32Result = result;
+
+  return result;
+}
+
+/// On arm64, both argument and return value are passed in by pointer.
+Struct20BytesHomogeneousInt32 returnStructArgumentStruct20BytesHomogeneousInt32(
+    Struct20BytesHomogeneousInt32 a0) {
+  print("returnStructArgumentStruct20BytesHomogeneousInt32(${a0})");
+
+  // In legacy mode, possibly return null.
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0.a0 == 42 || a0.a0 == 84) {
+    print("throwing!");
+    throw Exception(
+        "ReturnStructArgumentStruct20BytesHomogeneousInt32 throwing on purpuse!");
+  }
+
+  returnStructArgumentStruct20BytesHomogeneousInt32_a0 = a0;
+
+  final result =
+      returnStructArgumentStruct20BytesHomogeneousInt32CalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void returnStructArgumentStruct20BytesHomogeneousInt32AfterCallback() {
+  final result =
+      returnStructArgumentStruct20BytesHomogeneousInt32CalculateResult();
+
+  print("after callback result = $result");
+}
+
+typedef ReturnStructArgumentInt32x8Struct20BytesHomogeneouType
+    = Struct20BytesHomogeneousInt32 Function(Int32, Int32, Int32, Int32, Int32,
+        Int32, Int32, Int32, Struct20BytesHomogeneousInt32);
+
+// Global variables to be able to test inputs after callback returned.
+int returnStructArgumentInt32x8Struct20BytesHomogeneou_a0 = 0;
+int returnStructArgumentInt32x8Struct20BytesHomogeneou_a1 = 0;
+int returnStructArgumentInt32x8Struct20BytesHomogeneou_a2 = 0;
+int returnStructArgumentInt32x8Struct20BytesHomogeneou_a3 = 0;
+int returnStructArgumentInt32x8Struct20BytesHomogeneou_a4 = 0;
+int returnStructArgumentInt32x8Struct20BytesHomogeneou_a5 = 0;
+int returnStructArgumentInt32x8Struct20BytesHomogeneou_a6 = 0;
+int returnStructArgumentInt32x8Struct20BytesHomogeneou_a7 = 0;
+Struct20BytesHomogeneousInt32
+    returnStructArgumentInt32x8Struct20BytesHomogeneou_a8 =
+    Struct20BytesHomogeneousInt32();
+
+// Result variable also global, so we can delete it after the callback.
+Struct20BytesHomogeneousInt32
+    returnStructArgumentInt32x8Struct20BytesHomogeneouResult =
+    Struct20BytesHomogeneousInt32();
+
+Struct20BytesHomogeneousInt32
+    returnStructArgumentInt32x8Struct20BytesHomogeneouCalculateResult() {
+  Struct20BytesHomogeneousInt32 result =
+      returnStructArgumentInt32x8Struct20BytesHomogeneou_a8;
+
+  returnStructArgumentInt32x8Struct20BytesHomogeneouResult = result;
+
+  return result;
+}
+
+/// On arm64, both argument and return value are passed in by pointer.
+/// Ints exhaust registers, so that pointer is passed on stack.
+Struct20BytesHomogeneousInt32
+    returnStructArgumentInt32x8Struct20BytesHomogeneou(
+        int a0,
+        int a1,
+        int a2,
+        int a3,
+        int a4,
+        int a5,
+        int a6,
+        int a7,
+        Struct20BytesHomogeneousInt32 a8) {
+  print(
+      "returnStructArgumentInt32x8Struct20BytesHomogeneou(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5}, ${a6}, ${a7}, ${a8})");
+
+  // In legacy mode, possibly return null.
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0 == 42 || a0 == 84) {
+    print("throwing!");
+    throw Exception(
+        "ReturnStructArgumentInt32x8Struct20BytesHomogeneou throwing on purpuse!");
+  }
+
+  returnStructArgumentInt32x8Struct20BytesHomogeneou_a0 = a0;
+  returnStructArgumentInt32x8Struct20BytesHomogeneou_a1 = a1;
+  returnStructArgumentInt32x8Struct20BytesHomogeneou_a2 = a2;
+  returnStructArgumentInt32x8Struct20BytesHomogeneou_a3 = a3;
+  returnStructArgumentInt32x8Struct20BytesHomogeneou_a4 = a4;
+  returnStructArgumentInt32x8Struct20BytesHomogeneou_a5 = a5;
+  returnStructArgumentInt32x8Struct20BytesHomogeneou_a6 = a6;
+  returnStructArgumentInt32x8Struct20BytesHomogeneou_a7 = a7;
+  returnStructArgumentInt32x8Struct20BytesHomogeneou_a8 = a8;
+
+  final result =
+      returnStructArgumentInt32x8Struct20BytesHomogeneouCalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void returnStructArgumentInt32x8Struct20BytesHomogeneouAfterCallback() {
+  final result =
+      returnStructArgumentInt32x8Struct20BytesHomogeneouCalculateResult();
+
+  print("after callback result = $result");
+}
+
+typedef ReturnStructAlignmentInt16Type = StructAlignmentInt16 Function(
+    Int8, Int16, Int8);
+
+// Global variables to be able to test inputs after callback returned.
+int returnStructAlignmentInt16_a0 = 0;
+int returnStructAlignmentInt16_a1 = 0;
+int returnStructAlignmentInt16_a2 = 0;
+
+// Result variable also global, so we can delete it after the callback.
+StructAlignmentInt16 returnStructAlignmentInt16Result = StructAlignmentInt16();
+
+StructAlignmentInt16 returnStructAlignmentInt16CalculateResult() {
+  StructAlignmentInt16 result = allocate<StructAlignmentInt16>().ref;
+
+  result.a0 = returnStructAlignmentInt16_a0;
+  result.a1 = returnStructAlignmentInt16_a1;
+  result.a2 = returnStructAlignmentInt16_a2;
+
+  returnStructAlignmentInt16Result = result;
+
+  return result;
+}
+
+/// Test alignment and padding of 16 byte int within struct.
+StructAlignmentInt16 returnStructAlignmentInt16(int a0, int a1, int a2) {
+  print("returnStructAlignmentInt16(${a0}, ${a1}, ${a2})");
+
+  // In legacy mode, possibly return null.
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0 == 42 || a0 == 84) {
+    print("throwing!");
+    throw Exception("ReturnStructAlignmentInt16 throwing on purpuse!");
+  }
+
+  returnStructAlignmentInt16_a0 = a0;
+  returnStructAlignmentInt16_a1 = a1;
+  returnStructAlignmentInt16_a2 = a2;
+
+  final result = returnStructAlignmentInt16CalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void returnStructAlignmentInt16AfterCallback() {
+  free(returnStructAlignmentInt16Result.addressOf);
+
+  final result = returnStructAlignmentInt16CalculateResult();
+
+  print("after callback result = $result");
+
+  free(returnStructAlignmentInt16Result.addressOf);
+}
+
+typedef ReturnStructAlignmentInt32Type = StructAlignmentInt32 Function(
+    Int8, Int32, Int8);
+
+// Global variables to be able to test inputs after callback returned.
+int returnStructAlignmentInt32_a0 = 0;
+int returnStructAlignmentInt32_a1 = 0;
+int returnStructAlignmentInt32_a2 = 0;
+
+// Result variable also global, so we can delete it after the callback.
+StructAlignmentInt32 returnStructAlignmentInt32Result = StructAlignmentInt32();
+
+StructAlignmentInt32 returnStructAlignmentInt32CalculateResult() {
+  StructAlignmentInt32 result = allocate<StructAlignmentInt32>().ref;
+
+  result.a0 = returnStructAlignmentInt32_a0;
+  result.a1 = returnStructAlignmentInt32_a1;
+  result.a2 = returnStructAlignmentInt32_a2;
+
+  returnStructAlignmentInt32Result = result;
+
+  return result;
+}
+
+/// Test alignment and padding of 32 byte int within struct.
+StructAlignmentInt32 returnStructAlignmentInt32(int a0, int a1, int a2) {
+  print("returnStructAlignmentInt32(${a0}, ${a1}, ${a2})");
+
+  // In legacy mode, possibly return null.
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0 == 42 || a0 == 84) {
+    print("throwing!");
+    throw Exception("ReturnStructAlignmentInt32 throwing on purpuse!");
+  }
+
+  returnStructAlignmentInt32_a0 = a0;
+  returnStructAlignmentInt32_a1 = a1;
+  returnStructAlignmentInt32_a2 = a2;
+
+  final result = returnStructAlignmentInt32CalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void returnStructAlignmentInt32AfterCallback() {
+  free(returnStructAlignmentInt32Result.addressOf);
+
+  final result = returnStructAlignmentInt32CalculateResult();
+
+  print("after callback result = $result");
+
+  free(returnStructAlignmentInt32Result.addressOf);
+}
+
+typedef ReturnStructAlignmentInt64Type = StructAlignmentInt64 Function(
+    Int8, Int64, Int8);
+
+// Global variables to be able to test inputs after callback returned.
+int returnStructAlignmentInt64_a0 = 0;
+int returnStructAlignmentInt64_a1 = 0;
+int returnStructAlignmentInt64_a2 = 0;
+
+// Result variable also global, so we can delete it after the callback.
+StructAlignmentInt64 returnStructAlignmentInt64Result = StructAlignmentInt64();
+
+StructAlignmentInt64 returnStructAlignmentInt64CalculateResult() {
+  StructAlignmentInt64 result = allocate<StructAlignmentInt64>().ref;
+
+  result.a0 = returnStructAlignmentInt64_a0;
+  result.a1 = returnStructAlignmentInt64_a1;
+  result.a2 = returnStructAlignmentInt64_a2;
+
+  returnStructAlignmentInt64Result = result;
+
+  return result;
+}
+
+/// Test alignment and padding of 64 byte int within struct.
+StructAlignmentInt64 returnStructAlignmentInt64(int a0, int a1, int a2) {
+  print("returnStructAlignmentInt64(${a0}, ${a1}, ${a2})");
+
+  // In legacy mode, possibly return null.
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0 == 42 || a0 == 84) {
+    print("throwing!");
+    throw Exception("ReturnStructAlignmentInt64 throwing on purpuse!");
+  }
+
+  returnStructAlignmentInt64_a0 = a0;
+  returnStructAlignmentInt64_a1 = a1;
+  returnStructAlignmentInt64_a2 = a2;
+
+  final result = returnStructAlignmentInt64CalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void returnStructAlignmentInt64AfterCallback() {
+  free(returnStructAlignmentInt64Result.addressOf);
+
+  final result = returnStructAlignmentInt64CalculateResult();
+
+  print("after callback result = $result");
+
+  free(returnStructAlignmentInt64Result.addressOf);
+}
diff --git a/tests/ffi/function_callbacks_structs_by_value_test.dart b/tests/ffi/function_callbacks_structs_by_value_test.dart
new file mode 100644
index 0000000..98ab518
--- /dev/null
+++ b/tests/ffi/function_callbacks_structs_by_value_test.dart
@@ -0,0 +1,71 @@
+// Copyright (c) 2020, 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.
+//
+// SharedObjects=ffi_test_functions
+//
+// VMOptions=--deterministic --optimization-counter-threshold=5 --use-slow-path --stacktrace-every=100
+
+import 'dart:ffi';
+
+import "package:expect/expect.dart";
+import "package:ffi/ffi.dart";
+
+// Reuse the struct classes.
+import 'function_structs_by_value_generated_test.dart';
+
+void main() {
+  for (int i = 0; i < 10; i++) {
+    recursiveTest(10);
+    recursiveTest(11);
+  }
+}
+
+void recursiveTest(int recursionCounter) {
+  final struct = allocate<Struct20BytesHomogeneousInt32>().ref;
+  struct.a0 = 1;
+  struct.a1 = 2;
+  struct.a2 = 3;
+  struct.a3 = 4;
+  struct.a4 = 5;
+  final result = dartPassStructRecursive(recursionCounter, struct);
+  Expect.equals(struct.a0 + recursionCounter * 2, result.a0);
+  Expect.equals(struct.a1, result.a1);
+  Expect.equals(struct.a2, result.a2);
+  Expect.equals(struct.a3, result.a3);
+  Expect.equals(struct.a4, result.a4);
+  free(struct.addressOf);
+}
+
+Struct20BytesHomogeneousInt32 dartPassStructRecursive(
+    int recursionCounter, Struct20BytesHomogeneousInt32 struct) {
+  print("callbackPassStructRecurisive($recursionCounter, $struct)");
+  struct.a0++;
+  final structA0Saved = struct.a0;
+  if (recursionCounter <= 0) {
+    print("returning");
+    return struct;
+  }
+
+  final result =
+      cPassStructRecursive(recursionCounter - 1, struct, functionPointer);
+  result.a0++;
+
+  // Check struct.a0 is not modified by Dart->C call.
+  Expect.equals(structA0Saved, struct.a0);
+
+  // Check struct.a0 is not modified by C->Dart callback, if so struct.a4 == 0.
+  Expect.notEquals(0, struct.a4);
+
+  return result;
+}
+
+final functionPointer = Pointer.fromFunction<
+    Struct20BytesHomogeneousInt32 Function(
+        Int64, Struct20BytesHomogeneousInt32)>(dartPassStructRecursive);
+
+final cPassStructRecursive = ffiTestFunctions.lookupFunction<
+    Struct20BytesHomogeneousInt32 Function(Int64 recursionCounter,
+        Struct20BytesHomogeneousInt32 struct, Pointer callbackAddress),
+    Struct20BytesHomogeneousInt32 Function(int recursionCounter,
+        Struct20BytesHomogeneousInt32, Pointer)>("PassStructRecursive");
diff --git a/tests/ffi/function_structs_by_value_generated_test.dart b/tests/ffi/function_structs_by_value_generated_test.dart
new file mode 100644
index 0000000..35936e9
--- /dev/null
+++ b/tests/ffi/function_structs_by_value_generated_test.dart
@@ -0,0 +1,5321 @@
+// Copyright (c) 2020, 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.
+//
+// This file has been automatically generated. Please do not edit it manually.
+//
+// SharedObjects=ffi_test_functions
+// VMOptions=
+// VMOptions=--deterministic --optimization-counter-threshold=5
+// VMOptions=--use-slow-path
+// VMOptions=--use-slow-path --stacktrace-every=100
+
+import 'dart:ffi';
+
+import "package:expect/expect.dart";
+import "package:ffi/ffi.dart";
+
+import 'dylib_utils.dart';
+
+final ffiTestFunctions = dlopenPlatformSpecific("ffi_test_functions");
+void main() {
+  for (int i = 0; i < 10; ++i) {
+    testPassStruct1ByteIntx10();
+    testPassStruct3BytesHomogeneousUint8x10();
+    testPassStruct3BytesInt2ByteAlignedx10();
+    testPassStruct4BytesHomogeneousInt16x10();
+    testPassStruct7BytesHomogeneousUint8x10();
+    testPassStruct7BytesInt4ByteAlignedx10();
+    testPassStruct8BytesIntx10();
+    testPassStruct8BytesHomogeneousFloatx10();
+    testPassStruct8BytesMixedx10();
+    testPassStruct9BytesHomogeneousUint8x10();
+    testPassStruct9BytesInt4Or8ByteAlignedx10();
+    testPassStruct12BytesHomogeneousFloatx6();
+    testPassStruct16BytesHomogeneousFloatx5();
+    testPassStruct16BytesMixedx10();
+    testPassStruct16BytesMixed2x10();
+    testPassStruct17BytesIntx10();
+    testPassStruct19BytesHomogeneousUint8x10();
+    testPassStruct20BytesHomogeneousInt32x10();
+    testPassStruct20BytesHomogeneousFloat();
+    testPassStruct32BytesHomogeneousDoublex5();
+    testPassStruct40BytesHomogeneousDouble();
+    testPassStruct1024BytesHomogeneousUint64();
+    testPassFloatStruct16BytesHomogeneousFloatFloatStruct1();
+    testPassFloatStruct32BytesHomogeneousDoubleFloatStruct();
+    testPassInt8Struct16BytesMixedInt8Struct16BytesMixedIn();
+    testPassDoublex6Struct16BytesMixedx4Int32();
+    testPassInt32x4Struct16BytesMixedx4Double();
+    testPassStruct40BytesHomogeneousDoubleStruct4BytesHomo();
+    testPassInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int();
+    testPassStructAlignmentInt16();
+    testPassStructAlignmentInt32();
+    testPassStructAlignmentInt64();
+    testReturnStruct1ByteInt();
+    testReturnStruct3BytesHomogeneousUint8();
+    testReturnStruct3BytesInt2ByteAligned();
+    testReturnStruct4BytesHomogeneousInt16();
+    testReturnStruct7BytesHomogeneousUint8();
+    testReturnStruct7BytesInt4ByteAligned();
+    testReturnStruct8BytesInt();
+    testReturnStruct8BytesHomogeneousFloat();
+    testReturnStruct8BytesMixed();
+    testReturnStruct9BytesHomogeneousUint8();
+    testReturnStruct9BytesInt4Or8ByteAligned();
+    testReturnStruct12BytesHomogeneousFloat();
+    testReturnStruct16BytesHomogeneousFloat();
+    testReturnStruct16BytesMixed();
+    testReturnStruct16BytesMixed2();
+    testReturnStruct17BytesInt();
+    testReturnStruct19BytesHomogeneousUint8();
+    testReturnStruct20BytesHomogeneousInt32();
+    testReturnStruct20BytesHomogeneousFloat();
+    testReturnStruct32BytesHomogeneousDouble();
+    testReturnStruct40BytesHomogeneousDouble();
+    testReturnStruct1024BytesHomogeneousUint64();
+    testReturnStructArgumentStruct1ByteInt();
+    testReturnStructArgumentInt32x8Struct1ByteInt();
+    testReturnStructArgumentStruct8BytesHomogeneousFloat();
+    testReturnStructArgumentStruct20BytesHomogeneousInt32();
+    testReturnStructArgumentInt32x8Struct20BytesHomogeneou();
+    testReturnStructAlignmentInt16();
+    testReturnStructAlignmentInt32();
+    testReturnStructAlignmentInt64();
+  }
+}
+
+class Struct0Bytes extends Struct {
+  String toString() => "()";
+}
+
+class Struct1ByteInt extends Struct {
+  @Int8()
+  external int a0;
+
+  String toString() => "(${a0})";
+}
+
+class Struct3BytesHomogeneousUint8 extends Struct {
+  @Uint8()
+  external int a0;
+
+  @Uint8()
+  external int a1;
+
+  @Uint8()
+  external int a2;
+
+  String toString() => "(${a0}, ${a1}, ${a2})";
+}
+
+class Struct3BytesInt2ByteAligned extends Struct {
+  @Int16()
+  external int a0;
+
+  @Int8()
+  external int a1;
+
+  String toString() => "(${a0}, ${a1})";
+}
+
+class Struct4BytesHomogeneousInt16 extends Struct {
+  @Int16()
+  external int a0;
+
+  @Int16()
+  external int a1;
+
+  String toString() => "(${a0}, ${a1})";
+}
+
+class Struct7BytesHomogeneousUint8 extends Struct {
+  @Uint8()
+  external int a0;
+
+  @Uint8()
+  external int a1;
+
+  @Uint8()
+  external int a2;
+
+  @Uint8()
+  external int a3;
+
+  @Uint8()
+  external int a4;
+
+  @Uint8()
+  external int a5;
+
+  @Uint8()
+  external int a6;
+
+  String toString() => "(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5}, ${a6})";
+}
+
+class Struct7BytesInt4ByteAligned extends Struct {
+  @Int32()
+  external int a0;
+
+  @Int16()
+  external int a1;
+
+  @Int8()
+  external int a2;
+
+  String toString() => "(${a0}, ${a1}, ${a2})";
+}
+
+class Struct8BytesInt extends Struct {
+  @Int16()
+  external int a0;
+
+  @Int16()
+  external int a1;
+
+  @Int32()
+  external int a2;
+
+  String toString() => "(${a0}, ${a1}, ${a2})";
+}
+
+class Struct8BytesHomogeneousFloat extends Struct {
+  @Float()
+  external double a0;
+
+  @Float()
+  external double a1;
+
+  String toString() => "(${a0}, ${a1})";
+}
+
+class Struct8BytesMixed extends Struct {
+  @Float()
+  external double a0;
+
+  @Int16()
+  external int a1;
+
+  @Int16()
+  external int a2;
+
+  String toString() => "(${a0}, ${a1}, ${a2})";
+}
+
+class Struct9BytesHomogeneousUint8 extends Struct {
+  @Uint8()
+  external int a0;
+
+  @Uint8()
+  external int a1;
+
+  @Uint8()
+  external int a2;
+
+  @Uint8()
+  external int a3;
+
+  @Uint8()
+  external int a4;
+
+  @Uint8()
+  external int a5;
+
+  @Uint8()
+  external int a6;
+
+  @Uint8()
+  external int a7;
+
+  @Uint8()
+  external int a8;
+
+  String toString() =>
+      "(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5}, ${a6}, ${a7}, ${a8})";
+}
+
+class Struct9BytesInt4Or8ByteAligned extends Struct {
+  @Int64()
+  external int a0;
+
+  @Int8()
+  external int a1;
+
+  String toString() => "(${a0}, ${a1})";
+}
+
+class Struct12BytesHomogeneousFloat extends Struct {
+  @Float()
+  external double a0;
+
+  @Float()
+  external double a1;
+
+  @Float()
+  external double a2;
+
+  String toString() => "(${a0}, ${a1}, ${a2})";
+}
+
+class Struct16BytesHomogeneousFloat extends Struct {
+  @Float()
+  external double a0;
+
+  @Float()
+  external double a1;
+
+  @Float()
+  external double a2;
+
+  @Float()
+  external double a3;
+
+  String toString() => "(${a0}, ${a1}, ${a2}, ${a3})";
+}
+
+class Struct16BytesMixed extends Struct {
+  @Double()
+  external double a0;
+
+  @Int64()
+  external int a1;
+
+  String toString() => "(${a0}, ${a1})";
+}
+
+class Struct16BytesMixed2 extends Struct {
+  @Float()
+  external double a0;
+
+  @Float()
+  external double a1;
+
+  @Float()
+  external double a2;
+
+  @Int32()
+  external int a3;
+
+  String toString() => "(${a0}, ${a1}, ${a2}, ${a3})";
+}
+
+class Struct17BytesInt extends Struct {
+  @Int64()
+  external int a0;
+
+  @Int64()
+  external int a1;
+
+  @Int8()
+  external int a2;
+
+  String toString() => "(${a0}, ${a1}, ${a2})";
+}
+
+class Struct19BytesHomogeneousUint8 extends Struct {
+  @Uint8()
+  external int a0;
+
+  @Uint8()
+  external int a1;
+
+  @Uint8()
+  external int a2;
+
+  @Uint8()
+  external int a3;
+
+  @Uint8()
+  external int a4;
+
+  @Uint8()
+  external int a5;
+
+  @Uint8()
+  external int a6;
+
+  @Uint8()
+  external int a7;
+
+  @Uint8()
+  external int a8;
+
+  @Uint8()
+  external int a9;
+
+  @Uint8()
+  external int a10;
+
+  @Uint8()
+  external int a11;
+
+  @Uint8()
+  external int a12;
+
+  @Uint8()
+  external int a13;
+
+  @Uint8()
+  external int a14;
+
+  @Uint8()
+  external int a15;
+
+  @Uint8()
+  external int a16;
+
+  @Uint8()
+  external int a17;
+
+  @Uint8()
+  external int a18;
+
+  String toString() =>
+      "(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5}, ${a6}, ${a7}, ${a8}, ${a9}, ${a10}, ${a11}, ${a12}, ${a13}, ${a14}, ${a15}, ${a16}, ${a17}, ${a18})";
+}
+
+class Struct20BytesHomogeneousInt32 extends Struct {
+  @Int32()
+  external int a0;
+
+  @Int32()
+  external int a1;
+
+  @Int32()
+  external int a2;
+
+  @Int32()
+  external int a3;
+
+  @Int32()
+  external int a4;
+
+  String toString() => "(${a0}, ${a1}, ${a2}, ${a3}, ${a4})";
+}
+
+class Struct20BytesHomogeneousFloat extends Struct {
+  @Float()
+  external double a0;
+
+  @Float()
+  external double a1;
+
+  @Float()
+  external double a2;
+
+  @Float()
+  external double a3;
+
+  @Float()
+  external double a4;
+
+  String toString() => "(${a0}, ${a1}, ${a2}, ${a3}, ${a4})";
+}
+
+class Struct32BytesHomogeneousDouble extends Struct {
+  @Double()
+  external double a0;
+
+  @Double()
+  external double a1;
+
+  @Double()
+  external double a2;
+
+  @Double()
+  external double a3;
+
+  String toString() => "(${a0}, ${a1}, ${a2}, ${a3})";
+}
+
+class Struct40BytesHomogeneousDouble extends Struct {
+  @Double()
+  external double a0;
+
+  @Double()
+  external double a1;
+
+  @Double()
+  external double a2;
+
+  @Double()
+  external double a3;
+
+  @Double()
+  external double a4;
+
+  String toString() => "(${a0}, ${a1}, ${a2}, ${a3}, ${a4})";
+}
+
+class Struct1024BytesHomogeneousUint64 extends Struct {
+  @Uint64()
+  external int a0;
+
+  @Uint64()
+  external int a1;
+
+  @Uint64()
+  external int a2;
+
+  @Uint64()
+  external int a3;
+
+  @Uint64()
+  external int a4;
+
+  @Uint64()
+  external int a5;
+
+  @Uint64()
+  external int a6;
+
+  @Uint64()
+  external int a7;
+
+  @Uint64()
+  external int a8;
+
+  @Uint64()
+  external int a9;
+
+  @Uint64()
+  external int a10;
+
+  @Uint64()
+  external int a11;
+
+  @Uint64()
+  external int a12;
+
+  @Uint64()
+  external int a13;
+
+  @Uint64()
+  external int a14;
+
+  @Uint64()
+  external int a15;
+
+  @Uint64()
+  external int a16;
+
+  @Uint64()
+  external int a17;
+
+  @Uint64()
+  external int a18;
+
+  @Uint64()
+  external int a19;
+
+  @Uint64()
+  external int a20;
+
+  @Uint64()
+  external int a21;
+
+  @Uint64()
+  external int a22;
+
+  @Uint64()
+  external int a23;
+
+  @Uint64()
+  external int a24;
+
+  @Uint64()
+  external int a25;
+
+  @Uint64()
+  external int a26;
+
+  @Uint64()
+  external int a27;
+
+  @Uint64()
+  external int a28;
+
+  @Uint64()
+  external int a29;
+
+  @Uint64()
+  external int a30;
+
+  @Uint64()
+  external int a31;
+
+  @Uint64()
+  external int a32;
+
+  @Uint64()
+  external int a33;
+
+  @Uint64()
+  external int a34;
+
+  @Uint64()
+  external int a35;
+
+  @Uint64()
+  external int a36;
+
+  @Uint64()
+  external int a37;
+
+  @Uint64()
+  external int a38;
+
+  @Uint64()
+  external int a39;
+
+  @Uint64()
+  external int a40;
+
+  @Uint64()
+  external int a41;
+
+  @Uint64()
+  external int a42;
+
+  @Uint64()
+  external int a43;
+
+  @Uint64()
+  external int a44;
+
+  @Uint64()
+  external int a45;
+
+  @Uint64()
+  external int a46;
+
+  @Uint64()
+  external int a47;
+
+  @Uint64()
+  external int a48;
+
+  @Uint64()
+  external int a49;
+
+  @Uint64()
+  external int a50;
+
+  @Uint64()
+  external int a51;
+
+  @Uint64()
+  external int a52;
+
+  @Uint64()
+  external int a53;
+
+  @Uint64()
+  external int a54;
+
+  @Uint64()
+  external int a55;
+
+  @Uint64()
+  external int a56;
+
+  @Uint64()
+  external int a57;
+
+  @Uint64()
+  external int a58;
+
+  @Uint64()
+  external int a59;
+
+  @Uint64()
+  external int a60;
+
+  @Uint64()
+  external int a61;
+
+  @Uint64()
+  external int a62;
+
+  @Uint64()
+  external int a63;
+
+  @Uint64()
+  external int a64;
+
+  @Uint64()
+  external int a65;
+
+  @Uint64()
+  external int a66;
+
+  @Uint64()
+  external int a67;
+
+  @Uint64()
+  external int a68;
+
+  @Uint64()
+  external int a69;
+
+  @Uint64()
+  external int a70;
+
+  @Uint64()
+  external int a71;
+
+  @Uint64()
+  external int a72;
+
+  @Uint64()
+  external int a73;
+
+  @Uint64()
+  external int a74;
+
+  @Uint64()
+  external int a75;
+
+  @Uint64()
+  external int a76;
+
+  @Uint64()
+  external int a77;
+
+  @Uint64()
+  external int a78;
+
+  @Uint64()
+  external int a79;
+
+  @Uint64()
+  external int a80;
+
+  @Uint64()
+  external int a81;
+
+  @Uint64()
+  external int a82;
+
+  @Uint64()
+  external int a83;
+
+  @Uint64()
+  external int a84;
+
+  @Uint64()
+  external int a85;
+
+  @Uint64()
+  external int a86;
+
+  @Uint64()
+  external int a87;
+
+  @Uint64()
+  external int a88;
+
+  @Uint64()
+  external int a89;
+
+  @Uint64()
+  external int a90;
+
+  @Uint64()
+  external int a91;
+
+  @Uint64()
+  external int a92;
+
+  @Uint64()
+  external int a93;
+
+  @Uint64()
+  external int a94;
+
+  @Uint64()
+  external int a95;
+
+  @Uint64()
+  external int a96;
+
+  @Uint64()
+  external int a97;
+
+  @Uint64()
+  external int a98;
+
+  @Uint64()
+  external int a99;
+
+  @Uint64()
+  external int a100;
+
+  @Uint64()
+  external int a101;
+
+  @Uint64()
+  external int a102;
+
+  @Uint64()
+  external int a103;
+
+  @Uint64()
+  external int a104;
+
+  @Uint64()
+  external int a105;
+
+  @Uint64()
+  external int a106;
+
+  @Uint64()
+  external int a107;
+
+  @Uint64()
+  external int a108;
+
+  @Uint64()
+  external int a109;
+
+  @Uint64()
+  external int a110;
+
+  @Uint64()
+  external int a111;
+
+  @Uint64()
+  external int a112;
+
+  @Uint64()
+  external int a113;
+
+  @Uint64()
+  external int a114;
+
+  @Uint64()
+  external int a115;
+
+  @Uint64()
+  external int a116;
+
+  @Uint64()
+  external int a117;
+
+  @Uint64()
+  external int a118;
+
+  @Uint64()
+  external int a119;
+
+  @Uint64()
+  external int a120;
+
+  @Uint64()
+  external int a121;
+
+  @Uint64()
+  external int a122;
+
+  @Uint64()
+  external int a123;
+
+  @Uint64()
+  external int a124;
+
+  @Uint64()
+  external int a125;
+
+  @Uint64()
+  external int a126;
+
+  @Uint64()
+  external int a127;
+
+  String toString() =>
+      "(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5}, ${a6}, ${a7}, ${a8}, ${a9}, ${a10}, ${a11}, ${a12}, ${a13}, ${a14}, ${a15}, ${a16}, ${a17}, ${a18}, ${a19}, ${a20}, ${a21}, ${a22}, ${a23}, ${a24}, ${a25}, ${a26}, ${a27}, ${a28}, ${a29}, ${a30}, ${a31}, ${a32}, ${a33}, ${a34}, ${a35}, ${a36}, ${a37}, ${a38}, ${a39}, ${a40}, ${a41}, ${a42}, ${a43}, ${a44}, ${a45}, ${a46}, ${a47}, ${a48}, ${a49}, ${a50}, ${a51}, ${a52}, ${a53}, ${a54}, ${a55}, ${a56}, ${a57}, ${a58}, ${a59}, ${a60}, ${a61}, ${a62}, ${a63}, ${a64}, ${a65}, ${a66}, ${a67}, ${a68}, ${a69}, ${a70}, ${a71}, ${a72}, ${a73}, ${a74}, ${a75}, ${a76}, ${a77}, ${a78}, ${a79}, ${a80}, ${a81}, ${a82}, ${a83}, ${a84}, ${a85}, ${a86}, ${a87}, ${a88}, ${a89}, ${a90}, ${a91}, ${a92}, ${a93}, ${a94}, ${a95}, ${a96}, ${a97}, ${a98}, ${a99}, ${a100}, ${a101}, ${a102}, ${a103}, ${a104}, ${a105}, ${a106}, ${a107}, ${a108}, ${a109}, ${a110}, ${a111}, ${a112}, ${a113}, ${a114}, ${a115}, ${a116}, ${a117}, ${a118}, ${a119}, ${a120}, ${a121}, ${a122}, ${a123}, ${a124}, ${a125}, ${a126}, ${a127})";
+}
+
+class StructAlignmentInt16 extends Struct {
+  @Int8()
+  external int a0;
+
+  @Int16()
+  external int a1;
+
+  @Int8()
+  external int a2;
+
+  String toString() => "(${a0}, ${a1}, ${a2})";
+}
+
+class StructAlignmentInt32 extends Struct {
+  @Int8()
+  external int a0;
+
+  @Int32()
+  external int a1;
+
+  @Int8()
+  external int a2;
+
+  String toString() => "(${a0}, ${a1}, ${a2})";
+}
+
+class StructAlignmentInt64 extends Struct {
+  @Int8()
+  external int a0;
+
+  @Int64()
+  external int a1;
+
+  @Int8()
+  external int a2;
+
+  String toString() => "(${a0}, ${a1}, ${a2})";
+}
+
+final passStruct1ByteIntx10 = ffiTestFunctions.lookupFunction<
+    Int64 Function(
+        Struct1ByteInt,
+        Struct1ByteInt,
+        Struct1ByteInt,
+        Struct1ByteInt,
+        Struct1ByteInt,
+        Struct1ByteInt,
+        Struct1ByteInt,
+        Struct1ByteInt,
+        Struct1ByteInt,
+        Struct1ByteInt),
+    int Function(
+        Struct1ByteInt,
+        Struct1ByteInt,
+        Struct1ByteInt,
+        Struct1ByteInt,
+        Struct1ByteInt,
+        Struct1ByteInt,
+        Struct1ByteInt,
+        Struct1ByteInt,
+        Struct1ByteInt,
+        Struct1ByteInt)>("PassStruct1ByteIntx10");
+
+/// Smallest struct with data.
+/// 10 struct arguments will exhaust available registers.
+void testPassStruct1ByteIntx10() {
+  Struct1ByteInt a0 = allocate<Struct1ByteInt>().ref;
+  Struct1ByteInt a1 = allocate<Struct1ByteInt>().ref;
+  Struct1ByteInt a2 = allocate<Struct1ByteInt>().ref;
+  Struct1ByteInt a3 = allocate<Struct1ByteInt>().ref;
+  Struct1ByteInt a4 = allocate<Struct1ByteInt>().ref;
+  Struct1ByteInt a5 = allocate<Struct1ByteInt>().ref;
+  Struct1ByteInt a6 = allocate<Struct1ByteInt>().ref;
+  Struct1ByteInt a7 = allocate<Struct1ByteInt>().ref;
+  Struct1ByteInt a8 = allocate<Struct1ByteInt>().ref;
+  Struct1ByteInt a9 = allocate<Struct1ByteInt>().ref;
+
+  a0.a0 = -1;
+  a1.a0 = 2;
+  a2.a0 = -3;
+  a3.a0 = 4;
+  a4.a0 = -5;
+  a5.a0 = 6;
+  a6.a0 = -7;
+  a7.a0 = 8;
+  a8.a0 = -9;
+  a9.a0 = 10;
+
+  final result = passStruct1ByteIntx10(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+  print("result = $result");
+
+  Expect.equals(5, result);
+
+  free(a0.addressOf);
+  free(a1.addressOf);
+  free(a2.addressOf);
+  free(a3.addressOf);
+  free(a4.addressOf);
+  free(a5.addressOf);
+  free(a6.addressOf);
+  free(a7.addressOf);
+  free(a8.addressOf);
+  free(a9.addressOf);
+}
+
+final passStruct3BytesHomogeneousUint8x10 = ffiTestFunctions.lookupFunction<
+    Int64 Function(
+        Struct3BytesHomogeneousUint8,
+        Struct3BytesHomogeneousUint8,
+        Struct3BytesHomogeneousUint8,
+        Struct3BytesHomogeneousUint8,
+        Struct3BytesHomogeneousUint8,
+        Struct3BytesHomogeneousUint8,
+        Struct3BytesHomogeneousUint8,
+        Struct3BytesHomogeneousUint8,
+        Struct3BytesHomogeneousUint8,
+        Struct3BytesHomogeneousUint8),
+    int Function(
+        Struct3BytesHomogeneousUint8,
+        Struct3BytesHomogeneousUint8,
+        Struct3BytesHomogeneousUint8,
+        Struct3BytesHomogeneousUint8,
+        Struct3BytesHomogeneousUint8,
+        Struct3BytesHomogeneousUint8,
+        Struct3BytesHomogeneousUint8,
+        Struct3BytesHomogeneousUint8,
+        Struct3BytesHomogeneousUint8,
+        Struct3BytesHomogeneousUint8)>("PassStruct3BytesHomogeneousUint8x10");
+
+/// Not a multiple of word size, not a power of two.
+/// 10 struct arguments will exhaust available registers.
+void testPassStruct3BytesHomogeneousUint8x10() {
+  Struct3BytesHomogeneousUint8 a0 =
+      allocate<Struct3BytesHomogeneousUint8>().ref;
+  Struct3BytesHomogeneousUint8 a1 =
+      allocate<Struct3BytesHomogeneousUint8>().ref;
+  Struct3BytesHomogeneousUint8 a2 =
+      allocate<Struct3BytesHomogeneousUint8>().ref;
+  Struct3BytesHomogeneousUint8 a3 =
+      allocate<Struct3BytesHomogeneousUint8>().ref;
+  Struct3BytesHomogeneousUint8 a4 =
+      allocate<Struct3BytesHomogeneousUint8>().ref;
+  Struct3BytesHomogeneousUint8 a5 =
+      allocate<Struct3BytesHomogeneousUint8>().ref;
+  Struct3BytesHomogeneousUint8 a6 =
+      allocate<Struct3BytesHomogeneousUint8>().ref;
+  Struct3BytesHomogeneousUint8 a7 =
+      allocate<Struct3BytesHomogeneousUint8>().ref;
+  Struct3BytesHomogeneousUint8 a8 =
+      allocate<Struct3BytesHomogeneousUint8>().ref;
+  Struct3BytesHomogeneousUint8 a9 =
+      allocate<Struct3BytesHomogeneousUint8>().ref;
+
+  a0.a0 = 1;
+  a0.a1 = 2;
+  a0.a2 = 3;
+  a1.a0 = 4;
+  a1.a1 = 5;
+  a1.a2 = 6;
+  a2.a0 = 7;
+  a2.a1 = 8;
+  a2.a2 = 9;
+  a3.a0 = 10;
+  a3.a1 = 11;
+  a3.a2 = 12;
+  a4.a0 = 13;
+  a4.a1 = 14;
+  a4.a2 = 15;
+  a5.a0 = 16;
+  a5.a1 = 17;
+  a5.a2 = 18;
+  a6.a0 = 19;
+  a6.a1 = 20;
+  a6.a2 = 21;
+  a7.a0 = 22;
+  a7.a1 = 23;
+  a7.a2 = 24;
+  a8.a0 = 25;
+  a8.a1 = 26;
+  a8.a2 = 27;
+  a9.a0 = 28;
+  a9.a1 = 29;
+  a9.a2 = 30;
+
+  final result = passStruct3BytesHomogeneousUint8x10(
+      a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+  print("result = $result");
+
+  Expect.equals(465, result);
+
+  free(a0.addressOf);
+  free(a1.addressOf);
+  free(a2.addressOf);
+  free(a3.addressOf);
+  free(a4.addressOf);
+  free(a5.addressOf);
+  free(a6.addressOf);
+  free(a7.addressOf);
+  free(a8.addressOf);
+  free(a9.addressOf);
+}
+
+final passStruct3BytesInt2ByteAlignedx10 = ffiTestFunctions.lookupFunction<
+    Int64 Function(
+        Struct3BytesInt2ByteAligned,
+        Struct3BytesInt2ByteAligned,
+        Struct3BytesInt2ByteAligned,
+        Struct3BytesInt2ByteAligned,
+        Struct3BytesInt2ByteAligned,
+        Struct3BytesInt2ByteAligned,
+        Struct3BytesInt2ByteAligned,
+        Struct3BytesInt2ByteAligned,
+        Struct3BytesInt2ByteAligned,
+        Struct3BytesInt2ByteAligned),
+    int Function(
+        Struct3BytesInt2ByteAligned,
+        Struct3BytesInt2ByteAligned,
+        Struct3BytesInt2ByteAligned,
+        Struct3BytesInt2ByteAligned,
+        Struct3BytesInt2ByteAligned,
+        Struct3BytesInt2ByteAligned,
+        Struct3BytesInt2ByteAligned,
+        Struct3BytesInt2ByteAligned,
+        Struct3BytesInt2ByteAligned,
+        Struct3BytesInt2ByteAligned)>("PassStruct3BytesInt2ByteAlignedx10");
+
+/// Not a multiple of word size, not a power of two.
+/// With alignment rules taken into account size is 4 bytes.
+/// 10 struct arguments will exhaust available registers.
+void testPassStruct3BytesInt2ByteAlignedx10() {
+  Struct3BytesInt2ByteAligned a0 = allocate<Struct3BytesInt2ByteAligned>().ref;
+  Struct3BytesInt2ByteAligned a1 = allocate<Struct3BytesInt2ByteAligned>().ref;
+  Struct3BytesInt2ByteAligned a2 = allocate<Struct3BytesInt2ByteAligned>().ref;
+  Struct3BytesInt2ByteAligned a3 = allocate<Struct3BytesInt2ByteAligned>().ref;
+  Struct3BytesInt2ByteAligned a4 = allocate<Struct3BytesInt2ByteAligned>().ref;
+  Struct3BytesInt2ByteAligned a5 = allocate<Struct3BytesInt2ByteAligned>().ref;
+  Struct3BytesInt2ByteAligned a6 = allocate<Struct3BytesInt2ByteAligned>().ref;
+  Struct3BytesInt2ByteAligned a7 = allocate<Struct3BytesInt2ByteAligned>().ref;
+  Struct3BytesInt2ByteAligned a8 = allocate<Struct3BytesInt2ByteAligned>().ref;
+  Struct3BytesInt2ByteAligned a9 = allocate<Struct3BytesInt2ByteAligned>().ref;
+
+  a0.a0 = -1;
+  a0.a1 = 2;
+  a1.a0 = -3;
+  a1.a1 = 4;
+  a2.a0 = -5;
+  a2.a1 = 6;
+  a3.a0 = -7;
+  a3.a1 = 8;
+  a4.a0 = -9;
+  a4.a1 = 10;
+  a5.a0 = -11;
+  a5.a1 = 12;
+  a6.a0 = -13;
+  a6.a1 = 14;
+  a7.a0 = -15;
+  a7.a1 = 16;
+  a8.a0 = -17;
+  a8.a1 = 18;
+  a9.a0 = -19;
+  a9.a1 = 20;
+
+  final result = passStruct3BytesInt2ByteAlignedx10(
+      a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+  print("result = $result");
+
+  Expect.equals(10, result);
+
+  free(a0.addressOf);
+  free(a1.addressOf);
+  free(a2.addressOf);
+  free(a3.addressOf);
+  free(a4.addressOf);
+  free(a5.addressOf);
+  free(a6.addressOf);
+  free(a7.addressOf);
+  free(a8.addressOf);
+  free(a9.addressOf);
+}
+
+final passStruct4BytesHomogeneousInt16x10 = ffiTestFunctions.lookupFunction<
+    Int64 Function(
+        Struct4BytesHomogeneousInt16,
+        Struct4BytesHomogeneousInt16,
+        Struct4BytesHomogeneousInt16,
+        Struct4BytesHomogeneousInt16,
+        Struct4BytesHomogeneousInt16,
+        Struct4BytesHomogeneousInt16,
+        Struct4BytesHomogeneousInt16,
+        Struct4BytesHomogeneousInt16,
+        Struct4BytesHomogeneousInt16,
+        Struct4BytesHomogeneousInt16),
+    int Function(
+        Struct4BytesHomogeneousInt16,
+        Struct4BytesHomogeneousInt16,
+        Struct4BytesHomogeneousInt16,
+        Struct4BytesHomogeneousInt16,
+        Struct4BytesHomogeneousInt16,
+        Struct4BytesHomogeneousInt16,
+        Struct4BytesHomogeneousInt16,
+        Struct4BytesHomogeneousInt16,
+        Struct4BytesHomogeneousInt16,
+        Struct4BytesHomogeneousInt16)>("PassStruct4BytesHomogeneousInt16x10");
+
+/// Exactly word size on 32-bit architectures.
+/// 10 struct arguments will exhaust available registers.
+void testPassStruct4BytesHomogeneousInt16x10() {
+  Struct4BytesHomogeneousInt16 a0 =
+      allocate<Struct4BytesHomogeneousInt16>().ref;
+  Struct4BytesHomogeneousInt16 a1 =
+      allocate<Struct4BytesHomogeneousInt16>().ref;
+  Struct4BytesHomogeneousInt16 a2 =
+      allocate<Struct4BytesHomogeneousInt16>().ref;
+  Struct4BytesHomogeneousInt16 a3 =
+      allocate<Struct4BytesHomogeneousInt16>().ref;
+  Struct4BytesHomogeneousInt16 a4 =
+      allocate<Struct4BytesHomogeneousInt16>().ref;
+  Struct4BytesHomogeneousInt16 a5 =
+      allocate<Struct4BytesHomogeneousInt16>().ref;
+  Struct4BytesHomogeneousInt16 a6 =
+      allocate<Struct4BytesHomogeneousInt16>().ref;
+  Struct4BytesHomogeneousInt16 a7 =
+      allocate<Struct4BytesHomogeneousInt16>().ref;
+  Struct4BytesHomogeneousInt16 a8 =
+      allocate<Struct4BytesHomogeneousInt16>().ref;
+  Struct4BytesHomogeneousInt16 a9 =
+      allocate<Struct4BytesHomogeneousInt16>().ref;
+
+  a0.a0 = -1;
+  a0.a1 = 2;
+  a1.a0 = -3;
+  a1.a1 = 4;
+  a2.a0 = -5;
+  a2.a1 = 6;
+  a3.a0 = -7;
+  a3.a1 = 8;
+  a4.a0 = -9;
+  a4.a1 = 10;
+  a5.a0 = -11;
+  a5.a1 = 12;
+  a6.a0 = -13;
+  a6.a1 = 14;
+  a7.a0 = -15;
+  a7.a1 = 16;
+  a8.a0 = -17;
+  a8.a1 = 18;
+  a9.a0 = -19;
+  a9.a1 = 20;
+
+  final result = passStruct4BytesHomogeneousInt16x10(
+      a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+  print("result = $result");
+
+  Expect.equals(10, result);
+
+  free(a0.addressOf);
+  free(a1.addressOf);
+  free(a2.addressOf);
+  free(a3.addressOf);
+  free(a4.addressOf);
+  free(a5.addressOf);
+  free(a6.addressOf);
+  free(a7.addressOf);
+  free(a8.addressOf);
+  free(a9.addressOf);
+}
+
+final passStruct7BytesHomogeneousUint8x10 = ffiTestFunctions.lookupFunction<
+    Int64 Function(
+        Struct7BytesHomogeneousUint8,
+        Struct7BytesHomogeneousUint8,
+        Struct7BytesHomogeneousUint8,
+        Struct7BytesHomogeneousUint8,
+        Struct7BytesHomogeneousUint8,
+        Struct7BytesHomogeneousUint8,
+        Struct7BytesHomogeneousUint8,
+        Struct7BytesHomogeneousUint8,
+        Struct7BytesHomogeneousUint8,
+        Struct7BytesHomogeneousUint8),
+    int Function(
+        Struct7BytesHomogeneousUint8,
+        Struct7BytesHomogeneousUint8,
+        Struct7BytesHomogeneousUint8,
+        Struct7BytesHomogeneousUint8,
+        Struct7BytesHomogeneousUint8,
+        Struct7BytesHomogeneousUint8,
+        Struct7BytesHomogeneousUint8,
+        Struct7BytesHomogeneousUint8,
+        Struct7BytesHomogeneousUint8,
+        Struct7BytesHomogeneousUint8)>("PassStruct7BytesHomogeneousUint8x10");
+
+/// Sub word size on 64 bit architectures.
+/// 10 struct arguments will exhaust available registers.
+void testPassStruct7BytesHomogeneousUint8x10() {
+  Struct7BytesHomogeneousUint8 a0 =
+      allocate<Struct7BytesHomogeneousUint8>().ref;
+  Struct7BytesHomogeneousUint8 a1 =
+      allocate<Struct7BytesHomogeneousUint8>().ref;
+  Struct7BytesHomogeneousUint8 a2 =
+      allocate<Struct7BytesHomogeneousUint8>().ref;
+  Struct7BytesHomogeneousUint8 a3 =
+      allocate<Struct7BytesHomogeneousUint8>().ref;
+  Struct7BytesHomogeneousUint8 a4 =
+      allocate<Struct7BytesHomogeneousUint8>().ref;
+  Struct7BytesHomogeneousUint8 a5 =
+      allocate<Struct7BytesHomogeneousUint8>().ref;
+  Struct7BytesHomogeneousUint8 a6 =
+      allocate<Struct7BytesHomogeneousUint8>().ref;
+  Struct7BytesHomogeneousUint8 a7 =
+      allocate<Struct7BytesHomogeneousUint8>().ref;
+  Struct7BytesHomogeneousUint8 a8 =
+      allocate<Struct7BytesHomogeneousUint8>().ref;
+  Struct7BytesHomogeneousUint8 a9 =
+      allocate<Struct7BytesHomogeneousUint8>().ref;
+
+  a0.a0 = 1;
+  a0.a1 = 2;
+  a0.a2 = 3;
+  a0.a3 = 4;
+  a0.a4 = 5;
+  a0.a5 = 6;
+  a0.a6 = 7;
+  a1.a0 = 8;
+  a1.a1 = 9;
+  a1.a2 = 10;
+  a1.a3 = 11;
+  a1.a4 = 12;
+  a1.a5 = 13;
+  a1.a6 = 14;
+  a2.a0 = 15;
+  a2.a1 = 16;
+  a2.a2 = 17;
+  a2.a3 = 18;
+  a2.a4 = 19;
+  a2.a5 = 20;
+  a2.a6 = 21;
+  a3.a0 = 22;
+  a3.a1 = 23;
+  a3.a2 = 24;
+  a3.a3 = 25;
+  a3.a4 = 26;
+  a3.a5 = 27;
+  a3.a6 = 28;
+  a4.a0 = 29;
+  a4.a1 = 30;
+  a4.a2 = 31;
+  a4.a3 = 32;
+  a4.a4 = 33;
+  a4.a5 = 34;
+  a4.a6 = 35;
+  a5.a0 = 36;
+  a5.a1 = 37;
+  a5.a2 = 38;
+  a5.a3 = 39;
+  a5.a4 = 40;
+  a5.a5 = 41;
+  a5.a6 = 42;
+  a6.a0 = 43;
+  a6.a1 = 44;
+  a6.a2 = 45;
+  a6.a3 = 46;
+  a6.a4 = 47;
+  a6.a5 = 48;
+  a6.a6 = 49;
+  a7.a0 = 50;
+  a7.a1 = 51;
+  a7.a2 = 52;
+  a7.a3 = 53;
+  a7.a4 = 54;
+  a7.a5 = 55;
+  a7.a6 = 56;
+  a8.a0 = 57;
+  a8.a1 = 58;
+  a8.a2 = 59;
+  a8.a3 = 60;
+  a8.a4 = 61;
+  a8.a5 = 62;
+  a8.a6 = 63;
+  a9.a0 = 64;
+  a9.a1 = 65;
+  a9.a2 = 66;
+  a9.a3 = 67;
+  a9.a4 = 68;
+  a9.a5 = 69;
+  a9.a6 = 70;
+
+  final result = passStruct7BytesHomogeneousUint8x10(
+      a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+  print("result = $result");
+
+  Expect.equals(2485, result);
+
+  free(a0.addressOf);
+  free(a1.addressOf);
+  free(a2.addressOf);
+  free(a3.addressOf);
+  free(a4.addressOf);
+  free(a5.addressOf);
+  free(a6.addressOf);
+  free(a7.addressOf);
+  free(a8.addressOf);
+  free(a9.addressOf);
+}
+
+final passStruct7BytesInt4ByteAlignedx10 = ffiTestFunctions.lookupFunction<
+    Int64 Function(
+        Struct7BytesInt4ByteAligned,
+        Struct7BytesInt4ByteAligned,
+        Struct7BytesInt4ByteAligned,
+        Struct7BytesInt4ByteAligned,
+        Struct7BytesInt4ByteAligned,
+        Struct7BytesInt4ByteAligned,
+        Struct7BytesInt4ByteAligned,
+        Struct7BytesInt4ByteAligned,
+        Struct7BytesInt4ByteAligned,
+        Struct7BytesInt4ByteAligned),
+    int Function(
+        Struct7BytesInt4ByteAligned,
+        Struct7BytesInt4ByteAligned,
+        Struct7BytesInt4ByteAligned,
+        Struct7BytesInt4ByteAligned,
+        Struct7BytesInt4ByteAligned,
+        Struct7BytesInt4ByteAligned,
+        Struct7BytesInt4ByteAligned,
+        Struct7BytesInt4ByteAligned,
+        Struct7BytesInt4ByteAligned,
+        Struct7BytesInt4ByteAligned)>("PassStruct7BytesInt4ByteAlignedx10");
+
+/// Sub word size on 64 bit architectures.
+/// With alignment rules taken into account size is 8 bytes.
+/// 10 struct arguments will exhaust available registers.
+void testPassStruct7BytesInt4ByteAlignedx10() {
+  Struct7BytesInt4ByteAligned a0 = allocate<Struct7BytesInt4ByteAligned>().ref;
+  Struct7BytesInt4ByteAligned a1 = allocate<Struct7BytesInt4ByteAligned>().ref;
+  Struct7BytesInt4ByteAligned a2 = allocate<Struct7BytesInt4ByteAligned>().ref;
+  Struct7BytesInt4ByteAligned a3 = allocate<Struct7BytesInt4ByteAligned>().ref;
+  Struct7BytesInt4ByteAligned a4 = allocate<Struct7BytesInt4ByteAligned>().ref;
+  Struct7BytesInt4ByteAligned a5 = allocate<Struct7BytesInt4ByteAligned>().ref;
+  Struct7BytesInt4ByteAligned a6 = allocate<Struct7BytesInt4ByteAligned>().ref;
+  Struct7BytesInt4ByteAligned a7 = allocate<Struct7BytesInt4ByteAligned>().ref;
+  Struct7BytesInt4ByteAligned a8 = allocate<Struct7BytesInt4ByteAligned>().ref;
+  Struct7BytesInt4ByteAligned a9 = allocate<Struct7BytesInt4ByteAligned>().ref;
+
+  a0.a0 = -1;
+  a0.a1 = 2;
+  a0.a2 = -3;
+  a1.a0 = 4;
+  a1.a1 = -5;
+  a1.a2 = 6;
+  a2.a0 = -7;
+  a2.a1 = 8;
+  a2.a2 = -9;
+  a3.a0 = 10;
+  a3.a1 = -11;
+  a3.a2 = 12;
+  a4.a0 = -13;
+  a4.a1 = 14;
+  a4.a2 = -15;
+  a5.a0 = 16;
+  a5.a1 = -17;
+  a5.a2 = 18;
+  a6.a0 = -19;
+  a6.a1 = 20;
+  a6.a2 = -21;
+  a7.a0 = 22;
+  a7.a1 = -23;
+  a7.a2 = 24;
+  a8.a0 = -25;
+  a8.a1 = 26;
+  a8.a2 = -27;
+  a9.a0 = 28;
+  a9.a1 = -29;
+  a9.a2 = 30;
+
+  final result = passStruct7BytesInt4ByteAlignedx10(
+      a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+  print("result = $result");
+
+  Expect.equals(15, result);
+
+  free(a0.addressOf);
+  free(a1.addressOf);
+  free(a2.addressOf);
+  free(a3.addressOf);
+  free(a4.addressOf);
+  free(a5.addressOf);
+  free(a6.addressOf);
+  free(a7.addressOf);
+  free(a8.addressOf);
+  free(a9.addressOf);
+}
+
+final passStruct8BytesIntx10 = ffiTestFunctions.lookupFunction<
+    Int64 Function(
+        Struct8BytesInt,
+        Struct8BytesInt,
+        Struct8BytesInt,
+        Struct8BytesInt,
+        Struct8BytesInt,
+        Struct8BytesInt,
+        Struct8BytesInt,
+        Struct8BytesInt,
+        Struct8BytesInt,
+        Struct8BytesInt),
+    int Function(
+        Struct8BytesInt,
+        Struct8BytesInt,
+        Struct8BytesInt,
+        Struct8BytesInt,
+        Struct8BytesInt,
+        Struct8BytesInt,
+        Struct8BytesInt,
+        Struct8BytesInt,
+        Struct8BytesInt,
+        Struct8BytesInt)>("PassStruct8BytesIntx10");
+
+/// Exactly word size struct on 64bit architectures.
+/// 10 struct arguments will exhaust available registers.
+void testPassStruct8BytesIntx10() {
+  Struct8BytesInt a0 = allocate<Struct8BytesInt>().ref;
+  Struct8BytesInt a1 = allocate<Struct8BytesInt>().ref;
+  Struct8BytesInt a2 = allocate<Struct8BytesInt>().ref;
+  Struct8BytesInt a3 = allocate<Struct8BytesInt>().ref;
+  Struct8BytesInt a4 = allocate<Struct8BytesInt>().ref;
+  Struct8BytesInt a5 = allocate<Struct8BytesInt>().ref;
+  Struct8BytesInt a6 = allocate<Struct8BytesInt>().ref;
+  Struct8BytesInt a7 = allocate<Struct8BytesInt>().ref;
+  Struct8BytesInt a8 = allocate<Struct8BytesInt>().ref;
+  Struct8BytesInt a9 = allocate<Struct8BytesInt>().ref;
+
+  a0.a0 = -1;
+  a0.a1 = 2;
+  a0.a2 = -3;
+  a1.a0 = 4;
+  a1.a1 = -5;
+  a1.a2 = 6;
+  a2.a0 = -7;
+  a2.a1 = 8;
+  a2.a2 = -9;
+  a3.a0 = 10;
+  a3.a1 = -11;
+  a3.a2 = 12;
+  a4.a0 = -13;
+  a4.a1 = 14;
+  a4.a2 = -15;
+  a5.a0 = 16;
+  a5.a1 = -17;
+  a5.a2 = 18;
+  a6.a0 = -19;
+  a6.a1 = 20;
+  a6.a2 = -21;
+  a7.a0 = 22;
+  a7.a1 = -23;
+  a7.a2 = 24;
+  a8.a0 = -25;
+  a8.a1 = 26;
+  a8.a2 = -27;
+  a9.a0 = 28;
+  a9.a1 = -29;
+  a9.a2 = 30;
+
+  final result = passStruct8BytesIntx10(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+  print("result = $result");
+
+  Expect.equals(15, result);
+
+  free(a0.addressOf);
+  free(a1.addressOf);
+  free(a2.addressOf);
+  free(a3.addressOf);
+  free(a4.addressOf);
+  free(a5.addressOf);
+  free(a6.addressOf);
+  free(a7.addressOf);
+  free(a8.addressOf);
+  free(a9.addressOf);
+}
+
+final passStruct8BytesHomogeneousFloatx10 = ffiTestFunctions.lookupFunction<
+    Float Function(
+        Struct8BytesHomogeneousFloat,
+        Struct8BytesHomogeneousFloat,
+        Struct8BytesHomogeneousFloat,
+        Struct8BytesHomogeneousFloat,
+        Struct8BytesHomogeneousFloat,
+        Struct8BytesHomogeneousFloat,
+        Struct8BytesHomogeneousFloat,
+        Struct8BytesHomogeneousFloat,
+        Struct8BytesHomogeneousFloat,
+        Struct8BytesHomogeneousFloat),
+    double Function(
+        Struct8BytesHomogeneousFloat,
+        Struct8BytesHomogeneousFloat,
+        Struct8BytesHomogeneousFloat,
+        Struct8BytesHomogeneousFloat,
+        Struct8BytesHomogeneousFloat,
+        Struct8BytesHomogeneousFloat,
+        Struct8BytesHomogeneousFloat,
+        Struct8BytesHomogeneousFloat,
+        Struct8BytesHomogeneousFloat,
+        Struct8BytesHomogeneousFloat)>("PassStruct8BytesHomogeneousFloatx10");
+
+/// Arguments passed in FP registers as long as they fit.
+/// 10 struct arguments will exhaust available registers.
+void testPassStruct8BytesHomogeneousFloatx10() {
+  Struct8BytesHomogeneousFloat a0 =
+      allocate<Struct8BytesHomogeneousFloat>().ref;
+  Struct8BytesHomogeneousFloat a1 =
+      allocate<Struct8BytesHomogeneousFloat>().ref;
+  Struct8BytesHomogeneousFloat a2 =
+      allocate<Struct8BytesHomogeneousFloat>().ref;
+  Struct8BytesHomogeneousFloat a3 =
+      allocate<Struct8BytesHomogeneousFloat>().ref;
+  Struct8BytesHomogeneousFloat a4 =
+      allocate<Struct8BytesHomogeneousFloat>().ref;
+  Struct8BytesHomogeneousFloat a5 =
+      allocate<Struct8BytesHomogeneousFloat>().ref;
+  Struct8BytesHomogeneousFloat a6 =
+      allocate<Struct8BytesHomogeneousFloat>().ref;
+  Struct8BytesHomogeneousFloat a7 =
+      allocate<Struct8BytesHomogeneousFloat>().ref;
+  Struct8BytesHomogeneousFloat a8 =
+      allocate<Struct8BytesHomogeneousFloat>().ref;
+  Struct8BytesHomogeneousFloat a9 =
+      allocate<Struct8BytesHomogeneousFloat>().ref;
+
+  a0.a0 = -1.0;
+  a0.a1 = 2.0;
+  a1.a0 = -3.0;
+  a1.a1 = 4.0;
+  a2.a0 = -5.0;
+  a2.a1 = 6.0;
+  a3.a0 = -7.0;
+  a3.a1 = 8.0;
+  a4.a0 = -9.0;
+  a4.a1 = 10.0;
+  a5.a0 = -11.0;
+  a5.a1 = 12.0;
+  a6.a0 = -13.0;
+  a6.a1 = 14.0;
+  a7.a0 = -15.0;
+  a7.a1 = 16.0;
+  a8.a0 = -17.0;
+  a8.a1 = 18.0;
+  a9.a0 = -19.0;
+  a9.a1 = 20.0;
+
+  final result = passStruct8BytesHomogeneousFloatx10(
+      a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+  print("result = $result");
+
+  Expect.approxEquals(10.0, result);
+
+  free(a0.addressOf);
+  free(a1.addressOf);
+  free(a2.addressOf);
+  free(a3.addressOf);
+  free(a4.addressOf);
+  free(a5.addressOf);
+  free(a6.addressOf);
+  free(a7.addressOf);
+  free(a8.addressOf);
+  free(a9.addressOf);
+}
+
+final passStruct8BytesMixedx10 = ffiTestFunctions.lookupFunction<
+    Float Function(
+        Struct8BytesMixed,
+        Struct8BytesMixed,
+        Struct8BytesMixed,
+        Struct8BytesMixed,
+        Struct8BytesMixed,
+        Struct8BytesMixed,
+        Struct8BytesMixed,
+        Struct8BytesMixed,
+        Struct8BytesMixed,
+        Struct8BytesMixed),
+    double Function(
+        Struct8BytesMixed,
+        Struct8BytesMixed,
+        Struct8BytesMixed,
+        Struct8BytesMixed,
+        Struct8BytesMixed,
+        Struct8BytesMixed,
+        Struct8BytesMixed,
+        Struct8BytesMixed,
+        Struct8BytesMixed,
+        Struct8BytesMixed)>("PassStruct8BytesMixedx10");
+
+/// On x64, arguments go in int registers because it is not only float.
+/// 10 struct arguments will exhaust available registers.
+void testPassStruct8BytesMixedx10() {
+  Struct8BytesMixed a0 = allocate<Struct8BytesMixed>().ref;
+  Struct8BytesMixed a1 = allocate<Struct8BytesMixed>().ref;
+  Struct8BytesMixed a2 = allocate<Struct8BytesMixed>().ref;
+  Struct8BytesMixed a3 = allocate<Struct8BytesMixed>().ref;
+  Struct8BytesMixed a4 = allocate<Struct8BytesMixed>().ref;
+  Struct8BytesMixed a5 = allocate<Struct8BytesMixed>().ref;
+  Struct8BytesMixed a6 = allocate<Struct8BytesMixed>().ref;
+  Struct8BytesMixed a7 = allocate<Struct8BytesMixed>().ref;
+  Struct8BytesMixed a8 = allocate<Struct8BytesMixed>().ref;
+  Struct8BytesMixed a9 = allocate<Struct8BytesMixed>().ref;
+
+  a0.a0 = -1.0;
+  a0.a1 = 2;
+  a0.a2 = -3;
+  a1.a0 = 4.0;
+  a1.a1 = -5;
+  a1.a2 = 6;
+  a2.a0 = -7.0;
+  a2.a1 = 8;
+  a2.a2 = -9;
+  a3.a0 = 10.0;
+  a3.a1 = -11;
+  a3.a2 = 12;
+  a4.a0 = -13.0;
+  a4.a1 = 14;
+  a4.a2 = -15;
+  a5.a0 = 16.0;
+  a5.a1 = -17;
+  a5.a2 = 18;
+  a6.a0 = -19.0;
+  a6.a1 = 20;
+  a6.a2 = -21;
+  a7.a0 = 22.0;
+  a7.a1 = -23;
+  a7.a2 = 24;
+  a8.a0 = -25.0;
+  a8.a1 = 26;
+  a8.a2 = -27;
+  a9.a0 = 28.0;
+  a9.a1 = -29;
+  a9.a2 = 30;
+
+  final result =
+      passStruct8BytesMixedx10(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+  print("result = $result");
+
+  Expect.approxEquals(15.0, result);
+
+  free(a0.addressOf);
+  free(a1.addressOf);
+  free(a2.addressOf);
+  free(a3.addressOf);
+  free(a4.addressOf);
+  free(a5.addressOf);
+  free(a6.addressOf);
+  free(a7.addressOf);
+  free(a8.addressOf);
+  free(a9.addressOf);
+}
+
+final passStruct9BytesHomogeneousUint8x10 = ffiTestFunctions.lookupFunction<
+    Int64 Function(
+        Struct9BytesHomogeneousUint8,
+        Struct9BytesHomogeneousUint8,
+        Struct9BytesHomogeneousUint8,
+        Struct9BytesHomogeneousUint8,
+        Struct9BytesHomogeneousUint8,
+        Struct9BytesHomogeneousUint8,
+        Struct9BytesHomogeneousUint8,
+        Struct9BytesHomogeneousUint8,
+        Struct9BytesHomogeneousUint8,
+        Struct9BytesHomogeneousUint8),
+    int Function(
+        Struct9BytesHomogeneousUint8,
+        Struct9BytesHomogeneousUint8,
+        Struct9BytesHomogeneousUint8,
+        Struct9BytesHomogeneousUint8,
+        Struct9BytesHomogeneousUint8,
+        Struct9BytesHomogeneousUint8,
+        Struct9BytesHomogeneousUint8,
+        Struct9BytesHomogeneousUint8,
+        Struct9BytesHomogeneousUint8,
+        Struct9BytesHomogeneousUint8)>("PassStruct9BytesHomogeneousUint8x10");
+
+/// Argument is a single byte over a multiple of word size.
+/// 10 struct arguments will exhaust available registers.
+/// Struct only has 1-byte aligned fields to test struct alignment itself.
+/// Tests upper bytes in the integer registers that are partly filled.
+/// Tests stack alignment of non word size stack arguments.
+void testPassStruct9BytesHomogeneousUint8x10() {
+  Struct9BytesHomogeneousUint8 a0 =
+      allocate<Struct9BytesHomogeneousUint8>().ref;
+  Struct9BytesHomogeneousUint8 a1 =
+      allocate<Struct9BytesHomogeneousUint8>().ref;
+  Struct9BytesHomogeneousUint8 a2 =
+      allocate<Struct9BytesHomogeneousUint8>().ref;
+  Struct9BytesHomogeneousUint8 a3 =
+      allocate<Struct9BytesHomogeneousUint8>().ref;
+  Struct9BytesHomogeneousUint8 a4 =
+      allocate<Struct9BytesHomogeneousUint8>().ref;
+  Struct9BytesHomogeneousUint8 a5 =
+      allocate<Struct9BytesHomogeneousUint8>().ref;
+  Struct9BytesHomogeneousUint8 a6 =
+      allocate<Struct9BytesHomogeneousUint8>().ref;
+  Struct9BytesHomogeneousUint8 a7 =
+      allocate<Struct9BytesHomogeneousUint8>().ref;
+  Struct9BytesHomogeneousUint8 a8 =
+      allocate<Struct9BytesHomogeneousUint8>().ref;
+  Struct9BytesHomogeneousUint8 a9 =
+      allocate<Struct9BytesHomogeneousUint8>().ref;
+
+  a0.a0 = 1;
+  a0.a1 = 2;
+  a0.a2 = 3;
+  a0.a3 = 4;
+  a0.a4 = 5;
+  a0.a5 = 6;
+  a0.a6 = 7;
+  a0.a7 = 8;
+  a0.a8 = 9;
+  a1.a0 = 10;
+  a1.a1 = 11;
+  a1.a2 = 12;
+  a1.a3 = 13;
+  a1.a4 = 14;
+  a1.a5 = 15;
+  a1.a6 = 16;
+  a1.a7 = 17;
+  a1.a8 = 18;
+  a2.a0 = 19;
+  a2.a1 = 20;
+  a2.a2 = 21;
+  a2.a3 = 22;
+  a2.a4 = 23;
+  a2.a5 = 24;
+  a2.a6 = 25;
+  a2.a7 = 26;
+  a2.a8 = 27;
+  a3.a0 = 28;
+  a3.a1 = 29;
+  a3.a2 = 30;
+  a3.a3 = 31;
+  a3.a4 = 32;
+  a3.a5 = 33;
+  a3.a6 = 34;
+  a3.a7 = 35;
+  a3.a8 = 36;
+  a4.a0 = 37;
+  a4.a1 = 38;
+  a4.a2 = 39;
+  a4.a3 = 40;
+  a4.a4 = 41;
+  a4.a5 = 42;
+  a4.a6 = 43;
+  a4.a7 = 44;
+  a4.a8 = 45;
+  a5.a0 = 46;
+  a5.a1 = 47;
+  a5.a2 = 48;
+  a5.a3 = 49;
+  a5.a4 = 50;
+  a5.a5 = 51;
+  a5.a6 = 52;
+  a5.a7 = 53;
+  a5.a8 = 54;
+  a6.a0 = 55;
+  a6.a1 = 56;
+  a6.a2 = 57;
+  a6.a3 = 58;
+  a6.a4 = 59;
+  a6.a5 = 60;
+  a6.a6 = 61;
+  a6.a7 = 62;
+  a6.a8 = 63;
+  a7.a0 = 64;
+  a7.a1 = 65;
+  a7.a2 = 66;
+  a7.a3 = 67;
+  a7.a4 = 68;
+  a7.a5 = 69;
+  a7.a6 = 70;
+  a7.a7 = 71;
+  a7.a8 = 72;
+  a8.a0 = 73;
+  a8.a1 = 74;
+  a8.a2 = 75;
+  a8.a3 = 76;
+  a8.a4 = 77;
+  a8.a5 = 78;
+  a8.a6 = 79;
+  a8.a7 = 80;
+  a8.a8 = 81;
+  a9.a0 = 82;
+  a9.a1 = 83;
+  a9.a2 = 84;
+  a9.a3 = 85;
+  a9.a4 = 86;
+  a9.a5 = 87;
+  a9.a6 = 88;
+  a9.a7 = 89;
+  a9.a8 = 90;
+
+  final result = passStruct9BytesHomogeneousUint8x10(
+      a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+  print("result = $result");
+
+  Expect.equals(4095, result);
+
+  free(a0.addressOf);
+  free(a1.addressOf);
+  free(a2.addressOf);
+  free(a3.addressOf);
+  free(a4.addressOf);
+  free(a5.addressOf);
+  free(a6.addressOf);
+  free(a7.addressOf);
+  free(a8.addressOf);
+  free(a9.addressOf);
+}
+
+final passStruct9BytesInt4Or8ByteAlignedx10 = ffiTestFunctions.lookupFunction<
+        Int64 Function(
+            Struct9BytesInt4Or8ByteAligned,
+            Struct9BytesInt4Or8ByteAligned,
+            Struct9BytesInt4Or8ByteAligned,
+            Struct9BytesInt4Or8ByteAligned,
+            Struct9BytesInt4Or8ByteAligned,
+            Struct9BytesInt4Or8ByteAligned,
+            Struct9BytesInt4Or8ByteAligned,
+            Struct9BytesInt4Or8ByteAligned,
+            Struct9BytesInt4Or8ByteAligned,
+            Struct9BytesInt4Or8ByteAligned),
+        int Function(
+            Struct9BytesInt4Or8ByteAligned,
+            Struct9BytesInt4Or8ByteAligned,
+            Struct9BytesInt4Or8ByteAligned,
+            Struct9BytesInt4Or8ByteAligned,
+            Struct9BytesInt4Or8ByteAligned,
+            Struct9BytesInt4Or8ByteAligned,
+            Struct9BytesInt4Or8ByteAligned,
+            Struct9BytesInt4Or8ByteAligned,
+            Struct9BytesInt4Or8ByteAligned,
+            Struct9BytesInt4Or8ByteAligned)>(
+    "PassStruct9BytesInt4Or8ByteAlignedx10");
+
+/// Argument is a single byte over a multiple of word size.
+/// With alignment rules taken into account size is 12 or 16 bytes.
+/// 10 struct arguments will exhaust available registers.
+///
+void testPassStruct9BytesInt4Or8ByteAlignedx10() {
+  Struct9BytesInt4Or8ByteAligned a0 =
+      allocate<Struct9BytesInt4Or8ByteAligned>().ref;
+  Struct9BytesInt4Or8ByteAligned a1 =
+      allocate<Struct9BytesInt4Or8ByteAligned>().ref;
+  Struct9BytesInt4Or8ByteAligned a2 =
+      allocate<Struct9BytesInt4Or8ByteAligned>().ref;
+  Struct9BytesInt4Or8ByteAligned a3 =
+      allocate<Struct9BytesInt4Or8ByteAligned>().ref;
+  Struct9BytesInt4Or8ByteAligned a4 =
+      allocate<Struct9BytesInt4Or8ByteAligned>().ref;
+  Struct9BytesInt4Or8ByteAligned a5 =
+      allocate<Struct9BytesInt4Or8ByteAligned>().ref;
+  Struct9BytesInt4Or8ByteAligned a6 =
+      allocate<Struct9BytesInt4Or8ByteAligned>().ref;
+  Struct9BytesInt4Or8ByteAligned a7 =
+      allocate<Struct9BytesInt4Or8ByteAligned>().ref;
+  Struct9BytesInt4Or8ByteAligned a8 =
+      allocate<Struct9BytesInt4Or8ByteAligned>().ref;
+  Struct9BytesInt4Or8ByteAligned a9 =
+      allocate<Struct9BytesInt4Or8ByteAligned>().ref;
+
+  a0.a0 = -1;
+  a0.a1 = 2;
+  a1.a0 = -3;
+  a1.a1 = 4;
+  a2.a0 = -5;
+  a2.a1 = 6;
+  a3.a0 = -7;
+  a3.a1 = 8;
+  a4.a0 = -9;
+  a4.a1 = 10;
+  a5.a0 = -11;
+  a5.a1 = 12;
+  a6.a0 = -13;
+  a6.a1 = 14;
+  a7.a0 = -15;
+  a7.a1 = 16;
+  a8.a0 = -17;
+  a8.a1 = 18;
+  a9.a0 = -19;
+  a9.a1 = 20;
+
+  final result = passStruct9BytesInt4Or8ByteAlignedx10(
+      a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+  print("result = $result");
+
+  Expect.equals(10, result);
+
+  free(a0.addressOf);
+  free(a1.addressOf);
+  free(a2.addressOf);
+  free(a3.addressOf);
+  free(a4.addressOf);
+  free(a5.addressOf);
+  free(a6.addressOf);
+  free(a7.addressOf);
+  free(a8.addressOf);
+  free(a9.addressOf);
+}
+
+final passStruct12BytesHomogeneousFloatx6 = ffiTestFunctions.lookupFunction<
+    Float Function(
+        Struct12BytesHomogeneousFloat,
+        Struct12BytesHomogeneousFloat,
+        Struct12BytesHomogeneousFloat,
+        Struct12BytesHomogeneousFloat,
+        Struct12BytesHomogeneousFloat,
+        Struct12BytesHomogeneousFloat),
+    double Function(
+        Struct12BytesHomogeneousFloat,
+        Struct12BytesHomogeneousFloat,
+        Struct12BytesHomogeneousFloat,
+        Struct12BytesHomogeneousFloat,
+        Struct12BytesHomogeneousFloat,
+        Struct12BytesHomogeneousFloat)>("PassStruct12BytesHomogeneousFloatx6");
+
+/// Arguments in FPU registers on arm hardfp and arm64.
+/// Struct arguments will exhaust available registers, and leave some empty.
+/// The last argument is to test whether arguments are backfilled.
+void testPassStruct12BytesHomogeneousFloatx6() {
+  Struct12BytesHomogeneousFloat a0 =
+      allocate<Struct12BytesHomogeneousFloat>().ref;
+  Struct12BytesHomogeneousFloat a1 =
+      allocate<Struct12BytesHomogeneousFloat>().ref;
+  Struct12BytesHomogeneousFloat a2 =
+      allocate<Struct12BytesHomogeneousFloat>().ref;
+  Struct12BytesHomogeneousFloat a3 =
+      allocate<Struct12BytesHomogeneousFloat>().ref;
+  Struct12BytesHomogeneousFloat a4 =
+      allocate<Struct12BytesHomogeneousFloat>().ref;
+  Struct12BytesHomogeneousFloat a5 =
+      allocate<Struct12BytesHomogeneousFloat>().ref;
+
+  a0.a0 = -1.0;
+  a0.a1 = 2.0;
+  a0.a2 = -3.0;
+  a1.a0 = 4.0;
+  a1.a1 = -5.0;
+  a1.a2 = 6.0;
+  a2.a0 = -7.0;
+  a2.a1 = 8.0;
+  a2.a2 = -9.0;
+  a3.a0 = 10.0;
+  a3.a1 = -11.0;
+  a3.a2 = 12.0;
+  a4.a0 = -13.0;
+  a4.a1 = 14.0;
+  a4.a2 = -15.0;
+  a5.a0 = 16.0;
+  a5.a1 = -17.0;
+  a5.a2 = 18.0;
+
+  final result = passStruct12BytesHomogeneousFloatx6(a0, a1, a2, a3, a4, a5);
+
+  print("result = $result");
+
+  Expect.approxEquals(9.0, result);
+
+  free(a0.addressOf);
+  free(a1.addressOf);
+  free(a2.addressOf);
+  free(a3.addressOf);
+  free(a4.addressOf);
+  free(a5.addressOf);
+}
+
+final passStruct16BytesHomogeneousFloatx5 = ffiTestFunctions.lookupFunction<
+    Float Function(
+        Struct16BytesHomogeneousFloat,
+        Struct16BytesHomogeneousFloat,
+        Struct16BytesHomogeneousFloat,
+        Struct16BytesHomogeneousFloat,
+        Struct16BytesHomogeneousFloat),
+    double Function(
+        Struct16BytesHomogeneousFloat,
+        Struct16BytesHomogeneousFloat,
+        Struct16BytesHomogeneousFloat,
+        Struct16BytesHomogeneousFloat,
+        Struct16BytesHomogeneousFloat)>("PassStruct16BytesHomogeneousFloatx5");
+
+/// On Linux x64 argument is transferred on stack because it is over 16 bytes.
+/// Arguments in FPU registers on arm hardfp and arm64.
+/// 5 struct arguments will exhaust available registers.
+void testPassStruct16BytesHomogeneousFloatx5() {
+  Struct16BytesHomogeneousFloat a0 =
+      allocate<Struct16BytesHomogeneousFloat>().ref;
+  Struct16BytesHomogeneousFloat a1 =
+      allocate<Struct16BytesHomogeneousFloat>().ref;
+  Struct16BytesHomogeneousFloat a2 =
+      allocate<Struct16BytesHomogeneousFloat>().ref;
+  Struct16BytesHomogeneousFloat a3 =
+      allocate<Struct16BytesHomogeneousFloat>().ref;
+  Struct16BytesHomogeneousFloat a4 =
+      allocate<Struct16BytesHomogeneousFloat>().ref;
+
+  a0.a0 = -1.0;
+  a0.a1 = 2.0;
+  a0.a2 = -3.0;
+  a0.a3 = 4.0;
+  a1.a0 = -5.0;
+  a1.a1 = 6.0;
+  a1.a2 = -7.0;
+  a1.a3 = 8.0;
+  a2.a0 = -9.0;
+  a2.a1 = 10.0;
+  a2.a2 = -11.0;
+  a2.a3 = 12.0;
+  a3.a0 = -13.0;
+  a3.a1 = 14.0;
+  a3.a2 = -15.0;
+  a3.a3 = 16.0;
+  a4.a0 = -17.0;
+  a4.a1 = 18.0;
+  a4.a2 = -19.0;
+  a4.a3 = 20.0;
+
+  final result = passStruct16BytesHomogeneousFloatx5(a0, a1, a2, a3, a4);
+
+  print("result = $result");
+
+  Expect.approxEquals(10.0, result);
+
+  free(a0.addressOf);
+  free(a1.addressOf);
+  free(a2.addressOf);
+  free(a3.addressOf);
+  free(a4.addressOf);
+}
+
+final passStruct16BytesMixedx10 = ffiTestFunctions.lookupFunction<
+    Double Function(
+        Struct16BytesMixed,
+        Struct16BytesMixed,
+        Struct16BytesMixed,
+        Struct16BytesMixed,
+        Struct16BytesMixed,
+        Struct16BytesMixed,
+        Struct16BytesMixed,
+        Struct16BytesMixed,
+        Struct16BytesMixed,
+        Struct16BytesMixed),
+    double Function(
+        Struct16BytesMixed,
+        Struct16BytesMixed,
+        Struct16BytesMixed,
+        Struct16BytesMixed,
+        Struct16BytesMixed,
+        Struct16BytesMixed,
+        Struct16BytesMixed,
+        Struct16BytesMixed,
+        Struct16BytesMixed,
+        Struct16BytesMixed)>("PassStruct16BytesMixedx10");
+
+/// On x64, arguments are split over FP and int registers.
+/// On x64, it will exhaust the integer registers with the 6th argument.
+/// The rest goes on the stack.
+/// On arm, arguments are 8 byte aligned.
+void testPassStruct16BytesMixedx10() {
+  Struct16BytesMixed a0 = allocate<Struct16BytesMixed>().ref;
+  Struct16BytesMixed a1 = allocate<Struct16BytesMixed>().ref;
+  Struct16BytesMixed a2 = allocate<Struct16BytesMixed>().ref;
+  Struct16BytesMixed a3 = allocate<Struct16BytesMixed>().ref;
+  Struct16BytesMixed a4 = allocate<Struct16BytesMixed>().ref;
+  Struct16BytesMixed a5 = allocate<Struct16BytesMixed>().ref;
+  Struct16BytesMixed a6 = allocate<Struct16BytesMixed>().ref;
+  Struct16BytesMixed a7 = allocate<Struct16BytesMixed>().ref;
+  Struct16BytesMixed a8 = allocate<Struct16BytesMixed>().ref;
+  Struct16BytesMixed a9 = allocate<Struct16BytesMixed>().ref;
+
+  a0.a0 = -1.0;
+  a0.a1 = 2;
+  a1.a0 = -3.0;
+  a1.a1 = 4;
+  a2.a0 = -5.0;
+  a2.a1 = 6;
+  a3.a0 = -7.0;
+  a3.a1 = 8;
+  a4.a0 = -9.0;
+  a4.a1 = 10;
+  a5.a0 = -11.0;
+  a5.a1 = 12;
+  a6.a0 = -13.0;
+  a6.a1 = 14;
+  a7.a0 = -15.0;
+  a7.a1 = 16;
+  a8.a0 = -17.0;
+  a8.a1 = 18;
+  a9.a0 = -19.0;
+  a9.a1 = 20;
+
+  final result =
+      passStruct16BytesMixedx10(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+  print("result = $result");
+
+  Expect.approxEquals(10.0, result);
+
+  free(a0.addressOf);
+  free(a1.addressOf);
+  free(a2.addressOf);
+  free(a3.addressOf);
+  free(a4.addressOf);
+  free(a5.addressOf);
+  free(a6.addressOf);
+  free(a7.addressOf);
+  free(a8.addressOf);
+  free(a9.addressOf);
+}
+
+final passStruct16BytesMixed2x10 = ffiTestFunctions.lookupFunction<
+    Float Function(
+        Struct16BytesMixed2,
+        Struct16BytesMixed2,
+        Struct16BytesMixed2,
+        Struct16BytesMixed2,
+        Struct16BytesMixed2,
+        Struct16BytesMixed2,
+        Struct16BytesMixed2,
+        Struct16BytesMixed2,
+        Struct16BytesMixed2,
+        Struct16BytesMixed2),
+    double Function(
+        Struct16BytesMixed2,
+        Struct16BytesMixed2,
+        Struct16BytesMixed2,
+        Struct16BytesMixed2,
+        Struct16BytesMixed2,
+        Struct16BytesMixed2,
+        Struct16BytesMixed2,
+        Struct16BytesMixed2,
+        Struct16BytesMixed2,
+        Struct16BytesMixed2)>("PassStruct16BytesMixed2x10");
+
+/// On x64, arguments are split over FP and int registers.
+/// On x64, it will exhaust the integer registers with the 6th argument.
+/// The rest goes on the stack.
+/// On arm, arguments are 4 byte aligned.
+void testPassStruct16BytesMixed2x10() {
+  Struct16BytesMixed2 a0 = allocate<Struct16BytesMixed2>().ref;
+  Struct16BytesMixed2 a1 = allocate<Struct16BytesMixed2>().ref;
+  Struct16BytesMixed2 a2 = allocate<Struct16BytesMixed2>().ref;
+  Struct16BytesMixed2 a3 = allocate<Struct16BytesMixed2>().ref;
+  Struct16BytesMixed2 a4 = allocate<Struct16BytesMixed2>().ref;
+  Struct16BytesMixed2 a5 = allocate<Struct16BytesMixed2>().ref;
+  Struct16BytesMixed2 a6 = allocate<Struct16BytesMixed2>().ref;
+  Struct16BytesMixed2 a7 = allocate<Struct16BytesMixed2>().ref;
+  Struct16BytesMixed2 a8 = allocate<Struct16BytesMixed2>().ref;
+  Struct16BytesMixed2 a9 = allocate<Struct16BytesMixed2>().ref;
+
+  a0.a0 = -1.0;
+  a0.a1 = 2.0;
+  a0.a2 = -3.0;
+  a0.a3 = 4;
+  a1.a0 = -5.0;
+  a1.a1 = 6.0;
+  a1.a2 = -7.0;
+  a1.a3 = 8;
+  a2.a0 = -9.0;
+  a2.a1 = 10.0;
+  a2.a2 = -11.0;
+  a2.a3 = 12;
+  a3.a0 = -13.0;
+  a3.a1 = 14.0;
+  a3.a2 = -15.0;
+  a3.a3 = 16;
+  a4.a0 = -17.0;
+  a4.a1 = 18.0;
+  a4.a2 = -19.0;
+  a4.a3 = 20;
+  a5.a0 = -21.0;
+  a5.a1 = 22.0;
+  a5.a2 = -23.0;
+  a5.a3 = 24;
+  a6.a0 = -25.0;
+  a6.a1 = 26.0;
+  a6.a2 = -27.0;
+  a6.a3 = 28;
+  a7.a0 = -29.0;
+  a7.a1 = 30.0;
+  a7.a2 = -31.0;
+  a7.a3 = 32;
+  a8.a0 = -33.0;
+  a8.a1 = 34.0;
+  a8.a2 = -35.0;
+  a8.a3 = 36;
+  a9.a0 = -37.0;
+  a9.a1 = 38.0;
+  a9.a2 = -39.0;
+  a9.a3 = 40;
+
+  final result =
+      passStruct16BytesMixed2x10(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+  print("result = $result");
+
+  Expect.approxEquals(20.0, result);
+
+  free(a0.addressOf);
+  free(a1.addressOf);
+  free(a2.addressOf);
+  free(a3.addressOf);
+  free(a4.addressOf);
+  free(a5.addressOf);
+  free(a6.addressOf);
+  free(a7.addressOf);
+  free(a8.addressOf);
+  free(a9.addressOf);
+}
+
+final passStruct17BytesIntx10 = ffiTestFunctions.lookupFunction<
+    Int64 Function(
+        Struct17BytesInt,
+        Struct17BytesInt,
+        Struct17BytesInt,
+        Struct17BytesInt,
+        Struct17BytesInt,
+        Struct17BytesInt,
+        Struct17BytesInt,
+        Struct17BytesInt,
+        Struct17BytesInt,
+        Struct17BytesInt),
+    int Function(
+        Struct17BytesInt,
+        Struct17BytesInt,
+        Struct17BytesInt,
+        Struct17BytesInt,
+        Struct17BytesInt,
+        Struct17BytesInt,
+        Struct17BytesInt,
+        Struct17BytesInt,
+        Struct17BytesInt,
+        Struct17BytesInt)>("PassStruct17BytesIntx10");
+
+/// Arguments are passed as pointer to copy on arm64.
+/// Tests that the memory allocated for copies are rounded up to word size.
+void testPassStruct17BytesIntx10() {
+  Struct17BytesInt a0 = allocate<Struct17BytesInt>().ref;
+  Struct17BytesInt a1 = allocate<Struct17BytesInt>().ref;
+  Struct17BytesInt a2 = allocate<Struct17BytesInt>().ref;
+  Struct17BytesInt a3 = allocate<Struct17BytesInt>().ref;
+  Struct17BytesInt a4 = allocate<Struct17BytesInt>().ref;
+  Struct17BytesInt a5 = allocate<Struct17BytesInt>().ref;
+  Struct17BytesInt a6 = allocate<Struct17BytesInt>().ref;
+  Struct17BytesInt a7 = allocate<Struct17BytesInt>().ref;
+  Struct17BytesInt a8 = allocate<Struct17BytesInt>().ref;
+  Struct17BytesInt a9 = allocate<Struct17BytesInt>().ref;
+
+  a0.a0 = -1;
+  a0.a1 = 2;
+  a0.a2 = -3;
+  a1.a0 = 4;
+  a1.a1 = -5;
+  a1.a2 = 6;
+  a2.a0 = -7;
+  a2.a1 = 8;
+  a2.a2 = -9;
+  a3.a0 = 10;
+  a3.a1 = -11;
+  a3.a2 = 12;
+  a4.a0 = -13;
+  a4.a1 = 14;
+  a4.a2 = -15;
+  a5.a0 = 16;
+  a5.a1 = -17;
+  a5.a2 = 18;
+  a6.a0 = -19;
+  a6.a1 = 20;
+  a6.a2 = -21;
+  a7.a0 = 22;
+  a7.a1 = -23;
+  a7.a2 = 24;
+  a8.a0 = -25;
+  a8.a1 = 26;
+  a8.a2 = -27;
+  a9.a0 = 28;
+  a9.a1 = -29;
+  a9.a2 = 30;
+
+  final result =
+      passStruct17BytesIntx10(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+  print("result = $result");
+
+  Expect.equals(15, result);
+
+  free(a0.addressOf);
+  free(a1.addressOf);
+  free(a2.addressOf);
+  free(a3.addressOf);
+  free(a4.addressOf);
+  free(a5.addressOf);
+  free(a6.addressOf);
+  free(a7.addressOf);
+  free(a8.addressOf);
+  free(a9.addressOf);
+}
+
+final passStruct19BytesHomogeneousUint8x10 = ffiTestFunctions.lookupFunction<
+    Int64 Function(
+        Struct19BytesHomogeneousUint8,
+        Struct19BytesHomogeneousUint8,
+        Struct19BytesHomogeneousUint8,
+        Struct19BytesHomogeneousUint8,
+        Struct19BytesHomogeneousUint8,
+        Struct19BytesHomogeneousUint8,
+        Struct19BytesHomogeneousUint8,
+        Struct19BytesHomogeneousUint8,
+        Struct19BytesHomogeneousUint8,
+        Struct19BytesHomogeneousUint8),
+    int Function(
+        Struct19BytesHomogeneousUint8,
+        Struct19BytesHomogeneousUint8,
+        Struct19BytesHomogeneousUint8,
+        Struct19BytesHomogeneousUint8,
+        Struct19BytesHomogeneousUint8,
+        Struct19BytesHomogeneousUint8,
+        Struct19BytesHomogeneousUint8,
+        Struct19BytesHomogeneousUint8,
+        Struct19BytesHomogeneousUint8,
+        Struct19BytesHomogeneousUint8)>("PassStruct19BytesHomogeneousUint8x10");
+
+/// The minimum alignment of this struct is only 1 byte based on its fields.
+/// Test that the memory backing these structs is extended to the right size.
+///
+void testPassStruct19BytesHomogeneousUint8x10() {
+  Struct19BytesHomogeneousUint8 a0 =
+      allocate<Struct19BytesHomogeneousUint8>().ref;
+  Struct19BytesHomogeneousUint8 a1 =
+      allocate<Struct19BytesHomogeneousUint8>().ref;
+  Struct19BytesHomogeneousUint8 a2 =
+      allocate<Struct19BytesHomogeneousUint8>().ref;
+  Struct19BytesHomogeneousUint8 a3 =
+      allocate<Struct19BytesHomogeneousUint8>().ref;
+  Struct19BytesHomogeneousUint8 a4 =
+      allocate<Struct19BytesHomogeneousUint8>().ref;
+  Struct19BytesHomogeneousUint8 a5 =
+      allocate<Struct19BytesHomogeneousUint8>().ref;
+  Struct19BytesHomogeneousUint8 a6 =
+      allocate<Struct19BytesHomogeneousUint8>().ref;
+  Struct19BytesHomogeneousUint8 a7 =
+      allocate<Struct19BytesHomogeneousUint8>().ref;
+  Struct19BytesHomogeneousUint8 a8 =
+      allocate<Struct19BytesHomogeneousUint8>().ref;
+  Struct19BytesHomogeneousUint8 a9 =
+      allocate<Struct19BytesHomogeneousUint8>().ref;
+
+  a0.a0 = 1;
+  a0.a1 = 2;
+  a0.a2 = 3;
+  a0.a3 = 4;
+  a0.a4 = 5;
+  a0.a5 = 6;
+  a0.a6 = 7;
+  a0.a7 = 8;
+  a0.a8 = 9;
+  a0.a9 = 10;
+  a0.a10 = 11;
+  a0.a11 = 12;
+  a0.a12 = 13;
+  a0.a13 = 14;
+  a0.a14 = 15;
+  a0.a15 = 16;
+  a0.a16 = 17;
+  a0.a17 = 18;
+  a0.a18 = 19;
+  a1.a0 = 20;
+  a1.a1 = 21;
+  a1.a2 = 22;
+  a1.a3 = 23;
+  a1.a4 = 24;
+  a1.a5 = 25;
+  a1.a6 = 26;
+  a1.a7 = 27;
+  a1.a8 = 28;
+  a1.a9 = 29;
+  a1.a10 = 30;
+  a1.a11 = 31;
+  a1.a12 = 32;
+  a1.a13 = 33;
+  a1.a14 = 34;
+  a1.a15 = 35;
+  a1.a16 = 36;
+  a1.a17 = 37;
+  a1.a18 = 38;
+  a2.a0 = 39;
+  a2.a1 = 40;
+  a2.a2 = 41;
+  a2.a3 = 42;
+  a2.a4 = 43;
+  a2.a5 = 44;
+  a2.a6 = 45;
+  a2.a7 = 46;
+  a2.a8 = 47;
+  a2.a9 = 48;
+  a2.a10 = 49;
+  a2.a11 = 50;
+  a2.a12 = 51;
+  a2.a13 = 52;
+  a2.a14 = 53;
+  a2.a15 = 54;
+  a2.a16 = 55;
+  a2.a17 = 56;
+  a2.a18 = 57;
+  a3.a0 = 58;
+  a3.a1 = 59;
+  a3.a2 = 60;
+  a3.a3 = 61;
+  a3.a4 = 62;
+  a3.a5 = 63;
+  a3.a6 = 64;
+  a3.a7 = 65;
+  a3.a8 = 66;
+  a3.a9 = 67;
+  a3.a10 = 68;
+  a3.a11 = 69;
+  a3.a12 = 70;
+  a3.a13 = 71;
+  a3.a14 = 72;
+  a3.a15 = 73;
+  a3.a16 = 74;
+  a3.a17 = 75;
+  a3.a18 = 76;
+  a4.a0 = 77;
+  a4.a1 = 78;
+  a4.a2 = 79;
+  a4.a3 = 80;
+  a4.a4 = 81;
+  a4.a5 = 82;
+  a4.a6 = 83;
+  a4.a7 = 84;
+  a4.a8 = 85;
+  a4.a9 = 86;
+  a4.a10 = 87;
+  a4.a11 = 88;
+  a4.a12 = 89;
+  a4.a13 = 90;
+  a4.a14 = 91;
+  a4.a15 = 92;
+  a4.a16 = 93;
+  a4.a17 = 94;
+  a4.a18 = 95;
+  a5.a0 = 96;
+  a5.a1 = 97;
+  a5.a2 = 98;
+  a5.a3 = 99;
+  a5.a4 = 100;
+  a5.a5 = 101;
+  a5.a6 = 102;
+  a5.a7 = 103;
+  a5.a8 = 104;
+  a5.a9 = 105;
+  a5.a10 = 106;
+  a5.a11 = 107;
+  a5.a12 = 108;
+  a5.a13 = 109;
+  a5.a14 = 110;
+  a5.a15 = 111;
+  a5.a16 = 112;
+  a5.a17 = 113;
+  a5.a18 = 114;
+  a6.a0 = 115;
+  a6.a1 = 116;
+  a6.a2 = 117;
+  a6.a3 = 118;
+  a6.a4 = 119;
+  a6.a5 = 120;
+  a6.a6 = 121;
+  a6.a7 = 122;
+  a6.a8 = 123;
+  a6.a9 = 124;
+  a6.a10 = 125;
+  a6.a11 = 126;
+  a6.a12 = 127;
+  a6.a13 = 128;
+  a6.a14 = 129;
+  a6.a15 = 130;
+  a6.a16 = 131;
+  a6.a17 = 132;
+  a6.a18 = 133;
+  a7.a0 = 134;
+  a7.a1 = 135;
+  a7.a2 = 136;
+  a7.a3 = 137;
+  a7.a4 = 138;
+  a7.a5 = 139;
+  a7.a6 = 140;
+  a7.a7 = 141;
+  a7.a8 = 142;
+  a7.a9 = 143;
+  a7.a10 = 144;
+  a7.a11 = 145;
+  a7.a12 = 146;
+  a7.a13 = 147;
+  a7.a14 = 148;
+  a7.a15 = 149;
+  a7.a16 = 150;
+  a7.a17 = 151;
+  a7.a18 = 152;
+  a8.a0 = 153;
+  a8.a1 = 154;
+  a8.a2 = 155;
+  a8.a3 = 156;
+  a8.a4 = 157;
+  a8.a5 = 158;
+  a8.a6 = 159;
+  a8.a7 = 160;
+  a8.a8 = 161;
+  a8.a9 = 162;
+  a8.a10 = 163;
+  a8.a11 = 164;
+  a8.a12 = 165;
+  a8.a13 = 166;
+  a8.a14 = 167;
+  a8.a15 = 168;
+  a8.a16 = 169;
+  a8.a17 = 170;
+  a8.a18 = 171;
+  a9.a0 = 172;
+  a9.a1 = 173;
+  a9.a2 = 174;
+  a9.a3 = 175;
+  a9.a4 = 176;
+  a9.a5 = 177;
+  a9.a6 = 178;
+  a9.a7 = 179;
+  a9.a8 = 180;
+  a9.a9 = 181;
+  a9.a10 = 182;
+  a9.a11 = 183;
+  a9.a12 = 184;
+  a9.a13 = 185;
+  a9.a14 = 186;
+  a9.a15 = 187;
+  a9.a16 = 188;
+  a9.a17 = 189;
+  a9.a18 = 190;
+
+  final result = passStruct19BytesHomogeneousUint8x10(
+      a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+  print("result = $result");
+
+  Expect.equals(18145, result);
+
+  free(a0.addressOf);
+  free(a1.addressOf);
+  free(a2.addressOf);
+  free(a3.addressOf);
+  free(a4.addressOf);
+  free(a5.addressOf);
+  free(a6.addressOf);
+  free(a7.addressOf);
+  free(a8.addressOf);
+  free(a9.addressOf);
+}
+
+final passStruct20BytesHomogeneousInt32x10 = ffiTestFunctions.lookupFunction<
+    Int32 Function(
+        Struct20BytesHomogeneousInt32,
+        Struct20BytesHomogeneousInt32,
+        Struct20BytesHomogeneousInt32,
+        Struct20BytesHomogeneousInt32,
+        Struct20BytesHomogeneousInt32,
+        Struct20BytesHomogeneousInt32,
+        Struct20BytesHomogeneousInt32,
+        Struct20BytesHomogeneousInt32,
+        Struct20BytesHomogeneousInt32,
+        Struct20BytesHomogeneousInt32),
+    int Function(
+        Struct20BytesHomogeneousInt32,
+        Struct20BytesHomogeneousInt32,
+        Struct20BytesHomogeneousInt32,
+        Struct20BytesHomogeneousInt32,
+        Struct20BytesHomogeneousInt32,
+        Struct20BytesHomogeneousInt32,
+        Struct20BytesHomogeneousInt32,
+        Struct20BytesHomogeneousInt32,
+        Struct20BytesHomogeneousInt32,
+        Struct20BytesHomogeneousInt32)>("PassStruct20BytesHomogeneousInt32x10");
+
+/// Argument too big to go into integer registers on arm64.
+/// The arguments are passed as pointers to copies.
+/// The amount of arguments exhausts the number of integer registers, such that
+/// pointers to copies are also passed on the stack.
+void testPassStruct20BytesHomogeneousInt32x10() {
+  Struct20BytesHomogeneousInt32 a0 =
+      allocate<Struct20BytesHomogeneousInt32>().ref;
+  Struct20BytesHomogeneousInt32 a1 =
+      allocate<Struct20BytesHomogeneousInt32>().ref;
+  Struct20BytesHomogeneousInt32 a2 =
+      allocate<Struct20BytesHomogeneousInt32>().ref;
+  Struct20BytesHomogeneousInt32 a3 =
+      allocate<Struct20BytesHomogeneousInt32>().ref;
+  Struct20BytesHomogeneousInt32 a4 =
+      allocate<Struct20BytesHomogeneousInt32>().ref;
+  Struct20BytesHomogeneousInt32 a5 =
+      allocate<Struct20BytesHomogeneousInt32>().ref;
+  Struct20BytesHomogeneousInt32 a6 =
+      allocate<Struct20BytesHomogeneousInt32>().ref;
+  Struct20BytesHomogeneousInt32 a7 =
+      allocate<Struct20BytesHomogeneousInt32>().ref;
+  Struct20BytesHomogeneousInt32 a8 =
+      allocate<Struct20BytesHomogeneousInt32>().ref;
+  Struct20BytesHomogeneousInt32 a9 =
+      allocate<Struct20BytesHomogeneousInt32>().ref;
+
+  a0.a0 = -1;
+  a0.a1 = 2;
+  a0.a2 = -3;
+  a0.a3 = 4;
+  a0.a4 = -5;
+  a1.a0 = 6;
+  a1.a1 = -7;
+  a1.a2 = 8;
+  a1.a3 = -9;
+  a1.a4 = 10;
+  a2.a0 = -11;
+  a2.a1 = 12;
+  a2.a2 = -13;
+  a2.a3 = 14;
+  a2.a4 = -15;
+  a3.a0 = 16;
+  a3.a1 = -17;
+  a3.a2 = 18;
+  a3.a3 = -19;
+  a3.a4 = 20;
+  a4.a0 = -21;
+  a4.a1 = 22;
+  a4.a2 = -23;
+  a4.a3 = 24;
+  a4.a4 = -25;
+  a5.a0 = 26;
+  a5.a1 = -27;
+  a5.a2 = 28;
+  a5.a3 = -29;
+  a5.a4 = 30;
+  a6.a0 = -31;
+  a6.a1 = 32;
+  a6.a2 = -33;
+  a6.a3 = 34;
+  a6.a4 = -35;
+  a7.a0 = 36;
+  a7.a1 = -37;
+  a7.a2 = 38;
+  a7.a3 = -39;
+  a7.a4 = 40;
+  a8.a0 = -41;
+  a8.a1 = 42;
+  a8.a2 = -43;
+  a8.a3 = 44;
+  a8.a4 = -45;
+  a9.a0 = 46;
+  a9.a1 = -47;
+  a9.a2 = 48;
+  a9.a3 = -49;
+  a9.a4 = 50;
+
+  final result = passStruct20BytesHomogeneousInt32x10(
+      a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+  print("result = $result");
+
+  Expect.equals(25, result);
+
+  free(a0.addressOf);
+  free(a1.addressOf);
+  free(a2.addressOf);
+  free(a3.addressOf);
+  free(a4.addressOf);
+  free(a5.addressOf);
+  free(a6.addressOf);
+  free(a7.addressOf);
+  free(a8.addressOf);
+  free(a9.addressOf);
+}
+
+final passStruct20BytesHomogeneousFloat = ffiTestFunctions.lookupFunction<
+    Float Function(Struct20BytesHomogeneousFloat),
+    double Function(
+        Struct20BytesHomogeneousFloat)>("PassStruct20BytesHomogeneousFloat");
+
+/// Argument too big to go into FPU registers in hardfp and arm64.
+void testPassStruct20BytesHomogeneousFloat() {
+  Struct20BytesHomogeneousFloat a0 =
+      allocate<Struct20BytesHomogeneousFloat>().ref;
+
+  a0.a0 = -1.0;
+  a0.a1 = 2.0;
+  a0.a2 = -3.0;
+  a0.a3 = 4.0;
+  a0.a4 = -5.0;
+
+  final result = passStruct20BytesHomogeneousFloat(a0);
+
+  print("result = $result");
+
+  Expect.approxEquals(-3.0, result);
+
+  free(a0.addressOf);
+}
+
+final passStruct32BytesHomogeneousDoublex5 = ffiTestFunctions.lookupFunction<
+        Double Function(
+            Struct32BytesHomogeneousDouble,
+            Struct32BytesHomogeneousDouble,
+            Struct32BytesHomogeneousDouble,
+            Struct32BytesHomogeneousDouble,
+            Struct32BytesHomogeneousDouble),
+        double Function(
+            Struct32BytesHomogeneousDouble,
+            Struct32BytesHomogeneousDouble,
+            Struct32BytesHomogeneousDouble,
+            Struct32BytesHomogeneousDouble,
+            Struct32BytesHomogeneousDouble)>(
+    "PassStruct32BytesHomogeneousDoublex5");
+
+/// Arguments in FPU registers on arm64.
+/// 5 struct arguments will exhaust available registers.
+void testPassStruct32BytesHomogeneousDoublex5() {
+  Struct32BytesHomogeneousDouble a0 =
+      allocate<Struct32BytesHomogeneousDouble>().ref;
+  Struct32BytesHomogeneousDouble a1 =
+      allocate<Struct32BytesHomogeneousDouble>().ref;
+  Struct32BytesHomogeneousDouble a2 =
+      allocate<Struct32BytesHomogeneousDouble>().ref;
+  Struct32BytesHomogeneousDouble a3 =
+      allocate<Struct32BytesHomogeneousDouble>().ref;
+  Struct32BytesHomogeneousDouble a4 =
+      allocate<Struct32BytesHomogeneousDouble>().ref;
+
+  a0.a0 = -1.0;
+  a0.a1 = 2.0;
+  a0.a2 = -3.0;
+  a0.a3 = 4.0;
+  a1.a0 = -5.0;
+  a1.a1 = 6.0;
+  a1.a2 = -7.0;
+  a1.a3 = 8.0;
+  a2.a0 = -9.0;
+  a2.a1 = 10.0;
+  a2.a2 = -11.0;
+  a2.a3 = 12.0;
+  a3.a0 = -13.0;
+  a3.a1 = 14.0;
+  a3.a2 = -15.0;
+  a3.a3 = 16.0;
+  a4.a0 = -17.0;
+  a4.a1 = 18.0;
+  a4.a2 = -19.0;
+  a4.a3 = 20.0;
+
+  final result = passStruct32BytesHomogeneousDoublex5(a0, a1, a2, a3, a4);
+
+  print("result = $result");
+
+  Expect.approxEquals(10.0, result);
+
+  free(a0.addressOf);
+  free(a1.addressOf);
+  free(a2.addressOf);
+  free(a3.addressOf);
+  free(a4.addressOf);
+}
+
+final passStruct40BytesHomogeneousDouble = ffiTestFunctions.lookupFunction<
+    Double Function(Struct40BytesHomogeneousDouble),
+    double Function(
+        Struct40BytesHomogeneousDouble)>("PassStruct40BytesHomogeneousDouble");
+
+/// Argument too big to go into FPU registers in arm64.
+void testPassStruct40BytesHomogeneousDouble() {
+  Struct40BytesHomogeneousDouble a0 =
+      allocate<Struct40BytesHomogeneousDouble>().ref;
+
+  a0.a0 = -1.0;
+  a0.a1 = 2.0;
+  a0.a2 = -3.0;
+  a0.a3 = 4.0;
+  a0.a4 = -5.0;
+
+  final result = passStruct40BytesHomogeneousDouble(a0);
+
+  print("result = $result");
+
+  Expect.approxEquals(-3.0, result);
+
+  free(a0.addressOf);
+}
+
+final passStruct1024BytesHomogeneousUint64 = ffiTestFunctions.lookupFunction<
+        Uint64 Function(Struct1024BytesHomogeneousUint64),
+        int Function(Struct1024BytesHomogeneousUint64)>(
+    "PassStruct1024BytesHomogeneousUint64");
+
+/// Test 1kb struct.
+void testPassStruct1024BytesHomogeneousUint64() {
+  Struct1024BytesHomogeneousUint64 a0 =
+      allocate<Struct1024BytesHomogeneousUint64>().ref;
+
+  a0.a0 = 1;
+  a0.a1 = 2;
+  a0.a2 = 3;
+  a0.a3 = 4;
+  a0.a4 = 5;
+  a0.a5 = 6;
+  a0.a6 = 7;
+  a0.a7 = 8;
+  a0.a8 = 9;
+  a0.a9 = 10;
+  a0.a10 = 11;
+  a0.a11 = 12;
+  a0.a12 = 13;
+  a0.a13 = 14;
+  a0.a14 = 15;
+  a0.a15 = 16;
+  a0.a16 = 17;
+  a0.a17 = 18;
+  a0.a18 = 19;
+  a0.a19 = 20;
+  a0.a20 = 21;
+  a0.a21 = 22;
+  a0.a22 = 23;
+  a0.a23 = 24;
+  a0.a24 = 25;
+  a0.a25 = 26;
+  a0.a26 = 27;
+  a0.a27 = 28;
+  a0.a28 = 29;
+  a0.a29 = 30;
+  a0.a30 = 31;
+  a0.a31 = 32;
+  a0.a32 = 33;
+  a0.a33 = 34;
+  a0.a34 = 35;
+  a0.a35 = 36;
+  a0.a36 = 37;
+  a0.a37 = 38;
+  a0.a38 = 39;
+  a0.a39 = 40;
+  a0.a40 = 41;
+  a0.a41 = 42;
+  a0.a42 = 43;
+  a0.a43 = 44;
+  a0.a44 = 45;
+  a0.a45 = 46;
+  a0.a46 = 47;
+  a0.a47 = 48;
+  a0.a48 = 49;
+  a0.a49 = 50;
+  a0.a50 = 51;
+  a0.a51 = 52;
+  a0.a52 = 53;
+  a0.a53 = 54;
+  a0.a54 = 55;
+  a0.a55 = 56;
+  a0.a56 = 57;
+  a0.a57 = 58;
+  a0.a58 = 59;
+  a0.a59 = 60;
+  a0.a60 = 61;
+  a0.a61 = 62;
+  a0.a62 = 63;
+  a0.a63 = 64;
+  a0.a64 = 65;
+  a0.a65 = 66;
+  a0.a66 = 67;
+  a0.a67 = 68;
+  a0.a68 = 69;
+  a0.a69 = 70;
+  a0.a70 = 71;
+  a0.a71 = 72;
+  a0.a72 = 73;
+  a0.a73 = 74;
+  a0.a74 = 75;
+  a0.a75 = 76;
+  a0.a76 = 77;
+  a0.a77 = 78;
+  a0.a78 = 79;
+  a0.a79 = 80;
+  a0.a80 = 81;
+  a0.a81 = 82;
+  a0.a82 = 83;
+  a0.a83 = 84;
+  a0.a84 = 85;
+  a0.a85 = 86;
+  a0.a86 = 87;
+  a0.a87 = 88;
+  a0.a88 = 89;
+  a0.a89 = 90;
+  a0.a90 = 91;
+  a0.a91 = 92;
+  a0.a92 = 93;
+  a0.a93 = 94;
+  a0.a94 = 95;
+  a0.a95 = 96;
+  a0.a96 = 97;
+  a0.a97 = 98;
+  a0.a98 = 99;
+  a0.a99 = 100;
+  a0.a100 = 101;
+  a0.a101 = 102;
+  a0.a102 = 103;
+  a0.a103 = 104;
+  a0.a104 = 105;
+  a0.a105 = 106;
+  a0.a106 = 107;
+  a0.a107 = 108;
+  a0.a108 = 109;
+  a0.a109 = 110;
+  a0.a110 = 111;
+  a0.a111 = 112;
+  a0.a112 = 113;
+  a0.a113 = 114;
+  a0.a114 = 115;
+  a0.a115 = 116;
+  a0.a116 = 117;
+  a0.a117 = 118;
+  a0.a118 = 119;
+  a0.a119 = 120;
+  a0.a120 = 121;
+  a0.a121 = 122;
+  a0.a122 = 123;
+  a0.a123 = 124;
+  a0.a124 = 125;
+  a0.a125 = 126;
+  a0.a126 = 127;
+  a0.a127 = 128;
+
+  final result = passStruct1024BytesHomogeneousUint64(a0);
+
+  print("result = $result");
+
+  Expect.equals(8256, result);
+
+  free(a0.addressOf);
+}
+
+final passFloatStruct16BytesHomogeneousFloatFloatStruct1 =
+    ffiTestFunctions.lookupFunction<
+        Float Function(
+            Float,
+            Struct16BytesHomogeneousFloat,
+            Float,
+            Struct16BytesHomogeneousFloat,
+            Float,
+            Struct16BytesHomogeneousFloat,
+            Float,
+            Struct16BytesHomogeneousFloat,
+            Float),
+        double Function(
+            double,
+            Struct16BytesHomogeneousFloat,
+            double,
+            Struct16BytesHomogeneousFloat,
+            double,
+            Struct16BytesHomogeneousFloat,
+            double,
+            Struct16BytesHomogeneousFloat,
+            double)>("PassFloatStruct16BytesHomogeneousFloatFloatStruct1");
+
+/// Tests the alignment of structs in FPU registers and backfilling.
+void testPassFloatStruct16BytesHomogeneousFloatFloatStruct1() {
+  double a0;
+  Struct16BytesHomogeneousFloat a1 =
+      allocate<Struct16BytesHomogeneousFloat>().ref;
+  double a2;
+  Struct16BytesHomogeneousFloat a3 =
+      allocate<Struct16BytesHomogeneousFloat>().ref;
+  double a4;
+  Struct16BytesHomogeneousFloat a5 =
+      allocate<Struct16BytesHomogeneousFloat>().ref;
+  double a6;
+  Struct16BytesHomogeneousFloat a7 =
+      allocate<Struct16BytesHomogeneousFloat>().ref;
+  double a8;
+
+  a0 = -1.0;
+  a1.a0 = 2.0;
+  a1.a1 = -3.0;
+  a1.a2 = 4.0;
+  a1.a3 = -5.0;
+  a2 = 6.0;
+  a3.a0 = -7.0;
+  a3.a1 = 8.0;
+  a3.a2 = -9.0;
+  a3.a3 = 10.0;
+  a4 = -11.0;
+  a5.a0 = 12.0;
+  a5.a1 = -13.0;
+  a5.a2 = 14.0;
+  a5.a3 = -15.0;
+  a6 = 16.0;
+  a7.a0 = -17.0;
+  a7.a1 = 18.0;
+  a7.a2 = -19.0;
+  a7.a3 = 20.0;
+  a8 = -21.0;
+
+  final result = passFloatStruct16BytesHomogeneousFloatFloatStruct1(
+      a0, a1, a2, a3, a4, a5, a6, a7, a8);
+
+  print("result = $result");
+
+  Expect.approxEquals(-11.0, result);
+
+  free(a1.addressOf);
+  free(a3.addressOf);
+  free(a5.addressOf);
+  free(a7.addressOf);
+}
+
+final passFloatStruct32BytesHomogeneousDoubleFloatStruct =
+    ffiTestFunctions.lookupFunction<
+        Double Function(
+            Float,
+            Struct32BytesHomogeneousDouble,
+            Float,
+            Struct32BytesHomogeneousDouble,
+            Float,
+            Struct32BytesHomogeneousDouble,
+            Float,
+            Struct32BytesHomogeneousDouble,
+            Float),
+        double Function(
+            double,
+            Struct32BytesHomogeneousDouble,
+            double,
+            Struct32BytesHomogeneousDouble,
+            double,
+            Struct32BytesHomogeneousDouble,
+            double,
+            Struct32BytesHomogeneousDouble,
+            double)>("PassFloatStruct32BytesHomogeneousDoubleFloatStruct");
+
+/// Tests the alignment of structs in FPU registers and backfilling.
+void testPassFloatStruct32BytesHomogeneousDoubleFloatStruct() {
+  double a0;
+  Struct32BytesHomogeneousDouble a1 =
+      allocate<Struct32BytesHomogeneousDouble>().ref;
+  double a2;
+  Struct32BytesHomogeneousDouble a3 =
+      allocate<Struct32BytesHomogeneousDouble>().ref;
+  double a4;
+  Struct32BytesHomogeneousDouble a5 =
+      allocate<Struct32BytesHomogeneousDouble>().ref;
+  double a6;
+  Struct32BytesHomogeneousDouble a7 =
+      allocate<Struct32BytesHomogeneousDouble>().ref;
+  double a8;
+
+  a0 = -1.0;
+  a1.a0 = 2.0;
+  a1.a1 = -3.0;
+  a1.a2 = 4.0;
+  a1.a3 = -5.0;
+  a2 = 6.0;
+  a3.a0 = -7.0;
+  a3.a1 = 8.0;
+  a3.a2 = -9.0;
+  a3.a3 = 10.0;
+  a4 = -11.0;
+  a5.a0 = 12.0;
+  a5.a1 = -13.0;
+  a5.a2 = 14.0;
+  a5.a3 = -15.0;
+  a6 = 16.0;
+  a7.a0 = -17.0;
+  a7.a1 = 18.0;
+  a7.a2 = -19.0;
+  a7.a3 = 20.0;
+  a8 = -21.0;
+
+  final result = passFloatStruct32BytesHomogeneousDoubleFloatStruct(
+      a0, a1, a2, a3, a4, a5, a6, a7, a8);
+
+  print("result = $result");
+
+  Expect.approxEquals(-11.0, result);
+
+  free(a1.addressOf);
+  free(a3.addressOf);
+  free(a5.addressOf);
+  free(a7.addressOf);
+}
+
+final passInt8Struct16BytesMixedInt8Struct16BytesMixedIn =
+    ffiTestFunctions.lookupFunction<
+        Double Function(Int8, Struct16BytesMixed, Int8, Struct16BytesMixed,
+            Int8, Struct16BytesMixed, Int8, Struct16BytesMixed, Int8),
+        double Function(
+            int,
+            Struct16BytesMixed,
+            int,
+            Struct16BytesMixed,
+            int,
+            Struct16BytesMixed,
+            int,
+            Struct16BytesMixed,
+            int)>("PassInt8Struct16BytesMixedInt8Struct16BytesMixedIn");
+
+/// Tests the alignment of structs in integers registers and on the stack.
+/// Arm32 aligns this struct at 8.
+/// Also, arm32 allocates the second struct partially in registers, partially
+/// on stack.
+/// Test backfilling of integer registers.
+void testPassInt8Struct16BytesMixedInt8Struct16BytesMixedIn() {
+  int a0;
+  Struct16BytesMixed a1 = allocate<Struct16BytesMixed>().ref;
+  int a2;
+  Struct16BytesMixed a3 = allocate<Struct16BytesMixed>().ref;
+  int a4;
+  Struct16BytesMixed a5 = allocate<Struct16BytesMixed>().ref;
+  int a6;
+  Struct16BytesMixed a7 = allocate<Struct16BytesMixed>().ref;
+  int a8;
+
+  a0 = -1;
+  a1.a0 = 2.0;
+  a1.a1 = -3;
+  a2 = 4;
+  a3.a0 = -5.0;
+  a3.a1 = 6;
+  a4 = -7;
+  a5.a0 = 8.0;
+  a5.a1 = -9;
+  a6 = 10;
+  a7.a0 = -11.0;
+  a7.a1 = 12;
+  a8 = -13;
+
+  final result = passInt8Struct16BytesMixedInt8Struct16BytesMixedIn(
+      a0, a1, a2, a3, a4, a5, a6, a7, a8);
+
+  print("result = $result");
+
+  Expect.approxEquals(-7.0, result);
+
+  free(a1.addressOf);
+  free(a3.addressOf);
+  free(a5.addressOf);
+  free(a7.addressOf);
+}
+
+final passDoublex6Struct16BytesMixedx4Int32 = ffiTestFunctions.lookupFunction<
+    Double Function(
+        Double,
+        Double,
+        Double,
+        Double,
+        Double,
+        Double,
+        Struct16BytesMixed,
+        Struct16BytesMixed,
+        Struct16BytesMixed,
+        Struct16BytesMixed,
+        Int32),
+    double Function(
+        double,
+        double,
+        double,
+        double,
+        double,
+        double,
+        Struct16BytesMixed,
+        Struct16BytesMixed,
+        Struct16BytesMixed,
+        Struct16BytesMixed,
+        int)>("PassDoublex6Struct16BytesMixedx4Int32");
+
+/// On Linux x64, it will exhaust xmm registers first, after 6 doubles and 2
+/// structs. The rest of the structs will go on the stack.
+/// The int will be backfilled into the int register.
+void testPassDoublex6Struct16BytesMixedx4Int32() {
+  double a0;
+  double a1;
+  double a2;
+  double a3;
+  double a4;
+  double a5;
+  Struct16BytesMixed a6 = allocate<Struct16BytesMixed>().ref;
+  Struct16BytesMixed a7 = allocate<Struct16BytesMixed>().ref;
+  Struct16BytesMixed a8 = allocate<Struct16BytesMixed>().ref;
+  Struct16BytesMixed a9 = allocate<Struct16BytesMixed>().ref;
+  int a10;
+
+  a0 = -1.0;
+  a1 = 2.0;
+  a2 = -3.0;
+  a3 = 4.0;
+  a4 = -5.0;
+  a5 = 6.0;
+  a6.a0 = -7.0;
+  a6.a1 = 8;
+  a7.a0 = -9.0;
+  a7.a1 = 10;
+  a8.a0 = -11.0;
+  a8.a1 = 12;
+  a9.a0 = -13.0;
+  a9.a1 = 14;
+  a10 = -15;
+
+  final result = passDoublex6Struct16BytesMixedx4Int32(
+      a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10);
+
+  print("result = $result");
+
+  Expect.approxEquals(-8.0, result);
+
+  free(a6.addressOf);
+  free(a7.addressOf);
+  free(a8.addressOf);
+  free(a9.addressOf);
+}
+
+final passInt32x4Struct16BytesMixedx4Double = ffiTestFunctions.lookupFunction<
+    Double Function(Int32, Int32, Int32, Int32, Struct16BytesMixed,
+        Struct16BytesMixed, Struct16BytesMixed, Struct16BytesMixed, Double),
+    double Function(
+        int,
+        int,
+        int,
+        int,
+        Struct16BytesMixed,
+        Struct16BytesMixed,
+        Struct16BytesMixed,
+        Struct16BytesMixed,
+        double)>("PassInt32x4Struct16BytesMixedx4Double");
+
+/// On Linux x64, it will exhaust int registers first.
+/// The rest of the structs will go on the stack.
+/// The double will be backfilled into the xmm register.
+void testPassInt32x4Struct16BytesMixedx4Double() {
+  int a0;
+  int a1;
+  int a2;
+  int a3;
+  Struct16BytesMixed a4 = allocate<Struct16BytesMixed>().ref;
+  Struct16BytesMixed a5 = allocate<Struct16BytesMixed>().ref;
+  Struct16BytesMixed a6 = allocate<Struct16BytesMixed>().ref;
+  Struct16BytesMixed a7 = allocate<Struct16BytesMixed>().ref;
+  double a8;
+
+  a0 = -1;
+  a1 = 2;
+  a2 = -3;
+  a3 = 4;
+  a4.a0 = -5.0;
+  a4.a1 = 6;
+  a5.a0 = -7.0;
+  a5.a1 = 8;
+  a6.a0 = -9.0;
+  a6.a1 = 10;
+  a7.a0 = -11.0;
+  a7.a1 = 12;
+  a8 = -13.0;
+
+  final result =
+      passInt32x4Struct16BytesMixedx4Double(a0, a1, a2, a3, a4, a5, a6, a7, a8);
+
+  print("result = $result");
+
+  Expect.approxEquals(-7.0, result);
+
+  free(a4.addressOf);
+  free(a5.addressOf);
+  free(a6.addressOf);
+  free(a7.addressOf);
+}
+
+final passStruct40BytesHomogeneousDoubleStruct4BytesHomo =
+    ffiTestFunctions.lookupFunction<
+            Double Function(Struct40BytesHomogeneousDouble,
+                Struct4BytesHomogeneousInt16, Struct8BytesHomogeneousFloat),
+            double Function(Struct40BytesHomogeneousDouble,
+                Struct4BytesHomogeneousInt16, Struct8BytesHomogeneousFloat)>(
+        "PassStruct40BytesHomogeneousDoubleStruct4BytesHomo");
+
+/// On various architectures, first struct is allocated on stack.
+/// Check that the other two arguments are allocated on registers.
+void testPassStruct40BytesHomogeneousDoubleStruct4BytesHomo() {
+  Struct40BytesHomogeneousDouble a0 =
+      allocate<Struct40BytesHomogeneousDouble>().ref;
+  Struct4BytesHomogeneousInt16 a1 =
+      allocate<Struct4BytesHomogeneousInt16>().ref;
+  Struct8BytesHomogeneousFloat a2 =
+      allocate<Struct8BytesHomogeneousFloat>().ref;
+
+  a0.a0 = -1.0;
+  a0.a1 = 2.0;
+  a0.a2 = -3.0;
+  a0.a3 = 4.0;
+  a0.a4 = -5.0;
+  a1.a0 = 6;
+  a1.a1 = -7;
+  a2.a0 = 8.0;
+  a2.a1 = -9.0;
+
+  final result = passStruct40BytesHomogeneousDoubleStruct4BytesHomo(a0, a1, a2);
+
+  print("result = $result");
+
+  Expect.approxEquals(-5.0, result);
+
+  free(a0.addressOf);
+  free(a1.addressOf);
+  free(a2.addressOf);
+}
+
+final passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int =
+    ffiTestFunctions.lookupFunction<
+        Double Function(
+            Int32,
+            Int32,
+            Int32,
+            Int32,
+            Int32,
+            Int32,
+            Int32,
+            Int32,
+            Double,
+            Double,
+            Double,
+            Double,
+            Double,
+            Double,
+            Double,
+            Double,
+            Int64,
+            Int8,
+            Struct1ByteInt,
+            Int64,
+            Int8,
+            Struct4BytesHomogeneousInt16,
+            Int64,
+            Int8,
+            Struct8BytesInt,
+            Int64,
+            Int8,
+            Struct8BytesHomogeneousFloat,
+            Int64,
+            Int8,
+            Struct8BytesMixed,
+            Int64,
+            Int8,
+            StructAlignmentInt16,
+            Int64,
+            Int8,
+            StructAlignmentInt32,
+            Int64,
+            Int8,
+            StructAlignmentInt64),
+        double Function(
+            int,
+            int,
+            int,
+            int,
+            int,
+            int,
+            int,
+            int,
+            double,
+            double,
+            double,
+            double,
+            double,
+            double,
+            double,
+            double,
+            int,
+            int,
+            Struct1ByteInt,
+            int,
+            int,
+            Struct4BytesHomogeneousInt16,
+            int,
+            int,
+            Struct8BytesInt,
+            int,
+            int,
+            Struct8BytesHomogeneousFloat,
+            int,
+            int,
+            Struct8BytesMixed,
+            int,
+            int,
+            StructAlignmentInt16,
+            int,
+            int,
+            StructAlignmentInt32,
+            int,
+            int,
+            StructAlignmentInt64)>("PassInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int");
+
+/// Test alignment and padding of 16 byte int within struct.
+void testPassInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int() {
+  int a0;
+  int a1;
+  int a2;
+  int a3;
+  int a4;
+  int a5;
+  int a6;
+  int a7;
+  double a8;
+  double a9;
+  double a10;
+  double a11;
+  double a12;
+  double a13;
+  double a14;
+  double a15;
+  int a16;
+  int a17;
+  Struct1ByteInt a18 = allocate<Struct1ByteInt>().ref;
+  int a19;
+  int a20;
+  Struct4BytesHomogeneousInt16 a21 =
+      allocate<Struct4BytesHomogeneousInt16>().ref;
+  int a22;
+  int a23;
+  Struct8BytesInt a24 = allocate<Struct8BytesInt>().ref;
+  int a25;
+  int a26;
+  Struct8BytesHomogeneousFloat a27 =
+      allocate<Struct8BytesHomogeneousFloat>().ref;
+  int a28;
+  int a29;
+  Struct8BytesMixed a30 = allocate<Struct8BytesMixed>().ref;
+  int a31;
+  int a32;
+  StructAlignmentInt16 a33 = allocate<StructAlignmentInt16>().ref;
+  int a34;
+  int a35;
+  StructAlignmentInt32 a36 = allocate<StructAlignmentInt32>().ref;
+  int a37;
+  int a38;
+  StructAlignmentInt64 a39 = allocate<StructAlignmentInt64>().ref;
+
+  a0 = -1;
+  a1 = 2;
+  a2 = -3;
+  a3 = 4;
+  a4 = -5;
+  a5 = 6;
+  a6 = -7;
+  a7 = 8;
+  a8 = -9.0;
+  a9 = 10.0;
+  a10 = -11.0;
+  a11 = 12.0;
+  a12 = -13.0;
+  a13 = 14.0;
+  a14 = -15.0;
+  a15 = 16.0;
+  a16 = -17;
+  a17 = 18;
+  a18.a0 = -19;
+  a19 = 20;
+  a20 = -21;
+  a21.a0 = 22;
+  a21.a1 = -23;
+  a22 = 24;
+  a23 = -25;
+  a24.a0 = 26;
+  a24.a1 = -27;
+  a24.a2 = 28;
+  a25 = -29;
+  a26 = 30;
+  a27.a0 = -31.0;
+  a27.a1 = 32.0;
+  a28 = -33;
+  a29 = 34;
+  a30.a0 = -35.0;
+  a30.a1 = 36;
+  a30.a2 = -37;
+  a31 = 38;
+  a32 = -39;
+  a33.a0 = 40;
+  a33.a1 = -41;
+  a33.a2 = 42;
+  a34 = -43;
+  a35 = 44;
+  a36.a0 = -45;
+  a36.a1 = 46;
+  a36.a2 = -47;
+  a37 = 48;
+  a38 = -49;
+  a39.a0 = 50;
+  a39.a1 = -51;
+  a39.a2 = 52;
+
+  final result = passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int(
+      a0,
+      a1,
+      a2,
+      a3,
+      a4,
+      a5,
+      a6,
+      a7,
+      a8,
+      a9,
+      a10,
+      a11,
+      a12,
+      a13,
+      a14,
+      a15,
+      a16,
+      a17,
+      a18,
+      a19,
+      a20,
+      a21,
+      a22,
+      a23,
+      a24,
+      a25,
+      a26,
+      a27,
+      a28,
+      a29,
+      a30,
+      a31,
+      a32,
+      a33,
+      a34,
+      a35,
+      a36,
+      a37,
+      a38,
+      a39);
+
+  print("result = $result");
+
+  Expect.approxEquals(26.0, result);
+
+  free(a18.addressOf);
+  free(a21.addressOf);
+  free(a24.addressOf);
+  free(a27.addressOf);
+  free(a30.addressOf);
+  free(a33.addressOf);
+  free(a36.addressOf);
+  free(a39.addressOf);
+}
+
+final passStructAlignmentInt16 = ffiTestFunctions.lookupFunction<
+    Int64 Function(StructAlignmentInt16),
+    int Function(StructAlignmentInt16)>("PassStructAlignmentInt16");
+
+/// Test alignment and padding of 16 byte int within struct.
+void testPassStructAlignmentInt16() {
+  StructAlignmentInt16 a0 = allocate<StructAlignmentInt16>().ref;
+
+  a0.a0 = -1;
+  a0.a1 = 2;
+  a0.a2 = -3;
+
+  final result = passStructAlignmentInt16(a0);
+
+  print("result = $result");
+
+  Expect.equals(-2, result);
+
+  free(a0.addressOf);
+}
+
+final passStructAlignmentInt32 = ffiTestFunctions.lookupFunction<
+    Int64 Function(StructAlignmentInt32),
+    int Function(StructAlignmentInt32)>("PassStructAlignmentInt32");
+
+/// Test alignment and padding of 32 byte int within struct.
+void testPassStructAlignmentInt32() {
+  StructAlignmentInt32 a0 = allocate<StructAlignmentInt32>().ref;
+
+  a0.a0 = -1;
+  a0.a1 = 2;
+  a0.a2 = -3;
+
+  final result = passStructAlignmentInt32(a0);
+
+  print("result = $result");
+
+  Expect.equals(-2, result);
+
+  free(a0.addressOf);
+}
+
+final passStructAlignmentInt64 = ffiTestFunctions.lookupFunction<
+    Int64 Function(StructAlignmentInt64),
+    int Function(StructAlignmentInt64)>("PassStructAlignmentInt64");
+
+/// Test alignment and padding of 64 byte int within struct.
+void testPassStructAlignmentInt64() {
+  StructAlignmentInt64 a0 = allocate<StructAlignmentInt64>().ref;
+
+  a0.a0 = -1;
+  a0.a1 = 2;
+  a0.a2 = -3;
+
+  final result = passStructAlignmentInt64(a0);
+
+  print("result = $result");
+
+  Expect.equals(-2, result);
+
+  free(a0.addressOf);
+}
+
+final returnStruct1ByteInt = ffiTestFunctions.lookupFunction<
+    Struct1ByteInt Function(Int8),
+    Struct1ByteInt Function(int)>("ReturnStruct1ByteInt");
+
+/// Smallest struct with data.
+void testReturnStruct1ByteInt() {
+  int a0;
+
+  a0 = -1;
+
+  final result = returnStruct1ByteInt(a0);
+
+  print("result = $result");
+
+  Expect.equals(a0, result.a0);
+}
+
+final returnStruct3BytesHomogeneousUint8 = ffiTestFunctions.lookupFunction<
+    Struct3BytesHomogeneousUint8 Function(Uint8, Uint8, Uint8),
+    Struct3BytesHomogeneousUint8 Function(
+        int, int, int)>("ReturnStruct3BytesHomogeneousUint8");
+
+/// Smaller than word size return value on all architectures.
+void testReturnStruct3BytesHomogeneousUint8() {
+  int a0;
+  int a1;
+  int a2;
+
+  a0 = 1;
+  a1 = 2;
+  a2 = 3;
+
+  final result = returnStruct3BytesHomogeneousUint8(a0, a1, a2);
+
+  print("result = $result");
+
+  Expect.equals(a0, result.a0);
+  Expect.equals(a1, result.a1);
+  Expect.equals(a2, result.a2);
+}
+
+final returnStruct3BytesInt2ByteAligned = ffiTestFunctions.lookupFunction<
+    Struct3BytesInt2ByteAligned Function(Int16, Int8),
+    Struct3BytesInt2ByteAligned Function(
+        int, int)>("ReturnStruct3BytesInt2ByteAligned");
+
+/// Smaller than word size return value on all architectures.
+/// With alignment rules taken into account size is 4 bytes.
+void testReturnStruct3BytesInt2ByteAligned() {
+  int a0;
+  int a1;
+
+  a0 = -1;
+  a1 = 2;
+
+  final result = returnStruct3BytesInt2ByteAligned(a0, a1);
+
+  print("result = $result");
+
+  Expect.equals(a0, result.a0);
+  Expect.equals(a1, result.a1);
+}
+
+final returnStruct4BytesHomogeneousInt16 = ffiTestFunctions.lookupFunction<
+    Struct4BytesHomogeneousInt16 Function(Int16, Int16),
+    Struct4BytesHomogeneousInt16 Function(
+        int, int)>("ReturnStruct4BytesHomogeneousInt16");
+
+/// Word size return value on 32 bit architectures..
+void testReturnStruct4BytesHomogeneousInt16() {
+  int a0;
+  int a1;
+
+  a0 = -1;
+  a1 = 2;
+
+  final result = returnStruct4BytesHomogeneousInt16(a0, a1);
+
+  print("result = $result");
+
+  Expect.equals(a0, result.a0);
+  Expect.equals(a1, result.a1);
+}
+
+final returnStruct7BytesHomogeneousUint8 = ffiTestFunctions.lookupFunction<
+    Struct7BytesHomogeneousUint8 Function(
+        Uint8, Uint8, Uint8, Uint8, Uint8, Uint8, Uint8),
+    Struct7BytesHomogeneousUint8 Function(int, int, int, int, int, int,
+        int)>("ReturnStruct7BytesHomogeneousUint8");
+
+/// Non-wordsize return value.
+void testReturnStruct7BytesHomogeneousUint8() {
+  int a0;
+  int a1;
+  int a2;
+  int a3;
+  int a4;
+  int a5;
+  int a6;
+
+  a0 = 1;
+  a1 = 2;
+  a2 = 3;
+  a3 = 4;
+  a4 = 5;
+  a5 = 6;
+  a6 = 7;
+
+  final result = returnStruct7BytesHomogeneousUint8(a0, a1, a2, a3, a4, a5, a6);
+
+  print("result = $result");
+
+  Expect.equals(a0, result.a0);
+  Expect.equals(a1, result.a1);
+  Expect.equals(a2, result.a2);
+  Expect.equals(a3, result.a3);
+  Expect.equals(a4, result.a4);
+  Expect.equals(a5, result.a5);
+  Expect.equals(a6, result.a6);
+}
+
+final returnStruct7BytesInt4ByteAligned = ffiTestFunctions.lookupFunction<
+    Struct7BytesInt4ByteAligned Function(Int32, Int16, Int8),
+    Struct7BytesInt4ByteAligned Function(
+        int, int, int)>("ReturnStruct7BytesInt4ByteAligned");
+
+/// Non-wordsize return value.
+/// With alignment rules taken into account size is 8 bytes.
+void testReturnStruct7BytesInt4ByteAligned() {
+  int a0;
+  int a1;
+  int a2;
+
+  a0 = -1;
+  a1 = 2;
+  a2 = -3;
+
+  final result = returnStruct7BytesInt4ByteAligned(a0, a1, a2);
+
+  print("result = $result");
+
+  Expect.equals(a0, result.a0);
+  Expect.equals(a1, result.a1);
+  Expect.equals(a2, result.a2);
+}
+
+final returnStruct8BytesInt = ffiTestFunctions.lookupFunction<
+    Struct8BytesInt Function(Int16, Int16, Int32),
+    Struct8BytesInt Function(int, int, int)>("ReturnStruct8BytesInt");
+
+/// Return value in integer registers on many architectures.
+void testReturnStruct8BytesInt() {
+  int a0;
+  int a1;
+  int a2;
+
+  a0 = -1;
+  a1 = 2;
+  a2 = -3;
+
+  final result = returnStruct8BytesInt(a0, a1, a2);
+
+  print("result = $result");
+
+  Expect.equals(a0, result.a0);
+  Expect.equals(a1, result.a1);
+  Expect.equals(a2, result.a2);
+}
+
+final returnStruct8BytesHomogeneousFloat = ffiTestFunctions.lookupFunction<
+    Struct8BytesHomogeneousFloat Function(Float, Float),
+    Struct8BytesHomogeneousFloat Function(
+        double, double)>("ReturnStruct8BytesHomogeneousFloat");
+
+/// Return value in FP registers on many architectures.
+void testReturnStruct8BytesHomogeneousFloat() {
+  double a0;
+  double a1;
+
+  a0 = -1.0;
+  a1 = 2.0;
+
+  final result = returnStruct8BytesHomogeneousFloat(a0, a1);
+
+  print("result = $result");
+
+  Expect.approxEquals(a0, result.a0);
+  Expect.approxEquals(a1, result.a1);
+}
+
+final returnStruct8BytesMixed = ffiTestFunctions.lookupFunction<
+    Struct8BytesMixed Function(Float, Int16, Int16),
+    Struct8BytesMixed Function(double, int, int)>("ReturnStruct8BytesMixed");
+
+/// Return value split over FP and integer register in x64.
+void testReturnStruct8BytesMixed() {
+  double a0;
+  int a1;
+  int a2;
+
+  a0 = -1.0;
+  a1 = 2;
+  a2 = -3;
+
+  final result = returnStruct8BytesMixed(a0, a1, a2);
+
+  print("result = $result");
+
+  Expect.approxEquals(a0, result.a0);
+  Expect.equals(a1, result.a1);
+  Expect.equals(a2, result.a2);
+}
+
+final returnStruct9BytesHomogeneousUint8 = ffiTestFunctions.lookupFunction<
+    Struct9BytesHomogeneousUint8 Function(
+        Uint8, Uint8, Uint8, Uint8, Uint8, Uint8, Uint8, Uint8, Uint8),
+    Struct9BytesHomogeneousUint8 Function(int, int, int, int, int, int, int,
+        int, int)>("ReturnStruct9BytesHomogeneousUint8");
+
+/// The minimum alignment of this struct is only 1 byte based on its fields.
+/// Test that the memory backing these structs is the right size and that
+/// dart:ffi trampolines do not write outside this size.
+void testReturnStruct9BytesHomogeneousUint8() {
+  int a0;
+  int a1;
+  int a2;
+  int a3;
+  int a4;
+  int a5;
+  int a6;
+  int a7;
+  int a8;
+
+  a0 = 1;
+  a1 = 2;
+  a2 = 3;
+  a3 = 4;
+  a4 = 5;
+  a5 = 6;
+  a6 = 7;
+  a7 = 8;
+  a8 = 9;
+
+  final result =
+      returnStruct9BytesHomogeneousUint8(a0, a1, a2, a3, a4, a5, a6, a7, a8);
+
+  print("result = $result");
+
+  Expect.equals(a0, result.a0);
+  Expect.equals(a1, result.a1);
+  Expect.equals(a2, result.a2);
+  Expect.equals(a3, result.a3);
+  Expect.equals(a4, result.a4);
+  Expect.equals(a5, result.a5);
+  Expect.equals(a6, result.a6);
+  Expect.equals(a7, result.a7);
+  Expect.equals(a8, result.a8);
+}
+
+final returnStruct9BytesInt4Or8ByteAligned = ffiTestFunctions.lookupFunction<
+    Struct9BytesInt4Or8ByteAligned Function(Int64, Int8),
+    Struct9BytesInt4Or8ByteAligned Function(
+        int, int)>("ReturnStruct9BytesInt4Or8ByteAligned");
+
+/// Return value in two integer registers on x64.
+/// With alignment rules taken into account size is 12 or 16 bytes.
+void testReturnStruct9BytesInt4Or8ByteAligned() {
+  int a0;
+  int a1;
+
+  a0 = -1;
+  a1 = 2;
+
+  final result = returnStruct9BytesInt4Or8ByteAligned(a0, a1);
+
+  print("result = $result");
+
+  Expect.equals(a0, result.a0);
+  Expect.equals(a1, result.a1);
+}
+
+final returnStruct12BytesHomogeneousFloat = ffiTestFunctions.lookupFunction<
+    Struct12BytesHomogeneousFloat Function(Float, Float, Float),
+    Struct12BytesHomogeneousFloat Function(
+        double, double, double)>("ReturnStruct12BytesHomogeneousFloat");
+
+/// Return value in FPU registers, but does not use all registers on arm hardfp
+/// and arm64.
+void testReturnStruct12BytesHomogeneousFloat() {
+  double a0;
+  double a1;
+  double a2;
+
+  a0 = -1.0;
+  a1 = 2.0;
+  a2 = -3.0;
+
+  final result = returnStruct12BytesHomogeneousFloat(a0, a1, a2);
+
+  print("result = $result");
+
+  Expect.approxEquals(a0, result.a0);
+  Expect.approxEquals(a1, result.a1);
+  Expect.approxEquals(a2, result.a2);
+}
+
+final returnStruct16BytesHomogeneousFloat = ffiTestFunctions.lookupFunction<
+    Struct16BytesHomogeneousFloat Function(Float, Float, Float, Float),
+    Struct16BytesHomogeneousFloat Function(
+        double, double, double, double)>("ReturnStruct16BytesHomogeneousFloat");
+
+/// Return value in FPU registers on arm hardfp and arm64.
+void testReturnStruct16BytesHomogeneousFloat() {
+  double a0;
+  double a1;
+  double a2;
+  double a3;
+
+  a0 = -1.0;
+  a1 = 2.0;
+  a2 = -3.0;
+  a3 = 4.0;
+
+  final result = returnStruct16BytesHomogeneousFloat(a0, a1, a2, a3);
+
+  print("result = $result");
+
+  Expect.approxEquals(a0, result.a0);
+  Expect.approxEquals(a1, result.a1);
+  Expect.approxEquals(a2, result.a2);
+  Expect.approxEquals(a3, result.a3);
+}
+
+final returnStruct16BytesMixed = ffiTestFunctions.lookupFunction<
+    Struct16BytesMixed Function(Double, Int64),
+    Struct16BytesMixed Function(double, int)>("ReturnStruct16BytesMixed");
+
+/// Return value split over FP and integer register in x64.
+void testReturnStruct16BytesMixed() {
+  double a0;
+  int a1;
+
+  a0 = -1.0;
+  a1 = 2;
+
+  final result = returnStruct16BytesMixed(a0, a1);
+
+  print("result = $result");
+
+  Expect.approxEquals(a0, result.a0);
+  Expect.equals(a1, result.a1);
+}
+
+final returnStruct16BytesMixed2 = ffiTestFunctions.lookupFunction<
+    Struct16BytesMixed2 Function(Float, Float, Float, Int32),
+    Struct16BytesMixed2 Function(
+        double, double, double, int)>("ReturnStruct16BytesMixed2");
+
+/// Return value split over FP and integer register in x64.
+/// The integer register contains half float half int.
+void testReturnStruct16BytesMixed2() {
+  double a0;
+  double a1;
+  double a2;
+  int a3;
+
+  a0 = -1.0;
+  a1 = 2.0;
+  a2 = -3.0;
+  a3 = 4;
+
+  final result = returnStruct16BytesMixed2(a0, a1, a2, a3);
+
+  print("result = $result");
+
+  Expect.approxEquals(a0, result.a0);
+  Expect.approxEquals(a1, result.a1);
+  Expect.approxEquals(a2, result.a2);
+  Expect.equals(a3, result.a3);
+}
+
+final returnStruct17BytesInt = ffiTestFunctions.lookupFunction<
+    Struct17BytesInt Function(Int64, Int64, Int8),
+    Struct17BytesInt Function(int, int, int)>("ReturnStruct17BytesInt");
+
+/// Rerturn value returned in preallocated space passed by pointer on most ABIs.
+/// Is non word size on purpose, to test that structs are rounded up to word size
+/// on all ABIs.
+void testReturnStruct17BytesInt() {
+  int a0;
+  int a1;
+  int a2;
+
+  a0 = -1;
+  a1 = 2;
+  a2 = -3;
+
+  final result = returnStruct17BytesInt(a0, a1, a2);
+
+  print("result = $result");
+
+  Expect.equals(a0, result.a0);
+  Expect.equals(a1, result.a1);
+  Expect.equals(a2, result.a2);
+}
+
+final returnStruct19BytesHomogeneousUint8 = ffiTestFunctions.lookupFunction<
+    Struct19BytesHomogeneousUint8 Function(
+        Uint8,
+        Uint8,
+        Uint8,
+        Uint8,
+        Uint8,
+        Uint8,
+        Uint8,
+        Uint8,
+        Uint8,
+        Uint8,
+        Uint8,
+        Uint8,
+        Uint8,
+        Uint8,
+        Uint8,
+        Uint8,
+        Uint8,
+        Uint8,
+        Uint8),
+    Struct19BytesHomogeneousUint8 Function(
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int)>("ReturnStruct19BytesHomogeneousUint8");
+
+/// The minimum alignment of this struct is only 1 byte based on its fields.
+/// Test that the memory backing these structs is the right size and that
+/// dart:ffi trampolines do not write outside this size.
+void testReturnStruct19BytesHomogeneousUint8() {
+  int a0;
+  int a1;
+  int a2;
+  int a3;
+  int a4;
+  int a5;
+  int a6;
+  int a7;
+  int a8;
+  int a9;
+  int a10;
+  int a11;
+  int a12;
+  int a13;
+  int a14;
+  int a15;
+  int a16;
+  int a17;
+  int a18;
+
+  a0 = 1;
+  a1 = 2;
+  a2 = 3;
+  a3 = 4;
+  a4 = 5;
+  a5 = 6;
+  a6 = 7;
+  a7 = 8;
+  a8 = 9;
+  a9 = 10;
+  a10 = 11;
+  a11 = 12;
+  a12 = 13;
+  a13 = 14;
+  a14 = 15;
+  a15 = 16;
+  a16 = 17;
+  a17 = 18;
+  a18 = 19;
+
+  final result = returnStruct19BytesHomogeneousUint8(a0, a1, a2, a3, a4, a5, a6,
+      a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18);
+
+  print("result = $result");
+
+  Expect.equals(a0, result.a0);
+  Expect.equals(a1, result.a1);
+  Expect.equals(a2, result.a2);
+  Expect.equals(a3, result.a3);
+  Expect.equals(a4, result.a4);
+  Expect.equals(a5, result.a5);
+  Expect.equals(a6, result.a6);
+  Expect.equals(a7, result.a7);
+  Expect.equals(a8, result.a8);
+  Expect.equals(a9, result.a9);
+  Expect.equals(a10, result.a10);
+  Expect.equals(a11, result.a11);
+  Expect.equals(a12, result.a12);
+  Expect.equals(a13, result.a13);
+  Expect.equals(a14, result.a14);
+  Expect.equals(a15, result.a15);
+  Expect.equals(a16, result.a16);
+  Expect.equals(a17, result.a17);
+  Expect.equals(a18, result.a18);
+}
+
+final returnStruct20BytesHomogeneousInt32 = ffiTestFunctions.lookupFunction<
+    Struct20BytesHomogeneousInt32 Function(Int32, Int32, Int32, Int32, Int32),
+    Struct20BytesHomogeneousInt32 Function(
+        int, int, int, int, int)>("ReturnStruct20BytesHomogeneousInt32");
+
+/// Return value too big to go in cpu registers on arm64.
+void testReturnStruct20BytesHomogeneousInt32() {
+  int a0;
+  int a1;
+  int a2;
+  int a3;
+  int a4;
+
+  a0 = -1;
+  a1 = 2;
+  a2 = -3;
+  a3 = 4;
+  a4 = -5;
+
+  final result = returnStruct20BytesHomogeneousInt32(a0, a1, a2, a3, a4);
+
+  print("result = $result");
+
+  Expect.equals(a0, result.a0);
+  Expect.equals(a1, result.a1);
+  Expect.equals(a2, result.a2);
+  Expect.equals(a3, result.a3);
+  Expect.equals(a4, result.a4);
+}
+
+final returnStruct20BytesHomogeneousFloat = ffiTestFunctions.lookupFunction<
+    Struct20BytesHomogeneousFloat Function(Float, Float, Float, Float, Float),
+    Struct20BytesHomogeneousFloat Function(double, double, double, double,
+        double)>("ReturnStruct20BytesHomogeneousFloat");
+
+/// Return value too big to go in FPU registers on x64, arm hardfp and arm64.
+void testReturnStruct20BytesHomogeneousFloat() {
+  double a0;
+  double a1;
+  double a2;
+  double a3;
+  double a4;
+
+  a0 = -1.0;
+  a1 = 2.0;
+  a2 = -3.0;
+  a3 = 4.0;
+  a4 = -5.0;
+
+  final result = returnStruct20BytesHomogeneousFloat(a0, a1, a2, a3, a4);
+
+  print("result = $result");
+
+  Expect.approxEquals(a0, result.a0);
+  Expect.approxEquals(a1, result.a1);
+  Expect.approxEquals(a2, result.a2);
+  Expect.approxEquals(a3, result.a3);
+  Expect.approxEquals(a4, result.a4);
+}
+
+final returnStruct32BytesHomogeneousDouble = ffiTestFunctions.lookupFunction<
+    Struct32BytesHomogeneousDouble Function(Double, Double, Double, Double),
+    Struct32BytesHomogeneousDouble Function(double, double, double,
+        double)>("ReturnStruct32BytesHomogeneousDouble");
+
+/// Return value in FPU registers on arm64.
+void testReturnStruct32BytesHomogeneousDouble() {
+  double a0;
+  double a1;
+  double a2;
+  double a3;
+
+  a0 = -1.0;
+  a1 = 2.0;
+  a2 = -3.0;
+  a3 = 4.0;
+
+  final result = returnStruct32BytesHomogeneousDouble(a0, a1, a2, a3);
+
+  print("result = $result");
+
+  Expect.approxEquals(a0, result.a0);
+  Expect.approxEquals(a1, result.a1);
+  Expect.approxEquals(a2, result.a2);
+  Expect.approxEquals(a3, result.a3);
+}
+
+final returnStruct40BytesHomogeneousDouble = ffiTestFunctions.lookupFunction<
+    Struct40BytesHomogeneousDouble Function(
+        Double, Double, Double, Double, Double),
+    Struct40BytesHomogeneousDouble Function(double, double, double, double,
+        double)>("ReturnStruct40BytesHomogeneousDouble");
+
+/// Return value too big to go in FPU registers on arm64.
+void testReturnStruct40BytesHomogeneousDouble() {
+  double a0;
+  double a1;
+  double a2;
+  double a3;
+  double a4;
+
+  a0 = -1.0;
+  a1 = 2.0;
+  a2 = -3.0;
+  a3 = 4.0;
+  a4 = -5.0;
+
+  final result = returnStruct40BytesHomogeneousDouble(a0, a1, a2, a3, a4);
+
+  print("result = $result");
+
+  Expect.approxEquals(a0, result.a0);
+  Expect.approxEquals(a1, result.a1);
+  Expect.approxEquals(a2, result.a2);
+  Expect.approxEquals(a3, result.a3);
+  Expect.approxEquals(a4, result.a4);
+}
+
+final returnStruct1024BytesHomogeneousUint64 = ffiTestFunctions.lookupFunction<
+    Struct1024BytesHomogeneousUint64 Function(
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64),
+    Struct1024BytesHomogeneousUint64 Function(
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int)>("ReturnStruct1024BytesHomogeneousUint64");
+
+/// Test 1kb struct.
+void testReturnStruct1024BytesHomogeneousUint64() {
+  int a0;
+  int a1;
+  int a2;
+  int a3;
+  int a4;
+  int a5;
+  int a6;
+  int a7;
+  int a8;
+  int a9;
+  int a10;
+  int a11;
+  int a12;
+  int a13;
+  int a14;
+  int a15;
+  int a16;
+  int a17;
+  int a18;
+  int a19;
+  int a20;
+  int a21;
+  int a22;
+  int a23;
+  int a24;
+  int a25;
+  int a26;
+  int a27;
+  int a28;
+  int a29;
+  int a30;
+  int a31;
+  int a32;
+  int a33;
+  int a34;
+  int a35;
+  int a36;
+  int a37;
+  int a38;
+  int a39;
+  int a40;
+  int a41;
+  int a42;
+  int a43;
+  int a44;
+  int a45;
+  int a46;
+  int a47;
+  int a48;
+  int a49;
+  int a50;
+  int a51;
+  int a52;
+  int a53;
+  int a54;
+  int a55;
+  int a56;
+  int a57;
+  int a58;
+  int a59;
+  int a60;
+  int a61;
+  int a62;
+  int a63;
+  int a64;
+  int a65;
+  int a66;
+  int a67;
+  int a68;
+  int a69;
+  int a70;
+  int a71;
+  int a72;
+  int a73;
+  int a74;
+  int a75;
+  int a76;
+  int a77;
+  int a78;
+  int a79;
+  int a80;
+  int a81;
+  int a82;
+  int a83;
+  int a84;
+  int a85;
+  int a86;
+  int a87;
+  int a88;
+  int a89;
+  int a90;
+  int a91;
+  int a92;
+  int a93;
+  int a94;
+  int a95;
+  int a96;
+  int a97;
+  int a98;
+  int a99;
+  int a100;
+  int a101;
+  int a102;
+  int a103;
+  int a104;
+  int a105;
+  int a106;
+  int a107;
+  int a108;
+  int a109;
+  int a110;
+  int a111;
+  int a112;
+  int a113;
+  int a114;
+  int a115;
+  int a116;
+  int a117;
+  int a118;
+  int a119;
+  int a120;
+  int a121;
+  int a122;
+  int a123;
+  int a124;
+  int a125;
+  int a126;
+  int a127;
+
+  a0 = 1;
+  a1 = 2;
+  a2 = 3;
+  a3 = 4;
+  a4 = 5;
+  a5 = 6;
+  a6 = 7;
+  a7 = 8;
+  a8 = 9;
+  a9 = 10;
+  a10 = 11;
+  a11 = 12;
+  a12 = 13;
+  a13 = 14;
+  a14 = 15;
+  a15 = 16;
+  a16 = 17;
+  a17 = 18;
+  a18 = 19;
+  a19 = 20;
+  a20 = 21;
+  a21 = 22;
+  a22 = 23;
+  a23 = 24;
+  a24 = 25;
+  a25 = 26;
+  a26 = 27;
+  a27 = 28;
+  a28 = 29;
+  a29 = 30;
+  a30 = 31;
+  a31 = 32;
+  a32 = 33;
+  a33 = 34;
+  a34 = 35;
+  a35 = 36;
+  a36 = 37;
+  a37 = 38;
+  a38 = 39;
+  a39 = 40;
+  a40 = 41;
+  a41 = 42;
+  a42 = 43;
+  a43 = 44;
+  a44 = 45;
+  a45 = 46;
+  a46 = 47;
+  a47 = 48;
+  a48 = 49;
+  a49 = 50;
+  a50 = 51;
+  a51 = 52;
+  a52 = 53;
+  a53 = 54;
+  a54 = 55;
+  a55 = 56;
+  a56 = 57;
+  a57 = 58;
+  a58 = 59;
+  a59 = 60;
+  a60 = 61;
+  a61 = 62;
+  a62 = 63;
+  a63 = 64;
+  a64 = 65;
+  a65 = 66;
+  a66 = 67;
+  a67 = 68;
+  a68 = 69;
+  a69 = 70;
+  a70 = 71;
+  a71 = 72;
+  a72 = 73;
+  a73 = 74;
+  a74 = 75;
+  a75 = 76;
+  a76 = 77;
+  a77 = 78;
+  a78 = 79;
+  a79 = 80;
+  a80 = 81;
+  a81 = 82;
+  a82 = 83;
+  a83 = 84;
+  a84 = 85;
+  a85 = 86;
+  a86 = 87;
+  a87 = 88;
+  a88 = 89;
+  a89 = 90;
+  a90 = 91;
+  a91 = 92;
+  a92 = 93;
+  a93 = 94;
+  a94 = 95;
+  a95 = 96;
+  a96 = 97;
+  a97 = 98;
+  a98 = 99;
+  a99 = 100;
+  a100 = 101;
+  a101 = 102;
+  a102 = 103;
+  a103 = 104;
+  a104 = 105;
+  a105 = 106;
+  a106 = 107;
+  a107 = 108;
+  a108 = 109;
+  a109 = 110;
+  a110 = 111;
+  a111 = 112;
+  a112 = 113;
+  a113 = 114;
+  a114 = 115;
+  a115 = 116;
+  a116 = 117;
+  a117 = 118;
+  a118 = 119;
+  a119 = 120;
+  a120 = 121;
+  a121 = 122;
+  a122 = 123;
+  a123 = 124;
+  a124 = 125;
+  a125 = 126;
+  a126 = 127;
+  a127 = 128;
+
+  final result = returnStruct1024BytesHomogeneousUint64(
+      a0,
+      a1,
+      a2,
+      a3,
+      a4,
+      a5,
+      a6,
+      a7,
+      a8,
+      a9,
+      a10,
+      a11,
+      a12,
+      a13,
+      a14,
+      a15,
+      a16,
+      a17,
+      a18,
+      a19,
+      a20,
+      a21,
+      a22,
+      a23,
+      a24,
+      a25,
+      a26,
+      a27,
+      a28,
+      a29,
+      a30,
+      a31,
+      a32,
+      a33,
+      a34,
+      a35,
+      a36,
+      a37,
+      a38,
+      a39,
+      a40,
+      a41,
+      a42,
+      a43,
+      a44,
+      a45,
+      a46,
+      a47,
+      a48,
+      a49,
+      a50,
+      a51,
+      a52,
+      a53,
+      a54,
+      a55,
+      a56,
+      a57,
+      a58,
+      a59,
+      a60,
+      a61,
+      a62,
+      a63,
+      a64,
+      a65,
+      a66,
+      a67,
+      a68,
+      a69,
+      a70,
+      a71,
+      a72,
+      a73,
+      a74,
+      a75,
+      a76,
+      a77,
+      a78,
+      a79,
+      a80,
+      a81,
+      a82,
+      a83,
+      a84,
+      a85,
+      a86,
+      a87,
+      a88,
+      a89,
+      a90,
+      a91,
+      a92,
+      a93,
+      a94,
+      a95,
+      a96,
+      a97,
+      a98,
+      a99,
+      a100,
+      a101,
+      a102,
+      a103,
+      a104,
+      a105,
+      a106,
+      a107,
+      a108,
+      a109,
+      a110,
+      a111,
+      a112,
+      a113,
+      a114,
+      a115,
+      a116,
+      a117,
+      a118,
+      a119,
+      a120,
+      a121,
+      a122,
+      a123,
+      a124,
+      a125,
+      a126,
+      a127);
+
+  print("result = $result");
+
+  Expect.equals(a0, result.a0);
+  Expect.equals(a1, result.a1);
+  Expect.equals(a2, result.a2);
+  Expect.equals(a3, result.a3);
+  Expect.equals(a4, result.a4);
+  Expect.equals(a5, result.a5);
+  Expect.equals(a6, result.a6);
+  Expect.equals(a7, result.a7);
+  Expect.equals(a8, result.a8);
+  Expect.equals(a9, result.a9);
+  Expect.equals(a10, result.a10);
+  Expect.equals(a11, result.a11);
+  Expect.equals(a12, result.a12);
+  Expect.equals(a13, result.a13);
+  Expect.equals(a14, result.a14);
+  Expect.equals(a15, result.a15);
+  Expect.equals(a16, result.a16);
+  Expect.equals(a17, result.a17);
+  Expect.equals(a18, result.a18);
+  Expect.equals(a19, result.a19);
+  Expect.equals(a20, result.a20);
+  Expect.equals(a21, result.a21);
+  Expect.equals(a22, result.a22);
+  Expect.equals(a23, result.a23);
+  Expect.equals(a24, result.a24);
+  Expect.equals(a25, result.a25);
+  Expect.equals(a26, result.a26);
+  Expect.equals(a27, result.a27);
+  Expect.equals(a28, result.a28);
+  Expect.equals(a29, result.a29);
+  Expect.equals(a30, result.a30);
+  Expect.equals(a31, result.a31);
+  Expect.equals(a32, result.a32);
+  Expect.equals(a33, result.a33);
+  Expect.equals(a34, result.a34);
+  Expect.equals(a35, result.a35);
+  Expect.equals(a36, result.a36);
+  Expect.equals(a37, result.a37);
+  Expect.equals(a38, result.a38);
+  Expect.equals(a39, result.a39);
+  Expect.equals(a40, result.a40);
+  Expect.equals(a41, result.a41);
+  Expect.equals(a42, result.a42);
+  Expect.equals(a43, result.a43);
+  Expect.equals(a44, result.a44);
+  Expect.equals(a45, result.a45);
+  Expect.equals(a46, result.a46);
+  Expect.equals(a47, result.a47);
+  Expect.equals(a48, result.a48);
+  Expect.equals(a49, result.a49);
+  Expect.equals(a50, result.a50);
+  Expect.equals(a51, result.a51);
+  Expect.equals(a52, result.a52);
+  Expect.equals(a53, result.a53);
+  Expect.equals(a54, result.a54);
+  Expect.equals(a55, result.a55);
+  Expect.equals(a56, result.a56);
+  Expect.equals(a57, result.a57);
+  Expect.equals(a58, result.a58);
+  Expect.equals(a59, result.a59);
+  Expect.equals(a60, result.a60);
+  Expect.equals(a61, result.a61);
+  Expect.equals(a62, result.a62);
+  Expect.equals(a63, result.a63);
+  Expect.equals(a64, result.a64);
+  Expect.equals(a65, result.a65);
+  Expect.equals(a66, result.a66);
+  Expect.equals(a67, result.a67);
+  Expect.equals(a68, result.a68);
+  Expect.equals(a69, result.a69);
+  Expect.equals(a70, result.a70);
+  Expect.equals(a71, result.a71);
+  Expect.equals(a72, result.a72);
+  Expect.equals(a73, result.a73);
+  Expect.equals(a74, result.a74);
+  Expect.equals(a75, result.a75);
+  Expect.equals(a76, result.a76);
+  Expect.equals(a77, result.a77);
+  Expect.equals(a78, result.a78);
+  Expect.equals(a79, result.a79);
+  Expect.equals(a80, result.a80);
+  Expect.equals(a81, result.a81);
+  Expect.equals(a82, result.a82);
+  Expect.equals(a83, result.a83);
+  Expect.equals(a84, result.a84);
+  Expect.equals(a85, result.a85);
+  Expect.equals(a86, result.a86);
+  Expect.equals(a87, result.a87);
+  Expect.equals(a88, result.a88);
+  Expect.equals(a89, result.a89);
+  Expect.equals(a90, result.a90);
+  Expect.equals(a91, result.a91);
+  Expect.equals(a92, result.a92);
+  Expect.equals(a93, result.a93);
+  Expect.equals(a94, result.a94);
+  Expect.equals(a95, result.a95);
+  Expect.equals(a96, result.a96);
+  Expect.equals(a97, result.a97);
+  Expect.equals(a98, result.a98);
+  Expect.equals(a99, result.a99);
+  Expect.equals(a100, result.a100);
+  Expect.equals(a101, result.a101);
+  Expect.equals(a102, result.a102);
+  Expect.equals(a103, result.a103);
+  Expect.equals(a104, result.a104);
+  Expect.equals(a105, result.a105);
+  Expect.equals(a106, result.a106);
+  Expect.equals(a107, result.a107);
+  Expect.equals(a108, result.a108);
+  Expect.equals(a109, result.a109);
+  Expect.equals(a110, result.a110);
+  Expect.equals(a111, result.a111);
+  Expect.equals(a112, result.a112);
+  Expect.equals(a113, result.a113);
+  Expect.equals(a114, result.a114);
+  Expect.equals(a115, result.a115);
+  Expect.equals(a116, result.a116);
+  Expect.equals(a117, result.a117);
+  Expect.equals(a118, result.a118);
+  Expect.equals(a119, result.a119);
+  Expect.equals(a120, result.a120);
+  Expect.equals(a121, result.a121);
+  Expect.equals(a122, result.a122);
+  Expect.equals(a123, result.a123);
+  Expect.equals(a124, result.a124);
+  Expect.equals(a125, result.a125);
+  Expect.equals(a126, result.a126);
+  Expect.equals(a127, result.a127);
+}
+
+final returnStructArgumentStruct1ByteInt = ffiTestFunctions.lookupFunction<
+    Struct1ByteInt Function(Struct1ByteInt),
+    Struct1ByteInt Function(
+        Struct1ByteInt)>("ReturnStructArgumentStruct1ByteInt");
+
+/// Test that a struct passed in as argument can be returned.
+/// Especially for ffi callbacks.
+/// Struct is passed in int registers in most ABIs.
+void testReturnStructArgumentStruct1ByteInt() {
+  Struct1ByteInt a0 = allocate<Struct1ByteInt>().ref;
+
+  a0.a0 = -1;
+
+  final result = returnStructArgumentStruct1ByteInt(a0);
+
+  print("result = $result");
+
+  Expect.equals(a0.a0, result.a0);
+
+  free(a0.addressOf);
+}
+
+final returnStructArgumentInt32x8Struct1ByteInt =
+    ffiTestFunctions.lookupFunction<
+        Struct1ByteInt Function(Int32, Int32, Int32, Int32, Int32, Int32, Int32,
+            Int32, Struct1ByteInt),
+        Struct1ByteInt Function(int, int, int, int, int, int, int, int,
+            Struct1ByteInt)>("ReturnStructArgumentInt32x8Struct1ByteInt");
+
+/// Test that a struct passed in as argument can be returned.
+/// Especially for ffi callbacks.
+/// Struct is passed on stack on all ABIs.
+void testReturnStructArgumentInt32x8Struct1ByteInt() {
+  int a0;
+  int a1;
+  int a2;
+  int a3;
+  int a4;
+  int a5;
+  int a6;
+  int a7;
+  Struct1ByteInt a8 = allocate<Struct1ByteInt>().ref;
+
+  a0 = -1;
+  a1 = 2;
+  a2 = -3;
+  a3 = 4;
+  a4 = -5;
+  a5 = 6;
+  a6 = -7;
+  a7 = 8;
+  a8.a0 = -9;
+
+  final result = returnStructArgumentInt32x8Struct1ByteInt(
+      a0, a1, a2, a3, a4, a5, a6, a7, a8);
+
+  print("result = $result");
+
+  Expect.equals(a8.a0, result.a0);
+
+  free(a8.addressOf);
+}
+
+final returnStructArgumentStruct8BytesHomogeneousFloat =
+    ffiTestFunctions.lookupFunction<
+            Struct8BytesHomogeneousFloat Function(Struct8BytesHomogeneousFloat),
+            Struct8BytesHomogeneousFloat Function(
+                Struct8BytesHomogeneousFloat)>(
+        "ReturnStructArgumentStruct8BytesHomogeneousFloat");
+
+/// Test that a struct passed in as argument can be returned.
+/// Especially for ffi callbacks.
+/// Struct is passed in float registers in most ABIs.
+void testReturnStructArgumentStruct8BytesHomogeneousFloat() {
+  Struct8BytesHomogeneousFloat a0 =
+      allocate<Struct8BytesHomogeneousFloat>().ref;
+
+  a0.a0 = -1.0;
+  a0.a1 = 2.0;
+
+  final result = returnStructArgumentStruct8BytesHomogeneousFloat(a0);
+
+  print("result = $result");
+
+  Expect.approxEquals(a0.a0, result.a0);
+  Expect.approxEquals(a0.a1, result.a1);
+
+  free(a0.addressOf);
+}
+
+final returnStructArgumentStruct20BytesHomogeneousInt32 =
+    ffiTestFunctions
+        .lookupFunction<
+                Struct20BytesHomogeneousInt32 Function(
+                    Struct20BytesHomogeneousInt32),
+                Struct20BytesHomogeneousInt32 Function(
+                    Struct20BytesHomogeneousInt32)>(
+            "ReturnStructArgumentStruct20BytesHomogeneousInt32");
+
+/// On arm64, both argument and return value are passed in by pointer.
+void testReturnStructArgumentStruct20BytesHomogeneousInt32() {
+  Struct20BytesHomogeneousInt32 a0 =
+      allocate<Struct20BytesHomogeneousInt32>().ref;
+
+  a0.a0 = -1;
+  a0.a1 = 2;
+  a0.a2 = -3;
+  a0.a3 = 4;
+  a0.a4 = -5;
+
+  final result = returnStructArgumentStruct20BytesHomogeneousInt32(a0);
+
+  print("result = $result");
+
+  Expect.equals(a0.a0, result.a0);
+  Expect.equals(a0.a1, result.a1);
+  Expect.equals(a0.a2, result.a2);
+  Expect.equals(a0.a3, result.a3);
+  Expect.equals(a0.a4, result.a4);
+
+  free(a0.addressOf);
+}
+
+final returnStructArgumentInt32x8Struct20BytesHomogeneou =
+    ffiTestFunctions.lookupFunction<
+            Struct20BytesHomogeneousInt32 Function(Int32, Int32, Int32, Int32,
+                Int32, Int32, Int32, Int32, Struct20BytesHomogeneousInt32),
+            Struct20BytesHomogeneousInt32 Function(int, int, int, int, int, int,
+                int, int, Struct20BytesHomogeneousInt32)>(
+        "ReturnStructArgumentInt32x8Struct20BytesHomogeneou");
+
+/// On arm64, both argument and return value are passed in by pointer.
+/// Ints exhaust registers, so that pointer is passed on stack.
+void testReturnStructArgumentInt32x8Struct20BytesHomogeneou() {
+  int a0;
+  int a1;
+  int a2;
+  int a3;
+  int a4;
+  int a5;
+  int a6;
+  int a7;
+  Struct20BytesHomogeneousInt32 a8 =
+      allocate<Struct20BytesHomogeneousInt32>().ref;
+
+  a0 = -1;
+  a1 = 2;
+  a2 = -3;
+  a3 = 4;
+  a4 = -5;
+  a5 = 6;
+  a6 = -7;
+  a7 = 8;
+  a8.a0 = -9;
+  a8.a1 = 10;
+  a8.a2 = -11;
+  a8.a3 = 12;
+  a8.a4 = -13;
+
+  final result = returnStructArgumentInt32x8Struct20BytesHomogeneou(
+      a0, a1, a2, a3, a4, a5, a6, a7, a8);
+
+  print("result = $result");
+
+  Expect.equals(a8.a0, result.a0);
+  Expect.equals(a8.a1, result.a1);
+  Expect.equals(a8.a2, result.a2);
+  Expect.equals(a8.a3, result.a3);
+  Expect.equals(a8.a4, result.a4);
+
+  free(a8.addressOf);
+}
+
+final returnStructAlignmentInt16 = ffiTestFunctions.lookupFunction<
+    StructAlignmentInt16 Function(Int8, Int16, Int8),
+    StructAlignmentInt16 Function(int, int, int)>("ReturnStructAlignmentInt16");
+
+/// Test alignment and padding of 16 byte int within struct.
+void testReturnStructAlignmentInt16() {
+  int a0;
+  int a1;
+  int a2;
+
+  a0 = -1;
+  a1 = 2;
+  a2 = -3;
+
+  final result = returnStructAlignmentInt16(a0, a1, a2);
+
+  print("result = $result");
+
+  Expect.equals(a0, result.a0);
+  Expect.equals(a1, result.a1);
+  Expect.equals(a2, result.a2);
+}
+
+final returnStructAlignmentInt32 = ffiTestFunctions.lookupFunction<
+    StructAlignmentInt32 Function(Int8, Int32, Int8),
+    StructAlignmentInt32 Function(int, int, int)>("ReturnStructAlignmentInt32");
+
+/// Test alignment and padding of 32 byte int within struct.
+void testReturnStructAlignmentInt32() {
+  int a0;
+  int a1;
+  int a2;
+
+  a0 = -1;
+  a1 = 2;
+  a2 = -3;
+
+  final result = returnStructAlignmentInt32(a0, a1, a2);
+
+  print("result = $result");
+
+  Expect.equals(a0, result.a0);
+  Expect.equals(a1, result.a1);
+  Expect.equals(a2, result.a2);
+}
+
+final returnStructAlignmentInt64 = ffiTestFunctions.lookupFunction<
+    StructAlignmentInt64 Function(Int8, Int64, Int8),
+    StructAlignmentInt64 Function(int, int, int)>("ReturnStructAlignmentInt64");
+
+/// Test alignment and padding of 64 byte int within struct.
+void testReturnStructAlignmentInt64() {
+  int a0;
+  int a1;
+  int a2;
+
+  a0 = -1;
+  a1 = 2;
+  a2 = -3;
+
+  final result = returnStructAlignmentInt64(a0, a1, a2);
+
+  print("result = $result");
+
+  Expect.equals(a0, result.a0);
+  Expect.equals(a1, result.a1);
+  Expect.equals(a2, result.a2);
+}
diff --git a/tests/ffi/generator/c_types.dart b/tests/ffi/generator/c_types.dart
new file mode 100644
index 0000000..f2948fa
--- /dev/null
+++ b/tests/ffi/generator/c_types.dart
@@ -0,0 +1,299 @@
+// Copyright (c) 2020, 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 'utils.dart';
+
+const int8 = FundamentalType(PrimitiveType.int8);
+const int16 = FundamentalType(PrimitiveType.int16);
+const int32 = FundamentalType(PrimitiveType.int32);
+const int64 = FundamentalType(PrimitiveType.int64);
+const uint8 = FundamentalType(PrimitiveType.uint8);
+const uint16 = FundamentalType(PrimitiveType.uint16);
+const uint32 = FundamentalType(PrimitiveType.uint32);
+const uint64 = FundamentalType(PrimitiveType.uint64);
+const intptr = FundamentalType(PrimitiveType.intptr);
+const float = FundamentalType(PrimitiveType.float);
+const double_ = FundamentalType(PrimitiveType.double_);
+
+enum PrimitiveType {
+  int8,
+  int16,
+  int32,
+  int64,
+  uint8,
+  uint16,
+  uint32,
+  uint64,
+  intptr,
+  float,
+  double_,
+}
+
+const primitiveNames = [
+  "int8",
+  "int16",
+  "int32",
+  "int64",
+  "uint8",
+  "uint16",
+  "uint32",
+  "uint64",
+  "intptr",
+  "float",
+  "double",
+];
+
+const intptrSize = -1;
+const primitiveSizesInBytes = [1, 2, 4, 8, 1, 2, 4, 8, intptrSize, 4, 8];
+
+abstract class CType {
+  String get cType;
+  String get dartCType;
+  String get dartType;
+  String get dartStructFieldAnnotation;
+
+  /// Has a known [size] that is the same for all architectures.
+  bool get hasSize;
+
+  /// Get a size in bytes that is the same on all architectures.
+  int get size;
+
+  String toString() => dartCType;
+
+  const CType();
+}
+
+class FundamentalType extends CType {
+  final PrimitiveType primitive;
+
+  const FundamentalType(this.primitive);
+
+  bool get isFloatingPoint =>
+      primitive == PrimitiveType.float || primitive == PrimitiveType.double_;
+  bool get isInteger => !isFloatingPoint;
+  bool get isUnsigned =>
+      primitive == PrimitiveType.uint8 ||
+      primitive == PrimitiveType.uint16 ||
+      primitive == PrimitiveType.uint32 ||
+      primitive == PrimitiveType.uint64;
+  bool get isSigned => !isUnsigned;
+
+  String get name => primitiveNames[primitive.index];
+
+  String get cType => "${name}${isInteger ? "_t" : ""}";
+  String get dartCType => name.upperCaseFirst();
+  String get dartType => isInteger ? "int" : "double";
+  String get dartStructFieldAnnotation => "@${dartCType}()";
+  bool get hasSize => primitive != PrimitiveType.intptr;
+  int get size {
+    if (!hasSize) {
+      throw "Size unknown.";
+    }
+    return primitiveSizesInBytes[primitive.index];
+  }
+}
+
+class PointerType extends CType {
+  final CType pointerTo;
+
+  PointerType(this.pointerTo);
+
+  String get cType => "${pointerTo.cType}*";
+  String get dartCType => "Pointer<${pointerTo.dartCType}>";
+  String get dartType => "Pointer<${pointerTo.dartType}>";
+  String get dartStructFieldAnnotation => "";
+  bool get hasSize => false;
+  int get size => throw "Size unknown";
+}
+
+/// Used to give [StructType] fields and [FunctionType] arguments names.
+class Member {
+  final CType type;
+  final String name;
+
+  Member(this.type, this.name);
+
+  String dartStructField(bool nnbd) {
+    final modifier = nnbd ? "external" : "";
+    return "${type.dartStructFieldAnnotation} $modifier ${type.dartType} $name;";
+  }
+
+  String get cStructField => "${type.cType} $name;";
+
+  String toString() => "$type $name";
+}
+
+List<Member> generateMemberNames(List<CType> memberTypes) {
+  int index = 0;
+  List<Member> result = [];
+  for (final type in memberTypes) {
+    result.add(Member(type, "a$index"));
+    index++;
+  }
+  return result;
+}
+
+class StructType extends CType {
+  final List<Member> members;
+
+  /// To disambiguate same size structs.
+  final String suffix;
+
+  StructType(List<CType> memberTypes)
+      : this.members = generateMemberNames(memberTypes),
+        this.suffix = "";
+  StructType.disambiguate(List<CType> memberTypes, this.suffix)
+      : this.members = generateMemberNames(memberTypes);
+
+  List<CType> get memberTypes => members.map((a) => a.type).toList();
+
+  String get cType => name;
+  String get dartCType => name;
+  String get dartType => name;
+  String get dartStructFieldAnnotation => "";
+
+  bool get hasSize =>
+      !memberTypes.map((e) => e.hasSize).contains(false) && !hasPadding;
+  int get size => memberTypes.fold(0, (int acc, e) => acc + e.size);
+
+  /// Rough approximation, to not redo all ABI logic here.
+  bool get hasPadding =>
+      members.length < 2 ? false : members[0].type.size < members[1].type.size;
+
+  bool get hasNestedStructs =>
+      members.map((e) => e.type is StructType).contains(true);
+
+  /// All members have the same type.
+  bool get isHomogeneous => memberTypes.toSet().length == 1;
+
+  /// All members have a floating point type.
+  bool get isOnlyFloatingPoint => !memberTypes.map((e) {
+        if (e is FundamentalType) {
+          return e.isFloatingPoint;
+        }
+        if (e is StructType) {
+          return e.isOnlyFloatingPoint;
+        }
+      }).contains(false);
+
+  /// All members have a integer type.
+  bool get isOnlyInteger => !memberTypes.map((e) {
+        if (e is FundamentalType) {
+          return e.isInteger;
+        }
+        if (e is StructType) {
+          return e.isOnlyInteger;
+        }
+      }).contains(false);
+
+  bool get isMixed => !isOnlyInteger && !isOnlyFloatingPoint;
+
+  String get name {
+    String result = "Struct";
+    if (hasSize) {
+      result += "${size}Byte" + (size != 1 ? "s" : "");
+    }
+    if (hasNestedStructs) {
+      result += "Nested";
+    }
+    if (members.length == 0) {
+      // No suffix.
+    } else if (hasPadding) {
+      result += "Alignment${memberTypes[1].dartCType}";
+    } else if (isHomogeneous && members.length > 1 && !hasNestedStructs) {
+      result += "Homogeneous${memberTypes.first.dartCType}";
+    } else if (isOnlyFloatingPoint) {
+      result += "Float";
+    } else if (isOnlyInteger) {
+      result += "Int";
+    } else {
+      result += "Mixed";
+    }
+    result += suffix;
+    return result;
+  }
+}
+
+class FunctionType extends CType {
+  final List<Member> arguments;
+  final CType returnValue;
+  final String reason;
+
+  List<CType> get argumentTypes => arguments.map((a) => a.type).toList();
+
+  FunctionType(List<CType> argumentTypes, this.returnValue, this.reason)
+      : this.arguments = generateMemberNames(argumentTypes);
+
+  String get cType =>
+      throw "Are not represented without function or variable name in C.";
+
+  String get dartCType {
+    final argumentsDartCType = argumentTypes.map((e) => e.dartCType).join(", ");
+    return "${returnValue.dartCType} Function($argumentsDartCType)";
+  }
+
+  String get dartType {
+    final argumentsDartType = argumentTypes.map((e) => e.dartType).join(", ");
+    return "${returnValue.dartType} Function($argumentsDartType)";
+  }
+
+  String get dartStructFieldAnnotation => throw "No nested function pointers.";
+
+  bool get hasSize => false;
+  int get size => throw "Unknown size.";
+
+  /// Group consecutive [arguments] by same type.
+  ///
+  /// Used for naming.
+  List<List<Member>> get argumentsGrouped {
+    List<List<Member>> result = [];
+    for (final a in arguments) {
+      if (result.isEmpty) {
+        result.add([a]);
+      } else if (result.last.first.type.dartCType == a.type.dartCType) {
+        result.last.add(a);
+      } else {
+        result.add([a]);
+      }
+    }
+    return result;
+  }
+
+  /// A suitable name based on the signature.
+  String get cName {
+    String result = "";
+    if (arguments.containsStructs && returnValue is FundamentalType) {
+      result = "Pass";
+    } else if (returnValue is StructType &&
+        argumentTypes.contains(returnValue)) {
+      result = "ReturnStructArgument";
+    } else if (returnValue is StructType) {
+      if (arguments.length == (returnValue as StructType).members.length) {
+        return "Return${returnValue.dartCType}";
+      }
+    } else {
+      result = "Uncategorized";
+    }
+
+    for (final group in argumentsGrouped) {
+      result += group.first.type.dartCType;
+      if (group.length > 1) {
+        result += "x${group.length}";
+      }
+    }
+    return result.limitTo(50);
+  }
+
+  String get dartTestName => "test$cName";
+
+  String get dartName => cName.lowerCaseFirst();
+
+  /// Only valid for [TestType.structReturnArgument].
+  Member get structReturnArgument =>
+      arguments.firstWhere((a) => a.type == returnValue);
+}
+
+extension MemberList on List<Member> {
+  bool get containsStructs => map((m) => m.type is StructType).contains(true);
+}
diff --git a/tests/ffi/generator/structs_by_value_tests_configuration.dart b/tests/ffi/generator/structs_by_value_tests_configuration.dart
new file mode 100644
index 0000000..46f5108
--- /dev/null
+++ b/tests/ffi/generator/structs_by_value_tests_configuration.dart
@@ -0,0 +1,446 @@
+// Copyright (c) 2020, 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 'c_types.dart';
+
+final functions = [
+  FunctionType(List.filled(10, struct1byteInt), int64, """
+Smallest struct with data.
+10 struct arguments will exhaust available registers."""),
+  FunctionType(List.filled(10, struct3bytesInt), int64, """
+Not a multiple of word size, not a power of two.
+10 struct arguments will exhaust available registers."""),
+  FunctionType(List.filled(10, struct3bytesInt2), int64, """
+Not a multiple of word size, not a power of two.
+With alignment rules taken into account size is 4 bytes.
+10 struct arguments will exhaust available registers."""),
+  FunctionType(List.filled(10, struct4bytesInt), int64, """
+Exactly word size on 32-bit architectures.
+10 struct arguments will exhaust available registers."""),
+  FunctionType(List.filled(10, struct7bytesInt), int64, """
+Sub word size on 64 bit architectures.
+10 struct arguments will exhaust available registers."""),
+  FunctionType(List.filled(10, struct7bytesInt2), int64, """
+Sub word size on 64 bit architectures.
+With alignment rules taken into account size is 8 bytes.
+10 struct arguments will exhaust available registers."""),
+  FunctionType(List.filled(10, struct8bytesInt), int64, """
+Exactly word size struct on 64bit architectures.
+10 struct arguments will exhaust available registers."""),
+  FunctionType(List.filled(10, struct8bytesFloat), float, """
+Arguments passed in FP registers as long as they fit.
+10 struct arguments will exhaust available registers."""),
+  FunctionType(List.filled(10, struct8BytesMixed), float, """
+On x64, arguments go in int registers because it is not only float.
+10 struct arguments will exhaust available registers."""),
+  FunctionType(List.filled(10, struct9bytesInt), int64, """
+Argument is a single byte over a multiple of word size.
+10 struct arguments will exhaust available registers.
+Struct only has 1-byte aligned fields to test struct alignment itself.
+Tests upper bytes in the integer registers that are partly filled.
+Tests stack alignment of non word size stack arguments."""),
+  FunctionType(List.filled(10, struct9bytesInt2), int64, """
+Argument is a single byte over a multiple of word size.
+With alignment rules taken into account size is 12 or 16 bytes.
+10 struct arguments will exhaust available registers.
+"""),
+  FunctionType(List.filled(6, struct12bytesFloat), float, """
+Arguments in FPU registers on arm hardfp and arm64.
+Struct arguments will exhaust available registers, and leave some empty.
+The last argument is to test whether arguments are backfilled."""),
+  FunctionType(List.filled(5, struct16bytesFloat), float, """
+On Linux x64 argument is transferred on stack because it is over 16 bytes.
+Arguments in FPU registers on arm hardfp and arm64.
+5 struct arguments will exhaust available registers."""),
+  FunctionType(List.filled(10, struct16bytesMixed), double_, """
+On x64, arguments are split over FP and int registers.
+On x64, it will exhaust the integer registers with the 6th argument.
+The rest goes on the stack.
+On arm, arguments are 8 byte aligned."""),
+  FunctionType(List.filled(10, struct16bytesMixed2), float, """
+On x64, arguments are split over FP and int registers.
+On x64, it will exhaust the integer registers with the 6th argument.
+The rest goes on the stack.
+On arm, arguments are 4 byte aligned."""),
+  FunctionType(List.filled(10, struct17bytesInt), int64, """
+Arguments are passed as pointer to copy on arm64.
+Tests that the memory allocated for copies are rounded up to word size."""),
+  FunctionType(List.filled(10, struct19bytesInt), int64, """
+The minimum alignment of this struct is only 1 byte based on its fields.
+Test that the memory backing these structs is extended to the right size.
+"""),
+  FunctionType(List.filled(10, struct20bytesInt), int32, """
+Argument too big to go into integer registers on arm64.
+The arguments are passed as pointers to copies.
+The amount of arguments exhausts the number of integer registers, such that
+pointers to copies are also passed on the stack."""),
+  FunctionType(
+      [struct20bytesFloat],
+      float,
+      """
+Argument too big to go into FPU registers in hardfp and arm64."""),
+  FunctionType(List.filled(5, struct32bytesDouble), double_, """
+Arguments in FPU registers on arm64.
+5 struct arguments will exhaust available registers."""),
+  FunctionType(
+      [struct40bytesDouble],
+      double_,
+      """
+Argument too big to go into FPU registers in arm64."""),
+  FunctionType(
+      [struct1024bytesInt],
+      uint64,
+      """
+Test 1kb struct."""),
+  FunctionType(
+      [
+        float,
+        struct16bytesFloat,
+        float,
+        struct16bytesFloat,
+        float,
+        struct16bytesFloat,
+        float,
+        struct16bytesFloat,
+        float
+      ],
+      float,
+      """
+Tests the alignment of structs in FPU registers and backfilling."""),
+  FunctionType(
+      [
+        float,
+        struct32bytesDouble,
+        float,
+        struct32bytesDouble,
+        float,
+        struct32bytesDouble,
+        float,
+        struct32bytesDouble,
+        float
+      ],
+      double_,
+      """
+Tests the alignment of structs in FPU registers and backfilling."""),
+  FunctionType(
+      [
+        int8,
+        struct16bytesMixed,
+        int8,
+        struct16bytesMixed,
+        int8,
+        struct16bytesMixed,
+        int8,
+        struct16bytesMixed,
+        int8
+      ],
+      double_,
+      """
+Tests the alignment of structs in integers registers and on the stack.
+Arm32 aligns this struct at 8.
+Also, arm32 allocates the second struct partially in registers, partially
+on stack.
+Test backfilling of integer registers."""),
+  FunctionType(
+      [
+        double_,
+        double_,
+        double_,
+        double_,
+        double_,
+        double_,
+        struct16bytesMixed,
+        struct16bytesMixed,
+        struct16bytesMixed,
+        struct16bytesMixed,
+        int32,
+      ],
+      double_,
+      """
+On Linux x64, it will exhaust xmm registers first, after 6 doubles and 2
+structs. The rest of the structs will go on the stack.
+The int will be backfilled into the int register."""),
+  FunctionType(
+      [
+        int32,
+        int32,
+        int32,
+        int32,
+        struct16bytesMixed,
+        struct16bytesMixed,
+        struct16bytesMixed,
+        struct16bytesMixed,
+        double_,
+      ],
+      double_,
+      """
+On Linux x64, it will exhaust int registers first.
+The rest of the structs will go on the stack.
+The double will be backfilled into the xmm register."""),
+  FunctionType(
+      [
+        struct40bytesDouble,
+        struct4bytesInt,
+        struct8bytesFloat,
+      ],
+      double_,
+      """
+On various architectures, first struct is allocated on stack.
+Check that the other two arguments are allocated on registers."""),
+  FunctionType(
+      [
+        // Exhaust integer registers on all architectures
+        int32,
+        int32,
+        int32,
+        int32,
+        int32,
+        int32,
+        int32,
+        int32,
+        // Exhaust floating point registers on all architectures.
+        double_,
+        double_,
+        double_,
+        double_,
+        double_,
+        double_,
+        double_,
+        double_,
+        // Pass all kinds of structs to exercise stack placement behavior.
+        //
+        // For all structs, align stack with int64, then align to 1-byte with
+        // int8, then pass struct.
+        int64,
+        int8,
+        struct1byteInt,
+        int64,
+        int8,
+        struct4bytesInt,
+        int64,
+        int8,
+        struct8bytesInt,
+        int64,
+        int8,
+        struct8bytesFloat,
+        int64,
+        int8,
+        struct8BytesMixed,
+        int64,
+        int8,
+        structAlignmentInt16,
+        int64,
+        int8,
+        structAlignmentInt32,
+        int64,
+        int8,
+        structAlignmentInt64,
+      ],
+      double_,
+      """
+Test alignment and padding of 16 byte int within struct."""),
+  FunctionType(
+      [structAlignmentInt16],
+      int64,
+      """
+Test alignment and padding of 16 byte int within struct."""),
+  FunctionType(
+      [structAlignmentInt32],
+      int64,
+      """
+Test alignment and padding of 32 byte int within struct."""),
+  FunctionType(
+      [structAlignmentInt64],
+      int64,
+      """
+Test alignment and padding of 64 byte int within struct."""),
+  FunctionType(struct1byteInt.memberTypes, struct1byteInt, """
+Smallest struct with data."""),
+  FunctionType(struct3bytesInt.memberTypes, struct3bytesInt, """
+Smaller than word size return value on all architectures."""),
+  FunctionType(struct3bytesInt2.memberTypes, struct3bytesInt2, """
+Smaller than word size return value on all architectures.
+With alignment rules taken into account size is 4 bytes."""),
+  FunctionType(struct4bytesInt.memberTypes, struct4bytesInt, """
+Word size return value on 32 bit architectures.."""),
+  FunctionType(struct7bytesInt.memberTypes, struct7bytesInt, """
+Non-wordsize return value."""),
+  FunctionType(struct7bytesInt2.memberTypes, struct7bytesInt2, """
+Non-wordsize return value.
+With alignment rules taken into account size is 8 bytes."""),
+  FunctionType(struct8bytesInt.memberTypes, struct8bytesInt, """
+Return value in integer registers on many architectures."""),
+  FunctionType(struct8bytesFloat.memberTypes, struct8bytesFloat, """
+Return value in FP registers on many architectures."""),
+  FunctionType(struct8BytesMixed.memberTypes, struct8BytesMixed, """
+Return value split over FP and integer register in x64."""),
+  FunctionType(struct9bytesInt.memberTypes, struct9bytesInt, """
+The minimum alignment of this struct is only 1 byte based on its fields.
+Test that the memory backing these structs is the right size and that
+dart:ffi trampolines do not write outside this size."""),
+  FunctionType(struct9bytesInt2.memberTypes, struct9bytesInt2, """
+Return value in two integer registers on x64.
+With alignment rules taken into account size is 12 or 16 bytes."""),
+  FunctionType(struct12bytesFloat.memberTypes, struct12bytesFloat, """
+Return value in FPU registers, but does not use all registers on arm hardfp
+and arm64."""),
+  FunctionType(struct16bytesFloat.memberTypes, struct16bytesFloat, """
+Return value in FPU registers on arm hardfp and arm64."""),
+  FunctionType(struct16bytesMixed.memberTypes, struct16bytesMixed, """
+Return value split over FP and integer register in x64."""),
+  FunctionType(struct16bytesMixed2.memberTypes, struct16bytesMixed2, """
+Return value split over FP and integer register in x64.
+The integer register contains half float half int."""),
+  FunctionType(struct17bytesInt.memberTypes, struct17bytesInt, """
+Rerturn value returned in preallocated space passed by pointer on most ABIs.
+Is non word size on purpose, to test that structs are rounded up to word size
+on all ABIs."""),
+  FunctionType(struct19bytesInt.memberTypes, struct19bytesInt, """
+The minimum alignment of this struct is only 1 byte based on its fields.
+Test that the memory backing these structs is the right size and that
+dart:ffi trampolines do not write outside this size."""),
+  FunctionType(struct20bytesInt.memberTypes, struct20bytesInt, """
+Return value too big to go in cpu registers on arm64."""),
+  FunctionType(struct20bytesFloat.memberTypes, struct20bytesFloat, """
+Return value too big to go in FPU registers on x64, arm hardfp and arm64."""),
+  FunctionType(struct32bytesDouble.memberTypes, struct32bytesDouble, """
+Return value in FPU registers on arm64."""),
+  FunctionType(struct40bytesDouble.memberTypes, struct40bytesDouble, """
+Return value too big to go in FPU registers on arm64."""),
+  FunctionType(struct1024bytesInt.memberTypes, struct1024bytesInt, """
+Test 1kb struct."""),
+  FunctionType(
+      [struct1byteInt],
+      struct1byteInt,
+      """
+Test that a struct passed in as argument can be returned.
+Especially for ffi callbacks.
+Struct is passed in int registers in most ABIs."""),
+  FunctionType(
+      [int32, int32, int32, int32, int32, int32, int32, int32, struct1byteInt],
+      struct1byteInt,
+      """
+Test that a struct passed in as argument can be returned.
+Especially for ffi callbacks.
+Struct is passed on stack on all ABIs."""),
+  FunctionType(
+      [struct8bytesFloat],
+      struct8bytesFloat,
+      """
+Test that a struct passed in as argument can be returned.
+Especially for ffi callbacks.
+Struct is passed in float registers in most ABIs."""),
+  FunctionType(
+      [struct20bytesInt],
+      struct20bytesInt,
+      """
+On arm64, both argument and return value are passed in by pointer."""),
+  FunctionType(
+      [
+        int32,
+        int32,
+        int32,
+        int32,
+        int32,
+        int32,
+        int32,
+        int32,
+        struct20bytesInt
+      ],
+      struct20bytesInt,
+      """
+On arm64, both argument and return value are passed in by pointer.
+Ints exhaust registers, so that pointer is passed on stack."""),
+  FunctionType(structAlignmentInt16.memberTypes, structAlignmentInt16, """
+Test alignment and padding of 16 byte int within struct."""),
+  FunctionType(structAlignmentInt32.memberTypes, structAlignmentInt32, """
+Test alignment and padding of 32 byte int within struct."""),
+  FunctionType(structAlignmentInt64.memberTypes, structAlignmentInt64, """
+Test alignment and padding of 64 byte int within struct."""),
+];
+
+final structs = [
+  struct0bytes,
+  struct1byteInt,
+  struct3bytesInt,
+  struct3bytesInt2,
+  struct4bytesInt,
+  struct7bytesInt,
+  struct7bytesInt2,
+  struct8bytesInt,
+  struct8bytesFloat,
+  struct8BytesMixed,
+  struct9bytesInt,
+  struct9bytesInt2,
+  struct12bytesFloat,
+  struct16bytesFloat,
+  struct16bytesMixed,
+  struct16bytesMixed2,
+  struct17bytesInt,
+  struct19bytesInt,
+  struct20bytesInt,
+  struct20bytesFloat,
+  struct32bytesDouble,
+  struct40bytesDouble,
+  struct1024bytesInt,
+  structAlignmentInt16,
+  structAlignmentInt32,
+  structAlignmentInt64,
+];
+
+/// Using empty structs is undefined behavior in C.
+final struct0bytes = StructType([]);
+
+final struct1byteInt = StructType([int8]);
+final struct3bytesInt = StructType(List.filled(3, uint8));
+final struct3bytesInt2 = StructType.disambiguate([int16, int8], "2ByteAligned");
+final struct4bytesInt = StructType([int16, int16]);
+final struct7bytesInt = StructType(List.filled(7, uint8));
+final struct7bytesInt2 =
+    StructType.disambiguate([int32, int16, int8], "4ByteAligned");
+final struct8bytesInt = StructType([int16, int16, int32]);
+final struct8bytesFloat = StructType([float, float]);
+final struct8BytesMixed = StructType([float, int16, int16]);
+final struct9bytesInt = StructType(List.filled(9, uint8));
+final struct9bytesInt2 =
+    StructType.disambiguate([int64, int8], "4Or8ByteAligned");
+final struct12bytesFloat = StructType([float, float, float]);
+
+/// The largest homogenous float that goes into FPU registers on softfp and
+/// arm64.
+final struct16bytesFloat = StructType([float, float, float, float]);
+
+/// This struct will be 8 byte aligned on arm.
+final struct16bytesMixed = StructType([double_, int64]);
+
+/// This struct will be 4 byte aligned on arm.
+final struct16bytesMixed2 =
+    StructType.disambiguate([float, float, float, int32], "2");
+
+final struct17bytesInt = StructType([int64, int64, int8]);
+
+/// This struct has only 1 byte field-alignmnent requirements.
+final struct19bytesInt = StructType(List.filled(19, uint8));
+
+/// The first homogenous integer struct that does not go into registers
+/// anymore on arm64.
+final struct20bytesInt = StructType([int32, int32, int32, int32, int32]);
+
+/// The first homogenous float that does not go into FPU registers anymore on
+/// softfp and arm64.
+final struct20bytesFloat = StructType([float, float, float, float, float]);
+
+/// Largest homogenous doubles in arm64 that goes into FPU registers.
+final struct32bytesDouble = StructType([double_, double_, double_, double_]);
+
+/// The first homogenous doubles that does not go into FPU registers anymore on
+/// arm64.
+final struct40bytesDouble =
+    StructType([double_, double_, double_, double_, double_]);
+
+final struct1024bytesInt = StructType(List.filled(128, uint64));
+
+final structAlignmentInt16 = StructType([int8, int16, int8]);
+final structAlignmentInt32 = StructType([int8, int32, int8]);
+final structAlignmentInt64 = StructType([int8, int64, int8]);
diff --git a/tests/ffi/generator/structs_by_value_tests_generator.dart b/tests/ffi/generator/structs_by_value_tests_generator.dart
new file mode 100644
index 0000000..f3f9f02
--- /dev/null
+++ b/tests/ffi/generator/structs_by_value_tests_generator.dart
@@ -0,0 +1,930 @@
+// Copyright (c) 2020, 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';
+
+import 'c_types.dart';
+import 'structs_by_value_tests_configuration.dart';
+import 'utils.dart';
+
+/// The test type determines how to convert the arguments into return values
+/// such that the caller knows what to check.
+enum TestType {
+  /// Tested by getting all the individual fields out of the structs and
+  /// summing their values.
+  structArguments,
+
+  /// Tested by passing assigning the arguments to the struct fields.
+  structReturn,
+
+  /// Tested by returning the struct passed in.
+  structReturnArgument,
+}
+
+extension on FunctionType {
+  TestType get testType {
+    if (arguments.containsStructs && returnValue is FundamentalType) {
+      return TestType.structArguments;
+    }
+    if (returnValue is StructType && argumentTypes.contains(returnValue)) {
+      return TestType.structReturnArgument;
+    }
+    if (returnValue is StructType) {
+      if (arguments.length == (returnValue as StructType).members.length) {
+        return TestType.structReturn;
+      }
+    }
+    throw Exception("Unknown test type: $this");
+  }
+}
+
+/// We use the class structure as an algebraic data type in order to keep the
+/// relevant parts of the code generation closer together.
+extension on CType {
+  /// The part of the cout expression after `std::cout` and before the `;`.
+  String coutExpression(String variableName) {
+    switch (this.runtimeType) {
+      case FundamentalType:
+        if (this == uint8 || this == int8) {
+          return "<< static_cast<int>($variableName)";
+        }
+        return "<< $variableName";
+
+      case StructType:
+        final this_ = this as StructType;
+        return this_.members.coutExpression("$variableName.");
+    }
+
+    throw Exception("Not implemented for ${this.runtimeType}");
+  }
+
+  /// A statement recursively outputting all members.
+  String coutStatement(String variableName) {
+    final coutExpr = this.coutExpression(variableName);
+    return 'std::cout << "$variableName = " $coutExpr << "\\n";';
+  }
+}
+
+extension on List<Member> {
+  /// The part of the cout expression after `std::cout` and before the `;`.
+  String coutExpression([String namePrefix = ""]) {
+    String result = '<< "("';
+    result += this
+        .map((m) => m.type.coutExpression("$namePrefix${m.name}"))
+        .join('<< ", "');
+    result += '<< ")"';
+    return result.trimCouts();
+  }
+}
+
+extension on CType {
+  /// A list of statements adding all members recurisvely to `result`.
+  ///
+  /// Both valid in Dart and C.
+  String addToResultStatements(String variableName) {
+    switch (this.runtimeType) {
+      case FundamentalType:
+        return "result += $variableName;\n";
+
+      case StructType:
+        final this_ = this as StructType;
+        return this_.members.addToResultStatements("$variableName.");
+    }
+
+    throw Exception("Not implemented for ${this.runtimeType}");
+  }
+}
+
+extension on List<Member> {
+  /// A list of statements adding all members recurisvely to `result`.
+  ///
+  /// Both valid in Dart and C.
+  String addToResultStatements([String namePrefix = ""]) {
+    return map((m) => m.type.addToResultStatements("$namePrefix${m.name}"))
+        .join();
+  }
+}
+
+extension on CType {
+  /// A list of statements recursively assigning all members with [a].
+  ///
+  /// Both valid in Dart and C.
+  String assignValueStatements(ArgumentValueAssigner a, String variableName) {
+    switch (this.runtimeType) {
+      case FundamentalType:
+        final this_ = this as FundamentalType;
+        return "$variableName = ${a.nextValue(this_)};\n";
+
+      case StructType:
+        final this_ = this as StructType;
+        return this_.members.assignValueStatements(a, "$variableName.");
+    }
+
+    throw Exception("Not implemented for ${this.runtimeType}");
+  }
+
+  /// A list of statements recursively coping all members from [source].
+  ///
+  /// Both valid in Dart and C.
+  String copyValueStatements(String source, String destination) {
+    switch (this.runtimeType) {
+      case FundamentalType:
+        return "$destination = $source;\n";
+
+      case StructType:
+        final this_ = this as StructType;
+        return this_.members.copyValueStatements("$source.", "$destination.");
+    }
+
+    throw Exception("Not implemented for ${this.runtimeType}");
+  }
+}
+
+extension on List<Member> {
+  /// A list of statements recursively assigning all members with [a].
+  ///
+  /// Both valid in Dart and C.
+  String assignValueStatements(ArgumentValueAssigner a,
+      [String namePrefix = ""]) {
+    return map((m) => m.type.assignValueStatements(a, "$namePrefix${m.name}"))
+        .join();
+  }
+
+  /// A list of statements recursively coping all members from [source].
+  ///
+  /// Both valid in Dart and C.
+  String copyValueStatements([sourcePrefix = "", destinationPrefix = ""]) {
+    return map((m) => m.type.copyValueStatements(
+        "$sourcePrefix${m.name}", "$destinationPrefix${m.name}")).join();
+  }
+}
+
+/// A helper class that assigns values to fundamental types.
+///
+/// Also keeps track of a sum of all values, to be used for testing the result.
+class ArgumentValueAssigner {
+  int i = 1;
+  int sum = 0;
+  String nextValue(FundamentalType type) {
+    int argumentValue = i;
+    i++;
+    if (type.isSigned && i % 2 == 0) {
+      argumentValue = -argumentValue;
+    }
+    sum += argumentValue;
+    if (type.isFloatingPoint) {
+      return argumentValue.toDouble().toString();
+    } else {
+      return argumentValue.toString();
+    }
+  }
+
+  String sumValue(FundamentalType type) {
+    if (type.isFloatingPoint) {
+      return sum.toDouble().toString();
+    } else {
+      return sum.toString();
+    }
+  }
+}
+
+extension on CType {
+  /// A list of Dart statements recursively allocating all members.
+  String dartAllocateStatements(String variableName) {
+    switch (this.runtimeType) {
+      case FundamentalType:
+        return "${dartType} ${variableName};\n";
+
+      case StructType:
+        return "${dartType} ${variableName} = allocate<$dartType>().ref;\n";
+    }
+
+    throw Exception("Not implemented for ${this.runtimeType}");
+  }
+
+  /// A list of Dart statements allocating as zero or nullptr.
+  String dartAllocateZeroStatements(String variableName) {
+    switch (this.runtimeType) {
+      case FundamentalType:
+        final this_ = this as FundamentalType;
+        if (this_.isInteger) {
+          return "${dartType} ${variableName} = 0;\n";
+        }
+        return "${dartType} ${variableName} = 0.0;\n";
+
+      case StructType:
+        return "${dartType} ${variableName} = ${dartType}();\n";
+    }
+
+    throw Exception("Not implemented for ${this.runtimeType}");
+  }
+}
+
+extension on List<Member> {
+  /// A list of Dart statements recursively allocating all members.
+  String dartAllocateStatements([String namePrefix = ""]) {
+    return map((m) => m.type.dartAllocateStatements("$namePrefix${m.name}"))
+        .join();
+  }
+
+  /// A list of Dart statements as zero or nullptr.
+  String dartAllocateZeroStatements([String namePrefix = ""]) {
+    return map((m) => m.type.dartAllocateZeroStatements("$namePrefix${m.name}"))
+        .join();
+  }
+}
+
+extension on CType {
+  /// A list of Dart statements recursively freeing all members.
+  String dartFreeStatements(String variableName) {
+    switch (this.runtimeType) {
+      case FundamentalType:
+        return "";
+
+      case StructType:
+        return "free($variableName.addressOf);\n";
+    }
+
+    throw Exception("Not implemented for ${this.runtimeType}");
+  }
+}
+
+extension on List<Member> {
+  /// A list of Dart statements recursively freeing all members.
+  String dartFreeStatements([String namePrefix = ""]) {
+    return map((m) => m.type.dartFreeStatements("$namePrefix${m.name}")).join();
+  }
+}
+
+extension on CType {
+  /// A list of C statements recursively allocating all members.
+  String cAllocateStatements(String variableName) {
+    switch (this.runtimeType) {
+      case FundamentalType:
+      case StructType:
+        return "${cType} ${variableName};\n";
+    }
+
+    throw Exception("Not implemented for ${this.runtimeType}");
+  }
+}
+
+extension on List<Member> {
+  /// A list of C statements recursively allocating all members.
+  String cAllocateStatements([String namePrefix = ""]) {
+    return map((m) => m.type.cAllocateStatements("$namePrefix${m.name}"))
+        .join();
+  }
+}
+
+extension on CType {
+  /// A list of Dart statements recursively checking all members.
+  String dartExpectsStatements(String expected, String actual) {
+    switch (this.runtimeType) {
+      case FundamentalType:
+        final this_ = this as FundamentalType;
+        if (this_.isInteger) {
+          return "Expect.equals(${expected}, ${actual});";
+        }
+        assert(this_.isFloatingPoint);
+        return "Expect.approxEquals(${expected}, ${actual});";
+
+      case StructType:
+        final this_ = this as StructType;
+        return this_.members.dartExpectsStatements("$expected.", "$actual.");
+    }
+
+    throw Exception("Not implemented for ${this.runtimeType}");
+  }
+}
+
+extension on List<Member> {
+  /// A list of Dart statements recursively checking all members.
+  String dartExpectsStatements(
+      [String expectedPrefix = "", String actualPrefix = ""]) {
+    return map((m) => m.type.dartExpectsStatements(
+        "$expectedPrefix${m.name}", "$actualPrefix${m.name}")).join();
+  }
+}
+
+extension on CType {
+  /// A list of C statements recursively checking all members.
+  String cExpectsStatements(String expected, String actual) {
+    switch (this.runtimeType) {
+      case FundamentalType:
+        final this_ = this as FundamentalType;
+        if (this_.isInteger) {
+          return "CHECK_EQ(${expected}, ${actual});";
+        }
+        assert(this_.isFloatingPoint);
+        return "CHECK_APPROX(${expected}, ${actual});";
+
+      case StructType:
+        final this_ = this as StructType;
+        return this_.members.cExpectsStatements("$expected.", "$actual.");
+    }
+
+    throw Exception("Not implemented for ${this.runtimeType}");
+  }
+
+  /// A list of C statements recursively checking all members for zero.
+  String cExpectsZeroStatements(String actual) {
+    switch (this.runtimeType) {
+      case FundamentalType:
+        final this_ = this as FundamentalType;
+        if (this_.isInteger) {
+          return "CHECK_EQ(0, ${actual});";
+        }
+        assert(this_.isFloatingPoint);
+        return "CHECK_APPROX(0.0, ${actual});";
+
+      case StructType:
+        final this_ = this as StructType;
+        return this_.members.cExpectsZeroStatements("$actual.");
+    }
+
+    throw Exception("Not implemented for ${this.runtimeType}");
+  }
+}
+
+extension on List<Member> {
+  /// A list of C statements recursively checking all members.
+  String cExpectsStatements(
+      [String expectedPrefix = "", String actualPrefix = ""]) {
+    return map((m) => m.type.cExpectsStatements(
+        "$expectedPrefix${m.name}", "$actualPrefix${m.name}")).join();
+  }
+
+  /// A list of C statements recursively checking all members for zero.
+  String cExpectsZeroStatements([String actualPrefix = ""]) {
+    return map((m) => m.type.cExpectsZeroStatements("$actualPrefix${m.name}"))
+        .join();
+  }
+}
+
+extension on CType {
+  /// Expression denoting the first FundamentalType field.
+  ///
+  /// Both valid in Dart and C.
+  String firstArgumentName(String variableName) {
+    switch (this.runtimeType) {
+      case FundamentalType:
+        return variableName;
+
+      case StructType:
+        final this_ = this as StructType;
+        return this_.members.firstArgumentName("$variableName.");
+    }
+
+    throw Exception("Not implemented for ${this.runtimeType}");
+  }
+}
+
+extension on List<Member> {
+  /// Expression denoting the first FundamentalType field.
+  ///
+  /// Both valid in Dart and C.
+  String firstArgumentName([String prefix = ""]) {
+    return this[0].type.firstArgumentName("$prefix${this[0].name}");
+  }
+}
+
+extension on StructType {
+  String dartClass(bool nnbd) {
+    String dartFields = "";
+    for (final member in members) {
+      dartFields += "${member.dartStructField(nnbd)}\n\n";
+    }
+    String toStringBody = members.map((m) => "\$\{${m.name}\}").join(", ");
+    return """
+    class $name extends Struct {
+      $dartFields
+
+      String toString() => "($toStringBody)";
+    }
+    """;
+  }
+
+  String get cDefinition {
+    String cFields = "";
+    for (final member in members) {
+      cFields += "  ${member.cStructField}\n";
+    }
+    return """
+    struct $name {
+      $cFields
+    };
+
+    """;
+  }
+}
+
+extension on FunctionType {
+  String get dartCallCode {
+    final a = ArgumentValueAssigner();
+    final assignValues = arguments.assignValueStatements(a);
+    final argumentFrees = arguments.dartFreeStatements();
+
+    final argumentNames = arguments.map((e) => e.name).join(", ");
+
+    String expects;
+    switch (testType) {
+      case TestType.structArguments:
+        // Check against sum value.
+        final expectedResult = a.sumValue(returnValue as FundamentalType);
+        expects = returnValue.dartExpectsStatements(expectedResult, "result");
+        break;
+      case TestType.structReturn:
+        // Check against input arguments.
+        expects = arguments.dartExpectsStatements("", "result.");
+        break;
+      case TestType.structReturnArgument:
+        expects = returnValue.dartExpectsStatements(
+            structReturnArgument.name, "result");
+        break;
+    }
+
+    return """
+    final $dartName =
+      ffiTestFunctions.lookupFunction<$dartCType, $dartType>("$cName");
+
+    ${reason.makeDartDocComment()}
+    void $dartTestName() {
+      ${arguments.dartAllocateStatements()}
+
+      ${assignValues}
+
+      final result = $dartName($argumentNames);
+
+      print("result = \$result");
+
+      $expects
+
+      $argumentFrees
+    }
+    """;
+  }
+
+  String dartCallbackCode(bool nnbd) {
+    final argumentss =
+        arguments.map((a) => "${a.type.dartType} ${a.name}").join(", ");
+
+    final prints = arguments.map((a) => "\$\{${a.name}\}").join(", ");
+
+    String buildReturnValue = "";
+    switch (testType) {
+      case TestType.structArguments:
+        // Sum all input values.
+        buildReturnValue = """
+        ${returnValue.dartType} result = 0;
+
+        ${arguments.addToResultStatements('${dartName}_')}
+        """;
+        break;
+      case TestType.structReturn:
+        // Allocate a struct.
+        buildReturnValue = """
+        ${returnValue.dartType} result = allocate<${returnValue.dartType}>().ref;
+
+        ${arguments.copyValueStatements("${dartName}_", "result.")}
+        """;
+        break;
+      case TestType.structReturnArgument:
+        buildReturnValue = """
+        ${returnValue.cType} result = ${dartName}_${structReturnArgument.name};
+        """;
+        break;
+    }
+
+    final globals = arguments.dartAllocateZeroStatements("${dartName}_");
+
+    final copyToGlobals =
+        arguments.map((a) => '${dartName}_${a.name} = ${a.name};').join("\n");
+
+    // Simulate assigning values the same way as in C, so that we know what the
+    // final return value should be.
+    final a = ArgumentValueAssigner();
+    arguments.assignValueStatements(a);
+    String afterCallbackExpects = "";
+    String afterCallbackFrees = "";
+    switch (testType) {
+      case TestType.structArguments:
+        // Check that the input structs are still available.
+        // Check against sum value.
+        final expectedResult = a.sumValue(returnValue as FundamentalType);
+        afterCallbackExpects =
+            returnValue.dartExpectsStatements(expectedResult, "result");
+        break;
+      case TestType.structReturn:
+        // We're passing allocating structs in [buildReturnValue].
+        afterCallbackFrees =
+            returnValue.dartFreeStatements("${dartName}Result");
+        break;
+      case TestType.structReturnArgument:
+        break;
+    }
+
+    String returnNull = "";
+    if (!nnbd) {
+      returnNull = """
+      if (${arguments.firstArgumentName()} == $returnNullValue) {
+        print("returning null!");
+        return null;
+      }
+      """;
+    }
+
+    return """
+    typedef ${cName}Type = $dartCType;
+
+    // Global variables to be able to test inputs after callback returned.
+    $globals
+
+    // Result variable also global, so we can delete it after the callback.
+    ${returnValue.dartAllocateZeroStatements("${dartName}Result")}
+
+    ${returnValue.dartType} ${dartName}CalculateResult() {
+      $buildReturnValue
+
+      ${dartName}Result = result;
+
+      return result;
+    }
+
+    ${reason.makeDartDocComment()}
+    ${returnValue.dartType} $dartName($argumentss) {
+      print("$dartName($prints)");
+
+      // In legacy mode, possibly return null.
+      $returnNull
+
+      // In both nnbd and legacy mode, possibly throw.
+      if (${arguments.firstArgumentName()} == $throwExceptionValue ||
+          ${arguments.firstArgumentName()} == $returnNullValue) {
+        print("throwing!");
+        throw Exception("$cName throwing on purpuse!");
+      }
+
+      $copyToGlobals
+
+      final result = ${dartName}CalculateResult();
+
+      print(\"result = \$result\");
+
+      return result;
+    }
+
+    void ${dartName}AfterCallback() {
+      $afterCallbackFrees
+
+      final result = ${dartName}CalculateResult();
+
+      print(\"after callback result = \$result\");
+
+      $afterCallbackExpects
+
+      $afterCallbackFrees
+    }
+
+    """;
+  }
+
+  String get dartCallbackTestConstructor {
+    String exceptionalReturn = "";
+    if (returnValue is FundamentalType) {
+      if ((returnValue as FundamentalType).isFloatingPoint) {
+        exceptionalReturn = ", 0.0";
+      } else {
+        exceptionalReturn = ", 0";
+      }
+    }
+    return """
+    CallbackTest.withCheck("$cName",
+      Pointer.fromFunction<${cName}Type>($dartName$exceptionalReturn),
+      ${dartName}AfterCallback),
+    """;
+  }
+
+  String get cCallCode {
+    String body = "";
+    switch (testType) {
+      case TestType.structArguments:
+        body = """
+        ${returnValue.cType} result = 0;
+
+        ${arguments.addToResultStatements()}
+        """;
+        break;
+      case TestType.structReturn:
+        body = """
+        ${returnValue.cType} result;
+
+        ${arguments.copyValueStatements("", "result.")}
+        """;
+        break;
+      case TestType.structReturnArgument:
+        body = """
+        ${returnValue.cType} result = ${structReturnArgument.name};
+        """;
+        break;
+    }
+
+    final argumentss =
+        arguments.map((e) => "${e.type.cType} ${e.name}").join(", ");
+
+    return """
+    // Used for testing structs by value.
+    ${reason.makeCComment()}
+    DART_EXPORT ${returnValue.cType} $cName($argumentss) {
+      std::cout << \"$cName\" ${arguments.coutExpression()} << \"\\n\";
+
+      $body
+
+      ${returnValue.coutStatement("result")}
+
+      return result;
+    }
+
+    """;
+  }
+
+  String get cCallbackCode {
+    final a = ArgumentValueAssigner();
+    final argumentAllocations = arguments.cAllocateStatements();
+    final assignValues = arguments.assignValueStatements(a);
+
+    final argumentss =
+        arguments.map((e) => "${e.type.cType} ${e.name}").join(", ");
+
+    final argumentNames = arguments.map((e) => e.name).join(", ");
+
+    String expects = "";
+    String expectsZero = "";
+    switch (testType) {
+      case TestType.structArguments:
+        // Check against sum value.
+        final returnValue_ = returnValue as FundamentalType;
+        final expectedResult = a.sumValue(returnValue_);
+        expects = returnValue.cExpectsStatements(expectedResult, "result");
+
+        expectsZero = returnValue.cExpectsZeroStatements("result");
+        break;
+      case TestType.structReturn:
+        // Check against input statements.
+        expects = arguments.cExpectsStatements("", "result.");
+
+        expectsZero = arguments.cExpectsZeroStatements("result.");
+        break;
+      case TestType.structReturnArgument:
+        // Check against input struct fields.
+        expects =
+            returnValue.cExpectsStatements(structReturnArgument.name, "result");
+
+        expectsZero = returnValue.cExpectsZeroStatements("result");
+        break;
+    }
+
+    return """
+    // Used for testing structs by value.
+    ${reason.makeCComment()}
+    DART_EXPORT intptr_t
+    Test$cName(
+        // NOLINTNEXTLINE(whitespace/parens)
+        ${returnValue.cType} (*f)($argumentss)) {
+      $argumentAllocations
+
+      $assignValues
+
+      std::cout << \"Calling Test$cName(\" ${arguments.coutExpression()} << \")\\n\";
+
+      ${returnValue.cType} result = f($argumentNames);
+
+      ${returnValue.coutStatement("result")}
+
+      $expects
+
+      // Pass argument that will make the Dart callback throw.
+      ${arguments.firstArgumentName()} = $throwExceptionValue;
+
+      result = f($argumentNames);
+
+      $expectsZero
+
+      // Pass argument that will make the Dart callback return null.
+      ${arguments.firstArgumentName()} = $returnNullValue;
+
+      result = f($argumentNames);
+
+      $expectsZero
+
+      return 0;
+    }
+
+    """;
+  }
+}
+
+/// Some value between 0 and 127 (works in every native type).
+const throwExceptionValue = 42;
+
+/// Some value between 0 and 127 (works in every native type).
+const returnNullValue = 84;
+
+const headerDartCallTest = """
+// Copyright (c) 2020, 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.
+//
+// This file has been automatically generated. Please do not edit it manually.
+//
+// SharedObjects=ffi_test_functions
+// VMOptions=
+// VMOptions=--deterministic --optimization-counter-threshold=5
+// VMOptions=--use-slow-path
+// VMOptions=--use-slow-path --stacktrace-every=100
+
+import 'dart:ffi';
+
+import "package:expect/expect.dart";
+import "package:ffi/ffi.dart";
+
+import 'dylib_utils.dart';
+
+final ffiTestFunctions = dlopenPlatformSpecific("ffi_test_functions");
+""";
+
+void writeDartCallTest() {
+  for (bool nnbd in [true, false]) {
+    final StringBuffer buffer = StringBuffer();
+    buffer.write(headerDartCallTest);
+
+    buffer.write("""
+    void main() {
+      for (int i = 0; i < 10; ++i) {
+        ${functions.map((e) => "${e.dartTestName}();").join("\n")}
+      }
+    }
+    """);
+    buffer.writeAll(structs.map((e) => e.dartClass(nnbd)));
+    buffer.writeAll(functions.map((e) => e.dartCallCode));
+
+    final path = callTestPath(nnbd);
+    File(path).writeAsStringSync(buffer.toString());
+    Process.runSync("dartfmt", ["-w", path]);
+  }
+}
+
+String callTestPath(bool nnbd) {
+  final folder = nnbd ? "ffi" : "ffi_2";
+  return Platform.script
+      .resolve("../../$folder/function_structs_by_value_generated_test.dart")
+      .path;
+}
+
+const headerDartCallbackTest = """
+// Copyright (c) 2020, 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.
+//
+// This file has been automatically generated. Please do not edit it manually.
+//
+// SharedObjects=ffi_test_functions
+// VMOptions=
+// VMOptions=--deterministic --optimization-counter-threshold=10
+// VMOptions=--use-slow-path
+// VMOptions=--use-slow-path --stacktrace-every=100
+
+import 'dart:ffi';
+
+import "package:expect/expect.dart";
+import "package:ffi/ffi.dart";
+
+import 'callback_tests_utils.dart';
+
+// Reuse the struct classes.
+import 'function_structs_by_value_generated_test.dart';
+
+
+void main() {
+  testCases.forEach((t) {
+    print("==== Running " + t.name);
+    t.run();
+  });
+}
+
+
+""";
+
+void writeDartCallbackTest() {
+  for (bool nnbd in [true, false]) {
+    final StringBuffer buffer = StringBuffer();
+    buffer.write(headerDartCallbackTest);
+
+    buffer.write("""
+  final testCases = [
+    ${functions.map((e) => e.dartCallbackTestConstructor).join("\n")}
+  ];
+  """);
+
+    buffer.writeAll(functions.map((e) => e.dartCallbackCode(nnbd)));
+
+    final path = callbackTestPath(nnbd);
+    File(path).writeAsStringSync(buffer.toString());
+    Process.runSync("dartfmt", ["-w", path]);
+  }
+}
+
+String callbackTestPath(bool nnbd) {
+  final folder = nnbd ? "ffi" : "ffi_2";
+  return Platform.script
+      .resolve(
+          "../../$folder/function_callbacks_structs_by_value_generated_test.dart")
+      .path;
+}
+
+const headerC = """
+// Copyright (c) 2020, 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.
+//
+// This file has been automatically generated. Please do not edit it manually.
+
+#include <stddef.h>
+#include <stdlib.h>
+#include <sys/types.h>
+
+#include <cmath>
+#include <iostream>
+#include <limits>
+
+#if defined(_WIN32)
+#define DART_EXPORT extern "C" __declspec(dllexport)
+#else
+#define DART_EXPORT                                                            \\
+  extern "C" __attribute__((visibility("default"))) __attribute((used))
+#endif
+
+namespace dart {
+
+#define CHECK(X)                                                               \\
+  if (!(X)) {                                                                  \\
+    fprintf(stderr, "%s\\n", "Check failed: " #X);                              \\
+    return 1;                                                                  \\
+  }
+
+#define CHECK_EQ(X, Y) CHECK((X) == (Y))
+
+// Works for positive, negative and zero.
+#define CHECK_APPROX(EXPECTED, ACTUAL)                                         \\
+  CHECK(((EXPECTED * 0.99) <= (ACTUAL) && (EXPECTED * 1.01) >= (ACTUAL)) ||    \\
+        ((EXPECTED * 0.99) >= (ACTUAL) && (EXPECTED * 1.01) <= (ACTUAL)))
+
+""";
+
+const footerC = """
+
+}  // namespace dart
+""";
+
+void writeC() {
+  final StringBuffer buffer = StringBuffer();
+  buffer.write(headerC);
+
+  buffer.writeAll(structs.map((e) => e.cDefinition));
+  buffer.writeAll(functions.map((e) => e.cCallCode));
+  buffer.writeAll(functions.map((e) => e.cCallbackCode));
+
+  buffer.write(footerC);
+
+  File(ccPath).writeAsStringSync(buffer.toString());
+  Process.runSync("clang-format", ["-i", ccPath]);
+}
+
+final ccPath = Platform.script
+    .resolve("../../../runtime/bin/ffi_test/ffi_test_functions_generated.cc")
+    .path;
+
+void printUsage() {
+  print("""
+Generates structs by value tests.
+
+Generates:
+- $ccPath
+- ${callbackTestPath(true)}
+- ${callTestPath(true)}
+- ${callbackTestPath(false)}
+- ${callTestPath(false)}
+""");
+}
+
+void main(List<String> arguments) {
+  if (arguments.length != 0) {
+    printUsage();
+    return;
+  }
+
+  writeDartCallTest();
+  writeDartCallbackTest();
+  writeC();
+}
diff --git a/tests/ffi/generator/utils.dart b/tests/ffi/generator/utils.dart
new file mode 100644
index 0000000..735e769
--- /dev/null
+++ b/tests/ffi/generator/utils.dart
@@ -0,0 +1,22 @@
+// Copyright (c) 2020, 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.
+
+extension TestGeneratorStringExtension on String {
+  String upperCaseFirst() => "${this[0].toUpperCase()}${this.substring(1)}";
+
+  String lowerCaseFirst() => "${this[0].toLowerCase()}${this.substring(1)}";
+
+  String makeCComment() => "// " + split("\n").join("\n// ");
+
+  String makeDartDocComment() => "/// " + split("\n").join("\n/// ");
+
+  String limitTo(int lenght) {
+    if (this.length > lenght) {
+      return substring(0, lenght);
+    }
+    return this;
+  }
+
+  String trimCouts() => replaceAll('" << "', '').replaceAll('"<< "', '');
+}
diff --git a/tests/ffi/prepare_flutter_bundle.dart b/tests/ffi/prepare_flutter_bundle.dart
deleted file mode 100644
index 83a4a42..0000000
--- a/tests/ffi/prepare_flutter_bundle.dart
+++ /dev/null
@@ -1,204 +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:async';
-import 'dart:io';
-
-import 'package:path/path.dart' as path;
-import 'package:args/args.dart';
-
-main(List<String> args) async {
-  if (args.length != 1) {
-    print('Usage ${Platform.executable} ${Platform.script} <output-dir>');
-    exit(1);
-  }
-
-  final sdkRoot =
-      path.canonicalize(path.join(Platform.script.path, '../../..'));
-  final flutterTestsDir = args.single;
-
-  print('Using SDK root: $sdkRoot');
-  final testFiles = <String>[];
-  final failedOrTimedOut = <String>[];
-  final filteredTests = <String>[];
-  await for (final testFile in listTestFiles(sdkRoot, filteredTests)) {
-    final duration = await run(sdkRoot, testFile);
-    if (duration != null && duration.inSeconds < 5) {
-      testFiles.add(testFile);
-    } else {
-      failedOrTimedOut.add(testFile);
-    }
-  }
-  testFiles.sort();
-  failedOrTimedOut.sort();
-  filteredTests.sort();
-
-  dumpTestList(testFiles, 'The following tests will be included:');
-  dumpTestList(failedOrTimedOut,
-      'The following tests will be excluded due to timeout or test failure:');
-  dumpTestList(
-      filteredTests,
-      'The following tests were filtered due to using '
-      'dart_api.h/async/DynamicLibrary.{process,executable}/...');
-
-  final allFiles = <String>{};
-  allFiles.add(path.join(sdkRoot, 'pkg/expect/lib/expect.dart'));
-  for (final testFile in testFiles) {
-    allFiles.add(testFile);
-    await addImportedFilesTo(allFiles, testFile);
-  }
-
-  await generateCleanDir(flutterTestsDir);
-
-  final dartTestsDir = path.join(flutterTestsDir, 'lib/src/generated');
-  await generateDartTests(dartTestsDir, allFiles, testFiles);
-
-  final ccDir = path.join(flutterTestsDir, 'ios/Classes');
-  await generateCLibs(sdkRoot, ccDir, allFiles, testFiles);
-
-  print('');
-  print('Please copy generated files into FFI flutter test application');
-  print('  * $dartTestsDir');
-  print('  * $ccDir');
-}
-
-void dumpTestList(List<String> testFiles, String message) {
-  if (testFiles.isEmpty) return;
-
-  print(message);
-  for (final testFile in testFiles) {
-    print('  ${path.basename(testFile)}');
-  }
-}
-
-final importRegExp = RegExp(r'''^import.*['"](.+)['"].*;''');
-
-Future addImportedFilesTo(Set<String> allFiles, String testFile) async {
-  final content = await File(testFile).readAsString();
-  for (final line in content.split('\n')) {
-    final match = importRegExp.matchAsPrefix(line);
-    if (match != null) {
-      final filename = match.group(1);
-      if (!filename.contains('dart:') &&
-          !filename.contains('package:expect') &&
-          !filename.contains('package:ffi')) {
-        final importedFile = Uri.file(testFile).resolve(filename).toFilePath();
-        if (allFiles.add(importedFile)) {
-          addImportedFilesTo(allFiles, importedFile);
-        }
-      }
-    }
-  }
-}
-
-Future generateCLibs(String sdkRoot, String destDir, Set<String> allFiles,
-    List<String> testFiles) async {
-  final dir = await generateCleanDir(destDir);
-
-  String destinationFile;
-
-  final lib1 =
-      path.join(sdkRoot, 'runtime/bin/ffi_test/ffi_test_dynamic_library.cc');
-  destinationFile =
-      path.join(dir.path, path.basename(lib1)).replaceAll('.cc', '.cpp');
-  File(destinationFile).writeAsStringSync(File(lib1).readAsStringSync());
-
-  final lib2 = path.join(sdkRoot, 'runtime/bin/ffi_test/ffi_test_functions.cc');
-  destinationFile =
-      path.join(dir.path, path.basename(lib2)).replaceAll('.cc', '.cpp');
-  File(destinationFile).writeAsStringSync(File(lib2).readAsStringSync());
-}
-
-String cleanDart(String content) {
-  return content.replaceAll('package:expect/expect.dart', 'expect.dart');
-}
-
-Future generateDartTests(
-    String destDir, Set<String> allFiles, List<String> testFiles) async {
-  final dir = await generateCleanDir(destDir);
-
-  final sink = File(path.join(dir.path, 'all.dart')).openWrite();
-  sink.writeln('import "dart:async";');
-  sink.writeln('');
-  for (int i = 0; i < testFiles.length; ++i) {
-    sink.writeln('import "${path.basename(testFiles[i])}" as main$i;');
-  }
-  sink.writeln('');
-  sink.writeln('Future invoke(dynamic fun) async {');
-  sink.writeln('  if (fun is void Function() || fun is Future Function()) {');
-  sink.writeln('    return await fun();');
-  sink.writeln('  } else {');
-  sink.writeln('    return await fun(<String>[]);');
-  sink.writeln('  }');
-  sink.writeln('}');
-  sink.writeln('');
-  sink.writeln('dynamic main() async {');
-  for (int i = 0; i < testFiles.length; ++i) {
-    sink.writeln('  await invoke(main$i.main);');
-  }
-  sink.writeln('}');
-  await sink.close();
-
-  for (final file in allFiles) {
-    File(path.join(dir.path, path.basename(file)))
-        .writeAsStringSync(cleanDart(File(file).readAsStringSync()));
-  }
-
-  File(path.join(dir.path, 'dylib_utils.dart')).writeAsStringSync('''
-import 'dart:ffi' as ffi;
-import 'dart:io' show Platform;
-
-ffi.DynamicLibrary dlopenPlatformSpecific(String name, {String path}) {
-  return Platform.isAndroid
-      ? ffi.DynamicLibrary.open('libffi_tests.so')
-      : ffi.DynamicLibrary.process();
-}
-''');
-}
-
-Stream<String> listTestFiles(
-    String sdkRoot, List<String> filteredTests) async* {
-  await for (final file in Directory(path.join(sdkRoot, 'tests/ffi')).list()) {
-    if (file is File && file.path.endsWith('_test.dart')) {
-      // These tests are VM specific and cannot necessarily be run on Flutter.
-      if (path.basename(file.path).startsWith('vmspecific_')) {
-        filteredTests.add(file.path);
-        continue;
-      }
-      // These tests use special features which are hard to test on Flutter.
-      final contents = file.readAsStringSync();
-      if (contents.contains(RegExp('//# .* compile-time error')) ||
-          contents.contains('DynamicLibrary.process') ||
-          contents.contains('DynamicLibrary.executable')) {
-        filteredTests.add(file.path);
-        continue;
-      }
-      yield file.path;
-    }
-  }
-}
-
-Future<Duration> run(String sdkRoot, String testFile) async {
-  final env = Map<String, String>.from(Platform.environment);
-  env['LD_LIBRARY_PATH'] = path.join(sdkRoot, 'out/ReleaseX64');
-  final sw = Stopwatch()..start();
-  final Process process = await Process.start(
-      Platform.executable, <String>[testFile],
-      environment: env);
-  final timer = Timer(const Duration(seconds: 3), () => process.kill());
-  process.stdout.listen((_) {});
-  process.stderr.listen((_) {});
-  if (await process.exitCode != 0) return null;
-  timer.cancel();
-  return sw.elapsed;
-}
-
-Future<Directory> generateCleanDir(String dirname) async {
-  final directory = Directory(dirname);
-  if (await directory.exists()) {
-    await directory.delete(recursive: true);
-  }
-  await directory.create(recursive: true);
-  return directory;
-}
diff --git a/tests/ffi/regress_37254_test.dart b/tests/ffi/regress_37254_test.dart
index b4fce7c..ce696af 100644
--- a/tests/ffi/regress_37254_test.dart
+++ b/tests/ffi/regress_37254_test.dart
@@ -238,7 +238,6 @@
 }
 
 void main() {
-  // Trigger both the runtime entry and the IL in bytecode.
   for (int i = 0; i < 100; i++) {
     store1();
     store2();
diff --git a/tests/ffi/regress_43016_test.dart b/tests/ffi/regress_43016_test.dart
index 8468fcd..f1489e0 100644
--- a/tests/ffi/regress_43016_test.dart
+++ b/tests/ffi/regress_43016_test.dart
@@ -27,7 +27,6 @@
 final ffiTestFunctions = dlopenPlatformSpecific("ffi_test_functions");
 
 void main() {
-  // Trigger both the runtime entry and the IL in bytecode.
   for (int i = 0; i < 10000; i++) {
     pass_struct(nullptr);
   }
diff --git a/tests/ffi/vmspecific_handle_dynamically_linked_test.dart b/tests/ffi/vmspecific_handle_dynamically_linked_test.dart
index 6422958..2b6e834 100644
--- a/tests/ffi/vmspecific_handle_dynamically_linked_test.dart
+++ b/tests/ffi/vmspecific_handle_dynamically_linked_test.dart
@@ -16,8 +16,8 @@
 }
 
 void doDynamicLinking() {
-  Expect.isTrue(NativeApi.majorVersion == 1);
-  Expect.isTrue(NativeApi.minorVersion >= 1);
+  Expect.isTrue(NativeApi.majorVersion == 2);
+  Expect.isTrue(NativeApi.minorVersion >= 0);
   final initializeApi = testLibrary.lookupFunction<
       IntPtr Function(Pointer<Void>),
       int Function(Pointer<Void>)>("InitDartApiDL");
diff --git a/tests/ffi_2/callback_tests_utils.dart b/tests/ffi_2/callback_tests_utils.dart
index ac5fdcb..e34a52b 100644
--- a/tests/ffi_2/callback_tests_utils.dart
+++ b/tests/ffi_2/callback_tests_utils.dart
@@ -16,19 +16,23 @@
 class CallbackTest {
   final String name;
   final Pointer callback;
-  final bool skip;
+  final void Function() afterCallbackChecks;
 
-  CallbackTest(this.name, this.callback, {bool skipIf: false})
-      : skip = skipIf {}
+  CallbackTest(this.name, this.callback) : afterCallbackChecks = noChecks {}
+  CallbackTest.withCheck(this.name, this.callback, this.afterCallbackChecks) {}
 
   void run() {
-    if (skip) return;
-
     final NativeCallbackTestFn tester = ffiTestFunctions
         .lookupFunction<NativeCallbackTest, NativeCallbackTestFn>("Test$name");
+
     final int testCode = tester(callback);
+
     if (testCode != 0) {
       Expect.fail("Test $name failed.");
     }
+
+    afterCallbackChecks();
   }
 }
+
+void noChecks() {}
diff --git a/tests/ffi_2/dylib_isolates_test.dart b/tests/ffi_2/dylib_isolates_test.dart
index 5eb73ef..f790e12 100644
--- a/tests/ffi_2/dylib_isolates_test.dart
+++ b/tests/ffi_2/dylib_isolates_test.dart
@@ -7,6 +7,7 @@
 // SharedObjects=ffi_test_functions
 
 import 'dart:ffi';
+import 'dart:io';
 import 'dart:isolate';
 
 import "package:expect/expect.dart";
@@ -29,7 +30,9 @@
   final receivePort = ReceivePort();
   Isolate.spawn(secondIsolateMain, receivePort.sendPort);
   await receivePort.first;
-  Expect.equals(42, getGlobalVar());
+  if (!Platform.isIOS /* Static linking causes different behavior. */) {
+    Expect.equals(42, getGlobalVar());
+  }
 }
 
 void secondIsolateMain(SendPort sendPort) {
diff --git a/tests/ffi_2/ffi_2.status b/tests/ffi_2/ffi_2.status
index 37ab3e9..3baf069 100644
--- a/tests/ffi_2/ffi_2.status
+++ b/tests/ffi_2/ffi_2.status
@@ -2,6 +2,11 @@
 # 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.
 
+# TODO(dartbug.com/36730): Implement structs by value.
+function_callbacks_structs_by_value_generated_test: Skip
+function_callbacks_structs_by_value_test: Skip
+function_structs_by_value_generated_test: Skip
+
 [ $builder_tag == msan ]
 vmspecific_handle_test: Skip # https://dartbug.com/42314
 
diff --git a/tests/ffi_2/function_callbacks_structs_by_value_generated_test.dart b/tests/ffi_2/function_callbacks_structs_by_value_generated_test.dart
new file mode 100644
index 0000000..38714fd
--- /dev/null
+++ b/tests/ffi_2/function_callbacks_structs_by_value_generated_test.dart
@@ -0,0 +1,6916 @@
+// Copyright (c) 2020, 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.
+//
+// This file has been automatically generated. Please do not edit it manually.
+//
+// SharedObjects=ffi_test_functions
+// VMOptions=
+// VMOptions=--deterministic --optimization-counter-threshold=10
+// VMOptions=--use-slow-path
+// VMOptions=--use-slow-path --stacktrace-every=100
+
+import 'dart:ffi';
+
+import "package:expect/expect.dart";
+import "package:ffi/ffi.dart";
+
+import 'callback_tests_utils.dart';
+
+// Reuse the struct classes.
+import 'function_structs_by_value_generated_test.dart';
+
+void main() {
+  testCases.forEach((t) {
+    print("==== Running " + t.name);
+    t.run();
+  });
+}
+
+final testCases = [
+  CallbackTest.withCheck(
+      "PassStruct1ByteIntx10",
+      Pointer.fromFunction<PassStruct1ByteIntx10Type>(passStruct1ByteIntx10, 0),
+      passStruct1ByteIntx10AfterCallback),
+  CallbackTest.withCheck(
+      "PassStruct3BytesHomogeneousUint8x10",
+      Pointer.fromFunction<PassStruct3BytesHomogeneousUint8x10Type>(
+          passStruct3BytesHomogeneousUint8x10, 0),
+      passStruct3BytesHomogeneousUint8x10AfterCallback),
+  CallbackTest.withCheck(
+      "PassStruct3BytesInt2ByteAlignedx10",
+      Pointer.fromFunction<PassStruct3BytesInt2ByteAlignedx10Type>(
+          passStruct3BytesInt2ByteAlignedx10, 0),
+      passStruct3BytesInt2ByteAlignedx10AfterCallback),
+  CallbackTest.withCheck(
+      "PassStruct4BytesHomogeneousInt16x10",
+      Pointer.fromFunction<PassStruct4BytesHomogeneousInt16x10Type>(
+          passStruct4BytesHomogeneousInt16x10, 0),
+      passStruct4BytesHomogeneousInt16x10AfterCallback),
+  CallbackTest.withCheck(
+      "PassStruct7BytesHomogeneousUint8x10",
+      Pointer.fromFunction<PassStruct7BytesHomogeneousUint8x10Type>(
+          passStruct7BytesHomogeneousUint8x10, 0),
+      passStruct7BytesHomogeneousUint8x10AfterCallback),
+  CallbackTest.withCheck(
+      "PassStruct7BytesInt4ByteAlignedx10",
+      Pointer.fromFunction<PassStruct7BytesInt4ByteAlignedx10Type>(
+          passStruct7BytesInt4ByteAlignedx10, 0),
+      passStruct7BytesInt4ByteAlignedx10AfterCallback),
+  CallbackTest.withCheck(
+      "PassStruct8BytesIntx10",
+      Pointer.fromFunction<PassStruct8BytesIntx10Type>(
+          passStruct8BytesIntx10, 0),
+      passStruct8BytesIntx10AfterCallback),
+  CallbackTest.withCheck(
+      "PassStruct8BytesHomogeneousFloatx10",
+      Pointer.fromFunction<PassStruct8BytesHomogeneousFloatx10Type>(
+          passStruct8BytesHomogeneousFloatx10, 0.0),
+      passStruct8BytesHomogeneousFloatx10AfterCallback),
+  CallbackTest.withCheck(
+      "PassStruct8BytesMixedx10",
+      Pointer.fromFunction<PassStruct8BytesMixedx10Type>(
+          passStruct8BytesMixedx10, 0.0),
+      passStruct8BytesMixedx10AfterCallback),
+  CallbackTest.withCheck(
+      "PassStruct9BytesHomogeneousUint8x10",
+      Pointer.fromFunction<PassStruct9BytesHomogeneousUint8x10Type>(
+          passStruct9BytesHomogeneousUint8x10, 0),
+      passStruct9BytesHomogeneousUint8x10AfterCallback),
+  CallbackTest.withCheck(
+      "PassStruct9BytesInt4Or8ByteAlignedx10",
+      Pointer.fromFunction<PassStruct9BytesInt4Or8ByteAlignedx10Type>(
+          passStruct9BytesInt4Or8ByteAlignedx10, 0),
+      passStruct9BytesInt4Or8ByteAlignedx10AfterCallback),
+  CallbackTest.withCheck(
+      "PassStruct12BytesHomogeneousFloatx6",
+      Pointer.fromFunction<PassStruct12BytesHomogeneousFloatx6Type>(
+          passStruct12BytesHomogeneousFloatx6, 0.0),
+      passStruct12BytesHomogeneousFloatx6AfterCallback),
+  CallbackTest.withCheck(
+      "PassStruct16BytesHomogeneousFloatx5",
+      Pointer.fromFunction<PassStruct16BytesHomogeneousFloatx5Type>(
+          passStruct16BytesHomogeneousFloatx5, 0.0),
+      passStruct16BytesHomogeneousFloatx5AfterCallback),
+  CallbackTest.withCheck(
+      "PassStruct16BytesMixedx10",
+      Pointer.fromFunction<PassStruct16BytesMixedx10Type>(
+          passStruct16BytesMixedx10, 0.0),
+      passStruct16BytesMixedx10AfterCallback),
+  CallbackTest.withCheck(
+      "PassStruct16BytesMixed2x10",
+      Pointer.fromFunction<PassStruct16BytesMixed2x10Type>(
+          passStruct16BytesMixed2x10, 0.0),
+      passStruct16BytesMixed2x10AfterCallback),
+  CallbackTest.withCheck(
+      "PassStruct17BytesIntx10",
+      Pointer.fromFunction<PassStruct17BytesIntx10Type>(
+          passStruct17BytesIntx10, 0),
+      passStruct17BytesIntx10AfterCallback),
+  CallbackTest.withCheck(
+      "PassStruct19BytesHomogeneousUint8x10",
+      Pointer.fromFunction<PassStruct19BytesHomogeneousUint8x10Type>(
+          passStruct19BytesHomogeneousUint8x10, 0),
+      passStruct19BytesHomogeneousUint8x10AfterCallback),
+  CallbackTest.withCheck(
+      "PassStruct20BytesHomogeneousInt32x10",
+      Pointer.fromFunction<PassStruct20BytesHomogeneousInt32x10Type>(
+          passStruct20BytesHomogeneousInt32x10, 0),
+      passStruct20BytesHomogeneousInt32x10AfterCallback),
+  CallbackTest.withCheck(
+      "PassStruct20BytesHomogeneousFloat",
+      Pointer.fromFunction<PassStruct20BytesHomogeneousFloatType>(
+          passStruct20BytesHomogeneousFloat, 0.0),
+      passStruct20BytesHomogeneousFloatAfterCallback),
+  CallbackTest.withCheck(
+      "PassStruct32BytesHomogeneousDoublex5",
+      Pointer.fromFunction<PassStruct32BytesHomogeneousDoublex5Type>(
+          passStruct32BytesHomogeneousDoublex5, 0.0),
+      passStruct32BytesHomogeneousDoublex5AfterCallback),
+  CallbackTest.withCheck(
+      "PassStruct40BytesHomogeneousDouble",
+      Pointer.fromFunction<PassStruct40BytesHomogeneousDoubleType>(
+          passStruct40BytesHomogeneousDouble, 0.0),
+      passStruct40BytesHomogeneousDoubleAfterCallback),
+  CallbackTest.withCheck(
+      "PassStruct1024BytesHomogeneousUint64",
+      Pointer.fromFunction<PassStruct1024BytesHomogeneousUint64Type>(
+          passStruct1024BytesHomogeneousUint64, 0),
+      passStruct1024BytesHomogeneousUint64AfterCallback),
+  CallbackTest.withCheck(
+      "PassFloatStruct16BytesHomogeneousFloatFloatStruct1",
+      Pointer.fromFunction<
+              PassFloatStruct16BytesHomogeneousFloatFloatStruct1Type>(
+          passFloatStruct16BytesHomogeneousFloatFloatStruct1, 0.0),
+      passFloatStruct16BytesHomogeneousFloatFloatStruct1AfterCallback),
+  CallbackTest.withCheck(
+      "PassFloatStruct32BytesHomogeneousDoubleFloatStruct",
+      Pointer.fromFunction<
+              PassFloatStruct32BytesHomogeneousDoubleFloatStructType>(
+          passFloatStruct32BytesHomogeneousDoubleFloatStruct, 0.0),
+      passFloatStruct32BytesHomogeneousDoubleFloatStructAfterCallback),
+  CallbackTest.withCheck(
+      "PassInt8Struct16BytesMixedInt8Struct16BytesMixedIn",
+      Pointer.fromFunction<
+              PassInt8Struct16BytesMixedInt8Struct16BytesMixedInType>(
+          passInt8Struct16BytesMixedInt8Struct16BytesMixedIn, 0.0),
+      passInt8Struct16BytesMixedInt8Struct16BytesMixedInAfterCallback),
+  CallbackTest.withCheck(
+      "PassDoublex6Struct16BytesMixedx4Int32",
+      Pointer.fromFunction<PassDoublex6Struct16BytesMixedx4Int32Type>(
+          passDoublex6Struct16BytesMixedx4Int32, 0.0),
+      passDoublex6Struct16BytesMixedx4Int32AfterCallback),
+  CallbackTest.withCheck(
+      "PassInt32x4Struct16BytesMixedx4Double",
+      Pointer.fromFunction<PassInt32x4Struct16BytesMixedx4DoubleType>(
+          passInt32x4Struct16BytesMixedx4Double, 0.0),
+      passInt32x4Struct16BytesMixedx4DoubleAfterCallback),
+  CallbackTest.withCheck(
+      "PassStruct40BytesHomogeneousDoubleStruct4BytesHomo",
+      Pointer.fromFunction<
+              PassStruct40BytesHomogeneousDoubleStruct4BytesHomoType>(
+          passStruct40BytesHomogeneousDoubleStruct4BytesHomo, 0.0),
+      passStruct40BytesHomogeneousDoubleStruct4BytesHomoAfterCallback),
+  CallbackTest.withCheck(
+      "PassInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int",
+      Pointer.fromFunction<
+              PassInt32x8Doublex8Int64Int8Struct1ByteIntInt64IntType>(
+          passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int, 0.0),
+      passInt32x8Doublex8Int64Int8Struct1ByteIntInt64IntAfterCallback),
+  CallbackTest.withCheck(
+      "PassStructAlignmentInt16",
+      Pointer.fromFunction<PassStructAlignmentInt16Type>(
+          passStructAlignmentInt16, 0),
+      passStructAlignmentInt16AfterCallback),
+  CallbackTest.withCheck(
+      "PassStructAlignmentInt32",
+      Pointer.fromFunction<PassStructAlignmentInt32Type>(
+          passStructAlignmentInt32, 0),
+      passStructAlignmentInt32AfterCallback),
+  CallbackTest.withCheck(
+      "PassStructAlignmentInt64",
+      Pointer.fromFunction<PassStructAlignmentInt64Type>(
+          passStructAlignmentInt64, 0),
+      passStructAlignmentInt64AfterCallback),
+  CallbackTest.withCheck(
+      "ReturnStruct1ByteInt",
+      Pointer.fromFunction<ReturnStruct1ByteIntType>(returnStruct1ByteInt),
+      returnStruct1ByteIntAfterCallback),
+  CallbackTest.withCheck(
+      "ReturnStruct3BytesHomogeneousUint8",
+      Pointer.fromFunction<ReturnStruct3BytesHomogeneousUint8Type>(
+          returnStruct3BytesHomogeneousUint8),
+      returnStruct3BytesHomogeneousUint8AfterCallback),
+  CallbackTest.withCheck(
+      "ReturnStruct3BytesInt2ByteAligned",
+      Pointer.fromFunction<ReturnStruct3BytesInt2ByteAlignedType>(
+          returnStruct3BytesInt2ByteAligned),
+      returnStruct3BytesInt2ByteAlignedAfterCallback),
+  CallbackTest.withCheck(
+      "ReturnStruct4BytesHomogeneousInt16",
+      Pointer.fromFunction<ReturnStruct4BytesHomogeneousInt16Type>(
+          returnStruct4BytesHomogeneousInt16),
+      returnStruct4BytesHomogeneousInt16AfterCallback),
+  CallbackTest.withCheck(
+      "ReturnStruct7BytesHomogeneousUint8",
+      Pointer.fromFunction<ReturnStruct7BytesHomogeneousUint8Type>(
+          returnStruct7BytesHomogeneousUint8),
+      returnStruct7BytesHomogeneousUint8AfterCallback),
+  CallbackTest.withCheck(
+      "ReturnStruct7BytesInt4ByteAligned",
+      Pointer.fromFunction<ReturnStruct7BytesInt4ByteAlignedType>(
+          returnStruct7BytesInt4ByteAligned),
+      returnStruct7BytesInt4ByteAlignedAfterCallback),
+  CallbackTest.withCheck(
+      "ReturnStruct8BytesInt",
+      Pointer.fromFunction<ReturnStruct8BytesIntType>(returnStruct8BytesInt),
+      returnStruct8BytesIntAfterCallback),
+  CallbackTest.withCheck(
+      "ReturnStruct8BytesHomogeneousFloat",
+      Pointer.fromFunction<ReturnStruct8BytesHomogeneousFloatType>(
+          returnStruct8BytesHomogeneousFloat),
+      returnStruct8BytesHomogeneousFloatAfterCallback),
+  CallbackTest.withCheck(
+      "ReturnStruct8BytesMixed",
+      Pointer.fromFunction<ReturnStruct8BytesMixedType>(
+          returnStruct8BytesMixed),
+      returnStruct8BytesMixedAfterCallback),
+  CallbackTest.withCheck(
+      "ReturnStruct9BytesHomogeneousUint8",
+      Pointer.fromFunction<ReturnStruct9BytesHomogeneousUint8Type>(
+          returnStruct9BytesHomogeneousUint8),
+      returnStruct9BytesHomogeneousUint8AfterCallback),
+  CallbackTest.withCheck(
+      "ReturnStruct9BytesInt4Or8ByteAligned",
+      Pointer.fromFunction<ReturnStruct9BytesInt4Or8ByteAlignedType>(
+          returnStruct9BytesInt4Or8ByteAligned),
+      returnStruct9BytesInt4Or8ByteAlignedAfterCallback),
+  CallbackTest.withCheck(
+      "ReturnStruct12BytesHomogeneousFloat",
+      Pointer.fromFunction<ReturnStruct12BytesHomogeneousFloatType>(
+          returnStruct12BytesHomogeneousFloat),
+      returnStruct12BytesHomogeneousFloatAfterCallback),
+  CallbackTest.withCheck(
+      "ReturnStruct16BytesHomogeneousFloat",
+      Pointer.fromFunction<ReturnStruct16BytesHomogeneousFloatType>(
+          returnStruct16BytesHomogeneousFloat),
+      returnStruct16BytesHomogeneousFloatAfterCallback),
+  CallbackTest.withCheck(
+      "ReturnStruct16BytesMixed",
+      Pointer.fromFunction<ReturnStruct16BytesMixedType>(
+          returnStruct16BytesMixed),
+      returnStruct16BytesMixedAfterCallback),
+  CallbackTest.withCheck(
+      "ReturnStruct16BytesMixed2",
+      Pointer.fromFunction<ReturnStruct16BytesMixed2Type>(
+          returnStruct16BytesMixed2),
+      returnStruct16BytesMixed2AfterCallback),
+  CallbackTest.withCheck(
+      "ReturnStruct17BytesInt",
+      Pointer.fromFunction<ReturnStruct17BytesIntType>(returnStruct17BytesInt),
+      returnStruct17BytesIntAfterCallback),
+  CallbackTest.withCheck(
+      "ReturnStruct19BytesHomogeneousUint8",
+      Pointer.fromFunction<ReturnStruct19BytesHomogeneousUint8Type>(
+          returnStruct19BytesHomogeneousUint8),
+      returnStruct19BytesHomogeneousUint8AfterCallback),
+  CallbackTest.withCheck(
+      "ReturnStruct20BytesHomogeneousInt32",
+      Pointer.fromFunction<ReturnStruct20BytesHomogeneousInt32Type>(
+          returnStruct20BytesHomogeneousInt32),
+      returnStruct20BytesHomogeneousInt32AfterCallback),
+  CallbackTest.withCheck(
+      "ReturnStruct20BytesHomogeneousFloat",
+      Pointer.fromFunction<ReturnStruct20BytesHomogeneousFloatType>(
+          returnStruct20BytesHomogeneousFloat),
+      returnStruct20BytesHomogeneousFloatAfterCallback),
+  CallbackTest.withCheck(
+      "ReturnStruct32BytesHomogeneousDouble",
+      Pointer.fromFunction<ReturnStruct32BytesHomogeneousDoubleType>(
+          returnStruct32BytesHomogeneousDouble),
+      returnStruct32BytesHomogeneousDoubleAfterCallback),
+  CallbackTest.withCheck(
+      "ReturnStruct40BytesHomogeneousDouble",
+      Pointer.fromFunction<ReturnStruct40BytesHomogeneousDoubleType>(
+          returnStruct40BytesHomogeneousDouble),
+      returnStruct40BytesHomogeneousDoubleAfterCallback),
+  CallbackTest.withCheck(
+      "ReturnStruct1024BytesHomogeneousUint64",
+      Pointer.fromFunction<ReturnStruct1024BytesHomogeneousUint64Type>(
+          returnStruct1024BytesHomogeneousUint64),
+      returnStruct1024BytesHomogeneousUint64AfterCallback),
+  CallbackTest.withCheck(
+      "ReturnStructArgumentStruct1ByteInt",
+      Pointer.fromFunction<ReturnStructArgumentStruct1ByteIntType>(
+          returnStructArgumentStruct1ByteInt),
+      returnStructArgumentStruct1ByteIntAfterCallback),
+  CallbackTest.withCheck(
+      "ReturnStructArgumentInt32x8Struct1ByteInt",
+      Pointer.fromFunction<ReturnStructArgumentInt32x8Struct1ByteIntType>(
+          returnStructArgumentInt32x8Struct1ByteInt),
+      returnStructArgumentInt32x8Struct1ByteIntAfterCallback),
+  CallbackTest.withCheck(
+      "ReturnStructArgumentStruct8BytesHomogeneousFloat",
+      Pointer.fromFunction<
+              ReturnStructArgumentStruct8BytesHomogeneousFloatType>(
+          returnStructArgumentStruct8BytesHomogeneousFloat),
+      returnStructArgumentStruct8BytesHomogeneousFloatAfterCallback),
+  CallbackTest.withCheck(
+      "ReturnStructArgumentStruct20BytesHomogeneousInt32",
+      Pointer.fromFunction<
+              ReturnStructArgumentStruct20BytesHomogeneousInt32Type>(
+          returnStructArgumentStruct20BytesHomogeneousInt32),
+      returnStructArgumentStruct20BytesHomogeneousInt32AfterCallback),
+  CallbackTest.withCheck(
+      "ReturnStructArgumentInt32x8Struct20BytesHomogeneou",
+      Pointer.fromFunction<
+              ReturnStructArgumentInt32x8Struct20BytesHomogeneouType>(
+          returnStructArgumentInt32x8Struct20BytesHomogeneou),
+      returnStructArgumentInt32x8Struct20BytesHomogeneouAfterCallback),
+  CallbackTest.withCheck(
+      "ReturnStructAlignmentInt16",
+      Pointer.fromFunction<ReturnStructAlignmentInt16Type>(
+          returnStructAlignmentInt16),
+      returnStructAlignmentInt16AfterCallback),
+  CallbackTest.withCheck(
+      "ReturnStructAlignmentInt32",
+      Pointer.fromFunction<ReturnStructAlignmentInt32Type>(
+          returnStructAlignmentInt32),
+      returnStructAlignmentInt32AfterCallback),
+  CallbackTest.withCheck(
+      "ReturnStructAlignmentInt64",
+      Pointer.fromFunction<ReturnStructAlignmentInt64Type>(
+          returnStructAlignmentInt64),
+      returnStructAlignmentInt64AfterCallback),
+];
+typedef PassStruct1ByteIntx10Type = Int64 Function(
+    Struct1ByteInt,
+    Struct1ByteInt,
+    Struct1ByteInt,
+    Struct1ByteInt,
+    Struct1ByteInt,
+    Struct1ByteInt,
+    Struct1ByteInt,
+    Struct1ByteInt,
+    Struct1ByteInt,
+    Struct1ByteInt);
+
+// Global variables to be able to test inputs after callback returned.
+Struct1ByteInt passStruct1ByteIntx10_a0 = Struct1ByteInt();
+Struct1ByteInt passStruct1ByteIntx10_a1 = Struct1ByteInt();
+Struct1ByteInt passStruct1ByteIntx10_a2 = Struct1ByteInt();
+Struct1ByteInt passStruct1ByteIntx10_a3 = Struct1ByteInt();
+Struct1ByteInt passStruct1ByteIntx10_a4 = Struct1ByteInt();
+Struct1ByteInt passStruct1ByteIntx10_a5 = Struct1ByteInt();
+Struct1ByteInt passStruct1ByteIntx10_a6 = Struct1ByteInt();
+Struct1ByteInt passStruct1ByteIntx10_a7 = Struct1ByteInt();
+Struct1ByteInt passStruct1ByteIntx10_a8 = Struct1ByteInt();
+Struct1ByteInt passStruct1ByteIntx10_a9 = Struct1ByteInt();
+
+// Result variable also global, so we can delete it after the callback.
+int passStruct1ByteIntx10Result = 0;
+
+int passStruct1ByteIntx10CalculateResult() {
+  int result = 0;
+
+  result += passStruct1ByteIntx10_a0.a0;
+  result += passStruct1ByteIntx10_a1.a0;
+  result += passStruct1ByteIntx10_a2.a0;
+  result += passStruct1ByteIntx10_a3.a0;
+  result += passStruct1ByteIntx10_a4.a0;
+  result += passStruct1ByteIntx10_a5.a0;
+  result += passStruct1ByteIntx10_a6.a0;
+  result += passStruct1ByteIntx10_a7.a0;
+  result += passStruct1ByteIntx10_a8.a0;
+  result += passStruct1ByteIntx10_a9.a0;
+
+  passStruct1ByteIntx10Result = result;
+
+  return result;
+}
+
+/// Smallest struct with data.
+/// 10 struct arguments will exhaust available registers.
+int passStruct1ByteIntx10(
+    Struct1ByteInt a0,
+    Struct1ByteInt a1,
+    Struct1ByteInt a2,
+    Struct1ByteInt a3,
+    Struct1ByteInt a4,
+    Struct1ByteInt a5,
+    Struct1ByteInt a6,
+    Struct1ByteInt a7,
+    Struct1ByteInt a8,
+    Struct1ByteInt a9) {
+  print(
+      "passStruct1ByteIntx10(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5}, ${a6}, ${a7}, ${a8}, ${a9})");
+
+  // In legacy mode, possibly return null.
+  if (a0.a0 == 84) {
+    print("returning null!");
+    return null;
+  }
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0.a0 == 42 || a0.a0 == 84) {
+    print("throwing!");
+    throw Exception("PassStruct1ByteIntx10 throwing on purpuse!");
+  }
+
+  passStruct1ByteIntx10_a0 = a0;
+  passStruct1ByteIntx10_a1 = a1;
+  passStruct1ByteIntx10_a2 = a2;
+  passStruct1ByteIntx10_a3 = a3;
+  passStruct1ByteIntx10_a4 = a4;
+  passStruct1ByteIntx10_a5 = a5;
+  passStruct1ByteIntx10_a6 = a6;
+  passStruct1ByteIntx10_a7 = a7;
+  passStruct1ByteIntx10_a8 = a8;
+  passStruct1ByteIntx10_a9 = a9;
+
+  final result = passStruct1ByteIntx10CalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void passStruct1ByteIntx10AfterCallback() {
+  final result = passStruct1ByteIntx10CalculateResult();
+
+  print("after callback result = $result");
+
+  Expect.equals(5, result);
+}
+
+typedef PassStruct3BytesHomogeneousUint8x10Type = Int64 Function(
+    Struct3BytesHomogeneousUint8,
+    Struct3BytesHomogeneousUint8,
+    Struct3BytesHomogeneousUint8,
+    Struct3BytesHomogeneousUint8,
+    Struct3BytesHomogeneousUint8,
+    Struct3BytesHomogeneousUint8,
+    Struct3BytesHomogeneousUint8,
+    Struct3BytesHomogeneousUint8,
+    Struct3BytesHomogeneousUint8,
+    Struct3BytesHomogeneousUint8);
+
+// Global variables to be able to test inputs after callback returned.
+Struct3BytesHomogeneousUint8 passStruct3BytesHomogeneousUint8x10_a0 =
+    Struct3BytesHomogeneousUint8();
+Struct3BytesHomogeneousUint8 passStruct3BytesHomogeneousUint8x10_a1 =
+    Struct3BytesHomogeneousUint8();
+Struct3BytesHomogeneousUint8 passStruct3BytesHomogeneousUint8x10_a2 =
+    Struct3BytesHomogeneousUint8();
+Struct3BytesHomogeneousUint8 passStruct3BytesHomogeneousUint8x10_a3 =
+    Struct3BytesHomogeneousUint8();
+Struct3BytesHomogeneousUint8 passStruct3BytesHomogeneousUint8x10_a4 =
+    Struct3BytesHomogeneousUint8();
+Struct3BytesHomogeneousUint8 passStruct3BytesHomogeneousUint8x10_a5 =
+    Struct3BytesHomogeneousUint8();
+Struct3BytesHomogeneousUint8 passStruct3BytesHomogeneousUint8x10_a6 =
+    Struct3BytesHomogeneousUint8();
+Struct3BytesHomogeneousUint8 passStruct3BytesHomogeneousUint8x10_a7 =
+    Struct3BytesHomogeneousUint8();
+Struct3BytesHomogeneousUint8 passStruct3BytesHomogeneousUint8x10_a8 =
+    Struct3BytesHomogeneousUint8();
+Struct3BytesHomogeneousUint8 passStruct3BytesHomogeneousUint8x10_a9 =
+    Struct3BytesHomogeneousUint8();
+
+// Result variable also global, so we can delete it after the callback.
+int passStruct3BytesHomogeneousUint8x10Result = 0;
+
+int passStruct3BytesHomogeneousUint8x10CalculateResult() {
+  int result = 0;
+
+  result += passStruct3BytesHomogeneousUint8x10_a0.a0;
+  result += passStruct3BytesHomogeneousUint8x10_a0.a1;
+  result += passStruct3BytesHomogeneousUint8x10_a0.a2;
+  result += passStruct3BytesHomogeneousUint8x10_a1.a0;
+  result += passStruct3BytesHomogeneousUint8x10_a1.a1;
+  result += passStruct3BytesHomogeneousUint8x10_a1.a2;
+  result += passStruct3BytesHomogeneousUint8x10_a2.a0;
+  result += passStruct3BytesHomogeneousUint8x10_a2.a1;
+  result += passStruct3BytesHomogeneousUint8x10_a2.a2;
+  result += passStruct3BytesHomogeneousUint8x10_a3.a0;
+  result += passStruct3BytesHomogeneousUint8x10_a3.a1;
+  result += passStruct3BytesHomogeneousUint8x10_a3.a2;
+  result += passStruct3BytesHomogeneousUint8x10_a4.a0;
+  result += passStruct3BytesHomogeneousUint8x10_a4.a1;
+  result += passStruct3BytesHomogeneousUint8x10_a4.a2;
+  result += passStruct3BytesHomogeneousUint8x10_a5.a0;
+  result += passStruct3BytesHomogeneousUint8x10_a5.a1;
+  result += passStruct3BytesHomogeneousUint8x10_a5.a2;
+  result += passStruct3BytesHomogeneousUint8x10_a6.a0;
+  result += passStruct3BytesHomogeneousUint8x10_a6.a1;
+  result += passStruct3BytesHomogeneousUint8x10_a6.a2;
+  result += passStruct3BytesHomogeneousUint8x10_a7.a0;
+  result += passStruct3BytesHomogeneousUint8x10_a7.a1;
+  result += passStruct3BytesHomogeneousUint8x10_a7.a2;
+  result += passStruct3BytesHomogeneousUint8x10_a8.a0;
+  result += passStruct3BytesHomogeneousUint8x10_a8.a1;
+  result += passStruct3BytesHomogeneousUint8x10_a8.a2;
+  result += passStruct3BytesHomogeneousUint8x10_a9.a0;
+  result += passStruct3BytesHomogeneousUint8x10_a9.a1;
+  result += passStruct3BytesHomogeneousUint8x10_a9.a2;
+
+  passStruct3BytesHomogeneousUint8x10Result = result;
+
+  return result;
+}
+
+/// Not a multiple of word size, not a power of two.
+/// 10 struct arguments will exhaust available registers.
+int passStruct3BytesHomogeneousUint8x10(
+    Struct3BytesHomogeneousUint8 a0,
+    Struct3BytesHomogeneousUint8 a1,
+    Struct3BytesHomogeneousUint8 a2,
+    Struct3BytesHomogeneousUint8 a3,
+    Struct3BytesHomogeneousUint8 a4,
+    Struct3BytesHomogeneousUint8 a5,
+    Struct3BytesHomogeneousUint8 a6,
+    Struct3BytesHomogeneousUint8 a7,
+    Struct3BytesHomogeneousUint8 a8,
+    Struct3BytesHomogeneousUint8 a9) {
+  print(
+      "passStruct3BytesHomogeneousUint8x10(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5}, ${a6}, ${a7}, ${a8}, ${a9})");
+
+  // In legacy mode, possibly return null.
+  if (a0.a0 == 84) {
+    print("returning null!");
+    return null;
+  }
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0.a0 == 42 || a0.a0 == 84) {
+    print("throwing!");
+    throw Exception("PassStruct3BytesHomogeneousUint8x10 throwing on purpuse!");
+  }
+
+  passStruct3BytesHomogeneousUint8x10_a0 = a0;
+  passStruct3BytesHomogeneousUint8x10_a1 = a1;
+  passStruct3BytesHomogeneousUint8x10_a2 = a2;
+  passStruct3BytesHomogeneousUint8x10_a3 = a3;
+  passStruct3BytesHomogeneousUint8x10_a4 = a4;
+  passStruct3BytesHomogeneousUint8x10_a5 = a5;
+  passStruct3BytesHomogeneousUint8x10_a6 = a6;
+  passStruct3BytesHomogeneousUint8x10_a7 = a7;
+  passStruct3BytesHomogeneousUint8x10_a8 = a8;
+  passStruct3BytesHomogeneousUint8x10_a9 = a9;
+
+  final result = passStruct3BytesHomogeneousUint8x10CalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void passStruct3BytesHomogeneousUint8x10AfterCallback() {
+  final result = passStruct3BytesHomogeneousUint8x10CalculateResult();
+
+  print("after callback result = $result");
+
+  Expect.equals(465, result);
+}
+
+typedef PassStruct3BytesInt2ByteAlignedx10Type = Int64 Function(
+    Struct3BytesInt2ByteAligned,
+    Struct3BytesInt2ByteAligned,
+    Struct3BytesInt2ByteAligned,
+    Struct3BytesInt2ByteAligned,
+    Struct3BytesInt2ByteAligned,
+    Struct3BytesInt2ByteAligned,
+    Struct3BytesInt2ByteAligned,
+    Struct3BytesInt2ByteAligned,
+    Struct3BytesInt2ByteAligned,
+    Struct3BytesInt2ByteAligned);
+
+// Global variables to be able to test inputs after callback returned.
+Struct3BytesInt2ByteAligned passStruct3BytesInt2ByteAlignedx10_a0 =
+    Struct3BytesInt2ByteAligned();
+Struct3BytesInt2ByteAligned passStruct3BytesInt2ByteAlignedx10_a1 =
+    Struct3BytesInt2ByteAligned();
+Struct3BytesInt2ByteAligned passStruct3BytesInt2ByteAlignedx10_a2 =
+    Struct3BytesInt2ByteAligned();
+Struct3BytesInt2ByteAligned passStruct3BytesInt2ByteAlignedx10_a3 =
+    Struct3BytesInt2ByteAligned();
+Struct3BytesInt2ByteAligned passStruct3BytesInt2ByteAlignedx10_a4 =
+    Struct3BytesInt2ByteAligned();
+Struct3BytesInt2ByteAligned passStruct3BytesInt2ByteAlignedx10_a5 =
+    Struct3BytesInt2ByteAligned();
+Struct3BytesInt2ByteAligned passStruct3BytesInt2ByteAlignedx10_a6 =
+    Struct3BytesInt2ByteAligned();
+Struct3BytesInt2ByteAligned passStruct3BytesInt2ByteAlignedx10_a7 =
+    Struct3BytesInt2ByteAligned();
+Struct3BytesInt2ByteAligned passStruct3BytesInt2ByteAlignedx10_a8 =
+    Struct3BytesInt2ByteAligned();
+Struct3BytesInt2ByteAligned passStruct3BytesInt2ByteAlignedx10_a9 =
+    Struct3BytesInt2ByteAligned();
+
+// Result variable also global, so we can delete it after the callback.
+int passStruct3BytesInt2ByteAlignedx10Result = 0;
+
+int passStruct3BytesInt2ByteAlignedx10CalculateResult() {
+  int result = 0;
+
+  result += passStruct3BytesInt2ByteAlignedx10_a0.a0;
+  result += passStruct3BytesInt2ByteAlignedx10_a0.a1;
+  result += passStruct3BytesInt2ByteAlignedx10_a1.a0;
+  result += passStruct3BytesInt2ByteAlignedx10_a1.a1;
+  result += passStruct3BytesInt2ByteAlignedx10_a2.a0;
+  result += passStruct3BytesInt2ByteAlignedx10_a2.a1;
+  result += passStruct3BytesInt2ByteAlignedx10_a3.a0;
+  result += passStruct3BytesInt2ByteAlignedx10_a3.a1;
+  result += passStruct3BytesInt2ByteAlignedx10_a4.a0;
+  result += passStruct3BytesInt2ByteAlignedx10_a4.a1;
+  result += passStruct3BytesInt2ByteAlignedx10_a5.a0;
+  result += passStruct3BytesInt2ByteAlignedx10_a5.a1;
+  result += passStruct3BytesInt2ByteAlignedx10_a6.a0;
+  result += passStruct3BytesInt2ByteAlignedx10_a6.a1;
+  result += passStruct3BytesInt2ByteAlignedx10_a7.a0;
+  result += passStruct3BytesInt2ByteAlignedx10_a7.a1;
+  result += passStruct3BytesInt2ByteAlignedx10_a8.a0;
+  result += passStruct3BytesInt2ByteAlignedx10_a8.a1;
+  result += passStruct3BytesInt2ByteAlignedx10_a9.a0;
+  result += passStruct3BytesInt2ByteAlignedx10_a9.a1;
+
+  passStruct3BytesInt2ByteAlignedx10Result = result;
+
+  return result;
+}
+
+/// Not a multiple of word size, not a power of two.
+/// With alignment rules taken into account size is 4 bytes.
+/// 10 struct arguments will exhaust available registers.
+int passStruct3BytesInt2ByteAlignedx10(
+    Struct3BytesInt2ByteAligned a0,
+    Struct3BytesInt2ByteAligned a1,
+    Struct3BytesInt2ByteAligned a2,
+    Struct3BytesInt2ByteAligned a3,
+    Struct3BytesInt2ByteAligned a4,
+    Struct3BytesInt2ByteAligned a5,
+    Struct3BytesInt2ByteAligned a6,
+    Struct3BytesInt2ByteAligned a7,
+    Struct3BytesInt2ByteAligned a8,
+    Struct3BytesInt2ByteAligned a9) {
+  print(
+      "passStruct3BytesInt2ByteAlignedx10(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5}, ${a6}, ${a7}, ${a8}, ${a9})");
+
+  // In legacy mode, possibly return null.
+  if (a0.a0 == 84) {
+    print("returning null!");
+    return null;
+  }
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0.a0 == 42 || a0.a0 == 84) {
+    print("throwing!");
+    throw Exception("PassStruct3BytesInt2ByteAlignedx10 throwing on purpuse!");
+  }
+
+  passStruct3BytesInt2ByteAlignedx10_a0 = a0;
+  passStruct3BytesInt2ByteAlignedx10_a1 = a1;
+  passStruct3BytesInt2ByteAlignedx10_a2 = a2;
+  passStruct3BytesInt2ByteAlignedx10_a3 = a3;
+  passStruct3BytesInt2ByteAlignedx10_a4 = a4;
+  passStruct3BytesInt2ByteAlignedx10_a5 = a5;
+  passStruct3BytesInt2ByteAlignedx10_a6 = a6;
+  passStruct3BytesInt2ByteAlignedx10_a7 = a7;
+  passStruct3BytesInt2ByteAlignedx10_a8 = a8;
+  passStruct3BytesInt2ByteAlignedx10_a9 = a9;
+
+  final result = passStruct3BytesInt2ByteAlignedx10CalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void passStruct3BytesInt2ByteAlignedx10AfterCallback() {
+  final result = passStruct3BytesInt2ByteAlignedx10CalculateResult();
+
+  print("after callback result = $result");
+
+  Expect.equals(10, result);
+}
+
+typedef PassStruct4BytesHomogeneousInt16x10Type = Int64 Function(
+    Struct4BytesHomogeneousInt16,
+    Struct4BytesHomogeneousInt16,
+    Struct4BytesHomogeneousInt16,
+    Struct4BytesHomogeneousInt16,
+    Struct4BytesHomogeneousInt16,
+    Struct4BytesHomogeneousInt16,
+    Struct4BytesHomogeneousInt16,
+    Struct4BytesHomogeneousInt16,
+    Struct4BytesHomogeneousInt16,
+    Struct4BytesHomogeneousInt16);
+
+// Global variables to be able to test inputs after callback returned.
+Struct4BytesHomogeneousInt16 passStruct4BytesHomogeneousInt16x10_a0 =
+    Struct4BytesHomogeneousInt16();
+Struct4BytesHomogeneousInt16 passStruct4BytesHomogeneousInt16x10_a1 =
+    Struct4BytesHomogeneousInt16();
+Struct4BytesHomogeneousInt16 passStruct4BytesHomogeneousInt16x10_a2 =
+    Struct4BytesHomogeneousInt16();
+Struct4BytesHomogeneousInt16 passStruct4BytesHomogeneousInt16x10_a3 =
+    Struct4BytesHomogeneousInt16();
+Struct4BytesHomogeneousInt16 passStruct4BytesHomogeneousInt16x10_a4 =
+    Struct4BytesHomogeneousInt16();
+Struct4BytesHomogeneousInt16 passStruct4BytesHomogeneousInt16x10_a5 =
+    Struct4BytesHomogeneousInt16();
+Struct4BytesHomogeneousInt16 passStruct4BytesHomogeneousInt16x10_a6 =
+    Struct4BytesHomogeneousInt16();
+Struct4BytesHomogeneousInt16 passStruct4BytesHomogeneousInt16x10_a7 =
+    Struct4BytesHomogeneousInt16();
+Struct4BytesHomogeneousInt16 passStruct4BytesHomogeneousInt16x10_a8 =
+    Struct4BytesHomogeneousInt16();
+Struct4BytesHomogeneousInt16 passStruct4BytesHomogeneousInt16x10_a9 =
+    Struct4BytesHomogeneousInt16();
+
+// Result variable also global, so we can delete it after the callback.
+int passStruct4BytesHomogeneousInt16x10Result = 0;
+
+int passStruct4BytesHomogeneousInt16x10CalculateResult() {
+  int result = 0;
+
+  result += passStruct4BytesHomogeneousInt16x10_a0.a0;
+  result += passStruct4BytesHomogeneousInt16x10_a0.a1;
+  result += passStruct4BytesHomogeneousInt16x10_a1.a0;
+  result += passStruct4BytesHomogeneousInt16x10_a1.a1;
+  result += passStruct4BytesHomogeneousInt16x10_a2.a0;
+  result += passStruct4BytesHomogeneousInt16x10_a2.a1;
+  result += passStruct4BytesHomogeneousInt16x10_a3.a0;
+  result += passStruct4BytesHomogeneousInt16x10_a3.a1;
+  result += passStruct4BytesHomogeneousInt16x10_a4.a0;
+  result += passStruct4BytesHomogeneousInt16x10_a4.a1;
+  result += passStruct4BytesHomogeneousInt16x10_a5.a0;
+  result += passStruct4BytesHomogeneousInt16x10_a5.a1;
+  result += passStruct4BytesHomogeneousInt16x10_a6.a0;
+  result += passStruct4BytesHomogeneousInt16x10_a6.a1;
+  result += passStruct4BytesHomogeneousInt16x10_a7.a0;
+  result += passStruct4BytesHomogeneousInt16x10_a7.a1;
+  result += passStruct4BytesHomogeneousInt16x10_a8.a0;
+  result += passStruct4BytesHomogeneousInt16x10_a8.a1;
+  result += passStruct4BytesHomogeneousInt16x10_a9.a0;
+  result += passStruct4BytesHomogeneousInt16x10_a9.a1;
+
+  passStruct4BytesHomogeneousInt16x10Result = result;
+
+  return result;
+}
+
+/// Exactly word size on 32-bit architectures.
+/// 10 struct arguments will exhaust available registers.
+int passStruct4BytesHomogeneousInt16x10(
+    Struct4BytesHomogeneousInt16 a0,
+    Struct4BytesHomogeneousInt16 a1,
+    Struct4BytesHomogeneousInt16 a2,
+    Struct4BytesHomogeneousInt16 a3,
+    Struct4BytesHomogeneousInt16 a4,
+    Struct4BytesHomogeneousInt16 a5,
+    Struct4BytesHomogeneousInt16 a6,
+    Struct4BytesHomogeneousInt16 a7,
+    Struct4BytesHomogeneousInt16 a8,
+    Struct4BytesHomogeneousInt16 a9) {
+  print(
+      "passStruct4BytesHomogeneousInt16x10(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5}, ${a6}, ${a7}, ${a8}, ${a9})");
+
+  // In legacy mode, possibly return null.
+  if (a0.a0 == 84) {
+    print("returning null!");
+    return null;
+  }
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0.a0 == 42 || a0.a0 == 84) {
+    print("throwing!");
+    throw Exception("PassStruct4BytesHomogeneousInt16x10 throwing on purpuse!");
+  }
+
+  passStruct4BytesHomogeneousInt16x10_a0 = a0;
+  passStruct4BytesHomogeneousInt16x10_a1 = a1;
+  passStruct4BytesHomogeneousInt16x10_a2 = a2;
+  passStruct4BytesHomogeneousInt16x10_a3 = a3;
+  passStruct4BytesHomogeneousInt16x10_a4 = a4;
+  passStruct4BytesHomogeneousInt16x10_a5 = a5;
+  passStruct4BytesHomogeneousInt16x10_a6 = a6;
+  passStruct4BytesHomogeneousInt16x10_a7 = a7;
+  passStruct4BytesHomogeneousInt16x10_a8 = a8;
+  passStruct4BytesHomogeneousInt16x10_a9 = a9;
+
+  final result = passStruct4BytesHomogeneousInt16x10CalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void passStruct4BytesHomogeneousInt16x10AfterCallback() {
+  final result = passStruct4BytesHomogeneousInt16x10CalculateResult();
+
+  print("after callback result = $result");
+
+  Expect.equals(10, result);
+}
+
+typedef PassStruct7BytesHomogeneousUint8x10Type = Int64 Function(
+    Struct7BytesHomogeneousUint8,
+    Struct7BytesHomogeneousUint8,
+    Struct7BytesHomogeneousUint8,
+    Struct7BytesHomogeneousUint8,
+    Struct7BytesHomogeneousUint8,
+    Struct7BytesHomogeneousUint8,
+    Struct7BytesHomogeneousUint8,
+    Struct7BytesHomogeneousUint8,
+    Struct7BytesHomogeneousUint8,
+    Struct7BytesHomogeneousUint8);
+
+// Global variables to be able to test inputs after callback returned.
+Struct7BytesHomogeneousUint8 passStruct7BytesHomogeneousUint8x10_a0 =
+    Struct7BytesHomogeneousUint8();
+Struct7BytesHomogeneousUint8 passStruct7BytesHomogeneousUint8x10_a1 =
+    Struct7BytesHomogeneousUint8();
+Struct7BytesHomogeneousUint8 passStruct7BytesHomogeneousUint8x10_a2 =
+    Struct7BytesHomogeneousUint8();
+Struct7BytesHomogeneousUint8 passStruct7BytesHomogeneousUint8x10_a3 =
+    Struct7BytesHomogeneousUint8();
+Struct7BytesHomogeneousUint8 passStruct7BytesHomogeneousUint8x10_a4 =
+    Struct7BytesHomogeneousUint8();
+Struct7BytesHomogeneousUint8 passStruct7BytesHomogeneousUint8x10_a5 =
+    Struct7BytesHomogeneousUint8();
+Struct7BytesHomogeneousUint8 passStruct7BytesHomogeneousUint8x10_a6 =
+    Struct7BytesHomogeneousUint8();
+Struct7BytesHomogeneousUint8 passStruct7BytesHomogeneousUint8x10_a7 =
+    Struct7BytesHomogeneousUint8();
+Struct7BytesHomogeneousUint8 passStruct7BytesHomogeneousUint8x10_a8 =
+    Struct7BytesHomogeneousUint8();
+Struct7BytesHomogeneousUint8 passStruct7BytesHomogeneousUint8x10_a9 =
+    Struct7BytesHomogeneousUint8();
+
+// Result variable also global, so we can delete it after the callback.
+int passStruct7BytesHomogeneousUint8x10Result = 0;
+
+int passStruct7BytesHomogeneousUint8x10CalculateResult() {
+  int result = 0;
+
+  result += passStruct7BytesHomogeneousUint8x10_a0.a0;
+  result += passStruct7BytesHomogeneousUint8x10_a0.a1;
+  result += passStruct7BytesHomogeneousUint8x10_a0.a2;
+  result += passStruct7BytesHomogeneousUint8x10_a0.a3;
+  result += passStruct7BytesHomogeneousUint8x10_a0.a4;
+  result += passStruct7BytesHomogeneousUint8x10_a0.a5;
+  result += passStruct7BytesHomogeneousUint8x10_a0.a6;
+  result += passStruct7BytesHomogeneousUint8x10_a1.a0;
+  result += passStruct7BytesHomogeneousUint8x10_a1.a1;
+  result += passStruct7BytesHomogeneousUint8x10_a1.a2;
+  result += passStruct7BytesHomogeneousUint8x10_a1.a3;
+  result += passStruct7BytesHomogeneousUint8x10_a1.a4;
+  result += passStruct7BytesHomogeneousUint8x10_a1.a5;
+  result += passStruct7BytesHomogeneousUint8x10_a1.a6;
+  result += passStruct7BytesHomogeneousUint8x10_a2.a0;
+  result += passStruct7BytesHomogeneousUint8x10_a2.a1;
+  result += passStruct7BytesHomogeneousUint8x10_a2.a2;
+  result += passStruct7BytesHomogeneousUint8x10_a2.a3;
+  result += passStruct7BytesHomogeneousUint8x10_a2.a4;
+  result += passStruct7BytesHomogeneousUint8x10_a2.a5;
+  result += passStruct7BytesHomogeneousUint8x10_a2.a6;
+  result += passStruct7BytesHomogeneousUint8x10_a3.a0;
+  result += passStruct7BytesHomogeneousUint8x10_a3.a1;
+  result += passStruct7BytesHomogeneousUint8x10_a3.a2;
+  result += passStruct7BytesHomogeneousUint8x10_a3.a3;
+  result += passStruct7BytesHomogeneousUint8x10_a3.a4;
+  result += passStruct7BytesHomogeneousUint8x10_a3.a5;
+  result += passStruct7BytesHomogeneousUint8x10_a3.a6;
+  result += passStruct7BytesHomogeneousUint8x10_a4.a0;
+  result += passStruct7BytesHomogeneousUint8x10_a4.a1;
+  result += passStruct7BytesHomogeneousUint8x10_a4.a2;
+  result += passStruct7BytesHomogeneousUint8x10_a4.a3;
+  result += passStruct7BytesHomogeneousUint8x10_a4.a4;
+  result += passStruct7BytesHomogeneousUint8x10_a4.a5;
+  result += passStruct7BytesHomogeneousUint8x10_a4.a6;
+  result += passStruct7BytesHomogeneousUint8x10_a5.a0;
+  result += passStruct7BytesHomogeneousUint8x10_a5.a1;
+  result += passStruct7BytesHomogeneousUint8x10_a5.a2;
+  result += passStruct7BytesHomogeneousUint8x10_a5.a3;
+  result += passStruct7BytesHomogeneousUint8x10_a5.a4;
+  result += passStruct7BytesHomogeneousUint8x10_a5.a5;
+  result += passStruct7BytesHomogeneousUint8x10_a5.a6;
+  result += passStruct7BytesHomogeneousUint8x10_a6.a0;
+  result += passStruct7BytesHomogeneousUint8x10_a6.a1;
+  result += passStruct7BytesHomogeneousUint8x10_a6.a2;
+  result += passStruct7BytesHomogeneousUint8x10_a6.a3;
+  result += passStruct7BytesHomogeneousUint8x10_a6.a4;
+  result += passStruct7BytesHomogeneousUint8x10_a6.a5;
+  result += passStruct7BytesHomogeneousUint8x10_a6.a6;
+  result += passStruct7BytesHomogeneousUint8x10_a7.a0;
+  result += passStruct7BytesHomogeneousUint8x10_a7.a1;
+  result += passStruct7BytesHomogeneousUint8x10_a7.a2;
+  result += passStruct7BytesHomogeneousUint8x10_a7.a3;
+  result += passStruct7BytesHomogeneousUint8x10_a7.a4;
+  result += passStruct7BytesHomogeneousUint8x10_a7.a5;
+  result += passStruct7BytesHomogeneousUint8x10_a7.a6;
+  result += passStruct7BytesHomogeneousUint8x10_a8.a0;
+  result += passStruct7BytesHomogeneousUint8x10_a8.a1;
+  result += passStruct7BytesHomogeneousUint8x10_a8.a2;
+  result += passStruct7BytesHomogeneousUint8x10_a8.a3;
+  result += passStruct7BytesHomogeneousUint8x10_a8.a4;
+  result += passStruct7BytesHomogeneousUint8x10_a8.a5;
+  result += passStruct7BytesHomogeneousUint8x10_a8.a6;
+  result += passStruct7BytesHomogeneousUint8x10_a9.a0;
+  result += passStruct7BytesHomogeneousUint8x10_a9.a1;
+  result += passStruct7BytesHomogeneousUint8x10_a9.a2;
+  result += passStruct7BytesHomogeneousUint8x10_a9.a3;
+  result += passStruct7BytesHomogeneousUint8x10_a9.a4;
+  result += passStruct7BytesHomogeneousUint8x10_a9.a5;
+  result += passStruct7BytesHomogeneousUint8x10_a9.a6;
+
+  passStruct7BytesHomogeneousUint8x10Result = result;
+
+  return result;
+}
+
+/// Sub word size on 64 bit architectures.
+/// 10 struct arguments will exhaust available registers.
+int passStruct7BytesHomogeneousUint8x10(
+    Struct7BytesHomogeneousUint8 a0,
+    Struct7BytesHomogeneousUint8 a1,
+    Struct7BytesHomogeneousUint8 a2,
+    Struct7BytesHomogeneousUint8 a3,
+    Struct7BytesHomogeneousUint8 a4,
+    Struct7BytesHomogeneousUint8 a5,
+    Struct7BytesHomogeneousUint8 a6,
+    Struct7BytesHomogeneousUint8 a7,
+    Struct7BytesHomogeneousUint8 a8,
+    Struct7BytesHomogeneousUint8 a9) {
+  print(
+      "passStruct7BytesHomogeneousUint8x10(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5}, ${a6}, ${a7}, ${a8}, ${a9})");
+
+  // In legacy mode, possibly return null.
+  if (a0.a0 == 84) {
+    print("returning null!");
+    return null;
+  }
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0.a0 == 42 || a0.a0 == 84) {
+    print("throwing!");
+    throw Exception("PassStruct7BytesHomogeneousUint8x10 throwing on purpuse!");
+  }
+
+  passStruct7BytesHomogeneousUint8x10_a0 = a0;
+  passStruct7BytesHomogeneousUint8x10_a1 = a1;
+  passStruct7BytesHomogeneousUint8x10_a2 = a2;
+  passStruct7BytesHomogeneousUint8x10_a3 = a3;
+  passStruct7BytesHomogeneousUint8x10_a4 = a4;
+  passStruct7BytesHomogeneousUint8x10_a5 = a5;
+  passStruct7BytesHomogeneousUint8x10_a6 = a6;
+  passStruct7BytesHomogeneousUint8x10_a7 = a7;
+  passStruct7BytesHomogeneousUint8x10_a8 = a8;
+  passStruct7BytesHomogeneousUint8x10_a9 = a9;
+
+  final result = passStruct7BytesHomogeneousUint8x10CalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void passStruct7BytesHomogeneousUint8x10AfterCallback() {
+  final result = passStruct7BytesHomogeneousUint8x10CalculateResult();
+
+  print("after callback result = $result");
+
+  Expect.equals(2485, result);
+}
+
+typedef PassStruct7BytesInt4ByteAlignedx10Type = Int64 Function(
+    Struct7BytesInt4ByteAligned,
+    Struct7BytesInt4ByteAligned,
+    Struct7BytesInt4ByteAligned,
+    Struct7BytesInt4ByteAligned,
+    Struct7BytesInt4ByteAligned,
+    Struct7BytesInt4ByteAligned,
+    Struct7BytesInt4ByteAligned,
+    Struct7BytesInt4ByteAligned,
+    Struct7BytesInt4ByteAligned,
+    Struct7BytesInt4ByteAligned);
+
+// Global variables to be able to test inputs after callback returned.
+Struct7BytesInt4ByteAligned passStruct7BytesInt4ByteAlignedx10_a0 =
+    Struct7BytesInt4ByteAligned();
+Struct7BytesInt4ByteAligned passStruct7BytesInt4ByteAlignedx10_a1 =
+    Struct7BytesInt4ByteAligned();
+Struct7BytesInt4ByteAligned passStruct7BytesInt4ByteAlignedx10_a2 =
+    Struct7BytesInt4ByteAligned();
+Struct7BytesInt4ByteAligned passStruct7BytesInt4ByteAlignedx10_a3 =
+    Struct7BytesInt4ByteAligned();
+Struct7BytesInt4ByteAligned passStruct7BytesInt4ByteAlignedx10_a4 =
+    Struct7BytesInt4ByteAligned();
+Struct7BytesInt4ByteAligned passStruct7BytesInt4ByteAlignedx10_a5 =
+    Struct7BytesInt4ByteAligned();
+Struct7BytesInt4ByteAligned passStruct7BytesInt4ByteAlignedx10_a6 =
+    Struct7BytesInt4ByteAligned();
+Struct7BytesInt4ByteAligned passStruct7BytesInt4ByteAlignedx10_a7 =
+    Struct7BytesInt4ByteAligned();
+Struct7BytesInt4ByteAligned passStruct7BytesInt4ByteAlignedx10_a8 =
+    Struct7BytesInt4ByteAligned();
+Struct7BytesInt4ByteAligned passStruct7BytesInt4ByteAlignedx10_a9 =
+    Struct7BytesInt4ByteAligned();
+
+// Result variable also global, so we can delete it after the callback.
+int passStruct7BytesInt4ByteAlignedx10Result = 0;
+
+int passStruct7BytesInt4ByteAlignedx10CalculateResult() {
+  int result = 0;
+
+  result += passStruct7BytesInt4ByteAlignedx10_a0.a0;
+  result += passStruct7BytesInt4ByteAlignedx10_a0.a1;
+  result += passStruct7BytesInt4ByteAlignedx10_a0.a2;
+  result += passStruct7BytesInt4ByteAlignedx10_a1.a0;
+  result += passStruct7BytesInt4ByteAlignedx10_a1.a1;
+  result += passStruct7BytesInt4ByteAlignedx10_a1.a2;
+  result += passStruct7BytesInt4ByteAlignedx10_a2.a0;
+  result += passStruct7BytesInt4ByteAlignedx10_a2.a1;
+  result += passStruct7BytesInt4ByteAlignedx10_a2.a2;
+  result += passStruct7BytesInt4ByteAlignedx10_a3.a0;
+  result += passStruct7BytesInt4ByteAlignedx10_a3.a1;
+  result += passStruct7BytesInt4ByteAlignedx10_a3.a2;
+  result += passStruct7BytesInt4ByteAlignedx10_a4.a0;
+  result += passStruct7BytesInt4ByteAlignedx10_a4.a1;
+  result += passStruct7BytesInt4ByteAlignedx10_a4.a2;
+  result += passStruct7BytesInt4ByteAlignedx10_a5.a0;
+  result += passStruct7BytesInt4ByteAlignedx10_a5.a1;
+  result += passStruct7BytesInt4ByteAlignedx10_a5.a2;
+  result += passStruct7BytesInt4ByteAlignedx10_a6.a0;
+  result += passStruct7BytesInt4ByteAlignedx10_a6.a1;
+  result += passStruct7BytesInt4ByteAlignedx10_a6.a2;
+  result += passStruct7BytesInt4ByteAlignedx10_a7.a0;
+  result += passStruct7BytesInt4ByteAlignedx10_a7.a1;
+  result += passStruct7BytesInt4ByteAlignedx10_a7.a2;
+  result += passStruct7BytesInt4ByteAlignedx10_a8.a0;
+  result += passStruct7BytesInt4ByteAlignedx10_a8.a1;
+  result += passStruct7BytesInt4ByteAlignedx10_a8.a2;
+  result += passStruct7BytesInt4ByteAlignedx10_a9.a0;
+  result += passStruct7BytesInt4ByteAlignedx10_a9.a1;
+  result += passStruct7BytesInt4ByteAlignedx10_a9.a2;
+
+  passStruct7BytesInt4ByteAlignedx10Result = result;
+
+  return result;
+}
+
+/// Sub word size on 64 bit architectures.
+/// With alignment rules taken into account size is 8 bytes.
+/// 10 struct arguments will exhaust available registers.
+int passStruct7BytesInt4ByteAlignedx10(
+    Struct7BytesInt4ByteAligned a0,
+    Struct7BytesInt4ByteAligned a1,
+    Struct7BytesInt4ByteAligned a2,
+    Struct7BytesInt4ByteAligned a3,
+    Struct7BytesInt4ByteAligned a4,
+    Struct7BytesInt4ByteAligned a5,
+    Struct7BytesInt4ByteAligned a6,
+    Struct7BytesInt4ByteAligned a7,
+    Struct7BytesInt4ByteAligned a8,
+    Struct7BytesInt4ByteAligned a9) {
+  print(
+      "passStruct7BytesInt4ByteAlignedx10(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5}, ${a6}, ${a7}, ${a8}, ${a9})");
+
+  // In legacy mode, possibly return null.
+  if (a0.a0 == 84) {
+    print("returning null!");
+    return null;
+  }
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0.a0 == 42 || a0.a0 == 84) {
+    print("throwing!");
+    throw Exception("PassStruct7BytesInt4ByteAlignedx10 throwing on purpuse!");
+  }
+
+  passStruct7BytesInt4ByteAlignedx10_a0 = a0;
+  passStruct7BytesInt4ByteAlignedx10_a1 = a1;
+  passStruct7BytesInt4ByteAlignedx10_a2 = a2;
+  passStruct7BytesInt4ByteAlignedx10_a3 = a3;
+  passStruct7BytesInt4ByteAlignedx10_a4 = a4;
+  passStruct7BytesInt4ByteAlignedx10_a5 = a5;
+  passStruct7BytesInt4ByteAlignedx10_a6 = a6;
+  passStruct7BytesInt4ByteAlignedx10_a7 = a7;
+  passStruct7BytesInt4ByteAlignedx10_a8 = a8;
+  passStruct7BytesInt4ByteAlignedx10_a9 = a9;
+
+  final result = passStruct7BytesInt4ByteAlignedx10CalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void passStruct7BytesInt4ByteAlignedx10AfterCallback() {
+  final result = passStruct7BytesInt4ByteAlignedx10CalculateResult();
+
+  print("after callback result = $result");
+
+  Expect.equals(15, result);
+}
+
+typedef PassStruct8BytesIntx10Type = Int64 Function(
+    Struct8BytesInt,
+    Struct8BytesInt,
+    Struct8BytesInt,
+    Struct8BytesInt,
+    Struct8BytesInt,
+    Struct8BytesInt,
+    Struct8BytesInt,
+    Struct8BytesInt,
+    Struct8BytesInt,
+    Struct8BytesInt);
+
+// Global variables to be able to test inputs after callback returned.
+Struct8BytesInt passStruct8BytesIntx10_a0 = Struct8BytesInt();
+Struct8BytesInt passStruct8BytesIntx10_a1 = Struct8BytesInt();
+Struct8BytesInt passStruct8BytesIntx10_a2 = Struct8BytesInt();
+Struct8BytesInt passStruct8BytesIntx10_a3 = Struct8BytesInt();
+Struct8BytesInt passStruct8BytesIntx10_a4 = Struct8BytesInt();
+Struct8BytesInt passStruct8BytesIntx10_a5 = Struct8BytesInt();
+Struct8BytesInt passStruct8BytesIntx10_a6 = Struct8BytesInt();
+Struct8BytesInt passStruct8BytesIntx10_a7 = Struct8BytesInt();
+Struct8BytesInt passStruct8BytesIntx10_a8 = Struct8BytesInt();
+Struct8BytesInt passStruct8BytesIntx10_a9 = Struct8BytesInt();
+
+// Result variable also global, so we can delete it after the callback.
+int passStruct8BytesIntx10Result = 0;
+
+int passStruct8BytesIntx10CalculateResult() {
+  int result = 0;
+
+  result += passStruct8BytesIntx10_a0.a0;
+  result += passStruct8BytesIntx10_a0.a1;
+  result += passStruct8BytesIntx10_a0.a2;
+  result += passStruct8BytesIntx10_a1.a0;
+  result += passStruct8BytesIntx10_a1.a1;
+  result += passStruct8BytesIntx10_a1.a2;
+  result += passStruct8BytesIntx10_a2.a0;
+  result += passStruct8BytesIntx10_a2.a1;
+  result += passStruct8BytesIntx10_a2.a2;
+  result += passStruct8BytesIntx10_a3.a0;
+  result += passStruct8BytesIntx10_a3.a1;
+  result += passStruct8BytesIntx10_a3.a2;
+  result += passStruct8BytesIntx10_a4.a0;
+  result += passStruct8BytesIntx10_a4.a1;
+  result += passStruct8BytesIntx10_a4.a2;
+  result += passStruct8BytesIntx10_a5.a0;
+  result += passStruct8BytesIntx10_a5.a1;
+  result += passStruct8BytesIntx10_a5.a2;
+  result += passStruct8BytesIntx10_a6.a0;
+  result += passStruct8BytesIntx10_a6.a1;
+  result += passStruct8BytesIntx10_a6.a2;
+  result += passStruct8BytesIntx10_a7.a0;
+  result += passStruct8BytesIntx10_a7.a1;
+  result += passStruct8BytesIntx10_a7.a2;
+  result += passStruct8BytesIntx10_a8.a0;
+  result += passStruct8BytesIntx10_a8.a1;
+  result += passStruct8BytesIntx10_a8.a2;
+  result += passStruct8BytesIntx10_a9.a0;
+  result += passStruct8BytesIntx10_a9.a1;
+  result += passStruct8BytesIntx10_a9.a2;
+
+  passStruct8BytesIntx10Result = result;
+
+  return result;
+}
+
+/// Exactly word size struct on 64bit architectures.
+/// 10 struct arguments will exhaust available registers.
+int passStruct8BytesIntx10(
+    Struct8BytesInt a0,
+    Struct8BytesInt a1,
+    Struct8BytesInt a2,
+    Struct8BytesInt a3,
+    Struct8BytesInt a4,
+    Struct8BytesInt a5,
+    Struct8BytesInt a6,
+    Struct8BytesInt a7,
+    Struct8BytesInt a8,
+    Struct8BytesInt a9) {
+  print(
+      "passStruct8BytesIntx10(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5}, ${a6}, ${a7}, ${a8}, ${a9})");
+
+  // In legacy mode, possibly return null.
+  if (a0.a0 == 84) {
+    print("returning null!");
+    return null;
+  }
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0.a0 == 42 || a0.a0 == 84) {
+    print("throwing!");
+    throw Exception("PassStruct8BytesIntx10 throwing on purpuse!");
+  }
+
+  passStruct8BytesIntx10_a0 = a0;
+  passStruct8BytesIntx10_a1 = a1;
+  passStruct8BytesIntx10_a2 = a2;
+  passStruct8BytesIntx10_a3 = a3;
+  passStruct8BytesIntx10_a4 = a4;
+  passStruct8BytesIntx10_a5 = a5;
+  passStruct8BytesIntx10_a6 = a6;
+  passStruct8BytesIntx10_a7 = a7;
+  passStruct8BytesIntx10_a8 = a8;
+  passStruct8BytesIntx10_a9 = a9;
+
+  final result = passStruct8BytesIntx10CalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void passStruct8BytesIntx10AfterCallback() {
+  final result = passStruct8BytesIntx10CalculateResult();
+
+  print("after callback result = $result");
+
+  Expect.equals(15, result);
+}
+
+typedef PassStruct8BytesHomogeneousFloatx10Type = Float Function(
+    Struct8BytesHomogeneousFloat,
+    Struct8BytesHomogeneousFloat,
+    Struct8BytesHomogeneousFloat,
+    Struct8BytesHomogeneousFloat,
+    Struct8BytesHomogeneousFloat,
+    Struct8BytesHomogeneousFloat,
+    Struct8BytesHomogeneousFloat,
+    Struct8BytesHomogeneousFloat,
+    Struct8BytesHomogeneousFloat,
+    Struct8BytesHomogeneousFloat);
+
+// Global variables to be able to test inputs after callback returned.
+Struct8BytesHomogeneousFloat passStruct8BytesHomogeneousFloatx10_a0 =
+    Struct8BytesHomogeneousFloat();
+Struct8BytesHomogeneousFloat passStruct8BytesHomogeneousFloatx10_a1 =
+    Struct8BytesHomogeneousFloat();
+Struct8BytesHomogeneousFloat passStruct8BytesHomogeneousFloatx10_a2 =
+    Struct8BytesHomogeneousFloat();
+Struct8BytesHomogeneousFloat passStruct8BytesHomogeneousFloatx10_a3 =
+    Struct8BytesHomogeneousFloat();
+Struct8BytesHomogeneousFloat passStruct8BytesHomogeneousFloatx10_a4 =
+    Struct8BytesHomogeneousFloat();
+Struct8BytesHomogeneousFloat passStruct8BytesHomogeneousFloatx10_a5 =
+    Struct8BytesHomogeneousFloat();
+Struct8BytesHomogeneousFloat passStruct8BytesHomogeneousFloatx10_a6 =
+    Struct8BytesHomogeneousFloat();
+Struct8BytesHomogeneousFloat passStruct8BytesHomogeneousFloatx10_a7 =
+    Struct8BytesHomogeneousFloat();
+Struct8BytesHomogeneousFloat passStruct8BytesHomogeneousFloatx10_a8 =
+    Struct8BytesHomogeneousFloat();
+Struct8BytesHomogeneousFloat passStruct8BytesHomogeneousFloatx10_a9 =
+    Struct8BytesHomogeneousFloat();
+
+// Result variable also global, so we can delete it after the callback.
+double passStruct8BytesHomogeneousFloatx10Result = 0.0;
+
+double passStruct8BytesHomogeneousFloatx10CalculateResult() {
+  double result = 0;
+
+  result += passStruct8BytesHomogeneousFloatx10_a0.a0;
+  result += passStruct8BytesHomogeneousFloatx10_a0.a1;
+  result += passStruct8BytesHomogeneousFloatx10_a1.a0;
+  result += passStruct8BytesHomogeneousFloatx10_a1.a1;
+  result += passStruct8BytesHomogeneousFloatx10_a2.a0;
+  result += passStruct8BytesHomogeneousFloatx10_a2.a1;
+  result += passStruct8BytesHomogeneousFloatx10_a3.a0;
+  result += passStruct8BytesHomogeneousFloatx10_a3.a1;
+  result += passStruct8BytesHomogeneousFloatx10_a4.a0;
+  result += passStruct8BytesHomogeneousFloatx10_a4.a1;
+  result += passStruct8BytesHomogeneousFloatx10_a5.a0;
+  result += passStruct8BytesHomogeneousFloatx10_a5.a1;
+  result += passStruct8BytesHomogeneousFloatx10_a6.a0;
+  result += passStruct8BytesHomogeneousFloatx10_a6.a1;
+  result += passStruct8BytesHomogeneousFloatx10_a7.a0;
+  result += passStruct8BytesHomogeneousFloatx10_a7.a1;
+  result += passStruct8BytesHomogeneousFloatx10_a8.a0;
+  result += passStruct8BytesHomogeneousFloatx10_a8.a1;
+  result += passStruct8BytesHomogeneousFloatx10_a9.a0;
+  result += passStruct8BytesHomogeneousFloatx10_a9.a1;
+
+  passStruct8BytesHomogeneousFloatx10Result = result;
+
+  return result;
+}
+
+/// Arguments passed in FP registers as long as they fit.
+/// 10 struct arguments will exhaust available registers.
+double passStruct8BytesHomogeneousFloatx10(
+    Struct8BytesHomogeneousFloat a0,
+    Struct8BytesHomogeneousFloat a1,
+    Struct8BytesHomogeneousFloat a2,
+    Struct8BytesHomogeneousFloat a3,
+    Struct8BytesHomogeneousFloat a4,
+    Struct8BytesHomogeneousFloat a5,
+    Struct8BytesHomogeneousFloat a6,
+    Struct8BytesHomogeneousFloat a7,
+    Struct8BytesHomogeneousFloat a8,
+    Struct8BytesHomogeneousFloat a9) {
+  print(
+      "passStruct8BytesHomogeneousFloatx10(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5}, ${a6}, ${a7}, ${a8}, ${a9})");
+
+  // In legacy mode, possibly return null.
+  if (a0.a0 == 84) {
+    print("returning null!");
+    return null;
+  }
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0.a0 == 42 || a0.a0 == 84) {
+    print("throwing!");
+    throw Exception("PassStruct8BytesHomogeneousFloatx10 throwing on purpuse!");
+  }
+
+  passStruct8BytesHomogeneousFloatx10_a0 = a0;
+  passStruct8BytesHomogeneousFloatx10_a1 = a1;
+  passStruct8BytesHomogeneousFloatx10_a2 = a2;
+  passStruct8BytesHomogeneousFloatx10_a3 = a3;
+  passStruct8BytesHomogeneousFloatx10_a4 = a4;
+  passStruct8BytesHomogeneousFloatx10_a5 = a5;
+  passStruct8BytesHomogeneousFloatx10_a6 = a6;
+  passStruct8BytesHomogeneousFloatx10_a7 = a7;
+  passStruct8BytesHomogeneousFloatx10_a8 = a8;
+  passStruct8BytesHomogeneousFloatx10_a9 = a9;
+
+  final result = passStruct8BytesHomogeneousFloatx10CalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void passStruct8BytesHomogeneousFloatx10AfterCallback() {
+  final result = passStruct8BytesHomogeneousFloatx10CalculateResult();
+
+  print("after callback result = $result");
+
+  Expect.approxEquals(10.0, result);
+}
+
+typedef PassStruct8BytesMixedx10Type = Float Function(
+    Struct8BytesMixed,
+    Struct8BytesMixed,
+    Struct8BytesMixed,
+    Struct8BytesMixed,
+    Struct8BytesMixed,
+    Struct8BytesMixed,
+    Struct8BytesMixed,
+    Struct8BytesMixed,
+    Struct8BytesMixed,
+    Struct8BytesMixed);
+
+// Global variables to be able to test inputs after callback returned.
+Struct8BytesMixed passStruct8BytesMixedx10_a0 = Struct8BytesMixed();
+Struct8BytesMixed passStruct8BytesMixedx10_a1 = Struct8BytesMixed();
+Struct8BytesMixed passStruct8BytesMixedx10_a2 = Struct8BytesMixed();
+Struct8BytesMixed passStruct8BytesMixedx10_a3 = Struct8BytesMixed();
+Struct8BytesMixed passStruct8BytesMixedx10_a4 = Struct8BytesMixed();
+Struct8BytesMixed passStruct8BytesMixedx10_a5 = Struct8BytesMixed();
+Struct8BytesMixed passStruct8BytesMixedx10_a6 = Struct8BytesMixed();
+Struct8BytesMixed passStruct8BytesMixedx10_a7 = Struct8BytesMixed();
+Struct8BytesMixed passStruct8BytesMixedx10_a8 = Struct8BytesMixed();
+Struct8BytesMixed passStruct8BytesMixedx10_a9 = Struct8BytesMixed();
+
+// Result variable also global, so we can delete it after the callback.
+double passStruct8BytesMixedx10Result = 0.0;
+
+double passStruct8BytesMixedx10CalculateResult() {
+  double result = 0;
+
+  result += passStruct8BytesMixedx10_a0.a0;
+  result += passStruct8BytesMixedx10_a0.a1;
+  result += passStruct8BytesMixedx10_a0.a2;
+  result += passStruct8BytesMixedx10_a1.a0;
+  result += passStruct8BytesMixedx10_a1.a1;
+  result += passStruct8BytesMixedx10_a1.a2;
+  result += passStruct8BytesMixedx10_a2.a0;
+  result += passStruct8BytesMixedx10_a2.a1;
+  result += passStruct8BytesMixedx10_a2.a2;
+  result += passStruct8BytesMixedx10_a3.a0;
+  result += passStruct8BytesMixedx10_a3.a1;
+  result += passStruct8BytesMixedx10_a3.a2;
+  result += passStruct8BytesMixedx10_a4.a0;
+  result += passStruct8BytesMixedx10_a4.a1;
+  result += passStruct8BytesMixedx10_a4.a2;
+  result += passStruct8BytesMixedx10_a5.a0;
+  result += passStruct8BytesMixedx10_a5.a1;
+  result += passStruct8BytesMixedx10_a5.a2;
+  result += passStruct8BytesMixedx10_a6.a0;
+  result += passStruct8BytesMixedx10_a6.a1;
+  result += passStruct8BytesMixedx10_a6.a2;
+  result += passStruct8BytesMixedx10_a7.a0;
+  result += passStruct8BytesMixedx10_a7.a1;
+  result += passStruct8BytesMixedx10_a7.a2;
+  result += passStruct8BytesMixedx10_a8.a0;
+  result += passStruct8BytesMixedx10_a8.a1;
+  result += passStruct8BytesMixedx10_a8.a2;
+  result += passStruct8BytesMixedx10_a9.a0;
+  result += passStruct8BytesMixedx10_a9.a1;
+  result += passStruct8BytesMixedx10_a9.a2;
+
+  passStruct8BytesMixedx10Result = result;
+
+  return result;
+}
+
+/// On x64, arguments go in int registers because it is not only float.
+/// 10 struct arguments will exhaust available registers.
+double passStruct8BytesMixedx10(
+    Struct8BytesMixed a0,
+    Struct8BytesMixed a1,
+    Struct8BytesMixed a2,
+    Struct8BytesMixed a3,
+    Struct8BytesMixed a4,
+    Struct8BytesMixed a5,
+    Struct8BytesMixed a6,
+    Struct8BytesMixed a7,
+    Struct8BytesMixed a8,
+    Struct8BytesMixed a9) {
+  print(
+      "passStruct8BytesMixedx10(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5}, ${a6}, ${a7}, ${a8}, ${a9})");
+
+  // In legacy mode, possibly return null.
+  if (a0.a0 == 84) {
+    print("returning null!");
+    return null;
+  }
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0.a0 == 42 || a0.a0 == 84) {
+    print("throwing!");
+    throw Exception("PassStruct8BytesMixedx10 throwing on purpuse!");
+  }
+
+  passStruct8BytesMixedx10_a0 = a0;
+  passStruct8BytesMixedx10_a1 = a1;
+  passStruct8BytesMixedx10_a2 = a2;
+  passStruct8BytesMixedx10_a3 = a3;
+  passStruct8BytesMixedx10_a4 = a4;
+  passStruct8BytesMixedx10_a5 = a5;
+  passStruct8BytesMixedx10_a6 = a6;
+  passStruct8BytesMixedx10_a7 = a7;
+  passStruct8BytesMixedx10_a8 = a8;
+  passStruct8BytesMixedx10_a9 = a9;
+
+  final result = passStruct8BytesMixedx10CalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void passStruct8BytesMixedx10AfterCallback() {
+  final result = passStruct8BytesMixedx10CalculateResult();
+
+  print("after callback result = $result");
+
+  Expect.approxEquals(15.0, result);
+}
+
+typedef PassStruct9BytesHomogeneousUint8x10Type = Int64 Function(
+    Struct9BytesHomogeneousUint8,
+    Struct9BytesHomogeneousUint8,
+    Struct9BytesHomogeneousUint8,
+    Struct9BytesHomogeneousUint8,
+    Struct9BytesHomogeneousUint8,
+    Struct9BytesHomogeneousUint8,
+    Struct9BytesHomogeneousUint8,
+    Struct9BytesHomogeneousUint8,
+    Struct9BytesHomogeneousUint8,
+    Struct9BytesHomogeneousUint8);
+
+// Global variables to be able to test inputs after callback returned.
+Struct9BytesHomogeneousUint8 passStruct9BytesHomogeneousUint8x10_a0 =
+    Struct9BytesHomogeneousUint8();
+Struct9BytesHomogeneousUint8 passStruct9BytesHomogeneousUint8x10_a1 =
+    Struct9BytesHomogeneousUint8();
+Struct9BytesHomogeneousUint8 passStruct9BytesHomogeneousUint8x10_a2 =
+    Struct9BytesHomogeneousUint8();
+Struct9BytesHomogeneousUint8 passStruct9BytesHomogeneousUint8x10_a3 =
+    Struct9BytesHomogeneousUint8();
+Struct9BytesHomogeneousUint8 passStruct9BytesHomogeneousUint8x10_a4 =
+    Struct9BytesHomogeneousUint8();
+Struct9BytesHomogeneousUint8 passStruct9BytesHomogeneousUint8x10_a5 =
+    Struct9BytesHomogeneousUint8();
+Struct9BytesHomogeneousUint8 passStruct9BytesHomogeneousUint8x10_a6 =
+    Struct9BytesHomogeneousUint8();
+Struct9BytesHomogeneousUint8 passStruct9BytesHomogeneousUint8x10_a7 =
+    Struct9BytesHomogeneousUint8();
+Struct9BytesHomogeneousUint8 passStruct9BytesHomogeneousUint8x10_a8 =
+    Struct9BytesHomogeneousUint8();
+Struct9BytesHomogeneousUint8 passStruct9BytesHomogeneousUint8x10_a9 =
+    Struct9BytesHomogeneousUint8();
+
+// Result variable also global, so we can delete it after the callback.
+int passStruct9BytesHomogeneousUint8x10Result = 0;
+
+int passStruct9BytesHomogeneousUint8x10CalculateResult() {
+  int result = 0;
+
+  result += passStruct9BytesHomogeneousUint8x10_a0.a0;
+  result += passStruct9BytesHomogeneousUint8x10_a0.a1;
+  result += passStruct9BytesHomogeneousUint8x10_a0.a2;
+  result += passStruct9BytesHomogeneousUint8x10_a0.a3;
+  result += passStruct9BytesHomogeneousUint8x10_a0.a4;
+  result += passStruct9BytesHomogeneousUint8x10_a0.a5;
+  result += passStruct9BytesHomogeneousUint8x10_a0.a6;
+  result += passStruct9BytesHomogeneousUint8x10_a0.a7;
+  result += passStruct9BytesHomogeneousUint8x10_a0.a8;
+  result += passStruct9BytesHomogeneousUint8x10_a1.a0;
+  result += passStruct9BytesHomogeneousUint8x10_a1.a1;
+  result += passStruct9BytesHomogeneousUint8x10_a1.a2;
+  result += passStruct9BytesHomogeneousUint8x10_a1.a3;
+  result += passStruct9BytesHomogeneousUint8x10_a1.a4;
+  result += passStruct9BytesHomogeneousUint8x10_a1.a5;
+  result += passStruct9BytesHomogeneousUint8x10_a1.a6;
+  result += passStruct9BytesHomogeneousUint8x10_a1.a7;
+  result += passStruct9BytesHomogeneousUint8x10_a1.a8;
+  result += passStruct9BytesHomogeneousUint8x10_a2.a0;
+  result += passStruct9BytesHomogeneousUint8x10_a2.a1;
+  result += passStruct9BytesHomogeneousUint8x10_a2.a2;
+  result += passStruct9BytesHomogeneousUint8x10_a2.a3;
+  result += passStruct9BytesHomogeneousUint8x10_a2.a4;
+  result += passStruct9BytesHomogeneousUint8x10_a2.a5;
+  result += passStruct9BytesHomogeneousUint8x10_a2.a6;
+  result += passStruct9BytesHomogeneousUint8x10_a2.a7;
+  result += passStruct9BytesHomogeneousUint8x10_a2.a8;
+  result += passStruct9BytesHomogeneousUint8x10_a3.a0;
+  result += passStruct9BytesHomogeneousUint8x10_a3.a1;
+  result += passStruct9BytesHomogeneousUint8x10_a3.a2;
+  result += passStruct9BytesHomogeneousUint8x10_a3.a3;
+  result += passStruct9BytesHomogeneousUint8x10_a3.a4;
+  result += passStruct9BytesHomogeneousUint8x10_a3.a5;
+  result += passStruct9BytesHomogeneousUint8x10_a3.a6;
+  result += passStruct9BytesHomogeneousUint8x10_a3.a7;
+  result += passStruct9BytesHomogeneousUint8x10_a3.a8;
+  result += passStruct9BytesHomogeneousUint8x10_a4.a0;
+  result += passStruct9BytesHomogeneousUint8x10_a4.a1;
+  result += passStruct9BytesHomogeneousUint8x10_a4.a2;
+  result += passStruct9BytesHomogeneousUint8x10_a4.a3;
+  result += passStruct9BytesHomogeneousUint8x10_a4.a4;
+  result += passStruct9BytesHomogeneousUint8x10_a4.a5;
+  result += passStruct9BytesHomogeneousUint8x10_a4.a6;
+  result += passStruct9BytesHomogeneousUint8x10_a4.a7;
+  result += passStruct9BytesHomogeneousUint8x10_a4.a8;
+  result += passStruct9BytesHomogeneousUint8x10_a5.a0;
+  result += passStruct9BytesHomogeneousUint8x10_a5.a1;
+  result += passStruct9BytesHomogeneousUint8x10_a5.a2;
+  result += passStruct9BytesHomogeneousUint8x10_a5.a3;
+  result += passStruct9BytesHomogeneousUint8x10_a5.a4;
+  result += passStruct9BytesHomogeneousUint8x10_a5.a5;
+  result += passStruct9BytesHomogeneousUint8x10_a5.a6;
+  result += passStruct9BytesHomogeneousUint8x10_a5.a7;
+  result += passStruct9BytesHomogeneousUint8x10_a5.a8;
+  result += passStruct9BytesHomogeneousUint8x10_a6.a0;
+  result += passStruct9BytesHomogeneousUint8x10_a6.a1;
+  result += passStruct9BytesHomogeneousUint8x10_a6.a2;
+  result += passStruct9BytesHomogeneousUint8x10_a6.a3;
+  result += passStruct9BytesHomogeneousUint8x10_a6.a4;
+  result += passStruct9BytesHomogeneousUint8x10_a6.a5;
+  result += passStruct9BytesHomogeneousUint8x10_a6.a6;
+  result += passStruct9BytesHomogeneousUint8x10_a6.a7;
+  result += passStruct9BytesHomogeneousUint8x10_a6.a8;
+  result += passStruct9BytesHomogeneousUint8x10_a7.a0;
+  result += passStruct9BytesHomogeneousUint8x10_a7.a1;
+  result += passStruct9BytesHomogeneousUint8x10_a7.a2;
+  result += passStruct9BytesHomogeneousUint8x10_a7.a3;
+  result += passStruct9BytesHomogeneousUint8x10_a7.a4;
+  result += passStruct9BytesHomogeneousUint8x10_a7.a5;
+  result += passStruct9BytesHomogeneousUint8x10_a7.a6;
+  result += passStruct9BytesHomogeneousUint8x10_a7.a7;
+  result += passStruct9BytesHomogeneousUint8x10_a7.a8;
+  result += passStruct9BytesHomogeneousUint8x10_a8.a0;
+  result += passStruct9BytesHomogeneousUint8x10_a8.a1;
+  result += passStruct9BytesHomogeneousUint8x10_a8.a2;
+  result += passStruct9BytesHomogeneousUint8x10_a8.a3;
+  result += passStruct9BytesHomogeneousUint8x10_a8.a4;
+  result += passStruct9BytesHomogeneousUint8x10_a8.a5;
+  result += passStruct9BytesHomogeneousUint8x10_a8.a6;
+  result += passStruct9BytesHomogeneousUint8x10_a8.a7;
+  result += passStruct9BytesHomogeneousUint8x10_a8.a8;
+  result += passStruct9BytesHomogeneousUint8x10_a9.a0;
+  result += passStruct9BytesHomogeneousUint8x10_a9.a1;
+  result += passStruct9BytesHomogeneousUint8x10_a9.a2;
+  result += passStruct9BytesHomogeneousUint8x10_a9.a3;
+  result += passStruct9BytesHomogeneousUint8x10_a9.a4;
+  result += passStruct9BytesHomogeneousUint8x10_a9.a5;
+  result += passStruct9BytesHomogeneousUint8x10_a9.a6;
+  result += passStruct9BytesHomogeneousUint8x10_a9.a7;
+  result += passStruct9BytesHomogeneousUint8x10_a9.a8;
+
+  passStruct9BytesHomogeneousUint8x10Result = result;
+
+  return result;
+}
+
+/// Argument is a single byte over a multiple of word size.
+/// 10 struct arguments will exhaust available registers.
+/// Struct only has 1-byte aligned fields to test struct alignment itself.
+/// Tests upper bytes in the integer registers that are partly filled.
+/// Tests stack alignment of non word size stack arguments.
+int passStruct9BytesHomogeneousUint8x10(
+    Struct9BytesHomogeneousUint8 a0,
+    Struct9BytesHomogeneousUint8 a1,
+    Struct9BytesHomogeneousUint8 a2,
+    Struct9BytesHomogeneousUint8 a3,
+    Struct9BytesHomogeneousUint8 a4,
+    Struct9BytesHomogeneousUint8 a5,
+    Struct9BytesHomogeneousUint8 a6,
+    Struct9BytesHomogeneousUint8 a7,
+    Struct9BytesHomogeneousUint8 a8,
+    Struct9BytesHomogeneousUint8 a9) {
+  print(
+      "passStruct9BytesHomogeneousUint8x10(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5}, ${a6}, ${a7}, ${a8}, ${a9})");
+
+  // In legacy mode, possibly return null.
+  if (a0.a0 == 84) {
+    print("returning null!");
+    return null;
+  }
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0.a0 == 42 || a0.a0 == 84) {
+    print("throwing!");
+    throw Exception("PassStruct9BytesHomogeneousUint8x10 throwing on purpuse!");
+  }
+
+  passStruct9BytesHomogeneousUint8x10_a0 = a0;
+  passStruct9BytesHomogeneousUint8x10_a1 = a1;
+  passStruct9BytesHomogeneousUint8x10_a2 = a2;
+  passStruct9BytesHomogeneousUint8x10_a3 = a3;
+  passStruct9BytesHomogeneousUint8x10_a4 = a4;
+  passStruct9BytesHomogeneousUint8x10_a5 = a5;
+  passStruct9BytesHomogeneousUint8x10_a6 = a6;
+  passStruct9BytesHomogeneousUint8x10_a7 = a7;
+  passStruct9BytesHomogeneousUint8x10_a8 = a8;
+  passStruct9BytesHomogeneousUint8x10_a9 = a9;
+
+  final result = passStruct9BytesHomogeneousUint8x10CalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void passStruct9BytesHomogeneousUint8x10AfterCallback() {
+  final result = passStruct9BytesHomogeneousUint8x10CalculateResult();
+
+  print("after callback result = $result");
+
+  Expect.equals(4095, result);
+}
+
+typedef PassStruct9BytesInt4Or8ByteAlignedx10Type = Int64 Function(
+    Struct9BytesInt4Or8ByteAligned,
+    Struct9BytesInt4Or8ByteAligned,
+    Struct9BytesInt4Or8ByteAligned,
+    Struct9BytesInt4Or8ByteAligned,
+    Struct9BytesInt4Or8ByteAligned,
+    Struct9BytesInt4Or8ByteAligned,
+    Struct9BytesInt4Or8ByteAligned,
+    Struct9BytesInt4Or8ByteAligned,
+    Struct9BytesInt4Or8ByteAligned,
+    Struct9BytesInt4Or8ByteAligned);
+
+// Global variables to be able to test inputs after callback returned.
+Struct9BytesInt4Or8ByteAligned passStruct9BytesInt4Or8ByteAlignedx10_a0 =
+    Struct9BytesInt4Or8ByteAligned();
+Struct9BytesInt4Or8ByteAligned passStruct9BytesInt4Or8ByteAlignedx10_a1 =
+    Struct9BytesInt4Or8ByteAligned();
+Struct9BytesInt4Or8ByteAligned passStruct9BytesInt4Or8ByteAlignedx10_a2 =
+    Struct9BytesInt4Or8ByteAligned();
+Struct9BytesInt4Or8ByteAligned passStruct9BytesInt4Or8ByteAlignedx10_a3 =
+    Struct9BytesInt4Or8ByteAligned();
+Struct9BytesInt4Or8ByteAligned passStruct9BytesInt4Or8ByteAlignedx10_a4 =
+    Struct9BytesInt4Or8ByteAligned();
+Struct9BytesInt4Or8ByteAligned passStruct9BytesInt4Or8ByteAlignedx10_a5 =
+    Struct9BytesInt4Or8ByteAligned();
+Struct9BytesInt4Or8ByteAligned passStruct9BytesInt4Or8ByteAlignedx10_a6 =
+    Struct9BytesInt4Or8ByteAligned();
+Struct9BytesInt4Or8ByteAligned passStruct9BytesInt4Or8ByteAlignedx10_a7 =
+    Struct9BytesInt4Or8ByteAligned();
+Struct9BytesInt4Or8ByteAligned passStruct9BytesInt4Or8ByteAlignedx10_a8 =
+    Struct9BytesInt4Or8ByteAligned();
+Struct9BytesInt4Or8ByteAligned passStruct9BytesInt4Or8ByteAlignedx10_a9 =
+    Struct9BytesInt4Or8ByteAligned();
+
+// Result variable also global, so we can delete it after the callback.
+int passStruct9BytesInt4Or8ByteAlignedx10Result = 0;
+
+int passStruct9BytesInt4Or8ByteAlignedx10CalculateResult() {
+  int result = 0;
+
+  result += passStruct9BytesInt4Or8ByteAlignedx10_a0.a0;
+  result += passStruct9BytesInt4Or8ByteAlignedx10_a0.a1;
+  result += passStruct9BytesInt4Or8ByteAlignedx10_a1.a0;
+  result += passStruct9BytesInt4Or8ByteAlignedx10_a1.a1;
+  result += passStruct9BytesInt4Or8ByteAlignedx10_a2.a0;
+  result += passStruct9BytesInt4Or8ByteAlignedx10_a2.a1;
+  result += passStruct9BytesInt4Or8ByteAlignedx10_a3.a0;
+  result += passStruct9BytesInt4Or8ByteAlignedx10_a3.a1;
+  result += passStruct9BytesInt4Or8ByteAlignedx10_a4.a0;
+  result += passStruct9BytesInt4Or8ByteAlignedx10_a4.a1;
+  result += passStruct9BytesInt4Or8ByteAlignedx10_a5.a0;
+  result += passStruct9BytesInt4Or8ByteAlignedx10_a5.a1;
+  result += passStruct9BytesInt4Or8ByteAlignedx10_a6.a0;
+  result += passStruct9BytesInt4Or8ByteAlignedx10_a6.a1;
+  result += passStruct9BytesInt4Or8ByteAlignedx10_a7.a0;
+  result += passStruct9BytesInt4Or8ByteAlignedx10_a7.a1;
+  result += passStruct9BytesInt4Or8ByteAlignedx10_a8.a0;
+  result += passStruct9BytesInt4Or8ByteAlignedx10_a8.a1;
+  result += passStruct9BytesInt4Or8ByteAlignedx10_a9.a0;
+  result += passStruct9BytesInt4Or8ByteAlignedx10_a9.a1;
+
+  passStruct9BytesInt4Or8ByteAlignedx10Result = result;
+
+  return result;
+}
+
+/// Argument is a single byte over a multiple of word size.
+/// With alignment rules taken into account size is 12 or 16 bytes.
+/// 10 struct arguments will exhaust available registers.
+///
+int passStruct9BytesInt4Or8ByteAlignedx10(
+    Struct9BytesInt4Or8ByteAligned a0,
+    Struct9BytesInt4Or8ByteAligned a1,
+    Struct9BytesInt4Or8ByteAligned a2,
+    Struct9BytesInt4Or8ByteAligned a3,
+    Struct9BytesInt4Or8ByteAligned a4,
+    Struct9BytesInt4Or8ByteAligned a5,
+    Struct9BytesInt4Or8ByteAligned a6,
+    Struct9BytesInt4Or8ByteAligned a7,
+    Struct9BytesInt4Or8ByteAligned a8,
+    Struct9BytesInt4Or8ByteAligned a9) {
+  print(
+      "passStruct9BytesInt4Or8ByteAlignedx10(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5}, ${a6}, ${a7}, ${a8}, ${a9})");
+
+  // In legacy mode, possibly return null.
+  if (a0.a0 == 84) {
+    print("returning null!");
+    return null;
+  }
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0.a0 == 42 || a0.a0 == 84) {
+    print("throwing!");
+    throw Exception(
+        "PassStruct9BytesInt4Or8ByteAlignedx10 throwing on purpuse!");
+  }
+
+  passStruct9BytesInt4Or8ByteAlignedx10_a0 = a0;
+  passStruct9BytesInt4Or8ByteAlignedx10_a1 = a1;
+  passStruct9BytesInt4Or8ByteAlignedx10_a2 = a2;
+  passStruct9BytesInt4Or8ByteAlignedx10_a3 = a3;
+  passStruct9BytesInt4Or8ByteAlignedx10_a4 = a4;
+  passStruct9BytesInt4Or8ByteAlignedx10_a5 = a5;
+  passStruct9BytesInt4Or8ByteAlignedx10_a6 = a6;
+  passStruct9BytesInt4Or8ByteAlignedx10_a7 = a7;
+  passStruct9BytesInt4Or8ByteAlignedx10_a8 = a8;
+  passStruct9BytesInt4Or8ByteAlignedx10_a9 = a9;
+
+  final result = passStruct9BytesInt4Or8ByteAlignedx10CalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void passStruct9BytesInt4Or8ByteAlignedx10AfterCallback() {
+  final result = passStruct9BytesInt4Or8ByteAlignedx10CalculateResult();
+
+  print("after callback result = $result");
+
+  Expect.equals(10, result);
+}
+
+typedef PassStruct12BytesHomogeneousFloatx6Type = Float Function(
+    Struct12BytesHomogeneousFloat,
+    Struct12BytesHomogeneousFloat,
+    Struct12BytesHomogeneousFloat,
+    Struct12BytesHomogeneousFloat,
+    Struct12BytesHomogeneousFloat,
+    Struct12BytesHomogeneousFloat);
+
+// Global variables to be able to test inputs after callback returned.
+Struct12BytesHomogeneousFloat passStruct12BytesHomogeneousFloatx6_a0 =
+    Struct12BytesHomogeneousFloat();
+Struct12BytesHomogeneousFloat passStruct12BytesHomogeneousFloatx6_a1 =
+    Struct12BytesHomogeneousFloat();
+Struct12BytesHomogeneousFloat passStruct12BytesHomogeneousFloatx6_a2 =
+    Struct12BytesHomogeneousFloat();
+Struct12BytesHomogeneousFloat passStruct12BytesHomogeneousFloatx6_a3 =
+    Struct12BytesHomogeneousFloat();
+Struct12BytesHomogeneousFloat passStruct12BytesHomogeneousFloatx6_a4 =
+    Struct12BytesHomogeneousFloat();
+Struct12BytesHomogeneousFloat passStruct12BytesHomogeneousFloatx6_a5 =
+    Struct12BytesHomogeneousFloat();
+
+// Result variable also global, so we can delete it after the callback.
+double passStruct12BytesHomogeneousFloatx6Result = 0.0;
+
+double passStruct12BytesHomogeneousFloatx6CalculateResult() {
+  double result = 0;
+
+  result += passStruct12BytesHomogeneousFloatx6_a0.a0;
+  result += passStruct12BytesHomogeneousFloatx6_a0.a1;
+  result += passStruct12BytesHomogeneousFloatx6_a0.a2;
+  result += passStruct12BytesHomogeneousFloatx6_a1.a0;
+  result += passStruct12BytesHomogeneousFloatx6_a1.a1;
+  result += passStruct12BytesHomogeneousFloatx6_a1.a2;
+  result += passStruct12BytesHomogeneousFloatx6_a2.a0;
+  result += passStruct12BytesHomogeneousFloatx6_a2.a1;
+  result += passStruct12BytesHomogeneousFloatx6_a2.a2;
+  result += passStruct12BytesHomogeneousFloatx6_a3.a0;
+  result += passStruct12BytesHomogeneousFloatx6_a3.a1;
+  result += passStruct12BytesHomogeneousFloatx6_a3.a2;
+  result += passStruct12BytesHomogeneousFloatx6_a4.a0;
+  result += passStruct12BytesHomogeneousFloatx6_a4.a1;
+  result += passStruct12BytesHomogeneousFloatx6_a4.a2;
+  result += passStruct12BytesHomogeneousFloatx6_a5.a0;
+  result += passStruct12BytesHomogeneousFloatx6_a5.a1;
+  result += passStruct12BytesHomogeneousFloatx6_a5.a2;
+
+  passStruct12BytesHomogeneousFloatx6Result = result;
+
+  return result;
+}
+
+/// Arguments in FPU registers on arm hardfp and arm64.
+/// Struct arguments will exhaust available registers, and leave some empty.
+/// The last argument is to test whether arguments are backfilled.
+double passStruct12BytesHomogeneousFloatx6(
+    Struct12BytesHomogeneousFloat a0,
+    Struct12BytesHomogeneousFloat a1,
+    Struct12BytesHomogeneousFloat a2,
+    Struct12BytesHomogeneousFloat a3,
+    Struct12BytesHomogeneousFloat a4,
+    Struct12BytesHomogeneousFloat a5) {
+  print(
+      "passStruct12BytesHomogeneousFloatx6(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5})");
+
+  // In legacy mode, possibly return null.
+  if (a0.a0 == 84) {
+    print("returning null!");
+    return null;
+  }
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0.a0 == 42 || a0.a0 == 84) {
+    print("throwing!");
+    throw Exception("PassStruct12BytesHomogeneousFloatx6 throwing on purpuse!");
+  }
+
+  passStruct12BytesHomogeneousFloatx6_a0 = a0;
+  passStruct12BytesHomogeneousFloatx6_a1 = a1;
+  passStruct12BytesHomogeneousFloatx6_a2 = a2;
+  passStruct12BytesHomogeneousFloatx6_a3 = a3;
+  passStruct12BytesHomogeneousFloatx6_a4 = a4;
+  passStruct12BytesHomogeneousFloatx6_a5 = a5;
+
+  final result = passStruct12BytesHomogeneousFloatx6CalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void passStruct12BytesHomogeneousFloatx6AfterCallback() {
+  final result = passStruct12BytesHomogeneousFloatx6CalculateResult();
+
+  print("after callback result = $result");
+
+  Expect.approxEquals(9.0, result);
+}
+
+typedef PassStruct16BytesHomogeneousFloatx5Type = Float Function(
+    Struct16BytesHomogeneousFloat,
+    Struct16BytesHomogeneousFloat,
+    Struct16BytesHomogeneousFloat,
+    Struct16BytesHomogeneousFloat,
+    Struct16BytesHomogeneousFloat);
+
+// Global variables to be able to test inputs after callback returned.
+Struct16BytesHomogeneousFloat passStruct16BytesHomogeneousFloatx5_a0 =
+    Struct16BytesHomogeneousFloat();
+Struct16BytesHomogeneousFloat passStruct16BytesHomogeneousFloatx5_a1 =
+    Struct16BytesHomogeneousFloat();
+Struct16BytesHomogeneousFloat passStruct16BytesHomogeneousFloatx5_a2 =
+    Struct16BytesHomogeneousFloat();
+Struct16BytesHomogeneousFloat passStruct16BytesHomogeneousFloatx5_a3 =
+    Struct16BytesHomogeneousFloat();
+Struct16BytesHomogeneousFloat passStruct16BytesHomogeneousFloatx5_a4 =
+    Struct16BytesHomogeneousFloat();
+
+// Result variable also global, so we can delete it after the callback.
+double passStruct16BytesHomogeneousFloatx5Result = 0.0;
+
+double passStruct16BytesHomogeneousFloatx5CalculateResult() {
+  double result = 0;
+
+  result += passStruct16BytesHomogeneousFloatx5_a0.a0;
+  result += passStruct16BytesHomogeneousFloatx5_a0.a1;
+  result += passStruct16BytesHomogeneousFloatx5_a0.a2;
+  result += passStruct16BytesHomogeneousFloatx5_a0.a3;
+  result += passStruct16BytesHomogeneousFloatx5_a1.a0;
+  result += passStruct16BytesHomogeneousFloatx5_a1.a1;
+  result += passStruct16BytesHomogeneousFloatx5_a1.a2;
+  result += passStruct16BytesHomogeneousFloatx5_a1.a3;
+  result += passStruct16BytesHomogeneousFloatx5_a2.a0;
+  result += passStruct16BytesHomogeneousFloatx5_a2.a1;
+  result += passStruct16BytesHomogeneousFloatx5_a2.a2;
+  result += passStruct16BytesHomogeneousFloatx5_a2.a3;
+  result += passStruct16BytesHomogeneousFloatx5_a3.a0;
+  result += passStruct16BytesHomogeneousFloatx5_a3.a1;
+  result += passStruct16BytesHomogeneousFloatx5_a3.a2;
+  result += passStruct16BytesHomogeneousFloatx5_a3.a3;
+  result += passStruct16BytesHomogeneousFloatx5_a4.a0;
+  result += passStruct16BytesHomogeneousFloatx5_a4.a1;
+  result += passStruct16BytesHomogeneousFloatx5_a4.a2;
+  result += passStruct16BytesHomogeneousFloatx5_a4.a3;
+
+  passStruct16BytesHomogeneousFloatx5Result = result;
+
+  return result;
+}
+
+/// On Linux x64 argument is transferred on stack because it is over 16 bytes.
+/// Arguments in FPU registers on arm hardfp and arm64.
+/// 5 struct arguments will exhaust available registers.
+double passStruct16BytesHomogeneousFloatx5(
+    Struct16BytesHomogeneousFloat a0,
+    Struct16BytesHomogeneousFloat a1,
+    Struct16BytesHomogeneousFloat a2,
+    Struct16BytesHomogeneousFloat a3,
+    Struct16BytesHomogeneousFloat a4) {
+  print(
+      "passStruct16BytesHomogeneousFloatx5(${a0}, ${a1}, ${a2}, ${a3}, ${a4})");
+
+  // In legacy mode, possibly return null.
+  if (a0.a0 == 84) {
+    print("returning null!");
+    return null;
+  }
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0.a0 == 42 || a0.a0 == 84) {
+    print("throwing!");
+    throw Exception("PassStruct16BytesHomogeneousFloatx5 throwing on purpuse!");
+  }
+
+  passStruct16BytesHomogeneousFloatx5_a0 = a0;
+  passStruct16BytesHomogeneousFloatx5_a1 = a1;
+  passStruct16BytesHomogeneousFloatx5_a2 = a2;
+  passStruct16BytesHomogeneousFloatx5_a3 = a3;
+  passStruct16BytesHomogeneousFloatx5_a4 = a4;
+
+  final result = passStruct16BytesHomogeneousFloatx5CalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void passStruct16BytesHomogeneousFloatx5AfterCallback() {
+  final result = passStruct16BytesHomogeneousFloatx5CalculateResult();
+
+  print("after callback result = $result");
+
+  Expect.approxEquals(10.0, result);
+}
+
+typedef PassStruct16BytesMixedx10Type = Double Function(
+    Struct16BytesMixed,
+    Struct16BytesMixed,
+    Struct16BytesMixed,
+    Struct16BytesMixed,
+    Struct16BytesMixed,
+    Struct16BytesMixed,
+    Struct16BytesMixed,
+    Struct16BytesMixed,
+    Struct16BytesMixed,
+    Struct16BytesMixed);
+
+// Global variables to be able to test inputs after callback returned.
+Struct16BytesMixed passStruct16BytesMixedx10_a0 = Struct16BytesMixed();
+Struct16BytesMixed passStruct16BytesMixedx10_a1 = Struct16BytesMixed();
+Struct16BytesMixed passStruct16BytesMixedx10_a2 = Struct16BytesMixed();
+Struct16BytesMixed passStruct16BytesMixedx10_a3 = Struct16BytesMixed();
+Struct16BytesMixed passStruct16BytesMixedx10_a4 = Struct16BytesMixed();
+Struct16BytesMixed passStruct16BytesMixedx10_a5 = Struct16BytesMixed();
+Struct16BytesMixed passStruct16BytesMixedx10_a6 = Struct16BytesMixed();
+Struct16BytesMixed passStruct16BytesMixedx10_a7 = Struct16BytesMixed();
+Struct16BytesMixed passStruct16BytesMixedx10_a8 = Struct16BytesMixed();
+Struct16BytesMixed passStruct16BytesMixedx10_a9 = Struct16BytesMixed();
+
+// Result variable also global, so we can delete it after the callback.
+double passStruct16BytesMixedx10Result = 0.0;
+
+double passStruct16BytesMixedx10CalculateResult() {
+  double result = 0;
+
+  result += passStruct16BytesMixedx10_a0.a0;
+  result += passStruct16BytesMixedx10_a0.a1;
+  result += passStruct16BytesMixedx10_a1.a0;
+  result += passStruct16BytesMixedx10_a1.a1;
+  result += passStruct16BytesMixedx10_a2.a0;
+  result += passStruct16BytesMixedx10_a2.a1;
+  result += passStruct16BytesMixedx10_a3.a0;
+  result += passStruct16BytesMixedx10_a3.a1;
+  result += passStruct16BytesMixedx10_a4.a0;
+  result += passStruct16BytesMixedx10_a4.a1;
+  result += passStruct16BytesMixedx10_a5.a0;
+  result += passStruct16BytesMixedx10_a5.a1;
+  result += passStruct16BytesMixedx10_a6.a0;
+  result += passStruct16BytesMixedx10_a6.a1;
+  result += passStruct16BytesMixedx10_a7.a0;
+  result += passStruct16BytesMixedx10_a7.a1;
+  result += passStruct16BytesMixedx10_a8.a0;
+  result += passStruct16BytesMixedx10_a8.a1;
+  result += passStruct16BytesMixedx10_a9.a0;
+  result += passStruct16BytesMixedx10_a9.a1;
+
+  passStruct16BytesMixedx10Result = result;
+
+  return result;
+}
+
+/// On x64, arguments are split over FP and int registers.
+/// On x64, it will exhaust the integer registers with the 6th argument.
+/// The rest goes on the stack.
+/// On arm, arguments are 8 byte aligned.
+double passStruct16BytesMixedx10(
+    Struct16BytesMixed a0,
+    Struct16BytesMixed a1,
+    Struct16BytesMixed a2,
+    Struct16BytesMixed a3,
+    Struct16BytesMixed a4,
+    Struct16BytesMixed a5,
+    Struct16BytesMixed a6,
+    Struct16BytesMixed a7,
+    Struct16BytesMixed a8,
+    Struct16BytesMixed a9) {
+  print(
+      "passStruct16BytesMixedx10(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5}, ${a6}, ${a7}, ${a8}, ${a9})");
+
+  // In legacy mode, possibly return null.
+  if (a0.a0 == 84) {
+    print("returning null!");
+    return null;
+  }
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0.a0 == 42 || a0.a0 == 84) {
+    print("throwing!");
+    throw Exception("PassStruct16BytesMixedx10 throwing on purpuse!");
+  }
+
+  passStruct16BytesMixedx10_a0 = a0;
+  passStruct16BytesMixedx10_a1 = a1;
+  passStruct16BytesMixedx10_a2 = a2;
+  passStruct16BytesMixedx10_a3 = a3;
+  passStruct16BytesMixedx10_a4 = a4;
+  passStruct16BytesMixedx10_a5 = a5;
+  passStruct16BytesMixedx10_a6 = a6;
+  passStruct16BytesMixedx10_a7 = a7;
+  passStruct16BytesMixedx10_a8 = a8;
+  passStruct16BytesMixedx10_a9 = a9;
+
+  final result = passStruct16BytesMixedx10CalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void passStruct16BytesMixedx10AfterCallback() {
+  final result = passStruct16BytesMixedx10CalculateResult();
+
+  print("after callback result = $result");
+
+  Expect.approxEquals(10.0, result);
+}
+
+typedef PassStruct16BytesMixed2x10Type = Float Function(
+    Struct16BytesMixed2,
+    Struct16BytesMixed2,
+    Struct16BytesMixed2,
+    Struct16BytesMixed2,
+    Struct16BytesMixed2,
+    Struct16BytesMixed2,
+    Struct16BytesMixed2,
+    Struct16BytesMixed2,
+    Struct16BytesMixed2,
+    Struct16BytesMixed2);
+
+// Global variables to be able to test inputs after callback returned.
+Struct16BytesMixed2 passStruct16BytesMixed2x10_a0 = Struct16BytesMixed2();
+Struct16BytesMixed2 passStruct16BytesMixed2x10_a1 = Struct16BytesMixed2();
+Struct16BytesMixed2 passStruct16BytesMixed2x10_a2 = Struct16BytesMixed2();
+Struct16BytesMixed2 passStruct16BytesMixed2x10_a3 = Struct16BytesMixed2();
+Struct16BytesMixed2 passStruct16BytesMixed2x10_a4 = Struct16BytesMixed2();
+Struct16BytesMixed2 passStruct16BytesMixed2x10_a5 = Struct16BytesMixed2();
+Struct16BytesMixed2 passStruct16BytesMixed2x10_a6 = Struct16BytesMixed2();
+Struct16BytesMixed2 passStruct16BytesMixed2x10_a7 = Struct16BytesMixed2();
+Struct16BytesMixed2 passStruct16BytesMixed2x10_a8 = Struct16BytesMixed2();
+Struct16BytesMixed2 passStruct16BytesMixed2x10_a9 = Struct16BytesMixed2();
+
+// Result variable also global, so we can delete it after the callback.
+double passStruct16BytesMixed2x10Result = 0.0;
+
+double passStruct16BytesMixed2x10CalculateResult() {
+  double result = 0;
+
+  result += passStruct16BytesMixed2x10_a0.a0;
+  result += passStruct16BytesMixed2x10_a0.a1;
+  result += passStruct16BytesMixed2x10_a0.a2;
+  result += passStruct16BytesMixed2x10_a0.a3;
+  result += passStruct16BytesMixed2x10_a1.a0;
+  result += passStruct16BytesMixed2x10_a1.a1;
+  result += passStruct16BytesMixed2x10_a1.a2;
+  result += passStruct16BytesMixed2x10_a1.a3;
+  result += passStruct16BytesMixed2x10_a2.a0;
+  result += passStruct16BytesMixed2x10_a2.a1;
+  result += passStruct16BytesMixed2x10_a2.a2;
+  result += passStruct16BytesMixed2x10_a2.a3;
+  result += passStruct16BytesMixed2x10_a3.a0;
+  result += passStruct16BytesMixed2x10_a3.a1;
+  result += passStruct16BytesMixed2x10_a3.a2;
+  result += passStruct16BytesMixed2x10_a3.a3;
+  result += passStruct16BytesMixed2x10_a4.a0;
+  result += passStruct16BytesMixed2x10_a4.a1;
+  result += passStruct16BytesMixed2x10_a4.a2;
+  result += passStruct16BytesMixed2x10_a4.a3;
+  result += passStruct16BytesMixed2x10_a5.a0;
+  result += passStruct16BytesMixed2x10_a5.a1;
+  result += passStruct16BytesMixed2x10_a5.a2;
+  result += passStruct16BytesMixed2x10_a5.a3;
+  result += passStruct16BytesMixed2x10_a6.a0;
+  result += passStruct16BytesMixed2x10_a6.a1;
+  result += passStruct16BytesMixed2x10_a6.a2;
+  result += passStruct16BytesMixed2x10_a6.a3;
+  result += passStruct16BytesMixed2x10_a7.a0;
+  result += passStruct16BytesMixed2x10_a7.a1;
+  result += passStruct16BytesMixed2x10_a7.a2;
+  result += passStruct16BytesMixed2x10_a7.a3;
+  result += passStruct16BytesMixed2x10_a8.a0;
+  result += passStruct16BytesMixed2x10_a8.a1;
+  result += passStruct16BytesMixed2x10_a8.a2;
+  result += passStruct16BytesMixed2x10_a8.a3;
+  result += passStruct16BytesMixed2x10_a9.a0;
+  result += passStruct16BytesMixed2x10_a9.a1;
+  result += passStruct16BytesMixed2x10_a9.a2;
+  result += passStruct16BytesMixed2x10_a9.a3;
+
+  passStruct16BytesMixed2x10Result = result;
+
+  return result;
+}
+
+/// On x64, arguments are split over FP and int registers.
+/// On x64, it will exhaust the integer registers with the 6th argument.
+/// The rest goes on the stack.
+/// On arm, arguments are 4 byte aligned.
+double passStruct16BytesMixed2x10(
+    Struct16BytesMixed2 a0,
+    Struct16BytesMixed2 a1,
+    Struct16BytesMixed2 a2,
+    Struct16BytesMixed2 a3,
+    Struct16BytesMixed2 a4,
+    Struct16BytesMixed2 a5,
+    Struct16BytesMixed2 a6,
+    Struct16BytesMixed2 a7,
+    Struct16BytesMixed2 a8,
+    Struct16BytesMixed2 a9) {
+  print(
+      "passStruct16BytesMixed2x10(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5}, ${a6}, ${a7}, ${a8}, ${a9})");
+
+  // In legacy mode, possibly return null.
+  if (a0.a0 == 84) {
+    print("returning null!");
+    return null;
+  }
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0.a0 == 42 || a0.a0 == 84) {
+    print("throwing!");
+    throw Exception("PassStruct16BytesMixed2x10 throwing on purpuse!");
+  }
+
+  passStruct16BytesMixed2x10_a0 = a0;
+  passStruct16BytesMixed2x10_a1 = a1;
+  passStruct16BytesMixed2x10_a2 = a2;
+  passStruct16BytesMixed2x10_a3 = a3;
+  passStruct16BytesMixed2x10_a4 = a4;
+  passStruct16BytesMixed2x10_a5 = a5;
+  passStruct16BytesMixed2x10_a6 = a6;
+  passStruct16BytesMixed2x10_a7 = a7;
+  passStruct16BytesMixed2x10_a8 = a8;
+  passStruct16BytesMixed2x10_a9 = a9;
+
+  final result = passStruct16BytesMixed2x10CalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void passStruct16BytesMixed2x10AfterCallback() {
+  final result = passStruct16BytesMixed2x10CalculateResult();
+
+  print("after callback result = $result");
+
+  Expect.approxEquals(20.0, result);
+}
+
+typedef PassStruct17BytesIntx10Type = Int64 Function(
+    Struct17BytesInt,
+    Struct17BytesInt,
+    Struct17BytesInt,
+    Struct17BytesInt,
+    Struct17BytesInt,
+    Struct17BytesInt,
+    Struct17BytesInt,
+    Struct17BytesInt,
+    Struct17BytesInt,
+    Struct17BytesInt);
+
+// Global variables to be able to test inputs after callback returned.
+Struct17BytesInt passStruct17BytesIntx10_a0 = Struct17BytesInt();
+Struct17BytesInt passStruct17BytesIntx10_a1 = Struct17BytesInt();
+Struct17BytesInt passStruct17BytesIntx10_a2 = Struct17BytesInt();
+Struct17BytesInt passStruct17BytesIntx10_a3 = Struct17BytesInt();
+Struct17BytesInt passStruct17BytesIntx10_a4 = Struct17BytesInt();
+Struct17BytesInt passStruct17BytesIntx10_a5 = Struct17BytesInt();
+Struct17BytesInt passStruct17BytesIntx10_a6 = Struct17BytesInt();
+Struct17BytesInt passStruct17BytesIntx10_a7 = Struct17BytesInt();
+Struct17BytesInt passStruct17BytesIntx10_a8 = Struct17BytesInt();
+Struct17BytesInt passStruct17BytesIntx10_a9 = Struct17BytesInt();
+
+// Result variable also global, so we can delete it after the callback.
+int passStruct17BytesIntx10Result = 0;
+
+int passStruct17BytesIntx10CalculateResult() {
+  int result = 0;
+
+  result += passStruct17BytesIntx10_a0.a0;
+  result += passStruct17BytesIntx10_a0.a1;
+  result += passStruct17BytesIntx10_a0.a2;
+  result += passStruct17BytesIntx10_a1.a0;
+  result += passStruct17BytesIntx10_a1.a1;
+  result += passStruct17BytesIntx10_a1.a2;
+  result += passStruct17BytesIntx10_a2.a0;
+  result += passStruct17BytesIntx10_a2.a1;
+  result += passStruct17BytesIntx10_a2.a2;
+  result += passStruct17BytesIntx10_a3.a0;
+  result += passStruct17BytesIntx10_a3.a1;
+  result += passStruct17BytesIntx10_a3.a2;
+  result += passStruct17BytesIntx10_a4.a0;
+  result += passStruct17BytesIntx10_a4.a1;
+  result += passStruct17BytesIntx10_a4.a2;
+  result += passStruct17BytesIntx10_a5.a0;
+  result += passStruct17BytesIntx10_a5.a1;
+  result += passStruct17BytesIntx10_a5.a2;
+  result += passStruct17BytesIntx10_a6.a0;
+  result += passStruct17BytesIntx10_a6.a1;
+  result += passStruct17BytesIntx10_a6.a2;
+  result += passStruct17BytesIntx10_a7.a0;
+  result += passStruct17BytesIntx10_a7.a1;
+  result += passStruct17BytesIntx10_a7.a2;
+  result += passStruct17BytesIntx10_a8.a0;
+  result += passStruct17BytesIntx10_a8.a1;
+  result += passStruct17BytesIntx10_a8.a2;
+  result += passStruct17BytesIntx10_a9.a0;
+  result += passStruct17BytesIntx10_a9.a1;
+  result += passStruct17BytesIntx10_a9.a2;
+
+  passStruct17BytesIntx10Result = result;
+
+  return result;
+}
+
+/// Arguments are passed as pointer to copy on arm64.
+/// Tests that the memory allocated for copies are rounded up to word size.
+int passStruct17BytesIntx10(
+    Struct17BytesInt a0,
+    Struct17BytesInt a1,
+    Struct17BytesInt a2,
+    Struct17BytesInt a3,
+    Struct17BytesInt a4,
+    Struct17BytesInt a5,
+    Struct17BytesInt a6,
+    Struct17BytesInt a7,
+    Struct17BytesInt a8,
+    Struct17BytesInt a9) {
+  print(
+      "passStruct17BytesIntx10(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5}, ${a6}, ${a7}, ${a8}, ${a9})");
+
+  // In legacy mode, possibly return null.
+  if (a0.a0 == 84) {
+    print("returning null!");
+    return null;
+  }
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0.a0 == 42 || a0.a0 == 84) {
+    print("throwing!");
+    throw Exception("PassStruct17BytesIntx10 throwing on purpuse!");
+  }
+
+  passStruct17BytesIntx10_a0 = a0;
+  passStruct17BytesIntx10_a1 = a1;
+  passStruct17BytesIntx10_a2 = a2;
+  passStruct17BytesIntx10_a3 = a3;
+  passStruct17BytesIntx10_a4 = a4;
+  passStruct17BytesIntx10_a5 = a5;
+  passStruct17BytesIntx10_a6 = a6;
+  passStruct17BytesIntx10_a7 = a7;
+  passStruct17BytesIntx10_a8 = a8;
+  passStruct17BytesIntx10_a9 = a9;
+
+  final result = passStruct17BytesIntx10CalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void passStruct17BytesIntx10AfterCallback() {
+  final result = passStruct17BytesIntx10CalculateResult();
+
+  print("after callback result = $result");
+
+  Expect.equals(15, result);
+}
+
+typedef PassStruct19BytesHomogeneousUint8x10Type = Int64 Function(
+    Struct19BytesHomogeneousUint8,
+    Struct19BytesHomogeneousUint8,
+    Struct19BytesHomogeneousUint8,
+    Struct19BytesHomogeneousUint8,
+    Struct19BytesHomogeneousUint8,
+    Struct19BytesHomogeneousUint8,
+    Struct19BytesHomogeneousUint8,
+    Struct19BytesHomogeneousUint8,
+    Struct19BytesHomogeneousUint8,
+    Struct19BytesHomogeneousUint8);
+
+// Global variables to be able to test inputs after callback returned.
+Struct19BytesHomogeneousUint8 passStruct19BytesHomogeneousUint8x10_a0 =
+    Struct19BytesHomogeneousUint8();
+Struct19BytesHomogeneousUint8 passStruct19BytesHomogeneousUint8x10_a1 =
+    Struct19BytesHomogeneousUint8();
+Struct19BytesHomogeneousUint8 passStruct19BytesHomogeneousUint8x10_a2 =
+    Struct19BytesHomogeneousUint8();
+Struct19BytesHomogeneousUint8 passStruct19BytesHomogeneousUint8x10_a3 =
+    Struct19BytesHomogeneousUint8();
+Struct19BytesHomogeneousUint8 passStruct19BytesHomogeneousUint8x10_a4 =
+    Struct19BytesHomogeneousUint8();
+Struct19BytesHomogeneousUint8 passStruct19BytesHomogeneousUint8x10_a5 =
+    Struct19BytesHomogeneousUint8();
+Struct19BytesHomogeneousUint8 passStruct19BytesHomogeneousUint8x10_a6 =
+    Struct19BytesHomogeneousUint8();
+Struct19BytesHomogeneousUint8 passStruct19BytesHomogeneousUint8x10_a7 =
+    Struct19BytesHomogeneousUint8();
+Struct19BytesHomogeneousUint8 passStruct19BytesHomogeneousUint8x10_a8 =
+    Struct19BytesHomogeneousUint8();
+Struct19BytesHomogeneousUint8 passStruct19BytesHomogeneousUint8x10_a9 =
+    Struct19BytesHomogeneousUint8();
+
+// Result variable also global, so we can delete it after the callback.
+int passStruct19BytesHomogeneousUint8x10Result = 0;
+
+int passStruct19BytesHomogeneousUint8x10CalculateResult() {
+  int result = 0;
+
+  result += passStruct19BytesHomogeneousUint8x10_a0.a0;
+  result += passStruct19BytesHomogeneousUint8x10_a0.a1;
+  result += passStruct19BytesHomogeneousUint8x10_a0.a2;
+  result += passStruct19BytesHomogeneousUint8x10_a0.a3;
+  result += passStruct19BytesHomogeneousUint8x10_a0.a4;
+  result += passStruct19BytesHomogeneousUint8x10_a0.a5;
+  result += passStruct19BytesHomogeneousUint8x10_a0.a6;
+  result += passStruct19BytesHomogeneousUint8x10_a0.a7;
+  result += passStruct19BytesHomogeneousUint8x10_a0.a8;
+  result += passStruct19BytesHomogeneousUint8x10_a0.a9;
+  result += passStruct19BytesHomogeneousUint8x10_a0.a10;
+  result += passStruct19BytesHomogeneousUint8x10_a0.a11;
+  result += passStruct19BytesHomogeneousUint8x10_a0.a12;
+  result += passStruct19BytesHomogeneousUint8x10_a0.a13;
+  result += passStruct19BytesHomogeneousUint8x10_a0.a14;
+  result += passStruct19BytesHomogeneousUint8x10_a0.a15;
+  result += passStruct19BytesHomogeneousUint8x10_a0.a16;
+  result += passStruct19BytesHomogeneousUint8x10_a0.a17;
+  result += passStruct19BytesHomogeneousUint8x10_a0.a18;
+  result += passStruct19BytesHomogeneousUint8x10_a1.a0;
+  result += passStruct19BytesHomogeneousUint8x10_a1.a1;
+  result += passStruct19BytesHomogeneousUint8x10_a1.a2;
+  result += passStruct19BytesHomogeneousUint8x10_a1.a3;
+  result += passStruct19BytesHomogeneousUint8x10_a1.a4;
+  result += passStruct19BytesHomogeneousUint8x10_a1.a5;
+  result += passStruct19BytesHomogeneousUint8x10_a1.a6;
+  result += passStruct19BytesHomogeneousUint8x10_a1.a7;
+  result += passStruct19BytesHomogeneousUint8x10_a1.a8;
+  result += passStruct19BytesHomogeneousUint8x10_a1.a9;
+  result += passStruct19BytesHomogeneousUint8x10_a1.a10;
+  result += passStruct19BytesHomogeneousUint8x10_a1.a11;
+  result += passStruct19BytesHomogeneousUint8x10_a1.a12;
+  result += passStruct19BytesHomogeneousUint8x10_a1.a13;
+  result += passStruct19BytesHomogeneousUint8x10_a1.a14;
+  result += passStruct19BytesHomogeneousUint8x10_a1.a15;
+  result += passStruct19BytesHomogeneousUint8x10_a1.a16;
+  result += passStruct19BytesHomogeneousUint8x10_a1.a17;
+  result += passStruct19BytesHomogeneousUint8x10_a1.a18;
+  result += passStruct19BytesHomogeneousUint8x10_a2.a0;
+  result += passStruct19BytesHomogeneousUint8x10_a2.a1;
+  result += passStruct19BytesHomogeneousUint8x10_a2.a2;
+  result += passStruct19BytesHomogeneousUint8x10_a2.a3;
+  result += passStruct19BytesHomogeneousUint8x10_a2.a4;
+  result += passStruct19BytesHomogeneousUint8x10_a2.a5;
+  result += passStruct19BytesHomogeneousUint8x10_a2.a6;
+  result += passStruct19BytesHomogeneousUint8x10_a2.a7;
+  result += passStruct19BytesHomogeneousUint8x10_a2.a8;
+  result += passStruct19BytesHomogeneousUint8x10_a2.a9;
+  result += passStruct19BytesHomogeneousUint8x10_a2.a10;
+  result += passStruct19BytesHomogeneousUint8x10_a2.a11;
+  result += passStruct19BytesHomogeneousUint8x10_a2.a12;
+  result += passStruct19BytesHomogeneousUint8x10_a2.a13;
+  result += passStruct19BytesHomogeneousUint8x10_a2.a14;
+  result += passStruct19BytesHomogeneousUint8x10_a2.a15;
+  result += passStruct19BytesHomogeneousUint8x10_a2.a16;
+  result += passStruct19BytesHomogeneousUint8x10_a2.a17;
+  result += passStruct19BytesHomogeneousUint8x10_a2.a18;
+  result += passStruct19BytesHomogeneousUint8x10_a3.a0;
+  result += passStruct19BytesHomogeneousUint8x10_a3.a1;
+  result += passStruct19BytesHomogeneousUint8x10_a3.a2;
+  result += passStruct19BytesHomogeneousUint8x10_a3.a3;
+  result += passStruct19BytesHomogeneousUint8x10_a3.a4;
+  result += passStruct19BytesHomogeneousUint8x10_a3.a5;
+  result += passStruct19BytesHomogeneousUint8x10_a3.a6;
+  result += passStruct19BytesHomogeneousUint8x10_a3.a7;
+  result += passStruct19BytesHomogeneousUint8x10_a3.a8;
+  result += passStruct19BytesHomogeneousUint8x10_a3.a9;
+  result += passStruct19BytesHomogeneousUint8x10_a3.a10;
+  result += passStruct19BytesHomogeneousUint8x10_a3.a11;
+  result += passStruct19BytesHomogeneousUint8x10_a3.a12;
+  result += passStruct19BytesHomogeneousUint8x10_a3.a13;
+  result += passStruct19BytesHomogeneousUint8x10_a3.a14;
+  result += passStruct19BytesHomogeneousUint8x10_a3.a15;
+  result += passStruct19BytesHomogeneousUint8x10_a3.a16;
+  result += passStruct19BytesHomogeneousUint8x10_a3.a17;
+  result += passStruct19BytesHomogeneousUint8x10_a3.a18;
+  result += passStruct19BytesHomogeneousUint8x10_a4.a0;
+  result += passStruct19BytesHomogeneousUint8x10_a4.a1;
+  result += passStruct19BytesHomogeneousUint8x10_a4.a2;
+  result += passStruct19BytesHomogeneousUint8x10_a4.a3;
+  result += passStruct19BytesHomogeneousUint8x10_a4.a4;
+  result += passStruct19BytesHomogeneousUint8x10_a4.a5;
+  result += passStruct19BytesHomogeneousUint8x10_a4.a6;
+  result += passStruct19BytesHomogeneousUint8x10_a4.a7;
+  result += passStruct19BytesHomogeneousUint8x10_a4.a8;
+  result += passStruct19BytesHomogeneousUint8x10_a4.a9;
+  result += passStruct19BytesHomogeneousUint8x10_a4.a10;
+  result += passStruct19BytesHomogeneousUint8x10_a4.a11;
+  result += passStruct19BytesHomogeneousUint8x10_a4.a12;
+  result += passStruct19BytesHomogeneousUint8x10_a4.a13;
+  result += passStruct19BytesHomogeneousUint8x10_a4.a14;
+  result += passStruct19BytesHomogeneousUint8x10_a4.a15;
+  result += passStruct19BytesHomogeneousUint8x10_a4.a16;
+  result += passStruct19BytesHomogeneousUint8x10_a4.a17;
+  result += passStruct19BytesHomogeneousUint8x10_a4.a18;
+  result += passStruct19BytesHomogeneousUint8x10_a5.a0;
+  result += passStruct19BytesHomogeneousUint8x10_a5.a1;
+  result += passStruct19BytesHomogeneousUint8x10_a5.a2;
+  result += passStruct19BytesHomogeneousUint8x10_a5.a3;
+  result += passStruct19BytesHomogeneousUint8x10_a5.a4;
+  result += passStruct19BytesHomogeneousUint8x10_a5.a5;
+  result += passStruct19BytesHomogeneousUint8x10_a5.a6;
+  result += passStruct19BytesHomogeneousUint8x10_a5.a7;
+  result += passStruct19BytesHomogeneousUint8x10_a5.a8;
+  result += passStruct19BytesHomogeneousUint8x10_a5.a9;
+  result += passStruct19BytesHomogeneousUint8x10_a5.a10;
+  result += passStruct19BytesHomogeneousUint8x10_a5.a11;
+  result += passStruct19BytesHomogeneousUint8x10_a5.a12;
+  result += passStruct19BytesHomogeneousUint8x10_a5.a13;
+  result += passStruct19BytesHomogeneousUint8x10_a5.a14;
+  result += passStruct19BytesHomogeneousUint8x10_a5.a15;
+  result += passStruct19BytesHomogeneousUint8x10_a5.a16;
+  result += passStruct19BytesHomogeneousUint8x10_a5.a17;
+  result += passStruct19BytesHomogeneousUint8x10_a5.a18;
+  result += passStruct19BytesHomogeneousUint8x10_a6.a0;
+  result += passStruct19BytesHomogeneousUint8x10_a6.a1;
+  result += passStruct19BytesHomogeneousUint8x10_a6.a2;
+  result += passStruct19BytesHomogeneousUint8x10_a6.a3;
+  result += passStruct19BytesHomogeneousUint8x10_a6.a4;
+  result += passStruct19BytesHomogeneousUint8x10_a6.a5;
+  result += passStruct19BytesHomogeneousUint8x10_a6.a6;
+  result += passStruct19BytesHomogeneousUint8x10_a6.a7;
+  result += passStruct19BytesHomogeneousUint8x10_a6.a8;
+  result += passStruct19BytesHomogeneousUint8x10_a6.a9;
+  result += passStruct19BytesHomogeneousUint8x10_a6.a10;
+  result += passStruct19BytesHomogeneousUint8x10_a6.a11;
+  result += passStruct19BytesHomogeneousUint8x10_a6.a12;
+  result += passStruct19BytesHomogeneousUint8x10_a6.a13;
+  result += passStruct19BytesHomogeneousUint8x10_a6.a14;
+  result += passStruct19BytesHomogeneousUint8x10_a6.a15;
+  result += passStruct19BytesHomogeneousUint8x10_a6.a16;
+  result += passStruct19BytesHomogeneousUint8x10_a6.a17;
+  result += passStruct19BytesHomogeneousUint8x10_a6.a18;
+  result += passStruct19BytesHomogeneousUint8x10_a7.a0;
+  result += passStruct19BytesHomogeneousUint8x10_a7.a1;
+  result += passStruct19BytesHomogeneousUint8x10_a7.a2;
+  result += passStruct19BytesHomogeneousUint8x10_a7.a3;
+  result += passStruct19BytesHomogeneousUint8x10_a7.a4;
+  result += passStruct19BytesHomogeneousUint8x10_a7.a5;
+  result += passStruct19BytesHomogeneousUint8x10_a7.a6;
+  result += passStruct19BytesHomogeneousUint8x10_a7.a7;
+  result += passStruct19BytesHomogeneousUint8x10_a7.a8;
+  result += passStruct19BytesHomogeneousUint8x10_a7.a9;
+  result += passStruct19BytesHomogeneousUint8x10_a7.a10;
+  result += passStruct19BytesHomogeneousUint8x10_a7.a11;
+  result += passStruct19BytesHomogeneousUint8x10_a7.a12;
+  result += passStruct19BytesHomogeneousUint8x10_a7.a13;
+  result += passStruct19BytesHomogeneousUint8x10_a7.a14;
+  result += passStruct19BytesHomogeneousUint8x10_a7.a15;
+  result += passStruct19BytesHomogeneousUint8x10_a7.a16;
+  result += passStruct19BytesHomogeneousUint8x10_a7.a17;
+  result += passStruct19BytesHomogeneousUint8x10_a7.a18;
+  result += passStruct19BytesHomogeneousUint8x10_a8.a0;
+  result += passStruct19BytesHomogeneousUint8x10_a8.a1;
+  result += passStruct19BytesHomogeneousUint8x10_a8.a2;
+  result += passStruct19BytesHomogeneousUint8x10_a8.a3;
+  result += passStruct19BytesHomogeneousUint8x10_a8.a4;
+  result += passStruct19BytesHomogeneousUint8x10_a8.a5;
+  result += passStruct19BytesHomogeneousUint8x10_a8.a6;
+  result += passStruct19BytesHomogeneousUint8x10_a8.a7;
+  result += passStruct19BytesHomogeneousUint8x10_a8.a8;
+  result += passStruct19BytesHomogeneousUint8x10_a8.a9;
+  result += passStruct19BytesHomogeneousUint8x10_a8.a10;
+  result += passStruct19BytesHomogeneousUint8x10_a8.a11;
+  result += passStruct19BytesHomogeneousUint8x10_a8.a12;
+  result += passStruct19BytesHomogeneousUint8x10_a8.a13;
+  result += passStruct19BytesHomogeneousUint8x10_a8.a14;
+  result += passStruct19BytesHomogeneousUint8x10_a8.a15;
+  result += passStruct19BytesHomogeneousUint8x10_a8.a16;
+  result += passStruct19BytesHomogeneousUint8x10_a8.a17;
+  result += passStruct19BytesHomogeneousUint8x10_a8.a18;
+  result += passStruct19BytesHomogeneousUint8x10_a9.a0;
+  result += passStruct19BytesHomogeneousUint8x10_a9.a1;
+  result += passStruct19BytesHomogeneousUint8x10_a9.a2;
+  result += passStruct19BytesHomogeneousUint8x10_a9.a3;
+  result += passStruct19BytesHomogeneousUint8x10_a9.a4;
+  result += passStruct19BytesHomogeneousUint8x10_a9.a5;
+  result += passStruct19BytesHomogeneousUint8x10_a9.a6;
+  result += passStruct19BytesHomogeneousUint8x10_a9.a7;
+  result += passStruct19BytesHomogeneousUint8x10_a9.a8;
+  result += passStruct19BytesHomogeneousUint8x10_a9.a9;
+  result += passStruct19BytesHomogeneousUint8x10_a9.a10;
+  result += passStruct19BytesHomogeneousUint8x10_a9.a11;
+  result += passStruct19BytesHomogeneousUint8x10_a9.a12;
+  result += passStruct19BytesHomogeneousUint8x10_a9.a13;
+  result += passStruct19BytesHomogeneousUint8x10_a9.a14;
+  result += passStruct19BytesHomogeneousUint8x10_a9.a15;
+  result += passStruct19BytesHomogeneousUint8x10_a9.a16;
+  result += passStruct19BytesHomogeneousUint8x10_a9.a17;
+  result += passStruct19BytesHomogeneousUint8x10_a9.a18;
+
+  passStruct19BytesHomogeneousUint8x10Result = result;
+
+  return result;
+}
+
+/// The minimum alignment of this struct is only 1 byte based on its fields.
+/// Test that the memory backing these structs is extended to the right size.
+///
+int passStruct19BytesHomogeneousUint8x10(
+    Struct19BytesHomogeneousUint8 a0,
+    Struct19BytesHomogeneousUint8 a1,
+    Struct19BytesHomogeneousUint8 a2,
+    Struct19BytesHomogeneousUint8 a3,
+    Struct19BytesHomogeneousUint8 a4,
+    Struct19BytesHomogeneousUint8 a5,
+    Struct19BytesHomogeneousUint8 a6,
+    Struct19BytesHomogeneousUint8 a7,
+    Struct19BytesHomogeneousUint8 a8,
+    Struct19BytesHomogeneousUint8 a9) {
+  print(
+      "passStruct19BytesHomogeneousUint8x10(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5}, ${a6}, ${a7}, ${a8}, ${a9})");
+
+  // In legacy mode, possibly return null.
+  if (a0.a0 == 84) {
+    print("returning null!");
+    return null;
+  }
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0.a0 == 42 || a0.a0 == 84) {
+    print("throwing!");
+    throw Exception(
+        "PassStruct19BytesHomogeneousUint8x10 throwing on purpuse!");
+  }
+
+  passStruct19BytesHomogeneousUint8x10_a0 = a0;
+  passStruct19BytesHomogeneousUint8x10_a1 = a1;
+  passStruct19BytesHomogeneousUint8x10_a2 = a2;
+  passStruct19BytesHomogeneousUint8x10_a3 = a3;
+  passStruct19BytesHomogeneousUint8x10_a4 = a4;
+  passStruct19BytesHomogeneousUint8x10_a5 = a5;
+  passStruct19BytesHomogeneousUint8x10_a6 = a6;
+  passStruct19BytesHomogeneousUint8x10_a7 = a7;
+  passStruct19BytesHomogeneousUint8x10_a8 = a8;
+  passStruct19BytesHomogeneousUint8x10_a9 = a9;
+
+  final result = passStruct19BytesHomogeneousUint8x10CalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void passStruct19BytesHomogeneousUint8x10AfterCallback() {
+  final result = passStruct19BytesHomogeneousUint8x10CalculateResult();
+
+  print("after callback result = $result");
+
+  Expect.equals(18145, result);
+}
+
+typedef PassStruct20BytesHomogeneousInt32x10Type = Int32 Function(
+    Struct20BytesHomogeneousInt32,
+    Struct20BytesHomogeneousInt32,
+    Struct20BytesHomogeneousInt32,
+    Struct20BytesHomogeneousInt32,
+    Struct20BytesHomogeneousInt32,
+    Struct20BytesHomogeneousInt32,
+    Struct20BytesHomogeneousInt32,
+    Struct20BytesHomogeneousInt32,
+    Struct20BytesHomogeneousInt32,
+    Struct20BytesHomogeneousInt32);
+
+// Global variables to be able to test inputs after callback returned.
+Struct20BytesHomogeneousInt32 passStruct20BytesHomogeneousInt32x10_a0 =
+    Struct20BytesHomogeneousInt32();
+Struct20BytesHomogeneousInt32 passStruct20BytesHomogeneousInt32x10_a1 =
+    Struct20BytesHomogeneousInt32();
+Struct20BytesHomogeneousInt32 passStruct20BytesHomogeneousInt32x10_a2 =
+    Struct20BytesHomogeneousInt32();
+Struct20BytesHomogeneousInt32 passStruct20BytesHomogeneousInt32x10_a3 =
+    Struct20BytesHomogeneousInt32();
+Struct20BytesHomogeneousInt32 passStruct20BytesHomogeneousInt32x10_a4 =
+    Struct20BytesHomogeneousInt32();
+Struct20BytesHomogeneousInt32 passStruct20BytesHomogeneousInt32x10_a5 =
+    Struct20BytesHomogeneousInt32();
+Struct20BytesHomogeneousInt32 passStruct20BytesHomogeneousInt32x10_a6 =
+    Struct20BytesHomogeneousInt32();
+Struct20BytesHomogeneousInt32 passStruct20BytesHomogeneousInt32x10_a7 =
+    Struct20BytesHomogeneousInt32();
+Struct20BytesHomogeneousInt32 passStruct20BytesHomogeneousInt32x10_a8 =
+    Struct20BytesHomogeneousInt32();
+Struct20BytesHomogeneousInt32 passStruct20BytesHomogeneousInt32x10_a9 =
+    Struct20BytesHomogeneousInt32();
+
+// Result variable also global, so we can delete it after the callback.
+int passStruct20BytesHomogeneousInt32x10Result = 0;
+
+int passStruct20BytesHomogeneousInt32x10CalculateResult() {
+  int result = 0;
+
+  result += passStruct20BytesHomogeneousInt32x10_a0.a0;
+  result += passStruct20BytesHomogeneousInt32x10_a0.a1;
+  result += passStruct20BytesHomogeneousInt32x10_a0.a2;
+  result += passStruct20BytesHomogeneousInt32x10_a0.a3;
+  result += passStruct20BytesHomogeneousInt32x10_a0.a4;
+  result += passStruct20BytesHomogeneousInt32x10_a1.a0;
+  result += passStruct20BytesHomogeneousInt32x10_a1.a1;
+  result += passStruct20BytesHomogeneousInt32x10_a1.a2;
+  result += passStruct20BytesHomogeneousInt32x10_a1.a3;
+  result += passStruct20BytesHomogeneousInt32x10_a1.a4;
+  result += passStruct20BytesHomogeneousInt32x10_a2.a0;
+  result += passStruct20BytesHomogeneousInt32x10_a2.a1;
+  result += passStruct20BytesHomogeneousInt32x10_a2.a2;
+  result += passStruct20BytesHomogeneousInt32x10_a2.a3;
+  result += passStruct20BytesHomogeneousInt32x10_a2.a4;
+  result += passStruct20BytesHomogeneousInt32x10_a3.a0;
+  result += passStruct20BytesHomogeneousInt32x10_a3.a1;
+  result += passStruct20BytesHomogeneousInt32x10_a3.a2;
+  result += passStruct20BytesHomogeneousInt32x10_a3.a3;
+  result += passStruct20BytesHomogeneousInt32x10_a3.a4;
+  result += passStruct20BytesHomogeneousInt32x10_a4.a0;
+  result += passStruct20BytesHomogeneousInt32x10_a4.a1;
+  result += passStruct20BytesHomogeneousInt32x10_a4.a2;
+  result += passStruct20BytesHomogeneousInt32x10_a4.a3;
+  result += passStruct20BytesHomogeneousInt32x10_a4.a4;
+  result += passStruct20BytesHomogeneousInt32x10_a5.a0;
+  result += passStruct20BytesHomogeneousInt32x10_a5.a1;
+  result += passStruct20BytesHomogeneousInt32x10_a5.a2;
+  result += passStruct20BytesHomogeneousInt32x10_a5.a3;
+  result += passStruct20BytesHomogeneousInt32x10_a5.a4;
+  result += passStruct20BytesHomogeneousInt32x10_a6.a0;
+  result += passStruct20BytesHomogeneousInt32x10_a6.a1;
+  result += passStruct20BytesHomogeneousInt32x10_a6.a2;
+  result += passStruct20BytesHomogeneousInt32x10_a6.a3;
+  result += passStruct20BytesHomogeneousInt32x10_a6.a4;
+  result += passStruct20BytesHomogeneousInt32x10_a7.a0;
+  result += passStruct20BytesHomogeneousInt32x10_a7.a1;
+  result += passStruct20BytesHomogeneousInt32x10_a7.a2;
+  result += passStruct20BytesHomogeneousInt32x10_a7.a3;
+  result += passStruct20BytesHomogeneousInt32x10_a7.a4;
+  result += passStruct20BytesHomogeneousInt32x10_a8.a0;
+  result += passStruct20BytesHomogeneousInt32x10_a8.a1;
+  result += passStruct20BytesHomogeneousInt32x10_a8.a2;
+  result += passStruct20BytesHomogeneousInt32x10_a8.a3;
+  result += passStruct20BytesHomogeneousInt32x10_a8.a4;
+  result += passStruct20BytesHomogeneousInt32x10_a9.a0;
+  result += passStruct20BytesHomogeneousInt32x10_a9.a1;
+  result += passStruct20BytesHomogeneousInt32x10_a9.a2;
+  result += passStruct20BytesHomogeneousInt32x10_a9.a3;
+  result += passStruct20BytesHomogeneousInt32x10_a9.a4;
+
+  passStruct20BytesHomogeneousInt32x10Result = result;
+
+  return result;
+}
+
+/// Argument too big to go into integer registers on arm64.
+/// The arguments are passed as pointers to copies.
+/// The amount of arguments exhausts the number of integer registers, such that
+/// pointers to copies are also passed on the stack.
+int passStruct20BytesHomogeneousInt32x10(
+    Struct20BytesHomogeneousInt32 a0,
+    Struct20BytesHomogeneousInt32 a1,
+    Struct20BytesHomogeneousInt32 a2,
+    Struct20BytesHomogeneousInt32 a3,
+    Struct20BytesHomogeneousInt32 a4,
+    Struct20BytesHomogeneousInt32 a5,
+    Struct20BytesHomogeneousInt32 a6,
+    Struct20BytesHomogeneousInt32 a7,
+    Struct20BytesHomogeneousInt32 a8,
+    Struct20BytesHomogeneousInt32 a9) {
+  print(
+      "passStruct20BytesHomogeneousInt32x10(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5}, ${a6}, ${a7}, ${a8}, ${a9})");
+
+  // In legacy mode, possibly return null.
+  if (a0.a0 == 84) {
+    print("returning null!");
+    return null;
+  }
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0.a0 == 42 || a0.a0 == 84) {
+    print("throwing!");
+    throw Exception(
+        "PassStruct20BytesHomogeneousInt32x10 throwing on purpuse!");
+  }
+
+  passStruct20BytesHomogeneousInt32x10_a0 = a0;
+  passStruct20BytesHomogeneousInt32x10_a1 = a1;
+  passStruct20BytesHomogeneousInt32x10_a2 = a2;
+  passStruct20BytesHomogeneousInt32x10_a3 = a3;
+  passStruct20BytesHomogeneousInt32x10_a4 = a4;
+  passStruct20BytesHomogeneousInt32x10_a5 = a5;
+  passStruct20BytesHomogeneousInt32x10_a6 = a6;
+  passStruct20BytesHomogeneousInt32x10_a7 = a7;
+  passStruct20BytesHomogeneousInt32x10_a8 = a8;
+  passStruct20BytesHomogeneousInt32x10_a9 = a9;
+
+  final result = passStruct20BytesHomogeneousInt32x10CalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void passStruct20BytesHomogeneousInt32x10AfterCallback() {
+  final result = passStruct20BytesHomogeneousInt32x10CalculateResult();
+
+  print("after callback result = $result");
+
+  Expect.equals(25, result);
+}
+
+typedef PassStruct20BytesHomogeneousFloatType = Float Function(
+    Struct20BytesHomogeneousFloat);
+
+// Global variables to be able to test inputs after callback returned.
+Struct20BytesHomogeneousFloat passStruct20BytesHomogeneousFloat_a0 =
+    Struct20BytesHomogeneousFloat();
+
+// Result variable also global, so we can delete it after the callback.
+double passStruct20BytesHomogeneousFloatResult = 0.0;
+
+double passStruct20BytesHomogeneousFloatCalculateResult() {
+  double result = 0;
+
+  result += passStruct20BytesHomogeneousFloat_a0.a0;
+  result += passStruct20BytesHomogeneousFloat_a0.a1;
+  result += passStruct20BytesHomogeneousFloat_a0.a2;
+  result += passStruct20BytesHomogeneousFloat_a0.a3;
+  result += passStruct20BytesHomogeneousFloat_a0.a4;
+
+  passStruct20BytesHomogeneousFloatResult = result;
+
+  return result;
+}
+
+/// Argument too big to go into FPU registers in hardfp and arm64.
+double passStruct20BytesHomogeneousFloat(Struct20BytesHomogeneousFloat a0) {
+  print("passStruct20BytesHomogeneousFloat(${a0})");
+
+  // In legacy mode, possibly return null.
+  if (a0.a0 == 84) {
+    print("returning null!");
+    return null;
+  }
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0.a0 == 42 || a0.a0 == 84) {
+    print("throwing!");
+    throw Exception("PassStruct20BytesHomogeneousFloat throwing on purpuse!");
+  }
+
+  passStruct20BytesHomogeneousFloat_a0 = a0;
+
+  final result = passStruct20BytesHomogeneousFloatCalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void passStruct20BytesHomogeneousFloatAfterCallback() {
+  final result = passStruct20BytesHomogeneousFloatCalculateResult();
+
+  print("after callback result = $result");
+
+  Expect.approxEquals(-3.0, result);
+}
+
+typedef PassStruct32BytesHomogeneousDoublex5Type = Double Function(
+    Struct32BytesHomogeneousDouble,
+    Struct32BytesHomogeneousDouble,
+    Struct32BytesHomogeneousDouble,
+    Struct32BytesHomogeneousDouble,
+    Struct32BytesHomogeneousDouble);
+
+// Global variables to be able to test inputs after callback returned.
+Struct32BytesHomogeneousDouble passStruct32BytesHomogeneousDoublex5_a0 =
+    Struct32BytesHomogeneousDouble();
+Struct32BytesHomogeneousDouble passStruct32BytesHomogeneousDoublex5_a1 =
+    Struct32BytesHomogeneousDouble();
+Struct32BytesHomogeneousDouble passStruct32BytesHomogeneousDoublex5_a2 =
+    Struct32BytesHomogeneousDouble();
+Struct32BytesHomogeneousDouble passStruct32BytesHomogeneousDoublex5_a3 =
+    Struct32BytesHomogeneousDouble();
+Struct32BytesHomogeneousDouble passStruct32BytesHomogeneousDoublex5_a4 =
+    Struct32BytesHomogeneousDouble();
+
+// Result variable also global, so we can delete it after the callback.
+double passStruct32BytesHomogeneousDoublex5Result = 0.0;
+
+double passStruct32BytesHomogeneousDoublex5CalculateResult() {
+  double result = 0;
+
+  result += passStruct32BytesHomogeneousDoublex5_a0.a0;
+  result += passStruct32BytesHomogeneousDoublex5_a0.a1;
+  result += passStruct32BytesHomogeneousDoublex5_a0.a2;
+  result += passStruct32BytesHomogeneousDoublex5_a0.a3;
+  result += passStruct32BytesHomogeneousDoublex5_a1.a0;
+  result += passStruct32BytesHomogeneousDoublex5_a1.a1;
+  result += passStruct32BytesHomogeneousDoublex5_a1.a2;
+  result += passStruct32BytesHomogeneousDoublex5_a1.a3;
+  result += passStruct32BytesHomogeneousDoublex5_a2.a0;
+  result += passStruct32BytesHomogeneousDoublex5_a2.a1;
+  result += passStruct32BytesHomogeneousDoublex5_a2.a2;
+  result += passStruct32BytesHomogeneousDoublex5_a2.a3;
+  result += passStruct32BytesHomogeneousDoublex5_a3.a0;
+  result += passStruct32BytesHomogeneousDoublex5_a3.a1;
+  result += passStruct32BytesHomogeneousDoublex5_a3.a2;
+  result += passStruct32BytesHomogeneousDoublex5_a3.a3;
+  result += passStruct32BytesHomogeneousDoublex5_a4.a0;
+  result += passStruct32BytesHomogeneousDoublex5_a4.a1;
+  result += passStruct32BytesHomogeneousDoublex5_a4.a2;
+  result += passStruct32BytesHomogeneousDoublex5_a4.a3;
+
+  passStruct32BytesHomogeneousDoublex5Result = result;
+
+  return result;
+}
+
+/// Arguments in FPU registers on arm64.
+/// 5 struct arguments will exhaust available registers.
+double passStruct32BytesHomogeneousDoublex5(
+    Struct32BytesHomogeneousDouble a0,
+    Struct32BytesHomogeneousDouble a1,
+    Struct32BytesHomogeneousDouble a2,
+    Struct32BytesHomogeneousDouble a3,
+    Struct32BytesHomogeneousDouble a4) {
+  print(
+      "passStruct32BytesHomogeneousDoublex5(${a0}, ${a1}, ${a2}, ${a3}, ${a4})");
+
+  // In legacy mode, possibly return null.
+  if (a0.a0 == 84) {
+    print("returning null!");
+    return null;
+  }
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0.a0 == 42 || a0.a0 == 84) {
+    print("throwing!");
+    throw Exception(
+        "PassStruct32BytesHomogeneousDoublex5 throwing on purpuse!");
+  }
+
+  passStruct32BytesHomogeneousDoublex5_a0 = a0;
+  passStruct32BytesHomogeneousDoublex5_a1 = a1;
+  passStruct32BytesHomogeneousDoublex5_a2 = a2;
+  passStruct32BytesHomogeneousDoublex5_a3 = a3;
+  passStruct32BytesHomogeneousDoublex5_a4 = a4;
+
+  final result = passStruct32BytesHomogeneousDoublex5CalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void passStruct32BytesHomogeneousDoublex5AfterCallback() {
+  final result = passStruct32BytesHomogeneousDoublex5CalculateResult();
+
+  print("after callback result = $result");
+
+  Expect.approxEquals(10.0, result);
+}
+
+typedef PassStruct40BytesHomogeneousDoubleType = Double Function(
+    Struct40BytesHomogeneousDouble);
+
+// Global variables to be able to test inputs after callback returned.
+Struct40BytesHomogeneousDouble passStruct40BytesHomogeneousDouble_a0 =
+    Struct40BytesHomogeneousDouble();
+
+// Result variable also global, so we can delete it after the callback.
+double passStruct40BytesHomogeneousDoubleResult = 0.0;
+
+double passStruct40BytesHomogeneousDoubleCalculateResult() {
+  double result = 0;
+
+  result += passStruct40BytesHomogeneousDouble_a0.a0;
+  result += passStruct40BytesHomogeneousDouble_a0.a1;
+  result += passStruct40BytesHomogeneousDouble_a0.a2;
+  result += passStruct40BytesHomogeneousDouble_a0.a3;
+  result += passStruct40BytesHomogeneousDouble_a0.a4;
+
+  passStruct40BytesHomogeneousDoubleResult = result;
+
+  return result;
+}
+
+/// Argument too big to go into FPU registers in arm64.
+double passStruct40BytesHomogeneousDouble(Struct40BytesHomogeneousDouble a0) {
+  print("passStruct40BytesHomogeneousDouble(${a0})");
+
+  // In legacy mode, possibly return null.
+  if (a0.a0 == 84) {
+    print("returning null!");
+    return null;
+  }
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0.a0 == 42 || a0.a0 == 84) {
+    print("throwing!");
+    throw Exception("PassStruct40BytesHomogeneousDouble throwing on purpuse!");
+  }
+
+  passStruct40BytesHomogeneousDouble_a0 = a0;
+
+  final result = passStruct40BytesHomogeneousDoubleCalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void passStruct40BytesHomogeneousDoubleAfterCallback() {
+  final result = passStruct40BytesHomogeneousDoubleCalculateResult();
+
+  print("after callback result = $result");
+
+  Expect.approxEquals(-3.0, result);
+}
+
+typedef PassStruct1024BytesHomogeneousUint64Type = Uint64 Function(
+    Struct1024BytesHomogeneousUint64);
+
+// Global variables to be able to test inputs after callback returned.
+Struct1024BytesHomogeneousUint64 passStruct1024BytesHomogeneousUint64_a0 =
+    Struct1024BytesHomogeneousUint64();
+
+// Result variable also global, so we can delete it after the callback.
+int passStruct1024BytesHomogeneousUint64Result = 0;
+
+int passStruct1024BytesHomogeneousUint64CalculateResult() {
+  int result = 0;
+
+  result += passStruct1024BytesHomogeneousUint64_a0.a0;
+  result += passStruct1024BytesHomogeneousUint64_a0.a1;
+  result += passStruct1024BytesHomogeneousUint64_a0.a2;
+  result += passStruct1024BytesHomogeneousUint64_a0.a3;
+  result += passStruct1024BytesHomogeneousUint64_a0.a4;
+  result += passStruct1024BytesHomogeneousUint64_a0.a5;
+  result += passStruct1024BytesHomogeneousUint64_a0.a6;
+  result += passStruct1024BytesHomogeneousUint64_a0.a7;
+  result += passStruct1024BytesHomogeneousUint64_a0.a8;
+  result += passStruct1024BytesHomogeneousUint64_a0.a9;
+  result += passStruct1024BytesHomogeneousUint64_a0.a10;
+  result += passStruct1024BytesHomogeneousUint64_a0.a11;
+  result += passStruct1024BytesHomogeneousUint64_a0.a12;
+  result += passStruct1024BytesHomogeneousUint64_a0.a13;
+  result += passStruct1024BytesHomogeneousUint64_a0.a14;
+  result += passStruct1024BytesHomogeneousUint64_a0.a15;
+  result += passStruct1024BytesHomogeneousUint64_a0.a16;
+  result += passStruct1024BytesHomogeneousUint64_a0.a17;
+  result += passStruct1024BytesHomogeneousUint64_a0.a18;
+  result += passStruct1024BytesHomogeneousUint64_a0.a19;
+  result += passStruct1024BytesHomogeneousUint64_a0.a20;
+  result += passStruct1024BytesHomogeneousUint64_a0.a21;
+  result += passStruct1024BytesHomogeneousUint64_a0.a22;
+  result += passStruct1024BytesHomogeneousUint64_a0.a23;
+  result += passStruct1024BytesHomogeneousUint64_a0.a24;
+  result += passStruct1024BytesHomogeneousUint64_a0.a25;
+  result += passStruct1024BytesHomogeneousUint64_a0.a26;
+  result += passStruct1024BytesHomogeneousUint64_a0.a27;
+  result += passStruct1024BytesHomogeneousUint64_a0.a28;
+  result += passStruct1024BytesHomogeneousUint64_a0.a29;
+  result += passStruct1024BytesHomogeneousUint64_a0.a30;
+  result += passStruct1024BytesHomogeneousUint64_a0.a31;
+  result += passStruct1024BytesHomogeneousUint64_a0.a32;
+  result += passStruct1024BytesHomogeneousUint64_a0.a33;
+  result += passStruct1024BytesHomogeneousUint64_a0.a34;
+  result += passStruct1024BytesHomogeneousUint64_a0.a35;
+  result += passStruct1024BytesHomogeneousUint64_a0.a36;
+  result += passStruct1024BytesHomogeneousUint64_a0.a37;
+  result += passStruct1024BytesHomogeneousUint64_a0.a38;
+  result += passStruct1024BytesHomogeneousUint64_a0.a39;
+  result += passStruct1024BytesHomogeneousUint64_a0.a40;
+  result += passStruct1024BytesHomogeneousUint64_a0.a41;
+  result += passStruct1024BytesHomogeneousUint64_a0.a42;
+  result += passStruct1024BytesHomogeneousUint64_a0.a43;
+  result += passStruct1024BytesHomogeneousUint64_a0.a44;
+  result += passStruct1024BytesHomogeneousUint64_a0.a45;
+  result += passStruct1024BytesHomogeneousUint64_a0.a46;
+  result += passStruct1024BytesHomogeneousUint64_a0.a47;
+  result += passStruct1024BytesHomogeneousUint64_a0.a48;
+  result += passStruct1024BytesHomogeneousUint64_a0.a49;
+  result += passStruct1024BytesHomogeneousUint64_a0.a50;
+  result += passStruct1024BytesHomogeneousUint64_a0.a51;
+  result += passStruct1024BytesHomogeneousUint64_a0.a52;
+  result += passStruct1024BytesHomogeneousUint64_a0.a53;
+  result += passStruct1024BytesHomogeneousUint64_a0.a54;
+  result += passStruct1024BytesHomogeneousUint64_a0.a55;
+  result += passStruct1024BytesHomogeneousUint64_a0.a56;
+  result += passStruct1024BytesHomogeneousUint64_a0.a57;
+  result += passStruct1024BytesHomogeneousUint64_a0.a58;
+  result += passStruct1024BytesHomogeneousUint64_a0.a59;
+  result += passStruct1024BytesHomogeneousUint64_a0.a60;
+  result += passStruct1024BytesHomogeneousUint64_a0.a61;
+  result += passStruct1024BytesHomogeneousUint64_a0.a62;
+  result += passStruct1024BytesHomogeneousUint64_a0.a63;
+  result += passStruct1024BytesHomogeneousUint64_a0.a64;
+  result += passStruct1024BytesHomogeneousUint64_a0.a65;
+  result += passStruct1024BytesHomogeneousUint64_a0.a66;
+  result += passStruct1024BytesHomogeneousUint64_a0.a67;
+  result += passStruct1024BytesHomogeneousUint64_a0.a68;
+  result += passStruct1024BytesHomogeneousUint64_a0.a69;
+  result += passStruct1024BytesHomogeneousUint64_a0.a70;
+  result += passStruct1024BytesHomogeneousUint64_a0.a71;
+  result += passStruct1024BytesHomogeneousUint64_a0.a72;
+  result += passStruct1024BytesHomogeneousUint64_a0.a73;
+  result += passStruct1024BytesHomogeneousUint64_a0.a74;
+  result += passStruct1024BytesHomogeneousUint64_a0.a75;
+  result += passStruct1024BytesHomogeneousUint64_a0.a76;
+  result += passStruct1024BytesHomogeneousUint64_a0.a77;
+  result += passStruct1024BytesHomogeneousUint64_a0.a78;
+  result += passStruct1024BytesHomogeneousUint64_a0.a79;
+  result += passStruct1024BytesHomogeneousUint64_a0.a80;
+  result += passStruct1024BytesHomogeneousUint64_a0.a81;
+  result += passStruct1024BytesHomogeneousUint64_a0.a82;
+  result += passStruct1024BytesHomogeneousUint64_a0.a83;
+  result += passStruct1024BytesHomogeneousUint64_a0.a84;
+  result += passStruct1024BytesHomogeneousUint64_a0.a85;
+  result += passStruct1024BytesHomogeneousUint64_a0.a86;
+  result += passStruct1024BytesHomogeneousUint64_a0.a87;
+  result += passStruct1024BytesHomogeneousUint64_a0.a88;
+  result += passStruct1024BytesHomogeneousUint64_a0.a89;
+  result += passStruct1024BytesHomogeneousUint64_a0.a90;
+  result += passStruct1024BytesHomogeneousUint64_a0.a91;
+  result += passStruct1024BytesHomogeneousUint64_a0.a92;
+  result += passStruct1024BytesHomogeneousUint64_a0.a93;
+  result += passStruct1024BytesHomogeneousUint64_a0.a94;
+  result += passStruct1024BytesHomogeneousUint64_a0.a95;
+  result += passStruct1024BytesHomogeneousUint64_a0.a96;
+  result += passStruct1024BytesHomogeneousUint64_a0.a97;
+  result += passStruct1024BytesHomogeneousUint64_a0.a98;
+  result += passStruct1024BytesHomogeneousUint64_a0.a99;
+  result += passStruct1024BytesHomogeneousUint64_a0.a100;
+  result += passStruct1024BytesHomogeneousUint64_a0.a101;
+  result += passStruct1024BytesHomogeneousUint64_a0.a102;
+  result += passStruct1024BytesHomogeneousUint64_a0.a103;
+  result += passStruct1024BytesHomogeneousUint64_a0.a104;
+  result += passStruct1024BytesHomogeneousUint64_a0.a105;
+  result += passStruct1024BytesHomogeneousUint64_a0.a106;
+  result += passStruct1024BytesHomogeneousUint64_a0.a107;
+  result += passStruct1024BytesHomogeneousUint64_a0.a108;
+  result += passStruct1024BytesHomogeneousUint64_a0.a109;
+  result += passStruct1024BytesHomogeneousUint64_a0.a110;
+  result += passStruct1024BytesHomogeneousUint64_a0.a111;
+  result += passStruct1024BytesHomogeneousUint64_a0.a112;
+  result += passStruct1024BytesHomogeneousUint64_a0.a113;
+  result += passStruct1024BytesHomogeneousUint64_a0.a114;
+  result += passStruct1024BytesHomogeneousUint64_a0.a115;
+  result += passStruct1024BytesHomogeneousUint64_a0.a116;
+  result += passStruct1024BytesHomogeneousUint64_a0.a117;
+  result += passStruct1024BytesHomogeneousUint64_a0.a118;
+  result += passStruct1024BytesHomogeneousUint64_a0.a119;
+  result += passStruct1024BytesHomogeneousUint64_a0.a120;
+  result += passStruct1024BytesHomogeneousUint64_a0.a121;
+  result += passStruct1024BytesHomogeneousUint64_a0.a122;
+  result += passStruct1024BytesHomogeneousUint64_a0.a123;
+  result += passStruct1024BytesHomogeneousUint64_a0.a124;
+  result += passStruct1024BytesHomogeneousUint64_a0.a125;
+  result += passStruct1024BytesHomogeneousUint64_a0.a126;
+  result += passStruct1024BytesHomogeneousUint64_a0.a127;
+
+  passStruct1024BytesHomogeneousUint64Result = result;
+
+  return result;
+}
+
+/// Test 1kb struct.
+int passStruct1024BytesHomogeneousUint64(Struct1024BytesHomogeneousUint64 a0) {
+  print("passStruct1024BytesHomogeneousUint64(${a0})");
+
+  // In legacy mode, possibly return null.
+  if (a0.a0 == 84) {
+    print("returning null!");
+    return null;
+  }
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0.a0 == 42 || a0.a0 == 84) {
+    print("throwing!");
+    throw Exception(
+        "PassStruct1024BytesHomogeneousUint64 throwing on purpuse!");
+  }
+
+  passStruct1024BytesHomogeneousUint64_a0 = a0;
+
+  final result = passStruct1024BytesHomogeneousUint64CalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void passStruct1024BytesHomogeneousUint64AfterCallback() {
+  final result = passStruct1024BytesHomogeneousUint64CalculateResult();
+
+  print("after callback result = $result");
+
+  Expect.equals(8256, result);
+}
+
+typedef PassFloatStruct16BytesHomogeneousFloatFloatStruct1Type = Float Function(
+    Float,
+    Struct16BytesHomogeneousFloat,
+    Float,
+    Struct16BytesHomogeneousFloat,
+    Float,
+    Struct16BytesHomogeneousFloat,
+    Float,
+    Struct16BytesHomogeneousFloat,
+    Float);
+
+// Global variables to be able to test inputs after callback returned.
+double passFloatStruct16BytesHomogeneousFloatFloatStruct1_a0 = 0.0;
+Struct16BytesHomogeneousFloat
+    passFloatStruct16BytesHomogeneousFloatFloatStruct1_a1 =
+    Struct16BytesHomogeneousFloat();
+double passFloatStruct16BytesHomogeneousFloatFloatStruct1_a2 = 0.0;
+Struct16BytesHomogeneousFloat
+    passFloatStruct16BytesHomogeneousFloatFloatStruct1_a3 =
+    Struct16BytesHomogeneousFloat();
+double passFloatStruct16BytesHomogeneousFloatFloatStruct1_a4 = 0.0;
+Struct16BytesHomogeneousFloat
+    passFloatStruct16BytesHomogeneousFloatFloatStruct1_a5 =
+    Struct16BytesHomogeneousFloat();
+double passFloatStruct16BytesHomogeneousFloatFloatStruct1_a6 = 0.0;
+Struct16BytesHomogeneousFloat
+    passFloatStruct16BytesHomogeneousFloatFloatStruct1_a7 =
+    Struct16BytesHomogeneousFloat();
+double passFloatStruct16BytesHomogeneousFloatFloatStruct1_a8 = 0.0;
+
+// Result variable also global, so we can delete it after the callback.
+double passFloatStruct16BytesHomogeneousFloatFloatStruct1Result = 0.0;
+
+double passFloatStruct16BytesHomogeneousFloatFloatStruct1CalculateResult() {
+  double result = 0;
+
+  result += passFloatStruct16BytesHomogeneousFloatFloatStruct1_a0;
+  result += passFloatStruct16BytesHomogeneousFloatFloatStruct1_a1.a0;
+  result += passFloatStruct16BytesHomogeneousFloatFloatStruct1_a1.a1;
+  result += passFloatStruct16BytesHomogeneousFloatFloatStruct1_a1.a2;
+  result += passFloatStruct16BytesHomogeneousFloatFloatStruct1_a1.a3;
+  result += passFloatStruct16BytesHomogeneousFloatFloatStruct1_a2;
+  result += passFloatStruct16BytesHomogeneousFloatFloatStruct1_a3.a0;
+  result += passFloatStruct16BytesHomogeneousFloatFloatStruct1_a3.a1;
+  result += passFloatStruct16BytesHomogeneousFloatFloatStruct1_a3.a2;
+  result += passFloatStruct16BytesHomogeneousFloatFloatStruct1_a3.a3;
+  result += passFloatStruct16BytesHomogeneousFloatFloatStruct1_a4;
+  result += passFloatStruct16BytesHomogeneousFloatFloatStruct1_a5.a0;
+  result += passFloatStruct16BytesHomogeneousFloatFloatStruct1_a5.a1;
+  result += passFloatStruct16BytesHomogeneousFloatFloatStruct1_a5.a2;
+  result += passFloatStruct16BytesHomogeneousFloatFloatStruct1_a5.a3;
+  result += passFloatStruct16BytesHomogeneousFloatFloatStruct1_a6;
+  result += passFloatStruct16BytesHomogeneousFloatFloatStruct1_a7.a0;
+  result += passFloatStruct16BytesHomogeneousFloatFloatStruct1_a7.a1;
+  result += passFloatStruct16BytesHomogeneousFloatFloatStruct1_a7.a2;
+  result += passFloatStruct16BytesHomogeneousFloatFloatStruct1_a7.a3;
+  result += passFloatStruct16BytesHomogeneousFloatFloatStruct1_a8;
+
+  passFloatStruct16BytesHomogeneousFloatFloatStruct1Result = result;
+
+  return result;
+}
+
+/// Tests the alignment of structs in FPU registers and backfilling.
+double passFloatStruct16BytesHomogeneousFloatFloatStruct1(
+    double a0,
+    Struct16BytesHomogeneousFloat a1,
+    double a2,
+    Struct16BytesHomogeneousFloat a3,
+    double a4,
+    Struct16BytesHomogeneousFloat a5,
+    double a6,
+    Struct16BytesHomogeneousFloat a7,
+    double a8) {
+  print(
+      "passFloatStruct16BytesHomogeneousFloatFloatStruct1(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5}, ${a6}, ${a7}, ${a8})");
+
+  // In legacy mode, possibly return null.
+  if (a0 == 84) {
+    print("returning null!");
+    return null;
+  }
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0 == 42 || a0 == 84) {
+    print("throwing!");
+    throw Exception(
+        "PassFloatStruct16BytesHomogeneousFloatFloatStruct1 throwing on purpuse!");
+  }
+
+  passFloatStruct16BytesHomogeneousFloatFloatStruct1_a0 = a0;
+  passFloatStruct16BytesHomogeneousFloatFloatStruct1_a1 = a1;
+  passFloatStruct16BytesHomogeneousFloatFloatStruct1_a2 = a2;
+  passFloatStruct16BytesHomogeneousFloatFloatStruct1_a3 = a3;
+  passFloatStruct16BytesHomogeneousFloatFloatStruct1_a4 = a4;
+  passFloatStruct16BytesHomogeneousFloatFloatStruct1_a5 = a5;
+  passFloatStruct16BytesHomogeneousFloatFloatStruct1_a6 = a6;
+  passFloatStruct16BytesHomogeneousFloatFloatStruct1_a7 = a7;
+  passFloatStruct16BytesHomogeneousFloatFloatStruct1_a8 = a8;
+
+  final result =
+      passFloatStruct16BytesHomogeneousFloatFloatStruct1CalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void passFloatStruct16BytesHomogeneousFloatFloatStruct1AfterCallback() {
+  final result =
+      passFloatStruct16BytesHomogeneousFloatFloatStruct1CalculateResult();
+
+  print("after callback result = $result");
+
+  Expect.approxEquals(-11.0, result);
+}
+
+typedef PassFloatStruct32BytesHomogeneousDoubleFloatStructType
+    = Double Function(
+        Float,
+        Struct32BytesHomogeneousDouble,
+        Float,
+        Struct32BytesHomogeneousDouble,
+        Float,
+        Struct32BytesHomogeneousDouble,
+        Float,
+        Struct32BytesHomogeneousDouble,
+        Float);
+
+// Global variables to be able to test inputs after callback returned.
+double passFloatStruct32BytesHomogeneousDoubleFloatStruct_a0 = 0.0;
+Struct32BytesHomogeneousDouble
+    passFloatStruct32BytesHomogeneousDoubleFloatStruct_a1 =
+    Struct32BytesHomogeneousDouble();
+double passFloatStruct32BytesHomogeneousDoubleFloatStruct_a2 = 0.0;
+Struct32BytesHomogeneousDouble
+    passFloatStruct32BytesHomogeneousDoubleFloatStruct_a3 =
+    Struct32BytesHomogeneousDouble();
+double passFloatStruct32BytesHomogeneousDoubleFloatStruct_a4 = 0.0;
+Struct32BytesHomogeneousDouble
+    passFloatStruct32BytesHomogeneousDoubleFloatStruct_a5 =
+    Struct32BytesHomogeneousDouble();
+double passFloatStruct32BytesHomogeneousDoubleFloatStruct_a6 = 0.0;
+Struct32BytesHomogeneousDouble
+    passFloatStruct32BytesHomogeneousDoubleFloatStruct_a7 =
+    Struct32BytesHomogeneousDouble();
+double passFloatStruct32BytesHomogeneousDoubleFloatStruct_a8 = 0.0;
+
+// Result variable also global, so we can delete it after the callback.
+double passFloatStruct32BytesHomogeneousDoubleFloatStructResult = 0.0;
+
+double passFloatStruct32BytesHomogeneousDoubleFloatStructCalculateResult() {
+  double result = 0;
+
+  result += passFloatStruct32BytesHomogeneousDoubleFloatStruct_a0;
+  result += passFloatStruct32BytesHomogeneousDoubleFloatStruct_a1.a0;
+  result += passFloatStruct32BytesHomogeneousDoubleFloatStruct_a1.a1;
+  result += passFloatStruct32BytesHomogeneousDoubleFloatStruct_a1.a2;
+  result += passFloatStruct32BytesHomogeneousDoubleFloatStruct_a1.a3;
+  result += passFloatStruct32BytesHomogeneousDoubleFloatStruct_a2;
+  result += passFloatStruct32BytesHomogeneousDoubleFloatStruct_a3.a0;
+  result += passFloatStruct32BytesHomogeneousDoubleFloatStruct_a3.a1;
+  result += passFloatStruct32BytesHomogeneousDoubleFloatStruct_a3.a2;
+  result += passFloatStruct32BytesHomogeneousDoubleFloatStruct_a3.a3;
+  result += passFloatStruct32BytesHomogeneousDoubleFloatStruct_a4;
+  result += passFloatStruct32BytesHomogeneousDoubleFloatStruct_a5.a0;
+  result += passFloatStruct32BytesHomogeneousDoubleFloatStruct_a5.a1;
+  result += passFloatStruct32BytesHomogeneousDoubleFloatStruct_a5.a2;
+  result += passFloatStruct32BytesHomogeneousDoubleFloatStruct_a5.a3;
+  result += passFloatStruct32BytesHomogeneousDoubleFloatStruct_a6;
+  result += passFloatStruct32BytesHomogeneousDoubleFloatStruct_a7.a0;
+  result += passFloatStruct32BytesHomogeneousDoubleFloatStruct_a7.a1;
+  result += passFloatStruct32BytesHomogeneousDoubleFloatStruct_a7.a2;
+  result += passFloatStruct32BytesHomogeneousDoubleFloatStruct_a7.a3;
+  result += passFloatStruct32BytesHomogeneousDoubleFloatStruct_a8;
+
+  passFloatStruct32BytesHomogeneousDoubleFloatStructResult = result;
+
+  return result;
+}
+
+/// Tests the alignment of structs in FPU registers and backfilling.
+double passFloatStruct32BytesHomogeneousDoubleFloatStruct(
+    double a0,
+    Struct32BytesHomogeneousDouble a1,
+    double a2,
+    Struct32BytesHomogeneousDouble a3,
+    double a4,
+    Struct32BytesHomogeneousDouble a5,
+    double a6,
+    Struct32BytesHomogeneousDouble a7,
+    double a8) {
+  print(
+      "passFloatStruct32BytesHomogeneousDoubleFloatStruct(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5}, ${a6}, ${a7}, ${a8})");
+
+  // In legacy mode, possibly return null.
+  if (a0 == 84) {
+    print("returning null!");
+    return null;
+  }
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0 == 42 || a0 == 84) {
+    print("throwing!");
+    throw Exception(
+        "PassFloatStruct32BytesHomogeneousDoubleFloatStruct throwing on purpuse!");
+  }
+
+  passFloatStruct32BytesHomogeneousDoubleFloatStruct_a0 = a0;
+  passFloatStruct32BytesHomogeneousDoubleFloatStruct_a1 = a1;
+  passFloatStruct32BytesHomogeneousDoubleFloatStruct_a2 = a2;
+  passFloatStruct32BytesHomogeneousDoubleFloatStruct_a3 = a3;
+  passFloatStruct32BytesHomogeneousDoubleFloatStruct_a4 = a4;
+  passFloatStruct32BytesHomogeneousDoubleFloatStruct_a5 = a5;
+  passFloatStruct32BytesHomogeneousDoubleFloatStruct_a6 = a6;
+  passFloatStruct32BytesHomogeneousDoubleFloatStruct_a7 = a7;
+  passFloatStruct32BytesHomogeneousDoubleFloatStruct_a8 = a8;
+
+  final result =
+      passFloatStruct32BytesHomogeneousDoubleFloatStructCalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void passFloatStruct32BytesHomogeneousDoubleFloatStructAfterCallback() {
+  final result =
+      passFloatStruct32BytesHomogeneousDoubleFloatStructCalculateResult();
+
+  print("after callback result = $result");
+
+  Expect.approxEquals(-11.0, result);
+}
+
+typedef PassInt8Struct16BytesMixedInt8Struct16BytesMixedInType
+    = Double Function(Int8, Struct16BytesMixed, Int8, Struct16BytesMixed, Int8,
+        Struct16BytesMixed, Int8, Struct16BytesMixed, Int8);
+
+// Global variables to be able to test inputs after callback returned.
+int passInt8Struct16BytesMixedInt8Struct16BytesMixedIn_a0 = 0;
+Struct16BytesMixed passInt8Struct16BytesMixedInt8Struct16BytesMixedIn_a1 =
+    Struct16BytesMixed();
+int passInt8Struct16BytesMixedInt8Struct16BytesMixedIn_a2 = 0;
+Struct16BytesMixed passInt8Struct16BytesMixedInt8Struct16BytesMixedIn_a3 =
+    Struct16BytesMixed();
+int passInt8Struct16BytesMixedInt8Struct16BytesMixedIn_a4 = 0;
+Struct16BytesMixed passInt8Struct16BytesMixedInt8Struct16BytesMixedIn_a5 =
+    Struct16BytesMixed();
+int passInt8Struct16BytesMixedInt8Struct16BytesMixedIn_a6 = 0;
+Struct16BytesMixed passInt8Struct16BytesMixedInt8Struct16BytesMixedIn_a7 =
+    Struct16BytesMixed();
+int passInt8Struct16BytesMixedInt8Struct16BytesMixedIn_a8 = 0;
+
+// Result variable also global, so we can delete it after the callback.
+double passInt8Struct16BytesMixedInt8Struct16BytesMixedInResult = 0.0;
+
+double passInt8Struct16BytesMixedInt8Struct16BytesMixedInCalculateResult() {
+  double result = 0;
+
+  result += passInt8Struct16BytesMixedInt8Struct16BytesMixedIn_a0;
+  result += passInt8Struct16BytesMixedInt8Struct16BytesMixedIn_a1.a0;
+  result += passInt8Struct16BytesMixedInt8Struct16BytesMixedIn_a1.a1;
+  result += passInt8Struct16BytesMixedInt8Struct16BytesMixedIn_a2;
+  result += passInt8Struct16BytesMixedInt8Struct16BytesMixedIn_a3.a0;
+  result += passInt8Struct16BytesMixedInt8Struct16BytesMixedIn_a3.a1;
+  result += passInt8Struct16BytesMixedInt8Struct16BytesMixedIn_a4;
+  result += passInt8Struct16BytesMixedInt8Struct16BytesMixedIn_a5.a0;
+  result += passInt8Struct16BytesMixedInt8Struct16BytesMixedIn_a5.a1;
+  result += passInt8Struct16BytesMixedInt8Struct16BytesMixedIn_a6;
+  result += passInt8Struct16BytesMixedInt8Struct16BytesMixedIn_a7.a0;
+  result += passInt8Struct16BytesMixedInt8Struct16BytesMixedIn_a7.a1;
+  result += passInt8Struct16BytesMixedInt8Struct16BytesMixedIn_a8;
+
+  passInt8Struct16BytesMixedInt8Struct16BytesMixedInResult = result;
+
+  return result;
+}
+
+/// Tests the alignment of structs in integers registers and on the stack.
+/// Arm32 aligns this struct at 8.
+/// Also, arm32 allocates the second struct partially in registers, partially
+/// on stack.
+/// Test backfilling of integer registers.
+double passInt8Struct16BytesMixedInt8Struct16BytesMixedIn(
+    int a0,
+    Struct16BytesMixed a1,
+    int a2,
+    Struct16BytesMixed a3,
+    int a4,
+    Struct16BytesMixed a5,
+    int a6,
+    Struct16BytesMixed a7,
+    int a8) {
+  print(
+      "passInt8Struct16BytesMixedInt8Struct16BytesMixedIn(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5}, ${a6}, ${a7}, ${a8})");
+
+  // In legacy mode, possibly return null.
+  if (a0 == 84) {
+    print("returning null!");
+    return null;
+  }
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0 == 42 || a0 == 84) {
+    print("throwing!");
+    throw Exception(
+        "PassInt8Struct16BytesMixedInt8Struct16BytesMixedIn throwing on purpuse!");
+  }
+
+  passInt8Struct16BytesMixedInt8Struct16BytesMixedIn_a0 = a0;
+  passInt8Struct16BytesMixedInt8Struct16BytesMixedIn_a1 = a1;
+  passInt8Struct16BytesMixedInt8Struct16BytesMixedIn_a2 = a2;
+  passInt8Struct16BytesMixedInt8Struct16BytesMixedIn_a3 = a3;
+  passInt8Struct16BytesMixedInt8Struct16BytesMixedIn_a4 = a4;
+  passInt8Struct16BytesMixedInt8Struct16BytesMixedIn_a5 = a5;
+  passInt8Struct16BytesMixedInt8Struct16BytesMixedIn_a6 = a6;
+  passInt8Struct16BytesMixedInt8Struct16BytesMixedIn_a7 = a7;
+  passInt8Struct16BytesMixedInt8Struct16BytesMixedIn_a8 = a8;
+
+  final result =
+      passInt8Struct16BytesMixedInt8Struct16BytesMixedInCalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void passInt8Struct16BytesMixedInt8Struct16BytesMixedInAfterCallback() {
+  final result =
+      passInt8Struct16BytesMixedInt8Struct16BytesMixedInCalculateResult();
+
+  print("after callback result = $result");
+
+  Expect.approxEquals(-7.0, result);
+}
+
+typedef PassDoublex6Struct16BytesMixedx4Int32Type = Double Function(
+    Double,
+    Double,
+    Double,
+    Double,
+    Double,
+    Double,
+    Struct16BytesMixed,
+    Struct16BytesMixed,
+    Struct16BytesMixed,
+    Struct16BytesMixed,
+    Int32);
+
+// Global variables to be able to test inputs after callback returned.
+double passDoublex6Struct16BytesMixedx4Int32_a0 = 0.0;
+double passDoublex6Struct16BytesMixedx4Int32_a1 = 0.0;
+double passDoublex6Struct16BytesMixedx4Int32_a2 = 0.0;
+double passDoublex6Struct16BytesMixedx4Int32_a3 = 0.0;
+double passDoublex6Struct16BytesMixedx4Int32_a4 = 0.0;
+double passDoublex6Struct16BytesMixedx4Int32_a5 = 0.0;
+Struct16BytesMixed passDoublex6Struct16BytesMixedx4Int32_a6 =
+    Struct16BytesMixed();
+Struct16BytesMixed passDoublex6Struct16BytesMixedx4Int32_a7 =
+    Struct16BytesMixed();
+Struct16BytesMixed passDoublex6Struct16BytesMixedx4Int32_a8 =
+    Struct16BytesMixed();
+Struct16BytesMixed passDoublex6Struct16BytesMixedx4Int32_a9 =
+    Struct16BytesMixed();
+int passDoublex6Struct16BytesMixedx4Int32_a10 = 0;
+
+// Result variable also global, so we can delete it after the callback.
+double passDoublex6Struct16BytesMixedx4Int32Result = 0.0;
+
+double passDoublex6Struct16BytesMixedx4Int32CalculateResult() {
+  double result = 0;
+
+  result += passDoublex6Struct16BytesMixedx4Int32_a0;
+  result += passDoublex6Struct16BytesMixedx4Int32_a1;
+  result += passDoublex6Struct16BytesMixedx4Int32_a2;
+  result += passDoublex6Struct16BytesMixedx4Int32_a3;
+  result += passDoublex6Struct16BytesMixedx4Int32_a4;
+  result += passDoublex6Struct16BytesMixedx4Int32_a5;
+  result += passDoublex6Struct16BytesMixedx4Int32_a6.a0;
+  result += passDoublex6Struct16BytesMixedx4Int32_a6.a1;
+  result += passDoublex6Struct16BytesMixedx4Int32_a7.a0;
+  result += passDoublex6Struct16BytesMixedx4Int32_a7.a1;
+  result += passDoublex6Struct16BytesMixedx4Int32_a8.a0;
+  result += passDoublex6Struct16BytesMixedx4Int32_a8.a1;
+  result += passDoublex6Struct16BytesMixedx4Int32_a9.a0;
+  result += passDoublex6Struct16BytesMixedx4Int32_a9.a1;
+  result += passDoublex6Struct16BytesMixedx4Int32_a10;
+
+  passDoublex6Struct16BytesMixedx4Int32Result = result;
+
+  return result;
+}
+
+/// On Linux x64, it will exhaust xmm registers first, after 6 doubles and 2
+/// structs. The rest of the structs will go on the stack.
+/// The int will be backfilled into the int register.
+double passDoublex6Struct16BytesMixedx4Int32(
+    double a0,
+    double a1,
+    double a2,
+    double a3,
+    double a4,
+    double a5,
+    Struct16BytesMixed a6,
+    Struct16BytesMixed a7,
+    Struct16BytesMixed a8,
+    Struct16BytesMixed a9,
+    int a10) {
+  print(
+      "passDoublex6Struct16BytesMixedx4Int32(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5}, ${a6}, ${a7}, ${a8}, ${a9}, ${a10})");
+
+  // In legacy mode, possibly return null.
+  if (a0 == 84) {
+    print("returning null!");
+    return null;
+  }
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0 == 42 || a0 == 84) {
+    print("throwing!");
+    throw Exception(
+        "PassDoublex6Struct16BytesMixedx4Int32 throwing on purpuse!");
+  }
+
+  passDoublex6Struct16BytesMixedx4Int32_a0 = a0;
+  passDoublex6Struct16BytesMixedx4Int32_a1 = a1;
+  passDoublex6Struct16BytesMixedx4Int32_a2 = a2;
+  passDoublex6Struct16BytesMixedx4Int32_a3 = a3;
+  passDoublex6Struct16BytesMixedx4Int32_a4 = a4;
+  passDoublex6Struct16BytesMixedx4Int32_a5 = a5;
+  passDoublex6Struct16BytesMixedx4Int32_a6 = a6;
+  passDoublex6Struct16BytesMixedx4Int32_a7 = a7;
+  passDoublex6Struct16BytesMixedx4Int32_a8 = a8;
+  passDoublex6Struct16BytesMixedx4Int32_a9 = a9;
+  passDoublex6Struct16BytesMixedx4Int32_a10 = a10;
+
+  final result = passDoublex6Struct16BytesMixedx4Int32CalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void passDoublex6Struct16BytesMixedx4Int32AfterCallback() {
+  final result = passDoublex6Struct16BytesMixedx4Int32CalculateResult();
+
+  print("after callback result = $result");
+
+  Expect.approxEquals(-8.0, result);
+}
+
+typedef PassInt32x4Struct16BytesMixedx4DoubleType = Double Function(
+    Int32,
+    Int32,
+    Int32,
+    Int32,
+    Struct16BytesMixed,
+    Struct16BytesMixed,
+    Struct16BytesMixed,
+    Struct16BytesMixed,
+    Double);
+
+// Global variables to be able to test inputs after callback returned.
+int passInt32x4Struct16BytesMixedx4Double_a0 = 0;
+int passInt32x4Struct16BytesMixedx4Double_a1 = 0;
+int passInt32x4Struct16BytesMixedx4Double_a2 = 0;
+int passInt32x4Struct16BytesMixedx4Double_a3 = 0;
+Struct16BytesMixed passInt32x4Struct16BytesMixedx4Double_a4 =
+    Struct16BytesMixed();
+Struct16BytesMixed passInt32x4Struct16BytesMixedx4Double_a5 =
+    Struct16BytesMixed();
+Struct16BytesMixed passInt32x4Struct16BytesMixedx4Double_a6 =
+    Struct16BytesMixed();
+Struct16BytesMixed passInt32x4Struct16BytesMixedx4Double_a7 =
+    Struct16BytesMixed();
+double passInt32x4Struct16BytesMixedx4Double_a8 = 0.0;
+
+// Result variable also global, so we can delete it after the callback.
+double passInt32x4Struct16BytesMixedx4DoubleResult = 0.0;
+
+double passInt32x4Struct16BytesMixedx4DoubleCalculateResult() {
+  double result = 0;
+
+  result += passInt32x4Struct16BytesMixedx4Double_a0;
+  result += passInt32x4Struct16BytesMixedx4Double_a1;
+  result += passInt32x4Struct16BytesMixedx4Double_a2;
+  result += passInt32x4Struct16BytesMixedx4Double_a3;
+  result += passInt32x4Struct16BytesMixedx4Double_a4.a0;
+  result += passInt32x4Struct16BytesMixedx4Double_a4.a1;
+  result += passInt32x4Struct16BytesMixedx4Double_a5.a0;
+  result += passInt32x4Struct16BytesMixedx4Double_a5.a1;
+  result += passInt32x4Struct16BytesMixedx4Double_a6.a0;
+  result += passInt32x4Struct16BytesMixedx4Double_a6.a1;
+  result += passInt32x4Struct16BytesMixedx4Double_a7.a0;
+  result += passInt32x4Struct16BytesMixedx4Double_a7.a1;
+  result += passInt32x4Struct16BytesMixedx4Double_a8;
+
+  passInt32x4Struct16BytesMixedx4DoubleResult = result;
+
+  return result;
+}
+
+/// On Linux x64, it will exhaust int registers first.
+/// The rest of the structs will go on the stack.
+/// The double will be backfilled into the xmm register.
+double passInt32x4Struct16BytesMixedx4Double(
+    int a0,
+    int a1,
+    int a2,
+    int a3,
+    Struct16BytesMixed a4,
+    Struct16BytesMixed a5,
+    Struct16BytesMixed a6,
+    Struct16BytesMixed a7,
+    double a8) {
+  print(
+      "passInt32x4Struct16BytesMixedx4Double(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5}, ${a6}, ${a7}, ${a8})");
+
+  // In legacy mode, possibly return null.
+  if (a0 == 84) {
+    print("returning null!");
+    return null;
+  }
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0 == 42 || a0 == 84) {
+    print("throwing!");
+    throw Exception(
+        "PassInt32x4Struct16BytesMixedx4Double throwing on purpuse!");
+  }
+
+  passInt32x4Struct16BytesMixedx4Double_a0 = a0;
+  passInt32x4Struct16BytesMixedx4Double_a1 = a1;
+  passInt32x4Struct16BytesMixedx4Double_a2 = a2;
+  passInt32x4Struct16BytesMixedx4Double_a3 = a3;
+  passInt32x4Struct16BytesMixedx4Double_a4 = a4;
+  passInt32x4Struct16BytesMixedx4Double_a5 = a5;
+  passInt32x4Struct16BytesMixedx4Double_a6 = a6;
+  passInt32x4Struct16BytesMixedx4Double_a7 = a7;
+  passInt32x4Struct16BytesMixedx4Double_a8 = a8;
+
+  final result = passInt32x4Struct16BytesMixedx4DoubleCalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void passInt32x4Struct16BytesMixedx4DoubleAfterCallback() {
+  final result = passInt32x4Struct16BytesMixedx4DoubleCalculateResult();
+
+  print("after callback result = $result");
+
+  Expect.approxEquals(-7.0, result);
+}
+
+typedef PassStruct40BytesHomogeneousDoubleStruct4BytesHomoType
+    = Double Function(Struct40BytesHomogeneousDouble,
+        Struct4BytesHomogeneousInt16, Struct8BytesHomogeneousFloat);
+
+// Global variables to be able to test inputs after callback returned.
+Struct40BytesHomogeneousDouble
+    passStruct40BytesHomogeneousDoubleStruct4BytesHomo_a0 =
+    Struct40BytesHomogeneousDouble();
+Struct4BytesHomogeneousInt16
+    passStruct40BytesHomogeneousDoubleStruct4BytesHomo_a1 =
+    Struct4BytesHomogeneousInt16();
+Struct8BytesHomogeneousFloat
+    passStruct40BytesHomogeneousDoubleStruct4BytesHomo_a2 =
+    Struct8BytesHomogeneousFloat();
+
+// Result variable also global, so we can delete it after the callback.
+double passStruct40BytesHomogeneousDoubleStruct4BytesHomoResult = 0.0;
+
+double passStruct40BytesHomogeneousDoubleStruct4BytesHomoCalculateResult() {
+  double result = 0;
+
+  result += passStruct40BytesHomogeneousDoubleStruct4BytesHomo_a0.a0;
+  result += passStruct40BytesHomogeneousDoubleStruct4BytesHomo_a0.a1;
+  result += passStruct40BytesHomogeneousDoubleStruct4BytesHomo_a0.a2;
+  result += passStruct40BytesHomogeneousDoubleStruct4BytesHomo_a0.a3;
+  result += passStruct40BytesHomogeneousDoubleStruct4BytesHomo_a0.a4;
+  result += passStruct40BytesHomogeneousDoubleStruct4BytesHomo_a1.a0;
+  result += passStruct40BytesHomogeneousDoubleStruct4BytesHomo_a1.a1;
+  result += passStruct40BytesHomogeneousDoubleStruct4BytesHomo_a2.a0;
+  result += passStruct40BytesHomogeneousDoubleStruct4BytesHomo_a2.a1;
+
+  passStruct40BytesHomogeneousDoubleStruct4BytesHomoResult = result;
+
+  return result;
+}
+
+/// On various architectures, first struct is allocated on stack.
+/// Check that the other two arguments are allocated on registers.
+double passStruct40BytesHomogeneousDoubleStruct4BytesHomo(
+    Struct40BytesHomogeneousDouble a0,
+    Struct4BytesHomogeneousInt16 a1,
+    Struct8BytesHomogeneousFloat a2) {
+  print(
+      "passStruct40BytesHomogeneousDoubleStruct4BytesHomo(${a0}, ${a1}, ${a2})");
+
+  // In legacy mode, possibly return null.
+  if (a0.a0 == 84) {
+    print("returning null!");
+    return null;
+  }
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0.a0 == 42 || a0.a0 == 84) {
+    print("throwing!");
+    throw Exception(
+        "PassStruct40BytesHomogeneousDoubleStruct4BytesHomo throwing on purpuse!");
+  }
+
+  passStruct40BytesHomogeneousDoubleStruct4BytesHomo_a0 = a0;
+  passStruct40BytesHomogeneousDoubleStruct4BytesHomo_a1 = a1;
+  passStruct40BytesHomogeneousDoubleStruct4BytesHomo_a2 = a2;
+
+  final result =
+      passStruct40BytesHomogeneousDoubleStruct4BytesHomoCalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void passStruct40BytesHomogeneousDoubleStruct4BytesHomoAfterCallback() {
+  final result =
+      passStruct40BytesHomogeneousDoubleStruct4BytesHomoCalculateResult();
+
+  print("after callback result = $result");
+
+  Expect.approxEquals(-5.0, result);
+}
+
+typedef PassInt32x8Doublex8Int64Int8Struct1ByteIntInt64IntType
+    = Double Function(
+        Int32,
+        Int32,
+        Int32,
+        Int32,
+        Int32,
+        Int32,
+        Int32,
+        Int32,
+        Double,
+        Double,
+        Double,
+        Double,
+        Double,
+        Double,
+        Double,
+        Double,
+        Int64,
+        Int8,
+        Struct1ByteInt,
+        Int64,
+        Int8,
+        Struct4BytesHomogeneousInt16,
+        Int64,
+        Int8,
+        Struct8BytesInt,
+        Int64,
+        Int8,
+        Struct8BytesHomogeneousFloat,
+        Int64,
+        Int8,
+        Struct8BytesMixed,
+        Int64,
+        Int8,
+        StructAlignmentInt16,
+        Int64,
+        Int8,
+        StructAlignmentInt32,
+        Int64,
+        Int8,
+        StructAlignmentInt64);
+
+// Global variables to be able to test inputs after callback returned.
+int passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a0 = 0;
+int passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a1 = 0;
+int passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a2 = 0;
+int passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a3 = 0;
+int passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a4 = 0;
+int passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a5 = 0;
+int passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a6 = 0;
+int passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a7 = 0;
+double passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a8 = 0.0;
+double passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a9 = 0.0;
+double passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a10 = 0.0;
+double passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a11 = 0.0;
+double passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a12 = 0.0;
+double passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a13 = 0.0;
+double passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a14 = 0.0;
+double passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a15 = 0.0;
+int passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a16 = 0;
+int passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a17 = 0;
+Struct1ByteInt passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a18 =
+    Struct1ByteInt();
+int passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a19 = 0;
+int passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a20 = 0;
+Struct4BytesHomogeneousInt16
+    passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a21 =
+    Struct4BytesHomogeneousInt16();
+int passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a22 = 0;
+int passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a23 = 0;
+Struct8BytesInt passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a24 =
+    Struct8BytesInt();
+int passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a25 = 0;
+int passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a26 = 0;
+Struct8BytesHomogeneousFloat
+    passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a27 =
+    Struct8BytesHomogeneousFloat();
+int passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a28 = 0;
+int passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a29 = 0;
+Struct8BytesMixed passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a30 =
+    Struct8BytesMixed();
+int passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a31 = 0;
+int passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a32 = 0;
+StructAlignmentInt16 passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a33 =
+    StructAlignmentInt16();
+int passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a34 = 0;
+int passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a35 = 0;
+StructAlignmentInt32 passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a36 =
+    StructAlignmentInt32();
+int passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a37 = 0;
+int passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a38 = 0;
+StructAlignmentInt64 passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a39 =
+    StructAlignmentInt64();
+
+// Result variable also global, so we can delete it after the callback.
+double passInt32x8Doublex8Int64Int8Struct1ByteIntInt64IntResult = 0.0;
+
+double passInt32x8Doublex8Int64Int8Struct1ByteIntInt64IntCalculateResult() {
+  double result = 0;
+
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a0;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a1;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a2;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a3;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a4;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a5;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a6;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a7;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a8;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a9;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a10;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a11;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a12;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a13;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a14;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a15;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a16;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a17;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a18.a0;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a19;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a20;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a21.a0;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a21.a1;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a22;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a23;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a24.a0;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a24.a1;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a24.a2;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a25;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a26;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a27.a0;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a27.a1;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a28;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a29;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a30.a0;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a30.a1;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a30.a2;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a31;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a32;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a33.a0;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a33.a1;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a33.a2;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a34;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a35;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a36.a0;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a36.a1;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a36.a2;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a37;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a38;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a39.a0;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a39.a1;
+  result += passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a39.a2;
+
+  passInt32x8Doublex8Int64Int8Struct1ByteIntInt64IntResult = result;
+
+  return result;
+}
+
+/// Test alignment and padding of 16 byte int within struct.
+double passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int(
+    int a0,
+    int a1,
+    int a2,
+    int a3,
+    int a4,
+    int a5,
+    int a6,
+    int a7,
+    double a8,
+    double a9,
+    double a10,
+    double a11,
+    double a12,
+    double a13,
+    double a14,
+    double a15,
+    int a16,
+    int a17,
+    Struct1ByteInt a18,
+    int a19,
+    int a20,
+    Struct4BytesHomogeneousInt16 a21,
+    int a22,
+    int a23,
+    Struct8BytesInt a24,
+    int a25,
+    int a26,
+    Struct8BytesHomogeneousFloat a27,
+    int a28,
+    int a29,
+    Struct8BytesMixed a30,
+    int a31,
+    int a32,
+    StructAlignmentInt16 a33,
+    int a34,
+    int a35,
+    StructAlignmentInt32 a36,
+    int a37,
+    int a38,
+    StructAlignmentInt64 a39) {
+  print(
+      "passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5}, ${a6}, ${a7}, ${a8}, ${a9}, ${a10}, ${a11}, ${a12}, ${a13}, ${a14}, ${a15}, ${a16}, ${a17}, ${a18}, ${a19}, ${a20}, ${a21}, ${a22}, ${a23}, ${a24}, ${a25}, ${a26}, ${a27}, ${a28}, ${a29}, ${a30}, ${a31}, ${a32}, ${a33}, ${a34}, ${a35}, ${a36}, ${a37}, ${a38}, ${a39})");
+
+  // In legacy mode, possibly return null.
+  if (a0 == 84) {
+    print("returning null!");
+    return null;
+  }
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0 == 42 || a0 == 84) {
+    print("throwing!");
+    throw Exception(
+        "PassInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int throwing on purpuse!");
+  }
+
+  passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a0 = a0;
+  passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a1 = a1;
+  passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a2 = a2;
+  passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a3 = a3;
+  passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a4 = a4;
+  passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a5 = a5;
+  passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a6 = a6;
+  passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a7 = a7;
+  passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a8 = a8;
+  passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a9 = a9;
+  passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a10 = a10;
+  passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a11 = a11;
+  passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a12 = a12;
+  passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a13 = a13;
+  passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a14 = a14;
+  passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a15 = a15;
+  passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a16 = a16;
+  passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a17 = a17;
+  passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a18 = a18;
+  passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a19 = a19;
+  passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a20 = a20;
+  passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a21 = a21;
+  passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a22 = a22;
+  passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a23 = a23;
+  passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a24 = a24;
+  passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a25 = a25;
+  passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a26 = a26;
+  passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a27 = a27;
+  passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a28 = a28;
+  passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a29 = a29;
+  passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a30 = a30;
+  passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a31 = a31;
+  passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a32 = a32;
+  passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a33 = a33;
+  passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a34 = a34;
+  passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a35 = a35;
+  passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a36 = a36;
+  passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a37 = a37;
+  passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a38 = a38;
+  passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int_a39 = a39;
+
+  final result =
+      passInt32x8Doublex8Int64Int8Struct1ByteIntInt64IntCalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void passInt32x8Doublex8Int64Int8Struct1ByteIntInt64IntAfterCallback() {
+  final result =
+      passInt32x8Doublex8Int64Int8Struct1ByteIntInt64IntCalculateResult();
+
+  print("after callback result = $result");
+
+  Expect.approxEquals(26.0, result);
+}
+
+typedef PassStructAlignmentInt16Type = Int64 Function(StructAlignmentInt16);
+
+// Global variables to be able to test inputs after callback returned.
+StructAlignmentInt16 passStructAlignmentInt16_a0 = StructAlignmentInt16();
+
+// Result variable also global, so we can delete it after the callback.
+int passStructAlignmentInt16Result = 0;
+
+int passStructAlignmentInt16CalculateResult() {
+  int result = 0;
+
+  result += passStructAlignmentInt16_a0.a0;
+  result += passStructAlignmentInt16_a0.a1;
+  result += passStructAlignmentInt16_a0.a2;
+
+  passStructAlignmentInt16Result = result;
+
+  return result;
+}
+
+/// Test alignment and padding of 16 byte int within struct.
+int passStructAlignmentInt16(StructAlignmentInt16 a0) {
+  print("passStructAlignmentInt16(${a0})");
+
+  // In legacy mode, possibly return null.
+  if (a0.a0 == 84) {
+    print("returning null!");
+    return null;
+  }
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0.a0 == 42 || a0.a0 == 84) {
+    print("throwing!");
+    throw Exception("PassStructAlignmentInt16 throwing on purpuse!");
+  }
+
+  passStructAlignmentInt16_a0 = a0;
+
+  final result = passStructAlignmentInt16CalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void passStructAlignmentInt16AfterCallback() {
+  final result = passStructAlignmentInt16CalculateResult();
+
+  print("after callback result = $result");
+
+  Expect.equals(-2, result);
+}
+
+typedef PassStructAlignmentInt32Type = Int64 Function(StructAlignmentInt32);
+
+// Global variables to be able to test inputs after callback returned.
+StructAlignmentInt32 passStructAlignmentInt32_a0 = StructAlignmentInt32();
+
+// Result variable also global, so we can delete it after the callback.
+int passStructAlignmentInt32Result = 0;
+
+int passStructAlignmentInt32CalculateResult() {
+  int result = 0;
+
+  result += passStructAlignmentInt32_a0.a0;
+  result += passStructAlignmentInt32_a0.a1;
+  result += passStructAlignmentInt32_a0.a2;
+
+  passStructAlignmentInt32Result = result;
+
+  return result;
+}
+
+/// Test alignment and padding of 32 byte int within struct.
+int passStructAlignmentInt32(StructAlignmentInt32 a0) {
+  print("passStructAlignmentInt32(${a0})");
+
+  // In legacy mode, possibly return null.
+  if (a0.a0 == 84) {
+    print("returning null!");
+    return null;
+  }
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0.a0 == 42 || a0.a0 == 84) {
+    print("throwing!");
+    throw Exception("PassStructAlignmentInt32 throwing on purpuse!");
+  }
+
+  passStructAlignmentInt32_a0 = a0;
+
+  final result = passStructAlignmentInt32CalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void passStructAlignmentInt32AfterCallback() {
+  final result = passStructAlignmentInt32CalculateResult();
+
+  print("after callback result = $result");
+
+  Expect.equals(-2, result);
+}
+
+typedef PassStructAlignmentInt64Type = Int64 Function(StructAlignmentInt64);
+
+// Global variables to be able to test inputs after callback returned.
+StructAlignmentInt64 passStructAlignmentInt64_a0 = StructAlignmentInt64();
+
+// Result variable also global, so we can delete it after the callback.
+int passStructAlignmentInt64Result = 0;
+
+int passStructAlignmentInt64CalculateResult() {
+  int result = 0;
+
+  result += passStructAlignmentInt64_a0.a0;
+  result += passStructAlignmentInt64_a0.a1;
+  result += passStructAlignmentInt64_a0.a2;
+
+  passStructAlignmentInt64Result = result;
+
+  return result;
+}
+
+/// Test alignment and padding of 64 byte int within struct.
+int passStructAlignmentInt64(StructAlignmentInt64 a0) {
+  print("passStructAlignmentInt64(${a0})");
+
+  // In legacy mode, possibly return null.
+  if (a0.a0 == 84) {
+    print("returning null!");
+    return null;
+  }
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0.a0 == 42 || a0.a0 == 84) {
+    print("throwing!");
+    throw Exception("PassStructAlignmentInt64 throwing on purpuse!");
+  }
+
+  passStructAlignmentInt64_a0 = a0;
+
+  final result = passStructAlignmentInt64CalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void passStructAlignmentInt64AfterCallback() {
+  final result = passStructAlignmentInt64CalculateResult();
+
+  print("after callback result = $result");
+
+  Expect.equals(-2, result);
+}
+
+typedef ReturnStruct1ByteIntType = Struct1ByteInt Function(Int8);
+
+// Global variables to be able to test inputs after callback returned.
+int returnStruct1ByteInt_a0 = 0;
+
+// Result variable also global, so we can delete it after the callback.
+Struct1ByteInt returnStruct1ByteIntResult = Struct1ByteInt();
+
+Struct1ByteInt returnStruct1ByteIntCalculateResult() {
+  Struct1ByteInt result = allocate<Struct1ByteInt>().ref;
+
+  result.a0 = returnStruct1ByteInt_a0;
+
+  returnStruct1ByteIntResult = result;
+
+  return result;
+}
+
+/// Smallest struct with data.
+Struct1ByteInt returnStruct1ByteInt(int a0) {
+  print("returnStruct1ByteInt(${a0})");
+
+  // In legacy mode, possibly return null.
+  if (a0 == 84) {
+    print("returning null!");
+    return null;
+  }
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0 == 42 || a0 == 84) {
+    print("throwing!");
+    throw Exception("ReturnStruct1ByteInt throwing on purpuse!");
+  }
+
+  returnStruct1ByteInt_a0 = a0;
+
+  final result = returnStruct1ByteIntCalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void returnStruct1ByteIntAfterCallback() {
+  free(returnStruct1ByteIntResult.addressOf);
+
+  final result = returnStruct1ByteIntCalculateResult();
+
+  print("after callback result = $result");
+
+  free(returnStruct1ByteIntResult.addressOf);
+}
+
+typedef ReturnStruct3BytesHomogeneousUint8Type = Struct3BytesHomogeneousUint8
+    Function(Uint8, Uint8, Uint8);
+
+// Global variables to be able to test inputs after callback returned.
+int returnStruct3BytesHomogeneousUint8_a0 = 0;
+int returnStruct3BytesHomogeneousUint8_a1 = 0;
+int returnStruct3BytesHomogeneousUint8_a2 = 0;
+
+// Result variable also global, so we can delete it after the callback.
+Struct3BytesHomogeneousUint8 returnStruct3BytesHomogeneousUint8Result =
+    Struct3BytesHomogeneousUint8();
+
+Struct3BytesHomogeneousUint8
+    returnStruct3BytesHomogeneousUint8CalculateResult() {
+  Struct3BytesHomogeneousUint8 result =
+      allocate<Struct3BytesHomogeneousUint8>().ref;
+
+  result.a0 = returnStruct3BytesHomogeneousUint8_a0;
+  result.a1 = returnStruct3BytesHomogeneousUint8_a1;
+  result.a2 = returnStruct3BytesHomogeneousUint8_a2;
+
+  returnStruct3BytesHomogeneousUint8Result = result;
+
+  return result;
+}
+
+/// Smaller than word size return value on all architectures.
+Struct3BytesHomogeneousUint8 returnStruct3BytesHomogeneousUint8(
+    int a0, int a1, int a2) {
+  print("returnStruct3BytesHomogeneousUint8(${a0}, ${a1}, ${a2})");
+
+  // In legacy mode, possibly return null.
+  if (a0 == 84) {
+    print("returning null!");
+    return null;
+  }
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0 == 42 || a0 == 84) {
+    print("throwing!");
+    throw Exception("ReturnStruct3BytesHomogeneousUint8 throwing on purpuse!");
+  }
+
+  returnStruct3BytesHomogeneousUint8_a0 = a0;
+  returnStruct3BytesHomogeneousUint8_a1 = a1;
+  returnStruct3BytesHomogeneousUint8_a2 = a2;
+
+  final result = returnStruct3BytesHomogeneousUint8CalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void returnStruct3BytesHomogeneousUint8AfterCallback() {
+  free(returnStruct3BytesHomogeneousUint8Result.addressOf);
+
+  final result = returnStruct3BytesHomogeneousUint8CalculateResult();
+
+  print("after callback result = $result");
+
+  free(returnStruct3BytesHomogeneousUint8Result.addressOf);
+}
+
+typedef ReturnStruct3BytesInt2ByteAlignedType = Struct3BytesInt2ByteAligned
+    Function(Int16, Int8);
+
+// Global variables to be able to test inputs after callback returned.
+int returnStruct3BytesInt2ByteAligned_a0 = 0;
+int returnStruct3BytesInt2ByteAligned_a1 = 0;
+
+// Result variable also global, so we can delete it after the callback.
+Struct3BytesInt2ByteAligned returnStruct3BytesInt2ByteAlignedResult =
+    Struct3BytesInt2ByteAligned();
+
+Struct3BytesInt2ByteAligned returnStruct3BytesInt2ByteAlignedCalculateResult() {
+  Struct3BytesInt2ByteAligned result =
+      allocate<Struct3BytesInt2ByteAligned>().ref;
+
+  result.a0 = returnStruct3BytesInt2ByteAligned_a0;
+  result.a1 = returnStruct3BytesInt2ByteAligned_a1;
+
+  returnStruct3BytesInt2ByteAlignedResult = result;
+
+  return result;
+}
+
+/// Smaller than word size return value on all architectures.
+/// With alignment rules taken into account size is 4 bytes.
+Struct3BytesInt2ByteAligned returnStruct3BytesInt2ByteAligned(int a0, int a1) {
+  print("returnStruct3BytesInt2ByteAligned(${a0}, ${a1})");
+
+  // In legacy mode, possibly return null.
+  if (a0 == 84) {
+    print("returning null!");
+    return null;
+  }
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0 == 42 || a0 == 84) {
+    print("throwing!");
+    throw Exception("ReturnStruct3BytesInt2ByteAligned throwing on purpuse!");
+  }
+
+  returnStruct3BytesInt2ByteAligned_a0 = a0;
+  returnStruct3BytesInt2ByteAligned_a1 = a1;
+
+  final result = returnStruct3BytesInt2ByteAlignedCalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void returnStruct3BytesInt2ByteAlignedAfterCallback() {
+  free(returnStruct3BytesInt2ByteAlignedResult.addressOf);
+
+  final result = returnStruct3BytesInt2ByteAlignedCalculateResult();
+
+  print("after callback result = $result");
+
+  free(returnStruct3BytesInt2ByteAlignedResult.addressOf);
+}
+
+typedef ReturnStruct4BytesHomogeneousInt16Type = Struct4BytesHomogeneousInt16
+    Function(Int16, Int16);
+
+// Global variables to be able to test inputs after callback returned.
+int returnStruct4BytesHomogeneousInt16_a0 = 0;
+int returnStruct4BytesHomogeneousInt16_a1 = 0;
+
+// Result variable also global, so we can delete it after the callback.
+Struct4BytesHomogeneousInt16 returnStruct4BytesHomogeneousInt16Result =
+    Struct4BytesHomogeneousInt16();
+
+Struct4BytesHomogeneousInt16
+    returnStruct4BytesHomogeneousInt16CalculateResult() {
+  Struct4BytesHomogeneousInt16 result =
+      allocate<Struct4BytesHomogeneousInt16>().ref;
+
+  result.a0 = returnStruct4BytesHomogeneousInt16_a0;
+  result.a1 = returnStruct4BytesHomogeneousInt16_a1;
+
+  returnStruct4BytesHomogeneousInt16Result = result;
+
+  return result;
+}
+
+/// Word size return value on 32 bit architectures..
+Struct4BytesHomogeneousInt16 returnStruct4BytesHomogeneousInt16(
+    int a0, int a1) {
+  print("returnStruct4BytesHomogeneousInt16(${a0}, ${a1})");
+
+  // In legacy mode, possibly return null.
+  if (a0 == 84) {
+    print("returning null!");
+    return null;
+  }
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0 == 42 || a0 == 84) {
+    print("throwing!");
+    throw Exception("ReturnStruct4BytesHomogeneousInt16 throwing on purpuse!");
+  }
+
+  returnStruct4BytesHomogeneousInt16_a0 = a0;
+  returnStruct4BytesHomogeneousInt16_a1 = a1;
+
+  final result = returnStruct4BytesHomogeneousInt16CalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void returnStruct4BytesHomogeneousInt16AfterCallback() {
+  free(returnStruct4BytesHomogeneousInt16Result.addressOf);
+
+  final result = returnStruct4BytesHomogeneousInt16CalculateResult();
+
+  print("after callback result = $result");
+
+  free(returnStruct4BytesHomogeneousInt16Result.addressOf);
+}
+
+typedef ReturnStruct7BytesHomogeneousUint8Type = Struct7BytesHomogeneousUint8
+    Function(Uint8, Uint8, Uint8, Uint8, Uint8, Uint8, Uint8);
+
+// Global variables to be able to test inputs after callback returned.
+int returnStruct7BytesHomogeneousUint8_a0 = 0;
+int returnStruct7BytesHomogeneousUint8_a1 = 0;
+int returnStruct7BytesHomogeneousUint8_a2 = 0;
+int returnStruct7BytesHomogeneousUint8_a3 = 0;
+int returnStruct7BytesHomogeneousUint8_a4 = 0;
+int returnStruct7BytesHomogeneousUint8_a5 = 0;
+int returnStruct7BytesHomogeneousUint8_a6 = 0;
+
+// Result variable also global, so we can delete it after the callback.
+Struct7BytesHomogeneousUint8 returnStruct7BytesHomogeneousUint8Result =
+    Struct7BytesHomogeneousUint8();
+
+Struct7BytesHomogeneousUint8
+    returnStruct7BytesHomogeneousUint8CalculateResult() {
+  Struct7BytesHomogeneousUint8 result =
+      allocate<Struct7BytesHomogeneousUint8>().ref;
+
+  result.a0 = returnStruct7BytesHomogeneousUint8_a0;
+  result.a1 = returnStruct7BytesHomogeneousUint8_a1;
+  result.a2 = returnStruct7BytesHomogeneousUint8_a2;
+  result.a3 = returnStruct7BytesHomogeneousUint8_a3;
+  result.a4 = returnStruct7BytesHomogeneousUint8_a4;
+  result.a5 = returnStruct7BytesHomogeneousUint8_a5;
+  result.a6 = returnStruct7BytesHomogeneousUint8_a6;
+
+  returnStruct7BytesHomogeneousUint8Result = result;
+
+  return result;
+}
+
+/// Non-wordsize return value.
+Struct7BytesHomogeneousUint8 returnStruct7BytesHomogeneousUint8(
+    int a0, int a1, int a2, int a3, int a4, int a5, int a6) {
+  print(
+      "returnStruct7BytesHomogeneousUint8(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5}, ${a6})");
+
+  // In legacy mode, possibly return null.
+  if (a0 == 84) {
+    print("returning null!");
+    return null;
+  }
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0 == 42 || a0 == 84) {
+    print("throwing!");
+    throw Exception("ReturnStruct7BytesHomogeneousUint8 throwing on purpuse!");
+  }
+
+  returnStruct7BytesHomogeneousUint8_a0 = a0;
+  returnStruct7BytesHomogeneousUint8_a1 = a1;
+  returnStruct7BytesHomogeneousUint8_a2 = a2;
+  returnStruct7BytesHomogeneousUint8_a3 = a3;
+  returnStruct7BytesHomogeneousUint8_a4 = a4;
+  returnStruct7BytesHomogeneousUint8_a5 = a5;
+  returnStruct7BytesHomogeneousUint8_a6 = a6;
+
+  final result = returnStruct7BytesHomogeneousUint8CalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void returnStruct7BytesHomogeneousUint8AfterCallback() {
+  free(returnStruct7BytesHomogeneousUint8Result.addressOf);
+
+  final result = returnStruct7BytesHomogeneousUint8CalculateResult();
+
+  print("after callback result = $result");
+
+  free(returnStruct7BytesHomogeneousUint8Result.addressOf);
+}
+
+typedef ReturnStruct7BytesInt4ByteAlignedType = Struct7BytesInt4ByteAligned
+    Function(Int32, Int16, Int8);
+
+// Global variables to be able to test inputs after callback returned.
+int returnStruct7BytesInt4ByteAligned_a0 = 0;
+int returnStruct7BytesInt4ByteAligned_a1 = 0;
+int returnStruct7BytesInt4ByteAligned_a2 = 0;
+
+// Result variable also global, so we can delete it after the callback.
+Struct7BytesInt4ByteAligned returnStruct7BytesInt4ByteAlignedResult =
+    Struct7BytesInt4ByteAligned();
+
+Struct7BytesInt4ByteAligned returnStruct7BytesInt4ByteAlignedCalculateResult() {
+  Struct7BytesInt4ByteAligned result =
+      allocate<Struct7BytesInt4ByteAligned>().ref;
+
+  result.a0 = returnStruct7BytesInt4ByteAligned_a0;
+  result.a1 = returnStruct7BytesInt4ByteAligned_a1;
+  result.a2 = returnStruct7BytesInt4ByteAligned_a2;
+
+  returnStruct7BytesInt4ByteAlignedResult = result;
+
+  return result;
+}
+
+/// Non-wordsize return value.
+/// With alignment rules taken into account size is 8 bytes.
+Struct7BytesInt4ByteAligned returnStruct7BytesInt4ByteAligned(
+    int a0, int a1, int a2) {
+  print("returnStruct7BytesInt4ByteAligned(${a0}, ${a1}, ${a2})");
+
+  // In legacy mode, possibly return null.
+  if (a0 == 84) {
+    print("returning null!");
+    return null;
+  }
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0 == 42 || a0 == 84) {
+    print("throwing!");
+    throw Exception("ReturnStruct7BytesInt4ByteAligned throwing on purpuse!");
+  }
+
+  returnStruct7BytesInt4ByteAligned_a0 = a0;
+  returnStruct7BytesInt4ByteAligned_a1 = a1;
+  returnStruct7BytesInt4ByteAligned_a2 = a2;
+
+  final result = returnStruct7BytesInt4ByteAlignedCalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void returnStruct7BytesInt4ByteAlignedAfterCallback() {
+  free(returnStruct7BytesInt4ByteAlignedResult.addressOf);
+
+  final result = returnStruct7BytesInt4ByteAlignedCalculateResult();
+
+  print("after callback result = $result");
+
+  free(returnStruct7BytesInt4ByteAlignedResult.addressOf);
+}
+
+typedef ReturnStruct8BytesIntType = Struct8BytesInt Function(
+    Int16, Int16, Int32);
+
+// Global variables to be able to test inputs after callback returned.
+int returnStruct8BytesInt_a0 = 0;
+int returnStruct8BytesInt_a1 = 0;
+int returnStruct8BytesInt_a2 = 0;
+
+// Result variable also global, so we can delete it after the callback.
+Struct8BytesInt returnStruct8BytesIntResult = Struct8BytesInt();
+
+Struct8BytesInt returnStruct8BytesIntCalculateResult() {
+  Struct8BytesInt result = allocate<Struct8BytesInt>().ref;
+
+  result.a0 = returnStruct8BytesInt_a0;
+  result.a1 = returnStruct8BytesInt_a1;
+  result.a2 = returnStruct8BytesInt_a2;
+
+  returnStruct8BytesIntResult = result;
+
+  return result;
+}
+
+/// Return value in integer registers on many architectures.
+Struct8BytesInt returnStruct8BytesInt(int a0, int a1, int a2) {
+  print("returnStruct8BytesInt(${a0}, ${a1}, ${a2})");
+
+  // In legacy mode, possibly return null.
+  if (a0 == 84) {
+    print("returning null!");
+    return null;
+  }
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0 == 42 || a0 == 84) {
+    print("throwing!");
+    throw Exception("ReturnStruct8BytesInt throwing on purpuse!");
+  }
+
+  returnStruct8BytesInt_a0 = a0;
+  returnStruct8BytesInt_a1 = a1;
+  returnStruct8BytesInt_a2 = a2;
+
+  final result = returnStruct8BytesIntCalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void returnStruct8BytesIntAfterCallback() {
+  free(returnStruct8BytesIntResult.addressOf);
+
+  final result = returnStruct8BytesIntCalculateResult();
+
+  print("after callback result = $result");
+
+  free(returnStruct8BytesIntResult.addressOf);
+}
+
+typedef ReturnStruct8BytesHomogeneousFloatType = Struct8BytesHomogeneousFloat
+    Function(Float, Float);
+
+// Global variables to be able to test inputs after callback returned.
+double returnStruct8BytesHomogeneousFloat_a0 = 0.0;
+double returnStruct8BytesHomogeneousFloat_a1 = 0.0;
+
+// Result variable also global, so we can delete it after the callback.
+Struct8BytesHomogeneousFloat returnStruct8BytesHomogeneousFloatResult =
+    Struct8BytesHomogeneousFloat();
+
+Struct8BytesHomogeneousFloat
+    returnStruct8BytesHomogeneousFloatCalculateResult() {
+  Struct8BytesHomogeneousFloat result =
+      allocate<Struct8BytesHomogeneousFloat>().ref;
+
+  result.a0 = returnStruct8BytesHomogeneousFloat_a0;
+  result.a1 = returnStruct8BytesHomogeneousFloat_a1;
+
+  returnStruct8BytesHomogeneousFloatResult = result;
+
+  return result;
+}
+
+/// Return value in FP registers on many architectures.
+Struct8BytesHomogeneousFloat returnStruct8BytesHomogeneousFloat(
+    double a0, double a1) {
+  print("returnStruct8BytesHomogeneousFloat(${a0}, ${a1})");
+
+  // In legacy mode, possibly return null.
+  if (a0 == 84) {
+    print("returning null!");
+    return null;
+  }
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0 == 42 || a0 == 84) {
+    print("throwing!");
+    throw Exception("ReturnStruct8BytesHomogeneousFloat throwing on purpuse!");
+  }
+
+  returnStruct8BytesHomogeneousFloat_a0 = a0;
+  returnStruct8BytesHomogeneousFloat_a1 = a1;
+
+  final result = returnStruct8BytesHomogeneousFloatCalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void returnStruct8BytesHomogeneousFloatAfterCallback() {
+  free(returnStruct8BytesHomogeneousFloatResult.addressOf);
+
+  final result = returnStruct8BytesHomogeneousFloatCalculateResult();
+
+  print("after callback result = $result");
+
+  free(returnStruct8BytesHomogeneousFloatResult.addressOf);
+}
+
+typedef ReturnStruct8BytesMixedType = Struct8BytesMixed Function(
+    Float, Int16, Int16);
+
+// Global variables to be able to test inputs after callback returned.
+double returnStruct8BytesMixed_a0 = 0.0;
+int returnStruct8BytesMixed_a1 = 0;
+int returnStruct8BytesMixed_a2 = 0;
+
+// Result variable also global, so we can delete it after the callback.
+Struct8BytesMixed returnStruct8BytesMixedResult = Struct8BytesMixed();
+
+Struct8BytesMixed returnStruct8BytesMixedCalculateResult() {
+  Struct8BytesMixed result = allocate<Struct8BytesMixed>().ref;
+
+  result.a0 = returnStruct8BytesMixed_a0;
+  result.a1 = returnStruct8BytesMixed_a1;
+  result.a2 = returnStruct8BytesMixed_a2;
+
+  returnStruct8BytesMixedResult = result;
+
+  return result;
+}
+
+/// Return value split over FP and integer register in x64.
+Struct8BytesMixed returnStruct8BytesMixed(double a0, int a1, int a2) {
+  print("returnStruct8BytesMixed(${a0}, ${a1}, ${a2})");
+
+  // In legacy mode, possibly return null.
+  if (a0 == 84) {
+    print("returning null!");
+    return null;
+  }
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0 == 42 || a0 == 84) {
+    print("throwing!");
+    throw Exception("ReturnStruct8BytesMixed throwing on purpuse!");
+  }
+
+  returnStruct8BytesMixed_a0 = a0;
+  returnStruct8BytesMixed_a1 = a1;
+  returnStruct8BytesMixed_a2 = a2;
+
+  final result = returnStruct8BytesMixedCalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void returnStruct8BytesMixedAfterCallback() {
+  free(returnStruct8BytesMixedResult.addressOf);
+
+  final result = returnStruct8BytesMixedCalculateResult();
+
+  print("after callback result = $result");
+
+  free(returnStruct8BytesMixedResult.addressOf);
+}
+
+typedef ReturnStruct9BytesHomogeneousUint8Type = Struct9BytesHomogeneousUint8
+    Function(Uint8, Uint8, Uint8, Uint8, Uint8, Uint8, Uint8, Uint8, Uint8);
+
+// Global variables to be able to test inputs after callback returned.
+int returnStruct9BytesHomogeneousUint8_a0 = 0;
+int returnStruct9BytesHomogeneousUint8_a1 = 0;
+int returnStruct9BytesHomogeneousUint8_a2 = 0;
+int returnStruct9BytesHomogeneousUint8_a3 = 0;
+int returnStruct9BytesHomogeneousUint8_a4 = 0;
+int returnStruct9BytesHomogeneousUint8_a5 = 0;
+int returnStruct9BytesHomogeneousUint8_a6 = 0;
+int returnStruct9BytesHomogeneousUint8_a7 = 0;
+int returnStruct9BytesHomogeneousUint8_a8 = 0;
+
+// Result variable also global, so we can delete it after the callback.
+Struct9BytesHomogeneousUint8 returnStruct9BytesHomogeneousUint8Result =
+    Struct9BytesHomogeneousUint8();
+
+Struct9BytesHomogeneousUint8
+    returnStruct9BytesHomogeneousUint8CalculateResult() {
+  Struct9BytesHomogeneousUint8 result =
+      allocate<Struct9BytesHomogeneousUint8>().ref;
+
+  result.a0 = returnStruct9BytesHomogeneousUint8_a0;
+  result.a1 = returnStruct9BytesHomogeneousUint8_a1;
+  result.a2 = returnStruct9BytesHomogeneousUint8_a2;
+  result.a3 = returnStruct9BytesHomogeneousUint8_a3;
+  result.a4 = returnStruct9BytesHomogeneousUint8_a4;
+  result.a5 = returnStruct9BytesHomogeneousUint8_a5;
+  result.a6 = returnStruct9BytesHomogeneousUint8_a6;
+  result.a7 = returnStruct9BytesHomogeneousUint8_a7;
+  result.a8 = returnStruct9BytesHomogeneousUint8_a8;
+
+  returnStruct9BytesHomogeneousUint8Result = result;
+
+  return result;
+}
+
+/// The minimum alignment of this struct is only 1 byte based on its fields.
+/// Test that the memory backing these structs is the right size and that
+/// dart:ffi trampolines do not write outside this size.
+Struct9BytesHomogeneousUint8 returnStruct9BytesHomogeneousUint8(
+    int a0, int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8) {
+  print(
+      "returnStruct9BytesHomogeneousUint8(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5}, ${a6}, ${a7}, ${a8})");
+
+  // In legacy mode, possibly return null.
+  if (a0 == 84) {
+    print("returning null!");
+    return null;
+  }
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0 == 42 || a0 == 84) {
+    print("throwing!");
+    throw Exception("ReturnStruct9BytesHomogeneousUint8 throwing on purpuse!");
+  }
+
+  returnStruct9BytesHomogeneousUint8_a0 = a0;
+  returnStruct9BytesHomogeneousUint8_a1 = a1;
+  returnStruct9BytesHomogeneousUint8_a2 = a2;
+  returnStruct9BytesHomogeneousUint8_a3 = a3;
+  returnStruct9BytesHomogeneousUint8_a4 = a4;
+  returnStruct9BytesHomogeneousUint8_a5 = a5;
+  returnStruct9BytesHomogeneousUint8_a6 = a6;
+  returnStruct9BytesHomogeneousUint8_a7 = a7;
+  returnStruct9BytesHomogeneousUint8_a8 = a8;
+
+  final result = returnStruct9BytesHomogeneousUint8CalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void returnStruct9BytesHomogeneousUint8AfterCallback() {
+  free(returnStruct9BytesHomogeneousUint8Result.addressOf);
+
+  final result = returnStruct9BytesHomogeneousUint8CalculateResult();
+
+  print("after callback result = $result");
+
+  free(returnStruct9BytesHomogeneousUint8Result.addressOf);
+}
+
+typedef ReturnStruct9BytesInt4Or8ByteAlignedType
+    = Struct9BytesInt4Or8ByteAligned Function(Int64, Int8);
+
+// Global variables to be able to test inputs after callback returned.
+int returnStruct9BytesInt4Or8ByteAligned_a0 = 0;
+int returnStruct9BytesInt4Or8ByteAligned_a1 = 0;
+
+// Result variable also global, so we can delete it after the callback.
+Struct9BytesInt4Or8ByteAligned returnStruct9BytesInt4Or8ByteAlignedResult =
+    Struct9BytesInt4Or8ByteAligned();
+
+Struct9BytesInt4Or8ByteAligned
+    returnStruct9BytesInt4Or8ByteAlignedCalculateResult() {
+  Struct9BytesInt4Or8ByteAligned result =
+      allocate<Struct9BytesInt4Or8ByteAligned>().ref;
+
+  result.a0 = returnStruct9BytesInt4Or8ByteAligned_a0;
+  result.a1 = returnStruct9BytesInt4Or8ByteAligned_a1;
+
+  returnStruct9BytesInt4Or8ByteAlignedResult = result;
+
+  return result;
+}
+
+/// Return value in two integer registers on x64.
+/// With alignment rules taken into account size is 12 or 16 bytes.
+Struct9BytesInt4Or8ByteAligned returnStruct9BytesInt4Or8ByteAligned(
+    int a0, int a1) {
+  print("returnStruct9BytesInt4Or8ByteAligned(${a0}, ${a1})");
+
+  // In legacy mode, possibly return null.
+  if (a0 == 84) {
+    print("returning null!");
+    return null;
+  }
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0 == 42 || a0 == 84) {
+    print("throwing!");
+    throw Exception(
+        "ReturnStruct9BytesInt4Or8ByteAligned throwing on purpuse!");
+  }
+
+  returnStruct9BytesInt4Or8ByteAligned_a0 = a0;
+  returnStruct9BytesInt4Or8ByteAligned_a1 = a1;
+
+  final result = returnStruct9BytesInt4Or8ByteAlignedCalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void returnStruct9BytesInt4Or8ByteAlignedAfterCallback() {
+  free(returnStruct9BytesInt4Or8ByteAlignedResult.addressOf);
+
+  final result = returnStruct9BytesInt4Or8ByteAlignedCalculateResult();
+
+  print("after callback result = $result");
+
+  free(returnStruct9BytesInt4Or8ByteAlignedResult.addressOf);
+}
+
+typedef ReturnStruct12BytesHomogeneousFloatType = Struct12BytesHomogeneousFloat
+    Function(Float, Float, Float);
+
+// Global variables to be able to test inputs after callback returned.
+double returnStruct12BytesHomogeneousFloat_a0 = 0.0;
+double returnStruct12BytesHomogeneousFloat_a1 = 0.0;
+double returnStruct12BytesHomogeneousFloat_a2 = 0.0;
+
+// Result variable also global, so we can delete it after the callback.
+Struct12BytesHomogeneousFloat returnStruct12BytesHomogeneousFloatResult =
+    Struct12BytesHomogeneousFloat();
+
+Struct12BytesHomogeneousFloat
+    returnStruct12BytesHomogeneousFloatCalculateResult() {
+  Struct12BytesHomogeneousFloat result =
+      allocate<Struct12BytesHomogeneousFloat>().ref;
+
+  result.a0 = returnStruct12BytesHomogeneousFloat_a0;
+  result.a1 = returnStruct12BytesHomogeneousFloat_a1;
+  result.a2 = returnStruct12BytesHomogeneousFloat_a2;
+
+  returnStruct12BytesHomogeneousFloatResult = result;
+
+  return result;
+}
+
+/// Return value in FPU registers, but does not use all registers on arm hardfp
+/// and arm64.
+Struct12BytesHomogeneousFloat returnStruct12BytesHomogeneousFloat(
+    double a0, double a1, double a2) {
+  print("returnStruct12BytesHomogeneousFloat(${a0}, ${a1}, ${a2})");
+
+  // In legacy mode, possibly return null.
+  if (a0 == 84) {
+    print("returning null!");
+    return null;
+  }
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0 == 42 || a0 == 84) {
+    print("throwing!");
+    throw Exception("ReturnStruct12BytesHomogeneousFloat throwing on purpuse!");
+  }
+
+  returnStruct12BytesHomogeneousFloat_a0 = a0;
+  returnStruct12BytesHomogeneousFloat_a1 = a1;
+  returnStruct12BytesHomogeneousFloat_a2 = a2;
+
+  final result = returnStruct12BytesHomogeneousFloatCalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void returnStruct12BytesHomogeneousFloatAfterCallback() {
+  free(returnStruct12BytesHomogeneousFloatResult.addressOf);
+
+  final result = returnStruct12BytesHomogeneousFloatCalculateResult();
+
+  print("after callback result = $result");
+
+  free(returnStruct12BytesHomogeneousFloatResult.addressOf);
+}
+
+typedef ReturnStruct16BytesHomogeneousFloatType = Struct16BytesHomogeneousFloat
+    Function(Float, Float, Float, Float);
+
+// Global variables to be able to test inputs after callback returned.
+double returnStruct16BytesHomogeneousFloat_a0 = 0.0;
+double returnStruct16BytesHomogeneousFloat_a1 = 0.0;
+double returnStruct16BytesHomogeneousFloat_a2 = 0.0;
+double returnStruct16BytesHomogeneousFloat_a3 = 0.0;
+
+// Result variable also global, so we can delete it after the callback.
+Struct16BytesHomogeneousFloat returnStruct16BytesHomogeneousFloatResult =
+    Struct16BytesHomogeneousFloat();
+
+Struct16BytesHomogeneousFloat
+    returnStruct16BytesHomogeneousFloatCalculateResult() {
+  Struct16BytesHomogeneousFloat result =
+      allocate<Struct16BytesHomogeneousFloat>().ref;
+
+  result.a0 = returnStruct16BytesHomogeneousFloat_a0;
+  result.a1 = returnStruct16BytesHomogeneousFloat_a1;
+  result.a2 = returnStruct16BytesHomogeneousFloat_a2;
+  result.a3 = returnStruct16BytesHomogeneousFloat_a3;
+
+  returnStruct16BytesHomogeneousFloatResult = result;
+
+  return result;
+}
+
+/// Return value in FPU registers on arm hardfp and arm64.
+Struct16BytesHomogeneousFloat returnStruct16BytesHomogeneousFloat(
+    double a0, double a1, double a2, double a3) {
+  print("returnStruct16BytesHomogeneousFloat(${a0}, ${a1}, ${a2}, ${a3})");
+
+  // In legacy mode, possibly return null.
+  if (a0 == 84) {
+    print("returning null!");
+    return null;
+  }
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0 == 42 || a0 == 84) {
+    print("throwing!");
+    throw Exception("ReturnStruct16BytesHomogeneousFloat throwing on purpuse!");
+  }
+
+  returnStruct16BytesHomogeneousFloat_a0 = a0;
+  returnStruct16BytesHomogeneousFloat_a1 = a1;
+  returnStruct16BytesHomogeneousFloat_a2 = a2;
+  returnStruct16BytesHomogeneousFloat_a3 = a3;
+
+  final result = returnStruct16BytesHomogeneousFloatCalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void returnStruct16BytesHomogeneousFloatAfterCallback() {
+  free(returnStruct16BytesHomogeneousFloatResult.addressOf);
+
+  final result = returnStruct16BytesHomogeneousFloatCalculateResult();
+
+  print("after callback result = $result");
+
+  free(returnStruct16BytesHomogeneousFloatResult.addressOf);
+}
+
+typedef ReturnStruct16BytesMixedType = Struct16BytesMixed Function(
+    Double, Int64);
+
+// Global variables to be able to test inputs after callback returned.
+double returnStruct16BytesMixed_a0 = 0.0;
+int returnStruct16BytesMixed_a1 = 0;
+
+// Result variable also global, so we can delete it after the callback.
+Struct16BytesMixed returnStruct16BytesMixedResult = Struct16BytesMixed();
+
+Struct16BytesMixed returnStruct16BytesMixedCalculateResult() {
+  Struct16BytesMixed result = allocate<Struct16BytesMixed>().ref;
+
+  result.a0 = returnStruct16BytesMixed_a0;
+  result.a1 = returnStruct16BytesMixed_a1;
+
+  returnStruct16BytesMixedResult = result;
+
+  return result;
+}
+
+/// Return value split over FP and integer register in x64.
+Struct16BytesMixed returnStruct16BytesMixed(double a0, int a1) {
+  print("returnStruct16BytesMixed(${a0}, ${a1})");
+
+  // In legacy mode, possibly return null.
+  if (a0 == 84) {
+    print("returning null!");
+    return null;
+  }
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0 == 42 || a0 == 84) {
+    print("throwing!");
+    throw Exception("ReturnStruct16BytesMixed throwing on purpuse!");
+  }
+
+  returnStruct16BytesMixed_a0 = a0;
+  returnStruct16BytesMixed_a1 = a1;
+
+  final result = returnStruct16BytesMixedCalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void returnStruct16BytesMixedAfterCallback() {
+  free(returnStruct16BytesMixedResult.addressOf);
+
+  final result = returnStruct16BytesMixedCalculateResult();
+
+  print("after callback result = $result");
+
+  free(returnStruct16BytesMixedResult.addressOf);
+}
+
+typedef ReturnStruct16BytesMixed2Type = Struct16BytesMixed2 Function(
+    Float, Float, Float, Int32);
+
+// Global variables to be able to test inputs after callback returned.
+double returnStruct16BytesMixed2_a0 = 0.0;
+double returnStruct16BytesMixed2_a1 = 0.0;
+double returnStruct16BytesMixed2_a2 = 0.0;
+int returnStruct16BytesMixed2_a3 = 0;
+
+// Result variable also global, so we can delete it after the callback.
+Struct16BytesMixed2 returnStruct16BytesMixed2Result = Struct16BytesMixed2();
+
+Struct16BytesMixed2 returnStruct16BytesMixed2CalculateResult() {
+  Struct16BytesMixed2 result = allocate<Struct16BytesMixed2>().ref;
+
+  result.a0 = returnStruct16BytesMixed2_a0;
+  result.a1 = returnStruct16BytesMixed2_a1;
+  result.a2 = returnStruct16BytesMixed2_a2;
+  result.a3 = returnStruct16BytesMixed2_a3;
+
+  returnStruct16BytesMixed2Result = result;
+
+  return result;
+}
+
+/// Return value split over FP and integer register in x64.
+/// The integer register contains half float half int.
+Struct16BytesMixed2 returnStruct16BytesMixed2(
+    double a0, double a1, double a2, int a3) {
+  print("returnStruct16BytesMixed2(${a0}, ${a1}, ${a2}, ${a3})");
+
+  // In legacy mode, possibly return null.
+  if (a0 == 84) {
+    print("returning null!");
+    return null;
+  }
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0 == 42 || a0 == 84) {
+    print("throwing!");
+    throw Exception("ReturnStruct16BytesMixed2 throwing on purpuse!");
+  }
+
+  returnStruct16BytesMixed2_a0 = a0;
+  returnStruct16BytesMixed2_a1 = a1;
+  returnStruct16BytesMixed2_a2 = a2;
+  returnStruct16BytesMixed2_a3 = a3;
+
+  final result = returnStruct16BytesMixed2CalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void returnStruct16BytesMixed2AfterCallback() {
+  free(returnStruct16BytesMixed2Result.addressOf);
+
+  final result = returnStruct16BytesMixed2CalculateResult();
+
+  print("after callback result = $result");
+
+  free(returnStruct16BytesMixed2Result.addressOf);
+}
+
+typedef ReturnStruct17BytesIntType = Struct17BytesInt Function(
+    Int64, Int64, Int8);
+
+// Global variables to be able to test inputs after callback returned.
+int returnStruct17BytesInt_a0 = 0;
+int returnStruct17BytesInt_a1 = 0;
+int returnStruct17BytesInt_a2 = 0;
+
+// Result variable also global, so we can delete it after the callback.
+Struct17BytesInt returnStruct17BytesIntResult = Struct17BytesInt();
+
+Struct17BytesInt returnStruct17BytesIntCalculateResult() {
+  Struct17BytesInt result = allocate<Struct17BytesInt>().ref;
+
+  result.a0 = returnStruct17BytesInt_a0;
+  result.a1 = returnStruct17BytesInt_a1;
+  result.a2 = returnStruct17BytesInt_a2;
+
+  returnStruct17BytesIntResult = result;
+
+  return result;
+}
+
+/// Rerturn value returned in preallocated space passed by pointer on most ABIs.
+/// Is non word size on purpose, to test that structs are rounded up to word size
+/// on all ABIs.
+Struct17BytesInt returnStruct17BytesInt(int a0, int a1, int a2) {
+  print("returnStruct17BytesInt(${a0}, ${a1}, ${a2})");
+
+  // In legacy mode, possibly return null.
+  if (a0 == 84) {
+    print("returning null!");
+    return null;
+  }
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0 == 42 || a0 == 84) {
+    print("throwing!");
+    throw Exception("ReturnStruct17BytesInt throwing on purpuse!");
+  }
+
+  returnStruct17BytesInt_a0 = a0;
+  returnStruct17BytesInt_a1 = a1;
+  returnStruct17BytesInt_a2 = a2;
+
+  final result = returnStruct17BytesIntCalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void returnStruct17BytesIntAfterCallback() {
+  free(returnStruct17BytesIntResult.addressOf);
+
+  final result = returnStruct17BytesIntCalculateResult();
+
+  print("after callback result = $result");
+
+  free(returnStruct17BytesIntResult.addressOf);
+}
+
+typedef ReturnStruct19BytesHomogeneousUint8Type
+    = Struct19BytesHomogeneousUint8 Function(
+        Uint8,
+        Uint8,
+        Uint8,
+        Uint8,
+        Uint8,
+        Uint8,
+        Uint8,
+        Uint8,
+        Uint8,
+        Uint8,
+        Uint8,
+        Uint8,
+        Uint8,
+        Uint8,
+        Uint8,
+        Uint8,
+        Uint8,
+        Uint8,
+        Uint8);
+
+// Global variables to be able to test inputs after callback returned.
+int returnStruct19BytesHomogeneousUint8_a0 = 0;
+int returnStruct19BytesHomogeneousUint8_a1 = 0;
+int returnStruct19BytesHomogeneousUint8_a2 = 0;
+int returnStruct19BytesHomogeneousUint8_a3 = 0;
+int returnStruct19BytesHomogeneousUint8_a4 = 0;
+int returnStruct19BytesHomogeneousUint8_a5 = 0;
+int returnStruct19BytesHomogeneousUint8_a6 = 0;
+int returnStruct19BytesHomogeneousUint8_a7 = 0;
+int returnStruct19BytesHomogeneousUint8_a8 = 0;
+int returnStruct19BytesHomogeneousUint8_a9 = 0;
+int returnStruct19BytesHomogeneousUint8_a10 = 0;
+int returnStruct19BytesHomogeneousUint8_a11 = 0;
+int returnStruct19BytesHomogeneousUint8_a12 = 0;
+int returnStruct19BytesHomogeneousUint8_a13 = 0;
+int returnStruct19BytesHomogeneousUint8_a14 = 0;
+int returnStruct19BytesHomogeneousUint8_a15 = 0;
+int returnStruct19BytesHomogeneousUint8_a16 = 0;
+int returnStruct19BytesHomogeneousUint8_a17 = 0;
+int returnStruct19BytesHomogeneousUint8_a18 = 0;
+
+// Result variable also global, so we can delete it after the callback.
+Struct19BytesHomogeneousUint8 returnStruct19BytesHomogeneousUint8Result =
+    Struct19BytesHomogeneousUint8();
+
+Struct19BytesHomogeneousUint8
+    returnStruct19BytesHomogeneousUint8CalculateResult() {
+  Struct19BytesHomogeneousUint8 result =
+      allocate<Struct19BytesHomogeneousUint8>().ref;
+
+  result.a0 = returnStruct19BytesHomogeneousUint8_a0;
+  result.a1 = returnStruct19BytesHomogeneousUint8_a1;
+  result.a2 = returnStruct19BytesHomogeneousUint8_a2;
+  result.a3 = returnStruct19BytesHomogeneousUint8_a3;
+  result.a4 = returnStruct19BytesHomogeneousUint8_a4;
+  result.a5 = returnStruct19BytesHomogeneousUint8_a5;
+  result.a6 = returnStruct19BytesHomogeneousUint8_a6;
+  result.a7 = returnStruct19BytesHomogeneousUint8_a7;
+  result.a8 = returnStruct19BytesHomogeneousUint8_a8;
+  result.a9 = returnStruct19BytesHomogeneousUint8_a9;
+  result.a10 = returnStruct19BytesHomogeneousUint8_a10;
+  result.a11 = returnStruct19BytesHomogeneousUint8_a11;
+  result.a12 = returnStruct19BytesHomogeneousUint8_a12;
+  result.a13 = returnStruct19BytesHomogeneousUint8_a13;
+  result.a14 = returnStruct19BytesHomogeneousUint8_a14;
+  result.a15 = returnStruct19BytesHomogeneousUint8_a15;
+  result.a16 = returnStruct19BytesHomogeneousUint8_a16;
+  result.a17 = returnStruct19BytesHomogeneousUint8_a17;
+  result.a18 = returnStruct19BytesHomogeneousUint8_a18;
+
+  returnStruct19BytesHomogeneousUint8Result = result;
+
+  return result;
+}
+
+/// The minimum alignment of this struct is only 1 byte based on its fields.
+/// Test that the memory backing these structs is the right size and that
+/// dart:ffi trampolines do not write outside this size.
+Struct19BytesHomogeneousUint8 returnStruct19BytesHomogeneousUint8(
+    int a0,
+    int a1,
+    int a2,
+    int a3,
+    int a4,
+    int a5,
+    int a6,
+    int a7,
+    int a8,
+    int a9,
+    int a10,
+    int a11,
+    int a12,
+    int a13,
+    int a14,
+    int a15,
+    int a16,
+    int a17,
+    int a18) {
+  print(
+      "returnStruct19BytesHomogeneousUint8(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5}, ${a6}, ${a7}, ${a8}, ${a9}, ${a10}, ${a11}, ${a12}, ${a13}, ${a14}, ${a15}, ${a16}, ${a17}, ${a18})");
+
+  // In legacy mode, possibly return null.
+  if (a0 == 84) {
+    print("returning null!");
+    return null;
+  }
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0 == 42 || a0 == 84) {
+    print("throwing!");
+    throw Exception("ReturnStruct19BytesHomogeneousUint8 throwing on purpuse!");
+  }
+
+  returnStruct19BytesHomogeneousUint8_a0 = a0;
+  returnStruct19BytesHomogeneousUint8_a1 = a1;
+  returnStruct19BytesHomogeneousUint8_a2 = a2;
+  returnStruct19BytesHomogeneousUint8_a3 = a3;
+  returnStruct19BytesHomogeneousUint8_a4 = a4;
+  returnStruct19BytesHomogeneousUint8_a5 = a5;
+  returnStruct19BytesHomogeneousUint8_a6 = a6;
+  returnStruct19BytesHomogeneousUint8_a7 = a7;
+  returnStruct19BytesHomogeneousUint8_a8 = a8;
+  returnStruct19BytesHomogeneousUint8_a9 = a9;
+  returnStruct19BytesHomogeneousUint8_a10 = a10;
+  returnStruct19BytesHomogeneousUint8_a11 = a11;
+  returnStruct19BytesHomogeneousUint8_a12 = a12;
+  returnStruct19BytesHomogeneousUint8_a13 = a13;
+  returnStruct19BytesHomogeneousUint8_a14 = a14;
+  returnStruct19BytesHomogeneousUint8_a15 = a15;
+  returnStruct19BytesHomogeneousUint8_a16 = a16;
+  returnStruct19BytesHomogeneousUint8_a17 = a17;
+  returnStruct19BytesHomogeneousUint8_a18 = a18;
+
+  final result = returnStruct19BytesHomogeneousUint8CalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void returnStruct19BytesHomogeneousUint8AfterCallback() {
+  free(returnStruct19BytesHomogeneousUint8Result.addressOf);
+
+  final result = returnStruct19BytesHomogeneousUint8CalculateResult();
+
+  print("after callback result = $result");
+
+  free(returnStruct19BytesHomogeneousUint8Result.addressOf);
+}
+
+typedef ReturnStruct20BytesHomogeneousInt32Type = Struct20BytesHomogeneousInt32
+    Function(Int32, Int32, Int32, Int32, Int32);
+
+// Global variables to be able to test inputs after callback returned.
+int returnStruct20BytesHomogeneousInt32_a0 = 0;
+int returnStruct20BytesHomogeneousInt32_a1 = 0;
+int returnStruct20BytesHomogeneousInt32_a2 = 0;
+int returnStruct20BytesHomogeneousInt32_a3 = 0;
+int returnStruct20BytesHomogeneousInt32_a4 = 0;
+
+// Result variable also global, so we can delete it after the callback.
+Struct20BytesHomogeneousInt32 returnStruct20BytesHomogeneousInt32Result =
+    Struct20BytesHomogeneousInt32();
+
+Struct20BytesHomogeneousInt32
+    returnStruct20BytesHomogeneousInt32CalculateResult() {
+  Struct20BytesHomogeneousInt32 result =
+      allocate<Struct20BytesHomogeneousInt32>().ref;
+
+  result.a0 = returnStruct20BytesHomogeneousInt32_a0;
+  result.a1 = returnStruct20BytesHomogeneousInt32_a1;
+  result.a2 = returnStruct20BytesHomogeneousInt32_a2;
+  result.a3 = returnStruct20BytesHomogeneousInt32_a3;
+  result.a4 = returnStruct20BytesHomogeneousInt32_a4;
+
+  returnStruct20BytesHomogeneousInt32Result = result;
+
+  return result;
+}
+
+/// Return value too big to go in cpu registers on arm64.
+Struct20BytesHomogeneousInt32 returnStruct20BytesHomogeneousInt32(
+    int a0, int a1, int a2, int a3, int a4) {
+  print(
+      "returnStruct20BytesHomogeneousInt32(${a0}, ${a1}, ${a2}, ${a3}, ${a4})");
+
+  // In legacy mode, possibly return null.
+  if (a0 == 84) {
+    print("returning null!");
+    return null;
+  }
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0 == 42 || a0 == 84) {
+    print("throwing!");
+    throw Exception("ReturnStruct20BytesHomogeneousInt32 throwing on purpuse!");
+  }
+
+  returnStruct20BytesHomogeneousInt32_a0 = a0;
+  returnStruct20BytesHomogeneousInt32_a1 = a1;
+  returnStruct20BytesHomogeneousInt32_a2 = a2;
+  returnStruct20BytesHomogeneousInt32_a3 = a3;
+  returnStruct20BytesHomogeneousInt32_a4 = a4;
+
+  final result = returnStruct20BytesHomogeneousInt32CalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void returnStruct20BytesHomogeneousInt32AfterCallback() {
+  free(returnStruct20BytesHomogeneousInt32Result.addressOf);
+
+  final result = returnStruct20BytesHomogeneousInt32CalculateResult();
+
+  print("after callback result = $result");
+
+  free(returnStruct20BytesHomogeneousInt32Result.addressOf);
+}
+
+typedef ReturnStruct20BytesHomogeneousFloatType = Struct20BytesHomogeneousFloat
+    Function(Float, Float, Float, Float, Float);
+
+// Global variables to be able to test inputs after callback returned.
+double returnStruct20BytesHomogeneousFloat_a0 = 0.0;
+double returnStruct20BytesHomogeneousFloat_a1 = 0.0;
+double returnStruct20BytesHomogeneousFloat_a2 = 0.0;
+double returnStruct20BytesHomogeneousFloat_a3 = 0.0;
+double returnStruct20BytesHomogeneousFloat_a4 = 0.0;
+
+// Result variable also global, so we can delete it after the callback.
+Struct20BytesHomogeneousFloat returnStruct20BytesHomogeneousFloatResult =
+    Struct20BytesHomogeneousFloat();
+
+Struct20BytesHomogeneousFloat
+    returnStruct20BytesHomogeneousFloatCalculateResult() {
+  Struct20BytesHomogeneousFloat result =
+      allocate<Struct20BytesHomogeneousFloat>().ref;
+
+  result.a0 = returnStruct20BytesHomogeneousFloat_a0;
+  result.a1 = returnStruct20BytesHomogeneousFloat_a1;
+  result.a2 = returnStruct20BytesHomogeneousFloat_a2;
+  result.a3 = returnStruct20BytesHomogeneousFloat_a3;
+  result.a4 = returnStruct20BytesHomogeneousFloat_a4;
+
+  returnStruct20BytesHomogeneousFloatResult = result;
+
+  return result;
+}
+
+/// Return value too big to go in FPU registers on x64, arm hardfp and arm64.
+Struct20BytesHomogeneousFloat returnStruct20BytesHomogeneousFloat(
+    double a0, double a1, double a2, double a3, double a4) {
+  print(
+      "returnStruct20BytesHomogeneousFloat(${a0}, ${a1}, ${a2}, ${a3}, ${a4})");
+
+  // In legacy mode, possibly return null.
+  if (a0 == 84) {
+    print("returning null!");
+    return null;
+  }
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0 == 42 || a0 == 84) {
+    print("throwing!");
+    throw Exception("ReturnStruct20BytesHomogeneousFloat throwing on purpuse!");
+  }
+
+  returnStruct20BytesHomogeneousFloat_a0 = a0;
+  returnStruct20BytesHomogeneousFloat_a1 = a1;
+  returnStruct20BytesHomogeneousFloat_a2 = a2;
+  returnStruct20BytesHomogeneousFloat_a3 = a3;
+  returnStruct20BytesHomogeneousFloat_a4 = a4;
+
+  final result = returnStruct20BytesHomogeneousFloatCalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void returnStruct20BytesHomogeneousFloatAfterCallback() {
+  free(returnStruct20BytesHomogeneousFloatResult.addressOf);
+
+  final result = returnStruct20BytesHomogeneousFloatCalculateResult();
+
+  print("after callback result = $result");
+
+  free(returnStruct20BytesHomogeneousFloatResult.addressOf);
+}
+
+typedef ReturnStruct32BytesHomogeneousDoubleType
+    = Struct32BytesHomogeneousDouble Function(Double, Double, Double, Double);
+
+// Global variables to be able to test inputs after callback returned.
+double returnStruct32BytesHomogeneousDouble_a0 = 0.0;
+double returnStruct32BytesHomogeneousDouble_a1 = 0.0;
+double returnStruct32BytesHomogeneousDouble_a2 = 0.0;
+double returnStruct32BytesHomogeneousDouble_a3 = 0.0;
+
+// Result variable also global, so we can delete it after the callback.
+Struct32BytesHomogeneousDouble returnStruct32BytesHomogeneousDoubleResult =
+    Struct32BytesHomogeneousDouble();
+
+Struct32BytesHomogeneousDouble
+    returnStruct32BytesHomogeneousDoubleCalculateResult() {
+  Struct32BytesHomogeneousDouble result =
+      allocate<Struct32BytesHomogeneousDouble>().ref;
+
+  result.a0 = returnStruct32BytesHomogeneousDouble_a0;
+  result.a1 = returnStruct32BytesHomogeneousDouble_a1;
+  result.a2 = returnStruct32BytesHomogeneousDouble_a2;
+  result.a3 = returnStruct32BytesHomogeneousDouble_a3;
+
+  returnStruct32BytesHomogeneousDoubleResult = result;
+
+  return result;
+}
+
+/// Return value in FPU registers on arm64.
+Struct32BytesHomogeneousDouble returnStruct32BytesHomogeneousDouble(
+    double a0, double a1, double a2, double a3) {
+  print("returnStruct32BytesHomogeneousDouble(${a0}, ${a1}, ${a2}, ${a3})");
+
+  // In legacy mode, possibly return null.
+  if (a0 == 84) {
+    print("returning null!");
+    return null;
+  }
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0 == 42 || a0 == 84) {
+    print("throwing!");
+    throw Exception(
+        "ReturnStruct32BytesHomogeneousDouble throwing on purpuse!");
+  }
+
+  returnStruct32BytesHomogeneousDouble_a0 = a0;
+  returnStruct32BytesHomogeneousDouble_a1 = a1;
+  returnStruct32BytesHomogeneousDouble_a2 = a2;
+  returnStruct32BytesHomogeneousDouble_a3 = a3;
+
+  final result = returnStruct32BytesHomogeneousDoubleCalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void returnStruct32BytesHomogeneousDoubleAfterCallback() {
+  free(returnStruct32BytesHomogeneousDoubleResult.addressOf);
+
+  final result = returnStruct32BytesHomogeneousDoubleCalculateResult();
+
+  print("after callback result = $result");
+
+  free(returnStruct32BytesHomogeneousDoubleResult.addressOf);
+}
+
+typedef ReturnStruct40BytesHomogeneousDoubleType
+    = Struct40BytesHomogeneousDouble Function(
+        Double, Double, Double, Double, Double);
+
+// Global variables to be able to test inputs after callback returned.
+double returnStruct40BytesHomogeneousDouble_a0 = 0.0;
+double returnStruct40BytesHomogeneousDouble_a1 = 0.0;
+double returnStruct40BytesHomogeneousDouble_a2 = 0.0;
+double returnStruct40BytesHomogeneousDouble_a3 = 0.0;
+double returnStruct40BytesHomogeneousDouble_a4 = 0.0;
+
+// Result variable also global, so we can delete it after the callback.
+Struct40BytesHomogeneousDouble returnStruct40BytesHomogeneousDoubleResult =
+    Struct40BytesHomogeneousDouble();
+
+Struct40BytesHomogeneousDouble
+    returnStruct40BytesHomogeneousDoubleCalculateResult() {
+  Struct40BytesHomogeneousDouble result =
+      allocate<Struct40BytesHomogeneousDouble>().ref;
+
+  result.a0 = returnStruct40BytesHomogeneousDouble_a0;
+  result.a1 = returnStruct40BytesHomogeneousDouble_a1;
+  result.a2 = returnStruct40BytesHomogeneousDouble_a2;
+  result.a3 = returnStruct40BytesHomogeneousDouble_a3;
+  result.a4 = returnStruct40BytesHomogeneousDouble_a4;
+
+  returnStruct40BytesHomogeneousDoubleResult = result;
+
+  return result;
+}
+
+/// Return value too big to go in FPU registers on arm64.
+Struct40BytesHomogeneousDouble returnStruct40BytesHomogeneousDouble(
+    double a0, double a1, double a2, double a3, double a4) {
+  print(
+      "returnStruct40BytesHomogeneousDouble(${a0}, ${a1}, ${a2}, ${a3}, ${a4})");
+
+  // In legacy mode, possibly return null.
+  if (a0 == 84) {
+    print("returning null!");
+    return null;
+  }
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0 == 42 || a0 == 84) {
+    print("throwing!");
+    throw Exception(
+        "ReturnStruct40BytesHomogeneousDouble throwing on purpuse!");
+  }
+
+  returnStruct40BytesHomogeneousDouble_a0 = a0;
+  returnStruct40BytesHomogeneousDouble_a1 = a1;
+  returnStruct40BytesHomogeneousDouble_a2 = a2;
+  returnStruct40BytesHomogeneousDouble_a3 = a3;
+  returnStruct40BytesHomogeneousDouble_a4 = a4;
+
+  final result = returnStruct40BytesHomogeneousDoubleCalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void returnStruct40BytesHomogeneousDoubleAfterCallback() {
+  free(returnStruct40BytesHomogeneousDoubleResult.addressOf);
+
+  final result = returnStruct40BytesHomogeneousDoubleCalculateResult();
+
+  print("after callback result = $result");
+
+  free(returnStruct40BytesHomogeneousDoubleResult.addressOf);
+}
+
+typedef ReturnStruct1024BytesHomogeneousUint64Type
+    = Struct1024BytesHomogeneousUint64 Function(
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64);
+
+// Global variables to be able to test inputs after callback returned.
+int returnStruct1024BytesHomogeneousUint64_a0 = 0;
+int returnStruct1024BytesHomogeneousUint64_a1 = 0;
+int returnStruct1024BytesHomogeneousUint64_a2 = 0;
+int returnStruct1024BytesHomogeneousUint64_a3 = 0;
+int returnStruct1024BytesHomogeneousUint64_a4 = 0;
+int returnStruct1024BytesHomogeneousUint64_a5 = 0;
+int returnStruct1024BytesHomogeneousUint64_a6 = 0;
+int returnStruct1024BytesHomogeneousUint64_a7 = 0;
+int returnStruct1024BytesHomogeneousUint64_a8 = 0;
+int returnStruct1024BytesHomogeneousUint64_a9 = 0;
+int returnStruct1024BytesHomogeneousUint64_a10 = 0;
+int returnStruct1024BytesHomogeneousUint64_a11 = 0;
+int returnStruct1024BytesHomogeneousUint64_a12 = 0;
+int returnStruct1024BytesHomogeneousUint64_a13 = 0;
+int returnStruct1024BytesHomogeneousUint64_a14 = 0;
+int returnStruct1024BytesHomogeneousUint64_a15 = 0;
+int returnStruct1024BytesHomogeneousUint64_a16 = 0;
+int returnStruct1024BytesHomogeneousUint64_a17 = 0;
+int returnStruct1024BytesHomogeneousUint64_a18 = 0;
+int returnStruct1024BytesHomogeneousUint64_a19 = 0;
+int returnStruct1024BytesHomogeneousUint64_a20 = 0;
+int returnStruct1024BytesHomogeneousUint64_a21 = 0;
+int returnStruct1024BytesHomogeneousUint64_a22 = 0;
+int returnStruct1024BytesHomogeneousUint64_a23 = 0;
+int returnStruct1024BytesHomogeneousUint64_a24 = 0;
+int returnStruct1024BytesHomogeneousUint64_a25 = 0;
+int returnStruct1024BytesHomogeneousUint64_a26 = 0;
+int returnStruct1024BytesHomogeneousUint64_a27 = 0;
+int returnStruct1024BytesHomogeneousUint64_a28 = 0;
+int returnStruct1024BytesHomogeneousUint64_a29 = 0;
+int returnStruct1024BytesHomogeneousUint64_a30 = 0;
+int returnStruct1024BytesHomogeneousUint64_a31 = 0;
+int returnStruct1024BytesHomogeneousUint64_a32 = 0;
+int returnStruct1024BytesHomogeneousUint64_a33 = 0;
+int returnStruct1024BytesHomogeneousUint64_a34 = 0;
+int returnStruct1024BytesHomogeneousUint64_a35 = 0;
+int returnStruct1024BytesHomogeneousUint64_a36 = 0;
+int returnStruct1024BytesHomogeneousUint64_a37 = 0;
+int returnStruct1024BytesHomogeneousUint64_a38 = 0;
+int returnStruct1024BytesHomogeneousUint64_a39 = 0;
+int returnStruct1024BytesHomogeneousUint64_a40 = 0;
+int returnStruct1024BytesHomogeneousUint64_a41 = 0;
+int returnStruct1024BytesHomogeneousUint64_a42 = 0;
+int returnStruct1024BytesHomogeneousUint64_a43 = 0;
+int returnStruct1024BytesHomogeneousUint64_a44 = 0;
+int returnStruct1024BytesHomogeneousUint64_a45 = 0;
+int returnStruct1024BytesHomogeneousUint64_a46 = 0;
+int returnStruct1024BytesHomogeneousUint64_a47 = 0;
+int returnStruct1024BytesHomogeneousUint64_a48 = 0;
+int returnStruct1024BytesHomogeneousUint64_a49 = 0;
+int returnStruct1024BytesHomogeneousUint64_a50 = 0;
+int returnStruct1024BytesHomogeneousUint64_a51 = 0;
+int returnStruct1024BytesHomogeneousUint64_a52 = 0;
+int returnStruct1024BytesHomogeneousUint64_a53 = 0;
+int returnStruct1024BytesHomogeneousUint64_a54 = 0;
+int returnStruct1024BytesHomogeneousUint64_a55 = 0;
+int returnStruct1024BytesHomogeneousUint64_a56 = 0;
+int returnStruct1024BytesHomogeneousUint64_a57 = 0;
+int returnStruct1024BytesHomogeneousUint64_a58 = 0;
+int returnStruct1024BytesHomogeneousUint64_a59 = 0;
+int returnStruct1024BytesHomogeneousUint64_a60 = 0;
+int returnStruct1024BytesHomogeneousUint64_a61 = 0;
+int returnStruct1024BytesHomogeneousUint64_a62 = 0;
+int returnStruct1024BytesHomogeneousUint64_a63 = 0;
+int returnStruct1024BytesHomogeneousUint64_a64 = 0;
+int returnStruct1024BytesHomogeneousUint64_a65 = 0;
+int returnStruct1024BytesHomogeneousUint64_a66 = 0;
+int returnStruct1024BytesHomogeneousUint64_a67 = 0;
+int returnStruct1024BytesHomogeneousUint64_a68 = 0;
+int returnStruct1024BytesHomogeneousUint64_a69 = 0;
+int returnStruct1024BytesHomogeneousUint64_a70 = 0;
+int returnStruct1024BytesHomogeneousUint64_a71 = 0;
+int returnStruct1024BytesHomogeneousUint64_a72 = 0;
+int returnStruct1024BytesHomogeneousUint64_a73 = 0;
+int returnStruct1024BytesHomogeneousUint64_a74 = 0;
+int returnStruct1024BytesHomogeneousUint64_a75 = 0;
+int returnStruct1024BytesHomogeneousUint64_a76 = 0;
+int returnStruct1024BytesHomogeneousUint64_a77 = 0;
+int returnStruct1024BytesHomogeneousUint64_a78 = 0;
+int returnStruct1024BytesHomogeneousUint64_a79 = 0;
+int returnStruct1024BytesHomogeneousUint64_a80 = 0;
+int returnStruct1024BytesHomogeneousUint64_a81 = 0;
+int returnStruct1024BytesHomogeneousUint64_a82 = 0;
+int returnStruct1024BytesHomogeneousUint64_a83 = 0;
+int returnStruct1024BytesHomogeneousUint64_a84 = 0;
+int returnStruct1024BytesHomogeneousUint64_a85 = 0;
+int returnStruct1024BytesHomogeneousUint64_a86 = 0;
+int returnStruct1024BytesHomogeneousUint64_a87 = 0;
+int returnStruct1024BytesHomogeneousUint64_a88 = 0;
+int returnStruct1024BytesHomogeneousUint64_a89 = 0;
+int returnStruct1024BytesHomogeneousUint64_a90 = 0;
+int returnStruct1024BytesHomogeneousUint64_a91 = 0;
+int returnStruct1024BytesHomogeneousUint64_a92 = 0;
+int returnStruct1024BytesHomogeneousUint64_a93 = 0;
+int returnStruct1024BytesHomogeneousUint64_a94 = 0;
+int returnStruct1024BytesHomogeneousUint64_a95 = 0;
+int returnStruct1024BytesHomogeneousUint64_a96 = 0;
+int returnStruct1024BytesHomogeneousUint64_a97 = 0;
+int returnStruct1024BytesHomogeneousUint64_a98 = 0;
+int returnStruct1024BytesHomogeneousUint64_a99 = 0;
+int returnStruct1024BytesHomogeneousUint64_a100 = 0;
+int returnStruct1024BytesHomogeneousUint64_a101 = 0;
+int returnStruct1024BytesHomogeneousUint64_a102 = 0;
+int returnStruct1024BytesHomogeneousUint64_a103 = 0;
+int returnStruct1024BytesHomogeneousUint64_a104 = 0;
+int returnStruct1024BytesHomogeneousUint64_a105 = 0;
+int returnStruct1024BytesHomogeneousUint64_a106 = 0;
+int returnStruct1024BytesHomogeneousUint64_a107 = 0;
+int returnStruct1024BytesHomogeneousUint64_a108 = 0;
+int returnStruct1024BytesHomogeneousUint64_a109 = 0;
+int returnStruct1024BytesHomogeneousUint64_a110 = 0;
+int returnStruct1024BytesHomogeneousUint64_a111 = 0;
+int returnStruct1024BytesHomogeneousUint64_a112 = 0;
+int returnStruct1024BytesHomogeneousUint64_a113 = 0;
+int returnStruct1024BytesHomogeneousUint64_a114 = 0;
+int returnStruct1024BytesHomogeneousUint64_a115 = 0;
+int returnStruct1024BytesHomogeneousUint64_a116 = 0;
+int returnStruct1024BytesHomogeneousUint64_a117 = 0;
+int returnStruct1024BytesHomogeneousUint64_a118 = 0;
+int returnStruct1024BytesHomogeneousUint64_a119 = 0;
+int returnStruct1024BytesHomogeneousUint64_a120 = 0;
+int returnStruct1024BytesHomogeneousUint64_a121 = 0;
+int returnStruct1024BytesHomogeneousUint64_a122 = 0;
+int returnStruct1024BytesHomogeneousUint64_a123 = 0;
+int returnStruct1024BytesHomogeneousUint64_a124 = 0;
+int returnStruct1024BytesHomogeneousUint64_a125 = 0;
+int returnStruct1024BytesHomogeneousUint64_a126 = 0;
+int returnStruct1024BytesHomogeneousUint64_a127 = 0;
+
+// Result variable also global, so we can delete it after the callback.
+Struct1024BytesHomogeneousUint64 returnStruct1024BytesHomogeneousUint64Result =
+    Struct1024BytesHomogeneousUint64();
+
+Struct1024BytesHomogeneousUint64
+    returnStruct1024BytesHomogeneousUint64CalculateResult() {
+  Struct1024BytesHomogeneousUint64 result =
+      allocate<Struct1024BytesHomogeneousUint64>().ref;
+
+  result.a0 = returnStruct1024BytesHomogeneousUint64_a0;
+  result.a1 = returnStruct1024BytesHomogeneousUint64_a1;
+  result.a2 = returnStruct1024BytesHomogeneousUint64_a2;
+  result.a3 = returnStruct1024BytesHomogeneousUint64_a3;
+  result.a4 = returnStruct1024BytesHomogeneousUint64_a4;
+  result.a5 = returnStruct1024BytesHomogeneousUint64_a5;
+  result.a6 = returnStruct1024BytesHomogeneousUint64_a6;
+  result.a7 = returnStruct1024BytesHomogeneousUint64_a7;
+  result.a8 = returnStruct1024BytesHomogeneousUint64_a8;
+  result.a9 = returnStruct1024BytesHomogeneousUint64_a9;
+  result.a10 = returnStruct1024BytesHomogeneousUint64_a10;
+  result.a11 = returnStruct1024BytesHomogeneousUint64_a11;
+  result.a12 = returnStruct1024BytesHomogeneousUint64_a12;
+  result.a13 = returnStruct1024BytesHomogeneousUint64_a13;
+  result.a14 = returnStruct1024BytesHomogeneousUint64_a14;
+  result.a15 = returnStruct1024BytesHomogeneousUint64_a15;
+  result.a16 = returnStruct1024BytesHomogeneousUint64_a16;
+  result.a17 = returnStruct1024BytesHomogeneousUint64_a17;
+  result.a18 = returnStruct1024BytesHomogeneousUint64_a18;
+  result.a19 = returnStruct1024BytesHomogeneousUint64_a19;
+  result.a20 = returnStruct1024BytesHomogeneousUint64_a20;
+  result.a21 = returnStruct1024BytesHomogeneousUint64_a21;
+  result.a22 = returnStruct1024BytesHomogeneousUint64_a22;
+  result.a23 = returnStruct1024BytesHomogeneousUint64_a23;
+  result.a24 = returnStruct1024BytesHomogeneousUint64_a24;
+  result.a25 = returnStruct1024BytesHomogeneousUint64_a25;
+  result.a26 = returnStruct1024BytesHomogeneousUint64_a26;
+  result.a27 = returnStruct1024BytesHomogeneousUint64_a27;
+  result.a28 = returnStruct1024BytesHomogeneousUint64_a28;
+  result.a29 = returnStruct1024BytesHomogeneousUint64_a29;
+  result.a30 = returnStruct1024BytesHomogeneousUint64_a30;
+  result.a31 = returnStruct1024BytesHomogeneousUint64_a31;
+  result.a32 = returnStruct1024BytesHomogeneousUint64_a32;
+  result.a33 = returnStruct1024BytesHomogeneousUint64_a33;
+  result.a34 = returnStruct1024BytesHomogeneousUint64_a34;
+  result.a35 = returnStruct1024BytesHomogeneousUint64_a35;
+  result.a36 = returnStruct1024BytesHomogeneousUint64_a36;
+  result.a37 = returnStruct1024BytesHomogeneousUint64_a37;
+  result.a38 = returnStruct1024BytesHomogeneousUint64_a38;
+  result.a39 = returnStruct1024BytesHomogeneousUint64_a39;
+  result.a40 = returnStruct1024BytesHomogeneousUint64_a40;
+  result.a41 = returnStruct1024BytesHomogeneousUint64_a41;
+  result.a42 = returnStruct1024BytesHomogeneousUint64_a42;
+  result.a43 = returnStruct1024BytesHomogeneousUint64_a43;
+  result.a44 = returnStruct1024BytesHomogeneousUint64_a44;
+  result.a45 = returnStruct1024BytesHomogeneousUint64_a45;
+  result.a46 = returnStruct1024BytesHomogeneousUint64_a46;
+  result.a47 = returnStruct1024BytesHomogeneousUint64_a47;
+  result.a48 = returnStruct1024BytesHomogeneousUint64_a48;
+  result.a49 = returnStruct1024BytesHomogeneousUint64_a49;
+  result.a50 = returnStruct1024BytesHomogeneousUint64_a50;
+  result.a51 = returnStruct1024BytesHomogeneousUint64_a51;
+  result.a52 = returnStruct1024BytesHomogeneousUint64_a52;
+  result.a53 = returnStruct1024BytesHomogeneousUint64_a53;
+  result.a54 = returnStruct1024BytesHomogeneousUint64_a54;
+  result.a55 = returnStruct1024BytesHomogeneousUint64_a55;
+  result.a56 = returnStruct1024BytesHomogeneousUint64_a56;
+  result.a57 = returnStruct1024BytesHomogeneousUint64_a57;
+  result.a58 = returnStruct1024BytesHomogeneousUint64_a58;
+  result.a59 = returnStruct1024BytesHomogeneousUint64_a59;
+  result.a60 = returnStruct1024BytesHomogeneousUint64_a60;
+  result.a61 = returnStruct1024BytesHomogeneousUint64_a61;
+  result.a62 = returnStruct1024BytesHomogeneousUint64_a62;
+  result.a63 = returnStruct1024BytesHomogeneousUint64_a63;
+  result.a64 = returnStruct1024BytesHomogeneousUint64_a64;
+  result.a65 = returnStruct1024BytesHomogeneousUint64_a65;
+  result.a66 = returnStruct1024BytesHomogeneousUint64_a66;
+  result.a67 = returnStruct1024BytesHomogeneousUint64_a67;
+  result.a68 = returnStruct1024BytesHomogeneousUint64_a68;
+  result.a69 = returnStruct1024BytesHomogeneousUint64_a69;
+  result.a70 = returnStruct1024BytesHomogeneousUint64_a70;
+  result.a71 = returnStruct1024BytesHomogeneousUint64_a71;
+  result.a72 = returnStruct1024BytesHomogeneousUint64_a72;
+  result.a73 = returnStruct1024BytesHomogeneousUint64_a73;
+  result.a74 = returnStruct1024BytesHomogeneousUint64_a74;
+  result.a75 = returnStruct1024BytesHomogeneousUint64_a75;
+  result.a76 = returnStruct1024BytesHomogeneousUint64_a76;
+  result.a77 = returnStruct1024BytesHomogeneousUint64_a77;
+  result.a78 = returnStruct1024BytesHomogeneousUint64_a78;
+  result.a79 = returnStruct1024BytesHomogeneousUint64_a79;
+  result.a80 = returnStruct1024BytesHomogeneousUint64_a80;
+  result.a81 = returnStruct1024BytesHomogeneousUint64_a81;
+  result.a82 = returnStruct1024BytesHomogeneousUint64_a82;
+  result.a83 = returnStruct1024BytesHomogeneousUint64_a83;
+  result.a84 = returnStruct1024BytesHomogeneousUint64_a84;
+  result.a85 = returnStruct1024BytesHomogeneousUint64_a85;
+  result.a86 = returnStruct1024BytesHomogeneousUint64_a86;
+  result.a87 = returnStruct1024BytesHomogeneousUint64_a87;
+  result.a88 = returnStruct1024BytesHomogeneousUint64_a88;
+  result.a89 = returnStruct1024BytesHomogeneousUint64_a89;
+  result.a90 = returnStruct1024BytesHomogeneousUint64_a90;
+  result.a91 = returnStruct1024BytesHomogeneousUint64_a91;
+  result.a92 = returnStruct1024BytesHomogeneousUint64_a92;
+  result.a93 = returnStruct1024BytesHomogeneousUint64_a93;
+  result.a94 = returnStruct1024BytesHomogeneousUint64_a94;
+  result.a95 = returnStruct1024BytesHomogeneousUint64_a95;
+  result.a96 = returnStruct1024BytesHomogeneousUint64_a96;
+  result.a97 = returnStruct1024BytesHomogeneousUint64_a97;
+  result.a98 = returnStruct1024BytesHomogeneousUint64_a98;
+  result.a99 = returnStruct1024BytesHomogeneousUint64_a99;
+  result.a100 = returnStruct1024BytesHomogeneousUint64_a100;
+  result.a101 = returnStruct1024BytesHomogeneousUint64_a101;
+  result.a102 = returnStruct1024BytesHomogeneousUint64_a102;
+  result.a103 = returnStruct1024BytesHomogeneousUint64_a103;
+  result.a104 = returnStruct1024BytesHomogeneousUint64_a104;
+  result.a105 = returnStruct1024BytesHomogeneousUint64_a105;
+  result.a106 = returnStruct1024BytesHomogeneousUint64_a106;
+  result.a107 = returnStruct1024BytesHomogeneousUint64_a107;
+  result.a108 = returnStruct1024BytesHomogeneousUint64_a108;
+  result.a109 = returnStruct1024BytesHomogeneousUint64_a109;
+  result.a110 = returnStruct1024BytesHomogeneousUint64_a110;
+  result.a111 = returnStruct1024BytesHomogeneousUint64_a111;
+  result.a112 = returnStruct1024BytesHomogeneousUint64_a112;
+  result.a113 = returnStruct1024BytesHomogeneousUint64_a113;
+  result.a114 = returnStruct1024BytesHomogeneousUint64_a114;
+  result.a115 = returnStruct1024BytesHomogeneousUint64_a115;
+  result.a116 = returnStruct1024BytesHomogeneousUint64_a116;
+  result.a117 = returnStruct1024BytesHomogeneousUint64_a117;
+  result.a118 = returnStruct1024BytesHomogeneousUint64_a118;
+  result.a119 = returnStruct1024BytesHomogeneousUint64_a119;
+  result.a120 = returnStruct1024BytesHomogeneousUint64_a120;
+  result.a121 = returnStruct1024BytesHomogeneousUint64_a121;
+  result.a122 = returnStruct1024BytesHomogeneousUint64_a122;
+  result.a123 = returnStruct1024BytesHomogeneousUint64_a123;
+  result.a124 = returnStruct1024BytesHomogeneousUint64_a124;
+  result.a125 = returnStruct1024BytesHomogeneousUint64_a125;
+  result.a126 = returnStruct1024BytesHomogeneousUint64_a126;
+  result.a127 = returnStruct1024BytesHomogeneousUint64_a127;
+
+  returnStruct1024BytesHomogeneousUint64Result = result;
+
+  return result;
+}
+
+/// Test 1kb struct.
+Struct1024BytesHomogeneousUint64 returnStruct1024BytesHomogeneousUint64(
+    int a0,
+    int a1,
+    int a2,
+    int a3,
+    int a4,
+    int a5,
+    int a6,
+    int a7,
+    int a8,
+    int a9,
+    int a10,
+    int a11,
+    int a12,
+    int a13,
+    int a14,
+    int a15,
+    int a16,
+    int a17,
+    int a18,
+    int a19,
+    int a20,
+    int a21,
+    int a22,
+    int a23,
+    int a24,
+    int a25,
+    int a26,
+    int a27,
+    int a28,
+    int a29,
+    int a30,
+    int a31,
+    int a32,
+    int a33,
+    int a34,
+    int a35,
+    int a36,
+    int a37,
+    int a38,
+    int a39,
+    int a40,
+    int a41,
+    int a42,
+    int a43,
+    int a44,
+    int a45,
+    int a46,
+    int a47,
+    int a48,
+    int a49,
+    int a50,
+    int a51,
+    int a52,
+    int a53,
+    int a54,
+    int a55,
+    int a56,
+    int a57,
+    int a58,
+    int a59,
+    int a60,
+    int a61,
+    int a62,
+    int a63,
+    int a64,
+    int a65,
+    int a66,
+    int a67,
+    int a68,
+    int a69,
+    int a70,
+    int a71,
+    int a72,
+    int a73,
+    int a74,
+    int a75,
+    int a76,
+    int a77,
+    int a78,
+    int a79,
+    int a80,
+    int a81,
+    int a82,
+    int a83,
+    int a84,
+    int a85,
+    int a86,
+    int a87,
+    int a88,
+    int a89,
+    int a90,
+    int a91,
+    int a92,
+    int a93,
+    int a94,
+    int a95,
+    int a96,
+    int a97,
+    int a98,
+    int a99,
+    int a100,
+    int a101,
+    int a102,
+    int a103,
+    int a104,
+    int a105,
+    int a106,
+    int a107,
+    int a108,
+    int a109,
+    int a110,
+    int a111,
+    int a112,
+    int a113,
+    int a114,
+    int a115,
+    int a116,
+    int a117,
+    int a118,
+    int a119,
+    int a120,
+    int a121,
+    int a122,
+    int a123,
+    int a124,
+    int a125,
+    int a126,
+    int a127) {
+  print(
+      "returnStruct1024BytesHomogeneousUint64(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5}, ${a6}, ${a7}, ${a8}, ${a9}, ${a10}, ${a11}, ${a12}, ${a13}, ${a14}, ${a15}, ${a16}, ${a17}, ${a18}, ${a19}, ${a20}, ${a21}, ${a22}, ${a23}, ${a24}, ${a25}, ${a26}, ${a27}, ${a28}, ${a29}, ${a30}, ${a31}, ${a32}, ${a33}, ${a34}, ${a35}, ${a36}, ${a37}, ${a38}, ${a39}, ${a40}, ${a41}, ${a42}, ${a43}, ${a44}, ${a45}, ${a46}, ${a47}, ${a48}, ${a49}, ${a50}, ${a51}, ${a52}, ${a53}, ${a54}, ${a55}, ${a56}, ${a57}, ${a58}, ${a59}, ${a60}, ${a61}, ${a62}, ${a63}, ${a64}, ${a65}, ${a66}, ${a67}, ${a68}, ${a69}, ${a70}, ${a71}, ${a72}, ${a73}, ${a74}, ${a75}, ${a76}, ${a77}, ${a78}, ${a79}, ${a80}, ${a81}, ${a82}, ${a83}, ${a84}, ${a85}, ${a86}, ${a87}, ${a88}, ${a89}, ${a90}, ${a91}, ${a92}, ${a93}, ${a94}, ${a95}, ${a96}, ${a97}, ${a98}, ${a99}, ${a100}, ${a101}, ${a102}, ${a103}, ${a104}, ${a105}, ${a106}, ${a107}, ${a108}, ${a109}, ${a110}, ${a111}, ${a112}, ${a113}, ${a114}, ${a115}, ${a116}, ${a117}, ${a118}, ${a119}, ${a120}, ${a121}, ${a122}, ${a123}, ${a124}, ${a125}, ${a126}, ${a127})");
+
+  // In legacy mode, possibly return null.
+  if (a0 == 84) {
+    print("returning null!");
+    return null;
+  }
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0 == 42 || a0 == 84) {
+    print("throwing!");
+    throw Exception(
+        "ReturnStruct1024BytesHomogeneousUint64 throwing on purpuse!");
+  }
+
+  returnStruct1024BytesHomogeneousUint64_a0 = a0;
+  returnStruct1024BytesHomogeneousUint64_a1 = a1;
+  returnStruct1024BytesHomogeneousUint64_a2 = a2;
+  returnStruct1024BytesHomogeneousUint64_a3 = a3;
+  returnStruct1024BytesHomogeneousUint64_a4 = a4;
+  returnStruct1024BytesHomogeneousUint64_a5 = a5;
+  returnStruct1024BytesHomogeneousUint64_a6 = a6;
+  returnStruct1024BytesHomogeneousUint64_a7 = a7;
+  returnStruct1024BytesHomogeneousUint64_a8 = a8;
+  returnStruct1024BytesHomogeneousUint64_a9 = a9;
+  returnStruct1024BytesHomogeneousUint64_a10 = a10;
+  returnStruct1024BytesHomogeneousUint64_a11 = a11;
+  returnStruct1024BytesHomogeneousUint64_a12 = a12;
+  returnStruct1024BytesHomogeneousUint64_a13 = a13;
+  returnStruct1024BytesHomogeneousUint64_a14 = a14;
+  returnStruct1024BytesHomogeneousUint64_a15 = a15;
+  returnStruct1024BytesHomogeneousUint64_a16 = a16;
+  returnStruct1024BytesHomogeneousUint64_a17 = a17;
+  returnStruct1024BytesHomogeneousUint64_a18 = a18;
+  returnStruct1024BytesHomogeneousUint64_a19 = a19;
+  returnStruct1024BytesHomogeneousUint64_a20 = a20;
+  returnStruct1024BytesHomogeneousUint64_a21 = a21;
+  returnStruct1024BytesHomogeneousUint64_a22 = a22;
+  returnStruct1024BytesHomogeneousUint64_a23 = a23;
+  returnStruct1024BytesHomogeneousUint64_a24 = a24;
+  returnStruct1024BytesHomogeneousUint64_a25 = a25;
+  returnStruct1024BytesHomogeneousUint64_a26 = a26;
+  returnStruct1024BytesHomogeneousUint64_a27 = a27;
+  returnStruct1024BytesHomogeneousUint64_a28 = a28;
+  returnStruct1024BytesHomogeneousUint64_a29 = a29;
+  returnStruct1024BytesHomogeneousUint64_a30 = a30;
+  returnStruct1024BytesHomogeneousUint64_a31 = a31;
+  returnStruct1024BytesHomogeneousUint64_a32 = a32;
+  returnStruct1024BytesHomogeneousUint64_a33 = a33;
+  returnStruct1024BytesHomogeneousUint64_a34 = a34;
+  returnStruct1024BytesHomogeneousUint64_a35 = a35;
+  returnStruct1024BytesHomogeneousUint64_a36 = a36;
+  returnStruct1024BytesHomogeneousUint64_a37 = a37;
+  returnStruct1024BytesHomogeneousUint64_a38 = a38;
+  returnStruct1024BytesHomogeneousUint64_a39 = a39;
+  returnStruct1024BytesHomogeneousUint64_a40 = a40;
+  returnStruct1024BytesHomogeneousUint64_a41 = a41;
+  returnStruct1024BytesHomogeneousUint64_a42 = a42;
+  returnStruct1024BytesHomogeneousUint64_a43 = a43;
+  returnStruct1024BytesHomogeneousUint64_a44 = a44;
+  returnStruct1024BytesHomogeneousUint64_a45 = a45;
+  returnStruct1024BytesHomogeneousUint64_a46 = a46;
+  returnStruct1024BytesHomogeneousUint64_a47 = a47;
+  returnStruct1024BytesHomogeneousUint64_a48 = a48;
+  returnStruct1024BytesHomogeneousUint64_a49 = a49;
+  returnStruct1024BytesHomogeneousUint64_a50 = a50;
+  returnStruct1024BytesHomogeneousUint64_a51 = a51;
+  returnStruct1024BytesHomogeneousUint64_a52 = a52;
+  returnStruct1024BytesHomogeneousUint64_a53 = a53;
+  returnStruct1024BytesHomogeneousUint64_a54 = a54;
+  returnStruct1024BytesHomogeneousUint64_a55 = a55;
+  returnStruct1024BytesHomogeneousUint64_a56 = a56;
+  returnStruct1024BytesHomogeneousUint64_a57 = a57;
+  returnStruct1024BytesHomogeneousUint64_a58 = a58;
+  returnStruct1024BytesHomogeneousUint64_a59 = a59;
+  returnStruct1024BytesHomogeneousUint64_a60 = a60;
+  returnStruct1024BytesHomogeneousUint64_a61 = a61;
+  returnStruct1024BytesHomogeneousUint64_a62 = a62;
+  returnStruct1024BytesHomogeneousUint64_a63 = a63;
+  returnStruct1024BytesHomogeneousUint64_a64 = a64;
+  returnStruct1024BytesHomogeneousUint64_a65 = a65;
+  returnStruct1024BytesHomogeneousUint64_a66 = a66;
+  returnStruct1024BytesHomogeneousUint64_a67 = a67;
+  returnStruct1024BytesHomogeneousUint64_a68 = a68;
+  returnStruct1024BytesHomogeneousUint64_a69 = a69;
+  returnStruct1024BytesHomogeneousUint64_a70 = a70;
+  returnStruct1024BytesHomogeneousUint64_a71 = a71;
+  returnStruct1024BytesHomogeneousUint64_a72 = a72;
+  returnStruct1024BytesHomogeneousUint64_a73 = a73;
+  returnStruct1024BytesHomogeneousUint64_a74 = a74;
+  returnStruct1024BytesHomogeneousUint64_a75 = a75;
+  returnStruct1024BytesHomogeneousUint64_a76 = a76;
+  returnStruct1024BytesHomogeneousUint64_a77 = a77;
+  returnStruct1024BytesHomogeneousUint64_a78 = a78;
+  returnStruct1024BytesHomogeneousUint64_a79 = a79;
+  returnStruct1024BytesHomogeneousUint64_a80 = a80;
+  returnStruct1024BytesHomogeneousUint64_a81 = a81;
+  returnStruct1024BytesHomogeneousUint64_a82 = a82;
+  returnStruct1024BytesHomogeneousUint64_a83 = a83;
+  returnStruct1024BytesHomogeneousUint64_a84 = a84;
+  returnStruct1024BytesHomogeneousUint64_a85 = a85;
+  returnStruct1024BytesHomogeneousUint64_a86 = a86;
+  returnStruct1024BytesHomogeneousUint64_a87 = a87;
+  returnStruct1024BytesHomogeneousUint64_a88 = a88;
+  returnStruct1024BytesHomogeneousUint64_a89 = a89;
+  returnStruct1024BytesHomogeneousUint64_a90 = a90;
+  returnStruct1024BytesHomogeneousUint64_a91 = a91;
+  returnStruct1024BytesHomogeneousUint64_a92 = a92;
+  returnStruct1024BytesHomogeneousUint64_a93 = a93;
+  returnStruct1024BytesHomogeneousUint64_a94 = a94;
+  returnStruct1024BytesHomogeneousUint64_a95 = a95;
+  returnStruct1024BytesHomogeneousUint64_a96 = a96;
+  returnStruct1024BytesHomogeneousUint64_a97 = a97;
+  returnStruct1024BytesHomogeneousUint64_a98 = a98;
+  returnStruct1024BytesHomogeneousUint64_a99 = a99;
+  returnStruct1024BytesHomogeneousUint64_a100 = a100;
+  returnStruct1024BytesHomogeneousUint64_a101 = a101;
+  returnStruct1024BytesHomogeneousUint64_a102 = a102;
+  returnStruct1024BytesHomogeneousUint64_a103 = a103;
+  returnStruct1024BytesHomogeneousUint64_a104 = a104;
+  returnStruct1024BytesHomogeneousUint64_a105 = a105;
+  returnStruct1024BytesHomogeneousUint64_a106 = a106;
+  returnStruct1024BytesHomogeneousUint64_a107 = a107;
+  returnStruct1024BytesHomogeneousUint64_a108 = a108;
+  returnStruct1024BytesHomogeneousUint64_a109 = a109;
+  returnStruct1024BytesHomogeneousUint64_a110 = a110;
+  returnStruct1024BytesHomogeneousUint64_a111 = a111;
+  returnStruct1024BytesHomogeneousUint64_a112 = a112;
+  returnStruct1024BytesHomogeneousUint64_a113 = a113;
+  returnStruct1024BytesHomogeneousUint64_a114 = a114;
+  returnStruct1024BytesHomogeneousUint64_a115 = a115;
+  returnStruct1024BytesHomogeneousUint64_a116 = a116;
+  returnStruct1024BytesHomogeneousUint64_a117 = a117;
+  returnStruct1024BytesHomogeneousUint64_a118 = a118;
+  returnStruct1024BytesHomogeneousUint64_a119 = a119;
+  returnStruct1024BytesHomogeneousUint64_a120 = a120;
+  returnStruct1024BytesHomogeneousUint64_a121 = a121;
+  returnStruct1024BytesHomogeneousUint64_a122 = a122;
+  returnStruct1024BytesHomogeneousUint64_a123 = a123;
+  returnStruct1024BytesHomogeneousUint64_a124 = a124;
+  returnStruct1024BytesHomogeneousUint64_a125 = a125;
+  returnStruct1024BytesHomogeneousUint64_a126 = a126;
+  returnStruct1024BytesHomogeneousUint64_a127 = a127;
+
+  final result = returnStruct1024BytesHomogeneousUint64CalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void returnStruct1024BytesHomogeneousUint64AfterCallback() {
+  free(returnStruct1024BytesHomogeneousUint64Result.addressOf);
+
+  final result = returnStruct1024BytesHomogeneousUint64CalculateResult();
+
+  print("after callback result = $result");
+
+  free(returnStruct1024BytesHomogeneousUint64Result.addressOf);
+}
+
+typedef ReturnStructArgumentStruct1ByteIntType = Struct1ByteInt Function(
+    Struct1ByteInt);
+
+// Global variables to be able to test inputs after callback returned.
+Struct1ByteInt returnStructArgumentStruct1ByteInt_a0 = Struct1ByteInt();
+
+// Result variable also global, so we can delete it after the callback.
+Struct1ByteInt returnStructArgumentStruct1ByteIntResult = Struct1ByteInt();
+
+Struct1ByteInt returnStructArgumentStruct1ByteIntCalculateResult() {
+  Struct1ByteInt result = returnStructArgumentStruct1ByteInt_a0;
+
+  returnStructArgumentStruct1ByteIntResult = result;
+
+  return result;
+}
+
+/// Test that a struct passed in as argument can be returned.
+/// Especially for ffi callbacks.
+/// Struct is passed in int registers in most ABIs.
+Struct1ByteInt returnStructArgumentStruct1ByteInt(Struct1ByteInt a0) {
+  print("returnStructArgumentStruct1ByteInt(${a0})");
+
+  // In legacy mode, possibly return null.
+  if (a0.a0 == 84) {
+    print("returning null!");
+    return null;
+  }
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0.a0 == 42 || a0.a0 == 84) {
+    print("throwing!");
+    throw Exception("ReturnStructArgumentStruct1ByteInt throwing on purpuse!");
+  }
+
+  returnStructArgumentStruct1ByteInt_a0 = a0;
+
+  final result = returnStructArgumentStruct1ByteIntCalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void returnStructArgumentStruct1ByteIntAfterCallback() {
+  final result = returnStructArgumentStruct1ByteIntCalculateResult();
+
+  print("after callback result = $result");
+}
+
+typedef ReturnStructArgumentInt32x8Struct1ByteIntType = Struct1ByteInt Function(
+    Int32, Int32, Int32, Int32, Int32, Int32, Int32, Int32, Struct1ByteInt);
+
+// Global variables to be able to test inputs after callback returned.
+int returnStructArgumentInt32x8Struct1ByteInt_a0 = 0;
+int returnStructArgumentInt32x8Struct1ByteInt_a1 = 0;
+int returnStructArgumentInt32x8Struct1ByteInt_a2 = 0;
+int returnStructArgumentInt32x8Struct1ByteInt_a3 = 0;
+int returnStructArgumentInt32x8Struct1ByteInt_a4 = 0;
+int returnStructArgumentInt32x8Struct1ByteInt_a5 = 0;
+int returnStructArgumentInt32x8Struct1ByteInt_a6 = 0;
+int returnStructArgumentInt32x8Struct1ByteInt_a7 = 0;
+Struct1ByteInt returnStructArgumentInt32x8Struct1ByteInt_a8 = Struct1ByteInt();
+
+// Result variable also global, so we can delete it after the callback.
+Struct1ByteInt returnStructArgumentInt32x8Struct1ByteIntResult =
+    Struct1ByteInt();
+
+Struct1ByteInt returnStructArgumentInt32x8Struct1ByteIntCalculateResult() {
+  Struct1ByteInt result = returnStructArgumentInt32x8Struct1ByteInt_a8;
+
+  returnStructArgumentInt32x8Struct1ByteIntResult = result;
+
+  return result;
+}
+
+/// Test that a struct passed in as argument can be returned.
+/// Especially for ffi callbacks.
+/// Struct is passed on stack on all ABIs.
+Struct1ByteInt returnStructArgumentInt32x8Struct1ByteInt(int a0, int a1, int a2,
+    int a3, int a4, int a5, int a6, int a7, Struct1ByteInt a8) {
+  print(
+      "returnStructArgumentInt32x8Struct1ByteInt(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5}, ${a6}, ${a7}, ${a8})");
+
+  // In legacy mode, possibly return null.
+  if (a0 == 84) {
+    print("returning null!");
+    return null;
+  }
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0 == 42 || a0 == 84) {
+    print("throwing!");
+    throw Exception(
+        "ReturnStructArgumentInt32x8Struct1ByteInt throwing on purpuse!");
+  }
+
+  returnStructArgumentInt32x8Struct1ByteInt_a0 = a0;
+  returnStructArgumentInt32x8Struct1ByteInt_a1 = a1;
+  returnStructArgumentInt32x8Struct1ByteInt_a2 = a2;
+  returnStructArgumentInt32x8Struct1ByteInt_a3 = a3;
+  returnStructArgumentInt32x8Struct1ByteInt_a4 = a4;
+  returnStructArgumentInt32x8Struct1ByteInt_a5 = a5;
+  returnStructArgumentInt32x8Struct1ByteInt_a6 = a6;
+  returnStructArgumentInt32x8Struct1ByteInt_a7 = a7;
+  returnStructArgumentInt32x8Struct1ByteInt_a8 = a8;
+
+  final result = returnStructArgumentInt32x8Struct1ByteIntCalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void returnStructArgumentInt32x8Struct1ByteIntAfterCallback() {
+  final result = returnStructArgumentInt32x8Struct1ByteIntCalculateResult();
+
+  print("after callback result = $result");
+}
+
+typedef ReturnStructArgumentStruct8BytesHomogeneousFloatType
+    = Struct8BytesHomogeneousFloat Function(Struct8BytesHomogeneousFloat);
+
+// Global variables to be able to test inputs after callback returned.
+Struct8BytesHomogeneousFloat
+    returnStructArgumentStruct8BytesHomogeneousFloat_a0 =
+    Struct8BytesHomogeneousFloat();
+
+// Result variable also global, so we can delete it after the callback.
+Struct8BytesHomogeneousFloat
+    returnStructArgumentStruct8BytesHomogeneousFloatResult =
+    Struct8BytesHomogeneousFloat();
+
+Struct8BytesHomogeneousFloat
+    returnStructArgumentStruct8BytesHomogeneousFloatCalculateResult() {
+  Struct8BytesHomogeneousFloat result =
+      returnStructArgumentStruct8BytesHomogeneousFloat_a0;
+
+  returnStructArgumentStruct8BytesHomogeneousFloatResult = result;
+
+  return result;
+}
+
+/// Test that a struct passed in as argument can be returned.
+/// Especially for ffi callbacks.
+/// Struct is passed in float registers in most ABIs.
+Struct8BytesHomogeneousFloat returnStructArgumentStruct8BytesHomogeneousFloat(
+    Struct8BytesHomogeneousFloat a0) {
+  print("returnStructArgumentStruct8BytesHomogeneousFloat(${a0})");
+
+  // In legacy mode, possibly return null.
+  if (a0.a0 == 84) {
+    print("returning null!");
+    return null;
+  }
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0.a0 == 42 || a0.a0 == 84) {
+    print("throwing!");
+    throw Exception(
+        "ReturnStructArgumentStruct8BytesHomogeneousFloat throwing on purpuse!");
+  }
+
+  returnStructArgumentStruct8BytesHomogeneousFloat_a0 = a0;
+
+  final result =
+      returnStructArgumentStruct8BytesHomogeneousFloatCalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void returnStructArgumentStruct8BytesHomogeneousFloatAfterCallback() {
+  final result =
+      returnStructArgumentStruct8BytesHomogeneousFloatCalculateResult();
+
+  print("after callback result = $result");
+}
+
+typedef ReturnStructArgumentStruct20BytesHomogeneousInt32Type
+    = Struct20BytesHomogeneousInt32 Function(Struct20BytesHomogeneousInt32);
+
+// Global variables to be able to test inputs after callback returned.
+Struct20BytesHomogeneousInt32
+    returnStructArgumentStruct20BytesHomogeneousInt32_a0 =
+    Struct20BytesHomogeneousInt32();
+
+// Result variable also global, so we can delete it after the callback.
+Struct20BytesHomogeneousInt32
+    returnStructArgumentStruct20BytesHomogeneousInt32Result =
+    Struct20BytesHomogeneousInt32();
+
+Struct20BytesHomogeneousInt32
+    returnStructArgumentStruct20BytesHomogeneousInt32CalculateResult() {
+  Struct20BytesHomogeneousInt32 result =
+      returnStructArgumentStruct20BytesHomogeneousInt32_a0;
+
+  returnStructArgumentStruct20BytesHomogeneousInt32Result = result;
+
+  return result;
+}
+
+/// On arm64, both argument and return value are passed in by pointer.
+Struct20BytesHomogeneousInt32 returnStructArgumentStruct20BytesHomogeneousInt32(
+    Struct20BytesHomogeneousInt32 a0) {
+  print("returnStructArgumentStruct20BytesHomogeneousInt32(${a0})");
+
+  // In legacy mode, possibly return null.
+  if (a0.a0 == 84) {
+    print("returning null!");
+    return null;
+  }
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0.a0 == 42 || a0.a0 == 84) {
+    print("throwing!");
+    throw Exception(
+        "ReturnStructArgumentStruct20BytesHomogeneousInt32 throwing on purpuse!");
+  }
+
+  returnStructArgumentStruct20BytesHomogeneousInt32_a0 = a0;
+
+  final result =
+      returnStructArgumentStruct20BytesHomogeneousInt32CalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void returnStructArgumentStruct20BytesHomogeneousInt32AfterCallback() {
+  final result =
+      returnStructArgumentStruct20BytesHomogeneousInt32CalculateResult();
+
+  print("after callback result = $result");
+}
+
+typedef ReturnStructArgumentInt32x8Struct20BytesHomogeneouType
+    = Struct20BytesHomogeneousInt32 Function(Int32, Int32, Int32, Int32, Int32,
+        Int32, Int32, Int32, Struct20BytesHomogeneousInt32);
+
+// Global variables to be able to test inputs after callback returned.
+int returnStructArgumentInt32x8Struct20BytesHomogeneou_a0 = 0;
+int returnStructArgumentInt32x8Struct20BytesHomogeneou_a1 = 0;
+int returnStructArgumentInt32x8Struct20BytesHomogeneou_a2 = 0;
+int returnStructArgumentInt32x8Struct20BytesHomogeneou_a3 = 0;
+int returnStructArgumentInt32x8Struct20BytesHomogeneou_a4 = 0;
+int returnStructArgumentInt32x8Struct20BytesHomogeneou_a5 = 0;
+int returnStructArgumentInt32x8Struct20BytesHomogeneou_a6 = 0;
+int returnStructArgumentInt32x8Struct20BytesHomogeneou_a7 = 0;
+Struct20BytesHomogeneousInt32
+    returnStructArgumentInt32x8Struct20BytesHomogeneou_a8 =
+    Struct20BytesHomogeneousInt32();
+
+// Result variable also global, so we can delete it after the callback.
+Struct20BytesHomogeneousInt32
+    returnStructArgumentInt32x8Struct20BytesHomogeneouResult =
+    Struct20BytesHomogeneousInt32();
+
+Struct20BytesHomogeneousInt32
+    returnStructArgumentInt32x8Struct20BytesHomogeneouCalculateResult() {
+  Struct20BytesHomogeneousInt32 result =
+      returnStructArgumentInt32x8Struct20BytesHomogeneou_a8;
+
+  returnStructArgumentInt32x8Struct20BytesHomogeneouResult = result;
+
+  return result;
+}
+
+/// On arm64, both argument and return value are passed in by pointer.
+/// Ints exhaust registers, so that pointer is passed on stack.
+Struct20BytesHomogeneousInt32
+    returnStructArgumentInt32x8Struct20BytesHomogeneou(
+        int a0,
+        int a1,
+        int a2,
+        int a3,
+        int a4,
+        int a5,
+        int a6,
+        int a7,
+        Struct20BytesHomogeneousInt32 a8) {
+  print(
+      "returnStructArgumentInt32x8Struct20BytesHomogeneou(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5}, ${a6}, ${a7}, ${a8})");
+
+  // In legacy mode, possibly return null.
+  if (a0 == 84) {
+    print("returning null!");
+    return null;
+  }
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0 == 42 || a0 == 84) {
+    print("throwing!");
+    throw Exception(
+        "ReturnStructArgumentInt32x8Struct20BytesHomogeneou throwing on purpuse!");
+  }
+
+  returnStructArgumentInt32x8Struct20BytesHomogeneou_a0 = a0;
+  returnStructArgumentInt32x8Struct20BytesHomogeneou_a1 = a1;
+  returnStructArgumentInt32x8Struct20BytesHomogeneou_a2 = a2;
+  returnStructArgumentInt32x8Struct20BytesHomogeneou_a3 = a3;
+  returnStructArgumentInt32x8Struct20BytesHomogeneou_a4 = a4;
+  returnStructArgumentInt32x8Struct20BytesHomogeneou_a5 = a5;
+  returnStructArgumentInt32x8Struct20BytesHomogeneou_a6 = a6;
+  returnStructArgumentInt32x8Struct20BytesHomogeneou_a7 = a7;
+  returnStructArgumentInt32x8Struct20BytesHomogeneou_a8 = a8;
+
+  final result =
+      returnStructArgumentInt32x8Struct20BytesHomogeneouCalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void returnStructArgumentInt32x8Struct20BytesHomogeneouAfterCallback() {
+  final result =
+      returnStructArgumentInt32x8Struct20BytesHomogeneouCalculateResult();
+
+  print("after callback result = $result");
+}
+
+typedef ReturnStructAlignmentInt16Type = StructAlignmentInt16 Function(
+    Int8, Int16, Int8);
+
+// Global variables to be able to test inputs after callback returned.
+int returnStructAlignmentInt16_a0 = 0;
+int returnStructAlignmentInt16_a1 = 0;
+int returnStructAlignmentInt16_a2 = 0;
+
+// Result variable also global, so we can delete it after the callback.
+StructAlignmentInt16 returnStructAlignmentInt16Result = StructAlignmentInt16();
+
+StructAlignmentInt16 returnStructAlignmentInt16CalculateResult() {
+  StructAlignmentInt16 result = allocate<StructAlignmentInt16>().ref;
+
+  result.a0 = returnStructAlignmentInt16_a0;
+  result.a1 = returnStructAlignmentInt16_a1;
+  result.a2 = returnStructAlignmentInt16_a2;
+
+  returnStructAlignmentInt16Result = result;
+
+  return result;
+}
+
+/// Test alignment and padding of 16 byte int within struct.
+StructAlignmentInt16 returnStructAlignmentInt16(int a0, int a1, int a2) {
+  print("returnStructAlignmentInt16(${a0}, ${a1}, ${a2})");
+
+  // In legacy mode, possibly return null.
+  if (a0 == 84) {
+    print("returning null!");
+    return null;
+  }
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0 == 42 || a0 == 84) {
+    print("throwing!");
+    throw Exception("ReturnStructAlignmentInt16 throwing on purpuse!");
+  }
+
+  returnStructAlignmentInt16_a0 = a0;
+  returnStructAlignmentInt16_a1 = a1;
+  returnStructAlignmentInt16_a2 = a2;
+
+  final result = returnStructAlignmentInt16CalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void returnStructAlignmentInt16AfterCallback() {
+  free(returnStructAlignmentInt16Result.addressOf);
+
+  final result = returnStructAlignmentInt16CalculateResult();
+
+  print("after callback result = $result");
+
+  free(returnStructAlignmentInt16Result.addressOf);
+}
+
+typedef ReturnStructAlignmentInt32Type = StructAlignmentInt32 Function(
+    Int8, Int32, Int8);
+
+// Global variables to be able to test inputs after callback returned.
+int returnStructAlignmentInt32_a0 = 0;
+int returnStructAlignmentInt32_a1 = 0;
+int returnStructAlignmentInt32_a2 = 0;
+
+// Result variable also global, so we can delete it after the callback.
+StructAlignmentInt32 returnStructAlignmentInt32Result = StructAlignmentInt32();
+
+StructAlignmentInt32 returnStructAlignmentInt32CalculateResult() {
+  StructAlignmentInt32 result = allocate<StructAlignmentInt32>().ref;
+
+  result.a0 = returnStructAlignmentInt32_a0;
+  result.a1 = returnStructAlignmentInt32_a1;
+  result.a2 = returnStructAlignmentInt32_a2;
+
+  returnStructAlignmentInt32Result = result;
+
+  return result;
+}
+
+/// Test alignment and padding of 32 byte int within struct.
+StructAlignmentInt32 returnStructAlignmentInt32(int a0, int a1, int a2) {
+  print("returnStructAlignmentInt32(${a0}, ${a1}, ${a2})");
+
+  // In legacy mode, possibly return null.
+  if (a0 == 84) {
+    print("returning null!");
+    return null;
+  }
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0 == 42 || a0 == 84) {
+    print("throwing!");
+    throw Exception("ReturnStructAlignmentInt32 throwing on purpuse!");
+  }
+
+  returnStructAlignmentInt32_a0 = a0;
+  returnStructAlignmentInt32_a1 = a1;
+  returnStructAlignmentInt32_a2 = a2;
+
+  final result = returnStructAlignmentInt32CalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void returnStructAlignmentInt32AfterCallback() {
+  free(returnStructAlignmentInt32Result.addressOf);
+
+  final result = returnStructAlignmentInt32CalculateResult();
+
+  print("after callback result = $result");
+
+  free(returnStructAlignmentInt32Result.addressOf);
+}
+
+typedef ReturnStructAlignmentInt64Type = StructAlignmentInt64 Function(
+    Int8, Int64, Int8);
+
+// Global variables to be able to test inputs after callback returned.
+int returnStructAlignmentInt64_a0 = 0;
+int returnStructAlignmentInt64_a1 = 0;
+int returnStructAlignmentInt64_a2 = 0;
+
+// Result variable also global, so we can delete it after the callback.
+StructAlignmentInt64 returnStructAlignmentInt64Result = StructAlignmentInt64();
+
+StructAlignmentInt64 returnStructAlignmentInt64CalculateResult() {
+  StructAlignmentInt64 result = allocate<StructAlignmentInt64>().ref;
+
+  result.a0 = returnStructAlignmentInt64_a0;
+  result.a1 = returnStructAlignmentInt64_a1;
+  result.a2 = returnStructAlignmentInt64_a2;
+
+  returnStructAlignmentInt64Result = result;
+
+  return result;
+}
+
+/// Test alignment and padding of 64 byte int within struct.
+StructAlignmentInt64 returnStructAlignmentInt64(int a0, int a1, int a2) {
+  print("returnStructAlignmentInt64(${a0}, ${a1}, ${a2})");
+
+  // In legacy mode, possibly return null.
+  if (a0 == 84) {
+    print("returning null!");
+    return null;
+  }
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0 == 42 || a0 == 84) {
+    print("throwing!");
+    throw Exception("ReturnStructAlignmentInt64 throwing on purpuse!");
+  }
+
+  returnStructAlignmentInt64_a0 = a0;
+  returnStructAlignmentInt64_a1 = a1;
+  returnStructAlignmentInt64_a2 = a2;
+
+  final result = returnStructAlignmentInt64CalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void returnStructAlignmentInt64AfterCallback() {
+  free(returnStructAlignmentInt64Result.addressOf);
+
+  final result = returnStructAlignmentInt64CalculateResult();
+
+  print("after callback result = $result");
+
+  free(returnStructAlignmentInt64Result.addressOf);
+}
diff --git a/tests/ffi_2/function_callbacks_structs_by_value_test.dart b/tests/ffi_2/function_callbacks_structs_by_value_test.dart
new file mode 100644
index 0000000..98ab518
--- /dev/null
+++ b/tests/ffi_2/function_callbacks_structs_by_value_test.dart
@@ -0,0 +1,71 @@
+// Copyright (c) 2020, 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.
+//
+// SharedObjects=ffi_test_functions
+//
+// VMOptions=--deterministic --optimization-counter-threshold=5 --use-slow-path --stacktrace-every=100
+
+import 'dart:ffi';
+
+import "package:expect/expect.dart";
+import "package:ffi/ffi.dart";
+
+// Reuse the struct classes.
+import 'function_structs_by_value_generated_test.dart';
+
+void main() {
+  for (int i = 0; i < 10; i++) {
+    recursiveTest(10);
+    recursiveTest(11);
+  }
+}
+
+void recursiveTest(int recursionCounter) {
+  final struct = allocate<Struct20BytesHomogeneousInt32>().ref;
+  struct.a0 = 1;
+  struct.a1 = 2;
+  struct.a2 = 3;
+  struct.a3 = 4;
+  struct.a4 = 5;
+  final result = dartPassStructRecursive(recursionCounter, struct);
+  Expect.equals(struct.a0 + recursionCounter * 2, result.a0);
+  Expect.equals(struct.a1, result.a1);
+  Expect.equals(struct.a2, result.a2);
+  Expect.equals(struct.a3, result.a3);
+  Expect.equals(struct.a4, result.a4);
+  free(struct.addressOf);
+}
+
+Struct20BytesHomogeneousInt32 dartPassStructRecursive(
+    int recursionCounter, Struct20BytesHomogeneousInt32 struct) {
+  print("callbackPassStructRecurisive($recursionCounter, $struct)");
+  struct.a0++;
+  final structA0Saved = struct.a0;
+  if (recursionCounter <= 0) {
+    print("returning");
+    return struct;
+  }
+
+  final result =
+      cPassStructRecursive(recursionCounter - 1, struct, functionPointer);
+  result.a0++;
+
+  // Check struct.a0 is not modified by Dart->C call.
+  Expect.equals(structA0Saved, struct.a0);
+
+  // Check struct.a0 is not modified by C->Dart callback, if so struct.a4 == 0.
+  Expect.notEquals(0, struct.a4);
+
+  return result;
+}
+
+final functionPointer = Pointer.fromFunction<
+    Struct20BytesHomogeneousInt32 Function(
+        Int64, Struct20BytesHomogeneousInt32)>(dartPassStructRecursive);
+
+final cPassStructRecursive = ffiTestFunctions.lookupFunction<
+    Struct20BytesHomogeneousInt32 Function(Int64 recursionCounter,
+        Struct20BytesHomogeneousInt32 struct, Pointer callbackAddress),
+    Struct20BytesHomogeneousInt32 Function(int recursionCounter,
+        Struct20BytesHomogeneousInt32, Pointer)>("PassStructRecursive");
diff --git a/tests/ffi_2/function_structs_by_value_generated_test.dart b/tests/ffi_2/function_structs_by_value_generated_test.dart
new file mode 100644
index 0000000..dfb17cd
--- /dev/null
+++ b/tests/ffi_2/function_structs_by_value_generated_test.dart
@@ -0,0 +1,5321 @@
+// Copyright (c) 2020, 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.
+//
+// This file has been automatically generated. Please do not edit it manually.
+//
+// SharedObjects=ffi_test_functions
+// VMOptions=
+// VMOptions=--deterministic --optimization-counter-threshold=5
+// VMOptions=--use-slow-path
+// VMOptions=--use-slow-path --stacktrace-every=100
+
+import 'dart:ffi';
+
+import "package:expect/expect.dart";
+import "package:ffi/ffi.dart";
+
+import 'dylib_utils.dart';
+
+final ffiTestFunctions = dlopenPlatformSpecific("ffi_test_functions");
+void main() {
+  for (int i = 0; i < 10; ++i) {
+    testPassStruct1ByteIntx10();
+    testPassStruct3BytesHomogeneousUint8x10();
+    testPassStruct3BytesInt2ByteAlignedx10();
+    testPassStruct4BytesHomogeneousInt16x10();
+    testPassStruct7BytesHomogeneousUint8x10();
+    testPassStruct7BytesInt4ByteAlignedx10();
+    testPassStruct8BytesIntx10();
+    testPassStruct8BytesHomogeneousFloatx10();
+    testPassStruct8BytesMixedx10();
+    testPassStruct9BytesHomogeneousUint8x10();
+    testPassStruct9BytesInt4Or8ByteAlignedx10();
+    testPassStruct12BytesHomogeneousFloatx6();
+    testPassStruct16BytesHomogeneousFloatx5();
+    testPassStruct16BytesMixedx10();
+    testPassStruct16BytesMixed2x10();
+    testPassStruct17BytesIntx10();
+    testPassStruct19BytesHomogeneousUint8x10();
+    testPassStruct20BytesHomogeneousInt32x10();
+    testPassStruct20BytesHomogeneousFloat();
+    testPassStruct32BytesHomogeneousDoublex5();
+    testPassStruct40BytesHomogeneousDouble();
+    testPassStruct1024BytesHomogeneousUint64();
+    testPassFloatStruct16BytesHomogeneousFloatFloatStruct1();
+    testPassFloatStruct32BytesHomogeneousDoubleFloatStruct();
+    testPassInt8Struct16BytesMixedInt8Struct16BytesMixedIn();
+    testPassDoublex6Struct16BytesMixedx4Int32();
+    testPassInt32x4Struct16BytesMixedx4Double();
+    testPassStruct40BytesHomogeneousDoubleStruct4BytesHomo();
+    testPassInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int();
+    testPassStructAlignmentInt16();
+    testPassStructAlignmentInt32();
+    testPassStructAlignmentInt64();
+    testReturnStruct1ByteInt();
+    testReturnStruct3BytesHomogeneousUint8();
+    testReturnStruct3BytesInt2ByteAligned();
+    testReturnStruct4BytesHomogeneousInt16();
+    testReturnStruct7BytesHomogeneousUint8();
+    testReturnStruct7BytesInt4ByteAligned();
+    testReturnStruct8BytesInt();
+    testReturnStruct8BytesHomogeneousFloat();
+    testReturnStruct8BytesMixed();
+    testReturnStruct9BytesHomogeneousUint8();
+    testReturnStruct9BytesInt4Or8ByteAligned();
+    testReturnStruct12BytesHomogeneousFloat();
+    testReturnStruct16BytesHomogeneousFloat();
+    testReturnStruct16BytesMixed();
+    testReturnStruct16BytesMixed2();
+    testReturnStruct17BytesInt();
+    testReturnStruct19BytesHomogeneousUint8();
+    testReturnStruct20BytesHomogeneousInt32();
+    testReturnStruct20BytesHomogeneousFloat();
+    testReturnStruct32BytesHomogeneousDouble();
+    testReturnStruct40BytesHomogeneousDouble();
+    testReturnStruct1024BytesHomogeneousUint64();
+    testReturnStructArgumentStruct1ByteInt();
+    testReturnStructArgumentInt32x8Struct1ByteInt();
+    testReturnStructArgumentStruct8BytesHomogeneousFloat();
+    testReturnStructArgumentStruct20BytesHomogeneousInt32();
+    testReturnStructArgumentInt32x8Struct20BytesHomogeneou();
+    testReturnStructAlignmentInt16();
+    testReturnStructAlignmentInt32();
+    testReturnStructAlignmentInt64();
+  }
+}
+
+class Struct0Bytes extends Struct {
+  String toString() => "()";
+}
+
+class Struct1ByteInt extends Struct {
+  @Int8()
+  int a0;
+
+  String toString() => "(${a0})";
+}
+
+class Struct3BytesHomogeneousUint8 extends Struct {
+  @Uint8()
+  int a0;
+
+  @Uint8()
+  int a1;
+
+  @Uint8()
+  int a2;
+
+  String toString() => "(${a0}, ${a1}, ${a2})";
+}
+
+class Struct3BytesInt2ByteAligned extends Struct {
+  @Int16()
+  int a0;
+
+  @Int8()
+  int a1;
+
+  String toString() => "(${a0}, ${a1})";
+}
+
+class Struct4BytesHomogeneousInt16 extends Struct {
+  @Int16()
+  int a0;
+
+  @Int16()
+  int a1;
+
+  String toString() => "(${a0}, ${a1})";
+}
+
+class Struct7BytesHomogeneousUint8 extends Struct {
+  @Uint8()
+  int a0;
+
+  @Uint8()
+  int a1;
+
+  @Uint8()
+  int a2;
+
+  @Uint8()
+  int a3;
+
+  @Uint8()
+  int a4;
+
+  @Uint8()
+  int a5;
+
+  @Uint8()
+  int a6;
+
+  String toString() => "(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5}, ${a6})";
+}
+
+class Struct7BytesInt4ByteAligned extends Struct {
+  @Int32()
+  int a0;
+
+  @Int16()
+  int a1;
+
+  @Int8()
+  int a2;
+
+  String toString() => "(${a0}, ${a1}, ${a2})";
+}
+
+class Struct8BytesInt extends Struct {
+  @Int16()
+  int a0;
+
+  @Int16()
+  int a1;
+
+  @Int32()
+  int a2;
+
+  String toString() => "(${a0}, ${a1}, ${a2})";
+}
+
+class Struct8BytesHomogeneousFloat extends Struct {
+  @Float()
+  double a0;
+
+  @Float()
+  double a1;
+
+  String toString() => "(${a0}, ${a1})";
+}
+
+class Struct8BytesMixed extends Struct {
+  @Float()
+  double a0;
+
+  @Int16()
+  int a1;
+
+  @Int16()
+  int a2;
+
+  String toString() => "(${a0}, ${a1}, ${a2})";
+}
+
+class Struct9BytesHomogeneousUint8 extends Struct {
+  @Uint8()
+  int a0;
+
+  @Uint8()
+  int a1;
+
+  @Uint8()
+  int a2;
+
+  @Uint8()
+  int a3;
+
+  @Uint8()
+  int a4;
+
+  @Uint8()
+  int a5;
+
+  @Uint8()
+  int a6;
+
+  @Uint8()
+  int a7;
+
+  @Uint8()
+  int a8;
+
+  String toString() =>
+      "(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5}, ${a6}, ${a7}, ${a8})";
+}
+
+class Struct9BytesInt4Or8ByteAligned extends Struct {
+  @Int64()
+  int a0;
+
+  @Int8()
+  int a1;
+
+  String toString() => "(${a0}, ${a1})";
+}
+
+class Struct12BytesHomogeneousFloat extends Struct {
+  @Float()
+  double a0;
+
+  @Float()
+  double a1;
+
+  @Float()
+  double a2;
+
+  String toString() => "(${a0}, ${a1}, ${a2})";
+}
+
+class Struct16BytesHomogeneousFloat extends Struct {
+  @Float()
+  double a0;
+
+  @Float()
+  double a1;
+
+  @Float()
+  double a2;
+
+  @Float()
+  double a3;
+
+  String toString() => "(${a0}, ${a1}, ${a2}, ${a3})";
+}
+
+class Struct16BytesMixed extends Struct {
+  @Double()
+  double a0;
+
+  @Int64()
+  int a1;
+
+  String toString() => "(${a0}, ${a1})";
+}
+
+class Struct16BytesMixed2 extends Struct {
+  @Float()
+  double a0;
+
+  @Float()
+  double a1;
+
+  @Float()
+  double a2;
+
+  @Int32()
+  int a3;
+
+  String toString() => "(${a0}, ${a1}, ${a2}, ${a3})";
+}
+
+class Struct17BytesInt extends Struct {
+  @Int64()
+  int a0;
+
+  @Int64()
+  int a1;
+
+  @Int8()
+  int a2;
+
+  String toString() => "(${a0}, ${a1}, ${a2})";
+}
+
+class Struct19BytesHomogeneousUint8 extends Struct {
+  @Uint8()
+  int a0;
+
+  @Uint8()
+  int a1;
+
+  @Uint8()
+  int a2;
+
+  @Uint8()
+  int a3;
+
+  @Uint8()
+  int a4;
+
+  @Uint8()
+  int a5;
+
+  @Uint8()
+  int a6;
+
+  @Uint8()
+  int a7;
+
+  @Uint8()
+  int a8;
+
+  @Uint8()
+  int a9;
+
+  @Uint8()
+  int a10;
+
+  @Uint8()
+  int a11;
+
+  @Uint8()
+  int a12;
+
+  @Uint8()
+  int a13;
+
+  @Uint8()
+  int a14;
+
+  @Uint8()
+  int a15;
+
+  @Uint8()
+  int a16;
+
+  @Uint8()
+  int a17;
+
+  @Uint8()
+  int a18;
+
+  String toString() =>
+      "(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5}, ${a6}, ${a7}, ${a8}, ${a9}, ${a10}, ${a11}, ${a12}, ${a13}, ${a14}, ${a15}, ${a16}, ${a17}, ${a18})";
+}
+
+class Struct20BytesHomogeneousInt32 extends Struct {
+  @Int32()
+  int a0;
+
+  @Int32()
+  int a1;
+
+  @Int32()
+  int a2;
+
+  @Int32()
+  int a3;
+
+  @Int32()
+  int a4;
+
+  String toString() => "(${a0}, ${a1}, ${a2}, ${a3}, ${a4})";
+}
+
+class Struct20BytesHomogeneousFloat extends Struct {
+  @Float()
+  double a0;
+
+  @Float()
+  double a1;
+
+  @Float()
+  double a2;
+
+  @Float()
+  double a3;
+
+  @Float()
+  double a4;
+
+  String toString() => "(${a0}, ${a1}, ${a2}, ${a3}, ${a4})";
+}
+
+class Struct32BytesHomogeneousDouble extends Struct {
+  @Double()
+  double a0;
+
+  @Double()
+  double a1;
+
+  @Double()
+  double a2;
+
+  @Double()
+  double a3;
+
+  String toString() => "(${a0}, ${a1}, ${a2}, ${a3})";
+}
+
+class Struct40BytesHomogeneousDouble extends Struct {
+  @Double()
+  double a0;
+
+  @Double()
+  double a1;
+
+  @Double()
+  double a2;
+
+  @Double()
+  double a3;
+
+  @Double()
+  double a4;
+
+  String toString() => "(${a0}, ${a1}, ${a2}, ${a3}, ${a4})";
+}
+
+class Struct1024BytesHomogeneousUint64 extends Struct {
+  @Uint64()
+  int a0;
+
+  @Uint64()
+  int a1;
+
+  @Uint64()
+  int a2;
+
+  @Uint64()
+  int a3;
+
+  @Uint64()
+  int a4;
+
+  @Uint64()
+  int a5;
+
+  @Uint64()
+  int a6;
+
+  @Uint64()
+  int a7;
+
+  @Uint64()
+  int a8;
+
+  @Uint64()
+  int a9;
+
+  @Uint64()
+  int a10;
+
+  @Uint64()
+  int a11;
+
+  @Uint64()
+  int a12;
+
+  @Uint64()
+  int a13;
+
+  @Uint64()
+  int a14;
+
+  @Uint64()
+  int a15;
+
+  @Uint64()
+  int a16;
+
+  @Uint64()
+  int a17;
+
+  @Uint64()
+  int a18;
+
+  @Uint64()
+  int a19;
+
+  @Uint64()
+  int a20;
+
+  @Uint64()
+  int a21;
+
+  @Uint64()
+  int a22;
+
+  @Uint64()
+  int a23;
+
+  @Uint64()
+  int a24;
+
+  @Uint64()
+  int a25;
+
+  @Uint64()
+  int a26;
+
+  @Uint64()
+  int a27;
+
+  @Uint64()
+  int a28;
+
+  @Uint64()
+  int a29;
+
+  @Uint64()
+  int a30;
+
+  @Uint64()
+  int a31;
+
+  @Uint64()
+  int a32;
+
+  @Uint64()
+  int a33;
+
+  @Uint64()
+  int a34;
+
+  @Uint64()
+  int a35;
+
+  @Uint64()
+  int a36;
+
+  @Uint64()
+  int a37;
+
+  @Uint64()
+  int a38;
+
+  @Uint64()
+  int a39;
+
+  @Uint64()
+  int a40;
+
+  @Uint64()
+  int a41;
+
+  @Uint64()
+  int a42;
+
+  @Uint64()
+  int a43;
+
+  @Uint64()
+  int a44;
+
+  @Uint64()
+  int a45;
+
+  @Uint64()
+  int a46;
+
+  @Uint64()
+  int a47;
+
+  @Uint64()
+  int a48;
+
+  @Uint64()
+  int a49;
+
+  @Uint64()
+  int a50;
+
+  @Uint64()
+  int a51;
+
+  @Uint64()
+  int a52;
+
+  @Uint64()
+  int a53;
+
+  @Uint64()
+  int a54;
+
+  @Uint64()
+  int a55;
+
+  @Uint64()
+  int a56;
+
+  @Uint64()
+  int a57;
+
+  @Uint64()
+  int a58;
+
+  @Uint64()
+  int a59;
+
+  @Uint64()
+  int a60;
+
+  @Uint64()
+  int a61;
+
+  @Uint64()
+  int a62;
+
+  @Uint64()
+  int a63;
+
+  @Uint64()
+  int a64;
+
+  @Uint64()
+  int a65;
+
+  @Uint64()
+  int a66;
+
+  @Uint64()
+  int a67;
+
+  @Uint64()
+  int a68;
+
+  @Uint64()
+  int a69;
+
+  @Uint64()
+  int a70;
+
+  @Uint64()
+  int a71;
+
+  @Uint64()
+  int a72;
+
+  @Uint64()
+  int a73;
+
+  @Uint64()
+  int a74;
+
+  @Uint64()
+  int a75;
+
+  @Uint64()
+  int a76;
+
+  @Uint64()
+  int a77;
+
+  @Uint64()
+  int a78;
+
+  @Uint64()
+  int a79;
+
+  @Uint64()
+  int a80;
+
+  @Uint64()
+  int a81;
+
+  @Uint64()
+  int a82;
+
+  @Uint64()
+  int a83;
+
+  @Uint64()
+  int a84;
+
+  @Uint64()
+  int a85;
+
+  @Uint64()
+  int a86;
+
+  @Uint64()
+  int a87;
+
+  @Uint64()
+  int a88;
+
+  @Uint64()
+  int a89;
+
+  @Uint64()
+  int a90;
+
+  @Uint64()
+  int a91;
+
+  @Uint64()
+  int a92;
+
+  @Uint64()
+  int a93;
+
+  @Uint64()
+  int a94;
+
+  @Uint64()
+  int a95;
+
+  @Uint64()
+  int a96;
+
+  @Uint64()
+  int a97;
+
+  @Uint64()
+  int a98;
+
+  @Uint64()
+  int a99;
+
+  @Uint64()
+  int a100;
+
+  @Uint64()
+  int a101;
+
+  @Uint64()
+  int a102;
+
+  @Uint64()
+  int a103;
+
+  @Uint64()
+  int a104;
+
+  @Uint64()
+  int a105;
+
+  @Uint64()
+  int a106;
+
+  @Uint64()
+  int a107;
+
+  @Uint64()
+  int a108;
+
+  @Uint64()
+  int a109;
+
+  @Uint64()
+  int a110;
+
+  @Uint64()
+  int a111;
+
+  @Uint64()
+  int a112;
+
+  @Uint64()
+  int a113;
+
+  @Uint64()
+  int a114;
+
+  @Uint64()
+  int a115;
+
+  @Uint64()
+  int a116;
+
+  @Uint64()
+  int a117;
+
+  @Uint64()
+  int a118;
+
+  @Uint64()
+  int a119;
+
+  @Uint64()
+  int a120;
+
+  @Uint64()
+  int a121;
+
+  @Uint64()
+  int a122;
+
+  @Uint64()
+  int a123;
+
+  @Uint64()
+  int a124;
+
+  @Uint64()
+  int a125;
+
+  @Uint64()
+  int a126;
+
+  @Uint64()
+  int a127;
+
+  String toString() =>
+      "(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5}, ${a6}, ${a7}, ${a8}, ${a9}, ${a10}, ${a11}, ${a12}, ${a13}, ${a14}, ${a15}, ${a16}, ${a17}, ${a18}, ${a19}, ${a20}, ${a21}, ${a22}, ${a23}, ${a24}, ${a25}, ${a26}, ${a27}, ${a28}, ${a29}, ${a30}, ${a31}, ${a32}, ${a33}, ${a34}, ${a35}, ${a36}, ${a37}, ${a38}, ${a39}, ${a40}, ${a41}, ${a42}, ${a43}, ${a44}, ${a45}, ${a46}, ${a47}, ${a48}, ${a49}, ${a50}, ${a51}, ${a52}, ${a53}, ${a54}, ${a55}, ${a56}, ${a57}, ${a58}, ${a59}, ${a60}, ${a61}, ${a62}, ${a63}, ${a64}, ${a65}, ${a66}, ${a67}, ${a68}, ${a69}, ${a70}, ${a71}, ${a72}, ${a73}, ${a74}, ${a75}, ${a76}, ${a77}, ${a78}, ${a79}, ${a80}, ${a81}, ${a82}, ${a83}, ${a84}, ${a85}, ${a86}, ${a87}, ${a88}, ${a89}, ${a90}, ${a91}, ${a92}, ${a93}, ${a94}, ${a95}, ${a96}, ${a97}, ${a98}, ${a99}, ${a100}, ${a101}, ${a102}, ${a103}, ${a104}, ${a105}, ${a106}, ${a107}, ${a108}, ${a109}, ${a110}, ${a111}, ${a112}, ${a113}, ${a114}, ${a115}, ${a116}, ${a117}, ${a118}, ${a119}, ${a120}, ${a121}, ${a122}, ${a123}, ${a124}, ${a125}, ${a126}, ${a127})";
+}
+
+class StructAlignmentInt16 extends Struct {
+  @Int8()
+  int a0;
+
+  @Int16()
+  int a1;
+
+  @Int8()
+  int a2;
+
+  String toString() => "(${a0}, ${a1}, ${a2})";
+}
+
+class StructAlignmentInt32 extends Struct {
+  @Int8()
+  int a0;
+
+  @Int32()
+  int a1;
+
+  @Int8()
+  int a2;
+
+  String toString() => "(${a0}, ${a1}, ${a2})";
+}
+
+class StructAlignmentInt64 extends Struct {
+  @Int8()
+  int a0;
+
+  @Int64()
+  int a1;
+
+  @Int8()
+  int a2;
+
+  String toString() => "(${a0}, ${a1}, ${a2})";
+}
+
+final passStruct1ByteIntx10 = ffiTestFunctions.lookupFunction<
+    Int64 Function(
+        Struct1ByteInt,
+        Struct1ByteInt,
+        Struct1ByteInt,
+        Struct1ByteInt,
+        Struct1ByteInt,
+        Struct1ByteInt,
+        Struct1ByteInt,
+        Struct1ByteInt,
+        Struct1ByteInt,
+        Struct1ByteInt),
+    int Function(
+        Struct1ByteInt,
+        Struct1ByteInt,
+        Struct1ByteInt,
+        Struct1ByteInt,
+        Struct1ByteInt,
+        Struct1ByteInt,
+        Struct1ByteInt,
+        Struct1ByteInt,
+        Struct1ByteInt,
+        Struct1ByteInt)>("PassStruct1ByteIntx10");
+
+/// Smallest struct with data.
+/// 10 struct arguments will exhaust available registers.
+void testPassStruct1ByteIntx10() {
+  Struct1ByteInt a0 = allocate<Struct1ByteInt>().ref;
+  Struct1ByteInt a1 = allocate<Struct1ByteInt>().ref;
+  Struct1ByteInt a2 = allocate<Struct1ByteInt>().ref;
+  Struct1ByteInt a3 = allocate<Struct1ByteInt>().ref;
+  Struct1ByteInt a4 = allocate<Struct1ByteInt>().ref;
+  Struct1ByteInt a5 = allocate<Struct1ByteInt>().ref;
+  Struct1ByteInt a6 = allocate<Struct1ByteInt>().ref;
+  Struct1ByteInt a7 = allocate<Struct1ByteInt>().ref;
+  Struct1ByteInt a8 = allocate<Struct1ByteInt>().ref;
+  Struct1ByteInt a9 = allocate<Struct1ByteInt>().ref;
+
+  a0.a0 = -1;
+  a1.a0 = 2;
+  a2.a0 = -3;
+  a3.a0 = 4;
+  a4.a0 = -5;
+  a5.a0 = 6;
+  a6.a0 = -7;
+  a7.a0 = 8;
+  a8.a0 = -9;
+  a9.a0 = 10;
+
+  final result = passStruct1ByteIntx10(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+  print("result = $result");
+
+  Expect.equals(5, result);
+
+  free(a0.addressOf);
+  free(a1.addressOf);
+  free(a2.addressOf);
+  free(a3.addressOf);
+  free(a4.addressOf);
+  free(a5.addressOf);
+  free(a6.addressOf);
+  free(a7.addressOf);
+  free(a8.addressOf);
+  free(a9.addressOf);
+}
+
+final passStruct3BytesHomogeneousUint8x10 = ffiTestFunctions.lookupFunction<
+    Int64 Function(
+        Struct3BytesHomogeneousUint8,
+        Struct3BytesHomogeneousUint8,
+        Struct3BytesHomogeneousUint8,
+        Struct3BytesHomogeneousUint8,
+        Struct3BytesHomogeneousUint8,
+        Struct3BytesHomogeneousUint8,
+        Struct3BytesHomogeneousUint8,
+        Struct3BytesHomogeneousUint8,
+        Struct3BytesHomogeneousUint8,
+        Struct3BytesHomogeneousUint8),
+    int Function(
+        Struct3BytesHomogeneousUint8,
+        Struct3BytesHomogeneousUint8,
+        Struct3BytesHomogeneousUint8,
+        Struct3BytesHomogeneousUint8,
+        Struct3BytesHomogeneousUint8,
+        Struct3BytesHomogeneousUint8,
+        Struct3BytesHomogeneousUint8,
+        Struct3BytesHomogeneousUint8,
+        Struct3BytesHomogeneousUint8,
+        Struct3BytesHomogeneousUint8)>("PassStruct3BytesHomogeneousUint8x10");
+
+/// Not a multiple of word size, not a power of two.
+/// 10 struct arguments will exhaust available registers.
+void testPassStruct3BytesHomogeneousUint8x10() {
+  Struct3BytesHomogeneousUint8 a0 =
+      allocate<Struct3BytesHomogeneousUint8>().ref;
+  Struct3BytesHomogeneousUint8 a1 =
+      allocate<Struct3BytesHomogeneousUint8>().ref;
+  Struct3BytesHomogeneousUint8 a2 =
+      allocate<Struct3BytesHomogeneousUint8>().ref;
+  Struct3BytesHomogeneousUint8 a3 =
+      allocate<Struct3BytesHomogeneousUint8>().ref;
+  Struct3BytesHomogeneousUint8 a4 =
+      allocate<Struct3BytesHomogeneousUint8>().ref;
+  Struct3BytesHomogeneousUint8 a5 =
+      allocate<Struct3BytesHomogeneousUint8>().ref;
+  Struct3BytesHomogeneousUint8 a6 =
+      allocate<Struct3BytesHomogeneousUint8>().ref;
+  Struct3BytesHomogeneousUint8 a7 =
+      allocate<Struct3BytesHomogeneousUint8>().ref;
+  Struct3BytesHomogeneousUint8 a8 =
+      allocate<Struct3BytesHomogeneousUint8>().ref;
+  Struct3BytesHomogeneousUint8 a9 =
+      allocate<Struct3BytesHomogeneousUint8>().ref;
+
+  a0.a0 = 1;
+  a0.a1 = 2;
+  a0.a2 = 3;
+  a1.a0 = 4;
+  a1.a1 = 5;
+  a1.a2 = 6;
+  a2.a0 = 7;
+  a2.a1 = 8;
+  a2.a2 = 9;
+  a3.a0 = 10;
+  a3.a1 = 11;
+  a3.a2 = 12;
+  a4.a0 = 13;
+  a4.a1 = 14;
+  a4.a2 = 15;
+  a5.a0 = 16;
+  a5.a1 = 17;
+  a5.a2 = 18;
+  a6.a0 = 19;
+  a6.a1 = 20;
+  a6.a2 = 21;
+  a7.a0 = 22;
+  a7.a1 = 23;
+  a7.a2 = 24;
+  a8.a0 = 25;
+  a8.a1 = 26;
+  a8.a2 = 27;
+  a9.a0 = 28;
+  a9.a1 = 29;
+  a9.a2 = 30;
+
+  final result = passStruct3BytesHomogeneousUint8x10(
+      a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+  print("result = $result");
+
+  Expect.equals(465, result);
+
+  free(a0.addressOf);
+  free(a1.addressOf);
+  free(a2.addressOf);
+  free(a3.addressOf);
+  free(a4.addressOf);
+  free(a5.addressOf);
+  free(a6.addressOf);
+  free(a7.addressOf);
+  free(a8.addressOf);
+  free(a9.addressOf);
+}
+
+final passStruct3BytesInt2ByteAlignedx10 = ffiTestFunctions.lookupFunction<
+    Int64 Function(
+        Struct3BytesInt2ByteAligned,
+        Struct3BytesInt2ByteAligned,
+        Struct3BytesInt2ByteAligned,
+        Struct3BytesInt2ByteAligned,
+        Struct3BytesInt2ByteAligned,
+        Struct3BytesInt2ByteAligned,
+        Struct3BytesInt2ByteAligned,
+        Struct3BytesInt2ByteAligned,
+        Struct3BytesInt2ByteAligned,
+        Struct3BytesInt2ByteAligned),
+    int Function(
+        Struct3BytesInt2ByteAligned,
+        Struct3BytesInt2ByteAligned,
+        Struct3BytesInt2ByteAligned,
+        Struct3BytesInt2ByteAligned,
+        Struct3BytesInt2ByteAligned,
+        Struct3BytesInt2ByteAligned,
+        Struct3BytesInt2ByteAligned,
+        Struct3BytesInt2ByteAligned,
+        Struct3BytesInt2ByteAligned,
+        Struct3BytesInt2ByteAligned)>("PassStruct3BytesInt2ByteAlignedx10");
+
+/// Not a multiple of word size, not a power of two.
+/// With alignment rules taken into account size is 4 bytes.
+/// 10 struct arguments will exhaust available registers.
+void testPassStruct3BytesInt2ByteAlignedx10() {
+  Struct3BytesInt2ByteAligned a0 = allocate<Struct3BytesInt2ByteAligned>().ref;
+  Struct3BytesInt2ByteAligned a1 = allocate<Struct3BytesInt2ByteAligned>().ref;
+  Struct3BytesInt2ByteAligned a2 = allocate<Struct3BytesInt2ByteAligned>().ref;
+  Struct3BytesInt2ByteAligned a3 = allocate<Struct3BytesInt2ByteAligned>().ref;
+  Struct3BytesInt2ByteAligned a4 = allocate<Struct3BytesInt2ByteAligned>().ref;
+  Struct3BytesInt2ByteAligned a5 = allocate<Struct3BytesInt2ByteAligned>().ref;
+  Struct3BytesInt2ByteAligned a6 = allocate<Struct3BytesInt2ByteAligned>().ref;
+  Struct3BytesInt2ByteAligned a7 = allocate<Struct3BytesInt2ByteAligned>().ref;
+  Struct3BytesInt2ByteAligned a8 = allocate<Struct3BytesInt2ByteAligned>().ref;
+  Struct3BytesInt2ByteAligned a9 = allocate<Struct3BytesInt2ByteAligned>().ref;
+
+  a0.a0 = -1;
+  a0.a1 = 2;
+  a1.a0 = -3;
+  a1.a1 = 4;
+  a2.a0 = -5;
+  a2.a1 = 6;
+  a3.a0 = -7;
+  a3.a1 = 8;
+  a4.a0 = -9;
+  a4.a1 = 10;
+  a5.a0 = -11;
+  a5.a1 = 12;
+  a6.a0 = -13;
+  a6.a1 = 14;
+  a7.a0 = -15;
+  a7.a1 = 16;
+  a8.a0 = -17;
+  a8.a1 = 18;
+  a9.a0 = -19;
+  a9.a1 = 20;
+
+  final result = passStruct3BytesInt2ByteAlignedx10(
+      a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+  print("result = $result");
+
+  Expect.equals(10, result);
+
+  free(a0.addressOf);
+  free(a1.addressOf);
+  free(a2.addressOf);
+  free(a3.addressOf);
+  free(a4.addressOf);
+  free(a5.addressOf);
+  free(a6.addressOf);
+  free(a7.addressOf);
+  free(a8.addressOf);
+  free(a9.addressOf);
+}
+
+final passStruct4BytesHomogeneousInt16x10 = ffiTestFunctions.lookupFunction<
+    Int64 Function(
+        Struct4BytesHomogeneousInt16,
+        Struct4BytesHomogeneousInt16,
+        Struct4BytesHomogeneousInt16,
+        Struct4BytesHomogeneousInt16,
+        Struct4BytesHomogeneousInt16,
+        Struct4BytesHomogeneousInt16,
+        Struct4BytesHomogeneousInt16,
+        Struct4BytesHomogeneousInt16,
+        Struct4BytesHomogeneousInt16,
+        Struct4BytesHomogeneousInt16),
+    int Function(
+        Struct4BytesHomogeneousInt16,
+        Struct4BytesHomogeneousInt16,
+        Struct4BytesHomogeneousInt16,
+        Struct4BytesHomogeneousInt16,
+        Struct4BytesHomogeneousInt16,
+        Struct4BytesHomogeneousInt16,
+        Struct4BytesHomogeneousInt16,
+        Struct4BytesHomogeneousInt16,
+        Struct4BytesHomogeneousInt16,
+        Struct4BytesHomogeneousInt16)>("PassStruct4BytesHomogeneousInt16x10");
+
+/// Exactly word size on 32-bit architectures.
+/// 10 struct arguments will exhaust available registers.
+void testPassStruct4BytesHomogeneousInt16x10() {
+  Struct4BytesHomogeneousInt16 a0 =
+      allocate<Struct4BytesHomogeneousInt16>().ref;
+  Struct4BytesHomogeneousInt16 a1 =
+      allocate<Struct4BytesHomogeneousInt16>().ref;
+  Struct4BytesHomogeneousInt16 a2 =
+      allocate<Struct4BytesHomogeneousInt16>().ref;
+  Struct4BytesHomogeneousInt16 a3 =
+      allocate<Struct4BytesHomogeneousInt16>().ref;
+  Struct4BytesHomogeneousInt16 a4 =
+      allocate<Struct4BytesHomogeneousInt16>().ref;
+  Struct4BytesHomogeneousInt16 a5 =
+      allocate<Struct4BytesHomogeneousInt16>().ref;
+  Struct4BytesHomogeneousInt16 a6 =
+      allocate<Struct4BytesHomogeneousInt16>().ref;
+  Struct4BytesHomogeneousInt16 a7 =
+      allocate<Struct4BytesHomogeneousInt16>().ref;
+  Struct4BytesHomogeneousInt16 a8 =
+      allocate<Struct4BytesHomogeneousInt16>().ref;
+  Struct4BytesHomogeneousInt16 a9 =
+      allocate<Struct4BytesHomogeneousInt16>().ref;
+
+  a0.a0 = -1;
+  a0.a1 = 2;
+  a1.a0 = -3;
+  a1.a1 = 4;
+  a2.a0 = -5;
+  a2.a1 = 6;
+  a3.a0 = -7;
+  a3.a1 = 8;
+  a4.a0 = -9;
+  a4.a1 = 10;
+  a5.a0 = -11;
+  a5.a1 = 12;
+  a6.a0 = -13;
+  a6.a1 = 14;
+  a7.a0 = -15;
+  a7.a1 = 16;
+  a8.a0 = -17;
+  a8.a1 = 18;
+  a9.a0 = -19;
+  a9.a1 = 20;
+
+  final result = passStruct4BytesHomogeneousInt16x10(
+      a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+  print("result = $result");
+
+  Expect.equals(10, result);
+
+  free(a0.addressOf);
+  free(a1.addressOf);
+  free(a2.addressOf);
+  free(a3.addressOf);
+  free(a4.addressOf);
+  free(a5.addressOf);
+  free(a6.addressOf);
+  free(a7.addressOf);
+  free(a8.addressOf);
+  free(a9.addressOf);
+}
+
+final passStruct7BytesHomogeneousUint8x10 = ffiTestFunctions.lookupFunction<
+    Int64 Function(
+        Struct7BytesHomogeneousUint8,
+        Struct7BytesHomogeneousUint8,
+        Struct7BytesHomogeneousUint8,
+        Struct7BytesHomogeneousUint8,
+        Struct7BytesHomogeneousUint8,
+        Struct7BytesHomogeneousUint8,
+        Struct7BytesHomogeneousUint8,
+        Struct7BytesHomogeneousUint8,
+        Struct7BytesHomogeneousUint8,
+        Struct7BytesHomogeneousUint8),
+    int Function(
+        Struct7BytesHomogeneousUint8,
+        Struct7BytesHomogeneousUint8,
+        Struct7BytesHomogeneousUint8,
+        Struct7BytesHomogeneousUint8,
+        Struct7BytesHomogeneousUint8,
+        Struct7BytesHomogeneousUint8,
+        Struct7BytesHomogeneousUint8,
+        Struct7BytesHomogeneousUint8,
+        Struct7BytesHomogeneousUint8,
+        Struct7BytesHomogeneousUint8)>("PassStruct7BytesHomogeneousUint8x10");
+
+/// Sub word size on 64 bit architectures.
+/// 10 struct arguments will exhaust available registers.
+void testPassStruct7BytesHomogeneousUint8x10() {
+  Struct7BytesHomogeneousUint8 a0 =
+      allocate<Struct7BytesHomogeneousUint8>().ref;
+  Struct7BytesHomogeneousUint8 a1 =
+      allocate<Struct7BytesHomogeneousUint8>().ref;
+  Struct7BytesHomogeneousUint8 a2 =
+      allocate<Struct7BytesHomogeneousUint8>().ref;
+  Struct7BytesHomogeneousUint8 a3 =
+      allocate<Struct7BytesHomogeneousUint8>().ref;
+  Struct7BytesHomogeneousUint8 a4 =
+      allocate<Struct7BytesHomogeneousUint8>().ref;
+  Struct7BytesHomogeneousUint8 a5 =
+      allocate<Struct7BytesHomogeneousUint8>().ref;
+  Struct7BytesHomogeneousUint8 a6 =
+      allocate<Struct7BytesHomogeneousUint8>().ref;
+  Struct7BytesHomogeneousUint8 a7 =
+      allocate<Struct7BytesHomogeneousUint8>().ref;
+  Struct7BytesHomogeneousUint8 a8 =
+      allocate<Struct7BytesHomogeneousUint8>().ref;
+  Struct7BytesHomogeneousUint8 a9 =
+      allocate<Struct7BytesHomogeneousUint8>().ref;
+
+  a0.a0 = 1;
+  a0.a1 = 2;
+  a0.a2 = 3;
+  a0.a3 = 4;
+  a0.a4 = 5;
+  a0.a5 = 6;
+  a0.a6 = 7;
+  a1.a0 = 8;
+  a1.a1 = 9;
+  a1.a2 = 10;
+  a1.a3 = 11;
+  a1.a4 = 12;
+  a1.a5 = 13;
+  a1.a6 = 14;
+  a2.a0 = 15;
+  a2.a1 = 16;
+  a2.a2 = 17;
+  a2.a3 = 18;
+  a2.a4 = 19;
+  a2.a5 = 20;
+  a2.a6 = 21;
+  a3.a0 = 22;
+  a3.a1 = 23;
+  a3.a2 = 24;
+  a3.a3 = 25;
+  a3.a4 = 26;
+  a3.a5 = 27;
+  a3.a6 = 28;
+  a4.a0 = 29;
+  a4.a1 = 30;
+  a4.a2 = 31;
+  a4.a3 = 32;
+  a4.a4 = 33;
+  a4.a5 = 34;
+  a4.a6 = 35;
+  a5.a0 = 36;
+  a5.a1 = 37;
+  a5.a2 = 38;
+  a5.a3 = 39;
+  a5.a4 = 40;
+  a5.a5 = 41;
+  a5.a6 = 42;
+  a6.a0 = 43;
+  a6.a1 = 44;
+  a6.a2 = 45;
+  a6.a3 = 46;
+  a6.a4 = 47;
+  a6.a5 = 48;
+  a6.a6 = 49;
+  a7.a0 = 50;
+  a7.a1 = 51;
+  a7.a2 = 52;
+  a7.a3 = 53;
+  a7.a4 = 54;
+  a7.a5 = 55;
+  a7.a6 = 56;
+  a8.a0 = 57;
+  a8.a1 = 58;
+  a8.a2 = 59;
+  a8.a3 = 60;
+  a8.a4 = 61;
+  a8.a5 = 62;
+  a8.a6 = 63;
+  a9.a0 = 64;
+  a9.a1 = 65;
+  a9.a2 = 66;
+  a9.a3 = 67;
+  a9.a4 = 68;
+  a9.a5 = 69;
+  a9.a6 = 70;
+
+  final result = passStruct7BytesHomogeneousUint8x10(
+      a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+  print("result = $result");
+
+  Expect.equals(2485, result);
+
+  free(a0.addressOf);
+  free(a1.addressOf);
+  free(a2.addressOf);
+  free(a3.addressOf);
+  free(a4.addressOf);
+  free(a5.addressOf);
+  free(a6.addressOf);
+  free(a7.addressOf);
+  free(a8.addressOf);
+  free(a9.addressOf);
+}
+
+final passStruct7BytesInt4ByteAlignedx10 = ffiTestFunctions.lookupFunction<
+    Int64 Function(
+        Struct7BytesInt4ByteAligned,
+        Struct7BytesInt4ByteAligned,
+        Struct7BytesInt4ByteAligned,
+        Struct7BytesInt4ByteAligned,
+        Struct7BytesInt4ByteAligned,
+        Struct7BytesInt4ByteAligned,
+        Struct7BytesInt4ByteAligned,
+        Struct7BytesInt4ByteAligned,
+        Struct7BytesInt4ByteAligned,
+        Struct7BytesInt4ByteAligned),
+    int Function(
+        Struct7BytesInt4ByteAligned,
+        Struct7BytesInt4ByteAligned,
+        Struct7BytesInt4ByteAligned,
+        Struct7BytesInt4ByteAligned,
+        Struct7BytesInt4ByteAligned,
+        Struct7BytesInt4ByteAligned,
+        Struct7BytesInt4ByteAligned,
+        Struct7BytesInt4ByteAligned,
+        Struct7BytesInt4ByteAligned,
+        Struct7BytesInt4ByteAligned)>("PassStruct7BytesInt4ByteAlignedx10");
+
+/// Sub word size on 64 bit architectures.
+/// With alignment rules taken into account size is 8 bytes.
+/// 10 struct arguments will exhaust available registers.
+void testPassStruct7BytesInt4ByteAlignedx10() {
+  Struct7BytesInt4ByteAligned a0 = allocate<Struct7BytesInt4ByteAligned>().ref;
+  Struct7BytesInt4ByteAligned a1 = allocate<Struct7BytesInt4ByteAligned>().ref;
+  Struct7BytesInt4ByteAligned a2 = allocate<Struct7BytesInt4ByteAligned>().ref;
+  Struct7BytesInt4ByteAligned a3 = allocate<Struct7BytesInt4ByteAligned>().ref;
+  Struct7BytesInt4ByteAligned a4 = allocate<Struct7BytesInt4ByteAligned>().ref;
+  Struct7BytesInt4ByteAligned a5 = allocate<Struct7BytesInt4ByteAligned>().ref;
+  Struct7BytesInt4ByteAligned a6 = allocate<Struct7BytesInt4ByteAligned>().ref;
+  Struct7BytesInt4ByteAligned a7 = allocate<Struct7BytesInt4ByteAligned>().ref;
+  Struct7BytesInt4ByteAligned a8 = allocate<Struct7BytesInt4ByteAligned>().ref;
+  Struct7BytesInt4ByteAligned a9 = allocate<Struct7BytesInt4ByteAligned>().ref;
+
+  a0.a0 = -1;
+  a0.a1 = 2;
+  a0.a2 = -3;
+  a1.a0 = 4;
+  a1.a1 = -5;
+  a1.a2 = 6;
+  a2.a0 = -7;
+  a2.a1 = 8;
+  a2.a2 = -9;
+  a3.a0 = 10;
+  a3.a1 = -11;
+  a3.a2 = 12;
+  a4.a0 = -13;
+  a4.a1 = 14;
+  a4.a2 = -15;
+  a5.a0 = 16;
+  a5.a1 = -17;
+  a5.a2 = 18;
+  a6.a0 = -19;
+  a6.a1 = 20;
+  a6.a2 = -21;
+  a7.a0 = 22;
+  a7.a1 = -23;
+  a7.a2 = 24;
+  a8.a0 = -25;
+  a8.a1 = 26;
+  a8.a2 = -27;
+  a9.a0 = 28;
+  a9.a1 = -29;
+  a9.a2 = 30;
+
+  final result = passStruct7BytesInt4ByteAlignedx10(
+      a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+  print("result = $result");
+
+  Expect.equals(15, result);
+
+  free(a0.addressOf);
+  free(a1.addressOf);
+  free(a2.addressOf);
+  free(a3.addressOf);
+  free(a4.addressOf);
+  free(a5.addressOf);
+  free(a6.addressOf);
+  free(a7.addressOf);
+  free(a8.addressOf);
+  free(a9.addressOf);
+}
+
+final passStruct8BytesIntx10 = ffiTestFunctions.lookupFunction<
+    Int64 Function(
+        Struct8BytesInt,
+        Struct8BytesInt,
+        Struct8BytesInt,
+        Struct8BytesInt,
+        Struct8BytesInt,
+        Struct8BytesInt,
+        Struct8BytesInt,
+        Struct8BytesInt,
+        Struct8BytesInt,
+        Struct8BytesInt),
+    int Function(
+        Struct8BytesInt,
+        Struct8BytesInt,
+        Struct8BytesInt,
+        Struct8BytesInt,
+        Struct8BytesInt,
+        Struct8BytesInt,
+        Struct8BytesInt,
+        Struct8BytesInt,
+        Struct8BytesInt,
+        Struct8BytesInt)>("PassStruct8BytesIntx10");
+
+/// Exactly word size struct on 64bit architectures.
+/// 10 struct arguments will exhaust available registers.
+void testPassStruct8BytesIntx10() {
+  Struct8BytesInt a0 = allocate<Struct8BytesInt>().ref;
+  Struct8BytesInt a1 = allocate<Struct8BytesInt>().ref;
+  Struct8BytesInt a2 = allocate<Struct8BytesInt>().ref;
+  Struct8BytesInt a3 = allocate<Struct8BytesInt>().ref;
+  Struct8BytesInt a4 = allocate<Struct8BytesInt>().ref;
+  Struct8BytesInt a5 = allocate<Struct8BytesInt>().ref;
+  Struct8BytesInt a6 = allocate<Struct8BytesInt>().ref;
+  Struct8BytesInt a7 = allocate<Struct8BytesInt>().ref;
+  Struct8BytesInt a8 = allocate<Struct8BytesInt>().ref;
+  Struct8BytesInt a9 = allocate<Struct8BytesInt>().ref;
+
+  a0.a0 = -1;
+  a0.a1 = 2;
+  a0.a2 = -3;
+  a1.a0 = 4;
+  a1.a1 = -5;
+  a1.a2 = 6;
+  a2.a0 = -7;
+  a2.a1 = 8;
+  a2.a2 = -9;
+  a3.a0 = 10;
+  a3.a1 = -11;
+  a3.a2 = 12;
+  a4.a0 = -13;
+  a4.a1 = 14;
+  a4.a2 = -15;
+  a5.a0 = 16;
+  a5.a1 = -17;
+  a5.a2 = 18;
+  a6.a0 = -19;
+  a6.a1 = 20;
+  a6.a2 = -21;
+  a7.a0 = 22;
+  a7.a1 = -23;
+  a7.a2 = 24;
+  a8.a0 = -25;
+  a8.a1 = 26;
+  a8.a2 = -27;
+  a9.a0 = 28;
+  a9.a1 = -29;
+  a9.a2 = 30;
+
+  final result = passStruct8BytesIntx10(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+  print("result = $result");
+
+  Expect.equals(15, result);
+
+  free(a0.addressOf);
+  free(a1.addressOf);
+  free(a2.addressOf);
+  free(a3.addressOf);
+  free(a4.addressOf);
+  free(a5.addressOf);
+  free(a6.addressOf);
+  free(a7.addressOf);
+  free(a8.addressOf);
+  free(a9.addressOf);
+}
+
+final passStruct8BytesHomogeneousFloatx10 = ffiTestFunctions.lookupFunction<
+    Float Function(
+        Struct8BytesHomogeneousFloat,
+        Struct8BytesHomogeneousFloat,
+        Struct8BytesHomogeneousFloat,
+        Struct8BytesHomogeneousFloat,
+        Struct8BytesHomogeneousFloat,
+        Struct8BytesHomogeneousFloat,
+        Struct8BytesHomogeneousFloat,
+        Struct8BytesHomogeneousFloat,
+        Struct8BytesHomogeneousFloat,
+        Struct8BytesHomogeneousFloat),
+    double Function(
+        Struct8BytesHomogeneousFloat,
+        Struct8BytesHomogeneousFloat,
+        Struct8BytesHomogeneousFloat,
+        Struct8BytesHomogeneousFloat,
+        Struct8BytesHomogeneousFloat,
+        Struct8BytesHomogeneousFloat,
+        Struct8BytesHomogeneousFloat,
+        Struct8BytesHomogeneousFloat,
+        Struct8BytesHomogeneousFloat,
+        Struct8BytesHomogeneousFloat)>("PassStruct8BytesHomogeneousFloatx10");
+
+/// Arguments passed in FP registers as long as they fit.
+/// 10 struct arguments will exhaust available registers.
+void testPassStruct8BytesHomogeneousFloatx10() {
+  Struct8BytesHomogeneousFloat a0 =
+      allocate<Struct8BytesHomogeneousFloat>().ref;
+  Struct8BytesHomogeneousFloat a1 =
+      allocate<Struct8BytesHomogeneousFloat>().ref;
+  Struct8BytesHomogeneousFloat a2 =
+      allocate<Struct8BytesHomogeneousFloat>().ref;
+  Struct8BytesHomogeneousFloat a3 =
+      allocate<Struct8BytesHomogeneousFloat>().ref;
+  Struct8BytesHomogeneousFloat a4 =
+      allocate<Struct8BytesHomogeneousFloat>().ref;
+  Struct8BytesHomogeneousFloat a5 =
+      allocate<Struct8BytesHomogeneousFloat>().ref;
+  Struct8BytesHomogeneousFloat a6 =
+      allocate<Struct8BytesHomogeneousFloat>().ref;
+  Struct8BytesHomogeneousFloat a7 =
+      allocate<Struct8BytesHomogeneousFloat>().ref;
+  Struct8BytesHomogeneousFloat a8 =
+      allocate<Struct8BytesHomogeneousFloat>().ref;
+  Struct8BytesHomogeneousFloat a9 =
+      allocate<Struct8BytesHomogeneousFloat>().ref;
+
+  a0.a0 = -1.0;
+  a0.a1 = 2.0;
+  a1.a0 = -3.0;
+  a1.a1 = 4.0;
+  a2.a0 = -5.0;
+  a2.a1 = 6.0;
+  a3.a0 = -7.0;
+  a3.a1 = 8.0;
+  a4.a0 = -9.0;
+  a4.a1 = 10.0;
+  a5.a0 = -11.0;
+  a5.a1 = 12.0;
+  a6.a0 = -13.0;
+  a6.a1 = 14.0;
+  a7.a0 = -15.0;
+  a7.a1 = 16.0;
+  a8.a0 = -17.0;
+  a8.a1 = 18.0;
+  a9.a0 = -19.0;
+  a9.a1 = 20.0;
+
+  final result = passStruct8BytesHomogeneousFloatx10(
+      a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+  print("result = $result");
+
+  Expect.approxEquals(10.0, result);
+
+  free(a0.addressOf);
+  free(a1.addressOf);
+  free(a2.addressOf);
+  free(a3.addressOf);
+  free(a4.addressOf);
+  free(a5.addressOf);
+  free(a6.addressOf);
+  free(a7.addressOf);
+  free(a8.addressOf);
+  free(a9.addressOf);
+}
+
+final passStruct8BytesMixedx10 = ffiTestFunctions.lookupFunction<
+    Float Function(
+        Struct8BytesMixed,
+        Struct8BytesMixed,
+        Struct8BytesMixed,
+        Struct8BytesMixed,
+        Struct8BytesMixed,
+        Struct8BytesMixed,
+        Struct8BytesMixed,
+        Struct8BytesMixed,
+        Struct8BytesMixed,
+        Struct8BytesMixed),
+    double Function(
+        Struct8BytesMixed,
+        Struct8BytesMixed,
+        Struct8BytesMixed,
+        Struct8BytesMixed,
+        Struct8BytesMixed,
+        Struct8BytesMixed,
+        Struct8BytesMixed,
+        Struct8BytesMixed,
+        Struct8BytesMixed,
+        Struct8BytesMixed)>("PassStruct8BytesMixedx10");
+
+/// On x64, arguments go in int registers because it is not only float.
+/// 10 struct arguments will exhaust available registers.
+void testPassStruct8BytesMixedx10() {
+  Struct8BytesMixed a0 = allocate<Struct8BytesMixed>().ref;
+  Struct8BytesMixed a1 = allocate<Struct8BytesMixed>().ref;
+  Struct8BytesMixed a2 = allocate<Struct8BytesMixed>().ref;
+  Struct8BytesMixed a3 = allocate<Struct8BytesMixed>().ref;
+  Struct8BytesMixed a4 = allocate<Struct8BytesMixed>().ref;
+  Struct8BytesMixed a5 = allocate<Struct8BytesMixed>().ref;
+  Struct8BytesMixed a6 = allocate<Struct8BytesMixed>().ref;
+  Struct8BytesMixed a7 = allocate<Struct8BytesMixed>().ref;
+  Struct8BytesMixed a8 = allocate<Struct8BytesMixed>().ref;
+  Struct8BytesMixed a9 = allocate<Struct8BytesMixed>().ref;
+
+  a0.a0 = -1.0;
+  a0.a1 = 2;
+  a0.a2 = -3;
+  a1.a0 = 4.0;
+  a1.a1 = -5;
+  a1.a2 = 6;
+  a2.a0 = -7.0;
+  a2.a1 = 8;
+  a2.a2 = -9;
+  a3.a0 = 10.0;
+  a3.a1 = -11;
+  a3.a2 = 12;
+  a4.a0 = -13.0;
+  a4.a1 = 14;
+  a4.a2 = -15;
+  a5.a0 = 16.0;
+  a5.a1 = -17;
+  a5.a2 = 18;
+  a6.a0 = -19.0;
+  a6.a1 = 20;
+  a6.a2 = -21;
+  a7.a0 = 22.0;
+  a7.a1 = -23;
+  a7.a2 = 24;
+  a8.a0 = -25.0;
+  a8.a1 = 26;
+  a8.a2 = -27;
+  a9.a0 = 28.0;
+  a9.a1 = -29;
+  a9.a2 = 30;
+
+  final result =
+      passStruct8BytesMixedx10(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+  print("result = $result");
+
+  Expect.approxEquals(15.0, result);
+
+  free(a0.addressOf);
+  free(a1.addressOf);
+  free(a2.addressOf);
+  free(a3.addressOf);
+  free(a4.addressOf);
+  free(a5.addressOf);
+  free(a6.addressOf);
+  free(a7.addressOf);
+  free(a8.addressOf);
+  free(a9.addressOf);
+}
+
+final passStruct9BytesHomogeneousUint8x10 = ffiTestFunctions.lookupFunction<
+    Int64 Function(
+        Struct9BytesHomogeneousUint8,
+        Struct9BytesHomogeneousUint8,
+        Struct9BytesHomogeneousUint8,
+        Struct9BytesHomogeneousUint8,
+        Struct9BytesHomogeneousUint8,
+        Struct9BytesHomogeneousUint8,
+        Struct9BytesHomogeneousUint8,
+        Struct9BytesHomogeneousUint8,
+        Struct9BytesHomogeneousUint8,
+        Struct9BytesHomogeneousUint8),
+    int Function(
+        Struct9BytesHomogeneousUint8,
+        Struct9BytesHomogeneousUint8,
+        Struct9BytesHomogeneousUint8,
+        Struct9BytesHomogeneousUint8,
+        Struct9BytesHomogeneousUint8,
+        Struct9BytesHomogeneousUint8,
+        Struct9BytesHomogeneousUint8,
+        Struct9BytesHomogeneousUint8,
+        Struct9BytesHomogeneousUint8,
+        Struct9BytesHomogeneousUint8)>("PassStruct9BytesHomogeneousUint8x10");
+
+/// Argument is a single byte over a multiple of word size.
+/// 10 struct arguments will exhaust available registers.
+/// Struct only has 1-byte aligned fields to test struct alignment itself.
+/// Tests upper bytes in the integer registers that are partly filled.
+/// Tests stack alignment of non word size stack arguments.
+void testPassStruct9BytesHomogeneousUint8x10() {
+  Struct9BytesHomogeneousUint8 a0 =
+      allocate<Struct9BytesHomogeneousUint8>().ref;
+  Struct9BytesHomogeneousUint8 a1 =
+      allocate<Struct9BytesHomogeneousUint8>().ref;
+  Struct9BytesHomogeneousUint8 a2 =
+      allocate<Struct9BytesHomogeneousUint8>().ref;
+  Struct9BytesHomogeneousUint8 a3 =
+      allocate<Struct9BytesHomogeneousUint8>().ref;
+  Struct9BytesHomogeneousUint8 a4 =
+      allocate<Struct9BytesHomogeneousUint8>().ref;
+  Struct9BytesHomogeneousUint8 a5 =
+      allocate<Struct9BytesHomogeneousUint8>().ref;
+  Struct9BytesHomogeneousUint8 a6 =
+      allocate<Struct9BytesHomogeneousUint8>().ref;
+  Struct9BytesHomogeneousUint8 a7 =
+      allocate<Struct9BytesHomogeneousUint8>().ref;
+  Struct9BytesHomogeneousUint8 a8 =
+      allocate<Struct9BytesHomogeneousUint8>().ref;
+  Struct9BytesHomogeneousUint8 a9 =
+      allocate<Struct9BytesHomogeneousUint8>().ref;
+
+  a0.a0 = 1;
+  a0.a1 = 2;
+  a0.a2 = 3;
+  a0.a3 = 4;
+  a0.a4 = 5;
+  a0.a5 = 6;
+  a0.a6 = 7;
+  a0.a7 = 8;
+  a0.a8 = 9;
+  a1.a0 = 10;
+  a1.a1 = 11;
+  a1.a2 = 12;
+  a1.a3 = 13;
+  a1.a4 = 14;
+  a1.a5 = 15;
+  a1.a6 = 16;
+  a1.a7 = 17;
+  a1.a8 = 18;
+  a2.a0 = 19;
+  a2.a1 = 20;
+  a2.a2 = 21;
+  a2.a3 = 22;
+  a2.a4 = 23;
+  a2.a5 = 24;
+  a2.a6 = 25;
+  a2.a7 = 26;
+  a2.a8 = 27;
+  a3.a0 = 28;
+  a3.a1 = 29;
+  a3.a2 = 30;
+  a3.a3 = 31;
+  a3.a4 = 32;
+  a3.a5 = 33;
+  a3.a6 = 34;
+  a3.a7 = 35;
+  a3.a8 = 36;
+  a4.a0 = 37;
+  a4.a1 = 38;
+  a4.a2 = 39;
+  a4.a3 = 40;
+  a4.a4 = 41;
+  a4.a5 = 42;
+  a4.a6 = 43;
+  a4.a7 = 44;
+  a4.a8 = 45;
+  a5.a0 = 46;
+  a5.a1 = 47;
+  a5.a2 = 48;
+  a5.a3 = 49;
+  a5.a4 = 50;
+  a5.a5 = 51;
+  a5.a6 = 52;
+  a5.a7 = 53;
+  a5.a8 = 54;
+  a6.a0 = 55;
+  a6.a1 = 56;
+  a6.a2 = 57;
+  a6.a3 = 58;
+  a6.a4 = 59;
+  a6.a5 = 60;
+  a6.a6 = 61;
+  a6.a7 = 62;
+  a6.a8 = 63;
+  a7.a0 = 64;
+  a7.a1 = 65;
+  a7.a2 = 66;
+  a7.a3 = 67;
+  a7.a4 = 68;
+  a7.a5 = 69;
+  a7.a6 = 70;
+  a7.a7 = 71;
+  a7.a8 = 72;
+  a8.a0 = 73;
+  a8.a1 = 74;
+  a8.a2 = 75;
+  a8.a3 = 76;
+  a8.a4 = 77;
+  a8.a5 = 78;
+  a8.a6 = 79;
+  a8.a7 = 80;
+  a8.a8 = 81;
+  a9.a0 = 82;
+  a9.a1 = 83;
+  a9.a2 = 84;
+  a9.a3 = 85;
+  a9.a4 = 86;
+  a9.a5 = 87;
+  a9.a6 = 88;
+  a9.a7 = 89;
+  a9.a8 = 90;
+
+  final result = passStruct9BytesHomogeneousUint8x10(
+      a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+  print("result = $result");
+
+  Expect.equals(4095, result);
+
+  free(a0.addressOf);
+  free(a1.addressOf);
+  free(a2.addressOf);
+  free(a3.addressOf);
+  free(a4.addressOf);
+  free(a5.addressOf);
+  free(a6.addressOf);
+  free(a7.addressOf);
+  free(a8.addressOf);
+  free(a9.addressOf);
+}
+
+final passStruct9BytesInt4Or8ByteAlignedx10 = ffiTestFunctions.lookupFunction<
+        Int64 Function(
+            Struct9BytesInt4Or8ByteAligned,
+            Struct9BytesInt4Or8ByteAligned,
+            Struct9BytesInt4Or8ByteAligned,
+            Struct9BytesInt4Or8ByteAligned,
+            Struct9BytesInt4Or8ByteAligned,
+            Struct9BytesInt4Or8ByteAligned,
+            Struct9BytesInt4Or8ByteAligned,
+            Struct9BytesInt4Or8ByteAligned,
+            Struct9BytesInt4Or8ByteAligned,
+            Struct9BytesInt4Or8ByteAligned),
+        int Function(
+            Struct9BytesInt4Or8ByteAligned,
+            Struct9BytesInt4Or8ByteAligned,
+            Struct9BytesInt4Or8ByteAligned,
+            Struct9BytesInt4Or8ByteAligned,
+            Struct9BytesInt4Or8ByteAligned,
+            Struct9BytesInt4Or8ByteAligned,
+            Struct9BytesInt4Or8ByteAligned,
+            Struct9BytesInt4Or8ByteAligned,
+            Struct9BytesInt4Or8ByteAligned,
+            Struct9BytesInt4Or8ByteAligned)>(
+    "PassStruct9BytesInt4Or8ByteAlignedx10");
+
+/// Argument is a single byte over a multiple of word size.
+/// With alignment rules taken into account size is 12 or 16 bytes.
+/// 10 struct arguments will exhaust available registers.
+///
+void testPassStruct9BytesInt4Or8ByteAlignedx10() {
+  Struct9BytesInt4Or8ByteAligned a0 =
+      allocate<Struct9BytesInt4Or8ByteAligned>().ref;
+  Struct9BytesInt4Or8ByteAligned a1 =
+      allocate<Struct9BytesInt4Or8ByteAligned>().ref;
+  Struct9BytesInt4Or8ByteAligned a2 =
+      allocate<Struct9BytesInt4Or8ByteAligned>().ref;
+  Struct9BytesInt4Or8ByteAligned a3 =
+      allocate<Struct9BytesInt4Or8ByteAligned>().ref;
+  Struct9BytesInt4Or8ByteAligned a4 =
+      allocate<Struct9BytesInt4Or8ByteAligned>().ref;
+  Struct9BytesInt4Or8ByteAligned a5 =
+      allocate<Struct9BytesInt4Or8ByteAligned>().ref;
+  Struct9BytesInt4Or8ByteAligned a6 =
+      allocate<Struct9BytesInt4Or8ByteAligned>().ref;
+  Struct9BytesInt4Or8ByteAligned a7 =
+      allocate<Struct9BytesInt4Or8ByteAligned>().ref;
+  Struct9BytesInt4Or8ByteAligned a8 =
+      allocate<Struct9BytesInt4Or8ByteAligned>().ref;
+  Struct9BytesInt4Or8ByteAligned a9 =
+      allocate<Struct9BytesInt4Or8ByteAligned>().ref;
+
+  a0.a0 = -1;
+  a0.a1 = 2;
+  a1.a0 = -3;
+  a1.a1 = 4;
+  a2.a0 = -5;
+  a2.a1 = 6;
+  a3.a0 = -7;
+  a3.a1 = 8;
+  a4.a0 = -9;
+  a4.a1 = 10;
+  a5.a0 = -11;
+  a5.a1 = 12;
+  a6.a0 = -13;
+  a6.a1 = 14;
+  a7.a0 = -15;
+  a7.a1 = 16;
+  a8.a0 = -17;
+  a8.a1 = 18;
+  a9.a0 = -19;
+  a9.a1 = 20;
+
+  final result = passStruct9BytesInt4Or8ByteAlignedx10(
+      a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+  print("result = $result");
+
+  Expect.equals(10, result);
+
+  free(a0.addressOf);
+  free(a1.addressOf);
+  free(a2.addressOf);
+  free(a3.addressOf);
+  free(a4.addressOf);
+  free(a5.addressOf);
+  free(a6.addressOf);
+  free(a7.addressOf);
+  free(a8.addressOf);
+  free(a9.addressOf);
+}
+
+final passStruct12BytesHomogeneousFloatx6 = ffiTestFunctions.lookupFunction<
+    Float Function(
+        Struct12BytesHomogeneousFloat,
+        Struct12BytesHomogeneousFloat,
+        Struct12BytesHomogeneousFloat,
+        Struct12BytesHomogeneousFloat,
+        Struct12BytesHomogeneousFloat,
+        Struct12BytesHomogeneousFloat),
+    double Function(
+        Struct12BytesHomogeneousFloat,
+        Struct12BytesHomogeneousFloat,
+        Struct12BytesHomogeneousFloat,
+        Struct12BytesHomogeneousFloat,
+        Struct12BytesHomogeneousFloat,
+        Struct12BytesHomogeneousFloat)>("PassStruct12BytesHomogeneousFloatx6");
+
+/// Arguments in FPU registers on arm hardfp and arm64.
+/// Struct arguments will exhaust available registers, and leave some empty.
+/// The last argument is to test whether arguments are backfilled.
+void testPassStruct12BytesHomogeneousFloatx6() {
+  Struct12BytesHomogeneousFloat a0 =
+      allocate<Struct12BytesHomogeneousFloat>().ref;
+  Struct12BytesHomogeneousFloat a1 =
+      allocate<Struct12BytesHomogeneousFloat>().ref;
+  Struct12BytesHomogeneousFloat a2 =
+      allocate<Struct12BytesHomogeneousFloat>().ref;
+  Struct12BytesHomogeneousFloat a3 =
+      allocate<Struct12BytesHomogeneousFloat>().ref;
+  Struct12BytesHomogeneousFloat a4 =
+      allocate<Struct12BytesHomogeneousFloat>().ref;
+  Struct12BytesHomogeneousFloat a5 =
+      allocate<Struct12BytesHomogeneousFloat>().ref;
+
+  a0.a0 = -1.0;
+  a0.a1 = 2.0;
+  a0.a2 = -3.0;
+  a1.a0 = 4.0;
+  a1.a1 = -5.0;
+  a1.a2 = 6.0;
+  a2.a0 = -7.0;
+  a2.a1 = 8.0;
+  a2.a2 = -9.0;
+  a3.a0 = 10.0;
+  a3.a1 = -11.0;
+  a3.a2 = 12.0;
+  a4.a0 = -13.0;
+  a4.a1 = 14.0;
+  a4.a2 = -15.0;
+  a5.a0 = 16.0;
+  a5.a1 = -17.0;
+  a5.a2 = 18.0;
+
+  final result = passStruct12BytesHomogeneousFloatx6(a0, a1, a2, a3, a4, a5);
+
+  print("result = $result");
+
+  Expect.approxEquals(9.0, result);
+
+  free(a0.addressOf);
+  free(a1.addressOf);
+  free(a2.addressOf);
+  free(a3.addressOf);
+  free(a4.addressOf);
+  free(a5.addressOf);
+}
+
+final passStruct16BytesHomogeneousFloatx5 = ffiTestFunctions.lookupFunction<
+    Float Function(
+        Struct16BytesHomogeneousFloat,
+        Struct16BytesHomogeneousFloat,
+        Struct16BytesHomogeneousFloat,
+        Struct16BytesHomogeneousFloat,
+        Struct16BytesHomogeneousFloat),
+    double Function(
+        Struct16BytesHomogeneousFloat,
+        Struct16BytesHomogeneousFloat,
+        Struct16BytesHomogeneousFloat,
+        Struct16BytesHomogeneousFloat,
+        Struct16BytesHomogeneousFloat)>("PassStruct16BytesHomogeneousFloatx5");
+
+/// On Linux x64 argument is transferred on stack because it is over 16 bytes.
+/// Arguments in FPU registers on arm hardfp and arm64.
+/// 5 struct arguments will exhaust available registers.
+void testPassStruct16BytesHomogeneousFloatx5() {
+  Struct16BytesHomogeneousFloat a0 =
+      allocate<Struct16BytesHomogeneousFloat>().ref;
+  Struct16BytesHomogeneousFloat a1 =
+      allocate<Struct16BytesHomogeneousFloat>().ref;
+  Struct16BytesHomogeneousFloat a2 =
+      allocate<Struct16BytesHomogeneousFloat>().ref;
+  Struct16BytesHomogeneousFloat a3 =
+      allocate<Struct16BytesHomogeneousFloat>().ref;
+  Struct16BytesHomogeneousFloat a4 =
+      allocate<Struct16BytesHomogeneousFloat>().ref;
+
+  a0.a0 = -1.0;
+  a0.a1 = 2.0;
+  a0.a2 = -3.0;
+  a0.a3 = 4.0;
+  a1.a0 = -5.0;
+  a1.a1 = 6.0;
+  a1.a2 = -7.0;
+  a1.a3 = 8.0;
+  a2.a0 = -9.0;
+  a2.a1 = 10.0;
+  a2.a2 = -11.0;
+  a2.a3 = 12.0;
+  a3.a0 = -13.0;
+  a3.a1 = 14.0;
+  a3.a2 = -15.0;
+  a3.a3 = 16.0;
+  a4.a0 = -17.0;
+  a4.a1 = 18.0;
+  a4.a2 = -19.0;
+  a4.a3 = 20.0;
+
+  final result = passStruct16BytesHomogeneousFloatx5(a0, a1, a2, a3, a4);
+
+  print("result = $result");
+
+  Expect.approxEquals(10.0, result);
+
+  free(a0.addressOf);
+  free(a1.addressOf);
+  free(a2.addressOf);
+  free(a3.addressOf);
+  free(a4.addressOf);
+}
+
+final passStruct16BytesMixedx10 = ffiTestFunctions.lookupFunction<
+    Double Function(
+        Struct16BytesMixed,
+        Struct16BytesMixed,
+        Struct16BytesMixed,
+        Struct16BytesMixed,
+        Struct16BytesMixed,
+        Struct16BytesMixed,
+        Struct16BytesMixed,
+        Struct16BytesMixed,
+        Struct16BytesMixed,
+        Struct16BytesMixed),
+    double Function(
+        Struct16BytesMixed,
+        Struct16BytesMixed,
+        Struct16BytesMixed,
+        Struct16BytesMixed,
+        Struct16BytesMixed,
+        Struct16BytesMixed,
+        Struct16BytesMixed,
+        Struct16BytesMixed,
+        Struct16BytesMixed,
+        Struct16BytesMixed)>("PassStruct16BytesMixedx10");
+
+/// On x64, arguments are split over FP and int registers.
+/// On x64, it will exhaust the integer registers with the 6th argument.
+/// The rest goes on the stack.
+/// On arm, arguments are 8 byte aligned.
+void testPassStruct16BytesMixedx10() {
+  Struct16BytesMixed a0 = allocate<Struct16BytesMixed>().ref;
+  Struct16BytesMixed a1 = allocate<Struct16BytesMixed>().ref;
+  Struct16BytesMixed a2 = allocate<Struct16BytesMixed>().ref;
+  Struct16BytesMixed a3 = allocate<Struct16BytesMixed>().ref;
+  Struct16BytesMixed a4 = allocate<Struct16BytesMixed>().ref;
+  Struct16BytesMixed a5 = allocate<Struct16BytesMixed>().ref;
+  Struct16BytesMixed a6 = allocate<Struct16BytesMixed>().ref;
+  Struct16BytesMixed a7 = allocate<Struct16BytesMixed>().ref;
+  Struct16BytesMixed a8 = allocate<Struct16BytesMixed>().ref;
+  Struct16BytesMixed a9 = allocate<Struct16BytesMixed>().ref;
+
+  a0.a0 = -1.0;
+  a0.a1 = 2;
+  a1.a0 = -3.0;
+  a1.a1 = 4;
+  a2.a0 = -5.0;
+  a2.a1 = 6;
+  a3.a0 = -7.0;
+  a3.a1 = 8;
+  a4.a0 = -9.0;
+  a4.a1 = 10;
+  a5.a0 = -11.0;
+  a5.a1 = 12;
+  a6.a0 = -13.0;
+  a6.a1 = 14;
+  a7.a0 = -15.0;
+  a7.a1 = 16;
+  a8.a0 = -17.0;
+  a8.a1 = 18;
+  a9.a0 = -19.0;
+  a9.a1 = 20;
+
+  final result =
+      passStruct16BytesMixedx10(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+  print("result = $result");
+
+  Expect.approxEquals(10.0, result);
+
+  free(a0.addressOf);
+  free(a1.addressOf);
+  free(a2.addressOf);
+  free(a3.addressOf);
+  free(a4.addressOf);
+  free(a5.addressOf);
+  free(a6.addressOf);
+  free(a7.addressOf);
+  free(a8.addressOf);
+  free(a9.addressOf);
+}
+
+final passStruct16BytesMixed2x10 = ffiTestFunctions.lookupFunction<
+    Float Function(
+        Struct16BytesMixed2,
+        Struct16BytesMixed2,
+        Struct16BytesMixed2,
+        Struct16BytesMixed2,
+        Struct16BytesMixed2,
+        Struct16BytesMixed2,
+        Struct16BytesMixed2,
+        Struct16BytesMixed2,
+        Struct16BytesMixed2,
+        Struct16BytesMixed2),
+    double Function(
+        Struct16BytesMixed2,
+        Struct16BytesMixed2,
+        Struct16BytesMixed2,
+        Struct16BytesMixed2,
+        Struct16BytesMixed2,
+        Struct16BytesMixed2,
+        Struct16BytesMixed2,
+        Struct16BytesMixed2,
+        Struct16BytesMixed2,
+        Struct16BytesMixed2)>("PassStruct16BytesMixed2x10");
+
+/// On x64, arguments are split over FP and int registers.
+/// On x64, it will exhaust the integer registers with the 6th argument.
+/// The rest goes on the stack.
+/// On arm, arguments are 4 byte aligned.
+void testPassStruct16BytesMixed2x10() {
+  Struct16BytesMixed2 a0 = allocate<Struct16BytesMixed2>().ref;
+  Struct16BytesMixed2 a1 = allocate<Struct16BytesMixed2>().ref;
+  Struct16BytesMixed2 a2 = allocate<Struct16BytesMixed2>().ref;
+  Struct16BytesMixed2 a3 = allocate<Struct16BytesMixed2>().ref;
+  Struct16BytesMixed2 a4 = allocate<Struct16BytesMixed2>().ref;
+  Struct16BytesMixed2 a5 = allocate<Struct16BytesMixed2>().ref;
+  Struct16BytesMixed2 a6 = allocate<Struct16BytesMixed2>().ref;
+  Struct16BytesMixed2 a7 = allocate<Struct16BytesMixed2>().ref;
+  Struct16BytesMixed2 a8 = allocate<Struct16BytesMixed2>().ref;
+  Struct16BytesMixed2 a9 = allocate<Struct16BytesMixed2>().ref;
+
+  a0.a0 = -1.0;
+  a0.a1 = 2.0;
+  a0.a2 = -3.0;
+  a0.a3 = 4;
+  a1.a0 = -5.0;
+  a1.a1 = 6.0;
+  a1.a2 = -7.0;
+  a1.a3 = 8;
+  a2.a0 = -9.0;
+  a2.a1 = 10.0;
+  a2.a2 = -11.0;
+  a2.a3 = 12;
+  a3.a0 = -13.0;
+  a3.a1 = 14.0;
+  a3.a2 = -15.0;
+  a3.a3 = 16;
+  a4.a0 = -17.0;
+  a4.a1 = 18.0;
+  a4.a2 = -19.0;
+  a4.a3 = 20;
+  a5.a0 = -21.0;
+  a5.a1 = 22.0;
+  a5.a2 = -23.0;
+  a5.a3 = 24;
+  a6.a0 = -25.0;
+  a6.a1 = 26.0;
+  a6.a2 = -27.0;
+  a6.a3 = 28;
+  a7.a0 = -29.0;
+  a7.a1 = 30.0;
+  a7.a2 = -31.0;
+  a7.a3 = 32;
+  a8.a0 = -33.0;
+  a8.a1 = 34.0;
+  a8.a2 = -35.0;
+  a8.a3 = 36;
+  a9.a0 = -37.0;
+  a9.a1 = 38.0;
+  a9.a2 = -39.0;
+  a9.a3 = 40;
+
+  final result =
+      passStruct16BytesMixed2x10(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+  print("result = $result");
+
+  Expect.approxEquals(20.0, result);
+
+  free(a0.addressOf);
+  free(a1.addressOf);
+  free(a2.addressOf);
+  free(a3.addressOf);
+  free(a4.addressOf);
+  free(a5.addressOf);
+  free(a6.addressOf);
+  free(a7.addressOf);
+  free(a8.addressOf);
+  free(a9.addressOf);
+}
+
+final passStruct17BytesIntx10 = ffiTestFunctions.lookupFunction<
+    Int64 Function(
+        Struct17BytesInt,
+        Struct17BytesInt,
+        Struct17BytesInt,
+        Struct17BytesInt,
+        Struct17BytesInt,
+        Struct17BytesInt,
+        Struct17BytesInt,
+        Struct17BytesInt,
+        Struct17BytesInt,
+        Struct17BytesInt),
+    int Function(
+        Struct17BytesInt,
+        Struct17BytesInt,
+        Struct17BytesInt,
+        Struct17BytesInt,
+        Struct17BytesInt,
+        Struct17BytesInt,
+        Struct17BytesInt,
+        Struct17BytesInt,
+        Struct17BytesInt,
+        Struct17BytesInt)>("PassStruct17BytesIntx10");
+
+/// Arguments are passed as pointer to copy on arm64.
+/// Tests that the memory allocated for copies are rounded up to word size.
+void testPassStruct17BytesIntx10() {
+  Struct17BytesInt a0 = allocate<Struct17BytesInt>().ref;
+  Struct17BytesInt a1 = allocate<Struct17BytesInt>().ref;
+  Struct17BytesInt a2 = allocate<Struct17BytesInt>().ref;
+  Struct17BytesInt a3 = allocate<Struct17BytesInt>().ref;
+  Struct17BytesInt a4 = allocate<Struct17BytesInt>().ref;
+  Struct17BytesInt a5 = allocate<Struct17BytesInt>().ref;
+  Struct17BytesInt a6 = allocate<Struct17BytesInt>().ref;
+  Struct17BytesInt a7 = allocate<Struct17BytesInt>().ref;
+  Struct17BytesInt a8 = allocate<Struct17BytesInt>().ref;
+  Struct17BytesInt a9 = allocate<Struct17BytesInt>().ref;
+
+  a0.a0 = -1;
+  a0.a1 = 2;
+  a0.a2 = -3;
+  a1.a0 = 4;
+  a1.a1 = -5;
+  a1.a2 = 6;
+  a2.a0 = -7;
+  a2.a1 = 8;
+  a2.a2 = -9;
+  a3.a0 = 10;
+  a3.a1 = -11;
+  a3.a2 = 12;
+  a4.a0 = -13;
+  a4.a1 = 14;
+  a4.a2 = -15;
+  a5.a0 = 16;
+  a5.a1 = -17;
+  a5.a2 = 18;
+  a6.a0 = -19;
+  a6.a1 = 20;
+  a6.a2 = -21;
+  a7.a0 = 22;
+  a7.a1 = -23;
+  a7.a2 = 24;
+  a8.a0 = -25;
+  a8.a1 = 26;
+  a8.a2 = -27;
+  a9.a0 = 28;
+  a9.a1 = -29;
+  a9.a2 = 30;
+
+  final result =
+      passStruct17BytesIntx10(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+  print("result = $result");
+
+  Expect.equals(15, result);
+
+  free(a0.addressOf);
+  free(a1.addressOf);
+  free(a2.addressOf);
+  free(a3.addressOf);
+  free(a4.addressOf);
+  free(a5.addressOf);
+  free(a6.addressOf);
+  free(a7.addressOf);
+  free(a8.addressOf);
+  free(a9.addressOf);
+}
+
+final passStruct19BytesHomogeneousUint8x10 = ffiTestFunctions.lookupFunction<
+    Int64 Function(
+        Struct19BytesHomogeneousUint8,
+        Struct19BytesHomogeneousUint8,
+        Struct19BytesHomogeneousUint8,
+        Struct19BytesHomogeneousUint8,
+        Struct19BytesHomogeneousUint8,
+        Struct19BytesHomogeneousUint8,
+        Struct19BytesHomogeneousUint8,
+        Struct19BytesHomogeneousUint8,
+        Struct19BytesHomogeneousUint8,
+        Struct19BytesHomogeneousUint8),
+    int Function(
+        Struct19BytesHomogeneousUint8,
+        Struct19BytesHomogeneousUint8,
+        Struct19BytesHomogeneousUint8,
+        Struct19BytesHomogeneousUint8,
+        Struct19BytesHomogeneousUint8,
+        Struct19BytesHomogeneousUint8,
+        Struct19BytesHomogeneousUint8,
+        Struct19BytesHomogeneousUint8,
+        Struct19BytesHomogeneousUint8,
+        Struct19BytesHomogeneousUint8)>("PassStruct19BytesHomogeneousUint8x10");
+
+/// The minimum alignment of this struct is only 1 byte based on its fields.
+/// Test that the memory backing these structs is extended to the right size.
+///
+void testPassStruct19BytesHomogeneousUint8x10() {
+  Struct19BytesHomogeneousUint8 a0 =
+      allocate<Struct19BytesHomogeneousUint8>().ref;
+  Struct19BytesHomogeneousUint8 a1 =
+      allocate<Struct19BytesHomogeneousUint8>().ref;
+  Struct19BytesHomogeneousUint8 a2 =
+      allocate<Struct19BytesHomogeneousUint8>().ref;
+  Struct19BytesHomogeneousUint8 a3 =
+      allocate<Struct19BytesHomogeneousUint8>().ref;
+  Struct19BytesHomogeneousUint8 a4 =
+      allocate<Struct19BytesHomogeneousUint8>().ref;
+  Struct19BytesHomogeneousUint8 a5 =
+      allocate<Struct19BytesHomogeneousUint8>().ref;
+  Struct19BytesHomogeneousUint8 a6 =
+      allocate<Struct19BytesHomogeneousUint8>().ref;
+  Struct19BytesHomogeneousUint8 a7 =
+      allocate<Struct19BytesHomogeneousUint8>().ref;
+  Struct19BytesHomogeneousUint8 a8 =
+      allocate<Struct19BytesHomogeneousUint8>().ref;
+  Struct19BytesHomogeneousUint8 a9 =
+      allocate<Struct19BytesHomogeneousUint8>().ref;
+
+  a0.a0 = 1;
+  a0.a1 = 2;
+  a0.a2 = 3;
+  a0.a3 = 4;
+  a0.a4 = 5;
+  a0.a5 = 6;
+  a0.a6 = 7;
+  a0.a7 = 8;
+  a0.a8 = 9;
+  a0.a9 = 10;
+  a0.a10 = 11;
+  a0.a11 = 12;
+  a0.a12 = 13;
+  a0.a13 = 14;
+  a0.a14 = 15;
+  a0.a15 = 16;
+  a0.a16 = 17;
+  a0.a17 = 18;
+  a0.a18 = 19;
+  a1.a0 = 20;
+  a1.a1 = 21;
+  a1.a2 = 22;
+  a1.a3 = 23;
+  a1.a4 = 24;
+  a1.a5 = 25;
+  a1.a6 = 26;
+  a1.a7 = 27;
+  a1.a8 = 28;
+  a1.a9 = 29;
+  a1.a10 = 30;
+  a1.a11 = 31;
+  a1.a12 = 32;
+  a1.a13 = 33;
+  a1.a14 = 34;
+  a1.a15 = 35;
+  a1.a16 = 36;
+  a1.a17 = 37;
+  a1.a18 = 38;
+  a2.a0 = 39;
+  a2.a1 = 40;
+  a2.a2 = 41;
+  a2.a3 = 42;
+  a2.a4 = 43;
+  a2.a5 = 44;
+  a2.a6 = 45;
+  a2.a7 = 46;
+  a2.a8 = 47;
+  a2.a9 = 48;
+  a2.a10 = 49;
+  a2.a11 = 50;
+  a2.a12 = 51;
+  a2.a13 = 52;
+  a2.a14 = 53;
+  a2.a15 = 54;
+  a2.a16 = 55;
+  a2.a17 = 56;
+  a2.a18 = 57;
+  a3.a0 = 58;
+  a3.a1 = 59;
+  a3.a2 = 60;
+  a3.a3 = 61;
+  a3.a4 = 62;
+  a3.a5 = 63;
+  a3.a6 = 64;
+  a3.a7 = 65;
+  a3.a8 = 66;
+  a3.a9 = 67;
+  a3.a10 = 68;
+  a3.a11 = 69;
+  a3.a12 = 70;
+  a3.a13 = 71;
+  a3.a14 = 72;
+  a3.a15 = 73;
+  a3.a16 = 74;
+  a3.a17 = 75;
+  a3.a18 = 76;
+  a4.a0 = 77;
+  a4.a1 = 78;
+  a4.a2 = 79;
+  a4.a3 = 80;
+  a4.a4 = 81;
+  a4.a5 = 82;
+  a4.a6 = 83;
+  a4.a7 = 84;
+  a4.a8 = 85;
+  a4.a9 = 86;
+  a4.a10 = 87;
+  a4.a11 = 88;
+  a4.a12 = 89;
+  a4.a13 = 90;
+  a4.a14 = 91;
+  a4.a15 = 92;
+  a4.a16 = 93;
+  a4.a17 = 94;
+  a4.a18 = 95;
+  a5.a0 = 96;
+  a5.a1 = 97;
+  a5.a2 = 98;
+  a5.a3 = 99;
+  a5.a4 = 100;
+  a5.a5 = 101;
+  a5.a6 = 102;
+  a5.a7 = 103;
+  a5.a8 = 104;
+  a5.a9 = 105;
+  a5.a10 = 106;
+  a5.a11 = 107;
+  a5.a12 = 108;
+  a5.a13 = 109;
+  a5.a14 = 110;
+  a5.a15 = 111;
+  a5.a16 = 112;
+  a5.a17 = 113;
+  a5.a18 = 114;
+  a6.a0 = 115;
+  a6.a1 = 116;
+  a6.a2 = 117;
+  a6.a3 = 118;
+  a6.a4 = 119;
+  a6.a5 = 120;
+  a6.a6 = 121;
+  a6.a7 = 122;
+  a6.a8 = 123;
+  a6.a9 = 124;
+  a6.a10 = 125;
+  a6.a11 = 126;
+  a6.a12 = 127;
+  a6.a13 = 128;
+  a6.a14 = 129;
+  a6.a15 = 130;
+  a6.a16 = 131;
+  a6.a17 = 132;
+  a6.a18 = 133;
+  a7.a0 = 134;
+  a7.a1 = 135;
+  a7.a2 = 136;
+  a7.a3 = 137;
+  a7.a4 = 138;
+  a7.a5 = 139;
+  a7.a6 = 140;
+  a7.a7 = 141;
+  a7.a8 = 142;
+  a7.a9 = 143;
+  a7.a10 = 144;
+  a7.a11 = 145;
+  a7.a12 = 146;
+  a7.a13 = 147;
+  a7.a14 = 148;
+  a7.a15 = 149;
+  a7.a16 = 150;
+  a7.a17 = 151;
+  a7.a18 = 152;
+  a8.a0 = 153;
+  a8.a1 = 154;
+  a8.a2 = 155;
+  a8.a3 = 156;
+  a8.a4 = 157;
+  a8.a5 = 158;
+  a8.a6 = 159;
+  a8.a7 = 160;
+  a8.a8 = 161;
+  a8.a9 = 162;
+  a8.a10 = 163;
+  a8.a11 = 164;
+  a8.a12 = 165;
+  a8.a13 = 166;
+  a8.a14 = 167;
+  a8.a15 = 168;
+  a8.a16 = 169;
+  a8.a17 = 170;
+  a8.a18 = 171;
+  a9.a0 = 172;
+  a9.a1 = 173;
+  a9.a2 = 174;
+  a9.a3 = 175;
+  a9.a4 = 176;
+  a9.a5 = 177;
+  a9.a6 = 178;
+  a9.a7 = 179;
+  a9.a8 = 180;
+  a9.a9 = 181;
+  a9.a10 = 182;
+  a9.a11 = 183;
+  a9.a12 = 184;
+  a9.a13 = 185;
+  a9.a14 = 186;
+  a9.a15 = 187;
+  a9.a16 = 188;
+  a9.a17 = 189;
+  a9.a18 = 190;
+
+  final result = passStruct19BytesHomogeneousUint8x10(
+      a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+  print("result = $result");
+
+  Expect.equals(18145, result);
+
+  free(a0.addressOf);
+  free(a1.addressOf);
+  free(a2.addressOf);
+  free(a3.addressOf);
+  free(a4.addressOf);
+  free(a5.addressOf);
+  free(a6.addressOf);
+  free(a7.addressOf);
+  free(a8.addressOf);
+  free(a9.addressOf);
+}
+
+final passStruct20BytesHomogeneousInt32x10 = ffiTestFunctions.lookupFunction<
+    Int32 Function(
+        Struct20BytesHomogeneousInt32,
+        Struct20BytesHomogeneousInt32,
+        Struct20BytesHomogeneousInt32,
+        Struct20BytesHomogeneousInt32,
+        Struct20BytesHomogeneousInt32,
+        Struct20BytesHomogeneousInt32,
+        Struct20BytesHomogeneousInt32,
+        Struct20BytesHomogeneousInt32,
+        Struct20BytesHomogeneousInt32,
+        Struct20BytesHomogeneousInt32),
+    int Function(
+        Struct20BytesHomogeneousInt32,
+        Struct20BytesHomogeneousInt32,
+        Struct20BytesHomogeneousInt32,
+        Struct20BytesHomogeneousInt32,
+        Struct20BytesHomogeneousInt32,
+        Struct20BytesHomogeneousInt32,
+        Struct20BytesHomogeneousInt32,
+        Struct20BytesHomogeneousInt32,
+        Struct20BytesHomogeneousInt32,
+        Struct20BytesHomogeneousInt32)>("PassStruct20BytesHomogeneousInt32x10");
+
+/// Argument too big to go into integer registers on arm64.
+/// The arguments are passed as pointers to copies.
+/// The amount of arguments exhausts the number of integer registers, such that
+/// pointers to copies are also passed on the stack.
+void testPassStruct20BytesHomogeneousInt32x10() {
+  Struct20BytesHomogeneousInt32 a0 =
+      allocate<Struct20BytesHomogeneousInt32>().ref;
+  Struct20BytesHomogeneousInt32 a1 =
+      allocate<Struct20BytesHomogeneousInt32>().ref;
+  Struct20BytesHomogeneousInt32 a2 =
+      allocate<Struct20BytesHomogeneousInt32>().ref;
+  Struct20BytesHomogeneousInt32 a3 =
+      allocate<Struct20BytesHomogeneousInt32>().ref;
+  Struct20BytesHomogeneousInt32 a4 =
+      allocate<Struct20BytesHomogeneousInt32>().ref;
+  Struct20BytesHomogeneousInt32 a5 =
+      allocate<Struct20BytesHomogeneousInt32>().ref;
+  Struct20BytesHomogeneousInt32 a6 =
+      allocate<Struct20BytesHomogeneousInt32>().ref;
+  Struct20BytesHomogeneousInt32 a7 =
+      allocate<Struct20BytesHomogeneousInt32>().ref;
+  Struct20BytesHomogeneousInt32 a8 =
+      allocate<Struct20BytesHomogeneousInt32>().ref;
+  Struct20BytesHomogeneousInt32 a9 =
+      allocate<Struct20BytesHomogeneousInt32>().ref;
+
+  a0.a0 = -1;
+  a0.a1 = 2;
+  a0.a2 = -3;
+  a0.a3 = 4;
+  a0.a4 = -5;
+  a1.a0 = 6;
+  a1.a1 = -7;
+  a1.a2 = 8;
+  a1.a3 = -9;
+  a1.a4 = 10;
+  a2.a0 = -11;
+  a2.a1 = 12;
+  a2.a2 = -13;
+  a2.a3 = 14;
+  a2.a4 = -15;
+  a3.a0 = 16;
+  a3.a1 = -17;
+  a3.a2 = 18;
+  a3.a3 = -19;
+  a3.a4 = 20;
+  a4.a0 = -21;
+  a4.a1 = 22;
+  a4.a2 = -23;
+  a4.a3 = 24;
+  a4.a4 = -25;
+  a5.a0 = 26;
+  a5.a1 = -27;
+  a5.a2 = 28;
+  a5.a3 = -29;
+  a5.a4 = 30;
+  a6.a0 = -31;
+  a6.a1 = 32;
+  a6.a2 = -33;
+  a6.a3 = 34;
+  a6.a4 = -35;
+  a7.a0 = 36;
+  a7.a1 = -37;
+  a7.a2 = 38;
+  a7.a3 = -39;
+  a7.a4 = 40;
+  a8.a0 = -41;
+  a8.a1 = 42;
+  a8.a2 = -43;
+  a8.a3 = 44;
+  a8.a4 = -45;
+  a9.a0 = 46;
+  a9.a1 = -47;
+  a9.a2 = 48;
+  a9.a3 = -49;
+  a9.a4 = 50;
+
+  final result = passStruct20BytesHomogeneousInt32x10(
+      a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+  print("result = $result");
+
+  Expect.equals(25, result);
+
+  free(a0.addressOf);
+  free(a1.addressOf);
+  free(a2.addressOf);
+  free(a3.addressOf);
+  free(a4.addressOf);
+  free(a5.addressOf);
+  free(a6.addressOf);
+  free(a7.addressOf);
+  free(a8.addressOf);
+  free(a9.addressOf);
+}
+
+final passStruct20BytesHomogeneousFloat = ffiTestFunctions.lookupFunction<
+    Float Function(Struct20BytesHomogeneousFloat),
+    double Function(
+        Struct20BytesHomogeneousFloat)>("PassStruct20BytesHomogeneousFloat");
+
+/// Argument too big to go into FPU registers in hardfp and arm64.
+void testPassStruct20BytesHomogeneousFloat() {
+  Struct20BytesHomogeneousFloat a0 =
+      allocate<Struct20BytesHomogeneousFloat>().ref;
+
+  a0.a0 = -1.0;
+  a0.a1 = 2.0;
+  a0.a2 = -3.0;
+  a0.a3 = 4.0;
+  a0.a4 = -5.0;
+
+  final result = passStruct20BytesHomogeneousFloat(a0);
+
+  print("result = $result");
+
+  Expect.approxEquals(-3.0, result);
+
+  free(a0.addressOf);
+}
+
+final passStruct32BytesHomogeneousDoublex5 = ffiTestFunctions.lookupFunction<
+        Double Function(
+            Struct32BytesHomogeneousDouble,
+            Struct32BytesHomogeneousDouble,
+            Struct32BytesHomogeneousDouble,
+            Struct32BytesHomogeneousDouble,
+            Struct32BytesHomogeneousDouble),
+        double Function(
+            Struct32BytesHomogeneousDouble,
+            Struct32BytesHomogeneousDouble,
+            Struct32BytesHomogeneousDouble,
+            Struct32BytesHomogeneousDouble,
+            Struct32BytesHomogeneousDouble)>(
+    "PassStruct32BytesHomogeneousDoublex5");
+
+/// Arguments in FPU registers on arm64.
+/// 5 struct arguments will exhaust available registers.
+void testPassStruct32BytesHomogeneousDoublex5() {
+  Struct32BytesHomogeneousDouble a0 =
+      allocate<Struct32BytesHomogeneousDouble>().ref;
+  Struct32BytesHomogeneousDouble a1 =
+      allocate<Struct32BytesHomogeneousDouble>().ref;
+  Struct32BytesHomogeneousDouble a2 =
+      allocate<Struct32BytesHomogeneousDouble>().ref;
+  Struct32BytesHomogeneousDouble a3 =
+      allocate<Struct32BytesHomogeneousDouble>().ref;
+  Struct32BytesHomogeneousDouble a4 =
+      allocate<Struct32BytesHomogeneousDouble>().ref;
+
+  a0.a0 = -1.0;
+  a0.a1 = 2.0;
+  a0.a2 = -3.0;
+  a0.a3 = 4.0;
+  a1.a0 = -5.0;
+  a1.a1 = 6.0;
+  a1.a2 = -7.0;
+  a1.a3 = 8.0;
+  a2.a0 = -9.0;
+  a2.a1 = 10.0;
+  a2.a2 = -11.0;
+  a2.a3 = 12.0;
+  a3.a0 = -13.0;
+  a3.a1 = 14.0;
+  a3.a2 = -15.0;
+  a3.a3 = 16.0;
+  a4.a0 = -17.0;
+  a4.a1 = 18.0;
+  a4.a2 = -19.0;
+  a4.a3 = 20.0;
+
+  final result = passStruct32BytesHomogeneousDoublex5(a0, a1, a2, a3, a4);
+
+  print("result = $result");
+
+  Expect.approxEquals(10.0, result);
+
+  free(a0.addressOf);
+  free(a1.addressOf);
+  free(a2.addressOf);
+  free(a3.addressOf);
+  free(a4.addressOf);
+}
+
+final passStruct40BytesHomogeneousDouble = ffiTestFunctions.lookupFunction<
+    Double Function(Struct40BytesHomogeneousDouble),
+    double Function(
+        Struct40BytesHomogeneousDouble)>("PassStruct40BytesHomogeneousDouble");
+
+/// Argument too big to go into FPU registers in arm64.
+void testPassStruct40BytesHomogeneousDouble() {
+  Struct40BytesHomogeneousDouble a0 =
+      allocate<Struct40BytesHomogeneousDouble>().ref;
+
+  a0.a0 = -1.0;
+  a0.a1 = 2.0;
+  a0.a2 = -3.0;
+  a0.a3 = 4.0;
+  a0.a4 = -5.0;
+
+  final result = passStruct40BytesHomogeneousDouble(a0);
+
+  print("result = $result");
+
+  Expect.approxEquals(-3.0, result);
+
+  free(a0.addressOf);
+}
+
+final passStruct1024BytesHomogeneousUint64 = ffiTestFunctions.lookupFunction<
+        Uint64 Function(Struct1024BytesHomogeneousUint64),
+        int Function(Struct1024BytesHomogeneousUint64)>(
+    "PassStruct1024BytesHomogeneousUint64");
+
+/// Test 1kb struct.
+void testPassStruct1024BytesHomogeneousUint64() {
+  Struct1024BytesHomogeneousUint64 a0 =
+      allocate<Struct1024BytesHomogeneousUint64>().ref;
+
+  a0.a0 = 1;
+  a0.a1 = 2;
+  a0.a2 = 3;
+  a0.a3 = 4;
+  a0.a4 = 5;
+  a0.a5 = 6;
+  a0.a6 = 7;
+  a0.a7 = 8;
+  a0.a8 = 9;
+  a0.a9 = 10;
+  a0.a10 = 11;
+  a0.a11 = 12;
+  a0.a12 = 13;
+  a0.a13 = 14;
+  a0.a14 = 15;
+  a0.a15 = 16;
+  a0.a16 = 17;
+  a0.a17 = 18;
+  a0.a18 = 19;
+  a0.a19 = 20;
+  a0.a20 = 21;
+  a0.a21 = 22;
+  a0.a22 = 23;
+  a0.a23 = 24;
+  a0.a24 = 25;
+  a0.a25 = 26;
+  a0.a26 = 27;
+  a0.a27 = 28;
+  a0.a28 = 29;
+  a0.a29 = 30;
+  a0.a30 = 31;
+  a0.a31 = 32;
+  a0.a32 = 33;
+  a0.a33 = 34;
+  a0.a34 = 35;
+  a0.a35 = 36;
+  a0.a36 = 37;
+  a0.a37 = 38;
+  a0.a38 = 39;
+  a0.a39 = 40;
+  a0.a40 = 41;
+  a0.a41 = 42;
+  a0.a42 = 43;
+  a0.a43 = 44;
+  a0.a44 = 45;
+  a0.a45 = 46;
+  a0.a46 = 47;
+  a0.a47 = 48;
+  a0.a48 = 49;
+  a0.a49 = 50;
+  a0.a50 = 51;
+  a0.a51 = 52;
+  a0.a52 = 53;
+  a0.a53 = 54;
+  a0.a54 = 55;
+  a0.a55 = 56;
+  a0.a56 = 57;
+  a0.a57 = 58;
+  a0.a58 = 59;
+  a0.a59 = 60;
+  a0.a60 = 61;
+  a0.a61 = 62;
+  a0.a62 = 63;
+  a0.a63 = 64;
+  a0.a64 = 65;
+  a0.a65 = 66;
+  a0.a66 = 67;
+  a0.a67 = 68;
+  a0.a68 = 69;
+  a0.a69 = 70;
+  a0.a70 = 71;
+  a0.a71 = 72;
+  a0.a72 = 73;
+  a0.a73 = 74;
+  a0.a74 = 75;
+  a0.a75 = 76;
+  a0.a76 = 77;
+  a0.a77 = 78;
+  a0.a78 = 79;
+  a0.a79 = 80;
+  a0.a80 = 81;
+  a0.a81 = 82;
+  a0.a82 = 83;
+  a0.a83 = 84;
+  a0.a84 = 85;
+  a0.a85 = 86;
+  a0.a86 = 87;
+  a0.a87 = 88;
+  a0.a88 = 89;
+  a0.a89 = 90;
+  a0.a90 = 91;
+  a0.a91 = 92;
+  a0.a92 = 93;
+  a0.a93 = 94;
+  a0.a94 = 95;
+  a0.a95 = 96;
+  a0.a96 = 97;
+  a0.a97 = 98;
+  a0.a98 = 99;
+  a0.a99 = 100;
+  a0.a100 = 101;
+  a0.a101 = 102;
+  a0.a102 = 103;
+  a0.a103 = 104;
+  a0.a104 = 105;
+  a0.a105 = 106;
+  a0.a106 = 107;
+  a0.a107 = 108;
+  a0.a108 = 109;
+  a0.a109 = 110;
+  a0.a110 = 111;
+  a0.a111 = 112;
+  a0.a112 = 113;
+  a0.a113 = 114;
+  a0.a114 = 115;
+  a0.a115 = 116;
+  a0.a116 = 117;
+  a0.a117 = 118;
+  a0.a118 = 119;
+  a0.a119 = 120;
+  a0.a120 = 121;
+  a0.a121 = 122;
+  a0.a122 = 123;
+  a0.a123 = 124;
+  a0.a124 = 125;
+  a0.a125 = 126;
+  a0.a126 = 127;
+  a0.a127 = 128;
+
+  final result = passStruct1024BytesHomogeneousUint64(a0);
+
+  print("result = $result");
+
+  Expect.equals(8256, result);
+
+  free(a0.addressOf);
+}
+
+final passFloatStruct16BytesHomogeneousFloatFloatStruct1 =
+    ffiTestFunctions.lookupFunction<
+        Float Function(
+            Float,
+            Struct16BytesHomogeneousFloat,
+            Float,
+            Struct16BytesHomogeneousFloat,
+            Float,
+            Struct16BytesHomogeneousFloat,
+            Float,
+            Struct16BytesHomogeneousFloat,
+            Float),
+        double Function(
+            double,
+            Struct16BytesHomogeneousFloat,
+            double,
+            Struct16BytesHomogeneousFloat,
+            double,
+            Struct16BytesHomogeneousFloat,
+            double,
+            Struct16BytesHomogeneousFloat,
+            double)>("PassFloatStruct16BytesHomogeneousFloatFloatStruct1");
+
+/// Tests the alignment of structs in FPU registers and backfilling.
+void testPassFloatStruct16BytesHomogeneousFloatFloatStruct1() {
+  double a0;
+  Struct16BytesHomogeneousFloat a1 =
+      allocate<Struct16BytesHomogeneousFloat>().ref;
+  double a2;
+  Struct16BytesHomogeneousFloat a3 =
+      allocate<Struct16BytesHomogeneousFloat>().ref;
+  double a4;
+  Struct16BytesHomogeneousFloat a5 =
+      allocate<Struct16BytesHomogeneousFloat>().ref;
+  double a6;
+  Struct16BytesHomogeneousFloat a7 =
+      allocate<Struct16BytesHomogeneousFloat>().ref;
+  double a8;
+
+  a0 = -1.0;
+  a1.a0 = 2.0;
+  a1.a1 = -3.0;
+  a1.a2 = 4.0;
+  a1.a3 = -5.0;
+  a2 = 6.0;
+  a3.a0 = -7.0;
+  a3.a1 = 8.0;
+  a3.a2 = -9.0;
+  a3.a3 = 10.0;
+  a4 = -11.0;
+  a5.a0 = 12.0;
+  a5.a1 = -13.0;
+  a5.a2 = 14.0;
+  a5.a3 = -15.0;
+  a6 = 16.0;
+  a7.a0 = -17.0;
+  a7.a1 = 18.0;
+  a7.a2 = -19.0;
+  a7.a3 = 20.0;
+  a8 = -21.0;
+
+  final result = passFloatStruct16BytesHomogeneousFloatFloatStruct1(
+      a0, a1, a2, a3, a4, a5, a6, a7, a8);
+
+  print("result = $result");
+
+  Expect.approxEquals(-11.0, result);
+
+  free(a1.addressOf);
+  free(a3.addressOf);
+  free(a5.addressOf);
+  free(a7.addressOf);
+}
+
+final passFloatStruct32BytesHomogeneousDoubleFloatStruct =
+    ffiTestFunctions.lookupFunction<
+        Double Function(
+            Float,
+            Struct32BytesHomogeneousDouble,
+            Float,
+            Struct32BytesHomogeneousDouble,
+            Float,
+            Struct32BytesHomogeneousDouble,
+            Float,
+            Struct32BytesHomogeneousDouble,
+            Float),
+        double Function(
+            double,
+            Struct32BytesHomogeneousDouble,
+            double,
+            Struct32BytesHomogeneousDouble,
+            double,
+            Struct32BytesHomogeneousDouble,
+            double,
+            Struct32BytesHomogeneousDouble,
+            double)>("PassFloatStruct32BytesHomogeneousDoubleFloatStruct");
+
+/// Tests the alignment of structs in FPU registers and backfilling.
+void testPassFloatStruct32BytesHomogeneousDoubleFloatStruct() {
+  double a0;
+  Struct32BytesHomogeneousDouble a1 =
+      allocate<Struct32BytesHomogeneousDouble>().ref;
+  double a2;
+  Struct32BytesHomogeneousDouble a3 =
+      allocate<Struct32BytesHomogeneousDouble>().ref;
+  double a4;
+  Struct32BytesHomogeneousDouble a5 =
+      allocate<Struct32BytesHomogeneousDouble>().ref;
+  double a6;
+  Struct32BytesHomogeneousDouble a7 =
+      allocate<Struct32BytesHomogeneousDouble>().ref;
+  double a8;
+
+  a0 = -1.0;
+  a1.a0 = 2.0;
+  a1.a1 = -3.0;
+  a1.a2 = 4.0;
+  a1.a3 = -5.0;
+  a2 = 6.0;
+  a3.a0 = -7.0;
+  a3.a1 = 8.0;
+  a3.a2 = -9.0;
+  a3.a3 = 10.0;
+  a4 = -11.0;
+  a5.a0 = 12.0;
+  a5.a1 = -13.0;
+  a5.a2 = 14.0;
+  a5.a3 = -15.0;
+  a6 = 16.0;
+  a7.a0 = -17.0;
+  a7.a1 = 18.0;
+  a7.a2 = -19.0;
+  a7.a3 = 20.0;
+  a8 = -21.0;
+
+  final result = passFloatStruct32BytesHomogeneousDoubleFloatStruct(
+      a0, a1, a2, a3, a4, a5, a6, a7, a8);
+
+  print("result = $result");
+
+  Expect.approxEquals(-11.0, result);
+
+  free(a1.addressOf);
+  free(a3.addressOf);
+  free(a5.addressOf);
+  free(a7.addressOf);
+}
+
+final passInt8Struct16BytesMixedInt8Struct16BytesMixedIn =
+    ffiTestFunctions.lookupFunction<
+        Double Function(Int8, Struct16BytesMixed, Int8, Struct16BytesMixed,
+            Int8, Struct16BytesMixed, Int8, Struct16BytesMixed, Int8),
+        double Function(
+            int,
+            Struct16BytesMixed,
+            int,
+            Struct16BytesMixed,
+            int,
+            Struct16BytesMixed,
+            int,
+            Struct16BytesMixed,
+            int)>("PassInt8Struct16BytesMixedInt8Struct16BytesMixedIn");
+
+/// Tests the alignment of structs in integers registers and on the stack.
+/// Arm32 aligns this struct at 8.
+/// Also, arm32 allocates the second struct partially in registers, partially
+/// on stack.
+/// Test backfilling of integer registers.
+void testPassInt8Struct16BytesMixedInt8Struct16BytesMixedIn() {
+  int a0;
+  Struct16BytesMixed a1 = allocate<Struct16BytesMixed>().ref;
+  int a2;
+  Struct16BytesMixed a3 = allocate<Struct16BytesMixed>().ref;
+  int a4;
+  Struct16BytesMixed a5 = allocate<Struct16BytesMixed>().ref;
+  int a6;
+  Struct16BytesMixed a7 = allocate<Struct16BytesMixed>().ref;
+  int a8;
+
+  a0 = -1;
+  a1.a0 = 2.0;
+  a1.a1 = -3;
+  a2 = 4;
+  a3.a0 = -5.0;
+  a3.a1 = 6;
+  a4 = -7;
+  a5.a0 = 8.0;
+  a5.a1 = -9;
+  a6 = 10;
+  a7.a0 = -11.0;
+  a7.a1 = 12;
+  a8 = -13;
+
+  final result = passInt8Struct16BytesMixedInt8Struct16BytesMixedIn(
+      a0, a1, a2, a3, a4, a5, a6, a7, a8);
+
+  print("result = $result");
+
+  Expect.approxEquals(-7.0, result);
+
+  free(a1.addressOf);
+  free(a3.addressOf);
+  free(a5.addressOf);
+  free(a7.addressOf);
+}
+
+final passDoublex6Struct16BytesMixedx4Int32 = ffiTestFunctions.lookupFunction<
+    Double Function(
+        Double,
+        Double,
+        Double,
+        Double,
+        Double,
+        Double,
+        Struct16BytesMixed,
+        Struct16BytesMixed,
+        Struct16BytesMixed,
+        Struct16BytesMixed,
+        Int32),
+    double Function(
+        double,
+        double,
+        double,
+        double,
+        double,
+        double,
+        Struct16BytesMixed,
+        Struct16BytesMixed,
+        Struct16BytesMixed,
+        Struct16BytesMixed,
+        int)>("PassDoublex6Struct16BytesMixedx4Int32");
+
+/// On Linux x64, it will exhaust xmm registers first, after 6 doubles and 2
+/// structs. The rest of the structs will go on the stack.
+/// The int will be backfilled into the int register.
+void testPassDoublex6Struct16BytesMixedx4Int32() {
+  double a0;
+  double a1;
+  double a2;
+  double a3;
+  double a4;
+  double a5;
+  Struct16BytesMixed a6 = allocate<Struct16BytesMixed>().ref;
+  Struct16BytesMixed a7 = allocate<Struct16BytesMixed>().ref;
+  Struct16BytesMixed a8 = allocate<Struct16BytesMixed>().ref;
+  Struct16BytesMixed a9 = allocate<Struct16BytesMixed>().ref;
+  int a10;
+
+  a0 = -1.0;
+  a1 = 2.0;
+  a2 = -3.0;
+  a3 = 4.0;
+  a4 = -5.0;
+  a5 = 6.0;
+  a6.a0 = -7.0;
+  a6.a1 = 8;
+  a7.a0 = -9.0;
+  a7.a1 = 10;
+  a8.a0 = -11.0;
+  a8.a1 = 12;
+  a9.a0 = -13.0;
+  a9.a1 = 14;
+  a10 = -15;
+
+  final result = passDoublex6Struct16BytesMixedx4Int32(
+      a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10);
+
+  print("result = $result");
+
+  Expect.approxEquals(-8.0, result);
+
+  free(a6.addressOf);
+  free(a7.addressOf);
+  free(a8.addressOf);
+  free(a9.addressOf);
+}
+
+final passInt32x4Struct16BytesMixedx4Double = ffiTestFunctions.lookupFunction<
+    Double Function(Int32, Int32, Int32, Int32, Struct16BytesMixed,
+        Struct16BytesMixed, Struct16BytesMixed, Struct16BytesMixed, Double),
+    double Function(
+        int,
+        int,
+        int,
+        int,
+        Struct16BytesMixed,
+        Struct16BytesMixed,
+        Struct16BytesMixed,
+        Struct16BytesMixed,
+        double)>("PassInt32x4Struct16BytesMixedx4Double");
+
+/// On Linux x64, it will exhaust int registers first.
+/// The rest of the structs will go on the stack.
+/// The double will be backfilled into the xmm register.
+void testPassInt32x4Struct16BytesMixedx4Double() {
+  int a0;
+  int a1;
+  int a2;
+  int a3;
+  Struct16BytesMixed a4 = allocate<Struct16BytesMixed>().ref;
+  Struct16BytesMixed a5 = allocate<Struct16BytesMixed>().ref;
+  Struct16BytesMixed a6 = allocate<Struct16BytesMixed>().ref;
+  Struct16BytesMixed a7 = allocate<Struct16BytesMixed>().ref;
+  double a8;
+
+  a0 = -1;
+  a1 = 2;
+  a2 = -3;
+  a3 = 4;
+  a4.a0 = -5.0;
+  a4.a1 = 6;
+  a5.a0 = -7.0;
+  a5.a1 = 8;
+  a6.a0 = -9.0;
+  a6.a1 = 10;
+  a7.a0 = -11.0;
+  a7.a1 = 12;
+  a8 = -13.0;
+
+  final result =
+      passInt32x4Struct16BytesMixedx4Double(a0, a1, a2, a3, a4, a5, a6, a7, a8);
+
+  print("result = $result");
+
+  Expect.approxEquals(-7.0, result);
+
+  free(a4.addressOf);
+  free(a5.addressOf);
+  free(a6.addressOf);
+  free(a7.addressOf);
+}
+
+final passStruct40BytesHomogeneousDoubleStruct4BytesHomo =
+    ffiTestFunctions.lookupFunction<
+            Double Function(Struct40BytesHomogeneousDouble,
+                Struct4BytesHomogeneousInt16, Struct8BytesHomogeneousFloat),
+            double Function(Struct40BytesHomogeneousDouble,
+                Struct4BytesHomogeneousInt16, Struct8BytesHomogeneousFloat)>(
+        "PassStruct40BytesHomogeneousDoubleStruct4BytesHomo");
+
+/// On various architectures, first struct is allocated on stack.
+/// Check that the other two arguments are allocated on registers.
+void testPassStruct40BytesHomogeneousDoubleStruct4BytesHomo() {
+  Struct40BytesHomogeneousDouble a0 =
+      allocate<Struct40BytesHomogeneousDouble>().ref;
+  Struct4BytesHomogeneousInt16 a1 =
+      allocate<Struct4BytesHomogeneousInt16>().ref;
+  Struct8BytesHomogeneousFloat a2 =
+      allocate<Struct8BytesHomogeneousFloat>().ref;
+
+  a0.a0 = -1.0;
+  a0.a1 = 2.0;
+  a0.a2 = -3.0;
+  a0.a3 = 4.0;
+  a0.a4 = -5.0;
+  a1.a0 = 6;
+  a1.a1 = -7;
+  a2.a0 = 8.0;
+  a2.a1 = -9.0;
+
+  final result = passStruct40BytesHomogeneousDoubleStruct4BytesHomo(a0, a1, a2);
+
+  print("result = $result");
+
+  Expect.approxEquals(-5.0, result);
+
+  free(a0.addressOf);
+  free(a1.addressOf);
+  free(a2.addressOf);
+}
+
+final passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int =
+    ffiTestFunctions.lookupFunction<
+        Double Function(
+            Int32,
+            Int32,
+            Int32,
+            Int32,
+            Int32,
+            Int32,
+            Int32,
+            Int32,
+            Double,
+            Double,
+            Double,
+            Double,
+            Double,
+            Double,
+            Double,
+            Double,
+            Int64,
+            Int8,
+            Struct1ByteInt,
+            Int64,
+            Int8,
+            Struct4BytesHomogeneousInt16,
+            Int64,
+            Int8,
+            Struct8BytesInt,
+            Int64,
+            Int8,
+            Struct8BytesHomogeneousFloat,
+            Int64,
+            Int8,
+            Struct8BytesMixed,
+            Int64,
+            Int8,
+            StructAlignmentInt16,
+            Int64,
+            Int8,
+            StructAlignmentInt32,
+            Int64,
+            Int8,
+            StructAlignmentInt64),
+        double Function(
+            int,
+            int,
+            int,
+            int,
+            int,
+            int,
+            int,
+            int,
+            double,
+            double,
+            double,
+            double,
+            double,
+            double,
+            double,
+            double,
+            int,
+            int,
+            Struct1ByteInt,
+            int,
+            int,
+            Struct4BytesHomogeneousInt16,
+            int,
+            int,
+            Struct8BytesInt,
+            int,
+            int,
+            Struct8BytesHomogeneousFloat,
+            int,
+            int,
+            Struct8BytesMixed,
+            int,
+            int,
+            StructAlignmentInt16,
+            int,
+            int,
+            StructAlignmentInt32,
+            int,
+            int,
+            StructAlignmentInt64)>("PassInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int");
+
+/// Test alignment and padding of 16 byte int within struct.
+void testPassInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int() {
+  int a0;
+  int a1;
+  int a2;
+  int a3;
+  int a4;
+  int a5;
+  int a6;
+  int a7;
+  double a8;
+  double a9;
+  double a10;
+  double a11;
+  double a12;
+  double a13;
+  double a14;
+  double a15;
+  int a16;
+  int a17;
+  Struct1ByteInt a18 = allocate<Struct1ByteInt>().ref;
+  int a19;
+  int a20;
+  Struct4BytesHomogeneousInt16 a21 =
+      allocate<Struct4BytesHomogeneousInt16>().ref;
+  int a22;
+  int a23;
+  Struct8BytesInt a24 = allocate<Struct8BytesInt>().ref;
+  int a25;
+  int a26;
+  Struct8BytesHomogeneousFloat a27 =
+      allocate<Struct8BytesHomogeneousFloat>().ref;
+  int a28;
+  int a29;
+  Struct8BytesMixed a30 = allocate<Struct8BytesMixed>().ref;
+  int a31;
+  int a32;
+  StructAlignmentInt16 a33 = allocate<StructAlignmentInt16>().ref;
+  int a34;
+  int a35;
+  StructAlignmentInt32 a36 = allocate<StructAlignmentInt32>().ref;
+  int a37;
+  int a38;
+  StructAlignmentInt64 a39 = allocate<StructAlignmentInt64>().ref;
+
+  a0 = -1;
+  a1 = 2;
+  a2 = -3;
+  a3 = 4;
+  a4 = -5;
+  a5 = 6;
+  a6 = -7;
+  a7 = 8;
+  a8 = -9.0;
+  a9 = 10.0;
+  a10 = -11.0;
+  a11 = 12.0;
+  a12 = -13.0;
+  a13 = 14.0;
+  a14 = -15.0;
+  a15 = 16.0;
+  a16 = -17;
+  a17 = 18;
+  a18.a0 = -19;
+  a19 = 20;
+  a20 = -21;
+  a21.a0 = 22;
+  a21.a1 = -23;
+  a22 = 24;
+  a23 = -25;
+  a24.a0 = 26;
+  a24.a1 = -27;
+  a24.a2 = 28;
+  a25 = -29;
+  a26 = 30;
+  a27.a0 = -31.0;
+  a27.a1 = 32.0;
+  a28 = -33;
+  a29 = 34;
+  a30.a0 = -35.0;
+  a30.a1 = 36;
+  a30.a2 = -37;
+  a31 = 38;
+  a32 = -39;
+  a33.a0 = 40;
+  a33.a1 = -41;
+  a33.a2 = 42;
+  a34 = -43;
+  a35 = 44;
+  a36.a0 = -45;
+  a36.a1 = 46;
+  a36.a2 = -47;
+  a37 = 48;
+  a38 = -49;
+  a39.a0 = 50;
+  a39.a1 = -51;
+  a39.a2 = 52;
+
+  final result = passInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int(
+      a0,
+      a1,
+      a2,
+      a3,
+      a4,
+      a5,
+      a6,
+      a7,
+      a8,
+      a9,
+      a10,
+      a11,
+      a12,
+      a13,
+      a14,
+      a15,
+      a16,
+      a17,
+      a18,
+      a19,
+      a20,
+      a21,
+      a22,
+      a23,
+      a24,
+      a25,
+      a26,
+      a27,
+      a28,
+      a29,
+      a30,
+      a31,
+      a32,
+      a33,
+      a34,
+      a35,
+      a36,
+      a37,
+      a38,
+      a39);
+
+  print("result = $result");
+
+  Expect.approxEquals(26.0, result);
+
+  free(a18.addressOf);
+  free(a21.addressOf);
+  free(a24.addressOf);
+  free(a27.addressOf);
+  free(a30.addressOf);
+  free(a33.addressOf);
+  free(a36.addressOf);
+  free(a39.addressOf);
+}
+
+final passStructAlignmentInt16 = ffiTestFunctions.lookupFunction<
+    Int64 Function(StructAlignmentInt16),
+    int Function(StructAlignmentInt16)>("PassStructAlignmentInt16");
+
+/// Test alignment and padding of 16 byte int within struct.
+void testPassStructAlignmentInt16() {
+  StructAlignmentInt16 a0 = allocate<StructAlignmentInt16>().ref;
+
+  a0.a0 = -1;
+  a0.a1 = 2;
+  a0.a2 = -3;
+
+  final result = passStructAlignmentInt16(a0);
+
+  print("result = $result");
+
+  Expect.equals(-2, result);
+
+  free(a0.addressOf);
+}
+
+final passStructAlignmentInt32 = ffiTestFunctions.lookupFunction<
+    Int64 Function(StructAlignmentInt32),
+    int Function(StructAlignmentInt32)>("PassStructAlignmentInt32");
+
+/// Test alignment and padding of 32 byte int within struct.
+void testPassStructAlignmentInt32() {
+  StructAlignmentInt32 a0 = allocate<StructAlignmentInt32>().ref;
+
+  a0.a0 = -1;
+  a0.a1 = 2;
+  a0.a2 = -3;
+
+  final result = passStructAlignmentInt32(a0);
+
+  print("result = $result");
+
+  Expect.equals(-2, result);
+
+  free(a0.addressOf);
+}
+
+final passStructAlignmentInt64 = ffiTestFunctions.lookupFunction<
+    Int64 Function(StructAlignmentInt64),
+    int Function(StructAlignmentInt64)>("PassStructAlignmentInt64");
+
+/// Test alignment and padding of 64 byte int within struct.
+void testPassStructAlignmentInt64() {
+  StructAlignmentInt64 a0 = allocate<StructAlignmentInt64>().ref;
+
+  a0.a0 = -1;
+  a0.a1 = 2;
+  a0.a2 = -3;
+
+  final result = passStructAlignmentInt64(a0);
+
+  print("result = $result");
+
+  Expect.equals(-2, result);
+
+  free(a0.addressOf);
+}
+
+final returnStruct1ByteInt = ffiTestFunctions.lookupFunction<
+    Struct1ByteInt Function(Int8),
+    Struct1ByteInt Function(int)>("ReturnStruct1ByteInt");
+
+/// Smallest struct with data.
+void testReturnStruct1ByteInt() {
+  int a0;
+
+  a0 = -1;
+
+  final result = returnStruct1ByteInt(a0);
+
+  print("result = $result");
+
+  Expect.equals(a0, result.a0);
+}
+
+final returnStruct3BytesHomogeneousUint8 = ffiTestFunctions.lookupFunction<
+    Struct3BytesHomogeneousUint8 Function(Uint8, Uint8, Uint8),
+    Struct3BytesHomogeneousUint8 Function(
+        int, int, int)>("ReturnStruct3BytesHomogeneousUint8");
+
+/// Smaller than word size return value on all architectures.
+void testReturnStruct3BytesHomogeneousUint8() {
+  int a0;
+  int a1;
+  int a2;
+
+  a0 = 1;
+  a1 = 2;
+  a2 = 3;
+
+  final result = returnStruct3BytesHomogeneousUint8(a0, a1, a2);
+
+  print("result = $result");
+
+  Expect.equals(a0, result.a0);
+  Expect.equals(a1, result.a1);
+  Expect.equals(a2, result.a2);
+}
+
+final returnStruct3BytesInt2ByteAligned = ffiTestFunctions.lookupFunction<
+    Struct3BytesInt2ByteAligned Function(Int16, Int8),
+    Struct3BytesInt2ByteAligned Function(
+        int, int)>("ReturnStruct3BytesInt2ByteAligned");
+
+/// Smaller than word size return value on all architectures.
+/// With alignment rules taken into account size is 4 bytes.
+void testReturnStruct3BytesInt2ByteAligned() {
+  int a0;
+  int a1;
+
+  a0 = -1;
+  a1 = 2;
+
+  final result = returnStruct3BytesInt2ByteAligned(a0, a1);
+
+  print("result = $result");
+
+  Expect.equals(a0, result.a0);
+  Expect.equals(a1, result.a1);
+}
+
+final returnStruct4BytesHomogeneousInt16 = ffiTestFunctions.lookupFunction<
+    Struct4BytesHomogeneousInt16 Function(Int16, Int16),
+    Struct4BytesHomogeneousInt16 Function(
+        int, int)>("ReturnStruct4BytesHomogeneousInt16");
+
+/// Word size return value on 32 bit architectures..
+void testReturnStruct4BytesHomogeneousInt16() {
+  int a0;
+  int a1;
+
+  a0 = -1;
+  a1 = 2;
+
+  final result = returnStruct4BytesHomogeneousInt16(a0, a1);
+
+  print("result = $result");
+
+  Expect.equals(a0, result.a0);
+  Expect.equals(a1, result.a1);
+}
+
+final returnStruct7BytesHomogeneousUint8 = ffiTestFunctions.lookupFunction<
+    Struct7BytesHomogeneousUint8 Function(
+        Uint8, Uint8, Uint8, Uint8, Uint8, Uint8, Uint8),
+    Struct7BytesHomogeneousUint8 Function(int, int, int, int, int, int,
+        int)>("ReturnStruct7BytesHomogeneousUint8");
+
+/// Non-wordsize return value.
+void testReturnStruct7BytesHomogeneousUint8() {
+  int a0;
+  int a1;
+  int a2;
+  int a3;
+  int a4;
+  int a5;
+  int a6;
+
+  a0 = 1;
+  a1 = 2;
+  a2 = 3;
+  a3 = 4;
+  a4 = 5;
+  a5 = 6;
+  a6 = 7;
+
+  final result = returnStruct7BytesHomogeneousUint8(a0, a1, a2, a3, a4, a5, a6);
+
+  print("result = $result");
+
+  Expect.equals(a0, result.a0);
+  Expect.equals(a1, result.a1);
+  Expect.equals(a2, result.a2);
+  Expect.equals(a3, result.a3);
+  Expect.equals(a4, result.a4);
+  Expect.equals(a5, result.a5);
+  Expect.equals(a6, result.a6);
+}
+
+final returnStruct7BytesInt4ByteAligned = ffiTestFunctions.lookupFunction<
+    Struct7BytesInt4ByteAligned Function(Int32, Int16, Int8),
+    Struct7BytesInt4ByteAligned Function(
+        int, int, int)>("ReturnStruct7BytesInt4ByteAligned");
+
+/// Non-wordsize return value.
+/// With alignment rules taken into account size is 8 bytes.
+void testReturnStruct7BytesInt4ByteAligned() {
+  int a0;
+  int a1;
+  int a2;
+
+  a0 = -1;
+  a1 = 2;
+  a2 = -3;
+
+  final result = returnStruct7BytesInt4ByteAligned(a0, a1, a2);
+
+  print("result = $result");
+
+  Expect.equals(a0, result.a0);
+  Expect.equals(a1, result.a1);
+  Expect.equals(a2, result.a2);
+}
+
+final returnStruct8BytesInt = ffiTestFunctions.lookupFunction<
+    Struct8BytesInt Function(Int16, Int16, Int32),
+    Struct8BytesInt Function(int, int, int)>("ReturnStruct8BytesInt");
+
+/// Return value in integer registers on many architectures.
+void testReturnStruct8BytesInt() {
+  int a0;
+  int a1;
+  int a2;
+
+  a0 = -1;
+  a1 = 2;
+  a2 = -3;
+
+  final result = returnStruct8BytesInt(a0, a1, a2);
+
+  print("result = $result");
+
+  Expect.equals(a0, result.a0);
+  Expect.equals(a1, result.a1);
+  Expect.equals(a2, result.a2);
+}
+
+final returnStruct8BytesHomogeneousFloat = ffiTestFunctions.lookupFunction<
+    Struct8BytesHomogeneousFloat Function(Float, Float),
+    Struct8BytesHomogeneousFloat Function(
+        double, double)>("ReturnStruct8BytesHomogeneousFloat");
+
+/// Return value in FP registers on many architectures.
+void testReturnStruct8BytesHomogeneousFloat() {
+  double a0;
+  double a1;
+
+  a0 = -1.0;
+  a1 = 2.0;
+
+  final result = returnStruct8BytesHomogeneousFloat(a0, a1);
+
+  print("result = $result");
+
+  Expect.approxEquals(a0, result.a0);
+  Expect.approxEquals(a1, result.a1);
+}
+
+final returnStruct8BytesMixed = ffiTestFunctions.lookupFunction<
+    Struct8BytesMixed Function(Float, Int16, Int16),
+    Struct8BytesMixed Function(double, int, int)>("ReturnStruct8BytesMixed");
+
+/// Return value split over FP and integer register in x64.
+void testReturnStruct8BytesMixed() {
+  double a0;
+  int a1;
+  int a2;
+
+  a0 = -1.0;
+  a1 = 2;
+  a2 = -3;
+
+  final result = returnStruct8BytesMixed(a0, a1, a2);
+
+  print("result = $result");
+
+  Expect.approxEquals(a0, result.a0);
+  Expect.equals(a1, result.a1);
+  Expect.equals(a2, result.a2);
+}
+
+final returnStruct9BytesHomogeneousUint8 = ffiTestFunctions.lookupFunction<
+    Struct9BytesHomogeneousUint8 Function(
+        Uint8, Uint8, Uint8, Uint8, Uint8, Uint8, Uint8, Uint8, Uint8),
+    Struct9BytesHomogeneousUint8 Function(int, int, int, int, int, int, int,
+        int, int)>("ReturnStruct9BytesHomogeneousUint8");
+
+/// The minimum alignment of this struct is only 1 byte based on its fields.
+/// Test that the memory backing these structs is the right size and that
+/// dart:ffi trampolines do not write outside this size.
+void testReturnStruct9BytesHomogeneousUint8() {
+  int a0;
+  int a1;
+  int a2;
+  int a3;
+  int a4;
+  int a5;
+  int a6;
+  int a7;
+  int a8;
+
+  a0 = 1;
+  a1 = 2;
+  a2 = 3;
+  a3 = 4;
+  a4 = 5;
+  a5 = 6;
+  a6 = 7;
+  a7 = 8;
+  a8 = 9;
+
+  final result =
+      returnStruct9BytesHomogeneousUint8(a0, a1, a2, a3, a4, a5, a6, a7, a8);
+
+  print("result = $result");
+
+  Expect.equals(a0, result.a0);
+  Expect.equals(a1, result.a1);
+  Expect.equals(a2, result.a2);
+  Expect.equals(a3, result.a3);
+  Expect.equals(a4, result.a4);
+  Expect.equals(a5, result.a5);
+  Expect.equals(a6, result.a6);
+  Expect.equals(a7, result.a7);
+  Expect.equals(a8, result.a8);
+}
+
+final returnStruct9BytesInt4Or8ByteAligned = ffiTestFunctions.lookupFunction<
+    Struct9BytesInt4Or8ByteAligned Function(Int64, Int8),
+    Struct9BytesInt4Or8ByteAligned Function(
+        int, int)>("ReturnStruct9BytesInt4Or8ByteAligned");
+
+/// Return value in two integer registers on x64.
+/// With alignment rules taken into account size is 12 or 16 bytes.
+void testReturnStruct9BytesInt4Or8ByteAligned() {
+  int a0;
+  int a1;
+
+  a0 = -1;
+  a1 = 2;
+
+  final result = returnStruct9BytesInt4Or8ByteAligned(a0, a1);
+
+  print("result = $result");
+
+  Expect.equals(a0, result.a0);
+  Expect.equals(a1, result.a1);
+}
+
+final returnStruct12BytesHomogeneousFloat = ffiTestFunctions.lookupFunction<
+    Struct12BytesHomogeneousFloat Function(Float, Float, Float),
+    Struct12BytesHomogeneousFloat Function(
+        double, double, double)>("ReturnStruct12BytesHomogeneousFloat");
+
+/// Return value in FPU registers, but does not use all registers on arm hardfp
+/// and arm64.
+void testReturnStruct12BytesHomogeneousFloat() {
+  double a0;
+  double a1;
+  double a2;
+
+  a0 = -1.0;
+  a1 = 2.0;
+  a2 = -3.0;
+
+  final result = returnStruct12BytesHomogeneousFloat(a0, a1, a2);
+
+  print("result = $result");
+
+  Expect.approxEquals(a0, result.a0);
+  Expect.approxEquals(a1, result.a1);
+  Expect.approxEquals(a2, result.a2);
+}
+
+final returnStruct16BytesHomogeneousFloat = ffiTestFunctions.lookupFunction<
+    Struct16BytesHomogeneousFloat Function(Float, Float, Float, Float),
+    Struct16BytesHomogeneousFloat Function(
+        double, double, double, double)>("ReturnStruct16BytesHomogeneousFloat");
+
+/// Return value in FPU registers on arm hardfp and arm64.
+void testReturnStruct16BytesHomogeneousFloat() {
+  double a0;
+  double a1;
+  double a2;
+  double a3;
+
+  a0 = -1.0;
+  a1 = 2.0;
+  a2 = -3.0;
+  a3 = 4.0;
+
+  final result = returnStruct16BytesHomogeneousFloat(a0, a1, a2, a3);
+
+  print("result = $result");
+
+  Expect.approxEquals(a0, result.a0);
+  Expect.approxEquals(a1, result.a1);
+  Expect.approxEquals(a2, result.a2);
+  Expect.approxEquals(a3, result.a3);
+}
+
+final returnStruct16BytesMixed = ffiTestFunctions.lookupFunction<
+    Struct16BytesMixed Function(Double, Int64),
+    Struct16BytesMixed Function(double, int)>("ReturnStruct16BytesMixed");
+
+/// Return value split over FP and integer register in x64.
+void testReturnStruct16BytesMixed() {
+  double a0;
+  int a1;
+
+  a0 = -1.0;
+  a1 = 2;
+
+  final result = returnStruct16BytesMixed(a0, a1);
+
+  print("result = $result");
+
+  Expect.approxEquals(a0, result.a0);
+  Expect.equals(a1, result.a1);
+}
+
+final returnStruct16BytesMixed2 = ffiTestFunctions.lookupFunction<
+    Struct16BytesMixed2 Function(Float, Float, Float, Int32),
+    Struct16BytesMixed2 Function(
+        double, double, double, int)>("ReturnStruct16BytesMixed2");
+
+/// Return value split over FP and integer register in x64.
+/// The integer register contains half float half int.
+void testReturnStruct16BytesMixed2() {
+  double a0;
+  double a1;
+  double a2;
+  int a3;
+
+  a0 = -1.0;
+  a1 = 2.0;
+  a2 = -3.0;
+  a3 = 4;
+
+  final result = returnStruct16BytesMixed2(a0, a1, a2, a3);
+
+  print("result = $result");
+
+  Expect.approxEquals(a0, result.a0);
+  Expect.approxEquals(a1, result.a1);
+  Expect.approxEquals(a2, result.a2);
+  Expect.equals(a3, result.a3);
+}
+
+final returnStruct17BytesInt = ffiTestFunctions.lookupFunction<
+    Struct17BytesInt Function(Int64, Int64, Int8),
+    Struct17BytesInt Function(int, int, int)>("ReturnStruct17BytesInt");
+
+/// Rerturn value returned in preallocated space passed by pointer on most ABIs.
+/// Is non word size on purpose, to test that structs are rounded up to word size
+/// on all ABIs.
+void testReturnStruct17BytesInt() {
+  int a0;
+  int a1;
+  int a2;
+
+  a0 = -1;
+  a1 = 2;
+  a2 = -3;
+
+  final result = returnStruct17BytesInt(a0, a1, a2);
+
+  print("result = $result");
+
+  Expect.equals(a0, result.a0);
+  Expect.equals(a1, result.a1);
+  Expect.equals(a2, result.a2);
+}
+
+final returnStruct19BytesHomogeneousUint8 = ffiTestFunctions.lookupFunction<
+    Struct19BytesHomogeneousUint8 Function(
+        Uint8,
+        Uint8,
+        Uint8,
+        Uint8,
+        Uint8,
+        Uint8,
+        Uint8,
+        Uint8,
+        Uint8,
+        Uint8,
+        Uint8,
+        Uint8,
+        Uint8,
+        Uint8,
+        Uint8,
+        Uint8,
+        Uint8,
+        Uint8,
+        Uint8),
+    Struct19BytesHomogeneousUint8 Function(
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int)>("ReturnStruct19BytesHomogeneousUint8");
+
+/// The minimum alignment of this struct is only 1 byte based on its fields.
+/// Test that the memory backing these structs is the right size and that
+/// dart:ffi trampolines do not write outside this size.
+void testReturnStruct19BytesHomogeneousUint8() {
+  int a0;
+  int a1;
+  int a2;
+  int a3;
+  int a4;
+  int a5;
+  int a6;
+  int a7;
+  int a8;
+  int a9;
+  int a10;
+  int a11;
+  int a12;
+  int a13;
+  int a14;
+  int a15;
+  int a16;
+  int a17;
+  int a18;
+
+  a0 = 1;
+  a1 = 2;
+  a2 = 3;
+  a3 = 4;
+  a4 = 5;
+  a5 = 6;
+  a6 = 7;
+  a7 = 8;
+  a8 = 9;
+  a9 = 10;
+  a10 = 11;
+  a11 = 12;
+  a12 = 13;
+  a13 = 14;
+  a14 = 15;
+  a15 = 16;
+  a16 = 17;
+  a17 = 18;
+  a18 = 19;
+
+  final result = returnStruct19BytesHomogeneousUint8(a0, a1, a2, a3, a4, a5, a6,
+      a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18);
+
+  print("result = $result");
+
+  Expect.equals(a0, result.a0);
+  Expect.equals(a1, result.a1);
+  Expect.equals(a2, result.a2);
+  Expect.equals(a3, result.a3);
+  Expect.equals(a4, result.a4);
+  Expect.equals(a5, result.a5);
+  Expect.equals(a6, result.a6);
+  Expect.equals(a7, result.a7);
+  Expect.equals(a8, result.a8);
+  Expect.equals(a9, result.a9);
+  Expect.equals(a10, result.a10);
+  Expect.equals(a11, result.a11);
+  Expect.equals(a12, result.a12);
+  Expect.equals(a13, result.a13);
+  Expect.equals(a14, result.a14);
+  Expect.equals(a15, result.a15);
+  Expect.equals(a16, result.a16);
+  Expect.equals(a17, result.a17);
+  Expect.equals(a18, result.a18);
+}
+
+final returnStruct20BytesHomogeneousInt32 = ffiTestFunctions.lookupFunction<
+    Struct20BytesHomogeneousInt32 Function(Int32, Int32, Int32, Int32, Int32),
+    Struct20BytesHomogeneousInt32 Function(
+        int, int, int, int, int)>("ReturnStruct20BytesHomogeneousInt32");
+
+/// Return value too big to go in cpu registers on arm64.
+void testReturnStruct20BytesHomogeneousInt32() {
+  int a0;
+  int a1;
+  int a2;
+  int a3;
+  int a4;
+
+  a0 = -1;
+  a1 = 2;
+  a2 = -3;
+  a3 = 4;
+  a4 = -5;
+
+  final result = returnStruct20BytesHomogeneousInt32(a0, a1, a2, a3, a4);
+
+  print("result = $result");
+
+  Expect.equals(a0, result.a0);
+  Expect.equals(a1, result.a1);
+  Expect.equals(a2, result.a2);
+  Expect.equals(a3, result.a3);
+  Expect.equals(a4, result.a4);
+}
+
+final returnStruct20BytesHomogeneousFloat = ffiTestFunctions.lookupFunction<
+    Struct20BytesHomogeneousFloat Function(Float, Float, Float, Float, Float),
+    Struct20BytesHomogeneousFloat Function(double, double, double, double,
+        double)>("ReturnStruct20BytesHomogeneousFloat");
+
+/// Return value too big to go in FPU registers on x64, arm hardfp and arm64.
+void testReturnStruct20BytesHomogeneousFloat() {
+  double a0;
+  double a1;
+  double a2;
+  double a3;
+  double a4;
+
+  a0 = -1.0;
+  a1 = 2.0;
+  a2 = -3.0;
+  a3 = 4.0;
+  a4 = -5.0;
+
+  final result = returnStruct20BytesHomogeneousFloat(a0, a1, a2, a3, a4);
+
+  print("result = $result");
+
+  Expect.approxEquals(a0, result.a0);
+  Expect.approxEquals(a1, result.a1);
+  Expect.approxEquals(a2, result.a2);
+  Expect.approxEquals(a3, result.a3);
+  Expect.approxEquals(a4, result.a4);
+}
+
+final returnStruct32BytesHomogeneousDouble = ffiTestFunctions.lookupFunction<
+    Struct32BytesHomogeneousDouble Function(Double, Double, Double, Double),
+    Struct32BytesHomogeneousDouble Function(double, double, double,
+        double)>("ReturnStruct32BytesHomogeneousDouble");
+
+/// Return value in FPU registers on arm64.
+void testReturnStruct32BytesHomogeneousDouble() {
+  double a0;
+  double a1;
+  double a2;
+  double a3;
+
+  a0 = -1.0;
+  a1 = 2.0;
+  a2 = -3.0;
+  a3 = 4.0;
+
+  final result = returnStruct32BytesHomogeneousDouble(a0, a1, a2, a3);
+
+  print("result = $result");
+
+  Expect.approxEquals(a0, result.a0);
+  Expect.approxEquals(a1, result.a1);
+  Expect.approxEquals(a2, result.a2);
+  Expect.approxEquals(a3, result.a3);
+}
+
+final returnStruct40BytesHomogeneousDouble = ffiTestFunctions.lookupFunction<
+    Struct40BytesHomogeneousDouble Function(
+        Double, Double, Double, Double, Double),
+    Struct40BytesHomogeneousDouble Function(double, double, double, double,
+        double)>("ReturnStruct40BytesHomogeneousDouble");
+
+/// Return value too big to go in FPU registers on arm64.
+void testReturnStruct40BytesHomogeneousDouble() {
+  double a0;
+  double a1;
+  double a2;
+  double a3;
+  double a4;
+
+  a0 = -1.0;
+  a1 = 2.0;
+  a2 = -3.0;
+  a3 = 4.0;
+  a4 = -5.0;
+
+  final result = returnStruct40BytesHomogeneousDouble(a0, a1, a2, a3, a4);
+
+  print("result = $result");
+
+  Expect.approxEquals(a0, result.a0);
+  Expect.approxEquals(a1, result.a1);
+  Expect.approxEquals(a2, result.a2);
+  Expect.approxEquals(a3, result.a3);
+  Expect.approxEquals(a4, result.a4);
+}
+
+final returnStruct1024BytesHomogeneousUint64 = ffiTestFunctions.lookupFunction<
+    Struct1024BytesHomogeneousUint64 Function(
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64,
+        Uint64),
+    Struct1024BytesHomogeneousUint64 Function(
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int,
+        int)>("ReturnStruct1024BytesHomogeneousUint64");
+
+/// Test 1kb struct.
+void testReturnStruct1024BytesHomogeneousUint64() {
+  int a0;
+  int a1;
+  int a2;
+  int a3;
+  int a4;
+  int a5;
+  int a6;
+  int a7;
+  int a8;
+  int a9;
+  int a10;
+  int a11;
+  int a12;
+  int a13;
+  int a14;
+  int a15;
+  int a16;
+  int a17;
+  int a18;
+  int a19;
+  int a20;
+  int a21;
+  int a22;
+  int a23;
+  int a24;
+  int a25;
+  int a26;
+  int a27;
+  int a28;
+  int a29;
+  int a30;
+  int a31;
+  int a32;
+  int a33;
+  int a34;
+  int a35;
+  int a36;
+  int a37;
+  int a38;
+  int a39;
+  int a40;
+  int a41;
+  int a42;
+  int a43;
+  int a44;
+  int a45;
+  int a46;
+  int a47;
+  int a48;
+  int a49;
+  int a50;
+  int a51;
+  int a52;
+  int a53;
+  int a54;
+  int a55;
+  int a56;
+  int a57;
+  int a58;
+  int a59;
+  int a60;
+  int a61;
+  int a62;
+  int a63;
+  int a64;
+  int a65;
+  int a66;
+  int a67;
+  int a68;
+  int a69;
+  int a70;
+  int a71;
+  int a72;
+  int a73;
+  int a74;
+  int a75;
+  int a76;
+  int a77;
+  int a78;
+  int a79;
+  int a80;
+  int a81;
+  int a82;
+  int a83;
+  int a84;
+  int a85;
+  int a86;
+  int a87;
+  int a88;
+  int a89;
+  int a90;
+  int a91;
+  int a92;
+  int a93;
+  int a94;
+  int a95;
+  int a96;
+  int a97;
+  int a98;
+  int a99;
+  int a100;
+  int a101;
+  int a102;
+  int a103;
+  int a104;
+  int a105;
+  int a106;
+  int a107;
+  int a108;
+  int a109;
+  int a110;
+  int a111;
+  int a112;
+  int a113;
+  int a114;
+  int a115;
+  int a116;
+  int a117;
+  int a118;
+  int a119;
+  int a120;
+  int a121;
+  int a122;
+  int a123;
+  int a124;
+  int a125;
+  int a126;
+  int a127;
+
+  a0 = 1;
+  a1 = 2;
+  a2 = 3;
+  a3 = 4;
+  a4 = 5;
+  a5 = 6;
+  a6 = 7;
+  a7 = 8;
+  a8 = 9;
+  a9 = 10;
+  a10 = 11;
+  a11 = 12;
+  a12 = 13;
+  a13 = 14;
+  a14 = 15;
+  a15 = 16;
+  a16 = 17;
+  a17 = 18;
+  a18 = 19;
+  a19 = 20;
+  a20 = 21;
+  a21 = 22;
+  a22 = 23;
+  a23 = 24;
+  a24 = 25;
+  a25 = 26;
+  a26 = 27;
+  a27 = 28;
+  a28 = 29;
+  a29 = 30;
+  a30 = 31;
+  a31 = 32;
+  a32 = 33;
+  a33 = 34;
+  a34 = 35;
+  a35 = 36;
+  a36 = 37;
+  a37 = 38;
+  a38 = 39;
+  a39 = 40;
+  a40 = 41;
+  a41 = 42;
+  a42 = 43;
+  a43 = 44;
+  a44 = 45;
+  a45 = 46;
+  a46 = 47;
+  a47 = 48;
+  a48 = 49;
+  a49 = 50;
+  a50 = 51;
+  a51 = 52;
+  a52 = 53;
+  a53 = 54;
+  a54 = 55;
+  a55 = 56;
+  a56 = 57;
+  a57 = 58;
+  a58 = 59;
+  a59 = 60;
+  a60 = 61;
+  a61 = 62;
+  a62 = 63;
+  a63 = 64;
+  a64 = 65;
+  a65 = 66;
+  a66 = 67;
+  a67 = 68;
+  a68 = 69;
+  a69 = 70;
+  a70 = 71;
+  a71 = 72;
+  a72 = 73;
+  a73 = 74;
+  a74 = 75;
+  a75 = 76;
+  a76 = 77;
+  a77 = 78;
+  a78 = 79;
+  a79 = 80;
+  a80 = 81;
+  a81 = 82;
+  a82 = 83;
+  a83 = 84;
+  a84 = 85;
+  a85 = 86;
+  a86 = 87;
+  a87 = 88;
+  a88 = 89;
+  a89 = 90;
+  a90 = 91;
+  a91 = 92;
+  a92 = 93;
+  a93 = 94;
+  a94 = 95;
+  a95 = 96;
+  a96 = 97;
+  a97 = 98;
+  a98 = 99;
+  a99 = 100;
+  a100 = 101;
+  a101 = 102;
+  a102 = 103;
+  a103 = 104;
+  a104 = 105;
+  a105 = 106;
+  a106 = 107;
+  a107 = 108;
+  a108 = 109;
+  a109 = 110;
+  a110 = 111;
+  a111 = 112;
+  a112 = 113;
+  a113 = 114;
+  a114 = 115;
+  a115 = 116;
+  a116 = 117;
+  a117 = 118;
+  a118 = 119;
+  a119 = 120;
+  a120 = 121;
+  a121 = 122;
+  a122 = 123;
+  a123 = 124;
+  a124 = 125;
+  a125 = 126;
+  a126 = 127;
+  a127 = 128;
+
+  final result = returnStruct1024BytesHomogeneousUint64(
+      a0,
+      a1,
+      a2,
+      a3,
+      a4,
+      a5,
+      a6,
+      a7,
+      a8,
+      a9,
+      a10,
+      a11,
+      a12,
+      a13,
+      a14,
+      a15,
+      a16,
+      a17,
+      a18,
+      a19,
+      a20,
+      a21,
+      a22,
+      a23,
+      a24,
+      a25,
+      a26,
+      a27,
+      a28,
+      a29,
+      a30,
+      a31,
+      a32,
+      a33,
+      a34,
+      a35,
+      a36,
+      a37,
+      a38,
+      a39,
+      a40,
+      a41,
+      a42,
+      a43,
+      a44,
+      a45,
+      a46,
+      a47,
+      a48,
+      a49,
+      a50,
+      a51,
+      a52,
+      a53,
+      a54,
+      a55,
+      a56,
+      a57,
+      a58,
+      a59,
+      a60,
+      a61,
+      a62,
+      a63,
+      a64,
+      a65,
+      a66,
+      a67,
+      a68,
+      a69,
+      a70,
+      a71,
+      a72,
+      a73,
+      a74,
+      a75,
+      a76,
+      a77,
+      a78,
+      a79,
+      a80,
+      a81,
+      a82,
+      a83,
+      a84,
+      a85,
+      a86,
+      a87,
+      a88,
+      a89,
+      a90,
+      a91,
+      a92,
+      a93,
+      a94,
+      a95,
+      a96,
+      a97,
+      a98,
+      a99,
+      a100,
+      a101,
+      a102,
+      a103,
+      a104,
+      a105,
+      a106,
+      a107,
+      a108,
+      a109,
+      a110,
+      a111,
+      a112,
+      a113,
+      a114,
+      a115,
+      a116,
+      a117,
+      a118,
+      a119,
+      a120,
+      a121,
+      a122,
+      a123,
+      a124,
+      a125,
+      a126,
+      a127);
+
+  print("result = $result");
+
+  Expect.equals(a0, result.a0);
+  Expect.equals(a1, result.a1);
+  Expect.equals(a2, result.a2);
+  Expect.equals(a3, result.a3);
+  Expect.equals(a4, result.a4);
+  Expect.equals(a5, result.a5);
+  Expect.equals(a6, result.a6);
+  Expect.equals(a7, result.a7);
+  Expect.equals(a8, result.a8);
+  Expect.equals(a9, result.a9);
+  Expect.equals(a10, result.a10);
+  Expect.equals(a11, result.a11);
+  Expect.equals(a12, result.a12);
+  Expect.equals(a13, result.a13);
+  Expect.equals(a14, result.a14);
+  Expect.equals(a15, result.a15);
+  Expect.equals(a16, result.a16);
+  Expect.equals(a17, result.a17);
+  Expect.equals(a18, result.a18);
+  Expect.equals(a19, result.a19);
+  Expect.equals(a20, result.a20);
+  Expect.equals(a21, result.a21);
+  Expect.equals(a22, result.a22);
+  Expect.equals(a23, result.a23);
+  Expect.equals(a24, result.a24);
+  Expect.equals(a25, result.a25);
+  Expect.equals(a26, result.a26);
+  Expect.equals(a27, result.a27);
+  Expect.equals(a28, result.a28);
+  Expect.equals(a29, result.a29);
+  Expect.equals(a30, result.a30);
+  Expect.equals(a31, result.a31);
+  Expect.equals(a32, result.a32);
+  Expect.equals(a33, result.a33);
+  Expect.equals(a34, result.a34);
+  Expect.equals(a35, result.a35);
+  Expect.equals(a36, result.a36);
+  Expect.equals(a37, result.a37);
+  Expect.equals(a38, result.a38);
+  Expect.equals(a39, result.a39);
+  Expect.equals(a40, result.a40);
+  Expect.equals(a41, result.a41);
+  Expect.equals(a42, result.a42);
+  Expect.equals(a43, result.a43);
+  Expect.equals(a44, result.a44);
+  Expect.equals(a45, result.a45);
+  Expect.equals(a46, result.a46);
+  Expect.equals(a47, result.a47);
+  Expect.equals(a48, result.a48);
+  Expect.equals(a49, result.a49);
+  Expect.equals(a50, result.a50);
+  Expect.equals(a51, result.a51);
+  Expect.equals(a52, result.a52);
+  Expect.equals(a53, result.a53);
+  Expect.equals(a54, result.a54);
+  Expect.equals(a55, result.a55);
+  Expect.equals(a56, result.a56);
+  Expect.equals(a57, result.a57);
+  Expect.equals(a58, result.a58);
+  Expect.equals(a59, result.a59);
+  Expect.equals(a60, result.a60);
+  Expect.equals(a61, result.a61);
+  Expect.equals(a62, result.a62);
+  Expect.equals(a63, result.a63);
+  Expect.equals(a64, result.a64);
+  Expect.equals(a65, result.a65);
+  Expect.equals(a66, result.a66);
+  Expect.equals(a67, result.a67);
+  Expect.equals(a68, result.a68);
+  Expect.equals(a69, result.a69);
+  Expect.equals(a70, result.a70);
+  Expect.equals(a71, result.a71);
+  Expect.equals(a72, result.a72);
+  Expect.equals(a73, result.a73);
+  Expect.equals(a74, result.a74);
+  Expect.equals(a75, result.a75);
+  Expect.equals(a76, result.a76);
+  Expect.equals(a77, result.a77);
+  Expect.equals(a78, result.a78);
+  Expect.equals(a79, result.a79);
+  Expect.equals(a80, result.a80);
+  Expect.equals(a81, result.a81);
+  Expect.equals(a82, result.a82);
+  Expect.equals(a83, result.a83);
+  Expect.equals(a84, result.a84);
+  Expect.equals(a85, result.a85);
+  Expect.equals(a86, result.a86);
+  Expect.equals(a87, result.a87);
+  Expect.equals(a88, result.a88);
+  Expect.equals(a89, result.a89);
+  Expect.equals(a90, result.a90);
+  Expect.equals(a91, result.a91);
+  Expect.equals(a92, result.a92);
+  Expect.equals(a93, result.a93);
+  Expect.equals(a94, result.a94);
+  Expect.equals(a95, result.a95);
+  Expect.equals(a96, result.a96);
+  Expect.equals(a97, result.a97);
+  Expect.equals(a98, result.a98);
+  Expect.equals(a99, result.a99);
+  Expect.equals(a100, result.a100);
+  Expect.equals(a101, result.a101);
+  Expect.equals(a102, result.a102);
+  Expect.equals(a103, result.a103);
+  Expect.equals(a104, result.a104);
+  Expect.equals(a105, result.a105);
+  Expect.equals(a106, result.a106);
+  Expect.equals(a107, result.a107);
+  Expect.equals(a108, result.a108);
+  Expect.equals(a109, result.a109);
+  Expect.equals(a110, result.a110);
+  Expect.equals(a111, result.a111);
+  Expect.equals(a112, result.a112);
+  Expect.equals(a113, result.a113);
+  Expect.equals(a114, result.a114);
+  Expect.equals(a115, result.a115);
+  Expect.equals(a116, result.a116);
+  Expect.equals(a117, result.a117);
+  Expect.equals(a118, result.a118);
+  Expect.equals(a119, result.a119);
+  Expect.equals(a120, result.a120);
+  Expect.equals(a121, result.a121);
+  Expect.equals(a122, result.a122);
+  Expect.equals(a123, result.a123);
+  Expect.equals(a124, result.a124);
+  Expect.equals(a125, result.a125);
+  Expect.equals(a126, result.a126);
+  Expect.equals(a127, result.a127);
+}
+
+final returnStructArgumentStruct1ByteInt = ffiTestFunctions.lookupFunction<
+    Struct1ByteInt Function(Struct1ByteInt),
+    Struct1ByteInt Function(
+        Struct1ByteInt)>("ReturnStructArgumentStruct1ByteInt");
+
+/// Test that a struct passed in as argument can be returned.
+/// Especially for ffi callbacks.
+/// Struct is passed in int registers in most ABIs.
+void testReturnStructArgumentStruct1ByteInt() {
+  Struct1ByteInt a0 = allocate<Struct1ByteInt>().ref;
+
+  a0.a0 = -1;
+
+  final result = returnStructArgumentStruct1ByteInt(a0);
+
+  print("result = $result");
+
+  Expect.equals(a0.a0, result.a0);
+
+  free(a0.addressOf);
+}
+
+final returnStructArgumentInt32x8Struct1ByteInt =
+    ffiTestFunctions.lookupFunction<
+        Struct1ByteInt Function(Int32, Int32, Int32, Int32, Int32, Int32, Int32,
+            Int32, Struct1ByteInt),
+        Struct1ByteInt Function(int, int, int, int, int, int, int, int,
+            Struct1ByteInt)>("ReturnStructArgumentInt32x8Struct1ByteInt");
+
+/// Test that a struct passed in as argument can be returned.
+/// Especially for ffi callbacks.
+/// Struct is passed on stack on all ABIs.
+void testReturnStructArgumentInt32x8Struct1ByteInt() {
+  int a0;
+  int a1;
+  int a2;
+  int a3;
+  int a4;
+  int a5;
+  int a6;
+  int a7;
+  Struct1ByteInt a8 = allocate<Struct1ByteInt>().ref;
+
+  a0 = -1;
+  a1 = 2;
+  a2 = -3;
+  a3 = 4;
+  a4 = -5;
+  a5 = 6;
+  a6 = -7;
+  a7 = 8;
+  a8.a0 = -9;
+
+  final result = returnStructArgumentInt32x8Struct1ByteInt(
+      a0, a1, a2, a3, a4, a5, a6, a7, a8);
+
+  print("result = $result");
+
+  Expect.equals(a8.a0, result.a0);
+
+  free(a8.addressOf);
+}
+
+final returnStructArgumentStruct8BytesHomogeneousFloat =
+    ffiTestFunctions.lookupFunction<
+            Struct8BytesHomogeneousFloat Function(Struct8BytesHomogeneousFloat),
+            Struct8BytesHomogeneousFloat Function(
+                Struct8BytesHomogeneousFloat)>(
+        "ReturnStructArgumentStruct8BytesHomogeneousFloat");
+
+/// Test that a struct passed in as argument can be returned.
+/// Especially for ffi callbacks.
+/// Struct is passed in float registers in most ABIs.
+void testReturnStructArgumentStruct8BytesHomogeneousFloat() {
+  Struct8BytesHomogeneousFloat a0 =
+      allocate<Struct8BytesHomogeneousFloat>().ref;
+
+  a0.a0 = -1.0;
+  a0.a1 = 2.0;
+
+  final result = returnStructArgumentStruct8BytesHomogeneousFloat(a0);
+
+  print("result = $result");
+
+  Expect.approxEquals(a0.a0, result.a0);
+  Expect.approxEquals(a0.a1, result.a1);
+
+  free(a0.addressOf);
+}
+
+final returnStructArgumentStruct20BytesHomogeneousInt32 =
+    ffiTestFunctions
+        .lookupFunction<
+                Struct20BytesHomogeneousInt32 Function(
+                    Struct20BytesHomogeneousInt32),
+                Struct20BytesHomogeneousInt32 Function(
+                    Struct20BytesHomogeneousInt32)>(
+            "ReturnStructArgumentStruct20BytesHomogeneousInt32");
+
+/// On arm64, both argument and return value are passed in by pointer.
+void testReturnStructArgumentStruct20BytesHomogeneousInt32() {
+  Struct20BytesHomogeneousInt32 a0 =
+      allocate<Struct20BytesHomogeneousInt32>().ref;
+
+  a0.a0 = -1;
+  a0.a1 = 2;
+  a0.a2 = -3;
+  a0.a3 = 4;
+  a0.a4 = -5;
+
+  final result = returnStructArgumentStruct20BytesHomogeneousInt32(a0);
+
+  print("result = $result");
+
+  Expect.equals(a0.a0, result.a0);
+  Expect.equals(a0.a1, result.a1);
+  Expect.equals(a0.a2, result.a2);
+  Expect.equals(a0.a3, result.a3);
+  Expect.equals(a0.a4, result.a4);
+
+  free(a0.addressOf);
+}
+
+final returnStructArgumentInt32x8Struct20BytesHomogeneou =
+    ffiTestFunctions.lookupFunction<
+            Struct20BytesHomogeneousInt32 Function(Int32, Int32, Int32, Int32,
+                Int32, Int32, Int32, Int32, Struct20BytesHomogeneousInt32),
+            Struct20BytesHomogeneousInt32 Function(int, int, int, int, int, int,
+                int, int, Struct20BytesHomogeneousInt32)>(
+        "ReturnStructArgumentInt32x8Struct20BytesHomogeneou");
+
+/// On arm64, both argument and return value are passed in by pointer.
+/// Ints exhaust registers, so that pointer is passed on stack.
+void testReturnStructArgumentInt32x8Struct20BytesHomogeneou() {
+  int a0;
+  int a1;
+  int a2;
+  int a3;
+  int a4;
+  int a5;
+  int a6;
+  int a7;
+  Struct20BytesHomogeneousInt32 a8 =
+      allocate<Struct20BytesHomogeneousInt32>().ref;
+
+  a0 = -1;
+  a1 = 2;
+  a2 = -3;
+  a3 = 4;
+  a4 = -5;
+  a5 = 6;
+  a6 = -7;
+  a7 = 8;
+  a8.a0 = -9;
+  a8.a1 = 10;
+  a8.a2 = -11;
+  a8.a3 = 12;
+  a8.a4 = -13;
+
+  final result = returnStructArgumentInt32x8Struct20BytesHomogeneou(
+      a0, a1, a2, a3, a4, a5, a6, a7, a8);
+
+  print("result = $result");
+
+  Expect.equals(a8.a0, result.a0);
+  Expect.equals(a8.a1, result.a1);
+  Expect.equals(a8.a2, result.a2);
+  Expect.equals(a8.a3, result.a3);
+  Expect.equals(a8.a4, result.a4);
+
+  free(a8.addressOf);
+}
+
+final returnStructAlignmentInt16 = ffiTestFunctions.lookupFunction<
+    StructAlignmentInt16 Function(Int8, Int16, Int8),
+    StructAlignmentInt16 Function(int, int, int)>("ReturnStructAlignmentInt16");
+
+/// Test alignment and padding of 16 byte int within struct.
+void testReturnStructAlignmentInt16() {
+  int a0;
+  int a1;
+  int a2;
+
+  a0 = -1;
+  a1 = 2;
+  a2 = -3;
+
+  final result = returnStructAlignmentInt16(a0, a1, a2);
+
+  print("result = $result");
+
+  Expect.equals(a0, result.a0);
+  Expect.equals(a1, result.a1);
+  Expect.equals(a2, result.a2);
+}
+
+final returnStructAlignmentInt32 = ffiTestFunctions.lookupFunction<
+    StructAlignmentInt32 Function(Int8, Int32, Int8),
+    StructAlignmentInt32 Function(int, int, int)>("ReturnStructAlignmentInt32");
+
+/// Test alignment and padding of 32 byte int within struct.
+void testReturnStructAlignmentInt32() {
+  int a0;
+  int a1;
+  int a2;
+
+  a0 = -1;
+  a1 = 2;
+  a2 = -3;
+
+  final result = returnStructAlignmentInt32(a0, a1, a2);
+
+  print("result = $result");
+
+  Expect.equals(a0, result.a0);
+  Expect.equals(a1, result.a1);
+  Expect.equals(a2, result.a2);
+}
+
+final returnStructAlignmentInt64 = ffiTestFunctions.lookupFunction<
+    StructAlignmentInt64 Function(Int8, Int64, Int8),
+    StructAlignmentInt64 Function(int, int, int)>("ReturnStructAlignmentInt64");
+
+/// Test alignment and padding of 64 byte int within struct.
+void testReturnStructAlignmentInt64() {
+  int a0;
+  int a1;
+  int a2;
+
+  a0 = -1;
+  a1 = 2;
+  a2 = -3;
+
+  final result = returnStructAlignmentInt64(a0, a1, a2);
+
+  print("result = $result");
+
+  Expect.equals(a0, result.a0);
+  Expect.equals(a1, result.a1);
+  Expect.equals(a2, result.a2);
+}
diff --git a/tests/ffi_2/generator/c_types.dart b/tests/ffi_2/generator/c_types.dart
new file mode 100644
index 0000000..f2948fa
--- /dev/null
+++ b/tests/ffi_2/generator/c_types.dart
@@ -0,0 +1,299 @@
+// Copyright (c) 2020, 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 'utils.dart';
+
+const int8 = FundamentalType(PrimitiveType.int8);
+const int16 = FundamentalType(PrimitiveType.int16);
+const int32 = FundamentalType(PrimitiveType.int32);
+const int64 = FundamentalType(PrimitiveType.int64);
+const uint8 = FundamentalType(PrimitiveType.uint8);
+const uint16 = FundamentalType(PrimitiveType.uint16);
+const uint32 = FundamentalType(PrimitiveType.uint32);
+const uint64 = FundamentalType(PrimitiveType.uint64);
+const intptr = FundamentalType(PrimitiveType.intptr);
+const float = FundamentalType(PrimitiveType.float);
+const double_ = FundamentalType(PrimitiveType.double_);
+
+enum PrimitiveType {
+  int8,
+  int16,
+  int32,
+  int64,
+  uint8,
+  uint16,
+  uint32,
+  uint64,
+  intptr,
+  float,
+  double_,
+}
+
+const primitiveNames = [
+  "int8",
+  "int16",
+  "int32",
+  "int64",
+  "uint8",
+  "uint16",
+  "uint32",
+  "uint64",
+  "intptr",
+  "float",
+  "double",
+];
+
+const intptrSize = -1;
+const primitiveSizesInBytes = [1, 2, 4, 8, 1, 2, 4, 8, intptrSize, 4, 8];
+
+abstract class CType {
+  String get cType;
+  String get dartCType;
+  String get dartType;
+  String get dartStructFieldAnnotation;
+
+  /// Has a known [size] that is the same for all architectures.
+  bool get hasSize;
+
+  /// Get a size in bytes that is the same on all architectures.
+  int get size;
+
+  String toString() => dartCType;
+
+  const CType();
+}
+
+class FundamentalType extends CType {
+  final PrimitiveType primitive;
+
+  const FundamentalType(this.primitive);
+
+  bool get isFloatingPoint =>
+      primitive == PrimitiveType.float || primitive == PrimitiveType.double_;
+  bool get isInteger => !isFloatingPoint;
+  bool get isUnsigned =>
+      primitive == PrimitiveType.uint8 ||
+      primitive == PrimitiveType.uint16 ||
+      primitive == PrimitiveType.uint32 ||
+      primitive == PrimitiveType.uint64;
+  bool get isSigned => !isUnsigned;
+
+  String get name => primitiveNames[primitive.index];
+
+  String get cType => "${name}${isInteger ? "_t" : ""}";
+  String get dartCType => name.upperCaseFirst();
+  String get dartType => isInteger ? "int" : "double";
+  String get dartStructFieldAnnotation => "@${dartCType}()";
+  bool get hasSize => primitive != PrimitiveType.intptr;
+  int get size {
+    if (!hasSize) {
+      throw "Size unknown.";
+    }
+    return primitiveSizesInBytes[primitive.index];
+  }
+}
+
+class PointerType extends CType {
+  final CType pointerTo;
+
+  PointerType(this.pointerTo);
+
+  String get cType => "${pointerTo.cType}*";
+  String get dartCType => "Pointer<${pointerTo.dartCType}>";
+  String get dartType => "Pointer<${pointerTo.dartType}>";
+  String get dartStructFieldAnnotation => "";
+  bool get hasSize => false;
+  int get size => throw "Size unknown";
+}
+
+/// Used to give [StructType] fields and [FunctionType] arguments names.
+class Member {
+  final CType type;
+  final String name;
+
+  Member(this.type, this.name);
+
+  String dartStructField(bool nnbd) {
+    final modifier = nnbd ? "external" : "";
+    return "${type.dartStructFieldAnnotation} $modifier ${type.dartType} $name;";
+  }
+
+  String get cStructField => "${type.cType} $name;";
+
+  String toString() => "$type $name";
+}
+
+List<Member> generateMemberNames(List<CType> memberTypes) {
+  int index = 0;
+  List<Member> result = [];
+  for (final type in memberTypes) {
+    result.add(Member(type, "a$index"));
+    index++;
+  }
+  return result;
+}
+
+class StructType extends CType {
+  final List<Member> members;
+
+  /// To disambiguate same size structs.
+  final String suffix;
+
+  StructType(List<CType> memberTypes)
+      : this.members = generateMemberNames(memberTypes),
+        this.suffix = "";
+  StructType.disambiguate(List<CType> memberTypes, this.suffix)
+      : this.members = generateMemberNames(memberTypes);
+
+  List<CType> get memberTypes => members.map((a) => a.type).toList();
+
+  String get cType => name;
+  String get dartCType => name;
+  String get dartType => name;
+  String get dartStructFieldAnnotation => "";
+
+  bool get hasSize =>
+      !memberTypes.map((e) => e.hasSize).contains(false) && !hasPadding;
+  int get size => memberTypes.fold(0, (int acc, e) => acc + e.size);
+
+  /// Rough approximation, to not redo all ABI logic here.
+  bool get hasPadding =>
+      members.length < 2 ? false : members[0].type.size < members[1].type.size;
+
+  bool get hasNestedStructs =>
+      members.map((e) => e.type is StructType).contains(true);
+
+  /// All members have the same type.
+  bool get isHomogeneous => memberTypes.toSet().length == 1;
+
+  /// All members have a floating point type.
+  bool get isOnlyFloatingPoint => !memberTypes.map((e) {
+        if (e is FundamentalType) {
+          return e.isFloatingPoint;
+        }
+        if (e is StructType) {
+          return e.isOnlyFloatingPoint;
+        }
+      }).contains(false);
+
+  /// All members have a integer type.
+  bool get isOnlyInteger => !memberTypes.map((e) {
+        if (e is FundamentalType) {
+          return e.isInteger;
+        }
+        if (e is StructType) {
+          return e.isOnlyInteger;
+        }
+      }).contains(false);
+
+  bool get isMixed => !isOnlyInteger && !isOnlyFloatingPoint;
+
+  String get name {
+    String result = "Struct";
+    if (hasSize) {
+      result += "${size}Byte" + (size != 1 ? "s" : "");
+    }
+    if (hasNestedStructs) {
+      result += "Nested";
+    }
+    if (members.length == 0) {
+      // No suffix.
+    } else if (hasPadding) {
+      result += "Alignment${memberTypes[1].dartCType}";
+    } else if (isHomogeneous && members.length > 1 && !hasNestedStructs) {
+      result += "Homogeneous${memberTypes.first.dartCType}";
+    } else if (isOnlyFloatingPoint) {
+      result += "Float";
+    } else if (isOnlyInteger) {
+      result += "Int";
+    } else {
+      result += "Mixed";
+    }
+    result += suffix;
+    return result;
+  }
+}
+
+class FunctionType extends CType {
+  final List<Member> arguments;
+  final CType returnValue;
+  final String reason;
+
+  List<CType> get argumentTypes => arguments.map((a) => a.type).toList();
+
+  FunctionType(List<CType> argumentTypes, this.returnValue, this.reason)
+      : this.arguments = generateMemberNames(argumentTypes);
+
+  String get cType =>
+      throw "Are not represented without function or variable name in C.";
+
+  String get dartCType {
+    final argumentsDartCType = argumentTypes.map((e) => e.dartCType).join(", ");
+    return "${returnValue.dartCType} Function($argumentsDartCType)";
+  }
+
+  String get dartType {
+    final argumentsDartType = argumentTypes.map((e) => e.dartType).join(", ");
+    return "${returnValue.dartType} Function($argumentsDartType)";
+  }
+
+  String get dartStructFieldAnnotation => throw "No nested function pointers.";
+
+  bool get hasSize => false;
+  int get size => throw "Unknown size.";
+
+  /// Group consecutive [arguments] by same type.
+  ///
+  /// Used for naming.
+  List<List<Member>> get argumentsGrouped {
+    List<List<Member>> result = [];
+    for (final a in arguments) {
+      if (result.isEmpty) {
+        result.add([a]);
+      } else if (result.last.first.type.dartCType == a.type.dartCType) {
+        result.last.add(a);
+      } else {
+        result.add([a]);
+      }
+    }
+    return result;
+  }
+
+  /// A suitable name based on the signature.
+  String get cName {
+    String result = "";
+    if (arguments.containsStructs && returnValue is FundamentalType) {
+      result = "Pass";
+    } else if (returnValue is StructType &&
+        argumentTypes.contains(returnValue)) {
+      result = "ReturnStructArgument";
+    } else if (returnValue is StructType) {
+      if (arguments.length == (returnValue as StructType).members.length) {
+        return "Return${returnValue.dartCType}";
+      }
+    } else {
+      result = "Uncategorized";
+    }
+
+    for (final group in argumentsGrouped) {
+      result += group.first.type.dartCType;
+      if (group.length > 1) {
+        result += "x${group.length}";
+      }
+    }
+    return result.limitTo(50);
+  }
+
+  String get dartTestName => "test$cName";
+
+  String get dartName => cName.lowerCaseFirst();
+
+  /// Only valid for [TestType.structReturnArgument].
+  Member get structReturnArgument =>
+      arguments.firstWhere((a) => a.type == returnValue);
+}
+
+extension MemberList on List<Member> {
+  bool get containsStructs => map((m) => m.type is StructType).contains(true);
+}
diff --git a/tests/ffi_2/generator/structs_by_value_tests_configuration.dart b/tests/ffi_2/generator/structs_by_value_tests_configuration.dart
new file mode 100644
index 0000000..46f5108
--- /dev/null
+++ b/tests/ffi_2/generator/structs_by_value_tests_configuration.dart
@@ -0,0 +1,446 @@
+// Copyright (c) 2020, 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 'c_types.dart';
+
+final functions = [
+  FunctionType(List.filled(10, struct1byteInt), int64, """
+Smallest struct with data.
+10 struct arguments will exhaust available registers."""),
+  FunctionType(List.filled(10, struct3bytesInt), int64, """
+Not a multiple of word size, not a power of two.
+10 struct arguments will exhaust available registers."""),
+  FunctionType(List.filled(10, struct3bytesInt2), int64, """
+Not a multiple of word size, not a power of two.
+With alignment rules taken into account size is 4 bytes.
+10 struct arguments will exhaust available registers."""),
+  FunctionType(List.filled(10, struct4bytesInt), int64, """
+Exactly word size on 32-bit architectures.
+10 struct arguments will exhaust available registers."""),
+  FunctionType(List.filled(10, struct7bytesInt), int64, """
+Sub word size on 64 bit architectures.
+10 struct arguments will exhaust available registers."""),
+  FunctionType(List.filled(10, struct7bytesInt2), int64, """
+Sub word size on 64 bit architectures.
+With alignment rules taken into account size is 8 bytes.
+10 struct arguments will exhaust available registers."""),
+  FunctionType(List.filled(10, struct8bytesInt), int64, """
+Exactly word size struct on 64bit architectures.
+10 struct arguments will exhaust available registers."""),
+  FunctionType(List.filled(10, struct8bytesFloat), float, """
+Arguments passed in FP registers as long as they fit.
+10 struct arguments will exhaust available registers."""),
+  FunctionType(List.filled(10, struct8BytesMixed), float, """
+On x64, arguments go in int registers because it is not only float.
+10 struct arguments will exhaust available registers."""),
+  FunctionType(List.filled(10, struct9bytesInt), int64, """
+Argument is a single byte over a multiple of word size.
+10 struct arguments will exhaust available registers.
+Struct only has 1-byte aligned fields to test struct alignment itself.
+Tests upper bytes in the integer registers that are partly filled.
+Tests stack alignment of non word size stack arguments."""),
+  FunctionType(List.filled(10, struct9bytesInt2), int64, """
+Argument is a single byte over a multiple of word size.
+With alignment rules taken into account size is 12 or 16 bytes.
+10 struct arguments will exhaust available registers.
+"""),
+  FunctionType(List.filled(6, struct12bytesFloat), float, """
+Arguments in FPU registers on arm hardfp and arm64.
+Struct arguments will exhaust available registers, and leave some empty.
+The last argument is to test whether arguments are backfilled."""),
+  FunctionType(List.filled(5, struct16bytesFloat), float, """
+On Linux x64 argument is transferred on stack because it is over 16 bytes.
+Arguments in FPU registers on arm hardfp and arm64.
+5 struct arguments will exhaust available registers."""),
+  FunctionType(List.filled(10, struct16bytesMixed), double_, """
+On x64, arguments are split over FP and int registers.
+On x64, it will exhaust the integer registers with the 6th argument.
+The rest goes on the stack.
+On arm, arguments are 8 byte aligned."""),
+  FunctionType(List.filled(10, struct16bytesMixed2), float, """
+On x64, arguments are split over FP and int registers.
+On x64, it will exhaust the integer registers with the 6th argument.
+The rest goes on the stack.
+On arm, arguments are 4 byte aligned."""),
+  FunctionType(List.filled(10, struct17bytesInt), int64, """
+Arguments are passed as pointer to copy on arm64.
+Tests that the memory allocated for copies are rounded up to word size."""),
+  FunctionType(List.filled(10, struct19bytesInt), int64, """
+The minimum alignment of this struct is only 1 byte based on its fields.
+Test that the memory backing these structs is extended to the right size.
+"""),
+  FunctionType(List.filled(10, struct20bytesInt), int32, """
+Argument too big to go into integer registers on arm64.
+The arguments are passed as pointers to copies.
+The amount of arguments exhausts the number of integer registers, such that
+pointers to copies are also passed on the stack."""),
+  FunctionType(
+      [struct20bytesFloat],
+      float,
+      """
+Argument too big to go into FPU registers in hardfp and arm64."""),
+  FunctionType(List.filled(5, struct32bytesDouble), double_, """
+Arguments in FPU registers on arm64.
+5 struct arguments will exhaust available registers."""),
+  FunctionType(
+      [struct40bytesDouble],
+      double_,
+      """
+Argument too big to go into FPU registers in arm64."""),
+  FunctionType(
+      [struct1024bytesInt],
+      uint64,
+      """
+Test 1kb struct."""),
+  FunctionType(
+      [
+        float,
+        struct16bytesFloat,
+        float,
+        struct16bytesFloat,
+        float,
+        struct16bytesFloat,
+        float,
+        struct16bytesFloat,
+        float
+      ],
+      float,
+      """
+Tests the alignment of structs in FPU registers and backfilling."""),
+  FunctionType(
+      [
+        float,
+        struct32bytesDouble,
+        float,
+        struct32bytesDouble,
+        float,
+        struct32bytesDouble,
+        float,
+        struct32bytesDouble,
+        float
+      ],
+      double_,
+      """
+Tests the alignment of structs in FPU registers and backfilling."""),
+  FunctionType(
+      [
+        int8,
+        struct16bytesMixed,
+        int8,
+        struct16bytesMixed,
+        int8,
+        struct16bytesMixed,
+        int8,
+        struct16bytesMixed,
+        int8
+      ],
+      double_,
+      """
+Tests the alignment of structs in integers registers and on the stack.
+Arm32 aligns this struct at 8.
+Also, arm32 allocates the second struct partially in registers, partially
+on stack.
+Test backfilling of integer registers."""),
+  FunctionType(
+      [
+        double_,
+        double_,
+        double_,
+        double_,
+        double_,
+        double_,
+        struct16bytesMixed,
+        struct16bytesMixed,
+        struct16bytesMixed,
+        struct16bytesMixed,
+        int32,
+      ],
+      double_,
+      """
+On Linux x64, it will exhaust xmm registers first, after 6 doubles and 2
+structs. The rest of the structs will go on the stack.
+The int will be backfilled into the int register."""),
+  FunctionType(
+      [
+        int32,
+        int32,
+        int32,
+        int32,
+        struct16bytesMixed,
+        struct16bytesMixed,
+        struct16bytesMixed,
+        struct16bytesMixed,
+        double_,
+      ],
+      double_,
+      """
+On Linux x64, it will exhaust int registers first.
+The rest of the structs will go on the stack.
+The double will be backfilled into the xmm register."""),
+  FunctionType(
+      [
+        struct40bytesDouble,
+        struct4bytesInt,
+        struct8bytesFloat,
+      ],
+      double_,
+      """
+On various architectures, first struct is allocated on stack.
+Check that the other two arguments are allocated on registers."""),
+  FunctionType(
+      [
+        // Exhaust integer registers on all architectures
+        int32,
+        int32,
+        int32,
+        int32,
+        int32,
+        int32,
+        int32,
+        int32,
+        // Exhaust floating point registers on all architectures.
+        double_,
+        double_,
+        double_,
+        double_,
+        double_,
+        double_,
+        double_,
+        double_,
+        // Pass all kinds of structs to exercise stack placement behavior.
+        //
+        // For all structs, align stack with int64, then align to 1-byte with
+        // int8, then pass struct.
+        int64,
+        int8,
+        struct1byteInt,
+        int64,
+        int8,
+        struct4bytesInt,
+        int64,
+        int8,
+        struct8bytesInt,
+        int64,
+        int8,
+        struct8bytesFloat,
+        int64,
+        int8,
+        struct8BytesMixed,
+        int64,
+        int8,
+        structAlignmentInt16,
+        int64,
+        int8,
+        structAlignmentInt32,
+        int64,
+        int8,
+        structAlignmentInt64,
+      ],
+      double_,
+      """
+Test alignment and padding of 16 byte int within struct."""),
+  FunctionType(
+      [structAlignmentInt16],
+      int64,
+      """
+Test alignment and padding of 16 byte int within struct."""),
+  FunctionType(
+      [structAlignmentInt32],
+      int64,
+      """
+Test alignment and padding of 32 byte int within struct."""),
+  FunctionType(
+      [structAlignmentInt64],
+      int64,
+      """
+Test alignment and padding of 64 byte int within struct."""),
+  FunctionType(struct1byteInt.memberTypes, struct1byteInt, """
+Smallest struct with data."""),
+  FunctionType(struct3bytesInt.memberTypes, struct3bytesInt, """
+Smaller than word size return value on all architectures."""),
+  FunctionType(struct3bytesInt2.memberTypes, struct3bytesInt2, """
+Smaller than word size return value on all architectures.
+With alignment rules taken into account size is 4 bytes."""),
+  FunctionType(struct4bytesInt.memberTypes, struct4bytesInt, """
+Word size return value on 32 bit architectures.."""),
+  FunctionType(struct7bytesInt.memberTypes, struct7bytesInt, """
+Non-wordsize return value."""),
+  FunctionType(struct7bytesInt2.memberTypes, struct7bytesInt2, """
+Non-wordsize return value.
+With alignment rules taken into account size is 8 bytes."""),
+  FunctionType(struct8bytesInt.memberTypes, struct8bytesInt, """
+Return value in integer registers on many architectures."""),
+  FunctionType(struct8bytesFloat.memberTypes, struct8bytesFloat, """
+Return value in FP registers on many architectures."""),
+  FunctionType(struct8BytesMixed.memberTypes, struct8BytesMixed, """
+Return value split over FP and integer register in x64."""),
+  FunctionType(struct9bytesInt.memberTypes, struct9bytesInt, """
+The minimum alignment of this struct is only 1 byte based on its fields.
+Test that the memory backing these structs is the right size and that
+dart:ffi trampolines do not write outside this size."""),
+  FunctionType(struct9bytesInt2.memberTypes, struct9bytesInt2, """
+Return value in two integer registers on x64.
+With alignment rules taken into account size is 12 or 16 bytes."""),
+  FunctionType(struct12bytesFloat.memberTypes, struct12bytesFloat, """
+Return value in FPU registers, but does not use all registers on arm hardfp
+and arm64."""),
+  FunctionType(struct16bytesFloat.memberTypes, struct16bytesFloat, """
+Return value in FPU registers on arm hardfp and arm64."""),
+  FunctionType(struct16bytesMixed.memberTypes, struct16bytesMixed, """
+Return value split over FP and integer register in x64."""),
+  FunctionType(struct16bytesMixed2.memberTypes, struct16bytesMixed2, """
+Return value split over FP and integer register in x64.
+The integer register contains half float half int."""),
+  FunctionType(struct17bytesInt.memberTypes, struct17bytesInt, """
+Rerturn value returned in preallocated space passed by pointer on most ABIs.
+Is non word size on purpose, to test that structs are rounded up to word size
+on all ABIs."""),
+  FunctionType(struct19bytesInt.memberTypes, struct19bytesInt, """
+The minimum alignment of this struct is only 1 byte based on its fields.
+Test that the memory backing these structs is the right size and that
+dart:ffi trampolines do not write outside this size."""),
+  FunctionType(struct20bytesInt.memberTypes, struct20bytesInt, """
+Return value too big to go in cpu registers on arm64."""),
+  FunctionType(struct20bytesFloat.memberTypes, struct20bytesFloat, """
+Return value too big to go in FPU registers on x64, arm hardfp and arm64."""),
+  FunctionType(struct32bytesDouble.memberTypes, struct32bytesDouble, """
+Return value in FPU registers on arm64."""),
+  FunctionType(struct40bytesDouble.memberTypes, struct40bytesDouble, """
+Return value too big to go in FPU registers on arm64."""),
+  FunctionType(struct1024bytesInt.memberTypes, struct1024bytesInt, """
+Test 1kb struct."""),
+  FunctionType(
+      [struct1byteInt],
+      struct1byteInt,
+      """
+Test that a struct passed in as argument can be returned.
+Especially for ffi callbacks.
+Struct is passed in int registers in most ABIs."""),
+  FunctionType(
+      [int32, int32, int32, int32, int32, int32, int32, int32, struct1byteInt],
+      struct1byteInt,
+      """
+Test that a struct passed in as argument can be returned.
+Especially for ffi callbacks.
+Struct is passed on stack on all ABIs."""),
+  FunctionType(
+      [struct8bytesFloat],
+      struct8bytesFloat,
+      """
+Test that a struct passed in as argument can be returned.
+Especially for ffi callbacks.
+Struct is passed in float registers in most ABIs."""),
+  FunctionType(
+      [struct20bytesInt],
+      struct20bytesInt,
+      """
+On arm64, both argument and return value are passed in by pointer."""),
+  FunctionType(
+      [
+        int32,
+        int32,
+        int32,
+        int32,
+        int32,
+        int32,
+        int32,
+        int32,
+        struct20bytesInt
+      ],
+      struct20bytesInt,
+      """
+On arm64, both argument and return value are passed in by pointer.
+Ints exhaust registers, so that pointer is passed on stack."""),
+  FunctionType(structAlignmentInt16.memberTypes, structAlignmentInt16, """
+Test alignment and padding of 16 byte int within struct."""),
+  FunctionType(structAlignmentInt32.memberTypes, structAlignmentInt32, """
+Test alignment and padding of 32 byte int within struct."""),
+  FunctionType(structAlignmentInt64.memberTypes, structAlignmentInt64, """
+Test alignment and padding of 64 byte int within struct."""),
+];
+
+final structs = [
+  struct0bytes,
+  struct1byteInt,
+  struct3bytesInt,
+  struct3bytesInt2,
+  struct4bytesInt,
+  struct7bytesInt,
+  struct7bytesInt2,
+  struct8bytesInt,
+  struct8bytesFloat,
+  struct8BytesMixed,
+  struct9bytesInt,
+  struct9bytesInt2,
+  struct12bytesFloat,
+  struct16bytesFloat,
+  struct16bytesMixed,
+  struct16bytesMixed2,
+  struct17bytesInt,
+  struct19bytesInt,
+  struct20bytesInt,
+  struct20bytesFloat,
+  struct32bytesDouble,
+  struct40bytesDouble,
+  struct1024bytesInt,
+  structAlignmentInt16,
+  structAlignmentInt32,
+  structAlignmentInt64,
+];
+
+/// Using empty structs is undefined behavior in C.
+final struct0bytes = StructType([]);
+
+final struct1byteInt = StructType([int8]);
+final struct3bytesInt = StructType(List.filled(3, uint8));
+final struct3bytesInt2 = StructType.disambiguate([int16, int8], "2ByteAligned");
+final struct4bytesInt = StructType([int16, int16]);
+final struct7bytesInt = StructType(List.filled(7, uint8));
+final struct7bytesInt2 =
+    StructType.disambiguate([int32, int16, int8], "4ByteAligned");
+final struct8bytesInt = StructType([int16, int16, int32]);
+final struct8bytesFloat = StructType([float, float]);
+final struct8BytesMixed = StructType([float, int16, int16]);
+final struct9bytesInt = StructType(List.filled(9, uint8));
+final struct9bytesInt2 =
+    StructType.disambiguate([int64, int8], "4Or8ByteAligned");
+final struct12bytesFloat = StructType([float, float, float]);
+
+/// The largest homogenous float that goes into FPU registers on softfp and
+/// arm64.
+final struct16bytesFloat = StructType([float, float, float, float]);
+
+/// This struct will be 8 byte aligned on arm.
+final struct16bytesMixed = StructType([double_, int64]);
+
+/// This struct will be 4 byte aligned on arm.
+final struct16bytesMixed2 =
+    StructType.disambiguate([float, float, float, int32], "2");
+
+final struct17bytesInt = StructType([int64, int64, int8]);
+
+/// This struct has only 1 byte field-alignmnent requirements.
+final struct19bytesInt = StructType(List.filled(19, uint8));
+
+/// The first homogenous integer struct that does not go into registers
+/// anymore on arm64.
+final struct20bytesInt = StructType([int32, int32, int32, int32, int32]);
+
+/// The first homogenous float that does not go into FPU registers anymore on
+/// softfp and arm64.
+final struct20bytesFloat = StructType([float, float, float, float, float]);
+
+/// Largest homogenous doubles in arm64 that goes into FPU registers.
+final struct32bytesDouble = StructType([double_, double_, double_, double_]);
+
+/// The first homogenous doubles that does not go into FPU registers anymore on
+/// arm64.
+final struct40bytesDouble =
+    StructType([double_, double_, double_, double_, double_]);
+
+final struct1024bytesInt = StructType(List.filled(128, uint64));
+
+final structAlignmentInt16 = StructType([int8, int16, int8]);
+final structAlignmentInt32 = StructType([int8, int32, int8]);
+final structAlignmentInt64 = StructType([int8, int64, int8]);
diff --git a/tests/ffi_2/generator/structs_by_value_tests_generator.dart b/tests/ffi_2/generator/structs_by_value_tests_generator.dart
new file mode 100644
index 0000000..f3f9f02
--- /dev/null
+++ b/tests/ffi_2/generator/structs_by_value_tests_generator.dart
@@ -0,0 +1,930 @@
+// Copyright (c) 2020, 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';
+
+import 'c_types.dart';
+import 'structs_by_value_tests_configuration.dart';
+import 'utils.dart';
+
+/// The test type determines how to convert the arguments into return values
+/// such that the caller knows what to check.
+enum TestType {
+  /// Tested by getting all the individual fields out of the structs and
+  /// summing their values.
+  structArguments,
+
+  /// Tested by passing assigning the arguments to the struct fields.
+  structReturn,
+
+  /// Tested by returning the struct passed in.
+  structReturnArgument,
+}
+
+extension on FunctionType {
+  TestType get testType {
+    if (arguments.containsStructs && returnValue is FundamentalType) {
+      return TestType.structArguments;
+    }
+    if (returnValue is StructType && argumentTypes.contains(returnValue)) {
+      return TestType.structReturnArgument;
+    }
+    if (returnValue is StructType) {
+      if (arguments.length == (returnValue as StructType).members.length) {
+        return TestType.structReturn;
+      }
+    }
+    throw Exception("Unknown test type: $this");
+  }
+}
+
+/// We use the class structure as an algebraic data type in order to keep the
+/// relevant parts of the code generation closer together.
+extension on CType {
+  /// The part of the cout expression after `std::cout` and before the `;`.
+  String coutExpression(String variableName) {
+    switch (this.runtimeType) {
+      case FundamentalType:
+        if (this == uint8 || this == int8) {
+          return "<< static_cast<int>($variableName)";
+        }
+        return "<< $variableName";
+
+      case StructType:
+        final this_ = this as StructType;
+        return this_.members.coutExpression("$variableName.");
+    }
+
+    throw Exception("Not implemented for ${this.runtimeType}");
+  }
+
+  /// A statement recursively outputting all members.
+  String coutStatement(String variableName) {
+    final coutExpr = this.coutExpression(variableName);
+    return 'std::cout << "$variableName = " $coutExpr << "\\n";';
+  }
+}
+
+extension on List<Member> {
+  /// The part of the cout expression after `std::cout` and before the `;`.
+  String coutExpression([String namePrefix = ""]) {
+    String result = '<< "("';
+    result += this
+        .map((m) => m.type.coutExpression("$namePrefix${m.name}"))
+        .join('<< ", "');
+    result += '<< ")"';
+    return result.trimCouts();
+  }
+}
+
+extension on CType {
+  /// A list of statements adding all members recurisvely to `result`.
+  ///
+  /// Both valid in Dart and C.
+  String addToResultStatements(String variableName) {
+    switch (this.runtimeType) {
+      case FundamentalType:
+        return "result += $variableName;\n";
+
+      case StructType:
+        final this_ = this as StructType;
+        return this_.members.addToResultStatements("$variableName.");
+    }
+
+    throw Exception("Not implemented for ${this.runtimeType}");
+  }
+}
+
+extension on List<Member> {
+  /// A list of statements adding all members recurisvely to `result`.
+  ///
+  /// Both valid in Dart and C.
+  String addToResultStatements([String namePrefix = ""]) {
+    return map((m) => m.type.addToResultStatements("$namePrefix${m.name}"))
+        .join();
+  }
+}
+
+extension on CType {
+  /// A list of statements recursively assigning all members with [a].
+  ///
+  /// Both valid in Dart and C.
+  String assignValueStatements(ArgumentValueAssigner a, String variableName) {
+    switch (this.runtimeType) {
+      case FundamentalType:
+        final this_ = this as FundamentalType;
+        return "$variableName = ${a.nextValue(this_)};\n";
+
+      case StructType:
+        final this_ = this as StructType;
+        return this_.members.assignValueStatements(a, "$variableName.");
+    }
+
+    throw Exception("Not implemented for ${this.runtimeType}");
+  }
+
+  /// A list of statements recursively coping all members from [source].
+  ///
+  /// Both valid in Dart and C.
+  String copyValueStatements(String source, String destination) {
+    switch (this.runtimeType) {
+      case FundamentalType:
+        return "$destination = $source;\n";
+
+      case StructType:
+        final this_ = this as StructType;
+        return this_.members.copyValueStatements("$source.", "$destination.");
+    }
+
+    throw Exception("Not implemented for ${this.runtimeType}");
+  }
+}
+
+extension on List<Member> {
+  /// A list of statements recursively assigning all members with [a].
+  ///
+  /// Both valid in Dart and C.
+  String assignValueStatements(ArgumentValueAssigner a,
+      [String namePrefix = ""]) {
+    return map((m) => m.type.assignValueStatements(a, "$namePrefix${m.name}"))
+        .join();
+  }
+
+  /// A list of statements recursively coping all members from [source].
+  ///
+  /// Both valid in Dart and C.
+  String copyValueStatements([sourcePrefix = "", destinationPrefix = ""]) {
+    return map((m) => m.type.copyValueStatements(
+        "$sourcePrefix${m.name}", "$destinationPrefix${m.name}")).join();
+  }
+}
+
+/// A helper class that assigns values to fundamental types.
+///
+/// Also keeps track of a sum of all values, to be used for testing the result.
+class ArgumentValueAssigner {
+  int i = 1;
+  int sum = 0;
+  String nextValue(FundamentalType type) {
+    int argumentValue = i;
+    i++;
+    if (type.isSigned && i % 2 == 0) {
+      argumentValue = -argumentValue;
+    }
+    sum += argumentValue;
+    if (type.isFloatingPoint) {
+      return argumentValue.toDouble().toString();
+    } else {
+      return argumentValue.toString();
+    }
+  }
+
+  String sumValue(FundamentalType type) {
+    if (type.isFloatingPoint) {
+      return sum.toDouble().toString();
+    } else {
+      return sum.toString();
+    }
+  }
+}
+
+extension on CType {
+  /// A list of Dart statements recursively allocating all members.
+  String dartAllocateStatements(String variableName) {
+    switch (this.runtimeType) {
+      case FundamentalType:
+        return "${dartType} ${variableName};\n";
+
+      case StructType:
+        return "${dartType} ${variableName} = allocate<$dartType>().ref;\n";
+    }
+
+    throw Exception("Not implemented for ${this.runtimeType}");
+  }
+
+  /// A list of Dart statements allocating as zero or nullptr.
+  String dartAllocateZeroStatements(String variableName) {
+    switch (this.runtimeType) {
+      case FundamentalType:
+        final this_ = this as FundamentalType;
+        if (this_.isInteger) {
+          return "${dartType} ${variableName} = 0;\n";
+        }
+        return "${dartType} ${variableName} = 0.0;\n";
+
+      case StructType:
+        return "${dartType} ${variableName} = ${dartType}();\n";
+    }
+
+    throw Exception("Not implemented for ${this.runtimeType}");
+  }
+}
+
+extension on List<Member> {
+  /// A list of Dart statements recursively allocating all members.
+  String dartAllocateStatements([String namePrefix = ""]) {
+    return map((m) => m.type.dartAllocateStatements("$namePrefix${m.name}"))
+        .join();
+  }
+
+  /// A list of Dart statements as zero or nullptr.
+  String dartAllocateZeroStatements([String namePrefix = ""]) {
+    return map((m) => m.type.dartAllocateZeroStatements("$namePrefix${m.name}"))
+        .join();
+  }
+}
+
+extension on CType {
+  /// A list of Dart statements recursively freeing all members.
+  String dartFreeStatements(String variableName) {
+    switch (this.runtimeType) {
+      case FundamentalType:
+        return "";
+
+      case StructType:
+        return "free($variableName.addressOf);\n";
+    }
+
+    throw Exception("Not implemented for ${this.runtimeType}");
+  }
+}
+
+extension on List<Member> {
+  /// A list of Dart statements recursively freeing all members.
+  String dartFreeStatements([String namePrefix = ""]) {
+    return map((m) => m.type.dartFreeStatements("$namePrefix${m.name}")).join();
+  }
+}
+
+extension on CType {
+  /// A list of C statements recursively allocating all members.
+  String cAllocateStatements(String variableName) {
+    switch (this.runtimeType) {
+      case FundamentalType:
+      case StructType:
+        return "${cType} ${variableName};\n";
+    }
+
+    throw Exception("Not implemented for ${this.runtimeType}");
+  }
+}
+
+extension on List<Member> {
+  /// A list of C statements recursively allocating all members.
+  String cAllocateStatements([String namePrefix = ""]) {
+    return map((m) => m.type.cAllocateStatements("$namePrefix${m.name}"))
+        .join();
+  }
+}
+
+extension on CType {
+  /// A list of Dart statements recursively checking all members.
+  String dartExpectsStatements(String expected, String actual) {
+    switch (this.runtimeType) {
+      case FundamentalType:
+        final this_ = this as FundamentalType;
+        if (this_.isInteger) {
+          return "Expect.equals(${expected}, ${actual});";
+        }
+        assert(this_.isFloatingPoint);
+        return "Expect.approxEquals(${expected}, ${actual});";
+
+      case StructType:
+        final this_ = this as StructType;
+        return this_.members.dartExpectsStatements("$expected.", "$actual.");
+    }
+
+    throw Exception("Not implemented for ${this.runtimeType}");
+  }
+}
+
+extension on List<Member> {
+  /// A list of Dart statements recursively checking all members.
+  String dartExpectsStatements(
+      [String expectedPrefix = "", String actualPrefix = ""]) {
+    return map((m) => m.type.dartExpectsStatements(
+        "$expectedPrefix${m.name}", "$actualPrefix${m.name}")).join();
+  }
+}
+
+extension on CType {
+  /// A list of C statements recursively checking all members.
+  String cExpectsStatements(String expected, String actual) {
+    switch (this.runtimeType) {
+      case FundamentalType:
+        final this_ = this as FundamentalType;
+        if (this_.isInteger) {
+          return "CHECK_EQ(${expected}, ${actual});";
+        }
+        assert(this_.isFloatingPoint);
+        return "CHECK_APPROX(${expected}, ${actual});";
+
+      case StructType:
+        final this_ = this as StructType;
+        return this_.members.cExpectsStatements("$expected.", "$actual.");
+    }
+
+    throw Exception("Not implemented for ${this.runtimeType}");
+  }
+
+  /// A list of C statements recursively checking all members for zero.
+  String cExpectsZeroStatements(String actual) {
+    switch (this.runtimeType) {
+      case FundamentalType:
+        final this_ = this as FundamentalType;
+        if (this_.isInteger) {
+          return "CHECK_EQ(0, ${actual});";
+        }
+        assert(this_.isFloatingPoint);
+        return "CHECK_APPROX(0.0, ${actual});";
+
+      case StructType:
+        final this_ = this as StructType;
+        return this_.members.cExpectsZeroStatements("$actual.");
+    }
+
+    throw Exception("Not implemented for ${this.runtimeType}");
+  }
+}
+
+extension on List<Member> {
+  /// A list of C statements recursively checking all members.
+  String cExpectsStatements(
+      [String expectedPrefix = "", String actualPrefix = ""]) {
+    return map((m) => m.type.cExpectsStatements(
+        "$expectedPrefix${m.name}", "$actualPrefix${m.name}")).join();
+  }
+
+  /// A list of C statements recursively checking all members for zero.
+  String cExpectsZeroStatements([String actualPrefix = ""]) {
+    return map((m) => m.type.cExpectsZeroStatements("$actualPrefix${m.name}"))
+        .join();
+  }
+}
+
+extension on CType {
+  /// Expression denoting the first FundamentalType field.
+  ///
+  /// Both valid in Dart and C.
+  String firstArgumentName(String variableName) {
+    switch (this.runtimeType) {
+      case FundamentalType:
+        return variableName;
+
+      case StructType:
+        final this_ = this as StructType;
+        return this_.members.firstArgumentName("$variableName.");
+    }
+
+    throw Exception("Not implemented for ${this.runtimeType}");
+  }
+}
+
+extension on List<Member> {
+  /// Expression denoting the first FundamentalType field.
+  ///
+  /// Both valid in Dart and C.
+  String firstArgumentName([String prefix = ""]) {
+    return this[0].type.firstArgumentName("$prefix${this[0].name}");
+  }
+}
+
+extension on StructType {
+  String dartClass(bool nnbd) {
+    String dartFields = "";
+    for (final member in members) {
+      dartFields += "${member.dartStructField(nnbd)}\n\n";
+    }
+    String toStringBody = members.map((m) => "\$\{${m.name}\}").join(", ");
+    return """
+    class $name extends Struct {
+      $dartFields
+
+      String toString() => "($toStringBody)";
+    }
+    """;
+  }
+
+  String get cDefinition {
+    String cFields = "";
+    for (final member in members) {
+      cFields += "  ${member.cStructField}\n";
+    }
+    return """
+    struct $name {
+      $cFields
+    };
+
+    """;
+  }
+}
+
+extension on FunctionType {
+  String get dartCallCode {
+    final a = ArgumentValueAssigner();
+    final assignValues = arguments.assignValueStatements(a);
+    final argumentFrees = arguments.dartFreeStatements();
+
+    final argumentNames = arguments.map((e) => e.name).join(", ");
+
+    String expects;
+    switch (testType) {
+      case TestType.structArguments:
+        // Check against sum value.
+        final expectedResult = a.sumValue(returnValue as FundamentalType);
+        expects = returnValue.dartExpectsStatements(expectedResult, "result");
+        break;
+      case TestType.structReturn:
+        // Check against input arguments.
+        expects = arguments.dartExpectsStatements("", "result.");
+        break;
+      case TestType.structReturnArgument:
+        expects = returnValue.dartExpectsStatements(
+            structReturnArgument.name, "result");
+        break;
+    }
+
+    return """
+    final $dartName =
+      ffiTestFunctions.lookupFunction<$dartCType, $dartType>("$cName");
+
+    ${reason.makeDartDocComment()}
+    void $dartTestName() {
+      ${arguments.dartAllocateStatements()}
+
+      ${assignValues}
+
+      final result = $dartName($argumentNames);
+
+      print("result = \$result");
+
+      $expects
+
+      $argumentFrees
+    }
+    """;
+  }
+
+  String dartCallbackCode(bool nnbd) {
+    final argumentss =
+        arguments.map((a) => "${a.type.dartType} ${a.name}").join(", ");
+
+    final prints = arguments.map((a) => "\$\{${a.name}\}").join(", ");
+
+    String buildReturnValue = "";
+    switch (testType) {
+      case TestType.structArguments:
+        // Sum all input values.
+        buildReturnValue = """
+        ${returnValue.dartType} result = 0;
+
+        ${arguments.addToResultStatements('${dartName}_')}
+        """;
+        break;
+      case TestType.structReturn:
+        // Allocate a struct.
+        buildReturnValue = """
+        ${returnValue.dartType} result = allocate<${returnValue.dartType}>().ref;
+
+        ${arguments.copyValueStatements("${dartName}_", "result.")}
+        """;
+        break;
+      case TestType.structReturnArgument:
+        buildReturnValue = """
+        ${returnValue.cType} result = ${dartName}_${structReturnArgument.name};
+        """;
+        break;
+    }
+
+    final globals = arguments.dartAllocateZeroStatements("${dartName}_");
+
+    final copyToGlobals =
+        arguments.map((a) => '${dartName}_${a.name} = ${a.name};').join("\n");
+
+    // Simulate assigning values the same way as in C, so that we know what the
+    // final return value should be.
+    final a = ArgumentValueAssigner();
+    arguments.assignValueStatements(a);
+    String afterCallbackExpects = "";
+    String afterCallbackFrees = "";
+    switch (testType) {
+      case TestType.structArguments:
+        // Check that the input structs are still available.
+        // Check against sum value.
+        final expectedResult = a.sumValue(returnValue as FundamentalType);
+        afterCallbackExpects =
+            returnValue.dartExpectsStatements(expectedResult, "result");
+        break;
+      case TestType.structReturn:
+        // We're passing allocating structs in [buildReturnValue].
+        afterCallbackFrees =
+            returnValue.dartFreeStatements("${dartName}Result");
+        break;
+      case TestType.structReturnArgument:
+        break;
+    }
+
+    String returnNull = "";
+    if (!nnbd) {
+      returnNull = """
+      if (${arguments.firstArgumentName()} == $returnNullValue) {
+        print("returning null!");
+        return null;
+      }
+      """;
+    }
+
+    return """
+    typedef ${cName}Type = $dartCType;
+
+    // Global variables to be able to test inputs after callback returned.
+    $globals
+
+    // Result variable also global, so we can delete it after the callback.
+    ${returnValue.dartAllocateZeroStatements("${dartName}Result")}
+
+    ${returnValue.dartType} ${dartName}CalculateResult() {
+      $buildReturnValue
+
+      ${dartName}Result = result;
+
+      return result;
+    }
+
+    ${reason.makeDartDocComment()}
+    ${returnValue.dartType} $dartName($argumentss) {
+      print("$dartName($prints)");
+
+      // In legacy mode, possibly return null.
+      $returnNull
+
+      // In both nnbd and legacy mode, possibly throw.
+      if (${arguments.firstArgumentName()} == $throwExceptionValue ||
+          ${arguments.firstArgumentName()} == $returnNullValue) {
+        print("throwing!");
+        throw Exception("$cName throwing on purpuse!");
+      }
+
+      $copyToGlobals
+
+      final result = ${dartName}CalculateResult();
+
+      print(\"result = \$result\");
+
+      return result;
+    }
+
+    void ${dartName}AfterCallback() {
+      $afterCallbackFrees
+
+      final result = ${dartName}CalculateResult();
+
+      print(\"after callback result = \$result\");
+
+      $afterCallbackExpects
+
+      $afterCallbackFrees
+    }
+
+    """;
+  }
+
+  String get dartCallbackTestConstructor {
+    String exceptionalReturn = "";
+    if (returnValue is FundamentalType) {
+      if ((returnValue as FundamentalType).isFloatingPoint) {
+        exceptionalReturn = ", 0.0";
+      } else {
+        exceptionalReturn = ", 0";
+      }
+    }
+    return """
+    CallbackTest.withCheck("$cName",
+      Pointer.fromFunction<${cName}Type>($dartName$exceptionalReturn),
+      ${dartName}AfterCallback),
+    """;
+  }
+
+  String get cCallCode {
+    String body = "";
+    switch (testType) {
+      case TestType.structArguments:
+        body = """
+        ${returnValue.cType} result = 0;
+
+        ${arguments.addToResultStatements()}
+        """;
+        break;
+      case TestType.structReturn:
+        body = """
+        ${returnValue.cType} result;
+
+        ${arguments.copyValueStatements("", "result.")}
+        """;
+        break;
+      case TestType.structReturnArgument:
+        body = """
+        ${returnValue.cType} result = ${structReturnArgument.name};
+        """;
+        break;
+    }
+
+    final argumentss =
+        arguments.map((e) => "${e.type.cType} ${e.name}").join(", ");
+
+    return """
+    // Used for testing structs by value.
+    ${reason.makeCComment()}
+    DART_EXPORT ${returnValue.cType} $cName($argumentss) {
+      std::cout << \"$cName\" ${arguments.coutExpression()} << \"\\n\";
+
+      $body
+
+      ${returnValue.coutStatement("result")}
+
+      return result;
+    }
+
+    """;
+  }
+
+  String get cCallbackCode {
+    final a = ArgumentValueAssigner();
+    final argumentAllocations = arguments.cAllocateStatements();
+    final assignValues = arguments.assignValueStatements(a);
+
+    final argumentss =
+        arguments.map((e) => "${e.type.cType} ${e.name}").join(", ");
+
+    final argumentNames = arguments.map((e) => e.name).join(", ");
+
+    String expects = "";
+    String expectsZero = "";
+    switch (testType) {
+      case TestType.structArguments:
+        // Check against sum value.
+        final returnValue_ = returnValue as FundamentalType;
+        final expectedResult = a.sumValue(returnValue_);
+        expects = returnValue.cExpectsStatements(expectedResult, "result");
+
+        expectsZero = returnValue.cExpectsZeroStatements("result");
+        break;
+      case TestType.structReturn:
+        // Check against input statements.
+        expects = arguments.cExpectsStatements("", "result.");
+
+        expectsZero = arguments.cExpectsZeroStatements("result.");
+        break;
+      case TestType.structReturnArgument:
+        // Check against input struct fields.
+        expects =
+            returnValue.cExpectsStatements(structReturnArgument.name, "result");
+
+        expectsZero = returnValue.cExpectsZeroStatements("result");
+        break;
+    }
+
+    return """
+    // Used for testing structs by value.
+    ${reason.makeCComment()}
+    DART_EXPORT intptr_t
+    Test$cName(
+        // NOLINTNEXTLINE(whitespace/parens)
+        ${returnValue.cType} (*f)($argumentss)) {
+      $argumentAllocations
+
+      $assignValues
+
+      std::cout << \"Calling Test$cName(\" ${arguments.coutExpression()} << \")\\n\";
+
+      ${returnValue.cType} result = f($argumentNames);
+
+      ${returnValue.coutStatement("result")}
+
+      $expects
+
+      // Pass argument that will make the Dart callback throw.
+      ${arguments.firstArgumentName()} = $throwExceptionValue;
+
+      result = f($argumentNames);
+
+      $expectsZero
+
+      // Pass argument that will make the Dart callback return null.
+      ${arguments.firstArgumentName()} = $returnNullValue;
+
+      result = f($argumentNames);
+
+      $expectsZero
+
+      return 0;
+    }
+
+    """;
+  }
+}
+
+/// Some value between 0 and 127 (works in every native type).
+const throwExceptionValue = 42;
+
+/// Some value between 0 and 127 (works in every native type).
+const returnNullValue = 84;
+
+const headerDartCallTest = """
+// Copyright (c) 2020, 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.
+//
+// This file has been automatically generated. Please do not edit it manually.
+//
+// SharedObjects=ffi_test_functions
+// VMOptions=
+// VMOptions=--deterministic --optimization-counter-threshold=5
+// VMOptions=--use-slow-path
+// VMOptions=--use-slow-path --stacktrace-every=100
+
+import 'dart:ffi';
+
+import "package:expect/expect.dart";
+import "package:ffi/ffi.dart";
+
+import 'dylib_utils.dart';
+
+final ffiTestFunctions = dlopenPlatformSpecific("ffi_test_functions");
+""";
+
+void writeDartCallTest() {
+  for (bool nnbd in [true, false]) {
+    final StringBuffer buffer = StringBuffer();
+    buffer.write(headerDartCallTest);
+
+    buffer.write("""
+    void main() {
+      for (int i = 0; i < 10; ++i) {
+        ${functions.map((e) => "${e.dartTestName}();").join("\n")}
+      }
+    }
+    """);
+    buffer.writeAll(structs.map((e) => e.dartClass(nnbd)));
+    buffer.writeAll(functions.map((e) => e.dartCallCode));
+
+    final path = callTestPath(nnbd);
+    File(path).writeAsStringSync(buffer.toString());
+    Process.runSync("dartfmt", ["-w", path]);
+  }
+}
+
+String callTestPath(bool nnbd) {
+  final folder = nnbd ? "ffi" : "ffi_2";
+  return Platform.script
+      .resolve("../../$folder/function_structs_by_value_generated_test.dart")
+      .path;
+}
+
+const headerDartCallbackTest = """
+// Copyright (c) 2020, 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.
+//
+// This file has been automatically generated. Please do not edit it manually.
+//
+// SharedObjects=ffi_test_functions
+// VMOptions=
+// VMOptions=--deterministic --optimization-counter-threshold=10
+// VMOptions=--use-slow-path
+// VMOptions=--use-slow-path --stacktrace-every=100
+
+import 'dart:ffi';
+
+import "package:expect/expect.dart";
+import "package:ffi/ffi.dart";
+
+import 'callback_tests_utils.dart';
+
+// Reuse the struct classes.
+import 'function_structs_by_value_generated_test.dart';
+
+
+void main() {
+  testCases.forEach((t) {
+    print("==== Running " + t.name);
+    t.run();
+  });
+}
+
+
+""";
+
+void writeDartCallbackTest() {
+  for (bool nnbd in [true, false]) {
+    final StringBuffer buffer = StringBuffer();
+    buffer.write(headerDartCallbackTest);
+
+    buffer.write("""
+  final testCases = [
+    ${functions.map((e) => e.dartCallbackTestConstructor).join("\n")}
+  ];
+  """);
+
+    buffer.writeAll(functions.map((e) => e.dartCallbackCode(nnbd)));
+
+    final path = callbackTestPath(nnbd);
+    File(path).writeAsStringSync(buffer.toString());
+    Process.runSync("dartfmt", ["-w", path]);
+  }
+}
+
+String callbackTestPath(bool nnbd) {
+  final folder = nnbd ? "ffi" : "ffi_2";
+  return Platform.script
+      .resolve(
+          "../../$folder/function_callbacks_structs_by_value_generated_test.dart")
+      .path;
+}
+
+const headerC = """
+// Copyright (c) 2020, 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.
+//
+// This file has been automatically generated. Please do not edit it manually.
+
+#include <stddef.h>
+#include <stdlib.h>
+#include <sys/types.h>
+
+#include <cmath>
+#include <iostream>
+#include <limits>
+
+#if defined(_WIN32)
+#define DART_EXPORT extern "C" __declspec(dllexport)
+#else
+#define DART_EXPORT                                                            \\
+  extern "C" __attribute__((visibility("default"))) __attribute((used))
+#endif
+
+namespace dart {
+
+#define CHECK(X)                                                               \\
+  if (!(X)) {                                                                  \\
+    fprintf(stderr, "%s\\n", "Check failed: " #X);                              \\
+    return 1;                                                                  \\
+  }
+
+#define CHECK_EQ(X, Y) CHECK((X) == (Y))
+
+// Works for positive, negative and zero.
+#define CHECK_APPROX(EXPECTED, ACTUAL)                                         \\
+  CHECK(((EXPECTED * 0.99) <= (ACTUAL) && (EXPECTED * 1.01) >= (ACTUAL)) ||    \\
+        ((EXPECTED * 0.99) >= (ACTUAL) && (EXPECTED * 1.01) <= (ACTUAL)))
+
+""";
+
+const footerC = """
+
+}  // namespace dart
+""";
+
+void writeC() {
+  final StringBuffer buffer = StringBuffer();
+  buffer.write(headerC);
+
+  buffer.writeAll(structs.map((e) => e.cDefinition));
+  buffer.writeAll(functions.map((e) => e.cCallCode));
+  buffer.writeAll(functions.map((e) => e.cCallbackCode));
+
+  buffer.write(footerC);
+
+  File(ccPath).writeAsStringSync(buffer.toString());
+  Process.runSync("clang-format", ["-i", ccPath]);
+}
+
+final ccPath = Platform.script
+    .resolve("../../../runtime/bin/ffi_test/ffi_test_functions_generated.cc")
+    .path;
+
+void printUsage() {
+  print("""
+Generates structs by value tests.
+
+Generates:
+- $ccPath
+- ${callbackTestPath(true)}
+- ${callTestPath(true)}
+- ${callbackTestPath(false)}
+- ${callTestPath(false)}
+""");
+}
+
+void main(List<String> arguments) {
+  if (arguments.length != 0) {
+    printUsage();
+    return;
+  }
+
+  writeDartCallTest();
+  writeDartCallbackTest();
+  writeC();
+}
diff --git a/tests/ffi_2/generator/utils.dart b/tests/ffi_2/generator/utils.dart
new file mode 100644
index 0000000..735e769
--- /dev/null
+++ b/tests/ffi_2/generator/utils.dart
@@ -0,0 +1,22 @@
+// Copyright (c) 2020, 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.
+
+extension TestGeneratorStringExtension on String {
+  String upperCaseFirst() => "${this[0].toUpperCase()}${this.substring(1)}";
+
+  String lowerCaseFirst() => "${this[0].toLowerCase()}${this.substring(1)}";
+
+  String makeCComment() => "// " + split("\n").join("\n// ");
+
+  String makeDartDocComment() => "/// " + split("\n").join("\n/// ");
+
+  String limitTo(int lenght) {
+    if (this.length > lenght) {
+      return substring(0, lenght);
+    }
+    return this;
+  }
+
+  String trimCouts() => replaceAll('" << "', '').replaceAll('"<< "', '');
+}
diff --git a/tests/ffi_2/prepare_flutter_bundle.dart b/tests/ffi_2/prepare_flutter_bundle.dart
index 83a4a42..8ff9447 100644
--- a/tests/ffi_2/prepare_flutter_bundle.dart
+++ b/tests/ffi_2/prepare_flutter_bundle.dart
@@ -6,7 +6,9 @@
 import 'dart:io';
 
 import 'package:path/path.dart' as path;
-import 'package:args/args.dart';
+
+// TODO(dacoharkes): Migrate script to be nullsafe and generate nullsafe
+// Flutter app.
 
 main(List<String> args) async {
   if (args.length != 1) {
@@ -51,16 +53,34 @@
 
   await generateCleanDir(flutterTestsDir);
 
-  final dartTestsDir = path.join(flutterTestsDir, 'lib/src/generated');
+  final dartTestsDirRelative = 'example/lib';
+  final dartTestsDir = path.join(flutterTestsDir, dartTestsDirRelative);
   await generateDartTests(dartTestsDir, allFiles, testFiles);
 
-  final ccDir = path.join(flutterTestsDir, 'ios/Classes');
+  final ccDirRelative = 'ios/Classes';
+  final ccDir = path.join(flutterTestsDir, ccDirRelative);
   await generateCLibs(sdkRoot, ccDir, allFiles, testFiles);
 
-  print('');
-  print('Please copy generated files into FFI flutter test application');
-  print('  * $dartTestsDir');
-  print('  * $ccDir');
+  print('''
+
+Files generated in:
+  * $dartTestsDir
+  * $ccDir
+
+Generate flutter test application with:
+  flutter create --platforms=android,ios --template=plugin <ffi_test_app_name>
+
+Please copy generated files into FFI flutter test application:
+  cd <ffi_test_app_dir> && cp -r $flutterTestsDir ./
+
+After copying modify the test application:
+  * Modify example/pubspec.yaml to depend on package:ffi.
+  * Modify example/lib/main.dart to invoke all.dart while rendering.
+  * Open example/ios/Runner.xcworkspace in Xcode.
+    * Add the cpp files to Pods/Development Pods/<deep nesting>/ios/Classes
+      to ensure they are statically linked to the app.
+''');
+  // TODO(dacoharkes): Automate these steps. How to automate the XCode step?
 }
 
 void dumpTestList(List<String> testFiles, String message) {
@@ -108,6 +128,12 @@
   destinationFile =
       path.join(dir.path, path.basename(lib2)).replaceAll('.cc', '.cpp');
   File(destinationFile).writeAsStringSync(File(lib2).readAsStringSync());
+
+  final lib3 = path.join(
+      sdkRoot, 'runtime/bin/ffi_test/ffi_test_functions_generated.cc');
+  destinationFile =
+      path.join(dir.path, path.basename(lib3)).replaceAll('.cc', '.cpp');
+  File(destinationFile).writeAsStringSync(File(lib3).readAsStringSync());
 }
 
 String cleanDart(String content) {
@@ -159,7 +185,8 @@
 
 Stream<String> listTestFiles(
     String sdkRoot, List<String> filteredTests) async* {
-  await for (final file in Directory(path.join(sdkRoot, 'tests/ffi')).list()) {
+  await for (final file
+      in Directory(path.join(sdkRoot, 'tests/ffi_2')).list()) {
     if (file is File && file.path.endsWith('_test.dart')) {
       // These tests are VM specific and cannot necessarily be run on Flutter.
       if (path.basename(file.path).startsWith('vmspecific_')) {
diff --git a/tests/ffi_2/regress_37254_test.dart b/tests/ffi_2/regress_37254_test.dart
index dcd42b9..6ba796f 100644
--- a/tests/ffi_2/regress_37254_test.dart
+++ b/tests/ffi_2/regress_37254_test.dart
@@ -238,7 +238,6 @@
 }
 
 void main() {
-  // Trigger both the runtime entry and the IL in bytecode.
   for (int i = 0; i < 100; i++) {
     store1();
     store2();
diff --git a/tests/ffi_2/regress_43016_test.dart b/tests/ffi_2/regress_43016_test.dart
index 1d06b87..b0ebc0c 100644
--- a/tests/ffi_2/regress_43016_test.dart
+++ b/tests/ffi_2/regress_43016_test.dart
@@ -27,7 +27,6 @@
 final ffiTestFunctions = dlopenPlatformSpecific("ffi_test_functions");
 
 void main() {
-  // Trigger both the runtime entry and the IL in bytecode.
   for (int i = 0; i < 10000; i++) {
     pass_struct(nullptr);
   }
diff --git a/tests/ffi_2/vmspecific_handle_dynamically_linked_test.dart b/tests/ffi_2/vmspecific_handle_dynamically_linked_test.dart
index 6422958..2b6e834 100644
--- a/tests/ffi_2/vmspecific_handle_dynamically_linked_test.dart
+++ b/tests/ffi_2/vmspecific_handle_dynamically_linked_test.dart
@@ -16,8 +16,8 @@
 }
 
 void doDynamicLinking() {
-  Expect.isTrue(NativeApi.majorVersion == 1);
-  Expect.isTrue(NativeApi.minorVersion >= 1);
+  Expect.isTrue(NativeApi.majorVersion == 2);
+  Expect.isTrue(NativeApi.minorVersion >= 0);
   final initializeApi = testLibrary.lookupFunction<
       IntPtr Function(Pointer<Void>),
       int Function(Pointer<Void>)>("InitDartApiDL");
diff --git a/tests/language/const/syntax_test.dart b/tests/language/const/syntax_test.dart
index aa33723..cf1ce3a 100644
--- a/tests/language/const/syntax_test.dart
+++ b/tests/language/const/syntax_test.dart
@@ -63,7 +63,7 @@
 //        ^
 // [cfe] The const variable 'F3' must be initialized.
 //          ^
-// [cfe] A value of type 'Null' can't be assigned to a variable of type 'int'.
+// [cfe] The value 'null' can't be assigned to a variable of type 'int' because 'int' is not nullable.
 
 class Point {
   final x, y;
diff --git a/tests/language/constants_2018/potential_const_dynamic_test.dart b/tests/language/constants_2018/potential_const_dynamic_test.dart
index 90de32f..63f031a 100644
--- a/tests/language/constants_2018/potential_const_dynamic_test.dart
+++ b/tests/language/constants_2018/potential_const_dynamic_test.dart
@@ -20,7 +20,7 @@
   T.test10(c, c); //# sh3: ok
   T.test11(c, c);
   T.test12(c, c);
-  T .test13(c, c);
+  T.test13(c, c);
   T.test14(c);
   T.test15(c, c);
   T.test16(c, c);
@@ -73,4 +73,4 @@
   dynamic operator <=(dynamic other) => this;
   dynamic operator >=(dynamic other) => this;
   dynamic get length => this;
-}
\ No newline at end of file
+}
diff --git a/tests/language/constants_2018/potential_const_test.dart b/tests/language/constants_2018/potential_const_test.dart
new file mode 100644
index 0000000..ad516a9
--- /dev/null
+++ b/tests/language/constants_2018/potential_const_test.dart
@@ -0,0 +1,100 @@
+// 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.
+
+// Tests that the correct places allows, and requires, potentially constant
+// expressions.
+
+bool get nonConst => true;
+
+class C {
+  final v;
+  const C(this.v);
+
+  // Redirecting generative constructor invocation parameters,
+  // must be potenentially constant.
+  const C.r1() : this(const C(null));
+
+  // Only evaluates the true branch when passed `true` as argument.
+  const C.r2(bool b) : this(b ? null : 1 ~/ 0);
+
+  const C.rn1() : this(nonConst);
+  //                   ^^^^^^^^
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_CONSTANT
+  // [cfe] Constant evaluation error:
+
+  const C.rn2(bool b) : this(b ? null : nonConst);
+  //                                    ^^^^^^^^
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_CONSTANT
+  // [cfe] Constant evaluation error:
+
+  // Initializer list expressions must be potentially constant.
+  const C.g1() : v = const C(null);
+
+  const C.g2(bool b) : v = b ? null : 1 ~/ 0;
+
+  const C.gn3() : v = nonConst;
+  //                  ^^^^^^^^
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_CONSTANT
+  // [cfe] Constant evaluation error:
+
+  const C.gn4(bool b) : v = b ? null : nonConst;
+  //                                   ^^^^^^^^
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_CONSTANT
+  // [cfe] Constant evaluation error:
+
+  // Constant constructor initializer list assert expressions
+  // must be potentially constant (and boolean).
+  const C.a1()
+      : assert(const C(null) != null),
+        v = null;
+
+  const C.a2(bool b)
+      : assert(b ? const C(null) != null : ((1 ~/ 0) as bool)),
+        v = null;
+
+  const C.an1()
+      : assert(nonConst),
+        //     ^^^^^^^^
+        // [analyzer] COMPILE_TIME_ERROR.INVALID_CONSTANT
+        // [cfe] Constant evaluation error:
+        v = null;
+
+  const C.an2(bool b)
+      : assert(b ? true : nonConst),
+        //                ^^^^^^^^
+        // [analyzer] COMPILE_TIME_ERROR.INVALID_CONSTANT
+        // [cfe] Constant evaluation error:
+        v = null;
+}
+
+main() {
+  var c = const C(null);
+  var cc = const C(C(null));
+
+  var r1 = const C.r1();
+  var r2 = const C.r2(true);
+
+  /// Const constructor invocation which would throw.
+  /**/ const C.r2(false);
+  //   ^^^^^^^^^^^^^^^^^
+  // [analyzer] COMPILE_TIME_ERROR.CONST_EVAL_THROWS_EXCEPTION
+  //         ^^^^^^^^^^^
+  // [cfe] Constant evaluation error:
+
+  var g1 = const C.g1();
+  var g2 = const C.g2(true);
+  /**/ const C.g2(false);
+  //   ^^^^^^^^^^^^^^^^^
+  // [analyzer] COMPILE_TIME_ERROR.CONST_EVAL_THROWS_EXCEPTION
+  //         ^^^^^^^^^^^
+  // [cfe] Constant evaluation error:
+
+  var a1 = const C.a1();
+  var a2 = const C.a2(true);
+  /**/ const C.a2(false);
+  //   ^^^^^^^^^^^^^^^^^
+  // [analyzer] COMPILE_TIME_ERROR.CONST_EVAL_THROWS_EXCEPTION
+  //         ^^^^^^^^^^^
+  // [cfe] Constant evaluation error:
+}
diff --git a/tests/language/constants_2018/potential_const_type_test.dart b/tests/language/constants_2018/potential_const_type_test.dart
index 0f06507..e4a26ee 100644
--- a/tests/language/constants_2018/potential_const_type_test.dart
+++ b/tests/language/constants_2018/potential_const_type_test.dart
@@ -92,4 +92,4 @@
   C operator <=(C other) => this;
   C operator >=(C other) => this;
   C get length => this;
-}
\ No newline at end of file
+}
diff --git a/tests/language/control_flow_collections/await_for_null_test.dart b/tests/language/control_flow_collections/await_for_null_test.dart
index 61fd04c..bd4b28a 100644
--- a/tests/language/control_flow_collections/await_for_null_test.dart
+++ b/tests/language/control_flow_collections/await_for_null_test.dart
@@ -9,13 +9,13 @@
   var a = <int>[await for (var i in nullStream) 1];
   //                                ^^^^^^^^^^
   // [analyzer] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
-  // [cfe] The type 'Stream<int>?' used in the 'for' loop must implement 'Stream<dynamic>'.
+  // [cfe] The type 'Stream<int>?' used in the 'for' loop must implement 'Stream<dynamic>' because 'Stream<int>?' is nullable and 'Stream<dynamic>' isn't.
   var b = <int, int>{await for (var i in nullStream) 1: 1};
   //                                     ^^^^^^^^^^
   // [analyzer] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
-  // [cfe] The type 'Stream<int>?' used in the 'for' loop must implement 'Stream<dynamic>'.
+  // [cfe] The type 'Stream<int>?' used in the 'for' loop must implement 'Stream<dynamic>' because 'Stream<int>?' is nullable and 'Stream<dynamic>' isn't.
   var c = <int>{await for (var i in nullStream) 1};
   //                                ^^^^^^^^^^
   // [analyzer] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
-  // [cfe] The type 'Stream<int>?' used in the 'for' loop must implement 'Stream<dynamic>'.
+  // [cfe] The type 'Stream<int>?' used in the 'for' loop must implement 'Stream<dynamic>' because 'Stream<int>?' is nullable and 'Stream<dynamic>' isn't.
 }
diff --git a/tests/language/control_flow_collections/for_downcast_test.dart b/tests/language/control_flow_collections/for_downcast_test.dart
index a9eda1d..a2d2620 100644
--- a/tests/language/control_flow_collections/for_downcast_test.dart
+++ b/tests/language/control_flow_collections/for_downcast_test.dart
@@ -118,13 +118,13 @@
   var a = <int>[for (var i in nullIterable) 1];
   //                          ^^^^^^^^^^^^
   // [analyzer] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
-  // [cfe] The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+  // [cfe] The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'Iterable<int>?' is nullable and 'Iterable<dynamic>' isn't.
   var b = {for (var i in nullIterable) 1: 1};
   //                     ^^^^^^^^^^^^
   // [analyzer] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
-  // [cfe] The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+  // [cfe] The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'Iterable<int>?' is nullable and 'Iterable<dynamic>' isn't.
   var c = <int>{for (var i in nullIterable) 1};
   //                          ^^^^^^^^^^^^
   // [analyzer] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
-  // [cfe] The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+  // [cfe] The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'Iterable<int>?' is nullable and 'Iterable<dynamic>' isn't.
 }
diff --git a/tests/language/control_flow_collections/for_null_condition_test.dart b/tests/language/control_flow_collections/for_null_condition_test.dart
index ebddf4c..018f74a 100644
--- a/tests/language/control_flow_collections/for_null_condition_test.dart
+++ b/tests/language/control_flow_collections/for_null_condition_test.dart
@@ -10,13 +10,13 @@
   var a = <int>[for (; nullBool;) 1];
   //                   ^^^^^^^^
   // [analyzer] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
-  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
   var b = <int, int>{for (; nullBool;) 1: 1};
   //                        ^^^^^^^^
   // [analyzer] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
-  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
   var c = <int>{for (; nullBool;) 1};
   //                   ^^^^^^^^
   // [analyzer] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
-  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
 }
diff --git a/tests/language/control_flow_collections/if_null_condition_test.dart b/tests/language/control_flow_collections/if_null_condition_test.dart
index bec649f..ca7aa5c 100644
--- a/tests/language/control_flow_collections/if_null_condition_test.dart
+++ b/tests/language/control_flow_collections/if_null_condition_test.dart
@@ -7,15 +7,15 @@
   var a = <int>[if (nullBool) 1];
   //                ^^^^^^^^
   // [analyzer] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
-  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
 
   var b = <int, int>{if (nullBool) 1: 1};
   //                     ^^^^^^^^
   // [analyzer] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
-  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
 
   var c = <int>{if (nullBool) 1};
   //                ^^^^^^^^
   // [analyzer] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
-  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
 }
diff --git a/tests/language/deferred/split_constants_canonicalization_a.dart b/tests/language/deferred/split_constants_canonicalization_a.dart
new file mode 100644
index 0000000..3e3ada7
--- /dev/null
+++ b/tests/language/deferred/split_constants_canonicalization_a.dart
@@ -0,0 +1,29 @@
+// Copyright (c) 2020, 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 "split_constants_canonicalization_a_1.dart" deferred as a_1;
+import "split_constants_canonicalization_a_2.dart" deferred as a_2;
+
+loadChildren() async {
+  await a_1.loadLibrary();
+  await a_2.loadLibrary();
+}
+
+a_1_mint() => a_1.mint();
+a_1_string() => a_1.string();
+a_1_list() => a_1.list();
+a_1_map() => a_1.map();
+a_1_box() => a_1.box();
+a_1_enum() => a_1.enumm();
+a_1_type() => a_1.type();
+a_1_closure() => a_1.closure();
+
+a_2_mint() => a_2.mint();
+a_2_string() => a_2.string();
+a_2_list() => a_2.list();
+a_2_map() => a_2.map();
+a_2_box() => a_2.box();
+a_2_enum() => a_2.enumm();
+a_2_type() => a_2.type();
+a_2_closure() => a_2.closure();
diff --git a/tests/language/deferred/split_constants_canonicalization_a_1.dart b/tests/language/deferred/split_constants_canonicalization_a_1.dart
new file mode 100644
index 0000000..ea054f5
--- /dev/null
+++ b/tests/language/deferred/split_constants_canonicalization_a_1.dart
@@ -0,0 +1,29 @@
+// Copyright (c) 2020, 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 "split_constants_canonicalization_test.dart";
+
+@pragma("vm:never-inline")
+mint() => 0x7FFFFFFFFFFFFFFF;
+
+@pragma("vm:never-inline")
+string() => "We all have identical strings";
+
+@pragma("vm:never-inline")
+list() => const <String>["We all have identical lists"];
+
+@pragma("vm:never-inline")
+map() => const <String, String>{"We all have": "identical maps"};
+
+@pragma("vm:never-inline")
+box() => const Box("We all have identical boxes");
+
+@pragma("vm:never-inline")
+enumm() => Enum.GREEN;
+
+@pragma("vm:never-inline")
+type() => Box;
+
+@pragma("vm:never-inline")
+closure() => commonClosure;
diff --git a/tests/language/deferred/split_constants_canonicalization_a_2.dart b/tests/language/deferred/split_constants_canonicalization_a_2.dart
new file mode 100644
index 0000000..ea054f5
--- /dev/null
+++ b/tests/language/deferred/split_constants_canonicalization_a_2.dart
@@ -0,0 +1,29 @@
+// Copyright (c) 2020, 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 "split_constants_canonicalization_test.dart";
+
+@pragma("vm:never-inline")
+mint() => 0x7FFFFFFFFFFFFFFF;
+
+@pragma("vm:never-inline")
+string() => "We all have identical strings";
+
+@pragma("vm:never-inline")
+list() => const <String>["We all have identical lists"];
+
+@pragma("vm:never-inline")
+map() => const <String, String>{"We all have": "identical maps"};
+
+@pragma("vm:never-inline")
+box() => const Box("We all have identical boxes");
+
+@pragma("vm:never-inline")
+enumm() => Enum.GREEN;
+
+@pragma("vm:never-inline")
+type() => Box;
+
+@pragma("vm:never-inline")
+closure() => commonClosure;
diff --git a/tests/language/deferred/split_constants_canonicalization_b.dart b/tests/language/deferred/split_constants_canonicalization_b.dart
new file mode 100644
index 0000000..f27900d
--- /dev/null
+++ b/tests/language/deferred/split_constants_canonicalization_b.dart
@@ -0,0 +1,29 @@
+// Copyright (c) 2020, 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 "split_constants_canonicalization_b_1.dart" deferred as b_1;
+import "split_constants_canonicalization_b_2.dart" deferred as b_2;
+
+loadChildren() async {
+  await b_1.loadLibrary();
+  await b_2.loadLibrary();
+}
+
+b_1_mint() => b_1.mint();
+b_1_string() => b_1.string();
+b_1_list() => b_1.list();
+b_1_map() => b_1.map();
+b_1_box() => b_1.box();
+b_1_enum() => b_1.enumm();
+b_1_type() => b_1.type();
+b_1_closure() => b_1.closure();
+
+b_2_mint() => b_2.mint();
+b_2_string() => b_2.string();
+b_2_list() => b_2.list();
+b_2_map() => b_2.map();
+b_2_box() => b_2.box();
+b_2_enum() => b_2.enumm();
+b_2_type() => b_2.type();
+b_2_closure() => b_2.closure();
diff --git a/tests/language/deferred/split_constants_canonicalization_b_1.dart b/tests/language/deferred/split_constants_canonicalization_b_1.dart
new file mode 100644
index 0000000..ea054f5
--- /dev/null
+++ b/tests/language/deferred/split_constants_canonicalization_b_1.dart
@@ -0,0 +1,29 @@
+// Copyright (c) 2020, 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 "split_constants_canonicalization_test.dart";
+
+@pragma("vm:never-inline")
+mint() => 0x7FFFFFFFFFFFFFFF;
+
+@pragma("vm:never-inline")
+string() => "We all have identical strings";
+
+@pragma("vm:never-inline")
+list() => const <String>["We all have identical lists"];
+
+@pragma("vm:never-inline")
+map() => const <String, String>{"We all have": "identical maps"};
+
+@pragma("vm:never-inline")
+box() => const Box("We all have identical boxes");
+
+@pragma("vm:never-inline")
+enumm() => Enum.GREEN;
+
+@pragma("vm:never-inline")
+type() => Box;
+
+@pragma("vm:never-inline")
+closure() => commonClosure;
diff --git a/tests/language/deferred/split_constants_canonicalization_b_2.dart b/tests/language/deferred/split_constants_canonicalization_b_2.dart
new file mode 100644
index 0000000..ea054f5
--- /dev/null
+++ b/tests/language/deferred/split_constants_canonicalization_b_2.dart
@@ -0,0 +1,29 @@
+// Copyright (c) 2020, 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 "split_constants_canonicalization_test.dart";
+
+@pragma("vm:never-inline")
+mint() => 0x7FFFFFFFFFFFFFFF;
+
+@pragma("vm:never-inline")
+string() => "We all have identical strings";
+
+@pragma("vm:never-inline")
+list() => const <String>["We all have identical lists"];
+
+@pragma("vm:never-inline")
+map() => const <String, String>{"We all have": "identical maps"};
+
+@pragma("vm:never-inline")
+box() => const Box("We all have identical boxes");
+
+@pragma("vm:never-inline")
+enumm() => Enum.GREEN;
+
+@pragma("vm:never-inline")
+type() => Box;
+
+@pragma("vm:never-inline")
+closure() => commonClosure;
diff --git a/tests/language/deferred/split_constants_canonicalization_test.dart b/tests/language/deferred/split_constants_canonicalization_test.dart
new file mode 100644
index 0000000..02d5c6e
--- /dev/null
+++ b/tests/language/deferred/split_constants_canonicalization_test.dart
@@ -0,0 +1,94 @@
+// Copyright (c) 2020, 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.
+
+// VMOptions=--use_bare_instructions=false
+// VMOptions=--use_bare_instructions=true
+
+import "package:expect/expect.dart";
+import "split_constants_canonicalization_a.dart" deferred as a;
+import "split_constants_canonicalization_b.dart" deferred as b;
+
+class Box {
+  final contents;
+  const Box(this.contents);
+}
+
+enum Enum {
+  RED,
+  GREEN,
+  BLUE,
+}
+
+commonClosure() {}
+
+main() async {
+  await a.loadLibrary();
+  await a.loadChildren();
+  await b.loadLibrary();
+  await b.loadChildren();
+
+  var a_1_mint = await a.a_1_mint();
+  var a_2_mint = await a.a_2_mint();
+  var b_1_mint = await b.b_1_mint();
+  var b_2_mint = await b.b_2_mint();
+  Expect.isTrue(identical(a_1_mint, a_2_mint));
+  Expect.isTrue(identical(a_1_mint, b_1_mint));
+  Expect.isTrue(identical(a_1_mint, b_2_mint));
+
+  var a_1_string = await a.a_1_string();
+  var a_2_string = await a.a_2_string();
+  var b_1_string = await b.b_1_string();
+  var b_2_string = await b.b_2_string();
+  Expect.isTrue(identical(a_1_string, a_2_string));
+  Expect.isTrue(identical(a_1_string, b_1_string));
+  Expect.isTrue(identical(a_1_string, b_2_string));
+
+  var a_1_list = await a.a_1_list();
+  var a_2_list = await a.a_2_list();
+  var b_1_list = await b.b_1_list();
+  var b_2_list = await b.b_2_list();
+  Expect.isTrue(identical(a_1_list, a_2_list));
+  Expect.isTrue(identical(a_1_list, b_1_list));
+  Expect.isTrue(identical(a_1_list, b_2_list));
+
+  var a_1_map = await a.a_1_map();
+  var a_2_map = await a.a_2_map();
+  var b_1_map = await b.b_1_map();
+  var b_2_map = await b.b_2_map();
+  Expect.isTrue(identical(a_1_map, a_2_map));
+  Expect.isTrue(identical(a_1_map, b_1_map));
+  Expect.isTrue(identical(a_1_map, b_2_map));
+
+  var a_1_box = await a.a_1_box();
+  var a_2_box = await a.a_2_box();
+  var b_1_box = await b.b_1_box();
+  var b_2_box = await b.b_2_box();
+  Expect.isTrue(identical(a_1_box, a_2_box));
+  Expect.isTrue(identical(a_1_box, b_1_box));
+  Expect.isTrue(identical(a_1_box, b_2_box));
+
+  var a_1_enum = await a.a_1_enum();
+  var a_2_enum = await a.a_2_enum();
+  var b_1_enum = await b.b_1_enum();
+  var b_2_enum = await b.b_2_enum();
+  Expect.isTrue(identical(a_1_enum, a_2_enum));
+  Expect.isTrue(identical(a_1_enum, b_1_enum));
+  Expect.isTrue(identical(a_1_enum, b_2_enum));
+
+  var a_1_type = await a.a_1_type();
+  var a_2_type = await a.a_2_type();
+  var b_1_type = await b.b_1_type();
+  var b_2_type = await b.b_2_type();
+  Expect.isTrue(identical(a_1_type, a_2_type));
+  Expect.isTrue(identical(a_1_type, b_1_type));
+  Expect.isTrue(identical(a_1_type, b_2_type));
+
+  var a_1_closure = await a.a_1_closure();
+  var a_2_closure = await a.a_2_closure();
+  var b_1_closure = await b.b_1_closure();
+  var b_2_closure = await b.b_2_closure();
+  Expect.isTrue(identical(a_1_closure, a_2_closure));
+  Expect.isTrue(identical(a_1_closure, b_1_closure));
+  Expect.isTrue(identical(a_1_closure, b_2_closure));
+}
diff --git a/tests/language/extension_methods/static_extension_resolution_7_test.dart b/tests/language/extension_methods/static_extension_resolution_7_test.dart
index 96c1712..64bb976 100644
--- a/tests/language/extension_methods/static_extension_resolution_7_test.dart
+++ b/tests/language/extension_methods/static_extension_resolution_7_test.dart
@@ -32,8 +32,8 @@
 
   void testPromotedType(S s) {
     if (s is int) {
-      // Check that `int` has no `f`, bind `T` to `int`.
-      int Function(int) f = s.f;
+      // Check that `int` has no `f`, erase `S & int` to `S`, bind `T` to `S`.
+      S Function(S) f = s.f;
     }
   }
 }
diff --git a/tests/language/function_subtype/bound_closure5_test.dart b/tests/language/function_subtype/bound_closure5_test.dart
index 1844a42..d498a19 100644
--- a/tests/language/function_subtype/bound_closure5_test.dart
+++ b/tests/language/function_subtype/bound_closure5_test.dart
@@ -39,7 +39,7 @@
   new D<String, bool>().test('bool', true);
   new D<bool, int>().test('int', false);
   new D<Object, Object>().test('Object', false);
-  new D<Null, Null>().test('Null', isWeakMode);
+  new D<Null, Null>().test('Null', hasUnsoundNullSafety);
   new D<Never, Never>().test('Never', true);
   new D<dynamic, dynamic>().test('dynamic', false);
 }
diff --git a/tests/language/function_subtype/bound_closure5a_test.dart b/tests/language/function_subtype/bound_closure5a_test.dart
index 38b173d..b5d274b 100644
--- a/tests/language/function_subtype/bound_closure5a_test.dart
+++ b/tests/language/function_subtype/bound_closure5a_test.dart
@@ -41,7 +41,7 @@
   new D<String, bool>().test('bool', true);
   new D<bool, int>().test('int', false);
   new D<Object, Object>().test('Object', false);
-  new D<Null, Null>().test('Null', isWeakMode);
+  new D<Null, Null>().test('Null', hasUnsoundNullSafety);
   new D<Never, Never>().test('Never', true);
   new D<dynamic, dynamic>().test('dynamic', false);
 }
diff --git a/tests/language/function_subtype/bound_closure6_test.dart b/tests/language/function_subtype/bound_closure6_test.dart
index e26d21f..ea119a5 100644
--- a/tests/language/function_subtype/bound_closure6_test.dart
+++ b/tests/language/function_subtype/bound_closure6_test.dart
@@ -42,6 +42,6 @@
   new C<int>().test('int', false);
   new C<Object>().test('Object', false);
   new C<dynamic>().test('dynamic', false);
-  new C<Null>().test('Null', isWeakMode);
+  new C<Null>().test('Null', hasUnsoundNullSafety);
   new C<Never>().test('Never', true);
 }
diff --git a/tests/language/function_subtype/cast2_test.dart b/tests/language/function_subtype/cast2_test.dart
index 03a8f53..5e0f5b7 100644
--- a/tests/language/function_subtype/cast2_test.dart
+++ b/tests/language/function_subtype/cast2_test.dart
@@ -26,7 +26,7 @@
 void main() {
   new Class<dynamic>().test(false, bar, "dynamic");
   new Class<Object>().test(false, bar, "Object");
-  new Class<Null>().test(isWeakMode, bar, "Null");
+  new Class<Null>().test(hasUnsoundNullSafety, bar, "Null");
   new Class<Never>().test(true, bar, "Never");
   new Class<int>().test(true, bar, "int");
   new Class<bool>().test(false, bar, "bool");
diff --git a/tests/language/function_subtype/checked0_test.dart b/tests/language/function_subtype/checked0_test.dart
index a314529..40abf58 100644
--- a/tests/language/function_subtype/checked0_test.dart
+++ b/tests/language/function_subtype/checked0_test.dart
@@ -69,6 +69,6 @@
   new C<int>().test('int', false);
   new C<dynamic>().test('dynamic', false);
   new C<Object>().test('Object', false);
-  new C<Null>().test('Null', isWeakMode);
+  new C<Null>().test('Null', hasUnsoundNullSafety);
   new C<Never>().test('Null', true);
 }
diff --git a/tests/language/function_subtype/inline0_test.dart b/tests/language/function_subtype/inline0_test.dart
index 4e99998..c28d1d0 100644
--- a/tests/language/function_subtype/inline0_test.dart
+++ b/tests/language/function_subtype/inline0_test.dart
@@ -41,7 +41,7 @@
 }
 
 main() {
-  new C<bool>().test('bool', true, isWeakMode);
+  new C<bool>().test('bool', true, hasUnsoundNullSafety);
   new C<int>().test('int', false, false);
-  new C<dynamic>().test('dynamic', true, isWeakMode);
+  new C<dynamic>().test('dynamic', true, hasUnsoundNullSafety);
 }
diff --git a/tests/language/function_subtype/inline2_test.dart b/tests/language/function_subtype/inline2_test.dart
index a3f4078..2f63a3d 100644
--- a/tests/language/function_subtype/inline2_test.dart
+++ b/tests/language/function_subtype/inline2_test.dart
@@ -23,7 +23,7 @@
   testDynamicTypeError(false, () => f(m1), "'new C.$constructorName(m1)'");
   testDynamicTypeError(true, () => f(m2), "'new C.$constructorName(m2)'");
   testDynamicTypeError(
-      isStrongMode, () => f(m3), "'new C.$constructorName(m3)'");
+      hasSoundNullSafety, () => f(m3), "'new C.$constructorName(m3)'");
   testDynamicTypeError(true, () => f(m4), "'new C.$constructorName(m4)'");
   testDynamicTypeError(false, () => f(m5), "'new C.$constructorName(m5)'");
 }
diff --git a/tests/language/function_subtype/local2_test.dart b/tests/language/function_subtype/local2_test.dart
index 7b0d19d..fe3de21 100644
--- a/tests/language/function_subtype/local2_test.dart
+++ b/tests/language/function_subtype/local2_test.dart
@@ -38,6 +38,6 @@
   new C<int>().test('int', false);
   new C<dynamic>().test('dynamic', false);
   new C<Object>().test('Object', false);
-  new C<Null>().test('Null', isWeakMode);
+  new C<Null>().test('Null', hasUnsoundNullSafety);
   new C<Never>().test('Never', true);
 }
diff --git a/tests/language/function_subtype/local5_test.dart b/tests/language/function_subtype/local5_test.dart
index 92d570f..18c887c 100644
--- a/tests/language/function_subtype/local5_test.dart
+++ b/tests/language/function_subtype/local5_test.dart
@@ -40,6 +40,6 @@
   new D<bool, int>().test('int', false);
   new D<dynamic, dynamic>().test('dynamic', false);
   new D<Object, Object>().test('Object', false);
-  new D<Null, Null>().test('Null', isWeakMode);
+  new D<Null, Null>().test('Null', hasUnsoundNullSafety);
   new D<Never, Never>().test('Never', true);
 }
diff --git a/tests/language/function_subtype/not2_test.dart b/tests/language/function_subtype/not2_test.dart
index 03b0110..ffad8f7 100644
--- a/tests/language/function_subtype/not2_test.dart
+++ b/tests/language/function_subtype/not2_test.dart
@@ -22,7 +22,7 @@
 void main() {
   new Class<dynamic>().test(true, bar, "dynamic");
   new Class<Object>().test(true, bar, "Object");
-  new Class<Null>().test(isStrongMode, bar, "Null");
+  new Class<Null>().test(hasSoundNullSafety, bar, "Null");
   new Class<Never>().test(false, bar, "Never");
   new Class<int>().test(false, bar, "int");
   new Class<bool>().test(true, bar, "bool");
diff --git a/tests/language/function_subtype/not3_test.dart b/tests/language/function_subtype/not3_test.dart
index 0c03826..e3d23bc6 100644
--- a/tests/language/function_subtype/not3_test.dart
+++ b/tests/language/function_subtype/not3_test.dart
@@ -26,7 +26,7 @@
 void main() {
   new Class<dynamic>().test(true, bar, "dynamic");
   new Class<Object>().test(true, bar, "Object");
-  new Class<Null>().test(isStrongMode, bar, "Null");
+  new Class<Null>().test(hasSoundNullSafety, bar, "Null");
   new Class<Never>().test(false, bar, "Never");
   new Class<int>().test(false, bar, "int");
   new Class<bool>().test(true, bar, "bool");
diff --git a/tests/language/function_subtype/top_level1_test.dart b/tests/language/function_subtype/top_level1_test.dart
index 4e2d763..92aac32 100644
--- a/tests/language/function_subtype/top_level1_test.dart
+++ b/tests/language/function_subtype/top_level1_test.dart
@@ -40,6 +40,6 @@
   new C<int>().test('int', false);
   new C<Object>().test('Object', false);
   new C<dynamic>().test('dynamic', false);
-  new C<Null>().test('Null', isWeakMode);
+  new C<Null>().test('Null', hasUnsoundNullSafety);
   new C<Never>().test('Never', true);
 }
diff --git a/tests/language/generic/instanceof.dart b/tests/language/generic/instanceof.dart
index 547239c..d90b97e 100644
--- a/tests/language/generic/instanceof.dart
+++ b/tests/language/generic/instanceof.dart
@@ -56,7 +56,7 @@
     }
     {
       Foo foo = new Foo<List<Object>>();
-      Expect.equals(isWeakMode, foo.isT(new List.filled(5, null)));
+      Expect.equals(hasUnsoundNullSafety, foo.isT(new List.filled(5, null)));
       Expect.equals(true, foo.isT(new List<Object>.filled(5, "o")));
       Expect.equals(true, foo.isT(new List<int>.filled(5, 0)));
       Expect.equals(true, foo.isT(new List<num>.filled(5, 0)));
@@ -64,7 +64,7 @@
     }
     {
       Foo foo = new Foo<List<int>>();
-      Expect.equals(isWeakMode, foo.isT(new List.filled(5, null)));
+      Expect.equals(hasUnsoundNullSafety, foo.isT(new List.filled(5, null)));
       Expect.equals(false, foo.isT(new List<Object>.filled(5, "o")));
       Expect.equals(true, foo.isT(new List<int>.filled(5, 0)));
       Expect.equals(false, foo.isT(new List<num>.filled(5, 0)));
@@ -72,7 +72,7 @@
     }
     {
       Foo foo = new Foo<List<num>>();
-      Expect.equals(isWeakMode, foo.isT(new List.filled(5, null)));
+      Expect.equals(hasUnsoundNullSafety, foo.isT(new List.filled(5, null)));
       Expect.equals(false, foo.isT(new List<Object>.filled(5, "o")));
       Expect.equals(true, foo.isT(new List<int>.filled(5, 0)));
       Expect.equals(true, foo.isT(new List<num>.filled(5, 0)));
@@ -80,7 +80,7 @@
     }
     {
       Foo foo = new Foo<List<String>>();
-      Expect.equals(isWeakMode, foo.isT(new List.filled(5, null)));
+      Expect.equals(hasUnsoundNullSafety, foo.isT(new List.filled(5, null)));
       Expect.equals(false, foo.isT(new List<Object>.filled(5, "o")));
       Expect.equals(false, foo.isT(new List<int>.filled(5, 0)));
       Expect.equals(false, foo.isT(new List<num>.filled(5, 0)));
@@ -96,7 +96,8 @@
     }
     {
       Foo foo = new Foo<Object>();
-      Expect.equals(isWeakMode, foo.isListT(new List.filled(5, null)));
+      Expect.equals(
+          hasUnsoundNullSafety, foo.isListT(new List.filled(5, null)));
       Expect.equals(true, foo.isListT(new List<Object>.filled(5, "o")));
       Expect.equals(true, foo.isListT(new List<int>.filled(5, 0)));
       Expect.equals(true, foo.isListT(new List<num>.filled(5, 0)));
@@ -104,7 +105,8 @@
     }
     {
       Foo foo = new Foo<int>();
-      Expect.equals(isWeakMode, foo.isListT(new List.filled(5, null)));
+      Expect.equals(
+          hasUnsoundNullSafety, foo.isListT(new List.filled(5, null)));
       Expect.equals(false, foo.isListT(new List<Object>.filled(5, "o")));
       Expect.equals(true, foo.isListT(new List<int>.filled(5, 0)));
       Expect.equals(false, foo.isListT(new List<num>.filled(5, 0)));
@@ -112,7 +114,8 @@
     }
     {
       Foo foo = new Foo<num>();
-      Expect.equals(isWeakMode, foo.isListT(new List.filled(5, null)));
+      Expect.equals(
+          hasUnsoundNullSafety, foo.isListT(new List.filled(5, null)));
       Expect.equals(false, foo.isListT(new List<Object>.filled(5, "o")));
       Expect.equals(true, foo.isListT(new List<int>.filled(5, 0)));
       Expect.equals(true, foo.isListT(new List<num>.filled(5, 0)));
@@ -120,7 +123,8 @@
     }
     {
       Foo foo = new Foo<String>();
-      Expect.equals(isWeakMode, foo.isListT(new List.filled(5, null)));
+      Expect.equals(
+          hasUnsoundNullSafety, foo.isListT(new List.filled(5, null)));
       Expect.equals(false, foo.isListT(new List<Object>.filled(5, "o")));
       Expect.equals(false, foo.isListT(new List<int>.filled(5, 0)));
       Expect.equals(false, foo.isListT(new List<num>.filled(5, 0)));
diff --git a/tests/language/generic_methods/generic_class_tearoff_test.dart b/tests/language/generic_methods/generic_class_tearoff_test.dart
index 6c98ba8..28e9b8f 100644
--- a/tests/language/generic_methods/generic_class_tearoff_test.dart
+++ b/tests/language/generic_methods/generic_class_tearoff_test.dart
@@ -38,6 +38,6 @@
 
   Expect.isTrue(h is! Int2Int);
   Expect.isTrue(h is! String2String);
-  Expect.equals(isWeakMode, h is Object2Object);
+  Expect.equals(hasUnsoundNullSafety, h is Object2Object);
   Expect.isTrue(h is! GenericMethod);
 }
diff --git a/tests/language/if_null/assignment_behavior_test.dart b/tests/language/if_null/assignment_behavior_test.dart
index 9bbfe18..144ff7d 100644
--- a/tests/language/if_null/assignment_behavior_test.dart
+++ b/tests/language/if_null/assignment_behavior_test.dart
@@ -118,8 +118,10 @@
 
   void instanceTest() {
     // v ??= e is equivalent to ((x) => x == null ? v = e : x)(v)
-    vGetValue = 1; check(1, () => v ??= bad(), ['$s.v']);
-    yGetValue = 1; check(1, () => v ??= y, ['$s.v', 'y', '$s.v=1']);
+    vGetValue = 1;
+    check(1, () => v ??= bad(), ['$s.v']);
+    yGetValue = 1;
+    check(1, () => v ??= y, ['$s.v', 'y', '$s.v=1']);
     finalOne ??= null;
 //  ^^^^^^^^
 // [analyzer] COMPILE_TIME_ERROR.ASSIGNMENT_TO_FINAL
@@ -144,8 +146,10 @@
   void derivedInstanceTest() {
     // super.v ??= e is equivalent to
     // ((x) => x == null ? super.v = e : x)(super.v)
-    vGetValue = 1; check(1, () => super.v ??= bad(), ['$s.v']);
-    yGetValue = 1; check(1, () => super.v ??= y, ['$s.v', 'y', '$s.v=1']);
+    vGetValue = 1;
+    check(1, () => super.v ??= bad(), ['$s.v']);
+    yGetValue = 1;
+    check(1, () => super.v ??= y, ['$s.v', 'y', '$s.v=1']);
   }
 }
 
@@ -159,26 +163,41 @@
   new D('d').derivedInstanceTest();
 
   // v ??= e is equivalent to ((x) => x == null ? v = e : x)(v)
-  xGetValue = 1; check(1, () => x ??= bad(), ['x']);
-  yGetValue = 1; check(1, () => x ??= y, ['x', 'y', 'x=1']);
-  h.xGetValue = 1; check(1, () => h.x ??= bad(), ['h.x']);
-  yGetValue = 1; check(1, () => h.x ??= y, ['h.x', 'y', 'h.x=1']);
-  { var l = 1; check(1, () => l ??= bad(), []); }
-  //                          ^
-  // [cfe] Operand of null-aware operation '??=' has type 'int' which excludes null.
-  //                                ^^^^^
-  // [analyzer] STATIC_WARNING.DEAD_NULL_AWARE_EXPRESSION
-  { var l; yGetValue = 1; check(1, () => l ??= y, ['y']); Expect.equals(1, l); }
-  { final l = 1; l ??= null; }
-  //             ^
-  // [analyzer] COMPILE_TIME_ERROR.ASSIGNMENT_TO_FINAL_LOCAL
-  // [cfe] Can't assign to the final variable 'l'.
-  //             ^
-  // [cfe] Operand of null-aware operation '??=' has type 'int' which excludes null.
-  //                   ^^^^
-  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
-  //                   ^^^^
-  // [analyzer] STATIC_WARNING.DEAD_NULL_AWARE_EXPRESSION
+  xGetValue = 1;
+  check(1, () => x ??= bad(), ['x']);
+  yGetValue = 1;
+  check(1, () => x ??= y, ['x', 'y', 'x=1']);
+  h.xGetValue = 1;
+  check(1, () => h.x ??= bad(), ['h.x']);
+  yGetValue = 1;
+  check(1, () => h.x ??= y, ['h.x', 'y', 'h.x=1']);
+  {
+    var l = 1;
+    check(1, () => l ??= bad(), []);
+    //             ^
+    // [cfe] Operand of null-aware operation '??=' has type 'int' which excludes null.
+    //                   ^^^^^
+    // [analyzer] STATIC_WARNING.DEAD_NULL_AWARE_EXPRESSION
+  }
+  {
+    var l;
+    yGetValue = 1;
+    check(1, () => l ??= y, ['y']);
+    Expect.equals(1, l);
+  }
+  {
+    final l = 1;
+    l ??= null;
+//  ^
+// [analyzer] COMPILE_TIME_ERROR.ASSIGNMENT_TO_FINAL_LOCAL
+// [cfe] Can't assign to the final variable 'l'.
+//  ^
+// [cfe] Operand of null-aware operation '??=' has type 'int' which excludes null.
+    //    ^^^^
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+    //    ^^^^
+    // [analyzer] STATIC_WARNING.DEAD_NULL_AWARE_EXPRESSION
+  }
   C ??= null;
 //^
 // [analyzer] COMPILE_TIME_ERROR.ASSIGNMENT_TO_TYPE
@@ -195,39 +214,55 @@
 // [cfe] A prefix can't be used as an expression.
 
   // C.v ??= e is equivalent to ((x) => x == null ? C.v = e : x)(C.v)
-  C.xGetValue = 1; check(1, () => C.x ??= bad(), ['C.x']);
-  yGetValue = 1; check(1, () => C.x ??= y, ['C.x', 'y', 'C.x=1']);
-  h.C.xGetValue = 1; check(1, () => h.C.x ??= bad(), ['h.C.x']);
-  yGetValue = 1; check(1, () => h.C.x ??= y, ['h.C.x', 'y', 'h.C.x=1']);
+  C.xGetValue = 1;
+  check(1, () => C.x ??= bad(), ['C.x']);
+  yGetValue = 1;
+  check(1, () => C.x ??= y, ['C.x', 'y', 'C.x=1']);
+  h.C.xGetValue = 1;
+  check(1, () => h.C.x ??= bad(), ['h.C.x']);
+  yGetValue = 1;
+  check(1, () => h.C.x ??= y, ['h.C.x', 'y', 'h.C.x=1']);
 
   // e1.v ??= e2 is equivalent to
   // ((x) => ((y) => y == null ? x.v = e2 : y)(x.v))(e1)
-  xGetValue = new C('x'); xGetValue.vGetValue = 1;
+  xGetValue = new C('x');
+  xGetValue.vGetValue = 1;
   check(1, () => x.v ??= bad(), ['x', 'x.v']);
-  xGetValue = new C('x'); yGetValue = 1;
+  xGetValue = new C('x');
+  yGetValue = 1;
   check(1, () => x.v ??= y, ['x', 'x.v', 'y', 'x.v=1']);
-  fValue = new C('f()'); fValue.vGetValue = 1;
+  fValue = new C('f()');
+  fValue.vGetValue = 1;
   check(1, () => f().v ??= bad(), ['f()', 'f().v']);
-  fValue = new C('f()'); yGetValue = 1;
+  fValue = new C('f()');
+  yGetValue = 1;
   check(1, () => f().v ??= y, ['f()', 'f().v', 'y', 'f().v=1']);
 
   // e1[e2] ??= e3 is equivalent to
   // ((a, i) => ((x) => x == null ? a[i] = e3 : x)(a[i]))(e1, e2)
-  xGetValue = new C('x'); yGetValue = 1; xGetValue.indexGetValue = 2;
+  xGetValue = new C('x');
+  yGetValue = 1;
+  xGetValue.indexGetValue = 2;
   check(2, () => x[y] ??= bad(), ['x', 'y', 'x[1]']);
-  xGetValue = new C('x'); yGetValue = 1; zGetValue = 2;
+  xGetValue = new C('x');
+  yGetValue = 1;
+  zGetValue = 2;
   check(2, () => x[y] ??= z, ['x', 'y', 'x[1]', 'z', 'x[1]=2']);
 
   // e1?.v ??= e2 is equivalent to ((x) => x == null ? null : x.v ??= e2)(e1).
   check(null, () => x?.v ??= bad(), ['x']);
-  xGetValue = new C('x'); xGetValue.vGetValue = 1;
+  xGetValue = new C('x');
+  xGetValue.vGetValue = 1;
   check(1, () => x?.v ??= bad(), ['x', 'x.v']);
-  xGetValue = new C('x'); yGetValue = 1;
+  xGetValue = new C('x');
+  yGetValue = 1;
   check(1, () => x?.v ??= y, ['x', 'x.v', 'y', 'x.v=1']);
 
   // C?.v ??= e2 is equivalent to C.v ??= e2.
   C.xGetValue = 1;
   check(1, () => C?.x ??= bad(), ['C.x']);
+  //             ^
+  // [cfe] The class 'C' cannot be null.
   h.C.xgetValue = 1;
   //  ^^^^^^^^^
   // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_SETTER
@@ -238,6 +273,10 @@
   // [cfe] Getter not found: 'c'.
   yGetValue = 1;
   check(1, () => C?.x ??= y, ['C.x', 'y', 'C.x=1']);
+  //             ^
+  // [cfe] The class 'C' cannot be null.
   yGetValue = 1;
   check(1, () => h.C?.x ??= y, ['h.C.x', 'y', 'h.C.x=1']);
+  //               ^
+  // [cfe] The class 'C' cannot be null.
 }
diff --git a/tests/language/if_null/precedence_test.dart b/tests/language/if_null/precedence_test.dart
index abc0755..3a198d1 100644
--- a/tests/language/if_null/precedence_test.dart
+++ b/tests/language/if_null/precedence_test.dart
@@ -56,7 +56,7 @@
   // [cfe] Operand of null-aware operation '??' has type 'bool' which excludes null.
   //                                         ^^^^
   // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_OPERAND
-  // [cfe] A value of type 'Null' can't be assigned to a variable of type 'bool'.
+  // [cfe] The value 'null' can't be assigned to a variable of type 'bool' because 'bool' is not nullable.
   //                                                 ^^^^
   // [analyzer] STATIC_WARNING.DEAD_NULL_AWARE_EXPRESSION
 }
diff --git a/tests/language/is/is2_test.dart b/tests/language/is/is2_test.dart
index 93f6fb2..1d418b7 100644
--- a/tests/language/is/is2_test.dart
+++ b/tests/language/is/is2_test.dart
@@ -59,7 +59,7 @@
       var a = new List.empty();
       Expect.equals(true, a is List);
       Expect.equals(true, a is List<Object?>);
-      Expect.equals(isWeakMode, a is List<Object>);
+      Expect.equals(hasUnsoundNullSafety, a is List<Object>);
       Expect.equals(false, a is List<int>);
       Expect.equals(false, a is List<num>);
       Expect.equals(false, a is List<String>);
diff --git a/tests/language/language.status b/tests/language/language.status
index 09e7d9e..b8da9a3 100644
--- a/tests/language/language.status
+++ b/tests/language/language.status
@@ -6,7 +6,6 @@
 switch/case_warn_test: Skip # Analyzer only, see language_analyzer2.status
 
 [ $compiler != fasta ]
-nonfunction_type_aliases/*: Skip # github.com/dart-lang/language/issues/115
 value_class/*: Skip # Internship, jlcontreras
 
 [ $compiler == none ]
diff --git a/tests/language/least_upper_bound/least_upper_bound_function_test.dart b/tests/language/least_upper_bound/least_upper_bound_function_test.dart
index 0ae3e16..43012cff 100644
--- a/tests/language/least_upper_bound/least_upper_bound_function_test.dart
+++ b/tests/language/least_upper_bound/least_upper_bound_function_test.dart
@@ -28,15 +28,19 @@
 
   void f4(FutureOr<Function?> x, Function(int i, {int j}) y) {
     var z = condition ? x : y;
+    // Expecting `Object?`. Check that the type is a top type.
     z.expectStaticType<Exactly<Object?>>();
+    // Check that it is `Object?`.
+    if (z == null) throw 0;
+    z.expectStaticType<Exactly<Object>>();
   }
 
   void f5(Function Function<Y>([Y y]) x, dynamic y) {
     var z = condition ? x : y;
-    // Check that the type is a top type.
-    z.expectStaticType<Exactly<dynamic>>();
-    // Check that the type is `dynamic`.
-    z.unknownMember;
+    // Check that the type of `z` is `dynamic`.
+    Never n = z; // It is `dynamic` or `Never`.
+    z = 0; // It is a supertype of `int`.
+    z = false; // It is a supertype of `bool`.
   }
 
   void f6(Never x, Never Function() y) {
diff --git a/tests/language/least_upper_bound/least_upper_bound_futureor_test.dart b/tests/language/least_upper_bound/least_upper_bound_futureor_test.dart
index 02569eb..82cace6 100644
--- a/tests/language/least_upper_bound/least_upper_bound_futureor_test.dart
+++ b/tests/language/least_upper_bound/least_upper_bound_futureor_test.dart
@@ -206,16 +206,16 @@
 
   void f20(dynamic a, FutureOr<void> b) {
     var x = condition ? a : b;
-    // Verify that the type of `x` is a top type.
-    x.expectStaticType<Exactly<dynamic>>();
-    // Verify that it is `dynamic`.
-    x.unknownMember();
+    // Verify that the type of `x` is `dynamic`.
+    Never n = x; // It is `dynamic` or `Never`.
+    x = 0; // It is a supertype of `int`.
+    x = false; // It is a supertype of `bool`.
 
     var y = condition ? b : a;
-    // Verify that the type of `y` is a top type.
-    y.expectStaticType<Exactly<dynamic>>();
-    // Verify that it is `dynamic`.
-    y.unknownMember();
+    // Verify that the type of `y` is `dynamic`.
+    n = y;
+    y = 0;
+    y = false;
   }
 
   void f21(A a, B b) {
diff --git a/tests/language/list/literal6_test.dart b/tests/language/list/literal6_test.dart
index 7d6e3d9..f066509 100644
--- a/tests/language/list/literal6_test.dart
+++ b/tests/language/list/literal6_test.dart
@@ -9,7 +9,7 @@
     // Type parameter is not allowed with const.
     var m = const <T>[];
     //             ^
-    // [analyzer] COMPILE_TIME_ERROR.INVALID_TYPE_ARGUMENT_IN_CONST_LIST
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_TYPE_ARGUMENT_IN_CONST_LITERAL
     // [cfe] Type variables can't be used as constants.
   }
 }
diff --git a/tests/language/map/literal14_test.dart b/tests/language/map/literal14_test.dart
index 4351eb9..1b4108f 100644
--- a/tests/language/map/literal14_test.dart
+++ b/tests/language/map/literal14_test.dart
@@ -8,7 +8,7 @@
   test() {
     var m = const <String, T>{};
     //                     ^
-    // [analyzer] COMPILE_TIME_ERROR.INVALID_TYPE_ARGUMENT_IN_CONST_MAP
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_TYPE_ARGUMENT_IN_CONST_LITERAL
     // [cfe] Type variables can't be used as constants.
   }
 }
diff --git a/tests/language/metadata/metadata_location_part.dart b/tests/language/metadata/metadata_location_part.dart
new file mode 100644
index 0000000..ae1bb39
--- /dev/null
+++ b/tests/language/metadata/metadata_location_part.dart
@@ -0,0 +1,2 @@
+@m
+part of 'metadata_location_test.dart';
diff --git a/tests/language/metadata/metadata_location_test.dart b/tests/language/metadata/metadata_location_test.dart
new file mode 100644
index 0000000..8e7c225
--- /dev/null
+++ b/tests/language/metadata/metadata_location_test.dart
@@ -0,0 +1,177 @@
+// Copyright (c) 2020, 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.
+
+// Test that metadata can be located everywhere the grammar specifies that
+// it can occur, with a few variants especially for parameter locations.
+
+@m
+library metadata.location.test;
+
+@m
+import 'dart:async';
+
+@m
+export 'dart:async';
+
+@m
+part 'metadata_location_part.dart';
+
+@m
+const m = 0;
+
+@m
+void f1(@m p1, @m int p2, [@m p3, @m int? p4]) {}
+
+@m
+void f2({@m p1, @m int? p2}) {}
+
+@m
+void f3(@m p1(), @m int p2()) {}
+
+@m
+class C {
+  @m
+  var x, y, z, w;
+
+  @m
+  covariant var u, v;
+
+  @m
+  C(@m this.x, @m int this.y,
+      {@m this.z, @m int? this.w, @m this.u()?, @m int this.v()?});
+
+  @m
+  void f1(@m p1, @m int p2, [@m p3, @m int? p4]) {}
+
+  @m
+  void f2({@m p1, @m int? p2}) {}
+
+  @m
+  void f3(@m covariant p1, @m covariant int p2,
+      [@m covariant p3, @m covariant int? p4]) {}
+
+  @m
+  void f4({@m covariant p1, @m covariant int? p2}) {}
+
+  @m
+  static void f1s(@m p1, @m int p2, [@m p3, @m int? p4]) {}
+
+  @m
+  static void f2s({@m p1, @m int? p2}) {}
+
+  @m
+  int get prop => 0;
+
+  @m
+  set prop(@m int _) {}
+
+  @m
+  static int get staticProp => 0;
+
+  @m
+  static set staticProp(@m int _) {}
+
+  @m
+  bool operator ==(@m other) => true;
+}
+
+@m
+mixin M {
+  @m
+  var x, y, z, w, u, v;
+
+  @m
+  void f1(@m p1, @m int p2, [@m p3, @m int p4 = 0]) {}
+
+  @m
+  void f2({@m p1, @m int p2 = 0}) {}
+
+  @m
+  void f3(@m covariant p1, @m covariant int p2,
+      [@m covariant p3, @m covariant int p4 = 0]) {}
+
+  @m
+  void f4({@m covariant p1, @m covariant int p2 = 0}) {}
+
+  @m
+  static void f1s(@m p1, @m int p2, [@m p3, @m int? p4]) {}
+
+  @m
+  static void f2s({@m p1, @m int? p2}) {}
+
+  @m
+  int get prop => 0;
+
+  @m
+  set prop(@m int _) {}
+
+  @m
+  static int get staticProp => 0;
+
+  @m
+  static set staticProp(@m int _) {}
+
+  @m
+  bool operator ==(@m other) => true;
+}
+
+@m
+extension Extension on int {
+  @m
+  void f1(@m p1, @m int p2, [@m p3, @m int p4 = 0]) {}
+
+  @m
+  void f2({@m p1, @m int p2 = 0}) {}
+
+  @m
+  static void f1s(@m p1, @m int p2, [@m p3, @m int? p4]) {}
+
+  @m
+  static void f2s({@m p1, @m int? p2}) {}
+
+  @m
+  int get prop => 0;
+
+  @m
+  set prop(@m int _) {}
+
+  @m
+  static int get staticProp => 0;
+
+  @m
+  static set staticProp(@m int _) {}
+}
+
+@m
+enum E {
+  @m
+  one,
+  @m
+  two,
+}
+
+void f<@m X>() {}
+
+class D<@m X> {}
+
+@m
+typedef void F1<@m X>();
+
+@m
+typedef F2<@m X>= void Function();
+
+@m
+void main() {
+  @m
+  var x;
+
+  @m
+  void f() {}
+
+  for (@m
+  int i = 0;
+      i < 1;
+      i++) {}
+  for (@m int i in []) {}
+}
diff --git a/tests/language/nnbd/boolean_conversion/boolean_conversion_error_test.dart b/tests/language/nnbd/boolean_conversion/boolean_conversion_error_test.dart
index a0bdcf7..4a0527c 100644
--- a/tests/language/nnbd/boolean_conversion/boolean_conversion_error_test.dart
+++ b/tests/language/nnbd/boolean_conversion/boolean_conversion_error_test.dart
@@ -57,47 +57,47 @@
     if (nil) {}
     //  ^^^
     // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
-    // [cfe] A value of type 'Null' can't be assigned to a variable of type 'bool'.
+    // [cfe] A value of type 'Null' can't be assigned to a variable of type 'bool' because 'bool' is not nullable.
     [if (nil) 3];
     //   ^^^
     // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
-    // [cfe] A value of type 'Null' can't be assigned to a variable of type 'bool'.
+    // [cfe] A value of type 'Null' can't be assigned to a variable of type 'bool' because 'bool' is not nullable.
     nil ? 3 : 4;
 //  ^^^
 // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
-// [cfe] A value of type 'Null' can't be assigned to a variable of type 'bool'.
+// [cfe] A value of type 'Null' can't be assigned to a variable of type 'bool' because 'bool' is not nullable.
     while (nil) {}
     //     ^^^
     // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
-    // [cfe] A value of type 'Null' can't be assigned to a variable of type 'bool'.
+    // [cfe] A value of type 'Null' can't be assigned to a variable of type 'bool' because 'bool' is not nullable.
     do {} while (nil);
     //           ^^^
     // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
-    // [cfe] A value of type 'Null' can't be assigned to a variable of type 'bool'.
+    // [cfe] A value of type 'Null' can't be assigned to a variable of type 'bool' because 'bool' is not nullable.
     nil || true;
 //  ^^^
 // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_OPERAND
-// [cfe] A value of type 'Null' can't be assigned to a variable of type 'bool'.
+// [cfe] A value of type 'Null' can't be assigned to a variable of type 'bool' because 'bool' is not nullable.
     nil && true;
 //  ^^^
 // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_OPERAND
-// [cfe] A value of type 'Null' can't be assigned to a variable of type 'bool'.
+// [cfe] A value of type 'Null' can't be assigned to a variable of type 'bool' because 'bool' is not nullable.
     true || nil;
     //      ^^^
     // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_OPERAND
-    // [cfe] A value of type 'Null' can't be assigned to a variable of type 'bool'.
+    // [cfe] A value of type 'Null' can't be assigned to a variable of type 'bool' because 'bool' is not nullable.
     true && nil;
     //      ^^^
     // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_OPERAND
-    // [cfe] A value of type 'Null' can't be assigned to a variable of type 'bool'.
+    // [cfe] A value of type 'Null' can't be assigned to a variable of type 'bool' because 'bool' is not nullable.
     for (int i = 0; nil; i++) {}
     //              ^^^
     // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
-    // [cfe] A value of type 'Null' can't be assigned to a variable of type 'bool'.
+    // [cfe] A value of type 'Null' can't be assigned to a variable of type 'bool' because 'bool' is not nullable.
     [for (int i = 0; nil; i++) 3];
     //               ^^^
     // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
-    // [cfe] A value of type 'Null' can't be assigned to a variable of type 'bool'.
+    // [cfe] A value of type 'Null' can't be assigned to a variable of type 'bool' because 'bool' is not nullable.
   }
   {
     // Check that values of type `Object` are not usable as booleans.
diff --git a/tests/language/nnbd/constant_null_safety_mode_test.dart b/tests/language/nnbd/constant_null_safety_mode_test.dart
index 131a2ff..6e89c75 100644
--- a/tests/language/nnbd/constant_null_safety_mode_test.dart
+++ b/tests/language/nnbd/constant_null_safety_mode_test.dart
@@ -5,15 +5,15 @@
 import 'package:expect/expect.dart';
 
 main() {
-  const trueInWeakMode = <Null>[] is List<int>;
-  Expect.equals(isWeakMode, trueInWeakMode);
+  const trueInNoSoundMode = <Null>[] is List<int>;
+  Expect.equals(hasUnsoundNullSafety, trueInNoSoundMode);
 
   // The following tests use the Uri.pathSegments() to access a constant list
   // that is defined in the SDK and verify the type associated with it does not
   // allow null when running with sound null safety.
   var emptyUri = Uri(pathSegments: []);
   dynamic stringList = emptyUri.pathSegments.toList();
-  if (isStrongMode) {
+  if (hasSoundNullSafety) {
     Expect.throwsTypeError(() {
       stringList.add(null);
     });
diff --git a/tests/language/nnbd/experiment_release_version/opt_in_test.dart b/tests/language/nnbd/experiment_release_version/opt_in_test.dart
index f715e5f..b6334ed 100644
--- a/tests/language/nnbd/experiment_release_version/opt_in_test.dart
+++ b/tests/language/nnbd/experiment_release_version/opt_in_test.dart
@@ -4,12 +4,12 @@
 
 // This version should continue to opt in to null safety in purpetuity (or at
 // least until Dart 3), when the experiment is enabled.
-// @dart = 2.10
+// @dart = 2.12
 
 void main() {
   // This should be an error since we are opted in.
   int x = null;
   //      ^^^^
   // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
-  // [cfe] A value of type 'Null' can't be assigned to a variable of type 'int'.
+  // [cfe] The value 'null' can't be assigned to a variable of type 'int' because 'int' is not nullable.
 }
diff --git a/tests/language/nnbd/extreme_bounds/superinterfaces_null_safe_lib.dart b/tests/language/nnbd/extreme_bounds/superinterfaces_null_safe_lib.dart
index 93e4ad2..3025e83 100644
--- a/tests/language/nnbd/extreme_bounds/superinterfaces_null_safe_lib.dart
+++ b/tests/language/nnbd/extreme_bounds/superinterfaces_null_safe_lib.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.
 
-// @dart = 2.10
-
 // This library establishes an opted in class hierarchy which has a single
 // non-generic top element, with a generic element below it, and a null safety
 // specific instantantiation of the generic below that.  This is used to test
diff --git a/tests/language/nnbd/extreme_bounds/superinterfaces_out_of_order_error_test.dart b/tests/language/nnbd/extreme_bounds/superinterfaces_out_of_order_error_test.dart
index 50e53c2..dbd31a3 100644
--- a/tests/language/nnbd/extreme_bounds/superinterfaces_out_of_order_error_test.dart
+++ b/tests/language/nnbd/extreme_bounds/superinterfaces_out_of_order_error_test.dart
@@ -4,8 +4,6 @@
 
 // Requirements=nnbd-weak
 
-// @dart = 2.10
-
 // Test that upper bound computations which rely on the computations of the
 // cardinality of the superinterface sets define those sets without erasing or
 // modifying the superinterfaces.
diff --git a/tests/language/nnbd/inference/late_variable_type_for_promotion_test.dart b/tests/language/nnbd/inference/late_variable_type_for_promotion_test.dart
index d6223d5..11a3d2b 100644
--- a/tests/language/nnbd/inference/late_variable_type_for_promotion_test.dart
+++ b/tests/language/nnbd/inference/late_variable_type_for_promotion_test.dart
@@ -95,9 +95,14 @@
 }
 
 void uninitializedUntyped() {
-  late x;
+  late var x;
   x = 0;
-  x.expectStaticType<Exactly<dynamic>>();
+  if (false) {
+    // Check that the static type of [x] is dynamic:
+    Never n = x;
+    x = 0;
+    x = false;
+  }
   // Attempting to promote to `int?` should be ok, since `int?` is a subtype of
   // `dynamic`.
   if (x is int?) {
diff --git a/tests/language/nnbd/never/never_null_assignability_error_test.dart b/tests/language/nnbd/never/never_null_assignability_error_test.dart
index a598dfd..ee485d9 100644
--- a/tests/language/nnbd/never/never_null_assignability_error_test.dart
+++ b/tests/language/nnbd/never/never_null_assignability_error_test.dart
@@ -7,6 +7,7 @@
 
 // This test validates that in a null safe (opted in) library which calls out
 // to another null safe (opted in) library, the static errors around `Never`
+
 // and `Null` that are suppressed when calling out a null safe library from
 // a **legacy** library are correctly reported.  This file is derived from
 // never_null_assignability_weak_test.dart and validates that calls to a
@@ -28,7 +29,7 @@
     takesNever(nil);
     //         ^^^
     // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
-    // [cfe] The argument type 'Null' can't be assigned to the parameter type 'Never'.
+    // [cfe] The argument type 'Null' can't be assigned to the parameter type 'Never' because 'Never' is not nullable.
     takesNever(never);
     takesNever(3 as dynamic);
     (takesNever as dynamic)(3);
@@ -40,7 +41,7 @@
     takesInt(nil);
     //       ^^^
     // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
-    // [cfe] The argument type 'Null' can't be assigned to the parameter type 'int'.
+    // [cfe] The argument type 'Null' can't be assigned to the parameter type 'int' because 'int' is not nullable.
     takesInt(nil as dynamic);
     (takesInt as dynamic)(nil);
     (takesInt as dynamic)("hello");
@@ -52,7 +53,7 @@
     takesObject(nil);
     //          ^^^
     // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
-    // [cfe] The argument type 'Null' can't be assigned to the parameter type 'Object'.
+    // [cfe] The argument type 'Null' can't be assigned to the parameter type 'Object' because 'Object' is not nullable.
     takesObject(nil as dynamic);
     (takesObject as dynamic)(nil);
   }
@@ -74,17 +75,17 @@
     applyTakesNull(takesNever, nil);
     //             ^^^^^^^^^^
     // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
-    // [cfe] The argument type 'void Function(Never)' can't be assigned to the parameter type 'void Function(Null)'.
+    // [cfe] The argument type 'void Function(Never)' can't be assigned to the parameter type 'void Function(Null)' because 'Null' is nullable and 'Never' isn't.
     applyTakesNull(takesAny, nil);
 
     applyTakesNull(takesInt, nil);
     //             ^^^^^^^^
     // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
-    // [cfe] The argument type 'void Function(int)' can't be assigned to the parameter type 'void Function(Null)'.
+    // [cfe] The argument type 'void Function(int)' can't be assigned to the parameter type 'void Function(Null)' because 'Null' is nullable and 'int' isn't.
     applyTakesNull(takesObject, nil);
     //             ^^^^^^^^^^^
     // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
-    // [cfe] The argument type 'void Function(Object)' can't be assigned to the parameter type 'void Function(Null)'.
+    // [cfe] The argument type 'void Function(Object)' can't be assigned to the parameter type 'void Function(Null)' because 'Null' is nullable and 'Object' isn't.
   }
 
   // Test applying a null safe function of static type void Function(Null)
@@ -95,15 +96,15 @@
     applyTakesNull(takesNever, 3);
     //             ^^^^^^^^^^
     // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
-    // [cfe] The argument type 'void Function(Never)' can't be assigned to the parameter type 'void Function(Null)'.
+    // [cfe] The argument type 'void Function(Never)' can't be assigned to the parameter type 'void Function(Null)' because 'Null' is nullable and 'Never' isn't.
     applyTakesNull(takesInt, 3);
     //             ^^^^^^^^
     // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
-    // [cfe] The argument type 'void Function(int)' can't be assigned to the parameter type 'void Function(Null)'.
+    // [cfe] The argument type 'void Function(int)' can't be assigned to the parameter type 'void Function(Null)' because 'Null' is nullable and 'int' isn't.
     applyTakesNull(takesObject, 3);
     //             ^^^^^^^^^^^
     // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
-    // [cfe] The argument type 'void Function(Object)' can't be assigned to the parameter type 'void Function(Null)'.
+    // [cfe] The argument type 'void Function(Object)' can't be assigned to the parameter type 'void Function(Null)' because 'Null' is nullable and 'Object' isn't.
     applyTakesNull(takesAny, 3);
   }
 
@@ -139,16 +140,16 @@
     applyTakesNullDynamically(takesNever, nil);
     //                        ^^^^^^^^^^
     // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
-    // [cfe] The argument type 'void Function(Never)' can't be assigned to the parameter type 'void Function(Null)'.
+    // [cfe] The argument type 'void Function(Never)' can't be assigned to the parameter type 'void Function(Null)' because 'Null' is nullable and 'Never' isn't.
     applyTakesNullDynamically(takesAny, nil);
     applyTakesNullDynamically(takesInt, nil);
     //                        ^^^^^^^^
     // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
-    // [cfe] The argument type 'void Function(int)' can't be assigned to the parameter type 'void Function(Null)'.
+    // [cfe] The argument type 'void Function(int)' can't be assigned to the parameter type 'void Function(Null)' because 'Null' is nullable and 'int' isn't.
     applyTakesNullDynamically(takesObject, nil);
     //                        ^^^^^^^^^^^
     // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
-    // [cfe] The argument type 'void Function(Object)' can't be assigned to the parameter type 'void Function(Null)'.
+    // [cfe] The argument type 'void Function(Object)' can't be assigned to the parameter type 'void Function(Null)' because 'Null' is nullable and 'Object' isn't.
   }
 
   // Test dynamically applying a null safe function of static type
@@ -159,19 +160,19 @@
     applyTakesNullDynamically(takesNever, 3);
     //                        ^^^^^^^^^^
     // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
-    // [cfe] The argument type 'void Function(Never)' can't be assigned to the parameter type 'void Function(Null)'.
+    // [cfe] The argument type 'void Function(Never)' can't be assigned to the parameter type 'void Function(Null)' because 'Null' is nullable and 'Never' isn't.
     applyTakesNullDynamically(takesInt, 3);
     //                        ^^^^^^^^
     // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
-    // [cfe] The argument type 'void Function(int)' can't be assigned to the parameter type 'void Function(Null)'.
+    // [cfe] The argument type 'void Function(int)' can't be assigned to the parameter type 'void Function(Null)' because 'Null' is nullable and 'int' isn't.
     applyTakesNullDynamically(takesInt, "hello");
     //                        ^^^^^^^^
     // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
-    // [cfe] The argument type 'void Function(int)' can't be assigned to the parameter type 'void Function(Null)'.
+    // [cfe] The argument type 'void Function(int)' can't be assigned to the parameter type 'void Function(Null)' because 'Null' is nullable and 'int' isn't.
     applyTakesNullDynamically(takesObject, 3);
     //                        ^^^^^^^^^^^
     // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
-    // [cfe] The argument type 'void Function(Object)' can't be assigned to the parameter type 'void Function(Null)'.
+    // [cfe] The argument type 'void Function(Object)' can't be assigned to the parameter type 'void Function(Null)' because 'Null' is nullable and 'Object' isn't.
     applyTakesNullDynamically(takesAny, 3);
   }
 
@@ -204,12 +205,12 @@
   // ^
   // [analyzer] unspecified
   //      ^
-  // [cfe] A value of type 'Null' can't be assigned to a variable of type 'Never'.
+  // [cfe] The value 'null' can't be assigned to a variable of type 'Never' because 'Never' is not nullable.
   never = nil;
   // ^
   // [analyzer] unspecified
   //      ^
-  // [cfe] A value of type 'Null' can't be assigned to a variable of type 'Never'.
+  // [cfe] A value of type 'Null' can't be assigned to a variable of type 'Never' because 'Never' is not nullable.
   nil = never;
   testNullSafeCalls();
   testNullSafeApply();
diff --git a/tests/language/nnbd/operator_type_test.dart b/tests/language/nnbd/operator_type_test.dart
index d9024fc..436ddda 100644
--- a/tests/language/nnbd/operator_type_test.dart
+++ b/tests/language/nnbd/operator_type_test.dart
@@ -27,52 +27,52 @@
   _ = bq && b;
   //  ^^
   // [analyzer] unspecified
-  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
 
   _ = b && bq;
   //       ^^
   // [analyzer] unspecified
-  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
 
   _ = bq || b;
   //  ^^
   // [analyzer] unspecified
-  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
 
   _ = b || bq;
   //       ^^
   // [analyzer] unspecified
-  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
 
   _ = !bq;
   //   ^^
   // [analyzer] unspecified
-  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
 
   _ = bq ? "a" : "b";
   //  ^^
   // [analyzer] unspecified
-  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
 
   if (bq) {}
   //  ^^
   // [analyzer] unspecified
-  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
 
   while (bq) {}
   //     ^^
   // [analyzer] unspecified
-  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
 
   do {} while (bq);
   //           ^^
   // [analyzer] unspecified
-  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
 
   for (; bq;) {}
   //     ^^
   // [analyzer] unspecified
-  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
 
   try {
     throw bq;
@@ -84,24 +84,24 @@
   assert(bq);
   //     ^^
   // [analyzer] unspecified
-  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
 
   _ = [if (bq) 1];
   //       ^^
   // [analyzer] unspecified
-  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
 
   _ = [for (; bq;) 1];
   //         ^^
   // [analyzer] unspecified
   //          ^
-  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
 
   Iterable<int>? iq = maybeNullable([1]);
   for (var v in iq) {}
   //            ^^
   // [analyzer] unspecified
-  // [cfe] The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+  // [cfe] The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'Iterable<int>?' is nullable and 'Iterable<dynamic>' isn't.
 
   _ = [...iq];
   //      ^
@@ -114,12 +114,12 @@
     await for (var v in sq) {}
     //                  ^^
     // [analyzer] unspecified
-    // [cfe] The type 'Stream<int>?' used in the 'for' loop must implement 'Stream<dynamic>'.
+    // [cfe] The type 'Stream<int>?' used in the 'for' loop must implement 'Stream<dynamic>' because 'Stream<int>?' is nullable and 'Stream<dynamic>' isn't.
 
     yield* sq;
     //     ^^
     // [analyzer] unspecified
-    // [cfe] A value of type 'Stream<int>?' can't be assigned to a variable of type 'Stream<Object?>'.
+    // [cfe] A value of type 'Stream<int>?' can't be assigned to a variable of type 'Stream<Object?>' because 'Stream<int>?' is nullable and 'Stream<Object?>' isn't.
   }
 
   foo().toList();
@@ -140,52 +140,52 @@
   _ = bq && b;
   //  ^^
   // [analyzer] unspecified
-  // [cfe] A value of type 'BQ' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'BQ' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
 
   _ = b && bq;
   //       ^^
   // [analyzer] unspecified
-  // [cfe] A value of type 'BQ' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'BQ' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
 
   _ = bq || b;
   //  ^^
   // [analyzer] unspecified
-  // [cfe] A value of type 'BQ' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'BQ' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
 
   _ = b || bq;
   //       ^^
   // [analyzer] unspecified
-  // [cfe] A value of type 'BQ' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'BQ' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
 
   _ = !bq;
   //   ^^
   // [analyzer] unspecified
-  // [cfe] A value of type 'BQ' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'BQ' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
 
   _ = bq ? "a" : "b";
   //  ^^
   // [analyzer] unspecified
-  // [cfe] A value of type 'BQ' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'BQ' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
 
   if (bq) {}
   //  ^^
   // [analyzer] unspecified
-  // [cfe] A value of type 'BQ' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'BQ' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
 
   while (bq) {}
   //     ^^
   // [analyzer] unspecified
-  // [cfe] A value of type 'BQ' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'BQ' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
 
   do {} while (bq);
   //           ^^
   // [analyzer] unspecified
-  // [cfe] A value of type 'BQ' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'BQ' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
 
   for (; bq;) {}
   //     ^^
   // [analyzer] unspecified
-  // [cfe] A value of type 'BQ' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'BQ' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
 
   try {
     throw bq;
@@ -197,24 +197,24 @@
   assert(bq);
   //     ^^
   // [analyzer] unspecified
-  // [cfe] A value of type 'BQ' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'BQ' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
 
   _ = [if (bq) 1];
   //       ^^
   // [analyzer] unspecified
-  // [cfe] A value of type 'BQ' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'BQ' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
 
   _ = [for (; bq;) 1];
   //         ^^
   // [analyzer] unspecified
   //          ^
-  // [cfe] A value of type 'BQ' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'BQ' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
 
   Iterable<int>? iq = maybeNullable([1]);
   for (var v in iq) {}
   //            ^^
   // [analyzer] unspecified
-  // [cfe] The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+  // [cfe] The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'Iterable<int>?' is nullable and 'Iterable<dynamic>' isn't.
 
   _ = [...iq];
   //      ^^
@@ -226,12 +226,12 @@
     await for (var v in sq) {}
     //                  ^^
     // [analyzer] unspecified
-    // [cfe] The type 'Stream<Object?>?' used in the 'for' loop must implement 'Stream<dynamic>'.
+    // [cfe] The type 'Stream<Object?>?' used in the 'for' loop must implement 'Stream<dynamic>' because 'Stream<Object?>?' is nullable and 'Stream<dynamic>' isn't.
 
     yield* sq;
     //     ^^
     // [analyzer] unspecified
-    // [cfe] A value of type 'SQ' can't be assigned to a variable of type 'Stream<Object?>'.
+    // [cfe] A value of type 'SQ' can't be assigned to a variable of type 'Stream<Object?>' because 'Stream<Object?>?' is nullable and 'Stream<Object?>' isn't.
   }
 
   foo<Stream<Object?>>().toList();
@@ -253,7 +253,7 @@
     return cq;
     //     ^^
     // [analyzer] unspecified
-    // [cfe] A value of type 'C?' can't be returned from a function with return type 'C'.
+    // [cfe] A value of type 'C?' can't be returned from a function with return type 'C' because 'C?' is nullable and 'C' isn't.
   }
 }
 
diff --git a/tests/language/nnbd/syntax/class_member_declarations_error_test.dart b/tests/language/nnbd/syntax/class_member_declarations_error_test.dart
index 607e46f..e78643e 100644
--- a/tests/language/nnbd/syntax/class_member_declarations_error_test.dart
+++ b/tests/language/nnbd/syntax/class_member_declarations_error_test.dart
@@ -34,7 +34,7 @@
   // [cfe] The modifier 'late' should be before the modifier 'final'.
   //                        ^^^^
   // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
-  // [cfe] A value of type 'Null' can't be assigned to a variable of type 'A'.
+  // [cfe] The value 'null' can't be assigned to a variable of type 'A' because 'A' is not nullable.
 
   covariant late x15;
   //        ^^^^
diff --git a/tests/language/nnbd/typedef/typedef_error_test.dart b/tests/language/nnbd/typedef/typedef_error_test.dart
index 17488a5..76c8f69 100644
--- a/tests/language/nnbd/typedef/typedef_error_test.dart
+++ b/tests/language/nnbd/typedef/typedef_error_test.dart
@@ -14,7 +14,7 @@
   F f = null; // typedefs from opted out libraries are treated as non-nullable
   //    ^^^^
   // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
-  // [cfe] A value of type 'Null' can't be assigned to a variable of type 'int Function(int)'.
+  // [cfe] The value 'null' can't be assigned to a variable of type 'int Function(int)' because 'int Function(int)' is not nullable.
 
   f = takesNonNullable; // F is int* Function(int*)
   f(null); // F is int* Function(int*)
diff --git a/tests/language/nonfunction_type_aliases/cyclic_bound_error_test.dart b/tests/language/nonfunction_type_aliases/cyclic_bound_error_test.dart
new file mode 100644
index 0000000..f3825db
--- /dev/null
+++ b/tests/language/nonfunction_type_aliases/cyclic_bound_error_test.dart
@@ -0,0 +1,65 @@
+// Copyright (c) 2020, 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.
+
+// SharedOptions=--enable-experiment=nonfunction-type-aliases
+
+// This test verifies that cyclic type alias definitions cause a compile-time
+// error, when the cycle occurs via the bound.
+
+typedef T1<X extends T1<Never>> = List<X>;
+//      ^
+// [analyzer] unspecified
+// [cfe] unspecified
+
+// Note: when the cycle involves two typedefs, the CFE only reports an error for
+// one of them; that's ok.
+typedef T2<X extends T3> = List<X>;
+//      ^
+// [analyzer] unspecified
+
+typedef T3 = T2<Never>;
+//      ^
+// [analyzer] unspecified
+// [cfe] unspecified
+
+typedef T4<X extends List<T4<Never>>> = List<X>;
+//      ^
+// [analyzer] unspecified
+// [cfe] unspecified
+
+typedef T5<X extends T5<Never> Function()> = List<X>;
+//      ^
+// [analyzer] unspecified
+// [cfe] unspecified
+
+typedef T6<X extends void Function(T6<Never>)> = List<X>;
+//      ^
+// [analyzer] unspecified
+// [cfe] unspecified
+
+// Note: not an error because T7 is the name of the parameter.
+typedef T7<X extends void Function(int T7)> = List<X>;
+
+typedef T8<X extends void Function([T8<Never>])> = List<X>;
+//      ^
+// [analyzer] unspecified
+// [cfe] unspecified
+
+// Note: not an error because T9 is the name of the parameter.
+typedef T9<X extends void Function([int T9])> = List<X>;
+
+typedef T10<X extends void Function({T10<Never> x})> = List<X>;
+//      ^
+// [analyzer] unspecified
+// [cfe] unspecified
+
+// Note: not an error because T11 is the name of the parameter.
+typedef T11<X extends void Function({int T11})> = List<X>;
+
+// Note: we have to use `void Function<...>() Function()` because a generic
+// function can't directly be used as a bound.
+typedef T12<X extends void Function<Y extends T12<Never>>() Function()> = List<X>;
+//      ^
+// [analyzer] unspecified
+// [cfe] unspecified
diff --git a/tests/language/nonfunction_type_aliases/cyclic_bound_unused_error_test.dart b/tests/language/nonfunction_type_aliases/cyclic_bound_unused_error_test.dart
new file mode 100644
index 0000000..b77593f
--- /dev/null
+++ b/tests/language/nonfunction_type_aliases/cyclic_bound_unused_error_test.dart
@@ -0,0 +1,66 @@
+// Copyright (c) 2020, 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.
+
+// SharedOptions=--enable-experiment=nonfunction-type-aliases
+
+// This test verifies that cyclic type alias definitions cause a compile-time
+// error, when the cycle occurs via the bound, even if the bound variable is not
+// used in the expansion.
+
+typedef T1<X extends T1<Never>> = int;
+//      ^
+// [analyzer] unspecified
+// [cfe] unspecified
+
+// Note: when the cycle involves two typedefs, the CFE only reports an error for
+// one of them; that's ok.
+typedef T2<X extends T3> = int;
+//      ^
+// [analyzer] unspecified
+
+typedef T3 = T2<Never>;
+//      ^
+// [analyzer] unspecified
+// [cfe] unspecified
+
+typedef T4<X extends List<T4<Never>>> = int;
+//      ^
+// [analyzer] unspecified
+// [cfe] unspecified
+
+typedef T5<X extends T5<Never> Function()> = int;
+//      ^
+// [analyzer] unspecified
+// [cfe] unspecified
+
+typedef T6<X extends void Function(T6<Never>)> = int;
+//      ^
+// [analyzer] unspecified
+// [cfe] unspecified
+
+// Note: not an error because T7 is the name of the parameter.
+typedef T7<X extends void Function(int T7)> = int;
+
+typedef T8<X extends void Function([T8<Never>])> = int;
+//      ^
+// [analyzer] unspecified
+// [cfe] unspecified
+
+// Note: not an error because T9 is the name of the parameter.
+typedef T9<X extends void Function([int T9])> = int;
+
+typedef T10<X extends void Function({T10<Never> x})> = int;
+//      ^
+// [analyzer] unspecified
+// [cfe] unspecified
+
+// Note: not an error because T11 is the name of the parameter.
+typedef T11<X extends void Function({int T11})> = int;
+
+// Note: we have to use `void Function<...>() Function()` because a generic
+// function can't directly be used as a bound.
+typedef T12<X extends void Function<Y extends T12<Never>>() Function()> = int;
+//      ^
+// [analyzer] unspecified
+// [cfe] unspecified
diff --git a/tests/language/nonfunction_type_aliases/cyclic_expansion_error_test.dart b/tests/language/nonfunction_type_aliases/cyclic_expansion_error_test.dart
new file mode 100644
index 0000000..8b5b3df
--- /dev/null
+++ b/tests/language/nonfunction_type_aliases/cyclic_expansion_error_test.dart
@@ -0,0 +1,70 @@
+// Copyright (c) 2020, 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.
+
+// SharedOptions=--enable-experiment=nonfunction-type-aliases
+
+// This test verifies that cyclic type alias definitions cause a compile-time
+// error, when the cycle occurs via the expansion of the type.
+
+typedef T1 = List<T1>;
+//      ^
+// [analyzer] unspecified
+// [cfe] unspecified
+
+typedef T2 = List<T3>;
+//      ^
+// [analyzer] unspecified
+// [cfe] unspecified
+
+// Note: when the cycle involves two typedefs, the CFE only reports an error for
+// one of them; that's ok.
+typedef T3 = List<T2>;
+//      ^
+// [analyzer] unspecified
+
+typedef T4 = T4;
+//      ^
+// [analyzer] unspecified
+// [cfe] unspecified
+
+typedef T5 = T5?;
+//      ^
+// [analyzer] unspecified
+// [cfe] unspecified
+
+typedef T6 = List<T6 Function()>;
+//      ^
+// [analyzer] unspecified
+// [cfe] unspecified
+
+typedef T7 = List<void Function(T7)>;
+//      ^
+// [analyzer] unspecified
+// [cfe] unspecified
+
+// Note: not an error because T8 is the name of the parameter.
+typedef T8 = List<void Function(int T8)>;
+
+typedef T9 = List<void Function([T9])>;
+//      ^
+// [analyzer] unspecified
+// [cfe] unspecified
+
+// Note: not an error because T10 is the name of the parameter.
+typedef T10 = List<void Function([int T10])>;
+
+typedef T11 = List<void Function({T11 x})>;
+//      ^
+// [analyzer] unspecified
+// [cfe] unspecified
+
+// Note: not an error because T12 is the name of the parameter.
+typedef T12 = List<void Function({int T12})>;
+
+// Note: we have to use `void Function<...>() Function()` because a generic
+// function can't directly be used as a type argument.
+typedef T13 = List<void Function<X extends T13>() Function()>;
+//      ^
+// [analyzer] unspecified
+// [cfe] unspecified
diff --git a/tests/language/null/null_test.dart b/tests/language/null/null_test.dart
index f13312d..48e9b25 100644
--- a/tests/language/null/null_test.dart
+++ b/tests/language/null/null_test.dart
@@ -145,13 +145,13 @@
 
   // Test cast, "as", operator.
   Expect.equals(null, null as Null);
-  if (isStrongMode) {
+  if (hasSoundNullSafety) {
     Expect.throwsTypeError(() => null as Object);
   } else {
     Expect.equals(null, null as Object);
   }
   Expect.equals(null, null as Object?);
-  if (isStrongMode) {
+  if (hasSoundNullSafety) {
     Expect.throwsTypeError(() => null as int);
   } else {
     Expect.equals(null, null as int);
@@ -163,13 +163,13 @@
   Expect.equals(null, new Generic<int?>().cast(null));
 
   Expect.equals(null, obj as Null);
-  if (isStrongMode) {
+  if (hasSoundNullSafety) {
     Expect.throwsTypeError(() => obj as Object);
   } else {
     Expect.equals(null, obj as Object);
   }
   Expect.equals(null, obj as Object?);
-  if (isStrongMode) {
+  if (hasSoundNullSafety) {
     Expect.throwsTypeError(() => obj as int);
   } else {
     Expect.equals(null, obj as int);
diff --git a/tests/language/null_aware/access_test.dart b/tests/language/null_aware/access_test.dart
index b2d1bc0..488a0df 100644
--- a/tests/language/null_aware/access_test.dart
+++ b/tests/language/null_aware/access_test.dart
@@ -32,36 +32,75 @@
   // [analyzer] STATIC_WARNING.INVALID_NULL_AWARE_OPERATOR
 
   // C?.id is equivalent to C.id.
-  { C.staticInt = 1; Expect.equals(1, C?.staticInt); }
-  { h.C.staticInt = 1; Expect.equals(1, h.C?.staticInt); }
+  {
+    C.staticInt = 1;
+    Expect.equals(1, C?.staticInt);
+    //               ^
+    // [cfe] The class 'C' cannot be null.
+  }
+  {
+    h.C.staticInt = 1;
+    Expect.equals(1, h.C?.staticInt);
+    //                 ^
+    // [cfe] The class 'C' cannot be null.
+  }
 
   // The static type of e1?.d is the static type of e1.id.
-  { int? i = new C(1)?.v; Expect.equals(1, i); }
-  //             ^
-  // [cfe] Operand of null-aware operation '?.' has type 'C' which excludes null.
-  //                 ^^
-  // [analyzer] STATIC_WARNING.INVALID_NULL_AWARE_OPERATOR
-  { String? s = new C(null)?.v; Expect.equals(null, s); }
-  //            ^^^^^^^^^^^^^^
-  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
-  //                ^
-  // [cfe] A value of type 'int?' can't be assigned to a variable of type 'String?'.
-  //                ^
-  // [cfe] Operand of null-aware operation '?.' has type 'C' which excludes null.
-  //                       ^^
-  // [analyzer] STATIC_WARNING.INVALID_NULL_AWARE_OPERATOR
-  { C.staticInt = 1; int? i = C?.staticInt; Expect.equals(1, i); }
-  { h.C.staticInt = 1; int? i = h.C?.staticInt; Expect.equals(1, i); }
-  { C.staticInt = null; String? s = C?.staticInt; Expect.equals(null, s); }
-  //                                ^^^^^^^^^^^^
-  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
-  //                                   ^
-  // [cfe] A value of type 'int?' can't be assigned to a variable of type 'String?'.
-  { h.C.staticNullable = null; String? s = h.C?.staticNullable; Expect.equals(null, s); }
-  //                                       ^^^^^^^^^^^^^^^^^^^
-  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
-  //                                            ^
-  // [cfe] A value of type 'int?' can't be assigned to a variable of type 'String?'.
+  {
+    int? i = new C(1)?.v;
+    //           ^
+    // [cfe] Operand of null-aware operation '?.' has type 'C' which excludes null.
+    //               ^^
+    // [analyzer] STATIC_WARNING.INVALID_NULL_AWARE_OPERATOR
+    Expect.equals(1, i);
+  }
+  {
+    String? s = new C(null)?.v;
+    //          ^^^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+    //              ^
+    // [cfe] A value of type 'int?' can't be assigned to a variable of type 'String?'.
+    //              ^
+    // [cfe] Operand of null-aware operation '?.' has type 'C' which excludes null.
+    //                     ^^
+    // [analyzer] STATIC_WARNING.INVALID_NULL_AWARE_OPERATOR
+    Expect.equals(null, s);
+  }
+  {
+    C.staticInt = 1;
+    int? i = C?.staticInt;
+    //       ^
+    // [cfe] The class 'C' cannot be null.
+    Expect.equals(1, i);
+  }
+  {
+    h.C.staticInt = 1;
+    int? i = h.C?.staticInt;
+    //         ^
+    // [cfe] The class 'C' cannot be null.
+    Expect.equals(1, i);
+  }
+  {
+    C.staticInt = null;
+    String? s = C?.staticInt;
+    //          ^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+    // [cfe] The class 'C' cannot be null.
+    //             ^
+    // [cfe] A value of type 'int?' can't be assigned to a variable of type 'String?'.
+    Expect.equals(null, s);
+  }
+  {
+    h.C.staticNullable = null;
+    String? s = h.C?.staticNullable;
+    //          ^^^^^^^^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+    //            ^
+    // [cfe] The class 'C' cannot be null.
+    //               ^
+    // [cfe] A value of type 'int?' can't be assigned to a variable of type 'String?'.
+    Expect.equals(null, s);
+  }
 
   // Let T be the static type of e1 and let y be a fresh variable of type T.
   // Exactly the same static warnings that would be caused by y.id are also
@@ -70,10 +109,13 @@
   //                           ^^^
   // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
   // [cfe] The getter 'bad' isn't defined for the class 'C'.
-  { var b = new C(1) as B?; Expect.equals(1, b?.v); }
-  //                                            ^
-  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
-  // [cfe] The getter 'v' isn't defined for the class 'B'.
+  {
+    var b = new C(1) as B?;
+    Expect.equals(1, b?.v);
+    //                  ^
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
+    // [cfe] The getter 'v' isn't defined for the class 'B'.
+  }
 
   // '?.' cannot be used to access toplevel properties in libraries imported via
   // prefix.
diff --git a/tests/language/null_aware/assignment_test.dart b/tests/language/null_aware/assignment_test.dart
index d7bf2f4..1d7f71a 100644
--- a/tests/language/null_aware/assignment_test.dart
+++ b/tests/language/null_aware/assignment_test.dart
@@ -48,34 +48,84 @@
 
   // e1?.v = e2 is equivalent to ((x) => x == null ? null : x.v = e2)(e1).
   Expect.equals(null, nullC()?.v = bad());
-  { C c = new C(1); Expect.equals(2, c?.v = 2); Expect.equals(2, c.v); }
-  //                                 ^
-  // [cfe] Operand of null-aware operation '?.' has type 'C' which excludes null.
-  //                                  ^^
-  // [analyzer] STATIC_WARNING.INVALID_NULL_AWARE_OPERATOR
+  {
+    C c = new C(1);
+    Expect.equals(2, c?.v = 2);
+    //               ^
+    // [cfe] Operand of null-aware operation '?.' has type 'C' which excludes null.
+    //                ^^
+    // [analyzer] STATIC_WARNING.INVALID_NULL_AWARE_OPERATOR
+    Expect.equals(2, c.v);
+  }
 
   // C?.v = e2 is equivalent to C.v = e2.
-  { C.staticInt = 1; Expect.equals(2, C?.staticInt = 2); Expect.equals(2, C.staticInt); }
-  { h.C.staticInt = 1; Expect.equals(2, h.C?.staticInt = 2); Expect.equals(2, h.C.staticInt); }
+  {
+    C.staticInt = 1;
+    Expect.equals(2, C?.staticInt = 2);
+    //               ^
+    // [cfe] The class 'C' cannot be null.
+    Expect.equals(2, C.staticInt);
+  }
+  {
+    h.C.staticInt = 1;
+    Expect.equals(2, h.C?.staticInt = 2);
+    //                 ^
+    // [cfe] The class 'C' cannot be null.
+    Expect.equals(2, h.C.staticInt);
+  }
 
   // The static type of e1?.v = e2 is the static type of e2.
-  { var d = new D(new E()) as D?; G g = new G(); F? f = (d?.v = g); Expect.identical(f, g); }
-  { var d = new D(new E()) as D?; E e = new G(); F? f = (d?.v = e); }
-  //                                                     ^^^^^^^^
-  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
-  // [cfe] A value of type 'E?' can't be assigned to a variable of type 'F?'.
-  { D.staticE = new E(); G g = new G(); F? f = (D?.staticE = g); Expect.identical(f, g); }
-  { h.D.staticE = new h.E(); h.G g = new h.G(); h.F? f = (h.D?.staticE = g); Expect.identical(f, g); }
-  { D.staticE = new E(); E e = new G(); F? f = (D?.staticE = e); }
-  //                                            ^^^^^^^^^^^^^^
-  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
-  //                                               ^
-  // [cfe] A value of type 'E' can't be assigned to a variable of type 'F?'.
-  { h.D.staticE = new h.E(); h.E e = new h.G(); h.F f = (h.D?.staticE = e); }
-  //                                                     ^^^^^^^^^^^^^^^^
-  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
-  //                                                          ^
-  // [cfe] A value of type 'E' can't be assigned to a variable of type 'F'.
+  {
+    var d = new D(new E()) as D?;
+    G g = new G();
+    F? f = (d?.v = g);
+    Expect.identical(f, g);
+  }
+  {
+    var d = new D(new E()) as D?;
+    E e = new G();
+    F? f = (d?.v = e);
+    //      ^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+    // [cfe] A value of type 'E?' can't be assigned to a variable of type 'F?'.
+  }
+  {
+    D.staticE = new E();
+    G g = new G();
+    F? f = (D?.staticE = g);
+    //      ^
+    // [cfe] The class 'D' cannot be null.
+    Expect.identical(f, g);
+  }
+  {
+    h.D.staticE = new h.E();
+    h.G g = new h.G();
+    h.F? f = (h.D?.staticE = g);
+    //          ^
+    // [cfe] The class 'D' cannot be null.
+    Expect.identical(f, g);
+  }
+  {
+    D.staticE = new E();
+    E e = new G();
+    F? f = (D?.staticE = e);
+    //      ^^^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+    // [cfe] The class 'D' cannot be null.
+    //         ^
+    // [cfe] A value of type 'E' can't be assigned to a variable of type 'F?'.
+  }
+  {
+    h.D.staticE = new h.E();
+    h.E e = new h.G();
+    h.F f = (h.D?.staticE = e);
+    //       ^^^^^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+    //         ^
+    // [cfe] The class 'D' cannot be null.
+    //            ^
+    // [cfe] A value of type 'E' can't be assigned to a variable of type 'F'.
+  }
 
   // Exactly the same errors that would be caused by e1.v = e2 are
   // also generated in the case of e1?.v = e2.
@@ -83,34 +133,65 @@
   //                           ^^^
   // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_SETTER
   // [cfe] The setter 'bad' isn't defined for the class 'C'.
-  { B b = new C(1); Expect.equals(2, b?.v = 2); }
-  //                                 ^
-  // [cfe] Operand of null-aware operation '?.' has type 'B' which excludes null.
-  //                                  ^^
-  // [analyzer] STATIC_WARNING.INVALID_NULL_AWARE_OPERATOR
-  //                                    ^
-  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_SETTER
-  // [cfe] The setter 'v' isn't defined for the class 'B'.
+  {
+    B b = new C(1);
+    Expect.equals(2, b?.v = 2);
+    //               ^
+    // [cfe] Operand of null-aware operation '?.' has type 'B' which excludes null.
+    //                ^^
+    // [analyzer] STATIC_WARNING.INVALID_NULL_AWARE_OPERATOR
+    //                  ^
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_SETTER
+    // [cfe] The setter 'v' isn't defined for the class 'B'.
+  }
 
   // e1?.v op= e2 is equivalent to ((x) => x?.v = x.v op e2)(e1).
   Expect.equals(null, nullC()?.v += bad());
-  { C c = new C(1); Expect.equals(3, c?.v += 2); Expect.equals(3, c.v); }
-  //                                 ^
-  // [cfe] Operand of null-aware operation '?.' has type 'C' which excludes null.
-  //                                  ^^
-  // [analyzer] STATIC_WARNING.INVALID_NULL_AWARE_OPERATOR
+  {
+    C c = new C(1);
+    Expect.equals(3, c?.v += 2);
+    //               ^
+    // [cfe] Operand of null-aware operation '?.' has type 'C' which excludes null.
+    //                ^^
+    // [analyzer] STATIC_WARNING.INVALID_NULL_AWARE_OPERATOR
+    Expect.equals(3, c.v);
+  }
 
   // C?.v op= e2 is equivalent to C.v op= e2.
-  { C.staticInt = 1; Expect.equals(3, C?.staticInt += 2); Expect.equals(3, C?.staticInt); }
+  {
+    C.staticInt = 1;
+    Expect.equals(3, C?.staticInt += 2);
+    //               ^
+    // [cfe] The class 'C' cannot be null.
+    Expect.equals(3, C?.staticInt);
+    //               ^
+    // [cfe] The class 'C' cannot be null.
+  }
 
   // The static type of e1?.v op= e2 is the static type of e1.v op e2.
-  { D d = new D(new E()); F? f = (d?.v += 1); Expect.identical(d.v, f); }
-  //                              ^
-  // [cfe] Operand of null-aware operation '?.' has type 'D' which excludes null.
-  //                               ^^
-  // [analyzer] STATIC_WARNING.INVALID_NULL_AWARE_OPERATOR
-  { D.staticE = new E(); F? f = (D?.staticE += 1); Expect.identical(D.staticE, f); }
-  { h.D.staticE = new h.E(); h.F? f = (h.D?.staticE += 1); Expect.identical(h.D.staticE, f); }
+  {
+    D d = new D(new E());
+    F? f = (d?.v += 1);
+    //      ^
+    // [cfe] Operand of null-aware operation '?.' has type 'D' which excludes null.
+    //       ^^
+    // [analyzer] STATIC_WARNING.INVALID_NULL_AWARE_OPERATOR
+    Expect.identical(d.v, f);
+  }
+  {
+    D.staticE = new E();
+    F? f = (D?.staticE += 1);
+    //      ^
+    // [cfe] The class 'D' cannot be null.
+    Expect.identical(D.staticE, f);
+  }
+  {
+    h.D.staticE = new h.E();
+    h.F? f = (h.D?.staticE += 1);
+    //          ^
+    // [cfe] The class 'D' cannot be null.
+    Expect.identical(h.D.staticE, f);
+  }
 
   // Let T be the static type of e1 and let y be a fresh variable of type T.
   // Exactly the same errors that would be caused by y.v op e2 are
@@ -119,51 +200,79 @@
   //       ^^^
   // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_SETTER
   // [cfe] The setter 'bad' isn't defined for the class 'C'.
-  { B b = new C(1); b?.v += 2; }
-  //                ^
-  // [cfe] Operand of null-aware operation '?.' has type 'B' which excludes null.
-  //                 ^^
-  // [analyzer] STATIC_WARNING.INVALID_NULL_AWARE_OPERATOR
-  //                   ^
-  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
-  // [cfe] The getter 'v' isn't defined for the class 'B'.
-  //                   ^
-  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_SETTER
-  // [cfe] The setter 'v' isn't defined for the class 'B'.
-  { D d = new D(new E()); F? f = (d?.v += nullC()); }
-  //                              ^
-  // [cfe] Operand of null-aware operation '?.' has type 'D' which excludes null.
-  //                               ^^
-  // [analyzer] STATIC_WARNING.INVALID_NULL_AWARE_OPERATOR
-  //                                      ^^^^^^^
-  // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
-  // [cfe] A value of type 'C?' can't be assigned to a variable of type 'int'.
-  { D d = new D(new E()); H? h = (d?.v += 1); }
-  //                              ^^^^^^^^^
-  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
-  // [cfe] A value of type 'G?' can't be assigned to a variable of type 'H?'.
-  //                              ^
-  // [cfe] Operand of null-aware operation '?.' has type 'D' which excludes null.
-  //                               ^^
-  // [analyzer] STATIC_WARNING.INVALID_NULL_AWARE_OPERATOR
-  { D.staticE = new E(); F? f = (D?.staticE += nullC()); }
-  //                                           ^^^^^^^
-  // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
-  // [cfe] A value of type 'C?' can't be assigned to a variable of type 'int'.
-  { h.D.staticE = new h.E(); h.F? f = (h.D?.staticE += h.nullC()); }
-  //                                                   ^^^^^^^^^
-  // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
-  // [cfe] A value of type 'C?' can't be assigned to a variable of type 'int'.
-  { D.staticE = new E(); H? h = (D?.staticE += 1); }
-  //                             ^^^^^^^^^^^^^^^
-  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
-  //                                ^
-  // [cfe] A value of type 'G' can't be assigned to a variable of type 'H?'.
-  { h.D.staticE = new h.E(); h.H? hh = (h.D?.staticE += 1); }
-  //                                    ^^^^^^^^^^^^^^^^^
-  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
-  //                                         ^
-  // [cfe] A value of type 'G' can't be assigned to a variable of type 'H?'.
+  {
+    B b = new C(1);
+    b?.v += 2;
+//  ^
+// [cfe] Operand of null-aware operation '?.' has type 'B' which excludes null.
+//   ^^
+// [analyzer] STATIC_WARNING.INVALID_NULL_AWARE_OPERATOR
+    // ^
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
+    // [cfe] The getter 'v' isn't defined for the class 'B'.
+    // ^
+    // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_SETTER
+    // [cfe] The setter 'v' isn't defined for the class 'B'.
+  }
+  {
+    D d = new D(new E());
+    F? f = (d?.v += nullC());
+    //      ^
+    // [cfe] Operand of null-aware operation '?.' has type 'D' which excludes null.
+    //       ^^
+    // [analyzer] STATIC_WARNING.INVALID_NULL_AWARE_OPERATOR
+    //              ^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
+    // [cfe] A value of type 'C?' can't be assigned to a variable of type 'int'.
+  }
+  {
+    D d = new D(new E());
+    H? h = (d?.v += 1);
+    //      ^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+    // [cfe] A value of type 'G?' can't be assigned to a variable of type 'H?'.
+    //      ^
+    // [cfe] Operand of null-aware operation '?.' has type 'D' which excludes null.
+    //       ^^
+    // [analyzer] STATIC_WARNING.INVALID_NULL_AWARE_OPERATOR
+  }
+  {
+    D.staticE = new E();
+    F? f = (D?.staticE += nullC());
+    //      ^
+    // [cfe] The class 'D' cannot be null.
+    //                    ^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
+    // [cfe] A value of type 'C?' can't be assigned to a variable of type 'int'.
+  }
+  {
+    h.D.staticE = new h.E();
+    h.F? f = (h.D?.staticE += h.nullC());
+    //          ^
+    // [cfe] The class 'D' cannot be null.
+    //                        ^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
+    // [cfe] A value of type 'C?' can't be assigned to a variable of type 'int'.
+  }
+  {
+    D.staticE = new E();
+    H? h = (D?.staticE += 1);
+    //      ^^^^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+    // [cfe] The class 'D' cannot be null.
+    //         ^
+    // [cfe] A value of type 'G' can't be assigned to a variable of type 'H?'.
+  }
+  {
+    h.D.staticE = new h.E();
+    h.H? hh = (h.D?.staticE += 1);
+    //         ^^^^^^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+    //           ^
+    // [cfe] The class 'D' cannot be null.
+    //              ^
+    // [cfe] A value of type 'G' can't be assigned to a variable of type 'H?'.
+  }
 
   // '?.' cannot be used to assign to toplevel properties in libraries imported
   // via prefix.
diff --git a/tests/language/null_aware/increment_decrement_test.dart b/tests/language/null_aware/increment_decrement_test.dart
index 7e80690..d1916b6 100644
--- a/tests/language/null_aware/increment_decrement_test.dart
+++ b/tests/language/null_aware/increment_decrement_test.dart
@@ -42,111 +42,313 @@
 
   // e1?.v++ is equivalent to ((x) => x == null ? null : x.v++)(e1).
   Expect.equals(null, nullC()?.v++);
-  { var c = new C(1) as C?; Expect.equals(1, c?.v++); Expect.equals(2, c!.v); }
+  {
+    var c = new C(1) as C?;
+    Expect.equals(1, c?.v++);
+    Expect.equals(2, c!.v);
+  }
 
   // C?.v++ is equivalent to C.v++.
-  { C.staticInt = 1; Expect.equals(1, C?.staticInt++); Expect.equals(2, C.staticInt); }
-  { h.C.staticInt = 1; Expect.equals(1, h.C?.staticInt++); Expect.equals(2, h.C.staticInt); }
+  {
+    C.staticInt = 1;
+    Expect.equals(1, C?.staticInt++);
+    //               ^
+    // [cfe] The class 'C' cannot be null.
+    Expect.equals(2, C.staticInt);
+  }
+  {
+    h.C.staticInt = 1;
+    Expect.equals(1, h.C?.staticInt++);
+    //                 ^
+    // [cfe] The class 'C' cannot be null.
+    Expect.equals(2, h.C.staticInt);
+  }
 
   // The static type of e1?.v++ is the same as the static type of e1.v.
-  { E e1 = new E(); var d = new D(e1) as D?; E? e2 = d?.v++; Expect.identical(e1, e2); }
-  { G g = new G(); var d = new D(g) as D?; F? f = d?.v++; Expect.identical(f, g); }
-  //                                              ^^^^^^
-  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
-  // [cfe] A value of type 'E?' can't be assigned to a variable of type 'F?'.
-  { E e1 = new E(); D.staticE = e1; E? e2 = D?.staticE++; Expect.identical(e1, e2); }
-  { h.E e1 = new h.E(); h.D.staticE = e1; h.E? e2 = h.D?.staticE++; Expect.identical(e1, e2); }
-  { G g = new G(); D.staticE = g; F? f = D?.staticE++; Expect.identical(f, g); }
-  //                                     ^^^^^^^^^^^^
-  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
-  //                                               ^
-  // [cfe] A value of type 'E' can't be assigned to a variable of type 'F?'.
-  { h.G g = new h.G(); h.D.staticE = g; h.F? f = h.D?.staticE++; Expect.identical(f, g); }
-  //                                             ^^^^^^^^^^^^^^
-  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
-  //                                                         ^
-  // [cfe] A value of type 'E' can't be assigned to a variable of type 'F?'.
+  {
+    E e1 = new E();
+    var d = new D(e1) as D?;
+    E? e2 = d?.v++;
+    Expect.identical(e1, e2);
+  }
+  {
+    G g = new G();
+    var d = new D(g) as D?;
+    F? f = d?.v++;
+    //     ^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+    // [cfe] A value of type 'E?' can't be assigned to a variable of type 'F?'.
+    Expect.identical(f, g);
+  }
+  {
+    E e1 = new E();
+    D.staticE = e1;
+    E? e2 = D?.staticE++;
+    //      ^
+    // [cfe] The class 'D' cannot be null.
+    Expect.identical(e1, e2);
+  }
+  {
+    h.E e1 = new h.E();
+    h.D.staticE = e1;
+    h.E? e2 = h.D?.staticE++;
+    //          ^
+    // [cfe] The class 'D' cannot be null.
+    Expect.identical(e1, e2);
+  }
+  {
+    G g = new G();
+    D.staticE = g;
+    F? f = D?.staticE++;
+    //     ^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+    // [cfe] The class 'D' cannot be null.
+    //               ^
+    // [cfe] A value of type 'E' can't be assigned to a variable of type 'F?'.
+    Expect.identical(f, g);
+  }
+  {
+    h.G g = new h.G();
+    h.D.staticE = g;
+    h.F? f = h.D?.staticE++;
+    //       ^^^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+    //         ^
+    // [cfe] The class 'D' cannot be null.
+    //                   ^
+    // [cfe] A value of type 'E' can't be assigned to a variable of type 'F?'.
+    Expect.identical(f, g);
+  }
 
   // e1?.v-- is equivalent to ((x) => x == null ? null : x.v--)(e1).
   Expect.equals(null, nullC()?.v--);
-  { var c = new C(1) as C?; Expect.equals(1, c?.v--); Expect.equals(0, c!.v); }
+  {
+    var c = new C(1) as C?;
+    Expect.equals(1, c?.v--);
+    Expect.equals(0, c!.v);
+  }
 
   // C?.v-- is equivalent to C.v--.
-  { C.staticInt = 1; Expect.equals(1, C?.staticInt--); Expect.equals(0, C.staticInt); }
-  { h.C.staticInt = 1; Expect.equals(1, h.C?.staticInt--); Expect.equals(0, h.C.staticInt); }
+  {
+    C.staticInt = 1;
+    Expect.equals(1, C?.staticInt--);
+    //               ^
+    // [cfe] The class 'C' cannot be null.
+    Expect.equals(0, C.staticInt);
+  }
+  {
+    h.C.staticInt = 1;
+    Expect.equals(1, h.C?.staticInt--);
+    //                 ^
+    // [cfe] The class 'C' cannot be null.
+    Expect.equals(0, h.C.staticInt);
+  }
 
   // The static type of e1?.v-- is the same as the static type of e1.v.
-  { E e1 = new E(); var d = new D(e1) as D?; E? e2 = d?.v--; Expect.identical(e1, e2); }
-  { G g = new G(); var d = new D(g) as D?; F? f = d?.v--; Expect.identical(f, g); }
-  //                                              ^^^^^^
-  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
-  // [cfe] A value of type 'E?' can't be assigned to a variable of type 'F?'.
-  { E e1 = new E(); D.staticE = e1; E? e2 = D?.staticE--; Expect.identical(e1, e2); }
-  { h.E e1 = new h.E(); h.D.staticE = e1; h.E? e2 = h.D?.staticE--; Expect.identical(e1, e2); }
-  { G g = new G(); D.staticE = g; F? f = D?.staticE--; Expect.identical(f, g); }
-  //                                     ^^^^^^^^^^^^
-  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
-  //                                               ^
-  // [cfe] A value of type 'E' can't be assigned to a variable of type 'F?'.
-  { h.G g = new h.G(); h.D.staticE = g; h.F? f = h.D?.staticE--; Expect.identical(f, g); }
-  //                                             ^^^^^^^^^^^^^^
-  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
-  //                                                         ^
-  // [cfe] A value of type 'E' can't be assigned to a variable of type 'F?'.
+  {
+    E e1 = new E();
+    var d = new D(e1) as D?;
+    E? e2 = d?.v--;
+    Expect.identical(e1, e2);
+  }
+  {
+    G g = new G();
+    var d = new D(g) as D?;
+    F? f = d?.v--;
+    //     ^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+    // [cfe] A value of type 'E?' can't be assigned to a variable of type 'F?'.
+    Expect.identical(f, g);
+  }
+  {
+    E e1 = new E();
+    D.staticE = e1;
+    E? e2 = D?.staticE--;
+    //      ^
+    // [cfe] The class 'D' cannot be null.
+    Expect.identical(e1, e2);
+  }
+  {
+    h.E e1 = new h.E();
+    h.D.staticE = e1;
+    h.E? e2 = h.D?.staticE--;
+    //          ^
+    // [cfe] The class 'D' cannot be null.
+    Expect.identical(e1, e2);
+  }
+  {
+    G g = new G();
+    D.staticE = g;
+    F? f = D?.staticE--;
+    //     ^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+    // [cfe] The class 'D' cannot be null.
+    //               ^
+    // [cfe] A value of type 'E' can't be assigned to a variable of type 'F?'.
+    Expect.identical(f, g);
+  }
+  {
+    h.G g = new h.G();
+    h.D.staticE = g;
+    h.F? f = h.D?.staticE--;
+    //       ^^^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+    //         ^
+    // [cfe] The class 'D' cannot be null.
+    //                   ^
+    // [cfe] A value of type 'E' can't be assigned to a variable of type 'F?'.
+    Expect.identical(f, g);
+  }
 
   // ++e1?.v is equivalent to e1?.v += 1.
   Expect.equals(null, ++nullC()?.v);
-  { var c = new C(1) as C?; Expect.equals(2, ++c?.v); Expect.equals(2, c!.v); }
+  {
+    var c = new C(1) as C?;
+    Expect.equals(2, ++c?.v);
+    Expect.equals(2, c!.v);
+  }
 
   // ++C?.v is equivalent to C?.v += 1.
-  { C.staticInt = 1; Expect.equals(2, ++C?.staticInt); Expect.equals(2, C.staticInt); }
-  { h.C.staticInt = 1; Expect.equals(2, ++h.C?.staticInt); Expect.equals(2, h.C.staticInt); }
+  {
+    C.staticInt = 1;
+    Expect.equals(2, ++C?.staticInt);
+    //                 ^
+    // [cfe] The class 'C' cannot be null.
+    Expect.equals(2, C.staticInt);
+  }
+  {
+    h.C.staticInt = 1;
+    Expect.equals(2, ++h.C?.staticInt);
+    //                   ^
+    // [cfe] The class 'C' cannot be null.
+    Expect.equals(2, h.C.staticInt);
+  }
 
   // The static type of ++e1?.v is the same as the static type of e1.v + 1.
-  { var d = new D(new E()) as D?; F? f = ++d?.v; Expect.identical(d!.v, f); }
-  { var d = new D(new E()) as D?; H? h = ++d?.v; Expect.identical(d!.v, h); }
-  //                                     ^^^^^^
-  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
-  //                                       ^
-  // [cfe] A value of type 'G?' can't be assigned to a variable of type 'H?'.
-  { D.staticE = new E(); F? f = ++D?.staticE; Expect.identical(D.staticE, f); }
-  { h.D.staticE = new h.E(); h.F? f = ++h.D?.staticE; Expect.identical(h.D.staticE, f); }
-  { D.staticE = new E(); H? h = ++D?.staticE; Expect.identical(D.staticE, h); }
-  //                            ^^^^^^^^^^^^
-  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
-  //                                 ^
-  // [cfe] A value of type 'G' can't be assigned to a variable of type 'H?'.
-  { h.D.staticE = new h.E(); h.H? hh = ++h.D?.staticE; Expect.identical(h.D.staticE, hh); }
-  //                                   ^^^^^^^^^^^^^^
-  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
-  //                                          ^
-  // [cfe] A value of type 'G' can't be assigned to a variable of type 'H?'.
+  {
+    var d = new D(new E()) as D?;
+    F? f = ++d?.v;
+    Expect.identical(d!.v, f);
+  }
+  {
+    var d = new D(new E()) as D?;
+    H? h = ++d?.v;
+    //     ^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+    //       ^
+    // [cfe] A value of type 'G?' can't be assigned to a variable of type 'H?'.
+    Expect.identical(d!.v, h);
+  }
+  {
+    D.staticE = new E();
+    F? f = ++D?.staticE;
+    //       ^
+    // [cfe] The class 'D' cannot be null.
+    Expect.identical(D.staticE, f);
+  }
+  {
+    h.D.staticE = new h.E();
+    h.F? f = ++h.D?.staticE;
+    //           ^
+    // [cfe] The class 'D' cannot be null.
+    Expect.identical(h.D.staticE, f);
+  }
+  {
+    D.staticE = new E();
+    H? h = ++D?.staticE;
+    //     ^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+    //       ^
+    // [cfe] The class 'D' cannot be null.
+    //          ^
+    // [cfe] A value of type 'G' can't be assigned to a variable of type 'H?'.
+    Expect.identical(D.staticE, h);
+  }
+  {
+    h.D.staticE = new h.E();
+    h.H? hh = ++h.D?.staticE;
+    //        ^^^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+    //            ^
+    // [cfe] The class 'D' cannot be null.
+    //               ^
+    // [cfe] A value of type 'G' can't be assigned to a variable of type 'H?'.
+    Expect.identical(h.D.staticE, hh);
+  }
 
   // --e1?.v is equivalent to e1?.v -= 1.
   Expect.equals(null, --nullC()?.v);
-  { var c = new C(1) as C?; Expect.equals(0, --c?.v); Expect.equals(0, c!.v); }
+  {
+    var c = new C(1) as C?;
+    Expect.equals(0, --c?.v);
+    Expect.equals(0, c!.v);
+  }
 
   // --C?.v is equivalent to C?.v -= 1.
-  { C.staticInt = 1; Expect.equals(0, --C?.staticInt); Expect.equals(0, C.staticInt); }
-  { h.C.staticInt = 1; Expect.equals(0, --h.C?.staticInt); Expect.equals(0, h.C.staticInt); }
+  {
+    C.staticInt = 1;
+    Expect.equals(0, --C?.staticInt);
+    //                 ^
+    // [cfe] The class 'C' cannot be null.
+    Expect.equals(0, C.staticInt);
+  }
+  {
+    h.C.staticInt = 1;
+    Expect.equals(0, --h.C?.staticInt);
+    //                   ^
+    // [cfe] The class 'C' cannot be null.
+    Expect.equals(0, h.C.staticInt);
+  }
 
   // The static type of --e1?.v is the same as the static type of e1.v - 1.
-  { var d = new D(new E()) as D?; F? f = --d?.v; Expect.identical(d!.v, f); }
-  { var d = new D(new E()) as D?; H? h = --d?.v; Expect.identical(d!.v, h); }
-  //                                     ^^^^^^
-  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
-  //                                       ^
-  // [cfe] A value of type 'G?' can't be assigned to a variable of type 'H?'.
-  { D.staticE = new E(); F? f = --D?.staticE; Expect.identical(D.staticE, f); }
-  { h.D.staticE = new h.E(); h.F? f = --h.D?.staticE; Expect.identical(h.D.staticE, f); }
-  { D.staticE = new E(); H? h = --D?.staticE; Expect.identical(D.staticE, h); }
-  //                            ^^^^^^^^^^^^
-  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
-  //                                 ^
-  // [cfe] A value of type 'G' can't be assigned to a variable of type 'H?'.
-  { h.D.staticE = new h.E(); h.H? hh = --h.D?.staticE; Expect.identical(h.D.staticE, hh); }
-  //                                   ^^^^^^^^^^^^^^
-  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
-  //                                          ^
-  // [cfe] A value of type 'G' can't be assigned to a variable of type 'H?'.
+  {
+    var d = new D(new E()) as D?;
+    F? f = --d?.v;
+    Expect.identical(d!.v, f);
+  }
+  {
+    var d = new D(new E()) as D?;
+    H? h = --d?.v;
+    //     ^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+    //       ^
+    // [cfe] A value of type 'G?' can't be assigned to a variable of type 'H?'.
+    Expect.identical(d!.v, h);
+  }
+  {
+    D.staticE = new E();
+    F? f = --D?.staticE;
+    //       ^
+    // [cfe] The class 'D' cannot be null.
+    Expect.identical(D.staticE, f);
+  }
+  {
+    h.D.staticE = new h.E();
+    h.F? f = --h.D?.staticE;
+    //           ^
+    // [cfe] The class 'D' cannot be null.
+    Expect.identical(h.D.staticE, f);
+  }
+  {
+    D.staticE = new E();
+    H? h = --D?.staticE;
+    //     ^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+    //       ^
+    // [cfe] The class 'D' cannot be null.
+    //          ^
+    // [cfe] A value of type 'G' can't be assigned to a variable of type 'H?'.
+    Expect.identical(D.staticE, h);
+  }
+  {
+    h.D.staticE = new h.E();
+    h.H? hh = --h.D?.staticE;
+    //        ^^^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+    //            ^
+    // [cfe] The class 'D' cannot be null.
+    //               ^
+    // [cfe] A value of type 'G' can't be assigned to a variable of type 'H?'.
+    Expect.identical(h.D.staticE, hh);
+  }
 }
diff --git a/tests/language/operator/number_operator_error_test.dart b/tests/language/operator/number_operator_error_test.dart
index aaa32c3..c50f26e 100644
--- a/tests/language/operator/number_operator_error_test.dart
+++ b/tests/language/operator/number_operator_error_test.dart
@@ -26,7 +26,7 @@
   if (on is! num) throw "promote on to I&num";
   checkIntersectionType<O, num>(on, on, on);
   dynamic dyn = cast(1);
-  late never = throw "unreachable";
+  late var never = throw "unreachable";
 
   /* indent */ i + "string";
   //               ^^^^^^^^
diff --git a/tests/language/operator/number_operator_typing_test.dart b/tests/language/operator/number_operator_typing_test.dart
index c650e61..a6fcd7d 100644
--- a/tests/language/operator/number_operator_typing_test.dart
+++ b/tests/language/operator/number_operator_typing_test.dart
@@ -149,11 +149,41 @@
     n.remainder(never).expectStaticType<Exactly<num>>();
   }
 
-  (dyn1 + d).expectStaticType<Exactly<dynamic>>();
-  (dyn1 - d).expectStaticType<Exactly<dynamic>>();
-  (dyn1 * d).expectStaticType<Exactly<dynamic>>();
-  (dyn1 % d).expectStaticType<Exactly<dynamic>>();
-  dyn1.remainder(d).expectStaticType<Exactly<dynamic>>();
+  var dyn1a = dyn1 + d;
+  if (false) {
+    // Check that the static type of [dyn1a] is dynamic:
+    Never n = dyn1a;
+    dyn1a = 0;
+    dyn1a = false;
+  }
+  var dyn1b = dyn1 - d;
+  if (false) {
+    // Check that the static type of [dyn1b] is dynamic:
+    Never n = dyn1b;
+    dyn1b = 0;
+    dyn1b = false;
+  }
+  var dyn1c = dyn1 * d;
+  if (false) {
+    // Check that the static type of [dyn1c] is dynamic:
+    Never n = dyn1c;
+    dyn1c = 0;
+    dyn1c = false;
+  }
+  var dyn1d = dyn1 % d;
+  if (false) {
+    // Check that the static type of [dyn1d] is dynamic:
+    Never n = dyn1d;
+    dyn1d = 0;
+    dyn1d = false;
+  }
+  var dyn1e = dyn1.remainder(d);
+  if (false) {
+    // Check that the static type of [dyn1e] is dynamic:
+    Never n = dyn1a;
+    dyn1a = 0;
+    dyn1a = false;
+  }
 
   if (false) {
     (never + d).expectStaticType<Exactly<Never>>();
@@ -356,11 +386,41 @@
     n.remainder(never).expectStaticType<Exactly<num>>();
   }
 
-  (dyn1 + d).expectStaticType<Exactly<dynamic>>();
-  (dyn1 - d).expectStaticType<Exactly<dynamic>>();
-  (dyn1 * d).expectStaticType<Exactly<dynamic>>();
-  (dyn1 % d).expectStaticType<Exactly<dynamic>>();
-  dyn1.remainder(d).expectStaticType<Exactly<dynamic>>();
+  var dyn1a = dyn1 + d;
+  if (false) {
+    // Check that the static type of [dyn1a] is dynamic:
+    Never n = dyn1a;
+    dyn1a = 0;
+    dyn1a = false;
+  }
+  var dyn1b = dyn1 - d;
+  if (false) {
+    // Check that the static type of [dyn1b] is dynamic:
+    Never n = dyn1b;
+    dyn1b = 0;
+    dyn1b = false;
+  }
+  var dyn1c = dyn1 * d;
+  if (false) {
+    // Check that the static type of [dyn1c] is dynamic:
+    Never n = dyn1c;
+    dyn1c = 0;
+    dyn1c = false;
+  }
+  var dyn1d = dyn1 % d;
+  if (false) {
+    // Check that the static type of [dyn1d] is dynamic:
+    Never n = dyn1d;
+    dyn1d = 0;
+    dyn1d = false;
+  }
+  var dyn1e = dyn1.remainder(d);
+  if (false) {
+    // Check that the static type of [dyn1e] is dynamic:
+    Never n = dyn1a;
+    dyn1a = 0;
+    dyn1a = false;
+  }
 
   if (false) {
     (never + d).expectStaticType<Exactly<Never>>();
@@ -599,11 +659,41 @@
     n.remainder(never).expectStaticType<Exactly<num>>();
   }
 
-  (dyn1 + d).expectStaticType<Exactly<dynamic>>();
-  (dyn1 - d).expectStaticType<Exactly<dynamic>>();
-  (dyn1 * d).expectStaticType<Exactly<dynamic>>();
-  (dyn1 % d).expectStaticType<Exactly<dynamic>>();
-  dyn1.remainder(d).expectStaticType<Exactly<dynamic>>();
+  var dyn1a = dyn1 + d;
+  if (false) {
+    // Check that the static type of [dyn1a] is dynamic:
+    Never n = dyn1a;
+    dyn1a = 0;
+    dyn1a = false;
+  }
+  var dyn1b = dyn1 - d;
+  if (false) {
+    // Check that the static type of [dyn1b] is dynamic:
+    Never n = dyn1b;
+    dyn1b = 0;
+    dyn1b = false;
+  }
+  var dyn1c = dyn1 * d;
+  if (false) {
+    // Check that the static type of [dyn1c] is dynamic:
+    Never n = dyn1c;
+    dyn1c = 0;
+    dyn1c = false;
+  }
+  var dyn1d = dyn1 % d;
+  if (false) {
+    // Check that the static type of [dyn1d] is dynamic:
+    Never n = dyn1d;
+    dyn1d = 0;
+    dyn1d = false;
+  }
+  var dyn1e = dyn1.remainder(d);
+  if (false) {
+    // Check that the static type of [dyn1e] is dynamic:
+    Never n = dyn1a;
+    dyn1a = 0;
+    dyn1a = false;
+  }
 
   if (false) {
     (never + d).expectStaticType<Exactly<Never>>();
@@ -820,11 +910,41 @@
     n.remainder(never).expectStaticType<Exactly<num>>();
   }
 
-  (dyn1 + d).expectStaticType<Exactly<dynamic>>();
-  (dyn1 - d).expectStaticType<Exactly<dynamic>>();
-  (dyn1 * d).expectStaticType<Exactly<dynamic>>();
-  (dyn1 % d).expectStaticType<Exactly<dynamic>>();
-  dyn1.remainder(d).expectStaticType<Exactly<dynamic>>();
+  var dyn1a = dyn1 + d;
+  if (false) {
+    // Check that the static type of [dyn1a] is dynamic:
+    Never n = dyn1a;
+    dyn1a = 0;
+    dyn1a = false;
+  }
+  var dyn1b = dyn1 - d;
+  if (false) {
+    // Check that the static type of [dyn1b] is dynamic:
+    Never n = dyn1b;
+    dyn1b = 0;
+    dyn1b = false;
+  }
+  var dyn1c = dyn1 * d;
+  if (false) {
+    // Check that the static type of [dyn1c] is dynamic:
+    Never n = dyn1c;
+    dyn1c = 0;
+    dyn1c = false;
+  }
+  var dyn1d = dyn1 % d;
+  if (false) {
+    // Check that the static type of [dyn1d] is dynamic:
+    Never n = dyn1d;
+    dyn1d = 0;
+    dyn1d = false;
+  }
+  var dyn1e = dyn1.remainder(d);
+  if (false) {
+    // Check that the static type of [dyn1e] is dynamic:
+    Never n = dyn1a;
+    dyn1a = 0;
+    dyn1a = false;
+  }
 
   if (false) {
     (never + d).expectStaticType<Exactly<Never>>();
diff --git a/tests/language/regress/regress34147_test.dart b/tests/language/regress/regress34147_test.dart
index 20ab478..ab7197e 100644
--- a/tests/language/regress/regress34147_test.dart
+++ b/tests/language/regress/regress34147_test.dart
@@ -16,7 +16,7 @@
 }
 
 void expectError(Function() callback) {
-  if (isWeakMode) {
+  if (hasUnsoundNullSafety) {
     Expect.throwsAssertionError(callback);
   } else {
     Expect.throwsTypeError(callback);
diff --git a/tests/language/regress/regress41890_test.dart b/tests/language/regress/regress41890_test.dart
index 86e43a7..9374e28 100644
--- a/tests/language/regress/regress41890_test.dart
+++ b/tests/language/regress/regress41890_test.dart
@@ -43,8 +43,8 @@
       var item = items[i];
       String code = answers[i];
       bool expected = code == 'T' ||
-          (code == 'S' && isStrongMode) ||
-          (code == 'W' && isWeakMode);
+          (code == 'S' && hasSoundNullSafety) ||
+          (code == 'W' && hasUnsoundNullSafety);
       Expect.equals(expected, predicate(item), "$predicate '$code' $item");
     }
   }
diff --git a/tests/language/set_literals/big_set_literal_test.dart b/tests/language/set_literals/big_set_literal_test.dart
new file mode 100644
index 0000000..e06e357
--- /dev/null
+++ b/tests/language/set_literals/big_set_literal_test.dart
@@ -0,0 +1,20028 @@
+// Copyright (c) 2020, 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:expect/expect.dart";
+
+void main() {
+  Expect.equals(10000, intSet.length);
+  Iterator<int> intIterator = intSet.iterator;
+  for (int i = 0; i < 10000; i++) {
+    Expect.equals(true, intIterator.moveNext());
+    Expect.equals(i, intIterator.current);
+  }
+  Expect.equals(false, intIterator.moveNext());
+
+  Expect.equals(10000, stringSet.length);
+  Iterator<String> stringIterator = stringSet.iterator;
+  for (int i = 0; i < 10000; i++) {
+    Expect.equals(true, stringIterator.moveNext());
+    Expect.equals("foo_$i", stringIterator.current);
+  }
+  Expect.equals(false, stringIterator.moveNext());
+}
+
+Set<int> intSet = {
+  0,
+  1,
+  2,
+  3,
+  4,
+  5,
+  6,
+  7,
+  8,
+  9,
+  10,
+  11,
+  12,
+  13,
+  14,
+  15,
+  16,
+  17,
+  18,
+  19,
+  20,
+  21,
+  22,
+  23,
+  24,
+  25,
+  26,
+  27,
+  28,
+  29,
+  30,
+  31,
+  32,
+  33,
+  34,
+  35,
+  36,
+  37,
+  38,
+  39,
+  40,
+  41,
+  42,
+  43,
+  44,
+  45,
+  46,
+  47,
+  48,
+  49,
+  50,
+  51,
+  52,
+  53,
+  54,
+  55,
+  56,
+  57,
+  58,
+  59,
+  60,
+  61,
+  62,
+  63,
+  64,
+  65,
+  66,
+  67,
+  68,
+  69,
+  70,
+  71,
+  72,
+  73,
+  74,
+  75,
+  76,
+  77,
+  78,
+  79,
+  80,
+  81,
+  82,
+  83,
+  84,
+  85,
+  86,
+  87,
+  88,
+  89,
+  90,
+  91,
+  92,
+  93,
+  94,
+  95,
+  96,
+  97,
+  98,
+  99,
+  100,
+  101,
+  102,
+  103,
+  104,
+  105,
+  106,
+  107,
+  108,
+  109,
+  110,
+  111,
+  112,
+  113,
+  114,
+  115,
+  116,
+  117,
+  118,
+  119,
+  120,
+  121,
+  122,
+  123,
+  124,
+  125,
+  126,
+  127,
+  128,
+  129,
+  130,
+  131,
+  132,
+  133,
+  134,
+  135,
+  136,
+  137,
+  138,
+  139,
+  140,
+  141,
+  142,
+  143,
+  144,
+  145,
+  146,
+  147,
+  148,
+  149,
+  150,
+  151,
+  152,
+  153,
+  154,
+  155,
+  156,
+  157,
+  158,
+  159,
+  160,
+  161,
+  162,
+  163,
+  164,
+  165,
+  166,
+  167,
+  168,
+  169,
+  170,
+  171,
+  172,
+  173,
+  174,
+  175,
+  176,
+  177,
+  178,
+  179,
+  180,
+  181,
+  182,
+  183,
+  184,
+  185,
+  186,
+  187,
+  188,
+  189,
+  190,
+  191,
+  192,
+  193,
+  194,
+  195,
+  196,
+  197,
+  198,
+  199,
+  200,
+  201,
+  202,
+  203,
+  204,
+  205,
+  206,
+  207,
+  208,
+  209,
+  210,
+  211,
+  212,
+  213,
+  214,
+  215,
+  216,
+  217,
+  218,
+  219,
+  220,
+  221,
+  222,
+  223,
+  224,
+  225,
+  226,
+  227,
+  228,
+  229,
+  230,
+  231,
+  232,
+  233,
+  234,
+  235,
+  236,
+  237,
+  238,
+  239,
+  240,
+  241,
+  242,
+  243,
+  244,
+  245,
+  246,
+  247,
+  248,
+  249,
+  250,
+  251,
+  252,
+  253,
+  254,
+  255,
+  256,
+  257,
+  258,
+  259,
+  260,
+  261,
+  262,
+  263,
+  264,
+  265,
+  266,
+  267,
+  268,
+  269,
+  270,
+  271,
+  272,
+  273,
+  274,
+  275,
+  276,
+  277,
+  278,
+  279,
+  280,
+  281,
+  282,
+  283,
+  284,
+  285,
+  286,
+  287,
+  288,
+  289,
+  290,
+  291,
+  292,
+  293,
+  294,
+  295,
+  296,
+  297,
+  298,
+  299,
+  300,
+  301,
+  302,
+  303,
+  304,
+  305,
+  306,
+  307,
+  308,
+  309,
+  310,
+  311,
+  312,
+  313,
+  314,
+  315,
+  316,
+  317,
+  318,
+  319,
+  320,
+  321,
+  322,
+  323,
+  324,
+  325,
+  326,
+  327,
+  328,
+  329,
+  330,
+  331,
+  332,
+  333,
+  334,
+  335,
+  336,
+  337,
+  338,
+  339,
+  340,
+  341,
+  342,
+  343,
+  344,
+  345,
+  346,
+  347,
+  348,
+  349,
+  350,
+  351,
+  352,
+  353,
+  354,
+  355,
+  356,
+  357,
+  358,
+  359,
+  360,
+  361,
+  362,
+  363,
+  364,
+  365,
+  366,
+  367,
+  368,
+  369,
+  370,
+  371,
+  372,
+  373,
+  374,
+  375,
+  376,
+  377,
+  378,
+  379,
+  380,
+  381,
+  382,
+  383,
+  384,
+  385,
+  386,
+  387,
+  388,
+  389,
+  390,
+  391,
+  392,
+  393,
+  394,
+  395,
+  396,
+  397,
+  398,
+  399,
+  400,
+  401,
+  402,
+  403,
+  404,
+  405,
+  406,
+  407,
+  408,
+  409,
+  410,
+  411,
+  412,
+  413,
+  414,
+  415,
+  416,
+  417,
+  418,
+  419,
+  420,
+  421,
+  422,
+  423,
+  424,
+  425,
+  426,
+  427,
+  428,
+  429,
+  430,
+  431,
+  432,
+  433,
+  434,
+  435,
+  436,
+  437,
+  438,
+  439,
+  440,
+  441,
+  442,
+  443,
+  444,
+  445,
+  446,
+  447,
+  448,
+  449,
+  450,
+  451,
+  452,
+  453,
+  454,
+  455,
+  456,
+  457,
+  458,
+  459,
+  460,
+  461,
+  462,
+  463,
+  464,
+  465,
+  466,
+  467,
+  468,
+  469,
+  470,
+  471,
+  472,
+  473,
+  474,
+  475,
+  476,
+  477,
+  478,
+  479,
+  480,
+  481,
+  482,
+  483,
+  484,
+  485,
+  486,
+  487,
+  488,
+  489,
+  490,
+  491,
+  492,
+  493,
+  494,
+  495,
+  496,
+  497,
+  498,
+  499,
+  500,
+  501,
+  502,
+  503,
+  504,
+  505,
+  506,
+  507,
+  508,
+  509,
+  510,
+  511,
+  512,
+  513,
+  514,
+  515,
+  516,
+  517,
+  518,
+  519,
+  520,
+  521,
+  522,
+  523,
+  524,
+  525,
+  526,
+  527,
+  528,
+  529,
+  530,
+  531,
+  532,
+  533,
+  534,
+  535,
+  536,
+  537,
+  538,
+  539,
+  540,
+  541,
+  542,
+  543,
+  544,
+  545,
+  546,
+  547,
+  548,
+  549,
+  550,
+  551,
+  552,
+  553,
+  554,
+  555,
+  556,
+  557,
+  558,
+  559,
+  560,
+  561,
+  562,
+  563,
+  564,
+  565,
+  566,
+  567,
+  568,
+  569,
+  570,
+  571,
+  572,
+  573,
+  574,
+  575,
+  576,
+  577,
+  578,
+  579,
+  580,
+  581,
+  582,
+  583,
+  584,
+  585,
+  586,
+  587,
+  588,
+  589,
+  590,
+  591,
+  592,
+  593,
+  594,
+  595,
+  596,
+  597,
+  598,
+  599,
+  600,
+  601,
+  602,
+  603,
+  604,
+  605,
+  606,
+  607,
+  608,
+  609,
+  610,
+  611,
+  612,
+  613,
+  614,
+  615,
+  616,
+  617,
+  618,
+  619,
+  620,
+  621,
+  622,
+  623,
+  624,
+  625,
+  626,
+  627,
+  628,
+  629,
+  630,
+  631,
+  632,
+  633,
+  634,
+  635,
+  636,
+  637,
+  638,
+  639,
+  640,
+  641,
+  642,
+  643,
+  644,
+  645,
+  646,
+  647,
+  648,
+  649,
+  650,
+  651,
+  652,
+  653,
+  654,
+  655,
+  656,
+  657,
+  658,
+  659,
+  660,
+  661,
+  662,
+  663,
+  664,
+  665,
+  666,
+  667,
+  668,
+  669,
+  670,
+  671,
+  672,
+  673,
+  674,
+  675,
+  676,
+  677,
+  678,
+  679,
+  680,
+  681,
+  682,
+  683,
+  684,
+  685,
+  686,
+  687,
+  688,
+  689,
+  690,
+  691,
+  692,
+  693,
+  694,
+  695,
+  696,
+  697,
+  698,
+  699,
+  700,
+  701,
+  702,
+  703,
+  704,
+  705,
+  706,
+  707,
+  708,
+  709,
+  710,
+  711,
+  712,
+  713,
+  714,
+  715,
+  716,
+  717,
+  718,
+  719,
+  720,
+  721,
+  722,
+  723,
+  724,
+  725,
+  726,
+  727,
+  728,
+  729,
+  730,
+  731,
+  732,
+  733,
+  734,
+  735,
+  736,
+  737,
+  738,
+  739,
+  740,
+  741,
+  742,
+  743,
+  744,
+  745,
+  746,
+  747,
+  748,
+  749,
+  750,
+  751,
+  752,
+  753,
+  754,
+  755,
+  756,
+  757,
+  758,
+  759,
+  760,
+  761,
+  762,
+  763,
+  764,
+  765,
+  766,
+  767,
+  768,
+  769,
+  770,
+  771,
+  772,
+  773,
+  774,
+  775,
+  776,
+  777,
+  778,
+  779,
+  780,
+  781,
+  782,
+  783,
+  784,
+  785,
+  786,
+  787,
+  788,
+  789,
+  790,
+  791,
+  792,
+  793,
+  794,
+  795,
+  796,
+  797,
+  798,
+  799,
+  800,
+  801,
+  802,
+  803,
+  804,
+  805,
+  806,
+  807,
+  808,
+  809,
+  810,
+  811,
+  812,
+  813,
+  814,
+  815,
+  816,
+  817,
+  818,
+  819,
+  820,
+  821,
+  822,
+  823,
+  824,
+  825,
+  826,
+  827,
+  828,
+  829,
+  830,
+  831,
+  832,
+  833,
+  834,
+  835,
+  836,
+  837,
+  838,
+  839,
+  840,
+  841,
+  842,
+  843,
+  844,
+  845,
+  846,
+  847,
+  848,
+  849,
+  850,
+  851,
+  852,
+  853,
+  854,
+  855,
+  856,
+  857,
+  858,
+  859,
+  860,
+  861,
+  862,
+  863,
+  864,
+  865,
+  866,
+  867,
+  868,
+  869,
+  870,
+  871,
+  872,
+  873,
+  874,
+  875,
+  876,
+  877,
+  878,
+  879,
+  880,
+  881,
+  882,
+  883,
+  884,
+  885,
+  886,
+  887,
+  888,
+  889,
+  890,
+  891,
+  892,
+  893,
+  894,
+  895,
+  896,
+  897,
+  898,
+  899,
+  900,
+  901,
+  902,
+  903,
+  904,
+  905,
+  906,
+  907,
+  908,
+  909,
+  910,
+  911,
+  912,
+  913,
+  914,
+  915,
+  916,
+  917,
+  918,
+  919,
+  920,
+  921,
+  922,
+  923,
+  924,
+  925,
+  926,
+  927,
+  928,
+  929,
+  930,
+  931,
+  932,
+  933,
+  934,
+  935,
+  936,
+  937,
+  938,
+  939,
+  940,
+  941,
+  942,
+  943,
+  944,
+  945,
+  946,
+  947,
+  948,
+  949,
+  950,
+  951,
+  952,
+  953,
+  954,
+  955,
+  956,
+  957,
+  958,
+  959,
+  960,
+  961,
+  962,
+  963,
+  964,
+  965,
+  966,
+  967,
+  968,
+  969,
+  970,
+  971,
+  972,
+  973,
+  974,
+  975,
+  976,
+  977,
+  978,
+  979,
+  980,
+  981,
+  982,
+  983,
+  984,
+  985,
+  986,
+  987,
+  988,
+  989,
+  990,
+  991,
+  992,
+  993,
+  994,
+  995,
+  996,
+  997,
+  998,
+  999,
+  1000,
+  1001,
+  1002,
+  1003,
+  1004,
+  1005,
+  1006,
+  1007,
+  1008,
+  1009,
+  1010,
+  1011,
+  1012,
+  1013,
+  1014,
+  1015,
+  1016,
+  1017,
+  1018,
+  1019,
+  1020,
+  1021,
+  1022,
+  1023,
+  1024,
+  1025,
+  1026,
+  1027,
+  1028,
+  1029,
+  1030,
+  1031,
+  1032,
+  1033,
+  1034,
+  1035,
+  1036,
+  1037,
+  1038,
+  1039,
+  1040,
+  1041,
+  1042,
+  1043,
+  1044,
+  1045,
+  1046,
+  1047,
+  1048,
+  1049,
+  1050,
+  1051,
+  1052,
+  1053,
+  1054,
+  1055,
+  1056,
+  1057,
+  1058,
+  1059,
+  1060,
+  1061,
+  1062,
+  1063,
+  1064,
+  1065,
+  1066,
+  1067,
+  1068,
+  1069,
+  1070,
+  1071,
+  1072,
+  1073,
+  1074,
+  1075,
+  1076,
+  1077,
+  1078,
+  1079,
+  1080,
+  1081,
+  1082,
+  1083,
+  1084,
+  1085,
+  1086,
+  1087,
+  1088,
+  1089,
+  1090,
+  1091,
+  1092,
+  1093,
+  1094,
+  1095,
+  1096,
+  1097,
+  1098,
+  1099,
+  1100,
+  1101,
+  1102,
+  1103,
+  1104,
+  1105,
+  1106,
+  1107,
+  1108,
+  1109,
+  1110,
+  1111,
+  1112,
+  1113,
+  1114,
+  1115,
+  1116,
+  1117,
+  1118,
+  1119,
+  1120,
+  1121,
+  1122,
+  1123,
+  1124,
+  1125,
+  1126,
+  1127,
+  1128,
+  1129,
+  1130,
+  1131,
+  1132,
+  1133,
+  1134,
+  1135,
+  1136,
+  1137,
+  1138,
+  1139,
+  1140,
+  1141,
+  1142,
+  1143,
+  1144,
+  1145,
+  1146,
+  1147,
+  1148,
+  1149,
+  1150,
+  1151,
+  1152,
+  1153,
+  1154,
+  1155,
+  1156,
+  1157,
+  1158,
+  1159,
+  1160,
+  1161,
+  1162,
+  1163,
+  1164,
+  1165,
+  1166,
+  1167,
+  1168,
+  1169,
+  1170,
+  1171,
+  1172,
+  1173,
+  1174,
+  1175,
+  1176,
+  1177,
+  1178,
+  1179,
+  1180,
+  1181,
+  1182,
+  1183,
+  1184,
+  1185,
+  1186,
+  1187,
+  1188,
+  1189,
+  1190,
+  1191,
+  1192,
+  1193,
+  1194,
+  1195,
+  1196,
+  1197,
+  1198,
+  1199,
+  1200,
+  1201,
+  1202,
+  1203,
+  1204,
+  1205,
+  1206,
+  1207,
+  1208,
+  1209,
+  1210,
+  1211,
+  1212,
+  1213,
+  1214,
+  1215,
+  1216,
+  1217,
+  1218,
+  1219,
+  1220,
+  1221,
+  1222,
+  1223,
+  1224,
+  1225,
+  1226,
+  1227,
+  1228,
+  1229,
+  1230,
+  1231,
+  1232,
+  1233,
+  1234,
+  1235,
+  1236,
+  1237,
+  1238,
+  1239,
+  1240,
+  1241,
+  1242,
+  1243,
+  1244,
+  1245,
+  1246,
+  1247,
+  1248,
+  1249,
+  1250,
+  1251,
+  1252,
+  1253,
+  1254,
+  1255,
+  1256,
+  1257,
+  1258,
+  1259,
+  1260,
+  1261,
+  1262,
+  1263,
+  1264,
+  1265,
+  1266,
+  1267,
+  1268,
+  1269,
+  1270,
+  1271,
+  1272,
+  1273,
+  1274,
+  1275,
+  1276,
+  1277,
+  1278,
+  1279,
+  1280,
+  1281,
+  1282,
+  1283,
+  1284,
+  1285,
+  1286,
+  1287,
+  1288,
+  1289,
+  1290,
+  1291,
+  1292,
+  1293,
+  1294,
+  1295,
+  1296,
+  1297,
+  1298,
+  1299,
+  1300,
+  1301,
+  1302,
+  1303,
+  1304,
+  1305,
+  1306,
+  1307,
+  1308,
+  1309,
+  1310,
+  1311,
+  1312,
+  1313,
+  1314,
+  1315,
+  1316,
+  1317,
+  1318,
+  1319,
+  1320,
+  1321,
+  1322,
+  1323,
+  1324,
+  1325,
+  1326,
+  1327,
+  1328,
+  1329,
+  1330,
+  1331,
+  1332,
+  1333,
+  1334,
+  1335,
+  1336,
+  1337,
+  1338,
+  1339,
+  1340,
+  1341,
+  1342,
+  1343,
+  1344,
+  1345,
+  1346,
+  1347,
+  1348,
+  1349,
+  1350,
+  1351,
+  1352,
+  1353,
+  1354,
+  1355,
+  1356,
+  1357,
+  1358,
+  1359,
+  1360,
+  1361,
+  1362,
+  1363,
+  1364,
+  1365,
+  1366,
+  1367,
+  1368,
+  1369,
+  1370,
+  1371,
+  1372,
+  1373,
+  1374,
+  1375,
+  1376,
+  1377,
+  1378,
+  1379,
+  1380,
+  1381,
+  1382,
+  1383,
+  1384,
+  1385,
+  1386,
+  1387,
+  1388,
+  1389,
+  1390,
+  1391,
+  1392,
+  1393,
+  1394,
+  1395,
+  1396,
+  1397,
+  1398,
+  1399,
+  1400,
+  1401,
+  1402,
+  1403,
+  1404,
+  1405,
+  1406,
+  1407,
+  1408,
+  1409,
+  1410,
+  1411,
+  1412,
+  1413,
+  1414,
+  1415,
+  1416,
+  1417,
+  1418,
+  1419,
+  1420,
+  1421,
+  1422,
+  1423,
+  1424,
+  1425,
+  1426,
+  1427,
+  1428,
+  1429,
+  1430,
+  1431,
+  1432,
+  1433,
+  1434,
+  1435,
+  1436,
+  1437,
+  1438,
+  1439,
+  1440,
+  1441,
+  1442,
+  1443,
+  1444,
+  1445,
+  1446,
+  1447,
+  1448,
+  1449,
+  1450,
+  1451,
+  1452,
+  1453,
+  1454,
+  1455,
+  1456,
+  1457,
+  1458,
+  1459,
+  1460,
+  1461,
+  1462,
+  1463,
+  1464,
+  1465,
+  1466,
+  1467,
+  1468,
+  1469,
+  1470,
+  1471,
+  1472,
+  1473,
+  1474,
+  1475,
+  1476,
+  1477,
+  1478,
+  1479,
+  1480,
+  1481,
+  1482,
+  1483,
+  1484,
+  1485,
+  1486,
+  1487,
+  1488,
+  1489,
+  1490,
+  1491,
+  1492,
+  1493,
+  1494,
+  1495,
+  1496,
+  1497,
+  1498,
+  1499,
+  1500,
+  1501,
+  1502,
+  1503,
+  1504,
+  1505,
+  1506,
+  1507,
+  1508,
+  1509,
+  1510,
+  1511,
+  1512,
+  1513,
+  1514,
+  1515,
+  1516,
+  1517,
+  1518,
+  1519,
+  1520,
+  1521,
+  1522,
+  1523,
+  1524,
+  1525,
+  1526,
+  1527,
+  1528,
+  1529,
+  1530,
+  1531,
+  1532,
+  1533,
+  1534,
+  1535,
+  1536,
+  1537,
+  1538,
+  1539,
+  1540,
+  1541,
+  1542,
+  1543,
+  1544,
+  1545,
+  1546,
+  1547,
+  1548,
+  1549,
+  1550,
+  1551,
+  1552,
+  1553,
+  1554,
+  1555,
+  1556,
+  1557,
+  1558,
+  1559,
+  1560,
+  1561,
+  1562,
+  1563,
+  1564,
+  1565,
+  1566,
+  1567,
+  1568,
+  1569,
+  1570,
+  1571,
+  1572,
+  1573,
+  1574,
+  1575,
+  1576,
+  1577,
+  1578,
+  1579,
+  1580,
+  1581,
+  1582,
+  1583,
+  1584,
+  1585,
+  1586,
+  1587,
+  1588,
+  1589,
+  1590,
+  1591,
+  1592,
+  1593,
+  1594,
+  1595,
+  1596,
+  1597,
+  1598,
+  1599,
+  1600,
+  1601,
+  1602,
+  1603,
+  1604,
+  1605,
+  1606,
+  1607,
+  1608,
+  1609,
+  1610,
+  1611,
+  1612,
+  1613,
+  1614,
+  1615,
+  1616,
+  1617,
+  1618,
+  1619,
+  1620,
+  1621,
+  1622,
+  1623,
+  1624,
+  1625,
+  1626,
+  1627,
+  1628,
+  1629,
+  1630,
+  1631,
+  1632,
+  1633,
+  1634,
+  1635,
+  1636,
+  1637,
+  1638,
+  1639,
+  1640,
+  1641,
+  1642,
+  1643,
+  1644,
+  1645,
+  1646,
+  1647,
+  1648,
+  1649,
+  1650,
+  1651,
+  1652,
+  1653,
+  1654,
+  1655,
+  1656,
+  1657,
+  1658,
+  1659,
+  1660,
+  1661,
+  1662,
+  1663,
+  1664,
+  1665,
+  1666,
+  1667,
+  1668,
+  1669,
+  1670,
+  1671,
+  1672,
+  1673,
+  1674,
+  1675,
+  1676,
+  1677,
+  1678,
+  1679,
+  1680,
+  1681,
+  1682,
+  1683,
+  1684,
+  1685,
+  1686,
+  1687,
+  1688,
+  1689,
+  1690,
+  1691,
+  1692,
+  1693,
+  1694,
+  1695,
+  1696,
+  1697,
+  1698,
+  1699,
+  1700,
+  1701,
+  1702,
+  1703,
+  1704,
+  1705,
+  1706,
+  1707,
+  1708,
+  1709,
+  1710,
+  1711,
+  1712,
+  1713,
+  1714,
+  1715,
+  1716,
+  1717,
+  1718,
+  1719,
+  1720,
+  1721,
+  1722,
+  1723,
+  1724,
+  1725,
+  1726,
+  1727,
+  1728,
+  1729,
+  1730,
+  1731,
+  1732,
+  1733,
+  1734,
+  1735,
+  1736,
+  1737,
+  1738,
+  1739,
+  1740,
+  1741,
+  1742,
+  1743,
+  1744,
+  1745,
+  1746,
+  1747,
+  1748,
+  1749,
+  1750,
+  1751,
+  1752,
+  1753,
+  1754,
+  1755,
+  1756,
+  1757,
+  1758,
+  1759,
+  1760,
+  1761,
+  1762,
+  1763,
+  1764,
+  1765,
+  1766,
+  1767,
+  1768,
+  1769,
+  1770,
+  1771,
+  1772,
+  1773,
+  1774,
+  1775,
+  1776,
+  1777,
+  1778,
+  1779,
+  1780,
+  1781,
+  1782,
+  1783,
+  1784,
+  1785,
+  1786,
+  1787,
+  1788,
+  1789,
+  1790,
+  1791,
+  1792,
+  1793,
+  1794,
+  1795,
+  1796,
+  1797,
+  1798,
+  1799,
+  1800,
+  1801,
+  1802,
+  1803,
+  1804,
+  1805,
+  1806,
+  1807,
+  1808,
+  1809,
+  1810,
+  1811,
+  1812,
+  1813,
+  1814,
+  1815,
+  1816,
+  1817,
+  1818,
+  1819,
+  1820,
+  1821,
+  1822,
+  1823,
+  1824,
+  1825,
+  1826,
+  1827,
+  1828,
+  1829,
+  1830,
+  1831,
+  1832,
+  1833,
+  1834,
+  1835,
+  1836,
+  1837,
+  1838,
+  1839,
+  1840,
+  1841,
+  1842,
+  1843,
+  1844,
+  1845,
+  1846,
+  1847,
+  1848,
+  1849,
+  1850,
+  1851,
+  1852,
+  1853,
+  1854,
+  1855,
+  1856,
+  1857,
+  1858,
+  1859,
+  1860,
+  1861,
+  1862,
+  1863,
+  1864,
+  1865,
+  1866,
+  1867,
+  1868,
+  1869,
+  1870,
+  1871,
+  1872,
+  1873,
+  1874,
+  1875,
+  1876,
+  1877,
+  1878,
+  1879,
+  1880,
+  1881,
+  1882,
+  1883,
+  1884,
+  1885,
+  1886,
+  1887,
+  1888,
+  1889,
+  1890,
+  1891,
+  1892,
+  1893,
+  1894,
+  1895,
+  1896,
+  1897,
+  1898,
+  1899,
+  1900,
+  1901,
+  1902,
+  1903,
+  1904,
+  1905,
+  1906,
+  1907,
+  1908,
+  1909,
+  1910,
+  1911,
+  1912,
+  1913,
+  1914,
+  1915,
+  1916,
+  1917,
+  1918,
+  1919,
+  1920,
+  1921,
+  1922,
+  1923,
+  1924,
+  1925,
+  1926,
+  1927,
+  1928,
+  1929,
+  1930,
+  1931,
+  1932,
+  1933,
+  1934,
+  1935,
+  1936,
+  1937,
+  1938,
+  1939,
+  1940,
+  1941,
+  1942,
+  1943,
+  1944,
+  1945,
+  1946,
+  1947,
+  1948,
+  1949,
+  1950,
+  1951,
+  1952,
+  1953,
+  1954,
+  1955,
+  1956,
+  1957,
+  1958,
+  1959,
+  1960,
+  1961,
+  1962,
+  1963,
+  1964,
+  1965,
+  1966,
+  1967,
+  1968,
+  1969,
+  1970,
+  1971,
+  1972,
+  1973,
+  1974,
+  1975,
+  1976,
+  1977,
+  1978,
+  1979,
+  1980,
+  1981,
+  1982,
+  1983,
+  1984,
+  1985,
+  1986,
+  1987,
+  1988,
+  1989,
+  1990,
+  1991,
+  1992,
+  1993,
+  1994,
+  1995,
+  1996,
+  1997,
+  1998,
+  1999,
+  2000,
+  2001,
+  2002,
+  2003,
+  2004,
+  2005,
+  2006,
+  2007,
+  2008,
+  2009,
+  2010,
+  2011,
+  2012,
+  2013,
+  2014,
+  2015,
+  2016,
+  2017,
+  2018,
+  2019,
+  2020,
+  2021,
+  2022,
+  2023,
+  2024,
+  2025,
+  2026,
+  2027,
+  2028,
+  2029,
+  2030,
+  2031,
+  2032,
+  2033,
+  2034,
+  2035,
+  2036,
+  2037,
+  2038,
+  2039,
+  2040,
+  2041,
+  2042,
+  2043,
+  2044,
+  2045,
+  2046,
+  2047,
+  2048,
+  2049,
+  2050,
+  2051,
+  2052,
+  2053,
+  2054,
+  2055,
+  2056,
+  2057,
+  2058,
+  2059,
+  2060,
+  2061,
+  2062,
+  2063,
+  2064,
+  2065,
+  2066,
+  2067,
+  2068,
+  2069,
+  2070,
+  2071,
+  2072,
+  2073,
+  2074,
+  2075,
+  2076,
+  2077,
+  2078,
+  2079,
+  2080,
+  2081,
+  2082,
+  2083,
+  2084,
+  2085,
+  2086,
+  2087,
+  2088,
+  2089,
+  2090,
+  2091,
+  2092,
+  2093,
+  2094,
+  2095,
+  2096,
+  2097,
+  2098,
+  2099,
+  2100,
+  2101,
+  2102,
+  2103,
+  2104,
+  2105,
+  2106,
+  2107,
+  2108,
+  2109,
+  2110,
+  2111,
+  2112,
+  2113,
+  2114,
+  2115,
+  2116,
+  2117,
+  2118,
+  2119,
+  2120,
+  2121,
+  2122,
+  2123,
+  2124,
+  2125,
+  2126,
+  2127,
+  2128,
+  2129,
+  2130,
+  2131,
+  2132,
+  2133,
+  2134,
+  2135,
+  2136,
+  2137,
+  2138,
+  2139,
+  2140,
+  2141,
+  2142,
+  2143,
+  2144,
+  2145,
+  2146,
+  2147,
+  2148,
+  2149,
+  2150,
+  2151,
+  2152,
+  2153,
+  2154,
+  2155,
+  2156,
+  2157,
+  2158,
+  2159,
+  2160,
+  2161,
+  2162,
+  2163,
+  2164,
+  2165,
+  2166,
+  2167,
+  2168,
+  2169,
+  2170,
+  2171,
+  2172,
+  2173,
+  2174,
+  2175,
+  2176,
+  2177,
+  2178,
+  2179,
+  2180,
+  2181,
+  2182,
+  2183,
+  2184,
+  2185,
+  2186,
+  2187,
+  2188,
+  2189,
+  2190,
+  2191,
+  2192,
+  2193,
+  2194,
+  2195,
+  2196,
+  2197,
+  2198,
+  2199,
+  2200,
+  2201,
+  2202,
+  2203,
+  2204,
+  2205,
+  2206,
+  2207,
+  2208,
+  2209,
+  2210,
+  2211,
+  2212,
+  2213,
+  2214,
+  2215,
+  2216,
+  2217,
+  2218,
+  2219,
+  2220,
+  2221,
+  2222,
+  2223,
+  2224,
+  2225,
+  2226,
+  2227,
+  2228,
+  2229,
+  2230,
+  2231,
+  2232,
+  2233,
+  2234,
+  2235,
+  2236,
+  2237,
+  2238,
+  2239,
+  2240,
+  2241,
+  2242,
+  2243,
+  2244,
+  2245,
+  2246,
+  2247,
+  2248,
+  2249,
+  2250,
+  2251,
+  2252,
+  2253,
+  2254,
+  2255,
+  2256,
+  2257,
+  2258,
+  2259,
+  2260,
+  2261,
+  2262,
+  2263,
+  2264,
+  2265,
+  2266,
+  2267,
+  2268,
+  2269,
+  2270,
+  2271,
+  2272,
+  2273,
+  2274,
+  2275,
+  2276,
+  2277,
+  2278,
+  2279,
+  2280,
+  2281,
+  2282,
+  2283,
+  2284,
+  2285,
+  2286,
+  2287,
+  2288,
+  2289,
+  2290,
+  2291,
+  2292,
+  2293,
+  2294,
+  2295,
+  2296,
+  2297,
+  2298,
+  2299,
+  2300,
+  2301,
+  2302,
+  2303,
+  2304,
+  2305,
+  2306,
+  2307,
+  2308,
+  2309,
+  2310,
+  2311,
+  2312,
+  2313,
+  2314,
+  2315,
+  2316,
+  2317,
+  2318,
+  2319,
+  2320,
+  2321,
+  2322,
+  2323,
+  2324,
+  2325,
+  2326,
+  2327,
+  2328,
+  2329,
+  2330,
+  2331,
+  2332,
+  2333,
+  2334,
+  2335,
+  2336,
+  2337,
+  2338,
+  2339,
+  2340,
+  2341,
+  2342,
+  2343,
+  2344,
+  2345,
+  2346,
+  2347,
+  2348,
+  2349,
+  2350,
+  2351,
+  2352,
+  2353,
+  2354,
+  2355,
+  2356,
+  2357,
+  2358,
+  2359,
+  2360,
+  2361,
+  2362,
+  2363,
+  2364,
+  2365,
+  2366,
+  2367,
+  2368,
+  2369,
+  2370,
+  2371,
+  2372,
+  2373,
+  2374,
+  2375,
+  2376,
+  2377,
+  2378,
+  2379,
+  2380,
+  2381,
+  2382,
+  2383,
+  2384,
+  2385,
+  2386,
+  2387,
+  2388,
+  2389,
+  2390,
+  2391,
+  2392,
+  2393,
+  2394,
+  2395,
+  2396,
+  2397,
+  2398,
+  2399,
+  2400,
+  2401,
+  2402,
+  2403,
+  2404,
+  2405,
+  2406,
+  2407,
+  2408,
+  2409,
+  2410,
+  2411,
+  2412,
+  2413,
+  2414,
+  2415,
+  2416,
+  2417,
+  2418,
+  2419,
+  2420,
+  2421,
+  2422,
+  2423,
+  2424,
+  2425,
+  2426,
+  2427,
+  2428,
+  2429,
+  2430,
+  2431,
+  2432,
+  2433,
+  2434,
+  2435,
+  2436,
+  2437,
+  2438,
+  2439,
+  2440,
+  2441,
+  2442,
+  2443,
+  2444,
+  2445,
+  2446,
+  2447,
+  2448,
+  2449,
+  2450,
+  2451,
+  2452,
+  2453,
+  2454,
+  2455,
+  2456,
+  2457,
+  2458,
+  2459,
+  2460,
+  2461,
+  2462,
+  2463,
+  2464,
+  2465,
+  2466,
+  2467,
+  2468,
+  2469,
+  2470,
+  2471,
+  2472,
+  2473,
+  2474,
+  2475,
+  2476,
+  2477,
+  2478,
+  2479,
+  2480,
+  2481,
+  2482,
+  2483,
+  2484,
+  2485,
+  2486,
+  2487,
+  2488,
+  2489,
+  2490,
+  2491,
+  2492,
+  2493,
+  2494,
+  2495,
+  2496,
+  2497,
+  2498,
+  2499,
+  2500,
+  2501,
+  2502,
+  2503,
+  2504,
+  2505,
+  2506,
+  2507,
+  2508,
+  2509,
+  2510,
+  2511,
+  2512,
+  2513,
+  2514,
+  2515,
+  2516,
+  2517,
+  2518,
+  2519,
+  2520,
+  2521,
+  2522,
+  2523,
+  2524,
+  2525,
+  2526,
+  2527,
+  2528,
+  2529,
+  2530,
+  2531,
+  2532,
+  2533,
+  2534,
+  2535,
+  2536,
+  2537,
+  2538,
+  2539,
+  2540,
+  2541,
+  2542,
+  2543,
+  2544,
+  2545,
+  2546,
+  2547,
+  2548,
+  2549,
+  2550,
+  2551,
+  2552,
+  2553,
+  2554,
+  2555,
+  2556,
+  2557,
+  2558,
+  2559,
+  2560,
+  2561,
+  2562,
+  2563,
+  2564,
+  2565,
+  2566,
+  2567,
+  2568,
+  2569,
+  2570,
+  2571,
+  2572,
+  2573,
+  2574,
+  2575,
+  2576,
+  2577,
+  2578,
+  2579,
+  2580,
+  2581,
+  2582,
+  2583,
+  2584,
+  2585,
+  2586,
+  2587,
+  2588,
+  2589,
+  2590,
+  2591,
+  2592,
+  2593,
+  2594,
+  2595,
+  2596,
+  2597,
+  2598,
+  2599,
+  2600,
+  2601,
+  2602,
+  2603,
+  2604,
+  2605,
+  2606,
+  2607,
+  2608,
+  2609,
+  2610,
+  2611,
+  2612,
+  2613,
+  2614,
+  2615,
+  2616,
+  2617,
+  2618,
+  2619,
+  2620,
+  2621,
+  2622,
+  2623,
+  2624,
+  2625,
+  2626,
+  2627,
+  2628,
+  2629,
+  2630,
+  2631,
+  2632,
+  2633,
+  2634,
+  2635,
+  2636,
+  2637,
+  2638,
+  2639,
+  2640,
+  2641,
+  2642,
+  2643,
+  2644,
+  2645,
+  2646,
+  2647,
+  2648,
+  2649,
+  2650,
+  2651,
+  2652,
+  2653,
+  2654,
+  2655,
+  2656,
+  2657,
+  2658,
+  2659,
+  2660,
+  2661,
+  2662,
+  2663,
+  2664,
+  2665,
+  2666,
+  2667,
+  2668,
+  2669,
+  2670,
+  2671,
+  2672,
+  2673,
+  2674,
+  2675,
+  2676,
+  2677,
+  2678,
+  2679,
+  2680,
+  2681,
+  2682,
+  2683,
+  2684,
+  2685,
+  2686,
+  2687,
+  2688,
+  2689,
+  2690,
+  2691,
+  2692,
+  2693,
+  2694,
+  2695,
+  2696,
+  2697,
+  2698,
+  2699,
+  2700,
+  2701,
+  2702,
+  2703,
+  2704,
+  2705,
+  2706,
+  2707,
+  2708,
+  2709,
+  2710,
+  2711,
+  2712,
+  2713,
+  2714,
+  2715,
+  2716,
+  2717,
+  2718,
+  2719,
+  2720,
+  2721,
+  2722,
+  2723,
+  2724,
+  2725,
+  2726,
+  2727,
+  2728,
+  2729,
+  2730,
+  2731,
+  2732,
+  2733,
+  2734,
+  2735,
+  2736,
+  2737,
+  2738,
+  2739,
+  2740,
+  2741,
+  2742,
+  2743,
+  2744,
+  2745,
+  2746,
+  2747,
+  2748,
+  2749,
+  2750,
+  2751,
+  2752,
+  2753,
+  2754,
+  2755,
+  2756,
+  2757,
+  2758,
+  2759,
+  2760,
+  2761,
+  2762,
+  2763,
+  2764,
+  2765,
+  2766,
+  2767,
+  2768,
+  2769,
+  2770,
+  2771,
+  2772,
+  2773,
+  2774,
+  2775,
+  2776,
+  2777,
+  2778,
+  2779,
+  2780,
+  2781,
+  2782,
+  2783,
+  2784,
+  2785,
+  2786,
+  2787,
+  2788,
+  2789,
+  2790,
+  2791,
+  2792,
+  2793,
+  2794,
+  2795,
+  2796,
+  2797,
+  2798,
+  2799,
+  2800,
+  2801,
+  2802,
+  2803,
+  2804,
+  2805,
+  2806,
+  2807,
+  2808,
+  2809,
+  2810,
+  2811,
+  2812,
+  2813,
+  2814,
+  2815,
+  2816,
+  2817,
+  2818,
+  2819,
+  2820,
+  2821,
+  2822,
+  2823,
+  2824,
+  2825,
+  2826,
+  2827,
+  2828,
+  2829,
+  2830,
+  2831,
+  2832,
+  2833,
+  2834,
+  2835,
+  2836,
+  2837,
+  2838,
+  2839,
+  2840,
+  2841,
+  2842,
+  2843,
+  2844,
+  2845,
+  2846,
+  2847,
+  2848,
+  2849,
+  2850,
+  2851,
+  2852,
+  2853,
+  2854,
+  2855,
+  2856,
+  2857,
+  2858,
+  2859,
+  2860,
+  2861,
+  2862,
+  2863,
+  2864,
+  2865,
+  2866,
+  2867,
+  2868,
+  2869,
+  2870,
+  2871,
+  2872,
+  2873,
+  2874,
+  2875,
+  2876,
+  2877,
+  2878,
+  2879,
+  2880,
+  2881,
+  2882,
+  2883,
+  2884,
+  2885,
+  2886,
+  2887,
+  2888,
+  2889,
+  2890,
+  2891,
+  2892,
+  2893,
+  2894,
+  2895,
+  2896,
+  2897,
+  2898,
+  2899,
+  2900,
+  2901,
+  2902,
+  2903,
+  2904,
+  2905,
+  2906,
+  2907,
+  2908,
+  2909,
+  2910,
+  2911,
+  2912,
+  2913,
+  2914,
+  2915,
+  2916,
+  2917,
+  2918,
+  2919,
+  2920,
+  2921,
+  2922,
+  2923,
+  2924,
+  2925,
+  2926,
+  2927,
+  2928,
+  2929,
+  2930,
+  2931,
+  2932,
+  2933,
+  2934,
+  2935,
+  2936,
+  2937,
+  2938,
+  2939,
+  2940,
+  2941,
+  2942,
+  2943,
+  2944,
+  2945,
+  2946,
+  2947,
+  2948,
+  2949,
+  2950,
+  2951,
+  2952,
+  2953,
+  2954,
+  2955,
+  2956,
+  2957,
+  2958,
+  2959,
+  2960,
+  2961,
+  2962,
+  2963,
+  2964,
+  2965,
+  2966,
+  2967,
+  2968,
+  2969,
+  2970,
+  2971,
+  2972,
+  2973,
+  2974,
+  2975,
+  2976,
+  2977,
+  2978,
+  2979,
+  2980,
+  2981,
+  2982,
+  2983,
+  2984,
+  2985,
+  2986,
+  2987,
+  2988,
+  2989,
+  2990,
+  2991,
+  2992,
+  2993,
+  2994,
+  2995,
+  2996,
+  2997,
+  2998,
+  2999,
+  3000,
+  3001,
+  3002,
+  3003,
+  3004,
+  3005,
+  3006,
+  3007,
+  3008,
+  3009,
+  3010,
+  3011,
+  3012,
+  3013,
+  3014,
+  3015,
+  3016,
+  3017,
+  3018,
+  3019,
+  3020,
+  3021,
+  3022,
+  3023,
+  3024,
+  3025,
+  3026,
+  3027,
+  3028,
+  3029,
+  3030,
+  3031,
+  3032,
+  3033,
+  3034,
+  3035,
+  3036,
+  3037,
+  3038,
+  3039,
+  3040,
+  3041,
+  3042,
+  3043,
+  3044,
+  3045,
+  3046,
+  3047,
+  3048,
+  3049,
+  3050,
+  3051,
+  3052,
+  3053,
+  3054,
+  3055,
+  3056,
+  3057,
+  3058,
+  3059,
+  3060,
+  3061,
+  3062,
+  3063,
+  3064,
+  3065,
+  3066,
+  3067,
+  3068,
+  3069,
+  3070,
+  3071,
+  3072,
+  3073,
+  3074,
+  3075,
+  3076,
+  3077,
+  3078,
+  3079,
+  3080,
+  3081,
+  3082,
+  3083,
+  3084,
+  3085,
+  3086,
+  3087,
+  3088,
+  3089,
+  3090,
+  3091,
+  3092,
+  3093,
+  3094,
+  3095,
+  3096,
+  3097,
+  3098,
+  3099,
+  3100,
+  3101,
+  3102,
+  3103,
+  3104,
+  3105,
+  3106,
+  3107,
+  3108,
+  3109,
+  3110,
+  3111,
+  3112,
+  3113,
+  3114,
+  3115,
+  3116,
+  3117,
+  3118,
+  3119,
+  3120,
+  3121,
+  3122,
+  3123,
+  3124,
+  3125,
+  3126,
+  3127,
+  3128,
+  3129,
+  3130,
+  3131,
+  3132,
+  3133,
+  3134,
+  3135,
+  3136,
+  3137,
+  3138,
+  3139,
+  3140,
+  3141,
+  3142,
+  3143,
+  3144,
+  3145,
+  3146,
+  3147,
+  3148,
+  3149,
+  3150,
+  3151,
+  3152,
+  3153,
+  3154,
+  3155,
+  3156,
+  3157,
+  3158,
+  3159,
+  3160,
+  3161,
+  3162,
+  3163,
+  3164,
+  3165,
+  3166,
+  3167,
+  3168,
+  3169,
+  3170,
+  3171,
+  3172,
+  3173,
+  3174,
+  3175,
+  3176,
+  3177,
+  3178,
+  3179,
+  3180,
+  3181,
+  3182,
+  3183,
+  3184,
+  3185,
+  3186,
+  3187,
+  3188,
+  3189,
+  3190,
+  3191,
+  3192,
+  3193,
+  3194,
+  3195,
+  3196,
+  3197,
+  3198,
+  3199,
+  3200,
+  3201,
+  3202,
+  3203,
+  3204,
+  3205,
+  3206,
+  3207,
+  3208,
+  3209,
+  3210,
+  3211,
+  3212,
+  3213,
+  3214,
+  3215,
+  3216,
+  3217,
+  3218,
+  3219,
+  3220,
+  3221,
+  3222,
+  3223,
+  3224,
+  3225,
+  3226,
+  3227,
+  3228,
+  3229,
+  3230,
+  3231,
+  3232,
+  3233,
+  3234,
+  3235,
+  3236,
+  3237,
+  3238,
+  3239,
+  3240,
+  3241,
+  3242,
+  3243,
+  3244,
+  3245,
+  3246,
+  3247,
+  3248,
+  3249,
+  3250,
+  3251,
+  3252,
+  3253,
+  3254,
+  3255,
+  3256,
+  3257,
+  3258,
+  3259,
+  3260,
+  3261,
+  3262,
+  3263,
+  3264,
+  3265,
+  3266,
+  3267,
+  3268,
+  3269,
+  3270,
+  3271,
+  3272,
+  3273,
+  3274,
+  3275,
+  3276,
+  3277,
+  3278,
+  3279,
+  3280,
+  3281,
+  3282,
+  3283,
+  3284,
+  3285,
+  3286,
+  3287,
+  3288,
+  3289,
+  3290,
+  3291,
+  3292,
+  3293,
+  3294,
+  3295,
+  3296,
+  3297,
+  3298,
+  3299,
+  3300,
+  3301,
+  3302,
+  3303,
+  3304,
+  3305,
+  3306,
+  3307,
+  3308,
+  3309,
+  3310,
+  3311,
+  3312,
+  3313,
+  3314,
+  3315,
+  3316,
+  3317,
+  3318,
+  3319,
+  3320,
+  3321,
+  3322,
+  3323,
+  3324,
+  3325,
+  3326,
+  3327,
+  3328,
+  3329,
+  3330,
+  3331,
+  3332,
+  3333,
+  3334,
+  3335,
+  3336,
+  3337,
+  3338,
+  3339,
+  3340,
+  3341,
+  3342,
+  3343,
+  3344,
+  3345,
+  3346,
+  3347,
+  3348,
+  3349,
+  3350,
+  3351,
+  3352,
+  3353,
+  3354,
+  3355,
+  3356,
+  3357,
+  3358,
+  3359,
+  3360,
+  3361,
+  3362,
+  3363,
+  3364,
+  3365,
+  3366,
+  3367,
+  3368,
+  3369,
+  3370,
+  3371,
+  3372,
+  3373,
+  3374,
+  3375,
+  3376,
+  3377,
+  3378,
+  3379,
+  3380,
+  3381,
+  3382,
+  3383,
+  3384,
+  3385,
+  3386,
+  3387,
+  3388,
+  3389,
+  3390,
+  3391,
+  3392,
+  3393,
+  3394,
+  3395,
+  3396,
+  3397,
+  3398,
+  3399,
+  3400,
+  3401,
+  3402,
+  3403,
+  3404,
+  3405,
+  3406,
+  3407,
+  3408,
+  3409,
+  3410,
+  3411,
+  3412,
+  3413,
+  3414,
+  3415,
+  3416,
+  3417,
+  3418,
+  3419,
+  3420,
+  3421,
+  3422,
+  3423,
+  3424,
+  3425,
+  3426,
+  3427,
+  3428,
+  3429,
+  3430,
+  3431,
+  3432,
+  3433,
+  3434,
+  3435,
+  3436,
+  3437,
+  3438,
+  3439,
+  3440,
+  3441,
+  3442,
+  3443,
+  3444,
+  3445,
+  3446,
+  3447,
+  3448,
+  3449,
+  3450,
+  3451,
+  3452,
+  3453,
+  3454,
+  3455,
+  3456,
+  3457,
+  3458,
+  3459,
+  3460,
+  3461,
+  3462,
+  3463,
+  3464,
+  3465,
+  3466,
+  3467,
+  3468,
+  3469,
+  3470,
+  3471,
+  3472,
+  3473,
+  3474,
+  3475,
+  3476,
+  3477,
+  3478,
+  3479,
+  3480,
+  3481,
+  3482,
+  3483,
+  3484,
+  3485,
+  3486,
+  3487,
+  3488,
+  3489,
+  3490,
+  3491,
+  3492,
+  3493,
+  3494,
+  3495,
+  3496,
+  3497,
+  3498,
+  3499,
+  3500,
+  3501,
+  3502,
+  3503,
+  3504,
+  3505,
+  3506,
+  3507,
+  3508,
+  3509,
+  3510,
+  3511,
+  3512,
+  3513,
+  3514,
+  3515,
+  3516,
+  3517,
+  3518,
+  3519,
+  3520,
+  3521,
+  3522,
+  3523,
+  3524,
+  3525,
+  3526,
+  3527,
+  3528,
+  3529,
+  3530,
+  3531,
+  3532,
+  3533,
+  3534,
+  3535,
+  3536,
+  3537,
+  3538,
+  3539,
+  3540,
+  3541,
+  3542,
+  3543,
+  3544,
+  3545,
+  3546,
+  3547,
+  3548,
+  3549,
+  3550,
+  3551,
+  3552,
+  3553,
+  3554,
+  3555,
+  3556,
+  3557,
+  3558,
+  3559,
+  3560,
+  3561,
+  3562,
+  3563,
+  3564,
+  3565,
+  3566,
+  3567,
+  3568,
+  3569,
+  3570,
+  3571,
+  3572,
+  3573,
+  3574,
+  3575,
+  3576,
+  3577,
+  3578,
+  3579,
+  3580,
+  3581,
+  3582,
+  3583,
+  3584,
+  3585,
+  3586,
+  3587,
+  3588,
+  3589,
+  3590,
+  3591,
+  3592,
+  3593,
+  3594,
+  3595,
+  3596,
+  3597,
+  3598,
+  3599,
+  3600,
+  3601,
+  3602,
+  3603,
+  3604,
+  3605,
+  3606,
+  3607,
+  3608,
+  3609,
+  3610,
+  3611,
+  3612,
+  3613,
+  3614,
+  3615,
+  3616,
+  3617,
+  3618,
+  3619,
+  3620,
+  3621,
+  3622,
+  3623,
+  3624,
+  3625,
+  3626,
+  3627,
+  3628,
+  3629,
+  3630,
+  3631,
+  3632,
+  3633,
+  3634,
+  3635,
+  3636,
+  3637,
+  3638,
+  3639,
+  3640,
+  3641,
+  3642,
+  3643,
+  3644,
+  3645,
+  3646,
+  3647,
+  3648,
+  3649,
+  3650,
+  3651,
+  3652,
+  3653,
+  3654,
+  3655,
+  3656,
+  3657,
+  3658,
+  3659,
+  3660,
+  3661,
+  3662,
+  3663,
+  3664,
+  3665,
+  3666,
+  3667,
+  3668,
+  3669,
+  3670,
+  3671,
+  3672,
+  3673,
+  3674,
+  3675,
+  3676,
+  3677,
+  3678,
+  3679,
+  3680,
+  3681,
+  3682,
+  3683,
+  3684,
+  3685,
+  3686,
+  3687,
+  3688,
+  3689,
+  3690,
+  3691,
+  3692,
+  3693,
+  3694,
+  3695,
+  3696,
+  3697,
+  3698,
+  3699,
+  3700,
+  3701,
+  3702,
+  3703,
+  3704,
+  3705,
+  3706,
+  3707,
+  3708,
+  3709,
+  3710,
+  3711,
+  3712,
+  3713,
+  3714,
+  3715,
+  3716,
+  3717,
+  3718,
+  3719,
+  3720,
+  3721,
+  3722,
+  3723,
+  3724,
+  3725,
+  3726,
+  3727,
+  3728,
+  3729,
+  3730,
+  3731,
+  3732,
+  3733,
+  3734,
+  3735,
+  3736,
+  3737,
+  3738,
+  3739,
+  3740,
+  3741,
+  3742,
+  3743,
+  3744,
+  3745,
+  3746,
+  3747,
+  3748,
+  3749,
+  3750,
+  3751,
+  3752,
+  3753,
+  3754,
+  3755,
+  3756,
+  3757,
+  3758,
+  3759,
+  3760,
+  3761,
+  3762,
+  3763,
+  3764,
+  3765,
+  3766,
+  3767,
+  3768,
+  3769,
+  3770,
+  3771,
+  3772,
+  3773,
+  3774,
+  3775,
+  3776,
+  3777,
+  3778,
+  3779,
+  3780,
+  3781,
+  3782,
+  3783,
+  3784,
+  3785,
+  3786,
+  3787,
+  3788,
+  3789,
+  3790,
+  3791,
+  3792,
+  3793,
+  3794,
+  3795,
+  3796,
+  3797,
+  3798,
+  3799,
+  3800,
+  3801,
+  3802,
+  3803,
+  3804,
+  3805,
+  3806,
+  3807,
+  3808,
+  3809,
+  3810,
+  3811,
+  3812,
+  3813,
+  3814,
+  3815,
+  3816,
+  3817,
+  3818,
+  3819,
+  3820,
+  3821,
+  3822,
+  3823,
+  3824,
+  3825,
+  3826,
+  3827,
+  3828,
+  3829,
+  3830,
+  3831,
+  3832,
+  3833,
+  3834,
+  3835,
+  3836,
+  3837,
+  3838,
+  3839,
+  3840,
+  3841,
+  3842,
+  3843,
+  3844,
+  3845,
+  3846,
+  3847,
+  3848,
+  3849,
+  3850,
+  3851,
+  3852,
+  3853,
+  3854,
+  3855,
+  3856,
+  3857,
+  3858,
+  3859,
+  3860,
+  3861,
+  3862,
+  3863,
+  3864,
+  3865,
+  3866,
+  3867,
+  3868,
+  3869,
+  3870,
+  3871,
+  3872,
+  3873,
+  3874,
+  3875,
+  3876,
+  3877,
+  3878,
+  3879,
+  3880,
+  3881,
+  3882,
+  3883,
+  3884,
+  3885,
+  3886,
+  3887,
+  3888,
+  3889,
+  3890,
+  3891,
+  3892,
+  3893,
+  3894,
+  3895,
+  3896,
+  3897,
+  3898,
+  3899,
+  3900,
+  3901,
+  3902,
+  3903,
+  3904,
+  3905,
+  3906,
+  3907,
+  3908,
+  3909,
+  3910,
+  3911,
+  3912,
+  3913,
+  3914,
+  3915,
+  3916,
+  3917,
+  3918,
+  3919,
+  3920,
+  3921,
+  3922,
+  3923,
+  3924,
+  3925,
+  3926,
+  3927,
+  3928,
+  3929,
+  3930,
+  3931,
+  3932,
+  3933,
+  3934,
+  3935,
+  3936,
+  3937,
+  3938,
+  3939,
+  3940,
+  3941,
+  3942,
+  3943,
+  3944,
+  3945,
+  3946,
+  3947,
+  3948,
+  3949,
+  3950,
+  3951,
+  3952,
+  3953,
+  3954,
+  3955,
+  3956,
+  3957,
+  3958,
+  3959,
+  3960,
+  3961,
+  3962,
+  3963,
+  3964,
+  3965,
+  3966,
+  3967,
+  3968,
+  3969,
+  3970,
+  3971,
+  3972,
+  3973,
+  3974,
+  3975,
+  3976,
+  3977,
+  3978,
+  3979,
+  3980,
+  3981,
+  3982,
+  3983,
+  3984,
+  3985,
+  3986,
+  3987,
+  3988,
+  3989,
+  3990,
+  3991,
+  3992,
+  3993,
+  3994,
+  3995,
+  3996,
+  3997,
+  3998,
+  3999,
+  4000,
+  4001,
+  4002,
+  4003,
+  4004,
+  4005,
+  4006,
+  4007,
+  4008,
+  4009,
+  4010,
+  4011,
+  4012,
+  4013,
+  4014,
+  4015,
+  4016,
+  4017,
+  4018,
+  4019,
+  4020,
+  4021,
+  4022,
+  4023,
+  4024,
+  4025,
+  4026,
+  4027,
+  4028,
+  4029,
+  4030,
+  4031,
+  4032,
+  4033,
+  4034,
+  4035,
+  4036,
+  4037,
+  4038,
+  4039,
+  4040,
+  4041,
+  4042,
+  4043,
+  4044,
+  4045,
+  4046,
+  4047,
+  4048,
+  4049,
+  4050,
+  4051,
+  4052,
+  4053,
+  4054,
+  4055,
+  4056,
+  4057,
+  4058,
+  4059,
+  4060,
+  4061,
+  4062,
+  4063,
+  4064,
+  4065,
+  4066,
+  4067,
+  4068,
+  4069,
+  4070,
+  4071,
+  4072,
+  4073,
+  4074,
+  4075,
+  4076,
+  4077,
+  4078,
+  4079,
+  4080,
+  4081,
+  4082,
+  4083,
+  4084,
+  4085,
+  4086,
+  4087,
+  4088,
+  4089,
+  4090,
+  4091,
+  4092,
+  4093,
+  4094,
+  4095,
+  4096,
+  4097,
+  4098,
+  4099,
+  4100,
+  4101,
+  4102,
+  4103,
+  4104,
+  4105,
+  4106,
+  4107,
+  4108,
+  4109,
+  4110,
+  4111,
+  4112,
+  4113,
+  4114,
+  4115,
+  4116,
+  4117,
+  4118,
+  4119,
+  4120,
+  4121,
+  4122,
+  4123,
+  4124,
+  4125,
+  4126,
+  4127,
+  4128,
+  4129,
+  4130,
+  4131,
+  4132,
+  4133,
+  4134,
+  4135,
+  4136,
+  4137,
+  4138,
+  4139,
+  4140,
+  4141,
+  4142,
+  4143,
+  4144,
+  4145,
+  4146,
+  4147,
+  4148,
+  4149,
+  4150,
+  4151,
+  4152,
+  4153,
+  4154,
+  4155,
+  4156,
+  4157,
+  4158,
+  4159,
+  4160,
+  4161,
+  4162,
+  4163,
+  4164,
+  4165,
+  4166,
+  4167,
+  4168,
+  4169,
+  4170,
+  4171,
+  4172,
+  4173,
+  4174,
+  4175,
+  4176,
+  4177,
+  4178,
+  4179,
+  4180,
+  4181,
+  4182,
+  4183,
+  4184,
+  4185,
+  4186,
+  4187,
+  4188,
+  4189,
+  4190,
+  4191,
+  4192,
+  4193,
+  4194,
+  4195,
+  4196,
+  4197,
+  4198,
+  4199,
+  4200,
+  4201,
+  4202,
+  4203,
+  4204,
+  4205,
+  4206,
+  4207,
+  4208,
+  4209,
+  4210,
+  4211,
+  4212,
+  4213,
+  4214,
+  4215,
+  4216,
+  4217,
+  4218,
+  4219,
+  4220,
+  4221,
+  4222,
+  4223,
+  4224,
+  4225,
+  4226,
+  4227,
+  4228,
+  4229,
+  4230,
+  4231,
+  4232,
+  4233,
+  4234,
+  4235,
+  4236,
+  4237,
+  4238,
+  4239,
+  4240,
+  4241,
+  4242,
+  4243,
+  4244,
+  4245,
+  4246,
+  4247,
+  4248,
+  4249,
+  4250,
+  4251,
+  4252,
+  4253,
+  4254,
+  4255,
+  4256,
+  4257,
+  4258,
+  4259,
+  4260,
+  4261,
+  4262,
+  4263,
+  4264,
+  4265,
+  4266,
+  4267,
+  4268,
+  4269,
+  4270,
+  4271,
+  4272,
+  4273,
+  4274,
+  4275,
+  4276,
+  4277,
+  4278,
+  4279,
+  4280,
+  4281,
+  4282,
+  4283,
+  4284,
+  4285,
+  4286,
+  4287,
+  4288,
+  4289,
+  4290,
+  4291,
+  4292,
+  4293,
+  4294,
+  4295,
+  4296,
+  4297,
+  4298,
+  4299,
+  4300,
+  4301,
+  4302,
+  4303,
+  4304,
+  4305,
+  4306,
+  4307,
+  4308,
+  4309,
+  4310,
+  4311,
+  4312,
+  4313,
+  4314,
+  4315,
+  4316,
+  4317,
+  4318,
+  4319,
+  4320,
+  4321,
+  4322,
+  4323,
+  4324,
+  4325,
+  4326,
+  4327,
+  4328,
+  4329,
+  4330,
+  4331,
+  4332,
+  4333,
+  4334,
+  4335,
+  4336,
+  4337,
+  4338,
+  4339,
+  4340,
+  4341,
+  4342,
+  4343,
+  4344,
+  4345,
+  4346,
+  4347,
+  4348,
+  4349,
+  4350,
+  4351,
+  4352,
+  4353,
+  4354,
+  4355,
+  4356,
+  4357,
+  4358,
+  4359,
+  4360,
+  4361,
+  4362,
+  4363,
+  4364,
+  4365,
+  4366,
+  4367,
+  4368,
+  4369,
+  4370,
+  4371,
+  4372,
+  4373,
+  4374,
+  4375,
+  4376,
+  4377,
+  4378,
+  4379,
+  4380,
+  4381,
+  4382,
+  4383,
+  4384,
+  4385,
+  4386,
+  4387,
+  4388,
+  4389,
+  4390,
+  4391,
+  4392,
+  4393,
+  4394,
+  4395,
+  4396,
+  4397,
+  4398,
+  4399,
+  4400,
+  4401,
+  4402,
+  4403,
+  4404,
+  4405,
+  4406,
+  4407,
+  4408,
+  4409,
+  4410,
+  4411,
+  4412,
+  4413,
+  4414,
+  4415,
+  4416,
+  4417,
+  4418,
+  4419,
+  4420,
+  4421,
+  4422,
+  4423,
+  4424,
+  4425,
+  4426,
+  4427,
+  4428,
+  4429,
+  4430,
+  4431,
+  4432,
+  4433,
+  4434,
+  4435,
+  4436,
+  4437,
+  4438,
+  4439,
+  4440,
+  4441,
+  4442,
+  4443,
+  4444,
+  4445,
+  4446,
+  4447,
+  4448,
+  4449,
+  4450,
+  4451,
+  4452,
+  4453,
+  4454,
+  4455,
+  4456,
+  4457,
+  4458,
+  4459,
+  4460,
+  4461,
+  4462,
+  4463,
+  4464,
+  4465,
+  4466,
+  4467,
+  4468,
+  4469,
+  4470,
+  4471,
+  4472,
+  4473,
+  4474,
+  4475,
+  4476,
+  4477,
+  4478,
+  4479,
+  4480,
+  4481,
+  4482,
+  4483,
+  4484,
+  4485,
+  4486,
+  4487,
+  4488,
+  4489,
+  4490,
+  4491,
+  4492,
+  4493,
+  4494,
+  4495,
+  4496,
+  4497,
+  4498,
+  4499,
+  4500,
+  4501,
+  4502,
+  4503,
+  4504,
+  4505,
+  4506,
+  4507,
+  4508,
+  4509,
+  4510,
+  4511,
+  4512,
+  4513,
+  4514,
+  4515,
+  4516,
+  4517,
+  4518,
+  4519,
+  4520,
+  4521,
+  4522,
+  4523,
+  4524,
+  4525,
+  4526,
+  4527,
+  4528,
+  4529,
+  4530,
+  4531,
+  4532,
+  4533,
+  4534,
+  4535,
+  4536,
+  4537,
+  4538,
+  4539,
+  4540,
+  4541,
+  4542,
+  4543,
+  4544,
+  4545,
+  4546,
+  4547,
+  4548,
+  4549,
+  4550,
+  4551,
+  4552,
+  4553,
+  4554,
+  4555,
+  4556,
+  4557,
+  4558,
+  4559,
+  4560,
+  4561,
+  4562,
+  4563,
+  4564,
+  4565,
+  4566,
+  4567,
+  4568,
+  4569,
+  4570,
+  4571,
+  4572,
+  4573,
+  4574,
+  4575,
+  4576,
+  4577,
+  4578,
+  4579,
+  4580,
+  4581,
+  4582,
+  4583,
+  4584,
+  4585,
+  4586,
+  4587,
+  4588,
+  4589,
+  4590,
+  4591,
+  4592,
+  4593,
+  4594,
+  4595,
+  4596,
+  4597,
+  4598,
+  4599,
+  4600,
+  4601,
+  4602,
+  4603,
+  4604,
+  4605,
+  4606,
+  4607,
+  4608,
+  4609,
+  4610,
+  4611,
+  4612,
+  4613,
+  4614,
+  4615,
+  4616,
+  4617,
+  4618,
+  4619,
+  4620,
+  4621,
+  4622,
+  4623,
+  4624,
+  4625,
+  4626,
+  4627,
+  4628,
+  4629,
+  4630,
+  4631,
+  4632,
+  4633,
+  4634,
+  4635,
+  4636,
+  4637,
+  4638,
+  4639,
+  4640,
+  4641,
+  4642,
+  4643,
+  4644,
+  4645,
+  4646,
+  4647,
+  4648,
+  4649,
+  4650,
+  4651,
+  4652,
+  4653,
+  4654,
+  4655,
+  4656,
+  4657,
+  4658,
+  4659,
+  4660,
+  4661,
+  4662,
+  4663,
+  4664,
+  4665,
+  4666,
+  4667,
+  4668,
+  4669,
+  4670,
+  4671,
+  4672,
+  4673,
+  4674,
+  4675,
+  4676,
+  4677,
+  4678,
+  4679,
+  4680,
+  4681,
+  4682,
+  4683,
+  4684,
+  4685,
+  4686,
+  4687,
+  4688,
+  4689,
+  4690,
+  4691,
+  4692,
+  4693,
+  4694,
+  4695,
+  4696,
+  4697,
+  4698,
+  4699,
+  4700,
+  4701,
+  4702,
+  4703,
+  4704,
+  4705,
+  4706,
+  4707,
+  4708,
+  4709,
+  4710,
+  4711,
+  4712,
+  4713,
+  4714,
+  4715,
+  4716,
+  4717,
+  4718,
+  4719,
+  4720,
+  4721,
+  4722,
+  4723,
+  4724,
+  4725,
+  4726,
+  4727,
+  4728,
+  4729,
+  4730,
+  4731,
+  4732,
+  4733,
+  4734,
+  4735,
+  4736,
+  4737,
+  4738,
+  4739,
+  4740,
+  4741,
+  4742,
+  4743,
+  4744,
+  4745,
+  4746,
+  4747,
+  4748,
+  4749,
+  4750,
+  4751,
+  4752,
+  4753,
+  4754,
+  4755,
+  4756,
+  4757,
+  4758,
+  4759,
+  4760,
+  4761,
+  4762,
+  4763,
+  4764,
+  4765,
+  4766,
+  4767,
+  4768,
+  4769,
+  4770,
+  4771,
+  4772,
+  4773,
+  4774,
+  4775,
+  4776,
+  4777,
+  4778,
+  4779,
+  4780,
+  4781,
+  4782,
+  4783,
+  4784,
+  4785,
+  4786,
+  4787,
+  4788,
+  4789,
+  4790,
+  4791,
+  4792,
+  4793,
+  4794,
+  4795,
+  4796,
+  4797,
+  4798,
+  4799,
+  4800,
+  4801,
+  4802,
+  4803,
+  4804,
+  4805,
+  4806,
+  4807,
+  4808,
+  4809,
+  4810,
+  4811,
+  4812,
+  4813,
+  4814,
+  4815,
+  4816,
+  4817,
+  4818,
+  4819,
+  4820,
+  4821,
+  4822,
+  4823,
+  4824,
+  4825,
+  4826,
+  4827,
+  4828,
+  4829,
+  4830,
+  4831,
+  4832,
+  4833,
+  4834,
+  4835,
+  4836,
+  4837,
+  4838,
+  4839,
+  4840,
+  4841,
+  4842,
+  4843,
+  4844,
+  4845,
+  4846,
+  4847,
+  4848,
+  4849,
+  4850,
+  4851,
+  4852,
+  4853,
+  4854,
+  4855,
+  4856,
+  4857,
+  4858,
+  4859,
+  4860,
+  4861,
+  4862,
+  4863,
+  4864,
+  4865,
+  4866,
+  4867,
+  4868,
+  4869,
+  4870,
+  4871,
+  4872,
+  4873,
+  4874,
+  4875,
+  4876,
+  4877,
+  4878,
+  4879,
+  4880,
+  4881,
+  4882,
+  4883,
+  4884,
+  4885,
+  4886,
+  4887,
+  4888,
+  4889,
+  4890,
+  4891,
+  4892,
+  4893,
+  4894,
+  4895,
+  4896,
+  4897,
+  4898,
+  4899,
+  4900,
+  4901,
+  4902,
+  4903,
+  4904,
+  4905,
+  4906,
+  4907,
+  4908,
+  4909,
+  4910,
+  4911,
+  4912,
+  4913,
+  4914,
+  4915,
+  4916,
+  4917,
+  4918,
+  4919,
+  4920,
+  4921,
+  4922,
+  4923,
+  4924,
+  4925,
+  4926,
+  4927,
+  4928,
+  4929,
+  4930,
+  4931,
+  4932,
+  4933,
+  4934,
+  4935,
+  4936,
+  4937,
+  4938,
+  4939,
+  4940,
+  4941,
+  4942,
+  4943,
+  4944,
+  4945,
+  4946,
+  4947,
+  4948,
+  4949,
+  4950,
+  4951,
+  4952,
+  4953,
+  4954,
+  4955,
+  4956,
+  4957,
+  4958,
+  4959,
+  4960,
+  4961,
+  4962,
+  4963,
+  4964,
+  4965,
+  4966,
+  4967,
+  4968,
+  4969,
+  4970,
+  4971,
+  4972,
+  4973,
+  4974,
+  4975,
+  4976,
+  4977,
+  4978,
+  4979,
+  4980,
+  4981,
+  4982,
+  4983,
+  4984,
+  4985,
+  4986,
+  4987,
+  4988,
+  4989,
+  4990,
+  4991,
+  4992,
+  4993,
+  4994,
+  4995,
+  4996,
+  4997,
+  4998,
+  4999,
+  5000,
+  5001,
+  5002,
+  5003,
+  5004,
+  5005,
+  5006,
+  5007,
+  5008,
+  5009,
+  5010,
+  5011,
+  5012,
+  5013,
+  5014,
+  5015,
+  5016,
+  5017,
+  5018,
+  5019,
+  5020,
+  5021,
+  5022,
+  5023,
+  5024,
+  5025,
+  5026,
+  5027,
+  5028,
+  5029,
+  5030,
+  5031,
+  5032,
+  5033,
+  5034,
+  5035,
+  5036,
+  5037,
+  5038,
+  5039,
+  5040,
+  5041,
+  5042,
+  5043,
+  5044,
+  5045,
+  5046,
+  5047,
+  5048,
+  5049,
+  5050,
+  5051,
+  5052,
+  5053,
+  5054,
+  5055,
+  5056,
+  5057,
+  5058,
+  5059,
+  5060,
+  5061,
+  5062,
+  5063,
+  5064,
+  5065,
+  5066,
+  5067,
+  5068,
+  5069,
+  5070,
+  5071,
+  5072,
+  5073,
+  5074,
+  5075,
+  5076,
+  5077,
+  5078,
+  5079,
+  5080,
+  5081,
+  5082,
+  5083,
+  5084,
+  5085,
+  5086,
+  5087,
+  5088,
+  5089,
+  5090,
+  5091,
+  5092,
+  5093,
+  5094,
+  5095,
+  5096,
+  5097,
+  5098,
+  5099,
+  5100,
+  5101,
+  5102,
+  5103,
+  5104,
+  5105,
+  5106,
+  5107,
+  5108,
+  5109,
+  5110,
+  5111,
+  5112,
+  5113,
+  5114,
+  5115,
+  5116,
+  5117,
+  5118,
+  5119,
+  5120,
+  5121,
+  5122,
+  5123,
+  5124,
+  5125,
+  5126,
+  5127,
+  5128,
+  5129,
+  5130,
+  5131,
+  5132,
+  5133,
+  5134,
+  5135,
+  5136,
+  5137,
+  5138,
+  5139,
+  5140,
+  5141,
+  5142,
+  5143,
+  5144,
+  5145,
+  5146,
+  5147,
+  5148,
+  5149,
+  5150,
+  5151,
+  5152,
+  5153,
+  5154,
+  5155,
+  5156,
+  5157,
+  5158,
+  5159,
+  5160,
+  5161,
+  5162,
+  5163,
+  5164,
+  5165,
+  5166,
+  5167,
+  5168,
+  5169,
+  5170,
+  5171,
+  5172,
+  5173,
+  5174,
+  5175,
+  5176,
+  5177,
+  5178,
+  5179,
+  5180,
+  5181,
+  5182,
+  5183,
+  5184,
+  5185,
+  5186,
+  5187,
+  5188,
+  5189,
+  5190,
+  5191,
+  5192,
+  5193,
+  5194,
+  5195,
+  5196,
+  5197,
+  5198,
+  5199,
+  5200,
+  5201,
+  5202,
+  5203,
+  5204,
+  5205,
+  5206,
+  5207,
+  5208,
+  5209,
+  5210,
+  5211,
+  5212,
+  5213,
+  5214,
+  5215,
+  5216,
+  5217,
+  5218,
+  5219,
+  5220,
+  5221,
+  5222,
+  5223,
+  5224,
+  5225,
+  5226,
+  5227,
+  5228,
+  5229,
+  5230,
+  5231,
+  5232,
+  5233,
+  5234,
+  5235,
+  5236,
+  5237,
+  5238,
+  5239,
+  5240,
+  5241,
+  5242,
+  5243,
+  5244,
+  5245,
+  5246,
+  5247,
+  5248,
+  5249,
+  5250,
+  5251,
+  5252,
+  5253,
+  5254,
+  5255,
+  5256,
+  5257,
+  5258,
+  5259,
+  5260,
+  5261,
+  5262,
+  5263,
+  5264,
+  5265,
+  5266,
+  5267,
+  5268,
+  5269,
+  5270,
+  5271,
+  5272,
+  5273,
+  5274,
+  5275,
+  5276,
+  5277,
+  5278,
+  5279,
+  5280,
+  5281,
+  5282,
+  5283,
+  5284,
+  5285,
+  5286,
+  5287,
+  5288,
+  5289,
+  5290,
+  5291,
+  5292,
+  5293,
+  5294,
+  5295,
+  5296,
+  5297,
+  5298,
+  5299,
+  5300,
+  5301,
+  5302,
+  5303,
+  5304,
+  5305,
+  5306,
+  5307,
+  5308,
+  5309,
+  5310,
+  5311,
+  5312,
+  5313,
+  5314,
+  5315,
+  5316,
+  5317,
+  5318,
+  5319,
+  5320,
+  5321,
+  5322,
+  5323,
+  5324,
+  5325,
+  5326,
+  5327,
+  5328,
+  5329,
+  5330,
+  5331,
+  5332,
+  5333,
+  5334,
+  5335,
+  5336,
+  5337,
+  5338,
+  5339,
+  5340,
+  5341,
+  5342,
+  5343,
+  5344,
+  5345,
+  5346,
+  5347,
+  5348,
+  5349,
+  5350,
+  5351,
+  5352,
+  5353,
+  5354,
+  5355,
+  5356,
+  5357,
+  5358,
+  5359,
+  5360,
+  5361,
+  5362,
+  5363,
+  5364,
+  5365,
+  5366,
+  5367,
+  5368,
+  5369,
+  5370,
+  5371,
+  5372,
+  5373,
+  5374,
+  5375,
+  5376,
+  5377,
+  5378,
+  5379,
+  5380,
+  5381,
+  5382,
+  5383,
+  5384,
+  5385,
+  5386,
+  5387,
+  5388,
+  5389,
+  5390,
+  5391,
+  5392,
+  5393,
+  5394,
+  5395,
+  5396,
+  5397,
+  5398,
+  5399,
+  5400,
+  5401,
+  5402,
+  5403,
+  5404,
+  5405,
+  5406,
+  5407,
+  5408,
+  5409,
+  5410,
+  5411,
+  5412,
+  5413,
+  5414,
+  5415,
+  5416,
+  5417,
+  5418,
+  5419,
+  5420,
+  5421,
+  5422,
+  5423,
+  5424,
+  5425,
+  5426,
+  5427,
+  5428,
+  5429,
+  5430,
+  5431,
+  5432,
+  5433,
+  5434,
+  5435,
+  5436,
+  5437,
+  5438,
+  5439,
+  5440,
+  5441,
+  5442,
+  5443,
+  5444,
+  5445,
+  5446,
+  5447,
+  5448,
+  5449,
+  5450,
+  5451,
+  5452,
+  5453,
+  5454,
+  5455,
+  5456,
+  5457,
+  5458,
+  5459,
+  5460,
+  5461,
+  5462,
+  5463,
+  5464,
+  5465,
+  5466,
+  5467,
+  5468,
+  5469,
+  5470,
+  5471,
+  5472,
+  5473,
+  5474,
+  5475,
+  5476,
+  5477,
+  5478,
+  5479,
+  5480,
+  5481,
+  5482,
+  5483,
+  5484,
+  5485,
+  5486,
+  5487,
+  5488,
+  5489,
+  5490,
+  5491,
+  5492,
+  5493,
+  5494,
+  5495,
+  5496,
+  5497,
+  5498,
+  5499,
+  5500,
+  5501,
+  5502,
+  5503,
+  5504,
+  5505,
+  5506,
+  5507,
+  5508,
+  5509,
+  5510,
+  5511,
+  5512,
+  5513,
+  5514,
+  5515,
+  5516,
+  5517,
+  5518,
+  5519,
+  5520,
+  5521,
+  5522,
+  5523,
+  5524,
+  5525,
+  5526,
+  5527,
+  5528,
+  5529,
+  5530,
+  5531,
+  5532,
+  5533,
+  5534,
+  5535,
+  5536,
+  5537,
+  5538,
+  5539,
+  5540,
+  5541,
+  5542,
+  5543,
+  5544,
+  5545,
+  5546,
+  5547,
+  5548,
+  5549,
+  5550,
+  5551,
+  5552,
+  5553,
+  5554,
+  5555,
+  5556,
+  5557,
+  5558,
+  5559,
+  5560,
+  5561,
+  5562,
+  5563,
+  5564,
+  5565,
+  5566,
+  5567,
+  5568,
+  5569,
+  5570,
+  5571,
+  5572,
+  5573,
+  5574,
+  5575,
+  5576,
+  5577,
+  5578,
+  5579,
+  5580,
+  5581,
+  5582,
+  5583,
+  5584,
+  5585,
+  5586,
+  5587,
+  5588,
+  5589,
+  5590,
+  5591,
+  5592,
+  5593,
+  5594,
+  5595,
+  5596,
+  5597,
+  5598,
+  5599,
+  5600,
+  5601,
+  5602,
+  5603,
+  5604,
+  5605,
+  5606,
+  5607,
+  5608,
+  5609,
+  5610,
+  5611,
+  5612,
+  5613,
+  5614,
+  5615,
+  5616,
+  5617,
+  5618,
+  5619,
+  5620,
+  5621,
+  5622,
+  5623,
+  5624,
+  5625,
+  5626,
+  5627,
+  5628,
+  5629,
+  5630,
+  5631,
+  5632,
+  5633,
+  5634,
+  5635,
+  5636,
+  5637,
+  5638,
+  5639,
+  5640,
+  5641,
+  5642,
+  5643,
+  5644,
+  5645,
+  5646,
+  5647,
+  5648,
+  5649,
+  5650,
+  5651,
+  5652,
+  5653,
+  5654,
+  5655,
+  5656,
+  5657,
+  5658,
+  5659,
+  5660,
+  5661,
+  5662,
+  5663,
+  5664,
+  5665,
+  5666,
+  5667,
+  5668,
+  5669,
+  5670,
+  5671,
+  5672,
+  5673,
+  5674,
+  5675,
+  5676,
+  5677,
+  5678,
+  5679,
+  5680,
+  5681,
+  5682,
+  5683,
+  5684,
+  5685,
+  5686,
+  5687,
+  5688,
+  5689,
+  5690,
+  5691,
+  5692,
+  5693,
+  5694,
+  5695,
+  5696,
+  5697,
+  5698,
+  5699,
+  5700,
+  5701,
+  5702,
+  5703,
+  5704,
+  5705,
+  5706,
+  5707,
+  5708,
+  5709,
+  5710,
+  5711,
+  5712,
+  5713,
+  5714,
+  5715,
+  5716,
+  5717,
+  5718,
+  5719,
+  5720,
+  5721,
+  5722,
+  5723,
+  5724,
+  5725,
+  5726,
+  5727,
+  5728,
+  5729,
+  5730,
+  5731,
+  5732,
+  5733,
+  5734,
+  5735,
+  5736,
+  5737,
+  5738,
+  5739,
+  5740,
+  5741,
+  5742,
+  5743,
+  5744,
+  5745,
+  5746,
+  5747,
+  5748,
+  5749,
+  5750,
+  5751,
+  5752,
+  5753,
+  5754,
+  5755,
+  5756,
+  5757,
+  5758,
+  5759,
+  5760,
+  5761,
+  5762,
+  5763,
+  5764,
+  5765,
+  5766,
+  5767,
+  5768,
+  5769,
+  5770,
+  5771,
+  5772,
+  5773,
+  5774,
+  5775,
+  5776,
+  5777,
+  5778,
+  5779,
+  5780,
+  5781,
+  5782,
+  5783,
+  5784,
+  5785,
+  5786,
+  5787,
+  5788,
+  5789,
+  5790,
+  5791,
+  5792,
+  5793,
+  5794,
+  5795,
+  5796,
+  5797,
+  5798,
+  5799,
+  5800,
+  5801,
+  5802,
+  5803,
+  5804,
+  5805,
+  5806,
+  5807,
+  5808,
+  5809,
+  5810,
+  5811,
+  5812,
+  5813,
+  5814,
+  5815,
+  5816,
+  5817,
+  5818,
+  5819,
+  5820,
+  5821,
+  5822,
+  5823,
+  5824,
+  5825,
+  5826,
+  5827,
+  5828,
+  5829,
+  5830,
+  5831,
+  5832,
+  5833,
+  5834,
+  5835,
+  5836,
+  5837,
+  5838,
+  5839,
+  5840,
+  5841,
+  5842,
+  5843,
+  5844,
+  5845,
+  5846,
+  5847,
+  5848,
+  5849,
+  5850,
+  5851,
+  5852,
+  5853,
+  5854,
+  5855,
+  5856,
+  5857,
+  5858,
+  5859,
+  5860,
+  5861,
+  5862,
+  5863,
+  5864,
+  5865,
+  5866,
+  5867,
+  5868,
+  5869,
+  5870,
+  5871,
+  5872,
+  5873,
+  5874,
+  5875,
+  5876,
+  5877,
+  5878,
+  5879,
+  5880,
+  5881,
+  5882,
+  5883,
+  5884,
+  5885,
+  5886,
+  5887,
+  5888,
+  5889,
+  5890,
+  5891,
+  5892,
+  5893,
+  5894,
+  5895,
+  5896,
+  5897,
+  5898,
+  5899,
+  5900,
+  5901,
+  5902,
+  5903,
+  5904,
+  5905,
+  5906,
+  5907,
+  5908,
+  5909,
+  5910,
+  5911,
+  5912,
+  5913,
+  5914,
+  5915,
+  5916,
+  5917,
+  5918,
+  5919,
+  5920,
+  5921,
+  5922,
+  5923,
+  5924,
+  5925,
+  5926,
+  5927,
+  5928,
+  5929,
+  5930,
+  5931,
+  5932,
+  5933,
+  5934,
+  5935,
+  5936,
+  5937,
+  5938,
+  5939,
+  5940,
+  5941,
+  5942,
+  5943,
+  5944,
+  5945,
+  5946,
+  5947,
+  5948,
+  5949,
+  5950,
+  5951,
+  5952,
+  5953,
+  5954,
+  5955,
+  5956,
+  5957,
+  5958,
+  5959,
+  5960,
+  5961,
+  5962,
+  5963,
+  5964,
+  5965,
+  5966,
+  5967,
+  5968,
+  5969,
+  5970,
+  5971,
+  5972,
+  5973,
+  5974,
+  5975,
+  5976,
+  5977,
+  5978,
+  5979,
+  5980,
+  5981,
+  5982,
+  5983,
+  5984,
+  5985,
+  5986,
+  5987,
+  5988,
+  5989,
+  5990,
+  5991,
+  5992,
+  5993,
+  5994,
+  5995,
+  5996,
+  5997,
+  5998,
+  5999,
+  6000,
+  6001,
+  6002,
+  6003,
+  6004,
+  6005,
+  6006,
+  6007,
+  6008,
+  6009,
+  6010,
+  6011,
+  6012,
+  6013,
+  6014,
+  6015,
+  6016,
+  6017,
+  6018,
+  6019,
+  6020,
+  6021,
+  6022,
+  6023,
+  6024,
+  6025,
+  6026,
+  6027,
+  6028,
+  6029,
+  6030,
+  6031,
+  6032,
+  6033,
+  6034,
+  6035,
+  6036,
+  6037,
+  6038,
+  6039,
+  6040,
+  6041,
+  6042,
+  6043,
+  6044,
+  6045,
+  6046,
+  6047,
+  6048,
+  6049,
+  6050,
+  6051,
+  6052,
+  6053,
+  6054,
+  6055,
+  6056,
+  6057,
+  6058,
+  6059,
+  6060,
+  6061,
+  6062,
+  6063,
+  6064,
+  6065,
+  6066,
+  6067,
+  6068,
+  6069,
+  6070,
+  6071,
+  6072,
+  6073,
+  6074,
+  6075,
+  6076,
+  6077,
+  6078,
+  6079,
+  6080,
+  6081,
+  6082,
+  6083,
+  6084,
+  6085,
+  6086,
+  6087,
+  6088,
+  6089,
+  6090,
+  6091,
+  6092,
+  6093,
+  6094,
+  6095,
+  6096,
+  6097,
+  6098,
+  6099,
+  6100,
+  6101,
+  6102,
+  6103,
+  6104,
+  6105,
+  6106,
+  6107,
+  6108,
+  6109,
+  6110,
+  6111,
+  6112,
+  6113,
+  6114,
+  6115,
+  6116,
+  6117,
+  6118,
+  6119,
+  6120,
+  6121,
+  6122,
+  6123,
+  6124,
+  6125,
+  6126,
+  6127,
+  6128,
+  6129,
+  6130,
+  6131,
+  6132,
+  6133,
+  6134,
+  6135,
+  6136,
+  6137,
+  6138,
+  6139,
+  6140,
+  6141,
+  6142,
+  6143,
+  6144,
+  6145,
+  6146,
+  6147,
+  6148,
+  6149,
+  6150,
+  6151,
+  6152,
+  6153,
+  6154,
+  6155,
+  6156,
+  6157,
+  6158,
+  6159,
+  6160,
+  6161,
+  6162,
+  6163,
+  6164,
+  6165,
+  6166,
+  6167,
+  6168,
+  6169,
+  6170,
+  6171,
+  6172,
+  6173,
+  6174,
+  6175,
+  6176,
+  6177,
+  6178,
+  6179,
+  6180,
+  6181,
+  6182,
+  6183,
+  6184,
+  6185,
+  6186,
+  6187,
+  6188,
+  6189,
+  6190,
+  6191,
+  6192,
+  6193,
+  6194,
+  6195,
+  6196,
+  6197,
+  6198,
+  6199,
+  6200,
+  6201,
+  6202,
+  6203,
+  6204,
+  6205,
+  6206,
+  6207,
+  6208,
+  6209,
+  6210,
+  6211,
+  6212,
+  6213,
+  6214,
+  6215,
+  6216,
+  6217,
+  6218,
+  6219,
+  6220,
+  6221,
+  6222,
+  6223,
+  6224,
+  6225,
+  6226,
+  6227,
+  6228,
+  6229,
+  6230,
+  6231,
+  6232,
+  6233,
+  6234,
+  6235,
+  6236,
+  6237,
+  6238,
+  6239,
+  6240,
+  6241,
+  6242,
+  6243,
+  6244,
+  6245,
+  6246,
+  6247,
+  6248,
+  6249,
+  6250,
+  6251,
+  6252,
+  6253,
+  6254,
+  6255,
+  6256,
+  6257,
+  6258,
+  6259,
+  6260,
+  6261,
+  6262,
+  6263,
+  6264,
+  6265,
+  6266,
+  6267,
+  6268,
+  6269,
+  6270,
+  6271,
+  6272,
+  6273,
+  6274,
+  6275,
+  6276,
+  6277,
+  6278,
+  6279,
+  6280,
+  6281,
+  6282,
+  6283,
+  6284,
+  6285,
+  6286,
+  6287,
+  6288,
+  6289,
+  6290,
+  6291,
+  6292,
+  6293,
+  6294,
+  6295,
+  6296,
+  6297,
+  6298,
+  6299,
+  6300,
+  6301,
+  6302,
+  6303,
+  6304,
+  6305,
+  6306,
+  6307,
+  6308,
+  6309,
+  6310,
+  6311,
+  6312,
+  6313,
+  6314,
+  6315,
+  6316,
+  6317,
+  6318,
+  6319,
+  6320,
+  6321,
+  6322,
+  6323,
+  6324,
+  6325,
+  6326,
+  6327,
+  6328,
+  6329,
+  6330,
+  6331,
+  6332,
+  6333,
+  6334,
+  6335,
+  6336,
+  6337,
+  6338,
+  6339,
+  6340,
+  6341,
+  6342,
+  6343,
+  6344,
+  6345,
+  6346,
+  6347,
+  6348,
+  6349,
+  6350,
+  6351,
+  6352,
+  6353,
+  6354,
+  6355,
+  6356,
+  6357,
+  6358,
+  6359,
+  6360,
+  6361,
+  6362,
+  6363,
+  6364,
+  6365,
+  6366,
+  6367,
+  6368,
+  6369,
+  6370,
+  6371,
+  6372,
+  6373,
+  6374,
+  6375,
+  6376,
+  6377,
+  6378,
+  6379,
+  6380,
+  6381,
+  6382,
+  6383,
+  6384,
+  6385,
+  6386,
+  6387,
+  6388,
+  6389,
+  6390,
+  6391,
+  6392,
+  6393,
+  6394,
+  6395,
+  6396,
+  6397,
+  6398,
+  6399,
+  6400,
+  6401,
+  6402,
+  6403,
+  6404,
+  6405,
+  6406,
+  6407,
+  6408,
+  6409,
+  6410,
+  6411,
+  6412,
+  6413,
+  6414,
+  6415,
+  6416,
+  6417,
+  6418,
+  6419,
+  6420,
+  6421,
+  6422,
+  6423,
+  6424,
+  6425,
+  6426,
+  6427,
+  6428,
+  6429,
+  6430,
+  6431,
+  6432,
+  6433,
+  6434,
+  6435,
+  6436,
+  6437,
+  6438,
+  6439,
+  6440,
+  6441,
+  6442,
+  6443,
+  6444,
+  6445,
+  6446,
+  6447,
+  6448,
+  6449,
+  6450,
+  6451,
+  6452,
+  6453,
+  6454,
+  6455,
+  6456,
+  6457,
+  6458,
+  6459,
+  6460,
+  6461,
+  6462,
+  6463,
+  6464,
+  6465,
+  6466,
+  6467,
+  6468,
+  6469,
+  6470,
+  6471,
+  6472,
+  6473,
+  6474,
+  6475,
+  6476,
+  6477,
+  6478,
+  6479,
+  6480,
+  6481,
+  6482,
+  6483,
+  6484,
+  6485,
+  6486,
+  6487,
+  6488,
+  6489,
+  6490,
+  6491,
+  6492,
+  6493,
+  6494,
+  6495,
+  6496,
+  6497,
+  6498,
+  6499,
+  6500,
+  6501,
+  6502,
+  6503,
+  6504,
+  6505,
+  6506,
+  6507,
+  6508,
+  6509,
+  6510,
+  6511,
+  6512,
+  6513,
+  6514,
+  6515,
+  6516,
+  6517,
+  6518,
+  6519,
+  6520,
+  6521,
+  6522,
+  6523,
+  6524,
+  6525,
+  6526,
+  6527,
+  6528,
+  6529,
+  6530,
+  6531,
+  6532,
+  6533,
+  6534,
+  6535,
+  6536,
+  6537,
+  6538,
+  6539,
+  6540,
+  6541,
+  6542,
+  6543,
+  6544,
+  6545,
+  6546,
+  6547,
+  6548,
+  6549,
+  6550,
+  6551,
+  6552,
+  6553,
+  6554,
+  6555,
+  6556,
+  6557,
+  6558,
+  6559,
+  6560,
+  6561,
+  6562,
+  6563,
+  6564,
+  6565,
+  6566,
+  6567,
+  6568,
+  6569,
+  6570,
+  6571,
+  6572,
+  6573,
+  6574,
+  6575,
+  6576,
+  6577,
+  6578,
+  6579,
+  6580,
+  6581,
+  6582,
+  6583,
+  6584,
+  6585,
+  6586,
+  6587,
+  6588,
+  6589,
+  6590,
+  6591,
+  6592,
+  6593,
+  6594,
+  6595,
+  6596,
+  6597,
+  6598,
+  6599,
+  6600,
+  6601,
+  6602,
+  6603,
+  6604,
+  6605,
+  6606,
+  6607,
+  6608,
+  6609,
+  6610,
+  6611,
+  6612,
+  6613,
+  6614,
+  6615,
+  6616,
+  6617,
+  6618,
+  6619,
+  6620,
+  6621,
+  6622,
+  6623,
+  6624,
+  6625,
+  6626,
+  6627,
+  6628,
+  6629,
+  6630,
+  6631,
+  6632,
+  6633,
+  6634,
+  6635,
+  6636,
+  6637,
+  6638,
+  6639,
+  6640,
+  6641,
+  6642,
+  6643,
+  6644,
+  6645,
+  6646,
+  6647,
+  6648,
+  6649,
+  6650,
+  6651,
+  6652,
+  6653,
+  6654,
+  6655,
+  6656,
+  6657,
+  6658,
+  6659,
+  6660,
+  6661,
+  6662,
+  6663,
+  6664,
+  6665,
+  6666,
+  6667,
+  6668,
+  6669,
+  6670,
+  6671,
+  6672,
+  6673,
+  6674,
+  6675,
+  6676,
+  6677,
+  6678,
+  6679,
+  6680,
+  6681,
+  6682,
+  6683,
+  6684,
+  6685,
+  6686,
+  6687,
+  6688,
+  6689,
+  6690,
+  6691,
+  6692,
+  6693,
+  6694,
+  6695,
+  6696,
+  6697,
+  6698,
+  6699,
+  6700,
+  6701,
+  6702,
+  6703,
+  6704,
+  6705,
+  6706,
+  6707,
+  6708,
+  6709,
+  6710,
+  6711,
+  6712,
+  6713,
+  6714,
+  6715,
+  6716,
+  6717,
+  6718,
+  6719,
+  6720,
+  6721,
+  6722,
+  6723,
+  6724,
+  6725,
+  6726,
+  6727,
+  6728,
+  6729,
+  6730,
+  6731,
+  6732,
+  6733,
+  6734,
+  6735,
+  6736,
+  6737,
+  6738,
+  6739,
+  6740,
+  6741,
+  6742,
+  6743,
+  6744,
+  6745,
+  6746,
+  6747,
+  6748,
+  6749,
+  6750,
+  6751,
+  6752,
+  6753,
+  6754,
+  6755,
+  6756,
+  6757,
+  6758,
+  6759,
+  6760,
+  6761,
+  6762,
+  6763,
+  6764,
+  6765,
+  6766,
+  6767,
+  6768,
+  6769,
+  6770,
+  6771,
+  6772,
+  6773,
+  6774,
+  6775,
+  6776,
+  6777,
+  6778,
+  6779,
+  6780,
+  6781,
+  6782,
+  6783,
+  6784,
+  6785,
+  6786,
+  6787,
+  6788,
+  6789,
+  6790,
+  6791,
+  6792,
+  6793,
+  6794,
+  6795,
+  6796,
+  6797,
+  6798,
+  6799,
+  6800,
+  6801,
+  6802,
+  6803,
+  6804,
+  6805,
+  6806,
+  6807,
+  6808,
+  6809,
+  6810,
+  6811,
+  6812,
+  6813,
+  6814,
+  6815,
+  6816,
+  6817,
+  6818,
+  6819,
+  6820,
+  6821,
+  6822,
+  6823,
+  6824,
+  6825,
+  6826,
+  6827,
+  6828,
+  6829,
+  6830,
+  6831,
+  6832,
+  6833,
+  6834,
+  6835,
+  6836,
+  6837,
+  6838,
+  6839,
+  6840,
+  6841,
+  6842,
+  6843,
+  6844,
+  6845,
+  6846,
+  6847,
+  6848,
+  6849,
+  6850,
+  6851,
+  6852,
+  6853,
+  6854,
+  6855,
+  6856,
+  6857,
+  6858,
+  6859,
+  6860,
+  6861,
+  6862,
+  6863,
+  6864,
+  6865,
+  6866,
+  6867,
+  6868,
+  6869,
+  6870,
+  6871,
+  6872,
+  6873,
+  6874,
+  6875,
+  6876,
+  6877,
+  6878,
+  6879,
+  6880,
+  6881,
+  6882,
+  6883,
+  6884,
+  6885,
+  6886,
+  6887,
+  6888,
+  6889,
+  6890,
+  6891,
+  6892,
+  6893,
+  6894,
+  6895,
+  6896,
+  6897,
+  6898,
+  6899,
+  6900,
+  6901,
+  6902,
+  6903,
+  6904,
+  6905,
+  6906,
+  6907,
+  6908,
+  6909,
+  6910,
+  6911,
+  6912,
+  6913,
+  6914,
+  6915,
+  6916,
+  6917,
+  6918,
+  6919,
+  6920,
+  6921,
+  6922,
+  6923,
+  6924,
+  6925,
+  6926,
+  6927,
+  6928,
+  6929,
+  6930,
+  6931,
+  6932,
+  6933,
+  6934,
+  6935,
+  6936,
+  6937,
+  6938,
+  6939,
+  6940,
+  6941,
+  6942,
+  6943,
+  6944,
+  6945,
+  6946,
+  6947,
+  6948,
+  6949,
+  6950,
+  6951,
+  6952,
+  6953,
+  6954,
+  6955,
+  6956,
+  6957,
+  6958,
+  6959,
+  6960,
+  6961,
+  6962,
+  6963,
+  6964,
+  6965,
+  6966,
+  6967,
+  6968,
+  6969,
+  6970,
+  6971,
+  6972,
+  6973,
+  6974,
+  6975,
+  6976,
+  6977,
+  6978,
+  6979,
+  6980,
+  6981,
+  6982,
+  6983,
+  6984,
+  6985,
+  6986,
+  6987,
+  6988,
+  6989,
+  6990,
+  6991,
+  6992,
+  6993,
+  6994,
+  6995,
+  6996,
+  6997,
+  6998,
+  6999,
+  7000,
+  7001,
+  7002,
+  7003,
+  7004,
+  7005,
+  7006,
+  7007,
+  7008,
+  7009,
+  7010,
+  7011,
+  7012,
+  7013,
+  7014,
+  7015,
+  7016,
+  7017,
+  7018,
+  7019,
+  7020,
+  7021,
+  7022,
+  7023,
+  7024,
+  7025,
+  7026,
+  7027,
+  7028,
+  7029,
+  7030,
+  7031,
+  7032,
+  7033,
+  7034,
+  7035,
+  7036,
+  7037,
+  7038,
+  7039,
+  7040,
+  7041,
+  7042,
+  7043,
+  7044,
+  7045,
+  7046,
+  7047,
+  7048,
+  7049,
+  7050,
+  7051,
+  7052,
+  7053,
+  7054,
+  7055,
+  7056,
+  7057,
+  7058,
+  7059,
+  7060,
+  7061,
+  7062,
+  7063,
+  7064,
+  7065,
+  7066,
+  7067,
+  7068,
+  7069,
+  7070,
+  7071,
+  7072,
+  7073,
+  7074,
+  7075,
+  7076,
+  7077,
+  7078,
+  7079,
+  7080,
+  7081,
+  7082,
+  7083,
+  7084,
+  7085,
+  7086,
+  7087,
+  7088,
+  7089,
+  7090,
+  7091,
+  7092,
+  7093,
+  7094,
+  7095,
+  7096,
+  7097,
+  7098,
+  7099,
+  7100,
+  7101,
+  7102,
+  7103,
+  7104,
+  7105,
+  7106,
+  7107,
+  7108,
+  7109,
+  7110,
+  7111,
+  7112,
+  7113,
+  7114,
+  7115,
+  7116,
+  7117,
+  7118,
+  7119,
+  7120,
+  7121,
+  7122,
+  7123,
+  7124,
+  7125,
+  7126,
+  7127,
+  7128,
+  7129,
+  7130,
+  7131,
+  7132,
+  7133,
+  7134,
+  7135,
+  7136,
+  7137,
+  7138,
+  7139,
+  7140,
+  7141,
+  7142,
+  7143,
+  7144,
+  7145,
+  7146,
+  7147,
+  7148,
+  7149,
+  7150,
+  7151,
+  7152,
+  7153,
+  7154,
+  7155,
+  7156,
+  7157,
+  7158,
+  7159,
+  7160,
+  7161,
+  7162,
+  7163,
+  7164,
+  7165,
+  7166,
+  7167,
+  7168,
+  7169,
+  7170,
+  7171,
+  7172,
+  7173,
+  7174,
+  7175,
+  7176,
+  7177,
+  7178,
+  7179,
+  7180,
+  7181,
+  7182,
+  7183,
+  7184,
+  7185,
+  7186,
+  7187,
+  7188,
+  7189,
+  7190,
+  7191,
+  7192,
+  7193,
+  7194,
+  7195,
+  7196,
+  7197,
+  7198,
+  7199,
+  7200,
+  7201,
+  7202,
+  7203,
+  7204,
+  7205,
+  7206,
+  7207,
+  7208,
+  7209,
+  7210,
+  7211,
+  7212,
+  7213,
+  7214,
+  7215,
+  7216,
+  7217,
+  7218,
+  7219,
+  7220,
+  7221,
+  7222,
+  7223,
+  7224,
+  7225,
+  7226,
+  7227,
+  7228,
+  7229,
+  7230,
+  7231,
+  7232,
+  7233,
+  7234,
+  7235,
+  7236,
+  7237,
+  7238,
+  7239,
+  7240,
+  7241,
+  7242,
+  7243,
+  7244,
+  7245,
+  7246,
+  7247,
+  7248,
+  7249,
+  7250,
+  7251,
+  7252,
+  7253,
+  7254,
+  7255,
+  7256,
+  7257,
+  7258,
+  7259,
+  7260,
+  7261,
+  7262,
+  7263,
+  7264,
+  7265,
+  7266,
+  7267,
+  7268,
+  7269,
+  7270,
+  7271,
+  7272,
+  7273,
+  7274,
+  7275,
+  7276,
+  7277,
+  7278,
+  7279,
+  7280,
+  7281,
+  7282,
+  7283,
+  7284,
+  7285,
+  7286,
+  7287,
+  7288,
+  7289,
+  7290,
+  7291,
+  7292,
+  7293,
+  7294,
+  7295,
+  7296,
+  7297,
+  7298,
+  7299,
+  7300,
+  7301,
+  7302,
+  7303,
+  7304,
+  7305,
+  7306,
+  7307,
+  7308,
+  7309,
+  7310,
+  7311,
+  7312,
+  7313,
+  7314,
+  7315,
+  7316,
+  7317,
+  7318,
+  7319,
+  7320,
+  7321,
+  7322,
+  7323,
+  7324,
+  7325,
+  7326,
+  7327,
+  7328,
+  7329,
+  7330,
+  7331,
+  7332,
+  7333,
+  7334,
+  7335,
+  7336,
+  7337,
+  7338,
+  7339,
+  7340,
+  7341,
+  7342,
+  7343,
+  7344,
+  7345,
+  7346,
+  7347,
+  7348,
+  7349,
+  7350,
+  7351,
+  7352,
+  7353,
+  7354,
+  7355,
+  7356,
+  7357,
+  7358,
+  7359,
+  7360,
+  7361,
+  7362,
+  7363,
+  7364,
+  7365,
+  7366,
+  7367,
+  7368,
+  7369,
+  7370,
+  7371,
+  7372,
+  7373,
+  7374,
+  7375,
+  7376,
+  7377,
+  7378,
+  7379,
+  7380,
+  7381,
+  7382,
+  7383,
+  7384,
+  7385,
+  7386,
+  7387,
+  7388,
+  7389,
+  7390,
+  7391,
+  7392,
+  7393,
+  7394,
+  7395,
+  7396,
+  7397,
+  7398,
+  7399,
+  7400,
+  7401,
+  7402,
+  7403,
+  7404,
+  7405,
+  7406,
+  7407,
+  7408,
+  7409,
+  7410,
+  7411,
+  7412,
+  7413,
+  7414,
+  7415,
+  7416,
+  7417,
+  7418,
+  7419,
+  7420,
+  7421,
+  7422,
+  7423,
+  7424,
+  7425,
+  7426,
+  7427,
+  7428,
+  7429,
+  7430,
+  7431,
+  7432,
+  7433,
+  7434,
+  7435,
+  7436,
+  7437,
+  7438,
+  7439,
+  7440,
+  7441,
+  7442,
+  7443,
+  7444,
+  7445,
+  7446,
+  7447,
+  7448,
+  7449,
+  7450,
+  7451,
+  7452,
+  7453,
+  7454,
+  7455,
+  7456,
+  7457,
+  7458,
+  7459,
+  7460,
+  7461,
+  7462,
+  7463,
+  7464,
+  7465,
+  7466,
+  7467,
+  7468,
+  7469,
+  7470,
+  7471,
+  7472,
+  7473,
+  7474,
+  7475,
+  7476,
+  7477,
+  7478,
+  7479,
+  7480,
+  7481,
+  7482,
+  7483,
+  7484,
+  7485,
+  7486,
+  7487,
+  7488,
+  7489,
+  7490,
+  7491,
+  7492,
+  7493,
+  7494,
+  7495,
+  7496,
+  7497,
+  7498,
+  7499,
+  7500,
+  7501,
+  7502,
+  7503,
+  7504,
+  7505,
+  7506,
+  7507,
+  7508,
+  7509,
+  7510,
+  7511,
+  7512,
+  7513,
+  7514,
+  7515,
+  7516,
+  7517,
+  7518,
+  7519,
+  7520,
+  7521,
+  7522,
+  7523,
+  7524,
+  7525,
+  7526,
+  7527,
+  7528,
+  7529,
+  7530,
+  7531,
+  7532,
+  7533,
+  7534,
+  7535,
+  7536,
+  7537,
+  7538,
+  7539,
+  7540,
+  7541,
+  7542,
+  7543,
+  7544,
+  7545,
+  7546,
+  7547,
+  7548,
+  7549,
+  7550,
+  7551,
+  7552,
+  7553,
+  7554,
+  7555,
+  7556,
+  7557,
+  7558,
+  7559,
+  7560,
+  7561,
+  7562,
+  7563,
+  7564,
+  7565,
+  7566,
+  7567,
+  7568,
+  7569,
+  7570,
+  7571,
+  7572,
+  7573,
+  7574,
+  7575,
+  7576,
+  7577,
+  7578,
+  7579,
+  7580,
+  7581,
+  7582,
+  7583,
+  7584,
+  7585,
+  7586,
+  7587,
+  7588,
+  7589,
+  7590,
+  7591,
+  7592,
+  7593,
+  7594,
+  7595,
+  7596,
+  7597,
+  7598,
+  7599,
+  7600,
+  7601,
+  7602,
+  7603,
+  7604,
+  7605,
+  7606,
+  7607,
+  7608,
+  7609,
+  7610,
+  7611,
+  7612,
+  7613,
+  7614,
+  7615,
+  7616,
+  7617,
+  7618,
+  7619,
+  7620,
+  7621,
+  7622,
+  7623,
+  7624,
+  7625,
+  7626,
+  7627,
+  7628,
+  7629,
+  7630,
+  7631,
+  7632,
+  7633,
+  7634,
+  7635,
+  7636,
+  7637,
+  7638,
+  7639,
+  7640,
+  7641,
+  7642,
+  7643,
+  7644,
+  7645,
+  7646,
+  7647,
+  7648,
+  7649,
+  7650,
+  7651,
+  7652,
+  7653,
+  7654,
+  7655,
+  7656,
+  7657,
+  7658,
+  7659,
+  7660,
+  7661,
+  7662,
+  7663,
+  7664,
+  7665,
+  7666,
+  7667,
+  7668,
+  7669,
+  7670,
+  7671,
+  7672,
+  7673,
+  7674,
+  7675,
+  7676,
+  7677,
+  7678,
+  7679,
+  7680,
+  7681,
+  7682,
+  7683,
+  7684,
+  7685,
+  7686,
+  7687,
+  7688,
+  7689,
+  7690,
+  7691,
+  7692,
+  7693,
+  7694,
+  7695,
+  7696,
+  7697,
+  7698,
+  7699,
+  7700,
+  7701,
+  7702,
+  7703,
+  7704,
+  7705,
+  7706,
+  7707,
+  7708,
+  7709,
+  7710,
+  7711,
+  7712,
+  7713,
+  7714,
+  7715,
+  7716,
+  7717,
+  7718,
+  7719,
+  7720,
+  7721,
+  7722,
+  7723,
+  7724,
+  7725,
+  7726,
+  7727,
+  7728,
+  7729,
+  7730,
+  7731,
+  7732,
+  7733,
+  7734,
+  7735,
+  7736,
+  7737,
+  7738,
+  7739,
+  7740,
+  7741,
+  7742,
+  7743,
+  7744,
+  7745,
+  7746,
+  7747,
+  7748,
+  7749,
+  7750,
+  7751,
+  7752,
+  7753,
+  7754,
+  7755,
+  7756,
+  7757,
+  7758,
+  7759,
+  7760,
+  7761,
+  7762,
+  7763,
+  7764,
+  7765,
+  7766,
+  7767,
+  7768,
+  7769,
+  7770,
+  7771,
+  7772,
+  7773,
+  7774,
+  7775,
+  7776,
+  7777,
+  7778,
+  7779,
+  7780,
+  7781,
+  7782,
+  7783,
+  7784,
+  7785,
+  7786,
+  7787,
+  7788,
+  7789,
+  7790,
+  7791,
+  7792,
+  7793,
+  7794,
+  7795,
+  7796,
+  7797,
+  7798,
+  7799,
+  7800,
+  7801,
+  7802,
+  7803,
+  7804,
+  7805,
+  7806,
+  7807,
+  7808,
+  7809,
+  7810,
+  7811,
+  7812,
+  7813,
+  7814,
+  7815,
+  7816,
+  7817,
+  7818,
+  7819,
+  7820,
+  7821,
+  7822,
+  7823,
+  7824,
+  7825,
+  7826,
+  7827,
+  7828,
+  7829,
+  7830,
+  7831,
+  7832,
+  7833,
+  7834,
+  7835,
+  7836,
+  7837,
+  7838,
+  7839,
+  7840,
+  7841,
+  7842,
+  7843,
+  7844,
+  7845,
+  7846,
+  7847,
+  7848,
+  7849,
+  7850,
+  7851,
+  7852,
+  7853,
+  7854,
+  7855,
+  7856,
+  7857,
+  7858,
+  7859,
+  7860,
+  7861,
+  7862,
+  7863,
+  7864,
+  7865,
+  7866,
+  7867,
+  7868,
+  7869,
+  7870,
+  7871,
+  7872,
+  7873,
+  7874,
+  7875,
+  7876,
+  7877,
+  7878,
+  7879,
+  7880,
+  7881,
+  7882,
+  7883,
+  7884,
+  7885,
+  7886,
+  7887,
+  7888,
+  7889,
+  7890,
+  7891,
+  7892,
+  7893,
+  7894,
+  7895,
+  7896,
+  7897,
+  7898,
+  7899,
+  7900,
+  7901,
+  7902,
+  7903,
+  7904,
+  7905,
+  7906,
+  7907,
+  7908,
+  7909,
+  7910,
+  7911,
+  7912,
+  7913,
+  7914,
+  7915,
+  7916,
+  7917,
+  7918,
+  7919,
+  7920,
+  7921,
+  7922,
+  7923,
+  7924,
+  7925,
+  7926,
+  7927,
+  7928,
+  7929,
+  7930,
+  7931,
+  7932,
+  7933,
+  7934,
+  7935,
+  7936,
+  7937,
+  7938,
+  7939,
+  7940,
+  7941,
+  7942,
+  7943,
+  7944,
+  7945,
+  7946,
+  7947,
+  7948,
+  7949,
+  7950,
+  7951,
+  7952,
+  7953,
+  7954,
+  7955,
+  7956,
+  7957,
+  7958,
+  7959,
+  7960,
+  7961,
+  7962,
+  7963,
+  7964,
+  7965,
+  7966,
+  7967,
+  7968,
+  7969,
+  7970,
+  7971,
+  7972,
+  7973,
+  7974,
+  7975,
+  7976,
+  7977,
+  7978,
+  7979,
+  7980,
+  7981,
+  7982,
+  7983,
+  7984,
+  7985,
+  7986,
+  7987,
+  7988,
+  7989,
+  7990,
+  7991,
+  7992,
+  7993,
+  7994,
+  7995,
+  7996,
+  7997,
+  7998,
+  7999,
+  8000,
+  8001,
+  8002,
+  8003,
+  8004,
+  8005,
+  8006,
+  8007,
+  8008,
+  8009,
+  8010,
+  8011,
+  8012,
+  8013,
+  8014,
+  8015,
+  8016,
+  8017,
+  8018,
+  8019,
+  8020,
+  8021,
+  8022,
+  8023,
+  8024,
+  8025,
+  8026,
+  8027,
+  8028,
+  8029,
+  8030,
+  8031,
+  8032,
+  8033,
+  8034,
+  8035,
+  8036,
+  8037,
+  8038,
+  8039,
+  8040,
+  8041,
+  8042,
+  8043,
+  8044,
+  8045,
+  8046,
+  8047,
+  8048,
+  8049,
+  8050,
+  8051,
+  8052,
+  8053,
+  8054,
+  8055,
+  8056,
+  8057,
+  8058,
+  8059,
+  8060,
+  8061,
+  8062,
+  8063,
+  8064,
+  8065,
+  8066,
+  8067,
+  8068,
+  8069,
+  8070,
+  8071,
+  8072,
+  8073,
+  8074,
+  8075,
+  8076,
+  8077,
+  8078,
+  8079,
+  8080,
+  8081,
+  8082,
+  8083,
+  8084,
+  8085,
+  8086,
+  8087,
+  8088,
+  8089,
+  8090,
+  8091,
+  8092,
+  8093,
+  8094,
+  8095,
+  8096,
+  8097,
+  8098,
+  8099,
+  8100,
+  8101,
+  8102,
+  8103,
+  8104,
+  8105,
+  8106,
+  8107,
+  8108,
+  8109,
+  8110,
+  8111,
+  8112,
+  8113,
+  8114,
+  8115,
+  8116,
+  8117,
+  8118,
+  8119,
+  8120,
+  8121,
+  8122,
+  8123,
+  8124,
+  8125,
+  8126,
+  8127,
+  8128,
+  8129,
+  8130,
+  8131,
+  8132,
+  8133,
+  8134,
+  8135,
+  8136,
+  8137,
+  8138,
+  8139,
+  8140,
+  8141,
+  8142,
+  8143,
+  8144,
+  8145,
+  8146,
+  8147,
+  8148,
+  8149,
+  8150,
+  8151,
+  8152,
+  8153,
+  8154,
+  8155,
+  8156,
+  8157,
+  8158,
+  8159,
+  8160,
+  8161,
+  8162,
+  8163,
+  8164,
+  8165,
+  8166,
+  8167,
+  8168,
+  8169,
+  8170,
+  8171,
+  8172,
+  8173,
+  8174,
+  8175,
+  8176,
+  8177,
+  8178,
+  8179,
+  8180,
+  8181,
+  8182,
+  8183,
+  8184,
+  8185,
+  8186,
+  8187,
+  8188,
+  8189,
+  8190,
+  8191,
+  8192,
+  8193,
+  8194,
+  8195,
+  8196,
+  8197,
+  8198,
+  8199,
+  8200,
+  8201,
+  8202,
+  8203,
+  8204,
+  8205,
+  8206,
+  8207,
+  8208,
+  8209,
+  8210,
+  8211,
+  8212,
+  8213,
+  8214,
+  8215,
+  8216,
+  8217,
+  8218,
+  8219,
+  8220,
+  8221,
+  8222,
+  8223,
+  8224,
+  8225,
+  8226,
+  8227,
+  8228,
+  8229,
+  8230,
+  8231,
+  8232,
+  8233,
+  8234,
+  8235,
+  8236,
+  8237,
+  8238,
+  8239,
+  8240,
+  8241,
+  8242,
+  8243,
+  8244,
+  8245,
+  8246,
+  8247,
+  8248,
+  8249,
+  8250,
+  8251,
+  8252,
+  8253,
+  8254,
+  8255,
+  8256,
+  8257,
+  8258,
+  8259,
+  8260,
+  8261,
+  8262,
+  8263,
+  8264,
+  8265,
+  8266,
+  8267,
+  8268,
+  8269,
+  8270,
+  8271,
+  8272,
+  8273,
+  8274,
+  8275,
+  8276,
+  8277,
+  8278,
+  8279,
+  8280,
+  8281,
+  8282,
+  8283,
+  8284,
+  8285,
+  8286,
+  8287,
+  8288,
+  8289,
+  8290,
+  8291,
+  8292,
+  8293,
+  8294,
+  8295,
+  8296,
+  8297,
+  8298,
+  8299,
+  8300,
+  8301,
+  8302,
+  8303,
+  8304,
+  8305,
+  8306,
+  8307,
+  8308,
+  8309,
+  8310,
+  8311,
+  8312,
+  8313,
+  8314,
+  8315,
+  8316,
+  8317,
+  8318,
+  8319,
+  8320,
+  8321,
+  8322,
+  8323,
+  8324,
+  8325,
+  8326,
+  8327,
+  8328,
+  8329,
+  8330,
+  8331,
+  8332,
+  8333,
+  8334,
+  8335,
+  8336,
+  8337,
+  8338,
+  8339,
+  8340,
+  8341,
+  8342,
+  8343,
+  8344,
+  8345,
+  8346,
+  8347,
+  8348,
+  8349,
+  8350,
+  8351,
+  8352,
+  8353,
+  8354,
+  8355,
+  8356,
+  8357,
+  8358,
+  8359,
+  8360,
+  8361,
+  8362,
+  8363,
+  8364,
+  8365,
+  8366,
+  8367,
+  8368,
+  8369,
+  8370,
+  8371,
+  8372,
+  8373,
+  8374,
+  8375,
+  8376,
+  8377,
+  8378,
+  8379,
+  8380,
+  8381,
+  8382,
+  8383,
+  8384,
+  8385,
+  8386,
+  8387,
+  8388,
+  8389,
+  8390,
+  8391,
+  8392,
+  8393,
+  8394,
+  8395,
+  8396,
+  8397,
+  8398,
+  8399,
+  8400,
+  8401,
+  8402,
+  8403,
+  8404,
+  8405,
+  8406,
+  8407,
+  8408,
+  8409,
+  8410,
+  8411,
+  8412,
+  8413,
+  8414,
+  8415,
+  8416,
+  8417,
+  8418,
+  8419,
+  8420,
+  8421,
+  8422,
+  8423,
+  8424,
+  8425,
+  8426,
+  8427,
+  8428,
+  8429,
+  8430,
+  8431,
+  8432,
+  8433,
+  8434,
+  8435,
+  8436,
+  8437,
+  8438,
+  8439,
+  8440,
+  8441,
+  8442,
+  8443,
+  8444,
+  8445,
+  8446,
+  8447,
+  8448,
+  8449,
+  8450,
+  8451,
+  8452,
+  8453,
+  8454,
+  8455,
+  8456,
+  8457,
+  8458,
+  8459,
+  8460,
+  8461,
+  8462,
+  8463,
+  8464,
+  8465,
+  8466,
+  8467,
+  8468,
+  8469,
+  8470,
+  8471,
+  8472,
+  8473,
+  8474,
+  8475,
+  8476,
+  8477,
+  8478,
+  8479,
+  8480,
+  8481,
+  8482,
+  8483,
+  8484,
+  8485,
+  8486,
+  8487,
+  8488,
+  8489,
+  8490,
+  8491,
+  8492,
+  8493,
+  8494,
+  8495,
+  8496,
+  8497,
+  8498,
+  8499,
+  8500,
+  8501,
+  8502,
+  8503,
+  8504,
+  8505,
+  8506,
+  8507,
+  8508,
+  8509,
+  8510,
+  8511,
+  8512,
+  8513,
+  8514,
+  8515,
+  8516,
+  8517,
+  8518,
+  8519,
+  8520,
+  8521,
+  8522,
+  8523,
+  8524,
+  8525,
+  8526,
+  8527,
+  8528,
+  8529,
+  8530,
+  8531,
+  8532,
+  8533,
+  8534,
+  8535,
+  8536,
+  8537,
+  8538,
+  8539,
+  8540,
+  8541,
+  8542,
+  8543,
+  8544,
+  8545,
+  8546,
+  8547,
+  8548,
+  8549,
+  8550,
+  8551,
+  8552,
+  8553,
+  8554,
+  8555,
+  8556,
+  8557,
+  8558,
+  8559,
+  8560,
+  8561,
+  8562,
+  8563,
+  8564,
+  8565,
+  8566,
+  8567,
+  8568,
+  8569,
+  8570,
+  8571,
+  8572,
+  8573,
+  8574,
+  8575,
+  8576,
+  8577,
+  8578,
+  8579,
+  8580,
+  8581,
+  8582,
+  8583,
+  8584,
+  8585,
+  8586,
+  8587,
+  8588,
+  8589,
+  8590,
+  8591,
+  8592,
+  8593,
+  8594,
+  8595,
+  8596,
+  8597,
+  8598,
+  8599,
+  8600,
+  8601,
+  8602,
+  8603,
+  8604,
+  8605,
+  8606,
+  8607,
+  8608,
+  8609,
+  8610,
+  8611,
+  8612,
+  8613,
+  8614,
+  8615,
+  8616,
+  8617,
+  8618,
+  8619,
+  8620,
+  8621,
+  8622,
+  8623,
+  8624,
+  8625,
+  8626,
+  8627,
+  8628,
+  8629,
+  8630,
+  8631,
+  8632,
+  8633,
+  8634,
+  8635,
+  8636,
+  8637,
+  8638,
+  8639,
+  8640,
+  8641,
+  8642,
+  8643,
+  8644,
+  8645,
+  8646,
+  8647,
+  8648,
+  8649,
+  8650,
+  8651,
+  8652,
+  8653,
+  8654,
+  8655,
+  8656,
+  8657,
+  8658,
+  8659,
+  8660,
+  8661,
+  8662,
+  8663,
+  8664,
+  8665,
+  8666,
+  8667,
+  8668,
+  8669,
+  8670,
+  8671,
+  8672,
+  8673,
+  8674,
+  8675,
+  8676,
+  8677,
+  8678,
+  8679,
+  8680,
+  8681,
+  8682,
+  8683,
+  8684,
+  8685,
+  8686,
+  8687,
+  8688,
+  8689,
+  8690,
+  8691,
+  8692,
+  8693,
+  8694,
+  8695,
+  8696,
+  8697,
+  8698,
+  8699,
+  8700,
+  8701,
+  8702,
+  8703,
+  8704,
+  8705,
+  8706,
+  8707,
+  8708,
+  8709,
+  8710,
+  8711,
+  8712,
+  8713,
+  8714,
+  8715,
+  8716,
+  8717,
+  8718,
+  8719,
+  8720,
+  8721,
+  8722,
+  8723,
+  8724,
+  8725,
+  8726,
+  8727,
+  8728,
+  8729,
+  8730,
+  8731,
+  8732,
+  8733,
+  8734,
+  8735,
+  8736,
+  8737,
+  8738,
+  8739,
+  8740,
+  8741,
+  8742,
+  8743,
+  8744,
+  8745,
+  8746,
+  8747,
+  8748,
+  8749,
+  8750,
+  8751,
+  8752,
+  8753,
+  8754,
+  8755,
+  8756,
+  8757,
+  8758,
+  8759,
+  8760,
+  8761,
+  8762,
+  8763,
+  8764,
+  8765,
+  8766,
+  8767,
+  8768,
+  8769,
+  8770,
+  8771,
+  8772,
+  8773,
+  8774,
+  8775,
+  8776,
+  8777,
+  8778,
+  8779,
+  8780,
+  8781,
+  8782,
+  8783,
+  8784,
+  8785,
+  8786,
+  8787,
+  8788,
+  8789,
+  8790,
+  8791,
+  8792,
+  8793,
+  8794,
+  8795,
+  8796,
+  8797,
+  8798,
+  8799,
+  8800,
+  8801,
+  8802,
+  8803,
+  8804,
+  8805,
+  8806,
+  8807,
+  8808,
+  8809,
+  8810,
+  8811,
+  8812,
+  8813,
+  8814,
+  8815,
+  8816,
+  8817,
+  8818,
+  8819,
+  8820,
+  8821,
+  8822,
+  8823,
+  8824,
+  8825,
+  8826,
+  8827,
+  8828,
+  8829,
+  8830,
+  8831,
+  8832,
+  8833,
+  8834,
+  8835,
+  8836,
+  8837,
+  8838,
+  8839,
+  8840,
+  8841,
+  8842,
+  8843,
+  8844,
+  8845,
+  8846,
+  8847,
+  8848,
+  8849,
+  8850,
+  8851,
+  8852,
+  8853,
+  8854,
+  8855,
+  8856,
+  8857,
+  8858,
+  8859,
+  8860,
+  8861,
+  8862,
+  8863,
+  8864,
+  8865,
+  8866,
+  8867,
+  8868,
+  8869,
+  8870,
+  8871,
+  8872,
+  8873,
+  8874,
+  8875,
+  8876,
+  8877,
+  8878,
+  8879,
+  8880,
+  8881,
+  8882,
+  8883,
+  8884,
+  8885,
+  8886,
+  8887,
+  8888,
+  8889,
+  8890,
+  8891,
+  8892,
+  8893,
+  8894,
+  8895,
+  8896,
+  8897,
+  8898,
+  8899,
+  8900,
+  8901,
+  8902,
+  8903,
+  8904,
+  8905,
+  8906,
+  8907,
+  8908,
+  8909,
+  8910,
+  8911,
+  8912,
+  8913,
+  8914,
+  8915,
+  8916,
+  8917,
+  8918,
+  8919,
+  8920,
+  8921,
+  8922,
+  8923,
+  8924,
+  8925,
+  8926,
+  8927,
+  8928,
+  8929,
+  8930,
+  8931,
+  8932,
+  8933,
+  8934,
+  8935,
+  8936,
+  8937,
+  8938,
+  8939,
+  8940,
+  8941,
+  8942,
+  8943,
+  8944,
+  8945,
+  8946,
+  8947,
+  8948,
+  8949,
+  8950,
+  8951,
+  8952,
+  8953,
+  8954,
+  8955,
+  8956,
+  8957,
+  8958,
+  8959,
+  8960,
+  8961,
+  8962,
+  8963,
+  8964,
+  8965,
+  8966,
+  8967,
+  8968,
+  8969,
+  8970,
+  8971,
+  8972,
+  8973,
+  8974,
+  8975,
+  8976,
+  8977,
+  8978,
+  8979,
+  8980,
+  8981,
+  8982,
+  8983,
+  8984,
+  8985,
+  8986,
+  8987,
+  8988,
+  8989,
+  8990,
+  8991,
+  8992,
+  8993,
+  8994,
+  8995,
+  8996,
+  8997,
+  8998,
+  8999,
+  9000,
+  9001,
+  9002,
+  9003,
+  9004,
+  9005,
+  9006,
+  9007,
+  9008,
+  9009,
+  9010,
+  9011,
+  9012,
+  9013,
+  9014,
+  9015,
+  9016,
+  9017,
+  9018,
+  9019,
+  9020,
+  9021,
+  9022,
+  9023,
+  9024,
+  9025,
+  9026,
+  9027,
+  9028,
+  9029,
+  9030,
+  9031,
+  9032,
+  9033,
+  9034,
+  9035,
+  9036,
+  9037,
+  9038,
+  9039,
+  9040,
+  9041,
+  9042,
+  9043,
+  9044,
+  9045,
+  9046,
+  9047,
+  9048,
+  9049,
+  9050,
+  9051,
+  9052,
+  9053,
+  9054,
+  9055,
+  9056,
+  9057,
+  9058,
+  9059,
+  9060,
+  9061,
+  9062,
+  9063,
+  9064,
+  9065,
+  9066,
+  9067,
+  9068,
+  9069,
+  9070,
+  9071,
+  9072,
+  9073,
+  9074,
+  9075,
+  9076,
+  9077,
+  9078,
+  9079,
+  9080,
+  9081,
+  9082,
+  9083,
+  9084,
+  9085,
+  9086,
+  9087,
+  9088,
+  9089,
+  9090,
+  9091,
+  9092,
+  9093,
+  9094,
+  9095,
+  9096,
+  9097,
+  9098,
+  9099,
+  9100,
+  9101,
+  9102,
+  9103,
+  9104,
+  9105,
+  9106,
+  9107,
+  9108,
+  9109,
+  9110,
+  9111,
+  9112,
+  9113,
+  9114,
+  9115,
+  9116,
+  9117,
+  9118,
+  9119,
+  9120,
+  9121,
+  9122,
+  9123,
+  9124,
+  9125,
+  9126,
+  9127,
+  9128,
+  9129,
+  9130,
+  9131,
+  9132,
+  9133,
+  9134,
+  9135,
+  9136,
+  9137,
+  9138,
+  9139,
+  9140,
+  9141,
+  9142,
+  9143,
+  9144,
+  9145,
+  9146,
+  9147,
+  9148,
+  9149,
+  9150,
+  9151,
+  9152,
+  9153,
+  9154,
+  9155,
+  9156,
+  9157,
+  9158,
+  9159,
+  9160,
+  9161,
+  9162,
+  9163,
+  9164,
+  9165,
+  9166,
+  9167,
+  9168,
+  9169,
+  9170,
+  9171,
+  9172,
+  9173,
+  9174,
+  9175,
+  9176,
+  9177,
+  9178,
+  9179,
+  9180,
+  9181,
+  9182,
+  9183,
+  9184,
+  9185,
+  9186,
+  9187,
+  9188,
+  9189,
+  9190,
+  9191,
+  9192,
+  9193,
+  9194,
+  9195,
+  9196,
+  9197,
+  9198,
+  9199,
+  9200,
+  9201,
+  9202,
+  9203,
+  9204,
+  9205,
+  9206,
+  9207,
+  9208,
+  9209,
+  9210,
+  9211,
+  9212,
+  9213,
+  9214,
+  9215,
+  9216,
+  9217,
+  9218,
+  9219,
+  9220,
+  9221,
+  9222,
+  9223,
+  9224,
+  9225,
+  9226,
+  9227,
+  9228,
+  9229,
+  9230,
+  9231,
+  9232,
+  9233,
+  9234,
+  9235,
+  9236,
+  9237,
+  9238,
+  9239,
+  9240,
+  9241,
+  9242,
+  9243,
+  9244,
+  9245,
+  9246,
+  9247,
+  9248,
+  9249,
+  9250,
+  9251,
+  9252,
+  9253,
+  9254,
+  9255,
+  9256,
+  9257,
+  9258,
+  9259,
+  9260,
+  9261,
+  9262,
+  9263,
+  9264,
+  9265,
+  9266,
+  9267,
+  9268,
+  9269,
+  9270,
+  9271,
+  9272,
+  9273,
+  9274,
+  9275,
+  9276,
+  9277,
+  9278,
+  9279,
+  9280,
+  9281,
+  9282,
+  9283,
+  9284,
+  9285,
+  9286,
+  9287,
+  9288,
+  9289,
+  9290,
+  9291,
+  9292,
+  9293,
+  9294,
+  9295,
+  9296,
+  9297,
+  9298,
+  9299,
+  9300,
+  9301,
+  9302,
+  9303,
+  9304,
+  9305,
+  9306,
+  9307,
+  9308,
+  9309,
+  9310,
+  9311,
+  9312,
+  9313,
+  9314,
+  9315,
+  9316,
+  9317,
+  9318,
+  9319,
+  9320,
+  9321,
+  9322,
+  9323,
+  9324,
+  9325,
+  9326,
+  9327,
+  9328,
+  9329,
+  9330,
+  9331,
+  9332,
+  9333,
+  9334,
+  9335,
+  9336,
+  9337,
+  9338,
+  9339,
+  9340,
+  9341,
+  9342,
+  9343,
+  9344,
+  9345,
+  9346,
+  9347,
+  9348,
+  9349,
+  9350,
+  9351,
+  9352,
+  9353,
+  9354,
+  9355,
+  9356,
+  9357,
+  9358,
+  9359,
+  9360,
+  9361,
+  9362,
+  9363,
+  9364,
+  9365,
+  9366,
+  9367,
+  9368,
+  9369,
+  9370,
+  9371,
+  9372,
+  9373,
+  9374,
+  9375,
+  9376,
+  9377,
+  9378,
+  9379,
+  9380,
+  9381,
+  9382,
+  9383,
+  9384,
+  9385,
+  9386,
+  9387,
+  9388,
+  9389,
+  9390,
+  9391,
+  9392,
+  9393,
+  9394,
+  9395,
+  9396,
+  9397,
+  9398,
+  9399,
+  9400,
+  9401,
+  9402,
+  9403,
+  9404,
+  9405,
+  9406,
+  9407,
+  9408,
+  9409,
+  9410,
+  9411,
+  9412,
+  9413,
+  9414,
+  9415,
+  9416,
+  9417,
+  9418,
+  9419,
+  9420,
+  9421,
+  9422,
+  9423,
+  9424,
+  9425,
+  9426,
+  9427,
+  9428,
+  9429,
+  9430,
+  9431,
+  9432,
+  9433,
+  9434,
+  9435,
+  9436,
+  9437,
+  9438,
+  9439,
+  9440,
+  9441,
+  9442,
+  9443,
+  9444,
+  9445,
+  9446,
+  9447,
+  9448,
+  9449,
+  9450,
+  9451,
+  9452,
+  9453,
+  9454,
+  9455,
+  9456,
+  9457,
+  9458,
+  9459,
+  9460,
+  9461,
+  9462,
+  9463,
+  9464,
+  9465,
+  9466,
+  9467,
+  9468,
+  9469,
+  9470,
+  9471,
+  9472,
+  9473,
+  9474,
+  9475,
+  9476,
+  9477,
+  9478,
+  9479,
+  9480,
+  9481,
+  9482,
+  9483,
+  9484,
+  9485,
+  9486,
+  9487,
+  9488,
+  9489,
+  9490,
+  9491,
+  9492,
+  9493,
+  9494,
+  9495,
+  9496,
+  9497,
+  9498,
+  9499,
+  9500,
+  9501,
+  9502,
+  9503,
+  9504,
+  9505,
+  9506,
+  9507,
+  9508,
+  9509,
+  9510,
+  9511,
+  9512,
+  9513,
+  9514,
+  9515,
+  9516,
+  9517,
+  9518,
+  9519,
+  9520,
+  9521,
+  9522,
+  9523,
+  9524,
+  9525,
+  9526,
+  9527,
+  9528,
+  9529,
+  9530,
+  9531,
+  9532,
+  9533,
+  9534,
+  9535,
+  9536,
+  9537,
+  9538,
+  9539,
+  9540,
+  9541,
+  9542,
+  9543,
+  9544,
+  9545,
+  9546,
+  9547,
+  9548,
+  9549,
+  9550,
+  9551,
+  9552,
+  9553,
+  9554,
+  9555,
+  9556,
+  9557,
+  9558,
+  9559,
+  9560,
+  9561,
+  9562,
+  9563,
+  9564,
+  9565,
+  9566,
+  9567,
+  9568,
+  9569,
+  9570,
+  9571,
+  9572,
+  9573,
+  9574,
+  9575,
+  9576,
+  9577,
+  9578,
+  9579,
+  9580,
+  9581,
+  9582,
+  9583,
+  9584,
+  9585,
+  9586,
+  9587,
+  9588,
+  9589,
+  9590,
+  9591,
+  9592,
+  9593,
+  9594,
+  9595,
+  9596,
+  9597,
+  9598,
+  9599,
+  9600,
+  9601,
+  9602,
+  9603,
+  9604,
+  9605,
+  9606,
+  9607,
+  9608,
+  9609,
+  9610,
+  9611,
+  9612,
+  9613,
+  9614,
+  9615,
+  9616,
+  9617,
+  9618,
+  9619,
+  9620,
+  9621,
+  9622,
+  9623,
+  9624,
+  9625,
+  9626,
+  9627,
+  9628,
+  9629,
+  9630,
+  9631,
+  9632,
+  9633,
+  9634,
+  9635,
+  9636,
+  9637,
+  9638,
+  9639,
+  9640,
+  9641,
+  9642,
+  9643,
+  9644,
+  9645,
+  9646,
+  9647,
+  9648,
+  9649,
+  9650,
+  9651,
+  9652,
+  9653,
+  9654,
+  9655,
+  9656,
+  9657,
+  9658,
+  9659,
+  9660,
+  9661,
+  9662,
+  9663,
+  9664,
+  9665,
+  9666,
+  9667,
+  9668,
+  9669,
+  9670,
+  9671,
+  9672,
+  9673,
+  9674,
+  9675,
+  9676,
+  9677,
+  9678,
+  9679,
+  9680,
+  9681,
+  9682,
+  9683,
+  9684,
+  9685,
+  9686,
+  9687,
+  9688,
+  9689,
+  9690,
+  9691,
+  9692,
+  9693,
+  9694,
+  9695,
+  9696,
+  9697,
+  9698,
+  9699,
+  9700,
+  9701,
+  9702,
+  9703,
+  9704,
+  9705,
+  9706,
+  9707,
+  9708,
+  9709,
+  9710,
+  9711,
+  9712,
+  9713,
+  9714,
+  9715,
+  9716,
+  9717,
+  9718,
+  9719,
+  9720,
+  9721,
+  9722,
+  9723,
+  9724,
+  9725,
+  9726,
+  9727,
+  9728,
+  9729,
+  9730,
+  9731,
+  9732,
+  9733,
+  9734,
+  9735,
+  9736,
+  9737,
+  9738,
+  9739,
+  9740,
+  9741,
+  9742,
+  9743,
+  9744,
+  9745,
+  9746,
+  9747,
+  9748,
+  9749,
+  9750,
+  9751,
+  9752,
+  9753,
+  9754,
+  9755,
+  9756,
+  9757,
+  9758,
+  9759,
+  9760,
+  9761,
+  9762,
+  9763,
+  9764,
+  9765,
+  9766,
+  9767,
+  9768,
+  9769,
+  9770,
+  9771,
+  9772,
+  9773,
+  9774,
+  9775,
+  9776,
+  9777,
+  9778,
+  9779,
+  9780,
+  9781,
+  9782,
+  9783,
+  9784,
+  9785,
+  9786,
+  9787,
+  9788,
+  9789,
+  9790,
+  9791,
+  9792,
+  9793,
+  9794,
+  9795,
+  9796,
+  9797,
+  9798,
+  9799,
+  9800,
+  9801,
+  9802,
+  9803,
+  9804,
+  9805,
+  9806,
+  9807,
+  9808,
+  9809,
+  9810,
+  9811,
+  9812,
+  9813,
+  9814,
+  9815,
+  9816,
+  9817,
+  9818,
+  9819,
+  9820,
+  9821,
+  9822,
+  9823,
+  9824,
+  9825,
+  9826,
+  9827,
+  9828,
+  9829,
+  9830,
+  9831,
+  9832,
+  9833,
+  9834,
+  9835,
+  9836,
+  9837,
+  9838,
+  9839,
+  9840,
+  9841,
+  9842,
+  9843,
+  9844,
+  9845,
+  9846,
+  9847,
+  9848,
+  9849,
+  9850,
+  9851,
+  9852,
+  9853,
+  9854,
+  9855,
+  9856,
+  9857,
+  9858,
+  9859,
+  9860,
+  9861,
+  9862,
+  9863,
+  9864,
+  9865,
+  9866,
+  9867,
+  9868,
+  9869,
+  9870,
+  9871,
+  9872,
+  9873,
+  9874,
+  9875,
+  9876,
+  9877,
+  9878,
+  9879,
+  9880,
+  9881,
+  9882,
+  9883,
+  9884,
+  9885,
+  9886,
+  9887,
+  9888,
+  9889,
+  9890,
+  9891,
+  9892,
+  9893,
+  9894,
+  9895,
+  9896,
+  9897,
+  9898,
+  9899,
+  9900,
+  9901,
+  9902,
+  9903,
+  9904,
+  9905,
+  9906,
+  9907,
+  9908,
+  9909,
+  9910,
+  9911,
+  9912,
+  9913,
+  9914,
+  9915,
+  9916,
+  9917,
+  9918,
+  9919,
+  9920,
+  9921,
+  9922,
+  9923,
+  9924,
+  9925,
+  9926,
+  9927,
+  9928,
+  9929,
+  9930,
+  9931,
+  9932,
+  9933,
+  9934,
+  9935,
+  9936,
+  9937,
+  9938,
+  9939,
+  9940,
+  9941,
+  9942,
+  9943,
+  9944,
+  9945,
+  9946,
+  9947,
+  9948,
+  9949,
+  9950,
+  9951,
+  9952,
+  9953,
+  9954,
+  9955,
+  9956,
+  9957,
+  9958,
+  9959,
+  9960,
+  9961,
+  9962,
+  9963,
+  9964,
+  9965,
+  9966,
+  9967,
+  9968,
+  9969,
+  9970,
+  9971,
+  9972,
+  9973,
+  9974,
+  9975,
+  9976,
+  9977,
+  9978,
+  9979,
+  9980,
+  9981,
+  9982,
+  9983,
+  9984,
+  9985,
+  9986,
+  9987,
+  9988,
+  9989,
+  9990,
+  9991,
+  9992,
+  9993,
+  9994,
+  9995,
+  9996,
+  9997,
+  9998,
+  9999,
+};
+Set<String> stringSet = {
+  'foo_0',
+  'foo_1',
+  'foo_2',
+  'foo_3',
+  'foo_4',
+  'foo_5',
+  'foo_6',
+  'foo_7',
+  'foo_8',
+  'foo_9',
+  'foo_10',
+  'foo_11',
+  'foo_12',
+  'foo_13',
+  'foo_14',
+  'foo_15',
+  'foo_16',
+  'foo_17',
+  'foo_18',
+  'foo_19',
+  'foo_20',
+  'foo_21',
+  'foo_22',
+  'foo_23',
+  'foo_24',
+  'foo_25',
+  'foo_26',
+  'foo_27',
+  'foo_28',
+  'foo_29',
+  'foo_30',
+  'foo_31',
+  'foo_32',
+  'foo_33',
+  'foo_34',
+  'foo_35',
+  'foo_36',
+  'foo_37',
+  'foo_38',
+  'foo_39',
+  'foo_40',
+  'foo_41',
+  'foo_42',
+  'foo_43',
+  'foo_44',
+  'foo_45',
+  'foo_46',
+  'foo_47',
+  'foo_48',
+  'foo_49',
+  'foo_50',
+  'foo_51',
+  'foo_52',
+  'foo_53',
+  'foo_54',
+  'foo_55',
+  'foo_56',
+  'foo_57',
+  'foo_58',
+  'foo_59',
+  'foo_60',
+  'foo_61',
+  'foo_62',
+  'foo_63',
+  'foo_64',
+  'foo_65',
+  'foo_66',
+  'foo_67',
+  'foo_68',
+  'foo_69',
+  'foo_70',
+  'foo_71',
+  'foo_72',
+  'foo_73',
+  'foo_74',
+  'foo_75',
+  'foo_76',
+  'foo_77',
+  'foo_78',
+  'foo_79',
+  'foo_80',
+  'foo_81',
+  'foo_82',
+  'foo_83',
+  'foo_84',
+  'foo_85',
+  'foo_86',
+  'foo_87',
+  'foo_88',
+  'foo_89',
+  'foo_90',
+  'foo_91',
+  'foo_92',
+  'foo_93',
+  'foo_94',
+  'foo_95',
+  'foo_96',
+  'foo_97',
+  'foo_98',
+  'foo_99',
+  'foo_100',
+  'foo_101',
+  'foo_102',
+  'foo_103',
+  'foo_104',
+  'foo_105',
+  'foo_106',
+  'foo_107',
+  'foo_108',
+  'foo_109',
+  'foo_110',
+  'foo_111',
+  'foo_112',
+  'foo_113',
+  'foo_114',
+  'foo_115',
+  'foo_116',
+  'foo_117',
+  'foo_118',
+  'foo_119',
+  'foo_120',
+  'foo_121',
+  'foo_122',
+  'foo_123',
+  'foo_124',
+  'foo_125',
+  'foo_126',
+  'foo_127',
+  'foo_128',
+  'foo_129',
+  'foo_130',
+  'foo_131',
+  'foo_132',
+  'foo_133',
+  'foo_134',
+  'foo_135',
+  'foo_136',
+  'foo_137',
+  'foo_138',
+  'foo_139',
+  'foo_140',
+  'foo_141',
+  'foo_142',
+  'foo_143',
+  'foo_144',
+  'foo_145',
+  'foo_146',
+  'foo_147',
+  'foo_148',
+  'foo_149',
+  'foo_150',
+  'foo_151',
+  'foo_152',
+  'foo_153',
+  'foo_154',
+  'foo_155',
+  'foo_156',
+  'foo_157',
+  'foo_158',
+  'foo_159',
+  'foo_160',
+  'foo_161',
+  'foo_162',
+  'foo_163',
+  'foo_164',
+  'foo_165',
+  'foo_166',
+  'foo_167',
+  'foo_168',
+  'foo_169',
+  'foo_170',
+  'foo_171',
+  'foo_172',
+  'foo_173',
+  'foo_174',
+  'foo_175',
+  'foo_176',
+  'foo_177',
+  'foo_178',
+  'foo_179',
+  'foo_180',
+  'foo_181',
+  'foo_182',
+  'foo_183',
+  'foo_184',
+  'foo_185',
+  'foo_186',
+  'foo_187',
+  'foo_188',
+  'foo_189',
+  'foo_190',
+  'foo_191',
+  'foo_192',
+  'foo_193',
+  'foo_194',
+  'foo_195',
+  'foo_196',
+  'foo_197',
+  'foo_198',
+  'foo_199',
+  'foo_200',
+  'foo_201',
+  'foo_202',
+  'foo_203',
+  'foo_204',
+  'foo_205',
+  'foo_206',
+  'foo_207',
+  'foo_208',
+  'foo_209',
+  'foo_210',
+  'foo_211',
+  'foo_212',
+  'foo_213',
+  'foo_214',
+  'foo_215',
+  'foo_216',
+  'foo_217',
+  'foo_218',
+  'foo_219',
+  'foo_220',
+  'foo_221',
+  'foo_222',
+  'foo_223',
+  'foo_224',
+  'foo_225',
+  'foo_226',
+  'foo_227',
+  'foo_228',
+  'foo_229',
+  'foo_230',
+  'foo_231',
+  'foo_232',
+  'foo_233',
+  'foo_234',
+  'foo_235',
+  'foo_236',
+  'foo_237',
+  'foo_238',
+  'foo_239',
+  'foo_240',
+  'foo_241',
+  'foo_242',
+  'foo_243',
+  'foo_244',
+  'foo_245',
+  'foo_246',
+  'foo_247',
+  'foo_248',
+  'foo_249',
+  'foo_250',
+  'foo_251',
+  'foo_252',
+  'foo_253',
+  'foo_254',
+  'foo_255',
+  'foo_256',
+  'foo_257',
+  'foo_258',
+  'foo_259',
+  'foo_260',
+  'foo_261',
+  'foo_262',
+  'foo_263',
+  'foo_264',
+  'foo_265',
+  'foo_266',
+  'foo_267',
+  'foo_268',
+  'foo_269',
+  'foo_270',
+  'foo_271',
+  'foo_272',
+  'foo_273',
+  'foo_274',
+  'foo_275',
+  'foo_276',
+  'foo_277',
+  'foo_278',
+  'foo_279',
+  'foo_280',
+  'foo_281',
+  'foo_282',
+  'foo_283',
+  'foo_284',
+  'foo_285',
+  'foo_286',
+  'foo_287',
+  'foo_288',
+  'foo_289',
+  'foo_290',
+  'foo_291',
+  'foo_292',
+  'foo_293',
+  'foo_294',
+  'foo_295',
+  'foo_296',
+  'foo_297',
+  'foo_298',
+  'foo_299',
+  'foo_300',
+  'foo_301',
+  'foo_302',
+  'foo_303',
+  'foo_304',
+  'foo_305',
+  'foo_306',
+  'foo_307',
+  'foo_308',
+  'foo_309',
+  'foo_310',
+  'foo_311',
+  'foo_312',
+  'foo_313',
+  'foo_314',
+  'foo_315',
+  'foo_316',
+  'foo_317',
+  'foo_318',
+  'foo_319',
+  'foo_320',
+  'foo_321',
+  'foo_322',
+  'foo_323',
+  'foo_324',
+  'foo_325',
+  'foo_326',
+  'foo_327',
+  'foo_328',
+  'foo_329',
+  'foo_330',
+  'foo_331',
+  'foo_332',
+  'foo_333',
+  'foo_334',
+  'foo_335',
+  'foo_336',
+  'foo_337',
+  'foo_338',
+  'foo_339',
+  'foo_340',
+  'foo_341',
+  'foo_342',
+  'foo_343',
+  'foo_344',
+  'foo_345',
+  'foo_346',
+  'foo_347',
+  'foo_348',
+  'foo_349',
+  'foo_350',
+  'foo_351',
+  'foo_352',
+  'foo_353',
+  'foo_354',
+  'foo_355',
+  'foo_356',
+  'foo_357',
+  'foo_358',
+  'foo_359',
+  'foo_360',
+  'foo_361',
+  'foo_362',
+  'foo_363',
+  'foo_364',
+  'foo_365',
+  'foo_366',
+  'foo_367',
+  'foo_368',
+  'foo_369',
+  'foo_370',
+  'foo_371',
+  'foo_372',
+  'foo_373',
+  'foo_374',
+  'foo_375',
+  'foo_376',
+  'foo_377',
+  'foo_378',
+  'foo_379',
+  'foo_380',
+  'foo_381',
+  'foo_382',
+  'foo_383',
+  'foo_384',
+  'foo_385',
+  'foo_386',
+  'foo_387',
+  'foo_388',
+  'foo_389',
+  'foo_390',
+  'foo_391',
+  'foo_392',
+  'foo_393',
+  'foo_394',
+  'foo_395',
+  'foo_396',
+  'foo_397',
+  'foo_398',
+  'foo_399',
+  'foo_400',
+  'foo_401',
+  'foo_402',
+  'foo_403',
+  'foo_404',
+  'foo_405',
+  'foo_406',
+  'foo_407',
+  'foo_408',
+  'foo_409',
+  'foo_410',
+  'foo_411',
+  'foo_412',
+  'foo_413',
+  'foo_414',
+  'foo_415',
+  'foo_416',
+  'foo_417',
+  'foo_418',
+  'foo_419',
+  'foo_420',
+  'foo_421',
+  'foo_422',
+  'foo_423',
+  'foo_424',
+  'foo_425',
+  'foo_426',
+  'foo_427',
+  'foo_428',
+  'foo_429',
+  'foo_430',
+  'foo_431',
+  'foo_432',
+  'foo_433',
+  'foo_434',
+  'foo_435',
+  'foo_436',
+  'foo_437',
+  'foo_438',
+  'foo_439',
+  'foo_440',
+  'foo_441',
+  'foo_442',
+  'foo_443',
+  'foo_444',
+  'foo_445',
+  'foo_446',
+  'foo_447',
+  'foo_448',
+  'foo_449',
+  'foo_450',
+  'foo_451',
+  'foo_452',
+  'foo_453',
+  'foo_454',
+  'foo_455',
+  'foo_456',
+  'foo_457',
+  'foo_458',
+  'foo_459',
+  'foo_460',
+  'foo_461',
+  'foo_462',
+  'foo_463',
+  'foo_464',
+  'foo_465',
+  'foo_466',
+  'foo_467',
+  'foo_468',
+  'foo_469',
+  'foo_470',
+  'foo_471',
+  'foo_472',
+  'foo_473',
+  'foo_474',
+  'foo_475',
+  'foo_476',
+  'foo_477',
+  'foo_478',
+  'foo_479',
+  'foo_480',
+  'foo_481',
+  'foo_482',
+  'foo_483',
+  'foo_484',
+  'foo_485',
+  'foo_486',
+  'foo_487',
+  'foo_488',
+  'foo_489',
+  'foo_490',
+  'foo_491',
+  'foo_492',
+  'foo_493',
+  'foo_494',
+  'foo_495',
+  'foo_496',
+  'foo_497',
+  'foo_498',
+  'foo_499',
+  'foo_500',
+  'foo_501',
+  'foo_502',
+  'foo_503',
+  'foo_504',
+  'foo_505',
+  'foo_506',
+  'foo_507',
+  'foo_508',
+  'foo_509',
+  'foo_510',
+  'foo_511',
+  'foo_512',
+  'foo_513',
+  'foo_514',
+  'foo_515',
+  'foo_516',
+  'foo_517',
+  'foo_518',
+  'foo_519',
+  'foo_520',
+  'foo_521',
+  'foo_522',
+  'foo_523',
+  'foo_524',
+  'foo_525',
+  'foo_526',
+  'foo_527',
+  'foo_528',
+  'foo_529',
+  'foo_530',
+  'foo_531',
+  'foo_532',
+  'foo_533',
+  'foo_534',
+  'foo_535',
+  'foo_536',
+  'foo_537',
+  'foo_538',
+  'foo_539',
+  'foo_540',
+  'foo_541',
+  'foo_542',
+  'foo_543',
+  'foo_544',
+  'foo_545',
+  'foo_546',
+  'foo_547',
+  'foo_548',
+  'foo_549',
+  'foo_550',
+  'foo_551',
+  'foo_552',
+  'foo_553',
+  'foo_554',
+  'foo_555',
+  'foo_556',
+  'foo_557',
+  'foo_558',
+  'foo_559',
+  'foo_560',
+  'foo_561',
+  'foo_562',
+  'foo_563',
+  'foo_564',
+  'foo_565',
+  'foo_566',
+  'foo_567',
+  'foo_568',
+  'foo_569',
+  'foo_570',
+  'foo_571',
+  'foo_572',
+  'foo_573',
+  'foo_574',
+  'foo_575',
+  'foo_576',
+  'foo_577',
+  'foo_578',
+  'foo_579',
+  'foo_580',
+  'foo_581',
+  'foo_582',
+  'foo_583',
+  'foo_584',
+  'foo_585',
+  'foo_586',
+  'foo_587',
+  'foo_588',
+  'foo_589',
+  'foo_590',
+  'foo_591',
+  'foo_592',
+  'foo_593',
+  'foo_594',
+  'foo_595',
+  'foo_596',
+  'foo_597',
+  'foo_598',
+  'foo_599',
+  'foo_600',
+  'foo_601',
+  'foo_602',
+  'foo_603',
+  'foo_604',
+  'foo_605',
+  'foo_606',
+  'foo_607',
+  'foo_608',
+  'foo_609',
+  'foo_610',
+  'foo_611',
+  'foo_612',
+  'foo_613',
+  'foo_614',
+  'foo_615',
+  'foo_616',
+  'foo_617',
+  'foo_618',
+  'foo_619',
+  'foo_620',
+  'foo_621',
+  'foo_622',
+  'foo_623',
+  'foo_624',
+  'foo_625',
+  'foo_626',
+  'foo_627',
+  'foo_628',
+  'foo_629',
+  'foo_630',
+  'foo_631',
+  'foo_632',
+  'foo_633',
+  'foo_634',
+  'foo_635',
+  'foo_636',
+  'foo_637',
+  'foo_638',
+  'foo_639',
+  'foo_640',
+  'foo_641',
+  'foo_642',
+  'foo_643',
+  'foo_644',
+  'foo_645',
+  'foo_646',
+  'foo_647',
+  'foo_648',
+  'foo_649',
+  'foo_650',
+  'foo_651',
+  'foo_652',
+  'foo_653',
+  'foo_654',
+  'foo_655',
+  'foo_656',
+  'foo_657',
+  'foo_658',
+  'foo_659',
+  'foo_660',
+  'foo_661',
+  'foo_662',
+  'foo_663',
+  'foo_664',
+  'foo_665',
+  'foo_666',
+  'foo_667',
+  'foo_668',
+  'foo_669',
+  'foo_670',
+  'foo_671',
+  'foo_672',
+  'foo_673',
+  'foo_674',
+  'foo_675',
+  'foo_676',
+  'foo_677',
+  'foo_678',
+  'foo_679',
+  'foo_680',
+  'foo_681',
+  'foo_682',
+  'foo_683',
+  'foo_684',
+  'foo_685',
+  'foo_686',
+  'foo_687',
+  'foo_688',
+  'foo_689',
+  'foo_690',
+  'foo_691',
+  'foo_692',
+  'foo_693',
+  'foo_694',
+  'foo_695',
+  'foo_696',
+  'foo_697',
+  'foo_698',
+  'foo_699',
+  'foo_700',
+  'foo_701',
+  'foo_702',
+  'foo_703',
+  'foo_704',
+  'foo_705',
+  'foo_706',
+  'foo_707',
+  'foo_708',
+  'foo_709',
+  'foo_710',
+  'foo_711',
+  'foo_712',
+  'foo_713',
+  'foo_714',
+  'foo_715',
+  'foo_716',
+  'foo_717',
+  'foo_718',
+  'foo_719',
+  'foo_720',
+  'foo_721',
+  'foo_722',
+  'foo_723',
+  'foo_724',
+  'foo_725',
+  'foo_726',
+  'foo_727',
+  'foo_728',
+  'foo_729',
+  'foo_730',
+  'foo_731',
+  'foo_732',
+  'foo_733',
+  'foo_734',
+  'foo_735',
+  'foo_736',
+  'foo_737',
+  'foo_738',
+  'foo_739',
+  'foo_740',
+  'foo_741',
+  'foo_742',
+  'foo_743',
+  'foo_744',
+  'foo_745',
+  'foo_746',
+  'foo_747',
+  'foo_748',
+  'foo_749',
+  'foo_750',
+  'foo_751',
+  'foo_752',
+  'foo_753',
+  'foo_754',
+  'foo_755',
+  'foo_756',
+  'foo_757',
+  'foo_758',
+  'foo_759',
+  'foo_760',
+  'foo_761',
+  'foo_762',
+  'foo_763',
+  'foo_764',
+  'foo_765',
+  'foo_766',
+  'foo_767',
+  'foo_768',
+  'foo_769',
+  'foo_770',
+  'foo_771',
+  'foo_772',
+  'foo_773',
+  'foo_774',
+  'foo_775',
+  'foo_776',
+  'foo_777',
+  'foo_778',
+  'foo_779',
+  'foo_780',
+  'foo_781',
+  'foo_782',
+  'foo_783',
+  'foo_784',
+  'foo_785',
+  'foo_786',
+  'foo_787',
+  'foo_788',
+  'foo_789',
+  'foo_790',
+  'foo_791',
+  'foo_792',
+  'foo_793',
+  'foo_794',
+  'foo_795',
+  'foo_796',
+  'foo_797',
+  'foo_798',
+  'foo_799',
+  'foo_800',
+  'foo_801',
+  'foo_802',
+  'foo_803',
+  'foo_804',
+  'foo_805',
+  'foo_806',
+  'foo_807',
+  'foo_808',
+  'foo_809',
+  'foo_810',
+  'foo_811',
+  'foo_812',
+  'foo_813',
+  'foo_814',
+  'foo_815',
+  'foo_816',
+  'foo_817',
+  'foo_818',
+  'foo_819',
+  'foo_820',
+  'foo_821',
+  'foo_822',
+  'foo_823',
+  'foo_824',
+  'foo_825',
+  'foo_826',
+  'foo_827',
+  'foo_828',
+  'foo_829',
+  'foo_830',
+  'foo_831',
+  'foo_832',
+  'foo_833',
+  'foo_834',
+  'foo_835',
+  'foo_836',
+  'foo_837',
+  'foo_838',
+  'foo_839',
+  'foo_840',
+  'foo_841',
+  'foo_842',
+  'foo_843',
+  'foo_844',
+  'foo_845',
+  'foo_846',
+  'foo_847',
+  'foo_848',
+  'foo_849',
+  'foo_850',
+  'foo_851',
+  'foo_852',
+  'foo_853',
+  'foo_854',
+  'foo_855',
+  'foo_856',
+  'foo_857',
+  'foo_858',
+  'foo_859',
+  'foo_860',
+  'foo_861',
+  'foo_862',
+  'foo_863',
+  'foo_864',
+  'foo_865',
+  'foo_866',
+  'foo_867',
+  'foo_868',
+  'foo_869',
+  'foo_870',
+  'foo_871',
+  'foo_872',
+  'foo_873',
+  'foo_874',
+  'foo_875',
+  'foo_876',
+  'foo_877',
+  'foo_878',
+  'foo_879',
+  'foo_880',
+  'foo_881',
+  'foo_882',
+  'foo_883',
+  'foo_884',
+  'foo_885',
+  'foo_886',
+  'foo_887',
+  'foo_888',
+  'foo_889',
+  'foo_890',
+  'foo_891',
+  'foo_892',
+  'foo_893',
+  'foo_894',
+  'foo_895',
+  'foo_896',
+  'foo_897',
+  'foo_898',
+  'foo_899',
+  'foo_900',
+  'foo_901',
+  'foo_902',
+  'foo_903',
+  'foo_904',
+  'foo_905',
+  'foo_906',
+  'foo_907',
+  'foo_908',
+  'foo_909',
+  'foo_910',
+  'foo_911',
+  'foo_912',
+  'foo_913',
+  'foo_914',
+  'foo_915',
+  'foo_916',
+  'foo_917',
+  'foo_918',
+  'foo_919',
+  'foo_920',
+  'foo_921',
+  'foo_922',
+  'foo_923',
+  'foo_924',
+  'foo_925',
+  'foo_926',
+  'foo_927',
+  'foo_928',
+  'foo_929',
+  'foo_930',
+  'foo_931',
+  'foo_932',
+  'foo_933',
+  'foo_934',
+  'foo_935',
+  'foo_936',
+  'foo_937',
+  'foo_938',
+  'foo_939',
+  'foo_940',
+  'foo_941',
+  'foo_942',
+  'foo_943',
+  'foo_944',
+  'foo_945',
+  'foo_946',
+  'foo_947',
+  'foo_948',
+  'foo_949',
+  'foo_950',
+  'foo_951',
+  'foo_952',
+  'foo_953',
+  'foo_954',
+  'foo_955',
+  'foo_956',
+  'foo_957',
+  'foo_958',
+  'foo_959',
+  'foo_960',
+  'foo_961',
+  'foo_962',
+  'foo_963',
+  'foo_964',
+  'foo_965',
+  'foo_966',
+  'foo_967',
+  'foo_968',
+  'foo_969',
+  'foo_970',
+  'foo_971',
+  'foo_972',
+  'foo_973',
+  'foo_974',
+  'foo_975',
+  'foo_976',
+  'foo_977',
+  'foo_978',
+  'foo_979',
+  'foo_980',
+  'foo_981',
+  'foo_982',
+  'foo_983',
+  'foo_984',
+  'foo_985',
+  'foo_986',
+  'foo_987',
+  'foo_988',
+  'foo_989',
+  'foo_990',
+  'foo_991',
+  'foo_992',
+  'foo_993',
+  'foo_994',
+  'foo_995',
+  'foo_996',
+  'foo_997',
+  'foo_998',
+  'foo_999',
+  'foo_1000',
+  'foo_1001',
+  'foo_1002',
+  'foo_1003',
+  'foo_1004',
+  'foo_1005',
+  'foo_1006',
+  'foo_1007',
+  'foo_1008',
+  'foo_1009',
+  'foo_1010',
+  'foo_1011',
+  'foo_1012',
+  'foo_1013',
+  'foo_1014',
+  'foo_1015',
+  'foo_1016',
+  'foo_1017',
+  'foo_1018',
+  'foo_1019',
+  'foo_1020',
+  'foo_1021',
+  'foo_1022',
+  'foo_1023',
+  'foo_1024',
+  'foo_1025',
+  'foo_1026',
+  'foo_1027',
+  'foo_1028',
+  'foo_1029',
+  'foo_1030',
+  'foo_1031',
+  'foo_1032',
+  'foo_1033',
+  'foo_1034',
+  'foo_1035',
+  'foo_1036',
+  'foo_1037',
+  'foo_1038',
+  'foo_1039',
+  'foo_1040',
+  'foo_1041',
+  'foo_1042',
+  'foo_1043',
+  'foo_1044',
+  'foo_1045',
+  'foo_1046',
+  'foo_1047',
+  'foo_1048',
+  'foo_1049',
+  'foo_1050',
+  'foo_1051',
+  'foo_1052',
+  'foo_1053',
+  'foo_1054',
+  'foo_1055',
+  'foo_1056',
+  'foo_1057',
+  'foo_1058',
+  'foo_1059',
+  'foo_1060',
+  'foo_1061',
+  'foo_1062',
+  'foo_1063',
+  'foo_1064',
+  'foo_1065',
+  'foo_1066',
+  'foo_1067',
+  'foo_1068',
+  'foo_1069',
+  'foo_1070',
+  'foo_1071',
+  'foo_1072',
+  'foo_1073',
+  'foo_1074',
+  'foo_1075',
+  'foo_1076',
+  'foo_1077',
+  'foo_1078',
+  'foo_1079',
+  'foo_1080',
+  'foo_1081',
+  'foo_1082',
+  'foo_1083',
+  'foo_1084',
+  'foo_1085',
+  'foo_1086',
+  'foo_1087',
+  'foo_1088',
+  'foo_1089',
+  'foo_1090',
+  'foo_1091',
+  'foo_1092',
+  'foo_1093',
+  'foo_1094',
+  'foo_1095',
+  'foo_1096',
+  'foo_1097',
+  'foo_1098',
+  'foo_1099',
+  'foo_1100',
+  'foo_1101',
+  'foo_1102',
+  'foo_1103',
+  'foo_1104',
+  'foo_1105',
+  'foo_1106',
+  'foo_1107',
+  'foo_1108',
+  'foo_1109',
+  'foo_1110',
+  'foo_1111',
+  'foo_1112',
+  'foo_1113',
+  'foo_1114',
+  'foo_1115',
+  'foo_1116',
+  'foo_1117',
+  'foo_1118',
+  'foo_1119',
+  'foo_1120',
+  'foo_1121',
+  'foo_1122',
+  'foo_1123',
+  'foo_1124',
+  'foo_1125',
+  'foo_1126',
+  'foo_1127',
+  'foo_1128',
+  'foo_1129',
+  'foo_1130',
+  'foo_1131',
+  'foo_1132',
+  'foo_1133',
+  'foo_1134',
+  'foo_1135',
+  'foo_1136',
+  'foo_1137',
+  'foo_1138',
+  'foo_1139',
+  'foo_1140',
+  'foo_1141',
+  'foo_1142',
+  'foo_1143',
+  'foo_1144',
+  'foo_1145',
+  'foo_1146',
+  'foo_1147',
+  'foo_1148',
+  'foo_1149',
+  'foo_1150',
+  'foo_1151',
+  'foo_1152',
+  'foo_1153',
+  'foo_1154',
+  'foo_1155',
+  'foo_1156',
+  'foo_1157',
+  'foo_1158',
+  'foo_1159',
+  'foo_1160',
+  'foo_1161',
+  'foo_1162',
+  'foo_1163',
+  'foo_1164',
+  'foo_1165',
+  'foo_1166',
+  'foo_1167',
+  'foo_1168',
+  'foo_1169',
+  'foo_1170',
+  'foo_1171',
+  'foo_1172',
+  'foo_1173',
+  'foo_1174',
+  'foo_1175',
+  'foo_1176',
+  'foo_1177',
+  'foo_1178',
+  'foo_1179',
+  'foo_1180',
+  'foo_1181',
+  'foo_1182',
+  'foo_1183',
+  'foo_1184',
+  'foo_1185',
+  'foo_1186',
+  'foo_1187',
+  'foo_1188',
+  'foo_1189',
+  'foo_1190',
+  'foo_1191',
+  'foo_1192',
+  'foo_1193',
+  'foo_1194',
+  'foo_1195',
+  'foo_1196',
+  'foo_1197',
+  'foo_1198',
+  'foo_1199',
+  'foo_1200',
+  'foo_1201',
+  'foo_1202',
+  'foo_1203',
+  'foo_1204',
+  'foo_1205',
+  'foo_1206',
+  'foo_1207',
+  'foo_1208',
+  'foo_1209',
+  'foo_1210',
+  'foo_1211',
+  'foo_1212',
+  'foo_1213',
+  'foo_1214',
+  'foo_1215',
+  'foo_1216',
+  'foo_1217',
+  'foo_1218',
+  'foo_1219',
+  'foo_1220',
+  'foo_1221',
+  'foo_1222',
+  'foo_1223',
+  'foo_1224',
+  'foo_1225',
+  'foo_1226',
+  'foo_1227',
+  'foo_1228',
+  'foo_1229',
+  'foo_1230',
+  'foo_1231',
+  'foo_1232',
+  'foo_1233',
+  'foo_1234',
+  'foo_1235',
+  'foo_1236',
+  'foo_1237',
+  'foo_1238',
+  'foo_1239',
+  'foo_1240',
+  'foo_1241',
+  'foo_1242',
+  'foo_1243',
+  'foo_1244',
+  'foo_1245',
+  'foo_1246',
+  'foo_1247',
+  'foo_1248',
+  'foo_1249',
+  'foo_1250',
+  'foo_1251',
+  'foo_1252',
+  'foo_1253',
+  'foo_1254',
+  'foo_1255',
+  'foo_1256',
+  'foo_1257',
+  'foo_1258',
+  'foo_1259',
+  'foo_1260',
+  'foo_1261',
+  'foo_1262',
+  'foo_1263',
+  'foo_1264',
+  'foo_1265',
+  'foo_1266',
+  'foo_1267',
+  'foo_1268',
+  'foo_1269',
+  'foo_1270',
+  'foo_1271',
+  'foo_1272',
+  'foo_1273',
+  'foo_1274',
+  'foo_1275',
+  'foo_1276',
+  'foo_1277',
+  'foo_1278',
+  'foo_1279',
+  'foo_1280',
+  'foo_1281',
+  'foo_1282',
+  'foo_1283',
+  'foo_1284',
+  'foo_1285',
+  'foo_1286',
+  'foo_1287',
+  'foo_1288',
+  'foo_1289',
+  'foo_1290',
+  'foo_1291',
+  'foo_1292',
+  'foo_1293',
+  'foo_1294',
+  'foo_1295',
+  'foo_1296',
+  'foo_1297',
+  'foo_1298',
+  'foo_1299',
+  'foo_1300',
+  'foo_1301',
+  'foo_1302',
+  'foo_1303',
+  'foo_1304',
+  'foo_1305',
+  'foo_1306',
+  'foo_1307',
+  'foo_1308',
+  'foo_1309',
+  'foo_1310',
+  'foo_1311',
+  'foo_1312',
+  'foo_1313',
+  'foo_1314',
+  'foo_1315',
+  'foo_1316',
+  'foo_1317',
+  'foo_1318',
+  'foo_1319',
+  'foo_1320',
+  'foo_1321',
+  'foo_1322',
+  'foo_1323',
+  'foo_1324',
+  'foo_1325',
+  'foo_1326',
+  'foo_1327',
+  'foo_1328',
+  'foo_1329',
+  'foo_1330',
+  'foo_1331',
+  'foo_1332',
+  'foo_1333',
+  'foo_1334',
+  'foo_1335',
+  'foo_1336',
+  'foo_1337',
+  'foo_1338',
+  'foo_1339',
+  'foo_1340',
+  'foo_1341',
+  'foo_1342',
+  'foo_1343',
+  'foo_1344',
+  'foo_1345',
+  'foo_1346',
+  'foo_1347',
+  'foo_1348',
+  'foo_1349',
+  'foo_1350',
+  'foo_1351',
+  'foo_1352',
+  'foo_1353',
+  'foo_1354',
+  'foo_1355',
+  'foo_1356',
+  'foo_1357',
+  'foo_1358',
+  'foo_1359',
+  'foo_1360',
+  'foo_1361',
+  'foo_1362',
+  'foo_1363',
+  'foo_1364',
+  'foo_1365',
+  'foo_1366',
+  'foo_1367',
+  'foo_1368',
+  'foo_1369',
+  'foo_1370',
+  'foo_1371',
+  'foo_1372',
+  'foo_1373',
+  'foo_1374',
+  'foo_1375',
+  'foo_1376',
+  'foo_1377',
+  'foo_1378',
+  'foo_1379',
+  'foo_1380',
+  'foo_1381',
+  'foo_1382',
+  'foo_1383',
+  'foo_1384',
+  'foo_1385',
+  'foo_1386',
+  'foo_1387',
+  'foo_1388',
+  'foo_1389',
+  'foo_1390',
+  'foo_1391',
+  'foo_1392',
+  'foo_1393',
+  'foo_1394',
+  'foo_1395',
+  'foo_1396',
+  'foo_1397',
+  'foo_1398',
+  'foo_1399',
+  'foo_1400',
+  'foo_1401',
+  'foo_1402',
+  'foo_1403',
+  'foo_1404',
+  'foo_1405',
+  'foo_1406',
+  'foo_1407',
+  'foo_1408',
+  'foo_1409',
+  'foo_1410',
+  'foo_1411',
+  'foo_1412',
+  'foo_1413',
+  'foo_1414',
+  'foo_1415',
+  'foo_1416',
+  'foo_1417',
+  'foo_1418',
+  'foo_1419',
+  'foo_1420',
+  'foo_1421',
+  'foo_1422',
+  'foo_1423',
+  'foo_1424',
+  'foo_1425',
+  'foo_1426',
+  'foo_1427',
+  'foo_1428',
+  'foo_1429',
+  'foo_1430',
+  'foo_1431',
+  'foo_1432',
+  'foo_1433',
+  'foo_1434',
+  'foo_1435',
+  'foo_1436',
+  'foo_1437',
+  'foo_1438',
+  'foo_1439',
+  'foo_1440',
+  'foo_1441',
+  'foo_1442',
+  'foo_1443',
+  'foo_1444',
+  'foo_1445',
+  'foo_1446',
+  'foo_1447',
+  'foo_1448',
+  'foo_1449',
+  'foo_1450',
+  'foo_1451',
+  'foo_1452',
+  'foo_1453',
+  'foo_1454',
+  'foo_1455',
+  'foo_1456',
+  'foo_1457',
+  'foo_1458',
+  'foo_1459',
+  'foo_1460',
+  'foo_1461',
+  'foo_1462',
+  'foo_1463',
+  'foo_1464',
+  'foo_1465',
+  'foo_1466',
+  'foo_1467',
+  'foo_1468',
+  'foo_1469',
+  'foo_1470',
+  'foo_1471',
+  'foo_1472',
+  'foo_1473',
+  'foo_1474',
+  'foo_1475',
+  'foo_1476',
+  'foo_1477',
+  'foo_1478',
+  'foo_1479',
+  'foo_1480',
+  'foo_1481',
+  'foo_1482',
+  'foo_1483',
+  'foo_1484',
+  'foo_1485',
+  'foo_1486',
+  'foo_1487',
+  'foo_1488',
+  'foo_1489',
+  'foo_1490',
+  'foo_1491',
+  'foo_1492',
+  'foo_1493',
+  'foo_1494',
+  'foo_1495',
+  'foo_1496',
+  'foo_1497',
+  'foo_1498',
+  'foo_1499',
+  'foo_1500',
+  'foo_1501',
+  'foo_1502',
+  'foo_1503',
+  'foo_1504',
+  'foo_1505',
+  'foo_1506',
+  'foo_1507',
+  'foo_1508',
+  'foo_1509',
+  'foo_1510',
+  'foo_1511',
+  'foo_1512',
+  'foo_1513',
+  'foo_1514',
+  'foo_1515',
+  'foo_1516',
+  'foo_1517',
+  'foo_1518',
+  'foo_1519',
+  'foo_1520',
+  'foo_1521',
+  'foo_1522',
+  'foo_1523',
+  'foo_1524',
+  'foo_1525',
+  'foo_1526',
+  'foo_1527',
+  'foo_1528',
+  'foo_1529',
+  'foo_1530',
+  'foo_1531',
+  'foo_1532',
+  'foo_1533',
+  'foo_1534',
+  'foo_1535',
+  'foo_1536',
+  'foo_1537',
+  'foo_1538',
+  'foo_1539',
+  'foo_1540',
+  'foo_1541',
+  'foo_1542',
+  'foo_1543',
+  'foo_1544',
+  'foo_1545',
+  'foo_1546',
+  'foo_1547',
+  'foo_1548',
+  'foo_1549',
+  'foo_1550',
+  'foo_1551',
+  'foo_1552',
+  'foo_1553',
+  'foo_1554',
+  'foo_1555',
+  'foo_1556',
+  'foo_1557',
+  'foo_1558',
+  'foo_1559',
+  'foo_1560',
+  'foo_1561',
+  'foo_1562',
+  'foo_1563',
+  'foo_1564',
+  'foo_1565',
+  'foo_1566',
+  'foo_1567',
+  'foo_1568',
+  'foo_1569',
+  'foo_1570',
+  'foo_1571',
+  'foo_1572',
+  'foo_1573',
+  'foo_1574',
+  'foo_1575',
+  'foo_1576',
+  'foo_1577',
+  'foo_1578',
+  'foo_1579',
+  'foo_1580',
+  'foo_1581',
+  'foo_1582',
+  'foo_1583',
+  'foo_1584',
+  'foo_1585',
+  'foo_1586',
+  'foo_1587',
+  'foo_1588',
+  'foo_1589',
+  'foo_1590',
+  'foo_1591',
+  'foo_1592',
+  'foo_1593',
+  'foo_1594',
+  'foo_1595',
+  'foo_1596',
+  'foo_1597',
+  'foo_1598',
+  'foo_1599',
+  'foo_1600',
+  'foo_1601',
+  'foo_1602',
+  'foo_1603',
+  'foo_1604',
+  'foo_1605',
+  'foo_1606',
+  'foo_1607',
+  'foo_1608',
+  'foo_1609',
+  'foo_1610',
+  'foo_1611',
+  'foo_1612',
+  'foo_1613',
+  'foo_1614',
+  'foo_1615',
+  'foo_1616',
+  'foo_1617',
+  'foo_1618',
+  'foo_1619',
+  'foo_1620',
+  'foo_1621',
+  'foo_1622',
+  'foo_1623',
+  'foo_1624',
+  'foo_1625',
+  'foo_1626',
+  'foo_1627',
+  'foo_1628',
+  'foo_1629',
+  'foo_1630',
+  'foo_1631',
+  'foo_1632',
+  'foo_1633',
+  'foo_1634',
+  'foo_1635',
+  'foo_1636',
+  'foo_1637',
+  'foo_1638',
+  'foo_1639',
+  'foo_1640',
+  'foo_1641',
+  'foo_1642',
+  'foo_1643',
+  'foo_1644',
+  'foo_1645',
+  'foo_1646',
+  'foo_1647',
+  'foo_1648',
+  'foo_1649',
+  'foo_1650',
+  'foo_1651',
+  'foo_1652',
+  'foo_1653',
+  'foo_1654',
+  'foo_1655',
+  'foo_1656',
+  'foo_1657',
+  'foo_1658',
+  'foo_1659',
+  'foo_1660',
+  'foo_1661',
+  'foo_1662',
+  'foo_1663',
+  'foo_1664',
+  'foo_1665',
+  'foo_1666',
+  'foo_1667',
+  'foo_1668',
+  'foo_1669',
+  'foo_1670',
+  'foo_1671',
+  'foo_1672',
+  'foo_1673',
+  'foo_1674',
+  'foo_1675',
+  'foo_1676',
+  'foo_1677',
+  'foo_1678',
+  'foo_1679',
+  'foo_1680',
+  'foo_1681',
+  'foo_1682',
+  'foo_1683',
+  'foo_1684',
+  'foo_1685',
+  'foo_1686',
+  'foo_1687',
+  'foo_1688',
+  'foo_1689',
+  'foo_1690',
+  'foo_1691',
+  'foo_1692',
+  'foo_1693',
+  'foo_1694',
+  'foo_1695',
+  'foo_1696',
+  'foo_1697',
+  'foo_1698',
+  'foo_1699',
+  'foo_1700',
+  'foo_1701',
+  'foo_1702',
+  'foo_1703',
+  'foo_1704',
+  'foo_1705',
+  'foo_1706',
+  'foo_1707',
+  'foo_1708',
+  'foo_1709',
+  'foo_1710',
+  'foo_1711',
+  'foo_1712',
+  'foo_1713',
+  'foo_1714',
+  'foo_1715',
+  'foo_1716',
+  'foo_1717',
+  'foo_1718',
+  'foo_1719',
+  'foo_1720',
+  'foo_1721',
+  'foo_1722',
+  'foo_1723',
+  'foo_1724',
+  'foo_1725',
+  'foo_1726',
+  'foo_1727',
+  'foo_1728',
+  'foo_1729',
+  'foo_1730',
+  'foo_1731',
+  'foo_1732',
+  'foo_1733',
+  'foo_1734',
+  'foo_1735',
+  'foo_1736',
+  'foo_1737',
+  'foo_1738',
+  'foo_1739',
+  'foo_1740',
+  'foo_1741',
+  'foo_1742',
+  'foo_1743',
+  'foo_1744',
+  'foo_1745',
+  'foo_1746',
+  'foo_1747',
+  'foo_1748',
+  'foo_1749',
+  'foo_1750',
+  'foo_1751',
+  'foo_1752',
+  'foo_1753',
+  'foo_1754',
+  'foo_1755',
+  'foo_1756',
+  'foo_1757',
+  'foo_1758',
+  'foo_1759',
+  'foo_1760',
+  'foo_1761',
+  'foo_1762',
+  'foo_1763',
+  'foo_1764',
+  'foo_1765',
+  'foo_1766',
+  'foo_1767',
+  'foo_1768',
+  'foo_1769',
+  'foo_1770',
+  'foo_1771',
+  'foo_1772',
+  'foo_1773',
+  'foo_1774',
+  'foo_1775',
+  'foo_1776',
+  'foo_1777',
+  'foo_1778',
+  'foo_1779',
+  'foo_1780',
+  'foo_1781',
+  'foo_1782',
+  'foo_1783',
+  'foo_1784',
+  'foo_1785',
+  'foo_1786',
+  'foo_1787',
+  'foo_1788',
+  'foo_1789',
+  'foo_1790',
+  'foo_1791',
+  'foo_1792',
+  'foo_1793',
+  'foo_1794',
+  'foo_1795',
+  'foo_1796',
+  'foo_1797',
+  'foo_1798',
+  'foo_1799',
+  'foo_1800',
+  'foo_1801',
+  'foo_1802',
+  'foo_1803',
+  'foo_1804',
+  'foo_1805',
+  'foo_1806',
+  'foo_1807',
+  'foo_1808',
+  'foo_1809',
+  'foo_1810',
+  'foo_1811',
+  'foo_1812',
+  'foo_1813',
+  'foo_1814',
+  'foo_1815',
+  'foo_1816',
+  'foo_1817',
+  'foo_1818',
+  'foo_1819',
+  'foo_1820',
+  'foo_1821',
+  'foo_1822',
+  'foo_1823',
+  'foo_1824',
+  'foo_1825',
+  'foo_1826',
+  'foo_1827',
+  'foo_1828',
+  'foo_1829',
+  'foo_1830',
+  'foo_1831',
+  'foo_1832',
+  'foo_1833',
+  'foo_1834',
+  'foo_1835',
+  'foo_1836',
+  'foo_1837',
+  'foo_1838',
+  'foo_1839',
+  'foo_1840',
+  'foo_1841',
+  'foo_1842',
+  'foo_1843',
+  'foo_1844',
+  'foo_1845',
+  'foo_1846',
+  'foo_1847',
+  'foo_1848',
+  'foo_1849',
+  'foo_1850',
+  'foo_1851',
+  'foo_1852',
+  'foo_1853',
+  'foo_1854',
+  'foo_1855',
+  'foo_1856',
+  'foo_1857',
+  'foo_1858',
+  'foo_1859',
+  'foo_1860',
+  'foo_1861',
+  'foo_1862',
+  'foo_1863',
+  'foo_1864',
+  'foo_1865',
+  'foo_1866',
+  'foo_1867',
+  'foo_1868',
+  'foo_1869',
+  'foo_1870',
+  'foo_1871',
+  'foo_1872',
+  'foo_1873',
+  'foo_1874',
+  'foo_1875',
+  'foo_1876',
+  'foo_1877',
+  'foo_1878',
+  'foo_1879',
+  'foo_1880',
+  'foo_1881',
+  'foo_1882',
+  'foo_1883',
+  'foo_1884',
+  'foo_1885',
+  'foo_1886',
+  'foo_1887',
+  'foo_1888',
+  'foo_1889',
+  'foo_1890',
+  'foo_1891',
+  'foo_1892',
+  'foo_1893',
+  'foo_1894',
+  'foo_1895',
+  'foo_1896',
+  'foo_1897',
+  'foo_1898',
+  'foo_1899',
+  'foo_1900',
+  'foo_1901',
+  'foo_1902',
+  'foo_1903',
+  'foo_1904',
+  'foo_1905',
+  'foo_1906',
+  'foo_1907',
+  'foo_1908',
+  'foo_1909',
+  'foo_1910',
+  'foo_1911',
+  'foo_1912',
+  'foo_1913',
+  'foo_1914',
+  'foo_1915',
+  'foo_1916',
+  'foo_1917',
+  'foo_1918',
+  'foo_1919',
+  'foo_1920',
+  'foo_1921',
+  'foo_1922',
+  'foo_1923',
+  'foo_1924',
+  'foo_1925',
+  'foo_1926',
+  'foo_1927',
+  'foo_1928',
+  'foo_1929',
+  'foo_1930',
+  'foo_1931',
+  'foo_1932',
+  'foo_1933',
+  'foo_1934',
+  'foo_1935',
+  'foo_1936',
+  'foo_1937',
+  'foo_1938',
+  'foo_1939',
+  'foo_1940',
+  'foo_1941',
+  'foo_1942',
+  'foo_1943',
+  'foo_1944',
+  'foo_1945',
+  'foo_1946',
+  'foo_1947',
+  'foo_1948',
+  'foo_1949',
+  'foo_1950',
+  'foo_1951',
+  'foo_1952',
+  'foo_1953',
+  'foo_1954',
+  'foo_1955',
+  'foo_1956',
+  'foo_1957',
+  'foo_1958',
+  'foo_1959',
+  'foo_1960',
+  'foo_1961',
+  'foo_1962',
+  'foo_1963',
+  'foo_1964',
+  'foo_1965',
+  'foo_1966',
+  'foo_1967',
+  'foo_1968',
+  'foo_1969',
+  'foo_1970',
+  'foo_1971',
+  'foo_1972',
+  'foo_1973',
+  'foo_1974',
+  'foo_1975',
+  'foo_1976',
+  'foo_1977',
+  'foo_1978',
+  'foo_1979',
+  'foo_1980',
+  'foo_1981',
+  'foo_1982',
+  'foo_1983',
+  'foo_1984',
+  'foo_1985',
+  'foo_1986',
+  'foo_1987',
+  'foo_1988',
+  'foo_1989',
+  'foo_1990',
+  'foo_1991',
+  'foo_1992',
+  'foo_1993',
+  'foo_1994',
+  'foo_1995',
+  'foo_1996',
+  'foo_1997',
+  'foo_1998',
+  'foo_1999',
+  'foo_2000',
+  'foo_2001',
+  'foo_2002',
+  'foo_2003',
+  'foo_2004',
+  'foo_2005',
+  'foo_2006',
+  'foo_2007',
+  'foo_2008',
+  'foo_2009',
+  'foo_2010',
+  'foo_2011',
+  'foo_2012',
+  'foo_2013',
+  'foo_2014',
+  'foo_2015',
+  'foo_2016',
+  'foo_2017',
+  'foo_2018',
+  'foo_2019',
+  'foo_2020',
+  'foo_2021',
+  'foo_2022',
+  'foo_2023',
+  'foo_2024',
+  'foo_2025',
+  'foo_2026',
+  'foo_2027',
+  'foo_2028',
+  'foo_2029',
+  'foo_2030',
+  'foo_2031',
+  'foo_2032',
+  'foo_2033',
+  'foo_2034',
+  'foo_2035',
+  'foo_2036',
+  'foo_2037',
+  'foo_2038',
+  'foo_2039',
+  'foo_2040',
+  'foo_2041',
+  'foo_2042',
+  'foo_2043',
+  'foo_2044',
+  'foo_2045',
+  'foo_2046',
+  'foo_2047',
+  'foo_2048',
+  'foo_2049',
+  'foo_2050',
+  'foo_2051',
+  'foo_2052',
+  'foo_2053',
+  'foo_2054',
+  'foo_2055',
+  'foo_2056',
+  'foo_2057',
+  'foo_2058',
+  'foo_2059',
+  'foo_2060',
+  'foo_2061',
+  'foo_2062',
+  'foo_2063',
+  'foo_2064',
+  'foo_2065',
+  'foo_2066',
+  'foo_2067',
+  'foo_2068',
+  'foo_2069',
+  'foo_2070',
+  'foo_2071',
+  'foo_2072',
+  'foo_2073',
+  'foo_2074',
+  'foo_2075',
+  'foo_2076',
+  'foo_2077',
+  'foo_2078',
+  'foo_2079',
+  'foo_2080',
+  'foo_2081',
+  'foo_2082',
+  'foo_2083',
+  'foo_2084',
+  'foo_2085',
+  'foo_2086',
+  'foo_2087',
+  'foo_2088',
+  'foo_2089',
+  'foo_2090',
+  'foo_2091',
+  'foo_2092',
+  'foo_2093',
+  'foo_2094',
+  'foo_2095',
+  'foo_2096',
+  'foo_2097',
+  'foo_2098',
+  'foo_2099',
+  'foo_2100',
+  'foo_2101',
+  'foo_2102',
+  'foo_2103',
+  'foo_2104',
+  'foo_2105',
+  'foo_2106',
+  'foo_2107',
+  'foo_2108',
+  'foo_2109',
+  'foo_2110',
+  'foo_2111',
+  'foo_2112',
+  'foo_2113',
+  'foo_2114',
+  'foo_2115',
+  'foo_2116',
+  'foo_2117',
+  'foo_2118',
+  'foo_2119',
+  'foo_2120',
+  'foo_2121',
+  'foo_2122',
+  'foo_2123',
+  'foo_2124',
+  'foo_2125',
+  'foo_2126',
+  'foo_2127',
+  'foo_2128',
+  'foo_2129',
+  'foo_2130',
+  'foo_2131',
+  'foo_2132',
+  'foo_2133',
+  'foo_2134',
+  'foo_2135',
+  'foo_2136',
+  'foo_2137',
+  'foo_2138',
+  'foo_2139',
+  'foo_2140',
+  'foo_2141',
+  'foo_2142',
+  'foo_2143',
+  'foo_2144',
+  'foo_2145',
+  'foo_2146',
+  'foo_2147',
+  'foo_2148',
+  'foo_2149',
+  'foo_2150',
+  'foo_2151',
+  'foo_2152',
+  'foo_2153',
+  'foo_2154',
+  'foo_2155',
+  'foo_2156',
+  'foo_2157',
+  'foo_2158',
+  'foo_2159',
+  'foo_2160',
+  'foo_2161',
+  'foo_2162',
+  'foo_2163',
+  'foo_2164',
+  'foo_2165',
+  'foo_2166',
+  'foo_2167',
+  'foo_2168',
+  'foo_2169',
+  'foo_2170',
+  'foo_2171',
+  'foo_2172',
+  'foo_2173',
+  'foo_2174',
+  'foo_2175',
+  'foo_2176',
+  'foo_2177',
+  'foo_2178',
+  'foo_2179',
+  'foo_2180',
+  'foo_2181',
+  'foo_2182',
+  'foo_2183',
+  'foo_2184',
+  'foo_2185',
+  'foo_2186',
+  'foo_2187',
+  'foo_2188',
+  'foo_2189',
+  'foo_2190',
+  'foo_2191',
+  'foo_2192',
+  'foo_2193',
+  'foo_2194',
+  'foo_2195',
+  'foo_2196',
+  'foo_2197',
+  'foo_2198',
+  'foo_2199',
+  'foo_2200',
+  'foo_2201',
+  'foo_2202',
+  'foo_2203',
+  'foo_2204',
+  'foo_2205',
+  'foo_2206',
+  'foo_2207',
+  'foo_2208',
+  'foo_2209',
+  'foo_2210',
+  'foo_2211',
+  'foo_2212',
+  'foo_2213',
+  'foo_2214',
+  'foo_2215',
+  'foo_2216',
+  'foo_2217',
+  'foo_2218',
+  'foo_2219',
+  'foo_2220',
+  'foo_2221',
+  'foo_2222',
+  'foo_2223',
+  'foo_2224',
+  'foo_2225',
+  'foo_2226',
+  'foo_2227',
+  'foo_2228',
+  'foo_2229',
+  'foo_2230',
+  'foo_2231',
+  'foo_2232',
+  'foo_2233',
+  'foo_2234',
+  'foo_2235',
+  'foo_2236',
+  'foo_2237',
+  'foo_2238',
+  'foo_2239',
+  'foo_2240',
+  'foo_2241',
+  'foo_2242',
+  'foo_2243',
+  'foo_2244',
+  'foo_2245',
+  'foo_2246',
+  'foo_2247',
+  'foo_2248',
+  'foo_2249',
+  'foo_2250',
+  'foo_2251',
+  'foo_2252',
+  'foo_2253',
+  'foo_2254',
+  'foo_2255',
+  'foo_2256',
+  'foo_2257',
+  'foo_2258',
+  'foo_2259',
+  'foo_2260',
+  'foo_2261',
+  'foo_2262',
+  'foo_2263',
+  'foo_2264',
+  'foo_2265',
+  'foo_2266',
+  'foo_2267',
+  'foo_2268',
+  'foo_2269',
+  'foo_2270',
+  'foo_2271',
+  'foo_2272',
+  'foo_2273',
+  'foo_2274',
+  'foo_2275',
+  'foo_2276',
+  'foo_2277',
+  'foo_2278',
+  'foo_2279',
+  'foo_2280',
+  'foo_2281',
+  'foo_2282',
+  'foo_2283',
+  'foo_2284',
+  'foo_2285',
+  'foo_2286',
+  'foo_2287',
+  'foo_2288',
+  'foo_2289',
+  'foo_2290',
+  'foo_2291',
+  'foo_2292',
+  'foo_2293',
+  'foo_2294',
+  'foo_2295',
+  'foo_2296',
+  'foo_2297',
+  'foo_2298',
+  'foo_2299',
+  'foo_2300',
+  'foo_2301',
+  'foo_2302',
+  'foo_2303',
+  'foo_2304',
+  'foo_2305',
+  'foo_2306',
+  'foo_2307',
+  'foo_2308',
+  'foo_2309',
+  'foo_2310',
+  'foo_2311',
+  'foo_2312',
+  'foo_2313',
+  'foo_2314',
+  'foo_2315',
+  'foo_2316',
+  'foo_2317',
+  'foo_2318',
+  'foo_2319',
+  'foo_2320',
+  'foo_2321',
+  'foo_2322',
+  'foo_2323',
+  'foo_2324',
+  'foo_2325',
+  'foo_2326',
+  'foo_2327',
+  'foo_2328',
+  'foo_2329',
+  'foo_2330',
+  'foo_2331',
+  'foo_2332',
+  'foo_2333',
+  'foo_2334',
+  'foo_2335',
+  'foo_2336',
+  'foo_2337',
+  'foo_2338',
+  'foo_2339',
+  'foo_2340',
+  'foo_2341',
+  'foo_2342',
+  'foo_2343',
+  'foo_2344',
+  'foo_2345',
+  'foo_2346',
+  'foo_2347',
+  'foo_2348',
+  'foo_2349',
+  'foo_2350',
+  'foo_2351',
+  'foo_2352',
+  'foo_2353',
+  'foo_2354',
+  'foo_2355',
+  'foo_2356',
+  'foo_2357',
+  'foo_2358',
+  'foo_2359',
+  'foo_2360',
+  'foo_2361',
+  'foo_2362',
+  'foo_2363',
+  'foo_2364',
+  'foo_2365',
+  'foo_2366',
+  'foo_2367',
+  'foo_2368',
+  'foo_2369',
+  'foo_2370',
+  'foo_2371',
+  'foo_2372',
+  'foo_2373',
+  'foo_2374',
+  'foo_2375',
+  'foo_2376',
+  'foo_2377',
+  'foo_2378',
+  'foo_2379',
+  'foo_2380',
+  'foo_2381',
+  'foo_2382',
+  'foo_2383',
+  'foo_2384',
+  'foo_2385',
+  'foo_2386',
+  'foo_2387',
+  'foo_2388',
+  'foo_2389',
+  'foo_2390',
+  'foo_2391',
+  'foo_2392',
+  'foo_2393',
+  'foo_2394',
+  'foo_2395',
+  'foo_2396',
+  'foo_2397',
+  'foo_2398',
+  'foo_2399',
+  'foo_2400',
+  'foo_2401',
+  'foo_2402',
+  'foo_2403',
+  'foo_2404',
+  'foo_2405',
+  'foo_2406',
+  'foo_2407',
+  'foo_2408',
+  'foo_2409',
+  'foo_2410',
+  'foo_2411',
+  'foo_2412',
+  'foo_2413',
+  'foo_2414',
+  'foo_2415',
+  'foo_2416',
+  'foo_2417',
+  'foo_2418',
+  'foo_2419',
+  'foo_2420',
+  'foo_2421',
+  'foo_2422',
+  'foo_2423',
+  'foo_2424',
+  'foo_2425',
+  'foo_2426',
+  'foo_2427',
+  'foo_2428',
+  'foo_2429',
+  'foo_2430',
+  'foo_2431',
+  'foo_2432',
+  'foo_2433',
+  'foo_2434',
+  'foo_2435',
+  'foo_2436',
+  'foo_2437',
+  'foo_2438',
+  'foo_2439',
+  'foo_2440',
+  'foo_2441',
+  'foo_2442',
+  'foo_2443',
+  'foo_2444',
+  'foo_2445',
+  'foo_2446',
+  'foo_2447',
+  'foo_2448',
+  'foo_2449',
+  'foo_2450',
+  'foo_2451',
+  'foo_2452',
+  'foo_2453',
+  'foo_2454',
+  'foo_2455',
+  'foo_2456',
+  'foo_2457',
+  'foo_2458',
+  'foo_2459',
+  'foo_2460',
+  'foo_2461',
+  'foo_2462',
+  'foo_2463',
+  'foo_2464',
+  'foo_2465',
+  'foo_2466',
+  'foo_2467',
+  'foo_2468',
+  'foo_2469',
+  'foo_2470',
+  'foo_2471',
+  'foo_2472',
+  'foo_2473',
+  'foo_2474',
+  'foo_2475',
+  'foo_2476',
+  'foo_2477',
+  'foo_2478',
+  'foo_2479',
+  'foo_2480',
+  'foo_2481',
+  'foo_2482',
+  'foo_2483',
+  'foo_2484',
+  'foo_2485',
+  'foo_2486',
+  'foo_2487',
+  'foo_2488',
+  'foo_2489',
+  'foo_2490',
+  'foo_2491',
+  'foo_2492',
+  'foo_2493',
+  'foo_2494',
+  'foo_2495',
+  'foo_2496',
+  'foo_2497',
+  'foo_2498',
+  'foo_2499',
+  'foo_2500',
+  'foo_2501',
+  'foo_2502',
+  'foo_2503',
+  'foo_2504',
+  'foo_2505',
+  'foo_2506',
+  'foo_2507',
+  'foo_2508',
+  'foo_2509',
+  'foo_2510',
+  'foo_2511',
+  'foo_2512',
+  'foo_2513',
+  'foo_2514',
+  'foo_2515',
+  'foo_2516',
+  'foo_2517',
+  'foo_2518',
+  'foo_2519',
+  'foo_2520',
+  'foo_2521',
+  'foo_2522',
+  'foo_2523',
+  'foo_2524',
+  'foo_2525',
+  'foo_2526',
+  'foo_2527',
+  'foo_2528',
+  'foo_2529',
+  'foo_2530',
+  'foo_2531',
+  'foo_2532',
+  'foo_2533',
+  'foo_2534',
+  'foo_2535',
+  'foo_2536',
+  'foo_2537',
+  'foo_2538',
+  'foo_2539',
+  'foo_2540',
+  'foo_2541',
+  'foo_2542',
+  'foo_2543',
+  'foo_2544',
+  'foo_2545',
+  'foo_2546',
+  'foo_2547',
+  'foo_2548',
+  'foo_2549',
+  'foo_2550',
+  'foo_2551',
+  'foo_2552',
+  'foo_2553',
+  'foo_2554',
+  'foo_2555',
+  'foo_2556',
+  'foo_2557',
+  'foo_2558',
+  'foo_2559',
+  'foo_2560',
+  'foo_2561',
+  'foo_2562',
+  'foo_2563',
+  'foo_2564',
+  'foo_2565',
+  'foo_2566',
+  'foo_2567',
+  'foo_2568',
+  'foo_2569',
+  'foo_2570',
+  'foo_2571',
+  'foo_2572',
+  'foo_2573',
+  'foo_2574',
+  'foo_2575',
+  'foo_2576',
+  'foo_2577',
+  'foo_2578',
+  'foo_2579',
+  'foo_2580',
+  'foo_2581',
+  'foo_2582',
+  'foo_2583',
+  'foo_2584',
+  'foo_2585',
+  'foo_2586',
+  'foo_2587',
+  'foo_2588',
+  'foo_2589',
+  'foo_2590',
+  'foo_2591',
+  'foo_2592',
+  'foo_2593',
+  'foo_2594',
+  'foo_2595',
+  'foo_2596',
+  'foo_2597',
+  'foo_2598',
+  'foo_2599',
+  'foo_2600',
+  'foo_2601',
+  'foo_2602',
+  'foo_2603',
+  'foo_2604',
+  'foo_2605',
+  'foo_2606',
+  'foo_2607',
+  'foo_2608',
+  'foo_2609',
+  'foo_2610',
+  'foo_2611',
+  'foo_2612',
+  'foo_2613',
+  'foo_2614',
+  'foo_2615',
+  'foo_2616',
+  'foo_2617',
+  'foo_2618',
+  'foo_2619',
+  'foo_2620',
+  'foo_2621',
+  'foo_2622',
+  'foo_2623',
+  'foo_2624',
+  'foo_2625',
+  'foo_2626',
+  'foo_2627',
+  'foo_2628',
+  'foo_2629',
+  'foo_2630',
+  'foo_2631',
+  'foo_2632',
+  'foo_2633',
+  'foo_2634',
+  'foo_2635',
+  'foo_2636',
+  'foo_2637',
+  'foo_2638',
+  'foo_2639',
+  'foo_2640',
+  'foo_2641',
+  'foo_2642',
+  'foo_2643',
+  'foo_2644',
+  'foo_2645',
+  'foo_2646',
+  'foo_2647',
+  'foo_2648',
+  'foo_2649',
+  'foo_2650',
+  'foo_2651',
+  'foo_2652',
+  'foo_2653',
+  'foo_2654',
+  'foo_2655',
+  'foo_2656',
+  'foo_2657',
+  'foo_2658',
+  'foo_2659',
+  'foo_2660',
+  'foo_2661',
+  'foo_2662',
+  'foo_2663',
+  'foo_2664',
+  'foo_2665',
+  'foo_2666',
+  'foo_2667',
+  'foo_2668',
+  'foo_2669',
+  'foo_2670',
+  'foo_2671',
+  'foo_2672',
+  'foo_2673',
+  'foo_2674',
+  'foo_2675',
+  'foo_2676',
+  'foo_2677',
+  'foo_2678',
+  'foo_2679',
+  'foo_2680',
+  'foo_2681',
+  'foo_2682',
+  'foo_2683',
+  'foo_2684',
+  'foo_2685',
+  'foo_2686',
+  'foo_2687',
+  'foo_2688',
+  'foo_2689',
+  'foo_2690',
+  'foo_2691',
+  'foo_2692',
+  'foo_2693',
+  'foo_2694',
+  'foo_2695',
+  'foo_2696',
+  'foo_2697',
+  'foo_2698',
+  'foo_2699',
+  'foo_2700',
+  'foo_2701',
+  'foo_2702',
+  'foo_2703',
+  'foo_2704',
+  'foo_2705',
+  'foo_2706',
+  'foo_2707',
+  'foo_2708',
+  'foo_2709',
+  'foo_2710',
+  'foo_2711',
+  'foo_2712',
+  'foo_2713',
+  'foo_2714',
+  'foo_2715',
+  'foo_2716',
+  'foo_2717',
+  'foo_2718',
+  'foo_2719',
+  'foo_2720',
+  'foo_2721',
+  'foo_2722',
+  'foo_2723',
+  'foo_2724',
+  'foo_2725',
+  'foo_2726',
+  'foo_2727',
+  'foo_2728',
+  'foo_2729',
+  'foo_2730',
+  'foo_2731',
+  'foo_2732',
+  'foo_2733',
+  'foo_2734',
+  'foo_2735',
+  'foo_2736',
+  'foo_2737',
+  'foo_2738',
+  'foo_2739',
+  'foo_2740',
+  'foo_2741',
+  'foo_2742',
+  'foo_2743',
+  'foo_2744',
+  'foo_2745',
+  'foo_2746',
+  'foo_2747',
+  'foo_2748',
+  'foo_2749',
+  'foo_2750',
+  'foo_2751',
+  'foo_2752',
+  'foo_2753',
+  'foo_2754',
+  'foo_2755',
+  'foo_2756',
+  'foo_2757',
+  'foo_2758',
+  'foo_2759',
+  'foo_2760',
+  'foo_2761',
+  'foo_2762',
+  'foo_2763',
+  'foo_2764',
+  'foo_2765',
+  'foo_2766',
+  'foo_2767',
+  'foo_2768',
+  'foo_2769',
+  'foo_2770',
+  'foo_2771',
+  'foo_2772',
+  'foo_2773',
+  'foo_2774',
+  'foo_2775',
+  'foo_2776',
+  'foo_2777',
+  'foo_2778',
+  'foo_2779',
+  'foo_2780',
+  'foo_2781',
+  'foo_2782',
+  'foo_2783',
+  'foo_2784',
+  'foo_2785',
+  'foo_2786',
+  'foo_2787',
+  'foo_2788',
+  'foo_2789',
+  'foo_2790',
+  'foo_2791',
+  'foo_2792',
+  'foo_2793',
+  'foo_2794',
+  'foo_2795',
+  'foo_2796',
+  'foo_2797',
+  'foo_2798',
+  'foo_2799',
+  'foo_2800',
+  'foo_2801',
+  'foo_2802',
+  'foo_2803',
+  'foo_2804',
+  'foo_2805',
+  'foo_2806',
+  'foo_2807',
+  'foo_2808',
+  'foo_2809',
+  'foo_2810',
+  'foo_2811',
+  'foo_2812',
+  'foo_2813',
+  'foo_2814',
+  'foo_2815',
+  'foo_2816',
+  'foo_2817',
+  'foo_2818',
+  'foo_2819',
+  'foo_2820',
+  'foo_2821',
+  'foo_2822',
+  'foo_2823',
+  'foo_2824',
+  'foo_2825',
+  'foo_2826',
+  'foo_2827',
+  'foo_2828',
+  'foo_2829',
+  'foo_2830',
+  'foo_2831',
+  'foo_2832',
+  'foo_2833',
+  'foo_2834',
+  'foo_2835',
+  'foo_2836',
+  'foo_2837',
+  'foo_2838',
+  'foo_2839',
+  'foo_2840',
+  'foo_2841',
+  'foo_2842',
+  'foo_2843',
+  'foo_2844',
+  'foo_2845',
+  'foo_2846',
+  'foo_2847',
+  'foo_2848',
+  'foo_2849',
+  'foo_2850',
+  'foo_2851',
+  'foo_2852',
+  'foo_2853',
+  'foo_2854',
+  'foo_2855',
+  'foo_2856',
+  'foo_2857',
+  'foo_2858',
+  'foo_2859',
+  'foo_2860',
+  'foo_2861',
+  'foo_2862',
+  'foo_2863',
+  'foo_2864',
+  'foo_2865',
+  'foo_2866',
+  'foo_2867',
+  'foo_2868',
+  'foo_2869',
+  'foo_2870',
+  'foo_2871',
+  'foo_2872',
+  'foo_2873',
+  'foo_2874',
+  'foo_2875',
+  'foo_2876',
+  'foo_2877',
+  'foo_2878',
+  'foo_2879',
+  'foo_2880',
+  'foo_2881',
+  'foo_2882',
+  'foo_2883',
+  'foo_2884',
+  'foo_2885',
+  'foo_2886',
+  'foo_2887',
+  'foo_2888',
+  'foo_2889',
+  'foo_2890',
+  'foo_2891',
+  'foo_2892',
+  'foo_2893',
+  'foo_2894',
+  'foo_2895',
+  'foo_2896',
+  'foo_2897',
+  'foo_2898',
+  'foo_2899',
+  'foo_2900',
+  'foo_2901',
+  'foo_2902',
+  'foo_2903',
+  'foo_2904',
+  'foo_2905',
+  'foo_2906',
+  'foo_2907',
+  'foo_2908',
+  'foo_2909',
+  'foo_2910',
+  'foo_2911',
+  'foo_2912',
+  'foo_2913',
+  'foo_2914',
+  'foo_2915',
+  'foo_2916',
+  'foo_2917',
+  'foo_2918',
+  'foo_2919',
+  'foo_2920',
+  'foo_2921',
+  'foo_2922',
+  'foo_2923',
+  'foo_2924',
+  'foo_2925',
+  'foo_2926',
+  'foo_2927',
+  'foo_2928',
+  'foo_2929',
+  'foo_2930',
+  'foo_2931',
+  'foo_2932',
+  'foo_2933',
+  'foo_2934',
+  'foo_2935',
+  'foo_2936',
+  'foo_2937',
+  'foo_2938',
+  'foo_2939',
+  'foo_2940',
+  'foo_2941',
+  'foo_2942',
+  'foo_2943',
+  'foo_2944',
+  'foo_2945',
+  'foo_2946',
+  'foo_2947',
+  'foo_2948',
+  'foo_2949',
+  'foo_2950',
+  'foo_2951',
+  'foo_2952',
+  'foo_2953',
+  'foo_2954',
+  'foo_2955',
+  'foo_2956',
+  'foo_2957',
+  'foo_2958',
+  'foo_2959',
+  'foo_2960',
+  'foo_2961',
+  'foo_2962',
+  'foo_2963',
+  'foo_2964',
+  'foo_2965',
+  'foo_2966',
+  'foo_2967',
+  'foo_2968',
+  'foo_2969',
+  'foo_2970',
+  'foo_2971',
+  'foo_2972',
+  'foo_2973',
+  'foo_2974',
+  'foo_2975',
+  'foo_2976',
+  'foo_2977',
+  'foo_2978',
+  'foo_2979',
+  'foo_2980',
+  'foo_2981',
+  'foo_2982',
+  'foo_2983',
+  'foo_2984',
+  'foo_2985',
+  'foo_2986',
+  'foo_2987',
+  'foo_2988',
+  'foo_2989',
+  'foo_2990',
+  'foo_2991',
+  'foo_2992',
+  'foo_2993',
+  'foo_2994',
+  'foo_2995',
+  'foo_2996',
+  'foo_2997',
+  'foo_2998',
+  'foo_2999',
+  'foo_3000',
+  'foo_3001',
+  'foo_3002',
+  'foo_3003',
+  'foo_3004',
+  'foo_3005',
+  'foo_3006',
+  'foo_3007',
+  'foo_3008',
+  'foo_3009',
+  'foo_3010',
+  'foo_3011',
+  'foo_3012',
+  'foo_3013',
+  'foo_3014',
+  'foo_3015',
+  'foo_3016',
+  'foo_3017',
+  'foo_3018',
+  'foo_3019',
+  'foo_3020',
+  'foo_3021',
+  'foo_3022',
+  'foo_3023',
+  'foo_3024',
+  'foo_3025',
+  'foo_3026',
+  'foo_3027',
+  'foo_3028',
+  'foo_3029',
+  'foo_3030',
+  'foo_3031',
+  'foo_3032',
+  'foo_3033',
+  'foo_3034',
+  'foo_3035',
+  'foo_3036',
+  'foo_3037',
+  'foo_3038',
+  'foo_3039',
+  'foo_3040',
+  'foo_3041',
+  'foo_3042',
+  'foo_3043',
+  'foo_3044',
+  'foo_3045',
+  'foo_3046',
+  'foo_3047',
+  'foo_3048',
+  'foo_3049',
+  'foo_3050',
+  'foo_3051',
+  'foo_3052',
+  'foo_3053',
+  'foo_3054',
+  'foo_3055',
+  'foo_3056',
+  'foo_3057',
+  'foo_3058',
+  'foo_3059',
+  'foo_3060',
+  'foo_3061',
+  'foo_3062',
+  'foo_3063',
+  'foo_3064',
+  'foo_3065',
+  'foo_3066',
+  'foo_3067',
+  'foo_3068',
+  'foo_3069',
+  'foo_3070',
+  'foo_3071',
+  'foo_3072',
+  'foo_3073',
+  'foo_3074',
+  'foo_3075',
+  'foo_3076',
+  'foo_3077',
+  'foo_3078',
+  'foo_3079',
+  'foo_3080',
+  'foo_3081',
+  'foo_3082',
+  'foo_3083',
+  'foo_3084',
+  'foo_3085',
+  'foo_3086',
+  'foo_3087',
+  'foo_3088',
+  'foo_3089',
+  'foo_3090',
+  'foo_3091',
+  'foo_3092',
+  'foo_3093',
+  'foo_3094',
+  'foo_3095',
+  'foo_3096',
+  'foo_3097',
+  'foo_3098',
+  'foo_3099',
+  'foo_3100',
+  'foo_3101',
+  'foo_3102',
+  'foo_3103',
+  'foo_3104',
+  'foo_3105',
+  'foo_3106',
+  'foo_3107',
+  'foo_3108',
+  'foo_3109',
+  'foo_3110',
+  'foo_3111',
+  'foo_3112',
+  'foo_3113',
+  'foo_3114',
+  'foo_3115',
+  'foo_3116',
+  'foo_3117',
+  'foo_3118',
+  'foo_3119',
+  'foo_3120',
+  'foo_3121',
+  'foo_3122',
+  'foo_3123',
+  'foo_3124',
+  'foo_3125',
+  'foo_3126',
+  'foo_3127',
+  'foo_3128',
+  'foo_3129',
+  'foo_3130',
+  'foo_3131',
+  'foo_3132',
+  'foo_3133',
+  'foo_3134',
+  'foo_3135',
+  'foo_3136',
+  'foo_3137',
+  'foo_3138',
+  'foo_3139',
+  'foo_3140',
+  'foo_3141',
+  'foo_3142',
+  'foo_3143',
+  'foo_3144',
+  'foo_3145',
+  'foo_3146',
+  'foo_3147',
+  'foo_3148',
+  'foo_3149',
+  'foo_3150',
+  'foo_3151',
+  'foo_3152',
+  'foo_3153',
+  'foo_3154',
+  'foo_3155',
+  'foo_3156',
+  'foo_3157',
+  'foo_3158',
+  'foo_3159',
+  'foo_3160',
+  'foo_3161',
+  'foo_3162',
+  'foo_3163',
+  'foo_3164',
+  'foo_3165',
+  'foo_3166',
+  'foo_3167',
+  'foo_3168',
+  'foo_3169',
+  'foo_3170',
+  'foo_3171',
+  'foo_3172',
+  'foo_3173',
+  'foo_3174',
+  'foo_3175',
+  'foo_3176',
+  'foo_3177',
+  'foo_3178',
+  'foo_3179',
+  'foo_3180',
+  'foo_3181',
+  'foo_3182',
+  'foo_3183',
+  'foo_3184',
+  'foo_3185',
+  'foo_3186',
+  'foo_3187',
+  'foo_3188',
+  'foo_3189',
+  'foo_3190',
+  'foo_3191',
+  'foo_3192',
+  'foo_3193',
+  'foo_3194',
+  'foo_3195',
+  'foo_3196',
+  'foo_3197',
+  'foo_3198',
+  'foo_3199',
+  'foo_3200',
+  'foo_3201',
+  'foo_3202',
+  'foo_3203',
+  'foo_3204',
+  'foo_3205',
+  'foo_3206',
+  'foo_3207',
+  'foo_3208',
+  'foo_3209',
+  'foo_3210',
+  'foo_3211',
+  'foo_3212',
+  'foo_3213',
+  'foo_3214',
+  'foo_3215',
+  'foo_3216',
+  'foo_3217',
+  'foo_3218',
+  'foo_3219',
+  'foo_3220',
+  'foo_3221',
+  'foo_3222',
+  'foo_3223',
+  'foo_3224',
+  'foo_3225',
+  'foo_3226',
+  'foo_3227',
+  'foo_3228',
+  'foo_3229',
+  'foo_3230',
+  'foo_3231',
+  'foo_3232',
+  'foo_3233',
+  'foo_3234',
+  'foo_3235',
+  'foo_3236',
+  'foo_3237',
+  'foo_3238',
+  'foo_3239',
+  'foo_3240',
+  'foo_3241',
+  'foo_3242',
+  'foo_3243',
+  'foo_3244',
+  'foo_3245',
+  'foo_3246',
+  'foo_3247',
+  'foo_3248',
+  'foo_3249',
+  'foo_3250',
+  'foo_3251',
+  'foo_3252',
+  'foo_3253',
+  'foo_3254',
+  'foo_3255',
+  'foo_3256',
+  'foo_3257',
+  'foo_3258',
+  'foo_3259',
+  'foo_3260',
+  'foo_3261',
+  'foo_3262',
+  'foo_3263',
+  'foo_3264',
+  'foo_3265',
+  'foo_3266',
+  'foo_3267',
+  'foo_3268',
+  'foo_3269',
+  'foo_3270',
+  'foo_3271',
+  'foo_3272',
+  'foo_3273',
+  'foo_3274',
+  'foo_3275',
+  'foo_3276',
+  'foo_3277',
+  'foo_3278',
+  'foo_3279',
+  'foo_3280',
+  'foo_3281',
+  'foo_3282',
+  'foo_3283',
+  'foo_3284',
+  'foo_3285',
+  'foo_3286',
+  'foo_3287',
+  'foo_3288',
+  'foo_3289',
+  'foo_3290',
+  'foo_3291',
+  'foo_3292',
+  'foo_3293',
+  'foo_3294',
+  'foo_3295',
+  'foo_3296',
+  'foo_3297',
+  'foo_3298',
+  'foo_3299',
+  'foo_3300',
+  'foo_3301',
+  'foo_3302',
+  'foo_3303',
+  'foo_3304',
+  'foo_3305',
+  'foo_3306',
+  'foo_3307',
+  'foo_3308',
+  'foo_3309',
+  'foo_3310',
+  'foo_3311',
+  'foo_3312',
+  'foo_3313',
+  'foo_3314',
+  'foo_3315',
+  'foo_3316',
+  'foo_3317',
+  'foo_3318',
+  'foo_3319',
+  'foo_3320',
+  'foo_3321',
+  'foo_3322',
+  'foo_3323',
+  'foo_3324',
+  'foo_3325',
+  'foo_3326',
+  'foo_3327',
+  'foo_3328',
+  'foo_3329',
+  'foo_3330',
+  'foo_3331',
+  'foo_3332',
+  'foo_3333',
+  'foo_3334',
+  'foo_3335',
+  'foo_3336',
+  'foo_3337',
+  'foo_3338',
+  'foo_3339',
+  'foo_3340',
+  'foo_3341',
+  'foo_3342',
+  'foo_3343',
+  'foo_3344',
+  'foo_3345',
+  'foo_3346',
+  'foo_3347',
+  'foo_3348',
+  'foo_3349',
+  'foo_3350',
+  'foo_3351',
+  'foo_3352',
+  'foo_3353',
+  'foo_3354',
+  'foo_3355',
+  'foo_3356',
+  'foo_3357',
+  'foo_3358',
+  'foo_3359',
+  'foo_3360',
+  'foo_3361',
+  'foo_3362',
+  'foo_3363',
+  'foo_3364',
+  'foo_3365',
+  'foo_3366',
+  'foo_3367',
+  'foo_3368',
+  'foo_3369',
+  'foo_3370',
+  'foo_3371',
+  'foo_3372',
+  'foo_3373',
+  'foo_3374',
+  'foo_3375',
+  'foo_3376',
+  'foo_3377',
+  'foo_3378',
+  'foo_3379',
+  'foo_3380',
+  'foo_3381',
+  'foo_3382',
+  'foo_3383',
+  'foo_3384',
+  'foo_3385',
+  'foo_3386',
+  'foo_3387',
+  'foo_3388',
+  'foo_3389',
+  'foo_3390',
+  'foo_3391',
+  'foo_3392',
+  'foo_3393',
+  'foo_3394',
+  'foo_3395',
+  'foo_3396',
+  'foo_3397',
+  'foo_3398',
+  'foo_3399',
+  'foo_3400',
+  'foo_3401',
+  'foo_3402',
+  'foo_3403',
+  'foo_3404',
+  'foo_3405',
+  'foo_3406',
+  'foo_3407',
+  'foo_3408',
+  'foo_3409',
+  'foo_3410',
+  'foo_3411',
+  'foo_3412',
+  'foo_3413',
+  'foo_3414',
+  'foo_3415',
+  'foo_3416',
+  'foo_3417',
+  'foo_3418',
+  'foo_3419',
+  'foo_3420',
+  'foo_3421',
+  'foo_3422',
+  'foo_3423',
+  'foo_3424',
+  'foo_3425',
+  'foo_3426',
+  'foo_3427',
+  'foo_3428',
+  'foo_3429',
+  'foo_3430',
+  'foo_3431',
+  'foo_3432',
+  'foo_3433',
+  'foo_3434',
+  'foo_3435',
+  'foo_3436',
+  'foo_3437',
+  'foo_3438',
+  'foo_3439',
+  'foo_3440',
+  'foo_3441',
+  'foo_3442',
+  'foo_3443',
+  'foo_3444',
+  'foo_3445',
+  'foo_3446',
+  'foo_3447',
+  'foo_3448',
+  'foo_3449',
+  'foo_3450',
+  'foo_3451',
+  'foo_3452',
+  'foo_3453',
+  'foo_3454',
+  'foo_3455',
+  'foo_3456',
+  'foo_3457',
+  'foo_3458',
+  'foo_3459',
+  'foo_3460',
+  'foo_3461',
+  'foo_3462',
+  'foo_3463',
+  'foo_3464',
+  'foo_3465',
+  'foo_3466',
+  'foo_3467',
+  'foo_3468',
+  'foo_3469',
+  'foo_3470',
+  'foo_3471',
+  'foo_3472',
+  'foo_3473',
+  'foo_3474',
+  'foo_3475',
+  'foo_3476',
+  'foo_3477',
+  'foo_3478',
+  'foo_3479',
+  'foo_3480',
+  'foo_3481',
+  'foo_3482',
+  'foo_3483',
+  'foo_3484',
+  'foo_3485',
+  'foo_3486',
+  'foo_3487',
+  'foo_3488',
+  'foo_3489',
+  'foo_3490',
+  'foo_3491',
+  'foo_3492',
+  'foo_3493',
+  'foo_3494',
+  'foo_3495',
+  'foo_3496',
+  'foo_3497',
+  'foo_3498',
+  'foo_3499',
+  'foo_3500',
+  'foo_3501',
+  'foo_3502',
+  'foo_3503',
+  'foo_3504',
+  'foo_3505',
+  'foo_3506',
+  'foo_3507',
+  'foo_3508',
+  'foo_3509',
+  'foo_3510',
+  'foo_3511',
+  'foo_3512',
+  'foo_3513',
+  'foo_3514',
+  'foo_3515',
+  'foo_3516',
+  'foo_3517',
+  'foo_3518',
+  'foo_3519',
+  'foo_3520',
+  'foo_3521',
+  'foo_3522',
+  'foo_3523',
+  'foo_3524',
+  'foo_3525',
+  'foo_3526',
+  'foo_3527',
+  'foo_3528',
+  'foo_3529',
+  'foo_3530',
+  'foo_3531',
+  'foo_3532',
+  'foo_3533',
+  'foo_3534',
+  'foo_3535',
+  'foo_3536',
+  'foo_3537',
+  'foo_3538',
+  'foo_3539',
+  'foo_3540',
+  'foo_3541',
+  'foo_3542',
+  'foo_3543',
+  'foo_3544',
+  'foo_3545',
+  'foo_3546',
+  'foo_3547',
+  'foo_3548',
+  'foo_3549',
+  'foo_3550',
+  'foo_3551',
+  'foo_3552',
+  'foo_3553',
+  'foo_3554',
+  'foo_3555',
+  'foo_3556',
+  'foo_3557',
+  'foo_3558',
+  'foo_3559',
+  'foo_3560',
+  'foo_3561',
+  'foo_3562',
+  'foo_3563',
+  'foo_3564',
+  'foo_3565',
+  'foo_3566',
+  'foo_3567',
+  'foo_3568',
+  'foo_3569',
+  'foo_3570',
+  'foo_3571',
+  'foo_3572',
+  'foo_3573',
+  'foo_3574',
+  'foo_3575',
+  'foo_3576',
+  'foo_3577',
+  'foo_3578',
+  'foo_3579',
+  'foo_3580',
+  'foo_3581',
+  'foo_3582',
+  'foo_3583',
+  'foo_3584',
+  'foo_3585',
+  'foo_3586',
+  'foo_3587',
+  'foo_3588',
+  'foo_3589',
+  'foo_3590',
+  'foo_3591',
+  'foo_3592',
+  'foo_3593',
+  'foo_3594',
+  'foo_3595',
+  'foo_3596',
+  'foo_3597',
+  'foo_3598',
+  'foo_3599',
+  'foo_3600',
+  'foo_3601',
+  'foo_3602',
+  'foo_3603',
+  'foo_3604',
+  'foo_3605',
+  'foo_3606',
+  'foo_3607',
+  'foo_3608',
+  'foo_3609',
+  'foo_3610',
+  'foo_3611',
+  'foo_3612',
+  'foo_3613',
+  'foo_3614',
+  'foo_3615',
+  'foo_3616',
+  'foo_3617',
+  'foo_3618',
+  'foo_3619',
+  'foo_3620',
+  'foo_3621',
+  'foo_3622',
+  'foo_3623',
+  'foo_3624',
+  'foo_3625',
+  'foo_3626',
+  'foo_3627',
+  'foo_3628',
+  'foo_3629',
+  'foo_3630',
+  'foo_3631',
+  'foo_3632',
+  'foo_3633',
+  'foo_3634',
+  'foo_3635',
+  'foo_3636',
+  'foo_3637',
+  'foo_3638',
+  'foo_3639',
+  'foo_3640',
+  'foo_3641',
+  'foo_3642',
+  'foo_3643',
+  'foo_3644',
+  'foo_3645',
+  'foo_3646',
+  'foo_3647',
+  'foo_3648',
+  'foo_3649',
+  'foo_3650',
+  'foo_3651',
+  'foo_3652',
+  'foo_3653',
+  'foo_3654',
+  'foo_3655',
+  'foo_3656',
+  'foo_3657',
+  'foo_3658',
+  'foo_3659',
+  'foo_3660',
+  'foo_3661',
+  'foo_3662',
+  'foo_3663',
+  'foo_3664',
+  'foo_3665',
+  'foo_3666',
+  'foo_3667',
+  'foo_3668',
+  'foo_3669',
+  'foo_3670',
+  'foo_3671',
+  'foo_3672',
+  'foo_3673',
+  'foo_3674',
+  'foo_3675',
+  'foo_3676',
+  'foo_3677',
+  'foo_3678',
+  'foo_3679',
+  'foo_3680',
+  'foo_3681',
+  'foo_3682',
+  'foo_3683',
+  'foo_3684',
+  'foo_3685',
+  'foo_3686',
+  'foo_3687',
+  'foo_3688',
+  'foo_3689',
+  'foo_3690',
+  'foo_3691',
+  'foo_3692',
+  'foo_3693',
+  'foo_3694',
+  'foo_3695',
+  'foo_3696',
+  'foo_3697',
+  'foo_3698',
+  'foo_3699',
+  'foo_3700',
+  'foo_3701',
+  'foo_3702',
+  'foo_3703',
+  'foo_3704',
+  'foo_3705',
+  'foo_3706',
+  'foo_3707',
+  'foo_3708',
+  'foo_3709',
+  'foo_3710',
+  'foo_3711',
+  'foo_3712',
+  'foo_3713',
+  'foo_3714',
+  'foo_3715',
+  'foo_3716',
+  'foo_3717',
+  'foo_3718',
+  'foo_3719',
+  'foo_3720',
+  'foo_3721',
+  'foo_3722',
+  'foo_3723',
+  'foo_3724',
+  'foo_3725',
+  'foo_3726',
+  'foo_3727',
+  'foo_3728',
+  'foo_3729',
+  'foo_3730',
+  'foo_3731',
+  'foo_3732',
+  'foo_3733',
+  'foo_3734',
+  'foo_3735',
+  'foo_3736',
+  'foo_3737',
+  'foo_3738',
+  'foo_3739',
+  'foo_3740',
+  'foo_3741',
+  'foo_3742',
+  'foo_3743',
+  'foo_3744',
+  'foo_3745',
+  'foo_3746',
+  'foo_3747',
+  'foo_3748',
+  'foo_3749',
+  'foo_3750',
+  'foo_3751',
+  'foo_3752',
+  'foo_3753',
+  'foo_3754',
+  'foo_3755',
+  'foo_3756',
+  'foo_3757',
+  'foo_3758',
+  'foo_3759',
+  'foo_3760',
+  'foo_3761',
+  'foo_3762',
+  'foo_3763',
+  'foo_3764',
+  'foo_3765',
+  'foo_3766',
+  'foo_3767',
+  'foo_3768',
+  'foo_3769',
+  'foo_3770',
+  'foo_3771',
+  'foo_3772',
+  'foo_3773',
+  'foo_3774',
+  'foo_3775',
+  'foo_3776',
+  'foo_3777',
+  'foo_3778',
+  'foo_3779',
+  'foo_3780',
+  'foo_3781',
+  'foo_3782',
+  'foo_3783',
+  'foo_3784',
+  'foo_3785',
+  'foo_3786',
+  'foo_3787',
+  'foo_3788',
+  'foo_3789',
+  'foo_3790',
+  'foo_3791',
+  'foo_3792',
+  'foo_3793',
+  'foo_3794',
+  'foo_3795',
+  'foo_3796',
+  'foo_3797',
+  'foo_3798',
+  'foo_3799',
+  'foo_3800',
+  'foo_3801',
+  'foo_3802',
+  'foo_3803',
+  'foo_3804',
+  'foo_3805',
+  'foo_3806',
+  'foo_3807',
+  'foo_3808',
+  'foo_3809',
+  'foo_3810',
+  'foo_3811',
+  'foo_3812',
+  'foo_3813',
+  'foo_3814',
+  'foo_3815',
+  'foo_3816',
+  'foo_3817',
+  'foo_3818',
+  'foo_3819',
+  'foo_3820',
+  'foo_3821',
+  'foo_3822',
+  'foo_3823',
+  'foo_3824',
+  'foo_3825',
+  'foo_3826',
+  'foo_3827',
+  'foo_3828',
+  'foo_3829',
+  'foo_3830',
+  'foo_3831',
+  'foo_3832',
+  'foo_3833',
+  'foo_3834',
+  'foo_3835',
+  'foo_3836',
+  'foo_3837',
+  'foo_3838',
+  'foo_3839',
+  'foo_3840',
+  'foo_3841',
+  'foo_3842',
+  'foo_3843',
+  'foo_3844',
+  'foo_3845',
+  'foo_3846',
+  'foo_3847',
+  'foo_3848',
+  'foo_3849',
+  'foo_3850',
+  'foo_3851',
+  'foo_3852',
+  'foo_3853',
+  'foo_3854',
+  'foo_3855',
+  'foo_3856',
+  'foo_3857',
+  'foo_3858',
+  'foo_3859',
+  'foo_3860',
+  'foo_3861',
+  'foo_3862',
+  'foo_3863',
+  'foo_3864',
+  'foo_3865',
+  'foo_3866',
+  'foo_3867',
+  'foo_3868',
+  'foo_3869',
+  'foo_3870',
+  'foo_3871',
+  'foo_3872',
+  'foo_3873',
+  'foo_3874',
+  'foo_3875',
+  'foo_3876',
+  'foo_3877',
+  'foo_3878',
+  'foo_3879',
+  'foo_3880',
+  'foo_3881',
+  'foo_3882',
+  'foo_3883',
+  'foo_3884',
+  'foo_3885',
+  'foo_3886',
+  'foo_3887',
+  'foo_3888',
+  'foo_3889',
+  'foo_3890',
+  'foo_3891',
+  'foo_3892',
+  'foo_3893',
+  'foo_3894',
+  'foo_3895',
+  'foo_3896',
+  'foo_3897',
+  'foo_3898',
+  'foo_3899',
+  'foo_3900',
+  'foo_3901',
+  'foo_3902',
+  'foo_3903',
+  'foo_3904',
+  'foo_3905',
+  'foo_3906',
+  'foo_3907',
+  'foo_3908',
+  'foo_3909',
+  'foo_3910',
+  'foo_3911',
+  'foo_3912',
+  'foo_3913',
+  'foo_3914',
+  'foo_3915',
+  'foo_3916',
+  'foo_3917',
+  'foo_3918',
+  'foo_3919',
+  'foo_3920',
+  'foo_3921',
+  'foo_3922',
+  'foo_3923',
+  'foo_3924',
+  'foo_3925',
+  'foo_3926',
+  'foo_3927',
+  'foo_3928',
+  'foo_3929',
+  'foo_3930',
+  'foo_3931',
+  'foo_3932',
+  'foo_3933',
+  'foo_3934',
+  'foo_3935',
+  'foo_3936',
+  'foo_3937',
+  'foo_3938',
+  'foo_3939',
+  'foo_3940',
+  'foo_3941',
+  'foo_3942',
+  'foo_3943',
+  'foo_3944',
+  'foo_3945',
+  'foo_3946',
+  'foo_3947',
+  'foo_3948',
+  'foo_3949',
+  'foo_3950',
+  'foo_3951',
+  'foo_3952',
+  'foo_3953',
+  'foo_3954',
+  'foo_3955',
+  'foo_3956',
+  'foo_3957',
+  'foo_3958',
+  'foo_3959',
+  'foo_3960',
+  'foo_3961',
+  'foo_3962',
+  'foo_3963',
+  'foo_3964',
+  'foo_3965',
+  'foo_3966',
+  'foo_3967',
+  'foo_3968',
+  'foo_3969',
+  'foo_3970',
+  'foo_3971',
+  'foo_3972',
+  'foo_3973',
+  'foo_3974',
+  'foo_3975',
+  'foo_3976',
+  'foo_3977',
+  'foo_3978',
+  'foo_3979',
+  'foo_3980',
+  'foo_3981',
+  'foo_3982',
+  'foo_3983',
+  'foo_3984',
+  'foo_3985',
+  'foo_3986',
+  'foo_3987',
+  'foo_3988',
+  'foo_3989',
+  'foo_3990',
+  'foo_3991',
+  'foo_3992',
+  'foo_3993',
+  'foo_3994',
+  'foo_3995',
+  'foo_3996',
+  'foo_3997',
+  'foo_3998',
+  'foo_3999',
+  'foo_4000',
+  'foo_4001',
+  'foo_4002',
+  'foo_4003',
+  'foo_4004',
+  'foo_4005',
+  'foo_4006',
+  'foo_4007',
+  'foo_4008',
+  'foo_4009',
+  'foo_4010',
+  'foo_4011',
+  'foo_4012',
+  'foo_4013',
+  'foo_4014',
+  'foo_4015',
+  'foo_4016',
+  'foo_4017',
+  'foo_4018',
+  'foo_4019',
+  'foo_4020',
+  'foo_4021',
+  'foo_4022',
+  'foo_4023',
+  'foo_4024',
+  'foo_4025',
+  'foo_4026',
+  'foo_4027',
+  'foo_4028',
+  'foo_4029',
+  'foo_4030',
+  'foo_4031',
+  'foo_4032',
+  'foo_4033',
+  'foo_4034',
+  'foo_4035',
+  'foo_4036',
+  'foo_4037',
+  'foo_4038',
+  'foo_4039',
+  'foo_4040',
+  'foo_4041',
+  'foo_4042',
+  'foo_4043',
+  'foo_4044',
+  'foo_4045',
+  'foo_4046',
+  'foo_4047',
+  'foo_4048',
+  'foo_4049',
+  'foo_4050',
+  'foo_4051',
+  'foo_4052',
+  'foo_4053',
+  'foo_4054',
+  'foo_4055',
+  'foo_4056',
+  'foo_4057',
+  'foo_4058',
+  'foo_4059',
+  'foo_4060',
+  'foo_4061',
+  'foo_4062',
+  'foo_4063',
+  'foo_4064',
+  'foo_4065',
+  'foo_4066',
+  'foo_4067',
+  'foo_4068',
+  'foo_4069',
+  'foo_4070',
+  'foo_4071',
+  'foo_4072',
+  'foo_4073',
+  'foo_4074',
+  'foo_4075',
+  'foo_4076',
+  'foo_4077',
+  'foo_4078',
+  'foo_4079',
+  'foo_4080',
+  'foo_4081',
+  'foo_4082',
+  'foo_4083',
+  'foo_4084',
+  'foo_4085',
+  'foo_4086',
+  'foo_4087',
+  'foo_4088',
+  'foo_4089',
+  'foo_4090',
+  'foo_4091',
+  'foo_4092',
+  'foo_4093',
+  'foo_4094',
+  'foo_4095',
+  'foo_4096',
+  'foo_4097',
+  'foo_4098',
+  'foo_4099',
+  'foo_4100',
+  'foo_4101',
+  'foo_4102',
+  'foo_4103',
+  'foo_4104',
+  'foo_4105',
+  'foo_4106',
+  'foo_4107',
+  'foo_4108',
+  'foo_4109',
+  'foo_4110',
+  'foo_4111',
+  'foo_4112',
+  'foo_4113',
+  'foo_4114',
+  'foo_4115',
+  'foo_4116',
+  'foo_4117',
+  'foo_4118',
+  'foo_4119',
+  'foo_4120',
+  'foo_4121',
+  'foo_4122',
+  'foo_4123',
+  'foo_4124',
+  'foo_4125',
+  'foo_4126',
+  'foo_4127',
+  'foo_4128',
+  'foo_4129',
+  'foo_4130',
+  'foo_4131',
+  'foo_4132',
+  'foo_4133',
+  'foo_4134',
+  'foo_4135',
+  'foo_4136',
+  'foo_4137',
+  'foo_4138',
+  'foo_4139',
+  'foo_4140',
+  'foo_4141',
+  'foo_4142',
+  'foo_4143',
+  'foo_4144',
+  'foo_4145',
+  'foo_4146',
+  'foo_4147',
+  'foo_4148',
+  'foo_4149',
+  'foo_4150',
+  'foo_4151',
+  'foo_4152',
+  'foo_4153',
+  'foo_4154',
+  'foo_4155',
+  'foo_4156',
+  'foo_4157',
+  'foo_4158',
+  'foo_4159',
+  'foo_4160',
+  'foo_4161',
+  'foo_4162',
+  'foo_4163',
+  'foo_4164',
+  'foo_4165',
+  'foo_4166',
+  'foo_4167',
+  'foo_4168',
+  'foo_4169',
+  'foo_4170',
+  'foo_4171',
+  'foo_4172',
+  'foo_4173',
+  'foo_4174',
+  'foo_4175',
+  'foo_4176',
+  'foo_4177',
+  'foo_4178',
+  'foo_4179',
+  'foo_4180',
+  'foo_4181',
+  'foo_4182',
+  'foo_4183',
+  'foo_4184',
+  'foo_4185',
+  'foo_4186',
+  'foo_4187',
+  'foo_4188',
+  'foo_4189',
+  'foo_4190',
+  'foo_4191',
+  'foo_4192',
+  'foo_4193',
+  'foo_4194',
+  'foo_4195',
+  'foo_4196',
+  'foo_4197',
+  'foo_4198',
+  'foo_4199',
+  'foo_4200',
+  'foo_4201',
+  'foo_4202',
+  'foo_4203',
+  'foo_4204',
+  'foo_4205',
+  'foo_4206',
+  'foo_4207',
+  'foo_4208',
+  'foo_4209',
+  'foo_4210',
+  'foo_4211',
+  'foo_4212',
+  'foo_4213',
+  'foo_4214',
+  'foo_4215',
+  'foo_4216',
+  'foo_4217',
+  'foo_4218',
+  'foo_4219',
+  'foo_4220',
+  'foo_4221',
+  'foo_4222',
+  'foo_4223',
+  'foo_4224',
+  'foo_4225',
+  'foo_4226',
+  'foo_4227',
+  'foo_4228',
+  'foo_4229',
+  'foo_4230',
+  'foo_4231',
+  'foo_4232',
+  'foo_4233',
+  'foo_4234',
+  'foo_4235',
+  'foo_4236',
+  'foo_4237',
+  'foo_4238',
+  'foo_4239',
+  'foo_4240',
+  'foo_4241',
+  'foo_4242',
+  'foo_4243',
+  'foo_4244',
+  'foo_4245',
+  'foo_4246',
+  'foo_4247',
+  'foo_4248',
+  'foo_4249',
+  'foo_4250',
+  'foo_4251',
+  'foo_4252',
+  'foo_4253',
+  'foo_4254',
+  'foo_4255',
+  'foo_4256',
+  'foo_4257',
+  'foo_4258',
+  'foo_4259',
+  'foo_4260',
+  'foo_4261',
+  'foo_4262',
+  'foo_4263',
+  'foo_4264',
+  'foo_4265',
+  'foo_4266',
+  'foo_4267',
+  'foo_4268',
+  'foo_4269',
+  'foo_4270',
+  'foo_4271',
+  'foo_4272',
+  'foo_4273',
+  'foo_4274',
+  'foo_4275',
+  'foo_4276',
+  'foo_4277',
+  'foo_4278',
+  'foo_4279',
+  'foo_4280',
+  'foo_4281',
+  'foo_4282',
+  'foo_4283',
+  'foo_4284',
+  'foo_4285',
+  'foo_4286',
+  'foo_4287',
+  'foo_4288',
+  'foo_4289',
+  'foo_4290',
+  'foo_4291',
+  'foo_4292',
+  'foo_4293',
+  'foo_4294',
+  'foo_4295',
+  'foo_4296',
+  'foo_4297',
+  'foo_4298',
+  'foo_4299',
+  'foo_4300',
+  'foo_4301',
+  'foo_4302',
+  'foo_4303',
+  'foo_4304',
+  'foo_4305',
+  'foo_4306',
+  'foo_4307',
+  'foo_4308',
+  'foo_4309',
+  'foo_4310',
+  'foo_4311',
+  'foo_4312',
+  'foo_4313',
+  'foo_4314',
+  'foo_4315',
+  'foo_4316',
+  'foo_4317',
+  'foo_4318',
+  'foo_4319',
+  'foo_4320',
+  'foo_4321',
+  'foo_4322',
+  'foo_4323',
+  'foo_4324',
+  'foo_4325',
+  'foo_4326',
+  'foo_4327',
+  'foo_4328',
+  'foo_4329',
+  'foo_4330',
+  'foo_4331',
+  'foo_4332',
+  'foo_4333',
+  'foo_4334',
+  'foo_4335',
+  'foo_4336',
+  'foo_4337',
+  'foo_4338',
+  'foo_4339',
+  'foo_4340',
+  'foo_4341',
+  'foo_4342',
+  'foo_4343',
+  'foo_4344',
+  'foo_4345',
+  'foo_4346',
+  'foo_4347',
+  'foo_4348',
+  'foo_4349',
+  'foo_4350',
+  'foo_4351',
+  'foo_4352',
+  'foo_4353',
+  'foo_4354',
+  'foo_4355',
+  'foo_4356',
+  'foo_4357',
+  'foo_4358',
+  'foo_4359',
+  'foo_4360',
+  'foo_4361',
+  'foo_4362',
+  'foo_4363',
+  'foo_4364',
+  'foo_4365',
+  'foo_4366',
+  'foo_4367',
+  'foo_4368',
+  'foo_4369',
+  'foo_4370',
+  'foo_4371',
+  'foo_4372',
+  'foo_4373',
+  'foo_4374',
+  'foo_4375',
+  'foo_4376',
+  'foo_4377',
+  'foo_4378',
+  'foo_4379',
+  'foo_4380',
+  'foo_4381',
+  'foo_4382',
+  'foo_4383',
+  'foo_4384',
+  'foo_4385',
+  'foo_4386',
+  'foo_4387',
+  'foo_4388',
+  'foo_4389',
+  'foo_4390',
+  'foo_4391',
+  'foo_4392',
+  'foo_4393',
+  'foo_4394',
+  'foo_4395',
+  'foo_4396',
+  'foo_4397',
+  'foo_4398',
+  'foo_4399',
+  'foo_4400',
+  'foo_4401',
+  'foo_4402',
+  'foo_4403',
+  'foo_4404',
+  'foo_4405',
+  'foo_4406',
+  'foo_4407',
+  'foo_4408',
+  'foo_4409',
+  'foo_4410',
+  'foo_4411',
+  'foo_4412',
+  'foo_4413',
+  'foo_4414',
+  'foo_4415',
+  'foo_4416',
+  'foo_4417',
+  'foo_4418',
+  'foo_4419',
+  'foo_4420',
+  'foo_4421',
+  'foo_4422',
+  'foo_4423',
+  'foo_4424',
+  'foo_4425',
+  'foo_4426',
+  'foo_4427',
+  'foo_4428',
+  'foo_4429',
+  'foo_4430',
+  'foo_4431',
+  'foo_4432',
+  'foo_4433',
+  'foo_4434',
+  'foo_4435',
+  'foo_4436',
+  'foo_4437',
+  'foo_4438',
+  'foo_4439',
+  'foo_4440',
+  'foo_4441',
+  'foo_4442',
+  'foo_4443',
+  'foo_4444',
+  'foo_4445',
+  'foo_4446',
+  'foo_4447',
+  'foo_4448',
+  'foo_4449',
+  'foo_4450',
+  'foo_4451',
+  'foo_4452',
+  'foo_4453',
+  'foo_4454',
+  'foo_4455',
+  'foo_4456',
+  'foo_4457',
+  'foo_4458',
+  'foo_4459',
+  'foo_4460',
+  'foo_4461',
+  'foo_4462',
+  'foo_4463',
+  'foo_4464',
+  'foo_4465',
+  'foo_4466',
+  'foo_4467',
+  'foo_4468',
+  'foo_4469',
+  'foo_4470',
+  'foo_4471',
+  'foo_4472',
+  'foo_4473',
+  'foo_4474',
+  'foo_4475',
+  'foo_4476',
+  'foo_4477',
+  'foo_4478',
+  'foo_4479',
+  'foo_4480',
+  'foo_4481',
+  'foo_4482',
+  'foo_4483',
+  'foo_4484',
+  'foo_4485',
+  'foo_4486',
+  'foo_4487',
+  'foo_4488',
+  'foo_4489',
+  'foo_4490',
+  'foo_4491',
+  'foo_4492',
+  'foo_4493',
+  'foo_4494',
+  'foo_4495',
+  'foo_4496',
+  'foo_4497',
+  'foo_4498',
+  'foo_4499',
+  'foo_4500',
+  'foo_4501',
+  'foo_4502',
+  'foo_4503',
+  'foo_4504',
+  'foo_4505',
+  'foo_4506',
+  'foo_4507',
+  'foo_4508',
+  'foo_4509',
+  'foo_4510',
+  'foo_4511',
+  'foo_4512',
+  'foo_4513',
+  'foo_4514',
+  'foo_4515',
+  'foo_4516',
+  'foo_4517',
+  'foo_4518',
+  'foo_4519',
+  'foo_4520',
+  'foo_4521',
+  'foo_4522',
+  'foo_4523',
+  'foo_4524',
+  'foo_4525',
+  'foo_4526',
+  'foo_4527',
+  'foo_4528',
+  'foo_4529',
+  'foo_4530',
+  'foo_4531',
+  'foo_4532',
+  'foo_4533',
+  'foo_4534',
+  'foo_4535',
+  'foo_4536',
+  'foo_4537',
+  'foo_4538',
+  'foo_4539',
+  'foo_4540',
+  'foo_4541',
+  'foo_4542',
+  'foo_4543',
+  'foo_4544',
+  'foo_4545',
+  'foo_4546',
+  'foo_4547',
+  'foo_4548',
+  'foo_4549',
+  'foo_4550',
+  'foo_4551',
+  'foo_4552',
+  'foo_4553',
+  'foo_4554',
+  'foo_4555',
+  'foo_4556',
+  'foo_4557',
+  'foo_4558',
+  'foo_4559',
+  'foo_4560',
+  'foo_4561',
+  'foo_4562',
+  'foo_4563',
+  'foo_4564',
+  'foo_4565',
+  'foo_4566',
+  'foo_4567',
+  'foo_4568',
+  'foo_4569',
+  'foo_4570',
+  'foo_4571',
+  'foo_4572',
+  'foo_4573',
+  'foo_4574',
+  'foo_4575',
+  'foo_4576',
+  'foo_4577',
+  'foo_4578',
+  'foo_4579',
+  'foo_4580',
+  'foo_4581',
+  'foo_4582',
+  'foo_4583',
+  'foo_4584',
+  'foo_4585',
+  'foo_4586',
+  'foo_4587',
+  'foo_4588',
+  'foo_4589',
+  'foo_4590',
+  'foo_4591',
+  'foo_4592',
+  'foo_4593',
+  'foo_4594',
+  'foo_4595',
+  'foo_4596',
+  'foo_4597',
+  'foo_4598',
+  'foo_4599',
+  'foo_4600',
+  'foo_4601',
+  'foo_4602',
+  'foo_4603',
+  'foo_4604',
+  'foo_4605',
+  'foo_4606',
+  'foo_4607',
+  'foo_4608',
+  'foo_4609',
+  'foo_4610',
+  'foo_4611',
+  'foo_4612',
+  'foo_4613',
+  'foo_4614',
+  'foo_4615',
+  'foo_4616',
+  'foo_4617',
+  'foo_4618',
+  'foo_4619',
+  'foo_4620',
+  'foo_4621',
+  'foo_4622',
+  'foo_4623',
+  'foo_4624',
+  'foo_4625',
+  'foo_4626',
+  'foo_4627',
+  'foo_4628',
+  'foo_4629',
+  'foo_4630',
+  'foo_4631',
+  'foo_4632',
+  'foo_4633',
+  'foo_4634',
+  'foo_4635',
+  'foo_4636',
+  'foo_4637',
+  'foo_4638',
+  'foo_4639',
+  'foo_4640',
+  'foo_4641',
+  'foo_4642',
+  'foo_4643',
+  'foo_4644',
+  'foo_4645',
+  'foo_4646',
+  'foo_4647',
+  'foo_4648',
+  'foo_4649',
+  'foo_4650',
+  'foo_4651',
+  'foo_4652',
+  'foo_4653',
+  'foo_4654',
+  'foo_4655',
+  'foo_4656',
+  'foo_4657',
+  'foo_4658',
+  'foo_4659',
+  'foo_4660',
+  'foo_4661',
+  'foo_4662',
+  'foo_4663',
+  'foo_4664',
+  'foo_4665',
+  'foo_4666',
+  'foo_4667',
+  'foo_4668',
+  'foo_4669',
+  'foo_4670',
+  'foo_4671',
+  'foo_4672',
+  'foo_4673',
+  'foo_4674',
+  'foo_4675',
+  'foo_4676',
+  'foo_4677',
+  'foo_4678',
+  'foo_4679',
+  'foo_4680',
+  'foo_4681',
+  'foo_4682',
+  'foo_4683',
+  'foo_4684',
+  'foo_4685',
+  'foo_4686',
+  'foo_4687',
+  'foo_4688',
+  'foo_4689',
+  'foo_4690',
+  'foo_4691',
+  'foo_4692',
+  'foo_4693',
+  'foo_4694',
+  'foo_4695',
+  'foo_4696',
+  'foo_4697',
+  'foo_4698',
+  'foo_4699',
+  'foo_4700',
+  'foo_4701',
+  'foo_4702',
+  'foo_4703',
+  'foo_4704',
+  'foo_4705',
+  'foo_4706',
+  'foo_4707',
+  'foo_4708',
+  'foo_4709',
+  'foo_4710',
+  'foo_4711',
+  'foo_4712',
+  'foo_4713',
+  'foo_4714',
+  'foo_4715',
+  'foo_4716',
+  'foo_4717',
+  'foo_4718',
+  'foo_4719',
+  'foo_4720',
+  'foo_4721',
+  'foo_4722',
+  'foo_4723',
+  'foo_4724',
+  'foo_4725',
+  'foo_4726',
+  'foo_4727',
+  'foo_4728',
+  'foo_4729',
+  'foo_4730',
+  'foo_4731',
+  'foo_4732',
+  'foo_4733',
+  'foo_4734',
+  'foo_4735',
+  'foo_4736',
+  'foo_4737',
+  'foo_4738',
+  'foo_4739',
+  'foo_4740',
+  'foo_4741',
+  'foo_4742',
+  'foo_4743',
+  'foo_4744',
+  'foo_4745',
+  'foo_4746',
+  'foo_4747',
+  'foo_4748',
+  'foo_4749',
+  'foo_4750',
+  'foo_4751',
+  'foo_4752',
+  'foo_4753',
+  'foo_4754',
+  'foo_4755',
+  'foo_4756',
+  'foo_4757',
+  'foo_4758',
+  'foo_4759',
+  'foo_4760',
+  'foo_4761',
+  'foo_4762',
+  'foo_4763',
+  'foo_4764',
+  'foo_4765',
+  'foo_4766',
+  'foo_4767',
+  'foo_4768',
+  'foo_4769',
+  'foo_4770',
+  'foo_4771',
+  'foo_4772',
+  'foo_4773',
+  'foo_4774',
+  'foo_4775',
+  'foo_4776',
+  'foo_4777',
+  'foo_4778',
+  'foo_4779',
+  'foo_4780',
+  'foo_4781',
+  'foo_4782',
+  'foo_4783',
+  'foo_4784',
+  'foo_4785',
+  'foo_4786',
+  'foo_4787',
+  'foo_4788',
+  'foo_4789',
+  'foo_4790',
+  'foo_4791',
+  'foo_4792',
+  'foo_4793',
+  'foo_4794',
+  'foo_4795',
+  'foo_4796',
+  'foo_4797',
+  'foo_4798',
+  'foo_4799',
+  'foo_4800',
+  'foo_4801',
+  'foo_4802',
+  'foo_4803',
+  'foo_4804',
+  'foo_4805',
+  'foo_4806',
+  'foo_4807',
+  'foo_4808',
+  'foo_4809',
+  'foo_4810',
+  'foo_4811',
+  'foo_4812',
+  'foo_4813',
+  'foo_4814',
+  'foo_4815',
+  'foo_4816',
+  'foo_4817',
+  'foo_4818',
+  'foo_4819',
+  'foo_4820',
+  'foo_4821',
+  'foo_4822',
+  'foo_4823',
+  'foo_4824',
+  'foo_4825',
+  'foo_4826',
+  'foo_4827',
+  'foo_4828',
+  'foo_4829',
+  'foo_4830',
+  'foo_4831',
+  'foo_4832',
+  'foo_4833',
+  'foo_4834',
+  'foo_4835',
+  'foo_4836',
+  'foo_4837',
+  'foo_4838',
+  'foo_4839',
+  'foo_4840',
+  'foo_4841',
+  'foo_4842',
+  'foo_4843',
+  'foo_4844',
+  'foo_4845',
+  'foo_4846',
+  'foo_4847',
+  'foo_4848',
+  'foo_4849',
+  'foo_4850',
+  'foo_4851',
+  'foo_4852',
+  'foo_4853',
+  'foo_4854',
+  'foo_4855',
+  'foo_4856',
+  'foo_4857',
+  'foo_4858',
+  'foo_4859',
+  'foo_4860',
+  'foo_4861',
+  'foo_4862',
+  'foo_4863',
+  'foo_4864',
+  'foo_4865',
+  'foo_4866',
+  'foo_4867',
+  'foo_4868',
+  'foo_4869',
+  'foo_4870',
+  'foo_4871',
+  'foo_4872',
+  'foo_4873',
+  'foo_4874',
+  'foo_4875',
+  'foo_4876',
+  'foo_4877',
+  'foo_4878',
+  'foo_4879',
+  'foo_4880',
+  'foo_4881',
+  'foo_4882',
+  'foo_4883',
+  'foo_4884',
+  'foo_4885',
+  'foo_4886',
+  'foo_4887',
+  'foo_4888',
+  'foo_4889',
+  'foo_4890',
+  'foo_4891',
+  'foo_4892',
+  'foo_4893',
+  'foo_4894',
+  'foo_4895',
+  'foo_4896',
+  'foo_4897',
+  'foo_4898',
+  'foo_4899',
+  'foo_4900',
+  'foo_4901',
+  'foo_4902',
+  'foo_4903',
+  'foo_4904',
+  'foo_4905',
+  'foo_4906',
+  'foo_4907',
+  'foo_4908',
+  'foo_4909',
+  'foo_4910',
+  'foo_4911',
+  'foo_4912',
+  'foo_4913',
+  'foo_4914',
+  'foo_4915',
+  'foo_4916',
+  'foo_4917',
+  'foo_4918',
+  'foo_4919',
+  'foo_4920',
+  'foo_4921',
+  'foo_4922',
+  'foo_4923',
+  'foo_4924',
+  'foo_4925',
+  'foo_4926',
+  'foo_4927',
+  'foo_4928',
+  'foo_4929',
+  'foo_4930',
+  'foo_4931',
+  'foo_4932',
+  'foo_4933',
+  'foo_4934',
+  'foo_4935',
+  'foo_4936',
+  'foo_4937',
+  'foo_4938',
+  'foo_4939',
+  'foo_4940',
+  'foo_4941',
+  'foo_4942',
+  'foo_4943',
+  'foo_4944',
+  'foo_4945',
+  'foo_4946',
+  'foo_4947',
+  'foo_4948',
+  'foo_4949',
+  'foo_4950',
+  'foo_4951',
+  'foo_4952',
+  'foo_4953',
+  'foo_4954',
+  'foo_4955',
+  'foo_4956',
+  'foo_4957',
+  'foo_4958',
+  'foo_4959',
+  'foo_4960',
+  'foo_4961',
+  'foo_4962',
+  'foo_4963',
+  'foo_4964',
+  'foo_4965',
+  'foo_4966',
+  'foo_4967',
+  'foo_4968',
+  'foo_4969',
+  'foo_4970',
+  'foo_4971',
+  'foo_4972',
+  'foo_4973',
+  'foo_4974',
+  'foo_4975',
+  'foo_4976',
+  'foo_4977',
+  'foo_4978',
+  'foo_4979',
+  'foo_4980',
+  'foo_4981',
+  'foo_4982',
+  'foo_4983',
+  'foo_4984',
+  'foo_4985',
+  'foo_4986',
+  'foo_4987',
+  'foo_4988',
+  'foo_4989',
+  'foo_4990',
+  'foo_4991',
+  'foo_4992',
+  'foo_4993',
+  'foo_4994',
+  'foo_4995',
+  'foo_4996',
+  'foo_4997',
+  'foo_4998',
+  'foo_4999',
+  'foo_5000',
+  'foo_5001',
+  'foo_5002',
+  'foo_5003',
+  'foo_5004',
+  'foo_5005',
+  'foo_5006',
+  'foo_5007',
+  'foo_5008',
+  'foo_5009',
+  'foo_5010',
+  'foo_5011',
+  'foo_5012',
+  'foo_5013',
+  'foo_5014',
+  'foo_5015',
+  'foo_5016',
+  'foo_5017',
+  'foo_5018',
+  'foo_5019',
+  'foo_5020',
+  'foo_5021',
+  'foo_5022',
+  'foo_5023',
+  'foo_5024',
+  'foo_5025',
+  'foo_5026',
+  'foo_5027',
+  'foo_5028',
+  'foo_5029',
+  'foo_5030',
+  'foo_5031',
+  'foo_5032',
+  'foo_5033',
+  'foo_5034',
+  'foo_5035',
+  'foo_5036',
+  'foo_5037',
+  'foo_5038',
+  'foo_5039',
+  'foo_5040',
+  'foo_5041',
+  'foo_5042',
+  'foo_5043',
+  'foo_5044',
+  'foo_5045',
+  'foo_5046',
+  'foo_5047',
+  'foo_5048',
+  'foo_5049',
+  'foo_5050',
+  'foo_5051',
+  'foo_5052',
+  'foo_5053',
+  'foo_5054',
+  'foo_5055',
+  'foo_5056',
+  'foo_5057',
+  'foo_5058',
+  'foo_5059',
+  'foo_5060',
+  'foo_5061',
+  'foo_5062',
+  'foo_5063',
+  'foo_5064',
+  'foo_5065',
+  'foo_5066',
+  'foo_5067',
+  'foo_5068',
+  'foo_5069',
+  'foo_5070',
+  'foo_5071',
+  'foo_5072',
+  'foo_5073',
+  'foo_5074',
+  'foo_5075',
+  'foo_5076',
+  'foo_5077',
+  'foo_5078',
+  'foo_5079',
+  'foo_5080',
+  'foo_5081',
+  'foo_5082',
+  'foo_5083',
+  'foo_5084',
+  'foo_5085',
+  'foo_5086',
+  'foo_5087',
+  'foo_5088',
+  'foo_5089',
+  'foo_5090',
+  'foo_5091',
+  'foo_5092',
+  'foo_5093',
+  'foo_5094',
+  'foo_5095',
+  'foo_5096',
+  'foo_5097',
+  'foo_5098',
+  'foo_5099',
+  'foo_5100',
+  'foo_5101',
+  'foo_5102',
+  'foo_5103',
+  'foo_5104',
+  'foo_5105',
+  'foo_5106',
+  'foo_5107',
+  'foo_5108',
+  'foo_5109',
+  'foo_5110',
+  'foo_5111',
+  'foo_5112',
+  'foo_5113',
+  'foo_5114',
+  'foo_5115',
+  'foo_5116',
+  'foo_5117',
+  'foo_5118',
+  'foo_5119',
+  'foo_5120',
+  'foo_5121',
+  'foo_5122',
+  'foo_5123',
+  'foo_5124',
+  'foo_5125',
+  'foo_5126',
+  'foo_5127',
+  'foo_5128',
+  'foo_5129',
+  'foo_5130',
+  'foo_5131',
+  'foo_5132',
+  'foo_5133',
+  'foo_5134',
+  'foo_5135',
+  'foo_5136',
+  'foo_5137',
+  'foo_5138',
+  'foo_5139',
+  'foo_5140',
+  'foo_5141',
+  'foo_5142',
+  'foo_5143',
+  'foo_5144',
+  'foo_5145',
+  'foo_5146',
+  'foo_5147',
+  'foo_5148',
+  'foo_5149',
+  'foo_5150',
+  'foo_5151',
+  'foo_5152',
+  'foo_5153',
+  'foo_5154',
+  'foo_5155',
+  'foo_5156',
+  'foo_5157',
+  'foo_5158',
+  'foo_5159',
+  'foo_5160',
+  'foo_5161',
+  'foo_5162',
+  'foo_5163',
+  'foo_5164',
+  'foo_5165',
+  'foo_5166',
+  'foo_5167',
+  'foo_5168',
+  'foo_5169',
+  'foo_5170',
+  'foo_5171',
+  'foo_5172',
+  'foo_5173',
+  'foo_5174',
+  'foo_5175',
+  'foo_5176',
+  'foo_5177',
+  'foo_5178',
+  'foo_5179',
+  'foo_5180',
+  'foo_5181',
+  'foo_5182',
+  'foo_5183',
+  'foo_5184',
+  'foo_5185',
+  'foo_5186',
+  'foo_5187',
+  'foo_5188',
+  'foo_5189',
+  'foo_5190',
+  'foo_5191',
+  'foo_5192',
+  'foo_5193',
+  'foo_5194',
+  'foo_5195',
+  'foo_5196',
+  'foo_5197',
+  'foo_5198',
+  'foo_5199',
+  'foo_5200',
+  'foo_5201',
+  'foo_5202',
+  'foo_5203',
+  'foo_5204',
+  'foo_5205',
+  'foo_5206',
+  'foo_5207',
+  'foo_5208',
+  'foo_5209',
+  'foo_5210',
+  'foo_5211',
+  'foo_5212',
+  'foo_5213',
+  'foo_5214',
+  'foo_5215',
+  'foo_5216',
+  'foo_5217',
+  'foo_5218',
+  'foo_5219',
+  'foo_5220',
+  'foo_5221',
+  'foo_5222',
+  'foo_5223',
+  'foo_5224',
+  'foo_5225',
+  'foo_5226',
+  'foo_5227',
+  'foo_5228',
+  'foo_5229',
+  'foo_5230',
+  'foo_5231',
+  'foo_5232',
+  'foo_5233',
+  'foo_5234',
+  'foo_5235',
+  'foo_5236',
+  'foo_5237',
+  'foo_5238',
+  'foo_5239',
+  'foo_5240',
+  'foo_5241',
+  'foo_5242',
+  'foo_5243',
+  'foo_5244',
+  'foo_5245',
+  'foo_5246',
+  'foo_5247',
+  'foo_5248',
+  'foo_5249',
+  'foo_5250',
+  'foo_5251',
+  'foo_5252',
+  'foo_5253',
+  'foo_5254',
+  'foo_5255',
+  'foo_5256',
+  'foo_5257',
+  'foo_5258',
+  'foo_5259',
+  'foo_5260',
+  'foo_5261',
+  'foo_5262',
+  'foo_5263',
+  'foo_5264',
+  'foo_5265',
+  'foo_5266',
+  'foo_5267',
+  'foo_5268',
+  'foo_5269',
+  'foo_5270',
+  'foo_5271',
+  'foo_5272',
+  'foo_5273',
+  'foo_5274',
+  'foo_5275',
+  'foo_5276',
+  'foo_5277',
+  'foo_5278',
+  'foo_5279',
+  'foo_5280',
+  'foo_5281',
+  'foo_5282',
+  'foo_5283',
+  'foo_5284',
+  'foo_5285',
+  'foo_5286',
+  'foo_5287',
+  'foo_5288',
+  'foo_5289',
+  'foo_5290',
+  'foo_5291',
+  'foo_5292',
+  'foo_5293',
+  'foo_5294',
+  'foo_5295',
+  'foo_5296',
+  'foo_5297',
+  'foo_5298',
+  'foo_5299',
+  'foo_5300',
+  'foo_5301',
+  'foo_5302',
+  'foo_5303',
+  'foo_5304',
+  'foo_5305',
+  'foo_5306',
+  'foo_5307',
+  'foo_5308',
+  'foo_5309',
+  'foo_5310',
+  'foo_5311',
+  'foo_5312',
+  'foo_5313',
+  'foo_5314',
+  'foo_5315',
+  'foo_5316',
+  'foo_5317',
+  'foo_5318',
+  'foo_5319',
+  'foo_5320',
+  'foo_5321',
+  'foo_5322',
+  'foo_5323',
+  'foo_5324',
+  'foo_5325',
+  'foo_5326',
+  'foo_5327',
+  'foo_5328',
+  'foo_5329',
+  'foo_5330',
+  'foo_5331',
+  'foo_5332',
+  'foo_5333',
+  'foo_5334',
+  'foo_5335',
+  'foo_5336',
+  'foo_5337',
+  'foo_5338',
+  'foo_5339',
+  'foo_5340',
+  'foo_5341',
+  'foo_5342',
+  'foo_5343',
+  'foo_5344',
+  'foo_5345',
+  'foo_5346',
+  'foo_5347',
+  'foo_5348',
+  'foo_5349',
+  'foo_5350',
+  'foo_5351',
+  'foo_5352',
+  'foo_5353',
+  'foo_5354',
+  'foo_5355',
+  'foo_5356',
+  'foo_5357',
+  'foo_5358',
+  'foo_5359',
+  'foo_5360',
+  'foo_5361',
+  'foo_5362',
+  'foo_5363',
+  'foo_5364',
+  'foo_5365',
+  'foo_5366',
+  'foo_5367',
+  'foo_5368',
+  'foo_5369',
+  'foo_5370',
+  'foo_5371',
+  'foo_5372',
+  'foo_5373',
+  'foo_5374',
+  'foo_5375',
+  'foo_5376',
+  'foo_5377',
+  'foo_5378',
+  'foo_5379',
+  'foo_5380',
+  'foo_5381',
+  'foo_5382',
+  'foo_5383',
+  'foo_5384',
+  'foo_5385',
+  'foo_5386',
+  'foo_5387',
+  'foo_5388',
+  'foo_5389',
+  'foo_5390',
+  'foo_5391',
+  'foo_5392',
+  'foo_5393',
+  'foo_5394',
+  'foo_5395',
+  'foo_5396',
+  'foo_5397',
+  'foo_5398',
+  'foo_5399',
+  'foo_5400',
+  'foo_5401',
+  'foo_5402',
+  'foo_5403',
+  'foo_5404',
+  'foo_5405',
+  'foo_5406',
+  'foo_5407',
+  'foo_5408',
+  'foo_5409',
+  'foo_5410',
+  'foo_5411',
+  'foo_5412',
+  'foo_5413',
+  'foo_5414',
+  'foo_5415',
+  'foo_5416',
+  'foo_5417',
+  'foo_5418',
+  'foo_5419',
+  'foo_5420',
+  'foo_5421',
+  'foo_5422',
+  'foo_5423',
+  'foo_5424',
+  'foo_5425',
+  'foo_5426',
+  'foo_5427',
+  'foo_5428',
+  'foo_5429',
+  'foo_5430',
+  'foo_5431',
+  'foo_5432',
+  'foo_5433',
+  'foo_5434',
+  'foo_5435',
+  'foo_5436',
+  'foo_5437',
+  'foo_5438',
+  'foo_5439',
+  'foo_5440',
+  'foo_5441',
+  'foo_5442',
+  'foo_5443',
+  'foo_5444',
+  'foo_5445',
+  'foo_5446',
+  'foo_5447',
+  'foo_5448',
+  'foo_5449',
+  'foo_5450',
+  'foo_5451',
+  'foo_5452',
+  'foo_5453',
+  'foo_5454',
+  'foo_5455',
+  'foo_5456',
+  'foo_5457',
+  'foo_5458',
+  'foo_5459',
+  'foo_5460',
+  'foo_5461',
+  'foo_5462',
+  'foo_5463',
+  'foo_5464',
+  'foo_5465',
+  'foo_5466',
+  'foo_5467',
+  'foo_5468',
+  'foo_5469',
+  'foo_5470',
+  'foo_5471',
+  'foo_5472',
+  'foo_5473',
+  'foo_5474',
+  'foo_5475',
+  'foo_5476',
+  'foo_5477',
+  'foo_5478',
+  'foo_5479',
+  'foo_5480',
+  'foo_5481',
+  'foo_5482',
+  'foo_5483',
+  'foo_5484',
+  'foo_5485',
+  'foo_5486',
+  'foo_5487',
+  'foo_5488',
+  'foo_5489',
+  'foo_5490',
+  'foo_5491',
+  'foo_5492',
+  'foo_5493',
+  'foo_5494',
+  'foo_5495',
+  'foo_5496',
+  'foo_5497',
+  'foo_5498',
+  'foo_5499',
+  'foo_5500',
+  'foo_5501',
+  'foo_5502',
+  'foo_5503',
+  'foo_5504',
+  'foo_5505',
+  'foo_5506',
+  'foo_5507',
+  'foo_5508',
+  'foo_5509',
+  'foo_5510',
+  'foo_5511',
+  'foo_5512',
+  'foo_5513',
+  'foo_5514',
+  'foo_5515',
+  'foo_5516',
+  'foo_5517',
+  'foo_5518',
+  'foo_5519',
+  'foo_5520',
+  'foo_5521',
+  'foo_5522',
+  'foo_5523',
+  'foo_5524',
+  'foo_5525',
+  'foo_5526',
+  'foo_5527',
+  'foo_5528',
+  'foo_5529',
+  'foo_5530',
+  'foo_5531',
+  'foo_5532',
+  'foo_5533',
+  'foo_5534',
+  'foo_5535',
+  'foo_5536',
+  'foo_5537',
+  'foo_5538',
+  'foo_5539',
+  'foo_5540',
+  'foo_5541',
+  'foo_5542',
+  'foo_5543',
+  'foo_5544',
+  'foo_5545',
+  'foo_5546',
+  'foo_5547',
+  'foo_5548',
+  'foo_5549',
+  'foo_5550',
+  'foo_5551',
+  'foo_5552',
+  'foo_5553',
+  'foo_5554',
+  'foo_5555',
+  'foo_5556',
+  'foo_5557',
+  'foo_5558',
+  'foo_5559',
+  'foo_5560',
+  'foo_5561',
+  'foo_5562',
+  'foo_5563',
+  'foo_5564',
+  'foo_5565',
+  'foo_5566',
+  'foo_5567',
+  'foo_5568',
+  'foo_5569',
+  'foo_5570',
+  'foo_5571',
+  'foo_5572',
+  'foo_5573',
+  'foo_5574',
+  'foo_5575',
+  'foo_5576',
+  'foo_5577',
+  'foo_5578',
+  'foo_5579',
+  'foo_5580',
+  'foo_5581',
+  'foo_5582',
+  'foo_5583',
+  'foo_5584',
+  'foo_5585',
+  'foo_5586',
+  'foo_5587',
+  'foo_5588',
+  'foo_5589',
+  'foo_5590',
+  'foo_5591',
+  'foo_5592',
+  'foo_5593',
+  'foo_5594',
+  'foo_5595',
+  'foo_5596',
+  'foo_5597',
+  'foo_5598',
+  'foo_5599',
+  'foo_5600',
+  'foo_5601',
+  'foo_5602',
+  'foo_5603',
+  'foo_5604',
+  'foo_5605',
+  'foo_5606',
+  'foo_5607',
+  'foo_5608',
+  'foo_5609',
+  'foo_5610',
+  'foo_5611',
+  'foo_5612',
+  'foo_5613',
+  'foo_5614',
+  'foo_5615',
+  'foo_5616',
+  'foo_5617',
+  'foo_5618',
+  'foo_5619',
+  'foo_5620',
+  'foo_5621',
+  'foo_5622',
+  'foo_5623',
+  'foo_5624',
+  'foo_5625',
+  'foo_5626',
+  'foo_5627',
+  'foo_5628',
+  'foo_5629',
+  'foo_5630',
+  'foo_5631',
+  'foo_5632',
+  'foo_5633',
+  'foo_5634',
+  'foo_5635',
+  'foo_5636',
+  'foo_5637',
+  'foo_5638',
+  'foo_5639',
+  'foo_5640',
+  'foo_5641',
+  'foo_5642',
+  'foo_5643',
+  'foo_5644',
+  'foo_5645',
+  'foo_5646',
+  'foo_5647',
+  'foo_5648',
+  'foo_5649',
+  'foo_5650',
+  'foo_5651',
+  'foo_5652',
+  'foo_5653',
+  'foo_5654',
+  'foo_5655',
+  'foo_5656',
+  'foo_5657',
+  'foo_5658',
+  'foo_5659',
+  'foo_5660',
+  'foo_5661',
+  'foo_5662',
+  'foo_5663',
+  'foo_5664',
+  'foo_5665',
+  'foo_5666',
+  'foo_5667',
+  'foo_5668',
+  'foo_5669',
+  'foo_5670',
+  'foo_5671',
+  'foo_5672',
+  'foo_5673',
+  'foo_5674',
+  'foo_5675',
+  'foo_5676',
+  'foo_5677',
+  'foo_5678',
+  'foo_5679',
+  'foo_5680',
+  'foo_5681',
+  'foo_5682',
+  'foo_5683',
+  'foo_5684',
+  'foo_5685',
+  'foo_5686',
+  'foo_5687',
+  'foo_5688',
+  'foo_5689',
+  'foo_5690',
+  'foo_5691',
+  'foo_5692',
+  'foo_5693',
+  'foo_5694',
+  'foo_5695',
+  'foo_5696',
+  'foo_5697',
+  'foo_5698',
+  'foo_5699',
+  'foo_5700',
+  'foo_5701',
+  'foo_5702',
+  'foo_5703',
+  'foo_5704',
+  'foo_5705',
+  'foo_5706',
+  'foo_5707',
+  'foo_5708',
+  'foo_5709',
+  'foo_5710',
+  'foo_5711',
+  'foo_5712',
+  'foo_5713',
+  'foo_5714',
+  'foo_5715',
+  'foo_5716',
+  'foo_5717',
+  'foo_5718',
+  'foo_5719',
+  'foo_5720',
+  'foo_5721',
+  'foo_5722',
+  'foo_5723',
+  'foo_5724',
+  'foo_5725',
+  'foo_5726',
+  'foo_5727',
+  'foo_5728',
+  'foo_5729',
+  'foo_5730',
+  'foo_5731',
+  'foo_5732',
+  'foo_5733',
+  'foo_5734',
+  'foo_5735',
+  'foo_5736',
+  'foo_5737',
+  'foo_5738',
+  'foo_5739',
+  'foo_5740',
+  'foo_5741',
+  'foo_5742',
+  'foo_5743',
+  'foo_5744',
+  'foo_5745',
+  'foo_5746',
+  'foo_5747',
+  'foo_5748',
+  'foo_5749',
+  'foo_5750',
+  'foo_5751',
+  'foo_5752',
+  'foo_5753',
+  'foo_5754',
+  'foo_5755',
+  'foo_5756',
+  'foo_5757',
+  'foo_5758',
+  'foo_5759',
+  'foo_5760',
+  'foo_5761',
+  'foo_5762',
+  'foo_5763',
+  'foo_5764',
+  'foo_5765',
+  'foo_5766',
+  'foo_5767',
+  'foo_5768',
+  'foo_5769',
+  'foo_5770',
+  'foo_5771',
+  'foo_5772',
+  'foo_5773',
+  'foo_5774',
+  'foo_5775',
+  'foo_5776',
+  'foo_5777',
+  'foo_5778',
+  'foo_5779',
+  'foo_5780',
+  'foo_5781',
+  'foo_5782',
+  'foo_5783',
+  'foo_5784',
+  'foo_5785',
+  'foo_5786',
+  'foo_5787',
+  'foo_5788',
+  'foo_5789',
+  'foo_5790',
+  'foo_5791',
+  'foo_5792',
+  'foo_5793',
+  'foo_5794',
+  'foo_5795',
+  'foo_5796',
+  'foo_5797',
+  'foo_5798',
+  'foo_5799',
+  'foo_5800',
+  'foo_5801',
+  'foo_5802',
+  'foo_5803',
+  'foo_5804',
+  'foo_5805',
+  'foo_5806',
+  'foo_5807',
+  'foo_5808',
+  'foo_5809',
+  'foo_5810',
+  'foo_5811',
+  'foo_5812',
+  'foo_5813',
+  'foo_5814',
+  'foo_5815',
+  'foo_5816',
+  'foo_5817',
+  'foo_5818',
+  'foo_5819',
+  'foo_5820',
+  'foo_5821',
+  'foo_5822',
+  'foo_5823',
+  'foo_5824',
+  'foo_5825',
+  'foo_5826',
+  'foo_5827',
+  'foo_5828',
+  'foo_5829',
+  'foo_5830',
+  'foo_5831',
+  'foo_5832',
+  'foo_5833',
+  'foo_5834',
+  'foo_5835',
+  'foo_5836',
+  'foo_5837',
+  'foo_5838',
+  'foo_5839',
+  'foo_5840',
+  'foo_5841',
+  'foo_5842',
+  'foo_5843',
+  'foo_5844',
+  'foo_5845',
+  'foo_5846',
+  'foo_5847',
+  'foo_5848',
+  'foo_5849',
+  'foo_5850',
+  'foo_5851',
+  'foo_5852',
+  'foo_5853',
+  'foo_5854',
+  'foo_5855',
+  'foo_5856',
+  'foo_5857',
+  'foo_5858',
+  'foo_5859',
+  'foo_5860',
+  'foo_5861',
+  'foo_5862',
+  'foo_5863',
+  'foo_5864',
+  'foo_5865',
+  'foo_5866',
+  'foo_5867',
+  'foo_5868',
+  'foo_5869',
+  'foo_5870',
+  'foo_5871',
+  'foo_5872',
+  'foo_5873',
+  'foo_5874',
+  'foo_5875',
+  'foo_5876',
+  'foo_5877',
+  'foo_5878',
+  'foo_5879',
+  'foo_5880',
+  'foo_5881',
+  'foo_5882',
+  'foo_5883',
+  'foo_5884',
+  'foo_5885',
+  'foo_5886',
+  'foo_5887',
+  'foo_5888',
+  'foo_5889',
+  'foo_5890',
+  'foo_5891',
+  'foo_5892',
+  'foo_5893',
+  'foo_5894',
+  'foo_5895',
+  'foo_5896',
+  'foo_5897',
+  'foo_5898',
+  'foo_5899',
+  'foo_5900',
+  'foo_5901',
+  'foo_5902',
+  'foo_5903',
+  'foo_5904',
+  'foo_5905',
+  'foo_5906',
+  'foo_5907',
+  'foo_5908',
+  'foo_5909',
+  'foo_5910',
+  'foo_5911',
+  'foo_5912',
+  'foo_5913',
+  'foo_5914',
+  'foo_5915',
+  'foo_5916',
+  'foo_5917',
+  'foo_5918',
+  'foo_5919',
+  'foo_5920',
+  'foo_5921',
+  'foo_5922',
+  'foo_5923',
+  'foo_5924',
+  'foo_5925',
+  'foo_5926',
+  'foo_5927',
+  'foo_5928',
+  'foo_5929',
+  'foo_5930',
+  'foo_5931',
+  'foo_5932',
+  'foo_5933',
+  'foo_5934',
+  'foo_5935',
+  'foo_5936',
+  'foo_5937',
+  'foo_5938',
+  'foo_5939',
+  'foo_5940',
+  'foo_5941',
+  'foo_5942',
+  'foo_5943',
+  'foo_5944',
+  'foo_5945',
+  'foo_5946',
+  'foo_5947',
+  'foo_5948',
+  'foo_5949',
+  'foo_5950',
+  'foo_5951',
+  'foo_5952',
+  'foo_5953',
+  'foo_5954',
+  'foo_5955',
+  'foo_5956',
+  'foo_5957',
+  'foo_5958',
+  'foo_5959',
+  'foo_5960',
+  'foo_5961',
+  'foo_5962',
+  'foo_5963',
+  'foo_5964',
+  'foo_5965',
+  'foo_5966',
+  'foo_5967',
+  'foo_5968',
+  'foo_5969',
+  'foo_5970',
+  'foo_5971',
+  'foo_5972',
+  'foo_5973',
+  'foo_5974',
+  'foo_5975',
+  'foo_5976',
+  'foo_5977',
+  'foo_5978',
+  'foo_5979',
+  'foo_5980',
+  'foo_5981',
+  'foo_5982',
+  'foo_5983',
+  'foo_5984',
+  'foo_5985',
+  'foo_5986',
+  'foo_5987',
+  'foo_5988',
+  'foo_5989',
+  'foo_5990',
+  'foo_5991',
+  'foo_5992',
+  'foo_5993',
+  'foo_5994',
+  'foo_5995',
+  'foo_5996',
+  'foo_5997',
+  'foo_5998',
+  'foo_5999',
+  'foo_6000',
+  'foo_6001',
+  'foo_6002',
+  'foo_6003',
+  'foo_6004',
+  'foo_6005',
+  'foo_6006',
+  'foo_6007',
+  'foo_6008',
+  'foo_6009',
+  'foo_6010',
+  'foo_6011',
+  'foo_6012',
+  'foo_6013',
+  'foo_6014',
+  'foo_6015',
+  'foo_6016',
+  'foo_6017',
+  'foo_6018',
+  'foo_6019',
+  'foo_6020',
+  'foo_6021',
+  'foo_6022',
+  'foo_6023',
+  'foo_6024',
+  'foo_6025',
+  'foo_6026',
+  'foo_6027',
+  'foo_6028',
+  'foo_6029',
+  'foo_6030',
+  'foo_6031',
+  'foo_6032',
+  'foo_6033',
+  'foo_6034',
+  'foo_6035',
+  'foo_6036',
+  'foo_6037',
+  'foo_6038',
+  'foo_6039',
+  'foo_6040',
+  'foo_6041',
+  'foo_6042',
+  'foo_6043',
+  'foo_6044',
+  'foo_6045',
+  'foo_6046',
+  'foo_6047',
+  'foo_6048',
+  'foo_6049',
+  'foo_6050',
+  'foo_6051',
+  'foo_6052',
+  'foo_6053',
+  'foo_6054',
+  'foo_6055',
+  'foo_6056',
+  'foo_6057',
+  'foo_6058',
+  'foo_6059',
+  'foo_6060',
+  'foo_6061',
+  'foo_6062',
+  'foo_6063',
+  'foo_6064',
+  'foo_6065',
+  'foo_6066',
+  'foo_6067',
+  'foo_6068',
+  'foo_6069',
+  'foo_6070',
+  'foo_6071',
+  'foo_6072',
+  'foo_6073',
+  'foo_6074',
+  'foo_6075',
+  'foo_6076',
+  'foo_6077',
+  'foo_6078',
+  'foo_6079',
+  'foo_6080',
+  'foo_6081',
+  'foo_6082',
+  'foo_6083',
+  'foo_6084',
+  'foo_6085',
+  'foo_6086',
+  'foo_6087',
+  'foo_6088',
+  'foo_6089',
+  'foo_6090',
+  'foo_6091',
+  'foo_6092',
+  'foo_6093',
+  'foo_6094',
+  'foo_6095',
+  'foo_6096',
+  'foo_6097',
+  'foo_6098',
+  'foo_6099',
+  'foo_6100',
+  'foo_6101',
+  'foo_6102',
+  'foo_6103',
+  'foo_6104',
+  'foo_6105',
+  'foo_6106',
+  'foo_6107',
+  'foo_6108',
+  'foo_6109',
+  'foo_6110',
+  'foo_6111',
+  'foo_6112',
+  'foo_6113',
+  'foo_6114',
+  'foo_6115',
+  'foo_6116',
+  'foo_6117',
+  'foo_6118',
+  'foo_6119',
+  'foo_6120',
+  'foo_6121',
+  'foo_6122',
+  'foo_6123',
+  'foo_6124',
+  'foo_6125',
+  'foo_6126',
+  'foo_6127',
+  'foo_6128',
+  'foo_6129',
+  'foo_6130',
+  'foo_6131',
+  'foo_6132',
+  'foo_6133',
+  'foo_6134',
+  'foo_6135',
+  'foo_6136',
+  'foo_6137',
+  'foo_6138',
+  'foo_6139',
+  'foo_6140',
+  'foo_6141',
+  'foo_6142',
+  'foo_6143',
+  'foo_6144',
+  'foo_6145',
+  'foo_6146',
+  'foo_6147',
+  'foo_6148',
+  'foo_6149',
+  'foo_6150',
+  'foo_6151',
+  'foo_6152',
+  'foo_6153',
+  'foo_6154',
+  'foo_6155',
+  'foo_6156',
+  'foo_6157',
+  'foo_6158',
+  'foo_6159',
+  'foo_6160',
+  'foo_6161',
+  'foo_6162',
+  'foo_6163',
+  'foo_6164',
+  'foo_6165',
+  'foo_6166',
+  'foo_6167',
+  'foo_6168',
+  'foo_6169',
+  'foo_6170',
+  'foo_6171',
+  'foo_6172',
+  'foo_6173',
+  'foo_6174',
+  'foo_6175',
+  'foo_6176',
+  'foo_6177',
+  'foo_6178',
+  'foo_6179',
+  'foo_6180',
+  'foo_6181',
+  'foo_6182',
+  'foo_6183',
+  'foo_6184',
+  'foo_6185',
+  'foo_6186',
+  'foo_6187',
+  'foo_6188',
+  'foo_6189',
+  'foo_6190',
+  'foo_6191',
+  'foo_6192',
+  'foo_6193',
+  'foo_6194',
+  'foo_6195',
+  'foo_6196',
+  'foo_6197',
+  'foo_6198',
+  'foo_6199',
+  'foo_6200',
+  'foo_6201',
+  'foo_6202',
+  'foo_6203',
+  'foo_6204',
+  'foo_6205',
+  'foo_6206',
+  'foo_6207',
+  'foo_6208',
+  'foo_6209',
+  'foo_6210',
+  'foo_6211',
+  'foo_6212',
+  'foo_6213',
+  'foo_6214',
+  'foo_6215',
+  'foo_6216',
+  'foo_6217',
+  'foo_6218',
+  'foo_6219',
+  'foo_6220',
+  'foo_6221',
+  'foo_6222',
+  'foo_6223',
+  'foo_6224',
+  'foo_6225',
+  'foo_6226',
+  'foo_6227',
+  'foo_6228',
+  'foo_6229',
+  'foo_6230',
+  'foo_6231',
+  'foo_6232',
+  'foo_6233',
+  'foo_6234',
+  'foo_6235',
+  'foo_6236',
+  'foo_6237',
+  'foo_6238',
+  'foo_6239',
+  'foo_6240',
+  'foo_6241',
+  'foo_6242',
+  'foo_6243',
+  'foo_6244',
+  'foo_6245',
+  'foo_6246',
+  'foo_6247',
+  'foo_6248',
+  'foo_6249',
+  'foo_6250',
+  'foo_6251',
+  'foo_6252',
+  'foo_6253',
+  'foo_6254',
+  'foo_6255',
+  'foo_6256',
+  'foo_6257',
+  'foo_6258',
+  'foo_6259',
+  'foo_6260',
+  'foo_6261',
+  'foo_6262',
+  'foo_6263',
+  'foo_6264',
+  'foo_6265',
+  'foo_6266',
+  'foo_6267',
+  'foo_6268',
+  'foo_6269',
+  'foo_6270',
+  'foo_6271',
+  'foo_6272',
+  'foo_6273',
+  'foo_6274',
+  'foo_6275',
+  'foo_6276',
+  'foo_6277',
+  'foo_6278',
+  'foo_6279',
+  'foo_6280',
+  'foo_6281',
+  'foo_6282',
+  'foo_6283',
+  'foo_6284',
+  'foo_6285',
+  'foo_6286',
+  'foo_6287',
+  'foo_6288',
+  'foo_6289',
+  'foo_6290',
+  'foo_6291',
+  'foo_6292',
+  'foo_6293',
+  'foo_6294',
+  'foo_6295',
+  'foo_6296',
+  'foo_6297',
+  'foo_6298',
+  'foo_6299',
+  'foo_6300',
+  'foo_6301',
+  'foo_6302',
+  'foo_6303',
+  'foo_6304',
+  'foo_6305',
+  'foo_6306',
+  'foo_6307',
+  'foo_6308',
+  'foo_6309',
+  'foo_6310',
+  'foo_6311',
+  'foo_6312',
+  'foo_6313',
+  'foo_6314',
+  'foo_6315',
+  'foo_6316',
+  'foo_6317',
+  'foo_6318',
+  'foo_6319',
+  'foo_6320',
+  'foo_6321',
+  'foo_6322',
+  'foo_6323',
+  'foo_6324',
+  'foo_6325',
+  'foo_6326',
+  'foo_6327',
+  'foo_6328',
+  'foo_6329',
+  'foo_6330',
+  'foo_6331',
+  'foo_6332',
+  'foo_6333',
+  'foo_6334',
+  'foo_6335',
+  'foo_6336',
+  'foo_6337',
+  'foo_6338',
+  'foo_6339',
+  'foo_6340',
+  'foo_6341',
+  'foo_6342',
+  'foo_6343',
+  'foo_6344',
+  'foo_6345',
+  'foo_6346',
+  'foo_6347',
+  'foo_6348',
+  'foo_6349',
+  'foo_6350',
+  'foo_6351',
+  'foo_6352',
+  'foo_6353',
+  'foo_6354',
+  'foo_6355',
+  'foo_6356',
+  'foo_6357',
+  'foo_6358',
+  'foo_6359',
+  'foo_6360',
+  'foo_6361',
+  'foo_6362',
+  'foo_6363',
+  'foo_6364',
+  'foo_6365',
+  'foo_6366',
+  'foo_6367',
+  'foo_6368',
+  'foo_6369',
+  'foo_6370',
+  'foo_6371',
+  'foo_6372',
+  'foo_6373',
+  'foo_6374',
+  'foo_6375',
+  'foo_6376',
+  'foo_6377',
+  'foo_6378',
+  'foo_6379',
+  'foo_6380',
+  'foo_6381',
+  'foo_6382',
+  'foo_6383',
+  'foo_6384',
+  'foo_6385',
+  'foo_6386',
+  'foo_6387',
+  'foo_6388',
+  'foo_6389',
+  'foo_6390',
+  'foo_6391',
+  'foo_6392',
+  'foo_6393',
+  'foo_6394',
+  'foo_6395',
+  'foo_6396',
+  'foo_6397',
+  'foo_6398',
+  'foo_6399',
+  'foo_6400',
+  'foo_6401',
+  'foo_6402',
+  'foo_6403',
+  'foo_6404',
+  'foo_6405',
+  'foo_6406',
+  'foo_6407',
+  'foo_6408',
+  'foo_6409',
+  'foo_6410',
+  'foo_6411',
+  'foo_6412',
+  'foo_6413',
+  'foo_6414',
+  'foo_6415',
+  'foo_6416',
+  'foo_6417',
+  'foo_6418',
+  'foo_6419',
+  'foo_6420',
+  'foo_6421',
+  'foo_6422',
+  'foo_6423',
+  'foo_6424',
+  'foo_6425',
+  'foo_6426',
+  'foo_6427',
+  'foo_6428',
+  'foo_6429',
+  'foo_6430',
+  'foo_6431',
+  'foo_6432',
+  'foo_6433',
+  'foo_6434',
+  'foo_6435',
+  'foo_6436',
+  'foo_6437',
+  'foo_6438',
+  'foo_6439',
+  'foo_6440',
+  'foo_6441',
+  'foo_6442',
+  'foo_6443',
+  'foo_6444',
+  'foo_6445',
+  'foo_6446',
+  'foo_6447',
+  'foo_6448',
+  'foo_6449',
+  'foo_6450',
+  'foo_6451',
+  'foo_6452',
+  'foo_6453',
+  'foo_6454',
+  'foo_6455',
+  'foo_6456',
+  'foo_6457',
+  'foo_6458',
+  'foo_6459',
+  'foo_6460',
+  'foo_6461',
+  'foo_6462',
+  'foo_6463',
+  'foo_6464',
+  'foo_6465',
+  'foo_6466',
+  'foo_6467',
+  'foo_6468',
+  'foo_6469',
+  'foo_6470',
+  'foo_6471',
+  'foo_6472',
+  'foo_6473',
+  'foo_6474',
+  'foo_6475',
+  'foo_6476',
+  'foo_6477',
+  'foo_6478',
+  'foo_6479',
+  'foo_6480',
+  'foo_6481',
+  'foo_6482',
+  'foo_6483',
+  'foo_6484',
+  'foo_6485',
+  'foo_6486',
+  'foo_6487',
+  'foo_6488',
+  'foo_6489',
+  'foo_6490',
+  'foo_6491',
+  'foo_6492',
+  'foo_6493',
+  'foo_6494',
+  'foo_6495',
+  'foo_6496',
+  'foo_6497',
+  'foo_6498',
+  'foo_6499',
+  'foo_6500',
+  'foo_6501',
+  'foo_6502',
+  'foo_6503',
+  'foo_6504',
+  'foo_6505',
+  'foo_6506',
+  'foo_6507',
+  'foo_6508',
+  'foo_6509',
+  'foo_6510',
+  'foo_6511',
+  'foo_6512',
+  'foo_6513',
+  'foo_6514',
+  'foo_6515',
+  'foo_6516',
+  'foo_6517',
+  'foo_6518',
+  'foo_6519',
+  'foo_6520',
+  'foo_6521',
+  'foo_6522',
+  'foo_6523',
+  'foo_6524',
+  'foo_6525',
+  'foo_6526',
+  'foo_6527',
+  'foo_6528',
+  'foo_6529',
+  'foo_6530',
+  'foo_6531',
+  'foo_6532',
+  'foo_6533',
+  'foo_6534',
+  'foo_6535',
+  'foo_6536',
+  'foo_6537',
+  'foo_6538',
+  'foo_6539',
+  'foo_6540',
+  'foo_6541',
+  'foo_6542',
+  'foo_6543',
+  'foo_6544',
+  'foo_6545',
+  'foo_6546',
+  'foo_6547',
+  'foo_6548',
+  'foo_6549',
+  'foo_6550',
+  'foo_6551',
+  'foo_6552',
+  'foo_6553',
+  'foo_6554',
+  'foo_6555',
+  'foo_6556',
+  'foo_6557',
+  'foo_6558',
+  'foo_6559',
+  'foo_6560',
+  'foo_6561',
+  'foo_6562',
+  'foo_6563',
+  'foo_6564',
+  'foo_6565',
+  'foo_6566',
+  'foo_6567',
+  'foo_6568',
+  'foo_6569',
+  'foo_6570',
+  'foo_6571',
+  'foo_6572',
+  'foo_6573',
+  'foo_6574',
+  'foo_6575',
+  'foo_6576',
+  'foo_6577',
+  'foo_6578',
+  'foo_6579',
+  'foo_6580',
+  'foo_6581',
+  'foo_6582',
+  'foo_6583',
+  'foo_6584',
+  'foo_6585',
+  'foo_6586',
+  'foo_6587',
+  'foo_6588',
+  'foo_6589',
+  'foo_6590',
+  'foo_6591',
+  'foo_6592',
+  'foo_6593',
+  'foo_6594',
+  'foo_6595',
+  'foo_6596',
+  'foo_6597',
+  'foo_6598',
+  'foo_6599',
+  'foo_6600',
+  'foo_6601',
+  'foo_6602',
+  'foo_6603',
+  'foo_6604',
+  'foo_6605',
+  'foo_6606',
+  'foo_6607',
+  'foo_6608',
+  'foo_6609',
+  'foo_6610',
+  'foo_6611',
+  'foo_6612',
+  'foo_6613',
+  'foo_6614',
+  'foo_6615',
+  'foo_6616',
+  'foo_6617',
+  'foo_6618',
+  'foo_6619',
+  'foo_6620',
+  'foo_6621',
+  'foo_6622',
+  'foo_6623',
+  'foo_6624',
+  'foo_6625',
+  'foo_6626',
+  'foo_6627',
+  'foo_6628',
+  'foo_6629',
+  'foo_6630',
+  'foo_6631',
+  'foo_6632',
+  'foo_6633',
+  'foo_6634',
+  'foo_6635',
+  'foo_6636',
+  'foo_6637',
+  'foo_6638',
+  'foo_6639',
+  'foo_6640',
+  'foo_6641',
+  'foo_6642',
+  'foo_6643',
+  'foo_6644',
+  'foo_6645',
+  'foo_6646',
+  'foo_6647',
+  'foo_6648',
+  'foo_6649',
+  'foo_6650',
+  'foo_6651',
+  'foo_6652',
+  'foo_6653',
+  'foo_6654',
+  'foo_6655',
+  'foo_6656',
+  'foo_6657',
+  'foo_6658',
+  'foo_6659',
+  'foo_6660',
+  'foo_6661',
+  'foo_6662',
+  'foo_6663',
+  'foo_6664',
+  'foo_6665',
+  'foo_6666',
+  'foo_6667',
+  'foo_6668',
+  'foo_6669',
+  'foo_6670',
+  'foo_6671',
+  'foo_6672',
+  'foo_6673',
+  'foo_6674',
+  'foo_6675',
+  'foo_6676',
+  'foo_6677',
+  'foo_6678',
+  'foo_6679',
+  'foo_6680',
+  'foo_6681',
+  'foo_6682',
+  'foo_6683',
+  'foo_6684',
+  'foo_6685',
+  'foo_6686',
+  'foo_6687',
+  'foo_6688',
+  'foo_6689',
+  'foo_6690',
+  'foo_6691',
+  'foo_6692',
+  'foo_6693',
+  'foo_6694',
+  'foo_6695',
+  'foo_6696',
+  'foo_6697',
+  'foo_6698',
+  'foo_6699',
+  'foo_6700',
+  'foo_6701',
+  'foo_6702',
+  'foo_6703',
+  'foo_6704',
+  'foo_6705',
+  'foo_6706',
+  'foo_6707',
+  'foo_6708',
+  'foo_6709',
+  'foo_6710',
+  'foo_6711',
+  'foo_6712',
+  'foo_6713',
+  'foo_6714',
+  'foo_6715',
+  'foo_6716',
+  'foo_6717',
+  'foo_6718',
+  'foo_6719',
+  'foo_6720',
+  'foo_6721',
+  'foo_6722',
+  'foo_6723',
+  'foo_6724',
+  'foo_6725',
+  'foo_6726',
+  'foo_6727',
+  'foo_6728',
+  'foo_6729',
+  'foo_6730',
+  'foo_6731',
+  'foo_6732',
+  'foo_6733',
+  'foo_6734',
+  'foo_6735',
+  'foo_6736',
+  'foo_6737',
+  'foo_6738',
+  'foo_6739',
+  'foo_6740',
+  'foo_6741',
+  'foo_6742',
+  'foo_6743',
+  'foo_6744',
+  'foo_6745',
+  'foo_6746',
+  'foo_6747',
+  'foo_6748',
+  'foo_6749',
+  'foo_6750',
+  'foo_6751',
+  'foo_6752',
+  'foo_6753',
+  'foo_6754',
+  'foo_6755',
+  'foo_6756',
+  'foo_6757',
+  'foo_6758',
+  'foo_6759',
+  'foo_6760',
+  'foo_6761',
+  'foo_6762',
+  'foo_6763',
+  'foo_6764',
+  'foo_6765',
+  'foo_6766',
+  'foo_6767',
+  'foo_6768',
+  'foo_6769',
+  'foo_6770',
+  'foo_6771',
+  'foo_6772',
+  'foo_6773',
+  'foo_6774',
+  'foo_6775',
+  'foo_6776',
+  'foo_6777',
+  'foo_6778',
+  'foo_6779',
+  'foo_6780',
+  'foo_6781',
+  'foo_6782',
+  'foo_6783',
+  'foo_6784',
+  'foo_6785',
+  'foo_6786',
+  'foo_6787',
+  'foo_6788',
+  'foo_6789',
+  'foo_6790',
+  'foo_6791',
+  'foo_6792',
+  'foo_6793',
+  'foo_6794',
+  'foo_6795',
+  'foo_6796',
+  'foo_6797',
+  'foo_6798',
+  'foo_6799',
+  'foo_6800',
+  'foo_6801',
+  'foo_6802',
+  'foo_6803',
+  'foo_6804',
+  'foo_6805',
+  'foo_6806',
+  'foo_6807',
+  'foo_6808',
+  'foo_6809',
+  'foo_6810',
+  'foo_6811',
+  'foo_6812',
+  'foo_6813',
+  'foo_6814',
+  'foo_6815',
+  'foo_6816',
+  'foo_6817',
+  'foo_6818',
+  'foo_6819',
+  'foo_6820',
+  'foo_6821',
+  'foo_6822',
+  'foo_6823',
+  'foo_6824',
+  'foo_6825',
+  'foo_6826',
+  'foo_6827',
+  'foo_6828',
+  'foo_6829',
+  'foo_6830',
+  'foo_6831',
+  'foo_6832',
+  'foo_6833',
+  'foo_6834',
+  'foo_6835',
+  'foo_6836',
+  'foo_6837',
+  'foo_6838',
+  'foo_6839',
+  'foo_6840',
+  'foo_6841',
+  'foo_6842',
+  'foo_6843',
+  'foo_6844',
+  'foo_6845',
+  'foo_6846',
+  'foo_6847',
+  'foo_6848',
+  'foo_6849',
+  'foo_6850',
+  'foo_6851',
+  'foo_6852',
+  'foo_6853',
+  'foo_6854',
+  'foo_6855',
+  'foo_6856',
+  'foo_6857',
+  'foo_6858',
+  'foo_6859',
+  'foo_6860',
+  'foo_6861',
+  'foo_6862',
+  'foo_6863',
+  'foo_6864',
+  'foo_6865',
+  'foo_6866',
+  'foo_6867',
+  'foo_6868',
+  'foo_6869',
+  'foo_6870',
+  'foo_6871',
+  'foo_6872',
+  'foo_6873',
+  'foo_6874',
+  'foo_6875',
+  'foo_6876',
+  'foo_6877',
+  'foo_6878',
+  'foo_6879',
+  'foo_6880',
+  'foo_6881',
+  'foo_6882',
+  'foo_6883',
+  'foo_6884',
+  'foo_6885',
+  'foo_6886',
+  'foo_6887',
+  'foo_6888',
+  'foo_6889',
+  'foo_6890',
+  'foo_6891',
+  'foo_6892',
+  'foo_6893',
+  'foo_6894',
+  'foo_6895',
+  'foo_6896',
+  'foo_6897',
+  'foo_6898',
+  'foo_6899',
+  'foo_6900',
+  'foo_6901',
+  'foo_6902',
+  'foo_6903',
+  'foo_6904',
+  'foo_6905',
+  'foo_6906',
+  'foo_6907',
+  'foo_6908',
+  'foo_6909',
+  'foo_6910',
+  'foo_6911',
+  'foo_6912',
+  'foo_6913',
+  'foo_6914',
+  'foo_6915',
+  'foo_6916',
+  'foo_6917',
+  'foo_6918',
+  'foo_6919',
+  'foo_6920',
+  'foo_6921',
+  'foo_6922',
+  'foo_6923',
+  'foo_6924',
+  'foo_6925',
+  'foo_6926',
+  'foo_6927',
+  'foo_6928',
+  'foo_6929',
+  'foo_6930',
+  'foo_6931',
+  'foo_6932',
+  'foo_6933',
+  'foo_6934',
+  'foo_6935',
+  'foo_6936',
+  'foo_6937',
+  'foo_6938',
+  'foo_6939',
+  'foo_6940',
+  'foo_6941',
+  'foo_6942',
+  'foo_6943',
+  'foo_6944',
+  'foo_6945',
+  'foo_6946',
+  'foo_6947',
+  'foo_6948',
+  'foo_6949',
+  'foo_6950',
+  'foo_6951',
+  'foo_6952',
+  'foo_6953',
+  'foo_6954',
+  'foo_6955',
+  'foo_6956',
+  'foo_6957',
+  'foo_6958',
+  'foo_6959',
+  'foo_6960',
+  'foo_6961',
+  'foo_6962',
+  'foo_6963',
+  'foo_6964',
+  'foo_6965',
+  'foo_6966',
+  'foo_6967',
+  'foo_6968',
+  'foo_6969',
+  'foo_6970',
+  'foo_6971',
+  'foo_6972',
+  'foo_6973',
+  'foo_6974',
+  'foo_6975',
+  'foo_6976',
+  'foo_6977',
+  'foo_6978',
+  'foo_6979',
+  'foo_6980',
+  'foo_6981',
+  'foo_6982',
+  'foo_6983',
+  'foo_6984',
+  'foo_6985',
+  'foo_6986',
+  'foo_6987',
+  'foo_6988',
+  'foo_6989',
+  'foo_6990',
+  'foo_6991',
+  'foo_6992',
+  'foo_6993',
+  'foo_6994',
+  'foo_6995',
+  'foo_6996',
+  'foo_6997',
+  'foo_6998',
+  'foo_6999',
+  'foo_7000',
+  'foo_7001',
+  'foo_7002',
+  'foo_7003',
+  'foo_7004',
+  'foo_7005',
+  'foo_7006',
+  'foo_7007',
+  'foo_7008',
+  'foo_7009',
+  'foo_7010',
+  'foo_7011',
+  'foo_7012',
+  'foo_7013',
+  'foo_7014',
+  'foo_7015',
+  'foo_7016',
+  'foo_7017',
+  'foo_7018',
+  'foo_7019',
+  'foo_7020',
+  'foo_7021',
+  'foo_7022',
+  'foo_7023',
+  'foo_7024',
+  'foo_7025',
+  'foo_7026',
+  'foo_7027',
+  'foo_7028',
+  'foo_7029',
+  'foo_7030',
+  'foo_7031',
+  'foo_7032',
+  'foo_7033',
+  'foo_7034',
+  'foo_7035',
+  'foo_7036',
+  'foo_7037',
+  'foo_7038',
+  'foo_7039',
+  'foo_7040',
+  'foo_7041',
+  'foo_7042',
+  'foo_7043',
+  'foo_7044',
+  'foo_7045',
+  'foo_7046',
+  'foo_7047',
+  'foo_7048',
+  'foo_7049',
+  'foo_7050',
+  'foo_7051',
+  'foo_7052',
+  'foo_7053',
+  'foo_7054',
+  'foo_7055',
+  'foo_7056',
+  'foo_7057',
+  'foo_7058',
+  'foo_7059',
+  'foo_7060',
+  'foo_7061',
+  'foo_7062',
+  'foo_7063',
+  'foo_7064',
+  'foo_7065',
+  'foo_7066',
+  'foo_7067',
+  'foo_7068',
+  'foo_7069',
+  'foo_7070',
+  'foo_7071',
+  'foo_7072',
+  'foo_7073',
+  'foo_7074',
+  'foo_7075',
+  'foo_7076',
+  'foo_7077',
+  'foo_7078',
+  'foo_7079',
+  'foo_7080',
+  'foo_7081',
+  'foo_7082',
+  'foo_7083',
+  'foo_7084',
+  'foo_7085',
+  'foo_7086',
+  'foo_7087',
+  'foo_7088',
+  'foo_7089',
+  'foo_7090',
+  'foo_7091',
+  'foo_7092',
+  'foo_7093',
+  'foo_7094',
+  'foo_7095',
+  'foo_7096',
+  'foo_7097',
+  'foo_7098',
+  'foo_7099',
+  'foo_7100',
+  'foo_7101',
+  'foo_7102',
+  'foo_7103',
+  'foo_7104',
+  'foo_7105',
+  'foo_7106',
+  'foo_7107',
+  'foo_7108',
+  'foo_7109',
+  'foo_7110',
+  'foo_7111',
+  'foo_7112',
+  'foo_7113',
+  'foo_7114',
+  'foo_7115',
+  'foo_7116',
+  'foo_7117',
+  'foo_7118',
+  'foo_7119',
+  'foo_7120',
+  'foo_7121',
+  'foo_7122',
+  'foo_7123',
+  'foo_7124',
+  'foo_7125',
+  'foo_7126',
+  'foo_7127',
+  'foo_7128',
+  'foo_7129',
+  'foo_7130',
+  'foo_7131',
+  'foo_7132',
+  'foo_7133',
+  'foo_7134',
+  'foo_7135',
+  'foo_7136',
+  'foo_7137',
+  'foo_7138',
+  'foo_7139',
+  'foo_7140',
+  'foo_7141',
+  'foo_7142',
+  'foo_7143',
+  'foo_7144',
+  'foo_7145',
+  'foo_7146',
+  'foo_7147',
+  'foo_7148',
+  'foo_7149',
+  'foo_7150',
+  'foo_7151',
+  'foo_7152',
+  'foo_7153',
+  'foo_7154',
+  'foo_7155',
+  'foo_7156',
+  'foo_7157',
+  'foo_7158',
+  'foo_7159',
+  'foo_7160',
+  'foo_7161',
+  'foo_7162',
+  'foo_7163',
+  'foo_7164',
+  'foo_7165',
+  'foo_7166',
+  'foo_7167',
+  'foo_7168',
+  'foo_7169',
+  'foo_7170',
+  'foo_7171',
+  'foo_7172',
+  'foo_7173',
+  'foo_7174',
+  'foo_7175',
+  'foo_7176',
+  'foo_7177',
+  'foo_7178',
+  'foo_7179',
+  'foo_7180',
+  'foo_7181',
+  'foo_7182',
+  'foo_7183',
+  'foo_7184',
+  'foo_7185',
+  'foo_7186',
+  'foo_7187',
+  'foo_7188',
+  'foo_7189',
+  'foo_7190',
+  'foo_7191',
+  'foo_7192',
+  'foo_7193',
+  'foo_7194',
+  'foo_7195',
+  'foo_7196',
+  'foo_7197',
+  'foo_7198',
+  'foo_7199',
+  'foo_7200',
+  'foo_7201',
+  'foo_7202',
+  'foo_7203',
+  'foo_7204',
+  'foo_7205',
+  'foo_7206',
+  'foo_7207',
+  'foo_7208',
+  'foo_7209',
+  'foo_7210',
+  'foo_7211',
+  'foo_7212',
+  'foo_7213',
+  'foo_7214',
+  'foo_7215',
+  'foo_7216',
+  'foo_7217',
+  'foo_7218',
+  'foo_7219',
+  'foo_7220',
+  'foo_7221',
+  'foo_7222',
+  'foo_7223',
+  'foo_7224',
+  'foo_7225',
+  'foo_7226',
+  'foo_7227',
+  'foo_7228',
+  'foo_7229',
+  'foo_7230',
+  'foo_7231',
+  'foo_7232',
+  'foo_7233',
+  'foo_7234',
+  'foo_7235',
+  'foo_7236',
+  'foo_7237',
+  'foo_7238',
+  'foo_7239',
+  'foo_7240',
+  'foo_7241',
+  'foo_7242',
+  'foo_7243',
+  'foo_7244',
+  'foo_7245',
+  'foo_7246',
+  'foo_7247',
+  'foo_7248',
+  'foo_7249',
+  'foo_7250',
+  'foo_7251',
+  'foo_7252',
+  'foo_7253',
+  'foo_7254',
+  'foo_7255',
+  'foo_7256',
+  'foo_7257',
+  'foo_7258',
+  'foo_7259',
+  'foo_7260',
+  'foo_7261',
+  'foo_7262',
+  'foo_7263',
+  'foo_7264',
+  'foo_7265',
+  'foo_7266',
+  'foo_7267',
+  'foo_7268',
+  'foo_7269',
+  'foo_7270',
+  'foo_7271',
+  'foo_7272',
+  'foo_7273',
+  'foo_7274',
+  'foo_7275',
+  'foo_7276',
+  'foo_7277',
+  'foo_7278',
+  'foo_7279',
+  'foo_7280',
+  'foo_7281',
+  'foo_7282',
+  'foo_7283',
+  'foo_7284',
+  'foo_7285',
+  'foo_7286',
+  'foo_7287',
+  'foo_7288',
+  'foo_7289',
+  'foo_7290',
+  'foo_7291',
+  'foo_7292',
+  'foo_7293',
+  'foo_7294',
+  'foo_7295',
+  'foo_7296',
+  'foo_7297',
+  'foo_7298',
+  'foo_7299',
+  'foo_7300',
+  'foo_7301',
+  'foo_7302',
+  'foo_7303',
+  'foo_7304',
+  'foo_7305',
+  'foo_7306',
+  'foo_7307',
+  'foo_7308',
+  'foo_7309',
+  'foo_7310',
+  'foo_7311',
+  'foo_7312',
+  'foo_7313',
+  'foo_7314',
+  'foo_7315',
+  'foo_7316',
+  'foo_7317',
+  'foo_7318',
+  'foo_7319',
+  'foo_7320',
+  'foo_7321',
+  'foo_7322',
+  'foo_7323',
+  'foo_7324',
+  'foo_7325',
+  'foo_7326',
+  'foo_7327',
+  'foo_7328',
+  'foo_7329',
+  'foo_7330',
+  'foo_7331',
+  'foo_7332',
+  'foo_7333',
+  'foo_7334',
+  'foo_7335',
+  'foo_7336',
+  'foo_7337',
+  'foo_7338',
+  'foo_7339',
+  'foo_7340',
+  'foo_7341',
+  'foo_7342',
+  'foo_7343',
+  'foo_7344',
+  'foo_7345',
+  'foo_7346',
+  'foo_7347',
+  'foo_7348',
+  'foo_7349',
+  'foo_7350',
+  'foo_7351',
+  'foo_7352',
+  'foo_7353',
+  'foo_7354',
+  'foo_7355',
+  'foo_7356',
+  'foo_7357',
+  'foo_7358',
+  'foo_7359',
+  'foo_7360',
+  'foo_7361',
+  'foo_7362',
+  'foo_7363',
+  'foo_7364',
+  'foo_7365',
+  'foo_7366',
+  'foo_7367',
+  'foo_7368',
+  'foo_7369',
+  'foo_7370',
+  'foo_7371',
+  'foo_7372',
+  'foo_7373',
+  'foo_7374',
+  'foo_7375',
+  'foo_7376',
+  'foo_7377',
+  'foo_7378',
+  'foo_7379',
+  'foo_7380',
+  'foo_7381',
+  'foo_7382',
+  'foo_7383',
+  'foo_7384',
+  'foo_7385',
+  'foo_7386',
+  'foo_7387',
+  'foo_7388',
+  'foo_7389',
+  'foo_7390',
+  'foo_7391',
+  'foo_7392',
+  'foo_7393',
+  'foo_7394',
+  'foo_7395',
+  'foo_7396',
+  'foo_7397',
+  'foo_7398',
+  'foo_7399',
+  'foo_7400',
+  'foo_7401',
+  'foo_7402',
+  'foo_7403',
+  'foo_7404',
+  'foo_7405',
+  'foo_7406',
+  'foo_7407',
+  'foo_7408',
+  'foo_7409',
+  'foo_7410',
+  'foo_7411',
+  'foo_7412',
+  'foo_7413',
+  'foo_7414',
+  'foo_7415',
+  'foo_7416',
+  'foo_7417',
+  'foo_7418',
+  'foo_7419',
+  'foo_7420',
+  'foo_7421',
+  'foo_7422',
+  'foo_7423',
+  'foo_7424',
+  'foo_7425',
+  'foo_7426',
+  'foo_7427',
+  'foo_7428',
+  'foo_7429',
+  'foo_7430',
+  'foo_7431',
+  'foo_7432',
+  'foo_7433',
+  'foo_7434',
+  'foo_7435',
+  'foo_7436',
+  'foo_7437',
+  'foo_7438',
+  'foo_7439',
+  'foo_7440',
+  'foo_7441',
+  'foo_7442',
+  'foo_7443',
+  'foo_7444',
+  'foo_7445',
+  'foo_7446',
+  'foo_7447',
+  'foo_7448',
+  'foo_7449',
+  'foo_7450',
+  'foo_7451',
+  'foo_7452',
+  'foo_7453',
+  'foo_7454',
+  'foo_7455',
+  'foo_7456',
+  'foo_7457',
+  'foo_7458',
+  'foo_7459',
+  'foo_7460',
+  'foo_7461',
+  'foo_7462',
+  'foo_7463',
+  'foo_7464',
+  'foo_7465',
+  'foo_7466',
+  'foo_7467',
+  'foo_7468',
+  'foo_7469',
+  'foo_7470',
+  'foo_7471',
+  'foo_7472',
+  'foo_7473',
+  'foo_7474',
+  'foo_7475',
+  'foo_7476',
+  'foo_7477',
+  'foo_7478',
+  'foo_7479',
+  'foo_7480',
+  'foo_7481',
+  'foo_7482',
+  'foo_7483',
+  'foo_7484',
+  'foo_7485',
+  'foo_7486',
+  'foo_7487',
+  'foo_7488',
+  'foo_7489',
+  'foo_7490',
+  'foo_7491',
+  'foo_7492',
+  'foo_7493',
+  'foo_7494',
+  'foo_7495',
+  'foo_7496',
+  'foo_7497',
+  'foo_7498',
+  'foo_7499',
+  'foo_7500',
+  'foo_7501',
+  'foo_7502',
+  'foo_7503',
+  'foo_7504',
+  'foo_7505',
+  'foo_7506',
+  'foo_7507',
+  'foo_7508',
+  'foo_7509',
+  'foo_7510',
+  'foo_7511',
+  'foo_7512',
+  'foo_7513',
+  'foo_7514',
+  'foo_7515',
+  'foo_7516',
+  'foo_7517',
+  'foo_7518',
+  'foo_7519',
+  'foo_7520',
+  'foo_7521',
+  'foo_7522',
+  'foo_7523',
+  'foo_7524',
+  'foo_7525',
+  'foo_7526',
+  'foo_7527',
+  'foo_7528',
+  'foo_7529',
+  'foo_7530',
+  'foo_7531',
+  'foo_7532',
+  'foo_7533',
+  'foo_7534',
+  'foo_7535',
+  'foo_7536',
+  'foo_7537',
+  'foo_7538',
+  'foo_7539',
+  'foo_7540',
+  'foo_7541',
+  'foo_7542',
+  'foo_7543',
+  'foo_7544',
+  'foo_7545',
+  'foo_7546',
+  'foo_7547',
+  'foo_7548',
+  'foo_7549',
+  'foo_7550',
+  'foo_7551',
+  'foo_7552',
+  'foo_7553',
+  'foo_7554',
+  'foo_7555',
+  'foo_7556',
+  'foo_7557',
+  'foo_7558',
+  'foo_7559',
+  'foo_7560',
+  'foo_7561',
+  'foo_7562',
+  'foo_7563',
+  'foo_7564',
+  'foo_7565',
+  'foo_7566',
+  'foo_7567',
+  'foo_7568',
+  'foo_7569',
+  'foo_7570',
+  'foo_7571',
+  'foo_7572',
+  'foo_7573',
+  'foo_7574',
+  'foo_7575',
+  'foo_7576',
+  'foo_7577',
+  'foo_7578',
+  'foo_7579',
+  'foo_7580',
+  'foo_7581',
+  'foo_7582',
+  'foo_7583',
+  'foo_7584',
+  'foo_7585',
+  'foo_7586',
+  'foo_7587',
+  'foo_7588',
+  'foo_7589',
+  'foo_7590',
+  'foo_7591',
+  'foo_7592',
+  'foo_7593',
+  'foo_7594',
+  'foo_7595',
+  'foo_7596',
+  'foo_7597',
+  'foo_7598',
+  'foo_7599',
+  'foo_7600',
+  'foo_7601',
+  'foo_7602',
+  'foo_7603',
+  'foo_7604',
+  'foo_7605',
+  'foo_7606',
+  'foo_7607',
+  'foo_7608',
+  'foo_7609',
+  'foo_7610',
+  'foo_7611',
+  'foo_7612',
+  'foo_7613',
+  'foo_7614',
+  'foo_7615',
+  'foo_7616',
+  'foo_7617',
+  'foo_7618',
+  'foo_7619',
+  'foo_7620',
+  'foo_7621',
+  'foo_7622',
+  'foo_7623',
+  'foo_7624',
+  'foo_7625',
+  'foo_7626',
+  'foo_7627',
+  'foo_7628',
+  'foo_7629',
+  'foo_7630',
+  'foo_7631',
+  'foo_7632',
+  'foo_7633',
+  'foo_7634',
+  'foo_7635',
+  'foo_7636',
+  'foo_7637',
+  'foo_7638',
+  'foo_7639',
+  'foo_7640',
+  'foo_7641',
+  'foo_7642',
+  'foo_7643',
+  'foo_7644',
+  'foo_7645',
+  'foo_7646',
+  'foo_7647',
+  'foo_7648',
+  'foo_7649',
+  'foo_7650',
+  'foo_7651',
+  'foo_7652',
+  'foo_7653',
+  'foo_7654',
+  'foo_7655',
+  'foo_7656',
+  'foo_7657',
+  'foo_7658',
+  'foo_7659',
+  'foo_7660',
+  'foo_7661',
+  'foo_7662',
+  'foo_7663',
+  'foo_7664',
+  'foo_7665',
+  'foo_7666',
+  'foo_7667',
+  'foo_7668',
+  'foo_7669',
+  'foo_7670',
+  'foo_7671',
+  'foo_7672',
+  'foo_7673',
+  'foo_7674',
+  'foo_7675',
+  'foo_7676',
+  'foo_7677',
+  'foo_7678',
+  'foo_7679',
+  'foo_7680',
+  'foo_7681',
+  'foo_7682',
+  'foo_7683',
+  'foo_7684',
+  'foo_7685',
+  'foo_7686',
+  'foo_7687',
+  'foo_7688',
+  'foo_7689',
+  'foo_7690',
+  'foo_7691',
+  'foo_7692',
+  'foo_7693',
+  'foo_7694',
+  'foo_7695',
+  'foo_7696',
+  'foo_7697',
+  'foo_7698',
+  'foo_7699',
+  'foo_7700',
+  'foo_7701',
+  'foo_7702',
+  'foo_7703',
+  'foo_7704',
+  'foo_7705',
+  'foo_7706',
+  'foo_7707',
+  'foo_7708',
+  'foo_7709',
+  'foo_7710',
+  'foo_7711',
+  'foo_7712',
+  'foo_7713',
+  'foo_7714',
+  'foo_7715',
+  'foo_7716',
+  'foo_7717',
+  'foo_7718',
+  'foo_7719',
+  'foo_7720',
+  'foo_7721',
+  'foo_7722',
+  'foo_7723',
+  'foo_7724',
+  'foo_7725',
+  'foo_7726',
+  'foo_7727',
+  'foo_7728',
+  'foo_7729',
+  'foo_7730',
+  'foo_7731',
+  'foo_7732',
+  'foo_7733',
+  'foo_7734',
+  'foo_7735',
+  'foo_7736',
+  'foo_7737',
+  'foo_7738',
+  'foo_7739',
+  'foo_7740',
+  'foo_7741',
+  'foo_7742',
+  'foo_7743',
+  'foo_7744',
+  'foo_7745',
+  'foo_7746',
+  'foo_7747',
+  'foo_7748',
+  'foo_7749',
+  'foo_7750',
+  'foo_7751',
+  'foo_7752',
+  'foo_7753',
+  'foo_7754',
+  'foo_7755',
+  'foo_7756',
+  'foo_7757',
+  'foo_7758',
+  'foo_7759',
+  'foo_7760',
+  'foo_7761',
+  'foo_7762',
+  'foo_7763',
+  'foo_7764',
+  'foo_7765',
+  'foo_7766',
+  'foo_7767',
+  'foo_7768',
+  'foo_7769',
+  'foo_7770',
+  'foo_7771',
+  'foo_7772',
+  'foo_7773',
+  'foo_7774',
+  'foo_7775',
+  'foo_7776',
+  'foo_7777',
+  'foo_7778',
+  'foo_7779',
+  'foo_7780',
+  'foo_7781',
+  'foo_7782',
+  'foo_7783',
+  'foo_7784',
+  'foo_7785',
+  'foo_7786',
+  'foo_7787',
+  'foo_7788',
+  'foo_7789',
+  'foo_7790',
+  'foo_7791',
+  'foo_7792',
+  'foo_7793',
+  'foo_7794',
+  'foo_7795',
+  'foo_7796',
+  'foo_7797',
+  'foo_7798',
+  'foo_7799',
+  'foo_7800',
+  'foo_7801',
+  'foo_7802',
+  'foo_7803',
+  'foo_7804',
+  'foo_7805',
+  'foo_7806',
+  'foo_7807',
+  'foo_7808',
+  'foo_7809',
+  'foo_7810',
+  'foo_7811',
+  'foo_7812',
+  'foo_7813',
+  'foo_7814',
+  'foo_7815',
+  'foo_7816',
+  'foo_7817',
+  'foo_7818',
+  'foo_7819',
+  'foo_7820',
+  'foo_7821',
+  'foo_7822',
+  'foo_7823',
+  'foo_7824',
+  'foo_7825',
+  'foo_7826',
+  'foo_7827',
+  'foo_7828',
+  'foo_7829',
+  'foo_7830',
+  'foo_7831',
+  'foo_7832',
+  'foo_7833',
+  'foo_7834',
+  'foo_7835',
+  'foo_7836',
+  'foo_7837',
+  'foo_7838',
+  'foo_7839',
+  'foo_7840',
+  'foo_7841',
+  'foo_7842',
+  'foo_7843',
+  'foo_7844',
+  'foo_7845',
+  'foo_7846',
+  'foo_7847',
+  'foo_7848',
+  'foo_7849',
+  'foo_7850',
+  'foo_7851',
+  'foo_7852',
+  'foo_7853',
+  'foo_7854',
+  'foo_7855',
+  'foo_7856',
+  'foo_7857',
+  'foo_7858',
+  'foo_7859',
+  'foo_7860',
+  'foo_7861',
+  'foo_7862',
+  'foo_7863',
+  'foo_7864',
+  'foo_7865',
+  'foo_7866',
+  'foo_7867',
+  'foo_7868',
+  'foo_7869',
+  'foo_7870',
+  'foo_7871',
+  'foo_7872',
+  'foo_7873',
+  'foo_7874',
+  'foo_7875',
+  'foo_7876',
+  'foo_7877',
+  'foo_7878',
+  'foo_7879',
+  'foo_7880',
+  'foo_7881',
+  'foo_7882',
+  'foo_7883',
+  'foo_7884',
+  'foo_7885',
+  'foo_7886',
+  'foo_7887',
+  'foo_7888',
+  'foo_7889',
+  'foo_7890',
+  'foo_7891',
+  'foo_7892',
+  'foo_7893',
+  'foo_7894',
+  'foo_7895',
+  'foo_7896',
+  'foo_7897',
+  'foo_7898',
+  'foo_7899',
+  'foo_7900',
+  'foo_7901',
+  'foo_7902',
+  'foo_7903',
+  'foo_7904',
+  'foo_7905',
+  'foo_7906',
+  'foo_7907',
+  'foo_7908',
+  'foo_7909',
+  'foo_7910',
+  'foo_7911',
+  'foo_7912',
+  'foo_7913',
+  'foo_7914',
+  'foo_7915',
+  'foo_7916',
+  'foo_7917',
+  'foo_7918',
+  'foo_7919',
+  'foo_7920',
+  'foo_7921',
+  'foo_7922',
+  'foo_7923',
+  'foo_7924',
+  'foo_7925',
+  'foo_7926',
+  'foo_7927',
+  'foo_7928',
+  'foo_7929',
+  'foo_7930',
+  'foo_7931',
+  'foo_7932',
+  'foo_7933',
+  'foo_7934',
+  'foo_7935',
+  'foo_7936',
+  'foo_7937',
+  'foo_7938',
+  'foo_7939',
+  'foo_7940',
+  'foo_7941',
+  'foo_7942',
+  'foo_7943',
+  'foo_7944',
+  'foo_7945',
+  'foo_7946',
+  'foo_7947',
+  'foo_7948',
+  'foo_7949',
+  'foo_7950',
+  'foo_7951',
+  'foo_7952',
+  'foo_7953',
+  'foo_7954',
+  'foo_7955',
+  'foo_7956',
+  'foo_7957',
+  'foo_7958',
+  'foo_7959',
+  'foo_7960',
+  'foo_7961',
+  'foo_7962',
+  'foo_7963',
+  'foo_7964',
+  'foo_7965',
+  'foo_7966',
+  'foo_7967',
+  'foo_7968',
+  'foo_7969',
+  'foo_7970',
+  'foo_7971',
+  'foo_7972',
+  'foo_7973',
+  'foo_7974',
+  'foo_7975',
+  'foo_7976',
+  'foo_7977',
+  'foo_7978',
+  'foo_7979',
+  'foo_7980',
+  'foo_7981',
+  'foo_7982',
+  'foo_7983',
+  'foo_7984',
+  'foo_7985',
+  'foo_7986',
+  'foo_7987',
+  'foo_7988',
+  'foo_7989',
+  'foo_7990',
+  'foo_7991',
+  'foo_7992',
+  'foo_7993',
+  'foo_7994',
+  'foo_7995',
+  'foo_7996',
+  'foo_7997',
+  'foo_7998',
+  'foo_7999',
+  'foo_8000',
+  'foo_8001',
+  'foo_8002',
+  'foo_8003',
+  'foo_8004',
+  'foo_8005',
+  'foo_8006',
+  'foo_8007',
+  'foo_8008',
+  'foo_8009',
+  'foo_8010',
+  'foo_8011',
+  'foo_8012',
+  'foo_8013',
+  'foo_8014',
+  'foo_8015',
+  'foo_8016',
+  'foo_8017',
+  'foo_8018',
+  'foo_8019',
+  'foo_8020',
+  'foo_8021',
+  'foo_8022',
+  'foo_8023',
+  'foo_8024',
+  'foo_8025',
+  'foo_8026',
+  'foo_8027',
+  'foo_8028',
+  'foo_8029',
+  'foo_8030',
+  'foo_8031',
+  'foo_8032',
+  'foo_8033',
+  'foo_8034',
+  'foo_8035',
+  'foo_8036',
+  'foo_8037',
+  'foo_8038',
+  'foo_8039',
+  'foo_8040',
+  'foo_8041',
+  'foo_8042',
+  'foo_8043',
+  'foo_8044',
+  'foo_8045',
+  'foo_8046',
+  'foo_8047',
+  'foo_8048',
+  'foo_8049',
+  'foo_8050',
+  'foo_8051',
+  'foo_8052',
+  'foo_8053',
+  'foo_8054',
+  'foo_8055',
+  'foo_8056',
+  'foo_8057',
+  'foo_8058',
+  'foo_8059',
+  'foo_8060',
+  'foo_8061',
+  'foo_8062',
+  'foo_8063',
+  'foo_8064',
+  'foo_8065',
+  'foo_8066',
+  'foo_8067',
+  'foo_8068',
+  'foo_8069',
+  'foo_8070',
+  'foo_8071',
+  'foo_8072',
+  'foo_8073',
+  'foo_8074',
+  'foo_8075',
+  'foo_8076',
+  'foo_8077',
+  'foo_8078',
+  'foo_8079',
+  'foo_8080',
+  'foo_8081',
+  'foo_8082',
+  'foo_8083',
+  'foo_8084',
+  'foo_8085',
+  'foo_8086',
+  'foo_8087',
+  'foo_8088',
+  'foo_8089',
+  'foo_8090',
+  'foo_8091',
+  'foo_8092',
+  'foo_8093',
+  'foo_8094',
+  'foo_8095',
+  'foo_8096',
+  'foo_8097',
+  'foo_8098',
+  'foo_8099',
+  'foo_8100',
+  'foo_8101',
+  'foo_8102',
+  'foo_8103',
+  'foo_8104',
+  'foo_8105',
+  'foo_8106',
+  'foo_8107',
+  'foo_8108',
+  'foo_8109',
+  'foo_8110',
+  'foo_8111',
+  'foo_8112',
+  'foo_8113',
+  'foo_8114',
+  'foo_8115',
+  'foo_8116',
+  'foo_8117',
+  'foo_8118',
+  'foo_8119',
+  'foo_8120',
+  'foo_8121',
+  'foo_8122',
+  'foo_8123',
+  'foo_8124',
+  'foo_8125',
+  'foo_8126',
+  'foo_8127',
+  'foo_8128',
+  'foo_8129',
+  'foo_8130',
+  'foo_8131',
+  'foo_8132',
+  'foo_8133',
+  'foo_8134',
+  'foo_8135',
+  'foo_8136',
+  'foo_8137',
+  'foo_8138',
+  'foo_8139',
+  'foo_8140',
+  'foo_8141',
+  'foo_8142',
+  'foo_8143',
+  'foo_8144',
+  'foo_8145',
+  'foo_8146',
+  'foo_8147',
+  'foo_8148',
+  'foo_8149',
+  'foo_8150',
+  'foo_8151',
+  'foo_8152',
+  'foo_8153',
+  'foo_8154',
+  'foo_8155',
+  'foo_8156',
+  'foo_8157',
+  'foo_8158',
+  'foo_8159',
+  'foo_8160',
+  'foo_8161',
+  'foo_8162',
+  'foo_8163',
+  'foo_8164',
+  'foo_8165',
+  'foo_8166',
+  'foo_8167',
+  'foo_8168',
+  'foo_8169',
+  'foo_8170',
+  'foo_8171',
+  'foo_8172',
+  'foo_8173',
+  'foo_8174',
+  'foo_8175',
+  'foo_8176',
+  'foo_8177',
+  'foo_8178',
+  'foo_8179',
+  'foo_8180',
+  'foo_8181',
+  'foo_8182',
+  'foo_8183',
+  'foo_8184',
+  'foo_8185',
+  'foo_8186',
+  'foo_8187',
+  'foo_8188',
+  'foo_8189',
+  'foo_8190',
+  'foo_8191',
+  'foo_8192',
+  'foo_8193',
+  'foo_8194',
+  'foo_8195',
+  'foo_8196',
+  'foo_8197',
+  'foo_8198',
+  'foo_8199',
+  'foo_8200',
+  'foo_8201',
+  'foo_8202',
+  'foo_8203',
+  'foo_8204',
+  'foo_8205',
+  'foo_8206',
+  'foo_8207',
+  'foo_8208',
+  'foo_8209',
+  'foo_8210',
+  'foo_8211',
+  'foo_8212',
+  'foo_8213',
+  'foo_8214',
+  'foo_8215',
+  'foo_8216',
+  'foo_8217',
+  'foo_8218',
+  'foo_8219',
+  'foo_8220',
+  'foo_8221',
+  'foo_8222',
+  'foo_8223',
+  'foo_8224',
+  'foo_8225',
+  'foo_8226',
+  'foo_8227',
+  'foo_8228',
+  'foo_8229',
+  'foo_8230',
+  'foo_8231',
+  'foo_8232',
+  'foo_8233',
+  'foo_8234',
+  'foo_8235',
+  'foo_8236',
+  'foo_8237',
+  'foo_8238',
+  'foo_8239',
+  'foo_8240',
+  'foo_8241',
+  'foo_8242',
+  'foo_8243',
+  'foo_8244',
+  'foo_8245',
+  'foo_8246',
+  'foo_8247',
+  'foo_8248',
+  'foo_8249',
+  'foo_8250',
+  'foo_8251',
+  'foo_8252',
+  'foo_8253',
+  'foo_8254',
+  'foo_8255',
+  'foo_8256',
+  'foo_8257',
+  'foo_8258',
+  'foo_8259',
+  'foo_8260',
+  'foo_8261',
+  'foo_8262',
+  'foo_8263',
+  'foo_8264',
+  'foo_8265',
+  'foo_8266',
+  'foo_8267',
+  'foo_8268',
+  'foo_8269',
+  'foo_8270',
+  'foo_8271',
+  'foo_8272',
+  'foo_8273',
+  'foo_8274',
+  'foo_8275',
+  'foo_8276',
+  'foo_8277',
+  'foo_8278',
+  'foo_8279',
+  'foo_8280',
+  'foo_8281',
+  'foo_8282',
+  'foo_8283',
+  'foo_8284',
+  'foo_8285',
+  'foo_8286',
+  'foo_8287',
+  'foo_8288',
+  'foo_8289',
+  'foo_8290',
+  'foo_8291',
+  'foo_8292',
+  'foo_8293',
+  'foo_8294',
+  'foo_8295',
+  'foo_8296',
+  'foo_8297',
+  'foo_8298',
+  'foo_8299',
+  'foo_8300',
+  'foo_8301',
+  'foo_8302',
+  'foo_8303',
+  'foo_8304',
+  'foo_8305',
+  'foo_8306',
+  'foo_8307',
+  'foo_8308',
+  'foo_8309',
+  'foo_8310',
+  'foo_8311',
+  'foo_8312',
+  'foo_8313',
+  'foo_8314',
+  'foo_8315',
+  'foo_8316',
+  'foo_8317',
+  'foo_8318',
+  'foo_8319',
+  'foo_8320',
+  'foo_8321',
+  'foo_8322',
+  'foo_8323',
+  'foo_8324',
+  'foo_8325',
+  'foo_8326',
+  'foo_8327',
+  'foo_8328',
+  'foo_8329',
+  'foo_8330',
+  'foo_8331',
+  'foo_8332',
+  'foo_8333',
+  'foo_8334',
+  'foo_8335',
+  'foo_8336',
+  'foo_8337',
+  'foo_8338',
+  'foo_8339',
+  'foo_8340',
+  'foo_8341',
+  'foo_8342',
+  'foo_8343',
+  'foo_8344',
+  'foo_8345',
+  'foo_8346',
+  'foo_8347',
+  'foo_8348',
+  'foo_8349',
+  'foo_8350',
+  'foo_8351',
+  'foo_8352',
+  'foo_8353',
+  'foo_8354',
+  'foo_8355',
+  'foo_8356',
+  'foo_8357',
+  'foo_8358',
+  'foo_8359',
+  'foo_8360',
+  'foo_8361',
+  'foo_8362',
+  'foo_8363',
+  'foo_8364',
+  'foo_8365',
+  'foo_8366',
+  'foo_8367',
+  'foo_8368',
+  'foo_8369',
+  'foo_8370',
+  'foo_8371',
+  'foo_8372',
+  'foo_8373',
+  'foo_8374',
+  'foo_8375',
+  'foo_8376',
+  'foo_8377',
+  'foo_8378',
+  'foo_8379',
+  'foo_8380',
+  'foo_8381',
+  'foo_8382',
+  'foo_8383',
+  'foo_8384',
+  'foo_8385',
+  'foo_8386',
+  'foo_8387',
+  'foo_8388',
+  'foo_8389',
+  'foo_8390',
+  'foo_8391',
+  'foo_8392',
+  'foo_8393',
+  'foo_8394',
+  'foo_8395',
+  'foo_8396',
+  'foo_8397',
+  'foo_8398',
+  'foo_8399',
+  'foo_8400',
+  'foo_8401',
+  'foo_8402',
+  'foo_8403',
+  'foo_8404',
+  'foo_8405',
+  'foo_8406',
+  'foo_8407',
+  'foo_8408',
+  'foo_8409',
+  'foo_8410',
+  'foo_8411',
+  'foo_8412',
+  'foo_8413',
+  'foo_8414',
+  'foo_8415',
+  'foo_8416',
+  'foo_8417',
+  'foo_8418',
+  'foo_8419',
+  'foo_8420',
+  'foo_8421',
+  'foo_8422',
+  'foo_8423',
+  'foo_8424',
+  'foo_8425',
+  'foo_8426',
+  'foo_8427',
+  'foo_8428',
+  'foo_8429',
+  'foo_8430',
+  'foo_8431',
+  'foo_8432',
+  'foo_8433',
+  'foo_8434',
+  'foo_8435',
+  'foo_8436',
+  'foo_8437',
+  'foo_8438',
+  'foo_8439',
+  'foo_8440',
+  'foo_8441',
+  'foo_8442',
+  'foo_8443',
+  'foo_8444',
+  'foo_8445',
+  'foo_8446',
+  'foo_8447',
+  'foo_8448',
+  'foo_8449',
+  'foo_8450',
+  'foo_8451',
+  'foo_8452',
+  'foo_8453',
+  'foo_8454',
+  'foo_8455',
+  'foo_8456',
+  'foo_8457',
+  'foo_8458',
+  'foo_8459',
+  'foo_8460',
+  'foo_8461',
+  'foo_8462',
+  'foo_8463',
+  'foo_8464',
+  'foo_8465',
+  'foo_8466',
+  'foo_8467',
+  'foo_8468',
+  'foo_8469',
+  'foo_8470',
+  'foo_8471',
+  'foo_8472',
+  'foo_8473',
+  'foo_8474',
+  'foo_8475',
+  'foo_8476',
+  'foo_8477',
+  'foo_8478',
+  'foo_8479',
+  'foo_8480',
+  'foo_8481',
+  'foo_8482',
+  'foo_8483',
+  'foo_8484',
+  'foo_8485',
+  'foo_8486',
+  'foo_8487',
+  'foo_8488',
+  'foo_8489',
+  'foo_8490',
+  'foo_8491',
+  'foo_8492',
+  'foo_8493',
+  'foo_8494',
+  'foo_8495',
+  'foo_8496',
+  'foo_8497',
+  'foo_8498',
+  'foo_8499',
+  'foo_8500',
+  'foo_8501',
+  'foo_8502',
+  'foo_8503',
+  'foo_8504',
+  'foo_8505',
+  'foo_8506',
+  'foo_8507',
+  'foo_8508',
+  'foo_8509',
+  'foo_8510',
+  'foo_8511',
+  'foo_8512',
+  'foo_8513',
+  'foo_8514',
+  'foo_8515',
+  'foo_8516',
+  'foo_8517',
+  'foo_8518',
+  'foo_8519',
+  'foo_8520',
+  'foo_8521',
+  'foo_8522',
+  'foo_8523',
+  'foo_8524',
+  'foo_8525',
+  'foo_8526',
+  'foo_8527',
+  'foo_8528',
+  'foo_8529',
+  'foo_8530',
+  'foo_8531',
+  'foo_8532',
+  'foo_8533',
+  'foo_8534',
+  'foo_8535',
+  'foo_8536',
+  'foo_8537',
+  'foo_8538',
+  'foo_8539',
+  'foo_8540',
+  'foo_8541',
+  'foo_8542',
+  'foo_8543',
+  'foo_8544',
+  'foo_8545',
+  'foo_8546',
+  'foo_8547',
+  'foo_8548',
+  'foo_8549',
+  'foo_8550',
+  'foo_8551',
+  'foo_8552',
+  'foo_8553',
+  'foo_8554',
+  'foo_8555',
+  'foo_8556',
+  'foo_8557',
+  'foo_8558',
+  'foo_8559',
+  'foo_8560',
+  'foo_8561',
+  'foo_8562',
+  'foo_8563',
+  'foo_8564',
+  'foo_8565',
+  'foo_8566',
+  'foo_8567',
+  'foo_8568',
+  'foo_8569',
+  'foo_8570',
+  'foo_8571',
+  'foo_8572',
+  'foo_8573',
+  'foo_8574',
+  'foo_8575',
+  'foo_8576',
+  'foo_8577',
+  'foo_8578',
+  'foo_8579',
+  'foo_8580',
+  'foo_8581',
+  'foo_8582',
+  'foo_8583',
+  'foo_8584',
+  'foo_8585',
+  'foo_8586',
+  'foo_8587',
+  'foo_8588',
+  'foo_8589',
+  'foo_8590',
+  'foo_8591',
+  'foo_8592',
+  'foo_8593',
+  'foo_8594',
+  'foo_8595',
+  'foo_8596',
+  'foo_8597',
+  'foo_8598',
+  'foo_8599',
+  'foo_8600',
+  'foo_8601',
+  'foo_8602',
+  'foo_8603',
+  'foo_8604',
+  'foo_8605',
+  'foo_8606',
+  'foo_8607',
+  'foo_8608',
+  'foo_8609',
+  'foo_8610',
+  'foo_8611',
+  'foo_8612',
+  'foo_8613',
+  'foo_8614',
+  'foo_8615',
+  'foo_8616',
+  'foo_8617',
+  'foo_8618',
+  'foo_8619',
+  'foo_8620',
+  'foo_8621',
+  'foo_8622',
+  'foo_8623',
+  'foo_8624',
+  'foo_8625',
+  'foo_8626',
+  'foo_8627',
+  'foo_8628',
+  'foo_8629',
+  'foo_8630',
+  'foo_8631',
+  'foo_8632',
+  'foo_8633',
+  'foo_8634',
+  'foo_8635',
+  'foo_8636',
+  'foo_8637',
+  'foo_8638',
+  'foo_8639',
+  'foo_8640',
+  'foo_8641',
+  'foo_8642',
+  'foo_8643',
+  'foo_8644',
+  'foo_8645',
+  'foo_8646',
+  'foo_8647',
+  'foo_8648',
+  'foo_8649',
+  'foo_8650',
+  'foo_8651',
+  'foo_8652',
+  'foo_8653',
+  'foo_8654',
+  'foo_8655',
+  'foo_8656',
+  'foo_8657',
+  'foo_8658',
+  'foo_8659',
+  'foo_8660',
+  'foo_8661',
+  'foo_8662',
+  'foo_8663',
+  'foo_8664',
+  'foo_8665',
+  'foo_8666',
+  'foo_8667',
+  'foo_8668',
+  'foo_8669',
+  'foo_8670',
+  'foo_8671',
+  'foo_8672',
+  'foo_8673',
+  'foo_8674',
+  'foo_8675',
+  'foo_8676',
+  'foo_8677',
+  'foo_8678',
+  'foo_8679',
+  'foo_8680',
+  'foo_8681',
+  'foo_8682',
+  'foo_8683',
+  'foo_8684',
+  'foo_8685',
+  'foo_8686',
+  'foo_8687',
+  'foo_8688',
+  'foo_8689',
+  'foo_8690',
+  'foo_8691',
+  'foo_8692',
+  'foo_8693',
+  'foo_8694',
+  'foo_8695',
+  'foo_8696',
+  'foo_8697',
+  'foo_8698',
+  'foo_8699',
+  'foo_8700',
+  'foo_8701',
+  'foo_8702',
+  'foo_8703',
+  'foo_8704',
+  'foo_8705',
+  'foo_8706',
+  'foo_8707',
+  'foo_8708',
+  'foo_8709',
+  'foo_8710',
+  'foo_8711',
+  'foo_8712',
+  'foo_8713',
+  'foo_8714',
+  'foo_8715',
+  'foo_8716',
+  'foo_8717',
+  'foo_8718',
+  'foo_8719',
+  'foo_8720',
+  'foo_8721',
+  'foo_8722',
+  'foo_8723',
+  'foo_8724',
+  'foo_8725',
+  'foo_8726',
+  'foo_8727',
+  'foo_8728',
+  'foo_8729',
+  'foo_8730',
+  'foo_8731',
+  'foo_8732',
+  'foo_8733',
+  'foo_8734',
+  'foo_8735',
+  'foo_8736',
+  'foo_8737',
+  'foo_8738',
+  'foo_8739',
+  'foo_8740',
+  'foo_8741',
+  'foo_8742',
+  'foo_8743',
+  'foo_8744',
+  'foo_8745',
+  'foo_8746',
+  'foo_8747',
+  'foo_8748',
+  'foo_8749',
+  'foo_8750',
+  'foo_8751',
+  'foo_8752',
+  'foo_8753',
+  'foo_8754',
+  'foo_8755',
+  'foo_8756',
+  'foo_8757',
+  'foo_8758',
+  'foo_8759',
+  'foo_8760',
+  'foo_8761',
+  'foo_8762',
+  'foo_8763',
+  'foo_8764',
+  'foo_8765',
+  'foo_8766',
+  'foo_8767',
+  'foo_8768',
+  'foo_8769',
+  'foo_8770',
+  'foo_8771',
+  'foo_8772',
+  'foo_8773',
+  'foo_8774',
+  'foo_8775',
+  'foo_8776',
+  'foo_8777',
+  'foo_8778',
+  'foo_8779',
+  'foo_8780',
+  'foo_8781',
+  'foo_8782',
+  'foo_8783',
+  'foo_8784',
+  'foo_8785',
+  'foo_8786',
+  'foo_8787',
+  'foo_8788',
+  'foo_8789',
+  'foo_8790',
+  'foo_8791',
+  'foo_8792',
+  'foo_8793',
+  'foo_8794',
+  'foo_8795',
+  'foo_8796',
+  'foo_8797',
+  'foo_8798',
+  'foo_8799',
+  'foo_8800',
+  'foo_8801',
+  'foo_8802',
+  'foo_8803',
+  'foo_8804',
+  'foo_8805',
+  'foo_8806',
+  'foo_8807',
+  'foo_8808',
+  'foo_8809',
+  'foo_8810',
+  'foo_8811',
+  'foo_8812',
+  'foo_8813',
+  'foo_8814',
+  'foo_8815',
+  'foo_8816',
+  'foo_8817',
+  'foo_8818',
+  'foo_8819',
+  'foo_8820',
+  'foo_8821',
+  'foo_8822',
+  'foo_8823',
+  'foo_8824',
+  'foo_8825',
+  'foo_8826',
+  'foo_8827',
+  'foo_8828',
+  'foo_8829',
+  'foo_8830',
+  'foo_8831',
+  'foo_8832',
+  'foo_8833',
+  'foo_8834',
+  'foo_8835',
+  'foo_8836',
+  'foo_8837',
+  'foo_8838',
+  'foo_8839',
+  'foo_8840',
+  'foo_8841',
+  'foo_8842',
+  'foo_8843',
+  'foo_8844',
+  'foo_8845',
+  'foo_8846',
+  'foo_8847',
+  'foo_8848',
+  'foo_8849',
+  'foo_8850',
+  'foo_8851',
+  'foo_8852',
+  'foo_8853',
+  'foo_8854',
+  'foo_8855',
+  'foo_8856',
+  'foo_8857',
+  'foo_8858',
+  'foo_8859',
+  'foo_8860',
+  'foo_8861',
+  'foo_8862',
+  'foo_8863',
+  'foo_8864',
+  'foo_8865',
+  'foo_8866',
+  'foo_8867',
+  'foo_8868',
+  'foo_8869',
+  'foo_8870',
+  'foo_8871',
+  'foo_8872',
+  'foo_8873',
+  'foo_8874',
+  'foo_8875',
+  'foo_8876',
+  'foo_8877',
+  'foo_8878',
+  'foo_8879',
+  'foo_8880',
+  'foo_8881',
+  'foo_8882',
+  'foo_8883',
+  'foo_8884',
+  'foo_8885',
+  'foo_8886',
+  'foo_8887',
+  'foo_8888',
+  'foo_8889',
+  'foo_8890',
+  'foo_8891',
+  'foo_8892',
+  'foo_8893',
+  'foo_8894',
+  'foo_8895',
+  'foo_8896',
+  'foo_8897',
+  'foo_8898',
+  'foo_8899',
+  'foo_8900',
+  'foo_8901',
+  'foo_8902',
+  'foo_8903',
+  'foo_8904',
+  'foo_8905',
+  'foo_8906',
+  'foo_8907',
+  'foo_8908',
+  'foo_8909',
+  'foo_8910',
+  'foo_8911',
+  'foo_8912',
+  'foo_8913',
+  'foo_8914',
+  'foo_8915',
+  'foo_8916',
+  'foo_8917',
+  'foo_8918',
+  'foo_8919',
+  'foo_8920',
+  'foo_8921',
+  'foo_8922',
+  'foo_8923',
+  'foo_8924',
+  'foo_8925',
+  'foo_8926',
+  'foo_8927',
+  'foo_8928',
+  'foo_8929',
+  'foo_8930',
+  'foo_8931',
+  'foo_8932',
+  'foo_8933',
+  'foo_8934',
+  'foo_8935',
+  'foo_8936',
+  'foo_8937',
+  'foo_8938',
+  'foo_8939',
+  'foo_8940',
+  'foo_8941',
+  'foo_8942',
+  'foo_8943',
+  'foo_8944',
+  'foo_8945',
+  'foo_8946',
+  'foo_8947',
+  'foo_8948',
+  'foo_8949',
+  'foo_8950',
+  'foo_8951',
+  'foo_8952',
+  'foo_8953',
+  'foo_8954',
+  'foo_8955',
+  'foo_8956',
+  'foo_8957',
+  'foo_8958',
+  'foo_8959',
+  'foo_8960',
+  'foo_8961',
+  'foo_8962',
+  'foo_8963',
+  'foo_8964',
+  'foo_8965',
+  'foo_8966',
+  'foo_8967',
+  'foo_8968',
+  'foo_8969',
+  'foo_8970',
+  'foo_8971',
+  'foo_8972',
+  'foo_8973',
+  'foo_8974',
+  'foo_8975',
+  'foo_8976',
+  'foo_8977',
+  'foo_8978',
+  'foo_8979',
+  'foo_8980',
+  'foo_8981',
+  'foo_8982',
+  'foo_8983',
+  'foo_8984',
+  'foo_8985',
+  'foo_8986',
+  'foo_8987',
+  'foo_8988',
+  'foo_8989',
+  'foo_8990',
+  'foo_8991',
+  'foo_8992',
+  'foo_8993',
+  'foo_8994',
+  'foo_8995',
+  'foo_8996',
+  'foo_8997',
+  'foo_8998',
+  'foo_8999',
+  'foo_9000',
+  'foo_9001',
+  'foo_9002',
+  'foo_9003',
+  'foo_9004',
+  'foo_9005',
+  'foo_9006',
+  'foo_9007',
+  'foo_9008',
+  'foo_9009',
+  'foo_9010',
+  'foo_9011',
+  'foo_9012',
+  'foo_9013',
+  'foo_9014',
+  'foo_9015',
+  'foo_9016',
+  'foo_9017',
+  'foo_9018',
+  'foo_9019',
+  'foo_9020',
+  'foo_9021',
+  'foo_9022',
+  'foo_9023',
+  'foo_9024',
+  'foo_9025',
+  'foo_9026',
+  'foo_9027',
+  'foo_9028',
+  'foo_9029',
+  'foo_9030',
+  'foo_9031',
+  'foo_9032',
+  'foo_9033',
+  'foo_9034',
+  'foo_9035',
+  'foo_9036',
+  'foo_9037',
+  'foo_9038',
+  'foo_9039',
+  'foo_9040',
+  'foo_9041',
+  'foo_9042',
+  'foo_9043',
+  'foo_9044',
+  'foo_9045',
+  'foo_9046',
+  'foo_9047',
+  'foo_9048',
+  'foo_9049',
+  'foo_9050',
+  'foo_9051',
+  'foo_9052',
+  'foo_9053',
+  'foo_9054',
+  'foo_9055',
+  'foo_9056',
+  'foo_9057',
+  'foo_9058',
+  'foo_9059',
+  'foo_9060',
+  'foo_9061',
+  'foo_9062',
+  'foo_9063',
+  'foo_9064',
+  'foo_9065',
+  'foo_9066',
+  'foo_9067',
+  'foo_9068',
+  'foo_9069',
+  'foo_9070',
+  'foo_9071',
+  'foo_9072',
+  'foo_9073',
+  'foo_9074',
+  'foo_9075',
+  'foo_9076',
+  'foo_9077',
+  'foo_9078',
+  'foo_9079',
+  'foo_9080',
+  'foo_9081',
+  'foo_9082',
+  'foo_9083',
+  'foo_9084',
+  'foo_9085',
+  'foo_9086',
+  'foo_9087',
+  'foo_9088',
+  'foo_9089',
+  'foo_9090',
+  'foo_9091',
+  'foo_9092',
+  'foo_9093',
+  'foo_9094',
+  'foo_9095',
+  'foo_9096',
+  'foo_9097',
+  'foo_9098',
+  'foo_9099',
+  'foo_9100',
+  'foo_9101',
+  'foo_9102',
+  'foo_9103',
+  'foo_9104',
+  'foo_9105',
+  'foo_9106',
+  'foo_9107',
+  'foo_9108',
+  'foo_9109',
+  'foo_9110',
+  'foo_9111',
+  'foo_9112',
+  'foo_9113',
+  'foo_9114',
+  'foo_9115',
+  'foo_9116',
+  'foo_9117',
+  'foo_9118',
+  'foo_9119',
+  'foo_9120',
+  'foo_9121',
+  'foo_9122',
+  'foo_9123',
+  'foo_9124',
+  'foo_9125',
+  'foo_9126',
+  'foo_9127',
+  'foo_9128',
+  'foo_9129',
+  'foo_9130',
+  'foo_9131',
+  'foo_9132',
+  'foo_9133',
+  'foo_9134',
+  'foo_9135',
+  'foo_9136',
+  'foo_9137',
+  'foo_9138',
+  'foo_9139',
+  'foo_9140',
+  'foo_9141',
+  'foo_9142',
+  'foo_9143',
+  'foo_9144',
+  'foo_9145',
+  'foo_9146',
+  'foo_9147',
+  'foo_9148',
+  'foo_9149',
+  'foo_9150',
+  'foo_9151',
+  'foo_9152',
+  'foo_9153',
+  'foo_9154',
+  'foo_9155',
+  'foo_9156',
+  'foo_9157',
+  'foo_9158',
+  'foo_9159',
+  'foo_9160',
+  'foo_9161',
+  'foo_9162',
+  'foo_9163',
+  'foo_9164',
+  'foo_9165',
+  'foo_9166',
+  'foo_9167',
+  'foo_9168',
+  'foo_9169',
+  'foo_9170',
+  'foo_9171',
+  'foo_9172',
+  'foo_9173',
+  'foo_9174',
+  'foo_9175',
+  'foo_9176',
+  'foo_9177',
+  'foo_9178',
+  'foo_9179',
+  'foo_9180',
+  'foo_9181',
+  'foo_9182',
+  'foo_9183',
+  'foo_9184',
+  'foo_9185',
+  'foo_9186',
+  'foo_9187',
+  'foo_9188',
+  'foo_9189',
+  'foo_9190',
+  'foo_9191',
+  'foo_9192',
+  'foo_9193',
+  'foo_9194',
+  'foo_9195',
+  'foo_9196',
+  'foo_9197',
+  'foo_9198',
+  'foo_9199',
+  'foo_9200',
+  'foo_9201',
+  'foo_9202',
+  'foo_9203',
+  'foo_9204',
+  'foo_9205',
+  'foo_9206',
+  'foo_9207',
+  'foo_9208',
+  'foo_9209',
+  'foo_9210',
+  'foo_9211',
+  'foo_9212',
+  'foo_9213',
+  'foo_9214',
+  'foo_9215',
+  'foo_9216',
+  'foo_9217',
+  'foo_9218',
+  'foo_9219',
+  'foo_9220',
+  'foo_9221',
+  'foo_9222',
+  'foo_9223',
+  'foo_9224',
+  'foo_9225',
+  'foo_9226',
+  'foo_9227',
+  'foo_9228',
+  'foo_9229',
+  'foo_9230',
+  'foo_9231',
+  'foo_9232',
+  'foo_9233',
+  'foo_9234',
+  'foo_9235',
+  'foo_9236',
+  'foo_9237',
+  'foo_9238',
+  'foo_9239',
+  'foo_9240',
+  'foo_9241',
+  'foo_9242',
+  'foo_9243',
+  'foo_9244',
+  'foo_9245',
+  'foo_9246',
+  'foo_9247',
+  'foo_9248',
+  'foo_9249',
+  'foo_9250',
+  'foo_9251',
+  'foo_9252',
+  'foo_9253',
+  'foo_9254',
+  'foo_9255',
+  'foo_9256',
+  'foo_9257',
+  'foo_9258',
+  'foo_9259',
+  'foo_9260',
+  'foo_9261',
+  'foo_9262',
+  'foo_9263',
+  'foo_9264',
+  'foo_9265',
+  'foo_9266',
+  'foo_9267',
+  'foo_9268',
+  'foo_9269',
+  'foo_9270',
+  'foo_9271',
+  'foo_9272',
+  'foo_9273',
+  'foo_9274',
+  'foo_9275',
+  'foo_9276',
+  'foo_9277',
+  'foo_9278',
+  'foo_9279',
+  'foo_9280',
+  'foo_9281',
+  'foo_9282',
+  'foo_9283',
+  'foo_9284',
+  'foo_9285',
+  'foo_9286',
+  'foo_9287',
+  'foo_9288',
+  'foo_9289',
+  'foo_9290',
+  'foo_9291',
+  'foo_9292',
+  'foo_9293',
+  'foo_9294',
+  'foo_9295',
+  'foo_9296',
+  'foo_9297',
+  'foo_9298',
+  'foo_9299',
+  'foo_9300',
+  'foo_9301',
+  'foo_9302',
+  'foo_9303',
+  'foo_9304',
+  'foo_9305',
+  'foo_9306',
+  'foo_9307',
+  'foo_9308',
+  'foo_9309',
+  'foo_9310',
+  'foo_9311',
+  'foo_9312',
+  'foo_9313',
+  'foo_9314',
+  'foo_9315',
+  'foo_9316',
+  'foo_9317',
+  'foo_9318',
+  'foo_9319',
+  'foo_9320',
+  'foo_9321',
+  'foo_9322',
+  'foo_9323',
+  'foo_9324',
+  'foo_9325',
+  'foo_9326',
+  'foo_9327',
+  'foo_9328',
+  'foo_9329',
+  'foo_9330',
+  'foo_9331',
+  'foo_9332',
+  'foo_9333',
+  'foo_9334',
+  'foo_9335',
+  'foo_9336',
+  'foo_9337',
+  'foo_9338',
+  'foo_9339',
+  'foo_9340',
+  'foo_9341',
+  'foo_9342',
+  'foo_9343',
+  'foo_9344',
+  'foo_9345',
+  'foo_9346',
+  'foo_9347',
+  'foo_9348',
+  'foo_9349',
+  'foo_9350',
+  'foo_9351',
+  'foo_9352',
+  'foo_9353',
+  'foo_9354',
+  'foo_9355',
+  'foo_9356',
+  'foo_9357',
+  'foo_9358',
+  'foo_9359',
+  'foo_9360',
+  'foo_9361',
+  'foo_9362',
+  'foo_9363',
+  'foo_9364',
+  'foo_9365',
+  'foo_9366',
+  'foo_9367',
+  'foo_9368',
+  'foo_9369',
+  'foo_9370',
+  'foo_9371',
+  'foo_9372',
+  'foo_9373',
+  'foo_9374',
+  'foo_9375',
+  'foo_9376',
+  'foo_9377',
+  'foo_9378',
+  'foo_9379',
+  'foo_9380',
+  'foo_9381',
+  'foo_9382',
+  'foo_9383',
+  'foo_9384',
+  'foo_9385',
+  'foo_9386',
+  'foo_9387',
+  'foo_9388',
+  'foo_9389',
+  'foo_9390',
+  'foo_9391',
+  'foo_9392',
+  'foo_9393',
+  'foo_9394',
+  'foo_9395',
+  'foo_9396',
+  'foo_9397',
+  'foo_9398',
+  'foo_9399',
+  'foo_9400',
+  'foo_9401',
+  'foo_9402',
+  'foo_9403',
+  'foo_9404',
+  'foo_9405',
+  'foo_9406',
+  'foo_9407',
+  'foo_9408',
+  'foo_9409',
+  'foo_9410',
+  'foo_9411',
+  'foo_9412',
+  'foo_9413',
+  'foo_9414',
+  'foo_9415',
+  'foo_9416',
+  'foo_9417',
+  'foo_9418',
+  'foo_9419',
+  'foo_9420',
+  'foo_9421',
+  'foo_9422',
+  'foo_9423',
+  'foo_9424',
+  'foo_9425',
+  'foo_9426',
+  'foo_9427',
+  'foo_9428',
+  'foo_9429',
+  'foo_9430',
+  'foo_9431',
+  'foo_9432',
+  'foo_9433',
+  'foo_9434',
+  'foo_9435',
+  'foo_9436',
+  'foo_9437',
+  'foo_9438',
+  'foo_9439',
+  'foo_9440',
+  'foo_9441',
+  'foo_9442',
+  'foo_9443',
+  'foo_9444',
+  'foo_9445',
+  'foo_9446',
+  'foo_9447',
+  'foo_9448',
+  'foo_9449',
+  'foo_9450',
+  'foo_9451',
+  'foo_9452',
+  'foo_9453',
+  'foo_9454',
+  'foo_9455',
+  'foo_9456',
+  'foo_9457',
+  'foo_9458',
+  'foo_9459',
+  'foo_9460',
+  'foo_9461',
+  'foo_9462',
+  'foo_9463',
+  'foo_9464',
+  'foo_9465',
+  'foo_9466',
+  'foo_9467',
+  'foo_9468',
+  'foo_9469',
+  'foo_9470',
+  'foo_9471',
+  'foo_9472',
+  'foo_9473',
+  'foo_9474',
+  'foo_9475',
+  'foo_9476',
+  'foo_9477',
+  'foo_9478',
+  'foo_9479',
+  'foo_9480',
+  'foo_9481',
+  'foo_9482',
+  'foo_9483',
+  'foo_9484',
+  'foo_9485',
+  'foo_9486',
+  'foo_9487',
+  'foo_9488',
+  'foo_9489',
+  'foo_9490',
+  'foo_9491',
+  'foo_9492',
+  'foo_9493',
+  'foo_9494',
+  'foo_9495',
+  'foo_9496',
+  'foo_9497',
+  'foo_9498',
+  'foo_9499',
+  'foo_9500',
+  'foo_9501',
+  'foo_9502',
+  'foo_9503',
+  'foo_9504',
+  'foo_9505',
+  'foo_9506',
+  'foo_9507',
+  'foo_9508',
+  'foo_9509',
+  'foo_9510',
+  'foo_9511',
+  'foo_9512',
+  'foo_9513',
+  'foo_9514',
+  'foo_9515',
+  'foo_9516',
+  'foo_9517',
+  'foo_9518',
+  'foo_9519',
+  'foo_9520',
+  'foo_9521',
+  'foo_9522',
+  'foo_9523',
+  'foo_9524',
+  'foo_9525',
+  'foo_9526',
+  'foo_9527',
+  'foo_9528',
+  'foo_9529',
+  'foo_9530',
+  'foo_9531',
+  'foo_9532',
+  'foo_9533',
+  'foo_9534',
+  'foo_9535',
+  'foo_9536',
+  'foo_9537',
+  'foo_9538',
+  'foo_9539',
+  'foo_9540',
+  'foo_9541',
+  'foo_9542',
+  'foo_9543',
+  'foo_9544',
+  'foo_9545',
+  'foo_9546',
+  'foo_9547',
+  'foo_9548',
+  'foo_9549',
+  'foo_9550',
+  'foo_9551',
+  'foo_9552',
+  'foo_9553',
+  'foo_9554',
+  'foo_9555',
+  'foo_9556',
+  'foo_9557',
+  'foo_9558',
+  'foo_9559',
+  'foo_9560',
+  'foo_9561',
+  'foo_9562',
+  'foo_9563',
+  'foo_9564',
+  'foo_9565',
+  'foo_9566',
+  'foo_9567',
+  'foo_9568',
+  'foo_9569',
+  'foo_9570',
+  'foo_9571',
+  'foo_9572',
+  'foo_9573',
+  'foo_9574',
+  'foo_9575',
+  'foo_9576',
+  'foo_9577',
+  'foo_9578',
+  'foo_9579',
+  'foo_9580',
+  'foo_9581',
+  'foo_9582',
+  'foo_9583',
+  'foo_9584',
+  'foo_9585',
+  'foo_9586',
+  'foo_9587',
+  'foo_9588',
+  'foo_9589',
+  'foo_9590',
+  'foo_9591',
+  'foo_9592',
+  'foo_9593',
+  'foo_9594',
+  'foo_9595',
+  'foo_9596',
+  'foo_9597',
+  'foo_9598',
+  'foo_9599',
+  'foo_9600',
+  'foo_9601',
+  'foo_9602',
+  'foo_9603',
+  'foo_9604',
+  'foo_9605',
+  'foo_9606',
+  'foo_9607',
+  'foo_9608',
+  'foo_9609',
+  'foo_9610',
+  'foo_9611',
+  'foo_9612',
+  'foo_9613',
+  'foo_9614',
+  'foo_9615',
+  'foo_9616',
+  'foo_9617',
+  'foo_9618',
+  'foo_9619',
+  'foo_9620',
+  'foo_9621',
+  'foo_9622',
+  'foo_9623',
+  'foo_9624',
+  'foo_9625',
+  'foo_9626',
+  'foo_9627',
+  'foo_9628',
+  'foo_9629',
+  'foo_9630',
+  'foo_9631',
+  'foo_9632',
+  'foo_9633',
+  'foo_9634',
+  'foo_9635',
+  'foo_9636',
+  'foo_9637',
+  'foo_9638',
+  'foo_9639',
+  'foo_9640',
+  'foo_9641',
+  'foo_9642',
+  'foo_9643',
+  'foo_9644',
+  'foo_9645',
+  'foo_9646',
+  'foo_9647',
+  'foo_9648',
+  'foo_9649',
+  'foo_9650',
+  'foo_9651',
+  'foo_9652',
+  'foo_9653',
+  'foo_9654',
+  'foo_9655',
+  'foo_9656',
+  'foo_9657',
+  'foo_9658',
+  'foo_9659',
+  'foo_9660',
+  'foo_9661',
+  'foo_9662',
+  'foo_9663',
+  'foo_9664',
+  'foo_9665',
+  'foo_9666',
+  'foo_9667',
+  'foo_9668',
+  'foo_9669',
+  'foo_9670',
+  'foo_9671',
+  'foo_9672',
+  'foo_9673',
+  'foo_9674',
+  'foo_9675',
+  'foo_9676',
+  'foo_9677',
+  'foo_9678',
+  'foo_9679',
+  'foo_9680',
+  'foo_9681',
+  'foo_9682',
+  'foo_9683',
+  'foo_9684',
+  'foo_9685',
+  'foo_9686',
+  'foo_9687',
+  'foo_9688',
+  'foo_9689',
+  'foo_9690',
+  'foo_9691',
+  'foo_9692',
+  'foo_9693',
+  'foo_9694',
+  'foo_9695',
+  'foo_9696',
+  'foo_9697',
+  'foo_9698',
+  'foo_9699',
+  'foo_9700',
+  'foo_9701',
+  'foo_9702',
+  'foo_9703',
+  'foo_9704',
+  'foo_9705',
+  'foo_9706',
+  'foo_9707',
+  'foo_9708',
+  'foo_9709',
+  'foo_9710',
+  'foo_9711',
+  'foo_9712',
+  'foo_9713',
+  'foo_9714',
+  'foo_9715',
+  'foo_9716',
+  'foo_9717',
+  'foo_9718',
+  'foo_9719',
+  'foo_9720',
+  'foo_9721',
+  'foo_9722',
+  'foo_9723',
+  'foo_9724',
+  'foo_9725',
+  'foo_9726',
+  'foo_9727',
+  'foo_9728',
+  'foo_9729',
+  'foo_9730',
+  'foo_9731',
+  'foo_9732',
+  'foo_9733',
+  'foo_9734',
+  'foo_9735',
+  'foo_9736',
+  'foo_9737',
+  'foo_9738',
+  'foo_9739',
+  'foo_9740',
+  'foo_9741',
+  'foo_9742',
+  'foo_9743',
+  'foo_9744',
+  'foo_9745',
+  'foo_9746',
+  'foo_9747',
+  'foo_9748',
+  'foo_9749',
+  'foo_9750',
+  'foo_9751',
+  'foo_9752',
+  'foo_9753',
+  'foo_9754',
+  'foo_9755',
+  'foo_9756',
+  'foo_9757',
+  'foo_9758',
+  'foo_9759',
+  'foo_9760',
+  'foo_9761',
+  'foo_9762',
+  'foo_9763',
+  'foo_9764',
+  'foo_9765',
+  'foo_9766',
+  'foo_9767',
+  'foo_9768',
+  'foo_9769',
+  'foo_9770',
+  'foo_9771',
+  'foo_9772',
+  'foo_9773',
+  'foo_9774',
+  'foo_9775',
+  'foo_9776',
+  'foo_9777',
+  'foo_9778',
+  'foo_9779',
+  'foo_9780',
+  'foo_9781',
+  'foo_9782',
+  'foo_9783',
+  'foo_9784',
+  'foo_9785',
+  'foo_9786',
+  'foo_9787',
+  'foo_9788',
+  'foo_9789',
+  'foo_9790',
+  'foo_9791',
+  'foo_9792',
+  'foo_9793',
+  'foo_9794',
+  'foo_9795',
+  'foo_9796',
+  'foo_9797',
+  'foo_9798',
+  'foo_9799',
+  'foo_9800',
+  'foo_9801',
+  'foo_9802',
+  'foo_9803',
+  'foo_9804',
+  'foo_9805',
+  'foo_9806',
+  'foo_9807',
+  'foo_9808',
+  'foo_9809',
+  'foo_9810',
+  'foo_9811',
+  'foo_9812',
+  'foo_9813',
+  'foo_9814',
+  'foo_9815',
+  'foo_9816',
+  'foo_9817',
+  'foo_9818',
+  'foo_9819',
+  'foo_9820',
+  'foo_9821',
+  'foo_9822',
+  'foo_9823',
+  'foo_9824',
+  'foo_9825',
+  'foo_9826',
+  'foo_9827',
+  'foo_9828',
+  'foo_9829',
+  'foo_9830',
+  'foo_9831',
+  'foo_9832',
+  'foo_9833',
+  'foo_9834',
+  'foo_9835',
+  'foo_9836',
+  'foo_9837',
+  'foo_9838',
+  'foo_9839',
+  'foo_9840',
+  'foo_9841',
+  'foo_9842',
+  'foo_9843',
+  'foo_9844',
+  'foo_9845',
+  'foo_9846',
+  'foo_9847',
+  'foo_9848',
+  'foo_9849',
+  'foo_9850',
+  'foo_9851',
+  'foo_9852',
+  'foo_9853',
+  'foo_9854',
+  'foo_9855',
+  'foo_9856',
+  'foo_9857',
+  'foo_9858',
+  'foo_9859',
+  'foo_9860',
+  'foo_9861',
+  'foo_9862',
+  'foo_9863',
+  'foo_9864',
+  'foo_9865',
+  'foo_9866',
+  'foo_9867',
+  'foo_9868',
+  'foo_9869',
+  'foo_9870',
+  'foo_9871',
+  'foo_9872',
+  'foo_9873',
+  'foo_9874',
+  'foo_9875',
+  'foo_9876',
+  'foo_9877',
+  'foo_9878',
+  'foo_9879',
+  'foo_9880',
+  'foo_9881',
+  'foo_9882',
+  'foo_9883',
+  'foo_9884',
+  'foo_9885',
+  'foo_9886',
+  'foo_9887',
+  'foo_9888',
+  'foo_9889',
+  'foo_9890',
+  'foo_9891',
+  'foo_9892',
+  'foo_9893',
+  'foo_9894',
+  'foo_9895',
+  'foo_9896',
+  'foo_9897',
+  'foo_9898',
+  'foo_9899',
+  'foo_9900',
+  'foo_9901',
+  'foo_9902',
+  'foo_9903',
+  'foo_9904',
+  'foo_9905',
+  'foo_9906',
+  'foo_9907',
+  'foo_9908',
+  'foo_9909',
+  'foo_9910',
+  'foo_9911',
+  'foo_9912',
+  'foo_9913',
+  'foo_9914',
+  'foo_9915',
+  'foo_9916',
+  'foo_9917',
+  'foo_9918',
+  'foo_9919',
+  'foo_9920',
+  'foo_9921',
+  'foo_9922',
+  'foo_9923',
+  'foo_9924',
+  'foo_9925',
+  'foo_9926',
+  'foo_9927',
+  'foo_9928',
+  'foo_9929',
+  'foo_9930',
+  'foo_9931',
+  'foo_9932',
+  'foo_9933',
+  'foo_9934',
+  'foo_9935',
+  'foo_9936',
+  'foo_9937',
+  'foo_9938',
+  'foo_9939',
+  'foo_9940',
+  'foo_9941',
+  'foo_9942',
+  'foo_9943',
+  'foo_9944',
+  'foo_9945',
+  'foo_9946',
+  'foo_9947',
+  'foo_9948',
+  'foo_9949',
+  'foo_9950',
+  'foo_9951',
+  'foo_9952',
+  'foo_9953',
+  'foo_9954',
+  'foo_9955',
+  'foo_9956',
+  'foo_9957',
+  'foo_9958',
+  'foo_9959',
+  'foo_9960',
+  'foo_9961',
+  'foo_9962',
+  'foo_9963',
+  'foo_9964',
+  'foo_9965',
+  'foo_9966',
+  'foo_9967',
+  'foo_9968',
+  'foo_9969',
+  'foo_9970',
+  'foo_9971',
+  'foo_9972',
+  'foo_9973',
+  'foo_9974',
+  'foo_9975',
+  'foo_9976',
+  'foo_9977',
+  'foo_9978',
+  'foo_9979',
+  'foo_9980',
+  'foo_9981',
+  'foo_9982',
+  'foo_9983',
+  'foo_9984',
+  'foo_9985',
+  'foo_9986',
+  'foo_9987',
+  'foo_9988',
+  'foo_9989',
+  'foo_9990',
+  'foo_9991',
+  'foo_9992',
+  'foo_9993',
+  'foo_9994',
+  'foo_9995',
+  'foo_9996',
+  'foo_9997',
+  'foo_9998',
+  'foo_9999',
+};
diff --git a/tests/language/set_literals/const_big_set_literal_test.dart b/tests/language/set_literals/const_big_set_literal_test.dart
new file mode 100644
index 0000000..f2cb67d
--- /dev/null
+++ b/tests/language/set_literals/const_big_set_literal_test.dart
@@ -0,0 +1,20028 @@
+// Copyright (c) 2020, 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:expect/expect.dart";
+
+void main() {
+  Expect.equals(10000, intSet.length);
+  Iterator<int> intIterator = intSet.iterator;
+  for (int i = 0; i < 10000; i++) {
+    Expect.equals(true, intIterator.moveNext());
+    Expect.equals(i, intIterator.current);
+  }
+  Expect.equals(false, intIterator.moveNext());
+
+  Expect.equals(10000, stringSet.length);
+  Iterator<String> stringIterator = stringSet.iterator;
+  for (int i = 0; i < 10000; i++) {
+    Expect.equals(true, stringIterator.moveNext());
+    Expect.equals("foo_$i", stringIterator.current);
+  }
+  Expect.equals(false, stringIterator.moveNext());
+}
+
+const Set<int> intSet = {
+  0,
+  1,
+  2,
+  3,
+  4,
+  5,
+  6,
+  7,
+  8,
+  9,
+  10,
+  11,
+  12,
+  13,
+  14,
+  15,
+  16,
+  17,
+  18,
+  19,
+  20,
+  21,
+  22,
+  23,
+  24,
+  25,
+  26,
+  27,
+  28,
+  29,
+  30,
+  31,
+  32,
+  33,
+  34,
+  35,
+  36,
+  37,
+  38,
+  39,
+  40,
+  41,
+  42,
+  43,
+  44,
+  45,
+  46,
+  47,
+  48,
+  49,
+  50,
+  51,
+  52,
+  53,
+  54,
+  55,
+  56,
+  57,
+  58,
+  59,
+  60,
+  61,
+  62,
+  63,
+  64,
+  65,
+  66,
+  67,
+  68,
+  69,
+  70,
+  71,
+  72,
+  73,
+  74,
+  75,
+  76,
+  77,
+  78,
+  79,
+  80,
+  81,
+  82,
+  83,
+  84,
+  85,
+  86,
+  87,
+  88,
+  89,
+  90,
+  91,
+  92,
+  93,
+  94,
+  95,
+  96,
+  97,
+  98,
+  99,
+  100,
+  101,
+  102,
+  103,
+  104,
+  105,
+  106,
+  107,
+  108,
+  109,
+  110,
+  111,
+  112,
+  113,
+  114,
+  115,
+  116,
+  117,
+  118,
+  119,
+  120,
+  121,
+  122,
+  123,
+  124,
+  125,
+  126,
+  127,
+  128,
+  129,
+  130,
+  131,
+  132,
+  133,
+  134,
+  135,
+  136,
+  137,
+  138,
+  139,
+  140,
+  141,
+  142,
+  143,
+  144,
+  145,
+  146,
+  147,
+  148,
+  149,
+  150,
+  151,
+  152,
+  153,
+  154,
+  155,
+  156,
+  157,
+  158,
+  159,
+  160,
+  161,
+  162,
+  163,
+  164,
+  165,
+  166,
+  167,
+  168,
+  169,
+  170,
+  171,
+  172,
+  173,
+  174,
+  175,
+  176,
+  177,
+  178,
+  179,
+  180,
+  181,
+  182,
+  183,
+  184,
+  185,
+  186,
+  187,
+  188,
+  189,
+  190,
+  191,
+  192,
+  193,
+  194,
+  195,
+  196,
+  197,
+  198,
+  199,
+  200,
+  201,
+  202,
+  203,
+  204,
+  205,
+  206,
+  207,
+  208,
+  209,
+  210,
+  211,
+  212,
+  213,
+  214,
+  215,
+  216,
+  217,
+  218,
+  219,
+  220,
+  221,
+  222,
+  223,
+  224,
+  225,
+  226,
+  227,
+  228,
+  229,
+  230,
+  231,
+  232,
+  233,
+  234,
+  235,
+  236,
+  237,
+  238,
+  239,
+  240,
+  241,
+  242,
+  243,
+  244,
+  245,
+  246,
+  247,
+  248,
+  249,
+  250,
+  251,
+  252,
+  253,
+  254,
+  255,
+  256,
+  257,
+  258,
+  259,
+  260,
+  261,
+  262,
+  263,
+  264,
+  265,
+  266,
+  267,
+  268,
+  269,
+  270,
+  271,
+  272,
+  273,
+  274,
+  275,
+  276,
+  277,
+  278,
+  279,
+  280,
+  281,
+  282,
+  283,
+  284,
+  285,
+  286,
+  287,
+  288,
+  289,
+  290,
+  291,
+  292,
+  293,
+  294,
+  295,
+  296,
+  297,
+  298,
+  299,
+  300,
+  301,
+  302,
+  303,
+  304,
+  305,
+  306,
+  307,
+  308,
+  309,
+  310,
+  311,
+  312,
+  313,
+  314,
+  315,
+  316,
+  317,
+  318,
+  319,
+  320,
+  321,
+  322,
+  323,
+  324,
+  325,
+  326,
+  327,
+  328,
+  329,
+  330,
+  331,
+  332,
+  333,
+  334,
+  335,
+  336,
+  337,
+  338,
+  339,
+  340,
+  341,
+  342,
+  343,
+  344,
+  345,
+  346,
+  347,
+  348,
+  349,
+  350,
+  351,
+  352,
+  353,
+  354,
+  355,
+  356,
+  357,
+  358,
+  359,
+  360,
+  361,
+  362,
+  363,
+  364,
+  365,
+  366,
+  367,
+  368,
+  369,
+  370,
+  371,
+  372,
+  373,
+  374,
+  375,
+  376,
+  377,
+  378,
+  379,
+  380,
+  381,
+  382,
+  383,
+  384,
+  385,
+  386,
+  387,
+  388,
+  389,
+  390,
+  391,
+  392,
+  393,
+  394,
+  395,
+  396,
+  397,
+  398,
+  399,
+  400,
+  401,
+  402,
+  403,
+  404,
+  405,
+  406,
+  407,
+  408,
+  409,
+  410,
+  411,
+  412,
+  413,
+  414,
+  415,
+  416,
+  417,
+  418,
+  419,
+  420,
+  421,
+  422,
+  423,
+  424,
+  425,
+  426,
+  427,
+  428,
+  429,
+  430,
+  431,
+  432,
+  433,
+  434,
+  435,
+  436,
+  437,
+  438,
+  439,
+  440,
+  441,
+  442,
+  443,
+  444,
+  445,
+  446,
+  447,
+  448,
+  449,
+  450,
+  451,
+  452,
+  453,
+  454,
+  455,
+  456,
+  457,
+  458,
+  459,
+  460,
+  461,
+  462,
+  463,
+  464,
+  465,
+  466,
+  467,
+  468,
+  469,
+  470,
+  471,
+  472,
+  473,
+  474,
+  475,
+  476,
+  477,
+  478,
+  479,
+  480,
+  481,
+  482,
+  483,
+  484,
+  485,
+  486,
+  487,
+  488,
+  489,
+  490,
+  491,
+  492,
+  493,
+  494,
+  495,
+  496,
+  497,
+  498,
+  499,
+  500,
+  501,
+  502,
+  503,
+  504,
+  505,
+  506,
+  507,
+  508,
+  509,
+  510,
+  511,
+  512,
+  513,
+  514,
+  515,
+  516,
+  517,
+  518,
+  519,
+  520,
+  521,
+  522,
+  523,
+  524,
+  525,
+  526,
+  527,
+  528,
+  529,
+  530,
+  531,
+  532,
+  533,
+  534,
+  535,
+  536,
+  537,
+  538,
+  539,
+  540,
+  541,
+  542,
+  543,
+  544,
+  545,
+  546,
+  547,
+  548,
+  549,
+  550,
+  551,
+  552,
+  553,
+  554,
+  555,
+  556,
+  557,
+  558,
+  559,
+  560,
+  561,
+  562,
+  563,
+  564,
+  565,
+  566,
+  567,
+  568,
+  569,
+  570,
+  571,
+  572,
+  573,
+  574,
+  575,
+  576,
+  577,
+  578,
+  579,
+  580,
+  581,
+  582,
+  583,
+  584,
+  585,
+  586,
+  587,
+  588,
+  589,
+  590,
+  591,
+  592,
+  593,
+  594,
+  595,
+  596,
+  597,
+  598,
+  599,
+  600,
+  601,
+  602,
+  603,
+  604,
+  605,
+  606,
+  607,
+  608,
+  609,
+  610,
+  611,
+  612,
+  613,
+  614,
+  615,
+  616,
+  617,
+  618,
+  619,
+  620,
+  621,
+  622,
+  623,
+  624,
+  625,
+  626,
+  627,
+  628,
+  629,
+  630,
+  631,
+  632,
+  633,
+  634,
+  635,
+  636,
+  637,
+  638,
+  639,
+  640,
+  641,
+  642,
+  643,
+  644,
+  645,
+  646,
+  647,
+  648,
+  649,
+  650,
+  651,
+  652,
+  653,
+  654,
+  655,
+  656,
+  657,
+  658,
+  659,
+  660,
+  661,
+  662,
+  663,
+  664,
+  665,
+  666,
+  667,
+  668,
+  669,
+  670,
+  671,
+  672,
+  673,
+  674,
+  675,
+  676,
+  677,
+  678,
+  679,
+  680,
+  681,
+  682,
+  683,
+  684,
+  685,
+  686,
+  687,
+  688,
+  689,
+  690,
+  691,
+  692,
+  693,
+  694,
+  695,
+  696,
+  697,
+  698,
+  699,
+  700,
+  701,
+  702,
+  703,
+  704,
+  705,
+  706,
+  707,
+  708,
+  709,
+  710,
+  711,
+  712,
+  713,
+  714,
+  715,
+  716,
+  717,
+  718,
+  719,
+  720,
+  721,
+  722,
+  723,
+  724,
+  725,
+  726,
+  727,
+  728,
+  729,
+  730,
+  731,
+  732,
+  733,
+  734,
+  735,
+  736,
+  737,
+  738,
+  739,
+  740,
+  741,
+  742,
+  743,
+  744,
+  745,
+  746,
+  747,
+  748,
+  749,
+  750,
+  751,
+  752,
+  753,
+  754,
+  755,
+  756,
+  757,
+  758,
+  759,
+  760,
+  761,
+  762,
+  763,
+  764,
+  765,
+  766,
+  767,
+  768,
+  769,
+  770,
+  771,
+  772,
+  773,
+  774,
+  775,
+  776,
+  777,
+  778,
+  779,
+  780,
+  781,
+  782,
+  783,
+  784,
+  785,
+  786,
+  787,
+  788,
+  789,
+  790,
+  791,
+  792,
+  793,
+  794,
+  795,
+  796,
+  797,
+  798,
+  799,
+  800,
+  801,
+  802,
+  803,
+  804,
+  805,
+  806,
+  807,
+  808,
+  809,
+  810,
+  811,
+  812,
+  813,
+  814,
+  815,
+  816,
+  817,
+  818,
+  819,
+  820,
+  821,
+  822,
+  823,
+  824,
+  825,
+  826,
+  827,
+  828,
+  829,
+  830,
+  831,
+  832,
+  833,
+  834,
+  835,
+  836,
+  837,
+  838,
+  839,
+  840,
+  841,
+  842,
+  843,
+  844,
+  845,
+  846,
+  847,
+  848,
+  849,
+  850,
+  851,
+  852,
+  853,
+  854,
+  855,
+  856,
+  857,
+  858,
+  859,
+  860,
+  861,
+  862,
+  863,
+  864,
+  865,
+  866,
+  867,
+  868,
+  869,
+  870,
+  871,
+  872,
+  873,
+  874,
+  875,
+  876,
+  877,
+  878,
+  879,
+  880,
+  881,
+  882,
+  883,
+  884,
+  885,
+  886,
+  887,
+  888,
+  889,
+  890,
+  891,
+  892,
+  893,
+  894,
+  895,
+  896,
+  897,
+  898,
+  899,
+  900,
+  901,
+  902,
+  903,
+  904,
+  905,
+  906,
+  907,
+  908,
+  909,
+  910,
+  911,
+  912,
+  913,
+  914,
+  915,
+  916,
+  917,
+  918,
+  919,
+  920,
+  921,
+  922,
+  923,
+  924,
+  925,
+  926,
+  927,
+  928,
+  929,
+  930,
+  931,
+  932,
+  933,
+  934,
+  935,
+  936,
+  937,
+  938,
+  939,
+  940,
+  941,
+  942,
+  943,
+  944,
+  945,
+  946,
+  947,
+  948,
+  949,
+  950,
+  951,
+  952,
+  953,
+  954,
+  955,
+  956,
+  957,
+  958,
+  959,
+  960,
+  961,
+  962,
+  963,
+  964,
+  965,
+  966,
+  967,
+  968,
+  969,
+  970,
+  971,
+  972,
+  973,
+  974,
+  975,
+  976,
+  977,
+  978,
+  979,
+  980,
+  981,
+  982,
+  983,
+  984,
+  985,
+  986,
+  987,
+  988,
+  989,
+  990,
+  991,
+  992,
+  993,
+  994,
+  995,
+  996,
+  997,
+  998,
+  999,
+  1000,
+  1001,
+  1002,
+  1003,
+  1004,
+  1005,
+  1006,
+  1007,
+  1008,
+  1009,
+  1010,
+  1011,
+  1012,
+  1013,
+  1014,
+  1015,
+  1016,
+  1017,
+  1018,
+  1019,
+  1020,
+  1021,
+  1022,
+  1023,
+  1024,
+  1025,
+  1026,
+  1027,
+  1028,
+  1029,
+  1030,
+  1031,
+  1032,
+  1033,
+  1034,
+  1035,
+  1036,
+  1037,
+  1038,
+  1039,
+  1040,
+  1041,
+  1042,
+  1043,
+  1044,
+  1045,
+  1046,
+  1047,
+  1048,
+  1049,
+  1050,
+  1051,
+  1052,
+  1053,
+  1054,
+  1055,
+  1056,
+  1057,
+  1058,
+  1059,
+  1060,
+  1061,
+  1062,
+  1063,
+  1064,
+  1065,
+  1066,
+  1067,
+  1068,
+  1069,
+  1070,
+  1071,
+  1072,
+  1073,
+  1074,
+  1075,
+  1076,
+  1077,
+  1078,
+  1079,
+  1080,
+  1081,
+  1082,
+  1083,
+  1084,
+  1085,
+  1086,
+  1087,
+  1088,
+  1089,
+  1090,
+  1091,
+  1092,
+  1093,
+  1094,
+  1095,
+  1096,
+  1097,
+  1098,
+  1099,
+  1100,
+  1101,
+  1102,
+  1103,
+  1104,
+  1105,
+  1106,
+  1107,
+  1108,
+  1109,
+  1110,
+  1111,
+  1112,
+  1113,
+  1114,
+  1115,
+  1116,
+  1117,
+  1118,
+  1119,
+  1120,
+  1121,
+  1122,
+  1123,
+  1124,
+  1125,
+  1126,
+  1127,
+  1128,
+  1129,
+  1130,
+  1131,
+  1132,
+  1133,
+  1134,
+  1135,
+  1136,
+  1137,
+  1138,
+  1139,
+  1140,
+  1141,
+  1142,
+  1143,
+  1144,
+  1145,
+  1146,
+  1147,
+  1148,
+  1149,
+  1150,
+  1151,
+  1152,
+  1153,
+  1154,
+  1155,
+  1156,
+  1157,
+  1158,
+  1159,
+  1160,
+  1161,
+  1162,
+  1163,
+  1164,
+  1165,
+  1166,
+  1167,
+  1168,
+  1169,
+  1170,
+  1171,
+  1172,
+  1173,
+  1174,
+  1175,
+  1176,
+  1177,
+  1178,
+  1179,
+  1180,
+  1181,
+  1182,
+  1183,
+  1184,
+  1185,
+  1186,
+  1187,
+  1188,
+  1189,
+  1190,
+  1191,
+  1192,
+  1193,
+  1194,
+  1195,
+  1196,
+  1197,
+  1198,
+  1199,
+  1200,
+  1201,
+  1202,
+  1203,
+  1204,
+  1205,
+  1206,
+  1207,
+  1208,
+  1209,
+  1210,
+  1211,
+  1212,
+  1213,
+  1214,
+  1215,
+  1216,
+  1217,
+  1218,
+  1219,
+  1220,
+  1221,
+  1222,
+  1223,
+  1224,
+  1225,
+  1226,
+  1227,
+  1228,
+  1229,
+  1230,
+  1231,
+  1232,
+  1233,
+  1234,
+  1235,
+  1236,
+  1237,
+  1238,
+  1239,
+  1240,
+  1241,
+  1242,
+  1243,
+  1244,
+  1245,
+  1246,
+  1247,
+  1248,
+  1249,
+  1250,
+  1251,
+  1252,
+  1253,
+  1254,
+  1255,
+  1256,
+  1257,
+  1258,
+  1259,
+  1260,
+  1261,
+  1262,
+  1263,
+  1264,
+  1265,
+  1266,
+  1267,
+  1268,
+  1269,
+  1270,
+  1271,
+  1272,
+  1273,
+  1274,
+  1275,
+  1276,
+  1277,
+  1278,
+  1279,
+  1280,
+  1281,
+  1282,
+  1283,
+  1284,
+  1285,
+  1286,
+  1287,
+  1288,
+  1289,
+  1290,
+  1291,
+  1292,
+  1293,
+  1294,
+  1295,
+  1296,
+  1297,
+  1298,
+  1299,
+  1300,
+  1301,
+  1302,
+  1303,
+  1304,
+  1305,
+  1306,
+  1307,
+  1308,
+  1309,
+  1310,
+  1311,
+  1312,
+  1313,
+  1314,
+  1315,
+  1316,
+  1317,
+  1318,
+  1319,
+  1320,
+  1321,
+  1322,
+  1323,
+  1324,
+  1325,
+  1326,
+  1327,
+  1328,
+  1329,
+  1330,
+  1331,
+  1332,
+  1333,
+  1334,
+  1335,
+  1336,
+  1337,
+  1338,
+  1339,
+  1340,
+  1341,
+  1342,
+  1343,
+  1344,
+  1345,
+  1346,
+  1347,
+  1348,
+  1349,
+  1350,
+  1351,
+  1352,
+  1353,
+  1354,
+  1355,
+  1356,
+  1357,
+  1358,
+  1359,
+  1360,
+  1361,
+  1362,
+  1363,
+  1364,
+  1365,
+  1366,
+  1367,
+  1368,
+  1369,
+  1370,
+  1371,
+  1372,
+  1373,
+  1374,
+  1375,
+  1376,
+  1377,
+  1378,
+  1379,
+  1380,
+  1381,
+  1382,
+  1383,
+  1384,
+  1385,
+  1386,
+  1387,
+  1388,
+  1389,
+  1390,
+  1391,
+  1392,
+  1393,
+  1394,
+  1395,
+  1396,
+  1397,
+  1398,
+  1399,
+  1400,
+  1401,
+  1402,
+  1403,
+  1404,
+  1405,
+  1406,
+  1407,
+  1408,
+  1409,
+  1410,
+  1411,
+  1412,
+  1413,
+  1414,
+  1415,
+  1416,
+  1417,
+  1418,
+  1419,
+  1420,
+  1421,
+  1422,
+  1423,
+  1424,
+  1425,
+  1426,
+  1427,
+  1428,
+  1429,
+  1430,
+  1431,
+  1432,
+  1433,
+  1434,
+  1435,
+  1436,
+  1437,
+  1438,
+  1439,
+  1440,
+  1441,
+  1442,
+  1443,
+  1444,
+  1445,
+  1446,
+  1447,
+  1448,
+  1449,
+  1450,
+  1451,
+  1452,
+  1453,
+  1454,
+  1455,
+  1456,
+  1457,
+  1458,
+  1459,
+  1460,
+  1461,
+  1462,
+  1463,
+  1464,
+  1465,
+  1466,
+  1467,
+  1468,
+  1469,
+  1470,
+  1471,
+  1472,
+  1473,
+  1474,
+  1475,
+  1476,
+  1477,
+  1478,
+  1479,
+  1480,
+  1481,
+  1482,
+  1483,
+  1484,
+  1485,
+  1486,
+  1487,
+  1488,
+  1489,
+  1490,
+  1491,
+  1492,
+  1493,
+  1494,
+  1495,
+  1496,
+  1497,
+  1498,
+  1499,
+  1500,
+  1501,
+  1502,
+  1503,
+  1504,
+  1505,
+  1506,
+  1507,
+  1508,
+  1509,
+  1510,
+  1511,
+  1512,
+  1513,
+  1514,
+  1515,
+  1516,
+  1517,
+  1518,
+  1519,
+  1520,
+  1521,
+  1522,
+  1523,
+  1524,
+  1525,
+  1526,
+  1527,
+  1528,
+  1529,
+  1530,
+  1531,
+  1532,
+  1533,
+  1534,
+  1535,
+  1536,
+  1537,
+  1538,
+  1539,
+  1540,
+  1541,
+  1542,
+  1543,
+  1544,
+  1545,
+  1546,
+  1547,
+  1548,
+  1549,
+  1550,
+  1551,
+  1552,
+  1553,
+  1554,
+  1555,
+  1556,
+  1557,
+  1558,
+  1559,
+  1560,
+  1561,
+  1562,
+  1563,
+  1564,
+  1565,
+  1566,
+  1567,
+  1568,
+  1569,
+  1570,
+  1571,
+  1572,
+  1573,
+  1574,
+  1575,
+  1576,
+  1577,
+  1578,
+  1579,
+  1580,
+  1581,
+  1582,
+  1583,
+  1584,
+  1585,
+  1586,
+  1587,
+  1588,
+  1589,
+  1590,
+  1591,
+  1592,
+  1593,
+  1594,
+  1595,
+  1596,
+  1597,
+  1598,
+  1599,
+  1600,
+  1601,
+  1602,
+  1603,
+  1604,
+  1605,
+  1606,
+  1607,
+  1608,
+  1609,
+  1610,
+  1611,
+  1612,
+  1613,
+  1614,
+  1615,
+  1616,
+  1617,
+  1618,
+  1619,
+  1620,
+  1621,
+  1622,
+  1623,
+  1624,
+  1625,
+  1626,
+  1627,
+  1628,
+  1629,
+  1630,
+  1631,
+  1632,
+  1633,
+  1634,
+  1635,
+  1636,
+  1637,
+  1638,
+  1639,
+  1640,
+  1641,
+  1642,
+  1643,
+  1644,
+  1645,
+  1646,
+  1647,
+  1648,
+  1649,
+  1650,
+  1651,
+  1652,
+  1653,
+  1654,
+  1655,
+  1656,
+  1657,
+  1658,
+  1659,
+  1660,
+  1661,
+  1662,
+  1663,
+  1664,
+  1665,
+  1666,
+  1667,
+  1668,
+  1669,
+  1670,
+  1671,
+  1672,
+  1673,
+  1674,
+  1675,
+  1676,
+  1677,
+  1678,
+  1679,
+  1680,
+  1681,
+  1682,
+  1683,
+  1684,
+  1685,
+  1686,
+  1687,
+  1688,
+  1689,
+  1690,
+  1691,
+  1692,
+  1693,
+  1694,
+  1695,
+  1696,
+  1697,
+  1698,
+  1699,
+  1700,
+  1701,
+  1702,
+  1703,
+  1704,
+  1705,
+  1706,
+  1707,
+  1708,
+  1709,
+  1710,
+  1711,
+  1712,
+  1713,
+  1714,
+  1715,
+  1716,
+  1717,
+  1718,
+  1719,
+  1720,
+  1721,
+  1722,
+  1723,
+  1724,
+  1725,
+  1726,
+  1727,
+  1728,
+  1729,
+  1730,
+  1731,
+  1732,
+  1733,
+  1734,
+  1735,
+  1736,
+  1737,
+  1738,
+  1739,
+  1740,
+  1741,
+  1742,
+  1743,
+  1744,
+  1745,
+  1746,
+  1747,
+  1748,
+  1749,
+  1750,
+  1751,
+  1752,
+  1753,
+  1754,
+  1755,
+  1756,
+  1757,
+  1758,
+  1759,
+  1760,
+  1761,
+  1762,
+  1763,
+  1764,
+  1765,
+  1766,
+  1767,
+  1768,
+  1769,
+  1770,
+  1771,
+  1772,
+  1773,
+  1774,
+  1775,
+  1776,
+  1777,
+  1778,
+  1779,
+  1780,
+  1781,
+  1782,
+  1783,
+  1784,
+  1785,
+  1786,
+  1787,
+  1788,
+  1789,
+  1790,
+  1791,
+  1792,
+  1793,
+  1794,
+  1795,
+  1796,
+  1797,
+  1798,
+  1799,
+  1800,
+  1801,
+  1802,
+  1803,
+  1804,
+  1805,
+  1806,
+  1807,
+  1808,
+  1809,
+  1810,
+  1811,
+  1812,
+  1813,
+  1814,
+  1815,
+  1816,
+  1817,
+  1818,
+  1819,
+  1820,
+  1821,
+  1822,
+  1823,
+  1824,
+  1825,
+  1826,
+  1827,
+  1828,
+  1829,
+  1830,
+  1831,
+  1832,
+  1833,
+  1834,
+  1835,
+  1836,
+  1837,
+  1838,
+  1839,
+  1840,
+  1841,
+  1842,
+  1843,
+  1844,
+  1845,
+  1846,
+  1847,
+  1848,
+  1849,
+  1850,
+  1851,
+  1852,
+  1853,
+  1854,
+  1855,
+  1856,
+  1857,
+  1858,
+  1859,
+  1860,
+  1861,
+  1862,
+  1863,
+  1864,
+  1865,
+  1866,
+  1867,
+  1868,
+  1869,
+  1870,
+  1871,
+  1872,
+  1873,
+  1874,
+  1875,
+  1876,
+  1877,
+  1878,
+  1879,
+  1880,
+  1881,
+  1882,
+  1883,
+  1884,
+  1885,
+  1886,
+  1887,
+  1888,
+  1889,
+  1890,
+  1891,
+  1892,
+  1893,
+  1894,
+  1895,
+  1896,
+  1897,
+  1898,
+  1899,
+  1900,
+  1901,
+  1902,
+  1903,
+  1904,
+  1905,
+  1906,
+  1907,
+  1908,
+  1909,
+  1910,
+  1911,
+  1912,
+  1913,
+  1914,
+  1915,
+  1916,
+  1917,
+  1918,
+  1919,
+  1920,
+  1921,
+  1922,
+  1923,
+  1924,
+  1925,
+  1926,
+  1927,
+  1928,
+  1929,
+  1930,
+  1931,
+  1932,
+  1933,
+  1934,
+  1935,
+  1936,
+  1937,
+  1938,
+  1939,
+  1940,
+  1941,
+  1942,
+  1943,
+  1944,
+  1945,
+  1946,
+  1947,
+  1948,
+  1949,
+  1950,
+  1951,
+  1952,
+  1953,
+  1954,
+  1955,
+  1956,
+  1957,
+  1958,
+  1959,
+  1960,
+  1961,
+  1962,
+  1963,
+  1964,
+  1965,
+  1966,
+  1967,
+  1968,
+  1969,
+  1970,
+  1971,
+  1972,
+  1973,
+  1974,
+  1975,
+  1976,
+  1977,
+  1978,
+  1979,
+  1980,
+  1981,
+  1982,
+  1983,
+  1984,
+  1985,
+  1986,
+  1987,
+  1988,
+  1989,
+  1990,
+  1991,
+  1992,
+  1993,
+  1994,
+  1995,
+  1996,
+  1997,
+  1998,
+  1999,
+  2000,
+  2001,
+  2002,
+  2003,
+  2004,
+  2005,
+  2006,
+  2007,
+  2008,
+  2009,
+  2010,
+  2011,
+  2012,
+  2013,
+  2014,
+  2015,
+  2016,
+  2017,
+  2018,
+  2019,
+  2020,
+  2021,
+  2022,
+  2023,
+  2024,
+  2025,
+  2026,
+  2027,
+  2028,
+  2029,
+  2030,
+  2031,
+  2032,
+  2033,
+  2034,
+  2035,
+  2036,
+  2037,
+  2038,
+  2039,
+  2040,
+  2041,
+  2042,
+  2043,
+  2044,
+  2045,
+  2046,
+  2047,
+  2048,
+  2049,
+  2050,
+  2051,
+  2052,
+  2053,
+  2054,
+  2055,
+  2056,
+  2057,
+  2058,
+  2059,
+  2060,
+  2061,
+  2062,
+  2063,
+  2064,
+  2065,
+  2066,
+  2067,
+  2068,
+  2069,
+  2070,
+  2071,
+  2072,
+  2073,
+  2074,
+  2075,
+  2076,
+  2077,
+  2078,
+  2079,
+  2080,
+  2081,
+  2082,
+  2083,
+  2084,
+  2085,
+  2086,
+  2087,
+  2088,
+  2089,
+  2090,
+  2091,
+  2092,
+  2093,
+  2094,
+  2095,
+  2096,
+  2097,
+  2098,
+  2099,
+  2100,
+  2101,
+  2102,
+  2103,
+  2104,
+  2105,
+  2106,
+  2107,
+  2108,
+  2109,
+  2110,
+  2111,
+  2112,
+  2113,
+  2114,
+  2115,
+  2116,
+  2117,
+  2118,
+  2119,
+  2120,
+  2121,
+  2122,
+  2123,
+  2124,
+  2125,
+  2126,
+  2127,
+  2128,
+  2129,
+  2130,
+  2131,
+  2132,
+  2133,
+  2134,
+  2135,
+  2136,
+  2137,
+  2138,
+  2139,
+  2140,
+  2141,
+  2142,
+  2143,
+  2144,
+  2145,
+  2146,
+  2147,
+  2148,
+  2149,
+  2150,
+  2151,
+  2152,
+  2153,
+  2154,
+  2155,
+  2156,
+  2157,
+  2158,
+  2159,
+  2160,
+  2161,
+  2162,
+  2163,
+  2164,
+  2165,
+  2166,
+  2167,
+  2168,
+  2169,
+  2170,
+  2171,
+  2172,
+  2173,
+  2174,
+  2175,
+  2176,
+  2177,
+  2178,
+  2179,
+  2180,
+  2181,
+  2182,
+  2183,
+  2184,
+  2185,
+  2186,
+  2187,
+  2188,
+  2189,
+  2190,
+  2191,
+  2192,
+  2193,
+  2194,
+  2195,
+  2196,
+  2197,
+  2198,
+  2199,
+  2200,
+  2201,
+  2202,
+  2203,
+  2204,
+  2205,
+  2206,
+  2207,
+  2208,
+  2209,
+  2210,
+  2211,
+  2212,
+  2213,
+  2214,
+  2215,
+  2216,
+  2217,
+  2218,
+  2219,
+  2220,
+  2221,
+  2222,
+  2223,
+  2224,
+  2225,
+  2226,
+  2227,
+  2228,
+  2229,
+  2230,
+  2231,
+  2232,
+  2233,
+  2234,
+  2235,
+  2236,
+  2237,
+  2238,
+  2239,
+  2240,
+  2241,
+  2242,
+  2243,
+  2244,
+  2245,
+  2246,
+  2247,
+  2248,
+  2249,
+  2250,
+  2251,
+  2252,
+  2253,
+  2254,
+  2255,
+  2256,
+  2257,
+  2258,
+  2259,
+  2260,
+  2261,
+  2262,
+  2263,
+  2264,
+  2265,
+  2266,
+  2267,
+  2268,
+  2269,
+  2270,
+  2271,
+  2272,
+  2273,
+  2274,
+  2275,
+  2276,
+  2277,
+  2278,
+  2279,
+  2280,
+  2281,
+  2282,
+  2283,
+  2284,
+  2285,
+  2286,
+  2287,
+  2288,
+  2289,
+  2290,
+  2291,
+  2292,
+  2293,
+  2294,
+  2295,
+  2296,
+  2297,
+  2298,
+  2299,
+  2300,
+  2301,
+  2302,
+  2303,
+  2304,
+  2305,
+  2306,
+  2307,
+  2308,
+  2309,
+  2310,
+  2311,
+  2312,
+  2313,
+  2314,
+  2315,
+  2316,
+  2317,
+  2318,
+  2319,
+  2320,
+  2321,
+  2322,
+  2323,
+  2324,
+  2325,
+  2326,
+  2327,
+  2328,
+  2329,
+  2330,
+  2331,
+  2332,
+  2333,
+  2334,
+  2335,
+  2336,
+  2337,
+  2338,
+  2339,
+  2340,
+  2341,
+  2342,
+  2343,
+  2344,
+  2345,
+  2346,
+  2347,
+  2348,
+  2349,
+  2350,
+  2351,
+  2352,
+  2353,
+  2354,
+  2355,
+  2356,
+  2357,
+  2358,
+  2359,
+  2360,
+  2361,
+  2362,
+  2363,
+  2364,
+  2365,
+  2366,
+  2367,
+  2368,
+  2369,
+  2370,
+  2371,
+  2372,
+  2373,
+  2374,
+  2375,
+  2376,
+  2377,
+  2378,
+  2379,
+  2380,
+  2381,
+  2382,
+  2383,
+  2384,
+  2385,
+  2386,
+  2387,
+  2388,
+  2389,
+  2390,
+  2391,
+  2392,
+  2393,
+  2394,
+  2395,
+  2396,
+  2397,
+  2398,
+  2399,
+  2400,
+  2401,
+  2402,
+  2403,
+  2404,
+  2405,
+  2406,
+  2407,
+  2408,
+  2409,
+  2410,
+  2411,
+  2412,
+  2413,
+  2414,
+  2415,
+  2416,
+  2417,
+  2418,
+  2419,
+  2420,
+  2421,
+  2422,
+  2423,
+  2424,
+  2425,
+  2426,
+  2427,
+  2428,
+  2429,
+  2430,
+  2431,
+  2432,
+  2433,
+  2434,
+  2435,
+  2436,
+  2437,
+  2438,
+  2439,
+  2440,
+  2441,
+  2442,
+  2443,
+  2444,
+  2445,
+  2446,
+  2447,
+  2448,
+  2449,
+  2450,
+  2451,
+  2452,
+  2453,
+  2454,
+  2455,
+  2456,
+  2457,
+  2458,
+  2459,
+  2460,
+  2461,
+  2462,
+  2463,
+  2464,
+  2465,
+  2466,
+  2467,
+  2468,
+  2469,
+  2470,
+  2471,
+  2472,
+  2473,
+  2474,
+  2475,
+  2476,
+  2477,
+  2478,
+  2479,
+  2480,
+  2481,
+  2482,
+  2483,
+  2484,
+  2485,
+  2486,
+  2487,
+  2488,
+  2489,
+  2490,
+  2491,
+  2492,
+  2493,
+  2494,
+  2495,
+  2496,
+  2497,
+  2498,
+  2499,
+  2500,
+  2501,
+  2502,
+  2503,
+  2504,
+  2505,
+  2506,
+  2507,
+  2508,
+  2509,
+  2510,
+  2511,
+  2512,
+  2513,
+  2514,
+  2515,
+  2516,
+  2517,
+  2518,
+  2519,
+  2520,
+  2521,
+  2522,
+  2523,
+  2524,
+  2525,
+  2526,
+  2527,
+  2528,
+  2529,
+  2530,
+  2531,
+  2532,
+  2533,
+  2534,
+  2535,
+  2536,
+  2537,
+  2538,
+  2539,
+  2540,
+  2541,
+  2542,
+  2543,
+  2544,
+  2545,
+  2546,
+  2547,
+  2548,
+  2549,
+  2550,
+  2551,
+  2552,
+  2553,
+  2554,
+  2555,
+  2556,
+  2557,
+  2558,
+  2559,
+  2560,
+  2561,
+  2562,
+  2563,
+  2564,
+  2565,
+  2566,
+  2567,
+  2568,
+  2569,
+  2570,
+  2571,
+  2572,
+  2573,
+  2574,
+  2575,
+  2576,
+  2577,
+  2578,
+  2579,
+  2580,
+  2581,
+  2582,
+  2583,
+  2584,
+  2585,
+  2586,
+  2587,
+  2588,
+  2589,
+  2590,
+  2591,
+  2592,
+  2593,
+  2594,
+  2595,
+  2596,
+  2597,
+  2598,
+  2599,
+  2600,
+  2601,
+  2602,
+  2603,
+  2604,
+  2605,
+  2606,
+  2607,
+  2608,
+  2609,
+  2610,
+  2611,
+  2612,
+  2613,
+  2614,
+  2615,
+  2616,
+  2617,
+  2618,
+  2619,
+  2620,
+  2621,
+  2622,
+  2623,
+  2624,
+  2625,
+  2626,
+  2627,
+  2628,
+  2629,
+  2630,
+  2631,
+  2632,
+  2633,
+  2634,
+  2635,
+  2636,
+  2637,
+  2638,
+  2639,
+  2640,
+  2641,
+  2642,
+  2643,
+  2644,
+  2645,
+  2646,
+  2647,
+  2648,
+  2649,
+  2650,
+  2651,
+  2652,
+  2653,
+  2654,
+  2655,
+  2656,
+  2657,
+  2658,
+  2659,
+  2660,
+  2661,
+  2662,
+  2663,
+  2664,
+  2665,
+  2666,
+  2667,
+  2668,
+  2669,
+  2670,
+  2671,
+  2672,
+  2673,
+  2674,
+  2675,
+  2676,
+  2677,
+  2678,
+  2679,
+  2680,
+  2681,
+  2682,
+  2683,
+  2684,
+  2685,
+  2686,
+  2687,
+  2688,
+  2689,
+  2690,
+  2691,
+  2692,
+  2693,
+  2694,
+  2695,
+  2696,
+  2697,
+  2698,
+  2699,
+  2700,
+  2701,
+  2702,
+  2703,
+  2704,
+  2705,
+  2706,
+  2707,
+  2708,
+  2709,
+  2710,
+  2711,
+  2712,
+  2713,
+  2714,
+  2715,
+  2716,
+  2717,
+  2718,
+  2719,
+  2720,
+  2721,
+  2722,
+  2723,
+  2724,
+  2725,
+  2726,
+  2727,
+  2728,
+  2729,
+  2730,
+  2731,
+  2732,
+  2733,
+  2734,
+  2735,
+  2736,
+  2737,
+  2738,
+  2739,
+  2740,
+  2741,
+  2742,
+  2743,
+  2744,
+  2745,
+  2746,
+  2747,
+  2748,
+  2749,
+  2750,
+  2751,
+  2752,
+  2753,
+  2754,
+  2755,
+  2756,
+  2757,
+  2758,
+  2759,
+  2760,
+  2761,
+  2762,
+  2763,
+  2764,
+  2765,
+  2766,
+  2767,
+  2768,
+  2769,
+  2770,
+  2771,
+  2772,
+  2773,
+  2774,
+  2775,
+  2776,
+  2777,
+  2778,
+  2779,
+  2780,
+  2781,
+  2782,
+  2783,
+  2784,
+  2785,
+  2786,
+  2787,
+  2788,
+  2789,
+  2790,
+  2791,
+  2792,
+  2793,
+  2794,
+  2795,
+  2796,
+  2797,
+  2798,
+  2799,
+  2800,
+  2801,
+  2802,
+  2803,
+  2804,
+  2805,
+  2806,
+  2807,
+  2808,
+  2809,
+  2810,
+  2811,
+  2812,
+  2813,
+  2814,
+  2815,
+  2816,
+  2817,
+  2818,
+  2819,
+  2820,
+  2821,
+  2822,
+  2823,
+  2824,
+  2825,
+  2826,
+  2827,
+  2828,
+  2829,
+  2830,
+  2831,
+  2832,
+  2833,
+  2834,
+  2835,
+  2836,
+  2837,
+  2838,
+  2839,
+  2840,
+  2841,
+  2842,
+  2843,
+  2844,
+  2845,
+  2846,
+  2847,
+  2848,
+  2849,
+  2850,
+  2851,
+  2852,
+  2853,
+  2854,
+  2855,
+  2856,
+  2857,
+  2858,
+  2859,
+  2860,
+  2861,
+  2862,
+  2863,
+  2864,
+  2865,
+  2866,
+  2867,
+  2868,
+  2869,
+  2870,
+  2871,
+  2872,
+  2873,
+  2874,
+  2875,
+  2876,
+  2877,
+  2878,
+  2879,
+  2880,
+  2881,
+  2882,
+  2883,
+  2884,
+  2885,
+  2886,
+  2887,
+  2888,
+  2889,
+  2890,
+  2891,
+  2892,
+  2893,
+  2894,
+  2895,
+  2896,
+  2897,
+  2898,
+  2899,
+  2900,
+  2901,
+  2902,
+  2903,
+  2904,
+  2905,
+  2906,
+  2907,
+  2908,
+  2909,
+  2910,
+  2911,
+  2912,
+  2913,
+  2914,
+  2915,
+  2916,
+  2917,
+  2918,
+  2919,
+  2920,
+  2921,
+  2922,
+  2923,
+  2924,
+  2925,
+  2926,
+  2927,
+  2928,
+  2929,
+  2930,
+  2931,
+  2932,
+  2933,
+  2934,
+  2935,
+  2936,
+  2937,
+  2938,
+  2939,
+  2940,
+  2941,
+  2942,
+  2943,
+  2944,
+  2945,
+  2946,
+  2947,
+  2948,
+  2949,
+  2950,
+  2951,
+  2952,
+  2953,
+  2954,
+  2955,
+  2956,
+  2957,
+  2958,
+  2959,
+  2960,
+  2961,
+  2962,
+  2963,
+  2964,
+  2965,
+  2966,
+  2967,
+  2968,
+  2969,
+  2970,
+  2971,
+  2972,
+  2973,
+  2974,
+  2975,
+  2976,
+  2977,
+  2978,
+  2979,
+  2980,
+  2981,
+  2982,
+  2983,
+  2984,
+  2985,
+  2986,
+  2987,
+  2988,
+  2989,
+  2990,
+  2991,
+  2992,
+  2993,
+  2994,
+  2995,
+  2996,
+  2997,
+  2998,
+  2999,
+  3000,
+  3001,
+  3002,
+  3003,
+  3004,
+  3005,
+  3006,
+  3007,
+  3008,
+  3009,
+  3010,
+  3011,
+  3012,
+  3013,
+  3014,
+  3015,
+  3016,
+  3017,
+  3018,
+  3019,
+  3020,
+  3021,
+  3022,
+  3023,
+  3024,
+  3025,
+  3026,
+  3027,
+  3028,
+  3029,
+  3030,
+  3031,
+  3032,
+  3033,
+  3034,
+  3035,
+  3036,
+  3037,
+  3038,
+  3039,
+  3040,
+  3041,
+  3042,
+  3043,
+  3044,
+  3045,
+  3046,
+  3047,
+  3048,
+  3049,
+  3050,
+  3051,
+  3052,
+  3053,
+  3054,
+  3055,
+  3056,
+  3057,
+  3058,
+  3059,
+  3060,
+  3061,
+  3062,
+  3063,
+  3064,
+  3065,
+  3066,
+  3067,
+  3068,
+  3069,
+  3070,
+  3071,
+  3072,
+  3073,
+  3074,
+  3075,
+  3076,
+  3077,
+  3078,
+  3079,
+  3080,
+  3081,
+  3082,
+  3083,
+  3084,
+  3085,
+  3086,
+  3087,
+  3088,
+  3089,
+  3090,
+  3091,
+  3092,
+  3093,
+  3094,
+  3095,
+  3096,
+  3097,
+  3098,
+  3099,
+  3100,
+  3101,
+  3102,
+  3103,
+  3104,
+  3105,
+  3106,
+  3107,
+  3108,
+  3109,
+  3110,
+  3111,
+  3112,
+  3113,
+  3114,
+  3115,
+  3116,
+  3117,
+  3118,
+  3119,
+  3120,
+  3121,
+  3122,
+  3123,
+  3124,
+  3125,
+  3126,
+  3127,
+  3128,
+  3129,
+  3130,
+  3131,
+  3132,
+  3133,
+  3134,
+  3135,
+  3136,
+  3137,
+  3138,
+  3139,
+  3140,
+  3141,
+  3142,
+  3143,
+  3144,
+  3145,
+  3146,
+  3147,
+  3148,
+  3149,
+  3150,
+  3151,
+  3152,
+  3153,
+  3154,
+  3155,
+  3156,
+  3157,
+  3158,
+  3159,
+  3160,
+  3161,
+  3162,
+  3163,
+  3164,
+  3165,
+  3166,
+  3167,
+  3168,
+  3169,
+  3170,
+  3171,
+  3172,
+  3173,
+  3174,
+  3175,
+  3176,
+  3177,
+  3178,
+  3179,
+  3180,
+  3181,
+  3182,
+  3183,
+  3184,
+  3185,
+  3186,
+  3187,
+  3188,
+  3189,
+  3190,
+  3191,
+  3192,
+  3193,
+  3194,
+  3195,
+  3196,
+  3197,
+  3198,
+  3199,
+  3200,
+  3201,
+  3202,
+  3203,
+  3204,
+  3205,
+  3206,
+  3207,
+  3208,
+  3209,
+  3210,
+  3211,
+  3212,
+  3213,
+  3214,
+  3215,
+  3216,
+  3217,
+  3218,
+  3219,
+  3220,
+  3221,
+  3222,
+  3223,
+  3224,
+  3225,
+  3226,
+  3227,
+  3228,
+  3229,
+  3230,
+  3231,
+  3232,
+  3233,
+  3234,
+  3235,
+  3236,
+  3237,
+  3238,
+  3239,
+  3240,
+  3241,
+  3242,
+  3243,
+  3244,
+  3245,
+  3246,
+  3247,
+  3248,
+  3249,
+  3250,
+  3251,
+  3252,
+  3253,
+  3254,
+  3255,
+  3256,
+  3257,
+  3258,
+  3259,
+  3260,
+  3261,
+  3262,
+  3263,
+  3264,
+  3265,
+  3266,
+  3267,
+  3268,
+  3269,
+  3270,
+  3271,
+  3272,
+  3273,
+  3274,
+  3275,
+  3276,
+  3277,
+  3278,
+  3279,
+  3280,
+  3281,
+  3282,
+  3283,
+  3284,
+  3285,
+  3286,
+  3287,
+  3288,
+  3289,
+  3290,
+  3291,
+  3292,
+  3293,
+  3294,
+  3295,
+  3296,
+  3297,
+  3298,
+  3299,
+  3300,
+  3301,
+  3302,
+  3303,
+  3304,
+  3305,
+  3306,
+  3307,
+  3308,
+  3309,
+  3310,
+  3311,
+  3312,
+  3313,
+  3314,
+  3315,
+  3316,
+  3317,
+  3318,
+  3319,
+  3320,
+  3321,
+  3322,
+  3323,
+  3324,
+  3325,
+  3326,
+  3327,
+  3328,
+  3329,
+  3330,
+  3331,
+  3332,
+  3333,
+  3334,
+  3335,
+  3336,
+  3337,
+  3338,
+  3339,
+  3340,
+  3341,
+  3342,
+  3343,
+  3344,
+  3345,
+  3346,
+  3347,
+  3348,
+  3349,
+  3350,
+  3351,
+  3352,
+  3353,
+  3354,
+  3355,
+  3356,
+  3357,
+  3358,
+  3359,
+  3360,
+  3361,
+  3362,
+  3363,
+  3364,
+  3365,
+  3366,
+  3367,
+  3368,
+  3369,
+  3370,
+  3371,
+  3372,
+  3373,
+  3374,
+  3375,
+  3376,
+  3377,
+  3378,
+  3379,
+  3380,
+  3381,
+  3382,
+  3383,
+  3384,
+  3385,
+  3386,
+  3387,
+  3388,
+  3389,
+  3390,
+  3391,
+  3392,
+  3393,
+  3394,
+  3395,
+  3396,
+  3397,
+  3398,
+  3399,
+  3400,
+  3401,
+  3402,
+  3403,
+  3404,
+  3405,
+  3406,
+  3407,
+  3408,
+  3409,
+  3410,
+  3411,
+  3412,
+  3413,
+  3414,
+  3415,
+  3416,
+  3417,
+  3418,
+  3419,
+  3420,
+  3421,
+  3422,
+  3423,
+  3424,
+  3425,
+  3426,
+  3427,
+  3428,
+  3429,
+  3430,
+  3431,
+  3432,
+  3433,
+  3434,
+  3435,
+  3436,
+  3437,
+  3438,
+  3439,
+  3440,
+  3441,
+  3442,
+  3443,
+  3444,
+  3445,
+  3446,
+  3447,
+  3448,
+  3449,
+  3450,
+  3451,
+  3452,
+  3453,
+  3454,
+  3455,
+  3456,
+  3457,
+  3458,
+  3459,
+  3460,
+  3461,
+  3462,
+  3463,
+  3464,
+  3465,
+  3466,
+  3467,
+  3468,
+  3469,
+  3470,
+  3471,
+  3472,
+  3473,
+  3474,
+  3475,
+  3476,
+  3477,
+  3478,
+  3479,
+  3480,
+  3481,
+  3482,
+  3483,
+  3484,
+  3485,
+  3486,
+  3487,
+  3488,
+  3489,
+  3490,
+  3491,
+  3492,
+  3493,
+  3494,
+  3495,
+  3496,
+  3497,
+  3498,
+  3499,
+  3500,
+  3501,
+  3502,
+  3503,
+  3504,
+  3505,
+  3506,
+  3507,
+  3508,
+  3509,
+  3510,
+  3511,
+  3512,
+  3513,
+  3514,
+  3515,
+  3516,
+  3517,
+  3518,
+  3519,
+  3520,
+  3521,
+  3522,
+  3523,
+  3524,
+  3525,
+  3526,
+  3527,
+  3528,
+  3529,
+  3530,
+  3531,
+  3532,
+  3533,
+  3534,
+  3535,
+  3536,
+  3537,
+  3538,
+  3539,
+  3540,
+  3541,
+  3542,
+  3543,
+  3544,
+  3545,
+  3546,
+  3547,
+  3548,
+  3549,
+  3550,
+  3551,
+  3552,
+  3553,
+  3554,
+  3555,
+  3556,
+  3557,
+  3558,
+  3559,
+  3560,
+  3561,
+  3562,
+  3563,
+  3564,
+  3565,
+  3566,
+  3567,
+  3568,
+  3569,
+  3570,
+  3571,
+  3572,
+  3573,
+  3574,
+  3575,
+  3576,
+  3577,
+  3578,
+  3579,
+  3580,
+  3581,
+  3582,
+  3583,
+  3584,
+  3585,
+  3586,
+  3587,
+  3588,
+  3589,
+  3590,
+  3591,
+  3592,
+  3593,
+  3594,
+  3595,
+  3596,
+  3597,
+  3598,
+  3599,
+  3600,
+  3601,
+  3602,
+  3603,
+  3604,
+  3605,
+  3606,
+  3607,
+  3608,
+  3609,
+  3610,
+  3611,
+  3612,
+  3613,
+  3614,
+  3615,
+  3616,
+  3617,
+  3618,
+  3619,
+  3620,
+  3621,
+  3622,
+  3623,
+  3624,
+  3625,
+  3626,
+  3627,
+  3628,
+  3629,
+  3630,
+  3631,
+  3632,
+  3633,
+  3634,
+  3635,
+  3636,
+  3637,
+  3638,
+  3639,
+  3640,
+  3641,
+  3642,
+  3643,
+  3644,
+  3645,
+  3646,
+  3647,
+  3648,
+  3649,
+  3650,
+  3651,
+  3652,
+  3653,
+  3654,
+  3655,
+  3656,
+  3657,
+  3658,
+  3659,
+  3660,
+  3661,
+  3662,
+  3663,
+  3664,
+  3665,
+  3666,
+  3667,
+  3668,
+  3669,
+  3670,
+  3671,
+  3672,
+  3673,
+  3674,
+  3675,
+  3676,
+  3677,
+  3678,
+  3679,
+  3680,
+  3681,
+  3682,
+  3683,
+  3684,
+  3685,
+  3686,
+  3687,
+  3688,
+  3689,
+  3690,
+  3691,
+  3692,
+  3693,
+  3694,
+  3695,
+  3696,
+  3697,
+  3698,
+  3699,
+  3700,
+  3701,
+  3702,
+  3703,
+  3704,
+  3705,
+  3706,
+  3707,
+  3708,
+  3709,
+  3710,
+  3711,
+  3712,
+  3713,
+  3714,
+  3715,
+  3716,
+  3717,
+  3718,
+  3719,
+  3720,
+  3721,
+  3722,
+  3723,
+  3724,
+  3725,
+  3726,
+  3727,
+  3728,
+  3729,
+  3730,
+  3731,
+  3732,
+  3733,
+  3734,
+  3735,
+  3736,
+  3737,
+  3738,
+  3739,
+  3740,
+  3741,
+  3742,
+  3743,
+  3744,
+  3745,
+  3746,
+  3747,
+  3748,
+  3749,
+  3750,
+  3751,
+  3752,
+  3753,
+  3754,
+  3755,
+  3756,
+  3757,
+  3758,
+  3759,
+  3760,
+  3761,
+  3762,
+  3763,
+  3764,
+  3765,
+  3766,
+  3767,
+  3768,
+  3769,
+  3770,
+  3771,
+  3772,
+  3773,
+  3774,
+  3775,
+  3776,
+  3777,
+  3778,
+  3779,
+  3780,
+  3781,
+  3782,
+  3783,
+  3784,
+  3785,
+  3786,
+  3787,
+  3788,
+  3789,
+  3790,
+  3791,
+  3792,
+  3793,
+  3794,
+  3795,
+  3796,
+  3797,
+  3798,
+  3799,
+  3800,
+  3801,
+  3802,
+  3803,
+  3804,
+  3805,
+  3806,
+  3807,
+  3808,
+  3809,
+  3810,
+  3811,
+  3812,
+  3813,
+  3814,
+  3815,
+  3816,
+  3817,
+  3818,
+  3819,
+  3820,
+  3821,
+  3822,
+  3823,
+  3824,
+  3825,
+  3826,
+  3827,
+  3828,
+  3829,
+  3830,
+  3831,
+  3832,
+  3833,
+  3834,
+  3835,
+  3836,
+  3837,
+  3838,
+  3839,
+  3840,
+  3841,
+  3842,
+  3843,
+  3844,
+  3845,
+  3846,
+  3847,
+  3848,
+  3849,
+  3850,
+  3851,
+  3852,
+  3853,
+  3854,
+  3855,
+  3856,
+  3857,
+  3858,
+  3859,
+  3860,
+  3861,
+  3862,
+  3863,
+  3864,
+  3865,
+  3866,
+  3867,
+  3868,
+  3869,
+  3870,
+  3871,
+  3872,
+  3873,
+  3874,
+  3875,
+  3876,
+  3877,
+  3878,
+  3879,
+  3880,
+  3881,
+  3882,
+  3883,
+  3884,
+  3885,
+  3886,
+  3887,
+  3888,
+  3889,
+  3890,
+  3891,
+  3892,
+  3893,
+  3894,
+  3895,
+  3896,
+  3897,
+  3898,
+  3899,
+  3900,
+  3901,
+  3902,
+  3903,
+  3904,
+  3905,
+  3906,
+  3907,
+  3908,
+  3909,
+  3910,
+  3911,
+  3912,
+  3913,
+  3914,
+  3915,
+  3916,
+  3917,
+  3918,
+  3919,
+  3920,
+  3921,
+  3922,
+  3923,
+  3924,
+  3925,
+  3926,
+  3927,
+  3928,
+  3929,
+  3930,
+  3931,
+  3932,
+  3933,
+  3934,
+  3935,
+  3936,
+  3937,
+  3938,
+  3939,
+  3940,
+  3941,
+  3942,
+  3943,
+  3944,
+  3945,
+  3946,
+  3947,
+  3948,
+  3949,
+  3950,
+  3951,
+  3952,
+  3953,
+  3954,
+  3955,
+  3956,
+  3957,
+  3958,
+  3959,
+  3960,
+  3961,
+  3962,
+  3963,
+  3964,
+  3965,
+  3966,
+  3967,
+  3968,
+  3969,
+  3970,
+  3971,
+  3972,
+  3973,
+  3974,
+  3975,
+  3976,
+  3977,
+  3978,
+  3979,
+  3980,
+  3981,
+  3982,
+  3983,
+  3984,
+  3985,
+  3986,
+  3987,
+  3988,
+  3989,
+  3990,
+  3991,
+  3992,
+  3993,
+  3994,
+  3995,
+  3996,
+  3997,
+  3998,
+  3999,
+  4000,
+  4001,
+  4002,
+  4003,
+  4004,
+  4005,
+  4006,
+  4007,
+  4008,
+  4009,
+  4010,
+  4011,
+  4012,
+  4013,
+  4014,
+  4015,
+  4016,
+  4017,
+  4018,
+  4019,
+  4020,
+  4021,
+  4022,
+  4023,
+  4024,
+  4025,
+  4026,
+  4027,
+  4028,
+  4029,
+  4030,
+  4031,
+  4032,
+  4033,
+  4034,
+  4035,
+  4036,
+  4037,
+  4038,
+  4039,
+  4040,
+  4041,
+  4042,
+  4043,
+  4044,
+  4045,
+  4046,
+  4047,
+  4048,
+  4049,
+  4050,
+  4051,
+  4052,
+  4053,
+  4054,
+  4055,
+  4056,
+  4057,
+  4058,
+  4059,
+  4060,
+  4061,
+  4062,
+  4063,
+  4064,
+  4065,
+  4066,
+  4067,
+  4068,
+  4069,
+  4070,
+  4071,
+  4072,
+  4073,
+  4074,
+  4075,
+  4076,
+  4077,
+  4078,
+  4079,
+  4080,
+  4081,
+  4082,
+  4083,
+  4084,
+  4085,
+  4086,
+  4087,
+  4088,
+  4089,
+  4090,
+  4091,
+  4092,
+  4093,
+  4094,
+  4095,
+  4096,
+  4097,
+  4098,
+  4099,
+  4100,
+  4101,
+  4102,
+  4103,
+  4104,
+  4105,
+  4106,
+  4107,
+  4108,
+  4109,
+  4110,
+  4111,
+  4112,
+  4113,
+  4114,
+  4115,
+  4116,
+  4117,
+  4118,
+  4119,
+  4120,
+  4121,
+  4122,
+  4123,
+  4124,
+  4125,
+  4126,
+  4127,
+  4128,
+  4129,
+  4130,
+  4131,
+  4132,
+  4133,
+  4134,
+  4135,
+  4136,
+  4137,
+  4138,
+  4139,
+  4140,
+  4141,
+  4142,
+  4143,
+  4144,
+  4145,
+  4146,
+  4147,
+  4148,
+  4149,
+  4150,
+  4151,
+  4152,
+  4153,
+  4154,
+  4155,
+  4156,
+  4157,
+  4158,
+  4159,
+  4160,
+  4161,
+  4162,
+  4163,
+  4164,
+  4165,
+  4166,
+  4167,
+  4168,
+  4169,
+  4170,
+  4171,
+  4172,
+  4173,
+  4174,
+  4175,
+  4176,
+  4177,
+  4178,
+  4179,
+  4180,
+  4181,
+  4182,
+  4183,
+  4184,
+  4185,
+  4186,
+  4187,
+  4188,
+  4189,
+  4190,
+  4191,
+  4192,
+  4193,
+  4194,
+  4195,
+  4196,
+  4197,
+  4198,
+  4199,
+  4200,
+  4201,
+  4202,
+  4203,
+  4204,
+  4205,
+  4206,
+  4207,
+  4208,
+  4209,
+  4210,
+  4211,
+  4212,
+  4213,
+  4214,
+  4215,
+  4216,
+  4217,
+  4218,
+  4219,
+  4220,
+  4221,
+  4222,
+  4223,
+  4224,
+  4225,
+  4226,
+  4227,
+  4228,
+  4229,
+  4230,
+  4231,
+  4232,
+  4233,
+  4234,
+  4235,
+  4236,
+  4237,
+  4238,
+  4239,
+  4240,
+  4241,
+  4242,
+  4243,
+  4244,
+  4245,
+  4246,
+  4247,
+  4248,
+  4249,
+  4250,
+  4251,
+  4252,
+  4253,
+  4254,
+  4255,
+  4256,
+  4257,
+  4258,
+  4259,
+  4260,
+  4261,
+  4262,
+  4263,
+  4264,
+  4265,
+  4266,
+  4267,
+  4268,
+  4269,
+  4270,
+  4271,
+  4272,
+  4273,
+  4274,
+  4275,
+  4276,
+  4277,
+  4278,
+  4279,
+  4280,
+  4281,
+  4282,
+  4283,
+  4284,
+  4285,
+  4286,
+  4287,
+  4288,
+  4289,
+  4290,
+  4291,
+  4292,
+  4293,
+  4294,
+  4295,
+  4296,
+  4297,
+  4298,
+  4299,
+  4300,
+  4301,
+  4302,
+  4303,
+  4304,
+  4305,
+  4306,
+  4307,
+  4308,
+  4309,
+  4310,
+  4311,
+  4312,
+  4313,
+  4314,
+  4315,
+  4316,
+  4317,
+  4318,
+  4319,
+  4320,
+  4321,
+  4322,
+  4323,
+  4324,
+  4325,
+  4326,
+  4327,
+  4328,
+  4329,
+  4330,
+  4331,
+  4332,
+  4333,
+  4334,
+  4335,
+  4336,
+  4337,
+  4338,
+  4339,
+  4340,
+  4341,
+  4342,
+  4343,
+  4344,
+  4345,
+  4346,
+  4347,
+  4348,
+  4349,
+  4350,
+  4351,
+  4352,
+  4353,
+  4354,
+  4355,
+  4356,
+  4357,
+  4358,
+  4359,
+  4360,
+  4361,
+  4362,
+  4363,
+  4364,
+  4365,
+  4366,
+  4367,
+  4368,
+  4369,
+  4370,
+  4371,
+  4372,
+  4373,
+  4374,
+  4375,
+  4376,
+  4377,
+  4378,
+  4379,
+  4380,
+  4381,
+  4382,
+  4383,
+  4384,
+  4385,
+  4386,
+  4387,
+  4388,
+  4389,
+  4390,
+  4391,
+  4392,
+  4393,
+  4394,
+  4395,
+  4396,
+  4397,
+  4398,
+  4399,
+  4400,
+  4401,
+  4402,
+  4403,
+  4404,
+  4405,
+  4406,
+  4407,
+  4408,
+  4409,
+  4410,
+  4411,
+  4412,
+  4413,
+  4414,
+  4415,
+  4416,
+  4417,
+  4418,
+  4419,
+  4420,
+  4421,
+  4422,
+  4423,
+  4424,
+  4425,
+  4426,
+  4427,
+  4428,
+  4429,
+  4430,
+  4431,
+  4432,
+  4433,
+  4434,
+  4435,
+  4436,
+  4437,
+  4438,
+  4439,
+  4440,
+  4441,
+  4442,
+  4443,
+  4444,
+  4445,
+  4446,
+  4447,
+  4448,
+  4449,
+  4450,
+  4451,
+  4452,
+  4453,
+  4454,
+  4455,
+  4456,
+  4457,
+  4458,
+  4459,
+  4460,
+  4461,
+  4462,
+  4463,
+  4464,
+  4465,
+  4466,
+  4467,
+  4468,
+  4469,
+  4470,
+  4471,
+  4472,
+  4473,
+  4474,
+  4475,
+  4476,
+  4477,
+  4478,
+  4479,
+  4480,
+  4481,
+  4482,
+  4483,
+  4484,
+  4485,
+  4486,
+  4487,
+  4488,
+  4489,
+  4490,
+  4491,
+  4492,
+  4493,
+  4494,
+  4495,
+  4496,
+  4497,
+  4498,
+  4499,
+  4500,
+  4501,
+  4502,
+  4503,
+  4504,
+  4505,
+  4506,
+  4507,
+  4508,
+  4509,
+  4510,
+  4511,
+  4512,
+  4513,
+  4514,
+  4515,
+  4516,
+  4517,
+  4518,
+  4519,
+  4520,
+  4521,
+  4522,
+  4523,
+  4524,
+  4525,
+  4526,
+  4527,
+  4528,
+  4529,
+  4530,
+  4531,
+  4532,
+  4533,
+  4534,
+  4535,
+  4536,
+  4537,
+  4538,
+  4539,
+  4540,
+  4541,
+  4542,
+  4543,
+  4544,
+  4545,
+  4546,
+  4547,
+  4548,
+  4549,
+  4550,
+  4551,
+  4552,
+  4553,
+  4554,
+  4555,
+  4556,
+  4557,
+  4558,
+  4559,
+  4560,
+  4561,
+  4562,
+  4563,
+  4564,
+  4565,
+  4566,
+  4567,
+  4568,
+  4569,
+  4570,
+  4571,
+  4572,
+  4573,
+  4574,
+  4575,
+  4576,
+  4577,
+  4578,
+  4579,
+  4580,
+  4581,
+  4582,
+  4583,
+  4584,
+  4585,
+  4586,
+  4587,
+  4588,
+  4589,
+  4590,
+  4591,
+  4592,
+  4593,
+  4594,
+  4595,
+  4596,
+  4597,
+  4598,
+  4599,
+  4600,
+  4601,
+  4602,
+  4603,
+  4604,
+  4605,
+  4606,
+  4607,
+  4608,
+  4609,
+  4610,
+  4611,
+  4612,
+  4613,
+  4614,
+  4615,
+  4616,
+  4617,
+  4618,
+  4619,
+  4620,
+  4621,
+  4622,
+  4623,
+  4624,
+  4625,
+  4626,
+  4627,
+  4628,
+  4629,
+  4630,
+  4631,
+  4632,
+  4633,
+  4634,
+  4635,
+  4636,
+  4637,
+  4638,
+  4639,
+  4640,
+  4641,
+  4642,
+  4643,
+  4644,
+  4645,
+  4646,
+  4647,
+  4648,
+  4649,
+  4650,
+  4651,
+  4652,
+  4653,
+  4654,
+  4655,
+  4656,
+  4657,
+  4658,
+  4659,
+  4660,
+  4661,
+  4662,
+  4663,
+  4664,
+  4665,
+  4666,
+  4667,
+  4668,
+  4669,
+  4670,
+  4671,
+  4672,
+  4673,
+  4674,
+  4675,
+  4676,
+  4677,
+  4678,
+  4679,
+  4680,
+  4681,
+  4682,
+  4683,
+  4684,
+  4685,
+  4686,
+  4687,
+  4688,
+  4689,
+  4690,
+  4691,
+  4692,
+  4693,
+  4694,
+  4695,
+  4696,
+  4697,
+  4698,
+  4699,
+  4700,
+  4701,
+  4702,
+  4703,
+  4704,
+  4705,
+  4706,
+  4707,
+  4708,
+  4709,
+  4710,
+  4711,
+  4712,
+  4713,
+  4714,
+  4715,
+  4716,
+  4717,
+  4718,
+  4719,
+  4720,
+  4721,
+  4722,
+  4723,
+  4724,
+  4725,
+  4726,
+  4727,
+  4728,
+  4729,
+  4730,
+  4731,
+  4732,
+  4733,
+  4734,
+  4735,
+  4736,
+  4737,
+  4738,
+  4739,
+  4740,
+  4741,
+  4742,
+  4743,
+  4744,
+  4745,
+  4746,
+  4747,
+  4748,
+  4749,
+  4750,
+  4751,
+  4752,
+  4753,
+  4754,
+  4755,
+  4756,
+  4757,
+  4758,
+  4759,
+  4760,
+  4761,
+  4762,
+  4763,
+  4764,
+  4765,
+  4766,
+  4767,
+  4768,
+  4769,
+  4770,
+  4771,
+  4772,
+  4773,
+  4774,
+  4775,
+  4776,
+  4777,
+  4778,
+  4779,
+  4780,
+  4781,
+  4782,
+  4783,
+  4784,
+  4785,
+  4786,
+  4787,
+  4788,
+  4789,
+  4790,
+  4791,
+  4792,
+  4793,
+  4794,
+  4795,
+  4796,
+  4797,
+  4798,
+  4799,
+  4800,
+  4801,
+  4802,
+  4803,
+  4804,
+  4805,
+  4806,
+  4807,
+  4808,
+  4809,
+  4810,
+  4811,
+  4812,
+  4813,
+  4814,
+  4815,
+  4816,
+  4817,
+  4818,
+  4819,
+  4820,
+  4821,
+  4822,
+  4823,
+  4824,
+  4825,
+  4826,
+  4827,
+  4828,
+  4829,
+  4830,
+  4831,
+  4832,
+  4833,
+  4834,
+  4835,
+  4836,
+  4837,
+  4838,
+  4839,
+  4840,
+  4841,
+  4842,
+  4843,
+  4844,
+  4845,
+  4846,
+  4847,
+  4848,
+  4849,
+  4850,
+  4851,
+  4852,
+  4853,
+  4854,
+  4855,
+  4856,
+  4857,
+  4858,
+  4859,
+  4860,
+  4861,
+  4862,
+  4863,
+  4864,
+  4865,
+  4866,
+  4867,
+  4868,
+  4869,
+  4870,
+  4871,
+  4872,
+  4873,
+  4874,
+  4875,
+  4876,
+  4877,
+  4878,
+  4879,
+  4880,
+  4881,
+  4882,
+  4883,
+  4884,
+  4885,
+  4886,
+  4887,
+  4888,
+  4889,
+  4890,
+  4891,
+  4892,
+  4893,
+  4894,
+  4895,
+  4896,
+  4897,
+  4898,
+  4899,
+  4900,
+  4901,
+  4902,
+  4903,
+  4904,
+  4905,
+  4906,
+  4907,
+  4908,
+  4909,
+  4910,
+  4911,
+  4912,
+  4913,
+  4914,
+  4915,
+  4916,
+  4917,
+  4918,
+  4919,
+  4920,
+  4921,
+  4922,
+  4923,
+  4924,
+  4925,
+  4926,
+  4927,
+  4928,
+  4929,
+  4930,
+  4931,
+  4932,
+  4933,
+  4934,
+  4935,
+  4936,
+  4937,
+  4938,
+  4939,
+  4940,
+  4941,
+  4942,
+  4943,
+  4944,
+  4945,
+  4946,
+  4947,
+  4948,
+  4949,
+  4950,
+  4951,
+  4952,
+  4953,
+  4954,
+  4955,
+  4956,
+  4957,
+  4958,
+  4959,
+  4960,
+  4961,
+  4962,
+  4963,
+  4964,
+  4965,
+  4966,
+  4967,
+  4968,
+  4969,
+  4970,
+  4971,
+  4972,
+  4973,
+  4974,
+  4975,
+  4976,
+  4977,
+  4978,
+  4979,
+  4980,
+  4981,
+  4982,
+  4983,
+  4984,
+  4985,
+  4986,
+  4987,
+  4988,
+  4989,
+  4990,
+  4991,
+  4992,
+  4993,
+  4994,
+  4995,
+  4996,
+  4997,
+  4998,
+  4999,
+  5000,
+  5001,
+  5002,
+  5003,
+  5004,
+  5005,
+  5006,
+  5007,
+  5008,
+  5009,
+  5010,
+  5011,
+  5012,
+  5013,
+  5014,
+  5015,
+  5016,
+  5017,
+  5018,
+  5019,
+  5020,
+  5021,
+  5022,
+  5023,
+  5024,
+  5025,
+  5026,
+  5027,
+  5028,
+  5029,
+  5030,
+  5031,
+  5032,
+  5033,
+  5034,
+  5035,
+  5036,
+  5037,
+  5038,
+  5039,
+  5040,
+  5041,
+  5042,
+  5043,
+  5044,
+  5045,
+  5046,
+  5047,
+  5048,
+  5049,
+  5050,
+  5051,
+  5052,
+  5053,
+  5054,
+  5055,
+  5056,
+  5057,
+  5058,
+  5059,
+  5060,
+  5061,
+  5062,
+  5063,
+  5064,
+  5065,
+  5066,
+  5067,
+  5068,
+  5069,
+  5070,
+  5071,
+  5072,
+  5073,
+  5074,
+  5075,
+  5076,
+  5077,
+  5078,
+  5079,
+  5080,
+  5081,
+  5082,
+  5083,
+  5084,
+  5085,
+  5086,
+  5087,
+  5088,
+  5089,
+  5090,
+  5091,
+  5092,
+  5093,
+  5094,
+  5095,
+  5096,
+  5097,
+  5098,
+  5099,
+  5100,
+  5101,
+  5102,
+  5103,
+  5104,
+  5105,
+  5106,
+  5107,
+  5108,
+  5109,
+  5110,
+  5111,
+  5112,
+  5113,
+  5114,
+  5115,
+  5116,
+  5117,
+  5118,
+  5119,
+  5120,
+  5121,
+  5122,
+  5123,
+  5124,
+  5125,
+  5126,
+  5127,
+  5128,
+  5129,
+  5130,
+  5131,
+  5132,
+  5133,
+  5134,
+  5135,
+  5136,
+  5137,
+  5138,
+  5139,
+  5140,
+  5141,
+  5142,
+  5143,
+  5144,
+  5145,
+  5146,
+  5147,
+  5148,
+  5149,
+  5150,
+  5151,
+  5152,
+  5153,
+  5154,
+  5155,
+  5156,
+  5157,
+  5158,
+  5159,
+  5160,
+  5161,
+  5162,
+  5163,
+  5164,
+  5165,
+  5166,
+  5167,
+  5168,
+  5169,
+  5170,
+  5171,
+  5172,
+  5173,
+  5174,
+  5175,
+  5176,
+  5177,
+  5178,
+  5179,
+  5180,
+  5181,
+  5182,
+  5183,
+  5184,
+  5185,
+  5186,
+  5187,
+  5188,
+  5189,
+  5190,
+  5191,
+  5192,
+  5193,
+  5194,
+  5195,
+  5196,
+  5197,
+  5198,
+  5199,
+  5200,
+  5201,
+  5202,
+  5203,
+  5204,
+  5205,
+  5206,
+  5207,
+  5208,
+  5209,
+  5210,
+  5211,
+  5212,
+  5213,
+  5214,
+  5215,
+  5216,
+  5217,
+  5218,
+  5219,
+  5220,
+  5221,
+  5222,
+  5223,
+  5224,
+  5225,
+  5226,
+  5227,
+  5228,
+  5229,
+  5230,
+  5231,
+  5232,
+  5233,
+  5234,
+  5235,
+  5236,
+  5237,
+  5238,
+  5239,
+  5240,
+  5241,
+  5242,
+  5243,
+  5244,
+  5245,
+  5246,
+  5247,
+  5248,
+  5249,
+  5250,
+  5251,
+  5252,
+  5253,
+  5254,
+  5255,
+  5256,
+  5257,
+  5258,
+  5259,
+  5260,
+  5261,
+  5262,
+  5263,
+  5264,
+  5265,
+  5266,
+  5267,
+  5268,
+  5269,
+  5270,
+  5271,
+  5272,
+  5273,
+  5274,
+  5275,
+  5276,
+  5277,
+  5278,
+  5279,
+  5280,
+  5281,
+  5282,
+  5283,
+  5284,
+  5285,
+  5286,
+  5287,
+  5288,
+  5289,
+  5290,
+  5291,
+  5292,
+  5293,
+  5294,
+  5295,
+  5296,
+  5297,
+  5298,
+  5299,
+  5300,
+  5301,
+  5302,
+  5303,
+  5304,
+  5305,
+  5306,
+  5307,
+  5308,
+  5309,
+  5310,
+  5311,
+  5312,
+  5313,
+  5314,
+  5315,
+  5316,
+  5317,
+  5318,
+  5319,
+  5320,
+  5321,
+  5322,
+  5323,
+  5324,
+  5325,
+  5326,
+  5327,
+  5328,
+  5329,
+  5330,
+  5331,
+  5332,
+  5333,
+  5334,
+  5335,
+  5336,
+  5337,
+  5338,
+  5339,
+  5340,
+  5341,
+  5342,
+  5343,
+  5344,
+  5345,
+  5346,
+  5347,
+  5348,
+  5349,
+  5350,
+  5351,
+  5352,
+  5353,
+  5354,
+  5355,
+  5356,
+  5357,
+  5358,
+  5359,
+  5360,
+  5361,
+  5362,
+  5363,
+  5364,
+  5365,
+  5366,
+  5367,
+  5368,
+  5369,
+  5370,
+  5371,
+  5372,
+  5373,
+  5374,
+  5375,
+  5376,
+  5377,
+  5378,
+  5379,
+  5380,
+  5381,
+  5382,
+  5383,
+  5384,
+  5385,
+  5386,
+  5387,
+  5388,
+  5389,
+  5390,
+  5391,
+  5392,
+  5393,
+  5394,
+  5395,
+  5396,
+  5397,
+  5398,
+  5399,
+  5400,
+  5401,
+  5402,
+  5403,
+  5404,
+  5405,
+  5406,
+  5407,
+  5408,
+  5409,
+  5410,
+  5411,
+  5412,
+  5413,
+  5414,
+  5415,
+  5416,
+  5417,
+  5418,
+  5419,
+  5420,
+  5421,
+  5422,
+  5423,
+  5424,
+  5425,
+  5426,
+  5427,
+  5428,
+  5429,
+  5430,
+  5431,
+  5432,
+  5433,
+  5434,
+  5435,
+  5436,
+  5437,
+  5438,
+  5439,
+  5440,
+  5441,
+  5442,
+  5443,
+  5444,
+  5445,
+  5446,
+  5447,
+  5448,
+  5449,
+  5450,
+  5451,
+  5452,
+  5453,
+  5454,
+  5455,
+  5456,
+  5457,
+  5458,
+  5459,
+  5460,
+  5461,
+  5462,
+  5463,
+  5464,
+  5465,
+  5466,
+  5467,
+  5468,
+  5469,
+  5470,
+  5471,
+  5472,
+  5473,
+  5474,
+  5475,
+  5476,
+  5477,
+  5478,
+  5479,
+  5480,
+  5481,
+  5482,
+  5483,
+  5484,
+  5485,
+  5486,
+  5487,
+  5488,
+  5489,
+  5490,
+  5491,
+  5492,
+  5493,
+  5494,
+  5495,
+  5496,
+  5497,
+  5498,
+  5499,
+  5500,
+  5501,
+  5502,
+  5503,
+  5504,
+  5505,
+  5506,
+  5507,
+  5508,
+  5509,
+  5510,
+  5511,
+  5512,
+  5513,
+  5514,
+  5515,
+  5516,
+  5517,
+  5518,
+  5519,
+  5520,
+  5521,
+  5522,
+  5523,
+  5524,
+  5525,
+  5526,
+  5527,
+  5528,
+  5529,
+  5530,
+  5531,
+  5532,
+  5533,
+  5534,
+  5535,
+  5536,
+  5537,
+  5538,
+  5539,
+  5540,
+  5541,
+  5542,
+  5543,
+  5544,
+  5545,
+  5546,
+  5547,
+  5548,
+  5549,
+  5550,
+  5551,
+  5552,
+  5553,
+  5554,
+  5555,
+  5556,
+  5557,
+  5558,
+  5559,
+  5560,
+  5561,
+  5562,
+  5563,
+  5564,
+  5565,
+  5566,
+  5567,
+  5568,
+  5569,
+  5570,
+  5571,
+  5572,
+  5573,
+  5574,
+  5575,
+  5576,
+  5577,
+  5578,
+  5579,
+  5580,
+  5581,
+  5582,
+  5583,
+  5584,
+  5585,
+  5586,
+  5587,
+  5588,
+  5589,
+  5590,
+  5591,
+  5592,
+  5593,
+  5594,
+  5595,
+  5596,
+  5597,
+  5598,
+  5599,
+  5600,
+  5601,
+  5602,
+  5603,
+  5604,
+  5605,
+  5606,
+  5607,
+  5608,
+  5609,
+  5610,
+  5611,
+  5612,
+  5613,
+  5614,
+  5615,
+  5616,
+  5617,
+  5618,
+  5619,
+  5620,
+  5621,
+  5622,
+  5623,
+  5624,
+  5625,
+  5626,
+  5627,
+  5628,
+  5629,
+  5630,
+  5631,
+  5632,
+  5633,
+  5634,
+  5635,
+  5636,
+  5637,
+  5638,
+  5639,
+  5640,
+  5641,
+  5642,
+  5643,
+  5644,
+  5645,
+  5646,
+  5647,
+  5648,
+  5649,
+  5650,
+  5651,
+  5652,
+  5653,
+  5654,
+  5655,
+  5656,
+  5657,
+  5658,
+  5659,
+  5660,
+  5661,
+  5662,
+  5663,
+  5664,
+  5665,
+  5666,
+  5667,
+  5668,
+  5669,
+  5670,
+  5671,
+  5672,
+  5673,
+  5674,
+  5675,
+  5676,
+  5677,
+  5678,
+  5679,
+  5680,
+  5681,
+  5682,
+  5683,
+  5684,
+  5685,
+  5686,
+  5687,
+  5688,
+  5689,
+  5690,
+  5691,
+  5692,
+  5693,
+  5694,
+  5695,
+  5696,
+  5697,
+  5698,
+  5699,
+  5700,
+  5701,
+  5702,
+  5703,
+  5704,
+  5705,
+  5706,
+  5707,
+  5708,
+  5709,
+  5710,
+  5711,
+  5712,
+  5713,
+  5714,
+  5715,
+  5716,
+  5717,
+  5718,
+  5719,
+  5720,
+  5721,
+  5722,
+  5723,
+  5724,
+  5725,
+  5726,
+  5727,
+  5728,
+  5729,
+  5730,
+  5731,
+  5732,
+  5733,
+  5734,
+  5735,
+  5736,
+  5737,
+  5738,
+  5739,
+  5740,
+  5741,
+  5742,
+  5743,
+  5744,
+  5745,
+  5746,
+  5747,
+  5748,
+  5749,
+  5750,
+  5751,
+  5752,
+  5753,
+  5754,
+  5755,
+  5756,
+  5757,
+  5758,
+  5759,
+  5760,
+  5761,
+  5762,
+  5763,
+  5764,
+  5765,
+  5766,
+  5767,
+  5768,
+  5769,
+  5770,
+  5771,
+  5772,
+  5773,
+  5774,
+  5775,
+  5776,
+  5777,
+  5778,
+  5779,
+  5780,
+  5781,
+  5782,
+  5783,
+  5784,
+  5785,
+  5786,
+  5787,
+  5788,
+  5789,
+  5790,
+  5791,
+  5792,
+  5793,
+  5794,
+  5795,
+  5796,
+  5797,
+  5798,
+  5799,
+  5800,
+  5801,
+  5802,
+  5803,
+  5804,
+  5805,
+  5806,
+  5807,
+  5808,
+  5809,
+  5810,
+  5811,
+  5812,
+  5813,
+  5814,
+  5815,
+  5816,
+  5817,
+  5818,
+  5819,
+  5820,
+  5821,
+  5822,
+  5823,
+  5824,
+  5825,
+  5826,
+  5827,
+  5828,
+  5829,
+  5830,
+  5831,
+  5832,
+  5833,
+  5834,
+  5835,
+  5836,
+  5837,
+  5838,
+  5839,
+  5840,
+  5841,
+  5842,
+  5843,
+  5844,
+  5845,
+  5846,
+  5847,
+  5848,
+  5849,
+  5850,
+  5851,
+  5852,
+  5853,
+  5854,
+  5855,
+  5856,
+  5857,
+  5858,
+  5859,
+  5860,
+  5861,
+  5862,
+  5863,
+  5864,
+  5865,
+  5866,
+  5867,
+  5868,
+  5869,
+  5870,
+  5871,
+  5872,
+  5873,
+  5874,
+  5875,
+  5876,
+  5877,
+  5878,
+  5879,
+  5880,
+  5881,
+  5882,
+  5883,
+  5884,
+  5885,
+  5886,
+  5887,
+  5888,
+  5889,
+  5890,
+  5891,
+  5892,
+  5893,
+  5894,
+  5895,
+  5896,
+  5897,
+  5898,
+  5899,
+  5900,
+  5901,
+  5902,
+  5903,
+  5904,
+  5905,
+  5906,
+  5907,
+  5908,
+  5909,
+  5910,
+  5911,
+  5912,
+  5913,
+  5914,
+  5915,
+  5916,
+  5917,
+  5918,
+  5919,
+  5920,
+  5921,
+  5922,
+  5923,
+  5924,
+  5925,
+  5926,
+  5927,
+  5928,
+  5929,
+  5930,
+  5931,
+  5932,
+  5933,
+  5934,
+  5935,
+  5936,
+  5937,
+  5938,
+  5939,
+  5940,
+  5941,
+  5942,
+  5943,
+  5944,
+  5945,
+  5946,
+  5947,
+  5948,
+  5949,
+  5950,
+  5951,
+  5952,
+  5953,
+  5954,
+  5955,
+  5956,
+  5957,
+  5958,
+  5959,
+  5960,
+  5961,
+  5962,
+  5963,
+  5964,
+  5965,
+  5966,
+  5967,
+  5968,
+  5969,
+  5970,
+  5971,
+  5972,
+  5973,
+  5974,
+  5975,
+  5976,
+  5977,
+  5978,
+  5979,
+  5980,
+  5981,
+  5982,
+  5983,
+  5984,
+  5985,
+  5986,
+  5987,
+  5988,
+  5989,
+  5990,
+  5991,
+  5992,
+  5993,
+  5994,
+  5995,
+  5996,
+  5997,
+  5998,
+  5999,
+  6000,
+  6001,
+  6002,
+  6003,
+  6004,
+  6005,
+  6006,
+  6007,
+  6008,
+  6009,
+  6010,
+  6011,
+  6012,
+  6013,
+  6014,
+  6015,
+  6016,
+  6017,
+  6018,
+  6019,
+  6020,
+  6021,
+  6022,
+  6023,
+  6024,
+  6025,
+  6026,
+  6027,
+  6028,
+  6029,
+  6030,
+  6031,
+  6032,
+  6033,
+  6034,
+  6035,
+  6036,
+  6037,
+  6038,
+  6039,
+  6040,
+  6041,
+  6042,
+  6043,
+  6044,
+  6045,
+  6046,
+  6047,
+  6048,
+  6049,
+  6050,
+  6051,
+  6052,
+  6053,
+  6054,
+  6055,
+  6056,
+  6057,
+  6058,
+  6059,
+  6060,
+  6061,
+  6062,
+  6063,
+  6064,
+  6065,
+  6066,
+  6067,
+  6068,
+  6069,
+  6070,
+  6071,
+  6072,
+  6073,
+  6074,
+  6075,
+  6076,
+  6077,
+  6078,
+  6079,
+  6080,
+  6081,
+  6082,
+  6083,
+  6084,
+  6085,
+  6086,
+  6087,
+  6088,
+  6089,
+  6090,
+  6091,
+  6092,
+  6093,
+  6094,
+  6095,
+  6096,
+  6097,
+  6098,
+  6099,
+  6100,
+  6101,
+  6102,
+  6103,
+  6104,
+  6105,
+  6106,
+  6107,
+  6108,
+  6109,
+  6110,
+  6111,
+  6112,
+  6113,
+  6114,
+  6115,
+  6116,
+  6117,
+  6118,
+  6119,
+  6120,
+  6121,
+  6122,
+  6123,
+  6124,
+  6125,
+  6126,
+  6127,
+  6128,
+  6129,
+  6130,
+  6131,
+  6132,
+  6133,
+  6134,
+  6135,
+  6136,
+  6137,
+  6138,
+  6139,
+  6140,
+  6141,
+  6142,
+  6143,
+  6144,
+  6145,
+  6146,
+  6147,
+  6148,
+  6149,
+  6150,
+  6151,
+  6152,
+  6153,
+  6154,
+  6155,
+  6156,
+  6157,
+  6158,
+  6159,
+  6160,
+  6161,
+  6162,
+  6163,
+  6164,
+  6165,
+  6166,
+  6167,
+  6168,
+  6169,
+  6170,
+  6171,
+  6172,
+  6173,
+  6174,
+  6175,
+  6176,
+  6177,
+  6178,
+  6179,
+  6180,
+  6181,
+  6182,
+  6183,
+  6184,
+  6185,
+  6186,
+  6187,
+  6188,
+  6189,
+  6190,
+  6191,
+  6192,
+  6193,
+  6194,
+  6195,
+  6196,
+  6197,
+  6198,
+  6199,
+  6200,
+  6201,
+  6202,
+  6203,
+  6204,
+  6205,
+  6206,
+  6207,
+  6208,
+  6209,
+  6210,
+  6211,
+  6212,
+  6213,
+  6214,
+  6215,
+  6216,
+  6217,
+  6218,
+  6219,
+  6220,
+  6221,
+  6222,
+  6223,
+  6224,
+  6225,
+  6226,
+  6227,
+  6228,
+  6229,
+  6230,
+  6231,
+  6232,
+  6233,
+  6234,
+  6235,
+  6236,
+  6237,
+  6238,
+  6239,
+  6240,
+  6241,
+  6242,
+  6243,
+  6244,
+  6245,
+  6246,
+  6247,
+  6248,
+  6249,
+  6250,
+  6251,
+  6252,
+  6253,
+  6254,
+  6255,
+  6256,
+  6257,
+  6258,
+  6259,
+  6260,
+  6261,
+  6262,
+  6263,
+  6264,
+  6265,
+  6266,
+  6267,
+  6268,
+  6269,
+  6270,
+  6271,
+  6272,
+  6273,
+  6274,
+  6275,
+  6276,
+  6277,
+  6278,
+  6279,
+  6280,
+  6281,
+  6282,
+  6283,
+  6284,
+  6285,
+  6286,
+  6287,
+  6288,
+  6289,
+  6290,
+  6291,
+  6292,
+  6293,
+  6294,
+  6295,
+  6296,
+  6297,
+  6298,
+  6299,
+  6300,
+  6301,
+  6302,
+  6303,
+  6304,
+  6305,
+  6306,
+  6307,
+  6308,
+  6309,
+  6310,
+  6311,
+  6312,
+  6313,
+  6314,
+  6315,
+  6316,
+  6317,
+  6318,
+  6319,
+  6320,
+  6321,
+  6322,
+  6323,
+  6324,
+  6325,
+  6326,
+  6327,
+  6328,
+  6329,
+  6330,
+  6331,
+  6332,
+  6333,
+  6334,
+  6335,
+  6336,
+  6337,
+  6338,
+  6339,
+  6340,
+  6341,
+  6342,
+  6343,
+  6344,
+  6345,
+  6346,
+  6347,
+  6348,
+  6349,
+  6350,
+  6351,
+  6352,
+  6353,
+  6354,
+  6355,
+  6356,
+  6357,
+  6358,
+  6359,
+  6360,
+  6361,
+  6362,
+  6363,
+  6364,
+  6365,
+  6366,
+  6367,
+  6368,
+  6369,
+  6370,
+  6371,
+  6372,
+  6373,
+  6374,
+  6375,
+  6376,
+  6377,
+  6378,
+  6379,
+  6380,
+  6381,
+  6382,
+  6383,
+  6384,
+  6385,
+  6386,
+  6387,
+  6388,
+  6389,
+  6390,
+  6391,
+  6392,
+  6393,
+  6394,
+  6395,
+  6396,
+  6397,
+  6398,
+  6399,
+  6400,
+  6401,
+  6402,
+  6403,
+  6404,
+  6405,
+  6406,
+  6407,
+  6408,
+  6409,
+  6410,
+  6411,
+  6412,
+  6413,
+  6414,
+  6415,
+  6416,
+  6417,
+  6418,
+  6419,
+  6420,
+  6421,
+  6422,
+  6423,
+  6424,
+  6425,
+  6426,
+  6427,
+  6428,
+  6429,
+  6430,
+  6431,
+  6432,
+  6433,
+  6434,
+  6435,
+  6436,
+  6437,
+  6438,
+  6439,
+  6440,
+  6441,
+  6442,
+  6443,
+  6444,
+  6445,
+  6446,
+  6447,
+  6448,
+  6449,
+  6450,
+  6451,
+  6452,
+  6453,
+  6454,
+  6455,
+  6456,
+  6457,
+  6458,
+  6459,
+  6460,
+  6461,
+  6462,
+  6463,
+  6464,
+  6465,
+  6466,
+  6467,
+  6468,
+  6469,
+  6470,
+  6471,
+  6472,
+  6473,
+  6474,
+  6475,
+  6476,
+  6477,
+  6478,
+  6479,
+  6480,
+  6481,
+  6482,
+  6483,
+  6484,
+  6485,
+  6486,
+  6487,
+  6488,
+  6489,
+  6490,
+  6491,
+  6492,
+  6493,
+  6494,
+  6495,
+  6496,
+  6497,
+  6498,
+  6499,
+  6500,
+  6501,
+  6502,
+  6503,
+  6504,
+  6505,
+  6506,
+  6507,
+  6508,
+  6509,
+  6510,
+  6511,
+  6512,
+  6513,
+  6514,
+  6515,
+  6516,
+  6517,
+  6518,
+  6519,
+  6520,
+  6521,
+  6522,
+  6523,
+  6524,
+  6525,
+  6526,
+  6527,
+  6528,
+  6529,
+  6530,
+  6531,
+  6532,
+  6533,
+  6534,
+  6535,
+  6536,
+  6537,
+  6538,
+  6539,
+  6540,
+  6541,
+  6542,
+  6543,
+  6544,
+  6545,
+  6546,
+  6547,
+  6548,
+  6549,
+  6550,
+  6551,
+  6552,
+  6553,
+  6554,
+  6555,
+  6556,
+  6557,
+  6558,
+  6559,
+  6560,
+  6561,
+  6562,
+  6563,
+  6564,
+  6565,
+  6566,
+  6567,
+  6568,
+  6569,
+  6570,
+  6571,
+  6572,
+  6573,
+  6574,
+  6575,
+  6576,
+  6577,
+  6578,
+  6579,
+  6580,
+  6581,
+  6582,
+  6583,
+  6584,
+  6585,
+  6586,
+  6587,
+  6588,
+  6589,
+  6590,
+  6591,
+  6592,
+  6593,
+  6594,
+  6595,
+  6596,
+  6597,
+  6598,
+  6599,
+  6600,
+  6601,
+  6602,
+  6603,
+  6604,
+  6605,
+  6606,
+  6607,
+  6608,
+  6609,
+  6610,
+  6611,
+  6612,
+  6613,
+  6614,
+  6615,
+  6616,
+  6617,
+  6618,
+  6619,
+  6620,
+  6621,
+  6622,
+  6623,
+  6624,
+  6625,
+  6626,
+  6627,
+  6628,
+  6629,
+  6630,
+  6631,
+  6632,
+  6633,
+  6634,
+  6635,
+  6636,
+  6637,
+  6638,
+  6639,
+  6640,
+  6641,
+  6642,
+  6643,
+  6644,
+  6645,
+  6646,
+  6647,
+  6648,
+  6649,
+  6650,
+  6651,
+  6652,
+  6653,
+  6654,
+  6655,
+  6656,
+  6657,
+  6658,
+  6659,
+  6660,
+  6661,
+  6662,
+  6663,
+  6664,
+  6665,
+  6666,
+  6667,
+  6668,
+  6669,
+  6670,
+  6671,
+  6672,
+  6673,
+  6674,
+  6675,
+  6676,
+  6677,
+  6678,
+  6679,
+  6680,
+  6681,
+  6682,
+  6683,
+  6684,
+  6685,
+  6686,
+  6687,
+  6688,
+  6689,
+  6690,
+  6691,
+  6692,
+  6693,
+  6694,
+  6695,
+  6696,
+  6697,
+  6698,
+  6699,
+  6700,
+  6701,
+  6702,
+  6703,
+  6704,
+  6705,
+  6706,
+  6707,
+  6708,
+  6709,
+  6710,
+  6711,
+  6712,
+  6713,
+  6714,
+  6715,
+  6716,
+  6717,
+  6718,
+  6719,
+  6720,
+  6721,
+  6722,
+  6723,
+  6724,
+  6725,
+  6726,
+  6727,
+  6728,
+  6729,
+  6730,
+  6731,
+  6732,
+  6733,
+  6734,
+  6735,
+  6736,
+  6737,
+  6738,
+  6739,
+  6740,
+  6741,
+  6742,
+  6743,
+  6744,
+  6745,
+  6746,
+  6747,
+  6748,
+  6749,
+  6750,
+  6751,
+  6752,
+  6753,
+  6754,
+  6755,
+  6756,
+  6757,
+  6758,
+  6759,
+  6760,
+  6761,
+  6762,
+  6763,
+  6764,
+  6765,
+  6766,
+  6767,
+  6768,
+  6769,
+  6770,
+  6771,
+  6772,
+  6773,
+  6774,
+  6775,
+  6776,
+  6777,
+  6778,
+  6779,
+  6780,
+  6781,
+  6782,
+  6783,
+  6784,
+  6785,
+  6786,
+  6787,
+  6788,
+  6789,
+  6790,
+  6791,
+  6792,
+  6793,
+  6794,
+  6795,
+  6796,
+  6797,
+  6798,
+  6799,
+  6800,
+  6801,
+  6802,
+  6803,
+  6804,
+  6805,
+  6806,
+  6807,
+  6808,
+  6809,
+  6810,
+  6811,
+  6812,
+  6813,
+  6814,
+  6815,
+  6816,
+  6817,
+  6818,
+  6819,
+  6820,
+  6821,
+  6822,
+  6823,
+  6824,
+  6825,
+  6826,
+  6827,
+  6828,
+  6829,
+  6830,
+  6831,
+  6832,
+  6833,
+  6834,
+  6835,
+  6836,
+  6837,
+  6838,
+  6839,
+  6840,
+  6841,
+  6842,
+  6843,
+  6844,
+  6845,
+  6846,
+  6847,
+  6848,
+  6849,
+  6850,
+  6851,
+  6852,
+  6853,
+  6854,
+  6855,
+  6856,
+  6857,
+  6858,
+  6859,
+  6860,
+  6861,
+  6862,
+  6863,
+  6864,
+  6865,
+  6866,
+  6867,
+  6868,
+  6869,
+  6870,
+  6871,
+  6872,
+  6873,
+  6874,
+  6875,
+  6876,
+  6877,
+  6878,
+  6879,
+  6880,
+  6881,
+  6882,
+  6883,
+  6884,
+  6885,
+  6886,
+  6887,
+  6888,
+  6889,
+  6890,
+  6891,
+  6892,
+  6893,
+  6894,
+  6895,
+  6896,
+  6897,
+  6898,
+  6899,
+  6900,
+  6901,
+  6902,
+  6903,
+  6904,
+  6905,
+  6906,
+  6907,
+  6908,
+  6909,
+  6910,
+  6911,
+  6912,
+  6913,
+  6914,
+  6915,
+  6916,
+  6917,
+  6918,
+  6919,
+  6920,
+  6921,
+  6922,
+  6923,
+  6924,
+  6925,
+  6926,
+  6927,
+  6928,
+  6929,
+  6930,
+  6931,
+  6932,
+  6933,
+  6934,
+  6935,
+  6936,
+  6937,
+  6938,
+  6939,
+  6940,
+  6941,
+  6942,
+  6943,
+  6944,
+  6945,
+  6946,
+  6947,
+  6948,
+  6949,
+  6950,
+  6951,
+  6952,
+  6953,
+  6954,
+  6955,
+  6956,
+  6957,
+  6958,
+  6959,
+  6960,
+  6961,
+  6962,
+  6963,
+  6964,
+  6965,
+  6966,
+  6967,
+  6968,
+  6969,
+  6970,
+  6971,
+  6972,
+  6973,
+  6974,
+  6975,
+  6976,
+  6977,
+  6978,
+  6979,
+  6980,
+  6981,
+  6982,
+  6983,
+  6984,
+  6985,
+  6986,
+  6987,
+  6988,
+  6989,
+  6990,
+  6991,
+  6992,
+  6993,
+  6994,
+  6995,
+  6996,
+  6997,
+  6998,
+  6999,
+  7000,
+  7001,
+  7002,
+  7003,
+  7004,
+  7005,
+  7006,
+  7007,
+  7008,
+  7009,
+  7010,
+  7011,
+  7012,
+  7013,
+  7014,
+  7015,
+  7016,
+  7017,
+  7018,
+  7019,
+  7020,
+  7021,
+  7022,
+  7023,
+  7024,
+  7025,
+  7026,
+  7027,
+  7028,
+  7029,
+  7030,
+  7031,
+  7032,
+  7033,
+  7034,
+  7035,
+  7036,
+  7037,
+  7038,
+  7039,
+  7040,
+  7041,
+  7042,
+  7043,
+  7044,
+  7045,
+  7046,
+  7047,
+  7048,
+  7049,
+  7050,
+  7051,
+  7052,
+  7053,
+  7054,
+  7055,
+  7056,
+  7057,
+  7058,
+  7059,
+  7060,
+  7061,
+  7062,
+  7063,
+  7064,
+  7065,
+  7066,
+  7067,
+  7068,
+  7069,
+  7070,
+  7071,
+  7072,
+  7073,
+  7074,
+  7075,
+  7076,
+  7077,
+  7078,
+  7079,
+  7080,
+  7081,
+  7082,
+  7083,
+  7084,
+  7085,
+  7086,
+  7087,
+  7088,
+  7089,
+  7090,
+  7091,
+  7092,
+  7093,
+  7094,
+  7095,
+  7096,
+  7097,
+  7098,
+  7099,
+  7100,
+  7101,
+  7102,
+  7103,
+  7104,
+  7105,
+  7106,
+  7107,
+  7108,
+  7109,
+  7110,
+  7111,
+  7112,
+  7113,
+  7114,
+  7115,
+  7116,
+  7117,
+  7118,
+  7119,
+  7120,
+  7121,
+  7122,
+  7123,
+  7124,
+  7125,
+  7126,
+  7127,
+  7128,
+  7129,
+  7130,
+  7131,
+  7132,
+  7133,
+  7134,
+  7135,
+  7136,
+  7137,
+  7138,
+  7139,
+  7140,
+  7141,
+  7142,
+  7143,
+  7144,
+  7145,
+  7146,
+  7147,
+  7148,
+  7149,
+  7150,
+  7151,
+  7152,
+  7153,
+  7154,
+  7155,
+  7156,
+  7157,
+  7158,
+  7159,
+  7160,
+  7161,
+  7162,
+  7163,
+  7164,
+  7165,
+  7166,
+  7167,
+  7168,
+  7169,
+  7170,
+  7171,
+  7172,
+  7173,
+  7174,
+  7175,
+  7176,
+  7177,
+  7178,
+  7179,
+  7180,
+  7181,
+  7182,
+  7183,
+  7184,
+  7185,
+  7186,
+  7187,
+  7188,
+  7189,
+  7190,
+  7191,
+  7192,
+  7193,
+  7194,
+  7195,
+  7196,
+  7197,
+  7198,
+  7199,
+  7200,
+  7201,
+  7202,
+  7203,
+  7204,
+  7205,
+  7206,
+  7207,
+  7208,
+  7209,
+  7210,
+  7211,
+  7212,
+  7213,
+  7214,
+  7215,
+  7216,
+  7217,
+  7218,
+  7219,
+  7220,
+  7221,
+  7222,
+  7223,
+  7224,
+  7225,
+  7226,
+  7227,
+  7228,
+  7229,
+  7230,
+  7231,
+  7232,
+  7233,
+  7234,
+  7235,
+  7236,
+  7237,
+  7238,
+  7239,
+  7240,
+  7241,
+  7242,
+  7243,
+  7244,
+  7245,
+  7246,
+  7247,
+  7248,
+  7249,
+  7250,
+  7251,
+  7252,
+  7253,
+  7254,
+  7255,
+  7256,
+  7257,
+  7258,
+  7259,
+  7260,
+  7261,
+  7262,
+  7263,
+  7264,
+  7265,
+  7266,
+  7267,
+  7268,
+  7269,
+  7270,
+  7271,
+  7272,
+  7273,
+  7274,
+  7275,
+  7276,
+  7277,
+  7278,
+  7279,
+  7280,
+  7281,
+  7282,
+  7283,
+  7284,
+  7285,
+  7286,
+  7287,
+  7288,
+  7289,
+  7290,
+  7291,
+  7292,
+  7293,
+  7294,
+  7295,
+  7296,
+  7297,
+  7298,
+  7299,
+  7300,
+  7301,
+  7302,
+  7303,
+  7304,
+  7305,
+  7306,
+  7307,
+  7308,
+  7309,
+  7310,
+  7311,
+  7312,
+  7313,
+  7314,
+  7315,
+  7316,
+  7317,
+  7318,
+  7319,
+  7320,
+  7321,
+  7322,
+  7323,
+  7324,
+  7325,
+  7326,
+  7327,
+  7328,
+  7329,
+  7330,
+  7331,
+  7332,
+  7333,
+  7334,
+  7335,
+  7336,
+  7337,
+  7338,
+  7339,
+  7340,
+  7341,
+  7342,
+  7343,
+  7344,
+  7345,
+  7346,
+  7347,
+  7348,
+  7349,
+  7350,
+  7351,
+  7352,
+  7353,
+  7354,
+  7355,
+  7356,
+  7357,
+  7358,
+  7359,
+  7360,
+  7361,
+  7362,
+  7363,
+  7364,
+  7365,
+  7366,
+  7367,
+  7368,
+  7369,
+  7370,
+  7371,
+  7372,
+  7373,
+  7374,
+  7375,
+  7376,
+  7377,
+  7378,
+  7379,
+  7380,
+  7381,
+  7382,
+  7383,
+  7384,
+  7385,
+  7386,
+  7387,
+  7388,
+  7389,
+  7390,
+  7391,
+  7392,
+  7393,
+  7394,
+  7395,
+  7396,
+  7397,
+  7398,
+  7399,
+  7400,
+  7401,
+  7402,
+  7403,
+  7404,
+  7405,
+  7406,
+  7407,
+  7408,
+  7409,
+  7410,
+  7411,
+  7412,
+  7413,
+  7414,
+  7415,
+  7416,
+  7417,
+  7418,
+  7419,
+  7420,
+  7421,
+  7422,
+  7423,
+  7424,
+  7425,
+  7426,
+  7427,
+  7428,
+  7429,
+  7430,
+  7431,
+  7432,
+  7433,
+  7434,
+  7435,
+  7436,
+  7437,
+  7438,
+  7439,
+  7440,
+  7441,
+  7442,
+  7443,
+  7444,
+  7445,
+  7446,
+  7447,
+  7448,
+  7449,
+  7450,
+  7451,
+  7452,
+  7453,
+  7454,
+  7455,
+  7456,
+  7457,
+  7458,
+  7459,
+  7460,
+  7461,
+  7462,
+  7463,
+  7464,
+  7465,
+  7466,
+  7467,
+  7468,
+  7469,
+  7470,
+  7471,
+  7472,
+  7473,
+  7474,
+  7475,
+  7476,
+  7477,
+  7478,
+  7479,
+  7480,
+  7481,
+  7482,
+  7483,
+  7484,
+  7485,
+  7486,
+  7487,
+  7488,
+  7489,
+  7490,
+  7491,
+  7492,
+  7493,
+  7494,
+  7495,
+  7496,
+  7497,
+  7498,
+  7499,
+  7500,
+  7501,
+  7502,
+  7503,
+  7504,
+  7505,
+  7506,
+  7507,
+  7508,
+  7509,
+  7510,
+  7511,
+  7512,
+  7513,
+  7514,
+  7515,
+  7516,
+  7517,
+  7518,
+  7519,
+  7520,
+  7521,
+  7522,
+  7523,
+  7524,
+  7525,
+  7526,
+  7527,
+  7528,
+  7529,
+  7530,
+  7531,
+  7532,
+  7533,
+  7534,
+  7535,
+  7536,
+  7537,
+  7538,
+  7539,
+  7540,
+  7541,
+  7542,
+  7543,
+  7544,
+  7545,
+  7546,
+  7547,
+  7548,
+  7549,
+  7550,
+  7551,
+  7552,
+  7553,
+  7554,
+  7555,
+  7556,
+  7557,
+  7558,
+  7559,
+  7560,
+  7561,
+  7562,
+  7563,
+  7564,
+  7565,
+  7566,
+  7567,
+  7568,
+  7569,
+  7570,
+  7571,
+  7572,
+  7573,
+  7574,
+  7575,
+  7576,
+  7577,
+  7578,
+  7579,
+  7580,
+  7581,
+  7582,
+  7583,
+  7584,
+  7585,
+  7586,
+  7587,
+  7588,
+  7589,
+  7590,
+  7591,
+  7592,
+  7593,
+  7594,
+  7595,
+  7596,
+  7597,
+  7598,
+  7599,
+  7600,
+  7601,
+  7602,
+  7603,
+  7604,
+  7605,
+  7606,
+  7607,
+  7608,
+  7609,
+  7610,
+  7611,
+  7612,
+  7613,
+  7614,
+  7615,
+  7616,
+  7617,
+  7618,
+  7619,
+  7620,
+  7621,
+  7622,
+  7623,
+  7624,
+  7625,
+  7626,
+  7627,
+  7628,
+  7629,
+  7630,
+  7631,
+  7632,
+  7633,
+  7634,
+  7635,
+  7636,
+  7637,
+  7638,
+  7639,
+  7640,
+  7641,
+  7642,
+  7643,
+  7644,
+  7645,
+  7646,
+  7647,
+  7648,
+  7649,
+  7650,
+  7651,
+  7652,
+  7653,
+  7654,
+  7655,
+  7656,
+  7657,
+  7658,
+  7659,
+  7660,
+  7661,
+  7662,
+  7663,
+  7664,
+  7665,
+  7666,
+  7667,
+  7668,
+  7669,
+  7670,
+  7671,
+  7672,
+  7673,
+  7674,
+  7675,
+  7676,
+  7677,
+  7678,
+  7679,
+  7680,
+  7681,
+  7682,
+  7683,
+  7684,
+  7685,
+  7686,
+  7687,
+  7688,
+  7689,
+  7690,
+  7691,
+  7692,
+  7693,
+  7694,
+  7695,
+  7696,
+  7697,
+  7698,
+  7699,
+  7700,
+  7701,
+  7702,
+  7703,
+  7704,
+  7705,
+  7706,
+  7707,
+  7708,
+  7709,
+  7710,
+  7711,
+  7712,
+  7713,
+  7714,
+  7715,
+  7716,
+  7717,
+  7718,
+  7719,
+  7720,
+  7721,
+  7722,
+  7723,
+  7724,
+  7725,
+  7726,
+  7727,
+  7728,
+  7729,
+  7730,
+  7731,
+  7732,
+  7733,
+  7734,
+  7735,
+  7736,
+  7737,
+  7738,
+  7739,
+  7740,
+  7741,
+  7742,
+  7743,
+  7744,
+  7745,
+  7746,
+  7747,
+  7748,
+  7749,
+  7750,
+  7751,
+  7752,
+  7753,
+  7754,
+  7755,
+  7756,
+  7757,
+  7758,
+  7759,
+  7760,
+  7761,
+  7762,
+  7763,
+  7764,
+  7765,
+  7766,
+  7767,
+  7768,
+  7769,
+  7770,
+  7771,
+  7772,
+  7773,
+  7774,
+  7775,
+  7776,
+  7777,
+  7778,
+  7779,
+  7780,
+  7781,
+  7782,
+  7783,
+  7784,
+  7785,
+  7786,
+  7787,
+  7788,
+  7789,
+  7790,
+  7791,
+  7792,
+  7793,
+  7794,
+  7795,
+  7796,
+  7797,
+  7798,
+  7799,
+  7800,
+  7801,
+  7802,
+  7803,
+  7804,
+  7805,
+  7806,
+  7807,
+  7808,
+  7809,
+  7810,
+  7811,
+  7812,
+  7813,
+  7814,
+  7815,
+  7816,
+  7817,
+  7818,
+  7819,
+  7820,
+  7821,
+  7822,
+  7823,
+  7824,
+  7825,
+  7826,
+  7827,
+  7828,
+  7829,
+  7830,
+  7831,
+  7832,
+  7833,
+  7834,
+  7835,
+  7836,
+  7837,
+  7838,
+  7839,
+  7840,
+  7841,
+  7842,
+  7843,
+  7844,
+  7845,
+  7846,
+  7847,
+  7848,
+  7849,
+  7850,
+  7851,
+  7852,
+  7853,
+  7854,
+  7855,
+  7856,
+  7857,
+  7858,
+  7859,
+  7860,
+  7861,
+  7862,
+  7863,
+  7864,
+  7865,
+  7866,
+  7867,
+  7868,
+  7869,
+  7870,
+  7871,
+  7872,
+  7873,
+  7874,
+  7875,
+  7876,
+  7877,
+  7878,
+  7879,
+  7880,
+  7881,
+  7882,
+  7883,
+  7884,
+  7885,
+  7886,
+  7887,
+  7888,
+  7889,
+  7890,
+  7891,
+  7892,
+  7893,
+  7894,
+  7895,
+  7896,
+  7897,
+  7898,
+  7899,
+  7900,
+  7901,
+  7902,
+  7903,
+  7904,
+  7905,
+  7906,
+  7907,
+  7908,
+  7909,
+  7910,
+  7911,
+  7912,
+  7913,
+  7914,
+  7915,
+  7916,
+  7917,
+  7918,
+  7919,
+  7920,
+  7921,
+  7922,
+  7923,
+  7924,
+  7925,
+  7926,
+  7927,
+  7928,
+  7929,
+  7930,
+  7931,
+  7932,
+  7933,
+  7934,
+  7935,
+  7936,
+  7937,
+  7938,
+  7939,
+  7940,
+  7941,
+  7942,
+  7943,
+  7944,
+  7945,
+  7946,
+  7947,
+  7948,
+  7949,
+  7950,
+  7951,
+  7952,
+  7953,
+  7954,
+  7955,
+  7956,
+  7957,
+  7958,
+  7959,
+  7960,
+  7961,
+  7962,
+  7963,
+  7964,
+  7965,
+  7966,
+  7967,
+  7968,
+  7969,
+  7970,
+  7971,
+  7972,
+  7973,
+  7974,
+  7975,
+  7976,
+  7977,
+  7978,
+  7979,
+  7980,
+  7981,
+  7982,
+  7983,
+  7984,
+  7985,
+  7986,
+  7987,
+  7988,
+  7989,
+  7990,
+  7991,
+  7992,
+  7993,
+  7994,
+  7995,
+  7996,
+  7997,
+  7998,
+  7999,
+  8000,
+  8001,
+  8002,
+  8003,
+  8004,
+  8005,
+  8006,
+  8007,
+  8008,
+  8009,
+  8010,
+  8011,
+  8012,
+  8013,
+  8014,
+  8015,
+  8016,
+  8017,
+  8018,
+  8019,
+  8020,
+  8021,
+  8022,
+  8023,
+  8024,
+  8025,
+  8026,
+  8027,
+  8028,
+  8029,
+  8030,
+  8031,
+  8032,
+  8033,
+  8034,
+  8035,
+  8036,
+  8037,
+  8038,
+  8039,
+  8040,
+  8041,
+  8042,
+  8043,
+  8044,
+  8045,
+  8046,
+  8047,
+  8048,
+  8049,
+  8050,
+  8051,
+  8052,
+  8053,
+  8054,
+  8055,
+  8056,
+  8057,
+  8058,
+  8059,
+  8060,
+  8061,
+  8062,
+  8063,
+  8064,
+  8065,
+  8066,
+  8067,
+  8068,
+  8069,
+  8070,
+  8071,
+  8072,
+  8073,
+  8074,
+  8075,
+  8076,
+  8077,
+  8078,
+  8079,
+  8080,
+  8081,
+  8082,
+  8083,
+  8084,
+  8085,
+  8086,
+  8087,
+  8088,
+  8089,
+  8090,
+  8091,
+  8092,
+  8093,
+  8094,
+  8095,
+  8096,
+  8097,
+  8098,
+  8099,
+  8100,
+  8101,
+  8102,
+  8103,
+  8104,
+  8105,
+  8106,
+  8107,
+  8108,
+  8109,
+  8110,
+  8111,
+  8112,
+  8113,
+  8114,
+  8115,
+  8116,
+  8117,
+  8118,
+  8119,
+  8120,
+  8121,
+  8122,
+  8123,
+  8124,
+  8125,
+  8126,
+  8127,
+  8128,
+  8129,
+  8130,
+  8131,
+  8132,
+  8133,
+  8134,
+  8135,
+  8136,
+  8137,
+  8138,
+  8139,
+  8140,
+  8141,
+  8142,
+  8143,
+  8144,
+  8145,
+  8146,
+  8147,
+  8148,
+  8149,
+  8150,
+  8151,
+  8152,
+  8153,
+  8154,
+  8155,
+  8156,
+  8157,
+  8158,
+  8159,
+  8160,
+  8161,
+  8162,
+  8163,
+  8164,
+  8165,
+  8166,
+  8167,
+  8168,
+  8169,
+  8170,
+  8171,
+  8172,
+  8173,
+  8174,
+  8175,
+  8176,
+  8177,
+  8178,
+  8179,
+  8180,
+  8181,
+  8182,
+  8183,
+  8184,
+  8185,
+  8186,
+  8187,
+  8188,
+  8189,
+  8190,
+  8191,
+  8192,
+  8193,
+  8194,
+  8195,
+  8196,
+  8197,
+  8198,
+  8199,
+  8200,
+  8201,
+  8202,
+  8203,
+  8204,
+  8205,
+  8206,
+  8207,
+  8208,
+  8209,
+  8210,
+  8211,
+  8212,
+  8213,
+  8214,
+  8215,
+  8216,
+  8217,
+  8218,
+  8219,
+  8220,
+  8221,
+  8222,
+  8223,
+  8224,
+  8225,
+  8226,
+  8227,
+  8228,
+  8229,
+  8230,
+  8231,
+  8232,
+  8233,
+  8234,
+  8235,
+  8236,
+  8237,
+  8238,
+  8239,
+  8240,
+  8241,
+  8242,
+  8243,
+  8244,
+  8245,
+  8246,
+  8247,
+  8248,
+  8249,
+  8250,
+  8251,
+  8252,
+  8253,
+  8254,
+  8255,
+  8256,
+  8257,
+  8258,
+  8259,
+  8260,
+  8261,
+  8262,
+  8263,
+  8264,
+  8265,
+  8266,
+  8267,
+  8268,
+  8269,
+  8270,
+  8271,
+  8272,
+  8273,
+  8274,
+  8275,
+  8276,
+  8277,
+  8278,
+  8279,
+  8280,
+  8281,
+  8282,
+  8283,
+  8284,
+  8285,
+  8286,
+  8287,
+  8288,
+  8289,
+  8290,
+  8291,
+  8292,
+  8293,
+  8294,
+  8295,
+  8296,
+  8297,
+  8298,
+  8299,
+  8300,
+  8301,
+  8302,
+  8303,
+  8304,
+  8305,
+  8306,
+  8307,
+  8308,
+  8309,
+  8310,
+  8311,
+  8312,
+  8313,
+  8314,
+  8315,
+  8316,
+  8317,
+  8318,
+  8319,
+  8320,
+  8321,
+  8322,
+  8323,
+  8324,
+  8325,
+  8326,
+  8327,
+  8328,
+  8329,
+  8330,
+  8331,
+  8332,
+  8333,
+  8334,
+  8335,
+  8336,
+  8337,
+  8338,
+  8339,
+  8340,
+  8341,
+  8342,
+  8343,
+  8344,
+  8345,
+  8346,
+  8347,
+  8348,
+  8349,
+  8350,
+  8351,
+  8352,
+  8353,
+  8354,
+  8355,
+  8356,
+  8357,
+  8358,
+  8359,
+  8360,
+  8361,
+  8362,
+  8363,
+  8364,
+  8365,
+  8366,
+  8367,
+  8368,
+  8369,
+  8370,
+  8371,
+  8372,
+  8373,
+  8374,
+  8375,
+  8376,
+  8377,
+  8378,
+  8379,
+  8380,
+  8381,
+  8382,
+  8383,
+  8384,
+  8385,
+  8386,
+  8387,
+  8388,
+  8389,
+  8390,
+  8391,
+  8392,
+  8393,
+  8394,
+  8395,
+  8396,
+  8397,
+  8398,
+  8399,
+  8400,
+  8401,
+  8402,
+  8403,
+  8404,
+  8405,
+  8406,
+  8407,
+  8408,
+  8409,
+  8410,
+  8411,
+  8412,
+  8413,
+  8414,
+  8415,
+  8416,
+  8417,
+  8418,
+  8419,
+  8420,
+  8421,
+  8422,
+  8423,
+  8424,
+  8425,
+  8426,
+  8427,
+  8428,
+  8429,
+  8430,
+  8431,
+  8432,
+  8433,
+  8434,
+  8435,
+  8436,
+  8437,
+  8438,
+  8439,
+  8440,
+  8441,
+  8442,
+  8443,
+  8444,
+  8445,
+  8446,
+  8447,
+  8448,
+  8449,
+  8450,
+  8451,
+  8452,
+  8453,
+  8454,
+  8455,
+  8456,
+  8457,
+  8458,
+  8459,
+  8460,
+  8461,
+  8462,
+  8463,
+  8464,
+  8465,
+  8466,
+  8467,
+  8468,
+  8469,
+  8470,
+  8471,
+  8472,
+  8473,
+  8474,
+  8475,
+  8476,
+  8477,
+  8478,
+  8479,
+  8480,
+  8481,
+  8482,
+  8483,
+  8484,
+  8485,
+  8486,
+  8487,
+  8488,
+  8489,
+  8490,
+  8491,
+  8492,
+  8493,
+  8494,
+  8495,
+  8496,
+  8497,
+  8498,
+  8499,
+  8500,
+  8501,
+  8502,
+  8503,
+  8504,
+  8505,
+  8506,
+  8507,
+  8508,
+  8509,
+  8510,
+  8511,
+  8512,
+  8513,
+  8514,
+  8515,
+  8516,
+  8517,
+  8518,
+  8519,
+  8520,
+  8521,
+  8522,
+  8523,
+  8524,
+  8525,
+  8526,
+  8527,
+  8528,
+  8529,
+  8530,
+  8531,
+  8532,
+  8533,
+  8534,
+  8535,
+  8536,
+  8537,
+  8538,
+  8539,
+  8540,
+  8541,
+  8542,
+  8543,
+  8544,
+  8545,
+  8546,
+  8547,
+  8548,
+  8549,
+  8550,
+  8551,
+  8552,
+  8553,
+  8554,
+  8555,
+  8556,
+  8557,
+  8558,
+  8559,
+  8560,
+  8561,
+  8562,
+  8563,
+  8564,
+  8565,
+  8566,
+  8567,
+  8568,
+  8569,
+  8570,
+  8571,
+  8572,
+  8573,
+  8574,
+  8575,
+  8576,
+  8577,
+  8578,
+  8579,
+  8580,
+  8581,
+  8582,
+  8583,
+  8584,
+  8585,
+  8586,
+  8587,
+  8588,
+  8589,
+  8590,
+  8591,
+  8592,
+  8593,
+  8594,
+  8595,
+  8596,
+  8597,
+  8598,
+  8599,
+  8600,
+  8601,
+  8602,
+  8603,
+  8604,
+  8605,
+  8606,
+  8607,
+  8608,
+  8609,
+  8610,
+  8611,
+  8612,
+  8613,
+  8614,
+  8615,
+  8616,
+  8617,
+  8618,
+  8619,
+  8620,
+  8621,
+  8622,
+  8623,
+  8624,
+  8625,
+  8626,
+  8627,
+  8628,
+  8629,
+  8630,
+  8631,
+  8632,
+  8633,
+  8634,
+  8635,
+  8636,
+  8637,
+  8638,
+  8639,
+  8640,
+  8641,
+  8642,
+  8643,
+  8644,
+  8645,
+  8646,
+  8647,
+  8648,
+  8649,
+  8650,
+  8651,
+  8652,
+  8653,
+  8654,
+  8655,
+  8656,
+  8657,
+  8658,
+  8659,
+  8660,
+  8661,
+  8662,
+  8663,
+  8664,
+  8665,
+  8666,
+  8667,
+  8668,
+  8669,
+  8670,
+  8671,
+  8672,
+  8673,
+  8674,
+  8675,
+  8676,
+  8677,
+  8678,
+  8679,
+  8680,
+  8681,
+  8682,
+  8683,
+  8684,
+  8685,
+  8686,
+  8687,
+  8688,
+  8689,
+  8690,
+  8691,
+  8692,
+  8693,
+  8694,
+  8695,
+  8696,
+  8697,
+  8698,
+  8699,
+  8700,
+  8701,
+  8702,
+  8703,
+  8704,
+  8705,
+  8706,
+  8707,
+  8708,
+  8709,
+  8710,
+  8711,
+  8712,
+  8713,
+  8714,
+  8715,
+  8716,
+  8717,
+  8718,
+  8719,
+  8720,
+  8721,
+  8722,
+  8723,
+  8724,
+  8725,
+  8726,
+  8727,
+  8728,
+  8729,
+  8730,
+  8731,
+  8732,
+  8733,
+  8734,
+  8735,
+  8736,
+  8737,
+  8738,
+  8739,
+  8740,
+  8741,
+  8742,
+  8743,
+  8744,
+  8745,
+  8746,
+  8747,
+  8748,
+  8749,
+  8750,
+  8751,
+  8752,
+  8753,
+  8754,
+  8755,
+  8756,
+  8757,
+  8758,
+  8759,
+  8760,
+  8761,
+  8762,
+  8763,
+  8764,
+  8765,
+  8766,
+  8767,
+  8768,
+  8769,
+  8770,
+  8771,
+  8772,
+  8773,
+  8774,
+  8775,
+  8776,
+  8777,
+  8778,
+  8779,
+  8780,
+  8781,
+  8782,
+  8783,
+  8784,
+  8785,
+  8786,
+  8787,
+  8788,
+  8789,
+  8790,
+  8791,
+  8792,
+  8793,
+  8794,
+  8795,
+  8796,
+  8797,
+  8798,
+  8799,
+  8800,
+  8801,
+  8802,
+  8803,
+  8804,
+  8805,
+  8806,
+  8807,
+  8808,
+  8809,
+  8810,
+  8811,
+  8812,
+  8813,
+  8814,
+  8815,
+  8816,
+  8817,
+  8818,
+  8819,
+  8820,
+  8821,
+  8822,
+  8823,
+  8824,
+  8825,
+  8826,
+  8827,
+  8828,
+  8829,
+  8830,
+  8831,
+  8832,
+  8833,
+  8834,
+  8835,
+  8836,
+  8837,
+  8838,
+  8839,
+  8840,
+  8841,
+  8842,
+  8843,
+  8844,
+  8845,
+  8846,
+  8847,
+  8848,
+  8849,
+  8850,
+  8851,
+  8852,
+  8853,
+  8854,
+  8855,
+  8856,
+  8857,
+  8858,
+  8859,
+  8860,
+  8861,
+  8862,
+  8863,
+  8864,
+  8865,
+  8866,
+  8867,
+  8868,
+  8869,
+  8870,
+  8871,
+  8872,
+  8873,
+  8874,
+  8875,
+  8876,
+  8877,
+  8878,
+  8879,
+  8880,
+  8881,
+  8882,
+  8883,
+  8884,
+  8885,
+  8886,
+  8887,
+  8888,
+  8889,
+  8890,
+  8891,
+  8892,
+  8893,
+  8894,
+  8895,
+  8896,
+  8897,
+  8898,
+  8899,
+  8900,
+  8901,
+  8902,
+  8903,
+  8904,
+  8905,
+  8906,
+  8907,
+  8908,
+  8909,
+  8910,
+  8911,
+  8912,
+  8913,
+  8914,
+  8915,
+  8916,
+  8917,
+  8918,
+  8919,
+  8920,
+  8921,
+  8922,
+  8923,
+  8924,
+  8925,
+  8926,
+  8927,
+  8928,
+  8929,
+  8930,
+  8931,
+  8932,
+  8933,
+  8934,
+  8935,
+  8936,
+  8937,
+  8938,
+  8939,
+  8940,
+  8941,
+  8942,
+  8943,
+  8944,
+  8945,
+  8946,
+  8947,
+  8948,
+  8949,
+  8950,
+  8951,
+  8952,
+  8953,
+  8954,
+  8955,
+  8956,
+  8957,
+  8958,
+  8959,
+  8960,
+  8961,
+  8962,
+  8963,
+  8964,
+  8965,
+  8966,
+  8967,
+  8968,
+  8969,
+  8970,
+  8971,
+  8972,
+  8973,
+  8974,
+  8975,
+  8976,
+  8977,
+  8978,
+  8979,
+  8980,
+  8981,
+  8982,
+  8983,
+  8984,
+  8985,
+  8986,
+  8987,
+  8988,
+  8989,
+  8990,
+  8991,
+  8992,
+  8993,
+  8994,
+  8995,
+  8996,
+  8997,
+  8998,
+  8999,
+  9000,
+  9001,
+  9002,
+  9003,
+  9004,
+  9005,
+  9006,
+  9007,
+  9008,
+  9009,
+  9010,
+  9011,
+  9012,
+  9013,
+  9014,
+  9015,
+  9016,
+  9017,
+  9018,
+  9019,
+  9020,
+  9021,
+  9022,
+  9023,
+  9024,
+  9025,
+  9026,
+  9027,
+  9028,
+  9029,
+  9030,
+  9031,
+  9032,
+  9033,
+  9034,
+  9035,
+  9036,
+  9037,
+  9038,
+  9039,
+  9040,
+  9041,
+  9042,
+  9043,
+  9044,
+  9045,
+  9046,
+  9047,
+  9048,
+  9049,
+  9050,
+  9051,
+  9052,
+  9053,
+  9054,
+  9055,
+  9056,
+  9057,
+  9058,
+  9059,
+  9060,
+  9061,
+  9062,
+  9063,
+  9064,
+  9065,
+  9066,
+  9067,
+  9068,
+  9069,
+  9070,
+  9071,
+  9072,
+  9073,
+  9074,
+  9075,
+  9076,
+  9077,
+  9078,
+  9079,
+  9080,
+  9081,
+  9082,
+  9083,
+  9084,
+  9085,
+  9086,
+  9087,
+  9088,
+  9089,
+  9090,
+  9091,
+  9092,
+  9093,
+  9094,
+  9095,
+  9096,
+  9097,
+  9098,
+  9099,
+  9100,
+  9101,
+  9102,
+  9103,
+  9104,
+  9105,
+  9106,
+  9107,
+  9108,
+  9109,
+  9110,
+  9111,
+  9112,
+  9113,
+  9114,
+  9115,
+  9116,
+  9117,
+  9118,
+  9119,
+  9120,
+  9121,
+  9122,
+  9123,
+  9124,
+  9125,
+  9126,
+  9127,
+  9128,
+  9129,
+  9130,
+  9131,
+  9132,
+  9133,
+  9134,
+  9135,
+  9136,
+  9137,
+  9138,
+  9139,
+  9140,
+  9141,
+  9142,
+  9143,
+  9144,
+  9145,
+  9146,
+  9147,
+  9148,
+  9149,
+  9150,
+  9151,
+  9152,
+  9153,
+  9154,
+  9155,
+  9156,
+  9157,
+  9158,
+  9159,
+  9160,
+  9161,
+  9162,
+  9163,
+  9164,
+  9165,
+  9166,
+  9167,
+  9168,
+  9169,
+  9170,
+  9171,
+  9172,
+  9173,
+  9174,
+  9175,
+  9176,
+  9177,
+  9178,
+  9179,
+  9180,
+  9181,
+  9182,
+  9183,
+  9184,
+  9185,
+  9186,
+  9187,
+  9188,
+  9189,
+  9190,
+  9191,
+  9192,
+  9193,
+  9194,
+  9195,
+  9196,
+  9197,
+  9198,
+  9199,
+  9200,
+  9201,
+  9202,
+  9203,
+  9204,
+  9205,
+  9206,
+  9207,
+  9208,
+  9209,
+  9210,
+  9211,
+  9212,
+  9213,
+  9214,
+  9215,
+  9216,
+  9217,
+  9218,
+  9219,
+  9220,
+  9221,
+  9222,
+  9223,
+  9224,
+  9225,
+  9226,
+  9227,
+  9228,
+  9229,
+  9230,
+  9231,
+  9232,
+  9233,
+  9234,
+  9235,
+  9236,
+  9237,
+  9238,
+  9239,
+  9240,
+  9241,
+  9242,
+  9243,
+  9244,
+  9245,
+  9246,
+  9247,
+  9248,
+  9249,
+  9250,
+  9251,
+  9252,
+  9253,
+  9254,
+  9255,
+  9256,
+  9257,
+  9258,
+  9259,
+  9260,
+  9261,
+  9262,
+  9263,
+  9264,
+  9265,
+  9266,
+  9267,
+  9268,
+  9269,
+  9270,
+  9271,
+  9272,
+  9273,
+  9274,
+  9275,
+  9276,
+  9277,
+  9278,
+  9279,
+  9280,
+  9281,
+  9282,
+  9283,
+  9284,
+  9285,
+  9286,
+  9287,
+  9288,
+  9289,
+  9290,
+  9291,
+  9292,
+  9293,
+  9294,
+  9295,
+  9296,
+  9297,
+  9298,
+  9299,
+  9300,
+  9301,
+  9302,
+  9303,
+  9304,
+  9305,
+  9306,
+  9307,
+  9308,
+  9309,
+  9310,
+  9311,
+  9312,
+  9313,
+  9314,
+  9315,
+  9316,
+  9317,
+  9318,
+  9319,
+  9320,
+  9321,
+  9322,
+  9323,
+  9324,
+  9325,
+  9326,
+  9327,
+  9328,
+  9329,
+  9330,
+  9331,
+  9332,
+  9333,
+  9334,
+  9335,
+  9336,
+  9337,
+  9338,
+  9339,
+  9340,
+  9341,
+  9342,
+  9343,
+  9344,
+  9345,
+  9346,
+  9347,
+  9348,
+  9349,
+  9350,
+  9351,
+  9352,
+  9353,
+  9354,
+  9355,
+  9356,
+  9357,
+  9358,
+  9359,
+  9360,
+  9361,
+  9362,
+  9363,
+  9364,
+  9365,
+  9366,
+  9367,
+  9368,
+  9369,
+  9370,
+  9371,
+  9372,
+  9373,
+  9374,
+  9375,
+  9376,
+  9377,
+  9378,
+  9379,
+  9380,
+  9381,
+  9382,
+  9383,
+  9384,
+  9385,
+  9386,
+  9387,
+  9388,
+  9389,
+  9390,
+  9391,
+  9392,
+  9393,
+  9394,
+  9395,
+  9396,
+  9397,
+  9398,
+  9399,
+  9400,
+  9401,
+  9402,
+  9403,
+  9404,
+  9405,
+  9406,
+  9407,
+  9408,
+  9409,
+  9410,
+  9411,
+  9412,
+  9413,
+  9414,
+  9415,
+  9416,
+  9417,
+  9418,
+  9419,
+  9420,
+  9421,
+  9422,
+  9423,
+  9424,
+  9425,
+  9426,
+  9427,
+  9428,
+  9429,
+  9430,
+  9431,
+  9432,
+  9433,
+  9434,
+  9435,
+  9436,
+  9437,
+  9438,
+  9439,
+  9440,
+  9441,
+  9442,
+  9443,
+  9444,
+  9445,
+  9446,
+  9447,
+  9448,
+  9449,
+  9450,
+  9451,
+  9452,
+  9453,
+  9454,
+  9455,
+  9456,
+  9457,
+  9458,
+  9459,
+  9460,
+  9461,
+  9462,
+  9463,
+  9464,
+  9465,
+  9466,
+  9467,
+  9468,
+  9469,
+  9470,
+  9471,
+  9472,
+  9473,
+  9474,
+  9475,
+  9476,
+  9477,
+  9478,
+  9479,
+  9480,
+  9481,
+  9482,
+  9483,
+  9484,
+  9485,
+  9486,
+  9487,
+  9488,
+  9489,
+  9490,
+  9491,
+  9492,
+  9493,
+  9494,
+  9495,
+  9496,
+  9497,
+  9498,
+  9499,
+  9500,
+  9501,
+  9502,
+  9503,
+  9504,
+  9505,
+  9506,
+  9507,
+  9508,
+  9509,
+  9510,
+  9511,
+  9512,
+  9513,
+  9514,
+  9515,
+  9516,
+  9517,
+  9518,
+  9519,
+  9520,
+  9521,
+  9522,
+  9523,
+  9524,
+  9525,
+  9526,
+  9527,
+  9528,
+  9529,
+  9530,
+  9531,
+  9532,
+  9533,
+  9534,
+  9535,
+  9536,
+  9537,
+  9538,
+  9539,
+  9540,
+  9541,
+  9542,
+  9543,
+  9544,
+  9545,
+  9546,
+  9547,
+  9548,
+  9549,
+  9550,
+  9551,
+  9552,
+  9553,
+  9554,
+  9555,
+  9556,
+  9557,
+  9558,
+  9559,
+  9560,
+  9561,
+  9562,
+  9563,
+  9564,
+  9565,
+  9566,
+  9567,
+  9568,
+  9569,
+  9570,
+  9571,
+  9572,
+  9573,
+  9574,
+  9575,
+  9576,
+  9577,
+  9578,
+  9579,
+  9580,
+  9581,
+  9582,
+  9583,
+  9584,
+  9585,
+  9586,
+  9587,
+  9588,
+  9589,
+  9590,
+  9591,
+  9592,
+  9593,
+  9594,
+  9595,
+  9596,
+  9597,
+  9598,
+  9599,
+  9600,
+  9601,
+  9602,
+  9603,
+  9604,
+  9605,
+  9606,
+  9607,
+  9608,
+  9609,
+  9610,
+  9611,
+  9612,
+  9613,
+  9614,
+  9615,
+  9616,
+  9617,
+  9618,
+  9619,
+  9620,
+  9621,
+  9622,
+  9623,
+  9624,
+  9625,
+  9626,
+  9627,
+  9628,
+  9629,
+  9630,
+  9631,
+  9632,
+  9633,
+  9634,
+  9635,
+  9636,
+  9637,
+  9638,
+  9639,
+  9640,
+  9641,
+  9642,
+  9643,
+  9644,
+  9645,
+  9646,
+  9647,
+  9648,
+  9649,
+  9650,
+  9651,
+  9652,
+  9653,
+  9654,
+  9655,
+  9656,
+  9657,
+  9658,
+  9659,
+  9660,
+  9661,
+  9662,
+  9663,
+  9664,
+  9665,
+  9666,
+  9667,
+  9668,
+  9669,
+  9670,
+  9671,
+  9672,
+  9673,
+  9674,
+  9675,
+  9676,
+  9677,
+  9678,
+  9679,
+  9680,
+  9681,
+  9682,
+  9683,
+  9684,
+  9685,
+  9686,
+  9687,
+  9688,
+  9689,
+  9690,
+  9691,
+  9692,
+  9693,
+  9694,
+  9695,
+  9696,
+  9697,
+  9698,
+  9699,
+  9700,
+  9701,
+  9702,
+  9703,
+  9704,
+  9705,
+  9706,
+  9707,
+  9708,
+  9709,
+  9710,
+  9711,
+  9712,
+  9713,
+  9714,
+  9715,
+  9716,
+  9717,
+  9718,
+  9719,
+  9720,
+  9721,
+  9722,
+  9723,
+  9724,
+  9725,
+  9726,
+  9727,
+  9728,
+  9729,
+  9730,
+  9731,
+  9732,
+  9733,
+  9734,
+  9735,
+  9736,
+  9737,
+  9738,
+  9739,
+  9740,
+  9741,
+  9742,
+  9743,
+  9744,
+  9745,
+  9746,
+  9747,
+  9748,
+  9749,
+  9750,
+  9751,
+  9752,
+  9753,
+  9754,
+  9755,
+  9756,
+  9757,
+  9758,
+  9759,
+  9760,
+  9761,
+  9762,
+  9763,
+  9764,
+  9765,
+  9766,
+  9767,
+  9768,
+  9769,
+  9770,
+  9771,
+  9772,
+  9773,
+  9774,
+  9775,
+  9776,
+  9777,
+  9778,
+  9779,
+  9780,
+  9781,
+  9782,
+  9783,
+  9784,
+  9785,
+  9786,
+  9787,
+  9788,
+  9789,
+  9790,
+  9791,
+  9792,
+  9793,
+  9794,
+  9795,
+  9796,
+  9797,
+  9798,
+  9799,
+  9800,
+  9801,
+  9802,
+  9803,
+  9804,
+  9805,
+  9806,
+  9807,
+  9808,
+  9809,
+  9810,
+  9811,
+  9812,
+  9813,
+  9814,
+  9815,
+  9816,
+  9817,
+  9818,
+  9819,
+  9820,
+  9821,
+  9822,
+  9823,
+  9824,
+  9825,
+  9826,
+  9827,
+  9828,
+  9829,
+  9830,
+  9831,
+  9832,
+  9833,
+  9834,
+  9835,
+  9836,
+  9837,
+  9838,
+  9839,
+  9840,
+  9841,
+  9842,
+  9843,
+  9844,
+  9845,
+  9846,
+  9847,
+  9848,
+  9849,
+  9850,
+  9851,
+  9852,
+  9853,
+  9854,
+  9855,
+  9856,
+  9857,
+  9858,
+  9859,
+  9860,
+  9861,
+  9862,
+  9863,
+  9864,
+  9865,
+  9866,
+  9867,
+  9868,
+  9869,
+  9870,
+  9871,
+  9872,
+  9873,
+  9874,
+  9875,
+  9876,
+  9877,
+  9878,
+  9879,
+  9880,
+  9881,
+  9882,
+  9883,
+  9884,
+  9885,
+  9886,
+  9887,
+  9888,
+  9889,
+  9890,
+  9891,
+  9892,
+  9893,
+  9894,
+  9895,
+  9896,
+  9897,
+  9898,
+  9899,
+  9900,
+  9901,
+  9902,
+  9903,
+  9904,
+  9905,
+  9906,
+  9907,
+  9908,
+  9909,
+  9910,
+  9911,
+  9912,
+  9913,
+  9914,
+  9915,
+  9916,
+  9917,
+  9918,
+  9919,
+  9920,
+  9921,
+  9922,
+  9923,
+  9924,
+  9925,
+  9926,
+  9927,
+  9928,
+  9929,
+  9930,
+  9931,
+  9932,
+  9933,
+  9934,
+  9935,
+  9936,
+  9937,
+  9938,
+  9939,
+  9940,
+  9941,
+  9942,
+  9943,
+  9944,
+  9945,
+  9946,
+  9947,
+  9948,
+  9949,
+  9950,
+  9951,
+  9952,
+  9953,
+  9954,
+  9955,
+  9956,
+  9957,
+  9958,
+  9959,
+  9960,
+  9961,
+  9962,
+  9963,
+  9964,
+  9965,
+  9966,
+  9967,
+  9968,
+  9969,
+  9970,
+  9971,
+  9972,
+  9973,
+  9974,
+  9975,
+  9976,
+  9977,
+  9978,
+  9979,
+  9980,
+  9981,
+  9982,
+  9983,
+  9984,
+  9985,
+  9986,
+  9987,
+  9988,
+  9989,
+  9990,
+  9991,
+  9992,
+  9993,
+  9994,
+  9995,
+  9996,
+  9997,
+  9998,
+  9999,
+};
+const Set<String> stringSet = {
+  'foo_0',
+  'foo_1',
+  'foo_2',
+  'foo_3',
+  'foo_4',
+  'foo_5',
+  'foo_6',
+  'foo_7',
+  'foo_8',
+  'foo_9',
+  'foo_10',
+  'foo_11',
+  'foo_12',
+  'foo_13',
+  'foo_14',
+  'foo_15',
+  'foo_16',
+  'foo_17',
+  'foo_18',
+  'foo_19',
+  'foo_20',
+  'foo_21',
+  'foo_22',
+  'foo_23',
+  'foo_24',
+  'foo_25',
+  'foo_26',
+  'foo_27',
+  'foo_28',
+  'foo_29',
+  'foo_30',
+  'foo_31',
+  'foo_32',
+  'foo_33',
+  'foo_34',
+  'foo_35',
+  'foo_36',
+  'foo_37',
+  'foo_38',
+  'foo_39',
+  'foo_40',
+  'foo_41',
+  'foo_42',
+  'foo_43',
+  'foo_44',
+  'foo_45',
+  'foo_46',
+  'foo_47',
+  'foo_48',
+  'foo_49',
+  'foo_50',
+  'foo_51',
+  'foo_52',
+  'foo_53',
+  'foo_54',
+  'foo_55',
+  'foo_56',
+  'foo_57',
+  'foo_58',
+  'foo_59',
+  'foo_60',
+  'foo_61',
+  'foo_62',
+  'foo_63',
+  'foo_64',
+  'foo_65',
+  'foo_66',
+  'foo_67',
+  'foo_68',
+  'foo_69',
+  'foo_70',
+  'foo_71',
+  'foo_72',
+  'foo_73',
+  'foo_74',
+  'foo_75',
+  'foo_76',
+  'foo_77',
+  'foo_78',
+  'foo_79',
+  'foo_80',
+  'foo_81',
+  'foo_82',
+  'foo_83',
+  'foo_84',
+  'foo_85',
+  'foo_86',
+  'foo_87',
+  'foo_88',
+  'foo_89',
+  'foo_90',
+  'foo_91',
+  'foo_92',
+  'foo_93',
+  'foo_94',
+  'foo_95',
+  'foo_96',
+  'foo_97',
+  'foo_98',
+  'foo_99',
+  'foo_100',
+  'foo_101',
+  'foo_102',
+  'foo_103',
+  'foo_104',
+  'foo_105',
+  'foo_106',
+  'foo_107',
+  'foo_108',
+  'foo_109',
+  'foo_110',
+  'foo_111',
+  'foo_112',
+  'foo_113',
+  'foo_114',
+  'foo_115',
+  'foo_116',
+  'foo_117',
+  'foo_118',
+  'foo_119',
+  'foo_120',
+  'foo_121',
+  'foo_122',
+  'foo_123',
+  'foo_124',
+  'foo_125',
+  'foo_126',
+  'foo_127',
+  'foo_128',
+  'foo_129',
+  'foo_130',
+  'foo_131',
+  'foo_132',
+  'foo_133',
+  'foo_134',
+  'foo_135',
+  'foo_136',
+  'foo_137',
+  'foo_138',
+  'foo_139',
+  'foo_140',
+  'foo_141',
+  'foo_142',
+  'foo_143',
+  'foo_144',
+  'foo_145',
+  'foo_146',
+  'foo_147',
+  'foo_148',
+  'foo_149',
+  'foo_150',
+  'foo_151',
+  'foo_152',
+  'foo_153',
+  'foo_154',
+  'foo_155',
+  'foo_156',
+  'foo_157',
+  'foo_158',
+  'foo_159',
+  'foo_160',
+  'foo_161',
+  'foo_162',
+  'foo_163',
+  'foo_164',
+  'foo_165',
+  'foo_166',
+  'foo_167',
+  'foo_168',
+  'foo_169',
+  'foo_170',
+  'foo_171',
+  'foo_172',
+  'foo_173',
+  'foo_174',
+  'foo_175',
+  'foo_176',
+  'foo_177',
+  'foo_178',
+  'foo_179',
+  'foo_180',
+  'foo_181',
+  'foo_182',
+  'foo_183',
+  'foo_184',
+  'foo_185',
+  'foo_186',
+  'foo_187',
+  'foo_188',
+  'foo_189',
+  'foo_190',
+  'foo_191',
+  'foo_192',
+  'foo_193',
+  'foo_194',
+  'foo_195',
+  'foo_196',
+  'foo_197',
+  'foo_198',
+  'foo_199',
+  'foo_200',
+  'foo_201',
+  'foo_202',
+  'foo_203',
+  'foo_204',
+  'foo_205',
+  'foo_206',
+  'foo_207',
+  'foo_208',
+  'foo_209',
+  'foo_210',
+  'foo_211',
+  'foo_212',
+  'foo_213',
+  'foo_214',
+  'foo_215',
+  'foo_216',
+  'foo_217',
+  'foo_218',
+  'foo_219',
+  'foo_220',
+  'foo_221',
+  'foo_222',
+  'foo_223',
+  'foo_224',
+  'foo_225',
+  'foo_226',
+  'foo_227',
+  'foo_228',
+  'foo_229',
+  'foo_230',
+  'foo_231',
+  'foo_232',
+  'foo_233',
+  'foo_234',
+  'foo_235',
+  'foo_236',
+  'foo_237',
+  'foo_238',
+  'foo_239',
+  'foo_240',
+  'foo_241',
+  'foo_242',
+  'foo_243',
+  'foo_244',
+  'foo_245',
+  'foo_246',
+  'foo_247',
+  'foo_248',
+  'foo_249',
+  'foo_250',
+  'foo_251',
+  'foo_252',
+  'foo_253',
+  'foo_254',
+  'foo_255',
+  'foo_256',
+  'foo_257',
+  'foo_258',
+  'foo_259',
+  'foo_260',
+  'foo_261',
+  'foo_262',
+  'foo_263',
+  'foo_264',
+  'foo_265',
+  'foo_266',
+  'foo_267',
+  'foo_268',
+  'foo_269',
+  'foo_270',
+  'foo_271',
+  'foo_272',
+  'foo_273',
+  'foo_274',
+  'foo_275',
+  'foo_276',
+  'foo_277',
+  'foo_278',
+  'foo_279',
+  'foo_280',
+  'foo_281',
+  'foo_282',
+  'foo_283',
+  'foo_284',
+  'foo_285',
+  'foo_286',
+  'foo_287',
+  'foo_288',
+  'foo_289',
+  'foo_290',
+  'foo_291',
+  'foo_292',
+  'foo_293',
+  'foo_294',
+  'foo_295',
+  'foo_296',
+  'foo_297',
+  'foo_298',
+  'foo_299',
+  'foo_300',
+  'foo_301',
+  'foo_302',
+  'foo_303',
+  'foo_304',
+  'foo_305',
+  'foo_306',
+  'foo_307',
+  'foo_308',
+  'foo_309',
+  'foo_310',
+  'foo_311',
+  'foo_312',
+  'foo_313',
+  'foo_314',
+  'foo_315',
+  'foo_316',
+  'foo_317',
+  'foo_318',
+  'foo_319',
+  'foo_320',
+  'foo_321',
+  'foo_322',
+  'foo_323',
+  'foo_324',
+  'foo_325',
+  'foo_326',
+  'foo_327',
+  'foo_328',
+  'foo_329',
+  'foo_330',
+  'foo_331',
+  'foo_332',
+  'foo_333',
+  'foo_334',
+  'foo_335',
+  'foo_336',
+  'foo_337',
+  'foo_338',
+  'foo_339',
+  'foo_340',
+  'foo_341',
+  'foo_342',
+  'foo_343',
+  'foo_344',
+  'foo_345',
+  'foo_346',
+  'foo_347',
+  'foo_348',
+  'foo_349',
+  'foo_350',
+  'foo_351',
+  'foo_352',
+  'foo_353',
+  'foo_354',
+  'foo_355',
+  'foo_356',
+  'foo_357',
+  'foo_358',
+  'foo_359',
+  'foo_360',
+  'foo_361',
+  'foo_362',
+  'foo_363',
+  'foo_364',
+  'foo_365',
+  'foo_366',
+  'foo_367',
+  'foo_368',
+  'foo_369',
+  'foo_370',
+  'foo_371',
+  'foo_372',
+  'foo_373',
+  'foo_374',
+  'foo_375',
+  'foo_376',
+  'foo_377',
+  'foo_378',
+  'foo_379',
+  'foo_380',
+  'foo_381',
+  'foo_382',
+  'foo_383',
+  'foo_384',
+  'foo_385',
+  'foo_386',
+  'foo_387',
+  'foo_388',
+  'foo_389',
+  'foo_390',
+  'foo_391',
+  'foo_392',
+  'foo_393',
+  'foo_394',
+  'foo_395',
+  'foo_396',
+  'foo_397',
+  'foo_398',
+  'foo_399',
+  'foo_400',
+  'foo_401',
+  'foo_402',
+  'foo_403',
+  'foo_404',
+  'foo_405',
+  'foo_406',
+  'foo_407',
+  'foo_408',
+  'foo_409',
+  'foo_410',
+  'foo_411',
+  'foo_412',
+  'foo_413',
+  'foo_414',
+  'foo_415',
+  'foo_416',
+  'foo_417',
+  'foo_418',
+  'foo_419',
+  'foo_420',
+  'foo_421',
+  'foo_422',
+  'foo_423',
+  'foo_424',
+  'foo_425',
+  'foo_426',
+  'foo_427',
+  'foo_428',
+  'foo_429',
+  'foo_430',
+  'foo_431',
+  'foo_432',
+  'foo_433',
+  'foo_434',
+  'foo_435',
+  'foo_436',
+  'foo_437',
+  'foo_438',
+  'foo_439',
+  'foo_440',
+  'foo_441',
+  'foo_442',
+  'foo_443',
+  'foo_444',
+  'foo_445',
+  'foo_446',
+  'foo_447',
+  'foo_448',
+  'foo_449',
+  'foo_450',
+  'foo_451',
+  'foo_452',
+  'foo_453',
+  'foo_454',
+  'foo_455',
+  'foo_456',
+  'foo_457',
+  'foo_458',
+  'foo_459',
+  'foo_460',
+  'foo_461',
+  'foo_462',
+  'foo_463',
+  'foo_464',
+  'foo_465',
+  'foo_466',
+  'foo_467',
+  'foo_468',
+  'foo_469',
+  'foo_470',
+  'foo_471',
+  'foo_472',
+  'foo_473',
+  'foo_474',
+  'foo_475',
+  'foo_476',
+  'foo_477',
+  'foo_478',
+  'foo_479',
+  'foo_480',
+  'foo_481',
+  'foo_482',
+  'foo_483',
+  'foo_484',
+  'foo_485',
+  'foo_486',
+  'foo_487',
+  'foo_488',
+  'foo_489',
+  'foo_490',
+  'foo_491',
+  'foo_492',
+  'foo_493',
+  'foo_494',
+  'foo_495',
+  'foo_496',
+  'foo_497',
+  'foo_498',
+  'foo_499',
+  'foo_500',
+  'foo_501',
+  'foo_502',
+  'foo_503',
+  'foo_504',
+  'foo_505',
+  'foo_506',
+  'foo_507',
+  'foo_508',
+  'foo_509',
+  'foo_510',
+  'foo_511',
+  'foo_512',
+  'foo_513',
+  'foo_514',
+  'foo_515',
+  'foo_516',
+  'foo_517',
+  'foo_518',
+  'foo_519',
+  'foo_520',
+  'foo_521',
+  'foo_522',
+  'foo_523',
+  'foo_524',
+  'foo_525',
+  'foo_526',
+  'foo_527',
+  'foo_528',
+  'foo_529',
+  'foo_530',
+  'foo_531',
+  'foo_532',
+  'foo_533',
+  'foo_534',
+  'foo_535',
+  'foo_536',
+  'foo_537',
+  'foo_538',
+  'foo_539',
+  'foo_540',
+  'foo_541',
+  'foo_542',
+  'foo_543',
+  'foo_544',
+  'foo_545',
+  'foo_546',
+  'foo_547',
+  'foo_548',
+  'foo_549',
+  'foo_550',
+  'foo_551',
+  'foo_552',
+  'foo_553',
+  'foo_554',
+  'foo_555',
+  'foo_556',
+  'foo_557',
+  'foo_558',
+  'foo_559',
+  'foo_560',
+  'foo_561',
+  'foo_562',
+  'foo_563',
+  'foo_564',
+  'foo_565',
+  'foo_566',
+  'foo_567',
+  'foo_568',
+  'foo_569',
+  'foo_570',
+  'foo_571',
+  'foo_572',
+  'foo_573',
+  'foo_574',
+  'foo_575',
+  'foo_576',
+  'foo_577',
+  'foo_578',
+  'foo_579',
+  'foo_580',
+  'foo_581',
+  'foo_582',
+  'foo_583',
+  'foo_584',
+  'foo_585',
+  'foo_586',
+  'foo_587',
+  'foo_588',
+  'foo_589',
+  'foo_590',
+  'foo_591',
+  'foo_592',
+  'foo_593',
+  'foo_594',
+  'foo_595',
+  'foo_596',
+  'foo_597',
+  'foo_598',
+  'foo_599',
+  'foo_600',
+  'foo_601',
+  'foo_602',
+  'foo_603',
+  'foo_604',
+  'foo_605',
+  'foo_606',
+  'foo_607',
+  'foo_608',
+  'foo_609',
+  'foo_610',
+  'foo_611',
+  'foo_612',
+  'foo_613',
+  'foo_614',
+  'foo_615',
+  'foo_616',
+  'foo_617',
+  'foo_618',
+  'foo_619',
+  'foo_620',
+  'foo_621',
+  'foo_622',
+  'foo_623',
+  'foo_624',
+  'foo_625',
+  'foo_626',
+  'foo_627',
+  'foo_628',
+  'foo_629',
+  'foo_630',
+  'foo_631',
+  'foo_632',
+  'foo_633',
+  'foo_634',
+  'foo_635',
+  'foo_636',
+  'foo_637',
+  'foo_638',
+  'foo_639',
+  'foo_640',
+  'foo_641',
+  'foo_642',
+  'foo_643',
+  'foo_644',
+  'foo_645',
+  'foo_646',
+  'foo_647',
+  'foo_648',
+  'foo_649',
+  'foo_650',
+  'foo_651',
+  'foo_652',
+  'foo_653',
+  'foo_654',
+  'foo_655',
+  'foo_656',
+  'foo_657',
+  'foo_658',
+  'foo_659',
+  'foo_660',
+  'foo_661',
+  'foo_662',
+  'foo_663',
+  'foo_664',
+  'foo_665',
+  'foo_666',
+  'foo_667',
+  'foo_668',
+  'foo_669',
+  'foo_670',
+  'foo_671',
+  'foo_672',
+  'foo_673',
+  'foo_674',
+  'foo_675',
+  'foo_676',
+  'foo_677',
+  'foo_678',
+  'foo_679',
+  'foo_680',
+  'foo_681',
+  'foo_682',
+  'foo_683',
+  'foo_684',
+  'foo_685',
+  'foo_686',
+  'foo_687',
+  'foo_688',
+  'foo_689',
+  'foo_690',
+  'foo_691',
+  'foo_692',
+  'foo_693',
+  'foo_694',
+  'foo_695',
+  'foo_696',
+  'foo_697',
+  'foo_698',
+  'foo_699',
+  'foo_700',
+  'foo_701',
+  'foo_702',
+  'foo_703',
+  'foo_704',
+  'foo_705',
+  'foo_706',
+  'foo_707',
+  'foo_708',
+  'foo_709',
+  'foo_710',
+  'foo_711',
+  'foo_712',
+  'foo_713',
+  'foo_714',
+  'foo_715',
+  'foo_716',
+  'foo_717',
+  'foo_718',
+  'foo_719',
+  'foo_720',
+  'foo_721',
+  'foo_722',
+  'foo_723',
+  'foo_724',
+  'foo_725',
+  'foo_726',
+  'foo_727',
+  'foo_728',
+  'foo_729',
+  'foo_730',
+  'foo_731',
+  'foo_732',
+  'foo_733',
+  'foo_734',
+  'foo_735',
+  'foo_736',
+  'foo_737',
+  'foo_738',
+  'foo_739',
+  'foo_740',
+  'foo_741',
+  'foo_742',
+  'foo_743',
+  'foo_744',
+  'foo_745',
+  'foo_746',
+  'foo_747',
+  'foo_748',
+  'foo_749',
+  'foo_750',
+  'foo_751',
+  'foo_752',
+  'foo_753',
+  'foo_754',
+  'foo_755',
+  'foo_756',
+  'foo_757',
+  'foo_758',
+  'foo_759',
+  'foo_760',
+  'foo_761',
+  'foo_762',
+  'foo_763',
+  'foo_764',
+  'foo_765',
+  'foo_766',
+  'foo_767',
+  'foo_768',
+  'foo_769',
+  'foo_770',
+  'foo_771',
+  'foo_772',
+  'foo_773',
+  'foo_774',
+  'foo_775',
+  'foo_776',
+  'foo_777',
+  'foo_778',
+  'foo_779',
+  'foo_780',
+  'foo_781',
+  'foo_782',
+  'foo_783',
+  'foo_784',
+  'foo_785',
+  'foo_786',
+  'foo_787',
+  'foo_788',
+  'foo_789',
+  'foo_790',
+  'foo_791',
+  'foo_792',
+  'foo_793',
+  'foo_794',
+  'foo_795',
+  'foo_796',
+  'foo_797',
+  'foo_798',
+  'foo_799',
+  'foo_800',
+  'foo_801',
+  'foo_802',
+  'foo_803',
+  'foo_804',
+  'foo_805',
+  'foo_806',
+  'foo_807',
+  'foo_808',
+  'foo_809',
+  'foo_810',
+  'foo_811',
+  'foo_812',
+  'foo_813',
+  'foo_814',
+  'foo_815',
+  'foo_816',
+  'foo_817',
+  'foo_818',
+  'foo_819',
+  'foo_820',
+  'foo_821',
+  'foo_822',
+  'foo_823',
+  'foo_824',
+  'foo_825',
+  'foo_826',
+  'foo_827',
+  'foo_828',
+  'foo_829',
+  'foo_830',
+  'foo_831',
+  'foo_832',
+  'foo_833',
+  'foo_834',
+  'foo_835',
+  'foo_836',
+  'foo_837',
+  'foo_838',
+  'foo_839',
+  'foo_840',
+  'foo_841',
+  'foo_842',
+  'foo_843',
+  'foo_844',
+  'foo_845',
+  'foo_846',
+  'foo_847',
+  'foo_848',
+  'foo_849',
+  'foo_850',
+  'foo_851',
+  'foo_852',
+  'foo_853',
+  'foo_854',
+  'foo_855',
+  'foo_856',
+  'foo_857',
+  'foo_858',
+  'foo_859',
+  'foo_860',
+  'foo_861',
+  'foo_862',
+  'foo_863',
+  'foo_864',
+  'foo_865',
+  'foo_866',
+  'foo_867',
+  'foo_868',
+  'foo_869',
+  'foo_870',
+  'foo_871',
+  'foo_872',
+  'foo_873',
+  'foo_874',
+  'foo_875',
+  'foo_876',
+  'foo_877',
+  'foo_878',
+  'foo_879',
+  'foo_880',
+  'foo_881',
+  'foo_882',
+  'foo_883',
+  'foo_884',
+  'foo_885',
+  'foo_886',
+  'foo_887',
+  'foo_888',
+  'foo_889',
+  'foo_890',
+  'foo_891',
+  'foo_892',
+  'foo_893',
+  'foo_894',
+  'foo_895',
+  'foo_896',
+  'foo_897',
+  'foo_898',
+  'foo_899',
+  'foo_900',
+  'foo_901',
+  'foo_902',
+  'foo_903',
+  'foo_904',
+  'foo_905',
+  'foo_906',
+  'foo_907',
+  'foo_908',
+  'foo_909',
+  'foo_910',
+  'foo_911',
+  'foo_912',
+  'foo_913',
+  'foo_914',
+  'foo_915',
+  'foo_916',
+  'foo_917',
+  'foo_918',
+  'foo_919',
+  'foo_920',
+  'foo_921',
+  'foo_922',
+  'foo_923',
+  'foo_924',
+  'foo_925',
+  'foo_926',
+  'foo_927',
+  'foo_928',
+  'foo_929',
+  'foo_930',
+  'foo_931',
+  'foo_932',
+  'foo_933',
+  'foo_934',
+  'foo_935',
+  'foo_936',
+  'foo_937',
+  'foo_938',
+  'foo_939',
+  'foo_940',
+  'foo_941',
+  'foo_942',
+  'foo_943',
+  'foo_944',
+  'foo_945',
+  'foo_946',
+  'foo_947',
+  'foo_948',
+  'foo_949',
+  'foo_950',
+  'foo_951',
+  'foo_952',
+  'foo_953',
+  'foo_954',
+  'foo_955',
+  'foo_956',
+  'foo_957',
+  'foo_958',
+  'foo_959',
+  'foo_960',
+  'foo_961',
+  'foo_962',
+  'foo_963',
+  'foo_964',
+  'foo_965',
+  'foo_966',
+  'foo_967',
+  'foo_968',
+  'foo_969',
+  'foo_970',
+  'foo_971',
+  'foo_972',
+  'foo_973',
+  'foo_974',
+  'foo_975',
+  'foo_976',
+  'foo_977',
+  'foo_978',
+  'foo_979',
+  'foo_980',
+  'foo_981',
+  'foo_982',
+  'foo_983',
+  'foo_984',
+  'foo_985',
+  'foo_986',
+  'foo_987',
+  'foo_988',
+  'foo_989',
+  'foo_990',
+  'foo_991',
+  'foo_992',
+  'foo_993',
+  'foo_994',
+  'foo_995',
+  'foo_996',
+  'foo_997',
+  'foo_998',
+  'foo_999',
+  'foo_1000',
+  'foo_1001',
+  'foo_1002',
+  'foo_1003',
+  'foo_1004',
+  'foo_1005',
+  'foo_1006',
+  'foo_1007',
+  'foo_1008',
+  'foo_1009',
+  'foo_1010',
+  'foo_1011',
+  'foo_1012',
+  'foo_1013',
+  'foo_1014',
+  'foo_1015',
+  'foo_1016',
+  'foo_1017',
+  'foo_1018',
+  'foo_1019',
+  'foo_1020',
+  'foo_1021',
+  'foo_1022',
+  'foo_1023',
+  'foo_1024',
+  'foo_1025',
+  'foo_1026',
+  'foo_1027',
+  'foo_1028',
+  'foo_1029',
+  'foo_1030',
+  'foo_1031',
+  'foo_1032',
+  'foo_1033',
+  'foo_1034',
+  'foo_1035',
+  'foo_1036',
+  'foo_1037',
+  'foo_1038',
+  'foo_1039',
+  'foo_1040',
+  'foo_1041',
+  'foo_1042',
+  'foo_1043',
+  'foo_1044',
+  'foo_1045',
+  'foo_1046',
+  'foo_1047',
+  'foo_1048',
+  'foo_1049',
+  'foo_1050',
+  'foo_1051',
+  'foo_1052',
+  'foo_1053',
+  'foo_1054',
+  'foo_1055',
+  'foo_1056',
+  'foo_1057',
+  'foo_1058',
+  'foo_1059',
+  'foo_1060',
+  'foo_1061',
+  'foo_1062',
+  'foo_1063',
+  'foo_1064',
+  'foo_1065',
+  'foo_1066',
+  'foo_1067',
+  'foo_1068',
+  'foo_1069',
+  'foo_1070',
+  'foo_1071',
+  'foo_1072',
+  'foo_1073',
+  'foo_1074',
+  'foo_1075',
+  'foo_1076',
+  'foo_1077',
+  'foo_1078',
+  'foo_1079',
+  'foo_1080',
+  'foo_1081',
+  'foo_1082',
+  'foo_1083',
+  'foo_1084',
+  'foo_1085',
+  'foo_1086',
+  'foo_1087',
+  'foo_1088',
+  'foo_1089',
+  'foo_1090',
+  'foo_1091',
+  'foo_1092',
+  'foo_1093',
+  'foo_1094',
+  'foo_1095',
+  'foo_1096',
+  'foo_1097',
+  'foo_1098',
+  'foo_1099',
+  'foo_1100',
+  'foo_1101',
+  'foo_1102',
+  'foo_1103',
+  'foo_1104',
+  'foo_1105',
+  'foo_1106',
+  'foo_1107',
+  'foo_1108',
+  'foo_1109',
+  'foo_1110',
+  'foo_1111',
+  'foo_1112',
+  'foo_1113',
+  'foo_1114',
+  'foo_1115',
+  'foo_1116',
+  'foo_1117',
+  'foo_1118',
+  'foo_1119',
+  'foo_1120',
+  'foo_1121',
+  'foo_1122',
+  'foo_1123',
+  'foo_1124',
+  'foo_1125',
+  'foo_1126',
+  'foo_1127',
+  'foo_1128',
+  'foo_1129',
+  'foo_1130',
+  'foo_1131',
+  'foo_1132',
+  'foo_1133',
+  'foo_1134',
+  'foo_1135',
+  'foo_1136',
+  'foo_1137',
+  'foo_1138',
+  'foo_1139',
+  'foo_1140',
+  'foo_1141',
+  'foo_1142',
+  'foo_1143',
+  'foo_1144',
+  'foo_1145',
+  'foo_1146',
+  'foo_1147',
+  'foo_1148',
+  'foo_1149',
+  'foo_1150',
+  'foo_1151',
+  'foo_1152',
+  'foo_1153',
+  'foo_1154',
+  'foo_1155',
+  'foo_1156',
+  'foo_1157',
+  'foo_1158',
+  'foo_1159',
+  'foo_1160',
+  'foo_1161',
+  'foo_1162',
+  'foo_1163',
+  'foo_1164',
+  'foo_1165',
+  'foo_1166',
+  'foo_1167',
+  'foo_1168',
+  'foo_1169',
+  'foo_1170',
+  'foo_1171',
+  'foo_1172',
+  'foo_1173',
+  'foo_1174',
+  'foo_1175',
+  'foo_1176',
+  'foo_1177',
+  'foo_1178',
+  'foo_1179',
+  'foo_1180',
+  'foo_1181',
+  'foo_1182',
+  'foo_1183',
+  'foo_1184',
+  'foo_1185',
+  'foo_1186',
+  'foo_1187',
+  'foo_1188',
+  'foo_1189',
+  'foo_1190',
+  'foo_1191',
+  'foo_1192',
+  'foo_1193',
+  'foo_1194',
+  'foo_1195',
+  'foo_1196',
+  'foo_1197',
+  'foo_1198',
+  'foo_1199',
+  'foo_1200',
+  'foo_1201',
+  'foo_1202',
+  'foo_1203',
+  'foo_1204',
+  'foo_1205',
+  'foo_1206',
+  'foo_1207',
+  'foo_1208',
+  'foo_1209',
+  'foo_1210',
+  'foo_1211',
+  'foo_1212',
+  'foo_1213',
+  'foo_1214',
+  'foo_1215',
+  'foo_1216',
+  'foo_1217',
+  'foo_1218',
+  'foo_1219',
+  'foo_1220',
+  'foo_1221',
+  'foo_1222',
+  'foo_1223',
+  'foo_1224',
+  'foo_1225',
+  'foo_1226',
+  'foo_1227',
+  'foo_1228',
+  'foo_1229',
+  'foo_1230',
+  'foo_1231',
+  'foo_1232',
+  'foo_1233',
+  'foo_1234',
+  'foo_1235',
+  'foo_1236',
+  'foo_1237',
+  'foo_1238',
+  'foo_1239',
+  'foo_1240',
+  'foo_1241',
+  'foo_1242',
+  'foo_1243',
+  'foo_1244',
+  'foo_1245',
+  'foo_1246',
+  'foo_1247',
+  'foo_1248',
+  'foo_1249',
+  'foo_1250',
+  'foo_1251',
+  'foo_1252',
+  'foo_1253',
+  'foo_1254',
+  'foo_1255',
+  'foo_1256',
+  'foo_1257',
+  'foo_1258',
+  'foo_1259',
+  'foo_1260',
+  'foo_1261',
+  'foo_1262',
+  'foo_1263',
+  'foo_1264',
+  'foo_1265',
+  'foo_1266',
+  'foo_1267',
+  'foo_1268',
+  'foo_1269',
+  'foo_1270',
+  'foo_1271',
+  'foo_1272',
+  'foo_1273',
+  'foo_1274',
+  'foo_1275',
+  'foo_1276',
+  'foo_1277',
+  'foo_1278',
+  'foo_1279',
+  'foo_1280',
+  'foo_1281',
+  'foo_1282',
+  'foo_1283',
+  'foo_1284',
+  'foo_1285',
+  'foo_1286',
+  'foo_1287',
+  'foo_1288',
+  'foo_1289',
+  'foo_1290',
+  'foo_1291',
+  'foo_1292',
+  'foo_1293',
+  'foo_1294',
+  'foo_1295',
+  'foo_1296',
+  'foo_1297',
+  'foo_1298',
+  'foo_1299',
+  'foo_1300',
+  'foo_1301',
+  'foo_1302',
+  'foo_1303',
+  'foo_1304',
+  'foo_1305',
+  'foo_1306',
+  'foo_1307',
+  'foo_1308',
+  'foo_1309',
+  'foo_1310',
+  'foo_1311',
+  'foo_1312',
+  'foo_1313',
+  'foo_1314',
+  'foo_1315',
+  'foo_1316',
+  'foo_1317',
+  'foo_1318',
+  'foo_1319',
+  'foo_1320',
+  'foo_1321',
+  'foo_1322',
+  'foo_1323',
+  'foo_1324',
+  'foo_1325',
+  'foo_1326',
+  'foo_1327',
+  'foo_1328',
+  'foo_1329',
+  'foo_1330',
+  'foo_1331',
+  'foo_1332',
+  'foo_1333',
+  'foo_1334',
+  'foo_1335',
+  'foo_1336',
+  'foo_1337',
+  'foo_1338',
+  'foo_1339',
+  'foo_1340',
+  'foo_1341',
+  'foo_1342',
+  'foo_1343',
+  'foo_1344',
+  'foo_1345',
+  'foo_1346',
+  'foo_1347',
+  'foo_1348',
+  'foo_1349',
+  'foo_1350',
+  'foo_1351',
+  'foo_1352',
+  'foo_1353',
+  'foo_1354',
+  'foo_1355',
+  'foo_1356',
+  'foo_1357',
+  'foo_1358',
+  'foo_1359',
+  'foo_1360',
+  'foo_1361',
+  'foo_1362',
+  'foo_1363',
+  'foo_1364',
+  'foo_1365',
+  'foo_1366',
+  'foo_1367',
+  'foo_1368',
+  'foo_1369',
+  'foo_1370',
+  'foo_1371',
+  'foo_1372',
+  'foo_1373',
+  'foo_1374',
+  'foo_1375',
+  'foo_1376',
+  'foo_1377',
+  'foo_1378',
+  'foo_1379',
+  'foo_1380',
+  'foo_1381',
+  'foo_1382',
+  'foo_1383',
+  'foo_1384',
+  'foo_1385',
+  'foo_1386',
+  'foo_1387',
+  'foo_1388',
+  'foo_1389',
+  'foo_1390',
+  'foo_1391',
+  'foo_1392',
+  'foo_1393',
+  'foo_1394',
+  'foo_1395',
+  'foo_1396',
+  'foo_1397',
+  'foo_1398',
+  'foo_1399',
+  'foo_1400',
+  'foo_1401',
+  'foo_1402',
+  'foo_1403',
+  'foo_1404',
+  'foo_1405',
+  'foo_1406',
+  'foo_1407',
+  'foo_1408',
+  'foo_1409',
+  'foo_1410',
+  'foo_1411',
+  'foo_1412',
+  'foo_1413',
+  'foo_1414',
+  'foo_1415',
+  'foo_1416',
+  'foo_1417',
+  'foo_1418',
+  'foo_1419',
+  'foo_1420',
+  'foo_1421',
+  'foo_1422',
+  'foo_1423',
+  'foo_1424',
+  'foo_1425',
+  'foo_1426',
+  'foo_1427',
+  'foo_1428',
+  'foo_1429',
+  'foo_1430',
+  'foo_1431',
+  'foo_1432',
+  'foo_1433',
+  'foo_1434',
+  'foo_1435',
+  'foo_1436',
+  'foo_1437',
+  'foo_1438',
+  'foo_1439',
+  'foo_1440',
+  'foo_1441',
+  'foo_1442',
+  'foo_1443',
+  'foo_1444',
+  'foo_1445',
+  'foo_1446',
+  'foo_1447',
+  'foo_1448',
+  'foo_1449',
+  'foo_1450',
+  'foo_1451',
+  'foo_1452',
+  'foo_1453',
+  'foo_1454',
+  'foo_1455',
+  'foo_1456',
+  'foo_1457',
+  'foo_1458',
+  'foo_1459',
+  'foo_1460',
+  'foo_1461',
+  'foo_1462',
+  'foo_1463',
+  'foo_1464',
+  'foo_1465',
+  'foo_1466',
+  'foo_1467',
+  'foo_1468',
+  'foo_1469',
+  'foo_1470',
+  'foo_1471',
+  'foo_1472',
+  'foo_1473',
+  'foo_1474',
+  'foo_1475',
+  'foo_1476',
+  'foo_1477',
+  'foo_1478',
+  'foo_1479',
+  'foo_1480',
+  'foo_1481',
+  'foo_1482',
+  'foo_1483',
+  'foo_1484',
+  'foo_1485',
+  'foo_1486',
+  'foo_1487',
+  'foo_1488',
+  'foo_1489',
+  'foo_1490',
+  'foo_1491',
+  'foo_1492',
+  'foo_1493',
+  'foo_1494',
+  'foo_1495',
+  'foo_1496',
+  'foo_1497',
+  'foo_1498',
+  'foo_1499',
+  'foo_1500',
+  'foo_1501',
+  'foo_1502',
+  'foo_1503',
+  'foo_1504',
+  'foo_1505',
+  'foo_1506',
+  'foo_1507',
+  'foo_1508',
+  'foo_1509',
+  'foo_1510',
+  'foo_1511',
+  'foo_1512',
+  'foo_1513',
+  'foo_1514',
+  'foo_1515',
+  'foo_1516',
+  'foo_1517',
+  'foo_1518',
+  'foo_1519',
+  'foo_1520',
+  'foo_1521',
+  'foo_1522',
+  'foo_1523',
+  'foo_1524',
+  'foo_1525',
+  'foo_1526',
+  'foo_1527',
+  'foo_1528',
+  'foo_1529',
+  'foo_1530',
+  'foo_1531',
+  'foo_1532',
+  'foo_1533',
+  'foo_1534',
+  'foo_1535',
+  'foo_1536',
+  'foo_1537',
+  'foo_1538',
+  'foo_1539',
+  'foo_1540',
+  'foo_1541',
+  'foo_1542',
+  'foo_1543',
+  'foo_1544',
+  'foo_1545',
+  'foo_1546',
+  'foo_1547',
+  'foo_1548',
+  'foo_1549',
+  'foo_1550',
+  'foo_1551',
+  'foo_1552',
+  'foo_1553',
+  'foo_1554',
+  'foo_1555',
+  'foo_1556',
+  'foo_1557',
+  'foo_1558',
+  'foo_1559',
+  'foo_1560',
+  'foo_1561',
+  'foo_1562',
+  'foo_1563',
+  'foo_1564',
+  'foo_1565',
+  'foo_1566',
+  'foo_1567',
+  'foo_1568',
+  'foo_1569',
+  'foo_1570',
+  'foo_1571',
+  'foo_1572',
+  'foo_1573',
+  'foo_1574',
+  'foo_1575',
+  'foo_1576',
+  'foo_1577',
+  'foo_1578',
+  'foo_1579',
+  'foo_1580',
+  'foo_1581',
+  'foo_1582',
+  'foo_1583',
+  'foo_1584',
+  'foo_1585',
+  'foo_1586',
+  'foo_1587',
+  'foo_1588',
+  'foo_1589',
+  'foo_1590',
+  'foo_1591',
+  'foo_1592',
+  'foo_1593',
+  'foo_1594',
+  'foo_1595',
+  'foo_1596',
+  'foo_1597',
+  'foo_1598',
+  'foo_1599',
+  'foo_1600',
+  'foo_1601',
+  'foo_1602',
+  'foo_1603',
+  'foo_1604',
+  'foo_1605',
+  'foo_1606',
+  'foo_1607',
+  'foo_1608',
+  'foo_1609',
+  'foo_1610',
+  'foo_1611',
+  'foo_1612',
+  'foo_1613',
+  'foo_1614',
+  'foo_1615',
+  'foo_1616',
+  'foo_1617',
+  'foo_1618',
+  'foo_1619',
+  'foo_1620',
+  'foo_1621',
+  'foo_1622',
+  'foo_1623',
+  'foo_1624',
+  'foo_1625',
+  'foo_1626',
+  'foo_1627',
+  'foo_1628',
+  'foo_1629',
+  'foo_1630',
+  'foo_1631',
+  'foo_1632',
+  'foo_1633',
+  'foo_1634',
+  'foo_1635',
+  'foo_1636',
+  'foo_1637',
+  'foo_1638',
+  'foo_1639',
+  'foo_1640',
+  'foo_1641',
+  'foo_1642',
+  'foo_1643',
+  'foo_1644',
+  'foo_1645',
+  'foo_1646',
+  'foo_1647',
+  'foo_1648',
+  'foo_1649',
+  'foo_1650',
+  'foo_1651',
+  'foo_1652',
+  'foo_1653',
+  'foo_1654',
+  'foo_1655',
+  'foo_1656',
+  'foo_1657',
+  'foo_1658',
+  'foo_1659',
+  'foo_1660',
+  'foo_1661',
+  'foo_1662',
+  'foo_1663',
+  'foo_1664',
+  'foo_1665',
+  'foo_1666',
+  'foo_1667',
+  'foo_1668',
+  'foo_1669',
+  'foo_1670',
+  'foo_1671',
+  'foo_1672',
+  'foo_1673',
+  'foo_1674',
+  'foo_1675',
+  'foo_1676',
+  'foo_1677',
+  'foo_1678',
+  'foo_1679',
+  'foo_1680',
+  'foo_1681',
+  'foo_1682',
+  'foo_1683',
+  'foo_1684',
+  'foo_1685',
+  'foo_1686',
+  'foo_1687',
+  'foo_1688',
+  'foo_1689',
+  'foo_1690',
+  'foo_1691',
+  'foo_1692',
+  'foo_1693',
+  'foo_1694',
+  'foo_1695',
+  'foo_1696',
+  'foo_1697',
+  'foo_1698',
+  'foo_1699',
+  'foo_1700',
+  'foo_1701',
+  'foo_1702',
+  'foo_1703',
+  'foo_1704',
+  'foo_1705',
+  'foo_1706',
+  'foo_1707',
+  'foo_1708',
+  'foo_1709',
+  'foo_1710',
+  'foo_1711',
+  'foo_1712',
+  'foo_1713',
+  'foo_1714',
+  'foo_1715',
+  'foo_1716',
+  'foo_1717',
+  'foo_1718',
+  'foo_1719',
+  'foo_1720',
+  'foo_1721',
+  'foo_1722',
+  'foo_1723',
+  'foo_1724',
+  'foo_1725',
+  'foo_1726',
+  'foo_1727',
+  'foo_1728',
+  'foo_1729',
+  'foo_1730',
+  'foo_1731',
+  'foo_1732',
+  'foo_1733',
+  'foo_1734',
+  'foo_1735',
+  'foo_1736',
+  'foo_1737',
+  'foo_1738',
+  'foo_1739',
+  'foo_1740',
+  'foo_1741',
+  'foo_1742',
+  'foo_1743',
+  'foo_1744',
+  'foo_1745',
+  'foo_1746',
+  'foo_1747',
+  'foo_1748',
+  'foo_1749',
+  'foo_1750',
+  'foo_1751',
+  'foo_1752',
+  'foo_1753',
+  'foo_1754',
+  'foo_1755',
+  'foo_1756',
+  'foo_1757',
+  'foo_1758',
+  'foo_1759',
+  'foo_1760',
+  'foo_1761',
+  'foo_1762',
+  'foo_1763',
+  'foo_1764',
+  'foo_1765',
+  'foo_1766',
+  'foo_1767',
+  'foo_1768',
+  'foo_1769',
+  'foo_1770',
+  'foo_1771',
+  'foo_1772',
+  'foo_1773',
+  'foo_1774',
+  'foo_1775',
+  'foo_1776',
+  'foo_1777',
+  'foo_1778',
+  'foo_1779',
+  'foo_1780',
+  'foo_1781',
+  'foo_1782',
+  'foo_1783',
+  'foo_1784',
+  'foo_1785',
+  'foo_1786',
+  'foo_1787',
+  'foo_1788',
+  'foo_1789',
+  'foo_1790',
+  'foo_1791',
+  'foo_1792',
+  'foo_1793',
+  'foo_1794',
+  'foo_1795',
+  'foo_1796',
+  'foo_1797',
+  'foo_1798',
+  'foo_1799',
+  'foo_1800',
+  'foo_1801',
+  'foo_1802',
+  'foo_1803',
+  'foo_1804',
+  'foo_1805',
+  'foo_1806',
+  'foo_1807',
+  'foo_1808',
+  'foo_1809',
+  'foo_1810',
+  'foo_1811',
+  'foo_1812',
+  'foo_1813',
+  'foo_1814',
+  'foo_1815',
+  'foo_1816',
+  'foo_1817',
+  'foo_1818',
+  'foo_1819',
+  'foo_1820',
+  'foo_1821',
+  'foo_1822',
+  'foo_1823',
+  'foo_1824',
+  'foo_1825',
+  'foo_1826',
+  'foo_1827',
+  'foo_1828',
+  'foo_1829',
+  'foo_1830',
+  'foo_1831',
+  'foo_1832',
+  'foo_1833',
+  'foo_1834',
+  'foo_1835',
+  'foo_1836',
+  'foo_1837',
+  'foo_1838',
+  'foo_1839',
+  'foo_1840',
+  'foo_1841',
+  'foo_1842',
+  'foo_1843',
+  'foo_1844',
+  'foo_1845',
+  'foo_1846',
+  'foo_1847',
+  'foo_1848',
+  'foo_1849',
+  'foo_1850',
+  'foo_1851',
+  'foo_1852',
+  'foo_1853',
+  'foo_1854',
+  'foo_1855',
+  'foo_1856',
+  'foo_1857',
+  'foo_1858',
+  'foo_1859',
+  'foo_1860',
+  'foo_1861',
+  'foo_1862',
+  'foo_1863',
+  'foo_1864',
+  'foo_1865',
+  'foo_1866',
+  'foo_1867',
+  'foo_1868',
+  'foo_1869',
+  'foo_1870',
+  'foo_1871',
+  'foo_1872',
+  'foo_1873',
+  'foo_1874',
+  'foo_1875',
+  'foo_1876',
+  'foo_1877',
+  'foo_1878',
+  'foo_1879',
+  'foo_1880',
+  'foo_1881',
+  'foo_1882',
+  'foo_1883',
+  'foo_1884',
+  'foo_1885',
+  'foo_1886',
+  'foo_1887',
+  'foo_1888',
+  'foo_1889',
+  'foo_1890',
+  'foo_1891',
+  'foo_1892',
+  'foo_1893',
+  'foo_1894',
+  'foo_1895',
+  'foo_1896',
+  'foo_1897',
+  'foo_1898',
+  'foo_1899',
+  'foo_1900',
+  'foo_1901',
+  'foo_1902',
+  'foo_1903',
+  'foo_1904',
+  'foo_1905',
+  'foo_1906',
+  'foo_1907',
+  'foo_1908',
+  'foo_1909',
+  'foo_1910',
+  'foo_1911',
+  'foo_1912',
+  'foo_1913',
+  'foo_1914',
+  'foo_1915',
+  'foo_1916',
+  'foo_1917',
+  'foo_1918',
+  'foo_1919',
+  'foo_1920',
+  'foo_1921',
+  'foo_1922',
+  'foo_1923',
+  'foo_1924',
+  'foo_1925',
+  'foo_1926',
+  'foo_1927',
+  'foo_1928',
+  'foo_1929',
+  'foo_1930',
+  'foo_1931',
+  'foo_1932',
+  'foo_1933',
+  'foo_1934',
+  'foo_1935',
+  'foo_1936',
+  'foo_1937',
+  'foo_1938',
+  'foo_1939',
+  'foo_1940',
+  'foo_1941',
+  'foo_1942',
+  'foo_1943',
+  'foo_1944',
+  'foo_1945',
+  'foo_1946',
+  'foo_1947',
+  'foo_1948',
+  'foo_1949',
+  'foo_1950',
+  'foo_1951',
+  'foo_1952',
+  'foo_1953',
+  'foo_1954',
+  'foo_1955',
+  'foo_1956',
+  'foo_1957',
+  'foo_1958',
+  'foo_1959',
+  'foo_1960',
+  'foo_1961',
+  'foo_1962',
+  'foo_1963',
+  'foo_1964',
+  'foo_1965',
+  'foo_1966',
+  'foo_1967',
+  'foo_1968',
+  'foo_1969',
+  'foo_1970',
+  'foo_1971',
+  'foo_1972',
+  'foo_1973',
+  'foo_1974',
+  'foo_1975',
+  'foo_1976',
+  'foo_1977',
+  'foo_1978',
+  'foo_1979',
+  'foo_1980',
+  'foo_1981',
+  'foo_1982',
+  'foo_1983',
+  'foo_1984',
+  'foo_1985',
+  'foo_1986',
+  'foo_1987',
+  'foo_1988',
+  'foo_1989',
+  'foo_1990',
+  'foo_1991',
+  'foo_1992',
+  'foo_1993',
+  'foo_1994',
+  'foo_1995',
+  'foo_1996',
+  'foo_1997',
+  'foo_1998',
+  'foo_1999',
+  'foo_2000',
+  'foo_2001',
+  'foo_2002',
+  'foo_2003',
+  'foo_2004',
+  'foo_2005',
+  'foo_2006',
+  'foo_2007',
+  'foo_2008',
+  'foo_2009',
+  'foo_2010',
+  'foo_2011',
+  'foo_2012',
+  'foo_2013',
+  'foo_2014',
+  'foo_2015',
+  'foo_2016',
+  'foo_2017',
+  'foo_2018',
+  'foo_2019',
+  'foo_2020',
+  'foo_2021',
+  'foo_2022',
+  'foo_2023',
+  'foo_2024',
+  'foo_2025',
+  'foo_2026',
+  'foo_2027',
+  'foo_2028',
+  'foo_2029',
+  'foo_2030',
+  'foo_2031',
+  'foo_2032',
+  'foo_2033',
+  'foo_2034',
+  'foo_2035',
+  'foo_2036',
+  'foo_2037',
+  'foo_2038',
+  'foo_2039',
+  'foo_2040',
+  'foo_2041',
+  'foo_2042',
+  'foo_2043',
+  'foo_2044',
+  'foo_2045',
+  'foo_2046',
+  'foo_2047',
+  'foo_2048',
+  'foo_2049',
+  'foo_2050',
+  'foo_2051',
+  'foo_2052',
+  'foo_2053',
+  'foo_2054',
+  'foo_2055',
+  'foo_2056',
+  'foo_2057',
+  'foo_2058',
+  'foo_2059',
+  'foo_2060',
+  'foo_2061',
+  'foo_2062',
+  'foo_2063',
+  'foo_2064',
+  'foo_2065',
+  'foo_2066',
+  'foo_2067',
+  'foo_2068',
+  'foo_2069',
+  'foo_2070',
+  'foo_2071',
+  'foo_2072',
+  'foo_2073',
+  'foo_2074',
+  'foo_2075',
+  'foo_2076',
+  'foo_2077',
+  'foo_2078',
+  'foo_2079',
+  'foo_2080',
+  'foo_2081',
+  'foo_2082',
+  'foo_2083',
+  'foo_2084',
+  'foo_2085',
+  'foo_2086',
+  'foo_2087',
+  'foo_2088',
+  'foo_2089',
+  'foo_2090',
+  'foo_2091',
+  'foo_2092',
+  'foo_2093',
+  'foo_2094',
+  'foo_2095',
+  'foo_2096',
+  'foo_2097',
+  'foo_2098',
+  'foo_2099',
+  'foo_2100',
+  'foo_2101',
+  'foo_2102',
+  'foo_2103',
+  'foo_2104',
+  'foo_2105',
+  'foo_2106',
+  'foo_2107',
+  'foo_2108',
+  'foo_2109',
+  'foo_2110',
+  'foo_2111',
+  'foo_2112',
+  'foo_2113',
+  'foo_2114',
+  'foo_2115',
+  'foo_2116',
+  'foo_2117',
+  'foo_2118',
+  'foo_2119',
+  'foo_2120',
+  'foo_2121',
+  'foo_2122',
+  'foo_2123',
+  'foo_2124',
+  'foo_2125',
+  'foo_2126',
+  'foo_2127',
+  'foo_2128',
+  'foo_2129',
+  'foo_2130',
+  'foo_2131',
+  'foo_2132',
+  'foo_2133',
+  'foo_2134',
+  'foo_2135',
+  'foo_2136',
+  'foo_2137',
+  'foo_2138',
+  'foo_2139',
+  'foo_2140',
+  'foo_2141',
+  'foo_2142',
+  'foo_2143',
+  'foo_2144',
+  'foo_2145',
+  'foo_2146',
+  'foo_2147',
+  'foo_2148',
+  'foo_2149',
+  'foo_2150',
+  'foo_2151',
+  'foo_2152',
+  'foo_2153',
+  'foo_2154',
+  'foo_2155',
+  'foo_2156',
+  'foo_2157',
+  'foo_2158',
+  'foo_2159',
+  'foo_2160',
+  'foo_2161',
+  'foo_2162',
+  'foo_2163',
+  'foo_2164',
+  'foo_2165',
+  'foo_2166',
+  'foo_2167',
+  'foo_2168',
+  'foo_2169',
+  'foo_2170',
+  'foo_2171',
+  'foo_2172',
+  'foo_2173',
+  'foo_2174',
+  'foo_2175',
+  'foo_2176',
+  'foo_2177',
+  'foo_2178',
+  'foo_2179',
+  'foo_2180',
+  'foo_2181',
+  'foo_2182',
+  'foo_2183',
+  'foo_2184',
+  'foo_2185',
+  'foo_2186',
+  'foo_2187',
+  'foo_2188',
+  'foo_2189',
+  'foo_2190',
+  'foo_2191',
+  'foo_2192',
+  'foo_2193',
+  'foo_2194',
+  'foo_2195',
+  'foo_2196',
+  'foo_2197',
+  'foo_2198',
+  'foo_2199',
+  'foo_2200',
+  'foo_2201',
+  'foo_2202',
+  'foo_2203',
+  'foo_2204',
+  'foo_2205',
+  'foo_2206',
+  'foo_2207',
+  'foo_2208',
+  'foo_2209',
+  'foo_2210',
+  'foo_2211',
+  'foo_2212',
+  'foo_2213',
+  'foo_2214',
+  'foo_2215',
+  'foo_2216',
+  'foo_2217',
+  'foo_2218',
+  'foo_2219',
+  'foo_2220',
+  'foo_2221',
+  'foo_2222',
+  'foo_2223',
+  'foo_2224',
+  'foo_2225',
+  'foo_2226',
+  'foo_2227',
+  'foo_2228',
+  'foo_2229',
+  'foo_2230',
+  'foo_2231',
+  'foo_2232',
+  'foo_2233',
+  'foo_2234',
+  'foo_2235',
+  'foo_2236',
+  'foo_2237',
+  'foo_2238',
+  'foo_2239',
+  'foo_2240',
+  'foo_2241',
+  'foo_2242',
+  'foo_2243',
+  'foo_2244',
+  'foo_2245',
+  'foo_2246',
+  'foo_2247',
+  'foo_2248',
+  'foo_2249',
+  'foo_2250',
+  'foo_2251',
+  'foo_2252',
+  'foo_2253',
+  'foo_2254',
+  'foo_2255',
+  'foo_2256',
+  'foo_2257',
+  'foo_2258',
+  'foo_2259',
+  'foo_2260',
+  'foo_2261',
+  'foo_2262',
+  'foo_2263',
+  'foo_2264',
+  'foo_2265',
+  'foo_2266',
+  'foo_2267',
+  'foo_2268',
+  'foo_2269',
+  'foo_2270',
+  'foo_2271',
+  'foo_2272',
+  'foo_2273',
+  'foo_2274',
+  'foo_2275',
+  'foo_2276',
+  'foo_2277',
+  'foo_2278',
+  'foo_2279',
+  'foo_2280',
+  'foo_2281',
+  'foo_2282',
+  'foo_2283',
+  'foo_2284',
+  'foo_2285',
+  'foo_2286',
+  'foo_2287',
+  'foo_2288',
+  'foo_2289',
+  'foo_2290',
+  'foo_2291',
+  'foo_2292',
+  'foo_2293',
+  'foo_2294',
+  'foo_2295',
+  'foo_2296',
+  'foo_2297',
+  'foo_2298',
+  'foo_2299',
+  'foo_2300',
+  'foo_2301',
+  'foo_2302',
+  'foo_2303',
+  'foo_2304',
+  'foo_2305',
+  'foo_2306',
+  'foo_2307',
+  'foo_2308',
+  'foo_2309',
+  'foo_2310',
+  'foo_2311',
+  'foo_2312',
+  'foo_2313',
+  'foo_2314',
+  'foo_2315',
+  'foo_2316',
+  'foo_2317',
+  'foo_2318',
+  'foo_2319',
+  'foo_2320',
+  'foo_2321',
+  'foo_2322',
+  'foo_2323',
+  'foo_2324',
+  'foo_2325',
+  'foo_2326',
+  'foo_2327',
+  'foo_2328',
+  'foo_2329',
+  'foo_2330',
+  'foo_2331',
+  'foo_2332',
+  'foo_2333',
+  'foo_2334',
+  'foo_2335',
+  'foo_2336',
+  'foo_2337',
+  'foo_2338',
+  'foo_2339',
+  'foo_2340',
+  'foo_2341',
+  'foo_2342',
+  'foo_2343',
+  'foo_2344',
+  'foo_2345',
+  'foo_2346',
+  'foo_2347',
+  'foo_2348',
+  'foo_2349',
+  'foo_2350',
+  'foo_2351',
+  'foo_2352',
+  'foo_2353',
+  'foo_2354',
+  'foo_2355',
+  'foo_2356',
+  'foo_2357',
+  'foo_2358',
+  'foo_2359',
+  'foo_2360',
+  'foo_2361',
+  'foo_2362',
+  'foo_2363',
+  'foo_2364',
+  'foo_2365',
+  'foo_2366',
+  'foo_2367',
+  'foo_2368',
+  'foo_2369',
+  'foo_2370',
+  'foo_2371',
+  'foo_2372',
+  'foo_2373',
+  'foo_2374',
+  'foo_2375',
+  'foo_2376',
+  'foo_2377',
+  'foo_2378',
+  'foo_2379',
+  'foo_2380',
+  'foo_2381',
+  'foo_2382',
+  'foo_2383',
+  'foo_2384',
+  'foo_2385',
+  'foo_2386',
+  'foo_2387',
+  'foo_2388',
+  'foo_2389',
+  'foo_2390',
+  'foo_2391',
+  'foo_2392',
+  'foo_2393',
+  'foo_2394',
+  'foo_2395',
+  'foo_2396',
+  'foo_2397',
+  'foo_2398',
+  'foo_2399',
+  'foo_2400',
+  'foo_2401',
+  'foo_2402',
+  'foo_2403',
+  'foo_2404',
+  'foo_2405',
+  'foo_2406',
+  'foo_2407',
+  'foo_2408',
+  'foo_2409',
+  'foo_2410',
+  'foo_2411',
+  'foo_2412',
+  'foo_2413',
+  'foo_2414',
+  'foo_2415',
+  'foo_2416',
+  'foo_2417',
+  'foo_2418',
+  'foo_2419',
+  'foo_2420',
+  'foo_2421',
+  'foo_2422',
+  'foo_2423',
+  'foo_2424',
+  'foo_2425',
+  'foo_2426',
+  'foo_2427',
+  'foo_2428',
+  'foo_2429',
+  'foo_2430',
+  'foo_2431',
+  'foo_2432',
+  'foo_2433',
+  'foo_2434',
+  'foo_2435',
+  'foo_2436',
+  'foo_2437',
+  'foo_2438',
+  'foo_2439',
+  'foo_2440',
+  'foo_2441',
+  'foo_2442',
+  'foo_2443',
+  'foo_2444',
+  'foo_2445',
+  'foo_2446',
+  'foo_2447',
+  'foo_2448',
+  'foo_2449',
+  'foo_2450',
+  'foo_2451',
+  'foo_2452',
+  'foo_2453',
+  'foo_2454',
+  'foo_2455',
+  'foo_2456',
+  'foo_2457',
+  'foo_2458',
+  'foo_2459',
+  'foo_2460',
+  'foo_2461',
+  'foo_2462',
+  'foo_2463',
+  'foo_2464',
+  'foo_2465',
+  'foo_2466',
+  'foo_2467',
+  'foo_2468',
+  'foo_2469',
+  'foo_2470',
+  'foo_2471',
+  'foo_2472',
+  'foo_2473',
+  'foo_2474',
+  'foo_2475',
+  'foo_2476',
+  'foo_2477',
+  'foo_2478',
+  'foo_2479',
+  'foo_2480',
+  'foo_2481',
+  'foo_2482',
+  'foo_2483',
+  'foo_2484',
+  'foo_2485',
+  'foo_2486',
+  'foo_2487',
+  'foo_2488',
+  'foo_2489',
+  'foo_2490',
+  'foo_2491',
+  'foo_2492',
+  'foo_2493',
+  'foo_2494',
+  'foo_2495',
+  'foo_2496',
+  'foo_2497',
+  'foo_2498',
+  'foo_2499',
+  'foo_2500',
+  'foo_2501',
+  'foo_2502',
+  'foo_2503',
+  'foo_2504',
+  'foo_2505',
+  'foo_2506',
+  'foo_2507',
+  'foo_2508',
+  'foo_2509',
+  'foo_2510',
+  'foo_2511',
+  'foo_2512',
+  'foo_2513',
+  'foo_2514',
+  'foo_2515',
+  'foo_2516',
+  'foo_2517',
+  'foo_2518',
+  'foo_2519',
+  'foo_2520',
+  'foo_2521',
+  'foo_2522',
+  'foo_2523',
+  'foo_2524',
+  'foo_2525',
+  'foo_2526',
+  'foo_2527',
+  'foo_2528',
+  'foo_2529',
+  'foo_2530',
+  'foo_2531',
+  'foo_2532',
+  'foo_2533',
+  'foo_2534',
+  'foo_2535',
+  'foo_2536',
+  'foo_2537',
+  'foo_2538',
+  'foo_2539',
+  'foo_2540',
+  'foo_2541',
+  'foo_2542',
+  'foo_2543',
+  'foo_2544',
+  'foo_2545',
+  'foo_2546',
+  'foo_2547',
+  'foo_2548',
+  'foo_2549',
+  'foo_2550',
+  'foo_2551',
+  'foo_2552',
+  'foo_2553',
+  'foo_2554',
+  'foo_2555',
+  'foo_2556',
+  'foo_2557',
+  'foo_2558',
+  'foo_2559',
+  'foo_2560',
+  'foo_2561',
+  'foo_2562',
+  'foo_2563',
+  'foo_2564',
+  'foo_2565',
+  'foo_2566',
+  'foo_2567',
+  'foo_2568',
+  'foo_2569',
+  'foo_2570',
+  'foo_2571',
+  'foo_2572',
+  'foo_2573',
+  'foo_2574',
+  'foo_2575',
+  'foo_2576',
+  'foo_2577',
+  'foo_2578',
+  'foo_2579',
+  'foo_2580',
+  'foo_2581',
+  'foo_2582',
+  'foo_2583',
+  'foo_2584',
+  'foo_2585',
+  'foo_2586',
+  'foo_2587',
+  'foo_2588',
+  'foo_2589',
+  'foo_2590',
+  'foo_2591',
+  'foo_2592',
+  'foo_2593',
+  'foo_2594',
+  'foo_2595',
+  'foo_2596',
+  'foo_2597',
+  'foo_2598',
+  'foo_2599',
+  'foo_2600',
+  'foo_2601',
+  'foo_2602',
+  'foo_2603',
+  'foo_2604',
+  'foo_2605',
+  'foo_2606',
+  'foo_2607',
+  'foo_2608',
+  'foo_2609',
+  'foo_2610',
+  'foo_2611',
+  'foo_2612',
+  'foo_2613',
+  'foo_2614',
+  'foo_2615',
+  'foo_2616',
+  'foo_2617',
+  'foo_2618',
+  'foo_2619',
+  'foo_2620',
+  'foo_2621',
+  'foo_2622',
+  'foo_2623',
+  'foo_2624',
+  'foo_2625',
+  'foo_2626',
+  'foo_2627',
+  'foo_2628',
+  'foo_2629',
+  'foo_2630',
+  'foo_2631',
+  'foo_2632',
+  'foo_2633',
+  'foo_2634',
+  'foo_2635',
+  'foo_2636',
+  'foo_2637',
+  'foo_2638',
+  'foo_2639',
+  'foo_2640',
+  'foo_2641',
+  'foo_2642',
+  'foo_2643',
+  'foo_2644',
+  'foo_2645',
+  'foo_2646',
+  'foo_2647',
+  'foo_2648',
+  'foo_2649',
+  'foo_2650',
+  'foo_2651',
+  'foo_2652',
+  'foo_2653',
+  'foo_2654',
+  'foo_2655',
+  'foo_2656',
+  'foo_2657',
+  'foo_2658',
+  'foo_2659',
+  'foo_2660',
+  'foo_2661',
+  'foo_2662',
+  'foo_2663',
+  'foo_2664',
+  'foo_2665',
+  'foo_2666',
+  'foo_2667',
+  'foo_2668',
+  'foo_2669',
+  'foo_2670',
+  'foo_2671',
+  'foo_2672',
+  'foo_2673',
+  'foo_2674',
+  'foo_2675',
+  'foo_2676',
+  'foo_2677',
+  'foo_2678',
+  'foo_2679',
+  'foo_2680',
+  'foo_2681',
+  'foo_2682',
+  'foo_2683',
+  'foo_2684',
+  'foo_2685',
+  'foo_2686',
+  'foo_2687',
+  'foo_2688',
+  'foo_2689',
+  'foo_2690',
+  'foo_2691',
+  'foo_2692',
+  'foo_2693',
+  'foo_2694',
+  'foo_2695',
+  'foo_2696',
+  'foo_2697',
+  'foo_2698',
+  'foo_2699',
+  'foo_2700',
+  'foo_2701',
+  'foo_2702',
+  'foo_2703',
+  'foo_2704',
+  'foo_2705',
+  'foo_2706',
+  'foo_2707',
+  'foo_2708',
+  'foo_2709',
+  'foo_2710',
+  'foo_2711',
+  'foo_2712',
+  'foo_2713',
+  'foo_2714',
+  'foo_2715',
+  'foo_2716',
+  'foo_2717',
+  'foo_2718',
+  'foo_2719',
+  'foo_2720',
+  'foo_2721',
+  'foo_2722',
+  'foo_2723',
+  'foo_2724',
+  'foo_2725',
+  'foo_2726',
+  'foo_2727',
+  'foo_2728',
+  'foo_2729',
+  'foo_2730',
+  'foo_2731',
+  'foo_2732',
+  'foo_2733',
+  'foo_2734',
+  'foo_2735',
+  'foo_2736',
+  'foo_2737',
+  'foo_2738',
+  'foo_2739',
+  'foo_2740',
+  'foo_2741',
+  'foo_2742',
+  'foo_2743',
+  'foo_2744',
+  'foo_2745',
+  'foo_2746',
+  'foo_2747',
+  'foo_2748',
+  'foo_2749',
+  'foo_2750',
+  'foo_2751',
+  'foo_2752',
+  'foo_2753',
+  'foo_2754',
+  'foo_2755',
+  'foo_2756',
+  'foo_2757',
+  'foo_2758',
+  'foo_2759',
+  'foo_2760',
+  'foo_2761',
+  'foo_2762',
+  'foo_2763',
+  'foo_2764',
+  'foo_2765',
+  'foo_2766',
+  'foo_2767',
+  'foo_2768',
+  'foo_2769',
+  'foo_2770',
+  'foo_2771',
+  'foo_2772',
+  'foo_2773',
+  'foo_2774',
+  'foo_2775',
+  'foo_2776',
+  'foo_2777',
+  'foo_2778',
+  'foo_2779',
+  'foo_2780',
+  'foo_2781',
+  'foo_2782',
+  'foo_2783',
+  'foo_2784',
+  'foo_2785',
+  'foo_2786',
+  'foo_2787',
+  'foo_2788',
+  'foo_2789',
+  'foo_2790',
+  'foo_2791',
+  'foo_2792',
+  'foo_2793',
+  'foo_2794',
+  'foo_2795',
+  'foo_2796',
+  'foo_2797',
+  'foo_2798',
+  'foo_2799',
+  'foo_2800',
+  'foo_2801',
+  'foo_2802',
+  'foo_2803',
+  'foo_2804',
+  'foo_2805',
+  'foo_2806',
+  'foo_2807',
+  'foo_2808',
+  'foo_2809',
+  'foo_2810',
+  'foo_2811',
+  'foo_2812',
+  'foo_2813',
+  'foo_2814',
+  'foo_2815',
+  'foo_2816',
+  'foo_2817',
+  'foo_2818',
+  'foo_2819',
+  'foo_2820',
+  'foo_2821',
+  'foo_2822',
+  'foo_2823',
+  'foo_2824',
+  'foo_2825',
+  'foo_2826',
+  'foo_2827',
+  'foo_2828',
+  'foo_2829',
+  'foo_2830',
+  'foo_2831',
+  'foo_2832',
+  'foo_2833',
+  'foo_2834',
+  'foo_2835',
+  'foo_2836',
+  'foo_2837',
+  'foo_2838',
+  'foo_2839',
+  'foo_2840',
+  'foo_2841',
+  'foo_2842',
+  'foo_2843',
+  'foo_2844',
+  'foo_2845',
+  'foo_2846',
+  'foo_2847',
+  'foo_2848',
+  'foo_2849',
+  'foo_2850',
+  'foo_2851',
+  'foo_2852',
+  'foo_2853',
+  'foo_2854',
+  'foo_2855',
+  'foo_2856',
+  'foo_2857',
+  'foo_2858',
+  'foo_2859',
+  'foo_2860',
+  'foo_2861',
+  'foo_2862',
+  'foo_2863',
+  'foo_2864',
+  'foo_2865',
+  'foo_2866',
+  'foo_2867',
+  'foo_2868',
+  'foo_2869',
+  'foo_2870',
+  'foo_2871',
+  'foo_2872',
+  'foo_2873',
+  'foo_2874',
+  'foo_2875',
+  'foo_2876',
+  'foo_2877',
+  'foo_2878',
+  'foo_2879',
+  'foo_2880',
+  'foo_2881',
+  'foo_2882',
+  'foo_2883',
+  'foo_2884',
+  'foo_2885',
+  'foo_2886',
+  'foo_2887',
+  'foo_2888',
+  'foo_2889',
+  'foo_2890',
+  'foo_2891',
+  'foo_2892',
+  'foo_2893',
+  'foo_2894',
+  'foo_2895',
+  'foo_2896',
+  'foo_2897',
+  'foo_2898',
+  'foo_2899',
+  'foo_2900',
+  'foo_2901',
+  'foo_2902',
+  'foo_2903',
+  'foo_2904',
+  'foo_2905',
+  'foo_2906',
+  'foo_2907',
+  'foo_2908',
+  'foo_2909',
+  'foo_2910',
+  'foo_2911',
+  'foo_2912',
+  'foo_2913',
+  'foo_2914',
+  'foo_2915',
+  'foo_2916',
+  'foo_2917',
+  'foo_2918',
+  'foo_2919',
+  'foo_2920',
+  'foo_2921',
+  'foo_2922',
+  'foo_2923',
+  'foo_2924',
+  'foo_2925',
+  'foo_2926',
+  'foo_2927',
+  'foo_2928',
+  'foo_2929',
+  'foo_2930',
+  'foo_2931',
+  'foo_2932',
+  'foo_2933',
+  'foo_2934',
+  'foo_2935',
+  'foo_2936',
+  'foo_2937',
+  'foo_2938',
+  'foo_2939',
+  'foo_2940',
+  'foo_2941',
+  'foo_2942',
+  'foo_2943',
+  'foo_2944',
+  'foo_2945',
+  'foo_2946',
+  'foo_2947',
+  'foo_2948',
+  'foo_2949',
+  'foo_2950',
+  'foo_2951',
+  'foo_2952',
+  'foo_2953',
+  'foo_2954',
+  'foo_2955',
+  'foo_2956',
+  'foo_2957',
+  'foo_2958',
+  'foo_2959',
+  'foo_2960',
+  'foo_2961',
+  'foo_2962',
+  'foo_2963',
+  'foo_2964',
+  'foo_2965',
+  'foo_2966',
+  'foo_2967',
+  'foo_2968',
+  'foo_2969',
+  'foo_2970',
+  'foo_2971',
+  'foo_2972',
+  'foo_2973',
+  'foo_2974',
+  'foo_2975',
+  'foo_2976',
+  'foo_2977',
+  'foo_2978',
+  'foo_2979',
+  'foo_2980',
+  'foo_2981',
+  'foo_2982',
+  'foo_2983',
+  'foo_2984',
+  'foo_2985',
+  'foo_2986',
+  'foo_2987',
+  'foo_2988',
+  'foo_2989',
+  'foo_2990',
+  'foo_2991',
+  'foo_2992',
+  'foo_2993',
+  'foo_2994',
+  'foo_2995',
+  'foo_2996',
+  'foo_2997',
+  'foo_2998',
+  'foo_2999',
+  'foo_3000',
+  'foo_3001',
+  'foo_3002',
+  'foo_3003',
+  'foo_3004',
+  'foo_3005',
+  'foo_3006',
+  'foo_3007',
+  'foo_3008',
+  'foo_3009',
+  'foo_3010',
+  'foo_3011',
+  'foo_3012',
+  'foo_3013',
+  'foo_3014',
+  'foo_3015',
+  'foo_3016',
+  'foo_3017',
+  'foo_3018',
+  'foo_3019',
+  'foo_3020',
+  'foo_3021',
+  'foo_3022',
+  'foo_3023',
+  'foo_3024',
+  'foo_3025',
+  'foo_3026',
+  'foo_3027',
+  'foo_3028',
+  'foo_3029',
+  'foo_3030',
+  'foo_3031',
+  'foo_3032',
+  'foo_3033',
+  'foo_3034',
+  'foo_3035',
+  'foo_3036',
+  'foo_3037',
+  'foo_3038',
+  'foo_3039',
+  'foo_3040',
+  'foo_3041',
+  'foo_3042',
+  'foo_3043',
+  'foo_3044',
+  'foo_3045',
+  'foo_3046',
+  'foo_3047',
+  'foo_3048',
+  'foo_3049',
+  'foo_3050',
+  'foo_3051',
+  'foo_3052',
+  'foo_3053',
+  'foo_3054',
+  'foo_3055',
+  'foo_3056',
+  'foo_3057',
+  'foo_3058',
+  'foo_3059',
+  'foo_3060',
+  'foo_3061',
+  'foo_3062',
+  'foo_3063',
+  'foo_3064',
+  'foo_3065',
+  'foo_3066',
+  'foo_3067',
+  'foo_3068',
+  'foo_3069',
+  'foo_3070',
+  'foo_3071',
+  'foo_3072',
+  'foo_3073',
+  'foo_3074',
+  'foo_3075',
+  'foo_3076',
+  'foo_3077',
+  'foo_3078',
+  'foo_3079',
+  'foo_3080',
+  'foo_3081',
+  'foo_3082',
+  'foo_3083',
+  'foo_3084',
+  'foo_3085',
+  'foo_3086',
+  'foo_3087',
+  'foo_3088',
+  'foo_3089',
+  'foo_3090',
+  'foo_3091',
+  'foo_3092',
+  'foo_3093',
+  'foo_3094',
+  'foo_3095',
+  'foo_3096',
+  'foo_3097',
+  'foo_3098',
+  'foo_3099',
+  'foo_3100',
+  'foo_3101',
+  'foo_3102',
+  'foo_3103',
+  'foo_3104',
+  'foo_3105',
+  'foo_3106',
+  'foo_3107',
+  'foo_3108',
+  'foo_3109',
+  'foo_3110',
+  'foo_3111',
+  'foo_3112',
+  'foo_3113',
+  'foo_3114',
+  'foo_3115',
+  'foo_3116',
+  'foo_3117',
+  'foo_3118',
+  'foo_3119',
+  'foo_3120',
+  'foo_3121',
+  'foo_3122',
+  'foo_3123',
+  'foo_3124',
+  'foo_3125',
+  'foo_3126',
+  'foo_3127',
+  'foo_3128',
+  'foo_3129',
+  'foo_3130',
+  'foo_3131',
+  'foo_3132',
+  'foo_3133',
+  'foo_3134',
+  'foo_3135',
+  'foo_3136',
+  'foo_3137',
+  'foo_3138',
+  'foo_3139',
+  'foo_3140',
+  'foo_3141',
+  'foo_3142',
+  'foo_3143',
+  'foo_3144',
+  'foo_3145',
+  'foo_3146',
+  'foo_3147',
+  'foo_3148',
+  'foo_3149',
+  'foo_3150',
+  'foo_3151',
+  'foo_3152',
+  'foo_3153',
+  'foo_3154',
+  'foo_3155',
+  'foo_3156',
+  'foo_3157',
+  'foo_3158',
+  'foo_3159',
+  'foo_3160',
+  'foo_3161',
+  'foo_3162',
+  'foo_3163',
+  'foo_3164',
+  'foo_3165',
+  'foo_3166',
+  'foo_3167',
+  'foo_3168',
+  'foo_3169',
+  'foo_3170',
+  'foo_3171',
+  'foo_3172',
+  'foo_3173',
+  'foo_3174',
+  'foo_3175',
+  'foo_3176',
+  'foo_3177',
+  'foo_3178',
+  'foo_3179',
+  'foo_3180',
+  'foo_3181',
+  'foo_3182',
+  'foo_3183',
+  'foo_3184',
+  'foo_3185',
+  'foo_3186',
+  'foo_3187',
+  'foo_3188',
+  'foo_3189',
+  'foo_3190',
+  'foo_3191',
+  'foo_3192',
+  'foo_3193',
+  'foo_3194',
+  'foo_3195',
+  'foo_3196',
+  'foo_3197',
+  'foo_3198',
+  'foo_3199',
+  'foo_3200',
+  'foo_3201',
+  'foo_3202',
+  'foo_3203',
+  'foo_3204',
+  'foo_3205',
+  'foo_3206',
+  'foo_3207',
+  'foo_3208',
+  'foo_3209',
+  'foo_3210',
+  'foo_3211',
+  'foo_3212',
+  'foo_3213',
+  'foo_3214',
+  'foo_3215',
+  'foo_3216',
+  'foo_3217',
+  'foo_3218',
+  'foo_3219',
+  'foo_3220',
+  'foo_3221',
+  'foo_3222',
+  'foo_3223',
+  'foo_3224',
+  'foo_3225',
+  'foo_3226',
+  'foo_3227',
+  'foo_3228',
+  'foo_3229',
+  'foo_3230',
+  'foo_3231',
+  'foo_3232',
+  'foo_3233',
+  'foo_3234',
+  'foo_3235',
+  'foo_3236',
+  'foo_3237',
+  'foo_3238',
+  'foo_3239',
+  'foo_3240',
+  'foo_3241',
+  'foo_3242',
+  'foo_3243',
+  'foo_3244',
+  'foo_3245',
+  'foo_3246',
+  'foo_3247',
+  'foo_3248',
+  'foo_3249',
+  'foo_3250',
+  'foo_3251',
+  'foo_3252',
+  'foo_3253',
+  'foo_3254',
+  'foo_3255',
+  'foo_3256',
+  'foo_3257',
+  'foo_3258',
+  'foo_3259',
+  'foo_3260',
+  'foo_3261',
+  'foo_3262',
+  'foo_3263',
+  'foo_3264',
+  'foo_3265',
+  'foo_3266',
+  'foo_3267',
+  'foo_3268',
+  'foo_3269',
+  'foo_3270',
+  'foo_3271',
+  'foo_3272',
+  'foo_3273',
+  'foo_3274',
+  'foo_3275',
+  'foo_3276',
+  'foo_3277',
+  'foo_3278',
+  'foo_3279',
+  'foo_3280',
+  'foo_3281',
+  'foo_3282',
+  'foo_3283',
+  'foo_3284',
+  'foo_3285',
+  'foo_3286',
+  'foo_3287',
+  'foo_3288',
+  'foo_3289',
+  'foo_3290',
+  'foo_3291',
+  'foo_3292',
+  'foo_3293',
+  'foo_3294',
+  'foo_3295',
+  'foo_3296',
+  'foo_3297',
+  'foo_3298',
+  'foo_3299',
+  'foo_3300',
+  'foo_3301',
+  'foo_3302',
+  'foo_3303',
+  'foo_3304',
+  'foo_3305',
+  'foo_3306',
+  'foo_3307',
+  'foo_3308',
+  'foo_3309',
+  'foo_3310',
+  'foo_3311',
+  'foo_3312',
+  'foo_3313',
+  'foo_3314',
+  'foo_3315',
+  'foo_3316',
+  'foo_3317',
+  'foo_3318',
+  'foo_3319',
+  'foo_3320',
+  'foo_3321',
+  'foo_3322',
+  'foo_3323',
+  'foo_3324',
+  'foo_3325',
+  'foo_3326',
+  'foo_3327',
+  'foo_3328',
+  'foo_3329',
+  'foo_3330',
+  'foo_3331',
+  'foo_3332',
+  'foo_3333',
+  'foo_3334',
+  'foo_3335',
+  'foo_3336',
+  'foo_3337',
+  'foo_3338',
+  'foo_3339',
+  'foo_3340',
+  'foo_3341',
+  'foo_3342',
+  'foo_3343',
+  'foo_3344',
+  'foo_3345',
+  'foo_3346',
+  'foo_3347',
+  'foo_3348',
+  'foo_3349',
+  'foo_3350',
+  'foo_3351',
+  'foo_3352',
+  'foo_3353',
+  'foo_3354',
+  'foo_3355',
+  'foo_3356',
+  'foo_3357',
+  'foo_3358',
+  'foo_3359',
+  'foo_3360',
+  'foo_3361',
+  'foo_3362',
+  'foo_3363',
+  'foo_3364',
+  'foo_3365',
+  'foo_3366',
+  'foo_3367',
+  'foo_3368',
+  'foo_3369',
+  'foo_3370',
+  'foo_3371',
+  'foo_3372',
+  'foo_3373',
+  'foo_3374',
+  'foo_3375',
+  'foo_3376',
+  'foo_3377',
+  'foo_3378',
+  'foo_3379',
+  'foo_3380',
+  'foo_3381',
+  'foo_3382',
+  'foo_3383',
+  'foo_3384',
+  'foo_3385',
+  'foo_3386',
+  'foo_3387',
+  'foo_3388',
+  'foo_3389',
+  'foo_3390',
+  'foo_3391',
+  'foo_3392',
+  'foo_3393',
+  'foo_3394',
+  'foo_3395',
+  'foo_3396',
+  'foo_3397',
+  'foo_3398',
+  'foo_3399',
+  'foo_3400',
+  'foo_3401',
+  'foo_3402',
+  'foo_3403',
+  'foo_3404',
+  'foo_3405',
+  'foo_3406',
+  'foo_3407',
+  'foo_3408',
+  'foo_3409',
+  'foo_3410',
+  'foo_3411',
+  'foo_3412',
+  'foo_3413',
+  'foo_3414',
+  'foo_3415',
+  'foo_3416',
+  'foo_3417',
+  'foo_3418',
+  'foo_3419',
+  'foo_3420',
+  'foo_3421',
+  'foo_3422',
+  'foo_3423',
+  'foo_3424',
+  'foo_3425',
+  'foo_3426',
+  'foo_3427',
+  'foo_3428',
+  'foo_3429',
+  'foo_3430',
+  'foo_3431',
+  'foo_3432',
+  'foo_3433',
+  'foo_3434',
+  'foo_3435',
+  'foo_3436',
+  'foo_3437',
+  'foo_3438',
+  'foo_3439',
+  'foo_3440',
+  'foo_3441',
+  'foo_3442',
+  'foo_3443',
+  'foo_3444',
+  'foo_3445',
+  'foo_3446',
+  'foo_3447',
+  'foo_3448',
+  'foo_3449',
+  'foo_3450',
+  'foo_3451',
+  'foo_3452',
+  'foo_3453',
+  'foo_3454',
+  'foo_3455',
+  'foo_3456',
+  'foo_3457',
+  'foo_3458',
+  'foo_3459',
+  'foo_3460',
+  'foo_3461',
+  'foo_3462',
+  'foo_3463',
+  'foo_3464',
+  'foo_3465',
+  'foo_3466',
+  'foo_3467',
+  'foo_3468',
+  'foo_3469',
+  'foo_3470',
+  'foo_3471',
+  'foo_3472',
+  'foo_3473',
+  'foo_3474',
+  'foo_3475',
+  'foo_3476',
+  'foo_3477',
+  'foo_3478',
+  'foo_3479',
+  'foo_3480',
+  'foo_3481',
+  'foo_3482',
+  'foo_3483',
+  'foo_3484',
+  'foo_3485',
+  'foo_3486',
+  'foo_3487',
+  'foo_3488',
+  'foo_3489',
+  'foo_3490',
+  'foo_3491',
+  'foo_3492',
+  'foo_3493',
+  'foo_3494',
+  'foo_3495',
+  'foo_3496',
+  'foo_3497',
+  'foo_3498',
+  'foo_3499',
+  'foo_3500',
+  'foo_3501',
+  'foo_3502',
+  'foo_3503',
+  'foo_3504',
+  'foo_3505',
+  'foo_3506',
+  'foo_3507',
+  'foo_3508',
+  'foo_3509',
+  'foo_3510',
+  'foo_3511',
+  'foo_3512',
+  'foo_3513',
+  'foo_3514',
+  'foo_3515',
+  'foo_3516',
+  'foo_3517',
+  'foo_3518',
+  'foo_3519',
+  'foo_3520',
+  'foo_3521',
+  'foo_3522',
+  'foo_3523',
+  'foo_3524',
+  'foo_3525',
+  'foo_3526',
+  'foo_3527',
+  'foo_3528',
+  'foo_3529',
+  'foo_3530',
+  'foo_3531',
+  'foo_3532',
+  'foo_3533',
+  'foo_3534',
+  'foo_3535',
+  'foo_3536',
+  'foo_3537',
+  'foo_3538',
+  'foo_3539',
+  'foo_3540',
+  'foo_3541',
+  'foo_3542',
+  'foo_3543',
+  'foo_3544',
+  'foo_3545',
+  'foo_3546',
+  'foo_3547',
+  'foo_3548',
+  'foo_3549',
+  'foo_3550',
+  'foo_3551',
+  'foo_3552',
+  'foo_3553',
+  'foo_3554',
+  'foo_3555',
+  'foo_3556',
+  'foo_3557',
+  'foo_3558',
+  'foo_3559',
+  'foo_3560',
+  'foo_3561',
+  'foo_3562',
+  'foo_3563',
+  'foo_3564',
+  'foo_3565',
+  'foo_3566',
+  'foo_3567',
+  'foo_3568',
+  'foo_3569',
+  'foo_3570',
+  'foo_3571',
+  'foo_3572',
+  'foo_3573',
+  'foo_3574',
+  'foo_3575',
+  'foo_3576',
+  'foo_3577',
+  'foo_3578',
+  'foo_3579',
+  'foo_3580',
+  'foo_3581',
+  'foo_3582',
+  'foo_3583',
+  'foo_3584',
+  'foo_3585',
+  'foo_3586',
+  'foo_3587',
+  'foo_3588',
+  'foo_3589',
+  'foo_3590',
+  'foo_3591',
+  'foo_3592',
+  'foo_3593',
+  'foo_3594',
+  'foo_3595',
+  'foo_3596',
+  'foo_3597',
+  'foo_3598',
+  'foo_3599',
+  'foo_3600',
+  'foo_3601',
+  'foo_3602',
+  'foo_3603',
+  'foo_3604',
+  'foo_3605',
+  'foo_3606',
+  'foo_3607',
+  'foo_3608',
+  'foo_3609',
+  'foo_3610',
+  'foo_3611',
+  'foo_3612',
+  'foo_3613',
+  'foo_3614',
+  'foo_3615',
+  'foo_3616',
+  'foo_3617',
+  'foo_3618',
+  'foo_3619',
+  'foo_3620',
+  'foo_3621',
+  'foo_3622',
+  'foo_3623',
+  'foo_3624',
+  'foo_3625',
+  'foo_3626',
+  'foo_3627',
+  'foo_3628',
+  'foo_3629',
+  'foo_3630',
+  'foo_3631',
+  'foo_3632',
+  'foo_3633',
+  'foo_3634',
+  'foo_3635',
+  'foo_3636',
+  'foo_3637',
+  'foo_3638',
+  'foo_3639',
+  'foo_3640',
+  'foo_3641',
+  'foo_3642',
+  'foo_3643',
+  'foo_3644',
+  'foo_3645',
+  'foo_3646',
+  'foo_3647',
+  'foo_3648',
+  'foo_3649',
+  'foo_3650',
+  'foo_3651',
+  'foo_3652',
+  'foo_3653',
+  'foo_3654',
+  'foo_3655',
+  'foo_3656',
+  'foo_3657',
+  'foo_3658',
+  'foo_3659',
+  'foo_3660',
+  'foo_3661',
+  'foo_3662',
+  'foo_3663',
+  'foo_3664',
+  'foo_3665',
+  'foo_3666',
+  'foo_3667',
+  'foo_3668',
+  'foo_3669',
+  'foo_3670',
+  'foo_3671',
+  'foo_3672',
+  'foo_3673',
+  'foo_3674',
+  'foo_3675',
+  'foo_3676',
+  'foo_3677',
+  'foo_3678',
+  'foo_3679',
+  'foo_3680',
+  'foo_3681',
+  'foo_3682',
+  'foo_3683',
+  'foo_3684',
+  'foo_3685',
+  'foo_3686',
+  'foo_3687',
+  'foo_3688',
+  'foo_3689',
+  'foo_3690',
+  'foo_3691',
+  'foo_3692',
+  'foo_3693',
+  'foo_3694',
+  'foo_3695',
+  'foo_3696',
+  'foo_3697',
+  'foo_3698',
+  'foo_3699',
+  'foo_3700',
+  'foo_3701',
+  'foo_3702',
+  'foo_3703',
+  'foo_3704',
+  'foo_3705',
+  'foo_3706',
+  'foo_3707',
+  'foo_3708',
+  'foo_3709',
+  'foo_3710',
+  'foo_3711',
+  'foo_3712',
+  'foo_3713',
+  'foo_3714',
+  'foo_3715',
+  'foo_3716',
+  'foo_3717',
+  'foo_3718',
+  'foo_3719',
+  'foo_3720',
+  'foo_3721',
+  'foo_3722',
+  'foo_3723',
+  'foo_3724',
+  'foo_3725',
+  'foo_3726',
+  'foo_3727',
+  'foo_3728',
+  'foo_3729',
+  'foo_3730',
+  'foo_3731',
+  'foo_3732',
+  'foo_3733',
+  'foo_3734',
+  'foo_3735',
+  'foo_3736',
+  'foo_3737',
+  'foo_3738',
+  'foo_3739',
+  'foo_3740',
+  'foo_3741',
+  'foo_3742',
+  'foo_3743',
+  'foo_3744',
+  'foo_3745',
+  'foo_3746',
+  'foo_3747',
+  'foo_3748',
+  'foo_3749',
+  'foo_3750',
+  'foo_3751',
+  'foo_3752',
+  'foo_3753',
+  'foo_3754',
+  'foo_3755',
+  'foo_3756',
+  'foo_3757',
+  'foo_3758',
+  'foo_3759',
+  'foo_3760',
+  'foo_3761',
+  'foo_3762',
+  'foo_3763',
+  'foo_3764',
+  'foo_3765',
+  'foo_3766',
+  'foo_3767',
+  'foo_3768',
+  'foo_3769',
+  'foo_3770',
+  'foo_3771',
+  'foo_3772',
+  'foo_3773',
+  'foo_3774',
+  'foo_3775',
+  'foo_3776',
+  'foo_3777',
+  'foo_3778',
+  'foo_3779',
+  'foo_3780',
+  'foo_3781',
+  'foo_3782',
+  'foo_3783',
+  'foo_3784',
+  'foo_3785',
+  'foo_3786',
+  'foo_3787',
+  'foo_3788',
+  'foo_3789',
+  'foo_3790',
+  'foo_3791',
+  'foo_3792',
+  'foo_3793',
+  'foo_3794',
+  'foo_3795',
+  'foo_3796',
+  'foo_3797',
+  'foo_3798',
+  'foo_3799',
+  'foo_3800',
+  'foo_3801',
+  'foo_3802',
+  'foo_3803',
+  'foo_3804',
+  'foo_3805',
+  'foo_3806',
+  'foo_3807',
+  'foo_3808',
+  'foo_3809',
+  'foo_3810',
+  'foo_3811',
+  'foo_3812',
+  'foo_3813',
+  'foo_3814',
+  'foo_3815',
+  'foo_3816',
+  'foo_3817',
+  'foo_3818',
+  'foo_3819',
+  'foo_3820',
+  'foo_3821',
+  'foo_3822',
+  'foo_3823',
+  'foo_3824',
+  'foo_3825',
+  'foo_3826',
+  'foo_3827',
+  'foo_3828',
+  'foo_3829',
+  'foo_3830',
+  'foo_3831',
+  'foo_3832',
+  'foo_3833',
+  'foo_3834',
+  'foo_3835',
+  'foo_3836',
+  'foo_3837',
+  'foo_3838',
+  'foo_3839',
+  'foo_3840',
+  'foo_3841',
+  'foo_3842',
+  'foo_3843',
+  'foo_3844',
+  'foo_3845',
+  'foo_3846',
+  'foo_3847',
+  'foo_3848',
+  'foo_3849',
+  'foo_3850',
+  'foo_3851',
+  'foo_3852',
+  'foo_3853',
+  'foo_3854',
+  'foo_3855',
+  'foo_3856',
+  'foo_3857',
+  'foo_3858',
+  'foo_3859',
+  'foo_3860',
+  'foo_3861',
+  'foo_3862',
+  'foo_3863',
+  'foo_3864',
+  'foo_3865',
+  'foo_3866',
+  'foo_3867',
+  'foo_3868',
+  'foo_3869',
+  'foo_3870',
+  'foo_3871',
+  'foo_3872',
+  'foo_3873',
+  'foo_3874',
+  'foo_3875',
+  'foo_3876',
+  'foo_3877',
+  'foo_3878',
+  'foo_3879',
+  'foo_3880',
+  'foo_3881',
+  'foo_3882',
+  'foo_3883',
+  'foo_3884',
+  'foo_3885',
+  'foo_3886',
+  'foo_3887',
+  'foo_3888',
+  'foo_3889',
+  'foo_3890',
+  'foo_3891',
+  'foo_3892',
+  'foo_3893',
+  'foo_3894',
+  'foo_3895',
+  'foo_3896',
+  'foo_3897',
+  'foo_3898',
+  'foo_3899',
+  'foo_3900',
+  'foo_3901',
+  'foo_3902',
+  'foo_3903',
+  'foo_3904',
+  'foo_3905',
+  'foo_3906',
+  'foo_3907',
+  'foo_3908',
+  'foo_3909',
+  'foo_3910',
+  'foo_3911',
+  'foo_3912',
+  'foo_3913',
+  'foo_3914',
+  'foo_3915',
+  'foo_3916',
+  'foo_3917',
+  'foo_3918',
+  'foo_3919',
+  'foo_3920',
+  'foo_3921',
+  'foo_3922',
+  'foo_3923',
+  'foo_3924',
+  'foo_3925',
+  'foo_3926',
+  'foo_3927',
+  'foo_3928',
+  'foo_3929',
+  'foo_3930',
+  'foo_3931',
+  'foo_3932',
+  'foo_3933',
+  'foo_3934',
+  'foo_3935',
+  'foo_3936',
+  'foo_3937',
+  'foo_3938',
+  'foo_3939',
+  'foo_3940',
+  'foo_3941',
+  'foo_3942',
+  'foo_3943',
+  'foo_3944',
+  'foo_3945',
+  'foo_3946',
+  'foo_3947',
+  'foo_3948',
+  'foo_3949',
+  'foo_3950',
+  'foo_3951',
+  'foo_3952',
+  'foo_3953',
+  'foo_3954',
+  'foo_3955',
+  'foo_3956',
+  'foo_3957',
+  'foo_3958',
+  'foo_3959',
+  'foo_3960',
+  'foo_3961',
+  'foo_3962',
+  'foo_3963',
+  'foo_3964',
+  'foo_3965',
+  'foo_3966',
+  'foo_3967',
+  'foo_3968',
+  'foo_3969',
+  'foo_3970',
+  'foo_3971',
+  'foo_3972',
+  'foo_3973',
+  'foo_3974',
+  'foo_3975',
+  'foo_3976',
+  'foo_3977',
+  'foo_3978',
+  'foo_3979',
+  'foo_3980',
+  'foo_3981',
+  'foo_3982',
+  'foo_3983',
+  'foo_3984',
+  'foo_3985',
+  'foo_3986',
+  'foo_3987',
+  'foo_3988',
+  'foo_3989',
+  'foo_3990',
+  'foo_3991',
+  'foo_3992',
+  'foo_3993',
+  'foo_3994',
+  'foo_3995',
+  'foo_3996',
+  'foo_3997',
+  'foo_3998',
+  'foo_3999',
+  'foo_4000',
+  'foo_4001',
+  'foo_4002',
+  'foo_4003',
+  'foo_4004',
+  'foo_4005',
+  'foo_4006',
+  'foo_4007',
+  'foo_4008',
+  'foo_4009',
+  'foo_4010',
+  'foo_4011',
+  'foo_4012',
+  'foo_4013',
+  'foo_4014',
+  'foo_4015',
+  'foo_4016',
+  'foo_4017',
+  'foo_4018',
+  'foo_4019',
+  'foo_4020',
+  'foo_4021',
+  'foo_4022',
+  'foo_4023',
+  'foo_4024',
+  'foo_4025',
+  'foo_4026',
+  'foo_4027',
+  'foo_4028',
+  'foo_4029',
+  'foo_4030',
+  'foo_4031',
+  'foo_4032',
+  'foo_4033',
+  'foo_4034',
+  'foo_4035',
+  'foo_4036',
+  'foo_4037',
+  'foo_4038',
+  'foo_4039',
+  'foo_4040',
+  'foo_4041',
+  'foo_4042',
+  'foo_4043',
+  'foo_4044',
+  'foo_4045',
+  'foo_4046',
+  'foo_4047',
+  'foo_4048',
+  'foo_4049',
+  'foo_4050',
+  'foo_4051',
+  'foo_4052',
+  'foo_4053',
+  'foo_4054',
+  'foo_4055',
+  'foo_4056',
+  'foo_4057',
+  'foo_4058',
+  'foo_4059',
+  'foo_4060',
+  'foo_4061',
+  'foo_4062',
+  'foo_4063',
+  'foo_4064',
+  'foo_4065',
+  'foo_4066',
+  'foo_4067',
+  'foo_4068',
+  'foo_4069',
+  'foo_4070',
+  'foo_4071',
+  'foo_4072',
+  'foo_4073',
+  'foo_4074',
+  'foo_4075',
+  'foo_4076',
+  'foo_4077',
+  'foo_4078',
+  'foo_4079',
+  'foo_4080',
+  'foo_4081',
+  'foo_4082',
+  'foo_4083',
+  'foo_4084',
+  'foo_4085',
+  'foo_4086',
+  'foo_4087',
+  'foo_4088',
+  'foo_4089',
+  'foo_4090',
+  'foo_4091',
+  'foo_4092',
+  'foo_4093',
+  'foo_4094',
+  'foo_4095',
+  'foo_4096',
+  'foo_4097',
+  'foo_4098',
+  'foo_4099',
+  'foo_4100',
+  'foo_4101',
+  'foo_4102',
+  'foo_4103',
+  'foo_4104',
+  'foo_4105',
+  'foo_4106',
+  'foo_4107',
+  'foo_4108',
+  'foo_4109',
+  'foo_4110',
+  'foo_4111',
+  'foo_4112',
+  'foo_4113',
+  'foo_4114',
+  'foo_4115',
+  'foo_4116',
+  'foo_4117',
+  'foo_4118',
+  'foo_4119',
+  'foo_4120',
+  'foo_4121',
+  'foo_4122',
+  'foo_4123',
+  'foo_4124',
+  'foo_4125',
+  'foo_4126',
+  'foo_4127',
+  'foo_4128',
+  'foo_4129',
+  'foo_4130',
+  'foo_4131',
+  'foo_4132',
+  'foo_4133',
+  'foo_4134',
+  'foo_4135',
+  'foo_4136',
+  'foo_4137',
+  'foo_4138',
+  'foo_4139',
+  'foo_4140',
+  'foo_4141',
+  'foo_4142',
+  'foo_4143',
+  'foo_4144',
+  'foo_4145',
+  'foo_4146',
+  'foo_4147',
+  'foo_4148',
+  'foo_4149',
+  'foo_4150',
+  'foo_4151',
+  'foo_4152',
+  'foo_4153',
+  'foo_4154',
+  'foo_4155',
+  'foo_4156',
+  'foo_4157',
+  'foo_4158',
+  'foo_4159',
+  'foo_4160',
+  'foo_4161',
+  'foo_4162',
+  'foo_4163',
+  'foo_4164',
+  'foo_4165',
+  'foo_4166',
+  'foo_4167',
+  'foo_4168',
+  'foo_4169',
+  'foo_4170',
+  'foo_4171',
+  'foo_4172',
+  'foo_4173',
+  'foo_4174',
+  'foo_4175',
+  'foo_4176',
+  'foo_4177',
+  'foo_4178',
+  'foo_4179',
+  'foo_4180',
+  'foo_4181',
+  'foo_4182',
+  'foo_4183',
+  'foo_4184',
+  'foo_4185',
+  'foo_4186',
+  'foo_4187',
+  'foo_4188',
+  'foo_4189',
+  'foo_4190',
+  'foo_4191',
+  'foo_4192',
+  'foo_4193',
+  'foo_4194',
+  'foo_4195',
+  'foo_4196',
+  'foo_4197',
+  'foo_4198',
+  'foo_4199',
+  'foo_4200',
+  'foo_4201',
+  'foo_4202',
+  'foo_4203',
+  'foo_4204',
+  'foo_4205',
+  'foo_4206',
+  'foo_4207',
+  'foo_4208',
+  'foo_4209',
+  'foo_4210',
+  'foo_4211',
+  'foo_4212',
+  'foo_4213',
+  'foo_4214',
+  'foo_4215',
+  'foo_4216',
+  'foo_4217',
+  'foo_4218',
+  'foo_4219',
+  'foo_4220',
+  'foo_4221',
+  'foo_4222',
+  'foo_4223',
+  'foo_4224',
+  'foo_4225',
+  'foo_4226',
+  'foo_4227',
+  'foo_4228',
+  'foo_4229',
+  'foo_4230',
+  'foo_4231',
+  'foo_4232',
+  'foo_4233',
+  'foo_4234',
+  'foo_4235',
+  'foo_4236',
+  'foo_4237',
+  'foo_4238',
+  'foo_4239',
+  'foo_4240',
+  'foo_4241',
+  'foo_4242',
+  'foo_4243',
+  'foo_4244',
+  'foo_4245',
+  'foo_4246',
+  'foo_4247',
+  'foo_4248',
+  'foo_4249',
+  'foo_4250',
+  'foo_4251',
+  'foo_4252',
+  'foo_4253',
+  'foo_4254',
+  'foo_4255',
+  'foo_4256',
+  'foo_4257',
+  'foo_4258',
+  'foo_4259',
+  'foo_4260',
+  'foo_4261',
+  'foo_4262',
+  'foo_4263',
+  'foo_4264',
+  'foo_4265',
+  'foo_4266',
+  'foo_4267',
+  'foo_4268',
+  'foo_4269',
+  'foo_4270',
+  'foo_4271',
+  'foo_4272',
+  'foo_4273',
+  'foo_4274',
+  'foo_4275',
+  'foo_4276',
+  'foo_4277',
+  'foo_4278',
+  'foo_4279',
+  'foo_4280',
+  'foo_4281',
+  'foo_4282',
+  'foo_4283',
+  'foo_4284',
+  'foo_4285',
+  'foo_4286',
+  'foo_4287',
+  'foo_4288',
+  'foo_4289',
+  'foo_4290',
+  'foo_4291',
+  'foo_4292',
+  'foo_4293',
+  'foo_4294',
+  'foo_4295',
+  'foo_4296',
+  'foo_4297',
+  'foo_4298',
+  'foo_4299',
+  'foo_4300',
+  'foo_4301',
+  'foo_4302',
+  'foo_4303',
+  'foo_4304',
+  'foo_4305',
+  'foo_4306',
+  'foo_4307',
+  'foo_4308',
+  'foo_4309',
+  'foo_4310',
+  'foo_4311',
+  'foo_4312',
+  'foo_4313',
+  'foo_4314',
+  'foo_4315',
+  'foo_4316',
+  'foo_4317',
+  'foo_4318',
+  'foo_4319',
+  'foo_4320',
+  'foo_4321',
+  'foo_4322',
+  'foo_4323',
+  'foo_4324',
+  'foo_4325',
+  'foo_4326',
+  'foo_4327',
+  'foo_4328',
+  'foo_4329',
+  'foo_4330',
+  'foo_4331',
+  'foo_4332',
+  'foo_4333',
+  'foo_4334',
+  'foo_4335',
+  'foo_4336',
+  'foo_4337',
+  'foo_4338',
+  'foo_4339',
+  'foo_4340',
+  'foo_4341',
+  'foo_4342',
+  'foo_4343',
+  'foo_4344',
+  'foo_4345',
+  'foo_4346',
+  'foo_4347',
+  'foo_4348',
+  'foo_4349',
+  'foo_4350',
+  'foo_4351',
+  'foo_4352',
+  'foo_4353',
+  'foo_4354',
+  'foo_4355',
+  'foo_4356',
+  'foo_4357',
+  'foo_4358',
+  'foo_4359',
+  'foo_4360',
+  'foo_4361',
+  'foo_4362',
+  'foo_4363',
+  'foo_4364',
+  'foo_4365',
+  'foo_4366',
+  'foo_4367',
+  'foo_4368',
+  'foo_4369',
+  'foo_4370',
+  'foo_4371',
+  'foo_4372',
+  'foo_4373',
+  'foo_4374',
+  'foo_4375',
+  'foo_4376',
+  'foo_4377',
+  'foo_4378',
+  'foo_4379',
+  'foo_4380',
+  'foo_4381',
+  'foo_4382',
+  'foo_4383',
+  'foo_4384',
+  'foo_4385',
+  'foo_4386',
+  'foo_4387',
+  'foo_4388',
+  'foo_4389',
+  'foo_4390',
+  'foo_4391',
+  'foo_4392',
+  'foo_4393',
+  'foo_4394',
+  'foo_4395',
+  'foo_4396',
+  'foo_4397',
+  'foo_4398',
+  'foo_4399',
+  'foo_4400',
+  'foo_4401',
+  'foo_4402',
+  'foo_4403',
+  'foo_4404',
+  'foo_4405',
+  'foo_4406',
+  'foo_4407',
+  'foo_4408',
+  'foo_4409',
+  'foo_4410',
+  'foo_4411',
+  'foo_4412',
+  'foo_4413',
+  'foo_4414',
+  'foo_4415',
+  'foo_4416',
+  'foo_4417',
+  'foo_4418',
+  'foo_4419',
+  'foo_4420',
+  'foo_4421',
+  'foo_4422',
+  'foo_4423',
+  'foo_4424',
+  'foo_4425',
+  'foo_4426',
+  'foo_4427',
+  'foo_4428',
+  'foo_4429',
+  'foo_4430',
+  'foo_4431',
+  'foo_4432',
+  'foo_4433',
+  'foo_4434',
+  'foo_4435',
+  'foo_4436',
+  'foo_4437',
+  'foo_4438',
+  'foo_4439',
+  'foo_4440',
+  'foo_4441',
+  'foo_4442',
+  'foo_4443',
+  'foo_4444',
+  'foo_4445',
+  'foo_4446',
+  'foo_4447',
+  'foo_4448',
+  'foo_4449',
+  'foo_4450',
+  'foo_4451',
+  'foo_4452',
+  'foo_4453',
+  'foo_4454',
+  'foo_4455',
+  'foo_4456',
+  'foo_4457',
+  'foo_4458',
+  'foo_4459',
+  'foo_4460',
+  'foo_4461',
+  'foo_4462',
+  'foo_4463',
+  'foo_4464',
+  'foo_4465',
+  'foo_4466',
+  'foo_4467',
+  'foo_4468',
+  'foo_4469',
+  'foo_4470',
+  'foo_4471',
+  'foo_4472',
+  'foo_4473',
+  'foo_4474',
+  'foo_4475',
+  'foo_4476',
+  'foo_4477',
+  'foo_4478',
+  'foo_4479',
+  'foo_4480',
+  'foo_4481',
+  'foo_4482',
+  'foo_4483',
+  'foo_4484',
+  'foo_4485',
+  'foo_4486',
+  'foo_4487',
+  'foo_4488',
+  'foo_4489',
+  'foo_4490',
+  'foo_4491',
+  'foo_4492',
+  'foo_4493',
+  'foo_4494',
+  'foo_4495',
+  'foo_4496',
+  'foo_4497',
+  'foo_4498',
+  'foo_4499',
+  'foo_4500',
+  'foo_4501',
+  'foo_4502',
+  'foo_4503',
+  'foo_4504',
+  'foo_4505',
+  'foo_4506',
+  'foo_4507',
+  'foo_4508',
+  'foo_4509',
+  'foo_4510',
+  'foo_4511',
+  'foo_4512',
+  'foo_4513',
+  'foo_4514',
+  'foo_4515',
+  'foo_4516',
+  'foo_4517',
+  'foo_4518',
+  'foo_4519',
+  'foo_4520',
+  'foo_4521',
+  'foo_4522',
+  'foo_4523',
+  'foo_4524',
+  'foo_4525',
+  'foo_4526',
+  'foo_4527',
+  'foo_4528',
+  'foo_4529',
+  'foo_4530',
+  'foo_4531',
+  'foo_4532',
+  'foo_4533',
+  'foo_4534',
+  'foo_4535',
+  'foo_4536',
+  'foo_4537',
+  'foo_4538',
+  'foo_4539',
+  'foo_4540',
+  'foo_4541',
+  'foo_4542',
+  'foo_4543',
+  'foo_4544',
+  'foo_4545',
+  'foo_4546',
+  'foo_4547',
+  'foo_4548',
+  'foo_4549',
+  'foo_4550',
+  'foo_4551',
+  'foo_4552',
+  'foo_4553',
+  'foo_4554',
+  'foo_4555',
+  'foo_4556',
+  'foo_4557',
+  'foo_4558',
+  'foo_4559',
+  'foo_4560',
+  'foo_4561',
+  'foo_4562',
+  'foo_4563',
+  'foo_4564',
+  'foo_4565',
+  'foo_4566',
+  'foo_4567',
+  'foo_4568',
+  'foo_4569',
+  'foo_4570',
+  'foo_4571',
+  'foo_4572',
+  'foo_4573',
+  'foo_4574',
+  'foo_4575',
+  'foo_4576',
+  'foo_4577',
+  'foo_4578',
+  'foo_4579',
+  'foo_4580',
+  'foo_4581',
+  'foo_4582',
+  'foo_4583',
+  'foo_4584',
+  'foo_4585',
+  'foo_4586',
+  'foo_4587',
+  'foo_4588',
+  'foo_4589',
+  'foo_4590',
+  'foo_4591',
+  'foo_4592',
+  'foo_4593',
+  'foo_4594',
+  'foo_4595',
+  'foo_4596',
+  'foo_4597',
+  'foo_4598',
+  'foo_4599',
+  'foo_4600',
+  'foo_4601',
+  'foo_4602',
+  'foo_4603',
+  'foo_4604',
+  'foo_4605',
+  'foo_4606',
+  'foo_4607',
+  'foo_4608',
+  'foo_4609',
+  'foo_4610',
+  'foo_4611',
+  'foo_4612',
+  'foo_4613',
+  'foo_4614',
+  'foo_4615',
+  'foo_4616',
+  'foo_4617',
+  'foo_4618',
+  'foo_4619',
+  'foo_4620',
+  'foo_4621',
+  'foo_4622',
+  'foo_4623',
+  'foo_4624',
+  'foo_4625',
+  'foo_4626',
+  'foo_4627',
+  'foo_4628',
+  'foo_4629',
+  'foo_4630',
+  'foo_4631',
+  'foo_4632',
+  'foo_4633',
+  'foo_4634',
+  'foo_4635',
+  'foo_4636',
+  'foo_4637',
+  'foo_4638',
+  'foo_4639',
+  'foo_4640',
+  'foo_4641',
+  'foo_4642',
+  'foo_4643',
+  'foo_4644',
+  'foo_4645',
+  'foo_4646',
+  'foo_4647',
+  'foo_4648',
+  'foo_4649',
+  'foo_4650',
+  'foo_4651',
+  'foo_4652',
+  'foo_4653',
+  'foo_4654',
+  'foo_4655',
+  'foo_4656',
+  'foo_4657',
+  'foo_4658',
+  'foo_4659',
+  'foo_4660',
+  'foo_4661',
+  'foo_4662',
+  'foo_4663',
+  'foo_4664',
+  'foo_4665',
+  'foo_4666',
+  'foo_4667',
+  'foo_4668',
+  'foo_4669',
+  'foo_4670',
+  'foo_4671',
+  'foo_4672',
+  'foo_4673',
+  'foo_4674',
+  'foo_4675',
+  'foo_4676',
+  'foo_4677',
+  'foo_4678',
+  'foo_4679',
+  'foo_4680',
+  'foo_4681',
+  'foo_4682',
+  'foo_4683',
+  'foo_4684',
+  'foo_4685',
+  'foo_4686',
+  'foo_4687',
+  'foo_4688',
+  'foo_4689',
+  'foo_4690',
+  'foo_4691',
+  'foo_4692',
+  'foo_4693',
+  'foo_4694',
+  'foo_4695',
+  'foo_4696',
+  'foo_4697',
+  'foo_4698',
+  'foo_4699',
+  'foo_4700',
+  'foo_4701',
+  'foo_4702',
+  'foo_4703',
+  'foo_4704',
+  'foo_4705',
+  'foo_4706',
+  'foo_4707',
+  'foo_4708',
+  'foo_4709',
+  'foo_4710',
+  'foo_4711',
+  'foo_4712',
+  'foo_4713',
+  'foo_4714',
+  'foo_4715',
+  'foo_4716',
+  'foo_4717',
+  'foo_4718',
+  'foo_4719',
+  'foo_4720',
+  'foo_4721',
+  'foo_4722',
+  'foo_4723',
+  'foo_4724',
+  'foo_4725',
+  'foo_4726',
+  'foo_4727',
+  'foo_4728',
+  'foo_4729',
+  'foo_4730',
+  'foo_4731',
+  'foo_4732',
+  'foo_4733',
+  'foo_4734',
+  'foo_4735',
+  'foo_4736',
+  'foo_4737',
+  'foo_4738',
+  'foo_4739',
+  'foo_4740',
+  'foo_4741',
+  'foo_4742',
+  'foo_4743',
+  'foo_4744',
+  'foo_4745',
+  'foo_4746',
+  'foo_4747',
+  'foo_4748',
+  'foo_4749',
+  'foo_4750',
+  'foo_4751',
+  'foo_4752',
+  'foo_4753',
+  'foo_4754',
+  'foo_4755',
+  'foo_4756',
+  'foo_4757',
+  'foo_4758',
+  'foo_4759',
+  'foo_4760',
+  'foo_4761',
+  'foo_4762',
+  'foo_4763',
+  'foo_4764',
+  'foo_4765',
+  'foo_4766',
+  'foo_4767',
+  'foo_4768',
+  'foo_4769',
+  'foo_4770',
+  'foo_4771',
+  'foo_4772',
+  'foo_4773',
+  'foo_4774',
+  'foo_4775',
+  'foo_4776',
+  'foo_4777',
+  'foo_4778',
+  'foo_4779',
+  'foo_4780',
+  'foo_4781',
+  'foo_4782',
+  'foo_4783',
+  'foo_4784',
+  'foo_4785',
+  'foo_4786',
+  'foo_4787',
+  'foo_4788',
+  'foo_4789',
+  'foo_4790',
+  'foo_4791',
+  'foo_4792',
+  'foo_4793',
+  'foo_4794',
+  'foo_4795',
+  'foo_4796',
+  'foo_4797',
+  'foo_4798',
+  'foo_4799',
+  'foo_4800',
+  'foo_4801',
+  'foo_4802',
+  'foo_4803',
+  'foo_4804',
+  'foo_4805',
+  'foo_4806',
+  'foo_4807',
+  'foo_4808',
+  'foo_4809',
+  'foo_4810',
+  'foo_4811',
+  'foo_4812',
+  'foo_4813',
+  'foo_4814',
+  'foo_4815',
+  'foo_4816',
+  'foo_4817',
+  'foo_4818',
+  'foo_4819',
+  'foo_4820',
+  'foo_4821',
+  'foo_4822',
+  'foo_4823',
+  'foo_4824',
+  'foo_4825',
+  'foo_4826',
+  'foo_4827',
+  'foo_4828',
+  'foo_4829',
+  'foo_4830',
+  'foo_4831',
+  'foo_4832',
+  'foo_4833',
+  'foo_4834',
+  'foo_4835',
+  'foo_4836',
+  'foo_4837',
+  'foo_4838',
+  'foo_4839',
+  'foo_4840',
+  'foo_4841',
+  'foo_4842',
+  'foo_4843',
+  'foo_4844',
+  'foo_4845',
+  'foo_4846',
+  'foo_4847',
+  'foo_4848',
+  'foo_4849',
+  'foo_4850',
+  'foo_4851',
+  'foo_4852',
+  'foo_4853',
+  'foo_4854',
+  'foo_4855',
+  'foo_4856',
+  'foo_4857',
+  'foo_4858',
+  'foo_4859',
+  'foo_4860',
+  'foo_4861',
+  'foo_4862',
+  'foo_4863',
+  'foo_4864',
+  'foo_4865',
+  'foo_4866',
+  'foo_4867',
+  'foo_4868',
+  'foo_4869',
+  'foo_4870',
+  'foo_4871',
+  'foo_4872',
+  'foo_4873',
+  'foo_4874',
+  'foo_4875',
+  'foo_4876',
+  'foo_4877',
+  'foo_4878',
+  'foo_4879',
+  'foo_4880',
+  'foo_4881',
+  'foo_4882',
+  'foo_4883',
+  'foo_4884',
+  'foo_4885',
+  'foo_4886',
+  'foo_4887',
+  'foo_4888',
+  'foo_4889',
+  'foo_4890',
+  'foo_4891',
+  'foo_4892',
+  'foo_4893',
+  'foo_4894',
+  'foo_4895',
+  'foo_4896',
+  'foo_4897',
+  'foo_4898',
+  'foo_4899',
+  'foo_4900',
+  'foo_4901',
+  'foo_4902',
+  'foo_4903',
+  'foo_4904',
+  'foo_4905',
+  'foo_4906',
+  'foo_4907',
+  'foo_4908',
+  'foo_4909',
+  'foo_4910',
+  'foo_4911',
+  'foo_4912',
+  'foo_4913',
+  'foo_4914',
+  'foo_4915',
+  'foo_4916',
+  'foo_4917',
+  'foo_4918',
+  'foo_4919',
+  'foo_4920',
+  'foo_4921',
+  'foo_4922',
+  'foo_4923',
+  'foo_4924',
+  'foo_4925',
+  'foo_4926',
+  'foo_4927',
+  'foo_4928',
+  'foo_4929',
+  'foo_4930',
+  'foo_4931',
+  'foo_4932',
+  'foo_4933',
+  'foo_4934',
+  'foo_4935',
+  'foo_4936',
+  'foo_4937',
+  'foo_4938',
+  'foo_4939',
+  'foo_4940',
+  'foo_4941',
+  'foo_4942',
+  'foo_4943',
+  'foo_4944',
+  'foo_4945',
+  'foo_4946',
+  'foo_4947',
+  'foo_4948',
+  'foo_4949',
+  'foo_4950',
+  'foo_4951',
+  'foo_4952',
+  'foo_4953',
+  'foo_4954',
+  'foo_4955',
+  'foo_4956',
+  'foo_4957',
+  'foo_4958',
+  'foo_4959',
+  'foo_4960',
+  'foo_4961',
+  'foo_4962',
+  'foo_4963',
+  'foo_4964',
+  'foo_4965',
+  'foo_4966',
+  'foo_4967',
+  'foo_4968',
+  'foo_4969',
+  'foo_4970',
+  'foo_4971',
+  'foo_4972',
+  'foo_4973',
+  'foo_4974',
+  'foo_4975',
+  'foo_4976',
+  'foo_4977',
+  'foo_4978',
+  'foo_4979',
+  'foo_4980',
+  'foo_4981',
+  'foo_4982',
+  'foo_4983',
+  'foo_4984',
+  'foo_4985',
+  'foo_4986',
+  'foo_4987',
+  'foo_4988',
+  'foo_4989',
+  'foo_4990',
+  'foo_4991',
+  'foo_4992',
+  'foo_4993',
+  'foo_4994',
+  'foo_4995',
+  'foo_4996',
+  'foo_4997',
+  'foo_4998',
+  'foo_4999',
+  'foo_5000',
+  'foo_5001',
+  'foo_5002',
+  'foo_5003',
+  'foo_5004',
+  'foo_5005',
+  'foo_5006',
+  'foo_5007',
+  'foo_5008',
+  'foo_5009',
+  'foo_5010',
+  'foo_5011',
+  'foo_5012',
+  'foo_5013',
+  'foo_5014',
+  'foo_5015',
+  'foo_5016',
+  'foo_5017',
+  'foo_5018',
+  'foo_5019',
+  'foo_5020',
+  'foo_5021',
+  'foo_5022',
+  'foo_5023',
+  'foo_5024',
+  'foo_5025',
+  'foo_5026',
+  'foo_5027',
+  'foo_5028',
+  'foo_5029',
+  'foo_5030',
+  'foo_5031',
+  'foo_5032',
+  'foo_5033',
+  'foo_5034',
+  'foo_5035',
+  'foo_5036',
+  'foo_5037',
+  'foo_5038',
+  'foo_5039',
+  'foo_5040',
+  'foo_5041',
+  'foo_5042',
+  'foo_5043',
+  'foo_5044',
+  'foo_5045',
+  'foo_5046',
+  'foo_5047',
+  'foo_5048',
+  'foo_5049',
+  'foo_5050',
+  'foo_5051',
+  'foo_5052',
+  'foo_5053',
+  'foo_5054',
+  'foo_5055',
+  'foo_5056',
+  'foo_5057',
+  'foo_5058',
+  'foo_5059',
+  'foo_5060',
+  'foo_5061',
+  'foo_5062',
+  'foo_5063',
+  'foo_5064',
+  'foo_5065',
+  'foo_5066',
+  'foo_5067',
+  'foo_5068',
+  'foo_5069',
+  'foo_5070',
+  'foo_5071',
+  'foo_5072',
+  'foo_5073',
+  'foo_5074',
+  'foo_5075',
+  'foo_5076',
+  'foo_5077',
+  'foo_5078',
+  'foo_5079',
+  'foo_5080',
+  'foo_5081',
+  'foo_5082',
+  'foo_5083',
+  'foo_5084',
+  'foo_5085',
+  'foo_5086',
+  'foo_5087',
+  'foo_5088',
+  'foo_5089',
+  'foo_5090',
+  'foo_5091',
+  'foo_5092',
+  'foo_5093',
+  'foo_5094',
+  'foo_5095',
+  'foo_5096',
+  'foo_5097',
+  'foo_5098',
+  'foo_5099',
+  'foo_5100',
+  'foo_5101',
+  'foo_5102',
+  'foo_5103',
+  'foo_5104',
+  'foo_5105',
+  'foo_5106',
+  'foo_5107',
+  'foo_5108',
+  'foo_5109',
+  'foo_5110',
+  'foo_5111',
+  'foo_5112',
+  'foo_5113',
+  'foo_5114',
+  'foo_5115',
+  'foo_5116',
+  'foo_5117',
+  'foo_5118',
+  'foo_5119',
+  'foo_5120',
+  'foo_5121',
+  'foo_5122',
+  'foo_5123',
+  'foo_5124',
+  'foo_5125',
+  'foo_5126',
+  'foo_5127',
+  'foo_5128',
+  'foo_5129',
+  'foo_5130',
+  'foo_5131',
+  'foo_5132',
+  'foo_5133',
+  'foo_5134',
+  'foo_5135',
+  'foo_5136',
+  'foo_5137',
+  'foo_5138',
+  'foo_5139',
+  'foo_5140',
+  'foo_5141',
+  'foo_5142',
+  'foo_5143',
+  'foo_5144',
+  'foo_5145',
+  'foo_5146',
+  'foo_5147',
+  'foo_5148',
+  'foo_5149',
+  'foo_5150',
+  'foo_5151',
+  'foo_5152',
+  'foo_5153',
+  'foo_5154',
+  'foo_5155',
+  'foo_5156',
+  'foo_5157',
+  'foo_5158',
+  'foo_5159',
+  'foo_5160',
+  'foo_5161',
+  'foo_5162',
+  'foo_5163',
+  'foo_5164',
+  'foo_5165',
+  'foo_5166',
+  'foo_5167',
+  'foo_5168',
+  'foo_5169',
+  'foo_5170',
+  'foo_5171',
+  'foo_5172',
+  'foo_5173',
+  'foo_5174',
+  'foo_5175',
+  'foo_5176',
+  'foo_5177',
+  'foo_5178',
+  'foo_5179',
+  'foo_5180',
+  'foo_5181',
+  'foo_5182',
+  'foo_5183',
+  'foo_5184',
+  'foo_5185',
+  'foo_5186',
+  'foo_5187',
+  'foo_5188',
+  'foo_5189',
+  'foo_5190',
+  'foo_5191',
+  'foo_5192',
+  'foo_5193',
+  'foo_5194',
+  'foo_5195',
+  'foo_5196',
+  'foo_5197',
+  'foo_5198',
+  'foo_5199',
+  'foo_5200',
+  'foo_5201',
+  'foo_5202',
+  'foo_5203',
+  'foo_5204',
+  'foo_5205',
+  'foo_5206',
+  'foo_5207',
+  'foo_5208',
+  'foo_5209',
+  'foo_5210',
+  'foo_5211',
+  'foo_5212',
+  'foo_5213',
+  'foo_5214',
+  'foo_5215',
+  'foo_5216',
+  'foo_5217',
+  'foo_5218',
+  'foo_5219',
+  'foo_5220',
+  'foo_5221',
+  'foo_5222',
+  'foo_5223',
+  'foo_5224',
+  'foo_5225',
+  'foo_5226',
+  'foo_5227',
+  'foo_5228',
+  'foo_5229',
+  'foo_5230',
+  'foo_5231',
+  'foo_5232',
+  'foo_5233',
+  'foo_5234',
+  'foo_5235',
+  'foo_5236',
+  'foo_5237',
+  'foo_5238',
+  'foo_5239',
+  'foo_5240',
+  'foo_5241',
+  'foo_5242',
+  'foo_5243',
+  'foo_5244',
+  'foo_5245',
+  'foo_5246',
+  'foo_5247',
+  'foo_5248',
+  'foo_5249',
+  'foo_5250',
+  'foo_5251',
+  'foo_5252',
+  'foo_5253',
+  'foo_5254',
+  'foo_5255',
+  'foo_5256',
+  'foo_5257',
+  'foo_5258',
+  'foo_5259',
+  'foo_5260',
+  'foo_5261',
+  'foo_5262',
+  'foo_5263',
+  'foo_5264',
+  'foo_5265',
+  'foo_5266',
+  'foo_5267',
+  'foo_5268',
+  'foo_5269',
+  'foo_5270',
+  'foo_5271',
+  'foo_5272',
+  'foo_5273',
+  'foo_5274',
+  'foo_5275',
+  'foo_5276',
+  'foo_5277',
+  'foo_5278',
+  'foo_5279',
+  'foo_5280',
+  'foo_5281',
+  'foo_5282',
+  'foo_5283',
+  'foo_5284',
+  'foo_5285',
+  'foo_5286',
+  'foo_5287',
+  'foo_5288',
+  'foo_5289',
+  'foo_5290',
+  'foo_5291',
+  'foo_5292',
+  'foo_5293',
+  'foo_5294',
+  'foo_5295',
+  'foo_5296',
+  'foo_5297',
+  'foo_5298',
+  'foo_5299',
+  'foo_5300',
+  'foo_5301',
+  'foo_5302',
+  'foo_5303',
+  'foo_5304',
+  'foo_5305',
+  'foo_5306',
+  'foo_5307',
+  'foo_5308',
+  'foo_5309',
+  'foo_5310',
+  'foo_5311',
+  'foo_5312',
+  'foo_5313',
+  'foo_5314',
+  'foo_5315',
+  'foo_5316',
+  'foo_5317',
+  'foo_5318',
+  'foo_5319',
+  'foo_5320',
+  'foo_5321',
+  'foo_5322',
+  'foo_5323',
+  'foo_5324',
+  'foo_5325',
+  'foo_5326',
+  'foo_5327',
+  'foo_5328',
+  'foo_5329',
+  'foo_5330',
+  'foo_5331',
+  'foo_5332',
+  'foo_5333',
+  'foo_5334',
+  'foo_5335',
+  'foo_5336',
+  'foo_5337',
+  'foo_5338',
+  'foo_5339',
+  'foo_5340',
+  'foo_5341',
+  'foo_5342',
+  'foo_5343',
+  'foo_5344',
+  'foo_5345',
+  'foo_5346',
+  'foo_5347',
+  'foo_5348',
+  'foo_5349',
+  'foo_5350',
+  'foo_5351',
+  'foo_5352',
+  'foo_5353',
+  'foo_5354',
+  'foo_5355',
+  'foo_5356',
+  'foo_5357',
+  'foo_5358',
+  'foo_5359',
+  'foo_5360',
+  'foo_5361',
+  'foo_5362',
+  'foo_5363',
+  'foo_5364',
+  'foo_5365',
+  'foo_5366',
+  'foo_5367',
+  'foo_5368',
+  'foo_5369',
+  'foo_5370',
+  'foo_5371',
+  'foo_5372',
+  'foo_5373',
+  'foo_5374',
+  'foo_5375',
+  'foo_5376',
+  'foo_5377',
+  'foo_5378',
+  'foo_5379',
+  'foo_5380',
+  'foo_5381',
+  'foo_5382',
+  'foo_5383',
+  'foo_5384',
+  'foo_5385',
+  'foo_5386',
+  'foo_5387',
+  'foo_5388',
+  'foo_5389',
+  'foo_5390',
+  'foo_5391',
+  'foo_5392',
+  'foo_5393',
+  'foo_5394',
+  'foo_5395',
+  'foo_5396',
+  'foo_5397',
+  'foo_5398',
+  'foo_5399',
+  'foo_5400',
+  'foo_5401',
+  'foo_5402',
+  'foo_5403',
+  'foo_5404',
+  'foo_5405',
+  'foo_5406',
+  'foo_5407',
+  'foo_5408',
+  'foo_5409',
+  'foo_5410',
+  'foo_5411',
+  'foo_5412',
+  'foo_5413',
+  'foo_5414',
+  'foo_5415',
+  'foo_5416',
+  'foo_5417',
+  'foo_5418',
+  'foo_5419',
+  'foo_5420',
+  'foo_5421',
+  'foo_5422',
+  'foo_5423',
+  'foo_5424',
+  'foo_5425',
+  'foo_5426',
+  'foo_5427',
+  'foo_5428',
+  'foo_5429',
+  'foo_5430',
+  'foo_5431',
+  'foo_5432',
+  'foo_5433',
+  'foo_5434',
+  'foo_5435',
+  'foo_5436',
+  'foo_5437',
+  'foo_5438',
+  'foo_5439',
+  'foo_5440',
+  'foo_5441',
+  'foo_5442',
+  'foo_5443',
+  'foo_5444',
+  'foo_5445',
+  'foo_5446',
+  'foo_5447',
+  'foo_5448',
+  'foo_5449',
+  'foo_5450',
+  'foo_5451',
+  'foo_5452',
+  'foo_5453',
+  'foo_5454',
+  'foo_5455',
+  'foo_5456',
+  'foo_5457',
+  'foo_5458',
+  'foo_5459',
+  'foo_5460',
+  'foo_5461',
+  'foo_5462',
+  'foo_5463',
+  'foo_5464',
+  'foo_5465',
+  'foo_5466',
+  'foo_5467',
+  'foo_5468',
+  'foo_5469',
+  'foo_5470',
+  'foo_5471',
+  'foo_5472',
+  'foo_5473',
+  'foo_5474',
+  'foo_5475',
+  'foo_5476',
+  'foo_5477',
+  'foo_5478',
+  'foo_5479',
+  'foo_5480',
+  'foo_5481',
+  'foo_5482',
+  'foo_5483',
+  'foo_5484',
+  'foo_5485',
+  'foo_5486',
+  'foo_5487',
+  'foo_5488',
+  'foo_5489',
+  'foo_5490',
+  'foo_5491',
+  'foo_5492',
+  'foo_5493',
+  'foo_5494',
+  'foo_5495',
+  'foo_5496',
+  'foo_5497',
+  'foo_5498',
+  'foo_5499',
+  'foo_5500',
+  'foo_5501',
+  'foo_5502',
+  'foo_5503',
+  'foo_5504',
+  'foo_5505',
+  'foo_5506',
+  'foo_5507',
+  'foo_5508',
+  'foo_5509',
+  'foo_5510',
+  'foo_5511',
+  'foo_5512',
+  'foo_5513',
+  'foo_5514',
+  'foo_5515',
+  'foo_5516',
+  'foo_5517',
+  'foo_5518',
+  'foo_5519',
+  'foo_5520',
+  'foo_5521',
+  'foo_5522',
+  'foo_5523',
+  'foo_5524',
+  'foo_5525',
+  'foo_5526',
+  'foo_5527',
+  'foo_5528',
+  'foo_5529',
+  'foo_5530',
+  'foo_5531',
+  'foo_5532',
+  'foo_5533',
+  'foo_5534',
+  'foo_5535',
+  'foo_5536',
+  'foo_5537',
+  'foo_5538',
+  'foo_5539',
+  'foo_5540',
+  'foo_5541',
+  'foo_5542',
+  'foo_5543',
+  'foo_5544',
+  'foo_5545',
+  'foo_5546',
+  'foo_5547',
+  'foo_5548',
+  'foo_5549',
+  'foo_5550',
+  'foo_5551',
+  'foo_5552',
+  'foo_5553',
+  'foo_5554',
+  'foo_5555',
+  'foo_5556',
+  'foo_5557',
+  'foo_5558',
+  'foo_5559',
+  'foo_5560',
+  'foo_5561',
+  'foo_5562',
+  'foo_5563',
+  'foo_5564',
+  'foo_5565',
+  'foo_5566',
+  'foo_5567',
+  'foo_5568',
+  'foo_5569',
+  'foo_5570',
+  'foo_5571',
+  'foo_5572',
+  'foo_5573',
+  'foo_5574',
+  'foo_5575',
+  'foo_5576',
+  'foo_5577',
+  'foo_5578',
+  'foo_5579',
+  'foo_5580',
+  'foo_5581',
+  'foo_5582',
+  'foo_5583',
+  'foo_5584',
+  'foo_5585',
+  'foo_5586',
+  'foo_5587',
+  'foo_5588',
+  'foo_5589',
+  'foo_5590',
+  'foo_5591',
+  'foo_5592',
+  'foo_5593',
+  'foo_5594',
+  'foo_5595',
+  'foo_5596',
+  'foo_5597',
+  'foo_5598',
+  'foo_5599',
+  'foo_5600',
+  'foo_5601',
+  'foo_5602',
+  'foo_5603',
+  'foo_5604',
+  'foo_5605',
+  'foo_5606',
+  'foo_5607',
+  'foo_5608',
+  'foo_5609',
+  'foo_5610',
+  'foo_5611',
+  'foo_5612',
+  'foo_5613',
+  'foo_5614',
+  'foo_5615',
+  'foo_5616',
+  'foo_5617',
+  'foo_5618',
+  'foo_5619',
+  'foo_5620',
+  'foo_5621',
+  'foo_5622',
+  'foo_5623',
+  'foo_5624',
+  'foo_5625',
+  'foo_5626',
+  'foo_5627',
+  'foo_5628',
+  'foo_5629',
+  'foo_5630',
+  'foo_5631',
+  'foo_5632',
+  'foo_5633',
+  'foo_5634',
+  'foo_5635',
+  'foo_5636',
+  'foo_5637',
+  'foo_5638',
+  'foo_5639',
+  'foo_5640',
+  'foo_5641',
+  'foo_5642',
+  'foo_5643',
+  'foo_5644',
+  'foo_5645',
+  'foo_5646',
+  'foo_5647',
+  'foo_5648',
+  'foo_5649',
+  'foo_5650',
+  'foo_5651',
+  'foo_5652',
+  'foo_5653',
+  'foo_5654',
+  'foo_5655',
+  'foo_5656',
+  'foo_5657',
+  'foo_5658',
+  'foo_5659',
+  'foo_5660',
+  'foo_5661',
+  'foo_5662',
+  'foo_5663',
+  'foo_5664',
+  'foo_5665',
+  'foo_5666',
+  'foo_5667',
+  'foo_5668',
+  'foo_5669',
+  'foo_5670',
+  'foo_5671',
+  'foo_5672',
+  'foo_5673',
+  'foo_5674',
+  'foo_5675',
+  'foo_5676',
+  'foo_5677',
+  'foo_5678',
+  'foo_5679',
+  'foo_5680',
+  'foo_5681',
+  'foo_5682',
+  'foo_5683',
+  'foo_5684',
+  'foo_5685',
+  'foo_5686',
+  'foo_5687',
+  'foo_5688',
+  'foo_5689',
+  'foo_5690',
+  'foo_5691',
+  'foo_5692',
+  'foo_5693',
+  'foo_5694',
+  'foo_5695',
+  'foo_5696',
+  'foo_5697',
+  'foo_5698',
+  'foo_5699',
+  'foo_5700',
+  'foo_5701',
+  'foo_5702',
+  'foo_5703',
+  'foo_5704',
+  'foo_5705',
+  'foo_5706',
+  'foo_5707',
+  'foo_5708',
+  'foo_5709',
+  'foo_5710',
+  'foo_5711',
+  'foo_5712',
+  'foo_5713',
+  'foo_5714',
+  'foo_5715',
+  'foo_5716',
+  'foo_5717',
+  'foo_5718',
+  'foo_5719',
+  'foo_5720',
+  'foo_5721',
+  'foo_5722',
+  'foo_5723',
+  'foo_5724',
+  'foo_5725',
+  'foo_5726',
+  'foo_5727',
+  'foo_5728',
+  'foo_5729',
+  'foo_5730',
+  'foo_5731',
+  'foo_5732',
+  'foo_5733',
+  'foo_5734',
+  'foo_5735',
+  'foo_5736',
+  'foo_5737',
+  'foo_5738',
+  'foo_5739',
+  'foo_5740',
+  'foo_5741',
+  'foo_5742',
+  'foo_5743',
+  'foo_5744',
+  'foo_5745',
+  'foo_5746',
+  'foo_5747',
+  'foo_5748',
+  'foo_5749',
+  'foo_5750',
+  'foo_5751',
+  'foo_5752',
+  'foo_5753',
+  'foo_5754',
+  'foo_5755',
+  'foo_5756',
+  'foo_5757',
+  'foo_5758',
+  'foo_5759',
+  'foo_5760',
+  'foo_5761',
+  'foo_5762',
+  'foo_5763',
+  'foo_5764',
+  'foo_5765',
+  'foo_5766',
+  'foo_5767',
+  'foo_5768',
+  'foo_5769',
+  'foo_5770',
+  'foo_5771',
+  'foo_5772',
+  'foo_5773',
+  'foo_5774',
+  'foo_5775',
+  'foo_5776',
+  'foo_5777',
+  'foo_5778',
+  'foo_5779',
+  'foo_5780',
+  'foo_5781',
+  'foo_5782',
+  'foo_5783',
+  'foo_5784',
+  'foo_5785',
+  'foo_5786',
+  'foo_5787',
+  'foo_5788',
+  'foo_5789',
+  'foo_5790',
+  'foo_5791',
+  'foo_5792',
+  'foo_5793',
+  'foo_5794',
+  'foo_5795',
+  'foo_5796',
+  'foo_5797',
+  'foo_5798',
+  'foo_5799',
+  'foo_5800',
+  'foo_5801',
+  'foo_5802',
+  'foo_5803',
+  'foo_5804',
+  'foo_5805',
+  'foo_5806',
+  'foo_5807',
+  'foo_5808',
+  'foo_5809',
+  'foo_5810',
+  'foo_5811',
+  'foo_5812',
+  'foo_5813',
+  'foo_5814',
+  'foo_5815',
+  'foo_5816',
+  'foo_5817',
+  'foo_5818',
+  'foo_5819',
+  'foo_5820',
+  'foo_5821',
+  'foo_5822',
+  'foo_5823',
+  'foo_5824',
+  'foo_5825',
+  'foo_5826',
+  'foo_5827',
+  'foo_5828',
+  'foo_5829',
+  'foo_5830',
+  'foo_5831',
+  'foo_5832',
+  'foo_5833',
+  'foo_5834',
+  'foo_5835',
+  'foo_5836',
+  'foo_5837',
+  'foo_5838',
+  'foo_5839',
+  'foo_5840',
+  'foo_5841',
+  'foo_5842',
+  'foo_5843',
+  'foo_5844',
+  'foo_5845',
+  'foo_5846',
+  'foo_5847',
+  'foo_5848',
+  'foo_5849',
+  'foo_5850',
+  'foo_5851',
+  'foo_5852',
+  'foo_5853',
+  'foo_5854',
+  'foo_5855',
+  'foo_5856',
+  'foo_5857',
+  'foo_5858',
+  'foo_5859',
+  'foo_5860',
+  'foo_5861',
+  'foo_5862',
+  'foo_5863',
+  'foo_5864',
+  'foo_5865',
+  'foo_5866',
+  'foo_5867',
+  'foo_5868',
+  'foo_5869',
+  'foo_5870',
+  'foo_5871',
+  'foo_5872',
+  'foo_5873',
+  'foo_5874',
+  'foo_5875',
+  'foo_5876',
+  'foo_5877',
+  'foo_5878',
+  'foo_5879',
+  'foo_5880',
+  'foo_5881',
+  'foo_5882',
+  'foo_5883',
+  'foo_5884',
+  'foo_5885',
+  'foo_5886',
+  'foo_5887',
+  'foo_5888',
+  'foo_5889',
+  'foo_5890',
+  'foo_5891',
+  'foo_5892',
+  'foo_5893',
+  'foo_5894',
+  'foo_5895',
+  'foo_5896',
+  'foo_5897',
+  'foo_5898',
+  'foo_5899',
+  'foo_5900',
+  'foo_5901',
+  'foo_5902',
+  'foo_5903',
+  'foo_5904',
+  'foo_5905',
+  'foo_5906',
+  'foo_5907',
+  'foo_5908',
+  'foo_5909',
+  'foo_5910',
+  'foo_5911',
+  'foo_5912',
+  'foo_5913',
+  'foo_5914',
+  'foo_5915',
+  'foo_5916',
+  'foo_5917',
+  'foo_5918',
+  'foo_5919',
+  'foo_5920',
+  'foo_5921',
+  'foo_5922',
+  'foo_5923',
+  'foo_5924',
+  'foo_5925',
+  'foo_5926',
+  'foo_5927',
+  'foo_5928',
+  'foo_5929',
+  'foo_5930',
+  'foo_5931',
+  'foo_5932',
+  'foo_5933',
+  'foo_5934',
+  'foo_5935',
+  'foo_5936',
+  'foo_5937',
+  'foo_5938',
+  'foo_5939',
+  'foo_5940',
+  'foo_5941',
+  'foo_5942',
+  'foo_5943',
+  'foo_5944',
+  'foo_5945',
+  'foo_5946',
+  'foo_5947',
+  'foo_5948',
+  'foo_5949',
+  'foo_5950',
+  'foo_5951',
+  'foo_5952',
+  'foo_5953',
+  'foo_5954',
+  'foo_5955',
+  'foo_5956',
+  'foo_5957',
+  'foo_5958',
+  'foo_5959',
+  'foo_5960',
+  'foo_5961',
+  'foo_5962',
+  'foo_5963',
+  'foo_5964',
+  'foo_5965',
+  'foo_5966',
+  'foo_5967',
+  'foo_5968',
+  'foo_5969',
+  'foo_5970',
+  'foo_5971',
+  'foo_5972',
+  'foo_5973',
+  'foo_5974',
+  'foo_5975',
+  'foo_5976',
+  'foo_5977',
+  'foo_5978',
+  'foo_5979',
+  'foo_5980',
+  'foo_5981',
+  'foo_5982',
+  'foo_5983',
+  'foo_5984',
+  'foo_5985',
+  'foo_5986',
+  'foo_5987',
+  'foo_5988',
+  'foo_5989',
+  'foo_5990',
+  'foo_5991',
+  'foo_5992',
+  'foo_5993',
+  'foo_5994',
+  'foo_5995',
+  'foo_5996',
+  'foo_5997',
+  'foo_5998',
+  'foo_5999',
+  'foo_6000',
+  'foo_6001',
+  'foo_6002',
+  'foo_6003',
+  'foo_6004',
+  'foo_6005',
+  'foo_6006',
+  'foo_6007',
+  'foo_6008',
+  'foo_6009',
+  'foo_6010',
+  'foo_6011',
+  'foo_6012',
+  'foo_6013',
+  'foo_6014',
+  'foo_6015',
+  'foo_6016',
+  'foo_6017',
+  'foo_6018',
+  'foo_6019',
+  'foo_6020',
+  'foo_6021',
+  'foo_6022',
+  'foo_6023',
+  'foo_6024',
+  'foo_6025',
+  'foo_6026',
+  'foo_6027',
+  'foo_6028',
+  'foo_6029',
+  'foo_6030',
+  'foo_6031',
+  'foo_6032',
+  'foo_6033',
+  'foo_6034',
+  'foo_6035',
+  'foo_6036',
+  'foo_6037',
+  'foo_6038',
+  'foo_6039',
+  'foo_6040',
+  'foo_6041',
+  'foo_6042',
+  'foo_6043',
+  'foo_6044',
+  'foo_6045',
+  'foo_6046',
+  'foo_6047',
+  'foo_6048',
+  'foo_6049',
+  'foo_6050',
+  'foo_6051',
+  'foo_6052',
+  'foo_6053',
+  'foo_6054',
+  'foo_6055',
+  'foo_6056',
+  'foo_6057',
+  'foo_6058',
+  'foo_6059',
+  'foo_6060',
+  'foo_6061',
+  'foo_6062',
+  'foo_6063',
+  'foo_6064',
+  'foo_6065',
+  'foo_6066',
+  'foo_6067',
+  'foo_6068',
+  'foo_6069',
+  'foo_6070',
+  'foo_6071',
+  'foo_6072',
+  'foo_6073',
+  'foo_6074',
+  'foo_6075',
+  'foo_6076',
+  'foo_6077',
+  'foo_6078',
+  'foo_6079',
+  'foo_6080',
+  'foo_6081',
+  'foo_6082',
+  'foo_6083',
+  'foo_6084',
+  'foo_6085',
+  'foo_6086',
+  'foo_6087',
+  'foo_6088',
+  'foo_6089',
+  'foo_6090',
+  'foo_6091',
+  'foo_6092',
+  'foo_6093',
+  'foo_6094',
+  'foo_6095',
+  'foo_6096',
+  'foo_6097',
+  'foo_6098',
+  'foo_6099',
+  'foo_6100',
+  'foo_6101',
+  'foo_6102',
+  'foo_6103',
+  'foo_6104',
+  'foo_6105',
+  'foo_6106',
+  'foo_6107',
+  'foo_6108',
+  'foo_6109',
+  'foo_6110',
+  'foo_6111',
+  'foo_6112',
+  'foo_6113',
+  'foo_6114',
+  'foo_6115',
+  'foo_6116',
+  'foo_6117',
+  'foo_6118',
+  'foo_6119',
+  'foo_6120',
+  'foo_6121',
+  'foo_6122',
+  'foo_6123',
+  'foo_6124',
+  'foo_6125',
+  'foo_6126',
+  'foo_6127',
+  'foo_6128',
+  'foo_6129',
+  'foo_6130',
+  'foo_6131',
+  'foo_6132',
+  'foo_6133',
+  'foo_6134',
+  'foo_6135',
+  'foo_6136',
+  'foo_6137',
+  'foo_6138',
+  'foo_6139',
+  'foo_6140',
+  'foo_6141',
+  'foo_6142',
+  'foo_6143',
+  'foo_6144',
+  'foo_6145',
+  'foo_6146',
+  'foo_6147',
+  'foo_6148',
+  'foo_6149',
+  'foo_6150',
+  'foo_6151',
+  'foo_6152',
+  'foo_6153',
+  'foo_6154',
+  'foo_6155',
+  'foo_6156',
+  'foo_6157',
+  'foo_6158',
+  'foo_6159',
+  'foo_6160',
+  'foo_6161',
+  'foo_6162',
+  'foo_6163',
+  'foo_6164',
+  'foo_6165',
+  'foo_6166',
+  'foo_6167',
+  'foo_6168',
+  'foo_6169',
+  'foo_6170',
+  'foo_6171',
+  'foo_6172',
+  'foo_6173',
+  'foo_6174',
+  'foo_6175',
+  'foo_6176',
+  'foo_6177',
+  'foo_6178',
+  'foo_6179',
+  'foo_6180',
+  'foo_6181',
+  'foo_6182',
+  'foo_6183',
+  'foo_6184',
+  'foo_6185',
+  'foo_6186',
+  'foo_6187',
+  'foo_6188',
+  'foo_6189',
+  'foo_6190',
+  'foo_6191',
+  'foo_6192',
+  'foo_6193',
+  'foo_6194',
+  'foo_6195',
+  'foo_6196',
+  'foo_6197',
+  'foo_6198',
+  'foo_6199',
+  'foo_6200',
+  'foo_6201',
+  'foo_6202',
+  'foo_6203',
+  'foo_6204',
+  'foo_6205',
+  'foo_6206',
+  'foo_6207',
+  'foo_6208',
+  'foo_6209',
+  'foo_6210',
+  'foo_6211',
+  'foo_6212',
+  'foo_6213',
+  'foo_6214',
+  'foo_6215',
+  'foo_6216',
+  'foo_6217',
+  'foo_6218',
+  'foo_6219',
+  'foo_6220',
+  'foo_6221',
+  'foo_6222',
+  'foo_6223',
+  'foo_6224',
+  'foo_6225',
+  'foo_6226',
+  'foo_6227',
+  'foo_6228',
+  'foo_6229',
+  'foo_6230',
+  'foo_6231',
+  'foo_6232',
+  'foo_6233',
+  'foo_6234',
+  'foo_6235',
+  'foo_6236',
+  'foo_6237',
+  'foo_6238',
+  'foo_6239',
+  'foo_6240',
+  'foo_6241',
+  'foo_6242',
+  'foo_6243',
+  'foo_6244',
+  'foo_6245',
+  'foo_6246',
+  'foo_6247',
+  'foo_6248',
+  'foo_6249',
+  'foo_6250',
+  'foo_6251',
+  'foo_6252',
+  'foo_6253',
+  'foo_6254',
+  'foo_6255',
+  'foo_6256',
+  'foo_6257',
+  'foo_6258',
+  'foo_6259',
+  'foo_6260',
+  'foo_6261',
+  'foo_6262',
+  'foo_6263',
+  'foo_6264',
+  'foo_6265',
+  'foo_6266',
+  'foo_6267',
+  'foo_6268',
+  'foo_6269',
+  'foo_6270',
+  'foo_6271',
+  'foo_6272',
+  'foo_6273',
+  'foo_6274',
+  'foo_6275',
+  'foo_6276',
+  'foo_6277',
+  'foo_6278',
+  'foo_6279',
+  'foo_6280',
+  'foo_6281',
+  'foo_6282',
+  'foo_6283',
+  'foo_6284',
+  'foo_6285',
+  'foo_6286',
+  'foo_6287',
+  'foo_6288',
+  'foo_6289',
+  'foo_6290',
+  'foo_6291',
+  'foo_6292',
+  'foo_6293',
+  'foo_6294',
+  'foo_6295',
+  'foo_6296',
+  'foo_6297',
+  'foo_6298',
+  'foo_6299',
+  'foo_6300',
+  'foo_6301',
+  'foo_6302',
+  'foo_6303',
+  'foo_6304',
+  'foo_6305',
+  'foo_6306',
+  'foo_6307',
+  'foo_6308',
+  'foo_6309',
+  'foo_6310',
+  'foo_6311',
+  'foo_6312',
+  'foo_6313',
+  'foo_6314',
+  'foo_6315',
+  'foo_6316',
+  'foo_6317',
+  'foo_6318',
+  'foo_6319',
+  'foo_6320',
+  'foo_6321',
+  'foo_6322',
+  'foo_6323',
+  'foo_6324',
+  'foo_6325',
+  'foo_6326',
+  'foo_6327',
+  'foo_6328',
+  'foo_6329',
+  'foo_6330',
+  'foo_6331',
+  'foo_6332',
+  'foo_6333',
+  'foo_6334',
+  'foo_6335',
+  'foo_6336',
+  'foo_6337',
+  'foo_6338',
+  'foo_6339',
+  'foo_6340',
+  'foo_6341',
+  'foo_6342',
+  'foo_6343',
+  'foo_6344',
+  'foo_6345',
+  'foo_6346',
+  'foo_6347',
+  'foo_6348',
+  'foo_6349',
+  'foo_6350',
+  'foo_6351',
+  'foo_6352',
+  'foo_6353',
+  'foo_6354',
+  'foo_6355',
+  'foo_6356',
+  'foo_6357',
+  'foo_6358',
+  'foo_6359',
+  'foo_6360',
+  'foo_6361',
+  'foo_6362',
+  'foo_6363',
+  'foo_6364',
+  'foo_6365',
+  'foo_6366',
+  'foo_6367',
+  'foo_6368',
+  'foo_6369',
+  'foo_6370',
+  'foo_6371',
+  'foo_6372',
+  'foo_6373',
+  'foo_6374',
+  'foo_6375',
+  'foo_6376',
+  'foo_6377',
+  'foo_6378',
+  'foo_6379',
+  'foo_6380',
+  'foo_6381',
+  'foo_6382',
+  'foo_6383',
+  'foo_6384',
+  'foo_6385',
+  'foo_6386',
+  'foo_6387',
+  'foo_6388',
+  'foo_6389',
+  'foo_6390',
+  'foo_6391',
+  'foo_6392',
+  'foo_6393',
+  'foo_6394',
+  'foo_6395',
+  'foo_6396',
+  'foo_6397',
+  'foo_6398',
+  'foo_6399',
+  'foo_6400',
+  'foo_6401',
+  'foo_6402',
+  'foo_6403',
+  'foo_6404',
+  'foo_6405',
+  'foo_6406',
+  'foo_6407',
+  'foo_6408',
+  'foo_6409',
+  'foo_6410',
+  'foo_6411',
+  'foo_6412',
+  'foo_6413',
+  'foo_6414',
+  'foo_6415',
+  'foo_6416',
+  'foo_6417',
+  'foo_6418',
+  'foo_6419',
+  'foo_6420',
+  'foo_6421',
+  'foo_6422',
+  'foo_6423',
+  'foo_6424',
+  'foo_6425',
+  'foo_6426',
+  'foo_6427',
+  'foo_6428',
+  'foo_6429',
+  'foo_6430',
+  'foo_6431',
+  'foo_6432',
+  'foo_6433',
+  'foo_6434',
+  'foo_6435',
+  'foo_6436',
+  'foo_6437',
+  'foo_6438',
+  'foo_6439',
+  'foo_6440',
+  'foo_6441',
+  'foo_6442',
+  'foo_6443',
+  'foo_6444',
+  'foo_6445',
+  'foo_6446',
+  'foo_6447',
+  'foo_6448',
+  'foo_6449',
+  'foo_6450',
+  'foo_6451',
+  'foo_6452',
+  'foo_6453',
+  'foo_6454',
+  'foo_6455',
+  'foo_6456',
+  'foo_6457',
+  'foo_6458',
+  'foo_6459',
+  'foo_6460',
+  'foo_6461',
+  'foo_6462',
+  'foo_6463',
+  'foo_6464',
+  'foo_6465',
+  'foo_6466',
+  'foo_6467',
+  'foo_6468',
+  'foo_6469',
+  'foo_6470',
+  'foo_6471',
+  'foo_6472',
+  'foo_6473',
+  'foo_6474',
+  'foo_6475',
+  'foo_6476',
+  'foo_6477',
+  'foo_6478',
+  'foo_6479',
+  'foo_6480',
+  'foo_6481',
+  'foo_6482',
+  'foo_6483',
+  'foo_6484',
+  'foo_6485',
+  'foo_6486',
+  'foo_6487',
+  'foo_6488',
+  'foo_6489',
+  'foo_6490',
+  'foo_6491',
+  'foo_6492',
+  'foo_6493',
+  'foo_6494',
+  'foo_6495',
+  'foo_6496',
+  'foo_6497',
+  'foo_6498',
+  'foo_6499',
+  'foo_6500',
+  'foo_6501',
+  'foo_6502',
+  'foo_6503',
+  'foo_6504',
+  'foo_6505',
+  'foo_6506',
+  'foo_6507',
+  'foo_6508',
+  'foo_6509',
+  'foo_6510',
+  'foo_6511',
+  'foo_6512',
+  'foo_6513',
+  'foo_6514',
+  'foo_6515',
+  'foo_6516',
+  'foo_6517',
+  'foo_6518',
+  'foo_6519',
+  'foo_6520',
+  'foo_6521',
+  'foo_6522',
+  'foo_6523',
+  'foo_6524',
+  'foo_6525',
+  'foo_6526',
+  'foo_6527',
+  'foo_6528',
+  'foo_6529',
+  'foo_6530',
+  'foo_6531',
+  'foo_6532',
+  'foo_6533',
+  'foo_6534',
+  'foo_6535',
+  'foo_6536',
+  'foo_6537',
+  'foo_6538',
+  'foo_6539',
+  'foo_6540',
+  'foo_6541',
+  'foo_6542',
+  'foo_6543',
+  'foo_6544',
+  'foo_6545',
+  'foo_6546',
+  'foo_6547',
+  'foo_6548',
+  'foo_6549',
+  'foo_6550',
+  'foo_6551',
+  'foo_6552',
+  'foo_6553',
+  'foo_6554',
+  'foo_6555',
+  'foo_6556',
+  'foo_6557',
+  'foo_6558',
+  'foo_6559',
+  'foo_6560',
+  'foo_6561',
+  'foo_6562',
+  'foo_6563',
+  'foo_6564',
+  'foo_6565',
+  'foo_6566',
+  'foo_6567',
+  'foo_6568',
+  'foo_6569',
+  'foo_6570',
+  'foo_6571',
+  'foo_6572',
+  'foo_6573',
+  'foo_6574',
+  'foo_6575',
+  'foo_6576',
+  'foo_6577',
+  'foo_6578',
+  'foo_6579',
+  'foo_6580',
+  'foo_6581',
+  'foo_6582',
+  'foo_6583',
+  'foo_6584',
+  'foo_6585',
+  'foo_6586',
+  'foo_6587',
+  'foo_6588',
+  'foo_6589',
+  'foo_6590',
+  'foo_6591',
+  'foo_6592',
+  'foo_6593',
+  'foo_6594',
+  'foo_6595',
+  'foo_6596',
+  'foo_6597',
+  'foo_6598',
+  'foo_6599',
+  'foo_6600',
+  'foo_6601',
+  'foo_6602',
+  'foo_6603',
+  'foo_6604',
+  'foo_6605',
+  'foo_6606',
+  'foo_6607',
+  'foo_6608',
+  'foo_6609',
+  'foo_6610',
+  'foo_6611',
+  'foo_6612',
+  'foo_6613',
+  'foo_6614',
+  'foo_6615',
+  'foo_6616',
+  'foo_6617',
+  'foo_6618',
+  'foo_6619',
+  'foo_6620',
+  'foo_6621',
+  'foo_6622',
+  'foo_6623',
+  'foo_6624',
+  'foo_6625',
+  'foo_6626',
+  'foo_6627',
+  'foo_6628',
+  'foo_6629',
+  'foo_6630',
+  'foo_6631',
+  'foo_6632',
+  'foo_6633',
+  'foo_6634',
+  'foo_6635',
+  'foo_6636',
+  'foo_6637',
+  'foo_6638',
+  'foo_6639',
+  'foo_6640',
+  'foo_6641',
+  'foo_6642',
+  'foo_6643',
+  'foo_6644',
+  'foo_6645',
+  'foo_6646',
+  'foo_6647',
+  'foo_6648',
+  'foo_6649',
+  'foo_6650',
+  'foo_6651',
+  'foo_6652',
+  'foo_6653',
+  'foo_6654',
+  'foo_6655',
+  'foo_6656',
+  'foo_6657',
+  'foo_6658',
+  'foo_6659',
+  'foo_6660',
+  'foo_6661',
+  'foo_6662',
+  'foo_6663',
+  'foo_6664',
+  'foo_6665',
+  'foo_6666',
+  'foo_6667',
+  'foo_6668',
+  'foo_6669',
+  'foo_6670',
+  'foo_6671',
+  'foo_6672',
+  'foo_6673',
+  'foo_6674',
+  'foo_6675',
+  'foo_6676',
+  'foo_6677',
+  'foo_6678',
+  'foo_6679',
+  'foo_6680',
+  'foo_6681',
+  'foo_6682',
+  'foo_6683',
+  'foo_6684',
+  'foo_6685',
+  'foo_6686',
+  'foo_6687',
+  'foo_6688',
+  'foo_6689',
+  'foo_6690',
+  'foo_6691',
+  'foo_6692',
+  'foo_6693',
+  'foo_6694',
+  'foo_6695',
+  'foo_6696',
+  'foo_6697',
+  'foo_6698',
+  'foo_6699',
+  'foo_6700',
+  'foo_6701',
+  'foo_6702',
+  'foo_6703',
+  'foo_6704',
+  'foo_6705',
+  'foo_6706',
+  'foo_6707',
+  'foo_6708',
+  'foo_6709',
+  'foo_6710',
+  'foo_6711',
+  'foo_6712',
+  'foo_6713',
+  'foo_6714',
+  'foo_6715',
+  'foo_6716',
+  'foo_6717',
+  'foo_6718',
+  'foo_6719',
+  'foo_6720',
+  'foo_6721',
+  'foo_6722',
+  'foo_6723',
+  'foo_6724',
+  'foo_6725',
+  'foo_6726',
+  'foo_6727',
+  'foo_6728',
+  'foo_6729',
+  'foo_6730',
+  'foo_6731',
+  'foo_6732',
+  'foo_6733',
+  'foo_6734',
+  'foo_6735',
+  'foo_6736',
+  'foo_6737',
+  'foo_6738',
+  'foo_6739',
+  'foo_6740',
+  'foo_6741',
+  'foo_6742',
+  'foo_6743',
+  'foo_6744',
+  'foo_6745',
+  'foo_6746',
+  'foo_6747',
+  'foo_6748',
+  'foo_6749',
+  'foo_6750',
+  'foo_6751',
+  'foo_6752',
+  'foo_6753',
+  'foo_6754',
+  'foo_6755',
+  'foo_6756',
+  'foo_6757',
+  'foo_6758',
+  'foo_6759',
+  'foo_6760',
+  'foo_6761',
+  'foo_6762',
+  'foo_6763',
+  'foo_6764',
+  'foo_6765',
+  'foo_6766',
+  'foo_6767',
+  'foo_6768',
+  'foo_6769',
+  'foo_6770',
+  'foo_6771',
+  'foo_6772',
+  'foo_6773',
+  'foo_6774',
+  'foo_6775',
+  'foo_6776',
+  'foo_6777',
+  'foo_6778',
+  'foo_6779',
+  'foo_6780',
+  'foo_6781',
+  'foo_6782',
+  'foo_6783',
+  'foo_6784',
+  'foo_6785',
+  'foo_6786',
+  'foo_6787',
+  'foo_6788',
+  'foo_6789',
+  'foo_6790',
+  'foo_6791',
+  'foo_6792',
+  'foo_6793',
+  'foo_6794',
+  'foo_6795',
+  'foo_6796',
+  'foo_6797',
+  'foo_6798',
+  'foo_6799',
+  'foo_6800',
+  'foo_6801',
+  'foo_6802',
+  'foo_6803',
+  'foo_6804',
+  'foo_6805',
+  'foo_6806',
+  'foo_6807',
+  'foo_6808',
+  'foo_6809',
+  'foo_6810',
+  'foo_6811',
+  'foo_6812',
+  'foo_6813',
+  'foo_6814',
+  'foo_6815',
+  'foo_6816',
+  'foo_6817',
+  'foo_6818',
+  'foo_6819',
+  'foo_6820',
+  'foo_6821',
+  'foo_6822',
+  'foo_6823',
+  'foo_6824',
+  'foo_6825',
+  'foo_6826',
+  'foo_6827',
+  'foo_6828',
+  'foo_6829',
+  'foo_6830',
+  'foo_6831',
+  'foo_6832',
+  'foo_6833',
+  'foo_6834',
+  'foo_6835',
+  'foo_6836',
+  'foo_6837',
+  'foo_6838',
+  'foo_6839',
+  'foo_6840',
+  'foo_6841',
+  'foo_6842',
+  'foo_6843',
+  'foo_6844',
+  'foo_6845',
+  'foo_6846',
+  'foo_6847',
+  'foo_6848',
+  'foo_6849',
+  'foo_6850',
+  'foo_6851',
+  'foo_6852',
+  'foo_6853',
+  'foo_6854',
+  'foo_6855',
+  'foo_6856',
+  'foo_6857',
+  'foo_6858',
+  'foo_6859',
+  'foo_6860',
+  'foo_6861',
+  'foo_6862',
+  'foo_6863',
+  'foo_6864',
+  'foo_6865',
+  'foo_6866',
+  'foo_6867',
+  'foo_6868',
+  'foo_6869',
+  'foo_6870',
+  'foo_6871',
+  'foo_6872',
+  'foo_6873',
+  'foo_6874',
+  'foo_6875',
+  'foo_6876',
+  'foo_6877',
+  'foo_6878',
+  'foo_6879',
+  'foo_6880',
+  'foo_6881',
+  'foo_6882',
+  'foo_6883',
+  'foo_6884',
+  'foo_6885',
+  'foo_6886',
+  'foo_6887',
+  'foo_6888',
+  'foo_6889',
+  'foo_6890',
+  'foo_6891',
+  'foo_6892',
+  'foo_6893',
+  'foo_6894',
+  'foo_6895',
+  'foo_6896',
+  'foo_6897',
+  'foo_6898',
+  'foo_6899',
+  'foo_6900',
+  'foo_6901',
+  'foo_6902',
+  'foo_6903',
+  'foo_6904',
+  'foo_6905',
+  'foo_6906',
+  'foo_6907',
+  'foo_6908',
+  'foo_6909',
+  'foo_6910',
+  'foo_6911',
+  'foo_6912',
+  'foo_6913',
+  'foo_6914',
+  'foo_6915',
+  'foo_6916',
+  'foo_6917',
+  'foo_6918',
+  'foo_6919',
+  'foo_6920',
+  'foo_6921',
+  'foo_6922',
+  'foo_6923',
+  'foo_6924',
+  'foo_6925',
+  'foo_6926',
+  'foo_6927',
+  'foo_6928',
+  'foo_6929',
+  'foo_6930',
+  'foo_6931',
+  'foo_6932',
+  'foo_6933',
+  'foo_6934',
+  'foo_6935',
+  'foo_6936',
+  'foo_6937',
+  'foo_6938',
+  'foo_6939',
+  'foo_6940',
+  'foo_6941',
+  'foo_6942',
+  'foo_6943',
+  'foo_6944',
+  'foo_6945',
+  'foo_6946',
+  'foo_6947',
+  'foo_6948',
+  'foo_6949',
+  'foo_6950',
+  'foo_6951',
+  'foo_6952',
+  'foo_6953',
+  'foo_6954',
+  'foo_6955',
+  'foo_6956',
+  'foo_6957',
+  'foo_6958',
+  'foo_6959',
+  'foo_6960',
+  'foo_6961',
+  'foo_6962',
+  'foo_6963',
+  'foo_6964',
+  'foo_6965',
+  'foo_6966',
+  'foo_6967',
+  'foo_6968',
+  'foo_6969',
+  'foo_6970',
+  'foo_6971',
+  'foo_6972',
+  'foo_6973',
+  'foo_6974',
+  'foo_6975',
+  'foo_6976',
+  'foo_6977',
+  'foo_6978',
+  'foo_6979',
+  'foo_6980',
+  'foo_6981',
+  'foo_6982',
+  'foo_6983',
+  'foo_6984',
+  'foo_6985',
+  'foo_6986',
+  'foo_6987',
+  'foo_6988',
+  'foo_6989',
+  'foo_6990',
+  'foo_6991',
+  'foo_6992',
+  'foo_6993',
+  'foo_6994',
+  'foo_6995',
+  'foo_6996',
+  'foo_6997',
+  'foo_6998',
+  'foo_6999',
+  'foo_7000',
+  'foo_7001',
+  'foo_7002',
+  'foo_7003',
+  'foo_7004',
+  'foo_7005',
+  'foo_7006',
+  'foo_7007',
+  'foo_7008',
+  'foo_7009',
+  'foo_7010',
+  'foo_7011',
+  'foo_7012',
+  'foo_7013',
+  'foo_7014',
+  'foo_7015',
+  'foo_7016',
+  'foo_7017',
+  'foo_7018',
+  'foo_7019',
+  'foo_7020',
+  'foo_7021',
+  'foo_7022',
+  'foo_7023',
+  'foo_7024',
+  'foo_7025',
+  'foo_7026',
+  'foo_7027',
+  'foo_7028',
+  'foo_7029',
+  'foo_7030',
+  'foo_7031',
+  'foo_7032',
+  'foo_7033',
+  'foo_7034',
+  'foo_7035',
+  'foo_7036',
+  'foo_7037',
+  'foo_7038',
+  'foo_7039',
+  'foo_7040',
+  'foo_7041',
+  'foo_7042',
+  'foo_7043',
+  'foo_7044',
+  'foo_7045',
+  'foo_7046',
+  'foo_7047',
+  'foo_7048',
+  'foo_7049',
+  'foo_7050',
+  'foo_7051',
+  'foo_7052',
+  'foo_7053',
+  'foo_7054',
+  'foo_7055',
+  'foo_7056',
+  'foo_7057',
+  'foo_7058',
+  'foo_7059',
+  'foo_7060',
+  'foo_7061',
+  'foo_7062',
+  'foo_7063',
+  'foo_7064',
+  'foo_7065',
+  'foo_7066',
+  'foo_7067',
+  'foo_7068',
+  'foo_7069',
+  'foo_7070',
+  'foo_7071',
+  'foo_7072',
+  'foo_7073',
+  'foo_7074',
+  'foo_7075',
+  'foo_7076',
+  'foo_7077',
+  'foo_7078',
+  'foo_7079',
+  'foo_7080',
+  'foo_7081',
+  'foo_7082',
+  'foo_7083',
+  'foo_7084',
+  'foo_7085',
+  'foo_7086',
+  'foo_7087',
+  'foo_7088',
+  'foo_7089',
+  'foo_7090',
+  'foo_7091',
+  'foo_7092',
+  'foo_7093',
+  'foo_7094',
+  'foo_7095',
+  'foo_7096',
+  'foo_7097',
+  'foo_7098',
+  'foo_7099',
+  'foo_7100',
+  'foo_7101',
+  'foo_7102',
+  'foo_7103',
+  'foo_7104',
+  'foo_7105',
+  'foo_7106',
+  'foo_7107',
+  'foo_7108',
+  'foo_7109',
+  'foo_7110',
+  'foo_7111',
+  'foo_7112',
+  'foo_7113',
+  'foo_7114',
+  'foo_7115',
+  'foo_7116',
+  'foo_7117',
+  'foo_7118',
+  'foo_7119',
+  'foo_7120',
+  'foo_7121',
+  'foo_7122',
+  'foo_7123',
+  'foo_7124',
+  'foo_7125',
+  'foo_7126',
+  'foo_7127',
+  'foo_7128',
+  'foo_7129',
+  'foo_7130',
+  'foo_7131',
+  'foo_7132',
+  'foo_7133',
+  'foo_7134',
+  'foo_7135',
+  'foo_7136',
+  'foo_7137',
+  'foo_7138',
+  'foo_7139',
+  'foo_7140',
+  'foo_7141',
+  'foo_7142',
+  'foo_7143',
+  'foo_7144',
+  'foo_7145',
+  'foo_7146',
+  'foo_7147',
+  'foo_7148',
+  'foo_7149',
+  'foo_7150',
+  'foo_7151',
+  'foo_7152',
+  'foo_7153',
+  'foo_7154',
+  'foo_7155',
+  'foo_7156',
+  'foo_7157',
+  'foo_7158',
+  'foo_7159',
+  'foo_7160',
+  'foo_7161',
+  'foo_7162',
+  'foo_7163',
+  'foo_7164',
+  'foo_7165',
+  'foo_7166',
+  'foo_7167',
+  'foo_7168',
+  'foo_7169',
+  'foo_7170',
+  'foo_7171',
+  'foo_7172',
+  'foo_7173',
+  'foo_7174',
+  'foo_7175',
+  'foo_7176',
+  'foo_7177',
+  'foo_7178',
+  'foo_7179',
+  'foo_7180',
+  'foo_7181',
+  'foo_7182',
+  'foo_7183',
+  'foo_7184',
+  'foo_7185',
+  'foo_7186',
+  'foo_7187',
+  'foo_7188',
+  'foo_7189',
+  'foo_7190',
+  'foo_7191',
+  'foo_7192',
+  'foo_7193',
+  'foo_7194',
+  'foo_7195',
+  'foo_7196',
+  'foo_7197',
+  'foo_7198',
+  'foo_7199',
+  'foo_7200',
+  'foo_7201',
+  'foo_7202',
+  'foo_7203',
+  'foo_7204',
+  'foo_7205',
+  'foo_7206',
+  'foo_7207',
+  'foo_7208',
+  'foo_7209',
+  'foo_7210',
+  'foo_7211',
+  'foo_7212',
+  'foo_7213',
+  'foo_7214',
+  'foo_7215',
+  'foo_7216',
+  'foo_7217',
+  'foo_7218',
+  'foo_7219',
+  'foo_7220',
+  'foo_7221',
+  'foo_7222',
+  'foo_7223',
+  'foo_7224',
+  'foo_7225',
+  'foo_7226',
+  'foo_7227',
+  'foo_7228',
+  'foo_7229',
+  'foo_7230',
+  'foo_7231',
+  'foo_7232',
+  'foo_7233',
+  'foo_7234',
+  'foo_7235',
+  'foo_7236',
+  'foo_7237',
+  'foo_7238',
+  'foo_7239',
+  'foo_7240',
+  'foo_7241',
+  'foo_7242',
+  'foo_7243',
+  'foo_7244',
+  'foo_7245',
+  'foo_7246',
+  'foo_7247',
+  'foo_7248',
+  'foo_7249',
+  'foo_7250',
+  'foo_7251',
+  'foo_7252',
+  'foo_7253',
+  'foo_7254',
+  'foo_7255',
+  'foo_7256',
+  'foo_7257',
+  'foo_7258',
+  'foo_7259',
+  'foo_7260',
+  'foo_7261',
+  'foo_7262',
+  'foo_7263',
+  'foo_7264',
+  'foo_7265',
+  'foo_7266',
+  'foo_7267',
+  'foo_7268',
+  'foo_7269',
+  'foo_7270',
+  'foo_7271',
+  'foo_7272',
+  'foo_7273',
+  'foo_7274',
+  'foo_7275',
+  'foo_7276',
+  'foo_7277',
+  'foo_7278',
+  'foo_7279',
+  'foo_7280',
+  'foo_7281',
+  'foo_7282',
+  'foo_7283',
+  'foo_7284',
+  'foo_7285',
+  'foo_7286',
+  'foo_7287',
+  'foo_7288',
+  'foo_7289',
+  'foo_7290',
+  'foo_7291',
+  'foo_7292',
+  'foo_7293',
+  'foo_7294',
+  'foo_7295',
+  'foo_7296',
+  'foo_7297',
+  'foo_7298',
+  'foo_7299',
+  'foo_7300',
+  'foo_7301',
+  'foo_7302',
+  'foo_7303',
+  'foo_7304',
+  'foo_7305',
+  'foo_7306',
+  'foo_7307',
+  'foo_7308',
+  'foo_7309',
+  'foo_7310',
+  'foo_7311',
+  'foo_7312',
+  'foo_7313',
+  'foo_7314',
+  'foo_7315',
+  'foo_7316',
+  'foo_7317',
+  'foo_7318',
+  'foo_7319',
+  'foo_7320',
+  'foo_7321',
+  'foo_7322',
+  'foo_7323',
+  'foo_7324',
+  'foo_7325',
+  'foo_7326',
+  'foo_7327',
+  'foo_7328',
+  'foo_7329',
+  'foo_7330',
+  'foo_7331',
+  'foo_7332',
+  'foo_7333',
+  'foo_7334',
+  'foo_7335',
+  'foo_7336',
+  'foo_7337',
+  'foo_7338',
+  'foo_7339',
+  'foo_7340',
+  'foo_7341',
+  'foo_7342',
+  'foo_7343',
+  'foo_7344',
+  'foo_7345',
+  'foo_7346',
+  'foo_7347',
+  'foo_7348',
+  'foo_7349',
+  'foo_7350',
+  'foo_7351',
+  'foo_7352',
+  'foo_7353',
+  'foo_7354',
+  'foo_7355',
+  'foo_7356',
+  'foo_7357',
+  'foo_7358',
+  'foo_7359',
+  'foo_7360',
+  'foo_7361',
+  'foo_7362',
+  'foo_7363',
+  'foo_7364',
+  'foo_7365',
+  'foo_7366',
+  'foo_7367',
+  'foo_7368',
+  'foo_7369',
+  'foo_7370',
+  'foo_7371',
+  'foo_7372',
+  'foo_7373',
+  'foo_7374',
+  'foo_7375',
+  'foo_7376',
+  'foo_7377',
+  'foo_7378',
+  'foo_7379',
+  'foo_7380',
+  'foo_7381',
+  'foo_7382',
+  'foo_7383',
+  'foo_7384',
+  'foo_7385',
+  'foo_7386',
+  'foo_7387',
+  'foo_7388',
+  'foo_7389',
+  'foo_7390',
+  'foo_7391',
+  'foo_7392',
+  'foo_7393',
+  'foo_7394',
+  'foo_7395',
+  'foo_7396',
+  'foo_7397',
+  'foo_7398',
+  'foo_7399',
+  'foo_7400',
+  'foo_7401',
+  'foo_7402',
+  'foo_7403',
+  'foo_7404',
+  'foo_7405',
+  'foo_7406',
+  'foo_7407',
+  'foo_7408',
+  'foo_7409',
+  'foo_7410',
+  'foo_7411',
+  'foo_7412',
+  'foo_7413',
+  'foo_7414',
+  'foo_7415',
+  'foo_7416',
+  'foo_7417',
+  'foo_7418',
+  'foo_7419',
+  'foo_7420',
+  'foo_7421',
+  'foo_7422',
+  'foo_7423',
+  'foo_7424',
+  'foo_7425',
+  'foo_7426',
+  'foo_7427',
+  'foo_7428',
+  'foo_7429',
+  'foo_7430',
+  'foo_7431',
+  'foo_7432',
+  'foo_7433',
+  'foo_7434',
+  'foo_7435',
+  'foo_7436',
+  'foo_7437',
+  'foo_7438',
+  'foo_7439',
+  'foo_7440',
+  'foo_7441',
+  'foo_7442',
+  'foo_7443',
+  'foo_7444',
+  'foo_7445',
+  'foo_7446',
+  'foo_7447',
+  'foo_7448',
+  'foo_7449',
+  'foo_7450',
+  'foo_7451',
+  'foo_7452',
+  'foo_7453',
+  'foo_7454',
+  'foo_7455',
+  'foo_7456',
+  'foo_7457',
+  'foo_7458',
+  'foo_7459',
+  'foo_7460',
+  'foo_7461',
+  'foo_7462',
+  'foo_7463',
+  'foo_7464',
+  'foo_7465',
+  'foo_7466',
+  'foo_7467',
+  'foo_7468',
+  'foo_7469',
+  'foo_7470',
+  'foo_7471',
+  'foo_7472',
+  'foo_7473',
+  'foo_7474',
+  'foo_7475',
+  'foo_7476',
+  'foo_7477',
+  'foo_7478',
+  'foo_7479',
+  'foo_7480',
+  'foo_7481',
+  'foo_7482',
+  'foo_7483',
+  'foo_7484',
+  'foo_7485',
+  'foo_7486',
+  'foo_7487',
+  'foo_7488',
+  'foo_7489',
+  'foo_7490',
+  'foo_7491',
+  'foo_7492',
+  'foo_7493',
+  'foo_7494',
+  'foo_7495',
+  'foo_7496',
+  'foo_7497',
+  'foo_7498',
+  'foo_7499',
+  'foo_7500',
+  'foo_7501',
+  'foo_7502',
+  'foo_7503',
+  'foo_7504',
+  'foo_7505',
+  'foo_7506',
+  'foo_7507',
+  'foo_7508',
+  'foo_7509',
+  'foo_7510',
+  'foo_7511',
+  'foo_7512',
+  'foo_7513',
+  'foo_7514',
+  'foo_7515',
+  'foo_7516',
+  'foo_7517',
+  'foo_7518',
+  'foo_7519',
+  'foo_7520',
+  'foo_7521',
+  'foo_7522',
+  'foo_7523',
+  'foo_7524',
+  'foo_7525',
+  'foo_7526',
+  'foo_7527',
+  'foo_7528',
+  'foo_7529',
+  'foo_7530',
+  'foo_7531',
+  'foo_7532',
+  'foo_7533',
+  'foo_7534',
+  'foo_7535',
+  'foo_7536',
+  'foo_7537',
+  'foo_7538',
+  'foo_7539',
+  'foo_7540',
+  'foo_7541',
+  'foo_7542',
+  'foo_7543',
+  'foo_7544',
+  'foo_7545',
+  'foo_7546',
+  'foo_7547',
+  'foo_7548',
+  'foo_7549',
+  'foo_7550',
+  'foo_7551',
+  'foo_7552',
+  'foo_7553',
+  'foo_7554',
+  'foo_7555',
+  'foo_7556',
+  'foo_7557',
+  'foo_7558',
+  'foo_7559',
+  'foo_7560',
+  'foo_7561',
+  'foo_7562',
+  'foo_7563',
+  'foo_7564',
+  'foo_7565',
+  'foo_7566',
+  'foo_7567',
+  'foo_7568',
+  'foo_7569',
+  'foo_7570',
+  'foo_7571',
+  'foo_7572',
+  'foo_7573',
+  'foo_7574',
+  'foo_7575',
+  'foo_7576',
+  'foo_7577',
+  'foo_7578',
+  'foo_7579',
+  'foo_7580',
+  'foo_7581',
+  'foo_7582',
+  'foo_7583',
+  'foo_7584',
+  'foo_7585',
+  'foo_7586',
+  'foo_7587',
+  'foo_7588',
+  'foo_7589',
+  'foo_7590',
+  'foo_7591',
+  'foo_7592',
+  'foo_7593',
+  'foo_7594',
+  'foo_7595',
+  'foo_7596',
+  'foo_7597',
+  'foo_7598',
+  'foo_7599',
+  'foo_7600',
+  'foo_7601',
+  'foo_7602',
+  'foo_7603',
+  'foo_7604',
+  'foo_7605',
+  'foo_7606',
+  'foo_7607',
+  'foo_7608',
+  'foo_7609',
+  'foo_7610',
+  'foo_7611',
+  'foo_7612',
+  'foo_7613',
+  'foo_7614',
+  'foo_7615',
+  'foo_7616',
+  'foo_7617',
+  'foo_7618',
+  'foo_7619',
+  'foo_7620',
+  'foo_7621',
+  'foo_7622',
+  'foo_7623',
+  'foo_7624',
+  'foo_7625',
+  'foo_7626',
+  'foo_7627',
+  'foo_7628',
+  'foo_7629',
+  'foo_7630',
+  'foo_7631',
+  'foo_7632',
+  'foo_7633',
+  'foo_7634',
+  'foo_7635',
+  'foo_7636',
+  'foo_7637',
+  'foo_7638',
+  'foo_7639',
+  'foo_7640',
+  'foo_7641',
+  'foo_7642',
+  'foo_7643',
+  'foo_7644',
+  'foo_7645',
+  'foo_7646',
+  'foo_7647',
+  'foo_7648',
+  'foo_7649',
+  'foo_7650',
+  'foo_7651',
+  'foo_7652',
+  'foo_7653',
+  'foo_7654',
+  'foo_7655',
+  'foo_7656',
+  'foo_7657',
+  'foo_7658',
+  'foo_7659',
+  'foo_7660',
+  'foo_7661',
+  'foo_7662',
+  'foo_7663',
+  'foo_7664',
+  'foo_7665',
+  'foo_7666',
+  'foo_7667',
+  'foo_7668',
+  'foo_7669',
+  'foo_7670',
+  'foo_7671',
+  'foo_7672',
+  'foo_7673',
+  'foo_7674',
+  'foo_7675',
+  'foo_7676',
+  'foo_7677',
+  'foo_7678',
+  'foo_7679',
+  'foo_7680',
+  'foo_7681',
+  'foo_7682',
+  'foo_7683',
+  'foo_7684',
+  'foo_7685',
+  'foo_7686',
+  'foo_7687',
+  'foo_7688',
+  'foo_7689',
+  'foo_7690',
+  'foo_7691',
+  'foo_7692',
+  'foo_7693',
+  'foo_7694',
+  'foo_7695',
+  'foo_7696',
+  'foo_7697',
+  'foo_7698',
+  'foo_7699',
+  'foo_7700',
+  'foo_7701',
+  'foo_7702',
+  'foo_7703',
+  'foo_7704',
+  'foo_7705',
+  'foo_7706',
+  'foo_7707',
+  'foo_7708',
+  'foo_7709',
+  'foo_7710',
+  'foo_7711',
+  'foo_7712',
+  'foo_7713',
+  'foo_7714',
+  'foo_7715',
+  'foo_7716',
+  'foo_7717',
+  'foo_7718',
+  'foo_7719',
+  'foo_7720',
+  'foo_7721',
+  'foo_7722',
+  'foo_7723',
+  'foo_7724',
+  'foo_7725',
+  'foo_7726',
+  'foo_7727',
+  'foo_7728',
+  'foo_7729',
+  'foo_7730',
+  'foo_7731',
+  'foo_7732',
+  'foo_7733',
+  'foo_7734',
+  'foo_7735',
+  'foo_7736',
+  'foo_7737',
+  'foo_7738',
+  'foo_7739',
+  'foo_7740',
+  'foo_7741',
+  'foo_7742',
+  'foo_7743',
+  'foo_7744',
+  'foo_7745',
+  'foo_7746',
+  'foo_7747',
+  'foo_7748',
+  'foo_7749',
+  'foo_7750',
+  'foo_7751',
+  'foo_7752',
+  'foo_7753',
+  'foo_7754',
+  'foo_7755',
+  'foo_7756',
+  'foo_7757',
+  'foo_7758',
+  'foo_7759',
+  'foo_7760',
+  'foo_7761',
+  'foo_7762',
+  'foo_7763',
+  'foo_7764',
+  'foo_7765',
+  'foo_7766',
+  'foo_7767',
+  'foo_7768',
+  'foo_7769',
+  'foo_7770',
+  'foo_7771',
+  'foo_7772',
+  'foo_7773',
+  'foo_7774',
+  'foo_7775',
+  'foo_7776',
+  'foo_7777',
+  'foo_7778',
+  'foo_7779',
+  'foo_7780',
+  'foo_7781',
+  'foo_7782',
+  'foo_7783',
+  'foo_7784',
+  'foo_7785',
+  'foo_7786',
+  'foo_7787',
+  'foo_7788',
+  'foo_7789',
+  'foo_7790',
+  'foo_7791',
+  'foo_7792',
+  'foo_7793',
+  'foo_7794',
+  'foo_7795',
+  'foo_7796',
+  'foo_7797',
+  'foo_7798',
+  'foo_7799',
+  'foo_7800',
+  'foo_7801',
+  'foo_7802',
+  'foo_7803',
+  'foo_7804',
+  'foo_7805',
+  'foo_7806',
+  'foo_7807',
+  'foo_7808',
+  'foo_7809',
+  'foo_7810',
+  'foo_7811',
+  'foo_7812',
+  'foo_7813',
+  'foo_7814',
+  'foo_7815',
+  'foo_7816',
+  'foo_7817',
+  'foo_7818',
+  'foo_7819',
+  'foo_7820',
+  'foo_7821',
+  'foo_7822',
+  'foo_7823',
+  'foo_7824',
+  'foo_7825',
+  'foo_7826',
+  'foo_7827',
+  'foo_7828',
+  'foo_7829',
+  'foo_7830',
+  'foo_7831',
+  'foo_7832',
+  'foo_7833',
+  'foo_7834',
+  'foo_7835',
+  'foo_7836',
+  'foo_7837',
+  'foo_7838',
+  'foo_7839',
+  'foo_7840',
+  'foo_7841',
+  'foo_7842',
+  'foo_7843',
+  'foo_7844',
+  'foo_7845',
+  'foo_7846',
+  'foo_7847',
+  'foo_7848',
+  'foo_7849',
+  'foo_7850',
+  'foo_7851',
+  'foo_7852',
+  'foo_7853',
+  'foo_7854',
+  'foo_7855',
+  'foo_7856',
+  'foo_7857',
+  'foo_7858',
+  'foo_7859',
+  'foo_7860',
+  'foo_7861',
+  'foo_7862',
+  'foo_7863',
+  'foo_7864',
+  'foo_7865',
+  'foo_7866',
+  'foo_7867',
+  'foo_7868',
+  'foo_7869',
+  'foo_7870',
+  'foo_7871',
+  'foo_7872',
+  'foo_7873',
+  'foo_7874',
+  'foo_7875',
+  'foo_7876',
+  'foo_7877',
+  'foo_7878',
+  'foo_7879',
+  'foo_7880',
+  'foo_7881',
+  'foo_7882',
+  'foo_7883',
+  'foo_7884',
+  'foo_7885',
+  'foo_7886',
+  'foo_7887',
+  'foo_7888',
+  'foo_7889',
+  'foo_7890',
+  'foo_7891',
+  'foo_7892',
+  'foo_7893',
+  'foo_7894',
+  'foo_7895',
+  'foo_7896',
+  'foo_7897',
+  'foo_7898',
+  'foo_7899',
+  'foo_7900',
+  'foo_7901',
+  'foo_7902',
+  'foo_7903',
+  'foo_7904',
+  'foo_7905',
+  'foo_7906',
+  'foo_7907',
+  'foo_7908',
+  'foo_7909',
+  'foo_7910',
+  'foo_7911',
+  'foo_7912',
+  'foo_7913',
+  'foo_7914',
+  'foo_7915',
+  'foo_7916',
+  'foo_7917',
+  'foo_7918',
+  'foo_7919',
+  'foo_7920',
+  'foo_7921',
+  'foo_7922',
+  'foo_7923',
+  'foo_7924',
+  'foo_7925',
+  'foo_7926',
+  'foo_7927',
+  'foo_7928',
+  'foo_7929',
+  'foo_7930',
+  'foo_7931',
+  'foo_7932',
+  'foo_7933',
+  'foo_7934',
+  'foo_7935',
+  'foo_7936',
+  'foo_7937',
+  'foo_7938',
+  'foo_7939',
+  'foo_7940',
+  'foo_7941',
+  'foo_7942',
+  'foo_7943',
+  'foo_7944',
+  'foo_7945',
+  'foo_7946',
+  'foo_7947',
+  'foo_7948',
+  'foo_7949',
+  'foo_7950',
+  'foo_7951',
+  'foo_7952',
+  'foo_7953',
+  'foo_7954',
+  'foo_7955',
+  'foo_7956',
+  'foo_7957',
+  'foo_7958',
+  'foo_7959',
+  'foo_7960',
+  'foo_7961',
+  'foo_7962',
+  'foo_7963',
+  'foo_7964',
+  'foo_7965',
+  'foo_7966',
+  'foo_7967',
+  'foo_7968',
+  'foo_7969',
+  'foo_7970',
+  'foo_7971',
+  'foo_7972',
+  'foo_7973',
+  'foo_7974',
+  'foo_7975',
+  'foo_7976',
+  'foo_7977',
+  'foo_7978',
+  'foo_7979',
+  'foo_7980',
+  'foo_7981',
+  'foo_7982',
+  'foo_7983',
+  'foo_7984',
+  'foo_7985',
+  'foo_7986',
+  'foo_7987',
+  'foo_7988',
+  'foo_7989',
+  'foo_7990',
+  'foo_7991',
+  'foo_7992',
+  'foo_7993',
+  'foo_7994',
+  'foo_7995',
+  'foo_7996',
+  'foo_7997',
+  'foo_7998',
+  'foo_7999',
+  'foo_8000',
+  'foo_8001',
+  'foo_8002',
+  'foo_8003',
+  'foo_8004',
+  'foo_8005',
+  'foo_8006',
+  'foo_8007',
+  'foo_8008',
+  'foo_8009',
+  'foo_8010',
+  'foo_8011',
+  'foo_8012',
+  'foo_8013',
+  'foo_8014',
+  'foo_8015',
+  'foo_8016',
+  'foo_8017',
+  'foo_8018',
+  'foo_8019',
+  'foo_8020',
+  'foo_8021',
+  'foo_8022',
+  'foo_8023',
+  'foo_8024',
+  'foo_8025',
+  'foo_8026',
+  'foo_8027',
+  'foo_8028',
+  'foo_8029',
+  'foo_8030',
+  'foo_8031',
+  'foo_8032',
+  'foo_8033',
+  'foo_8034',
+  'foo_8035',
+  'foo_8036',
+  'foo_8037',
+  'foo_8038',
+  'foo_8039',
+  'foo_8040',
+  'foo_8041',
+  'foo_8042',
+  'foo_8043',
+  'foo_8044',
+  'foo_8045',
+  'foo_8046',
+  'foo_8047',
+  'foo_8048',
+  'foo_8049',
+  'foo_8050',
+  'foo_8051',
+  'foo_8052',
+  'foo_8053',
+  'foo_8054',
+  'foo_8055',
+  'foo_8056',
+  'foo_8057',
+  'foo_8058',
+  'foo_8059',
+  'foo_8060',
+  'foo_8061',
+  'foo_8062',
+  'foo_8063',
+  'foo_8064',
+  'foo_8065',
+  'foo_8066',
+  'foo_8067',
+  'foo_8068',
+  'foo_8069',
+  'foo_8070',
+  'foo_8071',
+  'foo_8072',
+  'foo_8073',
+  'foo_8074',
+  'foo_8075',
+  'foo_8076',
+  'foo_8077',
+  'foo_8078',
+  'foo_8079',
+  'foo_8080',
+  'foo_8081',
+  'foo_8082',
+  'foo_8083',
+  'foo_8084',
+  'foo_8085',
+  'foo_8086',
+  'foo_8087',
+  'foo_8088',
+  'foo_8089',
+  'foo_8090',
+  'foo_8091',
+  'foo_8092',
+  'foo_8093',
+  'foo_8094',
+  'foo_8095',
+  'foo_8096',
+  'foo_8097',
+  'foo_8098',
+  'foo_8099',
+  'foo_8100',
+  'foo_8101',
+  'foo_8102',
+  'foo_8103',
+  'foo_8104',
+  'foo_8105',
+  'foo_8106',
+  'foo_8107',
+  'foo_8108',
+  'foo_8109',
+  'foo_8110',
+  'foo_8111',
+  'foo_8112',
+  'foo_8113',
+  'foo_8114',
+  'foo_8115',
+  'foo_8116',
+  'foo_8117',
+  'foo_8118',
+  'foo_8119',
+  'foo_8120',
+  'foo_8121',
+  'foo_8122',
+  'foo_8123',
+  'foo_8124',
+  'foo_8125',
+  'foo_8126',
+  'foo_8127',
+  'foo_8128',
+  'foo_8129',
+  'foo_8130',
+  'foo_8131',
+  'foo_8132',
+  'foo_8133',
+  'foo_8134',
+  'foo_8135',
+  'foo_8136',
+  'foo_8137',
+  'foo_8138',
+  'foo_8139',
+  'foo_8140',
+  'foo_8141',
+  'foo_8142',
+  'foo_8143',
+  'foo_8144',
+  'foo_8145',
+  'foo_8146',
+  'foo_8147',
+  'foo_8148',
+  'foo_8149',
+  'foo_8150',
+  'foo_8151',
+  'foo_8152',
+  'foo_8153',
+  'foo_8154',
+  'foo_8155',
+  'foo_8156',
+  'foo_8157',
+  'foo_8158',
+  'foo_8159',
+  'foo_8160',
+  'foo_8161',
+  'foo_8162',
+  'foo_8163',
+  'foo_8164',
+  'foo_8165',
+  'foo_8166',
+  'foo_8167',
+  'foo_8168',
+  'foo_8169',
+  'foo_8170',
+  'foo_8171',
+  'foo_8172',
+  'foo_8173',
+  'foo_8174',
+  'foo_8175',
+  'foo_8176',
+  'foo_8177',
+  'foo_8178',
+  'foo_8179',
+  'foo_8180',
+  'foo_8181',
+  'foo_8182',
+  'foo_8183',
+  'foo_8184',
+  'foo_8185',
+  'foo_8186',
+  'foo_8187',
+  'foo_8188',
+  'foo_8189',
+  'foo_8190',
+  'foo_8191',
+  'foo_8192',
+  'foo_8193',
+  'foo_8194',
+  'foo_8195',
+  'foo_8196',
+  'foo_8197',
+  'foo_8198',
+  'foo_8199',
+  'foo_8200',
+  'foo_8201',
+  'foo_8202',
+  'foo_8203',
+  'foo_8204',
+  'foo_8205',
+  'foo_8206',
+  'foo_8207',
+  'foo_8208',
+  'foo_8209',
+  'foo_8210',
+  'foo_8211',
+  'foo_8212',
+  'foo_8213',
+  'foo_8214',
+  'foo_8215',
+  'foo_8216',
+  'foo_8217',
+  'foo_8218',
+  'foo_8219',
+  'foo_8220',
+  'foo_8221',
+  'foo_8222',
+  'foo_8223',
+  'foo_8224',
+  'foo_8225',
+  'foo_8226',
+  'foo_8227',
+  'foo_8228',
+  'foo_8229',
+  'foo_8230',
+  'foo_8231',
+  'foo_8232',
+  'foo_8233',
+  'foo_8234',
+  'foo_8235',
+  'foo_8236',
+  'foo_8237',
+  'foo_8238',
+  'foo_8239',
+  'foo_8240',
+  'foo_8241',
+  'foo_8242',
+  'foo_8243',
+  'foo_8244',
+  'foo_8245',
+  'foo_8246',
+  'foo_8247',
+  'foo_8248',
+  'foo_8249',
+  'foo_8250',
+  'foo_8251',
+  'foo_8252',
+  'foo_8253',
+  'foo_8254',
+  'foo_8255',
+  'foo_8256',
+  'foo_8257',
+  'foo_8258',
+  'foo_8259',
+  'foo_8260',
+  'foo_8261',
+  'foo_8262',
+  'foo_8263',
+  'foo_8264',
+  'foo_8265',
+  'foo_8266',
+  'foo_8267',
+  'foo_8268',
+  'foo_8269',
+  'foo_8270',
+  'foo_8271',
+  'foo_8272',
+  'foo_8273',
+  'foo_8274',
+  'foo_8275',
+  'foo_8276',
+  'foo_8277',
+  'foo_8278',
+  'foo_8279',
+  'foo_8280',
+  'foo_8281',
+  'foo_8282',
+  'foo_8283',
+  'foo_8284',
+  'foo_8285',
+  'foo_8286',
+  'foo_8287',
+  'foo_8288',
+  'foo_8289',
+  'foo_8290',
+  'foo_8291',
+  'foo_8292',
+  'foo_8293',
+  'foo_8294',
+  'foo_8295',
+  'foo_8296',
+  'foo_8297',
+  'foo_8298',
+  'foo_8299',
+  'foo_8300',
+  'foo_8301',
+  'foo_8302',
+  'foo_8303',
+  'foo_8304',
+  'foo_8305',
+  'foo_8306',
+  'foo_8307',
+  'foo_8308',
+  'foo_8309',
+  'foo_8310',
+  'foo_8311',
+  'foo_8312',
+  'foo_8313',
+  'foo_8314',
+  'foo_8315',
+  'foo_8316',
+  'foo_8317',
+  'foo_8318',
+  'foo_8319',
+  'foo_8320',
+  'foo_8321',
+  'foo_8322',
+  'foo_8323',
+  'foo_8324',
+  'foo_8325',
+  'foo_8326',
+  'foo_8327',
+  'foo_8328',
+  'foo_8329',
+  'foo_8330',
+  'foo_8331',
+  'foo_8332',
+  'foo_8333',
+  'foo_8334',
+  'foo_8335',
+  'foo_8336',
+  'foo_8337',
+  'foo_8338',
+  'foo_8339',
+  'foo_8340',
+  'foo_8341',
+  'foo_8342',
+  'foo_8343',
+  'foo_8344',
+  'foo_8345',
+  'foo_8346',
+  'foo_8347',
+  'foo_8348',
+  'foo_8349',
+  'foo_8350',
+  'foo_8351',
+  'foo_8352',
+  'foo_8353',
+  'foo_8354',
+  'foo_8355',
+  'foo_8356',
+  'foo_8357',
+  'foo_8358',
+  'foo_8359',
+  'foo_8360',
+  'foo_8361',
+  'foo_8362',
+  'foo_8363',
+  'foo_8364',
+  'foo_8365',
+  'foo_8366',
+  'foo_8367',
+  'foo_8368',
+  'foo_8369',
+  'foo_8370',
+  'foo_8371',
+  'foo_8372',
+  'foo_8373',
+  'foo_8374',
+  'foo_8375',
+  'foo_8376',
+  'foo_8377',
+  'foo_8378',
+  'foo_8379',
+  'foo_8380',
+  'foo_8381',
+  'foo_8382',
+  'foo_8383',
+  'foo_8384',
+  'foo_8385',
+  'foo_8386',
+  'foo_8387',
+  'foo_8388',
+  'foo_8389',
+  'foo_8390',
+  'foo_8391',
+  'foo_8392',
+  'foo_8393',
+  'foo_8394',
+  'foo_8395',
+  'foo_8396',
+  'foo_8397',
+  'foo_8398',
+  'foo_8399',
+  'foo_8400',
+  'foo_8401',
+  'foo_8402',
+  'foo_8403',
+  'foo_8404',
+  'foo_8405',
+  'foo_8406',
+  'foo_8407',
+  'foo_8408',
+  'foo_8409',
+  'foo_8410',
+  'foo_8411',
+  'foo_8412',
+  'foo_8413',
+  'foo_8414',
+  'foo_8415',
+  'foo_8416',
+  'foo_8417',
+  'foo_8418',
+  'foo_8419',
+  'foo_8420',
+  'foo_8421',
+  'foo_8422',
+  'foo_8423',
+  'foo_8424',
+  'foo_8425',
+  'foo_8426',
+  'foo_8427',
+  'foo_8428',
+  'foo_8429',
+  'foo_8430',
+  'foo_8431',
+  'foo_8432',
+  'foo_8433',
+  'foo_8434',
+  'foo_8435',
+  'foo_8436',
+  'foo_8437',
+  'foo_8438',
+  'foo_8439',
+  'foo_8440',
+  'foo_8441',
+  'foo_8442',
+  'foo_8443',
+  'foo_8444',
+  'foo_8445',
+  'foo_8446',
+  'foo_8447',
+  'foo_8448',
+  'foo_8449',
+  'foo_8450',
+  'foo_8451',
+  'foo_8452',
+  'foo_8453',
+  'foo_8454',
+  'foo_8455',
+  'foo_8456',
+  'foo_8457',
+  'foo_8458',
+  'foo_8459',
+  'foo_8460',
+  'foo_8461',
+  'foo_8462',
+  'foo_8463',
+  'foo_8464',
+  'foo_8465',
+  'foo_8466',
+  'foo_8467',
+  'foo_8468',
+  'foo_8469',
+  'foo_8470',
+  'foo_8471',
+  'foo_8472',
+  'foo_8473',
+  'foo_8474',
+  'foo_8475',
+  'foo_8476',
+  'foo_8477',
+  'foo_8478',
+  'foo_8479',
+  'foo_8480',
+  'foo_8481',
+  'foo_8482',
+  'foo_8483',
+  'foo_8484',
+  'foo_8485',
+  'foo_8486',
+  'foo_8487',
+  'foo_8488',
+  'foo_8489',
+  'foo_8490',
+  'foo_8491',
+  'foo_8492',
+  'foo_8493',
+  'foo_8494',
+  'foo_8495',
+  'foo_8496',
+  'foo_8497',
+  'foo_8498',
+  'foo_8499',
+  'foo_8500',
+  'foo_8501',
+  'foo_8502',
+  'foo_8503',
+  'foo_8504',
+  'foo_8505',
+  'foo_8506',
+  'foo_8507',
+  'foo_8508',
+  'foo_8509',
+  'foo_8510',
+  'foo_8511',
+  'foo_8512',
+  'foo_8513',
+  'foo_8514',
+  'foo_8515',
+  'foo_8516',
+  'foo_8517',
+  'foo_8518',
+  'foo_8519',
+  'foo_8520',
+  'foo_8521',
+  'foo_8522',
+  'foo_8523',
+  'foo_8524',
+  'foo_8525',
+  'foo_8526',
+  'foo_8527',
+  'foo_8528',
+  'foo_8529',
+  'foo_8530',
+  'foo_8531',
+  'foo_8532',
+  'foo_8533',
+  'foo_8534',
+  'foo_8535',
+  'foo_8536',
+  'foo_8537',
+  'foo_8538',
+  'foo_8539',
+  'foo_8540',
+  'foo_8541',
+  'foo_8542',
+  'foo_8543',
+  'foo_8544',
+  'foo_8545',
+  'foo_8546',
+  'foo_8547',
+  'foo_8548',
+  'foo_8549',
+  'foo_8550',
+  'foo_8551',
+  'foo_8552',
+  'foo_8553',
+  'foo_8554',
+  'foo_8555',
+  'foo_8556',
+  'foo_8557',
+  'foo_8558',
+  'foo_8559',
+  'foo_8560',
+  'foo_8561',
+  'foo_8562',
+  'foo_8563',
+  'foo_8564',
+  'foo_8565',
+  'foo_8566',
+  'foo_8567',
+  'foo_8568',
+  'foo_8569',
+  'foo_8570',
+  'foo_8571',
+  'foo_8572',
+  'foo_8573',
+  'foo_8574',
+  'foo_8575',
+  'foo_8576',
+  'foo_8577',
+  'foo_8578',
+  'foo_8579',
+  'foo_8580',
+  'foo_8581',
+  'foo_8582',
+  'foo_8583',
+  'foo_8584',
+  'foo_8585',
+  'foo_8586',
+  'foo_8587',
+  'foo_8588',
+  'foo_8589',
+  'foo_8590',
+  'foo_8591',
+  'foo_8592',
+  'foo_8593',
+  'foo_8594',
+  'foo_8595',
+  'foo_8596',
+  'foo_8597',
+  'foo_8598',
+  'foo_8599',
+  'foo_8600',
+  'foo_8601',
+  'foo_8602',
+  'foo_8603',
+  'foo_8604',
+  'foo_8605',
+  'foo_8606',
+  'foo_8607',
+  'foo_8608',
+  'foo_8609',
+  'foo_8610',
+  'foo_8611',
+  'foo_8612',
+  'foo_8613',
+  'foo_8614',
+  'foo_8615',
+  'foo_8616',
+  'foo_8617',
+  'foo_8618',
+  'foo_8619',
+  'foo_8620',
+  'foo_8621',
+  'foo_8622',
+  'foo_8623',
+  'foo_8624',
+  'foo_8625',
+  'foo_8626',
+  'foo_8627',
+  'foo_8628',
+  'foo_8629',
+  'foo_8630',
+  'foo_8631',
+  'foo_8632',
+  'foo_8633',
+  'foo_8634',
+  'foo_8635',
+  'foo_8636',
+  'foo_8637',
+  'foo_8638',
+  'foo_8639',
+  'foo_8640',
+  'foo_8641',
+  'foo_8642',
+  'foo_8643',
+  'foo_8644',
+  'foo_8645',
+  'foo_8646',
+  'foo_8647',
+  'foo_8648',
+  'foo_8649',
+  'foo_8650',
+  'foo_8651',
+  'foo_8652',
+  'foo_8653',
+  'foo_8654',
+  'foo_8655',
+  'foo_8656',
+  'foo_8657',
+  'foo_8658',
+  'foo_8659',
+  'foo_8660',
+  'foo_8661',
+  'foo_8662',
+  'foo_8663',
+  'foo_8664',
+  'foo_8665',
+  'foo_8666',
+  'foo_8667',
+  'foo_8668',
+  'foo_8669',
+  'foo_8670',
+  'foo_8671',
+  'foo_8672',
+  'foo_8673',
+  'foo_8674',
+  'foo_8675',
+  'foo_8676',
+  'foo_8677',
+  'foo_8678',
+  'foo_8679',
+  'foo_8680',
+  'foo_8681',
+  'foo_8682',
+  'foo_8683',
+  'foo_8684',
+  'foo_8685',
+  'foo_8686',
+  'foo_8687',
+  'foo_8688',
+  'foo_8689',
+  'foo_8690',
+  'foo_8691',
+  'foo_8692',
+  'foo_8693',
+  'foo_8694',
+  'foo_8695',
+  'foo_8696',
+  'foo_8697',
+  'foo_8698',
+  'foo_8699',
+  'foo_8700',
+  'foo_8701',
+  'foo_8702',
+  'foo_8703',
+  'foo_8704',
+  'foo_8705',
+  'foo_8706',
+  'foo_8707',
+  'foo_8708',
+  'foo_8709',
+  'foo_8710',
+  'foo_8711',
+  'foo_8712',
+  'foo_8713',
+  'foo_8714',
+  'foo_8715',
+  'foo_8716',
+  'foo_8717',
+  'foo_8718',
+  'foo_8719',
+  'foo_8720',
+  'foo_8721',
+  'foo_8722',
+  'foo_8723',
+  'foo_8724',
+  'foo_8725',
+  'foo_8726',
+  'foo_8727',
+  'foo_8728',
+  'foo_8729',
+  'foo_8730',
+  'foo_8731',
+  'foo_8732',
+  'foo_8733',
+  'foo_8734',
+  'foo_8735',
+  'foo_8736',
+  'foo_8737',
+  'foo_8738',
+  'foo_8739',
+  'foo_8740',
+  'foo_8741',
+  'foo_8742',
+  'foo_8743',
+  'foo_8744',
+  'foo_8745',
+  'foo_8746',
+  'foo_8747',
+  'foo_8748',
+  'foo_8749',
+  'foo_8750',
+  'foo_8751',
+  'foo_8752',
+  'foo_8753',
+  'foo_8754',
+  'foo_8755',
+  'foo_8756',
+  'foo_8757',
+  'foo_8758',
+  'foo_8759',
+  'foo_8760',
+  'foo_8761',
+  'foo_8762',
+  'foo_8763',
+  'foo_8764',
+  'foo_8765',
+  'foo_8766',
+  'foo_8767',
+  'foo_8768',
+  'foo_8769',
+  'foo_8770',
+  'foo_8771',
+  'foo_8772',
+  'foo_8773',
+  'foo_8774',
+  'foo_8775',
+  'foo_8776',
+  'foo_8777',
+  'foo_8778',
+  'foo_8779',
+  'foo_8780',
+  'foo_8781',
+  'foo_8782',
+  'foo_8783',
+  'foo_8784',
+  'foo_8785',
+  'foo_8786',
+  'foo_8787',
+  'foo_8788',
+  'foo_8789',
+  'foo_8790',
+  'foo_8791',
+  'foo_8792',
+  'foo_8793',
+  'foo_8794',
+  'foo_8795',
+  'foo_8796',
+  'foo_8797',
+  'foo_8798',
+  'foo_8799',
+  'foo_8800',
+  'foo_8801',
+  'foo_8802',
+  'foo_8803',
+  'foo_8804',
+  'foo_8805',
+  'foo_8806',
+  'foo_8807',
+  'foo_8808',
+  'foo_8809',
+  'foo_8810',
+  'foo_8811',
+  'foo_8812',
+  'foo_8813',
+  'foo_8814',
+  'foo_8815',
+  'foo_8816',
+  'foo_8817',
+  'foo_8818',
+  'foo_8819',
+  'foo_8820',
+  'foo_8821',
+  'foo_8822',
+  'foo_8823',
+  'foo_8824',
+  'foo_8825',
+  'foo_8826',
+  'foo_8827',
+  'foo_8828',
+  'foo_8829',
+  'foo_8830',
+  'foo_8831',
+  'foo_8832',
+  'foo_8833',
+  'foo_8834',
+  'foo_8835',
+  'foo_8836',
+  'foo_8837',
+  'foo_8838',
+  'foo_8839',
+  'foo_8840',
+  'foo_8841',
+  'foo_8842',
+  'foo_8843',
+  'foo_8844',
+  'foo_8845',
+  'foo_8846',
+  'foo_8847',
+  'foo_8848',
+  'foo_8849',
+  'foo_8850',
+  'foo_8851',
+  'foo_8852',
+  'foo_8853',
+  'foo_8854',
+  'foo_8855',
+  'foo_8856',
+  'foo_8857',
+  'foo_8858',
+  'foo_8859',
+  'foo_8860',
+  'foo_8861',
+  'foo_8862',
+  'foo_8863',
+  'foo_8864',
+  'foo_8865',
+  'foo_8866',
+  'foo_8867',
+  'foo_8868',
+  'foo_8869',
+  'foo_8870',
+  'foo_8871',
+  'foo_8872',
+  'foo_8873',
+  'foo_8874',
+  'foo_8875',
+  'foo_8876',
+  'foo_8877',
+  'foo_8878',
+  'foo_8879',
+  'foo_8880',
+  'foo_8881',
+  'foo_8882',
+  'foo_8883',
+  'foo_8884',
+  'foo_8885',
+  'foo_8886',
+  'foo_8887',
+  'foo_8888',
+  'foo_8889',
+  'foo_8890',
+  'foo_8891',
+  'foo_8892',
+  'foo_8893',
+  'foo_8894',
+  'foo_8895',
+  'foo_8896',
+  'foo_8897',
+  'foo_8898',
+  'foo_8899',
+  'foo_8900',
+  'foo_8901',
+  'foo_8902',
+  'foo_8903',
+  'foo_8904',
+  'foo_8905',
+  'foo_8906',
+  'foo_8907',
+  'foo_8908',
+  'foo_8909',
+  'foo_8910',
+  'foo_8911',
+  'foo_8912',
+  'foo_8913',
+  'foo_8914',
+  'foo_8915',
+  'foo_8916',
+  'foo_8917',
+  'foo_8918',
+  'foo_8919',
+  'foo_8920',
+  'foo_8921',
+  'foo_8922',
+  'foo_8923',
+  'foo_8924',
+  'foo_8925',
+  'foo_8926',
+  'foo_8927',
+  'foo_8928',
+  'foo_8929',
+  'foo_8930',
+  'foo_8931',
+  'foo_8932',
+  'foo_8933',
+  'foo_8934',
+  'foo_8935',
+  'foo_8936',
+  'foo_8937',
+  'foo_8938',
+  'foo_8939',
+  'foo_8940',
+  'foo_8941',
+  'foo_8942',
+  'foo_8943',
+  'foo_8944',
+  'foo_8945',
+  'foo_8946',
+  'foo_8947',
+  'foo_8948',
+  'foo_8949',
+  'foo_8950',
+  'foo_8951',
+  'foo_8952',
+  'foo_8953',
+  'foo_8954',
+  'foo_8955',
+  'foo_8956',
+  'foo_8957',
+  'foo_8958',
+  'foo_8959',
+  'foo_8960',
+  'foo_8961',
+  'foo_8962',
+  'foo_8963',
+  'foo_8964',
+  'foo_8965',
+  'foo_8966',
+  'foo_8967',
+  'foo_8968',
+  'foo_8969',
+  'foo_8970',
+  'foo_8971',
+  'foo_8972',
+  'foo_8973',
+  'foo_8974',
+  'foo_8975',
+  'foo_8976',
+  'foo_8977',
+  'foo_8978',
+  'foo_8979',
+  'foo_8980',
+  'foo_8981',
+  'foo_8982',
+  'foo_8983',
+  'foo_8984',
+  'foo_8985',
+  'foo_8986',
+  'foo_8987',
+  'foo_8988',
+  'foo_8989',
+  'foo_8990',
+  'foo_8991',
+  'foo_8992',
+  'foo_8993',
+  'foo_8994',
+  'foo_8995',
+  'foo_8996',
+  'foo_8997',
+  'foo_8998',
+  'foo_8999',
+  'foo_9000',
+  'foo_9001',
+  'foo_9002',
+  'foo_9003',
+  'foo_9004',
+  'foo_9005',
+  'foo_9006',
+  'foo_9007',
+  'foo_9008',
+  'foo_9009',
+  'foo_9010',
+  'foo_9011',
+  'foo_9012',
+  'foo_9013',
+  'foo_9014',
+  'foo_9015',
+  'foo_9016',
+  'foo_9017',
+  'foo_9018',
+  'foo_9019',
+  'foo_9020',
+  'foo_9021',
+  'foo_9022',
+  'foo_9023',
+  'foo_9024',
+  'foo_9025',
+  'foo_9026',
+  'foo_9027',
+  'foo_9028',
+  'foo_9029',
+  'foo_9030',
+  'foo_9031',
+  'foo_9032',
+  'foo_9033',
+  'foo_9034',
+  'foo_9035',
+  'foo_9036',
+  'foo_9037',
+  'foo_9038',
+  'foo_9039',
+  'foo_9040',
+  'foo_9041',
+  'foo_9042',
+  'foo_9043',
+  'foo_9044',
+  'foo_9045',
+  'foo_9046',
+  'foo_9047',
+  'foo_9048',
+  'foo_9049',
+  'foo_9050',
+  'foo_9051',
+  'foo_9052',
+  'foo_9053',
+  'foo_9054',
+  'foo_9055',
+  'foo_9056',
+  'foo_9057',
+  'foo_9058',
+  'foo_9059',
+  'foo_9060',
+  'foo_9061',
+  'foo_9062',
+  'foo_9063',
+  'foo_9064',
+  'foo_9065',
+  'foo_9066',
+  'foo_9067',
+  'foo_9068',
+  'foo_9069',
+  'foo_9070',
+  'foo_9071',
+  'foo_9072',
+  'foo_9073',
+  'foo_9074',
+  'foo_9075',
+  'foo_9076',
+  'foo_9077',
+  'foo_9078',
+  'foo_9079',
+  'foo_9080',
+  'foo_9081',
+  'foo_9082',
+  'foo_9083',
+  'foo_9084',
+  'foo_9085',
+  'foo_9086',
+  'foo_9087',
+  'foo_9088',
+  'foo_9089',
+  'foo_9090',
+  'foo_9091',
+  'foo_9092',
+  'foo_9093',
+  'foo_9094',
+  'foo_9095',
+  'foo_9096',
+  'foo_9097',
+  'foo_9098',
+  'foo_9099',
+  'foo_9100',
+  'foo_9101',
+  'foo_9102',
+  'foo_9103',
+  'foo_9104',
+  'foo_9105',
+  'foo_9106',
+  'foo_9107',
+  'foo_9108',
+  'foo_9109',
+  'foo_9110',
+  'foo_9111',
+  'foo_9112',
+  'foo_9113',
+  'foo_9114',
+  'foo_9115',
+  'foo_9116',
+  'foo_9117',
+  'foo_9118',
+  'foo_9119',
+  'foo_9120',
+  'foo_9121',
+  'foo_9122',
+  'foo_9123',
+  'foo_9124',
+  'foo_9125',
+  'foo_9126',
+  'foo_9127',
+  'foo_9128',
+  'foo_9129',
+  'foo_9130',
+  'foo_9131',
+  'foo_9132',
+  'foo_9133',
+  'foo_9134',
+  'foo_9135',
+  'foo_9136',
+  'foo_9137',
+  'foo_9138',
+  'foo_9139',
+  'foo_9140',
+  'foo_9141',
+  'foo_9142',
+  'foo_9143',
+  'foo_9144',
+  'foo_9145',
+  'foo_9146',
+  'foo_9147',
+  'foo_9148',
+  'foo_9149',
+  'foo_9150',
+  'foo_9151',
+  'foo_9152',
+  'foo_9153',
+  'foo_9154',
+  'foo_9155',
+  'foo_9156',
+  'foo_9157',
+  'foo_9158',
+  'foo_9159',
+  'foo_9160',
+  'foo_9161',
+  'foo_9162',
+  'foo_9163',
+  'foo_9164',
+  'foo_9165',
+  'foo_9166',
+  'foo_9167',
+  'foo_9168',
+  'foo_9169',
+  'foo_9170',
+  'foo_9171',
+  'foo_9172',
+  'foo_9173',
+  'foo_9174',
+  'foo_9175',
+  'foo_9176',
+  'foo_9177',
+  'foo_9178',
+  'foo_9179',
+  'foo_9180',
+  'foo_9181',
+  'foo_9182',
+  'foo_9183',
+  'foo_9184',
+  'foo_9185',
+  'foo_9186',
+  'foo_9187',
+  'foo_9188',
+  'foo_9189',
+  'foo_9190',
+  'foo_9191',
+  'foo_9192',
+  'foo_9193',
+  'foo_9194',
+  'foo_9195',
+  'foo_9196',
+  'foo_9197',
+  'foo_9198',
+  'foo_9199',
+  'foo_9200',
+  'foo_9201',
+  'foo_9202',
+  'foo_9203',
+  'foo_9204',
+  'foo_9205',
+  'foo_9206',
+  'foo_9207',
+  'foo_9208',
+  'foo_9209',
+  'foo_9210',
+  'foo_9211',
+  'foo_9212',
+  'foo_9213',
+  'foo_9214',
+  'foo_9215',
+  'foo_9216',
+  'foo_9217',
+  'foo_9218',
+  'foo_9219',
+  'foo_9220',
+  'foo_9221',
+  'foo_9222',
+  'foo_9223',
+  'foo_9224',
+  'foo_9225',
+  'foo_9226',
+  'foo_9227',
+  'foo_9228',
+  'foo_9229',
+  'foo_9230',
+  'foo_9231',
+  'foo_9232',
+  'foo_9233',
+  'foo_9234',
+  'foo_9235',
+  'foo_9236',
+  'foo_9237',
+  'foo_9238',
+  'foo_9239',
+  'foo_9240',
+  'foo_9241',
+  'foo_9242',
+  'foo_9243',
+  'foo_9244',
+  'foo_9245',
+  'foo_9246',
+  'foo_9247',
+  'foo_9248',
+  'foo_9249',
+  'foo_9250',
+  'foo_9251',
+  'foo_9252',
+  'foo_9253',
+  'foo_9254',
+  'foo_9255',
+  'foo_9256',
+  'foo_9257',
+  'foo_9258',
+  'foo_9259',
+  'foo_9260',
+  'foo_9261',
+  'foo_9262',
+  'foo_9263',
+  'foo_9264',
+  'foo_9265',
+  'foo_9266',
+  'foo_9267',
+  'foo_9268',
+  'foo_9269',
+  'foo_9270',
+  'foo_9271',
+  'foo_9272',
+  'foo_9273',
+  'foo_9274',
+  'foo_9275',
+  'foo_9276',
+  'foo_9277',
+  'foo_9278',
+  'foo_9279',
+  'foo_9280',
+  'foo_9281',
+  'foo_9282',
+  'foo_9283',
+  'foo_9284',
+  'foo_9285',
+  'foo_9286',
+  'foo_9287',
+  'foo_9288',
+  'foo_9289',
+  'foo_9290',
+  'foo_9291',
+  'foo_9292',
+  'foo_9293',
+  'foo_9294',
+  'foo_9295',
+  'foo_9296',
+  'foo_9297',
+  'foo_9298',
+  'foo_9299',
+  'foo_9300',
+  'foo_9301',
+  'foo_9302',
+  'foo_9303',
+  'foo_9304',
+  'foo_9305',
+  'foo_9306',
+  'foo_9307',
+  'foo_9308',
+  'foo_9309',
+  'foo_9310',
+  'foo_9311',
+  'foo_9312',
+  'foo_9313',
+  'foo_9314',
+  'foo_9315',
+  'foo_9316',
+  'foo_9317',
+  'foo_9318',
+  'foo_9319',
+  'foo_9320',
+  'foo_9321',
+  'foo_9322',
+  'foo_9323',
+  'foo_9324',
+  'foo_9325',
+  'foo_9326',
+  'foo_9327',
+  'foo_9328',
+  'foo_9329',
+  'foo_9330',
+  'foo_9331',
+  'foo_9332',
+  'foo_9333',
+  'foo_9334',
+  'foo_9335',
+  'foo_9336',
+  'foo_9337',
+  'foo_9338',
+  'foo_9339',
+  'foo_9340',
+  'foo_9341',
+  'foo_9342',
+  'foo_9343',
+  'foo_9344',
+  'foo_9345',
+  'foo_9346',
+  'foo_9347',
+  'foo_9348',
+  'foo_9349',
+  'foo_9350',
+  'foo_9351',
+  'foo_9352',
+  'foo_9353',
+  'foo_9354',
+  'foo_9355',
+  'foo_9356',
+  'foo_9357',
+  'foo_9358',
+  'foo_9359',
+  'foo_9360',
+  'foo_9361',
+  'foo_9362',
+  'foo_9363',
+  'foo_9364',
+  'foo_9365',
+  'foo_9366',
+  'foo_9367',
+  'foo_9368',
+  'foo_9369',
+  'foo_9370',
+  'foo_9371',
+  'foo_9372',
+  'foo_9373',
+  'foo_9374',
+  'foo_9375',
+  'foo_9376',
+  'foo_9377',
+  'foo_9378',
+  'foo_9379',
+  'foo_9380',
+  'foo_9381',
+  'foo_9382',
+  'foo_9383',
+  'foo_9384',
+  'foo_9385',
+  'foo_9386',
+  'foo_9387',
+  'foo_9388',
+  'foo_9389',
+  'foo_9390',
+  'foo_9391',
+  'foo_9392',
+  'foo_9393',
+  'foo_9394',
+  'foo_9395',
+  'foo_9396',
+  'foo_9397',
+  'foo_9398',
+  'foo_9399',
+  'foo_9400',
+  'foo_9401',
+  'foo_9402',
+  'foo_9403',
+  'foo_9404',
+  'foo_9405',
+  'foo_9406',
+  'foo_9407',
+  'foo_9408',
+  'foo_9409',
+  'foo_9410',
+  'foo_9411',
+  'foo_9412',
+  'foo_9413',
+  'foo_9414',
+  'foo_9415',
+  'foo_9416',
+  'foo_9417',
+  'foo_9418',
+  'foo_9419',
+  'foo_9420',
+  'foo_9421',
+  'foo_9422',
+  'foo_9423',
+  'foo_9424',
+  'foo_9425',
+  'foo_9426',
+  'foo_9427',
+  'foo_9428',
+  'foo_9429',
+  'foo_9430',
+  'foo_9431',
+  'foo_9432',
+  'foo_9433',
+  'foo_9434',
+  'foo_9435',
+  'foo_9436',
+  'foo_9437',
+  'foo_9438',
+  'foo_9439',
+  'foo_9440',
+  'foo_9441',
+  'foo_9442',
+  'foo_9443',
+  'foo_9444',
+  'foo_9445',
+  'foo_9446',
+  'foo_9447',
+  'foo_9448',
+  'foo_9449',
+  'foo_9450',
+  'foo_9451',
+  'foo_9452',
+  'foo_9453',
+  'foo_9454',
+  'foo_9455',
+  'foo_9456',
+  'foo_9457',
+  'foo_9458',
+  'foo_9459',
+  'foo_9460',
+  'foo_9461',
+  'foo_9462',
+  'foo_9463',
+  'foo_9464',
+  'foo_9465',
+  'foo_9466',
+  'foo_9467',
+  'foo_9468',
+  'foo_9469',
+  'foo_9470',
+  'foo_9471',
+  'foo_9472',
+  'foo_9473',
+  'foo_9474',
+  'foo_9475',
+  'foo_9476',
+  'foo_9477',
+  'foo_9478',
+  'foo_9479',
+  'foo_9480',
+  'foo_9481',
+  'foo_9482',
+  'foo_9483',
+  'foo_9484',
+  'foo_9485',
+  'foo_9486',
+  'foo_9487',
+  'foo_9488',
+  'foo_9489',
+  'foo_9490',
+  'foo_9491',
+  'foo_9492',
+  'foo_9493',
+  'foo_9494',
+  'foo_9495',
+  'foo_9496',
+  'foo_9497',
+  'foo_9498',
+  'foo_9499',
+  'foo_9500',
+  'foo_9501',
+  'foo_9502',
+  'foo_9503',
+  'foo_9504',
+  'foo_9505',
+  'foo_9506',
+  'foo_9507',
+  'foo_9508',
+  'foo_9509',
+  'foo_9510',
+  'foo_9511',
+  'foo_9512',
+  'foo_9513',
+  'foo_9514',
+  'foo_9515',
+  'foo_9516',
+  'foo_9517',
+  'foo_9518',
+  'foo_9519',
+  'foo_9520',
+  'foo_9521',
+  'foo_9522',
+  'foo_9523',
+  'foo_9524',
+  'foo_9525',
+  'foo_9526',
+  'foo_9527',
+  'foo_9528',
+  'foo_9529',
+  'foo_9530',
+  'foo_9531',
+  'foo_9532',
+  'foo_9533',
+  'foo_9534',
+  'foo_9535',
+  'foo_9536',
+  'foo_9537',
+  'foo_9538',
+  'foo_9539',
+  'foo_9540',
+  'foo_9541',
+  'foo_9542',
+  'foo_9543',
+  'foo_9544',
+  'foo_9545',
+  'foo_9546',
+  'foo_9547',
+  'foo_9548',
+  'foo_9549',
+  'foo_9550',
+  'foo_9551',
+  'foo_9552',
+  'foo_9553',
+  'foo_9554',
+  'foo_9555',
+  'foo_9556',
+  'foo_9557',
+  'foo_9558',
+  'foo_9559',
+  'foo_9560',
+  'foo_9561',
+  'foo_9562',
+  'foo_9563',
+  'foo_9564',
+  'foo_9565',
+  'foo_9566',
+  'foo_9567',
+  'foo_9568',
+  'foo_9569',
+  'foo_9570',
+  'foo_9571',
+  'foo_9572',
+  'foo_9573',
+  'foo_9574',
+  'foo_9575',
+  'foo_9576',
+  'foo_9577',
+  'foo_9578',
+  'foo_9579',
+  'foo_9580',
+  'foo_9581',
+  'foo_9582',
+  'foo_9583',
+  'foo_9584',
+  'foo_9585',
+  'foo_9586',
+  'foo_9587',
+  'foo_9588',
+  'foo_9589',
+  'foo_9590',
+  'foo_9591',
+  'foo_9592',
+  'foo_9593',
+  'foo_9594',
+  'foo_9595',
+  'foo_9596',
+  'foo_9597',
+  'foo_9598',
+  'foo_9599',
+  'foo_9600',
+  'foo_9601',
+  'foo_9602',
+  'foo_9603',
+  'foo_9604',
+  'foo_9605',
+  'foo_9606',
+  'foo_9607',
+  'foo_9608',
+  'foo_9609',
+  'foo_9610',
+  'foo_9611',
+  'foo_9612',
+  'foo_9613',
+  'foo_9614',
+  'foo_9615',
+  'foo_9616',
+  'foo_9617',
+  'foo_9618',
+  'foo_9619',
+  'foo_9620',
+  'foo_9621',
+  'foo_9622',
+  'foo_9623',
+  'foo_9624',
+  'foo_9625',
+  'foo_9626',
+  'foo_9627',
+  'foo_9628',
+  'foo_9629',
+  'foo_9630',
+  'foo_9631',
+  'foo_9632',
+  'foo_9633',
+  'foo_9634',
+  'foo_9635',
+  'foo_9636',
+  'foo_9637',
+  'foo_9638',
+  'foo_9639',
+  'foo_9640',
+  'foo_9641',
+  'foo_9642',
+  'foo_9643',
+  'foo_9644',
+  'foo_9645',
+  'foo_9646',
+  'foo_9647',
+  'foo_9648',
+  'foo_9649',
+  'foo_9650',
+  'foo_9651',
+  'foo_9652',
+  'foo_9653',
+  'foo_9654',
+  'foo_9655',
+  'foo_9656',
+  'foo_9657',
+  'foo_9658',
+  'foo_9659',
+  'foo_9660',
+  'foo_9661',
+  'foo_9662',
+  'foo_9663',
+  'foo_9664',
+  'foo_9665',
+  'foo_9666',
+  'foo_9667',
+  'foo_9668',
+  'foo_9669',
+  'foo_9670',
+  'foo_9671',
+  'foo_9672',
+  'foo_9673',
+  'foo_9674',
+  'foo_9675',
+  'foo_9676',
+  'foo_9677',
+  'foo_9678',
+  'foo_9679',
+  'foo_9680',
+  'foo_9681',
+  'foo_9682',
+  'foo_9683',
+  'foo_9684',
+  'foo_9685',
+  'foo_9686',
+  'foo_9687',
+  'foo_9688',
+  'foo_9689',
+  'foo_9690',
+  'foo_9691',
+  'foo_9692',
+  'foo_9693',
+  'foo_9694',
+  'foo_9695',
+  'foo_9696',
+  'foo_9697',
+  'foo_9698',
+  'foo_9699',
+  'foo_9700',
+  'foo_9701',
+  'foo_9702',
+  'foo_9703',
+  'foo_9704',
+  'foo_9705',
+  'foo_9706',
+  'foo_9707',
+  'foo_9708',
+  'foo_9709',
+  'foo_9710',
+  'foo_9711',
+  'foo_9712',
+  'foo_9713',
+  'foo_9714',
+  'foo_9715',
+  'foo_9716',
+  'foo_9717',
+  'foo_9718',
+  'foo_9719',
+  'foo_9720',
+  'foo_9721',
+  'foo_9722',
+  'foo_9723',
+  'foo_9724',
+  'foo_9725',
+  'foo_9726',
+  'foo_9727',
+  'foo_9728',
+  'foo_9729',
+  'foo_9730',
+  'foo_9731',
+  'foo_9732',
+  'foo_9733',
+  'foo_9734',
+  'foo_9735',
+  'foo_9736',
+  'foo_9737',
+  'foo_9738',
+  'foo_9739',
+  'foo_9740',
+  'foo_9741',
+  'foo_9742',
+  'foo_9743',
+  'foo_9744',
+  'foo_9745',
+  'foo_9746',
+  'foo_9747',
+  'foo_9748',
+  'foo_9749',
+  'foo_9750',
+  'foo_9751',
+  'foo_9752',
+  'foo_9753',
+  'foo_9754',
+  'foo_9755',
+  'foo_9756',
+  'foo_9757',
+  'foo_9758',
+  'foo_9759',
+  'foo_9760',
+  'foo_9761',
+  'foo_9762',
+  'foo_9763',
+  'foo_9764',
+  'foo_9765',
+  'foo_9766',
+  'foo_9767',
+  'foo_9768',
+  'foo_9769',
+  'foo_9770',
+  'foo_9771',
+  'foo_9772',
+  'foo_9773',
+  'foo_9774',
+  'foo_9775',
+  'foo_9776',
+  'foo_9777',
+  'foo_9778',
+  'foo_9779',
+  'foo_9780',
+  'foo_9781',
+  'foo_9782',
+  'foo_9783',
+  'foo_9784',
+  'foo_9785',
+  'foo_9786',
+  'foo_9787',
+  'foo_9788',
+  'foo_9789',
+  'foo_9790',
+  'foo_9791',
+  'foo_9792',
+  'foo_9793',
+  'foo_9794',
+  'foo_9795',
+  'foo_9796',
+  'foo_9797',
+  'foo_9798',
+  'foo_9799',
+  'foo_9800',
+  'foo_9801',
+  'foo_9802',
+  'foo_9803',
+  'foo_9804',
+  'foo_9805',
+  'foo_9806',
+  'foo_9807',
+  'foo_9808',
+  'foo_9809',
+  'foo_9810',
+  'foo_9811',
+  'foo_9812',
+  'foo_9813',
+  'foo_9814',
+  'foo_9815',
+  'foo_9816',
+  'foo_9817',
+  'foo_9818',
+  'foo_9819',
+  'foo_9820',
+  'foo_9821',
+  'foo_9822',
+  'foo_9823',
+  'foo_9824',
+  'foo_9825',
+  'foo_9826',
+  'foo_9827',
+  'foo_9828',
+  'foo_9829',
+  'foo_9830',
+  'foo_9831',
+  'foo_9832',
+  'foo_9833',
+  'foo_9834',
+  'foo_9835',
+  'foo_9836',
+  'foo_9837',
+  'foo_9838',
+  'foo_9839',
+  'foo_9840',
+  'foo_9841',
+  'foo_9842',
+  'foo_9843',
+  'foo_9844',
+  'foo_9845',
+  'foo_9846',
+  'foo_9847',
+  'foo_9848',
+  'foo_9849',
+  'foo_9850',
+  'foo_9851',
+  'foo_9852',
+  'foo_9853',
+  'foo_9854',
+  'foo_9855',
+  'foo_9856',
+  'foo_9857',
+  'foo_9858',
+  'foo_9859',
+  'foo_9860',
+  'foo_9861',
+  'foo_9862',
+  'foo_9863',
+  'foo_9864',
+  'foo_9865',
+  'foo_9866',
+  'foo_9867',
+  'foo_9868',
+  'foo_9869',
+  'foo_9870',
+  'foo_9871',
+  'foo_9872',
+  'foo_9873',
+  'foo_9874',
+  'foo_9875',
+  'foo_9876',
+  'foo_9877',
+  'foo_9878',
+  'foo_9879',
+  'foo_9880',
+  'foo_9881',
+  'foo_9882',
+  'foo_9883',
+  'foo_9884',
+  'foo_9885',
+  'foo_9886',
+  'foo_9887',
+  'foo_9888',
+  'foo_9889',
+  'foo_9890',
+  'foo_9891',
+  'foo_9892',
+  'foo_9893',
+  'foo_9894',
+  'foo_9895',
+  'foo_9896',
+  'foo_9897',
+  'foo_9898',
+  'foo_9899',
+  'foo_9900',
+  'foo_9901',
+  'foo_9902',
+  'foo_9903',
+  'foo_9904',
+  'foo_9905',
+  'foo_9906',
+  'foo_9907',
+  'foo_9908',
+  'foo_9909',
+  'foo_9910',
+  'foo_9911',
+  'foo_9912',
+  'foo_9913',
+  'foo_9914',
+  'foo_9915',
+  'foo_9916',
+  'foo_9917',
+  'foo_9918',
+  'foo_9919',
+  'foo_9920',
+  'foo_9921',
+  'foo_9922',
+  'foo_9923',
+  'foo_9924',
+  'foo_9925',
+  'foo_9926',
+  'foo_9927',
+  'foo_9928',
+  'foo_9929',
+  'foo_9930',
+  'foo_9931',
+  'foo_9932',
+  'foo_9933',
+  'foo_9934',
+  'foo_9935',
+  'foo_9936',
+  'foo_9937',
+  'foo_9938',
+  'foo_9939',
+  'foo_9940',
+  'foo_9941',
+  'foo_9942',
+  'foo_9943',
+  'foo_9944',
+  'foo_9945',
+  'foo_9946',
+  'foo_9947',
+  'foo_9948',
+  'foo_9949',
+  'foo_9950',
+  'foo_9951',
+  'foo_9952',
+  'foo_9953',
+  'foo_9954',
+  'foo_9955',
+  'foo_9956',
+  'foo_9957',
+  'foo_9958',
+  'foo_9959',
+  'foo_9960',
+  'foo_9961',
+  'foo_9962',
+  'foo_9963',
+  'foo_9964',
+  'foo_9965',
+  'foo_9966',
+  'foo_9967',
+  'foo_9968',
+  'foo_9969',
+  'foo_9970',
+  'foo_9971',
+  'foo_9972',
+  'foo_9973',
+  'foo_9974',
+  'foo_9975',
+  'foo_9976',
+  'foo_9977',
+  'foo_9978',
+  'foo_9979',
+  'foo_9980',
+  'foo_9981',
+  'foo_9982',
+  'foo_9983',
+  'foo_9984',
+  'foo_9985',
+  'foo_9986',
+  'foo_9987',
+  'foo_9988',
+  'foo_9989',
+  'foo_9990',
+  'foo_9991',
+  'foo_9992',
+  'foo_9993',
+  'foo_9994',
+  'foo_9995',
+  'foo_9996',
+  'foo_9997',
+  'foo_9998',
+  'foo_9999',
+};
diff --git a/tests/language/string/multiline_newline_test.dart b/tests/language/string/multiline_newline_test.dart
index 75bf78c..cafa05e 100644
--- a/tests/language/string/multiline_newline_test.dart
+++ b/tests/language/string/multiline_newline_test.dart
@@ -69,37 +69,37 @@
   const c4 = c1 ? 1 : 2;
   //         ^^
   // [analyzer] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
-  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
   Expect.equals(1, c4);
 
   const c5 = c2 ? 2 : 3;
   //         ^^
   // [analyzer] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
-  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
   Expect.equals(2, c5);
 
   const c6 = c3 ? 3 : 4;
   //         ^^
   // [analyzer] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
-  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
   Expect.equals(3, c6);
 
   const c4r = c1r ? 1 : 2;
   //          ^^^
   // [analyzer] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
-  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
   Expect.equals(1, c4r);
 
   const c5r = c2r ? 2 : 3;
   //          ^^^
   // [analyzer] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
-  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
   Expect.equals(2, c5r);
 
   const c6r = c3r ? 3 : 4;
   //          ^^^
   // [analyzer] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
-  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
   Expect.equals(3, c6r);
 
   const c7 =
@@ -136,38 +136,38 @@
   const c10 = c7 ? 1 : 2;
   //          ^^
   // [analyzer] COMPILE_TIME_ERROR.CONST_EVAL_TYPE_BOOL
-  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
   //          ^^
   // [analyzer] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
   const c11 = c8 ? 2 : 3;
   //          ^^
   // [analyzer] COMPILE_TIME_ERROR.CONST_EVAL_TYPE_BOOL
-  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
   //          ^^
   // [analyzer] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
   const c12 = c9 ? 3 : 4;
   //          ^^
   // [analyzer] COMPILE_TIME_ERROR.CONST_EVAL_TYPE_BOOL
-  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
   //          ^^
   // [analyzer] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
 
   const c10r = c7r ? 1 : 2;
   //           ^^^
   // [analyzer] COMPILE_TIME_ERROR.CONST_EVAL_TYPE_BOOL
-  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
   //           ^^^
   // [analyzer] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
   const c11r = c8r ? 2 : 3;
   //           ^^^
   // [analyzer] COMPILE_TIME_ERROR.CONST_EVAL_TYPE_BOOL
-  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
   //           ^^^
   // [analyzer] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
   const c12r = c9r ? 3 : 4;
   //           ^^^
   // [analyzer] COMPILE_TIME_ERROR.CONST_EVAL_TYPE_BOOL
-  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool'.
+  // [cfe] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
   //           ^^^
   // [analyzer] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
 }
diff --git a/tests/language/super/conditional_operator_test.dart b/tests/language/super/conditional_operator_test.dart
index dcbc633..5ae030d 100644
--- a/tests/language/super/conditional_operator_test.dart
+++ b/tests/language/super/conditional_operator_test.dart
@@ -51,15 +51,15 @@
     -super?.field;
 //   ^^^^^^^^^^^^
 // [analyzer] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
-    //    ^^
-    // [analyzer] SYNTACTIC_ERROR.INVALID_OPERATOR_QUESTIONMARK_PERIOD_FOR_SUPER
-    // [cfe] The operator '?.' cannot be used with 'super' because 'super' cannot be null.
+//        ^^
+// [analyzer] SYNTACTIC_ERROR.INVALID_OPERATOR_QUESTIONMARK_PERIOD_FOR_SUPER
+// [cfe] The operator '?.' cannot be used with 'super' because 'super' cannot be null.
     ~super?.field;
 //   ^^^^^^^^^^^^
 // [analyzer] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
-    //    ^^
-    // [analyzer] SYNTACTIC_ERROR.INVALID_OPERATOR_QUESTIONMARK_PERIOD_FOR_SUPER
-    // [cfe] The operator '?.' cannot be used with 'super' because 'super' cannot be null.
+//        ^^
+// [analyzer] SYNTACTIC_ERROR.INVALID_OPERATOR_QUESTIONMARK_PERIOD_FOR_SUPER
+// [cfe] The operator '?.' cannot be used with 'super' because 'super' cannot be null.
     !super?.field;
 //   ^^^^^^^^^^^^
 // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_NEGATION_EXPRESSION
@@ -77,26 +77,38 @@
     // [analyzer] SYNTACTIC_ERROR.INVALID_OPERATOR_QUESTIONMARK_PERIOD_FOR_SUPER
     // [cfe] The operator '?.' cannot be used with 'super' because 'super' cannot be null.
     super?.method();
+//  ^
+// [cfe] The receiver 'this' cannot be null.
     //   ^^
     // [analyzer] SYNTACTIC_ERROR.INVALID_OPERATOR_QUESTIONMARK_PERIOD_FOR_SUPER
     // [cfe] The operator '?.' cannot be used with 'super' because 'super' cannot be null.
     1 * super?.method();
+    //  ^
+    // [cfe] The receiver 'this' cannot be null.
     //       ^^
     // [analyzer] SYNTACTIC_ERROR.INVALID_OPERATOR_QUESTIONMARK_PERIOD_FOR_SUPER
     // [cfe] The operator '?.' cannot be used with 'super' because 'super' cannot be null.
     -super?.method();
+//   ^
+// [cfe] The receiver 'this' cannot be null.
     //    ^^
     // [analyzer] SYNTACTIC_ERROR.INVALID_OPERATOR_QUESTIONMARK_PERIOD_FOR_SUPER
     // [cfe] The operator '?.' cannot be used with 'super' because 'super' cannot be null.
     ~super?.method();
+//   ^
+// [cfe] The receiver 'this' cannot be null.
     //    ^^
     // [analyzer] SYNTACTIC_ERROR.INVALID_OPERATOR_QUESTIONMARK_PERIOD_FOR_SUPER
     // [cfe] The operator '?.' cannot be used with 'super' because 'super' cannot be null.
     !super?.method();
+//   ^
+// [cfe] The receiver 'this' cannot be null.
     //    ^^
     // [analyzer] SYNTACTIC_ERROR.INVALID_OPERATOR_QUESTIONMARK_PERIOD_FOR_SUPER
     // [cfe] The operator '?.' cannot be used with 'super' because 'super' cannot be null.
     --super?.method();
+    //^
+    // [cfe] The receiver 'this' cannot be null.
     //     ^^
     // [analyzer] SYNTACTIC_ERROR.INVALID_OPERATOR_QUESTIONMARK_PERIOD_FOR_SUPER
     // [cfe] The operator '?.' cannot be used with 'super' because 'super' cannot be null.
@@ -105,6 +117,8 @@
     //              ^
     // [analyzer] SYNTACTIC_ERROR.MISSING_ASSIGNABLE_SELECTOR
     ++super?.method();
+    //^
+    // [cfe] The receiver 'this' cannot be null.
     //     ^^
     // [analyzer] SYNTACTIC_ERROR.INVALID_OPERATOR_QUESTIONMARK_PERIOD_FOR_SUPER
     // [cfe] The operator '?.' cannot be used with 'super' because 'super' cannot be null.
diff --git a/tests/language/sync_star/sync_star_exception_nested_test.dart b/tests/language/sync_star/sync_star_exception_nested_test.dart
new file mode 100644
index 0000000..ab10c65
--- /dev/null
+++ b/tests/language/sync_star/sync_star_exception_nested_test.dart
@@ -0,0 +1,55 @@
+// Copyright (c) 2020, 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.
+
+// See: https://github.com/dart-lang/sdk/issues/42466
+
+import 'dart:collection';
+import 'package:expect/expect.dart';
+
+String? caughtString;
+
+a() sync* {
+  yield 3;
+  throw 'Throw from a()';
+  yield 4;
+}
+
+b() sync* {
+  yield 2;
+  yield* a();
+  yield 5;
+}
+
+c() sync* {
+  try {
+    yield 1;
+    yield* b();
+    yield 6;
+  } catch (e, st) {
+    caughtString = 'Caught in c()';
+  }
+}
+
+d() sync* {
+  try {
+    yield 0;
+    yield* c();
+    yield 7;
+  } catch (e, st) {
+    caughtString = 'Caught in d()';
+  }
+}
+
+main() {
+  List yields = [];
+  try {
+    for (final e in d()) {
+      yields.add(e);
+    }
+  } catch (e, st) {
+    caughtString = 'Caught in main()';
+  }
+  Expect.equals('Caught in c()', caughtString);
+  Expect.listEquals([0, 1, 2, 3, 7], yields);
+}
diff --git a/tests/language/sync_star/sync_star_exception_test.dart b/tests/language/sync_star/sync_star_exception_test.dart
new file mode 100644
index 0000000..e1db95a
--- /dev/null
+++ b/tests/language/sync_star/sync_star_exception_test.dart
@@ -0,0 +1,46 @@
+// Copyright (c) 2020, 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.
+
+// See: https://github.com/dart-lang/sdk/issues/42466
+
+import 'dart:collection';
+import 'package:expect/expect.dart';
+
+var caughtString;
+
+class AlwaysThrowingIterator implements Iterator<int> {
+  bool moveNext() => throw 'moveNext';
+  int get current => throw 'current';
+}
+
+class AlwaysThrowing extends IterableBase<int> {
+  Iterator<int> get iterator => AlwaysThrowingIterator();
+}
+
+Iterable<int> f() sync* {
+  try {
+    yield* AlwaysThrowing();
+  } catch (e, st) {
+    caughtString = 'caught $e in f';
+  }
+}
+
+void g() {
+  try {
+    for (int x in f()) {
+      print(x);
+    }
+  } catch (e, st) {
+    caughtString = 'caught $e in g';
+  }
+}
+
+main() {
+  g();
+  // The spec dictates that if `e` (moveNext, current) throws then `yield* e`
+  // should throw.
+  // I.e. even though the iteration is happening in `g`, the `yield*` is in `f`
+  // so its catch should trigger.
+  Expect.equals('caught moveNext in f', caughtString);
+}
diff --git a/tests/language/this/conditional_operator_runtime_test.dart b/tests/language/this/conditional_operator_runtime_test.dart
index cf48394..ccecb55 100644
--- a/tests/language/this/conditional_operator_runtime_test.dart
+++ b/tests/language/this/conditional_operator_runtime_test.dart
@@ -14,21 +14,27 @@
   var field = 1;
   method() => 1;
 
-  B.forward()
-
-  ;
+  B.forward();
 
   test() {
     this?.field = 1;
+//  ^
+// [cfe] The receiver 'this' cannot be null.
     //  ^^
     // [analyzer] STATIC_WARNING.INVALID_NULL_AWARE_OPERATOR
     this?.field += 1;
+//  ^
+// [cfe] The receiver 'this' cannot be null.
     //  ^^
     // [analyzer] STATIC_WARNING.INVALID_NULL_AWARE_OPERATOR
     this?.field;
+//  ^
+// [cfe] The receiver 'this' cannot be null.
     //  ^^
     // [analyzer] STATIC_WARNING.INVALID_NULL_AWARE_OPERATOR
     this?.method();
+//  ^
+// [cfe] The receiver 'this' cannot be null.
     //  ^^
     // [analyzer] STATIC_WARNING.INVALID_NULL_AWARE_OPERATOR
   }
diff --git a/tests/language/this/conditional_operator_test.dart b/tests/language/this/conditional_operator_test.dart
index 5254ea2..cda4689 100644
--- a/tests/language/this/conditional_operator_test.dart
+++ b/tests/language/this/conditional_operator_test.dart
@@ -30,17 +30,25 @@
 
   test() {
     this?.field = 1;
-    //  ^^
-    // [analyzer] STATIC_WARNING.INVALID_NULL_AWARE_OPERATOR
+//  ^
+// [cfe] The receiver 'this' cannot be null.
+//      ^^
+// [analyzer] STATIC_WARNING.INVALID_NULL_AWARE_OPERATOR
     this?.field += 1;
-    //  ^^
-    // [analyzer] STATIC_WARNING.INVALID_NULL_AWARE_OPERATOR
+//  ^
+// [cfe] The receiver 'this' cannot be null.
+//      ^^
+// [analyzer] STATIC_WARNING.INVALID_NULL_AWARE_OPERATOR
     this?.field;
-    //  ^^
-    // [analyzer] STATIC_WARNING.INVALID_NULL_AWARE_OPERATOR
+//  ^
+// [cfe] The receiver 'this' cannot be null.
+//      ^^
+// [analyzer] STATIC_WARNING.INVALID_NULL_AWARE_OPERATOR
     this?.method();
-    //  ^^
-    // [analyzer] STATIC_WARNING.INVALID_NULL_AWARE_OPERATOR
+//  ^
+// [cfe] The receiver 'this' cannot be null.
+//      ^^
+// [analyzer] STATIC_WARNING.INVALID_NULL_AWARE_OPERATOR
   }
 }
 
diff --git a/tests/language/variable/initializer_super_last_test.dart b/tests/language/variable/initializer_super_last_test.dart
index 5a96d03..7e2b0b8 100644
--- a/tests/language/variable/initializer_super_last_test.dart
+++ b/tests/language/variable/initializer_super_last_test.dart
@@ -39,7 +39,7 @@
   C.cc09(int x)
       : //
         super(),
-//      ^^^^^^^
+//      ^^^^^
 // [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
         x = x;
         //^
@@ -47,7 +47,7 @@
   C.cc10(int x)
       : //
         super.named(),
-//      ^^^^^^^^^^^^^
+//      ^^^^^
 // [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
         x = x;
         //^
@@ -55,7 +55,7 @@
   C.cc11(this.x)
       : //
         super(),
-//      ^^^^^^^
+//      ^^^^^
 // [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
         assert(x == x);
 //      ^
@@ -63,7 +63,7 @@
   C.cc12(this.x)
       : //
         super.named(),
-//      ^^^^^^^^^^^^^
+//      ^^^^^
 // [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
         assert(x == x);
 //      ^
@@ -71,7 +71,7 @@
   C.cc13(int x)
       : //
         super(),
-//      ^^^^^^^
+//      ^^^^^
 // [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
         x = x,
         //^
@@ -82,7 +82,7 @@
   C.cc14(int x)
       : //
         super.named(),
-//      ^^^^^^^^^^^^^
+//      ^^^^^
 // [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
         x = x,
         //^
@@ -93,7 +93,7 @@
   C.cc15(int x)
       : x = x,
         super(),
-//      ^^^^^^^
+//      ^^^^^
 // [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
         assert(x == x);
 //      ^
@@ -101,7 +101,7 @@
   C.cc16(int x)
       : x = x,
         super.named(),
-//      ^^^^^^^^^^^^^
+//      ^^^^^
 // [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
         assert(x == x);
 //      ^
@@ -132,7 +132,7 @@
   const C.cc25(int x)
       : //
         super(),
-//      ^^^^^^^
+//      ^^^^^
 // [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
         x = x;
         //^
@@ -140,7 +140,7 @@
   const C.cc26(int x)
       : //
         super.named(),
-//      ^^^^^^^^^^^^^
+//      ^^^^^
 // [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
         x = x;
         //^
@@ -148,7 +148,7 @@
   const C.cc27(this.x)
       : //
         super(),
-//      ^^^^^^^
+//      ^^^^^
 // [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
         assert(x == x);
 //      ^
@@ -156,7 +156,7 @@
   const C.cc28(this.x)
       : //
         super.named(),
-//      ^^^^^^^^^^^^^
+//      ^^^^^
 // [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
         assert(x == x);
 //      ^
@@ -164,7 +164,7 @@
   const C.cc29(int x)
       : //
         super(),
-//      ^^^^^^^
+//      ^^^^^
 // [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
         x = x,
         //^
@@ -175,7 +175,7 @@
   const C.cc30(int x)
       : //
         super.named(),
-//      ^^^^^^^^^^^^^
+//      ^^^^^
 // [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
         x = x,
         //^
@@ -186,7 +186,7 @@
   const C.cc31(int x)
       : x = x,
         super(),
-//      ^^^^^^^
+//      ^^^^^
 // [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
         assert(x == x);
 //      ^
@@ -194,7 +194,7 @@
   const C.cc32(int x)
       : x = x,
         super.named(),
-//      ^^^^^^^^^^^^^
+//      ^^^^^
 // [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
         assert(x == x);
 //      ^
diff --git a/tests/language/vm/allocation_sinking_arrays_test.dart b/tests/language/vm/allocation_sinking_arrays_test.dart
new file mode 100644
index 0000000..ed5aa9b
--- /dev/null
+++ b/tests/language/vm/allocation_sinking_arrays_test.dart
@@ -0,0 +1,85 @@
+// Copyright (c) 2020, 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.
+
+// VMOptions=--optimization-counter-threshold=100 --deterministic
+
+// Tests allocation sinking of arrays and typed data objects.
+
+import 'dart:typed_data';
+import 'package:expect/expect.dart';
+
+import 'dart:typed_data';
+
+class Vector2 {
+  final Float64List _v2storage;
+
+  @pragma('vm:prefer-inline')
+  Vector2.zero() : _v2storage = Float64List(2);
+
+  @pragma('vm:prefer-inline')
+  factory Vector2(double x, double y) => Vector2.zero()..setValues(x, y);
+
+  @pragma('vm:prefer-inline')
+  factory Vector2.copy(Vector2 other) => Vector2.zero()..setFrom(other);
+
+  @pragma('vm:prefer-inline')
+  Vector2 clone() => Vector2.copy(this);
+
+  @pragma('vm:prefer-inline')
+  void setValues(double x_, double y_) {
+    _v2storage[0] = x_;
+    _v2storage[1] = y_;
+  }
+
+  @pragma('vm:prefer-inline')
+  void setFrom(Vector2 other) {
+    final otherStorage = other._v2storage;
+    _v2storage[1] = otherStorage[1];
+    _v2storage[0] = otherStorage[0];
+  }
+
+  @pragma('vm:prefer-inline')
+  Vector2 operator +(Vector2 other) => clone()..add(other);
+
+  @pragma('vm:prefer-inline')
+  void add(Vector2 arg) {
+    final argStorage = arg._v2storage;
+    _v2storage[0] = _v2storage[0] + argStorage[0];
+    _v2storage[1] = _v2storage[1] + argStorage[1];
+  }
+
+  @pragma('vm:prefer-inline')
+  double get x => _v2storage[0];
+
+  @pragma('vm:prefer-inline')
+  double get y => _v2storage[1];
+}
+
+@pragma('vm:never-inline')
+String foo(double x, num doDeopt) {
+  // All allocations in this function are eliminated by the compiler,
+  // except array allocation for string interpolation at the end.
+  List v1 = List.filled(2, null);
+  v1[0] = 1;
+  v1[1] = 'hi';
+  Vector2 v2 = new Vector2(1.0, 2.0);
+  Vector2 v3 = v2 + Vector2(x, x);
+  double sum = v3.x + v3.y;
+  // Deoptimization is triggered here to materialize removed allocations.
+  doDeopt + 2;
+  return "v1: [${v1[0]},${v1[1]}], v2: [${v2.x},${v2.y}], v3: [${v3.x},${v3.y}], sum: $sum";
+}
+
+main() {
+  // Due to '--optimization-counter-threshold=100 --deterministic'
+  // foo() is optimized during the first 100 iterations.
+  // After that, on iteration 120 deoptimization is triggered by changed
+  // type of 'doDeopt'. That forces materialization of all objects which
+  // allocations were removed by optimizer.
+  for (int i = 0; i < 130; ++i) {
+    final num doDeopt = (i < 120 ? 1 : 2.0);
+    final result = foo(3.0, doDeopt);
+    Expect.equals("v1: [1,hi], v2: [1.0,2.0], v3: [4.0,5.0], sum: 9.0", result);
+  }
+}
diff --git a/tests/language/vm/bool_check_stack_traces_test.dart b/tests/language/vm/bool_check_stack_traces_test.dart
index bdc9ce5..e27da73 100644
--- a/tests/language/vm/bool_check_stack_traces_test.dart
+++ b/tests/language/vm/bool_check_stack_traces_test.dart
@@ -81,7 +81,7 @@
     print(stacktrace);
     print('-----------------------------');
 
-    if (isStrongMode) {
+    if (hasSoundNullSafety) {
       Expect.isTrue(e is TypeError);
       Expect.equals(
           "type 'Null' is not a subtype of type 'bool'", e.toString());
diff --git a/tests/language_2/constants_2018/potential_const_dynamic_test.dart b/tests/language_2/constants_2018/potential_const_dynamic_test.dart
index 90de32f..63f031a 100644
--- a/tests/language_2/constants_2018/potential_const_dynamic_test.dart
+++ b/tests/language_2/constants_2018/potential_const_dynamic_test.dart
@@ -20,7 +20,7 @@
   T.test10(c, c); //# sh3: ok
   T.test11(c, c);
   T.test12(c, c);
-  T .test13(c, c);
+  T.test13(c, c);
   T.test14(c);
   T.test15(c, c);
   T.test16(c, c);
@@ -73,4 +73,4 @@
   dynamic operator <=(dynamic other) => this;
   dynamic operator >=(dynamic other) => this;
   dynamic get length => this;
-}
\ No newline at end of file
+}
diff --git a/tests/language_2/constants_2018/potential_const_test.dart b/tests/language_2/constants_2018/potential_const_test.dart
new file mode 100644
index 0000000..ad516a9
--- /dev/null
+++ b/tests/language_2/constants_2018/potential_const_test.dart
@@ -0,0 +1,100 @@
+// 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.
+
+// Tests that the correct places allows, and requires, potentially constant
+// expressions.
+
+bool get nonConst => true;
+
+class C {
+  final v;
+  const C(this.v);
+
+  // Redirecting generative constructor invocation parameters,
+  // must be potenentially constant.
+  const C.r1() : this(const C(null));
+
+  // Only evaluates the true branch when passed `true` as argument.
+  const C.r2(bool b) : this(b ? null : 1 ~/ 0);
+
+  const C.rn1() : this(nonConst);
+  //                   ^^^^^^^^
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_CONSTANT
+  // [cfe] Constant evaluation error:
+
+  const C.rn2(bool b) : this(b ? null : nonConst);
+  //                                    ^^^^^^^^
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_CONSTANT
+  // [cfe] Constant evaluation error:
+
+  // Initializer list expressions must be potentially constant.
+  const C.g1() : v = const C(null);
+
+  const C.g2(bool b) : v = b ? null : 1 ~/ 0;
+
+  const C.gn3() : v = nonConst;
+  //                  ^^^^^^^^
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_CONSTANT
+  // [cfe] Constant evaluation error:
+
+  const C.gn4(bool b) : v = b ? null : nonConst;
+  //                                   ^^^^^^^^
+  // [analyzer] COMPILE_TIME_ERROR.INVALID_CONSTANT
+  // [cfe] Constant evaluation error:
+
+  // Constant constructor initializer list assert expressions
+  // must be potentially constant (and boolean).
+  const C.a1()
+      : assert(const C(null) != null),
+        v = null;
+
+  const C.a2(bool b)
+      : assert(b ? const C(null) != null : ((1 ~/ 0) as bool)),
+        v = null;
+
+  const C.an1()
+      : assert(nonConst),
+        //     ^^^^^^^^
+        // [analyzer] COMPILE_TIME_ERROR.INVALID_CONSTANT
+        // [cfe] Constant evaluation error:
+        v = null;
+
+  const C.an2(bool b)
+      : assert(b ? true : nonConst),
+        //                ^^^^^^^^
+        // [analyzer] COMPILE_TIME_ERROR.INVALID_CONSTANT
+        // [cfe] Constant evaluation error:
+        v = null;
+}
+
+main() {
+  var c = const C(null);
+  var cc = const C(C(null));
+
+  var r1 = const C.r1();
+  var r2 = const C.r2(true);
+
+  /// Const constructor invocation which would throw.
+  /**/ const C.r2(false);
+  //   ^^^^^^^^^^^^^^^^^
+  // [analyzer] COMPILE_TIME_ERROR.CONST_EVAL_THROWS_EXCEPTION
+  //         ^^^^^^^^^^^
+  // [cfe] Constant evaluation error:
+
+  var g1 = const C.g1();
+  var g2 = const C.g2(true);
+  /**/ const C.g2(false);
+  //   ^^^^^^^^^^^^^^^^^
+  // [analyzer] COMPILE_TIME_ERROR.CONST_EVAL_THROWS_EXCEPTION
+  //         ^^^^^^^^^^^
+  // [cfe] Constant evaluation error:
+
+  var a1 = const C.a1();
+  var a2 = const C.a2(true);
+  /**/ const C.a2(false);
+  //   ^^^^^^^^^^^^^^^^^
+  // [analyzer] COMPILE_TIME_ERROR.CONST_EVAL_THROWS_EXCEPTION
+  //         ^^^^^^^^^^^
+  // [cfe] Constant evaluation error:
+}
diff --git a/tests/language_2/constants_2018/potential_const_type_test.dart b/tests/language_2/constants_2018/potential_const_type_test.dart
index 0f06507..e4a26ee 100644
--- a/tests/language_2/constants_2018/potential_const_type_test.dart
+++ b/tests/language_2/constants_2018/potential_const_type_test.dart
@@ -92,4 +92,4 @@
   C operator <=(C other) => this;
   C operator >=(C other) => this;
   C get length => this;
-}
\ No newline at end of file
+}
diff --git a/tests/language_2/deferred/split_constants_canonicalization_a.dart b/tests/language_2/deferred/split_constants_canonicalization_a.dart
new file mode 100644
index 0000000..3e3ada7
--- /dev/null
+++ b/tests/language_2/deferred/split_constants_canonicalization_a.dart
@@ -0,0 +1,29 @@
+// Copyright (c) 2020, 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 "split_constants_canonicalization_a_1.dart" deferred as a_1;
+import "split_constants_canonicalization_a_2.dart" deferred as a_2;
+
+loadChildren() async {
+  await a_1.loadLibrary();
+  await a_2.loadLibrary();
+}
+
+a_1_mint() => a_1.mint();
+a_1_string() => a_1.string();
+a_1_list() => a_1.list();
+a_1_map() => a_1.map();
+a_1_box() => a_1.box();
+a_1_enum() => a_1.enumm();
+a_1_type() => a_1.type();
+a_1_closure() => a_1.closure();
+
+a_2_mint() => a_2.mint();
+a_2_string() => a_2.string();
+a_2_list() => a_2.list();
+a_2_map() => a_2.map();
+a_2_box() => a_2.box();
+a_2_enum() => a_2.enumm();
+a_2_type() => a_2.type();
+a_2_closure() => a_2.closure();
diff --git a/tests/language_2/deferred/split_constants_canonicalization_a_1.dart b/tests/language_2/deferred/split_constants_canonicalization_a_1.dart
new file mode 100644
index 0000000..ea054f5
--- /dev/null
+++ b/tests/language_2/deferred/split_constants_canonicalization_a_1.dart
@@ -0,0 +1,29 @@
+// Copyright (c) 2020, 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 "split_constants_canonicalization_test.dart";
+
+@pragma("vm:never-inline")
+mint() => 0x7FFFFFFFFFFFFFFF;
+
+@pragma("vm:never-inline")
+string() => "We all have identical strings";
+
+@pragma("vm:never-inline")
+list() => const <String>["We all have identical lists"];
+
+@pragma("vm:never-inline")
+map() => const <String, String>{"We all have": "identical maps"};
+
+@pragma("vm:never-inline")
+box() => const Box("We all have identical boxes");
+
+@pragma("vm:never-inline")
+enumm() => Enum.GREEN;
+
+@pragma("vm:never-inline")
+type() => Box;
+
+@pragma("vm:never-inline")
+closure() => commonClosure;
diff --git a/tests/language_2/deferred/split_constants_canonicalization_a_2.dart b/tests/language_2/deferred/split_constants_canonicalization_a_2.dart
new file mode 100644
index 0000000..ea054f5
--- /dev/null
+++ b/tests/language_2/deferred/split_constants_canonicalization_a_2.dart
@@ -0,0 +1,29 @@
+// Copyright (c) 2020, 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 "split_constants_canonicalization_test.dart";
+
+@pragma("vm:never-inline")
+mint() => 0x7FFFFFFFFFFFFFFF;
+
+@pragma("vm:never-inline")
+string() => "We all have identical strings";
+
+@pragma("vm:never-inline")
+list() => const <String>["We all have identical lists"];
+
+@pragma("vm:never-inline")
+map() => const <String, String>{"We all have": "identical maps"};
+
+@pragma("vm:never-inline")
+box() => const Box("We all have identical boxes");
+
+@pragma("vm:never-inline")
+enumm() => Enum.GREEN;
+
+@pragma("vm:never-inline")
+type() => Box;
+
+@pragma("vm:never-inline")
+closure() => commonClosure;
diff --git a/tests/language_2/deferred/split_constants_canonicalization_b.dart b/tests/language_2/deferred/split_constants_canonicalization_b.dart
new file mode 100644
index 0000000..f27900d
--- /dev/null
+++ b/tests/language_2/deferred/split_constants_canonicalization_b.dart
@@ -0,0 +1,29 @@
+// Copyright (c) 2020, 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 "split_constants_canonicalization_b_1.dart" deferred as b_1;
+import "split_constants_canonicalization_b_2.dart" deferred as b_2;
+
+loadChildren() async {
+  await b_1.loadLibrary();
+  await b_2.loadLibrary();
+}
+
+b_1_mint() => b_1.mint();
+b_1_string() => b_1.string();
+b_1_list() => b_1.list();
+b_1_map() => b_1.map();
+b_1_box() => b_1.box();
+b_1_enum() => b_1.enumm();
+b_1_type() => b_1.type();
+b_1_closure() => b_1.closure();
+
+b_2_mint() => b_2.mint();
+b_2_string() => b_2.string();
+b_2_list() => b_2.list();
+b_2_map() => b_2.map();
+b_2_box() => b_2.box();
+b_2_enum() => b_2.enumm();
+b_2_type() => b_2.type();
+b_2_closure() => b_2.closure();
diff --git a/tests/language_2/deferred/split_constants_canonicalization_b_1.dart b/tests/language_2/deferred/split_constants_canonicalization_b_1.dart
new file mode 100644
index 0000000..ea054f5
--- /dev/null
+++ b/tests/language_2/deferred/split_constants_canonicalization_b_1.dart
@@ -0,0 +1,29 @@
+// Copyright (c) 2020, 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 "split_constants_canonicalization_test.dart";
+
+@pragma("vm:never-inline")
+mint() => 0x7FFFFFFFFFFFFFFF;
+
+@pragma("vm:never-inline")
+string() => "We all have identical strings";
+
+@pragma("vm:never-inline")
+list() => const <String>["We all have identical lists"];
+
+@pragma("vm:never-inline")
+map() => const <String, String>{"We all have": "identical maps"};
+
+@pragma("vm:never-inline")
+box() => const Box("We all have identical boxes");
+
+@pragma("vm:never-inline")
+enumm() => Enum.GREEN;
+
+@pragma("vm:never-inline")
+type() => Box;
+
+@pragma("vm:never-inline")
+closure() => commonClosure;
diff --git a/tests/language_2/deferred/split_constants_canonicalization_b_2.dart b/tests/language_2/deferred/split_constants_canonicalization_b_2.dart
new file mode 100644
index 0000000..ea054f5
--- /dev/null
+++ b/tests/language_2/deferred/split_constants_canonicalization_b_2.dart
@@ -0,0 +1,29 @@
+// Copyright (c) 2020, 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 "split_constants_canonicalization_test.dart";
+
+@pragma("vm:never-inline")
+mint() => 0x7FFFFFFFFFFFFFFF;
+
+@pragma("vm:never-inline")
+string() => "We all have identical strings";
+
+@pragma("vm:never-inline")
+list() => const <String>["We all have identical lists"];
+
+@pragma("vm:never-inline")
+map() => const <String, String>{"We all have": "identical maps"};
+
+@pragma("vm:never-inline")
+box() => const Box("We all have identical boxes");
+
+@pragma("vm:never-inline")
+enumm() => Enum.GREEN;
+
+@pragma("vm:never-inline")
+type() => Box;
+
+@pragma("vm:never-inline")
+closure() => commonClosure;
diff --git a/tests/language_2/deferred/split_constants_canonicalization_test.dart b/tests/language_2/deferred/split_constants_canonicalization_test.dart
new file mode 100644
index 0000000..02d5c6e
--- /dev/null
+++ b/tests/language_2/deferred/split_constants_canonicalization_test.dart
@@ -0,0 +1,94 @@
+// Copyright (c) 2020, 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.
+
+// VMOptions=--use_bare_instructions=false
+// VMOptions=--use_bare_instructions=true
+
+import "package:expect/expect.dart";
+import "split_constants_canonicalization_a.dart" deferred as a;
+import "split_constants_canonicalization_b.dart" deferred as b;
+
+class Box {
+  final contents;
+  const Box(this.contents);
+}
+
+enum Enum {
+  RED,
+  GREEN,
+  BLUE,
+}
+
+commonClosure() {}
+
+main() async {
+  await a.loadLibrary();
+  await a.loadChildren();
+  await b.loadLibrary();
+  await b.loadChildren();
+
+  var a_1_mint = await a.a_1_mint();
+  var a_2_mint = await a.a_2_mint();
+  var b_1_mint = await b.b_1_mint();
+  var b_2_mint = await b.b_2_mint();
+  Expect.isTrue(identical(a_1_mint, a_2_mint));
+  Expect.isTrue(identical(a_1_mint, b_1_mint));
+  Expect.isTrue(identical(a_1_mint, b_2_mint));
+
+  var a_1_string = await a.a_1_string();
+  var a_2_string = await a.a_2_string();
+  var b_1_string = await b.b_1_string();
+  var b_2_string = await b.b_2_string();
+  Expect.isTrue(identical(a_1_string, a_2_string));
+  Expect.isTrue(identical(a_1_string, b_1_string));
+  Expect.isTrue(identical(a_1_string, b_2_string));
+
+  var a_1_list = await a.a_1_list();
+  var a_2_list = await a.a_2_list();
+  var b_1_list = await b.b_1_list();
+  var b_2_list = await b.b_2_list();
+  Expect.isTrue(identical(a_1_list, a_2_list));
+  Expect.isTrue(identical(a_1_list, b_1_list));
+  Expect.isTrue(identical(a_1_list, b_2_list));
+
+  var a_1_map = await a.a_1_map();
+  var a_2_map = await a.a_2_map();
+  var b_1_map = await b.b_1_map();
+  var b_2_map = await b.b_2_map();
+  Expect.isTrue(identical(a_1_map, a_2_map));
+  Expect.isTrue(identical(a_1_map, b_1_map));
+  Expect.isTrue(identical(a_1_map, b_2_map));
+
+  var a_1_box = await a.a_1_box();
+  var a_2_box = await a.a_2_box();
+  var b_1_box = await b.b_1_box();
+  var b_2_box = await b.b_2_box();
+  Expect.isTrue(identical(a_1_box, a_2_box));
+  Expect.isTrue(identical(a_1_box, b_1_box));
+  Expect.isTrue(identical(a_1_box, b_2_box));
+
+  var a_1_enum = await a.a_1_enum();
+  var a_2_enum = await a.a_2_enum();
+  var b_1_enum = await b.b_1_enum();
+  var b_2_enum = await b.b_2_enum();
+  Expect.isTrue(identical(a_1_enum, a_2_enum));
+  Expect.isTrue(identical(a_1_enum, b_1_enum));
+  Expect.isTrue(identical(a_1_enum, b_2_enum));
+
+  var a_1_type = await a.a_1_type();
+  var a_2_type = await a.a_2_type();
+  var b_1_type = await b.b_1_type();
+  var b_2_type = await b.b_2_type();
+  Expect.isTrue(identical(a_1_type, a_2_type));
+  Expect.isTrue(identical(a_1_type, b_1_type));
+  Expect.isTrue(identical(a_1_type, b_2_type));
+
+  var a_1_closure = await a.a_1_closure();
+  var a_2_closure = await a.a_2_closure();
+  var b_1_closure = await b.b_1_closure();
+  var b_2_closure = await b.b_2_closure();
+  Expect.isTrue(identical(a_1_closure, a_2_closure));
+  Expect.isTrue(identical(a_1_closure, b_1_closure));
+  Expect.isTrue(identical(a_1_closure, b_2_closure));
+}
diff --git a/tests/language_2/language_2.status b/tests/language_2/language_2.status
index 80846fb..4322081 100644
--- a/tests/language_2/language_2.status
+++ b/tests/language_2/language_2.status
@@ -5,9 +5,6 @@
 [ $compiler != dart2analyzer ]
 switch/case_warn_test: Skip # Analyzer only, see language_analyzer2.status
 
-[ $compiler != fasta ]
-nonfunction_type_aliases/*: Skip # github.com/dart-lang/language/issues/115
-
 [ $compiler == none ]
 invalid_returns/*: Skip # https://github.com/dart-lang/sdk/issues/34013
 void/*: Skip # https://github.com/dart-lang/sdk/issues/34013
diff --git a/tests/language_2/list/literal6_test.dart b/tests/language_2/list/literal6_test.dart
index 7d6e3d9..f066509 100644
--- a/tests/language_2/list/literal6_test.dart
+++ b/tests/language_2/list/literal6_test.dart
@@ -9,7 +9,7 @@
     // Type parameter is not allowed with const.
     var m = const <T>[];
     //             ^
-    // [analyzer] COMPILE_TIME_ERROR.INVALID_TYPE_ARGUMENT_IN_CONST_LIST
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_TYPE_ARGUMENT_IN_CONST_LITERAL
     // [cfe] Type variables can't be used as constants.
   }
 }
diff --git a/tests/language_2/map/literal14_test.dart b/tests/language_2/map/literal14_test.dart
index 4351eb9..1b4108f 100644
--- a/tests/language_2/map/literal14_test.dart
+++ b/tests/language_2/map/literal14_test.dart
@@ -8,7 +8,7 @@
   test() {
     var m = const <String, T>{};
     //                     ^
-    // [analyzer] COMPILE_TIME_ERROR.INVALID_TYPE_ARGUMENT_IN_CONST_MAP
+    // [analyzer] COMPILE_TIME_ERROR.INVALID_TYPE_ARGUMENT_IN_CONST_LITERAL
     // [cfe] Type variables can't be used as constants.
   }
 }
diff --git a/tests/language_2/nonfunction_type_aliases/generic_usage_class_test.dart b/tests/language_2/nonfunction_type_aliases/generic_usage_class_test.dart
index 33ec568..5ed9e00 100644
--- a/tests/language_2/nonfunction_type_aliases/generic_usage_class_test.dart
+++ b/tests/language_2/nonfunction_type_aliases/generic_usage_class_test.dart
@@ -54,7 +54,7 @@
 
 X foo<X>(X x) => x;
 
-T<Type> Function(T<Type>) id;
+T<Object> Function(T<Object>) id = (x) => x;
 
 main() {
   var v8 = <T<C>>[];
diff --git a/tests/language_2/nonfunction_type_aliases/generic_usage_dynamic_test.dart b/tests/language_2/nonfunction_type_aliases/generic_usage_dynamic_test.dart
index f812ca2..c1208a5 100644
--- a/tests/language_2/nonfunction_type_aliases/generic_usage_dynamic_test.dart
+++ b/tests/language_2/nonfunction_type_aliases/generic_usage_dynamic_test.dart
@@ -44,7 +44,7 @@
 
 X foo<X>(X x) => x;
 
-T<Type> Function(T<Type>) id;
+T<Object> Function(T<Object>) id = (x) => x;
 
 main() {
   var v8 = <T<C>>[];
diff --git a/tests/language_2/nonfunction_type_aliases/generic_usage_function_test.dart b/tests/language_2/nonfunction_type_aliases/generic_usage_function_test.dart
index 20049ea..33bac17 100644
--- a/tests/language_2/nonfunction_type_aliases/generic_usage_function_test.dart
+++ b/tests/language_2/nonfunction_type_aliases/generic_usage_function_test.dart
@@ -48,10 +48,6 @@
   T<dynamic> foo(T<dynamic> t) => t;
 }
 
-X foo<X>(X x) => x;
-
-T<Type> Function(T<Type>) id;
-
 main() {
   var v8 = <T<C>>[];
   var v9 = <Set<T<T>>, Set<T<T>>>{{}: {}};
diff --git a/tests/language_2/nonfunction_type_aliases/generic_usage_futureor_test.dart b/tests/language_2/nonfunction_type_aliases/generic_usage_futureor_test.dart
index 8b9f4e1..a81fad2 100644
--- a/tests/language_2/nonfunction_type_aliases/generic_usage_futureor_test.dart
+++ b/tests/language_2/nonfunction_type_aliases/generic_usage_futureor_test.dart
@@ -43,9 +43,7 @@
   T<dynamic> foo(T<dynamic> t) => t;
 }
 
-X foo<X>(X x) => x;
-
-T<Type> Function(T<Type>) id;
+T<Object> Function(T<Object>) id = (x) => x;
 
 main() {
   var v8 = <T<C>>[];
diff --git a/tests/language_2/nonfunction_type_aliases/generic_usage_null_test.dart b/tests/language_2/nonfunction_type_aliases/generic_usage_null_test.dart
index 48e8721..6101801 100644
--- a/tests/language_2/nonfunction_type_aliases/generic_usage_null_test.dart
+++ b/tests/language_2/nonfunction_type_aliases/generic_usage_null_test.dart
@@ -43,9 +43,7 @@
   T<dynamic> foo(T<dynamic> t) => t;
 }
 
-X foo<X>(X x) => x;
-
-T<Type> Function(T<Type>) id;
+T<Object> Function(T<Object>) id = (x) => x;
 
 main() {
   var v8 = <T<C>>[];
diff --git a/tests/language_2/nonfunction_type_aliases/generic_usage_object_test.dart b/tests/language_2/nonfunction_type_aliases/generic_usage_object_test.dart
index 71a3461..f6f9b24 100644
--- a/tests/language_2/nonfunction_type_aliases/generic_usage_object_test.dart
+++ b/tests/language_2/nonfunction_type_aliases/generic_usage_object_test.dart
@@ -47,10 +47,10 @@
   T<dynamic> foo(T<dynamic> t) => t;
 }
 
-T<Type> Function(T<Type>) id;
-
 X foo<X>(X x) => x;
 
+T<Object> Function(T<Object>) id = (x) => x;
+
 main() {
   var v8 = <T<C>>[];
   var v9 = <Set<T<T>>, Set<T<T>>>{{}: {}};
@@ -60,4 +60,5 @@
   v10 = v11;
   T<Null>();
   T<Object> v12 = foo<T<bool>>(T<bool>());
+  id(v12);
 }
diff --git a/tests/language_2/nonfunction_type_aliases/generic_usage_void_test.dart b/tests/language_2/nonfunction_type_aliases/generic_usage_void_test.dart
index c867206..6456366 100644
--- a/tests/language_2/nonfunction_type_aliases/generic_usage_void_test.dart
+++ b/tests/language_2/nonfunction_type_aliases/generic_usage_void_test.dart
@@ -43,9 +43,7 @@
   T<dynamic> foo(T<dynamic> t) => t;
 }
 
-X foo<X>(X x) => x;
-
-T<Type> Function(T<Type>) id;
+T<Object> Function(T<Object>) id = (x) => x;
 
 main() {
   var v8 = <T<C>>[];
diff --git a/tests/language_2/set_literals/big_set_literal_test.dart b/tests/language_2/set_literals/big_set_literal_test.dart
new file mode 100644
index 0000000..e06e357
--- /dev/null
+++ b/tests/language_2/set_literals/big_set_literal_test.dart
@@ -0,0 +1,20028 @@
+// Copyright (c) 2020, 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:expect/expect.dart";
+
+void main() {
+  Expect.equals(10000, intSet.length);
+  Iterator<int> intIterator = intSet.iterator;
+  for (int i = 0; i < 10000; i++) {
+    Expect.equals(true, intIterator.moveNext());
+    Expect.equals(i, intIterator.current);
+  }
+  Expect.equals(false, intIterator.moveNext());
+
+  Expect.equals(10000, stringSet.length);
+  Iterator<String> stringIterator = stringSet.iterator;
+  for (int i = 0; i < 10000; i++) {
+    Expect.equals(true, stringIterator.moveNext());
+    Expect.equals("foo_$i", stringIterator.current);
+  }
+  Expect.equals(false, stringIterator.moveNext());
+}
+
+Set<int> intSet = {
+  0,
+  1,
+  2,
+  3,
+  4,
+  5,
+  6,
+  7,
+  8,
+  9,
+  10,
+  11,
+  12,
+  13,
+  14,
+  15,
+  16,
+  17,
+  18,
+  19,
+  20,
+  21,
+  22,
+  23,
+  24,
+  25,
+  26,
+  27,
+  28,
+  29,
+  30,
+  31,
+  32,
+  33,
+  34,
+  35,
+  36,
+  37,
+  38,
+  39,
+  40,
+  41,
+  42,
+  43,
+  44,
+  45,
+  46,
+  47,
+  48,
+  49,
+  50,
+  51,
+  52,
+  53,
+  54,
+  55,
+  56,
+  57,
+  58,
+  59,
+  60,
+  61,
+  62,
+  63,
+  64,
+  65,
+  66,
+  67,
+  68,
+  69,
+  70,
+  71,
+  72,
+  73,
+  74,
+  75,
+  76,
+  77,
+  78,
+  79,
+  80,
+  81,
+  82,
+  83,
+  84,
+  85,
+  86,
+  87,
+  88,
+  89,
+  90,
+  91,
+  92,
+  93,
+  94,
+  95,
+  96,
+  97,
+  98,
+  99,
+  100,
+  101,
+  102,
+  103,
+  104,
+  105,
+  106,
+  107,
+  108,
+  109,
+  110,
+  111,
+  112,
+  113,
+  114,
+  115,
+  116,
+  117,
+  118,
+  119,
+  120,
+  121,
+  122,
+  123,
+  124,
+  125,
+  126,
+  127,
+  128,
+  129,
+  130,
+  131,
+  132,
+  133,
+  134,
+  135,
+  136,
+  137,
+  138,
+  139,
+  140,
+  141,
+  142,
+  143,
+  144,
+  145,
+  146,
+  147,
+  148,
+  149,
+  150,
+  151,
+  152,
+  153,
+  154,
+  155,
+  156,
+  157,
+  158,
+  159,
+  160,
+  161,
+  162,
+  163,
+  164,
+  165,
+  166,
+  167,
+  168,
+  169,
+  170,
+  171,
+  172,
+  173,
+  174,
+  175,
+  176,
+  177,
+  178,
+  179,
+  180,
+  181,
+  182,
+  183,
+  184,
+  185,
+  186,
+  187,
+  188,
+  189,
+  190,
+  191,
+  192,
+  193,
+  194,
+  195,
+  196,
+  197,
+  198,
+  199,
+  200,
+  201,
+  202,
+  203,
+  204,
+  205,
+  206,
+  207,
+  208,
+  209,
+  210,
+  211,
+  212,
+  213,
+  214,
+  215,
+  216,
+  217,
+  218,
+  219,
+  220,
+  221,
+  222,
+  223,
+  224,
+  225,
+  226,
+  227,
+  228,
+  229,
+  230,
+  231,
+  232,
+  233,
+  234,
+  235,
+  236,
+  237,
+  238,
+  239,
+  240,
+  241,
+  242,
+  243,
+  244,
+  245,
+  246,
+  247,
+  248,
+  249,
+  250,
+  251,
+  252,
+  253,
+  254,
+  255,
+  256,
+  257,
+  258,
+  259,
+  260,
+  261,
+  262,
+  263,
+  264,
+  265,
+  266,
+  267,
+  268,
+  269,
+  270,
+  271,
+  272,
+  273,
+  274,
+  275,
+  276,
+  277,
+  278,
+  279,
+  280,
+  281,
+  282,
+  283,
+  284,
+  285,
+  286,
+  287,
+  288,
+  289,
+  290,
+  291,
+  292,
+  293,
+  294,
+  295,
+  296,
+  297,
+  298,
+  299,
+  300,
+  301,
+  302,
+  303,
+  304,
+  305,
+  306,
+  307,
+  308,
+  309,
+  310,
+  311,
+  312,
+  313,
+  314,
+  315,
+  316,
+  317,
+  318,
+  319,
+  320,
+  321,
+  322,
+  323,
+  324,
+  325,
+  326,
+  327,
+  328,
+  329,
+  330,
+  331,
+  332,
+  333,
+  334,
+  335,
+  336,
+  337,
+  338,
+  339,
+  340,
+  341,
+  342,
+  343,
+  344,
+  345,
+  346,
+  347,
+  348,
+  349,
+  350,
+  351,
+  352,
+  353,
+  354,
+  355,
+  356,
+  357,
+  358,
+  359,
+  360,
+  361,
+  362,
+  363,
+  364,
+  365,
+  366,
+  367,
+  368,
+  369,
+  370,
+  371,
+  372,
+  373,
+  374,
+  375,
+  376,
+  377,
+  378,
+  379,
+  380,
+  381,
+  382,
+  383,
+  384,
+  385,
+  386,
+  387,
+  388,
+  389,
+  390,
+  391,
+  392,
+  393,
+  394,
+  395,
+  396,
+  397,
+  398,
+  399,
+  400,
+  401,
+  402,
+  403,
+  404,
+  405,
+  406,
+  407,
+  408,
+  409,
+  410,
+  411,
+  412,
+  413,
+  414,
+  415,
+  416,
+  417,
+  418,
+  419,
+  420,
+  421,
+  422,
+  423,
+  424,
+  425,
+  426,
+  427,
+  428,
+  429,
+  430,
+  431,
+  432,
+  433,
+  434,
+  435,
+  436,
+  437,
+  438,
+  439,
+  440,
+  441,
+  442,
+  443,
+  444,
+  445,
+  446,
+  447,
+  448,
+  449,
+  450,
+  451,
+  452,
+  453,
+  454,
+  455,
+  456,
+  457,
+  458,
+  459,
+  460,
+  461,
+  462,
+  463,
+  464,
+  465,
+  466,
+  467,
+  468,
+  469,
+  470,
+  471,
+  472,
+  473,
+  474,
+  475,
+  476,
+  477,
+  478,
+  479,
+  480,
+  481,
+  482,
+  483,
+  484,
+  485,
+  486,
+  487,
+  488,
+  489,
+  490,
+  491,
+  492,
+  493,
+  494,
+  495,
+  496,
+  497,
+  498,
+  499,
+  500,
+  501,
+  502,
+  503,
+  504,
+  505,
+  506,
+  507,
+  508,
+  509,
+  510,
+  511,
+  512,
+  513,
+  514,
+  515,
+  516,
+  517,
+  518,
+  519,
+  520,
+  521,
+  522,
+  523,
+  524,
+  525,
+  526,
+  527,
+  528,
+  529,
+  530,
+  531,
+  532,
+  533,
+  534,
+  535,
+  536,
+  537,
+  538,
+  539,
+  540,
+  541,
+  542,
+  543,
+  544,
+  545,
+  546,
+  547,
+  548,
+  549,
+  550,
+  551,
+  552,
+  553,
+  554,
+  555,
+  556,
+  557,
+  558,
+  559,
+  560,
+  561,
+  562,
+  563,
+  564,
+  565,
+  566,
+  567,
+  568,
+  569,
+  570,
+  571,
+  572,
+  573,
+  574,
+  575,
+  576,
+  577,
+  578,
+  579,
+  580,
+  581,
+  582,
+  583,
+  584,
+  585,
+  586,
+  587,
+  588,
+  589,
+  590,
+  591,
+  592,
+  593,
+  594,
+  595,
+  596,
+  597,
+  598,
+  599,
+  600,
+  601,
+  602,
+  603,
+  604,
+  605,
+  606,
+  607,
+  608,
+  609,
+  610,
+  611,
+  612,
+  613,
+  614,
+  615,
+  616,
+  617,
+  618,
+  619,
+  620,
+  621,
+  622,
+  623,
+  624,
+  625,
+  626,
+  627,
+  628,
+  629,
+  630,
+  631,
+  632,
+  633,
+  634,
+  635,
+  636,
+  637,
+  638,
+  639,
+  640,
+  641,
+  642,
+  643,
+  644,
+  645,
+  646,
+  647,
+  648,
+  649,
+  650,
+  651,
+  652,
+  653,
+  654,
+  655,
+  656,
+  657,
+  658,
+  659,
+  660,
+  661,
+  662,
+  663,
+  664,
+  665,
+  666,
+  667,
+  668,
+  669,
+  670,
+  671,
+  672,
+  673,
+  674,
+  675,
+  676,
+  677,
+  678,
+  679,
+  680,
+  681,
+  682,
+  683,
+  684,
+  685,
+  686,
+  687,
+  688,
+  689,
+  690,
+  691,
+  692,
+  693,
+  694,
+  695,
+  696,
+  697,
+  698,
+  699,
+  700,
+  701,
+  702,
+  703,
+  704,
+  705,
+  706,
+  707,
+  708,
+  709,
+  710,
+  711,
+  712,
+  713,
+  714,
+  715,
+  716,
+  717,
+  718,
+  719,
+  720,
+  721,
+  722,
+  723,
+  724,
+  725,
+  726,
+  727,
+  728,
+  729,
+  730,
+  731,
+  732,
+  733,
+  734,
+  735,
+  736,
+  737,
+  738,
+  739,
+  740,
+  741,
+  742,
+  743,
+  744,
+  745,
+  746,
+  747,
+  748,
+  749,
+  750,
+  751,
+  752,
+  753,
+  754,
+  755,
+  756,
+  757,
+  758,
+  759,
+  760,
+  761,
+  762,
+  763,
+  764,
+  765,
+  766,
+  767,
+  768,
+  769,
+  770,
+  771,
+  772,
+  773,
+  774,
+  775,
+  776,
+  777,
+  778,
+  779,
+  780,
+  781,
+  782,
+  783,
+  784,
+  785,
+  786,
+  787,
+  788,
+  789,
+  790,
+  791,
+  792,
+  793,
+  794,
+  795,
+  796,
+  797,
+  798,
+  799,
+  800,
+  801,
+  802,
+  803,
+  804,
+  805,
+  806,
+  807,
+  808,
+  809,
+  810,
+  811,
+  812,
+  813,
+  814,
+  815,
+  816,
+  817,
+  818,
+  819,
+  820,
+  821,
+  822,
+  823,
+  824,
+  825,
+  826,
+  827,
+  828,
+  829,
+  830,
+  831,
+  832,
+  833,
+  834,
+  835,
+  836,
+  837,
+  838,
+  839,
+  840,
+  841,
+  842,
+  843,
+  844,
+  845,
+  846,
+  847,
+  848,
+  849,
+  850,
+  851,
+  852,
+  853,
+  854,
+  855,
+  856,
+  857,
+  858,
+  859,
+  860,
+  861,
+  862,
+  863,
+  864,
+  865,
+  866,
+  867,
+  868,
+  869,
+  870,
+  871,
+  872,
+  873,
+  874,
+  875,
+  876,
+  877,
+  878,
+  879,
+  880,
+  881,
+  882,
+  883,
+  884,
+  885,
+  886,
+  887,
+  888,
+  889,
+  890,
+  891,
+  892,
+  893,
+  894,
+  895,
+  896,
+  897,
+  898,
+  899,
+  900,
+  901,
+  902,
+  903,
+  904,
+  905,
+  906,
+  907,
+  908,
+  909,
+  910,
+  911,
+  912,
+  913,
+  914,
+  915,
+  916,
+  917,
+  918,
+  919,
+  920,
+  921,
+  922,
+  923,
+  924,
+  925,
+  926,
+  927,
+  928,
+  929,
+  930,
+  931,
+  932,
+  933,
+  934,
+  935,
+  936,
+  937,
+  938,
+  939,
+  940,
+  941,
+  942,
+  943,
+  944,
+  945,
+  946,
+  947,
+  948,
+  949,
+  950,
+  951,
+  952,
+  953,
+  954,
+  955,
+  956,
+  957,
+  958,
+  959,
+  960,
+  961,
+  962,
+  963,
+  964,
+  965,
+  966,
+  967,
+  968,
+  969,
+  970,
+  971,
+  972,
+  973,
+  974,
+  975,
+  976,
+  977,
+  978,
+  979,
+  980,
+  981,
+  982,
+  983,
+  984,
+  985,
+  986,
+  987,
+  988,
+  989,
+  990,
+  991,
+  992,
+  993,
+  994,
+  995,
+  996,
+  997,
+  998,
+  999,
+  1000,
+  1001,
+  1002,
+  1003,
+  1004,
+  1005,
+  1006,
+  1007,
+  1008,
+  1009,
+  1010,
+  1011,
+  1012,
+  1013,
+  1014,
+  1015,
+  1016,
+  1017,
+  1018,
+  1019,
+  1020,
+  1021,
+  1022,
+  1023,
+  1024,
+  1025,
+  1026,
+  1027,
+  1028,
+  1029,
+  1030,
+  1031,
+  1032,
+  1033,
+  1034,
+  1035,
+  1036,
+  1037,
+  1038,
+  1039,
+  1040,
+  1041,
+  1042,
+  1043,
+  1044,
+  1045,
+  1046,
+  1047,
+  1048,
+  1049,
+  1050,
+  1051,
+  1052,
+  1053,
+  1054,
+  1055,
+  1056,
+  1057,
+  1058,
+  1059,
+  1060,
+  1061,
+  1062,
+  1063,
+  1064,
+  1065,
+  1066,
+  1067,
+  1068,
+  1069,
+  1070,
+  1071,
+  1072,
+  1073,
+  1074,
+  1075,
+  1076,
+  1077,
+  1078,
+  1079,
+  1080,
+  1081,
+  1082,
+  1083,
+  1084,
+  1085,
+  1086,
+  1087,
+  1088,
+  1089,
+  1090,
+  1091,
+  1092,
+  1093,
+  1094,
+  1095,
+  1096,
+  1097,
+  1098,
+  1099,
+  1100,
+  1101,
+  1102,
+  1103,
+  1104,
+  1105,
+  1106,
+  1107,
+  1108,
+  1109,
+  1110,
+  1111,
+  1112,
+  1113,
+  1114,
+  1115,
+  1116,
+  1117,
+  1118,
+  1119,
+  1120,
+  1121,
+  1122,
+  1123,
+  1124,
+  1125,
+  1126,
+  1127,
+  1128,
+  1129,
+  1130,
+  1131,
+  1132,
+  1133,
+  1134,
+  1135,
+  1136,
+  1137,
+  1138,
+  1139,
+  1140,
+  1141,
+  1142,
+  1143,
+  1144,
+  1145,
+  1146,
+  1147,
+  1148,
+  1149,
+  1150,
+  1151,
+  1152,
+  1153,
+  1154,
+  1155,
+  1156,
+  1157,
+  1158,
+  1159,
+  1160,
+  1161,
+  1162,
+  1163,
+  1164,
+  1165,
+  1166,
+  1167,
+  1168,
+  1169,
+  1170,
+  1171,
+  1172,
+  1173,
+  1174,
+  1175,
+  1176,
+  1177,
+  1178,
+  1179,
+  1180,
+  1181,
+  1182,
+  1183,
+  1184,
+  1185,
+  1186,
+  1187,
+  1188,
+  1189,
+  1190,
+  1191,
+  1192,
+  1193,
+  1194,
+  1195,
+  1196,
+  1197,
+  1198,
+  1199,
+  1200,
+  1201,
+  1202,
+  1203,
+  1204,
+  1205,
+  1206,
+  1207,
+  1208,
+  1209,
+  1210,
+  1211,
+  1212,
+  1213,
+  1214,
+  1215,
+  1216,
+  1217,
+  1218,
+  1219,
+  1220,
+  1221,
+  1222,
+  1223,
+  1224,
+  1225,
+  1226,
+  1227,
+  1228,
+  1229,
+  1230,
+  1231,
+  1232,
+  1233,
+  1234,
+  1235,
+  1236,
+  1237,
+  1238,
+  1239,
+  1240,
+  1241,
+  1242,
+  1243,
+  1244,
+  1245,
+  1246,
+  1247,
+  1248,
+  1249,
+  1250,
+  1251,
+  1252,
+  1253,
+  1254,
+  1255,
+  1256,
+  1257,
+  1258,
+  1259,
+  1260,
+  1261,
+  1262,
+  1263,
+  1264,
+  1265,
+  1266,
+  1267,
+  1268,
+  1269,
+  1270,
+  1271,
+  1272,
+  1273,
+  1274,
+  1275,
+  1276,
+  1277,
+  1278,
+  1279,
+  1280,
+  1281,
+  1282,
+  1283,
+  1284,
+  1285,
+  1286,
+  1287,
+  1288,
+  1289,
+  1290,
+  1291,
+  1292,
+  1293,
+  1294,
+  1295,
+  1296,
+  1297,
+  1298,
+  1299,
+  1300,
+  1301,
+  1302,
+  1303,
+  1304,
+  1305,
+  1306,
+  1307,
+  1308,
+  1309,
+  1310,
+  1311,
+  1312,
+  1313,
+  1314,
+  1315,
+  1316,
+  1317,
+  1318,
+  1319,
+  1320,
+  1321,
+  1322,
+  1323,
+  1324,
+  1325,
+  1326,
+  1327,
+  1328,
+  1329,
+  1330,
+  1331,
+  1332,
+  1333,
+  1334,
+  1335,
+  1336,
+  1337,
+  1338,
+  1339,
+  1340,
+  1341,
+  1342,
+  1343,
+  1344,
+  1345,
+  1346,
+  1347,
+  1348,
+  1349,
+  1350,
+  1351,
+  1352,
+  1353,
+  1354,
+  1355,
+  1356,
+  1357,
+  1358,
+  1359,
+  1360,
+  1361,
+  1362,
+  1363,
+  1364,
+  1365,
+  1366,
+  1367,
+  1368,
+  1369,
+  1370,
+  1371,
+  1372,
+  1373,
+  1374,
+  1375,
+  1376,
+  1377,
+  1378,
+  1379,
+  1380,
+  1381,
+  1382,
+  1383,
+  1384,
+  1385,
+  1386,
+  1387,
+  1388,
+  1389,
+  1390,
+  1391,
+  1392,
+  1393,
+  1394,
+  1395,
+  1396,
+  1397,
+  1398,
+  1399,
+  1400,
+  1401,
+  1402,
+  1403,
+  1404,
+  1405,
+  1406,
+  1407,
+  1408,
+  1409,
+  1410,
+  1411,
+  1412,
+  1413,
+  1414,
+  1415,
+  1416,
+  1417,
+  1418,
+  1419,
+  1420,
+  1421,
+  1422,
+  1423,
+  1424,
+  1425,
+  1426,
+  1427,
+  1428,
+  1429,
+  1430,
+  1431,
+  1432,
+  1433,
+  1434,
+  1435,
+  1436,
+  1437,
+  1438,
+  1439,
+  1440,
+  1441,
+  1442,
+  1443,
+  1444,
+  1445,
+  1446,
+  1447,
+  1448,
+  1449,
+  1450,
+  1451,
+  1452,
+  1453,
+  1454,
+  1455,
+  1456,
+  1457,
+  1458,
+  1459,
+  1460,
+  1461,
+  1462,
+  1463,
+  1464,
+  1465,
+  1466,
+  1467,
+  1468,
+  1469,
+  1470,
+  1471,
+  1472,
+  1473,
+  1474,
+  1475,
+  1476,
+  1477,
+  1478,
+  1479,
+  1480,
+  1481,
+  1482,
+  1483,
+  1484,
+  1485,
+  1486,
+  1487,
+  1488,
+  1489,
+  1490,
+  1491,
+  1492,
+  1493,
+  1494,
+  1495,
+  1496,
+  1497,
+  1498,
+  1499,
+  1500,
+  1501,
+  1502,
+  1503,
+  1504,
+  1505,
+  1506,
+  1507,
+  1508,
+  1509,
+  1510,
+  1511,
+  1512,
+  1513,
+  1514,
+  1515,
+  1516,
+  1517,
+  1518,
+  1519,
+  1520,
+  1521,
+  1522,
+  1523,
+  1524,
+  1525,
+  1526,
+  1527,
+  1528,
+  1529,
+  1530,
+  1531,
+  1532,
+  1533,
+  1534,
+  1535,
+  1536,
+  1537,
+  1538,
+  1539,
+  1540,
+  1541,
+  1542,
+  1543,
+  1544,
+  1545,
+  1546,
+  1547,
+  1548,
+  1549,
+  1550,
+  1551,
+  1552,
+  1553,
+  1554,
+  1555,
+  1556,
+  1557,
+  1558,
+  1559,
+  1560,
+  1561,
+  1562,
+  1563,
+  1564,
+  1565,
+  1566,
+  1567,
+  1568,
+  1569,
+  1570,
+  1571,
+  1572,
+  1573,
+  1574,
+  1575,
+  1576,
+  1577,
+  1578,
+  1579,
+  1580,
+  1581,
+  1582,
+  1583,
+  1584,
+  1585,
+  1586,
+  1587,
+  1588,
+  1589,
+  1590,
+  1591,
+  1592,
+  1593,
+  1594,
+  1595,
+  1596,
+  1597,
+  1598,
+  1599,
+  1600,
+  1601,
+  1602,
+  1603,
+  1604,
+  1605,
+  1606,
+  1607,
+  1608,
+  1609,
+  1610,
+  1611,
+  1612,
+  1613,
+  1614,
+  1615,
+  1616,
+  1617,
+  1618,
+  1619,
+  1620,
+  1621,
+  1622,
+  1623,
+  1624,
+  1625,
+  1626,
+  1627,
+  1628,
+  1629,
+  1630,
+  1631,
+  1632,
+  1633,
+  1634,
+  1635,
+  1636,
+  1637,
+  1638,
+  1639,
+  1640,
+  1641,
+  1642,
+  1643,
+  1644,
+  1645,
+  1646,
+  1647,
+  1648,
+  1649,
+  1650,
+  1651,
+  1652,
+  1653,
+  1654,
+  1655,
+  1656,
+  1657,
+  1658,
+  1659,
+  1660,
+  1661,
+  1662,
+  1663,
+  1664,
+  1665,
+  1666,
+  1667,
+  1668,
+  1669,
+  1670,
+  1671,
+  1672,
+  1673,
+  1674,
+  1675,
+  1676,
+  1677,
+  1678,
+  1679,
+  1680,
+  1681,
+  1682,
+  1683,
+  1684,
+  1685,
+  1686,
+  1687,
+  1688,
+  1689,
+  1690,
+  1691,
+  1692,
+  1693,
+  1694,
+  1695,
+  1696,
+  1697,
+  1698,
+  1699,
+  1700,
+  1701,
+  1702,
+  1703,
+  1704,
+  1705,
+  1706,
+  1707,
+  1708,
+  1709,
+  1710,
+  1711,
+  1712,
+  1713,
+  1714,
+  1715,
+  1716,
+  1717,
+  1718,
+  1719,
+  1720,
+  1721,
+  1722,
+  1723,
+  1724,
+  1725,
+  1726,
+  1727,
+  1728,
+  1729,
+  1730,
+  1731,
+  1732,
+  1733,
+  1734,
+  1735,
+  1736,
+  1737,
+  1738,
+  1739,
+  1740,
+  1741,
+  1742,
+  1743,
+  1744,
+  1745,
+  1746,
+  1747,
+  1748,
+  1749,
+  1750,
+  1751,
+  1752,
+  1753,
+  1754,
+  1755,
+  1756,
+  1757,
+  1758,
+  1759,
+  1760,
+  1761,
+  1762,
+  1763,
+  1764,
+  1765,
+  1766,
+  1767,
+  1768,
+  1769,
+  1770,
+  1771,
+  1772,
+  1773,
+  1774,
+  1775,
+  1776,
+  1777,
+  1778,
+  1779,
+  1780,
+  1781,
+  1782,
+  1783,
+  1784,
+  1785,
+  1786,
+  1787,
+  1788,
+  1789,
+  1790,
+  1791,
+  1792,
+  1793,
+  1794,
+  1795,
+  1796,
+  1797,
+  1798,
+  1799,
+  1800,
+  1801,
+  1802,
+  1803,
+  1804,
+  1805,
+  1806,
+  1807,
+  1808,
+  1809,
+  1810,
+  1811,
+  1812,
+  1813,
+  1814,
+  1815,
+  1816,
+  1817,
+  1818,
+  1819,
+  1820,
+  1821,
+  1822,
+  1823,
+  1824,
+  1825,
+  1826,
+  1827,
+  1828,
+  1829,
+  1830,
+  1831,
+  1832,
+  1833,
+  1834,
+  1835,
+  1836,
+  1837,
+  1838,
+  1839,
+  1840,
+  1841,
+  1842,
+  1843,
+  1844,
+  1845,
+  1846,
+  1847,
+  1848,
+  1849,
+  1850,
+  1851,
+  1852,
+  1853,
+  1854,
+  1855,
+  1856,
+  1857,
+  1858,
+  1859,
+  1860,
+  1861,
+  1862,
+  1863,
+  1864,
+  1865,
+  1866,
+  1867,
+  1868,
+  1869,
+  1870,
+  1871,
+  1872,
+  1873,
+  1874,
+  1875,
+  1876,
+  1877,
+  1878,
+  1879,
+  1880,
+  1881,
+  1882,
+  1883,
+  1884,
+  1885,
+  1886,
+  1887,
+  1888,
+  1889,
+  1890,
+  1891,
+  1892,
+  1893,
+  1894,
+  1895,
+  1896,
+  1897,
+  1898,
+  1899,
+  1900,
+  1901,
+  1902,
+  1903,
+  1904,
+  1905,
+  1906,
+  1907,
+  1908,
+  1909,
+  1910,
+  1911,
+  1912,
+  1913,
+  1914,
+  1915,
+  1916,
+  1917,
+  1918,
+  1919,
+  1920,
+  1921,
+  1922,
+  1923,
+  1924,
+  1925,
+  1926,
+  1927,
+  1928,
+  1929,
+  1930,
+  1931,
+  1932,
+  1933,
+  1934,
+  1935,
+  1936,
+  1937,
+  1938,
+  1939,
+  1940,
+  1941,
+  1942,
+  1943,
+  1944,
+  1945,
+  1946,
+  1947,
+  1948,
+  1949,
+  1950,
+  1951,
+  1952,
+  1953,
+  1954,
+  1955,
+  1956,
+  1957,
+  1958,
+  1959,
+  1960,
+  1961,
+  1962,
+  1963,
+  1964,
+  1965,
+  1966,
+  1967,
+  1968,
+  1969,
+  1970,
+  1971,
+  1972,
+  1973,
+  1974,
+  1975,
+  1976,
+  1977,
+  1978,
+  1979,
+  1980,
+  1981,
+  1982,
+  1983,
+  1984,
+  1985,
+  1986,
+  1987,
+  1988,
+  1989,
+  1990,
+  1991,
+  1992,
+  1993,
+  1994,
+  1995,
+  1996,
+  1997,
+  1998,
+  1999,
+  2000,
+  2001,
+  2002,
+  2003,
+  2004,
+  2005,
+  2006,
+  2007,
+  2008,
+  2009,
+  2010,
+  2011,
+  2012,
+  2013,
+  2014,
+  2015,
+  2016,
+  2017,
+  2018,
+  2019,
+  2020,
+  2021,
+  2022,
+  2023,
+  2024,
+  2025,
+  2026,
+  2027,
+  2028,
+  2029,
+  2030,
+  2031,
+  2032,
+  2033,
+  2034,
+  2035,
+  2036,
+  2037,
+  2038,
+  2039,
+  2040,
+  2041,
+  2042,
+  2043,
+  2044,
+  2045,
+  2046,
+  2047,
+  2048,
+  2049,
+  2050,
+  2051,
+  2052,
+  2053,
+  2054,
+  2055,
+  2056,
+  2057,
+  2058,
+  2059,
+  2060,
+  2061,
+  2062,
+  2063,
+  2064,
+  2065,
+  2066,
+  2067,
+  2068,
+  2069,
+  2070,
+  2071,
+  2072,
+  2073,
+  2074,
+  2075,
+  2076,
+  2077,
+  2078,
+  2079,
+  2080,
+  2081,
+  2082,
+  2083,
+  2084,
+  2085,
+  2086,
+  2087,
+  2088,
+  2089,
+  2090,
+  2091,
+  2092,
+  2093,
+  2094,
+  2095,
+  2096,
+  2097,
+  2098,
+  2099,
+  2100,
+  2101,
+  2102,
+  2103,
+  2104,
+  2105,
+  2106,
+  2107,
+  2108,
+  2109,
+  2110,
+  2111,
+  2112,
+  2113,
+  2114,
+  2115,
+  2116,
+  2117,
+  2118,
+  2119,
+  2120,
+  2121,
+  2122,
+  2123,
+  2124,
+  2125,
+  2126,
+  2127,
+  2128,
+  2129,
+  2130,
+  2131,
+  2132,
+  2133,
+  2134,
+  2135,
+  2136,
+  2137,
+  2138,
+  2139,
+  2140,
+  2141,
+  2142,
+  2143,
+  2144,
+  2145,
+  2146,
+  2147,
+  2148,
+  2149,
+  2150,
+  2151,
+  2152,
+  2153,
+  2154,
+  2155,
+  2156,
+  2157,
+  2158,
+  2159,
+  2160,
+  2161,
+  2162,
+  2163,
+  2164,
+  2165,
+  2166,
+  2167,
+  2168,
+  2169,
+  2170,
+  2171,
+  2172,
+  2173,
+  2174,
+  2175,
+  2176,
+  2177,
+  2178,
+  2179,
+  2180,
+  2181,
+  2182,
+  2183,
+  2184,
+  2185,
+  2186,
+  2187,
+  2188,
+  2189,
+  2190,
+  2191,
+  2192,
+  2193,
+  2194,
+  2195,
+  2196,
+  2197,
+  2198,
+  2199,
+  2200,
+  2201,
+  2202,
+  2203,
+  2204,
+  2205,
+  2206,
+  2207,
+  2208,
+  2209,
+  2210,
+  2211,
+  2212,
+  2213,
+  2214,
+  2215,
+  2216,
+  2217,
+  2218,
+  2219,
+  2220,
+  2221,
+  2222,
+  2223,
+  2224,
+  2225,
+  2226,
+  2227,
+  2228,
+  2229,
+  2230,
+  2231,
+  2232,
+  2233,
+  2234,
+  2235,
+  2236,
+  2237,
+  2238,
+  2239,
+  2240,
+  2241,
+  2242,
+  2243,
+  2244,
+  2245,
+  2246,
+  2247,
+  2248,
+  2249,
+  2250,
+  2251,
+  2252,
+  2253,
+  2254,
+  2255,
+  2256,
+  2257,
+  2258,
+  2259,
+  2260,
+  2261,
+  2262,
+  2263,
+  2264,
+  2265,
+  2266,
+  2267,
+  2268,
+  2269,
+  2270,
+  2271,
+  2272,
+  2273,
+  2274,
+  2275,
+  2276,
+  2277,
+  2278,
+  2279,
+  2280,
+  2281,
+  2282,
+  2283,
+  2284,
+  2285,
+  2286,
+  2287,
+  2288,
+  2289,
+  2290,
+  2291,
+  2292,
+  2293,
+  2294,
+  2295,
+  2296,
+  2297,
+  2298,
+  2299,
+  2300,
+  2301,
+  2302,
+  2303,
+  2304,
+  2305,
+  2306,
+  2307,
+  2308,
+  2309,
+  2310,
+  2311,
+  2312,
+  2313,
+  2314,
+  2315,
+  2316,
+  2317,
+  2318,
+  2319,
+  2320,
+  2321,
+  2322,
+  2323,
+  2324,
+  2325,
+  2326,
+  2327,
+  2328,
+  2329,
+  2330,
+  2331,
+  2332,
+  2333,
+  2334,
+  2335,
+  2336,
+  2337,
+  2338,
+  2339,
+  2340,
+  2341,
+  2342,
+  2343,
+  2344,
+  2345,
+  2346,
+  2347,
+  2348,
+  2349,
+  2350,
+  2351,
+  2352,
+  2353,
+  2354,
+  2355,
+  2356,
+  2357,
+  2358,
+  2359,
+  2360,
+  2361,
+  2362,
+  2363,
+  2364,
+  2365,
+  2366,
+  2367,
+  2368,
+  2369,
+  2370,
+  2371,
+  2372,
+  2373,
+  2374,
+  2375,
+  2376,
+  2377,
+  2378,
+  2379,
+  2380,
+  2381,
+  2382,
+  2383,
+  2384,
+  2385,
+  2386,
+  2387,
+  2388,
+  2389,
+  2390,
+  2391,
+  2392,
+  2393,
+  2394,
+  2395,
+  2396,
+  2397,
+  2398,
+  2399,
+  2400,
+  2401,
+  2402,
+  2403,
+  2404,
+  2405,
+  2406,
+  2407,
+  2408,
+  2409,
+  2410,
+  2411,
+  2412,
+  2413,
+  2414,
+  2415,
+  2416,
+  2417,
+  2418,
+  2419,
+  2420,
+  2421,
+  2422,
+  2423,
+  2424,
+  2425,
+  2426,
+  2427,
+  2428,
+  2429,
+  2430,
+  2431,
+  2432,
+  2433,
+  2434,
+  2435,
+  2436,
+  2437,
+  2438,
+  2439,
+  2440,
+  2441,
+  2442,
+  2443,
+  2444,
+  2445,
+  2446,
+  2447,
+  2448,
+  2449,
+  2450,
+  2451,
+  2452,
+  2453,
+  2454,
+  2455,
+  2456,
+  2457,
+  2458,
+  2459,
+  2460,
+  2461,
+  2462,
+  2463,
+  2464,
+  2465,
+  2466,
+  2467,
+  2468,
+  2469,
+  2470,
+  2471,
+  2472,
+  2473,
+  2474,
+  2475,
+  2476,
+  2477,
+  2478,
+  2479,
+  2480,
+  2481,
+  2482,
+  2483,
+  2484,
+  2485,
+  2486,
+  2487,
+  2488,
+  2489,
+  2490,
+  2491,
+  2492,
+  2493,
+  2494,
+  2495,
+  2496,
+  2497,
+  2498,
+  2499,
+  2500,
+  2501,
+  2502,
+  2503,
+  2504,
+  2505,
+  2506,
+  2507,
+  2508,
+  2509,
+  2510,
+  2511,
+  2512,
+  2513,
+  2514,
+  2515,
+  2516,
+  2517,
+  2518,
+  2519,
+  2520,
+  2521,
+  2522,
+  2523,
+  2524,
+  2525,
+  2526,
+  2527,
+  2528,
+  2529,
+  2530,
+  2531,
+  2532,
+  2533,
+  2534,
+  2535,
+  2536,
+  2537,
+  2538,
+  2539,
+  2540,
+  2541,
+  2542,
+  2543,
+  2544,
+  2545,
+  2546,
+  2547,
+  2548,
+  2549,
+  2550,
+  2551,
+  2552,
+  2553,
+  2554,
+  2555,
+  2556,
+  2557,
+  2558,
+  2559,
+  2560,
+  2561,
+  2562,
+  2563,
+  2564,
+  2565,
+  2566,
+  2567,
+  2568,
+  2569,
+  2570,
+  2571,
+  2572,
+  2573,
+  2574,
+  2575,
+  2576,
+  2577,
+  2578,
+  2579,
+  2580,
+  2581,
+  2582,
+  2583,
+  2584,
+  2585,
+  2586,
+  2587,
+  2588,
+  2589,
+  2590,
+  2591,
+  2592,
+  2593,
+  2594,
+  2595,
+  2596,
+  2597,
+  2598,
+  2599,
+  2600,
+  2601,
+  2602,
+  2603,
+  2604,
+  2605,
+  2606,
+  2607,
+  2608,
+  2609,
+  2610,
+  2611,
+  2612,
+  2613,
+  2614,
+  2615,
+  2616,
+  2617,
+  2618,
+  2619,
+  2620,
+  2621,
+  2622,
+  2623,
+  2624,
+  2625,
+  2626,
+  2627,
+  2628,
+  2629,
+  2630,
+  2631,
+  2632,
+  2633,
+  2634,
+  2635,
+  2636,
+  2637,
+  2638,
+  2639,
+  2640,
+  2641,
+  2642,
+  2643,
+  2644,
+  2645,
+  2646,
+  2647,
+  2648,
+  2649,
+  2650,
+  2651,
+  2652,
+  2653,
+  2654,
+  2655,
+  2656,
+  2657,
+  2658,
+  2659,
+  2660,
+  2661,
+  2662,
+  2663,
+  2664,
+  2665,
+  2666,
+  2667,
+  2668,
+  2669,
+  2670,
+  2671,
+  2672,
+  2673,
+  2674,
+  2675,
+  2676,
+  2677,
+  2678,
+  2679,
+  2680,
+  2681,
+  2682,
+  2683,
+  2684,
+  2685,
+  2686,
+  2687,
+  2688,
+  2689,
+  2690,
+  2691,
+  2692,
+  2693,
+  2694,
+  2695,
+  2696,
+  2697,
+  2698,
+  2699,
+  2700,
+  2701,
+  2702,
+  2703,
+  2704,
+  2705,
+  2706,
+  2707,
+  2708,
+  2709,
+  2710,
+  2711,
+  2712,
+  2713,
+  2714,
+  2715,
+  2716,
+  2717,
+  2718,
+  2719,
+  2720,
+  2721,
+  2722,
+  2723,
+  2724,
+  2725,
+  2726,
+  2727,
+  2728,
+  2729,
+  2730,
+  2731,
+  2732,
+  2733,
+  2734,
+  2735,
+  2736,
+  2737,
+  2738,
+  2739,
+  2740,
+  2741,
+  2742,
+  2743,
+  2744,
+  2745,
+  2746,
+  2747,
+  2748,
+  2749,
+  2750,
+  2751,
+  2752,
+  2753,
+  2754,
+  2755,
+  2756,
+  2757,
+  2758,
+  2759,
+  2760,
+  2761,
+  2762,
+  2763,
+  2764,
+  2765,
+  2766,
+  2767,
+  2768,
+  2769,
+  2770,
+  2771,
+  2772,
+  2773,
+  2774,
+  2775,
+  2776,
+  2777,
+  2778,
+  2779,
+  2780,
+  2781,
+  2782,
+  2783,
+  2784,
+  2785,
+  2786,
+  2787,
+  2788,
+  2789,
+  2790,
+  2791,
+  2792,
+  2793,
+  2794,
+  2795,
+  2796,
+  2797,
+  2798,
+  2799,
+  2800,
+  2801,
+  2802,
+  2803,
+  2804,
+  2805,
+  2806,
+  2807,
+  2808,
+  2809,
+  2810,
+  2811,
+  2812,
+  2813,
+  2814,
+  2815,
+  2816,
+  2817,
+  2818,
+  2819,
+  2820,
+  2821,
+  2822,
+  2823,
+  2824,
+  2825,
+  2826,
+  2827,
+  2828,
+  2829,
+  2830,
+  2831,
+  2832,
+  2833,
+  2834,
+  2835,
+  2836,
+  2837,
+  2838,
+  2839,
+  2840,
+  2841,
+  2842,
+  2843,
+  2844,
+  2845,
+  2846,
+  2847,
+  2848,
+  2849,
+  2850,
+  2851,
+  2852,
+  2853,
+  2854,
+  2855,
+  2856,
+  2857,
+  2858,
+  2859,
+  2860,
+  2861,
+  2862,
+  2863,
+  2864,
+  2865,
+  2866,
+  2867,
+  2868,
+  2869,
+  2870,
+  2871,
+  2872,
+  2873,
+  2874,
+  2875,
+  2876,
+  2877,
+  2878,
+  2879,
+  2880,
+  2881,
+  2882,
+  2883,
+  2884,
+  2885,
+  2886,
+  2887,
+  2888,
+  2889,
+  2890,
+  2891,
+  2892,
+  2893,
+  2894,
+  2895,
+  2896,
+  2897,
+  2898,
+  2899,
+  2900,
+  2901,
+  2902,
+  2903,
+  2904,
+  2905,
+  2906,
+  2907,
+  2908,
+  2909,
+  2910,
+  2911,
+  2912,
+  2913,
+  2914,
+  2915,
+  2916,
+  2917,
+  2918,
+  2919,
+  2920,
+  2921,
+  2922,
+  2923,
+  2924,
+  2925,
+  2926,
+  2927,
+  2928,
+  2929,
+  2930,
+  2931,
+  2932,
+  2933,
+  2934,
+  2935,
+  2936,
+  2937,
+  2938,
+  2939,
+  2940,
+  2941,
+  2942,
+  2943,
+  2944,
+  2945,
+  2946,
+  2947,
+  2948,
+  2949,
+  2950,
+  2951,
+  2952,
+  2953,
+  2954,
+  2955,
+  2956,
+  2957,
+  2958,
+  2959,
+  2960,
+  2961,
+  2962,
+  2963,
+  2964,
+  2965,
+  2966,
+  2967,
+  2968,
+  2969,
+  2970,
+  2971,
+  2972,
+  2973,
+  2974,
+  2975,
+  2976,
+  2977,
+  2978,
+  2979,
+  2980,
+  2981,
+  2982,
+  2983,
+  2984,
+  2985,
+  2986,
+  2987,
+  2988,
+  2989,
+  2990,
+  2991,
+  2992,
+  2993,
+  2994,
+  2995,
+  2996,
+  2997,
+  2998,
+  2999,
+  3000,
+  3001,
+  3002,
+  3003,
+  3004,
+  3005,
+  3006,
+  3007,
+  3008,
+  3009,
+  3010,
+  3011,
+  3012,
+  3013,
+  3014,
+  3015,
+  3016,
+  3017,
+  3018,
+  3019,
+  3020,
+  3021,
+  3022,
+  3023,
+  3024,
+  3025,
+  3026,
+  3027,
+  3028,
+  3029,
+  3030,
+  3031,
+  3032,
+  3033,
+  3034,
+  3035,
+  3036,
+  3037,
+  3038,
+  3039,
+  3040,
+  3041,
+  3042,
+  3043,
+  3044,
+  3045,
+  3046,
+  3047,
+  3048,
+  3049,
+  3050,
+  3051,
+  3052,
+  3053,
+  3054,
+  3055,
+  3056,
+  3057,
+  3058,
+  3059,
+  3060,
+  3061,
+  3062,
+  3063,
+  3064,
+  3065,
+  3066,
+  3067,
+  3068,
+  3069,
+  3070,
+  3071,
+  3072,
+  3073,
+  3074,
+  3075,
+  3076,
+  3077,
+  3078,
+  3079,
+  3080,
+  3081,
+  3082,
+  3083,
+  3084,
+  3085,
+  3086,
+  3087,
+  3088,
+  3089,
+  3090,
+  3091,
+  3092,
+  3093,
+  3094,
+  3095,
+  3096,
+  3097,
+  3098,
+  3099,
+  3100,
+  3101,
+  3102,
+  3103,
+  3104,
+  3105,
+  3106,
+  3107,
+  3108,
+  3109,
+  3110,
+  3111,
+  3112,
+  3113,
+  3114,
+  3115,
+  3116,
+  3117,
+  3118,
+  3119,
+  3120,
+  3121,
+  3122,
+  3123,
+  3124,
+  3125,
+  3126,
+  3127,
+  3128,
+  3129,
+  3130,
+  3131,
+  3132,
+  3133,
+  3134,
+  3135,
+  3136,
+  3137,
+  3138,
+  3139,
+  3140,
+  3141,
+  3142,
+  3143,
+  3144,
+  3145,
+  3146,
+  3147,
+  3148,
+  3149,
+  3150,
+  3151,
+  3152,
+  3153,
+  3154,
+  3155,
+  3156,
+  3157,
+  3158,
+  3159,
+  3160,
+  3161,
+  3162,
+  3163,
+  3164,
+  3165,
+  3166,
+  3167,
+  3168,
+  3169,
+  3170,
+  3171,
+  3172,
+  3173,
+  3174,
+  3175,
+  3176,
+  3177,
+  3178,
+  3179,
+  3180,
+  3181,
+  3182,
+  3183,
+  3184,
+  3185,
+  3186,
+  3187,
+  3188,
+  3189,
+  3190,
+  3191,
+  3192,
+  3193,
+  3194,
+  3195,
+  3196,
+  3197,
+  3198,
+  3199,
+  3200,
+  3201,
+  3202,
+  3203,
+  3204,
+  3205,
+  3206,
+  3207,
+  3208,
+  3209,
+  3210,
+  3211,
+  3212,
+  3213,
+  3214,
+  3215,
+  3216,
+  3217,
+  3218,
+  3219,
+  3220,
+  3221,
+  3222,
+  3223,
+  3224,
+  3225,
+  3226,
+  3227,
+  3228,
+  3229,
+  3230,
+  3231,
+  3232,
+  3233,
+  3234,
+  3235,
+  3236,
+  3237,
+  3238,
+  3239,
+  3240,
+  3241,
+  3242,
+  3243,
+  3244,
+  3245,
+  3246,
+  3247,
+  3248,
+  3249,
+  3250,
+  3251,
+  3252,
+  3253,
+  3254,
+  3255,
+  3256,
+  3257,
+  3258,
+  3259,
+  3260,
+  3261,
+  3262,
+  3263,
+  3264,
+  3265,
+  3266,
+  3267,
+  3268,
+  3269,
+  3270,
+  3271,
+  3272,
+  3273,
+  3274,
+  3275,
+  3276,
+  3277,
+  3278,
+  3279,
+  3280,
+  3281,
+  3282,
+  3283,
+  3284,
+  3285,
+  3286,
+  3287,
+  3288,
+  3289,
+  3290,
+  3291,
+  3292,
+  3293,
+  3294,
+  3295,
+  3296,
+  3297,
+  3298,
+  3299,
+  3300,
+  3301,
+  3302,
+  3303,
+  3304,
+  3305,
+  3306,
+  3307,
+  3308,
+  3309,
+  3310,
+  3311,
+  3312,
+  3313,
+  3314,
+  3315,
+  3316,
+  3317,
+  3318,
+  3319,
+  3320,
+  3321,
+  3322,
+  3323,
+  3324,
+  3325,
+  3326,
+  3327,
+  3328,
+  3329,
+  3330,
+  3331,
+  3332,
+  3333,
+  3334,
+  3335,
+  3336,
+  3337,
+  3338,
+  3339,
+  3340,
+  3341,
+  3342,
+  3343,
+  3344,
+  3345,
+  3346,
+  3347,
+  3348,
+  3349,
+  3350,
+  3351,
+  3352,
+  3353,
+  3354,
+  3355,
+  3356,
+  3357,
+  3358,
+  3359,
+  3360,
+  3361,
+  3362,
+  3363,
+  3364,
+  3365,
+  3366,
+  3367,
+  3368,
+  3369,
+  3370,
+  3371,
+  3372,
+  3373,
+  3374,
+  3375,
+  3376,
+  3377,
+  3378,
+  3379,
+  3380,
+  3381,
+  3382,
+  3383,
+  3384,
+  3385,
+  3386,
+  3387,
+  3388,
+  3389,
+  3390,
+  3391,
+  3392,
+  3393,
+  3394,
+  3395,
+  3396,
+  3397,
+  3398,
+  3399,
+  3400,
+  3401,
+  3402,
+  3403,
+  3404,
+  3405,
+  3406,
+  3407,
+  3408,
+  3409,
+  3410,
+  3411,
+  3412,
+  3413,
+  3414,
+  3415,
+  3416,
+  3417,
+  3418,
+  3419,
+  3420,
+  3421,
+  3422,
+  3423,
+  3424,
+  3425,
+  3426,
+  3427,
+  3428,
+  3429,
+  3430,
+  3431,
+  3432,
+  3433,
+  3434,
+  3435,
+  3436,
+  3437,
+  3438,
+  3439,
+  3440,
+  3441,
+  3442,
+  3443,
+  3444,
+  3445,
+  3446,
+  3447,
+  3448,
+  3449,
+  3450,
+  3451,
+  3452,
+  3453,
+  3454,
+  3455,
+  3456,
+  3457,
+  3458,
+  3459,
+  3460,
+  3461,
+  3462,
+  3463,
+  3464,
+  3465,
+  3466,
+  3467,
+  3468,
+  3469,
+  3470,
+  3471,
+  3472,
+  3473,
+  3474,
+  3475,
+  3476,
+  3477,
+  3478,
+  3479,
+  3480,
+  3481,
+  3482,
+  3483,
+  3484,
+  3485,
+  3486,
+  3487,
+  3488,
+  3489,
+  3490,
+  3491,
+  3492,
+  3493,
+  3494,
+  3495,
+  3496,
+  3497,
+  3498,
+  3499,
+  3500,
+  3501,
+  3502,
+  3503,
+  3504,
+  3505,
+  3506,
+  3507,
+  3508,
+  3509,
+  3510,
+  3511,
+  3512,
+  3513,
+  3514,
+  3515,
+  3516,
+  3517,
+  3518,
+  3519,
+  3520,
+  3521,
+  3522,
+  3523,
+  3524,
+  3525,
+  3526,
+  3527,
+  3528,
+  3529,
+  3530,
+  3531,
+  3532,
+  3533,
+  3534,
+  3535,
+  3536,
+  3537,
+  3538,
+  3539,
+  3540,
+  3541,
+  3542,
+  3543,
+  3544,
+  3545,
+  3546,
+  3547,
+  3548,
+  3549,
+  3550,
+  3551,
+  3552,
+  3553,
+  3554,
+  3555,
+  3556,
+  3557,
+  3558,
+  3559,
+  3560,
+  3561,
+  3562,
+  3563,
+  3564,
+  3565,
+  3566,
+  3567,
+  3568,
+  3569,
+  3570,
+  3571,
+  3572,
+  3573,
+  3574,
+  3575,
+  3576,
+  3577,
+  3578,
+  3579,
+  3580,
+  3581,
+  3582,
+  3583,
+  3584,
+  3585,
+  3586,
+  3587,
+  3588,
+  3589,
+  3590,
+  3591,
+  3592,
+  3593,
+  3594,
+  3595,
+  3596,
+  3597,
+  3598,
+  3599,
+  3600,
+  3601,
+  3602,
+  3603,
+  3604,
+  3605,
+  3606,
+  3607,
+  3608,
+  3609,
+  3610,
+  3611,
+  3612,
+  3613,
+  3614,
+  3615,
+  3616,
+  3617,
+  3618,
+  3619,
+  3620,
+  3621,
+  3622,
+  3623,
+  3624,
+  3625,
+  3626,
+  3627,
+  3628,
+  3629,
+  3630,
+  3631,
+  3632,
+  3633,
+  3634,
+  3635,
+  3636,
+  3637,
+  3638,
+  3639,
+  3640,
+  3641,
+  3642,
+  3643,
+  3644,
+  3645,
+  3646,
+  3647,
+  3648,
+  3649,
+  3650,
+  3651,
+  3652,
+  3653,
+  3654,
+  3655,
+  3656,
+  3657,
+  3658,
+  3659,
+  3660,
+  3661,
+  3662,
+  3663,
+  3664,
+  3665,
+  3666,
+  3667,
+  3668,
+  3669,
+  3670,
+  3671,
+  3672,
+  3673,
+  3674,
+  3675,
+  3676,
+  3677,
+  3678,
+  3679,
+  3680,
+  3681,
+  3682,
+  3683,
+  3684,
+  3685,
+  3686,
+  3687,
+  3688,
+  3689,
+  3690,
+  3691,
+  3692,
+  3693,
+  3694,
+  3695,
+  3696,
+  3697,
+  3698,
+  3699,
+  3700,
+  3701,
+  3702,
+  3703,
+  3704,
+  3705,
+  3706,
+  3707,
+  3708,
+  3709,
+  3710,
+  3711,
+  3712,
+  3713,
+  3714,
+  3715,
+  3716,
+  3717,
+  3718,
+  3719,
+  3720,
+  3721,
+  3722,
+  3723,
+  3724,
+  3725,
+  3726,
+  3727,
+  3728,
+  3729,
+  3730,
+  3731,
+  3732,
+  3733,
+  3734,
+  3735,
+  3736,
+  3737,
+  3738,
+  3739,
+  3740,
+  3741,
+  3742,
+  3743,
+  3744,
+  3745,
+  3746,
+  3747,
+  3748,
+  3749,
+  3750,
+  3751,
+  3752,
+  3753,
+  3754,
+  3755,
+  3756,
+  3757,
+  3758,
+  3759,
+  3760,
+  3761,
+  3762,
+  3763,
+  3764,
+  3765,
+  3766,
+  3767,
+  3768,
+  3769,
+  3770,
+  3771,
+  3772,
+  3773,
+  3774,
+  3775,
+  3776,
+  3777,
+  3778,
+  3779,
+  3780,
+  3781,
+  3782,
+  3783,
+  3784,
+  3785,
+  3786,
+  3787,
+  3788,
+  3789,
+  3790,
+  3791,
+  3792,
+  3793,
+  3794,
+  3795,
+  3796,
+  3797,
+  3798,
+  3799,
+  3800,
+  3801,
+  3802,
+  3803,
+  3804,
+  3805,
+  3806,
+  3807,
+  3808,
+  3809,
+  3810,
+  3811,
+  3812,
+  3813,
+  3814,
+  3815,
+  3816,
+  3817,
+  3818,
+  3819,
+  3820,
+  3821,
+  3822,
+  3823,
+  3824,
+  3825,
+  3826,
+  3827,
+  3828,
+  3829,
+  3830,
+  3831,
+  3832,
+  3833,
+  3834,
+  3835,
+  3836,
+  3837,
+  3838,
+  3839,
+  3840,
+  3841,
+  3842,
+  3843,
+  3844,
+  3845,
+  3846,
+  3847,
+  3848,
+  3849,
+  3850,
+  3851,
+  3852,
+  3853,
+  3854,
+  3855,
+  3856,
+  3857,
+  3858,
+  3859,
+  3860,
+  3861,
+  3862,
+  3863,
+  3864,
+  3865,
+  3866,
+  3867,
+  3868,
+  3869,
+  3870,
+  3871,
+  3872,
+  3873,
+  3874,
+  3875,
+  3876,
+  3877,
+  3878,
+  3879,
+  3880,
+  3881,
+  3882,
+  3883,
+  3884,
+  3885,
+  3886,
+  3887,
+  3888,
+  3889,
+  3890,
+  3891,
+  3892,
+  3893,
+  3894,
+  3895,
+  3896,
+  3897,
+  3898,
+  3899,
+  3900,
+  3901,
+  3902,
+  3903,
+  3904,
+  3905,
+  3906,
+  3907,
+  3908,
+  3909,
+  3910,
+  3911,
+  3912,
+  3913,
+  3914,
+  3915,
+  3916,
+  3917,
+  3918,
+  3919,
+  3920,
+  3921,
+  3922,
+  3923,
+  3924,
+  3925,
+  3926,
+  3927,
+  3928,
+  3929,
+  3930,
+  3931,
+  3932,
+  3933,
+  3934,
+  3935,
+  3936,
+  3937,
+  3938,
+  3939,
+  3940,
+  3941,
+  3942,
+  3943,
+  3944,
+  3945,
+  3946,
+  3947,
+  3948,
+  3949,
+  3950,
+  3951,
+  3952,
+  3953,
+  3954,
+  3955,
+  3956,
+  3957,
+  3958,
+  3959,
+  3960,
+  3961,
+  3962,
+  3963,
+  3964,
+  3965,
+  3966,
+  3967,
+  3968,
+  3969,
+  3970,
+  3971,
+  3972,
+  3973,
+  3974,
+  3975,
+  3976,
+  3977,
+  3978,
+  3979,
+  3980,
+  3981,
+  3982,
+  3983,
+  3984,
+  3985,
+  3986,
+  3987,
+  3988,
+  3989,
+  3990,
+  3991,
+  3992,
+  3993,
+  3994,
+  3995,
+  3996,
+  3997,
+  3998,
+  3999,
+  4000,
+  4001,
+  4002,
+  4003,
+  4004,
+  4005,
+  4006,
+  4007,
+  4008,
+  4009,
+  4010,
+  4011,
+  4012,
+  4013,
+  4014,
+  4015,
+  4016,
+  4017,
+  4018,
+  4019,
+  4020,
+  4021,
+  4022,
+  4023,
+  4024,
+  4025,
+  4026,
+  4027,
+  4028,
+  4029,
+  4030,
+  4031,
+  4032,
+  4033,
+  4034,
+  4035,
+  4036,
+  4037,
+  4038,
+  4039,
+  4040,
+  4041,
+  4042,
+  4043,
+  4044,
+  4045,
+  4046,
+  4047,
+  4048,
+  4049,
+  4050,
+  4051,
+  4052,
+  4053,
+  4054,
+  4055,
+  4056,
+  4057,
+  4058,
+  4059,
+  4060,
+  4061,
+  4062,
+  4063,
+  4064,
+  4065,
+  4066,
+  4067,
+  4068,
+  4069,
+  4070,
+  4071,
+  4072,
+  4073,
+  4074,
+  4075,
+  4076,
+  4077,
+  4078,
+  4079,
+  4080,
+  4081,
+  4082,
+  4083,
+  4084,
+  4085,
+  4086,
+  4087,
+  4088,
+  4089,
+  4090,
+  4091,
+  4092,
+  4093,
+  4094,
+  4095,
+  4096,
+  4097,
+  4098,
+  4099,
+  4100,
+  4101,
+  4102,
+  4103,
+  4104,
+  4105,
+  4106,
+  4107,
+  4108,
+  4109,
+  4110,
+  4111,
+  4112,
+  4113,
+  4114,
+  4115,
+  4116,
+  4117,
+  4118,
+  4119,
+  4120,
+  4121,
+  4122,
+  4123,
+  4124,
+  4125,
+  4126,
+  4127,
+  4128,
+  4129,
+  4130,
+  4131,
+  4132,
+  4133,
+  4134,
+  4135,
+  4136,
+  4137,
+  4138,
+  4139,
+  4140,
+  4141,
+  4142,
+  4143,
+  4144,
+  4145,
+  4146,
+  4147,
+  4148,
+  4149,
+  4150,
+  4151,
+  4152,
+  4153,
+  4154,
+  4155,
+  4156,
+  4157,
+  4158,
+  4159,
+  4160,
+  4161,
+  4162,
+  4163,
+  4164,
+  4165,
+  4166,
+  4167,
+  4168,
+  4169,
+  4170,
+  4171,
+  4172,
+  4173,
+  4174,
+  4175,
+  4176,
+  4177,
+  4178,
+  4179,
+  4180,
+  4181,
+  4182,
+  4183,
+  4184,
+  4185,
+  4186,
+  4187,
+  4188,
+  4189,
+  4190,
+  4191,
+  4192,
+  4193,
+  4194,
+  4195,
+  4196,
+  4197,
+  4198,
+  4199,
+  4200,
+  4201,
+  4202,
+  4203,
+  4204,
+  4205,
+  4206,
+  4207,
+  4208,
+  4209,
+  4210,
+  4211,
+  4212,
+  4213,
+  4214,
+  4215,
+  4216,
+  4217,
+  4218,
+  4219,
+  4220,
+  4221,
+  4222,
+  4223,
+  4224,
+  4225,
+  4226,
+  4227,
+  4228,
+  4229,
+  4230,
+  4231,
+  4232,
+  4233,
+  4234,
+  4235,
+  4236,
+  4237,
+  4238,
+  4239,
+  4240,
+  4241,
+  4242,
+  4243,
+  4244,
+  4245,
+  4246,
+  4247,
+  4248,
+  4249,
+  4250,
+  4251,
+  4252,
+  4253,
+  4254,
+  4255,
+  4256,
+  4257,
+  4258,
+  4259,
+  4260,
+  4261,
+  4262,
+  4263,
+  4264,
+  4265,
+  4266,
+  4267,
+  4268,
+  4269,
+  4270,
+  4271,
+  4272,
+  4273,
+  4274,
+  4275,
+  4276,
+  4277,
+  4278,
+  4279,
+  4280,
+  4281,
+  4282,
+  4283,
+  4284,
+  4285,
+  4286,
+  4287,
+  4288,
+  4289,
+  4290,
+  4291,
+  4292,
+  4293,
+  4294,
+  4295,
+  4296,
+  4297,
+  4298,
+  4299,
+  4300,
+  4301,
+  4302,
+  4303,
+  4304,
+  4305,
+  4306,
+  4307,
+  4308,
+  4309,
+  4310,
+  4311,
+  4312,
+  4313,
+  4314,
+  4315,
+  4316,
+  4317,
+  4318,
+  4319,
+  4320,
+  4321,
+  4322,
+  4323,
+  4324,
+  4325,
+  4326,
+  4327,
+  4328,
+  4329,
+  4330,
+  4331,
+  4332,
+  4333,
+  4334,
+  4335,
+  4336,
+  4337,
+  4338,
+  4339,
+  4340,
+  4341,
+  4342,
+  4343,
+  4344,
+  4345,
+  4346,
+  4347,
+  4348,
+  4349,
+  4350,
+  4351,
+  4352,
+  4353,
+  4354,
+  4355,
+  4356,
+  4357,
+  4358,
+  4359,
+  4360,
+  4361,
+  4362,
+  4363,
+  4364,
+  4365,
+  4366,
+  4367,
+  4368,
+  4369,
+  4370,
+  4371,
+  4372,
+  4373,
+  4374,
+  4375,
+  4376,
+  4377,
+  4378,
+  4379,
+  4380,
+  4381,
+  4382,
+  4383,
+  4384,
+  4385,
+  4386,
+  4387,
+  4388,
+  4389,
+  4390,
+  4391,
+  4392,
+  4393,
+  4394,
+  4395,
+  4396,
+  4397,
+  4398,
+  4399,
+  4400,
+  4401,
+  4402,
+  4403,
+  4404,
+  4405,
+  4406,
+  4407,
+  4408,
+  4409,
+  4410,
+  4411,
+  4412,
+  4413,
+  4414,
+  4415,
+  4416,
+  4417,
+  4418,
+  4419,
+  4420,
+  4421,
+  4422,
+  4423,
+  4424,
+  4425,
+  4426,
+  4427,
+  4428,
+  4429,
+  4430,
+  4431,
+  4432,
+  4433,
+  4434,
+  4435,
+  4436,
+  4437,
+  4438,
+  4439,
+  4440,
+  4441,
+  4442,
+  4443,
+  4444,
+  4445,
+  4446,
+  4447,
+  4448,
+  4449,
+  4450,
+  4451,
+  4452,
+  4453,
+  4454,
+  4455,
+  4456,
+  4457,
+  4458,
+  4459,
+  4460,
+  4461,
+  4462,
+  4463,
+  4464,
+  4465,
+  4466,
+  4467,
+  4468,
+  4469,
+  4470,
+  4471,
+  4472,
+  4473,
+  4474,
+  4475,
+  4476,
+  4477,
+  4478,
+  4479,
+  4480,
+  4481,
+  4482,
+  4483,
+  4484,
+  4485,
+  4486,
+  4487,
+  4488,
+  4489,
+  4490,
+  4491,
+  4492,
+  4493,
+  4494,
+  4495,
+  4496,
+  4497,
+  4498,
+  4499,
+  4500,
+  4501,
+  4502,
+  4503,
+  4504,
+  4505,
+  4506,
+  4507,
+  4508,
+  4509,
+  4510,
+  4511,
+  4512,
+  4513,
+  4514,
+  4515,
+  4516,
+  4517,
+  4518,
+  4519,
+  4520,
+  4521,
+  4522,
+  4523,
+  4524,
+  4525,
+  4526,
+  4527,
+  4528,
+  4529,
+  4530,
+  4531,
+  4532,
+  4533,
+  4534,
+  4535,
+  4536,
+  4537,
+  4538,
+  4539,
+  4540,
+  4541,
+  4542,
+  4543,
+  4544,
+  4545,
+  4546,
+  4547,
+  4548,
+  4549,
+  4550,
+  4551,
+  4552,
+  4553,
+  4554,
+  4555,
+  4556,
+  4557,
+  4558,
+  4559,
+  4560,
+  4561,
+  4562,
+  4563,
+  4564,
+  4565,
+  4566,
+  4567,
+  4568,
+  4569,
+  4570,
+  4571,
+  4572,
+  4573,
+  4574,
+  4575,
+  4576,
+  4577,
+  4578,
+  4579,
+  4580,
+  4581,
+  4582,
+  4583,
+  4584,
+  4585,
+  4586,
+  4587,
+  4588,
+  4589,
+  4590,
+  4591,
+  4592,
+  4593,
+  4594,
+  4595,
+  4596,
+  4597,
+  4598,
+  4599,
+  4600,
+  4601,
+  4602,
+  4603,
+  4604,
+  4605,
+  4606,
+  4607,
+  4608,
+  4609,
+  4610,
+  4611,
+  4612,
+  4613,
+  4614,
+  4615,
+  4616,
+  4617,
+  4618,
+  4619,
+  4620,
+  4621,
+  4622,
+  4623,
+  4624,
+  4625,
+  4626,
+  4627,
+  4628,
+  4629,
+  4630,
+  4631,
+  4632,
+  4633,
+  4634,
+  4635,
+  4636,
+  4637,
+  4638,
+  4639,
+  4640,
+  4641,
+  4642,
+  4643,
+  4644,
+  4645,
+  4646,
+  4647,
+  4648,
+  4649,
+  4650,
+  4651,
+  4652,
+  4653,
+  4654,
+  4655,
+  4656,
+  4657,
+  4658,
+  4659,
+  4660,
+  4661,
+  4662,
+  4663,
+  4664,
+  4665,
+  4666,
+  4667,
+  4668,
+  4669,
+  4670,
+  4671,
+  4672,
+  4673,
+  4674,
+  4675,
+  4676,
+  4677,
+  4678,
+  4679,
+  4680,
+  4681,
+  4682,
+  4683,
+  4684,
+  4685,
+  4686,
+  4687,
+  4688,
+  4689,
+  4690,
+  4691,
+  4692,
+  4693,
+  4694,
+  4695,
+  4696,
+  4697,
+  4698,
+  4699,
+  4700,
+  4701,
+  4702,
+  4703,
+  4704,
+  4705,
+  4706,
+  4707,
+  4708,
+  4709,
+  4710,
+  4711,
+  4712,
+  4713,
+  4714,
+  4715,
+  4716,
+  4717,
+  4718,
+  4719,
+  4720,
+  4721,
+  4722,
+  4723,
+  4724,
+  4725,
+  4726,
+  4727,
+  4728,
+  4729,
+  4730,
+  4731,
+  4732,
+  4733,
+  4734,
+  4735,
+  4736,
+  4737,
+  4738,
+  4739,
+  4740,
+  4741,
+  4742,
+  4743,
+  4744,
+  4745,
+  4746,
+  4747,
+  4748,
+  4749,
+  4750,
+  4751,
+  4752,
+  4753,
+  4754,
+  4755,
+  4756,
+  4757,
+  4758,
+  4759,
+  4760,
+  4761,
+  4762,
+  4763,
+  4764,
+  4765,
+  4766,
+  4767,
+  4768,
+  4769,
+  4770,
+  4771,
+  4772,
+  4773,
+  4774,
+  4775,
+  4776,
+  4777,
+  4778,
+  4779,
+  4780,
+  4781,
+  4782,
+  4783,
+  4784,
+  4785,
+  4786,
+  4787,
+  4788,
+  4789,
+  4790,
+  4791,
+  4792,
+  4793,
+  4794,
+  4795,
+  4796,
+  4797,
+  4798,
+  4799,
+  4800,
+  4801,
+  4802,
+  4803,
+  4804,
+  4805,
+  4806,
+  4807,
+  4808,
+  4809,
+  4810,
+  4811,
+  4812,
+  4813,
+  4814,
+  4815,
+  4816,
+  4817,
+  4818,
+  4819,
+  4820,
+  4821,
+  4822,
+  4823,
+  4824,
+  4825,
+  4826,
+  4827,
+  4828,
+  4829,
+  4830,
+  4831,
+  4832,
+  4833,
+  4834,
+  4835,
+  4836,
+  4837,
+  4838,
+  4839,
+  4840,
+  4841,
+  4842,
+  4843,
+  4844,
+  4845,
+  4846,
+  4847,
+  4848,
+  4849,
+  4850,
+  4851,
+  4852,
+  4853,
+  4854,
+  4855,
+  4856,
+  4857,
+  4858,
+  4859,
+  4860,
+  4861,
+  4862,
+  4863,
+  4864,
+  4865,
+  4866,
+  4867,
+  4868,
+  4869,
+  4870,
+  4871,
+  4872,
+  4873,
+  4874,
+  4875,
+  4876,
+  4877,
+  4878,
+  4879,
+  4880,
+  4881,
+  4882,
+  4883,
+  4884,
+  4885,
+  4886,
+  4887,
+  4888,
+  4889,
+  4890,
+  4891,
+  4892,
+  4893,
+  4894,
+  4895,
+  4896,
+  4897,
+  4898,
+  4899,
+  4900,
+  4901,
+  4902,
+  4903,
+  4904,
+  4905,
+  4906,
+  4907,
+  4908,
+  4909,
+  4910,
+  4911,
+  4912,
+  4913,
+  4914,
+  4915,
+  4916,
+  4917,
+  4918,
+  4919,
+  4920,
+  4921,
+  4922,
+  4923,
+  4924,
+  4925,
+  4926,
+  4927,
+  4928,
+  4929,
+  4930,
+  4931,
+  4932,
+  4933,
+  4934,
+  4935,
+  4936,
+  4937,
+  4938,
+  4939,
+  4940,
+  4941,
+  4942,
+  4943,
+  4944,
+  4945,
+  4946,
+  4947,
+  4948,
+  4949,
+  4950,
+  4951,
+  4952,
+  4953,
+  4954,
+  4955,
+  4956,
+  4957,
+  4958,
+  4959,
+  4960,
+  4961,
+  4962,
+  4963,
+  4964,
+  4965,
+  4966,
+  4967,
+  4968,
+  4969,
+  4970,
+  4971,
+  4972,
+  4973,
+  4974,
+  4975,
+  4976,
+  4977,
+  4978,
+  4979,
+  4980,
+  4981,
+  4982,
+  4983,
+  4984,
+  4985,
+  4986,
+  4987,
+  4988,
+  4989,
+  4990,
+  4991,
+  4992,
+  4993,
+  4994,
+  4995,
+  4996,
+  4997,
+  4998,
+  4999,
+  5000,
+  5001,
+  5002,
+  5003,
+  5004,
+  5005,
+  5006,
+  5007,
+  5008,
+  5009,
+  5010,
+  5011,
+  5012,
+  5013,
+  5014,
+  5015,
+  5016,
+  5017,
+  5018,
+  5019,
+  5020,
+  5021,
+  5022,
+  5023,
+  5024,
+  5025,
+  5026,
+  5027,
+  5028,
+  5029,
+  5030,
+  5031,
+  5032,
+  5033,
+  5034,
+  5035,
+  5036,
+  5037,
+  5038,
+  5039,
+  5040,
+  5041,
+  5042,
+  5043,
+  5044,
+  5045,
+  5046,
+  5047,
+  5048,
+  5049,
+  5050,
+  5051,
+  5052,
+  5053,
+  5054,
+  5055,
+  5056,
+  5057,
+  5058,
+  5059,
+  5060,
+  5061,
+  5062,
+  5063,
+  5064,
+  5065,
+  5066,
+  5067,
+  5068,
+  5069,
+  5070,
+  5071,
+  5072,
+  5073,
+  5074,
+  5075,
+  5076,
+  5077,
+  5078,
+  5079,
+  5080,
+  5081,
+  5082,
+  5083,
+  5084,
+  5085,
+  5086,
+  5087,
+  5088,
+  5089,
+  5090,
+  5091,
+  5092,
+  5093,
+  5094,
+  5095,
+  5096,
+  5097,
+  5098,
+  5099,
+  5100,
+  5101,
+  5102,
+  5103,
+  5104,
+  5105,
+  5106,
+  5107,
+  5108,
+  5109,
+  5110,
+  5111,
+  5112,
+  5113,
+  5114,
+  5115,
+  5116,
+  5117,
+  5118,
+  5119,
+  5120,
+  5121,
+  5122,
+  5123,
+  5124,
+  5125,
+  5126,
+  5127,
+  5128,
+  5129,
+  5130,
+  5131,
+  5132,
+  5133,
+  5134,
+  5135,
+  5136,
+  5137,
+  5138,
+  5139,
+  5140,
+  5141,
+  5142,
+  5143,
+  5144,
+  5145,
+  5146,
+  5147,
+  5148,
+  5149,
+  5150,
+  5151,
+  5152,
+  5153,
+  5154,
+  5155,
+  5156,
+  5157,
+  5158,
+  5159,
+  5160,
+  5161,
+  5162,
+  5163,
+  5164,
+  5165,
+  5166,
+  5167,
+  5168,
+  5169,
+  5170,
+  5171,
+  5172,
+  5173,
+  5174,
+  5175,
+  5176,
+  5177,
+  5178,
+  5179,
+  5180,
+  5181,
+  5182,
+  5183,
+  5184,
+  5185,
+  5186,
+  5187,
+  5188,
+  5189,
+  5190,
+  5191,
+  5192,
+  5193,
+  5194,
+  5195,
+  5196,
+  5197,
+  5198,
+  5199,
+  5200,
+  5201,
+  5202,
+  5203,
+  5204,
+  5205,
+  5206,
+  5207,
+  5208,
+  5209,
+  5210,
+  5211,
+  5212,
+  5213,
+  5214,
+  5215,
+  5216,
+  5217,
+  5218,
+  5219,
+  5220,
+  5221,
+  5222,
+  5223,
+  5224,
+  5225,
+  5226,
+  5227,
+  5228,
+  5229,
+  5230,
+  5231,
+  5232,
+  5233,
+  5234,
+  5235,
+  5236,
+  5237,
+  5238,
+  5239,
+  5240,
+  5241,
+  5242,
+  5243,
+  5244,
+  5245,
+  5246,
+  5247,
+  5248,
+  5249,
+  5250,
+  5251,
+  5252,
+  5253,
+  5254,
+  5255,
+  5256,
+  5257,
+  5258,
+  5259,
+  5260,
+  5261,
+  5262,
+  5263,
+  5264,
+  5265,
+  5266,
+  5267,
+  5268,
+  5269,
+  5270,
+  5271,
+  5272,
+  5273,
+  5274,
+  5275,
+  5276,
+  5277,
+  5278,
+  5279,
+  5280,
+  5281,
+  5282,
+  5283,
+  5284,
+  5285,
+  5286,
+  5287,
+  5288,
+  5289,
+  5290,
+  5291,
+  5292,
+  5293,
+  5294,
+  5295,
+  5296,
+  5297,
+  5298,
+  5299,
+  5300,
+  5301,
+  5302,
+  5303,
+  5304,
+  5305,
+  5306,
+  5307,
+  5308,
+  5309,
+  5310,
+  5311,
+  5312,
+  5313,
+  5314,
+  5315,
+  5316,
+  5317,
+  5318,
+  5319,
+  5320,
+  5321,
+  5322,
+  5323,
+  5324,
+  5325,
+  5326,
+  5327,
+  5328,
+  5329,
+  5330,
+  5331,
+  5332,
+  5333,
+  5334,
+  5335,
+  5336,
+  5337,
+  5338,
+  5339,
+  5340,
+  5341,
+  5342,
+  5343,
+  5344,
+  5345,
+  5346,
+  5347,
+  5348,
+  5349,
+  5350,
+  5351,
+  5352,
+  5353,
+  5354,
+  5355,
+  5356,
+  5357,
+  5358,
+  5359,
+  5360,
+  5361,
+  5362,
+  5363,
+  5364,
+  5365,
+  5366,
+  5367,
+  5368,
+  5369,
+  5370,
+  5371,
+  5372,
+  5373,
+  5374,
+  5375,
+  5376,
+  5377,
+  5378,
+  5379,
+  5380,
+  5381,
+  5382,
+  5383,
+  5384,
+  5385,
+  5386,
+  5387,
+  5388,
+  5389,
+  5390,
+  5391,
+  5392,
+  5393,
+  5394,
+  5395,
+  5396,
+  5397,
+  5398,
+  5399,
+  5400,
+  5401,
+  5402,
+  5403,
+  5404,
+  5405,
+  5406,
+  5407,
+  5408,
+  5409,
+  5410,
+  5411,
+  5412,
+  5413,
+  5414,
+  5415,
+  5416,
+  5417,
+  5418,
+  5419,
+  5420,
+  5421,
+  5422,
+  5423,
+  5424,
+  5425,
+  5426,
+  5427,
+  5428,
+  5429,
+  5430,
+  5431,
+  5432,
+  5433,
+  5434,
+  5435,
+  5436,
+  5437,
+  5438,
+  5439,
+  5440,
+  5441,
+  5442,
+  5443,
+  5444,
+  5445,
+  5446,
+  5447,
+  5448,
+  5449,
+  5450,
+  5451,
+  5452,
+  5453,
+  5454,
+  5455,
+  5456,
+  5457,
+  5458,
+  5459,
+  5460,
+  5461,
+  5462,
+  5463,
+  5464,
+  5465,
+  5466,
+  5467,
+  5468,
+  5469,
+  5470,
+  5471,
+  5472,
+  5473,
+  5474,
+  5475,
+  5476,
+  5477,
+  5478,
+  5479,
+  5480,
+  5481,
+  5482,
+  5483,
+  5484,
+  5485,
+  5486,
+  5487,
+  5488,
+  5489,
+  5490,
+  5491,
+  5492,
+  5493,
+  5494,
+  5495,
+  5496,
+  5497,
+  5498,
+  5499,
+  5500,
+  5501,
+  5502,
+  5503,
+  5504,
+  5505,
+  5506,
+  5507,
+  5508,
+  5509,
+  5510,
+  5511,
+  5512,
+  5513,
+  5514,
+  5515,
+  5516,
+  5517,
+  5518,
+  5519,
+  5520,
+  5521,
+  5522,
+  5523,
+  5524,
+  5525,
+  5526,
+  5527,
+  5528,
+  5529,
+  5530,
+  5531,
+  5532,
+  5533,
+  5534,
+  5535,
+  5536,
+  5537,
+  5538,
+  5539,
+  5540,
+  5541,
+  5542,
+  5543,
+  5544,
+  5545,
+  5546,
+  5547,
+  5548,
+  5549,
+  5550,
+  5551,
+  5552,
+  5553,
+  5554,
+  5555,
+  5556,
+  5557,
+  5558,
+  5559,
+  5560,
+  5561,
+  5562,
+  5563,
+  5564,
+  5565,
+  5566,
+  5567,
+  5568,
+  5569,
+  5570,
+  5571,
+  5572,
+  5573,
+  5574,
+  5575,
+  5576,
+  5577,
+  5578,
+  5579,
+  5580,
+  5581,
+  5582,
+  5583,
+  5584,
+  5585,
+  5586,
+  5587,
+  5588,
+  5589,
+  5590,
+  5591,
+  5592,
+  5593,
+  5594,
+  5595,
+  5596,
+  5597,
+  5598,
+  5599,
+  5600,
+  5601,
+  5602,
+  5603,
+  5604,
+  5605,
+  5606,
+  5607,
+  5608,
+  5609,
+  5610,
+  5611,
+  5612,
+  5613,
+  5614,
+  5615,
+  5616,
+  5617,
+  5618,
+  5619,
+  5620,
+  5621,
+  5622,
+  5623,
+  5624,
+  5625,
+  5626,
+  5627,
+  5628,
+  5629,
+  5630,
+  5631,
+  5632,
+  5633,
+  5634,
+  5635,
+  5636,
+  5637,
+  5638,
+  5639,
+  5640,
+  5641,
+  5642,
+  5643,
+  5644,
+  5645,
+  5646,
+  5647,
+  5648,
+  5649,
+  5650,
+  5651,
+  5652,
+  5653,
+  5654,
+  5655,
+  5656,
+  5657,
+  5658,
+  5659,
+  5660,
+  5661,
+  5662,
+  5663,
+  5664,
+  5665,
+  5666,
+  5667,
+  5668,
+  5669,
+  5670,
+  5671,
+  5672,
+  5673,
+  5674,
+  5675,
+  5676,
+  5677,
+  5678,
+  5679,
+  5680,
+  5681,
+  5682,
+  5683,
+  5684,
+  5685,
+  5686,
+  5687,
+  5688,
+  5689,
+  5690,
+  5691,
+  5692,
+  5693,
+  5694,
+  5695,
+  5696,
+  5697,
+  5698,
+  5699,
+  5700,
+  5701,
+  5702,
+  5703,
+  5704,
+  5705,
+  5706,
+  5707,
+  5708,
+  5709,
+  5710,
+  5711,
+  5712,
+  5713,
+  5714,
+  5715,
+  5716,
+  5717,
+  5718,
+  5719,
+  5720,
+  5721,
+  5722,
+  5723,
+  5724,
+  5725,
+  5726,
+  5727,
+  5728,
+  5729,
+  5730,
+  5731,
+  5732,
+  5733,
+  5734,
+  5735,
+  5736,
+  5737,
+  5738,
+  5739,
+  5740,
+  5741,
+  5742,
+  5743,
+  5744,
+  5745,
+  5746,
+  5747,
+  5748,
+  5749,
+  5750,
+  5751,
+  5752,
+  5753,
+  5754,
+  5755,
+  5756,
+  5757,
+  5758,
+  5759,
+  5760,
+  5761,
+  5762,
+  5763,
+  5764,
+  5765,
+  5766,
+  5767,
+  5768,
+  5769,
+  5770,
+  5771,
+  5772,
+  5773,
+  5774,
+  5775,
+  5776,
+  5777,
+  5778,
+  5779,
+  5780,
+  5781,
+  5782,
+  5783,
+  5784,
+  5785,
+  5786,
+  5787,
+  5788,
+  5789,
+  5790,
+  5791,
+  5792,
+  5793,
+  5794,
+  5795,
+  5796,
+  5797,
+  5798,
+  5799,
+  5800,
+  5801,
+  5802,
+  5803,
+  5804,
+  5805,
+  5806,
+  5807,
+  5808,
+  5809,
+  5810,
+  5811,
+  5812,
+  5813,
+  5814,
+  5815,
+  5816,
+  5817,
+  5818,
+  5819,
+  5820,
+  5821,
+  5822,
+  5823,
+  5824,
+  5825,
+  5826,
+  5827,
+  5828,
+  5829,
+  5830,
+  5831,
+  5832,
+  5833,
+  5834,
+  5835,
+  5836,
+  5837,
+  5838,
+  5839,
+  5840,
+  5841,
+  5842,
+  5843,
+  5844,
+  5845,
+  5846,
+  5847,
+  5848,
+  5849,
+  5850,
+  5851,
+  5852,
+  5853,
+  5854,
+  5855,
+  5856,
+  5857,
+  5858,
+  5859,
+  5860,
+  5861,
+  5862,
+  5863,
+  5864,
+  5865,
+  5866,
+  5867,
+  5868,
+  5869,
+  5870,
+  5871,
+  5872,
+  5873,
+  5874,
+  5875,
+  5876,
+  5877,
+  5878,
+  5879,
+  5880,
+  5881,
+  5882,
+  5883,
+  5884,
+  5885,
+  5886,
+  5887,
+  5888,
+  5889,
+  5890,
+  5891,
+  5892,
+  5893,
+  5894,
+  5895,
+  5896,
+  5897,
+  5898,
+  5899,
+  5900,
+  5901,
+  5902,
+  5903,
+  5904,
+  5905,
+  5906,
+  5907,
+  5908,
+  5909,
+  5910,
+  5911,
+  5912,
+  5913,
+  5914,
+  5915,
+  5916,
+  5917,
+  5918,
+  5919,
+  5920,
+  5921,
+  5922,
+  5923,
+  5924,
+  5925,
+  5926,
+  5927,
+  5928,
+  5929,
+  5930,
+  5931,
+  5932,
+  5933,
+  5934,
+  5935,
+  5936,
+  5937,
+  5938,
+  5939,
+  5940,
+  5941,
+  5942,
+  5943,
+  5944,
+  5945,
+  5946,
+  5947,
+  5948,
+  5949,
+  5950,
+  5951,
+  5952,
+  5953,
+  5954,
+  5955,
+  5956,
+  5957,
+  5958,
+  5959,
+  5960,
+  5961,
+  5962,
+  5963,
+  5964,
+  5965,
+  5966,
+  5967,
+  5968,
+  5969,
+  5970,
+  5971,
+  5972,
+  5973,
+  5974,
+  5975,
+  5976,
+  5977,
+  5978,
+  5979,
+  5980,
+  5981,
+  5982,
+  5983,
+  5984,
+  5985,
+  5986,
+  5987,
+  5988,
+  5989,
+  5990,
+  5991,
+  5992,
+  5993,
+  5994,
+  5995,
+  5996,
+  5997,
+  5998,
+  5999,
+  6000,
+  6001,
+  6002,
+  6003,
+  6004,
+  6005,
+  6006,
+  6007,
+  6008,
+  6009,
+  6010,
+  6011,
+  6012,
+  6013,
+  6014,
+  6015,
+  6016,
+  6017,
+  6018,
+  6019,
+  6020,
+  6021,
+  6022,
+  6023,
+  6024,
+  6025,
+  6026,
+  6027,
+  6028,
+  6029,
+  6030,
+  6031,
+  6032,
+  6033,
+  6034,
+  6035,
+  6036,
+  6037,
+  6038,
+  6039,
+  6040,
+  6041,
+  6042,
+  6043,
+  6044,
+  6045,
+  6046,
+  6047,
+  6048,
+  6049,
+  6050,
+  6051,
+  6052,
+  6053,
+  6054,
+  6055,
+  6056,
+  6057,
+  6058,
+  6059,
+  6060,
+  6061,
+  6062,
+  6063,
+  6064,
+  6065,
+  6066,
+  6067,
+  6068,
+  6069,
+  6070,
+  6071,
+  6072,
+  6073,
+  6074,
+  6075,
+  6076,
+  6077,
+  6078,
+  6079,
+  6080,
+  6081,
+  6082,
+  6083,
+  6084,
+  6085,
+  6086,
+  6087,
+  6088,
+  6089,
+  6090,
+  6091,
+  6092,
+  6093,
+  6094,
+  6095,
+  6096,
+  6097,
+  6098,
+  6099,
+  6100,
+  6101,
+  6102,
+  6103,
+  6104,
+  6105,
+  6106,
+  6107,
+  6108,
+  6109,
+  6110,
+  6111,
+  6112,
+  6113,
+  6114,
+  6115,
+  6116,
+  6117,
+  6118,
+  6119,
+  6120,
+  6121,
+  6122,
+  6123,
+  6124,
+  6125,
+  6126,
+  6127,
+  6128,
+  6129,
+  6130,
+  6131,
+  6132,
+  6133,
+  6134,
+  6135,
+  6136,
+  6137,
+  6138,
+  6139,
+  6140,
+  6141,
+  6142,
+  6143,
+  6144,
+  6145,
+  6146,
+  6147,
+  6148,
+  6149,
+  6150,
+  6151,
+  6152,
+  6153,
+  6154,
+  6155,
+  6156,
+  6157,
+  6158,
+  6159,
+  6160,
+  6161,
+  6162,
+  6163,
+  6164,
+  6165,
+  6166,
+  6167,
+  6168,
+  6169,
+  6170,
+  6171,
+  6172,
+  6173,
+  6174,
+  6175,
+  6176,
+  6177,
+  6178,
+  6179,
+  6180,
+  6181,
+  6182,
+  6183,
+  6184,
+  6185,
+  6186,
+  6187,
+  6188,
+  6189,
+  6190,
+  6191,
+  6192,
+  6193,
+  6194,
+  6195,
+  6196,
+  6197,
+  6198,
+  6199,
+  6200,
+  6201,
+  6202,
+  6203,
+  6204,
+  6205,
+  6206,
+  6207,
+  6208,
+  6209,
+  6210,
+  6211,
+  6212,
+  6213,
+  6214,
+  6215,
+  6216,
+  6217,
+  6218,
+  6219,
+  6220,
+  6221,
+  6222,
+  6223,
+  6224,
+  6225,
+  6226,
+  6227,
+  6228,
+  6229,
+  6230,
+  6231,
+  6232,
+  6233,
+  6234,
+  6235,
+  6236,
+  6237,
+  6238,
+  6239,
+  6240,
+  6241,
+  6242,
+  6243,
+  6244,
+  6245,
+  6246,
+  6247,
+  6248,
+  6249,
+  6250,
+  6251,
+  6252,
+  6253,
+  6254,
+  6255,
+  6256,
+  6257,
+  6258,
+  6259,
+  6260,
+  6261,
+  6262,
+  6263,
+  6264,
+  6265,
+  6266,
+  6267,
+  6268,
+  6269,
+  6270,
+  6271,
+  6272,
+  6273,
+  6274,
+  6275,
+  6276,
+  6277,
+  6278,
+  6279,
+  6280,
+  6281,
+  6282,
+  6283,
+  6284,
+  6285,
+  6286,
+  6287,
+  6288,
+  6289,
+  6290,
+  6291,
+  6292,
+  6293,
+  6294,
+  6295,
+  6296,
+  6297,
+  6298,
+  6299,
+  6300,
+  6301,
+  6302,
+  6303,
+  6304,
+  6305,
+  6306,
+  6307,
+  6308,
+  6309,
+  6310,
+  6311,
+  6312,
+  6313,
+  6314,
+  6315,
+  6316,
+  6317,
+  6318,
+  6319,
+  6320,
+  6321,
+  6322,
+  6323,
+  6324,
+  6325,
+  6326,
+  6327,
+  6328,
+  6329,
+  6330,
+  6331,
+  6332,
+  6333,
+  6334,
+  6335,
+  6336,
+  6337,
+  6338,
+  6339,
+  6340,
+  6341,
+  6342,
+  6343,
+  6344,
+  6345,
+  6346,
+  6347,
+  6348,
+  6349,
+  6350,
+  6351,
+  6352,
+  6353,
+  6354,
+  6355,
+  6356,
+  6357,
+  6358,
+  6359,
+  6360,
+  6361,
+  6362,
+  6363,
+  6364,
+  6365,
+  6366,
+  6367,
+  6368,
+  6369,
+  6370,
+  6371,
+  6372,
+  6373,
+  6374,
+  6375,
+  6376,
+  6377,
+  6378,
+  6379,
+  6380,
+  6381,
+  6382,
+  6383,
+  6384,
+  6385,
+  6386,
+  6387,
+  6388,
+  6389,
+  6390,
+  6391,
+  6392,
+  6393,
+  6394,
+  6395,
+  6396,
+  6397,
+  6398,
+  6399,
+  6400,
+  6401,
+  6402,
+  6403,
+  6404,
+  6405,
+  6406,
+  6407,
+  6408,
+  6409,
+  6410,
+  6411,
+  6412,
+  6413,
+  6414,
+  6415,
+  6416,
+  6417,
+  6418,
+  6419,
+  6420,
+  6421,
+  6422,
+  6423,
+  6424,
+  6425,
+  6426,
+  6427,
+  6428,
+  6429,
+  6430,
+  6431,
+  6432,
+  6433,
+  6434,
+  6435,
+  6436,
+  6437,
+  6438,
+  6439,
+  6440,
+  6441,
+  6442,
+  6443,
+  6444,
+  6445,
+  6446,
+  6447,
+  6448,
+  6449,
+  6450,
+  6451,
+  6452,
+  6453,
+  6454,
+  6455,
+  6456,
+  6457,
+  6458,
+  6459,
+  6460,
+  6461,
+  6462,
+  6463,
+  6464,
+  6465,
+  6466,
+  6467,
+  6468,
+  6469,
+  6470,
+  6471,
+  6472,
+  6473,
+  6474,
+  6475,
+  6476,
+  6477,
+  6478,
+  6479,
+  6480,
+  6481,
+  6482,
+  6483,
+  6484,
+  6485,
+  6486,
+  6487,
+  6488,
+  6489,
+  6490,
+  6491,
+  6492,
+  6493,
+  6494,
+  6495,
+  6496,
+  6497,
+  6498,
+  6499,
+  6500,
+  6501,
+  6502,
+  6503,
+  6504,
+  6505,
+  6506,
+  6507,
+  6508,
+  6509,
+  6510,
+  6511,
+  6512,
+  6513,
+  6514,
+  6515,
+  6516,
+  6517,
+  6518,
+  6519,
+  6520,
+  6521,
+  6522,
+  6523,
+  6524,
+  6525,
+  6526,
+  6527,
+  6528,
+  6529,
+  6530,
+  6531,
+  6532,
+  6533,
+  6534,
+  6535,
+  6536,
+  6537,
+  6538,
+  6539,
+  6540,
+  6541,
+  6542,
+  6543,
+  6544,
+  6545,
+  6546,
+  6547,
+  6548,
+  6549,
+  6550,
+  6551,
+  6552,
+  6553,
+  6554,
+  6555,
+  6556,
+  6557,
+  6558,
+  6559,
+  6560,
+  6561,
+  6562,
+  6563,
+  6564,
+  6565,
+  6566,
+  6567,
+  6568,
+  6569,
+  6570,
+  6571,
+  6572,
+  6573,
+  6574,
+  6575,
+  6576,
+  6577,
+  6578,
+  6579,
+  6580,
+  6581,
+  6582,
+  6583,
+  6584,
+  6585,
+  6586,
+  6587,
+  6588,
+  6589,
+  6590,
+  6591,
+  6592,
+  6593,
+  6594,
+  6595,
+  6596,
+  6597,
+  6598,
+  6599,
+  6600,
+  6601,
+  6602,
+  6603,
+  6604,
+  6605,
+  6606,
+  6607,
+  6608,
+  6609,
+  6610,
+  6611,
+  6612,
+  6613,
+  6614,
+  6615,
+  6616,
+  6617,
+  6618,
+  6619,
+  6620,
+  6621,
+  6622,
+  6623,
+  6624,
+  6625,
+  6626,
+  6627,
+  6628,
+  6629,
+  6630,
+  6631,
+  6632,
+  6633,
+  6634,
+  6635,
+  6636,
+  6637,
+  6638,
+  6639,
+  6640,
+  6641,
+  6642,
+  6643,
+  6644,
+  6645,
+  6646,
+  6647,
+  6648,
+  6649,
+  6650,
+  6651,
+  6652,
+  6653,
+  6654,
+  6655,
+  6656,
+  6657,
+  6658,
+  6659,
+  6660,
+  6661,
+  6662,
+  6663,
+  6664,
+  6665,
+  6666,
+  6667,
+  6668,
+  6669,
+  6670,
+  6671,
+  6672,
+  6673,
+  6674,
+  6675,
+  6676,
+  6677,
+  6678,
+  6679,
+  6680,
+  6681,
+  6682,
+  6683,
+  6684,
+  6685,
+  6686,
+  6687,
+  6688,
+  6689,
+  6690,
+  6691,
+  6692,
+  6693,
+  6694,
+  6695,
+  6696,
+  6697,
+  6698,
+  6699,
+  6700,
+  6701,
+  6702,
+  6703,
+  6704,
+  6705,
+  6706,
+  6707,
+  6708,
+  6709,
+  6710,
+  6711,
+  6712,
+  6713,
+  6714,
+  6715,
+  6716,
+  6717,
+  6718,
+  6719,
+  6720,
+  6721,
+  6722,
+  6723,
+  6724,
+  6725,
+  6726,
+  6727,
+  6728,
+  6729,
+  6730,
+  6731,
+  6732,
+  6733,
+  6734,
+  6735,
+  6736,
+  6737,
+  6738,
+  6739,
+  6740,
+  6741,
+  6742,
+  6743,
+  6744,
+  6745,
+  6746,
+  6747,
+  6748,
+  6749,
+  6750,
+  6751,
+  6752,
+  6753,
+  6754,
+  6755,
+  6756,
+  6757,
+  6758,
+  6759,
+  6760,
+  6761,
+  6762,
+  6763,
+  6764,
+  6765,
+  6766,
+  6767,
+  6768,
+  6769,
+  6770,
+  6771,
+  6772,
+  6773,
+  6774,
+  6775,
+  6776,
+  6777,
+  6778,
+  6779,
+  6780,
+  6781,
+  6782,
+  6783,
+  6784,
+  6785,
+  6786,
+  6787,
+  6788,
+  6789,
+  6790,
+  6791,
+  6792,
+  6793,
+  6794,
+  6795,
+  6796,
+  6797,
+  6798,
+  6799,
+  6800,
+  6801,
+  6802,
+  6803,
+  6804,
+  6805,
+  6806,
+  6807,
+  6808,
+  6809,
+  6810,
+  6811,
+  6812,
+  6813,
+  6814,
+  6815,
+  6816,
+  6817,
+  6818,
+  6819,
+  6820,
+  6821,
+  6822,
+  6823,
+  6824,
+  6825,
+  6826,
+  6827,
+  6828,
+  6829,
+  6830,
+  6831,
+  6832,
+  6833,
+  6834,
+  6835,
+  6836,
+  6837,
+  6838,
+  6839,
+  6840,
+  6841,
+  6842,
+  6843,
+  6844,
+  6845,
+  6846,
+  6847,
+  6848,
+  6849,
+  6850,
+  6851,
+  6852,
+  6853,
+  6854,
+  6855,
+  6856,
+  6857,
+  6858,
+  6859,
+  6860,
+  6861,
+  6862,
+  6863,
+  6864,
+  6865,
+  6866,
+  6867,
+  6868,
+  6869,
+  6870,
+  6871,
+  6872,
+  6873,
+  6874,
+  6875,
+  6876,
+  6877,
+  6878,
+  6879,
+  6880,
+  6881,
+  6882,
+  6883,
+  6884,
+  6885,
+  6886,
+  6887,
+  6888,
+  6889,
+  6890,
+  6891,
+  6892,
+  6893,
+  6894,
+  6895,
+  6896,
+  6897,
+  6898,
+  6899,
+  6900,
+  6901,
+  6902,
+  6903,
+  6904,
+  6905,
+  6906,
+  6907,
+  6908,
+  6909,
+  6910,
+  6911,
+  6912,
+  6913,
+  6914,
+  6915,
+  6916,
+  6917,
+  6918,
+  6919,
+  6920,
+  6921,
+  6922,
+  6923,
+  6924,
+  6925,
+  6926,
+  6927,
+  6928,
+  6929,
+  6930,
+  6931,
+  6932,
+  6933,
+  6934,
+  6935,
+  6936,
+  6937,
+  6938,
+  6939,
+  6940,
+  6941,
+  6942,
+  6943,
+  6944,
+  6945,
+  6946,
+  6947,
+  6948,
+  6949,
+  6950,
+  6951,
+  6952,
+  6953,
+  6954,
+  6955,
+  6956,
+  6957,
+  6958,
+  6959,
+  6960,
+  6961,
+  6962,
+  6963,
+  6964,
+  6965,
+  6966,
+  6967,
+  6968,
+  6969,
+  6970,
+  6971,
+  6972,
+  6973,
+  6974,
+  6975,
+  6976,
+  6977,
+  6978,
+  6979,
+  6980,
+  6981,
+  6982,
+  6983,
+  6984,
+  6985,
+  6986,
+  6987,
+  6988,
+  6989,
+  6990,
+  6991,
+  6992,
+  6993,
+  6994,
+  6995,
+  6996,
+  6997,
+  6998,
+  6999,
+  7000,
+  7001,
+  7002,
+  7003,
+  7004,
+  7005,
+  7006,
+  7007,
+  7008,
+  7009,
+  7010,
+  7011,
+  7012,
+  7013,
+  7014,
+  7015,
+  7016,
+  7017,
+  7018,
+  7019,
+  7020,
+  7021,
+  7022,
+  7023,
+  7024,
+  7025,
+  7026,
+  7027,
+  7028,
+  7029,
+  7030,
+  7031,
+  7032,
+  7033,
+  7034,
+  7035,
+  7036,
+  7037,
+  7038,
+  7039,
+  7040,
+  7041,
+  7042,
+  7043,
+  7044,
+  7045,
+  7046,
+  7047,
+  7048,
+  7049,
+  7050,
+  7051,
+  7052,
+  7053,
+  7054,
+  7055,
+  7056,
+  7057,
+  7058,
+  7059,
+  7060,
+  7061,
+  7062,
+  7063,
+  7064,
+  7065,
+  7066,
+  7067,
+  7068,
+  7069,
+  7070,
+  7071,
+  7072,
+  7073,
+  7074,
+  7075,
+  7076,
+  7077,
+  7078,
+  7079,
+  7080,
+  7081,
+  7082,
+  7083,
+  7084,
+  7085,
+  7086,
+  7087,
+  7088,
+  7089,
+  7090,
+  7091,
+  7092,
+  7093,
+  7094,
+  7095,
+  7096,
+  7097,
+  7098,
+  7099,
+  7100,
+  7101,
+  7102,
+  7103,
+  7104,
+  7105,
+  7106,
+  7107,
+  7108,
+  7109,
+  7110,
+  7111,
+  7112,
+  7113,
+  7114,
+  7115,
+  7116,
+  7117,
+  7118,
+  7119,
+  7120,
+  7121,
+  7122,
+  7123,
+  7124,
+  7125,
+  7126,
+  7127,
+  7128,
+  7129,
+  7130,
+  7131,
+  7132,
+  7133,
+  7134,
+  7135,
+  7136,
+  7137,
+  7138,
+  7139,
+  7140,
+  7141,
+  7142,
+  7143,
+  7144,
+  7145,
+  7146,
+  7147,
+  7148,
+  7149,
+  7150,
+  7151,
+  7152,
+  7153,
+  7154,
+  7155,
+  7156,
+  7157,
+  7158,
+  7159,
+  7160,
+  7161,
+  7162,
+  7163,
+  7164,
+  7165,
+  7166,
+  7167,
+  7168,
+  7169,
+  7170,
+  7171,
+  7172,
+  7173,
+  7174,
+  7175,
+  7176,
+  7177,
+  7178,
+  7179,
+  7180,
+  7181,
+  7182,
+  7183,
+  7184,
+  7185,
+  7186,
+  7187,
+  7188,
+  7189,
+  7190,
+  7191,
+  7192,
+  7193,
+  7194,
+  7195,
+  7196,
+  7197,
+  7198,
+  7199,
+  7200,
+  7201,
+  7202,
+  7203,
+  7204,
+  7205,
+  7206,
+  7207,
+  7208,
+  7209,
+  7210,
+  7211,
+  7212,
+  7213,
+  7214,
+  7215,
+  7216,
+  7217,
+  7218,
+  7219,
+  7220,
+  7221,
+  7222,
+  7223,
+  7224,
+  7225,
+  7226,
+  7227,
+  7228,
+  7229,
+  7230,
+  7231,
+  7232,
+  7233,
+  7234,
+  7235,
+  7236,
+  7237,
+  7238,
+  7239,
+  7240,
+  7241,
+  7242,
+  7243,
+  7244,
+  7245,
+  7246,
+  7247,
+  7248,
+  7249,
+  7250,
+  7251,
+  7252,
+  7253,
+  7254,
+  7255,
+  7256,
+  7257,
+  7258,
+  7259,
+  7260,
+  7261,
+  7262,
+  7263,
+  7264,
+  7265,
+  7266,
+  7267,
+  7268,
+  7269,
+  7270,
+  7271,
+  7272,
+  7273,
+  7274,
+  7275,
+  7276,
+  7277,
+  7278,
+  7279,
+  7280,
+  7281,
+  7282,
+  7283,
+  7284,
+  7285,
+  7286,
+  7287,
+  7288,
+  7289,
+  7290,
+  7291,
+  7292,
+  7293,
+  7294,
+  7295,
+  7296,
+  7297,
+  7298,
+  7299,
+  7300,
+  7301,
+  7302,
+  7303,
+  7304,
+  7305,
+  7306,
+  7307,
+  7308,
+  7309,
+  7310,
+  7311,
+  7312,
+  7313,
+  7314,
+  7315,
+  7316,
+  7317,
+  7318,
+  7319,
+  7320,
+  7321,
+  7322,
+  7323,
+  7324,
+  7325,
+  7326,
+  7327,
+  7328,
+  7329,
+  7330,
+  7331,
+  7332,
+  7333,
+  7334,
+  7335,
+  7336,
+  7337,
+  7338,
+  7339,
+  7340,
+  7341,
+  7342,
+  7343,
+  7344,
+  7345,
+  7346,
+  7347,
+  7348,
+  7349,
+  7350,
+  7351,
+  7352,
+  7353,
+  7354,
+  7355,
+  7356,
+  7357,
+  7358,
+  7359,
+  7360,
+  7361,
+  7362,
+  7363,
+  7364,
+  7365,
+  7366,
+  7367,
+  7368,
+  7369,
+  7370,
+  7371,
+  7372,
+  7373,
+  7374,
+  7375,
+  7376,
+  7377,
+  7378,
+  7379,
+  7380,
+  7381,
+  7382,
+  7383,
+  7384,
+  7385,
+  7386,
+  7387,
+  7388,
+  7389,
+  7390,
+  7391,
+  7392,
+  7393,
+  7394,
+  7395,
+  7396,
+  7397,
+  7398,
+  7399,
+  7400,
+  7401,
+  7402,
+  7403,
+  7404,
+  7405,
+  7406,
+  7407,
+  7408,
+  7409,
+  7410,
+  7411,
+  7412,
+  7413,
+  7414,
+  7415,
+  7416,
+  7417,
+  7418,
+  7419,
+  7420,
+  7421,
+  7422,
+  7423,
+  7424,
+  7425,
+  7426,
+  7427,
+  7428,
+  7429,
+  7430,
+  7431,
+  7432,
+  7433,
+  7434,
+  7435,
+  7436,
+  7437,
+  7438,
+  7439,
+  7440,
+  7441,
+  7442,
+  7443,
+  7444,
+  7445,
+  7446,
+  7447,
+  7448,
+  7449,
+  7450,
+  7451,
+  7452,
+  7453,
+  7454,
+  7455,
+  7456,
+  7457,
+  7458,
+  7459,
+  7460,
+  7461,
+  7462,
+  7463,
+  7464,
+  7465,
+  7466,
+  7467,
+  7468,
+  7469,
+  7470,
+  7471,
+  7472,
+  7473,
+  7474,
+  7475,
+  7476,
+  7477,
+  7478,
+  7479,
+  7480,
+  7481,
+  7482,
+  7483,
+  7484,
+  7485,
+  7486,
+  7487,
+  7488,
+  7489,
+  7490,
+  7491,
+  7492,
+  7493,
+  7494,
+  7495,
+  7496,
+  7497,
+  7498,
+  7499,
+  7500,
+  7501,
+  7502,
+  7503,
+  7504,
+  7505,
+  7506,
+  7507,
+  7508,
+  7509,
+  7510,
+  7511,
+  7512,
+  7513,
+  7514,
+  7515,
+  7516,
+  7517,
+  7518,
+  7519,
+  7520,
+  7521,
+  7522,
+  7523,
+  7524,
+  7525,
+  7526,
+  7527,
+  7528,
+  7529,
+  7530,
+  7531,
+  7532,
+  7533,
+  7534,
+  7535,
+  7536,
+  7537,
+  7538,
+  7539,
+  7540,
+  7541,
+  7542,
+  7543,
+  7544,
+  7545,
+  7546,
+  7547,
+  7548,
+  7549,
+  7550,
+  7551,
+  7552,
+  7553,
+  7554,
+  7555,
+  7556,
+  7557,
+  7558,
+  7559,
+  7560,
+  7561,
+  7562,
+  7563,
+  7564,
+  7565,
+  7566,
+  7567,
+  7568,
+  7569,
+  7570,
+  7571,
+  7572,
+  7573,
+  7574,
+  7575,
+  7576,
+  7577,
+  7578,
+  7579,
+  7580,
+  7581,
+  7582,
+  7583,
+  7584,
+  7585,
+  7586,
+  7587,
+  7588,
+  7589,
+  7590,
+  7591,
+  7592,
+  7593,
+  7594,
+  7595,
+  7596,
+  7597,
+  7598,
+  7599,
+  7600,
+  7601,
+  7602,
+  7603,
+  7604,
+  7605,
+  7606,
+  7607,
+  7608,
+  7609,
+  7610,
+  7611,
+  7612,
+  7613,
+  7614,
+  7615,
+  7616,
+  7617,
+  7618,
+  7619,
+  7620,
+  7621,
+  7622,
+  7623,
+  7624,
+  7625,
+  7626,
+  7627,
+  7628,
+  7629,
+  7630,
+  7631,
+  7632,
+  7633,
+  7634,
+  7635,
+  7636,
+  7637,
+  7638,
+  7639,
+  7640,
+  7641,
+  7642,
+  7643,
+  7644,
+  7645,
+  7646,
+  7647,
+  7648,
+  7649,
+  7650,
+  7651,
+  7652,
+  7653,
+  7654,
+  7655,
+  7656,
+  7657,
+  7658,
+  7659,
+  7660,
+  7661,
+  7662,
+  7663,
+  7664,
+  7665,
+  7666,
+  7667,
+  7668,
+  7669,
+  7670,
+  7671,
+  7672,
+  7673,
+  7674,
+  7675,
+  7676,
+  7677,
+  7678,
+  7679,
+  7680,
+  7681,
+  7682,
+  7683,
+  7684,
+  7685,
+  7686,
+  7687,
+  7688,
+  7689,
+  7690,
+  7691,
+  7692,
+  7693,
+  7694,
+  7695,
+  7696,
+  7697,
+  7698,
+  7699,
+  7700,
+  7701,
+  7702,
+  7703,
+  7704,
+  7705,
+  7706,
+  7707,
+  7708,
+  7709,
+  7710,
+  7711,
+  7712,
+  7713,
+  7714,
+  7715,
+  7716,
+  7717,
+  7718,
+  7719,
+  7720,
+  7721,
+  7722,
+  7723,
+  7724,
+  7725,
+  7726,
+  7727,
+  7728,
+  7729,
+  7730,
+  7731,
+  7732,
+  7733,
+  7734,
+  7735,
+  7736,
+  7737,
+  7738,
+  7739,
+  7740,
+  7741,
+  7742,
+  7743,
+  7744,
+  7745,
+  7746,
+  7747,
+  7748,
+  7749,
+  7750,
+  7751,
+  7752,
+  7753,
+  7754,
+  7755,
+  7756,
+  7757,
+  7758,
+  7759,
+  7760,
+  7761,
+  7762,
+  7763,
+  7764,
+  7765,
+  7766,
+  7767,
+  7768,
+  7769,
+  7770,
+  7771,
+  7772,
+  7773,
+  7774,
+  7775,
+  7776,
+  7777,
+  7778,
+  7779,
+  7780,
+  7781,
+  7782,
+  7783,
+  7784,
+  7785,
+  7786,
+  7787,
+  7788,
+  7789,
+  7790,
+  7791,
+  7792,
+  7793,
+  7794,
+  7795,
+  7796,
+  7797,
+  7798,
+  7799,
+  7800,
+  7801,
+  7802,
+  7803,
+  7804,
+  7805,
+  7806,
+  7807,
+  7808,
+  7809,
+  7810,
+  7811,
+  7812,
+  7813,
+  7814,
+  7815,
+  7816,
+  7817,
+  7818,
+  7819,
+  7820,
+  7821,
+  7822,
+  7823,
+  7824,
+  7825,
+  7826,
+  7827,
+  7828,
+  7829,
+  7830,
+  7831,
+  7832,
+  7833,
+  7834,
+  7835,
+  7836,
+  7837,
+  7838,
+  7839,
+  7840,
+  7841,
+  7842,
+  7843,
+  7844,
+  7845,
+  7846,
+  7847,
+  7848,
+  7849,
+  7850,
+  7851,
+  7852,
+  7853,
+  7854,
+  7855,
+  7856,
+  7857,
+  7858,
+  7859,
+  7860,
+  7861,
+  7862,
+  7863,
+  7864,
+  7865,
+  7866,
+  7867,
+  7868,
+  7869,
+  7870,
+  7871,
+  7872,
+  7873,
+  7874,
+  7875,
+  7876,
+  7877,
+  7878,
+  7879,
+  7880,
+  7881,
+  7882,
+  7883,
+  7884,
+  7885,
+  7886,
+  7887,
+  7888,
+  7889,
+  7890,
+  7891,
+  7892,
+  7893,
+  7894,
+  7895,
+  7896,
+  7897,
+  7898,
+  7899,
+  7900,
+  7901,
+  7902,
+  7903,
+  7904,
+  7905,
+  7906,
+  7907,
+  7908,
+  7909,
+  7910,
+  7911,
+  7912,
+  7913,
+  7914,
+  7915,
+  7916,
+  7917,
+  7918,
+  7919,
+  7920,
+  7921,
+  7922,
+  7923,
+  7924,
+  7925,
+  7926,
+  7927,
+  7928,
+  7929,
+  7930,
+  7931,
+  7932,
+  7933,
+  7934,
+  7935,
+  7936,
+  7937,
+  7938,
+  7939,
+  7940,
+  7941,
+  7942,
+  7943,
+  7944,
+  7945,
+  7946,
+  7947,
+  7948,
+  7949,
+  7950,
+  7951,
+  7952,
+  7953,
+  7954,
+  7955,
+  7956,
+  7957,
+  7958,
+  7959,
+  7960,
+  7961,
+  7962,
+  7963,
+  7964,
+  7965,
+  7966,
+  7967,
+  7968,
+  7969,
+  7970,
+  7971,
+  7972,
+  7973,
+  7974,
+  7975,
+  7976,
+  7977,
+  7978,
+  7979,
+  7980,
+  7981,
+  7982,
+  7983,
+  7984,
+  7985,
+  7986,
+  7987,
+  7988,
+  7989,
+  7990,
+  7991,
+  7992,
+  7993,
+  7994,
+  7995,
+  7996,
+  7997,
+  7998,
+  7999,
+  8000,
+  8001,
+  8002,
+  8003,
+  8004,
+  8005,
+  8006,
+  8007,
+  8008,
+  8009,
+  8010,
+  8011,
+  8012,
+  8013,
+  8014,
+  8015,
+  8016,
+  8017,
+  8018,
+  8019,
+  8020,
+  8021,
+  8022,
+  8023,
+  8024,
+  8025,
+  8026,
+  8027,
+  8028,
+  8029,
+  8030,
+  8031,
+  8032,
+  8033,
+  8034,
+  8035,
+  8036,
+  8037,
+  8038,
+  8039,
+  8040,
+  8041,
+  8042,
+  8043,
+  8044,
+  8045,
+  8046,
+  8047,
+  8048,
+  8049,
+  8050,
+  8051,
+  8052,
+  8053,
+  8054,
+  8055,
+  8056,
+  8057,
+  8058,
+  8059,
+  8060,
+  8061,
+  8062,
+  8063,
+  8064,
+  8065,
+  8066,
+  8067,
+  8068,
+  8069,
+  8070,
+  8071,
+  8072,
+  8073,
+  8074,
+  8075,
+  8076,
+  8077,
+  8078,
+  8079,
+  8080,
+  8081,
+  8082,
+  8083,
+  8084,
+  8085,
+  8086,
+  8087,
+  8088,
+  8089,
+  8090,
+  8091,
+  8092,
+  8093,
+  8094,
+  8095,
+  8096,
+  8097,
+  8098,
+  8099,
+  8100,
+  8101,
+  8102,
+  8103,
+  8104,
+  8105,
+  8106,
+  8107,
+  8108,
+  8109,
+  8110,
+  8111,
+  8112,
+  8113,
+  8114,
+  8115,
+  8116,
+  8117,
+  8118,
+  8119,
+  8120,
+  8121,
+  8122,
+  8123,
+  8124,
+  8125,
+  8126,
+  8127,
+  8128,
+  8129,
+  8130,
+  8131,
+  8132,
+  8133,
+  8134,
+  8135,
+  8136,
+  8137,
+  8138,
+  8139,
+  8140,
+  8141,
+  8142,
+  8143,
+  8144,
+  8145,
+  8146,
+  8147,
+  8148,
+  8149,
+  8150,
+  8151,
+  8152,
+  8153,
+  8154,
+  8155,
+  8156,
+  8157,
+  8158,
+  8159,
+  8160,
+  8161,
+  8162,
+  8163,
+  8164,
+  8165,
+  8166,
+  8167,
+  8168,
+  8169,
+  8170,
+  8171,
+  8172,
+  8173,
+  8174,
+  8175,
+  8176,
+  8177,
+  8178,
+  8179,
+  8180,
+  8181,
+  8182,
+  8183,
+  8184,
+  8185,
+  8186,
+  8187,
+  8188,
+  8189,
+  8190,
+  8191,
+  8192,
+  8193,
+  8194,
+  8195,
+  8196,
+  8197,
+  8198,
+  8199,
+  8200,
+  8201,
+  8202,
+  8203,
+  8204,
+  8205,
+  8206,
+  8207,
+  8208,
+  8209,
+  8210,
+  8211,
+  8212,
+  8213,
+  8214,
+  8215,
+  8216,
+  8217,
+  8218,
+  8219,
+  8220,
+  8221,
+  8222,
+  8223,
+  8224,
+  8225,
+  8226,
+  8227,
+  8228,
+  8229,
+  8230,
+  8231,
+  8232,
+  8233,
+  8234,
+  8235,
+  8236,
+  8237,
+  8238,
+  8239,
+  8240,
+  8241,
+  8242,
+  8243,
+  8244,
+  8245,
+  8246,
+  8247,
+  8248,
+  8249,
+  8250,
+  8251,
+  8252,
+  8253,
+  8254,
+  8255,
+  8256,
+  8257,
+  8258,
+  8259,
+  8260,
+  8261,
+  8262,
+  8263,
+  8264,
+  8265,
+  8266,
+  8267,
+  8268,
+  8269,
+  8270,
+  8271,
+  8272,
+  8273,
+  8274,
+  8275,
+  8276,
+  8277,
+  8278,
+  8279,
+  8280,
+  8281,
+  8282,
+  8283,
+  8284,
+  8285,
+  8286,
+  8287,
+  8288,
+  8289,
+  8290,
+  8291,
+  8292,
+  8293,
+  8294,
+  8295,
+  8296,
+  8297,
+  8298,
+  8299,
+  8300,
+  8301,
+  8302,
+  8303,
+  8304,
+  8305,
+  8306,
+  8307,
+  8308,
+  8309,
+  8310,
+  8311,
+  8312,
+  8313,
+  8314,
+  8315,
+  8316,
+  8317,
+  8318,
+  8319,
+  8320,
+  8321,
+  8322,
+  8323,
+  8324,
+  8325,
+  8326,
+  8327,
+  8328,
+  8329,
+  8330,
+  8331,
+  8332,
+  8333,
+  8334,
+  8335,
+  8336,
+  8337,
+  8338,
+  8339,
+  8340,
+  8341,
+  8342,
+  8343,
+  8344,
+  8345,
+  8346,
+  8347,
+  8348,
+  8349,
+  8350,
+  8351,
+  8352,
+  8353,
+  8354,
+  8355,
+  8356,
+  8357,
+  8358,
+  8359,
+  8360,
+  8361,
+  8362,
+  8363,
+  8364,
+  8365,
+  8366,
+  8367,
+  8368,
+  8369,
+  8370,
+  8371,
+  8372,
+  8373,
+  8374,
+  8375,
+  8376,
+  8377,
+  8378,
+  8379,
+  8380,
+  8381,
+  8382,
+  8383,
+  8384,
+  8385,
+  8386,
+  8387,
+  8388,
+  8389,
+  8390,
+  8391,
+  8392,
+  8393,
+  8394,
+  8395,
+  8396,
+  8397,
+  8398,
+  8399,
+  8400,
+  8401,
+  8402,
+  8403,
+  8404,
+  8405,
+  8406,
+  8407,
+  8408,
+  8409,
+  8410,
+  8411,
+  8412,
+  8413,
+  8414,
+  8415,
+  8416,
+  8417,
+  8418,
+  8419,
+  8420,
+  8421,
+  8422,
+  8423,
+  8424,
+  8425,
+  8426,
+  8427,
+  8428,
+  8429,
+  8430,
+  8431,
+  8432,
+  8433,
+  8434,
+  8435,
+  8436,
+  8437,
+  8438,
+  8439,
+  8440,
+  8441,
+  8442,
+  8443,
+  8444,
+  8445,
+  8446,
+  8447,
+  8448,
+  8449,
+  8450,
+  8451,
+  8452,
+  8453,
+  8454,
+  8455,
+  8456,
+  8457,
+  8458,
+  8459,
+  8460,
+  8461,
+  8462,
+  8463,
+  8464,
+  8465,
+  8466,
+  8467,
+  8468,
+  8469,
+  8470,
+  8471,
+  8472,
+  8473,
+  8474,
+  8475,
+  8476,
+  8477,
+  8478,
+  8479,
+  8480,
+  8481,
+  8482,
+  8483,
+  8484,
+  8485,
+  8486,
+  8487,
+  8488,
+  8489,
+  8490,
+  8491,
+  8492,
+  8493,
+  8494,
+  8495,
+  8496,
+  8497,
+  8498,
+  8499,
+  8500,
+  8501,
+  8502,
+  8503,
+  8504,
+  8505,
+  8506,
+  8507,
+  8508,
+  8509,
+  8510,
+  8511,
+  8512,
+  8513,
+  8514,
+  8515,
+  8516,
+  8517,
+  8518,
+  8519,
+  8520,
+  8521,
+  8522,
+  8523,
+  8524,
+  8525,
+  8526,
+  8527,
+  8528,
+  8529,
+  8530,
+  8531,
+  8532,
+  8533,
+  8534,
+  8535,
+  8536,
+  8537,
+  8538,
+  8539,
+  8540,
+  8541,
+  8542,
+  8543,
+  8544,
+  8545,
+  8546,
+  8547,
+  8548,
+  8549,
+  8550,
+  8551,
+  8552,
+  8553,
+  8554,
+  8555,
+  8556,
+  8557,
+  8558,
+  8559,
+  8560,
+  8561,
+  8562,
+  8563,
+  8564,
+  8565,
+  8566,
+  8567,
+  8568,
+  8569,
+  8570,
+  8571,
+  8572,
+  8573,
+  8574,
+  8575,
+  8576,
+  8577,
+  8578,
+  8579,
+  8580,
+  8581,
+  8582,
+  8583,
+  8584,
+  8585,
+  8586,
+  8587,
+  8588,
+  8589,
+  8590,
+  8591,
+  8592,
+  8593,
+  8594,
+  8595,
+  8596,
+  8597,
+  8598,
+  8599,
+  8600,
+  8601,
+  8602,
+  8603,
+  8604,
+  8605,
+  8606,
+  8607,
+  8608,
+  8609,
+  8610,
+  8611,
+  8612,
+  8613,
+  8614,
+  8615,
+  8616,
+  8617,
+  8618,
+  8619,
+  8620,
+  8621,
+  8622,
+  8623,
+  8624,
+  8625,
+  8626,
+  8627,
+  8628,
+  8629,
+  8630,
+  8631,
+  8632,
+  8633,
+  8634,
+  8635,
+  8636,
+  8637,
+  8638,
+  8639,
+  8640,
+  8641,
+  8642,
+  8643,
+  8644,
+  8645,
+  8646,
+  8647,
+  8648,
+  8649,
+  8650,
+  8651,
+  8652,
+  8653,
+  8654,
+  8655,
+  8656,
+  8657,
+  8658,
+  8659,
+  8660,
+  8661,
+  8662,
+  8663,
+  8664,
+  8665,
+  8666,
+  8667,
+  8668,
+  8669,
+  8670,
+  8671,
+  8672,
+  8673,
+  8674,
+  8675,
+  8676,
+  8677,
+  8678,
+  8679,
+  8680,
+  8681,
+  8682,
+  8683,
+  8684,
+  8685,
+  8686,
+  8687,
+  8688,
+  8689,
+  8690,
+  8691,
+  8692,
+  8693,
+  8694,
+  8695,
+  8696,
+  8697,
+  8698,
+  8699,
+  8700,
+  8701,
+  8702,
+  8703,
+  8704,
+  8705,
+  8706,
+  8707,
+  8708,
+  8709,
+  8710,
+  8711,
+  8712,
+  8713,
+  8714,
+  8715,
+  8716,
+  8717,
+  8718,
+  8719,
+  8720,
+  8721,
+  8722,
+  8723,
+  8724,
+  8725,
+  8726,
+  8727,
+  8728,
+  8729,
+  8730,
+  8731,
+  8732,
+  8733,
+  8734,
+  8735,
+  8736,
+  8737,
+  8738,
+  8739,
+  8740,
+  8741,
+  8742,
+  8743,
+  8744,
+  8745,
+  8746,
+  8747,
+  8748,
+  8749,
+  8750,
+  8751,
+  8752,
+  8753,
+  8754,
+  8755,
+  8756,
+  8757,
+  8758,
+  8759,
+  8760,
+  8761,
+  8762,
+  8763,
+  8764,
+  8765,
+  8766,
+  8767,
+  8768,
+  8769,
+  8770,
+  8771,
+  8772,
+  8773,
+  8774,
+  8775,
+  8776,
+  8777,
+  8778,
+  8779,
+  8780,
+  8781,
+  8782,
+  8783,
+  8784,
+  8785,
+  8786,
+  8787,
+  8788,
+  8789,
+  8790,
+  8791,
+  8792,
+  8793,
+  8794,
+  8795,
+  8796,
+  8797,
+  8798,
+  8799,
+  8800,
+  8801,
+  8802,
+  8803,
+  8804,
+  8805,
+  8806,
+  8807,
+  8808,
+  8809,
+  8810,
+  8811,
+  8812,
+  8813,
+  8814,
+  8815,
+  8816,
+  8817,
+  8818,
+  8819,
+  8820,
+  8821,
+  8822,
+  8823,
+  8824,
+  8825,
+  8826,
+  8827,
+  8828,
+  8829,
+  8830,
+  8831,
+  8832,
+  8833,
+  8834,
+  8835,
+  8836,
+  8837,
+  8838,
+  8839,
+  8840,
+  8841,
+  8842,
+  8843,
+  8844,
+  8845,
+  8846,
+  8847,
+  8848,
+  8849,
+  8850,
+  8851,
+  8852,
+  8853,
+  8854,
+  8855,
+  8856,
+  8857,
+  8858,
+  8859,
+  8860,
+  8861,
+  8862,
+  8863,
+  8864,
+  8865,
+  8866,
+  8867,
+  8868,
+  8869,
+  8870,
+  8871,
+  8872,
+  8873,
+  8874,
+  8875,
+  8876,
+  8877,
+  8878,
+  8879,
+  8880,
+  8881,
+  8882,
+  8883,
+  8884,
+  8885,
+  8886,
+  8887,
+  8888,
+  8889,
+  8890,
+  8891,
+  8892,
+  8893,
+  8894,
+  8895,
+  8896,
+  8897,
+  8898,
+  8899,
+  8900,
+  8901,
+  8902,
+  8903,
+  8904,
+  8905,
+  8906,
+  8907,
+  8908,
+  8909,
+  8910,
+  8911,
+  8912,
+  8913,
+  8914,
+  8915,
+  8916,
+  8917,
+  8918,
+  8919,
+  8920,
+  8921,
+  8922,
+  8923,
+  8924,
+  8925,
+  8926,
+  8927,
+  8928,
+  8929,
+  8930,
+  8931,
+  8932,
+  8933,
+  8934,
+  8935,
+  8936,
+  8937,
+  8938,
+  8939,
+  8940,
+  8941,
+  8942,
+  8943,
+  8944,
+  8945,
+  8946,
+  8947,
+  8948,
+  8949,
+  8950,
+  8951,
+  8952,
+  8953,
+  8954,
+  8955,
+  8956,
+  8957,
+  8958,
+  8959,
+  8960,
+  8961,
+  8962,
+  8963,
+  8964,
+  8965,
+  8966,
+  8967,
+  8968,
+  8969,
+  8970,
+  8971,
+  8972,
+  8973,
+  8974,
+  8975,
+  8976,
+  8977,
+  8978,
+  8979,
+  8980,
+  8981,
+  8982,
+  8983,
+  8984,
+  8985,
+  8986,
+  8987,
+  8988,
+  8989,
+  8990,
+  8991,
+  8992,
+  8993,
+  8994,
+  8995,
+  8996,
+  8997,
+  8998,
+  8999,
+  9000,
+  9001,
+  9002,
+  9003,
+  9004,
+  9005,
+  9006,
+  9007,
+  9008,
+  9009,
+  9010,
+  9011,
+  9012,
+  9013,
+  9014,
+  9015,
+  9016,
+  9017,
+  9018,
+  9019,
+  9020,
+  9021,
+  9022,
+  9023,
+  9024,
+  9025,
+  9026,
+  9027,
+  9028,
+  9029,
+  9030,
+  9031,
+  9032,
+  9033,
+  9034,
+  9035,
+  9036,
+  9037,
+  9038,
+  9039,
+  9040,
+  9041,
+  9042,
+  9043,
+  9044,
+  9045,
+  9046,
+  9047,
+  9048,
+  9049,
+  9050,
+  9051,
+  9052,
+  9053,
+  9054,
+  9055,
+  9056,
+  9057,
+  9058,
+  9059,
+  9060,
+  9061,
+  9062,
+  9063,
+  9064,
+  9065,
+  9066,
+  9067,
+  9068,
+  9069,
+  9070,
+  9071,
+  9072,
+  9073,
+  9074,
+  9075,
+  9076,
+  9077,
+  9078,
+  9079,
+  9080,
+  9081,
+  9082,
+  9083,
+  9084,
+  9085,
+  9086,
+  9087,
+  9088,
+  9089,
+  9090,
+  9091,
+  9092,
+  9093,
+  9094,
+  9095,
+  9096,
+  9097,
+  9098,
+  9099,
+  9100,
+  9101,
+  9102,
+  9103,
+  9104,
+  9105,
+  9106,
+  9107,
+  9108,
+  9109,
+  9110,
+  9111,
+  9112,
+  9113,
+  9114,
+  9115,
+  9116,
+  9117,
+  9118,
+  9119,
+  9120,
+  9121,
+  9122,
+  9123,
+  9124,
+  9125,
+  9126,
+  9127,
+  9128,
+  9129,
+  9130,
+  9131,
+  9132,
+  9133,
+  9134,
+  9135,
+  9136,
+  9137,
+  9138,
+  9139,
+  9140,
+  9141,
+  9142,
+  9143,
+  9144,
+  9145,
+  9146,
+  9147,
+  9148,
+  9149,
+  9150,
+  9151,
+  9152,
+  9153,
+  9154,
+  9155,
+  9156,
+  9157,
+  9158,
+  9159,
+  9160,
+  9161,
+  9162,
+  9163,
+  9164,
+  9165,
+  9166,
+  9167,
+  9168,
+  9169,
+  9170,
+  9171,
+  9172,
+  9173,
+  9174,
+  9175,
+  9176,
+  9177,
+  9178,
+  9179,
+  9180,
+  9181,
+  9182,
+  9183,
+  9184,
+  9185,
+  9186,
+  9187,
+  9188,
+  9189,
+  9190,
+  9191,
+  9192,
+  9193,
+  9194,
+  9195,
+  9196,
+  9197,
+  9198,
+  9199,
+  9200,
+  9201,
+  9202,
+  9203,
+  9204,
+  9205,
+  9206,
+  9207,
+  9208,
+  9209,
+  9210,
+  9211,
+  9212,
+  9213,
+  9214,
+  9215,
+  9216,
+  9217,
+  9218,
+  9219,
+  9220,
+  9221,
+  9222,
+  9223,
+  9224,
+  9225,
+  9226,
+  9227,
+  9228,
+  9229,
+  9230,
+  9231,
+  9232,
+  9233,
+  9234,
+  9235,
+  9236,
+  9237,
+  9238,
+  9239,
+  9240,
+  9241,
+  9242,
+  9243,
+  9244,
+  9245,
+  9246,
+  9247,
+  9248,
+  9249,
+  9250,
+  9251,
+  9252,
+  9253,
+  9254,
+  9255,
+  9256,
+  9257,
+  9258,
+  9259,
+  9260,
+  9261,
+  9262,
+  9263,
+  9264,
+  9265,
+  9266,
+  9267,
+  9268,
+  9269,
+  9270,
+  9271,
+  9272,
+  9273,
+  9274,
+  9275,
+  9276,
+  9277,
+  9278,
+  9279,
+  9280,
+  9281,
+  9282,
+  9283,
+  9284,
+  9285,
+  9286,
+  9287,
+  9288,
+  9289,
+  9290,
+  9291,
+  9292,
+  9293,
+  9294,
+  9295,
+  9296,
+  9297,
+  9298,
+  9299,
+  9300,
+  9301,
+  9302,
+  9303,
+  9304,
+  9305,
+  9306,
+  9307,
+  9308,
+  9309,
+  9310,
+  9311,
+  9312,
+  9313,
+  9314,
+  9315,
+  9316,
+  9317,
+  9318,
+  9319,
+  9320,
+  9321,
+  9322,
+  9323,
+  9324,
+  9325,
+  9326,
+  9327,
+  9328,
+  9329,
+  9330,
+  9331,
+  9332,
+  9333,
+  9334,
+  9335,
+  9336,
+  9337,
+  9338,
+  9339,
+  9340,
+  9341,
+  9342,
+  9343,
+  9344,
+  9345,
+  9346,
+  9347,
+  9348,
+  9349,
+  9350,
+  9351,
+  9352,
+  9353,
+  9354,
+  9355,
+  9356,
+  9357,
+  9358,
+  9359,
+  9360,
+  9361,
+  9362,
+  9363,
+  9364,
+  9365,
+  9366,
+  9367,
+  9368,
+  9369,
+  9370,
+  9371,
+  9372,
+  9373,
+  9374,
+  9375,
+  9376,
+  9377,
+  9378,
+  9379,
+  9380,
+  9381,
+  9382,
+  9383,
+  9384,
+  9385,
+  9386,
+  9387,
+  9388,
+  9389,
+  9390,
+  9391,
+  9392,
+  9393,
+  9394,
+  9395,
+  9396,
+  9397,
+  9398,
+  9399,
+  9400,
+  9401,
+  9402,
+  9403,
+  9404,
+  9405,
+  9406,
+  9407,
+  9408,
+  9409,
+  9410,
+  9411,
+  9412,
+  9413,
+  9414,
+  9415,
+  9416,
+  9417,
+  9418,
+  9419,
+  9420,
+  9421,
+  9422,
+  9423,
+  9424,
+  9425,
+  9426,
+  9427,
+  9428,
+  9429,
+  9430,
+  9431,
+  9432,
+  9433,
+  9434,
+  9435,
+  9436,
+  9437,
+  9438,
+  9439,
+  9440,
+  9441,
+  9442,
+  9443,
+  9444,
+  9445,
+  9446,
+  9447,
+  9448,
+  9449,
+  9450,
+  9451,
+  9452,
+  9453,
+  9454,
+  9455,
+  9456,
+  9457,
+  9458,
+  9459,
+  9460,
+  9461,
+  9462,
+  9463,
+  9464,
+  9465,
+  9466,
+  9467,
+  9468,
+  9469,
+  9470,
+  9471,
+  9472,
+  9473,
+  9474,
+  9475,
+  9476,
+  9477,
+  9478,
+  9479,
+  9480,
+  9481,
+  9482,
+  9483,
+  9484,
+  9485,
+  9486,
+  9487,
+  9488,
+  9489,
+  9490,
+  9491,
+  9492,
+  9493,
+  9494,
+  9495,
+  9496,
+  9497,
+  9498,
+  9499,
+  9500,
+  9501,
+  9502,
+  9503,
+  9504,
+  9505,
+  9506,
+  9507,
+  9508,
+  9509,
+  9510,
+  9511,
+  9512,
+  9513,
+  9514,
+  9515,
+  9516,
+  9517,
+  9518,
+  9519,
+  9520,
+  9521,
+  9522,
+  9523,
+  9524,
+  9525,
+  9526,
+  9527,
+  9528,
+  9529,
+  9530,
+  9531,
+  9532,
+  9533,
+  9534,
+  9535,
+  9536,
+  9537,
+  9538,
+  9539,
+  9540,
+  9541,
+  9542,
+  9543,
+  9544,
+  9545,
+  9546,
+  9547,
+  9548,
+  9549,
+  9550,
+  9551,
+  9552,
+  9553,
+  9554,
+  9555,
+  9556,
+  9557,
+  9558,
+  9559,
+  9560,
+  9561,
+  9562,
+  9563,
+  9564,
+  9565,
+  9566,
+  9567,
+  9568,
+  9569,
+  9570,
+  9571,
+  9572,
+  9573,
+  9574,
+  9575,
+  9576,
+  9577,
+  9578,
+  9579,
+  9580,
+  9581,
+  9582,
+  9583,
+  9584,
+  9585,
+  9586,
+  9587,
+  9588,
+  9589,
+  9590,
+  9591,
+  9592,
+  9593,
+  9594,
+  9595,
+  9596,
+  9597,
+  9598,
+  9599,
+  9600,
+  9601,
+  9602,
+  9603,
+  9604,
+  9605,
+  9606,
+  9607,
+  9608,
+  9609,
+  9610,
+  9611,
+  9612,
+  9613,
+  9614,
+  9615,
+  9616,
+  9617,
+  9618,
+  9619,
+  9620,
+  9621,
+  9622,
+  9623,
+  9624,
+  9625,
+  9626,
+  9627,
+  9628,
+  9629,
+  9630,
+  9631,
+  9632,
+  9633,
+  9634,
+  9635,
+  9636,
+  9637,
+  9638,
+  9639,
+  9640,
+  9641,
+  9642,
+  9643,
+  9644,
+  9645,
+  9646,
+  9647,
+  9648,
+  9649,
+  9650,
+  9651,
+  9652,
+  9653,
+  9654,
+  9655,
+  9656,
+  9657,
+  9658,
+  9659,
+  9660,
+  9661,
+  9662,
+  9663,
+  9664,
+  9665,
+  9666,
+  9667,
+  9668,
+  9669,
+  9670,
+  9671,
+  9672,
+  9673,
+  9674,
+  9675,
+  9676,
+  9677,
+  9678,
+  9679,
+  9680,
+  9681,
+  9682,
+  9683,
+  9684,
+  9685,
+  9686,
+  9687,
+  9688,
+  9689,
+  9690,
+  9691,
+  9692,
+  9693,
+  9694,
+  9695,
+  9696,
+  9697,
+  9698,
+  9699,
+  9700,
+  9701,
+  9702,
+  9703,
+  9704,
+  9705,
+  9706,
+  9707,
+  9708,
+  9709,
+  9710,
+  9711,
+  9712,
+  9713,
+  9714,
+  9715,
+  9716,
+  9717,
+  9718,
+  9719,
+  9720,
+  9721,
+  9722,
+  9723,
+  9724,
+  9725,
+  9726,
+  9727,
+  9728,
+  9729,
+  9730,
+  9731,
+  9732,
+  9733,
+  9734,
+  9735,
+  9736,
+  9737,
+  9738,
+  9739,
+  9740,
+  9741,
+  9742,
+  9743,
+  9744,
+  9745,
+  9746,
+  9747,
+  9748,
+  9749,
+  9750,
+  9751,
+  9752,
+  9753,
+  9754,
+  9755,
+  9756,
+  9757,
+  9758,
+  9759,
+  9760,
+  9761,
+  9762,
+  9763,
+  9764,
+  9765,
+  9766,
+  9767,
+  9768,
+  9769,
+  9770,
+  9771,
+  9772,
+  9773,
+  9774,
+  9775,
+  9776,
+  9777,
+  9778,
+  9779,
+  9780,
+  9781,
+  9782,
+  9783,
+  9784,
+  9785,
+  9786,
+  9787,
+  9788,
+  9789,
+  9790,
+  9791,
+  9792,
+  9793,
+  9794,
+  9795,
+  9796,
+  9797,
+  9798,
+  9799,
+  9800,
+  9801,
+  9802,
+  9803,
+  9804,
+  9805,
+  9806,
+  9807,
+  9808,
+  9809,
+  9810,
+  9811,
+  9812,
+  9813,
+  9814,
+  9815,
+  9816,
+  9817,
+  9818,
+  9819,
+  9820,
+  9821,
+  9822,
+  9823,
+  9824,
+  9825,
+  9826,
+  9827,
+  9828,
+  9829,
+  9830,
+  9831,
+  9832,
+  9833,
+  9834,
+  9835,
+  9836,
+  9837,
+  9838,
+  9839,
+  9840,
+  9841,
+  9842,
+  9843,
+  9844,
+  9845,
+  9846,
+  9847,
+  9848,
+  9849,
+  9850,
+  9851,
+  9852,
+  9853,
+  9854,
+  9855,
+  9856,
+  9857,
+  9858,
+  9859,
+  9860,
+  9861,
+  9862,
+  9863,
+  9864,
+  9865,
+  9866,
+  9867,
+  9868,
+  9869,
+  9870,
+  9871,
+  9872,
+  9873,
+  9874,
+  9875,
+  9876,
+  9877,
+  9878,
+  9879,
+  9880,
+  9881,
+  9882,
+  9883,
+  9884,
+  9885,
+  9886,
+  9887,
+  9888,
+  9889,
+  9890,
+  9891,
+  9892,
+  9893,
+  9894,
+  9895,
+  9896,
+  9897,
+  9898,
+  9899,
+  9900,
+  9901,
+  9902,
+  9903,
+  9904,
+  9905,
+  9906,
+  9907,
+  9908,
+  9909,
+  9910,
+  9911,
+  9912,
+  9913,
+  9914,
+  9915,
+  9916,
+  9917,
+  9918,
+  9919,
+  9920,
+  9921,
+  9922,
+  9923,
+  9924,
+  9925,
+  9926,
+  9927,
+  9928,
+  9929,
+  9930,
+  9931,
+  9932,
+  9933,
+  9934,
+  9935,
+  9936,
+  9937,
+  9938,
+  9939,
+  9940,
+  9941,
+  9942,
+  9943,
+  9944,
+  9945,
+  9946,
+  9947,
+  9948,
+  9949,
+  9950,
+  9951,
+  9952,
+  9953,
+  9954,
+  9955,
+  9956,
+  9957,
+  9958,
+  9959,
+  9960,
+  9961,
+  9962,
+  9963,
+  9964,
+  9965,
+  9966,
+  9967,
+  9968,
+  9969,
+  9970,
+  9971,
+  9972,
+  9973,
+  9974,
+  9975,
+  9976,
+  9977,
+  9978,
+  9979,
+  9980,
+  9981,
+  9982,
+  9983,
+  9984,
+  9985,
+  9986,
+  9987,
+  9988,
+  9989,
+  9990,
+  9991,
+  9992,
+  9993,
+  9994,
+  9995,
+  9996,
+  9997,
+  9998,
+  9999,
+};
+Set<String> stringSet = {
+  'foo_0',
+  'foo_1',
+  'foo_2',
+  'foo_3',
+  'foo_4',
+  'foo_5',
+  'foo_6',
+  'foo_7',
+  'foo_8',
+  'foo_9',
+  'foo_10',
+  'foo_11',
+  'foo_12',
+  'foo_13',
+  'foo_14',
+  'foo_15',
+  'foo_16',
+  'foo_17',
+  'foo_18',
+  'foo_19',
+  'foo_20',
+  'foo_21',
+  'foo_22',
+  'foo_23',
+  'foo_24',
+  'foo_25',
+  'foo_26',
+  'foo_27',
+  'foo_28',
+  'foo_29',
+  'foo_30',
+  'foo_31',
+  'foo_32',
+  'foo_33',
+  'foo_34',
+  'foo_35',
+  'foo_36',
+  'foo_37',
+  'foo_38',
+  'foo_39',
+  'foo_40',
+  'foo_41',
+  'foo_42',
+  'foo_43',
+  'foo_44',
+  'foo_45',
+  'foo_46',
+  'foo_47',
+  'foo_48',
+  'foo_49',
+  'foo_50',
+  'foo_51',
+  'foo_52',
+  'foo_53',
+  'foo_54',
+  'foo_55',
+  'foo_56',
+  'foo_57',
+  'foo_58',
+  'foo_59',
+  'foo_60',
+  'foo_61',
+  'foo_62',
+  'foo_63',
+  'foo_64',
+  'foo_65',
+  'foo_66',
+  'foo_67',
+  'foo_68',
+  'foo_69',
+  'foo_70',
+  'foo_71',
+  'foo_72',
+  'foo_73',
+  'foo_74',
+  'foo_75',
+  'foo_76',
+  'foo_77',
+  'foo_78',
+  'foo_79',
+  'foo_80',
+  'foo_81',
+  'foo_82',
+  'foo_83',
+  'foo_84',
+  'foo_85',
+  'foo_86',
+  'foo_87',
+  'foo_88',
+  'foo_89',
+  'foo_90',
+  'foo_91',
+  'foo_92',
+  'foo_93',
+  'foo_94',
+  'foo_95',
+  'foo_96',
+  'foo_97',
+  'foo_98',
+  'foo_99',
+  'foo_100',
+  'foo_101',
+  'foo_102',
+  'foo_103',
+  'foo_104',
+  'foo_105',
+  'foo_106',
+  'foo_107',
+  'foo_108',
+  'foo_109',
+  'foo_110',
+  'foo_111',
+  'foo_112',
+  'foo_113',
+  'foo_114',
+  'foo_115',
+  'foo_116',
+  'foo_117',
+  'foo_118',
+  'foo_119',
+  'foo_120',
+  'foo_121',
+  'foo_122',
+  'foo_123',
+  'foo_124',
+  'foo_125',
+  'foo_126',
+  'foo_127',
+  'foo_128',
+  'foo_129',
+  'foo_130',
+  'foo_131',
+  'foo_132',
+  'foo_133',
+  'foo_134',
+  'foo_135',
+  'foo_136',
+  'foo_137',
+  'foo_138',
+  'foo_139',
+  'foo_140',
+  'foo_141',
+  'foo_142',
+  'foo_143',
+  'foo_144',
+  'foo_145',
+  'foo_146',
+  'foo_147',
+  'foo_148',
+  'foo_149',
+  'foo_150',
+  'foo_151',
+  'foo_152',
+  'foo_153',
+  'foo_154',
+  'foo_155',
+  'foo_156',
+  'foo_157',
+  'foo_158',
+  'foo_159',
+  'foo_160',
+  'foo_161',
+  'foo_162',
+  'foo_163',
+  'foo_164',
+  'foo_165',
+  'foo_166',
+  'foo_167',
+  'foo_168',
+  'foo_169',
+  'foo_170',
+  'foo_171',
+  'foo_172',
+  'foo_173',
+  'foo_174',
+  'foo_175',
+  'foo_176',
+  'foo_177',
+  'foo_178',
+  'foo_179',
+  'foo_180',
+  'foo_181',
+  'foo_182',
+  'foo_183',
+  'foo_184',
+  'foo_185',
+  'foo_186',
+  'foo_187',
+  'foo_188',
+  'foo_189',
+  'foo_190',
+  'foo_191',
+  'foo_192',
+  'foo_193',
+  'foo_194',
+  'foo_195',
+  'foo_196',
+  'foo_197',
+  'foo_198',
+  'foo_199',
+  'foo_200',
+  'foo_201',
+  'foo_202',
+  'foo_203',
+  'foo_204',
+  'foo_205',
+  'foo_206',
+  'foo_207',
+  'foo_208',
+  'foo_209',
+  'foo_210',
+  'foo_211',
+  'foo_212',
+  'foo_213',
+  'foo_214',
+  'foo_215',
+  'foo_216',
+  'foo_217',
+  'foo_218',
+  'foo_219',
+  'foo_220',
+  'foo_221',
+  'foo_222',
+  'foo_223',
+  'foo_224',
+  'foo_225',
+  'foo_226',
+  'foo_227',
+  'foo_228',
+  'foo_229',
+  'foo_230',
+  'foo_231',
+  'foo_232',
+  'foo_233',
+  'foo_234',
+  'foo_235',
+  'foo_236',
+  'foo_237',
+  'foo_238',
+  'foo_239',
+  'foo_240',
+  'foo_241',
+  'foo_242',
+  'foo_243',
+  'foo_244',
+  'foo_245',
+  'foo_246',
+  'foo_247',
+  'foo_248',
+  'foo_249',
+  'foo_250',
+  'foo_251',
+  'foo_252',
+  'foo_253',
+  'foo_254',
+  'foo_255',
+  'foo_256',
+  'foo_257',
+  'foo_258',
+  'foo_259',
+  'foo_260',
+  'foo_261',
+  'foo_262',
+  'foo_263',
+  'foo_264',
+  'foo_265',
+  'foo_266',
+  'foo_267',
+  'foo_268',
+  'foo_269',
+  'foo_270',
+  'foo_271',
+  'foo_272',
+  'foo_273',
+  'foo_274',
+  'foo_275',
+  'foo_276',
+  'foo_277',
+  'foo_278',
+  'foo_279',
+  'foo_280',
+  'foo_281',
+  'foo_282',
+  'foo_283',
+  'foo_284',
+  'foo_285',
+  'foo_286',
+  'foo_287',
+  'foo_288',
+  'foo_289',
+  'foo_290',
+  'foo_291',
+  'foo_292',
+  'foo_293',
+  'foo_294',
+  'foo_295',
+  'foo_296',
+  'foo_297',
+  'foo_298',
+  'foo_299',
+  'foo_300',
+  'foo_301',
+  'foo_302',
+  'foo_303',
+  'foo_304',
+  'foo_305',
+  'foo_306',
+  'foo_307',
+  'foo_308',
+  'foo_309',
+  'foo_310',
+  'foo_311',
+  'foo_312',
+  'foo_313',
+  'foo_314',
+  'foo_315',
+  'foo_316',
+  'foo_317',
+  'foo_318',
+  'foo_319',
+  'foo_320',
+  'foo_321',
+  'foo_322',
+  'foo_323',
+  'foo_324',
+  'foo_325',
+  'foo_326',
+  'foo_327',
+  'foo_328',
+  'foo_329',
+  'foo_330',
+  'foo_331',
+  'foo_332',
+  'foo_333',
+  'foo_334',
+  'foo_335',
+  'foo_336',
+  'foo_337',
+  'foo_338',
+  'foo_339',
+  'foo_340',
+  'foo_341',
+  'foo_342',
+  'foo_343',
+  'foo_344',
+  'foo_345',
+  'foo_346',
+  'foo_347',
+  'foo_348',
+  'foo_349',
+  'foo_350',
+  'foo_351',
+  'foo_352',
+  'foo_353',
+  'foo_354',
+  'foo_355',
+  'foo_356',
+  'foo_357',
+  'foo_358',
+  'foo_359',
+  'foo_360',
+  'foo_361',
+  'foo_362',
+  'foo_363',
+  'foo_364',
+  'foo_365',
+  'foo_366',
+  'foo_367',
+  'foo_368',
+  'foo_369',
+  'foo_370',
+  'foo_371',
+  'foo_372',
+  'foo_373',
+  'foo_374',
+  'foo_375',
+  'foo_376',
+  'foo_377',
+  'foo_378',
+  'foo_379',
+  'foo_380',
+  'foo_381',
+  'foo_382',
+  'foo_383',
+  'foo_384',
+  'foo_385',
+  'foo_386',
+  'foo_387',
+  'foo_388',
+  'foo_389',
+  'foo_390',
+  'foo_391',
+  'foo_392',
+  'foo_393',
+  'foo_394',
+  'foo_395',
+  'foo_396',
+  'foo_397',
+  'foo_398',
+  'foo_399',
+  'foo_400',
+  'foo_401',
+  'foo_402',
+  'foo_403',
+  'foo_404',
+  'foo_405',
+  'foo_406',
+  'foo_407',
+  'foo_408',
+  'foo_409',
+  'foo_410',
+  'foo_411',
+  'foo_412',
+  'foo_413',
+  'foo_414',
+  'foo_415',
+  'foo_416',
+  'foo_417',
+  'foo_418',
+  'foo_419',
+  'foo_420',
+  'foo_421',
+  'foo_422',
+  'foo_423',
+  'foo_424',
+  'foo_425',
+  'foo_426',
+  'foo_427',
+  'foo_428',
+  'foo_429',
+  'foo_430',
+  'foo_431',
+  'foo_432',
+  'foo_433',
+  'foo_434',
+  'foo_435',
+  'foo_436',
+  'foo_437',
+  'foo_438',
+  'foo_439',
+  'foo_440',
+  'foo_441',
+  'foo_442',
+  'foo_443',
+  'foo_444',
+  'foo_445',
+  'foo_446',
+  'foo_447',
+  'foo_448',
+  'foo_449',
+  'foo_450',
+  'foo_451',
+  'foo_452',
+  'foo_453',
+  'foo_454',
+  'foo_455',
+  'foo_456',
+  'foo_457',
+  'foo_458',
+  'foo_459',
+  'foo_460',
+  'foo_461',
+  'foo_462',
+  'foo_463',
+  'foo_464',
+  'foo_465',
+  'foo_466',
+  'foo_467',
+  'foo_468',
+  'foo_469',
+  'foo_470',
+  'foo_471',
+  'foo_472',
+  'foo_473',
+  'foo_474',
+  'foo_475',
+  'foo_476',
+  'foo_477',
+  'foo_478',
+  'foo_479',
+  'foo_480',
+  'foo_481',
+  'foo_482',
+  'foo_483',
+  'foo_484',
+  'foo_485',
+  'foo_486',
+  'foo_487',
+  'foo_488',
+  'foo_489',
+  'foo_490',
+  'foo_491',
+  'foo_492',
+  'foo_493',
+  'foo_494',
+  'foo_495',
+  'foo_496',
+  'foo_497',
+  'foo_498',
+  'foo_499',
+  'foo_500',
+  'foo_501',
+  'foo_502',
+  'foo_503',
+  'foo_504',
+  'foo_505',
+  'foo_506',
+  'foo_507',
+  'foo_508',
+  'foo_509',
+  'foo_510',
+  'foo_511',
+  'foo_512',
+  'foo_513',
+  'foo_514',
+  'foo_515',
+  'foo_516',
+  'foo_517',
+  'foo_518',
+  'foo_519',
+  'foo_520',
+  'foo_521',
+  'foo_522',
+  'foo_523',
+  'foo_524',
+  'foo_525',
+  'foo_526',
+  'foo_527',
+  'foo_528',
+  'foo_529',
+  'foo_530',
+  'foo_531',
+  'foo_532',
+  'foo_533',
+  'foo_534',
+  'foo_535',
+  'foo_536',
+  'foo_537',
+  'foo_538',
+  'foo_539',
+  'foo_540',
+  'foo_541',
+  'foo_542',
+  'foo_543',
+  'foo_544',
+  'foo_545',
+  'foo_546',
+  'foo_547',
+  'foo_548',
+  'foo_549',
+  'foo_550',
+  'foo_551',
+  'foo_552',
+  'foo_553',
+  'foo_554',
+  'foo_555',
+  'foo_556',
+  'foo_557',
+  'foo_558',
+  'foo_559',
+  'foo_560',
+  'foo_561',
+  'foo_562',
+  'foo_563',
+  'foo_564',
+  'foo_565',
+  'foo_566',
+  'foo_567',
+  'foo_568',
+  'foo_569',
+  'foo_570',
+  'foo_571',
+  'foo_572',
+  'foo_573',
+  'foo_574',
+  'foo_575',
+  'foo_576',
+  'foo_577',
+  'foo_578',
+  'foo_579',
+  'foo_580',
+  'foo_581',
+  'foo_582',
+  'foo_583',
+  'foo_584',
+  'foo_585',
+  'foo_586',
+  'foo_587',
+  'foo_588',
+  'foo_589',
+  'foo_590',
+  'foo_591',
+  'foo_592',
+  'foo_593',
+  'foo_594',
+  'foo_595',
+  'foo_596',
+  'foo_597',
+  'foo_598',
+  'foo_599',
+  'foo_600',
+  'foo_601',
+  'foo_602',
+  'foo_603',
+  'foo_604',
+  'foo_605',
+  'foo_606',
+  'foo_607',
+  'foo_608',
+  'foo_609',
+  'foo_610',
+  'foo_611',
+  'foo_612',
+  'foo_613',
+  'foo_614',
+  'foo_615',
+  'foo_616',
+  'foo_617',
+  'foo_618',
+  'foo_619',
+  'foo_620',
+  'foo_621',
+  'foo_622',
+  'foo_623',
+  'foo_624',
+  'foo_625',
+  'foo_626',
+  'foo_627',
+  'foo_628',
+  'foo_629',
+  'foo_630',
+  'foo_631',
+  'foo_632',
+  'foo_633',
+  'foo_634',
+  'foo_635',
+  'foo_636',
+  'foo_637',
+  'foo_638',
+  'foo_639',
+  'foo_640',
+  'foo_641',
+  'foo_642',
+  'foo_643',
+  'foo_644',
+  'foo_645',
+  'foo_646',
+  'foo_647',
+  'foo_648',
+  'foo_649',
+  'foo_650',
+  'foo_651',
+  'foo_652',
+  'foo_653',
+  'foo_654',
+  'foo_655',
+  'foo_656',
+  'foo_657',
+  'foo_658',
+  'foo_659',
+  'foo_660',
+  'foo_661',
+  'foo_662',
+  'foo_663',
+  'foo_664',
+  'foo_665',
+  'foo_666',
+  'foo_667',
+  'foo_668',
+  'foo_669',
+  'foo_670',
+  'foo_671',
+  'foo_672',
+  'foo_673',
+  'foo_674',
+  'foo_675',
+  'foo_676',
+  'foo_677',
+  'foo_678',
+  'foo_679',
+  'foo_680',
+  'foo_681',
+  'foo_682',
+  'foo_683',
+  'foo_684',
+  'foo_685',
+  'foo_686',
+  'foo_687',
+  'foo_688',
+  'foo_689',
+  'foo_690',
+  'foo_691',
+  'foo_692',
+  'foo_693',
+  'foo_694',
+  'foo_695',
+  'foo_696',
+  'foo_697',
+  'foo_698',
+  'foo_699',
+  'foo_700',
+  'foo_701',
+  'foo_702',
+  'foo_703',
+  'foo_704',
+  'foo_705',
+  'foo_706',
+  'foo_707',
+  'foo_708',
+  'foo_709',
+  'foo_710',
+  'foo_711',
+  'foo_712',
+  'foo_713',
+  'foo_714',
+  'foo_715',
+  'foo_716',
+  'foo_717',
+  'foo_718',
+  'foo_719',
+  'foo_720',
+  'foo_721',
+  'foo_722',
+  'foo_723',
+  'foo_724',
+  'foo_725',
+  'foo_726',
+  'foo_727',
+  'foo_728',
+  'foo_729',
+  'foo_730',
+  'foo_731',
+  'foo_732',
+  'foo_733',
+  'foo_734',
+  'foo_735',
+  'foo_736',
+  'foo_737',
+  'foo_738',
+  'foo_739',
+  'foo_740',
+  'foo_741',
+  'foo_742',
+  'foo_743',
+  'foo_744',
+  'foo_745',
+  'foo_746',
+  'foo_747',
+  'foo_748',
+  'foo_749',
+  'foo_750',
+  'foo_751',
+  'foo_752',
+  'foo_753',
+  'foo_754',
+  'foo_755',
+  'foo_756',
+  'foo_757',
+  'foo_758',
+  'foo_759',
+  'foo_760',
+  'foo_761',
+  'foo_762',
+  'foo_763',
+  'foo_764',
+  'foo_765',
+  'foo_766',
+  'foo_767',
+  'foo_768',
+  'foo_769',
+  'foo_770',
+  'foo_771',
+  'foo_772',
+  'foo_773',
+  'foo_774',
+  'foo_775',
+  'foo_776',
+  'foo_777',
+  'foo_778',
+  'foo_779',
+  'foo_780',
+  'foo_781',
+  'foo_782',
+  'foo_783',
+  'foo_784',
+  'foo_785',
+  'foo_786',
+  'foo_787',
+  'foo_788',
+  'foo_789',
+  'foo_790',
+  'foo_791',
+  'foo_792',
+  'foo_793',
+  'foo_794',
+  'foo_795',
+  'foo_796',
+  'foo_797',
+  'foo_798',
+  'foo_799',
+  'foo_800',
+  'foo_801',
+  'foo_802',
+  'foo_803',
+  'foo_804',
+  'foo_805',
+  'foo_806',
+  'foo_807',
+  'foo_808',
+  'foo_809',
+  'foo_810',
+  'foo_811',
+  'foo_812',
+  'foo_813',
+  'foo_814',
+  'foo_815',
+  'foo_816',
+  'foo_817',
+  'foo_818',
+  'foo_819',
+  'foo_820',
+  'foo_821',
+  'foo_822',
+  'foo_823',
+  'foo_824',
+  'foo_825',
+  'foo_826',
+  'foo_827',
+  'foo_828',
+  'foo_829',
+  'foo_830',
+  'foo_831',
+  'foo_832',
+  'foo_833',
+  'foo_834',
+  'foo_835',
+  'foo_836',
+  'foo_837',
+  'foo_838',
+  'foo_839',
+  'foo_840',
+  'foo_841',
+  'foo_842',
+  'foo_843',
+  'foo_844',
+  'foo_845',
+  'foo_846',
+  'foo_847',
+  'foo_848',
+  'foo_849',
+  'foo_850',
+  'foo_851',
+  'foo_852',
+  'foo_853',
+  'foo_854',
+  'foo_855',
+  'foo_856',
+  'foo_857',
+  'foo_858',
+  'foo_859',
+  'foo_860',
+  'foo_861',
+  'foo_862',
+  'foo_863',
+  'foo_864',
+  'foo_865',
+  'foo_866',
+  'foo_867',
+  'foo_868',
+  'foo_869',
+  'foo_870',
+  'foo_871',
+  'foo_872',
+  'foo_873',
+  'foo_874',
+  'foo_875',
+  'foo_876',
+  'foo_877',
+  'foo_878',
+  'foo_879',
+  'foo_880',
+  'foo_881',
+  'foo_882',
+  'foo_883',
+  'foo_884',
+  'foo_885',
+  'foo_886',
+  'foo_887',
+  'foo_888',
+  'foo_889',
+  'foo_890',
+  'foo_891',
+  'foo_892',
+  'foo_893',
+  'foo_894',
+  'foo_895',
+  'foo_896',
+  'foo_897',
+  'foo_898',
+  'foo_899',
+  'foo_900',
+  'foo_901',
+  'foo_902',
+  'foo_903',
+  'foo_904',
+  'foo_905',
+  'foo_906',
+  'foo_907',
+  'foo_908',
+  'foo_909',
+  'foo_910',
+  'foo_911',
+  'foo_912',
+  'foo_913',
+  'foo_914',
+  'foo_915',
+  'foo_916',
+  'foo_917',
+  'foo_918',
+  'foo_919',
+  'foo_920',
+  'foo_921',
+  'foo_922',
+  'foo_923',
+  'foo_924',
+  'foo_925',
+  'foo_926',
+  'foo_927',
+  'foo_928',
+  'foo_929',
+  'foo_930',
+  'foo_931',
+  'foo_932',
+  'foo_933',
+  'foo_934',
+  'foo_935',
+  'foo_936',
+  'foo_937',
+  'foo_938',
+  'foo_939',
+  'foo_940',
+  'foo_941',
+  'foo_942',
+  'foo_943',
+  'foo_944',
+  'foo_945',
+  'foo_946',
+  'foo_947',
+  'foo_948',
+  'foo_949',
+  'foo_950',
+  'foo_951',
+  'foo_952',
+  'foo_953',
+  'foo_954',
+  'foo_955',
+  'foo_956',
+  'foo_957',
+  'foo_958',
+  'foo_959',
+  'foo_960',
+  'foo_961',
+  'foo_962',
+  'foo_963',
+  'foo_964',
+  'foo_965',
+  'foo_966',
+  'foo_967',
+  'foo_968',
+  'foo_969',
+  'foo_970',
+  'foo_971',
+  'foo_972',
+  'foo_973',
+  'foo_974',
+  'foo_975',
+  'foo_976',
+  'foo_977',
+  'foo_978',
+  'foo_979',
+  'foo_980',
+  'foo_981',
+  'foo_982',
+  'foo_983',
+  'foo_984',
+  'foo_985',
+  'foo_986',
+  'foo_987',
+  'foo_988',
+  'foo_989',
+  'foo_990',
+  'foo_991',
+  'foo_992',
+  'foo_993',
+  'foo_994',
+  'foo_995',
+  'foo_996',
+  'foo_997',
+  'foo_998',
+  'foo_999',
+  'foo_1000',
+  'foo_1001',
+  'foo_1002',
+  'foo_1003',
+  'foo_1004',
+  'foo_1005',
+  'foo_1006',
+  'foo_1007',
+  'foo_1008',
+  'foo_1009',
+  'foo_1010',
+  'foo_1011',
+  'foo_1012',
+  'foo_1013',
+  'foo_1014',
+  'foo_1015',
+  'foo_1016',
+  'foo_1017',
+  'foo_1018',
+  'foo_1019',
+  'foo_1020',
+  'foo_1021',
+  'foo_1022',
+  'foo_1023',
+  'foo_1024',
+  'foo_1025',
+  'foo_1026',
+  'foo_1027',
+  'foo_1028',
+  'foo_1029',
+  'foo_1030',
+  'foo_1031',
+  'foo_1032',
+  'foo_1033',
+  'foo_1034',
+  'foo_1035',
+  'foo_1036',
+  'foo_1037',
+  'foo_1038',
+  'foo_1039',
+  'foo_1040',
+  'foo_1041',
+  'foo_1042',
+  'foo_1043',
+  'foo_1044',
+  'foo_1045',
+  'foo_1046',
+  'foo_1047',
+  'foo_1048',
+  'foo_1049',
+  'foo_1050',
+  'foo_1051',
+  'foo_1052',
+  'foo_1053',
+  'foo_1054',
+  'foo_1055',
+  'foo_1056',
+  'foo_1057',
+  'foo_1058',
+  'foo_1059',
+  'foo_1060',
+  'foo_1061',
+  'foo_1062',
+  'foo_1063',
+  'foo_1064',
+  'foo_1065',
+  'foo_1066',
+  'foo_1067',
+  'foo_1068',
+  'foo_1069',
+  'foo_1070',
+  'foo_1071',
+  'foo_1072',
+  'foo_1073',
+  'foo_1074',
+  'foo_1075',
+  'foo_1076',
+  'foo_1077',
+  'foo_1078',
+  'foo_1079',
+  'foo_1080',
+  'foo_1081',
+  'foo_1082',
+  'foo_1083',
+  'foo_1084',
+  'foo_1085',
+  'foo_1086',
+  'foo_1087',
+  'foo_1088',
+  'foo_1089',
+  'foo_1090',
+  'foo_1091',
+  'foo_1092',
+  'foo_1093',
+  'foo_1094',
+  'foo_1095',
+  'foo_1096',
+  'foo_1097',
+  'foo_1098',
+  'foo_1099',
+  'foo_1100',
+  'foo_1101',
+  'foo_1102',
+  'foo_1103',
+  'foo_1104',
+  'foo_1105',
+  'foo_1106',
+  'foo_1107',
+  'foo_1108',
+  'foo_1109',
+  'foo_1110',
+  'foo_1111',
+  'foo_1112',
+  'foo_1113',
+  'foo_1114',
+  'foo_1115',
+  'foo_1116',
+  'foo_1117',
+  'foo_1118',
+  'foo_1119',
+  'foo_1120',
+  'foo_1121',
+  'foo_1122',
+  'foo_1123',
+  'foo_1124',
+  'foo_1125',
+  'foo_1126',
+  'foo_1127',
+  'foo_1128',
+  'foo_1129',
+  'foo_1130',
+  'foo_1131',
+  'foo_1132',
+  'foo_1133',
+  'foo_1134',
+  'foo_1135',
+  'foo_1136',
+  'foo_1137',
+  'foo_1138',
+  'foo_1139',
+  'foo_1140',
+  'foo_1141',
+  'foo_1142',
+  'foo_1143',
+  'foo_1144',
+  'foo_1145',
+  'foo_1146',
+  'foo_1147',
+  'foo_1148',
+  'foo_1149',
+  'foo_1150',
+  'foo_1151',
+  'foo_1152',
+  'foo_1153',
+  'foo_1154',
+  'foo_1155',
+  'foo_1156',
+  'foo_1157',
+  'foo_1158',
+  'foo_1159',
+  'foo_1160',
+  'foo_1161',
+  'foo_1162',
+  'foo_1163',
+  'foo_1164',
+  'foo_1165',
+  'foo_1166',
+  'foo_1167',
+  'foo_1168',
+  'foo_1169',
+  'foo_1170',
+  'foo_1171',
+  'foo_1172',
+  'foo_1173',
+  'foo_1174',
+  'foo_1175',
+  'foo_1176',
+  'foo_1177',
+  'foo_1178',
+  'foo_1179',
+  'foo_1180',
+  'foo_1181',
+  'foo_1182',
+  'foo_1183',
+  'foo_1184',
+  'foo_1185',
+  'foo_1186',
+  'foo_1187',
+  'foo_1188',
+  'foo_1189',
+  'foo_1190',
+  'foo_1191',
+  'foo_1192',
+  'foo_1193',
+  'foo_1194',
+  'foo_1195',
+  'foo_1196',
+  'foo_1197',
+  'foo_1198',
+  'foo_1199',
+  'foo_1200',
+  'foo_1201',
+  'foo_1202',
+  'foo_1203',
+  'foo_1204',
+  'foo_1205',
+  'foo_1206',
+  'foo_1207',
+  'foo_1208',
+  'foo_1209',
+  'foo_1210',
+  'foo_1211',
+  'foo_1212',
+  'foo_1213',
+  'foo_1214',
+  'foo_1215',
+  'foo_1216',
+  'foo_1217',
+  'foo_1218',
+  'foo_1219',
+  'foo_1220',
+  'foo_1221',
+  'foo_1222',
+  'foo_1223',
+  'foo_1224',
+  'foo_1225',
+  'foo_1226',
+  'foo_1227',
+  'foo_1228',
+  'foo_1229',
+  'foo_1230',
+  'foo_1231',
+  'foo_1232',
+  'foo_1233',
+  'foo_1234',
+  'foo_1235',
+  'foo_1236',
+  'foo_1237',
+  'foo_1238',
+  'foo_1239',
+  'foo_1240',
+  'foo_1241',
+  'foo_1242',
+  'foo_1243',
+  'foo_1244',
+  'foo_1245',
+  'foo_1246',
+  'foo_1247',
+  'foo_1248',
+  'foo_1249',
+  'foo_1250',
+  'foo_1251',
+  'foo_1252',
+  'foo_1253',
+  'foo_1254',
+  'foo_1255',
+  'foo_1256',
+  'foo_1257',
+  'foo_1258',
+  'foo_1259',
+  'foo_1260',
+  'foo_1261',
+  'foo_1262',
+  'foo_1263',
+  'foo_1264',
+  'foo_1265',
+  'foo_1266',
+  'foo_1267',
+  'foo_1268',
+  'foo_1269',
+  'foo_1270',
+  'foo_1271',
+  'foo_1272',
+  'foo_1273',
+  'foo_1274',
+  'foo_1275',
+  'foo_1276',
+  'foo_1277',
+  'foo_1278',
+  'foo_1279',
+  'foo_1280',
+  'foo_1281',
+  'foo_1282',
+  'foo_1283',
+  'foo_1284',
+  'foo_1285',
+  'foo_1286',
+  'foo_1287',
+  'foo_1288',
+  'foo_1289',
+  'foo_1290',
+  'foo_1291',
+  'foo_1292',
+  'foo_1293',
+  'foo_1294',
+  'foo_1295',
+  'foo_1296',
+  'foo_1297',
+  'foo_1298',
+  'foo_1299',
+  'foo_1300',
+  'foo_1301',
+  'foo_1302',
+  'foo_1303',
+  'foo_1304',
+  'foo_1305',
+  'foo_1306',
+  'foo_1307',
+  'foo_1308',
+  'foo_1309',
+  'foo_1310',
+  'foo_1311',
+  'foo_1312',
+  'foo_1313',
+  'foo_1314',
+  'foo_1315',
+  'foo_1316',
+  'foo_1317',
+  'foo_1318',
+  'foo_1319',
+  'foo_1320',
+  'foo_1321',
+  'foo_1322',
+  'foo_1323',
+  'foo_1324',
+  'foo_1325',
+  'foo_1326',
+  'foo_1327',
+  'foo_1328',
+  'foo_1329',
+  'foo_1330',
+  'foo_1331',
+  'foo_1332',
+  'foo_1333',
+  'foo_1334',
+  'foo_1335',
+  'foo_1336',
+  'foo_1337',
+  'foo_1338',
+  'foo_1339',
+  'foo_1340',
+  'foo_1341',
+  'foo_1342',
+  'foo_1343',
+  'foo_1344',
+  'foo_1345',
+  'foo_1346',
+  'foo_1347',
+  'foo_1348',
+  'foo_1349',
+  'foo_1350',
+  'foo_1351',
+  'foo_1352',
+  'foo_1353',
+  'foo_1354',
+  'foo_1355',
+  'foo_1356',
+  'foo_1357',
+  'foo_1358',
+  'foo_1359',
+  'foo_1360',
+  'foo_1361',
+  'foo_1362',
+  'foo_1363',
+  'foo_1364',
+  'foo_1365',
+  'foo_1366',
+  'foo_1367',
+  'foo_1368',
+  'foo_1369',
+  'foo_1370',
+  'foo_1371',
+  'foo_1372',
+  'foo_1373',
+  'foo_1374',
+  'foo_1375',
+  'foo_1376',
+  'foo_1377',
+  'foo_1378',
+  'foo_1379',
+  'foo_1380',
+  'foo_1381',
+  'foo_1382',
+  'foo_1383',
+  'foo_1384',
+  'foo_1385',
+  'foo_1386',
+  'foo_1387',
+  'foo_1388',
+  'foo_1389',
+  'foo_1390',
+  'foo_1391',
+  'foo_1392',
+  'foo_1393',
+  'foo_1394',
+  'foo_1395',
+  'foo_1396',
+  'foo_1397',
+  'foo_1398',
+  'foo_1399',
+  'foo_1400',
+  'foo_1401',
+  'foo_1402',
+  'foo_1403',
+  'foo_1404',
+  'foo_1405',
+  'foo_1406',
+  'foo_1407',
+  'foo_1408',
+  'foo_1409',
+  'foo_1410',
+  'foo_1411',
+  'foo_1412',
+  'foo_1413',
+  'foo_1414',
+  'foo_1415',
+  'foo_1416',
+  'foo_1417',
+  'foo_1418',
+  'foo_1419',
+  'foo_1420',
+  'foo_1421',
+  'foo_1422',
+  'foo_1423',
+  'foo_1424',
+  'foo_1425',
+  'foo_1426',
+  'foo_1427',
+  'foo_1428',
+  'foo_1429',
+  'foo_1430',
+  'foo_1431',
+  'foo_1432',
+  'foo_1433',
+  'foo_1434',
+  'foo_1435',
+  'foo_1436',
+  'foo_1437',
+  'foo_1438',
+  'foo_1439',
+  'foo_1440',
+  'foo_1441',
+  'foo_1442',
+  'foo_1443',
+  'foo_1444',
+  'foo_1445',
+  'foo_1446',
+  'foo_1447',
+  'foo_1448',
+  'foo_1449',
+  'foo_1450',
+  'foo_1451',
+  'foo_1452',
+  'foo_1453',
+  'foo_1454',
+  'foo_1455',
+  'foo_1456',
+  'foo_1457',
+  'foo_1458',
+  'foo_1459',
+  'foo_1460',
+  'foo_1461',
+  'foo_1462',
+  'foo_1463',
+  'foo_1464',
+  'foo_1465',
+  'foo_1466',
+  'foo_1467',
+  'foo_1468',
+  'foo_1469',
+  'foo_1470',
+  'foo_1471',
+  'foo_1472',
+  'foo_1473',
+  'foo_1474',
+  'foo_1475',
+  'foo_1476',
+  'foo_1477',
+  'foo_1478',
+  'foo_1479',
+  'foo_1480',
+  'foo_1481',
+  'foo_1482',
+  'foo_1483',
+  'foo_1484',
+  'foo_1485',
+  'foo_1486',
+  'foo_1487',
+  'foo_1488',
+  'foo_1489',
+  'foo_1490',
+  'foo_1491',
+  'foo_1492',
+  'foo_1493',
+  'foo_1494',
+  'foo_1495',
+  'foo_1496',
+  'foo_1497',
+  'foo_1498',
+  'foo_1499',
+  'foo_1500',
+  'foo_1501',
+  'foo_1502',
+  'foo_1503',
+  'foo_1504',
+  'foo_1505',
+  'foo_1506',
+  'foo_1507',
+  'foo_1508',
+  'foo_1509',
+  'foo_1510',
+  'foo_1511',
+  'foo_1512',
+  'foo_1513',
+  'foo_1514',
+  'foo_1515',
+  'foo_1516',
+  'foo_1517',
+  'foo_1518',
+  'foo_1519',
+  'foo_1520',
+  'foo_1521',
+  'foo_1522',
+  'foo_1523',
+  'foo_1524',
+  'foo_1525',
+  'foo_1526',
+  'foo_1527',
+  'foo_1528',
+  'foo_1529',
+  'foo_1530',
+  'foo_1531',
+  'foo_1532',
+  'foo_1533',
+  'foo_1534',
+  'foo_1535',
+  'foo_1536',
+  'foo_1537',
+  'foo_1538',
+  'foo_1539',
+  'foo_1540',
+  'foo_1541',
+  'foo_1542',
+  'foo_1543',
+  'foo_1544',
+  'foo_1545',
+  'foo_1546',
+  'foo_1547',
+  'foo_1548',
+  'foo_1549',
+  'foo_1550',
+  'foo_1551',
+  'foo_1552',
+  'foo_1553',
+  'foo_1554',
+  'foo_1555',
+  'foo_1556',
+  'foo_1557',
+  'foo_1558',
+  'foo_1559',
+  'foo_1560',
+  'foo_1561',
+  'foo_1562',
+  'foo_1563',
+  'foo_1564',
+  'foo_1565',
+  'foo_1566',
+  'foo_1567',
+  'foo_1568',
+  'foo_1569',
+  'foo_1570',
+  'foo_1571',
+  'foo_1572',
+  'foo_1573',
+  'foo_1574',
+  'foo_1575',
+  'foo_1576',
+  'foo_1577',
+  'foo_1578',
+  'foo_1579',
+  'foo_1580',
+  'foo_1581',
+  'foo_1582',
+  'foo_1583',
+  'foo_1584',
+  'foo_1585',
+  'foo_1586',
+  'foo_1587',
+  'foo_1588',
+  'foo_1589',
+  'foo_1590',
+  'foo_1591',
+  'foo_1592',
+  'foo_1593',
+  'foo_1594',
+  'foo_1595',
+  'foo_1596',
+  'foo_1597',
+  'foo_1598',
+  'foo_1599',
+  'foo_1600',
+  'foo_1601',
+  'foo_1602',
+  'foo_1603',
+  'foo_1604',
+  'foo_1605',
+  'foo_1606',
+  'foo_1607',
+  'foo_1608',
+  'foo_1609',
+  'foo_1610',
+  'foo_1611',
+  'foo_1612',
+  'foo_1613',
+  'foo_1614',
+  'foo_1615',
+  'foo_1616',
+  'foo_1617',
+  'foo_1618',
+  'foo_1619',
+  'foo_1620',
+  'foo_1621',
+  'foo_1622',
+  'foo_1623',
+  'foo_1624',
+  'foo_1625',
+  'foo_1626',
+  'foo_1627',
+  'foo_1628',
+  'foo_1629',
+  'foo_1630',
+  'foo_1631',
+  'foo_1632',
+  'foo_1633',
+  'foo_1634',
+  'foo_1635',
+  'foo_1636',
+  'foo_1637',
+  'foo_1638',
+  'foo_1639',
+  'foo_1640',
+  'foo_1641',
+  'foo_1642',
+  'foo_1643',
+  'foo_1644',
+  'foo_1645',
+  'foo_1646',
+  'foo_1647',
+  'foo_1648',
+  'foo_1649',
+  'foo_1650',
+  'foo_1651',
+  'foo_1652',
+  'foo_1653',
+  'foo_1654',
+  'foo_1655',
+  'foo_1656',
+  'foo_1657',
+  'foo_1658',
+  'foo_1659',
+  'foo_1660',
+  'foo_1661',
+  'foo_1662',
+  'foo_1663',
+  'foo_1664',
+  'foo_1665',
+  'foo_1666',
+  'foo_1667',
+  'foo_1668',
+  'foo_1669',
+  'foo_1670',
+  'foo_1671',
+  'foo_1672',
+  'foo_1673',
+  'foo_1674',
+  'foo_1675',
+  'foo_1676',
+  'foo_1677',
+  'foo_1678',
+  'foo_1679',
+  'foo_1680',
+  'foo_1681',
+  'foo_1682',
+  'foo_1683',
+  'foo_1684',
+  'foo_1685',
+  'foo_1686',
+  'foo_1687',
+  'foo_1688',
+  'foo_1689',
+  'foo_1690',
+  'foo_1691',
+  'foo_1692',
+  'foo_1693',
+  'foo_1694',
+  'foo_1695',
+  'foo_1696',
+  'foo_1697',
+  'foo_1698',
+  'foo_1699',
+  'foo_1700',
+  'foo_1701',
+  'foo_1702',
+  'foo_1703',
+  'foo_1704',
+  'foo_1705',
+  'foo_1706',
+  'foo_1707',
+  'foo_1708',
+  'foo_1709',
+  'foo_1710',
+  'foo_1711',
+  'foo_1712',
+  'foo_1713',
+  'foo_1714',
+  'foo_1715',
+  'foo_1716',
+  'foo_1717',
+  'foo_1718',
+  'foo_1719',
+  'foo_1720',
+  'foo_1721',
+  'foo_1722',
+  'foo_1723',
+  'foo_1724',
+  'foo_1725',
+  'foo_1726',
+  'foo_1727',
+  'foo_1728',
+  'foo_1729',
+  'foo_1730',
+  'foo_1731',
+  'foo_1732',
+  'foo_1733',
+  'foo_1734',
+  'foo_1735',
+  'foo_1736',
+  'foo_1737',
+  'foo_1738',
+  'foo_1739',
+  'foo_1740',
+  'foo_1741',
+  'foo_1742',
+  'foo_1743',
+  'foo_1744',
+  'foo_1745',
+  'foo_1746',
+  'foo_1747',
+  'foo_1748',
+  'foo_1749',
+  'foo_1750',
+  'foo_1751',
+  'foo_1752',
+  'foo_1753',
+  'foo_1754',
+  'foo_1755',
+  'foo_1756',
+  'foo_1757',
+  'foo_1758',
+  'foo_1759',
+  'foo_1760',
+  'foo_1761',
+  'foo_1762',
+  'foo_1763',
+  'foo_1764',
+  'foo_1765',
+  'foo_1766',
+  'foo_1767',
+  'foo_1768',
+  'foo_1769',
+  'foo_1770',
+  'foo_1771',
+  'foo_1772',
+  'foo_1773',
+  'foo_1774',
+  'foo_1775',
+  'foo_1776',
+  'foo_1777',
+  'foo_1778',
+  'foo_1779',
+  'foo_1780',
+  'foo_1781',
+  'foo_1782',
+  'foo_1783',
+  'foo_1784',
+  'foo_1785',
+  'foo_1786',
+  'foo_1787',
+  'foo_1788',
+  'foo_1789',
+  'foo_1790',
+  'foo_1791',
+  'foo_1792',
+  'foo_1793',
+  'foo_1794',
+  'foo_1795',
+  'foo_1796',
+  'foo_1797',
+  'foo_1798',
+  'foo_1799',
+  'foo_1800',
+  'foo_1801',
+  'foo_1802',
+  'foo_1803',
+  'foo_1804',
+  'foo_1805',
+  'foo_1806',
+  'foo_1807',
+  'foo_1808',
+  'foo_1809',
+  'foo_1810',
+  'foo_1811',
+  'foo_1812',
+  'foo_1813',
+  'foo_1814',
+  'foo_1815',
+  'foo_1816',
+  'foo_1817',
+  'foo_1818',
+  'foo_1819',
+  'foo_1820',
+  'foo_1821',
+  'foo_1822',
+  'foo_1823',
+  'foo_1824',
+  'foo_1825',
+  'foo_1826',
+  'foo_1827',
+  'foo_1828',
+  'foo_1829',
+  'foo_1830',
+  'foo_1831',
+  'foo_1832',
+  'foo_1833',
+  'foo_1834',
+  'foo_1835',
+  'foo_1836',
+  'foo_1837',
+  'foo_1838',
+  'foo_1839',
+  'foo_1840',
+  'foo_1841',
+  'foo_1842',
+  'foo_1843',
+  'foo_1844',
+  'foo_1845',
+  'foo_1846',
+  'foo_1847',
+  'foo_1848',
+  'foo_1849',
+  'foo_1850',
+  'foo_1851',
+  'foo_1852',
+  'foo_1853',
+  'foo_1854',
+  'foo_1855',
+  'foo_1856',
+  'foo_1857',
+  'foo_1858',
+  'foo_1859',
+  'foo_1860',
+  'foo_1861',
+  'foo_1862',
+  'foo_1863',
+  'foo_1864',
+  'foo_1865',
+  'foo_1866',
+  'foo_1867',
+  'foo_1868',
+  'foo_1869',
+  'foo_1870',
+  'foo_1871',
+  'foo_1872',
+  'foo_1873',
+  'foo_1874',
+  'foo_1875',
+  'foo_1876',
+  'foo_1877',
+  'foo_1878',
+  'foo_1879',
+  'foo_1880',
+  'foo_1881',
+  'foo_1882',
+  'foo_1883',
+  'foo_1884',
+  'foo_1885',
+  'foo_1886',
+  'foo_1887',
+  'foo_1888',
+  'foo_1889',
+  'foo_1890',
+  'foo_1891',
+  'foo_1892',
+  'foo_1893',
+  'foo_1894',
+  'foo_1895',
+  'foo_1896',
+  'foo_1897',
+  'foo_1898',
+  'foo_1899',
+  'foo_1900',
+  'foo_1901',
+  'foo_1902',
+  'foo_1903',
+  'foo_1904',
+  'foo_1905',
+  'foo_1906',
+  'foo_1907',
+  'foo_1908',
+  'foo_1909',
+  'foo_1910',
+  'foo_1911',
+  'foo_1912',
+  'foo_1913',
+  'foo_1914',
+  'foo_1915',
+  'foo_1916',
+  'foo_1917',
+  'foo_1918',
+  'foo_1919',
+  'foo_1920',
+  'foo_1921',
+  'foo_1922',
+  'foo_1923',
+  'foo_1924',
+  'foo_1925',
+  'foo_1926',
+  'foo_1927',
+  'foo_1928',
+  'foo_1929',
+  'foo_1930',
+  'foo_1931',
+  'foo_1932',
+  'foo_1933',
+  'foo_1934',
+  'foo_1935',
+  'foo_1936',
+  'foo_1937',
+  'foo_1938',
+  'foo_1939',
+  'foo_1940',
+  'foo_1941',
+  'foo_1942',
+  'foo_1943',
+  'foo_1944',
+  'foo_1945',
+  'foo_1946',
+  'foo_1947',
+  'foo_1948',
+  'foo_1949',
+  'foo_1950',
+  'foo_1951',
+  'foo_1952',
+  'foo_1953',
+  'foo_1954',
+  'foo_1955',
+  'foo_1956',
+  'foo_1957',
+  'foo_1958',
+  'foo_1959',
+  'foo_1960',
+  'foo_1961',
+  'foo_1962',
+  'foo_1963',
+  'foo_1964',
+  'foo_1965',
+  'foo_1966',
+  'foo_1967',
+  'foo_1968',
+  'foo_1969',
+  'foo_1970',
+  'foo_1971',
+  'foo_1972',
+  'foo_1973',
+  'foo_1974',
+  'foo_1975',
+  'foo_1976',
+  'foo_1977',
+  'foo_1978',
+  'foo_1979',
+  'foo_1980',
+  'foo_1981',
+  'foo_1982',
+  'foo_1983',
+  'foo_1984',
+  'foo_1985',
+  'foo_1986',
+  'foo_1987',
+  'foo_1988',
+  'foo_1989',
+  'foo_1990',
+  'foo_1991',
+  'foo_1992',
+  'foo_1993',
+  'foo_1994',
+  'foo_1995',
+  'foo_1996',
+  'foo_1997',
+  'foo_1998',
+  'foo_1999',
+  'foo_2000',
+  'foo_2001',
+  'foo_2002',
+  'foo_2003',
+  'foo_2004',
+  'foo_2005',
+  'foo_2006',
+  'foo_2007',
+  'foo_2008',
+  'foo_2009',
+  'foo_2010',
+  'foo_2011',
+  'foo_2012',
+  'foo_2013',
+  'foo_2014',
+  'foo_2015',
+  'foo_2016',
+  'foo_2017',
+  'foo_2018',
+  'foo_2019',
+  'foo_2020',
+  'foo_2021',
+  'foo_2022',
+  'foo_2023',
+  'foo_2024',
+  'foo_2025',
+  'foo_2026',
+  'foo_2027',
+  'foo_2028',
+  'foo_2029',
+  'foo_2030',
+  'foo_2031',
+  'foo_2032',
+  'foo_2033',
+  'foo_2034',
+  'foo_2035',
+  'foo_2036',
+  'foo_2037',
+  'foo_2038',
+  'foo_2039',
+  'foo_2040',
+  'foo_2041',
+  'foo_2042',
+  'foo_2043',
+  'foo_2044',
+  'foo_2045',
+  'foo_2046',
+  'foo_2047',
+  'foo_2048',
+  'foo_2049',
+  'foo_2050',
+  'foo_2051',
+  'foo_2052',
+  'foo_2053',
+  'foo_2054',
+  'foo_2055',
+  'foo_2056',
+  'foo_2057',
+  'foo_2058',
+  'foo_2059',
+  'foo_2060',
+  'foo_2061',
+  'foo_2062',
+  'foo_2063',
+  'foo_2064',
+  'foo_2065',
+  'foo_2066',
+  'foo_2067',
+  'foo_2068',
+  'foo_2069',
+  'foo_2070',
+  'foo_2071',
+  'foo_2072',
+  'foo_2073',
+  'foo_2074',
+  'foo_2075',
+  'foo_2076',
+  'foo_2077',
+  'foo_2078',
+  'foo_2079',
+  'foo_2080',
+  'foo_2081',
+  'foo_2082',
+  'foo_2083',
+  'foo_2084',
+  'foo_2085',
+  'foo_2086',
+  'foo_2087',
+  'foo_2088',
+  'foo_2089',
+  'foo_2090',
+  'foo_2091',
+  'foo_2092',
+  'foo_2093',
+  'foo_2094',
+  'foo_2095',
+  'foo_2096',
+  'foo_2097',
+  'foo_2098',
+  'foo_2099',
+  'foo_2100',
+  'foo_2101',
+  'foo_2102',
+  'foo_2103',
+  'foo_2104',
+  'foo_2105',
+  'foo_2106',
+  'foo_2107',
+  'foo_2108',
+  'foo_2109',
+  'foo_2110',
+  'foo_2111',
+  'foo_2112',
+  'foo_2113',
+  'foo_2114',
+  'foo_2115',
+  'foo_2116',
+  'foo_2117',
+  'foo_2118',
+  'foo_2119',
+  'foo_2120',
+  'foo_2121',
+  'foo_2122',
+  'foo_2123',
+  'foo_2124',
+  'foo_2125',
+  'foo_2126',
+  'foo_2127',
+  'foo_2128',
+  'foo_2129',
+  'foo_2130',
+  'foo_2131',
+  'foo_2132',
+  'foo_2133',
+  'foo_2134',
+  'foo_2135',
+  'foo_2136',
+  'foo_2137',
+  'foo_2138',
+  'foo_2139',
+  'foo_2140',
+  'foo_2141',
+  'foo_2142',
+  'foo_2143',
+  'foo_2144',
+  'foo_2145',
+  'foo_2146',
+  'foo_2147',
+  'foo_2148',
+  'foo_2149',
+  'foo_2150',
+  'foo_2151',
+  'foo_2152',
+  'foo_2153',
+  'foo_2154',
+  'foo_2155',
+  'foo_2156',
+  'foo_2157',
+  'foo_2158',
+  'foo_2159',
+  'foo_2160',
+  'foo_2161',
+  'foo_2162',
+  'foo_2163',
+  'foo_2164',
+  'foo_2165',
+  'foo_2166',
+  'foo_2167',
+  'foo_2168',
+  'foo_2169',
+  'foo_2170',
+  'foo_2171',
+  'foo_2172',
+  'foo_2173',
+  'foo_2174',
+  'foo_2175',
+  'foo_2176',
+  'foo_2177',
+  'foo_2178',
+  'foo_2179',
+  'foo_2180',
+  'foo_2181',
+  'foo_2182',
+  'foo_2183',
+  'foo_2184',
+  'foo_2185',
+  'foo_2186',
+  'foo_2187',
+  'foo_2188',
+  'foo_2189',
+  'foo_2190',
+  'foo_2191',
+  'foo_2192',
+  'foo_2193',
+  'foo_2194',
+  'foo_2195',
+  'foo_2196',
+  'foo_2197',
+  'foo_2198',
+  'foo_2199',
+  'foo_2200',
+  'foo_2201',
+  'foo_2202',
+  'foo_2203',
+  'foo_2204',
+  'foo_2205',
+  'foo_2206',
+  'foo_2207',
+  'foo_2208',
+  'foo_2209',
+  'foo_2210',
+  'foo_2211',
+  'foo_2212',
+  'foo_2213',
+  'foo_2214',
+  'foo_2215',
+  'foo_2216',
+  'foo_2217',
+  'foo_2218',
+  'foo_2219',
+  'foo_2220',
+  'foo_2221',
+  'foo_2222',
+  'foo_2223',
+  'foo_2224',
+  'foo_2225',
+  'foo_2226',
+  'foo_2227',
+  'foo_2228',
+  'foo_2229',
+  'foo_2230',
+  'foo_2231',
+  'foo_2232',
+  'foo_2233',
+  'foo_2234',
+  'foo_2235',
+  'foo_2236',
+  'foo_2237',
+  'foo_2238',
+  'foo_2239',
+  'foo_2240',
+  'foo_2241',
+  'foo_2242',
+  'foo_2243',
+  'foo_2244',
+  'foo_2245',
+  'foo_2246',
+  'foo_2247',
+  'foo_2248',
+  'foo_2249',
+  'foo_2250',
+  'foo_2251',
+  'foo_2252',
+  'foo_2253',
+  'foo_2254',
+  'foo_2255',
+  'foo_2256',
+  'foo_2257',
+  'foo_2258',
+  'foo_2259',
+  'foo_2260',
+  'foo_2261',
+  'foo_2262',
+  'foo_2263',
+  'foo_2264',
+  'foo_2265',
+  'foo_2266',
+  'foo_2267',
+  'foo_2268',
+  'foo_2269',
+  'foo_2270',
+  'foo_2271',
+  'foo_2272',
+  'foo_2273',
+  'foo_2274',
+  'foo_2275',
+  'foo_2276',
+  'foo_2277',
+  'foo_2278',
+  'foo_2279',
+  'foo_2280',
+  'foo_2281',
+  'foo_2282',
+  'foo_2283',
+  'foo_2284',
+  'foo_2285',
+  'foo_2286',
+  'foo_2287',
+  'foo_2288',
+  'foo_2289',
+  'foo_2290',
+  'foo_2291',
+  'foo_2292',
+  'foo_2293',
+  'foo_2294',
+  'foo_2295',
+  'foo_2296',
+  'foo_2297',
+  'foo_2298',
+  'foo_2299',
+  'foo_2300',
+  'foo_2301',
+  'foo_2302',
+  'foo_2303',
+  'foo_2304',
+  'foo_2305',
+  'foo_2306',
+  'foo_2307',
+  'foo_2308',
+  'foo_2309',
+  'foo_2310',
+  'foo_2311',
+  'foo_2312',
+  'foo_2313',
+  'foo_2314',
+  'foo_2315',
+  'foo_2316',
+  'foo_2317',
+  'foo_2318',
+  'foo_2319',
+  'foo_2320',
+  'foo_2321',
+  'foo_2322',
+  'foo_2323',
+  'foo_2324',
+  'foo_2325',
+  'foo_2326',
+  'foo_2327',
+  'foo_2328',
+  'foo_2329',
+  'foo_2330',
+  'foo_2331',
+  'foo_2332',
+  'foo_2333',
+  'foo_2334',
+  'foo_2335',
+  'foo_2336',
+  'foo_2337',
+  'foo_2338',
+  'foo_2339',
+  'foo_2340',
+  'foo_2341',
+  'foo_2342',
+  'foo_2343',
+  'foo_2344',
+  'foo_2345',
+  'foo_2346',
+  'foo_2347',
+  'foo_2348',
+  'foo_2349',
+  'foo_2350',
+  'foo_2351',
+  'foo_2352',
+  'foo_2353',
+  'foo_2354',
+  'foo_2355',
+  'foo_2356',
+  'foo_2357',
+  'foo_2358',
+  'foo_2359',
+  'foo_2360',
+  'foo_2361',
+  'foo_2362',
+  'foo_2363',
+  'foo_2364',
+  'foo_2365',
+  'foo_2366',
+  'foo_2367',
+  'foo_2368',
+  'foo_2369',
+  'foo_2370',
+  'foo_2371',
+  'foo_2372',
+  'foo_2373',
+  'foo_2374',
+  'foo_2375',
+  'foo_2376',
+  'foo_2377',
+  'foo_2378',
+  'foo_2379',
+  'foo_2380',
+  'foo_2381',
+  'foo_2382',
+  'foo_2383',
+  'foo_2384',
+  'foo_2385',
+  'foo_2386',
+  'foo_2387',
+  'foo_2388',
+  'foo_2389',
+  'foo_2390',
+  'foo_2391',
+  'foo_2392',
+  'foo_2393',
+  'foo_2394',
+  'foo_2395',
+  'foo_2396',
+  'foo_2397',
+  'foo_2398',
+  'foo_2399',
+  'foo_2400',
+  'foo_2401',
+  'foo_2402',
+  'foo_2403',
+  'foo_2404',
+  'foo_2405',
+  'foo_2406',
+  'foo_2407',
+  'foo_2408',
+  'foo_2409',
+  'foo_2410',
+  'foo_2411',
+  'foo_2412',
+  'foo_2413',
+  'foo_2414',
+  'foo_2415',
+  'foo_2416',
+  'foo_2417',
+  'foo_2418',
+  'foo_2419',
+  'foo_2420',
+  'foo_2421',
+  'foo_2422',
+  'foo_2423',
+  'foo_2424',
+  'foo_2425',
+  'foo_2426',
+  'foo_2427',
+  'foo_2428',
+  'foo_2429',
+  'foo_2430',
+  'foo_2431',
+  'foo_2432',
+  'foo_2433',
+  'foo_2434',
+  'foo_2435',
+  'foo_2436',
+  'foo_2437',
+  'foo_2438',
+  'foo_2439',
+  'foo_2440',
+  'foo_2441',
+  'foo_2442',
+  'foo_2443',
+  'foo_2444',
+  'foo_2445',
+  'foo_2446',
+  'foo_2447',
+  'foo_2448',
+  'foo_2449',
+  'foo_2450',
+  'foo_2451',
+  'foo_2452',
+  'foo_2453',
+  'foo_2454',
+  'foo_2455',
+  'foo_2456',
+  'foo_2457',
+  'foo_2458',
+  'foo_2459',
+  'foo_2460',
+  'foo_2461',
+  'foo_2462',
+  'foo_2463',
+  'foo_2464',
+  'foo_2465',
+  'foo_2466',
+  'foo_2467',
+  'foo_2468',
+  'foo_2469',
+  'foo_2470',
+  'foo_2471',
+  'foo_2472',
+  'foo_2473',
+  'foo_2474',
+  'foo_2475',
+  'foo_2476',
+  'foo_2477',
+  'foo_2478',
+  'foo_2479',
+  'foo_2480',
+  'foo_2481',
+  'foo_2482',
+  'foo_2483',
+  'foo_2484',
+  'foo_2485',
+  'foo_2486',
+  'foo_2487',
+  'foo_2488',
+  'foo_2489',
+  'foo_2490',
+  'foo_2491',
+  'foo_2492',
+  'foo_2493',
+  'foo_2494',
+  'foo_2495',
+  'foo_2496',
+  'foo_2497',
+  'foo_2498',
+  'foo_2499',
+  'foo_2500',
+  'foo_2501',
+  'foo_2502',
+  'foo_2503',
+  'foo_2504',
+  'foo_2505',
+  'foo_2506',
+  'foo_2507',
+  'foo_2508',
+  'foo_2509',
+  'foo_2510',
+  'foo_2511',
+  'foo_2512',
+  'foo_2513',
+  'foo_2514',
+  'foo_2515',
+  'foo_2516',
+  'foo_2517',
+  'foo_2518',
+  'foo_2519',
+  'foo_2520',
+  'foo_2521',
+  'foo_2522',
+  'foo_2523',
+  'foo_2524',
+  'foo_2525',
+  'foo_2526',
+  'foo_2527',
+  'foo_2528',
+  'foo_2529',
+  'foo_2530',
+  'foo_2531',
+  'foo_2532',
+  'foo_2533',
+  'foo_2534',
+  'foo_2535',
+  'foo_2536',
+  'foo_2537',
+  'foo_2538',
+  'foo_2539',
+  'foo_2540',
+  'foo_2541',
+  'foo_2542',
+  'foo_2543',
+  'foo_2544',
+  'foo_2545',
+  'foo_2546',
+  'foo_2547',
+  'foo_2548',
+  'foo_2549',
+  'foo_2550',
+  'foo_2551',
+  'foo_2552',
+  'foo_2553',
+  'foo_2554',
+  'foo_2555',
+  'foo_2556',
+  'foo_2557',
+  'foo_2558',
+  'foo_2559',
+  'foo_2560',
+  'foo_2561',
+  'foo_2562',
+  'foo_2563',
+  'foo_2564',
+  'foo_2565',
+  'foo_2566',
+  'foo_2567',
+  'foo_2568',
+  'foo_2569',
+  'foo_2570',
+  'foo_2571',
+  'foo_2572',
+  'foo_2573',
+  'foo_2574',
+  'foo_2575',
+  'foo_2576',
+  'foo_2577',
+  'foo_2578',
+  'foo_2579',
+  'foo_2580',
+  'foo_2581',
+  'foo_2582',
+  'foo_2583',
+  'foo_2584',
+  'foo_2585',
+  'foo_2586',
+  'foo_2587',
+  'foo_2588',
+  'foo_2589',
+  'foo_2590',
+  'foo_2591',
+  'foo_2592',
+  'foo_2593',
+  'foo_2594',
+  'foo_2595',
+  'foo_2596',
+  'foo_2597',
+  'foo_2598',
+  'foo_2599',
+  'foo_2600',
+  'foo_2601',
+  'foo_2602',
+  'foo_2603',
+  'foo_2604',
+  'foo_2605',
+  'foo_2606',
+  'foo_2607',
+  'foo_2608',
+  'foo_2609',
+  'foo_2610',
+  'foo_2611',
+  'foo_2612',
+  'foo_2613',
+  'foo_2614',
+  'foo_2615',
+  'foo_2616',
+  'foo_2617',
+  'foo_2618',
+  'foo_2619',
+  'foo_2620',
+  'foo_2621',
+  'foo_2622',
+  'foo_2623',
+  'foo_2624',
+  'foo_2625',
+  'foo_2626',
+  'foo_2627',
+  'foo_2628',
+  'foo_2629',
+  'foo_2630',
+  'foo_2631',
+  'foo_2632',
+  'foo_2633',
+  'foo_2634',
+  'foo_2635',
+  'foo_2636',
+  'foo_2637',
+  'foo_2638',
+  'foo_2639',
+  'foo_2640',
+  'foo_2641',
+  'foo_2642',
+  'foo_2643',
+  'foo_2644',
+  'foo_2645',
+  'foo_2646',
+  'foo_2647',
+  'foo_2648',
+  'foo_2649',
+  'foo_2650',
+  'foo_2651',
+  'foo_2652',
+  'foo_2653',
+  'foo_2654',
+  'foo_2655',
+  'foo_2656',
+  'foo_2657',
+  'foo_2658',
+  'foo_2659',
+  'foo_2660',
+  'foo_2661',
+  'foo_2662',
+  'foo_2663',
+  'foo_2664',
+  'foo_2665',
+  'foo_2666',
+  'foo_2667',
+  'foo_2668',
+  'foo_2669',
+  'foo_2670',
+  'foo_2671',
+  'foo_2672',
+  'foo_2673',
+  'foo_2674',
+  'foo_2675',
+  'foo_2676',
+  'foo_2677',
+  'foo_2678',
+  'foo_2679',
+  'foo_2680',
+  'foo_2681',
+  'foo_2682',
+  'foo_2683',
+  'foo_2684',
+  'foo_2685',
+  'foo_2686',
+  'foo_2687',
+  'foo_2688',
+  'foo_2689',
+  'foo_2690',
+  'foo_2691',
+  'foo_2692',
+  'foo_2693',
+  'foo_2694',
+  'foo_2695',
+  'foo_2696',
+  'foo_2697',
+  'foo_2698',
+  'foo_2699',
+  'foo_2700',
+  'foo_2701',
+  'foo_2702',
+  'foo_2703',
+  'foo_2704',
+  'foo_2705',
+  'foo_2706',
+  'foo_2707',
+  'foo_2708',
+  'foo_2709',
+  'foo_2710',
+  'foo_2711',
+  'foo_2712',
+  'foo_2713',
+  'foo_2714',
+  'foo_2715',
+  'foo_2716',
+  'foo_2717',
+  'foo_2718',
+  'foo_2719',
+  'foo_2720',
+  'foo_2721',
+  'foo_2722',
+  'foo_2723',
+  'foo_2724',
+  'foo_2725',
+  'foo_2726',
+  'foo_2727',
+  'foo_2728',
+  'foo_2729',
+  'foo_2730',
+  'foo_2731',
+  'foo_2732',
+  'foo_2733',
+  'foo_2734',
+  'foo_2735',
+  'foo_2736',
+  'foo_2737',
+  'foo_2738',
+  'foo_2739',
+  'foo_2740',
+  'foo_2741',
+  'foo_2742',
+  'foo_2743',
+  'foo_2744',
+  'foo_2745',
+  'foo_2746',
+  'foo_2747',
+  'foo_2748',
+  'foo_2749',
+  'foo_2750',
+  'foo_2751',
+  'foo_2752',
+  'foo_2753',
+  'foo_2754',
+  'foo_2755',
+  'foo_2756',
+  'foo_2757',
+  'foo_2758',
+  'foo_2759',
+  'foo_2760',
+  'foo_2761',
+  'foo_2762',
+  'foo_2763',
+  'foo_2764',
+  'foo_2765',
+  'foo_2766',
+  'foo_2767',
+  'foo_2768',
+  'foo_2769',
+  'foo_2770',
+  'foo_2771',
+  'foo_2772',
+  'foo_2773',
+  'foo_2774',
+  'foo_2775',
+  'foo_2776',
+  'foo_2777',
+  'foo_2778',
+  'foo_2779',
+  'foo_2780',
+  'foo_2781',
+  'foo_2782',
+  'foo_2783',
+  'foo_2784',
+  'foo_2785',
+  'foo_2786',
+  'foo_2787',
+  'foo_2788',
+  'foo_2789',
+  'foo_2790',
+  'foo_2791',
+  'foo_2792',
+  'foo_2793',
+  'foo_2794',
+  'foo_2795',
+  'foo_2796',
+  'foo_2797',
+  'foo_2798',
+  'foo_2799',
+  'foo_2800',
+  'foo_2801',
+  'foo_2802',
+  'foo_2803',
+  'foo_2804',
+  'foo_2805',
+  'foo_2806',
+  'foo_2807',
+  'foo_2808',
+  'foo_2809',
+  'foo_2810',
+  'foo_2811',
+  'foo_2812',
+  'foo_2813',
+  'foo_2814',
+  'foo_2815',
+  'foo_2816',
+  'foo_2817',
+  'foo_2818',
+  'foo_2819',
+  'foo_2820',
+  'foo_2821',
+  'foo_2822',
+  'foo_2823',
+  'foo_2824',
+  'foo_2825',
+  'foo_2826',
+  'foo_2827',
+  'foo_2828',
+  'foo_2829',
+  'foo_2830',
+  'foo_2831',
+  'foo_2832',
+  'foo_2833',
+  'foo_2834',
+  'foo_2835',
+  'foo_2836',
+  'foo_2837',
+  'foo_2838',
+  'foo_2839',
+  'foo_2840',
+  'foo_2841',
+  'foo_2842',
+  'foo_2843',
+  'foo_2844',
+  'foo_2845',
+  'foo_2846',
+  'foo_2847',
+  'foo_2848',
+  'foo_2849',
+  'foo_2850',
+  'foo_2851',
+  'foo_2852',
+  'foo_2853',
+  'foo_2854',
+  'foo_2855',
+  'foo_2856',
+  'foo_2857',
+  'foo_2858',
+  'foo_2859',
+  'foo_2860',
+  'foo_2861',
+  'foo_2862',
+  'foo_2863',
+  'foo_2864',
+  'foo_2865',
+  'foo_2866',
+  'foo_2867',
+  'foo_2868',
+  'foo_2869',
+  'foo_2870',
+  'foo_2871',
+  'foo_2872',
+  'foo_2873',
+  'foo_2874',
+  'foo_2875',
+  'foo_2876',
+  'foo_2877',
+  'foo_2878',
+  'foo_2879',
+  'foo_2880',
+  'foo_2881',
+  'foo_2882',
+  'foo_2883',
+  'foo_2884',
+  'foo_2885',
+  'foo_2886',
+  'foo_2887',
+  'foo_2888',
+  'foo_2889',
+  'foo_2890',
+  'foo_2891',
+  'foo_2892',
+  'foo_2893',
+  'foo_2894',
+  'foo_2895',
+  'foo_2896',
+  'foo_2897',
+  'foo_2898',
+  'foo_2899',
+  'foo_2900',
+  'foo_2901',
+  'foo_2902',
+  'foo_2903',
+  'foo_2904',
+  'foo_2905',
+  'foo_2906',
+  'foo_2907',
+  'foo_2908',
+  'foo_2909',
+  'foo_2910',
+  'foo_2911',
+  'foo_2912',
+  'foo_2913',
+  'foo_2914',
+  'foo_2915',
+  'foo_2916',
+  'foo_2917',
+  'foo_2918',
+  'foo_2919',
+  'foo_2920',
+  'foo_2921',
+  'foo_2922',
+  'foo_2923',
+  'foo_2924',
+  'foo_2925',
+  'foo_2926',
+  'foo_2927',
+  'foo_2928',
+  'foo_2929',
+  'foo_2930',
+  'foo_2931',
+  'foo_2932',
+  'foo_2933',
+  'foo_2934',
+  'foo_2935',
+  'foo_2936',
+  'foo_2937',
+  'foo_2938',
+  'foo_2939',
+  'foo_2940',
+  'foo_2941',
+  'foo_2942',
+  'foo_2943',
+  'foo_2944',
+  'foo_2945',
+  'foo_2946',
+  'foo_2947',
+  'foo_2948',
+  'foo_2949',
+  'foo_2950',
+  'foo_2951',
+  'foo_2952',
+  'foo_2953',
+  'foo_2954',
+  'foo_2955',
+  'foo_2956',
+  'foo_2957',
+  'foo_2958',
+  'foo_2959',
+  'foo_2960',
+  'foo_2961',
+  'foo_2962',
+  'foo_2963',
+  'foo_2964',
+  'foo_2965',
+  'foo_2966',
+  'foo_2967',
+  'foo_2968',
+  'foo_2969',
+  'foo_2970',
+  'foo_2971',
+  'foo_2972',
+  'foo_2973',
+  'foo_2974',
+  'foo_2975',
+  'foo_2976',
+  'foo_2977',
+  'foo_2978',
+  'foo_2979',
+  'foo_2980',
+  'foo_2981',
+  'foo_2982',
+  'foo_2983',
+  'foo_2984',
+  'foo_2985',
+  'foo_2986',
+  'foo_2987',
+  'foo_2988',
+  'foo_2989',
+  'foo_2990',
+  'foo_2991',
+  'foo_2992',
+  'foo_2993',
+  'foo_2994',
+  'foo_2995',
+  'foo_2996',
+  'foo_2997',
+  'foo_2998',
+  'foo_2999',
+  'foo_3000',
+  'foo_3001',
+  'foo_3002',
+  'foo_3003',
+  'foo_3004',
+  'foo_3005',
+  'foo_3006',
+  'foo_3007',
+  'foo_3008',
+  'foo_3009',
+  'foo_3010',
+  'foo_3011',
+  'foo_3012',
+  'foo_3013',
+  'foo_3014',
+  'foo_3015',
+  'foo_3016',
+  'foo_3017',
+  'foo_3018',
+  'foo_3019',
+  'foo_3020',
+  'foo_3021',
+  'foo_3022',
+  'foo_3023',
+  'foo_3024',
+  'foo_3025',
+  'foo_3026',
+  'foo_3027',
+  'foo_3028',
+  'foo_3029',
+  'foo_3030',
+  'foo_3031',
+  'foo_3032',
+  'foo_3033',
+  'foo_3034',
+  'foo_3035',
+  'foo_3036',
+  'foo_3037',
+  'foo_3038',
+  'foo_3039',
+  'foo_3040',
+  'foo_3041',
+  'foo_3042',
+  'foo_3043',
+  'foo_3044',
+  'foo_3045',
+  'foo_3046',
+  'foo_3047',
+  'foo_3048',
+  'foo_3049',
+  'foo_3050',
+  'foo_3051',
+  'foo_3052',
+  'foo_3053',
+  'foo_3054',
+  'foo_3055',
+  'foo_3056',
+  'foo_3057',
+  'foo_3058',
+  'foo_3059',
+  'foo_3060',
+  'foo_3061',
+  'foo_3062',
+  'foo_3063',
+  'foo_3064',
+  'foo_3065',
+  'foo_3066',
+  'foo_3067',
+  'foo_3068',
+  'foo_3069',
+  'foo_3070',
+  'foo_3071',
+  'foo_3072',
+  'foo_3073',
+  'foo_3074',
+  'foo_3075',
+  'foo_3076',
+  'foo_3077',
+  'foo_3078',
+  'foo_3079',
+  'foo_3080',
+  'foo_3081',
+  'foo_3082',
+  'foo_3083',
+  'foo_3084',
+  'foo_3085',
+  'foo_3086',
+  'foo_3087',
+  'foo_3088',
+  'foo_3089',
+  'foo_3090',
+  'foo_3091',
+  'foo_3092',
+  'foo_3093',
+  'foo_3094',
+  'foo_3095',
+  'foo_3096',
+  'foo_3097',
+  'foo_3098',
+  'foo_3099',
+  'foo_3100',
+  'foo_3101',
+  'foo_3102',
+  'foo_3103',
+  'foo_3104',
+  'foo_3105',
+  'foo_3106',
+  'foo_3107',
+  'foo_3108',
+  'foo_3109',
+  'foo_3110',
+  'foo_3111',
+  'foo_3112',
+  'foo_3113',
+  'foo_3114',
+  'foo_3115',
+  'foo_3116',
+  'foo_3117',
+  'foo_3118',
+  'foo_3119',
+  'foo_3120',
+  'foo_3121',
+  'foo_3122',
+  'foo_3123',
+  'foo_3124',
+  'foo_3125',
+  'foo_3126',
+  'foo_3127',
+  'foo_3128',
+  'foo_3129',
+  'foo_3130',
+  'foo_3131',
+  'foo_3132',
+  'foo_3133',
+  'foo_3134',
+  'foo_3135',
+  'foo_3136',
+  'foo_3137',
+  'foo_3138',
+  'foo_3139',
+  'foo_3140',
+  'foo_3141',
+  'foo_3142',
+  'foo_3143',
+  'foo_3144',
+  'foo_3145',
+  'foo_3146',
+  'foo_3147',
+  'foo_3148',
+  'foo_3149',
+  'foo_3150',
+  'foo_3151',
+  'foo_3152',
+  'foo_3153',
+  'foo_3154',
+  'foo_3155',
+  'foo_3156',
+  'foo_3157',
+  'foo_3158',
+  'foo_3159',
+  'foo_3160',
+  'foo_3161',
+  'foo_3162',
+  'foo_3163',
+  'foo_3164',
+  'foo_3165',
+  'foo_3166',
+  'foo_3167',
+  'foo_3168',
+  'foo_3169',
+  'foo_3170',
+  'foo_3171',
+  'foo_3172',
+  'foo_3173',
+  'foo_3174',
+  'foo_3175',
+  'foo_3176',
+  'foo_3177',
+  'foo_3178',
+  'foo_3179',
+  'foo_3180',
+  'foo_3181',
+  'foo_3182',
+  'foo_3183',
+  'foo_3184',
+  'foo_3185',
+  'foo_3186',
+  'foo_3187',
+  'foo_3188',
+  'foo_3189',
+  'foo_3190',
+  'foo_3191',
+  'foo_3192',
+  'foo_3193',
+  'foo_3194',
+  'foo_3195',
+  'foo_3196',
+  'foo_3197',
+  'foo_3198',
+  'foo_3199',
+  'foo_3200',
+  'foo_3201',
+  'foo_3202',
+  'foo_3203',
+  'foo_3204',
+  'foo_3205',
+  'foo_3206',
+  'foo_3207',
+  'foo_3208',
+  'foo_3209',
+  'foo_3210',
+  'foo_3211',
+  'foo_3212',
+  'foo_3213',
+  'foo_3214',
+  'foo_3215',
+  'foo_3216',
+  'foo_3217',
+  'foo_3218',
+  'foo_3219',
+  'foo_3220',
+  'foo_3221',
+  'foo_3222',
+  'foo_3223',
+  'foo_3224',
+  'foo_3225',
+  'foo_3226',
+  'foo_3227',
+  'foo_3228',
+  'foo_3229',
+  'foo_3230',
+  'foo_3231',
+  'foo_3232',
+  'foo_3233',
+  'foo_3234',
+  'foo_3235',
+  'foo_3236',
+  'foo_3237',
+  'foo_3238',
+  'foo_3239',
+  'foo_3240',
+  'foo_3241',
+  'foo_3242',
+  'foo_3243',
+  'foo_3244',
+  'foo_3245',
+  'foo_3246',
+  'foo_3247',
+  'foo_3248',
+  'foo_3249',
+  'foo_3250',
+  'foo_3251',
+  'foo_3252',
+  'foo_3253',
+  'foo_3254',
+  'foo_3255',
+  'foo_3256',
+  'foo_3257',
+  'foo_3258',
+  'foo_3259',
+  'foo_3260',
+  'foo_3261',
+  'foo_3262',
+  'foo_3263',
+  'foo_3264',
+  'foo_3265',
+  'foo_3266',
+  'foo_3267',
+  'foo_3268',
+  'foo_3269',
+  'foo_3270',
+  'foo_3271',
+  'foo_3272',
+  'foo_3273',
+  'foo_3274',
+  'foo_3275',
+  'foo_3276',
+  'foo_3277',
+  'foo_3278',
+  'foo_3279',
+  'foo_3280',
+  'foo_3281',
+  'foo_3282',
+  'foo_3283',
+  'foo_3284',
+  'foo_3285',
+  'foo_3286',
+  'foo_3287',
+  'foo_3288',
+  'foo_3289',
+  'foo_3290',
+  'foo_3291',
+  'foo_3292',
+  'foo_3293',
+  'foo_3294',
+  'foo_3295',
+  'foo_3296',
+  'foo_3297',
+  'foo_3298',
+  'foo_3299',
+  'foo_3300',
+  'foo_3301',
+  'foo_3302',
+  'foo_3303',
+  'foo_3304',
+  'foo_3305',
+  'foo_3306',
+  'foo_3307',
+  'foo_3308',
+  'foo_3309',
+  'foo_3310',
+  'foo_3311',
+  'foo_3312',
+  'foo_3313',
+  'foo_3314',
+  'foo_3315',
+  'foo_3316',
+  'foo_3317',
+  'foo_3318',
+  'foo_3319',
+  'foo_3320',
+  'foo_3321',
+  'foo_3322',
+  'foo_3323',
+  'foo_3324',
+  'foo_3325',
+  'foo_3326',
+  'foo_3327',
+  'foo_3328',
+  'foo_3329',
+  'foo_3330',
+  'foo_3331',
+  'foo_3332',
+  'foo_3333',
+  'foo_3334',
+  'foo_3335',
+  'foo_3336',
+  'foo_3337',
+  'foo_3338',
+  'foo_3339',
+  'foo_3340',
+  'foo_3341',
+  'foo_3342',
+  'foo_3343',
+  'foo_3344',
+  'foo_3345',
+  'foo_3346',
+  'foo_3347',
+  'foo_3348',
+  'foo_3349',
+  'foo_3350',
+  'foo_3351',
+  'foo_3352',
+  'foo_3353',
+  'foo_3354',
+  'foo_3355',
+  'foo_3356',
+  'foo_3357',
+  'foo_3358',
+  'foo_3359',
+  'foo_3360',
+  'foo_3361',
+  'foo_3362',
+  'foo_3363',
+  'foo_3364',
+  'foo_3365',
+  'foo_3366',
+  'foo_3367',
+  'foo_3368',
+  'foo_3369',
+  'foo_3370',
+  'foo_3371',
+  'foo_3372',
+  'foo_3373',
+  'foo_3374',
+  'foo_3375',
+  'foo_3376',
+  'foo_3377',
+  'foo_3378',
+  'foo_3379',
+  'foo_3380',
+  'foo_3381',
+  'foo_3382',
+  'foo_3383',
+  'foo_3384',
+  'foo_3385',
+  'foo_3386',
+  'foo_3387',
+  'foo_3388',
+  'foo_3389',
+  'foo_3390',
+  'foo_3391',
+  'foo_3392',
+  'foo_3393',
+  'foo_3394',
+  'foo_3395',
+  'foo_3396',
+  'foo_3397',
+  'foo_3398',
+  'foo_3399',
+  'foo_3400',
+  'foo_3401',
+  'foo_3402',
+  'foo_3403',
+  'foo_3404',
+  'foo_3405',
+  'foo_3406',
+  'foo_3407',
+  'foo_3408',
+  'foo_3409',
+  'foo_3410',
+  'foo_3411',
+  'foo_3412',
+  'foo_3413',
+  'foo_3414',
+  'foo_3415',
+  'foo_3416',
+  'foo_3417',
+  'foo_3418',
+  'foo_3419',
+  'foo_3420',
+  'foo_3421',
+  'foo_3422',
+  'foo_3423',
+  'foo_3424',
+  'foo_3425',
+  'foo_3426',
+  'foo_3427',
+  'foo_3428',
+  'foo_3429',
+  'foo_3430',
+  'foo_3431',
+  'foo_3432',
+  'foo_3433',
+  'foo_3434',
+  'foo_3435',
+  'foo_3436',
+  'foo_3437',
+  'foo_3438',
+  'foo_3439',
+  'foo_3440',
+  'foo_3441',
+  'foo_3442',
+  'foo_3443',
+  'foo_3444',
+  'foo_3445',
+  'foo_3446',
+  'foo_3447',
+  'foo_3448',
+  'foo_3449',
+  'foo_3450',
+  'foo_3451',
+  'foo_3452',
+  'foo_3453',
+  'foo_3454',
+  'foo_3455',
+  'foo_3456',
+  'foo_3457',
+  'foo_3458',
+  'foo_3459',
+  'foo_3460',
+  'foo_3461',
+  'foo_3462',
+  'foo_3463',
+  'foo_3464',
+  'foo_3465',
+  'foo_3466',
+  'foo_3467',
+  'foo_3468',
+  'foo_3469',
+  'foo_3470',
+  'foo_3471',
+  'foo_3472',
+  'foo_3473',
+  'foo_3474',
+  'foo_3475',
+  'foo_3476',
+  'foo_3477',
+  'foo_3478',
+  'foo_3479',
+  'foo_3480',
+  'foo_3481',
+  'foo_3482',
+  'foo_3483',
+  'foo_3484',
+  'foo_3485',
+  'foo_3486',
+  'foo_3487',
+  'foo_3488',
+  'foo_3489',
+  'foo_3490',
+  'foo_3491',
+  'foo_3492',
+  'foo_3493',
+  'foo_3494',
+  'foo_3495',
+  'foo_3496',
+  'foo_3497',
+  'foo_3498',
+  'foo_3499',
+  'foo_3500',
+  'foo_3501',
+  'foo_3502',
+  'foo_3503',
+  'foo_3504',
+  'foo_3505',
+  'foo_3506',
+  'foo_3507',
+  'foo_3508',
+  'foo_3509',
+  'foo_3510',
+  'foo_3511',
+  'foo_3512',
+  'foo_3513',
+  'foo_3514',
+  'foo_3515',
+  'foo_3516',
+  'foo_3517',
+  'foo_3518',
+  'foo_3519',
+  'foo_3520',
+  'foo_3521',
+  'foo_3522',
+  'foo_3523',
+  'foo_3524',
+  'foo_3525',
+  'foo_3526',
+  'foo_3527',
+  'foo_3528',
+  'foo_3529',
+  'foo_3530',
+  'foo_3531',
+  'foo_3532',
+  'foo_3533',
+  'foo_3534',
+  'foo_3535',
+  'foo_3536',
+  'foo_3537',
+  'foo_3538',
+  'foo_3539',
+  'foo_3540',
+  'foo_3541',
+  'foo_3542',
+  'foo_3543',
+  'foo_3544',
+  'foo_3545',
+  'foo_3546',
+  'foo_3547',
+  'foo_3548',
+  'foo_3549',
+  'foo_3550',
+  'foo_3551',
+  'foo_3552',
+  'foo_3553',
+  'foo_3554',
+  'foo_3555',
+  'foo_3556',
+  'foo_3557',
+  'foo_3558',
+  'foo_3559',
+  'foo_3560',
+  'foo_3561',
+  'foo_3562',
+  'foo_3563',
+  'foo_3564',
+  'foo_3565',
+  'foo_3566',
+  'foo_3567',
+  'foo_3568',
+  'foo_3569',
+  'foo_3570',
+  'foo_3571',
+  'foo_3572',
+  'foo_3573',
+  'foo_3574',
+  'foo_3575',
+  'foo_3576',
+  'foo_3577',
+  'foo_3578',
+  'foo_3579',
+  'foo_3580',
+  'foo_3581',
+  'foo_3582',
+  'foo_3583',
+  'foo_3584',
+  'foo_3585',
+  'foo_3586',
+  'foo_3587',
+  'foo_3588',
+  'foo_3589',
+  'foo_3590',
+  'foo_3591',
+  'foo_3592',
+  'foo_3593',
+  'foo_3594',
+  'foo_3595',
+  'foo_3596',
+  'foo_3597',
+  'foo_3598',
+  'foo_3599',
+  'foo_3600',
+  'foo_3601',
+  'foo_3602',
+  'foo_3603',
+  'foo_3604',
+  'foo_3605',
+  'foo_3606',
+  'foo_3607',
+  'foo_3608',
+  'foo_3609',
+  'foo_3610',
+  'foo_3611',
+  'foo_3612',
+  'foo_3613',
+  'foo_3614',
+  'foo_3615',
+  'foo_3616',
+  'foo_3617',
+  'foo_3618',
+  'foo_3619',
+  'foo_3620',
+  'foo_3621',
+  'foo_3622',
+  'foo_3623',
+  'foo_3624',
+  'foo_3625',
+  'foo_3626',
+  'foo_3627',
+  'foo_3628',
+  'foo_3629',
+  'foo_3630',
+  'foo_3631',
+  'foo_3632',
+  'foo_3633',
+  'foo_3634',
+  'foo_3635',
+  'foo_3636',
+  'foo_3637',
+  'foo_3638',
+  'foo_3639',
+  'foo_3640',
+  'foo_3641',
+  'foo_3642',
+  'foo_3643',
+  'foo_3644',
+  'foo_3645',
+  'foo_3646',
+  'foo_3647',
+  'foo_3648',
+  'foo_3649',
+  'foo_3650',
+  'foo_3651',
+  'foo_3652',
+  'foo_3653',
+  'foo_3654',
+  'foo_3655',
+  'foo_3656',
+  'foo_3657',
+  'foo_3658',
+  'foo_3659',
+  'foo_3660',
+  'foo_3661',
+  'foo_3662',
+  'foo_3663',
+  'foo_3664',
+  'foo_3665',
+  'foo_3666',
+  'foo_3667',
+  'foo_3668',
+  'foo_3669',
+  'foo_3670',
+  'foo_3671',
+  'foo_3672',
+  'foo_3673',
+  'foo_3674',
+  'foo_3675',
+  'foo_3676',
+  'foo_3677',
+  'foo_3678',
+  'foo_3679',
+  'foo_3680',
+  'foo_3681',
+  'foo_3682',
+  'foo_3683',
+  'foo_3684',
+  'foo_3685',
+  'foo_3686',
+  'foo_3687',
+  'foo_3688',
+  'foo_3689',
+  'foo_3690',
+  'foo_3691',
+  'foo_3692',
+  'foo_3693',
+  'foo_3694',
+  'foo_3695',
+  'foo_3696',
+  'foo_3697',
+  'foo_3698',
+  'foo_3699',
+  'foo_3700',
+  'foo_3701',
+  'foo_3702',
+  'foo_3703',
+  'foo_3704',
+  'foo_3705',
+  'foo_3706',
+  'foo_3707',
+  'foo_3708',
+  'foo_3709',
+  'foo_3710',
+  'foo_3711',
+  'foo_3712',
+  'foo_3713',
+  'foo_3714',
+  'foo_3715',
+  'foo_3716',
+  'foo_3717',
+  'foo_3718',
+  'foo_3719',
+  'foo_3720',
+  'foo_3721',
+  'foo_3722',
+  'foo_3723',
+  'foo_3724',
+  'foo_3725',
+  'foo_3726',
+  'foo_3727',
+  'foo_3728',
+  'foo_3729',
+  'foo_3730',
+  'foo_3731',
+  'foo_3732',
+  'foo_3733',
+  'foo_3734',
+  'foo_3735',
+  'foo_3736',
+  'foo_3737',
+  'foo_3738',
+  'foo_3739',
+  'foo_3740',
+  'foo_3741',
+  'foo_3742',
+  'foo_3743',
+  'foo_3744',
+  'foo_3745',
+  'foo_3746',
+  'foo_3747',
+  'foo_3748',
+  'foo_3749',
+  'foo_3750',
+  'foo_3751',
+  'foo_3752',
+  'foo_3753',
+  'foo_3754',
+  'foo_3755',
+  'foo_3756',
+  'foo_3757',
+  'foo_3758',
+  'foo_3759',
+  'foo_3760',
+  'foo_3761',
+  'foo_3762',
+  'foo_3763',
+  'foo_3764',
+  'foo_3765',
+  'foo_3766',
+  'foo_3767',
+  'foo_3768',
+  'foo_3769',
+  'foo_3770',
+  'foo_3771',
+  'foo_3772',
+  'foo_3773',
+  'foo_3774',
+  'foo_3775',
+  'foo_3776',
+  'foo_3777',
+  'foo_3778',
+  'foo_3779',
+  'foo_3780',
+  'foo_3781',
+  'foo_3782',
+  'foo_3783',
+  'foo_3784',
+  'foo_3785',
+  'foo_3786',
+  'foo_3787',
+  'foo_3788',
+  'foo_3789',
+  'foo_3790',
+  'foo_3791',
+  'foo_3792',
+  'foo_3793',
+  'foo_3794',
+  'foo_3795',
+  'foo_3796',
+  'foo_3797',
+  'foo_3798',
+  'foo_3799',
+  'foo_3800',
+  'foo_3801',
+  'foo_3802',
+  'foo_3803',
+  'foo_3804',
+  'foo_3805',
+  'foo_3806',
+  'foo_3807',
+  'foo_3808',
+  'foo_3809',
+  'foo_3810',
+  'foo_3811',
+  'foo_3812',
+  'foo_3813',
+  'foo_3814',
+  'foo_3815',
+  'foo_3816',
+  'foo_3817',
+  'foo_3818',
+  'foo_3819',
+  'foo_3820',
+  'foo_3821',
+  'foo_3822',
+  'foo_3823',
+  'foo_3824',
+  'foo_3825',
+  'foo_3826',
+  'foo_3827',
+  'foo_3828',
+  'foo_3829',
+  'foo_3830',
+  'foo_3831',
+  'foo_3832',
+  'foo_3833',
+  'foo_3834',
+  'foo_3835',
+  'foo_3836',
+  'foo_3837',
+  'foo_3838',
+  'foo_3839',
+  'foo_3840',
+  'foo_3841',
+  'foo_3842',
+  'foo_3843',
+  'foo_3844',
+  'foo_3845',
+  'foo_3846',
+  'foo_3847',
+  'foo_3848',
+  'foo_3849',
+  'foo_3850',
+  'foo_3851',
+  'foo_3852',
+  'foo_3853',
+  'foo_3854',
+  'foo_3855',
+  'foo_3856',
+  'foo_3857',
+  'foo_3858',
+  'foo_3859',
+  'foo_3860',
+  'foo_3861',
+  'foo_3862',
+  'foo_3863',
+  'foo_3864',
+  'foo_3865',
+  'foo_3866',
+  'foo_3867',
+  'foo_3868',
+  'foo_3869',
+  'foo_3870',
+  'foo_3871',
+  'foo_3872',
+  'foo_3873',
+  'foo_3874',
+  'foo_3875',
+  'foo_3876',
+  'foo_3877',
+  'foo_3878',
+  'foo_3879',
+  'foo_3880',
+  'foo_3881',
+  'foo_3882',
+  'foo_3883',
+  'foo_3884',
+  'foo_3885',
+  'foo_3886',
+  'foo_3887',
+  'foo_3888',
+  'foo_3889',
+  'foo_3890',
+  'foo_3891',
+  'foo_3892',
+  'foo_3893',
+  'foo_3894',
+  'foo_3895',
+  'foo_3896',
+  'foo_3897',
+  'foo_3898',
+  'foo_3899',
+  'foo_3900',
+  'foo_3901',
+  'foo_3902',
+  'foo_3903',
+  'foo_3904',
+  'foo_3905',
+  'foo_3906',
+  'foo_3907',
+  'foo_3908',
+  'foo_3909',
+  'foo_3910',
+  'foo_3911',
+  'foo_3912',
+  'foo_3913',
+  'foo_3914',
+  'foo_3915',
+  'foo_3916',
+  'foo_3917',
+  'foo_3918',
+  'foo_3919',
+  'foo_3920',
+  'foo_3921',
+  'foo_3922',
+  'foo_3923',
+  'foo_3924',
+  'foo_3925',
+  'foo_3926',
+  'foo_3927',
+  'foo_3928',
+  'foo_3929',
+  'foo_3930',
+  'foo_3931',
+  'foo_3932',
+  'foo_3933',
+  'foo_3934',
+  'foo_3935',
+  'foo_3936',
+  'foo_3937',
+  'foo_3938',
+  'foo_3939',
+  'foo_3940',
+  'foo_3941',
+  'foo_3942',
+  'foo_3943',
+  'foo_3944',
+  'foo_3945',
+  'foo_3946',
+  'foo_3947',
+  'foo_3948',
+  'foo_3949',
+  'foo_3950',
+  'foo_3951',
+  'foo_3952',
+  'foo_3953',
+  'foo_3954',
+  'foo_3955',
+  'foo_3956',
+  'foo_3957',
+  'foo_3958',
+  'foo_3959',
+  'foo_3960',
+  'foo_3961',
+  'foo_3962',
+  'foo_3963',
+  'foo_3964',
+  'foo_3965',
+  'foo_3966',
+  'foo_3967',
+  'foo_3968',
+  'foo_3969',
+  'foo_3970',
+  'foo_3971',
+  'foo_3972',
+  'foo_3973',
+  'foo_3974',
+  'foo_3975',
+  'foo_3976',
+  'foo_3977',
+  'foo_3978',
+  'foo_3979',
+  'foo_3980',
+  'foo_3981',
+  'foo_3982',
+  'foo_3983',
+  'foo_3984',
+  'foo_3985',
+  'foo_3986',
+  'foo_3987',
+  'foo_3988',
+  'foo_3989',
+  'foo_3990',
+  'foo_3991',
+  'foo_3992',
+  'foo_3993',
+  'foo_3994',
+  'foo_3995',
+  'foo_3996',
+  'foo_3997',
+  'foo_3998',
+  'foo_3999',
+  'foo_4000',
+  'foo_4001',
+  'foo_4002',
+  'foo_4003',
+  'foo_4004',
+  'foo_4005',
+  'foo_4006',
+  'foo_4007',
+  'foo_4008',
+  'foo_4009',
+  'foo_4010',
+  'foo_4011',
+  'foo_4012',
+  'foo_4013',
+  'foo_4014',
+  'foo_4015',
+  'foo_4016',
+  'foo_4017',
+  'foo_4018',
+  'foo_4019',
+  'foo_4020',
+  'foo_4021',
+  'foo_4022',
+  'foo_4023',
+  'foo_4024',
+  'foo_4025',
+  'foo_4026',
+  'foo_4027',
+  'foo_4028',
+  'foo_4029',
+  'foo_4030',
+  'foo_4031',
+  'foo_4032',
+  'foo_4033',
+  'foo_4034',
+  'foo_4035',
+  'foo_4036',
+  'foo_4037',
+  'foo_4038',
+  'foo_4039',
+  'foo_4040',
+  'foo_4041',
+  'foo_4042',
+  'foo_4043',
+  'foo_4044',
+  'foo_4045',
+  'foo_4046',
+  'foo_4047',
+  'foo_4048',
+  'foo_4049',
+  'foo_4050',
+  'foo_4051',
+  'foo_4052',
+  'foo_4053',
+  'foo_4054',
+  'foo_4055',
+  'foo_4056',
+  'foo_4057',
+  'foo_4058',
+  'foo_4059',
+  'foo_4060',
+  'foo_4061',
+  'foo_4062',
+  'foo_4063',
+  'foo_4064',
+  'foo_4065',
+  'foo_4066',
+  'foo_4067',
+  'foo_4068',
+  'foo_4069',
+  'foo_4070',
+  'foo_4071',
+  'foo_4072',
+  'foo_4073',
+  'foo_4074',
+  'foo_4075',
+  'foo_4076',
+  'foo_4077',
+  'foo_4078',
+  'foo_4079',
+  'foo_4080',
+  'foo_4081',
+  'foo_4082',
+  'foo_4083',
+  'foo_4084',
+  'foo_4085',
+  'foo_4086',
+  'foo_4087',
+  'foo_4088',
+  'foo_4089',
+  'foo_4090',
+  'foo_4091',
+  'foo_4092',
+  'foo_4093',
+  'foo_4094',
+  'foo_4095',
+  'foo_4096',
+  'foo_4097',
+  'foo_4098',
+  'foo_4099',
+  'foo_4100',
+  'foo_4101',
+  'foo_4102',
+  'foo_4103',
+  'foo_4104',
+  'foo_4105',
+  'foo_4106',
+  'foo_4107',
+  'foo_4108',
+  'foo_4109',
+  'foo_4110',
+  'foo_4111',
+  'foo_4112',
+  'foo_4113',
+  'foo_4114',
+  'foo_4115',
+  'foo_4116',
+  'foo_4117',
+  'foo_4118',
+  'foo_4119',
+  'foo_4120',
+  'foo_4121',
+  'foo_4122',
+  'foo_4123',
+  'foo_4124',
+  'foo_4125',
+  'foo_4126',
+  'foo_4127',
+  'foo_4128',
+  'foo_4129',
+  'foo_4130',
+  'foo_4131',
+  'foo_4132',
+  'foo_4133',
+  'foo_4134',
+  'foo_4135',
+  'foo_4136',
+  'foo_4137',
+  'foo_4138',
+  'foo_4139',
+  'foo_4140',
+  'foo_4141',
+  'foo_4142',
+  'foo_4143',
+  'foo_4144',
+  'foo_4145',
+  'foo_4146',
+  'foo_4147',
+  'foo_4148',
+  'foo_4149',
+  'foo_4150',
+  'foo_4151',
+  'foo_4152',
+  'foo_4153',
+  'foo_4154',
+  'foo_4155',
+  'foo_4156',
+  'foo_4157',
+  'foo_4158',
+  'foo_4159',
+  'foo_4160',
+  'foo_4161',
+  'foo_4162',
+  'foo_4163',
+  'foo_4164',
+  'foo_4165',
+  'foo_4166',
+  'foo_4167',
+  'foo_4168',
+  'foo_4169',
+  'foo_4170',
+  'foo_4171',
+  'foo_4172',
+  'foo_4173',
+  'foo_4174',
+  'foo_4175',
+  'foo_4176',
+  'foo_4177',
+  'foo_4178',
+  'foo_4179',
+  'foo_4180',
+  'foo_4181',
+  'foo_4182',
+  'foo_4183',
+  'foo_4184',
+  'foo_4185',
+  'foo_4186',
+  'foo_4187',
+  'foo_4188',
+  'foo_4189',
+  'foo_4190',
+  'foo_4191',
+  'foo_4192',
+  'foo_4193',
+  'foo_4194',
+  'foo_4195',
+  'foo_4196',
+  'foo_4197',
+  'foo_4198',
+  'foo_4199',
+  'foo_4200',
+  'foo_4201',
+  'foo_4202',
+  'foo_4203',
+  'foo_4204',
+  'foo_4205',
+  'foo_4206',
+  'foo_4207',
+  'foo_4208',
+  'foo_4209',
+  'foo_4210',
+  'foo_4211',
+  'foo_4212',
+  'foo_4213',
+  'foo_4214',
+  'foo_4215',
+  'foo_4216',
+  'foo_4217',
+  'foo_4218',
+  'foo_4219',
+  'foo_4220',
+  'foo_4221',
+  'foo_4222',
+  'foo_4223',
+  'foo_4224',
+  'foo_4225',
+  'foo_4226',
+  'foo_4227',
+  'foo_4228',
+  'foo_4229',
+  'foo_4230',
+  'foo_4231',
+  'foo_4232',
+  'foo_4233',
+  'foo_4234',
+  'foo_4235',
+  'foo_4236',
+  'foo_4237',
+  'foo_4238',
+  'foo_4239',
+  'foo_4240',
+  'foo_4241',
+  'foo_4242',
+  'foo_4243',
+  'foo_4244',
+  'foo_4245',
+  'foo_4246',
+  'foo_4247',
+  'foo_4248',
+  'foo_4249',
+  'foo_4250',
+  'foo_4251',
+  'foo_4252',
+  'foo_4253',
+  'foo_4254',
+  'foo_4255',
+  'foo_4256',
+  'foo_4257',
+  'foo_4258',
+  'foo_4259',
+  'foo_4260',
+  'foo_4261',
+  'foo_4262',
+  'foo_4263',
+  'foo_4264',
+  'foo_4265',
+  'foo_4266',
+  'foo_4267',
+  'foo_4268',
+  'foo_4269',
+  'foo_4270',
+  'foo_4271',
+  'foo_4272',
+  'foo_4273',
+  'foo_4274',
+  'foo_4275',
+  'foo_4276',
+  'foo_4277',
+  'foo_4278',
+  'foo_4279',
+  'foo_4280',
+  'foo_4281',
+  'foo_4282',
+  'foo_4283',
+  'foo_4284',
+  'foo_4285',
+  'foo_4286',
+  'foo_4287',
+  'foo_4288',
+  'foo_4289',
+  'foo_4290',
+  'foo_4291',
+  'foo_4292',
+  'foo_4293',
+  'foo_4294',
+  'foo_4295',
+  'foo_4296',
+  'foo_4297',
+  'foo_4298',
+  'foo_4299',
+  'foo_4300',
+  'foo_4301',
+  'foo_4302',
+  'foo_4303',
+  'foo_4304',
+  'foo_4305',
+  'foo_4306',
+  'foo_4307',
+  'foo_4308',
+  'foo_4309',
+  'foo_4310',
+  'foo_4311',
+  'foo_4312',
+  'foo_4313',
+  'foo_4314',
+  'foo_4315',
+  'foo_4316',
+  'foo_4317',
+  'foo_4318',
+  'foo_4319',
+  'foo_4320',
+  'foo_4321',
+  'foo_4322',
+  'foo_4323',
+  'foo_4324',
+  'foo_4325',
+  'foo_4326',
+  'foo_4327',
+  'foo_4328',
+  'foo_4329',
+  'foo_4330',
+  'foo_4331',
+  'foo_4332',
+  'foo_4333',
+  'foo_4334',
+  'foo_4335',
+  'foo_4336',
+  'foo_4337',
+  'foo_4338',
+  'foo_4339',
+  'foo_4340',
+  'foo_4341',
+  'foo_4342',
+  'foo_4343',
+  'foo_4344',
+  'foo_4345',
+  'foo_4346',
+  'foo_4347',
+  'foo_4348',
+  'foo_4349',
+  'foo_4350',
+  'foo_4351',
+  'foo_4352',
+  'foo_4353',
+  'foo_4354',
+  'foo_4355',
+  'foo_4356',
+  'foo_4357',
+  'foo_4358',
+  'foo_4359',
+  'foo_4360',
+  'foo_4361',
+  'foo_4362',
+  'foo_4363',
+  'foo_4364',
+  'foo_4365',
+  'foo_4366',
+  'foo_4367',
+  'foo_4368',
+  'foo_4369',
+  'foo_4370',
+  'foo_4371',
+  'foo_4372',
+  'foo_4373',
+  'foo_4374',
+  'foo_4375',
+  'foo_4376',
+  'foo_4377',
+  'foo_4378',
+  'foo_4379',
+  'foo_4380',
+  'foo_4381',
+  'foo_4382',
+  'foo_4383',
+  'foo_4384',
+  'foo_4385',
+  'foo_4386',
+  'foo_4387',
+  'foo_4388',
+  'foo_4389',
+  'foo_4390',
+  'foo_4391',
+  'foo_4392',
+  'foo_4393',
+  'foo_4394',
+  'foo_4395',
+  'foo_4396',
+  'foo_4397',
+  'foo_4398',
+  'foo_4399',
+  'foo_4400',
+  'foo_4401',
+  'foo_4402',
+  'foo_4403',
+  'foo_4404',
+  'foo_4405',
+  'foo_4406',
+  'foo_4407',
+  'foo_4408',
+  'foo_4409',
+  'foo_4410',
+  'foo_4411',
+  'foo_4412',
+  'foo_4413',
+  'foo_4414',
+  'foo_4415',
+  'foo_4416',
+  'foo_4417',
+  'foo_4418',
+  'foo_4419',
+  'foo_4420',
+  'foo_4421',
+  'foo_4422',
+  'foo_4423',
+  'foo_4424',
+  'foo_4425',
+  'foo_4426',
+  'foo_4427',
+  'foo_4428',
+  'foo_4429',
+  'foo_4430',
+  'foo_4431',
+  'foo_4432',
+  'foo_4433',
+  'foo_4434',
+  'foo_4435',
+  'foo_4436',
+  'foo_4437',
+  'foo_4438',
+  'foo_4439',
+  'foo_4440',
+  'foo_4441',
+  'foo_4442',
+  'foo_4443',
+  'foo_4444',
+  'foo_4445',
+  'foo_4446',
+  'foo_4447',
+  'foo_4448',
+  'foo_4449',
+  'foo_4450',
+  'foo_4451',
+  'foo_4452',
+  'foo_4453',
+  'foo_4454',
+  'foo_4455',
+  'foo_4456',
+  'foo_4457',
+  'foo_4458',
+  'foo_4459',
+  'foo_4460',
+  'foo_4461',
+  'foo_4462',
+  'foo_4463',
+  'foo_4464',
+  'foo_4465',
+  'foo_4466',
+  'foo_4467',
+  'foo_4468',
+  'foo_4469',
+  'foo_4470',
+  'foo_4471',
+  'foo_4472',
+  'foo_4473',
+  'foo_4474',
+  'foo_4475',
+  'foo_4476',
+  'foo_4477',
+  'foo_4478',
+  'foo_4479',
+  'foo_4480',
+  'foo_4481',
+  'foo_4482',
+  'foo_4483',
+  'foo_4484',
+  'foo_4485',
+  'foo_4486',
+  'foo_4487',
+  'foo_4488',
+  'foo_4489',
+  'foo_4490',
+  'foo_4491',
+  'foo_4492',
+  'foo_4493',
+  'foo_4494',
+  'foo_4495',
+  'foo_4496',
+  'foo_4497',
+  'foo_4498',
+  'foo_4499',
+  'foo_4500',
+  'foo_4501',
+  'foo_4502',
+  'foo_4503',
+  'foo_4504',
+  'foo_4505',
+  'foo_4506',
+  'foo_4507',
+  'foo_4508',
+  'foo_4509',
+  'foo_4510',
+  'foo_4511',
+  'foo_4512',
+  'foo_4513',
+  'foo_4514',
+  'foo_4515',
+  'foo_4516',
+  'foo_4517',
+  'foo_4518',
+  'foo_4519',
+  'foo_4520',
+  'foo_4521',
+  'foo_4522',
+  'foo_4523',
+  'foo_4524',
+  'foo_4525',
+  'foo_4526',
+  'foo_4527',
+  'foo_4528',
+  'foo_4529',
+  'foo_4530',
+  'foo_4531',
+  'foo_4532',
+  'foo_4533',
+  'foo_4534',
+  'foo_4535',
+  'foo_4536',
+  'foo_4537',
+  'foo_4538',
+  'foo_4539',
+  'foo_4540',
+  'foo_4541',
+  'foo_4542',
+  'foo_4543',
+  'foo_4544',
+  'foo_4545',
+  'foo_4546',
+  'foo_4547',
+  'foo_4548',
+  'foo_4549',
+  'foo_4550',
+  'foo_4551',
+  'foo_4552',
+  'foo_4553',
+  'foo_4554',
+  'foo_4555',
+  'foo_4556',
+  'foo_4557',
+  'foo_4558',
+  'foo_4559',
+  'foo_4560',
+  'foo_4561',
+  'foo_4562',
+  'foo_4563',
+  'foo_4564',
+  'foo_4565',
+  'foo_4566',
+  'foo_4567',
+  'foo_4568',
+  'foo_4569',
+  'foo_4570',
+  'foo_4571',
+  'foo_4572',
+  'foo_4573',
+  'foo_4574',
+  'foo_4575',
+  'foo_4576',
+  'foo_4577',
+  'foo_4578',
+  'foo_4579',
+  'foo_4580',
+  'foo_4581',
+  'foo_4582',
+  'foo_4583',
+  'foo_4584',
+  'foo_4585',
+  'foo_4586',
+  'foo_4587',
+  'foo_4588',
+  'foo_4589',
+  'foo_4590',
+  'foo_4591',
+  'foo_4592',
+  'foo_4593',
+  'foo_4594',
+  'foo_4595',
+  'foo_4596',
+  'foo_4597',
+  'foo_4598',
+  'foo_4599',
+  'foo_4600',
+  'foo_4601',
+  'foo_4602',
+  'foo_4603',
+  'foo_4604',
+  'foo_4605',
+  'foo_4606',
+  'foo_4607',
+  'foo_4608',
+  'foo_4609',
+  'foo_4610',
+  'foo_4611',
+  'foo_4612',
+  'foo_4613',
+  'foo_4614',
+  'foo_4615',
+  'foo_4616',
+  'foo_4617',
+  'foo_4618',
+  'foo_4619',
+  'foo_4620',
+  'foo_4621',
+  'foo_4622',
+  'foo_4623',
+  'foo_4624',
+  'foo_4625',
+  'foo_4626',
+  'foo_4627',
+  'foo_4628',
+  'foo_4629',
+  'foo_4630',
+  'foo_4631',
+  'foo_4632',
+  'foo_4633',
+  'foo_4634',
+  'foo_4635',
+  'foo_4636',
+  'foo_4637',
+  'foo_4638',
+  'foo_4639',
+  'foo_4640',
+  'foo_4641',
+  'foo_4642',
+  'foo_4643',
+  'foo_4644',
+  'foo_4645',
+  'foo_4646',
+  'foo_4647',
+  'foo_4648',
+  'foo_4649',
+  'foo_4650',
+  'foo_4651',
+  'foo_4652',
+  'foo_4653',
+  'foo_4654',
+  'foo_4655',
+  'foo_4656',
+  'foo_4657',
+  'foo_4658',
+  'foo_4659',
+  'foo_4660',
+  'foo_4661',
+  'foo_4662',
+  'foo_4663',
+  'foo_4664',
+  'foo_4665',
+  'foo_4666',
+  'foo_4667',
+  'foo_4668',
+  'foo_4669',
+  'foo_4670',
+  'foo_4671',
+  'foo_4672',
+  'foo_4673',
+  'foo_4674',
+  'foo_4675',
+  'foo_4676',
+  'foo_4677',
+  'foo_4678',
+  'foo_4679',
+  'foo_4680',
+  'foo_4681',
+  'foo_4682',
+  'foo_4683',
+  'foo_4684',
+  'foo_4685',
+  'foo_4686',
+  'foo_4687',
+  'foo_4688',
+  'foo_4689',
+  'foo_4690',
+  'foo_4691',
+  'foo_4692',
+  'foo_4693',
+  'foo_4694',
+  'foo_4695',
+  'foo_4696',
+  'foo_4697',
+  'foo_4698',
+  'foo_4699',
+  'foo_4700',
+  'foo_4701',
+  'foo_4702',
+  'foo_4703',
+  'foo_4704',
+  'foo_4705',
+  'foo_4706',
+  'foo_4707',
+  'foo_4708',
+  'foo_4709',
+  'foo_4710',
+  'foo_4711',
+  'foo_4712',
+  'foo_4713',
+  'foo_4714',
+  'foo_4715',
+  'foo_4716',
+  'foo_4717',
+  'foo_4718',
+  'foo_4719',
+  'foo_4720',
+  'foo_4721',
+  'foo_4722',
+  'foo_4723',
+  'foo_4724',
+  'foo_4725',
+  'foo_4726',
+  'foo_4727',
+  'foo_4728',
+  'foo_4729',
+  'foo_4730',
+  'foo_4731',
+  'foo_4732',
+  'foo_4733',
+  'foo_4734',
+  'foo_4735',
+  'foo_4736',
+  'foo_4737',
+  'foo_4738',
+  'foo_4739',
+  'foo_4740',
+  'foo_4741',
+  'foo_4742',
+  'foo_4743',
+  'foo_4744',
+  'foo_4745',
+  'foo_4746',
+  'foo_4747',
+  'foo_4748',
+  'foo_4749',
+  'foo_4750',
+  'foo_4751',
+  'foo_4752',
+  'foo_4753',
+  'foo_4754',
+  'foo_4755',
+  'foo_4756',
+  'foo_4757',
+  'foo_4758',
+  'foo_4759',
+  'foo_4760',
+  'foo_4761',
+  'foo_4762',
+  'foo_4763',
+  'foo_4764',
+  'foo_4765',
+  'foo_4766',
+  'foo_4767',
+  'foo_4768',
+  'foo_4769',
+  'foo_4770',
+  'foo_4771',
+  'foo_4772',
+  'foo_4773',
+  'foo_4774',
+  'foo_4775',
+  'foo_4776',
+  'foo_4777',
+  'foo_4778',
+  'foo_4779',
+  'foo_4780',
+  'foo_4781',
+  'foo_4782',
+  'foo_4783',
+  'foo_4784',
+  'foo_4785',
+  'foo_4786',
+  'foo_4787',
+  'foo_4788',
+  'foo_4789',
+  'foo_4790',
+  'foo_4791',
+  'foo_4792',
+  'foo_4793',
+  'foo_4794',
+  'foo_4795',
+  'foo_4796',
+  'foo_4797',
+  'foo_4798',
+  'foo_4799',
+  'foo_4800',
+  'foo_4801',
+  'foo_4802',
+  'foo_4803',
+  'foo_4804',
+  'foo_4805',
+  'foo_4806',
+  'foo_4807',
+  'foo_4808',
+  'foo_4809',
+  'foo_4810',
+  'foo_4811',
+  'foo_4812',
+  'foo_4813',
+  'foo_4814',
+  'foo_4815',
+  'foo_4816',
+  'foo_4817',
+  'foo_4818',
+  'foo_4819',
+  'foo_4820',
+  'foo_4821',
+  'foo_4822',
+  'foo_4823',
+  'foo_4824',
+  'foo_4825',
+  'foo_4826',
+  'foo_4827',
+  'foo_4828',
+  'foo_4829',
+  'foo_4830',
+  'foo_4831',
+  'foo_4832',
+  'foo_4833',
+  'foo_4834',
+  'foo_4835',
+  'foo_4836',
+  'foo_4837',
+  'foo_4838',
+  'foo_4839',
+  'foo_4840',
+  'foo_4841',
+  'foo_4842',
+  'foo_4843',
+  'foo_4844',
+  'foo_4845',
+  'foo_4846',
+  'foo_4847',
+  'foo_4848',
+  'foo_4849',
+  'foo_4850',
+  'foo_4851',
+  'foo_4852',
+  'foo_4853',
+  'foo_4854',
+  'foo_4855',
+  'foo_4856',
+  'foo_4857',
+  'foo_4858',
+  'foo_4859',
+  'foo_4860',
+  'foo_4861',
+  'foo_4862',
+  'foo_4863',
+  'foo_4864',
+  'foo_4865',
+  'foo_4866',
+  'foo_4867',
+  'foo_4868',
+  'foo_4869',
+  'foo_4870',
+  'foo_4871',
+  'foo_4872',
+  'foo_4873',
+  'foo_4874',
+  'foo_4875',
+  'foo_4876',
+  'foo_4877',
+  'foo_4878',
+  'foo_4879',
+  'foo_4880',
+  'foo_4881',
+  'foo_4882',
+  'foo_4883',
+  'foo_4884',
+  'foo_4885',
+  'foo_4886',
+  'foo_4887',
+  'foo_4888',
+  'foo_4889',
+  'foo_4890',
+  'foo_4891',
+  'foo_4892',
+  'foo_4893',
+  'foo_4894',
+  'foo_4895',
+  'foo_4896',
+  'foo_4897',
+  'foo_4898',
+  'foo_4899',
+  'foo_4900',
+  'foo_4901',
+  'foo_4902',
+  'foo_4903',
+  'foo_4904',
+  'foo_4905',
+  'foo_4906',
+  'foo_4907',
+  'foo_4908',
+  'foo_4909',
+  'foo_4910',
+  'foo_4911',
+  'foo_4912',
+  'foo_4913',
+  'foo_4914',
+  'foo_4915',
+  'foo_4916',
+  'foo_4917',
+  'foo_4918',
+  'foo_4919',
+  'foo_4920',
+  'foo_4921',
+  'foo_4922',
+  'foo_4923',
+  'foo_4924',
+  'foo_4925',
+  'foo_4926',
+  'foo_4927',
+  'foo_4928',
+  'foo_4929',
+  'foo_4930',
+  'foo_4931',
+  'foo_4932',
+  'foo_4933',
+  'foo_4934',
+  'foo_4935',
+  'foo_4936',
+  'foo_4937',
+  'foo_4938',
+  'foo_4939',
+  'foo_4940',
+  'foo_4941',
+  'foo_4942',
+  'foo_4943',
+  'foo_4944',
+  'foo_4945',
+  'foo_4946',
+  'foo_4947',
+  'foo_4948',
+  'foo_4949',
+  'foo_4950',
+  'foo_4951',
+  'foo_4952',
+  'foo_4953',
+  'foo_4954',
+  'foo_4955',
+  'foo_4956',
+  'foo_4957',
+  'foo_4958',
+  'foo_4959',
+  'foo_4960',
+  'foo_4961',
+  'foo_4962',
+  'foo_4963',
+  'foo_4964',
+  'foo_4965',
+  'foo_4966',
+  'foo_4967',
+  'foo_4968',
+  'foo_4969',
+  'foo_4970',
+  'foo_4971',
+  'foo_4972',
+  'foo_4973',
+  'foo_4974',
+  'foo_4975',
+  'foo_4976',
+  'foo_4977',
+  'foo_4978',
+  'foo_4979',
+  'foo_4980',
+  'foo_4981',
+  'foo_4982',
+  'foo_4983',
+  'foo_4984',
+  'foo_4985',
+  'foo_4986',
+  'foo_4987',
+  'foo_4988',
+  'foo_4989',
+  'foo_4990',
+  'foo_4991',
+  'foo_4992',
+  'foo_4993',
+  'foo_4994',
+  'foo_4995',
+  'foo_4996',
+  'foo_4997',
+  'foo_4998',
+  'foo_4999',
+  'foo_5000',
+  'foo_5001',
+  'foo_5002',
+  'foo_5003',
+  'foo_5004',
+  'foo_5005',
+  'foo_5006',
+  'foo_5007',
+  'foo_5008',
+  'foo_5009',
+  'foo_5010',
+  'foo_5011',
+  'foo_5012',
+  'foo_5013',
+  'foo_5014',
+  'foo_5015',
+  'foo_5016',
+  'foo_5017',
+  'foo_5018',
+  'foo_5019',
+  'foo_5020',
+  'foo_5021',
+  'foo_5022',
+  'foo_5023',
+  'foo_5024',
+  'foo_5025',
+  'foo_5026',
+  'foo_5027',
+  'foo_5028',
+  'foo_5029',
+  'foo_5030',
+  'foo_5031',
+  'foo_5032',
+  'foo_5033',
+  'foo_5034',
+  'foo_5035',
+  'foo_5036',
+  'foo_5037',
+  'foo_5038',
+  'foo_5039',
+  'foo_5040',
+  'foo_5041',
+  'foo_5042',
+  'foo_5043',
+  'foo_5044',
+  'foo_5045',
+  'foo_5046',
+  'foo_5047',
+  'foo_5048',
+  'foo_5049',
+  'foo_5050',
+  'foo_5051',
+  'foo_5052',
+  'foo_5053',
+  'foo_5054',
+  'foo_5055',
+  'foo_5056',
+  'foo_5057',
+  'foo_5058',
+  'foo_5059',
+  'foo_5060',
+  'foo_5061',
+  'foo_5062',
+  'foo_5063',
+  'foo_5064',
+  'foo_5065',
+  'foo_5066',
+  'foo_5067',
+  'foo_5068',
+  'foo_5069',
+  'foo_5070',
+  'foo_5071',
+  'foo_5072',
+  'foo_5073',
+  'foo_5074',
+  'foo_5075',
+  'foo_5076',
+  'foo_5077',
+  'foo_5078',
+  'foo_5079',
+  'foo_5080',
+  'foo_5081',
+  'foo_5082',
+  'foo_5083',
+  'foo_5084',
+  'foo_5085',
+  'foo_5086',
+  'foo_5087',
+  'foo_5088',
+  'foo_5089',
+  'foo_5090',
+  'foo_5091',
+  'foo_5092',
+  'foo_5093',
+  'foo_5094',
+  'foo_5095',
+  'foo_5096',
+  'foo_5097',
+  'foo_5098',
+  'foo_5099',
+  'foo_5100',
+  'foo_5101',
+  'foo_5102',
+  'foo_5103',
+  'foo_5104',
+  'foo_5105',
+  'foo_5106',
+  'foo_5107',
+  'foo_5108',
+  'foo_5109',
+  'foo_5110',
+  'foo_5111',
+  'foo_5112',
+  'foo_5113',
+  'foo_5114',
+  'foo_5115',
+  'foo_5116',
+  'foo_5117',
+  'foo_5118',
+  'foo_5119',
+  'foo_5120',
+  'foo_5121',
+  'foo_5122',
+  'foo_5123',
+  'foo_5124',
+  'foo_5125',
+  'foo_5126',
+  'foo_5127',
+  'foo_5128',
+  'foo_5129',
+  'foo_5130',
+  'foo_5131',
+  'foo_5132',
+  'foo_5133',
+  'foo_5134',
+  'foo_5135',
+  'foo_5136',
+  'foo_5137',
+  'foo_5138',
+  'foo_5139',
+  'foo_5140',
+  'foo_5141',
+  'foo_5142',
+  'foo_5143',
+  'foo_5144',
+  'foo_5145',
+  'foo_5146',
+  'foo_5147',
+  'foo_5148',
+  'foo_5149',
+  'foo_5150',
+  'foo_5151',
+  'foo_5152',
+  'foo_5153',
+  'foo_5154',
+  'foo_5155',
+  'foo_5156',
+  'foo_5157',
+  'foo_5158',
+  'foo_5159',
+  'foo_5160',
+  'foo_5161',
+  'foo_5162',
+  'foo_5163',
+  'foo_5164',
+  'foo_5165',
+  'foo_5166',
+  'foo_5167',
+  'foo_5168',
+  'foo_5169',
+  'foo_5170',
+  'foo_5171',
+  'foo_5172',
+  'foo_5173',
+  'foo_5174',
+  'foo_5175',
+  'foo_5176',
+  'foo_5177',
+  'foo_5178',
+  'foo_5179',
+  'foo_5180',
+  'foo_5181',
+  'foo_5182',
+  'foo_5183',
+  'foo_5184',
+  'foo_5185',
+  'foo_5186',
+  'foo_5187',
+  'foo_5188',
+  'foo_5189',
+  'foo_5190',
+  'foo_5191',
+  'foo_5192',
+  'foo_5193',
+  'foo_5194',
+  'foo_5195',
+  'foo_5196',
+  'foo_5197',
+  'foo_5198',
+  'foo_5199',
+  'foo_5200',
+  'foo_5201',
+  'foo_5202',
+  'foo_5203',
+  'foo_5204',
+  'foo_5205',
+  'foo_5206',
+  'foo_5207',
+  'foo_5208',
+  'foo_5209',
+  'foo_5210',
+  'foo_5211',
+  'foo_5212',
+  'foo_5213',
+  'foo_5214',
+  'foo_5215',
+  'foo_5216',
+  'foo_5217',
+  'foo_5218',
+  'foo_5219',
+  'foo_5220',
+  'foo_5221',
+  'foo_5222',
+  'foo_5223',
+  'foo_5224',
+  'foo_5225',
+  'foo_5226',
+  'foo_5227',
+  'foo_5228',
+  'foo_5229',
+  'foo_5230',
+  'foo_5231',
+  'foo_5232',
+  'foo_5233',
+  'foo_5234',
+  'foo_5235',
+  'foo_5236',
+  'foo_5237',
+  'foo_5238',
+  'foo_5239',
+  'foo_5240',
+  'foo_5241',
+  'foo_5242',
+  'foo_5243',
+  'foo_5244',
+  'foo_5245',
+  'foo_5246',
+  'foo_5247',
+  'foo_5248',
+  'foo_5249',
+  'foo_5250',
+  'foo_5251',
+  'foo_5252',
+  'foo_5253',
+  'foo_5254',
+  'foo_5255',
+  'foo_5256',
+  'foo_5257',
+  'foo_5258',
+  'foo_5259',
+  'foo_5260',
+  'foo_5261',
+  'foo_5262',
+  'foo_5263',
+  'foo_5264',
+  'foo_5265',
+  'foo_5266',
+  'foo_5267',
+  'foo_5268',
+  'foo_5269',
+  'foo_5270',
+  'foo_5271',
+  'foo_5272',
+  'foo_5273',
+  'foo_5274',
+  'foo_5275',
+  'foo_5276',
+  'foo_5277',
+  'foo_5278',
+  'foo_5279',
+  'foo_5280',
+  'foo_5281',
+  'foo_5282',
+  'foo_5283',
+  'foo_5284',
+  'foo_5285',
+  'foo_5286',
+  'foo_5287',
+  'foo_5288',
+  'foo_5289',
+  'foo_5290',
+  'foo_5291',
+  'foo_5292',
+  'foo_5293',
+  'foo_5294',
+  'foo_5295',
+  'foo_5296',
+  'foo_5297',
+  'foo_5298',
+  'foo_5299',
+  'foo_5300',
+  'foo_5301',
+  'foo_5302',
+  'foo_5303',
+  'foo_5304',
+  'foo_5305',
+  'foo_5306',
+  'foo_5307',
+  'foo_5308',
+  'foo_5309',
+  'foo_5310',
+  'foo_5311',
+  'foo_5312',
+  'foo_5313',
+  'foo_5314',
+  'foo_5315',
+  'foo_5316',
+  'foo_5317',
+  'foo_5318',
+  'foo_5319',
+  'foo_5320',
+  'foo_5321',
+  'foo_5322',
+  'foo_5323',
+  'foo_5324',
+  'foo_5325',
+  'foo_5326',
+  'foo_5327',
+  'foo_5328',
+  'foo_5329',
+  'foo_5330',
+  'foo_5331',
+  'foo_5332',
+  'foo_5333',
+  'foo_5334',
+  'foo_5335',
+  'foo_5336',
+  'foo_5337',
+  'foo_5338',
+  'foo_5339',
+  'foo_5340',
+  'foo_5341',
+  'foo_5342',
+  'foo_5343',
+  'foo_5344',
+  'foo_5345',
+  'foo_5346',
+  'foo_5347',
+  'foo_5348',
+  'foo_5349',
+  'foo_5350',
+  'foo_5351',
+  'foo_5352',
+  'foo_5353',
+  'foo_5354',
+  'foo_5355',
+  'foo_5356',
+  'foo_5357',
+  'foo_5358',
+  'foo_5359',
+  'foo_5360',
+  'foo_5361',
+  'foo_5362',
+  'foo_5363',
+  'foo_5364',
+  'foo_5365',
+  'foo_5366',
+  'foo_5367',
+  'foo_5368',
+  'foo_5369',
+  'foo_5370',
+  'foo_5371',
+  'foo_5372',
+  'foo_5373',
+  'foo_5374',
+  'foo_5375',
+  'foo_5376',
+  'foo_5377',
+  'foo_5378',
+  'foo_5379',
+  'foo_5380',
+  'foo_5381',
+  'foo_5382',
+  'foo_5383',
+  'foo_5384',
+  'foo_5385',
+  'foo_5386',
+  'foo_5387',
+  'foo_5388',
+  'foo_5389',
+  'foo_5390',
+  'foo_5391',
+  'foo_5392',
+  'foo_5393',
+  'foo_5394',
+  'foo_5395',
+  'foo_5396',
+  'foo_5397',
+  'foo_5398',
+  'foo_5399',
+  'foo_5400',
+  'foo_5401',
+  'foo_5402',
+  'foo_5403',
+  'foo_5404',
+  'foo_5405',
+  'foo_5406',
+  'foo_5407',
+  'foo_5408',
+  'foo_5409',
+  'foo_5410',
+  'foo_5411',
+  'foo_5412',
+  'foo_5413',
+  'foo_5414',
+  'foo_5415',
+  'foo_5416',
+  'foo_5417',
+  'foo_5418',
+  'foo_5419',
+  'foo_5420',
+  'foo_5421',
+  'foo_5422',
+  'foo_5423',
+  'foo_5424',
+  'foo_5425',
+  'foo_5426',
+  'foo_5427',
+  'foo_5428',
+  'foo_5429',
+  'foo_5430',
+  'foo_5431',
+  'foo_5432',
+  'foo_5433',
+  'foo_5434',
+  'foo_5435',
+  'foo_5436',
+  'foo_5437',
+  'foo_5438',
+  'foo_5439',
+  'foo_5440',
+  'foo_5441',
+  'foo_5442',
+  'foo_5443',
+  'foo_5444',
+  'foo_5445',
+  'foo_5446',
+  'foo_5447',
+  'foo_5448',
+  'foo_5449',
+  'foo_5450',
+  'foo_5451',
+  'foo_5452',
+  'foo_5453',
+  'foo_5454',
+  'foo_5455',
+  'foo_5456',
+  'foo_5457',
+  'foo_5458',
+  'foo_5459',
+  'foo_5460',
+  'foo_5461',
+  'foo_5462',
+  'foo_5463',
+  'foo_5464',
+  'foo_5465',
+  'foo_5466',
+  'foo_5467',
+  'foo_5468',
+  'foo_5469',
+  'foo_5470',
+  'foo_5471',
+  'foo_5472',
+  'foo_5473',
+  'foo_5474',
+  'foo_5475',
+  'foo_5476',
+  'foo_5477',
+  'foo_5478',
+  'foo_5479',
+  'foo_5480',
+  'foo_5481',
+  'foo_5482',
+  'foo_5483',
+  'foo_5484',
+  'foo_5485',
+  'foo_5486',
+  'foo_5487',
+  'foo_5488',
+  'foo_5489',
+  'foo_5490',
+  'foo_5491',
+  'foo_5492',
+  'foo_5493',
+  'foo_5494',
+  'foo_5495',
+  'foo_5496',
+  'foo_5497',
+  'foo_5498',
+  'foo_5499',
+  'foo_5500',
+  'foo_5501',
+  'foo_5502',
+  'foo_5503',
+  'foo_5504',
+  'foo_5505',
+  'foo_5506',
+  'foo_5507',
+  'foo_5508',
+  'foo_5509',
+  'foo_5510',
+  'foo_5511',
+  'foo_5512',
+  'foo_5513',
+  'foo_5514',
+  'foo_5515',
+  'foo_5516',
+  'foo_5517',
+  'foo_5518',
+  'foo_5519',
+  'foo_5520',
+  'foo_5521',
+  'foo_5522',
+  'foo_5523',
+  'foo_5524',
+  'foo_5525',
+  'foo_5526',
+  'foo_5527',
+  'foo_5528',
+  'foo_5529',
+  'foo_5530',
+  'foo_5531',
+  'foo_5532',
+  'foo_5533',
+  'foo_5534',
+  'foo_5535',
+  'foo_5536',
+  'foo_5537',
+  'foo_5538',
+  'foo_5539',
+  'foo_5540',
+  'foo_5541',
+  'foo_5542',
+  'foo_5543',
+  'foo_5544',
+  'foo_5545',
+  'foo_5546',
+  'foo_5547',
+  'foo_5548',
+  'foo_5549',
+  'foo_5550',
+  'foo_5551',
+  'foo_5552',
+  'foo_5553',
+  'foo_5554',
+  'foo_5555',
+  'foo_5556',
+  'foo_5557',
+  'foo_5558',
+  'foo_5559',
+  'foo_5560',
+  'foo_5561',
+  'foo_5562',
+  'foo_5563',
+  'foo_5564',
+  'foo_5565',
+  'foo_5566',
+  'foo_5567',
+  'foo_5568',
+  'foo_5569',
+  'foo_5570',
+  'foo_5571',
+  'foo_5572',
+  'foo_5573',
+  'foo_5574',
+  'foo_5575',
+  'foo_5576',
+  'foo_5577',
+  'foo_5578',
+  'foo_5579',
+  'foo_5580',
+  'foo_5581',
+  'foo_5582',
+  'foo_5583',
+  'foo_5584',
+  'foo_5585',
+  'foo_5586',
+  'foo_5587',
+  'foo_5588',
+  'foo_5589',
+  'foo_5590',
+  'foo_5591',
+  'foo_5592',
+  'foo_5593',
+  'foo_5594',
+  'foo_5595',
+  'foo_5596',
+  'foo_5597',
+  'foo_5598',
+  'foo_5599',
+  'foo_5600',
+  'foo_5601',
+  'foo_5602',
+  'foo_5603',
+  'foo_5604',
+  'foo_5605',
+  'foo_5606',
+  'foo_5607',
+  'foo_5608',
+  'foo_5609',
+  'foo_5610',
+  'foo_5611',
+  'foo_5612',
+  'foo_5613',
+  'foo_5614',
+  'foo_5615',
+  'foo_5616',
+  'foo_5617',
+  'foo_5618',
+  'foo_5619',
+  'foo_5620',
+  'foo_5621',
+  'foo_5622',
+  'foo_5623',
+  'foo_5624',
+  'foo_5625',
+  'foo_5626',
+  'foo_5627',
+  'foo_5628',
+  'foo_5629',
+  'foo_5630',
+  'foo_5631',
+  'foo_5632',
+  'foo_5633',
+  'foo_5634',
+  'foo_5635',
+  'foo_5636',
+  'foo_5637',
+  'foo_5638',
+  'foo_5639',
+  'foo_5640',
+  'foo_5641',
+  'foo_5642',
+  'foo_5643',
+  'foo_5644',
+  'foo_5645',
+  'foo_5646',
+  'foo_5647',
+  'foo_5648',
+  'foo_5649',
+  'foo_5650',
+  'foo_5651',
+  'foo_5652',
+  'foo_5653',
+  'foo_5654',
+  'foo_5655',
+  'foo_5656',
+  'foo_5657',
+  'foo_5658',
+  'foo_5659',
+  'foo_5660',
+  'foo_5661',
+  'foo_5662',
+  'foo_5663',
+  'foo_5664',
+  'foo_5665',
+  'foo_5666',
+  'foo_5667',
+  'foo_5668',
+  'foo_5669',
+  'foo_5670',
+  'foo_5671',
+  'foo_5672',
+  'foo_5673',
+  'foo_5674',
+  'foo_5675',
+  'foo_5676',
+  'foo_5677',
+  'foo_5678',
+  'foo_5679',
+  'foo_5680',
+  'foo_5681',
+  'foo_5682',
+  'foo_5683',
+  'foo_5684',
+  'foo_5685',
+  'foo_5686',
+  'foo_5687',
+  'foo_5688',
+  'foo_5689',
+  'foo_5690',
+  'foo_5691',
+  'foo_5692',
+  'foo_5693',
+  'foo_5694',
+  'foo_5695',
+  'foo_5696',
+  'foo_5697',
+  'foo_5698',
+  'foo_5699',
+  'foo_5700',
+  'foo_5701',
+  'foo_5702',
+  'foo_5703',
+  'foo_5704',
+  'foo_5705',
+  'foo_5706',
+  'foo_5707',
+  'foo_5708',
+  'foo_5709',
+  'foo_5710',
+  'foo_5711',
+  'foo_5712',
+  'foo_5713',
+  'foo_5714',
+  'foo_5715',
+  'foo_5716',
+  'foo_5717',
+  'foo_5718',
+  'foo_5719',
+  'foo_5720',
+  'foo_5721',
+  'foo_5722',
+  'foo_5723',
+  'foo_5724',
+  'foo_5725',
+  'foo_5726',
+  'foo_5727',
+  'foo_5728',
+  'foo_5729',
+  'foo_5730',
+  'foo_5731',
+  'foo_5732',
+  'foo_5733',
+  'foo_5734',
+  'foo_5735',
+  'foo_5736',
+  'foo_5737',
+  'foo_5738',
+  'foo_5739',
+  'foo_5740',
+  'foo_5741',
+  'foo_5742',
+  'foo_5743',
+  'foo_5744',
+  'foo_5745',
+  'foo_5746',
+  'foo_5747',
+  'foo_5748',
+  'foo_5749',
+  'foo_5750',
+  'foo_5751',
+  'foo_5752',
+  'foo_5753',
+  'foo_5754',
+  'foo_5755',
+  'foo_5756',
+  'foo_5757',
+  'foo_5758',
+  'foo_5759',
+  'foo_5760',
+  'foo_5761',
+  'foo_5762',
+  'foo_5763',
+  'foo_5764',
+  'foo_5765',
+  'foo_5766',
+  'foo_5767',
+  'foo_5768',
+  'foo_5769',
+  'foo_5770',
+  'foo_5771',
+  'foo_5772',
+  'foo_5773',
+  'foo_5774',
+  'foo_5775',
+  'foo_5776',
+  'foo_5777',
+  'foo_5778',
+  'foo_5779',
+  'foo_5780',
+  'foo_5781',
+  'foo_5782',
+  'foo_5783',
+  'foo_5784',
+  'foo_5785',
+  'foo_5786',
+  'foo_5787',
+  'foo_5788',
+  'foo_5789',
+  'foo_5790',
+  'foo_5791',
+  'foo_5792',
+  'foo_5793',
+  'foo_5794',
+  'foo_5795',
+  'foo_5796',
+  'foo_5797',
+  'foo_5798',
+  'foo_5799',
+  'foo_5800',
+  'foo_5801',
+  'foo_5802',
+  'foo_5803',
+  'foo_5804',
+  'foo_5805',
+  'foo_5806',
+  'foo_5807',
+  'foo_5808',
+  'foo_5809',
+  'foo_5810',
+  'foo_5811',
+  'foo_5812',
+  'foo_5813',
+  'foo_5814',
+  'foo_5815',
+  'foo_5816',
+  'foo_5817',
+  'foo_5818',
+  'foo_5819',
+  'foo_5820',
+  'foo_5821',
+  'foo_5822',
+  'foo_5823',
+  'foo_5824',
+  'foo_5825',
+  'foo_5826',
+  'foo_5827',
+  'foo_5828',
+  'foo_5829',
+  'foo_5830',
+  'foo_5831',
+  'foo_5832',
+  'foo_5833',
+  'foo_5834',
+  'foo_5835',
+  'foo_5836',
+  'foo_5837',
+  'foo_5838',
+  'foo_5839',
+  'foo_5840',
+  'foo_5841',
+  'foo_5842',
+  'foo_5843',
+  'foo_5844',
+  'foo_5845',
+  'foo_5846',
+  'foo_5847',
+  'foo_5848',
+  'foo_5849',
+  'foo_5850',
+  'foo_5851',
+  'foo_5852',
+  'foo_5853',
+  'foo_5854',
+  'foo_5855',
+  'foo_5856',
+  'foo_5857',
+  'foo_5858',
+  'foo_5859',
+  'foo_5860',
+  'foo_5861',
+  'foo_5862',
+  'foo_5863',
+  'foo_5864',
+  'foo_5865',
+  'foo_5866',
+  'foo_5867',
+  'foo_5868',
+  'foo_5869',
+  'foo_5870',
+  'foo_5871',
+  'foo_5872',
+  'foo_5873',
+  'foo_5874',
+  'foo_5875',
+  'foo_5876',
+  'foo_5877',
+  'foo_5878',
+  'foo_5879',
+  'foo_5880',
+  'foo_5881',
+  'foo_5882',
+  'foo_5883',
+  'foo_5884',
+  'foo_5885',
+  'foo_5886',
+  'foo_5887',
+  'foo_5888',
+  'foo_5889',
+  'foo_5890',
+  'foo_5891',
+  'foo_5892',
+  'foo_5893',
+  'foo_5894',
+  'foo_5895',
+  'foo_5896',
+  'foo_5897',
+  'foo_5898',
+  'foo_5899',
+  'foo_5900',
+  'foo_5901',
+  'foo_5902',
+  'foo_5903',
+  'foo_5904',
+  'foo_5905',
+  'foo_5906',
+  'foo_5907',
+  'foo_5908',
+  'foo_5909',
+  'foo_5910',
+  'foo_5911',
+  'foo_5912',
+  'foo_5913',
+  'foo_5914',
+  'foo_5915',
+  'foo_5916',
+  'foo_5917',
+  'foo_5918',
+  'foo_5919',
+  'foo_5920',
+  'foo_5921',
+  'foo_5922',
+  'foo_5923',
+  'foo_5924',
+  'foo_5925',
+  'foo_5926',
+  'foo_5927',
+  'foo_5928',
+  'foo_5929',
+  'foo_5930',
+  'foo_5931',
+  'foo_5932',
+  'foo_5933',
+  'foo_5934',
+  'foo_5935',
+  'foo_5936',
+  'foo_5937',
+  'foo_5938',
+  'foo_5939',
+  'foo_5940',
+  'foo_5941',
+  'foo_5942',
+  'foo_5943',
+  'foo_5944',
+  'foo_5945',
+  'foo_5946',
+  'foo_5947',
+  'foo_5948',
+  'foo_5949',
+  'foo_5950',
+  'foo_5951',
+  'foo_5952',
+  'foo_5953',
+  'foo_5954',
+  'foo_5955',
+  'foo_5956',
+  'foo_5957',
+  'foo_5958',
+  'foo_5959',
+  'foo_5960',
+  'foo_5961',
+  'foo_5962',
+  'foo_5963',
+  'foo_5964',
+  'foo_5965',
+  'foo_5966',
+  'foo_5967',
+  'foo_5968',
+  'foo_5969',
+  'foo_5970',
+  'foo_5971',
+  'foo_5972',
+  'foo_5973',
+  'foo_5974',
+  'foo_5975',
+  'foo_5976',
+  'foo_5977',
+  'foo_5978',
+  'foo_5979',
+  'foo_5980',
+  'foo_5981',
+  'foo_5982',
+  'foo_5983',
+  'foo_5984',
+  'foo_5985',
+  'foo_5986',
+  'foo_5987',
+  'foo_5988',
+  'foo_5989',
+  'foo_5990',
+  'foo_5991',
+  'foo_5992',
+  'foo_5993',
+  'foo_5994',
+  'foo_5995',
+  'foo_5996',
+  'foo_5997',
+  'foo_5998',
+  'foo_5999',
+  'foo_6000',
+  'foo_6001',
+  'foo_6002',
+  'foo_6003',
+  'foo_6004',
+  'foo_6005',
+  'foo_6006',
+  'foo_6007',
+  'foo_6008',
+  'foo_6009',
+  'foo_6010',
+  'foo_6011',
+  'foo_6012',
+  'foo_6013',
+  'foo_6014',
+  'foo_6015',
+  'foo_6016',
+  'foo_6017',
+  'foo_6018',
+  'foo_6019',
+  'foo_6020',
+  'foo_6021',
+  'foo_6022',
+  'foo_6023',
+  'foo_6024',
+  'foo_6025',
+  'foo_6026',
+  'foo_6027',
+  'foo_6028',
+  'foo_6029',
+  'foo_6030',
+  'foo_6031',
+  'foo_6032',
+  'foo_6033',
+  'foo_6034',
+  'foo_6035',
+  'foo_6036',
+  'foo_6037',
+  'foo_6038',
+  'foo_6039',
+  'foo_6040',
+  'foo_6041',
+  'foo_6042',
+  'foo_6043',
+  'foo_6044',
+  'foo_6045',
+  'foo_6046',
+  'foo_6047',
+  'foo_6048',
+  'foo_6049',
+  'foo_6050',
+  'foo_6051',
+  'foo_6052',
+  'foo_6053',
+  'foo_6054',
+  'foo_6055',
+  'foo_6056',
+  'foo_6057',
+  'foo_6058',
+  'foo_6059',
+  'foo_6060',
+  'foo_6061',
+  'foo_6062',
+  'foo_6063',
+  'foo_6064',
+  'foo_6065',
+  'foo_6066',
+  'foo_6067',
+  'foo_6068',
+  'foo_6069',
+  'foo_6070',
+  'foo_6071',
+  'foo_6072',
+  'foo_6073',
+  'foo_6074',
+  'foo_6075',
+  'foo_6076',
+  'foo_6077',
+  'foo_6078',
+  'foo_6079',
+  'foo_6080',
+  'foo_6081',
+  'foo_6082',
+  'foo_6083',
+  'foo_6084',
+  'foo_6085',
+  'foo_6086',
+  'foo_6087',
+  'foo_6088',
+  'foo_6089',
+  'foo_6090',
+  'foo_6091',
+  'foo_6092',
+  'foo_6093',
+  'foo_6094',
+  'foo_6095',
+  'foo_6096',
+  'foo_6097',
+  'foo_6098',
+  'foo_6099',
+  'foo_6100',
+  'foo_6101',
+  'foo_6102',
+  'foo_6103',
+  'foo_6104',
+  'foo_6105',
+  'foo_6106',
+  'foo_6107',
+  'foo_6108',
+  'foo_6109',
+  'foo_6110',
+  'foo_6111',
+  'foo_6112',
+  'foo_6113',
+  'foo_6114',
+  'foo_6115',
+  'foo_6116',
+  'foo_6117',
+  'foo_6118',
+  'foo_6119',
+  'foo_6120',
+  'foo_6121',
+  'foo_6122',
+  'foo_6123',
+  'foo_6124',
+  'foo_6125',
+  'foo_6126',
+  'foo_6127',
+  'foo_6128',
+  'foo_6129',
+  'foo_6130',
+  'foo_6131',
+  'foo_6132',
+  'foo_6133',
+  'foo_6134',
+  'foo_6135',
+  'foo_6136',
+  'foo_6137',
+  'foo_6138',
+  'foo_6139',
+  'foo_6140',
+  'foo_6141',
+  'foo_6142',
+  'foo_6143',
+  'foo_6144',
+  'foo_6145',
+  'foo_6146',
+  'foo_6147',
+  'foo_6148',
+  'foo_6149',
+  'foo_6150',
+  'foo_6151',
+  'foo_6152',
+  'foo_6153',
+  'foo_6154',
+  'foo_6155',
+  'foo_6156',
+  'foo_6157',
+  'foo_6158',
+  'foo_6159',
+  'foo_6160',
+  'foo_6161',
+  'foo_6162',
+  'foo_6163',
+  'foo_6164',
+  'foo_6165',
+  'foo_6166',
+  'foo_6167',
+  'foo_6168',
+  'foo_6169',
+  'foo_6170',
+  'foo_6171',
+  'foo_6172',
+  'foo_6173',
+  'foo_6174',
+  'foo_6175',
+  'foo_6176',
+  'foo_6177',
+  'foo_6178',
+  'foo_6179',
+  'foo_6180',
+  'foo_6181',
+  'foo_6182',
+  'foo_6183',
+  'foo_6184',
+  'foo_6185',
+  'foo_6186',
+  'foo_6187',
+  'foo_6188',
+  'foo_6189',
+  'foo_6190',
+  'foo_6191',
+  'foo_6192',
+  'foo_6193',
+  'foo_6194',
+  'foo_6195',
+  'foo_6196',
+  'foo_6197',
+  'foo_6198',
+  'foo_6199',
+  'foo_6200',
+  'foo_6201',
+  'foo_6202',
+  'foo_6203',
+  'foo_6204',
+  'foo_6205',
+  'foo_6206',
+  'foo_6207',
+  'foo_6208',
+  'foo_6209',
+  'foo_6210',
+  'foo_6211',
+  'foo_6212',
+  'foo_6213',
+  'foo_6214',
+  'foo_6215',
+  'foo_6216',
+  'foo_6217',
+  'foo_6218',
+  'foo_6219',
+  'foo_6220',
+  'foo_6221',
+  'foo_6222',
+  'foo_6223',
+  'foo_6224',
+  'foo_6225',
+  'foo_6226',
+  'foo_6227',
+  'foo_6228',
+  'foo_6229',
+  'foo_6230',
+  'foo_6231',
+  'foo_6232',
+  'foo_6233',
+  'foo_6234',
+  'foo_6235',
+  'foo_6236',
+  'foo_6237',
+  'foo_6238',
+  'foo_6239',
+  'foo_6240',
+  'foo_6241',
+  'foo_6242',
+  'foo_6243',
+  'foo_6244',
+  'foo_6245',
+  'foo_6246',
+  'foo_6247',
+  'foo_6248',
+  'foo_6249',
+  'foo_6250',
+  'foo_6251',
+  'foo_6252',
+  'foo_6253',
+  'foo_6254',
+  'foo_6255',
+  'foo_6256',
+  'foo_6257',
+  'foo_6258',
+  'foo_6259',
+  'foo_6260',
+  'foo_6261',
+  'foo_6262',
+  'foo_6263',
+  'foo_6264',
+  'foo_6265',
+  'foo_6266',
+  'foo_6267',
+  'foo_6268',
+  'foo_6269',
+  'foo_6270',
+  'foo_6271',
+  'foo_6272',
+  'foo_6273',
+  'foo_6274',
+  'foo_6275',
+  'foo_6276',
+  'foo_6277',
+  'foo_6278',
+  'foo_6279',
+  'foo_6280',
+  'foo_6281',
+  'foo_6282',
+  'foo_6283',
+  'foo_6284',
+  'foo_6285',
+  'foo_6286',
+  'foo_6287',
+  'foo_6288',
+  'foo_6289',
+  'foo_6290',
+  'foo_6291',
+  'foo_6292',
+  'foo_6293',
+  'foo_6294',
+  'foo_6295',
+  'foo_6296',
+  'foo_6297',
+  'foo_6298',
+  'foo_6299',
+  'foo_6300',
+  'foo_6301',
+  'foo_6302',
+  'foo_6303',
+  'foo_6304',
+  'foo_6305',
+  'foo_6306',
+  'foo_6307',
+  'foo_6308',
+  'foo_6309',
+  'foo_6310',
+  'foo_6311',
+  'foo_6312',
+  'foo_6313',
+  'foo_6314',
+  'foo_6315',
+  'foo_6316',
+  'foo_6317',
+  'foo_6318',
+  'foo_6319',
+  'foo_6320',
+  'foo_6321',
+  'foo_6322',
+  'foo_6323',
+  'foo_6324',
+  'foo_6325',
+  'foo_6326',
+  'foo_6327',
+  'foo_6328',
+  'foo_6329',
+  'foo_6330',
+  'foo_6331',
+  'foo_6332',
+  'foo_6333',
+  'foo_6334',
+  'foo_6335',
+  'foo_6336',
+  'foo_6337',
+  'foo_6338',
+  'foo_6339',
+  'foo_6340',
+  'foo_6341',
+  'foo_6342',
+  'foo_6343',
+  'foo_6344',
+  'foo_6345',
+  'foo_6346',
+  'foo_6347',
+  'foo_6348',
+  'foo_6349',
+  'foo_6350',
+  'foo_6351',
+  'foo_6352',
+  'foo_6353',
+  'foo_6354',
+  'foo_6355',
+  'foo_6356',
+  'foo_6357',
+  'foo_6358',
+  'foo_6359',
+  'foo_6360',
+  'foo_6361',
+  'foo_6362',
+  'foo_6363',
+  'foo_6364',
+  'foo_6365',
+  'foo_6366',
+  'foo_6367',
+  'foo_6368',
+  'foo_6369',
+  'foo_6370',
+  'foo_6371',
+  'foo_6372',
+  'foo_6373',
+  'foo_6374',
+  'foo_6375',
+  'foo_6376',
+  'foo_6377',
+  'foo_6378',
+  'foo_6379',
+  'foo_6380',
+  'foo_6381',
+  'foo_6382',
+  'foo_6383',
+  'foo_6384',
+  'foo_6385',
+  'foo_6386',
+  'foo_6387',
+  'foo_6388',
+  'foo_6389',
+  'foo_6390',
+  'foo_6391',
+  'foo_6392',
+  'foo_6393',
+  'foo_6394',
+  'foo_6395',
+  'foo_6396',
+  'foo_6397',
+  'foo_6398',
+  'foo_6399',
+  'foo_6400',
+  'foo_6401',
+  'foo_6402',
+  'foo_6403',
+  'foo_6404',
+  'foo_6405',
+  'foo_6406',
+  'foo_6407',
+  'foo_6408',
+  'foo_6409',
+  'foo_6410',
+  'foo_6411',
+  'foo_6412',
+  'foo_6413',
+  'foo_6414',
+  'foo_6415',
+  'foo_6416',
+  'foo_6417',
+  'foo_6418',
+  'foo_6419',
+  'foo_6420',
+  'foo_6421',
+  'foo_6422',
+  'foo_6423',
+  'foo_6424',
+  'foo_6425',
+  'foo_6426',
+  'foo_6427',
+  'foo_6428',
+  'foo_6429',
+  'foo_6430',
+  'foo_6431',
+  'foo_6432',
+  'foo_6433',
+  'foo_6434',
+  'foo_6435',
+  'foo_6436',
+  'foo_6437',
+  'foo_6438',
+  'foo_6439',
+  'foo_6440',
+  'foo_6441',
+  'foo_6442',
+  'foo_6443',
+  'foo_6444',
+  'foo_6445',
+  'foo_6446',
+  'foo_6447',
+  'foo_6448',
+  'foo_6449',
+  'foo_6450',
+  'foo_6451',
+  'foo_6452',
+  'foo_6453',
+  'foo_6454',
+  'foo_6455',
+  'foo_6456',
+  'foo_6457',
+  'foo_6458',
+  'foo_6459',
+  'foo_6460',
+  'foo_6461',
+  'foo_6462',
+  'foo_6463',
+  'foo_6464',
+  'foo_6465',
+  'foo_6466',
+  'foo_6467',
+  'foo_6468',
+  'foo_6469',
+  'foo_6470',
+  'foo_6471',
+  'foo_6472',
+  'foo_6473',
+  'foo_6474',
+  'foo_6475',
+  'foo_6476',
+  'foo_6477',
+  'foo_6478',
+  'foo_6479',
+  'foo_6480',
+  'foo_6481',
+  'foo_6482',
+  'foo_6483',
+  'foo_6484',
+  'foo_6485',
+  'foo_6486',
+  'foo_6487',
+  'foo_6488',
+  'foo_6489',
+  'foo_6490',
+  'foo_6491',
+  'foo_6492',
+  'foo_6493',
+  'foo_6494',
+  'foo_6495',
+  'foo_6496',
+  'foo_6497',
+  'foo_6498',
+  'foo_6499',
+  'foo_6500',
+  'foo_6501',
+  'foo_6502',
+  'foo_6503',
+  'foo_6504',
+  'foo_6505',
+  'foo_6506',
+  'foo_6507',
+  'foo_6508',
+  'foo_6509',
+  'foo_6510',
+  'foo_6511',
+  'foo_6512',
+  'foo_6513',
+  'foo_6514',
+  'foo_6515',
+  'foo_6516',
+  'foo_6517',
+  'foo_6518',
+  'foo_6519',
+  'foo_6520',
+  'foo_6521',
+  'foo_6522',
+  'foo_6523',
+  'foo_6524',
+  'foo_6525',
+  'foo_6526',
+  'foo_6527',
+  'foo_6528',
+  'foo_6529',
+  'foo_6530',
+  'foo_6531',
+  'foo_6532',
+  'foo_6533',
+  'foo_6534',
+  'foo_6535',
+  'foo_6536',
+  'foo_6537',
+  'foo_6538',
+  'foo_6539',
+  'foo_6540',
+  'foo_6541',
+  'foo_6542',
+  'foo_6543',
+  'foo_6544',
+  'foo_6545',
+  'foo_6546',
+  'foo_6547',
+  'foo_6548',
+  'foo_6549',
+  'foo_6550',
+  'foo_6551',
+  'foo_6552',
+  'foo_6553',
+  'foo_6554',
+  'foo_6555',
+  'foo_6556',
+  'foo_6557',
+  'foo_6558',
+  'foo_6559',
+  'foo_6560',
+  'foo_6561',
+  'foo_6562',
+  'foo_6563',
+  'foo_6564',
+  'foo_6565',
+  'foo_6566',
+  'foo_6567',
+  'foo_6568',
+  'foo_6569',
+  'foo_6570',
+  'foo_6571',
+  'foo_6572',
+  'foo_6573',
+  'foo_6574',
+  'foo_6575',
+  'foo_6576',
+  'foo_6577',
+  'foo_6578',
+  'foo_6579',
+  'foo_6580',
+  'foo_6581',
+  'foo_6582',
+  'foo_6583',
+  'foo_6584',
+  'foo_6585',
+  'foo_6586',
+  'foo_6587',
+  'foo_6588',
+  'foo_6589',
+  'foo_6590',
+  'foo_6591',
+  'foo_6592',
+  'foo_6593',
+  'foo_6594',
+  'foo_6595',
+  'foo_6596',
+  'foo_6597',
+  'foo_6598',
+  'foo_6599',
+  'foo_6600',
+  'foo_6601',
+  'foo_6602',
+  'foo_6603',
+  'foo_6604',
+  'foo_6605',
+  'foo_6606',
+  'foo_6607',
+  'foo_6608',
+  'foo_6609',
+  'foo_6610',
+  'foo_6611',
+  'foo_6612',
+  'foo_6613',
+  'foo_6614',
+  'foo_6615',
+  'foo_6616',
+  'foo_6617',
+  'foo_6618',
+  'foo_6619',
+  'foo_6620',
+  'foo_6621',
+  'foo_6622',
+  'foo_6623',
+  'foo_6624',
+  'foo_6625',
+  'foo_6626',
+  'foo_6627',
+  'foo_6628',
+  'foo_6629',
+  'foo_6630',
+  'foo_6631',
+  'foo_6632',
+  'foo_6633',
+  'foo_6634',
+  'foo_6635',
+  'foo_6636',
+  'foo_6637',
+  'foo_6638',
+  'foo_6639',
+  'foo_6640',
+  'foo_6641',
+  'foo_6642',
+  'foo_6643',
+  'foo_6644',
+  'foo_6645',
+  'foo_6646',
+  'foo_6647',
+  'foo_6648',
+  'foo_6649',
+  'foo_6650',
+  'foo_6651',
+  'foo_6652',
+  'foo_6653',
+  'foo_6654',
+  'foo_6655',
+  'foo_6656',
+  'foo_6657',
+  'foo_6658',
+  'foo_6659',
+  'foo_6660',
+  'foo_6661',
+  'foo_6662',
+  'foo_6663',
+  'foo_6664',
+  'foo_6665',
+  'foo_6666',
+  'foo_6667',
+  'foo_6668',
+  'foo_6669',
+  'foo_6670',
+  'foo_6671',
+  'foo_6672',
+  'foo_6673',
+  'foo_6674',
+  'foo_6675',
+  'foo_6676',
+  'foo_6677',
+  'foo_6678',
+  'foo_6679',
+  'foo_6680',
+  'foo_6681',
+  'foo_6682',
+  'foo_6683',
+  'foo_6684',
+  'foo_6685',
+  'foo_6686',
+  'foo_6687',
+  'foo_6688',
+  'foo_6689',
+  'foo_6690',
+  'foo_6691',
+  'foo_6692',
+  'foo_6693',
+  'foo_6694',
+  'foo_6695',
+  'foo_6696',
+  'foo_6697',
+  'foo_6698',
+  'foo_6699',
+  'foo_6700',
+  'foo_6701',
+  'foo_6702',
+  'foo_6703',
+  'foo_6704',
+  'foo_6705',
+  'foo_6706',
+  'foo_6707',
+  'foo_6708',
+  'foo_6709',
+  'foo_6710',
+  'foo_6711',
+  'foo_6712',
+  'foo_6713',
+  'foo_6714',
+  'foo_6715',
+  'foo_6716',
+  'foo_6717',
+  'foo_6718',
+  'foo_6719',
+  'foo_6720',
+  'foo_6721',
+  'foo_6722',
+  'foo_6723',
+  'foo_6724',
+  'foo_6725',
+  'foo_6726',
+  'foo_6727',
+  'foo_6728',
+  'foo_6729',
+  'foo_6730',
+  'foo_6731',
+  'foo_6732',
+  'foo_6733',
+  'foo_6734',
+  'foo_6735',
+  'foo_6736',
+  'foo_6737',
+  'foo_6738',
+  'foo_6739',
+  'foo_6740',
+  'foo_6741',
+  'foo_6742',
+  'foo_6743',
+  'foo_6744',
+  'foo_6745',
+  'foo_6746',
+  'foo_6747',
+  'foo_6748',
+  'foo_6749',
+  'foo_6750',
+  'foo_6751',
+  'foo_6752',
+  'foo_6753',
+  'foo_6754',
+  'foo_6755',
+  'foo_6756',
+  'foo_6757',
+  'foo_6758',
+  'foo_6759',
+  'foo_6760',
+  'foo_6761',
+  'foo_6762',
+  'foo_6763',
+  'foo_6764',
+  'foo_6765',
+  'foo_6766',
+  'foo_6767',
+  'foo_6768',
+  'foo_6769',
+  'foo_6770',
+  'foo_6771',
+  'foo_6772',
+  'foo_6773',
+  'foo_6774',
+  'foo_6775',
+  'foo_6776',
+  'foo_6777',
+  'foo_6778',
+  'foo_6779',
+  'foo_6780',
+  'foo_6781',
+  'foo_6782',
+  'foo_6783',
+  'foo_6784',
+  'foo_6785',
+  'foo_6786',
+  'foo_6787',
+  'foo_6788',
+  'foo_6789',
+  'foo_6790',
+  'foo_6791',
+  'foo_6792',
+  'foo_6793',
+  'foo_6794',
+  'foo_6795',
+  'foo_6796',
+  'foo_6797',
+  'foo_6798',
+  'foo_6799',
+  'foo_6800',
+  'foo_6801',
+  'foo_6802',
+  'foo_6803',
+  'foo_6804',
+  'foo_6805',
+  'foo_6806',
+  'foo_6807',
+  'foo_6808',
+  'foo_6809',
+  'foo_6810',
+  'foo_6811',
+  'foo_6812',
+  'foo_6813',
+  'foo_6814',
+  'foo_6815',
+  'foo_6816',
+  'foo_6817',
+  'foo_6818',
+  'foo_6819',
+  'foo_6820',
+  'foo_6821',
+  'foo_6822',
+  'foo_6823',
+  'foo_6824',
+  'foo_6825',
+  'foo_6826',
+  'foo_6827',
+  'foo_6828',
+  'foo_6829',
+  'foo_6830',
+  'foo_6831',
+  'foo_6832',
+  'foo_6833',
+  'foo_6834',
+  'foo_6835',
+  'foo_6836',
+  'foo_6837',
+  'foo_6838',
+  'foo_6839',
+  'foo_6840',
+  'foo_6841',
+  'foo_6842',
+  'foo_6843',
+  'foo_6844',
+  'foo_6845',
+  'foo_6846',
+  'foo_6847',
+  'foo_6848',
+  'foo_6849',
+  'foo_6850',
+  'foo_6851',
+  'foo_6852',
+  'foo_6853',
+  'foo_6854',
+  'foo_6855',
+  'foo_6856',
+  'foo_6857',
+  'foo_6858',
+  'foo_6859',
+  'foo_6860',
+  'foo_6861',
+  'foo_6862',
+  'foo_6863',
+  'foo_6864',
+  'foo_6865',
+  'foo_6866',
+  'foo_6867',
+  'foo_6868',
+  'foo_6869',
+  'foo_6870',
+  'foo_6871',
+  'foo_6872',
+  'foo_6873',
+  'foo_6874',
+  'foo_6875',
+  'foo_6876',
+  'foo_6877',
+  'foo_6878',
+  'foo_6879',
+  'foo_6880',
+  'foo_6881',
+  'foo_6882',
+  'foo_6883',
+  'foo_6884',
+  'foo_6885',
+  'foo_6886',
+  'foo_6887',
+  'foo_6888',
+  'foo_6889',
+  'foo_6890',
+  'foo_6891',
+  'foo_6892',
+  'foo_6893',
+  'foo_6894',
+  'foo_6895',
+  'foo_6896',
+  'foo_6897',
+  'foo_6898',
+  'foo_6899',
+  'foo_6900',
+  'foo_6901',
+  'foo_6902',
+  'foo_6903',
+  'foo_6904',
+  'foo_6905',
+  'foo_6906',
+  'foo_6907',
+  'foo_6908',
+  'foo_6909',
+  'foo_6910',
+  'foo_6911',
+  'foo_6912',
+  'foo_6913',
+  'foo_6914',
+  'foo_6915',
+  'foo_6916',
+  'foo_6917',
+  'foo_6918',
+  'foo_6919',
+  'foo_6920',
+  'foo_6921',
+  'foo_6922',
+  'foo_6923',
+  'foo_6924',
+  'foo_6925',
+  'foo_6926',
+  'foo_6927',
+  'foo_6928',
+  'foo_6929',
+  'foo_6930',
+  'foo_6931',
+  'foo_6932',
+  'foo_6933',
+  'foo_6934',
+  'foo_6935',
+  'foo_6936',
+  'foo_6937',
+  'foo_6938',
+  'foo_6939',
+  'foo_6940',
+  'foo_6941',
+  'foo_6942',
+  'foo_6943',
+  'foo_6944',
+  'foo_6945',
+  'foo_6946',
+  'foo_6947',
+  'foo_6948',
+  'foo_6949',
+  'foo_6950',
+  'foo_6951',
+  'foo_6952',
+  'foo_6953',
+  'foo_6954',
+  'foo_6955',
+  'foo_6956',
+  'foo_6957',
+  'foo_6958',
+  'foo_6959',
+  'foo_6960',
+  'foo_6961',
+  'foo_6962',
+  'foo_6963',
+  'foo_6964',
+  'foo_6965',
+  'foo_6966',
+  'foo_6967',
+  'foo_6968',
+  'foo_6969',
+  'foo_6970',
+  'foo_6971',
+  'foo_6972',
+  'foo_6973',
+  'foo_6974',
+  'foo_6975',
+  'foo_6976',
+  'foo_6977',
+  'foo_6978',
+  'foo_6979',
+  'foo_6980',
+  'foo_6981',
+  'foo_6982',
+  'foo_6983',
+  'foo_6984',
+  'foo_6985',
+  'foo_6986',
+  'foo_6987',
+  'foo_6988',
+  'foo_6989',
+  'foo_6990',
+  'foo_6991',
+  'foo_6992',
+  'foo_6993',
+  'foo_6994',
+  'foo_6995',
+  'foo_6996',
+  'foo_6997',
+  'foo_6998',
+  'foo_6999',
+  'foo_7000',
+  'foo_7001',
+  'foo_7002',
+  'foo_7003',
+  'foo_7004',
+  'foo_7005',
+  'foo_7006',
+  'foo_7007',
+  'foo_7008',
+  'foo_7009',
+  'foo_7010',
+  'foo_7011',
+  'foo_7012',
+  'foo_7013',
+  'foo_7014',
+  'foo_7015',
+  'foo_7016',
+  'foo_7017',
+  'foo_7018',
+  'foo_7019',
+  'foo_7020',
+  'foo_7021',
+  'foo_7022',
+  'foo_7023',
+  'foo_7024',
+  'foo_7025',
+  'foo_7026',
+  'foo_7027',
+  'foo_7028',
+  'foo_7029',
+  'foo_7030',
+  'foo_7031',
+  'foo_7032',
+  'foo_7033',
+  'foo_7034',
+  'foo_7035',
+  'foo_7036',
+  'foo_7037',
+  'foo_7038',
+  'foo_7039',
+  'foo_7040',
+  'foo_7041',
+  'foo_7042',
+  'foo_7043',
+  'foo_7044',
+  'foo_7045',
+  'foo_7046',
+  'foo_7047',
+  'foo_7048',
+  'foo_7049',
+  'foo_7050',
+  'foo_7051',
+  'foo_7052',
+  'foo_7053',
+  'foo_7054',
+  'foo_7055',
+  'foo_7056',
+  'foo_7057',
+  'foo_7058',
+  'foo_7059',
+  'foo_7060',
+  'foo_7061',
+  'foo_7062',
+  'foo_7063',
+  'foo_7064',
+  'foo_7065',
+  'foo_7066',
+  'foo_7067',
+  'foo_7068',
+  'foo_7069',
+  'foo_7070',
+  'foo_7071',
+  'foo_7072',
+  'foo_7073',
+  'foo_7074',
+  'foo_7075',
+  'foo_7076',
+  'foo_7077',
+  'foo_7078',
+  'foo_7079',
+  'foo_7080',
+  'foo_7081',
+  'foo_7082',
+  'foo_7083',
+  'foo_7084',
+  'foo_7085',
+  'foo_7086',
+  'foo_7087',
+  'foo_7088',
+  'foo_7089',
+  'foo_7090',
+  'foo_7091',
+  'foo_7092',
+  'foo_7093',
+  'foo_7094',
+  'foo_7095',
+  'foo_7096',
+  'foo_7097',
+  'foo_7098',
+  'foo_7099',
+  'foo_7100',
+  'foo_7101',
+  'foo_7102',
+  'foo_7103',
+  'foo_7104',
+  'foo_7105',
+  'foo_7106',
+  'foo_7107',
+  'foo_7108',
+  'foo_7109',
+  'foo_7110',
+  'foo_7111',
+  'foo_7112',
+  'foo_7113',
+  'foo_7114',
+  'foo_7115',
+  'foo_7116',
+  'foo_7117',
+  'foo_7118',
+  'foo_7119',
+  'foo_7120',
+  'foo_7121',
+  'foo_7122',
+  'foo_7123',
+  'foo_7124',
+  'foo_7125',
+  'foo_7126',
+  'foo_7127',
+  'foo_7128',
+  'foo_7129',
+  'foo_7130',
+  'foo_7131',
+  'foo_7132',
+  'foo_7133',
+  'foo_7134',
+  'foo_7135',
+  'foo_7136',
+  'foo_7137',
+  'foo_7138',
+  'foo_7139',
+  'foo_7140',
+  'foo_7141',
+  'foo_7142',
+  'foo_7143',
+  'foo_7144',
+  'foo_7145',
+  'foo_7146',
+  'foo_7147',
+  'foo_7148',
+  'foo_7149',
+  'foo_7150',
+  'foo_7151',
+  'foo_7152',
+  'foo_7153',
+  'foo_7154',
+  'foo_7155',
+  'foo_7156',
+  'foo_7157',
+  'foo_7158',
+  'foo_7159',
+  'foo_7160',
+  'foo_7161',
+  'foo_7162',
+  'foo_7163',
+  'foo_7164',
+  'foo_7165',
+  'foo_7166',
+  'foo_7167',
+  'foo_7168',
+  'foo_7169',
+  'foo_7170',
+  'foo_7171',
+  'foo_7172',
+  'foo_7173',
+  'foo_7174',
+  'foo_7175',
+  'foo_7176',
+  'foo_7177',
+  'foo_7178',
+  'foo_7179',
+  'foo_7180',
+  'foo_7181',
+  'foo_7182',
+  'foo_7183',
+  'foo_7184',
+  'foo_7185',
+  'foo_7186',
+  'foo_7187',
+  'foo_7188',
+  'foo_7189',
+  'foo_7190',
+  'foo_7191',
+  'foo_7192',
+  'foo_7193',
+  'foo_7194',
+  'foo_7195',
+  'foo_7196',
+  'foo_7197',
+  'foo_7198',
+  'foo_7199',
+  'foo_7200',
+  'foo_7201',
+  'foo_7202',
+  'foo_7203',
+  'foo_7204',
+  'foo_7205',
+  'foo_7206',
+  'foo_7207',
+  'foo_7208',
+  'foo_7209',
+  'foo_7210',
+  'foo_7211',
+  'foo_7212',
+  'foo_7213',
+  'foo_7214',
+  'foo_7215',
+  'foo_7216',
+  'foo_7217',
+  'foo_7218',
+  'foo_7219',
+  'foo_7220',
+  'foo_7221',
+  'foo_7222',
+  'foo_7223',
+  'foo_7224',
+  'foo_7225',
+  'foo_7226',
+  'foo_7227',
+  'foo_7228',
+  'foo_7229',
+  'foo_7230',
+  'foo_7231',
+  'foo_7232',
+  'foo_7233',
+  'foo_7234',
+  'foo_7235',
+  'foo_7236',
+  'foo_7237',
+  'foo_7238',
+  'foo_7239',
+  'foo_7240',
+  'foo_7241',
+  'foo_7242',
+  'foo_7243',
+  'foo_7244',
+  'foo_7245',
+  'foo_7246',
+  'foo_7247',
+  'foo_7248',
+  'foo_7249',
+  'foo_7250',
+  'foo_7251',
+  'foo_7252',
+  'foo_7253',
+  'foo_7254',
+  'foo_7255',
+  'foo_7256',
+  'foo_7257',
+  'foo_7258',
+  'foo_7259',
+  'foo_7260',
+  'foo_7261',
+  'foo_7262',
+  'foo_7263',
+  'foo_7264',
+  'foo_7265',
+  'foo_7266',
+  'foo_7267',
+  'foo_7268',
+  'foo_7269',
+  'foo_7270',
+  'foo_7271',
+  'foo_7272',
+  'foo_7273',
+  'foo_7274',
+  'foo_7275',
+  'foo_7276',
+  'foo_7277',
+  'foo_7278',
+  'foo_7279',
+  'foo_7280',
+  'foo_7281',
+  'foo_7282',
+  'foo_7283',
+  'foo_7284',
+  'foo_7285',
+  'foo_7286',
+  'foo_7287',
+  'foo_7288',
+  'foo_7289',
+  'foo_7290',
+  'foo_7291',
+  'foo_7292',
+  'foo_7293',
+  'foo_7294',
+  'foo_7295',
+  'foo_7296',
+  'foo_7297',
+  'foo_7298',
+  'foo_7299',
+  'foo_7300',
+  'foo_7301',
+  'foo_7302',
+  'foo_7303',
+  'foo_7304',
+  'foo_7305',
+  'foo_7306',
+  'foo_7307',
+  'foo_7308',
+  'foo_7309',
+  'foo_7310',
+  'foo_7311',
+  'foo_7312',
+  'foo_7313',
+  'foo_7314',
+  'foo_7315',
+  'foo_7316',
+  'foo_7317',
+  'foo_7318',
+  'foo_7319',
+  'foo_7320',
+  'foo_7321',
+  'foo_7322',
+  'foo_7323',
+  'foo_7324',
+  'foo_7325',
+  'foo_7326',
+  'foo_7327',
+  'foo_7328',
+  'foo_7329',
+  'foo_7330',
+  'foo_7331',
+  'foo_7332',
+  'foo_7333',
+  'foo_7334',
+  'foo_7335',
+  'foo_7336',
+  'foo_7337',
+  'foo_7338',
+  'foo_7339',
+  'foo_7340',
+  'foo_7341',
+  'foo_7342',
+  'foo_7343',
+  'foo_7344',
+  'foo_7345',
+  'foo_7346',
+  'foo_7347',
+  'foo_7348',
+  'foo_7349',
+  'foo_7350',
+  'foo_7351',
+  'foo_7352',
+  'foo_7353',
+  'foo_7354',
+  'foo_7355',
+  'foo_7356',
+  'foo_7357',
+  'foo_7358',
+  'foo_7359',
+  'foo_7360',
+  'foo_7361',
+  'foo_7362',
+  'foo_7363',
+  'foo_7364',
+  'foo_7365',
+  'foo_7366',
+  'foo_7367',
+  'foo_7368',
+  'foo_7369',
+  'foo_7370',
+  'foo_7371',
+  'foo_7372',
+  'foo_7373',
+  'foo_7374',
+  'foo_7375',
+  'foo_7376',
+  'foo_7377',
+  'foo_7378',
+  'foo_7379',
+  'foo_7380',
+  'foo_7381',
+  'foo_7382',
+  'foo_7383',
+  'foo_7384',
+  'foo_7385',
+  'foo_7386',
+  'foo_7387',
+  'foo_7388',
+  'foo_7389',
+  'foo_7390',
+  'foo_7391',
+  'foo_7392',
+  'foo_7393',
+  'foo_7394',
+  'foo_7395',
+  'foo_7396',
+  'foo_7397',
+  'foo_7398',
+  'foo_7399',
+  'foo_7400',
+  'foo_7401',
+  'foo_7402',
+  'foo_7403',
+  'foo_7404',
+  'foo_7405',
+  'foo_7406',
+  'foo_7407',
+  'foo_7408',
+  'foo_7409',
+  'foo_7410',
+  'foo_7411',
+  'foo_7412',
+  'foo_7413',
+  'foo_7414',
+  'foo_7415',
+  'foo_7416',
+  'foo_7417',
+  'foo_7418',
+  'foo_7419',
+  'foo_7420',
+  'foo_7421',
+  'foo_7422',
+  'foo_7423',
+  'foo_7424',
+  'foo_7425',
+  'foo_7426',
+  'foo_7427',
+  'foo_7428',
+  'foo_7429',
+  'foo_7430',
+  'foo_7431',
+  'foo_7432',
+  'foo_7433',
+  'foo_7434',
+  'foo_7435',
+  'foo_7436',
+  'foo_7437',
+  'foo_7438',
+  'foo_7439',
+  'foo_7440',
+  'foo_7441',
+  'foo_7442',
+  'foo_7443',
+  'foo_7444',
+  'foo_7445',
+  'foo_7446',
+  'foo_7447',
+  'foo_7448',
+  'foo_7449',
+  'foo_7450',
+  'foo_7451',
+  'foo_7452',
+  'foo_7453',
+  'foo_7454',
+  'foo_7455',
+  'foo_7456',
+  'foo_7457',
+  'foo_7458',
+  'foo_7459',
+  'foo_7460',
+  'foo_7461',
+  'foo_7462',
+  'foo_7463',
+  'foo_7464',
+  'foo_7465',
+  'foo_7466',
+  'foo_7467',
+  'foo_7468',
+  'foo_7469',
+  'foo_7470',
+  'foo_7471',
+  'foo_7472',
+  'foo_7473',
+  'foo_7474',
+  'foo_7475',
+  'foo_7476',
+  'foo_7477',
+  'foo_7478',
+  'foo_7479',
+  'foo_7480',
+  'foo_7481',
+  'foo_7482',
+  'foo_7483',
+  'foo_7484',
+  'foo_7485',
+  'foo_7486',
+  'foo_7487',
+  'foo_7488',
+  'foo_7489',
+  'foo_7490',
+  'foo_7491',
+  'foo_7492',
+  'foo_7493',
+  'foo_7494',
+  'foo_7495',
+  'foo_7496',
+  'foo_7497',
+  'foo_7498',
+  'foo_7499',
+  'foo_7500',
+  'foo_7501',
+  'foo_7502',
+  'foo_7503',
+  'foo_7504',
+  'foo_7505',
+  'foo_7506',
+  'foo_7507',
+  'foo_7508',
+  'foo_7509',
+  'foo_7510',
+  'foo_7511',
+  'foo_7512',
+  'foo_7513',
+  'foo_7514',
+  'foo_7515',
+  'foo_7516',
+  'foo_7517',
+  'foo_7518',
+  'foo_7519',
+  'foo_7520',
+  'foo_7521',
+  'foo_7522',
+  'foo_7523',
+  'foo_7524',
+  'foo_7525',
+  'foo_7526',
+  'foo_7527',
+  'foo_7528',
+  'foo_7529',
+  'foo_7530',
+  'foo_7531',
+  'foo_7532',
+  'foo_7533',
+  'foo_7534',
+  'foo_7535',
+  'foo_7536',
+  'foo_7537',
+  'foo_7538',
+  'foo_7539',
+  'foo_7540',
+  'foo_7541',
+  'foo_7542',
+  'foo_7543',
+  'foo_7544',
+  'foo_7545',
+  'foo_7546',
+  'foo_7547',
+  'foo_7548',
+  'foo_7549',
+  'foo_7550',
+  'foo_7551',
+  'foo_7552',
+  'foo_7553',
+  'foo_7554',
+  'foo_7555',
+  'foo_7556',
+  'foo_7557',
+  'foo_7558',
+  'foo_7559',
+  'foo_7560',
+  'foo_7561',
+  'foo_7562',
+  'foo_7563',
+  'foo_7564',
+  'foo_7565',
+  'foo_7566',
+  'foo_7567',
+  'foo_7568',
+  'foo_7569',
+  'foo_7570',
+  'foo_7571',
+  'foo_7572',
+  'foo_7573',
+  'foo_7574',
+  'foo_7575',
+  'foo_7576',
+  'foo_7577',
+  'foo_7578',
+  'foo_7579',
+  'foo_7580',
+  'foo_7581',
+  'foo_7582',
+  'foo_7583',
+  'foo_7584',
+  'foo_7585',
+  'foo_7586',
+  'foo_7587',
+  'foo_7588',
+  'foo_7589',
+  'foo_7590',
+  'foo_7591',
+  'foo_7592',
+  'foo_7593',
+  'foo_7594',
+  'foo_7595',
+  'foo_7596',
+  'foo_7597',
+  'foo_7598',
+  'foo_7599',
+  'foo_7600',
+  'foo_7601',
+  'foo_7602',
+  'foo_7603',
+  'foo_7604',
+  'foo_7605',
+  'foo_7606',
+  'foo_7607',
+  'foo_7608',
+  'foo_7609',
+  'foo_7610',
+  'foo_7611',
+  'foo_7612',
+  'foo_7613',
+  'foo_7614',
+  'foo_7615',
+  'foo_7616',
+  'foo_7617',
+  'foo_7618',
+  'foo_7619',
+  'foo_7620',
+  'foo_7621',
+  'foo_7622',
+  'foo_7623',
+  'foo_7624',
+  'foo_7625',
+  'foo_7626',
+  'foo_7627',
+  'foo_7628',
+  'foo_7629',
+  'foo_7630',
+  'foo_7631',
+  'foo_7632',
+  'foo_7633',
+  'foo_7634',
+  'foo_7635',
+  'foo_7636',
+  'foo_7637',
+  'foo_7638',
+  'foo_7639',
+  'foo_7640',
+  'foo_7641',
+  'foo_7642',
+  'foo_7643',
+  'foo_7644',
+  'foo_7645',
+  'foo_7646',
+  'foo_7647',
+  'foo_7648',
+  'foo_7649',
+  'foo_7650',
+  'foo_7651',
+  'foo_7652',
+  'foo_7653',
+  'foo_7654',
+  'foo_7655',
+  'foo_7656',
+  'foo_7657',
+  'foo_7658',
+  'foo_7659',
+  'foo_7660',
+  'foo_7661',
+  'foo_7662',
+  'foo_7663',
+  'foo_7664',
+  'foo_7665',
+  'foo_7666',
+  'foo_7667',
+  'foo_7668',
+  'foo_7669',
+  'foo_7670',
+  'foo_7671',
+  'foo_7672',
+  'foo_7673',
+  'foo_7674',
+  'foo_7675',
+  'foo_7676',
+  'foo_7677',
+  'foo_7678',
+  'foo_7679',
+  'foo_7680',
+  'foo_7681',
+  'foo_7682',
+  'foo_7683',
+  'foo_7684',
+  'foo_7685',
+  'foo_7686',
+  'foo_7687',
+  'foo_7688',
+  'foo_7689',
+  'foo_7690',
+  'foo_7691',
+  'foo_7692',
+  'foo_7693',
+  'foo_7694',
+  'foo_7695',
+  'foo_7696',
+  'foo_7697',
+  'foo_7698',
+  'foo_7699',
+  'foo_7700',
+  'foo_7701',
+  'foo_7702',
+  'foo_7703',
+  'foo_7704',
+  'foo_7705',
+  'foo_7706',
+  'foo_7707',
+  'foo_7708',
+  'foo_7709',
+  'foo_7710',
+  'foo_7711',
+  'foo_7712',
+  'foo_7713',
+  'foo_7714',
+  'foo_7715',
+  'foo_7716',
+  'foo_7717',
+  'foo_7718',
+  'foo_7719',
+  'foo_7720',
+  'foo_7721',
+  'foo_7722',
+  'foo_7723',
+  'foo_7724',
+  'foo_7725',
+  'foo_7726',
+  'foo_7727',
+  'foo_7728',
+  'foo_7729',
+  'foo_7730',
+  'foo_7731',
+  'foo_7732',
+  'foo_7733',
+  'foo_7734',
+  'foo_7735',
+  'foo_7736',
+  'foo_7737',
+  'foo_7738',
+  'foo_7739',
+  'foo_7740',
+  'foo_7741',
+  'foo_7742',
+  'foo_7743',
+  'foo_7744',
+  'foo_7745',
+  'foo_7746',
+  'foo_7747',
+  'foo_7748',
+  'foo_7749',
+  'foo_7750',
+  'foo_7751',
+  'foo_7752',
+  'foo_7753',
+  'foo_7754',
+  'foo_7755',
+  'foo_7756',
+  'foo_7757',
+  'foo_7758',
+  'foo_7759',
+  'foo_7760',
+  'foo_7761',
+  'foo_7762',
+  'foo_7763',
+  'foo_7764',
+  'foo_7765',
+  'foo_7766',
+  'foo_7767',
+  'foo_7768',
+  'foo_7769',
+  'foo_7770',
+  'foo_7771',
+  'foo_7772',
+  'foo_7773',
+  'foo_7774',
+  'foo_7775',
+  'foo_7776',
+  'foo_7777',
+  'foo_7778',
+  'foo_7779',
+  'foo_7780',
+  'foo_7781',
+  'foo_7782',
+  'foo_7783',
+  'foo_7784',
+  'foo_7785',
+  'foo_7786',
+  'foo_7787',
+  'foo_7788',
+  'foo_7789',
+  'foo_7790',
+  'foo_7791',
+  'foo_7792',
+  'foo_7793',
+  'foo_7794',
+  'foo_7795',
+  'foo_7796',
+  'foo_7797',
+  'foo_7798',
+  'foo_7799',
+  'foo_7800',
+  'foo_7801',
+  'foo_7802',
+  'foo_7803',
+  'foo_7804',
+  'foo_7805',
+  'foo_7806',
+  'foo_7807',
+  'foo_7808',
+  'foo_7809',
+  'foo_7810',
+  'foo_7811',
+  'foo_7812',
+  'foo_7813',
+  'foo_7814',
+  'foo_7815',
+  'foo_7816',
+  'foo_7817',
+  'foo_7818',
+  'foo_7819',
+  'foo_7820',
+  'foo_7821',
+  'foo_7822',
+  'foo_7823',
+  'foo_7824',
+  'foo_7825',
+  'foo_7826',
+  'foo_7827',
+  'foo_7828',
+  'foo_7829',
+  'foo_7830',
+  'foo_7831',
+  'foo_7832',
+  'foo_7833',
+  'foo_7834',
+  'foo_7835',
+  'foo_7836',
+  'foo_7837',
+  'foo_7838',
+  'foo_7839',
+  'foo_7840',
+  'foo_7841',
+  'foo_7842',
+  'foo_7843',
+  'foo_7844',
+  'foo_7845',
+  'foo_7846',
+  'foo_7847',
+  'foo_7848',
+  'foo_7849',
+  'foo_7850',
+  'foo_7851',
+  'foo_7852',
+  'foo_7853',
+  'foo_7854',
+  'foo_7855',
+  'foo_7856',
+  'foo_7857',
+  'foo_7858',
+  'foo_7859',
+  'foo_7860',
+  'foo_7861',
+  'foo_7862',
+  'foo_7863',
+  'foo_7864',
+  'foo_7865',
+  'foo_7866',
+  'foo_7867',
+  'foo_7868',
+  'foo_7869',
+  'foo_7870',
+  'foo_7871',
+  'foo_7872',
+  'foo_7873',
+  'foo_7874',
+  'foo_7875',
+  'foo_7876',
+  'foo_7877',
+  'foo_7878',
+  'foo_7879',
+  'foo_7880',
+  'foo_7881',
+  'foo_7882',
+  'foo_7883',
+  'foo_7884',
+  'foo_7885',
+  'foo_7886',
+  'foo_7887',
+  'foo_7888',
+  'foo_7889',
+  'foo_7890',
+  'foo_7891',
+  'foo_7892',
+  'foo_7893',
+  'foo_7894',
+  'foo_7895',
+  'foo_7896',
+  'foo_7897',
+  'foo_7898',
+  'foo_7899',
+  'foo_7900',
+  'foo_7901',
+  'foo_7902',
+  'foo_7903',
+  'foo_7904',
+  'foo_7905',
+  'foo_7906',
+  'foo_7907',
+  'foo_7908',
+  'foo_7909',
+  'foo_7910',
+  'foo_7911',
+  'foo_7912',
+  'foo_7913',
+  'foo_7914',
+  'foo_7915',
+  'foo_7916',
+  'foo_7917',
+  'foo_7918',
+  'foo_7919',
+  'foo_7920',
+  'foo_7921',
+  'foo_7922',
+  'foo_7923',
+  'foo_7924',
+  'foo_7925',
+  'foo_7926',
+  'foo_7927',
+  'foo_7928',
+  'foo_7929',
+  'foo_7930',
+  'foo_7931',
+  'foo_7932',
+  'foo_7933',
+  'foo_7934',
+  'foo_7935',
+  'foo_7936',
+  'foo_7937',
+  'foo_7938',
+  'foo_7939',
+  'foo_7940',
+  'foo_7941',
+  'foo_7942',
+  'foo_7943',
+  'foo_7944',
+  'foo_7945',
+  'foo_7946',
+  'foo_7947',
+  'foo_7948',
+  'foo_7949',
+  'foo_7950',
+  'foo_7951',
+  'foo_7952',
+  'foo_7953',
+  'foo_7954',
+  'foo_7955',
+  'foo_7956',
+  'foo_7957',
+  'foo_7958',
+  'foo_7959',
+  'foo_7960',
+  'foo_7961',
+  'foo_7962',
+  'foo_7963',
+  'foo_7964',
+  'foo_7965',
+  'foo_7966',
+  'foo_7967',
+  'foo_7968',
+  'foo_7969',
+  'foo_7970',
+  'foo_7971',
+  'foo_7972',
+  'foo_7973',
+  'foo_7974',
+  'foo_7975',
+  'foo_7976',
+  'foo_7977',
+  'foo_7978',
+  'foo_7979',
+  'foo_7980',
+  'foo_7981',
+  'foo_7982',
+  'foo_7983',
+  'foo_7984',
+  'foo_7985',
+  'foo_7986',
+  'foo_7987',
+  'foo_7988',
+  'foo_7989',
+  'foo_7990',
+  'foo_7991',
+  'foo_7992',
+  'foo_7993',
+  'foo_7994',
+  'foo_7995',
+  'foo_7996',
+  'foo_7997',
+  'foo_7998',
+  'foo_7999',
+  'foo_8000',
+  'foo_8001',
+  'foo_8002',
+  'foo_8003',
+  'foo_8004',
+  'foo_8005',
+  'foo_8006',
+  'foo_8007',
+  'foo_8008',
+  'foo_8009',
+  'foo_8010',
+  'foo_8011',
+  'foo_8012',
+  'foo_8013',
+  'foo_8014',
+  'foo_8015',
+  'foo_8016',
+  'foo_8017',
+  'foo_8018',
+  'foo_8019',
+  'foo_8020',
+  'foo_8021',
+  'foo_8022',
+  'foo_8023',
+  'foo_8024',
+  'foo_8025',
+  'foo_8026',
+  'foo_8027',
+  'foo_8028',
+  'foo_8029',
+  'foo_8030',
+  'foo_8031',
+  'foo_8032',
+  'foo_8033',
+  'foo_8034',
+  'foo_8035',
+  'foo_8036',
+  'foo_8037',
+  'foo_8038',
+  'foo_8039',
+  'foo_8040',
+  'foo_8041',
+  'foo_8042',
+  'foo_8043',
+  'foo_8044',
+  'foo_8045',
+  'foo_8046',
+  'foo_8047',
+  'foo_8048',
+  'foo_8049',
+  'foo_8050',
+  'foo_8051',
+  'foo_8052',
+  'foo_8053',
+  'foo_8054',
+  'foo_8055',
+  'foo_8056',
+  'foo_8057',
+  'foo_8058',
+  'foo_8059',
+  'foo_8060',
+  'foo_8061',
+  'foo_8062',
+  'foo_8063',
+  'foo_8064',
+  'foo_8065',
+  'foo_8066',
+  'foo_8067',
+  'foo_8068',
+  'foo_8069',
+  'foo_8070',
+  'foo_8071',
+  'foo_8072',
+  'foo_8073',
+  'foo_8074',
+  'foo_8075',
+  'foo_8076',
+  'foo_8077',
+  'foo_8078',
+  'foo_8079',
+  'foo_8080',
+  'foo_8081',
+  'foo_8082',
+  'foo_8083',
+  'foo_8084',
+  'foo_8085',
+  'foo_8086',
+  'foo_8087',
+  'foo_8088',
+  'foo_8089',
+  'foo_8090',
+  'foo_8091',
+  'foo_8092',
+  'foo_8093',
+  'foo_8094',
+  'foo_8095',
+  'foo_8096',
+  'foo_8097',
+  'foo_8098',
+  'foo_8099',
+  'foo_8100',
+  'foo_8101',
+  'foo_8102',
+  'foo_8103',
+  'foo_8104',
+  'foo_8105',
+  'foo_8106',
+  'foo_8107',
+  'foo_8108',
+  'foo_8109',
+  'foo_8110',
+  'foo_8111',
+  'foo_8112',
+  'foo_8113',
+  'foo_8114',
+  'foo_8115',
+  'foo_8116',
+  'foo_8117',
+  'foo_8118',
+  'foo_8119',
+  'foo_8120',
+  'foo_8121',
+  'foo_8122',
+  'foo_8123',
+  'foo_8124',
+  'foo_8125',
+  'foo_8126',
+  'foo_8127',
+  'foo_8128',
+  'foo_8129',
+  'foo_8130',
+  'foo_8131',
+  'foo_8132',
+  'foo_8133',
+  'foo_8134',
+  'foo_8135',
+  'foo_8136',
+  'foo_8137',
+  'foo_8138',
+  'foo_8139',
+  'foo_8140',
+  'foo_8141',
+  'foo_8142',
+  'foo_8143',
+  'foo_8144',
+  'foo_8145',
+  'foo_8146',
+  'foo_8147',
+  'foo_8148',
+  'foo_8149',
+  'foo_8150',
+  'foo_8151',
+  'foo_8152',
+  'foo_8153',
+  'foo_8154',
+  'foo_8155',
+  'foo_8156',
+  'foo_8157',
+  'foo_8158',
+  'foo_8159',
+  'foo_8160',
+  'foo_8161',
+  'foo_8162',
+  'foo_8163',
+  'foo_8164',
+  'foo_8165',
+  'foo_8166',
+  'foo_8167',
+  'foo_8168',
+  'foo_8169',
+  'foo_8170',
+  'foo_8171',
+  'foo_8172',
+  'foo_8173',
+  'foo_8174',
+  'foo_8175',
+  'foo_8176',
+  'foo_8177',
+  'foo_8178',
+  'foo_8179',
+  'foo_8180',
+  'foo_8181',
+  'foo_8182',
+  'foo_8183',
+  'foo_8184',
+  'foo_8185',
+  'foo_8186',
+  'foo_8187',
+  'foo_8188',
+  'foo_8189',
+  'foo_8190',
+  'foo_8191',
+  'foo_8192',
+  'foo_8193',
+  'foo_8194',
+  'foo_8195',
+  'foo_8196',
+  'foo_8197',
+  'foo_8198',
+  'foo_8199',
+  'foo_8200',
+  'foo_8201',
+  'foo_8202',
+  'foo_8203',
+  'foo_8204',
+  'foo_8205',
+  'foo_8206',
+  'foo_8207',
+  'foo_8208',
+  'foo_8209',
+  'foo_8210',
+  'foo_8211',
+  'foo_8212',
+  'foo_8213',
+  'foo_8214',
+  'foo_8215',
+  'foo_8216',
+  'foo_8217',
+  'foo_8218',
+  'foo_8219',
+  'foo_8220',
+  'foo_8221',
+  'foo_8222',
+  'foo_8223',
+  'foo_8224',
+  'foo_8225',
+  'foo_8226',
+  'foo_8227',
+  'foo_8228',
+  'foo_8229',
+  'foo_8230',
+  'foo_8231',
+  'foo_8232',
+  'foo_8233',
+  'foo_8234',
+  'foo_8235',
+  'foo_8236',
+  'foo_8237',
+  'foo_8238',
+  'foo_8239',
+  'foo_8240',
+  'foo_8241',
+  'foo_8242',
+  'foo_8243',
+  'foo_8244',
+  'foo_8245',
+  'foo_8246',
+  'foo_8247',
+  'foo_8248',
+  'foo_8249',
+  'foo_8250',
+  'foo_8251',
+  'foo_8252',
+  'foo_8253',
+  'foo_8254',
+  'foo_8255',
+  'foo_8256',
+  'foo_8257',
+  'foo_8258',
+  'foo_8259',
+  'foo_8260',
+  'foo_8261',
+  'foo_8262',
+  'foo_8263',
+  'foo_8264',
+  'foo_8265',
+  'foo_8266',
+  'foo_8267',
+  'foo_8268',
+  'foo_8269',
+  'foo_8270',
+  'foo_8271',
+  'foo_8272',
+  'foo_8273',
+  'foo_8274',
+  'foo_8275',
+  'foo_8276',
+  'foo_8277',
+  'foo_8278',
+  'foo_8279',
+  'foo_8280',
+  'foo_8281',
+  'foo_8282',
+  'foo_8283',
+  'foo_8284',
+  'foo_8285',
+  'foo_8286',
+  'foo_8287',
+  'foo_8288',
+  'foo_8289',
+  'foo_8290',
+  'foo_8291',
+  'foo_8292',
+  'foo_8293',
+  'foo_8294',
+  'foo_8295',
+  'foo_8296',
+  'foo_8297',
+  'foo_8298',
+  'foo_8299',
+  'foo_8300',
+  'foo_8301',
+  'foo_8302',
+  'foo_8303',
+  'foo_8304',
+  'foo_8305',
+  'foo_8306',
+  'foo_8307',
+  'foo_8308',
+  'foo_8309',
+  'foo_8310',
+  'foo_8311',
+  'foo_8312',
+  'foo_8313',
+  'foo_8314',
+  'foo_8315',
+  'foo_8316',
+  'foo_8317',
+  'foo_8318',
+  'foo_8319',
+  'foo_8320',
+  'foo_8321',
+  'foo_8322',
+  'foo_8323',
+  'foo_8324',
+  'foo_8325',
+  'foo_8326',
+  'foo_8327',
+  'foo_8328',
+  'foo_8329',
+  'foo_8330',
+  'foo_8331',
+  'foo_8332',
+  'foo_8333',
+  'foo_8334',
+  'foo_8335',
+  'foo_8336',
+  'foo_8337',
+  'foo_8338',
+  'foo_8339',
+  'foo_8340',
+  'foo_8341',
+  'foo_8342',
+  'foo_8343',
+  'foo_8344',
+  'foo_8345',
+  'foo_8346',
+  'foo_8347',
+  'foo_8348',
+  'foo_8349',
+  'foo_8350',
+  'foo_8351',
+  'foo_8352',
+  'foo_8353',
+  'foo_8354',
+  'foo_8355',
+  'foo_8356',
+  'foo_8357',
+  'foo_8358',
+  'foo_8359',
+  'foo_8360',
+  'foo_8361',
+  'foo_8362',
+  'foo_8363',
+  'foo_8364',
+  'foo_8365',
+  'foo_8366',
+  'foo_8367',
+  'foo_8368',
+  'foo_8369',
+  'foo_8370',
+  'foo_8371',
+  'foo_8372',
+  'foo_8373',
+  'foo_8374',
+  'foo_8375',
+  'foo_8376',
+  'foo_8377',
+  'foo_8378',
+  'foo_8379',
+  'foo_8380',
+  'foo_8381',
+  'foo_8382',
+  'foo_8383',
+  'foo_8384',
+  'foo_8385',
+  'foo_8386',
+  'foo_8387',
+  'foo_8388',
+  'foo_8389',
+  'foo_8390',
+  'foo_8391',
+  'foo_8392',
+  'foo_8393',
+  'foo_8394',
+  'foo_8395',
+  'foo_8396',
+  'foo_8397',
+  'foo_8398',
+  'foo_8399',
+  'foo_8400',
+  'foo_8401',
+  'foo_8402',
+  'foo_8403',
+  'foo_8404',
+  'foo_8405',
+  'foo_8406',
+  'foo_8407',
+  'foo_8408',
+  'foo_8409',
+  'foo_8410',
+  'foo_8411',
+  'foo_8412',
+  'foo_8413',
+  'foo_8414',
+  'foo_8415',
+  'foo_8416',
+  'foo_8417',
+  'foo_8418',
+  'foo_8419',
+  'foo_8420',
+  'foo_8421',
+  'foo_8422',
+  'foo_8423',
+  'foo_8424',
+  'foo_8425',
+  'foo_8426',
+  'foo_8427',
+  'foo_8428',
+  'foo_8429',
+  'foo_8430',
+  'foo_8431',
+  'foo_8432',
+  'foo_8433',
+  'foo_8434',
+  'foo_8435',
+  'foo_8436',
+  'foo_8437',
+  'foo_8438',
+  'foo_8439',
+  'foo_8440',
+  'foo_8441',
+  'foo_8442',
+  'foo_8443',
+  'foo_8444',
+  'foo_8445',
+  'foo_8446',
+  'foo_8447',
+  'foo_8448',
+  'foo_8449',
+  'foo_8450',
+  'foo_8451',
+  'foo_8452',
+  'foo_8453',
+  'foo_8454',
+  'foo_8455',
+  'foo_8456',
+  'foo_8457',
+  'foo_8458',
+  'foo_8459',
+  'foo_8460',
+  'foo_8461',
+  'foo_8462',
+  'foo_8463',
+  'foo_8464',
+  'foo_8465',
+  'foo_8466',
+  'foo_8467',
+  'foo_8468',
+  'foo_8469',
+  'foo_8470',
+  'foo_8471',
+  'foo_8472',
+  'foo_8473',
+  'foo_8474',
+  'foo_8475',
+  'foo_8476',
+  'foo_8477',
+  'foo_8478',
+  'foo_8479',
+  'foo_8480',
+  'foo_8481',
+  'foo_8482',
+  'foo_8483',
+  'foo_8484',
+  'foo_8485',
+  'foo_8486',
+  'foo_8487',
+  'foo_8488',
+  'foo_8489',
+  'foo_8490',
+  'foo_8491',
+  'foo_8492',
+  'foo_8493',
+  'foo_8494',
+  'foo_8495',
+  'foo_8496',
+  'foo_8497',
+  'foo_8498',
+  'foo_8499',
+  'foo_8500',
+  'foo_8501',
+  'foo_8502',
+  'foo_8503',
+  'foo_8504',
+  'foo_8505',
+  'foo_8506',
+  'foo_8507',
+  'foo_8508',
+  'foo_8509',
+  'foo_8510',
+  'foo_8511',
+  'foo_8512',
+  'foo_8513',
+  'foo_8514',
+  'foo_8515',
+  'foo_8516',
+  'foo_8517',
+  'foo_8518',
+  'foo_8519',
+  'foo_8520',
+  'foo_8521',
+  'foo_8522',
+  'foo_8523',
+  'foo_8524',
+  'foo_8525',
+  'foo_8526',
+  'foo_8527',
+  'foo_8528',
+  'foo_8529',
+  'foo_8530',
+  'foo_8531',
+  'foo_8532',
+  'foo_8533',
+  'foo_8534',
+  'foo_8535',
+  'foo_8536',
+  'foo_8537',
+  'foo_8538',
+  'foo_8539',
+  'foo_8540',
+  'foo_8541',
+  'foo_8542',
+  'foo_8543',
+  'foo_8544',
+  'foo_8545',
+  'foo_8546',
+  'foo_8547',
+  'foo_8548',
+  'foo_8549',
+  'foo_8550',
+  'foo_8551',
+  'foo_8552',
+  'foo_8553',
+  'foo_8554',
+  'foo_8555',
+  'foo_8556',
+  'foo_8557',
+  'foo_8558',
+  'foo_8559',
+  'foo_8560',
+  'foo_8561',
+  'foo_8562',
+  'foo_8563',
+  'foo_8564',
+  'foo_8565',
+  'foo_8566',
+  'foo_8567',
+  'foo_8568',
+  'foo_8569',
+  'foo_8570',
+  'foo_8571',
+  'foo_8572',
+  'foo_8573',
+  'foo_8574',
+  'foo_8575',
+  'foo_8576',
+  'foo_8577',
+  'foo_8578',
+  'foo_8579',
+  'foo_8580',
+  'foo_8581',
+  'foo_8582',
+  'foo_8583',
+  'foo_8584',
+  'foo_8585',
+  'foo_8586',
+  'foo_8587',
+  'foo_8588',
+  'foo_8589',
+  'foo_8590',
+  'foo_8591',
+  'foo_8592',
+  'foo_8593',
+  'foo_8594',
+  'foo_8595',
+  'foo_8596',
+  'foo_8597',
+  'foo_8598',
+  'foo_8599',
+  'foo_8600',
+  'foo_8601',
+  'foo_8602',
+  'foo_8603',
+  'foo_8604',
+  'foo_8605',
+  'foo_8606',
+  'foo_8607',
+  'foo_8608',
+  'foo_8609',
+  'foo_8610',
+  'foo_8611',
+  'foo_8612',
+  'foo_8613',
+  'foo_8614',
+  'foo_8615',
+  'foo_8616',
+  'foo_8617',
+  'foo_8618',
+  'foo_8619',
+  'foo_8620',
+  'foo_8621',
+  'foo_8622',
+  'foo_8623',
+  'foo_8624',
+  'foo_8625',
+  'foo_8626',
+  'foo_8627',
+  'foo_8628',
+  'foo_8629',
+  'foo_8630',
+  'foo_8631',
+  'foo_8632',
+  'foo_8633',
+  'foo_8634',
+  'foo_8635',
+  'foo_8636',
+  'foo_8637',
+  'foo_8638',
+  'foo_8639',
+  'foo_8640',
+  'foo_8641',
+  'foo_8642',
+  'foo_8643',
+  'foo_8644',
+  'foo_8645',
+  'foo_8646',
+  'foo_8647',
+  'foo_8648',
+  'foo_8649',
+  'foo_8650',
+  'foo_8651',
+  'foo_8652',
+  'foo_8653',
+  'foo_8654',
+  'foo_8655',
+  'foo_8656',
+  'foo_8657',
+  'foo_8658',
+  'foo_8659',
+  'foo_8660',
+  'foo_8661',
+  'foo_8662',
+  'foo_8663',
+  'foo_8664',
+  'foo_8665',
+  'foo_8666',
+  'foo_8667',
+  'foo_8668',
+  'foo_8669',
+  'foo_8670',
+  'foo_8671',
+  'foo_8672',
+  'foo_8673',
+  'foo_8674',
+  'foo_8675',
+  'foo_8676',
+  'foo_8677',
+  'foo_8678',
+  'foo_8679',
+  'foo_8680',
+  'foo_8681',
+  'foo_8682',
+  'foo_8683',
+  'foo_8684',
+  'foo_8685',
+  'foo_8686',
+  'foo_8687',
+  'foo_8688',
+  'foo_8689',
+  'foo_8690',
+  'foo_8691',
+  'foo_8692',
+  'foo_8693',
+  'foo_8694',
+  'foo_8695',
+  'foo_8696',
+  'foo_8697',
+  'foo_8698',
+  'foo_8699',
+  'foo_8700',
+  'foo_8701',
+  'foo_8702',
+  'foo_8703',
+  'foo_8704',
+  'foo_8705',
+  'foo_8706',
+  'foo_8707',
+  'foo_8708',
+  'foo_8709',
+  'foo_8710',
+  'foo_8711',
+  'foo_8712',
+  'foo_8713',
+  'foo_8714',
+  'foo_8715',
+  'foo_8716',
+  'foo_8717',
+  'foo_8718',
+  'foo_8719',
+  'foo_8720',
+  'foo_8721',
+  'foo_8722',
+  'foo_8723',
+  'foo_8724',
+  'foo_8725',
+  'foo_8726',
+  'foo_8727',
+  'foo_8728',
+  'foo_8729',
+  'foo_8730',
+  'foo_8731',
+  'foo_8732',
+  'foo_8733',
+  'foo_8734',
+  'foo_8735',
+  'foo_8736',
+  'foo_8737',
+  'foo_8738',
+  'foo_8739',
+  'foo_8740',
+  'foo_8741',
+  'foo_8742',
+  'foo_8743',
+  'foo_8744',
+  'foo_8745',
+  'foo_8746',
+  'foo_8747',
+  'foo_8748',
+  'foo_8749',
+  'foo_8750',
+  'foo_8751',
+  'foo_8752',
+  'foo_8753',
+  'foo_8754',
+  'foo_8755',
+  'foo_8756',
+  'foo_8757',
+  'foo_8758',
+  'foo_8759',
+  'foo_8760',
+  'foo_8761',
+  'foo_8762',
+  'foo_8763',
+  'foo_8764',
+  'foo_8765',
+  'foo_8766',
+  'foo_8767',
+  'foo_8768',
+  'foo_8769',
+  'foo_8770',
+  'foo_8771',
+  'foo_8772',
+  'foo_8773',
+  'foo_8774',
+  'foo_8775',
+  'foo_8776',
+  'foo_8777',
+  'foo_8778',
+  'foo_8779',
+  'foo_8780',
+  'foo_8781',
+  'foo_8782',
+  'foo_8783',
+  'foo_8784',
+  'foo_8785',
+  'foo_8786',
+  'foo_8787',
+  'foo_8788',
+  'foo_8789',
+  'foo_8790',
+  'foo_8791',
+  'foo_8792',
+  'foo_8793',
+  'foo_8794',
+  'foo_8795',
+  'foo_8796',
+  'foo_8797',
+  'foo_8798',
+  'foo_8799',
+  'foo_8800',
+  'foo_8801',
+  'foo_8802',
+  'foo_8803',
+  'foo_8804',
+  'foo_8805',
+  'foo_8806',
+  'foo_8807',
+  'foo_8808',
+  'foo_8809',
+  'foo_8810',
+  'foo_8811',
+  'foo_8812',
+  'foo_8813',
+  'foo_8814',
+  'foo_8815',
+  'foo_8816',
+  'foo_8817',
+  'foo_8818',
+  'foo_8819',
+  'foo_8820',
+  'foo_8821',
+  'foo_8822',
+  'foo_8823',
+  'foo_8824',
+  'foo_8825',
+  'foo_8826',
+  'foo_8827',
+  'foo_8828',
+  'foo_8829',
+  'foo_8830',
+  'foo_8831',
+  'foo_8832',
+  'foo_8833',
+  'foo_8834',
+  'foo_8835',
+  'foo_8836',
+  'foo_8837',
+  'foo_8838',
+  'foo_8839',
+  'foo_8840',
+  'foo_8841',
+  'foo_8842',
+  'foo_8843',
+  'foo_8844',
+  'foo_8845',
+  'foo_8846',
+  'foo_8847',
+  'foo_8848',
+  'foo_8849',
+  'foo_8850',
+  'foo_8851',
+  'foo_8852',
+  'foo_8853',
+  'foo_8854',
+  'foo_8855',
+  'foo_8856',
+  'foo_8857',
+  'foo_8858',
+  'foo_8859',
+  'foo_8860',
+  'foo_8861',
+  'foo_8862',
+  'foo_8863',
+  'foo_8864',
+  'foo_8865',
+  'foo_8866',
+  'foo_8867',
+  'foo_8868',
+  'foo_8869',
+  'foo_8870',
+  'foo_8871',
+  'foo_8872',
+  'foo_8873',
+  'foo_8874',
+  'foo_8875',
+  'foo_8876',
+  'foo_8877',
+  'foo_8878',
+  'foo_8879',
+  'foo_8880',
+  'foo_8881',
+  'foo_8882',
+  'foo_8883',
+  'foo_8884',
+  'foo_8885',
+  'foo_8886',
+  'foo_8887',
+  'foo_8888',
+  'foo_8889',
+  'foo_8890',
+  'foo_8891',
+  'foo_8892',
+  'foo_8893',
+  'foo_8894',
+  'foo_8895',
+  'foo_8896',
+  'foo_8897',
+  'foo_8898',
+  'foo_8899',
+  'foo_8900',
+  'foo_8901',
+  'foo_8902',
+  'foo_8903',
+  'foo_8904',
+  'foo_8905',
+  'foo_8906',
+  'foo_8907',
+  'foo_8908',
+  'foo_8909',
+  'foo_8910',
+  'foo_8911',
+  'foo_8912',
+  'foo_8913',
+  'foo_8914',
+  'foo_8915',
+  'foo_8916',
+  'foo_8917',
+  'foo_8918',
+  'foo_8919',
+  'foo_8920',
+  'foo_8921',
+  'foo_8922',
+  'foo_8923',
+  'foo_8924',
+  'foo_8925',
+  'foo_8926',
+  'foo_8927',
+  'foo_8928',
+  'foo_8929',
+  'foo_8930',
+  'foo_8931',
+  'foo_8932',
+  'foo_8933',
+  'foo_8934',
+  'foo_8935',
+  'foo_8936',
+  'foo_8937',
+  'foo_8938',
+  'foo_8939',
+  'foo_8940',
+  'foo_8941',
+  'foo_8942',
+  'foo_8943',
+  'foo_8944',
+  'foo_8945',
+  'foo_8946',
+  'foo_8947',
+  'foo_8948',
+  'foo_8949',
+  'foo_8950',
+  'foo_8951',
+  'foo_8952',
+  'foo_8953',
+  'foo_8954',
+  'foo_8955',
+  'foo_8956',
+  'foo_8957',
+  'foo_8958',
+  'foo_8959',
+  'foo_8960',
+  'foo_8961',
+  'foo_8962',
+  'foo_8963',
+  'foo_8964',
+  'foo_8965',
+  'foo_8966',
+  'foo_8967',
+  'foo_8968',
+  'foo_8969',
+  'foo_8970',
+  'foo_8971',
+  'foo_8972',
+  'foo_8973',
+  'foo_8974',
+  'foo_8975',
+  'foo_8976',
+  'foo_8977',
+  'foo_8978',
+  'foo_8979',
+  'foo_8980',
+  'foo_8981',
+  'foo_8982',
+  'foo_8983',
+  'foo_8984',
+  'foo_8985',
+  'foo_8986',
+  'foo_8987',
+  'foo_8988',
+  'foo_8989',
+  'foo_8990',
+  'foo_8991',
+  'foo_8992',
+  'foo_8993',
+  'foo_8994',
+  'foo_8995',
+  'foo_8996',
+  'foo_8997',
+  'foo_8998',
+  'foo_8999',
+  'foo_9000',
+  'foo_9001',
+  'foo_9002',
+  'foo_9003',
+  'foo_9004',
+  'foo_9005',
+  'foo_9006',
+  'foo_9007',
+  'foo_9008',
+  'foo_9009',
+  'foo_9010',
+  'foo_9011',
+  'foo_9012',
+  'foo_9013',
+  'foo_9014',
+  'foo_9015',
+  'foo_9016',
+  'foo_9017',
+  'foo_9018',
+  'foo_9019',
+  'foo_9020',
+  'foo_9021',
+  'foo_9022',
+  'foo_9023',
+  'foo_9024',
+  'foo_9025',
+  'foo_9026',
+  'foo_9027',
+  'foo_9028',
+  'foo_9029',
+  'foo_9030',
+  'foo_9031',
+  'foo_9032',
+  'foo_9033',
+  'foo_9034',
+  'foo_9035',
+  'foo_9036',
+  'foo_9037',
+  'foo_9038',
+  'foo_9039',
+  'foo_9040',
+  'foo_9041',
+  'foo_9042',
+  'foo_9043',
+  'foo_9044',
+  'foo_9045',
+  'foo_9046',
+  'foo_9047',
+  'foo_9048',
+  'foo_9049',
+  'foo_9050',
+  'foo_9051',
+  'foo_9052',
+  'foo_9053',
+  'foo_9054',
+  'foo_9055',
+  'foo_9056',
+  'foo_9057',
+  'foo_9058',
+  'foo_9059',
+  'foo_9060',
+  'foo_9061',
+  'foo_9062',
+  'foo_9063',
+  'foo_9064',
+  'foo_9065',
+  'foo_9066',
+  'foo_9067',
+  'foo_9068',
+  'foo_9069',
+  'foo_9070',
+  'foo_9071',
+  'foo_9072',
+  'foo_9073',
+  'foo_9074',
+  'foo_9075',
+  'foo_9076',
+  'foo_9077',
+  'foo_9078',
+  'foo_9079',
+  'foo_9080',
+  'foo_9081',
+  'foo_9082',
+  'foo_9083',
+  'foo_9084',
+  'foo_9085',
+  'foo_9086',
+  'foo_9087',
+  'foo_9088',
+  'foo_9089',
+  'foo_9090',
+  'foo_9091',
+  'foo_9092',
+  'foo_9093',
+  'foo_9094',
+  'foo_9095',
+  'foo_9096',
+  'foo_9097',
+  'foo_9098',
+  'foo_9099',
+  'foo_9100',
+  'foo_9101',
+  'foo_9102',
+  'foo_9103',
+  'foo_9104',
+  'foo_9105',
+  'foo_9106',
+  'foo_9107',
+  'foo_9108',
+  'foo_9109',
+  'foo_9110',
+  'foo_9111',
+  'foo_9112',
+  'foo_9113',
+  'foo_9114',
+  'foo_9115',
+  'foo_9116',
+  'foo_9117',
+  'foo_9118',
+  'foo_9119',
+  'foo_9120',
+  'foo_9121',
+  'foo_9122',
+  'foo_9123',
+  'foo_9124',
+  'foo_9125',
+  'foo_9126',
+  'foo_9127',
+  'foo_9128',
+  'foo_9129',
+  'foo_9130',
+  'foo_9131',
+  'foo_9132',
+  'foo_9133',
+  'foo_9134',
+  'foo_9135',
+  'foo_9136',
+  'foo_9137',
+  'foo_9138',
+  'foo_9139',
+  'foo_9140',
+  'foo_9141',
+  'foo_9142',
+  'foo_9143',
+  'foo_9144',
+  'foo_9145',
+  'foo_9146',
+  'foo_9147',
+  'foo_9148',
+  'foo_9149',
+  'foo_9150',
+  'foo_9151',
+  'foo_9152',
+  'foo_9153',
+  'foo_9154',
+  'foo_9155',
+  'foo_9156',
+  'foo_9157',
+  'foo_9158',
+  'foo_9159',
+  'foo_9160',
+  'foo_9161',
+  'foo_9162',
+  'foo_9163',
+  'foo_9164',
+  'foo_9165',
+  'foo_9166',
+  'foo_9167',
+  'foo_9168',
+  'foo_9169',
+  'foo_9170',
+  'foo_9171',
+  'foo_9172',
+  'foo_9173',
+  'foo_9174',
+  'foo_9175',
+  'foo_9176',
+  'foo_9177',
+  'foo_9178',
+  'foo_9179',
+  'foo_9180',
+  'foo_9181',
+  'foo_9182',
+  'foo_9183',
+  'foo_9184',
+  'foo_9185',
+  'foo_9186',
+  'foo_9187',
+  'foo_9188',
+  'foo_9189',
+  'foo_9190',
+  'foo_9191',
+  'foo_9192',
+  'foo_9193',
+  'foo_9194',
+  'foo_9195',
+  'foo_9196',
+  'foo_9197',
+  'foo_9198',
+  'foo_9199',
+  'foo_9200',
+  'foo_9201',
+  'foo_9202',
+  'foo_9203',
+  'foo_9204',
+  'foo_9205',
+  'foo_9206',
+  'foo_9207',
+  'foo_9208',
+  'foo_9209',
+  'foo_9210',
+  'foo_9211',
+  'foo_9212',
+  'foo_9213',
+  'foo_9214',
+  'foo_9215',
+  'foo_9216',
+  'foo_9217',
+  'foo_9218',
+  'foo_9219',
+  'foo_9220',
+  'foo_9221',
+  'foo_9222',
+  'foo_9223',
+  'foo_9224',
+  'foo_9225',
+  'foo_9226',
+  'foo_9227',
+  'foo_9228',
+  'foo_9229',
+  'foo_9230',
+  'foo_9231',
+  'foo_9232',
+  'foo_9233',
+  'foo_9234',
+  'foo_9235',
+  'foo_9236',
+  'foo_9237',
+  'foo_9238',
+  'foo_9239',
+  'foo_9240',
+  'foo_9241',
+  'foo_9242',
+  'foo_9243',
+  'foo_9244',
+  'foo_9245',
+  'foo_9246',
+  'foo_9247',
+  'foo_9248',
+  'foo_9249',
+  'foo_9250',
+  'foo_9251',
+  'foo_9252',
+  'foo_9253',
+  'foo_9254',
+  'foo_9255',
+  'foo_9256',
+  'foo_9257',
+  'foo_9258',
+  'foo_9259',
+  'foo_9260',
+  'foo_9261',
+  'foo_9262',
+  'foo_9263',
+  'foo_9264',
+  'foo_9265',
+  'foo_9266',
+  'foo_9267',
+  'foo_9268',
+  'foo_9269',
+  'foo_9270',
+  'foo_9271',
+  'foo_9272',
+  'foo_9273',
+  'foo_9274',
+  'foo_9275',
+  'foo_9276',
+  'foo_9277',
+  'foo_9278',
+  'foo_9279',
+  'foo_9280',
+  'foo_9281',
+  'foo_9282',
+  'foo_9283',
+  'foo_9284',
+  'foo_9285',
+  'foo_9286',
+  'foo_9287',
+  'foo_9288',
+  'foo_9289',
+  'foo_9290',
+  'foo_9291',
+  'foo_9292',
+  'foo_9293',
+  'foo_9294',
+  'foo_9295',
+  'foo_9296',
+  'foo_9297',
+  'foo_9298',
+  'foo_9299',
+  'foo_9300',
+  'foo_9301',
+  'foo_9302',
+  'foo_9303',
+  'foo_9304',
+  'foo_9305',
+  'foo_9306',
+  'foo_9307',
+  'foo_9308',
+  'foo_9309',
+  'foo_9310',
+  'foo_9311',
+  'foo_9312',
+  'foo_9313',
+  'foo_9314',
+  'foo_9315',
+  'foo_9316',
+  'foo_9317',
+  'foo_9318',
+  'foo_9319',
+  'foo_9320',
+  'foo_9321',
+  'foo_9322',
+  'foo_9323',
+  'foo_9324',
+  'foo_9325',
+  'foo_9326',
+  'foo_9327',
+  'foo_9328',
+  'foo_9329',
+  'foo_9330',
+  'foo_9331',
+  'foo_9332',
+  'foo_9333',
+  'foo_9334',
+  'foo_9335',
+  'foo_9336',
+  'foo_9337',
+  'foo_9338',
+  'foo_9339',
+  'foo_9340',
+  'foo_9341',
+  'foo_9342',
+  'foo_9343',
+  'foo_9344',
+  'foo_9345',
+  'foo_9346',
+  'foo_9347',
+  'foo_9348',
+  'foo_9349',
+  'foo_9350',
+  'foo_9351',
+  'foo_9352',
+  'foo_9353',
+  'foo_9354',
+  'foo_9355',
+  'foo_9356',
+  'foo_9357',
+  'foo_9358',
+  'foo_9359',
+  'foo_9360',
+  'foo_9361',
+  'foo_9362',
+  'foo_9363',
+  'foo_9364',
+  'foo_9365',
+  'foo_9366',
+  'foo_9367',
+  'foo_9368',
+  'foo_9369',
+  'foo_9370',
+  'foo_9371',
+  'foo_9372',
+  'foo_9373',
+  'foo_9374',
+  'foo_9375',
+  'foo_9376',
+  'foo_9377',
+  'foo_9378',
+  'foo_9379',
+  'foo_9380',
+  'foo_9381',
+  'foo_9382',
+  'foo_9383',
+  'foo_9384',
+  'foo_9385',
+  'foo_9386',
+  'foo_9387',
+  'foo_9388',
+  'foo_9389',
+  'foo_9390',
+  'foo_9391',
+  'foo_9392',
+  'foo_9393',
+  'foo_9394',
+  'foo_9395',
+  'foo_9396',
+  'foo_9397',
+  'foo_9398',
+  'foo_9399',
+  'foo_9400',
+  'foo_9401',
+  'foo_9402',
+  'foo_9403',
+  'foo_9404',
+  'foo_9405',
+  'foo_9406',
+  'foo_9407',
+  'foo_9408',
+  'foo_9409',
+  'foo_9410',
+  'foo_9411',
+  'foo_9412',
+  'foo_9413',
+  'foo_9414',
+  'foo_9415',
+  'foo_9416',
+  'foo_9417',
+  'foo_9418',
+  'foo_9419',
+  'foo_9420',
+  'foo_9421',
+  'foo_9422',
+  'foo_9423',
+  'foo_9424',
+  'foo_9425',
+  'foo_9426',
+  'foo_9427',
+  'foo_9428',
+  'foo_9429',
+  'foo_9430',
+  'foo_9431',
+  'foo_9432',
+  'foo_9433',
+  'foo_9434',
+  'foo_9435',
+  'foo_9436',
+  'foo_9437',
+  'foo_9438',
+  'foo_9439',
+  'foo_9440',
+  'foo_9441',
+  'foo_9442',
+  'foo_9443',
+  'foo_9444',
+  'foo_9445',
+  'foo_9446',
+  'foo_9447',
+  'foo_9448',
+  'foo_9449',
+  'foo_9450',
+  'foo_9451',
+  'foo_9452',
+  'foo_9453',
+  'foo_9454',
+  'foo_9455',
+  'foo_9456',
+  'foo_9457',
+  'foo_9458',
+  'foo_9459',
+  'foo_9460',
+  'foo_9461',
+  'foo_9462',
+  'foo_9463',
+  'foo_9464',
+  'foo_9465',
+  'foo_9466',
+  'foo_9467',
+  'foo_9468',
+  'foo_9469',
+  'foo_9470',
+  'foo_9471',
+  'foo_9472',
+  'foo_9473',
+  'foo_9474',
+  'foo_9475',
+  'foo_9476',
+  'foo_9477',
+  'foo_9478',
+  'foo_9479',
+  'foo_9480',
+  'foo_9481',
+  'foo_9482',
+  'foo_9483',
+  'foo_9484',
+  'foo_9485',
+  'foo_9486',
+  'foo_9487',
+  'foo_9488',
+  'foo_9489',
+  'foo_9490',
+  'foo_9491',
+  'foo_9492',
+  'foo_9493',
+  'foo_9494',
+  'foo_9495',
+  'foo_9496',
+  'foo_9497',
+  'foo_9498',
+  'foo_9499',
+  'foo_9500',
+  'foo_9501',
+  'foo_9502',
+  'foo_9503',
+  'foo_9504',
+  'foo_9505',
+  'foo_9506',
+  'foo_9507',
+  'foo_9508',
+  'foo_9509',
+  'foo_9510',
+  'foo_9511',
+  'foo_9512',
+  'foo_9513',
+  'foo_9514',
+  'foo_9515',
+  'foo_9516',
+  'foo_9517',
+  'foo_9518',
+  'foo_9519',
+  'foo_9520',
+  'foo_9521',
+  'foo_9522',
+  'foo_9523',
+  'foo_9524',
+  'foo_9525',
+  'foo_9526',
+  'foo_9527',
+  'foo_9528',
+  'foo_9529',
+  'foo_9530',
+  'foo_9531',
+  'foo_9532',
+  'foo_9533',
+  'foo_9534',
+  'foo_9535',
+  'foo_9536',
+  'foo_9537',
+  'foo_9538',
+  'foo_9539',
+  'foo_9540',
+  'foo_9541',
+  'foo_9542',
+  'foo_9543',
+  'foo_9544',
+  'foo_9545',
+  'foo_9546',
+  'foo_9547',
+  'foo_9548',
+  'foo_9549',
+  'foo_9550',
+  'foo_9551',
+  'foo_9552',
+  'foo_9553',
+  'foo_9554',
+  'foo_9555',
+  'foo_9556',
+  'foo_9557',
+  'foo_9558',
+  'foo_9559',
+  'foo_9560',
+  'foo_9561',
+  'foo_9562',
+  'foo_9563',
+  'foo_9564',
+  'foo_9565',
+  'foo_9566',
+  'foo_9567',
+  'foo_9568',
+  'foo_9569',
+  'foo_9570',
+  'foo_9571',
+  'foo_9572',
+  'foo_9573',
+  'foo_9574',
+  'foo_9575',
+  'foo_9576',
+  'foo_9577',
+  'foo_9578',
+  'foo_9579',
+  'foo_9580',
+  'foo_9581',
+  'foo_9582',
+  'foo_9583',
+  'foo_9584',
+  'foo_9585',
+  'foo_9586',
+  'foo_9587',
+  'foo_9588',
+  'foo_9589',
+  'foo_9590',
+  'foo_9591',
+  'foo_9592',
+  'foo_9593',
+  'foo_9594',
+  'foo_9595',
+  'foo_9596',
+  'foo_9597',
+  'foo_9598',
+  'foo_9599',
+  'foo_9600',
+  'foo_9601',
+  'foo_9602',
+  'foo_9603',
+  'foo_9604',
+  'foo_9605',
+  'foo_9606',
+  'foo_9607',
+  'foo_9608',
+  'foo_9609',
+  'foo_9610',
+  'foo_9611',
+  'foo_9612',
+  'foo_9613',
+  'foo_9614',
+  'foo_9615',
+  'foo_9616',
+  'foo_9617',
+  'foo_9618',
+  'foo_9619',
+  'foo_9620',
+  'foo_9621',
+  'foo_9622',
+  'foo_9623',
+  'foo_9624',
+  'foo_9625',
+  'foo_9626',
+  'foo_9627',
+  'foo_9628',
+  'foo_9629',
+  'foo_9630',
+  'foo_9631',
+  'foo_9632',
+  'foo_9633',
+  'foo_9634',
+  'foo_9635',
+  'foo_9636',
+  'foo_9637',
+  'foo_9638',
+  'foo_9639',
+  'foo_9640',
+  'foo_9641',
+  'foo_9642',
+  'foo_9643',
+  'foo_9644',
+  'foo_9645',
+  'foo_9646',
+  'foo_9647',
+  'foo_9648',
+  'foo_9649',
+  'foo_9650',
+  'foo_9651',
+  'foo_9652',
+  'foo_9653',
+  'foo_9654',
+  'foo_9655',
+  'foo_9656',
+  'foo_9657',
+  'foo_9658',
+  'foo_9659',
+  'foo_9660',
+  'foo_9661',
+  'foo_9662',
+  'foo_9663',
+  'foo_9664',
+  'foo_9665',
+  'foo_9666',
+  'foo_9667',
+  'foo_9668',
+  'foo_9669',
+  'foo_9670',
+  'foo_9671',
+  'foo_9672',
+  'foo_9673',
+  'foo_9674',
+  'foo_9675',
+  'foo_9676',
+  'foo_9677',
+  'foo_9678',
+  'foo_9679',
+  'foo_9680',
+  'foo_9681',
+  'foo_9682',
+  'foo_9683',
+  'foo_9684',
+  'foo_9685',
+  'foo_9686',
+  'foo_9687',
+  'foo_9688',
+  'foo_9689',
+  'foo_9690',
+  'foo_9691',
+  'foo_9692',
+  'foo_9693',
+  'foo_9694',
+  'foo_9695',
+  'foo_9696',
+  'foo_9697',
+  'foo_9698',
+  'foo_9699',
+  'foo_9700',
+  'foo_9701',
+  'foo_9702',
+  'foo_9703',
+  'foo_9704',
+  'foo_9705',
+  'foo_9706',
+  'foo_9707',
+  'foo_9708',
+  'foo_9709',
+  'foo_9710',
+  'foo_9711',
+  'foo_9712',
+  'foo_9713',
+  'foo_9714',
+  'foo_9715',
+  'foo_9716',
+  'foo_9717',
+  'foo_9718',
+  'foo_9719',
+  'foo_9720',
+  'foo_9721',
+  'foo_9722',
+  'foo_9723',
+  'foo_9724',
+  'foo_9725',
+  'foo_9726',
+  'foo_9727',
+  'foo_9728',
+  'foo_9729',
+  'foo_9730',
+  'foo_9731',
+  'foo_9732',
+  'foo_9733',
+  'foo_9734',
+  'foo_9735',
+  'foo_9736',
+  'foo_9737',
+  'foo_9738',
+  'foo_9739',
+  'foo_9740',
+  'foo_9741',
+  'foo_9742',
+  'foo_9743',
+  'foo_9744',
+  'foo_9745',
+  'foo_9746',
+  'foo_9747',
+  'foo_9748',
+  'foo_9749',
+  'foo_9750',
+  'foo_9751',
+  'foo_9752',
+  'foo_9753',
+  'foo_9754',
+  'foo_9755',
+  'foo_9756',
+  'foo_9757',
+  'foo_9758',
+  'foo_9759',
+  'foo_9760',
+  'foo_9761',
+  'foo_9762',
+  'foo_9763',
+  'foo_9764',
+  'foo_9765',
+  'foo_9766',
+  'foo_9767',
+  'foo_9768',
+  'foo_9769',
+  'foo_9770',
+  'foo_9771',
+  'foo_9772',
+  'foo_9773',
+  'foo_9774',
+  'foo_9775',
+  'foo_9776',
+  'foo_9777',
+  'foo_9778',
+  'foo_9779',
+  'foo_9780',
+  'foo_9781',
+  'foo_9782',
+  'foo_9783',
+  'foo_9784',
+  'foo_9785',
+  'foo_9786',
+  'foo_9787',
+  'foo_9788',
+  'foo_9789',
+  'foo_9790',
+  'foo_9791',
+  'foo_9792',
+  'foo_9793',
+  'foo_9794',
+  'foo_9795',
+  'foo_9796',
+  'foo_9797',
+  'foo_9798',
+  'foo_9799',
+  'foo_9800',
+  'foo_9801',
+  'foo_9802',
+  'foo_9803',
+  'foo_9804',
+  'foo_9805',
+  'foo_9806',
+  'foo_9807',
+  'foo_9808',
+  'foo_9809',
+  'foo_9810',
+  'foo_9811',
+  'foo_9812',
+  'foo_9813',
+  'foo_9814',
+  'foo_9815',
+  'foo_9816',
+  'foo_9817',
+  'foo_9818',
+  'foo_9819',
+  'foo_9820',
+  'foo_9821',
+  'foo_9822',
+  'foo_9823',
+  'foo_9824',
+  'foo_9825',
+  'foo_9826',
+  'foo_9827',
+  'foo_9828',
+  'foo_9829',
+  'foo_9830',
+  'foo_9831',
+  'foo_9832',
+  'foo_9833',
+  'foo_9834',
+  'foo_9835',
+  'foo_9836',
+  'foo_9837',
+  'foo_9838',
+  'foo_9839',
+  'foo_9840',
+  'foo_9841',
+  'foo_9842',
+  'foo_9843',
+  'foo_9844',
+  'foo_9845',
+  'foo_9846',
+  'foo_9847',
+  'foo_9848',
+  'foo_9849',
+  'foo_9850',
+  'foo_9851',
+  'foo_9852',
+  'foo_9853',
+  'foo_9854',
+  'foo_9855',
+  'foo_9856',
+  'foo_9857',
+  'foo_9858',
+  'foo_9859',
+  'foo_9860',
+  'foo_9861',
+  'foo_9862',
+  'foo_9863',
+  'foo_9864',
+  'foo_9865',
+  'foo_9866',
+  'foo_9867',
+  'foo_9868',
+  'foo_9869',
+  'foo_9870',
+  'foo_9871',
+  'foo_9872',
+  'foo_9873',
+  'foo_9874',
+  'foo_9875',
+  'foo_9876',
+  'foo_9877',
+  'foo_9878',
+  'foo_9879',
+  'foo_9880',
+  'foo_9881',
+  'foo_9882',
+  'foo_9883',
+  'foo_9884',
+  'foo_9885',
+  'foo_9886',
+  'foo_9887',
+  'foo_9888',
+  'foo_9889',
+  'foo_9890',
+  'foo_9891',
+  'foo_9892',
+  'foo_9893',
+  'foo_9894',
+  'foo_9895',
+  'foo_9896',
+  'foo_9897',
+  'foo_9898',
+  'foo_9899',
+  'foo_9900',
+  'foo_9901',
+  'foo_9902',
+  'foo_9903',
+  'foo_9904',
+  'foo_9905',
+  'foo_9906',
+  'foo_9907',
+  'foo_9908',
+  'foo_9909',
+  'foo_9910',
+  'foo_9911',
+  'foo_9912',
+  'foo_9913',
+  'foo_9914',
+  'foo_9915',
+  'foo_9916',
+  'foo_9917',
+  'foo_9918',
+  'foo_9919',
+  'foo_9920',
+  'foo_9921',
+  'foo_9922',
+  'foo_9923',
+  'foo_9924',
+  'foo_9925',
+  'foo_9926',
+  'foo_9927',
+  'foo_9928',
+  'foo_9929',
+  'foo_9930',
+  'foo_9931',
+  'foo_9932',
+  'foo_9933',
+  'foo_9934',
+  'foo_9935',
+  'foo_9936',
+  'foo_9937',
+  'foo_9938',
+  'foo_9939',
+  'foo_9940',
+  'foo_9941',
+  'foo_9942',
+  'foo_9943',
+  'foo_9944',
+  'foo_9945',
+  'foo_9946',
+  'foo_9947',
+  'foo_9948',
+  'foo_9949',
+  'foo_9950',
+  'foo_9951',
+  'foo_9952',
+  'foo_9953',
+  'foo_9954',
+  'foo_9955',
+  'foo_9956',
+  'foo_9957',
+  'foo_9958',
+  'foo_9959',
+  'foo_9960',
+  'foo_9961',
+  'foo_9962',
+  'foo_9963',
+  'foo_9964',
+  'foo_9965',
+  'foo_9966',
+  'foo_9967',
+  'foo_9968',
+  'foo_9969',
+  'foo_9970',
+  'foo_9971',
+  'foo_9972',
+  'foo_9973',
+  'foo_9974',
+  'foo_9975',
+  'foo_9976',
+  'foo_9977',
+  'foo_9978',
+  'foo_9979',
+  'foo_9980',
+  'foo_9981',
+  'foo_9982',
+  'foo_9983',
+  'foo_9984',
+  'foo_9985',
+  'foo_9986',
+  'foo_9987',
+  'foo_9988',
+  'foo_9989',
+  'foo_9990',
+  'foo_9991',
+  'foo_9992',
+  'foo_9993',
+  'foo_9994',
+  'foo_9995',
+  'foo_9996',
+  'foo_9997',
+  'foo_9998',
+  'foo_9999',
+};
diff --git a/tests/language_2/set_literals/const_big_set_literal_test.dart b/tests/language_2/set_literals/const_big_set_literal_test.dart
new file mode 100644
index 0000000..f2cb67d
--- /dev/null
+++ b/tests/language_2/set_literals/const_big_set_literal_test.dart
@@ -0,0 +1,20028 @@
+// Copyright (c) 2020, 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:expect/expect.dart";
+
+void main() {
+  Expect.equals(10000, intSet.length);
+  Iterator<int> intIterator = intSet.iterator;
+  for (int i = 0; i < 10000; i++) {
+    Expect.equals(true, intIterator.moveNext());
+    Expect.equals(i, intIterator.current);
+  }
+  Expect.equals(false, intIterator.moveNext());
+
+  Expect.equals(10000, stringSet.length);
+  Iterator<String> stringIterator = stringSet.iterator;
+  for (int i = 0; i < 10000; i++) {
+    Expect.equals(true, stringIterator.moveNext());
+    Expect.equals("foo_$i", stringIterator.current);
+  }
+  Expect.equals(false, stringIterator.moveNext());
+}
+
+const Set<int> intSet = {
+  0,
+  1,
+  2,
+  3,
+  4,
+  5,
+  6,
+  7,
+  8,
+  9,
+  10,
+  11,
+  12,
+  13,
+  14,
+  15,
+  16,
+  17,
+  18,
+  19,
+  20,
+  21,
+  22,
+  23,
+  24,
+  25,
+  26,
+  27,
+  28,
+  29,
+  30,
+  31,
+  32,
+  33,
+  34,
+  35,
+  36,
+  37,
+  38,
+  39,
+  40,
+  41,
+  42,
+  43,
+  44,
+  45,
+  46,
+  47,
+  48,
+  49,
+  50,
+  51,
+  52,
+  53,
+  54,
+  55,
+  56,
+  57,
+  58,
+  59,
+  60,
+  61,
+  62,
+  63,
+  64,
+  65,
+  66,
+  67,
+  68,
+  69,
+  70,
+  71,
+  72,
+  73,
+  74,
+  75,
+  76,
+  77,
+  78,
+  79,
+  80,
+  81,
+  82,
+  83,
+  84,
+  85,
+  86,
+  87,
+  88,
+  89,
+  90,
+  91,
+  92,
+  93,
+  94,
+  95,
+  96,
+  97,
+  98,
+  99,
+  100,
+  101,
+  102,
+  103,
+  104,
+  105,
+  106,
+  107,
+  108,
+  109,
+  110,
+  111,
+  112,
+  113,
+  114,
+  115,
+  116,
+  117,
+  118,
+  119,
+  120,
+  121,
+  122,
+  123,
+  124,
+  125,
+  126,
+  127,
+  128,
+  129,
+  130,
+  131,
+  132,
+  133,
+  134,
+  135,
+  136,
+  137,
+  138,
+  139,
+  140,
+  141,
+  142,
+  143,
+  144,
+  145,
+  146,
+  147,
+  148,
+  149,
+  150,
+  151,
+  152,
+  153,
+  154,
+  155,
+  156,
+  157,
+  158,
+  159,
+  160,
+  161,
+  162,
+  163,
+  164,
+  165,
+  166,
+  167,
+  168,
+  169,
+  170,
+  171,
+  172,
+  173,
+  174,
+  175,
+  176,
+  177,
+  178,
+  179,
+  180,
+  181,
+  182,
+  183,
+  184,
+  185,
+  186,
+  187,
+  188,
+  189,
+  190,
+  191,
+  192,
+  193,
+  194,
+  195,
+  196,
+  197,
+  198,
+  199,
+  200,
+  201,
+  202,
+  203,
+  204,
+  205,
+  206,
+  207,
+  208,
+  209,
+  210,
+  211,
+  212,
+  213,
+  214,
+  215,
+  216,
+  217,
+  218,
+  219,
+  220,
+  221,
+  222,
+  223,
+  224,
+  225,
+  226,
+  227,
+  228,
+  229,
+  230,
+  231,
+  232,
+  233,
+  234,
+  235,
+  236,
+  237,
+  238,
+  239,
+  240,
+  241,
+  242,
+  243,
+  244,
+  245,
+  246,
+  247,
+  248,
+  249,
+  250,
+  251,
+  252,
+  253,
+  254,
+  255,
+  256,
+  257,
+  258,
+  259,
+  260,
+  261,
+  262,
+  263,
+  264,
+  265,
+  266,
+  267,
+  268,
+  269,
+  270,
+  271,
+  272,
+  273,
+  274,
+  275,
+  276,
+  277,
+  278,
+  279,
+  280,
+  281,
+  282,
+  283,
+  284,
+  285,
+  286,
+  287,
+  288,
+  289,
+  290,
+  291,
+  292,
+  293,
+  294,
+  295,
+  296,
+  297,
+  298,
+  299,
+  300,
+  301,
+  302,
+  303,
+  304,
+  305,
+  306,
+  307,
+  308,
+  309,
+  310,
+  311,
+  312,
+  313,
+  314,
+  315,
+  316,
+  317,
+  318,
+  319,
+  320,
+  321,
+  322,
+  323,
+  324,
+  325,
+  326,
+  327,
+  328,
+  329,
+  330,
+  331,
+  332,
+  333,
+  334,
+  335,
+  336,
+  337,
+  338,
+  339,
+  340,
+  341,
+  342,
+  343,
+  344,
+  345,
+  346,
+  347,
+  348,
+  349,
+  350,
+  351,
+  352,
+  353,
+  354,
+  355,
+  356,
+  357,
+  358,
+  359,
+  360,
+  361,
+  362,
+  363,
+  364,
+  365,
+  366,
+  367,
+  368,
+  369,
+  370,
+  371,
+  372,
+  373,
+  374,
+  375,
+  376,
+  377,
+  378,
+  379,
+  380,
+  381,
+  382,
+  383,
+  384,
+  385,
+  386,
+  387,
+  388,
+  389,
+  390,
+  391,
+  392,
+  393,
+  394,
+  395,
+  396,
+  397,
+  398,
+  399,
+  400,
+  401,
+  402,
+  403,
+  404,
+  405,
+  406,
+  407,
+  408,
+  409,
+  410,
+  411,
+  412,
+  413,
+  414,
+  415,
+  416,
+  417,
+  418,
+  419,
+  420,
+  421,
+  422,
+  423,
+  424,
+  425,
+  426,
+  427,
+  428,
+  429,
+  430,
+  431,
+  432,
+  433,
+  434,
+  435,
+  436,
+  437,
+  438,
+  439,
+  440,
+  441,
+  442,
+  443,
+  444,
+  445,
+  446,
+  447,
+  448,
+  449,
+  450,
+  451,
+  452,
+  453,
+  454,
+  455,
+  456,
+  457,
+  458,
+  459,
+  460,
+  461,
+  462,
+  463,
+  464,
+  465,
+  466,
+  467,
+  468,
+  469,
+  470,
+  471,
+  472,
+  473,
+  474,
+  475,
+  476,
+  477,
+  478,
+  479,
+  480,
+  481,
+  482,
+  483,
+  484,
+  485,
+  486,
+  487,
+  488,
+  489,
+  490,
+  491,
+  492,
+  493,
+  494,
+  495,
+  496,
+  497,
+  498,
+  499,
+  500,
+  501,
+  502,
+  503,
+  504,
+  505,
+  506,
+  507,
+  508,
+  509,
+  510,
+  511,
+  512,
+  513,
+  514,
+  515,
+  516,
+  517,
+  518,
+  519,
+  520,
+  521,
+  522,
+  523,
+  524,
+  525,
+  526,
+  527,
+  528,
+  529,
+  530,
+  531,
+  532,
+  533,
+  534,
+  535,
+  536,
+  537,
+  538,
+  539,
+  540,
+  541,
+  542,
+  543,
+  544,
+  545,
+  546,
+  547,
+  548,
+  549,
+  550,
+  551,
+  552,
+  553,
+  554,
+  555,
+  556,
+  557,
+  558,
+  559,
+  560,
+  561,
+  562,
+  563,
+  564,
+  565,
+  566,
+  567,
+  568,
+  569,
+  570,
+  571,
+  572,
+  573,
+  574,
+  575,
+  576,
+  577,
+  578,
+  579,
+  580,
+  581,
+  582,
+  583,
+  584,
+  585,
+  586,
+  587,
+  588,
+  589,
+  590,
+  591,
+  592,
+  593,
+  594,
+  595,
+  596,
+  597,
+  598,
+  599,
+  600,
+  601,
+  602,
+  603,
+  604,
+  605,
+  606,
+  607,
+  608,
+  609,
+  610,
+  611,
+  612,
+  613,
+  614,
+  615,
+  616,
+  617,
+  618,
+  619,
+  620,
+  621,
+  622,
+  623,
+  624,
+  625,
+  626,
+  627,
+  628,
+  629,
+  630,
+  631,
+  632,
+  633,
+  634,
+  635,
+  636,
+  637,
+  638,
+  639,
+  640,
+  641,
+  642,
+  643,
+  644,
+  645,
+  646,
+  647,
+  648,
+  649,
+  650,
+  651,
+  652,
+  653,
+  654,
+  655,
+  656,
+  657,
+  658,
+  659,
+  660,
+  661,
+  662,
+  663,
+  664,
+  665,
+  666,
+  667,
+  668,
+  669,
+  670,
+  671,
+  672,
+  673,
+  674,
+  675,
+  676,
+  677,
+  678,
+  679,
+  680,
+  681,
+  682,
+  683,
+  684,
+  685,
+  686,
+  687,
+  688,
+  689,
+  690,
+  691,
+  692,
+  693,
+  694,
+  695,
+  696,
+  697,
+  698,
+  699,
+  700,
+  701,
+  702,
+  703,
+  704,
+  705,
+  706,
+  707,
+  708,
+  709,
+  710,
+  711,
+  712,
+  713,
+  714,
+  715,
+  716,
+  717,
+  718,
+  719,
+  720,
+  721,
+  722,
+  723,
+  724,
+  725,
+  726,
+  727,
+  728,
+  729,
+  730,
+  731,
+  732,
+  733,
+  734,
+  735,
+  736,
+  737,
+  738,
+  739,
+  740,
+  741,
+  742,
+  743,
+  744,
+  745,
+  746,
+  747,
+  748,
+  749,
+  750,
+  751,
+  752,
+  753,
+  754,
+  755,
+  756,
+  757,
+  758,
+  759,
+  760,
+  761,
+  762,
+  763,
+  764,
+  765,
+  766,
+  767,
+  768,
+  769,
+  770,
+  771,
+  772,
+  773,
+  774,
+  775,
+  776,
+  777,
+  778,
+  779,
+  780,
+  781,
+  782,
+  783,
+  784,
+  785,
+  786,
+  787,
+  788,
+  789,
+  790,
+  791,
+  792,
+  793,
+  794,
+  795,
+  796,
+  797,
+  798,
+  799,
+  800,
+  801,
+  802,
+  803,
+  804,
+  805,
+  806,
+  807,
+  808,
+  809,
+  810,
+  811,
+  812,
+  813,
+  814,
+  815,
+  816,
+  817,
+  818,
+  819,
+  820,
+  821,
+  822,
+  823,
+  824,
+  825,
+  826,
+  827,
+  828,
+  829,
+  830,
+  831,
+  832,
+  833,
+  834,
+  835,
+  836,
+  837,
+  838,
+  839,
+  840,
+  841,
+  842,
+  843,
+  844,
+  845,
+  846,
+  847,
+  848,
+  849,
+  850,
+  851,
+  852,
+  853,
+  854,
+  855,
+  856,
+  857,
+  858,
+  859,
+  860,
+  861,
+  862,
+  863,
+  864,
+  865,
+  866,
+  867,
+  868,
+  869,
+  870,
+  871,
+  872,
+  873,
+  874,
+  875,
+  876,
+  877,
+  878,
+  879,
+  880,
+  881,
+  882,
+  883,
+  884,
+  885,
+  886,
+  887,
+  888,
+  889,
+  890,
+  891,
+  892,
+  893,
+  894,
+  895,
+  896,
+  897,
+  898,
+  899,
+  900,
+  901,
+  902,
+  903,
+  904,
+  905,
+  906,
+  907,
+  908,
+  909,
+  910,
+  911,
+  912,
+  913,
+  914,
+  915,
+  916,
+  917,
+  918,
+  919,
+  920,
+  921,
+  922,
+  923,
+  924,
+  925,
+  926,
+  927,
+  928,
+  929,
+  930,
+  931,
+  932,
+  933,
+  934,
+  935,
+  936,
+  937,
+  938,
+  939,
+  940,
+  941,
+  942,
+  943,
+  944,
+  945,
+  946,
+  947,
+  948,
+  949,
+  950,
+  951,
+  952,
+  953,
+  954,
+  955,
+  956,
+  957,
+  958,
+  959,
+  960,
+  961,
+  962,
+  963,
+  964,
+  965,
+  966,
+  967,
+  968,
+  969,
+  970,
+  971,
+  972,
+  973,
+  974,
+  975,
+  976,
+  977,
+  978,
+  979,
+  980,
+  981,
+  982,
+  983,
+  984,
+  985,
+  986,
+  987,
+  988,
+  989,
+  990,
+  991,
+  992,
+  993,
+  994,
+  995,
+  996,
+  997,
+  998,
+  999,
+  1000,
+  1001,
+  1002,
+  1003,
+  1004,
+  1005,
+  1006,
+  1007,
+  1008,
+  1009,
+  1010,
+  1011,
+  1012,
+  1013,
+  1014,
+  1015,
+  1016,
+  1017,
+  1018,
+  1019,
+  1020,
+  1021,
+  1022,
+  1023,
+  1024,
+  1025,
+  1026,
+  1027,
+  1028,
+  1029,
+  1030,
+  1031,
+  1032,
+  1033,
+  1034,
+  1035,
+  1036,
+  1037,
+  1038,
+  1039,
+  1040,
+  1041,
+  1042,
+  1043,
+  1044,
+  1045,
+  1046,
+  1047,
+  1048,
+  1049,
+  1050,
+  1051,
+  1052,
+  1053,
+  1054,
+  1055,
+  1056,
+  1057,
+  1058,
+  1059,
+  1060,
+  1061,
+  1062,
+  1063,
+  1064,
+  1065,
+  1066,
+  1067,
+  1068,
+  1069,
+  1070,
+  1071,
+  1072,
+  1073,
+  1074,
+  1075,
+  1076,
+  1077,
+  1078,
+  1079,
+  1080,
+  1081,
+  1082,
+  1083,
+  1084,
+  1085,
+  1086,
+  1087,
+  1088,
+  1089,
+  1090,
+  1091,
+  1092,
+  1093,
+  1094,
+  1095,
+  1096,
+  1097,
+  1098,
+  1099,
+  1100,
+  1101,
+  1102,
+  1103,
+  1104,
+  1105,
+  1106,
+  1107,
+  1108,
+  1109,
+  1110,
+  1111,
+  1112,
+  1113,
+  1114,
+  1115,
+  1116,
+  1117,
+  1118,
+  1119,
+  1120,
+  1121,
+  1122,
+  1123,
+  1124,
+  1125,
+  1126,
+  1127,
+  1128,
+  1129,
+  1130,
+  1131,
+  1132,
+  1133,
+  1134,
+  1135,
+  1136,
+  1137,
+  1138,
+  1139,
+  1140,
+  1141,
+  1142,
+  1143,
+  1144,
+  1145,
+  1146,
+  1147,
+  1148,
+  1149,
+  1150,
+  1151,
+  1152,
+  1153,
+  1154,
+  1155,
+  1156,
+  1157,
+  1158,
+  1159,
+  1160,
+  1161,
+  1162,
+  1163,
+  1164,
+  1165,
+  1166,
+  1167,
+  1168,
+  1169,
+  1170,
+  1171,
+  1172,
+  1173,
+  1174,
+  1175,
+  1176,
+  1177,
+  1178,
+  1179,
+  1180,
+  1181,
+  1182,
+  1183,
+  1184,
+  1185,
+  1186,
+  1187,
+  1188,
+  1189,
+  1190,
+  1191,
+  1192,
+  1193,
+  1194,
+  1195,
+  1196,
+  1197,
+  1198,
+  1199,
+  1200,
+  1201,
+  1202,
+  1203,
+  1204,
+  1205,
+  1206,
+  1207,
+  1208,
+  1209,
+  1210,
+  1211,
+  1212,
+  1213,
+  1214,
+  1215,
+  1216,
+  1217,
+  1218,
+  1219,
+  1220,
+  1221,
+  1222,
+  1223,
+  1224,
+  1225,
+  1226,
+  1227,
+  1228,
+  1229,
+  1230,
+  1231,
+  1232,
+  1233,
+  1234,
+  1235,
+  1236,
+  1237,
+  1238,
+  1239,
+  1240,
+  1241,
+  1242,
+  1243,
+  1244,
+  1245,
+  1246,
+  1247,
+  1248,
+  1249,
+  1250,
+  1251,
+  1252,
+  1253,
+  1254,
+  1255,
+  1256,
+  1257,
+  1258,
+  1259,
+  1260,
+  1261,
+  1262,
+  1263,
+  1264,
+  1265,
+  1266,
+  1267,
+  1268,
+  1269,
+  1270,
+  1271,
+  1272,
+  1273,
+  1274,
+  1275,
+  1276,
+  1277,
+  1278,
+  1279,
+  1280,
+  1281,
+  1282,
+  1283,
+  1284,
+  1285,
+  1286,
+  1287,
+  1288,
+  1289,
+  1290,
+  1291,
+  1292,
+  1293,
+  1294,
+  1295,
+  1296,
+  1297,
+  1298,
+  1299,
+  1300,
+  1301,
+  1302,
+  1303,
+  1304,
+  1305,
+  1306,
+  1307,
+  1308,
+  1309,
+  1310,
+  1311,
+  1312,
+  1313,
+  1314,
+  1315,
+  1316,
+  1317,
+  1318,
+  1319,
+  1320,
+  1321,
+  1322,
+  1323,
+  1324,
+  1325,
+  1326,
+  1327,
+  1328,
+  1329,
+  1330,
+  1331,
+  1332,
+  1333,
+  1334,
+  1335,
+  1336,
+  1337,
+  1338,
+  1339,
+  1340,
+  1341,
+  1342,
+  1343,
+  1344,
+  1345,
+  1346,
+  1347,
+  1348,
+  1349,
+  1350,
+  1351,
+  1352,
+  1353,
+  1354,
+  1355,
+  1356,
+  1357,
+  1358,
+  1359,
+  1360,
+  1361,
+  1362,
+  1363,
+  1364,
+  1365,
+  1366,
+  1367,
+  1368,
+  1369,
+  1370,
+  1371,
+  1372,
+  1373,
+  1374,
+  1375,
+  1376,
+  1377,
+  1378,
+  1379,
+  1380,
+  1381,
+  1382,
+  1383,
+  1384,
+  1385,
+  1386,
+  1387,
+  1388,
+  1389,
+  1390,
+  1391,
+  1392,
+  1393,
+  1394,
+  1395,
+  1396,
+  1397,
+  1398,
+  1399,
+  1400,
+  1401,
+  1402,
+  1403,
+  1404,
+  1405,
+  1406,
+  1407,
+  1408,
+  1409,
+  1410,
+  1411,
+  1412,
+  1413,
+  1414,
+  1415,
+  1416,
+  1417,
+  1418,
+  1419,
+  1420,
+  1421,
+  1422,
+  1423,
+  1424,
+  1425,
+  1426,
+  1427,
+  1428,
+  1429,
+  1430,
+  1431,
+  1432,
+  1433,
+  1434,
+  1435,
+  1436,
+  1437,
+  1438,
+  1439,
+  1440,
+  1441,
+  1442,
+  1443,
+  1444,
+  1445,
+  1446,
+  1447,
+  1448,
+  1449,
+  1450,
+  1451,
+  1452,
+  1453,
+  1454,
+  1455,
+  1456,
+  1457,
+  1458,
+  1459,
+  1460,
+  1461,
+  1462,
+  1463,
+  1464,
+  1465,
+  1466,
+  1467,
+  1468,
+  1469,
+  1470,
+  1471,
+  1472,
+  1473,
+  1474,
+  1475,
+  1476,
+  1477,
+  1478,
+  1479,
+  1480,
+  1481,
+  1482,
+  1483,
+  1484,
+  1485,
+  1486,
+  1487,
+  1488,
+  1489,
+  1490,
+  1491,
+  1492,
+  1493,
+  1494,
+  1495,
+  1496,
+  1497,
+  1498,
+  1499,
+  1500,
+  1501,
+  1502,
+  1503,
+  1504,
+  1505,
+  1506,
+  1507,
+  1508,
+  1509,
+  1510,
+  1511,
+  1512,
+  1513,
+  1514,
+  1515,
+  1516,
+  1517,
+  1518,
+  1519,
+  1520,
+  1521,
+  1522,
+  1523,
+  1524,
+  1525,
+  1526,
+  1527,
+  1528,
+  1529,
+  1530,
+  1531,
+  1532,
+  1533,
+  1534,
+  1535,
+  1536,
+  1537,
+  1538,
+  1539,
+  1540,
+  1541,
+  1542,
+  1543,
+  1544,
+  1545,
+  1546,
+  1547,
+  1548,
+  1549,
+  1550,
+  1551,
+  1552,
+  1553,
+  1554,
+  1555,
+  1556,
+  1557,
+  1558,
+  1559,
+  1560,
+  1561,
+  1562,
+  1563,
+  1564,
+  1565,
+  1566,
+  1567,
+  1568,
+  1569,
+  1570,
+  1571,
+  1572,
+  1573,
+  1574,
+  1575,
+  1576,
+  1577,
+  1578,
+  1579,
+  1580,
+  1581,
+  1582,
+  1583,
+  1584,
+  1585,
+  1586,
+  1587,
+  1588,
+  1589,
+  1590,
+  1591,
+  1592,
+  1593,
+  1594,
+  1595,
+  1596,
+  1597,
+  1598,
+  1599,
+  1600,
+  1601,
+  1602,
+  1603,
+  1604,
+  1605,
+  1606,
+  1607,
+  1608,
+  1609,
+  1610,
+  1611,
+  1612,
+  1613,
+  1614,
+  1615,
+  1616,
+  1617,
+  1618,
+  1619,
+  1620,
+  1621,
+  1622,
+  1623,
+  1624,
+  1625,
+  1626,
+  1627,
+  1628,
+  1629,
+  1630,
+  1631,
+  1632,
+  1633,
+  1634,
+  1635,
+  1636,
+  1637,
+  1638,
+  1639,
+  1640,
+  1641,
+  1642,
+  1643,
+  1644,
+  1645,
+  1646,
+  1647,
+  1648,
+  1649,
+  1650,
+  1651,
+  1652,
+  1653,
+  1654,
+  1655,
+  1656,
+  1657,
+  1658,
+  1659,
+  1660,
+  1661,
+  1662,
+  1663,
+  1664,
+  1665,
+  1666,
+  1667,
+  1668,
+  1669,
+  1670,
+  1671,
+  1672,
+  1673,
+  1674,
+  1675,
+  1676,
+  1677,
+  1678,
+  1679,
+  1680,
+  1681,
+  1682,
+  1683,
+  1684,
+  1685,
+  1686,
+  1687,
+  1688,
+  1689,
+  1690,
+  1691,
+  1692,
+  1693,
+  1694,
+  1695,
+  1696,
+  1697,
+  1698,
+  1699,
+  1700,
+  1701,
+  1702,
+  1703,
+  1704,
+  1705,
+  1706,
+  1707,
+  1708,
+  1709,
+  1710,
+  1711,
+  1712,
+  1713,
+  1714,
+  1715,
+  1716,
+  1717,
+  1718,
+  1719,
+  1720,
+  1721,
+  1722,
+  1723,
+  1724,
+  1725,
+  1726,
+  1727,
+  1728,
+  1729,
+  1730,
+  1731,
+  1732,
+  1733,
+  1734,
+  1735,
+  1736,
+  1737,
+  1738,
+  1739,
+  1740,
+  1741,
+  1742,
+  1743,
+  1744,
+  1745,
+  1746,
+  1747,
+  1748,
+  1749,
+  1750,
+  1751,
+  1752,
+  1753,
+  1754,
+  1755,
+  1756,
+  1757,
+  1758,
+  1759,
+  1760,
+  1761,
+  1762,
+  1763,
+  1764,
+  1765,
+  1766,
+  1767,
+  1768,
+  1769,
+  1770,
+  1771,
+  1772,
+  1773,
+  1774,
+  1775,
+  1776,
+  1777,
+  1778,
+  1779,
+  1780,
+  1781,
+  1782,
+  1783,
+  1784,
+  1785,
+  1786,
+  1787,
+  1788,
+  1789,
+  1790,
+  1791,
+  1792,
+  1793,
+  1794,
+  1795,
+  1796,
+  1797,
+  1798,
+  1799,
+  1800,
+  1801,
+  1802,
+  1803,
+  1804,
+  1805,
+  1806,
+  1807,
+  1808,
+  1809,
+  1810,
+  1811,
+  1812,
+  1813,
+  1814,
+  1815,
+  1816,
+  1817,
+  1818,
+  1819,
+  1820,
+  1821,
+  1822,
+  1823,
+  1824,
+  1825,
+  1826,
+  1827,
+  1828,
+  1829,
+  1830,
+  1831,
+  1832,
+  1833,
+  1834,
+  1835,
+  1836,
+  1837,
+  1838,
+  1839,
+  1840,
+  1841,
+  1842,
+  1843,
+  1844,
+  1845,
+  1846,
+  1847,
+  1848,
+  1849,
+  1850,
+  1851,
+  1852,
+  1853,
+  1854,
+  1855,
+  1856,
+  1857,
+  1858,
+  1859,
+  1860,
+  1861,
+  1862,
+  1863,
+  1864,
+  1865,
+  1866,
+  1867,
+  1868,
+  1869,
+  1870,
+  1871,
+  1872,
+  1873,
+  1874,
+  1875,
+  1876,
+  1877,
+  1878,
+  1879,
+  1880,
+  1881,
+  1882,
+  1883,
+  1884,
+  1885,
+  1886,
+  1887,
+  1888,
+  1889,
+  1890,
+  1891,
+  1892,
+  1893,
+  1894,
+  1895,
+  1896,
+  1897,
+  1898,
+  1899,
+  1900,
+  1901,
+  1902,
+  1903,
+  1904,
+  1905,
+  1906,
+  1907,
+  1908,
+  1909,
+  1910,
+  1911,
+  1912,
+  1913,
+  1914,
+  1915,
+  1916,
+  1917,
+  1918,
+  1919,
+  1920,
+  1921,
+  1922,
+  1923,
+  1924,
+  1925,
+  1926,
+  1927,
+  1928,
+  1929,
+  1930,
+  1931,
+  1932,
+  1933,
+  1934,
+  1935,
+  1936,
+  1937,
+  1938,
+  1939,
+  1940,
+  1941,
+  1942,
+  1943,
+  1944,
+  1945,
+  1946,
+  1947,
+  1948,
+  1949,
+  1950,
+  1951,
+  1952,
+  1953,
+  1954,
+  1955,
+  1956,
+  1957,
+  1958,
+  1959,
+  1960,
+  1961,
+  1962,
+  1963,
+  1964,
+  1965,
+  1966,
+  1967,
+  1968,
+  1969,
+  1970,
+  1971,
+  1972,
+  1973,
+  1974,
+  1975,
+  1976,
+  1977,
+  1978,
+  1979,
+  1980,
+  1981,
+  1982,
+  1983,
+  1984,
+  1985,
+  1986,
+  1987,
+  1988,
+  1989,
+  1990,
+  1991,
+  1992,
+  1993,
+  1994,
+  1995,
+  1996,
+  1997,
+  1998,
+  1999,
+  2000,
+  2001,
+  2002,
+  2003,
+  2004,
+  2005,
+  2006,
+  2007,
+  2008,
+  2009,
+  2010,
+  2011,
+  2012,
+  2013,
+  2014,
+  2015,
+  2016,
+  2017,
+  2018,
+  2019,
+  2020,
+  2021,
+  2022,
+  2023,
+  2024,
+  2025,
+  2026,
+  2027,
+  2028,
+  2029,
+  2030,
+  2031,
+  2032,
+  2033,
+  2034,
+  2035,
+  2036,
+  2037,
+  2038,
+  2039,
+  2040,
+  2041,
+  2042,
+  2043,
+  2044,
+  2045,
+  2046,
+  2047,
+  2048,
+  2049,
+  2050,
+  2051,
+  2052,
+  2053,
+  2054,
+  2055,
+  2056,
+  2057,
+  2058,
+  2059,
+  2060,
+  2061,
+  2062,
+  2063,
+  2064,
+  2065,
+  2066,
+  2067,
+  2068,
+  2069,
+  2070,
+  2071,
+  2072,
+  2073,
+  2074,
+  2075,
+  2076,
+  2077,
+  2078,
+  2079,
+  2080,
+  2081,
+  2082,
+  2083,
+  2084,
+  2085,
+  2086,
+  2087,
+  2088,
+  2089,
+  2090,
+  2091,
+  2092,
+  2093,
+  2094,
+  2095,
+  2096,
+  2097,
+  2098,
+  2099,
+  2100,
+  2101,
+  2102,
+  2103,
+  2104,
+  2105,
+  2106,
+  2107,
+  2108,
+  2109,
+  2110,
+  2111,
+  2112,
+  2113,
+  2114,
+  2115,
+  2116,
+  2117,
+  2118,
+  2119,
+  2120,
+  2121,
+  2122,
+  2123,
+  2124,
+  2125,
+  2126,
+  2127,
+  2128,
+  2129,
+  2130,
+  2131,
+  2132,
+  2133,
+  2134,
+  2135,
+  2136,
+  2137,
+  2138,
+  2139,
+  2140,
+  2141,
+  2142,
+  2143,
+  2144,
+  2145,
+  2146,
+  2147,
+  2148,
+  2149,
+  2150,
+  2151,
+  2152,
+  2153,
+  2154,
+  2155,
+  2156,
+  2157,
+  2158,
+  2159,
+  2160,
+  2161,
+  2162,
+  2163,
+  2164,
+  2165,
+  2166,
+  2167,
+  2168,
+  2169,
+  2170,
+  2171,
+  2172,
+  2173,
+  2174,
+  2175,
+  2176,
+  2177,
+  2178,
+  2179,
+  2180,
+  2181,
+  2182,
+  2183,
+  2184,
+  2185,
+  2186,
+  2187,
+  2188,
+  2189,
+  2190,
+  2191,
+  2192,
+  2193,
+  2194,
+  2195,
+  2196,
+  2197,
+  2198,
+  2199,
+  2200,
+  2201,
+  2202,
+  2203,
+  2204,
+  2205,
+  2206,
+  2207,
+  2208,
+  2209,
+  2210,
+  2211,
+  2212,
+  2213,
+  2214,
+  2215,
+  2216,
+  2217,
+  2218,
+  2219,
+  2220,
+  2221,
+  2222,
+  2223,
+  2224,
+  2225,
+  2226,
+  2227,
+  2228,
+  2229,
+  2230,
+  2231,
+  2232,
+  2233,
+  2234,
+  2235,
+  2236,
+  2237,
+  2238,
+  2239,
+  2240,
+  2241,
+  2242,
+  2243,
+  2244,
+  2245,
+  2246,
+  2247,
+  2248,
+  2249,
+  2250,
+  2251,
+  2252,
+  2253,
+  2254,
+  2255,
+  2256,
+  2257,
+  2258,
+  2259,
+  2260,
+  2261,
+  2262,
+  2263,
+  2264,
+  2265,
+  2266,
+  2267,
+  2268,
+  2269,
+  2270,
+  2271,
+  2272,
+  2273,
+  2274,
+  2275,
+  2276,
+  2277,
+  2278,
+  2279,
+  2280,
+  2281,
+  2282,
+  2283,
+  2284,
+  2285,
+  2286,
+  2287,
+  2288,
+  2289,
+  2290,
+  2291,
+  2292,
+  2293,
+  2294,
+  2295,
+  2296,
+  2297,
+  2298,
+  2299,
+  2300,
+  2301,
+  2302,
+  2303,
+  2304,
+  2305,
+  2306,
+  2307,
+  2308,
+  2309,
+  2310,
+  2311,
+  2312,
+  2313,
+  2314,
+  2315,
+  2316,
+  2317,
+  2318,
+  2319,
+  2320,
+  2321,
+  2322,
+  2323,
+  2324,
+  2325,
+  2326,
+  2327,
+  2328,
+  2329,
+  2330,
+  2331,
+  2332,
+  2333,
+  2334,
+  2335,
+  2336,
+  2337,
+  2338,
+  2339,
+  2340,
+  2341,
+  2342,
+  2343,
+  2344,
+  2345,
+  2346,
+  2347,
+  2348,
+  2349,
+  2350,
+  2351,
+  2352,
+  2353,
+  2354,
+  2355,
+  2356,
+  2357,
+  2358,
+  2359,
+  2360,
+  2361,
+  2362,
+  2363,
+  2364,
+  2365,
+  2366,
+  2367,
+  2368,
+  2369,
+  2370,
+  2371,
+  2372,
+  2373,
+  2374,
+  2375,
+  2376,
+  2377,
+  2378,
+  2379,
+  2380,
+  2381,
+  2382,
+  2383,
+  2384,
+  2385,
+  2386,
+  2387,
+  2388,
+  2389,
+  2390,
+  2391,
+  2392,
+  2393,
+  2394,
+  2395,
+  2396,
+  2397,
+  2398,
+  2399,
+  2400,
+  2401,
+  2402,
+  2403,
+  2404,
+  2405,
+  2406,
+  2407,
+  2408,
+  2409,
+  2410,
+  2411,
+  2412,
+  2413,
+  2414,
+  2415,
+  2416,
+  2417,
+  2418,
+  2419,
+  2420,
+  2421,
+  2422,
+  2423,
+  2424,
+  2425,
+  2426,
+  2427,
+  2428,
+  2429,
+  2430,
+  2431,
+  2432,
+  2433,
+  2434,
+  2435,
+  2436,
+  2437,
+  2438,
+  2439,
+  2440,
+  2441,
+  2442,
+  2443,
+  2444,
+  2445,
+  2446,
+  2447,
+  2448,
+  2449,
+  2450,
+  2451,
+  2452,
+  2453,
+  2454,
+  2455,
+  2456,
+  2457,
+  2458,
+  2459,
+  2460,
+  2461,
+  2462,
+  2463,
+  2464,
+  2465,
+  2466,
+  2467,
+  2468,
+  2469,
+  2470,
+  2471,
+  2472,
+  2473,
+  2474,
+  2475,
+  2476,
+  2477,
+  2478,
+  2479,
+  2480,
+  2481,
+  2482,
+  2483,
+  2484,
+  2485,
+  2486,
+  2487,
+  2488,
+  2489,
+  2490,
+  2491,
+  2492,
+  2493,
+  2494,
+  2495,
+  2496,
+  2497,
+  2498,
+  2499,
+  2500,
+  2501,
+  2502,
+  2503,
+  2504,
+  2505,
+  2506,
+  2507,
+  2508,
+  2509,
+  2510,
+  2511,
+  2512,
+  2513,
+  2514,
+  2515,
+  2516,
+  2517,
+  2518,
+  2519,
+  2520,
+  2521,
+  2522,
+  2523,
+  2524,
+  2525,
+  2526,
+  2527,
+  2528,
+  2529,
+  2530,
+  2531,
+  2532,
+  2533,
+  2534,
+  2535,
+  2536,
+  2537,
+  2538,
+  2539,
+  2540,
+  2541,
+  2542,
+  2543,
+  2544,
+  2545,
+  2546,
+  2547,
+  2548,
+  2549,
+  2550,
+  2551,
+  2552,
+  2553,
+  2554,
+  2555,
+  2556,
+  2557,
+  2558,
+  2559,
+  2560,
+  2561,
+  2562,
+  2563,
+  2564,
+  2565,
+  2566,
+  2567,
+  2568,
+  2569,
+  2570,
+  2571,
+  2572,
+  2573,
+  2574,
+  2575,
+  2576,
+  2577,
+  2578,
+  2579,
+  2580,
+  2581,
+  2582,
+  2583,
+  2584,
+  2585,
+  2586,
+  2587,
+  2588,
+  2589,
+  2590,
+  2591,
+  2592,
+  2593,
+  2594,
+  2595,
+  2596,
+  2597,
+  2598,
+  2599,
+  2600,
+  2601,
+  2602,
+  2603,
+  2604,
+  2605,
+  2606,
+  2607,
+  2608,
+  2609,
+  2610,
+  2611,
+  2612,
+  2613,
+  2614,
+  2615,
+  2616,
+  2617,
+  2618,
+  2619,
+  2620,
+  2621,
+  2622,
+  2623,
+  2624,
+  2625,
+  2626,
+  2627,
+  2628,
+  2629,
+  2630,
+  2631,
+  2632,
+  2633,
+  2634,
+  2635,
+  2636,
+  2637,
+  2638,
+  2639,
+  2640,
+  2641,
+  2642,
+  2643,
+  2644,
+  2645,
+  2646,
+  2647,
+  2648,
+  2649,
+  2650,
+  2651,
+  2652,
+  2653,
+  2654,
+  2655,
+  2656,
+  2657,
+  2658,
+  2659,
+  2660,
+  2661,
+  2662,
+  2663,
+  2664,
+  2665,
+  2666,
+  2667,
+  2668,
+  2669,
+  2670,
+  2671,
+  2672,
+  2673,
+  2674,
+  2675,
+  2676,
+  2677,
+  2678,
+  2679,
+  2680,
+  2681,
+  2682,
+  2683,
+  2684,
+  2685,
+  2686,
+  2687,
+  2688,
+  2689,
+  2690,
+  2691,
+  2692,
+  2693,
+  2694,
+  2695,
+  2696,
+  2697,
+  2698,
+  2699,
+  2700,
+  2701,
+  2702,
+  2703,
+  2704,
+  2705,
+  2706,
+  2707,
+  2708,
+  2709,
+  2710,
+  2711,
+  2712,
+  2713,
+  2714,
+  2715,
+  2716,
+  2717,
+  2718,
+  2719,
+  2720,
+  2721,
+  2722,
+  2723,
+  2724,
+  2725,
+  2726,
+  2727,
+  2728,
+  2729,
+  2730,
+  2731,
+  2732,
+  2733,
+  2734,
+  2735,
+  2736,
+  2737,
+  2738,
+  2739,
+  2740,
+  2741,
+  2742,
+  2743,
+  2744,
+  2745,
+  2746,
+  2747,
+  2748,
+  2749,
+  2750,
+  2751,
+  2752,
+  2753,
+  2754,
+  2755,
+  2756,
+  2757,
+  2758,
+  2759,
+  2760,
+  2761,
+  2762,
+  2763,
+  2764,
+  2765,
+  2766,
+  2767,
+  2768,
+  2769,
+  2770,
+  2771,
+  2772,
+  2773,
+  2774,
+  2775,
+  2776,
+  2777,
+  2778,
+  2779,
+  2780,
+  2781,
+  2782,
+  2783,
+  2784,
+  2785,
+  2786,
+  2787,
+  2788,
+  2789,
+  2790,
+  2791,
+  2792,
+  2793,
+  2794,
+  2795,
+  2796,
+  2797,
+  2798,
+  2799,
+  2800,
+  2801,
+  2802,
+  2803,
+  2804,
+  2805,
+  2806,
+  2807,
+  2808,
+  2809,
+  2810,
+  2811,
+  2812,
+  2813,
+  2814,
+  2815,
+  2816,
+  2817,
+  2818,
+  2819,
+  2820,
+  2821,
+  2822,
+  2823,
+  2824,
+  2825,
+  2826,
+  2827,
+  2828,
+  2829,
+  2830,
+  2831,
+  2832,
+  2833,
+  2834,
+  2835,
+  2836,
+  2837,
+  2838,
+  2839,
+  2840,
+  2841,
+  2842,
+  2843,
+  2844,
+  2845,
+  2846,
+  2847,
+  2848,
+  2849,
+  2850,
+  2851,
+  2852,
+  2853,
+  2854,
+  2855,
+  2856,
+  2857,
+  2858,
+  2859,
+  2860,
+  2861,
+  2862,
+  2863,
+  2864,
+  2865,
+  2866,
+  2867,
+  2868,
+  2869,
+  2870,
+  2871,
+  2872,
+  2873,
+  2874,
+  2875,
+  2876,
+  2877,
+  2878,
+  2879,
+  2880,
+  2881,
+  2882,
+  2883,
+  2884,
+  2885,
+  2886,
+  2887,
+  2888,
+  2889,
+  2890,
+  2891,
+  2892,
+  2893,
+  2894,
+  2895,
+  2896,
+  2897,
+  2898,
+  2899,
+  2900,
+  2901,
+  2902,
+  2903,
+  2904,
+  2905,
+  2906,
+  2907,
+  2908,
+  2909,
+  2910,
+  2911,
+  2912,
+  2913,
+  2914,
+  2915,
+  2916,
+  2917,
+  2918,
+  2919,
+  2920,
+  2921,
+  2922,
+  2923,
+  2924,
+  2925,
+  2926,
+  2927,
+  2928,
+  2929,
+  2930,
+  2931,
+  2932,
+  2933,
+  2934,
+  2935,
+  2936,
+  2937,
+  2938,
+  2939,
+  2940,
+  2941,
+  2942,
+  2943,
+  2944,
+  2945,
+  2946,
+  2947,
+  2948,
+  2949,
+  2950,
+  2951,
+  2952,
+  2953,
+  2954,
+  2955,
+  2956,
+  2957,
+  2958,
+  2959,
+  2960,
+  2961,
+  2962,
+  2963,
+  2964,
+  2965,
+  2966,
+  2967,
+  2968,
+  2969,
+  2970,
+  2971,
+  2972,
+  2973,
+  2974,
+  2975,
+  2976,
+  2977,
+  2978,
+  2979,
+  2980,
+  2981,
+  2982,
+  2983,
+  2984,
+  2985,
+  2986,
+  2987,
+  2988,
+  2989,
+  2990,
+  2991,
+  2992,
+  2993,
+  2994,
+  2995,
+  2996,
+  2997,
+  2998,
+  2999,
+  3000,
+  3001,
+  3002,
+  3003,
+  3004,
+  3005,
+  3006,
+  3007,
+  3008,
+  3009,
+  3010,
+  3011,
+  3012,
+  3013,
+  3014,
+  3015,
+  3016,
+  3017,
+  3018,
+  3019,
+  3020,
+  3021,
+  3022,
+  3023,
+  3024,
+  3025,
+  3026,
+  3027,
+  3028,
+  3029,
+  3030,
+  3031,
+  3032,
+  3033,
+  3034,
+  3035,
+  3036,
+  3037,
+  3038,
+  3039,
+  3040,
+  3041,
+  3042,
+  3043,
+  3044,
+  3045,
+  3046,
+  3047,
+  3048,
+  3049,
+  3050,
+  3051,
+  3052,
+  3053,
+  3054,
+  3055,
+  3056,
+  3057,
+  3058,
+  3059,
+  3060,
+  3061,
+  3062,
+  3063,
+  3064,
+  3065,
+  3066,
+  3067,
+  3068,
+  3069,
+  3070,
+  3071,
+  3072,
+  3073,
+  3074,
+  3075,
+  3076,
+  3077,
+  3078,
+  3079,
+  3080,
+  3081,
+  3082,
+  3083,
+  3084,
+  3085,
+  3086,
+  3087,
+  3088,
+  3089,
+  3090,
+  3091,
+  3092,
+  3093,
+  3094,
+  3095,
+  3096,
+  3097,
+  3098,
+  3099,
+  3100,
+  3101,
+  3102,
+  3103,
+  3104,
+  3105,
+  3106,
+  3107,
+  3108,
+  3109,
+  3110,
+  3111,
+  3112,
+  3113,
+  3114,
+  3115,
+  3116,
+  3117,
+  3118,
+  3119,
+  3120,
+  3121,
+  3122,
+  3123,
+  3124,
+  3125,
+  3126,
+  3127,
+  3128,
+  3129,
+  3130,
+  3131,
+  3132,
+  3133,
+  3134,
+  3135,
+  3136,
+  3137,
+  3138,
+  3139,
+  3140,
+  3141,
+  3142,
+  3143,
+  3144,
+  3145,
+  3146,
+  3147,
+  3148,
+  3149,
+  3150,
+  3151,
+  3152,
+  3153,
+  3154,
+  3155,
+  3156,
+  3157,
+  3158,
+  3159,
+  3160,
+  3161,
+  3162,
+  3163,
+  3164,
+  3165,
+  3166,
+  3167,
+  3168,
+  3169,
+  3170,
+  3171,
+  3172,
+  3173,
+  3174,
+  3175,
+  3176,
+  3177,
+  3178,
+  3179,
+  3180,
+  3181,
+  3182,
+  3183,
+  3184,
+  3185,
+  3186,
+  3187,
+  3188,
+  3189,
+  3190,
+  3191,
+  3192,
+  3193,
+  3194,
+  3195,
+  3196,
+  3197,
+  3198,
+  3199,
+  3200,
+  3201,
+  3202,
+  3203,
+  3204,
+  3205,
+  3206,
+  3207,
+  3208,
+  3209,
+  3210,
+  3211,
+  3212,
+  3213,
+  3214,
+  3215,
+  3216,
+  3217,
+  3218,
+  3219,
+  3220,
+  3221,
+  3222,
+  3223,
+  3224,
+  3225,
+  3226,
+  3227,
+  3228,
+  3229,
+  3230,
+  3231,
+  3232,
+  3233,
+  3234,
+  3235,
+  3236,
+  3237,
+  3238,
+  3239,
+  3240,
+  3241,
+  3242,
+  3243,
+  3244,
+  3245,
+  3246,
+  3247,
+  3248,
+  3249,
+  3250,
+  3251,
+  3252,
+  3253,
+  3254,
+  3255,
+  3256,
+  3257,
+  3258,
+  3259,
+  3260,
+  3261,
+  3262,
+  3263,
+  3264,
+  3265,
+  3266,
+  3267,
+  3268,
+  3269,
+  3270,
+  3271,
+  3272,
+  3273,
+  3274,
+  3275,
+  3276,
+  3277,
+  3278,
+  3279,
+  3280,
+  3281,
+  3282,
+  3283,
+  3284,
+  3285,
+  3286,
+  3287,
+  3288,
+  3289,
+  3290,
+  3291,
+  3292,
+  3293,
+  3294,
+  3295,
+  3296,
+  3297,
+  3298,
+  3299,
+  3300,
+  3301,
+  3302,
+  3303,
+  3304,
+  3305,
+  3306,
+  3307,
+  3308,
+  3309,
+  3310,
+  3311,
+  3312,
+  3313,
+  3314,
+  3315,
+  3316,
+  3317,
+  3318,
+  3319,
+  3320,
+  3321,
+  3322,
+  3323,
+  3324,
+  3325,
+  3326,
+  3327,
+  3328,
+  3329,
+  3330,
+  3331,
+  3332,
+  3333,
+  3334,
+  3335,
+  3336,
+  3337,
+  3338,
+  3339,
+  3340,
+  3341,
+  3342,
+  3343,
+  3344,
+  3345,
+  3346,
+  3347,
+  3348,
+  3349,
+  3350,
+  3351,
+  3352,
+  3353,
+  3354,
+  3355,
+  3356,
+  3357,
+  3358,
+  3359,
+  3360,
+  3361,
+  3362,
+  3363,
+  3364,
+  3365,
+  3366,
+  3367,
+  3368,
+  3369,
+  3370,
+  3371,
+  3372,
+  3373,
+  3374,
+  3375,
+  3376,
+  3377,
+  3378,
+  3379,
+  3380,
+  3381,
+  3382,
+  3383,
+  3384,
+  3385,
+  3386,
+  3387,
+  3388,
+  3389,
+  3390,
+  3391,
+  3392,
+  3393,
+  3394,
+  3395,
+  3396,
+  3397,
+  3398,
+  3399,
+  3400,
+  3401,
+  3402,
+  3403,
+  3404,
+  3405,
+  3406,
+  3407,
+  3408,
+  3409,
+  3410,
+  3411,
+  3412,
+  3413,
+  3414,
+  3415,
+  3416,
+  3417,
+  3418,
+  3419,
+  3420,
+  3421,
+  3422,
+  3423,
+  3424,
+  3425,
+  3426,
+  3427,
+  3428,
+  3429,
+  3430,
+  3431,
+  3432,
+  3433,
+  3434,
+  3435,
+  3436,
+  3437,
+  3438,
+  3439,
+  3440,
+  3441,
+  3442,
+  3443,
+  3444,
+  3445,
+  3446,
+  3447,
+  3448,
+  3449,
+  3450,
+  3451,
+  3452,
+  3453,
+  3454,
+  3455,
+  3456,
+  3457,
+  3458,
+  3459,
+  3460,
+  3461,
+  3462,
+  3463,
+  3464,
+  3465,
+  3466,
+  3467,
+  3468,
+  3469,
+  3470,
+  3471,
+  3472,
+  3473,
+  3474,
+  3475,
+  3476,
+  3477,
+  3478,
+  3479,
+  3480,
+  3481,
+  3482,
+  3483,
+  3484,
+  3485,
+  3486,
+  3487,
+  3488,
+  3489,
+  3490,
+  3491,
+  3492,
+  3493,
+  3494,
+  3495,
+  3496,
+  3497,
+  3498,
+  3499,
+  3500,
+  3501,
+  3502,
+  3503,
+  3504,
+  3505,
+  3506,
+  3507,
+  3508,
+  3509,
+  3510,
+  3511,
+  3512,
+  3513,
+  3514,
+  3515,
+  3516,
+  3517,
+  3518,
+  3519,
+  3520,
+  3521,
+  3522,
+  3523,
+  3524,
+  3525,
+  3526,
+  3527,
+  3528,
+  3529,
+  3530,
+  3531,
+  3532,
+  3533,
+  3534,
+  3535,
+  3536,
+  3537,
+  3538,
+  3539,
+  3540,
+  3541,
+  3542,
+  3543,
+  3544,
+  3545,
+  3546,
+  3547,
+  3548,
+  3549,
+  3550,
+  3551,
+  3552,
+  3553,
+  3554,
+  3555,
+  3556,
+  3557,
+  3558,
+  3559,
+  3560,
+  3561,
+  3562,
+  3563,
+  3564,
+  3565,
+  3566,
+  3567,
+  3568,
+  3569,
+  3570,
+  3571,
+  3572,
+  3573,
+  3574,
+  3575,
+  3576,
+  3577,
+  3578,
+  3579,
+  3580,
+  3581,
+  3582,
+  3583,
+  3584,
+  3585,
+  3586,
+  3587,
+  3588,
+  3589,
+  3590,
+  3591,
+  3592,
+  3593,
+  3594,
+  3595,
+  3596,
+  3597,
+  3598,
+  3599,
+  3600,
+  3601,
+  3602,
+  3603,
+  3604,
+  3605,
+  3606,
+  3607,
+  3608,
+  3609,
+  3610,
+  3611,
+  3612,
+  3613,
+  3614,
+  3615,
+  3616,
+  3617,
+  3618,
+  3619,
+  3620,
+  3621,
+  3622,
+  3623,
+  3624,
+  3625,
+  3626,
+  3627,
+  3628,
+  3629,
+  3630,
+  3631,
+  3632,
+  3633,
+  3634,
+  3635,
+  3636,
+  3637,
+  3638,
+  3639,
+  3640,
+  3641,
+  3642,
+  3643,
+  3644,
+  3645,
+  3646,
+  3647,
+  3648,
+  3649,
+  3650,
+  3651,
+  3652,
+  3653,
+  3654,
+  3655,
+  3656,
+  3657,
+  3658,
+  3659,
+  3660,
+  3661,
+  3662,
+  3663,
+  3664,
+  3665,
+  3666,
+  3667,
+  3668,
+  3669,
+  3670,
+  3671,
+  3672,
+  3673,
+  3674,
+  3675,
+  3676,
+  3677,
+  3678,
+  3679,
+  3680,
+  3681,
+  3682,
+  3683,
+  3684,
+  3685,
+  3686,
+  3687,
+  3688,
+  3689,
+  3690,
+  3691,
+  3692,
+  3693,
+  3694,
+  3695,
+  3696,
+  3697,
+  3698,
+  3699,
+  3700,
+  3701,
+  3702,
+  3703,
+  3704,
+  3705,
+  3706,
+  3707,
+  3708,
+  3709,
+  3710,
+  3711,
+  3712,
+  3713,
+  3714,
+  3715,
+  3716,
+  3717,
+  3718,
+  3719,
+  3720,
+  3721,
+  3722,
+  3723,
+  3724,
+  3725,
+  3726,
+  3727,
+  3728,
+  3729,
+  3730,
+  3731,
+  3732,
+  3733,
+  3734,
+  3735,
+  3736,
+  3737,
+  3738,
+  3739,
+  3740,
+  3741,
+  3742,
+  3743,
+  3744,
+  3745,
+  3746,
+  3747,
+  3748,
+  3749,
+  3750,
+  3751,
+  3752,
+  3753,
+  3754,
+  3755,
+  3756,
+  3757,
+  3758,
+  3759,
+  3760,
+  3761,
+  3762,
+  3763,
+  3764,
+  3765,
+  3766,
+  3767,
+  3768,
+  3769,
+  3770,
+  3771,
+  3772,
+  3773,
+  3774,
+  3775,
+  3776,
+  3777,
+  3778,
+  3779,
+  3780,
+  3781,
+  3782,
+  3783,
+  3784,
+  3785,
+  3786,
+  3787,
+  3788,
+  3789,
+  3790,
+  3791,
+  3792,
+  3793,
+  3794,
+  3795,
+  3796,
+  3797,
+  3798,
+  3799,
+  3800,
+  3801,
+  3802,
+  3803,
+  3804,
+  3805,
+  3806,
+  3807,
+  3808,
+  3809,
+  3810,
+  3811,
+  3812,
+  3813,
+  3814,
+  3815,
+  3816,
+  3817,
+  3818,
+  3819,
+  3820,
+  3821,
+  3822,
+  3823,
+  3824,
+  3825,
+  3826,
+  3827,
+  3828,
+  3829,
+  3830,
+  3831,
+  3832,
+  3833,
+  3834,
+  3835,
+  3836,
+  3837,
+  3838,
+  3839,
+  3840,
+  3841,
+  3842,
+  3843,
+  3844,
+  3845,
+  3846,
+  3847,
+  3848,
+  3849,
+  3850,
+  3851,
+  3852,
+  3853,
+  3854,
+  3855,
+  3856,
+  3857,
+  3858,
+  3859,
+  3860,
+  3861,
+  3862,
+  3863,
+  3864,
+  3865,
+  3866,
+  3867,
+  3868,
+  3869,
+  3870,
+  3871,
+  3872,
+  3873,
+  3874,
+  3875,
+  3876,
+  3877,
+  3878,
+  3879,
+  3880,
+  3881,
+  3882,
+  3883,
+  3884,
+  3885,
+  3886,
+  3887,
+  3888,
+  3889,
+  3890,
+  3891,
+  3892,
+  3893,
+  3894,
+  3895,
+  3896,
+  3897,
+  3898,
+  3899,
+  3900,
+  3901,
+  3902,
+  3903,
+  3904,
+  3905,
+  3906,
+  3907,
+  3908,
+  3909,
+  3910,
+  3911,
+  3912,
+  3913,
+  3914,
+  3915,
+  3916,
+  3917,
+  3918,
+  3919,
+  3920,
+  3921,
+  3922,
+  3923,
+  3924,
+  3925,
+  3926,
+  3927,
+  3928,
+  3929,
+  3930,
+  3931,
+  3932,
+  3933,
+  3934,
+  3935,
+  3936,
+  3937,
+  3938,
+  3939,
+  3940,
+  3941,
+  3942,
+  3943,
+  3944,
+  3945,
+  3946,
+  3947,
+  3948,
+  3949,
+  3950,
+  3951,
+  3952,
+  3953,
+  3954,
+  3955,
+  3956,
+  3957,
+  3958,
+  3959,
+  3960,
+  3961,
+  3962,
+  3963,
+  3964,
+  3965,
+  3966,
+  3967,
+  3968,
+  3969,
+  3970,
+  3971,
+  3972,
+  3973,
+  3974,
+  3975,
+  3976,
+  3977,
+  3978,
+  3979,
+  3980,
+  3981,
+  3982,
+  3983,
+  3984,
+  3985,
+  3986,
+  3987,
+  3988,
+  3989,
+  3990,
+  3991,
+  3992,
+  3993,
+  3994,
+  3995,
+  3996,
+  3997,
+  3998,
+  3999,
+  4000,
+  4001,
+  4002,
+  4003,
+  4004,
+  4005,
+  4006,
+  4007,
+  4008,
+  4009,
+  4010,
+  4011,
+  4012,
+  4013,
+  4014,
+  4015,
+  4016,
+  4017,
+  4018,
+  4019,
+  4020,
+  4021,
+  4022,
+  4023,
+  4024,
+  4025,
+  4026,
+  4027,
+  4028,
+  4029,
+  4030,
+  4031,
+  4032,
+  4033,
+  4034,
+  4035,
+  4036,
+  4037,
+  4038,
+  4039,
+  4040,
+  4041,
+  4042,
+  4043,
+  4044,
+  4045,
+  4046,
+  4047,
+  4048,
+  4049,
+  4050,
+  4051,
+  4052,
+  4053,
+  4054,
+  4055,
+  4056,
+  4057,
+  4058,
+  4059,
+  4060,
+  4061,
+  4062,
+  4063,
+  4064,
+  4065,
+  4066,
+  4067,
+  4068,
+  4069,
+  4070,
+  4071,
+  4072,
+  4073,
+  4074,
+  4075,
+  4076,
+  4077,
+  4078,
+  4079,
+  4080,
+  4081,
+  4082,
+  4083,
+  4084,
+  4085,
+  4086,
+  4087,
+  4088,
+  4089,
+  4090,
+  4091,
+  4092,
+  4093,
+  4094,
+  4095,
+  4096,
+  4097,
+  4098,
+  4099,
+  4100,
+  4101,
+  4102,
+  4103,
+  4104,
+  4105,
+  4106,
+  4107,
+  4108,
+  4109,
+  4110,
+  4111,
+  4112,
+  4113,
+  4114,
+  4115,
+  4116,
+  4117,
+  4118,
+  4119,
+  4120,
+  4121,
+  4122,
+  4123,
+  4124,
+  4125,
+  4126,
+  4127,
+  4128,
+  4129,
+  4130,
+  4131,
+  4132,
+  4133,
+  4134,
+  4135,
+  4136,
+  4137,
+  4138,
+  4139,
+  4140,
+  4141,
+  4142,
+  4143,
+  4144,
+  4145,
+  4146,
+  4147,
+  4148,
+  4149,
+  4150,
+  4151,
+  4152,
+  4153,
+  4154,
+  4155,
+  4156,
+  4157,
+  4158,
+  4159,
+  4160,
+  4161,
+  4162,
+  4163,
+  4164,
+  4165,
+  4166,
+  4167,
+  4168,
+  4169,
+  4170,
+  4171,
+  4172,
+  4173,
+  4174,
+  4175,
+  4176,
+  4177,
+  4178,
+  4179,
+  4180,
+  4181,
+  4182,
+  4183,
+  4184,
+  4185,
+  4186,
+  4187,
+  4188,
+  4189,
+  4190,
+  4191,
+  4192,
+  4193,
+  4194,
+  4195,
+  4196,
+  4197,
+  4198,
+  4199,
+  4200,
+  4201,
+  4202,
+  4203,
+  4204,
+  4205,
+  4206,
+  4207,
+  4208,
+  4209,
+  4210,
+  4211,
+  4212,
+  4213,
+  4214,
+  4215,
+  4216,
+  4217,
+  4218,
+  4219,
+  4220,
+  4221,
+  4222,
+  4223,
+  4224,
+  4225,
+  4226,
+  4227,
+  4228,
+  4229,
+  4230,
+  4231,
+  4232,
+  4233,
+  4234,
+  4235,
+  4236,
+  4237,
+  4238,
+  4239,
+  4240,
+  4241,
+  4242,
+  4243,
+  4244,
+  4245,
+  4246,
+  4247,
+  4248,
+  4249,
+  4250,
+  4251,
+  4252,
+  4253,
+  4254,
+  4255,
+  4256,
+  4257,
+  4258,
+  4259,
+  4260,
+  4261,
+  4262,
+  4263,
+  4264,
+  4265,
+  4266,
+  4267,
+  4268,
+  4269,
+  4270,
+  4271,
+  4272,
+  4273,
+  4274,
+  4275,
+  4276,
+  4277,
+  4278,
+  4279,
+  4280,
+  4281,
+  4282,
+  4283,
+  4284,
+  4285,
+  4286,
+  4287,
+  4288,
+  4289,
+  4290,
+  4291,
+  4292,
+  4293,
+  4294,
+  4295,
+  4296,
+  4297,
+  4298,
+  4299,
+  4300,
+  4301,
+  4302,
+  4303,
+  4304,
+  4305,
+  4306,
+  4307,
+  4308,
+  4309,
+  4310,
+  4311,
+  4312,
+  4313,
+  4314,
+  4315,
+  4316,
+  4317,
+  4318,
+  4319,
+  4320,
+  4321,
+  4322,
+  4323,
+  4324,
+  4325,
+  4326,
+  4327,
+  4328,
+  4329,
+  4330,
+  4331,
+  4332,
+  4333,
+  4334,
+  4335,
+  4336,
+  4337,
+  4338,
+  4339,
+  4340,
+  4341,
+  4342,
+  4343,
+  4344,
+  4345,
+  4346,
+  4347,
+  4348,
+  4349,
+  4350,
+  4351,
+  4352,
+  4353,
+  4354,
+  4355,
+  4356,
+  4357,
+  4358,
+  4359,
+  4360,
+  4361,
+  4362,
+  4363,
+  4364,
+  4365,
+  4366,
+  4367,
+  4368,
+  4369,
+  4370,
+  4371,
+  4372,
+  4373,
+  4374,
+  4375,
+  4376,
+  4377,
+  4378,
+  4379,
+  4380,
+  4381,
+  4382,
+  4383,
+  4384,
+  4385,
+  4386,
+  4387,
+  4388,
+  4389,
+  4390,
+  4391,
+  4392,
+  4393,
+  4394,
+  4395,
+  4396,
+  4397,
+  4398,
+  4399,
+  4400,
+  4401,
+  4402,
+  4403,
+  4404,
+  4405,
+  4406,
+  4407,
+  4408,
+  4409,
+  4410,
+  4411,
+  4412,
+  4413,
+  4414,
+  4415,
+  4416,
+  4417,
+  4418,
+  4419,
+  4420,
+  4421,
+  4422,
+  4423,
+  4424,
+  4425,
+  4426,
+  4427,
+  4428,
+  4429,
+  4430,
+  4431,
+  4432,
+  4433,
+  4434,
+  4435,
+  4436,
+  4437,
+  4438,
+  4439,
+  4440,
+  4441,
+  4442,
+  4443,
+  4444,
+  4445,
+  4446,
+  4447,
+  4448,
+  4449,
+  4450,
+  4451,
+  4452,
+  4453,
+  4454,
+  4455,
+  4456,
+  4457,
+  4458,
+  4459,
+  4460,
+  4461,
+  4462,
+  4463,
+  4464,
+  4465,
+  4466,
+  4467,
+  4468,
+  4469,
+  4470,
+  4471,
+  4472,
+  4473,
+  4474,
+  4475,
+  4476,
+  4477,
+  4478,
+  4479,
+  4480,
+  4481,
+  4482,
+  4483,
+  4484,
+  4485,
+  4486,
+  4487,
+  4488,
+  4489,
+  4490,
+  4491,
+  4492,
+  4493,
+  4494,
+  4495,
+  4496,
+  4497,
+  4498,
+  4499,
+  4500,
+  4501,
+  4502,
+  4503,
+  4504,
+  4505,
+  4506,
+  4507,
+  4508,
+  4509,
+  4510,
+  4511,
+  4512,
+  4513,
+  4514,
+  4515,
+  4516,
+  4517,
+  4518,
+  4519,
+  4520,
+  4521,
+  4522,
+  4523,
+  4524,
+  4525,
+  4526,
+  4527,
+  4528,
+  4529,
+  4530,
+  4531,
+  4532,
+  4533,
+  4534,
+  4535,
+  4536,
+  4537,
+  4538,
+  4539,
+  4540,
+  4541,
+  4542,
+  4543,
+  4544,
+  4545,
+  4546,
+  4547,
+  4548,
+  4549,
+  4550,
+  4551,
+  4552,
+  4553,
+  4554,
+  4555,
+  4556,
+  4557,
+  4558,
+  4559,
+  4560,
+  4561,
+  4562,
+  4563,
+  4564,
+  4565,
+  4566,
+  4567,
+  4568,
+  4569,
+  4570,
+  4571,
+  4572,
+  4573,
+  4574,
+  4575,
+  4576,
+  4577,
+  4578,
+  4579,
+  4580,
+  4581,
+  4582,
+  4583,
+  4584,
+  4585,
+  4586,
+  4587,
+  4588,
+  4589,
+  4590,
+  4591,
+  4592,
+  4593,
+  4594,
+  4595,
+  4596,
+  4597,
+  4598,
+  4599,
+  4600,
+  4601,
+  4602,
+  4603,
+  4604,
+  4605,
+  4606,
+  4607,
+  4608,
+  4609,
+  4610,
+  4611,
+  4612,
+  4613,
+  4614,
+  4615,
+  4616,
+  4617,
+  4618,
+  4619,
+  4620,
+  4621,
+  4622,
+  4623,
+  4624,
+  4625,
+  4626,
+  4627,
+  4628,
+  4629,
+  4630,
+  4631,
+  4632,
+  4633,
+  4634,
+  4635,
+  4636,
+  4637,
+  4638,
+  4639,
+  4640,
+  4641,
+  4642,
+  4643,
+  4644,
+  4645,
+  4646,
+  4647,
+  4648,
+  4649,
+  4650,
+  4651,
+  4652,
+  4653,
+  4654,
+  4655,
+  4656,
+  4657,
+  4658,
+  4659,
+  4660,
+  4661,
+  4662,
+  4663,
+  4664,
+  4665,
+  4666,
+  4667,
+  4668,
+  4669,
+  4670,
+  4671,
+  4672,
+  4673,
+  4674,
+  4675,
+  4676,
+  4677,
+  4678,
+  4679,
+  4680,
+  4681,
+  4682,
+  4683,
+  4684,
+  4685,
+  4686,
+  4687,
+  4688,
+  4689,
+  4690,
+  4691,
+  4692,
+  4693,
+  4694,
+  4695,
+  4696,
+  4697,
+  4698,
+  4699,
+  4700,
+  4701,
+  4702,
+  4703,
+  4704,
+  4705,
+  4706,
+  4707,
+  4708,
+  4709,
+  4710,
+  4711,
+  4712,
+  4713,
+  4714,
+  4715,
+  4716,
+  4717,
+  4718,
+  4719,
+  4720,
+  4721,
+  4722,
+  4723,
+  4724,
+  4725,
+  4726,
+  4727,
+  4728,
+  4729,
+  4730,
+  4731,
+  4732,
+  4733,
+  4734,
+  4735,
+  4736,
+  4737,
+  4738,
+  4739,
+  4740,
+  4741,
+  4742,
+  4743,
+  4744,
+  4745,
+  4746,
+  4747,
+  4748,
+  4749,
+  4750,
+  4751,
+  4752,
+  4753,
+  4754,
+  4755,
+  4756,
+  4757,
+  4758,
+  4759,
+  4760,
+  4761,
+  4762,
+  4763,
+  4764,
+  4765,
+  4766,
+  4767,
+  4768,
+  4769,
+  4770,
+  4771,
+  4772,
+  4773,
+  4774,
+  4775,
+  4776,
+  4777,
+  4778,
+  4779,
+  4780,
+  4781,
+  4782,
+  4783,
+  4784,
+  4785,
+  4786,
+  4787,
+  4788,
+  4789,
+  4790,
+  4791,
+  4792,
+  4793,
+  4794,
+  4795,
+  4796,
+  4797,
+  4798,
+  4799,
+  4800,
+  4801,
+  4802,
+  4803,
+  4804,
+  4805,
+  4806,
+  4807,
+  4808,
+  4809,
+  4810,
+  4811,
+  4812,
+  4813,
+  4814,
+  4815,
+  4816,
+  4817,
+  4818,
+  4819,
+  4820,
+  4821,
+  4822,
+  4823,
+  4824,
+  4825,
+  4826,
+  4827,
+  4828,
+  4829,
+  4830,
+  4831,
+  4832,
+  4833,
+  4834,
+  4835,
+  4836,
+  4837,
+  4838,
+  4839,
+  4840,
+  4841,
+  4842,
+  4843,
+  4844,
+  4845,
+  4846,
+  4847,
+  4848,
+  4849,
+  4850,
+  4851,
+  4852,
+  4853,
+  4854,
+  4855,
+  4856,
+  4857,
+  4858,
+  4859,
+  4860,
+  4861,
+  4862,
+  4863,
+  4864,
+  4865,
+  4866,
+  4867,
+  4868,
+  4869,
+  4870,
+  4871,
+  4872,
+  4873,
+  4874,
+  4875,
+  4876,
+  4877,
+  4878,
+  4879,
+  4880,
+  4881,
+  4882,
+  4883,
+  4884,
+  4885,
+  4886,
+  4887,
+  4888,
+  4889,
+  4890,
+  4891,
+  4892,
+  4893,
+  4894,
+  4895,
+  4896,
+  4897,
+  4898,
+  4899,
+  4900,
+  4901,
+  4902,
+  4903,
+  4904,
+  4905,
+  4906,
+  4907,
+  4908,
+  4909,
+  4910,
+  4911,
+  4912,
+  4913,
+  4914,
+  4915,
+  4916,
+  4917,
+  4918,
+  4919,
+  4920,
+  4921,
+  4922,
+  4923,
+  4924,
+  4925,
+  4926,
+  4927,
+  4928,
+  4929,
+  4930,
+  4931,
+  4932,
+  4933,
+  4934,
+  4935,
+  4936,
+  4937,
+  4938,
+  4939,
+  4940,
+  4941,
+  4942,
+  4943,
+  4944,
+  4945,
+  4946,
+  4947,
+  4948,
+  4949,
+  4950,
+  4951,
+  4952,
+  4953,
+  4954,
+  4955,
+  4956,
+  4957,
+  4958,
+  4959,
+  4960,
+  4961,
+  4962,
+  4963,
+  4964,
+  4965,
+  4966,
+  4967,
+  4968,
+  4969,
+  4970,
+  4971,
+  4972,
+  4973,
+  4974,
+  4975,
+  4976,
+  4977,
+  4978,
+  4979,
+  4980,
+  4981,
+  4982,
+  4983,
+  4984,
+  4985,
+  4986,
+  4987,
+  4988,
+  4989,
+  4990,
+  4991,
+  4992,
+  4993,
+  4994,
+  4995,
+  4996,
+  4997,
+  4998,
+  4999,
+  5000,
+  5001,
+  5002,
+  5003,
+  5004,
+  5005,
+  5006,
+  5007,
+  5008,
+  5009,
+  5010,
+  5011,
+  5012,
+  5013,
+  5014,
+  5015,
+  5016,
+  5017,
+  5018,
+  5019,
+  5020,
+  5021,
+  5022,
+  5023,
+  5024,
+  5025,
+  5026,
+  5027,
+  5028,
+  5029,
+  5030,
+  5031,
+  5032,
+  5033,
+  5034,
+  5035,
+  5036,
+  5037,
+  5038,
+  5039,
+  5040,
+  5041,
+  5042,
+  5043,
+  5044,
+  5045,
+  5046,
+  5047,
+  5048,
+  5049,
+  5050,
+  5051,
+  5052,
+  5053,
+  5054,
+  5055,
+  5056,
+  5057,
+  5058,
+  5059,
+  5060,
+  5061,
+  5062,
+  5063,
+  5064,
+  5065,
+  5066,
+  5067,
+  5068,
+  5069,
+  5070,
+  5071,
+  5072,
+  5073,
+  5074,
+  5075,
+  5076,
+  5077,
+  5078,
+  5079,
+  5080,
+  5081,
+  5082,
+  5083,
+  5084,
+  5085,
+  5086,
+  5087,
+  5088,
+  5089,
+  5090,
+  5091,
+  5092,
+  5093,
+  5094,
+  5095,
+  5096,
+  5097,
+  5098,
+  5099,
+  5100,
+  5101,
+  5102,
+  5103,
+  5104,
+  5105,
+  5106,
+  5107,
+  5108,
+  5109,
+  5110,
+  5111,
+  5112,
+  5113,
+  5114,
+  5115,
+  5116,
+  5117,
+  5118,
+  5119,
+  5120,
+  5121,
+  5122,
+  5123,
+  5124,
+  5125,
+  5126,
+  5127,
+  5128,
+  5129,
+  5130,
+  5131,
+  5132,
+  5133,
+  5134,
+  5135,
+  5136,
+  5137,
+  5138,
+  5139,
+  5140,
+  5141,
+  5142,
+  5143,
+  5144,
+  5145,
+  5146,
+  5147,
+  5148,
+  5149,
+  5150,
+  5151,
+  5152,
+  5153,
+  5154,
+  5155,
+  5156,
+  5157,
+  5158,
+  5159,
+  5160,
+  5161,
+  5162,
+  5163,
+  5164,
+  5165,
+  5166,
+  5167,
+  5168,
+  5169,
+  5170,
+  5171,
+  5172,
+  5173,
+  5174,
+  5175,
+  5176,
+  5177,
+  5178,
+  5179,
+  5180,
+  5181,
+  5182,
+  5183,
+  5184,
+  5185,
+  5186,
+  5187,
+  5188,
+  5189,
+  5190,
+  5191,
+  5192,
+  5193,
+  5194,
+  5195,
+  5196,
+  5197,
+  5198,
+  5199,
+  5200,
+  5201,
+  5202,
+  5203,
+  5204,
+  5205,
+  5206,
+  5207,
+  5208,
+  5209,
+  5210,
+  5211,
+  5212,
+  5213,
+  5214,
+  5215,
+  5216,
+  5217,
+  5218,
+  5219,
+  5220,
+  5221,
+  5222,
+  5223,
+  5224,
+  5225,
+  5226,
+  5227,
+  5228,
+  5229,
+  5230,
+  5231,
+  5232,
+  5233,
+  5234,
+  5235,
+  5236,
+  5237,
+  5238,
+  5239,
+  5240,
+  5241,
+  5242,
+  5243,
+  5244,
+  5245,
+  5246,
+  5247,
+  5248,
+  5249,
+  5250,
+  5251,
+  5252,
+  5253,
+  5254,
+  5255,
+  5256,
+  5257,
+  5258,
+  5259,
+  5260,
+  5261,
+  5262,
+  5263,
+  5264,
+  5265,
+  5266,
+  5267,
+  5268,
+  5269,
+  5270,
+  5271,
+  5272,
+  5273,
+  5274,
+  5275,
+  5276,
+  5277,
+  5278,
+  5279,
+  5280,
+  5281,
+  5282,
+  5283,
+  5284,
+  5285,
+  5286,
+  5287,
+  5288,
+  5289,
+  5290,
+  5291,
+  5292,
+  5293,
+  5294,
+  5295,
+  5296,
+  5297,
+  5298,
+  5299,
+  5300,
+  5301,
+  5302,
+  5303,
+  5304,
+  5305,
+  5306,
+  5307,
+  5308,
+  5309,
+  5310,
+  5311,
+  5312,
+  5313,
+  5314,
+  5315,
+  5316,
+  5317,
+  5318,
+  5319,
+  5320,
+  5321,
+  5322,
+  5323,
+  5324,
+  5325,
+  5326,
+  5327,
+  5328,
+  5329,
+  5330,
+  5331,
+  5332,
+  5333,
+  5334,
+  5335,
+  5336,
+  5337,
+  5338,
+  5339,
+  5340,
+  5341,
+  5342,
+  5343,
+  5344,
+  5345,
+  5346,
+  5347,
+  5348,
+  5349,
+  5350,
+  5351,
+  5352,
+  5353,
+  5354,
+  5355,
+  5356,
+  5357,
+  5358,
+  5359,
+  5360,
+  5361,
+  5362,
+  5363,
+  5364,
+  5365,
+  5366,
+  5367,
+  5368,
+  5369,
+  5370,
+  5371,
+  5372,
+  5373,
+  5374,
+  5375,
+  5376,
+  5377,
+  5378,
+  5379,
+  5380,
+  5381,
+  5382,
+  5383,
+  5384,
+  5385,
+  5386,
+  5387,
+  5388,
+  5389,
+  5390,
+  5391,
+  5392,
+  5393,
+  5394,
+  5395,
+  5396,
+  5397,
+  5398,
+  5399,
+  5400,
+  5401,
+  5402,
+  5403,
+  5404,
+  5405,
+  5406,
+  5407,
+  5408,
+  5409,
+  5410,
+  5411,
+  5412,
+  5413,
+  5414,
+  5415,
+  5416,
+  5417,
+  5418,
+  5419,
+  5420,
+  5421,
+  5422,
+  5423,
+  5424,
+  5425,
+  5426,
+  5427,
+  5428,
+  5429,
+  5430,
+  5431,
+  5432,
+  5433,
+  5434,
+  5435,
+  5436,
+  5437,
+  5438,
+  5439,
+  5440,
+  5441,
+  5442,
+  5443,
+  5444,
+  5445,
+  5446,
+  5447,
+  5448,
+  5449,
+  5450,
+  5451,
+  5452,
+  5453,
+  5454,
+  5455,
+  5456,
+  5457,
+  5458,
+  5459,
+  5460,
+  5461,
+  5462,
+  5463,
+  5464,
+  5465,
+  5466,
+  5467,
+  5468,
+  5469,
+  5470,
+  5471,
+  5472,
+  5473,
+  5474,
+  5475,
+  5476,
+  5477,
+  5478,
+  5479,
+  5480,
+  5481,
+  5482,
+  5483,
+  5484,
+  5485,
+  5486,
+  5487,
+  5488,
+  5489,
+  5490,
+  5491,
+  5492,
+  5493,
+  5494,
+  5495,
+  5496,
+  5497,
+  5498,
+  5499,
+  5500,
+  5501,
+  5502,
+  5503,
+  5504,
+  5505,
+  5506,
+  5507,
+  5508,
+  5509,
+  5510,
+  5511,
+  5512,
+  5513,
+  5514,
+  5515,
+  5516,
+  5517,
+  5518,
+  5519,
+  5520,
+  5521,
+  5522,
+  5523,
+  5524,
+  5525,
+  5526,
+  5527,
+  5528,
+  5529,
+  5530,
+  5531,
+  5532,
+  5533,
+  5534,
+  5535,
+  5536,
+  5537,
+  5538,
+  5539,
+  5540,
+  5541,
+  5542,
+  5543,
+  5544,
+  5545,
+  5546,
+  5547,
+  5548,
+  5549,
+  5550,
+  5551,
+  5552,
+  5553,
+  5554,
+  5555,
+  5556,
+  5557,
+  5558,
+  5559,
+  5560,
+  5561,
+  5562,
+  5563,
+  5564,
+  5565,
+  5566,
+  5567,
+  5568,
+  5569,
+  5570,
+  5571,
+  5572,
+  5573,
+  5574,
+  5575,
+  5576,
+  5577,
+  5578,
+  5579,
+  5580,
+  5581,
+  5582,
+  5583,
+  5584,
+  5585,
+  5586,
+  5587,
+  5588,
+  5589,
+  5590,
+  5591,
+  5592,
+  5593,
+  5594,
+  5595,
+  5596,
+  5597,
+  5598,
+  5599,
+  5600,
+  5601,
+  5602,
+  5603,
+  5604,
+  5605,
+  5606,
+  5607,
+  5608,
+  5609,
+  5610,
+  5611,
+  5612,
+  5613,
+  5614,
+  5615,
+  5616,
+  5617,
+  5618,
+  5619,
+  5620,
+  5621,
+  5622,
+  5623,
+  5624,
+  5625,
+  5626,
+  5627,
+  5628,
+  5629,
+  5630,
+  5631,
+  5632,
+  5633,
+  5634,
+  5635,
+  5636,
+  5637,
+  5638,
+  5639,
+  5640,
+  5641,
+  5642,
+  5643,
+  5644,
+  5645,
+  5646,
+  5647,
+  5648,
+  5649,
+  5650,
+  5651,
+  5652,
+  5653,
+  5654,
+  5655,
+  5656,
+  5657,
+  5658,
+  5659,
+  5660,
+  5661,
+  5662,
+  5663,
+  5664,
+  5665,
+  5666,
+  5667,
+  5668,
+  5669,
+  5670,
+  5671,
+  5672,
+  5673,
+  5674,
+  5675,
+  5676,
+  5677,
+  5678,
+  5679,
+  5680,
+  5681,
+  5682,
+  5683,
+  5684,
+  5685,
+  5686,
+  5687,
+  5688,
+  5689,
+  5690,
+  5691,
+  5692,
+  5693,
+  5694,
+  5695,
+  5696,
+  5697,
+  5698,
+  5699,
+  5700,
+  5701,
+  5702,
+  5703,
+  5704,
+  5705,
+  5706,
+  5707,
+  5708,
+  5709,
+  5710,
+  5711,
+  5712,
+  5713,
+  5714,
+  5715,
+  5716,
+  5717,
+  5718,
+  5719,
+  5720,
+  5721,
+  5722,
+  5723,
+  5724,
+  5725,
+  5726,
+  5727,
+  5728,
+  5729,
+  5730,
+  5731,
+  5732,
+  5733,
+  5734,
+  5735,
+  5736,
+  5737,
+  5738,
+  5739,
+  5740,
+  5741,
+  5742,
+  5743,
+  5744,
+  5745,
+  5746,
+  5747,
+  5748,
+  5749,
+  5750,
+  5751,
+  5752,
+  5753,
+  5754,
+  5755,
+  5756,
+  5757,
+  5758,
+  5759,
+  5760,
+  5761,
+  5762,
+  5763,
+  5764,
+  5765,
+  5766,
+  5767,
+  5768,
+  5769,
+  5770,
+  5771,
+  5772,
+  5773,
+  5774,
+  5775,
+  5776,
+  5777,
+  5778,
+  5779,
+  5780,
+  5781,
+  5782,
+  5783,
+  5784,
+  5785,
+  5786,
+  5787,
+  5788,
+  5789,
+  5790,
+  5791,
+  5792,
+  5793,
+  5794,
+  5795,
+  5796,
+  5797,
+  5798,
+  5799,
+  5800,
+  5801,
+  5802,
+  5803,
+  5804,
+  5805,
+  5806,
+  5807,
+  5808,
+  5809,
+  5810,
+  5811,
+  5812,
+  5813,
+  5814,
+  5815,
+  5816,
+  5817,
+  5818,
+  5819,
+  5820,
+  5821,
+  5822,
+  5823,
+  5824,
+  5825,
+  5826,
+  5827,
+  5828,
+  5829,
+  5830,
+  5831,
+  5832,
+  5833,
+  5834,
+  5835,
+  5836,
+  5837,
+  5838,
+  5839,
+  5840,
+  5841,
+  5842,
+  5843,
+  5844,
+  5845,
+  5846,
+  5847,
+  5848,
+  5849,
+  5850,
+  5851,
+  5852,
+  5853,
+  5854,
+  5855,
+  5856,
+  5857,
+  5858,
+  5859,
+  5860,
+  5861,
+  5862,
+  5863,
+  5864,
+  5865,
+  5866,
+  5867,
+  5868,
+  5869,
+  5870,
+  5871,
+  5872,
+  5873,
+  5874,
+  5875,
+  5876,
+  5877,
+  5878,
+  5879,
+  5880,
+  5881,
+  5882,
+  5883,
+  5884,
+  5885,
+  5886,
+  5887,
+  5888,
+  5889,
+  5890,
+  5891,
+  5892,
+  5893,
+  5894,
+  5895,
+  5896,
+  5897,
+  5898,
+  5899,
+  5900,
+  5901,
+  5902,
+  5903,
+  5904,
+  5905,
+  5906,
+  5907,
+  5908,
+  5909,
+  5910,
+  5911,
+  5912,
+  5913,
+  5914,
+  5915,
+  5916,
+  5917,
+  5918,
+  5919,
+  5920,
+  5921,
+  5922,
+  5923,
+  5924,
+  5925,
+  5926,
+  5927,
+  5928,
+  5929,
+  5930,
+  5931,
+  5932,
+  5933,
+  5934,
+  5935,
+  5936,
+  5937,
+  5938,
+  5939,
+  5940,
+  5941,
+  5942,
+  5943,
+  5944,
+  5945,
+  5946,
+  5947,
+  5948,
+  5949,
+  5950,
+  5951,
+  5952,
+  5953,
+  5954,
+  5955,
+  5956,
+  5957,
+  5958,
+  5959,
+  5960,
+  5961,
+  5962,
+  5963,
+  5964,
+  5965,
+  5966,
+  5967,
+  5968,
+  5969,
+  5970,
+  5971,
+  5972,
+  5973,
+  5974,
+  5975,
+  5976,
+  5977,
+  5978,
+  5979,
+  5980,
+  5981,
+  5982,
+  5983,
+  5984,
+  5985,
+  5986,
+  5987,
+  5988,
+  5989,
+  5990,
+  5991,
+  5992,
+  5993,
+  5994,
+  5995,
+  5996,
+  5997,
+  5998,
+  5999,
+  6000,
+  6001,
+  6002,
+  6003,
+  6004,
+  6005,
+  6006,
+  6007,
+  6008,
+  6009,
+  6010,
+  6011,
+  6012,
+  6013,
+  6014,
+  6015,
+  6016,
+  6017,
+  6018,
+  6019,
+  6020,
+  6021,
+  6022,
+  6023,
+  6024,
+  6025,
+  6026,
+  6027,
+  6028,
+  6029,
+  6030,
+  6031,
+  6032,
+  6033,
+  6034,
+  6035,
+  6036,
+  6037,
+  6038,
+  6039,
+  6040,
+  6041,
+  6042,
+  6043,
+  6044,
+  6045,
+  6046,
+  6047,
+  6048,
+  6049,
+  6050,
+  6051,
+  6052,
+  6053,
+  6054,
+  6055,
+  6056,
+  6057,
+  6058,
+  6059,
+  6060,
+  6061,
+  6062,
+  6063,
+  6064,
+  6065,
+  6066,
+  6067,
+  6068,
+  6069,
+  6070,
+  6071,
+  6072,
+  6073,
+  6074,
+  6075,
+  6076,
+  6077,
+  6078,
+  6079,
+  6080,
+  6081,
+  6082,
+  6083,
+  6084,
+  6085,
+  6086,
+  6087,
+  6088,
+  6089,
+  6090,
+  6091,
+  6092,
+  6093,
+  6094,
+  6095,
+  6096,
+  6097,
+  6098,
+  6099,
+  6100,
+  6101,
+  6102,
+  6103,
+  6104,
+  6105,
+  6106,
+  6107,
+  6108,
+  6109,
+  6110,
+  6111,
+  6112,
+  6113,
+  6114,
+  6115,
+  6116,
+  6117,
+  6118,
+  6119,
+  6120,
+  6121,
+  6122,
+  6123,
+  6124,
+  6125,
+  6126,
+  6127,
+  6128,
+  6129,
+  6130,
+  6131,
+  6132,
+  6133,
+  6134,
+  6135,
+  6136,
+  6137,
+  6138,
+  6139,
+  6140,
+  6141,
+  6142,
+  6143,
+  6144,
+  6145,
+  6146,
+  6147,
+  6148,
+  6149,
+  6150,
+  6151,
+  6152,
+  6153,
+  6154,
+  6155,
+  6156,
+  6157,
+  6158,
+  6159,
+  6160,
+  6161,
+  6162,
+  6163,
+  6164,
+  6165,
+  6166,
+  6167,
+  6168,
+  6169,
+  6170,
+  6171,
+  6172,
+  6173,
+  6174,
+  6175,
+  6176,
+  6177,
+  6178,
+  6179,
+  6180,
+  6181,
+  6182,
+  6183,
+  6184,
+  6185,
+  6186,
+  6187,
+  6188,
+  6189,
+  6190,
+  6191,
+  6192,
+  6193,
+  6194,
+  6195,
+  6196,
+  6197,
+  6198,
+  6199,
+  6200,
+  6201,
+  6202,
+  6203,
+  6204,
+  6205,
+  6206,
+  6207,
+  6208,
+  6209,
+  6210,
+  6211,
+  6212,
+  6213,
+  6214,
+  6215,
+  6216,
+  6217,
+  6218,
+  6219,
+  6220,
+  6221,
+  6222,
+  6223,
+  6224,
+  6225,
+  6226,
+  6227,
+  6228,
+  6229,
+  6230,
+  6231,
+  6232,
+  6233,
+  6234,
+  6235,
+  6236,
+  6237,
+  6238,
+  6239,
+  6240,
+  6241,
+  6242,
+  6243,
+  6244,
+  6245,
+  6246,
+  6247,
+  6248,
+  6249,
+  6250,
+  6251,
+  6252,
+  6253,
+  6254,
+  6255,
+  6256,
+  6257,
+  6258,
+  6259,
+  6260,
+  6261,
+  6262,
+  6263,
+  6264,
+  6265,
+  6266,
+  6267,
+  6268,
+  6269,
+  6270,
+  6271,
+  6272,
+  6273,
+  6274,
+  6275,
+  6276,
+  6277,
+  6278,
+  6279,
+  6280,
+  6281,
+  6282,
+  6283,
+  6284,
+  6285,
+  6286,
+  6287,
+  6288,
+  6289,
+  6290,
+  6291,
+  6292,
+  6293,
+  6294,
+  6295,
+  6296,
+  6297,
+  6298,
+  6299,
+  6300,
+  6301,
+  6302,
+  6303,
+  6304,
+  6305,
+  6306,
+  6307,
+  6308,
+  6309,
+  6310,
+  6311,
+  6312,
+  6313,
+  6314,
+  6315,
+  6316,
+  6317,
+  6318,
+  6319,
+  6320,
+  6321,
+  6322,
+  6323,
+  6324,
+  6325,
+  6326,
+  6327,
+  6328,
+  6329,
+  6330,
+  6331,
+  6332,
+  6333,
+  6334,
+  6335,
+  6336,
+  6337,
+  6338,
+  6339,
+  6340,
+  6341,
+  6342,
+  6343,
+  6344,
+  6345,
+  6346,
+  6347,
+  6348,
+  6349,
+  6350,
+  6351,
+  6352,
+  6353,
+  6354,
+  6355,
+  6356,
+  6357,
+  6358,
+  6359,
+  6360,
+  6361,
+  6362,
+  6363,
+  6364,
+  6365,
+  6366,
+  6367,
+  6368,
+  6369,
+  6370,
+  6371,
+  6372,
+  6373,
+  6374,
+  6375,
+  6376,
+  6377,
+  6378,
+  6379,
+  6380,
+  6381,
+  6382,
+  6383,
+  6384,
+  6385,
+  6386,
+  6387,
+  6388,
+  6389,
+  6390,
+  6391,
+  6392,
+  6393,
+  6394,
+  6395,
+  6396,
+  6397,
+  6398,
+  6399,
+  6400,
+  6401,
+  6402,
+  6403,
+  6404,
+  6405,
+  6406,
+  6407,
+  6408,
+  6409,
+  6410,
+  6411,
+  6412,
+  6413,
+  6414,
+  6415,
+  6416,
+  6417,
+  6418,
+  6419,
+  6420,
+  6421,
+  6422,
+  6423,
+  6424,
+  6425,
+  6426,
+  6427,
+  6428,
+  6429,
+  6430,
+  6431,
+  6432,
+  6433,
+  6434,
+  6435,
+  6436,
+  6437,
+  6438,
+  6439,
+  6440,
+  6441,
+  6442,
+  6443,
+  6444,
+  6445,
+  6446,
+  6447,
+  6448,
+  6449,
+  6450,
+  6451,
+  6452,
+  6453,
+  6454,
+  6455,
+  6456,
+  6457,
+  6458,
+  6459,
+  6460,
+  6461,
+  6462,
+  6463,
+  6464,
+  6465,
+  6466,
+  6467,
+  6468,
+  6469,
+  6470,
+  6471,
+  6472,
+  6473,
+  6474,
+  6475,
+  6476,
+  6477,
+  6478,
+  6479,
+  6480,
+  6481,
+  6482,
+  6483,
+  6484,
+  6485,
+  6486,
+  6487,
+  6488,
+  6489,
+  6490,
+  6491,
+  6492,
+  6493,
+  6494,
+  6495,
+  6496,
+  6497,
+  6498,
+  6499,
+  6500,
+  6501,
+  6502,
+  6503,
+  6504,
+  6505,
+  6506,
+  6507,
+  6508,
+  6509,
+  6510,
+  6511,
+  6512,
+  6513,
+  6514,
+  6515,
+  6516,
+  6517,
+  6518,
+  6519,
+  6520,
+  6521,
+  6522,
+  6523,
+  6524,
+  6525,
+  6526,
+  6527,
+  6528,
+  6529,
+  6530,
+  6531,
+  6532,
+  6533,
+  6534,
+  6535,
+  6536,
+  6537,
+  6538,
+  6539,
+  6540,
+  6541,
+  6542,
+  6543,
+  6544,
+  6545,
+  6546,
+  6547,
+  6548,
+  6549,
+  6550,
+  6551,
+  6552,
+  6553,
+  6554,
+  6555,
+  6556,
+  6557,
+  6558,
+  6559,
+  6560,
+  6561,
+  6562,
+  6563,
+  6564,
+  6565,
+  6566,
+  6567,
+  6568,
+  6569,
+  6570,
+  6571,
+  6572,
+  6573,
+  6574,
+  6575,
+  6576,
+  6577,
+  6578,
+  6579,
+  6580,
+  6581,
+  6582,
+  6583,
+  6584,
+  6585,
+  6586,
+  6587,
+  6588,
+  6589,
+  6590,
+  6591,
+  6592,
+  6593,
+  6594,
+  6595,
+  6596,
+  6597,
+  6598,
+  6599,
+  6600,
+  6601,
+  6602,
+  6603,
+  6604,
+  6605,
+  6606,
+  6607,
+  6608,
+  6609,
+  6610,
+  6611,
+  6612,
+  6613,
+  6614,
+  6615,
+  6616,
+  6617,
+  6618,
+  6619,
+  6620,
+  6621,
+  6622,
+  6623,
+  6624,
+  6625,
+  6626,
+  6627,
+  6628,
+  6629,
+  6630,
+  6631,
+  6632,
+  6633,
+  6634,
+  6635,
+  6636,
+  6637,
+  6638,
+  6639,
+  6640,
+  6641,
+  6642,
+  6643,
+  6644,
+  6645,
+  6646,
+  6647,
+  6648,
+  6649,
+  6650,
+  6651,
+  6652,
+  6653,
+  6654,
+  6655,
+  6656,
+  6657,
+  6658,
+  6659,
+  6660,
+  6661,
+  6662,
+  6663,
+  6664,
+  6665,
+  6666,
+  6667,
+  6668,
+  6669,
+  6670,
+  6671,
+  6672,
+  6673,
+  6674,
+  6675,
+  6676,
+  6677,
+  6678,
+  6679,
+  6680,
+  6681,
+  6682,
+  6683,
+  6684,
+  6685,
+  6686,
+  6687,
+  6688,
+  6689,
+  6690,
+  6691,
+  6692,
+  6693,
+  6694,
+  6695,
+  6696,
+  6697,
+  6698,
+  6699,
+  6700,
+  6701,
+  6702,
+  6703,
+  6704,
+  6705,
+  6706,
+  6707,
+  6708,
+  6709,
+  6710,
+  6711,
+  6712,
+  6713,
+  6714,
+  6715,
+  6716,
+  6717,
+  6718,
+  6719,
+  6720,
+  6721,
+  6722,
+  6723,
+  6724,
+  6725,
+  6726,
+  6727,
+  6728,
+  6729,
+  6730,
+  6731,
+  6732,
+  6733,
+  6734,
+  6735,
+  6736,
+  6737,
+  6738,
+  6739,
+  6740,
+  6741,
+  6742,
+  6743,
+  6744,
+  6745,
+  6746,
+  6747,
+  6748,
+  6749,
+  6750,
+  6751,
+  6752,
+  6753,
+  6754,
+  6755,
+  6756,
+  6757,
+  6758,
+  6759,
+  6760,
+  6761,
+  6762,
+  6763,
+  6764,
+  6765,
+  6766,
+  6767,
+  6768,
+  6769,
+  6770,
+  6771,
+  6772,
+  6773,
+  6774,
+  6775,
+  6776,
+  6777,
+  6778,
+  6779,
+  6780,
+  6781,
+  6782,
+  6783,
+  6784,
+  6785,
+  6786,
+  6787,
+  6788,
+  6789,
+  6790,
+  6791,
+  6792,
+  6793,
+  6794,
+  6795,
+  6796,
+  6797,
+  6798,
+  6799,
+  6800,
+  6801,
+  6802,
+  6803,
+  6804,
+  6805,
+  6806,
+  6807,
+  6808,
+  6809,
+  6810,
+  6811,
+  6812,
+  6813,
+  6814,
+  6815,
+  6816,
+  6817,
+  6818,
+  6819,
+  6820,
+  6821,
+  6822,
+  6823,
+  6824,
+  6825,
+  6826,
+  6827,
+  6828,
+  6829,
+  6830,
+  6831,
+  6832,
+  6833,
+  6834,
+  6835,
+  6836,
+  6837,
+  6838,
+  6839,
+  6840,
+  6841,
+  6842,
+  6843,
+  6844,
+  6845,
+  6846,
+  6847,
+  6848,
+  6849,
+  6850,
+  6851,
+  6852,
+  6853,
+  6854,
+  6855,
+  6856,
+  6857,
+  6858,
+  6859,
+  6860,
+  6861,
+  6862,
+  6863,
+  6864,
+  6865,
+  6866,
+  6867,
+  6868,
+  6869,
+  6870,
+  6871,
+  6872,
+  6873,
+  6874,
+  6875,
+  6876,
+  6877,
+  6878,
+  6879,
+  6880,
+  6881,
+  6882,
+  6883,
+  6884,
+  6885,
+  6886,
+  6887,
+  6888,
+  6889,
+  6890,
+  6891,
+  6892,
+  6893,
+  6894,
+  6895,
+  6896,
+  6897,
+  6898,
+  6899,
+  6900,
+  6901,
+  6902,
+  6903,
+  6904,
+  6905,
+  6906,
+  6907,
+  6908,
+  6909,
+  6910,
+  6911,
+  6912,
+  6913,
+  6914,
+  6915,
+  6916,
+  6917,
+  6918,
+  6919,
+  6920,
+  6921,
+  6922,
+  6923,
+  6924,
+  6925,
+  6926,
+  6927,
+  6928,
+  6929,
+  6930,
+  6931,
+  6932,
+  6933,
+  6934,
+  6935,
+  6936,
+  6937,
+  6938,
+  6939,
+  6940,
+  6941,
+  6942,
+  6943,
+  6944,
+  6945,
+  6946,
+  6947,
+  6948,
+  6949,
+  6950,
+  6951,
+  6952,
+  6953,
+  6954,
+  6955,
+  6956,
+  6957,
+  6958,
+  6959,
+  6960,
+  6961,
+  6962,
+  6963,
+  6964,
+  6965,
+  6966,
+  6967,
+  6968,
+  6969,
+  6970,
+  6971,
+  6972,
+  6973,
+  6974,
+  6975,
+  6976,
+  6977,
+  6978,
+  6979,
+  6980,
+  6981,
+  6982,
+  6983,
+  6984,
+  6985,
+  6986,
+  6987,
+  6988,
+  6989,
+  6990,
+  6991,
+  6992,
+  6993,
+  6994,
+  6995,
+  6996,
+  6997,
+  6998,
+  6999,
+  7000,
+  7001,
+  7002,
+  7003,
+  7004,
+  7005,
+  7006,
+  7007,
+  7008,
+  7009,
+  7010,
+  7011,
+  7012,
+  7013,
+  7014,
+  7015,
+  7016,
+  7017,
+  7018,
+  7019,
+  7020,
+  7021,
+  7022,
+  7023,
+  7024,
+  7025,
+  7026,
+  7027,
+  7028,
+  7029,
+  7030,
+  7031,
+  7032,
+  7033,
+  7034,
+  7035,
+  7036,
+  7037,
+  7038,
+  7039,
+  7040,
+  7041,
+  7042,
+  7043,
+  7044,
+  7045,
+  7046,
+  7047,
+  7048,
+  7049,
+  7050,
+  7051,
+  7052,
+  7053,
+  7054,
+  7055,
+  7056,
+  7057,
+  7058,
+  7059,
+  7060,
+  7061,
+  7062,
+  7063,
+  7064,
+  7065,
+  7066,
+  7067,
+  7068,
+  7069,
+  7070,
+  7071,
+  7072,
+  7073,
+  7074,
+  7075,
+  7076,
+  7077,
+  7078,
+  7079,
+  7080,
+  7081,
+  7082,
+  7083,
+  7084,
+  7085,
+  7086,
+  7087,
+  7088,
+  7089,
+  7090,
+  7091,
+  7092,
+  7093,
+  7094,
+  7095,
+  7096,
+  7097,
+  7098,
+  7099,
+  7100,
+  7101,
+  7102,
+  7103,
+  7104,
+  7105,
+  7106,
+  7107,
+  7108,
+  7109,
+  7110,
+  7111,
+  7112,
+  7113,
+  7114,
+  7115,
+  7116,
+  7117,
+  7118,
+  7119,
+  7120,
+  7121,
+  7122,
+  7123,
+  7124,
+  7125,
+  7126,
+  7127,
+  7128,
+  7129,
+  7130,
+  7131,
+  7132,
+  7133,
+  7134,
+  7135,
+  7136,
+  7137,
+  7138,
+  7139,
+  7140,
+  7141,
+  7142,
+  7143,
+  7144,
+  7145,
+  7146,
+  7147,
+  7148,
+  7149,
+  7150,
+  7151,
+  7152,
+  7153,
+  7154,
+  7155,
+  7156,
+  7157,
+  7158,
+  7159,
+  7160,
+  7161,
+  7162,
+  7163,
+  7164,
+  7165,
+  7166,
+  7167,
+  7168,
+  7169,
+  7170,
+  7171,
+  7172,
+  7173,
+  7174,
+  7175,
+  7176,
+  7177,
+  7178,
+  7179,
+  7180,
+  7181,
+  7182,
+  7183,
+  7184,
+  7185,
+  7186,
+  7187,
+  7188,
+  7189,
+  7190,
+  7191,
+  7192,
+  7193,
+  7194,
+  7195,
+  7196,
+  7197,
+  7198,
+  7199,
+  7200,
+  7201,
+  7202,
+  7203,
+  7204,
+  7205,
+  7206,
+  7207,
+  7208,
+  7209,
+  7210,
+  7211,
+  7212,
+  7213,
+  7214,
+  7215,
+  7216,
+  7217,
+  7218,
+  7219,
+  7220,
+  7221,
+  7222,
+  7223,
+  7224,
+  7225,
+  7226,
+  7227,
+  7228,
+  7229,
+  7230,
+  7231,
+  7232,
+  7233,
+  7234,
+  7235,
+  7236,
+  7237,
+  7238,
+  7239,
+  7240,
+  7241,
+  7242,
+  7243,
+  7244,
+  7245,
+  7246,
+  7247,
+  7248,
+  7249,
+  7250,
+  7251,
+  7252,
+  7253,
+  7254,
+  7255,
+  7256,
+  7257,
+  7258,
+  7259,
+  7260,
+  7261,
+  7262,
+  7263,
+  7264,
+  7265,
+  7266,
+  7267,
+  7268,
+  7269,
+  7270,
+  7271,
+  7272,
+  7273,
+  7274,
+  7275,
+  7276,
+  7277,
+  7278,
+  7279,
+  7280,
+  7281,
+  7282,
+  7283,
+  7284,
+  7285,
+  7286,
+  7287,
+  7288,
+  7289,
+  7290,
+  7291,
+  7292,
+  7293,
+  7294,
+  7295,
+  7296,
+  7297,
+  7298,
+  7299,
+  7300,
+  7301,
+  7302,
+  7303,
+  7304,
+  7305,
+  7306,
+  7307,
+  7308,
+  7309,
+  7310,
+  7311,
+  7312,
+  7313,
+  7314,
+  7315,
+  7316,
+  7317,
+  7318,
+  7319,
+  7320,
+  7321,
+  7322,
+  7323,
+  7324,
+  7325,
+  7326,
+  7327,
+  7328,
+  7329,
+  7330,
+  7331,
+  7332,
+  7333,
+  7334,
+  7335,
+  7336,
+  7337,
+  7338,
+  7339,
+  7340,
+  7341,
+  7342,
+  7343,
+  7344,
+  7345,
+  7346,
+  7347,
+  7348,
+  7349,
+  7350,
+  7351,
+  7352,
+  7353,
+  7354,
+  7355,
+  7356,
+  7357,
+  7358,
+  7359,
+  7360,
+  7361,
+  7362,
+  7363,
+  7364,
+  7365,
+  7366,
+  7367,
+  7368,
+  7369,
+  7370,
+  7371,
+  7372,
+  7373,
+  7374,
+  7375,
+  7376,
+  7377,
+  7378,
+  7379,
+  7380,
+  7381,
+  7382,
+  7383,
+  7384,
+  7385,
+  7386,
+  7387,
+  7388,
+  7389,
+  7390,
+  7391,
+  7392,
+  7393,
+  7394,
+  7395,
+  7396,
+  7397,
+  7398,
+  7399,
+  7400,
+  7401,
+  7402,
+  7403,
+  7404,
+  7405,
+  7406,
+  7407,
+  7408,
+  7409,
+  7410,
+  7411,
+  7412,
+  7413,
+  7414,
+  7415,
+  7416,
+  7417,
+  7418,
+  7419,
+  7420,
+  7421,
+  7422,
+  7423,
+  7424,
+  7425,
+  7426,
+  7427,
+  7428,
+  7429,
+  7430,
+  7431,
+  7432,
+  7433,
+  7434,
+  7435,
+  7436,
+  7437,
+  7438,
+  7439,
+  7440,
+  7441,
+  7442,
+  7443,
+  7444,
+  7445,
+  7446,
+  7447,
+  7448,
+  7449,
+  7450,
+  7451,
+  7452,
+  7453,
+  7454,
+  7455,
+  7456,
+  7457,
+  7458,
+  7459,
+  7460,
+  7461,
+  7462,
+  7463,
+  7464,
+  7465,
+  7466,
+  7467,
+  7468,
+  7469,
+  7470,
+  7471,
+  7472,
+  7473,
+  7474,
+  7475,
+  7476,
+  7477,
+  7478,
+  7479,
+  7480,
+  7481,
+  7482,
+  7483,
+  7484,
+  7485,
+  7486,
+  7487,
+  7488,
+  7489,
+  7490,
+  7491,
+  7492,
+  7493,
+  7494,
+  7495,
+  7496,
+  7497,
+  7498,
+  7499,
+  7500,
+  7501,
+  7502,
+  7503,
+  7504,
+  7505,
+  7506,
+  7507,
+  7508,
+  7509,
+  7510,
+  7511,
+  7512,
+  7513,
+  7514,
+  7515,
+  7516,
+  7517,
+  7518,
+  7519,
+  7520,
+  7521,
+  7522,
+  7523,
+  7524,
+  7525,
+  7526,
+  7527,
+  7528,
+  7529,
+  7530,
+  7531,
+  7532,
+  7533,
+  7534,
+  7535,
+  7536,
+  7537,
+  7538,
+  7539,
+  7540,
+  7541,
+  7542,
+  7543,
+  7544,
+  7545,
+  7546,
+  7547,
+  7548,
+  7549,
+  7550,
+  7551,
+  7552,
+  7553,
+  7554,
+  7555,
+  7556,
+  7557,
+  7558,
+  7559,
+  7560,
+  7561,
+  7562,
+  7563,
+  7564,
+  7565,
+  7566,
+  7567,
+  7568,
+  7569,
+  7570,
+  7571,
+  7572,
+  7573,
+  7574,
+  7575,
+  7576,
+  7577,
+  7578,
+  7579,
+  7580,
+  7581,
+  7582,
+  7583,
+  7584,
+  7585,
+  7586,
+  7587,
+  7588,
+  7589,
+  7590,
+  7591,
+  7592,
+  7593,
+  7594,
+  7595,
+  7596,
+  7597,
+  7598,
+  7599,
+  7600,
+  7601,
+  7602,
+  7603,
+  7604,
+  7605,
+  7606,
+  7607,
+  7608,
+  7609,
+  7610,
+  7611,
+  7612,
+  7613,
+  7614,
+  7615,
+  7616,
+  7617,
+  7618,
+  7619,
+  7620,
+  7621,
+  7622,
+  7623,
+  7624,
+  7625,
+  7626,
+  7627,
+  7628,
+  7629,
+  7630,
+  7631,
+  7632,
+  7633,
+  7634,
+  7635,
+  7636,
+  7637,
+  7638,
+  7639,
+  7640,
+  7641,
+  7642,
+  7643,
+  7644,
+  7645,
+  7646,
+  7647,
+  7648,
+  7649,
+  7650,
+  7651,
+  7652,
+  7653,
+  7654,
+  7655,
+  7656,
+  7657,
+  7658,
+  7659,
+  7660,
+  7661,
+  7662,
+  7663,
+  7664,
+  7665,
+  7666,
+  7667,
+  7668,
+  7669,
+  7670,
+  7671,
+  7672,
+  7673,
+  7674,
+  7675,
+  7676,
+  7677,
+  7678,
+  7679,
+  7680,
+  7681,
+  7682,
+  7683,
+  7684,
+  7685,
+  7686,
+  7687,
+  7688,
+  7689,
+  7690,
+  7691,
+  7692,
+  7693,
+  7694,
+  7695,
+  7696,
+  7697,
+  7698,
+  7699,
+  7700,
+  7701,
+  7702,
+  7703,
+  7704,
+  7705,
+  7706,
+  7707,
+  7708,
+  7709,
+  7710,
+  7711,
+  7712,
+  7713,
+  7714,
+  7715,
+  7716,
+  7717,
+  7718,
+  7719,
+  7720,
+  7721,
+  7722,
+  7723,
+  7724,
+  7725,
+  7726,
+  7727,
+  7728,
+  7729,
+  7730,
+  7731,
+  7732,
+  7733,
+  7734,
+  7735,
+  7736,
+  7737,
+  7738,
+  7739,
+  7740,
+  7741,
+  7742,
+  7743,
+  7744,
+  7745,
+  7746,
+  7747,
+  7748,
+  7749,
+  7750,
+  7751,
+  7752,
+  7753,
+  7754,
+  7755,
+  7756,
+  7757,
+  7758,
+  7759,
+  7760,
+  7761,
+  7762,
+  7763,
+  7764,
+  7765,
+  7766,
+  7767,
+  7768,
+  7769,
+  7770,
+  7771,
+  7772,
+  7773,
+  7774,
+  7775,
+  7776,
+  7777,
+  7778,
+  7779,
+  7780,
+  7781,
+  7782,
+  7783,
+  7784,
+  7785,
+  7786,
+  7787,
+  7788,
+  7789,
+  7790,
+  7791,
+  7792,
+  7793,
+  7794,
+  7795,
+  7796,
+  7797,
+  7798,
+  7799,
+  7800,
+  7801,
+  7802,
+  7803,
+  7804,
+  7805,
+  7806,
+  7807,
+  7808,
+  7809,
+  7810,
+  7811,
+  7812,
+  7813,
+  7814,
+  7815,
+  7816,
+  7817,
+  7818,
+  7819,
+  7820,
+  7821,
+  7822,
+  7823,
+  7824,
+  7825,
+  7826,
+  7827,
+  7828,
+  7829,
+  7830,
+  7831,
+  7832,
+  7833,
+  7834,
+  7835,
+  7836,
+  7837,
+  7838,
+  7839,
+  7840,
+  7841,
+  7842,
+  7843,
+  7844,
+  7845,
+  7846,
+  7847,
+  7848,
+  7849,
+  7850,
+  7851,
+  7852,
+  7853,
+  7854,
+  7855,
+  7856,
+  7857,
+  7858,
+  7859,
+  7860,
+  7861,
+  7862,
+  7863,
+  7864,
+  7865,
+  7866,
+  7867,
+  7868,
+  7869,
+  7870,
+  7871,
+  7872,
+  7873,
+  7874,
+  7875,
+  7876,
+  7877,
+  7878,
+  7879,
+  7880,
+  7881,
+  7882,
+  7883,
+  7884,
+  7885,
+  7886,
+  7887,
+  7888,
+  7889,
+  7890,
+  7891,
+  7892,
+  7893,
+  7894,
+  7895,
+  7896,
+  7897,
+  7898,
+  7899,
+  7900,
+  7901,
+  7902,
+  7903,
+  7904,
+  7905,
+  7906,
+  7907,
+  7908,
+  7909,
+  7910,
+  7911,
+  7912,
+  7913,
+  7914,
+  7915,
+  7916,
+  7917,
+  7918,
+  7919,
+  7920,
+  7921,
+  7922,
+  7923,
+  7924,
+  7925,
+  7926,
+  7927,
+  7928,
+  7929,
+  7930,
+  7931,
+  7932,
+  7933,
+  7934,
+  7935,
+  7936,
+  7937,
+  7938,
+  7939,
+  7940,
+  7941,
+  7942,
+  7943,
+  7944,
+  7945,
+  7946,
+  7947,
+  7948,
+  7949,
+  7950,
+  7951,
+  7952,
+  7953,
+  7954,
+  7955,
+  7956,
+  7957,
+  7958,
+  7959,
+  7960,
+  7961,
+  7962,
+  7963,
+  7964,
+  7965,
+  7966,
+  7967,
+  7968,
+  7969,
+  7970,
+  7971,
+  7972,
+  7973,
+  7974,
+  7975,
+  7976,
+  7977,
+  7978,
+  7979,
+  7980,
+  7981,
+  7982,
+  7983,
+  7984,
+  7985,
+  7986,
+  7987,
+  7988,
+  7989,
+  7990,
+  7991,
+  7992,
+  7993,
+  7994,
+  7995,
+  7996,
+  7997,
+  7998,
+  7999,
+  8000,
+  8001,
+  8002,
+  8003,
+  8004,
+  8005,
+  8006,
+  8007,
+  8008,
+  8009,
+  8010,
+  8011,
+  8012,
+  8013,
+  8014,
+  8015,
+  8016,
+  8017,
+  8018,
+  8019,
+  8020,
+  8021,
+  8022,
+  8023,
+  8024,
+  8025,
+  8026,
+  8027,
+  8028,
+  8029,
+  8030,
+  8031,
+  8032,
+  8033,
+  8034,
+  8035,
+  8036,
+  8037,
+  8038,
+  8039,
+  8040,
+  8041,
+  8042,
+  8043,
+  8044,
+  8045,
+  8046,
+  8047,
+  8048,
+  8049,
+  8050,
+  8051,
+  8052,
+  8053,
+  8054,
+  8055,
+  8056,
+  8057,
+  8058,
+  8059,
+  8060,
+  8061,
+  8062,
+  8063,
+  8064,
+  8065,
+  8066,
+  8067,
+  8068,
+  8069,
+  8070,
+  8071,
+  8072,
+  8073,
+  8074,
+  8075,
+  8076,
+  8077,
+  8078,
+  8079,
+  8080,
+  8081,
+  8082,
+  8083,
+  8084,
+  8085,
+  8086,
+  8087,
+  8088,
+  8089,
+  8090,
+  8091,
+  8092,
+  8093,
+  8094,
+  8095,
+  8096,
+  8097,
+  8098,
+  8099,
+  8100,
+  8101,
+  8102,
+  8103,
+  8104,
+  8105,
+  8106,
+  8107,
+  8108,
+  8109,
+  8110,
+  8111,
+  8112,
+  8113,
+  8114,
+  8115,
+  8116,
+  8117,
+  8118,
+  8119,
+  8120,
+  8121,
+  8122,
+  8123,
+  8124,
+  8125,
+  8126,
+  8127,
+  8128,
+  8129,
+  8130,
+  8131,
+  8132,
+  8133,
+  8134,
+  8135,
+  8136,
+  8137,
+  8138,
+  8139,
+  8140,
+  8141,
+  8142,
+  8143,
+  8144,
+  8145,
+  8146,
+  8147,
+  8148,
+  8149,
+  8150,
+  8151,
+  8152,
+  8153,
+  8154,
+  8155,
+  8156,
+  8157,
+  8158,
+  8159,
+  8160,
+  8161,
+  8162,
+  8163,
+  8164,
+  8165,
+  8166,
+  8167,
+  8168,
+  8169,
+  8170,
+  8171,
+  8172,
+  8173,
+  8174,
+  8175,
+  8176,
+  8177,
+  8178,
+  8179,
+  8180,
+  8181,
+  8182,
+  8183,
+  8184,
+  8185,
+  8186,
+  8187,
+  8188,
+  8189,
+  8190,
+  8191,
+  8192,
+  8193,
+  8194,
+  8195,
+  8196,
+  8197,
+  8198,
+  8199,
+  8200,
+  8201,
+  8202,
+  8203,
+  8204,
+  8205,
+  8206,
+  8207,
+  8208,
+  8209,
+  8210,
+  8211,
+  8212,
+  8213,
+  8214,
+  8215,
+  8216,
+  8217,
+  8218,
+  8219,
+  8220,
+  8221,
+  8222,
+  8223,
+  8224,
+  8225,
+  8226,
+  8227,
+  8228,
+  8229,
+  8230,
+  8231,
+  8232,
+  8233,
+  8234,
+  8235,
+  8236,
+  8237,
+  8238,
+  8239,
+  8240,
+  8241,
+  8242,
+  8243,
+  8244,
+  8245,
+  8246,
+  8247,
+  8248,
+  8249,
+  8250,
+  8251,
+  8252,
+  8253,
+  8254,
+  8255,
+  8256,
+  8257,
+  8258,
+  8259,
+  8260,
+  8261,
+  8262,
+  8263,
+  8264,
+  8265,
+  8266,
+  8267,
+  8268,
+  8269,
+  8270,
+  8271,
+  8272,
+  8273,
+  8274,
+  8275,
+  8276,
+  8277,
+  8278,
+  8279,
+  8280,
+  8281,
+  8282,
+  8283,
+  8284,
+  8285,
+  8286,
+  8287,
+  8288,
+  8289,
+  8290,
+  8291,
+  8292,
+  8293,
+  8294,
+  8295,
+  8296,
+  8297,
+  8298,
+  8299,
+  8300,
+  8301,
+  8302,
+  8303,
+  8304,
+  8305,
+  8306,
+  8307,
+  8308,
+  8309,
+  8310,
+  8311,
+  8312,
+  8313,
+  8314,
+  8315,
+  8316,
+  8317,
+  8318,
+  8319,
+  8320,
+  8321,
+  8322,
+  8323,
+  8324,
+  8325,
+  8326,
+  8327,
+  8328,
+  8329,
+  8330,
+  8331,
+  8332,
+  8333,
+  8334,
+  8335,
+  8336,
+  8337,
+  8338,
+  8339,
+  8340,
+  8341,
+  8342,
+  8343,
+  8344,
+  8345,
+  8346,
+  8347,
+  8348,
+  8349,
+  8350,
+  8351,
+  8352,
+  8353,
+  8354,
+  8355,
+  8356,
+  8357,
+  8358,
+  8359,
+  8360,
+  8361,
+  8362,
+  8363,
+  8364,
+  8365,
+  8366,
+  8367,
+  8368,
+  8369,
+  8370,
+  8371,
+  8372,
+  8373,
+  8374,
+  8375,
+  8376,
+  8377,
+  8378,
+  8379,
+  8380,
+  8381,
+  8382,
+  8383,
+  8384,
+  8385,
+  8386,
+  8387,
+  8388,
+  8389,
+  8390,
+  8391,
+  8392,
+  8393,
+  8394,
+  8395,
+  8396,
+  8397,
+  8398,
+  8399,
+  8400,
+  8401,
+  8402,
+  8403,
+  8404,
+  8405,
+  8406,
+  8407,
+  8408,
+  8409,
+  8410,
+  8411,
+  8412,
+  8413,
+  8414,
+  8415,
+  8416,
+  8417,
+  8418,
+  8419,
+  8420,
+  8421,
+  8422,
+  8423,
+  8424,
+  8425,
+  8426,
+  8427,
+  8428,
+  8429,
+  8430,
+  8431,
+  8432,
+  8433,
+  8434,
+  8435,
+  8436,
+  8437,
+  8438,
+  8439,
+  8440,
+  8441,
+  8442,
+  8443,
+  8444,
+  8445,
+  8446,
+  8447,
+  8448,
+  8449,
+  8450,
+  8451,
+  8452,
+  8453,
+  8454,
+  8455,
+  8456,
+  8457,
+  8458,
+  8459,
+  8460,
+  8461,
+  8462,
+  8463,
+  8464,
+  8465,
+  8466,
+  8467,
+  8468,
+  8469,
+  8470,
+  8471,
+  8472,
+  8473,
+  8474,
+  8475,
+  8476,
+  8477,
+  8478,
+  8479,
+  8480,
+  8481,
+  8482,
+  8483,
+  8484,
+  8485,
+  8486,
+  8487,
+  8488,
+  8489,
+  8490,
+  8491,
+  8492,
+  8493,
+  8494,
+  8495,
+  8496,
+  8497,
+  8498,
+  8499,
+  8500,
+  8501,
+  8502,
+  8503,
+  8504,
+  8505,
+  8506,
+  8507,
+  8508,
+  8509,
+  8510,
+  8511,
+  8512,
+  8513,
+  8514,
+  8515,
+  8516,
+  8517,
+  8518,
+  8519,
+  8520,
+  8521,
+  8522,
+  8523,
+  8524,
+  8525,
+  8526,
+  8527,
+  8528,
+  8529,
+  8530,
+  8531,
+  8532,
+  8533,
+  8534,
+  8535,
+  8536,
+  8537,
+  8538,
+  8539,
+  8540,
+  8541,
+  8542,
+  8543,
+  8544,
+  8545,
+  8546,
+  8547,
+  8548,
+  8549,
+  8550,
+  8551,
+  8552,
+  8553,
+  8554,
+  8555,
+  8556,
+  8557,
+  8558,
+  8559,
+  8560,
+  8561,
+  8562,
+  8563,
+  8564,
+  8565,
+  8566,
+  8567,
+  8568,
+  8569,
+  8570,
+  8571,
+  8572,
+  8573,
+  8574,
+  8575,
+  8576,
+  8577,
+  8578,
+  8579,
+  8580,
+  8581,
+  8582,
+  8583,
+  8584,
+  8585,
+  8586,
+  8587,
+  8588,
+  8589,
+  8590,
+  8591,
+  8592,
+  8593,
+  8594,
+  8595,
+  8596,
+  8597,
+  8598,
+  8599,
+  8600,
+  8601,
+  8602,
+  8603,
+  8604,
+  8605,
+  8606,
+  8607,
+  8608,
+  8609,
+  8610,
+  8611,
+  8612,
+  8613,
+  8614,
+  8615,
+  8616,
+  8617,
+  8618,
+  8619,
+  8620,
+  8621,
+  8622,
+  8623,
+  8624,
+  8625,
+  8626,
+  8627,
+  8628,
+  8629,
+  8630,
+  8631,
+  8632,
+  8633,
+  8634,
+  8635,
+  8636,
+  8637,
+  8638,
+  8639,
+  8640,
+  8641,
+  8642,
+  8643,
+  8644,
+  8645,
+  8646,
+  8647,
+  8648,
+  8649,
+  8650,
+  8651,
+  8652,
+  8653,
+  8654,
+  8655,
+  8656,
+  8657,
+  8658,
+  8659,
+  8660,
+  8661,
+  8662,
+  8663,
+  8664,
+  8665,
+  8666,
+  8667,
+  8668,
+  8669,
+  8670,
+  8671,
+  8672,
+  8673,
+  8674,
+  8675,
+  8676,
+  8677,
+  8678,
+  8679,
+  8680,
+  8681,
+  8682,
+  8683,
+  8684,
+  8685,
+  8686,
+  8687,
+  8688,
+  8689,
+  8690,
+  8691,
+  8692,
+  8693,
+  8694,
+  8695,
+  8696,
+  8697,
+  8698,
+  8699,
+  8700,
+  8701,
+  8702,
+  8703,
+  8704,
+  8705,
+  8706,
+  8707,
+  8708,
+  8709,
+  8710,
+  8711,
+  8712,
+  8713,
+  8714,
+  8715,
+  8716,
+  8717,
+  8718,
+  8719,
+  8720,
+  8721,
+  8722,
+  8723,
+  8724,
+  8725,
+  8726,
+  8727,
+  8728,
+  8729,
+  8730,
+  8731,
+  8732,
+  8733,
+  8734,
+  8735,
+  8736,
+  8737,
+  8738,
+  8739,
+  8740,
+  8741,
+  8742,
+  8743,
+  8744,
+  8745,
+  8746,
+  8747,
+  8748,
+  8749,
+  8750,
+  8751,
+  8752,
+  8753,
+  8754,
+  8755,
+  8756,
+  8757,
+  8758,
+  8759,
+  8760,
+  8761,
+  8762,
+  8763,
+  8764,
+  8765,
+  8766,
+  8767,
+  8768,
+  8769,
+  8770,
+  8771,
+  8772,
+  8773,
+  8774,
+  8775,
+  8776,
+  8777,
+  8778,
+  8779,
+  8780,
+  8781,
+  8782,
+  8783,
+  8784,
+  8785,
+  8786,
+  8787,
+  8788,
+  8789,
+  8790,
+  8791,
+  8792,
+  8793,
+  8794,
+  8795,
+  8796,
+  8797,
+  8798,
+  8799,
+  8800,
+  8801,
+  8802,
+  8803,
+  8804,
+  8805,
+  8806,
+  8807,
+  8808,
+  8809,
+  8810,
+  8811,
+  8812,
+  8813,
+  8814,
+  8815,
+  8816,
+  8817,
+  8818,
+  8819,
+  8820,
+  8821,
+  8822,
+  8823,
+  8824,
+  8825,
+  8826,
+  8827,
+  8828,
+  8829,
+  8830,
+  8831,
+  8832,
+  8833,
+  8834,
+  8835,
+  8836,
+  8837,
+  8838,
+  8839,
+  8840,
+  8841,
+  8842,
+  8843,
+  8844,
+  8845,
+  8846,
+  8847,
+  8848,
+  8849,
+  8850,
+  8851,
+  8852,
+  8853,
+  8854,
+  8855,
+  8856,
+  8857,
+  8858,
+  8859,
+  8860,
+  8861,
+  8862,
+  8863,
+  8864,
+  8865,
+  8866,
+  8867,
+  8868,
+  8869,
+  8870,
+  8871,
+  8872,
+  8873,
+  8874,
+  8875,
+  8876,
+  8877,
+  8878,
+  8879,
+  8880,
+  8881,
+  8882,
+  8883,
+  8884,
+  8885,
+  8886,
+  8887,
+  8888,
+  8889,
+  8890,
+  8891,
+  8892,
+  8893,
+  8894,
+  8895,
+  8896,
+  8897,
+  8898,
+  8899,
+  8900,
+  8901,
+  8902,
+  8903,
+  8904,
+  8905,
+  8906,
+  8907,
+  8908,
+  8909,
+  8910,
+  8911,
+  8912,
+  8913,
+  8914,
+  8915,
+  8916,
+  8917,
+  8918,
+  8919,
+  8920,
+  8921,
+  8922,
+  8923,
+  8924,
+  8925,
+  8926,
+  8927,
+  8928,
+  8929,
+  8930,
+  8931,
+  8932,
+  8933,
+  8934,
+  8935,
+  8936,
+  8937,
+  8938,
+  8939,
+  8940,
+  8941,
+  8942,
+  8943,
+  8944,
+  8945,
+  8946,
+  8947,
+  8948,
+  8949,
+  8950,
+  8951,
+  8952,
+  8953,
+  8954,
+  8955,
+  8956,
+  8957,
+  8958,
+  8959,
+  8960,
+  8961,
+  8962,
+  8963,
+  8964,
+  8965,
+  8966,
+  8967,
+  8968,
+  8969,
+  8970,
+  8971,
+  8972,
+  8973,
+  8974,
+  8975,
+  8976,
+  8977,
+  8978,
+  8979,
+  8980,
+  8981,
+  8982,
+  8983,
+  8984,
+  8985,
+  8986,
+  8987,
+  8988,
+  8989,
+  8990,
+  8991,
+  8992,
+  8993,
+  8994,
+  8995,
+  8996,
+  8997,
+  8998,
+  8999,
+  9000,
+  9001,
+  9002,
+  9003,
+  9004,
+  9005,
+  9006,
+  9007,
+  9008,
+  9009,
+  9010,
+  9011,
+  9012,
+  9013,
+  9014,
+  9015,
+  9016,
+  9017,
+  9018,
+  9019,
+  9020,
+  9021,
+  9022,
+  9023,
+  9024,
+  9025,
+  9026,
+  9027,
+  9028,
+  9029,
+  9030,
+  9031,
+  9032,
+  9033,
+  9034,
+  9035,
+  9036,
+  9037,
+  9038,
+  9039,
+  9040,
+  9041,
+  9042,
+  9043,
+  9044,
+  9045,
+  9046,
+  9047,
+  9048,
+  9049,
+  9050,
+  9051,
+  9052,
+  9053,
+  9054,
+  9055,
+  9056,
+  9057,
+  9058,
+  9059,
+  9060,
+  9061,
+  9062,
+  9063,
+  9064,
+  9065,
+  9066,
+  9067,
+  9068,
+  9069,
+  9070,
+  9071,
+  9072,
+  9073,
+  9074,
+  9075,
+  9076,
+  9077,
+  9078,
+  9079,
+  9080,
+  9081,
+  9082,
+  9083,
+  9084,
+  9085,
+  9086,
+  9087,
+  9088,
+  9089,
+  9090,
+  9091,
+  9092,
+  9093,
+  9094,
+  9095,
+  9096,
+  9097,
+  9098,
+  9099,
+  9100,
+  9101,
+  9102,
+  9103,
+  9104,
+  9105,
+  9106,
+  9107,
+  9108,
+  9109,
+  9110,
+  9111,
+  9112,
+  9113,
+  9114,
+  9115,
+  9116,
+  9117,
+  9118,
+  9119,
+  9120,
+  9121,
+  9122,
+  9123,
+  9124,
+  9125,
+  9126,
+  9127,
+  9128,
+  9129,
+  9130,
+  9131,
+  9132,
+  9133,
+  9134,
+  9135,
+  9136,
+  9137,
+  9138,
+  9139,
+  9140,
+  9141,
+  9142,
+  9143,
+  9144,
+  9145,
+  9146,
+  9147,
+  9148,
+  9149,
+  9150,
+  9151,
+  9152,
+  9153,
+  9154,
+  9155,
+  9156,
+  9157,
+  9158,
+  9159,
+  9160,
+  9161,
+  9162,
+  9163,
+  9164,
+  9165,
+  9166,
+  9167,
+  9168,
+  9169,
+  9170,
+  9171,
+  9172,
+  9173,
+  9174,
+  9175,
+  9176,
+  9177,
+  9178,
+  9179,
+  9180,
+  9181,
+  9182,
+  9183,
+  9184,
+  9185,
+  9186,
+  9187,
+  9188,
+  9189,
+  9190,
+  9191,
+  9192,
+  9193,
+  9194,
+  9195,
+  9196,
+  9197,
+  9198,
+  9199,
+  9200,
+  9201,
+  9202,
+  9203,
+  9204,
+  9205,
+  9206,
+  9207,
+  9208,
+  9209,
+  9210,
+  9211,
+  9212,
+  9213,
+  9214,
+  9215,
+  9216,
+  9217,
+  9218,
+  9219,
+  9220,
+  9221,
+  9222,
+  9223,
+  9224,
+  9225,
+  9226,
+  9227,
+  9228,
+  9229,
+  9230,
+  9231,
+  9232,
+  9233,
+  9234,
+  9235,
+  9236,
+  9237,
+  9238,
+  9239,
+  9240,
+  9241,
+  9242,
+  9243,
+  9244,
+  9245,
+  9246,
+  9247,
+  9248,
+  9249,
+  9250,
+  9251,
+  9252,
+  9253,
+  9254,
+  9255,
+  9256,
+  9257,
+  9258,
+  9259,
+  9260,
+  9261,
+  9262,
+  9263,
+  9264,
+  9265,
+  9266,
+  9267,
+  9268,
+  9269,
+  9270,
+  9271,
+  9272,
+  9273,
+  9274,
+  9275,
+  9276,
+  9277,
+  9278,
+  9279,
+  9280,
+  9281,
+  9282,
+  9283,
+  9284,
+  9285,
+  9286,
+  9287,
+  9288,
+  9289,
+  9290,
+  9291,
+  9292,
+  9293,
+  9294,
+  9295,
+  9296,
+  9297,
+  9298,
+  9299,
+  9300,
+  9301,
+  9302,
+  9303,
+  9304,
+  9305,
+  9306,
+  9307,
+  9308,
+  9309,
+  9310,
+  9311,
+  9312,
+  9313,
+  9314,
+  9315,
+  9316,
+  9317,
+  9318,
+  9319,
+  9320,
+  9321,
+  9322,
+  9323,
+  9324,
+  9325,
+  9326,
+  9327,
+  9328,
+  9329,
+  9330,
+  9331,
+  9332,
+  9333,
+  9334,
+  9335,
+  9336,
+  9337,
+  9338,
+  9339,
+  9340,
+  9341,
+  9342,
+  9343,
+  9344,
+  9345,
+  9346,
+  9347,
+  9348,
+  9349,
+  9350,
+  9351,
+  9352,
+  9353,
+  9354,
+  9355,
+  9356,
+  9357,
+  9358,
+  9359,
+  9360,
+  9361,
+  9362,
+  9363,
+  9364,
+  9365,
+  9366,
+  9367,
+  9368,
+  9369,
+  9370,
+  9371,
+  9372,
+  9373,
+  9374,
+  9375,
+  9376,
+  9377,
+  9378,
+  9379,
+  9380,
+  9381,
+  9382,
+  9383,
+  9384,
+  9385,
+  9386,
+  9387,
+  9388,
+  9389,
+  9390,
+  9391,
+  9392,
+  9393,
+  9394,
+  9395,
+  9396,
+  9397,
+  9398,
+  9399,
+  9400,
+  9401,
+  9402,
+  9403,
+  9404,
+  9405,
+  9406,
+  9407,
+  9408,
+  9409,
+  9410,
+  9411,
+  9412,
+  9413,
+  9414,
+  9415,
+  9416,
+  9417,
+  9418,
+  9419,
+  9420,
+  9421,
+  9422,
+  9423,
+  9424,
+  9425,
+  9426,
+  9427,
+  9428,
+  9429,
+  9430,
+  9431,
+  9432,
+  9433,
+  9434,
+  9435,
+  9436,
+  9437,
+  9438,
+  9439,
+  9440,
+  9441,
+  9442,
+  9443,
+  9444,
+  9445,
+  9446,
+  9447,
+  9448,
+  9449,
+  9450,
+  9451,
+  9452,
+  9453,
+  9454,
+  9455,
+  9456,
+  9457,
+  9458,
+  9459,
+  9460,
+  9461,
+  9462,
+  9463,
+  9464,
+  9465,
+  9466,
+  9467,
+  9468,
+  9469,
+  9470,
+  9471,
+  9472,
+  9473,
+  9474,
+  9475,
+  9476,
+  9477,
+  9478,
+  9479,
+  9480,
+  9481,
+  9482,
+  9483,
+  9484,
+  9485,
+  9486,
+  9487,
+  9488,
+  9489,
+  9490,
+  9491,
+  9492,
+  9493,
+  9494,
+  9495,
+  9496,
+  9497,
+  9498,
+  9499,
+  9500,
+  9501,
+  9502,
+  9503,
+  9504,
+  9505,
+  9506,
+  9507,
+  9508,
+  9509,
+  9510,
+  9511,
+  9512,
+  9513,
+  9514,
+  9515,
+  9516,
+  9517,
+  9518,
+  9519,
+  9520,
+  9521,
+  9522,
+  9523,
+  9524,
+  9525,
+  9526,
+  9527,
+  9528,
+  9529,
+  9530,
+  9531,
+  9532,
+  9533,
+  9534,
+  9535,
+  9536,
+  9537,
+  9538,
+  9539,
+  9540,
+  9541,
+  9542,
+  9543,
+  9544,
+  9545,
+  9546,
+  9547,
+  9548,
+  9549,
+  9550,
+  9551,
+  9552,
+  9553,
+  9554,
+  9555,
+  9556,
+  9557,
+  9558,
+  9559,
+  9560,
+  9561,
+  9562,
+  9563,
+  9564,
+  9565,
+  9566,
+  9567,
+  9568,
+  9569,
+  9570,
+  9571,
+  9572,
+  9573,
+  9574,
+  9575,
+  9576,
+  9577,
+  9578,
+  9579,
+  9580,
+  9581,
+  9582,
+  9583,
+  9584,
+  9585,
+  9586,
+  9587,
+  9588,
+  9589,
+  9590,
+  9591,
+  9592,
+  9593,
+  9594,
+  9595,
+  9596,
+  9597,
+  9598,
+  9599,
+  9600,
+  9601,
+  9602,
+  9603,
+  9604,
+  9605,
+  9606,
+  9607,
+  9608,
+  9609,
+  9610,
+  9611,
+  9612,
+  9613,
+  9614,
+  9615,
+  9616,
+  9617,
+  9618,
+  9619,
+  9620,
+  9621,
+  9622,
+  9623,
+  9624,
+  9625,
+  9626,
+  9627,
+  9628,
+  9629,
+  9630,
+  9631,
+  9632,
+  9633,
+  9634,
+  9635,
+  9636,
+  9637,
+  9638,
+  9639,
+  9640,
+  9641,
+  9642,
+  9643,
+  9644,
+  9645,
+  9646,
+  9647,
+  9648,
+  9649,
+  9650,
+  9651,
+  9652,
+  9653,
+  9654,
+  9655,
+  9656,
+  9657,
+  9658,
+  9659,
+  9660,
+  9661,
+  9662,
+  9663,
+  9664,
+  9665,
+  9666,
+  9667,
+  9668,
+  9669,
+  9670,
+  9671,
+  9672,
+  9673,
+  9674,
+  9675,
+  9676,
+  9677,
+  9678,
+  9679,
+  9680,
+  9681,
+  9682,
+  9683,
+  9684,
+  9685,
+  9686,
+  9687,
+  9688,
+  9689,
+  9690,
+  9691,
+  9692,
+  9693,
+  9694,
+  9695,
+  9696,
+  9697,
+  9698,
+  9699,
+  9700,
+  9701,
+  9702,
+  9703,
+  9704,
+  9705,
+  9706,
+  9707,
+  9708,
+  9709,
+  9710,
+  9711,
+  9712,
+  9713,
+  9714,
+  9715,
+  9716,
+  9717,
+  9718,
+  9719,
+  9720,
+  9721,
+  9722,
+  9723,
+  9724,
+  9725,
+  9726,
+  9727,
+  9728,
+  9729,
+  9730,
+  9731,
+  9732,
+  9733,
+  9734,
+  9735,
+  9736,
+  9737,
+  9738,
+  9739,
+  9740,
+  9741,
+  9742,
+  9743,
+  9744,
+  9745,
+  9746,
+  9747,
+  9748,
+  9749,
+  9750,
+  9751,
+  9752,
+  9753,
+  9754,
+  9755,
+  9756,
+  9757,
+  9758,
+  9759,
+  9760,
+  9761,
+  9762,
+  9763,
+  9764,
+  9765,
+  9766,
+  9767,
+  9768,
+  9769,
+  9770,
+  9771,
+  9772,
+  9773,
+  9774,
+  9775,
+  9776,
+  9777,
+  9778,
+  9779,
+  9780,
+  9781,
+  9782,
+  9783,
+  9784,
+  9785,
+  9786,
+  9787,
+  9788,
+  9789,
+  9790,
+  9791,
+  9792,
+  9793,
+  9794,
+  9795,
+  9796,
+  9797,
+  9798,
+  9799,
+  9800,
+  9801,
+  9802,
+  9803,
+  9804,
+  9805,
+  9806,
+  9807,
+  9808,
+  9809,
+  9810,
+  9811,
+  9812,
+  9813,
+  9814,
+  9815,
+  9816,
+  9817,
+  9818,
+  9819,
+  9820,
+  9821,
+  9822,
+  9823,
+  9824,
+  9825,
+  9826,
+  9827,
+  9828,
+  9829,
+  9830,
+  9831,
+  9832,
+  9833,
+  9834,
+  9835,
+  9836,
+  9837,
+  9838,
+  9839,
+  9840,
+  9841,
+  9842,
+  9843,
+  9844,
+  9845,
+  9846,
+  9847,
+  9848,
+  9849,
+  9850,
+  9851,
+  9852,
+  9853,
+  9854,
+  9855,
+  9856,
+  9857,
+  9858,
+  9859,
+  9860,
+  9861,
+  9862,
+  9863,
+  9864,
+  9865,
+  9866,
+  9867,
+  9868,
+  9869,
+  9870,
+  9871,
+  9872,
+  9873,
+  9874,
+  9875,
+  9876,
+  9877,
+  9878,
+  9879,
+  9880,
+  9881,
+  9882,
+  9883,
+  9884,
+  9885,
+  9886,
+  9887,
+  9888,
+  9889,
+  9890,
+  9891,
+  9892,
+  9893,
+  9894,
+  9895,
+  9896,
+  9897,
+  9898,
+  9899,
+  9900,
+  9901,
+  9902,
+  9903,
+  9904,
+  9905,
+  9906,
+  9907,
+  9908,
+  9909,
+  9910,
+  9911,
+  9912,
+  9913,
+  9914,
+  9915,
+  9916,
+  9917,
+  9918,
+  9919,
+  9920,
+  9921,
+  9922,
+  9923,
+  9924,
+  9925,
+  9926,
+  9927,
+  9928,
+  9929,
+  9930,
+  9931,
+  9932,
+  9933,
+  9934,
+  9935,
+  9936,
+  9937,
+  9938,
+  9939,
+  9940,
+  9941,
+  9942,
+  9943,
+  9944,
+  9945,
+  9946,
+  9947,
+  9948,
+  9949,
+  9950,
+  9951,
+  9952,
+  9953,
+  9954,
+  9955,
+  9956,
+  9957,
+  9958,
+  9959,
+  9960,
+  9961,
+  9962,
+  9963,
+  9964,
+  9965,
+  9966,
+  9967,
+  9968,
+  9969,
+  9970,
+  9971,
+  9972,
+  9973,
+  9974,
+  9975,
+  9976,
+  9977,
+  9978,
+  9979,
+  9980,
+  9981,
+  9982,
+  9983,
+  9984,
+  9985,
+  9986,
+  9987,
+  9988,
+  9989,
+  9990,
+  9991,
+  9992,
+  9993,
+  9994,
+  9995,
+  9996,
+  9997,
+  9998,
+  9999,
+};
+const Set<String> stringSet = {
+  'foo_0',
+  'foo_1',
+  'foo_2',
+  'foo_3',
+  'foo_4',
+  'foo_5',
+  'foo_6',
+  'foo_7',
+  'foo_8',
+  'foo_9',
+  'foo_10',
+  'foo_11',
+  'foo_12',
+  'foo_13',
+  'foo_14',
+  'foo_15',
+  'foo_16',
+  'foo_17',
+  'foo_18',
+  'foo_19',
+  'foo_20',
+  'foo_21',
+  'foo_22',
+  'foo_23',
+  'foo_24',
+  'foo_25',
+  'foo_26',
+  'foo_27',
+  'foo_28',
+  'foo_29',
+  'foo_30',
+  'foo_31',
+  'foo_32',
+  'foo_33',
+  'foo_34',
+  'foo_35',
+  'foo_36',
+  'foo_37',
+  'foo_38',
+  'foo_39',
+  'foo_40',
+  'foo_41',
+  'foo_42',
+  'foo_43',
+  'foo_44',
+  'foo_45',
+  'foo_46',
+  'foo_47',
+  'foo_48',
+  'foo_49',
+  'foo_50',
+  'foo_51',
+  'foo_52',
+  'foo_53',
+  'foo_54',
+  'foo_55',
+  'foo_56',
+  'foo_57',
+  'foo_58',
+  'foo_59',
+  'foo_60',
+  'foo_61',
+  'foo_62',
+  'foo_63',
+  'foo_64',
+  'foo_65',
+  'foo_66',
+  'foo_67',
+  'foo_68',
+  'foo_69',
+  'foo_70',
+  'foo_71',
+  'foo_72',
+  'foo_73',
+  'foo_74',
+  'foo_75',
+  'foo_76',
+  'foo_77',
+  'foo_78',
+  'foo_79',
+  'foo_80',
+  'foo_81',
+  'foo_82',
+  'foo_83',
+  'foo_84',
+  'foo_85',
+  'foo_86',
+  'foo_87',
+  'foo_88',
+  'foo_89',
+  'foo_90',
+  'foo_91',
+  'foo_92',
+  'foo_93',
+  'foo_94',
+  'foo_95',
+  'foo_96',
+  'foo_97',
+  'foo_98',
+  'foo_99',
+  'foo_100',
+  'foo_101',
+  'foo_102',
+  'foo_103',
+  'foo_104',
+  'foo_105',
+  'foo_106',
+  'foo_107',
+  'foo_108',
+  'foo_109',
+  'foo_110',
+  'foo_111',
+  'foo_112',
+  'foo_113',
+  'foo_114',
+  'foo_115',
+  'foo_116',
+  'foo_117',
+  'foo_118',
+  'foo_119',
+  'foo_120',
+  'foo_121',
+  'foo_122',
+  'foo_123',
+  'foo_124',
+  'foo_125',
+  'foo_126',
+  'foo_127',
+  'foo_128',
+  'foo_129',
+  'foo_130',
+  'foo_131',
+  'foo_132',
+  'foo_133',
+  'foo_134',
+  'foo_135',
+  'foo_136',
+  'foo_137',
+  'foo_138',
+  'foo_139',
+  'foo_140',
+  'foo_141',
+  'foo_142',
+  'foo_143',
+  'foo_144',
+  'foo_145',
+  'foo_146',
+  'foo_147',
+  'foo_148',
+  'foo_149',
+  'foo_150',
+  'foo_151',
+  'foo_152',
+  'foo_153',
+  'foo_154',
+  'foo_155',
+  'foo_156',
+  'foo_157',
+  'foo_158',
+  'foo_159',
+  'foo_160',
+  'foo_161',
+  'foo_162',
+  'foo_163',
+  'foo_164',
+  'foo_165',
+  'foo_166',
+  'foo_167',
+  'foo_168',
+  'foo_169',
+  'foo_170',
+  'foo_171',
+  'foo_172',
+  'foo_173',
+  'foo_174',
+  'foo_175',
+  'foo_176',
+  'foo_177',
+  'foo_178',
+  'foo_179',
+  'foo_180',
+  'foo_181',
+  'foo_182',
+  'foo_183',
+  'foo_184',
+  'foo_185',
+  'foo_186',
+  'foo_187',
+  'foo_188',
+  'foo_189',
+  'foo_190',
+  'foo_191',
+  'foo_192',
+  'foo_193',
+  'foo_194',
+  'foo_195',
+  'foo_196',
+  'foo_197',
+  'foo_198',
+  'foo_199',
+  'foo_200',
+  'foo_201',
+  'foo_202',
+  'foo_203',
+  'foo_204',
+  'foo_205',
+  'foo_206',
+  'foo_207',
+  'foo_208',
+  'foo_209',
+  'foo_210',
+  'foo_211',
+  'foo_212',
+  'foo_213',
+  'foo_214',
+  'foo_215',
+  'foo_216',
+  'foo_217',
+  'foo_218',
+  'foo_219',
+  'foo_220',
+  'foo_221',
+  'foo_222',
+  'foo_223',
+  'foo_224',
+  'foo_225',
+  'foo_226',
+  'foo_227',
+  'foo_228',
+  'foo_229',
+  'foo_230',
+  'foo_231',
+  'foo_232',
+  'foo_233',
+  'foo_234',
+  'foo_235',
+  'foo_236',
+  'foo_237',
+  'foo_238',
+  'foo_239',
+  'foo_240',
+  'foo_241',
+  'foo_242',
+  'foo_243',
+  'foo_244',
+  'foo_245',
+  'foo_246',
+  'foo_247',
+  'foo_248',
+  'foo_249',
+  'foo_250',
+  'foo_251',
+  'foo_252',
+  'foo_253',
+  'foo_254',
+  'foo_255',
+  'foo_256',
+  'foo_257',
+  'foo_258',
+  'foo_259',
+  'foo_260',
+  'foo_261',
+  'foo_262',
+  'foo_263',
+  'foo_264',
+  'foo_265',
+  'foo_266',
+  'foo_267',
+  'foo_268',
+  'foo_269',
+  'foo_270',
+  'foo_271',
+  'foo_272',
+  'foo_273',
+  'foo_274',
+  'foo_275',
+  'foo_276',
+  'foo_277',
+  'foo_278',
+  'foo_279',
+  'foo_280',
+  'foo_281',
+  'foo_282',
+  'foo_283',
+  'foo_284',
+  'foo_285',
+  'foo_286',
+  'foo_287',
+  'foo_288',
+  'foo_289',
+  'foo_290',
+  'foo_291',
+  'foo_292',
+  'foo_293',
+  'foo_294',
+  'foo_295',
+  'foo_296',
+  'foo_297',
+  'foo_298',
+  'foo_299',
+  'foo_300',
+  'foo_301',
+  'foo_302',
+  'foo_303',
+  'foo_304',
+  'foo_305',
+  'foo_306',
+  'foo_307',
+  'foo_308',
+  'foo_309',
+  'foo_310',
+  'foo_311',
+  'foo_312',
+  'foo_313',
+  'foo_314',
+  'foo_315',
+  'foo_316',
+  'foo_317',
+  'foo_318',
+  'foo_319',
+  'foo_320',
+  'foo_321',
+  'foo_322',
+  'foo_323',
+  'foo_324',
+  'foo_325',
+  'foo_326',
+  'foo_327',
+  'foo_328',
+  'foo_329',
+  'foo_330',
+  'foo_331',
+  'foo_332',
+  'foo_333',
+  'foo_334',
+  'foo_335',
+  'foo_336',
+  'foo_337',
+  'foo_338',
+  'foo_339',
+  'foo_340',
+  'foo_341',
+  'foo_342',
+  'foo_343',
+  'foo_344',
+  'foo_345',
+  'foo_346',
+  'foo_347',
+  'foo_348',
+  'foo_349',
+  'foo_350',
+  'foo_351',
+  'foo_352',
+  'foo_353',
+  'foo_354',
+  'foo_355',
+  'foo_356',
+  'foo_357',
+  'foo_358',
+  'foo_359',
+  'foo_360',
+  'foo_361',
+  'foo_362',
+  'foo_363',
+  'foo_364',
+  'foo_365',
+  'foo_366',
+  'foo_367',
+  'foo_368',
+  'foo_369',
+  'foo_370',
+  'foo_371',
+  'foo_372',
+  'foo_373',
+  'foo_374',
+  'foo_375',
+  'foo_376',
+  'foo_377',
+  'foo_378',
+  'foo_379',
+  'foo_380',
+  'foo_381',
+  'foo_382',
+  'foo_383',
+  'foo_384',
+  'foo_385',
+  'foo_386',
+  'foo_387',
+  'foo_388',
+  'foo_389',
+  'foo_390',
+  'foo_391',
+  'foo_392',
+  'foo_393',
+  'foo_394',
+  'foo_395',
+  'foo_396',
+  'foo_397',
+  'foo_398',
+  'foo_399',
+  'foo_400',
+  'foo_401',
+  'foo_402',
+  'foo_403',
+  'foo_404',
+  'foo_405',
+  'foo_406',
+  'foo_407',
+  'foo_408',
+  'foo_409',
+  'foo_410',
+  'foo_411',
+  'foo_412',
+  'foo_413',
+  'foo_414',
+  'foo_415',
+  'foo_416',
+  'foo_417',
+  'foo_418',
+  'foo_419',
+  'foo_420',
+  'foo_421',
+  'foo_422',
+  'foo_423',
+  'foo_424',
+  'foo_425',
+  'foo_426',
+  'foo_427',
+  'foo_428',
+  'foo_429',
+  'foo_430',
+  'foo_431',
+  'foo_432',
+  'foo_433',
+  'foo_434',
+  'foo_435',
+  'foo_436',
+  'foo_437',
+  'foo_438',
+  'foo_439',
+  'foo_440',
+  'foo_441',
+  'foo_442',
+  'foo_443',
+  'foo_444',
+  'foo_445',
+  'foo_446',
+  'foo_447',
+  'foo_448',
+  'foo_449',
+  'foo_450',
+  'foo_451',
+  'foo_452',
+  'foo_453',
+  'foo_454',
+  'foo_455',
+  'foo_456',
+  'foo_457',
+  'foo_458',
+  'foo_459',
+  'foo_460',
+  'foo_461',
+  'foo_462',
+  'foo_463',
+  'foo_464',
+  'foo_465',
+  'foo_466',
+  'foo_467',
+  'foo_468',
+  'foo_469',
+  'foo_470',
+  'foo_471',
+  'foo_472',
+  'foo_473',
+  'foo_474',
+  'foo_475',
+  'foo_476',
+  'foo_477',
+  'foo_478',
+  'foo_479',
+  'foo_480',
+  'foo_481',
+  'foo_482',
+  'foo_483',
+  'foo_484',
+  'foo_485',
+  'foo_486',
+  'foo_487',
+  'foo_488',
+  'foo_489',
+  'foo_490',
+  'foo_491',
+  'foo_492',
+  'foo_493',
+  'foo_494',
+  'foo_495',
+  'foo_496',
+  'foo_497',
+  'foo_498',
+  'foo_499',
+  'foo_500',
+  'foo_501',
+  'foo_502',
+  'foo_503',
+  'foo_504',
+  'foo_505',
+  'foo_506',
+  'foo_507',
+  'foo_508',
+  'foo_509',
+  'foo_510',
+  'foo_511',
+  'foo_512',
+  'foo_513',
+  'foo_514',
+  'foo_515',
+  'foo_516',
+  'foo_517',
+  'foo_518',
+  'foo_519',
+  'foo_520',
+  'foo_521',
+  'foo_522',
+  'foo_523',
+  'foo_524',
+  'foo_525',
+  'foo_526',
+  'foo_527',
+  'foo_528',
+  'foo_529',
+  'foo_530',
+  'foo_531',
+  'foo_532',
+  'foo_533',
+  'foo_534',
+  'foo_535',
+  'foo_536',
+  'foo_537',
+  'foo_538',
+  'foo_539',
+  'foo_540',
+  'foo_541',
+  'foo_542',
+  'foo_543',
+  'foo_544',
+  'foo_545',
+  'foo_546',
+  'foo_547',
+  'foo_548',
+  'foo_549',
+  'foo_550',
+  'foo_551',
+  'foo_552',
+  'foo_553',
+  'foo_554',
+  'foo_555',
+  'foo_556',
+  'foo_557',
+  'foo_558',
+  'foo_559',
+  'foo_560',
+  'foo_561',
+  'foo_562',
+  'foo_563',
+  'foo_564',
+  'foo_565',
+  'foo_566',
+  'foo_567',
+  'foo_568',
+  'foo_569',
+  'foo_570',
+  'foo_571',
+  'foo_572',
+  'foo_573',
+  'foo_574',
+  'foo_575',
+  'foo_576',
+  'foo_577',
+  'foo_578',
+  'foo_579',
+  'foo_580',
+  'foo_581',
+  'foo_582',
+  'foo_583',
+  'foo_584',
+  'foo_585',
+  'foo_586',
+  'foo_587',
+  'foo_588',
+  'foo_589',
+  'foo_590',
+  'foo_591',
+  'foo_592',
+  'foo_593',
+  'foo_594',
+  'foo_595',
+  'foo_596',
+  'foo_597',
+  'foo_598',
+  'foo_599',
+  'foo_600',
+  'foo_601',
+  'foo_602',
+  'foo_603',
+  'foo_604',
+  'foo_605',
+  'foo_606',
+  'foo_607',
+  'foo_608',
+  'foo_609',
+  'foo_610',
+  'foo_611',
+  'foo_612',
+  'foo_613',
+  'foo_614',
+  'foo_615',
+  'foo_616',
+  'foo_617',
+  'foo_618',
+  'foo_619',
+  'foo_620',
+  'foo_621',
+  'foo_622',
+  'foo_623',
+  'foo_624',
+  'foo_625',
+  'foo_626',
+  'foo_627',
+  'foo_628',
+  'foo_629',
+  'foo_630',
+  'foo_631',
+  'foo_632',
+  'foo_633',
+  'foo_634',
+  'foo_635',
+  'foo_636',
+  'foo_637',
+  'foo_638',
+  'foo_639',
+  'foo_640',
+  'foo_641',
+  'foo_642',
+  'foo_643',
+  'foo_644',
+  'foo_645',
+  'foo_646',
+  'foo_647',
+  'foo_648',
+  'foo_649',
+  'foo_650',
+  'foo_651',
+  'foo_652',
+  'foo_653',
+  'foo_654',
+  'foo_655',
+  'foo_656',
+  'foo_657',
+  'foo_658',
+  'foo_659',
+  'foo_660',
+  'foo_661',
+  'foo_662',
+  'foo_663',
+  'foo_664',
+  'foo_665',
+  'foo_666',
+  'foo_667',
+  'foo_668',
+  'foo_669',
+  'foo_670',
+  'foo_671',
+  'foo_672',
+  'foo_673',
+  'foo_674',
+  'foo_675',
+  'foo_676',
+  'foo_677',
+  'foo_678',
+  'foo_679',
+  'foo_680',
+  'foo_681',
+  'foo_682',
+  'foo_683',
+  'foo_684',
+  'foo_685',
+  'foo_686',
+  'foo_687',
+  'foo_688',
+  'foo_689',
+  'foo_690',
+  'foo_691',
+  'foo_692',
+  'foo_693',
+  'foo_694',
+  'foo_695',
+  'foo_696',
+  'foo_697',
+  'foo_698',
+  'foo_699',
+  'foo_700',
+  'foo_701',
+  'foo_702',
+  'foo_703',
+  'foo_704',
+  'foo_705',
+  'foo_706',
+  'foo_707',
+  'foo_708',
+  'foo_709',
+  'foo_710',
+  'foo_711',
+  'foo_712',
+  'foo_713',
+  'foo_714',
+  'foo_715',
+  'foo_716',
+  'foo_717',
+  'foo_718',
+  'foo_719',
+  'foo_720',
+  'foo_721',
+  'foo_722',
+  'foo_723',
+  'foo_724',
+  'foo_725',
+  'foo_726',
+  'foo_727',
+  'foo_728',
+  'foo_729',
+  'foo_730',
+  'foo_731',
+  'foo_732',
+  'foo_733',
+  'foo_734',
+  'foo_735',
+  'foo_736',
+  'foo_737',
+  'foo_738',
+  'foo_739',
+  'foo_740',
+  'foo_741',
+  'foo_742',
+  'foo_743',
+  'foo_744',
+  'foo_745',
+  'foo_746',
+  'foo_747',
+  'foo_748',
+  'foo_749',
+  'foo_750',
+  'foo_751',
+  'foo_752',
+  'foo_753',
+  'foo_754',
+  'foo_755',
+  'foo_756',
+  'foo_757',
+  'foo_758',
+  'foo_759',
+  'foo_760',
+  'foo_761',
+  'foo_762',
+  'foo_763',
+  'foo_764',
+  'foo_765',
+  'foo_766',
+  'foo_767',
+  'foo_768',
+  'foo_769',
+  'foo_770',
+  'foo_771',
+  'foo_772',
+  'foo_773',
+  'foo_774',
+  'foo_775',
+  'foo_776',
+  'foo_777',
+  'foo_778',
+  'foo_779',
+  'foo_780',
+  'foo_781',
+  'foo_782',
+  'foo_783',
+  'foo_784',
+  'foo_785',
+  'foo_786',
+  'foo_787',
+  'foo_788',
+  'foo_789',
+  'foo_790',
+  'foo_791',
+  'foo_792',
+  'foo_793',
+  'foo_794',
+  'foo_795',
+  'foo_796',
+  'foo_797',
+  'foo_798',
+  'foo_799',
+  'foo_800',
+  'foo_801',
+  'foo_802',
+  'foo_803',
+  'foo_804',
+  'foo_805',
+  'foo_806',
+  'foo_807',
+  'foo_808',
+  'foo_809',
+  'foo_810',
+  'foo_811',
+  'foo_812',
+  'foo_813',
+  'foo_814',
+  'foo_815',
+  'foo_816',
+  'foo_817',
+  'foo_818',
+  'foo_819',
+  'foo_820',
+  'foo_821',
+  'foo_822',
+  'foo_823',
+  'foo_824',
+  'foo_825',
+  'foo_826',
+  'foo_827',
+  'foo_828',
+  'foo_829',
+  'foo_830',
+  'foo_831',
+  'foo_832',
+  'foo_833',
+  'foo_834',
+  'foo_835',
+  'foo_836',
+  'foo_837',
+  'foo_838',
+  'foo_839',
+  'foo_840',
+  'foo_841',
+  'foo_842',
+  'foo_843',
+  'foo_844',
+  'foo_845',
+  'foo_846',
+  'foo_847',
+  'foo_848',
+  'foo_849',
+  'foo_850',
+  'foo_851',
+  'foo_852',
+  'foo_853',
+  'foo_854',
+  'foo_855',
+  'foo_856',
+  'foo_857',
+  'foo_858',
+  'foo_859',
+  'foo_860',
+  'foo_861',
+  'foo_862',
+  'foo_863',
+  'foo_864',
+  'foo_865',
+  'foo_866',
+  'foo_867',
+  'foo_868',
+  'foo_869',
+  'foo_870',
+  'foo_871',
+  'foo_872',
+  'foo_873',
+  'foo_874',
+  'foo_875',
+  'foo_876',
+  'foo_877',
+  'foo_878',
+  'foo_879',
+  'foo_880',
+  'foo_881',
+  'foo_882',
+  'foo_883',
+  'foo_884',
+  'foo_885',
+  'foo_886',
+  'foo_887',
+  'foo_888',
+  'foo_889',
+  'foo_890',
+  'foo_891',
+  'foo_892',
+  'foo_893',
+  'foo_894',
+  'foo_895',
+  'foo_896',
+  'foo_897',
+  'foo_898',
+  'foo_899',
+  'foo_900',
+  'foo_901',
+  'foo_902',
+  'foo_903',
+  'foo_904',
+  'foo_905',
+  'foo_906',
+  'foo_907',
+  'foo_908',
+  'foo_909',
+  'foo_910',
+  'foo_911',
+  'foo_912',
+  'foo_913',
+  'foo_914',
+  'foo_915',
+  'foo_916',
+  'foo_917',
+  'foo_918',
+  'foo_919',
+  'foo_920',
+  'foo_921',
+  'foo_922',
+  'foo_923',
+  'foo_924',
+  'foo_925',
+  'foo_926',
+  'foo_927',
+  'foo_928',
+  'foo_929',
+  'foo_930',
+  'foo_931',
+  'foo_932',
+  'foo_933',
+  'foo_934',
+  'foo_935',
+  'foo_936',
+  'foo_937',
+  'foo_938',
+  'foo_939',
+  'foo_940',
+  'foo_941',
+  'foo_942',
+  'foo_943',
+  'foo_944',
+  'foo_945',
+  'foo_946',
+  'foo_947',
+  'foo_948',
+  'foo_949',
+  'foo_950',
+  'foo_951',
+  'foo_952',
+  'foo_953',
+  'foo_954',
+  'foo_955',
+  'foo_956',
+  'foo_957',
+  'foo_958',
+  'foo_959',
+  'foo_960',
+  'foo_961',
+  'foo_962',
+  'foo_963',
+  'foo_964',
+  'foo_965',
+  'foo_966',
+  'foo_967',
+  'foo_968',
+  'foo_969',
+  'foo_970',
+  'foo_971',
+  'foo_972',
+  'foo_973',
+  'foo_974',
+  'foo_975',
+  'foo_976',
+  'foo_977',
+  'foo_978',
+  'foo_979',
+  'foo_980',
+  'foo_981',
+  'foo_982',
+  'foo_983',
+  'foo_984',
+  'foo_985',
+  'foo_986',
+  'foo_987',
+  'foo_988',
+  'foo_989',
+  'foo_990',
+  'foo_991',
+  'foo_992',
+  'foo_993',
+  'foo_994',
+  'foo_995',
+  'foo_996',
+  'foo_997',
+  'foo_998',
+  'foo_999',
+  'foo_1000',
+  'foo_1001',
+  'foo_1002',
+  'foo_1003',
+  'foo_1004',
+  'foo_1005',
+  'foo_1006',
+  'foo_1007',
+  'foo_1008',
+  'foo_1009',
+  'foo_1010',
+  'foo_1011',
+  'foo_1012',
+  'foo_1013',
+  'foo_1014',
+  'foo_1015',
+  'foo_1016',
+  'foo_1017',
+  'foo_1018',
+  'foo_1019',
+  'foo_1020',
+  'foo_1021',
+  'foo_1022',
+  'foo_1023',
+  'foo_1024',
+  'foo_1025',
+  'foo_1026',
+  'foo_1027',
+  'foo_1028',
+  'foo_1029',
+  'foo_1030',
+  'foo_1031',
+  'foo_1032',
+  'foo_1033',
+  'foo_1034',
+  'foo_1035',
+  'foo_1036',
+  'foo_1037',
+  'foo_1038',
+  'foo_1039',
+  'foo_1040',
+  'foo_1041',
+  'foo_1042',
+  'foo_1043',
+  'foo_1044',
+  'foo_1045',
+  'foo_1046',
+  'foo_1047',
+  'foo_1048',
+  'foo_1049',
+  'foo_1050',
+  'foo_1051',
+  'foo_1052',
+  'foo_1053',
+  'foo_1054',
+  'foo_1055',
+  'foo_1056',
+  'foo_1057',
+  'foo_1058',
+  'foo_1059',
+  'foo_1060',
+  'foo_1061',
+  'foo_1062',
+  'foo_1063',
+  'foo_1064',
+  'foo_1065',
+  'foo_1066',
+  'foo_1067',
+  'foo_1068',
+  'foo_1069',
+  'foo_1070',
+  'foo_1071',
+  'foo_1072',
+  'foo_1073',
+  'foo_1074',
+  'foo_1075',
+  'foo_1076',
+  'foo_1077',
+  'foo_1078',
+  'foo_1079',
+  'foo_1080',
+  'foo_1081',
+  'foo_1082',
+  'foo_1083',
+  'foo_1084',
+  'foo_1085',
+  'foo_1086',
+  'foo_1087',
+  'foo_1088',
+  'foo_1089',
+  'foo_1090',
+  'foo_1091',
+  'foo_1092',
+  'foo_1093',
+  'foo_1094',
+  'foo_1095',
+  'foo_1096',
+  'foo_1097',
+  'foo_1098',
+  'foo_1099',
+  'foo_1100',
+  'foo_1101',
+  'foo_1102',
+  'foo_1103',
+  'foo_1104',
+  'foo_1105',
+  'foo_1106',
+  'foo_1107',
+  'foo_1108',
+  'foo_1109',
+  'foo_1110',
+  'foo_1111',
+  'foo_1112',
+  'foo_1113',
+  'foo_1114',
+  'foo_1115',
+  'foo_1116',
+  'foo_1117',
+  'foo_1118',
+  'foo_1119',
+  'foo_1120',
+  'foo_1121',
+  'foo_1122',
+  'foo_1123',
+  'foo_1124',
+  'foo_1125',
+  'foo_1126',
+  'foo_1127',
+  'foo_1128',
+  'foo_1129',
+  'foo_1130',
+  'foo_1131',
+  'foo_1132',
+  'foo_1133',
+  'foo_1134',
+  'foo_1135',
+  'foo_1136',
+  'foo_1137',
+  'foo_1138',
+  'foo_1139',
+  'foo_1140',
+  'foo_1141',
+  'foo_1142',
+  'foo_1143',
+  'foo_1144',
+  'foo_1145',
+  'foo_1146',
+  'foo_1147',
+  'foo_1148',
+  'foo_1149',
+  'foo_1150',
+  'foo_1151',
+  'foo_1152',
+  'foo_1153',
+  'foo_1154',
+  'foo_1155',
+  'foo_1156',
+  'foo_1157',
+  'foo_1158',
+  'foo_1159',
+  'foo_1160',
+  'foo_1161',
+  'foo_1162',
+  'foo_1163',
+  'foo_1164',
+  'foo_1165',
+  'foo_1166',
+  'foo_1167',
+  'foo_1168',
+  'foo_1169',
+  'foo_1170',
+  'foo_1171',
+  'foo_1172',
+  'foo_1173',
+  'foo_1174',
+  'foo_1175',
+  'foo_1176',
+  'foo_1177',
+  'foo_1178',
+  'foo_1179',
+  'foo_1180',
+  'foo_1181',
+  'foo_1182',
+  'foo_1183',
+  'foo_1184',
+  'foo_1185',
+  'foo_1186',
+  'foo_1187',
+  'foo_1188',
+  'foo_1189',
+  'foo_1190',
+  'foo_1191',
+  'foo_1192',
+  'foo_1193',
+  'foo_1194',
+  'foo_1195',
+  'foo_1196',
+  'foo_1197',
+  'foo_1198',
+  'foo_1199',
+  'foo_1200',
+  'foo_1201',
+  'foo_1202',
+  'foo_1203',
+  'foo_1204',
+  'foo_1205',
+  'foo_1206',
+  'foo_1207',
+  'foo_1208',
+  'foo_1209',
+  'foo_1210',
+  'foo_1211',
+  'foo_1212',
+  'foo_1213',
+  'foo_1214',
+  'foo_1215',
+  'foo_1216',
+  'foo_1217',
+  'foo_1218',
+  'foo_1219',
+  'foo_1220',
+  'foo_1221',
+  'foo_1222',
+  'foo_1223',
+  'foo_1224',
+  'foo_1225',
+  'foo_1226',
+  'foo_1227',
+  'foo_1228',
+  'foo_1229',
+  'foo_1230',
+  'foo_1231',
+  'foo_1232',
+  'foo_1233',
+  'foo_1234',
+  'foo_1235',
+  'foo_1236',
+  'foo_1237',
+  'foo_1238',
+  'foo_1239',
+  'foo_1240',
+  'foo_1241',
+  'foo_1242',
+  'foo_1243',
+  'foo_1244',
+  'foo_1245',
+  'foo_1246',
+  'foo_1247',
+  'foo_1248',
+  'foo_1249',
+  'foo_1250',
+  'foo_1251',
+  'foo_1252',
+  'foo_1253',
+  'foo_1254',
+  'foo_1255',
+  'foo_1256',
+  'foo_1257',
+  'foo_1258',
+  'foo_1259',
+  'foo_1260',
+  'foo_1261',
+  'foo_1262',
+  'foo_1263',
+  'foo_1264',
+  'foo_1265',
+  'foo_1266',
+  'foo_1267',
+  'foo_1268',
+  'foo_1269',
+  'foo_1270',
+  'foo_1271',
+  'foo_1272',
+  'foo_1273',
+  'foo_1274',
+  'foo_1275',
+  'foo_1276',
+  'foo_1277',
+  'foo_1278',
+  'foo_1279',
+  'foo_1280',
+  'foo_1281',
+  'foo_1282',
+  'foo_1283',
+  'foo_1284',
+  'foo_1285',
+  'foo_1286',
+  'foo_1287',
+  'foo_1288',
+  'foo_1289',
+  'foo_1290',
+  'foo_1291',
+  'foo_1292',
+  'foo_1293',
+  'foo_1294',
+  'foo_1295',
+  'foo_1296',
+  'foo_1297',
+  'foo_1298',
+  'foo_1299',
+  'foo_1300',
+  'foo_1301',
+  'foo_1302',
+  'foo_1303',
+  'foo_1304',
+  'foo_1305',
+  'foo_1306',
+  'foo_1307',
+  'foo_1308',
+  'foo_1309',
+  'foo_1310',
+  'foo_1311',
+  'foo_1312',
+  'foo_1313',
+  'foo_1314',
+  'foo_1315',
+  'foo_1316',
+  'foo_1317',
+  'foo_1318',
+  'foo_1319',
+  'foo_1320',
+  'foo_1321',
+  'foo_1322',
+  'foo_1323',
+  'foo_1324',
+  'foo_1325',
+  'foo_1326',
+  'foo_1327',
+  'foo_1328',
+  'foo_1329',
+  'foo_1330',
+  'foo_1331',
+  'foo_1332',
+  'foo_1333',
+  'foo_1334',
+  'foo_1335',
+  'foo_1336',
+  'foo_1337',
+  'foo_1338',
+  'foo_1339',
+  'foo_1340',
+  'foo_1341',
+  'foo_1342',
+  'foo_1343',
+  'foo_1344',
+  'foo_1345',
+  'foo_1346',
+  'foo_1347',
+  'foo_1348',
+  'foo_1349',
+  'foo_1350',
+  'foo_1351',
+  'foo_1352',
+  'foo_1353',
+  'foo_1354',
+  'foo_1355',
+  'foo_1356',
+  'foo_1357',
+  'foo_1358',
+  'foo_1359',
+  'foo_1360',
+  'foo_1361',
+  'foo_1362',
+  'foo_1363',
+  'foo_1364',
+  'foo_1365',
+  'foo_1366',
+  'foo_1367',
+  'foo_1368',
+  'foo_1369',
+  'foo_1370',
+  'foo_1371',
+  'foo_1372',
+  'foo_1373',
+  'foo_1374',
+  'foo_1375',
+  'foo_1376',
+  'foo_1377',
+  'foo_1378',
+  'foo_1379',
+  'foo_1380',
+  'foo_1381',
+  'foo_1382',
+  'foo_1383',
+  'foo_1384',
+  'foo_1385',
+  'foo_1386',
+  'foo_1387',
+  'foo_1388',
+  'foo_1389',
+  'foo_1390',
+  'foo_1391',
+  'foo_1392',
+  'foo_1393',
+  'foo_1394',
+  'foo_1395',
+  'foo_1396',
+  'foo_1397',
+  'foo_1398',
+  'foo_1399',
+  'foo_1400',
+  'foo_1401',
+  'foo_1402',
+  'foo_1403',
+  'foo_1404',
+  'foo_1405',
+  'foo_1406',
+  'foo_1407',
+  'foo_1408',
+  'foo_1409',
+  'foo_1410',
+  'foo_1411',
+  'foo_1412',
+  'foo_1413',
+  'foo_1414',
+  'foo_1415',
+  'foo_1416',
+  'foo_1417',
+  'foo_1418',
+  'foo_1419',
+  'foo_1420',
+  'foo_1421',
+  'foo_1422',
+  'foo_1423',
+  'foo_1424',
+  'foo_1425',
+  'foo_1426',
+  'foo_1427',
+  'foo_1428',
+  'foo_1429',
+  'foo_1430',
+  'foo_1431',
+  'foo_1432',
+  'foo_1433',
+  'foo_1434',
+  'foo_1435',
+  'foo_1436',
+  'foo_1437',
+  'foo_1438',
+  'foo_1439',
+  'foo_1440',
+  'foo_1441',
+  'foo_1442',
+  'foo_1443',
+  'foo_1444',
+  'foo_1445',
+  'foo_1446',
+  'foo_1447',
+  'foo_1448',
+  'foo_1449',
+  'foo_1450',
+  'foo_1451',
+  'foo_1452',
+  'foo_1453',
+  'foo_1454',
+  'foo_1455',
+  'foo_1456',
+  'foo_1457',
+  'foo_1458',
+  'foo_1459',
+  'foo_1460',
+  'foo_1461',
+  'foo_1462',
+  'foo_1463',
+  'foo_1464',
+  'foo_1465',
+  'foo_1466',
+  'foo_1467',
+  'foo_1468',
+  'foo_1469',
+  'foo_1470',
+  'foo_1471',
+  'foo_1472',
+  'foo_1473',
+  'foo_1474',
+  'foo_1475',
+  'foo_1476',
+  'foo_1477',
+  'foo_1478',
+  'foo_1479',
+  'foo_1480',
+  'foo_1481',
+  'foo_1482',
+  'foo_1483',
+  'foo_1484',
+  'foo_1485',
+  'foo_1486',
+  'foo_1487',
+  'foo_1488',
+  'foo_1489',
+  'foo_1490',
+  'foo_1491',
+  'foo_1492',
+  'foo_1493',
+  'foo_1494',
+  'foo_1495',
+  'foo_1496',
+  'foo_1497',
+  'foo_1498',
+  'foo_1499',
+  'foo_1500',
+  'foo_1501',
+  'foo_1502',
+  'foo_1503',
+  'foo_1504',
+  'foo_1505',
+  'foo_1506',
+  'foo_1507',
+  'foo_1508',
+  'foo_1509',
+  'foo_1510',
+  'foo_1511',
+  'foo_1512',
+  'foo_1513',
+  'foo_1514',
+  'foo_1515',
+  'foo_1516',
+  'foo_1517',
+  'foo_1518',
+  'foo_1519',
+  'foo_1520',
+  'foo_1521',
+  'foo_1522',
+  'foo_1523',
+  'foo_1524',
+  'foo_1525',
+  'foo_1526',
+  'foo_1527',
+  'foo_1528',
+  'foo_1529',
+  'foo_1530',
+  'foo_1531',
+  'foo_1532',
+  'foo_1533',
+  'foo_1534',
+  'foo_1535',
+  'foo_1536',
+  'foo_1537',
+  'foo_1538',
+  'foo_1539',
+  'foo_1540',
+  'foo_1541',
+  'foo_1542',
+  'foo_1543',
+  'foo_1544',
+  'foo_1545',
+  'foo_1546',
+  'foo_1547',
+  'foo_1548',
+  'foo_1549',
+  'foo_1550',
+  'foo_1551',
+  'foo_1552',
+  'foo_1553',
+  'foo_1554',
+  'foo_1555',
+  'foo_1556',
+  'foo_1557',
+  'foo_1558',
+  'foo_1559',
+  'foo_1560',
+  'foo_1561',
+  'foo_1562',
+  'foo_1563',
+  'foo_1564',
+  'foo_1565',
+  'foo_1566',
+  'foo_1567',
+  'foo_1568',
+  'foo_1569',
+  'foo_1570',
+  'foo_1571',
+  'foo_1572',
+  'foo_1573',
+  'foo_1574',
+  'foo_1575',
+  'foo_1576',
+  'foo_1577',
+  'foo_1578',
+  'foo_1579',
+  'foo_1580',
+  'foo_1581',
+  'foo_1582',
+  'foo_1583',
+  'foo_1584',
+  'foo_1585',
+  'foo_1586',
+  'foo_1587',
+  'foo_1588',
+  'foo_1589',
+  'foo_1590',
+  'foo_1591',
+  'foo_1592',
+  'foo_1593',
+  'foo_1594',
+  'foo_1595',
+  'foo_1596',
+  'foo_1597',
+  'foo_1598',
+  'foo_1599',
+  'foo_1600',
+  'foo_1601',
+  'foo_1602',
+  'foo_1603',
+  'foo_1604',
+  'foo_1605',
+  'foo_1606',
+  'foo_1607',
+  'foo_1608',
+  'foo_1609',
+  'foo_1610',
+  'foo_1611',
+  'foo_1612',
+  'foo_1613',
+  'foo_1614',
+  'foo_1615',
+  'foo_1616',
+  'foo_1617',
+  'foo_1618',
+  'foo_1619',
+  'foo_1620',
+  'foo_1621',
+  'foo_1622',
+  'foo_1623',
+  'foo_1624',
+  'foo_1625',
+  'foo_1626',
+  'foo_1627',
+  'foo_1628',
+  'foo_1629',
+  'foo_1630',
+  'foo_1631',
+  'foo_1632',
+  'foo_1633',
+  'foo_1634',
+  'foo_1635',
+  'foo_1636',
+  'foo_1637',
+  'foo_1638',
+  'foo_1639',
+  'foo_1640',
+  'foo_1641',
+  'foo_1642',
+  'foo_1643',
+  'foo_1644',
+  'foo_1645',
+  'foo_1646',
+  'foo_1647',
+  'foo_1648',
+  'foo_1649',
+  'foo_1650',
+  'foo_1651',
+  'foo_1652',
+  'foo_1653',
+  'foo_1654',
+  'foo_1655',
+  'foo_1656',
+  'foo_1657',
+  'foo_1658',
+  'foo_1659',
+  'foo_1660',
+  'foo_1661',
+  'foo_1662',
+  'foo_1663',
+  'foo_1664',
+  'foo_1665',
+  'foo_1666',
+  'foo_1667',
+  'foo_1668',
+  'foo_1669',
+  'foo_1670',
+  'foo_1671',
+  'foo_1672',
+  'foo_1673',
+  'foo_1674',
+  'foo_1675',
+  'foo_1676',
+  'foo_1677',
+  'foo_1678',
+  'foo_1679',
+  'foo_1680',
+  'foo_1681',
+  'foo_1682',
+  'foo_1683',
+  'foo_1684',
+  'foo_1685',
+  'foo_1686',
+  'foo_1687',
+  'foo_1688',
+  'foo_1689',
+  'foo_1690',
+  'foo_1691',
+  'foo_1692',
+  'foo_1693',
+  'foo_1694',
+  'foo_1695',
+  'foo_1696',
+  'foo_1697',
+  'foo_1698',
+  'foo_1699',
+  'foo_1700',
+  'foo_1701',
+  'foo_1702',
+  'foo_1703',
+  'foo_1704',
+  'foo_1705',
+  'foo_1706',
+  'foo_1707',
+  'foo_1708',
+  'foo_1709',
+  'foo_1710',
+  'foo_1711',
+  'foo_1712',
+  'foo_1713',
+  'foo_1714',
+  'foo_1715',
+  'foo_1716',
+  'foo_1717',
+  'foo_1718',
+  'foo_1719',
+  'foo_1720',
+  'foo_1721',
+  'foo_1722',
+  'foo_1723',
+  'foo_1724',
+  'foo_1725',
+  'foo_1726',
+  'foo_1727',
+  'foo_1728',
+  'foo_1729',
+  'foo_1730',
+  'foo_1731',
+  'foo_1732',
+  'foo_1733',
+  'foo_1734',
+  'foo_1735',
+  'foo_1736',
+  'foo_1737',
+  'foo_1738',
+  'foo_1739',
+  'foo_1740',
+  'foo_1741',
+  'foo_1742',
+  'foo_1743',
+  'foo_1744',
+  'foo_1745',
+  'foo_1746',
+  'foo_1747',
+  'foo_1748',
+  'foo_1749',
+  'foo_1750',
+  'foo_1751',
+  'foo_1752',
+  'foo_1753',
+  'foo_1754',
+  'foo_1755',
+  'foo_1756',
+  'foo_1757',
+  'foo_1758',
+  'foo_1759',
+  'foo_1760',
+  'foo_1761',
+  'foo_1762',
+  'foo_1763',
+  'foo_1764',
+  'foo_1765',
+  'foo_1766',
+  'foo_1767',
+  'foo_1768',
+  'foo_1769',
+  'foo_1770',
+  'foo_1771',
+  'foo_1772',
+  'foo_1773',
+  'foo_1774',
+  'foo_1775',
+  'foo_1776',
+  'foo_1777',
+  'foo_1778',
+  'foo_1779',
+  'foo_1780',
+  'foo_1781',
+  'foo_1782',
+  'foo_1783',
+  'foo_1784',
+  'foo_1785',
+  'foo_1786',
+  'foo_1787',
+  'foo_1788',
+  'foo_1789',
+  'foo_1790',
+  'foo_1791',
+  'foo_1792',
+  'foo_1793',
+  'foo_1794',
+  'foo_1795',
+  'foo_1796',
+  'foo_1797',
+  'foo_1798',
+  'foo_1799',
+  'foo_1800',
+  'foo_1801',
+  'foo_1802',
+  'foo_1803',
+  'foo_1804',
+  'foo_1805',
+  'foo_1806',
+  'foo_1807',
+  'foo_1808',
+  'foo_1809',
+  'foo_1810',
+  'foo_1811',
+  'foo_1812',
+  'foo_1813',
+  'foo_1814',
+  'foo_1815',
+  'foo_1816',
+  'foo_1817',
+  'foo_1818',
+  'foo_1819',
+  'foo_1820',
+  'foo_1821',
+  'foo_1822',
+  'foo_1823',
+  'foo_1824',
+  'foo_1825',
+  'foo_1826',
+  'foo_1827',
+  'foo_1828',
+  'foo_1829',
+  'foo_1830',
+  'foo_1831',
+  'foo_1832',
+  'foo_1833',
+  'foo_1834',
+  'foo_1835',
+  'foo_1836',
+  'foo_1837',
+  'foo_1838',
+  'foo_1839',
+  'foo_1840',
+  'foo_1841',
+  'foo_1842',
+  'foo_1843',
+  'foo_1844',
+  'foo_1845',
+  'foo_1846',
+  'foo_1847',
+  'foo_1848',
+  'foo_1849',
+  'foo_1850',
+  'foo_1851',
+  'foo_1852',
+  'foo_1853',
+  'foo_1854',
+  'foo_1855',
+  'foo_1856',
+  'foo_1857',
+  'foo_1858',
+  'foo_1859',
+  'foo_1860',
+  'foo_1861',
+  'foo_1862',
+  'foo_1863',
+  'foo_1864',
+  'foo_1865',
+  'foo_1866',
+  'foo_1867',
+  'foo_1868',
+  'foo_1869',
+  'foo_1870',
+  'foo_1871',
+  'foo_1872',
+  'foo_1873',
+  'foo_1874',
+  'foo_1875',
+  'foo_1876',
+  'foo_1877',
+  'foo_1878',
+  'foo_1879',
+  'foo_1880',
+  'foo_1881',
+  'foo_1882',
+  'foo_1883',
+  'foo_1884',
+  'foo_1885',
+  'foo_1886',
+  'foo_1887',
+  'foo_1888',
+  'foo_1889',
+  'foo_1890',
+  'foo_1891',
+  'foo_1892',
+  'foo_1893',
+  'foo_1894',
+  'foo_1895',
+  'foo_1896',
+  'foo_1897',
+  'foo_1898',
+  'foo_1899',
+  'foo_1900',
+  'foo_1901',
+  'foo_1902',
+  'foo_1903',
+  'foo_1904',
+  'foo_1905',
+  'foo_1906',
+  'foo_1907',
+  'foo_1908',
+  'foo_1909',
+  'foo_1910',
+  'foo_1911',
+  'foo_1912',
+  'foo_1913',
+  'foo_1914',
+  'foo_1915',
+  'foo_1916',
+  'foo_1917',
+  'foo_1918',
+  'foo_1919',
+  'foo_1920',
+  'foo_1921',
+  'foo_1922',
+  'foo_1923',
+  'foo_1924',
+  'foo_1925',
+  'foo_1926',
+  'foo_1927',
+  'foo_1928',
+  'foo_1929',
+  'foo_1930',
+  'foo_1931',
+  'foo_1932',
+  'foo_1933',
+  'foo_1934',
+  'foo_1935',
+  'foo_1936',
+  'foo_1937',
+  'foo_1938',
+  'foo_1939',
+  'foo_1940',
+  'foo_1941',
+  'foo_1942',
+  'foo_1943',
+  'foo_1944',
+  'foo_1945',
+  'foo_1946',
+  'foo_1947',
+  'foo_1948',
+  'foo_1949',
+  'foo_1950',
+  'foo_1951',
+  'foo_1952',
+  'foo_1953',
+  'foo_1954',
+  'foo_1955',
+  'foo_1956',
+  'foo_1957',
+  'foo_1958',
+  'foo_1959',
+  'foo_1960',
+  'foo_1961',
+  'foo_1962',
+  'foo_1963',
+  'foo_1964',
+  'foo_1965',
+  'foo_1966',
+  'foo_1967',
+  'foo_1968',
+  'foo_1969',
+  'foo_1970',
+  'foo_1971',
+  'foo_1972',
+  'foo_1973',
+  'foo_1974',
+  'foo_1975',
+  'foo_1976',
+  'foo_1977',
+  'foo_1978',
+  'foo_1979',
+  'foo_1980',
+  'foo_1981',
+  'foo_1982',
+  'foo_1983',
+  'foo_1984',
+  'foo_1985',
+  'foo_1986',
+  'foo_1987',
+  'foo_1988',
+  'foo_1989',
+  'foo_1990',
+  'foo_1991',
+  'foo_1992',
+  'foo_1993',
+  'foo_1994',
+  'foo_1995',
+  'foo_1996',
+  'foo_1997',
+  'foo_1998',
+  'foo_1999',
+  'foo_2000',
+  'foo_2001',
+  'foo_2002',
+  'foo_2003',
+  'foo_2004',
+  'foo_2005',
+  'foo_2006',
+  'foo_2007',
+  'foo_2008',
+  'foo_2009',
+  'foo_2010',
+  'foo_2011',
+  'foo_2012',
+  'foo_2013',
+  'foo_2014',
+  'foo_2015',
+  'foo_2016',
+  'foo_2017',
+  'foo_2018',
+  'foo_2019',
+  'foo_2020',
+  'foo_2021',
+  'foo_2022',
+  'foo_2023',
+  'foo_2024',
+  'foo_2025',
+  'foo_2026',
+  'foo_2027',
+  'foo_2028',
+  'foo_2029',
+  'foo_2030',
+  'foo_2031',
+  'foo_2032',
+  'foo_2033',
+  'foo_2034',
+  'foo_2035',
+  'foo_2036',
+  'foo_2037',
+  'foo_2038',
+  'foo_2039',
+  'foo_2040',
+  'foo_2041',
+  'foo_2042',
+  'foo_2043',
+  'foo_2044',
+  'foo_2045',
+  'foo_2046',
+  'foo_2047',
+  'foo_2048',
+  'foo_2049',
+  'foo_2050',
+  'foo_2051',
+  'foo_2052',
+  'foo_2053',
+  'foo_2054',
+  'foo_2055',
+  'foo_2056',
+  'foo_2057',
+  'foo_2058',
+  'foo_2059',
+  'foo_2060',
+  'foo_2061',
+  'foo_2062',
+  'foo_2063',
+  'foo_2064',
+  'foo_2065',
+  'foo_2066',
+  'foo_2067',
+  'foo_2068',
+  'foo_2069',
+  'foo_2070',
+  'foo_2071',
+  'foo_2072',
+  'foo_2073',
+  'foo_2074',
+  'foo_2075',
+  'foo_2076',
+  'foo_2077',
+  'foo_2078',
+  'foo_2079',
+  'foo_2080',
+  'foo_2081',
+  'foo_2082',
+  'foo_2083',
+  'foo_2084',
+  'foo_2085',
+  'foo_2086',
+  'foo_2087',
+  'foo_2088',
+  'foo_2089',
+  'foo_2090',
+  'foo_2091',
+  'foo_2092',
+  'foo_2093',
+  'foo_2094',
+  'foo_2095',
+  'foo_2096',
+  'foo_2097',
+  'foo_2098',
+  'foo_2099',
+  'foo_2100',
+  'foo_2101',
+  'foo_2102',
+  'foo_2103',
+  'foo_2104',
+  'foo_2105',
+  'foo_2106',
+  'foo_2107',
+  'foo_2108',
+  'foo_2109',
+  'foo_2110',
+  'foo_2111',
+  'foo_2112',
+  'foo_2113',
+  'foo_2114',
+  'foo_2115',
+  'foo_2116',
+  'foo_2117',
+  'foo_2118',
+  'foo_2119',
+  'foo_2120',
+  'foo_2121',
+  'foo_2122',
+  'foo_2123',
+  'foo_2124',
+  'foo_2125',
+  'foo_2126',
+  'foo_2127',
+  'foo_2128',
+  'foo_2129',
+  'foo_2130',
+  'foo_2131',
+  'foo_2132',
+  'foo_2133',
+  'foo_2134',
+  'foo_2135',
+  'foo_2136',
+  'foo_2137',
+  'foo_2138',
+  'foo_2139',
+  'foo_2140',
+  'foo_2141',
+  'foo_2142',
+  'foo_2143',
+  'foo_2144',
+  'foo_2145',
+  'foo_2146',
+  'foo_2147',
+  'foo_2148',
+  'foo_2149',
+  'foo_2150',
+  'foo_2151',
+  'foo_2152',
+  'foo_2153',
+  'foo_2154',
+  'foo_2155',
+  'foo_2156',
+  'foo_2157',
+  'foo_2158',
+  'foo_2159',
+  'foo_2160',
+  'foo_2161',
+  'foo_2162',
+  'foo_2163',
+  'foo_2164',
+  'foo_2165',
+  'foo_2166',
+  'foo_2167',
+  'foo_2168',
+  'foo_2169',
+  'foo_2170',
+  'foo_2171',
+  'foo_2172',
+  'foo_2173',
+  'foo_2174',
+  'foo_2175',
+  'foo_2176',
+  'foo_2177',
+  'foo_2178',
+  'foo_2179',
+  'foo_2180',
+  'foo_2181',
+  'foo_2182',
+  'foo_2183',
+  'foo_2184',
+  'foo_2185',
+  'foo_2186',
+  'foo_2187',
+  'foo_2188',
+  'foo_2189',
+  'foo_2190',
+  'foo_2191',
+  'foo_2192',
+  'foo_2193',
+  'foo_2194',
+  'foo_2195',
+  'foo_2196',
+  'foo_2197',
+  'foo_2198',
+  'foo_2199',
+  'foo_2200',
+  'foo_2201',
+  'foo_2202',
+  'foo_2203',
+  'foo_2204',
+  'foo_2205',
+  'foo_2206',
+  'foo_2207',
+  'foo_2208',
+  'foo_2209',
+  'foo_2210',
+  'foo_2211',
+  'foo_2212',
+  'foo_2213',
+  'foo_2214',
+  'foo_2215',
+  'foo_2216',
+  'foo_2217',
+  'foo_2218',
+  'foo_2219',
+  'foo_2220',
+  'foo_2221',
+  'foo_2222',
+  'foo_2223',
+  'foo_2224',
+  'foo_2225',
+  'foo_2226',
+  'foo_2227',
+  'foo_2228',
+  'foo_2229',
+  'foo_2230',
+  'foo_2231',
+  'foo_2232',
+  'foo_2233',
+  'foo_2234',
+  'foo_2235',
+  'foo_2236',
+  'foo_2237',
+  'foo_2238',
+  'foo_2239',
+  'foo_2240',
+  'foo_2241',
+  'foo_2242',
+  'foo_2243',
+  'foo_2244',
+  'foo_2245',
+  'foo_2246',
+  'foo_2247',
+  'foo_2248',
+  'foo_2249',
+  'foo_2250',
+  'foo_2251',
+  'foo_2252',
+  'foo_2253',
+  'foo_2254',
+  'foo_2255',
+  'foo_2256',
+  'foo_2257',
+  'foo_2258',
+  'foo_2259',
+  'foo_2260',
+  'foo_2261',
+  'foo_2262',
+  'foo_2263',
+  'foo_2264',
+  'foo_2265',
+  'foo_2266',
+  'foo_2267',
+  'foo_2268',
+  'foo_2269',
+  'foo_2270',
+  'foo_2271',
+  'foo_2272',
+  'foo_2273',
+  'foo_2274',
+  'foo_2275',
+  'foo_2276',
+  'foo_2277',
+  'foo_2278',
+  'foo_2279',
+  'foo_2280',
+  'foo_2281',
+  'foo_2282',
+  'foo_2283',
+  'foo_2284',
+  'foo_2285',
+  'foo_2286',
+  'foo_2287',
+  'foo_2288',
+  'foo_2289',
+  'foo_2290',
+  'foo_2291',
+  'foo_2292',
+  'foo_2293',
+  'foo_2294',
+  'foo_2295',
+  'foo_2296',
+  'foo_2297',
+  'foo_2298',
+  'foo_2299',
+  'foo_2300',
+  'foo_2301',
+  'foo_2302',
+  'foo_2303',
+  'foo_2304',
+  'foo_2305',
+  'foo_2306',
+  'foo_2307',
+  'foo_2308',
+  'foo_2309',
+  'foo_2310',
+  'foo_2311',
+  'foo_2312',
+  'foo_2313',
+  'foo_2314',
+  'foo_2315',
+  'foo_2316',
+  'foo_2317',
+  'foo_2318',
+  'foo_2319',
+  'foo_2320',
+  'foo_2321',
+  'foo_2322',
+  'foo_2323',
+  'foo_2324',
+  'foo_2325',
+  'foo_2326',
+  'foo_2327',
+  'foo_2328',
+  'foo_2329',
+  'foo_2330',
+  'foo_2331',
+  'foo_2332',
+  'foo_2333',
+  'foo_2334',
+  'foo_2335',
+  'foo_2336',
+  'foo_2337',
+  'foo_2338',
+  'foo_2339',
+  'foo_2340',
+  'foo_2341',
+  'foo_2342',
+  'foo_2343',
+  'foo_2344',
+  'foo_2345',
+  'foo_2346',
+  'foo_2347',
+  'foo_2348',
+  'foo_2349',
+  'foo_2350',
+  'foo_2351',
+  'foo_2352',
+  'foo_2353',
+  'foo_2354',
+  'foo_2355',
+  'foo_2356',
+  'foo_2357',
+  'foo_2358',
+  'foo_2359',
+  'foo_2360',
+  'foo_2361',
+  'foo_2362',
+  'foo_2363',
+  'foo_2364',
+  'foo_2365',
+  'foo_2366',
+  'foo_2367',
+  'foo_2368',
+  'foo_2369',
+  'foo_2370',
+  'foo_2371',
+  'foo_2372',
+  'foo_2373',
+  'foo_2374',
+  'foo_2375',
+  'foo_2376',
+  'foo_2377',
+  'foo_2378',
+  'foo_2379',
+  'foo_2380',
+  'foo_2381',
+  'foo_2382',
+  'foo_2383',
+  'foo_2384',
+  'foo_2385',
+  'foo_2386',
+  'foo_2387',
+  'foo_2388',
+  'foo_2389',
+  'foo_2390',
+  'foo_2391',
+  'foo_2392',
+  'foo_2393',
+  'foo_2394',
+  'foo_2395',
+  'foo_2396',
+  'foo_2397',
+  'foo_2398',
+  'foo_2399',
+  'foo_2400',
+  'foo_2401',
+  'foo_2402',
+  'foo_2403',
+  'foo_2404',
+  'foo_2405',
+  'foo_2406',
+  'foo_2407',
+  'foo_2408',
+  'foo_2409',
+  'foo_2410',
+  'foo_2411',
+  'foo_2412',
+  'foo_2413',
+  'foo_2414',
+  'foo_2415',
+  'foo_2416',
+  'foo_2417',
+  'foo_2418',
+  'foo_2419',
+  'foo_2420',
+  'foo_2421',
+  'foo_2422',
+  'foo_2423',
+  'foo_2424',
+  'foo_2425',
+  'foo_2426',
+  'foo_2427',
+  'foo_2428',
+  'foo_2429',
+  'foo_2430',
+  'foo_2431',
+  'foo_2432',
+  'foo_2433',
+  'foo_2434',
+  'foo_2435',
+  'foo_2436',
+  'foo_2437',
+  'foo_2438',
+  'foo_2439',
+  'foo_2440',
+  'foo_2441',
+  'foo_2442',
+  'foo_2443',
+  'foo_2444',
+  'foo_2445',
+  'foo_2446',
+  'foo_2447',
+  'foo_2448',
+  'foo_2449',
+  'foo_2450',
+  'foo_2451',
+  'foo_2452',
+  'foo_2453',
+  'foo_2454',
+  'foo_2455',
+  'foo_2456',
+  'foo_2457',
+  'foo_2458',
+  'foo_2459',
+  'foo_2460',
+  'foo_2461',
+  'foo_2462',
+  'foo_2463',
+  'foo_2464',
+  'foo_2465',
+  'foo_2466',
+  'foo_2467',
+  'foo_2468',
+  'foo_2469',
+  'foo_2470',
+  'foo_2471',
+  'foo_2472',
+  'foo_2473',
+  'foo_2474',
+  'foo_2475',
+  'foo_2476',
+  'foo_2477',
+  'foo_2478',
+  'foo_2479',
+  'foo_2480',
+  'foo_2481',
+  'foo_2482',
+  'foo_2483',
+  'foo_2484',
+  'foo_2485',
+  'foo_2486',
+  'foo_2487',
+  'foo_2488',
+  'foo_2489',
+  'foo_2490',
+  'foo_2491',
+  'foo_2492',
+  'foo_2493',
+  'foo_2494',
+  'foo_2495',
+  'foo_2496',
+  'foo_2497',
+  'foo_2498',
+  'foo_2499',
+  'foo_2500',
+  'foo_2501',
+  'foo_2502',
+  'foo_2503',
+  'foo_2504',
+  'foo_2505',
+  'foo_2506',
+  'foo_2507',
+  'foo_2508',
+  'foo_2509',
+  'foo_2510',
+  'foo_2511',
+  'foo_2512',
+  'foo_2513',
+  'foo_2514',
+  'foo_2515',
+  'foo_2516',
+  'foo_2517',
+  'foo_2518',
+  'foo_2519',
+  'foo_2520',
+  'foo_2521',
+  'foo_2522',
+  'foo_2523',
+  'foo_2524',
+  'foo_2525',
+  'foo_2526',
+  'foo_2527',
+  'foo_2528',
+  'foo_2529',
+  'foo_2530',
+  'foo_2531',
+  'foo_2532',
+  'foo_2533',
+  'foo_2534',
+  'foo_2535',
+  'foo_2536',
+  'foo_2537',
+  'foo_2538',
+  'foo_2539',
+  'foo_2540',
+  'foo_2541',
+  'foo_2542',
+  'foo_2543',
+  'foo_2544',
+  'foo_2545',
+  'foo_2546',
+  'foo_2547',
+  'foo_2548',
+  'foo_2549',
+  'foo_2550',
+  'foo_2551',
+  'foo_2552',
+  'foo_2553',
+  'foo_2554',
+  'foo_2555',
+  'foo_2556',
+  'foo_2557',
+  'foo_2558',
+  'foo_2559',
+  'foo_2560',
+  'foo_2561',
+  'foo_2562',
+  'foo_2563',
+  'foo_2564',
+  'foo_2565',
+  'foo_2566',
+  'foo_2567',
+  'foo_2568',
+  'foo_2569',
+  'foo_2570',
+  'foo_2571',
+  'foo_2572',
+  'foo_2573',
+  'foo_2574',
+  'foo_2575',
+  'foo_2576',
+  'foo_2577',
+  'foo_2578',
+  'foo_2579',
+  'foo_2580',
+  'foo_2581',
+  'foo_2582',
+  'foo_2583',
+  'foo_2584',
+  'foo_2585',
+  'foo_2586',
+  'foo_2587',
+  'foo_2588',
+  'foo_2589',
+  'foo_2590',
+  'foo_2591',
+  'foo_2592',
+  'foo_2593',
+  'foo_2594',
+  'foo_2595',
+  'foo_2596',
+  'foo_2597',
+  'foo_2598',
+  'foo_2599',
+  'foo_2600',
+  'foo_2601',
+  'foo_2602',
+  'foo_2603',
+  'foo_2604',
+  'foo_2605',
+  'foo_2606',
+  'foo_2607',
+  'foo_2608',
+  'foo_2609',
+  'foo_2610',
+  'foo_2611',
+  'foo_2612',
+  'foo_2613',
+  'foo_2614',
+  'foo_2615',
+  'foo_2616',
+  'foo_2617',
+  'foo_2618',
+  'foo_2619',
+  'foo_2620',
+  'foo_2621',
+  'foo_2622',
+  'foo_2623',
+  'foo_2624',
+  'foo_2625',
+  'foo_2626',
+  'foo_2627',
+  'foo_2628',
+  'foo_2629',
+  'foo_2630',
+  'foo_2631',
+  'foo_2632',
+  'foo_2633',
+  'foo_2634',
+  'foo_2635',
+  'foo_2636',
+  'foo_2637',
+  'foo_2638',
+  'foo_2639',
+  'foo_2640',
+  'foo_2641',
+  'foo_2642',
+  'foo_2643',
+  'foo_2644',
+  'foo_2645',
+  'foo_2646',
+  'foo_2647',
+  'foo_2648',
+  'foo_2649',
+  'foo_2650',
+  'foo_2651',
+  'foo_2652',
+  'foo_2653',
+  'foo_2654',
+  'foo_2655',
+  'foo_2656',
+  'foo_2657',
+  'foo_2658',
+  'foo_2659',
+  'foo_2660',
+  'foo_2661',
+  'foo_2662',
+  'foo_2663',
+  'foo_2664',
+  'foo_2665',
+  'foo_2666',
+  'foo_2667',
+  'foo_2668',
+  'foo_2669',
+  'foo_2670',
+  'foo_2671',
+  'foo_2672',
+  'foo_2673',
+  'foo_2674',
+  'foo_2675',
+  'foo_2676',
+  'foo_2677',
+  'foo_2678',
+  'foo_2679',
+  'foo_2680',
+  'foo_2681',
+  'foo_2682',
+  'foo_2683',
+  'foo_2684',
+  'foo_2685',
+  'foo_2686',
+  'foo_2687',
+  'foo_2688',
+  'foo_2689',
+  'foo_2690',
+  'foo_2691',
+  'foo_2692',
+  'foo_2693',
+  'foo_2694',
+  'foo_2695',
+  'foo_2696',
+  'foo_2697',
+  'foo_2698',
+  'foo_2699',
+  'foo_2700',
+  'foo_2701',
+  'foo_2702',
+  'foo_2703',
+  'foo_2704',
+  'foo_2705',
+  'foo_2706',
+  'foo_2707',
+  'foo_2708',
+  'foo_2709',
+  'foo_2710',
+  'foo_2711',
+  'foo_2712',
+  'foo_2713',
+  'foo_2714',
+  'foo_2715',
+  'foo_2716',
+  'foo_2717',
+  'foo_2718',
+  'foo_2719',
+  'foo_2720',
+  'foo_2721',
+  'foo_2722',
+  'foo_2723',
+  'foo_2724',
+  'foo_2725',
+  'foo_2726',
+  'foo_2727',
+  'foo_2728',
+  'foo_2729',
+  'foo_2730',
+  'foo_2731',
+  'foo_2732',
+  'foo_2733',
+  'foo_2734',
+  'foo_2735',
+  'foo_2736',
+  'foo_2737',
+  'foo_2738',
+  'foo_2739',
+  'foo_2740',
+  'foo_2741',
+  'foo_2742',
+  'foo_2743',
+  'foo_2744',
+  'foo_2745',
+  'foo_2746',
+  'foo_2747',
+  'foo_2748',
+  'foo_2749',
+  'foo_2750',
+  'foo_2751',
+  'foo_2752',
+  'foo_2753',
+  'foo_2754',
+  'foo_2755',
+  'foo_2756',
+  'foo_2757',
+  'foo_2758',
+  'foo_2759',
+  'foo_2760',
+  'foo_2761',
+  'foo_2762',
+  'foo_2763',
+  'foo_2764',
+  'foo_2765',
+  'foo_2766',
+  'foo_2767',
+  'foo_2768',
+  'foo_2769',
+  'foo_2770',
+  'foo_2771',
+  'foo_2772',
+  'foo_2773',
+  'foo_2774',
+  'foo_2775',
+  'foo_2776',
+  'foo_2777',
+  'foo_2778',
+  'foo_2779',
+  'foo_2780',
+  'foo_2781',
+  'foo_2782',
+  'foo_2783',
+  'foo_2784',
+  'foo_2785',
+  'foo_2786',
+  'foo_2787',
+  'foo_2788',
+  'foo_2789',
+  'foo_2790',
+  'foo_2791',
+  'foo_2792',
+  'foo_2793',
+  'foo_2794',
+  'foo_2795',
+  'foo_2796',
+  'foo_2797',
+  'foo_2798',
+  'foo_2799',
+  'foo_2800',
+  'foo_2801',
+  'foo_2802',
+  'foo_2803',
+  'foo_2804',
+  'foo_2805',
+  'foo_2806',
+  'foo_2807',
+  'foo_2808',
+  'foo_2809',
+  'foo_2810',
+  'foo_2811',
+  'foo_2812',
+  'foo_2813',
+  'foo_2814',
+  'foo_2815',
+  'foo_2816',
+  'foo_2817',
+  'foo_2818',
+  'foo_2819',
+  'foo_2820',
+  'foo_2821',
+  'foo_2822',
+  'foo_2823',
+  'foo_2824',
+  'foo_2825',
+  'foo_2826',
+  'foo_2827',
+  'foo_2828',
+  'foo_2829',
+  'foo_2830',
+  'foo_2831',
+  'foo_2832',
+  'foo_2833',
+  'foo_2834',
+  'foo_2835',
+  'foo_2836',
+  'foo_2837',
+  'foo_2838',
+  'foo_2839',
+  'foo_2840',
+  'foo_2841',
+  'foo_2842',
+  'foo_2843',
+  'foo_2844',
+  'foo_2845',
+  'foo_2846',
+  'foo_2847',
+  'foo_2848',
+  'foo_2849',
+  'foo_2850',
+  'foo_2851',
+  'foo_2852',
+  'foo_2853',
+  'foo_2854',
+  'foo_2855',
+  'foo_2856',
+  'foo_2857',
+  'foo_2858',
+  'foo_2859',
+  'foo_2860',
+  'foo_2861',
+  'foo_2862',
+  'foo_2863',
+  'foo_2864',
+  'foo_2865',
+  'foo_2866',
+  'foo_2867',
+  'foo_2868',
+  'foo_2869',
+  'foo_2870',
+  'foo_2871',
+  'foo_2872',
+  'foo_2873',
+  'foo_2874',
+  'foo_2875',
+  'foo_2876',
+  'foo_2877',
+  'foo_2878',
+  'foo_2879',
+  'foo_2880',
+  'foo_2881',
+  'foo_2882',
+  'foo_2883',
+  'foo_2884',
+  'foo_2885',
+  'foo_2886',
+  'foo_2887',
+  'foo_2888',
+  'foo_2889',
+  'foo_2890',
+  'foo_2891',
+  'foo_2892',
+  'foo_2893',
+  'foo_2894',
+  'foo_2895',
+  'foo_2896',
+  'foo_2897',
+  'foo_2898',
+  'foo_2899',
+  'foo_2900',
+  'foo_2901',
+  'foo_2902',
+  'foo_2903',
+  'foo_2904',
+  'foo_2905',
+  'foo_2906',
+  'foo_2907',
+  'foo_2908',
+  'foo_2909',
+  'foo_2910',
+  'foo_2911',
+  'foo_2912',
+  'foo_2913',
+  'foo_2914',
+  'foo_2915',
+  'foo_2916',
+  'foo_2917',
+  'foo_2918',
+  'foo_2919',
+  'foo_2920',
+  'foo_2921',
+  'foo_2922',
+  'foo_2923',
+  'foo_2924',
+  'foo_2925',
+  'foo_2926',
+  'foo_2927',
+  'foo_2928',
+  'foo_2929',
+  'foo_2930',
+  'foo_2931',
+  'foo_2932',
+  'foo_2933',
+  'foo_2934',
+  'foo_2935',
+  'foo_2936',
+  'foo_2937',
+  'foo_2938',
+  'foo_2939',
+  'foo_2940',
+  'foo_2941',
+  'foo_2942',
+  'foo_2943',
+  'foo_2944',
+  'foo_2945',
+  'foo_2946',
+  'foo_2947',
+  'foo_2948',
+  'foo_2949',
+  'foo_2950',
+  'foo_2951',
+  'foo_2952',
+  'foo_2953',
+  'foo_2954',
+  'foo_2955',
+  'foo_2956',
+  'foo_2957',
+  'foo_2958',
+  'foo_2959',
+  'foo_2960',
+  'foo_2961',
+  'foo_2962',
+  'foo_2963',
+  'foo_2964',
+  'foo_2965',
+  'foo_2966',
+  'foo_2967',
+  'foo_2968',
+  'foo_2969',
+  'foo_2970',
+  'foo_2971',
+  'foo_2972',
+  'foo_2973',
+  'foo_2974',
+  'foo_2975',
+  'foo_2976',
+  'foo_2977',
+  'foo_2978',
+  'foo_2979',
+  'foo_2980',
+  'foo_2981',
+  'foo_2982',
+  'foo_2983',
+  'foo_2984',
+  'foo_2985',
+  'foo_2986',
+  'foo_2987',
+  'foo_2988',
+  'foo_2989',
+  'foo_2990',
+  'foo_2991',
+  'foo_2992',
+  'foo_2993',
+  'foo_2994',
+  'foo_2995',
+  'foo_2996',
+  'foo_2997',
+  'foo_2998',
+  'foo_2999',
+  'foo_3000',
+  'foo_3001',
+  'foo_3002',
+  'foo_3003',
+  'foo_3004',
+  'foo_3005',
+  'foo_3006',
+  'foo_3007',
+  'foo_3008',
+  'foo_3009',
+  'foo_3010',
+  'foo_3011',
+  'foo_3012',
+  'foo_3013',
+  'foo_3014',
+  'foo_3015',
+  'foo_3016',
+  'foo_3017',
+  'foo_3018',
+  'foo_3019',
+  'foo_3020',
+  'foo_3021',
+  'foo_3022',
+  'foo_3023',
+  'foo_3024',
+  'foo_3025',
+  'foo_3026',
+  'foo_3027',
+  'foo_3028',
+  'foo_3029',
+  'foo_3030',
+  'foo_3031',
+  'foo_3032',
+  'foo_3033',
+  'foo_3034',
+  'foo_3035',
+  'foo_3036',
+  'foo_3037',
+  'foo_3038',
+  'foo_3039',
+  'foo_3040',
+  'foo_3041',
+  'foo_3042',
+  'foo_3043',
+  'foo_3044',
+  'foo_3045',
+  'foo_3046',
+  'foo_3047',
+  'foo_3048',
+  'foo_3049',
+  'foo_3050',
+  'foo_3051',
+  'foo_3052',
+  'foo_3053',
+  'foo_3054',
+  'foo_3055',
+  'foo_3056',
+  'foo_3057',
+  'foo_3058',
+  'foo_3059',
+  'foo_3060',
+  'foo_3061',
+  'foo_3062',
+  'foo_3063',
+  'foo_3064',
+  'foo_3065',
+  'foo_3066',
+  'foo_3067',
+  'foo_3068',
+  'foo_3069',
+  'foo_3070',
+  'foo_3071',
+  'foo_3072',
+  'foo_3073',
+  'foo_3074',
+  'foo_3075',
+  'foo_3076',
+  'foo_3077',
+  'foo_3078',
+  'foo_3079',
+  'foo_3080',
+  'foo_3081',
+  'foo_3082',
+  'foo_3083',
+  'foo_3084',
+  'foo_3085',
+  'foo_3086',
+  'foo_3087',
+  'foo_3088',
+  'foo_3089',
+  'foo_3090',
+  'foo_3091',
+  'foo_3092',
+  'foo_3093',
+  'foo_3094',
+  'foo_3095',
+  'foo_3096',
+  'foo_3097',
+  'foo_3098',
+  'foo_3099',
+  'foo_3100',
+  'foo_3101',
+  'foo_3102',
+  'foo_3103',
+  'foo_3104',
+  'foo_3105',
+  'foo_3106',
+  'foo_3107',
+  'foo_3108',
+  'foo_3109',
+  'foo_3110',
+  'foo_3111',
+  'foo_3112',
+  'foo_3113',
+  'foo_3114',
+  'foo_3115',
+  'foo_3116',
+  'foo_3117',
+  'foo_3118',
+  'foo_3119',
+  'foo_3120',
+  'foo_3121',
+  'foo_3122',
+  'foo_3123',
+  'foo_3124',
+  'foo_3125',
+  'foo_3126',
+  'foo_3127',
+  'foo_3128',
+  'foo_3129',
+  'foo_3130',
+  'foo_3131',
+  'foo_3132',
+  'foo_3133',
+  'foo_3134',
+  'foo_3135',
+  'foo_3136',
+  'foo_3137',
+  'foo_3138',
+  'foo_3139',
+  'foo_3140',
+  'foo_3141',
+  'foo_3142',
+  'foo_3143',
+  'foo_3144',
+  'foo_3145',
+  'foo_3146',
+  'foo_3147',
+  'foo_3148',
+  'foo_3149',
+  'foo_3150',
+  'foo_3151',
+  'foo_3152',
+  'foo_3153',
+  'foo_3154',
+  'foo_3155',
+  'foo_3156',
+  'foo_3157',
+  'foo_3158',
+  'foo_3159',
+  'foo_3160',
+  'foo_3161',
+  'foo_3162',
+  'foo_3163',
+  'foo_3164',
+  'foo_3165',
+  'foo_3166',
+  'foo_3167',
+  'foo_3168',
+  'foo_3169',
+  'foo_3170',
+  'foo_3171',
+  'foo_3172',
+  'foo_3173',
+  'foo_3174',
+  'foo_3175',
+  'foo_3176',
+  'foo_3177',
+  'foo_3178',
+  'foo_3179',
+  'foo_3180',
+  'foo_3181',
+  'foo_3182',
+  'foo_3183',
+  'foo_3184',
+  'foo_3185',
+  'foo_3186',
+  'foo_3187',
+  'foo_3188',
+  'foo_3189',
+  'foo_3190',
+  'foo_3191',
+  'foo_3192',
+  'foo_3193',
+  'foo_3194',
+  'foo_3195',
+  'foo_3196',
+  'foo_3197',
+  'foo_3198',
+  'foo_3199',
+  'foo_3200',
+  'foo_3201',
+  'foo_3202',
+  'foo_3203',
+  'foo_3204',
+  'foo_3205',
+  'foo_3206',
+  'foo_3207',
+  'foo_3208',
+  'foo_3209',
+  'foo_3210',
+  'foo_3211',
+  'foo_3212',
+  'foo_3213',
+  'foo_3214',
+  'foo_3215',
+  'foo_3216',
+  'foo_3217',
+  'foo_3218',
+  'foo_3219',
+  'foo_3220',
+  'foo_3221',
+  'foo_3222',
+  'foo_3223',
+  'foo_3224',
+  'foo_3225',
+  'foo_3226',
+  'foo_3227',
+  'foo_3228',
+  'foo_3229',
+  'foo_3230',
+  'foo_3231',
+  'foo_3232',
+  'foo_3233',
+  'foo_3234',
+  'foo_3235',
+  'foo_3236',
+  'foo_3237',
+  'foo_3238',
+  'foo_3239',
+  'foo_3240',
+  'foo_3241',
+  'foo_3242',
+  'foo_3243',
+  'foo_3244',
+  'foo_3245',
+  'foo_3246',
+  'foo_3247',
+  'foo_3248',
+  'foo_3249',
+  'foo_3250',
+  'foo_3251',
+  'foo_3252',
+  'foo_3253',
+  'foo_3254',
+  'foo_3255',
+  'foo_3256',
+  'foo_3257',
+  'foo_3258',
+  'foo_3259',
+  'foo_3260',
+  'foo_3261',
+  'foo_3262',
+  'foo_3263',
+  'foo_3264',
+  'foo_3265',
+  'foo_3266',
+  'foo_3267',
+  'foo_3268',
+  'foo_3269',
+  'foo_3270',
+  'foo_3271',
+  'foo_3272',
+  'foo_3273',
+  'foo_3274',
+  'foo_3275',
+  'foo_3276',
+  'foo_3277',
+  'foo_3278',
+  'foo_3279',
+  'foo_3280',
+  'foo_3281',
+  'foo_3282',
+  'foo_3283',
+  'foo_3284',
+  'foo_3285',
+  'foo_3286',
+  'foo_3287',
+  'foo_3288',
+  'foo_3289',
+  'foo_3290',
+  'foo_3291',
+  'foo_3292',
+  'foo_3293',
+  'foo_3294',
+  'foo_3295',
+  'foo_3296',
+  'foo_3297',
+  'foo_3298',
+  'foo_3299',
+  'foo_3300',
+  'foo_3301',
+  'foo_3302',
+  'foo_3303',
+  'foo_3304',
+  'foo_3305',
+  'foo_3306',
+  'foo_3307',
+  'foo_3308',
+  'foo_3309',
+  'foo_3310',
+  'foo_3311',
+  'foo_3312',
+  'foo_3313',
+  'foo_3314',
+  'foo_3315',
+  'foo_3316',
+  'foo_3317',
+  'foo_3318',
+  'foo_3319',
+  'foo_3320',
+  'foo_3321',
+  'foo_3322',
+  'foo_3323',
+  'foo_3324',
+  'foo_3325',
+  'foo_3326',
+  'foo_3327',
+  'foo_3328',
+  'foo_3329',
+  'foo_3330',
+  'foo_3331',
+  'foo_3332',
+  'foo_3333',
+  'foo_3334',
+  'foo_3335',
+  'foo_3336',
+  'foo_3337',
+  'foo_3338',
+  'foo_3339',
+  'foo_3340',
+  'foo_3341',
+  'foo_3342',
+  'foo_3343',
+  'foo_3344',
+  'foo_3345',
+  'foo_3346',
+  'foo_3347',
+  'foo_3348',
+  'foo_3349',
+  'foo_3350',
+  'foo_3351',
+  'foo_3352',
+  'foo_3353',
+  'foo_3354',
+  'foo_3355',
+  'foo_3356',
+  'foo_3357',
+  'foo_3358',
+  'foo_3359',
+  'foo_3360',
+  'foo_3361',
+  'foo_3362',
+  'foo_3363',
+  'foo_3364',
+  'foo_3365',
+  'foo_3366',
+  'foo_3367',
+  'foo_3368',
+  'foo_3369',
+  'foo_3370',
+  'foo_3371',
+  'foo_3372',
+  'foo_3373',
+  'foo_3374',
+  'foo_3375',
+  'foo_3376',
+  'foo_3377',
+  'foo_3378',
+  'foo_3379',
+  'foo_3380',
+  'foo_3381',
+  'foo_3382',
+  'foo_3383',
+  'foo_3384',
+  'foo_3385',
+  'foo_3386',
+  'foo_3387',
+  'foo_3388',
+  'foo_3389',
+  'foo_3390',
+  'foo_3391',
+  'foo_3392',
+  'foo_3393',
+  'foo_3394',
+  'foo_3395',
+  'foo_3396',
+  'foo_3397',
+  'foo_3398',
+  'foo_3399',
+  'foo_3400',
+  'foo_3401',
+  'foo_3402',
+  'foo_3403',
+  'foo_3404',
+  'foo_3405',
+  'foo_3406',
+  'foo_3407',
+  'foo_3408',
+  'foo_3409',
+  'foo_3410',
+  'foo_3411',
+  'foo_3412',
+  'foo_3413',
+  'foo_3414',
+  'foo_3415',
+  'foo_3416',
+  'foo_3417',
+  'foo_3418',
+  'foo_3419',
+  'foo_3420',
+  'foo_3421',
+  'foo_3422',
+  'foo_3423',
+  'foo_3424',
+  'foo_3425',
+  'foo_3426',
+  'foo_3427',
+  'foo_3428',
+  'foo_3429',
+  'foo_3430',
+  'foo_3431',
+  'foo_3432',
+  'foo_3433',
+  'foo_3434',
+  'foo_3435',
+  'foo_3436',
+  'foo_3437',
+  'foo_3438',
+  'foo_3439',
+  'foo_3440',
+  'foo_3441',
+  'foo_3442',
+  'foo_3443',
+  'foo_3444',
+  'foo_3445',
+  'foo_3446',
+  'foo_3447',
+  'foo_3448',
+  'foo_3449',
+  'foo_3450',
+  'foo_3451',
+  'foo_3452',
+  'foo_3453',
+  'foo_3454',
+  'foo_3455',
+  'foo_3456',
+  'foo_3457',
+  'foo_3458',
+  'foo_3459',
+  'foo_3460',
+  'foo_3461',
+  'foo_3462',
+  'foo_3463',
+  'foo_3464',
+  'foo_3465',
+  'foo_3466',
+  'foo_3467',
+  'foo_3468',
+  'foo_3469',
+  'foo_3470',
+  'foo_3471',
+  'foo_3472',
+  'foo_3473',
+  'foo_3474',
+  'foo_3475',
+  'foo_3476',
+  'foo_3477',
+  'foo_3478',
+  'foo_3479',
+  'foo_3480',
+  'foo_3481',
+  'foo_3482',
+  'foo_3483',
+  'foo_3484',
+  'foo_3485',
+  'foo_3486',
+  'foo_3487',
+  'foo_3488',
+  'foo_3489',
+  'foo_3490',
+  'foo_3491',
+  'foo_3492',
+  'foo_3493',
+  'foo_3494',
+  'foo_3495',
+  'foo_3496',
+  'foo_3497',
+  'foo_3498',
+  'foo_3499',
+  'foo_3500',
+  'foo_3501',
+  'foo_3502',
+  'foo_3503',
+  'foo_3504',
+  'foo_3505',
+  'foo_3506',
+  'foo_3507',
+  'foo_3508',
+  'foo_3509',
+  'foo_3510',
+  'foo_3511',
+  'foo_3512',
+  'foo_3513',
+  'foo_3514',
+  'foo_3515',
+  'foo_3516',
+  'foo_3517',
+  'foo_3518',
+  'foo_3519',
+  'foo_3520',
+  'foo_3521',
+  'foo_3522',
+  'foo_3523',
+  'foo_3524',
+  'foo_3525',
+  'foo_3526',
+  'foo_3527',
+  'foo_3528',
+  'foo_3529',
+  'foo_3530',
+  'foo_3531',
+  'foo_3532',
+  'foo_3533',
+  'foo_3534',
+  'foo_3535',
+  'foo_3536',
+  'foo_3537',
+  'foo_3538',
+  'foo_3539',
+  'foo_3540',
+  'foo_3541',
+  'foo_3542',
+  'foo_3543',
+  'foo_3544',
+  'foo_3545',
+  'foo_3546',
+  'foo_3547',
+  'foo_3548',
+  'foo_3549',
+  'foo_3550',
+  'foo_3551',
+  'foo_3552',
+  'foo_3553',
+  'foo_3554',
+  'foo_3555',
+  'foo_3556',
+  'foo_3557',
+  'foo_3558',
+  'foo_3559',
+  'foo_3560',
+  'foo_3561',
+  'foo_3562',
+  'foo_3563',
+  'foo_3564',
+  'foo_3565',
+  'foo_3566',
+  'foo_3567',
+  'foo_3568',
+  'foo_3569',
+  'foo_3570',
+  'foo_3571',
+  'foo_3572',
+  'foo_3573',
+  'foo_3574',
+  'foo_3575',
+  'foo_3576',
+  'foo_3577',
+  'foo_3578',
+  'foo_3579',
+  'foo_3580',
+  'foo_3581',
+  'foo_3582',
+  'foo_3583',
+  'foo_3584',
+  'foo_3585',
+  'foo_3586',
+  'foo_3587',
+  'foo_3588',
+  'foo_3589',
+  'foo_3590',
+  'foo_3591',
+  'foo_3592',
+  'foo_3593',
+  'foo_3594',
+  'foo_3595',
+  'foo_3596',
+  'foo_3597',
+  'foo_3598',
+  'foo_3599',
+  'foo_3600',
+  'foo_3601',
+  'foo_3602',
+  'foo_3603',
+  'foo_3604',
+  'foo_3605',
+  'foo_3606',
+  'foo_3607',
+  'foo_3608',
+  'foo_3609',
+  'foo_3610',
+  'foo_3611',
+  'foo_3612',
+  'foo_3613',
+  'foo_3614',
+  'foo_3615',
+  'foo_3616',
+  'foo_3617',
+  'foo_3618',
+  'foo_3619',
+  'foo_3620',
+  'foo_3621',
+  'foo_3622',
+  'foo_3623',
+  'foo_3624',
+  'foo_3625',
+  'foo_3626',
+  'foo_3627',
+  'foo_3628',
+  'foo_3629',
+  'foo_3630',
+  'foo_3631',
+  'foo_3632',
+  'foo_3633',
+  'foo_3634',
+  'foo_3635',
+  'foo_3636',
+  'foo_3637',
+  'foo_3638',
+  'foo_3639',
+  'foo_3640',
+  'foo_3641',
+  'foo_3642',
+  'foo_3643',
+  'foo_3644',
+  'foo_3645',
+  'foo_3646',
+  'foo_3647',
+  'foo_3648',
+  'foo_3649',
+  'foo_3650',
+  'foo_3651',
+  'foo_3652',
+  'foo_3653',
+  'foo_3654',
+  'foo_3655',
+  'foo_3656',
+  'foo_3657',
+  'foo_3658',
+  'foo_3659',
+  'foo_3660',
+  'foo_3661',
+  'foo_3662',
+  'foo_3663',
+  'foo_3664',
+  'foo_3665',
+  'foo_3666',
+  'foo_3667',
+  'foo_3668',
+  'foo_3669',
+  'foo_3670',
+  'foo_3671',
+  'foo_3672',
+  'foo_3673',
+  'foo_3674',
+  'foo_3675',
+  'foo_3676',
+  'foo_3677',
+  'foo_3678',
+  'foo_3679',
+  'foo_3680',
+  'foo_3681',
+  'foo_3682',
+  'foo_3683',
+  'foo_3684',
+  'foo_3685',
+  'foo_3686',
+  'foo_3687',
+  'foo_3688',
+  'foo_3689',
+  'foo_3690',
+  'foo_3691',
+  'foo_3692',
+  'foo_3693',
+  'foo_3694',
+  'foo_3695',
+  'foo_3696',
+  'foo_3697',
+  'foo_3698',
+  'foo_3699',
+  'foo_3700',
+  'foo_3701',
+  'foo_3702',
+  'foo_3703',
+  'foo_3704',
+  'foo_3705',
+  'foo_3706',
+  'foo_3707',
+  'foo_3708',
+  'foo_3709',
+  'foo_3710',
+  'foo_3711',
+  'foo_3712',
+  'foo_3713',
+  'foo_3714',
+  'foo_3715',
+  'foo_3716',
+  'foo_3717',
+  'foo_3718',
+  'foo_3719',
+  'foo_3720',
+  'foo_3721',
+  'foo_3722',
+  'foo_3723',
+  'foo_3724',
+  'foo_3725',
+  'foo_3726',
+  'foo_3727',
+  'foo_3728',
+  'foo_3729',
+  'foo_3730',
+  'foo_3731',
+  'foo_3732',
+  'foo_3733',
+  'foo_3734',
+  'foo_3735',
+  'foo_3736',
+  'foo_3737',
+  'foo_3738',
+  'foo_3739',
+  'foo_3740',
+  'foo_3741',
+  'foo_3742',
+  'foo_3743',
+  'foo_3744',
+  'foo_3745',
+  'foo_3746',
+  'foo_3747',
+  'foo_3748',
+  'foo_3749',
+  'foo_3750',
+  'foo_3751',
+  'foo_3752',
+  'foo_3753',
+  'foo_3754',
+  'foo_3755',
+  'foo_3756',
+  'foo_3757',
+  'foo_3758',
+  'foo_3759',
+  'foo_3760',
+  'foo_3761',
+  'foo_3762',
+  'foo_3763',
+  'foo_3764',
+  'foo_3765',
+  'foo_3766',
+  'foo_3767',
+  'foo_3768',
+  'foo_3769',
+  'foo_3770',
+  'foo_3771',
+  'foo_3772',
+  'foo_3773',
+  'foo_3774',
+  'foo_3775',
+  'foo_3776',
+  'foo_3777',
+  'foo_3778',
+  'foo_3779',
+  'foo_3780',
+  'foo_3781',
+  'foo_3782',
+  'foo_3783',
+  'foo_3784',
+  'foo_3785',
+  'foo_3786',
+  'foo_3787',
+  'foo_3788',
+  'foo_3789',
+  'foo_3790',
+  'foo_3791',
+  'foo_3792',
+  'foo_3793',
+  'foo_3794',
+  'foo_3795',
+  'foo_3796',
+  'foo_3797',
+  'foo_3798',
+  'foo_3799',
+  'foo_3800',
+  'foo_3801',
+  'foo_3802',
+  'foo_3803',
+  'foo_3804',
+  'foo_3805',
+  'foo_3806',
+  'foo_3807',
+  'foo_3808',
+  'foo_3809',
+  'foo_3810',
+  'foo_3811',
+  'foo_3812',
+  'foo_3813',
+  'foo_3814',
+  'foo_3815',
+  'foo_3816',
+  'foo_3817',
+  'foo_3818',
+  'foo_3819',
+  'foo_3820',
+  'foo_3821',
+  'foo_3822',
+  'foo_3823',
+  'foo_3824',
+  'foo_3825',
+  'foo_3826',
+  'foo_3827',
+  'foo_3828',
+  'foo_3829',
+  'foo_3830',
+  'foo_3831',
+  'foo_3832',
+  'foo_3833',
+  'foo_3834',
+  'foo_3835',
+  'foo_3836',
+  'foo_3837',
+  'foo_3838',
+  'foo_3839',
+  'foo_3840',
+  'foo_3841',
+  'foo_3842',
+  'foo_3843',
+  'foo_3844',
+  'foo_3845',
+  'foo_3846',
+  'foo_3847',
+  'foo_3848',
+  'foo_3849',
+  'foo_3850',
+  'foo_3851',
+  'foo_3852',
+  'foo_3853',
+  'foo_3854',
+  'foo_3855',
+  'foo_3856',
+  'foo_3857',
+  'foo_3858',
+  'foo_3859',
+  'foo_3860',
+  'foo_3861',
+  'foo_3862',
+  'foo_3863',
+  'foo_3864',
+  'foo_3865',
+  'foo_3866',
+  'foo_3867',
+  'foo_3868',
+  'foo_3869',
+  'foo_3870',
+  'foo_3871',
+  'foo_3872',
+  'foo_3873',
+  'foo_3874',
+  'foo_3875',
+  'foo_3876',
+  'foo_3877',
+  'foo_3878',
+  'foo_3879',
+  'foo_3880',
+  'foo_3881',
+  'foo_3882',
+  'foo_3883',
+  'foo_3884',
+  'foo_3885',
+  'foo_3886',
+  'foo_3887',
+  'foo_3888',
+  'foo_3889',
+  'foo_3890',
+  'foo_3891',
+  'foo_3892',
+  'foo_3893',
+  'foo_3894',
+  'foo_3895',
+  'foo_3896',
+  'foo_3897',
+  'foo_3898',
+  'foo_3899',
+  'foo_3900',
+  'foo_3901',
+  'foo_3902',
+  'foo_3903',
+  'foo_3904',
+  'foo_3905',
+  'foo_3906',
+  'foo_3907',
+  'foo_3908',
+  'foo_3909',
+  'foo_3910',
+  'foo_3911',
+  'foo_3912',
+  'foo_3913',
+  'foo_3914',
+  'foo_3915',
+  'foo_3916',
+  'foo_3917',
+  'foo_3918',
+  'foo_3919',
+  'foo_3920',
+  'foo_3921',
+  'foo_3922',
+  'foo_3923',
+  'foo_3924',
+  'foo_3925',
+  'foo_3926',
+  'foo_3927',
+  'foo_3928',
+  'foo_3929',
+  'foo_3930',
+  'foo_3931',
+  'foo_3932',
+  'foo_3933',
+  'foo_3934',
+  'foo_3935',
+  'foo_3936',
+  'foo_3937',
+  'foo_3938',
+  'foo_3939',
+  'foo_3940',
+  'foo_3941',
+  'foo_3942',
+  'foo_3943',
+  'foo_3944',
+  'foo_3945',
+  'foo_3946',
+  'foo_3947',
+  'foo_3948',
+  'foo_3949',
+  'foo_3950',
+  'foo_3951',
+  'foo_3952',
+  'foo_3953',
+  'foo_3954',
+  'foo_3955',
+  'foo_3956',
+  'foo_3957',
+  'foo_3958',
+  'foo_3959',
+  'foo_3960',
+  'foo_3961',
+  'foo_3962',
+  'foo_3963',
+  'foo_3964',
+  'foo_3965',
+  'foo_3966',
+  'foo_3967',
+  'foo_3968',
+  'foo_3969',
+  'foo_3970',
+  'foo_3971',
+  'foo_3972',
+  'foo_3973',
+  'foo_3974',
+  'foo_3975',
+  'foo_3976',
+  'foo_3977',
+  'foo_3978',
+  'foo_3979',
+  'foo_3980',
+  'foo_3981',
+  'foo_3982',
+  'foo_3983',
+  'foo_3984',
+  'foo_3985',
+  'foo_3986',
+  'foo_3987',
+  'foo_3988',
+  'foo_3989',
+  'foo_3990',
+  'foo_3991',
+  'foo_3992',
+  'foo_3993',
+  'foo_3994',
+  'foo_3995',
+  'foo_3996',
+  'foo_3997',
+  'foo_3998',
+  'foo_3999',
+  'foo_4000',
+  'foo_4001',
+  'foo_4002',
+  'foo_4003',
+  'foo_4004',
+  'foo_4005',
+  'foo_4006',
+  'foo_4007',
+  'foo_4008',
+  'foo_4009',
+  'foo_4010',
+  'foo_4011',
+  'foo_4012',
+  'foo_4013',
+  'foo_4014',
+  'foo_4015',
+  'foo_4016',
+  'foo_4017',
+  'foo_4018',
+  'foo_4019',
+  'foo_4020',
+  'foo_4021',
+  'foo_4022',
+  'foo_4023',
+  'foo_4024',
+  'foo_4025',
+  'foo_4026',
+  'foo_4027',
+  'foo_4028',
+  'foo_4029',
+  'foo_4030',
+  'foo_4031',
+  'foo_4032',
+  'foo_4033',
+  'foo_4034',
+  'foo_4035',
+  'foo_4036',
+  'foo_4037',
+  'foo_4038',
+  'foo_4039',
+  'foo_4040',
+  'foo_4041',
+  'foo_4042',
+  'foo_4043',
+  'foo_4044',
+  'foo_4045',
+  'foo_4046',
+  'foo_4047',
+  'foo_4048',
+  'foo_4049',
+  'foo_4050',
+  'foo_4051',
+  'foo_4052',
+  'foo_4053',
+  'foo_4054',
+  'foo_4055',
+  'foo_4056',
+  'foo_4057',
+  'foo_4058',
+  'foo_4059',
+  'foo_4060',
+  'foo_4061',
+  'foo_4062',
+  'foo_4063',
+  'foo_4064',
+  'foo_4065',
+  'foo_4066',
+  'foo_4067',
+  'foo_4068',
+  'foo_4069',
+  'foo_4070',
+  'foo_4071',
+  'foo_4072',
+  'foo_4073',
+  'foo_4074',
+  'foo_4075',
+  'foo_4076',
+  'foo_4077',
+  'foo_4078',
+  'foo_4079',
+  'foo_4080',
+  'foo_4081',
+  'foo_4082',
+  'foo_4083',
+  'foo_4084',
+  'foo_4085',
+  'foo_4086',
+  'foo_4087',
+  'foo_4088',
+  'foo_4089',
+  'foo_4090',
+  'foo_4091',
+  'foo_4092',
+  'foo_4093',
+  'foo_4094',
+  'foo_4095',
+  'foo_4096',
+  'foo_4097',
+  'foo_4098',
+  'foo_4099',
+  'foo_4100',
+  'foo_4101',
+  'foo_4102',
+  'foo_4103',
+  'foo_4104',
+  'foo_4105',
+  'foo_4106',
+  'foo_4107',
+  'foo_4108',
+  'foo_4109',
+  'foo_4110',
+  'foo_4111',
+  'foo_4112',
+  'foo_4113',
+  'foo_4114',
+  'foo_4115',
+  'foo_4116',
+  'foo_4117',
+  'foo_4118',
+  'foo_4119',
+  'foo_4120',
+  'foo_4121',
+  'foo_4122',
+  'foo_4123',
+  'foo_4124',
+  'foo_4125',
+  'foo_4126',
+  'foo_4127',
+  'foo_4128',
+  'foo_4129',
+  'foo_4130',
+  'foo_4131',
+  'foo_4132',
+  'foo_4133',
+  'foo_4134',
+  'foo_4135',
+  'foo_4136',
+  'foo_4137',
+  'foo_4138',
+  'foo_4139',
+  'foo_4140',
+  'foo_4141',
+  'foo_4142',
+  'foo_4143',
+  'foo_4144',
+  'foo_4145',
+  'foo_4146',
+  'foo_4147',
+  'foo_4148',
+  'foo_4149',
+  'foo_4150',
+  'foo_4151',
+  'foo_4152',
+  'foo_4153',
+  'foo_4154',
+  'foo_4155',
+  'foo_4156',
+  'foo_4157',
+  'foo_4158',
+  'foo_4159',
+  'foo_4160',
+  'foo_4161',
+  'foo_4162',
+  'foo_4163',
+  'foo_4164',
+  'foo_4165',
+  'foo_4166',
+  'foo_4167',
+  'foo_4168',
+  'foo_4169',
+  'foo_4170',
+  'foo_4171',
+  'foo_4172',
+  'foo_4173',
+  'foo_4174',
+  'foo_4175',
+  'foo_4176',
+  'foo_4177',
+  'foo_4178',
+  'foo_4179',
+  'foo_4180',
+  'foo_4181',
+  'foo_4182',
+  'foo_4183',
+  'foo_4184',
+  'foo_4185',
+  'foo_4186',
+  'foo_4187',
+  'foo_4188',
+  'foo_4189',
+  'foo_4190',
+  'foo_4191',
+  'foo_4192',
+  'foo_4193',
+  'foo_4194',
+  'foo_4195',
+  'foo_4196',
+  'foo_4197',
+  'foo_4198',
+  'foo_4199',
+  'foo_4200',
+  'foo_4201',
+  'foo_4202',
+  'foo_4203',
+  'foo_4204',
+  'foo_4205',
+  'foo_4206',
+  'foo_4207',
+  'foo_4208',
+  'foo_4209',
+  'foo_4210',
+  'foo_4211',
+  'foo_4212',
+  'foo_4213',
+  'foo_4214',
+  'foo_4215',
+  'foo_4216',
+  'foo_4217',
+  'foo_4218',
+  'foo_4219',
+  'foo_4220',
+  'foo_4221',
+  'foo_4222',
+  'foo_4223',
+  'foo_4224',
+  'foo_4225',
+  'foo_4226',
+  'foo_4227',
+  'foo_4228',
+  'foo_4229',
+  'foo_4230',
+  'foo_4231',
+  'foo_4232',
+  'foo_4233',
+  'foo_4234',
+  'foo_4235',
+  'foo_4236',
+  'foo_4237',
+  'foo_4238',
+  'foo_4239',
+  'foo_4240',
+  'foo_4241',
+  'foo_4242',
+  'foo_4243',
+  'foo_4244',
+  'foo_4245',
+  'foo_4246',
+  'foo_4247',
+  'foo_4248',
+  'foo_4249',
+  'foo_4250',
+  'foo_4251',
+  'foo_4252',
+  'foo_4253',
+  'foo_4254',
+  'foo_4255',
+  'foo_4256',
+  'foo_4257',
+  'foo_4258',
+  'foo_4259',
+  'foo_4260',
+  'foo_4261',
+  'foo_4262',
+  'foo_4263',
+  'foo_4264',
+  'foo_4265',
+  'foo_4266',
+  'foo_4267',
+  'foo_4268',
+  'foo_4269',
+  'foo_4270',
+  'foo_4271',
+  'foo_4272',
+  'foo_4273',
+  'foo_4274',
+  'foo_4275',
+  'foo_4276',
+  'foo_4277',
+  'foo_4278',
+  'foo_4279',
+  'foo_4280',
+  'foo_4281',
+  'foo_4282',
+  'foo_4283',
+  'foo_4284',
+  'foo_4285',
+  'foo_4286',
+  'foo_4287',
+  'foo_4288',
+  'foo_4289',
+  'foo_4290',
+  'foo_4291',
+  'foo_4292',
+  'foo_4293',
+  'foo_4294',
+  'foo_4295',
+  'foo_4296',
+  'foo_4297',
+  'foo_4298',
+  'foo_4299',
+  'foo_4300',
+  'foo_4301',
+  'foo_4302',
+  'foo_4303',
+  'foo_4304',
+  'foo_4305',
+  'foo_4306',
+  'foo_4307',
+  'foo_4308',
+  'foo_4309',
+  'foo_4310',
+  'foo_4311',
+  'foo_4312',
+  'foo_4313',
+  'foo_4314',
+  'foo_4315',
+  'foo_4316',
+  'foo_4317',
+  'foo_4318',
+  'foo_4319',
+  'foo_4320',
+  'foo_4321',
+  'foo_4322',
+  'foo_4323',
+  'foo_4324',
+  'foo_4325',
+  'foo_4326',
+  'foo_4327',
+  'foo_4328',
+  'foo_4329',
+  'foo_4330',
+  'foo_4331',
+  'foo_4332',
+  'foo_4333',
+  'foo_4334',
+  'foo_4335',
+  'foo_4336',
+  'foo_4337',
+  'foo_4338',
+  'foo_4339',
+  'foo_4340',
+  'foo_4341',
+  'foo_4342',
+  'foo_4343',
+  'foo_4344',
+  'foo_4345',
+  'foo_4346',
+  'foo_4347',
+  'foo_4348',
+  'foo_4349',
+  'foo_4350',
+  'foo_4351',
+  'foo_4352',
+  'foo_4353',
+  'foo_4354',
+  'foo_4355',
+  'foo_4356',
+  'foo_4357',
+  'foo_4358',
+  'foo_4359',
+  'foo_4360',
+  'foo_4361',
+  'foo_4362',
+  'foo_4363',
+  'foo_4364',
+  'foo_4365',
+  'foo_4366',
+  'foo_4367',
+  'foo_4368',
+  'foo_4369',
+  'foo_4370',
+  'foo_4371',
+  'foo_4372',
+  'foo_4373',
+  'foo_4374',
+  'foo_4375',
+  'foo_4376',
+  'foo_4377',
+  'foo_4378',
+  'foo_4379',
+  'foo_4380',
+  'foo_4381',
+  'foo_4382',
+  'foo_4383',
+  'foo_4384',
+  'foo_4385',
+  'foo_4386',
+  'foo_4387',
+  'foo_4388',
+  'foo_4389',
+  'foo_4390',
+  'foo_4391',
+  'foo_4392',
+  'foo_4393',
+  'foo_4394',
+  'foo_4395',
+  'foo_4396',
+  'foo_4397',
+  'foo_4398',
+  'foo_4399',
+  'foo_4400',
+  'foo_4401',
+  'foo_4402',
+  'foo_4403',
+  'foo_4404',
+  'foo_4405',
+  'foo_4406',
+  'foo_4407',
+  'foo_4408',
+  'foo_4409',
+  'foo_4410',
+  'foo_4411',
+  'foo_4412',
+  'foo_4413',
+  'foo_4414',
+  'foo_4415',
+  'foo_4416',
+  'foo_4417',
+  'foo_4418',
+  'foo_4419',
+  'foo_4420',
+  'foo_4421',
+  'foo_4422',
+  'foo_4423',
+  'foo_4424',
+  'foo_4425',
+  'foo_4426',
+  'foo_4427',
+  'foo_4428',
+  'foo_4429',
+  'foo_4430',
+  'foo_4431',
+  'foo_4432',
+  'foo_4433',
+  'foo_4434',
+  'foo_4435',
+  'foo_4436',
+  'foo_4437',
+  'foo_4438',
+  'foo_4439',
+  'foo_4440',
+  'foo_4441',
+  'foo_4442',
+  'foo_4443',
+  'foo_4444',
+  'foo_4445',
+  'foo_4446',
+  'foo_4447',
+  'foo_4448',
+  'foo_4449',
+  'foo_4450',
+  'foo_4451',
+  'foo_4452',
+  'foo_4453',
+  'foo_4454',
+  'foo_4455',
+  'foo_4456',
+  'foo_4457',
+  'foo_4458',
+  'foo_4459',
+  'foo_4460',
+  'foo_4461',
+  'foo_4462',
+  'foo_4463',
+  'foo_4464',
+  'foo_4465',
+  'foo_4466',
+  'foo_4467',
+  'foo_4468',
+  'foo_4469',
+  'foo_4470',
+  'foo_4471',
+  'foo_4472',
+  'foo_4473',
+  'foo_4474',
+  'foo_4475',
+  'foo_4476',
+  'foo_4477',
+  'foo_4478',
+  'foo_4479',
+  'foo_4480',
+  'foo_4481',
+  'foo_4482',
+  'foo_4483',
+  'foo_4484',
+  'foo_4485',
+  'foo_4486',
+  'foo_4487',
+  'foo_4488',
+  'foo_4489',
+  'foo_4490',
+  'foo_4491',
+  'foo_4492',
+  'foo_4493',
+  'foo_4494',
+  'foo_4495',
+  'foo_4496',
+  'foo_4497',
+  'foo_4498',
+  'foo_4499',
+  'foo_4500',
+  'foo_4501',
+  'foo_4502',
+  'foo_4503',
+  'foo_4504',
+  'foo_4505',
+  'foo_4506',
+  'foo_4507',
+  'foo_4508',
+  'foo_4509',
+  'foo_4510',
+  'foo_4511',
+  'foo_4512',
+  'foo_4513',
+  'foo_4514',
+  'foo_4515',
+  'foo_4516',
+  'foo_4517',
+  'foo_4518',
+  'foo_4519',
+  'foo_4520',
+  'foo_4521',
+  'foo_4522',
+  'foo_4523',
+  'foo_4524',
+  'foo_4525',
+  'foo_4526',
+  'foo_4527',
+  'foo_4528',
+  'foo_4529',
+  'foo_4530',
+  'foo_4531',
+  'foo_4532',
+  'foo_4533',
+  'foo_4534',
+  'foo_4535',
+  'foo_4536',
+  'foo_4537',
+  'foo_4538',
+  'foo_4539',
+  'foo_4540',
+  'foo_4541',
+  'foo_4542',
+  'foo_4543',
+  'foo_4544',
+  'foo_4545',
+  'foo_4546',
+  'foo_4547',
+  'foo_4548',
+  'foo_4549',
+  'foo_4550',
+  'foo_4551',
+  'foo_4552',
+  'foo_4553',
+  'foo_4554',
+  'foo_4555',
+  'foo_4556',
+  'foo_4557',
+  'foo_4558',
+  'foo_4559',
+  'foo_4560',
+  'foo_4561',
+  'foo_4562',
+  'foo_4563',
+  'foo_4564',
+  'foo_4565',
+  'foo_4566',
+  'foo_4567',
+  'foo_4568',
+  'foo_4569',
+  'foo_4570',
+  'foo_4571',
+  'foo_4572',
+  'foo_4573',
+  'foo_4574',
+  'foo_4575',
+  'foo_4576',
+  'foo_4577',
+  'foo_4578',
+  'foo_4579',
+  'foo_4580',
+  'foo_4581',
+  'foo_4582',
+  'foo_4583',
+  'foo_4584',
+  'foo_4585',
+  'foo_4586',
+  'foo_4587',
+  'foo_4588',
+  'foo_4589',
+  'foo_4590',
+  'foo_4591',
+  'foo_4592',
+  'foo_4593',
+  'foo_4594',
+  'foo_4595',
+  'foo_4596',
+  'foo_4597',
+  'foo_4598',
+  'foo_4599',
+  'foo_4600',
+  'foo_4601',
+  'foo_4602',
+  'foo_4603',
+  'foo_4604',
+  'foo_4605',
+  'foo_4606',
+  'foo_4607',
+  'foo_4608',
+  'foo_4609',
+  'foo_4610',
+  'foo_4611',
+  'foo_4612',
+  'foo_4613',
+  'foo_4614',
+  'foo_4615',
+  'foo_4616',
+  'foo_4617',
+  'foo_4618',
+  'foo_4619',
+  'foo_4620',
+  'foo_4621',
+  'foo_4622',
+  'foo_4623',
+  'foo_4624',
+  'foo_4625',
+  'foo_4626',
+  'foo_4627',
+  'foo_4628',
+  'foo_4629',
+  'foo_4630',
+  'foo_4631',
+  'foo_4632',
+  'foo_4633',
+  'foo_4634',
+  'foo_4635',
+  'foo_4636',
+  'foo_4637',
+  'foo_4638',
+  'foo_4639',
+  'foo_4640',
+  'foo_4641',
+  'foo_4642',
+  'foo_4643',
+  'foo_4644',
+  'foo_4645',
+  'foo_4646',
+  'foo_4647',
+  'foo_4648',
+  'foo_4649',
+  'foo_4650',
+  'foo_4651',
+  'foo_4652',
+  'foo_4653',
+  'foo_4654',
+  'foo_4655',
+  'foo_4656',
+  'foo_4657',
+  'foo_4658',
+  'foo_4659',
+  'foo_4660',
+  'foo_4661',
+  'foo_4662',
+  'foo_4663',
+  'foo_4664',
+  'foo_4665',
+  'foo_4666',
+  'foo_4667',
+  'foo_4668',
+  'foo_4669',
+  'foo_4670',
+  'foo_4671',
+  'foo_4672',
+  'foo_4673',
+  'foo_4674',
+  'foo_4675',
+  'foo_4676',
+  'foo_4677',
+  'foo_4678',
+  'foo_4679',
+  'foo_4680',
+  'foo_4681',
+  'foo_4682',
+  'foo_4683',
+  'foo_4684',
+  'foo_4685',
+  'foo_4686',
+  'foo_4687',
+  'foo_4688',
+  'foo_4689',
+  'foo_4690',
+  'foo_4691',
+  'foo_4692',
+  'foo_4693',
+  'foo_4694',
+  'foo_4695',
+  'foo_4696',
+  'foo_4697',
+  'foo_4698',
+  'foo_4699',
+  'foo_4700',
+  'foo_4701',
+  'foo_4702',
+  'foo_4703',
+  'foo_4704',
+  'foo_4705',
+  'foo_4706',
+  'foo_4707',
+  'foo_4708',
+  'foo_4709',
+  'foo_4710',
+  'foo_4711',
+  'foo_4712',
+  'foo_4713',
+  'foo_4714',
+  'foo_4715',
+  'foo_4716',
+  'foo_4717',
+  'foo_4718',
+  'foo_4719',
+  'foo_4720',
+  'foo_4721',
+  'foo_4722',
+  'foo_4723',
+  'foo_4724',
+  'foo_4725',
+  'foo_4726',
+  'foo_4727',
+  'foo_4728',
+  'foo_4729',
+  'foo_4730',
+  'foo_4731',
+  'foo_4732',
+  'foo_4733',
+  'foo_4734',
+  'foo_4735',
+  'foo_4736',
+  'foo_4737',
+  'foo_4738',
+  'foo_4739',
+  'foo_4740',
+  'foo_4741',
+  'foo_4742',
+  'foo_4743',
+  'foo_4744',
+  'foo_4745',
+  'foo_4746',
+  'foo_4747',
+  'foo_4748',
+  'foo_4749',
+  'foo_4750',
+  'foo_4751',
+  'foo_4752',
+  'foo_4753',
+  'foo_4754',
+  'foo_4755',
+  'foo_4756',
+  'foo_4757',
+  'foo_4758',
+  'foo_4759',
+  'foo_4760',
+  'foo_4761',
+  'foo_4762',
+  'foo_4763',
+  'foo_4764',
+  'foo_4765',
+  'foo_4766',
+  'foo_4767',
+  'foo_4768',
+  'foo_4769',
+  'foo_4770',
+  'foo_4771',
+  'foo_4772',
+  'foo_4773',
+  'foo_4774',
+  'foo_4775',
+  'foo_4776',
+  'foo_4777',
+  'foo_4778',
+  'foo_4779',
+  'foo_4780',
+  'foo_4781',
+  'foo_4782',
+  'foo_4783',
+  'foo_4784',
+  'foo_4785',
+  'foo_4786',
+  'foo_4787',
+  'foo_4788',
+  'foo_4789',
+  'foo_4790',
+  'foo_4791',
+  'foo_4792',
+  'foo_4793',
+  'foo_4794',
+  'foo_4795',
+  'foo_4796',
+  'foo_4797',
+  'foo_4798',
+  'foo_4799',
+  'foo_4800',
+  'foo_4801',
+  'foo_4802',
+  'foo_4803',
+  'foo_4804',
+  'foo_4805',
+  'foo_4806',
+  'foo_4807',
+  'foo_4808',
+  'foo_4809',
+  'foo_4810',
+  'foo_4811',
+  'foo_4812',
+  'foo_4813',
+  'foo_4814',
+  'foo_4815',
+  'foo_4816',
+  'foo_4817',
+  'foo_4818',
+  'foo_4819',
+  'foo_4820',
+  'foo_4821',
+  'foo_4822',
+  'foo_4823',
+  'foo_4824',
+  'foo_4825',
+  'foo_4826',
+  'foo_4827',
+  'foo_4828',
+  'foo_4829',
+  'foo_4830',
+  'foo_4831',
+  'foo_4832',
+  'foo_4833',
+  'foo_4834',
+  'foo_4835',
+  'foo_4836',
+  'foo_4837',
+  'foo_4838',
+  'foo_4839',
+  'foo_4840',
+  'foo_4841',
+  'foo_4842',
+  'foo_4843',
+  'foo_4844',
+  'foo_4845',
+  'foo_4846',
+  'foo_4847',
+  'foo_4848',
+  'foo_4849',
+  'foo_4850',
+  'foo_4851',
+  'foo_4852',
+  'foo_4853',
+  'foo_4854',
+  'foo_4855',
+  'foo_4856',
+  'foo_4857',
+  'foo_4858',
+  'foo_4859',
+  'foo_4860',
+  'foo_4861',
+  'foo_4862',
+  'foo_4863',
+  'foo_4864',
+  'foo_4865',
+  'foo_4866',
+  'foo_4867',
+  'foo_4868',
+  'foo_4869',
+  'foo_4870',
+  'foo_4871',
+  'foo_4872',
+  'foo_4873',
+  'foo_4874',
+  'foo_4875',
+  'foo_4876',
+  'foo_4877',
+  'foo_4878',
+  'foo_4879',
+  'foo_4880',
+  'foo_4881',
+  'foo_4882',
+  'foo_4883',
+  'foo_4884',
+  'foo_4885',
+  'foo_4886',
+  'foo_4887',
+  'foo_4888',
+  'foo_4889',
+  'foo_4890',
+  'foo_4891',
+  'foo_4892',
+  'foo_4893',
+  'foo_4894',
+  'foo_4895',
+  'foo_4896',
+  'foo_4897',
+  'foo_4898',
+  'foo_4899',
+  'foo_4900',
+  'foo_4901',
+  'foo_4902',
+  'foo_4903',
+  'foo_4904',
+  'foo_4905',
+  'foo_4906',
+  'foo_4907',
+  'foo_4908',
+  'foo_4909',
+  'foo_4910',
+  'foo_4911',
+  'foo_4912',
+  'foo_4913',
+  'foo_4914',
+  'foo_4915',
+  'foo_4916',
+  'foo_4917',
+  'foo_4918',
+  'foo_4919',
+  'foo_4920',
+  'foo_4921',
+  'foo_4922',
+  'foo_4923',
+  'foo_4924',
+  'foo_4925',
+  'foo_4926',
+  'foo_4927',
+  'foo_4928',
+  'foo_4929',
+  'foo_4930',
+  'foo_4931',
+  'foo_4932',
+  'foo_4933',
+  'foo_4934',
+  'foo_4935',
+  'foo_4936',
+  'foo_4937',
+  'foo_4938',
+  'foo_4939',
+  'foo_4940',
+  'foo_4941',
+  'foo_4942',
+  'foo_4943',
+  'foo_4944',
+  'foo_4945',
+  'foo_4946',
+  'foo_4947',
+  'foo_4948',
+  'foo_4949',
+  'foo_4950',
+  'foo_4951',
+  'foo_4952',
+  'foo_4953',
+  'foo_4954',
+  'foo_4955',
+  'foo_4956',
+  'foo_4957',
+  'foo_4958',
+  'foo_4959',
+  'foo_4960',
+  'foo_4961',
+  'foo_4962',
+  'foo_4963',
+  'foo_4964',
+  'foo_4965',
+  'foo_4966',
+  'foo_4967',
+  'foo_4968',
+  'foo_4969',
+  'foo_4970',
+  'foo_4971',
+  'foo_4972',
+  'foo_4973',
+  'foo_4974',
+  'foo_4975',
+  'foo_4976',
+  'foo_4977',
+  'foo_4978',
+  'foo_4979',
+  'foo_4980',
+  'foo_4981',
+  'foo_4982',
+  'foo_4983',
+  'foo_4984',
+  'foo_4985',
+  'foo_4986',
+  'foo_4987',
+  'foo_4988',
+  'foo_4989',
+  'foo_4990',
+  'foo_4991',
+  'foo_4992',
+  'foo_4993',
+  'foo_4994',
+  'foo_4995',
+  'foo_4996',
+  'foo_4997',
+  'foo_4998',
+  'foo_4999',
+  'foo_5000',
+  'foo_5001',
+  'foo_5002',
+  'foo_5003',
+  'foo_5004',
+  'foo_5005',
+  'foo_5006',
+  'foo_5007',
+  'foo_5008',
+  'foo_5009',
+  'foo_5010',
+  'foo_5011',
+  'foo_5012',
+  'foo_5013',
+  'foo_5014',
+  'foo_5015',
+  'foo_5016',
+  'foo_5017',
+  'foo_5018',
+  'foo_5019',
+  'foo_5020',
+  'foo_5021',
+  'foo_5022',
+  'foo_5023',
+  'foo_5024',
+  'foo_5025',
+  'foo_5026',
+  'foo_5027',
+  'foo_5028',
+  'foo_5029',
+  'foo_5030',
+  'foo_5031',
+  'foo_5032',
+  'foo_5033',
+  'foo_5034',
+  'foo_5035',
+  'foo_5036',
+  'foo_5037',
+  'foo_5038',
+  'foo_5039',
+  'foo_5040',
+  'foo_5041',
+  'foo_5042',
+  'foo_5043',
+  'foo_5044',
+  'foo_5045',
+  'foo_5046',
+  'foo_5047',
+  'foo_5048',
+  'foo_5049',
+  'foo_5050',
+  'foo_5051',
+  'foo_5052',
+  'foo_5053',
+  'foo_5054',
+  'foo_5055',
+  'foo_5056',
+  'foo_5057',
+  'foo_5058',
+  'foo_5059',
+  'foo_5060',
+  'foo_5061',
+  'foo_5062',
+  'foo_5063',
+  'foo_5064',
+  'foo_5065',
+  'foo_5066',
+  'foo_5067',
+  'foo_5068',
+  'foo_5069',
+  'foo_5070',
+  'foo_5071',
+  'foo_5072',
+  'foo_5073',
+  'foo_5074',
+  'foo_5075',
+  'foo_5076',
+  'foo_5077',
+  'foo_5078',
+  'foo_5079',
+  'foo_5080',
+  'foo_5081',
+  'foo_5082',
+  'foo_5083',
+  'foo_5084',
+  'foo_5085',
+  'foo_5086',
+  'foo_5087',
+  'foo_5088',
+  'foo_5089',
+  'foo_5090',
+  'foo_5091',
+  'foo_5092',
+  'foo_5093',
+  'foo_5094',
+  'foo_5095',
+  'foo_5096',
+  'foo_5097',
+  'foo_5098',
+  'foo_5099',
+  'foo_5100',
+  'foo_5101',
+  'foo_5102',
+  'foo_5103',
+  'foo_5104',
+  'foo_5105',
+  'foo_5106',
+  'foo_5107',
+  'foo_5108',
+  'foo_5109',
+  'foo_5110',
+  'foo_5111',
+  'foo_5112',
+  'foo_5113',
+  'foo_5114',
+  'foo_5115',
+  'foo_5116',
+  'foo_5117',
+  'foo_5118',
+  'foo_5119',
+  'foo_5120',
+  'foo_5121',
+  'foo_5122',
+  'foo_5123',
+  'foo_5124',
+  'foo_5125',
+  'foo_5126',
+  'foo_5127',
+  'foo_5128',
+  'foo_5129',
+  'foo_5130',
+  'foo_5131',
+  'foo_5132',
+  'foo_5133',
+  'foo_5134',
+  'foo_5135',
+  'foo_5136',
+  'foo_5137',
+  'foo_5138',
+  'foo_5139',
+  'foo_5140',
+  'foo_5141',
+  'foo_5142',
+  'foo_5143',
+  'foo_5144',
+  'foo_5145',
+  'foo_5146',
+  'foo_5147',
+  'foo_5148',
+  'foo_5149',
+  'foo_5150',
+  'foo_5151',
+  'foo_5152',
+  'foo_5153',
+  'foo_5154',
+  'foo_5155',
+  'foo_5156',
+  'foo_5157',
+  'foo_5158',
+  'foo_5159',
+  'foo_5160',
+  'foo_5161',
+  'foo_5162',
+  'foo_5163',
+  'foo_5164',
+  'foo_5165',
+  'foo_5166',
+  'foo_5167',
+  'foo_5168',
+  'foo_5169',
+  'foo_5170',
+  'foo_5171',
+  'foo_5172',
+  'foo_5173',
+  'foo_5174',
+  'foo_5175',
+  'foo_5176',
+  'foo_5177',
+  'foo_5178',
+  'foo_5179',
+  'foo_5180',
+  'foo_5181',
+  'foo_5182',
+  'foo_5183',
+  'foo_5184',
+  'foo_5185',
+  'foo_5186',
+  'foo_5187',
+  'foo_5188',
+  'foo_5189',
+  'foo_5190',
+  'foo_5191',
+  'foo_5192',
+  'foo_5193',
+  'foo_5194',
+  'foo_5195',
+  'foo_5196',
+  'foo_5197',
+  'foo_5198',
+  'foo_5199',
+  'foo_5200',
+  'foo_5201',
+  'foo_5202',
+  'foo_5203',
+  'foo_5204',
+  'foo_5205',
+  'foo_5206',
+  'foo_5207',
+  'foo_5208',
+  'foo_5209',
+  'foo_5210',
+  'foo_5211',
+  'foo_5212',
+  'foo_5213',
+  'foo_5214',
+  'foo_5215',
+  'foo_5216',
+  'foo_5217',
+  'foo_5218',
+  'foo_5219',
+  'foo_5220',
+  'foo_5221',
+  'foo_5222',
+  'foo_5223',
+  'foo_5224',
+  'foo_5225',
+  'foo_5226',
+  'foo_5227',
+  'foo_5228',
+  'foo_5229',
+  'foo_5230',
+  'foo_5231',
+  'foo_5232',
+  'foo_5233',
+  'foo_5234',
+  'foo_5235',
+  'foo_5236',
+  'foo_5237',
+  'foo_5238',
+  'foo_5239',
+  'foo_5240',
+  'foo_5241',
+  'foo_5242',
+  'foo_5243',
+  'foo_5244',
+  'foo_5245',
+  'foo_5246',
+  'foo_5247',
+  'foo_5248',
+  'foo_5249',
+  'foo_5250',
+  'foo_5251',
+  'foo_5252',
+  'foo_5253',
+  'foo_5254',
+  'foo_5255',
+  'foo_5256',
+  'foo_5257',
+  'foo_5258',
+  'foo_5259',
+  'foo_5260',
+  'foo_5261',
+  'foo_5262',
+  'foo_5263',
+  'foo_5264',
+  'foo_5265',
+  'foo_5266',
+  'foo_5267',
+  'foo_5268',
+  'foo_5269',
+  'foo_5270',
+  'foo_5271',
+  'foo_5272',
+  'foo_5273',
+  'foo_5274',
+  'foo_5275',
+  'foo_5276',
+  'foo_5277',
+  'foo_5278',
+  'foo_5279',
+  'foo_5280',
+  'foo_5281',
+  'foo_5282',
+  'foo_5283',
+  'foo_5284',
+  'foo_5285',
+  'foo_5286',
+  'foo_5287',
+  'foo_5288',
+  'foo_5289',
+  'foo_5290',
+  'foo_5291',
+  'foo_5292',
+  'foo_5293',
+  'foo_5294',
+  'foo_5295',
+  'foo_5296',
+  'foo_5297',
+  'foo_5298',
+  'foo_5299',
+  'foo_5300',
+  'foo_5301',
+  'foo_5302',
+  'foo_5303',
+  'foo_5304',
+  'foo_5305',
+  'foo_5306',
+  'foo_5307',
+  'foo_5308',
+  'foo_5309',
+  'foo_5310',
+  'foo_5311',
+  'foo_5312',
+  'foo_5313',
+  'foo_5314',
+  'foo_5315',
+  'foo_5316',
+  'foo_5317',
+  'foo_5318',
+  'foo_5319',
+  'foo_5320',
+  'foo_5321',
+  'foo_5322',
+  'foo_5323',
+  'foo_5324',
+  'foo_5325',
+  'foo_5326',
+  'foo_5327',
+  'foo_5328',
+  'foo_5329',
+  'foo_5330',
+  'foo_5331',
+  'foo_5332',
+  'foo_5333',
+  'foo_5334',
+  'foo_5335',
+  'foo_5336',
+  'foo_5337',
+  'foo_5338',
+  'foo_5339',
+  'foo_5340',
+  'foo_5341',
+  'foo_5342',
+  'foo_5343',
+  'foo_5344',
+  'foo_5345',
+  'foo_5346',
+  'foo_5347',
+  'foo_5348',
+  'foo_5349',
+  'foo_5350',
+  'foo_5351',
+  'foo_5352',
+  'foo_5353',
+  'foo_5354',
+  'foo_5355',
+  'foo_5356',
+  'foo_5357',
+  'foo_5358',
+  'foo_5359',
+  'foo_5360',
+  'foo_5361',
+  'foo_5362',
+  'foo_5363',
+  'foo_5364',
+  'foo_5365',
+  'foo_5366',
+  'foo_5367',
+  'foo_5368',
+  'foo_5369',
+  'foo_5370',
+  'foo_5371',
+  'foo_5372',
+  'foo_5373',
+  'foo_5374',
+  'foo_5375',
+  'foo_5376',
+  'foo_5377',
+  'foo_5378',
+  'foo_5379',
+  'foo_5380',
+  'foo_5381',
+  'foo_5382',
+  'foo_5383',
+  'foo_5384',
+  'foo_5385',
+  'foo_5386',
+  'foo_5387',
+  'foo_5388',
+  'foo_5389',
+  'foo_5390',
+  'foo_5391',
+  'foo_5392',
+  'foo_5393',
+  'foo_5394',
+  'foo_5395',
+  'foo_5396',
+  'foo_5397',
+  'foo_5398',
+  'foo_5399',
+  'foo_5400',
+  'foo_5401',
+  'foo_5402',
+  'foo_5403',
+  'foo_5404',
+  'foo_5405',
+  'foo_5406',
+  'foo_5407',
+  'foo_5408',
+  'foo_5409',
+  'foo_5410',
+  'foo_5411',
+  'foo_5412',
+  'foo_5413',
+  'foo_5414',
+  'foo_5415',
+  'foo_5416',
+  'foo_5417',
+  'foo_5418',
+  'foo_5419',
+  'foo_5420',
+  'foo_5421',
+  'foo_5422',
+  'foo_5423',
+  'foo_5424',
+  'foo_5425',
+  'foo_5426',
+  'foo_5427',
+  'foo_5428',
+  'foo_5429',
+  'foo_5430',
+  'foo_5431',
+  'foo_5432',
+  'foo_5433',
+  'foo_5434',
+  'foo_5435',
+  'foo_5436',
+  'foo_5437',
+  'foo_5438',
+  'foo_5439',
+  'foo_5440',
+  'foo_5441',
+  'foo_5442',
+  'foo_5443',
+  'foo_5444',
+  'foo_5445',
+  'foo_5446',
+  'foo_5447',
+  'foo_5448',
+  'foo_5449',
+  'foo_5450',
+  'foo_5451',
+  'foo_5452',
+  'foo_5453',
+  'foo_5454',
+  'foo_5455',
+  'foo_5456',
+  'foo_5457',
+  'foo_5458',
+  'foo_5459',
+  'foo_5460',
+  'foo_5461',
+  'foo_5462',
+  'foo_5463',
+  'foo_5464',
+  'foo_5465',
+  'foo_5466',
+  'foo_5467',
+  'foo_5468',
+  'foo_5469',
+  'foo_5470',
+  'foo_5471',
+  'foo_5472',
+  'foo_5473',
+  'foo_5474',
+  'foo_5475',
+  'foo_5476',
+  'foo_5477',
+  'foo_5478',
+  'foo_5479',
+  'foo_5480',
+  'foo_5481',
+  'foo_5482',
+  'foo_5483',
+  'foo_5484',
+  'foo_5485',
+  'foo_5486',
+  'foo_5487',
+  'foo_5488',
+  'foo_5489',
+  'foo_5490',
+  'foo_5491',
+  'foo_5492',
+  'foo_5493',
+  'foo_5494',
+  'foo_5495',
+  'foo_5496',
+  'foo_5497',
+  'foo_5498',
+  'foo_5499',
+  'foo_5500',
+  'foo_5501',
+  'foo_5502',
+  'foo_5503',
+  'foo_5504',
+  'foo_5505',
+  'foo_5506',
+  'foo_5507',
+  'foo_5508',
+  'foo_5509',
+  'foo_5510',
+  'foo_5511',
+  'foo_5512',
+  'foo_5513',
+  'foo_5514',
+  'foo_5515',
+  'foo_5516',
+  'foo_5517',
+  'foo_5518',
+  'foo_5519',
+  'foo_5520',
+  'foo_5521',
+  'foo_5522',
+  'foo_5523',
+  'foo_5524',
+  'foo_5525',
+  'foo_5526',
+  'foo_5527',
+  'foo_5528',
+  'foo_5529',
+  'foo_5530',
+  'foo_5531',
+  'foo_5532',
+  'foo_5533',
+  'foo_5534',
+  'foo_5535',
+  'foo_5536',
+  'foo_5537',
+  'foo_5538',
+  'foo_5539',
+  'foo_5540',
+  'foo_5541',
+  'foo_5542',
+  'foo_5543',
+  'foo_5544',
+  'foo_5545',
+  'foo_5546',
+  'foo_5547',
+  'foo_5548',
+  'foo_5549',
+  'foo_5550',
+  'foo_5551',
+  'foo_5552',
+  'foo_5553',
+  'foo_5554',
+  'foo_5555',
+  'foo_5556',
+  'foo_5557',
+  'foo_5558',
+  'foo_5559',
+  'foo_5560',
+  'foo_5561',
+  'foo_5562',
+  'foo_5563',
+  'foo_5564',
+  'foo_5565',
+  'foo_5566',
+  'foo_5567',
+  'foo_5568',
+  'foo_5569',
+  'foo_5570',
+  'foo_5571',
+  'foo_5572',
+  'foo_5573',
+  'foo_5574',
+  'foo_5575',
+  'foo_5576',
+  'foo_5577',
+  'foo_5578',
+  'foo_5579',
+  'foo_5580',
+  'foo_5581',
+  'foo_5582',
+  'foo_5583',
+  'foo_5584',
+  'foo_5585',
+  'foo_5586',
+  'foo_5587',
+  'foo_5588',
+  'foo_5589',
+  'foo_5590',
+  'foo_5591',
+  'foo_5592',
+  'foo_5593',
+  'foo_5594',
+  'foo_5595',
+  'foo_5596',
+  'foo_5597',
+  'foo_5598',
+  'foo_5599',
+  'foo_5600',
+  'foo_5601',
+  'foo_5602',
+  'foo_5603',
+  'foo_5604',
+  'foo_5605',
+  'foo_5606',
+  'foo_5607',
+  'foo_5608',
+  'foo_5609',
+  'foo_5610',
+  'foo_5611',
+  'foo_5612',
+  'foo_5613',
+  'foo_5614',
+  'foo_5615',
+  'foo_5616',
+  'foo_5617',
+  'foo_5618',
+  'foo_5619',
+  'foo_5620',
+  'foo_5621',
+  'foo_5622',
+  'foo_5623',
+  'foo_5624',
+  'foo_5625',
+  'foo_5626',
+  'foo_5627',
+  'foo_5628',
+  'foo_5629',
+  'foo_5630',
+  'foo_5631',
+  'foo_5632',
+  'foo_5633',
+  'foo_5634',
+  'foo_5635',
+  'foo_5636',
+  'foo_5637',
+  'foo_5638',
+  'foo_5639',
+  'foo_5640',
+  'foo_5641',
+  'foo_5642',
+  'foo_5643',
+  'foo_5644',
+  'foo_5645',
+  'foo_5646',
+  'foo_5647',
+  'foo_5648',
+  'foo_5649',
+  'foo_5650',
+  'foo_5651',
+  'foo_5652',
+  'foo_5653',
+  'foo_5654',
+  'foo_5655',
+  'foo_5656',
+  'foo_5657',
+  'foo_5658',
+  'foo_5659',
+  'foo_5660',
+  'foo_5661',
+  'foo_5662',
+  'foo_5663',
+  'foo_5664',
+  'foo_5665',
+  'foo_5666',
+  'foo_5667',
+  'foo_5668',
+  'foo_5669',
+  'foo_5670',
+  'foo_5671',
+  'foo_5672',
+  'foo_5673',
+  'foo_5674',
+  'foo_5675',
+  'foo_5676',
+  'foo_5677',
+  'foo_5678',
+  'foo_5679',
+  'foo_5680',
+  'foo_5681',
+  'foo_5682',
+  'foo_5683',
+  'foo_5684',
+  'foo_5685',
+  'foo_5686',
+  'foo_5687',
+  'foo_5688',
+  'foo_5689',
+  'foo_5690',
+  'foo_5691',
+  'foo_5692',
+  'foo_5693',
+  'foo_5694',
+  'foo_5695',
+  'foo_5696',
+  'foo_5697',
+  'foo_5698',
+  'foo_5699',
+  'foo_5700',
+  'foo_5701',
+  'foo_5702',
+  'foo_5703',
+  'foo_5704',
+  'foo_5705',
+  'foo_5706',
+  'foo_5707',
+  'foo_5708',
+  'foo_5709',
+  'foo_5710',
+  'foo_5711',
+  'foo_5712',
+  'foo_5713',
+  'foo_5714',
+  'foo_5715',
+  'foo_5716',
+  'foo_5717',
+  'foo_5718',
+  'foo_5719',
+  'foo_5720',
+  'foo_5721',
+  'foo_5722',
+  'foo_5723',
+  'foo_5724',
+  'foo_5725',
+  'foo_5726',
+  'foo_5727',
+  'foo_5728',
+  'foo_5729',
+  'foo_5730',
+  'foo_5731',
+  'foo_5732',
+  'foo_5733',
+  'foo_5734',
+  'foo_5735',
+  'foo_5736',
+  'foo_5737',
+  'foo_5738',
+  'foo_5739',
+  'foo_5740',
+  'foo_5741',
+  'foo_5742',
+  'foo_5743',
+  'foo_5744',
+  'foo_5745',
+  'foo_5746',
+  'foo_5747',
+  'foo_5748',
+  'foo_5749',
+  'foo_5750',
+  'foo_5751',
+  'foo_5752',
+  'foo_5753',
+  'foo_5754',
+  'foo_5755',
+  'foo_5756',
+  'foo_5757',
+  'foo_5758',
+  'foo_5759',
+  'foo_5760',
+  'foo_5761',
+  'foo_5762',
+  'foo_5763',
+  'foo_5764',
+  'foo_5765',
+  'foo_5766',
+  'foo_5767',
+  'foo_5768',
+  'foo_5769',
+  'foo_5770',
+  'foo_5771',
+  'foo_5772',
+  'foo_5773',
+  'foo_5774',
+  'foo_5775',
+  'foo_5776',
+  'foo_5777',
+  'foo_5778',
+  'foo_5779',
+  'foo_5780',
+  'foo_5781',
+  'foo_5782',
+  'foo_5783',
+  'foo_5784',
+  'foo_5785',
+  'foo_5786',
+  'foo_5787',
+  'foo_5788',
+  'foo_5789',
+  'foo_5790',
+  'foo_5791',
+  'foo_5792',
+  'foo_5793',
+  'foo_5794',
+  'foo_5795',
+  'foo_5796',
+  'foo_5797',
+  'foo_5798',
+  'foo_5799',
+  'foo_5800',
+  'foo_5801',
+  'foo_5802',
+  'foo_5803',
+  'foo_5804',
+  'foo_5805',
+  'foo_5806',
+  'foo_5807',
+  'foo_5808',
+  'foo_5809',
+  'foo_5810',
+  'foo_5811',
+  'foo_5812',
+  'foo_5813',
+  'foo_5814',
+  'foo_5815',
+  'foo_5816',
+  'foo_5817',
+  'foo_5818',
+  'foo_5819',
+  'foo_5820',
+  'foo_5821',
+  'foo_5822',
+  'foo_5823',
+  'foo_5824',
+  'foo_5825',
+  'foo_5826',
+  'foo_5827',
+  'foo_5828',
+  'foo_5829',
+  'foo_5830',
+  'foo_5831',
+  'foo_5832',
+  'foo_5833',
+  'foo_5834',
+  'foo_5835',
+  'foo_5836',
+  'foo_5837',
+  'foo_5838',
+  'foo_5839',
+  'foo_5840',
+  'foo_5841',
+  'foo_5842',
+  'foo_5843',
+  'foo_5844',
+  'foo_5845',
+  'foo_5846',
+  'foo_5847',
+  'foo_5848',
+  'foo_5849',
+  'foo_5850',
+  'foo_5851',
+  'foo_5852',
+  'foo_5853',
+  'foo_5854',
+  'foo_5855',
+  'foo_5856',
+  'foo_5857',
+  'foo_5858',
+  'foo_5859',
+  'foo_5860',
+  'foo_5861',
+  'foo_5862',
+  'foo_5863',
+  'foo_5864',
+  'foo_5865',
+  'foo_5866',
+  'foo_5867',
+  'foo_5868',
+  'foo_5869',
+  'foo_5870',
+  'foo_5871',
+  'foo_5872',
+  'foo_5873',
+  'foo_5874',
+  'foo_5875',
+  'foo_5876',
+  'foo_5877',
+  'foo_5878',
+  'foo_5879',
+  'foo_5880',
+  'foo_5881',
+  'foo_5882',
+  'foo_5883',
+  'foo_5884',
+  'foo_5885',
+  'foo_5886',
+  'foo_5887',
+  'foo_5888',
+  'foo_5889',
+  'foo_5890',
+  'foo_5891',
+  'foo_5892',
+  'foo_5893',
+  'foo_5894',
+  'foo_5895',
+  'foo_5896',
+  'foo_5897',
+  'foo_5898',
+  'foo_5899',
+  'foo_5900',
+  'foo_5901',
+  'foo_5902',
+  'foo_5903',
+  'foo_5904',
+  'foo_5905',
+  'foo_5906',
+  'foo_5907',
+  'foo_5908',
+  'foo_5909',
+  'foo_5910',
+  'foo_5911',
+  'foo_5912',
+  'foo_5913',
+  'foo_5914',
+  'foo_5915',
+  'foo_5916',
+  'foo_5917',
+  'foo_5918',
+  'foo_5919',
+  'foo_5920',
+  'foo_5921',
+  'foo_5922',
+  'foo_5923',
+  'foo_5924',
+  'foo_5925',
+  'foo_5926',
+  'foo_5927',
+  'foo_5928',
+  'foo_5929',
+  'foo_5930',
+  'foo_5931',
+  'foo_5932',
+  'foo_5933',
+  'foo_5934',
+  'foo_5935',
+  'foo_5936',
+  'foo_5937',
+  'foo_5938',
+  'foo_5939',
+  'foo_5940',
+  'foo_5941',
+  'foo_5942',
+  'foo_5943',
+  'foo_5944',
+  'foo_5945',
+  'foo_5946',
+  'foo_5947',
+  'foo_5948',
+  'foo_5949',
+  'foo_5950',
+  'foo_5951',
+  'foo_5952',
+  'foo_5953',
+  'foo_5954',
+  'foo_5955',
+  'foo_5956',
+  'foo_5957',
+  'foo_5958',
+  'foo_5959',
+  'foo_5960',
+  'foo_5961',
+  'foo_5962',
+  'foo_5963',
+  'foo_5964',
+  'foo_5965',
+  'foo_5966',
+  'foo_5967',
+  'foo_5968',
+  'foo_5969',
+  'foo_5970',
+  'foo_5971',
+  'foo_5972',
+  'foo_5973',
+  'foo_5974',
+  'foo_5975',
+  'foo_5976',
+  'foo_5977',
+  'foo_5978',
+  'foo_5979',
+  'foo_5980',
+  'foo_5981',
+  'foo_5982',
+  'foo_5983',
+  'foo_5984',
+  'foo_5985',
+  'foo_5986',
+  'foo_5987',
+  'foo_5988',
+  'foo_5989',
+  'foo_5990',
+  'foo_5991',
+  'foo_5992',
+  'foo_5993',
+  'foo_5994',
+  'foo_5995',
+  'foo_5996',
+  'foo_5997',
+  'foo_5998',
+  'foo_5999',
+  'foo_6000',
+  'foo_6001',
+  'foo_6002',
+  'foo_6003',
+  'foo_6004',
+  'foo_6005',
+  'foo_6006',
+  'foo_6007',
+  'foo_6008',
+  'foo_6009',
+  'foo_6010',
+  'foo_6011',
+  'foo_6012',
+  'foo_6013',
+  'foo_6014',
+  'foo_6015',
+  'foo_6016',
+  'foo_6017',
+  'foo_6018',
+  'foo_6019',
+  'foo_6020',
+  'foo_6021',
+  'foo_6022',
+  'foo_6023',
+  'foo_6024',
+  'foo_6025',
+  'foo_6026',
+  'foo_6027',
+  'foo_6028',
+  'foo_6029',
+  'foo_6030',
+  'foo_6031',
+  'foo_6032',
+  'foo_6033',
+  'foo_6034',
+  'foo_6035',
+  'foo_6036',
+  'foo_6037',
+  'foo_6038',
+  'foo_6039',
+  'foo_6040',
+  'foo_6041',
+  'foo_6042',
+  'foo_6043',
+  'foo_6044',
+  'foo_6045',
+  'foo_6046',
+  'foo_6047',
+  'foo_6048',
+  'foo_6049',
+  'foo_6050',
+  'foo_6051',
+  'foo_6052',
+  'foo_6053',
+  'foo_6054',
+  'foo_6055',
+  'foo_6056',
+  'foo_6057',
+  'foo_6058',
+  'foo_6059',
+  'foo_6060',
+  'foo_6061',
+  'foo_6062',
+  'foo_6063',
+  'foo_6064',
+  'foo_6065',
+  'foo_6066',
+  'foo_6067',
+  'foo_6068',
+  'foo_6069',
+  'foo_6070',
+  'foo_6071',
+  'foo_6072',
+  'foo_6073',
+  'foo_6074',
+  'foo_6075',
+  'foo_6076',
+  'foo_6077',
+  'foo_6078',
+  'foo_6079',
+  'foo_6080',
+  'foo_6081',
+  'foo_6082',
+  'foo_6083',
+  'foo_6084',
+  'foo_6085',
+  'foo_6086',
+  'foo_6087',
+  'foo_6088',
+  'foo_6089',
+  'foo_6090',
+  'foo_6091',
+  'foo_6092',
+  'foo_6093',
+  'foo_6094',
+  'foo_6095',
+  'foo_6096',
+  'foo_6097',
+  'foo_6098',
+  'foo_6099',
+  'foo_6100',
+  'foo_6101',
+  'foo_6102',
+  'foo_6103',
+  'foo_6104',
+  'foo_6105',
+  'foo_6106',
+  'foo_6107',
+  'foo_6108',
+  'foo_6109',
+  'foo_6110',
+  'foo_6111',
+  'foo_6112',
+  'foo_6113',
+  'foo_6114',
+  'foo_6115',
+  'foo_6116',
+  'foo_6117',
+  'foo_6118',
+  'foo_6119',
+  'foo_6120',
+  'foo_6121',
+  'foo_6122',
+  'foo_6123',
+  'foo_6124',
+  'foo_6125',
+  'foo_6126',
+  'foo_6127',
+  'foo_6128',
+  'foo_6129',
+  'foo_6130',
+  'foo_6131',
+  'foo_6132',
+  'foo_6133',
+  'foo_6134',
+  'foo_6135',
+  'foo_6136',
+  'foo_6137',
+  'foo_6138',
+  'foo_6139',
+  'foo_6140',
+  'foo_6141',
+  'foo_6142',
+  'foo_6143',
+  'foo_6144',
+  'foo_6145',
+  'foo_6146',
+  'foo_6147',
+  'foo_6148',
+  'foo_6149',
+  'foo_6150',
+  'foo_6151',
+  'foo_6152',
+  'foo_6153',
+  'foo_6154',
+  'foo_6155',
+  'foo_6156',
+  'foo_6157',
+  'foo_6158',
+  'foo_6159',
+  'foo_6160',
+  'foo_6161',
+  'foo_6162',
+  'foo_6163',
+  'foo_6164',
+  'foo_6165',
+  'foo_6166',
+  'foo_6167',
+  'foo_6168',
+  'foo_6169',
+  'foo_6170',
+  'foo_6171',
+  'foo_6172',
+  'foo_6173',
+  'foo_6174',
+  'foo_6175',
+  'foo_6176',
+  'foo_6177',
+  'foo_6178',
+  'foo_6179',
+  'foo_6180',
+  'foo_6181',
+  'foo_6182',
+  'foo_6183',
+  'foo_6184',
+  'foo_6185',
+  'foo_6186',
+  'foo_6187',
+  'foo_6188',
+  'foo_6189',
+  'foo_6190',
+  'foo_6191',
+  'foo_6192',
+  'foo_6193',
+  'foo_6194',
+  'foo_6195',
+  'foo_6196',
+  'foo_6197',
+  'foo_6198',
+  'foo_6199',
+  'foo_6200',
+  'foo_6201',
+  'foo_6202',
+  'foo_6203',
+  'foo_6204',
+  'foo_6205',
+  'foo_6206',
+  'foo_6207',
+  'foo_6208',
+  'foo_6209',
+  'foo_6210',
+  'foo_6211',
+  'foo_6212',
+  'foo_6213',
+  'foo_6214',
+  'foo_6215',
+  'foo_6216',
+  'foo_6217',
+  'foo_6218',
+  'foo_6219',
+  'foo_6220',
+  'foo_6221',
+  'foo_6222',
+  'foo_6223',
+  'foo_6224',
+  'foo_6225',
+  'foo_6226',
+  'foo_6227',
+  'foo_6228',
+  'foo_6229',
+  'foo_6230',
+  'foo_6231',
+  'foo_6232',
+  'foo_6233',
+  'foo_6234',
+  'foo_6235',
+  'foo_6236',
+  'foo_6237',
+  'foo_6238',
+  'foo_6239',
+  'foo_6240',
+  'foo_6241',
+  'foo_6242',
+  'foo_6243',
+  'foo_6244',
+  'foo_6245',
+  'foo_6246',
+  'foo_6247',
+  'foo_6248',
+  'foo_6249',
+  'foo_6250',
+  'foo_6251',
+  'foo_6252',
+  'foo_6253',
+  'foo_6254',
+  'foo_6255',
+  'foo_6256',
+  'foo_6257',
+  'foo_6258',
+  'foo_6259',
+  'foo_6260',
+  'foo_6261',
+  'foo_6262',
+  'foo_6263',
+  'foo_6264',
+  'foo_6265',
+  'foo_6266',
+  'foo_6267',
+  'foo_6268',
+  'foo_6269',
+  'foo_6270',
+  'foo_6271',
+  'foo_6272',
+  'foo_6273',
+  'foo_6274',
+  'foo_6275',
+  'foo_6276',
+  'foo_6277',
+  'foo_6278',
+  'foo_6279',
+  'foo_6280',
+  'foo_6281',
+  'foo_6282',
+  'foo_6283',
+  'foo_6284',
+  'foo_6285',
+  'foo_6286',
+  'foo_6287',
+  'foo_6288',
+  'foo_6289',
+  'foo_6290',
+  'foo_6291',
+  'foo_6292',
+  'foo_6293',
+  'foo_6294',
+  'foo_6295',
+  'foo_6296',
+  'foo_6297',
+  'foo_6298',
+  'foo_6299',
+  'foo_6300',
+  'foo_6301',
+  'foo_6302',
+  'foo_6303',
+  'foo_6304',
+  'foo_6305',
+  'foo_6306',
+  'foo_6307',
+  'foo_6308',
+  'foo_6309',
+  'foo_6310',
+  'foo_6311',
+  'foo_6312',
+  'foo_6313',
+  'foo_6314',
+  'foo_6315',
+  'foo_6316',
+  'foo_6317',
+  'foo_6318',
+  'foo_6319',
+  'foo_6320',
+  'foo_6321',
+  'foo_6322',
+  'foo_6323',
+  'foo_6324',
+  'foo_6325',
+  'foo_6326',
+  'foo_6327',
+  'foo_6328',
+  'foo_6329',
+  'foo_6330',
+  'foo_6331',
+  'foo_6332',
+  'foo_6333',
+  'foo_6334',
+  'foo_6335',
+  'foo_6336',
+  'foo_6337',
+  'foo_6338',
+  'foo_6339',
+  'foo_6340',
+  'foo_6341',
+  'foo_6342',
+  'foo_6343',
+  'foo_6344',
+  'foo_6345',
+  'foo_6346',
+  'foo_6347',
+  'foo_6348',
+  'foo_6349',
+  'foo_6350',
+  'foo_6351',
+  'foo_6352',
+  'foo_6353',
+  'foo_6354',
+  'foo_6355',
+  'foo_6356',
+  'foo_6357',
+  'foo_6358',
+  'foo_6359',
+  'foo_6360',
+  'foo_6361',
+  'foo_6362',
+  'foo_6363',
+  'foo_6364',
+  'foo_6365',
+  'foo_6366',
+  'foo_6367',
+  'foo_6368',
+  'foo_6369',
+  'foo_6370',
+  'foo_6371',
+  'foo_6372',
+  'foo_6373',
+  'foo_6374',
+  'foo_6375',
+  'foo_6376',
+  'foo_6377',
+  'foo_6378',
+  'foo_6379',
+  'foo_6380',
+  'foo_6381',
+  'foo_6382',
+  'foo_6383',
+  'foo_6384',
+  'foo_6385',
+  'foo_6386',
+  'foo_6387',
+  'foo_6388',
+  'foo_6389',
+  'foo_6390',
+  'foo_6391',
+  'foo_6392',
+  'foo_6393',
+  'foo_6394',
+  'foo_6395',
+  'foo_6396',
+  'foo_6397',
+  'foo_6398',
+  'foo_6399',
+  'foo_6400',
+  'foo_6401',
+  'foo_6402',
+  'foo_6403',
+  'foo_6404',
+  'foo_6405',
+  'foo_6406',
+  'foo_6407',
+  'foo_6408',
+  'foo_6409',
+  'foo_6410',
+  'foo_6411',
+  'foo_6412',
+  'foo_6413',
+  'foo_6414',
+  'foo_6415',
+  'foo_6416',
+  'foo_6417',
+  'foo_6418',
+  'foo_6419',
+  'foo_6420',
+  'foo_6421',
+  'foo_6422',
+  'foo_6423',
+  'foo_6424',
+  'foo_6425',
+  'foo_6426',
+  'foo_6427',
+  'foo_6428',
+  'foo_6429',
+  'foo_6430',
+  'foo_6431',
+  'foo_6432',
+  'foo_6433',
+  'foo_6434',
+  'foo_6435',
+  'foo_6436',
+  'foo_6437',
+  'foo_6438',
+  'foo_6439',
+  'foo_6440',
+  'foo_6441',
+  'foo_6442',
+  'foo_6443',
+  'foo_6444',
+  'foo_6445',
+  'foo_6446',
+  'foo_6447',
+  'foo_6448',
+  'foo_6449',
+  'foo_6450',
+  'foo_6451',
+  'foo_6452',
+  'foo_6453',
+  'foo_6454',
+  'foo_6455',
+  'foo_6456',
+  'foo_6457',
+  'foo_6458',
+  'foo_6459',
+  'foo_6460',
+  'foo_6461',
+  'foo_6462',
+  'foo_6463',
+  'foo_6464',
+  'foo_6465',
+  'foo_6466',
+  'foo_6467',
+  'foo_6468',
+  'foo_6469',
+  'foo_6470',
+  'foo_6471',
+  'foo_6472',
+  'foo_6473',
+  'foo_6474',
+  'foo_6475',
+  'foo_6476',
+  'foo_6477',
+  'foo_6478',
+  'foo_6479',
+  'foo_6480',
+  'foo_6481',
+  'foo_6482',
+  'foo_6483',
+  'foo_6484',
+  'foo_6485',
+  'foo_6486',
+  'foo_6487',
+  'foo_6488',
+  'foo_6489',
+  'foo_6490',
+  'foo_6491',
+  'foo_6492',
+  'foo_6493',
+  'foo_6494',
+  'foo_6495',
+  'foo_6496',
+  'foo_6497',
+  'foo_6498',
+  'foo_6499',
+  'foo_6500',
+  'foo_6501',
+  'foo_6502',
+  'foo_6503',
+  'foo_6504',
+  'foo_6505',
+  'foo_6506',
+  'foo_6507',
+  'foo_6508',
+  'foo_6509',
+  'foo_6510',
+  'foo_6511',
+  'foo_6512',
+  'foo_6513',
+  'foo_6514',
+  'foo_6515',
+  'foo_6516',
+  'foo_6517',
+  'foo_6518',
+  'foo_6519',
+  'foo_6520',
+  'foo_6521',
+  'foo_6522',
+  'foo_6523',
+  'foo_6524',
+  'foo_6525',
+  'foo_6526',
+  'foo_6527',
+  'foo_6528',
+  'foo_6529',
+  'foo_6530',
+  'foo_6531',
+  'foo_6532',
+  'foo_6533',
+  'foo_6534',
+  'foo_6535',
+  'foo_6536',
+  'foo_6537',
+  'foo_6538',
+  'foo_6539',
+  'foo_6540',
+  'foo_6541',
+  'foo_6542',
+  'foo_6543',
+  'foo_6544',
+  'foo_6545',
+  'foo_6546',
+  'foo_6547',
+  'foo_6548',
+  'foo_6549',
+  'foo_6550',
+  'foo_6551',
+  'foo_6552',
+  'foo_6553',
+  'foo_6554',
+  'foo_6555',
+  'foo_6556',
+  'foo_6557',
+  'foo_6558',
+  'foo_6559',
+  'foo_6560',
+  'foo_6561',
+  'foo_6562',
+  'foo_6563',
+  'foo_6564',
+  'foo_6565',
+  'foo_6566',
+  'foo_6567',
+  'foo_6568',
+  'foo_6569',
+  'foo_6570',
+  'foo_6571',
+  'foo_6572',
+  'foo_6573',
+  'foo_6574',
+  'foo_6575',
+  'foo_6576',
+  'foo_6577',
+  'foo_6578',
+  'foo_6579',
+  'foo_6580',
+  'foo_6581',
+  'foo_6582',
+  'foo_6583',
+  'foo_6584',
+  'foo_6585',
+  'foo_6586',
+  'foo_6587',
+  'foo_6588',
+  'foo_6589',
+  'foo_6590',
+  'foo_6591',
+  'foo_6592',
+  'foo_6593',
+  'foo_6594',
+  'foo_6595',
+  'foo_6596',
+  'foo_6597',
+  'foo_6598',
+  'foo_6599',
+  'foo_6600',
+  'foo_6601',
+  'foo_6602',
+  'foo_6603',
+  'foo_6604',
+  'foo_6605',
+  'foo_6606',
+  'foo_6607',
+  'foo_6608',
+  'foo_6609',
+  'foo_6610',
+  'foo_6611',
+  'foo_6612',
+  'foo_6613',
+  'foo_6614',
+  'foo_6615',
+  'foo_6616',
+  'foo_6617',
+  'foo_6618',
+  'foo_6619',
+  'foo_6620',
+  'foo_6621',
+  'foo_6622',
+  'foo_6623',
+  'foo_6624',
+  'foo_6625',
+  'foo_6626',
+  'foo_6627',
+  'foo_6628',
+  'foo_6629',
+  'foo_6630',
+  'foo_6631',
+  'foo_6632',
+  'foo_6633',
+  'foo_6634',
+  'foo_6635',
+  'foo_6636',
+  'foo_6637',
+  'foo_6638',
+  'foo_6639',
+  'foo_6640',
+  'foo_6641',
+  'foo_6642',
+  'foo_6643',
+  'foo_6644',
+  'foo_6645',
+  'foo_6646',
+  'foo_6647',
+  'foo_6648',
+  'foo_6649',
+  'foo_6650',
+  'foo_6651',
+  'foo_6652',
+  'foo_6653',
+  'foo_6654',
+  'foo_6655',
+  'foo_6656',
+  'foo_6657',
+  'foo_6658',
+  'foo_6659',
+  'foo_6660',
+  'foo_6661',
+  'foo_6662',
+  'foo_6663',
+  'foo_6664',
+  'foo_6665',
+  'foo_6666',
+  'foo_6667',
+  'foo_6668',
+  'foo_6669',
+  'foo_6670',
+  'foo_6671',
+  'foo_6672',
+  'foo_6673',
+  'foo_6674',
+  'foo_6675',
+  'foo_6676',
+  'foo_6677',
+  'foo_6678',
+  'foo_6679',
+  'foo_6680',
+  'foo_6681',
+  'foo_6682',
+  'foo_6683',
+  'foo_6684',
+  'foo_6685',
+  'foo_6686',
+  'foo_6687',
+  'foo_6688',
+  'foo_6689',
+  'foo_6690',
+  'foo_6691',
+  'foo_6692',
+  'foo_6693',
+  'foo_6694',
+  'foo_6695',
+  'foo_6696',
+  'foo_6697',
+  'foo_6698',
+  'foo_6699',
+  'foo_6700',
+  'foo_6701',
+  'foo_6702',
+  'foo_6703',
+  'foo_6704',
+  'foo_6705',
+  'foo_6706',
+  'foo_6707',
+  'foo_6708',
+  'foo_6709',
+  'foo_6710',
+  'foo_6711',
+  'foo_6712',
+  'foo_6713',
+  'foo_6714',
+  'foo_6715',
+  'foo_6716',
+  'foo_6717',
+  'foo_6718',
+  'foo_6719',
+  'foo_6720',
+  'foo_6721',
+  'foo_6722',
+  'foo_6723',
+  'foo_6724',
+  'foo_6725',
+  'foo_6726',
+  'foo_6727',
+  'foo_6728',
+  'foo_6729',
+  'foo_6730',
+  'foo_6731',
+  'foo_6732',
+  'foo_6733',
+  'foo_6734',
+  'foo_6735',
+  'foo_6736',
+  'foo_6737',
+  'foo_6738',
+  'foo_6739',
+  'foo_6740',
+  'foo_6741',
+  'foo_6742',
+  'foo_6743',
+  'foo_6744',
+  'foo_6745',
+  'foo_6746',
+  'foo_6747',
+  'foo_6748',
+  'foo_6749',
+  'foo_6750',
+  'foo_6751',
+  'foo_6752',
+  'foo_6753',
+  'foo_6754',
+  'foo_6755',
+  'foo_6756',
+  'foo_6757',
+  'foo_6758',
+  'foo_6759',
+  'foo_6760',
+  'foo_6761',
+  'foo_6762',
+  'foo_6763',
+  'foo_6764',
+  'foo_6765',
+  'foo_6766',
+  'foo_6767',
+  'foo_6768',
+  'foo_6769',
+  'foo_6770',
+  'foo_6771',
+  'foo_6772',
+  'foo_6773',
+  'foo_6774',
+  'foo_6775',
+  'foo_6776',
+  'foo_6777',
+  'foo_6778',
+  'foo_6779',
+  'foo_6780',
+  'foo_6781',
+  'foo_6782',
+  'foo_6783',
+  'foo_6784',
+  'foo_6785',
+  'foo_6786',
+  'foo_6787',
+  'foo_6788',
+  'foo_6789',
+  'foo_6790',
+  'foo_6791',
+  'foo_6792',
+  'foo_6793',
+  'foo_6794',
+  'foo_6795',
+  'foo_6796',
+  'foo_6797',
+  'foo_6798',
+  'foo_6799',
+  'foo_6800',
+  'foo_6801',
+  'foo_6802',
+  'foo_6803',
+  'foo_6804',
+  'foo_6805',
+  'foo_6806',
+  'foo_6807',
+  'foo_6808',
+  'foo_6809',
+  'foo_6810',
+  'foo_6811',
+  'foo_6812',
+  'foo_6813',
+  'foo_6814',
+  'foo_6815',
+  'foo_6816',
+  'foo_6817',
+  'foo_6818',
+  'foo_6819',
+  'foo_6820',
+  'foo_6821',
+  'foo_6822',
+  'foo_6823',
+  'foo_6824',
+  'foo_6825',
+  'foo_6826',
+  'foo_6827',
+  'foo_6828',
+  'foo_6829',
+  'foo_6830',
+  'foo_6831',
+  'foo_6832',
+  'foo_6833',
+  'foo_6834',
+  'foo_6835',
+  'foo_6836',
+  'foo_6837',
+  'foo_6838',
+  'foo_6839',
+  'foo_6840',
+  'foo_6841',
+  'foo_6842',
+  'foo_6843',
+  'foo_6844',
+  'foo_6845',
+  'foo_6846',
+  'foo_6847',
+  'foo_6848',
+  'foo_6849',
+  'foo_6850',
+  'foo_6851',
+  'foo_6852',
+  'foo_6853',
+  'foo_6854',
+  'foo_6855',
+  'foo_6856',
+  'foo_6857',
+  'foo_6858',
+  'foo_6859',
+  'foo_6860',
+  'foo_6861',
+  'foo_6862',
+  'foo_6863',
+  'foo_6864',
+  'foo_6865',
+  'foo_6866',
+  'foo_6867',
+  'foo_6868',
+  'foo_6869',
+  'foo_6870',
+  'foo_6871',
+  'foo_6872',
+  'foo_6873',
+  'foo_6874',
+  'foo_6875',
+  'foo_6876',
+  'foo_6877',
+  'foo_6878',
+  'foo_6879',
+  'foo_6880',
+  'foo_6881',
+  'foo_6882',
+  'foo_6883',
+  'foo_6884',
+  'foo_6885',
+  'foo_6886',
+  'foo_6887',
+  'foo_6888',
+  'foo_6889',
+  'foo_6890',
+  'foo_6891',
+  'foo_6892',
+  'foo_6893',
+  'foo_6894',
+  'foo_6895',
+  'foo_6896',
+  'foo_6897',
+  'foo_6898',
+  'foo_6899',
+  'foo_6900',
+  'foo_6901',
+  'foo_6902',
+  'foo_6903',
+  'foo_6904',
+  'foo_6905',
+  'foo_6906',
+  'foo_6907',
+  'foo_6908',
+  'foo_6909',
+  'foo_6910',
+  'foo_6911',
+  'foo_6912',
+  'foo_6913',
+  'foo_6914',
+  'foo_6915',
+  'foo_6916',
+  'foo_6917',
+  'foo_6918',
+  'foo_6919',
+  'foo_6920',
+  'foo_6921',
+  'foo_6922',
+  'foo_6923',
+  'foo_6924',
+  'foo_6925',
+  'foo_6926',
+  'foo_6927',
+  'foo_6928',
+  'foo_6929',
+  'foo_6930',
+  'foo_6931',
+  'foo_6932',
+  'foo_6933',
+  'foo_6934',
+  'foo_6935',
+  'foo_6936',
+  'foo_6937',
+  'foo_6938',
+  'foo_6939',
+  'foo_6940',
+  'foo_6941',
+  'foo_6942',
+  'foo_6943',
+  'foo_6944',
+  'foo_6945',
+  'foo_6946',
+  'foo_6947',
+  'foo_6948',
+  'foo_6949',
+  'foo_6950',
+  'foo_6951',
+  'foo_6952',
+  'foo_6953',
+  'foo_6954',
+  'foo_6955',
+  'foo_6956',
+  'foo_6957',
+  'foo_6958',
+  'foo_6959',
+  'foo_6960',
+  'foo_6961',
+  'foo_6962',
+  'foo_6963',
+  'foo_6964',
+  'foo_6965',
+  'foo_6966',
+  'foo_6967',
+  'foo_6968',
+  'foo_6969',
+  'foo_6970',
+  'foo_6971',
+  'foo_6972',
+  'foo_6973',
+  'foo_6974',
+  'foo_6975',
+  'foo_6976',
+  'foo_6977',
+  'foo_6978',
+  'foo_6979',
+  'foo_6980',
+  'foo_6981',
+  'foo_6982',
+  'foo_6983',
+  'foo_6984',
+  'foo_6985',
+  'foo_6986',
+  'foo_6987',
+  'foo_6988',
+  'foo_6989',
+  'foo_6990',
+  'foo_6991',
+  'foo_6992',
+  'foo_6993',
+  'foo_6994',
+  'foo_6995',
+  'foo_6996',
+  'foo_6997',
+  'foo_6998',
+  'foo_6999',
+  'foo_7000',
+  'foo_7001',
+  'foo_7002',
+  'foo_7003',
+  'foo_7004',
+  'foo_7005',
+  'foo_7006',
+  'foo_7007',
+  'foo_7008',
+  'foo_7009',
+  'foo_7010',
+  'foo_7011',
+  'foo_7012',
+  'foo_7013',
+  'foo_7014',
+  'foo_7015',
+  'foo_7016',
+  'foo_7017',
+  'foo_7018',
+  'foo_7019',
+  'foo_7020',
+  'foo_7021',
+  'foo_7022',
+  'foo_7023',
+  'foo_7024',
+  'foo_7025',
+  'foo_7026',
+  'foo_7027',
+  'foo_7028',
+  'foo_7029',
+  'foo_7030',
+  'foo_7031',
+  'foo_7032',
+  'foo_7033',
+  'foo_7034',
+  'foo_7035',
+  'foo_7036',
+  'foo_7037',
+  'foo_7038',
+  'foo_7039',
+  'foo_7040',
+  'foo_7041',
+  'foo_7042',
+  'foo_7043',
+  'foo_7044',
+  'foo_7045',
+  'foo_7046',
+  'foo_7047',
+  'foo_7048',
+  'foo_7049',
+  'foo_7050',
+  'foo_7051',
+  'foo_7052',
+  'foo_7053',
+  'foo_7054',
+  'foo_7055',
+  'foo_7056',
+  'foo_7057',
+  'foo_7058',
+  'foo_7059',
+  'foo_7060',
+  'foo_7061',
+  'foo_7062',
+  'foo_7063',
+  'foo_7064',
+  'foo_7065',
+  'foo_7066',
+  'foo_7067',
+  'foo_7068',
+  'foo_7069',
+  'foo_7070',
+  'foo_7071',
+  'foo_7072',
+  'foo_7073',
+  'foo_7074',
+  'foo_7075',
+  'foo_7076',
+  'foo_7077',
+  'foo_7078',
+  'foo_7079',
+  'foo_7080',
+  'foo_7081',
+  'foo_7082',
+  'foo_7083',
+  'foo_7084',
+  'foo_7085',
+  'foo_7086',
+  'foo_7087',
+  'foo_7088',
+  'foo_7089',
+  'foo_7090',
+  'foo_7091',
+  'foo_7092',
+  'foo_7093',
+  'foo_7094',
+  'foo_7095',
+  'foo_7096',
+  'foo_7097',
+  'foo_7098',
+  'foo_7099',
+  'foo_7100',
+  'foo_7101',
+  'foo_7102',
+  'foo_7103',
+  'foo_7104',
+  'foo_7105',
+  'foo_7106',
+  'foo_7107',
+  'foo_7108',
+  'foo_7109',
+  'foo_7110',
+  'foo_7111',
+  'foo_7112',
+  'foo_7113',
+  'foo_7114',
+  'foo_7115',
+  'foo_7116',
+  'foo_7117',
+  'foo_7118',
+  'foo_7119',
+  'foo_7120',
+  'foo_7121',
+  'foo_7122',
+  'foo_7123',
+  'foo_7124',
+  'foo_7125',
+  'foo_7126',
+  'foo_7127',
+  'foo_7128',
+  'foo_7129',
+  'foo_7130',
+  'foo_7131',
+  'foo_7132',
+  'foo_7133',
+  'foo_7134',
+  'foo_7135',
+  'foo_7136',
+  'foo_7137',
+  'foo_7138',
+  'foo_7139',
+  'foo_7140',
+  'foo_7141',
+  'foo_7142',
+  'foo_7143',
+  'foo_7144',
+  'foo_7145',
+  'foo_7146',
+  'foo_7147',
+  'foo_7148',
+  'foo_7149',
+  'foo_7150',
+  'foo_7151',
+  'foo_7152',
+  'foo_7153',
+  'foo_7154',
+  'foo_7155',
+  'foo_7156',
+  'foo_7157',
+  'foo_7158',
+  'foo_7159',
+  'foo_7160',
+  'foo_7161',
+  'foo_7162',
+  'foo_7163',
+  'foo_7164',
+  'foo_7165',
+  'foo_7166',
+  'foo_7167',
+  'foo_7168',
+  'foo_7169',
+  'foo_7170',
+  'foo_7171',
+  'foo_7172',
+  'foo_7173',
+  'foo_7174',
+  'foo_7175',
+  'foo_7176',
+  'foo_7177',
+  'foo_7178',
+  'foo_7179',
+  'foo_7180',
+  'foo_7181',
+  'foo_7182',
+  'foo_7183',
+  'foo_7184',
+  'foo_7185',
+  'foo_7186',
+  'foo_7187',
+  'foo_7188',
+  'foo_7189',
+  'foo_7190',
+  'foo_7191',
+  'foo_7192',
+  'foo_7193',
+  'foo_7194',
+  'foo_7195',
+  'foo_7196',
+  'foo_7197',
+  'foo_7198',
+  'foo_7199',
+  'foo_7200',
+  'foo_7201',
+  'foo_7202',
+  'foo_7203',
+  'foo_7204',
+  'foo_7205',
+  'foo_7206',
+  'foo_7207',
+  'foo_7208',
+  'foo_7209',
+  'foo_7210',
+  'foo_7211',
+  'foo_7212',
+  'foo_7213',
+  'foo_7214',
+  'foo_7215',
+  'foo_7216',
+  'foo_7217',
+  'foo_7218',
+  'foo_7219',
+  'foo_7220',
+  'foo_7221',
+  'foo_7222',
+  'foo_7223',
+  'foo_7224',
+  'foo_7225',
+  'foo_7226',
+  'foo_7227',
+  'foo_7228',
+  'foo_7229',
+  'foo_7230',
+  'foo_7231',
+  'foo_7232',
+  'foo_7233',
+  'foo_7234',
+  'foo_7235',
+  'foo_7236',
+  'foo_7237',
+  'foo_7238',
+  'foo_7239',
+  'foo_7240',
+  'foo_7241',
+  'foo_7242',
+  'foo_7243',
+  'foo_7244',
+  'foo_7245',
+  'foo_7246',
+  'foo_7247',
+  'foo_7248',
+  'foo_7249',
+  'foo_7250',
+  'foo_7251',
+  'foo_7252',
+  'foo_7253',
+  'foo_7254',
+  'foo_7255',
+  'foo_7256',
+  'foo_7257',
+  'foo_7258',
+  'foo_7259',
+  'foo_7260',
+  'foo_7261',
+  'foo_7262',
+  'foo_7263',
+  'foo_7264',
+  'foo_7265',
+  'foo_7266',
+  'foo_7267',
+  'foo_7268',
+  'foo_7269',
+  'foo_7270',
+  'foo_7271',
+  'foo_7272',
+  'foo_7273',
+  'foo_7274',
+  'foo_7275',
+  'foo_7276',
+  'foo_7277',
+  'foo_7278',
+  'foo_7279',
+  'foo_7280',
+  'foo_7281',
+  'foo_7282',
+  'foo_7283',
+  'foo_7284',
+  'foo_7285',
+  'foo_7286',
+  'foo_7287',
+  'foo_7288',
+  'foo_7289',
+  'foo_7290',
+  'foo_7291',
+  'foo_7292',
+  'foo_7293',
+  'foo_7294',
+  'foo_7295',
+  'foo_7296',
+  'foo_7297',
+  'foo_7298',
+  'foo_7299',
+  'foo_7300',
+  'foo_7301',
+  'foo_7302',
+  'foo_7303',
+  'foo_7304',
+  'foo_7305',
+  'foo_7306',
+  'foo_7307',
+  'foo_7308',
+  'foo_7309',
+  'foo_7310',
+  'foo_7311',
+  'foo_7312',
+  'foo_7313',
+  'foo_7314',
+  'foo_7315',
+  'foo_7316',
+  'foo_7317',
+  'foo_7318',
+  'foo_7319',
+  'foo_7320',
+  'foo_7321',
+  'foo_7322',
+  'foo_7323',
+  'foo_7324',
+  'foo_7325',
+  'foo_7326',
+  'foo_7327',
+  'foo_7328',
+  'foo_7329',
+  'foo_7330',
+  'foo_7331',
+  'foo_7332',
+  'foo_7333',
+  'foo_7334',
+  'foo_7335',
+  'foo_7336',
+  'foo_7337',
+  'foo_7338',
+  'foo_7339',
+  'foo_7340',
+  'foo_7341',
+  'foo_7342',
+  'foo_7343',
+  'foo_7344',
+  'foo_7345',
+  'foo_7346',
+  'foo_7347',
+  'foo_7348',
+  'foo_7349',
+  'foo_7350',
+  'foo_7351',
+  'foo_7352',
+  'foo_7353',
+  'foo_7354',
+  'foo_7355',
+  'foo_7356',
+  'foo_7357',
+  'foo_7358',
+  'foo_7359',
+  'foo_7360',
+  'foo_7361',
+  'foo_7362',
+  'foo_7363',
+  'foo_7364',
+  'foo_7365',
+  'foo_7366',
+  'foo_7367',
+  'foo_7368',
+  'foo_7369',
+  'foo_7370',
+  'foo_7371',
+  'foo_7372',
+  'foo_7373',
+  'foo_7374',
+  'foo_7375',
+  'foo_7376',
+  'foo_7377',
+  'foo_7378',
+  'foo_7379',
+  'foo_7380',
+  'foo_7381',
+  'foo_7382',
+  'foo_7383',
+  'foo_7384',
+  'foo_7385',
+  'foo_7386',
+  'foo_7387',
+  'foo_7388',
+  'foo_7389',
+  'foo_7390',
+  'foo_7391',
+  'foo_7392',
+  'foo_7393',
+  'foo_7394',
+  'foo_7395',
+  'foo_7396',
+  'foo_7397',
+  'foo_7398',
+  'foo_7399',
+  'foo_7400',
+  'foo_7401',
+  'foo_7402',
+  'foo_7403',
+  'foo_7404',
+  'foo_7405',
+  'foo_7406',
+  'foo_7407',
+  'foo_7408',
+  'foo_7409',
+  'foo_7410',
+  'foo_7411',
+  'foo_7412',
+  'foo_7413',
+  'foo_7414',
+  'foo_7415',
+  'foo_7416',
+  'foo_7417',
+  'foo_7418',
+  'foo_7419',
+  'foo_7420',
+  'foo_7421',
+  'foo_7422',
+  'foo_7423',
+  'foo_7424',
+  'foo_7425',
+  'foo_7426',
+  'foo_7427',
+  'foo_7428',
+  'foo_7429',
+  'foo_7430',
+  'foo_7431',
+  'foo_7432',
+  'foo_7433',
+  'foo_7434',
+  'foo_7435',
+  'foo_7436',
+  'foo_7437',
+  'foo_7438',
+  'foo_7439',
+  'foo_7440',
+  'foo_7441',
+  'foo_7442',
+  'foo_7443',
+  'foo_7444',
+  'foo_7445',
+  'foo_7446',
+  'foo_7447',
+  'foo_7448',
+  'foo_7449',
+  'foo_7450',
+  'foo_7451',
+  'foo_7452',
+  'foo_7453',
+  'foo_7454',
+  'foo_7455',
+  'foo_7456',
+  'foo_7457',
+  'foo_7458',
+  'foo_7459',
+  'foo_7460',
+  'foo_7461',
+  'foo_7462',
+  'foo_7463',
+  'foo_7464',
+  'foo_7465',
+  'foo_7466',
+  'foo_7467',
+  'foo_7468',
+  'foo_7469',
+  'foo_7470',
+  'foo_7471',
+  'foo_7472',
+  'foo_7473',
+  'foo_7474',
+  'foo_7475',
+  'foo_7476',
+  'foo_7477',
+  'foo_7478',
+  'foo_7479',
+  'foo_7480',
+  'foo_7481',
+  'foo_7482',
+  'foo_7483',
+  'foo_7484',
+  'foo_7485',
+  'foo_7486',
+  'foo_7487',
+  'foo_7488',
+  'foo_7489',
+  'foo_7490',
+  'foo_7491',
+  'foo_7492',
+  'foo_7493',
+  'foo_7494',
+  'foo_7495',
+  'foo_7496',
+  'foo_7497',
+  'foo_7498',
+  'foo_7499',
+  'foo_7500',
+  'foo_7501',
+  'foo_7502',
+  'foo_7503',
+  'foo_7504',
+  'foo_7505',
+  'foo_7506',
+  'foo_7507',
+  'foo_7508',
+  'foo_7509',
+  'foo_7510',
+  'foo_7511',
+  'foo_7512',
+  'foo_7513',
+  'foo_7514',
+  'foo_7515',
+  'foo_7516',
+  'foo_7517',
+  'foo_7518',
+  'foo_7519',
+  'foo_7520',
+  'foo_7521',
+  'foo_7522',
+  'foo_7523',
+  'foo_7524',
+  'foo_7525',
+  'foo_7526',
+  'foo_7527',
+  'foo_7528',
+  'foo_7529',
+  'foo_7530',
+  'foo_7531',
+  'foo_7532',
+  'foo_7533',
+  'foo_7534',
+  'foo_7535',
+  'foo_7536',
+  'foo_7537',
+  'foo_7538',
+  'foo_7539',
+  'foo_7540',
+  'foo_7541',
+  'foo_7542',
+  'foo_7543',
+  'foo_7544',
+  'foo_7545',
+  'foo_7546',
+  'foo_7547',
+  'foo_7548',
+  'foo_7549',
+  'foo_7550',
+  'foo_7551',
+  'foo_7552',
+  'foo_7553',
+  'foo_7554',
+  'foo_7555',
+  'foo_7556',
+  'foo_7557',
+  'foo_7558',
+  'foo_7559',
+  'foo_7560',
+  'foo_7561',
+  'foo_7562',
+  'foo_7563',
+  'foo_7564',
+  'foo_7565',
+  'foo_7566',
+  'foo_7567',
+  'foo_7568',
+  'foo_7569',
+  'foo_7570',
+  'foo_7571',
+  'foo_7572',
+  'foo_7573',
+  'foo_7574',
+  'foo_7575',
+  'foo_7576',
+  'foo_7577',
+  'foo_7578',
+  'foo_7579',
+  'foo_7580',
+  'foo_7581',
+  'foo_7582',
+  'foo_7583',
+  'foo_7584',
+  'foo_7585',
+  'foo_7586',
+  'foo_7587',
+  'foo_7588',
+  'foo_7589',
+  'foo_7590',
+  'foo_7591',
+  'foo_7592',
+  'foo_7593',
+  'foo_7594',
+  'foo_7595',
+  'foo_7596',
+  'foo_7597',
+  'foo_7598',
+  'foo_7599',
+  'foo_7600',
+  'foo_7601',
+  'foo_7602',
+  'foo_7603',
+  'foo_7604',
+  'foo_7605',
+  'foo_7606',
+  'foo_7607',
+  'foo_7608',
+  'foo_7609',
+  'foo_7610',
+  'foo_7611',
+  'foo_7612',
+  'foo_7613',
+  'foo_7614',
+  'foo_7615',
+  'foo_7616',
+  'foo_7617',
+  'foo_7618',
+  'foo_7619',
+  'foo_7620',
+  'foo_7621',
+  'foo_7622',
+  'foo_7623',
+  'foo_7624',
+  'foo_7625',
+  'foo_7626',
+  'foo_7627',
+  'foo_7628',
+  'foo_7629',
+  'foo_7630',
+  'foo_7631',
+  'foo_7632',
+  'foo_7633',
+  'foo_7634',
+  'foo_7635',
+  'foo_7636',
+  'foo_7637',
+  'foo_7638',
+  'foo_7639',
+  'foo_7640',
+  'foo_7641',
+  'foo_7642',
+  'foo_7643',
+  'foo_7644',
+  'foo_7645',
+  'foo_7646',
+  'foo_7647',
+  'foo_7648',
+  'foo_7649',
+  'foo_7650',
+  'foo_7651',
+  'foo_7652',
+  'foo_7653',
+  'foo_7654',
+  'foo_7655',
+  'foo_7656',
+  'foo_7657',
+  'foo_7658',
+  'foo_7659',
+  'foo_7660',
+  'foo_7661',
+  'foo_7662',
+  'foo_7663',
+  'foo_7664',
+  'foo_7665',
+  'foo_7666',
+  'foo_7667',
+  'foo_7668',
+  'foo_7669',
+  'foo_7670',
+  'foo_7671',
+  'foo_7672',
+  'foo_7673',
+  'foo_7674',
+  'foo_7675',
+  'foo_7676',
+  'foo_7677',
+  'foo_7678',
+  'foo_7679',
+  'foo_7680',
+  'foo_7681',
+  'foo_7682',
+  'foo_7683',
+  'foo_7684',
+  'foo_7685',
+  'foo_7686',
+  'foo_7687',
+  'foo_7688',
+  'foo_7689',
+  'foo_7690',
+  'foo_7691',
+  'foo_7692',
+  'foo_7693',
+  'foo_7694',
+  'foo_7695',
+  'foo_7696',
+  'foo_7697',
+  'foo_7698',
+  'foo_7699',
+  'foo_7700',
+  'foo_7701',
+  'foo_7702',
+  'foo_7703',
+  'foo_7704',
+  'foo_7705',
+  'foo_7706',
+  'foo_7707',
+  'foo_7708',
+  'foo_7709',
+  'foo_7710',
+  'foo_7711',
+  'foo_7712',
+  'foo_7713',
+  'foo_7714',
+  'foo_7715',
+  'foo_7716',
+  'foo_7717',
+  'foo_7718',
+  'foo_7719',
+  'foo_7720',
+  'foo_7721',
+  'foo_7722',
+  'foo_7723',
+  'foo_7724',
+  'foo_7725',
+  'foo_7726',
+  'foo_7727',
+  'foo_7728',
+  'foo_7729',
+  'foo_7730',
+  'foo_7731',
+  'foo_7732',
+  'foo_7733',
+  'foo_7734',
+  'foo_7735',
+  'foo_7736',
+  'foo_7737',
+  'foo_7738',
+  'foo_7739',
+  'foo_7740',
+  'foo_7741',
+  'foo_7742',
+  'foo_7743',
+  'foo_7744',
+  'foo_7745',
+  'foo_7746',
+  'foo_7747',
+  'foo_7748',
+  'foo_7749',
+  'foo_7750',
+  'foo_7751',
+  'foo_7752',
+  'foo_7753',
+  'foo_7754',
+  'foo_7755',
+  'foo_7756',
+  'foo_7757',
+  'foo_7758',
+  'foo_7759',
+  'foo_7760',
+  'foo_7761',
+  'foo_7762',
+  'foo_7763',
+  'foo_7764',
+  'foo_7765',
+  'foo_7766',
+  'foo_7767',
+  'foo_7768',
+  'foo_7769',
+  'foo_7770',
+  'foo_7771',
+  'foo_7772',
+  'foo_7773',
+  'foo_7774',
+  'foo_7775',
+  'foo_7776',
+  'foo_7777',
+  'foo_7778',
+  'foo_7779',
+  'foo_7780',
+  'foo_7781',
+  'foo_7782',
+  'foo_7783',
+  'foo_7784',
+  'foo_7785',
+  'foo_7786',
+  'foo_7787',
+  'foo_7788',
+  'foo_7789',
+  'foo_7790',
+  'foo_7791',
+  'foo_7792',
+  'foo_7793',
+  'foo_7794',
+  'foo_7795',
+  'foo_7796',
+  'foo_7797',
+  'foo_7798',
+  'foo_7799',
+  'foo_7800',
+  'foo_7801',
+  'foo_7802',
+  'foo_7803',
+  'foo_7804',
+  'foo_7805',
+  'foo_7806',
+  'foo_7807',
+  'foo_7808',
+  'foo_7809',
+  'foo_7810',
+  'foo_7811',
+  'foo_7812',
+  'foo_7813',
+  'foo_7814',
+  'foo_7815',
+  'foo_7816',
+  'foo_7817',
+  'foo_7818',
+  'foo_7819',
+  'foo_7820',
+  'foo_7821',
+  'foo_7822',
+  'foo_7823',
+  'foo_7824',
+  'foo_7825',
+  'foo_7826',
+  'foo_7827',
+  'foo_7828',
+  'foo_7829',
+  'foo_7830',
+  'foo_7831',
+  'foo_7832',
+  'foo_7833',
+  'foo_7834',
+  'foo_7835',
+  'foo_7836',
+  'foo_7837',
+  'foo_7838',
+  'foo_7839',
+  'foo_7840',
+  'foo_7841',
+  'foo_7842',
+  'foo_7843',
+  'foo_7844',
+  'foo_7845',
+  'foo_7846',
+  'foo_7847',
+  'foo_7848',
+  'foo_7849',
+  'foo_7850',
+  'foo_7851',
+  'foo_7852',
+  'foo_7853',
+  'foo_7854',
+  'foo_7855',
+  'foo_7856',
+  'foo_7857',
+  'foo_7858',
+  'foo_7859',
+  'foo_7860',
+  'foo_7861',
+  'foo_7862',
+  'foo_7863',
+  'foo_7864',
+  'foo_7865',
+  'foo_7866',
+  'foo_7867',
+  'foo_7868',
+  'foo_7869',
+  'foo_7870',
+  'foo_7871',
+  'foo_7872',
+  'foo_7873',
+  'foo_7874',
+  'foo_7875',
+  'foo_7876',
+  'foo_7877',
+  'foo_7878',
+  'foo_7879',
+  'foo_7880',
+  'foo_7881',
+  'foo_7882',
+  'foo_7883',
+  'foo_7884',
+  'foo_7885',
+  'foo_7886',
+  'foo_7887',
+  'foo_7888',
+  'foo_7889',
+  'foo_7890',
+  'foo_7891',
+  'foo_7892',
+  'foo_7893',
+  'foo_7894',
+  'foo_7895',
+  'foo_7896',
+  'foo_7897',
+  'foo_7898',
+  'foo_7899',
+  'foo_7900',
+  'foo_7901',
+  'foo_7902',
+  'foo_7903',
+  'foo_7904',
+  'foo_7905',
+  'foo_7906',
+  'foo_7907',
+  'foo_7908',
+  'foo_7909',
+  'foo_7910',
+  'foo_7911',
+  'foo_7912',
+  'foo_7913',
+  'foo_7914',
+  'foo_7915',
+  'foo_7916',
+  'foo_7917',
+  'foo_7918',
+  'foo_7919',
+  'foo_7920',
+  'foo_7921',
+  'foo_7922',
+  'foo_7923',
+  'foo_7924',
+  'foo_7925',
+  'foo_7926',
+  'foo_7927',
+  'foo_7928',
+  'foo_7929',
+  'foo_7930',
+  'foo_7931',
+  'foo_7932',
+  'foo_7933',
+  'foo_7934',
+  'foo_7935',
+  'foo_7936',
+  'foo_7937',
+  'foo_7938',
+  'foo_7939',
+  'foo_7940',
+  'foo_7941',
+  'foo_7942',
+  'foo_7943',
+  'foo_7944',
+  'foo_7945',
+  'foo_7946',
+  'foo_7947',
+  'foo_7948',
+  'foo_7949',
+  'foo_7950',
+  'foo_7951',
+  'foo_7952',
+  'foo_7953',
+  'foo_7954',
+  'foo_7955',
+  'foo_7956',
+  'foo_7957',
+  'foo_7958',
+  'foo_7959',
+  'foo_7960',
+  'foo_7961',
+  'foo_7962',
+  'foo_7963',
+  'foo_7964',
+  'foo_7965',
+  'foo_7966',
+  'foo_7967',
+  'foo_7968',
+  'foo_7969',
+  'foo_7970',
+  'foo_7971',
+  'foo_7972',
+  'foo_7973',
+  'foo_7974',
+  'foo_7975',
+  'foo_7976',
+  'foo_7977',
+  'foo_7978',
+  'foo_7979',
+  'foo_7980',
+  'foo_7981',
+  'foo_7982',
+  'foo_7983',
+  'foo_7984',
+  'foo_7985',
+  'foo_7986',
+  'foo_7987',
+  'foo_7988',
+  'foo_7989',
+  'foo_7990',
+  'foo_7991',
+  'foo_7992',
+  'foo_7993',
+  'foo_7994',
+  'foo_7995',
+  'foo_7996',
+  'foo_7997',
+  'foo_7998',
+  'foo_7999',
+  'foo_8000',
+  'foo_8001',
+  'foo_8002',
+  'foo_8003',
+  'foo_8004',
+  'foo_8005',
+  'foo_8006',
+  'foo_8007',
+  'foo_8008',
+  'foo_8009',
+  'foo_8010',
+  'foo_8011',
+  'foo_8012',
+  'foo_8013',
+  'foo_8014',
+  'foo_8015',
+  'foo_8016',
+  'foo_8017',
+  'foo_8018',
+  'foo_8019',
+  'foo_8020',
+  'foo_8021',
+  'foo_8022',
+  'foo_8023',
+  'foo_8024',
+  'foo_8025',
+  'foo_8026',
+  'foo_8027',
+  'foo_8028',
+  'foo_8029',
+  'foo_8030',
+  'foo_8031',
+  'foo_8032',
+  'foo_8033',
+  'foo_8034',
+  'foo_8035',
+  'foo_8036',
+  'foo_8037',
+  'foo_8038',
+  'foo_8039',
+  'foo_8040',
+  'foo_8041',
+  'foo_8042',
+  'foo_8043',
+  'foo_8044',
+  'foo_8045',
+  'foo_8046',
+  'foo_8047',
+  'foo_8048',
+  'foo_8049',
+  'foo_8050',
+  'foo_8051',
+  'foo_8052',
+  'foo_8053',
+  'foo_8054',
+  'foo_8055',
+  'foo_8056',
+  'foo_8057',
+  'foo_8058',
+  'foo_8059',
+  'foo_8060',
+  'foo_8061',
+  'foo_8062',
+  'foo_8063',
+  'foo_8064',
+  'foo_8065',
+  'foo_8066',
+  'foo_8067',
+  'foo_8068',
+  'foo_8069',
+  'foo_8070',
+  'foo_8071',
+  'foo_8072',
+  'foo_8073',
+  'foo_8074',
+  'foo_8075',
+  'foo_8076',
+  'foo_8077',
+  'foo_8078',
+  'foo_8079',
+  'foo_8080',
+  'foo_8081',
+  'foo_8082',
+  'foo_8083',
+  'foo_8084',
+  'foo_8085',
+  'foo_8086',
+  'foo_8087',
+  'foo_8088',
+  'foo_8089',
+  'foo_8090',
+  'foo_8091',
+  'foo_8092',
+  'foo_8093',
+  'foo_8094',
+  'foo_8095',
+  'foo_8096',
+  'foo_8097',
+  'foo_8098',
+  'foo_8099',
+  'foo_8100',
+  'foo_8101',
+  'foo_8102',
+  'foo_8103',
+  'foo_8104',
+  'foo_8105',
+  'foo_8106',
+  'foo_8107',
+  'foo_8108',
+  'foo_8109',
+  'foo_8110',
+  'foo_8111',
+  'foo_8112',
+  'foo_8113',
+  'foo_8114',
+  'foo_8115',
+  'foo_8116',
+  'foo_8117',
+  'foo_8118',
+  'foo_8119',
+  'foo_8120',
+  'foo_8121',
+  'foo_8122',
+  'foo_8123',
+  'foo_8124',
+  'foo_8125',
+  'foo_8126',
+  'foo_8127',
+  'foo_8128',
+  'foo_8129',
+  'foo_8130',
+  'foo_8131',
+  'foo_8132',
+  'foo_8133',
+  'foo_8134',
+  'foo_8135',
+  'foo_8136',
+  'foo_8137',
+  'foo_8138',
+  'foo_8139',
+  'foo_8140',
+  'foo_8141',
+  'foo_8142',
+  'foo_8143',
+  'foo_8144',
+  'foo_8145',
+  'foo_8146',
+  'foo_8147',
+  'foo_8148',
+  'foo_8149',
+  'foo_8150',
+  'foo_8151',
+  'foo_8152',
+  'foo_8153',
+  'foo_8154',
+  'foo_8155',
+  'foo_8156',
+  'foo_8157',
+  'foo_8158',
+  'foo_8159',
+  'foo_8160',
+  'foo_8161',
+  'foo_8162',
+  'foo_8163',
+  'foo_8164',
+  'foo_8165',
+  'foo_8166',
+  'foo_8167',
+  'foo_8168',
+  'foo_8169',
+  'foo_8170',
+  'foo_8171',
+  'foo_8172',
+  'foo_8173',
+  'foo_8174',
+  'foo_8175',
+  'foo_8176',
+  'foo_8177',
+  'foo_8178',
+  'foo_8179',
+  'foo_8180',
+  'foo_8181',
+  'foo_8182',
+  'foo_8183',
+  'foo_8184',
+  'foo_8185',
+  'foo_8186',
+  'foo_8187',
+  'foo_8188',
+  'foo_8189',
+  'foo_8190',
+  'foo_8191',
+  'foo_8192',
+  'foo_8193',
+  'foo_8194',
+  'foo_8195',
+  'foo_8196',
+  'foo_8197',
+  'foo_8198',
+  'foo_8199',
+  'foo_8200',
+  'foo_8201',
+  'foo_8202',
+  'foo_8203',
+  'foo_8204',
+  'foo_8205',
+  'foo_8206',
+  'foo_8207',
+  'foo_8208',
+  'foo_8209',
+  'foo_8210',
+  'foo_8211',
+  'foo_8212',
+  'foo_8213',
+  'foo_8214',
+  'foo_8215',
+  'foo_8216',
+  'foo_8217',
+  'foo_8218',
+  'foo_8219',
+  'foo_8220',
+  'foo_8221',
+  'foo_8222',
+  'foo_8223',
+  'foo_8224',
+  'foo_8225',
+  'foo_8226',
+  'foo_8227',
+  'foo_8228',
+  'foo_8229',
+  'foo_8230',
+  'foo_8231',
+  'foo_8232',
+  'foo_8233',
+  'foo_8234',
+  'foo_8235',
+  'foo_8236',
+  'foo_8237',
+  'foo_8238',
+  'foo_8239',
+  'foo_8240',
+  'foo_8241',
+  'foo_8242',
+  'foo_8243',
+  'foo_8244',
+  'foo_8245',
+  'foo_8246',
+  'foo_8247',
+  'foo_8248',
+  'foo_8249',
+  'foo_8250',
+  'foo_8251',
+  'foo_8252',
+  'foo_8253',
+  'foo_8254',
+  'foo_8255',
+  'foo_8256',
+  'foo_8257',
+  'foo_8258',
+  'foo_8259',
+  'foo_8260',
+  'foo_8261',
+  'foo_8262',
+  'foo_8263',
+  'foo_8264',
+  'foo_8265',
+  'foo_8266',
+  'foo_8267',
+  'foo_8268',
+  'foo_8269',
+  'foo_8270',
+  'foo_8271',
+  'foo_8272',
+  'foo_8273',
+  'foo_8274',
+  'foo_8275',
+  'foo_8276',
+  'foo_8277',
+  'foo_8278',
+  'foo_8279',
+  'foo_8280',
+  'foo_8281',
+  'foo_8282',
+  'foo_8283',
+  'foo_8284',
+  'foo_8285',
+  'foo_8286',
+  'foo_8287',
+  'foo_8288',
+  'foo_8289',
+  'foo_8290',
+  'foo_8291',
+  'foo_8292',
+  'foo_8293',
+  'foo_8294',
+  'foo_8295',
+  'foo_8296',
+  'foo_8297',
+  'foo_8298',
+  'foo_8299',
+  'foo_8300',
+  'foo_8301',
+  'foo_8302',
+  'foo_8303',
+  'foo_8304',
+  'foo_8305',
+  'foo_8306',
+  'foo_8307',
+  'foo_8308',
+  'foo_8309',
+  'foo_8310',
+  'foo_8311',
+  'foo_8312',
+  'foo_8313',
+  'foo_8314',
+  'foo_8315',
+  'foo_8316',
+  'foo_8317',
+  'foo_8318',
+  'foo_8319',
+  'foo_8320',
+  'foo_8321',
+  'foo_8322',
+  'foo_8323',
+  'foo_8324',
+  'foo_8325',
+  'foo_8326',
+  'foo_8327',
+  'foo_8328',
+  'foo_8329',
+  'foo_8330',
+  'foo_8331',
+  'foo_8332',
+  'foo_8333',
+  'foo_8334',
+  'foo_8335',
+  'foo_8336',
+  'foo_8337',
+  'foo_8338',
+  'foo_8339',
+  'foo_8340',
+  'foo_8341',
+  'foo_8342',
+  'foo_8343',
+  'foo_8344',
+  'foo_8345',
+  'foo_8346',
+  'foo_8347',
+  'foo_8348',
+  'foo_8349',
+  'foo_8350',
+  'foo_8351',
+  'foo_8352',
+  'foo_8353',
+  'foo_8354',
+  'foo_8355',
+  'foo_8356',
+  'foo_8357',
+  'foo_8358',
+  'foo_8359',
+  'foo_8360',
+  'foo_8361',
+  'foo_8362',
+  'foo_8363',
+  'foo_8364',
+  'foo_8365',
+  'foo_8366',
+  'foo_8367',
+  'foo_8368',
+  'foo_8369',
+  'foo_8370',
+  'foo_8371',
+  'foo_8372',
+  'foo_8373',
+  'foo_8374',
+  'foo_8375',
+  'foo_8376',
+  'foo_8377',
+  'foo_8378',
+  'foo_8379',
+  'foo_8380',
+  'foo_8381',
+  'foo_8382',
+  'foo_8383',
+  'foo_8384',
+  'foo_8385',
+  'foo_8386',
+  'foo_8387',
+  'foo_8388',
+  'foo_8389',
+  'foo_8390',
+  'foo_8391',
+  'foo_8392',
+  'foo_8393',
+  'foo_8394',
+  'foo_8395',
+  'foo_8396',
+  'foo_8397',
+  'foo_8398',
+  'foo_8399',
+  'foo_8400',
+  'foo_8401',
+  'foo_8402',
+  'foo_8403',
+  'foo_8404',
+  'foo_8405',
+  'foo_8406',
+  'foo_8407',
+  'foo_8408',
+  'foo_8409',
+  'foo_8410',
+  'foo_8411',
+  'foo_8412',
+  'foo_8413',
+  'foo_8414',
+  'foo_8415',
+  'foo_8416',
+  'foo_8417',
+  'foo_8418',
+  'foo_8419',
+  'foo_8420',
+  'foo_8421',
+  'foo_8422',
+  'foo_8423',
+  'foo_8424',
+  'foo_8425',
+  'foo_8426',
+  'foo_8427',
+  'foo_8428',
+  'foo_8429',
+  'foo_8430',
+  'foo_8431',
+  'foo_8432',
+  'foo_8433',
+  'foo_8434',
+  'foo_8435',
+  'foo_8436',
+  'foo_8437',
+  'foo_8438',
+  'foo_8439',
+  'foo_8440',
+  'foo_8441',
+  'foo_8442',
+  'foo_8443',
+  'foo_8444',
+  'foo_8445',
+  'foo_8446',
+  'foo_8447',
+  'foo_8448',
+  'foo_8449',
+  'foo_8450',
+  'foo_8451',
+  'foo_8452',
+  'foo_8453',
+  'foo_8454',
+  'foo_8455',
+  'foo_8456',
+  'foo_8457',
+  'foo_8458',
+  'foo_8459',
+  'foo_8460',
+  'foo_8461',
+  'foo_8462',
+  'foo_8463',
+  'foo_8464',
+  'foo_8465',
+  'foo_8466',
+  'foo_8467',
+  'foo_8468',
+  'foo_8469',
+  'foo_8470',
+  'foo_8471',
+  'foo_8472',
+  'foo_8473',
+  'foo_8474',
+  'foo_8475',
+  'foo_8476',
+  'foo_8477',
+  'foo_8478',
+  'foo_8479',
+  'foo_8480',
+  'foo_8481',
+  'foo_8482',
+  'foo_8483',
+  'foo_8484',
+  'foo_8485',
+  'foo_8486',
+  'foo_8487',
+  'foo_8488',
+  'foo_8489',
+  'foo_8490',
+  'foo_8491',
+  'foo_8492',
+  'foo_8493',
+  'foo_8494',
+  'foo_8495',
+  'foo_8496',
+  'foo_8497',
+  'foo_8498',
+  'foo_8499',
+  'foo_8500',
+  'foo_8501',
+  'foo_8502',
+  'foo_8503',
+  'foo_8504',
+  'foo_8505',
+  'foo_8506',
+  'foo_8507',
+  'foo_8508',
+  'foo_8509',
+  'foo_8510',
+  'foo_8511',
+  'foo_8512',
+  'foo_8513',
+  'foo_8514',
+  'foo_8515',
+  'foo_8516',
+  'foo_8517',
+  'foo_8518',
+  'foo_8519',
+  'foo_8520',
+  'foo_8521',
+  'foo_8522',
+  'foo_8523',
+  'foo_8524',
+  'foo_8525',
+  'foo_8526',
+  'foo_8527',
+  'foo_8528',
+  'foo_8529',
+  'foo_8530',
+  'foo_8531',
+  'foo_8532',
+  'foo_8533',
+  'foo_8534',
+  'foo_8535',
+  'foo_8536',
+  'foo_8537',
+  'foo_8538',
+  'foo_8539',
+  'foo_8540',
+  'foo_8541',
+  'foo_8542',
+  'foo_8543',
+  'foo_8544',
+  'foo_8545',
+  'foo_8546',
+  'foo_8547',
+  'foo_8548',
+  'foo_8549',
+  'foo_8550',
+  'foo_8551',
+  'foo_8552',
+  'foo_8553',
+  'foo_8554',
+  'foo_8555',
+  'foo_8556',
+  'foo_8557',
+  'foo_8558',
+  'foo_8559',
+  'foo_8560',
+  'foo_8561',
+  'foo_8562',
+  'foo_8563',
+  'foo_8564',
+  'foo_8565',
+  'foo_8566',
+  'foo_8567',
+  'foo_8568',
+  'foo_8569',
+  'foo_8570',
+  'foo_8571',
+  'foo_8572',
+  'foo_8573',
+  'foo_8574',
+  'foo_8575',
+  'foo_8576',
+  'foo_8577',
+  'foo_8578',
+  'foo_8579',
+  'foo_8580',
+  'foo_8581',
+  'foo_8582',
+  'foo_8583',
+  'foo_8584',
+  'foo_8585',
+  'foo_8586',
+  'foo_8587',
+  'foo_8588',
+  'foo_8589',
+  'foo_8590',
+  'foo_8591',
+  'foo_8592',
+  'foo_8593',
+  'foo_8594',
+  'foo_8595',
+  'foo_8596',
+  'foo_8597',
+  'foo_8598',
+  'foo_8599',
+  'foo_8600',
+  'foo_8601',
+  'foo_8602',
+  'foo_8603',
+  'foo_8604',
+  'foo_8605',
+  'foo_8606',
+  'foo_8607',
+  'foo_8608',
+  'foo_8609',
+  'foo_8610',
+  'foo_8611',
+  'foo_8612',
+  'foo_8613',
+  'foo_8614',
+  'foo_8615',
+  'foo_8616',
+  'foo_8617',
+  'foo_8618',
+  'foo_8619',
+  'foo_8620',
+  'foo_8621',
+  'foo_8622',
+  'foo_8623',
+  'foo_8624',
+  'foo_8625',
+  'foo_8626',
+  'foo_8627',
+  'foo_8628',
+  'foo_8629',
+  'foo_8630',
+  'foo_8631',
+  'foo_8632',
+  'foo_8633',
+  'foo_8634',
+  'foo_8635',
+  'foo_8636',
+  'foo_8637',
+  'foo_8638',
+  'foo_8639',
+  'foo_8640',
+  'foo_8641',
+  'foo_8642',
+  'foo_8643',
+  'foo_8644',
+  'foo_8645',
+  'foo_8646',
+  'foo_8647',
+  'foo_8648',
+  'foo_8649',
+  'foo_8650',
+  'foo_8651',
+  'foo_8652',
+  'foo_8653',
+  'foo_8654',
+  'foo_8655',
+  'foo_8656',
+  'foo_8657',
+  'foo_8658',
+  'foo_8659',
+  'foo_8660',
+  'foo_8661',
+  'foo_8662',
+  'foo_8663',
+  'foo_8664',
+  'foo_8665',
+  'foo_8666',
+  'foo_8667',
+  'foo_8668',
+  'foo_8669',
+  'foo_8670',
+  'foo_8671',
+  'foo_8672',
+  'foo_8673',
+  'foo_8674',
+  'foo_8675',
+  'foo_8676',
+  'foo_8677',
+  'foo_8678',
+  'foo_8679',
+  'foo_8680',
+  'foo_8681',
+  'foo_8682',
+  'foo_8683',
+  'foo_8684',
+  'foo_8685',
+  'foo_8686',
+  'foo_8687',
+  'foo_8688',
+  'foo_8689',
+  'foo_8690',
+  'foo_8691',
+  'foo_8692',
+  'foo_8693',
+  'foo_8694',
+  'foo_8695',
+  'foo_8696',
+  'foo_8697',
+  'foo_8698',
+  'foo_8699',
+  'foo_8700',
+  'foo_8701',
+  'foo_8702',
+  'foo_8703',
+  'foo_8704',
+  'foo_8705',
+  'foo_8706',
+  'foo_8707',
+  'foo_8708',
+  'foo_8709',
+  'foo_8710',
+  'foo_8711',
+  'foo_8712',
+  'foo_8713',
+  'foo_8714',
+  'foo_8715',
+  'foo_8716',
+  'foo_8717',
+  'foo_8718',
+  'foo_8719',
+  'foo_8720',
+  'foo_8721',
+  'foo_8722',
+  'foo_8723',
+  'foo_8724',
+  'foo_8725',
+  'foo_8726',
+  'foo_8727',
+  'foo_8728',
+  'foo_8729',
+  'foo_8730',
+  'foo_8731',
+  'foo_8732',
+  'foo_8733',
+  'foo_8734',
+  'foo_8735',
+  'foo_8736',
+  'foo_8737',
+  'foo_8738',
+  'foo_8739',
+  'foo_8740',
+  'foo_8741',
+  'foo_8742',
+  'foo_8743',
+  'foo_8744',
+  'foo_8745',
+  'foo_8746',
+  'foo_8747',
+  'foo_8748',
+  'foo_8749',
+  'foo_8750',
+  'foo_8751',
+  'foo_8752',
+  'foo_8753',
+  'foo_8754',
+  'foo_8755',
+  'foo_8756',
+  'foo_8757',
+  'foo_8758',
+  'foo_8759',
+  'foo_8760',
+  'foo_8761',
+  'foo_8762',
+  'foo_8763',
+  'foo_8764',
+  'foo_8765',
+  'foo_8766',
+  'foo_8767',
+  'foo_8768',
+  'foo_8769',
+  'foo_8770',
+  'foo_8771',
+  'foo_8772',
+  'foo_8773',
+  'foo_8774',
+  'foo_8775',
+  'foo_8776',
+  'foo_8777',
+  'foo_8778',
+  'foo_8779',
+  'foo_8780',
+  'foo_8781',
+  'foo_8782',
+  'foo_8783',
+  'foo_8784',
+  'foo_8785',
+  'foo_8786',
+  'foo_8787',
+  'foo_8788',
+  'foo_8789',
+  'foo_8790',
+  'foo_8791',
+  'foo_8792',
+  'foo_8793',
+  'foo_8794',
+  'foo_8795',
+  'foo_8796',
+  'foo_8797',
+  'foo_8798',
+  'foo_8799',
+  'foo_8800',
+  'foo_8801',
+  'foo_8802',
+  'foo_8803',
+  'foo_8804',
+  'foo_8805',
+  'foo_8806',
+  'foo_8807',
+  'foo_8808',
+  'foo_8809',
+  'foo_8810',
+  'foo_8811',
+  'foo_8812',
+  'foo_8813',
+  'foo_8814',
+  'foo_8815',
+  'foo_8816',
+  'foo_8817',
+  'foo_8818',
+  'foo_8819',
+  'foo_8820',
+  'foo_8821',
+  'foo_8822',
+  'foo_8823',
+  'foo_8824',
+  'foo_8825',
+  'foo_8826',
+  'foo_8827',
+  'foo_8828',
+  'foo_8829',
+  'foo_8830',
+  'foo_8831',
+  'foo_8832',
+  'foo_8833',
+  'foo_8834',
+  'foo_8835',
+  'foo_8836',
+  'foo_8837',
+  'foo_8838',
+  'foo_8839',
+  'foo_8840',
+  'foo_8841',
+  'foo_8842',
+  'foo_8843',
+  'foo_8844',
+  'foo_8845',
+  'foo_8846',
+  'foo_8847',
+  'foo_8848',
+  'foo_8849',
+  'foo_8850',
+  'foo_8851',
+  'foo_8852',
+  'foo_8853',
+  'foo_8854',
+  'foo_8855',
+  'foo_8856',
+  'foo_8857',
+  'foo_8858',
+  'foo_8859',
+  'foo_8860',
+  'foo_8861',
+  'foo_8862',
+  'foo_8863',
+  'foo_8864',
+  'foo_8865',
+  'foo_8866',
+  'foo_8867',
+  'foo_8868',
+  'foo_8869',
+  'foo_8870',
+  'foo_8871',
+  'foo_8872',
+  'foo_8873',
+  'foo_8874',
+  'foo_8875',
+  'foo_8876',
+  'foo_8877',
+  'foo_8878',
+  'foo_8879',
+  'foo_8880',
+  'foo_8881',
+  'foo_8882',
+  'foo_8883',
+  'foo_8884',
+  'foo_8885',
+  'foo_8886',
+  'foo_8887',
+  'foo_8888',
+  'foo_8889',
+  'foo_8890',
+  'foo_8891',
+  'foo_8892',
+  'foo_8893',
+  'foo_8894',
+  'foo_8895',
+  'foo_8896',
+  'foo_8897',
+  'foo_8898',
+  'foo_8899',
+  'foo_8900',
+  'foo_8901',
+  'foo_8902',
+  'foo_8903',
+  'foo_8904',
+  'foo_8905',
+  'foo_8906',
+  'foo_8907',
+  'foo_8908',
+  'foo_8909',
+  'foo_8910',
+  'foo_8911',
+  'foo_8912',
+  'foo_8913',
+  'foo_8914',
+  'foo_8915',
+  'foo_8916',
+  'foo_8917',
+  'foo_8918',
+  'foo_8919',
+  'foo_8920',
+  'foo_8921',
+  'foo_8922',
+  'foo_8923',
+  'foo_8924',
+  'foo_8925',
+  'foo_8926',
+  'foo_8927',
+  'foo_8928',
+  'foo_8929',
+  'foo_8930',
+  'foo_8931',
+  'foo_8932',
+  'foo_8933',
+  'foo_8934',
+  'foo_8935',
+  'foo_8936',
+  'foo_8937',
+  'foo_8938',
+  'foo_8939',
+  'foo_8940',
+  'foo_8941',
+  'foo_8942',
+  'foo_8943',
+  'foo_8944',
+  'foo_8945',
+  'foo_8946',
+  'foo_8947',
+  'foo_8948',
+  'foo_8949',
+  'foo_8950',
+  'foo_8951',
+  'foo_8952',
+  'foo_8953',
+  'foo_8954',
+  'foo_8955',
+  'foo_8956',
+  'foo_8957',
+  'foo_8958',
+  'foo_8959',
+  'foo_8960',
+  'foo_8961',
+  'foo_8962',
+  'foo_8963',
+  'foo_8964',
+  'foo_8965',
+  'foo_8966',
+  'foo_8967',
+  'foo_8968',
+  'foo_8969',
+  'foo_8970',
+  'foo_8971',
+  'foo_8972',
+  'foo_8973',
+  'foo_8974',
+  'foo_8975',
+  'foo_8976',
+  'foo_8977',
+  'foo_8978',
+  'foo_8979',
+  'foo_8980',
+  'foo_8981',
+  'foo_8982',
+  'foo_8983',
+  'foo_8984',
+  'foo_8985',
+  'foo_8986',
+  'foo_8987',
+  'foo_8988',
+  'foo_8989',
+  'foo_8990',
+  'foo_8991',
+  'foo_8992',
+  'foo_8993',
+  'foo_8994',
+  'foo_8995',
+  'foo_8996',
+  'foo_8997',
+  'foo_8998',
+  'foo_8999',
+  'foo_9000',
+  'foo_9001',
+  'foo_9002',
+  'foo_9003',
+  'foo_9004',
+  'foo_9005',
+  'foo_9006',
+  'foo_9007',
+  'foo_9008',
+  'foo_9009',
+  'foo_9010',
+  'foo_9011',
+  'foo_9012',
+  'foo_9013',
+  'foo_9014',
+  'foo_9015',
+  'foo_9016',
+  'foo_9017',
+  'foo_9018',
+  'foo_9019',
+  'foo_9020',
+  'foo_9021',
+  'foo_9022',
+  'foo_9023',
+  'foo_9024',
+  'foo_9025',
+  'foo_9026',
+  'foo_9027',
+  'foo_9028',
+  'foo_9029',
+  'foo_9030',
+  'foo_9031',
+  'foo_9032',
+  'foo_9033',
+  'foo_9034',
+  'foo_9035',
+  'foo_9036',
+  'foo_9037',
+  'foo_9038',
+  'foo_9039',
+  'foo_9040',
+  'foo_9041',
+  'foo_9042',
+  'foo_9043',
+  'foo_9044',
+  'foo_9045',
+  'foo_9046',
+  'foo_9047',
+  'foo_9048',
+  'foo_9049',
+  'foo_9050',
+  'foo_9051',
+  'foo_9052',
+  'foo_9053',
+  'foo_9054',
+  'foo_9055',
+  'foo_9056',
+  'foo_9057',
+  'foo_9058',
+  'foo_9059',
+  'foo_9060',
+  'foo_9061',
+  'foo_9062',
+  'foo_9063',
+  'foo_9064',
+  'foo_9065',
+  'foo_9066',
+  'foo_9067',
+  'foo_9068',
+  'foo_9069',
+  'foo_9070',
+  'foo_9071',
+  'foo_9072',
+  'foo_9073',
+  'foo_9074',
+  'foo_9075',
+  'foo_9076',
+  'foo_9077',
+  'foo_9078',
+  'foo_9079',
+  'foo_9080',
+  'foo_9081',
+  'foo_9082',
+  'foo_9083',
+  'foo_9084',
+  'foo_9085',
+  'foo_9086',
+  'foo_9087',
+  'foo_9088',
+  'foo_9089',
+  'foo_9090',
+  'foo_9091',
+  'foo_9092',
+  'foo_9093',
+  'foo_9094',
+  'foo_9095',
+  'foo_9096',
+  'foo_9097',
+  'foo_9098',
+  'foo_9099',
+  'foo_9100',
+  'foo_9101',
+  'foo_9102',
+  'foo_9103',
+  'foo_9104',
+  'foo_9105',
+  'foo_9106',
+  'foo_9107',
+  'foo_9108',
+  'foo_9109',
+  'foo_9110',
+  'foo_9111',
+  'foo_9112',
+  'foo_9113',
+  'foo_9114',
+  'foo_9115',
+  'foo_9116',
+  'foo_9117',
+  'foo_9118',
+  'foo_9119',
+  'foo_9120',
+  'foo_9121',
+  'foo_9122',
+  'foo_9123',
+  'foo_9124',
+  'foo_9125',
+  'foo_9126',
+  'foo_9127',
+  'foo_9128',
+  'foo_9129',
+  'foo_9130',
+  'foo_9131',
+  'foo_9132',
+  'foo_9133',
+  'foo_9134',
+  'foo_9135',
+  'foo_9136',
+  'foo_9137',
+  'foo_9138',
+  'foo_9139',
+  'foo_9140',
+  'foo_9141',
+  'foo_9142',
+  'foo_9143',
+  'foo_9144',
+  'foo_9145',
+  'foo_9146',
+  'foo_9147',
+  'foo_9148',
+  'foo_9149',
+  'foo_9150',
+  'foo_9151',
+  'foo_9152',
+  'foo_9153',
+  'foo_9154',
+  'foo_9155',
+  'foo_9156',
+  'foo_9157',
+  'foo_9158',
+  'foo_9159',
+  'foo_9160',
+  'foo_9161',
+  'foo_9162',
+  'foo_9163',
+  'foo_9164',
+  'foo_9165',
+  'foo_9166',
+  'foo_9167',
+  'foo_9168',
+  'foo_9169',
+  'foo_9170',
+  'foo_9171',
+  'foo_9172',
+  'foo_9173',
+  'foo_9174',
+  'foo_9175',
+  'foo_9176',
+  'foo_9177',
+  'foo_9178',
+  'foo_9179',
+  'foo_9180',
+  'foo_9181',
+  'foo_9182',
+  'foo_9183',
+  'foo_9184',
+  'foo_9185',
+  'foo_9186',
+  'foo_9187',
+  'foo_9188',
+  'foo_9189',
+  'foo_9190',
+  'foo_9191',
+  'foo_9192',
+  'foo_9193',
+  'foo_9194',
+  'foo_9195',
+  'foo_9196',
+  'foo_9197',
+  'foo_9198',
+  'foo_9199',
+  'foo_9200',
+  'foo_9201',
+  'foo_9202',
+  'foo_9203',
+  'foo_9204',
+  'foo_9205',
+  'foo_9206',
+  'foo_9207',
+  'foo_9208',
+  'foo_9209',
+  'foo_9210',
+  'foo_9211',
+  'foo_9212',
+  'foo_9213',
+  'foo_9214',
+  'foo_9215',
+  'foo_9216',
+  'foo_9217',
+  'foo_9218',
+  'foo_9219',
+  'foo_9220',
+  'foo_9221',
+  'foo_9222',
+  'foo_9223',
+  'foo_9224',
+  'foo_9225',
+  'foo_9226',
+  'foo_9227',
+  'foo_9228',
+  'foo_9229',
+  'foo_9230',
+  'foo_9231',
+  'foo_9232',
+  'foo_9233',
+  'foo_9234',
+  'foo_9235',
+  'foo_9236',
+  'foo_9237',
+  'foo_9238',
+  'foo_9239',
+  'foo_9240',
+  'foo_9241',
+  'foo_9242',
+  'foo_9243',
+  'foo_9244',
+  'foo_9245',
+  'foo_9246',
+  'foo_9247',
+  'foo_9248',
+  'foo_9249',
+  'foo_9250',
+  'foo_9251',
+  'foo_9252',
+  'foo_9253',
+  'foo_9254',
+  'foo_9255',
+  'foo_9256',
+  'foo_9257',
+  'foo_9258',
+  'foo_9259',
+  'foo_9260',
+  'foo_9261',
+  'foo_9262',
+  'foo_9263',
+  'foo_9264',
+  'foo_9265',
+  'foo_9266',
+  'foo_9267',
+  'foo_9268',
+  'foo_9269',
+  'foo_9270',
+  'foo_9271',
+  'foo_9272',
+  'foo_9273',
+  'foo_9274',
+  'foo_9275',
+  'foo_9276',
+  'foo_9277',
+  'foo_9278',
+  'foo_9279',
+  'foo_9280',
+  'foo_9281',
+  'foo_9282',
+  'foo_9283',
+  'foo_9284',
+  'foo_9285',
+  'foo_9286',
+  'foo_9287',
+  'foo_9288',
+  'foo_9289',
+  'foo_9290',
+  'foo_9291',
+  'foo_9292',
+  'foo_9293',
+  'foo_9294',
+  'foo_9295',
+  'foo_9296',
+  'foo_9297',
+  'foo_9298',
+  'foo_9299',
+  'foo_9300',
+  'foo_9301',
+  'foo_9302',
+  'foo_9303',
+  'foo_9304',
+  'foo_9305',
+  'foo_9306',
+  'foo_9307',
+  'foo_9308',
+  'foo_9309',
+  'foo_9310',
+  'foo_9311',
+  'foo_9312',
+  'foo_9313',
+  'foo_9314',
+  'foo_9315',
+  'foo_9316',
+  'foo_9317',
+  'foo_9318',
+  'foo_9319',
+  'foo_9320',
+  'foo_9321',
+  'foo_9322',
+  'foo_9323',
+  'foo_9324',
+  'foo_9325',
+  'foo_9326',
+  'foo_9327',
+  'foo_9328',
+  'foo_9329',
+  'foo_9330',
+  'foo_9331',
+  'foo_9332',
+  'foo_9333',
+  'foo_9334',
+  'foo_9335',
+  'foo_9336',
+  'foo_9337',
+  'foo_9338',
+  'foo_9339',
+  'foo_9340',
+  'foo_9341',
+  'foo_9342',
+  'foo_9343',
+  'foo_9344',
+  'foo_9345',
+  'foo_9346',
+  'foo_9347',
+  'foo_9348',
+  'foo_9349',
+  'foo_9350',
+  'foo_9351',
+  'foo_9352',
+  'foo_9353',
+  'foo_9354',
+  'foo_9355',
+  'foo_9356',
+  'foo_9357',
+  'foo_9358',
+  'foo_9359',
+  'foo_9360',
+  'foo_9361',
+  'foo_9362',
+  'foo_9363',
+  'foo_9364',
+  'foo_9365',
+  'foo_9366',
+  'foo_9367',
+  'foo_9368',
+  'foo_9369',
+  'foo_9370',
+  'foo_9371',
+  'foo_9372',
+  'foo_9373',
+  'foo_9374',
+  'foo_9375',
+  'foo_9376',
+  'foo_9377',
+  'foo_9378',
+  'foo_9379',
+  'foo_9380',
+  'foo_9381',
+  'foo_9382',
+  'foo_9383',
+  'foo_9384',
+  'foo_9385',
+  'foo_9386',
+  'foo_9387',
+  'foo_9388',
+  'foo_9389',
+  'foo_9390',
+  'foo_9391',
+  'foo_9392',
+  'foo_9393',
+  'foo_9394',
+  'foo_9395',
+  'foo_9396',
+  'foo_9397',
+  'foo_9398',
+  'foo_9399',
+  'foo_9400',
+  'foo_9401',
+  'foo_9402',
+  'foo_9403',
+  'foo_9404',
+  'foo_9405',
+  'foo_9406',
+  'foo_9407',
+  'foo_9408',
+  'foo_9409',
+  'foo_9410',
+  'foo_9411',
+  'foo_9412',
+  'foo_9413',
+  'foo_9414',
+  'foo_9415',
+  'foo_9416',
+  'foo_9417',
+  'foo_9418',
+  'foo_9419',
+  'foo_9420',
+  'foo_9421',
+  'foo_9422',
+  'foo_9423',
+  'foo_9424',
+  'foo_9425',
+  'foo_9426',
+  'foo_9427',
+  'foo_9428',
+  'foo_9429',
+  'foo_9430',
+  'foo_9431',
+  'foo_9432',
+  'foo_9433',
+  'foo_9434',
+  'foo_9435',
+  'foo_9436',
+  'foo_9437',
+  'foo_9438',
+  'foo_9439',
+  'foo_9440',
+  'foo_9441',
+  'foo_9442',
+  'foo_9443',
+  'foo_9444',
+  'foo_9445',
+  'foo_9446',
+  'foo_9447',
+  'foo_9448',
+  'foo_9449',
+  'foo_9450',
+  'foo_9451',
+  'foo_9452',
+  'foo_9453',
+  'foo_9454',
+  'foo_9455',
+  'foo_9456',
+  'foo_9457',
+  'foo_9458',
+  'foo_9459',
+  'foo_9460',
+  'foo_9461',
+  'foo_9462',
+  'foo_9463',
+  'foo_9464',
+  'foo_9465',
+  'foo_9466',
+  'foo_9467',
+  'foo_9468',
+  'foo_9469',
+  'foo_9470',
+  'foo_9471',
+  'foo_9472',
+  'foo_9473',
+  'foo_9474',
+  'foo_9475',
+  'foo_9476',
+  'foo_9477',
+  'foo_9478',
+  'foo_9479',
+  'foo_9480',
+  'foo_9481',
+  'foo_9482',
+  'foo_9483',
+  'foo_9484',
+  'foo_9485',
+  'foo_9486',
+  'foo_9487',
+  'foo_9488',
+  'foo_9489',
+  'foo_9490',
+  'foo_9491',
+  'foo_9492',
+  'foo_9493',
+  'foo_9494',
+  'foo_9495',
+  'foo_9496',
+  'foo_9497',
+  'foo_9498',
+  'foo_9499',
+  'foo_9500',
+  'foo_9501',
+  'foo_9502',
+  'foo_9503',
+  'foo_9504',
+  'foo_9505',
+  'foo_9506',
+  'foo_9507',
+  'foo_9508',
+  'foo_9509',
+  'foo_9510',
+  'foo_9511',
+  'foo_9512',
+  'foo_9513',
+  'foo_9514',
+  'foo_9515',
+  'foo_9516',
+  'foo_9517',
+  'foo_9518',
+  'foo_9519',
+  'foo_9520',
+  'foo_9521',
+  'foo_9522',
+  'foo_9523',
+  'foo_9524',
+  'foo_9525',
+  'foo_9526',
+  'foo_9527',
+  'foo_9528',
+  'foo_9529',
+  'foo_9530',
+  'foo_9531',
+  'foo_9532',
+  'foo_9533',
+  'foo_9534',
+  'foo_9535',
+  'foo_9536',
+  'foo_9537',
+  'foo_9538',
+  'foo_9539',
+  'foo_9540',
+  'foo_9541',
+  'foo_9542',
+  'foo_9543',
+  'foo_9544',
+  'foo_9545',
+  'foo_9546',
+  'foo_9547',
+  'foo_9548',
+  'foo_9549',
+  'foo_9550',
+  'foo_9551',
+  'foo_9552',
+  'foo_9553',
+  'foo_9554',
+  'foo_9555',
+  'foo_9556',
+  'foo_9557',
+  'foo_9558',
+  'foo_9559',
+  'foo_9560',
+  'foo_9561',
+  'foo_9562',
+  'foo_9563',
+  'foo_9564',
+  'foo_9565',
+  'foo_9566',
+  'foo_9567',
+  'foo_9568',
+  'foo_9569',
+  'foo_9570',
+  'foo_9571',
+  'foo_9572',
+  'foo_9573',
+  'foo_9574',
+  'foo_9575',
+  'foo_9576',
+  'foo_9577',
+  'foo_9578',
+  'foo_9579',
+  'foo_9580',
+  'foo_9581',
+  'foo_9582',
+  'foo_9583',
+  'foo_9584',
+  'foo_9585',
+  'foo_9586',
+  'foo_9587',
+  'foo_9588',
+  'foo_9589',
+  'foo_9590',
+  'foo_9591',
+  'foo_9592',
+  'foo_9593',
+  'foo_9594',
+  'foo_9595',
+  'foo_9596',
+  'foo_9597',
+  'foo_9598',
+  'foo_9599',
+  'foo_9600',
+  'foo_9601',
+  'foo_9602',
+  'foo_9603',
+  'foo_9604',
+  'foo_9605',
+  'foo_9606',
+  'foo_9607',
+  'foo_9608',
+  'foo_9609',
+  'foo_9610',
+  'foo_9611',
+  'foo_9612',
+  'foo_9613',
+  'foo_9614',
+  'foo_9615',
+  'foo_9616',
+  'foo_9617',
+  'foo_9618',
+  'foo_9619',
+  'foo_9620',
+  'foo_9621',
+  'foo_9622',
+  'foo_9623',
+  'foo_9624',
+  'foo_9625',
+  'foo_9626',
+  'foo_9627',
+  'foo_9628',
+  'foo_9629',
+  'foo_9630',
+  'foo_9631',
+  'foo_9632',
+  'foo_9633',
+  'foo_9634',
+  'foo_9635',
+  'foo_9636',
+  'foo_9637',
+  'foo_9638',
+  'foo_9639',
+  'foo_9640',
+  'foo_9641',
+  'foo_9642',
+  'foo_9643',
+  'foo_9644',
+  'foo_9645',
+  'foo_9646',
+  'foo_9647',
+  'foo_9648',
+  'foo_9649',
+  'foo_9650',
+  'foo_9651',
+  'foo_9652',
+  'foo_9653',
+  'foo_9654',
+  'foo_9655',
+  'foo_9656',
+  'foo_9657',
+  'foo_9658',
+  'foo_9659',
+  'foo_9660',
+  'foo_9661',
+  'foo_9662',
+  'foo_9663',
+  'foo_9664',
+  'foo_9665',
+  'foo_9666',
+  'foo_9667',
+  'foo_9668',
+  'foo_9669',
+  'foo_9670',
+  'foo_9671',
+  'foo_9672',
+  'foo_9673',
+  'foo_9674',
+  'foo_9675',
+  'foo_9676',
+  'foo_9677',
+  'foo_9678',
+  'foo_9679',
+  'foo_9680',
+  'foo_9681',
+  'foo_9682',
+  'foo_9683',
+  'foo_9684',
+  'foo_9685',
+  'foo_9686',
+  'foo_9687',
+  'foo_9688',
+  'foo_9689',
+  'foo_9690',
+  'foo_9691',
+  'foo_9692',
+  'foo_9693',
+  'foo_9694',
+  'foo_9695',
+  'foo_9696',
+  'foo_9697',
+  'foo_9698',
+  'foo_9699',
+  'foo_9700',
+  'foo_9701',
+  'foo_9702',
+  'foo_9703',
+  'foo_9704',
+  'foo_9705',
+  'foo_9706',
+  'foo_9707',
+  'foo_9708',
+  'foo_9709',
+  'foo_9710',
+  'foo_9711',
+  'foo_9712',
+  'foo_9713',
+  'foo_9714',
+  'foo_9715',
+  'foo_9716',
+  'foo_9717',
+  'foo_9718',
+  'foo_9719',
+  'foo_9720',
+  'foo_9721',
+  'foo_9722',
+  'foo_9723',
+  'foo_9724',
+  'foo_9725',
+  'foo_9726',
+  'foo_9727',
+  'foo_9728',
+  'foo_9729',
+  'foo_9730',
+  'foo_9731',
+  'foo_9732',
+  'foo_9733',
+  'foo_9734',
+  'foo_9735',
+  'foo_9736',
+  'foo_9737',
+  'foo_9738',
+  'foo_9739',
+  'foo_9740',
+  'foo_9741',
+  'foo_9742',
+  'foo_9743',
+  'foo_9744',
+  'foo_9745',
+  'foo_9746',
+  'foo_9747',
+  'foo_9748',
+  'foo_9749',
+  'foo_9750',
+  'foo_9751',
+  'foo_9752',
+  'foo_9753',
+  'foo_9754',
+  'foo_9755',
+  'foo_9756',
+  'foo_9757',
+  'foo_9758',
+  'foo_9759',
+  'foo_9760',
+  'foo_9761',
+  'foo_9762',
+  'foo_9763',
+  'foo_9764',
+  'foo_9765',
+  'foo_9766',
+  'foo_9767',
+  'foo_9768',
+  'foo_9769',
+  'foo_9770',
+  'foo_9771',
+  'foo_9772',
+  'foo_9773',
+  'foo_9774',
+  'foo_9775',
+  'foo_9776',
+  'foo_9777',
+  'foo_9778',
+  'foo_9779',
+  'foo_9780',
+  'foo_9781',
+  'foo_9782',
+  'foo_9783',
+  'foo_9784',
+  'foo_9785',
+  'foo_9786',
+  'foo_9787',
+  'foo_9788',
+  'foo_9789',
+  'foo_9790',
+  'foo_9791',
+  'foo_9792',
+  'foo_9793',
+  'foo_9794',
+  'foo_9795',
+  'foo_9796',
+  'foo_9797',
+  'foo_9798',
+  'foo_9799',
+  'foo_9800',
+  'foo_9801',
+  'foo_9802',
+  'foo_9803',
+  'foo_9804',
+  'foo_9805',
+  'foo_9806',
+  'foo_9807',
+  'foo_9808',
+  'foo_9809',
+  'foo_9810',
+  'foo_9811',
+  'foo_9812',
+  'foo_9813',
+  'foo_9814',
+  'foo_9815',
+  'foo_9816',
+  'foo_9817',
+  'foo_9818',
+  'foo_9819',
+  'foo_9820',
+  'foo_9821',
+  'foo_9822',
+  'foo_9823',
+  'foo_9824',
+  'foo_9825',
+  'foo_9826',
+  'foo_9827',
+  'foo_9828',
+  'foo_9829',
+  'foo_9830',
+  'foo_9831',
+  'foo_9832',
+  'foo_9833',
+  'foo_9834',
+  'foo_9835',
+  'foo_9836',
+  'foo_9837',
+  'foo_9838',
+  'foo_9839',
+  'foo_9840',
+  'foo_9841',
+  'foo_9842',
+  'foo_9843',
+  'foo_9844',
+  'foo_9845',
+  'foo_9846',
+  'foo_9847',
+  'foo_9848',
+  'foo_9849',
+  'foo_9850',
+  'foo_9851',
+  'foo_9852',
+  'foo_9853',
+  'foo_9854',
+  'foo_9855',
+  'foo_9856',
+  'foo_9857',
+  'foo_9858',
+  'foo_9859',
+  'foo_9860',
+  'foo_9861',
+  'foo_9862',
+  'foo_9863',
+  'foo_9864',
+  'foo_9865',
+  'foo_9866',
+  'foo_9867',
+  'foo_9868',
+  'foo_9869',
+  'foo_9870',
+  'foo_9871',
+  'foo_9872',
+  'foo_9873',
+  'foo_9874',
+  'foo_9875',
+  'foo_9876',
+  'foo_9877',
+  'foo_9878',
+  'foo_9879',
+  'foo_9880',
+  'foo_9881',
+  'foo_9882',
+  'foo_9883',
+  'foo_9884',
+  'foo_9885',
+  'foo_9886',
+  'foo_9887',
+  'foo_9888',
+  'foo_9889',
+  'foo_9890',
+  'foo_9891',
+  'foo_9892',
+  'foo_9893',
+  'foo_9894',
+  'foo_9895',
+  'foo_9896',
+  'foo_9897',
+  'foo_9898',
+  'foo_9899',
+  'foo_9900',
+  'foo_9901',
+  'foo_9902',
+  'foo_9903',
+  'foo_9904',
+  'foo_9905',
+  'foo_9906',
+  'foo_9907',
+  'foo_9908',
+  'foo_9909',
+  'foo_9910',
+  'foo_9911',
+  'foo_9912',
+  'foo_9913',
+  'foo_9914',
+  'foo_9915',
+  'foo_9916',
+  'foo_9917',
+  'foo_9918',
+  'foo_9919',
+  'foo_9920',
+  'foo_9921',
+  'foo_9922',
+  'foo_9923',
+  'foo_9924',
+  'foo_9925',
+  'foo_9926',
+  'foo_9927',
+  'foo_9928',
+  'foo_9929',
+  'foo_9930',
+  'foo_9931',
+  'foo_9932',
+  'foo_9933',
+  'foo_9934',
+  'foo_9935',
+  'foo_9936',
+  'foo_9937',
+  'foo_9938',
+  'foo_9939',
+  'foo_9940',
+  'foo_9941',
+  'foo_9942',
+  'foo_9943',
+  'foo_9944',
+  'foo_9945',
+  'foo_9946',
+  'foo_9947',
+  'foo_9948',
+  'foo_9949',
+  'foo_9950',
+  'foo_9951',
+  'foo_9952',
+  'foo_9953',
+  'foo_9954',
+  'foo_9955',
+  'foo_9956',
+  'foo_9957',
+  'foo_9958',
+  'foo_9959',
+  'foo_9960',
+  'foo_9961',
+  'foo_9962',
+  'foo_9963',
+  'foo_9964',
+  'foo_9965',
+  'foo_9966',
+  'foo_9967',
+  'foo_9968',
+  'foo_9969',
+  'foo_9970',
+  'foo_9971',
+  'foo_9972',
+  'foo_9973',
+  'foo_9974',
+  'foo_9975',
+  'foo_9976',
+  'foo_9977',
+  'foo_9978',
+  'foo_9979',
+  'foo_9980',
+  'foo_9981',
+  'foo_9982',
+  'foo_9983',
+  'foo_9984',
+  'foo_9985',
+  'foo_9986',
+  'foo_9987',
+  'foo_9988',
+  'foo_9989',
+  'foo_9990',
+  'foo_9991',
+  'foo_9992',
+  'foo_9993',
+  'foo_9994',
+  'foo_9995',
+  'foo_9996',
+  'foo_9997',
+  'foo_9998',
+  'foo_9999',
+};
diff --git a/tests/language_2/sync_star/sync_star_exception_nested_test.dart b/tests/language_2/sync_star/sync_star_exception_nested_test.dart
new file mode 100644
index 0000000..6c8b702
--- /dev/null
+++ b/tests/language_2/sync_star/sync_star_exception_nested_test.dart
@@ -0,0 +1,55 @@
+// Copyright (c) 2020, 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.
+
+// See: https://github.com/dart-lang/sdk/issues/42466
+
+import 'dart:collection';
+import 'package:expect/expect.dart';
+
+String caughtString;
+
+a() sync* {
+  yield 3;
+  throw 'Throw from a()';
+  yield 4;
+}
+
+b() sync* {
+  yield 2;
+  yield* a();
+  yield 5;
+}
+
+c() sync* {
+  try {
+    yield 1;
+    yield* b();
+    yield 6;
+  } catch (e, st) {
+    caughtString = 'Caught in c()';
+  }
+}
+
+d() sync* {
+  try {
+    yield 0;
+    yield* c();
+    yield 7;
+  } catch (e, st) {
+    caughtString = 'Caught in d()';
+  }
+}
+
+main() {
+  List yields = [];
+  try {
+    for (final e in d()) {
+      yields.add(e);
+    }
+  } catch (e, st) {
+    caughtString = 'Caught in main()';
+  }
+  Expect.equals('Caught in c()', caughtString);
+  Expect.listEquals([0, 1, 2, 3, 7], yields);
+}
diff --git a/tests/language_2/sync_star/sync_star_exception_test.dart b/tests/language_2/sync_star/sync_star_exception_test.dart
new file mode 100644
index 0000000..e1db95a
--- /dev/null
+++ b/tests/language_2/sync_star/sync_star_exception_test.dart
@@ -0,0 +1,46 @@
+// Copyright (c) 2020, 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.
+
+// See: https://github.com/dart-lang/sdk/issues/42466
+
+import 'dart:collection';
+import 'package:expect/expect.dart';
+
+var caughtString;
+
+class AlwaysThrowingIterator implements Iterator<int> {
+  bool moveNext() => throw 'moveNext';
+  int get current => throw 'current';
+}
+
+class AlwaysThrowing extends IterableBase<int> {
+  Iterator<int> get iterator => AlwaysThrowingIterator();
+}
+
+Iterable<int> f() sync* {
+  try {
+    yield* AlwaysThrowing();
+  } catch (e, st) {
+    caughtString = 'caught $e in f';
+  }
+}
+
+void g() {
+  try {
+    for (int x in f()) {
+      print(x);
+    }
+  } catch (e, st) {
+    caughtString = 'caught $e in g';
+  }
+}
+
+main() {
+  g();
+  // The spec dictates that if `e` (moveNext, current) throws then `yield* e`
+  // should throw.
+  // I.e. even though the iteration is happening in `g`, the `yield*` is in `f`
+  // so its catch should trigger.
+  Expect.equals('caught moveNext in f', caughtString);
+}
diff --git a/tests/language_2/variable/initializer_super_last_test.dart b/tests/language_2/variable/initializer_super_last_test.dart
index 5a96d03..7e2b0b8 100644
--- a/tests/language_2/variable/initializer_super_last_test.dart
+++ b/tests/language_2/variable/initializer_super_last_test.dart
@@ -39,7 +39,7 @@
   C.cc09(int x)
       : //
         super(),
-//      ^^^^^^^
+//      ^^^^^
 // [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
         x = x;
         //^
@@ -47,7 +47,7 @@
   C.cc10(int x)
       : //
         super.named(),
-//      ^^^^^^^^^^^^^
+//      ^^^^^
 // [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
         x = x;
         //^
@@ -55,7 +55,7 @@
   C.cc11(this.x)
       : //
         super(),
-//      ^^^^^^^
+//      ^^^^^
 // [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
         assert(x == x);
 //      ^
@@ -63,7 +63,7 @@
   C.cc12(this.x)
       : //
         super.named(),
-//      ^^^^^^^^^^^^^
+//      ^^^^^
 // [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
         assert(x == x);
 //      ^
@@ -71,7 +71,7 @@
   C.cc13(int x)
       : //
         super(),
-//      ^^^^^^^
+//      ^^^^^
 // [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
         x = x,
         //^
@@ -82,7 +82,7 @@
   C.cc14(int x)
       : //
         super.named(),
-//      ^^^^^^^^^^^^^
+//      ^^^^^
 // [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
         x = x,
         //^
@@ -93,7 +93,7 @@
   C.cc15(int x)
       : x = x,
         super(),
-//      ^^^^^^^
+//      ^^^^^
 // [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
         assert(x == x);
 //      ^
@@ -101,7 +101,7 @@
   C.cc16(int x)
       : x = x,
         super.named(),
-//      ^^^^^^^^^^^^^
+//      ^^^^^
 // [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
         assert(x == x);
 //      ^
@@ -132,7 +132,7 @@
   const C.cc25(int x)
       : //
         super(),
-//      ^^^^^^^
+//      ^^^^^
 // [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
         x = x;
         //^
@@ -140,7 +140,7 @@
   const C.cc26(int x)
       : //
         super.named(),
-//      ^^^^^^^^^^^^^
+//      ^^^^^
 // [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
         x = x;
         //^
@@ -148,7 +148,7 @@
   const C.cc27(this.x)
       : //
         super(),
-//      ^^^^^^^
+//      ^^^^^
 // [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
         assert(x == x);
 //      ^
@@ -156,7 +156,7 @@
   const C.cc28(this.x)
       : //
         super.named(),
-//      ^^^^^^^^^^^^^
+//      ^^^^^
 // [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
         assert(x == x);
 //      ^
@@ -164,7 +164,7 @@
   const C.cc29(int x)
       : //
         super(),
-//      ^^^^^^^
+//      ^^^^^
 // [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
         x = x,
         //^
@@ -175,7 +175,7 @@
   const C.cc30(int x)
       : //
         super.named(),
-//      ^^^^^^^^^^^^^
+//      ^^^^^
 // [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
         x = x,
         //^
@@ -186,7 +186,7 @@
   const C.cc31(int x)
       : x = x,
         super(),
-//      ^^^^^^^
+//      ^^^^^
 // [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
         assert(x == x);
 //      ^
@@ -194,7 +194,7 @@
   const C.cc32(int x)
       : x = x,
         super.named(),
-//      ^^^^^^^^^^^^^
+//      ^^^^^
 // [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
         assert(x == x);
 //      ^
diff --git a/tests/language_2/vm/allocation_sinking_arrays_test.dart b/tests/language_2/vm/allocation_sinking_arrays_test.dart
new file mode 100644
index 0000000..ed5aa9b
--- /dev/null
+++ b/tests/language_2/vm/allocation_sinking_arrays_test.dart
@@ -0,0 +1,85 @@
+// Copyright (c) 2020, 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.
+
+// VMOptions=--optimization-counter-threshold=100 --deterministic
+
+// Tests allocation sinking of arrays and typed data objects.
+
+import 'dart:typed_data';
+import 'package:expect/expect.dart';
+
+import 'dart:typed_data';
+
+class Vector2 {
+  final Float64List _v2storage;
+
+  @pragma('vm:prefer-inline')
+  Vector2.zero() : _v2storage = Float64List(2);
+
+  @pragma('vm:prefer-inline')
+  factory Vector2(double x, double y) => Vector2.zero()..setValues(x, y);
+
+  @pragma('vm:prefer-inline')
+  factory Vector2.copy(Vector2 other) => Vector2.zero()..setFrom(other);
+
+  @pragma('vm:prefer-inline')
+  Vector2 clone() => Vector2.copy(this);
+
+  @pragma('vm:prefer-inline')
+  void setValues(double x_, double y_) {
+    _v2storage[0] = x_;
+    _v2storage[1] = y_;
+  }
+
+  @pragma('vm:prefer-inline')
+  void setFrom(Vector2 other) {
+    final otherStorage = other._v2storage;
+    _v2storage[1] = otherStorage[1];
+    _v2storage[0] = otherStorage[0];
+  }
+
+  @pragma('vm:prefer-inline')
+  Vector2 operator +(Vector2 other) => clone()..add(other);
+
+  @pragma('vm:prefer-inline')
+  void add(Vector2 arg) {
+    final argStorage = arg._v2storage;
+    _v2storage[0] = _v2storage[0] + argStorage[0];
+    _v2storage[1] = _v2storage[1] + argStorage[1];
+  }
+
+  @pragma('vm:prefer-inline')
+  double get x => _v2storage[0];
+
+  @pragma('vm:prefer-inline')
+  double get y => _v2storage[1];
+}
+
+@pragma('vm:never-inline')
+String foo(double x, num doDeopt) {
+  // All allocations in this function are eliminated by the compiler,
+  // except array allocation for string interpolation at the end.
+  List v1 = List.filled(2, null);
+  v1[0] = 1;
+  v1[1] = 'hi';
+  Vector2 v2 = new Vector2(1.0, 2.0);
+  Vector2 v3 = v2 + Vector2(x, x);
+  double sum = v3.x + v3.y;
+  // Deoptimization is triggered here to materialize removed allocations.
+  doDeopt + 2;
+  return "v1: [${v1[0]},${v1[1]}], v2: [${v2.x},${v2.y}], v3: [${v3.x},${v3.y}], sum: $sum";
+}
+
+main() {
+  // Due to '--optimization-counter-threshold=100 --deterministic'
+  // foo() is optimized during the first 100 iterations.
+  // After that, on iteration 120 deoptimization is triggered by changed
+  // type of 'doDeopt'. That forces materialization of all objects which
+  // allocations were removed by optimizer.
+  for (int i = 0; i < 130; ++i) {
+    final num doDeopt = (i < 120 ? 1 : 2.0);
+    final result = foo(3.0, doDeopt);
+    Expect.equals("v1: [1,hi], v2: [1.0,2.0], v3: [4.0,5.0], sum: 9.0", result);
+  }
+}
diff --git a/tests/lib/async/stream_iterator_test.dart b/tests/lib/async/stream_iterator_test.dart
index 6066341..559f4ca 100644
--- a/tests/lib/async/stream_iterator_test.dart
+++ b/tests/lib/async/stream_iterator_test.dart
@@ -73,6 +73,27 @@
     expect(await hasNext, isFalse);
     expect(await iterator.moveNext(), isFalse);
   });
+
+  test("regression 43799 (1)", () async {
+    // See: https://github.com/dart-lang/sdk/issues/43799
+    var badStream = StreamController<int>.broadcast(sync: true);
+    badStream.onListen = () {
+      badStream.add(1);
+      badStream.close();
+    };
+    var it = StreamIterator(badStream.stream);
+    expect(await it.moveNext(), false);
+  });
+
+  test("regression 43799 (2)", () async {
+    // See: https://github.com/dart-lang/sdk/issues/43799
+    var badStream = StreamController<int>.broadcast(sync: true);
+    badStream.onListen = () {
+      badStream.addError("bad");
+    };
+    var it = StreamIterator(badStream.stream);
+    expect(it.moveNext(), expectAsync(throwsA("bad")));
+  });
 }
 
 Stream createStream() async* {
diff --git a/tests/lib/html/js_extend_class_test.dart b/tests/lib/html/js_extend_class_test.dart
deleted file mode 100644
index 546a45a..0000000
--- a/tests/lib/html/js_extend_class_test.dart
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright (c) 2017, 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.
-
-@JS()
-library js_extend_class_test;
-
-import 'dart:html';
-
-import 'package:js/js.dart';
-import 'package:js/js_util.dart' as js_util;
-import 'package:expect/minitest.dart';
-
-@JS('Date')
-class JSDate {
-  external get jsField;
-  external get jsMethod;
-}
-
-@JS('Date.prototype.jsField')
-external set datePrototypeJSField(v);
-
-@JS('Date.prototype.jsMethod')
-external set datePrototypeJSMethod(v);
-
-// Extending a JS class with a Dart class is only supported by DDC for now.
-// We extend the Date class instead of a user defined JS class to avoid the
-// hassle of ensuring the JS class exists before we use it.
-class DartJsDate extends JSDate {
-  get dartField => 100;
-  int dartMethod(x) {
-    return x * 2;
-  }
-}
-
-main() {
-  // Monkey-patch the JS Date class.
-  datePrototypeJSField = 42;
-  datePrototypeJSMethod = allowInterop((x) => x * 10);
-
-  group('extend js class', () {
-    test('js class members', () {
-      var bar = new DartJsDate();
-      expect(bar.jsField, equals(42));
-      expect(bar.jsMethod(5), equals(50));
-
-      expect(bar.dartField, equals(100));
-      expect(bar.dartMethod(4), equals(8));
-    });
-
-    test('instance checks and casts', () {
-      var bar = new DartJsDate();
-      expect(bar is JSDate, isTrue);
-      expect(bar as JSDate, equals(bar));
-    });
-
-    test('dart subclass members', () {
-      var bar = new DartJsDate();
-      expect(bar.dartField, equals(100));
-      expect(bar.dartMethod(4), equals(8));
-    });
-  });
-}
diff --git a/tests/lib/isolate/detect_nullsafety_1_test.dart b/tests/lib/isolate/detect_nullsafety_1_test.dart
index 1fecd54..fc7ae94 100644
--- a/tests/lib/isolate/detect_nullsafety_1_test.dart
+++ b/tests/lib/isolate/detect_nullsafety_1_test.dart
@@ -21,8 +21,8 @@
   try {
     // Running from Source.
     testNullSafetyMode(sourcePath, 'Strong Mode');
-    // Without the enable experiment option it will be in weak mode.
-    testNullSafetyMode1(sourcePath, 'Weak Mode');
+    // Without the enable experiment option it will be in strong mode.
+    testNullSafetyMode1(sourcePath, 'Strong Mode');
 
     // Running from Kernel File.
     testNullSafetyMode(dillPath, 'Strong Mode');
diff --git a/tests/lib/isolate/nnbd_spawnuri_autodetect_1_test.dart b/tests/lib/isolate/nnbd_spawnuri_autodetect_1_test.dart
index 013d558..987c06f 100644
--- a/tests/lib/isolate/nnbd_spawnuri_autodetect_1_test.dart
+++ b/tests/lib/isolate/nnbd_spawnuri_autodetect_1_test.dart
@@ -15,13 +15,15 @@
   generateIsolateSource(sourcePath, "");
 
   try {
+    String sourceUri = Uri.file(sourcePath).toString();
+
     // Strong Isolate Spawning another Strong Isolate using spawnUri.
     testNullSafetyMode(
-        "$tmpDirPath/strong_strong.dart", "", sourcePath, 're: strong');
+        "$tmpDirPath/strong_strong.dart", "", sourceUri, 're: strong');
 
     // Weak Isolate Spawning a Strong Isolate using spawnUri.
     testNullSafetyMode(
-        "$tmpDirPath/weak_strong.dart", "2.6", sourcePath, 're: strong');
+        "$tmpDirPath/weak_strong.dart", "2.6", sourceUri, 're: strong');
   } finally {
     tmpDir.deleteSync(recursive: true);
   }
diff --git a/tests/lib/isolate/nnbd_spawnuri_autodetect_2_test.dart b/tests/lib/isolate/nnbd_spawnuri_autodetect_2_test.dart
index e2f9d1c..34ca1a8 100644
--- a/tests/lib/isolate/nnbd_spawnuri_autodetect_2_test.dart
+++ b/tests/lib/isolate/nnbd_spawnuri_autodetect_2_test.dart
@@ -15,13 +15,15 @@
   generateIsolateSource(sourcePath, "2.6");
 
   try {
+    String sourceUri = Uri.file(sourcePath).toString();
+
     // Strong Isolate Spawning another weak Isolate using spawnUri.
     testNullSafetyMode(
-        "$tmpDirPath/strong_weak.dart", "", sourcePath, 're: weak');
+        "$tmpDirPath/strong_weak.dart", "", sourceUri, 're: weak');
 
     // Weak Isolate Spawning another Weak Isolate using spawnUri.
     testNullSafetyMode(
-        "$tmpDirPath/weak_weak.dart", "2.6", sourcePath, 're: weak');
+        "$tmpDirPath/weak_weak.dart", "2.6", sourceUri, 're: weak');
   } finally {
     tmpDir.deleteSync(recursive: true);
   }
diff --git a/tests/lib/isolate/nnbd_spawnuri_autodetect_3_test.dart b/tests/lib/isolate/nnbd_spawnuri_autodetect_3_test.dart
index b7650db..b50f70e 100644
--- a/tests/lib/isolate/nnbd_spawnuri_autodetect_3_test.dart
+++ b/tests/lib/isolate/nnbd_spawnuri_autodetect_3_test.dart
@@ -17,13 +17,15 @@
   generateKernel(sourcePath, outPath);
 
   try {
+    String outUri = Uri.file(outPath).toString();
+
     // Strong Isolate Spawning another Strong Isolate using spawnUri.
     testNullSafetyMode(
-        "$tmpDirPath/strong_strong.dart", "", outPath, 're: strong');
+        "$tmpDirPath/strong_strong.dart", "", outUri, 're: strong');
 
     // Weak Isolate Spawning a Strong Isolate using spawnUri.
     testNullSafetyMode(
-        "$tmpDirPath/weak_strong.dart", "2.6", outPath, 're: strong');
+        "$tmpDirPath/weak_strong.dart", "2.6", outUri, 're: strong');
   } finally {
     tmpDir.deleteSync(recursive: true);
   }
diff --git a/tests/lib/isolate/nnbd_spawnuri_autodetect_4_test.dart b/tests/lib/isolate/nnbd_spawnuri_autodetect_4_test.dart
index 875d4d0..ce457dc 100644
--- a/tests/lib/isolate/nnbd_spawnuri_autodetect_4_test.dart
+++ b/tests/lib/isolate/nnbd_spawnuri_autodetect_4_test.dart
@@ -17,12 +17,14 @@
   generateKernel(sourcePath, outPath);
 
   try {
+    String outUri = Uri.file(outPath).toString();
+
     // Strong Isolate Spawning another weak Isolate using spawnUri.
-    testNullSafetyMode("$tmpDirPath/strong_weak.dart", "", outPath, 're: weak');
+    testNullSafetyMode("$tmpDirPath/strong_weak.dart", "", outUri, 're: weak');
 
     // Weak Isolate Spawning another Weak Isolate using spawnUri.
     testNullSafetyMode(
-        "$tmpDirPath/weak_weak.dart", "2.6", outPath, 're: weak');
+        "$tmpDirPath/weak_weak.dart", "2.6", outUri, 're: weak');
   } finally {
     tmpDir.deleteSync(recursive: true);
   }
diff --git a/tests/lib/isolate/no_package_test.dart b/tests/lib/isolate/no_package_test.dart
index 833e56b..04b38de 100644
--- a/tests/lib/isolate/no_package_test.dart
+++ b/tests/lib/isolate/no_package_test.dart
@@ -5,7 +5,7 @@
 import "dart:io";
 import "package:async_helper/async_minitest.dart";
 
-void testNoPackages(String filePath, String uri, String expected) {
+void testNoPackages(String filePath, Uri uri, String expected) {
   File mainIsolate = new File(filePath);
   mainIsolate.writeAsStringSync('''
     library spawn_tests;
@@ -39,6 +39,8 @@
   var args = <String>[];
   args.add(mainIsolate.path);
   var result = Process.runSync(exec, args);
+  print('stdout: ${result.stdout}');
+  print('stderr: ${result.stderr}');
   expect(result.stdout.contains('$expected'), true);
 }
 
@@ -59,8 +61,8 @@
 
   try {
     // Isolate Spawning another Isolate without any package specification.
-    testNoPackages("$tmpDirPath/no_package_isolate.dart", noPackageIsolate.path,
-        're: no package');
+    testNoPackages("$tmpDirPath/no_package_isolate.dart",
+        Uri.file(noPackageIsolate.path), 're: no package');
   } finally {
     tmpDir.deleteSync(recursive: true);
   }
diff --git a/tests/lib/isolate/scenarios/package_relative_root/.dart_tool/package_config.json b/tests/lib/isolate/scenarios/package_relative_root/.dart_tool/package_config.json
index 6d510b8..15b97d3 100644
--- a/tests/lib/isolate/scenarios/package_relative_root/.dart_tool/package_config.json
+++ b/tests/lib/isolate/scenarios/package_relative_root/.dart_tool/package_config.json
@@ -4,12 +4,12 @@
     {
       "name": "foo",
       "rootUri": "../packages/foo",
-      "languageVersion": "2.10"
+      "languageVersion": "2.12"
     },
     {
       "name": "bar",
       "rootUri": "../packages/bar",
-      "languageVersion": "2.10"
+      "languageVersion": "2.12"
     }
   ]
 }
diff --git a/tests/lib/isolate/scenarios/package_relative_spec/.dart_tool/package_config.json b/tests/lib/isolate/scenarios/package_relative_spec/.dart_tool/package_config.json
index 740a2dd..abf1414 100644
--- a/tests/lib/isolate/scenarios/package_relative_spec/.dart_tool/package_config.json
+++ b/tests/lib/isolate/scenarios/package_relative_spec/.dart_tool/package_config.json
@@ -4,12 +4,12 @@
     {
       "name": "foo",
       "rootUri": "../foo_package",
-      "languageVersion": "2.10"
+      "languageVersion": "2.12"
     },
     {
       "name": "bar",
       "rootUri": "../bar1_package",
-      "languageVersion": "2.10"
+      "languageVersion": "2.12"
     }
   ]
 }
diff --git a/tests/lib/isolate/scenarios/package_relative_spec/bar1_package/package.config b/tests/lib/isolate/scenarios/package_relative_spec/bar1_package/package.config
index e4dc783..1eb6595 100644
--- a/tests/lib/isolate/scenarios/package_relative_spec/bar1_package/package.config
+++ b/tests/lib/isolate/scenarios/package_relative_spec/bar1_package/package.config
@@ -4,12 +4,12 @@
     {
       "name": "foo",
       "rootUri": "../foo_package",
-      "languageVersion": "2.10"
+      "languageVersion": "2.12"
     },
     {
       "name": "bar",
       "rootUri": "../bar2_package",
-      "languageVersion": "2.10"
+      "languageVersion": "2.12"
     }
   ]
 }
diff --git a/tests/lib/isolate/scenarios/short_package/.dart_tool/package_config.json b/tests/lib/isolate/scenarios/short_package/.dart_tool/package_config.json
index c043659..fc895d2 100644
--- a/tests/lib/isolate/scenarios/short_package/.dart_tool/package_config.json
+++ b/tests/lib/isolate/scenarios/short_package/.dart_tool/package_config.json
@@ -4,7 +4,7 @@
     {
       "name": "flu",
       "rootUri": "../flu_package",
-      "languageVersion": "2.10"
+      "languageVersion": "2.12"
     }
   ]
 }
diff --git a/tests/lib/js/extends_static_test.dart b/tests/lib/js/extends_static_test.dart
new file mode 100644
index 0000000..e7300d4
--- /dev/null
+++ b/tests/lib/js/extends_static_test.dart
@@ -0,0 +1,38 @@
+// Copyright (c) 2020, 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.
+
+@JS()
+library extends_static_test;
+
+import 'package:js/js.dart';
+
+@JS()
+class JSClass {}
+
+@JS()
+@anonymous
+class AnonymousClass {}
+
+class DartClass {}
+
+class DartExtendJSClass extends JSClass {}
+//    ^
+// [web] Dart class 'DartExtendJSClass' cannot extend JS interop class 'JSClass'.
+
+class DartExtendAnonymousClass extends AnonymousClass {}
+//    ^
+// [web] Dart class 'DartExtendAnonymousClass' cannot extend JS interop class 'AnonymousClass'.
+
+@JS()
+class JSExtendDartClass extends DartClass {}
+//    ^
+// [web] JS interop class 'JSExtendDartClass' cannot extend Dart class 'DartClass'.
+
+@JS()
+@anonymous
+class AnonymousExtendDartClass extends DartClass {}
+//    ^
+// [web] JS interop class 'AnonymousExtendDartClass' cannot extend Dart class 'DartClass'.
+
+void main() {}
diff --git a/tests/lib/js/extends_test/extends_test.dart b/tests/lib/js/extends_test/extends_test.dart
new file mode 100644
index 0000000..12f8e3f
--- /dev/null
+++ b/tests/lib/js/extends_test/extends_test.dart
@@ -0,0 +1,57 @@
+// Copyright (c) 2020, 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 'extends_test_util.dart';
+
+void main() {
+  // Use the old way to define inheritance between JS objects.
+  eval(r"""
+    function inherits(child, parent) {
+      if (child.prototype.__proto__) {
+        child.prototype.__proto__ = parent.prototype;
+      } else {
+        function tmp() {};
+        tmp.prototype = parent.prototype;
+        child.prototype = new tmp();
+        child.prototype.constructor = child;
+      }
+    }
+    function JSClass(a) {
+      this.a = a;
+      this.getA = function() {
+        return this.a;
+      }
+      this.getAOrB = function() {
+        return this.getA();
+      }
+    }
+    function JSExtendJSClass(a, b) {
+      JSClass.call(this, a);
+      this.b = b;
+      this.getB = function() {
+        return this.b;
+      }
+      this.getAOrB = function() {
+        return this.getB();
+      }
+    }
+    inherits(JSExtendJSClass, JSClass);
+    function JSExtendAnonymousClass(a, b) {
+      this.a = a;
+      this.b = b;
+      this.getA = function() {
+        return this.a;
+      }
+      this.getB = function() {
+        return this.b;
+      }
+      this.getAOrB = function() {
+        return this.getB();
+      }
+    }
+    self.anonExtendAnon = new JSExtendAnonymousClass(1, 2);
+    self.anonExtendJS = new JSExtendJSClass(1, 2);
+  """);
+  testInheritance();
+}
diff --git a/tests/lib/js/extends_test/extends_test_util.dart b/tests/lib/js/extends_test/extends_test_util.dart
new file mode 100644
index 0000000..5185176
--- /dev/null
+++ b/tests/lib/js/extends_test/extends_test_util.dart
@@ -0,0 +1,94 @@
+// Copyright (c) 2020, 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.
+
+// Tests inheritance relationships between `JS` and `anonymous` classes/objects.
+
+@JS()
+library extends_test;
+
+import 'package:expect/minitest.dart';
+import 'package:js/js.dart';
+
+@JS()
+external void eval(String code);
+
+@JS()
+class JSClass {
+  external int get a;
+  external int getA();
+  external int getAOrB();
+}
+
+@JS()
+@anonymous
+class AnonymousClass {
+  external int get a;
+  external int getA();
+}
+
+@JS()
+class JSExtendJSClass extends JSClass {
+  external JSExtendJSClass(int a, int b);
+  external int get b;
+  external int getB();
+  external int getAOrB();
+}
+
+@JS()
+class JSExtendAnonymousClass extends AnonymousClass {
+  external JSExtendAnonymousClass(int a, int b);
+  external int get b;
+  external int getB();
+}
+
+@JS()
+@anonymous
+class AnonymousExtendAnonymousClass extends AnonymousClass {
+  external int get b;
+  external int getB();
+}
+
+@JS()
+@anonymous
+class AnonymousExtendJSClass extends JSClass {
+  external int get b;
+  external int getB();
+  external int getAOrB();
+}
+
+external AnonymousExtendAnonymousClass get anonExtendAnon;
+external AnonymousExtendJSClass get anonExtendJS;
+
+void testInheritance() {
+  // Note that for the following, there are no meaningful tests for is checks or
+  // as casts, since the web compilers should return true and succeed for all JS
+  // types.
+
+  var jsExtendJS = JSExtendJSClass(1, 2);
+  expect(jsExtendJS.a, 1);
+  expect(jsExtendJS.b, 2);
+  expect(jsExtendJS.getA(), 1);
+  expect(jsExtendJS.getB(), 2);
+  // Test method overrides.
+  expect(jsExtendJS.getAOrB(), 2);
+  expect((jsExtendJS as JSClass).getAOrB(), 2);
+
+  var jsExtendAnon = JSExtendAnonymousClass(1, 2);
+  expect(jsExtendAnon.a, 1);
+  expect(jsExtendAnon.b, 2);
+  expect(jsExtendAnon.getA(), 1);
+  expect(jsExtendAnon.getB(), 2);
+
+  expect(anonExtendAnon.a, 1);
+  expect(anonExtendAnon.b, 2);
+  expect(anonExtendAnon.getA(), 1);
+  expect(anonExtendAnon.getB(), 2);
+
+  expect(anonExtendJS.a, 1);
+  expect(anonExtendJS.b, 2);
+  expect(anonExtendJS.getA(), 1);
+  expect(anonExtendJS.getB(), 2);
+  expect(anonExtendJS.getAOrB(), 2);
+  expect((anonExtendJS as JSClass).getAOrB(), 2);
+}
diff --git a/tests/lib/js/extends_test/extends_with_es6_test.dart b/tests/lib/js/extends_test/extends_with_es6_test.dart
new file mode 100644
index 0000000..00eb41f
--- /dev/null
+++ b/tests/lib/js/extends_test/extends_with_es6_test.dart
@@ -0,0 +1,54 @@
+// Copyright (c) 2020, 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 'extends_test_util.dart';
+
+void main() {
+  // Use the ES6 syntax for classes to make inheritance easier.
+  eval(r"""
+    class JSClass {
+      constructor(a) {
+        this.a = a;
+      }
+      getA() {
+        return this.a;
+      }
+      getAOrB() {
+        return this.getA();
+      }
+    }
+    class JSExtendJSClass extends JSClass {
+      constructor(a, b) {
+        super(a);
+        this.b = b;
+      }
+      getB() {
+        return this.b;
+      }
+      getAOrB() {
+        return this.getB();
+      }
+    }
+    self.JSExtendJSClass = JSExtendJSClass;
+    class JSExtendAnonymousClass {
+      constructor(a, b) {
+        this.a = a;
+        this.b = b;
+      }
+      getA() {
+        return this.a;
+      }
+      getB() {
+        return this.b;
+      }
+      getAOrB() {
+        return this.getB();
+      }
+    }
+    self.JSExtendAnonymousClass = JSExtendAnonymousClass;
+    self.anonExtendAnon = new JSExtendAnonymousClass(1, 2);
+    self.anonExtendJS = new JSExtendJSClass(1, 2);
+  """);
+  testInheritance();
+}
diff --git a/tests/lib/lib_vm.status b/tests/lib/lib_vm.status
index 77a53e5..b28a2fa 100644
--- a/tests/lib/lib_vm.status
+++ b/tests/lib/lib_vm.status
@@ -75,16 +75,6 @@
 mirrors/library_uri_io_test: RuntimeError
 mirrors/library_uri_package_test: RuntimeError
 
-[ $runtime == vm && $system == windows ]
-isolate/detect_nullsafety_1_test: Skip # Issue 43583
-isolate/detect_nullsafety_2_test: Skip # Issue 43583
-isolate/nnbd_spawn_autodetect_1_test: Skip # Issue 43583
-isolate/nnbd_spawn_autodetect_2_test: Skip # Issue 43583
-isolate/nnbd_spawnuri_autodetect_1_test: Skip # Issue 43583
-isolate/nnbd_spawnuri_autodetect_2_test: Skip # Issue 43583
-isolate/nnbd_spawnuri_autodetect_3_test: Skip # Issue 43583
-isolate/nnbd_spawnuri_autodetect_4_test: Skip # Issue 43583
-
 [ $runtime == vm && ($arch == simarm || $arch == simarmv6) ]
 convert/utf85_test: Skip # Pass, Slow Issue 12644.
 
diff --git a/tests/lib/mirrors/library_uri_io_test.dart b/tests/lib/mirrors/library_uri_io_test.dart
index 8400843..302e848 100644
--- a/tests/lib/mirrors/library_uri_io_test.dart
+++ b/tests/lib/mirrors/library_uri_io_test.dart
@@ -23,6 +23,11 @@
 main() {
   var mirrors = currentMirrorSystem();
   test("Test current library uri", () {
+    if (!Platform.script.toString().endsWith('.dart')) {
+      print("Skipping library uri test as not running from source "
+          "(Platform.script = ${Platform.script})");
+      return;
+    }
     Uri uri = Uri.base.resolveUri(Platform.script);
     testLibraryUri(new Class(), uri);
   });
diff --git a/tests/lib/mirrors/null_test.dart b/tests/lib/mirrors/null_test.dart
index 0d58539..ab4c915 100644
--- a/tests/lib/mirrors/null_test.dart
+++ b/tests/lib/mirrors/null_test.dart
@@ -18,7 +18,7 @@
 
   InstanceMirror im1 = reflect(null);
   Expect.equals(cm, im1.type);
-  if (isStrongMode) {
+  if (hasSoundNullSafety) {
     Expect.throwsTypeError(() => im1.invoke(const Symbol("=="), [null]),
         'null not assignable to Object');
   } else {
@@ -29,7 +29,7 @@
   var obj = confuse(null); // Null value that isn't known at compile-time.
   InstanceMirror im2 = reflect(obj);
   Expect.equals(cm, im2.type);
-  if (isStrongMode) {
+  if (hasSoundNullSafety) {
     Expect.throwsTypeError(() => im2.invoke(const Symbol("=="), [null]),
         'null not assignable to Object');
   } else {
@@ -41,7 +41,7 @@
   Expect.isTrue(nullMirror.getField(#hashCode).reflectee is int);
   Expect.equals(null.hashCode, nullMirror.getField(#hashCode).reflectee);
   Expect.equals('Null', nullMirror.getField(#runtimeType).reflectee.toString());
-  if (isStrongMode) {
+  if (hasSoundNullSafety) {
     Expect.throwsTypeError(
         () => nullMirror.invoke(#==, [null]), 'null not assignable to Object');
   } else {
diff --git a/tests/lib/wasm/basic_test.dart b/tests/lib/wasm/basic_test.dart
index da2fb9a..309f943 100644
--- a/tests/lib/wasm/basic_test.dart
+++ b/tests/lib/wasm/basic_test.dart
@@ -20,7 +20,7 @@
     0x7e, 0x0b,
   ]);
 
-  var inst = WasmModule(data).instantiate(WasmImports());
+  var inst = WasmModule(data).instantiate().build();
   var fn = inst.lookupFunction("square");
   int n = fn(1234);
 
diff --git a/tests/lib/wasm/fn_call_error_test.dart b/tests/lib/wasm/fn_call_error_test.dart
index 0c74768..641f915 100644
--- a/tests/lib/wasm/fn_call_error_test.dart
+++ b/tests/lib/wasm/fn_call_error_test.dart
@@ -20,7 +20,7 @@
     0x7e, 0x0b,
   ]);
 
-  var inst = WasmModule(data).instantiate(WasmImports());
+  var inst = WasmModule(data).instantiate().build();
   var fn = inst.lookupFunction("square");
 
   Expect.throwsArgumentError(() => fn());
diff --git a/tests/lib/wasm/fn_import_error_test.dart b/tests/lib/wasm/fn_import_error_test.dart
index 40466fb..aeca278 100644
--- a/tests/lib/wasm/fn_import_error_test.dart
+++ b/tests/lib/wasm/fn_import_error_test.dart
@@ -5,7 +5,7 @@
 // Test errors thrown by function imports.
 
 import "package:expect/expect.dart";
-import "dart:wasm";
+import "package:wasm/wasm.dart";
 import "dart:typed_data";
 
 void main() {
@@ -25,36 +25,44 @@
   ]);
 
   var mod = WasmModule(data);
-  var imp = WasmImports()
-    ..addFunction<Int64 Function(Int32, Int64, Float, Double)>(
-        "env", "someFn", (num a, num b, num c, num d) => 123);
-  mod.instantiate(imp);
 
-  imp = WasmImports();
-  Expect.throwsArgumentError(() => mod.instantiate(imp));
+  // Valid instantiation.
+  var inst = mod
+      .instantiate()
+      .addFunction("env", "someFn", (int a, int b, num c, double d) => 123)
+      .build();
 
-  imp = WasmImports()
-    ..addFunction<Int64 Function(Int32)>("env", "someFn", (num a) => 123);
-  Expect.throwsArgumentError(() => mod.instantiate(imp));
+  // Missing imports.
+  Expect.throws(() => mod.instantiate().build(),
+      (Exception e) => "$e".contains("Missing import"));
 
-  imp = WasmImports()
-    ..addFunction<Double Function(Int32, Int64, Float, Double)>(
-        "env", "someFn", (num a, num b, num c, num d) => 123);
-  Expect.throwsArgumentError(() => mod.instantiate(imp));
+  // Wrong kind of import.
+  Expect.throws(
+      () => mod.instantiate().addMemory("env", "someFn", mod.createMemory(10)),
+      (Exception e) => "$e".contains("Import is not a memory"));
 
-  imp = WasmImports()
-    ..addFunction<Int64 Function(Int32, Int64, Float, Float)>(
-        "env", "someFn", (num a, num b, num c, num d) => 123);
-  Expect.throwsArgumentError(() => mod.instantiate(imp));
+  // Wrong namespace.
+  Expect.throws(
+      () => mod
+          .instantiate()
+          .addFunction("foo", "someFn", (int a, int b, num c, double d) => 123)
+          .build(),
+      (Exception e) => "$e".contains("Import not found"));
 
-  Expect.throwsArgumentError(() => WasmImports()
-    ..addFunction<dynamic Function(Int32, Int64, Float, Double)>(
-        "env", "someFn", (num a, num b, num c, num d) => 123));
+  // Wrong name.
+  Expect.throws(
+      () => mod
+          .instantiate()
+          .addFunction("env", "otherFn", (int a, int b, num c, double d) => 123)
+          .build(),
+      (Exception e) => "$e".contains("Import not found"));
 
-  Expect.throwsArgumentError(() => WasmImports()
-    ..addFunction<Int64 Function(Int32, Int64, dynamic, Double)>(
-        "env", "someFn", (num a, num b, num c, num d) => 123));
-
-  imp = WasmImports()..addGlobal<Int64>("env", "someFn", 123, false);
-  Expect.throwsArgumentError(() => mod.instantiate(imp));
+  // Already filled.
+  Expect.throws(
+      () => mod
+          .instantiate()
+          .addFunction("env", "someFn", (int a, int b, num c, double d) => 123)
+          .addFunction("env", "someFn", (int a, int b, num c, double d) => 456)
+          .build(),
+      (Exception e) => "$e".contains("Import already filled"));
 }
diff --git a/tests/lib/wasm/fn_import_exception_test.dart b/tests/lib/wasm/fn_import_exception_test.dart
index 73298d9..c97a68a 100644
--- a/tests/lib/wasm/fn_import_exception_test.dart
+++ b/tests/lib/wasm/fn_import_exception_test.dart
@@ -5,43 +5,44 @@
 // Test throwing exceptions from an imported function.
 
 import "package:expect/expect.dart";
-import "dart:wasm";
+import "package:wasm/wasm.dart";
 import "dart:typed_data";
 
 void main() {
-  // int64_t fn(int64_t x) { return throwIfNegative(x); }
+  // void fn() {
+  //   a();
+  //   b();
+  // }
   var data = Uint8List.fromList([
-    0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x06, 0x01, 0x60,
-    0x01, 0x7e, 0x01, 0x7e, 0x02, 0x17, 0x01, 0x03, 0x65, 0x6e, 0x76, 0x0f,
-    0x74, 0x68, 0x72, 0x6f, 0x77, 0x49, 0x66, 0x4e, 0x65, 0x67, 0x61, 0x74,
-    0x69, 0x76, 0x65, 0x00, 0x00, 0x03, 0x02, 0x01, 0x00, 0x04, 0x05, 0x01,
-    0x70, 0x01, 0x01, 0x01, 0x05, 0x03, 0x01, 0x00, 0x02, 0x06, 0x08, 0x01,
-    0x7f, 0x01, 0x41, 0x80, 0x88, 0x04, 0x0b, 0x07, 0x0f, 0x02, 0x06, 0x6d,
-    0x65, 0x6d, 0x6f, 0x72, 0x79, 0x02, 0x00, 0x02, 0x66, 0x6e, 0x00, 0x01,
-    0x0a, 0x0c, 0x01, 0x0a, 0x00, 0x20, 0x00, 0x10, 0x80, 0x80, 0x80, 0x80,
-    0x00, 0x0b,
+    0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0x60,
+    0x00, 0x00, 0x02, 0x11, 0x02, 0x03, 0x65, 0x6e, 0x76, 0x01, 0x61, 0x00,
+    0x00, 0x03, 0x65, 0x6e, 0x76, 0x01, 0x62, 0x00, 0x00, 0x03, 0x02, 0x01,
+    0x00, 0x04, 0x05, 0x01, 0x70, 0x01, 0x01, 0x01, 0x05, 0x03, 0x01, 0x00,
+    0x02, 0x06, 0x08, 0x01, 0x7f, 0x01, 0x41, 0x80, 0x88, 0x04, 0x0b, 0x07,
+    0x0f, 0x02, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x02, 0x00, 0x02,
+    0x66, 0x6e, 0x00, 0x02, 0x0a, 0x10, 0x01, 0x0e, 0x00, 0x10, 0x80, 0x80,
+    0x80, 0x80, 0x00, 0x10, 0x81, 0x80, 0x80, 0x80, 0x00, 0x0b,
   ]);
 
-  dynamic override = null;
-  var inst = WasmModule(data).instantiate(WasmImports()
-    ..addMemory("env", "memory", WasmMemory(256, 1024))
-    ..addGlobal<Int32>("env", "__memory_base", 1024, false)
-    ..addFunction<Int64 Function(Int64)>("env", "throwIfNegative", (int x) {
-      if (x < 0) {
-        throw Exception(x);
-      }
-      if (override != null) {
-        return override;
-      }
-      return x;
-    }));
-  var fn = inst.lookupFunction<Int64 Function(Int64)>("fn");
+  bool called_b = false;
+  var thrownException = Exception("Hello exception!");
+  var inst = WasmModule(data).instantiate().addFunction("env", "a", () {
+    throw thrownException;
+  }).addFunction("env", "b", () {
+    called_b = true;
+  }).build();
+  var fn = inst.lookupFunction("fn");
+  Expect.throws(() => fn(), (Exception e) => e == thrownException);
+  Expect.isFalse(called_b);
 
-  Expect.equals(123, fn.call([123]));
-  Expect.throws(() => fn.call([-456]), (Exception e) => "$e".contains("-456"));
-
-  override = "Not an integer";
-  Expect.throwsArgumentError(() => fn.call([789]));
-  override = 0.123;
-  Expect.throwsArgumentError(() => fn.call([789]));
+  bool called_a = false;
+  inst = WasmModule(data).instantiate().addFunction("env", "a", () {
+    called_a = true;
+  }).addFunction("env", "b", () {
+    called_b = true;
+  }).build();
+  fn = inst.lookupFunction("fn");
+  fn();
+  Expect.isTrue(called_a);
+  Expect.isTrue(called_b);
 }
diff --git a/tests/lib/wasm/fn_import_test.dart b/tests/lib/wasm/fn_import_test.dart
index a9f9bdb..3558c17 100644
--- a/tests/lib/wasm/fn_import_test.dart
+++ b/tests/lib/wasm/fn_import_test.dart
@@ -5,7 +5,7 @@
 // Test that we can load a wasm module, find a function, and call it.
 
 import "package:expect/expect.dart";
-import "dart:wasm";
+import "package:wasm/wasm.dart";
 import "dart:typed_data";
 
 void main() {
@@ -25,13 +25,13 @@
   int report_x = -1;
   int report_y = -1;
 
-  var inst = WasmModule(data).instantiate(WasmImports()
-    ..addFunction<Void Function(Int64, Int64)>("env", "report", (int x, int y) {
+  var inst = WasmModule(data).instantiate()
+    .addFunction("env", "report", (int x, int y) {
       report_x = x;
       report_y = y;
-    }));
-  var fn = inst.lookupFunction<Void Function()>("reportStuff");
-  fn.call([]);
+    }).build();
+  var fn = inst.lookupFunction("reportStuff");
+  fn();
   Expect.equals(report_x, 123);
   Expect.equals(report_y, 456);
 }
diff --git a/tests/lib/wasm/hello_wasi_test.dart b/tests/lib/wasm/hello_wasi_test.dart
new file mode 100644
index 0000000..d862b89
--- /dev/null
+++ b/tests/lib/wasm/hello_wasi_test.dart
@@ -0,0 +1,184 @@
+// 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.
+
+// Variant of hello_world_test that uses the default WASI imports.
+
+import "package:async_helper/async_helper.dart";
+import "package:expect/expect.dart";
+import "package:wasm/wasm.dart";
+import "dart:convert";
+import "dart:typed_data";
+
+void main() async {
+  asyncStart();
+
+  // Hello world module generated by emscripten+WASI. Exports a function like
+  // `void _start()`, and prints using `int fd_write(int, int, int, int)`.
+  var data = Uint8List.fromList([
+    0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x33, 0x09, 0x60,
+    0x03, 0x7f, 0x7f, 0x7f, 0x01, 0x7f, 0x60, 0x04, 0x7f, 0x7f, 0x7f, 0x7f,
+    0x01, 0x7f, 0x60, 0x00, 0x00, 0x60, 0x02, 0x7f, 0x7f, 0x01, 0x7f, 0x60,
+    0x01, 0x7f, 0x01, 0x7f, 0x60, 0x03, 0x7f, 0x7e, 0x7f, 0x01, 0x7e, 0x60,
+    0x00, 0x01, 0x7f, 0x60, 0x01, 0x7f, 0x00, 0x60, 0x03, 0x7f, 0x7f, 0x7f,
+    0x00, 0x02, 0x1a, 0x01, 0x0d, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x75, 0x6e,
+    0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x08, 0x66, 0x64, 0x5f, 0x77, 0x72,
+    0x69, 0x74, 0x65, 0x00, 0x01, 0x03, 0x0f, 0x0e, 0x03, 0x04, 0x00, 0x03,
+    0x02, 0x07, 0x05, 0x04, 0x03, 0x06, 0x02, 0x02, 0x08, 0x00, 0x04, 0x05,
+    0x01, 0x70, 0x01, 0x04, 0x04, 0x05, 0x06, 0x01, 0x01, 0x80, 0x02, 0x80,
+    0x02, 0x06, 0x09, 0x01, 0x7f, 0x01, 0x41, 0xc0, 0x95, 0xc0, 0x02, 0x0b,
+    0x07, 0x2e, 0x04, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x02, 0x00,
+    0x11, 0x5f, 0x5f, 0x77, 0x61, 0x73, 0x6d, 0x5f, 0x63, 0x61, 0x6c, 0x6c,
+    0x5f, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x00, 0x05, 0x04, 0x6d, 0x61, 0x69,
+    0x6e, 0x00, 0x04, 0x06, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x00, 0x0b,
+    0x09, 0x09, 0x01, 0x00, 0x41, 0x01, 0x0b, 0x03, 0x08, 0x0e, 0x07, 0x0a,
+    0xae, 0x0c, 0x0e, 0xbf, 0x01, 0x01, 0x05, 0x7f, 0x41, 0x80, 0x08, 0x21,
+    0x04, 0x02, 0x40, 0x20, 0x01, 0x28, 0x02, 0x10, 0x22, 0x02, 0x04, 0x7f,
+    0x20, 0x02, 0x05, 0x20, 0x01, 0x10, 0x02, 0x0d, 0x01, 0x20, 0x01, 0x28,
+    0x02, 0x10, 0x0b, 0x20, 0x01, 0x28, 0x02, 0x14, 0x22, 0x05, 0x6b, 0x20,
+    0x00, 0x49, 0x04, 0x40, 0x20, 0x01, 0x41, 0x80, 0x08, 0x20, 0x00, 0x20,
+    0x01, 0x28, 0x02, 0x24, 0x11, 0x00, 0x00, 0x0f, 0x0b, 0x02, 0x40, 0x20,
+    0x01, 0x2c, 0x00, 0x4b, 0x41, 0x00, 0x48, 0x0d, 0x00, 0x20, 0x00, 0x21,
+    0x03, 0x03, 0x40, 0x20, 0x03, 0x22, 0x02, 0x45, 0x0d, 0x01, 0x20, 0x02,
+    0x41, 0x7f, 0x6a, 0x22, 0x03, 0x41, 0x80, 0x08, 0x6a, 0x2d, 0x00, 0x00,
+    0x41, 0x0a, 0x47, 0x0d, 0x00, 0x0b, 0x20, 0x01, 0x41, 0x80, 0x08, 0x20,
+    0x02, 0x20, 0x01, 0x28, 0x02, 0x24, 0x11, 0x00, 0x00, 0x22, 0x03, 0x20,
+    0x02, 0x49, 0x0d, 0x01, 0x20, 0x00, 0x20, 0x02, 0x6b, 0x21, 0x00, 0x20,
+    0x02, 0x41, 0x80, 0x08, 0x6a, 0x21, 0x04, 0x20, 0x01, 0x28, 0x02, 0x14,
+    0x21, 0x05, 0x20, 0x02, 0x21, 0x06, 0x0b, 0x20, 0x05, 0x20, 0x04, 0x20,
+    0x00, 0x10, 0x03, 0x1a, 0x20, 0x01, 0x20, 0x01, 0x28, 0x02, 0x14, 0x20,
+    0x00, 0x6a, 0x36, 0x02, 0x14, 0x20, 0x00, 0x20, 0x06, 0x6a, 0x21, 0x03,
+    0x0b, 0x20, 0x03, 0x0b, 0x59, 0x01, 0x01, 0x7f, 0x20, 0x00, 0x20, 0x00,
+    0x2d, 0x00, 0x4a, 0x22, 0x01, 0x41, 0x7f, 0x6a, 0x20, 0x01, 0x72, 0x3a,
+    0x00, 0x4a, 0x20, 0x00, 0x28, 0x02, 0x00, 0x22, 0x01, 0x41, 0x08, 0x71,
+    0x04, 0x40, 0x20, 0x00, 0x20, 0x01, 0x41, 0x20, 0x72, 0x36, 0x02, 0x00,
+    0x41, 0x7f, 0x0f, 0x0b, 0x20, 0x00, 0x42, 0x00, 0x37, 0x02, 0x04, 0x20,
+    0x00, 0x20, 0x00, 0x28, 0x02, 0x2c, 0x22, 0x01, 0x36, 0x02, 0x1c, 0x20,
+    0x00, 0x20, 0x01, 0x36, 0x02, 0x14, 0x20, 0x00, 0x20, 0x01, 0x20, 0x00,
+    0x28, 0x02, 0x30, 0x6a, 0x36, 0x02, 0x10, 0x41, 0x00, 0x0b, 0x82, 0x04,
+    0x01, 0x03, 0x7f, 0x20, 0x02, 0x41, 0x80, 0xc0, 0x00, 0x4f, 0x04, 0x40,
+    0x20, 0x00, 0x20, 0x01, 0x20, 0x02, 0x10, 0x0d, 0x20, 0x00, 0x0f, 0x0b,
+    0x20, 0x00, 0x20, 0x02, 0x6a, 0x21, 0x03, 0x02, 0x40, 0x20, 0x00, 0x20,
+    0x01, 0x73, 0x41, 0x03, 0x71, 0x45, 0x04, 0x40, 0x02, 0x40, 0x20, 0x02,
+    0x41, 0x01, 0x48, 0x04, 0x40, 0x20, 0x00, 0x21, 0x02, 0x0c, 0x01, 0x0b,
+    0x20, 0x00, 0x41, 0x03, 0x71, 0x45, 0x04, 0x40, 0x20, 0x00, 0x21, 0x02,
+    0x0c, 0x01, 0x0b, 0x20, 0x00, 0x21, 0x02, 0x03, 0x40, 0x20, 0x02, 0x20,
+    0x01, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x01, 0x41, 0x01, 0x6a,
+    0x21, 0x01, 0x20, 0x02, 0x41, 0x01, 0x6a, 0x22, 0x02, 0x20, 0x03, 0x4f,
+    0x0d, 0x01, 0x20, 0x02, 0x41, 0x03, 0x71, 0x0d, 0x00, 0x0b, 0x0b, 0x02,
+    0x40, 0x20, 0x03, 0x41, 0x7c, 0x71, 0x22, 0x04, 0x41, 0xc0, 0x00, 0x49,
+    0x0d, 0x00, 0x20, 0x02, 0x20, 0x04, 0x41, 0x40, 0x6a, 0x22, 0x05, 0x4b,
+    0x0d, 0x00, 0x03, 0x40, 0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x00, 0x36,
+    0x02, 0x00, 0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x04, 0x36, 0x02, 0x04,
+    0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x08, 0x36, 0x02, 0x08, 0x20, 0x02,
+    0x20, 0x01, 0x28, 0x02, 0x0c, 0x36, 0x02, 0x0c, 0x20, 0x02, 0x20, 0x01,
+    0x28, 0x02, 0x10, 0x36, 0x02, 0x10, 0x20, 0x02, 0x20, 0x01, 0x28, 0x02,
+    0x14, 0x36, 0x02, 0x14, 0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x18, 0x36,
+    0x02, 0x18, 0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x1c, 0x36, 0x02, 0x1c,
+    0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x20, 0x36, 0x02, 0x20, 0x20, 0x02,
+    0x20, 0x01, 0x28, 0x02, 0x24, 0x36, 0x02, 0x24, 0x20, 0x02, 0x20, 0x01,
+    0x28, 0x02, 0x28, 0x36, 0x02, 0x28, 0x20, 0x02, 0x20, 0x01, 0x28, 0x02,
+    0x2c, 0x36, 0x02, 0x2c, 0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x30, 0x36,
+    0x02, 0x30, 0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x34, 0x36, 0x02, 0x34,
+    0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x38, 0x36, 0x02, 0x38, 0x20, 0x02,
+    0x20, 0x01, 0x28, 0x02, 0x3c, 0x36, 0x02, 0x3c, 0x20, 0x01, 0x41, 0x40,
+    0x6b, 0x21, 0x01, 0x20, 0x02, 0x41, 0x40, 0x6b, 0x22, 0x02, 0x20, 0x05,
+    0x4d, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x02, 0x20, 0x04, 0x4f, 0x0d, 0x01,
+    0x03, 0x40, 0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x00, 0x36, 0x02, 0x00,
+    0x20, 0x01, 0x41, 0x04, 0x6a, 0x21, 0x01, 0x20, 0x02, 0x41, 0x04, 0x6a,
+    0x22, 0x02, 0x20, 0x04, 0x49, 0x0d, 0x00, 0x0b, 0x0c, 0x01, 0x0b, 0x20,
+    0x03, 0x41, 0x04, 0x49, 0x04, 0x40, 0x20, 0x00, 0x21, 0x02, 0x0c, 0x01,
+    0x0b, 0x20, 0x03, 0x41, 0x7c, 0x6a, 0x22, 0x04, 0x20, 0x00, 0x49, 0x04,
+    0x40, 0x20, 0x00, 0x21, 0x02, 0x0c, 0x01, 0x0b, 0x20, 0x00, 0x21, 0x02,
+    0x03, 0x40, 0x20, 0x02, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00,
+    0x20, 0x02, 0x20, 0x01, 0x2d, 0x00, 0x01, 0x3a, 0x00, 0x01, 0x20, 0x02,
+    0x20, 0x01, 0x2d, 0x00, 0x02, 0x3a, 0x00, 0x02, 0x20, 0x02, 0x20, 0x01,
+    0x2d, 0x00, 0x03, 0x3a, 0x00, 0x03, 0x20, 0x01, 0x41, 0x04, 0x6a, 0x21,
+    0x01, 0x20, 0x02, 0x41, 0x04, 0x6a, 0x22, 0x02, 0x20, 0x04, 0x4d, 0x0d,
+    0x00, 0x0b, 0x0b, 0x20, 0x02, 0x20, 0x03, 0x49, 0x04, 0x40, 0x03, 0x40,
+    0x20, 0x02, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x01,
+    0x41, 0x01, 0x6a, 0x21, 0x01, 0x20, 0x02, 0x41, 0x01, 0x6a, 0x22, 0x02,
+    0x20, 0x03, 0x47, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x0b, 0x06, 0x00,
+    0x10, 0x0c, 0x41, 0x00, 0x0b, 0x03, 0x00, 0x01, 0x0b, 0x7e, 0x01, 0x03,
+    0x7f, 0x23, 0x00, 0x41, 0x10, 0x6b, 0x22, 0x01, 0x24, 0x00, 0x20, 0x01,
+    0x41, 0x0a, 0x3a, 0x00, 0x0f, 0x02, 0x40, 0x20, 0x00, 0x28, 0x02, 0x10,
+    0x22, 0x02, 0x45, 0x04, 0x40, 0x20, 0x00, 0x10, 0x02, 0x0d, 0x01, 0x20,
+    0x00, 0x28, 0x02, 0x10, 0x21, 0x02, 0x0b, 0x02, 0x40, 0x20, 0x00, 0x28,
+    0x02, 0x14, 0x22, 0x03, 0x20, 0x02, 0x4f, 0x0d, 0x00, 0x20, 0x00, 0x2c,
+    0x00, 0x4b, 0x41, 0x0a, 0x46, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x03, 0x41,
+    0x01, 0x6a, 0x36, 0x02, 0x14, 0x20, 0x03, 0x41, 0x0a, 0x3a, 0x00, 0x00,
+    0x0c, 0x01, 0x0b, 0x20, 0x00, 0x20, 0x01, 0x41, 0x0f, 0x6a, 0x41, 0x01,
+    0x20, 0x00, 0x28, 0x02, 0x24, 0x11, 0x00, 0x00, 0x41, 0x01, 0x47, 0x0d,
+    0x00, 0x20, 0x01, 0x2d, 0x00, 0x0f, 0x1a, 0x0b, 0x20, 0x01, 0x41, 0x10,
+    0x6a, 0x24, 0x00, 0x0b, 0x04, 0x00, 0x42, 0x00, 0x0b, 0x04, 0x00, 0x41,
+    0x00, 0x0b, 0x31, 0x01, 0x01, 0x7f, 0x20, 0x00, 0x21, 0x02, 0x20, 0x02,
+    0x02, 0x7f, 0x20, 0x01, 0x28, 0x02, 0x4c, 0x41, 0x7f, 0x4c, 0x04, 0x40,
+    0x20, 0x02, 0x20, 0x01, 0x10, 0x01, 0x0c, 0x01, 0x0b, 0x20, 0x02, 0x20,
+    0x01, 0x10, 0x01, 0x0b, 0x22, 0x01, 0x46, 0x04, 0x40, 0x20, 0x00, 0x0f,
+    0x0b, 0x20, 0x01, 0x0b, 0x62, 0x01, 0x03, 0x7f, 0x41, 0x80, 0x08, 0x21,
+    0x00, 0x03, 0x40, 0x20, 0x00, 0x22, 0x01, 0x41, 0x04, 0x6a, 0x21, 0x00,
+    0x20, 0x01, 0x28, 0x02, 0x00, 0x22, 0x02, 0x41, 0x7f, 0x73, 0x20, 0x02,
+    0x41, 0xff, 0xfd, 0xfb, 0x77, 0x6a, 0x71, 0x41, 0x80, 0x81, 0x82, 0x84,
+    0x78, 0x71, 0x45, 0x0d, 0x00, 0x0b, 0x02, 0x40, 0x20, 0x02, 0x41, 0xff,
+    0x01, 0x71, 0x45, 0x04, 0x40, 0x20, 0x01, 0x21, 0x00, 0x0c, 0x01, 0x0b,
+    0x03, 0x40, 0x20, 0x01, 0x2d, 0x00, 0x01, 0x21, 0x02, 0x20, 0x01, 0x41,
+    0x01, 0x6a, 0x22, 0x00, 0x21, 0x01, 0x20, 0x02, 0x0d, 0x00, 0x0b, 0x0b,
+    0x20, 0x00, 0x41, 0x80, 0x08, 0x6b, 0x0b, 0x0c, 0x00, 0x02, 0x7f, 0x41,
+    0x00, 0x41, 0x00, 0x10, 0x04, 0x0b, 0x1a, 0x0b, 0x66, 0x01, 0x02, 0x7f,
+    0x41, 0x90, 0x08, 0x28, 0x02, 0x00, 0x22, 0x00, 0x28, 0x02, 0x4c, 0x41,
+    0x00, 0x4e, 0x04, 0x7f, 0x41, 0x01, 0x05, 0x20, 0x01, 0x0b, 0x1a, 0x02,
+    0x40, 0x41, 0x7f, 0x41, 0x00, 0x10, 0x0a, 0x22, 0x01, 0x20, 0x01, 0x20,
+    0x00, 0x10, 0x09, 0x47, 0x1b, 0x41, 0x00, 0x48, 0x0d, 0x00, 0x02, 0x40,
+    0x20, 0x00, 0x2d, 0x00, 0x4b, 0x41, 0x0a, 0x46, 0x0d, 0x00, 0x20, 0x00,
+    0x28, 0x02, 0x14, 0x22, 0x01, 0x20, 0x00, 0x28, 0x02, 0x10, 0x4f, 0x0d,
+    0x00, 0x20, 0x00, 0x20, 0x01, 0x41, 0x01, 0x6a, 0x36, 0x02, 0x14, 0x20,
+    0x01, 0x41, 0x0a, 0x3a, 0x00, 0x00, 0x0c, 0x01, 0x0b, 0x20, 0x00, 0x10,
+    0x06, 0x0b, 0x0b, 0x3d, 0x01, 0x01, 0x7f, 0x20, 0x02, 0x04, 0x40, 0x03,
+    0x40, 0x20, 0x00, 0x20, 0x01, 0x20, 0x02, 0x41, 0x80, 0xc0, 0x00, 0x20,
+    0x02, 0x41, 0x80, 0xc0, 0x00, 0x49, 0x1b, 0x22, 0x03, 0x10, 0x03, 0x21,
+    0x00, 0x20, 0x01, 0x41, 0x80, 0x40, 0x6b, 0x21, 0x01, 0x20, 0x00, 0x41,
+    0x80, 0x40, 0x6b, 0x21, 0x00, 0x20, 0x02, 0x20, 0x03, 0x6b, 0x22, 0x02,
+    0x0d, 0x00, 0x0b, 0x0b, 0x0b, 0xb1, 0x02, 0x01, 0x06, 0x7f, 0x23, 0x00,
+    0x41, 0x20, 0x6b, 0x22, 0x03, 0x24, 0x00, 0x20, 0x03, 0x20, 0x00, 0x28,
+    0x02, 0x1c, 0x22, 0x04, 0x36, 0x02, 0x10, 0x20, 0x00, 0x28, 0x02, 0x14,
+    0x21, 0x05, 0x20, 0x03, 0x20, 0x02, 0x36, 0x02, 0x1c, 0x20, 0x03, 0x20,
+    0x01, 0x36, 0x02, 0x18, 0x20, 0x03, 0x20, 0x05, 0x20, 0x04, 0x6b, 0x22,
+    0x01, 0x36, 0x02, 0x14, 0x20, 0x01, 0x20, 0x02, 0x6a, 0x21, 0x06, 0x41,
+    0x02, 0x21, 0x05, 0x20, 0x03, 0x41, 0x10, 0x6a, 0x21, 0x01, 0x03, 0x40,
+    0x02, 0x40, 0x02, 0x7f, 0x20, 0x06, 0x02, 0x7f, 0x20, 0x00, 0x28, 0x02,
+    0x3c, 0x20, 0x01, 0x20, 0x05, 0x20, 0x03, 0x41, 0x0c, 0x6a, 0x10, 0x00,
+    0x04, 0x40, 0x20, 0x03, 0x41, 0x7f, 0x36, 0x02, 0x0c, 0x41, 0x7f, 0x0c,
+    0x01, 0x0b, 0x20, 0x03, 0x28, 0x02, 0x0c, 0x0b, 0x22, 0x04, 0x46, 0x04,
+    0x40, 0x20, 0x00, 0x20, 0x00, 0x28, 0x02, 0x2c, 0x22, 0x01, 0x36, 0x02,
+    0x1c, 0x20, 0x00, 0x20, 0x01, 0x36, 0x02, 0x14, 0x20, 0x00, 0x20, 0x01,
+    0x20, 0x00, 0x28, 0x02, 0x30, 0x6a, 0x36, 0x02, 0x10, 0x20, 0x02, 0x0c,
+    0x01, 0x0b, 0x20, 0x04, 0x41, 0x7f, 0x4a, 0x0d, 0x01, 0x20, 0x00, 0x41,
+    0x00, 0x36, 0x02, 0x1c, 0x20, 0x00, 0x42, 0x00, 0x37, 0x03, 0x10, 0x20,
+    0x00, 0x20, 0x00, 0x28, 0x02, 0x00, 0x41, 0x20, 0x72, 0x36, 0x02, 0x00,
+    0x41, 0x00, 0x20, 0x05, 0x41, 0x02, 0x46, 0x0d, 0x00, 0x1a, 0x20, 0x02,
+    0x20, 0x01, 0x28, 0x02, 0x04, 0x6b, 0x0b, 0x21, 0x04, 0x20, 0x03, 0x41,
+    0x20, 0x6a, 0x24, 0x00, 0x20, 0x04, 0x0f, 0x0b, 0x20, 0x01, 0x41, 0x08,
+    0x6a, 0x20, 0x01, 0x20, 0x04, 0x20, 0x01, 0x28, 0x02, 0x04, 0x22, 0x07,
+    0x4b, 0x22, 0x08, 0x1b, 0x22, 0x01, 0x20, 0x04, 0x20, 0x07, 0x41, 0x00,
+    0x20, 0x08, 0x1b, 0x6b, 0x22, 0x07, 0x20, 0x01, 0x28, 0x02, 0x00, 0x6a,
+    0x36, 0x02, 0x00, 0x20, 0x01, 0x20, 0x01, 0x28, 0x02, 0x04, 0x20, 0x07,
+    0x6b, 0x36, 0x02, 0x04, 0x20, 0x06, 0x20, 0x04, 0x6b, 0x21, 0x06, 0x20,
+    0x05, 0x20, 0x08, 0x6b, 0x21, 0x05, 0x0c, 0x00, 0x00, 0x0b, 0x00, 0x0b,
+    0x0b, 0x4d, 0x06, 0x00, 0x41, 0x80, 0x08, 0x0b, 0x12, 0x68, 0x65, 0x6c,
+    0x6c, 0x6f, 0x2c, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x21, 0x00, 0x00,
+    0x00, 0x18, 0x04, 0x00, 0x41, 0x98, 0x08, 0x0b, 0x01, 0x05, 0x00, 0x41,
+    0xa4, 0x08, 0x0b, 0x01, 0x01, 0x00, 0x41, 0xbc, 0x08, 0x0b, 0x0e, 0x02,
+    0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xb8, 0x04, 0x00, 0x00, 0x00,
+    0x04, 0x00, 0x41, 0xd4, 0x08, 0x0b, 0x01, 0x01, 0x00, 0x41, 0xe3, 0x08,
+    0x0b, 0x05, 0x0a, 0xff, 0xff, 0xff, 0xff,
+  ]);
+
+  var inst =
+      WasmModule(data).instantiate().enableWasi(captureStdout: true).build();
+
+  var fn = inst.lookupFunction("_start");
+  fn();
+  var out = utf8.decode(await inst.stdout.first);
+  Expect.equals("hello, world!\n", out);
+  asyncEnd();
+}
diff --git a/tests/lib/wasm/hello_world_test.dart b/tests/lib/wasm/hello_world_test.dart
index c4441e3..1dc49e9 100644
--- a/tests/lib/wasm/hello_world_test.dart
+++ b/tests/lib/wasm/hello_world_test.dart
@@ -5,7 +5,7 @@
 // Test for hello world built using emscripten with WASI.
 
 import "package:expect/expect.dart";
-import "dart:wasm";
+import "package:wasm/wasm.dart";
 import "dart:typed_data";
 
 void main() {
@@ -169,7 +169,7 @@
     0x0b, 0x05, 0x0a, 0xff, 0xff, 0xff, 0xff,
   ]);
 
-  WasmMemory mem = null;
+  late WasmMemory mem;
   String out = "";
   var getI32 = (int p) {
     // Read a little-endian I32.
@@ -180,26 +180,26 @@
     }
     return n;
   };
-  var inst = WasmModule(data).instantiate(WasmImports()
-    ..addFunction<Int32 Function(Int32, Int32, Int32, Int32)>(
-        "wasi_unstable", "fd_write",
-        (int fd, int iovs, int iovs_len, int unused) {
-      // iovs points to an array of length iovs_len. Each element is two I32s,
-      // a char* and a length.
-      String o = "";
-      for (var i = 0; i < iovs_len; ++i) {
-        var str = getI32(iovs + 8 * i);
-        var len = getI32(iovs + 4 + 8 * i);
-        for (var j = 0; j < len; ++j) {
-          o += String.fromCharCode(mem[str + j]);
-        }
+  var inst = WasmModule(data)
+      .instantiate()
+      .addFunction("wasi_unstable", "fd_write",
+          (int fd, int iovs, int iovs_len, int unused) {
+    // iovs points to an array of length iovs_len. Each element is two I32s,
+    // a char* and a length.
+    String o = "";
+    for (var i = 0; i < iovs_len; ++i) {
+      var str = getI32(iovs + 8 * i);
+      var len = getI32(iovs + 4 + 8 * i);
+      for (var j = 0; j < len; ++j) {
+        o += String.fromCharCode(mem[str + j]);
       }
-      out += o;
-      return o.length;
-    }));
+    }
+    out += o;
+    return o.length;
+  }).build();
   mem = inst.memory;
 
-  var fn = inst.lookupFunction<Void Function()>("_start");
-  fn.call([]);
+  var fn = inst.lookupFunction("_start");
+  fn();
   Expect.equals("hello, world!\n", out);
 }
diff --git a/tests/lib/wasm/memory_error_test.dart b/tests/lib/wasm/memory_error_test.dart
index 3a172d8..f02dc6c 100644
--- a/tests/lib/wasm/memory_error_test.dart
+++ b/tests/lib/wasm/memory_error_test.dart
@@ -9,9 +9,14 @@
 import "dart:typed_data";
 
 void main() {
-  Expect.throws(() => WasmMemory(1000000000));
-  var mem = WasmMemory(100);
+  // Empty wasm module.
+  var data = Uint8List.fromList(
+      [0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x06, 0x81, 0x00, 0x00]);
+  var module = WasmModule(data);
+
+  Expect.throws(() => module.createMemory(1000000000));
+  var mem = module.createMemory(100);
   Expect.throws(() => mem.grow(1000000000));
-  mem = WasmMemory(100, 200);
+  mem = module.createMemory(100, 200);
   Expect.throws(() => mem.grow(300));
 }
diff --git a/tests/lib/wasm/memory_test.dart b/tests/lib/wasm/memory_test.dart
index ecaf433..544c6a1 100644
--- a/tests/lib/wasm/memory_test.dart
+++ b/tests/lib/wasm/memory_test.dart
@@ -9,7 +9,12 @@
 import "dart:typed_data";
 
 void main() {
-  var mem = WasmMemory(100);
+  // Empty wasm module.
+  var data = Uint8List.fromList(
+      [0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x06, 0x81, 0x00, 0x00]);
+  var module = WasmModule(data);
+
+  var mem = module.createMemory(100);
   Expect.equals(100, mem.lengthInPages);
   Expect.equals(100 * WasmMemory.kPageSizeInBytes, mem.lengthInBytes);
 
diff --git a/tests/lib/wasm/numerics_test.dart b/tests/lib/wasm/numerics_test.dart
index 158549a..eba9aaa 100644
--- a/tests/lib/wasm/numerics_test.dart
+++ b/tests/lib/wasm/numerics_test.dart
@@ -29,7 +29,7 @@
     0x01, 0x92, 0x0b,
   ]);
 
-  var inst = WasmModule(data).instantiate(WasmImports());
+  var inst = WasmModule(data).instantiate().build();
   var addI64 = inst.lookupFunction("addI64");
   var addI32 = inst.lookupFunction("addI32");
   var addF64 = inst.lookupFunction("addF64");
diff --git a/tests/lib/wasm/void_test.dart b/tests/lib/wasm/void_test.dart
index fe94693..aba9c65 100644
--- a/tests/lib/wasm/void_test.dart
+++ b/tests/lib/wasm/void_test.dart
@@ -25,7 +25,7 @@
     0x80, 0x08, 0x0b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   ]);
 
-  var inst = WasmModule(data).instantiate(WasmImports());
+  var inst = WasmModule(data).instantiate().build();
   var setFn = inst.lookupFunction("set");
   var getFn = inst.lookupFunction("get");
   Expect.isNull(setFn(123, 456));
diff --git a/tests/lib/wasm/wasi_error_test.dart b/tests/lib/wasm/wasi_error_test.dart
new file mode 100644
index 0000000..8418dad
--- /dev/null
+++ b/tests/lib/wasm/wasi_error_test.dart
@@ -0,0 +1,204 @@
+// 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.
+
+// Test the errors that can be thrown by WASI.
+
+import "package:expect/expect.dart";
+import "package:wasm/wasm.dart";
+import "dart:typed_data";
+
+void main() {
+  // Empty wasm module.
+  var emptyModuleData = Uint8List.fromList(
+      [0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x06, 0x81, 0x00, 0x00]);
+
+  // Failed to fill WASI imports (the empty module was not built with WASI).
+  Expect.throws(() => WasmModule(emptyModuleData).instantiate().enableWasi(),
+      (Exception e) => "$e".contains("Failed to fill WASI imports"));
+
+  // Hello world module generated by emscripten+WASI. Exports a function like
+  // `void _start()`, and prints using `int fd_write(int, int, int, int)`.
+  var helloWorldData = Uint8List.fromList([
+    0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x33, 0x09, 0x60,
+    0x03, 0x7f, 0x7f, 0x7f, 0x01, 0x7f, 0x60, 0x04, 0x7f, 0x7f, 0x7f, 0x7f,
+    0x01, 0x7f, 0x60, 0x00, 0x00, 0x60, 0x02, 0x7f, 0x7f, 0x01, 0x7f, 0x60,
+    0x01, 0x7f, 0x01, 0x7f, 0x60, 0x03, 0x7f, 0x7e, 0x7f, 0x01, 0x7e, 0x60,
+    0x00, 0x01, 0x7f, 0x60, 0x01, 0x7f, 0x00, 0x60, 0x03, 0x7f, 0x7f, 0x7f,
+    0x00, 0x02, 0x1a, 0x01, 0x0d, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x75, 0x6e,
+    0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x08, 0x66, 0x64, 0x5f, 0x77, 0x72,
+    0x69, 0x74, 0x65, 0x00, 0x01, 0x03, 0x0f, 0x0e, 0x03, 0x04, 0x00, 0x03,
+    0x02, 0x07, 0x05, 0x04, 0x03, 0x06, 0x02, 0x02, 0x08, 0x00, 0x04, 0x05,
+    0x01, 0x70, 0x01, 0x04, 0x04, 0x05, 0x06, 0x01, 0x01, 0x80, 0x02, 0x80,
+    0x02, 0x06, 0x09, 0x01, 0x7f, 0x01, 0x41, 0xc0, 0x95, 0xc0, 0x02, 0x0b,
+    0x07, 0x2e, 0x04, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x02, 0x00,
+    0x11, 0x5f, 0x5f, 0x77, 0x61, 0x73, 0x6d, 0x5f, 0x63, 0x61, 0x6c, 0x6c,
+    0x5f, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x00, 0x05, 0x04, 0x6d, 0x61, 0x69,
+    0x6e, 0x00, 0x04, 0x06, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x00, 0x0b,
+    0x09, 0x09, 0x01, 0x00, 0x41, 0x01, 0x0b, 0x03, 0x08, 0x0e, 0x07, 0x0a,
+    0xae, 0x0c, 0x0e, 0xbf, 0x01, 0x01, 0x05, 0x7f, 0x41, 0x80, 0x08, 0x21,
+    0x04, 0x02, 0x40, 0x20, 0x01, 0x28, 0x02, 0x10, 0x22, 0x02, 0x04, 0x7f,
+    0x20, 0x02, 0x05, 0x20, 0x01, 0x10, 0x02, 0x0d, 0x01, 0x20, 0x01, 0x28,
+    0x02, 0x10, 0x0b, 0x20, 0x01, 0x28, 0x02, 0x14, 0x22, 0x05, 0x6b, 0x20,
+    0x00, 0x49, 0x04, 0x40, 0x20, 0x01, 0x41, 0x80, 0x08, 0x20, 0x00, 0x20,
+    0x01, 0x28, 0x02, 0x24, 0x11, 0x00, 0x00, 0x0f, 0x0b, 0x02, 0x40, 0x20,
+    0x01, 0x2c, 0x00, 0x4b, 0x41, 0x00, 0x48, 0x0d, 0x00, 0x20, 0x00, 0x21,
+    0x03, 0x03, 0x40, 0x20, 0x03, 0x22, 0x02, 0x45, 0x0d, 0x01, 0x20, 0x02,
+    0x41, 0x7f, 0x6a, 0x22, 0x03, 0x41, 0x80, 0x08, 0x6a, 0x2d, 0x00, 0x00,
+    0x41, 0x0a, 0x47, 0x0d, 0x00, 0x0b, 0x20, 0x01, 0x41, 0x80, 0x08, 0x20,
+    0x02, 0x20, 0x01, 0x28, 0x02, 0x24, 0x11, 0x00, 0x00, 0x22, 0x03, 0x20,
+    0x02, 0x49, 0x0d, 0x01, 0x20, 0x00, 0x20, 0x02, 0x6b, 0x21, 0x00, 0x20,
+    0x02, 0x41, 0x80, 0x08, 0x6a, 0x21, 0x04, 0x20, 0x01, 0x28, 0x02, 0x14,
+    0x21, 0x05, 0x20, 0x02, 0x21, 0x06, 0x0b, 0x20, 0x05, 0x20, 0x04, 0x20,
+    0x00, 0x10, 0x03, 0x1a, 0x20, 0x01, 0x20, 0x01, 0x28, 0x02, 0x14, 0x20,
+    0x00, 0x6a, 0x36, 0x02, 0x14, 0x20, 0x00, 0x20, 0x06, 0x6a, 0x21, 0x03,
+    0x0b, 0x20, 0x03, 0x0b, 0x59, 0x01, 0x01, 0x7f, 0x20, 0x00, 0x20, 0x00,
+    0x2d, 0x00, 0x4a, 0x22, 0x01, 0x41, 0x7f, 0x6a, 0x20, 0x01, 0x72, 0x3a,
+    0x00, 0x4a, 0x20, 0x00, 0x28, 0x02, 0x00, 0x22, 0x01, 0x41, 0x08, 0x71,
+    0x04, 0x40, 0x20, 0x00, 0x20, 0x01, 0x41, 0x20, 0x72, 0x36, 0x02, 0x00,
+    0x41, 0x7f, 0x0f, 0x0b, 0x20, 0x00, 0x42, 0x00, 0x37, 0x02, 0x04, 0x20,
+    0x00, 0x20, 0x00, 0x28, 0x02, 0x2c, 0x22, 0x01, 0x36, 0x02, 0x1c, 0x20,
+    0x00, 0x20, 0x01, 0x36, 0x02, 0x14, 0x20, 0x00, 0x20, 0x01, 0x20, 0x00,
+    0x28, 0x02, 0x30, 0x6a, 0x36, 0x02, 0x10, 0x41, 0x00, 0x0b, 0x82, 0x04,
+    0x01, 0x03, 0x7f, 0x20, 0x02, 0x41, 0x80, 0xc0, 0x00, 0x4f, 0x04, 0x40,
+    0x20, 0x00, 0x20, 0x01, 0x20, 0x02, 0x10, 0x0d, 0x20, 0x00, 0x0f, 0x0b,
+    0x20, 0x00, 0x20, 0x02, 0x6a, 0x21, 0x03, 0x02, 0x40, 0x20, 0x00, 0x20,
+    0x01, 0x73, 0x41, 0x03, 0x71, 0x45, 0x04, 0x40, 0x02, 0x40, 0x20, 0x02,
+    0x41, 0x01, 0x48, 0x04, 0x40, 0x20, 0x00, 0x21, 0x02, 0x0c, 0x01, 0x0b,
+    0x20, 0x00, 0x41, 0x03, 0x71, 0x45, 0x04, 0x40, 0x20, 0x00, 0x21, 0x02,
+    0x0c, 0x01, 0x0b, 0x20, 0x00, 0x21, 0x02, 0x03, 0x40, 0x20, 0x02, 0x20,
+    0x01, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x01, 0x41, 0x01, 0x6a,
+    0x21, 0x01, 0x20, 0x02, 0x41, 0x01, 0x6a, 0x22, 0x02, 0x20, 0x03, 0x4f,
+    0x0d, 0x01, 0x20, 0x02, 0x41, 0x03, 0x71, 0x0d, 0x00, 0x0b, 0x0b, 0x02,
+    0x40, 0x20, 0x03, 0x41, 0x7c, 0x71, 0x22, 0x04, 0x41, 0xc0, 0x00, 0x49,
+    0x0d, 0x00, 0x20, 0x02, 0x20, 0x04, 0x41, 0x40, 0x6a, 0x22, 0x05, 0x4b,
+    0x0d, 0x00, 0x03, 0x40, 0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x00, 0x36,
+    0x02, 0x00, 0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x04, 0x36, 0x02, 0x04,
+    0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x08, 0x36, 0x02, 0x08, 0x20, 0x02,
+    0x20, 0x01, 0x28, 0x02, 0x0c, 0x36, 0x02, 0x0c, 0x20, 0x02, 0x20, 0x01,
+    0x28, 0x02, 0x10, 0x36, 0x02, 0x10, 0x20, 0x02, 0x20, 0x01, 0x28, 0x02,
+    0x14, 0x36, 0x02, 0x14, 0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x18, 0x36,
+    0x02, 0x18, 0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x1c, 0x36, 0x02, 0x1c,
+    0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x20, 0x36, 0x02, 0x20, 0x20, 0x02,
+    0x20, 0x01, 0x28, 0x02, 0x24, 0x36, 0x02, 0x24, 0x20, 0x02, 0x20, 0x01,
+    0x28, 0x02, 0x28, 0x36, 0x02, 0x28, 0x20, 0x02, 0x20, 0x01, 0x28, 0x02,
+    0x2c, 0x36, 0x02, 0x2c, 0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x30, 0x36,
+    0x02, 0x30, 0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x34, 0x36, 0x02, 0x34,
+    0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x38, 0x36, 0x02, 0x38, 0x20, 0x02,
+    0x20, 0x01, 0x28, 0x02, 0x3c, 0x36, 0x02, 0x3c, 0x20, 0x01, 0x41, 0x40,
+    0x6b, 0x21, 0x01, 0x20, 0x02, 0x41, 0x40, 0x6b, 0x22, 0x02, 0x20, 0x05,
+    0x4d, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x02, 0x20, 0x04, 0x4f, 0x0d, 0x01,
+    0x03, 0x40, 0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x00, 0x36, 0x02, 0x00,
+    0x20, 0x01, 0x41, 0x04, 0x6a, 0x21, 0x01, 0x20, 0x02, 0x41, 0x04, 0x6a,
+    0x22, 0x02, 0x20, 0x04, 0x49, 0x0d, 0x00, 0x0b, 0x0c, 0x01, 0x0b, 0x20,
+    0x03, 0x41, 0x04, 0x49, 0x04, 0x40, 0x20, 0x00, 0x21, 0x02, 0x0c, 0x01,
+    0x0b, 0x20, 0x03, 0x41, 0x7c, 0x6a, 0x22, 0x04, 0x20, 0x00, 0x49, 0x04,
+    0x40, 0x20, 0x00, 0x21, 0x02, 0x0c, 0x01, 0x0b, 0x20, 0x00, 0x21, 0x02,
+    0x03, 0x40, 0x20, 0x02, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00,
+    0x20, 0x02, 0x20, 0x01, 0x2d, 0x00, 0x01, 0x3a, 0x00, 0x01, 0x20, 0x02,
+    0x20, 0x01, 0x2d, 0x00, 0x02, 0x3a, 0x00, 0x02, 0x20, 0x02, 0x20, 0x01,
+    0x2d, 0x00, 0x03, 0x3a, 0x00, 0x03, 0x20, 0x01, 0x41, 0x04, 0x6a, 0x21,
+    0x01, 0x20, 0x02, 0x41, 0x04, 0x6a, 0x22, 0x02, 0x20, 0x04, 0x4d, 0x0d,
+    0x00, 0x0b, 0x0b, 0x20, 0x02, 0x20, 0x03, 0x49, 0x04, 0x40, 0x03, 0x40,
+    0x20, 0x02, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x01,
+    0x41, 0x01, 0x6a, 0x21, 0x01, 0x20, 0x02, 0x41, 0x01, 0x6a, 0x22, 0x02,
+    0x20, 0x03, 0x47, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x0b, 0x06, 0x00,
+    0x10, 0x0c, 0x41, 0x00, 0x0b, 0x03, 0x00, 0x01, 0x0b, 0x7e, 0x01, 0x03,
+    0x7f, 0x23, 0x00, 0x41, 0x10, 0x6b, 0x22, 0x01, 0x24, 0x00, 0x20, 0x01,
+    0x41, 0x0a, 0x3a, 0x00, 0x0f, 0x02, 0x40, 0x20, 0x00, 0x28, 0x02, 0x10,
+    0x22, 0x02, 0x45, 0x04, 0x40, 0x20, 0x00, 0x10, 0x02, 0x0d, 0x01, 0x20,
+    0x00, 0x28, 0x02, 0x10, 0x21, 0x02, 0x0b, 0x02, 0x40, 0x20, 0x00, 0x28,
+    0x02, 0x14, 0x22, 0x03, 0x20, 0x02, 0x4f, 0x0d, 0x00, 0x20, 0x00, 0x2c,
+    0x00, 0x4b, 0x41, 0x0a, 0x46, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x03, 0x41,
+    0x01, 0x6a, 0x36, 0x02, 0x14, 0x20, 0x03, 0x41, 0x0a, 0x3a, 0x00, 0x00,
+    0x0c, 0x01, 0x0b, 0x20, 0x00, 0x20, 0x01, 0x41, 0x0f, 0x6a, 0x41, 0x01,
+    0x20, 0x00, 0x28, 0x02, 0x24, 0x11, 0x00, 0x00, 0x41, 0x01, 0x47, 0x0d,
+    0x00, 0x20, 0x01, 0x2d, 0x00, 0x0f, 0x1a, 0x0b, 0x20, 0x01, 0x41, 0x10,
+    0x6a, 0x24, 0x00, 0x0b, 0x04, 0x00, 0x42, 0x00, 0x0b, 0x04, 0x00, 0x41,
+    0x00, 0x0b, 0x31, 0x01, 0x01, 0x7f, 0x20, 0x00, 0x21, 0x02, 0x20, 0x02,
+    0x02, 0x7f, 0x20, 0x01, 0x28, 0x02, 0x4c, 0x41, 0x7f, 0x4c, 0x04, 0x40,
+    0x20, 0x02, 0x20, 0x01, 0x10, 0x01, 0x0c, 0x01, 0x0b, 0x20, 0x02, 0x20,
+    0x01, 0x10, 0x01, 0x0b, 0x22, 0x01, 0x46, 0x04, 0x40, 0x20, 0x00, 0x0f,
+    0x0b, 0x20, 0x01, 0x0b, 0x62, 0x01, 0x03, 0x7f, 0x41, 0x80, 0x08, 0x21,
+    0x00, 0x03, 0x40, 0x20, 0x00, 0x22, 0x01, 0x41, 0x04, 0x6a, 0x21, 0x00,
+    0x20, 0x01, 0x28, 0x02, 0x00, 0x22, 0x02, 0x41, 0x7f, 0x73, 0x20, 0x02,
+    0x41, 0xff, 0xfd, 0xfb, 0x77, 0x6a, 0x71, 0x41, 0x80, 0x81, 0x82, 0x84,
+    0x78, 0x71, 0x45, 0x0d, 0x00, 0x0b, 0x02, 0x40, 0x20, 0x02, 0x41, 0xff,
+    0x01, 0x71, 0x45, 0x04, 0x40, 0x20, 0x01, 0x21, 0x00, 0x0c, 0x01, 0x0b,
+    0x03, 0x40, 0x20, 0x01, 0x2d, 0x00, 0x01, 0x21, 0x02, 0x20, 0x01, 0x41,
+    0x01, 0x6a, 0x22, 0x00, 0x21, 0x01, 0x20, 0x02, 0x0d, 0x00, 0x0b, 0x0b,
+    0x20, 0x00, 0x41, 0x80, 0x08, 0x6b, 0x0b, 0x0c, 0x00, 0x02, 0x7f, 0x41,
+    0x00, 0x41, 0x00, 0x10, 0x04, 0x0b, 0x1a, 0x0b, 0x66, 0x01, 0x02, 0x7f,
+    0x41, 0x90, 0x08, 0x28, 0x02, 0x00, 0x22, 0x00, 0x28, 0x02, 0x4c, 0x41,
+    0x00, 0x4e, 0x04, 0x7f, 0x41, 0x01, 0x05, 0x20, 0x01, 0x0b, 0x1a, 0x02,
+    0x40, 0x41, 0x7f, 0x41, 0x00, 0x10, 0x0a, 0x22, 0x01, 0x20, 0x01, 0x20,
+    0x00, 0x10, 0x09, 0x47, 0x1b, 0x41, 0x00, 0x48, 0x0d, 0x00, 0x02, 0x40,
+    0x20, 0x00, 0x2d, 0x00, 0x4b, 0x41, 0x0a, 0x46, 0x0d, 0x00, 0x20, 0x00,
+    0x28, 0x02, 0x14, 0x22, 0x01, 0x20, 0x00, 0x28, 0x02, 0x10, 0x4f, 0x0d,
+    0x00, 0x20, 0x00, 0x20, 0x01, 0x41, 0x01, 0x6a, 0x36, 0x02, 0x14, 0x20,
+    0x01, 0x41, 0x0a, 0x3a, 0x00, 0x00, 0x0c, 0x01, 0x0b, 0x20, 0x00, 0x10,
+    0x06, 0x0b, 0x0b, 0x3d, 0x01, 0x01, 0x7f, 0x20, 0x02, 0x04, 0x40, 0x03,
+    0x40, 0x20, 0x00, 0x20, 0x01, 0x20, 0x02, 0x41, 0x80, 0xc0, 0x00, 0x20,
+    0x02, 0x41, 0x80, 0xc0, 0x00, 0x49, 0x1b, 0x22, 0x03, 0x10, 0x03, 0x21,
+    0x00, 0x20, 0x01, 0x41, 0x80, 0x40, 0x6b, 0x21, 0x01, 0x20, 0x00, 0x41,
+    0x80, 0x40, 0x6b, 0x21, 0x00, 0x20, 0x02, 0x20, 0x03, 0x6b, 0x22, 0x02,
+    0x0d, 0x00, 0x0b, 0x0b, 0x0b, 0xb1, 0x02, 0x01, 0x06, 0x7f, 0x23, 0x00,
+    0x41, 0x20, 0x6b, 0x22, 0x03, 0x24, 0x00, 0x20, 0x03, 0x20, 0x00, 0x28,
+    0x02, 0x1c, 0x22, 0x04, 0x36, 0x02, 0x10, 0x20, 0x00, 0x28, 0x02, 0x14,
+    0x21, 0x05, 0x20, 0x03, 0x20, 0x02, 0x36, 0x02, 0x1c, 0x20, 0x03, 0x20,
+    0x01, 0x36, 0x02, 0x18, 0x20, 0x03, 0x20, 0x05, 0x20, 0x04, 0x6b, 0x22,
+    0x01, 0x36, 0x02, 0x14, 0x20, 0x01, 0x20, 0x02, 0x6a, 0x21, 0x06, 0x41,
+    0x02, 0x21, 0x05, 0x20, 0x03, 0x41, 0x10, 0x6a, 0x21, 0x01, 0x03, 0x40,
+    0x02, 0x40, 0x02, 0x7f, 0x20, 0x06, 0x02, 0x7f, 0x20, 0x00, 0x28, 0x02,
+    0x3c, 0x20, 0x01, 0x20, 0x05, 0x20, 0x03, 0x41, 0x0c, 0x6a, 0x10, 0x00,
+    0x04, 0x40, 0x20, 0x03, 0x41, 0x7f, 0x36, 0x02, 0x0c, 0x41, 0x7f, 0x0c,
+    0x01, 0x0b, 0x20, 0x03, 0x28, 0x02, 0x0c, 0x0b, 0x22, 0x04, 0x46, 0x04,
+    0x40, 0x20, 0x00, 0x20, 0x00, 0x28, 0x02, 0x2c, 0x22, 0x01, 0x36, 0x02,
+    0x1c, 0x20, 0x00, 0x20, 0x01, 0x36, 0x02, 0x14, 0x20, 0x00, 0x20, 0x01,
+    0x20, 0x00, 0x28, 0x02, 0x30, 0x6a, 0x36, 0x02, 0x10, 0x20, 0x02, 0x0c,
+    0x01, 0x0b, 0x20, 0x04, 0x41, 0x7f, 0x4a, 0x0d, 0x01, 0x20, 0x00, 0x41,
+    0x00, 0x36, 0x02, 0x1c, 0x20, 0x00, 0x42, 0x00, 0x37, 0x03, 0x10, 0x20,
+    0x00, 0x20, 0x00, 0x28, 0x02, 0x00, 0x41, 0x20, 0x72, 0x36, 0x02, 0x00,
+    0x41, 0x00, 0x20, 0x05, 0x41, 0x02, 0x46, 0x0d, 0x00, 0x1a, 0x20, 0x02,
+    0x20, 0x01, 0x28, 0x02, 0x04, 0x6b, 0x0b, 0x21, 0x04, 0x20, 0x03, 0x41,
+    0x20, 0x6a, 0x24, 0x00, 0x20, 0x04, 0x0f, 0x0b, 0x20, 0x01, 0x41, 0x08,
+    0x6a, 0x20, 0x01, 0x20, 0x04, 0x20, 0x01, 0x28, 0x02, 0x04, 0x22, 0x07,
+    0x4b, 0x22, 0x08, 0x1b, 0x22, 0x01, 0x20, 0x04, 0x20, 0x07, 0x41, 0x00,
+    0x20, 0x08, 0x1b, 0x6b, 0x22, 0x07, 0x20, 0x01, 0x28, 0x02, 0x00, 0x6a,
+    0x36, 0x02, 0x00, 0x20, 0x01, 0x20, 0x01, 0x28, 0x02, 0x04, 0x20, 0x07,
+    0x6b, 0x36, 0x02, 0x04, 0x20, 0x06, 0x20, 0x04, 0x6b, 0x21, 0x06, 0x20,
+    0x05, 0x20, 0x08, 0x6b, 0x21, 0x05, 0x0c, 0x00, 0x00, 0x0b, 0x00, 0x0b,
+    0x0b, 0x4d, 0x06, 0x00, 0x41, 0x80, 0x08, 0x0b, 0x12, 0x68, 0x65, 0x6c,
+    0x6c, 0x6f, 0x2c, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x21, 0x00, 0x00,
+    0x00, 0x18, 0x04, 0x00, 0x41, 0x98, 0x08, 0x0b, 0x01, 0x05, 0x00, 0x41,
+    0xa4, 0x08, 0x0b, 0x01, 0x01, 0x00, 0x41, 0xbc, 0x08, 0x0b, 0x0e, 0x02,
+    0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xb8, 0x04, 0x00, 0x00, 0x00,
+    0x04, 0x00, 0x41, 0xd4, 0x08, 0x0b, 0x01, 0x01, 0x00, 0x41, 0xe3, 0x08,
+    0x0b, 0x05, 0x0a, 0xff, 0xff, 0xff, 0xff,
+  ]);
+
+  // Trying to import WASI twice.
+  Expect.throws(
+      () => WasmModule(helloWorldData).instantiate().enableWasi().enableWasi(),
+      (Exception e) => "$e".contains("WASI is already enabled"));
+
+  // Missing imports due to not enabling WASI.
+  Expect.throws(() => WasmModule(helloWorldData).instantiate().build(),
+      (Exception e) => "$e".contains("Missing import"));
+
+  // Trying to get stdout/stderr without WASI enabled (WASI function import has
+  // been manually filled).
+  var inst = WasmModule(helloWorldData)
+      .instantiate()
+      .addFunction("wasi_unstable", "fd_write",
+          (int fd, int iovs, int iovs_len, int unused) => 0)
+      .build();
+  Expect.throws(
+      () => inst.stdout,
+      (Exception e) =>
+          "$e".contains("Can't capture stdout without WASI enabled"));
+  Expect.throws(
+      () => inst.stderr,
+      (Exception e) =>
+          "$e".contains("Can't capture stderr without WASI enabled"));
+}
diff --git a/tests/lib_2/async/stream_iterator_test.dart b/tests/lib_2/async/stream_iterator_test.dart
index c64a32f..1b952cd 100644
--- a/tests/lib_2/async/stream_iterator_test.dart
+++ b/tests/lib_2/async/stream_iterator_test.dart
@@ -70,6 +70,27 @@
     expect(await hasNext, isFalse);
     expect(await iterator.moveNext(), isFalse);
   });
+
+  test("regression 43799 (1)", () async {
+    // See: https://github.com/dart-lang/sdk/issues/43799
+    var badStream = StreamController<int>.broadcast(sync: true);
+    badStream.onListen = () {
+      badStream.add(1);
+      badStream.close();
+    };
+    var it = StreamIterator(badStream.stream);
+    expect(await it.moveNext(), false);
+  });
+
+  test("regression 43799 (2)", () async {
+    // See: https://github.com/dart-lang/sdk/issues/43799
+    var badStream = StreamController<int>.broadcast(sync: true);
+    badStream.onListen = () {
+      badStream.addError("bad");
+    };
+    var it = StreamIterator(badStream.stream);
+    expect(it.moveNext(), expectAsync(throwsA("bad")));
+  });
 }
 
 Stream createStream() async* {
diff --git a/tests/lib_2/html/js_extend_class_test.dart b/tests/lib_2/html/js_extend_class_test.dart
deleted file mode 100644
index 546a45a..0000000
--- a/tests/lib_2/html/js_extend_class_test.dart
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright (c) 2017, 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.
-
-@JS()
-library js_extend_class_test;
-
-import 'dart:html';
-
-import 'package:js/js.dart';
-import 'package:js/js_util.dart' as js_util;
-import 'package:expect/minitest.dart';
-
-@JS('Date')
-class JSDate {
-  external get jsField;
-  external get jsMethod;
-}
-
-@JS('Date.prototype.jsField')
-external set datePrototypeJSField(v);
-
-@JS('Date.prototype.jsMethod')
-external set datePrototypeJSMethod(v);
-
-// Extending a JS class with a Dart class is only supported by DDC for now.
-// We extend the Date class instead of a user defined JS class to avoid the
-// hassle of ensuring the JS class exists before we use it.
-class DartJsDate extends JSDate {
-  get dartField => 100;
-  int dartMethod(x) {
-    return x * 2;
-  }
-}
-
-main() {
-  // Monkey-patch the JS Date class.
-  datePrototypeJSField = 42;
-  datePrototypeJSMethod = allowInterop((x) => x * 10);
-
-  group('extend js class', () {
-    test('js class members', () {
-      var bar = new DartJsDate();
-      expect(bar.jsField, equals(42));
-      expect(bar.jsMethod(5), equals(50));
-
-      expect(bar.dartField, equals(100));
-      expect(bar.dartMethod(4), equals(8));
-    });
-
-    test('instance checks and casts', () {
-      var bar = new DartJsDate();
-      expect(bar is JSDate, isTrue);
-      expect(bar as JSDate, equals(bar));
-    });
-
-    test('dart subclass members', () {
-      var bar = new DartJsDate();
-      expect(bar.dartField, equals(100));
-      expect(bar.dartMethod(4), equals(8));
-    });
-  });
-}
diff --git a/tests/lib_2/isolate/issue_6610_test.dart b/tests/lib_2/isolate/issue_6610_test.dart
index 962955e..2b4a987 100644
--- a/tests/lib_2/isolate/issue_6610_test.dart
+++ b/tests/lib_2/isolate/issue_6610_test.dart
@@ -2,8 +2,8 @@
 // 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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
+// VMOptions=--enable-experiment=no-non-nullable --enable-isolate-groups
+// VMOptions=--enable-experiment=no-non-nullable --no-enable-isolate-groups
 
 // Testing that Isolate.spawn copies the source code of the parent isolate,
 // rather than rereading the parent's source URI.
@@ -28,6 +28,7 @@
     server.listen((HttpRequest request) {
       ++count;
       request.response.write("""
+        // @dart = 2.9
         import 'dart:isolate';
 
         void main(_, SendPort port) {
diff --git a/tests/lib_2/mirrors/library_uri_io_test.dart b/tests/lib_2/mirrors/library_uri_io_test.dart
index 8400843..302e848 100644
--- a/tests/lib_2/mirrors/library_uri_io_test.dart
+++ b/tests/lib_2/mirrors/library_uri_io_test.dart
@@ -23,6 +23,11 @@
 main() {
   var mirrors = currentMirrorSystem();
   test("Test current library uri", () {
+    if (!Platform.script.toString().endsWith('.dart')) {
+      print("Skipping library uri test as not running from source "
+          "(Platform.script = ${Platform.script})");
+      return;
+    }
     Uri uri = Uri.base.resolveUri(Platform.script);
     testLibraryUri(new Class(), uri);
   });
diff --git a/tests/lib_2/wasm/basic_test.dart b/tests/lib_2/wasm/basic_test.dart
index 72f4c6c..309f943 100644
--- a/tests/lib_2/wasm/basic_test.dart
+++ b/tests/lib_2/wasm/basic_test.dart
@@ -20,9 +20,9 @@
     0x7e, 0x0b,
   ]);
 
-  var inst = WasmModule(data).instantiate(WasmImports());
+  var inst = WasmModule(data).instantiate().build();
   var fn = inst.lookupFunction("square");
-  int n = fn.call(1234);
+  int n = fn(1234);
 
   Expect.equals(1234 * 1234, n);
 
diff --git a/tests/lib_2/wasm/fn_call_error_test.dart b/tests/lib_2/wasm/fn_call_error_test.dart
index 0c74768..641f915 100644
--- a/tests/lib_2/wasm/fn_call_error_test.dart
+++ b/tests/lib_2/wasm/fn_call_error_test.dart
@@ -20,7 +20,7 @@
     0x7e, 0x0b,
   ]);
 
-  var inst = WasmModule(data).instantiate(WasmImports());
+  var inst = WasmModule(data).instantiate().build();
   var fn = inst.lookupFunction("square");
 
   Expect.throwsArgumentError(() => fn());
diff --git a/tests/lib_2/wasm/fn_import_error_test.dart b/tests/lib_2/wasm/fn_import_error_test.dart
index 40466fb..aeca278 100644
--- a/tests/lib_2/wasm/fn_import_error_test.dart
+++ b/tests/lib_2/wasm/fn_import_error_test.dart
@@ -5,7 +5,7 @@
 // Test errors thrown by function imports.
 
 import "package:expect/expect.dart";
-import "dart:wasm";
+import "package:wasm/wasm.dart";
 import "dart:typed_data";
 
 void main() {
@@ -25,36 +25,44 @@
   ]);
 
   var mod = WasmModule(data);
-  var imp = WasmImports()
-    ..addFunction<Int64 Function(Int32, Int64, Float, Double)>(
-        "env", "someFn", (num a, num b, num c, num d) => 123);
-  mod.instantiate(imp);
 
-  imp = WasmImports();
-  Expect.throwsArgumentError(() => mod.instantiate(imp));
+  // Valid instantiation.
+  var inst = mod
+      .instantiate()
+      .addFunction("env", "someFn", (int a, int b, num c, double d) => 123)
+      .build();
 
-  imp = WasmImports()
-    ..addFunction<Int64 Function(Int32)>("env", "someFn", (num a) => 123);
-  Expect.throwsArgumentError(() => mod.instantiate(imp));
+  // Missing imports.
+  Expect.throws(() => mod.instantiate().build(),
+      (Exception e) => "$e".contains("Missing import"));
 
-  imp = WasmImports()
-    ..addFunction<Double Function(Int32, Int64, Float, Double)>(
-        "env", "someFn", (num a, num b, num c, num d) => 123);
-  Expect.throwsArgumentError(() => mod.instantiate(imp));
+  // Wrong kind of import.
+  Expect.throws(
+      () => mod.instantiate().addMemory("env", "someFn", mod.createMemory(10)),
+      (Exception e) => "$e".contains("Import is not a memory"));
 
-  imp = WasmImports()
-    ..addFunction<Int64 Function(Int32, Int64, Float, Float)>(
-        "env", "someFn", (num a, num b, num c, num d) => 123);
-  Expect.throwsArgumentError(() => mod.instantiate(imp));
+  // Wrong namespace.
+  Expect.throws(
+      () => mod
+          .instantiate()
+          .addFunction("foo", "someFn", (int a, int b, num c, double d) => 123)
+          .build(),
+      (Exception e) => "$e".contains("Import not found"));
 
-  Expect.throwsArgumentError(() => WasmImports()
-    ..addFunction<dynamic Function(Int32, Int64, Float, Double)>(
-        "env", "someFn", (num a, num b, num c, num d) => 123));
+  // Wrong name.
+  Expect.throws(
+      () => mod
+          .instantiate()
+          .addFunction("env", "otherFn", (int a, int b, num c, double d) => 123)
+          .build(),
+      (Exception e) => "$e".contains("Import not found"));
 
-  Expect.throwsArgumentError(() => WasmImports()
-    ..addFunction<Int64 Function(Int32, Int64, dynamic, Double)>(
-        "env", "someFn", (num a, num b, num c, num d) => 123));
-
-  imp = WasmImports()..addGlobal<Int64>("env", "someFn", 123, false);
-  Expect.throwsArgumentError(() => mod.instantiate(imp));
+  // Already filled.
+  Expect.throws(
+      () => mod
+          .instantiate()
+          .addFunction("env", "someFn", (int a, int b, num c, double d) => 123)
+          .addFunction("env", "someFn", (int a, int b, num c, double d) => 456)
+          .build(),
+      (Exception e) => "$e".contains("Import already filled"));
 }
diff --git a/tests/lib_2/wasm/fn_import_exception_test.dart b/tests/lib_2/wasm/fn_import_exception_test.dart
index 73298d9..c97a68a 100644
--- a/tests/lib_2/wasm/fn_import_exception_test.dart
+++ b/tests/lib_2/wasm/fn_import_exception_test.dart
@@ -5,43 +5,44 @@
 // Test throwing exceptions from an imported function.
 
 import "package:expect/expect.dart";
-import "dart:wasm";
+import "package:wasm/wasm.dart";
 import "dart:typed_data";
 
 void main() {
-  // int64_t fn(int64_t x) { return throwIfNegative(x); }
+  // void fn() {
+  //   a();
+  //   b();
+  // }
   var data = Uint8List.fromList([
-    0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x06, 0x01, 0x60,
-    0x01, 0x7e, 0x01, 0x7e, 0x02, 0x17, 0x01, 0x03, 0x65, 0x6e, 0x76, 0x0f,
-    0x74, 0x68, 0x72, 0x6f, 0x77, 0x49, 0x66, 0x4e, 0x65, 0x67, 0x61, 0x74,
-    0x69, 0x76, 0x65, 0x00, 0x00, 0x03, 0x02, 0x01, 0x00, 0x04, 0x05, 0x01,
-    0x70, 0x01, 0x01, 0x01, 0x05, 0x03, 0x01, 0x00, 0x02, 0x06, 0x08, 0x01,
-    0x7f, 0x01, 0x41, 0x80, 0x88, 0x04, 0x0b, 0x07, 0x0f, 0x02, 0x06, 0x6d,
-    0x65, 0x6d, 0x6f, 0x72, 0x79, 0x02, 0x00, 0x02, 0x66, 0x6e, 0x00, 0x01,
-    0x0a, 0x0c, 0x01, 0x0a, 0x00, 0x20, 0x00, 0x10, 0x80, 0x80, 0x80, 0x80,
-    0x00, 0x0b,
+    0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0x60,
+    0x00, 0x00, 0x02, 0x11, 0x02, 0x03, 0x65, 0x6e, 0x76, 0x01, 0x61, 0x00,
+    0x00, 0x03, 0x65, 0x6e, 0x76, 0x01, 0x62, 0x00, 0x00, 0x03, 0x02, 0x01,
+    0x00, 0x04, 0x05, 0x01, 0x70, 0x01, 0x01, 0x01, 0x05, 0x03, 0x01, 0x00,
+    0x02, 0x06, 0x08, 0x01, 0x7f, 0x01, 0x41, 0x80, 0x88, 0x04, 0x0b, 0x07,
+    0x0f, 0x02, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x02, 0x00, 0x02,
+    0x66, 0x6e, 0x00, 0x02, 0x0a, 0x10, 0x01, 0x0e, 0x00, 0x10, 0x80, 0x80,
+    0x80, 0x80, 0x00, 0x10, 0x81, 0x80, 0x80, 0x80, 0x00, 0x0b,
   ]);
 
-  dynamic override = null;
-  var inst = WasmModule(data).instantiate(WasmImports()
-    ..addMemory("env", "memory", WasmMemory(256, 1024))
-    ..addGlobal<Int32>("env", "__memory_base", 1024, false)
-    ..addFunction<Int64 Function(Int64)>("env", "throwIfNegative", (int x) {
-      if (x < 0) {
-        throw Exception(x);
-      }
-      if (override != null) {
-        return override;
-      }
-      return x;
-    }));
-  var fn = inst.lookupFunction<Int64 Function(Int64)>("fn");
+  bool called_b = false;
+  var thrownException = Exception("Hello exception!");
+  var inst = WasmModule(data).instantiate().addFunction("env", "a", () {
+    throw thrownException;
+  }).addFunction("env", "b", () {
+    called_b = true;
+  }).build();
+  var fn = inst.lookupFunction("fn");
+  Expect.throws(() => fn(), (Exception e) => e == thrownException);
+  Expect.isFalse(called_b);
 
-  Expect.equals(123, fn.call([123]));
-  Expect.throws(() => fn.call([-456]), (Exception e) => "$e".contains("-456"));
-
-  override = "Not an integer";
-  Expect.throwsArgumentError(() => fn.call([789]));
-  override = 0.123;
-  Expect.throwsArgumentError(() => fn.call([789]));
+  bool called_a = false;
+  inst = WasmModule(data).instantiate().addFunction("env", "a", () {
+    called_a = true;
+  }).addFunction("env", "b", () {
+    called_b = true;
+  }).build();
+  fn = inst.lookupFunction("fn");
+  fn();
+  Expect.isTrue(called_a);
+  Expect.isTrue(called_b);
 }
diff --git a/tests/lib_2/wasm/fn_import_test.dart b/tests/lib_2/wasm/fn_import_test.dart
index a9f9bdb..3558c17 100644
--- a/tests/lib_2/wasm/fn_import_test.dart
+++ b/tests/lib_2/wasm/fn_import_test.dart
@@ -5,7 +5,7 @@
 // Test that we can load a wasm module, find a function, and call it.
 
 import "package:expect/expect.dart";
-import "dart:wasm";
+import "package:wasm/wasm.dart";
 import "dart:typed_data";
 
 void main() {
@@ -25,13 +25,13 @@
   int report_x = -1;
   int report_y = -1;
 
-  var inst = WasmModule(data).instantiate(WasmImports()
-    ..addFunction<Void Function(Int64, Int64)>("env", "report", (int x, int y) {
+  var inst = WasmModule(data).instantiate()
+    .addFunction("env", "report", (int x, int y) {
       report_x = x;
       report_y = y;
-    }));
-  var fn = inst.lookupFunction<Void Function()>("reportStuff");
-  fn.call([]);
+    }).build();
+  var fn = inst.lookupFunction("reportStuff");
+  fn();
   Expect.equals(report_x, 123);
   Expect.equals(report_y, 456);
 }
diff --git a/tests/lib_2/wasm/hello_wasi_test.dart b/tests/lib_2/wasm/hello_wasi_test.dart
new file mode 100644
index 0000000..d862b89
--- /dev/null
+++ b/tests/lib_2/wasm/hello_wasi_test.dart
@@ -0,0 +1,184 @@
+// 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.
+
+// Variant of hello_world_test that uses the default WASI imports.
+
+import "package:async_helper/async_helper.dart";
+import "package:expect/expect.dart";
+import "package:wasm/wasm.dart";
+import "dart:convert";
+import "dart:typed_data";
+
+void main() async {
+  asyncStart();
+
+  // Hello world module generated by emscripten+WASI. Exports a function like
+  // `void _start()`, and prints using `int fd_write(int, int, int, int)`.
+  var data = Uint8List.fromList([
+    0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x33, 0x09, 0x60,
+    0x03, 0x7f, 0x7f, 0x7f, 0x01, 0x7f, 0x60, 0x04, 0x7f, 0x7f, 0x7f, 0x7f,
+    0x01, 0x7f, 0x60, 0x00, 0x00, 0x60, 0x02, 0x7f, 0x7f, 0x01, 0x7f, 0x60,
+    0x01, 0x7f, 0x01, 0x7f, 0x60, 0x03, 0x7f, 0x7e, 0x7f, 0x01, 0x7e, 0x60,
+    0x00, 0x01, 0x7f, 0x60, 0x01, 0x7f, 0x00, 0x60, 0x03, 0x7f, 0x7f, 0x7f,
+    0x00, 0x02, 0x1a, 0x01, 0x0d, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x75, 0x6e,
+    0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x08, 0x66, 0x64, 0x5f, 0x77, 0x72,
+    0x69, 0x74, 0x65, 0x00, 0x01, 0x03, 0x0f, 0x0e, 0x03, 0x04, 0x00, 0x03,
+    0x02, 0x07, 0x05, 0x04, 0x03, 0x06, 0x02, 0x02, 0x08, 0x00, 0x04, 0x05,
+    0x01, 0x70, 0x01, 0x04, 0x04, 0x05, 0x06, 0x01, 0x01, 0x80, 0x02, 0x80,
+    0x02, 0x06, 0x09, 0x01, 0x7f, 0x01, 0x41, 0xc0, 0x95, 0xc0, 0x02, 0x0b,
+    0x07, 0x2e, 0x04, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x02, 0x00,
+    0x11, 0x5f, 0x5f, 0x77, 0x61, 0x73, 0x6d, 0x5f, 0x63, 0x61, 0x6c, 0x6c,
+    0x5f, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x00, 0x05, 0x04, 0x6d, 0x61, 0x69,
+    0x6e, 0x00, 0x04, 0x06, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x00, 0x0b,
+    0x09, 0x09, 0x01, 0x00, 0x41, 0x01, 0x0b, 0x03, 0x08, 0x0e, 0x07, 0x0a,
+    0xae, 0x0c, 0x0e, 0xbf, 0x01, 0x01, 0x05, 0x7f, 0x41, 0x80, 0x08, 0x21,
+    0x04, 0x02, 0x40, 0x20, 0x01, 0x28, 0x02, 0x10, 0x22, 0x02, 0x04, 0x7f,
+    0x20, 0x02, 0x05, 0x20, 0x01, 0x10, 0x02, 0x0d, 0x01, 0x20, 0x01, 0x28,
+    0x02, 0x10, 0x0b, 0x20, 0x01, 0x28, 0x02, 0x14, 0x22, 0x05, 0x6b, 0x20,
+    0x00, 0x49, 0x04, 0x40, 0x20, 0x01, 0x41, 0x80, 0x08, 0x20, 0x00, 0x20,
+    0x01, 0x28, 0x02, 0x24, 0x11, 0x00, 0x00, 0x0f, 0x0b, 0x02, 0x40, 0x20,
+    0x01, 0x2c, 0x00, 0x4b, 0x41, 0x00, 0x48, 0x0d, 0x00, 0x20, 0x00, 0x21,
+    0x03, 0x03, 0x40, 0x20, 0x03, 0x22, 0x02, 0x45, 0x0d, 0x01, 0x20, 0x02,
+    0x41, 0x7f, 0x6a, 0x22, 0x03, 0x41, 0x80, 0x08, 0x6a, 0x2d, 0x00, 0x00,
+    0x41, 0x0a, 0x47, 0x0d, 0x00, 0x0b, 0x20, 0x01, 0x41, 0x80, 0x08, 0x20,
+    0x02, 0x20, 0x01, 0x28, 0x02, 0x24, 0x11, 0x00, 0x00, 0x22, 0x03, 0x20,
+    0x02, 0x49, 0x0d, 0x01, 0x20, 0x00, 0x20, 0x02, 0x6b, 0x21, 0x00, 0x20,
+    0x02, 0x41, 0x80, 0x08, 0x6a, 0x21, 0x04, 0x20, 0x01, 0x28, 0x02, 0x14,
+    0x21, 0x05, 0x20, 0x02, 0x21, 0x06, 0x0b, 0x20, 0x05, 0x20, 0x04, 0x20,
+    0x00, 0x10, 0x03, 0x1a, 0x20, 0x01, 0x20, 0x01, 0x28, 0x02, 0x14, 0x20,
+    0x00, 0x6a, 0x36, 0x02, 0x14, 0x20, 0x00, 0x20, 0x06, 0x6a, 0x21, 0x03,
+    0x0b, 0x20, 0x03, 0x0b, 0x59, 0x01, 0x01, 0x7f, 0x20, 0x00, 0x20, 0x00,
+    0x2d, 0x00, 0x4a, 0x22, 0x01, 0x41, 0x7f, 0x6a, 0x20, 0x01, 0x72, 0x3a,
+    0x00, 0x4a, 0x20, 0x00, 0x28, 0x02, 0x00, 0x22, 0x01, 0x41, 0x08, 0x71,
+    0x04, 0x40, 0x20, 0x00, 0x20, 0x01, 0x41, 0x20, 0x72, 0x36, 0x02, 0x00,
+    0x41, 0x7f, 0x0f, 0x0b, 0x20, 0x00, 0x42, 0x00, 0x37, 0x02, 0x04, 0x20,
+    0x00, 0x20, 0x00, 0x28, 0x02, 0x2c, 0x22, 0x01, 0x36, 0x02, 0x1c, 0x20,
+    0x00, 0x20, 0x01, 0x36, 0x02, 0x14, 0x20, 0x00, 0x20, 0x01, 0x20, 0x00,
+    0x28, 0x02, 0x30, 0x6a, 0x36, 0x02, 0x10, 0x41, 0x00, 0x0b, 0x82, 0x04,
+    0x01, 0x03, 0x7f, 0x20, 0x02, 0x41, 0x80, 0xc0, 0x00, 0x4f, 0x04, 0x40,
+    0x20, 0x00, 0x20, 0x01, 0x20, 0x02, 0x10, 0x0d, 0x20, 0x00, 0x0f, 0x0b,
+    0x20, 0x00, 0x20, 0x02, 0x6a, 0x21, 0x03, 0x02, 0x40, 0x20, 0x00, 0x20,
+    0x01, 0x73, 0x41, 0x03, 0x71, 0x45, 0x04, 0x40, 0x02, 0x40, 0x20, 0x02,
+    0x41, 0x01, 0x48, 0x04, 0x40, 0x20, 0x00, 0x21, 0x02, 0x0c, 0x01, 0x0b,
+    0x20, 0x00, 0x41, 0x03, 0x71, 0x45, 0x04, 0x40, 0x20, 0x00, 0x21, 0x02,
+    0x0c, 0x01, 0x0b, 0x20, 0x00, 0x21, 0x02, 0x03, 0x40, 0x20, 0x02, 0x20,
+    0x01, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x01, 0x41, 0x01, 0x6a,
+    0x21, 0x01, 0x20, 0x02, 0x41, 0x01, 0x6a, 0x22, 0x02, 0x20, 0x03, 0x4f,
+    0x0d, 0x01, 0x20, 0x02, 0x41, 0x03, 0x71, 0x0d, 0x00, 0x0b, 0x0b, 0x02,
+    0x40, 0x20, 0x03, 0x41, 0x7c, 0x71, 0x22, 0x04, 0x41, 0xc0, 0x00, 0x49,
+    0x0d, 0x00, 0x20, 0x02, 0x20, 0x04, 0x41, 0x40, 0x6a, 0x22, 0x05, 0x4b,
+    0x0d, 0x00, 0x03, 0x40, 0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x00, 0x36,
+    0x02, 0x00, 0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x04, 0x36, 0x02, 0x04,
+    0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x08, 0x36, 0x02, 0x08, 0x20, 0x02,
+    0x20, 0x01, 0x28, 0x02, 0x0c, 0x36, 0x02, 0x0c, 0x20, 0x02, 0x20, 0x01,
+    0x28, 0x02, 0x10, 0x36, 0x02, 0x10, 0x20, 0x02, 0x20, 0x01, 0x28, 0x02,
+    0x14, 0x36, 0x02, 0x14, 0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x18, 0x36,
+    0x02, 0x18, 0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x1c, 0x36, 0x02, 0x1c,
+    0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x20, 0x36, 0x02, 0x20, 0x20, 0x02,
+    0x20, 0x01, 0x28, 0x02, 0x24, 0x36, 0x02, 0x24, 0x20, 0x02, 0x20, 0x01,
+    0x28, 0x02, 0x28, 0x36, 0x02, 0x28, 0x20, 0x02, 0x20, 0x01, 0x28, 0x02,
+    0x2c, 0x36, 0x02, 0x2c, 0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x30, 0x36,
+    0x02, 0x30, 0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x34, 0x36, 0x02, 0x34,
+    0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x38, 0x36, 0x02, 0x38, 0x20, 0x02,
+    0x20, 0x01, 0x28, 0x02, 0x3c, 0x36, 0x02, 0x3c, 0x20, 0x01, 0x41, 0x40,
+    0x6b, 0x21, 0x01, 0x20, 0x02, 0x41, 0x40, 0x6b, 0x22, 0x02, 0x20, 0x05,
+    0x4d, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x02, 0x20, 0x04, 0x4f, 0x0d, 0x01,
+    0x03, 0x40, 0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x00, 0x36, 0x02, 0x00,
+    0x20, 0x01, 0x41, 0x04, 0x6a, 0x21, 0x01, 0x20, 0x02, 0x41, 0x04, 0x6a,
+    0x22, 0x02, 0x20, 0x04, 0x49, 0x0d, 0x00, 0x0b, 0x0c, 0x01, 0x0b, 0x20,
+    0x03, 0x41, 0x04, 0x49, 0x04, 0x40, 0x20, 0x00, 0x21, 0x02, 0x0c, 0x01,
+    0x0b, 0x20, 0x03, 0x41, 0x7c, 0x6a, 0x22, 0x04, 0x20, 0x00, 0x49, 0x04,
+    0x40, 0x20, 0x00, 0x21, 0x02, 0x0c, 0x01, 0x0b, 0x20, 0x00, 0x21, 0x02,
+    0x03, 0x40, 0x20, 0x02, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00,
+    0x20, 0x02, 0x20, 0x01, 0x2d, 0x00, 0x01, 0x3a, 0x00, 0x01, 0x20, 0x02,
+    0x20, 0x01, 0x2d, 0x00, 0x02, 0x3a, 0x00, 0x02, 0x20, 0x02, 0x20, 0x01,
+    0x2d, 0x00, 0x03, 0x3a, 0x00, 0x03, 0x20, 0x01, 0x41, 0x04, 0x6a, 0x21,
+    0x01, 0x20, 0x02, 0x41, 0x04, 0x6a, 0x22, 0x02, 0x20, 0x04, 0x4d, 0x0d,
+    0x00, 0x0b, 0x0b, 0x20, 0x02, 0x20, 0x03, 0x49, 0x04, 0x40, 0x03, 0x40,
+    0x20, 0x02, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x01,
+    0x41, 0x01, 0x6a, 0x21, 0x01, 0x20, 0x02, 0x41, 0x01, 0x6a, 0x22, 0x02,
+    0x20, 0x03, 0x47, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x0b, 0x06, 0x00,
+    0x10, 0x0c, 0x41, 0x00, 0x0b, 0x03, 0x00, 0x01, 0x0b, 0x7e, 0x01, 0x03,
+    0x7f, 0x23, 0x00, 0x41, 0x10, 0x6b, 0x22, 0x01, 0x24, 0x00, 0x20, 0x01,
+    0x41, 0x0a, 0x3a, 0x00, 0x0f, 0x02, 0x40, 0x20, 0x00, 0x28, 0x02, 0x10,
+    0x22, 0x02, 0x45, 0x04, 0x40, 0x20, 0x00, 0x10, 0x02, 0x0d, 0x01, 0x20,
+    0x00, 0x28, 0x02, 0x10, 0x21, 0x02, 0x0b, 0x02, 0x40, 0x20, 0x00, 0x28,
+    0x02, 0x14, 0x22, 0x03, 0x20, 0x02, 0x4f, 0x0d, 0x00, 0x20, 0x00, 0x2c,
+    0x00, 0x4b, 0x41, 0x0a, 0x46, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x03, 0x41,
+    0x01, 0x6a, 0x36, 0x02, 0x14, 0x20, 0x03, 0x41, 0x0a, 0x3a, 0x00, 0x00,
+    0x0c, 0x01, 0x0b, 0x20, 0x00, 0x20, 0x01, 0x41, 0x0f, 0x6a, 0x41, 0x01,
+    0x20, 0x00, 0x28, 0x02, 0x24, 0x11, 0x00, 0x00, 0x41, 0x01, 0x47, 0x0d,
+    0x00, 0x20, 0x01, 0x2d, 0x00, 0x0f, 0x1a, 0x0b, 0x20, 0x01, 0x41, 0x10,
+    0x6a, 0x24, 0x00, 0x0b, 0x04, 0x00, 0x42, 0x00, 0x0b, 0x04, 0x00, 0x41,
+    0x00, 0x0b, 0x31, 0x01, 0x01, 0x7f, 0x20, 0x00, 0x21, 0x02, 0x20, 0x02,
+    0x02, 0x7f, 0x20, 0x01, 0x28, 0x02, 0x4c, 0x41, 0x7f, 0x4c, 0x04, 0x40,
+    0x20, 0x02, 0x20, 0x01, 0x10, 0x01, 0x0c, 0x01, 0x0b, 0x20, 0x02, 0x20,
+    0x01, 0x10, 0x01, 0x0b, 0x22, 0x01, 0x46, 0x04, 0x40, 0x20, 0x00, 0x0f,
+    0x0b, 0x20, 0x01, 0x0b, 0x62, 0x01, 0x03, 0x7f, 0x41, 0x80, 0x08, 0x21,
+    0x00, 0x03, 0x40, 0x20, 0x00, 0x22, 0x01, 0x41, 0x04, 0x6a, 0x21, 0x00,
+    0x20, 0x01, 0x28, 0x02, 0x00, 0x22, 0x02, 0x41, 0x7f, 0x73, 0x20, 0x02,
+    0x41, 0xff, 0xfd, 0xfb, 0x77, 0x6a, 0x71, 0x41, 0x80, 0x81, 0x82, 0x84,
+    0x78, 0x71, 0x45, 0x0d, 0x00, 0x0b, 0x02, 0x40, 0x20, 0x02, 0x41, 0xff,
+    0x01, 0x71, 0x45, 0x04, 0x40, 0x20, 0x01, 0x21, 0x00, 0x0c, 0x01, 0x0b,
+    0x03, 0x40, 0x20, 0x01, 0x2d, 0x00, 0x01, 0x21, 0x02, 0x20, 0x01, 0x41,
+    0x01, 0x6a, 0x22, 0x00, 0x21, 0x01, 0x20, 0x02, 0x0d, 0x00, 0x0b, 0x0b,
+    0x20, 0x00, 0x41, 0x80, 0x08, 0x6b, 0x0b, 0x0c, 0x00, 0x02, 0x7f, 0x41,
+    0x00, 0x41, 0x00, 0x10, 0x04, 0x0b, 0x1a, 0x0b, 0x66, 0x01, 0x02, 0x7f,
+    0x41, 0x90, 0x08, 0x28, 0x02, 0x00, 0x22, 0x00, 0x28, 0x02, 0x4c, 0x41,
+    0x00, 0x4e, 0x04, 0x7f, 0x41, 0x01, 0x05, 0x20, 0x01, 0x0b, 0x1a, 0x02,
+    0x40, 0x41, 0x7f, 0x41, 0x00, 0x10, 0x0a, 0x22, 0x01, 0x20, 0x01, 0x20,
+    0x00, 0x10, 0x09, 0x47, 0x1b, 0x41, 0x00, 0x48, 0x0d, 0x00, 0x02, 0x40,
+    0x20, 0x00, 0x2d, 0x00, 0x4b, 0x41, 0x0a, 0x46, 0x0d, 0x00, 0x20, 0x00,
+    0x28, 0x02, 0x14, 0x22, 0x01, 0x20, 0x00, 0x28, 0x02, 0x10, 0x4f, 0x0d,
+    0x00, 0x20, 0x00, 0x20, 0x01, 0x41, 0x01, 0x6a, 0x36, 0x02, 0x14, 0x20,
+    0x01, 0x41, 0x0a, 0x3a, 0x00, 0x00, 0x0c, 0x01, 0x0b, 0x20, 0x00, 0x10,
+    0x06, 0x0b, 0x0b, 0x3d, 0x01, 0x01, 0x7f, 0x20, 0x02, 0x04, 0x40, 0x03,
+    0x40, 0x20, 0x00, 0x20, 0x01, 0x20, 0x02, 0x41, 0x80, 0xc0, 0x00, 0x20,
+    0x02, 0x41, 0x80, 0xc0, 0x00, 0x49, 0x1b, 0x22, 0x03, 0x10, 0x03, 0x21,
+    0x00, 0x20, 0x01, 0x41, 0x80, 0x40, 0x6b, 0x21, 0x01, 0x20, 0x00, 0x41,
+    0x80, 0x40, 0x6b, 0x21, 0x00, 0x20, 0x02, 0x20, 0x03, 0x6b, 0x22, 0x02,
+    0x0d, 0x00, 0x0b, 0x0b, 0x0b, 0xb1, 0x02, 0x01, 0x06, 0x7f, 0x23, 0x00,
+    0x41, 0x20, 0x6b, 0x22, 0x03, 0x24, 0x00, 0x20, 0x03, 0x20, 0x00, 0x28,
+    0x02, 0x1c, 0x22, 0x04, 0x36, 0x02, 0x10, 0x20, 0x00, 0x28, 0x02, 0x14,
+    0x21, 0x05, 0x20, 0x03, 0x20, 0x02, 0x36, 0x02, 0x1c, 0x20, 0x03, 0x20,
+    0x01, 0x36, 0x02, 0x18, 0x20, 0x03, 0x20, 0x05, 0x20, 0x04, 0x6b, 0x22,
+    0x01, 0x36, 0x02, 0x14, 0x20, 0x01, 0x20, 0x02, 0x6a, 0x21, 0x06, 0x41,
+    0x02, 0x21, 0x05, 0x20, 0x03, 0x41, 0x10, 0x6a, 0x21, 0x01, 0x03, 0x40,
+    0x02, 0x40, 0x02, 0x7f, 0x20, 0x06, 0x02, 0x7f, 0x20, 0x00, 0x28, 0x02,
+    0x3c, 0x20, 0x01, 0x20, 0x05, 0x20, 0x03, 0x41, 0x0c, 0x6a, 0x10, 0x00,
+    0x04, 0x40, 0x20, 0x03, 0x41, 0x7f, 0x36, 0x02, 0x0c, 0x41, 0x7f, 0x0c,
+    0x01, 0x0b, 0x20, 0x03, 0x28, 0x02, 0x0c, 0x0b, 0x22, 0x04, 0x46, 0x04,
+    0x40, 0x20, 0x00, 0x20, 0x00, 0x28, 0x02, 0x2c, 0x22, 0x01, 0x36, 0x02,
+    0x1c, 0x20, 0x00, 0x20, 0x01, 0x36, 0x02, 0x14, 0x20, 0x00, 0x20, 0x01,
+    0x20, 0x00, 0x28, 0x02, 0x30, 0x6a, 0x36, 0x02, 0x10, 0x20, 0x02, 0x0c,
+    0x01, 0x0b, 0x20, 0x04, 0x41, 0x7f, 0x4a, 0x0d, 0x01, 0x20, 0x00, 0x41,
+    0x00, 0x36, 0x02, 0x1c, 0x20, 0x00, 0x42, 0x00, 0x37, 0x03, 0x10, 0x20,
+    0x00, 0x20, 0x00, 0x28, 0x02, 0x00, 0x41, 0x20, 0x72, 0x36, 0x02, 0x00,
+    0x41, 0x00, 0x20, 0x05, 0x41, 0x02, 0x46, 0x0d, 0x00, 0x1a, 0x20, 0x02,
+    0x20, 0x01, 0x28, 0x02, 0x04, 0x6b, 0x0b, 0x21, 0x04, 0x20, 0x03, 0x41,
+    0x20, 0x6a, 0x24, 0x00, 0x20, 0x04, 0x0f, 0x0b, 0x20, 0x01, 0x41, 0x08,
+    0x6a, 0x20, 0x01, 0x20, 0x04, 0x20, 0x01, 0x28, 0x02, 0x04, 0x22, 0x07,
+    0x4b, 0x22, 0x08, 0x1b, 0x22, 0x01, 0x20, 0x04, 0x20, 0x07, 0x41, 0x00,
+    0x20, 0x08, 0x1b, 0x6b, 0x22, 0x07, 0x20, 0x01, 0x28, 0x02, 0x00, 0x6a,
+    0x36, 0x02, 0x00, 0x20, 0x01, 0x20, 0x01, 0x28, 0x02, 0x04, 0x20, 0x07,
+    0x6b, 0x36, 0x02, 0x04, 0x20, 0x06, 0x20, 0x04, 0x6b, 0x21, 0x06, 0x20,
+    0x05, 0x20, 0x08, 0x6b, 0x21, 0x05, 0x0c, 0x00, 0x00, 0x0b, 0x00, 0x0b,
+    0x0b, 0x4d, 0x06, 0x00, 0x41, 0x80, 0x08, 0x0b, 0x12, 0x68, 0x65, 0x6c,
+    0x6c, 0x6f, 0x2c, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x21, 0x00, 0x00,
+    0x00, 0x18, 0x04, 0x00, 0x41, 0x98, 0x08, 0x0b, 0x01, 0x05, 0x00, 0x41,
+    0xa4, 0x08, 0x0b, 0x01, 0x01, 0x00, 0x41, 0xbc, 0x08, 0x0b, 0x0e, 0x02,
+    0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xb8, 0x04, 0x00, 0x00, 0x00,
+    0x04, 0x00, 0x41, 0xd4, 0x08, 0x0b, 0x01, 0x01, 0x00, 0x41, 0xe3, 0x08,
+    0x0b, 0x05, 0x0a, 0xff, 0xff, 0xff, 0xff,
+  ]);
+
+  var inst =
+      WasmModule(data).instantiate().enableWasi(captureStdout: true).build();
+
+  var fn = inst.lookupFunction("_start");
+  fn();
+  var out = utf8.decode(await inst.stdout.first);
+  Expect.equals("hello, world!\n", out);
+  asyncEnd();
+}
diff --git a/tests/lib_2/wasm/hello_world_test.dart b/tests/lib_2/wasm/hello_world_test.dart
index c4441e3..b3ef2a5 100644
--- a/tests/lib_2/wasm/hello_world_test.dart
+++ b/tests/lib_2/wasm/hello_world_test.dart
@@ -5,7 +5,7 @@
 // Test for hello world built using emscripten with WASI.
 
 import "package:expect/expect.dart";
-import "dart:wasm";
+import "package:wasm/wasm.dart";
 import "dart:typed_data";
 
 void main() {
@@ -180,26 +180,26 @@
     }
     return n;
   };
-  var inst = WasmModule(data).instantiate(WasmImports()
-    ..addFunction<Int32 Function(Int32, Int32, Int32, Int32)>(
-        "wasi_unstable", "fd_write",
-        (int fd, int iovs, int iovs_len, int unused) {
-      // iovs points to an array of length iovs_len. Each element is two I32s,
-      // a char* and a length.
-      String o = "";
-      for (var i = 0; i < iovs_len; ++i) {
-        var str = getI32(iovs + 8 * i);
-        var len = getI32(iovs + 4 + 8 * i);
-        for (var j = 0; j < len; ++j) {
-          o += String.fromCharCode(mem[str + j]);
-        }
+  var inst = WasmModule(data)
+      .instantiate()
+      .addFunction("wasi_unstable", "fd_write",
+          (int fd, int iovs, int iovs_len, int unused) {
+    // iovs points to an array of length iovs_len. Each element is two I32s,
+    // a char* and a length.
+    String o = "";
+    for (var i = 0; i < iovs_len; ++i) {
+      var str = getI32(iovs + 8 * i);
+      var len = getI32(iovs + 4 + 8 * i);
+      for (var j = 0; j < len; ++j) {
+        o += String.fromCharCode(mem[str + j]);
       }
-      out += o;
-      return o.length;
-    }));
+    }
+    out += o;
+    return o.length;
+  }).build();
   mem = inst.memory;
 
-  var fn = inst.lookupFunction<Void Function()>("_start");
-  fn.call([]);
+  var fn = inst.lookupFunction("_start");
+  fn();
   Expect.equals("hello, world!\n", out);
 }
diff --git a/tests/lib_2/wasm/memory_error_test.dart b/tests/lib_2/wasm/memory_error_test.dart
index 3a172d8..f02dc6c 100644
--- a/tests/lib_2/wasm/memory_error_test.dart
+++ b/tests/lib_2/wasm/memory_error_test.dart
@@ -9,9 +9,14 @@
 import "dart:typed_data";
 
 void main() {
-  Expect.throws(() => WasmMemory(1000000000));
-  var mem = WasmMemory(100);
+  // Empty wasm module.
+  var data = Uint8List.fromList(
+      [0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x06, 0x81, 0x00, 0x00]);
+  var module = WasmModule(data);
+
+  Expect.throws(() => module.createMemory(1000000000));
+  var mem = module.createMemory(100);
   Expect.throws(() => mem.grow(1000000000));
-  mem = WasmMemory(100, 200);
+  mem = module.createMemory(100, 200);
   Expect.throws(() => mem.grow(300));
 }
diff --git a/tests/lib_2/wasm/memory_test.dart b/tests/lib_2/wasm/memory_test.dart
index ecaf433..544c6a1 100644
--- a/tests/lib_2/wasm/memory_test.dart
+++ b/tests/lib_2/wasm/memory_test.dart
@@ -9,7 +9,12 @@
 import "dart:typed_data";
 
 void main() {
-  var mem = WasmMemory(100);
+  // Empty wasm module.
+  var data = Uint8List.fromList(
+      [0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x06, 0x81, 0x00, 0x00]);
+  var module = WasmModule(data);
+
+  var mem = module.createMemory(100);
   Expect.equals(100, mem.lengthInPages);
   Expect.equals(100 * WasmMemory.kPageSizeInBytes, mem.lengthInBytes);
 
diff --git a/tests/lib_2/wasm/numerics_test.dart b/tests/lib_2/wasm/numerics_test.dart
index 158549a..eba9aaa 100644
--- a/tests/lib_2/wasm/numerics_test.dart
+++ b/tests/lib_2/wasm/numerics_test.dart
@@ -29,7 +29,7 @@
     0x01, 0x92, 0x0b,
   ]);
 
-  var inst = WasmModule(data).instantiate(WasmImports());
+  var inst = WasmModule(data).instantiate().build();
   var addI64 = inst.lookupFunction("addI64");
   var addI32 = inst.lookupFunction("addI32");
   var addF64 = inst.lookupFunction("addF64");
diff --git a/tests/lib_2/wasm/void_test.dart b/tests/lib_2/wasm/void_test.dart
index fe94693..aba9c65 100644
--- a/tests/lib_2/wasm/void_test.dart
+++ b/tests/lib_2/wasm/void_test.dart
@@ -25,7 +25,7 @@
     0x80, 0x08, 0x0b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   ]);
 
-  var inst = WasmModule(data).instantiate(WasmImports());
+  var inst = WasmModule(data).instantiate().build();
   var setFn = inst.lookupFunction("set");
   var getFn = inst.lookupFunction("get");
   Expect.isNull(setFn(123, 456));
diff --git a/tests/lib_2/wasm/wasi_error_test.dart b/tests/lib_2/wasm/wasi_error_test.dart
new file mode 100644
index 0000000..8418dad
--- /dev/null
+++ b/tests/lib_2/wasm/wasi_error_test.dart
@@ -0,0 +1,204 @@
+// 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.
+
+// Test the errors that can be thrown by WASI.
+
+import "package:expect/expect.dart";
+import "package:wasm/wasm.dart";
+import "dart:typed_data";
+
+void main() {
+  // Empty wasm module.
+  var emptyModuleData = Uint8List.fromList(
+      [0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x06, 0x81, 0x00, 0x00]);
+
+  // Failed to fill WASI imports (the empty module was not built with WASI).
+  Expect.throws(() => WasmModule(emptyModuleData).instantiate().enableWasi(),
+      (Exception e) => "$e".contains("Failed to fill WASI imports"));
+
+  // Hello world module generated by emscripten+WASI. Exports a function like
+  // `void _start()`, and prints using `int fd_write(int, int, int, int)`.
+  var helloWorldData = Uint8List.fromList([
+    0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x33, 0x09, 0x60,
+    0x03, 0x7f, 0x7f, 0x7f, 0x01, 0x7f, 0x60, 0x04, 0x7f, 0x7f, 0x7f, 0x7f,
+    0x01, 0x7f, 0x60, 0x00, 0x00, 0x60, 0x02, 0x7f, 0x7f, 0x01, 0x7f, 0x60,
+    0x01, 0x7f, 0x01, 0x7f, 0x60, 0x03, 0x7f, 0x7e, 0x7f, 0x01, 0x7e, 0x60,
+    0x00, 0x01, 0x7f, 0x60, 0x01, 0x7f, 0x00, 0x60, 0x03, 0x7f, 0x7f, 0x7f,
+    0x00, 0x02, 0x1a, 0x01, 0x0d, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x75, 0x6e,
+    0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x08, 0x66, 0x64, 0x5f, 0x77, 0x72,
+    0x69, 0x74, 0x65, 0x00, 0x01, 0x03, 0x0f, 0x0e, 0x03, 0x04, 0x00, 0x03,
+    0x02, 0x07, 0x05, 0x04, 0x03, 0x06, 0x02, 0x02, 0x08, 0x00, 0x04, 0x05,
+    0x01, 0x70, 0x01, 0x04, 0x04, 0x05, 0x06, 0x01, 0x01, 0x80, 0x02, 0x80,
+    0x02, 0x06, 0x09, 0x01, 0x7f, 0x01, 0x41, 0xc0, 0x95, 0xc0, 0x02, 0x0b,
+    0x07, 0x2e, 0x04, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x02, 0x00,
+    0x11, 0x5f, 0x5f, 0x77, 0x61, 0x73, 0x6d, 0x5f, 0x63, 0x61, 0x6c, 0x6c,
+    0x5f, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x00, 0x05, 0x04, 0x6d, 0x61, 0x69,
+    0x6e, 0x00, 0x04, 0x06, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x00, 0x0b,
+    0x09, 0x09, 0x01, 0x00, 0x41, 0x01, 0x0b, 0x03, 0x08, 0x0e, 0x07, 0x0a,
+    0xae, 0x0c, 0x0e, 0xbf, 0x01, 0x01, 0x05, 0x7f, 0x41, 0x80, 0x08, 0x21,
+    0x04, 0x02, 0x40, 0x20, 0x01, 0x28, 0x02, 0x10, 0x22, 0x02, 0x04, 0x7f,
+    0x20, 0x02, 0x05, 0x20, 0x01, 0x10, 0x02, 0x0d, 0x01, 0x20, 0x01, 0x28,
+    0x02, 0x10, 0x0b, 0x20, 0x01, 0x28, 0x02, 0x14, 0x22, 0x05, 0x6b, 0x20,
+    0x00, 0x49, 0x04, 0x40, 0x20, 0x01, 0x41, 0x80, 0x08, 0x20, 0x00, 0x20,
+    0x01, 0x28, 0x02, 0x24, 0x11, 0x00, 0x00, 0x0f, 0x0b, 0x02, 0x40, 0x20,
+    0x01, 0x2c, 0x00, 0x4b, 0x41, 0x00, 0x48, 0x0d, 0x00, 0x20, 0x00, 0x21,
+    0x03, 0x03, 0x40, 0x20, 0x03, 0x22, 0x02, 0x45, 0x0d, 0x01, 0x20, 0x02,
+    0x41, 0x7f, 0x6a, 0x22, 0x03, 0x41, 0x80, 0x08, 0x6a, 0x2d, 0x00, 0x00,
+    0x41, 0x0a, 0x47, 0x0d, 0x00, 0x0b, 0x20, 0x01, 0x41, 0x80, 0x08, 0x20,
+    0x02, 0x20, 0x01, 0x28, 0x02, 0x24, 0x11, 0x00, 0x00, 0x22, 0x03, 0x20,
+    0x02, 0x49, 0x0d, 0x01, 0x20, 0x00, 0x20, 0x02, 0x6b, 0x21, 0x00, 0x20,
+    0x02, 0x41, 0x80, 0x08, 0x6a, 0x21, 0x04, 0x20, 0x01, 0x28, 0x02, 0x14,
+    0x21, 0x05, 0x20, 0x02, 0x21, 0x06, 0x0b, 0x20, 0x05, 0x20, 0x04, 0x20,
+    0x00, 0x10, 0x03, 0x1a, 0x20, 0x01, 0x20, 0x01, 0x28, 0x02, 0x14, 0x20,
+    0x00, 0x6a, 0x36, 0x02, 0x14, 0x20, 0x00, 0x20, 0x06, 0x6a, 0x21, 0x03,
+    0x0b, 0x20, 0x03, 0x0b, 0x59, 0x01, 0x01, 0x7f, 0x20, 0x00, 0x20, 0x00,
+    0x2d, 0x00, 0x4a, 0x22, 0x01, 0x41, 0x7f, 0x6a, 0x20, 0x01, 0x72, 0x3a,
+    0x00, 0x4a, 0x20, 0x00, 0x28, 0x02, 0x00, 0x22, 0x01, 0x41, 0x08, 0x71,
+    0x04, 0x40, 0x20, 0x00, 0x20, 0x01, 0x41, 0x20, 0x72, 0x36, 0x02, 0x00,
+    0x41, 0x7f, 0x0f, 0x0b, 0x20, 0x00, 0x42, 0x00, 0x37, 0x02, 0x04, 0x20,
+    0x00, 0x20, 0x00, 0x28, 0x02, 0x2c, 0x22, 0x01, 0x36, 0x02, 0x1c, 0x20,
+    0x00, 0x20, 0x01, 0x36, 0x02, 0x14, 0x20, 0x00, 0x20, 0x01, 0x20, 0x00,
+    0x28, 0x02, 0x30, 0x6a, 0x36, 0x02, 0x10, 0x41, 0x00, 0x0b, 0x82, 0x04,
+    0x01, 0x03, 0x7f, 0x20, 0x02, 0x41, 0x80, 0xc0, 0x00, 0x4f, 0x04, 0x40,
+    0x20, 0x00, 0x20, 0x01, 0x20, 0x02, 0x10, 0x0d, 0x20, 0x00, 0x0f, 0x0b,
+    0x20, 0x00, 0x20, 0x02, 0x6a, 0x21, 0x03, 0x02, 0x40, 0x20, 0x00, 0x20,
+    0x01, 0x73, 0x41, 0x03, 0x71, 0x45, 0x04, 0x40, 0x02, 0x40, 0x20, 0x02,
+    0x41, 0x01, 0x48, 0x04, 0x40, 0x20, 0x00, 0x21, 0x02, 0x0c, 0x01, 0x0b,
+    0x20, 0x00, 0x41, 0x03, 0x71, 0x45, 0x04, 0x40, 0x20, 0x00, 0x21, 0x02,
+    0x0c, 0x01, 0x0b, 0x20, 0x00, 0x21, 0x02, 0x03, 0x40, 0x20, 0x02, 0x20,
+    0x01, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x01, 0x41, 0x01, 0x6a,
+    0x21, 0x01, 0x20, 0x02, 0x41, 0x01, 0x6a, 0x22, 0x02, 0x20, 0x03, 0x4f,
+    0x0d, 0x01, 0x20, 0x02, 0x41, 0x03, 0x71, 0x0d, 0x00, 0x0b, 0x0b, 0x02,
+    0x40, 0x20, 0x03, 0x41, 0x7c, 0x71, 0x22, 0x04, 0x41, 0xc0, 0x00, 0x49,
+    0x0d, 0x00, 0x20, 0x02, 0x20, 0x04, 0x41, 0x40, 0x6a, 0x22, 0x05, 0x4b,
+    0x0d, 0x00, 0x03, 0x40, 0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x00, 0x36,
+    0x02, 0x00, 0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x04, 0x36, 0x02, 0x04,
+    0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x08, 0x36, 0x02, 0x08, 0x20, 0x02,
+    0x20, 0x01, 0x28, 0x02, 0x0c, 0x36, 0x02, 0x0c, 0x20, 0x02, 0x20, 0x01,
+    0x28, 0x02, 0x10, 0x36, 0x02, 0x10, 0x20, 0x02, 0x20, 0x01, 0x28, 0x02,
+    0x14, 0x36, 0x02, 0x14, 0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x18, 0x36,
+    0x02, 0x18, 0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x1c, 0x36, 0x02, 0x1c,
+    0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x20, 0x36, 0x02, 0x20, 0x20, 0x02,
+    0x20, 0x01, 0x28, 0x02, 0x24, 0x36, 0x02, 0x24, 0x20, 0x02, 0x20, 0x01,
+    0x28, 0x02, 0x28, 0x36, 0x02, 0x28, 0x20, 0x02, 0x20, 0x01, 0x28, 0x02,
+    0x2c, 0x36, 0x02, 0x2c, 0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x30, 0x36,
+    0x02, 0x30, 0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x34, 0x36, 0x02, 0x34,
+    0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x38, 0x36, 0x02, 0x38, 0x20, 0x02,
+    0x20, 0x01, 0x28, 0x02, 0x3c, 0x36, 0x02, 0x3c, 0x20, 0x01, 0x41, 0x40,
+    0x6b, 0x21, 0x01, 0x20, 0x02, 0x41, 0x40, 0x6b, 0x22, 0x02, 0x20, 0x05,
+    0x4d, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x02, 0x20, 0x04, 0x4f, 0x0d, 0x01,
+    0x03, 0x40, 0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x00, 0x36, 0x02, 0x00,
+    0x20, 0x01, 0x41, 0x04, 0x6a, 0x21, 0x01, 0x20, 0x02, 0x41, 0x04, 0x6a,
+    0x22, 0x02, 0x20, 0x04, 0x49, 0x0d, 0x00, 0x0b, 0x0c, 0x01, 0x0b, 0x20,
+    0x03, 0x41, 0x04, 0x49, 0x04, 0x40, 0x20, 0x00, 0x21, 0x02, 0x0c, 0x01,
+    0x0b, 0x20, 0x03, 0x41, 0x7c, 0x6a, 0x22, 0x04, 0x20, 0x00, 0x49, 0x04,
+    0x40, 0x20, 0x00, 0x21, 0x02, 0x0c, 0x01, 0x0b, 0x20, 0x00, 0x21, 0x02,
+    0x03, 0x40, 0x20, 0x02, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00,
+    0x20, 0x02, 0x20, 0x01, 0x2d, 0x00, 0x01, 0x3a, 0x00, 0x01, 0x20, 0x02,
+    0x20, 0x01, 0x2d, 0x00, 0x02, 0x3a, 0x00, 0x02, 0x20, 0x02, 0x20, 0x01,
+    0x2d, 0x00, 0x03, 0x3a, 0x00, 0x03, 0x20, 0x01, 0x41, 0x04, 0x6a, 0x21,
+    0x01, 0x20, 0x02, 0x41, 0x04, 0x6a, 0x22, 0x02, 0x20, 0x04, 0x4d, 0x0d,
+    0x00, 0x0b, 0x0b, 0x20, 0x02, 0x20, 0x03, 0x49, 0x04, 0x40, 0x03, 0x40,
+    0x20, 0x02, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x01,
+    0x41, 0x01, 0x6a, 0x21, 0x01, 0x20, 0x02, 0x41, 0x01, 0x6a, 0x22, 0x02,
+    0x20, 0x03, 0x47, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x0b, 0x06, 0x00,
+    0x10, 0x0c, 0x41, 0x00, 0x0b, 0x03, 0x00, 0x01, 0x0b, 0x7e, 0x01, 0x03,
+    0x7f, 0x23, 0x00, 0x41, 0x10, 0x6b, 0x22, 0x01, 0x24, 0x00, 0x20, 0x01,
+    0x41, 0x0a, 0x3a, 0x00, 0x0f, 0x02, 0x40, 0x20, 0x00, 0x28, 0x02, 0x10,
+    0x22, 0x02, 0x45, 0x04, 0x40, 0x20, 0x00, 0x10, 0x02, 0x0d, 0x01, 0x20,
+    0x00, 0x28, 0x02, 0x10, 0x21, 0x02, 0x0b, 0x02, 0x40, 0x20, 0x00, 0x28,
+    0x02, 0x14, 0x22, 0x03, 0x20, 0x02, 0x4f, 0x0d, 0x00, 0x20, 0x00, 0x2c,
+    0x00, 0x4b, 0x41, 0x0a, 0x46, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x03, 0x41,
+    0x01, 0x6a, 0x36, 0x02, 0x14, 0x20, 0x03, 0x41, 0x0a, 0x3a, 0x00, 0x00,
+    0x0c, 0x01, 0x0b, 0x20, 0x00, 0x20, 0x01, 0x41, 0x0f, 0x6a, 0x41, 0x01,
+    0x20, 0x00, 0x28, 0x02, 0x24, 0x11, 0x00, 0x00, 0x41, 0x01, 0x47, 0x0d,
+    0x00, 0x20, 0x01, 0x2d, 0x00, 0x0f, 0x1a, 0x0b, 0x20, 0x01, 0x41, 0x10,
+    0x6a, 0x24, 0x00, 0x0b, 0x04, 0x00, 0x42, 0x00, 0x0b, 0x04, 0x00, 0x41,
+    0x00, 0x0b, 0x31, 0x01, 0x01, 0x7f, 0x20, 0x00, 0x21, 0x02, 0x20, 0x02,
+    0x02, 0x7f, 0x20, 0x01, 0x28, 0x02, 0x4c, 0x41, 0x7f, 0x4c, 0x04, 0x40,
+    0x20, 0x02, 0x20, 0x01, 0x10, 0x01, 0x0c, 0x01, 0x0b, 0x20, 0x02, 0x20,
+    0x01, 0x10, 0x01, 0x0b, 0x22, 0x01, 0x46, 0x04, 0x40, 0x20, 0x00, 0x0f,
+    0x0b, 0x20, 0x01, 0x0b, 0x62, 0x01, 0x03, 0x7f, 0x41, 0x80, 0x08, 0x21,
+    0x00, 0x03, 0x40, 0x20, 0x00, 0x22, 0x01, 0x41, 0x04, 0x6a, 0x21, 0x00,
+    0x20, 0x01, 0x28, 0x02, 0x00, 0x22, 0x02, 0x41, 0x7f, 0x73, 0x20, 0x02,
+    0x41, 0xff, 0xfd, 0xfb, 0x77, 0x6a, 0x71, 0x41, 0x80, 0x81, 0x82, 0x84,
+    0x78, 0x71, 0x45, 0x0d, 0x00, 0x0b, 0x02, 0x40, 0x20, 0x02, 0x41, 0xff,
+    0x01, 0x71, 0x45, 0x04, 0x40, 0x20, 0x01, 0x21, 0x00, 0x0c, 0x01, 0x0b,
+    0x03, 0x40, 0x20, 0x01, 0x2d, 0x00, 0x01, 0x21, 0x02, 0x20, 0x01, 0x41,
+    0x01, 0x6a, 0x22, 0x00, 0x21, 0x01, 0x20, 0x02, 0x0d, 0x00, 0x0b, 0x0b,
+    0x20, 0x00, 0x41, 0x80, 0x08, 0x6b, 0x0b, 0x0c, 0x00, 0x02, 0x7f, 0x41,
+    0x00, 0x41, 0x00, 0x10, 0x04, 0x0b, 0x1a, 0x0b, 0x66, 0x01, 0x02, 0x7f,
+    0x41, 0x90, 0x08, 0x28, 0x02, 0x00, 0x22, 0x00, 0x28, 0x02, 0x4c, 0x41,
+    0x00, 0x4e, 0x04, 0x7f, 0x41, 0x01, 0x05, 0x20, 0x01, 0x0b, 0x1a, 0x02,
+    0x40, 0x41, 0x7f, 0x41, 0x00, 0x10, 0x0a, 0x22, 0x01, 0x20, 0x01, 0x20,
+    0x00, 0x10, 0x09, 0x47, 0x1b, 0x41, 0x00, 0x48, 0x0d, 0x00, 0x02, 0x40,
+    0x20, 0x00, 0x2d, 0x00, 0x4b, 0x41, 0x0a, 0x46, 0x0d, 0x00, 0x20, 0x00,
+    0x28, 0x02, 0x14, 0x22, 0x01, 0x20, 0x00, 0x28, 0x02, 0x10, 0x4f, 0x0d,
+    0x00, 0x20, 0x00, 0x20, 0x01, 0x41, 0x01, 0x6a, 0x36, 0x02, 0x14, 0x20,
+    0x01, 0x41, 0x0a, 0x3a, 0x00, 0x00, 0x0c, 0x01, 0x0b, 0x20, 0x00, 0x10,
+    0x06, 0x0b, 0x0b, 0x3d, 0x01, 0x01, 0x7f, 0x20, 0x02, 0x04, 0x40, 0x03,
+    0x40, 0x20, 0x00, 0x20, 0x01, 0x20, 0x02, 0x41, 0x80, 0xc0, 0x00, 0x20,
+    0x02, 0x41, 0x80, 0xc0, 0x00, 0x49, 0x1b, 0x22, 0x03, 0x10, 0x03, 0x21,
+    0x00, 0x20, 0x01, 0x41, 0x80, 0x40, 0x6b, 0x21, 0x01, 0x20, 0x00, 0x41,
+    0x80, 0x40, 0x6b, 0x21, 0x00, 0x20, 0x02, 0x20, 0x03, 0x6b, 0x22, 0x02,
+    0x0d, 0x00, 0x0b, 0x0b, 0x0b, 0xb1, 0x02, 0x01, 0x06, 0x7f, 0x23, 0x00,
+    0x41, 0x20, 0x6b, 0x22, 0x03, 0x24, 0x00, 0x20, 0x03, 0x20, 0x00, 0x28,
+    0x02, 0x1c, 0x22, 0x04, 0x36, 0x02, 0x10, 0x20, 0x00, 0x28, 0x02, 0x14,
+    0x21, 0x05, 0x20, 0x03, 0x20, 0x02, 0x36, 0x02, 0x1c, 0x20, 0x03, 0x20,
+    0x01, 0x36, 0x02, 0x18, 0x20, 0x03, 0x20, 0x05, 0x20, 0x04, 0x6b, 0x22,
+    0x01, 0x36, 0x02, 0x14, 0x20, 0x01, 0x20, 0x02, 0x6a, 0x21, 0x06, 0x41,
+    0x02, 0x21, 0x05, 0x20, 0x03, 0x41, 0x10, 0x6a, 0x21, 0x01, 0x03, 0x40,
+    0x02, 0x40, 0x02, 0x7f, 0x20, 0x06, 0x02, 0x7f, 0x20, 0x00, 0x28, 0x02,
+    0x3c, 0x20, 0x01, 0x20, 0x05, 0x20, 0x03, 0x41, 0x0c, 0x6a, 0x10, 0x00,
+    0x04, 0x40, 0x20, 0x03, 0x41, 0x7f, 0x36, 0x02, 0x0c, 0x41, 0x7f, 0x0c,
+    0x01, 0x0b, 0x20, 0x03, 0x28, 0x02, 0x0c, 0x0b, 0x22, 0x04, 0x46, 0x04,
+    0x40, 0x20, 0x00, 0x20, 0x00, 0x28, 0x02, 0x2c, 0x22, 0x01, 0x36, 0x02,
+    0x1c, 0x20, 0x00, 0x20, 0x01, 0x36, 0x02, 0x14, 0x20, 0x00, 0x20, 0x01,
+    0x20, 0x00, 0x28, 0x02, 0x30, 0x6a, 0x36, 0x02, 0x10, 0x20, 0x02, 0x0c,
+    0x01, 0x0b, 0x20, 0x04, 0x41, 0x7f, 0x4a, 0x0d, 0x01, 0x20, 0x00, 0x41,
+    0x00, 0x36, 0x02, 0x1c, 0x20, 0x00, 0x42, 0x00, 0x37, 0x03, 0x10, 0x20,
+    0x00, 0x20, 0x00, 0x28, 0x02, 0x00, 0x41, 0x20, 0x72, 0x36, 0x02, 0x00,
+    0x41, 0x00, 0x20, 0x05, 0x41, 0x02, 0x46, 0x0d, 0x00, 0x1a, 0x20, 0x02,
+    0x20, 0x01, 0x28, 0x02, 0x04, 0x6b, 0x0b, 0x21, 0x04, 0x20, 0x03, 0x41,
+    0x20, 0x6a, 0x24, 0x00, 0x20, 0x04, 0x0f, 0x0b, 0x20, 0x01, 0x41, 0x08,
+    0x6a, 0x20, 0x01, 0x20, 0x04, 0x20, 0x01, 0x28, 0x02, 0x04, 0x22, 0x07,
+    0x4b, 0x22, 0x08, 0x1b, 0x22, 0x01, 0x20, 0x04, 0x20, 0x07, 0x41, 0x00,
+    0x20, 0x08, 0x1b, 0x6b, 0x22, 0x07, 0x20, 0x01, 0x28, 0x02, 0x00, 0x6a,
+    0x36, 0x02, 0x00, 0x20, 0x01, 0x20, 0x01, 0x28, 0x02, 0x04, 0x20, 0x07,
+    0x6b, 0x36, 0x02, 0x04, 0x20, 0x06, 0x20, 0x04, 0x6b, 0x21, 0x06, 0x20,
+    0x05, 0x20, 0x08, 0x6b, 0x21, 0x05, 0x0c, 0x00, 0x00, 0x0b, 0x00, 0x0b,
+    0x0b, 0x4d, 0x06, 0x00, 0x41, 0x80, 0x08, 0x0b, 0x12, 0x68, 0x65, 0x6c,
+    0x6c, 0x6f, 0x2c, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x21, 0x00, 0x00,
+    0x00, 0x18, 0x04, 0x00, 0x41, 0x98, 0x08, 0x0b, 0x01, 0x05, 0x00, 0x41,
+    0xa4, 0x08, 0x0b, 0x01, 0x01, 0x00, 0x41, 0xbc, 0x08, 0x0b, 0x0e, 0x02,
+    0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xb8, 0x04, 0x00, 0x00, 0x00,
+    0x04, 0x00, 0x41, 0xd4, 0x08, 0x0b, 0x01, 0x01, 0x00, 0x41, 0xe3, 0x08,
+    0x0b, 0x05, 0x0a, 0xff, 0xff, 0xff, 0xff,
+  ]);
+
+  // Trying to import WASI twice.
+  Expect.throws(
+      () => WasmModule(helloWorldData).instantiate().enableWasi().enableWasi(),
+      (Exception e) => "$e".contains("WASI is already enabled"));
+
+  // Missing imports due to not enabling WASI.
+  Expect.throws(() => WasmModule(helloWorldData).instantiate().build(),
+      (Exception e) => "$e".contains("Missing import"));
+
+  // Trying to get stdout/stderr without WASI enabled (WASI function import has
+  // been manually filled).
+  var inst = WasmModule(helloWorldData)
+      .instantiate()
+      .addFunction("wasi_unstable", "fd_write",
+          (int fd, int iovs, int iovs_len, int unused) => 0)
+      .build();
+  Expect.throws(
+      () => inst.stdout,
+      (Exception e) =>
+          "$e".contains("Can't capture stdout without WASI enabled"));
+  Expect.throws(
+      () => inst.stderr,
+      (Exception e) =>
+          "$e".contains("Can't capture stderr without WASI enabled"));
+}
diff --git a/tests/standalone/io/https_nonblocking_trust_evaluation_test.dart b/tests/standalone/io/https_nonblocking_trust_evaluation_test.dart
new file mode 100644
index 0000000..402b260
--- /dev/null
+++ b/tests/standalone/io/https_nonblocking_trust_evaluation_test.dart
@@ -0,0 +1,54 @@
+// Copyright (c) 2020, 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.
+
+// VMOptions=--long-ssl-cert-evaluation
+
+// This test verifies that dart isolate is not getting blocked during
+// certificate evaluation.
+
+import 'dart:async';
+import 'dart:io';
+
+import "package:expect/expect.dart";
+import "package:async_helper/async_helper.dart";
+
+void log(String s) {
+  print(s);
+}
+
+Timer stallDetector() {
+  final sw = Stopwatch()..start();
+  return Timer.periodic(Duration(milliseconds: 5), (_) {
+    int elapsedMs = sw.elapsedMilliseconds;
+    // Would the evaluation be synchronous, the dart isolate is going to
+    // be blocked for over a second.
+    Expect.isTrue(elapsedMs < 1000);
+    if (sw.elapsedMilliseconds > 10) {
+      log('EVENT LOOP WAS STALLED FOR ${sw.elapsedMilliseconds} ms');
+    }
+    sw.reset();
+  });
+}
+
+void main() async {
+  asyncStart();
+  final url = 'https://google.com';
+  final timer = stallDetector();
+  var sw = Stopwatch()..start();
+  var httpClient = HttpClient();
+  try {
+    var request = await httpClient.getUrl(Uri.parse(url));
+    var response = await request.close();
+    int elapsedMs = sw.elapsedMilliseconds;
+    log('REQUEST COMPLETE IN $elapsedMs ms');
+    // Request have to take at least a second due to
+    // vm "--long-ssl-cert-evaluation" option.
+    Expect.isTrue(elapsedMs > 1000);
+
+    asyncEnd();
+  } finally {
+    httpClient.close(force: true);
+    timer.cancel();
+  }
+}
diff --git a/tests/standalone/io/windows_environment_script.dart b/tests/standalone/io/windows_environment_script.dart
index 509ed5b..9712990 100644
--- a/tests/standalone/io/windows_environment_script.dart
+++ b/tests/standalone/io/windows_environment_script.dart
@@ -7,7 +7,7 @@
 main() {
   var scriptDir = Platform.environment['SCRIPTDIR']!;
   if (!scriptDir.contains('å')) throw "scriptDir not containing character å";
-  scriptDir = Platform.environment['ScriptDir'];
+  scriptDir = Platform.environment['ScriptDir']!;
   if (!scriptDir.contains('å')) throw "scriptDir not containing character å";
   var str = new File('$scriptDir/funky.bat').readAsStringSync();
   if (!str.contains('%~dp0')) throw "str not containing dp0";
diff --git a/tests/standalone/io/windows_environment_test.dart b/tests/standalone/io/windows_environment_test.dart
index d2698c2..f5fbe55 100644
--- a/tests/standalone/io/windows_environment_test.dart
+++ b/tests/standalone/io/windows_environment_test.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// OtherResources=windows_environment_script.dart
+
 import 'package:path/path.dart';
 import 'package:expect/expect.dart';
 import "dart:io";
@@ -12,15 +14,19 @@
   var funkyDir = new Directory(join(tempDir.path, 'å'));
   funkyDir.createSync();
   var funkyFile = new File(join(funkyDir.path, 'funky.bat'));
+  final vmOptions = Platform.executableArguments.join(' ');
   funkyFile.writeAsStringSync("""
 @echo off
 set SCRIPTDIR=%~dp0
-%1 %2
+echo %1 $vmOptions %2
+%1 $vmOptions %2
       """);
   var dart = Platform.executable;
   var script =
       Platform.script.resolve('windows_environment_script.dart').toFilePath();
   Process.run('cmd', ['/c', funkyFile.path, dart, script]).then((p) {
+    print('stdout: ${p.stdout}');
+    print('stderr: ${p.stderr}');
     if (0 != p.exitCode) throw "Exit code not 0";
     tempDir.deleteSync(recursive: true);
   });
diff --git a/tests/standalone/out_of_memory_recovery_synchronous_test.dart b/tests/standalone/out_of_memory_recovery_synchronous_test.dart
new file mode 100644
index 0000000..2157fa7
--- /dev/null
+++ b/tests/standalone/out_of_memory_recovery_synchronous_test.dart
@@ -0,0 +1,49 @@
+// Copyright (c) 2020, 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.
+
+// VMOptions=--old_gen_heap_size=20
+
+import "package:expect/expect.dart";
+
+main() {
+  var leak;
+  var exceptionThrown = false;
+  try {
+    leak = [];
+    while (true) {
+      leak = [leak];
+    }
+  } on OutOfMemoryError catch (exception) {
+    leak = null;
+    exceptionThrown = true;
+    print("Okay");
+  }
+  Expect.isTrue(exceptionThrown);
+
+  exceptionThrown = false;
+  try {
+    leak = [];
+    while (true) {
+      leak = [leak];
+    }
+  } on OutOfMemoryError catch (exception) {
+    leak = null;
+    exceptionThrown = true;
+    print("Okay");
+  }
+  Expect.isTrue(exceptionThrown);
+
+  exceptionThrown = false;
+  try {
+    leak = [];
+    while (true) {
+      leak = [leak];
+    }
+  } on OutOfMemoryError catch (exception) {
+    leak = null;
+    exceptionThrown = true;
+    print("Okay");
+  }
+  Expect.isTrue(exceptionThrown);
+}
diff --git a/tests/standalone/out_of_memory_recovery_test.dart b/tests/standalone/out_of_memory_recovery_test.dart
new file mode 100644
index 0000000..05aa4db
--- /dev/null
+++ b/tests/standalone/out_of_memory_recovery_test.dart
@@ -0,0 +1,55 @@
+// Copyright (c) 2020, 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.
+
+// VMOptions=--old_gen_heap_size=20
+
+import "dart:io";
+import "dart:isolate";
+
+import "package:expect/expect.dart";
+
+handleRequest(request) {
+  if (request % 2 == 0) {
+    var leak = [];
+    while (true) {
+      leak = [leak];
+    }
+  }
+  return "Okay";
+}
+
+handleMessage(message) {
+  print(">> $message");
+  var responsePort = message[0];
+  var request = message[1];
+  try {
+    responsePort.send(<dynamic>[request, handleRequest(request)]);
+  } catch (e, st) {
+    responsePort.send(<dynamic>[request, "Failed: $e\n$st"]);
+  }
+}
+
+main(args) async {
+  var child = new RawReceivePort(handleMessage);
+
+  var parent;
+  parent = new RawReceivePort((message) {
+    print("<< $message");
+    var request = message[0];
+    var response = message[1];
+    if (request % 2 == 0) {
+      Expect.isTrue(response.contains("Out of Memory"));
+    } else {
+      Expect.equals("Okay", response);
+    }
+    if (request == 5) {
+      child.close();
+      parent.close();
+    } else {
+      child.sendPort.send(<dynamic>[parent.sendPort, request + 1]);
+    }
+  });
+
+  child.sendPort.send(<dynamic>[parent.sendPort, 1]);
+}
diff --git a/tests/standalone/package/scenarios/both_dir_and_file/.dart_tool/package_config.json b/tests/standalone/package/scenarios/both_dir_and_file/.dart_tool/package_config.json
index 23e4838..5faca26 100644
--- a/tests/standalone/package/scenarios/both_dir_and_file/.dart_tool/package_config.json
+++ b/tests/standalone/package/scenarios/both_dir_and_file/.dart_tool/package_config.json
@@ -9,7 +9,7 @@
     {
       "name": "foo",
       "rootUri": "../foo",
-      "languageVersion": "2.10"
+      "languageVersion": "2.12"
     }
   ]
 }
diff --git a/tests/standalone/package/scenarios/packages_file_in_parent/.dart_tool/package_config.json b/tests/standalone/package/scenarios/packages_file_in_parent/.dart_tool/package_config.json
index 23e4838..5faca26 100644
--- a/tests/standalone/package/scenarios/packages_file_in_parent/.dart_tool/package_config.json
+++ b/tests/standalone/package/scenarios/packages_file_in_parent/.dart_tool/package_config.json
@@ -9,7 +9,7 @@
     {
       "name": "foo",
       "rootUri": "../foo",
-      "languageVersion": "2.10"
+      "languageVersion": "2.12"
     }
   ]
 }
diff --git a/tests/standalone/package/scenarios/packages_file_only/.dart_tool/package_config.json b/tests/standalone/package/scenarios/packages_file_only/.dart_tool/package_config.json
index 23e4838..5faca26 100644
--- a/tests/standalone/package/scenarios/packages_file_only/.dart_tool/package_config.json
+++ b/tests/standalone/package/scenarios/packages_file_only/.dart_tool/package_config.json
@@ -9,7 +9,7 @@
     {
       "name": "foo",
       "rootUri": "../foo",
-      "languageVersion": "2.10"
+      "languageVersion": "2.12"
     }
   ]
 }
diff --git a/tests/standalone/package/scenarios/packages_option_only/sub/.dart_tool/package_config.json b/tests/standalone/package/scenarios/packages_option_only/sub/.dart_tool/package_config.json
index 23e4838..5faca26 100644
--- a/tests/standalone/package/scenarios/packages_option_only/sub/.dart_tool/package_config.json
+++ b/tests/standalone/package/scenarios/packages_option_only/sub/.dart_tool/package_config.json
@@ -9,7 +9,7 @@
     {
       "name": "foo",
       "rootUri": "../foo",
-      "languageVersion": "2.10"
+      "languageVersion": "2.12"
     }
   ]
 }
diff --git a/tests/standalone/standalone.status b/tests/standalone/standalone.status
index 73137e9..66ee0cf 100644
--- a/tests/standalone/standalone.status
+++ b/tests/standalone/standalone.status
@@ -61,6 +61,9 @@
 io/wait_for_test: SkipByDesign # Uses mirrors.
 verbose_gc_to_bmu_test: Skip # Attempts to spawn dart using Platform.executable
 
+[ $system != macos ]
+io/https_nonblocking_trust_evaluation_test: SkipByDesign
+
 [ $builder_tag == swarming && $system == macos ]
 io/*: Skip # Issue 30618
 
diff --git a/tests/standalone/standalone_kernel.status b/tests/standalone/standalone_kernel.status
index bc9439c..63813b2 100644
--- a/tests/standalone/standalone_kernel.status
+++ b/tests/standalone/standalone_kernel.status
@@ -6,7 +6,6 @@
 
 fragmentation_typed_data_test: Pass, Slow # GC heavy
 io/process_sync_test: Pass, Slow # Spawns synchronously subprocesses in sequence.
-out_of_memory_unhandled_exception_test: Pass, Slow
 
 [ $system == android ]
 entrypoints_verification_test: Skip # Requires shared objects which the test script doesn't "adb push".
@@ -108,5 +107,5 @@
 map_insert_remove_oom_test: Skip # Heap limit too low.
 no_support_debugger_test: Skip # kernel-service snapshot not compatible with flag disabled
 
-[ $compiler != dartk && $compiler != dartkp || $compiler == dartkp && $system == windows ]
-entrypoints_verification_test: SkipByDesign # Requires VM to run. Cannot run in precompiled Windows because the DLL is linked against dart.exe instead of dart_precompiled_runtime.exe.
+[ $builder_tag == crossword || $compiler != dartk && $compiler != dartkp || $compiler == dartkp && $system == windows ]
+entrypoints_verification_test: SkipByDesign # Requires VM to run. Cannot run in precompiled Windows because the DLL is linked against dart.exe instead of dart_precompiled_runtime.exe. Cannot run in cross-word environment as native extension is not built.
diff --git a/tests/standalone_2/http_launch_data/http_launch_main.dart b/tests/standalone_2/http_launch_data/http_launch_main.dart
index f9a5b52..b5b40f7 100644
--- a/tests/standalone_2/http_launch_data/http_launch_main.dart
+++ b/tests/standalone_2/http_launch_data/http_launch_main.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 library http_launch_main;
 
 import 'package:simple/simple.dart';
diff --git a/tests/standalone_2/io/file_lock_script.dart b/tests/standalone_2/io/file_lock_script.dart
index 071f594..f2beba8 100644
--- a/tests/standalone_2/io/file_lock_script.dart
+++ b/tests/standalone_2/io/file_lock_script.dart
@@ -1,7 +1,13 @@
 // Copyright (c) 2015, 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.
-//
+
+// Normally the CFE recognizes files in ..._2 directories and automatically
+// opts those libraries out of NNBD.  Though this file will be copied to the
+// build directory, which will cause the CFE no longer to automatically opt it
+// out of NNBD, so we do that explicitly here.
+// @dart=2.9
+
 // Script used by the file_lock_test.dart test.
 
 import "dart:io";
diff --git a/tests/standalone_2/io/https_nonblocking_trust_evaluation_test.dart b/tests/standalone_2/io/https_nonblocking_trust_evaluation_test.dart
new file mode 100644
index 0000000..402b260
--- /dev/null
+++ b/tests/standalone_2/io/https_nonblocking_trust_evaluation_test.dart
@@ -0,0 +1,54 @@
+// Copyright (c) 2020, 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.
+
+// VMOptions=--long-ssl-cert-evaluation
+
+// This test verifies that dart isolate is not getting blocked during
+// certificate evaluation.
+
+import 'dart:async';
+import 'dart:io';
+
+import "package:expect/expect.dart";
+import "package:async_helper/async_helper.dart";
+
+void log(String s) {
+  print(s);
+}
+
+Timer stallDetector() {
+  final sw = Stopwatch()..start();
+  return Timer.periodic(Duration(milliseconds: 5), (_) {
+    int elapsedMs = sw.elapsedMilliseconds;
+    // Would the evaluation be synchronous, the dart isolate is going to
+    // be blocked for over a second.
+    Expect.isTrue(elapsedMs < 1000);
+    if (sw.elapsedMilliseconds > 10) {
+      log('EVENT LOOP WAS STALLED FOR ${sw.elapsedMilliseconds} ms');
+    }
+    sw.reset();
+  });
+}
+
+void main() async {
+  asyncStart();
+  final url = 'https://google.com';
+  final timer = stallDetector();
+  var sw = Stopwatch()..start();
+  var httpClient = HttpClient();
+  try {
+    var request = await httpClient.getUrl(Uri.parse(url));
+    var response = await request.close();
+    int elapsedMs = sw.elapsedMilliseconds;
+    log('REQUEST COMPLETE IN $elapsedMs ms');
+    // Request have to take at least a second due to
+    // vm "--long-ssl-cert-evaluation" option.
+    Expect.isTrue(elapsedMs > 1000);
+
+    asyncEnd();
+  } finally {
+    httpClient.close(force: true);
+    timer.cancel();
+  }
+}
diff --git a/tests/standalone_2/io/named_pipe_script_test.dart b/tests/standalone_2/io/named_pipe_script_test.dart
index 932b46c..fb97a1e 100644
--- a/tests/standalone_2/io/named_pipe_script_test.dart
+++ b/tests/standalone_2/io/named_pipe_script_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Testing file input stream, VM-only, standalone test.
 
+// VMOptions=--enable-experiment=no-non-nullable
+
 import "dart:convert";
 import "dart:io";
 
diff --git a/tests/standalone_2/io/process_detached_script.dart b/tests/standalone_2/io/process_detached_script.dart
index 7811726..5d4cccf 100644
--- a/tests/standalone_2/io/process_detached_script.dart
+++ b/tests/standalone_2/io/process_detached_script.dart
@@ -1,7 +1,13 @@
 // Copyright (c) 2015, 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.
-//
+
+// Normally the CFE recognizes files in ..._2 directories and automatically
+// opts those libraries out of NNBD.  Though this file will be copied to the
+// build directory, which will cause the CFE no longer to automatically opt it
+// out of NNBD, so we do that explicitly here.
+// @dart=2.9
+
 // Simple script hanging for testing a detached process.
 
 import 'dart:io';
diff --git a/tests/standalone_2/io/stdin_sync_script.dart b/tests/standalone_2/io/stdin_sync_script.dart
index 5b38fd2..86b08dc 100644
--- a/tests/standalone_2/io/stdin_sync_script.dart
+++ b/tests/standalone_2/io/stdin_sync_script.dart
@@ -2,6 +2,12 @@
 // 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.
 
+// Normally the CFE recognizes files in ..._2 directories and automatically
+// opts those libraries out of NNBD.  Though this file will be copied to the
+// build directory, which will cause the CFE no longer to automatically opt it
+// out of NNBD, so we do that explicitly here.
+// @dart=2.9
+
 import "dart:convert";
 import "dart:io";
 
diff --git a/tests/standalone_2/io/stdin_sync_test.dart b/tests/standalone_2/io/stdin_sync_test.dart
index 30f1e33..ae8e6ca 100644
--- a/tests/standalone_2/io/stdin_sync_test.dart
+++ b/tests/standalone_2/io/stdin_sync_test.dart
@@ -7,7 +7,6 @@
 import "dart:convert";
 import "dart:io";
 
-import "package:path/path.dart";
 import "package:expect/expect.dart";
 
 void testReadByte() {
diff --git a/tests/standalone_2/io/test_extension_fail_tester.dart b/tests/standalone_2/io/test_extension_fail_tester.dart
index f2e72ae..8b80788 100644
--- a/tests/standalone_2/io/test_extension_fail_tester.dart
+++ b/tests/standalone_2/io/test_extension_fail_tester.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 library test_extension_test;
 
 import "dart:async";
diff --git a/tests/standalone_2/io/test_extension_tester.dart b/tests/standalone_2/io/test_extension_tester.dart
index 7a3308c..7f87d13 100644
--- a/tests/standalone_2/io/test_extension_tester.dart
+++ b/tests/standalone_2/io/test_extension_tester.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 // VMOptions=--enable-isolate-groups
 // VMOptions=--no-enable-isolate-groups
 
diff --git a/tests/standalone_2/io/windows_environment_test.dart b/tests/standalone_2/io/windows_environment_test.dart
index d2698c2..f5fbe55 100644
--- a/tests/standalone_2/io/windows_environment_test.dart
+++ b/tests/standalone_2/io/windows_environment_test.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// OtherResources=windows_environment_script.dart
+
 import 'package:path/path.dart';
 import 'package:expect/expect.dart';
 import "dart:io";
@@ -12,15 +14,19 @@
   var funkyDir = new Directory(join(tempDir.path, 'å'));
   funkyDir.createSync();
   var funkyFile = new File(join(funkyDir.path, 'funky.bat'));
+  final vmOptions = Platform.executableArguments.join(' ');
   funkyFile.writeAsStringSync("""
 @echo off
 set SCRIPTDIR=%~dp0
-%1 %2
+echo %1 $vmOptions %2
+%1 $vmOptions %2
       """);
   var dart = Platform.executable;
   var script =
       Platform.script.resolve('windows_environment_script.dart').toFilePath();
   Process.run('cmd', ['/c', funkyFile.path, dart, script]).then((p) {
+    print('stdout: ${p.stdout}');
+    print('stderr: ${p.stderr}');
     if (0 != p.exitCode) throw "Exit code not 0";
     tempDir.deleteSync(recursive: true);
   });
diff --git a/tests/standalone_2/out_of_memory_recovery_synchronous_test.dart b/tests/standalone_2/out_of_memory_recovery_synchronous_test.dart
new file mode 100644
index 0000000..2157fa7
--- /dev/null
+++ b/tests/standalone_2/out_of_memory_recovery_synchronous_test.dart
@@ -0,0 +1,49 @@
+// Copyright (c) 2020, 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.
+
+// VMOptions=--old_gen_heap_size=20
+
+import "package:expect/expect.dart";
+
+main() {
+  var leak;
+  var exceptionThrown = false;
+  try {
+    leak = [];
+    while (true) {
+      leak = [leak];
+    }
+  } on OutOfMemoryError catch (exception) {
+    leak = null;
+    exceptionThrown = true;
+    print("Okay");
+  }
+  Expect.isTrue(exceptionThrown);
+
+  exceptionThrown = false;
+  try {
+    leak = [];
+    while (true) {
+      leak = [leak];
+    }
+  } on OutOfMemoryError catch (exception) {
+    leak = null;
+    exceptionThrown = true;
+    print("Okay");
+  }
+  Expect.isTrue(exceptionThrown);
+
+  exceptionThrown = false;
+  try {
+    leak = [];
+    while (true) {
+      leak = [leak];
+    }
+  } on OutOfMemoryError catch (exception) {
+    leak = null;
+    exceptionThrown = true;
+    print("Okay");
+  }
+  Expect.isTrue(exceptionThrown);
+}
diff --git a/tests/standalone_2/out_of_memory_recovery_test.dart b/tests/standalone_2/out_of_memory_recovery_test.dart
new file mode 100644
index 0000000..05aa4db
--- /dev/null
+++ b/tests/standalone_2/out_of_memory_recovery_test.dart
@@ -0,0 +1,55 @@
+// Copyright (c) 2020, 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.
+
+// VMOptions=--old_gen_heap_size=20
+
+import "dart:io";
+import "dart:isolate";
+
+import "package:expect/expect.dart";
+
+handleRequest(request) {
+  if (request % 2 == 0) {
+    var leak = [];
+    while (true) {
+      leak = [leak];
+    }
+  }
+  return "Okay";
+}
+
+handleMessage(message) {
+  print(">> $message");
+  var responsePort = message[0];
+  var request = message[1];
+  try {
+    responsePort.send(<dynamic>[request, handleRequest(request)]);
+  } catch (e, st) {
+    responsePort.send(<dynamic>[request, "Failed: $e\n$st"]);
+  }
+}
+
+main(args) async {
+  var child = new RawReceivePort(handleMessage);
+
+  var parent;
+  parent = new RawReceivePort((message) {
+    print("<< $message");
+    var request = message[0];
+    var response = message[1];
+    if (request % 2 == 0) {
+      Expect.isTrue(response.contains("Out of Memory"));
+    } else {
+      Expect.equals("Okay", response);
+    }
+    if (request == 5) {
+      child.close();
+      parent.close();
+    } else {
+      child.sendPort.send(<dynamic>[parent.sendPort, request + 1]);
+    }
+  });
+
+  child.sendPort.send(<dynamic>[parent.sendPort, 1]);
+}
diff --git a/tests/standalone_2/standalone_2.status b/tests/standalone_2/standalone_2.status
index 257680b..abe364c 100644
--- a/tests/standalone_2/standalone_2.status
+++ b/tests/standalone_2/standalone_2.status
@@ -70,6 +70,9 @@
 package/invalid_uri_test: Skip
 regress_29350_test: Skip
 
+[ $system != macos ]
+io/https_nonblocking_trust_evaluation_test: SkipByDesign
+
 [ $builder_tag == swarming && $system == macos ]
 io/*: Skip # Issue 30618
 
diff --git a/tests/standalone_2/standalone_2_kernel.status b/tests/standalone_2/standalone_2_kernel.status
index cf0367e..52e78e2 100644
--- a/tests/standalone_2/standalone_2_kernel.status
+++ b/tests/standalone_2/standalone_2_kernel.status
@@ -7,7 +7,6 @@
 fragmentation_test: Pass, Slow # GC heavy
 fragmentation_typed_data_test: Pass, Slow # GC heavy
 io/process_sync_test: Pass, Slow # Spawns synchronously subprocesses in sequence.
-out_of_memory_unhandled_exception_test: Pass, Slow
 
 [ $system == android ]
 entrypoints_verification_test: Skip # Requires shared objects which the test script doesn't "adb push".
@@ -109,5 +108,5 @@
 map_insert_remove_oom_test: Skip # Heap limit too low.
 no_support_debugger_test: Skip # kernel-service snapshot not compatible with flag disabled
 
-[ $compiler != dartk && $compiler != dartkp || $compiler == dartkp && $system == windows ]
-entrypoints_verification_test: SkipByDesign # Requires VM to run. Cannot run in precompiled Windows because the DLL is linked against dart.exe instead of dart_precompiled_runtime.exe.
+[ $builder_tag == crossword || $compiler != dartk && $compiler != dartkp || $compiler == dartkp && $system == windows ]
+entrypoints_verification_test: SkipByDesign # Requires VM to run. Cannot run in precompiled Windows because the DLL is linked against dart.exe instead of dart_precompiled_runtime.exe. Cannot run in cross-word environment as native extension is not built.
diff --git a/third_party/wasmer/BUILD.gn b/third_party/wasmer/BUILD.gn
index afd36a8..f3398f5 100644
--- a/third_party/wasmer/BUILD.gn
+++ b/third_party/wasmer/BUILD.gn
@@ -1,17 +1,6 @@
 import("../../build/rust/rust.gni")
 
-shared_library("wasmer_wrapper") {
-  sources = [
-    "wasmer.hh",
-    "wasmer_wrapper.cc",
-  ]
-  deps = [ ":wasmer_lib" ]
-  if (is_linux) {
-    libs = [ "rt" ]
-  }
-  ldflags = [ "-Wl,--no-as-needed" ]  # Force linking of all wasmer symbols.
-}
-
-rust_library("wasmer_lib") {
+rust_library("wasmer") {
   lib_name = "wasmer"
+  shared = true
 }
diff --git a/third_party/wasmer/Cargo.toml b/third_party/wasmer/Cargo.toml
index bfe6172..8ec064a 100644
--- a/third_party/wasmer/Cargo.toml
+++ b/third_party/wasmer/Cargo.toml
@@ -1,11 +1,13 @@
 [package]
 name = "wasmer"
-version = "0.17.1"
+version = "1.0.0-alpha4"
 
 [lib]
 name = "wasmer"
-crate-type = ["staticlib"]
+crate-type = ["dylib"]
 path = "wasmer.rs"
 
-[dependencies]
-wasmer-runtime-c-api = "0.17.1"
+[dependencies.wasmer-c-api]
+version = "1.0.0-alpha4"
+default-features = false
+features = ["jit", "cranelift", "wasi"]
diff --git a/third_party/wasmer/README.google b/third_party/wasmer/README.google
deleted file mode 100644
index aec1896..0000000
--- a/third_party/wasmer/README.google
+++ /dev/null
@@ -1,11 +0,0 @@
-Name: Wasmer Runtime C API
-Short Name: wasmer
-URL: https://github.com/wasmerio/wasmer/tree/master/lib/runtime-c-api
-Version: 0.6.0
-Date: August 16, 2019
-License: MIT
-
-Description:
-This directory contains an unmodified copy of wasmer.hh from the Wasmer Runtime
-C API (and README.md and LICENCE). Other files in this directory are added to
-build the corresponding rust library.
diff --git a/third_party/wasmer/README.md b/third_party/wasmer/README.md
deleted file mode 100644
index d1475b7..0000000
--- a/third_party/wasmer/README.md
+++ /dev/null
@@ -1,140 +0,0 @@
-<p align="center">
-  <a href="https://wasmer.io" target="_blank" rel="noopener noreferrer">
-    <img width="300" src="https://raw.githubusercontent.com/wasmerio/wasmer/master/assets/logo.png" alt="Wasmer logo">
-  </a>
-</p>
-
-<p align="center">
-  <a href="https://dev.azure.com/wasmerio/wasmer/_build/latest?definitionId=3&branchName=master">
-    <img src="https://img.shields.io/azure-devops/build/wasmerio/wasmer/3.svg?style=flat-square" alt="Build Status">
-  </a>
-  <a href="https://github.com/wasmerio/wasmer/blob/master/LICENSE">
-    <img src="https://img.shields.io/github/license/wasmerio/wasmer.svg?style=flat-square" alt="License">
-  </a>
-  <a href="https://spectrum.chat/wasmer">
-    <img src="https://withspectrum.github.io/badge/badge.svg" alt="Join the Wasmer Community">
-  </a>
-  <a href="https://crates.io/crates/wasmer-runtime-c-api">
-    <img src="https://img.shields.io/crates/d/wasmer-runtime-c-api.svg?style=flat-square" alt="Number of downloads from crates.io">
-  </a>
-  <a href="https://wasmerio.github.io/wasmer/c/runtime-c-api/">
-    <img src="https://img.shields.io/badge/Docs-Wasmer%20C%20API-blue?style=flat-square" alt="Wasmer C API Documentation">
-  </a>
-</p>
-
-# Wasmer Runtime C API
-
-Wasmer is a standalone JIT WebAssembly runtime, aiming to be fully
-compatible with WASI, Emscripten, Rust and Go. [Learn
-more](https://github.com/wasmerio/wasmer).
-
-This crate exposes a C and a C++ API for the Wasmer runtime.
-
-# Usage
-
-The C and C++ header files can be found in the source tree of this
-crate, respectively [`wasmer.h`][wasmer_h] and
-[`wasmer.hh`][wasmer_hh]. They are automatically generated, and always
-up-to-date in this repository.
-The runtime shared library (so, dll, dylib) can also be downloaded in Wasmer [release page](https://github.com/wasmerio/wasmer/releases).
-
-You can find the full C API documentation here:
-https://wasmerio.github.io/wasmer/c/runtime-c-api/
-
-Here is a simple example to use the C API:
-
-```c
-#include <stdio.h>
-#include "../wasmer.h"
-#include <assert.h>
-#include <stdint.h>
-
-int main()
-{
-    // Read the Wasm file bytes.
-    FILE *file = fopen("sum.wasm", "r");
-    fseek(file, 0, SEEK_END);
-    long len = ftell(file);
-    uint8_t *bytes = malloc(len);
-    fseek(file, 0, SEEK_SET);
-    fread(bytes, 1, len, file);
-    fclose(file);
-
-    // Prepare the imports.
-    wasmer_import_t imports[] = {};
-
-    // Instantiate!
-    wasmer_instance_t *instance = NULL;
-    wasmer_result_t instantiation_result = wasmer_instantiate(&instance, bytes, len, imports, 0);
-
-    assert(instantiation_result == WASMER_OK);
-
-    // Let's call a function.
-    // Start by preparing the arguments.
-
-    // Value of argument #1 is `7i32`.
-    wasmer_value_t argument_one;
-    argument_one.tag = WASM_I32;
-    argument_one.value.I32 = 7;
-
-    // Value of argument #2 is `8i32`.
-    wasmer_value_t argument_two;
-    argument_two.tag = WASM_I32;
-    argument_two.value.I32 = 8;
-
-    // Prepare the arguments.
-    wasmer_value_t arguments[] = {argument_one, argument_two};
-
-    // Prepare the return value.
-    wasmer_value_t result_one;
-    wasmer_value_t results[] = {result_one};
-
-    // Call the `sum` function with the prepared arguments and the return value.
-    wasmer_result_t call_result = wasmer_instance_call(instance, "sum", arguments, 2, results, 1);
-
-    // Let's display the result.
-    printf("Call result:  %d\n", call_result);
-    printf("Result: %d\n", results[0].value.I32);
-
-    // `sum(7, 8) == 15`.
-    assert(results[0].value.I32 == 15);
-    assert(call_result == WASMER_OK);
-
-    wasmer_instance_destroy(instance);
-
-    return 0;
-}
-```
-
-# Testing
-
-Tests are run using the release build of the library.  If you make
-changes or compile with non-default features, please ensure you
-rebuild in release mode for the tests to see the changes.
-
-The tests can be run via `cargo test`, such as:
-
-```sh
-$ cargo test --release -- --nocapture
-```
-
-To run tests manually, enter the `lib/runtime-c-api/tests` directory
-and run the following commands:
-
-```sh
-$ cmake .
-$ make
-$ make test
-```
-
-
-# License
-
-Wasmer is primarily distributed under the terms of the [MIT
-license][mit-license] ([LICENSE][license]).
-
-
-[wasmer_h]: ./wasmer.h
-[wasmer_hh]: ./wasmer.hh
-[mit-license]: http://opensource.org/licenses/MIT
-[license]: https://github.com/wasmerio/wasmer/blob/master/LICENSE
diff --git a/third_party/wasmer/wasmer.hh b/third_party/wasmer/wasmer.hh
deleted file mode 100644
index 647e637..0000000
--- a/third_party/wasmer/wasmer.hh
+++ /dev/null
@@ -1,1273 +0,0 @@
-
-#if !defined(WASMER_H_MACROS)
-
-#define WASMER_H_MACROS
-
-// Define the `ARCH_X86_X64` constant.
-#if defined(MSVC) && defined(_M_AMD64)
-#  define ARCH_X86_64
-#elif (defined(GCC) || defined(__GNUC__) || defined(__clang__)) && defined(__x86_64__)
-#  define ARCH_X86_64
-#endif
-
-// Compatibility with non-Clang compilers.
-#if !defined(__has_attribute)
-#  define __has_attribute(x) 0
-#endif
-
-// Compatibility with non-Clang compilers.
-#if !defined(__has_declspec_attribute)
-#  define __has_declspec_attribute(x) 0
-#endif
-
-// Define the `DEPRECATED` macro.
-#if defined(GCC) || defined(__GNUC__) || __has_attribute(deprecated)
-#  define DEPRECATED(message) __attribute__((deprecated(message)))
-#elif defined(MSVC) || __has_declspec_attribute(deprecated)
-#  define DEPRECATED(message) __declspec(deprecated(message))
-#endif
-
-#define WASMER_WASI_ENABLED
-#endif // WASMER_H_MACROS
-
-
-#ifndef WASMER_H
-#define WASMER_H
-
-#include <cstdarg>
-#include <cstdint>
-#include <cstdlib>
-#include <new>
-
-#if defined(WASMER_WASI_ENABLED)
-enum class Version : uint8_t {
-  /// Version cannot be detected or is unknown.
-  Unknown = 0,
-  /// Latest version. See `wasmer_wasi::WasiVersion::Latest` to
-  /// learn more.
-  Latest = 1,
-  /// `wasi_unstable`.
-  Snapshot0 = 2,
-  /// `wasi_snapshot_preview1`.
-  Snapshot1 = 3,
-};
-#endif
-
-/// List of export/import kinds.
-enum class wasmer_import_export_kind : uint32_t {
-  /// The export/import is a function.
-  WASM_FUNCTION = 0,
-  /// The export/import is a global.
-  WASM_GLOBAL = 1,
-  /// The export/import is a memory.
-  WASM_MEMORY = 2,
-  /// The export/import is a table.
-  WASM_TABLE = 3,
-};
-
-/// The `wasmer_result_t` enum is a type that represents either a
-/// success, or a failure.
-enum class wasmer_result_t {
-  /// Represents a success.
-  WASMER_OK = 1,
-  /// Represents a failure.
-  WASMER_ERROR = 2,
-};
-
-/// Represents all possibles WebAssembly value types.
-///
-/// See `wasmer_value_t` to get a complete example.
-enum class wasmer_value_tag : uint32_t {
-  /// Represents the `i32` WebAssembly type.
-  WASM_I32,
-  /// Represents the `i64` WebAssembly type.
-  WASM_I64,
-  /// Represents the `f32` WebAssembly type.
-  WASM_F32,
-  /// Represents the `f64` WebAssembly type.
-  WASM_F64,
-};
-
-struct wasmer_module_t {
-
-};
-
-/// Opaque pointer to a `wasmer_runtime::Instance` value in Rust.
-///
-/// A `wasmer_runtime::Instance` represents a WebAssembly instance. It
-/// is generally generated by the `wasmer_instantiate()` function, or by
-/// the `wasmer_module_instantiate()` function for the most common paths.
-struct wasmer_instance_t {
-
-};
-
-struct wasmer_byte_array {
-  const uint8_t *bytes;
-  uint32_t bytes_len;
-};
-
-#if defined(WASMER_EMSCRIPTEN_ENABLED)
-/// Type used to construct an import_object_t with Emscripten imports.
-struct wasmer_emscripten_globals_t {
-
-};
-#endif
-
-struct wasmer_import_object_t {
-
-};
-
-/// Opaque pointer to `NamedExportDescriptor`.
-struct wasmer_export_descriptor_t {
-
-};
-
-/// Opaque pointer to `NamedExportDescriptors`.
-struct wasmer_export_descriptors_t {
-
-};
-
-/// Opaque pointer to `wasmer_export_t`.
-struct wasmer_export_func_t {
-
-};
-
-/// Represents a WebAssembly value.
-///
-/// This is a [Rust union][rust-union], which is equivalent to the C
-/// union. See `wasmer_value_t` to get a complete example.
-///
-/// [rust-union]: https://doc.rust-lang.org/reference/items/unions.html
-union wasmer_value {
-  int32_t I32;
-  int64_t I64;
-  float F32;
-  double F64;
-};
-
-/// Represents a WebAssembly type and value pair,
-/// i.e. `wasmer_value_tag` and `wasmer_value`. Since the latter is an
-/// union, it's the safe way to read or write a WebAssembly value in
-/// C.
-///
-/// Example:
-///
-/// ```c
-/// // Create a WebAssembly value.
-/// wasmer_value_t wasm_value = {
-///     .tag = WASM_I32,
-///     .value.I32 = 42,
-/// };
-///
-/// // Read a WebAssembly value.
-/// if (wasm_value.tag == WASM_I32) {
-///     int32_t x = wasm_value.value.I32;
-///     // …
-/// }
-/// ```
-struct wasmer_value_t {
-  /// The value type.
-  wasmer_value_tag tag;
-  /// The value.
-  wasmer_value value;
-};
-
-/// Opaque pointer to `NamedExport`.
-struct wasmer_export_t {
-
-};
-
-/// Opaque pointer to a `wasmer_runtime::Memory` value in Rust.
-///
-/// A `wasmer_runtime::Memory` represents a WebAssembly memory. It is
-/// possible to create one with `wasmer_memory_new()` and pass it as
-/// imports of an instance, or to read it from exports of an instance
-/// with `wasmer_export_to_memory()`.
-struct wasmer_memory_t {
-
-};
-
-/// Opaque pointer to the opaque structure `crate::NamedExports`,
-/// which is a wrapper around a vector of the opaque structure
-/// `crate::NamedExport`.
-///
-/// Check the `wasmer_instance_exports()` function to learn more.
-struct wasmer_exports_t {
-
-};
-
-struct wasmer_global_t {
-
-};
-
-struct wasmer_global_descriptor_t {
-  bool mutable_;
-  wasmer_value_tag kind;
-};
-
-struct wasmer_import_descriptor_t {
-
-};
-
-struct wasmer_import_descriptors_t {
-
-};
-
-struct wasmer_import_func_t {
-
-};
-
-struct wasmer_table_t {
-
-};
-
-/// Union of import/export value.
-union wasmer_import_export_value {
-  const wasmer_import_func_t *func;
-  const wasmer_table_t *table;
-  const wasmer_memory_t *memory;
-  const wasmer_global_t *global;
-};
-
-struct wasmer_import_t {
-  wasmer_byte_array module_name;
-  wasmer_byte_array import_name;
-  wasmer_import_export_kind tag;
-  wasmer_import_export_value value;
-};
-
-struct wasmer_import_object_iter_t {
-
-};
-
-/// Opaque pointer to a `wasmer_runtime::Ctx` value in Rust.
-///
-/// An instance context is passed to any host function (aka imported
-/// function) as the first argument. It is necessary to read the
-/// instance data or the memory, respectively with the
-/// `wasmer_instance_context_data_get()` function, and the
-/// `wasmer_instance_context_memory()` function.
-///
-/// It is also possible to get the instance context outside a host
-/// function by using the `wasmer_instance_context_get()`
-/// function. See also `wasmer_instance_context_data_set()` to set the
-/// instance context data.
-///
-/// Example:
-///
-/// ```c
-/// // A host function that prints data from the WebAssembly memory to
-/// // the standard output.
-/// void print(wasmer_instance_context_t *context, int32_t pointer, int32_t length) {
-///     // Use `wasmer_instance_context` to get back the first instance memory.
-///     const wasmer_memory_t *memory = wasmer_instance_context_memory(context, 0);
-///
-///     // Continue…
-/// }
-/// ```
-struct wasmer_instance_context_t {
-
-};
-
-/// The `wasmer_limit_option_t` struct represents an optional limit
-/// for `wasmer_limits_t`.
-struct wasmer_limit_option_t {
-  /// Whether the limit is set.
-  bool has_some;
-  /// The limit value.
-  uint32_t some;
-};
-
-/// The `wasmer_limits_t` struct is a type that describes a memory
-/// options. See the `wasmer_memory_t` struct or the
-/// `wasmer_memory_new()` function to get more information.
-struct wasmer_limits_t {
-  /// The minimum number of allowed pages.
-  uint32_t min;
-  /// The maximum number of allowed pages.
-  wasmer_limit_option_t max;
-};
-
-struct wasmer_serialized_module_t {
-
-};
-
-#if (!defined(_WIN32) && defined(ARCH_X86_64))
-struct wasmer_trampoline_buffer_builder_t {
-
-};
-#endif
-
-#if (!defined(_WIN32) && defined(ARCH_X86_64))
-struct wasmer_trampoline_callable_t {
-
-};
-#endif
-
-#if (!defined(_WIN32) && defined(ARCH_X86_64))
-struct wasmer_trampoline_buffer_t {
-
-};
-#endif
-
-#if defined(WASMER_WASI_ENABLED)
-/// Opens a directory that's visible to the WASI module as `alias` but
-/// is backed by the host file at `host_file_path`
-struct wasmer_wasi_map_dir_entry_t {
-  /// What the WASI module will see in its virtual root
-  wasmer_byte_array alias;
-  /// The backing file that the WASI module will interact with via the alias
-  wasmer_byte_array host_file_path;
-};
-#endif
-
-extern "C" {
-
-/// Creates a new Module from the given wasm bytes.
-///
-/// Returns `wasmer_result_t::WASMER_OK` upon success.
-///
-/// Returns `wasmer_result_t::WASMER_ERROR` upon failure. Use `wasmer_last_error_length`
-/// and `wasmer_last_error_message` to get an error message.
-wasmer_result_t wasmer_compile(wasmer_module_t **module,
-                               uint8_t *wasm_bytes,
-                               uint32_t wasm_bytes_len);
-
-#if defined(WASMER_EMSCRIPTEN_ENABLED)
-/// Convenience function for setting up arguments and calling the Emscripten
-/// main function.
-///
-/// WARNING:
-///
-/// Do not call this function on untrusted code when operating without
-/// additional sandboxing in place.
-/// Emscripten has access to many host system calls and therefore may do very
-/// bad things.
-wasmer_result_t wasmer_emscripten_call_main(wasmer_instance_t *instance,
-                                            const wasmer_byte_array *args,
-                                            unsigned int args_len);
-#endif
-
-#if defined(WASMER_EMSCRIPTEN_ENABLED)
-/// Destroy `wasmer_emscrpten_globals_t` created by
-/// `wasmer_emscripten_get_emscripten_globals`.
-void wasmer_emscripten_destroy_globals(wasmer_emscripten_globals_t *globals);
-#endif
-
-#if defined(WASMER_EMSCRIPTEN_ENABLED)
-/// Create a `wasmer_import_object_t` with Emscripten imports, use
-/// `wasmer_emscripten_get_emscripten_globals` to get a
-/// `wasmer_emscripten_globals_t` from a `wasmer_module_t`.
-///
-/// WARNING:
-///
-/// This `import_object_t` contains thin-wrappers around host system calls.
-/// Do not use this to execute untrusted code without additional sandboxing.
-wasmer_import_object_t *wasmer_emscripten_generate_import_object(wasmer_emscripten_globals_t *globals);
-#endif
-
-#if defined(WASMER_EMSCRIPTEN_ENABLED)
-/// Create a `wasmer_emscripten_globals_t` from a Wasm module.
-wasmer_emscripten_globals_t *wasmer_emscripten_get_globals(const wasmer_module_t *module);
-#endif
-
-#if defined(WASMER_EMSCRIPTEN_ENABLED)
-/// Execute global constructors (required if the module is compiled from C++)
-/// and sets up the internal environment.
-///
-/// This function sets the data pointer in the same way that
-/// [`wasmer_instance_context_data_set`] does.
-wasmer_result_t wasmer_emscripten_set_up(wasmer_instance_t *instance,
-                                         wasmer_emscripten_globals_t *globals);
-#endif
-
-/// Gets export descriptor kind
-wasmer_import_export_kind wasmer_export_descriptor_kind(wasmer_export_descriptor_t *export_);
-
-/// Gets name for the export descriptor
-wasmer_byte_array wasmer_export_descriptor_name(wasmer_export_descriptor_t *export_descriptor);
-
-/// Gets export descriptors for the given module
-///
-/// The caller owns the object and should call `wasmer_export_descriptors_destroy` to free it.
-void wasmer_export_descriptors(const wasmer_module_t *module,
-                               wasmer_export_descriptors_t **export_descriptors);
-
-/// Frees the memory for the given export descriptors
-void wasmer_export_descriptors_destroy(wasmer_export_descriptors_t *export_descriptors);
-
-/// Gets export descriptor by index
-wasmer_export_descriptor_t *wasmer_export_descriptors_get(wasmer_export_descriptors_t *export_descriptors,
-                                                          int idx);
-
-/// Gets the length of the export descriptors
-int wasmer_export_descriptors_len(wasmer_export_descriptors_t *exports);
-
-/// Calls a `func` with the provided parameters.
-/// Results are set using the provided `results` pointer.
-///
-/// Returns `wasmer_result_t::WASMER_OK` upon success.
-///
-/// Returns `wasmer_result_t::WASMER_ERROR` upon failure. Use `wasmer_last_error_length`
-/// and `wasmer_last_error_message` to get an error message.
-wasmer_result_t wasmer_export_func_call(const wasmer_export_func_t *func,
-                                        const wasmer_value_t *params,
-                                        unsigned int params_len,
-                                        wasmer_value_t *results,
-                                        unsigned int results_len);
-
-/// Sets the params buffer to the parameter types of the given wasmer_export_func_t
-///
-/// Returns `wasmer_result_t::WASMER_OK` upon success.
-///
-/// Returns `wasmer_result_t::WASMER_ERROR` upon failure. Use `wasmer_last_error_length`
-/// and `wasmer_last_error_message` to get an error message.
-wasmer_result_t wasmer_export_func_params(const wasmer_export_func_t *func,
-                                          wasmer_value_tag *params,
-                                          uint32_t params_len);
-
-/// Sets the result parameter to the arity of the params of the wasmer_export_func_t
-///
-/// Returns `wasmer_result_t::WASMER_OK` upon success.
-///
-/// Returns `wasmer_result_t::WASMER_ERROR` upon failure. Use `wasmer_last_error_length`
-/// and `wasmer_last_error_message` to get an error message.
-wasmer_result_t wasmer_export_func_params_arity(const wasmer_export_func_t *func, uint32_t *result);
-
-/// Sets the returns buffer to the parameter types of the given wasmer_export_func_t
-///
-/// Returns `wasmer_result_t::WASMER_OK` upon success.
-///
-/// Returns `wasmer_result_t::WASMER_ERROR` upon failure. Use `wasmer_last_error_length`
-/// and `wasmer_last_error_message` to get an error message.
-wasmer_result_t wasmer_export_func_returns(const wasmer_export_func_t *func,
-                                           wasmer_value_tag *returns,
-                                           uint32_t returns_len);
-
-/// Sets the result parameter to the arity of the returns of the wasmer_export_func_t
-///
-/// Returns `wasmer_result_t::WASMER_OK` upon success.
-///
-/// Returns `wasmer_result_t::WASMER_ERROR` upon failure. Use `wasmer_last_error_length`
-/// and `wasmer_last_error_message` to get an error message.
-wasmer_result_t wasmer_export_func_returns_arity(const wasmer_export_func_t *func,
-                                                 uint32_t *result);
-
-/// Gets wasmer_export kind
-wasmer_import_export_kind wasmer_export_kind(wasmer_export_t *export_);
-
-/// Gets name from wasmer_export
-wasmer_byte_array wasmer_export_name(wasmer_export_t *export_);
-
-/// Gets export func from export
-const wasmer_export_func_t *wasmer_export_to_func(const wasmer_export_t *export_);
-
-/// Gets a memory pointer from an export pointer.
-///
-/// Returns `wasmer_result_t::WASMER_OK` upon success.
-///
-/// Returns `wasmer_result_t::WASMER_ERROR` upon failure. Use `wasmer_last_error_length`
-/// and `wasmer_last_error_message` to get an error message.
-wasmer_result_t wasmer_export_to_memory(const wasmer_export_t *export_, wasmer_memory_t **memory);
-
-/// Frees the memory for the given exports.
-///
-/// Check the `wasmer_instance_exports()` function to get a complete
-/// example.
-///
-/// If `exports` is a null pointer, this function does nothing.
-///
-/// Example:
-///
-/// ```c
-/// // Get some exports.
-/// wasmer_exports_t *exports = NULL;
-/// wasmer_instance_exports(instance, &exports);
-///
-/// // Destroy the exports.
-/// wasmer_exports_destroy(exports);
-/// ```
-void wasmer_exports_destroy(wasmer_exports_t *exports);
-
-/// Gets wasmer_export by index
-wasmer_export_t *wasmer_exports_get(wasmer_exports_t *exports, int idx);
-
-/// Gets the length of the exports
-int wasmer_exports_len(wasmer_exports_t *exports);
-
-/// Frees memory for the given Global
-void wasmer_global_destroy(wasmer_global_t *global);
-
-/// Gets the value stored by the given Global
-wasmer_value_t wasmer_global_get(wasmer_global_t *global);
-
-/// Returns a descriptor (type, mutability) of the given Global
-wasmer_global_descriptor_t wasmer_global_get_descriptor(wasmer_global_t *global);
-
-/// Creates a new Global and returns a pointer to it.
-/// The caller owns the object and should call `wasmer_global_destroy` to free it.
-wasmer_global_t *wasmer_global_new(wasmer_value_t value, bool mutable_);
-
-/// Sets the value stored by the given Global
-void wasmer_global_set(wasmer_global_t *global, wasmer_value_t value);
-
-/// Gets export descriptor kind
-wasmer_import_export_kind wasmer_import_descriptor_kind(wasmer_import_descriptor_t *export_);
-
-/// Gets module name for the import descriptor
-wasmer_byte_array wasmer_import_descriptor_module_name(wasmer_import_descriptor_t *import_descriptor);
-
-/// Gets name for the import descriptor
-wasmer_byte_array wasmer_import_descriptor_name(wasmer_import_descriptor_t *import_descriptor);
-
-/// Gets import descriptors for the given module
-///
-/// The caller owns the object and should call `wasmer_import_descriptors_destroy` to free it.
-void wasmer_import_descriptors(const wasmer_module_t *module,
-                               wasmer_import_descriptors_t **import_descriptors);
-
-/// Frees the memory for the given import descriptors
-void wasmer_import_descriptors_destroy(wasmer_import_descriptors_t *import_descriptors);
-
-/// Gets import descriptor by index
-wasmer_import_descriptor_t *wasmer_import_descriptors_get(wasmer_import_descriptors_t *import_descriptors,
-                                                          unsigned int idx);
-
-/// Gets the length of the import descriptors
-unsigned int wasmer_import_descriptors_len(wasmer_import_descriptors_t *exports);
-
-/// Frees memory for the given Func
-void wasmer_import_func_destroy(wasmer_import_func_t *func);
-
-/// Creates new host function, aka imported function. `func` is a
-/// function pointer, where the first argument is the famous `vm::Ctx`
-/// (in Rust), or `wasmer_instance_context_t` (in C). All arguments
-/// must be typed with compatible WebAssembly native types:
-///
-/// | WebAssembly type | C/C++ type |
-/// | ---------------- | ---------- |
-/// | `i32`            | `int32_t`  |
-/// | `i64`            | `int64_t`  |
-/// | `f32`            | `float`    |
-/// | `f64`            | `double`   |
-///
-/// The function pointer must have a lifetime greater than the
-/// WebAssembly instance lifetime.
-///
-/// The caller owns the object and should call
-/// `wasmer_import_func_destroy` to free it.
-wasmer_import_func_t *wasmer_import_func_new(void (*func)(void *data),
-                                             const wasmer_value_tag *params,
-                                             unsigned int params_len,
-                                             const wasmer_value_tag *returns,
-                                             unsigned int returns_len);
-
-/// Sets the params buffer to the parameter types of the given wasmer_import_func_t
-///
-/// Returns `wasmer_result_t::WASMER_OK` upon success.
-///
-/// Returns `wasmer_result_t::WASMER_ERROR` upon failure. Use `wasmer_last_error_length`
-/// and `wasmer_last_error_message` to get an error message.
-wasmer_result_t wasmer_import_func_params(const wasmer_import_func_t *func,
-                                          wasmer_value_tag *params,
-                                          unsigned int params_len);
-
-/// Sets the result parameter to the arity of the params of the wasmer_import_func_t
-///
-/// Returns `wasmer_result_t::WASMER_OK` upon success.
-///
-/// Returns `wasmer_result_t::WASMER_ERROR` upon failure. Use `wasmer_last_error_length`
-/// and `wasmer_last_error_message` to get an error message.
-wasmer_result_t wasmer_import_func_params_arity(const wasmer_import_func_t *func, uint32_t *result);
-
-/// Sets the returns buffer to the parameter types of the given wasmer_import_func_t
-///
-/// Returns `wasmer_result_t::WASMER_OK` upon success.
-///
-/// Returns `wasmer_result_t::WASMER_ERROR` upon failure. Use `wasmer_last_error_length`
-/// and `wasmer_last_error_message` to get an error message.
-wasmer_result_t wasmer_import_func_returns(const wasmer_import_func_t *func,
-                                           wasmer_value_tag *returns,
-                                           unsigned int returns_len);
-
-/// Sets the result parameter to the arity of the returns of the wasmer_import_func_t
-///
-/// Returns `wasmer_result_t::WASMER_OK` upon success.
-///
-/// Returns `wasmer_result_t::WASMER_ERROR` upon failure. Use `wasmer_last_error_length`
-/// and `wasmer_last_error_message` to get an error message.
-wasmer_result_t wasmer_import_func_returns_arity(const wasmer_import_func_t *func,
-                                                 uint32_t *result);
-
-/// Frees memory of the given ImportObject
-void wasmer_import_object_destroy(wasmer_import_object_t *import_object);
-
-/// Extends an existing import object with new imports
-wasmer_result_t wasmer_import_object_extend(wasmer_import_object_t *import_object,
-                                            const wasmer_import_t *imports,
-                                            unsigned int imports_len);
-
-/// Gets an entry from an ImportObject at the name and namespace.
-/// Stores `name`, `namespace`, and `import_export_value` in `import`.
-/// Thus these must remain valid for the lifetime of `import`.
-///
-/// The caller owns all data involved.
-/// `import_export_value` will be written to based on `tag`.
-wasmer_result_t wasmer_import_object_get_import(const wasmer_import_object_t *import_object,
-                                                wasmer_byte_array namespace_,
-                                                wasmer_byte_array name,
-                                                wasmer_import_t *import,
-                                                wasmer_import_export_value *import_export_value,
-                                                uint32_t tag);
-
-/// Frees the memory allocated in `wasmer_import_object_iter_next`
-///
-/// This function does not free the memory in `wasmer_import_object_t`;
-/// it only frees memory allocated while querying a `wasmer_import_object_t`.
-void wasmer_import_object_imports_destroy(wasmer_import_t *imports, uint32_t imports_len);
-
-/// Returns true if further calls to `wasmer_import_object_iter_next` will
-/// not return any new data
-bool wasmer_import_object_iter_at_end(wasmer_import_object_iter_t *import_object_iter);
-
-/// Frees the memory allocated by `wasmer_import_object_iterate_functions`
-void wasmer_import_object_iter_destroy(wasmer_import_object_iter_t *import_object_iter);
-
-/// Writes the next value to `import`.  `WASMER_ERROR` is returned if there
-/// was an error or there's nothing left to return.
-///
-/// To free the memory allocated here, pass the import to `wasmer_import_object_imports_destroy`.
-/// To check if the iterator is done, use `wasmer_import_object_iter_at_end`.
-wasmer_result_t wasmer_import_object_iter_next(wasmer_import_object_iter_t *import_object_iter,
-                                               wasmer_import_t *import);
-
-/// Create an iterator over the functions in the import object.
-/// Get the next import with `wasmer_import_object_iter_next`
-/// Free the iterator with `wasmer_import_object_iter_destroy`
-wasmer_import_object_iter_t *wasmer_import_object_iterate_functions(const wasmer_import_object_t *import_object);
-
-/// Creates a new empty import object.
-/// See also `wasmer_import_object_append`
-wasmer_import_object_t *wasmer_import_object_new();
-
-/// Calls an exported function of a WebAssembly instance by `name`
-/// with the provided parameters. The exported function results are
-/// stored on the provided `results` pointer.
-///
-/// This function returns `wasmer_result_t::WASMER_OK` upon success,
-/// `wasmer_result_t::WASMER_ERROR` otherwise. You can use
-/// `wasmer_last_error_message()` to get the generated error message.
-///
-/// Potential errors are the following:
-///
-///   * `instance` is a null pointer,
-///   * `name` is a null pointer,
-///   * `params` is a null pointer.
-///
-/// Example of calling an exported function that needs two parameters, and returns one value:
-///
-/// ```c
-/// // First argument.
-/// wasmer_value_t argument_one = {
-///     .tag = WASM_I32,
-///     .value.I32 = 3,
-/// };
-///
-/// // Second argument.
-/// wasmer_value_t argument_two = {
-///     .tag = WASM_I32,
-///     .value.I32 = 4,
-/// };
-///
-/// // First result.
-/// wasmer_value_t result_one;
-///
-/// // All arguments and results.
-/// wasmer_value_t arguments[] = {argument_one, argument_two};
-/// wasmer_value_t results[]   = {result_one};
-///
-/// wasmer_result_t call_result = wasmer_instance_call(
-///     instance,  // instance pointer
-///     "sum",     // the exported function name
-///     arguments, // the arguments
-///     2,         // the number of arguments
-///     results,   // the results
-///     1          // the number of results
-/// );
-///
-/// if (call_result == WASMER_OK) {
-///     printf("Result is: %d\n", results[0].value.I32);
-/// }
-/// ```
-wasmer_result_t wasmer_instance_call(wasmer_instance_t *instance,
-                                     const char *name,
-                                     const wasmer_value_t *params,
-                                     uint32_t params_len,
-                                     wasmer_value_t *results,
-                                     uint32_t results_len);
-
-/// Gets the data that can be hold by an instance.
-///
-/// This function is complementary of
-/// `wasmer_instance_context_data_set()`. Please read its
-/// documentation. You can also read the documentation of
-/// `wasmer_instance_context_t` to get other examples.
-///
-/// This function returns nothing if `ctx` is a null pointer.
-void *wasmer_instance_context_data_get(const wasmer_instance_context_t *ctx);
-
-/// Sets the data that can be hold by an instance context.
-///
-/// An instance context (represented by the opaque
-/// `wasmer_instance_context_t` structure) can hold user-defined
-/// data. This function sets the data. This function is complementary
-/// of `wasmer_instance_context_data_get()`.
-///
-/// This function does nothing if `instance` is a null pointer.
-///
-/// Example:
-///
-/// ```c
-/// // Define your own data.
-/// typedef struct {
-///     // …
-/// } my_data;
-///
-/// // Allocate them and set them on the given instance.
-/// my_data *data = malloc(sizeof(my_data));
-/// data->… = …;
-/// wasmer_instance_context_data_set(instance, (void*) data);
-///
-/// // You can read your data.
-/// {
-///     my_data *data = (my_data*) wasmer_instance_context_data_get(wasmer_instance_context_get(instance));
-///     // …
-/// }
-/// ```
-void wasmer_instance_context_data_set(wasmer_instance_t *instance,
-                                      void *data_ptr);
-
-/// Returns the instance context. Learn more by looking at the
-/// `wasmer_instance_context_t` struct.
-///
-/// This function returns `null` if `instance` is a null pointer.
-///
-/// Example:
-///
-/// ```c
-/// const wasmer_instance_context_get *context = wasmer_instance_context_get(instance);
-/// my_data *data = (my_data *) wasmer_instance_context_data_get(context);
-/// // Do something with `my_data`.
-/// ```
-///
-/// It is often useful with `wasmer_instance_context_data_set()`.
-const wasmer_instance_context_t *wasmer_instance_context_get(wasmer_instance_t *instance);
-
-/// Gets the `memory_idx`th memory of the instance.
-///
-/// Note that the index is always `0` until multiple memories are supported.
-///
-/// This function is mostly used inside host functions (aka imported
-/// functions) to read the instance memory.
-///
-/// Example of a _host function_ that reads and prints a string based on a pointer and a length:
-///
-/// ```c
-/// void print_string(const wasmer_instance_context_t *context, int32_t pointer, int32_t length) {
-///     // Get the 0th memory.
-///     const wasmer_memory_t *memory = wasmer_instance_context_memory(context, 0);
-///
-///     // Get the memory data as a pointer.
-///     uint8_t *memory_bytes = wasmer_memory_data(memory);
-///
-///     // Print what we assumed to be a string!
-///     printf("%.*s", length, memory_bytes + pointer);
-/// }
-/// ```
-const wasmer_memory_t *wasmer_instance_context_memory(const wasmer_instance_context_t *ctx,
-                                                      uint32_t _memory_idx);
-
-/// Frees memory for the given `wasmer_instance_t`.
-///
-/// Check the `wasmer_instantiate()` function to get a complete
-/// example.
-///
-/// If `instance` is a null pointer, this function does nothing.
-///
-/// Example:
-///
-/// ```c
-/// // Get an instance.
-/// wasmer_instance_t *instance = NULL;
-/// wasmer_instantiate(&instance, bytes, bytes_length, imports, 0);
-///
-/// // Destroy the instance.
-/// wasmer_instance_destroy(instance);
-/// ```
-void wasmer_instance_destroy(wasmer_instance_t *instance);
-
-/// Gets all the exports of the given WebAssembly instance.
-///
-/// This function stores a Rust vector of exports into `exports` as an
-/// opaque pointer of kind `wasmer_exports_t`.
-///
-/// As is, you can do anything with `exports` except using the
-/// companion functions, like `wasmer_exports_len()`,
-/// `wasmer_exports_get()` or `wasmer_export_kind()`. See the example below.
-///
-/// **Warning**: The caller owns the object and should call
-/// `wasmer_exports_destroy()` to free it.
-///
-/// Example:
-///
-/// ```c
-/// // Get the exports.
-/// wasmer_exports_t *exports = NULL;
-/// wasmer_instance_exports(instance, &exports);
-///
-/// // Get the number of exports.
-/// int exports_length = wasmer_exports_len(exports);
-/// printf("Number of exports: %d\n", exports_length);
-///
-/// // Read the first export.
-/// wasmer_export_t *export = wasmer_exports_get(exports, 0);
-///
-/// // Get the kind of the export.
-/// wasmer_import_export_kind export_kind = wasmer_export_kind(export);
-///
-/// // Assert it is a function (why not).
-/// assert(export_kind == WASM_FUNCTION);
-///
-/// // Read the export name.
-/// wasmer_byte_array name_bytes = wasmer_export_name(export);
-///
-/// assert(name_bytes.bytes_len == sizeof("sum") - 1);
-/// assert(memcmp(name_bytes.bytes, "sum", sizeof("sum") - 1) == 0);
-///
-/// // Destroy the exports.
-/// wasmer_exports_destroy(exports);
-/// ```
-void wasmer_instance_exports(wasmer_instance_t *instance, wasmer_exports_t **exports);
-
-/// Creates a new WebAssembly instance from the given bytes and imports.
-///
-/// The result is stored in the first argument `instance` if
-/// successful, i.e. when the function returns
-/// `wasmer_result_t::WASMER_OK`. Otherwise
-/// `wasmer_result_t::WASMER_ERROR` is returned, and
-/// `wasmer_last_error_length()` with `wasmer_last_error_message()` must
-/// be used to read the error message.
-///
-/// The caller is responsible to free the instance with
-/// `wasmer_instance_destroy()`.
-///
-/// Example:
-///
-/// ```c
-/// // 1. Read a WebAssembly module from a file.
-/// FILE *file = fopen("sum.wasm", "r");
-/// fseek(file, 0, SEEK_END);
-/// long bytes_length = ftell(file);
-/// uint8_t *bytes = malloc(bytes_length);
-/// fseek(file, 0, SEEK_SET);
-/// fread(bytes, 1, bytes_length, file);
-/// fclose(file);
-///
-/// // 2. Declare the imports (here, none).
-/// wasmer_import_t imports[] = {};
-///
-/// // 3. Instantiate the WebAssembly module.
-/// wasmer_instance_t *instance = NULL;
-/// wasmer_result_t result = wasmer_instantiate(&instance, bytes, bytes_length, imports, 0);
-///
-/// // 4. Check for errors.
-/// if (result != WASMER_OK) {
-///     int error_length = wasmer_last_error_length();
-///     char *error = malloc(error_length);
-///     wasmer_last_error_message(error, error_length);
-///     // Do something with `error`…
-/// }
-///
-/// // 5. Free the memory!
-/// wasmer_instance_destroy(instance);
-/// ```
-wasmer_result_t wasmer_instantiate(wasmer_instance_t **instance,
-                                   uint8_t *wasm_bytes,
-                                   uint32_t wasm_bytes_len,
-                                   wasmer_import_t *imports,
-                                   int imports_len);
-
-/// Gets the length in bytes of the last error if any.
-///
-/// This can be used to dynamically allocate a buffer with the correct number of
-/// bytes needed to store a message.
-///
-/// See `wasmer_last_error_message()` to get a full example.
-int wasmer_last_error_length();
-
-/// Gets the last error message if any into the provided buffer
-/// `buffer` up to the given `length`.
-///
-/// The `length` parameter must be large enough to store the last
-/// error message. Ideally, the value should come from
-/// `wasmer_last_error_length()`.
-///
-/// The function returns the length of the string in bytes, `-1` if an
-/// error occurs. Potential errors are:
-///
-///  * The buffer is a null pointer,
-///  * The buffer is too smal to hold the error message.
-///
-/// Note: The error message always has a trailing null character.
-///
-/// Example:
-///
-/// ```c
-/// int error_length = wasmer_last_error_length();
-///
-/// if (error_length > 0) {
-///     char *error_message = malloc(error_length);
-///     wasmer_last_error_message(error_message, error_length);
-///     printf("Error message: `%s`\n", error_message);
-/// } else {
-///     printf("No error message\n");
-/// }
-/// ```
-int wasmer_last_error_message(char *buffer, int length);
-
-/// Gets a pointer to the beginning of the contiguous memory data
-/// bytes.
-///
-/// The function returns `NULL` if `memory` is a null pointer.
-///
-/// Note that when the memory grows, it can be reallocated, and thus
-/// the returned pointer can be invalidated.
-///
-/// Example:
-///
-/// ```c
-/// uint8_t *memory_data = wasmer_memory_data(memory);
-/// char *str = (char*) malloc(sizeof(char) * 7);
-///
-/// for (uint32_t nth = 0; nth < 7; ++nth) {
-///     str[nth] = (char) memory_data[nth];
-/// }
-/// ```
-uint8_t *wasmer_memory_data(const wasmer_memory_t *memory);
-
-/// Gets the size in bytes of the memory data.
-///
-/// This function returns 0 if `memory` is a null pointer.
-///
-/// Example:
-///
-/// ```c
-/// uint32_t memory_data_length = wasmer_memory_data_length(memory);
-/// ```
-uint32_t wasmer_memory_data_length(const wasmer_memory_t *memory);
-
-/// Frees memory for the given `wasmer_memory_t`.
-///
-/// Check the `wasmer_memory_new()` function to get a complete
-/// example.
-///
-/// If `memory` is a null pointer, this function does nothing.
-///
-/// Example:
-///
-/// ```c
-/// // Get a memory.
-/// wasmer_memory_t *memory = NULL;
-/// wasmer_result_t result = wasmer_memory_new(&memory, memory_descriptor);
-///
-/// // Destroy the memory.
-/// wasmer_memory_destroy(memory);
-/// ```
-void wasmer_memory_destroy(wasmer_memory_t *memory);
-
-/// Grows a memory by the given number of pages (of 65Kb each).
-///
-/// The functions return `wasmer_result_t::WASMER_OK` upon success,
-/// `wasmer_result_t::WASMER_ERROR` otherwise. Use
-/// `wasmer_last_error_length()` with `wasmer_last_error_message()` to
-/// read the error message.
-///
-/// Example:
-///
-/// ```c
-/// wasmer_result_t result = wasmer_memory_grow(memory, 10);
-///
-/// if (result != WASMER_OK) {
-///     // …
-/// }
-/// ```
-wasmer_result_t wasmer_memory_grow(wasmer_memory_t *memory, uint32_t delta);
-
-/// Reads the current length (in pages) of the given memory.
-///
-/// The function returns zero if `memory` is a null pointer.
-///
-/// Example:
-///
-/// ```c
-/// uint32_t memory_length = wasmer_memory_length(memory);
-///
-/// printf("Memory pages length: %d\n", memory_length);
-/// ```
-uint32_t wasmer_memory_length(const wasmer_memory_t *memory);
-
-/// Creates a new empty WebAssembly memory for the given descriptor.
-///
-/// The result is stored in the first argument `memory` if successful,
-/// i.e. when the function returns
-/// `wasmer_result_t::WASMER_OK`. Otherwise,
-/// `wasmer_result_t::WASMER_ERROR` is returned, and
-/// `wasmer_last_error_length()` with `wasmer_last_error_message()`
-/// must be used to read the error message.
-///
-/// The caller owns the memory and is responsible to free it with
-/// `wasmer_memory_destroy()`.
-///
-/// Example:
-///
-/// ```c
-/// // 1. The memory object.
-/// wasmer_memory_t *memory = NULL;
-///
-/// // 2. The memory descriptor.
-/// wasmer_limits_t memory_descriptor = {
-///     .min = 10,
-///     .max = {
-///         .has_some = true,
-///         .some = 15,
-///     },
-/// };
-///
-/// // 3. Initialize the memory.
-/// wasmer_result_t result = wasmer_memory_new(&memory, memory_descriptor);
-///
-/// if (result != WASMER_OK) {
-///     int error_length = wasmer_last_error_length();
-///     char *error = malloc(error_length);
-///     wasmer_last_error_message(error, error_length);
-///     // Do something with `error`…
-/// }
-///
-/// // 4. Free the memory!
-/// wasmer_memory_destroy(memory);
-/// ```
-wasmer_result_t wasmer_memory_new(wasmer_memory_t **memory, wasmer_limits_t limits);
-
-/// Deserialize the given serialized module.
-///
-/// Returns `wasmer_result_t::WASMER_OK` upon success.
-///
-/// Returns `wasmer_result_t::WASMER_ERROR` upon failure. Use `wasmer_last_error_length`
-/// and `wasmer_last_error_message` to get an error message.
-wasmer_result_t wasmer_module_deserialize(wasmer_module_t **module,
-                                          const wasmer_serialized_module_t *serialized_module);
-
-/// Frees memory for the given Module
-void wasmer_module_destroy(wasmer_module_t *module);
-
-/// Given:
-/// * A prepared `wasmer` import-object
-/// * A compiled wasmer module
-///
-/// Instantiates a wasmer instance
-wasmer_result_t wasmer_module_import_instantiate(wasmer_instance_t **instance,
-                                                 const wasmer_module_t *module,
-                                                 const wasmer_import_object_t *import_object);
-
-/// Creates a new Instance from the given module and imports.
-///
-/// Returns `wasmer_result_t::WASMER_OK` upon success.
-///
-/// Returns `wasmer_result_t::WASMER_ERROR` upon failure. Use `wasmer_last_error_length`
-/// and `wasmer_last_error_message` to get an error message.
-wasmer_result_t wasmer_module_instantiate(const wasmer_module_t *module,
-                                          wasmer_instance_t **instance,
-                                          wasmer_import_t *imports,
-                                          int imports_len);
-
-/// Serialize the given Module.
-///
-/// The caller owns the object and should call `wasmer_serialized_module_destroy` to free it.
-///
-/// Returns `wasmer_result_t::WASMER_OK` upon success.
-///
-/// Returns `wasmer_result_t::WASMER_ERROR` upon failure. Use `wasmer_last_error_length`
-/// and `wasmer_last_error_message` to get an error message.
-wasmer_result_t wasmer_module_serialize(wasmer_serialized_module_t **serialized_module,
-                                        const wasmer_module_t *module);
-
-/// Get bytes of the serialized module.
-wasmer_byte_array wasmer_serialized_module_bytes(const wasmer_serialized_module_t *serialized_module);
-
-/// Frees memory for the given serialized Module.
-void wasmer_serialized_module_destroy(wasmer_serialized_module_t *serialized_module);
-
-/// Transform a sequence of bytes into a serialized module.
-///
-/// The caller owns the object and should call `wasmer_serialized_module_destroy` to free it.
-///
-/// Returns `wasmer_result_t::WASMER_OK` upon success.
-///
-/// Returns `wasmer_result_t::WASMER_ERROR` upon failure. Use `wasmer_last_error_length`
-/// and `wasmer_last_error_message` to get an error message.
-wasmer_result_t wasmer_serialized_module_from_bytes(wasmer_serialized_module_t **serialized_module,
-                                                    const uint8_t *serialized_module_bytes,
-                                                    uint32_t serialized_module_bytes_length);
-
-/// Frees memory for the given Table
-void wasmer_table_destroy(wasmer_table_t *table);
-
-/// Grows a Table by the given number of elements.
-///
-/// Returns `wasmer_result_t::WASMER_OK` upon success.
-///
-/// Returns `wasmer_result_t::WASMER_ERROR` upon failure. Use `wasmer_last_error_length`
-/// and `wasmer_last_error_message` to get an error message.
-wasmer_result_t wasmer_table_grow(wasmer_table_t *table, uint32_t delta);
-
-/// Returns the current length of the given Table
-uint32_t wasmer_table_length(wasmer_table_t *table);
-
-/// Creates a new Table for the given descriptor and initializes the given
-/// pointer to pointer to a pointer to the new Table.
-///
-/// The caller owns the object and should call `wasmer_table_destroy` to free it.
-///
-/// Returns `wasmer_result_t::WASMER_OK` upon success.
-///
-/// Returns `wasmer_result_t::WASMER_ERROR` upon failure. Use `wasmer_last_error_length`
-/// and `wasmer_last_error_message` to get an error message.
-wasmer_result_t wasmer_table_new(wasmer_table_t **table, wasmer_limits_t limits);
-
-#if (!defined(_WIN32) && defined(ARCH_X86_64))
-/// Adds a callinfo trampoline to the builder.
-///
-/// Deprecated. In a future version `DynamicFunc::new` will be exposed to the C API and should be used instead of this function.
-uintptr_t wasmer_trampoline_buffer_builder_add_callinfo_trampoline(wasmer_trampoline_buffer_builder_t *builder,
-                                                                   const wasmer_trampoline_callable_t *func,
-                                                                   const void *ctx,
-                                                                   uint32_t num_params);
-#endif
-
-#if (!defined(_WIN32) && defined(ARCH_X86_64))
-/// Adds a context trampoline to the builder.
-uintptr_t wasmer_trampoline_buffer_builder_add_context_trampoline(wasmer_trampoline_buffer_builder_t *builder,
-                                                                  const wasmer_trampoline_callable_t *func,
-                                                                  const void *ctx);
-#endif
-
-#if (!defined(_WIN32) && defined(ARCH_X86_64))
-/// Finalizes the trampoline builder into an executable buffer.
-wasmer_trampoline_buffer_t *wasmer_trampoline_buffer_builder_build(wasmer_trampoline_buffer_builder_t *builder);
-#endif
-
-#if (!defined(_WIN32) && defined(ARCH_X86_64))
-/// Creates a new trampoline builder.
-wasmer_trampoline_buffer_builder_t *wasmer_trampoline_buffer_builder_new();
-#endif
-
-#if (!defined(_WIN32) && defined(ARCH_X86_64))
-/// Destroys the trampoline buffer if not null.
-void wasmer_trampoline_buffer_destroy(wasmer_trampoline_buffer_t *buffer);
-#endif
-
-#if (!defined(_WIN32) && defined(ARCH_X86_64))
-/// Returns the callable pointer for the trampoline with index `idx`.
-const wasmer_trampoline_callable_t *wasmer_trampoline_buffer_get_trampoline(const wasmer_trampoline_buffer_t *buffer,
-                                                                            uintptr_t idx);
-#endif
-
-#if (!defined(_WIN32) && defined(ARCH_X86_64))
-/// Returns the context added by `add_context_trampoline`, from within the callee function.
-void *wasmer_trampoline_get_context();
-#endif
-
-/// Stop the execution of a host function, aka imported function. The
-/// function must be used _only_ inside a host function.
-///
-/// The pointer to `wasmer_instance_context_t` is received by the host
-/// function as its first argument. Just passing it to `ctx` is fine.
-///
-/// The error message must have a greater lifetime than the host
-/// function itself since the error is read outside the host function
-/// with `wasmer_last_error_message`.
-///
-/// This function returns `wasmer_result_t::WASMER_ERROR` if `ctx` or
-/// `error_message` are null.
-///
-/// This function never returns otherwise.
-wasmer_result_t wasmer_trap(const wasmer_instance_context_t *ctx, const char *error_message);
-
-/// Validates a sequence of bytes hoping it represents a valid WebAssembly module.
-///
-/// The function returns true if the bytes are valid, false otherwise.
-///
-/// Example:
-///
-/// ```c
-/// bool result = wasmer_validate(bytes, bytes_length);
-///
-/// if (false == result) {
-///     // Do something…
-/// }
-/// ```
-bool wasmer_validate(const uint8_t *wasm_bytes, uint32_t wasm_bytes_len);
-
-#if defined(WASMER_WASI_ENABLED)
-/// Convenience function that creates a WASI import object with no arguments,
-/// environment variables, preopened files, or mapped directories.
-///
-/// This function is the same as calling [`wasmer_wasi_generate_import_object`] with all
-/// empty values.
-wasmer_import_object_t *wasmer_wasi_generate_default_import_object();
-#endif
-
-#if defined(WASMER_WASI_ENABLED)
-/// Creates a WASI import object.
-///
-/// This function treats null pointers as empty collections.
-/// For example, passing null for a string in `args`, will lead to a zero
-/// length argument in that position.
-wasmer_import_object_t *wasmer_wasi_generate_import_object(const wasmer_byte_array *args,
-                                                           unsigned int args_len,
-                                                           const wasmer_byte_array *envs,
-                                                           unsigned int envs_len,
-                                                           const wasmer_byte_array *preopened_files,
-                                                           unsigned int preopened_files_len,
-                                                           const wasmer_wasi_map_dir_entry_t *mapped_dirs,
-                                                           unsigned int mapped_dirs_len);
-#endif
-
-#if defined(WASMER_WASI_ENABLED)
-/// Creates a WASI import object for a specific version.
-///
-/// This function is similar to `wasmer_wasi_generate_import_object`
-/// except that the first argument describes the WASI version.
-///
-/// The version is expected to be of kind `Version`.
-wasmer_import_object_t *wasmer_wasi_generate_import_object_for_version(unsigned char version,
-                                                                       const wasmer_byte_array *args,
-                                                                       unsigned int args_len,
-                                                                       const wasmer_byte_array *envs,
-                                                                       unsigned int envs_len,
-                                                                       const wasmer_byte_array *preopened_files,
-                                                                       unsigned int preopened_files_len,
-                                                                       const wasmer_wasi_map_dir_entry_t *mapped_dirs,
-                                                                       unsigned int mapped_dirs_len);
-#endif
-
-#if defined(WASMER_WASI_ENABLED)
-/// Find the version of WASI used by the module.
-///
-/// In case of error, the returned version is `Version::Unknown`.
-Version wasmer_wasi_get_version(const wasmer_module_t *module);
-#endif
-
-} // extern "C"
-
-#endif // WASMER_H
diff --git a/third_party/wasmer/wasmer.rs b/third_party/wasmer/wasmer.rs
index fdcb27a..c4bd6e5 100644
--- a/third_party/wasmer/wasmer.rs
+++ b/third_party/wasmer/wasmer.rs
@@ -1 +1 @@
-pub extern crate wasmer_runtime_c_api;
+pub extern crate wasmer_c_api;
diff --git a/third_party/wasmer/wasmer_wrapper.cc b/third_party/wasmer/wasmer_wrapper.cc
deleted file mode 100644
index cdfaa69..0000000
--- a/third_party/wasmer/wasmer_wrapper.cc
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright (c) 2020, 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.
-
-// Wraps several functions from wasmer.hh, so that they take and return all
-// structs by pointer, rather than by value. This is necessary because Dart FFI
-// doesn't support passing structs by value yet (once it does, we can delete
-// this wrapper).
-
-#include "wasmer.hh"
-
-extern "C" {
-// Wraps wasmer_export_name.
-void wasmer_export_name_ptr(wasmer_export_t* export_,
-                            wasmer_byte_array* out_name) {
-  *out_name = wasmer_export_name(export_);
-}
-
-// Wraps wasmer_export_descriptor_name.
-void wasmer_export_descriptor_name_ptr(
-    wasmer_export_descriptor_t* export_descriptor,
-    wasmer_byte_array* out_name) {
-  *out_name = wasmer_export_descriptor_name(export_descriptor);
-}
-
-// Wraps wasmer_import_descriptor_module_name.
-void wasmer_import_descriptor_module_name_ptr(
-    wasmer_import_descriptor_t* import_descriptor,
-    wasmer_byte_array* out_name) {
-  *out_name = wasmer_import_descriptor_module_name(import_descriptor);
-}
-
-// Wraps wasmer_import_descriptor_name.
-void wasmer_import_descriptor_name_ptr(
-    wasmer_import_descriptor_t* import_descriptor,
-    wasmer_byte_array* out_name) {
-  *out_name = wasmer_import_descriptor_name(import_descriptor);
-}
-
-// Wraps wasmer_memory_new.
-wasmer_result_t wasmer_memory_new_ptr(wasmer_memory_t** memory,
-                                      wasmer_limits_t* limits) {
-  return wasmer_memory_new(memory, *limits);
-}
-}
diff --git a/tools/FAKE_COMMITS b/tools/FAKE_COMMITS
index 2a622d1..471f72f 100644
--- a/tools/FAKE_COMMITS
+++ b/tools/FAKE_COMMITS
@@ -26,6 +26,8 @@
 Force build while trybots are broken, to check builders for brokenness.
 Force build to test recipe changes
 Force build to test recipe changes
+Trigger bots
+Trigger bots
 
 Analyzer branch commits:
 Force build on new analyzer-branch linux build with new workflow
diff --git a/tools/VERSION b/tools/VERSION
index e305fba..c4a1625 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -25,7 +25,7 @@
 #
 CHANNEL beta
 MAJOR 2
-MINOR 11
+MINOR 12
 PATCH 0
-PRERELEASE 213
-PRERELEASE_PATCH 5
\ No newline at end of file
+PRERELEASE 29
+PRERELEASE_PATCH 1
\ No newline at end of file
diff --git a/tools/abiversions/.gitignore b/tools/abiversions/.gitignore
deleted file mode 100644
index d36db5c..0000000
--- a/tools/abiversions/.gitignore
+++ /dev/null
@@ -1,5 +0,0 @@
-# This directory is populated by gclient sync. But we still need the directory
-# to be checked in, and git doesn't track empty directories, hence this file.
-*
-!.gitignore
-!README.md
diff --git a/tools/abiversions/README.md b/tools/abiversions/README.md
deleted file mode 100644
index 7d0aab6..0000000
--- a/tools/abiversions/README.md
+++ /dev/null
@@ -1,2 +0,0 @@
-The files in this directory are auto-generated by the dart-sdk-linux-be bot
-when the ABI_VERSION in tools/VERSION is incremented.
\ No newline at end of file
diff --git a/tools/android/VERSION_LINUX_NDK b/tools/android/VERSION_LINUX_NDK
deleted file mode 100644
index 4fac77b..0000000
--- a/tools/android/VERSION_LINUX_NDK
+++ /dev/null
@@ -1 +0,0 @@
-e626c47cb82a7439b0eda03ac6e0e9e1e41c6093
diff --git a/tools/android/VERSION_LINUX_SDK b/tools/android/VERSION_LINUX_SDK
deleted file mode 100644
index d24f5c1..0000000
--- a/tools/android/VERSION_LINUX_SDK
+++ /dev/null
@@ -1 +0,0 @@
-0d320c50b0ed188c7e1182388e2beb623a1d307d
diff --git a/tools/android/VERSION_MACOSX_NDK b/tools/android/VERSION_MACOSX_NDK
deleted file mode 100644
index bd19b05..0000000
--- a/tools/android/VERSION_MACOSX_NDK
+++ /dev/null
@@ -1 +0,0 @@
-e8b6ecb5d15c4c4018a62b52aabc13e41b17df8f
diff --git a/tools/android/VERSION_MACOSX_SDK b/tools/android/VERSION_MACOSX_SDK
deleted file mode 100644
index 2441d72..0000000
--- a/tools/android/VERSION_MACOSX_SDK
+++ /dev/null
@@ -1 +0,0 @@
-fa5ea0ca1e0c7c2e40914f3202c7545de4dbca9c
diff --git a/tools/android/download_android_tools.py b/tools/android/download_android_tools.py
deleted file mode 100644
index b264e58..0000000
--- a/tools/android/download_android_tools.py
+++ /dev/null
@@ -1,107 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2017 The Dart project authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-# Downloads trimmed-down Android Tools from Google Cloud Storage and extracts
-# them to INSTALL_DIR, updating INSTALL_DIR/VERSION_* stamp files with current
-# version. Does nothing if INSTALL_DIR/VERSION_* are already up to date.
-
-import os
-import shutil
-import subprocess
-import sys
-import tarfile
-
-# Path constants. (All of these should be absolute paths.)
-THIS_DIR = os.path.abspath(os.path.dirname(__file__))
-DART_ROOT = os.path.abspath(os.path.join(THIS_DIR, '..', '..'))
-# Should be the same as in upload.py.
-INSTALL_DIR = os.path.join(DART_ROOT, 'third_party', 'android_tools')
-
-sys.path.insert(0, os.path.join(DART_ROOT, 'tools'))
-import find_depot_tools
-
-DEPOT_PATH = find_depot_tools.add_depot_tools_to_path()
-GSUTIL_PATH = os.path.join(DEPOT_PATH, 'gsutil.py')
-
-
-def RunCommand(command):
-    """Run command and return success (True) or failure."""
-
-    print 'Running %s' % (str(command))
-    if subprocess.call(command, shell=False) == 0:
-        return True
-    print 'Failed.'
-    return False
-
-
-def GetInstalledVersion(version_stamp):
-    version_file = os.path.join(INSTALL_DIR, version_stamp)
-    if not os.path.exists(version_file):
-        return None
-    with open(version_file) as f:
-        return f.read().strip()
-
-
-def VersionStampName(tools_name):
-    if sys.platform.startswith('linux'):
-        return 'VERSION_LINUX_' + tools_name.upper()
-    elif sys.platform == 'darwin':
-        return 'VERSION_MACOSX_' + tools_name.upper()
-    else:
-        print('NOTE: Will not download android tools. Unsupported platform: ' +
-              sys.platform)
-        sys.exit(0)
-
-
-def UpdateTools(tools_name):
-    """Downloads zipped tools from Google Cloud Storage and extracts them,
-     stamping current version."""
-
-    # Read latest version.
-    version_stamp = VersionStampName(tools_name)
-    version = ''
-    with open(os.path.join(THIS_DIR, version_stamp)) as f:
-        version = f.read().strip()
-    # Return if installed binaries are up to date.
-    if version == GetInstalledVersion(version_stamp):
-        return
-
-    # Remove the old install directory checked out from git.
-    if os.path.exists(os.path.join(INSTALL_DIR, '.git')):
-        shutil.rmtree(INSTALL_DIR)
-    # Make sure that the install directory exists.
-    if not os.path.exists(INSTALL_DIR):
-        os.mkdir(INSTALL_DIR)
-    # Remove current installation.
-    tools_root = os.path.join(INSTALL_DIR, tools_name)
-    if os.path.exists(tools_root):
-        shutil.rmtree(tools_root)
-
-    # Download tools from GCS.
-    archive_path = os.path.join(INSTALL_DIR, tools_name + '.tar.gz')
-    download_cmd = [
-        'python', GSUTIL_PATH, 'cp',
-        'gs://mojo/android/tool/%s.tar.gz' % version, archive_path
-    ]
-    if not RunCommand(download_cmd):
-        print('WARNING: Failed to download Android tools.')
-        return
-
-    print "Extracting Android tools (" + tools_name + ")"
-    with tarfile.open(archive_path) as arch:
-        arch.extractall(INSTALL_DIR)
-    os.remove(archive_path)
-    # Write version as the last step.
-    with open(os.path.join(INSTALL_DIR, version_stamp), 'w+') as f:
-        f.write('%s\n' % version)
-
-
-def main():
-    UpdateTools('sdk')
-    UpdateTools('ndk')
-
-
-if __name__ == '__main__':
-    sys.exit(main())
diff --git a/tools/bots/android.py b/tools/bots/android.py
deleted file mode 100644
index 9ee7d81..0000000
--- a/tools/bots/android.py
+++ /dev/null
@@ -1,65 +0,0 @@
-#!/usr/bin/python
-
-# Copyright (c) 2012, 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.
-"""
-Android buildbot steps.
-"""
-
-import os
-import os.path
-import re
-import sys
-
-import bot
-
-ANDROID_BUILDER = r'vm-android-(linux|mac|win)'
-
-
-def AndroidConfig(name, is_buildbot):
-    """Returns info for the current buildbot based on the name of the builder.
-
-  Currently, this is just:
-  - mode: always "release" (for now)
-  - system: "linux", "mac", or "win"
-  """
-    android_pattern = re.match(ANDROID_BUILDER, name)
-    if not android_pattern:
-        return None
-
-    system = android_pattern.group(1)
-    if system == 'win': system = 'windows'
-
-    return bot.BuildInfo('none', 'vm', 'release', system, checked=True)
-
-
-def AndroidSteps(build_info):
-    # TODO(efortuna): Here's where we'll run tests.
-    #bot.RunTest('android', build_info, ['android'])
-    pass
-
-
-def BuildAndroid(build_info):
-    """
-  Builds the android target.
-
-  - build_info: the buildInfo object, containing information about what sort of
-      build and test to be run.
-  """
-    with bot.BuildStep('Build Android'):
-        # TODO(vsm): A temporary hack until we figure out why incremental builds are
-        # broken on Android.
-        if os.path.exists('./out/lastHooksTargetOS.txt'):
-            os.remove('./out/lastHooksTargetOS.txt')
-        targets = ['runtime']
-        args = [
-            sys.executable, './tools/build.py', '--arch=' + build_info.arch,
-            '--mode=' + build_info.mode, '--os=android'
-        ] + targets
-        print 'Building Android: %s' % (' '.join(args))
-        bot.RunProcess(args)
-
-
-if __name__ == '__main__':
-    bot.RunBot(AndroidConfig, AndroidSteps, build_step=BuildAndroid)
diff --git a/tools/bots/bot.py b/tools/bots/bot.py
deleted file mode 100644
index 74aa8e2..0000000
--- a/tools/bots/bot.py
+++ /dev/null
@@ -1,310 +0,0 @@
-#!/usr/bin/python
-
-# Copyright (c) 2012, 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.
-"""
-Shared code for use in the buildbot scripts.
-"""
-
-import optparse
-import os
-from os.path import abspath
-from os.path import dirname
-import subprocess
-import sys
-
-import bot_utils
-
-utils = bot_utils.GetUtils()
-
-BUILD_OS = utils.GuessOS()
-
-BUILDER_NAME = 'BUILDBOT_BUILDERNAME'
-BUILDER_CLOBBER = 'BUILDBOT_CLOBBER'
-
-
-class BuildInfo(object):
-    """
-  Encapsulation of build information.
-
-  - compiler: None or 'dart2js'
-  - runtime: 'd8', 'ie', 'ff', 'safari', 'chrome', 'opera', or None.
-  - mode: 'debug' or 'release'.
-  - system: 'linux', 'mac', or 'win7'.
-  - checked: True if we should run in checked mode, otherwise False.
-  - host_checked: True if we should run in host checked mode, otherwise False.
-  - minified: True if we should minify the code, otherwise False
-  - shard_index: The shard we are running, None when not specified.
-  - total_shards: The total number of shards, None when not specified.
-  - is_buildbot: True if we are on a buildbot (or emulating it).
-  - test_set: Specification of a non standard test set or None.
-  - csp: This is using csp when running
-  - arch: The architecture to build on.
-  - dart2js_full: Boolean indicating whether this builder will run dart2js
-    on several different runtimes.
-  - builder_tag: A tag indicating a special builder setup.
-  """
-
-    def __init__(self,
-                 compiler,
-                 runtime,
-                 mode,
-                 system,
-                 checked=False,
-                 host_checked=False,
-                 minified=False,
-                 shard_index=None,
-                 total_shards=None,
-                 is_buildbot=False,
-                 test_set=None,
-                 csp=None,
-                 arch=None,
-                 dart2js_full=False,
-                 builder_tag=None,
-                 batch=False):
-        self.compiler = compiler
-        self.runtime = runtime
-        self.mode = mode
-        self.system = system
-        self.checked = checked
-        self.host_checked = host_checked
-        self.minified = minified
-        self.shard_index = shard_index
-        self.total_shards = total_shards
-        self.is_buildbot = is_buildbot
-        self.test_set = test_set
-        self.csp = csp
-        self.dart2js_full = dart2js_full
-        self.builder_tag = builder_tag
-        self.batch = batch
-        if (arch == None):
-            self.arch = 'ia32'
-        else:
-            self.arch = arch
-
-    def PrintBuildInfo(self):
-        shard_description = ""
-        if self.shard_index:
-            shard_description = " shard %s of %s" % (self.shard_index,
-                                                     self.total_shards)
-        print("compiler: %s, runtime: %s mode: %s, system: %s,"
-              " checked: %s, host-checked: %s, minified: %s, test-set: %s"
-              " arch: %s%s") % (self.compiler, self.runtime, self.mode,
-                                self.system, self.checked, self.host_checked,
-                                self.minified, self.test_set, self.arch,
-                                shard_description)
-
-
-class BuildStep(object):
-    """
-  A context manager for handling build steps.
-
-  When the context manager is entered, it prints the "@@@BUILD_STEP __@@@"
-  message. If it exits from an error being raised it displays the
-  "@@@STEP_FAILURE@@@" message.
-
-  If swallow_error is True, then this will catch and discard any OSError that
-  is thrown. This lets you run later BuildSteps if the current one fails.
-  """
-
-    def __init__(self, name, swallow_error=False):
-        self.name = name
-        self.swallow_error = swallow_error
-
-    def __enter__(self):
-        print '@@@BUILD_STEP %s@@@' % self.name
-        sys.stdout.flush()
-
-    def __exit__(self, type, value, traceback):
-        if value:
-            print '@@@STEP_FAILURE@@@'
-            sys.stdout.flush()
-            if self.swallow_error and isinstance(value, OSError):
-                return True
-
-
-def BuildSDK(build_info):
-    """
-  Builds the SDK.
-
-  - build_info: the buildInfo object, containing information about what sort of
-      build and test to be run.
-  """
-    with BuildStep('Build SDK'):
-        args = [
-            sys.executable, './tools/build.py', '--mode=' + build_info.mode,
-            '--arch=' + build_info.arch, 'create_sdk'
-        ]
-        print 'Building SDK: %s' % (' '.join(args))
-        RunProcess(args)
-
-
-def RunBot(parse_name, custom_steps, build_step=BuildSDK):
-    """
-  The main function for running a buildbot.
-
-  A buildbot script should invoke this once. The parse_name function will be
-  called with the name of the buildbot and should return an instance of
-  BuildInfo. This function will then set up the bot, build the SDK etc. When
-  that's done, it will call custom_steps, passing in the BuildInfo object.
-
-  In that, you can perform any bot-specific build steps.
-
-  This function will not return. It will call sys.exit() with an appropriate
-  exit code.
-  """
-    if len(sys.argv) == 0:
-        print 'Script pathname not known, giving up.'
-        sys.exit(1)
-
-    name, is_buildbot = GetBotName()
-    build_info = parse_name(name, is_buildbot)
-    if not build_info:
-        print 'Could not handle unfamiliar bot name "%s".' % name
-        sys.exit(1)
-
-    # Print out the buildinfo for easy debugging.
-    build_info.PrintBuildInfo()
-
-    # Make sure we are in the dart directory
-    os.chdir(bot_utils.DART_DIR)
-
-    try:
-        Clobber()
-        if build_step:
-            build_step(build_info)
-
-        custom_steps(build_info)
-    except OSError as e:
-        sys.exit(e.errno)
-
-    sys.exit(0)
-
-
-def GetBotName():
-    """
-  Gets the name of the current buildbot.
-
-  Returns a tuple of the buildbot name and a flag to indicate if we are actually
-  a buildbot (True), or just a user pretending to be one (False).
-  """
-    # For testing the bot locally, allow the user to pass in a buildbot name.
-    parser = optparse.OptionParser()
-    parser.add_option(
-        '-n',
-        '--name',
-        dest='name',
-        help='The name of the build'
-        'bot you would like to emulate (ex: vm-mac-debug)',
-        default=None)
-    args, _ = parser.parse_args()
-
-    if args.name:
-        return args.name, False
-
-    name = os.environ.get(BUILDER_NAME)
-    if not name:
-        print 'Use -n $BUILDBOT_NAME for the bot you would like to emulate.'
-        sys.exit(1)
-
-    return name, True
-
-
-def Clobber(force=None):
-    """
-  Clobbers the builder before we do the build, if appropriate.
-
-  - mode: either 'debug' or 'release'
-  """
-    if os.environ.get(BUILDER_CLOBBER) != "1" and not force:
-        return
-    clobber_string = 'Clobber'
-    if force:
-        clobber_string = 'Clobber(always)'
-
-    with BuildStep(clobber_string):
-        cmd = [sys.executable, './tools/clean_output_directory.py']
-        print 'Clobbering %s' % (' '.join(cmd))
-        RunProcess(cmd)
-
-
-def RunTest(name, build_info, targets, flags=None, swallow_error=False):
-    """
-  Runs test.py with the given settings.
-  """
-    if not flags:
-        flags = []
-
-    step_name = GetStepName(name, flags)
-    with BuildStep(step_name, swallow_error=swallow_error):
-        sys.stdout.flush()
-
-        cmd = [
-            sys.executable,
-            os.path.join(os.curdir, 'tools',
-                         'test.py'), '--step_name=' + step_name,
-            '--mode=' + build_info.mode, '--compiler=' + build_info.compiler,
-            '--runtime=' + build_info.runtime, '--arch=' + build_info.arch,
-            '--progress=buildbot', '--write-result-log', '-v', '--time',
-            '--use-sdk', '--report'
-        ]
-
-        if build_info.checked:
-            cmd.append('--checked')
-
-        cmd.extend(flags)
-        cmd.extend(targets)
-
-        print 'Running: %s' % (' '.join(map(lambda arg: '"%s"' % arg, cmd)))
-        sys.stdout.flush()
-        RunProcess(cmd)
-
-
-def RunTestRunner(build_info, path):
-    """
-  Runs the test package's runner on the package at 'path'.
-  """
-
-    sdk_bin = os.path.join(
-        bot_utils.DART_DIR,
-        utils.GetBuildSdkBin(BUILD_OS, build_info.mode, build_info.arch))
-
-    build_root = utils.GetBuildRoot(BUILD_OS, build_info.mode, build_info.arch)
-
-    dart_name = 'dart.exe' if build_info.system == 'windows' else 'dart'
-    dart_bin = os.path.join(sdk_bin, dart_name)
-
-    test_bin = os.path.abspath(
-        os.path.join('third_party', 'pkg', 'test', 'bin', 'test.dart'))
-
-    with utils.ChangedWorkingDirectory(path):
-        args = [dart_bin, test_bin, '--reporter', 'expanded', '--no-color']
-        print("Running %s" % ' '.join(args))
-        RunProcess(args)
-
-
-def RunProcess(command, env=None):
-    """
-  Runs command.
-
-  If a non-zero exit code is returned, raises an OSError with errno as the exit
-  code.
-  """
-    if env is None:
-        no_color_env = dict(os.environ)
-    else:
-        no_color_env = env
-    no_color_env['TERM'] = 'nocolor'
-
-    exit_code = subprocess.call(command, env=no_color_env)
-    if exit_code != 0:
-        raise OSError(exit_code)
-
-
-def GetStepName(name, flags):
-    """
-  Filters out flags with '=' as this breaks the /stats feature of the buildbot.
-  """
-    flags = [x for x in flags if not '=' in x]
-    return ('%s tests %s' % (name, ' '.join(flags))).strip()
diff --git a/tools/bots/browsers/README b/tools/bots/browsers/README
deleted file mode 100644
index 91d325c..0000000
--- a/tools/bots/browsers/README
+++ /dev/null
@@ -1,20 +0,0 @@
-This directory contains the hashes of tar.gz files uploaded to cloud storage.
-Steps in the test.py script run "download_from_google_storage"
-to download these tarfiles and unpack them, if the browser cache directory exists.
-These tar files contain browser installations on the different platforms.
-We currently download Chrome.
-
-The downloads use the --auto-platform feature, so that only the browsers for the
-current platform (linux, macos, or windows) is downloaded. This requires
-the subdirectories to have the special names "linux", "win", and "mac", which
-the download_from_google_storage script in depot_tools is hardcoded to
-recognize.
-
-The download is intended to run on bots from the swarming pools, and they
-download to a named cache directory called "browsers" on those swarming bots.
-
-To upload new versions of these tar files, use the "upload_to_google_storage"
-tool in depot_tools, after replacing the existing downloaded browser in-place
-with the new version.
-
-Currently, we only have the Chrome browser for Linux uploaded.
\ No newline at end of file
diff --git a/tools/bots/browsers/chrome/linux/chrome.tar.gz.sha1 b/tools/bots/browsers/chrome/linux/chrome.tar.gz.sha1
deleted file mode 100644
index ef2e989..0000000
--- a/tools/bots/browsers/chrome/linux/chrome.tar.gz.sha1
+++ /dev/null
@@ -1 +0,0 @@
-3d7ff2d8ee18bdb06f84b381795b53351437138b
\ No newline at end of file
diff --git a/tools/bots/compare_results.dart b/tools/bots/compare_results.dart
index ef74e02..9edd0f8 100755
--- a/tools/bots/compare_results.dart
+++ b/tools/bots/compare_results.dart
@@ -7,6 +7,8 @@
 // The output contains additional details in the verbose mode. There is a human
 // readable mode that explains the results and how they changed.
 
+// @dart = 2.9
+
 import 'dart:collection';
 import 'dart:io';
 
@@ -126,12 +128,10 @@
     } else {
       output = name;
     }
-    if (logs != null) {
-      final log = logs[event.after.key];
-      final bar = '=' * (output.length + 2);
-      if (log != null) {
-        logSection?.add("\n\n/$bar\\\n| $output |\n\\$bar/\n\n${log["log"]}");
-      }
+    final log = logs[event.after.key];
+    final bar = '=' * (output.length + 2);
+    if (log != null) {
+      logSection?.add("\n\n/$bar\\\n| $output |\n\\$bar/\n\n${log["log"]}");
     }
     if (!options["logs-only"]) {
       print(output);
@@ -247,7 +247,7 @@
       "changed": "began failing",
       null: "failed",
     },
-    null: {
+    "any": {
       "unchanged": "had the same result",
       "changed": "changed result",
       null: "ran",
@@ -261,10 +261,12 @@
   final logSection = <String>[];
   bool judgement = false;
   for (final searchForStatus
-      in searchForStatuses.isNotEmpty ? searchForStatuses : <String>[null]) {
+      in searchForStatuses.isNotEmpty ? searchForStatuses : <String>["any"]) {
     final searchForChanged = options["unchanged"]
         ? "unchanged"
-        : options["changed"] ? "changed" : null;
+        : options["changed"]
+            ? "changed"
+            : null;
     final aboutStatus = filterDescriptions[searchForStatus][searchForChanged];
     final sectionHeader = "The following tests $aboutStatus:";
     final logSectionArg =
@@ -286,8 +288,11 @@
     if (options["human"] && !options["logs-only"] && !firstSection) {
       print("");
     }
-    String oldNew =
-        options["unchanged"] ? "old " : options["changed"] ? "new " : "";
+    String oldNew = options["unchanged"]
+        ? "old "
+        : options["changed"]
+            ? "new "
+            : "";
     if (judgement) {
       if (options["human"] && !options["logs-only"]) {
         print("There were ${oldNew}test failures.");
diff --git a/tools/bots/dart2js_dump_info.py b/tools/bots/dart2js_dump_info.py
deleted file mode 100644
index e6e7115..0000000
--- a/tools/bots/dart2js_dump_info.py
+++ /dev/null
@@ -1,82 +0,0 @@
-#!/usr/bin/python
-
-# Copyright (c) 2014, 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.
-"""
-Buildbot steps for testing dart2js with --dump-info turned on
-"""
-import os
-import shutil
-import sys
-import bot
-import bot_utils
-
-utils = bot_utils.GetUtils()
-HOST_OS = utils.GuessOS()
-
-
-def DumpConfig(name, is_buildbot):
-    """Returns info for the current buildbot.
-  We only run this bot on linux, so all of this is just hard coded.
-  """
-    return bot.BuildInfo('none', 'none', 'release', 'linux')
-
-
-def Run(args):
-    print "Running: %s" % ' '.join(args)
-    sys.stdout.flush()
-    bot.RunProcess(args)
-
-
-def DumpSteps(build_info):
-    build_root = utils.GetBuildRoot(HOST_OS, mode='release', arch='ia32')
-    compilations_dir = os.path.join(bot_utils.DART_DIR, build_root,
-                                    'generated_compilations')
-    tests = ['html', 'samples']
-
-    with bot.BuildStep('Cleaning out old compilations'):
-        print "Cleaning out %s" % compilations_dir
-        shutil.rmtree(compilations_dir, ignore_errors=True)
-
-    with utils.TempDir() as temp_dir:
-        normal_compilations = os.path.join(temp_dir, 'normal')
-        dump_compilations = os.path.join(temp_dir, 'dump')
-        normal_compilation_command = [
-            sys.executable, './tools/test.py', '--arch=ia32',
-            '--mode=%s' % build_info.mode, '-cdart2js', '-rnone', '--time',
-            '--use-sdk', '--report', '--progress=buildbot', '-v'
-        ] + tests
-        with bot.BuildStep('Compiling without dump info'):
-            Run(normal_compilation_command)
-            pass
-
-        with bot.BuildStep('Store normal compilation artifacts'):
-            args = ['mv', compilations_dir, normal_compilations]
-            Run(args)
-
-        with bot.BuildStep('Compiling with dump info'):
-            args = normal_compilation_command + [
-                '--dart2js-options=--dump-info'
-            ]
-            Run(args)
-
-        with bot.BuildStep('Store normal compilation artifacts'):
-            args = ['mv', compilations_dir, dump_compilations]
-            Run(args)
-
-        with bot.BuildStep('Compare outputs'):
-            args = [
-                'diff', '-rq', '-x', '*\.json', normal_compilations,
-                dump_compilations
-            ]
-            # Diff will return non zero and we will throw if there are any differences
-            Run(args)
-
-        with bot.BuildStep('Validate dump files'):
-            # Do whatever you like :-), files are in dump_compilations
-            pass
-
-
-if __name__ == '__main__':
-    bot.RunBot(DumpConfig, DumpSteps)
diff --git a/tools/bots/dart_sdk.py b/tools/bots/dart_sdk.py
index 77daa10..8e7f6f9 100755
--- a/tools/bots/dart_sdk.py
+++ b/tools/bots/dart_sdk.py
@@ -10,16 +10,14 @@
 import sys
 import subprocess
 
-import bot
 import bot_utils
 
 utils = bot_utils.GetUtils()
 
 BUILD_OS = utils.GuessOS()
 BUILD_ARCHITECTURE = utils.GuessArchitecture()
-
-(bot_name, _) = bot.GetBotName()
-CHANNEL = bot_utils.GetChannelFromName(bot_name)
+BUILDER_NAME = os.environ.get('BUILDBOT_BUILDERNAME')
+CHANNEL = bot_utils.GetChannelFromName(BUILDER_NAME)
 
 
 def BuildArchitectures():
@@ -46,13 +44,12 @@
     footer_file = os.path.join(bot_utils.DART_DIR, 'tools', 'bots',
                                'dartdoc_footer.html')
     url = 'https://api.dartlang.org/stable'
-    with bot.BuildStep('Build API docs by dartdoc'):
-        bot_utils.run([
-            dart_exe, dartdoc_dart, '--sdk-docs', '--output', dirname,
-            '--enable-experiment', 'non-nullable', '--footer-text',
-            footer_text_file, '--footer', footer_file,
-            '--rel-canonical-prefix=' + url
-        ])
+    print('Build API docs by dartdoc')
+    bot_utils.run([
+        dart_exe, dartdoc_dart, '--sdk-docs', '--output', dirname,
+        '--footer-text', footer_text_file, '--footer', footer_file,
+        '--rel-canonical-prefix=' + url
+    ])
 
 
 def CreateUploadVersionFile():
@@ -238,7 +235,10 @@
 def Run(command, env=None):
     print "Running %s" % ' '.join(command)
     print "Environment %s" % env
-    return bot.RunProcess(command, env=env)
+    sys.stdout.flush()
+    exit_code = subprocess.call(command)
+    if exit_code != 0:
+        raise OSError(exit_code)
 
 
 if __name__ == '__main__':
@@ -248,8 +248,8 @@
     elif CHANNEL != bot_utils.Channel.TRY:
         for arch in BuildArchitectures():
             sdk_path = BuildRootPath('dart-sdk', arch=arch)
-            with bot.BuildStep('Create and upload sdk zip for ' + arch):
-                CreateAndUploadSDKZip(arch, sdk_path)
+            print('Create and upload sdk zip for ' + arch)
+            CreateAndUploadSDKZip(arch, sdk_path)
         DartArchiveUnstrippedBinaries()
         if BUILD_OS == 'linux':
             CreateUploadVersionFile()
diff --git a/tools/bots/ddc_tests.py b/tools/bots/ddc_tests.py
deleted file mode 100644
index ad7a131..0000000
--- a/tools/bots/ddc_tests.py
+++ /dev/null
@@ -1,45 +0,0 @@
-#!/usr/bin/env python
-#
-# Copyright (c) 2016, 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 os
-import os.path
-import shutil
-import sys
-import subprocess
-
-import bot
-import bot_utils
-
-TARGETS = ['language_2', 'corelib_2', 'lib_2']
-
-FLAGS = ['--strong']
-
-if __name__ == '__main__':
-    with bot.BuildStep('Build SDK and dartdevc test packages'):
-        bot.RunProcess([
-            sys.executable, './tools/build.py', '--mode=release', '--arch=x64',
-            'dartdevc_test'
-        ])
-
-    with bot.BuildStep('Run tests'):
-        (bot_name, _) = bot.GetBotName()
-        system = bot_utils.GetSystemFromName(bot_name)
-        if system == 'linux':
-            bot.RunProcess([
-                'xvfb-run', sys.executable, './tools/test.py', '--strong',
-                '-mrelease', '-cdartdevc', '-rchrome', '-ax64', '--report',
-                '--time', '--checked', '--progress=buildbot',
-                '--write-result-log'
-            ] + TARGETS)
-        else:
-            info = bot.BuildInfo(
-                'dartdevc',
-                'chrome',
-                'release',
-                system,
-                arch='x64',
-                checked=True)
-            bot.RunTest('dartdevc', info, TARGETS, flags=FLAGS)
diff --git a/tools/bots/extend_results.dart b/tools/bots/extend_results.dart
index 859c02b..225cc18 100644
--- a/tools/bots/extend_results.dart
+++ b/tools/bots/extend_results.dart
@@ -5,6 +5,8 @@
 // Add fields with data about the test run and the commit tested, and
 // with the result on the last build tested, to the test results file.
 
+// @dart = 2.9
+
 import 'dart:convert';
 import 'dart:io';
 
diff --git a/tools/bots/find_base_commit.dart b/tools/bots/find_base_commit.dart
index 5da2e31..2a75eca 100755
--- a/tools/bots/find_base_commit.dart
+++ b/tools/bots/find_base_commit.dart
@@ -5,6 +5,8 @@
 
 // Find the newest commit that has a full set of results on the bots.
 
+// @dart = 2.9
+
 import 'dart:async';
 import 'dart:convert';
 import 'dart:io';
diff --git a/tools/bots/flutter/analyze_flutter_engine.sh b/tools/bots/flutter/analyze_flutter_engine.sh
index bdf8244..eac0e39 100755
--- a/tools/bots/flutter/analyze_flutter_engine.sh
+++ b/tools/bots/flutter/analyze_flutter_engine.sh
@@ -25,6 +25,8 @@
 # analyze lib/web_ui
 echo Analyzing lib/web_ui...
 pushd lib/web_ui
+
 $dart pub get
-$dart analyze
+$dart analyze --fatal-infos
+
 popd
diff --git a/tools/bots/flutter/compile_flutter.sh b/tools/bots/flutter/compile_flutter.sh
index 5f27241..1843abb 100755
--- a/tools/bots/flutter/compile_flutter.sh
+++ b/tools/bots/flutter/compile_flutter.sh
@@ -63,11 +63,11 @@
 popd  # flutter
 
 # Directly in temp directory again.
-mkdir src
+git clone --single-branch --depth=1 -vv \
+    https://dart.googlesource.com/external/github.com/flutter/buildroot src
 pushd src
 git clone --single-branch --depth=1 -vv \
     https://dart.googlesource.com/external/github.com/flutter/engine flutter
-mkdir third_party
 pushd third_party
 ln -s $checkout dart
 popd  # third_party
@@ -97,7 +97,7 @@
     --packages=$checkout/.packages \
     $checkout/pkg/front_end/tool/_fasta/compile_platform.dart \
     --enable-experiment=non-nullable \
-    --nnbd-weak \
+    --nnbd-agnostic \
     --target=flutter \
     dart:core \
     --single-root-scheme=org-dartlang-sdk \
diff --git a/tools/bots/get_builder_status.dart b/tools/bots/get_builder_status.dart
index e464abc..e058e42 100755
--- a/tools/bots/get_builder_status.dart
+++ b/tools/bots/get_builder_status.dart
@@ -8,6 +8,8 @@
 // These cloud functions write a success/failure result to the
 // builder table based on the approvals in Firestore.
 
+// @dart = 2.9
+
 import 'dart:async';
 import 'dart:convert';
 import 'dart:io';
@@ -18,7 +20,7 @@
 const numAttempts = 20;
 const failuresPerConfiguration = 20;
 
-bool useStagingDatabase;
+/*late*/ bool useStagingDatabase;
 
 String get queryUrl {
   var project = useStagingDatabase ? "dart-ci-staging" : "dart-ci";
@@ -26,11 +28,11 @@
       'projects/$project/databases/(default)/documents:runQuery';
 }
 
-String builder;
-String builderBase;
-int buildNumber;
-String token;
-http.Client client;
+/*late*/ String builder;
+/*late*/ String builderBase;
+/*late*/ int buildNumber;
+/*late*/ String token;
+/*late*/ http.Client client;
 
 String get buildTable => builder.endsWith('-try') ? 'try_builds' : 'builds';
 String get resultsTable => builder.endsWith('-try') ? 'try_results' : 'results';
@@ -73,9 +75,9 @@
     usage(parser);
   }
 
-  useStagingDatabase = options['staging'];
-  builder = options['builder'];
-  buildNumber = int.parse(options['build_number']);
+  useStagingDatabase = options['staging'] /*!*/;
+  builder = options['builder'] /*!*/;
+  buildNumber = int.parse(options['build_number'] /*!*/);
   builderBase = builder.replaceFirst(RegExp('-try\$'), '');
   if (options['auth_token'] == null) {
     print('Option "--auth_token (-a)" is required\n');
@@ -139,7 +141,7 @@
   final response = await runFirestoreQuery(configurationsQuery());
   if (response.statusCode == HttpStatus.ok) {
     final documents = jsonDecode(response.body);
-    final groups = <String>{
+    final groups = <String /*!*/ >{
       for (Map document in documents)
         if (document.containsKey('document'))
           document['document']['name'].split('/').last
@@ -154,12 +156,12 @@
 Future<String> commitHash(int index) =>
     commitHashes.putIfAbsent(index, () => fetchCommitHash(index));
 
-Future<String> fetchCommitHash(int index) async {
+Future<String /*!*/ > fetchCommitHash(int index) async {
   final response = await runFirestoreQuery(commitQuery(index));
   if (response.statusCode == HttpStatus.ok) {
     final document = jsonDecode(response.body).first['document'];
     if (document != null) {
-      return document['name'].split('/').last;
+      return document['name'] /*!*/ .split('/').last;
     }
   }
   print('Could not fetch commit with index $index');
@@ -167,7 +169,7 @@
 }
 
 Future<Map<String, List<Map<String, dynamic>>>> fetchActiveFailures(
-    List<String> configurations) async {
+    List<String /*!*/ > configurations) async {
   final failures = <String, List<Map<String, dynamic>>>{};
   for (final configuration in configurations) {
     final response =
diff --git a/tools/bots/lib/src/firestore.dart b/tools/bots/lib/src/firestore.dart
index 6e8cc47..44344e2 100644
--- a/tools/bots/lib/src/firestore.dart
+++ b/tools/bots/lib/src/firestore.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 import 'dart:convert' show jsonDecode, jsonEncode;
 import 'dart:io' show File, HttpStatus;
 
@@ -50,7 +52,7 @@
     };
   }
 
-  Future<List> runQuery(Query query) async {
+  Future<List /*!*/ > runQuery(Query query) async {
     var body = jsonEncode(query.data);
     var response = await _client.post(queryUrl, headers: _headers, body: body);
     if (response.statusCode == HttpStatus.ok) {
@@ -60,14 +62,18 @@
     }
   }
 
-  Future<Object> getDocument(String collectionName, String documentName) async {
+  Future<Map> getDocument(String collectionName, String documentName) async {
     var url = '$documentsUrl/$collectionName/$documentName';
     if (_currentTransaction != null) {
       url = '$url?transaction=${_escapedCurrentTransaction}';
     }
     var response = await _client.get(url, headers: _headers);
     if (response.statusCode == HttpStatus.ok) {
-      return jsonDecode(response.body);
+      var document = jsonDecode(response.body);
+      if (!document is Map) {
+        throw _error(response, message: 'Expected a Map');
+      }
+      return document;
     } else {
       throw _error(response);
     }
diff --git a/tools/bots/linux_distribution_support.py b/tools/bots/linux_distribution_support.py
index e0f05bf..789fce8 100644
--- a/tools/bots/linux_distribution_support.py
+++ b/tools/bots/linux_distribution_support.py
@@ -12,29 +12,14 @@
 
 import os
 import re
+import subprocess
 import sys
 
-import bot
 import bot_utils
 
 utils = bot_utils.GetUtils()
 
 HOST_OS = utils.GuessOS()
-SRC_BUILDER = r'debianpackage-linux'
-
-
-def SrcConfig(name, is_buildbot):
-    """Returns info for the current buildbot based on the name of the builder.
-
-  Currently, since we only run this on linux, this is just:
-  - mode: always "release"
-  - system: always "linux"
-  """
-    src_pattern = re.match(SRC_BUILDER, name)
-    if not src_pattern:
-        return None
-    return bot.BuildInfo('none', 'none', 'release', 'linux')
-
 
 def InstallFromDep(builddir):
     for entry in os.listdir(builddir):
@@ -57,10 +42,14 @@
     return filename
 
 
-def Run(args):
-    print "Running: %s" % ' '.join(args)
+def Run(command):
+    print "Running: %s" % ' '.join(command)
     sys.stdout.flush()
-    bot.RunProcess(args)
+    no_color_env = dict(os.environ)
+    no_color_env['TERM'] = 'nocolor'
+    exit_code = subprocess.call(command, env=no_color_env)
+    if exit_code != 0:
+        raise OSError(exit_code)
 
 
 def TestInstallation(assume_installed=True):
@@ -78,11 +67,7 @@
                 sys.exit(1)
 
 
-def SrcSteps(build_info):
-    # We always clobber the bot, to not leave old tarballs and packages
-    # floating around the out dir.
-    bot.Clobber(force=True)
-
+def SrcSteps():
     version = utils.GetVersion()
     builddir = os.path.join(bot_utils.DART_DIR, utils.GetBuildDir(HOST_OS),
                             'src_and_installation')
@@ -92,64 +77,57 @@
     tarfilename = 'dart-%s.tar.gz' % version
     tarfile = os.path.join(builddir, tarfilename)
 
-    with bot.BuildStep('Validating linux system'):
-        print 'Validating that we are on debian jessie'
-        args = ['cat', '/etc/os-release']
-        (stdout, stderr, exitcode) = bot_utils.run(args)
-        if exitcode != 0:
-            print "Could not find linux system, exiting"
-            sys.exit(1)
-        if not "jessie" in stdout:
-            print "Trying to build debian bits but not on debian Jessie"
-            print "You can't fix this, please contact dart-engprod@"
-            sys.exit(1)
+    print 'Validating that we are on debian jessie'
+    args = ['cat', '/etc/os-release']
+    (stdout, stderr, exitcode) = bot_utils.run(args)
+    if exitcode != 0:
+        print "Could not find linux system, exiting"
+        sys.exit(1)
+    if not "jessie" in stdout:
+        print "Trying to build debian bits but not on debian Jessie"
+        print "You can't fix this, please contact dart-engprod@"
+        sys.exit(1)
 
-    with bot.BuildStep('Create src tarball'):
-        print 'Building src tarball'
-        Run([
-            sys.executable, './tools/create_tarball.py', '--tar_filename',
-            tarfile
-        ])
+    print 'Building src tarball'
+    Run([
+        sys.executable, './tools/create_tarball.py', '--tar_filename', tarfile
+    ])
 
-        print 'Building Debian packages'
-        Run([
-            sys.executable, './tools/create_debian_packages.py',
-            '--tar_filename', tarfile, '--out_dir', builddir
-        ])
+    print 'Building Debian packages'
+    Run([
+        sys.executable, './tools/create_debian_packages.py', '--tar_filename',
+        tarfile, '--out_dir', builddir
+    ])
 
-    with bot.BuildStep('Sanity check installation'):
-        if os.path.exists('/usr/bin/dart') or os.path.exists(
-                '/usr/lib/dart/bin/dart2js'):
-            print "Dart already installed, removing"
-            UninstallDart()
-        TestInstallation(assume_installed=False)
-
-        InstallFromDep(builddir)
-        TestInstallation(assume_installed=True)
-
-        # We build the runtime target to get everything we need to test the
-        # standalone target.
-        Run([
-            sys.executable, './tools/build.py', '-mrelease', '-ax64', 'runtime'
-        ])
-        # Copy in the installed binary to avoid poluting /usr/bin (and having to
-        # run as root)
-        Run(['cp', '/usr/bin/dart', 'out/ReleaseX64/dart'])
-
-        # Sanity check dart2js and the analyzer against a hello world program
-        with utils.TempDir() as temp_dir:
-            test_file = CreateDartTestFile(temp_dir)
-            Run(['/usr/lib/dart/bin/dart2js', test_file])
-            Run(['/usr/lib/dart/bin/dartanalyzer', test_file])
-            Run(['/usr/lib/dart/bin/dart', test_file])
-
-        # Sanity check that pub can start up and print the version
-        Run(['/usr/lib/dart/bin/pub', '--version'])
-
+    if os.path.exists('/usr/bin/dart') or os.path.exists(
+            '/usr/lib/dart/bin/dart2js'):
+        print "Dart already installed, removing"
         UninstallDart()
-        TestInstallation(assume_installed=False)
+    TestInstallation(assume_installed=False)
+
+    InstallFromDep(builddir)
+    TestInstallation(assume_installed=True)
+
+    # We build the runtime target to get everything we need to test the
+    # standalone target.
+    Run([sys.executable, './tools/build.py', '-mrelease', '-ax64', 'runtime'])
+    # Copy in the installed binary to avoid poluting /usr/bin (and having to
+    # run as root)
+    Run(['cp', '/usr/bin/dart', 'out/ReleaseX64/dart'])
+
+    # Sanity check dart2js and the analyzer against a hello world program
+    with utils.TempDir() as temp_dir:
+        test_file = CreateDartTestFile(temp_dir)
+        Run(['/usr/lib/dart/bin/dart2js', test_file])
+        Run(['/usr/lib/dart/bin/dartanalyzer', test_file])
+        Run(['/usr/lib/dart/bin/dart', test_file])
+
+    # Sanity check that pub can start up and print the version
+    Run(['/usr/lib/dart/bin/pub', '--version'])
+
+    UninstallDart()
+    TestInstallation(assume_installed=False)
 
 
 if __name__ == '__main__':
-    # We pass in None for build_step to avoid building the sdk.
-    bot.RunBot(SrcConfig, SrcSteps, build_step=None)
+    SrcSteps()
diff --git a/tools/bots/pub.py b/tools/bots/pub.py
deleted file mode 100755
index 7eda4b8..0000000
--- a/tools/bots/pub.py
+++ /dev/null
@@ -1,50 +0,0 @@
-#!/usr/bin/python
-
-# Copyright (c) 2012, 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.
-"""
-Pub buildbot steps.
-
-Runs tests for pub and the pub packages that are hosted in the main Dart repo.
-"""
-
-import os
-import re
-
-import bot
-
-PUB_BUILDER = r'pub-(linux|mac|win)'
-
-
-def PubConfig(name, is_buildbot):
-    """Returns info for the current buildbot based on the name of the builder.
-
-  Currently, this is just:
-  - mode: always release, we don't run pub in debug mode
-  - system: "linux", "mac", or "win"
-  - checked: always true
-  """
-    pub_pattern = re.match(PUB_BUILDER, name)
-    if not pub_pattern:
-        return None
-
-    system = pub_pattern.group(1)
-    mode = 'release'
-    if system == 'win': system = 'windows'
-
-    return bot.BuildInfo('none', 'vm', mode, system, checked=True, arch='x64')
-
-
-def PubSteps(build_info):
-    pub_location = os.path.join('third_party', 'pkg', 'pub')
-    with bot.BuildStep('Running pub tests'):
-        bot.RunTestRunner(build_info, pub_location)
-
-    dartdoc_location = os.path.join('third_party', 'pkg', 'dartdoc')
-    with bot.BuildStep('Running dartdoc tests'):
-        bot.RunTestRunner(build_info, dartdoc_location)
-
-
-if __name__ == '__main__':
-    bot.RunBot(PubConfig, PubSteps)
diff --git a/tools/bots/pub_integration_test.py b/tools/bots/pub_integration_test.py
index 6d71e1e..6d6ef43 100755
--- a/tools/bots/pub_integration_test.py
+++ b/tools/bots/pub_integration_test.py
@@ -11,6 +11,8 @@
 import tempfile
 
 PUBSPEC = """name: pub_integration_test
+environment:
+  sdk: '>=2.10.0 <=3.0.0'
 dependencies:
   shelf:
   test:
diff --git a/tools/bots/run_android_tests.sh b/tools/bots/run_android_tests.sh
deleted file mode 100755
index 617b17e..0000000
--- a/tools/bots/run_android_tests.sh
+++ /dev/null
@@ -1,29 +0,0 @@
-#!/usr/bin/env bash
-# Copyright (c) 2014, 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.
-
-# This script is meant to be run inside the src directory of a Dartium
-# (or Chromium) checkout, with android_tools installed in third_party.
-# It expects ContentShell to have been built for ARM android, using the
-# ninja build system.
-# It expects one or more android devices to be connected by USB to the machine.
-set -v
-set -x
-cd src
-ninja -C out/Release forwarder2
-export PATH=$PATH:third_party/android_tools/sdk/platform-tools/\
-:third_party/android_tools/sdk/tools/
-
-./build/android/adb_reverse_forwarder.py --all-devices \
-    8081 8081 8082 8082 8083 8083 8084 8084 &
-FORWARDER_PID=$!
-sleep 15
-./dart/tools/test.py -m release -a arm --progress=line --report --time \
-    --write-debug-log --local_ip=localhost \
-    --test_server_port=8083 --test_server_cross_origin_port=8084 \
-    --test_driver_port=8081 --test_driver_error_port=8082 \
-    -r ContentShellOnAndroid --drt=$1
-EXIT_CODE=$?
-kill -9 $FORWARDER_PID
-exit $EXIT_CODE
diff --git a/tools/bots/test_matrix.json b/tools/bots/test_matrix.json
index 6f1f168..f8cbe1d 100644
--- a/tools/bots/test_matrix.json
+++ b/tools/bots/test_matrix.json
@@ -510,6 +510,12 @@
         "use-sdk": true
       }
     },
+    "dart2js-(linux|mac|win)-chrome-unsound": {
+      "options": {
+        "use-sdk": true,
+        "dart2js-options": ["--no-sound-null-safety"]
+      }
+    },
     "dart2js-weak-(linux|mac|win)-x64-d8": {
       "options": {
         "builder-tag": "dart2js-weak",
@@ -521,22 +527,47 @@
         "use-sdk": true
       }
     },
+    "dart2js-(linux|win)-firefox-unsound": {
+      "options": {
+        "use-sdk": true,
+        "dart2js-options": ["--no-sound-null-safety"]
+      }
+    },
     "dart2js-win-ie11": {
       "options": {
         "use-sdk": true,
         "babel": "{\"presets\":[\"es2015\"]}"
       }
     },
+    "dart2js-win-ie11-unsound": {
+      "options": {
+        "use-sdk": true,
+        "babel": "{\"presets\":[\"es2015\"]}",
+        "dart2js-options": ["--no-sound-null-safety"]
+      }
+    },
     "dart2js-win-edge": {
       "options": {
         "use-sdk": true
       }
     },
+    "dart2js-win-edge-unsound": {
+      "options": {
+        "use-sdk": true,
+        "dart2js-options": ["--no-sound-null-safety"]
+      }
+    },
     "dart2js-mac-safari": {
       "options": {
         "use-sdk": true
       }
     },
+    "dart2js-mac-safari-unsound": {
+      "options": {
+        "use-sdk": true,
+        "dart2js-options": ["--no-sound-null-safety"]
+      }
+    },
     "dart2js-minified-csp-(linux|mac|win)-chrome": {
       "options": {
         "minified": true,
@@ -544,12 +575,27 @@
         "use-sdk": true
       }
     },
+    "dart2js-minified-csp-(linux|mac|win)-chrome-unsound": {
+      "options": {
+        "minified": true,
+        "csp": true,
+        "use-sdk": true,
+        "dart2js-options": ["--no-sound-null-safety"]
+      }
+    },
     "dart2js-minified-(linux|mac|win)-d8": {
       "options": {
         "minified": true,
         "use-sdk": true
       }
     },
+    "dart2js-minified-(linux|mac|win)-d8-unsound": {
+      "options": {
+        "minified": true,
+        "use-sdk": true,
+        "dart2js-options": ["--no-sound-null-safety"]
+      }
+    },
     "dart2js-production-(linux|mac|win)-d8": {
       "options": {
         "builder-tag": "dart2js_production",
@@ -564,6 +610,12 @@
         "host-checked": true
       }
     },
+    "dart2js-hostasserts-(linux|mac|win)-(ia32|x64)-d8-unsound": {
+      "options": {
+        "host-checked": true,
+        "dart2js-options": ["--no-sound-null-safety"]
+      }
+    },
     "dart2js-hostasserts-weak-(linux|win)-x64-(d8|chrome)": {
       "options": {
         "builder-tag": "dart2js-weak",
@@ -941,7 +993,8 @@
             "corelib",
             "ffi",
             "language",
-            "lib"
+            "lib",
+            "service"
           ]
         },
         {
@@ -1114,6 +1167,7 @@
             "language",
             "lib",
             "samples",
+            "service",
             "standalone",
             "utils",
             "vm"
@@ -1439,8 +1493,7 @@
         "vm-kernel-win-debug-ia32",
         "vm-kernel-win-debug-x64",
         "vm-kernel-win-product-x64",
-        "vm-kernel-win-release-ia32",
-        "vm-kernel-win-release-x64"
+        "vm-kernel-win-release-ia32"
       ],
       "meta": {
         "description": "This configuration is for the kernel builder group."
@@ -1499,6 +1552,7 @@
             "language",
             "lib",
             "samples",
+            "service",
             "standalone",
             "utils",
             "vm"
@@ -1551,7 +1605,8 @@
         "vm-kernel-linux-debug-x64",
         "vm-kernel-mac-product-x64",
         "vm-kernel-mac-release-x64",
-        "vm-kernel-mac-debug-x64"
+        "vm-kernel-mac-debug-x64",
+        "vm-kernel-win-release-x64"
       ],
       "meta": {
         "description": "This configuration is for the co19_2 kernel builder group."
@@ -1847,7 +1902,6 @@
           "name": "check dart nnbd sdk for static errors",
           "script": "out/ReleaseX64/dart-sdk/bin/dart",
           "arguments": [
-            "--enable-experiment=non-nullable",
             "pkg/dev_compiler/tool/check_nnbd_sdk.dart"
           ]
         },
@@ -2136,7 +2190,7 @@
         {
           "name": "dart2js observatory-ui tests",
           "arguments": [
-            "-ndart2js-hostasserts-linux-ia32-d8",
+            "-ndart2js-hostasserts-linux-ia32-d8-unsound",
             "--dart2js-batch",
             "observatory_ui"
           ]
@@ -2207,7 +2261,7 @@
         {
           "name": "dart2js observatory-ui tests",
           "arguments": [
-            "-ndart2js-${system}-${runtime}",
+            "-ndart2js-${system}-${runtime}-unsound",
             "--dart2js-batch",
             "--reset-browser-configuration",
             "observatory_ui"
@@ -2260,7 +2314,7 @@
         {
           "name": "dart2js observatory-ui tests",
           "arguments": [
-            "-ndart2js-minified-linux-d8",
+            "-ndart2js-minified-linux-d8-unsound",
             "--dart2js-batch",
             "observatory_ui"
           ]
@@ -2331,7 +2385,7 @@
         {
           "name": "dart2js observatory-ui tests",
           "arguments": [
-            "-ndart2js-minified-csp-linux-chrome",
+            "-ndart2js-minified-csp-linux-chrome-unsound",
             "--dart2js-batch",
             "--reset-browser-configuration",
             "observatory_ui"
@@ -2367,7 +2421,6 @@
           "name": "check dart nnbd sdk for static errors",
           "script": "out/ReleaseX64/dart-sdk/bin/dart",
           "arguments": [
-            "--enable-experiment=non-nullable",
             "pkg/dev_compiler/tool/check_nnbd_sdk.dart",
             "--target",
             "dart2js"
@@ -2732,6 +2785,7 @@
             "ffi",
             "language",
             "lib",
+            "service",
             "standalone"
           ]
         },
@@ -3012,7 +3066,6 @@
           "name": "analyze runtime/observatory",
           "script": "out/ReleaseX64/dart-sdk/bin/dartanalyzer",
           "arguments": [
-            "--fatal-warnings",
             "runtime/observatory"
           ]
         },
@@ -3200,7 +3253,7 @@
           ]
         },
         {
-          "name": "remove out directory to do a clean linux-x64-bytecode build",
+          "name": "remove out directory",
           "script": "tools/bots/try_benchmarks.sh",
           "arguments": [
             "clean"
diff --git a/tools/bots/try_benchmarks.sh b/tools/bots/try_benchmarks.sh
index 0c0ed78..8407171 100755
--- a/tools/bots/try_benchmarks.sh
+++ b/tools/bots/try_benchmarks.sh
@@ -148,7 +148,6 @@
       out/ReleaseIA32/dart-sdk \
       out/ReleaseIA32/dart \
       out/ReleaseIA32/gen_snapshot \
-      out/ReleaseIA32/gen_kernel_bytecode.dill \
       out/ReleaseIA32/kernel-service.dart.snapshot \
       out/ReleaseIA32/run_vm_tests \
       sdk \
@@ -178,8 +177,6 @@
     out/ReleaseIA32/dart pkg/front_end/tool/fasta_perf.dart scan hello.dart
     out/ReleaseIA32/run_vm_tests --dfe=out/ReleaseIA32/kernel-service.dart.snapshot InitialRSS
     out/ReleaseIA32/run_vm_tests --dfe=out/ReleaseIA32/kernel-service.dart.snapshot --sound-null-safety --enable-experiment=non-nullable InitialRSS
-    out/ReleaseIA32/run_vm_tests --dfe=out/ReleaseIA32/kernel-service.dart.snapshot GenKernelKernelLoadKernel
-    out/ReleaseIA32/run_vm_tests --dfe=out/ReleaseIA32/kernel-service.dart.snapshot --sound-null-safety --enable-experiment=non-nullable GenKernelKernelLoadKernel
     out/ReleaseIA32/run_vm_tests --dfe=out/ReleaseIA32/kernel-service.dart.snapshot KernelServiceCompileAll
     out/ReleaseIA32/run_vm_tests --dfe=out/ReleaseIA32/kernel-service.dart.snapshot --sound-null-safety --enable-experiment=non-nullable KernelServiceCompileAll
     out/ReleaseIA32/run_vm_tests --dfe=out/ReleaseIA32/kernel-service.dart.snapshot UseDartApi
@@ -290,7 +287,6 @@
       out/ReleaseX64/dart-sdk \
       out/ReleaseX64/dart \
       out/ReleaseX64/gen_snapshot \
-      out/ReleaseX64/gen_kernel_bytecode.dill \
       out/ReleaseX64/kernel-service.dart.snapshot \
       out/ReleaseX64/run_vm_tests \
       third_party/d8/linux/x64 \
@@ -342,8 +338,8 @@
     third_party/d8/linux/x64/d8 --stack_size=1024 sdk/lib/_internal/js_runtime/lib/preambles/d8.js out.js
     out/ReleaseX64/dart-sdk/bin/dart pkg/dev_compiler/tool/ddb -r d8 -b third_party/d8/linux/x64/d8 hello.dart
     out/ReleaseX64/dart-sdk/bin/dart pkg/dev_compiler/tool/ddb -r d8 -b third_party/d8/linux/x64/d8 --mode=compile --compile-vm-options=--print-metrics --packages=.packages --out out.js hello.dart
-    out/ReleaseX64/dart-sdk/bin/dart pkg/dev_compiler/tool/ddb -r d8 -b third_party/d8/linux/x64/d8 --enable-experiment=non-nullable --sound-null-safety --debug hello.dart
-    out/ReleaseX64/dart-sdk/bin/dart pkg/dev_compiler/tool/ddb -r d8 -b third_party/d8/linux/x64/d8 --enable-experiment=non-nullable --sound-null-safety --debug --mode=compile --compile-vm-options=--print-metrics --packages=.packages --out out.js hello.dart
+    out/ReleaseX64/dart-sdk/bin/dart pkg/dev_compiler/tool/ddb -r d8 -b third_party/d8/linux/x64/d8 --enable-experiment=non-nullable --sound-null-safety hello.dart
+    out/ReleaseX64/dart-sdk/bin/dart pkg/dev_compiler/tool/ddb -r d8 -b third_party/d8/linux/x64/d8 --enable-experiment=non-nullable --sound-null-safety --mode=compile --compile-vm-options=--print-metrics --packages=.packages --out out.js hello.dart
     out/ReleaseX64/dart pkg/front_end/tool/perf.dart parse hello.dart
     out/ReleaseX64/dart pkg/front_end/tool/perf.dart scan hello.dart
     out/ReleaseX64/dart pkg/front_end/tool/fasta_perf.dart kernel_gen_e2e hello.dart
@@ -355,8 +351,6 @@
     out/ReleaseX64/dart --packages=.packages pkg/kernel/test/binary_bench.dart --golem AstFromBinaryLazy out/ReleaseX64/vm_platform_strong.dill
     out/ReleaseX64/run_vm_tests --dfe=out/ReleaseX64/kernel-service.dart.snapshot InitialRSS
     out/ReleaseX64/run_vm_tests --dfe=out/ReleaseX64/kernel-service.dart.snapshot --sound-null-safety --enable-experiment=non-nullable InitialRSS
-    out/ReleaseX64/run_vm_tests --dfe=out/ReleaseX64/kernel-service.dart.snapshot GenKernelKernelLoadKernel
-    out/ReleaseX64/run_vm_tests --dfe=out/ReleaseX64/kernel-service.dart.snapshot --sound-null-safety --enable-experiment=non-nullable GenKernelKernelLoadKernel
     out/ReleaseX64/run_vm_tests --dfe=out/ReleaseX64/kernel-service.dart.snapshot KernelServiceCompileAll
     out/ReleaseX64/run_vm_tests --dfe=out/ReleaseX64/kernel-service.dart.snapshot --sound-null-safety --enable-experiment=non-nullable KernelServiceCompileAll
     out/ReleaseX64/run_vm_tests --dfe=out/ReleaseX64/kernel-service.dart.snapshot UseDartApi
diff --git a/tools/bots/update_blamelists.dart b/tools/bots/update_blamelists.dart
index ff795ff..af8d525 100644
--- a/tools/bots/update_blamelists.dart
+++ b/tools/bots/update_blamelists.dart
@@ -6,6 +6,8 @@
 // of active, non-approved failures which include the commit of the current
 // bisection build.
 
+// @dart = 2.9
+
 import 'dart:io';
 
 import 'package:args/args.dart';
@@ -25,7 +27,7 @@
 
   ResultRecord(this.data);
 
-  Map field(String name) => data['fields'][name];
+  Map field(String name) => data['fields'][name] /*!*/;
 
   int get blamelistStartIndex {
     return int.parse(field('blamelist_start_index')['integerValue']);
@@ -39,13 +41,13 @@
     return int.parse(field('blamelist_end_index')['integerValue']);
   }
 
-  String get result => field('result')['stringValue'];
+  String get result => field('result')['stringValue'] /*!*/;
 
-  String get previousResult => field('previous_result')['stringValue'];
+  String get previousResult => field('previous_result')['stringValue'] /*!*/;
 
-  String get name => field('name')['stringValue'];
+  String get name => field('name')['stringValue'] /*!*/;
 
-  String get updateTime => data['updateTime'];
+  String get updateTime => data['updateTime'] /*!*/;
 }
 
 Query unapprovedActiveFailuresQuery(String configuration) {
diff --git a/tools/bots/update_flakiness.dart b/tools/bots/update_flakiness.dart
index 2f4f680..337bf61 100755
--- a/tools/bots/update_flakiness.dart
+++ b/tools/bots/update_flakiness.dart
@@ -5,6 +5,8 @@
 
 // Update the flakiness data with a set of fresh results.
 
+// @dart = 2.9
+
 import 'dart:convert';
 import 'dart:io';
 
@@ -43,9 +45,9 @@
   for (final path in parameters) {
     final results = await loadResults(path);
     for (final resultObject in results) {
-      final String configuration = resultObject['configuration'];
-      final String name = resultObject['name'];
-      final String result = resultObject['result'];
+      final String configuration = resultObject['configuration'] /*!*/;
+      final String name = resultObject['name'] /*!*/;
+      final String result = resultObject['result'] /*!*/;
       final key = '$configuration:$name';
       Map<String, dynamic> newMap() => {};
       final testData = data.putIfAbsent(key, newMap);
diff --git a/tools/bots/upload_debian_packages.py b/tools/bots/upload_debian_packages.py
index 83a3056..4ee7642 100755
--- a/tools/bots/upload_debian_packages.py
+++ b/tools/bots/upload_debian_packages.py
@@ -6,7 +6,6 @@
 
 import os
 
-import bot
 import bot_utils
 
 utils = bot_utils.GetUtils()
@@ -35,7 +34,7 @@
 
 
 if __name__ == '__main__':
-    bot_name, _ = bot.GetBotName()
+    bot_name = os.environ.get('BUILDBOT_BUILDERNAME')
     channel = bot_utils.GetChannelFromName(bot_name)
     if channel != bot_utils.Channel.BLEEDING_EDGE:
         builddir = os.path.join(bot_utils.DART_DIR, utils.GetBuildDir(HOST_OS),
diff --git a/tools/bots/version_checker.py b/tools/bots/version_checker.py
deleted file mode 100755
index 89c4cdd..0000000
--- a/tools/bots/version_checker.py
+++ /dev/null
@@ -1,91 +0,0 @@
-#!/usr/bin/python
-
-# Copyright (c) 2014, 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 json
-import re
-import sys
-
-import bot
-import bot_utils
-
-utils = bot_utils.GetUtils()
-
-VERSION_BUILDER = r'versionchecker'
-
-
-def VersionConfig(name, is_buildbot):
-    version_pattern = re.match(VERSION_BUILDER, name)
-    if not version_pattern:
-        return None
-    # We don't really use this, but we create it anyway to use the standard
-    # bot execution model.
-    return bot.BuildInfo('none', 'none', 'release', 'linux')
-
-
-def GetLatestVersionFromGCS(channel):
-    namer = bot_utils.GCSNamer(channel=channel)
-    gsutil = bot_utils.GSUtil()
-    gcs_version_path = namer.version_filepath('latest')
-    print 'Getting latest version from: %s' % gcs_version_path
-    version_json = gsutil.cat(gcs_version_path)
-    version_map = json.loads(version_json)
-    return version_map['version']
-
-
-def ValidateChannelVersion(latest_version, channel):
-    repo_version = utils.ReadVersionFile()
-    assert repo_version.channel == channel
-    if channel == bot_utils.Channel.STABLE:
-        assert int(repo_version.prerelease) == 0
-        assert int(repo_version.prerelease_patch) == 0
-
-    version_re = r'(\d+)\.(\d+)\.(\d+)(-dev\.(\d+)\.(\d+))?'
-
-    latest_match = re.match(version_re, latest_version)
-    latest_major = int(latest_match.group(1))
-    latest_minor = int(latest_match.group(2))
-    latest_patch = int(latest_match.group(3))
-    # We don't use these on stable.
-    latest_prerelease = int(latest_match.group(5) or 0)
-    latest_prerelease_patch = int(latest_match.group(6) or 0)
-
-    if latest_major < int(repo_version.major):
-        return True
-    if latest_minor < int(repo_version.minor):
-        return True
-    if latest_patch < int(repo_version.patch):
-        return True
-    if latest_prerelease < int(repo_version.prerelease):
-        return True
-    if latest_prerelease_patch < int(repo_version.prerelease_patch):
-        return True
-    return False
-
-
-def VersionSteps(build_info):
-    with bot.BuildStep('Version file sanity checking'):
-        bot_name, _ = bot.GetBotName()
-        channel = bot_utils.GetChannelFromName(bot_name)
-        if channel == bot_utils.Channel.BLEEDING_EDGE:
-            print 'No sanity checking on bleeding edge'
-        else:
-            assert (channel == bot_utils.Channel.STABLE or
-                    channel == bot_utils.Channel.DEV or
-                    channel == bot_utils.Channel.BETA)
-            latest_version = GetLatestVersionFromGCS(channel)
-            version = utils.GetVersion()
-            print 'Latests version on GCS: %s' % latest_version
-            print 'Version currently building: %s' % version
-            if not ValidateChannelVersion(latest_version, channel):
-                print "Validation failed"
-                sys.exit(1)
-            else:
-                print 'Version file changed, sanity checks passed'
-
-
-if __name__ == '__main__':
-    # We pass in None for build_step to avoid building.
-    bot.RunBot(VersionConfig, VersionSteps, build_step=None)
diff --git a/tools/diff_results.dart b/tools/diff_results.dart
index 0e5ee51..427534f 100644
--- a/tools/diff_results.dart
+++ b/tools/diff_results.dart
@@ -3,6 +3,8 @@
 // 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.
 
+// @dart = 2.9
+
 import 'dart:async';
 import 'dart:io';
 import 'dart:convert';
diff --git a/tools/experimental_features.yaml b/tools/experimental_features.yaml
index d750f93..e1403b8 100644
--- a/tools/experimental_features.yaml
+++ b/tools/experimental_features.yaml
@@ -93,13 +93,9 @@
 # default 'language' "category" with code generated for both CFE and Analyzer,
 # while other categories can be tailored more specifically.
 
-current-version: '2.11.0'
+current-version: '2.12.0'
 
 features:
-  non-nullable:
-    help: "Non Nullable by default"
-    experimentalReleaseVersion: '2.10.0'
-
   triple-shift:
     help: "Triple-shift operator"
 
@@ -120,6 +116,11 @@
 # on the command line, and will eventually be removed.
 #
 
+  non-nullable:
+    help: "Non Nullable by default"
+    experimentalReleaseVersion: '2.10.0'
+    enabledIn: '2.12.0'
+
   extension-methods:
     help: "Extension Methods"
     enabledIn: '2.6.0'
diff --git a/tools/generate_idefiles.py b/tools/generate_idefiles.py
index b7131c8..ebaae9c 100755
--- a/tools/generate_idefiles.py
+++ b/tools/generate_idefiles.py
@@ -49,8 +49,10 @@
     if gn_result != 0:
         return gn_result
 
-    out_folder = utils.GetBuildRoot(
-        HOST_OS, mode="debug", arch=options.arch, target_os=options.os)
+    out_folder = utils.GetBuildRoot(HOST_OS,
+                                    mode="debug",
+                                    arch=options.arch,
+                                    target_os=options.os)
 
     if not os.path.isdir(out_folder):
         return 1
@@ -91,12 +93,32 @@
   """
     contents = """analyzer:
   exclude:
+    - benchmarks/**
+    - benchmarks-internal/**
     - docs/newsletter/20171103/**
+    - pkg/**
     - out/**
     - runtime/**
     - samples-dev/swarm/**
     - sdk/lib/**
-    - tests/**
+    - tests/co19/**
+    - tests/co19_2/**
+    - tests/corelib/**
+    - tests/corelib_2/**
+    - tests/dart2js/**
+    - tests/dart2js_2/**
+    - tests/dartdevc/**
+    - tests/dartdevc_2/**
+    - tests/ffi/**
+    - tests/ffi_2/**
+    - tests/kernel/**
+    - tests/language/**
+    - tests/language_2/**
+    - tests/lib/**
+    - tests/lib_2/**
+    - tests/modular/**
+    - tests/standalone/**
+    - tests/standalone_2/**
     - third_party/observatory_pub_packages/**
     - third_party/pkg/**
     - third_party/pkg_tested/dart_style/**
@@ -124,26 +146,30 @@
         "analysis_options.yaml which are used by the analysis servers for "
         "c++ and Dart.")
 
-    parser.add_argument(
-        "-v", "--verbose", help="Verbose output.", action="store_true")
+    parser.add_argument("-v",
+                        "--verbose",
+                        help="Verbose output.",
+                        action="store_true")
 
-    parser.add_argument(
-        "-f", "--force", help="Override files.", action="store_true")
+    parser.add_argument("-f",
+                        "--force",
+                        help="Override files.",
+                        action="store_true")
 
-    parser.add_argument(
-        "-d", "--dir", help="Target directory.", default=utils.DART_DIR)
+    parser.add_argument("-d",
+                        "--dir",
+                        help="Target directory.",
+                        default=utils.DART_DIR)
 
-    parser.add_argument(
-        "-a",
-        "--arch",
-        help="Target architecture for runtime sources.",
-        default="x64")
+    parser.add_argument("-a",
+                        "--arch",
+                        help="Target architecture for runtime sources.",
+                        default="x64")
 
-    parser.add_argument(
-        "-s",
-        "--os",
-        help="Target operating system for runtime sources.",
-        default=HOST_OS)
+    parser.add_argument("-s",
+                        "--os",
+                        help="Target operating system for runtime sources.",
+                        default=HOST_OS)
 
     options = parser.parse_args(argv[1:])
 
diff --git a/tools/generate_package_config.dart b/tools/generate_package_config.dart
index 28de041..24c69c2 100644
--- a/tools/generate_package_config.dart
+++ b/tools/generate_package_config.dart
@@ -1,6 +1,9 @@
 #!/usr/bin/env dart
 
 /// Generates the repo's ".dart_tool/package_config.json" file.
+
+// @dart = 2.9
+
 import 'dart:convert';
 import 'dart:io';
 
@@ -26,6 +29,7 @@
     packageDirectory('sdk/lib/_internal/sdk_library_metadata'),
     packageDirectory('sdk/lib/_internal/js_runtime'),
     packageDirectory('third_party/pkg/protobuf/protobuf'),
+    packageDirectory('tools/package_deps'),
   ];
 
   var cfePackageDirs = [
diff --git a/tools/git_cl_try.sh b/tools/git_cl_try.sh
index 573465d..12f56b9 100644
--- a/tools/git_cl_try.sh
+++ b/tools/git_cl_try.sh
@@ -6,13 +6,6 @@
      -b app-kernel-linux-product-x64-try                     \
      -b app-kernel-linux-release-x64-try
 }
-function git-cl-try-vm-jit-dartkb {
-  echo "git-cl-try-vm-jit-dartkb"
-  git cl try -B dart/try                                     \
-     -b vm-dartkb-linux-release-simarm64-try                 \
-     -b vm-dartkb-linux-release-x64-abi-try                  \
-     -b vm-dartkb-linux-release-x64-try
-}
 function git-cl-try-vm-jit-reload {
   echo "git-cl-try-vm-jit-reload"
   git cl try -B dart/try                                     \
@@ -85,7 +78,6 @@
 function git-cl-try-vm-all {
   echo "git-cl-try-vm-all"
   git-cl-try-vm-jit-app
-  git-cl-try-vm-jit-dartkb
   git-cl-try-vm-jit-reload
   git-cl-try-vm-jit-rest
   git-cl-try-vm-ffi
diff --git a/tools/gn.py b/tools/gn.py
index 11bf8a4..f4f5d7e 100755
--- a/tools/gn.py
+++ b/tools/gn.py
@@ -169,8 +169,6 @@
     if gn_args['target_os'] in ['linux', 'win']:
         gn_args['dart_use_fallback_root_certificates'] = True
 
-    gn_args['dart_platform_bytecode'] = args.bytecode
-
     # Use tcmalloc only when targeting Linux and when not using ASAN.
     gn_args['dart_use_tcmalloc'] = ((gn_args['target_os'] == 'linux') and
                                     sanitizer == 'none')
@@ -385,17 +383,6 @@
                         action='store_false')
     parser.set_defaults(verify_sdk_hash=True)
 
-    parser.add_argument('--bytecode',
-                        '-b',
-                        help='Use bytecode in Dart VM',
-                        dest='bytecode',
-                        action="store_true")
-    parser.add_argument('--no-bytecode',
-                        help='Disable bytecode in Dart VM',
-                        dest='bytecode',
-                        action="store_false")
-    parser.set_defaults(bytecode=False)
-
     parser.add_argument('--clang', help='Use Clang', action='store_true')
     parser.add_argument('--no-clang',
                         help='Disable Clang',
diff --git a/tools/line_doc_comments.dart b/tools/line_doc_comments.dart
index 22d736d..cedd1b8 100755
--- a/tools/line_doc_comments.dart
+++ b/tools/line_doc_comments.dart
@@ -1,6 +1,8 @@
 #!/usr/bin/env dart
 
 /// Converts block-style Doc comments in Dart code to line style.
+
+// @dart = 2.9
 library line_doc_comments;
 
 import 'dart:io';
diff --git a/tools/migration/.packages b/tools/migration/.packages
deleted file mode 100644
index 9380c27..0000000
--- a/tools/migration/.packages
+++ /dev/null
@@ -1,5 +0,0 @@
-# Generated by pub on 2017-07-31 18:29:14.874106.
-args:../../third_party/pkg/args/lib/
-path:../../third_party/pkg/path/lib/
-status_file:../../pkg/status_file/lib/
-migration:lib/
diff --git a/tools/migration/README.md b/tools/migration/README.md
deleted file mode 100644
index a169f39..0000000
--- a/tools/migration/README.md
+++ /dev/null
@@ -1 +0,0 @@
-This package contains tools to help migration this repository to Dart 2.0.
diff --git a/tools/migration/analysis_options.yaml b/tools/migration/analysis_options.yaml
deleted file mode 100644
index 1a46de2..0000000
--- a/tools/migration/analysis_options.yaml
+++ /dev/null
@@ -1,3 +0,0 @@
-analyzer:
-  strong-mode:
-    implicit-casts: false
diff --git a/tools/migration/bin/migrate.dart b/tools/migration/bin/migrate.dart
deleted file mode 100644
index 9edeef7..0000000
--- a/tools/migration/bin/migrate.dart
+++ /dev/null
@@ -1,154 +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';
-
-import 'package:path/path.dart' as p;
-
-import 'package:migration/src/analyze.dart';
-import 'package:migration/src/io.dart';
-import 'package:migration/src/log.dart';
-import 'package:migration/src/test_directories.dart';
-
-void main(List<String> arguments) {
-  arguments = arguments.toList();
-  dryRun = arguments.remove("--dry-run");
-
-  if (arguments.length != 2) {
-    stderr.writeln("Usage: dart migrate.dart [--dry-run] <step> <source dir>");
-    exit(1);
-  }
-
-  var step = arguments[0];
-  var testDir = arguments[1];
-
-  // If the test directory is just a single identifier, assume it's a language
-  // test subdirectory.
-  if (!testDir.contains("/")) testDir = "language_2/$testDir";
-
-  switch (step) {
-    case "branch":
-      _createBranch(testDir);
-      break;
-
-    case "copy":
-      _copyFiles(testDir);
-      break;
-
-    case "fork":
-      _forkFiles(testDir);
-      break;
-
-    case "analyze":
-      _analyzeFiles(testDir);
-      break;
-
-    default:
-      stderr.writeln("Unknown migration step '$step'.");
-      exit(1);
-  }
-}
-
-/// Creates a Git branch whose name matches [testDir].
-void _createBranch(String testDir) {
-  if (_createGitBranch(testDir)) {
-    _showNextStep("Next, copy the migrated files over", "copy", testDir);
-  }
-}
-
-/// Copies files from [testDir] to the corresponding NNBD test directory.
-///
-/// Checks for collisions.
-void _copyFiles(String testDir, {bool showNextStep = false}) {
-  for (var from in listFiles(testDir)) {
-    var to = toNnbdPath(from);
-    if (fileExists(to)) {
-      if (filesIdentical(from, to)) {
-        note("$from has already been copied to $to.");
-      } else {
-        warn(
-            "$to already exists with different contents than $from. Skipping.");
-      }
-    } else {
-      copyFile(from, to);
-      done("Copied $from -> $to");
-    }
-  }
-
-  print(green("Copied files from $testDir -> ${toNnbdPath(testDir)}."));
-  if (showNextStep) {
-    print("Next, commit the new files and upload a new CL with them:");
-    print("");
-    print(bold("  git add ."));
-    print(bold("  git commit -m \"Migrate $testDir to NNBD\"."));
-    print(bold("  git cl upload --bypass-hooks"));
-    _showNextStep("Then use analyzer to migrate the files", "analyze", testDir);
-  }
-}
-
-/// Same as "branch" + "copy" then a commit.
-///
-/// Creates a branch, copies files over, and then commits them.
-void _forkFiles(String testDir) {
-  if (!_createGitBranch(testDir)) return;
-  _copyFiles(testDir, showNextStep: false);
-
-  if (!runProcess("git", ["add", "."])) {
-    print(red("Failed to stage changes."));
-    return;
-  }
-
-  if (!runProcess("git", ["commit", "-m", "Migrate $testDir to NNBD."])) {
-    print(red("Failed to commit changes."));
-    return;
-  }
-
-  print(green("Copied files to a new branch and committed."));
-  print("Next, upload a new CL with them:");
-  print("");
-  print(bold("  git cl upload --bypass-hooks"));
-  _showNextStep("Then use analyzer to migrate the files", "analyze", testDir);
-}
-
-Future _analyzeFiles(String testDir) async {
-  var toDir = p.join(testRoot, toNnbdPath(testDir));
-  if (await analyzeTests(toDir)) {
-    print(
-        "Next, commit the changed files and upload a new patchset with them:");
-    print(bold("  git add ."));
-    print(bold("  git commit -m \"Apply changes needed for NNBD\"."));
-    print(bold("  git cl upload --bypass-hooks"));
-    print("");
-    print("Finally, send that out for code review and land the changes!");
-  } else {
-    _showNextStep(
-        "There are still analysis errors. Fix those and then re-run this step",
-        "analyze",
-        testDir);
-  }
-}
-
-void _showNextStep(String message, String step, String testDir) {
-  print("");
-  print("$message:");
-  print("");
-  print(bold("  dart tools/migration/bin/migrate.dart "
-      "${dryRun ? '--dry-run ' : ''}$step $testDir"));
-}
-
-bool _createGitBranch(String testDir) {
-  var dirName = toNnbdPath(testDir)
-      .replaceAll("/", "-")
-      .replaceAll("_", "-")
-      .replaceAll(RegExp("[^a-z0-9-]"), "");
-  var branchName = "migrate-$dirName";
-  var success = runProcess("git", ["checkout", "-b", branchName]);
-  if (success) {
-    print(green("Created and switched to Git branch '$branchName'."));
-  } else {
-    print(red("Failed to create Git branch '$branchName'."));
-  }
-
-  return success;
-}
diff --git a/tools/migration/bin/progress.dart b/tools/migration/bin/progress.dart
deleted file mode 100644
index 625d3c8..0000000
--- a/tools/migration/bin/progress.dart
+++ /dev/null
@@ -1,113 +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';
-
-import 'package:path/path.dart' as p;
-
-import 'package:migration/src/io.dart';
-import 'package:migration/src/test_directories.dart';
-
-/// Rough estimate of how many lines of code someone could migrate per day.
-/// Based on rnystrom migrating corelib_2/r-z, lib_2/js, and lib_2/collection
-/// in one day (along with some other tasks).
-///
-/// This is an optimistic estimate since those were particularly easy libraries.
-/// But it's also conservative since it didn't take the entire day to migrate
-/// them.
-// TODO(rnystrom): Update this with numbers from migrating some language tests.
-const _linesPerDay = 24607;
-
-/// Some legacy files test behavior that doesn't apply to NNBD at all which
-/// means they don't end up in the migrated directory but are done. We put this
-/// comment in the *legacy* file to track that it has been migrated.
-const _nonMigratedMarker = "[NNBD non-migrated]";
-
-void main(List<String> arguments) {
-  var totalFiles = 0;
-  var totalLines = 0;
-  var totalMigratedFiles = 0;
-  var totalMigratedLines = 0;
-  var languageDirs = 0;
-  var migratedLanguageDirs = 0;
-
-  var skipCompleteSubfolders = arguments.contains("--incomplete");
-
-  for (var rootDir in legacyRootDirs) {
-    var subdirs = Directory(p.join(testRoot, rootDir))
-        .listSync()
-        .where((subdir) => subdir is Directory)
-        .map((subdir) => p.relative(subdir.path, from: testRoot))
-        .toList();
-    subdirs.add(rootDir);
-    subdirs.sort();
-
-    for (var dir in subdirs) {
-      var files = 0;
-      var lines = 0;
-      var migratedFiles = 0;
-      var migratedLines = 0;
-
-      for (var legacyPath in listFiles(dir)) {
-        files++;
-        var sourceLines = readFileLines(legacyPath);
-        lines += sourceLines.length;
-
-        var nnbdPath = toNnbdPath(legacyPath);
-        if (fileExists(nnbdPath) ||
-            sourceLines.any((line) => line.contains(_nonMigratedMarker))) {
-          migratedFiles++;
-          migratedLines += sourceLines.length;
-        }
-      }
-
-      if (files == 0) continue;
-      if (skipCompleteSubfolders && lines == migratedLines) continue;
-
-      _show(dir, migratedFiles, files, migratedLines, lines);
-      totalFiles += files;
-      totalLines += lines;
-      totalMigratedFiles += migratedFiles;
-      totalMigratedLines += migratedLines;
-
-      if (dir.startsWith("language_2/")) {
-        languageDirs++;
-        if (migratedLines == lines) {
-          migratedLanguageDirs++;
-        }
-      }
-    }
-  }
-
-  print("");
-  _show(
-      "total", totalMigratedFiles, totalFiles, totalMigratedLines, totalLines);
-  print("");
-  print("Finished $migratedLanguageDirs/$languageDirs language directories.");
-}
-
-void _show(
-    String label, int migratedFiles, int files, int migratedLines, int lines) {
-  percent(num n, num max) =>
-      (100 * migratedFiles / files).toStringAsFixed(1).padLeft(5);
-  pad(Object value, int length) => value.toString().padLeft(length);
-
-  var days = lines / _linesPerDay;
-  var migratedDays = migratedLines / _linesPerDay;
-  var daysLeft = days - migratedDays;
-
-  var daysLeftString = ", ${pad(daysLeft.toStringAsFixed(2), 6)}/"
-      "${pad(days.toStringAsFixed(2), 5)} days left";
-  if (migratedLines == 0) {
-    daysLeftString = ", ${pad(daysLeft.toStringAsFixed(2), 6)} days left";
-  } else if (migratedLines == lines) {
-    daysLeftString = "";
-  }
-
-  print("${label.padRight(40)} ${pad(migratedFiles, 4)}/${pad(files, 4)} "
-      "files (${percent(migratedFiles, files)}%), "
-      "${pad(migratedLines, 6)}/${pad(lines, 6)} "
-      "lines (${percent(migratedLines, lines)}%)"
-      "$daysLeftString");
-}
diff --git a/tools/migration/bin/test.dart b/tools/migration/bin/test.dart
deleted file mode 100644
index 875c5b7..0000000
--- a/tools/migration/bin/test.dart
+++ /dev/null
@@ -1,205 +0,0 @@
-// Copyright (c) 2020, 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.
-
-/// A little utility script to make it easier to run NNBD and legacy tests.
-import 'dart:io';
-
-import 'package:args/args.dart';
-
-import 'package:migration/src/io.dart';
-import 'package:migration/src/test_directories.dart';
-
-/// Maps "normal" names for Dart implementations to their test runner compiler
-/// names.
-const compilerNames = {
-  "analyzer": "dart2analyzer",
-  "cfe": "fasta",
-  "dart2js": "dart2js",
-  "ddc": "dartdevk",
-  "vm": "dartk",
-};
-
-const strongConfigurations = {
-  "analyzer": "analyzer-asserts-strong-linux",
-  "cfe": "cfe-strong-linux",
-  "dart2js": "dart2js-hostasserts-strong-linux-x64-d8",
-  "ddc": "dartdevk-strong-linux-release-chrome",
-  "vm": "dartk-strong-linux-release-x64",
-};
-
-const weakConfigurations = {
-  "analyzer": "analyzer-asserts-weak-linux",
-  "cfe": "cfe-weak-linux",
-  "dart2js": "dart2js-weak-linux-x64-d8",
-  "ddc": "dartdevk-weak-linux-release-chrome",
-  "vm": "dartk-weak-asserts-linux-release-x64",
-};
-
-const legacyConfigurations = {
-  "analyzer": "analyzer-asserts-linux",
-  "cfe": "cfe-linux",
-  "dart2js": "dart2js-hostasserts-linux-x64-d8",
-  "ddc": "dartdevk-checked-linux-release-chrome",
-  "vm": "dartk-checked-linux-release-x64",
-};
-
-final _failurePattern = RegExp(r"FAILED: [a-z0-9_-]+ [a-z0-9_-]+ (.*)");
-
-void main(List<String> arguments) async {
-  var testDir = "";
-  var isLegacy = false;
-  var isStrong = true;
-  var compare = false;
-  var compiler = "ddc";
-
-  var argParser = ArgParser();
-  argParser.addFlag("legacy",
-      help: "Run the legacy tests.",
-      negatable: false,
-      callback: (flag) => isLegacy = flag);
-
-  argParser.addOption("configuration",
-      abbr: "c",
-      help: "Which Dart implementation to run the tests on.",
-      allowed: ["analyzer", "cfe", "dart2js", "ddc", "vm"],
-      callback: (option) => compiler = option as String);
-
-  argParser.addFlag("weak",
-      abbr: "w",
-      help: "Run the tests in weak mode.",
-      negatable: false,
-      callback: (flag) => isStrong = !flag);
-
-  argParser.addFlag("compare",
-      help: "Compare legacy and migrated results.",
-      negatable: false,
-      callback: (flag) => compare = flag);
-
-  if (arguments.contains("--help")) {
-    showUsage(argParser);
-  }
-
-  try {
-    var argResults = argParser.parse(arguments);
-
-    if (argResults.rest.length != 1) {
-      showUsage(argParser, "Missing test directory.");
-    }
-
-    testDir = argResults.rest[0];
-
-    // If the test directory is just a single identifier, assume it's a language
-    // test subdirectory.
-    if (!testDir.contains("/")) testDir = "language_2/$testDir";
-  } on FormatException catch (exception) {
-    showUsage(argParser, exception.message);
-  }
-
-  if (compare) {
-    var legacyFailures =
-        await runTests(compiler, testDir, isLegacy: true, isStrong: isStrong);
-    var nnbdFailures =
-        await runTests(compiler, testDir, isLegacy: false, isStrong: isStrong);
-
-    var legacyFailureSet = legacyFailures.map(toNnbdPath).toSet();
-    var nnbdFailureSet = nnbdFailures.toSet();
-
-    showFailures(legacyFailures, "Legacy");
-    showFailures(nnbdFailures, "NNBD");
-
-    var hasFailures = false;
-    if (showDifferences("Legacy-only", legacyFailureSet, nnbdFailureSet)) {
-      hasFailures = true;
-    }
-    if (showDifferences("NNBD-only", nnbdFailureSet, legacyFailureSet)) {
-      hasFailures = true;
-    }
-
-    if (!hasFailures) {
-      if (legacyFailures.isEmpty && nnbdFailures.isEmpty) {
-        print("No test failures!");
-      } else {
-        print("Same failures in legacy and NNBD.");
-      }
-    }
-  } else {
-    var failures = await runTests(compiler, testDir,
-        isLegacy: isLegacy, isStrong: isStrong);
-    showFailures(failures);
-  }
-}
-
-bool showDifferences(String label, Set<String> from, Set<String> to) {
-  var difference = from.difference(to);
-  if (difference.isNotEmpty) {
-    showFailures(difference, label);
-  }
-
-  return difference.isNotEmpty;
-}
-
-void showFailures(Iterable<String> failures, [String label]) {
-  if (failures.isEmpty) return;
-
-  print("");
-  if (label != null) print("$label failures:");
-  failures.forEach(print);
-}
-
-void showUsage(ArgParser argParser, [String error]) {
-  if (error != null) {
-    print(error);
-    print("");
-  }
-  print("Usage: dart test.dart <source dir>");
-  print(argParser.usage);
-  exit(error == null ? 0 : 1);
-}
-
-Future<List<String>> runTests(String compiler, String testDir,
-    {bool isLegacy, bool isStrong}) async {
-  if (!isLegacy) testDir = toNnbdPath(testDir);
-
-  // DDC doesn't have a Mac bot so when running DDC tests on a Mac, use a manual
-  // configuration. Otherwise, use the right named configuration.
-  List<String> testArgs;
-  if (Platform.isLinux || compiler != "ddc") {
-    String configuration;
-    if (isLegacy) {
-      configuration = legacyConfigurations[compiler];
-    } else if (isStrong) {
-      configuration = strongConfigurations[compiler];
-    } else {
-      configuration = weakConfigurations[compiler];
-    }
-
-    if (!Platform.isLinux) {
-      // TODO(rnystrom): We'll probably never need to run this script on
-      // Windows, but if we do... do that.
-      configuration = configuration.replaceAll("linux", "mac");
-    }
-
-    testArgs = ["-n$configuration", testDir];
-  } else {
-    testArgs = [
-      "--mode=release",
-      if (!isLegacy) ...[
-        "--enable-experiment=non-nullable",
-        "--nnbd=${isStrong ? 'strong' : 'weak'}",
-      ],
-      "--compiler=${compilerNames[compiler]}",
-      testDir,
-    ];
-  }
-
-  print("Running tools/test.py ${testArgs.join(' ')}");
-  var lines = await runProcessAsync("tools/test.py", testArgs);
-  var failures = <String>[];
-  for (var line in lines) {
-    var match = _failurePattern.firstMatch(line);
-    if (match != null) failures.add(match[1]);
-  }
-
-  return failures;
-}
diff --git a/tools/migration/lib/src/analyze.dart b/tools/migration/lib/src/analyze.dart
deleted file mode 100644
index 25d1be6..0000000
--- a/tools/migration/lib/src/analyze.dart
+++ /dev/null
@@ -1,336 +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';
-
-import 'package:path/path.dart' as p;
-
-import 'io.dart';
-import 'log.dart';
-
-Future<bool> analyzeTests(String nnbdTestDir) async {
-  var files = <String, _FileInfo>{};
-
-  for (var entry in Directory(nnbdTestDir).listSync(recursive: true)) {
-    if (entry is File && entry.path.endsWith(".dart")) {
-      // Skip multitests since they aren't valid Dart files.
-      var isTest = entry.path.endsWith("_test.dart") &&
-          !readFile(entry.path).contains("//#");
-
-      files[entry.path] = _FileInfo(entry.path, isTest: isTest);
-    }
-  }
-
-  // Pre-existing multi-line errors will modify the character length in the
-  // errors reported by the analyzer. Strip all errors first before updating.
-  for (var file in files.values) {
-    if (!dryRun) _removeErrors(file.path);
-  }
-
-  // Analyze the directory both in legacy and NNBD modes.
-  var legacyErrorsFuture = _runAnalyzer(nnbdTestDir, nnbd: false);
-  var nnbdErrorsFuture = _runAnalyzer(nnbdTestDir, nnbd: true);
-
-  var legacyErrors = await legacyErrorsFuture;
-  var nnbdErrors = await nnbdErrorsFuture;
-
-  legacyErrors.forEach((path, errors) {
-    // Sometimes the analysis reaches out to things like pkg/expect.
-    if (!files.containsKey(path)) {
-      files[path] = _FileInfo(path, isTest: false);
-    }
-
-    files[path].legacyErrors.addAll(errors);
-  });
-
-  nnbdErrors.forEach((path, errors) {
-    // Sometimes the analysis reaches out to things like pkg/expect.
-    if (!files.containsKey(path)) {
-      files[path] = _FileInfo(path, isTest: false);
-    }
-
-    files[path].nnbdErrors.addAll(errors);
-  });
-
-  var fileCount = 0;
-  var errorFileCount = 0;
-  var errorCount = 0;
-
-  plural(int count, String name) => "$count $name${count == 1 ? '' : 's'}";
-
-  var fileNames = files.keys.toList()..sort();
-  for (var fileName in fileNames) {
-    var file = files[fileName];
-    if (!file.isTest) continue;
-
-    // Only insert errors that are not already present when the file is
-    // analyzed as a legacy library.
-    file.calculateDifferences();
-
-    fileCount++;
-    errorCount += file.addedErrors.length;
-    if (file.addedErrors.length > 0) {
-      var count = file.addedErrors.length;
-      print("${p.relative(file.path, from: testRoot)}: " +
-          plural(count, 'error'));
-      errorFileCount++;
-    }
-
-    if (!dryRun) _insertErrors(file.path, file.addedErrors);
-  }
-
-  if (errorCount == 0) {
-    print(green("All ${plural(fileCount, 'file')} are static error free!"));
-  } else {
-    print(red("Analyzed ${plural(fileCount, 'file')} and found "
-        "${plural(errorCount, 'error')} "
-        "in ${plural(errorFileCount, 'file')}."));
-  }
-
-  return errorCount == 0;
-}
-
-Future<Map<String, List<_StaticError>>> _runAnalyzer(String inputDir,
-    {bool nnbd}) async {
-  print("Analyzing ${p.relative(inputDir, from: testRoot)}"
-      "${nnbd ? ' with NNBD' : ''}...");
-  var result = await Process.run("dartanalyzer", [
-    "--packages=${p.join(sdkRoot, '.packages')}",
-    if (nnbd) "--enable-experiment=non-nullable",
-    "--format=machine",
-    inputDir,
-  ]);
-  // TODO(rnystrom): How do we pass in options from the test files?
-
-  var errors = _StaticError.parse(result.stderr as String);
-  var errorsByFile = <String, List<_StaticError>>{};
-  for (var error in errors) {
-    if (error.code.startsWith("HINT.")) continue;
-    errorsByFile.putIfAbsent(error.file, () => []).add(error);
-  }
-
-  for (var errors in errorsByFile.values) {
-    errors.sort();
-  }
-
-  return errorsByFile;
-}
-
-/// Removes pre-existing errors in the file at [path].
-void _removeErrors(String path) {
-  // Sanity check.
-  if (!p.isWithin(testRoot, path)) {
-    throw ArgumentError("$path is outside of test directory.");
-  }
-
-  var lines = readFileLines(path);
-  var result = StringBuffer();
-  var changed = false;
-
-  for (var i = 0; i < lines.length; i++) {
-    // Strip out previous inserted comments.
-    if (!lines[i].startsWith("//|")) {
-      result.writeln(lines[i]);
-    } else {
-      changed = true;
-    }
-  }
-
-  if (changed) {
-    writeFile(path, result.toString());
-  }
-}
-
-/// Inserts any new errors in [errors] into the file at [path].
-void _insertErrors(String path, List<_StaticError> errors) {
-  // Sanity check.
-  if (!p.isWithin(testRoot, path)) {
-    throw ArgumentError("$path is outside of test directory.");
-  }
-
-  var lines = readFileLines(path);
-  var result = StringBuffer();
-  var changed = false;
-
-  for (var i = 0; i < lines.length; i++) {
-    result.writeln(lines[i]);
-    // TODO(rnystrom): Inefficient.
-    for (var error in errors) {
-      if (error.line == i + 1) {
-        result.write("//|");
-        result.write(" " * (error.column - 3));
-        result.write("^" * error.length);
-        result.writeln(" ${error.code}");
-        result.writeln("//| ${error.message}");
-        changed = true;
-      }
-    }
-  }
-
-  if (changed) {
-    writeFile(path, result.toString());
-  }
-}
-
-class _FileInfo {
-  final String path;
-  final bool isTest;
-
-  final Set<_StaticError> legacyErrors = {};
-  final Set<_StaticError> nnbdErrors = {};
-
-  final List<_StaticError> removedErrors = [];
-  final List<_StaticError> addedErrors = [];
-
-  _FileInfo(this.path, {this.isTest});
-
-  void calculateDifferences() {
-    removedErrors.addAll(legacyErrors.toSet().difference(nnbdErrors.toSet()));
-    addedErrors.addAll(nnbdErrors.toSet().difference(legacyErrors.toSet()));
-  }
-}
-
-class _StaticError implements Comparable<_StaticError> {
-  static List<_StaticError> parse(String stderr) {
-    List<String> splitMachineError(String line) {
-      var field = StringBuffer();
-      var result = <String>[];
-      var escaped = false;
-      for (var i = 0; i < line.length; i++) {
-        var c = line[i];
-        if (!escaped && c == '\\') {
-          escaped = true;
-          continue;
-        }
-        escaped = false;
-        if (c == '|') {
-          result.add(field.toString());
-          field = StringBuffer();
-          continue;
-        }
-        field.write(c);
-      }
-      result.add(field.toString());
-      return result;
-    }
-
-    var errors = <_StaticError>[];
-    for (var line in stderr.split("\n")) {
-      if (line.isEmpty) continue;
-
-      var fields = splitMachineError(line);
-
-      // Lines without enough fields are other output we don't care about.
-      if (fields.length >= 8) {
-        var error = _StaticError(fields[3],
-            line: int.parse(fields[4]),
-            column: int.parse(fields[5]),
-            length: int.parse(fields[6]),
-            code: "${fields[1]}.${fields[2]}",
-            message: fields[7]);
-
-        errors.add(error);
-      } else {
-        print(line);
-      }
-    }
-
-    return errors;
-  }
-
-  final String file;
-
-  /// The one-based line number of the beginning of the error's location.
-  final int line;
-
-  /// The one-based column number of the beginning of the error's location.
-  final int column;
-
-  /// The number of characters in the error location.
-  ///
-  /// This is optional. The CFE only reports error location, but not length.
-  final int length;
-
-  /// The expected analyzer error code for the error or `null` if this error
-  /// isn't expected to be reported by analyzer.
-  final String code;
-
-  /// The expected CFE error message or `null` if this error isn't expected to
-  /// be reported by the CFE.
-  final String message;
-
-  /// Creates a new StaticError at the given location with the given expected
-  /// error code and message.
-  ///
-  /// In order to make it easier to incrementally add error tests before a
-  /// feature is fully implemented or specified, an error expectation can be in
-  /// an "unspecified" state for either or both platforms by having the error
-  /// code or message be the special string "unspecified". When an unspecified
-  /// error is tested, a front end is expected to report *some* error on that
-  /// error's line, but it can be any location, error code, or message.
-  _StaticError(this.file,
-      {this.line, this.column, this.length, this.code, this.message}) {
-    // Must have a location.
-    assert(line != null);
-    assert(column != null);
-
-    // Must have at least one piece of description.
-    assert(code != null || message != null);
-  }
-
-  /// A textual description of this error's location.
-  String get location {
-    var result = "line $line, column $column";
-    if (length != null) result += ", length $length";
-    return result;
-  }
-
-  String toString() => "Error $code in $file at $location: $message";
-
-  String toStringWithoutPath() => "[$location] $code: $message";
-
-  /// Orders errors primarily by location, then by other fields if needed.
-  @override
-  int compareTo(_StaticError other) {
-    if (file != other.file) return file.compareTo(other.file);
-    if (line != other.line) return line.compareTo(other.line);
-    if (column != other.column) return column.compareTo(other.column);
-
-    // Sort no length after all other lengths.
-    if (length == null && other.length != null) return 1;
-    if (length != null && other.length == null) return -1;
-    if (length != other.length) return length.compareTo(other.length);
-
-    var thisCode = code ?? "";
-    var otherCode = other.code ?? "";
-    if (thisCode != otherCode) return thisCode.compareTo(otherCode);
-
-    var thisMessage = message ?? "";
-    var otherMessage = other.message ?? "";
-    return thisMessage.compareTo(otherMessage);
-  }
-
-  bool operator ==(dynamic other) =>
-      other is _StaticError &&
-      file == other.file &&
-      line == other.line &&
-      column == other.column &&
-      length == other.length &&
-      normalizeCode(code) == normalizeCode(other.code);
-
-  int get hashCode =>
-      line.hashCode ^
-      column.hashCode ^
-      length.hashCode ^
-      normalizeCode(code).hashCode;
-
-  String normalizeCode(String code) {
-    // Pre-NNBD has a limited form of implicit downcast checking for
-    // constructors.
-    if (code == "COMPILE_TIME_ERROR.INVALID_CAST_NEW_EXPR") {
-      return "STATIC_WARNING.ARGUMENT_TYPE_NOT_ASSIGNABLE";
-    }
-
-    return code;
-  }
-}
diff --git a/tools/migration/lib/src/io.dart b/tools/migration/lib/src/io.dart
deleted file mode 100644
index 26da687..0000000
--- a/tools/migration/lib/src/io.dart
+++ /dev/null
@@ -1,160 +0,0 @@
-// Copyright (c) 2017, 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:async';
-import 'dart:convert';
-import 'dart:io';
-
-import 'package:path/path.dart' as p;
-
-/// True if the file system should be left untouched.
-bool dryRun = false;
-
-final String sdkRoot =
-    p.normalize(p.join(p.dirname(p.fromUri(Platform.script)), '../../../'));
-
-final String testRoot = p.join(sdkRoot, "tests");
-
-/// Copies the file from [from] to [to], which are both assumed to be relative
-/// paths inside "tests".
-void copyFile(String from, String to) {
-  if (dryRun) {
-    print("Dry run: copy $from to $to");
-    return;
-  }
-
-  // Create the directory if needed.
-  new Directory(p.dirname(p.join(testRoot, to))).createSync(recursive: true);
-  new File(p.join(testRoot, from)).copySync(p.join(testRoot, to));
-}
-
-/// Moves the file from [from] to [to], which are both assumed to be relative
-/// paths inside "tests".
-void moveFile(String from, String to) {
-  if (dryRun) {
-    print("Dry run: move $from to $to");
-    return;
-  }
-
-  // Create the directory if needed.
-  new Directory(p.dirname(p.join(testRoot, to))).createSync(recursive: true);
-  new File(p.join(testRoot, from)).renameSync(p.join(testRoot, to));
-}
-
-/// Reads the contents of the file at [path], which is assumed to be relative
-/// within "tests".
-String readFile(String path) {
-  return new File(p.join(testRoot, path)).readAsStringSync();
-}
-
-/// Reads the contents of the file at [path], which is assumed to be relative
-/// within "tests".
-List<String> readFileLines(String path) {
-  return File(p.join(testRoot, path)).readAsLinesSync();
-}
-
-/// Reads the contents of the file at [path], which is assumed to be relative
-/// within "tests".
-List<int> readFileBytes(String path) {
-  return File(p.join(testRoot, path)).readAsBytesSync();
-}
-
-/// Writes [contents] to a file at [path], which is assumed to be relative
-/// within "tests".
-void writeFile(String path, String contents) {
-  if (dryRun) {
-    print("Dry run: write ${contents.length} characters to $path");
-    return;
-  }
-
-  final oldContents = File(p.join(testRoot, path)).readAsStringSync();
-  if (oldContents != contents) {
-    File(p.join(testRoot, path)).writeAsStringSync(contents);
-  }
-}
-
-/// Whether the contents of the files at [aPath] and [bPath] are identical.
-bool filesIdentical(String aPath, String bPath) {
-  var aBytes = File(p.join(testRoot, aPath)).readAsBytesSync();
-  var bBytes = File(p.join(testRoot, bPath)).readAsBytesSync();
-  if (aBytes.length != bBytes.length) return false;
-
-  for (var i = 0; i < aBytes.length; i++) {
-    if (aBytes[i] != bBytes[i]) return false;
-  }
-
-  return true;
-}
-
-/// Deletes the file at [path], which is assumed to be relative within "tests".
-void deleteFile(String path) {
-  if (dryRun) {
-    print("Dry run: delete $path");
-    return;
-  }
-
-  new File(p.join(testRoot, path)).deleteSync();
-}
-
-/// Whether the file at [path], which is assumed to be relative within "tests"
-/// exists on disc.
-bool fileExists(String path) {
-  return File(p.join(testRoot, path)).existsSync();
-}
-
-bool runProcess(String executable, List<String> arguments,
-    {String workingDirectory}) {
-  if (dryRun) {
-    print("Dry run: run $executable ${arguments.join(' ')}");
-    return true;
-  }
-
-  var result = Process.runSync(executable, arguments);
-  stdout.write(result.stdout);
-  stderr.write(result.stderr);
-  return result.exitCode == 0;
-}
-
-Future<List<String>> runProcessAsync(String executable, List<String> arguments,
-    {String workingDirectory}) async {
-  if (dryRun) {
-    print("Dry run: run $executable ${arguments.join(' ')}");
-    return [];
-  }
-
-  var process = await Process.start(executable, arguments);
-
-  // Print stdout as it comes in, but also gather up the lines.
-  var lines = <String>[];
-  var controller = StreamController<List<int>>();
-  controller.stream
-      .transform(utf8.decoder)
-      .transform(const LineSplitter())
-      .listen(lines.add);
-
-  process.stdout.listen((bytes) {
-    controller.add(bytes);
-    stdout.add(bytes);
-  });
-
-  process.stderr.listen(stderr.add);
-
-  await process.exitCode;
-  return lines;
-}
-
-/// Returns a list of the paths to all files within [dir], which is
-/// assumed to be relative to the SDK's "tests" directory and having file with
-/// an extension in [extensions].
-Iterable<String> listFiles(String dir,
-    {List<String> extensions = const [".dart", ".html"]}) {
-  var files = Directory(p.join(testRoot, dir))
-      .listSync(recursive: true)
-      .where((entry) => extensions.any(entry.path.endsWith))
-      .map((entry) => p.relative(entry.path, from: testRoot))
-      .toList();
-  files.sort();
-
-  return files;
-}
diff --git a/tools/migration/lib/src/log.dart b/tools/migration/lib/src/log.dart
deleted file mode 100644
index 103c9a4..0000000
--- a/tools/migration/lib/src/log.dart
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright (c) 2017, 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 _cyan = _getSpecial('\u001b[36m');
-final _green = _getSpecial('\u001b[32m');
-final _magenta = _getSpecial('\u001b[35m');
-final _red = _getSpecial('\u001b[31m');
-final _yellow = _getSpecial('\u001b[33m');
-final _blue = _getSpecial('\u001b[34m');
-final _gray = _getSpecial('\u001b[1;30m');
-final _none = _getSpecial('\u001b[0m');
-final _noColor = _getSpecial('\u001b[39m');
-final _bold = _getSpecial('\u001b[1m');
-
-void done(Object message) {
-  print("${green('(DONE)')} $message");
-}
-
-void note(Object message) {
-  print("${cyan('(NOTE)')} $message");
-}
-
-void todo(Object message) {
-  print("${red('(TODO)')} $message");
-}
-
-void warn(Object message) {
-  print("${yellow('(WARN)')} $message");
-}
-
-String bold(text) => "$_bold$text$_none";
-
-String cyan(text) => "$_cyan$text$_noColor";
-
-String green(text) => "$_green$text$_noColor";
-
-String red(text) => "$_red$text$_noColor";
-
-String yellow(text) => "$_yellow$text$_noColor";
-
-/// Gets a "special" string (ANSI escape or Unicode).
-///
-/// On Windows or when not printing to a terminal, returns something else since
-/// those aren't supported.
-String _getSpecial(String special, [String onWindows = '']) {
-  if (Platform.operatingSystem == 'windows' ||
-      stdioType(stdout) != StdioType.terminal) {
-    return onWindows;
-  }
-
-  return special;
-}
diff --git a/tools/migration/lib/src/test_directories.dart b/tools/migration/lib/src/test_directories.dart
deleted file mode 100644
index 804b831..0000000
--- a/tools/migration/lib/src/test_directories.dart
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright (c) 2017, 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.
-
-/// Manages the directories where tests can appear and the relationships
-/// between them.
-
-import 'package:path/path.dart' as p;
-
-const legacyRootDirs = const [
-  "corelib_2",
-  "language_2",
-  "lib_2",
-  "standalone_2"
-];
-
-/// Maps a legacy test directory to its resulting migrated NNBD test directory.
-String toNnbdDirectory(String legacyDir) {
-  if (!legacyDir.endsWith("_2")) {
-    throw ArgumentError.value(legacyDir, "legacyDir");
-  }
-
-  return legacyDir.replaceAll("_2", "");
-}
-
-/// Given a path within a legacy directory, returns the corresponding NNBD path.
-String toNnbdPath(String legacyPath) {
-  for (var dir in legacyRootDirs) {
-    if (legacyPath == dir) return toNnbdDirectory(dir);
-
-    if (p.isWithin(dir, legacyPath)) {
-      var relative = p.relative(legacyPath, from: dir);
-      return p.join(toNnbdDirectory(dir), relative);
-    }
-  }
-
-  throw new ArgumentError.value(legacyPath, "legacyPath");
-}
diff --git a/tools/migration/pubspec.yaml b/tools/migration/pubspec.yaml
deleted file mode 100644
index 2b5dab7..0000000
--- a/tools/migration/pubspec.yaml
+++ /dev/null
@@ -1,9 +0,0 @@
-name: migration
-#version: do-not-upload
-dependencies:
-  args:
-    path: ../../third_party/pkg/args
-  path:
-    path: ../../third_party/pkg/path
-  status_file:
-    path: ../../pkg/status_file
diff --git a/tools/opt_out_files.dart b/tools/opt_out_files.dart
new file mode 100644
index 0000000..6932604
--- /dev/null
+++ b/tools/opt_out_files.dart
@@ -0,0 +1,108 @@
+#!/usr/bin/env dart
+
+// Copyright (c) 2020, 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 commentLine = RegExp(r'^///?');
+final scriptLine = RegExp(r'^#\!');
+final languageMarker = RegExp(r"^\s*//\s*@dart\s*=");
+
+void main(List<String> args) {
+  if (args.length < 1) {
+    print('Mark files passed on the command line or under a directory');
+    print(' passed on the command line as opted out of null safety.  Does');
+    print(' not mark files under directories containing a pubspec.yaml file');
+    print(' unless the file is specified explicitly in the argument list.');
+    print(' Ignores files not ending in ".dart".');
+    print('Usage: opt_files_out.dart <files or directories>');
+    return;
+  }
+  for (var name in args) {
+    switch (FileSystemEntity.typeSync(name)) {
+      case FileSystemEntityType.directory:
+        markDirectory(Directory(name));
+        break;
+      case FileSystemEntityType.file:
+        markFile(File(name));
+        break;
+      default:
+        print("Ignoring unknown object $name");
+        break;
+    }
+  }
+}
+
+bool isPubSpec(FileSystemEntity entity) =>
+    entity is File && entity.path.endsWith("pubspec.yaml");
+
+void markEntity(FileSystemEntity entity) {
+  if (entity is File) {
+    markFile(entity);
+  } else if (entity is Directory) {
+    markDirectory(entity);
+  } else {
+    print("Ignoring unknown object ${entity.path}");
+  }
+}
+
+void markDirectory(Directory dir) {
+  var children = dir.listSync();
+  if (children.any(isPubSpec)) {
+    print("Skipping files under ${dir.path}");
+    return;
+  }
+  for (var child in children) {
+    markEntity(child);
+  }
+}
+
+void markFile(File file) {
+  if (!file.path.endsWith(".dart")) {
+    return;
+  }
+
+  List<String> lines;
+  try {
+    lines = file.readAsLinesSync();
+  } catch (e) {
+    print("Failed to read file ${file.path}: $e");
+    return;
+  }
+  if (lines.any((line) => line.startsWith(languageMarker))) {
+    print("Skipping already marked file ${file.path}");
+    return;
+  }
+  var marked = markContents(lines);
+  try {
+    file.writeAsStringSync(marked);
+  } catch (e) {
+    print("Failed to write file ${file.path}: $e");
+    return;
+  }
+  print("Marked ${file.path}");
+}
+
+String markContents(List<String> lines) {
+  var buffer = StringBuffer();
+  var marked = false;
+
+  for (var line in lines) {
+    // If the file has not yet been marked, and we have reached the
+    // first non-comment line, insert an opt out marker.
+    if (!marked &&
+        (!commentLine.hasMatch(line)) &&
+        (!scriptLine.hasMatch(line))) {
+      buffer.write('\n// @dart = 2.9\n');
+      marked = true;
+    }
+    buffer.write('$line\n');
+  }
+
+  // In case of empty file, or file of all comments (who does that!?).
+  if (!marked) {
+    buffer.write('\n// @dart = 2.9\n');
+  }
+  return buffer.toString();
+}
diff --git a/tools/patches/flutter-engine/a3815b659047cfc6b63d41d180aa1ca1b781ee68.patch b/tools/patches/flutter-engine/a3815b659047cfc6b63d41d180aa1ca1b781ee68.patch
deleted file mode 100644
index 94120c0..0000000
--- a/tools/patches/flutter-engine/a3815b659047cfc6b63d41d180aa1ca1b781ee68.patch
+++ /dev/null
@@ -1,596 +0,0 @@
-diff --git a/DEPS b/DEPS
-index 01113f340..e55da1cff 100644
---- a/DEPS
-+++ b/DEPS
-@@ -34,14 +34,14 @@ vars = {
-   # Dart is: https://github.com/dart-lang/sdk/blob/master/DEPS.
-   # You can use //tools/dart/create_updated_flutter_deps.py to produce
-   # updated revision list of existing dependencies.
-   'dart_revision': 'a3815b659047cfc6b63d41d180aa1ca1b781ee68',
- 
-   # WARNING: DO NOT EDIT MANUALLY
-   # The lines between blank lines above and below are generated by a script. See create_updated_flutter_deps.py
-   'dart_args_tag': '1.6.0',
-   'dart_boringssl_gen_rev': '429ccb1877f7987a6f3988228bc2440e61293499',
-   'dart_boringssl_rev': '4dfd5af70191b068aebe567b8e29ce108cee85ce',
--  'dart_collection_rev': '80f5b6de8a8d8d584732a71bb59912da3e44883b',
-+  'dart_collection_rev': '583693680fc067e34ca5b72503df25e8b80579f9',
-   'dart_dart2js_info_tag': '0.6.0',
-   'dart_dart_style_tag': '1.3.6',
-   'dart_http_retry_tag': '0.1.1',
-@@ -49,7 +49,6 @@ vars = {
-   'dart_intl_tag': '0.16.1',
-   'dart_linter_tag': '0.1.117',
-   'dart_oauth2_tag': '1.6.0',
--  'dart_pedantic_tag': 'v1.9.0',
-   'dart_protobuf_rev': '3746c8fd3f2b0147623a8e3db89c3ff4330de760',
-   'dart_pub_rev': '04b054b62cc437cf23451785fdc50e49cd9de139',
-   'dart_pub_semver_tag': 'v1.4.4',
-@@ -61,15 +60,13 @@ vars = {
-   'dart_shelf_static_rev': 'v0.2.8',
-   'dart_shelf_tag': '0.7.3+3',
-   'dart_shelf_web_socket_tag': '0.2.2+3',
--  'dart_source_map_stack_trace_tag': '2.0.0',
--  'dart_source_span_tag': '1.7.0',
-   'dart_sse_tag': 'e5cf68975e8e87171a3dc297577aa073454a91dc',
--  'dart_stack_trace_tag': '56811dbb2530d823b764fe167ec335879a4adb32',
-+  'dart_stack_trace_tag': 'd3813ca0a77348e0faf0d6af0cc17913e36afa39',
-   'dart_stagehand_tag': 'v3.3.9',
--  'dart_stream_channel_tag': '70433d577be02c48cb16d72d65654f3b4d82c6ed',
-+  'dart_stream_channel_tag': 'c446774fd077c9bdbd6235a7aadc661ef60a9727',
-   'dart_test_reflective_loader_tag': '0.1.9',
-   'dart_tflite_native_rev': '3c777c40608a2a9f1427bfe0028ab48e7116b4c1',
--  'dart_typed_data_tag': '0c369b73a9b7ebf042c06512951bfe5b52b84a5f',
-+  'dart_typed_data_tag': 'f94fc57b8e8c0e4fe4ff6cfd8290b94af52d3719',
-   'dart_usage_tag': '3.4.0',
-   'dart_watcher_rev': 'fc3c9aae5d31d707b3013b42634dde8d8a1161b4',
- 
-@@ -171,13 +168,13 @@ deps = {
-    Var('dart_git') + '/args.git' + '@' + Var('dart_args_tag'),
- 
-   'src/third_party/dart/third_party/pkg/async':
--   Var('dart_git') + '/async.git@6b90f4557f330e1ead021f501ee7f1d8b0e77815',
-+   Var('dart_git') + '/async.git@128c461a97dbdbd9336ba000ba5a5c02e79b8651',
- 
-   'src/third_party/dart/third_party/pkg/bazel_worker':
-    Var('dart_git') + '/bazel_worker.git@26680d5e249b249c7216ab2fed0ac8ed4ee285c5',
- 
-   'src/third_party/dart/third_party/pkg/boolean_selector':
--   Var('dart_git') + '/boolean_selector.git@1309eabed510cc3b7536fd4367d39b97ebee3d69',
-+   Var('dart_git') + '/boolean_selector.git@665e6921ab246569420376f827bff4585dff0b14',
- 
-   'src/third_party/dart/third_party/pkg/charcode':
-    Var('dart_git') + '/charcode.git@af1e2d59a9c383da94f99ea51dac4b93fb0626c4',
-@@ -207,7 +204,7 @@ deps = {
-    Var('dart_git') + '/ffi.git@454ab0f9ea6bd06942a983238d8a6818b1357edb',
- 
-   'src/third_party/dart/third_party/pkg/fixnum':
--   Var('dart_git') + '/fixnum.git@9b38f49f6679654d66a363e69e48173cca07e882',
-+   Var('dart_git') + '/fixnum.git@300c3f025e94a72b7b6770e15f76a4de15f77668',
- 
-   'src/third_party/dart/third_party/pkg/glob':
-    Var('dart_git') + '/glob.git@e9f4e6b7ae8abe5071461cf8f47191bb19cf7ef6',
-@@ -246,7 +243,7 @@ deps = {
-    Var('dart_git') + '/markdown.git@dd150bb64c5f3b41d31f20f399ae2a855f7f8c00',
- 
-   'src/third_party/dart/third_party/pkg/matcher':
--   Var('dart_git') + '/matcher.git@8f8d965933c94a489b1a39e20d558a32841bfa5b',
-+   Var('dart_git') + '/matcher.git@9cae8faa7868bf3a88a7ba45eb0bd128e66ac515',
- 
-   'src/third_party/dart/third_party/pkg/mime':
-    Var('dart_git') + '/mime.git@179b5e6a88f4b63f36dc1b8fcbc1e83e5e0cd3a7',
-@@ -261,13 +258,13 @@ deps = {
-    Var('dart_git') + '/oauth2.git' + '@' + Var('dart_oauth2_tag'),
- 
-   'src/third_party/dart/third_party/pkg/path':
--   Var('dart_git') + '/path.git@4f3bb71843fe5493ba490828a1721821d7b33746',
-+   Var('dart_git') + '/path.git@62ecd5a78ffe5734d14ed0df76d20309084cd04a',
- 
-   'src/third_party/dart/third_party/pkg/pedantic':
--   Var('dart_git') + '/pedantic.git' + '@' + Var('dart_pedantic_tag'),
-+   Var('dart_git') + '/pedantic.git@24b38df72430d7e21cb4257828580becb9a39c72',
- 
-   'src/third_party/dart/third_party/pkg/pool':
--   Var('dart_git') + '/pool.git@86fbb2cde9bbc66c8d159909d2f65a5981ea5b50',
-+   Var('dart_git') + '/pool.git@eedbd5fde84f9a1a8da643b475305a81841da599',
- 
-   'src/third_party/dart/third_party/pkg/protobuf':
-    Var('dart_git') + '/protobuf.git' + '@' + Var('dart_protobuf_rev'),
-@@ -300,13 +297,13 @@ deps = {
-    Var('dart_git') + '/shelf_web_socket.git' + '@' + Var('dart_shelf_web_socket_tag'),
- 
-   'src/third_party/dart/third_party/pkg/source_map_stack_trace':
--   Var('dart_git') + '/source_map_stack_trace.git' + '@' + Var('dart_source_map_stack_trace_tag'),
-+   Var('dart_git') + '/source_map_stack_trace.git@1c3026f69d9771acf2f8c176a1ab750463309cce',
- 
-   'src/third_party/dart/third_party/pkg/source_maps':
--   Var('dart_git') + '/source_maps.git@87b4fd9027378bbd51b02e9d7df794eee8a82b7a',
-+   Var('dart_git') + '/source_maps.git@53eb92ccfe6e64924054f83038a534b959b12b3e',
- 
-   'src/third_party/dart/third_party/pkg/source_span':
--   Var('dart_git') + '/source_span.git' + '@' + Var('dart_source_span_tag'),
-+   Var('dart_git') + '/source_span.git@94833d6cbf4552ebe5d2aa6714acecd93834e53a',
- 
-   'src/third_party/dart/third_party/pkg/sse':
-    Var('dart_git') + '/sse.git' + '@' + Var('dart_sse_tag'),
-@@ -321,13 +318,13 @@ deps = {
-    Var('dart_git') + '/stream_channel.git' + '@' + Var('dart_stream_channel_tag'),
- 
-   'src/third_party/dart/third_party/pkg/string_scanner':
--   Var('dart_git') + '/string_scanner.git@a918e7371af6b6e73bfd534ff9da6084741c1f99',
-+   Var('dart_git') + '/string_scanner.git@1b63e6e5db5933d7be0a45da6e1129fe00262734',
- 
-   'src/third_party/dart/third_party/pkg/term_glyph':
--   Var('dart_git') + '/term_glyph.git@b3da31e9684a99cfe5f192b89914492018b44da7',
-+   Var('dart_git') + '/term_glyph.git@6a0f9b6fb645ba75e7a00a4e20072678327a0347',
- 
-   'src/third_party/dart/third_party/pkg/test':
--   Var('dart_git') + '/test.git@718fe6f93c4655208460f28e89d887c5ef4144c5',
-+   Var('dart_git') + '/test.git@c6b3fe63eda87da1687580071cad1eefd575f851',
- 
-   'src/third_party/dart/third_party/pkg/test_reflective_loader':
-    Var('dart_git') + '/test_reflective_loader.git' + '@' + Var('dart_test_reflective_loader_tag'),
-@@ -357,7 +354,7 @@ deps = {
-    Var('dart_git') + '/package_config.git@9c586d04bd26fef01215fd10e7ab96a3050cfa64',
- 
-   'src/third_party/dart/tools/sdks':
--   {'packages': [{'version': 'version:2.9.0-21.0.dev', 'package': 'dart/dart-sdk/${{platform}}'}], 'dep_type': 'cipd'},
-+   {'packages': [{'version': 'version:2.10.0-0.2-preview', 'package': 'dart/dart-sdk/${{platform}}'}], 'dep_type': 'cipd'},
- 
-   # WARNING: end of dart dependencies list that is cleaned up automatically - see create_updated_flutter_deps.py.
- 
-diff --git a/lib/ui/annotations.dart b/lib/ui/annotations.dart
-index 45d8ca6cc..b300af073 100644
---- a/lib/ui/annotations.dart
-+++ b/lib/ui/annotations.dart
-@@ -4,7 +4,7 @@
- 
- // TODO(dnfield): Remove unused_import ignores when https://github.com/dart-lang/sdk/issues/35164 is resolved.
- 
--// @dart = 2.9
-+// @dart = 2.10
- 
- part of dart.ui;
- 
-diff --git a/lib/ui/channel_buffers.dart b/lib/ui/channel_buffers.dart
-index cb32c4581..39d31d271 100644
---- a/lib/ui/channel_buffers.dart
-+++ b/lib/ui/channel_buffers.dart
-@@ -2,7 +2,7 @@
- // Use of this source code is governed by a BSD-style license that can be
- // found in the LICENSE file.
- 
--// @dart = 2.9
-+// @dart = 2.10
- 
- part of dart.ui;
- 
-diff --git a/lib/ui/compositing.dart b/lib/ui/compositing.dart
-index ea3c0b714..4e0553936 100644
---- a/lib/ui/compositing.dart
-+++ b/lib/ui/compositing.dart
-@@ -2,7 +2,7 @@
- // Use of this source code is governed by a BSD-style license that can be
- // found in the LICENSE file.
- 
--// @dart = 2.9
-+// @dart = 2.10
- 
- part of dart.ui;
- 
-diff --git a/lib/ui/geometry.dart b/lib/ui/geometry.dart
-index 2739048e7..a7404996c 100644
---- a/lib/ui/geometry.dart
-+++ b/lib/ui/geometry.dart
-@@ -2,7 +2,7 @@
- // Use of this source code is governed by a BSD-style license that can be
- // found in the LICENSE file.
- 
--// @dart = 2.9
-+// @dart = 2.10
- 
- part of dart.ui;
- 
-diff --git a/lib/ui/hash_codes.dart b/lib/ui/hash_codes.dart
-index a6ede7849..7da175a27 100644
---- a/lib/ui/hash_codes.dart
-+++ b/lib/ui/hash_codes.dart
-@@ -2,7 +2,7 @@
- // Use of this source code is governed by a BSD-style license that can be
- // found in the LICENSE file.
- 
--// @dart = 2.9
-+// @dart = 2.10
- 
- part of dart.ui;
- 
-diff --git a/lib/ui/hooks.dart b/lib/ui/hooks.dart
-index ff2dcaa12..39bab1240 100644
---- a/lib/ui/hooks.dart
-+++ b/lib/ui/hooks.dart
-@@ -4,7 +4,7 @@
- 
- // TODO(dnfield): Remove unused_import ignores when https://github.com/dart-lang/sdk/issues/35164 is resolved.
- 
--// @dart = 2.9
-+// @dart = 2.10
- 
- part of dart.ui;
- 
-diff --git a/lib/ui/isolate_name_server.dart b/lib/ui/isolate_name_server.dart
-index d976e0ac2..4b5c2c84d 100644
---- a/lib/ui/isolate_name_server.dart
-+++ b/lib/ui/isolate_name_server.dart
-@@ -2,7 +2,7 @@
- // Use of this source code is governed by a BSD-style license that can be
- // found in the LICENSE file.
- 
--// @dart = 2.9
-+// @dart = 2.10
- 
- part of dart.ui;
- 
-diff --git a/lib/ui/lerp.dart b/lib/ui/lerp.dart
-index db9f7b2ec..0bb0a08b7 100644
---- a/lib/ui/lerp.dart
-+++ b/lib/ui/lerp.dart
-@@ -2,7 +2,7 @@
- // Use of this source code is governed by a BSD-style license that can be
- // found in the LICENSE file.
- 
--// @dart = 2.9
-+// @dart = 2.10
- 
- part of dart.ui;
- 
-diff --git a/lib/ui/natives.dart b/lib/ui/natives.dart
-index ce29fe15c..0f2939592 100644
---- a/lib/ui/natives.dart
-+++ b/lib/ui/natives.dart
-@@ -4,7 +4,7 @@
- 
- // TODO(dnfield): remove unused_element ignores when https://github.com/dart-lang/sdk/issues/35164 is resolved.
- 
--// @dart = 2.9
-+// @dart = 2.10
- 
- part of dart.ui;
- 
-diff --git a/lib/ui/painting.dart b/lib/ui/painting.dart
-index 992db71cf..2599f90e2 100644
---- a/lib/ui/painting.dart
-+++ b/lib/ui/painting.dart
-@@ -2,7 +2,7 @@
- // Use of this source code is governed by a BSD-style license that can be
- // found in the LICENSE file.
- 
--// @dart = 2.9
-+// @dart = 2.10
- 
- part of dart.ui;
- 
-diff --git a/lib/ui/plugins.dart b/lib/ui/plugins.dart
-index 64eca6e04..9622852fd 100644
---- a/lib/ui/plugins.dart
-+++ b/lib/ui/plugins.dart
-@@ -2,7 +2,7 @@
- // Use of this source code is governed by a BSD-style license that can be
- // found in the LICENSE file.
- 
--// @dart = 2.9
-+// @dart = 2.10
- 
- part of dart.ui;
- 
-diff --git a/lib/ui/pointer.dart b/lib/ui/pointer.dart
-index 3c12cb971..3c8ffefaf 100644
---- a/lib/ui/pointer.dart
-+++ b/lib/ui/pointer.dart
-@@ -2,7 +2,7 @@
- // Use of this source code is governed by a BSD-style license that can be
- // found in the LICENSE file.
- 
--// @dart = 2.9
-+// @dart = 2.10
- 
- part of dart.ui;
- 
-diff --git a/lib/ui/semantics.dart b/lib/ui/semantics.dart
-index bee542328..518a69412 100644
---- a/lib/ui/semantics.dart
-+++ b/lib/ui/semantics.dart
-@@ -2,7 +2,7 @@
- // Use of this source code is governed by a BSD-style license that can be
- // found in the LICENSE file.
- 
--// @dart = 2.9
-+// @dart = 2.10
- 
- part of dart.ui;
- 
-diff --git a/lib/ui/text.dart b/lib/ui/text.dart
-index 8bdc0f05d..c246731d8 100644
---- a/lib/ui/text.dart
-+++ b/lib/ui/text.dart
-@@ -2,7 +2,7 @@
- // Use of this source code is governed by a BSD-style license that can be
- // found in the LICENSE file.
- 
--// @dart = 2.9
-+// @dart = 2.10
- 
- part of dart.ui;
- 
-diff --git a/lib/ui/ui.dart b/lib/ui/ui.dart
-index 7612cf509..fe0e4fa16 100644
---- a/lib/ui/ui.dart
-+++ b/lib/ui/ui.dart
-@@ -9,7 +9,7 @@
- /// This library exposes the lowest-level services that Flutter frameworks use
- /// to bootstrap applications, such as classes for driving the input, graphics
- /// text, layout, and rendering subsystems.
--// @dart = 2.9
-+// @dart = 2.10
- library dart.ui;
- 
- import 'dart:_internal' hide Symbol; // ignore: unused_import
-diff --git a/lib/ui/window.dart b/lib/ui/window.dart
-index 815bee5a1..22f9ed0c3 100644
---- a/lib/ui/window.dart
-+++ b/lib/ui/window.dart
-@@ -2,7 +2,7 @@
- // Use of this source code is governed by a BSD-style license that can be
- // found in the LICENSE file.
- 
--// @dart = 2.9
-+// @dart = 2.10
- part of dart.ui;
- 
- /// Signature of callbacks that have no arguments and return no data.
-diff --git a/lib/web_ui/lib/src/ui/annotations.dart b/lib/web_ui/lib/src/ui/annotations.dart
-index 977ca70ca..7dac0c567 100644
---- a/lib/web_ui/lib/src/ui/annotations.dart
-+++ b/lib/web_ui/lib/src/ui/annotations.dart
-@@ -4,7 +4,7 @@
- 
- // TODO(dnfield): Remove unused_import ignores when https://github.com/dart-lang/sdk/issues/35164 is resolved.
- 
--// @dart = 2.9
-+// @dart = 2.10
- part of ui;
- 
- // TODO(dnfield): Update this if/when we default this to on in the tool,
-diff --git a/lib/web_ui/lib/src/ui/canvas.dart b/lib/web_ui/lib/src/ui/canvas.dart
-index 1061ab718..ee185ef29 100644
---- a/lib/web_ui/lib/src/ui/canvas.dart
-+++ b/lib/web_ui/lib/src/ui/canvas.dart
-@@ -2,7 +2,7 @@
- // Use of this source code is governed by a BSD-style license that can be
- // found in the LICENSE file.
- 
--// @dart = 2.9
-+// @dart = 2.10
- part of ui;
- 
- /// Defines how a list of points is interpreted when drawing a set of points.
-diff --git a/lib/web_ui/lib/src/ui/channel_buffers.dart b/lib/web_ui/lib/src/ui/channel_buffers.dart
-index 5d3db5da5..6ce0bc962 100644
---- a/lib/web_ui/lib/src/ui/channel_buffers.dart
-+++ b/lib/web_ui/lib/src/ui/channel_buffers.dart
-@@ -2,7 +2,7 @@
- // Use of this source code is governed by a BSD-style license that can be
- // found in the LICENSE file.
- 
--// @dart = 2.9
-+// @dart = 2.10
- part of ui;
- 
- /// A saved platform message for a channel with its callback.
-diff --git a/lib/web_ui/lib/src/ui/compositing.dart b/lib/web_ui/lib/src/ui/compositing.dart
-index 635dd7261..11a0e1199 100644
---- a/lib/web_ui/lib/src/ui/compositing.dart
-+++ b/lib/web_ui/lib/src/ui/compositing.dart
-@@ -2,7 +2,7 @@
- // Use of this source code is governed by a BSD-style license that can be
- // found in the LICENSE file.
- 
--// @dart = 2.9
-+// @dart = 2.10
- part of ui;
- 
- /// An opaque object representing a composited scene.
-diff --git a/lib/web_ui/lib/src/ui/geometry.dart b/lib/web_ui/lib/src/ui/geometry.dart
-index 904cec065..c528c8c73 100644
---- a/lib/web_ui/lib/src/ui/geometry.dart
-+++ b/lib/web_ui/lib/src/ui/geometry.dart
-@@ -2,7 +2,7 @@
- // Use of this source code is governed by a BSD-style license that can be
- // found in the LICENSE file.
- 
--// @dart = 2.9
-+// @dart = 2.10
- part of ui;
- 
- /// Base class for [Size] and [Offset], which are both ways to describe
-diff --git a/lib/web_ui/lib/src/ui/hash_codes.dart b/lib/web_ui/lib/src/ui/hash_codes.dart
-index 69aeb33bb..e91fb1cc5 100644
---- a/lib/web_ui/lib/src/ui/hash_codes.dart
-+++ b/lib/web_ui/lib/src/ui/hash_codes.dart
-@@ -2,7 +2,7 @@
- // Use of this source code is governed by a BSD-style license that can be
- // found in the LICENSE file.
- 
--// @dart = 2.9
-+// @dart = 2.10
- part of ui;
- 
- class _HashEnd { const _HashEnd(); }
-diff --git a/lib/web_ui/lib/src/ui/initialization.dart b/lib/web_ui/lib/src/ui/initialization.dart
-index 2749fa9e5..6865da812 100644
---- a/lib/web_ui/lib/src/ui/initialization.dart
-+++ b/lib/web_ui/lib/src/ui/initialization.dart
-@@ -2,7 +2,7 @@
- // Use of this source code is governed by a BSD-style license that can be
- // found in the LICENSE file.
- 
--// @dart = 2.9
-+// @dart = 2.10
- part of ui;
- 
- /// Initializes the platform.
-diff --git a/lib/web_ui/lib/src/ui/lerp.dart b/lib/web_ui/lib/src/ui/lerp.dart
-index bcc278f8a..5cd4c8ac1 100644
---- a/lib/web_ui/lib/src/ui/lerp.dart
-+++ b/lib/web_ui/lib/src/ui/lerp.dart
-@@ -2,7 +2,7 @@
- // Use of this source code is governed by a BSD-style license that can be
- // found in the LICENSE file.
- 
--// @dart = 2.9
-+// @dart = 2.10
- part of ui;
- 
- /// Linearly interpolate between two numbers.
-diff --git a/lib/web_ui/lib/src/ui/natives.dart b/lib/web_ui/lib/src/ui/natives.dart
-index e4bf1a2f5..4763db34e 100644
---- a/lib/web_ui/lib/src/ui/natives.dart
-+++ b/lib/web_ui/lib/src/ui/natives.dart
-@@ -2,7 +2,7 @@
- // Use of this source code is governed by a BSD-style license that can be
- // found in the LICENSE file.
- 
--// @dart = 2.9
-+// @dart = 2.10
- part of ui;
- 
- // Corelib 'print' implementation.
-diff --git a/lib/web_ui/lib/src/ui/painting.dart b/lib/web_ui/lib/src/ui/painting.dart
-index a9bd10662..67da1842f 100644
---- a/lib/web_ui/lib/src/ui/painting.dart
-+++ b/lib/web_ui/lib/src/ui/painting.dart
-@@ -2,7 +2,7 @@
- // Use of this source code is governed by a BSD-style license that can be
- // found in the LICENSE file.
- 
--// @dart = 2.9
-+// @dart = 2.10
- part of ui;
- 
- // ignore: unused_element, Used in Shader assert.
-diff --git a/lib/web_ui/lib/src/ui/path.dart b/lib/web_ui/lib/src/ui/path.dart
-index 18e351f53..1514d2432 100644
---- a/lib/web_ui/lib/src/ui/path.dart
-+++ b/lib/web_ui/lib/src/ui/path.dart
-@@ -2,7 +2,7 @@
- // Use of this source code is governed by a BSD-style license that can be
- // found in the LICENSE file.
- 
--// @dart = 2.9
-+// @dart = 2.10
- part of ui;
- 
- /// A complex, one-dimensional subset of a plane.
-diff --git a/lib/web_ui/lib/src/ui/path_metrics.dart b/lib/web_ui/lib/src/ui/path_metrics.dart
-index 6d54888c2..b65e2b928 100644
---- a/lib/web_ui/lib/src/ui/path_metrics.dart
-+++ b/lib/web_ui/lib/src/ui/path_metrics.dart
-@@ -2,7 +2,7 @@
- // Use of this source code is governed by a BSD-style license that can be
- // found in the LICENSE file.
- 
--// @dart = 2.9
-+// @dart = 2.10
- part of ui;
- 
- /// An iterable collection of [PathMetric] objects describing a [Path].
-diff --git a/lib/web_ui/lib/src/ui/pointer.dart b/lib/web_ui/lib/src/ui/pointer.dart
-index 698badcc4..e2f351caf 100644
---- a/lib/web_ui/lib/src/ui/pointer.dart
-+++ b/lib/web_ui/lib/src/ui/pointer.dart
-@@ -2,7 +2,7 @@
- // Use of this source code is governed by a BSD-style license that can be
- // found in the LICENSE file.
- 
--// @dart = 2.9
-+// @dart = 2.10
- part of ui;
- 
- /// How the pointer has changed since the last report.
-diff --git a/lib/web_ui/lib/src/ui/semantics.dart b/lib/web_ui/lib/src/ui/semantics.dart
-index c6dffe2fc..a0fde9a5b 100644
---- a/lib/web_ui/lib/src/ui/semantics.dart
-+++ b/lib/web_ui/lib/src/ui/semantics.dart
-@@ -2,7 +2,7 @@
- // Use of this source code is governed by a BSD-style license that can be
- // found in the LICENSE file.
- 
--// @dart = 2.9
-+// @dart = 2.10
- part of ui;
- 
- /// The possible actions that can be conveyed from the operating system
-diff --git a/lib/web_ui/lib/src/ui/test_embedding.dart b/lib/web_ui/lib/src/ui/test_embedding.dart
-index f72a5c75e..955dbfe53 100644
---- a/lib/web_ui/lib/src/ui/test_embedding.dart
-+++ b/lib/web_ui/lib/src/ui/test_embedding.dart
-@@ -4,7 +4,7 @@
- 
- // TODO(flutter_web): the Web-only API below need to be cleaned up.
- 
--// @dart = 2.9
-+// @dart = 2.10
- part of ui;
- 
- /// Used to track when the platform is initialized. This ensures the test fonts
-diff --git a/lib/web_ui/lib/src/ui/text.dart b/lib/web_ui/lib/src/ui/text.dart
-index ec9a45943..58698d862 100644
---- a/lib/web_ui/lib/src/ui/text.dart
-+++ b/lib/web_ui/lib/src/ui/text.dart
-@@ -3,7 +3,7 @@
- // found in the LICENSE file.
- // Synced 2019-05-30T14:20:57.833907.
- 
--// @dart = 2.9
-+// @dart = 2.10
- part of ui;
- 
- /// Whether to slant the glyphs in the font
-diff --git a/lib/web_ui/lib/src/ui/tile_mode.dart b/lib/web_ui/lib/src/ui/tile_mode.dart
-index 8fd24ae58..9ce9ddf3c 100644
---- a/lib/web_ui/lib/src/ui/tile_mode.dart
-+++ b/lib/web_ui/lib/src/ui/tile_mode.dart
-@@ -2,7 +2,7 @@
- // Use of this source code is governed by a BSD-style license that can be
- // found in the LICENSE file.
- 
--// @dart = 2.9
-+// @dart = 2.10
- part of ui;
- 
- /// Defines what happens at the edge of the gradient.
-diff --git a/lib/web_ui/lib/src/ui/window.dart b/lib/web_ui/lib/src/ui/window.dart
-index 557e6aa84..fd9e66740 100644
---- a/lib/web_ui/lib/src/ui/window.dart
-+++ b/lib/web_ui/lib/src/ui/window.dart
-@@ -3,7 +3,7 @@
- // found in the LICENSE file.
- // Synced 2019-05-30T14:20:57.841444.
- 
--// @dart = 2.9
-+// @dart = 2.10
- part of ui;
- 
- /// Signature of callbacks that have no arguments and return no data.
-diff --git a/lib/web_ui/lib/ui.dart b/lib/web_ui/lib/ui.dart
-index 49217e14a..13d5ee281 100644
---- a/lib/web_ui/lib/ui.dart
-+++ b/lib/web_ui/lib/ui.dart
-@@ -5,7 +5,7 @@
- /// This library defines the web equivalent of the native dart:ui.
- ///
- /// All types in this library are public.
--// @dart = 2.9
-+// @dart = 2.10
- library ui;
- 
- import 'dart:async';
diff --git a/tools/spec_parser/Dart.g b/tools/spec_parser/Dart.g
index 08a433e..ad410ba 100644
--- a/tools/spec_parser/Dart.g
+++ b/tools/spec_parser/Dart.g
@@ -256,7 +256,7 @@
 
 // NB: It is an anomaly that VAR can be a return type (`var this.x()`).
 fieldFormalParameter
-    :    finalConstVarOrType? THIS '.' identifier formalParameterPart?
+    :    finalConstVarOrType? THIS '.' identifier (formalParameterPart '?'?)?
     ;
 
 defaultFormalParameter
@@ -414,18 +414,23 @@
     ;
 
 initializers
-    :    ':' superCallOrFieldInitializer (',' superCallOrFieldInitializer)*
+    :    ':' initializerListEntry (',' initializerListEntry)*
     ;
 
-superCallOrFieldInitializer
+initializerListEntry
     :    SUPER arguments
     |    SUPER '.' identifier arguments
     |    fieldInitializer
-    |    assertClause
+    |    assertion
     ;
 
 fieldInitializer
-    :    (THIS '.')? identifier '=' conditionalExpression cascadeSequence?
+    :    (THIS '.')? identifier '=' initializerExpression
+    ;
+
+initializerExpression
+    :    conditionalExpression
+    |    cascade
     ;
 
 factoryConstructorSignature
@@ -467,14 +472,15 @@
 
 metadatum
     :    constructorDesignation arguments
-    |    qualified
+    |    qualifiedName
     ;
 
 expression
     :    functionExpression
     |    throwExpression
     |    assignableExpression assignmentOperator expression
-    |    conditionalExpression cascadeSequence?
+    |    conditionalExpression
+    |    cascade
     ;
 
 expressionWithoutCascade
@@ -551,7 +557,7 @@
 
 element
     : expressionElement
-    | mapEntry
+    | mapElement
     | spreadElement
     | ifElement
     | forElement
@@ -561,7 +567,7 @@
     : expression
     ;
 
-mapEntry
+mapElement
     : expression ':' expression
     ;
 
@@ -648,14 +654,20 @@
     :    label expression
     ;
 
-cascadeSequence
-    :     ('?..' | '..') cascadeSection ('..' cascadeSection)*
+cascade
+    :     cascade '..' cascadeSection
+    |     conditionalExpression ('?..' | '..') cascadeSection
     ;
 
 cascadeSection
     :    cascadeSelector cascadeSectionTail
     ;
 
+cascadeSelector
+    :    '[' expression ']'
+    |    identifier
+    ;
+
 cascadeSectionTail
     :    cascadeAssignment
     |    selector* (assignableSelector cascadeAssignment)?
@@ -665,11 +677,6 @@
     :    assignmentOperator expressionWithoutCascade
     ;
 
-cascadeSelector
-    :    '[' expression ']'
-    |    identifier
-    ;
-
 assignmentOperator
     :    '='
     |    compoundAssignmentOperator
@@ -831,7 +838,7 @@
     ;
 
 argumentPart
-    :    '?'? typeArguments? arguments
+    :    typeArguments? arguments
     ;
 
 incrementOperator
@@ -897,7 +904,7 @@
     |    FUNCTION // Built-in identifier that can be used as a type.
     ;
 
-qualified
+qualifiedName
     :    typeIdentifier
     |    typeIdentifier '.' identifier
     |    typeIdentifier '.' typeIdentifier '.' identifier
@@ -982,7 +989,7 @@
     ;
 
 ifStatement
-    :    IF '(' expression ')' statement (ELSE statement | ())
+    :    IF '(' expression ')' statement (ELSE statement)?
     ;
 
 forStatement
@@ -1073,10 +1080,10 @@
     ;
 
 assertStatement
-    :    assertClause ';'
+    :    assertion ';'
     ;
 
-assertClause
+assertion
     :    ASSERT '(' expression (',' expression)? ','? ')'
     ;
 
@@ -1098,8 +1105,7 @@
     ;
 
 importSpecification
-    :    IMPORT configurableUri (AS identifier)? combinator* ';'
-    |    IMPORT configurableUri DEFERRED AS identifier combinator* ';'
+    :    IMPORT configurableUri (DEFERRED? AS identifier)? combinator* ';'
     ;
 
 combinator
@@ -1247,7 +1253,7 @@
     ;
 
 constructorDesignation
-    :    qualified
+    :    qualifiedName
     |    typeName typeArguments ('.' identifier)?
     ;
 
diff --git a/tools/test.dart b/tools/test.dart
index 000a4ccc5..fece115 100755
--- a/tools/test.dart
+++ b/tools/test.dart
@@ -1,8 +1,10 @@
 #!/usr/bin/env dart
-
 // Copyright (c) 2018, 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.
+
+// @dart = 2.9
+
 import 'package:test_runner/test_runner.dart';
 
 void main(List<String> args) {
diff --git a/tools/test.py b/tools/test.py
index a60a095..b106500 100755
--- a/tools/test.py
+++ b/tools/test.py
@@ -14,6 +14,11 @@
 def Main():
     args = sys.argv[1:]
 
+    cleanup_dart = False
+    if '--cleanup-dart-processes' in args:
+        args.remove('--cleanup-dart-processes')
+        cleanup_dart = True
+
     tools_dir = os.path.dirname(os.path.realpath(__file__))
     repo_dir = os.path.dirname(tools_dir)
     dart_test_script = os.path.join(repo_dir, 'pkg', 'test_runner', 'bin',
@@ -33,6 +38,14 @@
         with utils.CoreDumpArchiver(args):
             exit_code = subprocess.call(command)
 
+    if cleanup_dart:
+        cleanup_command = [
+            sys.executable,
+            os.path.join(tools_dir, 'task_kill.py'), '--kill_dart=True',
+            '--kill_vc=False'
+        ]
+        subprocess.call(cleanup_command)
+
     utils.DiagnoseExitCode(exit_code, command)
     return exit_code
 
diff --git a/tools/validate_test_matrix.dart b/tools/validate_test_matrix.dart
index 8902eb0..9006b54 100644
--- a/tools/validate_test_matrix.dart
+++ b/tools/validate_test_matrix.dart
@@ -4,6 +4,8 @@
 
 // Test that the test matrix in the SDK can be parsed correctly.
 
+// @dart = 2.9
+
 import 'dart:convert' show jsonDecode;
 import 'dart:io' show File, Platform;
 import 'package:smith/smith.dart' show TestMatrix;
diff --git a/tools/yaml2json.dart b/tools/yaml2json.dart
index 3c7c5a2..8ce4907 100644
--- a/tools/yaml2json.dart
+++ b/tools/yaml2json.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.9
+
 import 'dart:io' show File, exit, stderr;
 
 import 'dart:isolate' show RawReceivePort;
diff --git a/utils/application_snapshot.gni b/utils/application_snapshot.gni
index 372e74e..890c108 100644
--- a/utils/application_snapshot.gni
+++ b/utils/application_snapshot.gni
@@ -127,13 +127,6 @@
       # "kernel_snapshot" passes this if needed, we always pass it)
       "-Dsdk_hash=$sdk_hash",
     ]
-    if (dart_platform_bytecode) {
-      args += [
-        "--gen-bytecode",
-        "--drop-ast",
-        "--bytecode-options=source-positions",
-      ]
-    }
     args += [ rebase_path(main_dart) ]
   }
 
diff --git a/utils/bazel/kernel_worker.dart b/utils/bazel/kernel_worker.dart
index a056905..ebbfbe5 100644
--- a/utils/bazel/kernel_worker.dart
+++ b/utils/bazel/kernel_worker.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.8
+
 /// A tool that invokes the CFE to compute kernel summary files.
 ///
 /// This script can be used as a command-line command or a persistent server.
diff --git a/utils/compiler/create_snapshot_entry.dart b/utils/compiler/create_snapshot_entry.dart
index d915d4d..5cf11a8 100644
--- a/utils/compiler/create_snapshot_entry.dart
+++ b/utils/compiler/create_snapshot_entry.dart
@@ -11,8 +11,8 @@
 
 Future<String> getVersion(var rootPath) {
   var printVersionScript = rootPath.resolve("tools/make_version.py");
-  return Process.run(
-          "python", [printVersionScript.toFilePath(), "--quiet"], runInShell:true)
+  return Process.run("python", [printVersionScript.toFilePath(), "--quiet"],
+          runInShell: true)
       .then((result) {
     if (result.exitCode != 0) {
       throw "Could not generate version";
@@ -24,6 +24,7 @@
 Future<String> getDart2jsSnapshotGenerationFile(var rootPath) {
   return getVersion(rootPath).then((version) {
     var snapshotGenerationText = """
+// @dart = 2.9
 import 'package:compiler/src/dart2js.dart' as dart2jsMain;
 
 void main(List<String> arguments) {
diff --git a/utils/kernel-service/BUILD.gn b/utils/kernel-service/BUILD.gn
index 150d229..4d464c4 100644
--- a/utils/kernel-service/BUILD.gn
+++ b/utils/kernel-service/BUILD.gn
@@ -26,9 +26,6 @@
     # Without the ', "/"' part, on Linux it would get four slashes.
     "file:///" + rebase_path("../../pkg/compiler/lib/src/dart2js.dart", "/"),
   ]
-  if (dart_platform_bytecode) {
-    training_args += [ "--bytecode" ]
-  }
   output = "$root_gen_dir/kernel-service.dart.snapshot"
 }
 
@@ -113,19 +110,9 @@
           "--output=" + rebase_path(output),
         ]
     args += [ scheme + ":///pkg/vm/bin/kernel_service.dart" ]
-    if (dart_platform_bytecode) {
-      args += [
-        "--gen-bytecode",
-        "--drop-ast",
-      ]
-    }
   }
 }
 
 kernel_service_dill("") {
   extra_args = []
 }
-
-kernel_service_dill("_bytecode") {
-  extra_args = [ "--gen-bytecode" ]
-}